ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyZjQ5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13c2MtYXhpcy5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2YTM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYjEwZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogd3NjLWF4aXMuamFyCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLndzZmluZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC53cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLAotIG9yZy5hcGFjaGUuYXhpczExCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDdkYTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLndzYy1heGlzLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHdzYy1heGlzLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHJlYWRtZS5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHJlYWRtZS5odG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5ZmY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgc2VydmljZSBBeGlzIENvbnN1bXB0aW9uIENvcmUKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxMWZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLndzZmluZGVyIj4KLSAgICAgIDx3c2ZpbmRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUud3NmaW5kZXIuV1NGaW5kZXJBeGlzIgotICAgICAgICAgICAgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlci5XU0ZpbmRlckF4aXMiPgotICAgICAgPC93c2ZpbmRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL2NvcmUvY29uc3VtcHRpb24ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb25zdW1wdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM4ZWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb25zdW1wdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgQXhpc0RlcGxveUNvbW1hbmQKLSMKLU1TR19FUlJPUl9QUk9KRUNUX1VSTF9QQVJBTV9OT1RfU0VUPUlXQUIwMDU0RSBXZWIgcHJvamVjdCBVUkwgZm9yIGRlcGxveW1lbnQgb2YgV2ViIHNlcnZpY2UgaXMgbm90IHNldCBpbiBBeGlzRGVwbG95Q29tbWFuZAotTVNHX0VSUk9SX0RFUExPWV9GSUxFX1BBUkFNX05PVF9TRVQ9SVdBQjA0ODhFIExvY2F0aW9uIG9mIEF4aXMgZGVwbG95bWVudCBmaWxlIGlzIG5vdCBzZXQgaW4gQXhpc0RlcGxveUNvbW1hbmQKLU1TR19FUlJPUl9BWElTX0RFUExPWT1JV0FCMDQ4OUUgRXJyb3Igd2hlbiBkZXBsb3lpbmcgV2ViIHNlcnZpY2UgdG8gQXhpcyBydW50aW1lCi1NU0dfQVhJU19ERVBMT1k9RGVwbG95aW5nIFdlYiBzZXJ2aWNlIHRvIEF4aXMgcnVuLXRpbWUgZW52aXJvbm1lbnQKLU1TR19BWElTX0RFUExPWV9PSz1XZWIgc2VydmljZSBzdWNjZXNzZnVseSBkZXBsb3llZCB0byBBeGlzIHJ1bi10aW1lIGVudmlyb25tZW50Ci0KLVRBU0tfTEFCRUxfV1NETF9KQVZBX0NPTU1BTkQ9V1NETDJKYXZhQ29tbWFuZAotVEFTS19ERVNDX1dTRExfSkFWQV9DT01NQU5EPUNhbGxzIHRvIEFYSVMgV1NETDJKYXZhQ29tbWFuZC4KLSMKLSMgTWVzc2FnZXMgZm9yIEphdmEyV1NETENvbW1hbmQKLSMKLVRBU0tfTEFCRUxfSkFWQV9XU0RMX0NPTU1BTkQ9SmF2YTJXU0RMQ29tbWFuZAotVEFTS19ERVNDX0pBVkFfV1NETF9DT01NQU5EPUNhbGxzIHRvIEFYSVMgSmF2YTJXU0RMQ29tbWFuZC4KLU1TR19HRU5FUkFURV9XU0RMPUdlbmVyYXRpbmcgV1NETCBmaWxlOiB7MH0KLU1TR19FUlJPUl9KQVZBX1dTRExfR0VORVJBVEU9SVdBQjAzOThFIEVycm9yIGluIGdlbmVyYXRpbmcgV1NETCBmcm9tIEphdmEKLQotIwotIyBNZXNzYWdlcyBmb3IgV1NETDJKYXZhQ29tbWFuZAotIwotVEFTS19MQUJFTF9XU0RMX0pBVkFfQ09NTUFORD1XU0RMMkphdmFDb21tYW5kCi1UQVNLX0RFU0NfV1NETF9KQVZBX0NPTU1BTkQ9Q2FsbHMgdG8gQVhJUyBXU0RMMkphdmFDb21tYW5kLgotTVNHX1BBUlNJTkdfV1NETD1QYXJzaW5nIFdTREwgZmlsZTogezB9Ci1NU0dfRVJST1JfV1NETF9KQVZBX0dFTkVSQVRFPUlXQUIwMzk5RSBFcnJvciBpbiBnZW5lcmF0aW5nIEphdmEgZnJvbSBXU0RMCi0KLSMKLSMgTWVzc2FnZXMgY29tbW9uIGZvciBhbGwKLSMKLU1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVD1JV0FCMDM5N0UgSmF2YVdTRExQYXJhbSBub3Qgc2V0Ci0KLSMKLSMgTWVzc2FnZXMgY29tbW9uIGZvciBKYXZhMldTRExDb21tYW5kIGFuZCAgV1NETDJKYXZhQ29tbWFuZAotIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpc0RlcGxveUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0F4aXNEZXBsb3lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Y2I0OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvQXhpc0RlcGxveUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy50b29scy5hbnQuYXhpcy5BZG1pbkNsaWVudFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIENvbW1hbmRzIGFyZSBleGVjdXRhYmxlLCB1bmRvYWJsZSwgcmVkb2FibGUgb2JqZWN0cy4gRXZlcnkgQ29tbWFuZCBoYXMgYSBuYW1lIGFuZCBhIGRlc2NyaXB0aW9uLgotICovCi0KLXB1YmxpYyBjbGFzcyBBeGlzRGVwbG95Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRVhUID0gIi9zZXJ2aWNlcy9BZG1pblNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotICBwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEF4aXNEZXBsb3lDb21tYW5kLgotICAgKiBAcGFyYW0gU3RyaW5nIGRlc2NyaXB0aW9uCi0gICAqIEBwYXJhbSBTdHJpbmcgbmFtZQotICAgKiAKLSAgICovCi0gIHB1YmxpYyBBeGlzRGVwbG95Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXNEZXBsb3lDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5BeGlzRGVwbG95Q29tbWFuZCIpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgaWYgKGphdmFXU0RMUGFyYW0gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgIGdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotICAgIH0KLQotICAgIGlmIChqYXZhV1NETFBhcmFtLmdldFByb2plY3RVUkwoKSA9PSBudWxsIHx8IGphdmFXU0RMUGFyYW0uZ2V0UHJvamVjdFVSTCgpLmVxdWFscygiIikpCi0gICAgeyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgIGdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX1VSTF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgfQotCi0gICAgaWYgKGphdmFXU0RMUGFyYW0uZ2V0RGVwbG95bWVudEZpbGVzKCkgPT0gbnVsbCB8fCBqYXZhV1NETFBhcmFtLmdldERlcGxveW1lbnRGaWxlcygpLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhMldTRExDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotICAgICAgZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0RFUExPWV9GSUxFX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0KLSAgICBlbnZpcm9ubWVudC5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQoZ2V0TWVzc2FnZSgiTVNHX0FYSVNfREVQTE9ZIikpOwotCi0gICAgU3RhdHVzIHN0YXR1cyA9IGV4ZWN1dGVBbnRUYXNrKCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICB7Ci0gICAgCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0YXR1cyBleGVjdXRlQW50VGFzaygpCi0gIHsKLSAgICBmaW5hbCBjbGFzcyBEZXBsb3lUYXNrIGV4dGVuZHMgQWRtaW5DbGllbnRUYXNrCi0gICAgewotICAgICAgcHVibGljIERlcGxveVRhc2soKQotICAgICAgewotICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgcHJvamVjdC5pbml0KCk7Ci0gICAgICAgIHRhc2tUeXBlID0gImF4aXMiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRhc2tOYW1lID0gImF4aXMtYWRtaW4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRhcmdldCA9IG5ldyBUYXJnZXQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBEZXBsb3lUYXNrIGFkbWluQ2xpZW50ID0gbmV3IERlcGxveVRhc2soKTsKLSAgICBTdHJpbmcgdXJsID0gamF2YVdTRExQYXJhbS5nZXRQcm9qZWN0VVJMKCkgKyBTRVJWSUNFX0VYVDsKLSAgICBhZG1pbkNsaWVudC5zZXRVcmwodXJsKTsKLSAgICBhZG1pbkNsaWVudC5zZXRYbWxGaWxlKG5ldyBGaWxlKGphdmFXU0RMUGFyYW0uZ2V0RGVwbG95bWVudEZpbGVzKClbMF0pKTsKLQotICAgIC8vIFNpbmNlIHRoZSBhZG1pbiBzZXJ2ZXIgbWF5IG5vdCBiZSBhdmFpbGFibGUgcmlnaHQgYXdheSB3ZSB3aWxsIHRyeQotICAgIC8vIHNldmVyYWwgdGltZXMgdG8gZXhlY3V0ZSBpdC4KLSAgICB0cnkKLSAgICB7Ci0gICAgICBCdWlsZEV4Y2VwdGlvbiBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IDIwOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLSAgICAgICAgICBhZG1pbkNsaWVudC5leGVjdXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIEJ1aWxkRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsKLSAgICAgICAgICBsYXN0RXhjZXB0aW9uID0gZXhjOwotICAgICAgICAgIAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCggMjAwICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJlYWRFeGNlcHRpb24gICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBJZiBubyBleGNlcHRpb24gb2NjdXJlZCB0aGVuIHdlIHNob3VsZCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCi0gICAgICAgIGlmKCBsYXN0RXhjZXB0aW9uID09IG51bGwgKSBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gSWYgYWZ0ZXIgbWFueSB0cmllcyB3ZSBzdGlsbCBnZXQgYW4gZXhjZXB0aW9uLCB0aGVuIHdlIHdpbGwgcmUgdGhyb3cgaXQuCi0gICAgICBpZiggbGFzdEV4Y2VwdGlvbiAhPSBudWxsICkgdGhyb3cgbGFzdEV4Y2VwdGlvbjsKLSAgICB9Ci0gICAgY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIFN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICBpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBlLmdldENhdXNlKCkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RhdHVzW10gY2hpbGRTdGF0dXMgPSBuZXcgU3RhdHVzWzFdOwotICAgICAgY2hpbGRTdGF0dXNbMF0gPSBuZXcgU2ltcGxlU3RhdHVzKCJBeGlzRGVwbG95Q29tbWFuZCIsIG1lc3NhZ2UsIFN0YXR1cy5FUlJPUik7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiQXhpc0RlcGxveUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0gICAgICBnZXRNZXNzYWdlKCJNU0dfRVJST1JfQVhJU19ERVBMT1kiKSwgY2hpbGRTdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiQXhpc0RlcGxveUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0gICAgZ2V0TWVzc2FnZSgiTVNHX0FYSVNfREVQTE9ZX09LIiksIFN0YXR1cy5PSyk7Ci0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHBhcm0xKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSByZXNvdXJjZS5nZXRTdHJpbmcobWVzc2FnZUlkKTsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgbmV3IFN0cmluZ1tdIHsgcGFybTEgfSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gcGx1Z2luLnByb3BlcnRpZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlLmdldFN0cmluZyhrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLSAgewotICAgIHRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvSmF2YTJXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvSmF2YTJXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGY4Y2Y1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL0phdmEyV1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLnRvb2xzLmFudC53c2RsLkphdmEyV3NkbEFudFRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLnRvb2xzLmFudC53c2RsLk5hbWVzcGFjZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0gKiBDb21tYW5kcyBhcmUgZXhlY3V0YWJsZSwgdW5kb2FibGUsIHJlZG9hYmxlIG9iamVjdHMuCi0gKiBFdmVyeSBDb21tYW5kIGhhcyBhIG5hbWUgYW5kIGEgZGVzY3JpcHRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIEphdmEyV1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9KQVZBX1dTRExfQ09NTUFORCI7Ci0JcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0pBVkFfV1NETF9DT01NQU5EIjsKLQotCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKCkgewotCQlzdXBlcigpOwotCSAgICBzZXROYW1lIChnZXRNZXNzYWdlKExBQkVMKSk7Ci0JCXNldERlc2NyaXB0aW9uKGdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQl9CQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhMldTRExDb21tYW5kLgotCSAqLwotCXB1YmxpYyBKYXZhMldTRExDb21tYW5kKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJc3VwZXIoKTsKLQkgICAgc2V0TmFtZSAoZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbihnZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlTdGF0dXMgc3RhdHVzOwotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJaWYgKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkgPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJZW52aXJvbm1lbnQuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KAotCQkJZ2V0TWVzc2FnZSgiTVNHX0dFTkVSQVRFX1dTREwiLCBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpICkgKTsKLQotCQlyZXR1cm4gZXhlY3V0ZUFudFRhc2soZW52aXJvbm1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBTdGF0dXMgZXhlY3V0ZUFudFRhc2soRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIHsKLQotCQlmaW5hbCBjbGFzcyBFbWl0dGVyIGV4dGVuZHMgSmF2YTJXc2RsQW50VGFzayB7Ci0JCQlwdWJsaWMgRW1pdHRlcigpIHsKLQkJCQlwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLQkJCQlwcm9qZWN0LmluaXQoKTsKLQkJCQl0YXNrVHlwZSA9ICJheGlzIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRhc2tOYW1lID0gImF4aXMtamF2YTJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRhcmdldCA9IG5ldyBUYXJnZXQoKTsKLQkJCX0KLQkJfQotCi0JCUVtaXR0ZXIgZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7Ci0JCWVtaXR0ZXIuY3JlYXRlQ2xhc3NwYXRoKCkuc2V0UGF0aChqYXZhV1NETFBhcmFtXy5nZXRDbGFzc3BhdGgoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAwOCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIkNsYXNzIFBhdGggPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRDbGFzc3BhdGgoKSk7Ci0JCQotCQllbWl0dGVyLnNldFBvcnRUeXBlTmFtZShqYXZhV1NETFBhcmFtXy5nZXRQb3J0VHlwZU5hbWUoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAwOSwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlBvcnQgVHlwZSBOYW1lID0gIisgamF2YVdTRExQYXJhbV8uZ2V0UG9ydFR5cGVOYW1lKCkpOwotCQkKLQkJZW1pdHRlci5zZXRTZXJ2aWNlRWxlbWVudE5hbWUoamF2YVdTRExQYXJhbV8uZ2V0U2VydmljZU5hbWUoKSk7Ci0JCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTAxMCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgIlNlcnZpY2UgTmFtZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldFNlcnZpY2VOYW1lKCkpOwotCQkKLQkJZW1pdHRlci5zZXRMb2NhdGlvbihqYXZhV1NETFBhcmFtXy5nZXRVcmxMb2NhdGlvbigpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDExLCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiVVJMIExvY2F0aW9uID0gIisgamF2YVdTRExQYXJhbV8uZ2V0VXJsTG9jYXRpb24oKSk7Ci0JCQotCQllbWl0dGVyLnNldE1ldGhvZHMoamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTIsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJNZXRob2RzID0gIisgamF2YVdTRExQYXJhbV8uZ2V0TWV0aG9kU3RyaW5nKCkpOwotCQkKLQkJZW1pdHRlci5zZXRTdHlsZShqYXZhV1NETFBhcmFtXy5nZXRTdHlsZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDEzLCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiU3R5bGUgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRTdHlsZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0VXNlKGphdmFXU0RMUGFyYW1fLmdldFVzZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE0LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiVXNlID0gIisgamF2YVdTRExQYXJhbV8uZ2V0VXNlKCkpOwotCQkKLQkJZW1pdHRlci5zZXRPdXRwdXQobmV3IEZpbGUoamF2YVdTRExQYXJhbV8uZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCkpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE1LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiV1NETCBMb2NhdGlvbiA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE91dHB1dFdzZGxMb2NhdGlvbigpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0TmFtZXNwYWNlKGphdmFXU0RMUGFyYW1fLmdldE5hbWVzcGFjZSgpKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDE2LCB0aGlzLCAiZXhlY3V0ZUFudFRhc2siLCAiTmFtZSBTcGFjZSA9ICIrIGphdmFXU0RMUGFyYW1fLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0Q2xhc3NOYW1lKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTcsIHRoaXMsICJleGVjdXRlQW50VGFzayIsICJCZWFuIG5hbWUgPSAiKyBqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpKTsKLQkJCi0JCWVtaXR0ZXIuc2V0SW1wbENsYXNzKGphdmFXU0RMUGFyYW1fLmdldEJlYW5OYW1lKCkpOwotCQkKLQkJSGFzaE1hcCBtYXBwaW5ncyA9IGphdmFXU0RMUGFyYW1fLmdldE1hcHBpbmdzKCk7Ci0JCWlmKG1hcHBpbmdzICE9IG51bGwpewotCQkJSXRlcmF0b3Iga2V5cyA9IG1hcHBpbmdzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShrZXlzLmhhc05leHQoKSl7Ci0JCQkJU3RyaW5nIHBha2FnZSA9IChTdHJpbmcpa2V5cy5uZXh0KCk7Ci0JCQkJU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpbWFwcGluZ3MuZ2V0KHBha2FnZSk7Ci0JCQkJTmFtZXNwYWNlTWFwcGluZyBtYXAgPSBuZXcgTmFtZXNwYWNlTWFwcGluZygpOwotCQkJCW1hcC5zZXRQYWNrYWdlKHBha2FnZSk7Ci0JCQkJbWFwLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJCWVtaXR0ZXIuYWRkTWFwcGluZyhtYXApOwkJCi0JCQl9Ci0JCX0KLQkJCi0JCi0JCXRyeSB7Ci0JCQllbWl0dGVyLmV4ZWN1dGUoKTsKLQkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTAxOCwgdGhpcywgImV4ZWN1dGVBbnRUYXNrIiwgZSk7Ci0JCQlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfR0VORVJBVEUiKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkrZS5nZXRDYXVzZSgpLnRvU3RyaW5nKCksIFN0YXR1cy5FUlJPUik7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0KLQl9Ci0JCi0JcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgotCSAqIEByZXR1cm4gSmF2YVdTRExQYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHBhcm0xKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gcmVzb3VyY2UuZ2V0U3RyaW5nKG1lc3NhZ2VJZCk7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBuZXcgU3RyaW5nW10geyBwYXJtMSB9KTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0JKiBwbHVnaW4ucHJvcGVydGllcy4KLQkqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotCSovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIHJlc291cmNlLmdldFN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJtKSB7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcm07Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0JewotCSAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0SmF2YVdTRExQYXJhbSgpLmdldE91dHB1dFdzZGxMb2NhdGlvbigpKTsgCi0JICAgIFN0cmluZyB1cmwgPSAiIjsKLQkJICB0cnkgewotCSAgICAJdXJsID0gZmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0JICAgIH0KLQkJICBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKXt9Ci0JCXJldHVybiB1cmw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvV1NETDJKYXZhQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmQvV1NETDJKYXZhQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I3YWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tYW5kL1dTREwySmF2YUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YS5FbWl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YS5HZW5lcmF0ZWRGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVQTE9ZX1RZUEUgPSAiZGVwbG95IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFVOREVQTE9ZX1RZUEUgPSAidW5kZXBsb3kiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotCXByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotCXByaXZhdGUgU3RyaW5nIGh0dHBCYXNpY0F1dGhQYXNzd29yZDsKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dTRExfSkFWQV9DT01NQU5EIjsKLQlwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV1NETF9KQVZBX0NPTU1BTkQiOwotCQotCi0JcHVibGljIFdTREwySmF2YUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5hbWUoZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbihnZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JfQotCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCVN0YXR1cyBzdGF0dXM7Ci0JCWlmIChqYXZhV1NETFBhcmFtID09IG51bGwpIHsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIldTREwySmF2YUNvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJaWYgKHdzZGxVUkkgIT0gbnVsbCkgLy9ib3R0b20gdXAgY2FzZSBoYXMgYWxyZWFkeSBoYXMgdGhlIGNvcnJlY3QgV1NETCBvbiBqYXZhV1NETFBhcmFtCi0JCXsKLQkJCWphdmFXU0RMUGFyYW0uc2V0SW5wdXRXc2RsTG9jYXRpb24od3NkbFVSSSk7Ci0JCX0KLQkJamF2YVdTRExQYXJhbS5zZXRIVFRQVXNlcm5hbWUoaHR0cEJhc2ljQXV0aFVzZXJuYW1lKTsKLQkJamF2YVdTRExQYXJhbS5zZXRIVFRQUGFzc3dvcmQoaHR0cEJhc2ljQXV0aFBhc3N3b3JkKTsKLQkJCi0JCUVtaXR0ZXIgd3NkbDJKYXZhID0gbmV3IEVtaXR0ZXIoKTsKLQkJaWYgKGVudmlyb25tZW50LmdldExvZygpLmlzRW5hYmxlZCgiZW1pdHRlciIpKSB7Ci0JCQl3c2RsMkphdmEuc2V0VmVyYm9zZSh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXdzZGwySmF2YS5zZXRWZXJib3NlKGZhbHNlKTsKLQkJfQotCQlib29sZWFuIHNlcnZlclNpZGUgPSBqYXZhV1NETFBhcmFtLmdldFNlcnZlclNpZGUoKSA9PSBKYXZhV1NETFBhcmFtZXRlci5TRVJWRVJfU0lERV9CRUFOOwotCQl3c2RsMkphdmEuc2V0U2VydmVyU2lkZShzZXJ2ZXJTaWRlKTsKLQkJaWYgKHNlcnZlclNpZGUpIHsKLQkJCXdzZGwySmF2YS5zZXRTa2VsZXRvbldhbnRlZChqYXZhV1NETFBhcmFtLmlzU2tlbGV0b25EZXBsb3koKSk7Ci0JCX0KLQkJaWYgKGphdmFXU0RMUGFyYW0uaXNNZXRhSW5mT25seSgpKSB7Ci0JCQkvLyBmb3IgdGhlIGNhc2UgSmF2YTJXU0RMLVdTREwySmF2YQotCQkJd3NkbDJKYXZhLnNldE91dHB1dERpcihyZW1vdmVGaWxlUHJvdG9jb2woamF2YVdTRExQYXJhbS5nZXRPdXRwdXQoKSkpOwotCQkJSGFzaE1hcCBwY2sybnNNYXAgPSBqYXZhV1NETFBhcmFtLmdldE1hcHBpbmdzKCk7Ci0JCQlpZiAocGNrMm5zTWFwICE9IG51bGwpIHsKLQkJCQlIYXNoTWFwIG5zMnBja01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJSXRlcmF0b3Iga2V5cyA9IHBjazJuc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcgcGFrYWdlID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0JCQkJCVN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBwY2sybnNNYXAuZ2V0KHBha2FnZSk7Ci0JCQkJCW5zMnBja01hcC5wdXQobmFtZXNwYWNlLCBwYWthZ2UpOwotCQkJCX0KLQkJCQl3c2RsMkphdmEuc2V0TmFtZXNwYWNlTWFwKG5zMnBja01hcCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyAgZm9yIHRoZSBjYXNlIFdTREwySmF2YQotCQkJd3NkbDJKYXZhLnNldE91dHB1dERpcihyZW1vdmVGaWxlUHJvdG9jb2woamF2YVdTRExQYXJhbS5nZXRKYXZhT3V0cHV0KCkpKTsKLQkJCWlmIChqYXZhV1NETFBhcmFtLmdldE1hcHBpbmdzKCkgIT0gbnVsbCkgewotCQkJCXdzZGwySmF2YS5zZXROYW1lc3BhY2VNYXAoamF2YVdTRExQYXJhbS5nZXRNYXBwaW5ncygpKTsKLQkJCX0KLQkJfQotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMTksIHRoaXMsICJleGVjdXRlIiwgIkphdmEgb3V0cHV0ID0gIiArIGphdmFXU0RMUGFyYW0uZ2V0SmF2YU91dHB1dCgpKTsKLQkJaWYgKGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkgIT0gbnVsbCkgewotCQkJd3NkbDJKYXZhLnNldFBhc3N3b3JkKGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkpOwotCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDgxLCB0aGlzLCAiZXhlY3V0ZSIsICJwYXNzd29yZDogIiArIGphdmFXU0RMUGFyYW0uZ2V0SFRUUFBhc3N3b3JkKCkpOwotCQl9Ci0JCWlmIChqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpICE9IG51bGwpIHsKLQkJCXdzZGwySmF2YS5zZXRVc2VybmFtZShqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpKTsKLQkJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuSU5GTywgNTA4MiwgdGhpcywgImV4ZWN1dGUiLCAidXNlcm5hbWU6ICIgKyBqYXZhV1NETFBhcmFtLmdldEhUVFBVc2VybmFtZSgpKTsKLQkJfQotCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLklORk8sIDUwMjAsIHRoaXMsICJleGVjdXRlIiwgIldTREwgTG9jYXRpb24gPSAiICsgamF2YVdTRExQYXJhbS5nZXRJbnB1dFdzZGxMb2NhdGlvbigpKTsKLQkJZW52aXJvbm1lbnQuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KGdldE1lc3NhZ2UoIk1TR19QQVJTSU5HX1dTREwiLCBqYXZhV1NETFBhcmFtLmdldElucHV0V3NkbExvY2F0aW9uKCkgKSApOwotCQl0cnkgewotCQkJd3NkbDJKYXZhLnJ1bihqYXZhV1NETFBhcmFtLmdldElucHV0V3NkbExvY2F0aW9uKCkpOwotCQkJaWYgKHNlcnZlclNpZGUpIHsKLQkJCQkvLyBzZXQgZGVwbG95bWVudCBmaWxlcwotCQkJCUxpc3QgZGVwbG95bWVudEZpbGVzMSA9IHdzZGwySmF2YS5nZXRHZW5lcmF0ZWRGaWxlSW5mbygpLmZpbmRUeXBlKERFUExPWV9UWVBFKTsKLQkJCQlMaXN0IGRlcGxveW1lbnRGaWxlczIgPSB3c2RsMkphdmEuZ2V0R2VuZXJhdGVkRmlsZUluZm8oKS5maW5kVHlwZShVTkRFUExPWV9UWVBFKTsKLQkJCQlBcnJheUxpc3QgZGVwbEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChkZXBsb3ltZW50RmlsZXMxICE9IG51bGwgJiYgZGVwbG95bWVudEZpbGVzMiAhPSBudWxsKSB7Ci0JCQkJCWRlcGxveW1lbnRGaWxlczEuYWRkQWxsKGRlcGxveW1lbnRGaWxlczIpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGxveW1lbnRGaWxlczEuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCUdlbmVyYXRlZEZpbGVJbmZvLkVudHJ5IGVudHJ5ID0gKEdlbmVyYXRlZEZpbGVJbmZvLkVudHJ5KSBkZXBsb3ltZW50RmlsZXMxLmdldChpKTsKLQkJCQkJCWRlcGxGaWxlcy5hZGQoZW50cnkuZmlsZU5hbWUpOwotCQkJCQl9Ci0JCQkJCVN0cmluZ1tdIGRlcGxGaWxlc0FycmF5ID0gbmV3IFN0cmluZ1tkZXBsRmlsZXMuc2l6ZSgpXTsKLQkJCQkJZGVwbEZpbGVzLnRvQXJyYXkoZGVwbEZpbGVzQXJyYXkpOwotCQkJCQlqYXZhV1NETFBhcmFtLnNldERlcGxveW1lbnRGaWxlcyhkZXBsRmlsZXNBcnJheSk7Ci0JCQkJfQotCQkJCS8vIHNldCBqYXZhIGZpbGVzCi0JCQkJTGlzdCBqYXZhRmlsZXMgPSB3c2RsMkphdmEuZ2V0R2VuZXJhdGVkRmlsZU5hbWVzKCk7Ci0JCQkJamF2YUZpbGVzLnJlbW92ZUFsbChkZXBsRmlsZXMpOwotCQkJCVN0cmluZ1tdIGphdmFGaWxlTmFtZXMgPSBuZXcgU3RyaW5nW2phdmFGaWxlcy5zaXplKCldOwotCQkJCWphdmFGaWxlcy50b0FycmF5KGphdmFGaWxlTmFtZXMpOwotCQkJCWphdmFXU0RMUGFyYW0uc2V0SmF2YUZpbGVzKGphdmFGaWxlTmFtZXMpOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllbnZpcm9ubWVudC5nZXRMb2coKS5sb2coTG9nLkVSUk9SLCA1MDIxLCB0aGlzLCAiZXhlY3V0ZSIsIGUpOwotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YTJXU0RMQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dTRExfSkFWQV9HRU5FUkFURSIpICsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGUudG9TdHJpbmcoKSwgU3RhdHVzLkVSUk9SKTsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JfQotCi0JLyoKLQkgKiBIYWNrOiBBeGlzIGRvZXNuJ3QgbGlrZSBmaWxlIFVSTHMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZW1vdmVGaWxlUHJvdG9jb2woU3RyaW5nIHMpIHsKLQkJaWYgKHMuc3RhcnRzV2l0aCgiZmlsZToiKSkgewotCQkJU3RyaW5nIG5ld1MgPSBzLnN1YnN0cmluZyg1LCBzLmxlbmd0aCgpKTsKLQkJCWludCBpID0gbmV3Uy5pbmRleE9mKCc6Jyk7Ci0JCQlpZiAoaSAhPSAtMSkgewotCQkJCVN0cmluZyBwcm90b2NvbCA9IG5ld1Muc3Vic3RyaW5nKDAsIGkpOwotCQkJCWludCBqID0gcHJvdG9jb2wuaW5kZXhPZignLycpOwotCQkJCWludCBrID0gcHJvdG9jb2wuaW5kZXhPZignXFwnKTsKLQkJCQlpbnQgbWF4ID0gTWF0aC5tYXgoaiwgayk7Ci0JCQkJaWYgKG1heCAhPSAtMSkKLQkJCQkJbmV3UyA9IG5ld1Muc3Vic3RyaW5nKG1heCArIDEsIG5ld1MubGVuZ3RoKCkpOwotCQkJfQotCQkJcmV0dXJuIG5ld1M7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBwYXJtMSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IHJlc291cmNlLmdldFN0cmluZyhtZXNzYWdlSWQpOwotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgbmV3IFN0cmluZ1tde3Bhcm0xfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLQkgKiBwbHVnaW4ucHJvcGVydGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gcmVzb3VyY2UuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JCXRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBodHRwQmFzaWNBdXRoUGFzc3dvcmQKLQkgKiAgICAgICAgICAgIFRoZSBodHRwQmFzaWNBdXRoUGFzc3dvcmQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkKSB7Ci0JCXRoaXMuaHR0cEJhc2ljQXV0aFBhc3N3b3JkID0gaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBodHRwQmFzaWNBdXRoVXNlcm5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBodHRwQmFzaWNBdXRoVXNlcm5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh0dHBCYXNpY0F1dGhVc2VybmFtZShTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lKSB7Ci0JCXRoaXMuaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpIHsKLQkJdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tb24vSmF2YVdTRExQYXJhbWV0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS9jb21tb24vSmF2YVdTRExQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNkYTc4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL2NvcmUvY29tbW9uL0phdmFXU0RMUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhV1NETFBhcmFtZXRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU0VSVkVSX1NJREVfTk9ORSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFNFUlZFUl9TSURFX0JFQU4gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBTRVJWRVJfU0lERV9FSkIgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfUlBDID0gIlJQQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9ET0NVTUVOVCA9ICJET0NVTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRV9XUkFQUEVEID0gIldSQVBQRUQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfTElURVJBTCA9ICJMSVRFUkFMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FTkNPREVEID0gIkVOQ09ERUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBiZWFuTmFtZSA9IG51bGw7IC8vIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGJlYW4KLQlwcml2YXRlIFN0cmluZyBjbGFzc3BhdGggPSBudWxsOwotCS8vIFRoZSBjbGFzcyBwYXRoIGZvciBsb2FkaW5nIHRoZSBiZWFuIGFuZCBjb21tYW5kIGV4ZWN1dGlvbgotCXByaXZhdGUgU3RyaW5nIGJlYW5QYWNrYWdlID0gbnVsbDsgLy8gVGhlIHBhY2thZ2UgbG9jYXRpb24gb2YgdGhlIGJlYW4KLQlwcml2YXRlIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBudWxsOyAvLyBUaGUgbmFtZSBvZiB0aGUgcG9ydCB0eXBlIGVsZW1lbnQKLQlwcml2YXRlIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7IC8vIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGVsZW1lbnQKLQlwcml2YXRlIFN0cmluZyBvdXRwdXRXc2RsTG9jYXRpb24gPSBudWxsOwotCS8vIFRoZSBvdXRwdXQgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZQotCXByaXZhdGUgU3RyaW5nIGlucHV0V3NkbExvY2F0aW9uID0gbnVsbDsKLQkvLyBUaGUgaW5wdXQgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZQotCXByaXZhdGUgU3RyaW5nIHVybExvY2F0aW9uID0gbnVsbDsgLy8gVGhlIFVSTCBsb2NhdGlvbiBvZiB0aGUgd2ViIHNlcnZpY2UKLQlwcml2YXRlIEhhc2h0YWJsZSBtZXRob2RzID0gbnVsbDsgLy8gVGhlIGFycmF5IG9mIG1ldGhvZCBuYW1lcwotCXByaXZhdGUgU3RyaW5nIHN0eWxlID0gbnVsbDsKLQkvLyBUaGUgc3R5bGUgKFJQQyB8IERPQ1VNRU5UIHwgV1JBUFBFRCkgYXR0cmlidXRlIGZvciB0aGUgZ2VuZXJhdGVkIFdTREwKLQlwcml2YXRlIFN0cmluZyB1c2UgPSBudWxsOwotCS8vIFRoZSB1c2UgKExJVEVSQUwgfCBFTkNPREVEKSBhdHRyaWJ0dWUgZm9yIHRoZSBnZW5lcmF0ZWQgV1NETAotCXByaXZhdGUgU3RyaW5nIG91dHB1dCA9IG51bGw7Ci0JLy8gVGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgZGVwbG95bWVudCBkZXNjcmlwdG9ycyAmIEphdmEgY29kZSAob3V0cHV0IGZyb20gV1NETDJKYXZhIGNvbW1hbmQpCi0JcHJpdmF0ZSBTdHJpbmcgamF2YU91dHB1dCA9IG51bGw7Ci0JLy8gVGhlIG91dHB1dCBsb2NhdGlvbiBmb3IgSmF2YSBjb2RlIChvdXRwdXQgZnJvbSBXU0RMMkphdmEgY29tbWFuZCkKLQlwcml2YXRlIGJvb2xlYW4gbWV0YUluZk9ubHkgPSBmYWxzZTsgLy8gTUVUQS1JTkYtT05MWSBmbGFnCi0JcHJpdmF0ZSBieXRlIHNlcnZlclNpZGUgPSBTRVJWRVJfU0lERV9OT05FOwotCS8vIHNlcnZlci1zaWRlIGZsYWcgKFNFUlZFUl9TSURFX05PTkUgfCBTRVJWRVJfU0lERV9CRUFOIHwgU0VSVkVSX1NJREVfRUpCKQotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHNrZWxldG9uRGVwbG95ID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBjb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nW10gZGVwbG95bWVudEZpbGVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIGphdmFGaWxlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdFVSTCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIG1hcHBpbmdQYWlyczsKLQlwcml2YXRlIFN0cmluZyBodHRwVXNlcm5hbWVfID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBodHRwUGFzc3dvcmRfID0gbnVsbDsKLQotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihTdHJpbmcgY29udGFpbmVyKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhV1NETFBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmVhbk5hbWUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJlYW5OYW1lKCkgewotCQlyZXR1cm4gYmVhbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRCZWFuUGFja2FnZSgpIHsKLQkJcmV0dXJuIGJlYW5QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvcnRUeXBlTmFtZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydFR5cGVOYW1lKCkgewotCQlyZXR1cm4gcG9ydFR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZpY2VOYW1lLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG91dHB1dC4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgewotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZHMuCi0JICogQHJldHVybiBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0TWV0aG9kcygpIHsKLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWEgc2VwZXJhdGVkIHN0cmluZyByZXByZXNldGF0aW9uIG9mIHRoZSBtZXRob2RzLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2RTdHJpbmcoKSB7Ci0JCVN0cmluZyBtZXRob2RTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlFbnVtZXJhdGlvbiBlID0gbWV0aG9kcy5rZXlzKCk7Ci0gCQlmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICAJewotCi0JCQlTdHJpbmcgc2lnbmF0dXJlID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCgoQm9vbGVhbikgbWV0aG9kcy5nZXQoc2lnbmF0dXJlKSkuYm9vbGVhblZhbHVlKCkpewotCQkJCQkJCWludCBpbmRleCA9IHNpZ25hdHVyZS5pbmRleE9mKCcoJyk7Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSBzaWduYXR1cmUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCQltZXRob2RTdHJpbmcgKz0gbmFtZTsKLQkJCX0KLQkgICAgCWlmIChpICE9IG1ldGhvZHMuc2l6ZSgpIC0xKSAvLyB0aGlzIGlzIG5vdCB0aGUgbGFzdCBhcnJheSBpdGVtCQotCQkJewotCQkJCW1ldGhvZFN0cmluZyArPSAiLCI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHlsZSBhdHRyaWJ1dGUuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0eWxlKCkgewotCQlyZXR1cm4gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXJsTG9jYXRpb24uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVybExvY2F0aW9uKCkgewotCQlyZXR1cm4gdXJsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlIGF0dHJpYnV0ZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkgewotCQlyZXR1cm4gdXNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG91dHB1dFdzZGxMb2NhdGlvbi4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCkgewotCQlyZXR1cm4gb3V0cHV0V3NkbExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJlYW5OYW1lLgotCSAqIEBwYXJhbSBiZWFuTmFtZSBUaGUgYmVhbk5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QmVhbk5hbWUoU3RyaW5nIGJlYW5OYW1lKSB7Ci0JCXRoaXMuYmVhbk5hbWUgPSBiZWFuTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCZWFuUGFja2FnZShTdHJpbmcgYmVhblBhY2thZ2UpIHsKLQkJdGhpcy5iZWFuUGFja2FnZSA9IGJlYW5QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBvcnRUeXBlTmFtZS4KLQkgKiBAcGFyYW0gcG9ydFR5cGVOYW1lIFRoZSBwb3J0VHlwZU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UG9ydFR5cGVOYW1lKFN0cmluZyBwb3J0VHlwZU5hbWUpIHsKLQkJdGhpcy5wb3J0VHlwZU5hbWUgPSBwb3J0VHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VydmljZU5hbWUuCi0JICogQHBhcmFtIHNlcnZpY2VOYW1lIFRoZSBzZXJ2aWNlTmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLQkJdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG91dHB1dC4KLQkgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0KFN0cmluZyBvdXRwdXQpIHsKLQkJdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kcy4KLQkgKiBAcGFyYW0gbWV0aG9kcyBUaGUgbWV0aG9kcyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RzKEhhc2h0YWJsZSBtZXRob2RzKSB7Ci0JCXRoaXMubWV0aG9kcyA9IG1ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3R5bGUuCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHlsZShTdHJpbmcgc3R5bGUpIHsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVybExvY2F0aW9uLgotCSAqIEBwYXJhbSB1cmxMb2NhdGlvbiBUaGUgdXJsTG9jYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsTG9jYXRpb24oU3RyaW5nIHVybExvY2F0aW9uKSB7Ci0JCXRoaXMudXJsTG9jYXRpb24gPSB1cmxMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2UuCi0JICogQHBhcmFtIHVzZSBUaGUgdXNlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgdXNlKSB7Ci0JCXRoaXMudXNlID0gdXNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG91dHB1dFdzZGxMb2NhdGlvbi4KLQkgKiBAcGFyYW0gb3V0cHV0V3NkbExvY2F0aW9uIFRoZSBvdXRwdXRXc2RsTG9jYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0V3NkbExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLQkJdGhpcy5vdXRwdXRXc2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YUluZk9ubHkuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRhSW5mT25seSgpIHsKLQkJcmV0dXJuIG1ldGFJbmZPbmx5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGFJbmZPbmx5LgotCSAqIEBwYXJhbSBtZXRhSW5mT25seSBUaGUgbWV0YUluZk9ubHkgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0YUluZk9ubHkoYm9vbGVhbiBtZXRhSW5mT25seSkgewotCQl0aGlzLm1ldGFJbmZPbmx5ID0gbWV0YUluZk9ubHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyU2lkZS4KLQkgKiBAcmV0dXJuIGJ5dGUKLQkgKi8KLQlwdWJsaWMgYnl0ZSBnZXRTZXJ2ZXJTaWRlKCkgewotCQlyZXR1cm4gc2VydmVyU2lkZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzZXJ2ZXJTaWRlLgotCSAqIEBwYXJhbSBzZXJ2ZXJTaWRlIFRoZSBzZXJ2ZXJTaWRlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclNpZGUoYnl0ZSBzZXJ2ZXJTaWRlKSB7Ci0JCXRoaXMuc2VydmVyU2lkZSA9IHNlcnZlclNpZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5wdXRXc2RsTG9jYXRpb24uCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0V3NkbExvY2F0aW9uKCkgewotCQlyZXR1cm4gaW5wdXRXc2RsTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5wdXRXc2RsTG9jYXRpb24uCi0JICogQHBhcmFtIGlucHV0V3NkbExvY2F0aW9uIFRoZSBpbnB1dFdzZGxMb2NhdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dFdzZGxMb2NhdGlvbihTdHJpbmcgaW5wdXRXc2RsTG9jYXRpb24pIHsKLQkJdGhpcy5pbnB1dFdzZGxMb2NhdGlvbiA9IGlucHV0V3NkbExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzcGFjZS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVzcGFjZS4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBvdXRwdXQuCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFPdXRwdXQoKSB7Ci0JCXJldHVybiBqYXZhT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGphdmFPdXRwdXQuCi0JICogQHBhcmFtIGphdmFPdXRwdXQgVGhlIEphdmEgb3V0cHV0IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFPdXRwdXQoU3RyaW5nIGphdmFPdXRwdXQpIHsKLQkJdGhpcy5qYXZhT3V0cHV0ID0gamF2YU91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgc3RyaW5nKSB7Ci0JCWNsYXNzcGF0aCA9IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTa2VsZXRvbkRlcGxveSgpIHsKLQkJcmV0dXJuIHNrZWxldG9uRGVwbG95OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2tlbGV0b25EZXBsb3koYm9vbGVhbiBiKSB7Ci0JCXNrZWxldG9uRGVwbG95ID0gYjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldERlcGxveW1lbnRGaWxlcygpIHsKLQkJcmV0dXJuIGRlcGxveW1lbnRGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlcGxveW1lbnRGaWxlcyhTdHJpbmdbXSBzdHJpbmdzKSB7Ci0JCWRlcGxveW1lbnRGaWxlcyA9IHN0cmluZ3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRKYXZhRmlsZXMoKSB7Ci0JCXJldHVybiBqYXZhRmlsZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhRmlsZXMoU3RyaW5nW10gc3RyaW5ncykgewotCQlqYXZhRmlsZXMgPSBzdHJpbmdzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RVUkwoKSB7Ci0JCXJldHVybiBwcm9qZWN0VVJMOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0VVJMKFN0cmluZyBzdHJpbmcpIHsKLQkJcHJvamVjdFVSTCA9IHN0cmluZzsKLQl9Ci0JCi0JcHVibGljIEhhc2hNYXAgZ2V0TWFwcGluZ3MoKQotCXsKLQkJCXJldHVybiBtYXBwaW5nUGFpcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ3MoSGFzaE1hcCBtYXApCi0JewotCQkJbWFwcGluZ1BhaXJzID0gbWFwOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SFRUUFVzZXJuYW1lKCkKLQl7Ci0JICByZXR1cm4gaHR0cFVzZXJuYW1lXzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1c2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24KLQkgKiBAcGFyYW0gU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SFRUUFVzZXJuYW1lKFN0cmluZyBodHRwVXNlcm5hbWUpCi0JewotCSAgaHR0cFVzZXJuYW1lXyA9IGh0dHBVc2VybmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXNzd29yZCBmb3IgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIVFRQUGFzc3dvcmQoKQotCXsKLQkgIHJldHVybiBodHRwUGFzc3dvcmRfOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIVFRQUGFzc3dvcmQoU3RyaW5nIGh0dHBQYXNzd29yZCkgewotCQlodHRwUGFzc3dvcmRfID0gaHR0cFBhc3N3b3JkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3dzZmluZGVyL1dTRmluZGVyQXhpcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi9jb3JlL3dzZmluZGVyL1dTRmluZGVyQXhpcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGNkNWY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vY29yZS93c2ZpbmRlci9XU0ZpbmRlckF4aXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS53c2ZpbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkoyRUVXZWJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXIuTGl2ZVdTRExGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyLldTRmluZGVyQ29tbW9uOwotCi1wdWJsaWMgY2xhc3MgV1NGaW5kZXJBeGlzIGV4dGVuZHMgV1NGaW5kZXJDb21tb24KLXsKLSAgcHVibGljIFdTRmluZGVyQXhpcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZmluZCgpCi0gIHsKLSAgICBmaW5hbCBWZWN0b3Igd3NkbFVSTHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IGdldFdvcmtzcGFjZVByb2plY3RzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJOYXR1cmUgPSBnZXRXZWJOYXR1cmUocHJvamVjdHNbaV0pOwotICAgICAgaWYgKHdlYk5hdHVyZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgd2ViUHJvamVjdFVSTCA9IFJlc291cmNlVXRpbHMuZ2V0V2ViUHJvamVjdFVSTChwcm9qZWN0c1tpXSk7Ci0gICAgICAgIGlmICh3ZWJQcm9qZWN0VVJMICE9IG51bGwgJiYgd2ViUHJvamVjdFVSTC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbCBJRm9sZGVyIGZvbGRlcldTREwgPSBnZXRGb2xkZXJSb290UHVibGlzaGFibGUod2ViTmF0dXJlKS5nZXRGb2xkZXIoIndzZGwiKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb2xkZXJXU0RMLmFjY2VwdCgKLSAgICAgICAgICAgICAgbmV3IElSZXNvdXJjZVZpc2l0b3IoKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHQgPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZSgid3NkbCIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc1BhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvbGRlclBhdGggPSBmb2xkZXJXU0RMLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSByZXNQYXRoLmluZGV4T2YoZm9sZGVyUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzUGF0aCA9IHJlc1BhdGguc3Vic3RyaW5nKGluZGV4K2ZvbGRlclBhdGgubGVuZ3RoKCksIHJlc1BhdGgubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIod2ViUHJvamVjdFVSTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvd3NkbCIpOwotICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChyZXNQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICB3c2RsVVJMcy5hZGQoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBMaXZlV1NETEZpbHRlcltdIGZpbHRlcnMgPSBuZXcgTGl2ZVdTRExGaWx0ZXJbd3NkbFVSTHMuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZmlsdGVyc1tpXSA9IG5ldyBMaXZlV1NETEZpbHRlcigoU3RyaW5nKXdzZGxVUkxzLmdldChpKSk7Ci0gICAgICBmaWx0ZXJzW2ldLnN0YXJ0KCk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIWZpbHRlcnNbaV0uaXNGaW5pc2goKSkKLSAgICAgIHsKLSAgICAgICAgVGhyZWFkLnlpZWxkKCk7Ci0gICAgICAgIGkgPSAtMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghZmlsdGVyc1tpXS5pc1dTRExMaXZlKCkpCi0gICAgICAgIHdzZGxVUkxzLnJlbW92ZShmaWx0ZXJzW2ldLmdldFdTRExVUkwoKSk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsVVJMczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWU5ZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzYy1heGlzLXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGVlMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5kaXNjb3ZlcnkuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3NkbDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Njg3NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB3c2MtYXhpcy11aS5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tcGF0aWJpbGl0eS5QbHVnaW5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuZW52LAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndzcnQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudWksCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2Uud3N0LndzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSwKLSBvcmcud3NkbDRqLAotIG9yZy5hcGFjaGUuYXhpczExCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotUGx1Z2luLUNsYXNzOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTJlMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2Uud3NjLWF4aXMtdWkuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0gd3NjLWF4aXMtdWkuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiN2E4M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYnNlcnZpY2UgQXhpcyBDb25zdW1wdGlvbiBVSQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfSkFWQV9BWElTPUphdmEgcHJveHkKLUxBQkVMX1JVTlRJTUVfQVhJU18xMT1BcGFjaGUgQXhpcyAxLjEKLURFU0NfUlVOVElNRV9BWElTXzExPUFwYWNoZSBBeGlzIDEuMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmZkYTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICAgIDwhLS0gV2ViIFNlcnZpY2UgQ2xpZW50IFR5cGVzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VDbGllbnRUeXBlIj4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXIKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuMzIiCi0gICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyLnJ1bnRpbWUiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDMyX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlcj4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXIKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDAiCi0gICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwLnJ1bnRpbWUiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDQwX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlcj4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXIKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiCi0gICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxLnJ1bnRpbWUiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDQxX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlcj4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXIKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiCi0gICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgcnVudGltZVR5cGVJZHM9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwLnJ1bnRpbWUiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDUwX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlcj4KLQotICAgICAgPHdlYlNlcnZpY2VSdW50aW1lCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX1JVTlRJTUVfQVhJU18xMSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlREVTQ19SVU5USU1FX0FYSVNfMTEiCi0gICAgICAgICAgICBpc0RlZmF1bHQ9ImZhbHNlIgotICAgICAgICAgICAgajJlZXZlcnNpb249IjEzIDE0IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSI+Ci0gICAgICA8L3dlYlNlcnZpY2VSdW50aW1lPgotCi0gICAgICA8d2ViU2VydmljZUNsaWVudFR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVXRUJTRVJWSUNFQ0xJRU5UVFlQRV9OQU1FX0pBVkFfQVhJUyIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGNsaWVudFR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDMyX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuV2ViU2VydmljZUNsaWVudEF4aXNUeXBlLmF4aXMxMS5Ub21jYXQzMkxvY2FsIj4KLSAgICAgIDwvd2ViU2VydmljZUNsaWVudFR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlQ2xpZW50VHlwZQotICAgICAgICAgICAgbmFtZT0iJVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfSkFWQV9BWElTIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgY2xpZW50VHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuV2ViU2VydmljZUNsaWVudEF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNDBfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUuYXhpczExLlRvbWNhdDQwTG9jYWwiPgotICAgICAgPC93ZWJTZXJ2aWNlQ2xpZW50VHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VDbGllbnRUeXBlCi0gICAgICAgICAgICBuYW1lPSIlV0VCU0VSVklDRUNMSUVOVFRZUEVfTkFNRV9KQVZBX0FYSVMiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBjbGllbnRUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5XZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5heGlzMTEuVG9tY2F0NDFMb2NhbCI+Ci0gICAgICA8L3dlYlNlcnZpY2VDbGllbnRUeXBlPgotCi0gICAgICA8d2ViU2VydmljZUNsaWVudFR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVXRUJTRVJWSUNFQ0xJRU5UVFlQRV9OQU1FX0pBVkFfQVhJUyIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGNsaWVudFR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LldlYlNlcnZpY2VDbGllbnRBeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDUwX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuV2ViU2VydmljZUNsaWVudEF4aXNUeXBlLmF4aXMxMS5Ub21jYXQ1MExvY2FsIj4KLSAgICAgIDwvd2ViU2VydmljZUNsaWVudFR5cGU+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIEoyRUUgU2VydmljZSBSZWZlcmVuY2UgR2VuZXJhdG9yIC0tPgotICAgICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuV2ViU2VydmljZUNsaWVudEdlbmVyYXRvciI+Ci0gICAgIDxnZW5lcmF0b3IKLSAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kLkF4aXNDbGllbnRHZW5lcmF0b3IiPgotICAgICAgICA8cnVudGltZQotICAgICAgICAgICAgICBzZXJ2ZXJUYXJnZXQ9IkdlbmVyaWMgSjJFRSBDb250YWluZXIiPgotICAgICAgICA8L3J1bnRpbWU+ICAgICAgICAgCi0gICAgIDwvZ2VuZXJhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5ICAgCi0gICAgICAgICAgICAgaWQ9IkF4aXNDbGllbnRDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndzcnQuQXhpc0NsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkiLz4KLSAgICA8L2V4dGVuc2lvbj4gCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vdWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOWIwYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2F4aXMvY29uc3VtcHRpb24vdWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotCi1NU0dfRVJST1JfREVGQVVMVF9CRUFOPUlXQUIwNDkxRSBFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBzZXR0aW5nIHVwIGRlZmF1bHQgdmFsdWVzIGZvciBKYXZhIGJlYW4KLU1TR19FUlJPUl9SRUFEX1dTREw9SVdBQjA0OTRFIEVycm9yIGluIHJlYWRpbmcgV1NETCBmaWxlIHswfQotTVNHX0VSUk9SX1dTRExfTk9fREVGSU5JVElPTj1JV0FCMDQ5NUUgV1NETCBmaWxlIGF0IHswfSBoYXMgbm8gZGVmaW5pdGlvbiBlbGVtZW50Ci1NU0dfRVJST1JfV1NETF9OT19QT1JUPUlXQUIwNDk2RSBXU0RMIGZpbGUgYXQgezB9IGhhcyBubyBwb3J0IGVsZW1lbnQKLU1TR19FUlJPUl9XUklURV9XU0RMPUlXQUIwNDk3RSBFcnJvciBpbiB3cml0aW5nIFdTREwgZmlsZSB7MH0KLQotCi0KLSMKLSMgTWVzc2FnZXMgZm9yIENvcHlDbGllbnRXU0RMVGFzawotIwotTVNHX0VSUk9SX0lNUE9SVF9XU0RMPUlXQUIwNTMxRSBFcnJvciBpbiByZXNvbHZpbmcgV1NETCBmaWxlIHswfSwgaW1wb3J0IFdTREwgZmlsZSBtdXN0IGhhdmUgYWJzb2x1dGUgVVJMIG9yIHJlbGF0aXZlIFVSTCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKLQotCi0jCi0jRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQKLSMKLVRBU0tfTEFCRUxfQ0xJRU5UX0pBVkFfV1NETF9ERUZBVUxUUz1EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMCi1UQVNLX0RFU0NfQ0xJRU5UX0pBVkFfV1NETF9ERUZBVUxUUz1CdWlsZHMgdGhlIEphdmFXU0RMUGFyYW1ldGVyIGZvciBjbGllbnQgc2lkZS4KLU1TR19FUlJPUl9XU0RMX0xPQ0FUSU9OX05PVF9TRVQ9SVdBQjA1MDFFIFdTREwgbG9jYXRpb24gbm90IHNldC4KLQotIwotI0FkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrCi0jCi1UQVNLX0xBQkVMX0pBUlNfVE9fUFJPSkVDVD1BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotVEFTS19ERVNDX0pBUlNfVE9fUFJPSkVDVD1BZGQgSmFycyB0byBwcm9qZWN0IGJ1aWxkIHBhdGguCi1NU0dfV0FSTl9OT19KQVZBX05BVFVSRT1JV0FCMDUwMlcgVGhlIHByb2plY3QgaXMgbm90IGEgSmF2YSBwcm9qZWN0LgotTVNHX0VSUk9SX0JBRF9CVUlMRFBBVEg9SVdBQjA1MDNFIFVuYWJsZSB0byB1cGRhdGUgSmF2YSBidWlsZCBwYXRoLiBQbGVhc2UgY2hlY2sgeW91ciBzeXN0ZW0gZW52aXJvbm1lbnQuCi0KLSMKLSNDb3B5QXhpc0phckNvbW1hbmQKLSMKLVRBU0tfREVTQ19DT1BZX0pBUlNfVE9fUFJPSkVDVD1Db3B5QXhpc0phckNvbW1hbmQKLVRBU0tfTEFCRUxfQ09QWV9KQVJTX1RPX1BST0pFQ1Q9Q29weSByZXF1aXJlZCBBeGlzIHJ1bnRpbWUgamFycyBmcm9tIHBsdWdpbiB0byB3ZWIgcHJvamVjdC4KLVBST0dSRVNTX0lORk9fQ09QWV9BWElTX0NGRz1JV0FCMDUwNUkgQ29weWluZyBBeGlzIGphciBmaWxlcyB0byB3ZWIgcHJvamVjdC4KLU1TR19FUlJPUl9GSUxFQ09QWT1JV0FCMDUwNkUgRXJyb3Igd2hlbiBjb3B5aW5nIEF4aXMgamFyIGZpbGVzIHRvIHdlYiBwcm9qZWN0Ci0KLSMKLSNSZWZyZXNoUHJvamVjdFRhc2sKLSMKLVRBU0tfTEFCRUxfUkVGRVNIX1BST0pFQ1Q9UmVmcmVzaFByb2plY3RUYXNrCi1UQVNLX0RFU0NfUkVGRVNIX1BST0pFQ1Q9UmVmcmVzaCB0aGUgZmlsZXMgb24gdGhlIHByb2plY3Qgd2l0aCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi1NU0dfRVJST1JfUkVGUkVTSF9QUk9KRUNUPUlXQUIwNTA4RSBVbmFibGUgdG8gcmVmcmVzaCBwcm9qZWN0LgotCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc1Byb3h5RnJhZ21lbnQKLSMKLQotIwotI1dlYlNlcnZpY2VBeGlzUHJveHlQYWdlCi0jCi1UT09MVElQX1BXSkJfUEFHRT1QYWdlCi1UT09MVElQX1BXSkJfVEVYVF9GT0xERVI9Rm9sZGVyIGZvciBwcm94eSB0byBiZSBnZW5lcmF0ZWQgZm9yIHRoZSBzZWxlY3RlZCBiaW5kaW5nLgotVE9PTFRJUF9QV0pCX0NIRUNLQk9YX0dFTlBST1hZPUNoZWNrIHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGEgcHJveHkuCi0KLVBBR0VfVElUTEVfV1NfQVhJU19QUk9YWT1XZWIgU2VydmljZSBQcm94eSBQYWdlCi1QQUdFX0RFU0NfV1NfQVhJU19QUk9YWT1TZWxlY3QgZ2VuZXJhdGUgcHJveHkgaWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgcHJveHkgZm9yIHlvdXIgc2VydmljZS4KLUNIRUNLQk9YX0dFTlBST1hZPUdlbmVyYXRlIHByb3h5Ci1MQUJFTF9GT0xERVJfTkFNRT1PdXRwdXQgZm9sZGVyCi0KLSMKLSMgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzawotIwotQ0hFQ0tfV1NfRERfVEFTS19ERVNDUklQVElPTj1DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrCi1DSEVDS19XU19ERF9UQVNLX0xBQkVMPUNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLQotIwotI0NsYXNzcGF0aFV0aWxzCi0jCi1NU0dfRVJST1JfQ0xBU1NQQVRIX1VUSUxTX0lPRVhDRVBUSU9OPUlXQUIwNTA5RSBJT0V4Y2VwdGlvbiBpbiBDbGFzc3BhdGhVdGlscwotCi0jCi0jIE1lc3NhZ2VzIGZvciBXZWJTZXJpdmNlQXhpc01hcHBpbmdzUGFnZQotIwotUEFHRV9USVRMRV9XU19CRUFOMlhNTD1XZWIgU2VydmljZSBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5nCi1QQUdFX1RJVExFX1dTX1hNTDJQUk9YWT1XZWIgU2VydmljZSBDbGllbnQgbmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZwotUEFHRV9ERVNDX1AyTl9NQVBQSU5HUz1EZWZpbmUgY3VzdG9tIG1hcHBpbmcgZm9yIHBhY2thZ2UgdG8gbmFtZXNwYWNlLgotTEFCRUxfTUFQUElOR19QQUlSUz1NYXBwaW5nIHBhaXJzCi1UQUJMRV9DT0xVTU5fTEFCRUxfUEFDS0FHRT1wYWNrYWdlCi1UQUJMRV9DT0xVTU5fTEFCRUxfTkFNRVNQQUNFPW5hbWVzcGFjZQotTEFCRUxfRVhQTE9SRV9NQVBQSU5HU19YTUwyQkVBTj1EZWZpbmUgY3VzdG9tIG1hcHBpbmcgZm9yIG5hbWVzcGFjZSB0byBwYWNrYWdlLgotVE9PTFRJUF9OMlBfU0hPV19NQVBQSU5HUz1EZWZpbmUgbmFtZXNwYWNlIHRvIHBhY2thZ2UgbWFwcGluZyBmb3IgY3VzdG9taXphdGlvbi4KLQotIwotIyBNZXNzYWdlcyBmb3IgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzawotIwotTVNHX0VSUk9SX1hNTF9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1JV0FCMDUzMkUgRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBBcGFjaGUgQXhpcyBkZXBsb3ltZW50IGRlc2NyaXB0b3I/Ci0KLSMKLSNNZXNzYWdlcyBmb3IgQ29weUNsaWVudFdTRExDb21tYW5kCi0jCi1UQVNLX0RFU0NfQ09QWV9DTElFTlRfV1NETD1Db3BpZXMgV1NETCB0byBDbGllbnQgcHJvamVjdAotVEFTS19MQUJFTF9DT1BZX0NMSUVOVF9XU0RMPUNvcHkgV1NETCB0byBDbGllbnQgcHJvamVjdAotCi0jCi0jQXhpc0NsaWVudElucHV0Q29tbWFuZCBhbmQgQXhpc0NsaWVudE91dHB1dENvbW1hbmQKLSMKLQotVEFTS19MQUJFTF9BWElTX0NMSUVOVF9JTlBVVD1BeGlzIGNsaWVudCBpbnB1dCBjb21tbWFuZAotVEFTS19ERVNDX0FYSVNfQ0xJRU5UX0lOUFVUPUF4aXMgY2xpZW50IGlucHV0IGNvbW1tYW5kCi1UQVNLX0xBQkVMX0FYSVNfQ0xJRU5UX09VVFBVVD1BeGlzIGNsaWVudCBvdXRwdXQgY29tbW1hbmQKLVRBU0tfREVTQ19BWElTX0NMSUVOVF9PVVRQVVQ9QXhpcyBjbGllbnQgb3V0cHV0IGNvbW1tYW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0FkZEF4aXNKQVJUb0J1aWxkUGF0aENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQWRkQXhpc0pBUlRvQnVpbGRQYXRoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVkMjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQWRkQXhpc0pBUlRvQnVpbGRQYXRoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDb21tYW5kIHRvIGFkZCBheGlzLmphciB0byB0aGUgYnVpbGQgcGF0aCBvZiBhIHByb2plY3QgYXMgYW4gZXh0ZXJuYWwgdmFyaWFibGUKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIEBhdXRob3IgcnNpbmhhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgQWRkQXhpc0pBUlRvQnVpbGRQYXRoQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIHByaXZhdGUgU3RyaW5nIGphclBsdWdpbklkID0gIm9yZy5hcGFjaGUuYXhpczExIjsKLSAgcHJpdmF0ZSBTdHJpbmcgamFyUGx1Z2luUmVsUGF0aCA9ICJsaWIiOwotICBwcml2YXRlIFN0cmluZyBqYXJOYW1lID0gImF4aXMuamFyIjsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICAvL0FkZCBKQVJzIHRvIHRoZSBjbGFzc3BhdGgKLSAgICBJQ2xhc3NwYXRoRW50cnlbXSBvbGRDbGFzc3BhdGg7Ci0gICAgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoOwotICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLSAgICAKLSAgICAvL0dldCB0aGUgb2xkIGNsYXNzcGF0aAotICAgIHRyeQotICAgIHsgICAgCi0gICAgICBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsgICAgCi0gICAgICBpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RhdHVzIHdTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV0FSTklOR19OT1RfQ09NUElMRSIpLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICAgIHJldHVybiB3U3RhdHVzOwotICAgICAgfQotCi0gICAgICBvbGRDbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN0YXR1cyB3U3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1dBUk5JTkdfTk9UX0NPTVBJTEUiKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgcmV0dXJuIHdTdGF0dXM7Ci0gICAgfQotICAgIAotICAgIC8vQ2hlY2sgaWYgdGhlIGF4aXMuamFyIGlzIGFscmVhZHkgb24gdGhlIGJ1aWxkIHBhdGgKLSAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JZm9yIChpbnQgaT0wOyBpPG9sZENsYXNzcGF0aC5sZW5ndGg7IGkrKykKLQl7Ci0JICBmb3VuZCA9IGZvdW5kIHx8IG9sZENsYXNzcGF0aFtpXS5nZXRQYXRoKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGphck5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgfQotCi0JaWYgKGZvdW5kKSAKLQl7Ci0JICByZXR1cm4gc3RhdHVzOwotCX0gICAgCi0gICAgCi0JLy9BZGQgYXhpcy5qYXIgdG8gdGhlIGJ1aWxkIHBhdGgKLQluZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZENsYXNzcGF0aC5sZW5ndGggKyAxXTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChpPTAgOyBpIDwgb2xkQ2xhc3NwYXRoLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIG5ld0NsYXNzcGF0aFtpXSA9IG9sZENsYXNzcGF0aFtpXTsKLSAgICB9Ci0gICAgCi0gICAgSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gZ2V0Q2xhc3NwYXRoRW50cnkoKTsKLSAgICBpZiAobmV3RW50cnk9PW51bGwpCi0gICAgewotICAgICAgU3RhdHVzIHdTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV0FSTklOR19OT1RfQ09NUElMRSIpLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICByZXR1cm4gd1N0YXR1czsKLSAgICB9Ci0gICAgbmV3Q2xhc3NwYXRoW2ldID0gbmV3RW50cnk7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzcGF0aCxudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN0YXR1cyB3U3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1dBUk5JTkdfTk9UX0NPTVBJTEUiKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgcmV0dXJuIHdTdGF0dXM7Ci0gICAgfQotICAgIAotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IGdldENsYXNzcGF0aEVudHJ5KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0gICAgICBJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gcGx1Z2luUmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihqYXJQbHVnaW5JZCk7Ci0KLSAgICAgIFN0cmluZ0J1ZmZlciB0aGVKYXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB0aGVKYXIuYXBwZW5kKGphclBsdWdpblJlbFBhdGgpOwotCi0gICAgICBpZiAoamFyUGx1Z2luUmVsUGF0aC5sZW5ndGgoKT4wKQotICAgICAgICB0aGVKYXIuYXBwZW5kKElQYXRoLlNFUEFSQVRPUik7Ci0KLSAgICAgIHRoZUphci5hcHBlbmQoamFyTmFtZSk7Ci0gICAgICAKLSAgICAgIFVSTCBsb2NhbFVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSx0aGVKYXIudG9TdHJpbmcoKSkpOwotICAgICAgUGF0aCBqYXJQYXRoID0gIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0gICAgICBJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShqYXJQYXRoLCBudWxsLCBudWxsKTsKLSAgICAgIHJldHVybiBjcEVudHJ5OwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0gCi0gIAotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmRiYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV1NETFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotLyoqCi0gKiAKLSAqIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZAotICogIAotICovCi1wdWJsaWMgY2xhc3MgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCAKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbGllbnRTY2VuYXJpb18gID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gY3VzdG9taXplTWFwcGluZ3NfID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUHJveHlfID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBjbGllbnRSdW50aW1lSWRfOwotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm94eVByb2plY3RfID0gbnVsbDsKLQlwcml2YXRlIElQcm9qZWN0IGNsaWVudFByb2plY3RFQVJfID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB3c2RsVVJMXzsKLQlwcml2YXRlIGJvb2xlYW4gdGVzdFByb3h5U2VsZWN0ZWRfOwotCXByaXZhdGUgSVNlcnZlciBjbGllbnRFeGlzdGluZ1NlcnZlcl87Ci0JcHJpdmF0ZSBTdHJpbmcgY2xpZW50U2VydmVyXzsKLQlwcml2YXRlIFN0cmluZyBjbGllbnRTZXJ2ZXJUeXBlSWRfOwotCXByaXZhdGUgYm9vbGVhbiBjbGllbnRJc0V4aXN0aW5nU2VydmVyXzsKLQlwcml2YXRlIFN0cmluZyBwcm94eVByb2plY3RGb2xkZXJfOwotCXByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXJfOwotCXByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlTmFtZV87Ci0JCi0JCi0JcHVibGljIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCggU3RyaW5nIG1vZHVsZU5hbWUgKSAKLQl7Ci0JICBtb2R1bGVOYW1lXyA9IG1vZHVsZU5hbWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50KQotCSAqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCQotCQljbGllbnRFeGlzdGluZ1NlcnZlcl8gPSBnZXRTZXJ2ZXJGcm9tU2VydmVyTGFiZWwoKTsKLQkJaWYgKGNsaWVudEV4aXN0aW5nU2VydmVyXyAhPSBudWxsKSB7Ci0JCQljbGllbnRTZXJ2ZXJUeXBlSWRfID0gY2xpZW50RXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQl9IGVsc2UgewotCQkJLy9UT0RPIGdldCB0aGUgZmFjdG9yeSBpZCBmb3IgdGhlIHR5cGUuCi0JCX0KLQkJLy9qYXZhV1NETFBhcmFtCi0JCWphdmFXU0RMUGFyYW1fID0gbmV3IEphdmFXU0RMUGFyYW1ldGVyKCk7Ci0JCQotCQkvLyBwcm94eVByb2plY3RGb2xiZXJfCi0JCQotCQl3ZWJTZXJ2aWNlc1BhcnNlcl8gPSBXU0RMUGFyc2VyRmFjdG9yeS5nZXRXU0RMUGFyc2VyKCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50UnVudGltZUlEKFN0cmluZyBjbGllbnRSdW50aW1lSWQpIHsKLQkJY2xpZW50UnVudGltZUlkXyA9IGNsaWVudFJ1bnRpbWVJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsaWVudFJ1bnRpbWVJRCgpIHsKLQkJcmV0dXJuIHRoaXMuY2xpZW50UnVudGltZUlkXzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCi0JICovCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtXzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudFByb2plY3QuCi0JICovCi0JcHVibGljIElQcm9qZWN0IGdldENsaWVudFByb2plY3QoKSB7Ci0JCXJldHVybiBwcm94eVByb2plY3RfOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGllbnRQcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgY2xpZW50UHJvamVjdCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChJUHJvamVjdCBjbGllbnRQcm9qZWN0KSB7Ci0JCXRoaXMucHJveHlQcm9qZWN0XyA9IGNsaWVudFByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRQcm9qZWN0RUFSLgotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRDbGllbnRQcm9qZWN0RUFSKCkgewotCQlyZXR1cm4gY2xpZW50UHJvamVjdEVBUl87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudFByb2plY3RFQVIKLQkgKiAgICAgICAgICAgIFRoZSBjbGllbnRQcm9qZWN0RUFSIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0RUFSKElQcm9qZWN0IGNsaWVudFByb2plY3RFQVIpIHsKLQkJdGhpcy5jbGllbnRQcm9qZWN0RUFSXyA9IGNsaWVudFByb2plY3RFQVI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXN0UHJveHlTZWxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRUZXN0UHJveHlTZWxlY3RlZCgpIHsKLQkJcmV0dXJuIHRlc3RQcm94eVNlbGVjdGVkXzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGVzdFByb3h5U2VsZWN0ZWQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXN0UHJveHlTZWxlY3RlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdFByb3h5U2VsZWN0ZWQoYm9vbGVhbiB0ZXN0UHJveHlTZWxlY3RlZCkgewotCQl0aGlzLnRlc3RQcm94eVNlbGVjdGVkXyA9IHRlc3RQcm94eVNlbGVjdGVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbFVSTC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkwoKSB7Ci0JICByZXR1cm4gd3NkbFVSTF87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdzZGxVUkwKLQkgKiAgICAgICAgICAgIFRoZSB3c2RsVVJMIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXc2RsVVJMKFN0cmluZyB3c2RsVVJMKSB7Ci0JCXRoaXMud3NkbFVSTF8gPSB3c2RsVVJMOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50U2VydmVyLgotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldENsaWVudEV4aXN0aW5nU2VydmVyKCkgewotCQlyZXR1cm4gY2xpZW50RXhpc3RpbmdTZXJ2ZXJfOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGllbnRTZXJ2ZXIKLQkgKiAgICAgICAgICAgIFRoZSBjbGllbnRTZXJ2ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaWVudFNlcnZlcihTdHJpbmcgY2xpZW50U2VydmVyKSB7Ci0JCXRoaXMuY2xpZW50U2VydmVyXyA9IGNsaWVudFNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudElzRXhpc3RpbmdTZXJ2ZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbGllbnRJc0V4aXN0aW5nU2VydmVyKCkgewotCQlyZXR1cm4gY2xpZW50SXNFeGlzdGluZ1NlcnZlcl87Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudElzRXhpc3RpbmdTZXJ2ZXIKLQkgKiAgICAgICAgICAgIFRoZSBjbGllbnRJc0V4aXN0aW5nU2VydmVyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRJc0V4aXN0aW5nU2VydmVyKGJvb2xlYW4gY2xpZW50SXNFeGlzdGluZ1NlcnZlcikgewotCQl0aGlzLmNsaWVudElzRXhpc3RpbmdTZXJ2ZXJfID0gY2xpZW50SXNFeGlzdGluZ1NlcnZlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDdXN0b21pemVDbGllbnRNYXBwaW5ncygpIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZU1hcHBpbmdzXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVDbGllbnRNYXBwaW5ncyhib29sZWFuIHZhbHVlKSB7Ci0JCWN1c3RvbWl6ZU1hcHBpbmdzXyA9IHZhbHVlOwotCX0KLQotCXByaXZhdGUgSVNlcnZlciBnZXRTZXJ2ZXJGcm9tU2VydmVyTGFiZWwoKSB7Ci0JCWlmICh0cnVlKQotCQkvLyByc2sgcmV2aXNpdCBpZiAoY2xpZW50SXNFeGlzdGluZ1NlcnZlcl8pCi0JCXsKLQkJCS8vIE1heWJlIHRoaXMgc2hvdWxkIGJlIGluIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5Ci0JCQlWZWN0b3Igc2VydmVySWRzID0gbmV3IFZlY3RvcigpOwotCQkJewotCQkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0JCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCE9MCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIHNlcnZlcnNbaV07Ci0JCQkJCQlpZiAoKHNlcnZlci5nZXROYW1lKCkpLmVxdWFscyhjbGllbnRTZXJ2ZXJfKSkKLQkJCQkJCQlyZXR1cm4gc2VydmVyOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8KLQkJfSBlbHNlIHsKLQkJCS8vVE9ETyBjcmVhdGUgdGhlIHNlcnZlcgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb3h5UHJvamVjdEZvbGRlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5UHJvamVjdEZvbGRlcigpIHsKLQkJaWYgKHByb3h5UHJvamVjdF8hPW51bGwpIHsKLQkJCXByb3h5UHJvamVjdEZvbGRlcl8gPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbihwcm94eVByb2plY3RfLCBtb2R1bGVOYW1lXyApLnRvU3RyaW5nKCk7Ci0JCX0JCQotCQlyZXR1cm4gcHJveHlQcm9qZWN0Rm9sZGVyXzsgIAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkgewotCQlyZXR1cm4gd2ViU2VydmljZXNQYXJzZXJfOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gd2ViU2VydmljZXNQYXJzZXIgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotCQl0aGlzLndlYlNlcnZpY2VzUGFyc2VyXyA9IHdlYlNlcnZpY2VzUGFyc2VyOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdlbmVyYXRlUHJveHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpIHsKLQkJcmV0dXJuIGdlbmVyYXRlUHJveHlfOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZ2VuZXJhdGVQcm94eSBUaGUgZ2VuZXJhdGVQcm94eSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpIHsKLQkJdGhpcy5nZW5lcmF0ZVByb3h5XyA9IGdlbmVyYXRlUHJveHk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNDbGllbnRTY2VuYXJpb18uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SXNDbGllbnRTY2VuYXJpbygpCi0gICAgewotICAgICAgcmV0dXJuIGlzQ2xpZW50U2NlbmFyaW9fOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gaXNDbGllbnRTY2VuYXJpb18gVGhlIGlzQ2xpZW50U2NlbmFyaW9fIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJc0NsaWVudFNjZW5hcmlvKGJvb2xlYW4gaXNDbGllbnRTY2VuYXJpbykKLSAgICB7Ci0gICAgICBpc0NsaWVudFNjZW5hcmlvXyA9IGlzQ2xpZW50U2NlbmFyaW87Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXRFbmRwb2ludE1ldGhvZCBUaGUgc2V0RW5kcG9pbnRNZXRob2QgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2V0RW5kcG9pbnRNZXRob2QoKQotICAgIHsKLSAgICAgIHJldHVybiAic2V0RW5kcG9pbnQiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzdmNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VDbGllbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmVudi5KMkVFRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNvcHlBeGlzSmFyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS51dGlsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50R2VuZXJhdG9yIGV4dGVuZHMgV2ViU2VydmljZUNsaWVudEdlbmVyYXRvciAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgCi0gIHB1YmxpYyBJU3RhdHVzIGdlbldlYlNlcnZpY2VDbGllbnRBcnRpZmFjdHMoV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyIGRhdGFNb2RlbCkKLSAgewotICAJLy9nZXQgaW5mbyBmcm9tIHRoZSBtb2RlbAotICAJU3RyaW5nIHdzZGxVUkwgPSBkYXRhTW9kZWwuZ2V0V1NETFVybCgpOwotICAgIFN0cmluZyBwcm9qZWN0ID0gZGF0YU1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgU3RyaW5nIG91dHB1dFdTRExGaWxlUGF0aE5hbWUgPSBkYXRhTW9kZWwuZ2V0T3V0cHV0V1NETEZpbGVOYW1lKCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VRTmFtZSA9IGRhdGFNb2RlbC5nZXRTZXJ2aWNlUU5hbWUoKTsKLSAgICBib29sZWFuIHNob3VsZERlcGxveSA9IGRhdGFNb2RlbC5zaG91bGREZXBsb3koKTsKLSAgICAKLSAgICAKLSAgICAvL0dlbmVyYXRlIHRoZSBhcnRpZmFjdHMKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgLy9BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQKLSAgICBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kID0gbmV3IEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCgiIik7Ci0gICAgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLnNldFdzZGxVUkwod3NkbFVSTCk7Ci0gICAgYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpKTsKLSAgICBheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuc2V0Q2xpZW50UHJvamVjdCgoSVByb2plY3QpKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0ocHJvamVjdCkpKTsKLSAgICBheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuc2V0VGVzdFByb3h5U2VsZWN0ZWQoZmFsc2UpOwotICAgIGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5zZXRJc0NsaWVudFNjZW5hcmlvKHRydWUpOwotICAgIGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5zZXRHZW5lcmF0ZVByb3h5KHRydWUpOwotICAgIEoyRUVFbnZpcm9ubWVudCBqMmVlRW52aXJvbm1lbnQgPSBuZXcgSjJFRUVudmlyb25tZW50KCk7Ci0gICAgc3RhdHVzID0gYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmV4ZWN1dGUoajJlZUVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9Ci0gICAgCi0vLyAgRmlndXJlIG91dCBpZiB0aGlzIGlzIGEgV2ViLCBFSkIsIG9yIEFwcENsaWVudCBwcm9qZWN0Ci0gICAgYm9vbGVhbiBpc1dlYlByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0Q2xpZW50UHJvamVjdCgpKTsKLSAgICAKLSAgICAvL0RlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQKLSAgICBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIGh0dHBDb21tYW5kID0gbmV3IERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQoKTsKLSAgICBodHRwQ29tbWFuZC5zZXRKYXZhV1NETFBhcmFtKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRKYXZhV1NETFBhcmFtKCkpOwotICAgIGh0dHBDb21tYW5kLnNldFdzZGxTZXJ2aWNlVVJMKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCkpOwotICAgIGh0dHBDb21tYW5kLnNldFdlYlNlcnZpY2VzUGFyc2VyKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXZWJTZXJ2aWNlc1BhcnNlcigpKTsKLSAgICBzdGF0dXMgPSBodHRwQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfQotICAgIAotICAgIC8vQ29weUF4aXNKYXJDb21tYW5kCi0gICAgLy9UaGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIEF4aXMgV1NETDJKYXZhIGVtaXR0ZXIgcmVxdWlyZXMgYXhpcy5qYXIgaW4gb3JkZXIgdG8gY29tcGlsZS4KLSAgICAvL0luIHRoZSBjYXNlIG9mIGEgV2ViIHByb2plY3QsIHdlIGFkZCBpdCB0byB0aGUgbGliIGRpcmVjdG9yeS4KLSAgICAvL0luIHRoZSBjYXNlIG9mIGFuIEVKQiBvciBBcHAgQ2xpZW50IHByb2plY3QsIHdlIGFkZCBpdCBhcyBhbiBleHRlcm5hbCBKQVIuIFRoaXMgYnJlYWtzCi0gICAgLy90aGUgdGVhbSBlbnZpcm9ubWVudCBzY2VuYXJpby4gV2Ugd2lsbCBoYXZlIHRvIHRoaW5rIG9mIGEgYmV0dGVyIHdheSB0byBkZWFsIHdpdGggdGhpcyAKLSAgICAvL2luIHRoZSBmdXR1cmUuCi0gICAgaWYgKGlzV2ViUHJvamVjdCkKLSAgICB7Ci0JICAgIENvcHlBeGlzSmFyQ29tbWFuZCBheGpDb21tYW5kID0gbmV3IENvcHlBeGlzSmFyQ29tbWFuZCgiIik7Ci0JICAgIGF4akNvbW1hbmQuc2V0UHJvamVjdChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0Q2xpZW50UHJvamVjdCgpKTsKLQkgICAgc3RhdHVzID0gYXhqQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0JICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0JICAgIH0KLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBBZGRBeGlzSkFSVG9CdWlsZFBhdGhDb21tYW5kIGFkZEF4aXNDb21tYW5kID0gbmV3IEFkZEF4aXNKQVJUb0J1aWxkUGF0aENvbW1hbmQoKTsKLSAgICAgIGFkZEF4aXNDb21tYW5kLnNldFByb2plY3QoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldENsaWVudFByb2plY3QoKSk7Ci0gICAgICBzdGF0dXMgPSBhZGRBeGlzQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0JICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gU3RhdHVzLk9LKQotICAgICAgewotICAgICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotICAgIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrIGFkZEphcnNDb21tYW5kID0gbmV3IEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCk7Ci0gICAgYWRkSmFyc0NvbW1hbmQuc2V0UHJvamVjdChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0Q2xpZW50UHJvamVjdCgpKTsKLSAgICBzdGF0dXMgPSBhZGRKYXJzQ29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvL0RlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kCi0gICAgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQgZGVmQ2xpZW50Q29tbWFuZCA9IG5ldyBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZCgiIik7Ci0gICAgZGVmQ2xpZW50Q29tbWFuZC5zZXRKYXZhV1NETFBhcmFtKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRKYXZhV1NETFBhcmFtKCkpOwotICAgIGRlZkNsaWVudENvbW1hbmQuc2V0UHJveHlQcm9qZWN0KGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRDbGllbnRQcm9qZWN0KCkpOwotICAgIGRlZkNsaWVudENvbW1hbmQuc2V0V1NETFNlcnZpY2VVUkwoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldFdzZGxVUkwoKSk7Ci0gICAgc3RhdHVzID0gZGVmQ2xpZW50Q29tbWFuZC5leGVjdXRlKGoyZWVFbnZpcm9ubWVudCk7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgLy9WYWxpZGF0ZVdTRExDb21tYW5kCi0gICAgVmFsaWRhdGVXU0RMQ29tbWFuZCB2YWxXU0RMQ29tbWFuZCA9IG5ldyBWYWxpZGF0ZVdTRExDb21tYW5kKCk7Ci0gICAgdmFsV1NETENvbW1hbmQuc2V0V3NkbFVSSShheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V3NkbFVSTCgpKTsKLSAgICB2YWxXU0RMQ29tbWFuZC5zZXRXZWJTZXJ2aWNlc1BhcnNlcihheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V2ViU2VydmljZXNQYXJzZXIoKSk7Ci0gICAgc3RhdHVzID0gdmFsV1NETENvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0gICAgCi0gICAgLy9XU0RMMkphdmFDb21tYW5kCi0gICAgV1NETDJKYXZhQ29tbWFuZCB3MmpDb21tYW5kID0gbmV3IFdTREwySmF2YUNvbW1hbmQoKTsKLSAgICB3MmpDb21tYW5kLnNldEphdmFXU0RMUGFyYW0oYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldEphdmFXU0RMUGFyYW0oKSk7Ci0gICAgdzJqQ29tbWFuZC5zZXRXc2RsVVJJKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXc2RsVVJMKCkpOwotICAgIHN0YXR1cyA9IHcyakNvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0KLSAgICAvL1JlZnJlc2hQcm9qZWN0Q29tbWFuZAotICAgIFJlZnJlc2hQcm9qZWN0Q29tbWFuZCByZWZyZXNoQ29tbWFuZCA9IG5ldyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKTsKLSAgICByZWZyZXNoQ29tbWFuZC5zZXRQcm9qZWN0KGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRDbGllbnRQcm9qZWN0KCkpOwotICAgIHN0YXR1cyA9IHJlZnJlc2hDb21tYW5kLmV4ZWN1dGUoajJlZUVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9ICAgIAotICAgIAotICAgIFN0dWIyQmVhbkNvbW1hbmQgczJiQ29tbWFuZCA9IG5ldyBTdHViMkJlYW5Db21tYW5kKCk7Ci0gICAgczJiQ29tbWFuZC5zZXRKYXZhV1NETFBhcmFtKGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRKYXZhV1NETFBhcmFtKCkpOwotICAgIHMyYkNvbW1hbmQuc2V0V2ViU2VydmljZXNQYXJzZXIoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldFdlYlNlcnZpY2VzUGFyc2VyKCkpOwotICAgIHMyYkNvbW1hbmQuc2V0Q2xpZW50UHJvamVjdChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0Q2xpZW50UHJvamVjdCgpKTsKLSAgICBzdGF0dXMgPSBzMmJDb21tYW5kLmV4ZWN1dGUoajJlZUVudmlyb25tZW50KTsgCi0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpIT1TdGF0dXMuT0spCi0gICAgewotICAgICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gICAgfQotCi0gICAgLy9Db3B5Q2xpZW50V1NETENvbW1hbmQKLSAgICBDb3B5Q2xpZW50V1NETENvbW1hbmQgY29weUNvbW1hbmQgPSBuZXcgQ29weUNsaWVudFdTRExDb21tYW5kKCk7Ci0gICAgY29weUNvbW1hbmQuc2V0V3NkbFVSTChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V3NkbFVSTCgpKTsKLSAgICBjb3B5Q29tbWFuZC5zZXRDbGllbnRXU0RMUGF0aE5hbWUob3V0cHV0V1NETEZpbGVQYXRoTmFtZSk7Ci0gICAgY29weUNvbW1hbmQuc2V0V3NQYXJzZXIoYXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmdldFdlYlNlcnZpY2VzUGFyc2VyKCkpOwotICAgIHN0YXR1cyA9IGNvcHlDb21tYW5kLmV4ZWN1dGUoajJlZUVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICByZXR1cm4gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0U3RhdHVzVG9JU3RhdHVzKHN0YXR1cywgcGx1Z2luSWRfKTsKLSAgICB9ICAgIAotICAgIAotICAgIAotICAgIC8vQnVpbGRQcm9qZWN0Q29tbWFuZAotICAgIEJ1aWxkUHJvamVjdENvbW1hbmQgYnVpbGRDb21tYW5kID0gbmV3IEJ1aWxkUHJvamVjdENvbW1hbmQoKTsKLSAgICBidWlsZENvbW1hbmQuc2V0UHJvamVjdChheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0Q2xpZW50UHJvamVjdCgpKTsKLSAgICBidWlsZENvbW1hbmQuc2V0Rm9yY2VCdWlsZCh0cnVlKTsKLSAgICBzdGF0dXMgPSBidWlsZENvbW1hbmQuZXhlY3V0ZShqMmVlRW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLk9LKQotICAgIHsKLSAgICAgIHJldHVybiBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoc3RhdHVzLCBwbHVnaW5JZF8pOwotICAgIH0gICAgCi0gICAgICAgIAotICAgIC8vQ2FsY3VsYXRlIHRoZSBzZXJ2aWNlIGludGVyZmFjZSBhbmQgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgbmFtZXMKLSAgICBJbnRlcmZhY2VOYW1lcyBpbnRlcmZhY2VOYW1lcyA9IGNhbGN1bGF0ZVNJYW5kU0VJTmFtZShheGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuZ2V0V3NkbFVSTCgpLCBzZXJ2aWNlUU5hbWUsIGF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5nZXRXZWJTZXJ2aWNlc1BhcnNlcigpKTsKLSAgICBTdHJpbmcgc2lOYW1lID0gaW50ZXJmYWNlTmFtZXMuZ2V0U2lOYW1lKCk7IAotICAgIFN0cmluZ1tdIHNlaU5hbWVzID0gaW50ZXJmYWNlTmFtZXMuZ2V0U2VpTmFtZXMoKTsKLSAgICBpZiAoc2lOYW1lPT1udWxsIHx8IHNpTmFtZS5sZW5ndGgoKT09MCB8fCBzZWlOYW1lcz09bnVsbCB8fCBzZWlOYW1lcy5sZW5ndGg9PTApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKElTdGF0dXMuRVJST1IscGx1Z2luSWRfLDAsIlByb2JsZW1zISEiLG51bGwpOwotICAgIH0KLSAgICAKLSAgICAvL1NldCBpbmZvIG9uIHRoZSBkYXRhTW9kZWwKLSAgICBkYXRhTW9kZWwuc2V0U2VydmljZUludGVyZmFjZU5hbWUoc2lOYW1lKTsKLSAgICBkYXRhTW9kZWwuc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXMoc2VpTmFtZXMpOwotICAgIGRhdGFNb2RlbC5zZXREaWRHZW5EZXNjcmlwdG9ycyhmYWxzZSk7Ci0gICAgCi0gICAgcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydFN0YXR1c1RvSVN0YXR1cyhzdGF0dXMsIHBsdWdpbklkXyk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSW50ZXJmYWNlTmFtZXMgY2FsY3VsYXRlU0lhbmRTRUlOYW1lKFN0cmluZyB3c2RsVVJMLCBTdHJpbmcgc2VydmljZVFOYW1lLCBXZWJTZXJ2aWNlc1BhcnNlciB3c1BhcnNlcikKLSAgewotICAgIEludGVyZmFjZU5hbWVzIGlOYW1lcyA9IG5ldyBJbnRlcmZhY2VOYW1lcygpOwotICAgIFN0cmluZyBzZXJ2aWNlTG9jYWxQYXJ0ID0gc2VydmljZVFOYW1lLnN1YnN0cmluZyhzZXJ2aWNlUU5hbWUubGFzdEluZGV4T2YoJzonKSsxKTsKLSAgICBNYXAgcGtnMm5zTWFwcGluZyA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSB3c1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAKLSAgICBNYXAgc2VydmljZXMgPSBkZWYuZ2V0U2VydmljZXMoKTsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHNlcnZpY2UgPSAoU2VydmljZSlpdC5uZXh0KCk7Ci0gICAgICBpZiAoc2VydmljZUxvY2FsUGFydC5lcXVhbHMoc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgfSAgICAgICAgCi0gICAgICAKLSAgICBpZiAoc2VydmljZSE9bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VydmljZVBrZ05hbWUgPSBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWUoc2VydmljZSwgcGtnMm5zTWFwcGluZyk7Ci0gICAgICBTdHJpbmcgc2VydmljZUNsYXNzTmFtZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgIFN0cmluZyBqbmRpTmFtZSA9IHNlcnZpY2VDbGFzc05hbWU7Ci0gICAgICBNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBpZiAoc2VydmljZUNsYXNzTmFtZS5lcXVhbHMoKChQb3J0KWl0Mi5uZXh0KCkpLmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmljZUNsYXNzTmFtZSA9IHNlcnZpY2VDbGFzc05hbWUgKyAiX1NlcnZpY2UiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBBcnJheUxpc3Qgc2VpTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydClpdDIubmV4dCgpOwotICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IG51bGw7Ci0gICAgICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdDMgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTsgaXQzLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0My5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNvYXBBZGRyZXNzID0gKFNPQVBBZGRyZXNzKW9iamVjdDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzb2FwQWRkcmVzcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBwb3J0LmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpOwotICAgICAgICAgIFFOYW1lIHBvcnRUeXBlUU5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotICAgICAgICAgIFN0cmluZyBwb3J0VHlwZVBrZ05hbWUgPSBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWUocG9ydFR5cGUsIHBrZzJuc01hcHBpbmcpOwotICAgICAgICAgIFN0cmluZyBwb3J0VHlwZUNsYXNzTmFtZSA9IHBvcnRUeXBlUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgaWYgKGpuZGlOYW1lLmVxdWFscyhwb3J0VHlwZUNsYXNzTmFtZSkpCi0gICAgICAgICAgICAgIHBvcnRUeXBlQ2xhc3NOYW1lID0gcG9ydFR5cGVDbGFzc05hbWUgKyAiX1BvcnQiOwotICAgICAgICAgIHNlaU5hbWVzLmFkZChwb3J0VHlwZVBrZ05hbWUrIi4iK3BvcnRUeXBlQ2xhc3NOYW1lKTsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlOYW1lcy5zZXRTaU5hbWUoc2VydmljZVBrZ05hbWUrIi4iK3NlcnZpY2VDbGFzc05hbWUpOwotICAgICAgaU5hbWVzLnNldFNFSU5hbWVzKGNvbnZlcnRUb1N0cmluZ0FycmF5KHNlaU5hbWVzLnRvQXJyYXkoKSkpOwotICAgIH0gICAgCi0gICAgcmV0dXJuIGlOYW1lczsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBjb252ZXJ0VG9TdHJpbmdBcnJheShPYmplY3RbXSBhKQotICB7Ci0gIAlpZiAoYT09bnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gIAkKLSAgCWludCBsZW5ndGggPSBhLmxlbmd0aDsKLSAgCVN0cmluZ1tdIHNhID0gbmV3IFN0cmluZ1tsZW5ndGhdOwotICAJZm9yIChpbnQgaT0wOyBpPGxlbmd0aDsgaSsrKQotICAJewotICAJCU9iamVjdCBvYmogPSBhW2ldOwotICAJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpCi0gIAkJewotICAJCQlzYVtpXSA9IChTdHJpbmcpb2JqOwotICAJCX0KLSAgCX0KLSAgCXJldHVybiBzYTsKLSAgfSAgCi0gIHByaXZhdGUgY2xhc3MgSW50ZXJmYWNlTmFtZXMKLSAgewotICAgIHByaXZhdGUgU3RyaW5nIHNpTmFtZV87Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzZWlOYW1lc187Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRTaU5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiBzaU5hbWVfOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZWlOYW1lcygpCi0gICAgewotICAgICAgcmV0dXJuIHNlaU5hbWVzXzsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U2lOYW1lKFN0cmluZyBzaU5hbWUpCi0gICAgewotICAgICAgc2lOYW1lXyA9IHNpTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U0VJTmFtZXMoU3RyaW5nW10gc2VpTmFtZXMpCi0gICAgewotICAgICAgc2VpTmFtZXNfID0gc2VpTmFtZXM7Ci0gICAgfQotICAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0F4aXNDbGllbnRJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudElucHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDc3YmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQXhpc0NsaWVudElucHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50SW5wdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9BWElTX0NMSUVOVF9JTlBVVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19BWElTX0NMSUVOVF9JTlBVVCI7Ci0JCi0JcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3c2NfOwotCXByaXZhdGUgU3RyaW5nIHNlcnZlclByb2plY3RfOyAKLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJNb2R1bGVfOwotCXByaXZhdGUgSUNvbnRleHQgY29udGV4dF87Ci0KLQkgIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSURfOwotCSAgCi0JCXByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVByb3h5XyA9IHRydWU7Ci0JCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JCXByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3RfID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgY2xpZW50TW9kdWxlXyA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIHdzZGxVUkxfOwotCQlwcml2YXRlIElTZXJ2ZXIgY2xpZW50RXhpc3RpbmdTZXJ2ZXJfOwotCQlwcml2YXRlIFN0cmluZyBjbGllbnRTZXJ2ZXJfOwotCQlwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyXzsKLQkJCi0JICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JICAKLQkJLyoqCi0JCSogRGVmYXVsdCBDVE9SCi0JCSovCi0JCXB1YmxpYyBBeGlzQ2xpZW50SW5wdXRDb21tYW5kKCkgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBeGlzQ2xpZW50SW5wdXRDb21tYW5kKElXZWJTZXJ2aWNlQ2xpZW50IHdzYywgSUNvbnRleHQgY29udGV4dCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUpIHsKLQkJCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0JCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQkJd3NjXyA9IHdzYzsKLQkJCWNvbnRleHRfID0gY29udGV4dDsKLQkJCWNsaWVudFByb2plY3RfID0gcHJvamVjdDsgCi0JCQljbGllbnRNb2R1bGVfID0gbW9kdWxlOwotCQl9Ci0JCQotCSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkgIHsKLQkgICAgCi0JCWdlbmVyYXRlUHJveHlfID0gY29udGV4dF8uZ2V0Q2xpZW50KCk7Ci0JCXdzZGxVUkxfID0gd3NjXy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFdzZGxVUkwoKTsKLQkJY2xpZW50U2VydmVyXyA9IHdzY18uZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0JCQotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsaWVudFNlcnZlcigpIHsKLQkJcmV0dXJuIGNsaWVudFNlcnZlcl87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0KCkgewotCQlyZXR1cm4gY2xpZW50UHJvamVjdF87Ci0JfQotCi0JcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkgewotCQlyZXR1cm4gd2ViU2VydmljZXNQYXJzZXJfOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSTCgpIHsKLQkJcmV0dXJuIHdzZGxVUkxfOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50TW9kdWxlKCkgewotCQlyZXR1cm4gY2xpZW50TW9kdWxlXzsKLQl9Ci0JICAKLQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0F4aXNDbGllbnRPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0F4aXNDbGllbnRPdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjlhYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9BeGlzQ2xpZW50T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc0NsaWVudE91dHB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0FYSVNfQ0xJRU5UX09VVFBVVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19BWElTX0NMSUVOVF9PVVRQVVQiOwotCQotCXByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd3NjXzsKLQlwcml2YXRlIFN0cmluZyBwcm94eUJlYW5fOwotCQkKLQkgIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkgIAotCQkvKioKLQkJKiBEZWZhdWx0IENUT1IKLQkJKi8KLQkJcHVibGljIEF4aXNDbGllbnRPdXRwdXRDb21tYW5kKCkgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBeGlzQ2xpZW50T3V0cHV0Q29tbWFuZChJV2ViU2VydmljZUNsaWVudCB3c2MsIElDb250ZXh0IGNvbnRleHQsIFN0cmluZyBtb2R1bGUpIHsKLQkJCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0JCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQkJd3NjXyA9IHdzYzsKLQkJfQotCQkKLQkgIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JICB7CQkKLQkJd3NjXy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLnNldEltcGxVUkwocHJveHlCZWFuXyk7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkgIH0KLQotCXB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKSB7Ci0JCXRoaXMucHJveHlCZWFuXyA9IHByb3h5QmVhbjsKLQl9Ci0JICAKLQkJCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NvcHlDbGllbnRXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvY29tbWFuZC9Db3B5Q2xpZW50V1NETENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxNTczOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0NvcHlDbGllbnRXU0RMQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENvcHlDbGllbnRXU0RMQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0NPUFlfQ0xJRU5UX1dTREwiOwotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0NPUFlfQ0xJRU5UX1dTREwiOwotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187ICAKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTF87Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFdTRExQYXRoTmFtZV87Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd3NQYXJzZXJfOwotICAKLSAgcHVibGljIENvcHlDbGllbnRXU0RMQ29tbWFuZCgpCi0gIHsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIERlZmluaXRpb24gZGVmID0gd3NQYXJzZXJfLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkxfKTsKLSAgICBpZihkZWY9PW51bGwpCi0gICAgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhwbHVnaW5JZF8sIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1NETF9OT19ERUZJTklUSU9OIixuZXcgU3RyaW5nW117d3NkbFVSTF99KSxTdGF0dXMuRVJST1IpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgSVBhdGggY2xpZW50V1NETFBhdGggPSBuZXcgUGF0aChjbGllbnRXU0RMUGF0aE5hbWVfKTsKLSAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpOwotICAgIHN0YXR1cyA9IHJlc29sdmVXU0RMKHdvcmtzcGFjZVJvb3QsIGRlZiwgY2xpZW50V1NETFBhdGgsZW52KTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLQlwcml2YXRlIFN0YXR1cyByZXNvbHZlV1NETCgKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlLAotCQlEZWZpbml0aW9uIHdzZGxEZWYsCi0JCUlQYXRoIHdzZGxQYXRoLAotCQlFbnZpcm9ubWVudCBlbnYpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlV1NETEZpbGUod29ya3NwYWNlLCB3c2RsRGVmLCB3c2RsUGF0aCwgZW52KTsKLQkJCU1hcCBpbXBvcnREZWZzID0gd3NkbERlZi5nZXRJbXBvcnRzKCk7Ci0JCQlTZXQga2V5c1NldCA9IGltcG9ydERlZnMua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGUgPSBrZXlzU2V0Lml0ZXJhdG9yKCk7IGUuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXlOYW1lID0gZS5uZXh0KCk7Ci0JCQkJVmVjdG9yIHZlY3RvciA9IChWZWN0b3IpIGltcG9ydERlZnMuZ2V0KGtleU5hbWUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUltcG9ydCBpbXBvcnREZWYgPSAoSW1wb3J0KSB2ZWN0b3IuZ2V0KGkpOwotCQkJCQlEZWZpbml0aW9uIGRlZiA9IGltcG9ydERlZi5nZXREZWZpbml0aW9uKCk7Ci0JCQkJCVN0cmluZyBuZXdQYXRoU3RyaW5nID0KLQkJCQkJCXdzZGxQYXRoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKAotCQkJCQkJCTAsCi0JCQkJCQkJd3NkbFBhdGgudG9TdHJpbmcoKS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CSAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpc0ludmFsaWRJbXBvcnRXU0RMKGltcG9ydERlZi5nZXRMb2NhdGlvblVSSSgpKSkgewotCQkJCQkgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMocGx1Z2luSWRfLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lNUE9SVF9XU0RMIixuZXcgU3RyaW5nW117aW1wb3J0RGVmLmdldExvY2F0aW9uVVJJKCl9KSwgU3RhdHVzLkVSUk9SKTsKLQkJCQkJfQotCQkJCQlJUGF0aCBuZXdQYXRoID0KLQkJCQkJCW5ldyBQYXRoKG5ld1BhdGhTdHJpbmcgKyBpbXBvcnREZWYuZ2V0TG9jYXRpb25VUkkoKSk7Ci0JCQkJCVN0YXR1cyBzdGF0dXMgPSByZXNvbHZlV1NETCh3b3Jrc3BhY2UsIGRlZiwgbmV3UGF0aCwgZW52KTsKLQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsCi0JCQkJCQkmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHsKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhwbHVnaW5JZF8sIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1JJVEVfV1NETCIsbmV3IFN0cmluZ1tdIHsgd3NkbFBhdGgudG9TdHJpbmcoKSB9KSwgU3RhdHVzLkVSUk9SLCBlKTsKLQkJfQotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW52YWxpZEltcG9ydFdTREwoU3RyaW5nIHdzZGxQYXRoKSB7Ci0KLQkJLy8gcmVsYXRpdmUgdXJsCi0JCWlmICghd3NkbFBhdGgudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJodHRwOi8vIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAod3NkbFBhdGguaW5kZXhPZigiLyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIXdzZGxQYXRoLnN0YXJ0c1dpdGgoIi4vIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlV1NETEZpbGUoCi0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSwKLQkJRGVmaW5pdGlvbiB3c2RsRGVmLAotCQlJUGF0aCB3c2RsUGF0aCwKLQkJRW52aXJvbm1lbnQgZW52KQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJLy9XU0RMRmFjdG9yeSB3c2RsRmFjdG9yeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCS8vV1NETFdyaXRlciB3c2RsV3JpdGVyID0gd3NkbEZhY3RvcnkubmV3V1NETFdyaXRlcigpOwotCQlXU0RMV3JpdGVyIHdzZGxXcml0ZXIgPSAobmV3IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqLldTRExGYWN0b3J5SW1wbCgpKS5uZXdXU0RMV3JpdGVyKCk7Ci0JCXdzZGxXcml0ZXIud3JpdGVXU0RMKHdzZGxEZWYsIGJhb3MpOwotCQlieXRlW10gYiA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKTsKLQotCQlSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9Ci0JCQlXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0JCUZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoCi0JCQljb250ZXh0LAotCQkJd3NkbFBhdGgubWFrZUFic29sdXRlKCksCi0JCQliYWlzLAotCQkJZW52LmdldFByb2dyZXNzTW9uaXRvcigpLAotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKSk7Ci0KLQkJYmFvcy5jbG9zZSgpOwotCQliYWlzLmNsb3NlKCk7Ci0KLQl9ICAKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gY2xpZW50V1NETFBhdGhOYW1lXyBUaGUgY2xpZW50V1NETFBhdGhOYW1lXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRXU0RMUGF0aE5hbWUoU3RyaW5nIGNsaWVudFdTRExQYXRoTmFtZSkKLSAgewotICAgIHRoaXMuY2xpZW50V1NETFBhdGhOYW1lXyA9IGNsaWVudFdTRExQYXRoTmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdzZGxVUkxfIFRoZSB3c2RsVVJMXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJMKFN0cmluZyB3c2RsVVJMKQotICB7Ci0gICAgdGhpcy53c2RsVVJMXyA9IHdzZGxVUkw7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c1BhcnNlcl8gVGhlIHdzUGFyc2VyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3c1BhcnNlcikKLSAgewotICAgIHRoaXMud3NQYXJzZXJfID0gd3NQYXJzZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkOWQzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9jb21tYW5kL0RlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudXRpbC5QbGF0Zm9ybVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXzsKLQlwcml2YXRlIElQcm9qZWN0IHByb3h5UHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgV1NETFNlcnZpY2VVUkxfOwotCXByaXZhdGUgU3RyaW5nIFdTRExTZXJ2aWNlUGF0aG5hbWVfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBjb3JlTXNnVXRpbHNfOwotCXByaXZhdGUgU3RyaW5nIG1vZHVsZU5hbWVfOwotCQotCXByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfQ0xJRU5UX0pBVkFfV1NETF9ERUZBVUxUUyI7Ci0JcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0NMSUVOVF9KQVZBX1dTRExfREVGQVVMVFMiOwotCi0JcHVibGljIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kKCBTdHJpbmcgbW9kdWxlTmFtZSApIHsKLQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsJCQotCQkKLQkJbW9kdWxlTmFtZV8gPSBtb2R1bGVOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuCi0JICovCi0JcHVibGljIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kKAotCQlKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtLAotCQlNb2RlbCBtb2RlbCkgewotCQkvL3N1cGVyKCk7Ci0JCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlTdGF0dXMgc3RhdHVzOwotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgKLQkJCQkiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksCi0JCQkJU3RhdHVzLkVSUk9SKTsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCWphdmFXU0RMUGFyYW1fLnNldE1ldGFJbmZPbmx5KGZhbHNlKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0U2VydmVyU2lkZShKYXZhV1NETFBhcmFtZXRlci5TRVJWRVJfU0lERV9OT05FKTsKLQkJCi0JCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbihwcm94eVByb2plY3RfLCBtb2R1bGVOYW1lXyApOwotCQkvL1N0cmluZyBvdXRwdXQgPSBQbGF0Zm9ybVV0aWxzLmdldFBsYXRmb3JtVVJMKHdlYk1vZHVsZVNlcnZlclJvb3QpOwotCQlTdHJpbmcgb3V0cHV0ID0JUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uod2ViTW9kdWxlU2VydmVyUm9vdCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotLy8JCVN0cmluZyBvdXRwdXQgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRGb2xkZXIod2ViTW9kdWxlU2VydmVyUm9vdCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlqYXZhV1NETFBhcmFtXy5zZXRKYXZhT3V0cHV0KG91dHB1dCk7Ci0KLQotCQlJRm9sZGVyIHdlYk1vZHVsZUNvbnRhaW5lciA9IFJlc291cmNlVXRpbHMuZ2V0V2ViQ29tcG9uZW50U2VydmVyUm9vdChwcm94eVByb2plY3RfLCBtb2R1bGVOYW1lXyk7Ci0JCWlmICh3ZWJNb2R1bGVDb250YWluZXIgIT1udWxsKQotCQl7Ci0JCSAgSVBhdGggd2ViTW9kdWxlUGF0aCA9IHdlYk1vZHVsZUNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotCQkgIC8vb3V0cHV0ID0gIFBsYXRmb3JtVXRpbHMuZ2V0UGxhdGZvcm1VUkwod2ViTW9kdWxlUGF0aCk7Ci0JCSAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdlYk1vZHVsZVBhdGgpOwotCQkgIGlmIChyZXMhPW51bGwpewotCQkJICBvdXRwdXQgPSByZXMuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkgIH0gCi0JCSAgamF2YVdTRExQYXJhbV8uc2V0T3V0cHV0KG91dHB1dCk7Ci0JCX0KLQotCi0JCWlmIChXU0RMU2VydmljZVBhdGhuYW1lXyA9PSBudWxsKSB7Ci0JCQkKLQkJCWlmIChXU0RMU2VydmljZVVSTF8gPT0gbnVsbCkgewotCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkRlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCSJNU0dfRVJST1JfV1NETF9MT0NBVElPTl9OT1RfU0VUIiksCi0JCQkJCVN0YXR1cy5FUlJPUik7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVdTRExTZXJ2aWNlVVJMXyA9IFBsYXRmb3JtVXRpbHMuZ2V0RmlsZUZyb21QbGF0Zm9ybShXU0RMU2VydmljZVBhdGhuYW1lXyk7Ci0JCX0KLQotCQlqYXZhV1NETFBhcmFtXy5zZXRJbnB1dFdzZGxMb2NhdGlvbihXU0RMU2VydmljZVVSTF8pOwotCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGphdmFXU0RMUGFyYW0uCi0JICogQHJldHVybiBKYXZhV1NETFBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotCQlyZXR1cm4gamF2YVdTRExQYXJhbV87Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkJdGhpcy5qYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3h5UHJvamVjdF8gVGhlIHByb3h5UHJvamVjdF8gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3h5UHJvamVjdChJUHJvamVjdCBwcm94eVByb2plY3QpIHsKLQkJdGhpcy5wcm94eVByb2plY3RfID0gcHJveHlQcm9qZWN0OwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2VydmljZVVSTF8gVGhlIHdTRExTZXJ2aWNlVVJMXyB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0V1NETFNlcnZpY2VVUkwoU3RyaW5nIHNlcnZpY2VVUkwpIHsKLQkJV1NETFNlcnZpY2VVUkxfID0gc2VydmljZVVSTDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNlcnZpY2VQYXRobmFtZV8gVGhlIHdTRExTZXJ2aWNlUGF0aG5hbWVfIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXU0RMU2VydmljZVBhdGhuYW1lKFN0cmluZyBzZXJ2aWNlUGF0aG5hbWUpIHsKLQkJV1NETFNlcnZpY2VQYXRobmFtZV8gPSBzZXJ2aWNlUGF0aG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVDb21tYW5kTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVDb21tYW5kTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2UwZmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFQ29tbWFuZE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuZW52OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSjJFRUNvbW1hbmRNYW5hZ2VyIGltcGxlbWVudHMgQ29tbWFuZE1hbmFnZXIKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmRNYW5hZ2VyI2lzVW5kb0VuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotcHVibGljIERhdGFNYXBwaW5nUmVnaXN0cnkgZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkgewotCXJldHVybiBudWxsOwotfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFRW52aXJvbm1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1MzZmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9lbnYvSjJFRUVudmlyb25tZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5lbnY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkphdmFDb21waWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0qCi0qLwotcHVibGljIGNsYXNzIEoyRUVFbnZpcm9ubWVudCBpbXBsZW1lbnRzIEVudmlyb25tZW50Ci17Ci0gIEoyRUVMb2cgajJlZUxvZ187Ci0gIEoyRUVQcm9ncmVzc01vbml0b3IgajJlZVByb2dyZXNzTW9uaXRvcl87Ci0gIEoyRUVTdGF0dXNIYW5kbGVyIGoyZWVTdGF0dXNIYW5kbGVyXzsKLSAgU2ltcGxlVVJJRmFjdG9yeSBzaW1wbGVVUklGYWN0b3J5XzsKLSAgSjJFRUNvbW1hbmRNYW5hZ2VyIGoyZWVDb21tYW5kTWFuYWdlcl87Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldExvZygpCi0gICAqLwotICBwdWJsaWMgTG9nIGdldExvZygpCi0gIHsKLSAgICBpZiAoajJlZUxvZ18gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBqMmVlTG9nXyA9IG5ldyBKMkVFTG9nKCk7Ci0gICAgfQotICAgIHJldHVybiBqMmVlTG9nXzsKLSAgICAKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldFByb2dyZXNzTW9uaXRvcigpCi0gICAqLwotICBwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpCi0gIHsKLSAgICBpZiAoajJlZVByb2dyZXNzTW9uaXRvcl89PW51bGwpCi0gICAgewotICAgICAgajJlZVByb2dyZXNzTW9uaXRvcl8gPSBuZXcgSjJFRVByb2dyZXNzTW9uaXRvcigpOwotICAgICAgCi0gICAgfQotICAgIHJldHVybiBqMmVlUHJvZ3Jlc3NNb25pdG9yXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRTdGF0dXNIYW5kbGVyKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgaWYgKGoyZWVTdGF0dXNIYW5kbGVyXz09bnVsbCkKLSAgICB7Ci0gICAgICBqMmVlU3RhdHVzSGFuZGxlcl8gPSBuZXcgSjJFRVN0YXR1c0hhbmRsZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGoyZWVTdGF0dXNIYW5kbGVyXzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRVUklGYWN0b3J5KCkKLSAgICovCi0gIHB1YmxpYyBVUklGYWN0b3J5IGdldFVSSUZhY3RvcnkoKQotICB7Ci0gICAgaWYgKHNpbXBsZVVSSUZhY3RvcnlfID09IG51bGwpCi0gICAgeyAKLSAgICAgIHNpbXBsZVVSSUZhY3RvcnlfID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNpbXBsZVVSSUZhY3RvcnlfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldEphdmFDb21waWxlcigpCi0gICAqLwotICBwdWJsaWMgSmF2YUNvbXBpbGVyIGdldEphdmFDb21waWxlcigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRDb21tYW5kTWFuYWdlcigpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZE1hbmFnZXIgZ2V0Q29tbWFuZE1hbmFnZXIoKQotICB7Ci0gICAgaWYoajJlZUNvbW1hbmRNYW5hZ2VyXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGoyZWVDb21tYW5kTWFuYWdlcl8gPSBuZXcgSjJFRUNvbW1hbmRNYW5hZ2VyKCk7IAotICAgIH0KLSAgICByZXR1cm4gajJlZUNvbW1hbmRNYW5hZ2VyXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVMb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTQ1NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvZW52L0oyRUVMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuZW52OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSoKLSovCi1wdWJsaWMgY2xhc3MgSjJFRUxvZyBpbXBsZW1lbnRzIExvZwotewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2cjaXNFbmFibGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2lzRW5hYmxlZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChTdHJpbmcgb3B0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwKLQkJCVN0YXR1cyBzdGF0dXMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwKLQkJCVRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIFN0YXR1cyBzdGF0dXMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwKLQkJCVN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9lbnYvSjJFRVByb2dyZXNzTW9uaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWMxNWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmVudjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQGF1dGhvciByc2luaGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFUHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgUHJvZ3Jlc3NNb25pdG9yCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI3JlcG9ydChqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KFN0cmluZyBwcm9ncmVzcykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvciNnZXRDaGlsZFByb2dyZXNzTW9uaXRvcigpCi0gICAqLwotICBwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yIGdldENoaWxkUHJvZ3Jlc3NNb25pdG9yKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvciNpc0NhbmNlbFJlcXVlc3RlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbFJlcXVlc3RlZCgpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS9lbnYvSjJFRVN0YXR1c0hhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFU3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTg5MWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL2Vudi9KMkVFU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5lbnY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEoyRUVTdGF0dXNIYW5kbGVyIGltcGxlbWVudHMgU3RhdHVzSGFuZGxlcgotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXMsIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5DaG9pY2VbXSkKLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0KFN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KFN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8ob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oU3RhdHVzIHN0YXR1cykKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWIyZTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkucGx1Z2luOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0KLQkvKioKLQkqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0JKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9Ci0JCSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0KLQkvKioKLQkqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLQkqLwotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbiBpbnN0YW5jZV87Ci0JcHJpdmF0ZSBMb2cgbG9nXzsKLQotCS8qKgotCSogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uCi0JKiBUaGUgInBsdWdpbiIgZWxlbWVudCBpbiBwbHVnaW4ueG1sIHNob3VsZCBpbmNsdWRlIHRoZSBhdHRyaWJ1dGUKLQkqIGNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbiIuCi0JKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbi4KLQkqLwotCXB1YmxpYyBXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcihkZXNjcmlwdG9yKTsKLQkJaWYgKGluc3RhbmNlXyA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZV8gPSB0aGlzOwotCQl9Ci0JCWxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotCi0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotCSogKFdlYlNlcnZpY2VXYXNDb25zdW1wdGlvblBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC53cy53YXMudjUudHAiKTsKLQkqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VXYXNDb25zdW1wdGlvblBsdWdpbiBzaW5nbGV0b24uCi0JKi8KLQlzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VBeGlzQ29uc3VtcHRpb25VSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlXzsKLQl9Ci0KLQkvKioKLQkqIENhbGxlZCBvbmNlIGJ5IHRoZSBwbGF0Zm9ybSB3aGVuIHRoaXMgcGx1Z2luIGlzIGZpcnN0IGxvYWRlZC4KLQkqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBJZiB0aGlzIHBsdWdpbiBmYWlscyB0byBzdGFydC4KLQkqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvZ18ubG9nKExvZy5JTkZPLCA1MDY2LCB0aGlzLCAic3RhcnR1cCIsICJTdGFydGluZyBwbHVnaW4gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiKTsKLQkJc3VwZXIuc3RhcnR1cCgpOwotCX0KLQotCS8qKgotCSogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgdW5sb2FkZWQuCi0JKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc2h1dGRvd24uCi0JKi8KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbG9nXy5sb2coTG9nLklORk8sIDUwNjcsIHRoaXMsICJzaHV0ZG93biIsICJTaHV0dGluZyBwbHVnaW4gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiKTsKLQkJc3VwZXIuc2h1dGRvd24oKTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0JKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLQkqIEBwYXJhbSBrZXkgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuCi0JKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotCSogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotCSogZm9ybTogIktFWSA9IHZhbHVlIi4KLQkqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBpbnN0YW5jZV8uZ2V0RGVzY3JpcHRvcigpLmdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotCSogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0JKiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotCSogYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2gKLQkqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBmb3IKLQkqIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0JKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotCSogVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIKLQkqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLQkqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0JKiBAcGFyYW0gYXJncyBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UKLQkqIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZAotCSogYnkgdGhlIHJ1bGVzIG9mIGNsYXNzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgotCSogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSwgYXJncyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gUGxhdGZvcm0KLQkJCS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKHRoaXMpCi0JCQkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKQotCQkJLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCkpLmdldEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmI1Y2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2s7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfSkFSU19UT19QUk9KRUNUIjsKLQlwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0pBUlNfVE9fUFJPSkVDVCI7Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdF87Ci0JcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBvbGRDbGFzc3BhdGhfOwotCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoXzsKLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCXByaXZhdGUgYm9vbGVhbiBpc0oyRUVfMTMgPSB0cnVlOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgbW9kdWxlXzsKLQotCXB1YmxpYyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzaygpCi0JICB7Ci0JCQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotCQkJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JCQlzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQkJc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJbW9kdWxlXyA9IEoyRUVVdGlscy5nZXRGaXJzdFdlYk1vZHVsZU5hbWUocHJvamVjdCk7Ci0JCX0KLQkKLQlwdWJsaWMgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soU3RyaW5nIG1vZHVsZSkKLSAgewotCQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotCQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQkJc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQltb2R1bGVfID0gbW9kdWxlOwotCX0KLQotCS8qKgotCSogRXhlY3V0ZSBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotCSovCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotLy8JCXRyeSB7Ci0vLwkJCWlmIChwcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkgewotLy8JCQkJSjJFRVdlYk5hdHVyZVJ1bnRpbWUgd2ViTmF0dXJlUnVudGltZSA9Ci0vLwkJCQkJKEoyRUVXZWJOYXR1cmVSdW50aW1lKSBwcm9qZWN0LmdldE5hdHVyZSgKLS8vCQkJCQkJSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0vLwkJCQlpc0oyRUVfMTMgPSB3ZWJOYXR1cmVSdW50aW1lLmlzSjJFRTFfMygpOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQl9Ci0vLyAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0vLwkJaWYgKCFpc0oyRUVfMTMpCi0vLwkJewotLy8JCS8vCUFkZEphcihwcm9qZWN0LCBudWxsLCAiWEVSQ0VTX0FQSV9KQVIiLCBzdGF0dXMsIGVudmlyb25tZW50KTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHN0YXR1czsKLQkJCi0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLS8vCQkgVE9ETzogd29ya2Fyb3VuZCBmb3IgOTA1MTUgCi0JCS8vCi0JCSAgIC8vIEdldCB0aGUgY3VycmVudCBjbGFzc3BhdGguCi0JCSAgIC8vCi0JCSAgIGphdmFQcm9qZWN0XyA9IG51bGw7Ci0JCSAgIG9sZENsYXNzcGF0aF8gPSBudWxsOwotCQkgICB0cnkKLQkJICAgeyAgICAKLQkJCSBqYXZhUHJvamVjdF8gPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7ICAgIAotCQkJIGlmIChqYXZhUHJvamVjdF8gIT0gbnVsbCkKLQkJCSB7Ci0JCQkgICBvbGRDbGFzc3BhdGhfID0gamF2YVByb2plY3RfLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJIH0KLQkJCSBlbHNlCi0JCQkgewotCQkJICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX05PX0pBVkFfTkFUVVJFIiksIFN0YXR1cy5FUlJPUik7CQotCQkJICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJICAgcmV0dXJuIHN0YXR1czsKLQkJCSB9Ci0JCSAgIH0KLQkJICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQotCQkgICB7Ci0JCQkgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fTk9fSkFWQV9OQVRVUkUiKSwgU3RhdHVzLkVSUk9SKTsKLQkJCSAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCSAgIHJldHVybiBzdGF0dXM7CSAgIAkKLQkJICAgfQotCi0KLQkJCXRyeSB7Ci0JCQkJCi0JCQkJQXJyYXlMaXN0IGFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVN0cmluZyBjbGFzc3BhdGhFbnRyeSA9IG51bGw7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgbW9kdWxlXyk7Ci0JCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJCQotCQkJCQlJVmlydHVhbEZvbGRlciB3ZWJJbmZMaWIgPSBjb21wb25lbnQuZ2V0Rm9sZGVyKG5ldyBQYXRoKAotCQkJCQkJCSIvV0VCLUlORi9saWIiKSk7Ci0JCQkJCWlmICh3ZWJJbmZMaWIgIT0gbnVsbCkgewotCQkJCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IHdlYkluZkxpYi5tZW1iZXJzKCk7Ci0JCQkJCQlJUmVzb3VyY2UgYVJlc291cmNlID0gbnVsbDsKLQkJCQkJCQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlhUmVzb3VyY2UgPSByZXNvdXJjZXNbaV0uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQkJCQkJY2xhc3NwYXRoRW50cnkgPSBhUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCQkJCWlmICghRm91bmRDbGFzc3BhdGhFbnRyeShjbGFzc3BhdGhFbnRyeSkpIHsKLQkJCQkJCQkJYUxpc3QuYWRkKGNsYXNzcGF0aEVudHJ5KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaW50IG5ld0xpc3RTaXplID0gYUxpc3Quc2l6ZSgpOwotCQkJCQotCQkJCWlmIChuZXdMaXN0U2l6ZSA9PSAwKSB7Ci0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJCQotCQkJCS8vIFVwZGF0ZSBjbGFzc3BhdGgKLQkJCQluZXdDbGFzc3BhdGhfID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDbGFzc3BhdGhfLmxlbmd0aCArIG5ld0xpc3RTaXplXTsKLQkJCQlJdGVyYXRvciBpdGVyID0gYUxpc3QuaXRlcmF0b3IoKTsKLQkJCi0JCQkJaW50IGo9MDsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJbmV3Q2xhc3NwYXRoX1tqXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aCgoU3RyaW5nKWl0ZXIubmV4dCgpKSwgbnVsbCwgbnVsbCk7Ci0JCQkJCWorKzsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaT0wOyBpPG9sZENsYXNzcGF0aF8ubGVuZ3RoOyBpKyspIHsKLQkJCQkJbmV3Q2xhc3NwYXRoX1tqK2ldID0gb2xkQ2xhc3NwYXRoX1tpXTsKLQkJCQl9Ci0gCi0JCQkgICAJIFByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gZW52LmdldFByb2dyZXNzTW9uaXRvcigpOwotCQkJICAgCSBJUHJvZ3Jlc3NNb25pdG9yIGVjbGlwc2VNb25pdG9yID0gbnVsbDsKLQkJCSAgIAkgaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKQotCQkJICAgCSB7Ci0JCQkgICAJIAllY2xpcHNlTW9uaXRvciA9ICgoRWNsaXBzZVByb2dyZXNzTW9uaXRvciltb25pdG9yKS5nZXRNb25pdG9yKCk7Ci0JCQkgICAJIH0KLQkJCQkgamF2YVByb2plY3RfLnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGhfLGVjbGlwc2VNb25pdG9yKTsKLQkJCX0KLQkJCSAgIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkKLQkJCSAgIHsKLQkJCQkgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9CQURfQlVJTERQQVRIIiksIFN0YXR1cy5XQVJOSU5HLCBlKTsKLQkJCQkgdHJ5Ci0JCQkJIHsKLQkJCQkgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7CQotCQkJCSB9Ci0JCQkJIGNhdGNoKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLQkJCQkgewotCQkJCSAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgIlVzZXIgYWJvcnRlZCIsIFN0YXR1cy5FUlJPUik7Ci0JCQkJIH0KLQkJCSAgIH0KLQkJCSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0vLwkJCSBlbmQgb2Ygd29ya2Fyb3VuZAotCQkJcmV0dXJuIHN0YXR1czsKLQkJfSAgCi0JCSAgIAotCi0JCXByaXZhdGUgYm9vbGVhbiBGb3VuZENsYXNzcGF0aEVudHJ5KFN0cmluZyBjbGFzc3BhdGhFbnRyeSkgIHsKLQkJCSAgIAotCi0JCQkgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkgICBmb3IgKGludCBpPTA7IGk8b2xkQ2xhc3NwYXRoXy5sZW5ndGggJiYgIWZvdW5kOyBpKyspCi0JCQkgICB7Ci0JCQkJIGlmIChvbGRDbGFzc3BhdGhfW2ldLmdldFBhdGgoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGNsYXNzcGF0aEVudHJ5LnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCSBmb3VuZD10cnVlOwotCQkJCSB9Ci0JCQkgICB9Ci0JCSAgIAkgcmV0dXJuIGZvdW5kOwotCQl9Ci0KLQlwcml2YXRlIHZvaWQgQWRkSmFyKElQcm9qZWN0IHdlYlByb2plY3QsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGphck5hbWUsIFN0YXR1cyBzdGF0dXMsIEVudmlyb25tZW50IGVudikgIHsKLQkgICAvLwotCSAgIC8vIEdldCB0aGUgY3VycmVudCBjbGFzc3BhdGguCi0JICAgLy8KLQkgICBqYXZhUHJvamVjdF8gPSBudWxsOwotCSAgIG9sZENsYXNzcGF0aF8gPSBudWxsOwotCSAgIHRyeQotCSAgIHsgICAgCi0JCSBqYXZhUHJvamVjdF8gPSBKYXZhQ29yZS5jcmVhdGUod2ViUHJvamVjdCk7ICAgIAotCQkgaWYgKGphdmFQcm9qZWN0XyAhPSBudWxsKQotCQkgewotCQkgICBvbGRDbGFzc3BhdGhfID0gamF2YVByb2plY3RfLmdldFJhd0NsYXNzcGF0aCgpOwotCQkgfQotCQkgZWxzZQotCQkgewotCQkgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fTk9fSkFWQV9OQVRVUkUiKSwgU3RhdHVzLkVSUk9SKTsJCi0JCSAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICAgcmV0dXJuOwotCQkgfQotCSAgIH0KLQkgICBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpCi0JICAgewotCQkgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fTk9fSkFWQV9OQVRVUkUiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICByZXR1cm47CSAgIAkKLQkgICB9Ci0KLQkgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JICAgZm9yIChpbnQgaT0wOyBpPG9sZENsYXNzcGF0aF8ubGVuZ3RoOyBpKyspCi0JICAgewotCQkgZm91bmQgPSBmb3VuZCB8fCBvbGRDbGFzc3BhdGhfW2ldLmdldFBhdGgoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoamFyTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkgICB9Ci0KLQkgICBpZiAoZm91bmQpIAotCSAgIHsKLQkJIHJldHVybjsKLQkgICB9Ci0KLQkgICBuZXdDbGFzc3BhdGhfID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDbGFzc3BhdGhfLmxlbmd0aCArIDFdOwotCSAgIGludCBpPTA7Ci0JICAgd2hpbGUgKGk8b2xkQ2xhc3NwYXRoXy5sZW5ndGgpCi0JICAgewotCQkgbmV3Q2xhc3NwYXRoX1tpXSA9IG9sZENsYXNzcGF0aF9baV07Ci0JCSBpKys7Ci0JICAgfQotCi0JICAgdHJ5Ci0JICAgewotCQkgaWYocGx1Z2luSWQhPW51bGwpCi0JCSB7Ci0JCSAgIG5ld0NsYXNzcGF0aF9baSsrXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShnZXRUaGVKYXJQYXRoKHBsdWdpbklkLGphck5hbWUpLCBudWxsLCBudWxsKTsKLQkJIH0KLQkJIGVsc2UKLQkJIHsKLQkJICAgbmV3Q2xhc3NwYXRoX1tpKytdID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShnZXRUaGVKYXJQYXRoKHBsdWdpbklkLGphck5hbWUpLCBudWxsLCBudWxsKTsKLQkJIH0KLQkgICB9Ci0JICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkgICB7Ci0JCSBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0JBRF9CVUlMRFBBVEgiKSwgU3RhdHVzLldBUk5JTkcsIGUpOwotCQkgdHJ5Ci0JCSB7Ci0JCSAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLQkJIH0KLQkJIGNhdGNoKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLQkJIHsKLQkJIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCJVc2VyIGFib3J0ZWQiLFN0YXR1cy5FUlJPUik7Ci0JCSB9Ci0JCSByZXR1cm47Ci0JICAgfQotCi0JICAgLy8KLQkgICAvLyBUaGVuIHVwZGF0ZSB0aGUgcHJvamVjdCBjbGFzc3BhdGguCi0JICAgLy8KLQkgICB0cnkKLQkgICB7Ci0JICAgCSBQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGVudi5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQkgICAJIElQcm9ncmVzc01vbml0b3IgZWNsaXBzZU1vbml0b3IgPSBudWxsOwotCSAgIAkgaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKQotCSAgIAkgewotCSAgIAkgCWVjbGlwc2VNb25pdG9yID0gKChFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKW1vbml0b3IpLmdldE1vbml0b3IoKTsKLQkgICAJIH0KLQkJIGphdmFQcm9qZWN0Xy5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoXyxlY2xpcHNlTW9uaXRvcik7Ci0JICAgfQotCSAgIGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkKLQkgICB7Ci0JCSBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0JBRF9CVUlMRFBBVEgiKSwgU3RhdHVzLldBUk5JTkcsIGUpOwotCQkgdHJ5Ci0JCSB7Ci0JCSAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsJCi0JCSB9Ci0JCSBjYXRjaChTdGF0dXNFeGNlcHRpb24gc2UpCi0JCSB7Ci0JCSAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgIlVzZXIgYWJvcnRlZCIsIFN0YXR1cy5FUlJPUik7Ci0JCSB9Ci0JCSByZXR1cm47Ci0JICAgfQotCSB9Ci0KLQkvLwotCS8vIFJldHVybnMgdGhlIGxvY2FsIG5hdGl2ZSBwYXRobmFtZSBvZiB0aGUgamFyLgotCS8vCi0JcHJpdmF0ZSBJUGF0aCBnZXRUaGVKYXJQYXRoKFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIHRoZUphcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHBsdWdpbklkICE9IG51bGwpIHsKLQkJCQlJUGx1Z2luUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQkJCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPQotCQkJCQlwbHVnaW5SZWdpc3RyeS5nZXRQbHVnaW5EZXNjcmlwdG9yKHBsdWdpbklkKTsKLQkJCQlVUkwgbG9jYWxVUkwgPQotCQkJCQlQbGF0Zm9ybS5hc0xvY2FsVVJMKAotCQkJCQkJbmV3IFVSTChwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSwgdGhlSmFyKSk7Ci0JCQkJcmV0dXJuIG5ldyBQYXRoKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgUGF0aCh0aGVKYXIpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMoCi0JCQkJCUlTdGF0dXMuV0FSTklORywKLQkJCQkJV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luLklELAotCQkJCQkwLAotCQkJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0JBRF9BWElTX0pBUl9VUkwiKSwKLQkJCQkJZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQluZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cygKLQkJCQkJSVN0YXR1cy5XQVJOSU5HLAotCQkJCQlXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4uSUQsCi0JCQkJCTAsCi0JCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfQkFEX0FYSVNfSkFSX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0JewotCSAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0NoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWRkMTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQkKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQlwcml2YXRlIElQcm9qZWN0IHNlcnZlclByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgICBtb2R1bGVOYW1lXzsKLSAgICAKLSAgcHVibGljIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2soIFN0cmluZyBtb2R1bGVOYW1lICkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJDSEVDS19XU19ERF9UQVNLX0RFU0NSSVBUSU9OIikpOwotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkNIRUNLX1dTX0REX1RBU0tfTEFCRUwiKSk7Ci0JCi0JbW9kdWxlTmFtZV8gPSBtb2R1bGVOYW1lOwotICB9Ci0JCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLQkJaWYoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KS5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKSB7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkgIElQYXRoICAgIGZpbGVQYXRoID0gbnVsbDsKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotCSAgCSAgCi0KLSAgICAgIGZpbGVQYXRoID0gSjJFRVV0aWxzLmdldFdlYkluZlBhdGgoIHByb2plY3QsIG1vZHVsZU5hbWVfICk7Ci0gICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLmFwcGVuZCgiL3NlcnZlci1jb25maWcud3NkZCIpOwotCi0JICBpZihmaWxlUGF0aD09bnVsbCB8fCBmaWxlUGF0aC5pc0VtcHR5KCkpCi0JCXsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIGNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwkJCQotCQl9Ci0KLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCWlmIChmaWxlLmV4aXN0cygpICYmICFFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkpICAgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9YTUxfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiKSwgU3RhdHVzLldBUk5JTkcpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLQkJCX0KLQkJCWNhdGNoKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLQkJCXsKLQkJCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCAiVXNlciBhYm9ydGVkIixTdGF0dXMuRVJST1IpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0KQotCXsKLQkgIHRoaXMuc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9Db3B5QXhpc0phckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svQ29weUF4aXNKYXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwY2M2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9Db3B5QXhpc0phckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2s7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ29weUF4aXNKYXJDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQVhJU19SVU5USU1FX1BMVUdJTl9JRCA9ICJvcmcuYXBhY2hlLmF4aXMxMSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBKQVJMSVNUID0gbmV3IFN0cmluZ1tdIHsKLQkgICJheGlzLWFudC5qYXIiLAotCSAgImF4aXMuamFyIiwKLQkgICJjb21tb25zLWRpc2NvdmVyeS5qYXIiLAotCSAgImNvbW1vbnMtbG9nZ2luZy5qYXIiLAotCSAgImpheHJwYy5qYXIiLAotCSAgImxvZzRqLTEuMi44LmphciIsCi0JICAic2Fhai5qYXIiLAotCSAgIndzZGw0ai5qYXIiCi0JICAKLSAgfTsKLQotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfQ09QWV9KQVJTX1RPX1BST0pFQ1QiOwotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0NPUFlfSkFSU19UT19QUk9KRUNUIjsKLQotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIGJhc2VDb25Nc2dVdGlsc187Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgcHJpdmF0ZSBCb29sZWFuIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfID0gQm9vbGVhbi5GQUxTRTsKLSAgcHJpdmF0ZSBTdHJpbmcgIG1vZHVsZU5hbWVfOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1I7Ci0gICAqLwotICBwdWJsaWMgQ29weUF4aXNKYXJDb21tYW5kKCBTdHJpbmcgbW9kdWxlTmFtZSApIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIGJhc2VDb25Nc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkKLQltb2R1bGVOYW1lXyA9IG1vZHVsZU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQUk9HUkVTU19JTkZPX0NPUFlfQVhJU19DRkciKSk7Ci0gICAgY29weUF4aXNKYXJzVG9Qcm9qZWN0KHByb2plY3QsIHN0YXR1cywgZW52KTsKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weUF4aXNKYXJzVG9Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0YXR1cyBzdGF0dXMsIEVudmlyb25tZW50IGVudikgewotLy8gICAgSVBhdGggd2ViTW9kdWxlUGF0aCA9IFJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KS5nZXRGdWxsUGF0aCgpOwotCUlQYXRoIHdlYk1vZHVsZVBhdGggPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgoIHByb2plY3QsIG1vZHVsZU5hbWVfICk7Ci0gICAgaWYgKHdlYk1vZHVsZVBhdGggPT0gbnVsbCkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgYmFzZUNvbk1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9OT1RfRk9VTkQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0JCi0JZm9yIChpbnQgaT0wOyBpPEpBUkxJU1QubGVuZ3RoOyApIHsKLQkJY29weUlGaWxlKCJsaWIvIitKQVJMSVNUW2ldLCB3ZWJNb2R1bGVQYXRoLCAiV0VCLUlORi9saWIvIitKQVJMSVNUW2krK10sIHN0YXR1cywgZW52KTsgCi0JICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0JICAgICAgcmV0dXJuOwotCX0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvKioKLSAgICogIAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNvcHlJRmlsZShTdHJpbmcgc291cmNlLCBJUGF0aCB0YXJnZXRQYXRoLCBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RhdHVzIHN0YXR1cywgRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgSVBhdGggdGFyZ2V0ID0gdGFyZ2V0UGF0aC5hcHBlbmQobmV3IFBhdGgodGFyZ2V0RmlsZSkpOwotICAgIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKS5yZXBvcnQoYmFzZUNvbk1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQUk9HUkVTU19JTkZPX0NPUFlJTkdfRklMRSIpKTsKLQotICAgIHRyeSB7Ci0gICAgICBSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IG5ldyBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICAgIGNvbnRleHQuc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKHRydWUpOwotICAgICAgY29udGV4dC5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZCh0cnVlKTsKLSAgICAgIGNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICBJUGx1Z2luUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotICAgICAgSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IHBsdWdpblJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3IoQVhJU19SVU5USU1FX1BMVUdJTl9JRCk7Ci0gICAgICBQbHVnaW4gYXhpc3J0X3BsdWdpbiA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0UGx1Z2luKCk7Ci0gICAgICBJRmlsZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZpbGUodGFyZ2V0KTsKLSAgICAgIGlmICghcmVzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgSUZpbGUgZmlsZSA9IEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoY29udGV4dCwgdGFyZ2V0LCBheGlzcnRfcGx1Z2luLm9wZW5TdHJlYW0obmV3IFBhdGgoc291cmNlKSksIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKSwgZW52Ci0gICAgICAgICAgICAuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLSAgICAgICAgaWYgKHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfLmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlICYmIGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICBwcm9qZWN0UmVzdGFydFJlcXVpcmVkXyA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GSUxFQ09QWSIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFByb2plY3RSZXN0YXJ0UmVxdWlyZWQoKSB7Ci0gICAgcmV0dXJuIHByb2plY3RSZXN0YXJ0UmVxdWlyZWRfLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL0RlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZiN2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLkRpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3c2RsU2VydmljZVVSTDsKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotICBwcml2YXRlIE1vZGVsIG1vZGVsOwotCi0gIHB1YmxpYyBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5EZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICAvL1dlYlNlcnZpY2VFbGVtZW50IHdzZSA9IFdlYlNlcnZpY2VFbGVtZW50LmdldFdlYlNlcnZpY2VFbGVtZW50KG1vZGVsKTsKLSAgICAvL3NldFdlYlNlcnZpY2VzUGFyc2VyKChXZWJTZXJ2aWNlc1BhcnNlcil3c2UuZ2V0V1NQYXJzZXIoKSk7Ci0gICAgLy9zZXRXc2RsU2VydmljZVVSTCh3c2UuZ2V0V1NETFNlcnZpY2VVUkwoKSk7Ci0gICAgLy9pZiAod3NkbFNlcnZpY2VVUkwgPT0gbnVsbCB8fCB3c2RsU2VydmljZVVSTC5sZW5ndGgoKSA8PSAwKQotICAgIC8vICBzZXRXc2RsU2VydmljZVVSTCgobmV3IFV0aWxzKCkpLnRvRmlsZVN5c3RlbVVSSSh3c2UuZ2V0V1NETFNlcnZpY2VQYXRobmFtZSgpKSk7Ci0gICAgCi0gICAgaWYgKHdzZGxTZXJ2aWNlVVJMICE9IG51bGwgJiYgd3NkbFNlcnZpY2VVUkwubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGlmICh3ZWJTZXJ2aWNlc1BhcnNlciA9PSBudWxsKQotICAgICAgewotICAgICAgICB3ZWJTZXJ2aWNlc1BhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAgICAgICAvL3dzZS5zZXRXU1BhcnNlcih3ZWJTZXJ2aWNlc1BhcnNlcik7Ci0gICAgICB9Ci0gICAgICBXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5ID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzZGxTZXJ2aWNlVVJMKTsKLSAgICAgIGlmICh3c0VudGl0eSA9PSBudWxsIHx8ICF3c0VudGl0eS5pc0VudGl0eVJlc29sdmVkKCkpCi0gICAgICB7Ci0gICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnNldFVSSSh3c2RsU2VydmljZVVSTCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgd2ViU2VydmljZXNQYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfTk9ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlKQotICAgICAgICB7Ci0gICAgICAgICAgRGlhbG9nV1dXQXV0aGVudGljYXRpb24gZGlhbG9nID0gbmV3IERpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgZGlhbG9nLmhhbmRsZVdXV0F1dGhlbnRpY2F0aW9uKHd3d2FlKTsKLSAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBkaWFsb2cuZ2V0VXNlcm5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBkaWFsb2cuZ2V0UGFzc3dvcmQoKTsKLSAgICAgICAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCAmJiBwYXNzd29yZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZSh1c2VybmFtZSk7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlc1BhcnNlci5zZXRIVFRQQmFzaWNBdXRoUGFzc3dvcmQocGFzc3dvcmQpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHdlYlNlcnZpY2VzUGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX05PTkUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2ViU2VydmljZXNQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFVzZXJuYW1lKG51bGwpOwotICAgICAgICAgICAgd2ViU2VydmljZXNQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKG51bGwpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICB3c0VudGl0eSA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c2RsU2VydmljZVVSTCk7Ci0gICAgICB9Ci0gICAgICBpZiAod3NFbnRpdHkgIT0gbnVsbCAmJiB3c0VudGl0eS5nZXRUeXBlKCkgPT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBodHRwVXNlcm5hbWUgPSB3c0VudGl0eS5nZXRIVFRQVXNlcm5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGh0dHBQYXNzd29yZCA9IHdzRW50aXR5LmdldEhUVFBQYXNzd29yZCgpOwotICAgICAgICBpZiAoaHR0cFVzZXJuYW1lICE9IG51bGwgJiYgaHR0cFBhc3N3b3JkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBqYXZhV1NETFBhcmFtLnNldEhUVFBVc2VybmFtZShodHRwVXNlcm5hbWUpOwotICAgICAgICAgIGphdmFXU0RMUGFyYW0uc2V0SFRUUFBhc3N3b3JkKGh0dHBQYXNzd29yZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLSAgICB0aGlzLmphdmFXU0RMUGFyYW0gPSBqYXZhV1NETFBhcmFtOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9kZWwoTW9kZWwgbW9kZWwpIHsKLSAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzZGxTZXJ2aWNlVVJMIFRoZSB3c2RsU2VydmljZVVSTCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc2RsU2VydmljZVVSTChTdHJpbmcgd3NkbFNlcnZpY2VVUkwpIHsKLSAgICB0aGlzLndzZGxTZXJ2aWNlVVJMID0gd3NkbFNlcnZpY2VVUkw7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgotICAgKi8KLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0gICAgcmV0dXJuIGphdmFXU0RMUGFyYW07Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpIHsKLSAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyIFRoZSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1JlZnJlc2hQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9SZWZyZXNoUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NWMwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1JlZnJlc2hQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXNDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotcHVibGljIGNsYXNzIFJlZnJlc2hQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9SRUZFU0hfUFJPSkVDVCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19SRUZFU0hfUFJPSkVDVCI7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotCXB1YmxpYyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKQotCXsKLQkJbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLnBsdWdpbiIsIHRoaXMgKTsKLQkJc2V0TmFtZSggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIExBQkVMICkgKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBERVNDUklQVElPTiApKTsKLQl9Ci0KLQkvKioKLQkqIEV4ZWN1dGUgUmVmcmVzaFByb2plY3RUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCXsKLQkJdHJ5Ci0JCXsKLQkJCWlmIChwcm9qZWN0IT1udWxsKQotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVByb2plY3QuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCXsKLQkJICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUkVGUkVTSF9QUk9KRUNUIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1N0dWIyQmVhbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2JhOGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS51dGlsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTdHViMkJlYW5Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotICBwcml2YXRlIFN0cmluZyBkaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZTsKLSAgcHJpdmF0ZSBWZWN0b3IgcG9ydFR5cGVzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJveHlCZWFuXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIG1vZHVsZV8gPSAiIjsKLSAgCi0gIHByaXZhdGUgSVByb2plY3QgY2xpZW50UHJvamVjdF87Ci0KLSAgcHVibGljIFN0dWIyQmVhbkNvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy53YXMuY3JlYXRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy53YXMuY3JlYXRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kIik7Ci0gICAgcG9ydFR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIFN0dWIyQmVhbkNvbW1hbmQoU3RyaW5nIG1vZHVsZU5hbWUpewotCSAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy53YXMuY3JlYXRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy53YXMuY3JlYXRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kIik7Ci0JICBwb3J0VHlwZXNfID0gbmV3IFZlY3RvcigpOwkgIAotCSAgbW9kdWxlXyA9IG1vZHVsZU5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBFeGVjdXRlCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsgICAgICAgIAotICAgIFN0cmluZyBpbnB1dFdzZGxMb2NhdGlvbiA9IGphdmFXU0RMUGFyYW1fLmdldElucHV0V3NkbExvY2F0aW9uKCk7Ci0gICAgRGVmaW5pdGlvbiBkZWYgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbihpbnB1dFdzZGxMb2NhdGlvbik7Ci0gICAgLyoKLSAgICAqIEhhY2s6IEF4aXMgaXMgbm90IHVzaW5nIGEgcHJvcGVyIGphdmEubmV0LlVSTCBhcyBpdHMgaW5wdXRXc2RsTG9jYXRpb24uCi0gICAgKiBXZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gYSBwcm9wZXIgZmlsZSBVUkwuCi0gICAgKi8KLSAgICBpZiAoZGVmID09IG51bGwpCi0gICAgewotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoaW5wdXRXc2RsTG9jYXRpb24pOwotICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZGVmID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24oZmlsZS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBNYXAgcGtnMm5zTWFwcGluZyA9IGphdmFXU0RMUGFyYW1fLmdldE1hcHBpbmdzKCk7Ci0gICAgTWFwIHNlcnZpY2VzID0gZGVmLmdldFNlcnZpY2VzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpaXQubmV4dCgpOwotICAgICAgU3RyaW5nIHNlcnZpY2VQa2dOYW1lID0gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lKHNlcnZpY2UsIHBrZzJuc01hcHBpbmcpOwotICAgICAgU3RyaW5nIHNlcnZpY2VDbGFzc05hbWUgPSBjb21wdXRlQ2xhc3NOYW1lKHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICBTdHJpbmcgam5kaU5hbWUgPSBzZXJ2aWNlQ2xhc3NOYW1lOwotICAgICAgTWFwIHBvcnRzID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlcnZpY2VDbGFzc05hbWUuZXF1YWxzKGNvbXB1dGVDbGFzc05hbWUoKChQb3J0KWl0Mi5uZXh0KCkpLmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKSkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZpY2VDbGFzc05hbWUgPSBzZXJ2aWNlQ2xhc3NOYW1lICsgIl9TZXJ2aWNlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpaXQyLm5leHQoKTsKLSAgICAgICAgaWYgKGRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lICE9IG51bGwgJiYgIWRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lLmVxdWFscyhwb3J0LmdldE5hbWUoKSkpCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MyA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOyBpdDMuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQzLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc29hcEFkZHJlc3MgPSAoU09BUEFkZHJlc3Mpb2JqZWN0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNvYXBBZGRyZXNzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgUU5hbWUgcG9ydFR5cGVRTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIHBvcnRUeXBlSUQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgcG9ydFR5cGVJRC5hcHBlbmQocG9ydFR5cGVRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgcG9ydFR5cGVJRC5hcHBlbmQoIiMiKTsKLSAgICAgICAgICBwb3J0VHlwZUlELmFwcGVuZChwb3J0VHlwZVFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICBpZiAoIXBvcnRUeXBlc18uY29udGFpbnMocG9ydFR5cGVJRC50b1N0cmluZygpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwb3J0VHlwZXNfLmFkZChwb3J0VHlwZUlELnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgU3R1YjJCZWFuSW5mbyBzdHViMkJlYW5JbmZvID0gbmV3IFN0dWIyQmVhbkluZm8oKTsKLSAgICAgICAgICAgIHN0dWIyQmVhbkluZm8uc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0Xyk7Ci0gICAgICAgICAgICBzdHViMkJlYW5JbmZvLnNldENsaWVudE1vZHVsZU5hbWUobW9kdWxlXyk7Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydFR5cGVQa2dOYW1lID0gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lKHBvcnRUeXBlLCBwa2cybnNNYXBwaW5nKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZUNsYXNzTmFtZSA9IGNvbXB1dGVDbGFzc05hbWUocG9ydFR5cGVRTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICBzdHViMkJlYW5JbmZvLnNldFBhY2thZ2UocG9ydFR5cGVQa2dOYW1lKTsKLSAgICAgICAgICAgIHN0dWIyQmVhbkluZm8uc2V0Q2xhc3MocG9ydFR5cGVDbGFzc05hbWUgKyAiUHJveHkiKTsKLSAgICAgICAgICAgIHByb3h5QmVhbl8gPSBwb3J0VHlwZVBrZ05hbWUrIi4iK3BvcnRUeXBlQ2xhc3NOYW1lKyJQcm94eSI7Ci0gICAgICAgICAgICBpZiAoam5kaU5hbWUuZXF1YWxzKHBvcnRUeXBlQ2xhc3NOYW1lKSkKLSAgICAgICAgICAgICAgcG9ydFR5cGVDbGFzc05hbWUgPSBwb3J0VHlwZUNsYXNzTmFtZSArICJfUG9ydCI7Ci0gICAgICAgICAgICBzdHViMkJlYW5JbmZvLmFkZFNFSShwb3J0VHlwZVBrZ05hbWUsIHBvcnRUeXBlQ2xhc3NOYW1lLCBzZXJ2aWNlUGtnTmFtZSwgc2VydmljZUNsYXNzTmFtZSwgam5kaU5hbWUsIHBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHN0dWIyQmVhbkluZm8ud3JpdGUoIGVudi5nZXRQcm9ncmVzc01vbml0b3IoKSwgZW52LmdldFN0YXR1c0hhbmRsZXIoKSApOwotICAgICAgICAgICAgICBpZiAoZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkaXNjb3ZlcmVkIHBvcnQgd2FzIHByb2Nlc3NlZC4gSWdub3JlIGFsbCBvdGhlciBwb3J0cyBhbmQgc2VydmljZXMuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIFVOREVSU0NPUkUgPSAnXyc7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZUNvcHkgPSBjbGFzc05hbWU7Ci0gICAgaW50IGkgPSBjbGFzc05hbWVDb3B5LmluZGV4T2YoVU5ERVJTQ09SRSk7Ci0gICAgd2hpbGUgKGkgIT0gLTEpCi0gICAgewotICAgICAgY2hhciBjID0gY2xhc3NOYW1lQ29weS5jaGFyQXQoaSsxKTsKLSAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKGNsYXNzTmFtZUNvcHkuc3Vic3RyaW5nKDAsIGkrMSkpOwotICAgICAgICBzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLSAgICAgICAgc2IuYXBwZW5kKGNsYXNzTmFtZUNvcHkuc3Vic3RyaW5nKGkrMiwgY2xhc3NOYW1lQ29weS5sZW5ndGgoKSkpOwotICAgICAgICBjbGFzc05hbWVDb3B5ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGkgPSBjbGFzc05hbWVDb3B5LmluZGV4T2YoVU5ERVJTQ09SRSwgaSsxKTsKLSAgICB9Ci0gICAgY2hhcltdIGNBcnJheSA9IG5ldyBjaGFyW2NsYXNzTmFtZUNvcHkubGVuZ3RoKCldOwotICAgIGJvb2xlYW4gZm91bmREaWdpdCA9IGZhbHNlOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgY0FycmF5Lmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IGNsYXNzTmFtZUNvcHkuY2hhckF0KGopOwotICAgICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGMpKQotICAgICAgewotICAgICAgICBjQXJyYXlbal0gPSBjOwotICAgICAgICBmb3VuZERpZ2l0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGZvdW5kRGlnaXQpCi0gICAgICAgICAgY0FycmF5W2pdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgY0FycmF5W2pdID0gYzsKLSAgICAgICAgZm91bmREaWdpdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cmluZyhjQXJyYXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcmV0dXJuIEphdmFXU0RMUGFyYW1ldGVyCi0gICovCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkKLSAgewotICAgIHJldHVybiBqYXZhV1NETFBhcmFtXzsKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIGphdmFXU0RMUGFyYW0uCi0gICogQHBhcmFtIGphdmFXU0RMUGFyYW0gVGhlIGphdmFXU0RMUGFyYW0gdG8gc2V0Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkKLSAgewotICAgIGphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpIHsKLSAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyIFRoZSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEBwYXJhbSBkaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZSBUaGUgZGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGlzY292ZXJlZFdzZGxQb3J0RWxlbWVudE5hbWUoU3RyaW5nIGRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lKSB7Ci0gICAgdGhpcy5kaXNjb3ZlcmVkV3NkbFBvcnRFbGVtZW50TmFtZSA9IGRpc2NvdmVyZWRXc2RsUG9ydEVsZW1lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0JKiBAcGFyYW0gY2xpZW50UHJvamVjdCBUaGUgY2xpZW50UHJvamVjdCB0byBzZXQuCi0JKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChJUHJvamVjdCBjbGllbnRQcm9qZWN0KSB7Ci0JCXRoaXMuY2xpZW50UHJvamVjdF8gPSBjbGllbnRQcm9qZWN0OwotICB9Ci0JCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm94eUJlYW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm94eUJlYW4oKSB7Ci0JCXJldHVybiBwcm94eUJlYW5fOwotCX0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1N0dWIyQmVhbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGIzYWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3Rhc2svU3R1YjJCZWFuSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFWaXNpYmlsaXR5S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnV0aWwuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgU3R1YjJCZWFuSW5mbwotewotICBwcml2YXRlIGZpbmFsIFN0cmluZyBORVdfTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICBwcml2YXRlIGludCBpbmRlbnRDb3VudDsKLQotICBwcml2YXRlIFN0cmluZyBwYWNrYWdlXzsKLSAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgaW1wb3J0c187Ci0gIHByaXZhdGUgU3RyaW5nQnVmZmVyIHNlaXNfOwotICBwcml2YXRlIFN0cmluZ0J1ZmZlciBzZXJ2aWNlc187Ci0gIHByaXZhdGUgU3RyaW5nQnVmZmVyIGpuZGlOYW1lc187Ci0gIHByaXZhdGUgU3RyaW5nQnVmZmVyIHBvcnRzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NfOwotICBwcml2YXRlIFZlY3RvciB1c2VkTmFtZXM7Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGNsaWVudFByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyBtb2R1bGVOYW1lXzsKLSAgCi0gIHB1YmxpYyBTdHViMkJlYW5JbmZvKCkKLSAgewotICAgIGluZGVudENvdW50ID0gMDsKLSAgICBwYWNrYWdlXyA9IG51bGw7Ci0gICAgaW1wb3J0c18gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2Vpc18gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2VydmljZXNfID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGpuZGlOYW1lc18gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgcG9ydHNfID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGNsYXNzXyA9ICJTRUlCZWFuIjsKLSAgICB1c2VkTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KElQcm9qZWN0IGNsaWVudFByb2plY3QpIHsKLSAgCXRoaXMuY2xpZW50UHJvamVjdF8gPSAgY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50TW9kdWxlTmFtZShTdHJpbmcgbW9kdWxlTmFtZSkgewotCSAgdGhpcy5tb2R1bGVOYW1lXyA9IG1vZHVsZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBwa2dOYW1lKQotICB7Ci0gICAgaWYgKHBrZ05hbWUgIT0gbnVsbCAmJiBwa2dOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIHBhY2thZ2VfID0gbWFuZ2xlUGFja2FnZU5hbWUocGtnTmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRJbXBvcnRzKFN0cmluZyBwa2dOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgaW1wb3J0c18uYXBwZW5kKHRvRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUocGtnTmFtZSwgY2xhc3NOYW1lKSk7Ci0gICAgaW1wb3J0c18uYXBwZW5kKCI7Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTRUkoU3RyaW5nIHNlaVBrZ05hbWUsIFN0cmluZyBzZWlDbGFzc05hbWUsIFN0cmluZyBzZXJ2aWNlUGtnTmFtZSwgU3RyaW5nIHNlcnZpY2VDbGFzc05hbWUsIFN0cmluZyBwb3J0TmFtZSkKLSAgewotICAgIGFkZFNFSShzZWlQa2dOYW1lLCBzZWlDbGFzc05hbWUsIHNlcnZpY2VQa2dOYW1lLCBzZXJ2aWNlQ2xhc3NOYW1lLCBzZXJ2aWNlQ2xhc3NOYW1lLCBwb3J0TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTRUkoU3RyaW5nIHNlaVBrZ05hbWUsIFN0cmluZyBzZWlDbGFzc05hbWUsIFN0cmluZyBzZXJ2aWNlUGtnTmFtZSwgU3RyaW5nIHNlcnZpY2VDbGFzc05hbWUsIFN0cmluZyBqbmRpTmFtZSwgU3RyaW5nIHBvcnROYW1lKQotICB7Ci0gICAgc2Vpc18uYXBwZW5kKHRvRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoc2VpUGtnTmFtZSwgc2VpQ2xhc3NOYW1lKSk7Ci0gICAgc2Vpc18uYXBwZW5kKCI7Iik7Ci0gICAgc2VydmljZXNfLmFwcGVuZCh0b0Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKHNlcnZpY2VQa2dOYW1lLCBzZXJ2aWNlQ2xhc3NOYW1lKSk7Ci0gICAgc2VydmljZXNfLmFwcGVuZCgiOyIpOwotICAgIGpuZGlOYW1lc18uYXBwZW5kKGpuZGlOYW1lKTsKLSAgICBqbmRpTmFtZXNfLmFwcGVuZCgiOyIpOwotICAgIHBvcnRzXy5hcHBlbmQocG9ydE5hbWUpOwotICAgIHBvcnRzXy5hcHBlbmQoIjsiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzKFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLmxlbmd0aCgpID4gMCkKLSAgICAgIGNsYXNzXyA9IG1hbmdsZUNsYXNzTmFtZShjbGFzc05hbWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgdG9GdWxseVF1YWxpZmllZENsYXNzTmFtZShTdHJpbmcgcGtnTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQobWFuZ2xlUGFja2FnZU5hbWUocGtnTmFtZSkpOwotICAgIHNiLmFwcGVuZCgiLiIpOwotICAgIHNiLmFwcGVuZChtYW5nbGVDbGFzc05hbWUoY2xhc3NOYW1lKSk7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgcW5hbWUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBxbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiBxbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgcW5hbWUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBxbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiBxbmFtZS5zdWJzdHJpbmcoaW5kZXgrMSwgcW5hbWUubGVuZ3RoKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIG1hbmdsZVBhY2thZ2VOYW1lKFN0cmluZyBzKQotICB7Ci0gICAgcmV0dXJuIHJlcGxhY2VJbnZhbGlkSmF2YUNoYXJzKHMpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbWFuZ2xlQ2xhc3NOYW1lKFN0cmluZyBzKQotICB7Ci0gICAgcyA9IGZpcnN0Q2hhclRvVXBwZXJDYXNlKFdTRExVdGlscy5yZXNvbHZlRG90SW5Qb3J0TmFtZShzKSk7Ci0gICAgcmV0dXJuIHJlcGxhY2VJbnZhbGlkSmF2YUNoYXJzKHMpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZUludmFsaWRKYXZhQ2hhcnMoU3RyaW5nIHMpCi0gIHsKLSAgICBjaGFyW10gYyA9IHMudG9DaGFyQXJyYXkoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY1tpXSkpCi0gICAgICAgIGNbaV0gPSAnLic7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU3RyaW5nKGMpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZmlyc3RDaGFyVG9VcHBlckNhc2UoU3RyaW5nIHMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkpOwotICAgIHNiLmFwcGVuZChzLnN1YnN0cmluZygxLCBzLmxlbmd0aCgpKSk7Ci0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBmaXJzdENoYXJUb0xvd2VyQ2FzZShTdHJpbmcgcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSk7Ci0gICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkpKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHRyaW1BcnJheVN5bWJvbChTdHJpbmcgcykKLSAgewotICAgIGludCBpbmRleCA9IHMuaW5kZXhPZigiWyIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHM7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE5hbWUoSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMpCi0gIHsKLSAgICBpZiAoamF2YUhlbHBlcnMuaXNQcmltaXRpdmUoKSkKLSAgICAgIHJldHVybiBqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBqYXZhSGVscGVycy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZShQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBTdGF0dXNIYW5kbGVyIHN0YXR1c01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigyMDQ4KTsKLSAgICB3cml0ZVBhY2thZ2Uoc3cpOwotICAgIHdyaXRlSW1wb3J0cyhzdyk7Ci0gICAgd3JpdGVDbGFzcyhzdyk7Ci0gICAgc3cuY2xvc2UoKTsKLSAgICBieXRlW10gYnl0ZXMgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpLmdldEJ5dGVzKCk7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChwYWNrYWdlXyAhPSBudWxsICYmIHBhY2thZ2VfLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBzYi5hcHBlbmQocGFja2FnZV8pOwotICAgICAgc2IuYXBwZW5kKCIuIik7Ci0gICAgfQotICAgIHNiLmFwcGVuZChjbGFzc18pOwotICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihzYi50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnLycpKTsKLSAgICBzYi5hcHBlbmQoIi5qYXZhIik7Ci0KLSAgICBKYXZhRU1GTmF0dXJlIGphdmFNT0YgPSAoSmF2YUVNRk5hdHVyZSlKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUoY2xpZW50UHJvamVjdF8pOwotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgIElQYXRoIHNvdXJjZUZvbGRlclBhdGggPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbihjbGllbnRQcm9qZWN0XywgbW9kdWxlTmFtZV8pOwotICAgIElGb2xkZXIgc291cmNlRm9sZGVyID0gKElGb2xkZXIpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uoc291cmNlRm9sZGVyUGF0aCk7Ci0gICAgSVBhdGggZmlsZVBhdGggPSBzb3VyY2VGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChzYi50b1N0cmluZygpKSkuZ2V0RnVsbFBhdGgoKTsKLSAgICBGaWxlUmVzb3VyY2VVdGlscy5jcmVhdGVGaWxlKFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKSwgZmlsZVBhdGgsIGJhaXMsIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVQYWNrYWdlKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChwYWNrYWdlXyAhPSBudWxsICYmIHBhY2thZ2VfLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICB3LndyaXRlKCJwYWNrYWdlICIpOwotICAgICAgdy53cml0ZShwYWNrYWdlXyk7Ci0gICAgICB3LndyaXRlKCI7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUltcG9ydHMoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbXBvcnRzXy50b1N0cmluZygpLCAiOyIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdy53cml0ZSgiaW1wb3J0ICIpOwotICAgICAgdy53cml0ZShzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICB3LndyaXRlKCI7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUNsYXNzKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLSAgewotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgicHVibGljIGNsYXNzICIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIgIik7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWlzXy50b1N0cmluZygpLCAiOyIpOwotICAgIGlmIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB3LndyaXRlKCJpbXBsZW1lbnRzICIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdy53cml0ZShzdC5uZXh0VG9rZW4oKSk7Ci0gICAgICBpZiAoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB3LndyaXRlKCIsICIpOwotICAgIH0KLSAgICB3LndyaXRlKCIgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgd3JpdGVGaWVsZHNEZWNsYXJhdGlvbnModyk7Ci0gICAgd3JpdGVDb25zdHJ1Y3Rvcih3KTsKLSAgICB3cml0ZUluaXQodyk7Ci0gICAgLyoKLSAgICAqIENhbm5vdCB1c2UgSk5ESSBsb29rdXAgZm9yIEFYSVMKLSAgICAqCi0gICAgd3JpdGVVc2VKTkRJKHcpOwotICAgICovCi0gICAgd3JpdGVHZXRTZXRFbmRwb2ludCh3KTsKLSAgICB3cml0ZVNFSUdldHRlcnModyk7Ci0gICAgd3JpdGVTRUlNZXRob2RzKHcpOwotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlRmllbGRzRGVjbGFyYXRpb25zKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8qCi0gICAgKiBDYW5ub3QgdXNlIEpOREkgbG9va3VwIGZvciBBWElTCi0gICAgKgotICAgIHcud3JpdGUoInByaXZhdGUgYm9vbGVhbiBfdXNlSk5ESSA9IHRydWU7Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgICAqLwotICAgIHcud3JpdGUoInByaXZhdGUgU3RyaW5nIF9lbmRwb2ludCA9IG51bGw7Iik7Ci0gICAgdXNlZE5hbWVzLmFkZCgiX2VuZHBvaW50Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlaXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB3LndyaXRlKCJwcml2YXRlICIpOwotICAgICAgU3RyaW5nIHNlaSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgdy53cml0ZShzZWkpOwotICAgICAgdy53cml0ZSgiICIpOwotICAgICAgU3RyaW5nIHN0dWJOYW1lID0gZmlyc3RDaGFyVG9Mb3dlckNhc2UoZ2V0Q2xhc3NOYW1lKHNlaSkpOwotICAgICAgdy53cml0ZShzdHViTmFtZSk7Ci0gICAgICB1c2VkTmFtZXMuYWRkKHN0dWJOYW1lKTsKLSAgICAgIHcud3JpdGUoIiA9IG51bGw7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUNvbnN0cnVjdG9yKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgicHVibGljICIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIoKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJfaW5pdCIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIoKTsiKTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlSW5pdChXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoInByaXZhdGUgdm9pZCBfaW5pdCIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIoKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ0cnkgeyIpOwotICAgIGluY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgLyoKLSAgICAqIENhbm5vdCB1c2UgSk5ESSBsb29rdXAgZm9yIEFYSVMKLSAgICAqCi0gICAgdy53cml0ZSgiaWYgKF91c2VKTkRJKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICAqLwotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc2VydmljZVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VydmljZXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgU3RyaW5nVG9rZW5pemVyIGpuZGlOYW1lVG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihqbmRpTmFtZXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHBvcnRUb2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBvcnRzXy50b1N0cmluZygpLCAiOyIpOwotICAgIC8qCi0gICAgaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB3LndyaXRlKCJqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHQgY3R4ID0gbmV3IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dCgpOyIpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB3LndyaXRlKGZpcnN0Q2hhclRvTG93ZXJDYXNlKGdldENsYXNzTmFtZShzdC5uZXh0VG9rZW4oKSkpKTsKLSAgICAgIHcud3JpdGUoIiA9ICgoIik7Ci0gICAgICB3LndyaXRlKHNlcnZpY2VUb2tlbnMubmV4dFRva2VuKCkpOwotICAgICAgdy53cml0ZSgiKWN0eC5sb29rdXAoXCJqYXZhOmNvbXAvZW52L3NlcnZpY2UvIik7Ci0gICAgICB3LndyaXRlKGpuZGlOYW1lVG9rZW5zLm5leHRUb2tlbigpKTsKLSAgICAgIHcud3JpdGUoIlwiKSkuZ2V0Iik7Ci0gICAgICB3LndyaXRlKG1hbmdsZUNsYXNzTmFtZShwb3J0VG9rZW5zLm5leHRUb2tlbigpKSk7Ci0gICAgICB3LndyaXRlKCIoKTsiKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgiZWxzZSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICBzZXJ2aWNlVG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZXJ2aWNlc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICBwb3J0VG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihwb3J0c18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICAqLwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgU3RyaW5nIHNlaU5hbWUgPSBmaXJzdENoYXJUb0xvd2VyQ2FzZShnZXRDbGFzc05hbWUoc3QubmV4dFRva2VuKCkpKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIgPSAobmV3ICIpOwotICAgICAgdy53cml0ZShzZXJ2aWNlVG9rZW5zLm5leHRUb2tlbigpKTsKLSAgICAgIHcud3JpdGUoIkxvY2F0b3IoKSkuZ2V0Iik7Ci0gICAgICB3LndyaXRlKHJlcGxhY2VJbnZhbGlkSmF2YUNoYXJzKFdTRExVdGlscy5yZXNvbHZlRG90SW5Qb3J0TmFtZShwb3J0VG9rZW5zLm5leHRUb2tlbigpKSkpOwotICAgICAgdy53cml0ZSgiKCk7Iik7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgiaWYgKCIpOwotICAgICAgdy53cml0ZShzZWlOYW1lKTsKLSAgICAgIHcud3JpdGUoIiAhPSBudWxsKSB7Iik7Ci0gICAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJpZiAoX2VuZHBvaW50ICE9IG51bGwpIik7Ci0gICAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCIoKGphdmF4LnhtbC5ycGMuU3R1YikiKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIpLl9zZXRQcm9wZXJ0eShcImphdmF4LnhtbC5ycGMuc2VydmljZS5lbmRwb2ludC5hZGRyZXNzXCIsIF9lbmRwb2ludCk7Iik7Ci0gICAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJlbHNlIik7Ci0gICAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgICB3LndyaXRlKCJfZW5kcG9pbnQgPSAoU3RyaW5nKSgoamF2YXgueG1sLnJwYy5TdHViKSIpOwotICAgICAgdy53cml0ZShzZWlOYW1lKTsKLSAgICAgIHcud3JpdGUoIikuX2dldFByb3BlcnR5KFwiamF2YXgueG1sLnJwYy5zZXJ2aWNlLmVuZHBvaW50LmFkZHJlc3NcIik7Iik7Ci0gICAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoIn0iKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICAgIC8qCi0gICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ9Iik7Ci0gICAgKi8KLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIC8qCi0gICAgdy53cml0ZSgiY2F0Y2ggKGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb24gbmFtaW5nRXhjZXB0aW9uKSB7fSIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgKi8KLSAgICB3LndyaXRlKCJjYXRjaCAoamF2YXgueG1sLnJwYy5TZXJ2aWNlRXhjZXB0aW9uIHNlcnZpY2VFeGNlcHRpb24pIHt9Iik7Ci0gICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJ9Iik7Ci0gICAgbmV3TGluZSh3KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZVNldFByb3BlcnR5RW5kcG9pbnQoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzZWlzXy50b1N0cmluZygpLCAiOyIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgU3RyaW5nIHNlaU5hbWUgPSBmaXJzdENoYXJUb0xvd2VyQ2FzZShnZXRDbGFzc05hbWUoc3QubmV4dFRva2VuKCkpKTsKLSAgICAgIHcud3JpdGUoImlmICgiKTsKLSAgICAgIHcud3JpdGUoc2VpTmFtZSk7Ci0gICAgICB3LndyaXRlKCIgIT0gbnVsbCkiKTsKLSAgICAgIGluY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoIigoamF2YXgueG1sLnJwYy5TdHViKSIpOwotICAgICAgdy53cml0ZShzZWlOYW1lKTsKLSAgICAgIHcud3JpdGUoIikuX3NldFByb3BlcnR5KFwiamF2YXgueG1sLnJwYy5zZXJ2aWNlLmVuZHBvaW50LmFkZHJlc3NcIiwgX2VuZHBvaW50KTsiKTsKLSAgICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVVc2VKTkRJKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgicHVibGljIHZvaWQgdXNlSk5ESShib29sZWFuIHVzZUpOREkpIHsiKTsKLSAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIl91c2VKTkRJID0gdXNlSk5ESTsiKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHcud3JpdGUoZmlyc3RDaGFyVG9Mb3dlckNhc2UoZ2V0Q2xhc3NOYW1lKHN0Lm5leHRUb2tlbigpKSkpOwotICAgICAgdy53cml0ZSgiID0gbnVsbDsiKTsKLSAgICAgIG5ld0xpbmUodyk7Ci0gICAgfQotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVTRUlHZXR0ZXJzKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2Vpc18udG9TdHJpbmcoKSwgIjsiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzZWkgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIFN0cmluZyBzZWlDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUoc2VpKTsKLSAgICAgIFN0cmluZyBzZWlGaWVsZE5hbWUgPSBmaXJzdENoYXJUb0xvd2VyQ2FzZShzZWlDbGFzc05hbWUpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoInB1YmxpYyAiKTsKLSAgICAgIHcud3JpdGUoc2VpKTsKLSAgICAgIHcud3JpdGUoIiBnZXQiKTsKLSAgICAgIHcud3JpdGUoc2VpQ2xhc3NOYW1lKTsKLSAgICAgIHcud3JpdGUoIigpIHsiKTsKLSAgICAgIGluY3JlbWVudEluZGVudCgpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICAgIHcud3JpdGUoImlmICgiKTsKLSAgICAgIHcud3JpdGUoc2VpRmllbGROYW1lKTsKLSAgICAgIHcud3JpdGUoIiA9PSBudWxsKSIpOwotICAgICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgiX2luaXQiKTsKLSAgICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICAgIHcud3JpdGUoIigpOyIpOwotICAgICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgicmV0dXJuICIpOwotICAgICAgdy53cml0ZShzZWlGaWVsZE5hbWUpOwotICAgICAgdy53cml0ZSgiOyIpOwotICAgICAgZGVjcmVtZW50SW5kZW50KCk7Ci0gICAgICBuZXdMaW5lKHcpOwotICAgICAgdy53cml0ZSgifSIpOwotICAgICAgbmV3TGluZSh3KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVTRUlNZXRob2RzKFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLSAgewotICAgIG5ld0xpbmUodyk7Ci0gICAgLy9XZWJTZXJ2aWNlRWxlbWVudCB3c2UgPSBXZWJTZXJ2aWNlRWxlbWVudC5nZXRXZWJTZXJ2aWNlRWxlbWVudChtb2RlbF8pOwotICAgIGlmIChjbGllbnRQcm9qZWN0XyA9PSBudWxsKSByZXR1cm47Ly93c2UuZ2V0UHJveHlQcm9qZWN0KCk7Ci0gICAgSmF2YUVNRk5hdHVyZSBqYXZhTU9GID0gKEphdmFFTUZOYXR1cmUpSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKGNsaWVudFByb2plY3RfKTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlaXNfLnRvU3RyaW5nKCksICI7Iik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VpID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcylKYXZhQ2xhc3NJbXBsLnJlZmxlY3QoZ2V0UGFja2FnZU5hbWUoc2VpKSwgZ2V0Q2xhc3NOYW1lKHNlaSksIGphdmFNT0YuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0gICAgICBpZiAoamF2YUNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3QgbWV0aG9kcyA9IGphdmFDbGFzcy5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClpdC5uZXh0KCk7Ci0gICAgICAgICAgaWYgKCFtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmICFtZXRob2QuaXNOYXRpdmUoKSAmJiBtZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUMpCi0gICAgICAgICAgICB3cml0ZVNFSU1ldGhvZHModywgamF2YUNsYXNzLCBtZXRob2QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlU0VJTWV0aG9kcyhXcml0ZXIgdywgSmF2YUNsYXNzIGphdmFDbGFzcywgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICB3LndyaXRlKCJwdWJsaWMgIik7Ci0gICAgLy8gaXNWb2lkCi0gICAgaWYgKG1ldGhvZC5pc1ZvaWQoKSkKLSAgICAgIHcud3JpdGUoInZvaWQgIik7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHcud3JpdGUoZ2V0RnVsbHlRdWFsaWZpZWROYW1lKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKTsKLSAgICAgIHcud3JpdGUoIiAiKTsKLSAgICB9Ci0gICAgLy8gbWV0aG9kIG5hbWUKLSAgICB3LndyaXRlKG1ldGhvZC5nZXROYW1lKCkpOwotICAgIHcud3JpdGUoIigiKTsKLSAgICAvLyBpbnB1dCBwYXJhbWV0ZXJzCi0gICAgSmF2YVBhcmFtZXRlcltdIGlucHV0UGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRQYXJhbXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgPiAwKQotICAgICAgICB3LndyaXRlKCIsICIpOwotICAgICAgSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMgPSBpbnB1dFBhcmFtc1tpXS5nZXRKYXZhVHlwZSgpOwotICAgICAgdy53cml0ZShnZXRGdWxseVF1YWxpZmllZE5hbWUoamF2YUhlbHBlcnMpKTsKLSAgICAgIHcud3JpdGUoIiAiKTsKLSAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBnZXRDbGFzc05hbWUoaW5wdXRQYXJhbXNbaV0uZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgIHcud3JpdGUoZ2V0VW51c2VkTmFtZShwYXJhbU5hbWUpKTsKLSAgICB9Ci0gICAgdy53cml0ZSgiKSIpOwotICAgIC8vIGV4Y2VwdGlvbnMKLSAgICBMaXN0IGV4Y2VwdGlvbnMgPSBtZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLSAgICBpZiAoIWV4Y2VwdGlvbnMuaXNFbXB0eSgpKQotICAgICAgdy53cml0ZSgiIHRocm93cyAiKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEphdmFDbGFzcyBleGNlcHRpb24gPSAoSmF2YUNsYXNzKWl0Lm5leHQoKTsKLSAgICAgIHcud3JpdGUoZXhjZXB0aW9uLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkpOwotICAgICAgaWYgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgdy53cml0ZSgiLCAiKTsKLSAgICB9Ci0gICAgLy8gbWV0aG9kIGJvZHkKLSAgICB3LndyaXRlKCJ7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICBTdHJpbmcgc3R1Yk5hbWUgPSBmaXJzdENoYXJUb0xvd2VyQ2FzZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLSAgICB3LndyaXRlKCJpZiAoIik7Ci0gICAgdy53cml0ZShzdHViTmFtZSk7Ci0gICAgdy53cml0ZSgiID09IG51bGwpIik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJfaW5pdCIpOwotICAgIHcud3JpdGUoY2xhc3NfKTsKLSAgICB3LndyaXRlKCIoKTsiKTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIGlmICghbWV0aG9kLmlzVm9pZCgpKQotICAgICAgdy53cml0ZSgicmV0dXJuICIpOwotICAgIHcud3JpdGUoc3R1Yk5hbWUpOwotICAgIHcud3JpdGUoIi4iKTsKLSAgICB3LndyaXRlKG1ldGhvZC5nZXROYW1lKCkpOwotICAgIHcud3JpdGUoIigiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0UGFyYW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpID4gMCkKLSAgICAgICAgdy53cml0ZSgiLCAiKTsKLSAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBnZXRDbGFzc05hbWUoaW5wdXRQYXJhbXNbaV0uZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgIHcud3JpdGUoZ2V0VW51c2VkTmFtZShwYXJhbU5hbWUpKTsKLSAgICB9Ci0gICAgdy53cml0ZSgiKTsiKTsKLSAgICBkZWNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIn0iKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIG5ld0xpbmUodyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVHZXRTZXRFbmRwb2ludChXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoInB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKSB7Iik7Ci0gICAgaW5jcmVtZW50SW5kZW50KCk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJyZXR1cm4gX2VuZHBvaW50OyIpOwotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgbmV3TGluZSh3KTsKLSAgICB3LndyaXRlKCJwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnQpIHsiKTsKLSAgICBpbmNyZW1lbnRJbmRlbnQoKTsKLSAgICBuZXdMaW5lKHcpOwotICAgIHcud3JpdGUoIl9lbmRwb2ludCA9IGVuZHBvaW50OyIpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgd3JpdGVTZXRQcm9wZXJ0eUVuZHBvaW50KHcpOwotICAgIGRlY3JlbWVudEluZGVudCgpOwotICAgIG5ld0xpbmUodyk7Ci0gICAgdy53cml0ZSgifSIpOwotICAgIG5ld0xpbmUodyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlUGFyZW50Rm9sZGVyKElSZXNvdXJjZSByZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcGFyZW50ID0gcmVzLmdldFBhcmVudCgpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gcmVzICYmIHBhcmVudCBpbnN0YW5jZW9mIElGb2xkZXIpCi0gICAgewotICAgICAgSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcilwYXJlbnQ7Ci0gICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlUGFyZW50Rm9sZGVyKGZvbGRlcik7Ci0gICAgICAgIGZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluY3JlbWVudEluZGVudCgpCi0gIHsKLSAgICBpbmRlbnRDb3VudCsrOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRlY3JlbWVudEluZGVudCgpCi0gIHsKLSAgICBpbmRlbnRDb3VudC0tOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluZGVudChXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudENvdW50OyBpKyspCi0gICAgICB3LndyaXRlKCIgICIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG5ld0xpbmUoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdy53cml0ZShORVdfTElORSk7Ci0gICAgaW5kZW50KHcpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRVbnVzZWROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgaWYgKHVzZWROYW1lcy5jb250YWlucyhuYW1lKSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKG5hbWUpKS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoaSkpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmICghdXNlZE5hbWVzLmNvbnRhaW5zKG5ld05hbWUpKQotICAgICAgICAgIHJldHVybiBuZXdOYW1lOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdGFzay9WYWxpZGF0ZVdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1ZhbGlkYXRlV1NETENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5NzNiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS90YXNrL1ZhbGlkYXRlV1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVXU0RMQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLQotICBwdWJsaWMgVmFsaWRhdGVXU0RMQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5WYWxpZGF0ZVdTRExDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZCIpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotCU1lc3NhZ2VVdGlscyBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkucGx1Z2luIiwgdGhpcyApOwotCQotICAgIGlmICh3c2RsVVJJICE9IG51bGwgJiYgd3NkbFVSSS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgbnVtU2VydmljZXMgPSBkZWZpbml0aW9uLmdldFNlcnZpY2VzKCkuc2l6ZSgpOwotICAgICAgICBpZiAobnVtU2VydmljZXMgPCAxKQotICAgICAgICB7Ci0gICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1NETF9IQVNfTk9fU0VSVklDRV9FTEVNRU5UIiwgbmV3IE9iamVjdFtdIHt3c2RsVVJJfSksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsVVJJIFRoZSB3c2RsVVJJIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdXRpbC9DbGFzc3BhdGhVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdXRpbC9DbGFzc3BhdGhVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTJjZjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3V0aWwvQ2xhc3NwYXRoVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIENsYXNzcGF0aFV0aWxzIHsKLQotCS8vCUNvcHlyaWdodAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAzLiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIENsYXNzcGF0aFV0aWxzIGluc3RhbmNlXzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVJfQ0xBU1NFUyA9ICJjbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVJfTElCID0gImxpYiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRE9UX0pBUiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBKQVIgPSAiamFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBXRUJJTkZfTElCID0gIi9XRUItSU5GL2xpYiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgV0VCSU5GID0gIldFQi1JTkYiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENsYXNzcGF0aFV0aWxzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoVXRpbHMgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLQkJCWluc3RhbmNlXyA9IG5ldyBDbGFzc3BhdGhVdGlscygpOwotCQlyZXR1cm4gaW5zdGFuY2VfOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aFN0cmluZyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlKSB7Ci0JCVN0cmluZ0J1ZmZlciBjbGFzc3BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1tdIGNsYXNzcGF0aEVudHJpZXMgPSBnZXRDbGFzc3BhdGgocHJvamVjdCwgZmFsc2UsIG1vZHVsZSk7Ci0KLQkJVmVjdG9yIGNsYXNzcGF0aFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGhFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWNsYXNzcGF0aFZlY3Rvci5jb250YWlucyhjbGFzc3BhdGhFbnRyaWVzW2ldKSkgewotCQkJCWNsYXNzcGF0aFZlY3Rvci5hZGQoY2xhc3NwYXRoRW50cmllc1tpXSk7Ci0JCQkJY2xhc3NwYXRoLmFwcGVuZChjbGFzc3BhdGhFbnRyaWVzW2ldKTsKLQkJCQljbGFzc3BhdGguYXBwZW5kKCI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gaXNEZXBlbmRlbnQsIFN0cmluZyBpbnB1dE1vZHVsZSkgewotLy8JCSBpbnB1dE1vZHVsZSBpcyB2YWxpZCBvbmx5IGlmIGl0J3Mgbm90IGEgZGVwZW5kZW50IHByb2plY3QKLQkJU3RyaW5nW10gbW9kdWxlQ2xhc3NwYXRoID0gbmV3IFN0cmluZ1swXTsKLQkJQXJyYXlMaXN0IHByb2plY3RDbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJvb2xlYW4gbmVlZEphdmFDbGFzc3BhdGggPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCUlGb2xkZXIgd2ViTW9kdWxlU2VydmVyUm9vdCA9IG51bGw7Ci0JCVN0cmluZyByZXNvdXJjZUxvY2F0aW9uID0gbnVsbDsKLQkJSUZvbGRlciB3ZWJNb2R1bGVDbGFzc2VzID0gbnVsbDsKLQkJCi0JCXRyeSB7Ci0JCQlTdHJpbmcgbW9kdWxlOwotCQkJbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJV29ya2JlbmNoQ29tcG9uZW50W10gd2JjcyA9IG1jLmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2Jjcy5sZW5ndGg7IGkrKykgewotCQkJCW1vZHVsZSA9IHdiY3NbaV0uZ2V0TmFtZSgpOwotCQkJCS8vIGdldCB0aGUgbW9kdWxlJ3MgY2xhc3NwYXRoCi0JCQkJaWYgKEoyRUVVdGlscy5pc0VBUkNvbXBvbmVudChwcm9qZWN0LCBtb2R1bGUpKSB7Ci0JCQkJCW1vZHVsZUNsYXNzcGF0aCA9IGdldENsYXNzcGF0aEZvckVBUlByb2plY3QocHJvamVjdCwgbW9kdWxlKTsKLQkJCQl9IGVsc2UgaWYgKEoyRUVVdGlscy5pc1dlYkNvbXBvbmVudChwcm9qZWN0LCBtb2R1bGUpKSB7Ci0JCQkJCXdlYk1vZHVsZVNlcnZlclJvb3QgPSBTdHJ1Y3R1cmVFZGl0LmdldE91dHB1dENvbnRhaW5lclJvb3Qod2Jjc1tpXSk7Ci0JCQkJCWlmICh3ZWJNb2R1bGVTZXJ2ZXJSb290ICE9IG51bGwpIHsgCi0JCQkJCQl3ZWJNb2R1bGVDbGFzc2VzID0gd2ViTW9kdWxlU2VydmVyUm9vdC5nZXRGb2xkZXIoV0VCSU5GKS5nZXRGb2xkZXIoRElSX0NMQVNTRVMpOwotCQkJCQkJaWYgKHdlYk1vZHVsZUNsYXNzZXMgIT0gbnVsbCkKLQkJCQkJCQltb2R1bGVDbGFzc3BhdGggPSBuZXcgU3RyaW5nW10geyB3ZWJNb2R1bGVDbGFzc2VzLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpIH07Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKEoyRUVVdGlscy5pc0phdmFDb21wb25lbnQocHJvamVjdCwgbW9kdWxlKSkgewotCQkJCQluZWVkSmF2YUNsYXNzcGF0aCA9IHRydWU7Ci0JCQkJCXdlYk1vZHVsZVNlcnZlclJvb3QgPSBTdHJ1Y3R1cmVFZGl0LmdldE91dHB1dENvbnRhaW5lclJvb3Qod2Jjc1tpXSk7Ci0JCQkJCWlmICh3ZWJNb2R1bGVTZXJ2ZXJSb290ICE9IG51bGwpIHsgCi0JCQkJCQltb2R1bGVDbGFzc3BhdGggPSBuZXcgU3RyaW5nW10geyB3ZWJNb2R1bGVTZXJ2ZXJSb290LmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpIH07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gYWRkIG1vZHVsZSBjbGFzc3BhdGggdG8gcHJvamVjdCBjbGFzc3BhdGgKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZHVsZUNsYXNzcGF0aC5sZW5ndGg7IGorKykgewotCQkJCQlwcm9qZWN0Q2xhc3NwYXRoLmFkZChtb2R1bGVDbGFzc3BhdGhbal0pOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaXNEZXBlbmRlbnQpIHsKLQkJCQlpZiAoSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KHByb2plY3QsIGlucHV0TW9kdWxlKSkgewotCQkJCQluZWVkSmF2YUNsYXNzcGF0aCA9IHRydWU7Ci0JCQkJCW1vZHVsZUNsYXNzcGF0aCA9IGdldFdFQklORkxpYihwcm9qZWN0LCBpbnB1dE1vZHVsZSk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbW9kdWxlQ2xhc3NwYXRoLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlwcm9qZWN0Q2xhc3NwYXRoLmFkZChtb2R1bGVDbGFzc3BhdGhbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiB0aGVyZSBhcmUgV2ViIG9yIEphdmEgbW9kdWxlIGluIHRoZSBwcm9qZWN0LCBnZXQgdGhlIHByb2plY3QncyBKYXZhIGNsYXNzcGF0aAotCQkJaWYgKG5lZWRKYXZhQ2xhc3NwYXRoKSB7Ci0JCQkJU3RyaW5nW10gamF2YUNsYXNzcGF0aDsKLQkJCQl0cnkgewotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0LmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJCQlpZiAoamF2YVByb2ogIT0gbnVsbCkgewotCQkJCQkJamF2YUNsYXNzcGF0aCA9IGdldENsYXNzcGF0aEZvckphdmFQcm9qZWN0KGphdmFQcm9qKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgamF2YUNsYXNzcGF0aC5sZW5ndGg7IGorKykgewotCQkJCQkJCXByb2plY3RDbGFzc3BhdGguYWRkKGphdmFDbGFzc3BhdGhbal0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCBhYmxlIHRvIGdldCBKYXZhIGNsYXNzcGF0aCwganVzdCBpZ25vcmUKLQkJCQl9CQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1jICE9IG51bGwpCi0JCQkJbWMuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHByb2plY3RDbGFzc3BhdGgudG9BcnJheShuZXcgU3RyaW5nW3Byb2plY3RDbGFzc3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLy8gTmVlZCB0byBnZXQgYWxsIG1vZHVsZXMgaW4gdGhlIHByb2plY3QuIElmIHRoZXJlJ3MgYSBFQVIgbW9kdWxlLCBnZXQgdGhlIHV0aWxpdHkgSkFScyAKLQlwcml2YXRlIFN0cmluZ1tdIGdldFV0aWxpdHlKYXJDbGFzc3BhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmdbXSBtb2R1bGVDbGFzc3BhdGggPSBuZXcgU3RyaW5nWzBdOwotCQlBcnJheUxpc3QgdXRpbGl0eUphcnNDbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cnVjdHVyZUVkaXQgbWMgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIG1vZHVsZTsKLQkJCW1jID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdiY3MubGVuZ3RoOyBpKyspIHsKLQkJCQltb2R1bGUgPSB3YmNzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAoSjJFRVV0aWxzLmlzRUFSQ29tcG9uZW50KHByb2plY3QsIG1vZHVsZSkpIHsKLQkJCQkJbW9kdWxlQ2xhc3NwYXRoID0gZ2V0Q2xhc3NwYXRoRm9yRUFSUHJvamVjdChwcm9qZWN0LCBtb2R1bGUpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZHVsZUNsYXNzcGF0aC5sZW5ndGg7IGorKykgewotCQkJCQkJdXRpbGl0eUphcnNDbGFzc3BhdGguYWRkKG1vZHVsZUNsYXNzcGF0aFtqXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtYyAhPSBudWxsKQotCQkJCW1jLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSB1dGlsaXR5SmFyc0NsYXNzcGF0aC50b0FycmF5KG5ldyBTdHJpbmdbdXRpbGl0eUphcnNDbGFzc3BhdGguc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0Q2xhc3NwYXRoRm9yRUFSUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlKSB7Ci0JCUlQYXRoIHByb2plY3RQYXRoID0KLQkJCXByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQobW9kdWxlKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQlyZXR1cm4gZ2V0RGlyZWN0b3J5SmFyRmlsZXMocHJvamVjdFBhdGgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0RGlyZWN0b3J5SmFyRmlsZXMoSVBhdGggaVBhdGgpIHsKLQkJRmlsZSBkaXIgPSBpUGF0aC50b0ZpbGUoKTsKLQkJVmVjdG9yIGphcnNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChkaXIuZXhpc3RzKCkgJiYgZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGZpbGVuYW1lcyA9IGRpci5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlbmFtZXNbaV0uZW5kc1dpdGgoRE9UX0pBUikpCi0JCQkJCWphcnNWZWN0b3IuYWRkKHBhdGgyU3RyaW5nKGlQYXRoKSArIGZpbGVuYW1lc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nW10gamFycyA9IG5ldyBTdHJpbmdbamFyc1ZlY3Rvci5zaXplKCldOwotCQlqYXJzVmVjdG9yLmNvcHlJbnRvKGphcnMpOwotCQlyZXR1cm4gamFyczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldFdFQklORkxpYihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlKSB7Ci0JCVN0cmluZ1tdIHdlYmluZkxpYkphcnMgPSBuZXcgU3RyaW5nWzBdOwotCQlBcnJheUxpc3QgYW5BcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIG1vZHVsZSk7Ci0JCQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJCQkJCi0JCQkJCQlJVmlydHVhbEZvbGRlciB3ZWJJbmZMaWIgPSBjb21wb25lbnQuZ2V0Rm9sZGVyKG5ldyBQYXRoKAotCQkJCQkJCQlXRUJJTkZfTElCKSk7Ci0JCQkJCQlpZiAod2ViSW5mTGliICE9IG51bGwpIHsKLQkJCQkJCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gd2ViSW5mTGliLm1lbWJlcnMoKTsKLQkJCQkJCQlJUmVzb3VyY2UgYVJlc291cmNlID0gbnVsbDsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlhUmVzb3VyY2UgPSByZXNvdXJjZXNbaV0uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQkJCQkJCWlmIChKQVIuZXF1YWxzSWdub3JlQ2FzZShhUmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpKSkKLQkJCQkJCQkJCWFuQXJyYXlMaXN0LmFkZCggYVJlc291cmNlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGFuQXJyYXlMaXN0LnNpemUoKSAhPSAwKQotCQkJCQkJCQl3ZWJpbmZMaWJKYXJzID0gKFN0cmluZ1tdKSBhbkFycmF5TGlzdC50b0FycmF5KG5ldyBTdHJpbmdbYW5BcnJheUxpc3Quc2l6ZSgpXSk7Ci0JCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQlyZXR1cm4gd2ViaW5mTGliSmFyczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENsYXNzcGF0aEZvckphdmFQcm9qZWN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlBcnJheUxpc3QgcHJvamVjdENsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGJ1aWxkUGF0aCA9Ci0JCQkJamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkUGF0aC5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZ1tdIGJ1aWxkUGF0aFN0cmluZyA9Ci0JCQkJCWNsYXNzcGF0aEVudHJ5MlN0cmluZygKLQkJCQkJCWJ1aWxkUGF0aFtpXSwKLQkJCQkJCWphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidWlsZFBhdGhTdHJpbmcubGVuZ3RoOyBqKyspIHsKLQkJCQkJcHJvamVjdENsYXNzcGF0aC5hZGQoYnVpbGRQYXRoU3RyaW5nW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJfQotCi0JCVN0cmluZ1tdIHV0aWxpdHlKYXJzQ2xhc3NwYXRoOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQlJUHJvamVjdFtdIHJlZmVyZW5jaW5nUHJvamVjdHMgPSBwcm9qZWN0LmdldFJlZmVyZW5jaW5nUHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2luZ1Byb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQl1dGlsaXR5SmFyc0NsYXNzcGF0aCA9IGdldFV0aWxpdHlKYXJDbGFzc3BhdGgocmVmZXJlbmNpbmdQcm9qZWN0c1tpXSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHV0aWxpdHlKYXJzQ2xhc3NwYXRoLmxlbmd0aDsgaisrKSB7Ci0JCQkJcHJvamVjdENsYXNzcGF0aC5hZGQodXRpbGl0eUphcnNDbGFzc3BhdGhbal0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcHJvamVjdENsYXNzcGF0aC50b0FycmF5KG5ldyBTdHJpbmdbcHJvamVjdENsYXNzcGF0aC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNsYXNzcGF0aEVudHJ5MlN0cmluZygKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5LAotCQlJUHJvamVjdCBwcm9qZWN0KSAKLQl7Ci0JCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIDoKLQkJCXsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgcGF0aDJTdHJpbmcoZW50cnkuZ2V0UGF0aCgpKX07CQotCQkJfQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgotCQkJewkJCQotCQkJCXJldHVybiBnZXRDbGFzc3BhdGgoCi0JCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJCWVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKSwgdHJ1ZSwgIiIpOwotCQkJfQotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJewotCQkJCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQkJCQlpZiAocGF0aC5zZWdtZW50KDApLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCQkJCXBhdGgyU3RyaW5nKAotCQkJCQkJCXByb2plY3QKLQkJCQkJCQkJLmdldExvY2F0aW9uKCkKLQkJCQkJCQkJLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkKLQkJCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJcGF0aCkpfTsKLQkJCQl9Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJewotCQkJCXJldHVybiBjbGFzc3BhdGhFbnRyeTJTdHJpbmcoCi0JCQkJCUphdmFDb3JlLmdldFJlc29sdmVkQ2xhc3NwYXRoRW50cnkoZW50cnkpLAotCQkJCQlwcm9qZWN0KTsKLQkJCX0KLQkJCWRlZmF1bHQgOgotCQkJewotCQkJCXJldHVybiBuZXcgU3RyaW5nW10geyBwYXRoMlN0cmluZyhlbnRyeS5nZXRQYXRoKCkpfTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHBhdGgyU3RyaW5nKElQYXRoIHBhdGgpIHsKLQkJcmV0dXJuIHBhdGgudG9PU1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3V0aWwvRmlsZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3V0aWwvRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyNjlkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS91dGlsL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwKLXsKLSAgcHVibGljIEZpbGVVdGlsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNyYywgU3RyaW5nIGRlc3QpCi0gIHsKLSAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOwotICAgICAgYnl0ZSBidWZmW10gPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3QpOwotICAgICAgaW50IGMgPSAwOwotICAgICAgYnl0ZVtdIGFycmF5ID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICB3aGlsZSAoKGMgPSBpcy5yZWFkKGFycmF5KSkgPj0gMCkKLSAgICAgIHsKLSAgICAgICAgZm9zLndyaXRlKGFycmF5LCAwLCBjKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBmb3MuY2xvc2UoKTsKLSAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlRmlsZUFuZFBhcmVudERpcmVjdG9yaWVzKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotICAgIEZpbGUgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgaWYgKCFwYXJlbnQuZXhpc3RzKCkpCi0gICAgewotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgIH0KLSAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICByZXR1cm4gZmlsZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcmllcyhGaWxlIGRpcikgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVtdIGNoaWxkcmVuID0gZGlyLmxpc3RGaWxlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNoaWxkcmVuW2ldLmxpc3QoKSAhPSBudWxsICYmIGNoaWxkcmVuW2ldLmxpc3QoKS5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBkZWxldGVEaXJlY3RvcmllcyhjaGlsZHJlbltpXSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGNoaWxkcmVuW2ldLmRlbGV0ZSgpOwotICAgICAgfQotICAgIH0KLSAgICBkaXIuZGVsZXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIGZvbGRlciBhbmQgYWxsIHBhcmVudCBmb2xkZXJzIGlmIG5vdCBleGlzdGluZyBQcm9qZWN0IG11c3QgZXhpc3QKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVGb2xkZXIoSUZvbGRlciBmb2xkZXIsIGJvb2xlYW4gZm9yY2UsIGJvb2xlYW4gbG9jYWwpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBJQ29udGFpbmVyIHBhcmVudCA9IGZvbGRlci5nZXRQYXJlbnQoKTsKLSAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJRm9sZGVyKQotICAgICAgewotICAgICAgICBjcmVhdGVGb2xkZXIoKElGb2xkZXIpcGFyZW50LCBmb3JjZSwgbG9jYWwpOwotICAgICAgfQotICAgICAgZm9sZGVyLmNyZWF0ZShmb3JjZSwgbG9jYWwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUYXJnZXRGaWxlKFN0cmluZyBzb3VyY2VGaWxlTmFtZSwgU3RyaW5nIHRhcmdldEZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBjcmVhdGVUYXJnZXRGaWxlKHNvdXJjZUZpbGVOYW1lLCB0YXJnZXRGaWxlTmFtZSwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVRhcmdldEZpbGUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0RmlsZU5hbWUsIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlIGlkZWFsUmVzdWx0RmlsZSA9IG5ldyBGaWxlKHRhcmdldEZpbGVOYW1lKTsKLSAgICBpZiAob3ZlcndyaXRlIHx8ICFpZGVhbFJlc3VsdEZpbGUuZXhpc3RzKCkpCi0gICAgewotICAgICAgRmlsZVV0aWwuY3JlYXRlRmlsZUFuZFBhcmVudERpcmVjdG9yaWVzKHRhcmdldEZpbGVOYW1lKTsKLSAgICAgIEZpbGVVdGlsLmNvcHlGaWxlKHNvdXJjZUZpbGVOYW1lLCB0YXJnZXRGaWxlTmFtZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS91dGlsL1BsYXRmb3JtVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3V0aWwvUGxhdGZvcm1VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjY1MmExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3V0aWwvUGxhdGZvcm1VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudXRpbDsKLQotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotcHVibGljIGNsYXNzIFBsYXRmb3JtVXRpbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUk9PVCA9ICJwbGF0Zm9ybTovcmVzb3VyY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTl9GSUxFX1BST1RPQ09MID0gImZpbGU6LyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE5YX0ZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk0gPSAicGxhdGZvcm0iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFID0gIi9yZXNvdXJjZSI7Ci0KLQlwcml2YXRlIFBsYXRmb3JtVXRpbHMoKSB7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgcGxhdGZvcm0gVVJMIGdpdmVuIGFuIElQYXRoCi0JKiBAcGFyYW0gSVBhdGggcGF0aAotCSogQHJldHVybiBTdHJpbmcgcGxhdGZvcm1VUkwKLQkqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtVVJMKElQYXRoIHBhdGgpIHsKLQkJU3RyaW5nIHBsYXRmb3JtVVJMOwotCQlwbGF0Zm9ybVVSTCA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHBhdGgudG9TdHJpbmcoKSkudG9TdHJpbmcoKTsKLQkJLy8gb2xkIG1ldGhvZDogZmlsZSBzeXN0ZW0gcmVwcmVzZW50YXRpb24KLQkJLy8gCXBsYXRmb3JtVVJMID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHBsYXRmb3JtVVJMOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgVVJMIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQbGF0Zm9ybSBVUkwgZ2l2ZW4gYW4gSVBhdGgKLQkqIFRoZSBQbGF0Zm9ybVJlc291cmNlTWFuYWdlciB1bmRlcmRzdGFuZHMgdGhpcyBmb3JtYXQgYW5kIHRoZXJlZm9yZQotCSogdGhpcyBpcyBzdWl0ZWQgZm9yIGNvbW1hbmQgVVJMJ3MKLQkqIEBwYXJhbSBJUGF0aCBwYXRoCi0JKiBAcmV0dXJuIFVSTCBQbGF0Zm9ybSBVUkwKLQkqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldENvbW1hbmRQbGF0Zm9ybVVSTChJUGF0aCBwYXRoKSB7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChQTEFURk9STSwgbnVsbCwgUkVTT1VSQ0UgKyBwYXRoLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHBhdGggZ2l2ZW4gcGxhdGZvcm0gVVJMIHN0cmluZwotCSogQHBhcmFtIFN0cmluZyBwbGF0Zm9ybSBVUkwgc3RyaW5nCi0JKiBAcmV0dXJuIFN0cmluZyBwYXRoIHN0cmluZwotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aEZyb21QbGF0Zm9ybShTdHJpbmcgcGxhdGZvcm1TdHIpIHsKLQkJU3RyaW5nIHBhdGhTdHIgPSBwbGF0Zm9ybVN0cjsKLQotCQlTdHJpbmcgcm9vdExvY2F0aW9uOwotCQlyb290TG9jYXRpb24gPSBQTEFURk9STV9ST09UOwotCQkvLyBvbGQgbWV0aG9kOiBmaWxlIHN5c3RlbSByZXByZXNlbnRhdGlvbgotCQkvLwlyb290TG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJaWYgKHBsYXRmb3JtU3RyLnN0YXJ0c1dpdGgocm9vdExvY2F0aW9uKSkKLQkJCXBhdGhTdHIgPSBwbGF0Zm9ybVN0ci5zdWJzdHJpbmcocm9vdExvY2F0aW9uLmxlbmd0aCgpKTsKLQkJcmV0dXJuIHBhdGhTdHI7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgcGxhdGZvcm0gVVJMIGdpdmVuIHRoZSBwYXRoIHN0cmluZwotCSogQHBhcmFtIFN0cmluZyBwYXRoIHN0cmluZwotCSogQHJldHVybiBTdHJpbmcgcGxhdGZvcm0gVVJMIHN0cmluZwotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGxhdGZvcm1Gcm9tUGF0aChTdHJpbmcgcGF0aFN0cikgewotCQlTdHJpbmcgcGxhdGZvcm1TdHIgPSBwYXRoU3RyOwotCi0JCVN0cmluZyByb290TG9jYXRpb247Ci0JCXJvb3RMb2NhdGlvbiA9IFBMQVRGT1JNX1JPT1Q7Ci0JCS8vIG9sZCBtZXRob2Q6IGZpbGUgc3lzdGVtIHJlcHJlc2VudGF0aW9uCi0JCS8vCXJvb3RMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQlwbGF0Zm9ybVN0ciA9IHJvb3RMb2NhdGlvbiArIHBhdGhTdHI7Ci0JCXJldHVybiBwbGF0Zm9ybVN0cjsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gZmlsZSBnaXZlbiBwbGF0Zm9ybSBVUkwgc3RyaW5nCi0JKiBAcGFyYW0gU3RyaW5nIHBsYXRmb3JtIFVSTCBzdHJpbmcKLQkqIEByZXR1cm4gU3RyaW5nIGZpbGUgc3RyaW5nCi0JKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlRnJvbVBsYXRmb3JtKFN0cmluZyBwbGF0Zm9ybVN0cikgewotCQlTdHJpbmcgZmlsZVN0ciA9IHBsYXRmb3JtU3RyOwotCQlTdHJpbmcgcGF0aFN0ciA9IGdldFBhdGhGcm9tUGxhdGZvcm0ocGxhdGZvcm1TdHIpOwotCi0JCWZpbGVTdHIgPQotCQkJUmVzb3VyY2VzUGx1Z2luCi0JCQkJLmdldFdvcmtzcGFjZSgpCi0JCQkJLmdldFJvb3QoKQotCQkJCS5nZXRGaWxlKG5ldyBQYXRoKHBhdGhTdHIpKQotCQkJCS5nZXRMb2NhdGlvbigpCi0JCQkJLnRvU3RyaW5nKCk7Ci0KLQkJLy8gb2xkIG1ldGhvZDogZmlsZSBzeXN0ZW0gcmVwcmVzZW50YXRpb24KLQkJLy8JRG8gbm90aGluZwotCi0JCXJldHVybiBmaWxlU3RyOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgZmlsZSBwcm90b2NvbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gZmlsZSBnaXZlbiBwbGF0Zm9ybSBVUkwgc3RyaW5nCi0JKiBAcGFyYW0gU3RyaW5nIHBsYXRmb3JtIFVSTCBzdHJpbmcKLQkqIEByZXR1cm4gU3RyaW5nIHRoZSBmaWxlIHByb3RvY29sIHVyaQotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVVSTEZyb21QbGF0Zm9ybShTdHJpbmcgcGxhdGZvcm1TdHIpIHsKLQkJU3RyaW5nIGZpbGVTdHIgPSBwbGF0Zm9ybVN0cjsKLQkJU3RyaW5nIHBhdGhTdHIgPSBnZXRQYXRoRnJvbVBsYXRmb3JtKHBsYXRmb3JtU3RyKTsKLQkJdHJ5IHsKLQkJCWZpbGVTdHIgPQotCQkJCVJlc291cmNlc1BsdWdpbgotCQkJCQkuZ2V0V29ya3NwYWNlKCkKLQkJCQkJLmdldFJvb3QoKQotCQkJCQkuZ2V0RmlsZShuZXcgUGF0aChwYXRoU3RyKSkKLQkJCQkJLmdldExvY2F0aW9uKCkKLQkJCQkJLnRvRmlsZSgpCi0JCQkJCS50b1VSTCgpCi0JCQkJCS50b1N0cmluZygpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLQkJCWZpbGVTdHIgPSBnZXRGaWxlVVJMRnJvbVBhdGgobmV3IFBhdGgocGF0aFN0cikpOwotCQl9Ci0JCXJldHVybiBmaWxlU3RyOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgZmlsZSBwcm90b2NvbCByZXByZXNlbnRhdGlvbiBvZiBhIGxvY2FsIGZpbGUKLQkqIEBwYXJhbSBJUGF0aCB0aGUgUGF0aCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWxlCi0JKiBAcmV0dXJuIFN0cmluZyB0aGUgZmlsZSBwcm90b2NvbCB1cmkKLQkqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVVUkxGcm9tUGF0aChJUGF0aCBwYXRoKSB7Ci0KLQkJU3RyaW5nIGZpbGUgPSBudWxsOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJZmlsZSA9Ci0JCQkJCVJlc291cmNlc1BsdWdpbgotCQkJCQkJLmdldFdvcmtzcGFjZSgpCi0JCQkJCQkuZ2V0Um9vdCgpCi0JCQkJCQkuZ2V0RmlsZShwYXRoKQotCQkJCQkJLmdldExvY2F0aW9uKCkKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmIChmaWxlLmNoYXJBdCgwKSA9PSBJUGF0aC5TRVBBUkFUT1IpIHsKLQkJCQkJZmlsZSA9IExOWF9GSUxFX1BST1RPQ09MICsgZmlsZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaWxlID0gV0lOX0ZJTEVfUFJPVE9DT0wgKyBmaWxlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZmlsZSA9IHBhdGgudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5jaGFyQXQoMCkgPT0gSVBhdGguU0VQQVJBVE9SKSB7Ci0JCQkJZmlsZSA9IExOWF9GSUxFX1BST1RPQ09MICsgZmlsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmlsZSA9IFdJTl9GSUxFX1BST1RPQ09MICsgZmlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZSA9PSBudWxsID8gbnVsbCA6IGZpbGU7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS91dGlsL1dTRExVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvdXRpbC9XU0RMVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhZmNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS91dGlsL1dTRExVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YS5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ai5XU0RMRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMVXRpbHMgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTEFTSCA9ICIvIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX1NVRkZJWCA9ICI6Ly8iOwotCi0gIC8qKgotICAgKiBUb2tlbnMgaW4gYSBuYW1lc3BhY2UgdGhhdCBhcmUgdHJlYXRlZCBhcyBwYWNrYWdlIG5hbWUgcGFydCBzZXBhcmF0b3JzLgotICAgKiBVc2VkIGJ5IG5vcm1hbGl6ZVBhY2thZ2VOYW1lLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHBrZ1NlcGFyYXRvcnMgPSB7ICc6JywgJ1xcJywgJy8nIH07Ci0KLSAgLyoqCi0gICogVGhlc2UgYXJlIGphdmEga2V5d29yZHMgYXMgc3BlY2lmaWVkIGF0IHRoZSBmb2xsb3dpbmcgVVJMIChzb3J0ZWQgYWxwaGFiZXRpY2FsbHkpLgotICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy9qbHMvc2Vjb25kX2VkaXRpb24vaHRtbC9sZXhpY2FsLmRvYy5odG1sIzIyOTMwOAotICAqIE5vdGUgdGhhdCBmYWxzZSwgdHJ1ZSwgYW5kIG51bGwgYXJlIG5vdCBzdHJpY3RseSBrZXl3b3JkczsgdGhleSBhcmUgbGl0ZXJhbCB2YWx1ZXMsCi0gICogYnV0IGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBhcnJheSwgdGhleSBjYW4gYmUgdHJlYXRlZCBhcyBsaXRlcmFscy4KLSAgKi8KLSAgc3RhdGljIGZpbmFsIFN0cmluZyBrZXl3b3Jkc1tdID0KLSAgewotICAgICAgImFic3RyYWN0IiwgICJib29sZWFuIiwgICAgICAiYnJlYWsiLCAgICAgICJieXRlIiwgICAgICAiY2FzZSIsCi0gICAgICAiY2F0Y2giLCAgICAgImNoYXIiLCAgICAgICAgICJjbGFzcyIsICAgICAgImNvbnN0IiwgICAgICJjb250aW51ZSIsCi0gICAgICAiZGVmYXVsdCIsICAgImRvIiwgICAgICAgICAgICJkb3VibGUiLCAgICAgImVsc2UiLCAgICAgICJleHRlbmRzIiwKLSAgICAgICJmYWxzZSIsICAgICAiZmluYWwiLCAgICAgICAgImZpbmFsbHkiLCAgICAiZmxvYXQiLCAgICAgImZvciIsCi0gICAgICAiZ290byIsICAgICAgImlmIiwgICAgICAgICAgICJpbXBsZW1lbnRzIiwgImltcG9ydCIsICAgICJpbnN0YW5jZW9mIiwKLSAgICAgICJpbnQiLCAgICAgICAiaW50ZXJmYWNlIiwgICAgImxvbmciLCAgICAgICAibmF0aXZlIiwgICAgIm5ldyIsCi0gICAgICAibnVsbCIsICAgICAgInBhY2thZ2UiLCAgICAgICJwcml2YXRlIiwgICAgInByb3RlY3RlZCIsICJwdWJsaWMiLAotICAgICAgInJldHVybiIsICAgICJzaG9ydCIsICAgICAgICAic3RhdGljIiwgICAgICJzdHJpY3RmcCIsICAic3VwZXIiLAotICAgICAgInN3aXRjaCIsICAgICJzeW5jaHJvbml6ZWQiLCAidGhpcyIsICAgICAgICJ0aHJvdyIsICAgICAidGhyb3dzIiwKLSAgICAgICJ0cmFuc2llbnQiLCAidHJ1ZSIsICAgICAgICAgInRyeSIsICAgICAgICAidm9pZCIsICAgICAgInZvbGF0aWxlIiwKLSAgICAgICJ3aGlsZSIKLSAgfTsKLQotICAvKiogQ29sbGF0b3IgZm9yIGNvbXBhcmluZyB0aGUgc3RyaW5ncyAqLwotICBzdGF0aWMgZmluYWwgQ29sbGF0b3IgZW5nbGlzaENvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoTG9jYWxlLkVOR0xJU0gpOwotCi0gIC8qKiBVc2UgdGhpcyBjaGFyYWN0ZXIgYXMgc3VmZml4ICovCi0gIHN0YXRpYyBmaW5hbCBjaGFyIGtleXdvcmRQcmVmaXggPSAnXyc7Ci0KLSAgcHJpdmF0ZSBXU0RMVXRpbHMoKSB7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBzZXJ2aWNlIGVsZW1lbnQgaW4gdGhlIFdTREwgZGVmaW5pdGlvbi4KLSAgKiBAcmV0dXJuIFN0cmluZyBzZXJ2aWNlIGVsZW1lbnQgbmFtZQotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlRWxlbWVudE5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gIAlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAJcmV0dXJuIHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBvcnQgdHlwZSBlbGVtZW50IHBvaW50cyB0byBieSB0aGUgZmlyc3Qgc2VydmljZSBhbmQgcG9ydCBlbGVtZW50IGluIHRoZSBXU0RMIGRlZmluaXRpb24uCi0gICogQHJldHVybiBTdHJpbmcgcG9ydCB0eXBlIGVsZW1lbnQgbmFtZQotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0VHlwZU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gIAlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IAotICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuc2l6ZSgpO2krKykgewotICAgICAgICBpZiAocG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgcmV0dXJuIGJpbmRpbmcuZ2V0UG9ydFR5cGUoKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgCi0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwb3J0IGVsZW1lbnQgaW4gdGhlIFdTREwgZGVmaW5pdGlvbi4KLSAgKiBAcmV0dXJuIFN0cmluZyBwb3J0IG5hbWUKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gIAlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IAotICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuc2l6ZSgpO2krKykgewotICAgICAgICBpZiAocG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgCi0gICAgICAgICAgcmV0dXJuIHBvcnQuZ2V0TmFtZSgpOwotICAgICAgfSAgCi0gICAgfQotICAgICByZXR1cm4gIiI7Ci0gIH0KLQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZU5hbWVzcGFjZSAoU3RyaW5nIGNsc05hbWUpIHsKLQkgIHJldHVybiBtYWtlTmFtZXNwYWNlKGNsc05hbWUsICJodHRwIik7Ci0gIH0KLQotICAvKioKLSAgICogTWFrZSBuYW1lc3BhY2UgZnJvbSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gICAqIGFuZCB0aGUgZ2l2ZW4gcHJvdG9jb2wKLSAgICoKLSAgICogQHBhcmFtIGNsc05hbWUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAgICogQHBhcmFtIHByb3RvY29sIHByb3RvY29sIFN0cmluZwotICAgKiBAcmV0dXJuIG5hbWVzcGFjZSBuYW1lc3BhY2UgU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlTmFtZXNwYWNlIChTdHJpbmcgY2xzTmFtZSwgU3RyaW5nIHByb3RvY29sKSB7Ci0JICBpZiAoY2xzTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKQotCQkgIHJldHVybiBwcm90b2NvbCArICI6Ly8iICsgIkRlZmF1bHROYW1lc3BhY2UiOwotCSAgU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xzTmFtZS5zdWJzdHJpbmcoMCwgY2xzTmFtZS5sYXN0SW5kZXhPZignLicpKTsKLQkgIHJldHVybiBtYWtlTmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBwcm90b2NvbCk7ICAgICAgIAotICB9Ci0KLSAgICAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VOYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcHJvdG9jb2wpIHsKLQkgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsIHx8IHBhY2thZ2VOYW1lLmVxdWFscygiIikpCi0JCSAgcmV0dXJuIHByb3RvY29sICsgIjovLyIgKyAiRGVmYXVsdE5hbWVzcGFjZSI7Ci0JICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBwYWNrYWdlTmFtZSwgIi4iICk7Ci0JICBTdHJpbmdbXSB3b3JkcyA9IG5ldyBTdHJpbmdbIHN0LmNvdW50VG9rZW5zKCkgXTsKLQkgIGZvcihpbnQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkKLQkJICB3b3Jkc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotCi0JICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDgwKTsKLQkgIGZvcihpbnQgaSA9IHdvcmRzLmxlbmd0aC0xOyBpID49IDA7IC0taSkgewotCQkgIFN0cmluZyB3b3JkID0gd29yZHNbaV07Ci0JCSAgLy8gc2VwZXJhdGUgd2l0aCBkb3QKLQkJICBpZiggaSAhPSB3b3Jkcy5sZW5ndGgtMSApCi0JCQkgIHNiLmFwcGVuZCgnLicpOwotCQkgIHNiLmFwcGVuZCggd29yZCApOwotCSAgfQotCSAgcmV0dXJuIHByb3RvY29sICsgIjovLyIgKyBzYi50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJuIGEgRGVmaW5pdGlvbiBmb3IgdGhlIHdzZGwgdXJsIGdpdmVuIAotICAqCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgRGVmaW5pdGlvbiBnZXRXU0RMRGVmaW5pdGlvbihTdHJpbmcgd3NkbFVSTCkKLSAgewotICAgIGlmKHdzZGxVUkwgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0KLSAgICBXU0RMRmFjdG9yeSB3c2RsRmFjdG9yeTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICB3c2RsRmFjdG9yeSA9IG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgICAgIFdTRExSZWFkZXIgd3NkbFJlYWRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgIGRlZmluaXRpb24gPSB3c2RsUmVhZGVyLnJlYWRXU0RMKHdzZGxVUkwpOwotICAgIH0gCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC8vIGNhbiBiZSBXU0RMRXhjZXB0aW9uIG9yIElPRXhjZXB0aW9uCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVVSSTJQYWNrYWdlTmFtZShuYW1lc3BhY2UpOwotICAgICB9Ci0gICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRm9yQmluZGluZ0ltcGwoUG9ydCBwb3J0LCBNYXAgbnMycGtnTWFwKQotICB7Ci0gICAgaWYgKHBvcnQgIT0gbnVsbCAmJiBuczJwa2dNYXAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgIFFOYW1lIGJuZFFOYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGJuZFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgT2JqZWN0IHBrZyA9IG5zMnBrZ01hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgIGlmIChwa2cgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIChTdHJpbmcpcGtnOwotICAgIH0KLSAgICByZXR1cm4gZ2V0UGFja2FnZU5hbWVGb3JCaW5kaW5nSW1wbChwb3J0KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRm9yQmluZGluZ0ltcGwoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBNYXAgbnMycGtnTWFwKQotICB7Ci0gICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCAmJiBuczJwa2dNYXAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZUZvckJpbmRpbmdJbXBsKHBvcnQsIG5zMnBrZ01hcCk7Ci0gICAgfQotICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZUZvckJpbmRpbmdJbXBsKGRlZmluaXRpb24pOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVGb3JCaW5kaW5nSW1wbChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBQb3J0IHBvcnQgPSBudWxsOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgcG9ydCA9IChQb3J0KXNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdldFBhY2thZ2VOYW1lRm9yQmluZGluZ0ltcGwocG9ydCk7Ci0gIH0KLQotLy8gVGhpcyBpcyB5ZXQgYW5vdGhlciBuYW1pbmcgYWxnb3JpdGhtIGJhc2VkIG9uIHdlYnNlcnZpY2VzLmphcgotLy8gVGhleSBhbHdheXMgdXNlIHRoZSBiaW5kaW5nIG5hbWVzcGFjZSBhcyB0aGUgcGFja2FnZSBuYW1lCi0vLyBvZiB0aGUgQmluZGluZ0ltcGwgY2xhc3MuCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZUZvckJpbmRpbmdJbXBsKFBvcnQgcG9ydCkKLXsKLSAgIGlmIChwb3J0ICE9IG51bGwpCi0gICB7Ci0JICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLS8vCSAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldFBvcnRUeXBlKCk7Ci0JICBRTmFtZSBibmRRTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKTsKLQkgIFN0cmluZyBuYW1lc3BhY2UgPSBibmRRTmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQkgIHJldHVybiBuYW1lc3BhY2VVUkkyUGFja2FnZU5hbWUobmFtZXNwYWNlKTsKLSAgIH0KLSAgIHJldHVybiAiIjsKLX0KLQotLyoqCi0qIEdldCB0aGUgbmFtZXNwYWNlIGZvciB0aGUgUG9ydCBUeXBlCi0qIAotKi8KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnRUeXBlTmFtZXNwYWNlKERlZmluaXRpb24gZGVmaW5pdGlvbikKLXsKLSAgU3RyaW5nIG5hbWVzcGFjZSA9ICIiOwotICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICB7Ci0JU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyAKLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLnNpemUoKTtpKyspIHsKLSAgICAgICAgaWYgKHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuZ2V0KGkpIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpeyAKLQkgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0JICAgICAgUU5hbWUgYm5kUU5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotCSAgICAgIG5hbWVzcGFjZSA9IGJuZFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgCX0gIAotCSAgfQotICAJfQotICB9ICAKLSAgcmV0dXJuIG5hbWVzcGFjZTsKLX0KLQotLy8gVGhpcyBpcyB5ZXQgYW5vdGhlciBuYW1pbmcgYWxnb3JpdGhtIGJhc2VkIG9uIHdlYnNlcnZpY2VzLmphcgotLy8gVGhleSBhbHdheXMgdXNlIHRoZSBwb3J0dHlwZSBuYW1lc3BhY2UgYXMgdGhlIHBhY2thZ2UgbmFtZQotLy8gb2YgdGhlIEphdmEgY2xhc3MgKGluIGVqYikuCi1wdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZUZvclBvcnRUeXBlKERlZmluaXRpb24gZGVmaW5pdGlvbikKLXsKLSAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICB7Ci0JICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0UG9ydFR5cGVOYW1lc3BhY2UoZGVmaW5pdGlvbik7Ci0JICByZXR1cm4gbmFtZXNwYWNlVVJJMlBhY2thZ2VOYW1lKG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIHJldHVybiAiIjsKLX0KLQotICAvKioKLSAgKiBjaGVja3MgaWYgdGhlIGlucHV0IHN0cmluZyBpcyBhIHZhbGlkIGphdmEga2V5d29yZC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZS9mYWxzZQotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhS2V5d29yZChTdHJpbmcga2V5d29yZCkgewotICAgIHJldHVybiAoQXJyYXlzLmJpbmFyeVNlYXJjaChrZXl3b3Jkcywga2V5d29yZCwgZW5nbGlzaENvbGxhdG9yKSA+PSAwKTsKLSAgfQotCi0gIC8qKgotICAqIFR1cm4gYSBqYXZhIGtleXdvcmQgc3RyaW5nIGludG8gYSBub24tSmF2YSBrZXl3b3JkIHN0cmluZy4gIChSaWdodCBub3cKLSAgKiB0aGlzIHNpbXBseSBtZWFucyBhcHBlbmRpbmcgYW4gdW5kZXJzY29yZS4pCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VOb25KYXZhS2V5d29yZChTdHJpbmcga2V5d29yZCl7Ci0gICAgcmV0dXJuICBrZXl3b3JkUHJlZml4ICsga2V5d29yZDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUG9ydFR5cGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIFN0cmluZ0J1ZmZlciBiZWFuTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBiZWFuTmFtZS5hcHBlbmQoZ2V0UGFja2FnZU5hbWVGb3JQb3J0VHlwZShkZWZpbml0aW9uKSk7IAotICAgIGJlYW5OYW1lLmFwcGVuZChET1QpOwotICAgIGJlYW5OYW1lLmFwcGVuZChnZXRQb3J0VHlwZU5hbWUoZGVmaW5pdGlvbikpOwotICAgIHJldHVybiBiZWFuTmFtZS50b1N0cmluZygpOwotCi0gIH0KLQotICAvKioKLSAgICogZ2V0TmFtZQotICAgKiBAcGFyYW0gdXJpIFN0cmluZwotICAgKiBAcmV0dXJuIGdldCB0aGUgZmlsZSBuYW1lIGFmdGVyIHRoZSBsYXN0IFwgYW5kIC8KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWUoU3RyaW5nIHVyaSkgewotCi0JLy8gR2V0IGV2ZXJ5dGhpbmcgYWZ0ZXIgbGFzdCBzbGFzaCBvciBiYWNrc2xhc2gKLQlpbnQgYnNsYXNoID0gdXJpLmxhc3RJbmRleE9mKCJcXCIpOwotCWludCBzbGFzaCA9IHVyaS5sYXN0SW5kZXhPZigiLyIpOwotCWludCBpID0gIGJzbGFzaCA+IHNsYXNoID8gYnNsYXNoIDogc2xhc2g7Ci0JU3RyaW5nIGZpbGVOYW1lID0gdXJpLnN1YnN0cmluZyhpKzEpLnJlcGxhY2UoJz8nLCAnLicpOwotCi0JcmV0dXJuIGZpbGVOYW1lOwotICB9Ci0KLQotLyoqCi0gKiBnZXRXU0RMTmFtZQotICogQHBhcmFtIHVyaSBTdHJpbmcKLSAqIEByZXR1cm4gZ2V0IHRoZSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIGxhc3QgXCBhbmQgLywgdHJpbW1lZCwgZGVmYXVsdGVkIHRvCi0gKiAgICAgICAgICJkZWZhdWx0LndzZGwiIGlmIHRoZXJlIGlzIG5vIG5hbWUsIGFuZCBlbmRpbmcgd2l0aCAiLndzZGwiLgotICovCi0gcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NETE5hbWUoU3RyaW5nIHVyaSkgewotCi0JLy8gR2V0IGV2ZXJ5dGhpbmcgYWZ0ZXIgbGFzdCBzbGFzaCBvciBiYWNrc2xhc2ggZnJvbSBpbnB1dCBVUkkKLQkvLyB3aXRoIG5vIHdoaXRlc3BhY2UuCi0JU3RyaW5nIFdTRExOYW1lID0gZ2V0TmFtZSh1cmkpLnRyaW0oKTsKLQotCS8vIGlmIGVtcHR5LCByZXR1cm4gdGhlIGRlZmF1bHQgImRlZmF1bHQud3NkbCIKLQlpZiAoIFdTRExOYW1lLmVxdWFscyggIiIgKSApIHsKLQkJV1NETE5hbWUgPSAiZGVmYXVsdC53c2RsIjsKLQl9Ci0KLQkvLyBtYWtlIHN1cmUgbmFtZSBlbmRzIHdpdGggIi53c2RsIiwgbG93ZXIgY2FzZS4KLQllbHNlIHsKLQkJaWYgKCAhIFdTRExOYW1lLmVuZHNXaXRoKCAiLndzZGwiICkgKSB7Ci0JCQlpZiAoIFdTRExOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoICIud3NkbCIgKSApIHsKLQkJCQlpbnQgbGFzdERvdCA9IFdTRExOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0JCQkJV1NETE5hbWUgPSBXU0RMTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKSArICIud3NkbCI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlXU0RMTmFtZSA9IFdTRExOYW1lICsgIi53c2RsIjsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBXU0RMTmFtZTsKLSB9Ci0KLSAvKioKLSAgKiBnZXRQb3J0VHlwZU5hbWVGcm9tQmVhbk5hbWUKLSAgKiBAcGFyYW0gYmVhbm5hbWUgU3RyaW5nCi0gICogQHJldHVybiBnZXQgdGhlIHBvcnQgdHlwZSBuYW1lIGJhc2VkIG9uIHRoZSBiZWFuIG5hbWUKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UG9ydFR5cGVOYW1lRnJvbUJlYW5OYW1lKFN0cmluZyBiZWFuTmFtZSkgewotICAgIHJldHVybiBiZWFuTmFtZS5zdWJzdHJpbmcoYmVhbk5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwkKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFNlcnZpY2Ugc2VydmljZSwgTWFwIG5zMnBrZ01hcCkKLSAgewotICAgIGlmIChzZXJ2aWNlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGlmIChuczJwa2dNYXAgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IHBrZyA9IG5zMnBrZ01hcC5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgaWYgKHBrZyAhPSBudWxsKQotICAgICAgICAgIHJldHVybiAoU3RyaW5nKXBrZzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lc3BhY2VVUkkyUGFja2FnZU5hbWUobmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoUG9ydCBwb3J0LCBNYXAgbnMycGtnTWFwKQotICB7Ci0gICAgaWYgKHBvcnQgIT0gbnVsbCkKLSAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZShwb3J0LmdldEJpbmRpbmcoKSwgbnMycGtnTWFwKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShCaW5kaW5nIGJpbmRpbmcsIE1hcCBuczJwa2dNYXApCi0gIHsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobnMycGtnTWFwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBwa2cgPSBuczJwa2dNYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChwa2cgIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gKFN0cmluZylwa2c7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZXNwYWNlVVJJMlBhY2thZ2VOYW1lKG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFBvcnRUeXBlIHBvcnRUeXBlLCBNYXAgbnMycGtnTWFwKQotICB7Ci0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobnMycGtnTWFwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBwa2cgPSBuczJwa2dNYXAuZ2V0KG5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChwa2cgIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gKFN0cmluZylwa2c7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZXNwYWNlVVJJMlBhY2thZ2VOYW1lKG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiAiIjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIG5hbWVzcGFjZVVSSTJQYWNrYWdlTmFtZQotICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJCi0gICAqIEByZXR1cm4gcGFja2FnZSBuYW1lIGJhc2VkIG9uIG5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlVVJJMlBhY2thZ2VOYW1lKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgCS8qKgotICAJICogVE9ETzogIFRoZSBtYWtlUGFja2FnZU5hbWUgbWV0aG9kIGZyb20gCi0gIAkgKiBvcmcuYXBhY2hlLmF4aXMud3NkbC50b0phdmEuVXRpbHMgaW4gYXhpcy0xXzEgaXMgY2FsbGVkIHRvIG1hcCBuYW1lc3BhY2UgdG8gcGFja2FnZSBuYW1lLiAgCi0gIAkgKiBUaGlzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhbiBleHRlbnNpb24gcG9pbnQgdG8gcGx1ZyBpbiBydW50aW1lIGVtaXR0ZXIgc3BlY2lmaWMgbmFtZXNwYWNlIHRvIAotICAJICogcGFja2FnZSBtYXBwaW5nIGFsZ29yaXRobSAKLSAgCSAqLwotICAJcmV0dXJuIFV0aWxzLm1ha2VQYWNrYWdlTmFtZShuYW1lc3BhY2VVUkkpOwotICAJCi0vLyAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDgwKTsKLS8vICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkubGVuZ3RoKCkgPiAwKQotLy8gICAgewotLy8gICAgICBTdHJpbmcgaG9zdG5hbWUgPSBudWxsOwotLy8gICAgICB0cnkKLS8vICAgICAgewotLy8gICAgICAgIGhvc3RuYW1lID0gbmV3IFVSTChuYW1lc3BhY2VVUkkpLmdldEhvc3QoKTsKLS8vICAgICAgfQotLy8gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgICBpbnQgaW5kZXggPSBuYW1lc3BhY2VVUkkuaW5kZXhPZigiOiIpOwotLy8gICAgICAgIGlmIChpbmRleCA+IC0xKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIGhvc3RuYW1lID0gbmFtZXNwYWNlVVJJLnN1YnN0cmluZyhpbmRleCsxKTsKLS8vICAgICAgICAgIGluZGV4ID0gaG9zdG5hbWUuaW5kZXhPZigiLyIpOwotLy8gICAgICAgICAgaWYgKGluZGV4ID4gLTEpCi0vLyAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZWxzZQotLy8gICAgICAgICAgaG9zdG5hbWUgPSBuYW1lc3BhY2VVUkk7Ci0vLyAgICAgIH0KLS8vICAgICAgCi0vLwkgIC8vIGlmIHdlIGRpZG4ndCBmaWxlIGEgaG9zdG5hbWUsIGJhaWwKLS8vCSAgaWYgKGhvc3RuYW1lID09IG51bGwpIHsKLS8vCQkgIHJldHVybiBudWxsOwotLy8JICB9Ci0vLwotLy8gICAgICAvL2NvbnZlcnQgaWxsZWdhbCBqYXZhIGlkZW50aWZpZXIKLS8vICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKCctJywgJ18nKTsKLS8vICAgICAgLy8gdG9rZW5pemUgdGhlIGhvc3RuYW1lIGFuZCByZXZlcnNlIGl0Ci0vLyAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaG9zdG5hbWUsICIuIik7Ci0vLyAgICAgIFN0cmluZ1tdIHdvcmRzID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLS8vICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkKLS8vICAgICAgICB3b3Jkc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotLy8gICAgICBmb3IoaW50IGkgPSB3b3Jkcy5sZW5ndGgtMTsgaSA+PSAwOyAtLWkpCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmcgd29yZCA9IHdvcmRzW2ldOwotLy8gICAgICAgIGlmIChpc0phdmFLZXl3b3JkKHdvcmQpKQotLy8gICAgICAgICAgd29yZCA9IG1ha2VOb25KYXZhS2V5d29yZCh3b3JkKTsKLS8vICAgICAgICAvLyBzZXBlcmF0ZSB3aXRoIGRvdAotLy8gICAgICAgIGlmIChpICE9IHdvcmRzLmxlbmd0aC0xKQotLy8gICAgICAgICAgc2IuYXBwZW5kKCcuJyk7Ci0vLyAgICAgICAgLy8gY29udmVydCBkaWdpdHMgdG8gdW5kZXJzY29yZXMKLS8vICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzRGlnaXQod29yZC5jaGFyQXQoMCkpKQotLy8gICAgICAgICAgc2IuYXBwZW5kKCdfJyk7Ci0vLyAgICAgICAgICBzYi5hcHBlbmQod29yZCk7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIHJldHVybiBub3JtYWxpemVQYWNrYWdlTmFtZShzYi50b1N0cmluZygpLCBET1QuY2hhckF0KDApKTsKLSAgfQotCi0gIC8qKgotICAgKiBub3JtYWxpemVQYWNrYWdlTmFtZQotICAgKiBAcGFyYW0gcGtnCi0gICAqIEBwYXJhbSBzZXBhcmF0b3IKLSAgICogQHJldHVybiBub3JtYWxpemUgYSBTdHJpbmcgKHBhY2thZ2UgbmFtZSkgYW5kIHJlcGFsY2luZyAKLSAgICogICAgICAgICAnOicsICdcXCcsICcvJyBieSBzZXBhcmF0b3IgKERPVCkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplUGFja2FnZU5hbWUoU3RyaW5nIHBrZywgY2hhciBzZXBhcmF0b3IpCi0gIHsKLQlpZiAocGtnID09IG51bGwpIHsKLQkJcmV0dXJuIHBrZzsKLQl9Ci0JZm9yKGludCBpPTA7IGk8cGtnU2VwYXJhdG9ycy5sZW5ndGg7IGkrKykKLQkgICBwa2cgPSBwa2cucmVwbGFjZShwa2dTZXBhcmF0b3JzW2ldLCBzZXBhcmF0b3IpOwotCXJldHVybiBwa2c7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVEb3RJblBvcnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JaWYobmFtZS5pbmRleE9mKCIuIik8MCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgYm9vbGVhbiBhZnRlckRvdCA9IGZhbHNlOwotICAgIGZvcihpbnQgaT0wOyBpPG5hbWUubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgCWlmKG5hbWUuY2hhckF0KGkpPT0nLicpCi0gICAgCXsKLSAgICAJCWFmdGVyRG90ID0gdHJ1ZTsKLSAgICAJfQotICAgIAllbHNlIGlmKGFmdGVyRG90KQotICAgIAl7Ci0gICAgCQlzYi5hcHBlbmQobmFtZS5zdWJzdHJpbmcoaSxpKzEpLnRvVXBwZXJDYXNlKCkpOwotICAgIAkJYWZ0ZXJEb3Q9ZmFsc2U7Ci0gICAgCX0KLSAgICAJZWxzZQotICAgIAl7Ci0gICAgCQlzYi5hcHBlbmQobmFtZS5jaGFyQXQoaSkpOwotICAgIAl9Ci0gICAgfQotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTE1YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQnVpbGRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudAotewotICBwcml2YXRlIGJvb2xlYW4gZ2VuUHJveHlfOwotICAKLSAgcHVibGljIEF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50KCkKLSAgewotICAgIFNlcXVlbmNlRnJhZ21lbnQgcm9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgCi0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kKCksICIiKSk7Ci0gICAgLy9yb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpLCAiIikpOwotICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soKSwgIiIpKTsKLSAgICAvL3Jvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQoKSwgIiIpKTsgCi0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBWYWxpZGF0ZVdTRExDb21tYW5kKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBXU0RMMkphdmFDb21tYW5kKCksICIiKSk7IAotICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBTdHViMkJlYW5Db21tYW5kKCksICIiKSk7Ci0gICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgCi0gICAgc2V0Q29uZGl0aW9uKCBuZXcgQ29uZGl0aW9uKCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlblByb3h5XzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCByb290ICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gZ2VuUHJveHkgKQotICB7Ci0gICAgZ2VuUHJveHlfID0gZ2VuUHJveHk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc0NsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNDbGllbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDQ4ZWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc0NsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ29weUF4aXNKYXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlJlZnJlc2hQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLlN0dWIyQmVhbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5WYWxpZGF0ZVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50RnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IAotewotCi0JcHVibGljIEF4aXNDbGllbnRGcmFnbWVudCgpIAotCXsKLQkJLy9hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLQkJYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiQXhpc0NsaWVudFN0YXJ0IikpOwotCQlhZGQobmV3IE1hcHBpbmdGcmFnbWVudCgpKTsKLQkJYWRkKG5ldyBBeGlzQ2xpZW50Q29tbWFuZHNGcmFnbWVudCgpKTsKLQkJLy8gVE9ETzogTG9vayBpbnRvIEFkZFdTREx0b1dTSUxDb21tYW5kIGZvciB0aGUgY2xpZW50IHNjZW5hcmlvCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkpIAotCXsKLQkJLy8gQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsCi0JCQkJbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFJ1bnRpbWUiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRSdW50aW1lSUQiLAotCQkJCW51bGwpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLQkJCQkiQ2xpZW50UHJvamVjdEVBUiIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSTCIsIG51bGwpOyAvLyBVUkkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCS8vIFVSTAotCQkvLyB0cmFuc2Zvcm1lcgotCQkvLyByZXEnZD8/Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0UHJveHlTZWxlY3RlZCIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLQkJCQkiVGVzdFByb3h5U2VsZWN0ZWQiLCBudWxsKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc0NsaWVudFNjZW5hcmlvIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotCQkvLyBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5jbGFzcyk7IC8vT0sKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5jbGFzcywgIldzZGxTZXJ2aWNlVVJMIiwgbnVsbCk7IC8vT0sKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQuY2xhc3MpOyAvL09LCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ3VzdG9taXplQ2xpZW50TWFwcGluZ3MiLCBNYXBwaW5nRnJhZ21lbnQuY2xhc3MgKTsgICAgCi0JCS8vcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0JCS8vICJTZXJ2aWNlUHJvamVjdCIsCi0JCS8vIENyZWF0ZVdlYlByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkJLy9yZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLQkJLy8gIkVKQlByb2plY3ROYW1lIiwKLQkJLy8gQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQuY2xhc3MpOwotCQkvLyBDb3B5QXhpc0phckNvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDb3B5QXhpc0phckNvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbnVsbCk7Ci0JCS8vIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suY2xhc3MsICJQcm9qZWN0IiwgbnVsbCk7Ci0JCS8vIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kKCkgLy8gamF2YVBhcmFtXywgbW9kZWxfCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3QiLAotCQkJCW51bGwpOwotCQkvLwkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwKLQkJLy8gRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuY2xhc3MsIldTRExTZXJ2aWNlUGF0aG5hbWUiLG51bGwpOwotCQkvLyAvLwotCQkvLyBVUkwgdG8gVVJMPz8KLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuY2xhc3MsICJXU0RMU2VydmljZVVSTCIsIG51bGwpOyAvLyBVUkkKLQkJLy8gdG8KLQkJLy8gVVJMPz8KLQkJLy8gVmFsaWRhdGVXU0RMQ29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxTZXJ2aWNlVVJMIiwgVmFsaWRhdGVXU0RMQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBWYWxpZGF0ZVdTRExDb21tYW5kLmNsYXNzKTsKLQkJLy8gV1NETDJKYXZhQ29tbWFuZCgpIC8vIGphdmFQYXJhbV8KLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSTCIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgbnVsbCk7IC8vIFVSTAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBVUkk/PwotCQkvLyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBSZWZyZXNoUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbnVsbCk7Ci0JCS8vIFN0dWIyQmVhbkNvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBTdHViMkJlYW5Db21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFN0dWIyQmVhbkNvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBTdHViMkJlYW5Db21tYW5kLmNsYXNzKTsKLQkJLy8gQnVpbGRQcm9qZWN0Q29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbnVsbCk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRm9yY2VCdWlsZCIsIEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlZhbGlkYXRpb25NYW5hZ2VyIiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoU3R1YjJCZWFuQ29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm94eUJlYW4iLCBudWxsKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXRFbmRwb2ludE1ldGhvZCIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBNYXBwaW5nRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQgewotCi0JCXByaXZhdGUgYm9vbGVhbiBzaG93TWFwcGluZ3NfOwotCQlwdWJsaWMgTWFwcGluZ0ZyYWdtZW50KCkgewotCi0JCQlzdXBlcigpOwotCQkJc2V0VHJ1ZUZyYWdtZW50KG5ldyBTaW1wbGVGcmFnbWVudCgiQXhpc0NsaWVudEJlYW5NYXBwaW5nIikpOwotCQkJc2V0Q29uZGl0aW9uKG5ldyBDb25kaXRpb24oKSB7Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpIHsKLQotCQkJCQlyZXR1cm4gc2hvd01hcHBpbmdzXzsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVDbGllbnRNYXBwaW5ncyhib29sZWFuIHNob3dNYXBwaW5ncykgewotCi0JCQlzaG93TWFwcGluZ3NfID0gc2hvd01hcHBpbmdzOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc01hcHBpbmdzRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc01hcHBpbmdzRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3MTU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNNYXBwaW5nc0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc01hcHBpbmdzRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIHNob3dNYXBwaW5nc187Ci0KLSAgcHVibGljIEF4aXNNYXBwaW5nc0ZyYWdtZW50KCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCBuZXcgU2ltcGxlRnJhZ21lbnQoICJBeGlzTWFwcGluZ3NXaWRnZXQiICkpOwotICAgIHNldENvbmRpdGlvbiggbmV3IENvbmRpdGlvbigpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG93TWFwcGluZ3NfOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9ICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNob3dNYXBwaW5nKCBib29sZWFuIHNob3dNYXBwaW5ncyApCi0gIHsKLSAgICBzaG93TWFwcGluZ3NfID0gc2hvd01hcHBpbmdzOwotICB9ICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzTWFwcGluZ3NXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQXhpc01hcHBpbmdzV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzFhMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzTWFwcGluZ3NXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuVGFibGVWaWV3ZXJXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIEF4aXNNYXBwaW5nc1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlcldpZGdldCBtYXBwaW5nc187Ci0KLSAgcHJpdmF0ZSBieXRlIG1vZGVfOwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJfOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBNT0RFX0JFQU4yWE1MID0gKGJ5dGUpMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfWE1MMkJFQU4gPSAoYnl0ZSkxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9YTUwyUFJPWFkgPSAoYnl0ZSkyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9YTUwyRUpCID0gKGJ5dGUpMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfRUpCMlhNTCA9IChieXRlKTQ7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBQ0tBR0UgPSAiZGVmYXVsdC5qYXZhcGFja2FnZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRVNQQUNFID0gImh0dHA6Ly9kZWZhdWx0Lm5hbWVzcGFjZSI7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdKTTAwMDEgZm9yIHRoZSBXU0RMIHRvIEphdmEgTWFwcGluZ3MgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdKTV9QQUdFID0gIlBXSk0wMDAxIjsgLy8kTk9OLU5MUy0xJAotICAKLSAgcHVibGljIEF4aXNNYXBwaW5nc1dpZGdldCggYnl0ZSBtb2RlICkKLSAgewotICAgIG1vZGVfID0gbW9kZTsKLSAgfQotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICAgICAgCi0gICAgLy8gVE9ETyBUaGUgVE9PTFRJUF9QV0pNX1BBR0Uga2V5IGRvZXNuJ3Qgc2VlbSB0byBleGlzdCBhbnl3aGVyZT8/PwotCS8vcGFyZW50LnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiVE9PTFRJUF9QV0pNX1BBR0UiICkgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUFdKTV9QQUdFICk7Ci0gICAgCi0gICAgLy8gVE9ETyBObyB0b29sdGlwIG9yIGluZm9wb3AgZm9yIHRoaXMgZ3JvdXAuCi0gICAgR3JvdXAgbWFwcGluZ0dyb3VwID0gdWlVdGlscy5jcmVhdGVHcm91cCggcGFyZW50LCAiTEFCRUxfTUFQUElOR19QQUlSUyIsIG51bGwsIG51bGwgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBpbml0VmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIGlmKCBtb2RlXyA9PSBNT0RFX0JFQU4yWE1MIHx8IG1vZGVfID09IE1PREVfRUpCMlhNTCkgCi0gICAgewotCQlTdHJpbmdbXSBjb2x1bW5zID0geyBtc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9DT0xVTU5fTEFCRUxfUEFDS0FHRSIpLAotCQkgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9DT0xVTU5fTEFCRUxfTkFNRVNQQUNFIiApfTsKLQkJbWFwcGluZ3NfID0gbmV3IFRhYmxlVmlld2VyV2lkZ2V0KCBjb2x1bW5zLCBpbml0VmFsdWVzLCBuZXcgU3RyaW5nW10ge0RFRkFVTFRfUEFDS0FHRSwgREVGQVVMVF9OQU1FU1BBQ0V9LCBUYWJsZVZpZXdlcldpZGdldC5NQVBfT05FX1RPX09ORSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0JZWxzZSAKLQl7Ci0gICAgICAJU3RyaW5nW10gY29sdW1ucyA9IHsgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiVEFCTEVfQ09MVU1OX0xBQkVMX05BTUVTUEFDRSIpLAotCQkgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9DT0xVTU5fTEFCRUxfUEFDS0FHRSIpfTsKLQkJbWFwcGluZ3NfID0gbmV3IFRhYmxlVmlld2VyV2lkZ2V0KCBjb2x1bW5zLCBpbml0VmFsdWVzLCBuZXcgU3RyaW5nW10ge0RFRkFVTFRfTkFNRVNQQUNFLCBERUZBVUxUX1BBQ0tBR0UgfSwgVGFibGVWaWV3ZXJXaWRnZXQuTUFQX01BTllfVE9fT05FKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgICAKLQltYXBwaW5nc18uYWRkQ29udHJvbHMoIG1hcHBpbmdHcm91cCwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gbWFwcGluZ3NfLmdldFN0YXR1cygpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEphdmFQYXJhbWV0ZXIoIEphdmFXU0RMUGFyYW1ldGVyIHBhcmFtZXRlciApCi0gIHsKLSAgICBqYXZhUGFyYW1ldGVyXyA9IHBhcmFtZXRlcjsKLSAgfQotICAKLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFQYXJhbWV0ZXIoKQotICB7Ci0gICAgaWYoIG1vZGVfID09IE1PREVfQkVBTjJYTUwgfHwgbW9kZV8gPT0gTU9ERV9FSkIyWE1MIHx8IG1vZGVfID09IE1PREVfWE1MMkJFQU4gfHwgbW9kZV8gPT0gTU9ERV9YTUwyUFJPWFkpCi0gICAgewotICAgICAgLy9TZXQgdGhlIG1hcHBpbmdzIG9uIGphdmFQYXJhbWV0ZXIKLSAgICAgIFRhYmxlSXRlbVtdIHBhaXJzID0gbWFwcGluZ3NfLmdldEl0ZW1zKCk7Ci0gIAkgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCSAgZm9yIChpbnQgaT0wOyBpPHBhaXJzLmxlbmd0aDsgaSsrKQotICAJICB7Ci0gIAkJbWFwLnB1dChwYWlyc1tpXS5nZXRUZXh0KDApLHBhaXJzW2ldLmdldFRleHQoMSkpOwotICAJICB9Ci0gIAkgIGphdmFQYXJhbWV0ZXJfLnNldE1hcHBpbmdzKG1hcCk7Ci0gIAkgIAotICAJICAvL1NldCB0aGUgbmFtZXNwYWNlIG9uIHRoZSBqYXZhUGFyYW1ldGVyCi0gIAkgIFN0cmluZyBiZWFuTmFtZSA9IGphdmFQYXJhbWV0ZXJfLmdldEJlYW5OYW1lKCk7Ci0JICBpZihiZWFuTmFtZSAhPSBudWxsICYmICFiZWFuTmFtZS5lcXVhbHMoIiIpKQotCSAgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBiZWFuTmFtZS5zdWJzdHJpbmcoMCwgYmVhbk5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JCWlmKG1hcC5jb250YWluc0tleShwYWNrYWdlTmFtZSkpCi0JCXsKLQkJICBTdHJpbmcgdG5zID0gKFN0cmluZyltYXAuZ2V0KHBhY2thZ2VOYW1lKTsKLQkJICBqYXZhUGFyYW1ldGVyXy5zZXROYW1lc3BhY2UodG5zKTsKLQkJfQkJCi0JICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIGphdmFQYXJhbWV0ZXJfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNQcm94eVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BeGlzUHJveHlXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlNGM2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aWRnZXRzL0F4aXNQcm94eVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIEF4aXNQcm94eVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiOwotICAKLSAgLypDT05URVhUX0lEIFBXSkIwMDAxIGZvciB0aGUgV1NETCB0byBKYXZhIEJpbmRpbmdzIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BXSkJfUEFHRSA9ICJQV0pCMDAwMSI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QV0pCX1BBR0UgPSAiVE9PTFRJUF9QV0pCX1BBR0UiOwotCQkKLSAgcHJpdmF0ZSBUZXh0IGZvbGRlclRleHRfOwotICAvKkNPTlRFWFRfSUQgUFdKQjAwMDMgZm9yIHRoZSBGb2xkZXIgZmllbGQgb2YgdGhlIFdTREwgdG8gSmF2YSBCaW5kaW5ncyBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QV0pCX1RFWFRfRk9MREVSID0gIlBXSkIwMDAzIjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BXSkJfVEVYVF9GT0xERVIgPSAiVE9PTFRJUF9QV0pCX1RFWFRfRk9MREVSIjsKLQotICBwcml2YXRlIEJ1dHRvbiBnZW5Qcm94eUNoZWNrYm94XzsKLSAgLypDT05URVhUX0lEIFBXSkIwMDA5IEluZGljYXRlcyB3aGV0aGVyIHRvIGdlbmVyYXRlIGEgcHJveHkgb3Igbm90LiAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BXSkJfQ0hFQ0tCT1hfR0VOUFJPWFkgPSAiUFdKQjAwMDkiOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUFdKQl9DSEVDS0JPWF9HRU5QUk9YWSA9ICJUT09MVElQX1BXSkJfQ0hFQ0tCT1hfR0VOUFJPWFkiOwotCQkKLSAgcHJpdmF0ZSBCdXR0b24gc2hvd01hcHBpbmdzQ2hlY2tib3hfOwotICAvKkNPTlRFWFRfSUQgUFdKQjAwMTYgZm9yIHRoZSBTaG93IE1hcHBpbmdzIGNoZWNrYm94IG9mIHRoZSBCZWFuIE1ldGhvZHMgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfTjJQX1NIT1dfTUFQUElOR1MgPSAiUFdKQjAwMTYiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMobXNnVXRpbHMsIHBsdWdpbklkXyApOwotICAgIAotCXBhcmVudC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHMuZ2V0TWVzc2FnZSggVE9PTFRJUF9QV0pCX1BBR0UgKSApOwotCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIHBhcmVudCwgcGx1Z2luSWRfICsgIi4iICsgIElORk9QT1BfUFdKQl9QQUdFKTsKLSAgICAKLSAgICBnZW5Qcm94eUNoZWNrYm94XyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goIHBhcmVudCwgIkNIRUNLQk9YX0dFTlBST1hZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUFdKQl9DSEVDS0JPWF9HRU5QUk9YWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdKQl9DSEVDS0JPWF9HRU5QUk9YWSApOwotICAgIGdlblByb3h5Q2hlY2tib3hfLmFkZExpc3RlbmVyKCBTV1QuU2VsZWN0aW9uLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIGdlblByb3h5Q2hlY2tib3hfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5Qcm94eSgpOyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBDb21wb3NpdGUgdGV4dEdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMiwgNSwgMCApOwotICAgIAotICAgIGZvbGRlclRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCB0ZXh0R3JvdXAsICJMQUJFTF9GT0xERVJfTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUFdKQl9URVhUX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV0pCX1RFWFRfRk9MREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICBmb2xkZXJUZXh0Xy5hZGRMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICBzaG93TWFwcGluZ3NDaGVja2JveF8gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KCBwYXJlbnQsICJMQUJFTF9FWFBMT1JFX01BUFBJTkdTX1hNTDJCRUFOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9OMlBfU0hPV19NQVBQSU5HUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9OMlBfU0hPV19NQVBQSU5HUyApOwotICAgIC8vIFNpbmNlIHRoaXMgd2lkZ2V0IGFmZmVjdHMgd2hldGhlciB0aGUgbmV4dCBwYWdlIGlzIHNob3duIG9yIG5vdCB3ZQotICAgIC8vIG5lZWQgdG8gYWRkIHRoZSBzdGF0dXNMaXN0ZW5lci4KLSAgICBzaG93TWFwcGluZ3NDaGVja2JveF8uYWRkTGlzdGVuZXIoIFNXVC5TZWxlY3Rpb24sIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVHZW5Qcm94eSgpCi0gIHsKLSAgICBib29sZWFuIGVuYWJsZWQgPSBnZW5Qcm94eUNoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBmb2xkZXJUZXh0Xy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfLnNldEVuYWJsZWQoIGVuYWJsZWQgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlGb2xkZXIoIFN0cmluZyBwcm94eUZvbGRlciApCi0gIHsKLSAgICBmb2xkZXJUZXh0Xy5zZXRUZXh0KCBwcm94eUZvbGRlciApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlGb2xkZXIoKQotICB7Ci0gICAgIHJldHVybiBmb2xkZXJUZXh0Xy5nZXRUZXh0KCk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggQm9vbGVhbiBnZW5Qcm94eSApCi0gIHsKLSAgICBnZW5Qcm94eUNoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIGdlblByb3h5LmJvb2xlYW5WYWx1ZSgpICk7Ci0gIH0gICAgCi0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2VuUHJveHlDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfSAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0Q3VzdG9taXplQ2xpZW50TWFwcGluZ3MoIGJvb2xlYW4gc2hvd01hcHBpbmdzICkKLSAgewotICAgIHNob3dNYXBwaW5nc0NoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIHNob3dNYXBwaW5ncyApOwotICB9ICAgICAgICAgICAgCi0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDdXN0b21pemVDbGllbnRNYXBwaW5ncygpCi0gIHsKLSAgICByZXR1cm4gc2hvd01hcHBpbmdzQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpICYmIGdlblByb3h5Q2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9ICAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0NsaWVudFNjZW5hcmlvKCBib29sZWFuIGlzQ2xpZW50U2NlbmFyaW8gKQotICB7Ci0gICAgZ2VuUHJveHlDaGVja2JveF8uc2V0RW5hYmxlZCggIWlzQ2xpZW50U2NlbmFyaW8gKTsgCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9EZWZhdWx0c0ZvckNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9EZWZhdWx0c0ZvckNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTQ0NmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvRGVmYXVsdHNGb3JDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0c0ZvckNsaWVudCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIGN1c3RvbWl6ZU1hcHBpbmdzXyA9IHRydWU7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDdXN0b21pemVDbGllbnRNYXBwaW5ncygpCi0gIHsKLSAgICByZXR1cm4gY3VzdG9taXplTWFwcGluZ3NfOwotICB9IAotICAKLSAgcHVibGljIHZvaWQgc2V0Q3VzdG9taXplQ2xpZW50TWFwcGluZ3MoIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgY3VzdG9taXplTWFwcGluZ3NfID0gdmFsdWU7IAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb3h5Rm9sZGVyKCkKLSAgewotICAgICByZXR1cm4gIi9wcm94eXByb2plY3QvbXlmb2xkZXIiOyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9jbGllbnQvV2ViU2VydmljZUNsaWVudEF4aXNUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93aXphcmQvY2xpZW50L1dlYlNlcnZpY2VDbGllbnRBeGlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODkyYzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9jbGllbnQvV2ViU2VydmljZUNsaWVudEF4aXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5BeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkuY29tbWFuZC5EZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc0NsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc01hcHBpbmdzV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc1Byb3h5V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLQotLyoqCi0gICogRGV2ZWxvcGVycyB3aG8gYXJlIGFkZGluZyB3ZWIgc2VydmljZSBjbGllbnRzIGludG8gdGhlIHdpemFyZCBzaG91bGQgY3JlYXRlCi0gICogYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UuICAKLSoqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRBeGlzVHlwZSBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nIAotewotCi0JCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgCi0gIHsKLSAgCS8vIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZCAgCQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDdXN0b21pemVDbGllbnRNYXBwaW5ncyIsIEF4aXNQcm94eVdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3RGb2xkZXIiLCBBeGlzUHJveHlXaWRnZXQuY2xhc3MsICJQcm94eUZvbGRlciIsIG51bGwgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEF4aXNQcm94eVdpZGdldC5jbGFzcyk7ICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc0NsaWVudFNjZW5hcmlvIiwgQXhpc1Byb3h5V2lkZ2V0LmNsYXNzKTsgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgbnVsbCk7Ci0gICAgCi0gICAgLy8gQXhpc1Byb3h5V2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIEF4aXNQcm94eVdpZGdldC5jbGFzcywgIkN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzIiwgQXhpc0NsaWVudEZyYWdtZW50Lk1hcHBpbmdGcmFnbWVudC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBBeGlzUHJveHlXaWRnZXQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQXhpc0NsaWVudENvbW1hbmRzRnJhZ21lbnQuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQXhpc1Byb3h5V2lkZ2V0LmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MgKTsKLSAgICAKLSAgICAvL0F4aXNNYXBwaW5nc1dpZGdldAotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAvL09LCi0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAvL09LCi0JZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7IC8vT0sKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsgLy9PSwotCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBTdHViMkJlYW5Db21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAvL09LCi0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkgCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfICAgICA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIFN0cmluZyAgICAgICBheGlzUGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBNZXNzYWdlVXRpbHMgYXhpc01zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggYXhpc1BsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkF4aXNDbGllbnRTdGFydCIsIAotICAgICAgICBheGlzTXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19BWElTX1BST1hZIiksCi0gICAgICAgIGF4aXNNc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfQVhJU19QUk9YWSIpLAotICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc1Byb3h5V2lkZ2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQXhpc0NsaWVudEJlYW5NYXBwaW5nIiwgCi0gICAgICAgIGF4aXNNc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1hNTDJQUk9YWSIpLAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfTjJQX01BUFBJTkdTIiksCi0gICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBeGlzTWFwcGluZ3NXaWRnZXQoQXhpc01hcHBpbmdzV2lkZ2V0Lk1PREVfWE1MMlBST1hZICk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXhpc0NsaWVudEZyYWdtZW50KCk7IAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkgCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL3Rlc3QvVGVzdFdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC90ZXN0L1Rlc3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmE1ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL3Rlc3QvVGVzdFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV2ViU2VydmljZXNDbGllbnREYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQXhpc0NsaWVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLS8qCi0gKiBBZGQgdGhlIHN0dWZmIGJlbG93IHRvIHRoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gbWFrZSB0aGlzIHdvcmsuIAotIwotI1Rlc3Qgb25seSAtIGRvIG5vdCBjb21taXQKLSMKLXdzZGxVUkk9d3NkbFVSSQotY2xpZW50UHJvamVjdD1jbGllbnRQcm9qZWN0Ci1zZXJ2aWNlUU5hbWU9c2VydmljZVFOYW1lCi1vdXRwdXRXU0RMcGF0aD1vdXRwdXRXU0RMcGF0aAotR089R08KLXBvcDE9cG9wMQotcG9wMj1wb3AyCi0qLwotcHVibGljIGNsYXNzIFRlc3RXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF89ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgCi0gIHByaXZhdGUgVGV4dCB3c2RsVVJJVGV4dF87Ci0gIHByaXZhdGUgVGV4dCBjbGllbnRQcm9qZWN0VGV4dF87Ci0gIHByaXZhdGUgVGV4dCBzZXJ2aWNlUU5hbWVUZXh0XzsKLSAgcHJpdmF0ZSBUZXh0IG91dHB1dFdTRExQYXRoVGV4dF87Ci0gIHByaXZhdGUgQnV0dG9uIGdvQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gcG9wMUJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIHBvcDJCdXR0b25fOwotICAKLSAgcHVibGljIFRlc3RXaXphcmRQYWdlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gICAgc2V0VGl0bGUoIlRlc3QgUGFnZSIpOwotICAgIHNldERlc2NyaXB0aW9uKCJUZXN0IHBhZ2UgZGVzY3JpcHRpb24iKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIHBhZ2UgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHBhZ2Uuc2V0TGF5b3V0KGdsKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBwYWdlLnNldExheW91dERhdGEoZ2QpOwotICAgIHBhZ2Uuc2V0U2l6ZSg1MDAsNTAwKTsKLQotICAgCi0JLy9Db21wb3NpdGUgb3V0ZXJHcm91cF8gPSBuZXcgQ29tcG9zaXRlKHBhZ2UsU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQlDb21wb3NpdGUgb3V0ZXJHcm91cF8gPSBuZXcgQ29tcG9zaXRlKHBhZ2UsU1dULk5PTkUpOwotCUdyaWRMYXlvdXQgZ2wyID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlnbDIubnVtQ29sdW1ucyA9IDI7Ci0JZ2wyLm1hcmdpbkhlaWdodCA9IDA7Ci0JZ2wyLm1hcmdpbldpZHRoID0gMDsKLQlvdXRlckdyb3VwXy5zZXRMYXlvdXQoZ2wyKTsKLQkvL0dyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCW91dGVyR3JvdXBfLnNldExheW91dERhdGEoZ2QyKTsKLQkKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBwbHVnaW5JZF8pOwotICAgIAotICAgIHdzZGxVUklUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dChvdXRlckdyb3VwXywid3NkbFVSSSIsIndzZGxVUkkiLCJ3c2RsVVJJIixTV1QuU0lOR0xFfFNXVC5CT1JERVIpOwotICAgIGNsaWVudFByb2plY3RUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dChvdXRlckdyb3VwXywiY2xpZW50UHJvamVjdCIsImNsaWVudFByb2plY3QiLCJjbGllbnRQcm9qZWN0IixTV1QuU0lOR0xFfFNXVC5CT1JERVIpOwotICAgIHNlcnZpY2VRTmFtZVRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KG91dGVyR3JvdXBfLCJzZXJ2aWNlUU5hbWUiLCJzZXJ2aWNlUU5hbWUiLCIiLFNXVC5TSU5HTEV8U1dULkJPUkRFUik7Ci0gICAgb3V0cHV0V1NETFBhdGhUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dChvdXRlckdyb3VwXywib3V0cHV0V1NETHBhdGgiLCJvdXRwdXRXU0RMcGF0aCIsIiIsU1dULlNJTkdMRXxTV1QuQk9SREVSKTsKLSAgICBnb0J1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZUJ1dHRvbihTV1QuUFVTSCxvdXRlckdyb3VwXywiR08iLCJHTyIsIiIpOwotICAgIGdvQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVHT1B1c2hlZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVHT1B1c2hlZCgpOwotICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIHBvcDFCdXR0b25fID0gdWlVdGlscy5jcmVhdGVCdXR0b24oU1dULlBVU0gsb3V0ZXJHcm91cF8sInBvcDEiLCJwb3AxIiwiIik7Ci0gICAgcG9wMUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlUG9wMVB1c2hlZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVQb3AxUHVzaGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgfSk7ICAgIAotICAgIHBvcDJCdXR0b25fID0gdWlVdGlscy5jcmVhdGVCdXR0b24oU1dULlBVU0gsb3V0ZXJHcm91cF8sInBvcDIiLCJwb3AyIiwiIik7Ci0gICAgcG9wMkJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlUG9wMlB1c2hlZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBoYW5kbGVQb3AyUHVzaGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgfSk7ICAgIAotIAotICAgIHNldENvbnRyb2wocGFnZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVQb3AxUHVzaGVkKCkKLSAgewotICAgIHdzZGxVUklUZXh0Xy5zZXRUZXh0KCJodHRwOi8vd3d3LnhtZXRob2RzLm5ldC9zZC8yMDAxL1RlbXBlcmF0dXJlU2VydmljZS53c2RsIik7Ci0gICAgY2xpZW50UHJvamVjdFRleHRfLnNldFRleHQoImN3cCIpOwotICAgIHNlcnZpY2VRTmFtZVRleHRfLnNldFRleHQoImh0dHA6Ly93d3cueG1ldGhvZHMubmV0L3NkL1RlbXBlcmF0dXJlU2VydmljZS53c2RsOlRlbXBlcmF0dXJlU2VydmljZSIpOwotICAgIG91dHB1dFdTRExQYXRoVGV4dF8uc2V0VGV4dCgiL2N3cC9XZWIgQ29udGVudC9XRUItSU5GL3dzZGwvVGVtcGVyYXR1cmVTZXJ2aWNlLndzZGwiKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBvcDJQdXNoZWQoKQotICB7Ci0gICAgd3NkbFVSSVRleHRfLnNldFRleHQoImZpbGU6L0Q6L0VjbGlwc2UvZWNsaXBzZS9ydW50aW1lLXdvcmtzcGFjZV90MS93cDIvV2ViIENvbnRlbnQvQ29udmVydGVycy53c2RsIik7Ci0gICAgY2xpZW50UHJvamVjdFRleHRfLnNldFRleHQoImN3cDIiKTsKLSAgICBzZXJ2aWNlUU5hbWVUZXh0Xy5zZXRUZXh0KCJodHRwOi8vc2FtcGxlLmNvbnZlcnRlcnM6Q29udmVydERpc3RhbmNlU2VydmljZSIpOwotICAgIG91dHB1dFdTRExQYXRoVGV4dF8uc2V0VGV4dCgiL2N3cDIvV2ViIENvbnRlbnQvV0VCLUlORi93c2RsL0NvbnZlcnRlcnMud3NkbCIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUdPUHVzaGVkKCkKLSAgewotICAgIEF4aXNDbGllbnRHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IEF4aXNDbGllbnRHZW5lcmF0b3IoKTsKLSAgICBUZXN0V1NDRGF0YUhlbHBlciBkYXRhTW9kZWwgPSBuZXcgVGVzdFdTQ0RhdGFIZWxwZXIoKTsKLSAgICBkYXRhTW9kZWwucG9wdWxhdGUod3NkbFVSSVRleHRfLmdldFRleHQoKSwgc2VydmljZVFOYW1lVGV4dF8uZ2V0VGV4dCgpLCBjbGllbnRQcm9qZWN0VGV4dF8uZ2V0VGV4dCgpLCBvdXRwdXRXU0RMUGF0aFRleHRfLmdldFRleHQoKSxmYWxzZSk7Ci0gICAgCi0gICAgZ2VuZXJhdG9yLmdlbldlYlNlcnZpY2VDbGllbnRBcnRpZmFjdHMoZGF0YU1vZGVsKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRlZCBzZXJ2aWNlIGludGVyZmFjZT0gIitkYXRhTW9kZWwuZ2V0U2VydmljZUludGVyZmFjZU5hbWUoKSk7Ci0gICAgU3RyaW5nW10gc2VpcyA9IGRhdGFNb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lcygpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGVkIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlczoiKTsKLSAgICBmb3IgKGludCBpPTA7aTxzZWlzLmxlbmd0aDtpKyspCi0gICAgewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oc2Vpc1tpXSk7Ci0gICAgfQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG91Y2hlZCBkZXNjcmlwdG9ycz8gIitkYXRhTW9kZWwuc2hvdWxkR2VuRGVzY3JpcHRvcnMoKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgVGVzdFdTQ0RhdGFIZWxwZXIgaW1wbGVtZW50cyBXZWJTZXJ2aWNlc0NsaWVudERhdGFIZWxwZXIKLSAgewotICAJcHJpdmF0ZSBTdHJpbmcgd3NkbFVybF87Ci0gIAlwcml2YXRlIFN0cmluZyBzZXJ2aWNlUU5hbWVfOwotICAJcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWVfOwotICAJcHJpdmF0ZSBTdHJpbmcgb3V0cHV0V1NETEZpbGVOYW1lXzsKLSAgCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VJbnRlcmZhY2VOYW1lXzsKLSAgCXByaXZhdGUgU3RyaW5nW10gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXNfOwotICAJcHJpdmF0ZSBib29sZWFuIHNob3VsZERlcGxveV87Ci0gIAlwcml2YXRlIGJvb2xlYW4gc2hvdWxkR2VuRGVzY3JpcHRvcnNfOwotICAJCi0gIAlwdWJsaWMgdm9pZCBwb3B1bGF0ZShTdHJpbmcgd3NkbFVSTCwgU3RyaW5nIHNlcnZpY2VRTmFtZSwgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgb3V0cHV0V1NETEZpbGVOYW1lLCBib29sZWFuIHNob3VsZERlcGxveSkKLSAgCXsKLSAgCQl3c2RsVXJsXyA9IHdzZGxVUkw7Ci0gIAkJc2VydmljZVFOYW1lXyA9IHNlcnZpY2VRTmFtZTsKLSAgCQlwcm9qZWN0TmFtZV8gPSBwcm9qZWN0TmFtZTsKLSAgCQlvdXRwdXRXU0RMRmlsZU5hbWVfID0gb3V0cHV0V1NETEZpbGVOYW1lOwotICAJCXNob3VsZERlcGxveV8gPSBzaG91bGREZXBsb3k7Ci0gIAl9Ci0JLyoqCi0JICogQHJldHVybiB0aGUgVVJMIGZvciB0aGUgYXNzb2NpYXRlZCBvcmlnaW5hbCBXU0RMIGZpbGUgcmVmZXJlbmNlZCBieSB0aGUgY2xpZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRXU0RMVXJsKCkKLQl7Ci0JCXJldHVybiB3c2RsVXJsXzsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgUU5hbWUgZm9yIHRoZSBhc3NvY2lhdGVkIHdlYiBzZXJ2aWNlIGZvciB0aGUgY2xpZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUU5hbWUoKQotCXsKLQkJcmV0dXJuIHNlcnZpY2VRTmFtZV87Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBwcm9qZWN0IGZvciB0aGUgd2ViIHNlcnZpY2UgY2xpZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpCi0JewotCQlyZXR1cm4gcHJvamVjdE5hbWVfOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBmaWxlTmFtZSBsb2NhdGlvbiBmb3IgdGhlIGNvcGllZCBXU0RMIGZpbGUgaW50byB0aGUgY2xpZW50IHByb2plY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFdTRExGaWxlTmFtZSgpCi0JewotCQlyZXR1cm4gb3V0cHV0V1NETEZpbGVOYW1lXzsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSW50ZXJmYWNlTmFtZSgpCi0JewotCQlyZXR1cm4gc2VydmljZUludGVyZmFjZU5hbWVfOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXMoKQotCXsKLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWVzXzsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgZGVwbG95bWVudD8KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZXBsb3koKQotCXsKLQkJcmV0dXJuIHNob3VsZERlcGxveV87Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZXh0ZW5zaW9uIGdlbmVyYXRlZCB0aGUgZGVzY3JpcHRvcnMgb3Igbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkR2VuRGVzY3JpcHRvcnMoKQotCXsKLQkJcmV0dXJuIHNob3VsZEdlbkRlc2NyaXB0b3JzXzsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBTSSBjbGFzc25hbWUgZm9yIHRoZSB3ZWIgc2VydmljZSBjbGllbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW50ZXJmYWNlTmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCXNlcnZpY2VJbnRlcmZhY2VOYW1lXyA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBTRUkgY2xhc3NuYW1lcyBmb3IgdGhlIHdlYiBzZXJ2aWNlIGNsaWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWVzKFN0cmluZ1tdIG5hbWVzKQotCXsKLQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZXNfID0gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgZGVzY3JpcHRvcnMgd2VyZSBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWRHZW5EZXNjcmlwdG9ycyhib29sZWFuIGIpCi0JewotCQlzaG91bGRHZW5EZXNjcmlwdG9yc18gPSBiOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGludm9rZSBhbnkgb3BlcmF0aW9ucyByZXF1aXJlZCB0byBzZXQgdXAgd2ViIHNlcnZpY2VzIGNsaWVudCwgU0ksIGFuZCBTRUkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5XZWJTZXJ2aWNlQ2xpZW50QXJ0aWZhY3RzKFdlYlNlcnZpY2VzQ2xpZW50RGF0YUhlbHBlciBkYXRhTW9kZWwpCi0JewotCQkvLyBEbyBub3RoaW5nLiBUaGlzIHNob3VsZG4ndCBiZSBvbiB0aGUgaW50ZXJmYWNlIQotCX0KLQkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL3Rlc3QvV2ViU2VydmljZVRlc3RXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dpemFyZC90ZXN0L1dlYlNlcnZpY2VUZXN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MWM4ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY29uc3VtcHRpb24vdWkvd2l6YXJkL3Rlc3QvV2ViU2VydmljZVRlc3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2l6YXJkLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRlc3RXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi17Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VUZXN0V2l6YXJkKCkKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICBUZXN0V2l6YXJkUGFnZSBwYWdlID0gbmV3IFRlc3RXaXphcmRQYWdlKCJUZXN0IHBhZ2UiKTsKLSAgfQotCi0KLQotICAvKioKLSAgKiBJbml0aWFsaXplcyB0aGlzICJOZXciIHdpemFyZC4KLSAgKiBAcGFyYW0gd29ya2JlbmNoIFRoZSB3b3JrYmVuY2ggdGhhdCBsYXVuY2hlZCB0aGlzIHdpemFyZC4KLSAgKiBAcGFyYW0gc2VsZWN0aW9uIFRoZSBzZWxlY3Rpb24gY29udGV4dCBvZiB0aGlzIHdpemFyZC4KLSAgKiBAcmV0dXJuIFRoaXMgd2l6YXJkLgotICAqLwotICBwdWJsaWMgdm9pZCBpbml0ICggSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLSAgICAvL0RvIG5vdGhpbmcKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0KLSAgICBUZXN0V2l6YXJkUGFnZSBwYWdlID0gbmV3IFRlc3RXaXphcmRQYWdlKCJUZXN0IHBhZ2UiKTsKLSAgICBhZGRQYWdlKHBhZ2UpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICAvL0Fsd2F5cyBhbGxvdyBmaW5pc2gKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpc0NsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpc0NsaWVudENvbmZpZ1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiNDNiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93c3J0L0F4aXNDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc1Byb3h5V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuV2ViU2VydmljZUNsaWVudEF4aXNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLQlwcml2YXRlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yICAgICAgICAgICAgIHByb3h5Q29uZmlnV2lkZ2V0XzsKLQlwcml2YXRlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yICAgICAgICAgICAgIG1hcHBpbmdzV2lkZ2V0XzsKLQlwcml2YXRlIEF4aXNQcm94eVdpZGdldCAgICAgICAgICAgICAgICAgICAgIHByb3h5V2lkZ2V0XzsKLQlwcml2YXRlIFdpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyIGFkYXB0ZXJfOwotCQotCXB1YmxpYyBBeGlzQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeSgpCi0JewotCSAgYWRhcHRlcl8gPSBuZXcgV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIoIG5ldyBXZWJTZXJ2aWNlQ2xpZW50QXhpc1R5cGUoKSApOwotCSAgCi0JICBwcm94eUNvbmZpZ1dpZGdldF8gPSBhZGFwdGVyXy5nZXRXaWRnZXQoICJBeGlzQ2xpZW50U3RhcnQiICk7Ci0JICBwcm94eVdpZGdldF8gICAgICAgPSAoQXhpc1Byb3h5V2lkZ2V0KXByb3h5Q29uZmlnV2lkZ2V0Xy5nZXRXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKS5jcmVhdGUoKTsKLQkgIG1hcHBpbmdzV2lkZ2V0XyAgID0gYWRhcHRlcl8uZ2V0V2lkZ2V0KCAiQXhpc0NsaWVudEJlYW5NYXBwaW5nIiApOwotCX0KLQkKLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIAotCXsKLQkgIHJldHVybiBwcm94eUNvbmZpZ1dpZGdldF87Ci0JfQotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldCggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIAotCXsKLQkgIHJldHVybiB3aWRnZXRDb250cmlidXRvciA9PSBwcm94eUNvbmZpZ1dpZGdldF8gJiYgcHJveHlXaWRnZXRfLmdldEN1c3RvbWl6ZUNsaWVudE1hcHBpbmdzKCkgPyBtYXBwaW5nc1dpZGdldF8gOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgCi0JewotCSAgYWRhcHRlcl8ucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFSZWdpc3RyeSApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpc1dlYlNlcnZpY2VDbGllbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NvbnN1bXB0aW9uL3VpL3dzcnQvQXhpc1dlYlNlcnZpY2VDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiNjc0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jb25zdW1wdGlvbi91aS93c3J0L0F4aXNXZWJTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuQXhpc0NsaWVudElucHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS5jb21tYW5kLkF4aXNDbGllbnRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNvcHlBeGlzSmFyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkRlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5TdHViMkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suVmFsaWRhdGVXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc0NsaWVudEZyYWdtZW50Lk1hcHBpbmdGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQnVpbGRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLQotcHVibGljIGNsYXNzIEF4aXNXZWJTZXJ2aWNlQ2xpZW50IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50Ci17CQkKLQotCXB1YmxpYyBBeGlzV2ViU2VydmljZUNsaWVudChXZWJTZXJ2aWNlQ2xpZW50SW5mbyBpbmZvKQotCXsKLQkJc3VwZXIoaW5mbyk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsCi0JCQlJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcikKLQl7Ci0JCXJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBlbnYuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRNYXBwaW5nUmVnaXN0cnkoKSk7Ci0JCQotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQXhpc0NsaWVudElucHV0Q29tbWFuZCh0aGlzLCBjdHgsIHByb2plY3QsIG1vZHVsZSkpOwotCQljb21tYW5kcy5hZGQobmV3IEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZChtb2R1bGUpKTsKLS8vCQljb21tYW5kcy5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJBeGlzQ2xpZW50U3RhcnQiKSk7Ci0vLwkJY29tbWFuZHMuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiQXhpc0NsaWVudEJlYW5NYXBwaW5nIikpOwotCQljb21tYW5kcy5hZGQobmV3IERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQoKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgQ29weUF4aXNKYXJDb21tYW5kKG1vZHVsZSkpOwotCQljb21tYW5kcy5hZGQobmV3IEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKG1vZHVsZSkpOwotCQljb21tYW5kcy5hZGQobmV3IERlZmF1bHRzRm9yQ2xpZW50SmF2YVdTRExDb21tYW5kKG1vZHVsZSkpOwotCQljb21tYW5kcy5hZGQobmV3IFZhbGlkYXRlV1NETENvbW1hbmQoKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhQ29tbWFuZCgpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKSk7Ci0JCWNvbW1hbmRzLmFkZChuZXcgU3R1YjJCZWFuQ29tbWFuZChtb2R1bGUpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzQ2xpZW50T3V0cHV0Q29tbWFuZCh0aGlzLGN0eCxtb2R1bGUpKTsKLQkJY29tbWFuZHMuYWRkKG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCkpOwotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KSAKLQl7Ci0JCS8vIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZAotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnRJbnB1dENvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsCi0JCQkJbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UnVudGltZSIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFJ1bnRpbWVJRCIsCi0vLwkJCQludWxsKTsKLS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotLy8JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotLy8JCQkJIkNsaWVudFByb2plY3RFQVIiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnRJbnB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgLy8gVVJJCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0bwotCQkvLyBVUkwKLQkJLy8gdHJhbnNmb3JtZXIKLQkJLy8gcmVxJ2Q/PwotLy8JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0UHJveHlTZWxlY3RlZCIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLS8vCQkJCSJUZXN0UHJveHlTZWxlY3RlZCIsIG51bGwpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnRJbnB1dENvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotLy8JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc0NsaWVudFNjZW5hcmlvIiwgQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50SW5wdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0JCS8vIERlZmF1bHRzRm9ySFRUUEJhc2ljQXV0aENvbW1hbmQoKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzKTsgLy9PSwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLCBEZWZhdWx0c0ZvckhUVFBCYXNpY0F1dGhDb21tYW5kLmNsYXNzLCAiV3NkbFNlcnZpY2VVUkwiLCBudWxsKTsgLy9PSwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgRGVmYXVsdHNGb3JIVFRQQmFzaWNBdXRoQ29tbWFuZC5jbGFzcyk7IC8vT0sKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDdXN0b21pemVDbGllbnRNYXBwaW5ncyIsIE1hcHBpbmdGcmFnbWVudC5jbGFzcyApOyAgICAKLQkJLy9yZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLQkJLy8gIlNlcnZpY2VQcm9qZWN0IiwKLQkJLy8gQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQuY2xhc3MpOwotCQkvL3JlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotCQkvLyAiRUpCUHJvamVjdE5hbWUiLAotCQkvLyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JCS8vIENvcHlBeGlzSmFyQ29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBudWxsKTsKLQkJLy8gQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soKQotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzay5jbGFzcywgIlByb2plY3QiLCBudWxsKTsKLQkJLy8gRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQoKSAvLyBqYXZhUGFyYW1fLCBtb2RlbF8KLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgRGVmYXVsdHNGb3JDbGllbnRKYXZhV1NETENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5jbGFzcywgIlByb3h5UHJvamVjdCIsCi0JCQkJbnVsbCk7Ci0JCS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLAotCQkvLyBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5jbGFzcywiV1NETFNlcnZpY2VQYXRobmFtZSIsbnVsbCk7Ci0JCS8vIC8vCi0JCS8vIFVSTCB0byBVUkw/PwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkwiLCBEZWZhdWx0c0ZvckNsaWVudEphdmFXU0RMQ29tbWFuZC5jbGFzcywgIldTRExTZXJ2aWNlVVJMIiwgbnVsbCk7IC8vIFVSSQotCQkvLyB0bwotCQkvLyBVUkw/PwotCQkvLyBWYWxpZGF0ZVdTRExDb21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgVmFsaWRhdGVXU0RMQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFNlcnZpY2VVUkwiLCBWYWxpZGF0ZVdTRExDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MpOwotCQkvLyBXU0RMMkphdmFDb21tYW5kKCkgLy8gamF2YVBhcmFtXwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJMIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBudWxsKTsgLy8gVVJMCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFVSST8/Ci0JCS8vIFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIFJlZnJlc2hQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBudWxsKTsKLQkJLy8gU3R1YjJCZWFuQ29tbWFuZCgpCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFN0dWIyQmVhbkNvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgU3R1YjJCZWFuQ29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIFN0dWIyQmVhbkNvbW1hbmQuY2xhc3MpOwotCQkvLyBCdWlsZFByb2plY3RDb21tYW5kKCkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBudWxsKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJGb3JjZUJ1aWxkIiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVmFsaWRhdGlvbk1hbmFnZXIiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkJCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoU3R1YjJCZWFuQ29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsIEF4aXNDbGllbnRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgbnVsbCk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc0NsaWVudERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEF4aXNDbGllbnRDb21tYW5kc0ZyYWdtZW50LmNsYXNzKTsKLS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLS8vCQlyZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNldEVuZHBvaW50TWV0aG9kIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzViMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYjU5ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzcy1heGlzLXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2QxZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5kaXNjb3ZlcnkuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3NkbDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2I2NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB3c3MtYXhpcy11aS5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tcGF0aWJpbGl0eS5QbHVnaW5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2ssCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b24sCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLmJlYW5zLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndzcnQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudWksCi0gb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53cywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiwKLSBvcmcud3NkbDRqLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcuZWNsaXBzZS5qZW0udXRpbAotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKLVBsdWdpbi1DbGFzczogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjczMzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS53c3MtYXhpcy11aS5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSB3c3MtYXhpcy11aS5qYXIsXAotICAgICAgICAgICAgICAgZGVwbG95LnhzbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZGVwbG95LnhzbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL2RlcGxveS54c2wgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL2RlcGxveS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZGYxNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9kZXBsb3kueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLSAgICB2ZXJzaW9uPSIxLjAiCi0gICAgeG1sbnM6eGFsYW49Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0IgotICAgIHhtbG5zOm5zMT0iaHR0cDovL3htbC5hcGFjaGUub3JnL2F4aXMvd3NkZC8iCi0gICAgeG1sbnM6amF2YT0iaHR0cDovL3htbC5hcGFjaGUub3JnL2F4aXMvd3NkZC9wcm92aWRlcnMvamF2YSI+Ci0gICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGVuY29kaW5nPSJVVEYtOCIvPgotICAKLSAgIDx4c2w6cGFyYW0gbmFtZT0ibmV3Q2xhc3NOYW1lIiBzZWxlY3Q9InNzIi8+Ci0gICAKLSAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvbnMxOmRlcGxveW1lbnQvbnMxOnNlcnZpY2UvbnMxOnBhcmFtZXRlcltAbmFtZT0nY2xhc3NOYW1lJ10iPgotICAgIDx4c2w6Y29weT4KLSAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj5jbGFzc05hbWU8L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgCSA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+IAkKLSAgCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRuZXdDbGFzc05hbWUiLz4gIAkgCQotICAgICAgIAkgPC94c2w6YXR0cmlidXRlPgotICAgICAgIAk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICAgCTwveHNsOmNvcHk+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0gICAgCi0gICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iQCp8bm9kZSgpIj4KLSAgICAJPHhzbDpjb3B5PgotICAgIAkJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICAJPC94c2w6Y29weT4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0ZGQ3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2Vic2VydmljZSBBeGlzIENyZWF0aW9uIFVJCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotTEFCRUxfUlVOVElNRV9BWElTXzExPUFwYWNoZSBBeGlzIDEuMQotREVTQ19SVU5USU1FX0FYSVNfMTE9QXBhY2hlIEF4aXMgMS4xCi0KLSMKLSNXU1dTRExBeGlzVHlwZQotIwotV1NfTkFNRV9XU0RMQVhJUz1Ta2VsZXRvbiBKYXZhIGJlYW4gQXhpcyBXZWIgc2VydmljZQotCi0jCi0jV1NCZWFuQXhpc1R5cGUKLSMKLVdTX05BTUVfQkVBTkFYSVM9SmF2YSBiZWFuIEF4aXMgV2ViIHNlcnZpY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjYTIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgICA8IS0tIFdlYiBTZXJ2aWNlIFNlcnZlciBUeXBlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiPgotCi0gICAgICA8d2ViU2VydmljZVJ1bnRpbWUKLSAgICAgICAgICAgIGxhYmVsPSIlTEFCRUxfUlVOVElNRV9BWElTXzExIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVERVNDX1JVTlRJTUVfQVhJU18xMSIKLSAgICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBqMmVldmVyc2lvbj0iMTMgMTQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIj4KLSAgICAgIDwvd2ViU2VydmljZVJ1bnRpbWU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjMyIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMi5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQzMl9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MC5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MF9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQxIgotICAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgIHJ1bnRpbWVUeXBlSWRzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC40MS5ydW50aW1lIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+IAotCi0gICAgICA8d2ViU2VydmljZVNlcnZlcgotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIKLSAgICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgICBydW50aW1lVHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAucnVudGltZSIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUNTBfTE9DQUwiPiAgCi0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXI+ICAgIAotCi0gICAgICA8d2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICAgICAgICAgICByZXF1aXJlRUpCTW9kdWxlPSJmYWxzZSIKLSAgICAgICAgICAgIHJlcXVpcmVXZWJNb2R1bGU9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlV1NfTkFNRV9CRUFOQVhJUyIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmphdmEiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC5iZWFucy5XU0JlYW5BeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDUwX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC5iZWFucy5XU0JlYW5BeGlzVHlwZS5UT01DQVQ1MExPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPgotCi0gICAgICA8d2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICAgICAgICAgICByZXF1aXJlRUpCTW9kdWxlPSJmYWxzZSIKLSAgICAgICAgICAgIHJlcXVpcmVXZWJNb2R1bGU9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlV1NfTkFNRV9XU0RMQVhJUyIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwiCi0gICAgICAgICAgICBydW50aW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MucnVudGltZS5heGlzMTEiCi0gICAgICAgICAgICBhc3NlbWJseUJpbmRpbmc9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsLldTV1NETEF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNTBfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLndzZGwuV1NXU0RMQXhpc1R5cGUuVE9NQ0FUNTBMT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAgICAgICAgICAgcmVxdWlyZUVKQk1vZHVsZT0iZmFsc2UiCi0gICAgICAgICAgICByZXF1aXJlV2ViTW9kdWxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVdTX05BTUVfQkVBTkFYSVMiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS5qYXZhIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnMuV1NCZWFuQXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQuYmVhbnMuV1NCZWFuQXhpc1R5cGUuVE9NQ0FUNDFMT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZT4KLQotICAgICAgPHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAgICAgICAgICAgcmVxdWlyZUVKQk1vZHVsZT0iZmFsc2UiCi0gICAgICAgICAgICByZXF1aXJlV2ViTW9kdWxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVdTX05BTUVfV1NETEFYSVMiCi0gICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS53c2RsIgotICAgICAgICAgICAgcnVudGltZT0ib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIgotICAgICAgICAgICAgYXNzZW1ibHlCaW5kaW5nPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQud3NkbC5XU1dTRExBeGlzVHlwZSIKLSAgICAgICAgICAgIHNlcnZlcj0iU0VSVkVSX0lEX1RPTUNBVDQxX0xPQ0FMIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsLldTV1NETEF4aXNUeXBlLlRPTUNBVDQxTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgICAgICAgICAgIHJlcXVpcmVFSkJNb2R1bGU9ImZhbHNlIgotICAgICAgICAgICAgcmVxdWlyZVdlYk1vZHVsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVXU19OQU1FX0JFQU5BWElTIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUuamF2YSIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLmJlYW5zLldTQmVhbkF4aXNUeXBlIgotICAgICAgICAgICAgc2VydmVyPSJTRVJWRVJfSURfVE9NQ0FUNDBfTE9DQUwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLmJlYW5zLldTQmVhbkF4aXNUeXBlLlRPTUNBVDQwTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgICAgICAgICAgIHJlcXVpcmVFSkJNb2R1bGU9ImZhbHNlIgotICAgICAgICAgICAgcmVxdWlyZVdlYk1vZHVsZT0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVXU19OQU1FX1dTRExBWElTIgotICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUud3NkbCIKLSAgICAgICAgICAgIHJ1bnRpbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSIKLSAgICAgICAgICAgIGFzc2VtYmx5QmluZGluZz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2l6YXJkLndzZGwuV1NXU0RMQXhpc1R5cGUiCi0gICAgICAgICAgICBzZXJ2ZXI9IlNFUlZFUl9JRF9UT01DQVQ0MF9MT0NBTCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQud3NkbC5XU1dTRExBeGlzVHlwZS5UT01DQVQ0MExPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBTZXJ2ZXIgRGVmYXVsdGVycyAtLT4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnNlcnZlckRlZmF1bHRlciI+Ci0gICAgICA8c2VydmVyRGVmYXVsdGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5BeGlzU2VydmVyRGVmYXVsdGVyIj4KLSAgICAgIDwvc2VydmVyRGVmYXVsdGVyPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlUnVudGltZSI+Ci0gIAk8d2ViU2VydmljZVJ1bnRpbWUKLSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24uYXhpc1dlYlNlcnZpY2VSVCIKLSAgICBsYWJlbD0iJUxBQkVMX1JVTlRJTUVfQVhJU18xMSIKLSAgICBzZXJ2aWNlVHlwZXM9Im9yZy5lY2xpcHNlLmpzdC53cy5zZXJ2aWNlVHlwZS5qYXZhIgotICAgIGNsaWVudFR5cGVzPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50VHlwZS5qYXZhLndlYk9ubHkiCi0gICAgc2VydmxldExldmVscz0iMjMgMjQiCi0gICAgajJlZUxldmVscz0iMTMgMTQiCi0gICAgc2VydmVycz0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDAgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndzcnQuQXhpc1dlYlNlcnZpY2VSdW50aW1lIj4KLSAgCTwvd2ViU2VydmljZVJ1bnRpbWU+Ci0JPC9leHRlbnNpb24+IAotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeSAgIAotICAgICAgICAgICAgIGlkPSJBeGlzQmVhbkNvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suQlVDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMiCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndzcnQuQXhpc0JlYW5Db25maWdXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotICAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkgICAKLSAgICAgICAgICAgICBpZD0iQXhpc1NrZWxldG9uQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5URENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9ycyIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud3NydC5BeGlzU2tlbGV0b25Db25maWdXaWRnZXRGYWN0b3J5Ii8+Ci0gICAgPC9leHRlbnNpb24+IAotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYXhpcy9jcmVhdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2I3ZmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLQotIwotIyBFcnJvciBtZXNzYWdlcyB1c2VkIGluIHRoaXMgcGx1Z2luCi0jCi1NU0dfRVJST1JfSU5URVJBTD1JV0FCMDUxMkUgSW50ZXJuYWwgZXJyb3IKLU1TR19FUlJPUl9QUk9KRUNUX1VSTD1JV0FCMDUxNEUgVW5hYmxlIHRvIGdldCBVUkwgZm9yIHByb2plY3QgezB9Ci1NU0dfRVJST1JfUkVBRF9XU0RMPUlXQUIwNTE2RSBFcnJvciBpbiByZWFkaW5nIFdTREwgZmlsZSB7MH0KLU1TR19FUlJPUl9XU0RMX05PX1BPUlQ9SVdBQjA1MThFIFdTREwgZmlsZSBhdCB7MH0gaGFzIG5vIHBvcnQgZWxlbWVudAotTVNHX0VSUk9SX0NBTk5PVF9OT19KQVZBX0JFQU49SVdBQjAwMTVFIEEgSmF2YSBiZWFuIHdhcyBub3Qgc2VsZWN0ZWQKLU1TR19FUlJPUl9OT19QUk9KRUNUPUlXQUIwMDE2RSBBIHByb2plY3Qgd2FzIG5vdCBzZWxlY3RlZAotTVNHX0VSUk9SX0NBTk5PVF9MT0FEX0pBVkFfQkVBTj1JV0FCMDAxN0UgVGhlIEphdmEgYmVhbiwgezB9LCBjYW5ub3QgYmUgbG9hZGVkIGZyb20gezF9Ci1NU0dfRVJST1JfSkFWQV9NT0ZfUkVGTEVDVF9GQUlMRUQ9SVdBQjA1MjFFIEZhaWxlZCB0byBhbmFseXplIHRoZSBKYXZhIGJlYW46IHswfS4KLU1TR19FUlJPUl9SRUFEX0JFQU49SVdBQjA1MjJFIEVycm9yIGluIHJlYWRpbmcgbWV0aG9kcyBmcm9tIEphdmEgYmVhbi4KLU1TR19FUlJPUl9NT1ZFX1JFU09VUkNFPUlXQUIwNTIzRSBFcnJvciBtb3ZpbmcgcmVzb3VyY2UKLU1TR19FUlJPUl9VUERBVEVfQVhJU19XU0REPUlXQUIwNTI0RSBFcnJvciB1cGRhdGluZyBBeGlzIGRlcGxveS53c2RkIGZpbGUKLU1TR19FUlJPUl9MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRT1JV0FCMDUzNkUgQXhpcyAxLjEgc3VwcG9ydCBmb3IgRG9jdW1lbnQvTGl0ZXJhbCBhbmQgRG9jdW1lbnQvTGl0ZXJhbCAoV3JhcHBlZCkgaXMgbWluaW1hbCwgdGh1cyB0aGUgZ2VuZXJhdGVkIGNvZGUgbWF5IGNvbnRhaW4gZXJyb3JzLiBSUEMvRW5jb2RlZCBpcyB0aGUgcmVjb21tZW5kZWQgc3R5bGUgYW5kIGVuY29kaW5nIHNlbGVjdGlvbi4KLU1TR19FUlJPUl9JTklUSUFMX1NFTEVDVElPTj1JV0FCMDAxOEUgRXJyb3IgZ2V0dGluZyBpbml0aWFsIHNlbGVjdGlvbi4KLQotCi0jCi0jSmF2YVRvV1NETE1ldGhvZENvbW1hbmQKLSMKLVRBU0tfTEFCRUxfSkFWQV9UT19XU0RMPUNyZWF0ZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZG9jdW1lbnQgbW9kZWwgZnJvbSBKYXZhIGJlYW4uCi1UQVNLX0RFU0NfSkFWQV9UT19XU0RMPUNyZWF0aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2N1bWVudCBtb2RlbCBmcm9tIEphdmEgYmVhbi4KLU1TR19FUlJPUl9KQVZBX1RPX01FVEhPRD1JV0FCMDAxOUUgRXJyb3IgaW4gZ2V0dGluZyBtZXRob2QgZnJvbSBKYXZhIGJlYW4uCi0KLSMKLSNEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMVGFzawotIwotVEFTS19MQUJFTF9TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTPURlZmF1bHRzRm9ySmF2YVdTRExTZXJ2ZXIKLVRBU0tfREVTQ19TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTPUJ1aWxkcyB0aGUgSmF2YVdTRExQYXJhbWV0ZXIgZm9yIHNlcnZlciBzaWRlLgotCi0jCi0jVXBkYXRlV0VCWE1MQ29tbWFuZAotIwotVEFTS19MQUJFTF9VUERBVEVfV0VCX1hNTD1VcGRhdGVXRUJYTUxDb21tYW5kCi1UQVNLX0RFU0NfVVBEQVRFX1dFQl9YTUw9VXBkYXRlIHByb2plY3QncyB3ZWIueG1sIGZpbGUgd2l0aCBBeGlzIHNlcnZsZXRzCi1NU0dfRVJST1JfVVBEQVRFX1dFQl9YTUw9SVdBQjAwMjBFIEVycm9yIGluIGFkZGluZyBzZXJ2bGV0IGluIHdlYi54bWwuCi0KLSMKLSNEZWZhdWx0c0ZvcldTREwyU2tlbGV0b25UYXNrCi0jCi0KLSMKLSNNb3ZlRGVwbG95bWVudEZpbGVzVGFzawotIwotVEFTS19MQUJFTF9NT1ZFX0RFUExPWU1FTlRfRklMRVM9TW92ZURlcGxveW1lbnRGaWxlc1Rhc2sKLVRBU0tfREVTQ19NT1ZFX0RFUExPWU1FTlRfRklMRVM9TW92ZSBkZXBsb3kud3NkZCBhbmQgdW5kZXBsb3kud3NkZCBmcm9tIEphdmEgU291cmNlIHRvIFdlYiBDb250ZW50L1dFQi1JTkYKLQotIwotI01vdmVKYXZhRmlsZXNUYXNrCi0jCi1UQVNLX0xBQkVMX01PVkVfSkFWQV9GSUxFUz1Nb3ZlSmF2YUZpbGVzVGFzawotVEFTS19ERVNDX01PVkVfSkFWQV9GSUxFUz1Nb3ZlIHNlcnZlciBzaWRlIGphdmEgZmlsZXMKLQotIwotI1NrZWxldG9uMldTRExUYXNrCi0jCi1UQVNLX0xBQkVMX1NLRUxFVE9OX1dTREw9RGVmYXVsdHNGb3JTa2VsZXRvbjJXU0RMVGFzawotVEFTS19ERVNDX1NLRUxFVE9OX1dTREw9Q3JlYXRlcyBXU0RMIGZvciBhIEphdmEgYmVhbiBza2VsZXRvbi4KLQotIwotI1VwZGF0ZUF4aXNXU0RERmlsZVRhc2sKLSMKLVRBU0tfTEFCRUxfVVBEQVRFX0FYSVNfV1NERD1VcGRhdGVBeGlzV1NEREZpbGVUYXNrCi1UQVNLX0RFU0NfVVBEQVRFX0FYSVNfV1NERD1VcGRhdGUgQXhpcyBkZXBsb3kud3NkZCB3aXRoIGFjdHVhbCBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUKLU1TR19QTFVHSU5fRklMRV9VUkw9UHJvYmxlbSBsb2NhdGluZyBwbHVnaW4gZmlsZQotCi0jCi0jV2ViU2VydmljZVdTRExBeGlzU2VsZWN0aW9uUGFnZQotIwotUEFHRV9NU0dfTk9fRklMRV9TUEVDSUZJRUQ9Tm8gZmlsZSBzcGVjaWZpZWQuCi1QQUdFX01TR19OT19NRVRIT0RfU0VMRUNURUQ9Tm8gbWV0aG9kcyBzZWxlY3RlZC4KLQotIwotI1dlYlNlcnZpY2VTa2VsZXRvbkF4aXNDb25maWdGcmFnbWVudAotIwotCi0jCi0jV2ViU2VydmljZVNrZWxldG9uQXhpc0NvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUEJTQ19QQUdFPQotVE9PTFRJUF9QQkNGX1RFWFRfVVJJPVRoZSBTT0FQIGJvZHkgbmFtZXNwYWNlIGFuZCB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgV2ViIHNlcnZpY2UuCi1UT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUj1UaGUgZm9sZGVyIG9mIHRoZSBXU0RMIGZpbGUuCi1UT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEU9VGhlIG5hbWUgb2YgdGhlIFdTREwgZmlsZS4KLUxBQkVMX1VSST1XZWIgc2VydmljZSBVUkk6Ci1MQUJFTF9PVVRQVVRfRk9MREVSX05BTUU9V1NETCBGb2xkZXI6Ci1MQUJFTF9PVVRQVVRfRklMRV9OQU1FPVdTREwgRmlsZToKLQotCi0jCi0jV1NXU0RMQXhpc1R5cGUKLSMKLVdTX05BTUVfV1NETEFYSVM9U2tlbGV0b24gSmF2YSBiZWFuIEF4aXMgV2ViIHNlcnZpY2UKLVdTX0RFU0NfV1NETEFYSVM9U2tlbGV0b24gSmF2YSBiZWFuIEF4aXMgV2ViIHNlcnZpY2UKLQotIwotI1dTQmVhbkF4aXNUeXBlCi0jCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc0JlYW5DbGFzc0ZyYWdtZW50Ci0jCi0KLSMKLSNXZWJTZXJ2aWNlQXhpc0JlYW5DbGFzc1BhZ2UKLSMKLVBBR0VfVElUTEVfV1NCRUFOX0NMQVNTPVdlYiBTZXJ2aWNlIEphdmEgQmVhbiBTZWxlY3Rpb24KLVBBR0VfREVTQ19XU0JFQU5fQ0xBU1M9U2VsZWN0IGEgSmF2YSBiZWFuCi1MQUJFTF9FWFBMT1JFX01BUFBJTkdTX0JFQU4yWE1MPURlZmluZSBjdXN0b20gbWFwcGluZyBmb3IgcGFja2FnZSB0byBuYW1lc3BhY2UuCi1UT09MVElQX1AyTl9TSE9XX01BUFBJTkdTPURlZmluZSBwYWNrYWdlIHRvIG5hbWVzcGFjZSBtYXBwaW5nIGZvciBjdXN0b21pemF0aW9uLgotCi0jCi0jV2ViU2VydmljZUF4aXNCZWFuQ29uZmlnRnJhZ21lbnQKLSMKLQotIwotI1dlYlNlcnZpY2VBeGlzQmVhbkNvbmZpZ1BhZ2UKLSMKLVRPT0xUSVBfUEJDRl9QQUdFPQotVE9PTFRJUF9QQkNGX1RFWFRfVVJJPVRoZSBTT0FQIGJvZHkgbmFtZXNwYWNlIGFuZCB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgV2ViIHNlcnZpY2UuCi1UT09MVElQX1BCTUVfVFJFRV9NRVRIT0RTPUphdmEgYmVhbiBtZXRob2RzIHRvIGluY2x1ZGUuCi1QQUdFX1RJVExFX1dTQkVBTl9DT05GSUc9V2ViIFNlcnZpY2UgSmF2YSBCZWFuIElkZW50aXR5Ci1QQUdFX0RFU0NfV1NCRUFOX0NPTkZJRz1Db25maWd1cmUgdGhlIEphdmEgYmVhbiBhcyBhIFdlYiBzZXJ2aWNlLgotTEFCRUxfU1RZTEVfVVNFPVN0eWxlIGFuZCBVc2UKLVNUWUxFX1JQQ19MSVRFUkFMPURvY3VtZW50LyBMaXRlcmFsCi1TVFlMRV9ET0NfTElURVJBTD1Eb2N1bWVudC8gTGl0ZXJhbCAoV3JhcHBlZCkKLVNUWUxFX1JQQ19FTkNPREVEPVJQQy8gRW5jb2RlZAotCi0jCi0jV1NETENvbnN1bXB0aW9uVGFza0ZhY3RvcnkKLSMKLQotIwotI0NvcHlBeGlzU2VydmVyQ29uZmlnVGFzawotIwotCi1UQVNLX0xBQkVMX0NPUFlfU0VSVkVSX0NPTkZJR19GSUxFUz1Db3B5IHNlcnZlci1jb25maWcud3NkZCBmcm9tIHRoZSBzZXJ2ZXIgbG9jYXRpb24gdG8gdGhlIFdlYiBQcm9qZWN0Ci1UQVNLX0RFU0NfQ09QWV9TRVJWRVJfQ09ORklHX0ZJTEVTPUNvcGluZyBzZXJ2ZXItY29uZmlnLndzZGQgZnJvbSB0aGUgc2VydmVyIGxvY2F0aW9uIHRvIHRoZSBXZWIgUHJvamVjdAotCi0KLSMKLSNMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrCi0jCi1UQVNLX0xBQkVMX0xJVEVSQUxfU1VQUE9SVF9NRVNTQUdFPUF4aXMgc3VwcG9ydCBmb3IgTGl0ZXJhbCBlbmNvZGluZyBtZXNzYWdlIHRhc2sKLVRBU0tfREVTQ19MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRT1BeGlzIHN1cHBvcnQgZm9yIExpdGVyYWwgZW5jb2RpbmcgbWVzc2FnZSB0YXNrCi0KLSMKLSNCVUF4aXNJbnB1dENvbW1hbmQgYW5kIEJVQXhpc091dHB1dENvbW1hbmQKLSMKLQotVEFTS19MQUJFTF9CVV9BWElTX0lOUFVUPUJvdHRvbSB1cCBBeGlzIGlucHV0IGNvbW1tYW5kCi1UQVNLX0RFU0NfQlVfQVhJU19JTlBVVD1Cb3R0b20gdXAgQXhpcyBpbnB1dCBjb21tbWFuZAotVEFTS19MQUJFTF9CVV9BWElTX09VVFBVVD1Cb3R0b20gdXAgQXhpcyBvdXRwdXQgY29tbW1hbmQKLVRBU0tfREVTQ19CVV9BWElTX09VVFBVVD1Cb3R0b20gdXAgQXhpcyBvdXRwdXQgY29tbW1hbmQKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9BeGlzT3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9BeGlzT3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjU4NzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc091dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud3NydC5BeGlzV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53c3J0LkF4aXNXZWJTZXJ2aWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc091dHB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0JVX0FYSVNfT1VUUFVUIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0JVX0FYSVNfT1VUUFVUIjsKLQkKLQlwcml2YXRlIEF4aXNXZWJTZXJ2aWNlIHdzXzsKLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCi0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICB3c2RsVVJJXzsKLQkgIAotCSAgcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfID0gZmFsc2U7Ci0JICAKLQkgIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkgIAotCQkvKioKLQkJKiBEZWZhdWx0IENUT1IKLQkJKi8KLQkJcHVibGljIEF4aXNPdXRwdXRDb21tYW5kKCkgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBeGlzT3V0cHV0Q29tbWFuZChBeGlzV2ViU2VydmljZSB3cykgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCQl3c18gPSB3czsKLQkJfQotCQkKLQkJcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudil7Ci0JCSAgCQotCQkgIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7ICAJCi0JCSAgCXdzXy5nZXRXZWJTZXJ2aWNlSW5mbygpLnNldFdzZGxVUkwod3NkbFVSSV8pOwotCQkJQXhpc1dlYlNlcnZpY2VJbmZvIGF4aXNXU0luZm8gPSBuZXcgQXhpc1dlYlNlcnZpY2VJbmZvKCk7Ci0JCQlheGlzV1NJbmZvLnNldEphdmFXU0RMUGFyYW1ldGVyKGphdmFXU0RMUGFyYW1fKTsKLQkJCXdzXy5zZXRBeGlzV2ViU2VydmljZUluZm8oYXhpc1dTSW5mbyk7CQkgICAgCi0JCSAgCQotCQkgIAlyZXR1cm4gc3RhdHVzOyAgICAgIAkKLQkJICB9Ci0KLQkJICAvKioKLQkJICAgKiBAcGFyYW0gd3NkbFVSSQotCQkgICAqICAgICAgICAgICAgVGhlIHdzZGxVUkkgdG8gc2V0LgotCQkgICAqLwotCQkgIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0JCSAgewotCQkgICAgd3NkbFVSSV8gPSB3c2RsVVJJOwotCQkgIH0KLQotCQlwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtIChKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXykgewotCQkJdGhpcy5qYXZhV1NETFBhcmFtXyA9IGphdmFXU0RMUGFyYW1fOwotCQl9Ci0JCSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0F4aXNSdW5JbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc1J1bklucHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNhNTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc1J1bklucHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud3NydC5BeGlzV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIEF4aXNSdW5JbnB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0JVX0FYSVNfSU5QVVQiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfQlVfQVhJU19JTlBVVCI7Ci0JCi0JcHJpdmF0ZSBBeGlzV2ViU2VydmljZSB3c187Ci0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXzsKLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJQcm9qZWN0XzsgCi0JcHJpdmF0ZSBTdHJpbmcgc2VydmVyTW9kdWxlXzsKLQkgIAotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkKLQlwdWJsaWMgQXhpc1J1bklucHV0Q29tbWFuZCgpIHsKLQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JfQotCQotCXB1YmxpYyBBeGlzUnVuSW5wdXRDb21tYW5kKEF4aXNXZWJTZXJ2aWNlIHdzLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSkgewotCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJd3NfID0gd3M7Ci0JCXNlcnZlclByb2plY3RfID0gcHJvamVjdDsgCi0JCXNlcnZlck1vZHVsZV8gPSBtb2R1bGU7Ci0JfQotCQotCSBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCSAgewotCSAgICAKLQkgIAlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICAKLQkJamF2YVdTRExQYXJhbV8gPSB3c18uZ2V0QXhpc1dlYlNlcnZpY2VJbmZvKCkuZ2V0SmF2YVdTRExQYXJhbWV0ZXIoKTsKLQkJCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkgIH0KLQkKLQkgLyoqCi0JICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclByb2plY3QuCi0JICAgKi8KLQkgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUHJvamVjdCgpCi0JICB7Ci0JCSAgcmV0dXJuIHNlcnZlclByb2plY3RfOwotCSAgfQotCSAgCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtXzsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0F4aXNTZXJ2ZXJEZWZhdWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc1NlcnZlckRlZmF1bHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzc4YjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQXhpc1NlcnZlckRlZmF1bHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5TZXJ2ZXJJbmZvOwotCi0KLQotcHVibGljIGNsYXNzIEF4aXNTZXJ2ZXJEZWZhdWx0ZXIgaW1wbGVtZW50cyBJU2VydmVyRGVmYXVsdGVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXIjcmVjb21tZW5kRGVmYXVsdFNlcnZlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKLSAgICovCi0gIHB1YmxpYyBTZXJ2ZXJJbmZvIHJlY29tbWVuZERlZmF1bHRTZXJ2ZXIoSVByb2plY3QgcHJvamVjdCkKLSAgeyAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9CVUF4aXNJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQlVBeGlzSW5wdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNmZhNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9CVUF4aXNJbnB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotCi0KLXB1YmxpYyBjbGFzcyBCVUF4aXNJbnB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0JVX0FYSVNfSU5QVVQiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfQlVfQVhJU19JTlBVVCI7Ci0JCi0JcHJpdmF0ZSBJV2ViU2VydmljZSB3c187Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVyUHJvamVjdF87IAotCXByaXZhdGUgU3RyaW5nIHNlcnZlck1vZHVsZV87Ci0JcHJpdmF0ZSBTdHJpbmcgamF2YUJlYW5OYW1lXzsKLQotCSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRF87Ci0JICAKLQkgIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkgIAotCQkvKioKLQkJKiBEZWZhdWx0IENUT1IKLQkJKi8KLQkJcHVibGljIEJVQXhpc0lucHV0Q29tbWFuZCgpIHsKLQkJCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQl9Ci0JCQotCQlwdWJsaWMgQlVBeGlzSW5wdXRDb21tYW5kKElXZWJTZXJ2aWNlIHdzLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSkgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCQl3c18gPSB3czsKLQkJCXNlcnZlclByb2plY3RfID0gcHJvamVjdDsgCi0JCQlzZXJ2ZXJNb2R1bGVfID0gbW9kdWxlOwl9Ci0JCQotCSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQkgIHsKLQkgICAgCi0JICAJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgCi0JCVN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkID0gd3NfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpOwotCQlTdHJpbmcgc2VydmVyRmFjdG9yeUlkID0gd3NfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0JCWphdmFCZWFuTmFtZV8gPSB3c18uZ2V0V2ViU2VydmljZUluZm8oKS5nZXRJbXBsVVJMKCk7Ci0JCQotCQlJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcj1udWxsOwotCQkKLQkJaWYgKHNlcnZlckluc3RhbmNlSWQgIT0gbnVsbCkgeyAvLyBzZXJ2ZXIgZXhpc3RzCi0JICAgIAlzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySW5zdGFuY2VJZCk7Ci0JCQlpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyICE9IG51bGwpCi0JCSAgICB7Ci0JCSAgICAgIHNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmljZUV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotCQkgICAgfQotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCSAgICAJc2VydmljZVNlcnZlclR5cGVJRF8gPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0JICAgIH0KLQkJCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkgIH0KLQkgIAotCQkvKioKLQkJICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclByb2plY3QuCi0JCSAgICovCi0JCSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJQcm9qZWN0KCkKLQkJICB7Ci0JCQkgIHJldHVybiBzZXJ2ZXJQcm9qZWN0XzsKLQkJICB9Ci0KLQkJICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoKQotCQkgIHsKLQkJICAgIHJldHVybiBzZXJ2aWNlU2VydmVyVHlwZUlEXzsKLQkJICB9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJNb2R1bGUoKSB7Ci0JCQlyZXR1cm4gc2VydmVyTW9kdWxlXzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUJlYW5OYW1lKCkgewotCQkJcmV0dXJuIGphdmFCZWFuTmFtZV87Ci0JCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0NvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA3NTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIExpc3QgY2xhc3NOYW1lczsKLSAgLy9wcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICAvL3ByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbWV0ZXI7Ci0KLSAgcHVibGljIENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIGNsYXNzTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKGphdmFXU0RMUGFyYW1ldGVyICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGJlYW5OYW1lID0gamF2YVdTRExQYXJhbWV0ZXIuZ2V0QmVhbk5hbWUoKTsKLSAgICAgIGlmIChiZWFuTmFtZSAhPSBudWxsKQotICAgICAgICBjbGFzc05hbWVzLmFkZChiZWFuTmFtZSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENsYXNzTmFtZXMoKQotICB7Ci0gICAgcmV0dXJuIGNsYXNzTmFtZXM7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyIFRoZSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIC8vdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsVVJJIFRoZSB3c2RsVVJJIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICAvL3RoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbWV0ZXIpCi0gIHsKLSAgICB0aGlzLmphdmFXU0RMUGFyYW1ldGVyID0gamF2YVdTRExQYXJhbWV0ZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL2NvbW1hbmQvSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhM2FkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL0phdmFUb1dTRExNZXRob2RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5jb21tYW5kOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfSkFWQV9UT19XU0RMIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0pBVkFfVE9fV1NETCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBDTEFTU19FWFRFTlNJT04gPSAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNodGFibGUgZk1ldGhvZE5hbWVzOwotCXByaXZhdGUgU3RyaW5nIGZDbGFzc05hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJlYW5OYW1lOwotCXByaXZhdGUgU3RyaW5nIGZiZWFuQmFzZU5hbWU7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotCXByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3RfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotCS8qKgotCSogRGVmYXVsdCBDVE9SCi0JKi8KLQlwdWJsaWMgSmF2YVRvV1NETE1ldGhvZENvbW1hbmQoKSB7Ci0JCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIHNldE5hbWUgKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0JCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCX0KLQkvKioKLQkqIERlZmF1bHQgQ1RPUgotCSovCi0JcHVibGljIEphdmFUb1dTRExNZXRob2RDb21tYW5kKAotCQlKYXZhV1NETFBhcmFtZXRlciBqYXZhUGFyYW1ldGVyLAotCQlJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkgewotCQlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkJamF2YVdTRExQYXJhbV8gPSBqYXZhUGFyYW1ldGVyOwotCQlzZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQotCX0KLQotCS8qKgotCSogSmF2YVRvVG9XU0RMTWV0aG9kIGV4ZWN1dGUKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgewotCQlmYmVhbkJhc2VOYW1lID0gamF2YVdTRExQYXJhbV8uZ2V0QmVhbk5hbWUoKTsKLQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5JTkZPLCA1MDcwLCB0aGlzLCAiZXhlY3V0ZSIsICJiZWFuQmFzZU5hbWUgPSAiK2ZiZWFuQmFzZU5hbWUpOwotCQlTdGF0dXMgc3RhdHVzOwotCQl0cnkgewotCQkJLy9HZXQgdGhlIHF1YWxpZmllZCBiZWFuIG5hbWU7IG15LnBhY2thZ2UuTXlDbGFzcwotCQkJZk1ldGhvZE5hbWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJSGFzaHRhYmxlIG9sZE1ldGhvZHNOYW1lcyA9IGphdmFXU0RMUGFyYW1fLmdldE1ldGhvZHMoKTsKLQkJCVN0cmluZyBxTmFtZSA9IGZiZWFuQmFzZU5hbWU7Ci0KLQkJCWlmIChxTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEpBVkFfRVhURU5TSU9OKQotCQkJCXx8IHFOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoQ0xBU1NfRVhURU5TSU9OKSkgewotCQkJCXFOYW1lID0gcU5hbWUuc3Vic3RyaW5nKDAsIHFOYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCQkJfQotCi0JCQlKYXZhRU1GTmF0dXJlIGpNT0YgPQotCQkJCShKYXZhRU1GTmF0dXJlKSBKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUoCi0JCQkJCXNlcnZpY2VQcm9qZWN0Xyk7Ci0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0KLQkJCQkoSmF2YUNsYXNzKSBKYXZhQ2xhc3NJbXBsLnJlZmxlY3QocU5hbWUsIGpNT0YuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQlpZiAoIWphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSB7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTAyMiwgdGhpcywgImV4ZWN1dGUiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgKLQkJCQkJCSJNU0dfRVJST1JfSkFWQV9NT0ZfUkVGTEVDVF9GQUlMRUQiLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgcU5hbWUgfSkpOwotCQkJCQotCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFUb1dTRExNZXRob2RDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCSJNU0dfRVJST1JfSkFWQV9NT0ZfUkVGTEVDVF9GQUlMRUQiLAotCQkJCQluZXcgU3RyaW5nW10geyBxTmFtZSB9KSwKLQkJCQkJU3RhdHVzLkVSUk9SKTsKLQkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCi0JCQkvLyBHZXQgdGhlIHF1YWxpZmllZCBuYW1lCi0JCQlmQ2xhc3NOYW1lID0gamF2YUNsYXNzLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCWZCZWFuTmFtZSA9IGZDbGFzc05hbWU7Ci0JCQlTdHJpbmcgYmVhbk5hbWU7Ci0JCQlpZiAoZkNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkJYmVhbk5hbWUgPQotCQkJCQlmQ2xhc3NOYW1lLnN1YnN0cmluZygKLQkJCQkJCWZDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEsCi0JCQkJCQlmQ2xhc3NOYW1lLmxlbmd0aCgpKTsKLQkJCX0gZWxzZQotCQkJCWJlYW5OYW1lID0gZkNsYXNzTmFtZTsKLQotCQkJLy8gV2FsayB0aGUgamF2YSBjbGFzcyBhbmQgZ2V0IHRoZSBtZXRob2QgbmFtZXMKLQkJCWdhdGhlck1ldGhvZHMoamF2YUNsYXNzLCBiZWFuTmFtZSwgb2xkTWV0aG9kc05hbWVzKTsKLQkJCS8qCi0JCQlJdGVyYXRvciBtID0gamF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobS5oYXNOZXh0KCkpIHsKLQkJCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgbS5uZXh0KCk7ICAKLQkJCQlpZiAoICEgbWV0aG9kLmlzQ29uc3RydWN0b3IoKSl7IAotCQkJCWlmICghYmVhbk5hbWUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpCi0JCQkJCSYmICEoaXNEdXBsaWNhdGVNZXRob2ROYW1lKG1ldGhvZAotCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSkpCi0JCQkJCSYmICEobWV0aG9kCi0JCQkJCQkuZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpCi0JCQkJCQkuZ2V0SmF2YU5hbWUoKQotCQkJCQkJLmVxdWFsc0lnbm9yZUNhc2UoImphdmF4LmVqYi5FSkJPYmplY3QiKSkJLy8kTk9OLU5MUy0xJAotCQkJCQkmJiAhKG1ldGhvZAotCQkJCQkJLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKQotCQkJCQkJLmdldEphdmFOYW1lKCkKLQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZheC5lamIuRUpCT2JqZWN0W10iKSkJLy8kTk9OLU5MUy0xJAotCQkJCQkmJiAhKG1ldGhvZAotCQkJCQkJLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKQotCQkJCQkJLmdldEphdmFOYW1lKCkKLQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhLmxhbmcuT2JqZWN0IikpCS8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgIShtZXRob2QKLQkJCQkJCS5nZXRDb250YWluaW5nSmF2YUNsYXNzKCkKLQkJCQkJCS5nZXRKYXZhTmFtZSgpCi0JCQkJCQkuZXF1YWxzSWdub3JlQ2FzZSgiamF2YS5sYW5nLk9iamVjdFtdIikpKSB7CS8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gYWRkIHRoZSBtZXRob2QgbmFtZSB0byBvdXIgbGlzdCBvZiBtZXRob2QgbmFtZXMKLQkJCQkJU3RyaW5nIG1ldGhvZE5hbWUgPW1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCk7Ci0JCSAgICAgICAgICBCb29sZWFuIGlzU2VsZWN0ZWQgPSBuZXcgQm9vbGVhbih0cnVlKTsKLSAgICAgICAgCQkgIGlmIChvbGRNZXRob2RzTmFtZXMgIT0gbnVsbCAmJiBvbGRNZXRob2RzTmFtZXMuY29udGFpbnNLZXkobWV0aG9kTmFtZSkpCi0gICAgICAgICAgCQkJaXNTZWxlY3RlZCA9IChCb29sZWFuKW9sZE1ldGhvZHNOYW1lcy5nZXQobWV0aG9kTmFtZSk7Ci0JCSAgICAgICAgICBmTWV0aG9kTmFtZXMucHV0KG1ldGhvZE5hbWUsIGlzU2VsZWN0ZWQpOwotCQkJCX0gCi0JCQkJfQotCQkJfQotCQkJKi8KLQkJCWphdmFXU0RMUGFyYW1fLnNldE1ldGhvZHMoZk1ldGhvZE5hbWVzKTsKLQkJCQotCQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWVudmlyb25tZW50LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwMjMsIHRoaXMsICJleGVjdXRlIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9SRUFEX0JFQU4iKSk7Ci0JCQotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YVRvV1NETE1ldGhvZENvbW1hbmQiLCAvLyROT04tTkxTLTEkCi0JCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKAotCQkJCSJNU0dfRVJST1JfSkFWQV9UT19NRVRIT0QiKSwKLQkJCQlTdGF0dXMuRVJST1IsIGUpOwotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfQotCi0gIHByaXZhdGUgdm9pZCBnYXRoZXJNZXRob2RzKEphdmFDbGFzcyBqYXZhQ2xhc3MsIFN0cmluZyBiZWFuTmFtZSwgSGFzaHRhYmxlIG9sZE1ldGhvZHNOYW1lcykKLSAgewotICAgIFN0cmluZyBqYXZhTmFtZSA9IGphdmFDbGFzcy5nZXRKYXZhTmFtZSgpOwotICAgIGlmICghamF2YUNsYXNzLmlzSW50ZXJmYWNlKCkKLSAgICAgICAgJiYgIWphdmFOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImphdmF4LmVqYi5FSkJPYmplY3RbXSIpCi0gICAgICAgICYmICFqYXZhTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZheC5lamIuRUpCT2JqZWN0IikKLSAgICAgICAgJiYgIWphdmFOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImphdmEubGFuZy5PYmplY3RbXSIpCi0gICAgICAgICYmICFqYXZhTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhLmxhbmcuT2JqZWN0IikpCi0gICAgewotICAgICAgTGlzdCBwdWJsaWNNZXRob2RzID0gamF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwdWJsaWNNZXRob2RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKWl0Lm5leHQoKTsKLSAgICAgICAgaWYgKCFtZXRob2QuaXNDb25zdHJ1Y3RvcigpCi0gICAgICAgICAgICAmJiAhYmVhbk5hbWUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpCi0gICAgICAgICAgICAmJiAhKGlzRHVwbGljYXRlTWV0aG9kTmFtZShtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBhZGQgdGhlIG1ldGhvZCBuYW1lIHRvIG91ciBsaXN0IG9mIG1ldGhvZCBuYW1lcwotICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKTsKLSAgICAgICAgICBCb29sZWFuIGlzU2VsZWN0ZWQgPSBuZXcgQm9vbGVhbih0cnVlKTsKLSAgICAgICAgICBpZiAob2xkTWV0aG9kc05hbWVzICE9IG51bGwgJiYgb2xkTWV0aG9kc05hbWVzLmNvbnRhaW5zS2V5KG1ldGhvZE5hbWUpKQotICAgICAgICAgICAgaXNTZWxlY3RlZCA9IChCb29sZWFuKW9sZE1ldGhvZHNOYW1lcy5nZXQobWV0aG9kTmFtZSk7Ci0gICAgICAgICAgZk1ldGhvZE5hbWVzLnB1dChtZXRob2ROYW1lLCBpc1NlbGVjdGVkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZ2F0aGVyTWV0aG9kcyhqYXZhQ2xhc3MuZ2V0U3VwZXJ0eXBlKCksIGJlYW5OYW1lLCBvbGRNZXRob2RzTmFtZXMpOwotICAgIH0KLSAgfQotCSAgCi0JLy9SZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIG1ldGhvZCBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoZSAKLQkvL2ZNZXRob2ROYW1lcyB2ZWN0b3IuIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZGV0ZWN0IG92ZXJsb2FkZWQgCi0JLy9tZXRob2RzIGluIEJlYW5zIGFuZCBFSkJzLCB3aGljaCBhcmUgY3VycmVudGx5IHVuc3VwcG9ydGVkLgotCXByaXZhdGUgYm9vbGVhbiBpc0R1cGxpY2F0ZU1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIChmTWV0aG9kTmFtZXMgPT0gbnVsbCA/IGZhbHNlOiBmTWV0aG9kTmFtZXMuY29udGFpbnNLZXkobWV0aG9kTmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtLgotCSAqIEByZXR1cm4gSmF2YVdTRExQYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGphdmFXU0RMUGFyYW0uCi0JICogQHBhcmFtIGphdmFXU0RMUGFyYW0gVGhlIGphdmFXU0RMUGFyYW0gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JCXRoaXMuamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKLQl7Ci0JICBzZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL1REQXhpc0lucHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9UREF4aXNJbnB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiODk3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL1REQXhpc0lucHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5jb21tYW5kOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZTsKLQotCi1wdWJsaWMgY2xhc3MgVERBeGlzSW5wdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9URF9BWElTX0lOUFVUIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX1REX0FYSVNfSU5QVVQiOwotCQotCXByaXZhdGUgSVdlYlNlcnZpY2Ugd3NfOwotCXByaXZhdGUgU3RyaW5nIHNlcnZlclByb2plY3RfOyAKLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJNb2R1bGVfOwotCi0JICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJTZXJ2ZXJfOwotCSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSV87Ci0JICAKLQkgIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkgIAotCQkvKioKLQkJKiBEZWZhdWx0IENUT1IKLQkJKi8KLQkJcHVibGljIFREQXhpc0lucHV0Q29tbWFuZCgpIHsKLQkJCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCQkgICAgc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLQkJCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQl9Ci0JCQotCQlwdWJsaWMgVERBeGlzSW5wdXRDb21tYW5kKElXZWJTZXJ2aWNlIHdzLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSkgewotCQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkJICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JCSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JCQl3c18gPSB3czsKLQkJCXNlcnZlclByb2plY3RfID0gcHJvamVjdDsKLQkJCXNlcnZlck1vZHVsZV8gPSBtb2R1bGU7Ci0JCX0KLQkJCi0JICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCSAgewotCSAgICAKLQkgIAlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCSAgICAKLQkJc2VydmVyU2VydmVyXyA9IHdzXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKTsJCi0JCXdzZGxVUklfID0gd3NfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0V3NkbFVSTCgpOwotCQkKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCSAgfQotCSAgCi0JCS8qKgotCQkgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVyUHJvamVjdC4KLQkJICAgKi8KLQkJICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclByb2plY3QoKQotCQkgIHsKLQkJCSAgcmV0dXJuIHNlcnZlclByb2plY3RfOwotCQkgIH0KLQotCQkgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyU2VydmVyKCkKLQkJICB7Ci0JCSAgICByZXR1cm4gc2VydmVyU2VydmVyXzsKLQkJICB9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkgewotCQkJcmV0dXJuIHdzZGxVUklfOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJNb2R1bGUoKSB7Ci0JCQlyZXR1cm4gc2VydmVyTW9kdWxlXzsKLQkJfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvY29tbWFuZC9VcGRhdGVXRUJYTUxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL1VwZGF0ZVdFQlhNTENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExNmI4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS9jb21tYW5kL1VwZGF0ZVdFQlhNTENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQ7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVdFQlhNTENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfVVBEQVRFX1dFQl9YTUwiOwotCXByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19VUERBVEVfV0VCX1hNTCI7Ci0KLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nICAgbW9kdWxlTmFtZV87Ci0KLSAgcHVibGljIFVwZGF0ZVdFQlhNTENvbW1hbmQoIFN0cmluZyBtb2R1bGVOYW1lICkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAgIHNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQotCW1vZHVsZU5hbWVfID0gbW9kdWxlTmFtZTsKLSAgfQotCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0JCWlmIChzZXJ2ZXJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJc3RhdHVzID0gYWRkU2VydmxldChzZXJ2ZXJQcm9qZWN0LCBtb2R1bGVOYW1lXywgZ2V0QXhpc1NlcnZsZXREZXNjcmlwdG9yKCkpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgewotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSB7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJCWFkZFNlcnZsZXQoc2VydmVyUHJvamVjdCwgbW9kdWxlTmFtZV8sIGdldEFkbWludFNlcnZsZXREZXNjcmlwdG9yKCkpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgewotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2bGV0RGVzY3JpcHRvciBnZXRBeGlzU2VydmxldERlc2NyaXB0b3IoKSB7Ci0KLQkJU2VydmxldERlc2NyaXB0b3Igc2QgPSBuZXcgU2VydmxldERlc2NyaXB0b3IoKTsKLQkJc2QuX25hbWUgPSAiQXhpc1NlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JCXNkLl9kaXNwbGF5TmFtZSA9ICJBcGFjaGUtQXhpcyBTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpcy50cmFuc3BvcnQuaHR0cC5BeGlzU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX21hcHBpbmdzID0gbmV3IFN0cmluZ1tdIHsgIi9zZXJ2bGV0L0F4aXNTZXJ2bGV0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSIqLmp3cyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiL3NlcnZpY2VzLyoiIH07IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHNkOwotCX0KLQotCXByaXZhdGUgU2VydmxldERlc2NyaXB0b3IgZ2V0QWRtaW50U2VydmxldERlc2NyaXB0b3IoKSB7Ci0JCVNlcnZsZXREZXNjcmlwdG9yIHNkID0gbmV3IFNlcnZsZXREZXNjcmlwdG9yKCk7Ci0JCXNkLl9uYW1lID0gIkFkbWluU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2Rpc3BsYXlOYW1lID0gIkF4aXMgQWRtaW4gU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX2NsYXNzTmFtZSA9ICJvcmcuYXBhY2hlLmF4aXMudHJhbnNwb3J0Lmh0dHAuQWRtaW5TZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fbWFwcGluZ3MgPSBuZXcgU3RyaW5nW10geyAiL3NlcnZsZXQvQWRtaW5TZXJ2bGV0IiB9OyAvLyROT04tTkxTLTEkCi0JCXNkLl9sb2FkT25TdGFydHVwID0gbmV3IEludGVnZXIoMTAwKTsKLQkJcmV0dXJuIHNkOwotCX0KLQotCXByaXZhdGUgU2VydmxldERlc2NyaXB0b3IgZ2V0U29hcE1vbml0b3JTZXJ2bGV0RGVzY3JpcHRvcigpIHsKLQkJU2VydmxldERlc2NyaXB0b3Igc2QgPSBuZXcgU2VydmxldERlc2NyaXB0b3IoKTsKLQkJc2QuX25hbWUgPSAiU09BUE1vbml0b3JTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fZGlzcGxheU5hbWUgPSAiU09BUE1vbml0b3JTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJAotCQlzZC5fY2xhc3NOYW1lID0gIm9yZy5hcGFjaGUuYXhpcy5tb25pdG9yLlNPQVBNb25pdG9yU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQkJc2QuX21hcHBpbmdzID0gbmV3IFN0cmluZ1tdIHsgIi9TT0FQTW9uaXRvciIgfTsgLy8kTk9OLU5MUy0xJAotCQlzZC5fbG9hZE9uU3RhcnR1cCA9IG5ldyBJbnRlZ2VyKDEwMCk7Ci0JCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KCJTT0FQTW9uaXRvclBvcnQiLCAvLyROT04tTkxTLTEkCi0JCQkJCSAiNTAwMSIpOyAgIC8vJE5PTi1OTFMtMSQKLQkJc2QuX3BhcmFtcyA9IHBhcmFtczsKLQkJcmV0dXJuIHNkOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgYWRkU2VydmxldCgKLQkJSVByb2plY3Qgd2ViUHJvamVjdCwKLQkJU3RyaW5nICAgbW9kdWxlTmFtZSwKLQkJU2VydmxldERlc2NyaXB0b3Igc2VydmxldERlc2NyaXB0b3IpIHsKLQotCQlPYmplY3QgYWNjZXNzb3JLZXkgPSBuZXcgT2JqZWN0KCk7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsJCQotCQl0cnkgewotCQkJLy8gCi0JCQlXZWJBcHAgd2ViYXBwID0gbnVsbDsKLSAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQod2ViUHJvamVjdCwgbW9kdWxlTmFtZSk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldlYlByb2plY3Q6ICIrd2ViUHJvamVjdCsiICBtb2R1bGVOYW1lOiAiK21vZHVsZU5hbWUpOwotICAgICAgd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZSh2Yyk7Ci0JCQlpZiAod2ViRWRpdCAhPSBudWxsKQotCQkJewotCQkJCXdlYmFwcCA9IChXZWJBcHApIHdlYkVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0KLQkJCSAgIGJvb2xlYW4gZm91bmRTZXJ2bGV0ID0gZmFsc2U7Ci0KLQkJCSAgIExpc3QgdGhlU2VydmxldHMgPSB3ZWJhcHAuZ2V0U2VydmxldHMoKTsKLQkJCSAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhlU2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTZXJ2bGV0IGFTZXJ2bGV0ID0gKFNlcnZsZXQpIHRoZVNlcnZsZXRzLmdldChpKTsKLQkJCQlpZiAoYVNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldERlc2NyaXB0b3IuX25hbWUpKSB7Ci0JCQkJCWZvdW5kU2VydmxldCA9IHRydWU7Ci0JCQkJIH0KLQkJCSAgIH0KLQotCQkJICAgaWYgKGZvdW5kU2VydmxldCkgewotCQkJCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JCQkgICB9Ci0KLQkJCSAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0b3J5ID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRTsKLQotCQkJICAgU2VydmxldCBzZXJ2bGV0ID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0KCk7Ci0JCQkgICBTZXJ2bGV0VHlwZSBzZXJ2bGV0VHlwZSA9IGZhY3RvcnkuY3JlYXRlU2VydmxldFR5cGUoKTsKLQkJCSAgIHNlcnZsZXQuc2V0V2ViVHlwZShzZXJ2bGV0VHlwZSk7Ci0JCQkgICBzZXJ2bGV0LnNldFNlcnZsZXROYW1lKHNlcnZsZXREZXNjcmlwdG9yLl9uYW1lKTsKLQkJCSAgIHNlcnZsZXRUeXBlLnNldENsYXNzTmFtZShzZXJ2bGV0RGVzY3JpcHRvci5fY2xhc3NOYW1lKTsKLQkJCSAgIGlmKHNlcnZsZXREZXNjcmlwdG9yLl9kaXNwbGF5TmFtZSAhPSBudWxsKXsKLQkJCSAgICAgc2VydmxldC5zZXREaXNwbGF5TmFtZShzZXJ2bGV0RGVzY3JpcHRvci5fZGlzcGxheU5hbWUpOwotCQkJICAgfQotCQkJICAgaWYoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXAgIT0gbnVsbCl7Ci0JCQkJICBzZXJ2bGV0LnNldExvYWRPblN0YXJ0dXAoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXApOwotCQkJICAgfQotCQkJICAgaWYoc2VydmxldERlc2NyaXB0b3IuX3BhcmFtcyAhPSBudWxsKXsKLQkJCQkgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IHNlcnZsZXQuZ2V0UGFyYW1zQXNQcm9wZXJ0aWVzKCk7Ci0JCQkJICBwcm9wZXJ0aWVzLnB1dEFsbChzZXJ2bGV0RGVzY3JpcHRvci5fcGFyYW1zKTsKLQkJCSAgIH0KLQkJCSAgIHdlYmFwcC5nZXRTZXJ2bGV0cygpLmFkZChzZXJ2bGV0KTsKLQkJCQotCQkJICAgaWYoc2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzICE9IG51bGwpewotCQkJCSAgZm9yKGludCBpPTA7IGk8c2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzLmxlbmd0aDsgaSsrKXsKLQkJCQkJU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0JCQkJCXNlcnZsZXRNYXBwaW5nLnNldFNlcnZsZXQoc2VydmxldCk7Ci0JCQkJCXNlcnZsZXRNYXBwaW5nLnNldFVybFBhdHRlcm4oc2VydmxldERlc2NyaXB0b3IuX21hcHBpbmdzW2ldKTsKLQkJCQkJd2ViYXBwLmdldFNlcnZsZXRNYXBwaW5ncygpLmFkZChzZXJ2bGV0TWFwcGluZyk7CQkJCQkKLQkJCQkgIH0KLQkJCSAgIH0KLQkJCSAgIAotCQkJICAgd2ViRWRpdC5zYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoCi0JCQkJCSJVcGRhdGVXRUJYTUxDb21tYW5kLmFkZFNlcnZsZXQiLCAvLyROT04tTkxTLTEkCi0JCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVVBEQVRFX1dFQl9YTUwiKSwKLQkJCQkJU3RhdHVzLkVSUk9SLCBlKTsKLQkJfQotCQlmaW5hbGx5ewotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsJCi0JCX0KLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZlclByb2plY3QpCi0gIHsKLSAgICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotICB9Ci0KLQlwdWJsaWMgY2xhc3MgU2VydmxldERlc2NyaXB0b3IgewotCQlTdHJpbmcgX25hbWU7Ci0JCVN0cmluZyBfY2xhc3NOYW1lOwotCQlTdHJpbmcgX2Rpc3BsYXlOYW1lOwotCQlNYXAgX3BhcmFtczsKLQkJU3RyaW5nW10gX21hcHBpbmdzOwotCQlJbnRlZ2VyIF9sb2FkT25TdGFydHVwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvcGx1Z2luL1dlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2U5NGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCQotCS8vIENvcHlyaWdodAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAzLiI7IC8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbiBpbiBwbHVnaW4ueG1sLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7CS8vJE5PTi1OTFMtMSQKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbiBpbnN0YW5jZV87Ci0gIHByaXZhdGUgTG9nIGxvZ187Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uCi0gICogVGhlICJwbHVnaW4iIGVsZW1lbnQgaW4gcGx1Z2luLnhtbCBzaG91bGQgaW5jbHVkZSB0aGUgYXR0cmlidXRlCi0gICogY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luIi4KLSAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbiAoIElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgKQotICB7Ci0gICAgc3VwZXIoZGVzY3JpcHRvcik7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlXyA9IHRoaXM7Ci0gICAgfQotICAgIGxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotCi0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlV2FzQ3JlYXRpb25VSVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC53cy53YXMudjUudHAudWkiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbiBzaW5nbGV0b24uCi0gICovCi0gIHN0YXRpYyBwdWJsaWMgV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luIGdldEluc3RhbmNlICgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgZmlyc3QgbG9hZGVkLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBJZiB0aGlzIHBsdWdpbiBmYWlscyB0byBzdGFydC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnR1cCAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gIAlsb2dfLmxvZyhMb2cuSU5GTywgNTA2OCwgdGhpcywgInN0YXJ0dXAiLCAiU3RhcnRpbmcgcGx1Z2luIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIik7Ci0gICAgc3VwZXIuc3RhcnR1cCgpOwotICAgIHNldFByZWZlcmVuY2VzKCk7Ci0gIH0KLQotICAvKioKLSAgKiBDYWxsZWQgb25jZSBieSB0aGUgcGxhdGZvcm0gd2hlbiB0aGlzIHBsdWdpbiBpcyB1bmxvYWRlZC4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc2h1dGRvd24uCi0gICovCi0gIHB1YmxpYyB2b2lkIHNodXRkb3duICgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgCWxvZ18ubG9nKExvZy5JTkZPLCA1MDY5LCB0aGlzLCAic2h1dGRvd24iLCAiU2h1dHRpbmcgcGx1Z2luIG9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIik7Ci0gICAgc3VwZXIuc2h1dGRvd24oKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGdlbmVyYWwgcHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBpbiB0aGUgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICoqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcygpCi0gIHsKLSAgIC8vIHNldERpYWxvZ3NQcmVmZXJlbmNlcygpOwotICB9Ci0KLSAvKioKLSAgICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUpIHsKLQotCS8vIFNldCB0aGUgZGVmYXVsdHMgUHJlZmVyZW5jZQotLy8JQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VIZWxwZXIuaW5pdGlhbGl6ZURlZmF1bHRzKHByZWZlcmVuY2VTdG9yZSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotICAqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0gICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotICAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZV8uZ2V0RGVzY3JpcHRvcigpLmdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotICAqIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICogYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2gKLSAgKiBhcmUgbW9zdCBmcmVxdWVudGx5IHN0cmluZ3MpLiBTZWUgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgZm9yCi0gICogZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAgKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotICAqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0gICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotICAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0gICogQHBhcmFtIGFyZ3MgVGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlCi0gICogYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4gcGx1Z2luLnByb3BlcnRpZXMgYW5kCi0gICogYnkgdGhlIHJ1bGVzIG9mIGNsYXNzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncyApCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLGFyZ3MpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgcmVzb3VyY2UKLSAgKiBhcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24uCi0gICogQHJldHVybiBBbiBpbWFnZSBkZXNjcmlwdG9yLCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwotICAgICAgVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLG5hbWUpOwotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCkgewotICAgIHJldHVybiBQbGF0Zm9ybS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKHRoaXMpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkudG9PU1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCkpLmdldEZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLSAgfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9CVUNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9ycy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9CVUNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njc2YzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svQlVDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzazsKLQotcHVibGljIGNsYXNzIEJVQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzIGV4dGVuZHMgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzayAKLXsKLSAgcHVibGljIEJVQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzKFN0cmluZyBtb2R1bGVOYW1lKSAKLSAgewotCXN1cGVyKG1vZHVsZU5hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0RlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0RlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWU4MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9EZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudXRpbC5DbGFzc3BhdGhVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS51dGlsLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnV0aWwuUGxhdGZvcm1VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS51dGlsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBjb25Nc2dVdGlsc187Ci0JCi0JLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci0JcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXyA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgamF2YUJlYW5OYW1lXzsgLy8gdGhpcyBuZWVkcyB0byBiZSBzZXQgYnkgdGhlIGV4dGVuc2lvbiB3aXRoIGluaXRpYWwgc2VsZWN0aW9uCi0JcHJpdmF0ZSBTdHJpbmcgV1NETFNlcnZpY2VVUkxfOwotCXByaXZhdGUgU3RyaW5nIFdTRExTZXJ2aWNlUGF0aG5hbWVfOwotCXByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgV1NQYXJzZXJfOwotCS8vIHJtIHByaXZhdGUgV2ViU2VydmljZUVsZW1lbnQgd3NlXzsgLy8gdGVtcG9yYXJ5Ci0JcHJpdmF0ZSBTdHJpbmcgbW9kdWxlTmFtZV87Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9TRVJWRVJfSkFWQV9XU0RMX0RFRkFVTFRTIjsKLQlwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfU0VSVkVSX0pBVkFfV1NETF9ERUZBVUxUUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NETF9GT0xERVIgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfRVhUID0gIi9zZXJ2aWNlcy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgYnl0ZSBNT0RFX0JFQU4gPSAoYnl0ZSkgMDsKLQlwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9FWFQgPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZCggU3RyaW5nIG1vZHVsZU5hbWUgKSAKLQl7Ci0JCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0JICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgY29uTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpLnBsdWdpbiIsIHRoaXMgKTsKLQkJbW9kdWxlTmFtZV8gID0gbW9kdWxlTmFtZTsKLQotCQlzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQlzZXREZXNjcmlwdGlvbiggbXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQl9Ci0JCi0KLQlwdWJsaWMgRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQoCi0JCUphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0sCi0JCU1vZGVsIG1vZGVsKSB7Ci0KLQkJU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCi0JCXNldE5hbWUgKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0JCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCQkvL3JtIHNldE1vZGVsKG1vZGVsKTsKLQkJc2V0SmF2YVdTRExQYXJhbShqYXZhV1NETFBhcmFtKTsKLQkKLQl9Ci0KLQkvKioKLQkqIEV4ZWN1dGUgRGVmYXVsdHNGb3JKYXZhVG9XU0RMVGFzawotCSovCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKCBFbnZpcm9ubWVudCBlbnYgKSB7Ci0KLQkJU3RhdHVzIHN0YXR1czsKLQkJaWYgKGphdmFXU0RMUGFyYW1fID09IG51bGwpIHsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICJEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMVGFzayIsIGNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUiApOwotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQkJaWYgKGphdmFCZWFuTmFtZV8gPT0gbnVsbCkgeyAgLy8gZWl0aGVyIHNldCBieSBleHRlbnNpb24gcG9pbnQgb3IgYmVhbiBjbGFzcyBwYWdlCi0JCQlqYXZhQmVhbk5hbWVfID0gamF2YVdTRExQYXJhbV8uZ2V0QmVhbk5hbWUoKTsKLQkJCWlmIChqYXZhQmVhbk5hbWVfID09IG51bGwpIHsKLQkJCQkvL3JtIGphdmFCZWFuTmFtZV8gPSBpc2RFbGVtZW50LmdldEphdmFCZWFuTmFtZSgpOwotCQkJCWphdmFXU0RMUGFyYW1fLnNldEJlYW5OYW1lKGphdmFCZWFuTmFtZV8pOwotCQkJfQotCQl9Ci0JCS8vIHJtIFdTUGFyc2VyXyA9CShXZWJTZXJ2aWNlc1BhcnNlcikgd3NlXy5nZXRXU1BhcnNlcigpOwotCQkKLQkJamF2YVdTRExQYXJhbV8uc2V0U2VydmVyU2lkZShKYXZhV1NETFBhcmFtZXRlci5TRVJWRVJfU0lERV9CRUFOKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0U2tlbGV0b25EZXBsb3koZmFsc2UpOwotCi0JCWphdmFXU0RMUGFyYW1fLnNldEJlYW5OYW1lKGphdmFCZWFuTmFtZV8pOwotCQlTdHJpbmcgY2xhc3NwYXRoID0gQ2xhc3NwYXRoVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRDbGFzc3BhdGhTdHJpbmcoc2VydmljZVByb2plY3RfLCBtb2R1bGVOYW1lXyk7Ci0JCWphdmFXU0RMUGFyYW1fLnNldENsYXNzcGF0aChjbGFzc3BhdGgpOwotCi0JCVN0cmluZyBzaW1wbGVCZWFuTmFtZSA9IGphdmFCZWFuTmFtZV87Ci0JCVN0cmluZyBiZWFuUGFja2FnZU5hbWUgPSBudWxsOwotCQlpZiAoamF2YUJlYW5OYW1lXyAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBqYXZhQmVhbk5hbWVfLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlzaW1wbGVCZWFuTmFtZSA9IGphdmFCZWFuTmFtZV8uc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQkJYmVhblBhY2thZ2VOYW1lID0gamF2YUJlYW5OYW1lXy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJfQotCQl9Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSBXU0RMVXRpbHMubWFrZU5hbWVzcGFjZShqYXZhV1NETFBhcmFtXy5nZXRCZWFuTmFtZSgpKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0KLQkJamF2YVdTRExQYXJhbV8uc2V0UG9ydFR5cGVOYW1lKHNpbXBsZUJlYW5OYW1lKTsKLQkJamF2YVdTRExQYXJhbV8uc2V0U2VydmljZU5hbWUoc2ltcGxlQmVhbk5hbWUgKyBTRVJWSUNFX05BTUVfRVhUKTsKLQotCQlJUGF0aCBtb2R1bGVTZXJ2ZXJSb290ID0gbnVsbDsKLQotCQlJUGF0aCBtb2R1bGVQYXRoID0gc2VydmljZVByb2plY3RfLmdldEZ1bGxQYXRoKCk7Ci0JCUlQYXRoIHdlYmluZlBhdGggPSBzZXJ2aWNlUHJvamVjdF8uZ2V0RnVsbFBhdGgoKTsKLQkJdHJ5IHsKLQkJCS8vaWYgKCBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChzZXJ2aWNlUHJvamVjdF8pKSB7Ci0gICAgICBpZiAoSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KHNlcnZpY2VQcm9qZWN0XywgbW9kdWxlTmFtZV8pKXsKLQkJCQltb2R1bGVTZXJ2ZXJSb290ID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhU291cmNlTG9jYXRpb24oc2VydmljZVByb2plY3RfLCBtb2R1bGVOYW1lXyk7Ci0KLQkJCQkvLyBzaG91bGQgdXNlIE1vZHVsZUNvcmUuZ2V0U291cmNlQ29udGFpbmVycygpOwotLy8JCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3Qoc2VydmljZVByb2plY3RfKTsKLS8vCQkJCWlmIChjb250YWluZXIhPW51bGwpIHsKLS8vCQkJCQltb2R1bGVTZXJ2ZXJSb290ID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCk7Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJbW9kdWxlUGF0aCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aChzZXJ2aWNlUHJvamVjdF8sIG1vZHVsZU5hbWVfKTsKLQkJCQl3ZWJpbmZQYXRoID0gSjJFRVV0aWxzLmdldFdlYkluZlBhdGgoIHNlcnZpY2VQcm9qZWN0XywgbW9kdWxlTmFtZV8gKTsKLQkJCQkKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gIG5ldyBTaW1wbGVTdGF0dXMoICJEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMVGFzayIsIGNvbk1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfREVGQVVMVF9CRUFOIiksIFN0YXR1cy5FUlJPUiwgZSApOwotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCUlQYXRoIHdzZGxQYXRoID0KLQkJCW1vZHVsZVBhdGguYXBwZW5kKFdTRExfRk9MREVSKS5hcHBlbmQoc2ltcGxlQmVhbk5hbWUpLmFkZEZpbGVFeHRlbnNpb24oV1NETF9FWFQpOwotCi0JCXRyeXsKLQkJCUlGb2xkZXIgZm9sZGVyID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0Rm9sZGVyKG1vZHVsZVBhdGguYXBwZW5kKFdTRExfRk9MREVSKSk7Ci0JCQlGaWxlVXRpbC5jcmVhdGVGb2xkZXIoZm9sZGVyLCB0cnVlLCB0cnVlKTsKLQkJCi0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICJEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMVGFzayIsIGNvbk1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1JJVEVfV1NETCIpLCBTdGF0dXMuRVJST1IsIGUgKTsKLQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCVN0cmluZyB3c2RsTG9jYXRpb24gPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRGaWxlKHdzZGxQYXRoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0KLQkJamF2YVdTRExQYXJhbV8uc2V0T3V0cHV0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0JCWphdmFXU0RMUGFyYW1fLnNldElucHV0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0JCVdTRExTZXJ2aWNlUGF0aG5hbWVfID0gd3NkbFBhdGgudG9TdHJpbmcoKTsKLQotCQlpZiAod3NkbFBhdGggIT0gbnVsbCkgewotCQkJU3RyaW5nIHdzZGxVUkwgPSBQbGF0Zm9ybVV0aWxzLmdldEZpbGVVUkxGcm9tUGF0aChuZXcgUGF0aCh3c2RsTG9jYXRpb24pKTsKLQkJCVdTRExTZXJ2aWNlVVJMXyA9IHdzZGxVUkw7Ci0JCQkvLyBzZXQgcGFyc2VyIAotCQkJaWYgKHdzZGxVUkwgPT0gbnVsbCB8fCB3c2RsVVJMLmxlbmd0aCgpIDw9IDApIHsKLQkJCQlJUmVzb3VyY2UgcmVzID0KLQkJCQkJUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoV1NETFNlcnZpY2VQYXRobmFtZV8pOwotCQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQkJd3NkbFVSTCA9IChuZXcgVXRpbHMoKSkudG9GaWxlU3lzdGVtVVJJKHJlcyk7Ci0JCQl9Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotCQkJaWYgKHdzZGxVUkwgIT0gbnVsbCAmJiB3c2RsVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCWlmIChXU1BhcnNlcl8gPT0gbnVsbCkgewotCQkJCQlXU1BhcnNlcl8gPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsKLQkJCQl9Ci0JCQkJZGVmaW5pdGlvbiA9IFdTUGFyc2VyXy5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLQkJCX0KLQkJfQotCi0JCWphdmFXU0RMUGFyYW1fLnNldFN0eWxlKEphdmFXU0RMUGFyYW1ldGVyLlNUWUxFX1JQQyk7Ci0JCWphdmFXU0RMUGFyYW1fLnNldFVzZShKYXZhV1NETFBhcmFtZXRlci5VU0VfRU5DT0RFRCk7Ci0KLQkJU3RyaW5nIHByb2plY3RVUkwgPSBTZXJ2ZXJVdGlscy5nZXRFbmNvZGVkV2ViQ29tcG9uZW50VVJMKHNlcnZpY2VQcm9qZWN0XywgbW9kdWxlTmFtZV8pOwotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETFRhc2siLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfVVJMIiksIFN0YXR1cy5FUlJPUik7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWphdmFXU0RMUGFyYW1fLnNldFVybExvY2F0aW9uKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIittb2R1bGVOYW1lXyk7Ci0vLwkJfQotCQkKLQkJU3RyaW5nIHNlcnZpY2VVUkwgPSBwcm9qZWN0VVJMICsgU0VSVklDRV9FWFQgKyBzaW1wbGVCZWFuTmFtZTsKLQkJamF2YVdTRExQYXJhbV8uc2V0VXJsTG9jYXRpb24oc2VydmljZVVSTCk7Ci0JCQotCQlqYXZhV1NETFBhcmFtXy5zZXRNZXRhSW5mT25seSh0cnVlKTsKLQkJLy8JCVN0cmluZyBqYXZhT3V0cHV0ID0gUGxhdGZvcm1VdGlscy5nZXRQbGF0Zm9ybVVSTChtb2R1bGVTZXJ2ZXJSb290KTsKLQkJLy8JCVN0cmluZyBvdXRwdXQgPSBQbGF0Zm9ybVV0aWxzLmdldFBsYXRmb3JtVVJMKG1vZHVsZVBhdGgpOwotCi0JCVN0cmluZyBqYXZhT3V0cHV0ID0JUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UobW9kdWxlU2VydmVyUm9vdCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotLy8JCVN0cmluZyBqYXZhT3V0cHV0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0Rm9sZGVyKG1vZHVsZVNlcnZlclJvb3QpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkKLQkJU3RyaW5nIHNlcnZpY2VOYW1lID0gamF2YVdTRExQYXJhbV8uZ2V0U2VydmljZU5hbWUoKTsKLQkJSVBhdGggb3V0cHV0UGF0aCA9CVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdlYmluZlBhdGgpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBvdXRwdXQgPSBzZXJ2aWNlUHJvamVjdF8uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlpZiAob3V0cHV0UGF0aCE9bnVsbCkKLQkJIG91dHB1dCA9IG91dHB1dFBhdGguYXBwZW5kKHNlcnZpY2VOYW1lKS50b1N0cmluZygpOwotCi0JCWphdmFXU0RMUGFyYW1fLnNldEphdmFPdXRwdXQoamF2YU91dHB1dCk7Ci0JCWphdmFXU0RMUGFyYW1fLnNldE91dHB1dChvdXRwdXQpOwotCQkKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLQkgKiBAcmV0dXJuIEphdmFXU0RMUGFyYW1ldGVyCi0JICovCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKSB7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtXzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBqYXZhV1NETFBhcmFtLgotCSAqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFXU0RMUGFyYW0oSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkgewotCQl0aGlzLmphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0KLQkvLyBybQotCS8qCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbF8gPSBtb2RlbDsKLQl9Ci0JKi8KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkgewotCQl0aGlzLnNlcnZpY2VQcm9qZWN0XyA9IHNlcnZpY2VQcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRKYXZhQmVhbk5hbWUoU3RyaW5nIGphdmFCZWFuTmFtZSkgewotCQl0aGlzLmphdmFCZWFuTmFtZV8gPSBqYXZhQmVhbk5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0V1NETFNlcnZpY2VVUkwoKSB7Ci0JCXJldHVybiBXU0RMU2VydmljZVVSTF87Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0V1NETFNlcnZpY2VQYXRobmFtZSgpIHsKLQkJcmV0dXJuIFdTRExTZXJ2aWNlUGF0aG5hbWVfOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd3NQYXJzZXIpIHsKLQkJdGhpcy5XU1BhcnNlcl8gPSB3c1BhcnNlcjsKLQl9Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJcmV0dXJuIFdTUGFyc2VyXzsKLQl9Ci0KLSAgcHVibGljIHZvaWQgc2V0T2JqZWN0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIGlmIChvYmplY3RTZWxlY3Rpb24gIT0gbnVsbCAmJiAhb2JqZWN0U2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqZWN0U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgc2V0SmF2YUJlYW5OYW1lKChTdHJpbmcpb2JqZWN0KTsKLSAgICB9Ci0gIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL0xpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQ0YmIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzayBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9MSVRFUkFMX1NVUFBPUlRfTUVTU0FHRSI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPQotCQkiVEFTS19ERVNDX0xJVEVSQUxfU1VQUE9SVF9NRVNTQUdFIjsKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgY29yZU1zZ1V0aWxzXzsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0KLQlwdWJsaWMgTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzaygpIHsKLQkgICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCsiLnBsdWdpbiIsIHRoaXMpOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsJCi0JfQotCQotCXB1YmxpYyBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkgICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCsiLnBsdWdpbiIsIHRoaXMpOwotCSAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0JICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0JICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsJCi0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQotCX0KLQotCi0JLyoqCi0JKiBFeGVjdXRlIExpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2sKLQkqLwotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixjb3JlTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCVN0cmluZyB1c2UgPSBqYXZhV1NETFBhcmFtXy5nZXRVc2UoKTsKLQkJaWYodXNlICE9IG51bGwgJiYgCi0JCQl1c2UuZXF1YWxzKEphdmFXU0RMUGFyYW1ldGVyLlVTRV9MSVRFUkFMKSl7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTElURVJBTF9TVVBQT1JUX01FU1NBR0UiKSwgU3RhdHVzLldBUk5JTkcpOwotCQkgICAgdHJ5Ci0JCQl7Ci0JCSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLQkJICAgIH0KLQkJICAgIGNhdGNoKFN0YXR1c0V4Y2VwdGlvbiBzZSkKLQkJCXsKLQkJICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCJVc2VyIGFib3J0ZWQiLFN0YXR1cy5FUlJPUik7Ci0JCSAgICB9Ci0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKQotCXsKLQkJamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svTW92ZURlcGxveW1lbnRGaWxlc1Rhc2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svTW92ZURlcGxveW1lbnRGaWxlc1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZlM2VhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL01vdmVEZXBsb3ltZW50RmlsZXNUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX01PVkVfREVQTE9ZTUVOVF9GSUxFUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX01PVkVfREVQTE9ZTUVOVF9GSUxFUyI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsJLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nICAgbW9kdWxlTmFtZV87Ci0JCi0gICAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtXzsKLQkKLQlwdWJsaWMgTW92ZURlcGxveW1lbnRGaWxlc1Rhc2soIFN0cmluZyBtb2R1bGVOYW1lICkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICAgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgICBjb3JlTXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29uc3VtcHRpb24iLCB0aGlzICk7Ci0gICAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICAgICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCSAgCi0JICBtb2R1bGVOYW1lXyA9IG1vZHVsZU5hbWU7Ci0gICAgfQotCi0gIC8qKgotCSogRXhlY3V0ZSBEZWZhdWx0c0ZvckphdmFUb1dTRExUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJaWYgKGphdmFXU0RMUGFyYW1fID09IG51bGwpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLGNvcmVNc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pBVkFfV1NETF9QQVJBTV9OT1RfU0VUIiksIFN0YXR1cy5FUlJPUik7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLQkJLy9TdHJpbmcgcHJvamVjdFVSTCA9IFJlc291cmNlVXRpbHMuZ2V0RW5jb2RlZFdlYlByb2plY3RVUkwocHJvamVjdCk7Ci0JCVN0cmluZyBwcm9qZWN0VVJMID0gU2VydmVyVXRpbHMuZ2V0RW5jb2RlZFdlYkNvbXBvbmVudFVSTChwcm9qZWN0LCBtb2R1bGVOYW1lXyk7Ci0JCQotCQlpZiAocHJvamVjdFVSTCA9PSBudWxsKSB7Ci0JCSAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9VUkwiLG5ldyBTdHJpbmdbXSB7IHByb2plY3QudG9TdHJpbmcoKX0pLCBTdGF0dXMuRVJST1IpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0gZWxzZSB7Ci0JCQlqYXZhV1NETFBhcmFtXy5zZXRQcm9qZWN0VVJMKHByb2plY3RVUkwpOwotCQl9Ci0KLQkJdHJ5IHsKLS8vCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkKLS8vCQkJCXJldHVybiBzdGF0dXM7Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5URVJBTCIpLCBTdGF0dXMuRVJST1IsIGV4KTsKLS8vCQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLS8vCQkgIHJldHVybiBzdGF0dXM7CQkgIAotLy8JCX0KLQkJU3RyaW5nW10gZGVwbG95RmlsZXMgPSBqYXZhV1NETFBhcmFtXy5nZXREZXBsb3ltZW50RmlsZXMoKTsKLQkJU3RyaW5nIGphdmFPdXRwdXQgPSBqYXZhV1NETFBhcmFtXy5nZXRKYXZhT3V0cHV0KCk7Ci0KLQkJaWYgKGRlcGxveUZpbGVzID09IG51bGwgfHwgamF2YU91dHB1dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQotCQlJUGF0aCB3ZWJpbmZQYXRoID0gSjJFRVV0aWxzLmdldFdlYkluZlBhdGgocHJvamVjdCwgbW9kdWxlTmFtZV8gKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBsb3lGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkZXBsb3lGaWxlc1tpXSk7Ci0gICAgICAgIFN0cmluZyByZXNvdXJjZVRvTW92ZSA9IGYuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB0YXJnZXRGaWxlTmFtZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZpbGUod2ViaW5mUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChyZXNvdXJjZVRvTW92ZSkpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQlGaWxlVXRpbC5jcmVhdGVUYXJnZXRGaWxlKGRlcGxveUZpbGVzW2ldLCB0YXJnZXRGaWxlTmFtZSwgdHJ1ZSk7Ci0JCQkJRmlsZSBkZXBsb3ltZW50RmlsZSA9IG5ldyBGaWxlKGRlcGxveUZpbGVzW2ldKTsKLQkJCQlkZXBsb3ltZW50RmlsZS5kZWxldGUoKTsKLQkJCQlkZXBsb3lGaWxlc1tpXSA9IHRhcmdldEZpbGVOYW1lOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX01PVkVfUkVTT1VSQ0UiLG5ldyBTdHJpbmdbXSB7IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSksIFN0YXR1cy5FUlJPUiwgZSk7Ci0JCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkKLQl7Ci0JCXJldHVybiBqYXZhV1NETFBhcmFtXzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKQotCXsKLQkJamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZlclByb2plY3QpCi0JewotCSAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL01vdmVKYXZhRmlsZXNUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL01vdmVKYXZhRmlsZXNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTNmMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Nb3ZlSmF2YUZpbGVzVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgTW92ZUphdmFGaWxlc1Rhc2sgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfTU9WRV9KQVZBX0ZJTEVTIjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfTU9WRV9KQVZBX0ZJTEVTIjsKLQotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIGNvcmVNc2dVdGlsc187Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbW9kdWxlTmFtZV87Ci0JLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci0KLQlwdWJsaWMgTW92ZUphdmFGaWxlc1Rhc2soU3RyaW5nIG1vZHVsZU5hbWUpIHsKLQkgICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkgICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCQkKLQkJdGhpcy5tb2R1bGVOYW1lXyA9IG1vZHVsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBNb3ZlSmF2YUZpbGVzVGFzaygpIHsKLQkgICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkgICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotCX0JCi0KLQlwdWJsaWMgTW92ZUphdmFGaWxlc1Rhc2soSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbSkgewotCSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotCSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQkgICAgY29yZU1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbnN1bXB0aW9uIiwgdGhpcyApOwotCSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7CSAgCi0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQotCX0KLQotCS8qKgotCSogRXhlY3V0ZSBEZWZhdWx0c0ZvckphdmFUb1dTRExUYXNrCi0JKi8KLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0JICAKLQkgIC8vIHJtIAotCSAgLyoKLQkgIC8vQmVnaW4gU2V0dGVycwotCSAgV2ViU2VydmljZUVsZW1lbnQgd3NlID0KLQkJCVdlYlNlcnZpY2VFbGVtZW50LmdldFdlYlNlcnZpY2VFbGVtZW50KG1vZGVsXyk7Ci0JICBzZXRTZXJ2aWNlUHJvamVjdCh3c2UuZ2V0U2VydmljZVByb2plY3QoKSk7Ci0JICAvL0VuZCBTZXR0ZXJzCi0JICAqLwotCSAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCSAgCi0JCWlmIChqYXZhV1NETFBhcmFtXyA9PSBudWxsKSB7Ci0JCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixjb3JlTXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KQVZBX1dTRExfUEFSQU1fTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICByZXR1cm4gc3RhdHVzOwkJICAKLQkJfQotCi0JCS8vIHJtIAotCQkvKgotCQlpZiAobW9kZWxfID09IG51bGwpIHsKLQkJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTU9ERUxfTk9UX1NFVCIpLCBTdGF0dXMuRVJST1IpOwotCQkgIHJldHVybiBzdGF0dXM7CQkgIAotCQl9Ci0JCSovCi0KLQkJSVByb2plY3QgcHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0XzsKLQkJLy9TdHJpbmcgcHJvamVjdFVSTCA9IFJlc291cmNlVXRpbHMuZ2V0RW5jb2RlZFdlYlByb2plY3RVUkwocHJvamVjdCk7Ci0JCVN0cmluZyBwcm9qZWN0VVJMID0gU2VydmVyVXRpbHMuZ2V0RW5jb2RlZFdlYkNvbXBvbmVudFVSTChwcm9qZWN0LCBtb2R1bGVOYW1lXyk7Ci0JCWlmIChwcm9qZWN0VVJMID09IG51bGwpIHsKLQkJICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX1VSTCIsbmV3IFN0cmluZ1tdIHtwcm9qZWN0LnRvU3RyaW5nKCl9KSwgU3RhdHVzLkVSUk9SKTsKLQkJICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJICAgIHJldHVybiBzdGF0dXM7CQkgIAotCi0JCX0gZWxzZSB7Ci0JCQlqYXZhV1NETFBhcmFtXy5zZXRQcm9qZWN0VVJMKHByb2plY3RVUkwpOwotCQl9Ci0KLQkJU3RyaW5nW10gamF2YUZpbGVzID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YUZpbGVzKCk7Ci0JCVN0cmluZyBqYXZhb3V0cHV0ID0gamF2YVdTRExQYXJhbV8uZ2V0SmF2YU91dHB1dCgpOyAgLy8gPHdlYnByb2plY3Q+L0phdmFTb3VyY2UKLQkJU3RyaW5nIG91dHB1dCA9IGphdmFXU0RMUGFyYW1fLmdldE91dHB1dCgpOyAgCQkgLy8gPHdlYnByb2plY3Q+L1dlYkNvbnRlbnQvTUVUQV9JTkYKLQotCQlpZihqYXZhRmlsZXMgPT0gbnVsbCB8fCBqYXZhb3V0cHV0ID09IG51bGwgJiYgb3V0cHV0ID09IG51bGwgKXsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YUZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHJlc291cmNlVG9Nb3ZlID0gamF2YUZpbGVzW2ldLnN1YnN0cmluZyhvdXRwdXQubGVuZ3RoKCkpOwotCQkJCVN0cmluZyB0YXJnZXRGaWxlTmFtZSA9IGphdmFvdXRwdXQgKyByZXNvdXJjZVRvTW92ZTsKLQkJCQlGaWxlIHJlc3VsdEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRGaWxlTmFtZSk7Ci0JCQkJLy8gY29weSBqYXZhIGZpbGVzIHRoYXQgd2l0aG91dCBvdmVyd3RyaXRpbmcgZXhpc3Rpbmcgb25lcwotLy8JCQkJaWYgKCFyZXN1bHRGaWxlLmV4aXN0cygpKSB7Ci0vLwkJCQkJRmlsZVV0aWwuY3JlYXRlVGFyZ2V0RmlsZSgKLS8vCQkJCQkJamF2YUZpbGVzW2ldLAotLy8JCQkJCQlqYXZhb3V0cHV0ICsgcmVzb3VyY2VUb01vdmUpOwotLy8JCQkJfQotCQkJCS8vIGRlbGV0ZSBqYXZhIGZpbGVzIGZyb20gdGhlIG91dHB1dCBkaXJlY3RvcnkKLQkJCQlGaWxlIHNvdXJjZSA9IG5ldyBGaWxlKGphdmFGaWxlc1tpXSk7Ci0JCQkJc291cmNlLmRlbGV0ZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NT1ZFX1JFU09VUkNFIixuZXcgU3RyaW5nW117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KSwgU3RhdHVzLkVSUk9SLCBlKTsKLQkJICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKQotCXsKLQkJamF2YVdTRExQYXJhbV8gPSBqYXZhV1NETFBhcmFtOwotCX0KLQkKLQlwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpIHsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKLQl7Ci0JICBzZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQl9Ci0JCi0JLy8gcm0KLQkvKgotCXB1YmxpYyB2b2lkIHNldE1vZGVsKE1vZGVsIG1vZGVsKQotCXsKLQkgIG1vZGVsXyA9IG1vZGVsOwotCX0KLQkqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Ta2VsZXRvbjJXU0RMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9Ta2VsZXRvbjJXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E0YTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svU2tlbGV0b24yV1NETENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzazsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudXRpbC5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS51dGlsLlBsYXRmb3JtVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudXRpbC5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ29weVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBTa2VsZXRvbjJXU0RMQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfU0tFTEVUT05fV1NETCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfU0tFTEVUT05fV1NETCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMID0gIkltcGwiOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0VYVCA9ICIvc2VydmljZXMvIjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFQgPSAid3NkbCI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsJLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xBU0ggPSAiLyI7CS8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RPQ09MX1NVRkZJWCA9ICI6Ly8iOwkvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFdTRExfRk9MREVSID0gIndzZGwiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbTsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwotICBwcml2YXRlIEhhc2hNYXAgdmlzaXRlZExpbmtzOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgIG1vZHVsZU5hbWVfOwotCi0gIHB1YmxpYyBTa2VsZXRvbjJXU0RMQ29tbWFuZCggU3RyaW5nIG1vZHVsZU5hbWUgKSB7Ci0gICAgc3VwZXIoV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoTEFCRUwpLCBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS5wbHVnaW4iLCB0aGlzICk7Ci0gICAgc2V0TmFtZSggTEFCRUwgKTsKLSAgICBzZXREZXNjcmlwdGlvbiggREVTQ1JJUFRJT04gKTsKLQkKLQltb2R1bGVOYW1lXyA9IG1vZHVsZU5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBFeGVjdXRlIFNrZWxldG9uMldTRExDb21tYW5kCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBpZiAoIShlbnYgaW5zdGFuY2VvZiBFY2xpcHNlRW52aXJvbm1lbnQpKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RfSU5fRUNMSVBTRV9FTlZJUk9OTUVOVCIsIG5ldyBTdHJpbmdbXSB7IlNrZWxldG9uMldTRExDb21tYW5kIn0pLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKGphdmFXU0RMUGFyYW0gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SLCBudWxsKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gIC8vIFJlYWQgV1NETAotICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotCVN0cmluZyB3c2RsVVJMID0gamF2YVdTRExQYXJhbS5nZXRJbnB1dFdzZGxMb2NhdGlvbigpOwotCXRyeQotCXsKLQkJVVJMIHVybCA9IG5ldyBVUkwod3NkbFVSTCk7Ci0JCWRlZmluaXRpb24gPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih1cmwudG9TdHJpbmcoKSk7Ci0JfQotCWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotCXsKLQkJd3NkbFVSTCA9IFBsYXRmb3JtVXRpbHMuZ2V0RmlsZVVSTEZyb21QYXRoKG5ldyBQYXRoKHdzZGxVUkwpKTsKLQkJZGVmaW5pdGlvbiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotCX0KLQotICAgIC8vIENvbXB1dGUgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGJlYW4gc2tlbGV0b24KLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBudWxsOwotICAgIFBvcnQgcG9ydCA9IG51bGw7Ci0gICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgU3RyaW5nQnVmZmVyIGJlYW5OYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgYmVhbk5hbWUuYXBwZW5kKFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZShkZWZpbml0aW9uKSk7Ci0gICAgICBiZWFuTmFtZS5hcHBlbmQoRE9UKTsKLSAgICAgIHRyeXsKLSAgICAgIHNlcnZpY2UgPSAoU2VydmljZSkgZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgcG9ydCA9IChQb3J0KSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgIGJlYW5OYW1lLmFwcGVuZChiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgYmVhbk5hbWUuYXBwZW5kKElNUEwpOwotICAgICAgamF2YVdTRExQYXJhbS5zZXRCZWFuTmFtZShiZWFuTmFtZS50b1N0cmluZygpKTsKLQotICAgICAgamF2YVdTRExQYXJhbS5zZXRQb3J0VHlwZU5hbWUoV1NETFV0aWxzLmdldFBvcnRUeXBlTmFtZShkZWZpbml0aW9uKSk7Ci0gICAgICBqYXZhV1NETFBhcmFtLnNldFNlcnZpY2VOYW1lKAotICAgICAgICBXU0RMVXRpbHMuZ2V0U2VydmljZUVsZW1lbnROYW1lKGRlZmluaXRpb24pKTsKLSAgICAgIGphdmFXU0RMUGFyYW0uc2V0QmVhblBhY2thZ2UoV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lKGRlZmluaXRpb24pKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKFRocm93YWJsZSBlKXsKLSAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgIH0gCi0gICAgZWxzZSB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1NETF9OT19ERUZJTklUSU9OIiwgbmV3IFN0cmluZ1tdIHt3c2RsVVJMfSksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIC8vIE1vZGlmeSBXU0RMIGVuZHBvaW50Ci0gICAgaWYgKHBvcnQgPT0gbnVsbCkgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dTRExfTk9fUE9SVCIsIG5ldyBTdHJpbmdbXSB7d3NkbFVSTH0pLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgIGZvciAoSXRlcmF0b3Igc2VydmljZXNJdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHNlcnZpY2VzSXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHMgPSAoU2VydmljZSlzZXJ2aWNlc0l0Lm5leHQoKTsKLSAgICAgIE1hcCBwb3J0cyA9IHMuZ2V0UG9ydHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgcG9ydHNJdCA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IHBvcnRzSXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwID0gKFBvcnQpcG9ydHNJdC5uZXh0KCk7Ci0gICAgICAgIG1vZGlmeUVuZHBvaW50KHApOwotICAgICAgfQotICAgIH0KLQotICAgIHZpc2l0ZWRMaW5rcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICAvLyBTZXQgV1NETCBmaWxlIG5hbWU6IGphdmFXU0RMUGFyYW0uc2V0T3V0cHV0V3NkbExvY2F0aW9uKCk7Ci0gICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotICAgIFN0cmluZyB3c2RsTG9jYXRpb24gPSBqYXZhV1NETFBhcmFtLmdldE91dHB1dFdzZGxMb2NhdGlvbigpOwotICAgIElQYXRoIHdzZGxQYXRoID0gbnVsbDsKLSAgICBJRmlsZSBvdXRwdXRGaWxlID0gbnVsbDsKLSAgICB0cnkgewotICAgICBpZih3c2RsTG9jYXRpb24gIT0gbnVsbCl7Ci0JCW91dHB1dEZpbGUgPSB3b3Jrc3BhY2UuZ2V0RmlsZUZvckxvY2F0aW9uKCBuZXcgUGF0aCh3c2RsTG9jYXRpb24pKTsKLSAgICAgfQotICAgICBlbHNlewotLy8JCXdzZGxQYXRoID0gc2VydmVyUHJvamVjdC5nZXRGdWxsUGF0aCgpOwotLy8JCQotLy8JCWlmIChzZXJ2ZXJQcm9qZWN0Lmhhc05hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKSkgewotLy8JCQkgICBKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJQcm9qZWN0ID0KLS8vCQkJCSAoSjJFRVdlYk5hdHVyZVJ1bnRpbWUpIHNlcnZlclByb2plY3QuZ2V0TmF0dXJlKAotLy8JCQkJICAgSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0vLwkJCSAgIHdzZGxQYXRoID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKCBzZXJ2ZXJQcm9qZWN0LCBtb2R1bGVOYW1lXyApOwotLy8JCQkgICAvL3dzZGxQYXRoID0gd3NkbFBhdGguYXBwZW5kKHdlYlByb2plY3QuZ2V0V0VCSU5GUGF0aCgpKTsKLS8vCQkJIH0KLS8vCQllbHNlIGlmIChzZXJ2ZXJQcm9qZWN0Lmhhc05hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpCi0vLwkJewotLy8JCQlFSkJOYXR1cmVSdW50aW1lIGVqYlByb2plY3QgPSBFSkJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUoc2VydmVyUHJvamVjdCk7Ci0vLwkJCXdzZGxQYXRoID0gd3NkbFBhdGguYXBwZW5kKGVqYlByb2plY3QuZ2V0TWV0YUZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpKTsKLS8vCQl9CQkKLS8vIFRPRE86ICBoYW5kbGUgRUpCIGNhc2UKLQkJICAgICB3c2RsUGF0aCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aCggc2VydmVyUHJvamVjdCwgbW9kdWxlTmFtZV8gKTsKLQkJCSBJUGF0aCB3c2RsRmlsZVBhdGggPSB3c2RsUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpLmFwcGVuZChwb3J0LmdldE5hbWUoKSkuYWRkRmlsZUV4dGVuc2lvbihXU0RMX0VYVCk7Ci0JCSAgICAgSUZvbGRlciBmb2xkZXIgPSBSZXNvdXJjZVV0aWxzCi0JCQkJCQkJCS5nZXRXb3Jrc3BhY2VSb290KCkKLQkJCQkJCQkJLmdldEZvbGRlcih3c2RsUGF0aC5hcHBlbmQoV1NETF9GT0xERVIpKTsKLQkJCSBGaWxlVXRpbC5jcmVhdGVGb2xkZXIoZm9sZGVyLCB0cnVlLCB0cnVlKTsJCi0JCSAgICAgb3V0cHV0RmlsZSA9IHdvcmtzcGFjZS5nZXRGaWxlKHdzZGxGaWxlUGF0aCk7Ci0JCQkgd3NkbExvY2F0aW9uID0gb3V0cHV0RmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkgamF2YVdTRExQYXJhbS5zZXRPdXRwdXRXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uKTsKLQkJCSAKLSAgICAgfQotCi0gICAgIC8vIGNvcHkgV1NETAotICAgICBDb3B5V1NETENvbW1hbmQgY29weVdTRExDb21tYW5kID0gbmV3IENvcHlXU0RMQ29tbWFuZCgpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0V2ViU2VydmljZXNQYXJzZXIod2ViU2VydmljZXNQYXJzZXIpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0V3NkbFVSSSh3c2RsVVJMKTsKLSAgICAgY29weVdTRExDb21tYW5kLnNldERlc3RpbmF0aW9uVVJJKG91dHB1dEZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICBjb3B5V1NETENvbW1hbmQuc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgU3RhdHVzIHN0YXR1cyA9IGNvcHlXU0RMQ29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgIGlmKHN0YXR1cyE9bnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKSB7Ci0gICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgfQotICAgIH0gCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV1JJVEVfV1NETCIsIG5ldyBTdHJpbmdbXSB7IHdzZGxMb2NhdGlvbiB9KSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIG1vZGlmeUVuZHBvaW50KFBvcnQgcG9ydCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ID0gcG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gbnVsbDsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgICB7Ci0gICAgICAgIHNvYXBBZGRyZXNzID0gKFNPQVBBZGRyZXNzKW9iajsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChzb2FwQWRkcmVzcyAhPSBudWxsKQotICAgIHsKLS8vICAgICAgU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldEVuY29kZWRXZWJQcm9qZWN0VVJMKHNlcnZlclByb2plY3QpOwotCSAgU3RyaW5nIHByb2plY3RVUkwgPSBTZXJ2ZXJVdGlscy5nZXRFbmNvZGVkV2ViQ29tcG9uZW50VVJMKHNlcnZlclByb2plY3QsIG1vZHVsZU5hbWVfKTsKLSAgICAgIGlmIChwcm9qZWN0VVJMID09IG51bGwpCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QUk9KRUNUX1VSTCIsIG5ldyBTdHJpbmdbXSB7c2VydmVyUHJvamVjdC50b1N0cmluZygpfSksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2VydmljZVVSTCA9IG5ldyBTdHJpbmdCdWZmZXIocHJvamVjdFVSTCk7Ci0gICAgICBzZXJ2aWNlVVJMLmFwcGVuZChTRVJWSUNFX0VYVCkuYXBwZW5kKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgIGphdmFXU0RMUGFyYW0uc2V0VXJsTG9jYXRpb24oc2VydmljZVVSTC50b1N0cmluZygpKTsKLSAgICAgIHNvYXBBZGRyZXNzLnNldExvY2F0aW9uVVJJKHNlcnZpY2VVUkwudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcmV0dXJuIEphdmFXU0RMUGFyYW1ldGVyCi0gICovCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotICAgIHJldHVybiBqYXZhV1NETFBhcmFtOwotICB9Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLSAgKiBAcGFyYW0gamF2YVdTRExQYXJhbSBUaGUgamF2YVdTRExQYXJhbSB0byBzZXQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0gICAgdGhpcy5qYXZhV1NETFBhcmFtID0gamF2YVdTRExQYXJhbTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmVyUHJvamVjdCBUaGUgc2VydmVyUHJvamVjdCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZlclByb2plY3QpIHsKLSAgICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKSB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEphdmFXU0RMUGFyYW0oKS5nZXRPdXRwdXRXc2RsTG9jYXRpb24oKSk7IAotICAgIFN0cmluZyB1cmwgPSAiIjsKLQkgIHRyeSB7Ci0gICAgCXVybCA9IGZpbGUudG9VUkwoKS50b1N0cmluZygpOwotICAgIH0KLQkgIGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpe30KLQlyZXR1cm4gdXJsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svVERDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3Rhc2svVERDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzZGMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL1REQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2s7Ci0KLXB1YmxpYyBjbGFzcyBURENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9ycyBleHRlbmRzIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sgCi17Ci0gIHB1YmxpYyBURENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9ycyhTdHJpbmcgbW9kdWxlTmFtZSkgCi0gIHsKLQlzdXBlcihtb2R1bGVOYW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvdGFzay9VcGRhdGVBeGlzV1NEREZpbGVUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL1VwZGF0ZUF4aXNXU0RERmlsZVRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlMmExMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS90YXNrL1VwZGF0ZUF4aXNXU0RERmlsZVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2s7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQXhpc1dTRERGaWxlVGFzayBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCQotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfVVBEQVRFX0FYSVNfV1NERCI7CQotCXByaXZhdGUgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19VUERBVEVfQVhJU19XU0REIjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBERVBMT1lfWFNMID0gImRlcGxveS54c2wiOwkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVQTE9ZX0JBSyA9ICJkZXBsb3kud3NkZC5iYWsiOwkJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIENMQVNTTkFNRV9QQVJBTSA9ICJuZXdDbGFzc05hbWUiOwkJLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgICBwcml2YXRlIE1lc3NhZ2VVdGlscyBjb3JlTXNnVXRpbHNfOwotCXByaXZhdGUgSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbV87Ci0JcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0JLy8gcm0gcHJpdmF0ZSBNb2RlbCBtb2RlbF87Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbW9kdWxlTmFtZV87Ci0KLQlwdWJsaWMgVXBkYXRlQXhpc1dTRERGaWxlVGFzayggU3RyaW5nIG1vZHVsZU5hbWUpIAotCXsKLQkgICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkgICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwkgCi0JCQotCQltb2R1bGVOYW1lXyA9IG1vZHVsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBVcGRhdGVBeGlzV1NEREZpbGVUYXNrKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pIHsKLQkgICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0JICAgIGNvcmVNc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb25zdW1wdGlvbiIsIHRoaXMgKTsKLQkgICAgc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsKLQkgICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwkgICAgCi0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0KLQkvKioKLQkqIEV4ZWN1dGUgVXBkYXRlQXhpc1dTRERGaWxlVGFzawotCSovCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotCSAgCi0JICAvLyBybQotCSAgLyoKLQkgIC8vQmVnaW4gU2V0dGVycwotCSAgV2ViU2VydmljZUVsZW1lbnQgd3NlID0KLQkJV2ViU2VydmljZUVsZW1lbnQuZ2V0V2ViU2VydmljZUVsZW1lbnQobW9kZWxfKTsKLQkgIHNldFNlcnZpY2VQcm9qZWN0KHdzZS5nZXRTZXJ2aWNlUHJvamVjdCgpKTsKLQkgIC8vRW5kIFNldHRlcnMKLQkgICovCi0JICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsJCQotCQlpZiAoamF2YVdTRExQYXJhbV8gPT0gbnVsbCkgewotCQkgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsY29yZU1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSkFWQV9XU0RMX1BBUkFNX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0KLQotCQkvLyBybSAKLQkJLyoKLQkJaWYgKG1vZGVsXyA9PSBudWxsKSB7Ci0JCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX01PREVMX05PVF9TRVQiKSwgU3RhdHVzLkVSUk9SKTsKLQkJICByZXR1cm4gc3RhdHVzOwkJICAKLQkJfQotCQkqLwotCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gc2VydmljZVByb2plY3RfOwotCQkvL1N0cmluZyBwcm9qZWN0VVJMID0gUmVzb3VyY2VVdGlscy5nZXRFbmNvZGVkV2ViUHJvamVjdFVSTChwcm9qZWN0KTsKLQkJU3RyaW5nIHByb2plY3RVUkwgPSBTZXJ2ZXJVdGlscy5nZXRFbmNvZGVkV2ViQ29tcG9uZW50VVJMKHByb2plY3QsIG1vZHVsZU5hbWVfKTsKLQkJaWYgKHByb2plY3RVUkwgPT0gbnVsbCkgewotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfVVJMIixuZXcgU3RyaW5nW10ge3Byb2plY3QudG9TdHJpbmcoKX0pLCBTdGF0dXMuRVJST1IpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCi0JCX0gZWxzZSB7Ci0JCQlqYXZhV1NETFBhcmFtXy5zZXRQcm9qZWN0VVJMKHByb2plY3RVUkwpOwotCQl9Ci0JCVN0cmluZyBvdXRwdXRMb2NhdGlvbiA9IGphdmFXU0RMUGFyYW1fLmdldEphdmFPdXRwdXQoKTsKLQkJaWYgKG91dHB1dExvY2F0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLS8vCQl0cnkgewotLy8JCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpKQotLy8JCQkJcmV0dXJuIHN0YXR1czsKLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLS8vCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVEVSQUwiKSwgU3RhdHVzLkVSUk9SLCBleCk7Ci0vLwkJICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLS8vCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCi0vLwkJfQotCQlTdHJpbmdbXSBqYXZhRmlsZXMgPSBqYXZhV1NETFBhcmFtXy5nZXRKYXZhRmlsZXMoKTsKLQkJU3RyaW5nIGphdmFvdXRwdXQgPSBqYXZhV1NETFBhcmFtXy5nZXRKYXZhT3V0cHV0KCk7Ci0JCVN0cmluZyBvdXRwdXQgPSBqYXZhV1NETFBhcmFtXy5nZXRPdXRwdXQoKTsKLQotLy8JCVN0cmluZyB3ZWJDb250ZW50UGF0aCA9CVJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyB3ZWJDb250ZW50UGF0aCA9CUoyRUVVdGlscy5nZXRXZWJDb250ZW50Q29udGFpbmVyKCBwcm9qZWN0LCBtb2R1bGVOYW1lXyApLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQotCQkJaWYgKGphdmFXU0RMUGFyYW1fLmdldERlcGxveW1lbnRGaWxlcygpICE9IG51bGwKLQkJCQkmJiBqYXZhV1NETFBhcmFtXy5nZXREZXBsb3ltZW50RmlsZXMoKS5sZW5ndGggPiAwKSB7Ci0KLQkJCQlTdHJpbmcgd3NkZF9kZXBsb3kgPSBqYXZhV1NETFBhcmFtXy5nZXREZXBsb3ltZW50RmlsZXMoKVswXTsKLQkJCQlQYXRoIGRlcGxveVBhdGggPSBuZXcgUGF0aCh3c2RkX2RlcGxveSk7Ci0JCQkJU3RyaW5nIGRlcGxveUJhY2t1cCA9Ci0JCQkJCWRlcGxveVBhdGgKLQkJCQkJCS5yZW1vdmVMYXN0U2VnbWVudHMoMSkKLQkJCQkJCS5hcHBlbmQoREVQTE9ZX0JBSykKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCUZpbGVVdGlsLmNyZWF0ZVRhcmdldEZpbGUod3NkZF9kZXBsb3ksIGRlcGxveUJhY2t1cCwgdHJ1ZSk7Ci0JCQkJU3RyaW5nIGRlcGxveVhTTCA9IGdldFBsdWdpbkZpbGVQYXRoKERFUExPWV9YU0wpLnRvU3RyaW5nKCk7Ci0KLQkJCQlUcmFuc2Zvcm1lckZhY3RvcnkgdEZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCQkJCS8vIFVzZSB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IHRvIGluc3RhbnRpYXRlIGEgVHJhbnNmb3JtZXIgdGhhdCB3aWxsIHdvcmsgd2l0aCAgCi0JCQkJLy8gdGhlIHN0eWxlc2hlZXQgeW91IHNwZWNpZnkuIFRoaXMgbWV0aG9kIGNhbGwgYWxzbyBwcm9jZXNzZXMgdGhlIHN0eWxlc2hlZXQKLQkJCQkvLyBpbnRvIGEgY29tcGlsZWQgVGVtcGxhdGVzIG9iamVjdC4KLQkJCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9Ci0JCQkJCXRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKG5ldyBTdHJlYW1Tb3VyY2UoZGVwbG95WFNMKSk7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKENMQVNTTkFNRV9QQVJBTSwgamF2YVdTRExQYXJhbV8uZ2V0QmVhbk5hbWUoKSk7Ci0KLQkJCQkvLyBVc2UgdGhlIFRyYW5zZm9ybWVyIHRvIGFwcGx5IHRoZSBhc3NvY2lhdGVkIFRlbXBsYXRlcyBvYmplY3QgdG8gYW4gWE1MIGRvY3VtZW50Ci0JCQkJLy8gKGZvby54bWwpIGFuZCB3cml0ZSB0aGUgb3V0cHV0IHRvIGEgZmlsZSAoZm9vLm91dCkuCi0JCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKAotCQkJCQluZXcgU3RyZWFtU291cmNlKGRlcGxveUJhY2t1cCksCi0JCQkJCW5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0od3NkZF9kZXBsb3kpKSk7Ci0KLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkgICAgU3RyaW5nW10gZXJyb3JNc2dTdHJpbmdzID0gbmV3IFN0cmluZ1tde3Byb2plY3QudG9TdHJpbmcoKSwgb3V0cHV0TG9jYXRpb24udG9TdHJpbmcoKSwgd2ViQ29udGVudFBhdGgudG9TdHJpbmcoKX07IAotCQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VQREFURV9BWElTX1dTREQiLCBlcnJvck1zZ1N0cmluZ3MpLCBTdGF0dXMuRVJST1IsIGUpOwotCQkgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkgICAgcmV0dXJuIHN0YXR1czsJCSAgCQkgIAotCQl9Ci0JCQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0UGx1Z2luRmlsZVBhdGgoU3RyaW5nIHBsdWdpbmZpbGVOYW1lKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGx1Z2luUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9Ci0JCQkJcGx1Z2luUmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uSUQpOwotCi0JCQlVUkwgbG9jYWxVUkwgPQotCQkJCVBsYXRmb3JtLmFzTG9jYWxVUkwoCi0JCQkJCW5ldyBVUkwocGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCksIHBsdWdpbmZpbGVOYW1lKSk7Ci0JCQlyZXR1cm4gbmV3IFBhdGgobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCW5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCVdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwKLQkJCQkJMCwKLQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCQkiTVNHX1BMVUdJTl9GSUxFX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCW5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsCi0JCQkJCVdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5JRCwKLQkJCQkJMCwKLQkJCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoCi0JCQkJCQkiTVNHX1BMVUdJTl9GSUxFX1VSTCIpLAotCQkJCQllKSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSogU2V0cyB0aGUgamF2YVdTRExQYXJhbS4KLQkqIEBwYXJhbSBqYXZhV1NETFBhcmFtIFRoZSBqYXZhV1NETFBhcmFtIHRvIHNldAotCSovCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JCWphdmFXU0RMUGFyYW1fID0gamF2YVdTRExQYXJhbTsKLQl9Ci0JCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW0oKQotCXsKLQkJcmV0dXJuIGphdmFXU0RMUGFyYW1fOwotCX0JCi0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCkKLQl7Ci0JICBzZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLQl9Ci0JCi0JLy8gcm0gCi0JLyoKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbCBtb2RlbCkKLQl7Ci0JICBtb2RlbF8gPSBtb2RlbDsKLQl9Ci0JKi8JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQXhpc0JlYW5GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0F4aXNCZWFuRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2YTYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQXhpc0JlYW5GcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXNEZXBsb3lDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5KYXZhMldTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5DaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQ29weUF4aXNKYXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suUmVmcmVzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuSmF2YVRvV1NETE1ldGhvZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5VcGRhdGVXRUJYTUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suTW92ZUphdmFGaWxlc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5VcGRhdGVBeGlzV1NEREZpbGVUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLldTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uV2FpdEZvckF1dG9CdWlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotICAKLXB1YmxpYyBjbGFzcyBBeGlzQmVhbkZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotIAotICBwdWJsaWMgQXhpc0JlYW5GcmFnbWVudCgpCi0gIHsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQxKCkpOwotICAgIGFkZCggbmV3IEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQyKCkpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQmVhbkNvbmZpZyIgICAgKSApOwotICAgIGFkZCggbmV3IE1hcHBpbmdGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDMoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkpIAotICB7Ci0gICAgLy9WYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBWYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCJTZXJ2aWNlUHJvamVjdE5hbWUiLCBudWxsICk7Ci0gICAgCi0gICAgLy9CVUF4aXNEZWZhdWx0aW5nQ29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotICAgIAotICAgIC8vV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFdTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIAotICAgIC8vQlVBeGlzQ29tbWFuZHMyIC0gdGhlc2UgcnVuIGFmdGVyIEJlYW5DbGFzc1dpZGdldAotICAgIC8vRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhQmVhbk5hbWUiLCBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlBhcnNlciIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ3VzdG9taXplU2VydmljZU1hcHBpbmdzIiwgQXhpc0JlYW5GcmFnbWVudC5NYXBwaW5nRnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vSmF2YVdTRExNZXRob2RDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQotICAgIC8vIEJVQXhpc0NvbW1hbmRzMyAtIHRoZXNlIHJ1biBhZnRlciBCZWFuQ29uZmlnV2lkZ2V0Ci0gICAgLy9MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmNsYXNzKTsKLSAgICAKLSAgICAvL0NoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLSAgICAvL3JlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9Db3B5QXhpc0phckNvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIAotICAgIC8vQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9KYXZhMldTRExDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBKYXZhMldTRExDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvL1JlZnJlc2hQcm9qZWN0Q29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgUmVmcmVzaFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9XU0RMMkphdmFDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLSAgICAKLQotICAgIC8vTW92ZUphdmFGaWxlc1Rhc2sKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgTW92ZUphdmFGaWxlc1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgTW92ZUphdmFGaWxlc1Rhc2suY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9VcGRhdGVBeGlzV1NEREZpbGVUYXNrCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhNb3ZlSmF2YUZpbGVzVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBVcGRhdGVBeGlzV1NEREZpbGVUYXNrLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2suY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9VcGRhdGVXRUJYTUxDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBVcGRhdGVXRUJYTUxDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgCi0gICAgLy9CdWlsZFByb2plY3RDb21tYW5kCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkZvcmNlQnVpbGQiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVmFsaWRhdGlvbk1hbmFnZXIiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvL1N0YXJ0UHJvamVjdENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7ICAgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VTZXJ2ZXJUeXBlSUQiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2FtcGxlU2VydmVyVHlwZUlEIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkIixTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAgICAgCi0gICAgLy9BeGlzRGVwbG95Q29tbWFuZAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoVXBkYXRlQXhpc1dTRERGaWxlVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBBeGlzRGVwbG95Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy9Db3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2sKLSAgICAvKgotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoVXBkYXRlQXhpc1dTRERGaWxlVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIiLCBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2suY2xhc3MpOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlU2VydmVyVHlwZUlEIiwgQ29weUF4aXNTZXJ2ZXJDb25maWdUYXNrLmNsYXNzKTsKLSAgICAqLwotICAgIAotICAgIC8vIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NETENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIEJVQXhpc0NvbW1hbmRzRnJhZ21lbnQxIGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotICB7ICAgIAotICAgIHB1YmxpYyBCVUF4aXNDb21tYW5kc0ZyYWdtZW50MSgpCi0gICAgewotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQoKSwgIiIpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDIgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgQlVBeGlzQ29tbWFuZHNGcmFnbWVudDIoKQotICAgIHsKLSAgICAgIC8vYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEphdmFUb1dTRExNZXRob2RDb21tYW5kKCksICIiKSk7Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBCVUF4aXNDb21tYW5kc0ZyYWdtZW50MyBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLSAgewotICAgIHB1YmxpYyBCVUF4aXNDb21tYW5kc0ZyYWdtZW50MygpCi0gICAgewotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzaygpLCAiIikpOwotICAgICAgLy9hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrKCksICIiKSk7Ci0gICAgICAvL2FkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFdhaXRGb3JBdXRvQnVpbGRDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgSmF2YTJXU0RMQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBXU0RMMkphdmFDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBNb3ZlSmF2YUZpbGVzVGFzaygpLCAiIikpOwotICAgICAgLy9hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBVcGRhdGVBeGlzV1NEREZpbGVUYXNrKCksICIiKSk7Ci0gICAgICAvL2FkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFVwZGF0ZVdFQlhNTENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQnVpbGRQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgICAgLy9hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBTdGFydFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBBeGlzRGVwbG95Q29tbWFuZCgpLCAiIikpOwotICAgICAgLy9hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDb3B5QXhpc1NlcnZlckNvbmZpZ1Rhc2soKSwgIiIpKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgIH0gICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBjbGFzcyBNYXBwaW5nRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLSAgewotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93TWFwcGluZ3NfOwotICAgIAotICAgIHB1YmxpYyBNYXBwaW5nRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICAKLSAgICAgIHNldFRydWVGcmFnbWVudCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQXhpc1NlcnZpY2VCZWFuTWFwcGluZyIgKSk7Ci0gICAgICBzZXRDb25kaXRpb24oIG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG93TWFwcGluZ3NfOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MoIGJvb2xlYW4gc2hvd01hcHBpbmdzICkKLSAgICB7Ci0gICAgICBzaG93TWFwcGluZ3NfID0gc2hvd01hcHBpbmdzOwotICAgIH0gICAgICAKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0JVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3ZTIxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICAvL05lZWQKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlSWRzXzsKLSAgCi0gIC8vUHJvdmlkZQotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRF87ICAvLyByc2sgcmV2aXNpdAotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1fOwotICBwcml2YXRlIFN0cmluZyBqYXZhQmVhbk5hbWVfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcl87Ci0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZUJ1aWxkXyA9IHRydWU7Ci0gIHByaXZhdGUgQm9vbGVhbiBJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkID0gQm9vbGVhbi5UUlVFOyAvLyByc2sgcmV2aXNpdAotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIHZhbGlkYXRpb25NYW5hZ2VyXzsKLSAgcHJpdmF0ZSBib29sZWFuIGN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5nc18gPSBmYWxzZTsKLSAgCi0gIC8vVGhpcyBpcyBwcm94eSBhbmQgY2xpZW50IHJlbGF0ZWQgaW5mb3JtYXRpb24KLSAgLy93aGljaCBjYW4gYmUgbnVsbGVkIGZvciBjb21tYW5kcyBkZWFsaW5nCi0gIC8vd2l0aCBzZXJ2aWNlIGNyZWF0aW9uLgotICAvL3JzayByZXZpc2l0Ci0gIHByaXZhdGUgQm9vbGVhbiBpc1Byb3h5UHJvamVjdF8gPSBCb29sZWFuLkZBTFNFOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRSdW50aW1lSURfID0gbnVsbDsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm94eVByb2plY3RfID0gbnVsbDsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzYW1wbGVQcm9qZWN0XyA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRF8gPSBudWxsOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICAKLSAgCVN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLS8vICAgIGlmIChzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkgIT0gbnVsbCkgeyAvLyBzZXJ2ZXIgZXhpc3RzCi0vLyAgICAJc2VydmljZUV4aXN0aW5nU2VydmVyXyA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotLy8gICAgfQotLy8gICAgaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2VydmljZVNlcnZlclR5cGVJRF8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgCXNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmljZUlkc18uZ2V0U2VydmVySWQoKTsKLS8vICAgICAgLy8gc2VydmVyIHdpbGwgYmUgY3JlYXRlZCBpbiBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQKLS8vICAgIH0KLSAgICAKLSAgICAvL2phdmFXU0RMUGFyYW0KLSAgICBqYXZhV1NETFBhcmFtXyA9IG5ldyBKYXZhV1NETFBhcmFtZXRlcigpOwotICAgICAKLS8vICAgIGlmIChpbml0aWFsU2VsZWN0aW9uXyA9PSBudWxsKSB7Ci0vLyAgICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkJVQXhpc0RlZmF1bHRpbmdDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotLy8JCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTklUSUFMX1NFTEVDVElPTiIpLCBTdGF0dXMuRVJST1IpOwotLy8JCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLS8vCQlyZXR1cm4gc3RhdHVzOwotLy8gICAgfQotICAgIAotCWlmIChqYXZhQmVhbk5hbWVfID09IG51bGwpIHsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkJVQXhpc0RlZmF1bHRpbmdDb21tYW5kIiwgLy8kTk9OLU5MUy0xJAotCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX05PX0pBVkFfQkVBTiIpLCAvLyROT04tTkxTLTEkCi0JCQkJU3RhdHVzLkVSUk9SKTsKLQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLS8vICAgIHRyeSB7Ci0vLwkJCi0vLwkJamF2YUJlYW5OYW1lXyA9IGdldEphdmFCZWFuRnJvbUluaXRpYWxTZWxlY3Rpb24oZW52KTsKLS8vCQkKLS8vCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZCIsIC8vJE5PTi1OTFMtMSQKLS8vCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5JVElBTF9TRUxFQ1RJT04iKSArICIgIiAvLyROT04tTkxTLTEkCi0vLwkJCQkrZS5nZXRDYXVzZSgpLnRvU3RyaW5nKCksIFN0YXR1cy5FUlJPUik7Ci0vLwkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotLy8JCXJldHVybiBzdGF0dXM7Ci0vLwl9Ci0gICAgCi0gICAgLy9wYXJzZXIKLSAgICBwYXJzZXJfID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gICAgCi0gICAgCi0gICAgCi0gICAgLy92YWxpZGF0aW9uTWFuYWdlcgotICAgIHZhbGlkYXRpb25NYW5hZ2VyXyA9IG5ldyBWYWxpZGF0aW9uTWFuYWdlcigpOwotICAgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SmF2YUJlYW5Gcm9tSW5pdGlhbFNlbGVjdGlvbihFbnZpcm9ubWVudCBlbnYpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgYmVhbkNsYXNzID0gIiI7Ci0gICAgSmF2YVJlc291cmNlRmlsdGVyIGZpbHRlciA9IG5ldyBKYXZhUmVzb3VyY2VGaWx0ZXIoKTsgCi0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbl87Ci0gICAgLy8KLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBJUmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhlIHNlbGVjdGlvbgotICAgICAgICBJUmVzb3VyY2UgcmVzID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIHJlcyA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgIAotICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdHMocmVzKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGdldCB0aGUgcGFja2FnZS1xdWFsaWZpZWQgY2xhc3MgbmFtZSB3aXRob3V0IGZpbGUgZXh0ZW5zaW9ucwotICAgICAgICAgIFN0cmluZyBiZWFuUGFja2FnZSA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVJlc291cmNlUGFja2FnZU5hbWUocmVzLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgIGlmIChiZWFuUGFja2FnZT09bnVsbCkKLSAgICAgICAgICAgIGJlYW5QYWNrYWdlID0gIiI7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYmVhblBhY2thZ2UgPSBiZWFuUGFja2FnZSArICIuIjsKLQotICAgICAgICAgIGJlYW5DbGFzcyA9IGJlYW5QYWNrYWdlICsgcmVzLmdldE5hbWUoKTsKLQotICAgICAgICAgIGlmIChiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgIGJlYW5DbGFzcyA9IGJlYW5DbGFzcy5zdWJzdHJpbmcoMCxiZWFuQ2xhc3MubGFzdEluZGV4T2YoJy4nKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vCi0gICAgcmV0dXJuIGJlYW5DbGFzczsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRSdW50aW1lSURfLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRSdW50aW1lSUQoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFJ1bnRpbWVJRF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgZm9yY2VCdWlsZF8uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRGb3JjZUJ1aWxkKCkKLSAgewotICAgIHJldHVybiBmb3JjZUJ1aWxkXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1Byb3h5UHJvamVjdF8uCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRJc1Byb3h5UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gaXNQcm94eVByb2plY3RfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGphdmFCZWFuTmFtZV8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEphdmFCZWFuTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gamF2YUJlYW5OYW1lXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqYXZhV1NETFBhcmFtXy4KLSAgICovCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkKLSAgewotICAgIHJldHVybiBqYXZhV1NETFBhcmFtXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJzZXJfLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFBhcnNlcigpCi0gIHsKLSAgICByZXR1cm4gcGFyc2VyXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm94eVByb2plY3RfLgotICAgKi8KLSAgcHVibGljIElQcm9qZWN0IGdldFByb3h5UHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gcHJveHlQcm9qZWN0XzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzYW1wbGVFeGlzdGluZ1NlcnZlcl8uCi0gICAqLwotICBwdWJsaWMgSVNlcnZlciBnZXRTYW1wbGVFeGlzdGluZ1NlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbXBsZVByb2plY3RfLgotICAgKi8KLSAgcHVibGljIElQcm9qZWN0IGdldFNhbXBsZVByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHNhbXBsZVByb2plY3RfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhbXBsZVNlcnZlclR5cGVJRF8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVNlcnZlclR5cGVJRCgpCi0gIHsKLSAgICByZXR1cm4gc2FtcGxlU2VydmVyVHlwZUlEXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uTWFuYWdlcl8uCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1hbmFnZXIgZ2V0VmFsaWRhdGlvbk1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRpb25NYW5hZ2VyXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgaW5pdGlhbFNlbGVjdGlvbl8gPSBpbml0aWFsU2VsZWN0aW9uOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8uCi0gICAqLwotICBwdWJsaWMgSVNlcnZlciBnZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0gIH0KLSAgCi0vLyAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlU2VydmVyVHlwZUlEKCkKLS8vICB7Ci0vLyAgICByZXR1cm4gc2VydmljZVNlcnZlclR5cGVJRF87Ci0vLyAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q3VzdG9taXplU2VydmljZU1hcHBpbmdzKCkKLSAgewotICAgIHJldHVybiBjdXN0b21pemVTZXJ2aWNlTWFwcGluZ3NfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKCkKLSAgewotICAgIHJldHVybiBJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkOwotICB9Ci0KLXB1YmxpYyB2b2lkIHNldEphdmFCZWFuTmFtZShTdHJpbmcgamF2YUJlYW5OYW1lKSB7Ci0JdGhpcy5qYXZhQmVhbk5hbWVfID0gamF2YUJlYW5OYW1lOwotfQotICAKLS8vICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzKQotLy8gIHsKLS8vICAgIHNlcnZpY2VJZHNfID0gaWRzOwotLy8gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ2xhc3NXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ2xhc3NXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NWJjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQmVhbkNsYXNzV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5KYXZhUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2cuRGlhbG9nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBCZWFuQ2xhc3NXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgcGx1Z2luSWRfICA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICB0aGlzUGx1Z2luID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLSAgcHJpdmF0ZSBJUHJvamVjdCAgICAgICAgICAgc2VydmVyUHJvamVjdF8gPSBudWxsOwotICBwcml2YXRlIENvbXBvc2l0ZSAgICAgICAgICBwYXJlbnRfID0gbnVsbDsKLSAgcHJpdmF0ZSBJV2l6YXJkQ29udGFpbmVyICAgY29udGV4dF8gPSBudWxsOwotICBwcml2YXRlIEphdmFSZXNvdXJjZUZpbHRlciBmaWx0ZXJfID0gbmV3IEphdmFSZXNvdXJjZUZpbHRlcigpOwotICBwcml2YXRlIElSZXNvdXJjZSAgICAgICAgICBpbml0aWFsUmVzb3VyY2VfID0gbnVsbDsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMSBmb3IgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfUEFHRSA9ICJQQkNMMDAwMSI7Ci0gIAotICBwcml2YXRlIFRleHQgYmVhbkNsYXNzVGV4dF87Ci0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMiBmb3IgdGhlIEJlYW4gU2VsZWN0aW9uIGZpZWxkIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX1RFWFRfQkVBTl9DTEFTUyA9ICJQQkNMMDAwMiI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gYmVhbkNsYXNzQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAzIGZvciB0aGUgQmVhbiBDbGFzcyBCcm93c2UgYnV0dG9uIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX0NMQVNTX0JST1dTRSA9ICJQQkNMMDAwMyI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gYmVhblJlc291cmNlQnJvd3NlQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDA0IGZvciB0aGUgQmVhbiBSZXNvdXJjZSBCcm93c2UgYnV0dG9uIG9mIHRoZSBCZWFuIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSA9ICJQQkNMMDAwNCI7Ci0gICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCB0aGlzUGx1Z2luICk7IAotICAgIAotICAgIHBhcmVudF8gPSBwYXJlbnQ7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGdyb3VwID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgNCApOwotICAgIAotICAgIGdyb3VwLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BCQ0xfUEFHRSIpICk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggZ3JvdXAsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUEJDTF9QQUdFICk7Ci0gICAgCi0gICAgYmVhbkNsYXNzVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIGdyb3VwLCAiTEFCRUxfQkVBTl9DTEFTU19OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUEJDTF9URVhUX0JFQU5fQ0xBU1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfVEVYVF9CRUFOX0NMQVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgCi0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggZ3JvdXAsICJCVVRUT05fQlJPV1NFX0NMQVNTRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFICk7Ci0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCcm93c2VDbGFzc2VzKCk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgYmVhblJlc291cmNlQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggZ3JvdXAsICJCVVRUT05fQlJPV1NFX0ZJTEVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSApOwotICAgIGJlYW5SZXNvdXJjZUJyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnJvd3NlRmlsZXMoKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZUNsYXNzZXMoKQotICB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IERpYWxvZ1V0aWxzLmJyb3dzZUNsYXNzZXMoIHBhcmVudF8uZ2V0U2hlbGwoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclByb2plY3RfLCBjb250ZXh0XyApOwotCi0gICAgaWYgKGNsYXNzTmFtZSE9bnVsbCkgYmVhbkNsYXNzVGV4dF8uc2V0VGV4dChjbGFzc05hbWUpOwotICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlRmlsZXMoKQotICB7Ci0gICAgSVJlc291cmNlIHRvcFJlc291cmNlID0gc2VydmVyUHJvamVjdF87Ci0gICAgCi0gICAgaWYgKHRvcFJlc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgdG9wUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKTsKLSAgICB9Ci0gICAgCi0gICAgSVJlc291cmNlIHJlc291cmNlIAotICAgICAgPSBEaWFsb2dVdGlscy5icm93c2VSZXNvdXJjZXMoIHBhcmVudF8uZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSZXNvdXJjZSwKLQkJCQkgICAgICAgICAgICAgICAgICAgICBpbml0aWFsUmVzb3VyY2VfLAotCQkJCSAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl8gKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgewotICAgICAgSVBhdGggIHBhdGggICAgID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICAgIFN0cmluZyBiYXNlbmFtZSA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLSAgICAgIAotICAgICAgaWYoIGJhc2VuYW1lICE9IG51bGwgJiYgYmFzZW5hbWUubGVuZ3RoKCkgPiAwICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGJlYW5QYWNrYWdlID0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKHBhdGgpOwotICAgICAgICBTdHJpbmcgYmVhbkNsYXNzID0gKGJlYW5QYWNrYWdlID09IG51bGwgPyBiYXNlbmFtZSA6IChiZWFuUGFja2FnZSArICIuIiArIGJhc2VuYW1lKSk7Ci0gICAgICAgIAotICAgICAgICBpZiggYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikgfHwgYmVhbkNsYXNzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBiZWFuQ2xhc3MgPSBiZWFuQ2xhc3Muc3Vic3RyaW5nKCAwLCBiZWFuQ2xhc3MubGFzdEluZGV4T2YoJy4nKSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBiZWFuQ2xhc3NUZXh0Xy5zZXRUZXh0KGJlYW5DbGFzcyk7Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50UGFnZSggSVdpemFyZFBhZ2UgcGFnZSApCi0gIHsKLSAgICBjb250ZXh0XyA9IHBhZ2UuZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCZWFuQ2xhc3NOYW1lKFN0cmluZyBiZWFuQ2xhc3NOYW1lKQotICB7Ci0gICAgYmVhbkNsYXNzVGV4dF8uc2V0VGV4dChiZWFuQ2xhc3NOYW1lKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRCZWFuQ2xhc3NOYW1lKCkKLSAgewotICAgIHJldHVybiBiZWFuQ2xhc3NUZXh0Xy5nZXRUZXh0KCkudHJpbSgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3ROYW1lKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBzZXJ2ZXJQcm9qZWN0XyA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSggbmV3IFBhdGgoIG5hbWUgKS5tYWtlQWJzb2x1dGUoKSApOyAgCi0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFJlc291cmNlKCBJUmVzb3VyY2UgcmVzb3VyY2UgKQotICB7Ci0gICAgaW5pdGlhbFJlc291cmNlXyA9IHJlc291cmNlOyAgCi0gIH0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vQmVhbkNvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTNkMTAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9CZWFuQ29uZmlnV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1vbi5KYXZhV1NETFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS51dGlsLlBsYXRmb3JtVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBCZWFuQ29uZmlnV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIAotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICAKLSAgcHJpdmF0ZSBCdXR0b24gICBycGNFbmNvZGVkQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gICBycGNMaXRlcmFsQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gICBkb2NMaXRlcmFsQnV0dG9uXzsKLSAgCi0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXJfOwotICAKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhUGFyYW1ldGVyXzsKLSAgCi0gIC8qIENPTlRFWFRfSUQgUEJDRjAwMDEgZm9yIHRoZSBCZWFuIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJDRl9QQUdFID0gIlBCQ0YwMDAxIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCQ0ZfUEFHRSA9ICJUT09MVElQX1BCQ0ZfUEFHRSI7Ci0JCi0gIHByaXZhdGUgVGV4dCB1cmlUZXh0XzsKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAwMiBmb3IgdGhlIFVSSSBmaWVsZCBvZiB0aGUgQmVhbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCQ0ZfVEVYVF9VUkkgPSAiUEJDRjAwMDIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9URVhUX1VSSSA9ICJUT09MVElQX1BCQ0ZfVEVYVF9VUkkiOwotCQotICBwcml2YXRlIFRleHQgd3NkbEZvbGRlclRleHRfOwotICAvKiBDT05URVhUX0lEIFBCQ0YwMDA2IGZvciB0aGUgV1NETCBGb2xkZXIgZmllbGQgaW4gdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GT0xERVIgPSAiUEJDRjAwMDYiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRk9MREVSID0gIlRPT0xUSVBfUEJDRl9URVhUX1dTRExfRk9MREVSIjsKLQkKLSAgcHJpdmF0ZSBUZXh0IHdzZGxGaWxlVGV4dF87Ci0gIC8qIENPTlRFWFRfSUQgUEJDRjAwMDcgZm9yIHRoZSBXU0RMIEZpbGUgZmllbGQgb2YgdGhlIEJlYW4gQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GSUxFID0gIlBCQ0YwMDA3IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUgPSAiVE9PTFRJUF9QQkNGX1RFWFRfV1NETF9GSUxFIjsKLQkKLSAgcHJpdmF0ZSBUcmVlIG1ldGhvZHNUcmVlXzsKLSAgLyogQ09OVEVYVF9JRCBQQk1FMDAwMiBmb3IgdGhlIE1ldGhvZHMgdHJlZSBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQk1FX1RSRUVfTUVUSE9EUyA9ICJQQk1FMDAwMiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQk1FX1RSRUVfTUVUSE9EUyA9ICJUT09MVElQX1BCTUVfVFJFRV9NRVRIT0RTIjsKLQkKLSAgcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl87Ci0gIC8qIENPTlRFWFRfSUQgUEJNRTAwMTAgZm9yIHRoZSBTZWxlY3QgQWxsIGJ1dHRvbiBvZiB0aGUgQmVhbiBNZXRob2RzIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMID0gIlBCTUUwMDEwIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEwgPSAiVE9PTFRJUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMIjsKLQkKLSAgcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXzsKLSAgLyogQ09OVEVYVF9JRCBQQk1FMDAxMSBmb3IgdGhlIERlc2VsZWN0IEFsbCBidXR0b24gb2YgdGhlIEJlYW4gTWV0aG9kcyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJNRV9CVVRUT05fREVTRUxFQ1RfQUxMID0gIlBCTUUwMDExIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCTUVfQlVUVE9OX0RFU0VMRUNUX0FMTCA9ICJUT09MVElQX1BCTUVfQlVUVE9OX0RFU0VMRUNUX0FMTCI7Ci0JCi0gIHByaXZhdGUgQnV0dG9uIHNob3dNYXBwaW5nc0NoZWNrYm94XzsKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAxNiBmb3IgdGhlIFNob3cgTWFwcGluZ3MgY2hlY2tib3ggb2YgdGhlIEJlYW4gTWV0aG9kcyBQYWdlICovICAgCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUDJOX1NIT1dfTUFQUElOR1MgPSAiUEJDRjAwMTYiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIFN0cmluZyAgICAgICBiYXNlQ29uUGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgICAgID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgTWVzc2FnZVV0aWxzIGJhc2VDb25VdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIGJhc2VDb25QbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICAgICAgICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICBVSVV0aWxzICAgICAgYmFzZUNvblVpVXRpbHMgPSBuZXcgVUlVdGlscyggYmFzZUNvblV0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICAKLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsgICAgCi0JcGFyZW50LnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCBUT09MVElQX1BCQ0ZfUEFHRSApICk7Ci0JUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZF8gKyAiLiIgKyBJTkZPUE9QX1BCQ0ZfUEFHRSApOwotICAgIAotICAgIENvbXBvc2l0ZSBjb25maWdHcm91cCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDIgKTsKLSAgICAKLSAgICB1cmlUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggY29uZmlnR3JvdXAsICJMQUJFTF9VUkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDRl9URVhUX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgd3NkbEZvbGRlclRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCBjb25maWdHcm91cCwgIkxBQkVMX09VVFBVVF9GT0xERVJfTkFNRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDRl9URVhUX1dTRExfRk9MREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgd3NkbEZpbGVUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggY29uZmlnR3JvdXAsICJMQUJFTF9PVVRQVVRfRklMRV9OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICApOwotICAgIHdzZGxGaWxlVGV4dF8uYWRkTGlzdGVuZXIoIFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gdWlVdGlscy5jcmVhdGVIb3Jpem9udGFsU2VwYXJhdG9yKCBwYXJlbnQsIDYgKTsKLSAgICAKLSAgICAvLyBUT0RPIHRoaXMgZ3JvdXAgaGFzIG5vIFRPT0xUSVAgb3IgSU5GT1BPUC4KLSAgICBHcm91cCAgICBtZXRob2RzR3JvdXAgPSBiYXNlQ29uVWlVdGlscy5jcmVhdGVHcm91cCggcGFyZW50LCAiTEFCRUxfTUVUSE9EUyIsIG51bGwsIG51bGwgKTsKLQltZXRob2RzR3JvdXAuc2V0TGF5b3V0RGF0YSggdWlVdGlscy5jcmVhdGVGaWxsQWxsKCkgKTsKLQkKLQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQltZXRob2RzR3JvdXAuc2V0TGF5b3V0KCBsYXlvdXQgKTsKLQkKLQltZXRob2RzVHJlZV8gPSB1aVV0aWxzLmNyZWF0ZVRyZWUoIG1ldGhvZHNHcm91cCwgVE9PTFRJUF9QQk1FX1RSRUVfTUVUSE9EUywgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCTUVfVFJFRV9NRVRIT0RTLAotCSAgICAgICAgICAgICAgICAgICAJCQkJICAgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTAl8IFNXVC5DSEVDSyApOwotCW1ldGhvZHNUcmVlXy5hZGRMaXN0ZW5lciggU1dULlNlbGVjdGlvbiwgc3RhdHVzTGlzdGVuZXIgKTsKLQotICAgIENvbXBvc2l0ZSBzZWxlY3RCdXR0b25zID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoIG1ldGhvZHNHcm91cCwgMiApOwotICAgIAotICAgIHNlbGVjdEFsbE1ldGhvZHNCdXR0b25fIAotICAgICAgPSBiYXNlQ29uVWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBzZWxlY3RCdXR0b25zLCAiQlVUVE9OX1NFTEVDVF9BTEwiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCTUVfQlVUVE9OX1NFTEVDVF9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMICk7Ci0gICAgc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIGRlc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8gCi0gICAgICA9IGJhc2VDb25VaVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oIHNlbGVjdEJ1dHRvbnMsICJCVVRUT05fREVTRUxFQ1RfQUxMIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9PTFRJUF9QQk1FX0JVVFRPTl9ERVNFTEVDVF9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQk1FX0JVVFRPTl9ERVNFTEVDVF9BTEwgKTsKLSAgICBkZXNlbGVjdEFsbE1ldGhvZHNCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoIGZhbHNlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgLy8gVE9ETyB0aGlzIGdyb3VwIGhhcyBubyBUT09MVElQIG9yIElORk9QT1AuCi0gICAgR3JvdXAgc3R5bGVHcm91cCA9IHVpVXRpbHMuY3JlYXRlR3JvdXAoIHBhcmVudCwgIkxBQkVMX1NUWUxFX1VTRSIsIG51bGwsIG51bGwgKTsKLSAgICAKLSAgICAvLyBUT0RPIHJhZGlvIGJ1dHRvbnMgaGF2ZSBubyBUT09MVElQIG9yIElORk9QT1AuCi0gICAgZG9jTGl0ZXJhbEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKCBzdHlsZUdyb3VwLCAiU1RZTEVfRE9DX0xJVEVSQUwiLCBudWxsLCBudWxsICk7Ci0gICAgcnBjTGl0ZXJhbEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKCBzdHlsZUdyb3VwLCAiU1RZTEVfUlBDX0xJVEVSQUwiLCBudWxsLCBudWxsICk7Ci0gICAgcnBjRW5jb2RlZEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVJhZGlvQnV0dG9uKCBzdHlsZUdyb3VwLCAiU1RZTEVfUlBDX0VOQ09ERUQiLCBudWxsLCBudWxsICk7Ci0gICAgCi0gICAgc2hvd01hcHBpbmdzQ2hlY2tib3hfID0gdWlVdGlscy5jcmVhdGVDaGVja2JveCggcGFyZW50LCAiTEFCRUxfRVhQTE9SRV9NQVBQSU5HU19CRUFOMlhNTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUDJOX1NIT1dfTUFQUElOR1MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUDJOX1NIT1dfTUFQUElOR1MgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVNlbGVjdEFsbCggYm9vbGVhbiB2YWx1ZSApCi0gIHsKLQlUcmVlSXRlbVtdIGl0ZW1zID0gbWV0aG9kc1RyZWVfLmdldEl0ZW1zKCk7Ci0JCi0JZm9yKCBpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKyApIAotCXsKLQkgIGl0ZW1zW2ldLnNldENoZWNrZWQodmFsdWUpOwotCX0KLQkKLQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q3VzdG9taXplU2VydmljZU1hcHBpbmdzKCBib29sZWFuIHZhbHVlICkKLSAgewotICAgIHNob3dNYXBwaW5nc0NoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIHZhbHVlICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5ncygpCi0gIHsKLSAgICByZXR1cm4gc2hvd01hcHBpbmdzQ2hlY2tib3hfID09IG51bGwgPyBmYWxzZSA6IHNob3dNYXBwaW5nc0NoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SmF2YVBhcmFtZXRlciggSmF2YVdTRExQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciApCi0gIHsKLSAgICBqYXZhUGFyYW1ldGVyXyA9IGphdmFQYXJhbWV0ZXI7Ci0gICAgCi0JU3RyaW5nIHdzZGxMb2NhdGlvbiA9IGphdmFQYXJhbWV0ZXIuZ2V0T3V0cHV0V3NkbExvY2F0aW9uKCk7Ci0KLQkvLyBUT0RPIFZlcmlmeSB0aGF0IHdlIG5lZWQgdG8gZmluZCB0aGUgV1NETCBpbiB0aGUgZWNsaXBzZSBmaWxlIHN5c3RlbS4KLQkvL0lGaWxlIGZpbGUgCi0JLy8gID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKHdzZGxMb2NhdGlvbikpOwotCS8vSVBhdGggd3NkbFBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JSVBhdGggd3NkbFBhdGggPSBuZXcgUGF0aCggd3NkbExvY2F0aW9uICk7Ci0JCi0Jd3NkbEZvbGRlclRleHRfLnNldFRleHQod3NkbFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkpOwotCXdzZGxGaWxlVGV4dF8uc2V0VGV4dCh3c2RsUGF0aC5sYXN0U2VnbWVudCgpKTsKLQkKLQlTdHJpbmcgbG9jYXRpb24gPSBqYXZhUGFyYW1ldGVyLmdldFVybExvY2F0aW9uKCk7Ci0JdXJpVGV4dF8uc2V0VGV4dChsb2NhdGlvbiA9PSBudWxsID8gIiIgOiBsb2NhdGlvbik7ICAKLQkKLQltZXRob2RzVHJlZV8ucmVtb3ZlQWxsKCk7Ci0JSGFzaHRhYmxlIG1ldGhvZHMgPSBqYXZhUGFyYW1ldGVyLmdldE1ldGhvZHMoKTsKLQlFbnVtZXJhdGlvbiBlID0gbWV0aG9kcy5rZXlzKCk7Ci0JCi0Jd2hpbGUoIGUuaGFzTW9yZUVsZW1lbnRzKCkgKQotCXsKLQkgIFN0cmluZyAgIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBUcmVlSXRlbSBpdGVtID0gbmV3IFRyZWVJdGVtKG1ldGhvZHNUcmVlXywgU1dULk5VTEwpOwotICAgICAgCi0gICAJICBpdGVtLnNldERhdGEobmFtZSk7Ci0gICAgICBpdGVtLnNldFRleHQobmFtZSk7Ci0gICAgICBpdGVtLnNldENoZWNrZWQoKCgoQm9vbGVhbikgbWV0aG9kcy5nZXQobmFtZSkpLmJvb2xlYW5WYWx1ZSgpKSk7Ci0JfQotCQotCVRyZWVJdGVtW10gaXRlbXMgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLQkKLQlpZiggaXRlbXMubGVuZ3RoID4gMCApIAotCXsKLQkgIG1ldGhvZHNUcmVlXy5zZXRTZWxlY3Rpb24oIG5ldyBUcmVlSXRlbVtdeyBpdGVtc1swXSB9ICk7Ci0JfQotCQotCVN0cmluZyBzdHlsZSA9IGphdmFQYXJhbWV0ZXIuZ2V0U3R5bGUoKTsKLQkKLQlpZiggc3R5bGUuZXF1YWxzKCBKYXZhV1NETFBhcmFtZXRlci5TVFlMRV9SUEMgKSApCi0JewotCSAgcnBjRW5jb2RlZEJ1dHRvbl8uc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQllbHNlIGlmKCBzdHlsZS5lcXVhbHMoIEphdmFXU0RMUGFyYW1ldGVyLlNUWUxFX0RPQ1VNRU5UICkgKQotCXsKLQkgIHJwY0xpdGVyYWxCdXR0b25fLnNldFNlbGVjdGlvbih0cnVlKTsJICAKLQl9Ci0JZWxzZQotCXsKLQkgIGRvY0xpdGVyYWxCdXR0b25fLnNldFNlbGVjdGlvbih0cnVlKTsgIAotCX0KLSAgfQotICAKLSAgcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFQYXJhbWV0ZXIoKQotICB7Ci0gICAgSVBhdGggd3NkbFBhdGggCi0gICAgICA9IG5ldyBQYXRoKCB3c2RsRm9sZGVyVGV4dF8uZ2V0VGV4dCgpLnRyaW0oKSApLmFwcGVuZCggd3NkbEZpbGVUZXh0Xy5nZXRUZXh0KCkudHJpbSgpICk7Ci0JSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCk7Ci0gICAgCi0JLy8gVE9ETyBEbyB3ZSBuZWVkIHRvIGdvIHRvIHRoZSBlY2xpcHNlIGZpbGUgc3lzdGVtPz8KLQkvL1N0cmluZyB3c2RsTG9jYXRpb24gPSB3b3Jrc3BhY2UuZ2V0RmlsZSh3c2RsUGF0aCkuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCVN0cmluZyB3c2RsTG9jYXRpb24gPSB3c2RsUGF0aC50b1N0cmluZygpOwotCQotCWphdmFQYXJhbWV0ZXJfLnNldE91dHB1dFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotCWphdmFQYXJhbWV0ZXJfLnNldElucHV0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0JCi0JU3RyaW5nIGZpbGVVUkwgPSBQbGF0Zm9ybVV0aWxzLmdldEZpbGVVUkxGcm9tUGF0aChuZXcgUGF0aCh3c2RsTG9jYXRpb24pKTsKLQotCUhhc2h0YWJsZSBtZXRob2RzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JVHJlZUl0ZW1bXSBpdGVtcyA9IG1ldGhvZHNUcmVlXy5nZXRJdGVtcygpOwotCQotCWZvciggaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKysgKSAKLQl7Ci0JICBUcmVlSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0JICBtZXRob2RzLnB1dCgoU3RyaW5nKWl0ZW0uZ2V0RGF0YSgpLCBuZXcgQm9vbGVhbihpdGVtLmdldENoZWNrZWQoKSkpOwotCX0KLQkKLQlqYXZhUGFyYW1ldGVyXy5zZXRNZXRob2RzKG1ldGhvZHMpOwotCQotCWlmKCBycGNFbmNvZGVkQnV0dG9uXy5nZXRTZWxlY3Rpb24oKSkgCi0JewotCSAgamF2YVBhcmFtZXRlcl8uc2V0U3R5bGUoSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfUlBDKTsKLQkgIGphdmFQYXJhbWV0ZXJfLnNldFVzZShKYXZhV1NETFBhcmFtZXRlci5VU0VfRU5DT0RFRCk7Ci0JfSAKLQllbHNlIGlmKCBycGNMaXRlcmFsQnV0dG9uXy5nZXRTZWxlY3Rpb24oKSkgCi0JewotCSAgamF2YVBhcmFtZXRlcl8uc2V0U3R5bGUoSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfRE9DVU1FTlQpOwotCSAgamF2YVBhcmFtZXRlcl8uc2V0VXNlKEphdmFXU0RMUGFyYW1ldGVyLlVTRV9MSVRFUkFMKTsKLQl9IAotCWVsc2UgCi0JewotCSAgamF2YVBhcmFtZXRlcl8uc2V0U3R5bGUoSmF2YVdTRExQYXJhbWV0ZXIuU1RZTEVfV1JBUFBFRCk7Ci0JICBqYXZhUGFyYW1ldGVyXy5zZXRVc2UoSmF2YVdTRExQYXJhbWV0ZXIuVVNFX0xJVEVSQUwpOwotCX0KLSAgICAKLQlyZXR1cm4gamF2YVBhcmFtZXRlcl87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSAKLSAgewotICAgIFN0YXR1cyAgICAgICByZXN1bHQgICA9IG51bGw7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgaWYoIHdzZGxGaWxlVGV4dF8uZ2V0VGV4dCgpLmVxdWFscyggIiIgKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoICJQQUdFX01TR19OT19GSUxFX1NQRUNJRklFRCIgKSwgU3RhdHVzLkVSUk9SICk7IAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgVHJlZUl0ZW1bXSBpdGVtcyAgICAgICAgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLSAgICAgIGJvb2xlYW4gICAgaXRlbVNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtcy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBpZiggaXRlbXNbaW5kZXhdLmdldENoZWNrZWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpdGVtU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmKCAhaXRlbVNlbGVjdGVkICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoICJQQUdFX01TR19OT19NRVRIT0RfU0VMRUNURUQiICksIFN0YXR1cy5FUlJPUiApOyAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9iZWFuL0RlZmF1bHRzRm9yQ29uZmlnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vRGVmYXVsdHNGb3JDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2YjIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vRGVmYXVsdHNGb3JDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIERlZmF1bHRzRm9yQ29uZmlnIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVBhcmFtZXRlcigpCi0gIHsKLSAgICBKYXZhV1NETFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBuZXcgSmF2YVdTRExQYXJhbWV0ZXIoKTsKLSAgICBIYXNodGFibGUgICAgICAgICBtZXRob2RzICAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgCi0gICAgbWV0aG9kcy5wdXQoICJtZXRob2QxIiwgbmV3IEJvb2xlYW4oIHRydWUgKSApOwotICAgIG1ldGhvZHMucHV0KCAibWV0aG9kMiIsIG5ldyBCb29sZWFuKCBmYWxzZSApICk7Ci0gICAgbWV0aG9kcy5wdXQoICJtZXRob2QzIiwgbmV3IEJvb2xlYW4oIHRydWUgKSApOwotICAgIAotICAgIHBhcmFtZXRlci5zZXRNZXRob2RzKCBtZXRob2RzICk7Ci0gICAgcGFyYW1ldGVyLnNldE91dHB1dFdzZGxMb2NhdGlvbiggIi9Tb21lUHJvai9Tb21lRm9sZGVyL1NvbWVGaWxlIiApOwotICAgIHBhcmFtZXRlci5zZXRVcmxMb2NhdGlvbiggIlNvbWVVUkxMb2NhdGlvbiIgKTsKLSAgICBwYXJhbWV0ZXIuc2V0U3R5bGUoIEphdmFXU0RMUGFyYW1ldGVyLlNUWUxFX0RPQ1VNRU5UICk7Ci0gICAgICAKLSAgICByZXR1cm4gcGFyYW1ldGVyOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9WYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvYmVhbi9WYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2NzEwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL2JlYW4vVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLmJlYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5KYXZhUmVzb3VyY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFZhbGlkYXRlT2JqZWN0U2VsZWN0aW9uQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgSkFWQV9FWFRFTlNJT04gPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgU3RyaW5nIENMQVNTX0VYVEVOU0lPTiA9ICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb247Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VQcm9qZWN0TmFtZTsKLQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBzZWxlY3RlZCBKYXZhIGJlYW4gY2FuIGJlIGxvYWRlZCBmcm9tIHRoZSBzZXJ2aWNlIHByb2plY3QuIElmIGl0IGNhbid0LCBhbiBlcnJvciBpcyBkaXNwbGF5ZWQuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgfQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgLy9NYWtlIHN1cmUgYSBiZWFuIGlzIHNlbGVjdGVkCi0gICAgU3RyaW5nIGphdmFCZWFuTmFtZSA9IG51bGw7Ci0gICAgaWYgKG9iamVjdFNlbGVjdGlvbiAhPSBudWxsICYmICFvYmplY3RTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBvYmplY3RTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBqYXZhQmVhbk5hbWUgPSAoKFN0cmluZylvYmplY3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCS8vVGhlIE9iamVjdFNlbGVjdGlvbldpZGdldCBuZXZlciBhcHBlYXJlZCBhbmQgc28gdGhlIElTdHVjdHVyZWRTZWxlY3Rpb24gZnJvbSAKLSAgICAgIAkvL09iamVjdFNlbGVjdGlvbldpZGdldE91dHB1dENvbW1hbmQgaXMgdGhlIGluaXRpYWwgc2VsZWN0aW9uLiAKLSAgICAgIAkvL0dldCB0aGUgSmF2YSBiZWFuIG5hbWUgZnJvbSB0aGUgc2VsZWN0aW9uLgotICAgICAgCXRyeQotCQl7Ci0gICAgICAJICBTeXN0ZW0ub3V0LnByaW50bG4ob2JqZWN0LmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ci0gICAgICAJICBqYXZhQmVhbk5hbWUgPSBnZXRKYXZhQmVhbkZyb21PYmplY3RTZWxlY3Rpb24ob2JqZWN0U2VsZWN0aW9uKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLQkJewotCQkgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTk9fSkFWQV9CRUFOIiksU3RhdHVzLkVSUk9SKTsKLQkJICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLQkJICByZXR1cm4gZXJyb3JTdGF0dXM7CQkJCi0JCX0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIGlmIChqYXZhQmVhbk5hbWU9PW51bGwgfHwgamF2YUJlYW5OYW1lLmxlbmd0aCgpPT0wKQotICAgIHsKLSAgICAgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTk9fSkFWQV9CRUFOIiksU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwotICAgICAgcmV0dXJuIGVycm9yU3RhdHVzOwotICAgIH0KLSAgICAKLSAgICAvL01ha2Ugc3VyZSBhIHByb2plY3QgaXMgc2VsZWN0ZWQKLSAgICBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKHNlcnZpY2VQcm9qZWN0TmFtZSkpOwotICAgIGlmIChzZXJ2aWNlUHJvamVjdD09bnVsbCkKLSAgICB7Ci0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fUFJPSkVDVCIpLFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgIHJldHVybiBlcnJvclN0YXR1czsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9NYWtlIHN1cmUgdGhlIHNlbGVjdGVkIGJlYW4gY2FuIGJlIGxvYWRlZCBmcm9tIHRoZSBzZWxlY3RlZCBwcm9qZWN0Ci0JaWYgKGphdmFCZWFuTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKEpBVkFfRVhURU5TSU9OKQotCQl8fCBqYXZhQmVhbk5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChDTEFTU19FWFRFTlNJT04pKSB7Ci0JCWphdmFCZWFuTmFtZSA9IGphdmFCZWFuTmFtZS5zdWJzdHJpbmcoMCwgamF2YUJlYW5OYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCX0KLQkKLSAgICB0cnkKLSAgICB7Ci0JICBKYXZhRU1GTmF0dXJlIGpNT0YgPSAoSmF2YUVNRk5hdHVyZSkgSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKHNlcnZpY2VQcm9qZWN0KTsKLQkgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPShKYXZhQ2xhc3MpIEphdmFDbGFzc0ltcGwucmVmbGVjdChqYXZhQmVhbk5hbWUsIGpNT0YuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JICBpZiAoIWphdmFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKSAKLQkgIHsJCQotCQlTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZCIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0xPQURfSkFWQV9CRUFOIiwgbmV3IFN0cmluZ1tdIHsgamF2YUJlYW5OYW1lLCBzZXJ2aWNlUHJvamVjdE5hbWUgfSksU3RhdHVzLkVSUk9SKTsKLQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0JCXJldHVybiBlcnJvclN0YXR1czsKLQkgIH0KLSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLQkgIFN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFUb1dTRExNZXRob2RDb21tYW5kIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTE9BRF9KQVZBX0JFQU4iLCBuZXcgU3RyaW5nW10geyBqYXZhQmVhbk5hbWUsIHNlcnZpY2VQcm9qZWN0TmFtZSB9KSxTdGF0dXMuRVJST1IpOwotCSAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvclN0YXR1cyk7Ci0gICAgICByZXR1cm4gZXJyb3JTdGF0dXM7ICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2aWNlUHJvamVjdE5hbWUgVGhlIHNlcnZpY2VQcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdE5hbWUoU3RyaW5nIHNlcnZpY2VQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuc2VydmljZVByb2plY3ROYW1lID0gc2VydmljZVByb2plY3ROYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIG9iamVjdFNlbGVjdGlvbiBUaGUgb2JqZWN0U2VsZWN0aW9uIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLm9iamVjdFNlbGVjdGlvbiA9IG9iamVjdFNlbGVjdGlvbjsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEphdmFCZWFuRnJvbU9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgYmVhbkNsYXNzID0gIiI7Ci0gICAgSmF2YVJlc291cmNlRmlsdGVyIGZpbHRlciA9IG5ldyBKYXZhUmVzb3VyY2VGaWx0ZXIoKTsgCi0gICAgLy9JU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uXzsKLSAgICAvLwotICAgIGlmIChvYmplY3RTZWxlY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gb2JqZWN0U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBnZXQgdGhlIElSZXNvdXJjZSByZXByZXNlbnRlZCBieSB0aGUgc2VsZWN0aW9uCi0gICAgICAgIElSZXNvdXJjZSByZXMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgcmVzID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0cyhyZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZ2V0IHRoZSBwYWNrYWdlLXF1YWxpZmllZCBjbGFzcyBuYW1lIHdpdGhvdXQgZmlsZSBleHRlbnNpb25zCi0gICAgICAgICAgU3RyaW5nIGJlYW5QYWNrYWdlID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZShyZXMuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgaWYgKGJlYW5QYWNrYWdlPT1udWxsKQotICAgICAgICAgICAgYmVhblBhY2thZ2UgPSAiIjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBiZWFuUGFja2FnZSA9IGJlYW5QYWNrYWdlICsgIi4iOwotCi0gICAgICAgICAgYmVhbkNsYXNzID0gYmVhblBhY2thZ2UgKyByZXMuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgaWYgKGJlYW5DbGFzcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamF2YSIpIHx8IGJlYW5DbGFzcy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotICAgICAgICAgICAgYmVhbkNsYXNzID0gYmVhbkNsYXNzLnN1YnN0cmluZygwLGJlYW5DbGFzcy5sYXN0SW5kZXhPZignLicpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8KLSAgICByZXR1cm4gYmVhbkNsYXNzOwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9BeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9BeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjZhMTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV1NETFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotCi1wdWJsaWMgY2xhc3MgQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb247Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUklfOwotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW07Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KXsKLSAgICAKLSAgICBqYXZhV1NETFBhcmFtID0gbmV3IEphdmFXU0RMUGFyYW1ldGVyKCk7Ci0gICAgamF2YVdTRExQYXJhbS5zZXRTZXJ2ZXJTaWRlKEphdmFXU0RMUGFyYW1ldGVyLlNFUlZFUl9TSURFX0JFQU4pOwotICAgIGphdmFXU0RMUGFyYW0uc2V0U2tlbGV0b25EZXBsb3kodHJ1ZSk7Ci0gICAgamF2YVdTRExQYXJhbS5zZXRNZXRhSW5mT25seShmYWxzZSk7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLmluaXRpYWxTZWxlY3Rpb24gPSBpbml0aWFsU2VsZWN0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T2JqZWN0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIHRoaXMub2JqZWN0U2VsZWN0aW9uID0gb2JqZWN0U2VsZWN0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotICAKLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIGlmICh3ZWJTZXJ2aWNlc1BhcnNlciA9PSBudWxsKQotCQl3ZWJTZXJ2aWNlc1BhcnNlciA9IFdTRExQYXJzZXJGYWN0b3J5LmdldFdTRExQYXJzZXIoKTsKLSAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VVUkkoKQotICB7Ci0gICAgaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCAmJiAhaW5pdGlhbFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICB7Ci0gICAgICAgIElGaWxlIGlmaWxlID0gKElGaWxlKWZpcnN0RWxlbWVudDsKLSAgICAgICAgU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBpZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgICAgIGlmIChmaWxlRXh0ZW5zaW9uLmVxdWFscygid3NkbCIpIHx8Ci0gICAgICAgICAgICBmaWxlRXh0ZW5zaW9uLmVxdWFscygid3NpbCIpIHx8Ci0gICAgICAgICAgICBmaWxlRXh0ZW5zaW9uLmVxdWFscygiaHRtbCIpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGlmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAiIjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotLy8gICAgaWYgKG9iamVjdFNlbGVjdGlvbiAhPSBudWxsICYmICFvYmplY3RTZWxlY3Rpb24uaXNFbXB0eSgpKQotLy8gICAgewotLy8gICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqZWN0U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotLy8gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotLy8gICAgICAgIHJldHVybiAoKElSZXNvdXJjZSlvYmplY3QpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLS8vICAgICAgZWxzZQotLy8gICAgICAgIHJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiAiIjsKLQkgIHJldHVybiB3c2RsVVJJXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotCSAgd3NkbFVSSV8gPSB3c2RsVVJJOwotCSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbldTSUwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzaWxVUkkoKQotICB7Ci0gICAgU3RyaW5nIHdzVVJJID0gZ2V0V3NkbFVSSSgpOwotICAgIGludCBpbmRleCA9IHdzVVJJLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIod3NVUkkuc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0gICAgICBzYi5hcHBlbmQoIi53c2lsIik7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgSmF2YVdTRExQYXJhbWV0ZXIgZ2V0SmF2YVdTRExQYXJhbSgpCi0gIHsKLSAgICByZXR1cm4gamF2YVdTRExQYXJhbTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHR0cEJhc2ljQXV0aFBhc3N3b3JkKCkKLSAgewotICAgIHJldHVybiBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpLmdldEhUVFBCYXNpY0F1dGhQYXNzd29yZCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkuZ2V0SFRUUEJhc2ljQXV0aFVzZXJuYW1lKCk7Ci0gIH0KLSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9BeGlzU2tlbGV0b25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9BeGlzU2tlbGV0b25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg2YTE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vQXhpc1NrZWxldG9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmQuQXhpc0RlcGxveUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5Db3B5QXhpc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5WYWxpZGF0ZVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQXhpc01hcHBpbmdzRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5Db21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5VcGRhdGVXRUJYTUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suTW92ZURlcGxveW1lbnRGaWxlc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5Ta2VsZXRvbjJXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQnVpbGRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRQcm9qZWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5PcGVuSmF2YUVkaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5Qcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuU2VydmVyTmFtZTJJU2VydmVyVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotcHVibGljIGNsYXNzIEF4aXNTa2VsZXRvbkZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotICBwdWJsaWMgQXhpc1NrZWxldG9uRnJhZ21lbnQoKQotICB7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBWYWxpZGF0ZVdTRExDb21tYW5kKCksICIiKSk7Ci0gICAgLy9hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIlNrZWxldG9uQ29uZmlnIikgKTsKLSAgICBhZGQoIG5ldyBBeGlzTWFwcGluZ3NGcmFnbWVudCgpICk7Ci0gICAgLy9hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2soKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKCksICIiKSk7Ci0gICAgLy9hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENvcHlBeGlzSmFyQ29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV1NETDJKYXZhQ29tbWFuZCgpLCAiIikpOwotICAgIC8vYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBNb3ZlRGVwbG95bWVudEZpbGVzVGFzaygpLCAiIikpOwotICAgIC8vYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTa2VsZXRvbjJXU0RMQ29tbWFuZCgpLCAiIikpOwotICAgIC8vYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBVcGRhdGVXRUJYTUxDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBSZWZyZXNoUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IEJ1aWxkUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICAvL2FkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgIC8vIHRoZSBzZWNvbmQgYnVpbGQgcHJvamVjdCBjb21tYW5kIGlzIG5lZWRlZCB0byBzeW5jaHJvbml6ZSB3aXRoIHdvcmtzcGFjZSBhdXRvIGJ1aWxkCi0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBCdWlsZFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBBeGlzRGVwbG95Q29tbWFuZCgpLCAiIikpOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCksICIiKSk7Ci0gICAgYWRkIChuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQoKSwgIiIpKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpLCAiIikpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgLy8gVHJhbnNmb3JtZXJzCi0gICAgUHJvamVjdE5hbWUySVByb2plY3RUcmFuc2Zvcm1lciBwcm9qZWN0VHJhbnNmb3JtZXIgPSBuZXcgUHJvamVjdE5hbWUySVByb2plY3RUcmFuc2Zvcm1lcigpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIFZhbGlkYXRlV1NETENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgVmFsaWRhdGVXU0RMQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgVmFsaWRhdGVXU0RMQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2sKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnNUYXNrLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0KLSAgICAvLyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmNsYXNzLCAiUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcyk7Ci0gICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uVHJlZVdpZGdldC5jbGFzcywgIldzZGxVUkkiLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkh0dHBCYXNpY0F1dGhVc2VybmFtZSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSHR0cEJhc2ljQXV0aFBhc3N3b3JkIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAvLyBNb3ZlRGVwbG95bWVudEZpbGVzVGFzawotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBNb3ZlRGVwbG95bWVudEZpbGVzVGFzay5jbGFzcyk7Ci0KLSAgICAvLyBDb3B5QXhpc0phckNvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDb3B5QXhpc0phckNvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLQotICAgIC8vIFNrZWxldG9uMldTRExDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFNrZWxldG9uMldTRExDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBTa2VsZXRvbjJXU0RMQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgU2tlbGV0b24yV1NETENvbW1hbmQuY2xhc3MpOwotCi0gICAgLy8gVXBkYXRlV0VCWE1MQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFVwZGF0ZVdFQlhNTENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLQotICAgIC8vIFJlZnJlc2hQcm9qZWN0Q29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFJlZnJlc2hQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotICAgIAotICAgIC8vIEJ1aWxkUHJvamVjdENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0KLSAgICAvLyBTdGFydFByb2plY3RDb21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclNlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIiLCBuZXcgU2VydmVyTmFtZTJJU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29weUF4aXNKYXJDb21tYW5kLmNsYXNzLCAiUHJvamVjdFJlc3RhcnRSZXF1aXJlZCIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MsICJJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkIiwgbnVsbCk7Ci0KLSAgICAvLyBBeGlzRGVwbG95Q29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQXhpc0RlcGxveUNvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbjJXU0RMQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETDJKYXZhQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQuY2xhc3MpOwotICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b24yV1NETENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmNsYXNzKTsKLSAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIE9wZW5KYXZhRWRpdG9yQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZC5jbGFzcywgIkNsYXNzTmFtZXMiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL1NrZWxldG9uQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL1NrZWxldG9uQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjExNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2lkZ2V0cy9za2VsZXRvbi9Ta2VsZXRvbkNvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBTa2VsZXRvbkNvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW07Ci0KLSAgLyogQ09OVEVYVF9JRCBQQlNDMDAwMSBmb3IgdGhlIFNrZWxldG9uIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCU0NfUEFHRSA9ICJQQlNDMDAwMSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJTQ19QQUdFID0gIlRPT0xUSVBfUEJTQ19QQUdFIjsKLSAgCi0gIC8vIHByaXZhdGUgVGV4dCB1cmlUZXh0XzsKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAwMiBmb3IgdGhlIFVSSSBmaWVsZCBvZiB0aGUgQmVhbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCQ0ZfVEVYVF9VUkkgPSAiUEJDRjAwMDIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9URVhUX1VSSSA9ICJUT09MVElQX1BCQ0ZfVEVYVF9VUkkiOwotICAKLSAgcHJpdmF0ZSBUZXh0IHdzZGxGb2xkZXJUZXh0XzsKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAwNiBmb3IgdGhlIFdTREwgRm9sZGVyIGZpZWxkIGluIHRoZSBCZWFuIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUEJDRl9URVhUX1dTRExfRk9MREVSID0gIlBCQ0YwMDA2IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUiA9ICJUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZPTERFUiI7Ci0gIAotICBwcml2YXRlIFRleHQgd3NkbEZpbGVUZXh0XzsKLSAgLyogQ09OVEVYVF9JRCBQQkNGMDAwNyBmb3IgdGhlIFdTREwgRmlsZSBmaWVsZCBvZiB0aGUgQmVhbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUgPSAiUEJDRjAwMDciOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRklMRSA9ICJUT09MVElQX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUiOwotICAKLSAgcHJpdmF0ZSBDb21ibyBza2VsZXRvbkZvbGRlclRleHRfOwotICAvKiBDT05URVhUX0lEIFBCU0MwMDA0IGZvciB0aGUgU2tlbGV0b24gRm9sZGVyIGZpZWxkIG9mIHRoZSBTa2VsZXRvbiBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSID0gIlBCU0MwMDA0IjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSID0gIlRPT0xUSVBfUEJTQ19URVhUX1NLRUxFVE9OX0ZPTERFUiI7Ci0gIC8vCi0KLSAgLyogQ09OVEVYVF9JRCBQQlNDMDAwNSBmb3IgdGhlIFNrZWxldG9uIEZvbGRlciBCcm93c2UgYnV0dG9uIG9mIHRoZSBTa2VsZXRvbiBDb25maWcgUGFnZSAqLwotICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQlNDX0JVVFRPTl9TS0VMRVRPTl9GT0xERVJfQlJPV1NFID0gIlBCU0MwMDA1IjsgLy8kTk9OLU5MUy0xJAotICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QQlNDX0JVVFRPTl9TS0VMRVRPTl9GT0xERVJfQlJPV1NFID0gIlRPT0xUSVBfUEJTQ19CVVRUT05fU0tFTEVUT05fRk9MREVSX0JST1dTRSI7Ci0gIAotICBwcml2YXRlIEJ1dHRvbiBzaG93TWFwcGluZ3NDaGVja2JveF87Ci0gIC8qIENPTlRFWFRfSUQgUEJTQzAwMTYgZm9yIHRoZSBTaG93IE1hcHBpbmdzIGNoZWNrYm94IG9mIHRoZSBCZWFuIE1ldGhvZHMgUGFnZSAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9OMlBfU0hPV19NQVBQSU5HUyA9ICJQQlNDMDAxNiI7IC8vJE5PTi1OTFMtMSQKLQkKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkICAgICAgICA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aSI7Ci0gICAgU3RyaW5nICAgICAgIGNvblBsdWdpbklkICAgICA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSI7Ci0gICAgU3RyaW5nICAgICAgIGJhc2VDb25QbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIAotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyAgICAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIE1lc3NhZ2VVdGlscyBjb25Nc2dVdGlscyAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCBjb25QbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIE1lc3NhZ2VVdGlscyBiYXNlQ29uTXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBiYXNlQ29uUGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgICAgICAgID0gbmV3IFVJVXRpbHMoIG1zZ1V0aWxzLCBwbHVnaW5JZCApOwotICAgIFVJVXRpbHMgICAgICBjb25VaVV0aWxzICAgICAgPSBuZXcgVUlVdGlscyggY29uTXNnVXRpbHMsIHBsdWdpbklkICk7Ci0gICAgVUlVdGlscyAgICAgIGJhc2VDb25VaVV0aWxzICA9IG5ldyBVSVV0aWxzKCBiYXNlQ29uTXNnVXRpbHMsIHBsdWdpbklkICk7Ci0KLSAgCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIHBhcmVudCwgcGx1Z2luSWQgKyAiLiIgKyAgSU5GT1BPUF9QQlNDX1BBR0UgKTsKLSAgCXBhcmVudC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHMuZ2V0TWVzc2FnZSggVE9PTFRJUF9QQlNDX1BBR0UgKSApOwotICAgIAotICAgIENvbXBvc2l0ZSB0ZXh0R3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAyLCAwLCAwICk7Ci0KLSAgICAvKgotICAgIHVyaVRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCB0ZXh0R3JvdXAsICJMQUJFTF9VUkkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BCQ0ZfVEVYVF9VUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDRl9URVhUX1VSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgKi8KLQotICAgIHdzZGxGb2xkZXJUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggdGV4dEdyb3VwLCAiTEFCRUxfT1VUUFVUX0ZPTERFUl9OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRk9MREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNGX1RFWFRfV1NETF9GT0xERVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLQotICAgIHdzZGxGaWxlVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHRleHRHcm91cCwgIkxBQkVMX09VVFBVVF9GSUxFX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUEJDRl9URVhUX1dTRExfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0ZfVEVYVF9XU0RMX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0KLSAgICBza2VsZXRvbkZvbGRlclRleHRfID0gYmFzZUNvblVpVXRpbHMuY3JlYXRlQ29tYm8oIHRleHRHcm91cCwgIkxBQkVMX1NLRUxFVE9OX1JPT1RfTkFNRSIsCi0gICAgICAgIFRPT0xUSVBfUEJTQ19URVhUX1NLRUxFVE9OX0ZPTERFUiwKLSAgICAgICAgSU5GT1BPUF9QQlNDX1RFWFRfU0tFTEVUT05fRk9MREVSLAotICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLQotICAgIExhYmVsIHNlcGFyYXRvciA9IHVpVXRpbHMuY3JlYXRlSG9yaXpvbnRhbFNlcGFyYXRvciggcGFyZW50LCA1ICk7Ci0KLSAgICBzaG93TWFwcGluZ3NDaGVja2JveF8gPSBjb25VaVV0aWxzLmNyZWF0ZUNoZWNrYm94KCBwYXJlbnQsICJMQUJFTF9FWFBMT1JFX01BUFBJTkdTX1hNTDJCRUFOIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9OMlBfU0hPV19NQVBQSU5HUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9OMlBfU0hPV19NQVBQSU5HUyApOwotICAgICAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRVUkkoU3RyaW5nIGVuZHBvaW50VVJJKQotICB7Ci0gIAkvKgotICAgIGlmIChlbmRwb2ludFVSSSAhPSBudWxsKQotICAgICAgdXJpVGV4dF8uc2V0VGV4dChlbmRwb2ludFVSSSk7Ci0gICAgKi8KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0V1NETEZvbGRlcihTdHJpbmcgb3V0cHV0V1NETEZvbGRlcikKLSAgewotICAgIGlmIChvdXRwdXRXU0RMRm9sZGVyICE9IG51bGwpCi0gICAgICB3c2RsRm9sZGVyVGV4dF8uc2V0VGV4dChvdXRwdXRXU0RMRm9sZGVyKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0V1NETEZpbGUoU3RyaW5nIG91dHB1dFdTRExGaWxlKQotICB7Ci0gICAgaWYgKG91dHB1dFdTRExGaWxlICE9IG51bGwpCi0gICAgICB3c2RsRmlsZVRleHRfLnNldFRleHQob3V0cHV0V1NETEZpbGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRKYXZhRm9sZGVyKFN0cmluZyBvdXRwdXRKYXZhRm9sZGVyKQotICB7Ci0gICAgaWYgKG91dHB1dEphdmFGb2xkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBza2VsZXRvbkZvbGRlclRleHRfLmluZGV4T2Yob3V0cHV0SmF2YUZvbGRlcik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uc2VsZWN0KGluZGV4KTsKLSAgICAgIGVsc2UgaWYgKHNrZWxldG9uRm9sZGVyVGV4dF8uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJvb3QgPSBnZXRXb3Jrc3BhY2VSb290TG9jYXRpb24oKTsKLSAgICAgICAgaWYgKG91dHB1dEphdmFGb2xkZXIuc3RhcnRzV2l0aChyb290KSkKLSAgICAgICAgICBza2VsZXRvbkZvbGRlclRleHRfLnNldFRleHQob3V0cHV0SmF2YUZvbGRlci5zdWJzdHJpbmcocm9vdC5sZW5ndGgoKSkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5zZXRUZXh0KG91dHB1dEphdmFGb2xkZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2hvd01hcHBpbmcoYm9vbGVhbiBzaG93TWFwcGluZykKLSAgewotICAgIHNob3dNYXBwaW5nc0NoZWNrYm94Xy5zZXRTZWxlY3Rpb24oc2hvd01hcHBpbmcpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93TWFwcGluZygpCi0gIHsKLSAgICByZXR1cm4gc2hvd01hcHBpbmdzQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgamF2YVdTRExQYXJhbS4KLSAgICovCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkgewotICAgIFN0cmluZyByb290ID0gZ2V0V29ya3NwYWNlUm9vdExvY2F0aW9uKCk7Ci0gICAgRmlsZSBmaWxlID0gbmV3IEZpbGUocm9vdCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcm9vdCA9IGZpbGUudG9VUkwoKS50b1N0cmluZygpOwotICAgICAgY2hhciBsYXN0Q2hhciA9IHJvb3QuY2hhckF0KHJvb3QubGVuZ3RoKCktMSk7Ci0gICAgICBpZiAobGFzdENoYXIgPT0gJy8nIHx8IGxhc3RDaGFyID09ICdcXCcpCi0gICAgICAgIHJvb3QgPSByb290LnN1YnN0cmluZygwLCByb290Lmxlbmd0aCgpLTEpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgIHsKLSAgICB9Ci0gICAgamF2YVdTRExQYXJhbS5zZXRPdXRwdXQocm9vdCArIHdzZGxGb2xkZXJUZXh0Xy5nZXRUZXh0KCkpOwotICAgIGphdmFXU0RMUGFyYW0uc2V0SmF2YU91dHB1dChyb290ICsgc2tlbGV0b25Gb2xkZXJUZXh0Xy5nZXRUZXh0KCkpOwotCSAgcmV0dXJuIGphdmFXU0RMUGFyYW07Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGphdmFXU0RMUGFyYW0gVGhlIGphdmFXU0RMUGFyYW0gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbShKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtKSB7Ci0JICB0aGlzLmphdmFXU0RMUGFyYW0gPSBqYXZhV1NETFBhcmFtOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KQotICB7Ci0gICAgU3RyaW5nIG9yaWdpbmFsU2tlbGV0b25Gb2xkZXIgPSBza2VsZXRvbkZvbGRlclRleHRfLmdldFRleHQoKTsKLSAgICBza2VsZXRvbkZvbGRlclRleHRfLnJlbW92ZUFsbCgpOwotICAgIElQYXRoW10gcGF0aHMgPSBSZXNvdXJjZVV0aWxzLmdldEFsbEphdmFTb3VyY2VMb2NhdGlvbnMoc2VydmljZVByb2plY3QpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoIDsgaSsrKQotICAgICAgc2tlbGV0b25Gb2xkZXJUZXh0Xy5hZGQocGF0aHNbaV0udG9TdHJpbmcoKSk7Ci0gICAgaW50IGluZGV4ID0gc2tlbGV0b25Gb2xkZXJUZXh0Xy5pbmRleE9mKG9yaWdpbmFsU2tlbGV0b25Gb2xkZXIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHNrZWxldG9uRm9sZGVyVGV4dF8uc2VsZWN0KGluZGV4KTsKLSAgICBlbHNlCi0gICAgICBza2VsZXRvbkZvbGRlclRleHRfLnNlbGVjdCgwKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0V29ya3NwYWNlUm9vdExvY2F0aW9uKCkKLSAgewotICAJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpLnRvU3RyaW5nKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aWRnZXRzL3NrZWxldG9uL1NrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDc5ZTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpZGdldHMvc2tlbGV0b24vU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tb24uSmF2YVdTRExQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIHByaXZhdGUgSVByb2plY3Qgc2VydmVyUHJvamVjdDsKLSAgcHJpdmF0ZSBKYXZhV1NETFBhcmFtZXRlciBqYXZhV1NETFBhcmFtOwotICBwcml2YXRlIFN0cmluZyBtb2R1bGVOYW1lXzsKLQotICBwdWJsaWMgU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCggU3RyaW5nIG1vZHVsZU5hbWUgKQotICB7Ci0gICAgbW9kdWxlTmFtZV8gPSBtb2R1bGVOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgCi0gICAgamF2YVdTRExQYXJhbS5zZXRPdXRwdXQoZ2V0T3V0cHV0V1NETEZvbGRlcigpKTsKLSAgICBqYXZhV1NETFBhcmFtLnNldEphdmFPdXRwdXQoZ2V0T3V0cHV0SmF2YUZvbGRlcigpKTsgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoU3RyaW5nIHNlcnZlclByb2plY3QpCi0gIHsKLSAgICB0aGlzLnNlcnZlclByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3Qoc2VydmVyUHJvamVjdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEVuZHBvaW50VVJJKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dFdTRExGb2xkZXIoKQotICB7Ci0JICBJUGF0aCB3c2RsUGF0aCA9IEoyRUVVdGlscy5nZXRXZWJDb250ZW50UGF0aChzZXJ2ZXJQcm9qZWN0LCBtb2R1bGVOYW1lXyApLmFwcGVuZCgid3NkbCIpOwotICAgICAgcmV0dXJuIHdzZGxQYXRoLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0V1NETEZpbGUoKQotICB7Ci0gICAgaW50IGluZGV4ID0gd3NkbFVSSS5sYXN0SW5kZXhPZignLycpOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIGluZGV4ID0gd3NkbFVSSS5sYXN0SW5kZXhPZignXFwnKTsKLSAgICByZXR1cm4gd3NkbFVSSS5zdWJzdHJpbmcoaW5kZXgrMSwgd3NkbFVSSS5sZW5ndGgoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0SmF2YUZvbGRlcigpCi0gIHsKLSAgICBpZiAoc2VydmVyUHJvamVjdCE9bnVsbCl7Ci0gICAgICByZXR1cm4gUmVzb3VyY2VVdGlscy5nZXRKYXZhU291cmNlTG9jYXRpb24oc2VydmVyUHJvamVjdCwgbW9kdWxlTmFtZV8pLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2hvd01hcHBpbmcoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dNYXBwaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRTaG93TWFwcGluZygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKYXZhV1NETFBhcmFtKEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW0pCi0gIHsKLSAgCXRoaXMuamF2YVdTRExQYXJhbSA9IGphdmFXU0RMUGFyYW07Ci0gIH0KLSAgCi0gIHB1YmxpYyBKYXZhV1NETFBhcmFtZXRlciBnZXRKYXZhV1NETFBhcmFtKCkKLSAgewotICAgIHJldHVybiBqYXZhV1NETFBhcmFtOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd2l6YXJkL2JlYW5zL1dTQmVhbkF4aXNUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aXphcmQvYmVhbnMvV1NCZWFuQXhpc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjYzkyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aXphcmQvYmVhbnMvV1NCZWFuQXhpc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC5iZWFuczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkphdmEyV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5BZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS50YXNrLkNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yc1Rhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0cy5BeGlzTWFwcGluZ3NXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5KYXZhVG9XU0RMTWV0aG9kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5MaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbi5BeGlzQmVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbi5CZWFuQ29uZmlnV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uSmF2YVJlc291cmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5PYmplY3RTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBjbGFzcyBmb3IgdGhlCi0qIEphdmEgQmVhbgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLndhcy5jcmVhdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZX0uCi0qLwotcHVibGljIGNsYXNzIFdTQmVhbkF4aXNUeXBlIGltcGxlbWVudHMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLCBDb21tYW5kV2lkZ2V0QmluZGluZwotewkKLSAgcHJpdmF0ZSBKYXZhUmVzb3VyY2VGaWx0ZXIgZmlsdGVyXyA9IG5ldyBKYXZhUmVzb3VyY2VGaWx0ZXIoKTsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyTmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIHJ1bnRpbWVOYW1lXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzV2ViTW9kdWxlUmVxdWlyZWRfOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJVdTX05BTUVfQkVBTldBWElTIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKCIlV1NfREVTQ19CRUFOV0FYSVMiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgbGFiZWwgZm9yIHRoZSBTZXJ2ZXIgc3VwcG9ydGVkIGJ5IHRoaXMgV2ViIFNlcnZpY2UgdHlwZQotICAqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgc2VydmVyIGxhYmVsIGZyb20gc2VydmVyIHBsdWdpbnMKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmVyTmFtZV87Ci0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSBzZXJ2ZXIgbGFiZWwgdG8gdGhlIGFwcHJvcHJpYXRlIG5hbWUgZm91bmQgaW4gdGhlIHNlcnZlciBwbHVnaW5zLgotICAqIEBwYXJhbSBzZXJ2ZXIgbmFtZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJMYWJlbChTdHJpbmcgc2VydmVyTGFiZWwpCi0gIHsKLSAgICBzZXJ2ZXJOYW1lXyA9IHNlcnZlckxhYmVsOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZQotICAqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgbGFiZWwgZm9yIHRoZSBkZXBsb3ltZW50IHJ1bnRpbWUKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lTGFiZWwoKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVOYW1lXzsKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIHJ1bnRpbWUgbGFiZWwgZm9yIHRoZSBhcHByb3ByaWF0ZSBydW50aW1lCi0gICogQHBhcmFtIHNlcnZlciBuYW1lCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVMYWJlbChTdHJpbmcgcnVudGltZUxhYmVsKQotICB7Ci0gICAgcnVudGltZU5hbWVfID0gcnVudGltZUxhYmVsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgV2ViIFNlcnZpY2UgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgKiBAcmV0dXJuIEEgbGFiZWwgZm9yIHRoZSBXZWIgU2VydmljZSB0eXBlCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGVMYWJlbCgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVXRUJTRVJWSUNFVFlQRV9OQU1FX0pBVkFfQVhJUyIpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIFdlYiBNb2R1bGUgaXMgcmVxdWlyZWQgZm9yIHRoaXMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICogQHJldHVybiB0cnVlIGlmIHJlcXVpcmVXZWJNb2R1bGUKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGVSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gaXNXZWJNb2R1bGVSZXF1aXJlZF87Ci0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSBib29sZWFuIHZhbHVlIGF0IHJ1bnRpbWUgYWNjb3JkaW5nIHRvIHJlcXVpcmVXZWJNb2R1bGUgYXR0cmlidXRlIGZyb20gdGhlIG1hbmlmZXN0IGZpbGUKLSAgKiBAcGFyYW0gcmVxdWlyZVdlYk1vZHVsZSAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViTW9kdWxlUmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlV2ViTW9kdWxlKQotICB7Ci0gICAgaXNXZWJNb2R1bGVSZXF1aXJlZF8gPSByZXF1aXJlV2ViTW9kdWxlOwotICB9Ci0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKQotICB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlI2lzRUpCTW9kdWxlUmVxdWlyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRUpCTW9kdWxlUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSNzZXRFSkJNb2R1bGVSZXF1aXJlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVKQk1vZHVsZVJlcXVpcmVkKGJvb2xlYW4gYXJnMCkgewotCQlyZXR1cm47Ci0KLQl9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIAotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgCi0gIHsKLSAgICAvKgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDdXJyZW50UGFnZUNvbW1hbmQuY2xhc3MsICJDdXJyZW50UGFnZSIsIEJlYW5DbGFzc1dpZGdldC5jbGFzcyApOwotICAgIC8vQmVhbkNsYXNzV2lkZ2V0IC0gYXMgdGFyZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhQmVhbk5hbWUiLCBCZWFuQ2xhc3NXaWRnZXQuY2xhc3MsICJCZWFuQ2xhc3NOYW1lIiwgbnVsbCk7Ci0gICAgLy9CZWFuQ2xhc3NXaWRnZXQgLSBhcyBzb3VyY2UKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCZWFuQ2xhc3NXaWRnZXQuY2xhc3MsICJCZWFuQ2xhc3NOYW1lIiwgRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQuY2xhc3MsICJKYXZhQmVhbk5hbWUiLCBudWxsKTsgICAgLy9CZWFuQ29uZmlnV2lkZ2V0Ci0gICAgKi8KLSAgICAvLyBPYmplY3RTZWxlY3Rpb25XaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy9CZWFuQ29uZmlnV2lkZ2V0IC0gYXMgdGFyZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQmVhbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBudWxsICk7Ci0gICAgLy9CZWFuQ29uZmlnV2lkZ2V0IC0gYXMgc291cmNlCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQmVhbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJlYW5Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEJlYW5Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgSmF2YTJXU0RMQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsgICAgICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQmVhbkNvbmZpZ1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOwotICAgICAgICAKLSAgICAvL01hcHBpbmdGcmFnbWVudCAob3B0aW9uYWxseSBkaXNwbGF5cyB0aGUgQXhpc01hcHBpbmdzV2lkZ2V0KSAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzLCAiQ3VzdG9taXplU2VydmljZU1hcHBpbmdzIiwgQXhpc0JlYW5GcmFnbWVudC5NYXBwaW5nRnJhZ21lbnQuY2xhc3MpOwotCi0gICAgLy9BeGlzTWFwcGluZ3NXaWRnZXQgLSBhcyB0YXJnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgLy9BeGlzTWFwcGluZ3NXaWRnZXQgLSBhcyBzb3VyY2UKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIEphdmEyV1NETENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7ICAgICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNNYXBwaW5nc1dpZGdldC5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIG51bGwpOyAgICAKLSAgICAKLSAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBEZWZhdWx0c0ZvckNvbmZpZy5jbGFzcywgIkphdmFQYXJhbWV0ZXIiLCBCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzICk7Ci0gICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggRGVmYXVsdHNGb3JDb25maWcuY2xhc3MsICJDdXN0b21pemVTZXJ2aWNlTWFwcGluZ3MiLCBCZWFuQ29uZmlnV2lkZ2V0LmNsYXNzICk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KSAKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIC8qCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQmVhblNlbGVjdGlvbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU0JFQU5fQ0xBU1MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU0JFQU5fQ0xBU1MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmVhbkNsYXNzV2lkZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICAqLwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQmVhbkNvbmZpZyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU0JFQU5fQ09ORklHIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NCRUFOX0NPTkZJRyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCZWFuQ29uZmlnV2lkZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLQotICAgIFN0cmluZyAgICAgICBjb25zUGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgY29uc01zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggY29uc1BsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQXhpc1NlcnZpY2VCZWFuTWFwcGluZyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc01zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfQkVBTjJYTUwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNNc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfUDJOX01BUFBJTkdTIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF4aXNNYXBwaW5nc1dpZGdldChBeGlzTWFwcGluZ3NXaWRnZXQuTU9ERV9CRUFOMlhNTCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgIHsKLSAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBeGlzQmVhbkZyYWdtZW50KCk7IAotICAgICAgfQotICAgIH07Ci0gIH0KLSAgICAKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpemFyZC93c2RsL1dTV1NETEF4aXNUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93aXphcmQvd3NkbC9XU1dTRExBeGlzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTE0ZmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dpemFyZC93c2RsL1dTV1NETEF4aXNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aXphcmQud3NkbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLldTREwySmF2YUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkud2lkZ2V0cy5BeGlzTWFwcGluZ3NGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jb25zdW1wdGlvbi51aS53aWRnZXRzLkF4aXNNYXBwaW5nc1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b24uQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbi5BeGlzU2tlbGV0b25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uLlNrZWxldG9uQ29uZmlnV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b24uU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLldTRExSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhLlByb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBjbGFzcyBmb3IgdGhlIEF4aXMgV2ViIHNlcnZpY2UgdHlwZS4KLSovCi1wdWJsaWMgY2xhc3MgV1NXU0RMQXhpc1R5cGUgaW1wbGVtZW50cyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUsIENvbW1hbmRXaWRnZXRCaW5kaW5nIAotewotCXByaXZhdGUgV1NETFJlc291cmNlRmlsdGVyIGZpbHRlcl8gPSBuZXcgV1NETFJlc291cmNlRmlsdGVyKCk7Ci0KLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJOYW1lXzsKLQlwcml2YXRlIFN0cmluZyBydW50aW1lTmFtZV87Ci0JcHJpdmF0ZSBib29sZWFuIGlzV2ViTW9kdWxlUmVxdWlyZWRfOwotCS8qKgotCSogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0JKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLQkqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VBeGlzQ3JlYXRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKCIlV1NfTkFNRV9XU0RMQVhJUyIpOwotCX0KLQotCS8qKgotCSogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0JKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLQkqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlQXhpc0NyZWF0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJVdTX0RFU0NfV1NETEFYSVMiKTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgbGFiZWwgZm9yIHRoZSBTZXJ2ZXIgc3VwcG9ydGVkIGJ5IHRoaXMgV2ViIFNlcnZpY2UgdHlwZQotCSogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBzZXJ2ZXIgbGFiZWwgZnJvbSBzZXJ2ZXIgcGx1Z2lucwotCSovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJMYWJlbCgpIHsKLQkJcmV0dXJuIHNlcnZlck5hbWVfOwotCX0KLQotCS8qKgotCSogU2V0cyB0aGUgc2VydmVyIGxhYmVsIHRvIHRoZSBhcHByb3ByaWF0ZSBuYW1lIGZvdW5kIGluIHRoZSBzZXJ2ZXIgcGx1Z2lucy4KLQkqIEBwYXJhbSBzZXJ2ZXIgbmFtZQotCSovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyTGFiZWwoU3RyaW5nIHNlcnZlckxhYmVsKSB7Ci0JCXNlcnZlck5hbWVfID0gc2VydmVyTGFiZWw7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZQotCSogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZQotCSovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lTGFiZWwoKSB7Ci0JCXJldHVybiBydW50aW1lTmFtZV87Ci0JfQotCi0JLyoqCi0JKiBTZXRzIHRoZSBydW50aW1lIGxhYmVsIGZvciB0aGUgYXBwcm9wcmlhdGUgcnVudGltZQotCSogQHBhcmFtIHNlcnZlciBuYW1lCi0JKi8KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lTGFiZWwoU3RyaW5nIHJ1bnRpbWVMYWJlbCkgewotCQlydW50aW1lTmFtZV8gPSBydW50aW1lTGFiZWw7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIGEgbGFiZWwgZm9yIHRoZSBXZWIgU2VydmljZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotCSogQHJldHVybiBBIGxhYmVsIGZvciB0aGUgV2ViIFNlcnZpY2UgdHlwZQotCSovCi0JcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZUxhYmVsKCkgewotCQlyZXR1cm4gV2ViU2VydmljZUF4aXNDcmVhdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoCi0JCQkiJVdFQlNFUlZJQ0VUWVBFX05BTUVfV1NETF9BWElTIik7Ci0JfQotCi0JLyoqCi0JKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGEgV2ViIE1vZHVsZSBpcyByZXF1aXJlZCBmb3IgdGhpcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLQkqIEByZXR1cm4gdHJ1ZSBpZiByZXF1aXJlV2ViTW9kdWxlCi0JKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dlYk1vZHVsZVJlcXVpcmVkKCkgewotCQlyZXR1cm4gaXNXZWJNb2R1bGVSZXF1aXJlZF87Ci0JfQotCi0JLyoqCi0JKiBTZXRzIHRoZSBib29sZWFuIHZhbHVlIGF0IHJ1bnRpbWUgYWNjb3JkaW5nIHRvIHJlcXVpcmVXZWJNb2R1bGUgYXR0cmlidXRlIGZyb20gdGhlIG1hbmlmZXN0IGZpbGUKLQkqIEBwYXJhbSByZXF1aXJlV2ViTW9kdWxlIAotCSovCi0JcHVibGljIHZvaWQgc2V0V2ViTW9kdWxlUmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlV2ViTW9kdWxlKSB7Ci0JCWlzV2ViTW9kdWxlUmVxdWlyZWRfID0gcmVxdWlyZVdlYk1vZHVsZTsKLQl9Ci0KLQkvKioKLQkqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0JKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSNpc0VKQk1vZHVsZVJlcXVpcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VKQk1vZHVsZVJlcXVpcmVkKCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlI3NldEVKQk1vZHVsZVJlcXVpcmVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RUpCTW9kdWxlUmVxdWlyZWQoYm9vbGVhbiBhcmcwKSB7Ci0JCXJldHVybjsKLQotCX0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJDYW5GaW5pc2gob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkgCi0gIHsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotICB7Ci0gICAgLy8gU2tlbGV0b25Db25maWdXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBuZXcgUHJvamVjdE5hbWUySVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkVuZHBvaW50VVJJIiwgU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJPdXRwdXRXU0RMRm9sZGVyIiwgU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJPdXRwdXRXU0RMRmlsZSIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiT3V0cHV0SmF2YUZvbGRlciIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2hvd01hcHBpbmciLCBTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcyk7Ci0KLSAgICAvLyBBeGlzTWFwcGluZ3NGcmFnbWVudAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTaG93TWFwcGluZyIsIEF4aXNNYXBwaW5nc0ZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTa2VsZXRvbkNvbmZpZ1dpZGdldC5jbGFzcywgIlNob3dNYXBwaW5nIiwgQXhpc01hcHBpbmdzRnJhZ21lbnQuY2xhc3MpOwotCi0gICAgLy8gQXhpc01hcHBpbmdzV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBBeGlzTWFwcGluZ3NXaWRnZXQuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIG51bGwpOwotCi0gICAgLy8gV1NETDJKYXZhQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b25Db25maWdXaWRnZXQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgV1NETDJKYXZhQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc01hcHBpbmdzV2lkZ2V0LmNsYXNzLCAiSmF2YVBhcmFtZXRlciIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkgCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgLyoKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJXU0RMU2VsZWN0aW9uIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1NFTEVDVElPTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1NFTEVDVElPTiIpLAotCQkgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkgICAgICAgICAgICAgICAgICB7Ci0JCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXU0RMU2VsZWN0aW9uV2lkZ2V0KCk7Ci0JCSAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgIH0gKTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIldTRExTZWxlY3Rpb25UcmVlV2lkZ2V0IiwgCi0gICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NETF9TRUxFQ1RJT04iKSwKLSAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTRExfU0VMRUNUSU9OIiksCi0gICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgV1NETFNlbGVjdGlvblRyZWVXaWRnZXQoKTsKLSAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAqLwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiU2tlbGV0b25Db25maWciLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NTS0VMX0NPTkZJRyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTU0tFTF9DT05GSUciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2tlbGV0b25Db25maWdXaWRnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQXhpc01hcHBpbmdzV2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1hNTDJCRUFOIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfTjJQX01BUFBJTkdTIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF4aXNNYXBwaW5nc1dpZGdldChBeGlzTWFwcGluZ3NXaWRnZXQuTU9ERV9YTUwyQkVBTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5I2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKSAKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgewotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IEF4aXNTa2VsZXRvbkZyYWdtZW50KCk7IAotICAgICAgfQotICAgIH07Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dzcnQvQXhpc0JlYW5Db25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93c3J0L0F4aXNCZWFuQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQxNTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dzcnQvQXhpc0JlYW5Db25maWdXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuYmVhbi5CZWFuQ29uZmlnV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC5iZWFucy5XU0JlYW5BeGlzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQXhpc0JlYW5Db25maWdXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotCXByaXZhdGUgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgICAgICAgICAgICAgYmVhbkNvbmZpZ1dpZGdldF87Ci0JcHJpdmF0ZSBJTmFtZWRXaWRnZXRDb250cmlidXRvciAgICAgICAgICAgICBtYXBwaW5nc1dpZGdldF87Ci0JcHJpdmF0ZSBCZWFuQ29uZmlnV2lkZ2V0ICAgICAgICAgICAgICAgICAgICBiZWFuV2lkZ2V0XzsKLQlwcml2YXRlIFdpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyIGFkYXB0ZXJfOwotCQotCXB1YmxpYyBBeGlzQmVhbkNvbmZpZ1dpZGdldEZhY3RvcnkoKQotCXsKLQkgIGFkYXB0ZXJfID0gbmV3IFdpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyKCBuZXcgV1NCZWFuQXhpc1R5cGUoKSApOwotCSAgCi0JICBiZWFuQ29uZmlnV2lkZ2V0XyA9IGFkYXB0ZXJfLmdldFdpZGdldCggIkJlYW5Db25maWciICk7Ci0JICBiZWFuV2lkZ2V0XyAgICAgICA9IChCZWFuQ29uZmlnV2lkZ2V0KWJlYW5Db25maWdXaWRnZXRfLmdldFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpLmNyZWF0ZSgpOwotCSAgbWFwcGluZ3NXaWRnZXRfICAgPSBhZGFwdGVyXy5nZXRXaWRnZXQoICJBeGlzU2VydmljZUJlYW5NYXBwaW5nIiApOwotCX0KLQkKLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIAotCXsKLQkgIHJldHVybiBiZWFuQ29uZmlnV2lkZ2V0XzsKLQl9Ci0KLQlwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KCBJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgCi0JewotCSAgcmV0dXJuIHdpZGdldENvbnRyaWJ1dG9yID09IGJlYW5Db25maWdXaWRnZXRfICYmIGJlYW5XaWRnZXRfLmdldEN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5ncygpID8gbWFwcGluZ3NXaWRnZXRfIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotCXsKLQkgIGFkYXB0ZXJfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnkgKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93c3J0L0F4aXNTa2VsZXRvbkNvbmZpZ1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dzcnQvQXhpc1NrZWxldG9uQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmFiOWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dzcnQvQXhpc1NrZWxldG9uQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS53aWRnZXRzLnNrZWxldG9uLlNrZWxldG9uQ29uZmlnV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpemFyZC53c2RsLldTV1NETEF4aXNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBeGlzU2tlbGV0b25Db25maWdXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotCXByaXZhdGUgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgICAgICAgICAgICAgc2tlbENvbmZpZ1dpZGdldF87Ci0JcHJpdmF0ZSBJTmFtZWRXaWRnZXRDb250cmlidXRvciAgICAgICAgICAgICBtYXBwaW5nc1dpZGdldF87Ci0JcHJpdmF0ZSBTa2VsZXRvbkNvbmZpZ1dpZGdldCAgICAgICAgICAgICAgICBza2VsV2lkZ2V0XzsKLQlwcml2YXRlIFdpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyIGFkYXB0ZXJfOwotCQotCXB1YmxpYyBBeGlzU2tlbGV0b25Db25maWdXaWRnZXRGYWN0b3J5KCkKLQl7Ci0JICBhZGFwdGVyXyA9IG5ldyBXaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlciggbmV3IFdTV1NETEF4aXNUeXBlKCkgKTsKLQkgIAotCSAgc2tlbENvbmZpZ1dpZGdldF8gPSBhZGFwdGVyXy5nZXRXaWRnZXQoICJTa2VsZXRvbkNvbmZpZyIgKTsKLQkgIHNrZWxXaWRnZXRfICAgICAgID0gKFNrZWxldG9uQ29uZmlnV2lkZ2V0KXNrZWxDb25maWdXaWRnZXRfLmdldFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpLmNyZWF0ZSgpOwotCSAgbWFwcGluZ3NXaWRnZXRfICAgPSBhZGFwdGVyXy5nZXRXaWRnZXQoICJBeGlzTWFwcGluZ3NXaWRnZXQiICk7Ci0JfQotCQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCkgCi0JewotCSAgcmV0dXJuIHNrZWxDb25maWdXaWRnZXRfOwotCX0KLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSAKLQl7Ci0JICByZXR1cm4gd2lkZ2V0Q29udHJpYnV0b3IgPT0gc2tlbENvbmZpZ1dpZGdldF8gJiYgc2tlbFdpZGdldF8uZ2V0U2hvd01hcHBpbmcoKSA/IG1hcHBpbmdzV2lkZ2V0XyA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSAKLQl7Ci0JICBhZGFwdGVyXy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YVJlZ2lzdHJ5ICk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd3NydC9BeGlzV2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd3NydC9BeGlzV2ViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VkNzU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dzcnQvQXhpc1dlYlNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24uY29yZS5jb21tYW5kLkF4aXNEZXBsb3lDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5KYXZhMldTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZC5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLnRhc2suQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5Db3B5QXhpc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5SZWZyZXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY29uc3VtcHRpb24udWkudGFzay5WYWxpZGF0ZVdTRExDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuQXhpc091dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5BeGlzUnVuSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuQlVBeGlzSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLmNvbW1hbmQuSmF2YVRvV1NETE1ldGhvZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5UREF4aXNJbnB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkuY29tbWFuZC5VcGRhdGVXRUJYTUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suQlVDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5EZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrLkxpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5Nb3ZlRGVwbG95bWVudEZpbGVzVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrLk1vdmVKYXZhRmlsZXNUYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLnRhc2suU2tlbGV0b24yV1NETENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkudGFzay5URENoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYXhpcy5jcmVhdGlvbi51aS50YXNrLlVwZGF0ZUF4aXNXU0RERmlsZVRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuLkF4aXNCZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5iZWFuLkJVQXhpc0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNyZWF0aW9uLnVpLndpZGdldHMuc2tlbGV0b24uQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud2lkZ2V0cy5za2VsZXRvbi5Ta2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLk9wZW5KYXZhRWRpdG9yQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhLlByb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5XYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5BYnN0cmFjdFdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLXB1YmxpYyBjbGFzcyBBeGlzV2ViU2VydmljZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZQotewotCXByaXZhdGUgQXhpc1dlYlNlcnZpY2VJbmZvIGF4aXNXZWJTZXJ2aWNlSW5mb187Ci0KLQlwdWJsaWMgQXhpc1dlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbykKLQl7Ci0JCXN1cGVyKGluZm8pOwotCX0KLQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsCi0JCQlJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcikKLQl7Ci0JCQotCQlWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCQotCQlpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApIHsKLQkJCQotCQkJcmVnaXN0ZXJCVURhdGFNYXBwaW5ncyggZW52LmdldENvbW1hbmRNYW5hZ2VyKCkuZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkpOwotCQkJCi0JCQljb21tYW5kcy5hZGQobmV3IEJVQXhpc0lucHV0Q29tbWFuZCh0aGlzLCBwcm9qZWN0LCBtb2R1bGUpKTsKLS8vCQkJY29tbWFuZHMuYWRkKG5ldyBWYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQoKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kKCkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQobW9kdWxlKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEphdmFUb1dTRExNZXRob2RDb21tYW5kKCkpOwotCQkJLy8gY29tbWFuZHMuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCggIkJlYW5Db25maWciICkpOwotCQkJLy8gY29tbWFuZHMuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCggIkF4aXNTZXJ2aWNlQmVhbk1hcHBpbmciICkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBCVUNoZWNrQXhpc0RlcGxveW1lbnREZXNjcmlwdG9ycyhtb2R1bGUpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgTGl0ZXJhbFN1cHBvcnRNZXNzYWdlVGFzaygpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQ29weUF4aXNKYXJDb21tYW5kKG1vZHVsZSkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzayhtb2R1bGUpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgV2FpdEZvckF1dG9CdWlsZENvbW1hbmQoKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IEphdmEyV1NETENvbW1hbmQoKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhQ29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgTW92ZUphdmFGaWxlc1Rhc2sobW9kdWxlKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IFVwZGF0ZUF4aXNXU0RERmlsZVRhc2sobW9kdWxlKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IFVwZGF0ZVdFQlhNTENvbW1hbmQobW9kdWxlKSk7Ci0JCQljb21tYW5kcy5hZGQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQnVpbGRQcm9qZWN0Q29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpc091dHB1dENvbW1hbmQodGhpcykpOwotCQkJCi0JCX0gZWxzZSBpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikgewotCQkJCi0JCQlyZWdpc3RlclRERGF0YU1hcHBpbmdzKCBlbnYuZ2V0Q29tbWFuZE1hbmFnZXIoKS5nZXRNYXBwaW5nUmVnaXN0cnkoKSk7Ci0JCQkKLQkJCWNvbW1hbmRzLmFkZChuZXcgVERBeGlzSW5wdXRDb21tYW5kKHRoaXMsIHByb2plY3QsIG1vZHVsZSkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZCgpKTsKLQkJICAgIGNvbW1hbmRzLmFkZChuZXcgVmFsaWRhdGVXU0RMQ29tbWFuZCgpKTsKLQkJICAgIGNvbW1hbmRzLmFkZChuZXcgU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZChtb2R1bGUpKTsKLS8vCQkJY29tbWFuZHMuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCggIlNrZWxldG9uQ29uZmlnIiApKTsKLS8vCQkJY29tbWFuZHMuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCggIkF4aXNNYXBwaW5nc1dpZGdldCIgKSk7Ci0JCSAgICBjb21tYW5kcy5hZGQobmV3IFREQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzKG1vZHVsZSkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBDb3B5QXhpc0phckNvbW1hbmQobW9kdWxlKSk7Ci0JCSAgICBjb21tYW5kcy5hZGQobmV3IEFkZEphcnNUb1Byb2plY3RCdWlsZFBhdGhUYXNrKG1vZHVsZSkpOwotCQkgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFDb21tYW5kKCkpOwotCQkgICAgY29tbWFuZHMuYWRkKG5ldyBNb3ZlRGVwbG95bWVudEZpbGVzVGFzayhtb2R1bGUpKTsKLQkJICAgIGNvbW1hbmRzLmFkZChuZXcgU2tlbGV0b24yV1NETENvbW1hbmQobW9kdWxlKSk7Ci0JCSAgICBjb21tYW5kcy5hZGQobmV3IFVwZGF0ZVdFQlhNTENvbW1hbmQobW9kdWxlKSk7Ci0JCSAgICBjb21tYW5kcy5hZGQobmV3IFJlZnJlc2hQcm9qZWN0Q29tbWFuZCgpKTsKLQkJICAgIGNvbW1hbmRzLmFkZChuZXcgQnVpbGRQcm9qZWN0Q29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpc091dHB1dENvbW1hbmQodGhpcykpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIC0gV2ViU2VydmljZVNjZW5hcmlvIHNob3VsZCBub3QgYmUgQ2xpZW50IGZvciBBeGlzV2ViU2VydmljZSIpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCQotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKQotCXsKLQkJVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCi0JCWlmIChjdHguZ2V0U2NlbmFyaW8oKS5nZXRWYWx1ZSgpID09IFdlYlNlcnZpY2VTY2VuYXJpby5DTElFTlQpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkVycm9yIC0gV2ViU2VydmljZVNjZW5hcmlvIHNob3VsZCBub3QgYmUgQ2xpZW50IGZvciBBeGlzV2ViU2VydmljZSIpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ly8gRm9yIEJPVFRPTV9VUCBhbmQgVE9QX0RPV04KLQkJCWNvbW1hbmRzLmFkZChuZXcgQXhpc1J1bklucHV0Q29tbWFuZCh0aGlzLCBwcm9qZWN0LCBtb2R1bGUpKTsKLS8vCQkJY29tbWFuZHMuYWRkKG5ldyBTdGFydFByb2plY3RDb21tYW5kKG1vZHVsZSkpOwotCQkJY29tbWFuZHMuYWRkKG5ldyBBeGlzRGVwbG95Q29tbWFuZCgpKTsKLQkJCWNvbW1hbmRzLmFkZChuZXcgUmVmcmVzaFByb2plY3RDb21tYW5kKCkpOwotCQkJaWYgKGN0eC5nZXRTY2VuYXJpbygpLmdldFZhbHVlKCkgPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pIHsKLQkJCQljb21tYW5kcy5hZGQobmV3IENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZCgpKTsKLQkJCQljb21tYW5kcy5hZGQobmV3IE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoY29tbWFuZHMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQlVEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkgCi0JICB7Ci0JCS8vQlVBeGlzSW5wdXRDb21tYW5kCi0vLwkJcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlU2VydmVyVHlwZUlEIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiSmF2YUJlYW5OYW1lIiwgQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLQkJCi0JICAgIC8vVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kCi0vLwkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgVmFsaWRhdGVPYmplY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzKTsKLS8vCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBWYWxpZGF0ZU9iamVjdFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsIlNlcnZpY2VQcm9qZWN0TmFtZSIsIG51bGwgKTsKLQkgICAgCi0JICAgIC8vQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQKLS8vCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLS8vS1NDICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotCSAgICAKLQkgICAgLy9XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgCi0JICAgIC8vQlVBeGlzQ29tbWFuZHMyIC0gdGhlc2UgcnVuIGFmdGVyIEJlYW5DbGFzc1dpZGdldAotCSAgICAvL0RlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQuY2xhc3MpOwotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBEZWZhdWx0c0ZvclNlcnZlckphdmFXU0RMQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFCZWFuTmFtZSIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlBhcnNlciIsIERlZmF1bHRzRm9yU2VydmVySmF2YVdTRExDb21tYW5kLmNsYXNzKTsKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkN1c3RvbWl6ZVNlcnZpY2VNYXBwaW5ncyIsIEF4aXNCZWFuRnJhZ21lbnQuTWFwcGluZ0ZyYWdtZW50LmNsYXNzKTsKLQkgICAgCi0JICAgIC8vSmF2YVdTRExNZXRob2RDb21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoRGVmYXVsdHNGb3JTZXJ2ZXJKYXZhV1NETENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MpOwotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQotCSAgICAvLyBCVUF4aXNDb21tYW5kczMgLSB0aGVzZSBydW4gYWZ0ZXIgQmVhbkNvbmZpZ1dpZGdldAotCSAgICAvL0xpdGVyYWxTdXBwb3J0TWVzc2FnZVRhc2sKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBMaXRlcmFsU3VwcG9ydE1lc3NhZ2VUYXNrLmNsYXNzKTsKLQkgICAgCi0JICAgIC8vQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzawotCSAgICAvL3JlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YVRvV1NETE1ldGhvZENvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzay5jbGFzcyk7Ci0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIEJVQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0JICAgIAotCSAgICAvL0NvcHlBeGlzSmFyQ29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDb3B5QXhpc0phckNvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgCi0JICAgIC8vQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2sKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suY2xhc3MsICJQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgCi0JICAgIC8vSmF2YTJXU0RMQ29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEphdmFUb1dTRExNZXRob2RDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIEphdmEyV1NETENvbW1hbmQuY2xhc3MpOwotCSAgICAKLQkgICAgLy9SZWZyZXNoUHJvamVjdENvbW1hbmQKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgUmVmcmVzaFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0JICAgIAotCSAgICAvL1dTREwySmF2YUNvbW1hbmQKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhVG9XU0RMTWV0aG9kQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBXU0RMMkphdmFDb21tYW5kLmNsYXNzKTsKLQkgICAgCi0KLQkgICAgLy9Nb3ZlSmF2YUZpbGVzVGFzawotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgTW92ZUphdmFGaWxlc1Rhc2suY2xhc3MpOwotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBNb3ZlSmF2YUZpbGVzVGFzay5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgCi0JICAgIC8vVXBkYXRlQXhpc1dTRERGaWxlVGFzawotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKE1vdmVKYXZhRmlsZXNUYXNrLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFVwZGF0ZUF4aXNXU0RERmlsZVRhc2suY2xhc3MpOwotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBVcGRhdGVBeGlzV1NEREZpbGVUYXNrLmNsYXNzLCAiU2VydmljZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotCSAgICAKLQkgICAgLy9VcGRhdGVXRUJYTUxDb21tYW5kCi0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFVwZGF0ZVdFQlhNTENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLQkgICAgCi0JICAgIC8vQnVpbGRQcm9qZWN0Q29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0lucHV0Q29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJGb3JjZUJ1aWxkIiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJWYWxpZGF0aW9uTWFuYWdlciIsIEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MpOwotCSAgICAKLQkgICAgLy9TdGFydFByb2plY3RDb21tYW5kCi0vLwkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsgICAgCi0vLwkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLS8vS1NDICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VTZXJ2ZXJUeXBlSUQiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLS8vCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEJVQXhpc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2FtcGxlU2VydmVyVHlwZUlEIiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0vLwkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhCVUF4aXNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotLy8JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIFN0YXJ0UHJvamVjdENvbW1hbmQuY2xhc3MpOwotLy8JICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoQlVBeGlzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkIixTdGFydFByb2plY3RDb21tYW5kLmNsYXNzKTsKLQkgICAgICAgIAotCQkvLyBBeGlzT3V0cHV0Q29tbWFuZAotCSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NETENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQXhpc091dHB1dENvbW1hbmQuY2xhc3MpOwotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKFVwZGF0ZUF4aXNXU0RERmlsZVRhc2suY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQXhpc091dHB1dENvbW1hbmQuY2xhc3MpOyAgICAKLQkJCi0JCS8vIFJ1biBleHRlbnNpb24KLQkJCi0JICAgIC8vQXhpc0RlcGxveUNvbW1hbmQKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzUnVuSW5wdXRDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIEF4aXNEZXBsb3lDb21tYW5kLmNsYXNzKTsKLQkJLy9SZWZyZXNoUHJvamVjdENvbW1hbmQKLQkgICAgcmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzUnVuSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFJlZnJlc2hQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotCi0JICAgIAotCSAgICAKLQkgIH0KLQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyVEREYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0JICB7Ci0JICAgIC8vIFRyYW5zZm9ybWVycwotCSAgICBQcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyIHByb2plY3RUcmFuc2Zvcm1lciA9IG5ldyBQcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyKCk7Ci0KLQkJLy8gVE9ETzogIG1hcCAiSW5pdGlhbFNlbGVjdGlvbiIgYW5kICJPYmplY3RTZWxlY3Rpb24iIGZyb20gVERBeGlzSW5wdXRDb21tYW5kCi0JCQotLy8JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotLy8JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJPYmplY3RTZWxlY3Rpb24iLCBBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0vLwkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVERBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0JICAgIAotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkphdmFXU0RMUGFyYW0iLCBTa2VsZXRvbkNvbmZpZ1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQkJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVERBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQkgICAgLy8gVmFsaWRhdGVXU0RMQ29tbWFuZAotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgVmFsaWRhdGVXU0RMQ29tbWFuZC5jbGFzcyk7Ci0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFZhbGlkYXRlV1NETENvbW1hbmQuY2xhc3MpOwotCSAgICAKLQkgICAgLy8gU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUREF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU2tlbGV0b25Db25maWdXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFNrZWxldG9uQ29uZmlnV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotCSAgICAKLQkgICAgLy8gQ2hlY2tBeGlzRGVwbG95bWVudERlc2NyaXB0b3JzVGFzawotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUREF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgVERDaGVja0F4aXNEZXBsb3ltZW50RGVzY3JpcHRvcnMuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLQotCSAgICAvLyBBZGRKYXJzVG9Qcm9qZWN0QnVpbGRQYXRoVGFzawotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUREF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQWRkSmFyc1RvUHJvamVjdEJ1aWxkUGF0aFRhc2suY2xhc3MsICJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLQkgICAgCi0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkh0dHBCYXNpY0F1dGhVc2VybmFtZSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkh0dHBCYXNpY0F1dGhQYXNzd29yZCIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotCi0vLwkJV1NETDJKYXZhQ29tbWFuZAotCSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEF4aXNTa2VsZXRvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIFdTREwySmF2YUNvbW1hbmQuY2xhc3MpOwotCQkKLQkgICAgLy8gTW92ZURlcGxveW1lbnRGaWxlc1Rhc2sKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVERBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIE1vdmVEZXBsb3ltZW50RmlsZXNUYXNrLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgTW92ZURlcGxveW1lbnRGaWxlc1Rhc2suY2xhc3MpOwotCi0JICAgIC8vIENvcHlBeGlzSmFyQ29tbWFuZAotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUREF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQ29weUF4aXNKYXJDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0KLQkgICAgLy8gU2tlbGV0b24yV1NETENvbW1hbmQKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFNrZWxldG9uMldTRExDb21tYW5kLmNsYXNzKTsKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVERBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFNrZWxldG9uMldTRExDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIHByb2plY3RUcmFuc2Zvcm1lcik7Ci0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgU2tlbGV0b24yV1NETENvbW1hbmQuY2xhc3MpOwotCi0JICAgIC8vIFVwZGF0ZVdFQlhNTENvbW1hbmQKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVERBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFVwZGF0ZVdFQlhNTENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLQotCSAgICAvLyBSZWZyZXNoUHJvamVjdENvbW1hbmQKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVERBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFJlZnJlc2hQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotCSAgICAKLQkgICAgLy8gQnVpbGRQcm9qZWN0Q29tbWFuZAotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUREF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgQnVpbGRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotCi0JICAgIC8vIFN0YXJ0UHJvamVjdENvbW1hbmQKLS8vCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUREF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgU3RhcnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgcHJvamVjdFRyYW5zZm9ybWVyKTsKLS8vCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhUREF4aXNJbnB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJTZXJ2ZXIiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVyIiwgbmV3IFNlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyKCkpOwotLy8JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvcHlBeGlzSmFyQ29tbWFuZC5jbGFzcywgIlByb2plY3RSZXN0YXJ0UmVxdWlyZWQiLCBTdGFydFByb2plY3RDb21tYW5kLmNsYXNzLCAiSXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCIsIG51bGwpOwotCi0JICAgIC8vIEF4aXNEZXBsb3lDb21tYW5kCi0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTREwySmF2YUNvbW1hbmQuY2xhc3MsICJKYXZhV1NETFBhcmFtIiwgQXhpc0RlcGxveUNvbW1hbmQuY2xhc3MpOwotCSAgICAKLQkgICAgLy8gQXhpc091dHB1dENvbW1hbmQKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b24yV1NETENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQXhpc091dHB1dENvbW1hbmQuY2xhc3MpOwotCQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIEF4aXNPdXRwdXRDb21tYW5kLmNsYXNzKTsgCi0vLwkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQXhpc1NrZWxldG9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIEF4aXNPdXRwdXRDb21tYW5kLmNsYXNzKTsKLQkgICAgCi0JICAgIC8vIENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZAotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiSmF2YVdTRExQYXJhbSIsIENvbXB1dGVBeGlzU2tlbGV0b25CZWFuQ29tbWFuZC5jbGFzcyk7Ci0JICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2tlbGV0b24yV1NETENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmNsYXNzKTsKLQkgICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhBeGlzU2tlbGV0b25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ29tcHV0ZUF4aXNTa2VsZXRvbkJlYW5Db21tYW5kLmNsYXNzKTsKLQkgICAgCi0JICAgIC8vIE9wZW5KYXZhRWRpdG9yQ29tbWFuZAotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb21wdXRlQXhpc1NrZWxldG9uQmVhbkNvbW1hbmQuY2xhc3MsICJDbGFzc05hbWVzIiwgT3BlbkphdmFFZGl0b3JDb21tYW5kLmNsYXNzKTsKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVERBeGlzSW5wdXRDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBwcm9qZWN0VHJhbnNmb3JtZXIpOwotCSAgfQotCXB1YmxpYyBBeGlzV2ViU2VydmljZUluZm8gZ2V0QXhpc1dlYlNlcnZpY2VJbmZvKCkgewotCQlyZXR1cm4gYXhpc1dlYlNlcnZpY2VJbmZvXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBeGlzV2ViU2VydmljZUluZm8oQXhpc1dlYlNlcnZpY2VJbmZvIGF4aXNXZWJTZXJ2aWNlSW5mbykgewotCQlheGlzV2ViU2VydmljZUluZm9fID0gYXhpc1dlYlNlcnZpY2VJbmZvOwotCX0KLX0JCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dzcnQvQXhpc1dlYlNlcnZpY2VJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvYXhpcy9jcmVhdGlvbi91aS93c3J0L0F4aXNXZWJTZXJ2aWNlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTdmNzhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dzcnQvQXhpc1dlYlNlcnZpY2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLmNvcmUuY29tbW9uLkphdmFXU0RMUGFyYW1ldGVyOwotCi1wdWJsaWMgY2xhc3MgQXhpc1dlYlNlcnZpY2VJbmZvIHsKLQkKLQlwcml2YXRlIEphdmFXU0RMUGFyYW1ldGVyIGphdmFXU0RMUGFyYW1ldGVyOwotCi0JcHVibGljIEphdmFXU0RMUGFyYW1ldGVyIGdldEphdmFXU0RMUGFyYW1ldGVyKCkgewotCQlyZXR1cm4gamF2YVdTRExQYXJhbWV0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SmF2YVdTRExQYXJhbWV0ZXIoSmF2YVdTRExQYXJhbWV0ZXIgamF2YVdTRExQYXJhbWV0ZXIpIHsKLQkJdGhpcy5qYXZhV1NETFBhcmFtZXRlciA9IGphdmFXU0RMUGFyYW1ldGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd3NydC9BeGlzV2ViU2VydmljZVJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9heGlzL2NyZWF0aW9uL3VpL3dzcnQvQXhpc1dlYlNlcnZpY2VSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzhjODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2F4aXMvY3JlYXRpb24vdWkvd3NydC9BeGlzV2ViU2VydmljZVJ1bnRpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmF4aXMuY3JlYXRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5heGlzLmNvbnN1bXB0aW9uLnVpLndzcnQuQXhpc1dlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotcHVibGljIGNsYXNzIEF4aXNXZWJTZXJ2aWNlUnVudGltZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVJ1bnRpbWUKLXsKLQotCXB1YmxpYyBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pCi0JewotICAgIHJldHVybiBuZXcgQXhpc1dlYlNlcnZpY2UoaW5mbyk7Ci0JfQotCi0JcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbykKLQl7Ci0JCXJldHVybiBuZXcgQXhpc1dlYlNlcnZpY2VDbGllbnQoaW5mbyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTFjMTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd3NjLXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4MzcyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3M8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmRpc2NvdmVyeS5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53c2RsPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Q1NmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB3c2MtdWkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWksCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5kYXRhLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24sCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuc2VsZWN0aW9uLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuZXhwbG9yZXIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC53c3NhbXBsZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyLAotIG9yZy5lY2xpcHNlLmpzdC53cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MudWksCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLAotIG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpkdC51aSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2Uud3N0LndzLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZXMudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLAotIG9yZy5lY2xpcHNlLndzdC53cy51aSwKLSBvcmcud3NkbDRqLAotIG9yZy5lY2xpcHNlLmplbS51dGlsCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2M4N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXNvdXJjZS53c2MtdWkuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0gd3NjLXVpLmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZG9jLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2NvbmZpZ19oYW5kbGVyX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9jb25maWdfaGFuZGxlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGEzYTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2NvbmZpZ19oYW5kbGVyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvY29uZmlndXJlX2hhbmRsZXJzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb25maWd1cmVfaGFuZGxlcnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTEzYzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9jb25maWd1cmVfaGFuZGxlcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2dlbmVyYXRlZF9zYW1wbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L2dlbmVyYXRlZF9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJhNTFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9nZW5lcmF0ZWRfc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjbGllbnRfd2Vic2Vydl93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZTA1ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2NvbmZpZ3VyZV9oYW5kbGVycy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL2R0b29sL2NvbmZpZ3VyZV9oYW5kbGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjBkZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9kdG9vbC9jb25maWd1cmVfaGFuZGxlcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9kdG9vbC9nZW5lcmF0ZWRfc2FtcGxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvZHRvb2wvZ2VuZXJhdGVkX3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MGQzOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZnVsbC9kdG9vbC9nZW5lcmF0ZWRfc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGI3YTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9nZW5fc2FtcGxlX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9nZW5fc2FtcGxlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2FkNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvZ2VuX3NhbXBsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvaW1wb3J0X3dzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2ltcG9ydF93cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWZlODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvaW1wb3J0X3dzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL2ltcG9ydF93c193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvaW1wb3J0X3dzX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDYxZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvaW1wb3J0X3dzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9yZWdpc3RyeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy9yZWdpc3RyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDNjYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvcmVnaXN0cnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9leGlzdGluZ19zZXJ2ZXJfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NlcnZlcnMvZXhpc3Rpbmdfc2VydmVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjZjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9leGlzdGluZ19zZXJ2ZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3NlcnZlcnMvc2VydmVyc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9zZXJ2ZXJzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjZjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvc2VydmVycy9zZXJ2ZXJzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2h0bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9odG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlN2RiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL2h0bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd2l6X2Jhbm5lcl93c2lsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaW1wb3J0X3dpel9iYW5uZXJfd3NpbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYjM0YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd2l6X2Jhbm5lcl93c2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvaW1wb3J0X3dzaWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd3NpbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGE5NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC9pbXBvcnRfd3NpbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL3dzZGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2RsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9pY29ucy93c2lsL3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2lsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL2ljb25zL3dzaWwvd3NpbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTkxNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvaWNvbnMvd3NpbC93c2lsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDM3MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIENvbnN1bXB0aW9uIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLUZFQVRVUkVfREVTQ1JJUFRJT049V2ViIHNlcnZpY2VzCi0KLVhQX1BVQkxJQ19VRERJX1JFR0lTVFJZX1RZUEVTPVB1YmxpYyBVRERJIFJlZ2lzdHJ5IFR5cGVzCi1YUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVM9UHJpdmF0ZSBVRERJIFJlZ2lzdHJ5IFR5cGVzCi1YUF9XRUJfU0VSVklDRV9DTElFTlRfVFlQRVM9V2ViIFNlcnZpY2UgQ2xpZW50IFR5cGVzCi1YUF9XRUJfU0VSVklDRV9URVNUPVdlYiBTZXJ2aWNlIFRlc3QKLVhQX1dFQl9TRVJWSUNFX1NFUlZFUl9SVU5USU1FX1RZUEVTPVdlYiBTZXJ2aWNlIFNlcnZlciBSdW50aW1lIFR5cGVzCi1YUF9XRUJfU0VSVklDRV9DTElFTlRfUFJPSkVDVF9UWVBFPWNsaWVudFByb2plY3RUeXBlCi1YUF9PQkpFQ1RfU0VMRUNUSU9OX1dJREdFVD1vYmplY3RTZWxlY3Rpb25XaWRnZXQKLQotIwotIyBXaXphcmRzLgotIwotV0laQVJEX1RJVExFX1dTQz1XZWIgU2VydmljZSBDbGllbnQKLQotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19DTElFTlQ9V2ViIFNlcnZpY2UgQ2xpZW50Ci1QTFVHSU5fSU1QT1JUX1dJWkFSRF9OQU1FX1dTPVdlYiBTZXJ2aWNlCi1QTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX0NMSUVOVD1BY2Nlc3MgYW4gZXhpc3RpbmcgWE1MIHdlYiBzZXJ2aWNlCi1QTFVHSU5fSU1QT1JUX1dJWkFSRF9ERVNDX1dTPUEgd2l6YXJkIGZvciBpbXBvcnRpbmcgYSB3ZWIgc2VydmljZQotSU1QT1JUX1dJWkFSRF9ERVNDX1dTSUw9SW1wb3J0IFdTREwgcmVmZXJlbmNlcyB0byBhIFdTSUwgZG9jdW1lbnQKLQotIwotIyBXZWIgU2FtcGxlcyBJRHMKLSMKLVNBTVBMRV9UWVBFX1dFQlNFUlZJQ0VTX0lEPVdlYiBzZXJ2aWNlIHNhbXBsZSBKU1BzCi0KLSMKLSMgUG9wLXVwIGFjdGlvbnMKLSMKLUFDVElPTl9HRU5FUkFURV9KQVZBX1BST1hZPUdlbmVyYXRlIENsaWVudAotQUNUSU9OX0dFTl9TQU1QTEU9R2VuZXJhdGUgU2FtcGxlIEpTUHMKLQotIwotIyBEaWFsb2dzCi0jCi1DSEVDS0JPWF9TSE9XX0dFTkVSQVRFX0pBVkFfUFJPWFlfRElBTE9HPUhpZGUgR2VuZXJhdGUgSmF2YSBiZWFuIFByb3h5IERpYWxvZwotQ0hFQ0tCT1hfU0hPV19QUk9YWTJTQU1QTEVfRElBTE9HPUhpZGUgUHJveHkgVG8gU2FtcGxlIEdlbmVyYXRpb24gRGlhbG9nCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfV1NETDJQUk9YWT1IaWRlIHRoZSBkaWFsb2cgZm9yIGdlbmVyYXRpbmcgdGhlIEphdmEgYmVhbiBwcm94eSBhY3Rpb24uCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfUFJPWFkyU0FNUExFPUhpZGUgdGhlIGRpYWxvZyBmb3IgZ2VuZXJhdGluZyB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIGFjdGlvbi4KLQotIwotIyAgICAgICBXZWIgU2VydmljZXMgUHJlZmVyYW5jZSBQYWdlcwotIwotIyBDYXRlZ29yaWVzCi0KLVBSRUZFUkVOQ0VfQ0FURUdPUllfU0VSVkVSX1JVTlRJTUU9U2VydmVyIGFuZCBSdW50aW1lCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1BST0pFQ1RfVE9QT0xPR1k9UHJvamVjdCBUb3BvbG9neQotUFJFRkVSRU5DRV9DQVRFR09SWV9URVNUX0ZBQ0lMSVRZPVRlc3QgRmFjaWxpdHkgRGVmYXVsdHMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfRElBTE9HUz1Qb3B1cCBEaWFsb2cgU2VsZWN0aW9uCi0KLQotIwotIyBQb3AtdXAgYWN0aW9ucwotIwotTUVOVV9SVU49JlJ1bgotCi0jCi0jIFdlYlNlcnZpY2VUZXN0UGFnZQotIwotV1NFWFBMT1JFUl9JRD1XZWIgU2VydmljZXMgRXhwbG9yZXIKLQotIwotIyBXZWJTZXJ2aWNlUHVibGlzaFBhZ2UKLSMKLVRPT0xUSVBfTEFVTkNIX1dTX0VYUExPUkVSPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyCi1DT01NQU5EX0xBVU5DSF9XU19FWFBMT1JFUj1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotCi0jCi0jIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSMKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk09SUJNIFVEREkgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk1fVEVTVD1JQk0gVURESSBUZXN0IFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUPU1pY3Jvc29mdCBVRERJIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUX1RFU1Q9TWljcm9zb2Z0IFVEREkgVGVzdCBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUD1TQVAgVURESSBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUF9URVNUPVNBUCBVRERJIFRlc3QgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9YTUVUSE9EUz1YTWV0aG9kcyBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX05UVENPTU09TlRUIENvbW11bmljYXRpb25zIFJlZ2lzdHJ5Ci0KLSMKLSMgV1NJTCBwcm94eQotIwotSU1QT1JUX1dJWkFSRF9OQU1FX1dTSUw9V1NJTAotUE9QVVBfR0VORVJBVEVfV1NJTD1HZW5lcmF0ZSBXU0lMCi0KLSMKLSMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgVHlwZQotIwotV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMPVNrZWxldG9uIEphdmEgYmVhbiBXZWIgU2VydmljZQotV0VCU0VSVklDRVRZUEVfTkFNRV9KQVZBPUphdmEgYmVhbiBXZWIgU2VydmljZQotCi0jCi0jIENsaWVudCBwcm9qZWN0IHR5cGUKLSMKLUxBQkVMX0NMSUVOVF9UWVBFX1dFQj1XZWIKLUxBQkVMX0NMSUVOVF9UWVBFX0VKQj1FSkIKLUxBQkVMX0NMSUVOVF9UWVBFX0FQUF9DTElFTlQ9QXBwbGljYXRpb24gQ2xpZW50Ci1MQUJFTF9DTElFTlRfVFlQRV9DT05UQUlORVJMRVNTPUphdmEKLQotIwotIyBIYW5kbGVycyBDb25maWd1cmF0aW9uIHdpemFyZCBwYWdlCi0jCi1QT1BVUF9BRERfSEFORExFUlM9Q29uZmlndXJlIGhhbmRsZXJzCi1MQUJFTF9IQU5ETEVSU19DT05GSUc9Q29uZmlndXJlIEhhbmRsZXJzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxYTk3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9InB1YmxpY1VERElSZWdpc3RyeVR5cGUiCi0gICAgICBuYW1lPSIlWFBfUFVCTElDX1VERElfUkVHSVNUUllfVFlQRVMiLz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9InByaXZhdGVVRERJUmVnaXN0cnlUeXBlIgotICAgICAgbmFtZT0iJVhQX1BSSVZBVEVfVURESV9SRUdJU1RSWV9UWVBFUyIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0id2ViU2VydmljZUNsaWVudFR5cGUiCi0gICAgICBuYW1lPSIlWFBfV0VCX1NFUlZJQ0VfQ0xJRU5UX1RZUEVTIgotICAgICAgc2NoZW1hPSJzY2hlbWEvd2ViU2VydmljZUNsaWVudFR5cGUuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0id2ViU2VydmljZVRlc3QiCi0gICAgICBuYW1lPSIlWFBfV0VCX1NFUlZJQ0VfVEVTVCIKLSAgICAgIHNjaGVtYT0ic2NoZW1hL3dlYlNlcnZpY2VUZXN0LmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9IndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSIKLSAgICAgIG5hbWU9IiVYUF9XRUJfU0VSVklDRV9TRVJWRVJfUlVOVElNRV9UWVBFUyIKLSAgICAgIHNjaGVtYT0ic2NoZW1hL3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZS5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJjbGllbnRQcm9qZWN0VHlwZSIKLSAgICAgIG5hbWU9IiVYUF9XRUJfU0VSVklDRV9DTElFTlRfUFJPSkVDVF9UWVBFIgotICAgICAgc2NoZW1hPSJzY2hlbWEvY2xpZW50UHJvamVjdFR5cGUuZXhzZCIvPiAgIAotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0ib2JqZWN0U2VsZWN0aW9uV2lkZ2V0IgotICAgICAgbmFtZT0iJVhQX09CSkVDVF9TRUxFQ1RJT05fV0lER0VUIgotICAgICAgc2NoZW1hPSJzY2hlbWEvb2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmV4c2QiLz4KLQotICAgPCEtLSBVRERJIFJlZ2lzdHJ5IFR5cGVzIC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfSUJNX1RFU1QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QiPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk0iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeUlCTSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5SUJNIj4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUX1RFU1QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QiPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlQiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0Ij4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QiPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHVibGljVURESVJlZ2lzdHJ5VHlwZSI+Ci0gICAgICA8cHVibGljVURESVJlZ2lzdHJ5VHlwZQotICAgICAgICAgICAgbmFtZT0iJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVAiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVNBUCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5U0FQIj4KLSAgICAgIDwvcHVibGljVURESVJlZ2lzdHJ5VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnB1YmxpY1VERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHB1YmxpY1VERElSZWdpc3RyeVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfWE1FVEhPRFMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcyI+Ci0gICAgICA8L3B1YmxpY1VERElSZWdpc3RyeVR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5wdWJsaWNVRERJUmVnaXN0cnlUeXBlIj4KLSAgICAgIDxwdWJsaWNVRERJUmVnaXN0cnlUeXBlCi0gICAgICAgICAgICBuYW1lPSIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX05UVENPTU0iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU5UVENvbW0iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpLlB1YmxpY1VERElSZWdpc3RyeU5UVENvbW0iPgotICAgICAgPC9wdWJsaWNVRERJUmVnaXN0cnlUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gVGVzdCBGYWNpbGl0aWVzIC0tPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VUZXN0Ij4KLQotICAgICAgPHdlYlNlcnZpY2VUZXN0Ci0gICAgICAgICAgICBtZXRob2RzbmVlZGVkPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVNBTVBMRV9UWVBFX1dFQlNFUlZJQ0VTX0lEIgotICAgICAgICAgICAgamF2YT0idHJ1ZSIKLSAgICAgICAgICAgIGNvZGVnZW49InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC53c3NhbXBsZS5XZWJTZXJ2aWNlV1NTYW1wbGVFeGVjdXRhYmxlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZVNhbXBsZVRlc3QiPgotICAgICAgPC93ZWJTZXJ2aWNlVGVzdD4KLQotICAgICAgPHdlYlNlcnZpY2VUZXN0Ci0gICAgICAgICAgICBtZXRob2RzbmVlZGVkPSJmYWxzZSIKLSAgICAgICAgICAgIG5hbWU9IiVXU0VYUExPUkVSX0lEIgotICAgICAgICAgICAgamF2YT0iZmFsc2UiCi0gICAgICAgICAgICBjb2RlZ2VuPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyLldlYlNlcnZpY2VFeHBsb3JlckV4ZWN1dGFibGUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5leHBsb3Jlci5XZWJTZXJ2aWNlRXhwbG9yZXJFeGVjdXRhYmxlIj4KLSAgICAgIDwvd2ViU2VydmljZVRlc3Q+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIEphdmEgQmVhbnMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIj4KLQotICAgICAgPHdlYlNlcnZpY2VUeXBlCi0gICAgICAgICAgICBsYWJlbD0iJVdFQlNFUlZJQ0VUWVBFX05BTUVfSkFWQSIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJGaWxlIElSZXNvdXJjZSBDb21waWxhdGlvblVuaXQiCi0gICAgICAgICAgICBleHRlbnNpb25NZXRhZGF0YT0iLmphdmEgLmNsYXNzIgotICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICBpbmNsdWRlTmF0dXJlcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSIKLSAgICAgICAgICAgIGV4Y2x1ZGVOYXR1cmVzPSIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnR5cGUuamF2YSI+Ci0gICAgICA8L3dlYlNlcnZpY2VUeXBlPgotCi0gICAgICA8d2ViU2VydmljZVR5cGUKLSAgICAgICAgICAgIGxhYmVsPSIlV0VCU0VSVklDRVRZUEVfTkFNRV9XU0RMIgotICAgICAgICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGE9IkZpbGUgSVJlc291cmNlIFN0cmluZyBTZXJ2aWNlSW1wbCBTZXJ2aWNlUmVmSW1wbCBXU0RMUmVzb3VyY2VJbXBsIgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii53c2RsIC53c2lsIC5odG1sIC5TZXJ2aWNlSW1wbCAuU2VydmljZVJlZkltcGwgLldTRExSZXNvdXJjZUltcGwiCi0gICAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5XU0RMU2VsZWN0aW9uV2lkZ2V0IgotICAgICAgICAgICAgaW5jbHVkZU5hdHVyZXM9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlTmF0dXJlcz0iIiAgICAgICAgICAgIAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwiPgotICAgICAgPC93ZWJTZXJ2aWNlVHlwZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gRHluYW1pYyBXaXphcmRzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19DTElFTlQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkR5bmFtaWNXaXphcmQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVQTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX0NMSUVOVAotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5DbGllbnRXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9nZW5fc2FtcGxlX3dpei5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5HZW5TYW1wbGVXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbnNhbXBsZXdpemFyZCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9jb25maWdfaGFuZGxlcl93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuQ29uZmlnU2VydmljZUhhbmRsZXJzV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIHRpdGxlPSIlTEFCRUxfSEFORExFUlNfQ09ORklHIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuc2VydmljZSI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9jb25maWdfaGFuZGxlcl93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuQ29uZmlnQ2xpZW50SGFuZGxlcnNXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgdGl0bGU9IiVMQUJFTF9IQU5ETEVSU19DT05GSUciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvY29uZmlnX2hhbmRsZXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkNvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIHRpdGxlPSIlTEFCRUxfSEFORExFUlNfQ09ORklHIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMiPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+ICAgCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fSU1QT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvaW1wb3J0X3dzLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9IndzaW1wb3J0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVQTFVHSU5fSU1QT1JUX1dJWkFSRF9ERVNDX1dTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9pbXBvcnRfd3Nfd2l6LmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fSU1QT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuSW1wb3J0V1NXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9IndzaW1wb3J0Ij4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlSU1QT1JUX1dJWkFSRF9OQU1FX1dTSUwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy93c2lsL2ltcG9ydF93c2lsLmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9IndzaWxpbXBvcnQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJUlNUE9SVF9XSVpBUkRfREVTQ19XU0lMCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy93c2lsL2ltcG9ydF93aXpfYmFubmVyX3dzaWwuZ2lmIgotICAgICAgICAgICAgbmFtZT0iJUlNUE9SVF9XSVpBUkRfTkFNRV9XU0lMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuSW1wb3J0V1NJTFdpZGdldEJpbmRpbmciCi0gICAgICAgICAgICBpZD0id3NpbGltcG9ydCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBQcmVmZXJlbmNlIFBhZ2VzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX1NFUlZFUl9SVU5USU1FIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlNlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZSI+ICAgICAgICAgICAgCi0gICAgICA8L3BhZ2U+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9ESUFMT0dTIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5wcmVmZXJlbmNlcy5BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0Lndzcy5wb3B1cC5jYXRlZ29yeSI+Ci0gICAgICA8L3BhZ2U+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9URVNUX0ZBQ0lMSVRZIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLlNjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9QUk9KRUNUX1RPUE9MT0dZIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9qZWN0VG9wb2xvZ3lQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UiPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBNYWluIE1lbnUgQWN0aW9ucyAtLT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlQ09NTUFORF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVNRU5VX1JVTiIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5ydW4iPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJleHBsb3JlciI+Ci0gICAgICAgICAgICA8L3NlcGFyYXRvcj4KLSAgICAgICAgIDwvbWVudT4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQ09NTUFORF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9yZWdpc3RyeS5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9MQVVOQ0hfV1NfRVhQTE9SRVIiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5MYXVuY2hXU0VBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UudWkucnVuL2V4cGxvcmVyIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uLkxhdW5jaFdTRUFjdGlvbiI+Ci0gICAgICAgIDwvYWN0aW9uPgotICAgICA8L2FjdGlvblNldD4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gIkRvbid0IFNob3cgTWUiIEV4dGVuc2lvbnMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUiPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIHNob3djaGVja2JveD0idHJ1ZSIKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX0dFTkVSQVRFX0pBVkFfUFJPWFlfRElBTE9HIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1dTREwyUFJPWFkiCi0gICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuUFBBRDAwMDQiCi0gICAgICAgICAgICBhbHdheXNoaWRlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19QUk9YWTJTQU1QTEVfRElBTE9HIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1BST1hZMlNBTVBMRSIKLSAgICAgICAgICAgIGluZm9wb3A9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5QUEFEMDAwNSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBzaG93Y2hlY2tib3g9ImZhbHNlIgotICAgICAgICAgICAgYWx3YXlzaGlkZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vud3NpbCI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIHNob3djaGVja2JveD0iZmFsc2UiCi0gICAgICAgICAgICBhbHdheXNoaWRlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICA8L2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBQb3B1cHMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9HRU5FUkFURV9XU0lMIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJ3c2lsaW1wb3J0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NpbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5nZW5zYW1wbGV3aXphcmQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VOX1NBTVBMRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vuc2FtcGxld2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmphdmEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vuc2FtcGxld2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTl9TQU1QTEUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbnNhbXBsZXdpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9HRU5FUkFURV9XU0lMIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0id3NpbGltcG9ydCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSJ3ZWJzZXJ2aWNlcy54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuc2VydmljZSI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLnNlcnZpY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8dmlzaWJpbGl0eT4KLQkJCTxvYmplY3RTdGF0ZQotICAgICAgICAgICAgICAgICAgbmFtZT0idHlwZSIKLSAgICAgICAgICAgICAgICAgIHZhbHVlPSJIYW5kbGVycyI+Ci0gICAgICAgICAgICA8L29iamVjdFN0YXRlPgotICAgICAgICAgPC92aXNpYmlsaXR5PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLnNlcnZpY2UiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAgICAgICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0id2Vic2VydmljZXNjbGllbnQueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQUREX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmNsaWVudCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSJlamItamFyLnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgCi0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IndlYi54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5lZGl0b3IiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9BRERfSEFORExFUlMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuY2xpZW50Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iYXBwbGljYXRpb24tY2xpZW50LnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmhhbmRsZXJzLmVkaXRvciI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0FERF9IQU5ETEVSUyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gCi0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuaGFuZGxlcnMuZWRpdG9yIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlUE9QVVBfQUREX0hBTkRMRVJTIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5oYW5kbGVycy5jbGllbnQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gICAgICAKLSAgICAgIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuZ2Vud3NpbCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX0dFTkVSQVRFX1dTSUwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJ3c2lsaW1wb3J0Ij4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWYiCi0gICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmdlbndzaWwiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9HRU5FUkFURV9XU0lMIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICBpZD0id3NpbGltcG9ydCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSBDbGllbnQgUHJvamVjdCBUeXBlcyAtLT4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZSI+Ci0gICAgICA8Y2xpZW50UHJvamVjdFR5cGUKLSAgICAgICAgICAgIGluY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlPSIiCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX0NMSUVOVF9UWVBFX1dFQiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIj4KLSAgICAgIDwvY2xpZW50UHJvamVjdFR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZSI+Ci0gICAgICA8Y2xpZW50UHJvamVjdFR5cGUKLSAgICAgICAgICAgIGluY2x1ZGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUgb3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX0NMSUVOVF9UWVBFX0NPTlRBSU5FUkxFU1MiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkNvbnRhaW5lcmxlc3MiPgotICAgICAgPC9jbGllbnRQcm9qZWN0VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlIj4KLSAgICAgIDxjbGllbnRQcm9qZWN0VHlwZQotICAgICAgICAgICAgaW5jbHVkZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSIKLSAgICAgICAgICAgIGV4Y2x1ZGU9IiIKLSAgICAgICAgICAgIGxhYmVsPSIlTEFCRUxfQ0xJRU5UX1RZUEVfRUpCIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5FSkIiPgotICAgICAgPC9jbGllbnRQcm9qZWN0VHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlIj4KLSAgICAgIDxjbGllbnRQcm9qZWN0VHlwZQotICAgICAgICAgICAgaW5jbHVkZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuQXBwbGljYXRpb25DbGllbnROYXR1cmUiCi0gICAgICAgICAgICBleGNsdWRlPSIiCi0gICAgICAgICAgICBsYWJlbD0iJUxBQkVMX0NMSUVOVF9UWVBFX0FQUF9DTElFTlQiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkFwcENsaWVudCI+Ci0gICAgICA8L2NsaWVudFByb2plY3RUeXBlPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDwhLS0gT2JqZWN0IFNlbGVjdGlvbiBXaWRnZXRzIC0tPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkphdmFCZWFuU2VsZWN0aW9uV2lkZ2V0IgotICAgICAgICAgICAgdHJhbnNmb3JtZXI9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KYXZhQmVhblNlbGVjdGlvblRyYW5zZm9ybWVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KYXZhQmVhblNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8L29iamVjdFNlbGVjdGlvbldpZGdldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuRUpCU2VsZWN0aW9uVHJhbnNmb3JtZXIiICAgICAgICAgICAgCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkVKQlNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8L29iamVjdFNlbGVjdGlvbldpZGdldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLm9iamVjdFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICB0cmFuc2Zvcm1lcj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LldTRExTZWxlY3Rpb25UcmFuc2Zvcm1lciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCI+Ci0gICAgICA8L29iamVjdFNlbGVjdGlvbldpZGdldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tIE5ldyBleHRlbnNpb24gcG9pbnRzIGZvciBXVFAgTTQgLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkaXNjb3ZlcnkiIG5hbWU9IlVJIEJyb3dzZXJzIGZvciBpbXBsZW1lbnRhdGlvbiBhcnRpZmFjdHMiLz4gICAgICAKLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndzSW1wbCIgbmFtZT0iV2ViIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ3c0NsaWVudEltcGwiIG5hbWU9IldlYiBzZXJ2aWNlIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlcnZpY2VUeXBlIiBuYW1lPSJFeHRlbnNpb25zIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29tYmluYXRpb25zIG9mIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zLCBzY2VuYXJpb3MsIGFuZCBtb2R1bGUgdHlwZXMgIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjbGllbnRUeXBlIiBuYW1lPSJFeHRlbnNpb25zIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29tYmluYXRpb25zIG9mIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMgYW5kIG1vZHVsZSB0eXBlcyIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2ViU2VydmljZVJ1bnRpbWUiIG5hbWU9IldlYiBzZXJ2aWNlIHJ1bnRpbWVzIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0ZXN0ZXIiIG5hbWU9IldlYiBzZXJ2aWNlIHRlc3QgZmFjaWxpdGllcyIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHVibGlzaGVyIiBuYW1lPSJXZWIgc2VydmljZSBwdWJsaWNhdGlvbiBmYWNpbGl0aWVzIi8+ICAgICAgCi0KLTwhLS0gTTQgRXh0ZW5zaW9ucyB0byB0aGUgbmV3IGV4dGVuc2lvbiBwb2ludHMgLS0+Ci0KLTwhLS0gVGVzdCBFeHRlbnNpb25zIGJlZ2lubmluZyAgLS0+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS50ZXN0ZXIiPgotICA8dGVzdGVyCi0gICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZVNhbXBsZVRlc3QiCi0gICAgbGFiZWw9IiVTQU1QTEVfVFlQRV9XRUJTRVJWSUNFU19JRCIKLSAgICB0ZXN0V1NETD0ibm8iCi0gICAgd3NDbGllbnRJbXBsSWRzPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSIKLSAgICBtb2R1bGV0eXBlcz0id2VibW9kdWxlIgotICAgIG1ldGhvZHNuZWVkZWQ9InRydWUiCi0gICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Qud3NzYW1wbGUuR1NUQ1dlYlNlcnZpY2VUZXN0ZXIiPgotICA8L3Rlc3Rlcj4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnRlc3RlciI+Ci0gIDx0ZXN0ZXIKLSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5leHBsb3Jlci5XZWJTZXJ2aWNlRXhwbG9yZXIiCi0gICAgbGFiZWw9IiVXU0VYUExPUkVSX0lEIgotICAgIHRlc3RXU0RMPSJ5ZXMiCi0gICAgd3NDbGllbnRJbXBsSWRzPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSIKLSAgICBtb2R1bGV0eXBlcz0id2VibW9kdWxlIgotICAgIG1ldGhvZHNuZWVkZWQ9ImZhbHNlIgotICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyLldTRVdlYlNlcnZpY2VUZXN0ZXIiPgotICA8L3Rlc3Rlcj4KLTwvZXh0ZW5zaW9uPgotCi08IS0tIFRlc3QgRXh0ZW5zaW9ucyBlbmQgIC0tPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NJbXBsIj4KLSAgPHdlYlNlcnZpY2VJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVXRUJTRVJWSUNFVFlQRV9OQU1FX0pBVkEiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UgQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkphdmFCZWFuU2VsZWN0aW9uV2lkZ2V0Ij4KLSAgPC93ZWJTZXJ2aWNlSW1wbD4KLTwvZXh0ZW5zaW9uPiAgIAotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzQ2xpZW50SW1wbCI+Ci0gIDx3ZWJTZXJ2aWNlQ2xpZW50SW1wbAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IkphdmEgUHJveHkiPgotICA8L3dlYlNlcnZpY2VDbGllbnRJbXBsPgotPC9leHRlbnNpb24+ICAgCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuc2VydmljZVR5cGUiPgotICA8c2VydmljZVR5cGUKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3Muc2VydmljZVR5cGUuamF2YSIKLSAgICAgICAgICAgIGltcGxJZD0ib3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5qYXZhIgotICAgICAgICAgICAgYnVNb2R1bGVUeXBlc0luY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0gICAgICAgICAgICBidU1vZHVsZVR5cGVzRXhjbHVkZT0iIgotICAgICAgICAgICAgdGRNb2R1bGVUeXBlc0luY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiCi0gICAgICAgICAgICB0ZE1vZHVsZVR5cGVzRXhjbHVkZT0iIj4KLSAgPC9zZXJ2aWNlVHlwZT4KLTwvZXh0ZW5zaW9uPiAgIAotPCEtLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLnNlcnZpY2VUeXBlIj4KLSAgPHNlcnZpY2VUeXBlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnNlcnZpY2VUeXBlLndzZGwiCi0gICAgICAgICAgICBpbXBsSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuamF2YSIKLSAgICAgICAgICAgIGJ1TW9kdWxlVHlwZXNJbmNsdWRlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotICAgICAgICAgICAgYnVNb2R1bGVUeXBlc0V4Y2x1ZGU9IiIKLSAgICAgICAgICAgIHRkTW9kdWxlVHlwZXNJbmNsdWRlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIgotICAgICAgICAgICAgdGRNb2R1bGVUeXBlc0V4Y2x1ZGU9IiIKLSAgICAgICAgICAgIHdlYlNlcnZpY2VUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwiPgotICA8L3NlcnZpY2VUeXBlPgotPC9leHRlbnNpb24+Ci0tLT4KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRUeXBlIj4KLSAgPGNsaWVudFR5cGUKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50VHlwZS5qYXZhLndlYk9ubHkiCi0gICAgICAgICAgICBpbXBsSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgbW9kdWxlVHlwZXNJbmNsdWRlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIgotCQkJbW9kdWxlVHlwZXNFeGNsdWRlPSIiPgotICA8L2NsaWVudFR5cGU+Ci08L2V4dGVuc2lvbj4KLQotICAgICAgIAotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvY2xpZW50UHJvamVjdFR5cGUuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9jbGllbnRQcm9qZWN0VHlwZS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTk1MjEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9jbGllbnRQcm9qZWN0VHlwZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiBpZD0iY2xpZW50UHJvamVjdFR5cGUiIG5hbWU9ImNsaWVudFByb2plY3RUeXBlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBjbGllbnQgY29udGFpbmVyIHR5cGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjbGllbnRQcm9qZWN0VHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHBvaW50IGF0dHJpYnV0ZSBzdHJpbmcgbXVzdCBiZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNsaWVudFByb2plY3RUeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIGJsYW5rIGRlbGltaXRlZCBsaXN0IG9mIFByb2plY3QgTmF0dXJlIElkcy4gIFRoZSBsaXN0ZWQgSURzIGluZGljYXRlIHRoYXQgdGhpcyB0eXBlIG9ubHkgd29ya3Mgd2l0aCB0aGVzZSBwYXJ0aWN1bGFyIHByb2plY3QgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgdGhpcyB0eXBlIG9ubHkgd29ya3Mgd2l0aCB3ZWIgcHJvamVjdHMgYW4gSUQgb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSB3b3VsZCBiZSBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIGJsYW5rIGRlbGltaXRlZCBsaXN0IG9mIFByb2plY3QgTmF0dXJlIElkcy4gIFRoZSBsaXN0ZWQgSURzIGluZGljYXRlIHRoYXQgdGhpcyB0eXBlIERPRVMgTk9UIHdvcmsgd2l0aCB0aGVzZSBwYXJ0aWN1bGFyIHByb2plY3QgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgdGhpcyB0eXBlIGRvZXMgbm90IHdvcmsgd2l0aCB3ZWIgcHJvamVjdHMgYW4gSUQgb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSB3b3VsZCBiZSBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBsYWJlbCByZXByZXNlbnRzIHRoaXMgY2xpZW50IHByb2plY3QgdHlwZS4gIEl0IGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBzbyBpdCBtdXN0IGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjbGllbnQgcHJvamVjdCB0eXBlLiAgVGhpcyBpZGVudGlmaWVyIGlzIHJlZmVyZW5jZWQgaW4gdGhlIGNsaWVudFByb2plY3RUeXBlIGF0dHJpYnV0ZSBvZiB0aGUgd2ViU2VydmljZUNsaWVudFR5cGUgZWxlbWVudCBvZiBhbiBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZUNsaWVudFR5cGUgZXh0ZW5zaW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL29iamVjdFNlbGVjdGlvbldpZGdldC5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL29iamVjdFNlbGVjdGlvbldpZGdldC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWNlZmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NjaGVtYS9vYmplY3RTZWxlY3Rpb25XaWRnZXQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIgaWQ9Im9iamVjdFNlbGVjdGlvbldpZGdldCIgbmFtZT0ib2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdFNlbGVjdGlvbldpZGdldCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHBvaW50IGF0dHJpYnV0ZSBzdHJpbmcgbXVzdCBiZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkub2JqZWN0U2VsZWN0aW9uV2lkZ2V0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGVudHJ5IGFsbG93cyBhbiBleHRlbmRlciB0byBhZGQgbmV3IHdheXMgb2YgYnJvd3NpbmcvZmluZGluZyBhcnRpZmFjdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgV2ViIHNlcnZpY2VzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGNsYXNzIGRlZmluZXMgU2VsZWN0aW9uIFdpZGdldCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIE9iamVjdCBTZWxlY3Rpb24gcGFnZSBvZiB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZHMuICBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSU9iamVjdFNlbGVjdGlvbldpZGdldCBpbnRlcmZhY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpZCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGVsZW1lbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXIiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lciBpbnRlcmZhY2UuICBUaGlzIGludGVyZmFjZSBjb250YWlucyBhIHRyYW5zZm9ybSBtZXRob2QuICBFdmVuIHRob3VnaCB0aGUgdHlwZSBvZiB0aGUgaW5wdXQgcGFyYW1ldGVyIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGFyZSBvZiB0eXBlIE9iamVjdCBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZXkgd2lsbCBiZSB1c2VkIHdpdGggdGhlIHR5cGUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbi4gIFRoaXMgdHJhbnNmb3JtYXRpb24gbWV0aG9kIGFsbG93cyB0aGUgZXh0ZW5kZXIgdG8gbW9kaWZ5IHRoZSBpbml0aWFsIHNlbGVjdGlvbiB0byBhbiBJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3QgdGhhdCBpcyBtb3JlIHJlYWRpbHkgdXNhYmxlIGJ5IHRoZSBydW50aW1lIHNlcnZlciB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VDbGllbnRUeXBlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZUNsaWVudFR5cGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiZTJmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZUNsaWVudFR5cGUuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49IiIgaWQ9IndlYlNlcnZpY2VDbGllbnRUeXBlIiBuYW1lPSJXZWIgU2VydmljZSBDbGllbnQgVHlwZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBXZWIgU2VydmljZSBDbGllbnQgdHlwZXMuICBUaGlzIGlzIGRvbmUgYnkgZGVmaW5pbmcgd2ViU2VydmljZUNsaWVudFR5cGUgZWxlbWVudHMuICBUaGVzZSBlbGVtZW50cyByZWZlciB0byBhIHNlcnZlciBhbmQgYSBXZWIgU2VydmljZSBydW50aW1lLiAgVGhlc2UgYXJlIHJlc3BlY3RpdmVseSBkZWZpbmVkIGluIHRoZSB3ZWJTZXJ2aWNlU2VydmVyIGVsZW1lbnQgYW5kIHRoZSB3ZWJTZXJ2aWNlUnVudGltZSBlbGVtZW50LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlU2VydmVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VSdW50aW1lIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VDbGllbnRUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgcG9pbnQgYXR0cmlidXRlIHN0cmluZyBtdXN0IGJlIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53ZWJTZXJ2aWNlQ2xpZW50VHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2ViU2VydmljZVNlcnZlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgc2VydmVyIHR5cGUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBmYWN0b3J5IGlkIGZvciBhIHNlcnZlci4gIFRoaXMgaWQgaXMgZGVmaW5lZCBieQotdGhlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5zZXJ2ZXJUeXBlcyBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNEZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhpcyBzZXJ2ZXIgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgc2VydmVyLiAgTm90ZTogIHRoaXMgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIGluZm9ybWF0aW9uLiAgSWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBwYXJ0aWN1bGFyIHNlcnZlciBhcyB0aGVpciBkZWZhdWx0IHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gIFNob3VsZCBjb250YWluIGEgdmFsdWUgb2YgZWl0aGVyICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIGxvY2FsIElEIGZvciB0aGlzIHNlcnZlci4gIFRoZSBzZXJ2ZXIgYXR0cmlidXRlIG9mIHRoZSB3ZWJzZXJ2aWNlQ2xpZW50VHlwZSBlbGVtZW50IHJlZmVycyB0byB0aGlzIElELgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWRzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIGN1cnJlbnRseSBhIHBsYWNlIGhvbGRlciBmb3IgZnV0dXJlIGRldmVsb3BtZW50LiAgUGxlYXNlLCBkbyBub3QgdXNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlUnVudGltZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgV2ViIFNlcnZpY2VzIHJ1bnRpbWUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgbGFiZWwgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciB0aGlzIHJ1bnRpbWUuICBUaGVyZWZvcmUsIGlzIG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2VzIHJ1bnRpbWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNEZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhpcyBydW50aW1lIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHJ1bnRpbWUuICBOb3RlOiAgdGhpcyBkZWZhdWx0IHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgaW4gdGhlIGFic2VuY2Ugb2Ygb3RoZXIgaW5mb3JtYXRpb24uICBJZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBhIHBhcnRpY3VsYXIgcnVudGltZSBhcyB0aGVpciBkZWZhdWx0IHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gIFNob3VsZCBjb250YWluIGEgdmFsdWUgb2YgZWl0aGVyICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iajJlZXZlcnNpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBKMkVFIHZlcnNpb25zIHN1cHBvcnRlZCBieSB0aGlzIHJ1bnRpbWUuICBUaGUgYWxsb3dhYmxlIHZhbHVlcyBhcmUgMTIsIDEzLCBhbmQgMTQuICBJZiBtb3JlIHRoYW4gb25lIEoyRUUgdmVyc2lvbiBpcyBzdXBwb3J0ZWQgZWFjaCBKMkVFIGxldmVsIHNob3VsZCBiZSBzcGVjaWZpZWQgd2l0aCBhIGJsYW5rIGRlbGltaXRlci4oZWcuIGlmIEoyRUUgdmVyc2lvbiAxLjIgYW5kIDEuMyBhcmUgc3VwcG9ydGVkIHRoZW4gdGhpcyBhdHRyaWJ1dGUgc3RyaW5nIHdvdWxkIGJlICZxdW90OzEyIDEzJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgV2ViIFNlcnZpY2VzIGNsaWVudCB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBJRCBmb3IgdGhpcyBXZWIgU2VydmljZSBDbGllbnQgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgZm9yIHRoaXMgV2ViIFNlcnZpY2UgQ2xpZW50IHR5cGUuICBJdCBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgc28gaXQgbXVzdCBiZSB0cmFuc2xhdGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudFR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUga2luZCBvZiBXZWIgU2VydmljZSBDbGllbnQgdHlwZSBiZWluZyBkZWZpbmVkLiAoaWUuIHRoZSB2YWx1ZSBvZiB0aGUgSmF2YSBjbGllbnQgaXMgb3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icnVudGltZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBydW50aW1lIElEIGZvciB0aGlzIFdlYiBTZXJ2aWNlIGNsaWVudCB0eXBlLiAgVGhlcmUgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZyB3ZWJTZXJ2aWNlUnVudGltZSBlbGVtZW50IHdpdGggYW4gYXR0cmlidXRlIGNhbGxlZCBpZCB0aGF0IGhhcyB0aGlzIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlciIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIHNlcnZlciBmb3IgdGhpcyBXZWIgU2VydmljZSBjbGllbnQgdHlwZS4gIFRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcgd2ViU2VydmljZVNlcnZlciBlbGVtZW50IHdpdGggYW4gYXR0cmlidXRlIGNhbGxlZCBpZCB0aGF0IGhhcyB0aGlzIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudFByb2plY3RUeXBlIiB0eXBlPSJzdHJpbmciIHVzZT0iZGVmYXVsdCIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5XZWIiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgc3BhY2UgZGVsaW1pdGVkIGxpc3Qgb2YgY2xpZW50IHByb2plY3QgdHlwZSBpZHMgc3VwcG9ydGVkIGJ5IHRoaXMgYnkgdGhpcyB3ZWJTZXJ2aWNlQ2xpZW50VHlwZSBlbGVtZW50LiAgVGhlIGNsaWVudCBwcm9qZWN0IHR5cGUgaWRzIGFyZSBkZWZpbmVkIGJ5IHRoZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRldmVsb3BCaW5kaW5nIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzcGVjaWZpZXMgdGhlIENvbW1hbmRzIGFuZCBVSSBlbGVtZW50cyBhc3NvY2lhdGUgd2l0aCBKMkVFIGRldmVsb3BtZW50IHBoYXNlLiAgVGhlIENvbW1hbmQgYW5kIFVJIGVsZW1lbnRzIGluIHRoaXMgYmluZGluZyBhbHdheXMgY29tZSBmaXJzdCBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFzc2VtYmx5QmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBhc3NlbWJseSBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGRldmVsb3BtZW50IHBoYXNlIGJpbmRpbmcgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3lCaW5kaW5nIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzcGVjaWZpZXMgdGhlIENvbW1hbmRzIGFuZCBVSSBlbGVtZW50cyBhc3NvY2lhdGUgd2l0aCBKMkVFIGRlcGxveSBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGFzc2VtYmx5IHBoYXNlIGJpbmRpbmcgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnN0YWxsQmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBpbnN0YWxsIHBoYXNlLiAgVGhlIENvbW1hbmQgYW5kIFVJIGVsZW1lbnRzIGluIHRoaXMgYmluZGluZyBhbHdheXMgY29tZSBhZnRlciB0aGUgZGVwbG95IHBoYXNlIGJpbmRpbmcgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDRiY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiBpZD0id2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIiBuYW1lPSJXZWIgU2VydmljZSBTZXJ2ZXIgUnVudGltZSBUeXBlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVzIFdlYiBTZXJ2aWNlIFNlcnZlciB0eXBlcy4gIFRoaXMgaXMgZG9uZSBieSBkZWZpbmluZyB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgZWxlbWVudHMuICBUaGVzZSBlbGVtZW50cyByZWZlciB0byBhIHNlcnZlciBhbmQgYSBXZWIgU2VydmljZSBydW50aW1lLiAgVGhlc2UgYXJlIHJlc3BlY3RpdmVseSBkZWZpbmVkIGluIHRoZSB3ZWJTZXJ2aWNlU2VydmVyIGVsZW1lbnQgYW5kIHRoZSB3ZWJTZXJ2aWNlUnVudGltZSBlbGVtZW50LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlU2VydmVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VSdW50aW1lIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3ZWJTZXJ2aWNlVHlwZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHBvaW50IGF0dHJpYnV0ZSBzdHJpbmcgbXVzdCBiZSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlU2VydmVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBzZXJ2ZXIgdHlwZS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGZhY3RvcnkgaWQgZm9yIGEgc2VydmVyLiAgVGhpcyBpZCBpcyBkZWZpbmVkIGJ5Ci10aGUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnNlcnZlclR5cGVzIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpc0RlZmF1bHQiIHR5cGU9ImJvb2xlYW4iIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyBpZiB0aGlzIHNlcnZlciBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBzZXJ2ZXIuICBOb3RlOiAgdGhpcyBkZWZhdWx0IHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgaW4gdGhlIGFic2VuY2Ugb2Ygb3RoZXIgaW5mb3JtYXRpb24uICBJZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBhIHBhcnRpY3VsYXIgc2VydmVyIGFzIHRoZWlyIGRlZmF1bHQgdGhlbiB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLiAgU2hvdWxkIGNvbnRhaW4gYSB2YWx1ZSBvZiBlaXRoZXIgJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDtmYWxzZSZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgbG9jYWwgSUQgZm9yIHRoaXMgc2VydmVyLiAgVGhlIHNlcnZlciBhdHRyaWJ1dGUgb2YgdGhlIHdlYnNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBlbGVtZW50IHJlZmVycyB0byB0aGlzIElELgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InJ1bnRpbWVUeXBlSWRzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIGN1cnJlbnRseSBhIHBsYWNlIGhvbGRlciBmb3IgZnV0dXJlIGRldmVsb3BtZW50LiAgUGxlYXNlLCBkbyBub3QgdXNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlUnVudGltZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgV2ViIFNlcnZpY2VzIHJ1bnRpbWUuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgbGFiZWwgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGZvciB0aGlzIHJ1bnRpbWUuICBUaGVyZWZvcmUsIGlzIG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2VzIHJ1bnRpbWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNEZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpbmRpY2F0ZXMgaWYgdGhpcyBydW50aW1lIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHJ1bnRpbWUuICBOb3RlOiAgdGhpcyBkZWZhdWx0IHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgaW4gdGhlIGFic2VuY2Ugb2Ygb3RoZXIgaW5mb3JtYXRpb24uICBJZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBhIHBhcnRpY3VsYXIgcnVudGltZSBhcyB0aGVpciBkZWZhdWx0IHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gIFNob3VsZCBjb250YWluIGEgdmFsdWUgb2YgZWl0aGVyICZxdW90O3RydWUmcXVvdDsgb3IgJnF1b3Q7ZmFsc2UmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iajJlZXZlcnNpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBKMkVFIHZlcnNpb25zIHN1cHBvcnRlZCBieSB0aGlzIHJ1bnRpbWUuICBUaGUgYWxsb3dhYmxlIHZhbHVlcyBhcmUgMTIsIDEzLCBhbmQgMTQuICBJZiBtb3JlIHRoYW4gb25lIEoyRUUgdmVyc2lvbiBpcyBzdXBwb3J0ZWQgZWFjaCBKMkVFIGxldmVsIHNob3VsZCBiZSBzcGVjaWZpZWQgd2l0aCBhIGJsYW5rIGRlbGltaXRlci4oZWcuIGlmIEoyRUUgdmVyc2lvbiAxLjIgYW5kIDEuMyBhcmUgc3VwcG9ydGVkIHRoZW4gdGhpcyBhdHRyaWJ1dGUgc3RyaW5nIHdvdWxkIGJlICZxdW90OzEyIDEzJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJ0aWN1bGFyIFdlYiBTZXJ2aWNlcyBzZXJ2ZXIgcnVudGltZSB0eXBlLiAgQW4gZW50cnkgZm9yIHRoaXMgZWxlbWVudCBkZWZpbmVzIGEgdmFsaWQgY29tYmluYXRpb24gb2Ygc2VydmVyLCBydW50aW1lLCBhbmQgd2Vic2VydmljZSB0eXBlLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBJRCBmb3IgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXIgUnVudGltZSB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbmFtZSBmb3IgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXIgUnVudGltZSB0eXBlLiAgSXQgaXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIHNvIGl0IG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJydW50aW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHJ1bnRpbWUgSUQgZm9yIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgdHlwZS4gIFRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcgd2ViU2VydmljZVJ1bnRpbWUgZWxlbWVudCB3aXRoIGFuIGF0dHJpYnV0ZSBjYWxsZWQgaWQgdGhhdCBoYXMgdGhpcyB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXIiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBzZXJ2ZXIgZm9yIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgdHlwZS4gIFRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcgd2ViU2VydmljZVNlcnZlciBlbGVtZW50IHdpdGggYW4gYXR0cmlidXRlIGNhbGxlZCBpZCB0aGF0IGhhcyB0aGlzIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUga2luZCBvZiBXZWIgU2VydmljZSBSdW50aW1lIHR5cGUgYmVpbmcgZGVmaW5lZC4gKGVnLiB0aGUgdmFsdWUgb2YgYSBKYXZhIEJlYW4gV2Vic2VydmljZSBpcyBvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS5qYXZhKQotVGhlcmUgc2hvdWxkIGJlIGEgY29ycmVzcG9uZGluZyB3ZWJTZXJ2aWNlVHlwZSBlbGVtZW50IHdpdGggYW4gYXR0cmlidXRlIGNhbGxlZCBpZCB0aGF0IGhhcyB0aGlzIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRldmVsb3BCaW5kaW5nIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzcGVjaWZpZXMgdGhlIENvbW1hbmRzIGFuZCBVSSBlbGVtZW50cyBhc3NvY2lhdGUgd2l0aCBKMkVFIGRldmVsb3BtZW50IHBoYXNlLiAgVGhlIENvbW1hbmQgYW5kIFVJIGVsZW1lbnRzIGluIHRoaXMgYmluZGluZyBhbHdheXMgY29tZSBmaXJzdCBpbiB0aGUgd2l6YXJkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFzc2VtYmx5QmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBhc3NlbWJseSBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGRldmVsb3BtZW50IHBoYXNlIGJpbmRpbmcgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBsb3lCaW5kaW5nIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIHNwZWNpZmllcyBhIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNsYXNzLiAgVGhpcyBjbGFzcyBzcGVjaWZpZXMgdGhlIENvbW1hbmRzIGFuZCBVSSBlbGVtZW50cyBhc3NvY2lhdGUgd2l0aCBKMkVFIGRlcGxveSBwaGFzZS4gIFRoZSBDb21tYW5kIGFuZCBVSSBlbGVtZW50cyBpbiB0aGlzIGJpbmRpbmcgYWx3YXlzIGNvbWUgYWZ0ZXIgdGhlIGFzc2VtYmx5IHBoYXNlIGJpbmRpbmcgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnN0YWxsQmluZGluZyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcy4gIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIHRoZSBDb21tYW5kcyBhbmQgVUkgZWxlbWVudHMgYXNzb2NpYXRlIHdpdGggSjJFRSBpbnN0YWxsIHBoYXNlLiAgVGhlIENvbW1hbmQgYW5kIFVJIGVsZW1lbnRzIGluIHRoaXMgYmluZGluZyBhbHdheXMgY29tZSBhZnRlciB0aGUgZGVwbG95IHBoYXNlIGJpbmRpbmcgaW4gdGhlIHdpemFyZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlRUpCTW9kdWxlIiB0eXBlPSJib29sZWFuIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZiB0aGUgV2Vic2VydmljZSBmb3IgdGhpcyBTZXJ2ZXIgUnVudGltZSBUeXBlIGlzIHJlcXVpcmVkIHRvIGJlIGluIGFuIEVKQiBtb2R1bGUgdGhlbiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRydWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZVdlYk1vZHVsZSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWYgdGhlIFdlYnNlcnZpY2UgZm9yIHRoaXMgU2VydmVyIFJ1bnRpbWUgVHlwZSBpcyByZXF1aXJlZCB0byBiZSBpbiBhbiBXZWIgbW9kdWxlIHRoZW4gdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSB0cnVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlVHlwZSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgYSBwYXJ0aWN1bGFyIFdlYiBzZXJ2aWNlIGtpbmQuICBTdWNoIGFzIGEgSmF2YSBCZWFuIHdlYiBzZXJ2aWNlLCBhIFNrZWxldG9uIFdlYiBzZXJ2aWNlLCBhbiBFSkIgIFdlYiBzZXJ2aWNlLCBldGMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYSB1bmlxdWUgSUQgZm9yIHRoaXMgV2ViIHNlcnZpY2UgdHlwZS4gIEl0IGlzIHJlZmVyZW5jZWQgaW4gdGhlIHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBlbGVtZW50IHdpdGggdGhlIHR5cGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSB0cmFuc2xhdGFibGUgbGFiZWwgZm9yIHRoaXMgd2ViIHNlcnZpY2UgdHlwZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZVR5cGVNZXRhZGF0YSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIGJsYW5rIGRlbGltaXRlZCBsaXN0IGNsYXNzIE5hbWVzLiAoaWUuTm8gcGFja2FnZSBwcmVmaXgpICBUaGUgY2xhc3NlcyBsaXN0ZWQgZGVmaW5lIHRoZSBhbGxvd2FibGUgRWNsaXBzZSByZXNvdXJjZXMgdGhhdCB0aGlzIHdlYiBzZXJ2aWNlIHR5cGUgdW5kZXJzdGFuZHMgYW5kIHR1cm4gaW50byBhIFdlYiBzZXJ2aWNlLiAgRm9yIGV4YW1wbGUsIGlmIGEgdXNlciBzZWxlY3RzIGEgSmF2YSBzb3VyY2UgZmlsZSBpbiB0aGUgcGFja2FnZSBleHBsb3JlciB2aWV3IGFuZCB0aGVuIHN0YXJ0cyB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZCBhIENvbXBpbGF0aW9uVW5pdCBvYmplY3Qgd2lsbCBiZSBwYXNzZWQgaW4gYXMgcGFydCBvZiBhbiBJU3RydWN0dXJlZFNlbGVjdGlvbi4gIEJ5IHB1dHRpbmcgJnF1b3Q7Q29tcGlsYXRpb25Vbml0JnF1b3Q7IGFzIG9uZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGlzIGF0dHJpYnV0ZSBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHR5cGUgY2FuIGNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gdGhlIENvbXBpbGF0aW9uVW5pdC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRlbnNpb25NZXRhZGF0YSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBhbGxvd3MgdGhpcyBXZWIgc2VydmljZSB0eXBlIHRvIHJlc3RyaWN0IG5hbWVzIG9mIHRoZSBpbnB1dCBmaWxlcyB0aGF0IGl0IHVuZGVyc3RhbmRzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB2YWx1ZSBpcyBzZXQgdG8gJnF1b3Q7LmphdmEgLmNsYXNzJnF1b3Q7IGl0IGluZGljYXRlcyB0aGF0IHRoaXMgV2ViIHNlcnZpY2UgdHlwZSBvbmx5IHVuZGVyc3RhbmRzIHJlc291cmNlIG5hbWVzIHRoYXQgZW5kIHdpdGggLmphdmEgb3IgZW5kIHdpdGggLmNsYXNzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im9iamVjdFNlbGVjdGlvbldpZGdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBPbiBwYWdlIDIgb2YgdGhlIFdlYiBzZXJ2aWNlIHdpemFyZCB0aGVyZSBpcyBhbiBPYmplY3Qgc2VsZWN0aW9uIHBhZ2UuICBUaGlzIHNlbGVjdGlvbiBwYWdlIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoaXMgYXR0cmlidXRlLCBzaW5jZSBkaWZmZXJlbnQgV2ViIHNlcnZpY2UgdHlwZXMgbWF5IG5lZWQgZGlmZmVyZW50IG1ldGhvZHMgb2Ygc2VsZWN0aW5nIHRoZW0uICBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHRoZSBpZCBvZiBhIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQgZXh0ZW5zaW9uLiAgVGhlIHByZWRlZmluZWQgaWQgZm9yIGEgSmF2YSBzZWxlY3Rpb24gd2lkZ2V0IGlzIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KYXZhQmVhblNlbGVjdGlvbldpZGdldC4gIFRoZSBwcmVkZWZpbmVkIGlkIGZvciBhIFdTREwgc2VsZWN0aW9uIHdpZGdldCBpcyBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldC4gIFRoZSBwcmVkZWZpbmVkIGlkIGZvciBhbiBFSkIgc2VsZWN0aW9uIHdpZGdldCBpcyBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuRUpCU2VsZWN0aW9uV2lkZ2V0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVOYXR1cmVzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIGEgYmxhbmsgZGVsaW1pdGVkIGxpc3Qgb2YgUHJvamVjdCBOYXR1cmUgSWRzLiAgVGhlIGxpc3RlZCBJRHMgaW5kaWNhdGUgdGhhdCB0aGlzIHR5cGUgb25seSB3b3JrcyB3aXRoIHRoZXNlIHBhcnRpY3VsYXIgcHJvamVjdCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB0aGlzIHR5cGUgb25seSB3b3JrcyB3aXRoIHdlYiBwcm9qZWN0cyBhbiBJRCBvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuV2ViTmF0dXJlIHdvdWxkIGJlIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlTmF0dXJlcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBjb250YWlucyBhIGJsYW5rIGRlbGltaXRlZCBsaXN0IG9mIFByb2plY3QgTmF0dXJlIElkcy4gIFRoZSBsaXN0ZWQgSURzIGluZGljYXRlIHRoYXQgdGhpcyB0eXBlIERPRVMgTk9UIHdvcmsgd2l0aCB0aGVzZSBwYXJ0aWN1bGFyIHByb2plY3QgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgdGhpcyB0eXBlIGRvZXMgbm90IHdvcmsgd2l0aCB3ZWIgcHJvamVjdHMgYW4gSUQgb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLldlYk5hdHVyZSB3b3VsZCBiZSBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc2NoZW1hL3dlYlNlcnZpY2VUZXN0LmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZVRlc3QuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2MmIwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zY2hlbWEvd2ViU2VydmljZVRlc3QuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIgaWQ9IndlYlNlcnZpY2VUZXN0IiBuYW1lPSJXZWIgU2VydmljZSBUZXN0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgZGVmaW5lcyBXZWIgc2VydmljZSB0ZXN0IGZhY2lsaXRpZXMgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBXZWIgc2VydmljZXMgd2l6YXJkcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2ViU2VydmljZVRlc3QiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwb2ludCBhdHRyaWJ1dGUgc3RyaW5nIG11c3QgYmUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VUZXN0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3ZWJTZXJ2aWNlVGVzdCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im1ldGhvZHNuZWVkZWQiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGluZGljYXRlcyBpZiB0aGlzIHRlc3QgZmFjaWxpdHkgbmVlZCB0byBtZXRob2RzIGZyb20gYSBwcm94eSBiZWFuLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIGRpc3BsYXllZCB0byB0aGUgdXNlciBmb3IgdGhpcyB0ZXN0IGZhY2lsaXR5LiAgSXQgbXVzdCBiZSB0cmFuc2xhdGVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImphdmEiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgdGVzdCBmYWNpbGl0eSBpcyBpbnRlbmRlZCBmb3IgY2xpZW50cyB0aGF0IGdlbmVyYXRlIGEgSmF2YSBiZWFuIGFzIG91dHB1dC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2RlZ2VuIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgaWYgdGhpcyB0ZXN0IGZhY2lsaXR5IGdlbmVyYXRlcyBjb2RlIG9yIG5vdCwgc3VjaCBhcyBKU1AgZmlsZXMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY29udGFpbnMgYSBjbGFzcyBuYW1lLiAgVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IG9yZy5lY2xpcHNlLmpzdC53cy5leHQuV2ViU2VydmljZUV4ZWN1dGFibGUuICBUaGlzIGNsYXNzIGFsbG93cyB0aGUgZXh0ZW5kZXIgdG8gcHJvdmlkZSB0aGUgQ29tbWFuZHMgdGhhdCB3aWxsIGV4ZWN1dGUgZm9yIHRoaXMgdGVzdCBmYWNpbGl0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGVzdCBmYWNpbGl0eS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY29uc3VtcHRpb24vdWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjlkY2YzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY29uc3VtcHRpb24vdWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotCi1QTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX0NMSUVOVD1XZWIgU2VydmljZSBDbGllbnQKLSMKLSMgV2ViIHNlcnZpY2VzICJJbnRlcm5ldCIgcHJlZmVyZW5jZXMgZXh0ZW5zaW9uLgotIwotCi0jCi0jIFdlYiBTYW1wbGVzIElEcwotIwotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1BQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWT1HZW5lcmF0ZSBDbGllbnQKLQotIwotIyBEaWFsb2dzCi0jCi1DSEVDS0JPWF9TSE9XX0dFTkVSQVRFX0pBVkFfUFJPWFlfRElBTE9HPVNob3cgR2VuZXJhdGUgSmF2YSBiZWFuIFByb3h5IERpYWxvZwotVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1dTREwyUFJPWFk9U2hvdyB0aGUgZGlhbG9nIGZvciBnZW5lcmF0aW5nIHRoZSBKYXZhIGJlYW4gcHJveHkgYWN0aW9uLgotCi0jCi0jICAgICAgIFdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIENhdGVnb3JpZXMKLSMKLQotIwotIyBQcmVmZXJlbmNlcyBUb29sdGlwcwotIwotCi0jCi0jU2VydmVyIFJ1bnRpbWUgUHJlZmVyZW5jZXMKLSMKLVRPT0xUSVBfU1JQRl9DT01CT19TRVJWRVI9VGhlIHByZWZlcnJlZCBzZXJ2ZXIgdHlwZQotVE9PTFRJUF9TUlBGX0NPTUJPX1JVTlRJTUU9VGhlIHByZWZlcnJlZCBXZWIgc2VydmljZSBydW50aW1lCi1UT09MVElQX1NSUEZfQ09NQk9fSjJFRT1UaGUgcHJlZmVycmVkIEoyRUUgdmVyc2lvbgotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi0KLSMKLSMgR2VuZXJhbCBtZXNzYWdlcy4KLSMKLU1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEPUlXQUIwMjM0RSBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4gRGV0YWlsczogezB9Ci0KLQotCi0KLSMKLSNSdW50aW1lIGxhYmVscwotIwotCi0KLSMKLSMgV2l6YXJkIHBhZ2UgdGFzayBsYWJlbHMgYW5kIGRlc2NyaXB0aW9ucwotIyAodXNlZCBvbmx5IGZvciBwcm9ncmVzcyBpbmRpY2F0aW9uKS4KLSMKLQotIwotIyBDb21tb24gd2l6YXJkIHN0cmluZ3MuCi0jCi1MQUJFTF9GT0xERVJfTkFNRT1Gb2xkZXI6Ci1MQUJFTF9KU1BfRk9MREVSX05BTUU9SlNQIGZvbGRlcjoKLUxBQkVMX1dFQl9QUk9KRUNUX05BTUU9V2ViIHByb2plY3Q6Ci1MQUJFTF9XRUJTRVJWSUNFVFlQRT1XZWIgc2VydmljZSB0eXBlOgotTEFCRUxfSjJFRV9WRVJTSU9OPUoyRUUgdmVyc2lvbjoKLUxBQkVMX05BPU4vQQotCi1CVVRUT05fQlJPV1NFPUJyb3dzZS4uLgotQlVUVE9OX0JST1dTRV9GSUxFUz1Ccm93c2UgZmlsZXMuLi4KLUJVVFRPTl9VU0VfQUJTT0xVVEVfTE9DQVRJT049VXNlIGFic29sdXRlIGxvY2F0aW9uIFVSSSBmb3IgV1NETCBpbnB1dCBzdGF0ZW1lbnRzCi1CVVRUT05fVVNFX0lOTElORV9TQ0hFTUE9VXNlIGlubGluZSBzY2hlbWEKLQotQk9UVE9NVVBfTEFCRUw9Qm90dG9tIHVwCi1UT1BET1dOX0xBQkVMPVRvcCBkb3duCi1DTElFTlRfTEFCRUw9Q2xpZW50Ci0KLQotCi0jCi0jIFdpemFyZHMuCi0jCi1XSVpBUkRfVElUTEVfV1NDPVdlYiBTZXJ2aWNlIENsaWVudAotCi0jCi0jIFdlYlNlcnZpY2VDbGllbnRTZWxlY3Rpb25QYWdlCi0jCi0KLSMKLSMgV2ViU2VydmljZVNlcnZlclNlbGVjdGlvblBhZ2UKLSMKLQotIwotIyBXZWJTZXJ2aWNlUHJvamVjdFBhZ2UKLSMKLVBBR0VfVElUTEVfV1NfUFJPSkVDVD1XZWIgU2VydmljZXMKLVBBR0VfREVTQ19XU19QUk9KRUNUPVJldmlldyB5b3VyIFdlYiBzZXJ2aWNlIG9wdGlvbnMgYW5kIG1ha2UgYW55IG5lY2Vzc2FyeSBjaGFuZ2VzIGJlZm9yZSBwcm9jZWVkaW5nIHRvIHRoZSBuZXh0IHBhZ2UuCi1CVVRUT05fU1RBUlRfV0VCX1BST0pFQ1Q9U3RhcnQgV2ViIHNlcnZpY2UgaW4gV2ViIHByb2plY3QKLUdST1VQX1NDRU5BUklPX1NFUlZJQ0U9U2VydmljZQotR1JPVVBfU0NFTkFSSU9fQ0xJRU5UPUNsaWVudCBwcm94eQotTEFCRUxfV0VCU0VSVklDRUNMSUVOVFRZUEU9Q2xpZW50IHByb3h5IHR5cGU6Ci0KLQotCi0jIEl0ZW1zIGNvbW1vbiB0byBXZWJTZXJ2aWNlUnVudGltZVNlbGVjdGlvblBhZ2UgYW5kIFdlYlNlcnZpY2VDbGllbnRSdW50aW1lU2VsZWN0aW9uUGFnZQotIyBXZWJTZXJ2aWNlUnVudGltZVNlbGVjdGlvblBhZ2UKLVBBR0VfVElUTEVfV1NfUlVOVElNRV9TRUxFQ1RJT049U2VydmljZSBEZXBsb3ltZW50IENvbmZpZ3VyYXRpb24KLVBBR0VfREVTQ19XU19SVU5USU1FX1NFTEVDVElPTj1DaG9vc2UgZnJvbSB0aGUgbGlzdCBvZiBydW50aW1lcyBhbmQgZGVwbG95bWVudCBzZXJ2ZXJzLCBvciB1c2UgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCi1MQUJFTF9SVU5USU1FU19MSVNUPVdlYiBzZXJ2aWNlIHJ1bnRpbWU6Ci1MQUJFTF9TRVJWRVJTX0xJU1Q9U2VydmVyOgotTEFCRUxfRURJVF9CVVRUT049RWRpdC4uLgotTEFCRUxfU0VSVklDRV9FQVJfTU9EVUxFPVNlcnZpY2UgRUFSIG1vZHVsZToKLUxBQkVMX0NMSUVOVF9FQVJfTU9EVUxFPUNsaWVudCBFQVIgbW9kdWxlOgotTEFCRUxfQ0xJRU5UX01PRFVMRT1DbGllbnQgbW9kdWxlOgotTEFCRUxfU0VSVklDRV9NT0RVTEU9U2VydmljZSBtb2R1bGU6Ci1MQUJFTF9DTElFTlRfUFJPSkVDVD1DbGllbnQgcHJvamVjdDoKLUxBQkVMX1NFUlZJQ0VfUFJPSkVDVD1TZXJ2aWNlIHByb2plY3Q6Ci1MQUJFTF9DTElFTlRfRUFSX1BST0pFQ1Q9Q2xpZW50IEVBUiBwcm9qZWN0OgotTEFCRUxfU0VSVklDRV9FQVJfUFJPSkVDVD1TZXJ2aWNlIEVBUiBwcm9qZWN0OgotCi1UT09MVElQX1BXUlNfVEVYVF9SVU5USU1FPVRoZSBydW50aW1lIHRvIGJlIHVzZWQuCi1UT09MVElQX1BXUlNfVEVYVF9TRVJWRVI9VGhlIHNlcnZlciB0byBiZSB1c2VkLgotVE9PTFRJUF9QV1JTX0oyRUVfVkVSU0lPTj1KMkVFIHZlcnNpb24gdG8gYmUgdXNlZC4KLQotTEFCRUxfU0VMRUNUSU9OX1ZJRVdfVElUTEU9U2VydmVyLVNpZGUgRGVwbG95bWVudCBTZWxlY3Rpb246Ci1MQUJFTF9TRUxFQ1RJT05fVklFV19SVU5USU1FPUNob29zZSBXZWIgc2VydmljZSBydW50aW1lIGZpcnN0Ci1MQUJFTF9TRUxFQ1RJT05fVklFV19TRVJWRVI9Q2hvb3NlIHNlcnZlciBmaXJzdAotTEFCRUxfU0VMRUNUSU9OX1ZJRVdfRVhQTE9SRT1FeHBsb3JlIG9wdGlvbnMKLQotTEFCRUxfVFJFRV9FWElTVElOR19TRVJWRVJTPUV4aXN0aW5nIFNlcnZlcnMKLUxBQkVMX1RSRUVfU0VSVkVSX1RZUEVTPVNlcnZlciBUeXBlcwotCi1NU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUz1UaGlzIHNlcnZlciBhbmQgcnVudGltZSBjb21iaW5hdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgQ2hvb3NlIGEgZGlmZmVyZW50IHNlcnZlciBvciBydW50aW1lIHRvIHByb2NlZWQgdGhyb3VnaCB0aGUgV2ViIHNlcnZpY2VzIHdpemFyZC4KLU1TR19OT19SVU5USU1FPU5vIHJ1bnRpbWUgc3BlY2lmaWVkIGZvciB0aGUgezB9IHNjZW5hcmlvLgotTVNHX05PX1NFUlZFUj1ObyBzZXJ2ZXIgc3BlY2lmaWVkIGZvciB0aGUgezB9IHNjZW5hcmlvLgotCi1NU0dfU0VSVkVSX1RBUkdFVF9NSVNNQVRDSD1UaGUgcHJvamVjdCwgezB9LCBoYXMgYSBzZXJ2ZXIgdGFyZ2V0IHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHNlbGVjdGVkIHNlcnZlciB0eXBlCi1NU0dfSjJFRV9NSVNNQVRDSD1UaGUgcHJvamVjdCwgezB9LCBoYXMgYSBkaWZmZXJlbnQgSjJFRSBsZXZlbCBmcm9tIHRoZSBzZWxlY3RlZCBKMkVFIGxldmVsCi1NU0dfU0VSVklDRV9QUk9KRUNUX0VNUFRZPVRoZSBzZXJ2aWNlIHByb2plY3QgY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBzZXJ2aWNlIHByb2plY3QKLU1TR19TRVJWSUNFX0VBUl9FTVBUWT1UaGUgc2VydmljZSBFQVIgY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBzZXJ2aWNlIEVBUi4KLU1TR19DTElFTlRfUFJPSkVDVF9FTVBUWT1UaGUgY2xpZW50IHByb2plY3QgY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBjbGllbnQgcHJvamVjdAotTVNHX0NMSUVOVF9FQVJfRU1QVFk9VGhlIGNsaWVudCBFQVIgY2Fubm90IGJlIGVtcHR5LiBTZWxlY3QgYSBjbGllbnQgRUFSLgotTVNHX0lOVkFMSURfRUpCX1BST0pFQ1Q9ezB9IGlzIG5vdCBhbiBFSkIgcHJvamVjdC4gQ2hvb3NlIGFuIEVKQiBwcm9qZWN0LCBvciBlbnRlciBhIG5ldyBFSkIgcHJvamVjdCBuYW1lLgotTVNHX0lOVkFMSURfV0VCX1BST0pFQ1Q9ezB9IGlzIG5vdCBhIFdlYiBwcm9qZWN0LiBDaG9vc2UgYSBXZWIgcHJvamVjdCwgb3IgZW50ZXIgYSBuZXcgV2ViIHByb2plY3QgbmFtZS4KLQotTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX0VBUlM9WW91ciBzZWxlY3RlZCBzZXJ2aWNlIGFuZCBjbGllbnQgezB9IG1vZHVsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgUHJvY2VlZGluZyB3aXRoIHRoaXMgY29uZmlndXJhdGlvbiBtYXkgcmVzdWx0IGluIHJ1bnRpbWUgZXJyb3JzLgotTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX0NPTVBPTkVOVFM9WW91ciBzZWxlY3RlZCBzZXJ2aWNlIGFuZCBjbGllbnQgezB9IG1vZHVsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lLiAgUHJvY2VlZGluZyB3aXRoIHRoaXMgY29uZmlndXJhdGlvbiB3aWxsIHJlc3VsdCBpbiBydW50aW1lIGVycm9ycy4KLU1TR19TQU1FX0NMSUVOVF9BTkRfU0VSVklDRV9QUk9KRUNUUz1Zb3VyIHNlbGVjdGVkIHNlcnZpY2UgYW5kIGNsaWVudCBwcm9qZWN0cyBhcmUgdGhlIHNhbWUuICBQcm9jZWVkaW5nIHdpdGggdGhpcyBjb25maWd1cmF0aW9uIHdpbGwgcmVzdWx0IGluIGVycm9ycy4KLU1TR19XUk9OR19DTElFTlRfUFJPSkVDVF9UWVBFPVRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCwgezB9LCBpcyBub3QgYSB7MX0gcHJvamVjdC4gUGxlYXNlIHNlbGVjdCBhIHsxfSBwcm9qZWN0IG9yIGVudGVyIGEgbmV3IHByb2plY3QgbmFtZS4KLU1TR19DTElFTlRfU1VCPWNsaWVudAotTVNHX1NFUlZJQ0VfU1VCPXNlcnZpY2UKLU1TR19HRU5FUkFMX1BST0pFQ1RfQU5EX0VBUj1TZWxlY3QgdGhlIHswfSBwcm9qZWN0IGFuZCB0aGUgRUFSIHByb2plY3Qgd2l0aCB3aGljaCB5b3Ugd2FudCBpdCB0byBiZSBhc3NvY2lhdGVkLgotTVNHX0VBUl9QUk9KRUNUX1dJTExfQkVfQ1JFQVRFRD1JZiBhbiBFQVIgb3IgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBjdXJyZW50bHkgdW5hc3NvY2lhdGVkLCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIFxuYXNzb2NpYXRlZCBhcyByZXF1aXJlZCB3aGVuIHlvdSBjbGljayBOZXh0LgotCi1NU0dfRUFSX1dJTExfQkVfQVNTT0NJQVRFRD1UaGUgc2VsZWN0ZWQgezB9IHByb2plY3Qgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIEVBUiBwcm9qZWN0LgotTVNHX1BST0pFQ1RfV0lMTF9CRV9DUkVBVEVEPVRoZSB7MH0gcHJvamVjdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgRUFSIHByb2plY3QuCi1NU0dfRUFSX1dJTExfQkVfQ1JFQVRFRD1UaGUgezB9IEVBUiBwcm9qZWN0IHdpbGwgYmUgY3JlYXRlZCBhbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LgotTVNHX1BST0pFQ1RfQU5EX0VBUl9DUkVBVEVEPVRoZSB7MH0gcHJvamVjdCBhbmQgRUFSIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggb25lIGFub3RoZXIuCi0KLSMgV2ViU2VydmljZUNsaWVudFJ1bnRpbWVTZWxlY3Rpb25QYWdlCi1QQUdFX1RJVExFX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTj1DbGllbnQgRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvbgotUEFHRV9ERVNDX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTj1DaG9vc2UgZnJvbSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgcnVudGltZXMgYW5kIHNlcnZlcnMgZm9yIHRoZSBjbGllbnQgZW52aXJvbm1lbnQsIG9yIHVzZSB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KLQotTEFCRUxfQ0xJRU5UX1NFTEVDVElPTl9WSUVXX1RJVExFPUNsaWVudC1TaWRlIEVudmlyb25tZW50IFNlbGVjdGlvbjoKLUxBQkVMX0NMSUVOVF9UWVBFPUNsaWVudCB0eXBlOgotTEFCRUxfV0VCPVdlYgotTEFCRUxfRUpCPUVKQgotTEFCRUxfTk9fTEFCRUw9Ci0KLQotIwotIyBJdGVtcyBjb21tb24gdG8gV2ViU2VydmljZU1hcHBpbmdzUGFnZSwgV2ViU2VydmljZU1hcHBpbmdzUGFnZSAoY2xpZW50KSwgYW5kIFdlYlNlcnZpY2VTT0FQQmluZGluZ1BhZ2UKLSMKLVBBR0VfTVNHX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1I9QW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhZ2UgdmFsaWRhdGlvbi4gU2VlIGxvZ3MgZm9yIGRldGFpbHMuCi0KLSMKLSMgV2ViU2VydmljZU1hcHBpbmdzUGFnZQotIwotUEFHRV9USVRMRV9XU19YTUwyQkVBTj1XZWIgU2VydmljZSBTa2VsZXRvbiBYTUwgdG8gSmF2YSBNYXBwaW5ncwotUEFHRV9ERVNDX04yUF9NQVBQSU5HUz1EZWZpbmUgY3VzdG9tIG1hcHBpbmcgZm9yIG5hbWVzcGFjZSB0byBwYWNrYWdlLgotTVNHX01BUFBJTkdfRFVQTElDQVRFX0VOVFJJRVM9RHVwbGljYXRlIHswfSBtYXBwZWQgdG8gdGhlIHNhbWUgezF9LgotCi0KLSMKLSMgVGhlIHR3byBJVEVNXyogc3RyaW5ncyBhcmUgZW50cmllcyBpbiBhIGxpc3QgYm94IG9mIG1hcHBpbmdzLgotIyBUaGVyZSBhcmUgdHdvIGZvcm1zLCBvbmUgd2hlbiB0aGUgcGFnZSBpcyBpbiBKYXZhLXRvLVhNTCBtb2RlOgotIyAgIDxqYXZhLWJlYW4tbmFtZT4sIDxlbmNvZGluZy1zdHlsZT4KLSMgYW5kIG9uZSB3aGVuIHRoZSBwYWdlIGlzIGluIFhNTC10by1KYXZhIG1vZGU6Ci0jICAgPHhtbC1uYW1lc3BhY2UtdXJpPjo8eG1sLXNob3J0LW5hbWU+LCA8ZW5jb2Rpbmctc3R5bGU+Ci0jIHdoZXJlOgotIyAgIDxqYXZhLWJlYW4tbmFtZT4gaXMgYSBmdWxseS1xdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lCi0jICAgPHhtbC1uYW1lc3BhY2UtdXJpPiBpcyB0aGUgbmFtZXNwYWNlIG9mIGFuIFhNTCB0eXBlCi0jICAgPHhtbC1zaG9ydC1uYW1lPiBpcyB0aGUgWE1MIHR5cGUgbmFtZSB3aXRoaW4gdGhlIG5hbWVzcGFjZQotIyAgIDxlbmNvZGluZy1zdHlsZT4gaXMgdGhlIGVuY29kaW5nIHN0eWxlIChTT0FQIG9yIExpdGVyYWwgWE1MKQotIwotCi0jCi0jIFdlYlNlcnZpY2VQcm94eVBhZ2UKLSMKLUJVVFRPTl9HRU5FUkFURV9QUk9YWT1HZW5lcmF0ZSBhIHByb3h5Ci0KLSMKLSMgV2ViU2VydmljZVNrZWxldG9uQ29uZmlnUGFnZQotIwotUEFHRV9ERVNDX1dTU0tFTF9DT05GSUc9RGVmaW5lIGEgc2tlbGV0b24gSmF2YSBiZWFuIGFzIGEgV2ViIHNlcnZpY2UuCi1QQUdFX1RJVExFX1dTU0tFTF9DT05GSUc9V2ViIFNlcnZpY2UgU2tlbGV0b24gSmF2YSBCZWFuIENvbmZpZ3VyYXRpb24KLVRPT0xUSVBfUEJTQ19URVhUX1NLRUxFVE9OX0ZPTERFUj1Gb2xkZXIgZm9yIGdlbmVyYXRlZCBKYXZhIHNrZWxldG9uLgotVE9PTFRJUF9QQlNDX0JVVFRPTl9TS0VMRVRPTl9GT0xERVJfQlJPV1NFPUJyb3dzZSBmb2xkZXJzLgotTEFCRUxfU0tFTEVUT05fUk9PVF9OQU1FPVNrZWxldG9uIGZvbGRlcjoKLQotIwotIyBXZWJTZXJ2aWNlQmVhbkNsYXNzUGFnZQotIwotTEFCRUxfQkVBTl9DTEFTU19OQU1FPUJlYW46Ci1QQUdFX01TR19CRUFOX0NBTk5PVF9CRV9FTVBUWT1QbGVhc2Ugc2VsZWN0IGEgSmF2YSBiZWFuIGNsYXNzLgotQlVUVE9OX0JST1dTRV9DTEFTU0VTPUJyb3dzZSBjbGFzc2VzLi4uCi0KLQotIwotIyBXZWJTZXJ2aWNlVGVzdFBhZ2UKLSMKLVBBR0VfVElUTEVfV1NURVNUPVdlYiBTZXJ2aWNlIFRlc3QgUGFnZQotUEFHRV9ERVNDX1dTVEVTVD1TZWxlY3QgYSB0ZXN0IGZhY2lsaXR5Ci1MQUJFTF9URVNUX1RZUEVTPVRlc3QgRmFjaWxpdHkKLUNIRUNLQk9YX1RFU1RfV0VCU0VSVklDRT1UZXN0IHRoZSBXZWIgc2VydmljZQotQ0hFQ0tCT1hfTU9OSVRPUl9XRUJTRVJWSUNFPU1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlCi1NU0dfRVJST1JfVU5BQkxFX1RPX0xBVU5DSF9XU0RMX1RFU1Q9QW4gZXJyb3Igb2NjdXJyZWQuIFVuYWJsZSB0byBsYXVuY2ggV1NETCB0ZXN0IGZhY2lsaXR5LgotCi0jCi0jIFdlYlNlcnZpY2VFeHBsb3JlclBhZ2UKLSMKLUJVVFRPTl9MQVVOQ0hfU0VSVklDRV9URVNUPUxhdW5jaAotCi0jCi0jIFdlYlNlcnZpY2VDbGllbnRUZXN0UGFnZQotIwotUEFHRV9USVRMRV9XU19TQU1QTEU9V2ViIFNlcnZpY2UgQ2xpZW50IFRlc3QKLVBBR0VfREVTQ19XU19TQU1QTEU9RG8geW91IHdhbnQgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5PwotQlVUVE9OX1RFU1Q9VGVzdCB0aGUgZ2VuZXJhdGVkIHByb3h5Ci1MQUJFTF9URVNUX1RZUEVTPVRlc3QgZmFjaWxpdHkKLUJVVFRPTl9SVU5fVEVTVD1SdW4gdGVzdCBvbiBzZXJ2ZXIKLUxBQkVMX01FVEhPRFM9TWV0aG9kcwotTVNHX0VSUk9SX0pUU19KU1BfR0VOPUlXQUIwMzEzRSBFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBzYW1wbGUuCi1MQUJFTF9KU1BfUFJPSkVDVF9OQU1FPUpTUCBwcm9qZWN0OgotTVNHX0VSUk9SX0pUU19QUk9YWV9OT1RfQ09NUElMRUQ9SVdBQjAzNTdFIFRoZSBHZW5lcmF0ZWQgcHJveHkgd2FzIG5vdCBmb3VuZC4gV2ViU2VydmljZSBzYW1wbGUganNwcyBjYW5ub3QgYmUgZ2VuZXJhdGVkLgotTVNHX0VSUk9SX01BTEZPUk1FRF9VUkw9SVdBQjAzNThFIFRlc3QgY2xpZW50IFVSTCBpcyBtYWxmb3JtZWQuCi0KLSMKLSMgV2ViU2VydmljZUlTRFBhZ2UKLSMKLQotIwotIyBXZWJTZXJ2aWNlQmVhbkNvbmZpZ1BhZ2UKLSMKLQotIwotIyBXZWJTZXJ2aWNlQmVhbk1ldGhvZHNQYWdlCi0jCi1CVVRUT05fU0VMRUNUX0FMTD1TZWxlY3QgQWxsCi1CVVRUT05fREVTRUxFQ1RfQUxMPURlc2VsZWN0IEFsbAotVE9PTFRJUF9QQk1FX0JVVFRPTl9TRUxFQ1RfQUxMPVNlbGVjdCBhbGwgbWV0aG9kcwotVE9PTFRJUF9QQk1FX0JVVFRPTl9ERVNFTEVDVF9BTEw9RGVzZWxlY3QgYWxsIG1ldGhvZHMKLQotIwotIyBXZWJTZXJ2aWNlRUpCQ29uZmlnUGFnZQotIwotCi0jCi0jIFdlYlNlcnZpY2VXU0RMU2VsZWN0aW9uUGFnZQotIwotUEFHRV9USVRMRV9XU0RMX1NFTEVDVElPTj1XZWIgU2VydmljZSBXU0RMIEZpbGUgU2VsZWN0aW9uCi1QQUdFX0RFU0NfV1NETF9TRUxFQ1RJT049U2VsZWN0IGEgV1NETCBmaWxlLgotCi0KLSMKLSMgV2ViU2VydmljZVB1Ymxpc2hQYWdlCi0jCi1QQUdFX1RJVExFX1dTX1BVQkxJU0g9V2ViIFNlcnZpY2UgUHVibGljYXRpb24KLVBBR0VfREVTQ19XU19QVUJMSVNIPURvIHlvdSB3YW50IHRvIHB1Ymxpc2ggeW91ciBXZWIgc2VydmljZT8KLVBBR0VfVElUTEVfV1NfRklORD1GaW5kIGEgV2ViIHNlcnZpY2UKLVBBR0VfREVTQ19XU19GSU5EPURvIHlvdSB3YW50IHRvIGZpbmQgYSBXZWIgc2VydmljZT8KLUJVVFRPTl9XU19QVUJMSVNIPUxhdW5jaCB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIHRvIHB1Ymxpc2ggdGhpcyBXZWIgc2VydmljZSB0byBhIFVEREkgUmVnaXN0cnkKLUJVVFRPTl9XU19QVUJMSVNIX1BSSVZBVEVfVUREST1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBwdWJsaXNoIHRoaXMgV2ViIHNlcnZpY2UgdG8gdGhlIFVuaXQgVGVzdCBVRERJIFJlZ2lzdHJ5Ci1CVVRUT05fV1NfRklORD1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBmaW5kIGEgV2ViIHNlcnZpY2UgZnJvbSBhIFVEREkgUmVnaXN0cnkKLUJVVFRPTl9XU19GSU5EX1BSSVZBVEVfVUREST1MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciB0byBmaW5kIGEgV2ViIHNlcnZpY2UgZnJvbSB0aGUgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLUxBQkVMX1BVQkxJQ19VRERJX1JFR0lTVFJJRVM9UHVibGljIFVEREkgUmVnaXN0cnkKLQotIwotIyBFSkIgVUkgc3RyaW5ncwotIwotTEFCRUxfRUpCX0JFQU5fTkFNRT1FSkIgYmVhbgotVEFCTEVfVElUTEVfRUpCX0JFQU5fTkFNRVM9U3RhdGVsZXNzIEVKQiBiZWFucwotVEFCTEVfVElUTEVfRUpCX1BST0pFQ1RfTkFNRT1FSkIgcHJvamVjdAotTEFCRUxfRUFSX1BST0pFQ1RTPUVBUiBwcm9qZWN0cwotVE9PTFRJUF9FQVJfUFJPSkVDVFM9RW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0cy4KLVRPT0xUSVBfVEFCTEVfQkVBTl9OQU1FUz1TZWxlY3QgYW4gRUpCLgotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlV1NETFNlbGVjdGlvblBhZ2UKLSMKLVRPT0xUSVBfUFdXU19QQUdFPQotCi0jCi0jIFRvb2x0aXBzIGZvciBiZWFucy5XZWJTZXJ2aWNlQmVhbkNsYXNzUGFnZQotIwotVE9PTFRJUF9QQkNMX1BBR0U9Ci1UT09MVElQX1BCQ0xfVEVYVF9CRUFOX0NMQVNTPVNlbGVjdGVkIEphdmEgYmVhbi4KLVRPT0xUSVBfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0U9QnJvd3NlIGNsYXNzZXMuCi1UT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fUkVTT1VSQ0VfQlJPV1NFPUJyb3dzZSBKYXZhIGZpbGVzLgotCi0KLSMKLSMgVG9vbHRpcHMgZm9yIGJlYW5zLldlYlNlcnZpY2VUZXN0UGFnZQotIwotVE9PTFRJUF9QU1RQX0NPTUJPQk9YX1RFU1Q9VGVzdCBmYWNpbGl0aWVzIGF2YWlsYWJsZSB0byB0ZXN0IHRoZSBzZXJ2aWNlLgotVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT049TGF1bmNoIHRoZSBzZWxlY3RlZCB0ZXN0IGZhY2lsaXR5LgotCi0KLQotCi0jCi0jIFRvb2x0aXBzIGZvciBXZWJTZXJ2aWNlUnVudGltZVNlbGVjdGlvblBhZ2UKLSMKLVRPT0xUSVBfUFdSU19QQUdFPQotVE9PTFRJUF9QV1JTX0xJU1RfUlVOVElNRVM9U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBkZXBsb3ltZW50IHJ1bnRpbWUocykuCi1UT09MVElQX1BXUlNfTElTVF9TRVJWRVJTPVNlbGVjdCBmcm9tIGFwcGxpY2F0aW9uIHNlcnZlcihzKS4KLVRPT0xUSVBfUFdSU19SQURJT19TRVJWRVI9U2VydmVyIG9yaWVudGVkIHNlbGVjdGlvbi4KLVRPT0xUSVBfUFdSU19SQURJT19SVU5USU1FPVJ1bnRpbWUgb3JpZW50ZWQgc2VsZWN0aW9uLgotVE9PTFRJUF9QV1JTX1JBRElPX0VYUExPUkU9RXhwbG9yZSBjb21iaW5hdGlvbnMuCi1UT09MVElQX1BXUlNfQ09NQk9fUFJPSkVDVD1XZWIgcHJvamVjdC4KLQotIwotIyBUb29sdGlwcyBmb3IgV2ViU2VydmljZUNsaWVudFJ1bnRpbWVTZWxlY3Rpb25QYWdlCi0jCi1UT09MVElQX1BXQ1JfQ09NQk9fQ0xJRU5UX1RZUEU9Q2xpZW50IHR5cGUuCi0KLQotIwotIyBUb29sdGlwcyBmb3IgV2ViU2VydmljZVByb2plY3RQYWdlCi0jCi1UT09MVElQX1BXUFJfQ09NQk9fVFlQRT1XZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0eXBlLgotVE9PTFRJUF9QV1BSX0dST1VQX1NDRU5BUklPX1NFUlZJQ0U9U2VydmljZSBkZWZhdWx0cyBmb3IgdGhpcyB3aXphcmQgc2NlbmFyaW8uCi1UT09MVElQX1BXUFJfQ0hFQ0tCT1hfR0VORVJBVEVfUFJPWFk9RW5hYmxlL2Rpc2FibGUgcHJveHkgZ2VuZXJhdGlvbiBmb3IgdGhpcyBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DSEVDS0JPWF9TVEFSVF9XRUJfUFJPSkVDVD1TdGFydCBXZWIgc2VydmljZSBpbiBXZWIgcHJvamVjdCBmb3IgdGhpcyBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DSEVDS0JPWF9MQVVOQ0hfV1M9TGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIgdG8gcHVibGlzaCB0aGUgV2ViIHNlcnZpY2UgaW4gdGhpcyBzY2VuYXJpbyB0byBhIFVEREkgUmVnaXN0cnkuCi1UT09MVElQX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFPVNlbGVjdCB0aGlzIHRvIGV4cGxvcmUgdGhlIFdlYiBzZXJ2aWNlIGNyZWF0ZWQuCi1UT09MVElQX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFPVNlbGVjdCB0aGlzIHRvIG1vbml0b3IgdGhlIFNPQVAgdHJhZmZpY3Mgb2YgdGhpcyBXZWIgc2VydmljZS4KLVRPT0xUSVBfUFdQUl9HUk9VUF9TQ0VOQVJJT19DTElFTlQ9Q2xpZW50IHByb3h5IGRlZmF1bHRzIGZvciB0aGlzIHdpemFyZCBzY2VuYXJpby4KLVRPT0xUSVBfUFdQUl9DT01CT19DTElFTlRUWVBFPUNsaWVudCBwcm94eSBzZWxlY3Rpb24gdHlwZS4KLQotIwotIyBUb29sdGlwcyBmb3IgV2ViU2VydmljZVB1Ymxpc2hQYWdlCi0jCi1UT09MVElQX1BXUEJfUEFHRT0KLVRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0g9UHVibGlzaCB0aGUgV2ViIHNlcnZpY2UuCi0KLQotIwotIyBXU0lMIHByb3h5Ci0jCi0KLVBBR0VfV1NJTF9JTVBPUlQ9V1NJTCBJbXBvcnQgUGFnZQotVElUTEVfV1NJTF9JTVBPUlQ9V1NJTCBJbXBvcnQKLURFU0NfV1NJTF9JTVBPUlQ9SW1wb3J0IFdTREwgcmVmZXJlbmNlcyB0byBhIFdTSUwgZG9jdW1lbnQKLVBBR0VfVElUTEVfV1NfU0VMRUNUSU9OPVdlYiBTZXJ2aWNlIFNlbGVjdGlvbiBQYWdlCi1QQUdFX0RFU0NfV1NfU0VMRUNUSU9OPUVudGVyIGEgd2ViIHNlcnZpY2UgVVJJLgotCi1QQUdFX01TR19MT0FESU5HX1dFQl9TRVJWSUNFX1VSST1Mb2FkaW5nIFdlYiBzZXJ2aWNlIFVSSS4uLgotUEFHRV9NU0dfSU5WQUxJRF9XRUJfU0VSVklDRV9VUkk9SW52YWxpZCBXZWIgc2VydmljZSBVUkkuICBFbnRlciBhbiBVUkkgdG8gYSBXU0RMLCBXU0lMIG9yIEhUTUwgZG9jdW1lbnQuCi1QQUdFX01TR19OT19TVUNIX0ZJTEU9RmlsZSAiezB9IiBkb2VzIG5vdCBleGlzdHMuCi1QQUdFX01TR19TRUxFQ1RJT05fTVVTVF9CRV9XU0RMPVNlbGVjdGlvbiBtdXN0IGJlIFdTREwuCi1QQUdFX01TR19JTlZBTElEX1dTSUxfRklMRV9OQU1FPUludmFsaWQgV1NJTCBmaWxlIG5hbWUuICBXU0lMIGZpbGUgbmFtZSBtdXN0IGVuZCB3aXRoIC53c2lsCi0KLQotCi1NU0dfRVJST1JfVVJJX05PVF9SRVNPTFZBQkxFPUlXQUIwNDY5RSAiezB9IiBpcyBub3QgcmVzb2x2YWJsZS4KLU1TR19FUlJPUl9XU0RMX0hBU19OT19TRVJWSUNFX0VMRU1FTlQ9SVdBQjA1NTFFIFdTREwgZmlsZSBhdCB7MH0gaGFzIG5vIHNlcnZpY2UgZWxlbWVudC4KLQotTEFCRUxfV1NJTF9VUkk9V1NJTCBVUkk6Ci1MQUJFTF9CUk9XU0U9QnJvd3NlCi1MQUJFTF9XU0RMPVdTREw6Ci1MQUJFTF9XU0RMX1VSST1XU0RMIFVSSQotTEFCRUxfSU1QT1JUPUltcG9ydC4uLgotTEFCRUxfQUREPUFkZAotTEFCRUxfUkVNT1ZFPVJlbW92ZQotTEFCRUxfV1NfU0VMRUNUSU9OPUVudGVyIGFuIFVSSSB0byBhIFdTREwsIFdTSUwgb3IgSFRNTCBkb2N1bWVudDoKLUxBQkVMX1NFTEVDVF9XU0RMPVNlbGVjdCBhIFdTREwKLQotCi1UT09MVElQX1dTSUxfSU1QT1JUX1BBR0U9VGhpcyBwYWdlIGFsbG93cyB5b3UgdG8gYWRkIFdTREwgcmVmZXJlbmNlcyB0byBhIFdTSUwgZG9jdW1lbnQuCi1UT09MVElQX1dTSUxfVEVYVF9XU0lMPUVudGVyIHRoZSBsb2NhdGlvbiBvZiBhIG5ldyBvciBleGlzdGluZyBXU0lMIGRvY3VtZW50LgotVE9PTFRJUF9XU0lMX0JVVFRPTl9CUk9XU0VfV1NJTD1Ccm93c2UgZm9yIGEgV1NJTCBkb2N1bWVudC4KLVRPT0xUSVBfV1NJTF9UQUJMRV9XU0RMPUVudGVyIHRoZSBVUklzIG9mIHRoZSBXU0RMcyB0aGF0IGFyZSBnb2luZyB0byBiZSBhZGRlZCBhcyBzZXJ2aWNlIHJlZmVyZW5jZXMuCi1UT09MVElQX1BDT05fUEFHRT1TZWxlY3QgYSB3ZWIgc2VydmljZSBmb3IgY29uc3VtcHRpb24uCi1UT09MVElQX1BDT05fVEVYVF9XUz1FbnRlciBhbiBVUkkgdG8gYSBXU0RMLCBXU0lMIG9yIEhUTUwgZG9jdW1lbnQuCi1UT09MVElQX1BDT05fQlVUVE9OX0JST1dTRV9XUz1Ccm93c2UgZm9yIGEgd2ViIHNlcnZpY2UgcmVzb3VyY2UuCi0KLSMKLSMgVG9vbHRpcHMgZm9yIGNsaWVudC5XZWJTZXJ2aWNlQ2xpZW5UZXN0UGFnZQotIwotVE9PTFRJUF9QV1NNX1BBR0U9Ci1UT09MVElQX1BXU01fQ0hFQ0tCT1hfVEVTVD1FbmFibGUvZGlzYWJsZSBUZXN0LgotVE9PTFRJUF9QV1NNX0NPTUJPQk9YX1RFU1Q9U2VsZWN0IHRoZSB0ZXN0IHR5cGUuCi1UT09MVElQX1BXU01fQ0hFQ0tCT1hfTEFVTkNIPVJ1biB0ZXN0IG9uIGEgc2VydmVyLgotVE9PTFRJUF9QV1NNX1RFWFRfSlNQX0ZPTERFUj1EZXN0aW5hdGlvbiBmb2xkZXIgb2YgZ2VuZXJhdGVkIHNhbXBsZSBmaWxlcy4KLVRPT0xUSVBfUFdTTV9CVVRUT05fSlNQX0ZPTERFUl9CUk9XU0U9QnJvd3NlIGZvbGRlcnMuCi1UT09MVElQX1BXU01fQlVUVE9OX1NFTEVDVF9BTEw9U2VsZWN0IGFsbCBtZXRob2RzLgotVE9PTFRJUF9QV1NNX0JVVFRPTl9ERVNFTEVDVF9BTEw9RGVzZWxlY3QgYWxsIG1ldGhvZHMuCi1UT09MVElQX1BXU01fQ09NQk9fUFJPSkVDVD1XZWIgcHJvamVjdCBmb3IgZ2VuZXJhdGVkIHNhbXBsZS4KLVRPT0xUSVBfUFdTTV9URVhUX1NBTVBMRV9GT0xERVI9RGVzdGluYXRpb24gZm9sZGVyIG9mIGdlbmVyYXRlZCBzYW1wbGUgZmlsZXMuCi1UT09MVElQX1BXU01fVFJFRV9NRVRIT0RTPU1ldGhvZHMgdG8gZ2VuZXJhdGUgaW50byB0aGUgc2FtcGxlLgotVE9PTFRJUF9QV1NNX0VBUl9QUk9KRUNUPUVBUiBwcm9qZWN0IGZvciB0aGUgZ2VuZXJhdGVkIHNhbXBsZS4KLQotIwotIyBIVFRQIEJhc2ljIEF1dGgKLSMKLURJQUxPR19USVRMRV9IVFRQX0JBU0lDX0FVVEg9SFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbgotTEFCRUxfVVJMPVVSTDoKLUxBQkVMX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRT1Vc2VyIG5hbWU6Ci1MQUJFTF9IVFRQX0JBU0lDX0FVVEhfUEFTU1dPUkQ9UGFzc3dvcmQ6Ci0KLVRPT0xUSVBfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FPUVudGVyIHlvdXIgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiB1c2VyIG5hbWUuCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRD1FbnRlciB5b3VyIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gcGFzc3dvcmQuCi0KLSMKLSMgV2ViIFNlcnZpY2UgU2VydmVyIFJ1bnRpbWUgVHlwZQotIwotCi0KLSMKLSMgQ2xpZW50IHByb2plY3QgdHlwZQotIwotCi0jCi0jIEdlbmVyYXRlIEhhbmRsZXIgU2tlbGV0b24KLSMKLVRBU0tfTEFCRUxfR0VOX0hBTkRMRVJfU0tFTEVUT049R2VuZXJhdGUgaGFuZGxlciBza2VsZXRvbiBjb21tYW5kCi1UQVNLX0RFU0NfR0VOX0hBTkRMRVJfU0tFTEVUT049R2VuZXJhdGUgaGFuZGxlciBza2VsZXRvbiBjb21tYW5kCi1NU0dfRVJST1JfR0VORVJBVEVfSEFORExFUl9TS0VMRVRPTj1JV0FCMDM1OUUgRXJyb3IgaW4gZ2VuZXJhdGluZyBoYW5kbGVyIHNrZWxldG9uLgotTVNHX0VSUk9SX1dSSVRFX0ZJTEU9SVdBQjAzNjBFIEVycm9yIGluIHdyaXRpbmcgZmlsZSB7MH0uCi0KLSMKLSMgSGFuZGxlcnMgQ29uZmlndXJhdGlvbiB3aXphcmQgcGFnZQotIwotTEFCRUxfSEFORExFUlNfQ09ORklHPUhhbmRsZXIgQ29uZmlndXJhdGlvbgotTEFCRUxfQlVUVE9OX0FERD1BZGQKLUxBQkVMX0JVVFRPTl9SRU1PVkU9UmVtb3ZlCi1MQUJFTF9CVVRUT05fTU9WRV9VUD1Nb3ZlIFVwCi1MQUJFTF9CVVRUT05fTU9WRV9ET1dOPU1vdmUgRG93bgotTEFCRUxfQlVUVE9OX0dFTl9TS0VMRVRPTj1HZW5lcmF0ZSBza2VsZXRvbiBjbGFzc2VzIGZvciBuZXcgaGFuZGxlcnMKLUxBQkVMX0NPTUJPX1NPVVJDRV9MT0M9T3V0cHV0IGZvbGRlcjoKLUxBQkVMX0NPTUJPX1dTX0NMSUVOVF9SRUY9Q2xpZW50IFNlcnZpY2UgUmVmZXJlbmNlOgotTEFCRUxfQ09NQk9fV1NfU0VSVklDRV9ERVNDPVNlcnZpY2UgRGVzY3JpcHRpb246Ci0KLUxBQkVMX0hBTkRMRVJfTkFNRT1OYW1lCi1MQUJMRV9IQU5ETEVSX0NMQVNTPUNsYXNzIE5hbWUKLUxBQkVMX0hBTkRMRVJfUE9SVD1Qb3J0IE5hbWUKLQotRElBTE9HX1RJVExFX1dTX0FERF9IQU5ETEVSPUFkZCBOZXcgSGFuZGxlcgotTEFCRUxfVEVYVF9IQU5ETEVSX05BTUU9TmFtZToKLUxBQkVMX1RFWFRfSEFORExFUl9DTEFTUz1DbGFzcyBuYW1lOgotTEFCRUxfVEVYVF9IQU5ETEVSX1BPUlQ9UG9ydCBuYW1lOgotCi1QQUdFX1RJVExFX1NFUlZJQ0VfSERMUl9DT05GSUc9U2VydmljZSBIYW5kbGVycyBDb25maWd1cmF0aW9uCi1QQUdFX0RFU0NfU0VSVklDRV9IRExSX0NPTkZJRz1Db25maWd1cmUgc2VydmljZS1zaWRlIGhhbmRsZXJzCi1QQUdFX1RJVExFX0NMSUVOVF9IRExSX0NPTkZJRz1DbGllbnQgSGFuZGxlcnMgQ29uZmlndXJhdGlvbgotUEFHRV9ERVNDX0NMSUVOVF9IRExSX0NPTkZJRz1Db25maWd1cmUgY2xpZW50LXNpZGUgaGFuZGxlcnMKLQotVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTPUNvbmZpZ3VyZSBXZWIgU2VydmljZSBIYW5kbGVycwotVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OPVNlbGVjdCB0byBnZW5lcmF0ZSBza2VsZXRvbiBjbGFzc2VzIGZvciBuZXcgaGFuZGxlcnMuCi1UT09MVElQX0NPTUJPX1NPVVJDRV9MT0M9U2VsZWN0IHRoZSBvdXRwdXQgbG9jYXRpb24gZm9yIGZpbGUgZ2VuZXJhdGlvbi4KLVRPT0xUSVBfVEVYVF9IQU5ETEVSX05BTUU9SGFuZGxlciBuYW1lCi1UT09MVElQX1RFWFRfSEFORExFUl9DTEFTUz1IYW5kbGVyIGNsYXNzIG5hbWUKLVRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQ9SGFuZGxlciBwb3J0IGNvbXBvbmVudCBuYW1lCi1UT09MVElQX1dTX0NMSUVOVF9SRUY9U2VsZWN0IGEgY2xpZW50IHNlcnZpY2UtcmVmZXJlbmNlIHRvIHNob3cgaXRzIGhhbmRsZXJzLgotVE9PTFRJUF9XU19TRVJWSUNFX0RFU0M9U2VsZWN0IGEgc2VydmljZSBkZXNjcmlwdGlvbiB0byBzaG93IGl0cyBoYW5kbGVycy4KLQotIwotIyBPcGVuSmF2YUVkaXRvckNvbW1hbmQKLSMKLU1TR19FUlJPUl9VTkFCTEVfVE9fT1BFTl9KQVZBX0VESVRPUj1JV0FCMDAyOUUgVW5hYmxlIHRvIG9wZW4gY2xhc3MgezB9IGZyb20gcHJvamVjdCB7MX0gaW4gdGhlIEphdmEgZWRpdG9yLgotCi0jCi0jIENoZWNrSWZTZXJ2aWNlUHJvamVjdAotIyAKLU1TR19XQVJOX0lTX1NFUlZJQ0VfUFJPSkVDVD1UaGUgc2VsZWN0ZWQgY2xpZW50IHByb2plY3QsIHswfSwgY29udGFpbnMgdGhlIFdlYiBzZXJ2aWNlLiBQcm9jZWVkaW5nIHdpdGggdGhpcyBjb25maWd1cmF0aW9uIG1heSByZXN1bHQgaW4gcnVudGltZSBlcnJvcnMgd2hlbiBpbnZva2luZyB0aGUgV2ViIHNlcnZpY2UuIFdvdWxkIHlvdSBsaWtlIHRvIHByb2NlZWQ/Ci1NU0dfVVNFUl9BQk9SVEVEPVVzZXIgcHJlc3NlZCBjYW5jZWwgaW4gd2FybmluZyBkaWFsb2cgd2hpY2ggd2FybmVkIGFib3V0IHRoZSBzZWxlY3RlZCBjbGllbnQgcHJvamVjdCBiZWluZyB0aGUgc2VydmljZSBwcm9qZWN0LgotCi0KLSMKLSMgTWlzc2luZyB0aGlyZCBwYXJ0eSBmaWxlIGVycm9yIG1lc3NhZ2UKLSMKLU1TR19NSVNTSU5HX1RISVJEX1BBUlRZX0ZJTEVTPU1pc3NpbmcgdGhpcmQgcGFydHkgZmlsZXMuICBSZWZlciB0byBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL3dzL2Rvd25sb2FkX2luc3RydWN0aW9uc19mb3JfamFycy5odG1sCi0KLSMKLSMgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQKLSMKLU1TR19XQVJOSU5HX05PX1NFUlZJQ0VfRUxFTUVOVD1UaGUgV1NETCBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYSBTZXJ2aWNlIGVsZW1lbnQuICBUaGVyZWZvcmUgYSBzZXJ2aWNlIGludGVyZmFjZSBhbmQgSmF2YSBwcm94eSB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQgYW5kIGFzIGEgcmVzdWx0LCBhIEphdmEgdGVzdCBjbGllbnQgd2lsbCBub3QgYmUgbGF1bmNoZWQuICBDbGljayBPSyB0byBwcm9jZWVkLCBvciBjbGljayBDYW5jZWwgdG8gc2VsZWN0IGFub3RoZXIgV1NETCBmaWxlLiAgQWx0ZXJuYXRlbHksIGV4aXQgdGhlIHdpemFyZCBhbmQgdXNlIHRoZSBXU0RMIGVkaXRvciB0byBjcmVhdGUgYSBTZXJ2aWNlIFdTREwgZG9jdW1lbnQuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2FjdGlvbi9MYXVuY2hXU0VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvYWN0aW9uL0xhdW5jaFdTRUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzJmOTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvYWN0aW9uL0xhdW5jaFdTRUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsdWdpbi5FeHBsb3JlclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgTGF1bmNoV1NFQWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi17Ci0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIEVjbGlwc2VTdGF0dXNIYW5kbGVyICAgICAgICAgICAgIGhhbmRsZXIgICAgID0gbmV3IEVjbGlwc2VTdGF0dXNIYW5kbGVyKCk7Ci0gICAgRWNsaXBzZVByb2dyZXNzTW9uaXRvciAgICAgICAgICAgbW9uaXRvciAgICAgPSBuZXcgRWNsaXBzZVByb2dyZXNzTW9uaXRvcigpOwotICAgIFRyYW5zaWVudFJlc291cmNlQ29udGV4dCAgICAgICAgIGNvbnRleHQgICAgID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgIEVjbGlwc2VFbnZpcm9ubWVudCAgICAgICAgICAgICAgIGVudmlyb25tZW50ID0gbmV3IEVjbGlwc2VFbnZpcm9ubWVudCggbnVsbCwgY29udGV4dCwgbW9uaXRvciwgaGFuZGxlciApOyAKLSAgICBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kICAgICAgICBjbWQgICAgICAgICA9IG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCk7Ci0gICAgCi0gICAgU3RyaW5nIHN0YXRlTG9jYXRpb24gPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblN0YXRlTG9jYXRpb24oKTsKLQlTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uID0gRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24oKTsKLQlMYXVuY2hPcHRpb25bXSBsYXVuY2hPcHRpb25zID0gbmV3IExhdW5jaE9wdGlvbltdIHsKLQkJbmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlNUQVRFX0xPQ0FUSU9OLHN0YXRlTG9jYXRpb24pLAotCQluZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuREVGQVVMVF9GQVZPUklURVNfTE9DQVRJT04sZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKQotCX07Ci0gICAgY21kLnNldExhdW5jaE9wdGlvbnMobGF1bmNoT3B0aW9ucyk7Ci0JY21kLmV4ZWN1dGUoIGVudmlyb25tZW50ICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeyAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7ICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7ICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9DaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmY1OGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9DaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5WYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLS8qKgotICogVGhpcyBjb21tYW5kIGNoZWNrcyB0byBzZWUgaWYgdGhlIHNlbGVjdGVkIGNsaWVudCBwcm9qZWN0IGlzIHRoZQotICogc2VydmljZSBwcm9qZWN0LiBJZiBzbywgdGhlIHVzZXIgaXMgd2FybmVkLgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlczsKLSAgU3RyaW5nIHdzZGxVUkk7Ci0gIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICAgIAotICBwdWJsaWMgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQoKQotICB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lMkNsaWVudFR5cGVzKCBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBydW50aW1lMkNsaWVudFR5cGVzICkKLSAgewotICAgIHRoaXMucnVudGltZTJDbGllbnRUeXBlcyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VzUGFyc2VyID0gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgCi0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNleGVjdXRlKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBpZiAocnVudGltZTJDbGllbnRUeXBlcz09bnVsbCB8fCB3c2RsVVJJPT1udWxsIHx8IHdzZGxVUkkubGVuZ3RoKCk9PTAgfHwgd2ViU2VydmljZXNQYXJzZXI9PW51bGwpCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIAotICAgIFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSA9IHJ1bnRpbWUyQ2xpZW50VHlwZXMuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChjbGllbnRQcm9qZWN0TmFtZT09bnVsbCB8fCBjbGllbnRQcm9qZWN0TmFtZS5sZW5ndGgoKT09MCkKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gICAgSVByb2plY3QgY2xpZW50UHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChjbGllbnRQcm9qZWN0TmFtZSk7Ci0gICAgVmFsaWRhdGlvblV0aWxzIHZ1ID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgIENhbGVuZGFyIGNhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgIGJvb2xlYW4gaXNTZXJ2aWNlUHJvamVjdCA9IHZ1LmlzUHJvamVjdFNlcnZpY2VQcm9qZWN0KGNsaWVudFByb2plY3QsIHdzZGxVUkksIHdlYlNlcnZpY2VzUGFyc2VyKTsKLSAgICBpZiAoaXNTZXJ2aWNlUHJvamVjdCkKLSAgICB7Ci0gICAgICBTdGF0dXMgd1N0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19XQVJOX0lTX1NFUlZJQ0VfUFJPSkVDVCIsIG5ldyBTdHJpbmdbXXtjbGllbnRQcm9qZWN0TmFtZX0pLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydCh3U3RhdHVzKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTdGF0dXNFeGNlcHRpb24gc2UpCi0gICAgICB7Ci0gICAgICAgIC8vVXNlciBkZWNpZGVkIHRvIGFib3J0LiBSZXR1cm4gYW4gZXJyb3Igc3RhdHVzCi0gICAgICAgIFN0YXR1cyBlU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1VTRVJfQUJPUlRFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICByZXR1cm4gZVN0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0dlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL0dlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjI2MjI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9HZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0KLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiVEFTS19MQUJFTF9HRU5fSEFORExFUl9TS0VMRVRPTiI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19HRU5fSEFORExFUl9TS0VMRVRPTiI7Ci0gIAotICBwcml2YXRlIElQYXRoIG91dHB1dExvY2F0aW9uXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBoYW5kbGVyTmFtZXNfOwotICBwcml2YXRlIGJvb2xlYW4gZ2VuU2tlbGV0b25fOwotICBwcml2YXRlIFN0cmluZyBoYW5kbGVyTmFtZUZvckVkaXRfID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQoKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIAltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAJc2V0TmFtZSAobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgCXNldERlc2NyaXB0aW9uKCBtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOyAgICAKLSAgfQotICAKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUgKEVudmlyb25tZW50IGVudikKLSAgewotICAJCi0gIAlpZiAoIWdlblNrZWxldG9uXykKLSAgCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7IAotICAJCi0gIAlpbnQgaTsKLSAgCWJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgCWJvb2xlYW4gd2FybmluZyA9IGZhbHNlOwotICAJCi0gIAlTaW1wbGVTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgCVN0YXR1cyB3cml0ZVN0YXR1czsJCi0gIAkKLSAgCQotICAgIGZvciAoaT0wOyBpPGhhbmRsZXJOYW1lc18ubGVuZ3RoOyBpKyspIHsKLSAgICAJd3JpdGVTdGF0dXMgPSB3cml0ZUZpbGUoZW52LCBoYW5kbGVyTmFtZXNfW2ldLCBvdXRwdXRMb2NhdGlvbl8pOwotICAgIAkvLyBoYW5kbGUgc3RhdHVzIHJldHVybgotICAgIAlpZiAod3JpdGVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHsgIC8vIHdyaXRlIHN0YXR1cyBpcyBPSyBvciBFUlJPUgotICAgIAkJZXJyb3IgPSB0cnVlOwotICAgIAkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0gICAgCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImV4ZWN1dGUiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0dFTkVSQVRFX0hBTkRMRVJfU0tFTEVUT04iKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAJCX0KLSAgICAJCXN0YXR1cy5hZGRDaGlsZCh3cml0ZVN0YXR1cyk7Ci0gICAgCX0gCi0gICAgfQotICAgIGlmIChlcnJvcikgewotICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICB9IGVsc2UgewotICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIH0KLSAgCXJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgd3JpdGVGaWxlIChFbnZpcm9ubWVudCBlbnYsIFN0cmluZyBjbGFzc05hbWUsIElQYXRoIG91dHB1dExvY2F0aW9uKSAKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAJaW50IGluZGV4OwotICAJCi0gIAlTdHJpbmcgc2ltcGxlQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAJU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKLSAgCUlQYXRoIGZpbGVQYXRoID0gb3V0cHV0TG9jYXRpb247Ci0gIAlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLSAgCQlpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAJCWlmIChpbmRleCAhPSAtMSkgewotICAJCQlzaW1wbGVDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gIAkJCXBhY2thZ2VOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gIAkJCQotICAJCSAgCVN0cmluZyBwYWNrYWdlU2VnbWVudCA9IHBhY2thZ2VOYW1lOwotICAJCSAgCWludCBqID0gMDsKLSAgCQkgIAlqID0gcGFja2FnZVNlZ21lbnQuaW5kZXhPZignLicpOwotICAJCSAgCXdoaWxlIChqICE9IC0xKSB7Ci0gIAkJICAJCWZpbGVQYXRoID0gZmlsZVBhdGguYXBwZW5kKHBhY2thZ2VTZWdtZW50LnN1YnN0cmluZygwLCBqKSk7Ci0gIAkJICAJCXBhY2thZ2VTZWdtZW50ID0gcGFja2FnZVNlZ21lbnQuc3Vic3RyaW5nKGogKyAxKTsKLSAgCQkgIAkJaiA9IHBhY2thZ2VTZWdtZW50LmluZGV4T2YoJy4nKTsKLSAgCQkgIAl9Ci0gIAkJICAgIGZpbGVQYXRoID0gZmlsZVBhdGguYXBwZW5kKHBhY2thZ2VTZWdtZW50KTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJICBwYWNrYWdlTmFtZSA9ICIiOwotICAJCX0KLSAgCX0KLSAgCQotICAJZmlsZVBhdGggPSBmaWxlUGF0aC5hcHBlbmQoc2ltcGxlQ2xhc3NOYW1lKTsKLSAgCQotICAJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKCJqYXZhIik7Ci0KLSAgCS8vIGNoZWNrIGlmIEhhbmRsZXIgYWxyZWFkeSBleGlzdHM7IGRvIG5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgSGFuZGxlcnMKLSAgCUlSZXNvdXJjZSB3b3Jrc3BhY2VSZXMgPSBSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShmaWxlUGF0aCk7Ci0gIAlpZiAod29ya3NwYWNlUmVzIT1udWxsICYmIHdvcmtzcGFjZVJlcy5leGlzdHMoKSkgewotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gIAkKLSAgCWlmIChoYW5kbGVyTmFtZUZvckVkaXRfID09IG51bGwpewotICAJCWhhbmRsZXJOYW1lRm9yRWRpdF8gPSBjbGFzc05hbWU7Ci0gIAl9Ci0gIAkKLSAgCU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBGaWxlUmVzb3VyY2VVdGlscy5uZXdGaWxlT3V0cHV0U3RyZWFtKCBFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBmaWxlUGF0aCwgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLCBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLSAgCS8vIGNyZWF0ZSBidWZmZXJlZCB3cml0ZXIgZm9yIHdyaXRpbmcgZmlsZQotICAJQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pKTsKLSAgCXRyeSB7Ci0gIAkJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpICE9IDApIHsKLSAgCQkJYncud3JpdGUoInBhY2thZ2UgIiArcGFja2FnZU5hbWUrIjsiKTsKLSAgCQkJYncubmV3TGluZSgpOwotICAJCQlidy5uZXdMaW5lKCk7Ci0gIAkJfQotICAJCWJ3LndyaXRlKCJpbXBvcnQgamF2YXgueG1sLnJwYy5oYW5kbGVyLkdlbmVyaWNIYW5kbGVyOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiaW1wb3J0IGphdmF4LnhtbC5ycGMuaGFuZGxlci5NZXNzYWdlQ29udGV4dDsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoImltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJCi0gIAkJYncud3JpdGUoInB1YmxpYyBjbGFzcyAiK3NpbXBsZUNsYXNzTmFtZSsiIGV4dGVuZHMgR2VuZXJpY0hhbmRsZXIiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoInsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCQotICAJCWJ3LndyaXRlKCIgICBwdWJsaWMgUU5hbWVbXSBnZXRIZWFkZXJzICgpIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICAvLyBGaWxsIGluIG1ldGhvZCBib2R5Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICByZXR1cm4gbnVsbDsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIH0iKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXF1ZXN0KCBNZXNzYWdlQ29udGV4dCBjb250ZXh0ICkiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIC8vIEZpbGwgaW4gbWV0aG9kIGJvZHkgb3IgZGVsZXRlIG1ldGhvZCB0byB1c2UgR2VuZXJpY0hhbmRsZXIiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIHJldHVybiB0cnVlOyIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy53cml0ZSgiICAgfSIpOwotICAJCWJ3Lm5ld0xpbmUoKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVJlc3BvbnNlKCBNZXNzYWdlQ29udGV4dCBjb250ZXh0ICkiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIHsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgICAgIC8vIEZpbGwgaW4gbWV0aG9kIGJvZHkgb3IgZGVsZXRlIG1ldGhvZCB0byB1c2UgR2VuZXJpY0hhbmRsZXIgIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICByZXR1cm4gdHJ1ZTsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIH0iKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVGYXVsdCggTWVzc2FnZUNvbnRleHQgY29udGV4dCApIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICB7Iik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICAvLyBGaWxsIGluIG1ldGhvZCBib2R5IG9yIGRlbGV0ZSBtZXRob2QgdG8gdXNlIEdlbmVyaWNIYW5kbGVyIik7Ci0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCIgICAgICByZXR1cm4gdHJ1ZTsiKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJYncud3JpdGUoIiAgIH0iKTsKLSAgCQlidy5uZXdMaW5lKCk7Ci0gIAkJCi0gIAkJYncubmV3TGluZSgpOwotICAJCWJ3LndyaXRlKCJ9Iik7Ci0gIAkJYncuY2xvc2UoKTsKLSAgCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwkKLSAgCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAid3JpdGVGaWxlIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XUklURV9GSUxFIiwgbmV3IFN0cmluZ1tdeyBjbGFzc05hbWUgfSksIFN0YXR1cy5FUlJPUiwgZSApOwotICAJCWlmIChidyAhPSBudWxsKSB7Ci0gIAkJCXRyeSB7Ci0gIAkJCQlidy5jbG9zZSgpOwotICAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotICAJCQl9Ci0gIAkJfQotICAJfQotICAJcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyByZWRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE91dHB1dExvY2F0aW9uKElQYXRoIG91dHB1dExvY2F0aW9uKSAKLSAgewotCXRoaXMub3V0cHV0TG9jYXRpb25fID0gb3V0cHV0TG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJOYW1lcyAoU3RyaW5nW10gaGFuZGxlck5hbWVzKQotICB7Ci0gIAl0aGlzLmhhbmRsZXJOYW1lc18gPSBoYW5kbGVyTmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlblNrZWxldG9uRW5hYmxlZChib29sZWFuIGdlblNrZWxldG9uKQotICB7Ci0gIAl0aGlzLmdlblNrZWxldG9uXyA9IGdlblNrZWxldG9uOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpewotICAJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0gIAlpZiAob3V0cHV0TG9jYXRpb25fIT1udWxsKXsKLSAgCQlwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2Yob3V0cHV0TG9jYXRpb25fKTsKLSAgCX0KLSAgCXJldHVybiBwcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRDbGFzc05hbWVzKCl7Ci0gIAlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlpZiAoaGFuZGxlck5hbWVGb3JFZGl0XyE9bnVsbCl7Ci0gIAkJY2xhc3Nlcy5hZGQoaGFuZGxlck5hbWVGb3JFZGl0Xyk7Ci0gIAl9Ci0gIAlyZXR1cm4gY2xhc3NlczsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9PcGVuSmF2YUVkaXRvckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9PcGVuSmF2YUVkaXRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlZmVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvT3BlbkphdmFFZGl0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBPcGVuSmF2YUVkaXRvckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgTGlzdCBjbGFzc05hbWVzOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0KLSAgcHVibGljIE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIE9wZW5KYXZhRWRpdG9ySm9iIGpvYiA9IG5ldyBPcGVuSmF2YUVkaXRvckpvYihjbGFzc05hbWVzLCBwcm9qZWN0KTsKLSAgICBqb2Iuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZXMoTGlzdCBjbGFzc05hbWVzKQotICB7Ci0gICAgdGhpcy5jbGFzc05hbWVzID0gY2xhc3NOYW1lczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgT3BlbkphdmFFZGl0b3JKb2IgZXh0ZW5kcyBVSUpvYgotICB7Ci0gICAgcHJpdmF0ZSBMaXN0IGNsYXNzTmFtZXM7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHVibGljIE9wZW5KYXZhRWRpdG9ySm9iKExpc3QgY2xhc3NOYW1lcywgSVByb2plY3QgcHJvamVjdCkKLSAgICB7Ci0gICAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuT3BlbkphdmFFZGl0b3JKb2IiKTsKLSAgICAgIHRoaXMuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7Ci0gICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICB7Ci0gICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIGNsYXNzTmFtZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2xhc3NOYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpaXQubmV4dCgpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShjbGFzc05hbWUpOwotICAgICAgICAgICAgSmF2YVVJLm9wZW5JbkVkaXRvcih0eXBlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzLkVSUk9SLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCwgMCwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VOQUJMRV9UT19PUEVOX0pBVkFfRURJVE9SIiwgbmV3IFN0cmluZ1tde2NsYXNzTmFtZSwgcHJvamVjdC5nZXROYW1lKCl9KSwgdCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzLk9LLCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCwgMCwgIiIsIG51bGwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cy5FUlJPUiwgV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsIDAsIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fT1BFTl9KQVZBX0VESVRPUiIsIG5ldyBTdHJpbmdbXXtjbGFzc05hbWVzICE9IG51bGwgPyBjbGFzc05hbWVzLnRvU3RyaW5nKCkgOiAiIiwgcHJvamVjdCAhPSBudWxsID8gcHJvamVjdC5nZXROYW1lKCkgOiAiIn0pLCBudWxsKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9XU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL1dTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZDRmNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL1dTSU5vbkNvbXBsaWFudFJ1bnRpbWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUFQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLldTSUNvbXBsaWFuY2VVdGlsczsKLQotCi0KLXB1YmxpYyBjbGFzcyBXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQotICBwcml2YXRlIElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0XzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotIAotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dTSV9OT05DT01QTElBTlQiOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV1NJX05PTkNPTVBMSUFOVCI7Ci0JCi0gIHB1YmxpYyBXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCgpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2Uud3N0LndzLnVpIjsKLSAgCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gIAlzZXROYW1lIChtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAJc2V0RGVzY3JpcHRpb24oIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7ICAgIAotICB9Ci0gIAotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZSAoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICAKLSAgCVBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dCB3c2lTU0JQQ29udGV4dCA9IFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpOyAKLSAgCVBlcnNpc3RlbnRXU0lBUENvbnRleHQgd3NpQVBDb250ZXh0ID0gV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpOyAKLSAgICBWZWN0b3Igc3RhdHVzU1NCUCA9IG5ldyBWZWN0b3IoKTsKLSAgICBzdGF0dXNTU0JQLmFkZChuZXcgU2ltcGxlU3RhdHVzKCJXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCIsIAotICAgIAkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIldTSV9TU0JQX0lOQ09NUExJQU5UX1JVTlRJTUUiKSwgV1NJQ29tcGxpYW5jZVV0aWxzLmdldFdTSVNldmVyaXR5KHNlcnZpY2VQcm9qZWN0Xywgd3NpU1NCUENvbnRleHQpKSk7Ci0gICAgU3RhdHVzW10gc3RhdHVzZXNTU0JQID0gKFN0YXR1c1tdKSBzdGF0dXNTU0JQLnRvQXJyYXkobmV3IFN0YXR1c1tzdGF0dXNTU0JQLnNpemUoKV0pOwotICAgIAotICAgIFZlY3RvciBzdGF0dXNBUCA9IG5ldyBWZWN0b3IoKTsKLSAgICBzdGF0dXNBUC5hZGQobmV3IFNpbXBsZVN0YXR1cygiV1NJTm9uQ29tcGxpYW50UnVudGltZUNvbW1hbmQiLCAKLSAgICAJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJXU0lfQVBfSU5DT01QTElBTlRfUlVOVElNRSIpLCBXU0lDb21wbGlhbmNlVXRpbHMuZ2V0V1NJU2V2ZXJpdHkoc2VydmljZVByb2plY3RfLCB3c2lBUENvbnRleHQpKSk7Ci0gICAgU3RhdHVzW10gc3RhdHVzZXNBUCA9IChTdGF0dXNbXSkgc3RhdHVzQVAudG9BcnJheShuZXcgU3RhdHVzW3N0YXR1c0FQLnNpemUoKV0pOwotCi0gICAgaWYgKFdTSUNvbXBsaWFuY2VVdGlscy5jaGVja1dTSUNvbXBsaWFuY2UgKGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKSwgc3RhdHVzZXNTU0JQLCBzZXJ2aWNlUHJvamVjdF8sIHdzaVNTQlBDb250ZXh0KSkgewotICAgIAlpZiAoV1NJQ29tcGxpYW5jZVV0aWxzLmNoZWNrV1NJQ29tcGxpYW5jZSAoZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLCBzdGF0dXNlc0FQLCBzZXJ2aWNlUHJvamVjdF8sIHdzaUFQQ29udGV4dCkpIHsKLSAgICAJCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIAl9IGVsc2UgewotICAgIAkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoCi0gICAgCQkJCSJXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCIsCi0gICAgCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJOT1RfT0siKSwKLSAgICAJCQkJU3RhdHVzLkVSUk9SKTsKLSAgICAJfQotICAgIH0gZWxzZSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKAotCQkJCSJXU0lOb25Db21wbGlhbnRSdW50aW1lQ29tbWFuZCIsCi0JCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk5PVF9PSyIpLAotCQkJCVN0YXR1cy5FUlJPUik7Ci0JCX0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyByZWRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KSB7Ci0JdGhpcy5zZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4NDAwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9FY2xpcHNlSVBhdGgyVVJMU3RyaW5nVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHMgPSB2YWx1ZS50b1N0cmluZygpOwotICAgIGlmIChzLmluZGV4T2YoIjoiKSA8IDApCi0gICAgewotICAgICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcih2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgIGlmIChyZXMuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcyA9IHJlcy5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1Byb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1Byb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3NzI1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9Qcm9qZWN0TmFtZTJJUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIFByb2plY3ROYW1lMklQcm9qZWN0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLQlTdHJpbmcgcHJvamVjdCAgICAgPSAoU3RyaW5nKXZhbHVlOwotCWludCAgICBzbGFzaEluZGV4ICA9IHByb2plY3QuaW5kZXhPZiggJy8nICk7Ci0JU3RyaW5nIHByb2plY3ROYW1lID0gcHJvamVjdDsKLQkKLQlpZiggc2xhc2hJbmRleCAhPSAtMSApCi0JewotCSAgcHJvamVjdE5hbWUgPSBwcm9qZWN0LnN1YnN0cmluZyggMCwgc2xhc2hJbmRleCApOwotCX0KLQkKLSAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tYW5kL2RhdGEvU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2MDc1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAyMCwgMjAwNAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKgotICogVHJhbnNmb3JtcyBhIHNlcnZlciBpbnN0YW5jZSBpZCB0byBhbiBJU2VydmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIjdHJhbnNmb3JtKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAKLSAgICBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJbnN0SWQgPSAoU3RyaW5nKXZhbHVlOwotICAgIElTZXJ2ZXIgc2VydmVySW5zdCA9IG51bGw7Ci0gICAgaWYgKGV4aXN0aW5nU2VydmVySW5zdElkICE9IG51bGwpIHsKLSAgICAJc2VydmVySW5zdCA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihleGlzdGluZ1NlcnZlckluc3RJZCk7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXJJbnN0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1hbmQvZGF0YS9TZXJ2ZXJOYW1lMklTZXJ2ZXJUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM1ZjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbWFuZC9kYXRhL1NlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotcHVibGljIGNsYXNzIFNlcnZlck5hbWUySVNlcnZlclRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgVmVjdG9yIHNlcnZlcklkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICB7Ci0gICAgICBTdHJpbmcgc2VydmVyTmFtZSA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAgICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCE9MCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgICAgIGlmICgoc2VydmVyLmdldE5hbWUoKSkuZXF1YWxzKHNlcnZlck5hbWUpKQotICAgICAgICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0NsaWVudFNlcnZlclNlbGVjdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNmJlMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LklTZXJ2ZXJUYXJnZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuc2VydmVydGFyZ2V0LlNlcnZlclRhcmdldEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLklTZXJ2ZXJEZWZhdWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5TZXJ2ZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMKLXsKLSAgLyoKLSAgICogUmV0dXJucyByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBzZXJ2ZXIgZmFjdG9yeSBpZCBhbmQgaW5zdGFuY2UgaWQgYmFzZWQgb24gCi0gICAqIGFuIGV4aXN0aW5nIHByb2plY3QKLSAgICogaW5kZXggWzBdIGNvbnRhaW5zIGZhY3RvcnlJZCwgaW5kZXhbMV0gY29udGFpbnMgaW5zdGFuY2UgSWQuCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZlckluZm9Gcm9tRXhpc3RpbmdQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSWQsIGJvb2xlYW4gYXNrRXh0ZW5kZXJzKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVySW5mbyA9IG5ldyBTdHJpbmdbMl07IC8vc2VydmVySW5mcFswXSBjb250YWlucyBmYWN0b3J5SWQsIHNlcnZlckluZm9bMV0gY29udGFpbnMgaW5zdGFuY2UgSWQKLSAgICAKLSAgICAvLyBJZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBhZGRlZCB0byBhbiBleGlzdGluZyBzZXJ2ZXIsIHBpY2sgdGhhdCBzZXJ2ZXIKLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbmZpZ3VyZWRTZXJ2ZXJzLCB0eXBlSWQgKTsKLSAgICBpZiAoZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgICAgIAkKLSAgICB9Ci0gICAgCi0gICAgLy9Eb2VzIHRoZSBwcm9qZWN0IGhhdmUgYSBydW50aW1lLXRhcmdldD8KLSAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gZ2V0UnVudGltZVRhcmdldChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL0xvb2sgZm9yIGFuIGV4aXN0aW5nIHNlcnZlciB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJ1bnRpbWUtdGFyZ2V0Ci0gICAgICBJU2VydmVyW10gY29tcGF0aWJsZVNlcnZlcnMgPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXJzKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgaWYgKGNvbXBhdGlibGVTZXJ2ZXJzIT1udWxsICYmIGNvbXBhdGlibGVTZXJ2ZXJzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb21wYXRpYmxlU2VydmVycywgdHlwZUlkKTsKLSAgICAgICAgaWYgKGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyLmdldElkKCk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgCi0gICAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyIHdhcyBmb3VuZC4gQ2hvb3NlIGEgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4KLSAgICAgIAotICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIHNlcnZlciBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByb2plY3QncyBydW50aW1lIHRhcmdldCwgdXNlIGl0LgotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGN0eCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICAgIFN0cmluZyBwRmFjdG9yeUlkID0gY3R4LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUocEZhY3RvcnlJZCk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCl7Ci0gICAgICAJU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgCWlmIChzZXJ2ZXJSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSkKLSAgICAgIAl7Ci0gICAgICAJICBzZXJ2ZXJJbmZvWzBdID0gcEZhY3RvcnlJZDsKLSAgICAgIAkgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCX0KLSAgICAgIH0gICAgIAotICAgICAgCi0gICAgICAvL1RoZSBwcmVmZXJyZWQgc2VydmVyIHdhcyBub3QgY29tcGF0aWJsZS4gUGljayB0aGUgZmlyc3QgdmFsaWQgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4gICAgICAKLSAgICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZVRhcmdldCwgdHlwZUlkKTsKLSAgICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIGlmIChhc2tFeHRlbmRlcnMpCi0gICAgewotICAgICAgU2VydmVySW5mbyByZWNvbW1lbmRlZFNlcnZlckluZm8gPSBnZXRFeHRlbmRlclJlY29tbWVuZGF0aW9uKHByb2plY3QpOwotICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mbyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkhPW51bGwgJiYgcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpOyAKLQotICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9Vc2UgU2VydmVyVGFyZ2V0SGVscGVyIHRvIGdldCBhIGxpc3Qgb2YgdmFsaWQgcnVudGltZS10YXJnZXRzIGFuZCB1c2UgdGhlc2UgdG8gZGV0ZXJtaW5lIGEgZGVmYXVsdCBzZXJ2ZXIgdHlwZS4KLSAgICBTdHJpbmdbXSBwcm9qZWN0QXR0cnMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0UHJvamVjdFR5cGVBbmRKMkVFTGV2ZWwocHJvamVjdCk7Ci0gICAgTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKHByb2plY3RBdHRyc1swXSwgcHJvamVjdEF0dHJzWzFdKTsKLSAgICBTdHJpbmdbXSBjb21wYXRTZXJ2ZXJJbmZvID0gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVyKHJ1bnRpbWVzLHR5cGVJZCk7IAotICAgIGlmICggY29tcGF0U2VydmVySW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBjb21wYXRTZXJ2ZXJJbmZvOwotICAgIH0KLSAgICAKLSAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyLCBwaWNrIGEgdHlwZS4KLSAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHJ1bnRpbWVzLCB0eXBlSWQpOwotICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsgCi0gICAgcmV0dXJuIHNlcnZlckluZm87ICAgCi0KLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgcmVhc29uYWJsZSBkZWZhdWx0cyBmb3Igc2VydmVyIGZhY3RvcnkgaWQgYW5kIGluc3RhbmNlIGlkIGJhc2VkIG9uIAotICAgKiBhbiBleGlzdGluZyBwcm9qZWN0Ci0gICAqIGluZGV4IFswXSBjb250YWlucyBmYWN0b3J5SWQsIGluZGV4WzFdIGNvbnRhaW5zIGluc3RhbmNlIElkLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZUlkLCBib29sZWFuIGFza0V4dGVuZGVycykKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOyAvL3NlcnZlckluZnBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBzZXJ2ZXJJbmZvWzFdIGNvbnRhaW5zIGluc3RhbmNlIElkCi0gICAgCi0gICAgLy8gSWYgdGhlIHByb2plY3QgaGFzIGJlZW4gYWRkZWQgdG8gYW4gZXhpc3Rpbmcgc2VydmVyLCBwaWNrIHRoYXQgc2VydmVyCi0gICAgSVNlcnZlcltdIGNvbmZpZ3VyZWRTZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb25maWd1cmVkU2VydmVycywgdHlwZUlkICk7Ci0gICAgaWYgKGZpcnN0U3VwcG9ydGVkU2VydmVyICE9IG51bGwpCi0gICAgewotICAgICAgc2VydmVySW5mb1swXSA9IGZpcnN0U3VwcG9ydGVkU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkU2VydmVyLmdldElkKCk7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsgICAgICAJCi0gICAgfQotICAgIAotICAgIC8vRG9lcyB0aGUgcHJvamVjdCBoYXZlIGEgcnVudGltZS10YXJnZXQ/Ci0gICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IGdldFJ1bnRpbWVUYXJnZXQocHJvamVjdC5nZXROYW1lKCkpOwotICAgIGlmIChydW50aW1lVGFyZ2V0ICE9IG51bGwpCi0gICAgewotICAgICAgLy9Mb29rIGZvciBhbiBleGlzdGluZyBzZXJ2ZXIgd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBydW50aW1lLXRhcmdldAotICAgICAgSVNlcnZlcltdIGNvbXBhdGlibGVTZXJ2ZXJzID0gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhydW50aW1lVGFyZ2V0KTsKLSAgICAgIGlmIChjb21wYXRpYmxlU2VydmVycyE9bnVsbCAmJiBjb21wYXRpYmxlU2VydmVycy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBJU2VydmVyIGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoY29tcGF0aWJsZVNlcnZlcnMsIHR5cGVJZCk7Ci0gICAgICAgIGlmIChmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVySW5mb1swXSA9IGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlci5nZXRJZCgpOwotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgICAgIAotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9ObyBleGlzdGluZyBjb21wYXRpYmxlIHNlcnZlciB3YXMgZm91bmQuIENob29zZSBhIGNvbXBhdGlibGUgc2VydmVyIHR5cGUuCi0gICAgICAKLSAgICAgIC8vSWYgdGhlIHByZWZlcnJlZCBzZXJ2ZXIgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm9qZWN0J3MgcnVudGltZSB0YXJnZXQsIHVzZSBpdC4KLSAgICAgIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjdHggPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICBTdHJpbmcgcEZhY3RvcnlJZCA9IGN0eC5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHBGYWN0b3J5SWQpOwotICAgICAgaWYgKHNlcnZlclR5cGUhPW51bGwpewotICAgICAgCVN0cmluZyBzZXJ2ZXJSdW50aW1lSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIAlpZiAoc2VydmVyUnVudGltZUlkLmVxdWFscyhydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSkpCi0gICAgICAJewotICAgICAgCSAgc2VydmVySW5mb1swXSA9IHBGYWN0b3J5SWQ7Ci0gICAgICAJICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIAl9Ci0gICAgICB9ICAgICAKLSAgICAgIAotICAgICAgLy9UaGUgcHJlZmVycmVkIHNlcnZlciB3YXMgbm90IGNvbXBhdGlibGUuIFBpY2sgdGhlIGZpcnN0IHZhbGlkIGNvbXBhdGlibGUgc2VydmVyIHR5cGUuICAgICAgCi0gICAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHJ1bnRpbWVUYXJnZXQsIHR5cGVJZCk7Ci0gICAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwpIHNlcnZlckluZm9bMF0gPSBmYWN0b3J5SWQ7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIAotICAgIH0KLSAgICAKLSAgICAKLSAgICBpZiAoYXNrRXh0ZW5kZXJzKQotICAgIHsKLSAgICAgIFNlcnZlckluZm8gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvID0gZ2V0RXh0ZW5kZXJSZWNvbW1lbmRhdGlvbihwcm9qZWN0KTsKLSAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8hPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCkhPW51bGwgJiYgcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgc2VydmVySW5mb1swXSA9IHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChyZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpIT1udWxsICYmIHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKTsgCi0KLSAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vVXNlIFNlcnZlclRhcmdldEhlbHBlciB0byBnZXQgYSBsaXN0IG9mIHZhbGlkIHJ1bnRpbWUtdGFyZ2V0cyBhbmQgdXNlIHRoZXNlIHRvIGRldGVybWluZSBhIGRlZmF1bHQgc2VydmVyIHR5cGUuCi0gICAgU3RyaW5nW10gcHJvamVjdEF0dHJzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFByb2plY3RUeXBlQW5kSjJFRUxldmVsKHByb2plY3QpOwotICAgIExpc3QgcnVudGltZXMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0U2VydmVyVGFyZ2V0cyhwcm9qZWN0QXR0cnNbMF0sIHByb2plY3RBdHRyc1sxXSk7Ci0gICAgTGlzdCBzdXBwUnVudGltZXMgPSBnZXRSdW50aW1lVGFyZ2V0c1N1cHBvcnRlZEJ5V1NSdW50aW1lKHJ1bnRpbWVzLCBydW50aW1lSWQpOwotICAgIFN0cmluZ1tdIGNvbXBhdFNlcnZlckluZm8gPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIoc3VwcFJ1bnRpbWVzLHR5cGVJZCk7IAotICAgIGlmICggY29tcGF0U2VydmVySW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBjb21wYXRTZXJ2ZXJJbmZvOwotICAgIH0KLSAgICAKLSAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyLCBwaWNrIGEgdHlwZS4KLSAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHN1cHBSdW50aW1lcywgdHlwZUlkKTsKLSAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwpIHNlcnZlckluZm9bMF0gPSBmYWN0b3J5SWQ7IAotICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgIAotCi0gIH0KLSAgCi0gIC8qCi0gICAqIEdpdmVuIGEgbGlzdCBvZiBleGlzdGluZyBzZXJ2ZXJzLCB0aGlzIHJldHVybnMgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIHN1cHBvcnRlZAotICAgKiBieSB0aGUgZ2l2ZW4gV2ViIHNlcnZpY2UgdHlwZSBpZC4gCi0gICAqIFJldHVybnMgbnVsbCBvZiB0aGVyZSBhcmUgbm8gc3VwcG9ydGVkIHNlcnZlcnMgaW4gdGhlIGFycmF5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKElTZXJ2ZXJbXSBzZXJ2ZXJzLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9IHNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIGlmICh3c2N0UmVnaXN0cnkuaXNTZXJ2ZXJTdXBwb3J0ZWRGb3JDaG9zZW5UeXBlKHR5cGVJZCwgc2VydmVyRmFjdG9yeUlkKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBzZXJ2ZXJzW2ldOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9ICAKLSAgCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIGZhY3RvcnkgaWQgb2YgYSBzZXJ2ZXIgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIFdlYiBzZXJ2aWNlIHR5cGUgYW5kIHRoZSBydW50aW1lIHRhcmdldC4KLSAgICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBub25lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKElSdW50aW1lIHJ1bnRpbWVUYXJnZXQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBTdHJpbmcgcnVudGltZUlkID0gcnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nW10gc2VydmVyRmFjdG9yeUlkcyA9IHdzY3RSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHR5cGVJZCk7Ci0gIAotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJGYWN0b3J5SWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZHNbaV0pOwotICAgICAgaWYgKHNlcnZlclR5cGUhPW51bGwgKXsKLSAgICAgIAlTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAJaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIAl7Ci0gICAgICAJCXJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzW2ldOwotICAgICAgCX0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybiB0aGUgZmFjdG9yeSBpZCBvZiB0aGUgZmlyc3Qgc2VydmVyIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBydW50aW1lVGFyZ2V0cyBhbmQgdHlwZUlkLgotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lVGFyZ2V0cy5zaXplKCk7IGkrKyApCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHJ1bnRpbWVUYXJnZXQsIHR5cGVJZCk7Ci0gICAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwgJiYgZmFjdG9yeUlkLmxlbmd0aCgpPjApCi0gICAgICAgIHJldHVybiBmYWN0b3J5SWQ7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBJUnVudGltZSBnZXRSdW50aW1lVGFyZ2V0KFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAJaWYoIHByb2plY3ROYW1lICE9IG51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICl7IC8vJE5PTi1OTFMtMSQKLSAgCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgCQlpZiggcHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgKXsKLSAgCQkJcmV0dXJuIFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuZ2V0UnVudGltZVRhcmdldCgpOyAKLSAgCQl9Ci0gIAl9Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJU2VydmVyW10gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhJUnVudGltZSBydW50aW1lKQotICB7Ci0gICAgaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgaWYgKHNlcnZlcnM9PW51bGwgfHwgc2VydmVycy5sZW5ndGghPTApCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBBcnJheUxpc3QgY29tcGF0aWJsZVNlcnZlcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBydW50aW1lSWQgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICBpZiAoc2VydmVyUnVudGltZUlkLmVxdWFscyhydW50aW1lSWQpKQotICAgICAgICBjb21wYXRpYmxlU2VydmVyc0xpc3QuYWRkKHNlcnZlcik7Ci0gICAgICAKLSAgICB9Ci0gICAgaWYgKGNvbXBhdGlibGVTZXJ2ZXJzTGlzdC5zaXplKCk8MSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIAotICAgIE9iamVjdFtdIGNvbXBhdGlibGVTZXJ2ZXJzQXJyYXkgPSBjb21wYXRpYmxlU2VydmVyc0xpc3QudG9BcnJheSgpOwotICAgIElTZXJ2ZXJbXSBjb21wYXRpYmxlU2VydmVycyA9IG5ldyBJU2VydmVyW2NvbXBhdGlibGVTZXJ2ZXJzQXJyYXkubGVuZ3RoXTsKLSAgICBmb3IgKGludCBqPTA7IGo8Y29tcGF0aWJsZVNlcnZlcnNBcnJheS5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBjb21wYXRpYmxlU2VydmVyc1tqXSA9IChJU2VydmVyKWNvbXBhdGlibGVTZXJ2ZXJzQXJyYXlbal07Ci0gICAgfQotICAgIAotICAgIHJldHVybiBjb21wYXRpYmxlU2VydmVyczsKLSAgfSAgCi0gIC8qCi0gICAqIFJldHVybnMgdGhlIGZhY3RvcnkgSWQgYW5kIGluc3RhbmNlIGlkIG9mIHRoZSBmaXJzdCBleGl0aW5nIHNlcnZlciBjb21wYXRpYmxlCi0gICAqIHdpdGggdGhlIHJ1bnRpbWUgdGFyZ2V0cyBhbmQgdHlwZUlkCi0gICAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm9uZS4KLSAgICogVGhlIGl0ZW0gYXQgWzBdIGlzIHRoZSBmYWN0b3J5IGlkLgotICAgKiBUaGUgaXRlbSBhdCBbMV0gaXMgdGhlIGluc3RhbmNlIGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lVGFyZ2V0cy5zaXplKCk7IGkrKyApCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBJU2VydmVyW10gZXhpc3RpbmdDb21wYXRTZXJ2ZXJzID0gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhydW50aW1lVGFyZ2V0KTsKLSAgICAgIElTZXJ2ZXIgY29tcGF0U2VydmVyID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoZXhpc3RpbmdDb21wYXRTZXJ2ZXJzLCB0eXBlSWQpOwotICAgICAgaWYgKGNvbXBhdFNlcnZlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gY29tcGF0U2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gY29tcGF0U2VydmVyLmdldElkKCk7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTZXJ2ZXJJbmZvIGdldEV4dGVuZGVyUmVjb21tZW5kYXRpb24oSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIsICJzZXJ2ZXJEZWZhdWx0ZXIiKTsKLSAgICBmb3IgKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IHNlcnZlckRlZmF1bHRlck9iamVjdCA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICBpZiAoc2VydmVyRGVmYXVsdGVyT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZlckRlZmF1bHRlcikKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlckRlZmF1bHRlciBzZXJ2ZXJEZWZhdWx0ZXIgPSAoSVNlcnZlckRlZmF1bHRlcilzZXJ2ZXJEZWZhdWx0ZXJPYmplY3Q7Ci0gICAgICAgIFNlcnZlckluZm8gc2VydmVySW5mbyA9IHNlcnZlckRlZmF1bHRlci5yZWNvbW1lbmREZWZhdWx0U2VydmVyKHByb2plY3QpOwotICAgICAgICBpZiAoc2VydmVySW5mbyAhPSBudWxsKQotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBMaXN0IGdldFJ1bnRpbWVUYXJnZXRzU3VwcG9ydGVkQnlXU1J1bnRpbWUoTGlzdCBydW50aW1lVGFyZ2V0cywgU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQpCi0gIHsKLSAgICBBcnJheUxpc3Qgc3VwcFJ1bnRpbWVUYXJnZXRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgd3NjdFJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZVRhcmdldHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IChJUnVudGltZSlydW50aW1lVGFyZ2V0cy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgcnRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgaWYgKHdzY3RSZWcuZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyVGFyZ2V0KHJ0SWQsIHdlYlNlcnZpY2VSdW50aW1lSWQpKQotICAgICAgewotICAgICAgICBzdXBwUnVudGltZVRhcmdldHMuYWRkKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VwcFJ1bnRpbWVUYXJnZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBnZXQgYSBzZXJ2ZXIgZmFjdG9yeSBpZCBhbmQgaW5zdGFuY2UgaWQgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGdpdmVuIFdlYgotICAgKiBzZXJ2aWNlIHJ1bnRpbWUuCi0gICAqIEBwYXJhbSBjbGllbnRSdW50aW1lSWQKLSAgICogQHBhcmFtIGoyZWVWZXJzaW9uIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50IHZhbHVlcyBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cyBpLmUuICIxMiIsICIxMyIsICIxNCIKLSAgICogQHJldHVybiBTdHJpbmdbXSBpbmRleCBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBpbmRleFsxXSBjb250YWlucyBpbnN0YW5jZSBJZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyRnJvbUNsaWVudFJ1bnRpbWVBbmRKMkVFKFN0cmluZyBjbGllbnRSdW50aW1lSWQsIFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOwotICAgIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgd3NjdFJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvL0dldCBhbGwgcG9zc2libGUgdmFsaWQgc2VydmVycy4gSWYgdGhlcmUgYXJlIG5vbmUsIHdlIGNhbid0IGRlZmF1bHQgaW50ZWxsaWdlbnRseSwgcmV0dXJuIG51bGwuCi0gICAgU3RyaW5nW10gdmFsaWRTZXJ2ZXJGYWN0b3J5SWRzID0gd3NjdFJlZy5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlSdW50aW1lSWQoY2xpZW50UnVudGltZUlkKTsKLSAgICBpZiAodmFsaWRTZXJ2ZXJGYWN0b3J5SWRzPT1udWxsIHx8IHZhbGlkU2VydmVyRmFjdG9yeUlkcy5sZW5ndGg8MSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIC8vR2V0IGFsbCBleGlzdGluZyBzZXJ2ZXJzCi0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsgLy9HZXQgYWxsIGV4aXN0aW5nIHNlcnZlcnMKLSAgICAKLSAgICAvL0dldCB0aGUgcHJlZmVycmVkIHNlcnZlci4KLSAgCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAJU3RyaW5nIHByZWZTZXJ2ZXJGYWN0b3J5SWQgPSBjb250ZXh0LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAJCi0gICAgYm9vbGVhbiBwcmVmZXJyZWRJc1ZhbGlkID0gIGNvbnRhaW5zU3RyaW5nKHZhbGlkU2VydmVyRmFjdG9yeUlkcywgcHJlZlNlcnZlckZhY3RvcnlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTZXJ2ZXJWYWxpZChwcmVmU2VydmVyRmFjdG9yeUlkLCBqMmVlVmVyc2lvbik7Ci0gICAgaWYgKHByZWZlcnJlZElzVmFsaWQpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgICAgU3RyaW5nIHRoaXNGYWN0b3J5SWQgPSBzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodGhpc0ZhY3RvcnlJZC5lcXVhbHMocHJlZlNlcnZlckZhY3RvcnlJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gcHJlZlNlcnZlckZhY3RvcnlJZDsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gc2VydmVyLmdldElkKCk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgCi0gICAgfQotICAgIAotICAgIC8vRWl0aGVyIHRoZSBwcmVmZXJyZWQgc2VydmVyIHdhcyBub3QgdmFsaWQgb3IgaXQgd2FzIHZhbGlkIGJ1dCBkb2VzIG5vdCBleGlzdC4KLSAgICAvL0NoZWNrIHRoZSBleGlzdGluZyBzZXJ2ZXJzIGZvciB2YWxpZGl0eQotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgICAgIFN0cmluZyB0aGlzRmFjdG9yeUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgCi0gICAgICBib29sZWFuIHRoaXNTZXJ2ZXJWYWxpZCA9IGNvbnRhaW5zU3RyaW5nKHZhbGlkU2VydmVyRmFjdG9yeUlkcywgdGhpc0ZhY3RvcnlJZCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzU2VydmVyVmFsaWQodGhpc0ZhY3RvcnlJZCwgajJlZVZlcnNpb24pOwotICAgICAgaWYgKHRoaXNTZXJ2ZXJWYWxpZCkKLSAgICAgIHsKLSAgICAgICAgc2VydmVySW5mb1swXSA9IHRoaXNGYWN0b3J5SWQ7Ci0gICAgICAgIHNlcnZlckluZm9bMV0gPSBzZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgcmV0dXJuIHNlcnZlckluZm87ICAgICAgICAKLSAgICAgIH0KLSAgICB9ICAgICAgICAgIAotCi0gICAgLy9Ob25lIG9mIHRoZSBleGlzdGluZyBzZXJ2ZXJzIGlzIHZhbGlkLiBQaWNrIHRoZSBwcmVmZXJyZWQgb25lIGlmIHZhbGlkLiBPdGhlcndpc2UsIHBpY2sgdGhlCi0gICAgLy9maXJzdCB2YWxpZCBzZXJ2ZXIgdHlwZS4KLSAgICBpZiAocHJlZmVycmVkSXNWYWxpZCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gcHJlZlNlcnZlckZhY3RvcnlJZDsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHZhbGlkU2VydmVyRmFjdG9yeUlkcy5sZW5ndGg7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGlzU2VydmVyVmFsaWQodmFsaWRTZXJ2ZXJGYWN0b3J5SWRzW2ldLCBqMmVlVmVyc2lvbik7Ci0gICAgICAgIGlmIChpc1ZhbGlkKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVySW5mb1swXSA9IHZhbGlkU2VydmVyRmFjdG9yeUlkc1swXTsKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgICAgfQotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL1dlIGNhbid0IGRldGVybWluZSBhIHZhbGlkIHNlcnZlciBzZWxlY3Rpb24uIFJldHVybiBudWxsLgotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2VydmVyVmFsaWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICBpZiAoc2VydmVyRmFjdG9yeUlkPT1udWxsIHx8IHNlcnZlckZhY3RvcnlJZC5sZW5ndGgoKT09MCB8fCBqMmVlVmVyc2lvbj09bnVsbCB8fCBqMmVlVmVyc2lvbi5sZW5ndGgoKT09MCkKLSAgICAgcmV0dXJuIHRydWU7Ci0gICAKLSAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0gICBpZiAocnVudGltZVRhcmdldElkID09IG51bGwgfHwgcnVudGltZVRhcmdldElkLmxlbmd0aCgpPT0wKQotICAgICByZXR1cm4gZmFsc2U7Ci0gICBTdHJpbmcgd2ViTW9kdWxlVHlwZSA9IElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuV0VCX1RZUEU7Ci0gICBib29sZWFuIGlzVmFsaWQgPSBTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yUHJvamVjdFR5cGUocnVudGltZVRhcmdldElkLCBqMmVlVmVyc2lvbiwgd2ViTW9kdWxlVHlwZSk7Ci0gICByZXR1cm4gaXNWYWxpZDsKLSAgfQotICAvKgotICAgKiBSZXR1cm5zIHRydWUgaWYgYSBjb250YWlucyBiLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zU3RyaW5nKFN0cmluZ1tdIGEsIFN0cmluZyBiKQotICB7Ci0gICAgaWYgKGE9PW51bGwgfHwgYS5sZW5ndGg8MCB8fCBiID09IG51bGwgfHwgYi5sZW5ndGgoKT09MCApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZm9yIChpbnQgaT0wOyBpPGEubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHMgPSBhW2ldOwotICAgICAgaWYgKHMuZXF1YWxzKGIpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0ZpbmlzaEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9GaW5pc2hGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjAzZWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0ZpbmlzaEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoVGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmluaXNoRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci0gIHB1YmxpYyBGaW5pc2hGcmFnbWVudCgpCi0gIHsJCi0JYWRkKG5ldyBGaW5pc2hUZXN0RnJhZ21lbnQoKSApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9TZXJ2ZXJTZWxlY3Rpb25VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vU2VydmVyU2VsZWN0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1YzEwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9TZXJ2ZXJTZWxlY3Rpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5JU2VydmVyVGFyZ2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5TZXJ2ZXJUYXJnZXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5JU2VydmVyRGVmYXVsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uU2VydmVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJTZWxlY3Rpb25VdGlscwotewotICAvKgotICAgKiBSZXR1cm5zIHJlYXNvbmFibGUgZGVmYXVsdHMgZm9yIHNlcnZlciBmYWN0b3J5IGlkIGFuZCBpbnN0YW5jZSBpZCBiYXNlZCBvbiAKLSAgICogYW4gZXhpc3RpbmcgcHJvamVjdAotICAgKiBpbmRleCBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBpbmRleFsxXSBjb250YWlucyBpbnN0YW5jZSBJZC4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJZCwgYm9vbGVhbiBhc2tFeHRlbmRlcnMpCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gbmV3IFN0cmluZ1syXTsgLy9zZXJ2ZXJJbmZwWzBdIGNvbnRhaW5zIGZhY3RvcnlJZCwgc2VydmVySW5mb1sxXSBjb250YWlucyBpbnN0YW5jZSBJZAotCi0gICAgLy8gSWYgdGhlIHByb2plY3QgaGFzIGJlZW4gYWRkZWQgdG8gYW4gZXhpc3Rpbmcgc2VydmVyLCBwaWNrIHRoYXQgc2VydmVyCi0gICAgSVNlcnZlcltdIGNvbmZpZ3VyZWRTZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb25maWd1cmVkU2VydmVycywgdHlwZUlkICk7Ci0gICAgaWYgKGZpcnN0U3VwcG9ydGVkU2VydmVyICE9IG51bGwpCi0gICAgewotICAgICAgc2VydmVySW5mb1swXSA9IGZpcnN0U3VwcG9ydGVkU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkU2VydmVyLmdldElkKCk7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIAkKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLy9Eb2VzIHRoZSBwcm9qZWN0IGhhdmUgYSBydW50aW1lLXRhcmdldD8KLSAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gZ2V0UnVudGltZVRhcmdldChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL0xvb2sgZm9yIGFuIGV4aXN0aW5nIHNlcnZlciB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHJ1bnRpbWUtdGFyZ2V0Ci0gICAgICBJU2VydmVyW10gY29tcGF0aWJsZVNlcnZlcnMgPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXJzKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgaWYgKGNvbXBhdGlibGVTZXJ2ZXJzIT1udWxsICYmIGNvbXBhdGlibGVTZXJ2ZXJzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXIgZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihjb21wYXRpYmxlU2VydmVycywgdHlwZUlkKTsKLSAgICAgICAgaWYgKGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IGZpcnN0U3VwcG9ydGVkQ29tcGF0U2VydmVyLmdldElkKCk7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgICAgCi0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgCi0gICAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyIHdhcyBmb3VuZC4gQ2hvb3NlIGEgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4KLSAgICAgIAotICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIHNlcnZlciBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByb2plY3QncyBydW50aW1lIHRhcmdldCwgdXNlIGl0LgotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGN0eCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgICAgIFN0cmluZyBwRmFjdG9yeUlkID0gY3R4LmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUocEZhY3RvcnlJZCk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCl7Ci0gICAgICAJU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgCWlmIChzZXJ2ZXJSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKSkKLSAgICAgIAl7Ci0gICAgICAJICBzZXJ2ZXJJbmZvWzBdID0gcEZhY3RvcnlJZDsKLSAgICAgIAkgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCX0KLSAgICAgIH0gICAgIAotICAgICAgCi0gICAgICAvL1RoZSBwcmVmZXJyZWQgc2VydmVyIHdhcyBub3QgY29tcGF0aWJsZS4gUGljayB0aGUgZmlyc3QgdmFsaWQgY29tcGF0aWJsZSBzZXJ2ZXIgdHlwZS4KLSAgICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZVRhcmdldCwgdHlwZUlkKTsKLSAgICAgIGlmIChmYWN0b3J5SWQgIT0gbnVsbCkgc2VydmVySW5mb1swXSA9IGZhY3RvcnlJZDsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotCi0gICAgfQotICAgIAotICAgIGlmIChhc2tFeHRlbmRlcnMpCi0gICAgewotICAgICAgU2VydmVySW5mbyByZWNvbW1lbmRlZFNlcnZlckluZm8gPSBnZXRFeHRlbmRlclJlY29tbWVuZGF0aW9uKHByb2plY3QpOwotICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mbyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCkubGVuZ3RoKCk+MCkKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzBdID0gcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkhPW51bGwgJiYgcmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMV0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpOyAKLQotICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLQotICAgIH0KLSAgICAKLSAgICAvL1VzZSBTZXJ2ZXJUYXJnZXRIZWxwZXIgdG8gZ2V0IGEgbGlzdCBvZiB2YWxpZCBydW50aW1lLXRhcmdldHMgYW5kIHVzZSB0aGVzZSB0byBkZXRlcm1pbmUgYSBkZWZhdWx0IHNlcnZlciB0eXBlLgotICAgIFN0cmluZ1tdIHByb2plY3RBdHRycyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRQcm9qZWN0VHlwZUFuZEoyRUVMZXZlbChwcm9qZWN0KTsKLSAgICBMaXN0IHJ1bnRpbWVzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFNlcnZlclRhcmdldHMocHJvamVjdEF0dHJzWzBdLCBwcm9qZWN0QXR0cnNbMV0pOwotICAgIFN0cmluZ1tdIGNvbXBhdFNlcnZlckluZm8gPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIocnVudGltZXMsdHlwZUlkKTsgCi0gICAgaWYgKCBjb21wYXRTZXJ2ZXJJbmZvICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGNvbXBhdFNlcnZlckluZm87Ci0gICAgfQotICAgIAotICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIsIHBpY2sgYSB0eXBlLgotICAgIFN0cmluZyBmYWN0b3J5SWQgPSBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUocnVudGltZXMsIHR5cGVJZCk7Ci0gICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsKSBzZXJ2ZXJJbmZvWzBdID0gZmFjdG9yeUlkOyAKLSAgICByZXR1cm4gc2VydmVySW5mbzsgICAKLSAgICAKLSAgfQotCi0gIC8qCi0gICAqIFJldHVybnMgcmVhc29uYWJsZSBkZWZhdWx0cyBmb3Igc2VydmVyIGZhY3RvcnkgaWQgYW5kIGluc3RhbmNlIGlkIGJhc2VkIG9uIAotICAgKiBhbiBleGlzdGluZyBwcm9qZWN0Ci0gICAqIGluZGV4IFswXSBjb250YWlucyBmYWN0b3J5SWQsIGluZGV4WzFdIGNvbnRhaW5zIGluc3RhbmNlIElkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZUlkLCBib29sZWFuIGFza0V4dGVuZGVycykKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOyAvL3NlcnZlckluZnBbMF0gY29udGFpbnMgZmFjdG9yeUlkLCBzZXJ2ZXJJbmZvWzFdIGNvbnRhaW5zIGluc3RhbmNlIElkCi0KLSAgICAvLyBJZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBhZGRlZCB0byBhbiBleGlzdGluZyBzZXJ2ZXIsIHBpY2sgdGhhdCBzZXJ2ZXIKLSAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbmZpZ3VyZWRTZXJ2ZXJzLCB0eXBlSWQgKTsKLSAgICBpZiAoZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXJ2ZXJJbmZvWzBdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgCQotICAgIH0KLSAgICAKLSAgICAKLSAgICAvL0RvZXMgdGhlIHByb2plY3QgaGF2ZSBhIHJ1bnRpbWUtdGFyZ2V0PwotICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBnZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICBpZiAocnVudGltZVRhcmdldCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vTG9vayBmb3IgYW4gZXhpc3Rpbmcgc2VydmVyIHdoaWNoIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVudGltZS10YXJnZXQKLSAgICAgIElTZXJ2ZXJbXSBjb21wYXRpYmxlU2VydmVycyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcnMocnVudGltZVRhcmdldCk7Ci0gICAgICBpZiAoY29tcGF0aWJsZVNlcnZlcnMhPW51bGwgJiYgY29tcGF0aWJsZVNlcnZlcnMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbXBhdGlibGVTZXJ2ZXJzLCB0eXBlSWQpOwotICAgICAgICBpZiAoZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSBmaXJzdFN1cHBvcnRlZENvbXBhdFNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gZmlyc3RTdXBwb3J0ZWRDb21wYXRTZXJ2ZXIuZ2V0SWQoKTsKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgICAgICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vTm8gZXhpc3RpbmcgY29tcGF0aWJsZSBzZXJ2ZXIgd2FzIGZvdW5kLiBDaG9vc2UgYSBjb21wYXRpYmxlIHNlcnZlciB0eXBlLgotICAgICAgCi0gICAgICAvL0lmIHRoZSBwcmVmZXJyZWQgc2VydmVyIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvamVjdCdzIHJ1bnRpbWUgdGFyZ2V0LCB1c2UgaXQuCi0gICAgICBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY3R4ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgICAgU3RyaW5nIHBGYWN0b3J5SWQgPSBjdHguZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShwRmFjdG9yeUlkKTsKLSAgICAgIGlmIChzZXJ2ZXJUeXBlIT1udWxsKXsKLSAgICAgIAlTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAJaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpKQotICAgICAgCXsKLSAgICAgIAkgIHNlcnZlckluZm9bMF0gPSBwRmFjdG9yeUlkOwotICAgICAgCSAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAJfQotICAgICAgfSAgICAgCi0gICAgICAKLSAgICAgIC8vVGhlIHByZWZlcnJlZCBzZXJ2ZXIgd2FzIG5vdCBjb21wYXRpYmxlLiBQaWNrIHRoZSBmaXJzdCB2YWxpZCBjb21wYXRpYmxlIHNlcnZlciB0eXBlLgotICAgICAgU3RyaW5nIGZhY3RvcnlJZCA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShydW50aW1lVGFyZ2V0LCB0eXBlSWQpOwotICAgICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsKSBzZXJ2ZXJJbmZvWzBdID0gZmFjdG9yeUlkOwotICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGFza0V4dGVuZGVycykKLSAgICB7Ci0gICAgICBTZXJ2ZXJJbmZvIHJlY29tbWVuZGVkU2VydmVySW5mbyA9IGdldEV4dGVuZGVyUmVjb21tZW5kYXRpb24ocHJvamVjdCk7Ci0gICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpIT1udWxsICYmIHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJGYWN0b3J5SWQoKS5sZW5ndGgoKT4wKQotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAocmVjb21tZW5kZWRTZXJ2ZXJJbmZvLmdldFNlcnZlckluc3RhbmNlSWQoKSE9bnVsbCAmJiByZWNvbW1lbmRlZFNlcnZlckluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpLmxlbmd0aCgpPjApCi0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IHJlY29tbWVuZGVkU2VydmVySW5mby5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7IAotCi0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgfQotCi0gICAgfQotICAgIAotICAgIC8vVXNlIFNlcnZlclRhcmdldEhlbHBlciB0byBnZXQgYSBsaXN0IG9mIHZhbGlkIHJ1bnRpbWUtdGFyZ2V0cyBhbmQgdXNlIHRoZXNlIHRvIGRldGVybWluZSBhIGRlZmF1bHQgc2VydmVyIHR5cGUuCi0gICAgU3RyaW5nW10gcHJvamVjdEF0dHJzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFByb2plY3RUeXBlQW5kSjJFRUxldmVsKHByb2plY3QpOwotICAgIExpc3QgcnVudGltZXMgPSBTZXJ2ZXJUYXJnZXRIZWxwZXIuZ2V0U2VydmVyVGFyZ2V0cyhwcm9qZWN0QXR0cnNbMF0sIHByb2plY3RBdHRyc1sxXSk7Ci0gICAgTGlzdCBzdXBwUnVudGltZXMgPSBnZXRSdW50aW1lVGFyZ2V0c1N1cHBvcnRlZEJ5V1NSdW50aW1lKHJ1bnRpbWVzLCBydW50aW1lSWQpOwotICAgIFN0cmluZ1tdIGNvbXBhdFNlcnZlckluZm8gPSBnZXRDb21wYXRpYmxlRXhpc3RpbmdTZXJ2ZXIoc3VwcFJ1bnRpbWVzLHR5cGVJZCk7IAotICAgIGlmICggY29tcGF0U2VydmVySW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBjb21wYXRTZXJ2ZXJJbmZvOwotICAgIH0KLSAgICAKLSAgICAvL05vIGV4aXN0aW5nIGNvbXBhdGlibGUgc2VydmVyLCBwaWNrIGEgdHlwZS4KLSAgICBTdHJpbmcgZmFjdG9yeUlkID0gZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKHN1cHBSdW50aW1lcywgdHlwZUlkKTsKLSAgICBpZiAoZmFjdG9yeUlkICE9IG51bGwpIHNlcnZlckluZm9bMF0gPSBmYWN0b3J5SWQ7IAotICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgIAotICAgIAotICB9Ci0gIAotICAvKgotICAgKiBHaXZlbiBhIGxpc3Qgb2YgZXhpc3Rpbmcgc2VydmVycywgdGhpcyByZXR1cm5zIHRoZSBmaXJzdCBvbmUgdGhhdCBpcyBzdXBwb3J0ZWQKLSAgICogYnkgdGhlIGdpdmVuIFdlYiBzZXJ2aWNlIHR5cGUgaWQuIAotICAgKiBSZXR1cm5zIG51bGwgb2YgdGhlcmUgYXJlIG5vIHN1cHBvcnRlZCBzZXJ2ZXJzIGluIHRoZSBhcnJheS4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlcihJU2VydmVyW10gc2VydmVycywgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIGlmIChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICBpZiAod3NzcnRSZWdpc3RyeS5pc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUodHlwZUlkLCBzZXJ2ZXJGYWN0b3J5SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlcnNbaV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotICAKLSAgLyoKLSAgICogUmV0dXJucyB0aGUgZmFjdG9yeSBpZCBvZiBhIHNlcnZlciB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgV2ViIHNlcnZpY2UgdHlwZSBhbmQgdGhlIHJ1bnRpbWUgdGFyZ2V0LgotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaXJzdFN1cHBvcnRlZFNlcnZlclR5cGUoSVJ1bnRpbWUgcnVudGltZVRhcmdldCwgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZyBydW50aW1lSWQgPSBydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZ2lzdHJ5ID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJGYWN0b3J5SWRzID0gd3NzcnRSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHR5cGVJZCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlckZhY3RvcnlJZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkc1tpXSk7Ci0gICAgICBpZiAoc2VydmVyVHlwZSE9bnVsbCl7Ci0gICAgICAJU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgCWlmIChzZXJ2ZXJSdW50aW1lSWQuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICAJewotICAgICAgCQlyZXR1cm4gc2VydmVyRmFjdG9yeUlkc1tpXTsKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKgotICAgKiBSZXR1cm4gdGhlIGZhY3RvcnkgaWQgb2YgdGhlIGZpcnN0IHNlcnZlciB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgcnVudGltZVRhcmdldHMgYW5kIHR5cGVJZC4KLSAgICogUmV0dXJucyBudWxsIGlmIHRoZXJlIGFyZSBub25lLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXJUeXBlKExpc3QgcnVudGltZVRhcmdldHMsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZVRhcmdldHMuc2l6ZSgpOyBpKysgKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSAoSVJ1bnRpbWUpcnVudGltZVRhcmdldHMuZ2V0KGkpOwotICAgICAgU3RyaW5nIGZhY3RvcnlJZCA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyVHlwZShydW50aW1lVGFyZ2V0LCB0eXBlSWQpOwotICAgICAgaWYgKGZhY3RvcnlJZCAhPSBudWxsICYmIGZhY3RvcnlJZC5sZW5ndGgoKT4wKQotICAgICAgICByZXR1cm4gZmFjdG9yeUlkOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZ2V0UnVudGltZVRhcmdldChTdHJpbmcgcHJvamVjdE5hbWUpCi0gIHsKLSAgCWlmKCBwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCApeyAvLyROT04tTkxTLTEkCi0gIAkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gIAkJaWYoIHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICl7Ci0gIAkJCXJldHVybiBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsgCi0gIAkJfQotICAJfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRGaXJzdEV4aXN0aW5nU2VydmVyRnJvbUZhY3RvcnlJZChTdHJpbmcgZmFjdG9yeUlkKQotICB7Ci0gIAlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAJaWYgKHNlcnZlcnM9PW51bGwgfHwgc2VydmVycy5sZW5ndGghPTApCi0gICAgICAgIHJldHVybiBudWxsOwotICAJZWxzZQotICAJewotICAJICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgCSAgewotICAJICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpc2VydmVyc1tpXTsKLSAgCSAgICBpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFscyhmYWN0b3J5SWQpKQotICAJICAgIHsKLSAgCSAgICAgIHJldHVybiBzZXJ2ZXI7Ci0gIAkgICAgfQotICAJICB9Ci0gIAl9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVNlcnZlcltdIGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcnMoSVJ1bnRpbWUgcnVudGltZSkKLSAgewotICAgIGlmIChydW50aW1lID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotICAgIGlmIChzZXJ2ZXJzPT1udWxsIHx8IHNlcnZlcnMubGVuZ3RoPT0wKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgQXJyYXlMaXN0IGNvbXBhdGlibGVTZXJ2ZXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBTdHJpbmcgcnVudGltZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgU3RyaW5nIHNlcnZlclJ1bnRpbWVJZCA9IHNlcnZlci5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgaWYgKHNlcnZlclJ1bnRpbWVJZC5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgICAgY29tcGF0aWJsZVNlcnZlcnNMaXN0LmFkZChzZXJ2ZXIpOwotICAgICAgCi0gICAgfQotICAgIGlmIChjb21wYXRpYmxlU2VydmVyc0xpc3Quc2l6ZSgpPDEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAKLSAgICBPYmplY3RbXSBjb21wYXRpYmxlU2VydmVyc0FycmF5ID0gY29tcGF0aWJsZVNlcnZlcnNMaXN0LnRvQXJyYXkoKTsKLSAgICBJU2VydmVyW10gY29tcGF0aWJsZVNlcnZlcnMgPSBuZXcgSVNlcnZlcltjb21wYXRpYmxlU2VydmVyc0FycmF5Lmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaj0wOyBqPGNvbXBhdGlibGVTZXJ2ZXJzQXJyYXkubGVuZ3RoOyBqKyspCi0gICAgewotICAgICAgY29tcGF0aWJsZVNlcnZlcnNbal0gPSAoSVNlcnZlciljb21wYXRpYmxlU2VydmVyc0FycmF5W2pdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY29tcGF0aWJsZVNlcnZlcnM7Ci0gIH0KLSAgCi0gIAotICAvKgotICAgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IElkIGFuZCBpbnN0YW5jZSBpZCBvZiB0aGUgZmlyc3QgZXhpdGluZyBzZXJ2ZXIgY29tcGF0aWJsZQotICAgKiB3aXRoIHRoZSBydW50aW1lIHRhcmdldHMgYW5kIHR5cGVJZAotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vbmUuCi0gICAqIFRoZSBpdGVtIGF0IFswXSBpcyB0aGUgZmFjdG9yeSBpZC4KLSAgICogVGhlIGl0ZW0gYXQgWzFdIGlzIHRoZSBpbnN0YW5jZSBpZC4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVyKExpc3QgcnVudGltZVRhcmdldHMsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gbmV3IFN0cmluZ1syXTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZVRhcmdldHMuc2l6ZSgpOyBpKysgKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSAoSVJ1bnRpbWUpcnVudGltZVRhcmdldHMuZ2V0KGkpOwotICAgICAgSVNlcnZlcltdIGV4aXN0aW5nQ29tcGF0U2VydmVycyA9IGdldENvbXBhdGlibGVFeGlzdGluZ1NlcnZlcnMocnVudGltZVRhcmdldCk7Ci0gICAgICBJU2VydmVyIGNvbXBhdFNlcnZlciA9IGdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGV4aXN0aW5nQ29tcGF0U2VydmVycywgdHlwZUlkKTsKLSAgICAgIGlmIChjb21wYXRTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2VydmVySW5mb1swXSA9IGNvbXBhdFNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgc2VydmVySW5mb1sxXSA9IGNvbXBhdFNlcnZlci5nZXRJZCgpOwotICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU2VydmVySW5mbyBnZXRFeHRlbmRlclJlY29tbWVuZGF0aW9uKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iLCAic2VydmVyRGVmYXVsdGVyIik7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE9iamVjdCBzZXJ2ZXJEZWZhdWx0ZXJPYmplY3QgPSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgaWYgKHNlcnZlckRlZmF1bHRlck9iamVjdCBpbnN0YW5jZW9mIElTZXJ2ZXJEZWZhdWx0ZXIpCi0gICAgICB7Ci0gICAgICAgIElTZXJ2ZXJEZWZhdWx0ZXIgc2VydmVyRGVmYXVsdGVyID0gKElTZXJ2ZXJEZWZhdWx0ZXIpc2VydmVyRGVmYXVsdGVyT2JqZWN0OwotICAgICAgICBTZXJ2ZXJJbmZvIHNlcnZlckluZm8gPSBzZXJ2ZXJEZWZhdWx0ZXIucmVjb21tZW5kRGVmYXVsdFNlcnZlcihwcm9qZWN0KTsKLSAgICAgICAgaWYgKHNlcnZlckluZm8gIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gcnVudGltZVRhcmdldHMKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VSdW50aW1lSWQKLSAgICogQHJldHVybgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRSdW50aW1lVGFyZ2V0c1N1cHBvcnRlZEJ5V1NSdW50aW1lKExpc3QgcnVudGltZVRhcmdldHMsIFN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkKQotICB7Ci0gICAgQXJyYXlMaXN0IHN1cHBSdW50aW1lVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHJ1bnRpbWVUYXJnZXRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSAoSVJ1bnRpbWUpcnVudGltZVRhcmdldHMuZ2V0KGkpOwotICAgICAgU3RyaW5nIHJ0SWQgPSBydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIGlmICh3c3NydFJlZy5kb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQocnRJZCwgd2ViU2VydmljZVJ1bnRpbWVJZCkpOwotICAgICAgewotICAgICAgICBzdXBwUnVudGltZVRhcmdldHMuYWRkKHJ1bnRpbWVUYXJnZXQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VwcFJ1bnRpbWVUYXJnZXRzOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gZ2V0IGEgc2VydmVyIGZhY3RvcnkgaWQgYW5kIGluc3RhbmNlIGlkIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBnaXZlbiBXZWIKLSAgICogc2VydmljZSBydW50aW1lLgotICAgKiBAcGFyYW0gd2ViU2VydmljZVJ1bnRpbWVJZAotICAgKiBAcGFyYW0gajJlZVZlcnNpb24gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnQgdmFsdWVzIGluIEoyRUVWZXJzaW9uQ29uc3RhbnRzIGkuZS4gIjEyIiwgIjEzIiwgIjE0IgotICAgKiBAcmV0dXJuIFN0cmluZ1tdIGluZGV4IFswXSBjb250YWlucyBmYWN0b3J5SWQsIGluZGV4WzFdIGNvbnRhaW5zIGluc3RhbmNlIElkLgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGcm9tV2ViU2VydmNlUnVudGltZUFuZEoyRUUoU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQsIFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBuZXcgU3RyaW5nWzJdOwotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvL0dldCBhbGwgcG9zc2libGUgdmFsaWQgc2VydmVycy4gSWYgdGhlcmUgYXJlIG5vbmUsIHdlIGNhbid0IGRlZmF1bHQgaW50ZWxsaWdlbnRseSwgcmV0dXJuIG51bGwuCi0gICAgU3RyaW5nW10gdmFsaWRTZXJ2ZXJGYWN0b3J5SWRzID0gd3NzcnRSZWcuZ2V0U2VydmVyRmFjdG9yeUlEQnlSdW50aW1lSUQod2ViU2VydmljZVJ1bnRpbWVJZCk7Ci0gICAgaWYgKHZhbGlkU2VydmVyRmFjdG9yeUlkcz09bnVsbCB8fCB2YWxpZFNlcnZlckZhY3RvcnlJZHMubGVuZ3RoPDEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAvL0dldCBhbGwgZXhpc3Rpbmcgc2VydmVycwotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7IC8vR2V0IGFsbCBleGlzdGluZyBzZXJ2ZXJzCi0gICAgCi0gICAgLy9HZXQgdGhlIHByZWZlcnJlZCBzZXJ2ZXIuCi0gIAlQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLSAgCVN0cmluZyBwcmVmU2VydmVyRmFjdG9yeUlkID0gY29udGV4dC5nZXRTZXJ2ZXJGYWN0b3J5SWQoKTsKLSAgCQotICAgIGJvb2xlYW4gcHJlZmVycmVkSXNWYWxpZCA9ICBjb250YWluc1N0cmluZyh2YWxpZFNlcnZlckZhY3RvcnlJZHMsIHByZWZTZXJ2ZXJGYWN0b3J5SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzU2VydmVyVmFsaWQocHJlZlNlcnZlckZhY3RvcnlJZCwgajJlZVZlcnNpb24pOwotICAgIGlmIChwcmVmZXJyZWRJc1ZhbGlkKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICAgIFN0cmluZyB0aGlzRmFjdG9yeUlkID0gc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHRoaXNGYWN0b3J5SWQuZXF1YWxzKHByZWZTZXJ2ZXJGYWN0b3J5SWQpKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVySW5mb1swXSA9IHByZWZTZXJ2ZXJGYWN0b3J5SWQ7Ci0gICAgICAgICAgc2VydmVySW5mb1sxXSA9IHNlcnZlci5nZXRJZCgpOwotICAgICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgfSAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0VpdGhlciB0aGUgcHJlZmVycmVkIHNlcnZlciB3YXMgbm90IHZhbGlkIG9yIGl0IHdhcyB2YWxpZCBidXQgZG9lcyBub3QgZXhpc3QuCi0gICAgLy9DaGVjayB0aGUgZXhpc3Rpbmcgc2VydmVycyBmb3IgdmFsaWRpdHkKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBTdHJpbmcgdGhpc0ZhY3RvcnlJZCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAgIAotICAgICAgYm9vbGVhbiB0aGlzU2VydmVyVmFsaWQgPSBjb250YWluc1N0cmluZyh2YWxpZFNlcnZlckZhY3RvcnlJZHMsIHRoaXNGYWN0b3J5SWQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1NlcnZlclZhbGlkKHRoaXNGYWN0b3J5SWQsIGoyZWVWZXJzaW9uKTsKLSAgICAgIGlmICh0aGlzU2VydmVyVmFsaWQpCi0gICAgICB7Ci0gICAgICAgIHNlcnZlckluZm9bMF0gPSB0aGlzRmFjdG9yeUlkOwotICAgICAgICBzZXJ2ZXJJbmZvWzFdID0gc2VydmVyLmdldElkKCk7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJJbmZvOyAgICAgICAgCi0gICAgICB9Ci0gICAgfSAgICAgICAgICAKLQotICAgIC8vTm9uZSBvZiB0aGUgZXhpc3Rpbmcgc2VydmVycyBpcyB2YWxpZC4gUGljayB0aGUgcHJlZmVycmVkIG9uZSBpZiB2YWxpZC4gT3RoZXJ3aXNlLCBwaWNrIHRoZQotICAgIC8vZmlyc3QgdmFsaWQgc2VydmVyIHR5cGUuCi0gICAgaWYgKHByZWZlcnJlZElzVmFsaWQpCi0gICAgewotICAgICAgc2VydmVySW5mb1swXSA9IHByZWZTZXJ2ZXJGYWN0b3J5SWQ7Ci0gICAgICByZXR1cm4gc2VydmVySW5mbzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDsgaTx2YWxpZFNlcnZlckZhY3RvcnlJZHMubGVuZ3RoOyBpKysgKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzVmFsaWQgPSBpc1NlcnZlclZhbGlkKHZhbGlkU2VydmVyRmFjdG9yeUlkc1tpXSwgajJlZVZlcnNpb24pOwotICAgICAgICBpZiAoaXNWYWxpZCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlckluZm9bMF0gPSB2YWxpZFNlcnZlckZhY3RvcnlJZHNbMF07Ci0gICAgICAgICAgcmV0dXJuIHNlcnZlckluZm87Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgLy9XZSBjYW4ndCBkZXRlcm1pbmUgYSB2YWxpZCBzZXJ2ZXIgc2VsZWN0aW9uLiBSZXR1cm4gbnVsbC4KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NlcnZlclZhbGlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAgaWYgKHNlcnZlckZhY3RvcnlJZD09bnVsbCB8fCBzZXJ2ZXJGYWN0b3J5SWQubGVuZ3RoKCk9PTAgfHwgajJlZVZlcnNpb249PW51bGwgfHwgajJlZVZlcnNpb24ubGVuZ3RoKCk9PTApCi0gICAgIHJldHVybiB0cnVlOwotICAgCi0gICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0UnVudGltZVRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQpOwotICAgaWYgKHJ1bnRpbWVUYXJnZXRJZCA9PSBudWxsIHx8IHJ1bnRpbWVUYXJnZXRJZC5sZW5ndGgoKT09MCkKLSAgICAgcmV0dXJuIGZhbHNlOwotICAgU3RyaW5nIHdlYk1vZHVsZVR5cGUgPSBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLldFQl9UWVBFOwotICAgYm9vbGVhbiBpc1ZhbGlkID0gU2VydmVyVXRpbHMuaXNUYXJnZXRWYWxpZEZvclByb2plY3RUeXBlKHJ1bnRpbWVUYXJnZXRJZCwgajJlZVZlcnNpb24sIHdlYk1vZHVsZVR5cGUpOwotICAgcmV0dXJuIGlzVmFsaWQ7Ci0gIH0KLSAgLyoKLSAgICogUmV0dXJucyB0cnVlIGlzIGEgY29udGFpbnMgYiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc1N0cmluZyhTdHJpbmdbXSBhLCBTdHJpbmcgYikKLSAgewotICAgIGlmIChhPT1udWxsIHx8IGEubGVuZ3RoPDAgfHwgYiA9PSBudWxsIHx8IGIubGVuZ3RoKCk9PTAgKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGZvciAoaW50IGk9MDsgaTxhLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBzID0gYVtpXTsKLSAgICAgIGlmIChzLmVxdWFscyhiKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vVmFsaWRhdGlvblV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9WYWxpZGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhMDc2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9WYWxpZGF0aW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXIuV2ViU2VydmljZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwuV2ViU2VydmljZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblV0aWxzCi17Ci0gIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvblV0aWxzKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEOyAvLyJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVByb2plY3RUYXJnZXRBbmRKMkVFKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNvbXBOYW1lLCBTdHJpbmcgZWFyTmFtZSwgU3RyaW5nIGVhckNvbXBOYW1lLCBTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgajJlZUxldmVsKQotICB7Ci0gICAgSVByb2plY3QgcCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgSVByb2plY3QgZWFyUCA9IG51bGw7Ci0gICAgaWYgKGVhck5hbWUhPW51bGwgJiYgIWVhck5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiIikpIHsKLSAgICAJZWFyUCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlYXJOYW1lKTsKLSAgICB9Ci0gICAgU3RhdHVzIHRhcmdldFN0YXR1cyA9IGRvZXNQcm9qZWN0VGFyZ2V0TWF0Y2hTZXJ2ZXJUeXBlKHAsIHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgaWYgKGVhclAhPW51bGwgJiYgdGFyZ2V0U3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICAvL2NoZWNrIHRoZSBFQVIgICAgICAKLSAgICAgIFN0YXR1cyBlYXJUYXJnZXRTdGF0dXMgPSBkb2VzUHJvamVjdFRhcmdldE1hdGNoU2VydmVyVHlwZShlYXJQLCBzZXJ2ZXJGYWN0b3J5SWQpOwotICAgICAgaWYoZWFyVGFyZ2V0U3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVhclRhcmdldFN0YXR1czsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiB0YXJnZXRTdGF0dXM7Ci0gICAgfQotICAgIAotCi0gICAgLy9WYWxpZGF0ZSBzZXJ2aWNlIHNpZGUgSjJFRSBsZXZlbCAgICAKLSAgICBTdGF0dXMgajJlZVN0YXR1cyA9IGRvZXNQcm9qZWN0TWF0Y2hKMkVFTGV2ZWwocCwgY29tcE5hbWUsIGoyZWVMZXZlbCk7Ci0gICAgaWYoZWFyUCE9bnVsbCAmJiBqMmVlU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICBTdGF0dXMgZWFySjJFRVN0YXR1cyA9IGRvZXNQcm9qZWN0TWF0Y2hKMkVFTGV2ZWwoZWFyUCwgZWFyQ29tcE5hbWUsIGoyZWVMZXZlbCk7Ci0gICAgICBpZihlYXJKMkVFU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVhckoyRUVTdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gajJlZVN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwcml2YXRlIFN0YXR1cyBkb2VzUHJvamVjdFRhcmdldE1hdGNoU2VydmVyVHlwZShJUHJvamVjdCBwLCBTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgaWYgKHAhPW51bGwgJiYgcC5leGlzdHMoKSkKLSAgICB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiUC5nZXROYW1lID0gIitwLmdldE5hbWUoKSk7Ci0gICAgICBJUnVudGltZSBwcm9qZWN0VGFyZ2V0ID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0UnVudGltZVRhcmdldChwLmdldE5hbWUoKSk7Ci0gICAgICBpZiAocHJvamVjdFRhcmdldCE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3RUYXJnZXRJZCA9IHByb2plY3RUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICBTdHJpbmcgc2VydmVyVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgICAgIGlmIChzZXJ2ZXJUYXJnZXRJZCE9bnVsbCAmJiBzZXJ2ZXJUYXJnZXRJZC5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoIXByb2plY3RUYXJnZXRJZC5lcXVhbHMoc2VydmVyVGFyZ2V0SWQpKQotICAgICAgICAgIHsgCi0gICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfU0VSVkVSX1RBUkdFVF9NSVNNQVRDSCIsbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpfSksU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAgICAgICAgCi0gIH0KLQotICBwcml2YXRlIFN0YXR1cyBkb2VzUHJvamVjdE1hdGNoSjJFRUxldmVsKElQcm9qZWN0IHAsIFN0cmluZyBjb21wTmFtZSwgU3RyaW5nIGoyZWVMZXZlbCkKLSAgewotCi0gICAgdHJ5IHsKLQkJaWYgKHAhPW51bGwgJiYgcC5leGlzdHMoKSkKLQkJewotICAJICBpbnQgcHJvamVjdEoyRUVMZXZlbCA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwLCBjb21wTmFtZSk7Ci0JCSAgaWYgKHByb2plY3RKMkVFTGV2ZWwhPS0xKQotCQkgIHsKLQkJICAgIFN0cmluZyBwcm9qZWN0SjJFRUxldmVsU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YocHJvamVjdEoyRUVMZXZlbCk7Ci0JCSAgICBpZiAoajJlZUxldmVsIT1udWxsICYmIGoyZWVMZXZlbC5sZW5ndGgoKT4wKQotCQkgICAgewotCQkgICAgICBpZiAoIXByb2plY3RKMkVFTGV2ZWxTdHJpbmcuZXF1YWxzKGoyZWVMZXZlbCkpCi0JCSAgICAgIHsKLQkJICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfSjJFRV9NSVNNQVRDSCIsbmV3IFN0cmluZ1tde3AuZ2V0TmFtZSgpfSksIFN0YXR1cy5FUlJPUik7Ci0JCSAgICAgIH0KLQkJICAgIH0KLQkJICB9Ci0JCX0KLQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLSAgICAKLSAgfQotICAgIAotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsgICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlUHJvamVjdFR5cGUoU3RyaW5nIHByb2plY3ROYW1lLCBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBydW50aW1lMkNsaWVudFR5cGVzKQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIElQcm9qZWN0IHAgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShwcm9qZWN0TmFtZSkpOwotICAgIGlmIChwPT1udWxsIHx8ICFwLmV4aXN0cygpKQotICAgIHsKLSAgICAgIC8vUHJvamVjdCBkb2VzIG5vdCBleGlzdCB3aGljaCBtZWFucyBhIG5ldyBwcm9qZWN0IG9mIHRoZSBjb3JyZWN0IHR5cGUgd2lsbCBiZSBjcmVhdGVkCi0gICAgICAvL1dlJ3JlIGRvbmUuIEFsbCBpcyBnb29kLgotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgICAKLSAgICAvL0lmIHRoZSBwcm9qZWN0IGV4aXN0cywgd2Ugc2hvdWxkIHNlZSBpdCBpbiB0aGUgcHJvamVjdCBsaXN0IGZvciB0aGUgc2VsZWN0ZWQgY2xpZW50Ci0gICAgLy9wcm9qZWN0IHR5cGUuCi0gICAgU3RyaW5nW10gcHJvamVjdE5hbWVzID0gcnVudGltZTJDbGllbnRUeXBlcy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpOwotICAgIGZvciAoaW50IGk9MDsgaTxwcm9qZWN0TmFtZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHByb2plY3ROYW1lLmVxdWFscyhwcm9qZWN0TmFtZXNbaV0pKQotICAgICAgewotICAgICAgICAvL0ZvdW5kIHRoZSBwcm9qZWN0LiBBbGwgaXMgZ29vZC4KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9EaWRuJ3QgZmluZCB0aGUgcHJvamVjdC4gUmV0dXJuIGFuIGVycm9yLgotICAgIC8vR2V0IHRoZSBsYWJlbCBmb3IgdGhlIGNsaWVudCB0eXBlIGlkCi0gICAgU3RyaW5nIGNsaWVudFR5cGVMYWJlbCA9IGdldENsaWVudFR5cGVMYWJlbChydW50aW1lMkNsaWVudFR5cGVzLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV1JPTkdfQ0xJRU5UX1BST0pFQ1RfVFlQRSIsbmV3IFN0cmluZ1tde3Byb2plY3ROYW1lLCBjbGllbnRUeXBlTGFiZWx9KTsKLSAgICBTdGF0dXMgZVN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbWVzc2FnZSxTdGF0dXMuRVJST1IpOwotICAgIHJldHVybiBlU3RhdHVzOwotICAgIAotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDbGllbnRUeXBlTGFiZWwoIFN0cmluZyB0eXBlICkKLSAgewotICAgIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkgcmVnaXN0cnkgICAgICAgICA9IENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgICAgIGNsaWVudFR5cGVMYWJlbCAgPSBudWxsOwotICAgIAotICAgIGNsaWVudFR5cGVMYWJlbCA9IHJlZ2lzdHJ5LmdldEVsZW1lbnRCeUlkKHR5cGUpLmdldEF0dHJpYnV0ZSgibGFiZWwiKTsKLSAgICAKLSAgICByZXR1cm4gY2xpZW50VHlwZUxhYmVsOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHAKLSAgICogQHBhcmFtIHdzZGxVUkwKLSAgICogQHBhcmFtIHBhcnNlcgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RTZXJ2aWNlUHJvamVjdChJUHJvamVjdCBwLCBTdHJpbmcgd3NkbFVSTCwgV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyKQotICB7Ci0gICAgaWYgKHA9PW51bGwgfHwgd3NkbFVSTD09bnVsbCB8fCB3c2RsVVJMLmxlbmd0aCgpPT0wIHx8IHBhcnNlcj09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBJUmVzb3VyY2Ugd3NYTUwgPSBnZXRXZWJTZXJ2Y2VzWE1MKHApOwotICAgIGlmICh3c1hNTD09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICAKLSAgICAgIC8vTWFrZSBhIGxpc3Qgb2YgYWxsIHRoZSB3c2RsLXBvcnQncyBpbiB3ZWJzZXJ2aWNlcy54bWwKLSAgICBXZWJTZXJ2aWNlc01hbmFnZXIgd3NtID0gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0gICAgLy9XZWJTZXJ2aWNlRWRpdE1vZGVsIHdzRWRpdE1vZGVsID0gd3NtLmdldFdTRWRpdE1vZGVsKHApOwotICAgIC8vV2ViU2VydmljZXMgd3MgPSB3c0VkaXRNb2RlbC5nZXRXZWJTZXJ2aWNlcygpOwotICAgIEl0ZXJhdG9yIHdzRGVzY3MgPSB3c20uZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlc0Rlc2NyaXB0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgQXJyYXlMaXN0IHdzZGxQb3J0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB3aGlsZSh3c0Rlc2NzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbil3c0Rlc2NzLm5leHQoKTsKLSAgICAgIEl0ZXJhdG9yIHBjcyA9IHdzRGVzYy5nZXRQb3J0Q29tcG9uZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShwY3MuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQb3J0Q29tcG9uZW50IHBjID0gKFBvcnRDb21wb25lbnQpcGNzLm5leHQoKTsKLSAgICAgICAgV1NETFBvcnQgd3NkbFBvcnQgPSBwYy5nZXRXc2RsUG9ydCgpOwotICAgICAgICB3c2RsUG9ydExpc3QuYWRkKG5ldyBRdWFsaWZpZWROYW1lKHdzZGxQb3J0LmdldE5hbWVzcGFjZVVSSSgpLCB3c2RsUG9ydC5nZXRMb2NhbFBhcnQoKSkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBBcnJheUxpc3QgcG9ydExpc3QgPSBnZXRQb3J0TmFtZXNGcm9tV3NkbCh3c2RsVVJMLCBwYXJzZXIpOwotCi0gICAgLy9JZiBhbnkgb2YgdGhlIFF1YWxpZmllZE5hbWVzIGluIHBvcnRMaXN0IGVxdWFscyBhbnkgb2YgdGhlIFF1YWxpZmllZE5hbWVzCi0gICAgLy9pbiB3c2RsUG9ydExpc3QsIHRoaXMgaXMgdGhlIHNlcnZpY2UgcHJvamVjdC4gUmV0dXJuIHRydWUuCi0gICAgT2JqZWN0W10gcG9ydHMgPSBwb3J0TGlzdC50b0FycmF5KCk7Ci0gICAgT2JqZWN0W10gd3NkbFBvcnRzID0gd3NkbFBvcnRMaXN0LnRvQXJyYXkoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvcnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFF1YWxpZmllZE5hbWUgcG9ydE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgcG9ydHNbaV07Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzZGxQb3J0cy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgUXVhbGlmaWVkTmFtZSB3c2RsUG9ydE5hbWUgPSAoUXVhbGlmaWVkTmFtZSkgd3NkbFBvcnRzW2pdOwotICAgICAgICBpZiAocG9ydE5hbWUuZXF1YWxzKHdzZGxQb3J0TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqIAotICAgKi8KLSAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0V2ViU2VydmNlc1hNTChJUHJvamVjdCBwKQotICB7Ci0JICAvLyAKLS8vICAgIEoyRUVOYXR1cmUgbmF0dXJlID0gKEoyRUVOYXR1cmUpIEoyRUVOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWUocCk7Ci0vLyAgICBpZiAobmF0dXJlID09IG51bGwpCi0vLyAgICAgIHJldHVybiBudWxsOwotCi0vLyAgICBJUmVzb3VyY2UgbW9kdWxlUm9vdCA9IG5hdHVyZS5nZXRNb2R1bGVTZXJ2ZXJSb290KCk7Ci0vLwlJUmVzb3VyY2UgbW9kdWxlUm9vdCA9IFJlc291cmNlVXRpbHMuZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChwKTsKLQlJUmVzb3VyY2UgbW9kdWxlUm9vdCA9IEoyRUVVdGlscy5nZXRGaXJzdFdlYkNvbnRlbnRDb250YWluZXIocCk7ICAKLSAgICBpZiAoIShtb2R1bGVSb290IGluc3RhbmNlb2YgSUNvbnRhaW5lcikpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIElSZXNvdXJjZSB3ZWJTZXJ2aWNlc1hNTD1udWxsOwotLy8gICAgaWYgKG5hdHVyZSBpbnN0YW5jZW9mIEoyRUVXZWJOYXR1cmVSdW50aW1lKQotCWlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwKSkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgd3NQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgd3NQYXRoLmFwcGVuZCgiV0VCLUlORi8iKTsKLSAgICAgIHdzUGF0aC5hcHBlbmQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX0REX1NIT1JUX05BTUUpOwotICAgICAgd2ViU2VydmljZXNYTUwgPSAoKElDb250YWluZXIpbW9kdWxlUm9vdCkuZmluZE1lbWJlcih3c1BhdGgudG9TdHJpbmcoKSk7IAotICAgIH0KLSAgICBlbHNlIC8vTXVzdCBiZSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgTW9kdWxlIG9yIGFuIEVKQiBNb2R1bGUKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgd3NQYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgd3NQYXRoLmFwcGVuZCgiTUVUQS1JTkYvIik7Ci0gICAgICB3c1BhdGguYXBwZW5kKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9ERF9TSE9SVF9OQU1FKTsKLSAgICAgIHdlYlNlcnZpY2VzWE1MID0gKChJQ29udGFpbmVyKW1vZHVsZVJvb3QpLmZpbmRNZW1iZXIod3NQYXRoLnRvU3RyaW5nKCkpOyAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiB3ZWJTZXJ2aWNlc1hNTDsKLSAgfQotICAKLSAgcHJpdmF0ZSBBcnJheUxpc3QgZ2V0UG9ydE5hbWVzRnJvbVdzZGwoU3RyaW5nIHdzZGxVUkwsIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcikKLSAgewotICAJQXJyYXlMaXN0IHBvcnROYW1lTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCURlZmluaXRpb24gZGVmID0gcGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgIE1hcCBzZXJ2aWNlcyA9IGRlZi5nZXRTZXJ2aWNlcygpOwotICAgIFNlcnZpY2Ugc2VydmljZSA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgc2VydmljZSA9IChTZXJ2aWNlKWl0Lm5leHQoKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0MiA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgCVBvcnQgcG9ydCA9IChQb3J0KWl0Mi5uZXh0KCk7Ci0gICAgICAJcG9ydE5hbWVMaXN0LmFkZChuZXcgUXVhbGlmaWVkTmFtZShuYW1lc3BhY2UsIHBvcnQuZ2V0TmFtZSgpKSk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgCi0gIAkKLSAgCXJldHVybiBwb3J0TmFtZUxpc3Q7Ci0gIAkKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBRdWFsaWZpZWROYW1lCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlVVJJOwotCi0gICAgU3RyaW5nIGxvY2FsUGFydDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICovCi0gICAgcHVibGljIFF1YWxpZmllZE5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsUGFydCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICB0aGlzLmxvY2FsUGFydCA9IGxvY2FsUGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxvY2FsUGFydC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsUGFydCgpCi0gICAgewotICAgICAgcmV0dXJuIGxvY2FsUGFydDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbG9jYWxQYXJ0Ci0gICAgICogICAgICAgICAgVGhlIGxvY2FsUGFydCB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9jYWxQYXJ0KFN0cmluZyBsb2NhbFBhcnQpCi0gICAgewotICAgICAgdGhpcy5sb2NhbFBhcnQgPSBsb2NhbFBhcnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lc3BhY2VVUkkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICAgIHsKLSAgICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG5hbWVzcGFjZVVSSQotICAgICAqICAgICAgICAgIFRoZSBuYW1lc3BhY2VVUkkgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKQotICAgIHsKLSAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhRdWFsaWZpZWROYW1lIHFuKQotICAgIHsKLSAgICAgIHJldHVybiAocW4uZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYgcW4uZ2V0TG9jYWxQYXJ0KCkKLSAgICAgICAgICAuZXF1YWxzKGxvY2FsUGFydCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vQ2xpZW50Um9vdEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9DbGllbnRSb290RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkZjVjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9DbGllbnRSb290RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkFzc2VtYmxlQ2xpZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuRGVwbG95Q2xpZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuRGV2ZWxvcENsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkluc3RhbGxDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5SdW5DbGllbnRGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIENsaWVudFJvb3RGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBDbGllbnRSb290RnJhZ21lbnQoKQotICB7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVDbGllbnREZXZlbG9wQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgRGV2ZWxvcENsaWVudEZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZUNsaWVudEFzc2VtYmxlQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgQXNzZW1ibGVDbGllbnRGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVDbGllbnREZXBsb3lDb21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBEZXBsb3lDbGllbnRGcmFnbWVudCgpICk7Ci0gICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBQcmVDbGllbnRJbnN0YWxsQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgYWRkKCBuZXcgSW5zdGFsbENsaWVudEZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZUNsaWVudFJ1bkNvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IFJ1bkNsaWVudEZyYWdtZW50KCkgKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkpIAotICB7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLQkKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJTZWxlY3Rpb24iLCBSdW5DbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzICk7Ci0gICAgCi0gICAgLy9NYXBwaW5ncyBmcm9tIGZyYW1ld29yayB0byBmcmFtZXdvcmsgY29tbWFuZHMKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBQcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBQcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIFByZUNsaWVudEFzc2VtYmxlQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdCIsIFByZUNsaWVudEFzc2VtYmxlQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmNsYXNzICk7ICAgIAotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiSjJlZUxldmVsIiwgUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0gICAgCi0gICAgcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBQcmVDbGllbnRJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQuY2xhc3MgKTsKLSAgICByZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBQcmVDbGllbnRJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQuY2xhc3MgKTsgICAKLQotICAgIHJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFByZUNsaWVudFJ1bkNvbW1hbmQuY2xhc3MgKTsgICAgCi0JCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudEFzc2VtYmxlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNGYxYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50QXNzZW1ibGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5Bc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcmVDbGllbnRBc3NlbWJsZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwcml2YXRlIElXZWJTZXJ2aWNlQ2xpZW50ICAgICAgIHdlYlNlcnZpY2VDbGllbnRfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgIHByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgIG1vZHVsZV87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgZWFyUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgZWFyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICBqMmVlTGV2ZWxfOwotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCJJbiBQcmUgY2xpZW50IGFzc2VtYmxlIGNvbW1hbmQuIik7Ci0KLQkvLyBDaGVjayBpZiBFQVIgbW9kdWxlIGlzIHJlcSdkLCBpZS4gIT1udWxsCi0JaWYgKGVhclByb2plY3RfPT1udWxsKQotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCi0gICAgLy9DcmVhdGUgdGhlIGNsaWVudCBFQVIgbW9kdWxlCi0gICAgQ3JlYXRlTW9kdWxlQ29tbWFuZCBjb21tYW5kID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLSAgICBjb21tYW5kLnNldFByb2plY3ROYW1lKGVhclByb2plY3RfKTsKLSAgICBjb21tYW5kLnNldE1vZHVsZU5hbWUoZWFyXyk7Ci0gICAgY29tbWFuZC5zZXRNb2R1bGVUeXBlKENyZWF0ZU1vZHVsZUNvbW1hbmQuRUFSKTsKLSAgICBjb21tYW5kLnNldFNlcnZlckZhY3RvcnlJZCh3ZWJTZXJ2aWNlQ2xpZW50Xy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFNlcnZlckZhY3RvcnlJZCgpKTsKLSAgICBjb21tYW5kLnNldEoyZWVMZXZlbChqMmVlTGV2ZWxfKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKGVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICB7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfSAgICAgCi0gICAgCi0gICAgCi0gICAgLy9Bc3NvY2lhdGUgdGhlIGNsaWVudCBtb2R1bGUgYW5kIHNlcnZpY2UgRUFSCi0gICAgQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQgYXNzb2NpYXRlQ29tbWFuZCA9IG5ldyBBc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZCgpOwotICAgIGFzc29jaWF0ZUNvbW1hbmQuc2V0UHJvamVjdChwcm9qZWN0Xyk7Ci0gICAgYXNzb2NpYXRlQ29tbWFuZC5zZXRNb2R1bGUobW9kdWxlXyk7Ci0gICAgYXNzb2NpYXRlQ29tbWFuZC5zZXRFQVJQcm9qZWN0KGVhclByb2plY3RfKTsKLSAgICBhc3NvY2lhdGVDb21tYW5kLnNldEVhcihlYXJfKTsKLSAgICBzdGF0dXMgPSBhc3NvY2lhdGVDb21tYW5kLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgIHsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOyAgICAgCi0gICAgfSAgICAgCi0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdCggU3RyaW5nIHByb2plY3QgKQotICB7Ci0gICAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0gIHsKLSAgICBtb2R1bGVfID0gbW9kdWxlOwotICB9IAotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotICB7Ci0gICAgZWFyUHJvamVjdF8gPSBlYXJQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0gICAgZWFyXyA9IGVhcjsgIAotICB9Ci0gIAotIAotICBwdWJsaWMgdm9pZCBzZXRKMmVlTGV2ZWwoIFN0cmluZyBqMmVlTGV2ZWwgKQotICB7Ci0gICAgajJlZUxldmVsXyA9IGoyZWVMZXZlbDsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlKCBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50ICkKLSAgewotICAgIHdlYlNlcnZpY2VDbGllbnRfID0gd2ViU2VydmljZUNsaWVudDsgIAotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnREZXBsb3lDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnREZXBsb3lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZDkxY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50RGVwbG95Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgUHJlQ2xpZW50RGVwbG95Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgCi0gIHsKLQlTeXN0ZW0ub3V0LnByaW50bG4oICJJbiBQcmUgY2xpZW50IGRlcGxveSBjb21tYW5kLiIgKTsKLQotCXJldHVybiBzdXBlci5leGVjdXRlKGVudmlyb25tZW50KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvZXh0ZW5zaW9uL1ByZUNsaWVudERldmVsb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDlkZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LlNpbXBsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBQcmVDbGllbnREZXZlbG9wQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIHByaXZhdGUgU3RyaW5nIElEX1dFQiA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIjsKLSAgcHJpdmF0ZSBTdHJpbmcgSURfRUpCID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5FSkIiOwotICBwcml2YXRlIFN0cmluZyBJRF9BUFBfQ0xJRU5UID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5BcHBDbGllbnQiOwotICBwcml2YXRlIFN0cmluZyBJRF9KQVZBID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5Db250YWluZXJsZXNzIjsKLSAgCi0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXJfOwotICBwcml2YXRlIEVudmlyb25tZW50ICAgICAgIGVudmlyb25tZW50XzsKLSAgcHJpdmF0ZSBJQ29udGV4dCAgICAgICAgICBjb250ZXh0XzsKLSAgcHJpdmF0ZSBJU2VsZWN0aW9uICAgICAgICBzZWxlY3Rpb25fOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIG1vZHVsZV87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlVHlwZV87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgZWFyUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgZWFyXzsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBqMmVlTGV2ZWxfOwotICBwcml2YXRlIFJlc291cmNlQ29udGV4dCAgIHJlc291cmNlQ29udGV4dF87Ci0JcHJpdmF0ZSBib29sZWFuCQkJCQkJdGVzdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgd3NkbFVSSV87Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgCi0gICAgLy8gU3BsaXQgdXAgdGhlIHByb2plY3QgYW5kIG1vZHVsZQotICAgIGludCBpbmRleCA9IG1vZHVsZV8uaW5kZXhPZigiLyIpOwotICAgIGlmIChpbmRleCE9LTEpewotICAgICAgcHJvamVjdF8gPSBtb2R1bGVfLnN1YnN0cmluZygwLGluZGV4KTsKLSAgICAgIG1vZHVsZV8gPSBtb2R1bGVfLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICB9Ci0KLSAgICBpZiAoZWFyXyE9bnVsbCAmJiBlYXJfLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgaW50IGVhckluZGV4ID0gZWFyXy5pbmRleE9mKCIvIik7Ci0gICAgICBpZiAoZWFySW5kZXghPS0xKSB7Ci0gICAgICAgIGVhclByb2plY3RfID0gZWFyXy5zdWJzdHJpbmcoMCxlYXJJbmRleCk7Ci0gICAgICAgIGVhcl8gPSBlYXJfLnN1YnN0cmluZyhlYXJJbmRleCsxKTsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIAotICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3J0ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscwotICAgICAgICAuZ2V0V2ViU2VydmljZVJ1bnRpbWUodHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICBXZWJTZXJ2aWNlQ2xpZW50SW5mbyB3c0luZm8gPSBuZXcgV2ViU2VydmljZUNsaWVudEluZm8oKTsKLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW4gUHJlIGNsaWVudCBkZXZlbG9wIGNvbW1hbmQuIik7Ci0KLSAgICB3c0luZm8uc2V0SjJlZUxldmVsKGoyZWVMZXZlbF8pOwotICAgIHdzSW5mby5zZXRTZXJ2ZXJGYWN0b3J5SWQodHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFNlcnZlcklkKCkpOwotICAgIHdzSW5mby5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgIHdzSW5mby5zZXRTdGF0ZShXZWJTZXJ2aWNlU3RhdGUuVU5LTk9XTl9MSVRFUkFMKTsKLSAgICB3c0luZm8uc2V0V2ViU2VydmljZVJ1bnRpbWVJZCh0eXBlUnVudGltZVNlcnZlcl8uZ2V0UnVudGltZUlkKCkpOwotICAgIHdzSW5mby5zZXRXc2RsVVJMKHdzZGxVUklfKTsKLSAgICAKLSAgICBlbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgICB3ZWJTZXJ2aWNlQ2xpZW50XyA9IHdzcnQuZ2V0V2ViU2VydmljZUNsaWVudCh3c0luZm8pOwotICAgIFdlYlNlcnZpY2VTY2VuYXJpbyBzY2VuYXJpbyA9IFdlYlNlcnZpY2VTY2VuYXJpby5DTElFTlRfTElURVJBTDsKLSAgICBjb250ZXh0XyA9IG5ldyBTaW1wbGVDb250ZXh0KHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRlc3RfLAotICAgICAgICBmYWxzZSwgc2NlbmFyaW8sIHJlc291cmNlQ29udGV4dF8uaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSwKLSAgICAgICAgcmVzb3VyY2VDb250ZXh0Xy5pc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCksIHJlc291cmNlQ29udGV4dF8KLSAgICAgICAgICAgIC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBjbGllbnQgbW9kdWxlCi0gICAgQ3JlYXRlTW9kdWxlQ29tbWFuZCBjb21tYW5kID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLSAgICBjb21tYW5kLnNldFByb2plY3ROYW1lKHByb2plY3RfKTsKLSAgICBjb21tYW5kLnNldE1vZHVsZU5hbWUobW9kdWxlXyk7Ci0gICAgLy8gcnNrIHRvZG8gLS0gb25jZSB0aGUgY2xpZW50UHJvamVjdFR5cGUgZXh0ZW5zaW9uIGlzIGdvbmUsIGRldGVybWluYXRpb24KLSAgICAvLyBvZiB3aGF0IHR5cGUgb2YgbW9kdWxlIHRvIGNyZWF0ZSB3aWxsIGhhdmUgdG8gYmUgZG9uZS4KLSAgICBpZiAobW9kdWxlVHlwZV8uZXF1YWxzKElEX1dFQikpIGNvbW1hbmQuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLldFQik7Ci0gICAgaWYgKG1vZHVsZVR5cGVfLmVxdWFscyhJRF9FSkIpKSBjb21tYW5kLnNldE1vZHVsZVR5cGUoQ3JlYXRlTW9kdWxlQ29tbWFuZC5FSkIpOwotICAgIGlmIChtb2R1bGVUeXBlXy5lcXVhbHMoSURfQVBQX0NMSUVOVCkpIGNvbW1hbmQuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLkFQUENMSUVOVCk7Ci0gICAgCi0gICAgY29tbWFuZC5zZXRTZXJ2ZXJGYWN0b3J5SWQodHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFNlcnZlcklkKCkpOwotICAgIGNvbW1hbmQuc2V0SjJlZUxldmVsKGoyZWVMZXZlbF8pOwotICAgIFN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotCi0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICB7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyICkKLSAgewotCXR5cGVSdW50aW1lU2VydmVyXyA9IHR5cGVSdW50aW1lU2VydmVyOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEoyRUVWZXJzaW9uKCBTdHJpbmcgajJlZUxldmVsICkKLSAgewotCWoyZWVMZXZlbF8gPSBqMmVlTGV2ZWw7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKMmVlTGV2ZWwoKQotICB7Ci0gICAgcmV0dXJuIGoyZWVMZXZlbF87ICAKLSAgfQotICAKLSAgcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2UoKQotICB7Ci0JcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRfOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpCi0gIHsKLQlyZXR1cm4gZW52aXJvbm1lbnRfOwotICB9Ci0gIAotICBwdWJsaWMgSUNvbnRleHQgZ2V0Q29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gY29udGV4dF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dCggUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCApCi0gIHsKLSAgICByZXNvdXJjZUNvbnRleHRfID0gcmVzb3VyY2VDb250ZXh0OwkgIAotICB9Ci0gIAotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGlvbl87CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbiggSVNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0Jc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsgIAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0XzsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlKCkKLSAgewotICAgIHJldHVybiBtb2R1bGVfOwkgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotICB7Ci0JbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kdWxlVHlwZSggU3RyaW5nIG1vZHVsZVR5cGUpCi0gIHsKLSAgICBtb2R1bGVUeXBlXyA9IG1vZHVsZVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEVhclByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIGVhclByb2plY3RfOyAgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVhcigpCi0gIHsKLQlyZXR1cm4gZWFyXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JZWFyXyA9IGVhcjsgIAotICB9Ci0JCi0JcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoYm9vbGVhbiB0ZXN0U2VydmljZSkKLQl7Ci0JCXRlc3RfID0gdGVzdFNlcnZpY2U7Ci0JfQkJCi0gIAotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB1cmkpCi0gIHsKLSAgICB3c2RsVVJJXyA9IHVyaTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRJbnN0YWxsQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50SW5zdGFsbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjOWUwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRJbnN0YWxsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVTZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcmVDbGllbnRJbnN0YWxsQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIHByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZUNsaWVudF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJfOwotICAKLQkgIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgCi0JICB7Ci0gICAgICBpZiAod2ViU2VydmljZUNsaWVudF8uZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZVNlcnZlckNvbW1hbmQgY3JlYXRlU2VydmVyQ29tbWFuZCA9IG5ldyBDcmVhdGVTZXJ2ZXJDb21tYW5kKCk7Ci0gICAgICAgIGNyZWF0ZVNlcnZlckNvbW1hbmQuc2V0U2VydmVyRmFjdG9yeWlkKHdlYlNlcnZpY2VDbGllbnRfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCkpOwotICAgICAgICBTdGF0dXMgY3JlYXRlU2VydmVyU3RhdHVzID0gY3JlYXRlU2VydmVyQ29tbWFuZC5leGVjdXRlKGVudmlyb25tZW50KTsKLSAgICAgICAgaWYgKGNyZWF0ZVNlcnZlclN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuT0spCi0gICAgICAgIHsKLSAgICAgICAgICB3ZWJTZXJ2aWNlQ2xpZW50Xy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLnNldFNlcnZlckluc3RhbmNlSWQoY3JlYXRlU2VydmVyQ29tbWFuZC5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChjcmVhdGVTZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihjcmVhdGVTZXJ2ZXJTdGF0dXMpOwotICAgICAgICAgIH0gICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlU2VydmVyU3RhdHVzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgCi0gICAgICAKLSAgICAgIEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCgpOwotICAgICAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHdlYlNlcnZpY2VDbGllbnRfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0XyAhPSBudWxsICYmIGVhclByb2plY3RfLmxlbmd0aCgpPjAgJiYgZWFyXyE9IG51bGwgJiYgZWFyXy5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBjb21tYW5kLnNldFByb2plY3QoZWFyUHJvamVjdF8pOwotICAgICAgICBjb21tYW5kLnNldE1vZHVsZShlYXJfKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZC5zZXRQcm9qZWN0KHByb2plY3RfKTsKLSAgICAgICAgY29tbWFuZC5zZXRNb2R1bGUobW9kdWxlXyk7ICAgICAgIAotICAgICAgfQotCi0gICAgICBTdGF0dXMgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKGVudmlyb25tZW50KTsKLSAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgewotICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIH0gICAgIAotICAgICAgcmV0dXJuIHN0YXR1czsKLQkgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICBwcm9qZWN0XyA9IHByb2plY3Q7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlKCBTdHJpbmcgbW9kdWxlICkKLSAgICB7Ci0gICAgICBtb2R1bGVfID0gbW9kdWxlOwotICAgIH0gCi0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotICAgIHsKLSAgICAgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RWFyKCBTdHJpbmcgZWFyICkKLSAgICB7Ci0gICAgICBlYXJfID0gZWFyOyAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlQ2xpZW50IHdlYlNlcnZpY2VDbGllbnQgKQotICAgIHsKLSAgICAgIHdlYlNlcnZpY2VDbGllbnRfID0gd2ViU2VydmljZUNsaWVudDsgIAotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRSdW5Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2V4dGVuc2lvbi9QcmVDbGllbnRSdW5Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYWU1NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9leHRlbnNpb24vUHJlQ2xpZW50UnVuQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRTZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQcmVDbGllbnRSdW5Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCAKLXsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50XzsKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkluIFByZSBjbGllbnQgcnVuIGNvbW1hbmQuIik7Ci0gICAgU3RhcnRTZXJ2ZXJDb21tYW5kIGNvbW1hbmQgPSBuZXcgU3RhcnRTZXJ2ZXJDb21tYW5kKCk7Ci0gICAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHdlYlNlcnZpY2VDbGllbnRfLmdldFdlYlNlcnZpY2VDbGllbnRJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKGVudmlyb25tZW50KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICB7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsgICAgICAgCi0gICAgfSAgICAgCi0gICAgcmV0dXJuIHN0YXR1czsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlKCBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50ICkKLSAgewotICAgIHdlYlNlcnZpY2VDbGllbnRfID0gd2ViU2VydmljZUNsaWVudDsgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzODQ1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBwbHVnaW4uCi0qIDxwPgotKiBUaGlzIHBsdWdpbiBjb250YWlucyB0aGUgZ3JhcGhpYyB1c2VyIGludGVyZmFjZSB0byB0aGUKLSogV2ViIFNlcnZpY2VzIHJ1bnRpbWUgZm91bmQgaW4gb3JnLmVjbGlwc2UuanN0LndzLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIGluc3RhbmNlXzsKLQotICBwcml2YXRlIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBzZXJ2ZXJSdW50aW1lQ29udGV4dF87Ci0gIHByaXZhdGUgTG9nIGxvZ187Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luICgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmpzdC53cy51aSIpOwotICAqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgc3RhdGljIHB1YmxpYyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbiBnZXRJbnN0YW5jZSAoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotICAqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0gICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotICAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucGx1Z2luIiwgaW5zdGFuY2VfICk7Ci0gICAgCi0gICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0gICAgewotICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyggMSwga2V5Lmxlbmd0aCgpICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBtc2dVdGlscy5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotICAqIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nCi0gICogYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2gKLSAgKiBhcmUgbW9zdCBmcmVxdWVudGx5IHN0cmluZ3MpLiBTZWUgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgZm9yCi0gICogZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAgKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotICAqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0gICogd2hlcmUgdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZQotICAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0gICogQHBhcmFtIGFyZ3MgVGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlCi0gICogYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4gcGx1Z2luLnByb3BlcnRpZXMgYW5kCi0gICogYnkgdGhlIHJ1bGVzIG9mIGNsYXNzIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncyApCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZShrZXkpLGFyZ3MpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgcmVzb3VyY2UKLSAgKiBhcyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGluc3RhbGwgbG9jYXRpb24uCi0gICogQHJldHVybiBBbiBpbWFnZSBkZXNjcmlwdG9yLCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOzsKLSAgICAgIFVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCxuYW1lKTsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKSB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykudG9PU1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAKLSAgcHVibGljIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBnZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpIAotCXsKLQkgIGlmIChzZXJ2ZXJSdW50aW1lQ29udGV4dF8gPT0gbnVsbCkKLQkgIAl7Ci0JICAJCXNlcnZlclJ1bnRpbWVDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkgIAkJc2VydmVyUnVudGltZUNvbnRleHRfLmxvYWQoKTsKLQkgIAl9Ci0JICByZXR1cm4gc2VydmVyUnVudGltZUNvbnRleHRfOwotCX0gIAotICB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3NmZhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgUFJFRkVSRU5DRV9TRVJWRVIgPSAiUFJFRkVSRU5DRV9TRVJWRVIiOwotCXByaXZhdGUgU3RyaW5nIFBSRUZFUkVOQ0VfUlVOVElNRSA9ICJQUkVGRVJFTkNFX1JVTlRJTUUiOwotCXByaXZhdGUgU3RyaW5nIFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OID0gIlBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OIjsKLQkKLQlwcml2YXRlIFN0cmluZyBTRVJWRVJfRkFDVE9SWV9JRF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIjsKLQlwcml2YXRlIFN0cmluZyBSVU5USU1FX0lEX0RFRkFVTFQgPSAib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIjsKLQlwcml2YXRlIFN0cmluZyBKMkVFX1ZFUlNJT05fREVGQVVMVCA9ICIxMyI7Ci0JCi0JcHVibGljIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpCi0JewotCQlzdXBlcihXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuQ29udGV4dCNsb2FkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKCkgewotCQkvL0RlZmF1bHRzIHdpbGwgYmUgc2V0IHZpYSB0aGUgLmluaSBjdXN0b21pemF0aW9uLiBUaGV5IGFyZSBoYXJkIGNvZGVkIHRvIGRlZmF1bHQgdmFsdWVzIGluIHRoZQotCQkvL2Fic2VuY2Ugb2YgYSAuaW5pIGZpbGUuCi0JCVN0cmluZyBzZXJ2ZXJEZWZhdWx0ID0gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXJEZWZhdWx0PT1udWxsIHx8IHNlcnZlckRlZmF1bHQubGVuZ3RoKCk9PTApCi0JCXsKLQkJICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfU0VSVkVSLCBTRVJWRVJfRkFDVE9SWV9JRF9ERUZBVUxUKTsKLQkJfQotCi0JCVN0cmluZyBydW50aW1lRGVmYXVsdCA9IGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9SVU5USU1FKTsKLQkJaWYgKHJ1bnRpbWVEZWZhdWx0PT1udWxsIHx8IHJ1bnRpbWVEZWZhdWx0Lmxlbmd0aCgpPT0wKQotCQl7Ci0JCSAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1JVTlRJTUUsIFJVTlRJTUVfSURfREVGQVVMVCk7Ci0JCX0KLQotCQlTdHJpbmcgajJlZURlZmF1bHQgPSBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfSjJFRV9WRVJTSU9OKTsKLQkJaWYgKGoyZWVEZWZhdWx0PT1udWxsIHx8IGoyZWVEZWZhdWx0Lmxlbmd0aCgpPT0wKQotCQl7Ci0JCSAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyRUVfVkVSU0lPTiwgSjJFRV9WRVJTSU9OX0RFRkFVTFQpOwotCQl9Ci0KLQkJCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2VydmVyRmFjdG9yeUlkKCkKLQl7Ci0JCXJldHVybiBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfU0VSVkVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lSWQoKQotCXsKLQkJcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoUFJFRkVSRU5DRV9SVU5USU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRKMkVFVmVyc2lvbigpCi0JewotCQlyZXR1cm4gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX0oyRUVfVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJGYWN0b3J5SWQoKQotCXsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1NFUlZFUik7IAotCQkvKgotCQlpZiAodmFsdWU9PW51bGwgfHwgdmFsdWUubGVuZ3RoKCk9PTApCi0JCXsKLQkJCXZhbHVlID0gU0VSVkVSX0ZBQ1RPUllfSURfREVGQVVMVDsgCi0JCQlzZXRTZXJ2ZXJGYWN0b3J5SWQodmFsdWUpOwotCQl9Ci0JCSovCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lSWQoKQotCXsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1JVTlRJTUUpOwotCQkvKgotCQlpZiAodmFsdWU9PW51bGwgfHwgdmFsdWUubGVuZ3RoKCk9PTApCi0JCXsKLQkJCXZhbHVlID0gUlVOVElNRV9JRF9ERUZBVUxUOyAKLQkJCXNldFJ1bnRpbWVJZCh2YWx1ZSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHZhbHVlOwkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb24oKQotCXsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0oyRUVfVkVSU0lPTik7Ci0JCS8qCi0JCWlmICh2YWx1ZT09bnVsbCB8fCB2YWx1ZS5sZW5ndGgoKT09MCkKLQkJewotCQkJdmFsdWUgPSBKMkVFX1ZFUlNJT05fREVGQVVMVDsgCi0JCQlzZXRKMkVFVmVyc2lvbih2YWx1ZSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHZhbHVlOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgaWQpCi0JewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX1NFUlZFUixpZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWVJZChTdHJpbmcgaWQpCi0JewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX1JVTlRJTUUsIGlkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0JewotCQlzZXRWYWx1ZShQUkVGRVJFTkNFX0oyRUVfVkVSU0lPTiwgdmVyc2lvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvU2VydmVyUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMDZhYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBMaXN0ZW5lciAKLXsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZF89ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkKLQkvKiBDT05URVhUX0lEIFNSUEYwMDAxIGZvciBzZXJ2ZXIgcHJlZmVyZW5jZSBvbiB0aGUgc2VydmVyIHJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlICovCi0JcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9TUlBGX1NFUlZFUl9QUkVGID0gcGx1Z2luSWRfICsgIi5TUlBGMDAwMSI7Ci0JcHJpdmF0ZSBDb21ibyBzZXJ2ZXJfOwotCi0JLyogQ09OVEVYVF9JRCBTUlBGMDAwMiBmb3IgcnVudGltZSBwcmVmZXJlbmNlIG9uIHRoZSBzZXJ2ZXIgcnVudGltZSBwcmVmZXJlbmNlIHBhZ2UgKi8KLQlwcml2YXRlIFN0cmluZyBJTkZPUE9QX1NSUEZfUlVOVElNRV9QUkVGID0gcGx1Z2luSWRfICsgIi5TUlBGMDAwMiI7Ci0JcHJpdmF0ZSBDb21ibyBydW50aW1lXzsJCi0KLQkvKiBDT05URVhUX0lEIFNSUEYwMDAzIGZvciBKMkVFIHZlcnNpb24gcHJlZmVyZW5jZSBvbiB0aGUgc2VydmVyIHJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlICovCi0JcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9TUlBGX0oyRUVfUFJFRiA9IHBsdWdpbklkXyArICIuU1JQRjAwMDMiOwotCXByaXZhdGUgQ29tYm8gajJlZVZlcnNpb25fOwotCQotCVNlbGVjdGlvbkxpc3RDaG9pY2VzIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgICB7IH0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgCi0JewotCSAgCi0JICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0JICBVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhtc2dVdGlsc18sIHBsdWdpbklkXyk7Ci0JICAKLQkgIENvbXBvc2l0ZSBwYWdlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCSAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0JICBwYWdlLnNldExheW91dChnbCk7Ci0JICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkgIHBhZ2Uuc2V0TGF5b3V0RGF0YShnZCk7Ci0JICAKLQkgIHNlcnZlcl8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhZ2UsIkxBQkVMX1NFUlZFUlNfTElTVCIsCi0JICAJCSAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1NSUEZfQ09NQk9fU0VSVkVSIiwKLQkJCQkJCQkJCUlORk9QT1BfU1JQRl9TRVJWRVJfUFJFRiwKLQkJCQkJCQkJCVNXVC5TSU5HTEV8U1dULkJPUkRFUnxTV1QuUkVBRF9PTkxZKTsKLQkgIAotCSAgcnVudGltZV8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhZ2UsIkxBQkVMX1JVTlRJTUVTX0xJU1QiLAotCSAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfU1JQRl9DT01CT19SVU5USU1FIiwKLQkJCQkJCQkJCSBJTkZPUE9QX1NSUEZfUlVOVElNRV9QUkVGLAotCQkJCQkJCQkJIFNXVC5TSU5HTEV8U1dULkJPUkRFUnxTV1QuUkVBRF9PTkxZKTsKLQkgIAotCSAgajJlZVZlcnNpb25fID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYWdlLCJMQUJFTF9KMkVFX1ZFUlNJT04iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9TUlBGX0NPTUJPX0oyRUUiLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1NSUEZfSjJFRV9QUkVGLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFfFNXVC5CT1JERVJ8U1dULlJFQURfT05MWSk7CSAgCi0KLQkgIGluaXRpYWxpemVWYWx1ZXMoKTsKLQkgIHN0YXJ0TGlzdGVuaW5nKCk7Ci0JICByZXR1cm4gcGFnZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0JewotCQlQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0U2VydmVyVG9SdW50aW1lVG9KMkVFKCk7Ci0KLQotCQlzZXRTZXJ2ZXJJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlTdHJpbmcgZGVmYXVsdFNlcnZlclRleHQgPSBjb250ZXh0LmdldFNlcnZlckZhY3RvcnlJZCgpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0U2VydmVyVGV4dCk7Ci0JCXNldFNlcnZlclNlbGVjdGlvbihkZWZhdWx0U2VydmVyVGV4dCk7Ci0JCQotCQlzZXRSdW50aW1lSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJU3RyaW5nIGRlZmF1bHRSdW50aW1lVGV4dCA9IGNvbnRleHQuZ2V0UnVudGltZUlkKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRSdW50aW1lVGV4dCk7Ci0JCXNldFJ1bnRpbWVTZWxlY3Rpb24oZGVmYXVsdFJ1bnRpbWVUZXh0KTsKLQkJCi0JCXNldEoyRUVJdGVtcyhzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkpOwotCQlTdHJpbmcgZGVmYXVsdEoyRUVWZXJzaW9uID0gY29udGV4dC5nZXRKMkVFVmVyc2lvbigpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0SjJFRVZlcnNpb24pOwotCQlzZXRKMkVFU2VsZWN0aW9uKGRlZmF1bHRKMkVFVmVyc2lvbik7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWlmIChzZXJ2ZXJfID09IGV2ZW50LndpZGdldCkKLQkJewotCQkJaGFuZGxlU2VydmVyU2VsZWN0ZWQoKTsKLQkJfQotCQllbHNlIGlmIChydW50aW1lXyA9PSBldmVudC53aWRnZXQpCi0JCXsKLQkJCWhhbmRsZVJ1bnRpbWVTZWxlY3RlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKGoyZWVWZXJzaW9uXyA9PSBldmVudC53aWRnZXQpCi0JCXsJCQkKLQkJCWhhbmRsZUoyRUVTZWxlY3RlZCgpOwotCQl9CQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlcnZlclNlbGVjdGVkKCkKLQl7Ci0JCXN0b3BMaXN0ZW5pbmcoKTsKLQkJCi0JCVN0cmluZyBzZWxlY3RlZFRleHQgPSBnZXRTZXJ2ZXJTZWxlY3Rpb24oKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoc2VsZWN0ZWRUZXh0KTsKLQkJCi0JCS8vVXBkYXRlIHRoZSBydW50aW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJc2V0UnVudGltZUl0ZW1zKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKSk7Ci0JCWlmIChzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCkubGVuZ3RoID4gMCkKLQkJICBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRJbmRleCgwKTsKLQkJCi0JCVN0cmluZyBuZXdSdW50aW1lVGV4dCA9IHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotCQlpZiAobmV3UnVudGltZVRleHQhPW51bGwgJiYgbmV3UnVudGltZVRleHQubGVuZ3RoKCk+MCkKLQkJCXNldFJ1bnRpbWVTZWxlY3Rpb24obmV3UnVudGltZVRleHQpOwotCQkKLQkJLy9VcGRhdGUgdGhlIGoyZWUgdmVyc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWlmIChuZXdSdW50aW1lVGV4dCE9bnVsbCAmJiBuZXdSdW50aW1lVGV4dC5sZW5ndGgoKT4wKQotCQl7Ci0JCSAgc2V0SjJFRUl0ZW1zKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKSk7Ci0JCSAgaWYgKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKS5sZW5ndGggPiAwKQotCQkJICBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRJbmRleCgwKTsKLQkJCQotCQkJU3RyaW5nIG5ld0oyRUVUZXh0ID0gc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAobmV3SjJFRVRleHQhPW51bGwgJiYgbmV3SjJFRVRleHQubGVuZ3RoKCk+MCkKLQkJCQlzZXRKMkVFU2VsZWN0aW9uKG5ld0oyRUVUZXh0KTsKLQkJfQotCQllbHNlCi0JCXsKLQkJICBzZXRKMkVFSXRlbXMobmV3IFN0cmluZ1swXSk7Ci0JCX0KLQkJCi0JCXN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSdW50aW1lU2VsZWN0ZWQoKQotCXsKLQkJc3RvcExpc3RlbmluZygpOwotCQkKLQkJU3RyaW5nIHNlbGVjdGVkVGV4dCA9IGdldFJ1bnRpbWVTZWxlY3Rpb24oKTsKLQkJc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoc2VsZWN0ZWRUZXh0KTsKLQkJCi0JCS8vVXBkYXRlIHRoZSBqMmVlIHZlcnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQlzZXRKMkVFSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJaWYgKHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKS5sZW5ndGggPiAwKQotCQkgIHNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KDApOwotCQkKLQkJU3RyaW5nIG5ld0oyRUVUZXh0ID0gc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChuZXdKMkVFVGV4dCE9bnVsbCAmJiBuZXdKMkVFVGV4dC5sZW5ndGgoKT4wKQotCQkJc2V0SjJFRVNlbGVjdGlvbihuZXdKMkVFVGV4dCk7Ci0JCQkJCi0JCXN0YXJ0TGlzdGVuaW5nKCk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUoyRUVTZWxlY3RlZCgpCi0JewotCQlzdG9wTGlzdGVuaW5nKCk7Ci0JCQotCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gZ2V0SjJFRVNlbGVjdGlvbigpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShzZWxlY3RlZFRleHQpOwotCQkKLQkJc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0gICAgLyoqCi0JICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0JewotCSAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JICBzZXRUb0RlZmF1bHRzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRUb0RlZmF1bHRzKCkKLQl7Ci0JCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotCi0JCVN0cmluZyBkZWZhdWx0U2VydmVyVGV4dCA9IGNvbnRleHQuZ2V0RGVmYXVsdFNlcnZlckZhY3RvcnlJZCgpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0U2VydmVyVGV4dCk7Ci0JCXNldFNlcnZlclNlbGVjdGlvbihkZWZhdWx0U2VydmVyVGV4dCk7Ci0JCQotCQlzZXRSdW50aW1lSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJU3RyaW5nIGRlZmF1bHRSdW50aW1lVGV4dCA9IGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVJZCgpOwotCQlzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShkZWZhdWx0UnVudGltZVRleHQpOwotCQlzZXRSdW50aW1lU2VsZWN0aW9uKGRlZmF1bHRSdW50aW1lVGV4dCk7Ci0JCQotCQlzZXRKMkVFSXRlbXMoc2VydmVyVG9SdW50aW1lVG9KMkVFXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0TGlzdCgpKTsKLQkJU3RyaW5nIGRlZmF1bHRKMkVFVmVyc2lvbiA9IGNvbnRleHQuZ2V0RGVmYXVsdEoyRUVWZXJzaW9uKCk7Ci0JCXNlcnZlclRvUnVudGltZVRvSjJFRV8uZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGRlZmF1bHRKMkVFVmVyc2lvbik7Ci0JCXNldEoyRUVTZWxlY3Rpb24oZGVmYXVsdEoyRUVWZXJzaW9uKTsJCQotCX0KLQotCS8qKgotCSAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0JewotCSAgc3RvcmVWYWx1ZXMoKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpCi0JewotICAgICAgUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICBjb250ZXh0LnNldFNlcnZlckZhY3RvcnlJZChnZXRTZXJ2ZXJTZWxlY3Rpb24oKSk7Ci0gICAgICBjb250ZXh0LnNldFJ1bnRpbWVJZChnZXRSdW50aW1lU2VsZWN0aW9uKCkpOwotICAgICAgY29udGV4dC5zZXRKMkVFVmVyc2lvbihnZXRKMkVFU2VsZWN0aW9uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotCXsKLQkgIHBlcmZvcm1PaygpOwotCX0KLQkKLSAgCQotCXByaXZhdGUgdm9pZCBzdGFydExpc3RlbmluZygpCi0JewotCSAgc2VydmVyXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLHRoaXMpOwotCSAgcnVudGltZV8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLQkgIGoyZWVWZXJzaW9uXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLHRoaXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wTGlzdGVuaW5nKCkKLQl7Ci0JICBzZXJ2ZXJfLnJlbW92ZUxpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCSAgcnVudGltZV8ucmVtb3ZlTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JICBqMmVlVmVyc2lvbl8ucmVtb3ZlTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlcnZlckl0ZW1zKFN0cmluZ1tdIGZhY3RvcnlJZHMpCi0JewotCSAgCi0JICBpZiAoZmFjdG9yeUlkcyAhPSBudWxsKQotCSAgewotCQkvL1N0cmluZ1tdIHNlcnZlckxhYmVscyA9IG5ldyBTdHJpbmdbZmFjdG9yeUlkcy5sZW5ndGhdOwotCSAgICBBcnJheUxpc3Qgc2VydmVyTGFiZWxzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wO2k8ZmFjdG9yeUlkcy5sZW5ndGg7aSsrKQotCQl7Ci0JCQlTdHJpbmcgdGhpc0ZhY3RvcnlJZCA9IGZhY3RvcnlJZHNbaV07Ci0JCQlTdHJpbmcgdGhpc1NlcnZlckxhYmVsID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJMYWJlbChmYWN0b3J5SWRzW2ldKTsKLQkJCWlmICh0aGlzU2VydmVyTGFiZWwhPW51bGwgJiYgdGhpc1NlcnZlckxhYmVsLmxlbmd0aCgpPjApCi0JCQl7Ci0JCQkgIHNlcnZlckxhYmVsc0xpc3QuYWRkKHRoaXNTZXJ2ZXJMYWJlbCk7Ci0JCQl9Ci0JCQkKLQkJfQotCQlTdHJpbmdbXSBzZXJ2ZXJMYWJlbHMgPSBjb252ZXJ0VG9TdHJpbmdBcnJheShzZXJ2ZXJMYWJlbHNMaXN0LnRvQXJyYXkoKSk7IAotCQlzZXJ2ZXJfLnNldEl0ZW1zKHNlcnZlckxhYmVscyk7Ci0JICB9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0UnVudGltZUl0ZW1zKFN0cmluZ1tdIGlkcykKLQl7Ci0JICBpZiAoaWRzICE9IG51bGwpCi0JICB7Ci0JCVN0cmluZ1tdIHJ1bnRpbWVMYWJlbHMgPSBuZXcgU3RyaW5nW2lkcy5sZW5ndGhdOwotCQlmb3IgKGludCBpPTA7aTxpZHMubGVuZ3RoO2krKykKLQkJewotCQkgIHJ1bnRpbWVMYWJlbHNbaV0gPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWVMYWJlbChpZHNbaV0pOwotCQl9Ci0JCXJ1bnRpbWVfLnNldEl0ZW1zKHJ1bnRpbWVMYWJlbHMpOwotCSAgfQotCQkKLQl9Ci0JCi0gICAgcHJpdmF0ZSB2b2lkIHNldEoyRUVJdGVtcyhTdHJpbmdbXSB2ZXJzaW9ucykKLSAgICB7Ci0gICAgICBpZiAodmVyc2lvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gajJlZUxhYmVscyA9IG5ldyBTdHJpbmdbdmVyc2lvbnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBsYWJlbCA9IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbih2ZXJzaW9uc1tpXSk7Ci0gICAgICAgICAgaWYgKGxhYmVsICE9IG51bGwgJiYgbGFiZWwubGVuZ3RoKCk+MCkKLSAgICAgICAgICAgIGoyZWVMYWJlbHNbaV0gPSBsYWJlbDsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBqMmVlTGFiZWxzW2ldID0gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX05BIik7Ci0gICAgICAgIH0KLSAgICAgICAgajJlZVZlcnNpb25fLnNldEl0ZW1zKGoyZWVMYWJlbHMpOwotICAgICAgICAKLSAgICAgICAgLy9EaXNhYmxlIHRoZSBjb21ibyBpZiBpdCBoYXMgbm8gaXRlbXMuCi0gICAgICAgIGlmIChqMmVlTGFiZWxzLmxlbmd0aCA+IDApCi0gICAgICAgICAgajJlZVZlcnNpb25fLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBqMmVlVmVyc2lvbl8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICAgIAotICAgIH0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJTZWxlY3Rpb24oKQotCXsKLQkgIFN0cmluZyBzZXJ2ZXJMYWJlbCA9IHNlcnZlcl8uZ2V0VGV4dCgpOwotCSAgcmV0dXJuIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckxhYmVsKTsJCQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRSdW50aW1lU2VsZWN0aW9uKCkKLQl7Ci0gICAgICBTdHJpbmcgcnVudGltZUxhYmVsID0gcnVudGltZV8uZ2V0VGV4dCgpOwotCSAgcmV0dXJuIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UnVudGltZUlkKHJ1bnRpbWVMYWJlbCk7CQkJCQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRKMkVFU2VsZWN0aW9uKCkKLQl7Ci0JICBTdHJpbmcgajJlZUxhYmVsID0gajJlZVZlcnNpb25fLmdldFRleHQoKTsKLQkgIHJldHVybiBKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb25Gcm9tTGFiZWwoajJlZUxhYmVsKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U2VydmVyU2VsZWN0aW9uKFN0cmluZyBmYWN0b3J5SWQpCi0JewotCQlTdHJpbmcgbGFiZWwgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFNlcnZlckxhYmVsKGZhY3RvcnlJZCk7Ci0JCXNldFNlbGVjdGlvbihzZXJ2ZXJfLGxhYmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWVTZWxlY3Rpb24oU3RyaW5nIGlkKQotCXsKLQkJU3RyaW5nIGxhYmVsID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lTGFiZWwoaWQpOwotCQlzZXRTZWxlY3Rpb24ocnVudGltZV8sbGFiZWwpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRKMkVFU2VsZWN0aW9uKFN0cmluZyB2ZXJzaW9uKQotCXsKLQkgIFN0cmluZyBsYWJlbCA9IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbih2ZXJzaW9uKTsKLSAgICAgIHNldFNlbGVjdGlvbihqMmVlVmVyc2lvbl8sIGxhYmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGlvbihDb21ibyBjb21ibywgU3RyaW5nIHMpCi0JewotCQlTdHJpbmdbXSBpdGVtcyA9IGNvbWJvLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykKLQkJewotCQkJaWYgKGl0ZW1zW2ldLmVxdWFscyhzKSkKLQkJCXsKLQkJCQljb21iby5zZWxlY3QoaSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gY29udmVydFRvU3RyaW5nQXJyYXkoT2JqZWN0W10gYSkKLQl7Ci0JICBpZiAoYT09bnVsbCkgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JICAJCi0JICBpbnQgbGVuZ3RoID0gYS5sZW5ndGg7Ci0JICBTdHJpbmdbXSBzYSA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLQkgIGZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykKLQkgIHsKLQkgIAlPYmplY3Qgb2JqID0gYVtpXTsKLQkgIAlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQotCSAgCXsKLQkgICAgICBzYVtpXSA9IChTdHJpbmcpb2JqOwotCSAgCX0KLQkgIH0KLQkgIHJldHVybiBzYTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9zZWxlY3Rpb24vU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvc2VsZWN0aW9uL1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Yjk4NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9zZWxlY3Rpb24vU2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgCi0gIHsKLQlJU3RydWN0dXJlZFNlbGVjdGlvbiBpblNlbGVjdGlvbiAgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmFsdWU7Ci0JU2VsZWN0aW9uICAgICAgICAgICAgb3V0U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbigpOwotCQotCW91dFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oIGluU2VsZWN0aW9uLnRvQXJyYXkoKSApOwotCQotCXJldHVybiBvdXRTZWxlY3Rpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9BYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0Fic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzI4YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0Fic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIEFic3RyYWN0SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ21kCi0gKgotICogSW5pdGlhbGl6ZSBhbmQgbG9hZCB0aGUgaGFuZGxlcnMgZGF0YQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDbWQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLSAgCi0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbl87IAotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyBjb21wb25lbnROYW1lXzsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOyAgICAKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgCi0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbl87Ci0gICAgaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQiKSwgU3RhdHVzLkVSUk9SLCBudWxsKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gICAgCi0gIH0KLSAgCi0KLSAgcHVibGljIExpc3QgZ2V0Q2xpZW50SGFuZGxlcnMoKXsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdFNlbGVjdGlvbil7Ci0gICAgdGhpcy5pbml0aWFsU2VsZWN0aW9uXyA9IGluaXRTZWxlY3Rpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRJbml0aWFsU2VsZWN0aW9uKCl7Ci0gICAgcmV0dXJuIHRoaXMuaW5pdGlhbFNlbGVjdGlvbl87Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGcm9tSW5pdGlhbFNlbGVjdGlvbigpCi0gIHsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbl8gIT0gbnVsbCAmJiBpbml0aWFsU2VsZWN0aW9uXy5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaW5pdGlhbFNlbGVjdGlvbl8uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9ICAgCi0gCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCl7Ci0gICAgCi0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGcm9tSW5pdGlhbFNlbGVjdGlvbigpOwotCWlmIChyZXNvdXJjZSAhPSBudWxsKQotCXsKLQkgIHJldHVybiBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZiggcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSApOwotCX0KLQkgCi0JcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpewotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlRnJvbUluaXRpYWxTZWxlY3Rpb24oKTsKLSAgICBpZiAocmVzb3VyY2UhPW51bGwpIHsKLSAgICAgIElQYXRoIGFic29sdXRlUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICBpZiAoYWJzb2x1dGVQYXRoLmlzQWJzb2x1dGUoKSkgewotICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoLnNlZ21lbnQoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotLy8gIHB1YmxpYyBXZWJTZXJ2aWNlRWRpdE1vZGVsIGdldFdlYlNlcnZpY2VFZGl0TW9kZWwoKSB7Ci0vLyAgICBXZWJTZXJ2aWNlc01hbmFnZXIgd3NtID0gbmV3IFdlYlNlcnZpY2VzTWFuYWdlcigpOwotLy8gICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLS8vICAgIHJldHVybiB3c20uZ2V0V1NFZGl0TW9kZWwocHJvamVjdCk7ICAgIAotLy8gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWRkSGFuZGxlckRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0FkZEhhbmRsZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5NWE1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQWRkSGFuZGxlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxMiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLkRpYWxvZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotCi0KLXB1YmxpYyBjbGFzcyBBZGRIYW5kbGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ2xpZW50XzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIFN0cmluZ1tdIHBvcnROYW1lczsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRQb3J0TmFtZTsKLSAgCi0gIHByaXZhdGUgVGV4dCBjbGFzc05hbWVUZXh0OwotICBwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0gIHByaXZhdGUgQ29tYm8gcG9ydE5hbWVDb21ibzsKLSAgCi0gIC8vIC0tLS1UT09MVElQUyBTZWN0aW9uLS0tLQotICAvKiBDT05URVhUX0lEIEFIREwwMDAxIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1RFWFRfSEFORExFUl9OQU1FICA9ICJBSERMMDAwMSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9URVhUX0hBTkRMRVJfTkFNRSA9ICJUT09MVElQX1RFWFRfSEFORExFUl9OQU1FIjsKLSAgCi0gIC8qIENPTlRFWFRfSUQgQUhETDAwMDIgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfVEVYVF9IQU5ETEVSX0NMQVNTICA9ICJBSERMMDAwMiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9URVhUX0hBTkRMRVJfQ0xBU1MgPSAiVE9PTFRJUF9URVhUX0hBTkRMRVJfQ0xBU1MiOwotICAKLSAgLyogQ09OVEVYVF9JRCBBSERMMDAwMSBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9URVhUX0hBTkRMRVJfUE9SVCAgPSAiQUhETDAwMDMiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQgPSAiVE9PTFRJUF9URVhUX0hBTkRMRVJfUE9SVCI7Ci0gICAgCi0gIHByaXZhdGUgQnV0dG9uIGJlYW5DbGFzc0Jyb3dzZUJ1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQQkNMMDAwMyBmb3IgdGhlIEJlYW4gQ2xhc3MgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgQmVhbiBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEJDTF9CVVRUT05fQkVBTl9DTEFTU19CUk9XU0UgPSAiUEJDTDAwMDMiOwotICAKLSAgcHVibGljIEFkZEhhbmRsZXJEaWFsb2coIFNoZWxsIHNoZWxsLCBib29sZWFuIGlzQ2xpZW50SGFuZGxlcikKLSAgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgICBpc0NsaWVudF8gPSBpc0NsaWVudEhhbmRsZXI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIHBhcmVudC5nZXRTaGVsbCgpLnBhY2soKTsKLSAgICByZXR1cm4gY29tcDsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIHZhbGlkYXRlT25fID0gZmFsc2U7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBwbHVnaW5JZF8pOwotICAgIAotICAgIFNoZWxsIHRoaXNTaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgIGlmICh0aGlzU2hlbGwgPT0gbnVsbCkgewotICAgICAgdGhpc1NoZWxsID0gY3JlYXRlU2hlbGwoKTsKLSAgICB9Ci0gICAgdGhpc1NoZWxsLnNldFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkRJQUxPR19USVRMRV9XU19BRERfSEFORExFUiIpKTsKLSAgICAKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOyAgICAKLSAgICAKLSAgICBDb21wb3NpdGUgc291cmNlTG9jYXRpb25Db21wID0gdWlVdGlscy5jcmVhdGVDb21wb3NpdGUoY29tcG9zaXRlLCAzKTsKLSAgICAKLSAgICBjbGFzc05hbWVUZXh0ID0gdWlVdGlscy5jcmVhdGVUZXh0KHNvdXJjZUxvY2F0aW9uQ29tcCwgIkxBQkVMX1RFWFRfSEFORExFUl9DTEFTUyIsIFRPT0xUSVBfVEVYVF9IQU5ETEVSX0NMQVNTLCBJTkZPUE9QX1RFWFRfSEFORExFUl9DTEFTUywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIGNsYXNzTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSx0aGlzKTsKLSAgICAKLSAgICBiZWFuQ2xhc3NCcm93c2VCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBzb3VyY2VMb2NhdGlvbkNvbXAsICJCVVRUT05fQlJPV1NFX0NMQVNTRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFICk7Ci0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlQnJvd3NlQ2xhc3NlcygpOyAgCi0gICAgICAgICAgfQotICAgICAgICB9ICk7Ci0gICAgCi0gICAgbmFtZVRleHQgPSB1aVV0aWxzLmNyZWF0ZVRleHQoc291cmNlTG9jYXRpb25Db21wLCAiTEFCRUxfVEVYVF9IQU5ETEVSX05BTUUiLCBUT09MVElQX1RFWFRfSEFORExFUl9OQU1FLCBJTkZPUE9QX1RFWFRfSEFORExFUl9OQU1FLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotICAgIG5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIAotICAgIC8vIGR1bW15IGxhYmVsIGZvciBjb2x1bW4gMy4KLSAgICBuZXcgTGFiZWwoIHNvdXJjZUxvY2F0aW9uQ29tcCwgU1dULk5PTkUgKTsKLSAgICAKLSAgICBpZiAoIWlzQ2xpZW50Xyl7Ci0gICAgICBwb3J0TmFtZUNvbWJvID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXAsICJMQUJFTF9URVhUX0hBTkRMRVJfUE9SVCIsIFRPT0xUSVBfVEVYVF9IQU5ETEVSX1BPUlQsIElORk9QT1BfVEVYVF9IQU5ETEVSX1BPUlQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0gICAgICBwb3J0TmFtZUNvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgICAgCi0gICAgICAvLyBkdW1teSBsYWJlbCBmb3IgY29sdW1uIDMuCi0gICAgICBuZXcgTGFiZWwoIHNvdXJjZUxvY2F0aW9uQ29tcCwgU1dULk5PTkUgKTsKLSAgICB9Ci0gICAgdmFsaWRhdGVPbl8gPSB0cnVlOwotICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUJyb3dzZUNsYXNzZXMoKQotICB7Ci0gICAgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotICAgIElUeXBlIGl0eXBlID0gRGlhbG9nVXRpbHMuYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoc2hlbGwsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSwgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkpOwotICAgIAotICAgIGlmKCBpdHlwZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBjbGFzc05hbWVUZXh0LnNldFRleHQoaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICBpZiAoIXZhbGlkYXRlT25fKQotICAgICAgcmV0dXJuOwotICAgIGlmIChjbGFzc05hbWVUZXh0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlQ2xhc3NOYW1lVGV4dEV2ZW50KCk7Ci0gICAgICB2YWxpZGF0ZVRleHRGaWVsZEVudHJpZXMoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG5hbWVUZXh0ID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlTmFtZVRleHRFdmVudCgpOwotICAgICAgdmFsaWRhdGVUZXh0RmllbGRFbnRyaWVzKCk7ICAgICAgCi0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChwb3J0TmFtZUNvbWJvID09IGV2ZW50LndpZGdldCkgewotICAgICAgaGFuZGxlUG9ydE5hbWVUZXh0RXZlbnQoKTsKLSAgICAgIHZhbGlkYXRlVGV4dEZpZWxkRW50cmllcygpOyAgICAgIAotICAgICAgcmV0dXJuOwotICAgIH0gICAgCi0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQ2xhc3NOYW1lVGV4dEV2ZW50KCl7Ci0gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgaWYgKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLmphdmEiKSAhPSAtMSl7Ci0gICAgICBuYW1lVGV4dC5zZXRUZXh0KGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgbmFtZVRleHQuc2V0VGV4dChjbGFzc05hbWUpOwotICAgIH0KLSAgICAKLSAgICBpZiAoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgIT0gLTEpewotICAgICAgbmFtZVRleHQuc2V0VGV4dChjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKzEsIGNsYXNzTmFtZS5sZW5ndGgoKSkpOwotICAgIH0KLSAgICBuYW1lID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlTmFtZVRleHRFdmVudCgpIHsKLSAgIG5hbWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7IAotCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVQb3J0TmFtZVRleHRFdmVudCgpewotICAgIHNlbGVjdGVkUG9ydE5hbWUgPSBwb3J0TmFtZUNvbWJvLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGRpc2FibGVPS0J1dHRvbigpIHsKLSAgICBpZiAoZ2V0QnV0dG9uKDApICE9IG51bGwpCi0gICAgICBnZXRCdXR0b24oMCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlT0tCdXR0b24oKSB7Ci0gICAgaWYgKGdldEJ1dHRvbigwKSAhPSBudWxsKQotICAgICAgZ2V0QnV0dG9uKDApLnNldEVuYWJsZWQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRleHRGaWVsZEVudHJpZXMoKXsKLSAgCWlmIChjbGFzc05hbWVUZXh0LmdldFRleHQoKS5lcXVhbHMoIiIpKXsKLSAgCQlkaXNhYmxlT0tCdXR0b24oKTsKLSAgCQlyZXR1cm47Ci0gIAl9Ci0gIAlpZiAobmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscygiIikpewotICAJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCXJldHVybjsKLSAgCX0KLSAgCWlmICghaXNDbGllbnRfKXsKLSAgCQlpZiAocG9ydE5hbWVDb21iby5nZXRUZXh0KCkhPW51bGwgJiYgcG9ydE5hbWVDb21iby5nZXRUZXh0KCkuZXF1YWxzKCIiKSl7Ci0gIAkJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCQlyZXR1cm47Ci0gIAkJfQotICAJCWVsc2UgaWYgKHBvcnROYW1lQ29tYm8uZ2V0VGV4dCgpPT1udWxsKSB7Ci0gIAkJCWRpc2FibGVPS0J1dHRvbigpOwotICAJCQlyZXR1cm47Ci0gIAkJfQotICAJfQotICAJCi0gIAllbmFibGVPS0J1dHRvbigpOwotICAJCi0JCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXNzTmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgIGlmIChjbGFzc05hbWUubGFzdEluZGV4T2YoIi5qYXZhIikgIT0gLTEpewotICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuamF2YSIpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLSAgfQotICAvKioKLSAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY2xhc3NOYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9ydE5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCkgewotICAgIHJldHVybiBzZWxlY3RlZFBvcnROYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcG9ydE5hbWUgVGhlIHBvcnROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lcyhTdHJpbmdbXSBwb3J0TmFtZXMpIHsKLSAgICB0aGlzLnBvcnROYW1lcyA9IHBvcnROYW1lczsKLSAgICBwb3J0TmFtZUNvbWJvLnNldEl0ZW1zKHBvcnROYW1lcyk7Ci0gICAgcG9ydE5hbWVDb21iby5zZWxlY3QoMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ0M2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0LkVKQk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5XZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyLldlYlNlcnZpY2VzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5IYW5kbGVyVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLkNvbXBvbmVudEhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQKLSAqCi0gKiBJbml0aWFsaXplIGFuZCBsb2FkIHRoZSBoYW5kbGVycyBkYXRhCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDbWQgewotCi0gIHByaXZhdGUgSGFuZGxlclRhYmxlSXRlbVtdIGhhbmRsZXJzXzsKLQotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkXzsKLQotICBwcml2YXRlIElQYXRoIHNvdXJjZU91dHB1dExvY2F0aW9uXzsKLQotICBwcml2YXRlIEhhc2h0YWJsZSB3c1JlZnNUb0hhbmRsZXJzVGFibGVfOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHJlZk5hbWVUb1NlcnZpY2VSZWZPYmpfOwotCi0vLyAgcHJpdmF0ZSBXZWJTZXJ2aWNlRWRpdE1vZGVsIHdzRWRpdE1vZGVsXzsKLQotICBwcml2YXRlIFdlYlNlcnZpY2VzTWFuYWdlciB3ZWJTZXJ2aWNlc01hbmFnZXJfOwotCi0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0gIAotICBwcml2YXRlIFN0cmluZyBjb21wb25lbnROYW1lXzsKLSAgCi0gIHByaXZhdGUgV2ViU2VydmljZXNSZXNvdXJjZSB3c0NsaWVudFJlc187Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVJlZk5hbWVfID0gbnVsbDsKLSAgCi0gIHByaXZhdGUgQ29sbGVjdGlvbiB3c1NlcnZpY2VSZWZzXzsKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgd2ViU2VydmljZXNNYW5hZ2VyXyA9IG5ldyBXZWJTZXJ2aWNlc01hbmFnZXIoKTsKLQotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldEluaXRpYWxTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBwcm9jZXNzSGFuZGxlcnMoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHByb2Nlc3NIYW5kbGVycygpIHsKLSAgICB0cnkgewotICAgICAgVmVjdG9yIGhhbmRsZXJzID0gbmV3IFZlY3RvcigpOwotICAgICAgd3NSZWZzVG9IYW5kbGVyc1RhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIHJlZk5hbWVUb1NlcnZpY2VSZWZPYmpfID0gbmV3IEhhc2h0YWJsZSgpOwotCi0vLyAgICAgIHdzRWRpdE1vZGVsXyA9IGdldFdlYlNlcnZpY2VFZGl0TW9kZWwoKTsKLQotICAgICAgd3NTZXJ2aWNlUmVmc18gPSBnZXRXU1NlcnZpY2VSZWZzRnJvbVNlbGVjdGlvbigpOwotCi0gICAgICBpZiAod3NTZXJ2aWNlUmVmc18gIT0gbnVsbCkgewotICAgICAgICBJdGVyYXRvciB3c1JlZnNJdGVyID0gd3NTZXJ2aWNlUmVmc18uaXRlcmF0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c1NlcnZpY2VSZWZzXy5zaXplKCk7IGkrKykgewotCi0gICAgICAgICAgU2VydmljZVJlZiB3c1NlcnZpY2VSZWYgPSAoU2VydmljZVJlZikgd3NSZWZzSXRlci5uZXh0KCk7Ci0KLSAgICAgICAgICBMaXN0IHdzSGFuZGxlcnMgPSB3c1NlcnZpY2VSZWYuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlckl0ZW1zID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW1bd3NIYW5kbGVycy5zaXplKCldOwotICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgd3NIYW5kbGVycy5zaXplKCk7IGsrKykgewotCi0gICAgICAgICAgICBIYW5kbGVyIHdzSGFuZGxlciA9IChIYW5kbGVyKSB3c0hhbmRsZXJzLmdldChrKTsKLQotICAgICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBoYW5kbGVySXRlbSA9IG5ldyBIYW5kbGVyVGFibGVJdGVtKCk7Ci0gICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyKHdzSGFuZGxlcik7Ci0gICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyTmFtZSh3c0hhbmRsZXIuZ2V0SGFuZGxlck5hbWUoKSk7Ci0gICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyQ2xhc3NOYW1lKHdzSGFuZGxlci5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0V3NEZXNjUmVmKHdzU2VydmljZVJlZik7Ci0gICAgICAgICAgICBoYW5kbGVySXRlbXNba10gPSBoYW5kbGVySXRlbTsKLSAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVySXRlbSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN0cmluZyB3c1NlcnZpY2VSZWZOYW1lID0gd3NTZXJ2aWNlUmVmLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0gICAgICAgICAgd3NSZWZzVG9IYW5kbGVyc1RhYmxlXy5wdXQod3NTZXJ2aWNlUmVmTmFtZSwgaGFuZGxlckl0ZW1zKTsKLSAgICAgICAgICByZWZOYW1lVG9TZXJ2aWNlUmVmT2JqXy5wdXQod3NTZXJ2aWNlUmVmTmFtZSwgd3NTZXJ2aWNlUmVmKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlcnNfID0gKEhhbmRsZXJUYWJsZUl0ZW1bXSkgaGFuZGxlcnMudG9BcnJheShuZXcgSGFuZGxlclRhYmxlSXRlbVswXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgSGFuZGxlclRhYmxlSXRlbVtdIGdldEFsbEhhbmRsZXJzKCkgewotICAgIHJldHVybiB0aGlzLmhhbmRsZXJzXzsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0SGFuZGxlcnMoKSB7Ci0gICAgcmV0dXJuIHdzUmVmc1RvSGFuZGxlcnNUYWJsZV87Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBpc0dlblNrZWxldG9uRW5hYmxlZF8uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5Ta2VsZXRvbkVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzb3VyY2VPdXRwdXRMb2NhdGlvbl8uCi0gICAqLwotICBwdWJsaWMgSVBhdGhbXSBnZXRTb3VyY2VPdXRwdXRMb2NhdGlvbigpIHsKLSAgICBJUGF0aFtdIGxvY2F0aW9ucyA9IG51bGw7Ci0gICAgaWYgKHByb2plY3RfPT1udWxsKQotICAgICBwcm9qZWN0XyA9IGdldFByb2plY3QoKTsKLSAgICBpZiAocHJvamVjdF8gIT0gbnVsbCkgewotICAgICAgbG9jYXRpb25zID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHByb2plY3RfKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9jYXRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NFZGl0TW9kZWwuCi0gICAqLwotLy8gIHB1YmxpYyBXZWJTZXJ2aWNlRWRpdE1vZGVsIGdldFdzRWRpdE1vZGVsKCkgewotLy8gICAgcmV0dXJuIHdzRWRpdE1vZGVsXzsKLS8vICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUmVmTmFtZSgpIHsKLSAgICByZXR1cm4gdGhpcy5zZXJ2aWNlUmVmTmFtZV87Ci0gIH0KLQotICBwdWJsaWMgV2ViU2VydmljZXNSZXNvdXJjZSBnZXRXc0NsaWVudFJlc291cmNlKCkgewotICAgIHJldHVybiB3c0NsaWVudFJlc187Ci0gIH0KLQotICBwdWJsaWMgSVByb2plY3QgZ2V0Q2xpZW50UHJvamVjdCgpIHsKLSAgICByZXR1cm4gcHJvamVjdF87Ci0gIH0KLQotICBwcml2YXRlIENvbGxlY3Rpb24gZ2V0V1NTZXJ2aWNlUmVmc0Zyb21TZWxlY3Rpb24oKSB7Ci0KLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0U2VsID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChpbml0U2VsICE9IG51bGwgJiYgaW5pdFNlbC5zaXplKCkgPT0gMSkgewotICAgICAgT2JqZWN0IG9iaiA9IGluaXRTZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSBudWxsOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpIHsKLSAgICAgICAgLy8gQ2xpZW50IFNlcnZpY2VSZWYKLSAgICAgICAgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKSBvYmo7Ci0gICAgICAgIHNlcnZpY2VSZWZOYW1lXyA9IHNlcnZpY2VSZWYuZ2V0U2VydmljZVJlZk5hbWUoKTsKLSAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZVJlZik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgd3NuZ3QgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgb2JqOwotICAgICAgICBzZXJ2aWNlUmVmID0gd3NuZ3QuZ2V0U2VydmljZVJlZigpOwotICAgICAgICBzZXJ2aWNlUmVmTmFtZV8gPSBzZXJ2aWNlUmVmLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0gICAgICAgIHByb2plY3RfID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2VSZWYpOwotICAgICAgfQotCi0gICAgICBpZiAocHJvamVjdF89PW51bGwpewotICAgICAgICBwcm9qZWN0XyA9IGdldFByb2plY3QoKTsKLSAgICAgIH0KLSAgICAgIGlmIChwcm9qZWN0Xz09bnVsbCl7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBnZXQgbW9kdWxlIG5hbWUKLSAgICAgIGNvbXBvbmVudE5hbWVfID0gZ2V0Q29tcG9uZW50TmFtZSgpOwotICAgICAgCi0gICAgICBDb21wb25lbnRIYW5kbGUgY2ggPSBDb21wb25lbnRIYW5kbGUuY3JlYXRlKHByb2plY3RfLCBjb21wb25lbnROYW1lXyk7Ci0gICAgICAgCi0gICAgICBMaXN0IGNsaWVudFdTUmVzb3VyY2VMaXN0ID0gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXQxM1NlcnZpY2VSZWZzKGNoKTsKLSAgICAgIGlmICghY2xpZW50V1NSZXNvdXJjZUxpc3QuaXNFbXB0eSgpKQotICAgICAgICB3c0NsaWVudFJlc18gPSAoV2ViU2VydmljZXNSZXNvdXJjZSljbGllbnRXU1Jlc291cmNlTGlzdC5nZXQoMCk7Ci0KLSAgICAgIGlmIChKMkVFVXRpbHMuaXNXZWJDb21wb25lbnQocHJvamVjdF8sIGNvbXBvbmVudE5hbWVfKSkgewotICAgICAgICBXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0XywgY29tcG9uZW50TmFtZV8pOyAgICAgICAgICAKLSAgICAgICAgICB3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQodmMpOwotICAgICAgICAgIGlmICh3ZWJFZGl0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIHdlYkVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0gICAgICAgICAgICBpZiAod2ViQXBwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0U2VydmljZVJlZnMod2ViQXBwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseXsKLSAgICAgICAgICBpZih3ZWJFZGl0IT1udWxsKQotICAgICAgICAgICAgd2ViRWRpdC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEoyRUVVdGlscy5pc0FwcENsaWVudENvbXBvbmVudChwcm9qZWN0XywgY29tcG9uZW50TmFtZV8pKXsKLSAgICAgICAgQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lIHJ0ID0gQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdF8pOwotICAgICAgICBpZiAocnQhPW51bGwpIHsKLSAgICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnQgPSBydC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotICAgICAgICAgIGlmIChhcHBDbGllbnQgIT0gbnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRTZXJ2aWNlUmVmcyhhcHBDbGllbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoSjJFRVV0aWxzLmlzRUpCQ29tcG9uZW50KHByb2plY3RfLCBjb21wb25lbnROYW1lXykpewotICAgICAgICBFSkJOYXR1cmVSdW50aW1lIHJ0ID0gRUpCTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3RfKTsKLSAgICAgICAgaWYocnQhPW51bGwpewotICAgICAgICAgIEVKQkphciBlamJKYXIgPSBydC5nZXRFSkJKYXIoKTsKLSAgICAgICAgICBpZiAoZWpiSmFyICE9bnVsbCl7Ci0gICAgICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRTZXJ2aWNlUmVmcyhlamJKYXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBnZXRSZWZOYW1lVG9TZXJ2aWNlUmVmKCkgewotICAgIHJldHVybiB0aGlzLnJlZk5hbWVUb1NlcnZpY2VSZWZPYmpfOwotICB9Ci0gIAotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRXc1NlcnZpY2VSZWZzKCl7Ci0gICAgcmV0dXJuIHRoaXMud3NTZXJ2aWNlUmVmc187Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzMDFiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwbGljYXRpb25DbGllbnROYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3QuRUpCTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5KMkVFV2ViTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzY2xpZW50LmltcGwuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV0b29sc0NvcHlVdGlsaXR5OwotCi0vKgotICogUHJvdmlkZSBhIHdheSB0byBleHRlcm5hbGl6ZSB0aGUgZWRpdGVkIGZpZWxkcyBhbmQgY3JlYXRlIG5ldyBoYW5kbGVycwotICogIAotICovCi1wdWJsaWMgY2xhc3MgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgLy9wcml2YXRlIExpc3QgaGFuZGxlclRhYmxlSXRlbXNfOwotICBwcml2YXRlIEhhc2h0YWJsZSBvbGRXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXzsKLQotICBwcml2YXRlIEhhc2h0YWJsZSBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXzsKLQotLy8gIHByaXZhdGUgV2ViU2VydmljZUVkaXRNb2RlbCB3c0VkaXRNb2RlbF87Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgaGFuZGxlcnNUYWJsZV87Ci0KLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0XzsKLQotICBwcml2YXRlIFdlYlNlcnZpY2VzUmVzb3VyY2Ugd3NDbGllbnRSZXNfOwotCi0gIHByaXZhdGUgQ29sbGVjdGlvbiB3c1NlcnZpY2VSZWZzXzsKLQotICBwcml2YXRlIEoyRUVFZGl0TW9kZWwgZWRpdE1vZGVsXzsKLQotICBwcml2YXRlIE9iamVjdCBhY2Nlc3NvcktleV87Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICB0cnkgewotCi0gICAgICBKYXZhRU1GTmF0dXJlIGpNT0YgPSAoSmF2YUVNRk5hdHVyZSkgSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKHByb2plY3RfKTsKLQotICAgICAgb2xkV1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBuZXdXU1NlcnZpY2VSZWZzVG9IYW5kbGVyc1RhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgaWYgKHdzU2VydmljZVJlZnNfICE9IG51bGwpIHsKLSAgICAgICAgSXRlcmF0b3Igd3NSZWZzSXRlciA9IHdzU2VydmljZVJlZnNfLml0ZXJhdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NTZXJ2aWNlUmVmc18uc2l6ZSgpOyBpKyspIHsKLQotICAgICAgICAgIFNlcnZpY2VSZWYgd3NTZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHdzUmVmc0l0ZXIubmV4dCgpOwotCi0gICAgICAgICAgTGlzdCB3c0hhbmRsZXJzID0gd3NTZXJ2aWNlUmVmLmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgb2xkV1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8ucHV0KHdzU2VydmljZVJlZiwgd3NIYW5kbGVycyk7Ci0gICAgICAgICAgbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8ucHV0KHdzU2VydmljZVJlZiwgbmV3IEFycmF5TGlzdCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBoYW5kbGVyc1RhYmxlXy5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0KLSAgICAgICAgICBTdHJpbmcgc2VydmljZVJlZk5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgTGlzdCBoYW5kbGVyVGFibGVJdGVtc18gPSAoTGlzdCkgaGFuZGxlcnNUYWJsZV8uZ2V0KHNlcnZpY2VSZWZOYW1lKTsKLSAgICAgICAgICBpZiAoaGFuZGxlclRhYmxlSXRlbXNfICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGZvcm0gSGFuZGxlciB0YWJsZXMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlclRhYmxlSXRlbXNfLnNpemUoKTsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgaGFuZGxlclRhYmxlSXRlbXNfLmdldChpKTsKLSAgICAgICAgICAgICAgT2JqZWN0IHdzTW9kZWxSZWYgPSBodGkuZ2V0V3NEZXNjUmVmKCk7Ci0gICAgICAgICAgICAgIGlmICh3c01vZGVsUmVmICE9IG51bGwgJiYgd3NNb2RlbFJlZiBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpIHsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlUmVmIHdzUmVmID0gKFNlcnZpY2VSZWYpIHdzTW9kZWxSZWY7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgaGFuZGxlciA9IGh0aS5nZXRIYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCAmJiBoYW5kbGVyIGluc3RhbmNlb2YgSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgLy8gY2xvbmUgaXQKLSAgICAgICAgICAgICAgICAgIEhhbmRsZXIgY2xvbmVkSGFuZGxlciA9IChIYW5kbGVyKSBFdG9vbHNDb3B5VXRpbGl0eS5jcmVhdGVDb3B5KChIYW5kbGVyKSBoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICgoTGlzdCkgbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8uZ2V0KHdzUmVmKSkuYWRkKGNsb25lZEhhbmRsZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBpdAotICAgICAgICAgICAgICAgICAgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IHdzQ2xpZW50RmFjdG9yeSA9IG5ldyBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICBIYW5kbGVyIG5ld0hhbmRsZXIgPSB3c0NsaWVudEZhY3RvcnkuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICAgICAgICAgICAgbmV3SGFuZGxlci5zZXRIYW5kbGVyTmFtZShodGkuZ2V0SGFuZGxlck5hbWUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKSBKYXZhQ2xhc3NJbXBsLnJlZmxlY3QoaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSwgak1PRi5nZXRSZXNvdXJjZVNldCgpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBuZXdIYW5kbGVyLnNldEhhbmRsZXJDbGFzcyhqYXZhQ2xhc3MpOwotICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAoKExpc3QpIG5ld1dTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLmdldCh3c1JlZikpLmFkZChuZXdIYW5kbGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIGhhbmRsZXJzIHRvIHBvcnRzCi0gICAgICAgIGFkZEhhbmRsZXJzVG9TZXJ2aWNlUmVmcygpOwotICAgICAgICBnZXRKMkVFRWRpdE1vZGVsKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBzYXZlIHRoZSByZXNvdXJjZQotICAgICAgICBpZiAoSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHByb2plY3RfKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkgewotICAgICAgICAgIGVkaXRNb2RlbF8uc2F2ZShhY2Nlc3NvcktleV8pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmICh3c0NsaWVudFJlc18hPW51bGwpCi0gICAgICAgICAgICB3c0NsaWVudFJlc18uc2F2ZShuZXcgSGFzaE1hcCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICB9Ci0gICAgZmluYWxseSB7Ci0gICAgICBpZiAoZWRpdE1vZGVsXyAhPSBudWxsKSAKLSAgICAgICAgZWRpdE1vZGVsXy5yZWxlYXNlQWNjZXNzKGFjY2Vzc29yS2V5Xyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkSGFuZGxlcnNUb1NlcnZpY2VSZWZzKCkgewotICAgIHRyeSB7Ci0gICAgICBpbnQga2V5ID0gMDsKLSAgICAgIEVudW1lcmF0aW9uIHJlZnNUb0hhbmRsZXJzID0gbmV3V1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8ua2V5cygpOwotICAgICAgd2hpbGUgKHJlZnNUb0hhbmRsZXJzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgIFNlcnZpY2VSZWYgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKSByZWZzVG9IYW5kbGVycy5uZXh0RWxlbWVudCgpOwotICAgICAgICBpZiAoc2VydmljZVJlZiAhPSBudWxsKSB7Ci0KLSAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gKExpc3QpIG5ld1dTU2VydmljZVJlZnNUb0hhbmRsZXJzVGFibGVfLmdldChzZXJ2aWNlUmVmKTsKLSAgICAgICAgICBMaXN0IG1vZGVsSGFuZGxlcnMgPSAoTGlzdCkgb2xkV1NTZXJ2aWNlUmVmc1RvSGFuZGxlcnNUYWJsZV8uZ2V0KHNlcnZpY2VSZWYpOwotICAgICAgICAgIG1vZGVsSGFuZGxlcnMuY2xlYXIoKTsKLSAgICAgICAgICBtb2RlbEhhbmRsZXJzLmFkZEFsbChoYW5kbGVycyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gaGFuZGxlclRhYmxlSXRlbXMKLSAgICogICAgICAgICAgVGhlIGhhbmRsZXJUYWJsZUl0ZW1zIHRvIHNldC4KLSAgICovCi0gIC8vICBwdWJsaWMgdm9pZCBzZXRBbGxIYW5kbGVyc0xpc3QoTGlzdCBoYW5kbGVyVGFibGVJdGVtcykgewotICAvLyAgICB0aGlzLmhhbmRsZXJUYWJsZUl0ZW1zXyA9IGhhbmRsZXJUYWJsZUl0ZW1zOwotICAvLyAgfQotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyc1RhYmxlKEhhc2h0YWJsZSBoYW5kbGVyc1RhYmxlKSB7Ci0gICAgdGhpcy5oYW5kbGVyc1RhYmxlXyA9IGhhbmRsZXJzVGFibGU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdzRWRpdE1vZGVsCi0gICAqICAgICAgICAgIFRoZSB3c0VkaXRNb2RlbCB0byBzZXQuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIHNldFdzRWRpdE1vZGVsKFdlYlNlcnZpY2VFZGl0TW9kZWwgd3NFZGl0TW9kZWwpIHsKLS8vICAgIHRoaXMud3NFZGl0TW9kZWxfID0gd3NFZGl0TW9kZWw7Ci0vLyAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgIHRoaXMucHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NDbGllbnRSZXNvdXJjZShXZWJTZXJ2aWNlc1Jlc291cmNlIHdzUmVzKSB7Ci0gICAgdGhpcy53c0NsaWVudFJlc18gPSB3c1JlczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzU2VydmljZVJlZnMoQ29sbGVjdGlvbiB3c1JlZnMpIHsKLSAgICB0aGlzLndzU2VydmljZVJlZnNfID0gd3NSZWZzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SjJFRUVkaXRNb2RlbCgpIHsKLSAgCWFjY2Vzc29yS2V5XyA9IG5ldyBPYmplY3QoKTsKLSAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdF8pKSB7Ci0gICAgICBKMkVFV2ViTmF0dXJlUnVudGltZSBydCA9IEoyRUVXZWJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUocHJvamVjdF8pOwotICAgICAgaWYgKHJ0ICE9IG51bGwpIHsKLSAgICAgICAgZWRpdE1vZGVsXyA9IHJ0LmdldFdlYkFwcEVkaXRNb2RlbEZvcldyaXRlKGFjY2Vzc29yS2V5Xyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFJlc291cmNlVXRpbHMuaXNBcHBDbGllbnRQcm9qZWN0KHByb2plY3RfKSl7Ci0gICAgICBBcHBsaWNhdGlvbkNsaWVudE5hdHVyZVJ1bnRpbWUgcnQgPSBBcHBsaWNhdGlvbkNsaWVudE5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0Xyk7Ci0gICAgICBpZiAocnQhPW51bGwpIHsKLSAgICAgICAgZWRpdE1vZGVsXyA9IHJ0LmdldEFwcENsaWVudEVkaXRNb2RlbEZvcldyaXRlKGFjY2Vzc29yS2V5Xyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3RfKSl7Ci0gICAgICBFSkJOYXR1cmVSdW50aW1lIHJ0ID0gRUpCTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3RfKTsKLSAgICAgIGlmKHJ0IT1udWxsKXsKLSAgICAgICAgZWRpdE1vZGVsXyA9IHJ0LmdldEVKQkVkaXRNb2RlbEZvcldyaXRlKGFjY2Vzc29yS2V5Xyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjM3YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NsaWVudFdpemFyZFdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFdpemFyZFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgoteyAgCi0gIHByaXZhdGUgV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQgY2xpZW50V2lkZ2V0XzsKLSAgcHJpdmF0ZSBQcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldCBwcmVmZXJlbmNlc1dpZGdldF87Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTMgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgY2hlY2tib3ggb2YgdGhlIHByb2plY3QgcGFnZSovICAKLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX1RFU1RfU0VSVklDRSA9ICJQV1BSMDAxMyI7Ci0gIHByaXZhdGUgQnV0dG9uIHRlc3RTZXJ2aWNlXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxNCBmb3IgdGhlIG1vbml0b3Igc2VydmljZSBjaGVja2JveCBvZiB0aGUgcHJvamVjdCBwYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX01PTklUT1JfU0VSVklDRSA9ICJQV1JQUjAwMTQiOwotICBwcml2YXRlIEJ1dHRvbiBtb25pdG9yU2VydmljZTsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwMSBmb3IgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9QQUdFID0gIlBXUFIwMDAxIjsKLSAgICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdXRpbHMgICAgPSBuZXcgVUlVdGlscyggbXNnVXRpbHMsIHBsdWdpbklkICk7Ci0gICAgCi0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZCArICIuIiArICBJTkZPUE9QX1BXUFJfUEFHRSApOwotICAJCi0gIAlDb21wb3NpdGUgY2xpZW50Q29tcG9zaXRlID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDEgKTsKLSAgCQotICAgIGNsaWVudFdpZGdldF8gPSBuZXcgV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQoKTsKLSAgICBjbGllbnRXaWRnZXRfLmFkZENvbnRyb2xzKGNsaWVudENvbXBvc2l0ZSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICAKLSAgICAvLyAgQ3JlYXRlIHRlc3Qgc2VydmljZSBjaGVjayBib3guCi0gICAgQ29tcG9zaXRlIHRlc3RHcm91cCA9IHV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShjbGllbnRDb21wb3NpdGUsMSk7Ci0gICAgCi0gICAgdGVzdFNlcnZpY2VfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIHRlc3RHcm91cCwgIkNIRUNLQk9YX1RFU1RfV0VCU0VSVklDRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX1RFU1RfU0VSVklDRSApOwotICAgIAotICAgIC8vIENyZWF0ZSBtb25pdG9yIHNlcnZpY2UgY2hlY2sgYm94LgotICAgIG1vbml0b3JTZXJ2aWNlID0gdXRpbHMuY3JlYXRlQ2hlY2tib3godGVzdEdyb3VwLCAiQ0hFQ0tCT1hfTU9OSVRPUl9XRUJTRVJWSUNFIiwgIlRPT0xUSVBfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UiLCBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgcHJlZmVyZW5jZXMgY29udHJvbHMuCi0gICAgcHJlZmVyZW5jZXNXaWRnZXRfID0gbmV3IFByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgcHJlZmVyZW5jZXNXaWRnZXRfLmFkZENvbnRyb2xzKCBjbGllbnRDb21wb3NpdGUsIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dCggUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgKQotICB7Ci0gICAgcHJlZmVyZW5jZXNXaWRnZXRfLnNldFJlc291cmNlQ29udGV4dCggY29udGV4dCApOwotICB9Ci0gICAKLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIHByZWZlcmVuY2VzV2lkZ2V0Xy5nZXRSZXNvdXJjZUNvbnRleHQoKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgY2xpZW50V2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlciggaWRzICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldFRlc3RTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggdGVzdFNlcnZpY2VfLmdldFNlbGVjdGlvbigpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKCBCb29sZWFuIHZhbHVlICkKLSAgewotICAgIHRlc3RTZXJ2aWNlXy5zZXRTZWxlY3Rpb24oIHZhbHVlLmJvb2xlYW5WYWx1ZSgpICk7ICAKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0TW9uaXRvclNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKG1vbml0b3JTZXJ2aWNlLmdldFNlbGVjdGlvbigpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoQm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIG1vbml0b3JTZXJ2aWNlLnNldFNlbGVjdGlvbih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTI5YTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsgICAgCi0gIHB1YmxpYyBCb29sZWFuIGdldFRlc3RTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0VGVzdFdlYlNlcnZpY2UoKSApOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRNb25pdG9yU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGdldFNjZW5hcmlvQ29udGV4dCgpLmdldE1vbml0b3JXZWJTZXJ2aWNlKCkpOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7IAotICAgIHJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gIH0KLSAgCi0gIC8vIEN1cnJlbnQgU2NlbmFyaW9Db250ZXh0IGlzIHVzZWQgdG8gZGVmYXVsdCB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkLiAgVGhlIAotICAvLyBwcm9wZXJ0aWVzIGluIFNjZW5hcmlvQ29udGV4dCBhcmUgbWFwcGVkIGluZGl2aWR1YWwuICBUaGVyZWZvcmUsIFNjZW5hcmlvQ29udGV4dAotICAvLyBzaG91bGQgbm90IGFsc28gYmUgbWFwcGVkLgotICBwcm90ZWN0ZWQgU2NlbmFyaW9Db250ZXh0IGdldFNjZW5hcmlvQ29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotICB9Ci0gIAotICAvLyBUT0RPIFNldCBjbGllbnQgbmFtZSBkZWZhdWx0cyBoZXJlLiAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICAvLyByc2tyZWcKLQkJLy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAgICAgPSBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpOwotICAgIC8vU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lICA9IHJlZ2lzdHJ5LmdldEFsbENsaWVudFJ1bnRpbWVzKClbMF07Ci0JCVN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZSAgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldEFsbENsaWVudFJ1bnRpbWVzKClbMF07Ci0gICAgLy9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciAgID0gcmVnaXN0cnkuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpWzBdOwotCQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciAgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRBbGxDbGllbnRTZXJ2ZXJGYWN0b3J5SWRzKClbMF07Ci0gICAgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgICAgICAgICByZXN1bHQgICA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotCQkvLyByc2tyZWcKLSAgICAKLSAgICByZXN1bHQuc2V0VHlwZUlkKCB0eXBlICk7Ci0gICAgcmVzdWx0LnNldFJ1bnRpbWVJZCggcnVudGltZSApOwotICAgIHJlc3VsdC5zZXRTZXJ2ZXJJZCggc2VydmVyICk7IAotICAgIAotICAgIHJldHVybiByZXN1bHQ7ICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQzNmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsgICAgCi0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgdGVzdFNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gbW9uaXRvclNlcnZpY2U7Ci0gIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICAgcmVzb3VyY2VDb250ZXh0XzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHNfOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RTZXJ2aWNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKCBib29sZWFuIHRlc3RTZXJ2aWNlICkKLSAgewotICAgIHRlc3RTZXJ2aWNlXyA9IHRlc3RTZXJ2aWNlOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBtb25pdG9yU2VydmljZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoYm9vbGVhbiBtb25pdG9yU2VydmljZSkKLSAgewotICAgIHRoaXMubW9uaXRvclNlcnZpY2UgPSBtb25pdG9yU2VydmljZTsKLSAgfQotICAKLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgCi0gICAgcmV0dXJuIHJlc291cmNlQ29udGV4dF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQ29udGV4dCggUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgKQotICB7Ci0gICAgcmVzb3VyY2VDb250ZXh0XyA9IGNvbnRleHQ7ICAKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgeyAgICAKLSAgICByZXR1cm4gY2xpZW50SWRzXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzICkKLSAgewotICAgIGNsaWVudElkc18gPSBjbGllbnRJZHM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4NDk5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotICogQ29uZmlnQ2xpZW50SGFuZGxlcnNUcmVlV2lkZ2V0Ci0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLQotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbnVsbDsKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcl87Ci0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0dlblNrZWxldG9uRW5hYmxlZF87Ci0gIHByaXZhdGUgU3RyaW5nIG91dHB1dExvY2F0aW9uXzsKLSAgcHJpdmF0ZSBDb21ibyB3ZWJTZXJ2aWNlUmVmQ29tYm9fOwotICBwcml2YXRlIFRhYmxlIGhhbmRsZXJzVGFibGVfOwotICBwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyXzsKLSAgcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uXzsKLSAgcHJpdmF0ZSBCdXR0b24gZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl87Ci0gIHByaXZhdGUgQ29tYm8gc291cmNlTG9jYXRpb25Db21ib187Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgcGF0aHNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdzUmVmc1RvSGFuZGxlcnNfOwotICBwcml2YXRlIEhhc2h0YWJsZSByZWZOYW1lVG9TZXJ2aWNlUmVmXzsKLSAgcHJpdmF0ZSBWZWN0b3Igb3JkZXJlZEhhbmRsZXJzXzsKLSAgLy9wcml2YXRlIFNlcnZpY2VSZWYgc2VydmljZVJlZl87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VSZWZOYW1lXzsKLSAgcHJpdmF0ZSBpbnQgREVGQVVMVF9DT0xVTU5fV0lEVEggPSAxNTA7Ci0KLSAgLy8gLS0tLVRPT0xUSVBTIFNlY3Rpb24tLS0tCi0gIC8qIENPTlRFWFRfSUQgSERMUjAwMDEgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfSERMUl9XU19IQU5ETEVSUyA9ICJIRExSMDAwMSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTID0gIlRPT0xUSVBfRURJVF9XU19IQU5ETEVSUyI7Ci0KLSAgLyogQ09OVEVYVF9JRCBIRExSMDAwMiBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9IRExSX0dFTl9TS0VMRVRPTiA9ICJIRExSMDAwMiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9CVVRUT05fR0VOX1NLRUxFVE9OID0gIlRPT0xUSVBfQlVUVE9OX0dFTl9TS0VMRVRPTiI7Ci0KLSAgLyogQ09OVEVYVF9JRCBIRExSMDAwMyBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9DT01CT19TT1VSQ0VfTE9DID0gIkhETFIwMDAzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBUT09MVElQX0NPTUJPX1NPVVJDRV9MT0MgPSAiVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DIjsKLQotICAvKiBDT05URVhUX0lEIEhETFIwMDA0IGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1dTX0NMSUVOVF9SRUYgPSAiSERMUjAwMDQiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfV1NfQ0xJRU5UX1JFRiA9ICJUT09MVElQX1dTX0NMSUVOVF9SRUYiOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0KCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIFVJVXRpbHMgdWlVdGlscyA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzXywgcGx1Z2luSWRfKTsKLQotICAgIHBhcmVudF8gPSBwYXJlbnQ7Ci0gICAgc3RhdHVzTGlzdGVuZXJfID0gc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICAvLyBXZWIgc2VydmljZSByZWZlcmVuY2UgY29tYm8KLSAgICBDb21wb3NpdGUgd2ViU2VydmljZVJlZkNvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnRfLCAyKTsKLSAgICB3ZWJTZXJ2aWNlUmVmQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyh3ZWJTZXJ2aWNlUmVmQ29tcCwgIkxBQkVMX0NPTUJPX1dTX0NMSUVOVF9SRUYiLCBUT09MVElQX1dTX0NMSUVOVF9SRUYsIElORk9QT1BfV1NfQ0xJRU5UX1JFRiwKLSAgICAgICAgU1dULlJFQURfT05MWSk7Ci0gICAgd2ViU2VydmljZVJlZkNvbWJvXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZ0KSB7Ci0gICAgICAgIGhhbmRsZVdlYlNlcnZpY2VSZWZDb21ibyhldnQpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgQ29tcG9zaXRlIGRpc3BsYXlDb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnRfLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGRpc3BsYXlDb21wLnNldExheW91dChncmlkbGF5b3V0KTsKLSAgICBkaXNwbGF5Q29tcC5zZXRMYXlvdXREYXRhKHVpVXRpbHMuY3JlYXRlRmlsbEFsbCgpKTsKLQotICAgIENvbXBvc2l0ZSBoYW5kbGVyc0NvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShkaXNwbGF5Q29tcCwgMSk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HCi0gICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgaGFuZGxlcnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGhhbmRsZXJzQ29tcC5zZXRTaXplKDEzMCwgNjAwKTsKLQotICAgIENvbXBvc2l0ZSBidXR0b25zQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGRpc3BsYXlDb21wLCAxKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIGJ1dHRvbnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotCi0gICAgVGV4dCBoYW5kbGVyc1RleHQgPSBuZXcgVGV4dChoYW5kbGVyc0NvbXAsIFNXVC5SRUFEX09OTFkpOwotICAgIGhhbmRsZXJzVGV4dC5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9IQU5ETEVSU19DT05GSUciKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgaGFuZGxlcnNUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgaGFuZGxlcnNUYWJsZV8gPSB1aVV0aWxzLmNyZWF0ZVRhYmxlKGhhbmRsZXJzQ29tcCwgVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTLCBJTkZPUE9QX0hETFJfV1NfSEFORExFUlMsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgaGFuZGxlcnNUYWJsZV8uc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICBoYW5kbGVyc1RhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAvLyBlbXB0eSBzcGFjZQotICAgIExhYmVsIHdzTGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uc0NvbXAsIFNXVC5OT05FKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB3c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgQnV0dG9uIG1vdmVVcEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9NT1ZFX1VQIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBtb3ZlVXBCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0gICAgbW92ZVVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEJ1dHRvbiBtb3ZlRG93bkJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9NT1ZFX0RPV04iLCBudWxsLCBudWxsKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIG1vdmVEb3duQnV0dG9uLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIG1vdmVEb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlTW92ZURvd25CdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gZW1wdHkgc3BhY2UKLSAgICB3c0xhYmVsID0gbmV3IExhYmVsKGJ1dHRvbnNDb21wLCBTV1QuTk9ORSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgd3NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGFkZEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fQUREIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBhZGRCdXR0b25fLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGFkZEJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgcmVtb3ZlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9SRU1PVkUiLCBudWxsLCBudWxsKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIHJlbW92ZUJ1dHRvbl8uc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0gICAgcmVtb3ZlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgZW5hYmxlUmVtb3ZlKGZhbHNlKTsKLQotICAgIC8vIHRhYmxlIHN0dWZmCi0gICAgU3RyaW5nW10gY29sdW1uc18gPSBuZXcgU3RyaW5nW10geyBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfSEFORExFUl9OQU1FIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJMRV9IQU5ETEVSX0NMQVNTIil9OwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zXy5sZW5ndGg7IGkrKykgewotICAgICAgVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oaGFuZGxlcnNUYWJsZV8sIGkpOwotICAgICAgdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5zX1tpXSk7Ci0gICAgICB0YWJsZUNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgICAgdGFibGVDb2x1bW4uc2V0V2lkdGgoREVGQVVMVF9DT0xVTU5fV0lEVEgpOwotICAgICAgdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotICAgIH0KLQotICAgIHRhYmxlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcihoYW5kbGVyc1RhYmxlXyk7Ci0gICAgQ29udHJvbCBjb250cm9sID0gdGFibGVWaWV3ZXJfLmdldENvbnRyb2woKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgdGFibGVWaWV3ZXJfLnNldENvbHVtblByb3BlcnRpZXMoY29sdW1uc18pOwotICAgIHRhYmxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IExpc3RMYWJlbFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGVuYWJsZVJlbW92ZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIC8vIGdlbiBza2VsZXRvbiBjaGVjayBib3gKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3gocGFyZW50XywgIkxBQkVMX0JVVFRPTl9HRU5fU0tFTEVUT04iLCBUT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04sIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04pOwotICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlR2VuU2tlbGV0b25SYWRpb0J1dHRvbigpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gc291cmNlIGxvY2F0aW9uIGNvbWJvCi0gICAgQ29tcG9zaXRlIHNvdXJjZUxvY2F0aW9uQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHBhcmVudF8sIDIpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXAsICJMQUJFTF9DT01CT19TT1VSQ0VfTE9DIiwgVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DLCBJTkZPUE9QX0NPTUJPX1NPVVJDRV9MT0MsCi0gICAgICAgIFNXVC5SRUFEX09OTFkpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlU291cmNlTG9jYXRpb25Db21ibyhldnQpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvLyBDYWxsZWQgYXQgc3RhcnQKLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlSGFuZGxlcnNUYWJsZSgpIHsKLSAgICB0cnkgewotCi0gICAgICBpbnQgc2l6ZU9mSGFuZGxlcnMgPSB3c1JlZnNUb0hhbmRsZXJzXy5zaXplKCk7Ci0gICAgICBTdHJpbmdbXSB3c1JlZnMgPSBuZXcgU3RyaW5nW3NpemVPZkhhbmRsZXJzXTsKLQotICAgICAgU3RyaW5nW10gd3NSZWZOYW1lcyA9IChTdHJpbmdbXSkgd3NSZWZzVG9IYW5kbGVyc18ua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHdlYlNlcnZpY2VSZWZDb21ib18uc2V0SXRlbXMod3NSZWZOYW1lcyk7Ci0gICAgICB3ZWJTZXJ2aWNlUmVmQ29tYm9fLnNlbGVjdCgwKTsKLQotICAgICAgaWYgKHNpemVPZkhhbmRsZXJzIDwgMSkgewotICAgICAgICB3ZWJTZXJ2aWNlUmVmQ29tYm9fLnNlbGVjdCgwKTsKLSAgICAgICAgd2ViU2VydmljZVJlZkNvbWJvXy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoc2VydmljZVJlZk5hbWVfICE9IG51bGwpIHsKLSAgICAgICAgICBpbnQgaW5kZXggPSB3ZWJTZXJ2aWNlUmVmQ29tYm9fLmluZGV4T2Yoc2VydmljZVJlZk5hbWVfKTsKLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHdlYlNlcnZpY2VSZWZDb21ib18uc2VsZWN0KGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgd2ViU2VydmljZVJlZkNvbWJvXy5zZWxlY3QoMCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGdldCB3ZWJTZXJ2aWNlUmVmIGhpbnQKLSAgICAgIFN0cmluZyB3c1JlZiA9IHdlYlNlcnZpY2VSZWZDb21ib18uZ2V0VGV4dCgpOwotCi0gICAgICBpZiAod3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdzUmVmKSAhPSBudWxsKSB7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSAoVmVjdG9yKSB3c1JlZnNUb0hhbmRsZXJzXy5nZXQod3NSZWYpOwotICAgICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQob3JkZXJlZEhhbmRsZXJzXyk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGhhbmRsZXJzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QWxsSGFuZGxlcnNMaXN0KCkgewotICAgIC8vIGNvbnZlcnQgdG8gYSBBcnJheUxpc3QgYW5kIHJldHVybiBhcyBMaXN0Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChvcmRlcmVkSGFuZGxlcnNfICE9IG51bGwgJiYgIW9yZGVyZWRIYW5kbGVyc18uaXNFbXB0eSgpKSBsaXN0LmFkZEFsbChvcmRlcmVkSGFuZGxlcnNfKTsKLQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgU3RhdHVzIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICByZXR1cm4gZmluYWxTdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIEFkZEhhbmRsZXJEaWFsb2cgZGlhbG9nID0gZGlhbG9nID0gbmV3IEFkZEhhbmRsZXJEaWFsb2cocGFyZW50Xy5nZXRTaGVsbCgpLCB0cnVlKTsKLSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSggNTAwLCAyMDAgKTsKLSAgICAKLSAgICBpbnQgcmVzdWx0ID0gZGlhbG9nLm9wZW4oKTsKLQotICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGRpYWxvZy5nZXROYW1lKCk7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZGlhbG9nLmdldENsYXNzTmFtZSgpOwotCi0gICAgICBIYW5kbGVyVGFibGVJdGVtIGhpID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW0oKTsKLSAgICAgIGhpLnNldEhhbmRsZXJOYW1lKG5hbWUpOwotICAgICAgaGkuc2V0SGFuZGxlckNsYXNzTmFtZShjbGFzc05hbWUpOwotICAgICAgU3RyaW5nIHdzUmVmTmFtZSA9IHdlYlNlcnZpY2VSZWZDb21ib18uZ2V0VGV4dCgpOwotICAgICAgU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gKFNlcnZpY2VSZWYpIHJlZk5hbWVUb1NlcnZpY2VSZWZfLmdldCh3c1JlZk5hbWUpOwotICAgICAgaGkuc2V0V3NEZXNjUmVmKHNlcnZpY2VSZWYpOwotCi0gICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdzUmVmTmFtZSk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfLmFkZChoaSk7Ci0KLSAgICB9Ci0KLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGludCBpbmRleCA9IHRhYmxlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3RlZCA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgIGlmIChpbmRleCA+IDApIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXggLSAxKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb3ZlRG93bkJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBpbnQgaW5kZXggPSB0YWJsZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0ZWQgPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICBpZiAoaW5kZXggPCBvcmRlcmVkSGFuZGxlcnNfLnNpemUoKSAtIDEpIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKSk7ICAgICAgICAKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IG9yZGVyZWRIYW5kbGVyc18ucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleCArIDEpOwotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlU291cmNlTG9jYXRpb25Db21ibyhTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgIG91dHB1dExvY2F0aW9uXyA9IHNvdXJjZUxvY2F0aW9uQ29tYm9fLmdldFRleHQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUdlblNrZWxldG9uUmFkaW9CdXR0b24oKSB7Ci0gICAgaWYgKGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmlzRW5hYmxlZCgpKSB7Ci0gICAgICBpZiAoZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uZ2V0U2VsZWN0aW9uKCkpCi0gICAgICAgIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfID0gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVXZWJTZXJ2aWNlUmVmQ29tYm8oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGlmICh3ZWJTZXJ2aWNlUmVmQ29tYm9fLmlzRW5hYmxlZCgpKSB7Ci0gICAgICBTdHJpbmcgd2ViU2VydmljZVJlZk5hbWUgPSB3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKTsKLSAgICAgIFZlY3RvciBobmRsZXJzID0gKFZlY3Rvcikgd3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdlYlNlcnZpY2VSZWZOYW1lKTsKLSAgICAgIC8vSGFuZGxlclRhYmxlSXRlbSBpdGVtID0gKEhhbmRsZXJUYWJsZUl0ZW0paG5kbGVycy5nZXQoMCk7Ci0gICAgICAvL3NlcnZpY2VSZWZfID0gKFNlcnZpY2VSZWYpaXRlbS5nZXRXc0Rlc2NSZWYoKTsKLSAgICAgIGlmIChobmRsZXJzICE9IG51bGwpIHsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KGhuZGxlcnMpOwotICAgICAgICB0YWJsZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzR2VuU2tlbGV0b25FbmFibGVkXy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkXygpIHsKLSAgICByZXR1cm4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIExpc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEhhbmRsZXJUYWJsZUl0ZW0pIHsKLSAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgb2JqZWN0OwotICAgICAgICBpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCi0gICAgICAgICAgcmV0dXJuIGh0aS5nZXRIYW5kbGVyTmFtZSgpICE9IG51bGwgPyBodGkuZ2V0SGFuZGxlck5hbWUoKSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsgcmV0dXJuIGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkgIT0gbnVsbCA/IGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkgOiAiIjsgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlUmVtb3ZlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgIHJlbW92ZUJ1dHRvbl8uc2V0RW5hYmxlZChlbmFibGVkICYmICF0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZlY3RvcikgeyByZXR1cm4gKChWZWN0b3IpIGVsZW1lbnQpLnRvQXJyYXkoKTsgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKSB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLSAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IGhhbmRsZXJzVGFibGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpbnQgc2VsZWN0aW9uQ291bnQgPSBoYW5kbGVyc1RhYmxlXy5nZXRJdGVtQ291bnQoKTsKLQotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzUmVmc1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlUmVmQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShzZWxlY3Rpb25JbmRleCk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICB0cnkgewotICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KG51bGwpOwotICAgICAgaWYgKG9yZGVyZWRIYW5kbGVyc18gIT0gbnVsbCkgdGFibGVWaWV3ZXJfLnNldElucHV0KG9yZGVyZWRIYW5kbGVyc18pOwotICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEdlblNrZWxldG9uRW5hYmxlZChib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkKSB7Ci0gICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSBpc0dlblNrZWxldG9uRW5hYmxlZDsKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5zZXRTZWxlY3Rpb24oaXNHZW5Ta2VsZXRvbkVuYWJsZWQpOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5Ta2VsZXRvbkVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U291cmNlT3V0cHV0TG9jYXRpb24oSVBhdGhbXSBsb2NhdGlvbnMpIHsKLSAgICBpZiAobG9jYXRpb25zWzBdIT1udWxsKQotICAgICAgdGhpcy5vdXRwdXRMb2NhdGlvbl8gPSBsb2NhdGlvbnNbMF0udG9TdHJpbmcoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm47Ci0gICAgCi0gICAgU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2xvY2F0aW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBwYXRoc1tpXSA9IGxvY2F0aW9uc1tpXS50b1N0cmluZygpOwotICAgICAgcGF0aHNUYWJsZV8ucHV0KHBhdGhzW2ldLCBsb2NhdGlvbnNbaV0pOwotICAgIH0KLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZXRJdGVtcyhwYXRocyk7Ci0gICAgc291cmNlTG9jYXRpb25Db21ib18uc2VsZWN0KDApOwotCi0gIH0KLQotICBwdWJsaWMgSVBhdGggZ2V0U291cmNlT3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgSVBhdGggb3V0cHV0UGF0aCA9IChJUGF0aCkgcGF0aHNUYWJsZV8uZ2V0KG91dHB1dExvY2F0aW9uXyk7Ci0gICAgcmV0dXJuIG91dHB1dFBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyQ2xhc3NOYW1lcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRIYW5kbGVyQ2xhc3NOYW1lcygpIHsKLSAgICBWZWN0b3IgaGFuZGxlckNsYXNzZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBFbnVtZXJhdGlvbiBlID0gd3NSZWZzVG9IYW5kbGVyc18ua2V5cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0KLSAgICAgIFN0cmluZyB3c1JlZk5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NSZWZzVG9IYW5kbGVyc18uZ2V0KHdzUmVmTmFtZSk7Ci0KLSAgICAgIGlmIChvcmRlcmVkSGFuZGxlcnNfICE9IG51bGwpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkSGFuZGxlcnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgb3JkZXJlZEhhbmRsZXJzXy5nZXQoaSk7Ci0gICAgICAgICAgaGFuZGxlckNsYXNzZXMuYWRkKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10paGFuZGxlckNsYXNzZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzUmVmc1RvSGFuZGxlcnNfLgotICAgKi8KLSAgcHVibGljIEhhc2h0YWJsZSBnZXRXc1JlZnNUb0hhbmRsZXJzKCkgewotICAgIHJldHVybiB3c1JlZnNUb0hhbmRsZXJzXzsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd3NSZWZzVG9IYW5kbGVyc18KLSAgICogICAgICAgICAgVGhlIHdzUmVmc1RvSGFuZGxlcnNfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdzUmVmc1RvSGFuZGxlcnMoSGFzaHRhYmxlIHdzUmVmc1RvSGFuZGxlcnNBcnJheSkgewotCi0gICAgd3NSZWZzVG9IYW5kbGVyc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdHJ5IHsKLQotICAgICAgaWYgKHdzUmVmc1RvSGFuZGxlcnNBcnJheSAhPSBudWxsKSB7Ci0gICAgICAgIGludCBzaXplT2ZIYW5kbGVycyA9IHdzUmVmc1RvSGFuZGxlcnNBcnJheS5zaXplKCk7Ci0gICAgICAgIFN0cmluZ1tdIHdzUmVmcyA9IG5ldyBTdHJpbmdbc2l6ZU9mSGFuZGxlcnNdOwotICAgICAgICAvLyBzdG9yZSB0aGUgd3NSZWZzCi0gICAgICAgIEVudW1lcmF0aW9uIHdzUmVmID0gd3NSZWZzVG9IYW5kbGVyc0FycmF5LmtleXMoKTsKLSAgICAgICAgd2hpbGUgKHdzUmVmLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgU3RyaW5nIHdzUmVmTmFtZSA9IChTdHJpbmcpIHdzUmVmLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlcnMgPSAoSGFuZGxlclRhYmxlSXRlbVtdKSB3c1JlZnNUb0hhbmRsZXJzQXJyYXkuZ2V0KHdzUmVmTmFtZSk7Ci0gICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaGFuZGxlcnNUYWJsZQotICAgICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgb3JkZXJlZEhhbmRsZXJzXy5hZGQoaGFuZGxlcnNbaV0pOwotICAgICAgICAgIH0KLSAgICAgICAgICB3c1JlZnNUb0hhbmRsZXJzXy5wdXQod3NSZWZOYW1lLCBvcmRlcmVkSGFuZGxlcnNfKTsKLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVJlZk5hbWUoU3RyaW5nIHdzUmVmTmFtZSkgewotICAgIHNlcnZpY2VSZWZOYW1lXyA9IHdzUmVmTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlZk5hbWVUb1NlcnZpY2VSZWYoSGFzaHRhYmxlIHJlZk5hbWUyU0YpIHsKLSAgICB0aGlzLnJlZk5hbWVUb1NlcnZpY2VSZWZfID0gcmVmTmFtZTJTRjsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0NvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhNjM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuSGFuZGxlclRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotLyoqCi0gKiBDb25maWdTZXJ2aWNlSGFuZGxlcnNUcmVlV2lkZ2V0Ci0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXyA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXJfOwotICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnRfOwotICBwcml2YXRlIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICBwcml2YXRlIFN0cmluZyBvdXRwdXRMb2NhdGlvbl87Ci0KLSAgcHJpdmF0ZSBUYWJsZSBoYW5kbGVyc1RhYmxlXzsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcl87Ci0gIHByaXZhdGUgQ29tYm8gd2ViU2VydmljZURlc2NDb21ib187Ci0gIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIGdlblNrZWxldG9uUmFkaW9CdXR0b25fOwotICBwcml2YXRlIENvbWJvIHNvdXJjZUxvY2F0aW9uQ29tYm9fOwotICBwcml2YXRlIFRleHQgdGV4dF87IC8vIHNlbGVjdGVkIFRleHQKLQotICBwcml2YXRlIEhhbmRsZXJUYWJsZUl0ZW1bXSBoYW5kbGVyczsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcGF0aHNUYWJsZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdzRGVzY1RvSGFuZGxlcnNfOwotICBwcml2YXRlIEhhc2h0YWJsZSB3c0Rlc2NUb1BvcnRzXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb25OYW1lXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBWZWN0b3Igb3JkZXJlZEhhbmRsZXJzXzsKLQotICBwcml2YXRlIGludCBERUZBVUxUX0NPTFVNTl9XSURUSCA9IDkwOwotCi0gIC8vIC0tLS1UT09MVElQUyBTZWN0aW9uLS0tLQotICAvKiBDT05URVhUX0lEIFNITEQwMDAxIGZvciB0aGUgSGFuZGxlciBDb25maWcgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX0hETFJfV1NfSEFORExFUlMgPSAiU0hETDAwMDEiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfRURJVF9XU19IQU5ETEVSUyA9ICJUT09MVElQX0VESVRfV1NfSEFORExFUlMiOwotCi0gIC8qIENPTlRFWFRfSUQgU0hETDAwMDIgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04gPSAiU0hETDAwMDIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfQlVUVE9OX0dFTl9TS0VMRVRPTiA9ICJUT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04iOwotCi0gIC8qIENPTlRFWFRfSUQgU0hETDAwMDMgZm9yIHRoZSBIYW5kbGVyIENvbmZpZyBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfQ09NQk9fU09VUkNFX0xPQyA9ICJTSERMMDAwMyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DID0gIlRPT0xUSVBfQ09NQk9fU09VUkNFX0xPQyI7Ci0KLSAgLyogQ09OVEVYVF9JRCBTSERMMDAwNCBmb3IgdGhlIEhhbmRsZXIgQ29uZmlnIFBhZ2UgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9XU19TRVJWSUNFX0RFU0MgPSAiU0hETDAwMDQiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfV1NfU0VSVklDRV9ERVNDID0gIlRPT0xUSVBfV1NfU0VSVklDRV9ERVNDIjsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQoKSB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgVUlVdGlscyB1aVV0aWxzID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBwbHVnaW5JZF8pOwotCi0gICAgcGFyZW50XyA9IHBhcmVudDsKLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsKLQotICAgIC8vIFdlYiBzZXJ2aWNlIHJlZmVyZW5jZSBjb21ibwotICAgIENvbXBvc2l0ZSB3ZWJTZXJ2aWNlUmVmQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHBhcmVudF8sIDIpOwotICAgIHdlYlNlcnZpY2VEZXNjQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyh3ZWJTZXJ2aWNlUmVmQ29tcCwgIkxBQkVMX0NPTUJPX1dTX1NFUlZJQ0VfREVTQyIsIFRPT0xUSVBfV1NfU0VSVklDRV9ERVNDLCBUT09MVElQX1dTX1NFUlZJQ0VfREVTQywKLSAgICAgICAgU1dULlJFQURfT05MWSk7Ci0gICAgd2ViU2VydmljZURlc2NDb21ib18uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2dCkgewotICAgICAgICBoYW5kbGVXZWJTZXJ2aWNlRGVzY0NvbWJvKGV2dCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBDb21wb3NpdGUgZGlzcGxheUNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgIGRpc3BsYXlDb21wLnNldExheW91dChncmlkbGF5b3V0KTsKLSAgICBkaXNwbGF5Q29tcC5zZXRMYXlvdXREYXRhKHVpVXRpbHMuY3JlYXRlRmlsbEFsbCgpKTsKLQotICAgIENvbXBvc2l0ZSBoYW5kbGVyc0NvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZShkaXNwbGF5Q29tcCwgMSk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HCi0gICAgICAgIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCk7Ci0gICAgaGFuZGxlcnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGhhbmRsZXJzQ29tcC5zZXRTaXplKDEzMCwgNjAwKTsKLQotICAgIENvbXBvc2l0ZSBidXR0b25zQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKGRpc3BsYXlDb21wLCAxKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIGJ1dHRvbnNDb21wLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotCi0gICAgVGV4dCBoYW5kbGVyc1RleHQgPSBuZXcgVGV4dChoYW5kbGVyc0NvbXAsIFNXVC5SRUFEX09OTFkpOwotICAgIGhhbmRsZXJzVGV4dC5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9IQU5ETEVSU19DT05GSUciKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgaGFuZGxlcnNUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0gICAgaGFuZGxlcnNUYWJsZV8gPSB1aVV0aWxzLmNyZWF0ZVRhYmxlKGhhbmRsZXJzQ29tcCwgVE9PTFRJUF9FRElUX1dTX0hBTkRMRVJTLCBJTkZPUE9QX0hETFJfV1NfSEFORExFUlMsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgaGFuZGxlcnNUYWJsZV8uc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICBoYW5kbGVyc1RhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAvLyBlbXB0eSBzcGFjZQotICAgIExhYmVsIHdzTGFiZWwgPSBuZXcgTGFiZWwoYnV0dG9uc0NvbXAsIFNXVC5OT05FKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICB3c0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgQnV0dG9uIG1vdmVVcEJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9NT1ZFX1VQIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBtb3ZlVXBCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0gICAgbW92ZVVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlTW92ZVVwQnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIEJ1dHRvbiBtb3ZlRG93bkJ1dHRvbiA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9NT1ZFX0RPV04iLCBudWxsLCBudWxsKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIG1vdmVEb3duQnV0dG9uLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIG1vdmVEb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGFuZGxlTW92ZURvd25CdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgLy8gZW1wdHkgc3BhY2UKLSAgICB3c0xhYmVsID0gbmV3IExhYmVsKGJ1dHRvbnNDb21wLCBTV1QuTk9ORSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLSAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgd3NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGFkZEJ1dHRvbl8gPSB1aVV0aWxzLmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uc0NvbXAsICJMQUJFTF9CVVRUT05fQUREIiwgbnVsbCwgbnVsbCk7Ci0gICAgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLSAgICBhZGRCdXR0b25fLnNldExheW91dERhdGEoZ3JpZGRhdGEpOwotICAgIGFkZEJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgfQotICAgIH0pOwotCi0gICAgcmVtb3ZlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbihidXR0b25zQ29tcCwgIkxBQkVMX0JVVFRPTl9SRU1PVkUiLCBudWxsLCBudWxsKTsKLSAgICBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgIHJlbW92ZUJ1dHRvbl8uc2V0TGF5b3V0RGF0YShncmlkZGF0YSk7Ci0gICAgcmVtb3ZlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgZW5hYmxlUmVtb3ZlKGZhbHNlKTsKLQotICAgIC8vIHRhYmxlIHN0dWZmIGhlcmUKLSAgICBTdHJpbmdbXSBjb2x1bW5zXyA9IG5ldyBTdHJpbmdbXSB7IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9IQU5ETEVSX05BTUUiKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkxFX0hBTkRMRVJfQ0xBU1MiKSwKLSAgICAgICAgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX0hBTkRMRVJfUE9SVCIpfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspIHsKLSAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGhhbmRsZXJzVGFibGVfLCBpKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFRleHQoY29sdW1uc19baV0pOwotICAgICAgdGFibGVDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFdpZHRoKERFRkFVTFRfQ09MVU1OX1dJRFRIKTsKLSAgICAgIHRhYmxlQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICB0YWJsZVZpZXdlcl8gPSBuZXcgVGFibGVWaWV3ZXIoaGFuZGxlcnNUYWJsZV8pOwotICAgIENvbnRyb2wgY29udHJvbCA9IHRhYmxlVmlld2VyXy5nZXRDb250cm9sKCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHRhYmxlVmlld2VyXy5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbnNfKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotICAgIHRhYmxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMaXN0TGFiZWxQcm92aWRlcigpKTsKLSAgICB0YWJsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICBlbmFibGVSZW1vdmUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3gocGFyZW50XywgIkxBQkVMX0JVVFRPTl9HRU5fU0tFTEVUT04iLCBUT09MVElQX0JVVFRPTl9HRU5fU0tFTEVUT04sIElORk9QT1BfSERMUl9HRU5fU0tFTEVUT04pOwotICAgIGdlblNrZWxldG9uUmFkaW9CdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlR2VuU2tlbGV0b25SYWRpb0J1dHRvbigpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgQ29tcG9zaXRlIHNvdXJjZUxvY2F0aW9uQ29tcCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKHBhcmVudF8sIDIpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyhzb3VyY2VMb2NhdGlvbkNvbXAsICJMQUJFTF9DT01CT19TT1VSQ0VfTE9DIiwgVE9PTFRJUF9DT01CT19TT1VSQ0VfTE9DLCBJTkZPUE9QX0NPTUJPX1NPVVJDRV9MT0MsCi0gICAgICAgIFNXVC5SRUFEX09OTFkpOwotICAgIHNvdXJjZUxvY2F0aW9uQ29tYm9fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpIHsKLSAgICAgICAgaGFuZGxlU291cmNlTG9jYXRpb25Db21ibyhldnQpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvLyBDYWxsZWQgYXQgc3RhcnQKLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlSGFuZGxlcnNUYWJsZSgpIHsKLSAgICB0cnkgewotCi0gICAgICBpbnQgc2l6ZU9mSGFuZGxlcnMgPSB3c0Rlc2NUb0hhbmRsZXJzXy5zaXplKCk7Ci0gICAgICBTdHJpbmdbXSB3c1JlZnMgPSBuZXcgU3RyaW5nW3NpemVPZkhhbmRsZXJzXTsKLQotICAgICAgU3RyaW5nW10gd3NSZWZOYW1lcyA9IChTdHJpbmdbXSkgd3NEZXNjVG9IYW5kbGVyc18ua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHdlYlNlcnZpY2VEZXNjQ29tYm9fLnNldEl0ZW1zKHdzUmVmTmFtZXMpOwotCi0gICAgICBpZiAoc2l6ZU9mSGFuZGxlcnMgPCAxKSB7Ci0gICAgICAgIHdlYlNlcnZpY2VEZXNjQ29tYm9fLnNlbGVjdCgwKTsKLSAgICAgICAgd2ViU2VydmljZURlc2NDb21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uTmFtZV8gIT0gbnVsbCkgewotICAgICAgICAgIGludCBpbmRleCA9IHdlYlNlcnZpY2VEZXNjQ29tYm9fLmluZGV4T2YoZGVzY3JpcHRpb25OYW1lXyk7Ci0gICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5zZWxlY3QoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5zZWxlY3QoMCk7Ci0gICAgICB9Ci0gICAgICAvLyBnZXQgd2ViU2VydmljZVJlZiBoaW50Ci0gICAgICBTdHJpbmcgd3NSZWYgPSB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5nZXRUZXh0KCk7Ci0KLSAgICAgIGlmICh3c0Rlc2NUb0hhbmRsZXJzXy5nZXQod3NSZWYpICE9IG51bGwpIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldCh3c1JlZik7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5zZXRJbnB1dChvcmRlcmVkSGFuZGxlcnNfKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlcnMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRIYW5kbGVyc0xpc3QoKSB7Ci0gICAgLy8gY29udmVydCB0byBhIEFycmF5TGlzdCBhbmQgcmV0dXJuIGFzIExpc3QKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKG9yZGVyZWRIYW5kbGVyc18gIT0gbnVsbCAmJiAhb3JkZXJlZEhhbmRsZXJzXy5pc0VtcHR5KCkpIGxpc3QuYWRkQWxsKG9yZGVyZWRIYW5kbGVyc18pOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGdldFdzRGVzY1RvSGFuZGxlcnMoKSB7Ci0gICAgcmV0dXJuIHRoaXMud3NEZXNjVG9IYW5kbGVyc187Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGhhbmRsZXJzCi0gICAqICAgICAgICAgIFRoZSBoYW5kbGVycyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVycyhIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlcnMpIHsKLSAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnM7Ci0gICAgcG9wdWxhdGVIYW5kbGVyc1RhYmxlKCk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICBTdGF0dXMgZmluYWxTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIHJldHVybiBmaW5hbFN0YXR1czsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAJCi0gIAlTdHJpbmcgZGVzY05hbWUgPSB3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5nZXRUZXh0KCk7Ci0gIAlXZWJTZXJ2aWNlRGVzY3JpcHRpb24gc2VydmljZURlc2MgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfLmdldChkZXNjTmFtZSk7Ci0gIAkKLSAgICBBZGRIYW5kbGVyRGlhbG9nIGRpYWxvZyA9IGRpYWxvZyA9IG5ldyBBZGRIYW5kbGVyRGlhbG9nKHBhcmVudF8uZ2V0U2hlbGwoKSwgZmFsc2UpOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICAKLSAgICBTdHJpbmdbXSBwb3J0TmFtZXMgPSBnZXRQb3J0Q29tcG9uZW50TmFtZXMoc2VydmljZURlc2MpOwotICAgIGRpYWxvZy5zZXRQb3J0TmFtZXMocG9ydE5hbWVzKTsKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKCA1MDAsIDIwMCApOwotICAgIAotICAgIGludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLSAgICAgIFN0cmluZyBuYW1lID0gZGlhbG9nLmdldE5hbWUoKTsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBkaWFsb2cuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICBTdHJpbmcgcG9ydCA9IGRpYWxvZy5nZXRQb3J0TmFtZSgpOwotCi0gICAgICBIYW5kbGVyVGFibGVJdGVtIGhpID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW0oKTsKLSAgICAgIGhpLnNldEhhbmRsZXJOYW1lKG5hbWUpOwotICAgICAgaGkuc2V0SGFuZGxlckNsYXNzTmFtZShjbGFzc05hbWUpOwotICAgICAgaGkuc2V0UG9ydE5hbWUocG9ydCk7Ci0gICAgICAKLSAgICAgIAotICAgICAgaGkuc2V0V3NEZXNjUmVmKHNlcnZpY2VEZXNjKTsKLQotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldChkZXNjTmFtZSk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfLmFkZChoaSk7Ci0KLSAgICB9Ci0KLSAgICByZWZyZXNoKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZ1tdIGdldFBvcnRDb21wb25lbnROYW1lcyhXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd2ViU2VydmljZURlc2MpIHsKLSAgCQotICAJTGlzdCBwb3J0cyA9IHdlYlNlcnZpY2VEZXNjLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gIAlpZiAocG9ydHMhPW51bGwpewotICAJCVN0cmluZ1tdIHBvcnROYW1lcyA9IG5ldyBTdHJpbmdbcG9ydHMuc2l6ZSgpXTsKLSAgCQlmb3IoaW50IGk9MDtpPHBvcnRzLnNpemUoKTtpKyspewotICAJCQlQb3J0Q29tcG9uZW50IHBjID0gKFBvcnRDb21wb25lbnQpcG9ydHMuZ2V0KGkpOwotICAJCQlTdHJpbmcgcGNOYW1lID0gcGMuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsKLSAgCQkJcG9ydE5hbWVzW2ldID0gcGNOYW1lOwotICAJCX0KLSAgCQlyZXR1cm4gcG9ydE5hbWVzOwotICAJfQotICAJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb3ZlVXBCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCi0gICAgaW50IGluZGV4ID0gdGFibGVWaWV3ZXJfLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGVkID0gdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NEZXNjVG9IYW5kbGVyc18uZ2V0KHdlYlNlcnZpY2VEZXNjQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIG9yZGVyZWRIYW5kbGVyc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXggLSAxKTsKLSAgICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb3ZlRG93bkJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0KLSAgICBpbnQgaW5kZXggPSB0YWJsZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0ZWQgPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICBpZiAoaW5kZXggPCBvcmRlcmVkSGFuZGxlcnNfLnNpemUoKSAtIDEpIHsKLSAgICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldCh3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5nZXRUZXh0KCkpOwotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gb3JkZXJlZEhhbmRsZXJzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBvcmRlcmVkSGFuZGxlcnNfLmluc2VydEVsZW1lbnRBdChvYmplY3QsIGluZGV4ICsgMSk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVTb3VyY2VMb2NhdGlvbkNvbWJvKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgb3V0cHV0TG9jYXRpb25fID0gc291cmNlTG9jYXRpb25Db21ib18uZ2V0VGV4dCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlR2VuU2tlbGV0b25SYWRpb0J1dHRvbigpIHsKLSAgICBpZiAoZ2VuU2tlbGV0b25SYWRpb0J1dHRvbl8uaXNFbmFibGVkKCkpIHsKLSAgICAgIGlmIChnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSB0cnVlOwotICAgICAgZWxzZQotICAgICAgICB0aGlzLmlzR2VuU2tlbGV0b25FbmFibGVkXyA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVdlYlNlcnZpY2VEZXNjQ29tYm8oU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQotICAgIGlmICh3ZWJTZXJ2aWNlRGVzY0NvbWJvXy5pc0VuYWJsZWQoKSkgewotICAgICAgU3RyaW5nIHdlYlNlcnZpY2VSZWZOYW1lID0gd2ViU2VydmljZURlc2NDb21ib18uZ2V0VGV4dCgpOwotICAgICAgVmVjdG9yIGhuZGxlcnMgPSAoVmVjdG9yKSB3c0Rlc2NUb0hhbmRsZXJzXy5nZXQod2ViU2VydmljZVJlZk5hbWUpOwotICAgICAgaWYgKGhuZGxlcnMgIT0gbnVsbCkgewotICAgICAgICB0YWJsZVZpZXdlcl8uc2V0SW5wdXQoaG5kbGVycyk7Ci0gICAgICAgIHRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNHZW5Ta2VsZXRvbkVuYWJsZWRfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfKCkgewotICAgIHJldHVybiBpc0dlblNrZWxldG9uRW5hYmxlZF87Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTGlzdExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSGFuZGxlclRhYmxlSXRlbSkgewotICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKSBvYmplY3Q7Ci0gICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIGh0aS5nZXRIYW5kbGVyTmFtZSgpICE9IG51bGwgPyBodGkuZ2V0SGFuZGxlck5hbWUoKSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDEpIHsKLSAgICAgICAgICByZXR1cm4gaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSAhPSBudWxsID8gaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIHJldHVybiBodGkuZ2V0UG9ydE5hbWUoKSAhPSBudWxsID8gaHRpLmdldFBvcnROYW1lKCkgOiAiIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlUmVtb3ZlKGJvb2xlYW4gZW5hYmxlZCkgewotICAgIHJlbW92ZUJ1dHRvbl8uc2V0RW5hYmxlZChlbmFibGVkICYmICF0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZlY3RvcikgeyByZXR1cm4gKChWZWN0b3IpIGVsZW1lbnQpLnRvQXJyYXkoKTsgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKSB7Ci0gICAgLy9pbnRlcm5hbERpc3Bvc2UoKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkgewotICAgICAgaW50IHNlbGVjdGlvbkluZGV4ID0gaGFuZGxlcnNUYWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGludCBzZWxlY3Rpb25Db3VudCA9IGhhbmRsZXJzVGFibGVfLmdldEl0ZW1Db3VudCgpOwotCi0gICAgICBvcmRlcmVkSGFuZGxlcnNfID0gKFZlY3Rvcikgd3NEZXNjVG9IYW5kbGVyc18uZ2V0KHdlYlNlcnZpY2VEZXNjQ29tYm9fLmdldFRleHQoKSk7Ci0gICAgICBvcmRlcmVkSGFuZGxlcnNfLnJlbW92ZShzZWxlY3Rpb25JbmRleCk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICB0cnkgewotICAgICAgdGFibGVWaWV3ZXJfLnNldElucHV0KG51bGwpOwotICAgICAgaWYgKG9yZGVyZWRIYW5kbGVyc18gIT0gbnVsbCkgdGFibGVWaWV3ZXJfLnNldElucHV0KG9yZGVyZWRIYW5kbGVyc18pOwotICAgICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEdlblNrZWxldG9uRW5hYmxlZChib29sZWFuIGlzR2VuU2tlbGV0b25FbmFibGVkKSB7Ci0gICAgdGhpcy5pc0dlblNrZWxldG9uRW5hYmxlZF8gPSBpc0dlblNrZWxldG9uRW5hYmxlZDsKLSAgICBnZW5Ta2VsZXRvblJhZGlvQnV0dG9uXy5zZXRTZWxlY3Rpb24oaXNHZW5Ta2VsZXRvbkVuYWJsZWQpOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5Ta2VsZXRvbkVuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIHRoaXMuaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U291cmNlT3V0cHV0TG9jYXRpb24oSVBhdGhbXSBsb2NhdGlvbnMpIHsKLSAgICB0aGlzLm91dHB1dExvY2F0aW9uXyA9IGxvY2F0aW9uc1swXS50b1N0cmluZygpOwotCi0gICAgU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW2xvY2F0aW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBwYXRoc1tpXSA9IGxvY2F0aW9uc1tpXS50b1N0cmluZygpOwotICAgICAgcGF0aHNUYWJsZV8ucHV0KHBhdGhzW2ldLCBsb2NhdGlvbnNbaV0pOwotICAgIH0KLSAgICBzb3VyY2VMb2NhdGlvbkNvbWJvXy5zZXRJdGVtcyhwYXRocyk7Ci0gICAgc291cmNlTG9jYXRpb25Db21ib18uc2VsZWN0KDApOwotCi0gIH0KLQotICBwdWJsaWMgSVBhdGggZ2V0U291cmNlT3V0cHV0TG9jYXRpb24oKSB7Ci0gICAgSVBhdGggb3V0cHV0UGF0aCA9IChJUGF0aCkgcGF0aHNUYWJsZV8uZ2V0KG91dHB1dExvY2F0aW9uXyk7Ci0gICAgcmV0dXJuIG91dHB1dFBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyQ2xhc3NOYW1lcy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRIYW5kbGVyQ2xhc3NOYW1lcygpIHsKLSAgICAKLSAgICBWZWN0b3IgaGFuZGxlckNsYXNzZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IHdzRGVzY1RvSGFuZGxlcnNfLmtleXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgCi0gICAgICBTdHJpbmcgd3NEZXNjTmFtZSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgb3JkZXJlZEhhbmRsZXJzXyA9IChWZWN0b3IpIHdzRGVzY1RvSGFuZGxlcnNfLmdldCh3c0Rlc2NOYW1lKTsKLSAgICAgIAotICAgICAgaWYgKG9yZGVyZWRIYW5kbGVyc18gIT0gbnVsbCkgewotICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmRlcmVkSGFuZGxlcnNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBodGkgPSAoSGFuZGxlclRhYmxlSXRlbSkgb3JkZXJlZEhhbmRsZXJzXy5nZXQoaSk7Ci0gICAgICAgICAgaGFuZGxlckNsYXNzZXMuYWRkKGh0aS5nZXRIYW5kbGVyQ2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10paGFuZGxlckNsYXNzZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd3NEZXNjVG9IYW5kbGVyc0FycmF5XwotICAgKiAgICAgICAgICBUaGUgd3NEZXNjVG9IYW5kbGVyc0FycmF5XyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc1JlZnNUb0hhbmRsZXJzKEhhc2h0YWJsZSB3c0Rlc2NUb0hhbmRsZXJzQXJyYXkpIHsKLQotICAgIHdzRGVzY1RvSGFuZGxlcnNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHdzRGVzY1RvUG9ydHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRyeSB7Ci0KLSAgICAgIGlmICh3c0Rlc2NUb0hhbmRsZXJzQXJyYXkgIT0gbnVsbCkgewotICAgICAgICBpbnQgc2l6ZU9mSGFuZGxlcnMgPSB3c0Rlc2NUb0hhbmRsZXJzQXJyYXkuc2l6ZSgpOwotICAgICAgICBTdHJpbmdbXSB3c1JlZnMgPSBuZXcgU3RyaW5nW3NpemVPZkhhbmRsZXJzXTsKLSAgICAgICAgLy8gc3RvcmUgdGhlIHdzUmVmcwotICAgICAgICBFbnVtZXJhdGlvbiB3c0Rlc2MgPSB3c0Rlc2NUb0hhbmRsZXJzQXJyYXkua2V5cygpOwotICAgICAgICB3aGlsZSAod3NEZXNjLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgU3RyaW5nIHdzRGVzY05hbWUgPSAoU3RyaW5nKSB3c0Rlc2MubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW1bXSBoYW5kbGVycyA9IChIYW5kbGVyVGFibGVJdGVtW10pIHdzRGVzY1RvSGFuZGxlcnNBcnJheS5nZXQod3NEZXNjTmFtZSk7Ci0gICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaGFuZGxlcnNUYWJsZQotICAgICAgICAgIG9yZGVyZWRIYW5kbGVyc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgSGFzaFNldCBwb3J0TmFtZVZlY3RvciA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBvcmRlcmVkSGFuZGxlcnNfLmFkZChoYW5kbGVyc1tpXSk7Ci0gICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBoYW5kbGVyc1tpXS5nZXRQb3J0TmFtZSgpOwotICAgICAgICAgICAgcG9ydE5hbWVWZWN0b3IuYWRkKG5ldyBTdHJpbmcocG9ydE5hbWUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd3NEZXNjVG9IYW5kbGVyc18ucHV0KHdzRGVzY05hbWUsIG9yZGVyZWRIYW5kbGVyc18pOwotICAgICAgICAgIHdzRGVzY1RvUG9ydHNfLnB1dCh3c0Rlc2NOYW1lLCAoU3RyaW5nW10pIHBvcnROYW1lVmVjdG9yLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwb3B1bGF0ZUhhbmRsZXJzVGFibGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25OYW1lKFN0cmluZyB3c0Rlc2NOYW1lKSB7Ci0gICAgZGVzY3JpcHRpb25OYW1lXyA9IHdzRGVzY05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmooSGFzaHRhYmxlIHNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaikgewotICAgIHRoaXMuc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXyA9IHNlcnZpY2VEZXNjTmFtZVRvRGVzY09iajsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9IYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBiYTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9IYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci0KLQotLyoqCi0gKiBIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kCi0gKiAKLSAqIERldGVybWluZSBpZiBIYW5kbGVycyBiZWxvbmdzIHRvIHNlcnZpY2Ugb3IgY2xpZW50IHNpZGUKLSAqLwotcHVibGljIGNsYXNzIEhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NtZCB7Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudEhhbmRsZXJfID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZpY2VIYW5kbGVyXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgewotICAgICAgICAgIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgd3NuZ3QgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgb2JqOwotICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXdzbmd0LmdldFdzZGxTZXJ2aWNlKCk7Ci0gICAgICAgICAgaWYgKHdzbmd0LmdldFdzZGxTZXJ2aWNlKCkhPW51bGwpewotICAgICAgICAgIAlpc1NlcnZpY2VIYW5kbGVyXyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmICh3c25ndC5nZXRTZXJ2aWNlUmVmKCkhPW51bGwpewotICAgICAgICAgIAlpc0NsaWVudEhhbmRsZXJfID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgIGVsc2UgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9UQVNLX0VYQ0VQVEVEIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgfQotCi0gIAotLyoqCi0gKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzQ2xpZW50SGFuZGxlcl8uCi0gKi8KLXB1YmxpYyBib29sZWFuIGdldElzQ2xpZW50SGFuZGxlcigpIHsKLQlyZXR1cm4gaXNDbGllbnRIYW5kbGVyXzsKLX0KLS8qKgotICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1NlcnZpY2VIYW5kbGVyXy4KLSAqLwotcHVibGljIGJvb2xlYW4gZ2V0SXNTZXJ2aWNlSGFuZGxlcigpIHsKLQlyZXR1cm4gaXNTZXJ2aWNlSGFuZGxlcl87Ci19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0ltcG9ydFdTSUxXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9JbXBvcnRXU0lMV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjdiZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL0ltcG9ydFdTSUxXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFQWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWwuQXJndW1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLlRhYmxlVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uRGlhbG9nUmVzb3VyY2VCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uRmlsZUV4dGVuc2lvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2lsLkFkZFdTRExUb1dTSUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotCi0vKioKLSogUGFnZSBmb3IgaW1wb3J0aW5nIFdTREwgcmVmZXJlbmNlcyBpbnRvIGEgV1NJTCBpbiB0aGUgd29ya2JlbmNoLgotKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRXU0lMV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIC8qQ09OVEVYVF9JRCBXU0lMMDAwMSBmb3IgdGhlIFdTSUwgSW1wb3J0IFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1dTSUxfSU1QT1JUX1BBR0UgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuV1NJTDAwMDEiOwotCi0gIC8qQ09OVEVYVF9JRCBXU0lMMDAwMiBmb3IgdGhlIFdTSUwgdGV4dCBmaWVsZCovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfV1NJTF9URVhUX1dTSUwgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuV1NJTDAwMDIiOwotCi0gIC8qQ09OVEVYVF9JRCBXU0lMMDAwMyBmb3IgdGhlIFdTSUwgYnJvd3NlIGJ1dHRvbiovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfV1NJTF9CVVRUT05fQlJPV1NFX1dTSUwgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuV1NJTDAwMDMiOwotCi0gIC8qQ09OVEVYVF9JRCBXU0lMMDAwNCBmb3IgdGhlIFdTREwgdGFibGUqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1dTSUxfVEFCTEVfV1NETCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5XU0lMMDAwNCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5TUEVDVElPTl9XU0lMID0gImluc3BlY3Rpb24ud3NpbCI7Ci0KLSAgcHJpdmF0ZSBUZXh0IHdzaWxfOwotICBwcml2YXRlIEJ1dHRvbiBicm93c2VfOwotICBwcml2YXRlIFRhYmxlVmlld2VyRWRpdG9yIHdzZGxzXzsKLSAgCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhZ2UuCi0gICovCi0gIHB1YmxpYyBJbXBvcnRXU0lMV2lkZ2V0KCkKLSAgewotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgLy9zdXBlcihtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1dTSUxfSU1QT1JUIiksIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRJVExFX1dTSUxfSU1QT1JUIiksIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkRFU0NfV1NJTF9JTVBPUlQiKSk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAJCi0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfV1NJTF9JTVBPUlRfUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1dTSUxfSU1QT1JUX1BBR0UpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDM7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9WRVJUSUNBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotICAgIGxhYmVsLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfV1NJTF9VUkkiKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICB3c2lsXyA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULldSQVAgfCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBnZC53aWR0aEhpbnQgPSAyNTY7Ci0gICAgd3NpbF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgd3NpbF8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIpOwotICAgIHdzaWxfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfV1NJTF9URVhUX1dTSUwiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaWxfLCBJTkZPUE9QX1dTSUxfVEVYVF9XU0lMKTsKLQotICAgIGJyb3dzZV8gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgIGJyb3dzZV8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9CUk9XU0UiKSk7Ci0gICAgYnJvd3NlXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBicm93c2VfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sCi0gICAgICBuZXcgTGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZUJyb3dzZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgYnJvd3NlXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1dTSUxfQlVUVE9OX0JST1dTRV9XU0lMIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChicm93c2VfLCBJTkZPUE9QX1dTSUxfQlVUVE9OX0JST1dTRV9XU0lMKTsKLQotICAgIENvbXBvc2l0ZSB3c2RsQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICB3c2RsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gMzsKLSAgICB3c2RsQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIGxhYmVsID0gbmV3IExhYmVsKHdzZGxDb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX1dTREwiKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgU3RyaW5nW10gY29sdW1ucyA9IHttc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9XU0RMX1VSSSIpfTsKLSAgICB3c2Rsc18gPSBuZXcgVGFibGVWaWV3ZXJFZGl0b3Iod3NkbENvbXBvc2l0ZSwgY29sdW1ucywgbmV3IEFycmF5TGlzdCgpLCAiaHR0cDovLyIpOwotICAgIHdzZGxzXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1dTSUxfVEFCTEVfV1NETCIpKTsKLSAgICB3c2Rsc18uc2V0SW5mb3BvcChJTkZPUE9QX1dTSUxfVEFCTEVfV1NETCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwcml2YXRlIElSZXNvdXJjZVtdIGdldFdTRExSZXNvdXJjZXMoKQotICB7Ci0gICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKChJRmlsZSlvYmplY3QpLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmICgoSUZpbGUpb2JqZWN0KS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ3c2RsIikpCi0gICAgICAgICAgbGlzdC5hZGQob2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgSVJlc291cmNlW10gcmVzID0gbmV3IElSZXNvdXJjZVtsaXN0LnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspCi0gICAgICByZXNbaV0gPSAoSVJlc291cmNlKWxpc3QuZ2V0KGkpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVCcm93c2VFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIERpYWxvZ1Jlc291cmNlQnJvd3NlciBkaWFsb2cgPSBuZXcgRGlhbG9nUmVzb3VyY2VCcm93c2VyKGJyb3dzZV8uZ2V0U2hlbGwoKSwgbnVsbCwgbmV3IEZpbGVFeHRlbnNpb25GaWx0ZXIobmV3IFN0cmluZ1tdIHsid3NpbCJ9KSk7Ci0gICAgZGlhbG9nLm9wZW4oKTsKLSAgICBJUmVzb3VyY2UgcmVzID0gZGlhbG9nLmdldEZpcnN0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHJlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICAgd3NpbF8uc2V0VGV4dChyZXMuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgd3NpbF8uc2V0VGV4dChyZXMuZ2V0RnVsbFBhdGgoKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChJTlNQRUNUSU9OX1dTSUwpLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIGlmICghd3NpbF8uZ2V0VGV4dCgpLmVuZHNXaXRoKCIud3NpbCIpKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfTVNHX0lOVkFMSURfV1NJTF9GSUxFX05BTUUiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKChJRmlsZSlvYmplY3QpLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmICgoSUZpbGUpb2JqZWN0KS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJ3c2RsIikpCi0gICAgICAgICAgbGlzdC5hZGQoKChJRmlsZSlvYmplY3QpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkKLSAgICAgICAgICBsaXN0LmFkZChKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NJTFBhdGgoKChTZXJ2aWNlSW1wbCkob2JqZWN0KSkpKTsJCi0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKQotICAgICAgICAgIGxpc3QuYWRkKEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0lMUGF0aCgoKFNlcnZpY2VSZWYpKG9iamVjdCkpKSk7CQkKLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICAgICAgbGlzdC5hZGQoSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTSUxQYXRoKCgoV1NETFJlc291cmNlSW1wbCkob2JqZWN0KSkpKTsJCi0gICAgICB9Ci0gICAgfQotICAgIHdzZGxzXy5zZXRJbnB1dChsaXN0KTsKLSAgICB3c2Rsc18ucmVmcmVzaCgpOwotICAgIGlmIChsaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGxpc3QuZ2V0KDApLnRvU3RyaW5nKCkpOwotICAgICAgLy8gY2hhbmdlIGV4dGVuc2lvbiBmcm9tIC53c2RsIHRvIC53c2lsCi0gICAgICBpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKLSAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UobGVuZ3RoLTQsIGxlbmd0aCwgIndzaWwiKTsKLSAgICAgIHdzaWxfLnNldFRleHQocGF0aC50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBBcmd1bWVudHMgZ2V0R2VuV1NJTEFyZ3VtZW50cygpCi0gIHsKLSAgICBBcmd1bWVudHMgYXJncyA9IG5ldyBBcmd1bWVudHMoKTsKLSAgICBTdHJpbmcgd3NpbFBhdGggPSB3c2lsXy5nZXRUZXh0KCk7Ci0gICAgaWYgKHdzaWxQYXRoLmluZGV4T2YoJzonKSA8IDApCi0gICAgICBhcmdzLmFkZChBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfV1NJTCwgVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkod3NpbF8uZ2V0VGV4dCgpKS50b1N0cmluZygpKTsKLSAgICBlbHNlCi0gICAgICBhcmdzLmFkZChBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfV1NJTCwgd3NpbFBhdGgpOwotICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gd3NkbHNfLmdldEl0ZW1zKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgdXJpID0gaXRlbXNbaV0uZ2V0VGV4dCgwKTsKLSAgICAgIGlmICh1cmkuaW5kZXhPZignOicpIDwgMCkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHVyaSk7Ci0gICAgICAgIGlmIChyZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHVyaSA9IHJlcy5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCW11cmxlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGFyZ3MuYWRkKEFkZFdTRExUb1dTSUxDb21tYW5kLkFSR19XU0RMLCB1cmkpOwotICAgIH0KLSAgICBhcmdzLmFkZChBZGRXU0RMVG9XU0lMQ29tbWFuZC5BUkdfUkVTT0xWRV9XU0RMLCBudWxsKTsKLSAgICByZXR1cm4gYXJnczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1ByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMWY3MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1ByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsgICAgCi0gIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IGNvbnRleHRfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDAzIGZvciB0aGUgT3ZlcndyaXRlIEZpbGVzIGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyA9ICJQV1BSMDAwMyI7Ci0gIHByaXZhdGUgQnV0dG9uIG92ZXJ3cml0ZUZpbGVzQ2hlY2tib3hfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDA0IGZvciB0aGUgQ3JlYXRlIEZvbGRlcnMgY2hlY2sgYm94IG9mIHRoZSBQcm9qZWN0IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMgPSAiUFdQUjAwMDQiOwotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVGb2xkZXJzQ2hlY2tib3hfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDE1IGZvciB0aGUgQ2hlY2sgT3V0IEZpbGVzIGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0NIRUNLT1VUX0ZJTEVTID0gIlBXUFIwMDE1IjsgIAotICBwcml2YXRlIEJ1dHRvbiBjaGVja291dEZpbGVzQ2hlY2tib3hfOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2FkZENvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgICAgPSAib3JnLmVjbGlwc2UuanN0LndzLnVpIjsKLSAgICBTdHJpbmcgICAgICAgY29uUGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAJVUlVdGlscyAgICAgIHV0aWxzICAgICAgID0gbmV3IFVJVXRpbHMoIG1zZ1V0aWxzLCBjb25QbHVnaW5JZCApOwotICAJCi0gICAgQ29tcG9zaXRlIHJlc291cmNlc0dyb3VwID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDEgKTsKLSAgICAKLSAgICBvdmVyd3JpdGVGaWxlc0NoZWNrYm94XyA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KCByZXNvdXJjZXNHcm91cCwgIkJVVFRPTl9PVkVSV1JJVEVfRklMRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BQUk1fQ0hFQ0tCT1hfT1ZFUldSSVRFX0ZJTEVTIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNyZWF0ZUZvbGRlcnNDaGVja2JveF8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggcmVzb3VyY2VzR3JvdXAsICJCVVRUT05fQ1JFQVRFX0ZPTERFUlMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DUkVBVEVfRk9MREVSUyIgLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9DUkVBVEVfRk9MREVSUyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY2hlY2tvdXRGaWxlc0NoZWNrYm94XyA9IHV0aWxzLmNyZWF0ZUNoZWNrYm94KCByZXNvdXJjZXNHcm91cCwgIkJVVFRPTl9DSEVDS09VVF9GSUxFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NIRUNLX09VVCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0NIRUNLT1VUX0ZJTEVTICk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCBjb250ZXh0ICkKLSAgeyAKLSAgICBvdmVyd3JpdGVGaWxlc0NoZWNrYm94Xy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSApOwotICAgIGNyZWF0ZUZvbGRlcnNDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBjb250ZXh0LmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSApOwotICAgIGNoZWNrb3V0RmlsZXNDaGVja2JveF8uc2V0U2VsZWN0aW9uKCBjb250ZXh0LmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSApOyAKLSAgICAKLSAgICBjb250ZXh0XyA9IGNvbnRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkgCi0gIHsgICAgCi0gICAgY29udGV4dF8uc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKCBvdmVyd3JpdGVGaWxlc0NoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKSApOwotICAgIGNvbnRleHRfLnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKCBjcmVhdGVGb2xkZXJzQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpICk7Ci0gICAgY29udGV4dF8uc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoIGNoZWNrb3V0RmlsZXNDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgICAKLSAgICByZXR1cm4gY29udGV4dF87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1B1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGZiZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1B1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5BYnN0cmFjdENvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50Ci17Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5OwotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5OwotICBwcml2YXRlIGJvb2xlYW4gcHVibGlzaFRvUHJpdmF0ZVVEREk7Ci0gIHByaXZhdGUgQ29tbWFuZFdpZGdldEJpbmRpbmcgcHJpdmF0ZVVERElCaW5kaW5nOwotICAKLSAgcHVibGljIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50KCkKLSAgewotICAgIHN1cGVyKChDb21tYW5kRmFjdG9yeSludWxsLCAiIik7Ci0gICAgcHJpdmF0ZVVERElCaW5kaW5nID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkuZ2V0QmluZGluZygpOwotICB9Ci0KLSAgLyoqIAotICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICoKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgewotICAgIGlmIChwcml2YXRlVURESUJpbmRpbmcgIT0gbnVsbCAmJiBwdWJsaXNoVG9Qcml2YXRlVURESSAmJiAhUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkuaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCkpCi0gICAgewotICAgICAgcHJpdmF0ZVVERElCaW5kaW5nLnJlZ2lzdGVyQ2FuRmluaXNoKGNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgICAgIHByaXZhdGVVRERJQmluZGluZy5yZWdpc3RlckRhdGFNYXBwaW5ncyhkYXRhTWFwcGluZ1JlZ2lzdHJ5KTsKLSAgICAgIHByaXZhdGVVRERJQmluZGluZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgICAgIHJldHVybiBwcml2YXRlVURESUJpbmRpbmcuY3JlYXRlKCkuY3JlYXRlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50KQotICB7Ci0gIAlyZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1hcHBpbmdzIGZvciB0aGlzIGNvbW1hbmQgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gIAlkYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWdpc3RlckNhbkZpbmlzaChDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuY2FuRmluaXNoUmVnaXN0cnkgPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLndpZGdldFJlZ2lzdHJ5ID0gd2lkZ2V0UmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICAqIEFsbCB3aXphcmQgZnJhZ21lbnRzIG5lZWQgdG8gYmUgY2xvbmVhYmxlLgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IG5ldyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlckNhbkZpbmlzaChjYW5GaW5pc2hSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgCWZyYWdtZW50LnNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKHB1Ymxpc2hUb1ByaXZhdGVVRERJKTsKLSAgCXJldHVybiBmcmFnbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKGJvb2xlYW4gcHVibGlzaCkKLSAgewotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJID0gcHVibGlzaDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoV1NXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9QdWJsaXNoV1NXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0MGIxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvUHVibGlzaFdTV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLlB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGkuUHVibGljVURESVJlZ2lzdHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkudWRkaS5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uczsKLQotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFdTV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIC8qIENPTlRFWFRfSUQgUFdQQjAwMDEgZm9yIHRoZSBVRERJIFB1Ymxpc2ggUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUEJfUEFHRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1BCMDAwMSI7Ci0gIC8qIENPTlRFWFRfSUQgUFdQQjAwMDIgZm9yIHRoZSBVRERJIExhdW5jaCBjaGVjayBib3ggb2YgdGhlIFVEREkgUHVibGlzaCBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0ggPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdQQjAwMDIiOwotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hVRERJQ2hlY2tib3hfOwotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hQcml2YXRlVURESUNoZWNrYm94XzsKLSAgcHJpdmF0ZSBMYWJlbCBwdWJpbGNVRERJUmVnQ29tYm9MYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gcHVibGljVURESVJlZ0NvbWJvXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0gIHByaXZhdGUgQm9vbGVhbiBwdWJsaXNoOwotCi0gIHB1YmxpYyBQdWJsaXNoV1NXaWRnZXQoYm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICB0aGlzLnB1Ymxpc2ggPSBuZXcgQm9vbGVhbihwdWJsaXNoKTsKLSAgfQotCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIExpc3RlbmVyIHNlbExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlU2VsZWN0aW9uRXZlbnQoZXZlbnQpOwotICAgICAgfQotICAgIH07Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdQQl9QQUdFIikpOwotICAgIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1BXUEJfUEFHRSk7Ci0gICAgbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICBpZiAocHVibGlzaC5ib29sZWFuVmFsdWUoKSkKLSAgICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiQlVUVE9OX1dTX1BVQkxJU0hfUFJJVkFURV9VRERJIikpOwotICAgIGVsc2UKLSAgICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiQlVUVE9OX1dTX0ZJTkRfUFJJVkFURV9VRERJIikpOwotICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0giKSk7Ci0gICAgbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgc2VsTGlzdGVuZXIpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChsYXVuY2hQcml2YXRlVURESUNoZWNrYm94XywgSU5GT1BPUF9QV1BCX0NIRUNLQk9YX1dTX0xBVU5DSCk7Ci0gICAgbGF1bmNoVURESUNoZWNrYm94XyA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgIGlmIChwdWJsaXNoLmJvb2xlYW5WYWx1ZSgpKQotICAgICAgbGF1bmNoVURESUNoZWNrYm94Xy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkJVVFRPTl9XU19QVUJMSVNIIikpOwotICAgIGVsc2UKLSAgICAgIGxhdW5jaFVERElDaGVja2JveF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJCVVRUT05fV1NfRklORCIpKTsKLSAgICBsYXVuY2hVRERJQ2hlY2tib3hfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0giKSk7Ci0gICAgbGF1bmNoVURESUNoZWNrYm94Xy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBzZWxMaXN0ZW5lcik7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGxhdW5jaFVERElDaGVja2JveF8sIElORk9QT1BfUFdQQl9DSEVDS0JPWF9XU19MQVVOQ0gpOwotICAgIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMzsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBjLnNldExheW91dChnbCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBjLnNldExheW91dERhdGEoZ2QpOwotICAgIG5ldyBMYWJlbChjLCBTV1QuV1JBUCk7Ci0gICAgcHViaWxjVURESVJlZ0NvbWJvTGFiZWxfID0gbmV3IExhYmVsKGMsIFNXVC5XUkFQKTsKLSAgICBwdWJpbGNVRERJUmVnQ29tYm9MYWJlbF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9QVUJMSUNfVURESV9SRUdJU1RSSUVTIikpOwotICAgIHB1YmxpY1VERElSZWdDb21ib18gPSBuZXcgQ29tYm8oYywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHB1YmxpY1VERElSZWdDb21ib18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgaW5pdFB1YmxpY1VEREkoKTsKLSAgICBpbml0UHJpdmF0ZVVEREkoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0UHVibGljVURESSgpCi0gIHsKLSAgICBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgcmVnID0gUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gcmVnLmdldEFsbFB1YmxpY1VERElSZWdpc3RyeVR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocHVibGlzaC5ib29sZWFuVmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gSWdub3JlIHJlYWQtb25seSByZWdpc3RyaWVzLgotICAgICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHR5cGVzW2ldLmdldFB1Ymxpc2hVUkwoKTsKLSAgICAgICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCB8fCBwdWJsaXNoVVJMLmluZGV4T2YoIjovLyIpID09IC0xKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcHVibGljVURESVJlZ0NvbWJvXy5hZGQodHlwZXNbaV0uZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgaWYgKHR5cGVzLmxlbmd0aCA+IDApCi0gICAgICBwdWJsaWNVRERJUmVnQ29tYm9fLnNldFRleHQocHVibGljVURESVJlZ0NvbWJvXy5nZXRJdGVtKDApKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0UHJpdmF0ZVVEREkoKQotICB7Ci0gICAgaWYgKCFwdWJsaXNoLmJvb2xlYW5WYWx1ZSgpICYmICFQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUoKS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkKLSAgICAgIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLnNldEVuYWJsZWQoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdGlvbkV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGxhdW5jaFVERElDaGVja2JveF8gPT0gZXZlbnQud2lkZ2V0KQotICAgICAgcHVibGljVURESVJlZ0NvbWJvXy5zZXRFbmFibGVkKGxhdW5jaFVERElDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkpOwotICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1B1YmxpY1VEREkoYm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgbGF1bmNoVURESUNoZWNrYm94Xy5zZXRTZWxlY3Rpb24ocHVibGlzaCk7Ci0gICAgcHVibGljVURESVJlZ0NvbWJvXy5zZXRFbmFibGVkKHB1Ymxpc2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHVibGljVURESShCb29sZWFuIHB1Ymxpc2gpCi0gIHsKLSAgICBzZXRQdWJsaXNoVG9QdWJsaWNVRERJKHB1Ymxpc2guYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoYm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgbGF1bmNoUHJpdmF0ZVVERElDaGVja2JveF8uc2V0U2VsZWN0aW9uKHB1Ymxpc2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoQm9vbGVhbiBwdWJsaXNoKQotICB7Ci0gICAgc2V0UHVibGlzaFRvUHJpdmF0ZVVEREkocHVibGlzaC5ib29sZWFuVmFsdWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoVG9QdWJsaWNVRERJKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFRvUHJpdmF0ZVVEREkoKQotICB7Ci0gICAgcmV0dXJuIGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0Rm9yY2VMYXVuY2hPdXRzaWRlSURFKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBMYXVuY2hPcHRpb25bXSBnZXRMYXVuY2hPcHRpb25zKCkKLSAgewotICAgIFZlY3RvciBsYXVuY2hPcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKGxhdW5jaFVERElDaGVja2JveF8uZ2V0U2VsZWN0aW9uKCkpCi0gICAgewotICAgICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IHJlZyA9IFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgaW50IFVERElSZWdTZWxlY3Rpb25JbmRleCA9IHB1YmxpY1VERElSZWdDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChVRERJUmVnU2VsZWN0aW9uSW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gcHVibGljVURESVJlZ0NvbWJvXy5nZXRJdGVtKFVERElSZWdTZWxlY3Rpb25JbmRleCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IHJlZy5nZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlSURCeU5hbWUobmFtZSk7Ci0gICAgICAgIFB1YmxpY1VERElSZWdpc3RyeVR5cGUgdHlwZSA9IHJlZy5nZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlQnlJRChpZCk7Ci0gICAgICAgIGxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLklOUVVJUllfVVJMLCB0eXBlLmdldElucXVpcnlVUkwoKSkpOwotICAgICAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5QVUJMSVNIX1VSTCwgdHlwZS5nZXRQdWJsaXNoVVJMKCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGxhdW5jaFByaXZhdGVVRERJQ2hlY2tib3hfLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgcHJpdmF0ZVJlZyA9IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHByaXZhdGVUeXBlID0gcHJpdmF0ZVJlZy5nZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpOwotICAgICAgU3RyaW5nW10gcHJpdmF0ZUlucXVpcnlVUkwgPSBwcml2YXRlVHlwZS5nZXRQcml2YXRlVURESVJlZ2lzdHJ5SW5xdWlyeUFQSSgpOwotICAgICAgU3RyaW5nW10gcHJpdmF0ZVB1Ymxpc2hVUkwgPSBwcml2YXRlVHlwZS5nZXRQcml2YXRlVURESVJlZ2lzdHJ5UHVibGlzaEFQSSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcml2YXRlSW5xdWlyeVVSTC5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuSU5RVUlSWV9VUkwsIHByaXZhdGVJbnF1aXJ5VVJMW2ldKSk7Ci0gICAgICAgIGxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlBVQkxJU0hfVVJMLCBwcml2YXRlUHVibGlzaFVSTFtpXSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKExhdW5jaE9wdGlvbltdKSBsYXVuY2hPcHRpb25WZWN0b3IudG9BcnJheShuZXcgTGF1bmNoT3B0aW9uWzBdKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9TZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1NlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NTAyNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1NlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLldlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXIuV2ViU2VydmljZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5IYW5kbGVyVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kCi0gKiAKLSAqIEluaXRpYWxpemUgYW5kIGxvYWQgdGhlIGhhbmRsZXJzIGRhdGEKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDbWQgewotCi0gIHByaXZhdGUgSGFuZGxlclRhYmxlSXRlbVtdIGhhbmRsZXJzXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIGJvb2xlYW4gaXNHZW5Ta2VsZXRvbkVuYWJsZWRfOwotICBwcml2YXRlIElQYXRoIHNvdXJjZU91dHB1dExvY2F0aW9uXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjcmlwdGlvbl87Ci0gIHByaXZhdGUgV3NkZFJlc291cmNlIHdzZGRSZXNvdXJjZV87Ci0gIHByaXZhdGUgV2ViU2VydmljZXNNYW5hZ2VyIHdlYlNlcnZpY2VzTWFuYWdlcl87Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdF87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdzRGVzY1RvSGFuZGxlcnNfOwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfOwotICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbk5hbWVfID0gbnVsbDsKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgd2ViU2VydmljZXNNYW5hZ2VyXyA9IG5ldyBXZWJTZXJ2aWNlc01hbmFnZXIoKTsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQiKSwgU3RhdHVzLkVSUk9SLCBudWxsKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgc3RhdHVzID0gcHJvY2Vzc0hhbmRsZXJzKGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLQotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBwcm9jZXNzSGFuZGxlcnMoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgdHJ5IHsKLSAgICAgIFZlY3RvciBoYW5kbGVycyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHdzRGVzY1RvSGFuZGxlcnNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIAotLy8gICAgICBXZWJTZXJ2aWNlRWRpdE1vZGVsIHdzZWQgPSBnZXRXZWJTZXJ2aWNlRWRpdE1vZGVsKCk7Ci0gIC8vICAgIGlmICh3c2VkID09IG51bGwpCi0gICAgICAgIHdzZGRSZXNvdXJjZV8gPSBnZXRXc2RkUmVzb3VyY2VGcm9tU2VsZWN0aW9uKCk7Ci0gIC8vICAgIGVsc2UKLSAgLy8gICAgICB3c2RkUmVzb3VyY2VfID0gd3NlZC5nZXRXZWJTZXJ2aWNlc1htbFJlc291cmNlKCk7Ci0KLSAgICAgIGlmICh3c2RkUmVzb3VyY2VfID09IG51bGwpIHsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0KLSAgICAgIFdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzID0gd3NkZFJlc291cmNlXy5nZXRXZWJTZXJ2aWNlcygpOwotICAgICAgaWYgKHdlYlNlcnZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgTGlzdCB3c0Rlc2NyaXB0aW9ucyA9IHdzZGRSZXNvdXJjZV8uZ2V0V2ViU2VydmljZXMoKS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NEZXNjcmlwdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQotICAgICAgICAgIHdzRGVzY3JpcHRpb25fID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgd3NEZXNjcmlwdGlvbnMuZ2V0KGkpOwotICAgICAgICAgIAotICAgICAgICAgIExpc3Qgd3NQb3J0Q29tcG9uZW50cyA9IHdzRGVzY3JpcHRpb25fLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB3c1BvcnRDb21wb25lbnRzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHdzUG9ydCA9IChQb3J0Q29tcG9uZW50KSB3c1BvcnRDb21wb25lbnRzLmdldChqKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSA9IHdzUG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpOwotICAgICAgICAgICAgTGlzdCB3c0hhbmRsZXJzID0gd3NQb3J0LmdldEhhbmRsZXJzKCk7Ci0gICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtW10gaGFuZGxlckl0ZW1zID0gbmV3IEhhbmRsZXJUYWJsZUl0ZW1bd3NIYW5kbGVycy5zaXplKCldOyAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3c0hhbmRsZXJzLnNpemUoKTsgaysrKSB7Ci0KLSAgICAgICAgICAgICAgSGFuZGxlciB3c0hhbmRsZXIgPSAoSGFuZGxlcikgd3NIYW5kbGVycy5nZXQoayk7Ci0KLSAgICAgICAgICAgICAgSGFuZGxlclRhYmxlSXRlbSBoYW5kbGVySXRlbSA9IG5ldyBIYW5kbGVyVGFibGVJdGVtKCk7Ci0gICAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldEhhbmRsZXIod3NIYW5kbGVyKTsKLSAgICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0SGFuZGxlck5hbWUod3NIYW5kbGVyLmdldEhhbmRsZXJOYW1lKCkpOwotICAgICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRIYW5kbGVyQ2xhc3NOYW1lKHdzSGFuZGxlci5nZXRIYW5kbGVyQ2xhc3MoKSk7Ci0gICAgICAgICAgICAgIGhhbmRsZXJJdGVtLnNldFBvcnQod3NQb3J0KTsKLSAgICAgICAgICAgICAgaGFuZGxlckl0ZW0uc2V0UG9ydE5hbWUocG9ydE5hbWUpOwotICAgICAgICAgICAgICBoYW5kbGVySXRlbS5zZXRXc0Rlc2NSZWYod3NEZXNjcmlwdGlvbl8pOwotICAgICAgICAgICAgICBoYW5kbGVySXRlbXNba10gPSBoYW5kbGVySXRlbTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVySXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgd3NEZXNjTmFtZSA9IHdzRGVzY3JpcHRpb25fLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKTsKLSAgICAgICAgICAgIHdzRGVzY1RvSGFuZGxlcnNfLnB1dCh3c0Rlc2NOYW1lLCBoYW5kbGVySXRlbXMpOwotICAgICAgICAgICAgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXy5wdXQod3NEZXNjTmFtZSwgd3NEZXNjcmlwdGlvbl8pOwotICAgICAgICAgICAgCi0gICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICBoYW5kbGVyc18gPSAoSGFuZGxlclRhYmxlSXRlbVtdKSBoYW5kbGVycy50b0FycmF5KG5ldyBIYW5kbGVyVGFibGVJdGVtWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVEFTS19FWENFUFRFRCIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgSGFuZGxlclRhYmxlSXRlbVtdIGdldEhhbmRsZXJzKCkgewotICAgIHJldHVybiB0aGlzLmhhbmRsZXJzXzsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzR2VuU2tlbGV0b25FbmFibGVkXy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEdlblNrZWxldG9uRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNvdXJjZU91dHB1dExvY2F0aW9uXy4KLSAgICovCi0gIHB1YmxpYyBJUGF0aFtdIGdldFNvdXJjZU91dHB1dExvY2F0aW9uKCkgewotICAgIElQYXRoW10gbG9jYXRpb25zID0gbnVsbDsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCi0gICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgbG9jYXRpb25zID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHByb2plY3QpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHByb2plY3QgPSBwcm9qZWN0XzsKLSAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgbG9jYXRpb25zID0gUmVzb3VyY2VVdGlscy5nZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKHByb2plY3QpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbG9jYXRpb25zOwotICB9Ci0KLSAgcHVibGljIFdzZGRSZXNvdXJjZSBnZXRXc2RkUmVzb3VyY2UoKSB7Ci0gICAgcmV0dXJuIHdzZGRSZXNvdXJjZV87Ci0gIH0KLQotICBwcml2YXRlIFdzZGRSZXNvdXJjZSBnZXRXc2RkUmVzb3VyY2VGcm9tU2VsZWN0aW9uKCkgewotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRTZWwgPSBnZXRJbml0aWFsU2VsZWN0aW9uKCk7Ci0gICAgaWYgKGluaXRTZWwgIT0gbnVsbCAmJiBpbml0U2VsLnNpemUoKSA9PSAxKSB7Ci0gICAgICBPYmplY3Qgb2JqID0gaW5pdFNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkgewotICAgICAgICAvLyBTZXJ2aWNlIG9iamVjdAotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgb2JqOwotICAgICAgICBkZXNjcmlwdGlvbk5hbWVfID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICBwcm9qZWN0XyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChzZXJ2aWNlKTsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0V3NkZFJlc291cmNlKHNlcnZpY2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCkgewotICAgICAgICAvLyBXU0RMIHJlc291cmNlCi0gICAgICAgIFdTRExSZXNvdXJjZUltcGwgcmVzID0gKFdTRExSZXNvdXJjZUltcGwpIG9iajsKLSAgICAgICAgcHJvamVjdF8gPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVzKTsKLSAgICAgICAgTGlzdCB3c2RsUmVzb3VyY2VzID0gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRXU0RMU2VydmljZXMocmVzKTsKLSAgICAgICAgcmV0dXJuIHdlYlNlcnZpY2VzTWFuYWdlcl8uZ2V0V3NkZFJlc291cmNlKChTZXJ2aWNlKSB3c2RsUmVzb3VyY2VzLmdldCgwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXZWJTZXJ2aWNlTmF2aWdhdG9yR3JvdXBUeXBlKSB7Ci0gICAgICAgIFdlYlNlcnZpY2VOYXZpZ2F0b3JHcm91cFR5cGUgd3NuZ3QgPSAoV2ViU2VydmljZU5hdmlnYXRvckdyb3VwVHlwZSkgb2JqOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSl3c25ndC5nZXRXc2RsU2VydmljZSgpOwotICAgICAgICBkZXNjcmlwdGlvbk5hbWVfID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOyAgICAgICAgCi0gICAgICAgIHByb2plY3RfID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2UpOwotICAgICAgICByZXR1cm4gd2ViU2VydmljZXNNYW5hZ2VyXy5nZXRXc2RkUmVzb3VyY2Uoc2VydmljZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICAvKioKLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gZ2V0V3NEZXNjcmlwdGlvbigpIHsKLSAgICByZXR1cm4gd3NEZXNjcmlwdGlvbl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25OYW1lKCl7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uTmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0V3NSZWZzVG9IYW5kbGVycygpewotICAgIHJldHVybiB3c0Rlc2NUb0hhbmRsZXJzXzsKLSAgfQotICAKLSAgcHVibGljIEhhc2h0YWJsZSBnZXRTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmooKXsKLSAgICByZXR1cm4gdGhpcy5zZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmpfOwotICB9Ci0gIAotICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1NlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY3YzQzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLmltcGwuV3NkZEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0LkhhbmRsZXJUYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FdG9vbHNDb3B5VXRpbGl0eTsKLQotLyoKLSAqIFByb3ZpZGUgYSB3YXkgdG8gZXh0ZXJuYWxpemUgdGhlIGVkaXRlZCBmaWVsZHMgYW5kIGNyZWF0ZSBuZXcgaGFuZGxlcnMKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIExpc3QgaGFuZGxlclRhYmxlSXRlbXM7Ci0gIHByaXZhdGUgV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzY3JpcHRpb25fOwotICBwcml2YXRlIFdzZGRSZXNvdXJjZSB3c2RkUmVzb3VyY2VfOwotICBwcml2YXRlIEhhc2h0YWJsZSB3c0Rlc2NUb0hhbmRsZXJzXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXzsKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0KLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5IHsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSB3c0Rlc2NUb0hhbmRsZXJzXy5rZXlzKCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCi0gICAgICAgIEhhc2h0YWJsZSB3c1BvcnRzVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIEhhc2h0YWJsZSB3c1BvcnRUb0hhbmRsZXJUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgICBTdHJpbmcgc2VydmljZURlc2NOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAvLyBsb2FkIFBvcnROYW1lIC0+IFBvcnRDb21wb25lbnQgdGFibGUKLSAgICAgICAgV2ViU2VydmljZURlc2NyaXB0aW9uIHdzRGVzY3JpcHRpb25fID0gKFdlYlNlcnZpY2VEZXNjcmlwdGlvbikgc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXy5nZXQoc2VydmljZURlc2NOYW1lKTsKLSAgICAgICAgaWYgKHdzRGVzY3JpcHRpb25fICE9IG51bGwpIHsKLQotICAgICAgICAgIExpc3Qgd3NQb3J0cyA9IHdzRGVzY3JpcHRpb25fLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB3c1BvcnRzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHBvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0cy5nZXQoayk7Ci0gICAgICAgICAgICB3c1BvcnRzVGFibGUucHV0KHBvcnQuZ2V0UG9ydENvbXBvbmVudE5hbWUoKSwgcG9ydCk7Ci0gICAgICAgICAgICB3c1BvcnRUb0hhbmRsZXJUYWJsZS5wdXQocG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpLCBuZXcgQXJyYXlMaXN0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgaGFuZGxlclRhYmxlSXRlbXMgPSAoTGlzdCkgd3NEZXNjVG9IYW5kbGVyc18uZ2V0KHNlcnZpY2VEZXNjTmFtZSk7Ci0gICAgICAgIGlmIChoYW5kbGVyVGFibGVJdGVtcyAhPSBudWxsKSB7Ci0KLSAgICAgICAgICBXc2RkRmFjdG9yeSB3c2RkRmFjdG9yeSA9IG5ldyBXc2RkRmFjdG9yeUltcGwoKTsKLQotICAgICAgICAgIC8vZm9ybSBwb3J0IGNvbXBvbmVudHMgdGFibGVzIGZpcnN0Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVyVGFibGVJdGVtcy5zaXplKCk7IGkrKykgewotCi0gICAgICAgICAgICBIYW5kbGVyVGFibGVJdGVtIGh0aSA9IChIYW5kbGVyVGFibGVJdGVtKSBoYW5kbGVyVGFibGVJdGVtcy5nZXQoaSk7Ci0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHdzUG9ydCA9IChQb3J0Q29tcG9uZW50KSBodGkuZ2V0UG9ydCgpOwotICAgICAgICAgICAgaWYgKHdzUG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIC8vZmluZCBpdAotICAgICAgICAgICAgICBpZiAod3NQb3J0c1RhYmxlLmdldChodGkuZ2V0UG9ydE5hbWUoKSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB3c1BvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0c1RhYmxlLmdldChodGkuZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBpdDsgc2hvdWxkIG5vdCBnZXQgaW50byBoZXJlCi0gICAgICAgICAgICAgICAgd3NQb3J0ID0gd3NkZEZhY3RvcnkuY3JlYXRlUG9ydENvbXBvbmVudCgpOwotICAgICAgICAgICAgICAgIHdzUG9ydC5zZXRQb3J0Q29tcG9uZW50TmFtZShodGkuZ2V0UG9ydE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgd3NQb3J0c1RhYmxlLnB1dCh3c1BvcnQuZ2V0UG9ydENvbXBvbmVudE5hbWUoKSwgd3NQb3J0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3NQb3J0VG9IYW5kbGVyVGFibGUucHV0KHdzUG9ydC5nZXRQb3J0Q29tcG9uZW50TmFtZSgpLCBuZXcgQXJyYXlMaXN0KCkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIGZvcm0gSGFuZGxlciBhbmQgcG9ydHMgdGFibGUKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhbmRsZXJUYWJsZUl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0KLSAgICAgICAgICAgIEhhbmRsZXJUYWJsZUl0ZW0gaHRpID0gKEhhbmRsZXJUYWJsZUl0ZW0pIGhhbmRsZXJUYWJsZUl0ZW1zLmdldChpKTsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0TmFtZSA9IGh0aS5nZXRQb3J0TmFtZSgpOwotCi0gICAgICAgICAgICBQb3J0Q29tcG9uZW50IHBvcnQgPSAoUG9ydENvbXBvbmVudCkgd3NQb3J0c1RhYmxlLmdldChwb3J0TmFtZSk7Ci0gICAgICAgICAgICBpZiAocG9ydCA9PSBudWxsKSByZXR1cm4gc3RhdHVzOwotCi0gICAgICAgICAgICBMaXN0IGV4aXN0aW5nSGFuZGxlcnMgPSBwb3J0LmdldEhhbmRsZXJzKCk7Ci0KLSAgICAgICAgICAgIE9iamVjdCBoYW5kbGVyID0gaHRpLmdldEhhbmRsZXIoKTsKLSAgICAgICAgICAgIGlmICghZXhpc3RpbmdIYW5kbGVycy5jb250YWlucyhoYW5kbGVyKSkgewotICAgICAgICAgICAgICAvLyBjcmVhdGUgaXQKLSAgICAgICAgICAgICAgSGFuZGxlciBuZXdIYW5kbGVyID0gd3NkZEZhY3RvcnkuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICAgICAgICBuZXdIYW5kbGVyLnNldEhhbmRsZXJOYW1lKGh0aS5nZXRIYW5kbGVyTmFtZSgpKTsKLSAgICAgICAgICAgICAgbmV3SGFuZGxlci5zZXRIYW5kbGVyQ2xhc3MoaHRpLmdldEhhbmRsZXJDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICgoTGlzdCkgd3NQb3J0VG9IYW5kbGVyVGFibGUuZ2V0KHBvcnROYW1lKSkuYWRkKG5ld0hhbmRsZXIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChoYW5kbGVyIGluc3RhbmNlb2YgSGFuZGxlcikgewotICAgICAgICAgICAgICAvLyBjbG9uZSBpdAotICAgICAgICAgICAgICBFdG9vbHNDb3B5VXRpbGl0eSBjb3B5VXRpbCA9IG5ldyBFdG9vbHNDb3B5VXRpbGl0eSgpOwotICAgICAgICAgICAgICBjb3B5VXRpbC5zZXRDb3B5QWRhcHRlcnModHJ1ZSk7Ci0gICAgICAgICAgICAgIEhhbmRsZXIgY2xvbmVkSGFuZGxlciA9IChIYW5kbGVyKSBjb3B5VXRpbC5jb3B5KChIYW5kbGVyKSBoYW5kbGVyKTsKLSAgICAgICAgICAgICAgKChMaXN0KSB3c1BvcnRUb0hhbmRsZXJUYWJsZS5nZXQocG9ydE5hbWUpKS5hZGQoY2xvbmVkSGFuZGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLQotICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmcgaGFuZGxlcnMgZnJvbSBwb3J0cwotICAgICAgICByZW1vdmVFeGlzdGluZ0hhbmRsZXJzKHdzUG9ydHNUYWJsZSwgd3NQb3J0VG9IYW5kbGVyVGFibGUpOwotCi0gICAgICAgIC8vIGFkZCBwb3J0cyB0byB3c0Rlc2NyaXB0aW9uCi0gICAgICAgIGFkZFBvcnRzVG9EZXNjcmlwdGlvbnMod3NQb3J0c1RhYmxlLCB3c0Rlc2NyaXB0aW9uXyk7Ci0KLSAgICAgICAgLy8gYWRkIGhhbmRsZXJzIHRvIHBvcnRzCi0gICAgICAgIGFkZEhhbmRsZXJzVG9Qb3J0cyh3c1BvcnRzVGFibGUsIHdzUG9ydFRvSGFuZGxlclRhYmxlKTsKLSAgICAgIH0KLSAgICAgIGlmICh3c2RkUmVzb3VyY2VfICE9IG51bGwpIHsKLSAgICAgICAgd3NkZFJlc291cmNlXy5zYXZlKG5ldyBIYXNoTWFwKCkpOwotICAgICAgfQotCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy9zdGF0dXMgPSBuZXcKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlRXhpc3RpbmdIYW5kbGVycyhIYXNodGFibGUgcG9ydHNUYWJsZSwgSGFzaHRhYmxlIHBvcnRzVG9IYW5kbGVyc1RhYmxlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGludCBrZXkgPSAwOwotICAgICAgRW51bWVyYXRpb24gcG9ydHMgPSBwb3J0c1RvSGFuZGxlcnNUYWJsZS5rZXlzKCk7Ci0gICAgICB3aGlsZSAocG9ydHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgU3RyaW5nIHBvcnROYW1lID0gKFN0cmluZykgcG9ydHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IHBvcnQgPSBwb3J0c1RhYmxlLmdldChwb3J0TmFtZSk7Ci0gICAgICAgIGlmIChwb3J0ICE9IG51bGwgJiYgcG9ydCBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnQpIHsKLSAgICAgICAgICBMaXN0IGhhbmRsZXJzID0gKChQb3J0Q29tcG9uZW50KSBwb3J0KS5nZXRIYW5kbGVycygpOwotICAgICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRQb3J0c1RvRGVzY3JpcHRpb25zKEhhc2h0YWJsZSBwb3J0c1RhYmxlLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gd3NEZXNjcmlwdGlvbl8pIHsKLSAgICB0cnkgewotICAgICAgRW51bWVyYXRpb24gcG9ydHMgPSBwb3J0c1RhYmxlLmtleXMoKTsKLSAgICAgIHdoaWxlIChwb3J0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAoU3RyaW5nKSBwb3J0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAvLyBuZXdseSBlZGl0ZWQgcG9ydAotICAgICAgICBPYmplY3QgcG9ydCA9IHBvcnRzVGFibGUuZ2V0KHBvcnROYW1lKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGV4aXN0aW5nIHBvcnQKLSAgICAgICAgTGlzdCBlbWZQb3J0cyA9IHdzRGVzY3JpcHRpb25fLmdldFBvcnRDb21wb25lbnRzKCk7Ci0gICAgICAgIGlmICghZW1mUG9ydHMuY29udGFpbnMocG9ydCkgJiYgcG9ydCAhPSBudWxsICYmIHBvcnQgaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50KSB7Ci0gICAgICAgICAgZW1mUG9ydHMuYWRkKChQb3J0Q29tcG9uZW50KSBwb3J0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkSGFuZGxlcnNUb1BvcnRzKEhhc2h0YWJsZSBwb3J0c1RhYmxlLCBIYXNodGFibGUgcG9ydHNUb0hhbmRsZXJzVGFibGUpIHsKLSAgICB0cnkgewotICAgICAgaW50IGtleSA9IDA7Ci0gICAgICBFbnVtZXJhdGlvbiBwb3J0cyA9IHBvcnRzVG9IYW5kbGVyc1RhYmxlLmtleXMoKTsKLSAgICAgIHdoaWxlIChwb3J0cy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAoU3RyaW5nKSBwb3J0cy5uZXh0RWxlbWVudCgpOwotICAgICAgICBPYmplY3QgcG9ydCA9IHBvcnRzVGFibGUuZ2V0KHBvcnROYW1lKTsKLSAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCAmJiBwb3J0IGluc3RhbmNlb2YgUG9ydENvbXBvbmVudCkgewotICAgICAgICAgIExpc3QgaGFuZGxlcnMgPSAoTGlzdCkgcG9ydHNUb0hhbmRsZXJzVGFibGUuZ2V0KHBvcnROYW1lKTsKLQotICAgICAgICAgIExpc3QgbW9kZWxIYW5kbGVycyA9ICgoUG9ydENvbXBvbmVudCkgcG9ydCkuZ2V0SGFuZGxlcnMoKTsKLSAgICAgICAgICBtb2RlbEhhbmRsZXJzLmFkZEFsbChoYW5kbGVycyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gaGFuZGxlclRhYmxlSXRlbXMKLSAgICogICAgICAgICAgVGhlIGhhbmRsZXJUYWJsZUl0ZW1zIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhhbmRsZXJzTGlzdChMaXN0IGhhbmRsZXJUYWJsZUl0ZW1zKSB7Ci0gICAgdGhpcy5oYW5kbGVyVGFibGVJdGVtcyA9IGhhbmRsZXJUYWJsZUl0ZW1zOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V3NEZXNjVG9IYW5kbGVycyhIYXNodGFibGUgd3NEZXNjVG9IYW5kbGVycykgewotICAgIHRoaXMud3NEZXNjVG9IYW5kbGVyc18gPSB3c0Rlc2NUb0hhbmRsZXJzOwotICB9Ci0KLS8vICBwdWJsaWMgdm9pZCBzZXRXc0Rlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c0Rlc2MpIHsKLS8vICAgIHRoaXMud3NEZXNjcmlwdGlvbl8gPSB3c0Rlc2M7Ci0vLyAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGRSZXNvdXJjZShXc2RkUmVzb3VyY2Ugd3NkZFJlcykgewotICAgIHRoaXMud3NkZFJlc291cmNlXyA9IHdzZGRSZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmooSGFzaHRhYmxlIHNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaikgewotICAgIHRoaXMuc2VydmljZURlc2NOYW1lVG9EZXNjT2JqXyA9IHNlcnZpY2VEZXNjTmFtZVRvRGVzY09iajsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9UYWJsZVZpZXdlcldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1RhYmxlVmlld2VyV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMTg3MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1RhYmxlVmlld2VyV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLlByb3BlcnRpZXNSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLkRpYWxvZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBUYWJsZVZpZXdlcldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIGludCBERUZBVUxUX1RBQkxFX0hFSUdIVF9ISU5UID0gMTAwOwotICBwcml2YXRlIGludCBERUZBVUxUX0NPTFVNTl9XSURUSCA9IDgwOwotCi0gIHB1YmxpYyBzdGF0aWMgYnl0ZSBNQVBfT05FX1RPX09ORSA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgYnl0ZSBNQVBfTUFOWV9UT19PTkUgPSAxOwotICBwdWJsaWMgc3RhdGljIGJ5dGUgTUFQX01BTllfVE9fTUFOWSA9IDA7Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5zXzsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcl87Ci0gIHByaXZhdGUgVGFibGUgdGFibGVfOwotICBwcml2YXRlIFRhYmxlRWRpdG9yIGVkaXRvcl87Ci0gIHByaXZhdGUgVGFibGVFZGl0b3JMaXN0ZW5lciB0YWJsZUVkaXRvckxpc3RlbmVyXzsKLSAgcHJpdmF0ZSBUZXh0IHRleHRfOwotICBwcml2YXRlIEJ1dHRvbiBpbXBvcnRfOwotICBwcml2YXRlIEJ1dHRvbiBhZGRfOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVfOwotICAKLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50XzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciAgc3RhdHVzTGlzdGVuZXJfOwotCi0gIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICBwcml2YXRlIGJ5dGUgcmVzY3JpY3Rpb24gPSBNQVBfTUFOWV9UT19NQU5ZOwotCi0gIHByaXZhdGUgTGlzdCB2YWx1ZXNfOwotICBwcml2YXRlIE9iamVjdCBkZWZhdWx0VmFsdWVfOwotCi0gIHByaXZhdGUgUHJvcGVydGllc1Jlc291cmNlRmlsdGVyIGZpbHRlcl8gPSBuZXcgUHJvcGVydGllc1Jlc291cmNlRmlsdGVyKCk7Ci0KLSAgcHVibGljIFRhYmxlVmlld2VyV2lkZ2V0KFN0cmluZ1tdIGNvbHVtbnMsIExpc3QgaW5pdFZhbHVlcywgT2JqZWN0IGRlZmF1bHRWYWx1ZSwgYnl0ZSByZXNjcmljdGlvbikKLSAgewotCWNvbHVtbnNfID0gY29sdW1uczsKLQl2YWx1ZXNfID0gbmV3IEFycmF5TGlzdCgpOwotCWlmIChpbml0VmFsdWVzICE9IG51bGwgJiYgaW5pdFZhbHVlcy5zaXplKCkgPiAwKQotCSAgdmFsdWVzXy5hZGRBbGwoaW5pdFZhbHVlcyk7Ci0JZGVmYXVsdFZhbHVlXyA9IChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBuZXcgU3RyaW5nKCIiKTsKLQl0aGlzLnJlc2NyaWN0aW9uID0gcmVzY3JpY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7IAotICAgIHBhcmVudF8gICAgICAgICA9IHBhcmVudDsKLSAgICBzdGF0dXNMaXN0ZW5lcl8gPSBzdGF0dXNMaXN0ZW5lcjsKLSAgICAKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotCUNvbXBvc2l0ZSAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQlHcmlkTGF5b3V0IGdsICAgICAgICA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCi0JZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLQlnbC5tYXJnaW5XaWR0aCA9IDA7Ci0JY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0JY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JdGFibGVfID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JZ2QuaGVpZ2h0SGludCA9IERFRkFVTFRfVEFCTEVfSEVJR0hUX0hJTlQ7Ci0JdGFibGVfLnNldExheW91dERhdGEoZ2QpOwotCXRhYmxlXy5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCXRhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQlpbnQgbWF4V2lkdGggPSBERUZBVUxUX0NPTFVNTl9XSURUSDsKLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNfLmxlbmd0aDsgaSsrKQotCXsKLQkgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlXywgU1dULk5PTkUpOwotCSAgdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5zX1tpXSk7Ci0JICB0YWJsZUNvbHVtbi5wYWNrKCk7Ci0JICBpbnQgdGFibGVDb2x1bW5XaWR0aCA9IE1hdGgubWF4KERFRkFVTFRfQ09MVU1OX1dJRFRILCB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpKTsKLQkgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIHRhYmxlQ29sdW1uV2lkdGgpOwotCSAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEodGFibGVDb2x1bW5XaWR0aCwgdGFibGVDb2x1bW5XaWR0aCwgdHJ1ZSk7Ci0JICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkRhdGEpOwotCX0KLQl0YWJsZV8uc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQkvLyBpbml0aWFsaXplIHRoZSB0YWJsZSBlZGl0b3IKLQllZGl0b3JfID0gbmV3IFRhYmxlRWRpdG9yKHRhYmxlXyk7Ci0JLy8gVGhlIGVkaXRvciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2VsbCBhbmQgbXVzdAotCS8vIG5vdCBiZSBhbnkgc21hbGxlciB0aGFuIDUwIHBpeGVscy4KLQllZGl0b3JfLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLQllZGl0b3JfLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQllZGl0b3JfLm1pbmltdW1XaWR0aCA9IG1heFdpZHRoOwotCXRhYmxlRWRpdG9yTGlzdGVuZXJfID0gbmV3IFRhYmxlRWRpdG9yTGlzdGVuZXIoKTsKLQl0YWJsZV8uYWRkTW91c2VMaXN0ZW5lcih0YWJsZUVkaXRvckxpc3RlbmVyXyk7Ci0JdGFibGVWaWV3ZXJfID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlXyk7Ci0JdGFibGVWaWV3ZXJfLmdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcigKLQkgIG5ldyBLZXlMaXN0ZW5lcigpCi0JICB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLQkJewotCQkgIGludCBhc2NpaURlbCA9IChpbnQpZS5jaGFyYWN0ZXI7Ci0JCSAgLy8gRGVsCi0JCSAgaWYgKGFzY2lpRGVsID09IDEyNykgCi0JCQloYW5kbGVEZWxldGVLZXlQcmVzc2VkKCk7Ci0gICAgICAgICAgICAgICAgLy8gRW50ZXIgb3Igc3BhY2UKLSAgICAgICAgICAgICAgICBpZiAoKChpbnQpZS5jaGFyYWN0ZXIpID09IDEzIHx8ICgoaW50KWUuY2hhcmFjdGVyKSA9PSAzMikKLSAgICAgICAgICAgICAgICAgIHRhYmxlRWRpdG9yTGlzdGVuZXJfLmVkaXRTZWxlY3Rpb24oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKQotCQl7Ci0JCX0KLQkgIH0KLQkpOwotCXRhYmxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IExpc3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JdGFibGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IExpc3RMYWJlbFByb3ZpZGVyKCkpOwotCXRhYmxlVmlld2VyXy5zZXRJbnB1dCh2YWx1ZXNfKTsKLQl0YWJsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCSAgbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotCSAgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLQkJewotCQkgIGVuYWJsZVJlbW92ZSh0cnVlKTsKLQkJfQotCSAgfQotCSk7Ci0KLQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQlnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JZ2wubnVtQ29sdW1ucyA9IDM7Ci0JZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCWltcG9ydF8gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWltcG9ydF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9JTVBPUlQiKSk7Ci0JaW1wb3J0Xy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQlpbXBvcnRfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCSAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLQkgIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJICBoYW5kbGVJbXBvcnRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotCQl7Ci0JCX0KLQkgIH0KLQkpOwotCQotCWFkZF8gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCWFkZF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9BREQiKSk7Ci0JYWRkXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQlhZGRfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCSAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLQkgIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotCQl7Ci0JCX0KLQkgIH0KLQkpOwotCi0JCi0JcmVtb3ZlXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JcmVtb3ZlXy5zZXRUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX1JFTU9WRSIpKTsKLQlyZW1vdmVfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCXJlbW92ZV8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JICBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotCSAgewotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLQkJewotCQkgIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0JCXsKLQkJfQotCSAgfQotCSk7Ci0JZW5hYmxlUmVtb3ZlKGZhbHNlKTsKLQkKLQlyZXR1cm4gdGhpczsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmFibGVSZW1vdmUoYm9vbGVhbiBlbmFibGVkKQotICB7Ci0JcmVtb3ZlXy5zZXRFbmFibGVkKGVuYWJsZWQgJiYgIXRhYmxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUltcG9ydEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0JSVJlc291cmNlIHJlc291cmNlID0gRGlhbG9nVXRpbHMuYnJvd3NlUmVzb3VyY2VzKAotCSAgcGFyZW50Xy5nZXRTaGVsbCgpLAotCSAgUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCksCi0JICBudWxsLAotCSAgZmlsdGVyXwotCSk7Ci0JaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkKLQl7Ci0JICB0cnkKLQkgIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXByb3BzLmxvYWQoKChJRmlsZSlyZXNvdXJjZSkuZ2V0Q29udGVudHMoKSk7Ci0JCVNldCBzZXQgPSBwcm9wcy5lbnRyeVNldCgpOwotCQlqYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJSXRlcmF0b3IgaSA9IHNldC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpCi0JCXsKLQkJICBNYXAuRW50cnkgbWUgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotCQkgIFN0cmluZyBrZXkgPSAoU3RyaW5nKW1lLmdldEtleSgpOwotCQkgIFN0cmluZyB2YWwgPSAoU3RyaW5nKW1lLmdldFZhbHVlKCk7Ci0JCSAgbGlzdC5hZGQobmV3IFN0cmluZ1tdIHtrZXksdmFsfSk7Ci0JCX0KLQkJdmFsdWVzXy5hZGRBbGwobGlzdCk7Ci0JICB9Ci0JICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7Ci0JICAgIC8vIFRPRE8gUmVwb3J0IHNvbWUgZXJyb3IgaGVyZS4KLQkgIH0KLQl9Ci0JcmVmcmVzaCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0JdmFsdWVzXy5hZGQoZGVmYXVsdFZhbHVlXyk7Ci0JcmVmcmVzaCgpOwotCXNldFNlbGVjdGlvbkFzT2JqZWN0KHZhbHVlc18uZ2V0KHRhYmxlXy5nZXRJdGVtQ291bnQoKS0xKSk7Ci0JdGFibGVFZGl0b3JMaXN0ZW5lcl8uZWRpdFNlbGVjdGlvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0JaGFuZGxlRGVsZXRlS2V5UHJlc3NlZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKQotICB7Ci0JaW50ZXJuYWxEaXNwb3NlKCk7Ci0JSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0JaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JewotCSAgaW50IHNlbGVjdGlvbkluZGV4ID0gdGFibGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JICBpbnQgc2VsZWN0aW9uQ291bnQgPSB0YWJsZV8uZ2V0SXRlbUNvdW50KCk7Ci0JICB2YWx1ZXNfLnJlbW92ZShzZWxlY3Rpb25JbmRleCk7Ci0JICBpZiAoc2VsZWN0aW9uSW5kZXggPCBzZWxlY3Rpb25Db3VudC0xKQotCQlzZXRTZWxlY3Rpb25Bc09iamVjdCh2YWx1ZXNfLmdldChzZWxlY3Rpb25JbmRleCkpOwotCSAgZWxzZSBpZiAoc2VsZWN0aW9uQ291bnQgLTIgPj0gMCkKLQkJc2V0U2VsZWN0aW9uQXNPYmplY3QodmFsdWVzXy5nZXQoc2VsZWN0aW9uQ291bnQtMikpOwotCSAgcmVmcmVzaCgpOwotCX0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbnRlcm5hbFJlZnJlc2goKQotICB7Ci0JLy8gc3luY2hyb25pemUgdGV4dCBmaWVsZCwgcHJldmlvdXNseSBzZWxlY3RlZCB0YWJsZSBjZWxsIGFuZCBtb2RlbCAoaW5wdXRPYmplY3QpCi0JaWYgKHRleHRfICE9IG51bGwpCi0JewotCSAgVGFibGVJdGVtIG9sZFRhYmxlSXRlbSA9IGVkaXRvcl8uZ2V0SXRlbSgpOwotCSAgaW50IG9sZENvbHVtbkluZGV4ID0gZWRpdG9yXy5nZXRDb2x1bW4oKTsKLQkgIGlmIChvbGRUYWJsZUl0ZW0gIT0gbnVsbCAmJiBvbGRDb2x1bW5JbmRleCA+PSAwICYmIG9sZENvbHVtbkluZGV4IDwgY29sdW1uc18ubGVuZ3RoKQotCSAgewotCQlTdHJpbmcgb2xkVGV4dCA9IHRleHRfLmdldFRleHQoKTsKLQkJb2xkVGFibGVJdGVtLnNldFRleHQob2xkQ29sdW1uSW5kZXgsIG9sZFRleHQpOwotCQlpbnQgb2xkUm93SW5kZXggPSB0YWJsZV8uaW5kZXhPZihvbGRUYWJsZUl0ZW0pOwotCQl2YWx1ZXNfLnNldChvbGRSb3dJbmRleCwgbmV3IFN0cmluZ1tdIHtvbGRUYWJsZUl0ZW0uZ2V0VGV4dCgwKSwgb2xkVGFibGVJdGVtLmdldFRleHQoMSl9KTsKLQkgIH0KLQl9Ci0JY2hlY2tNYXBwaW5nQ29uc3RyYWludHMoKTsKLQlzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja01hcHBpbmdDb25zdHJhaW50cygpIHsKLQotCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotCWZvcihpbnQgY250PTA7IGNudDx2YWx1ZXNfLnNpemUoKTsgY250KyspewotCQlTdHJpbmdbXSB2YWx1ZSA9IChTdHJpbmdbXSl2YWx1ZXNfLmdldChjbnQpOwotCQlpZihtYXAuY29udGFpbnNLZXkodmFsdWVbMF0pICYmICgocmVzY3JpY3Rpb24gJiAxKSE9MCkpewotCQkJbWVzc2FnZSA9IG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19NQVBQSU5HX0RVUExJQ0FURV9FTlRSSUVTIiwgbmV3IFN0cmluZ1tde2NvbHVtbnNfWzBdLGNvbHVtbnNfWzFdfSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYobWFwLmNvbnRhaW5zVmFsdWUodmFsdWVbMV0pICYmICgocmVzY3JpY3Rpb24gJiAyKSE9MCkpewotCQkJbWVzc2FnZSA9IG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19NQVBQSU5HX0RVUExJQ0FURV9FTlRSSUVTIiwgbmV3IFN0cmluZ1tde2NvbHVtbnNfWzFdLGNvbHVtbnNfWzBdfSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbWFwLnB1dCh2YWx1ZVswXSx2YWx1ZVsxXSk7Ci0KLQl9Ci0JbWVzc2FnZSA9IG51bGw7Ci0KLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlID09IG51bGwgPyBuZXcgU2ltcGxlU3RhdHVzKCIiKSA6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbWVzc2FnZSwgU3RhdHVzLkVSUk9SICk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0U2VsZWN0aW9uQXNPYmplY3QoT2JqZWN0IG9iamVjdCkKLSAgewotCXRhYmxlVmlld2VyXy5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotCWludGVybmFsUmVmcmVzaCgpOwotCXRhYmxlVmlld2VyXy5yZWZyZXNoKCk7Ci0gIH0KLQotICBwdWJsaWMgVGFibGVJdGVtW10gZ2V0SXRlbXMoKQotICB7Ci0JLy9pbnRlcm5hbFJlZnJlc2goKTsKLQlyZXR1cm4gdGFibGVfLmdldEl0ZW1zKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotCWFkZF8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQllbmFibGVSZW1vdmUoZW5hYmxlZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotCWludGVybmFsRGlzcG9zZSgpOwotCWlmIChlZGl0b3JfICE9IG51bGwpCi0JICBlZGl0b3JfLmRpc3Bvc2UoKTsKLQlpZiAodGFibGVfICE9IG51bGwpCi0JICB0YWJsZV8uZGlzcG9zZSgpOwotCWlmIChhZGRfICE9IG51bGwpCi0JICBhZGRfLmRpc3Bvc2UoKTsKLQlpZiAocmVtb3ZlXyAhPSBudWxsKQotCSAgcmVtb3ZlXy5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW50ZXJuYWxEaXNwb3NlKCkKLSAgewotCWlmICh0ZXh0XyAhPSBudWxsKQotCSAgdGV4dF8uZGlzcG9zZSgpOwotCXRleHRfID0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBUYWJsZUVkaXRvckxpc3RlbmVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lcgotICB7Ci0JcHJpdmF0ZSBpbnQgY3VyclNlbGVjdGlvbkluZGV4XzsKLSAgICBwcml2YXRlIGludCBlZGl0Um93XzsKLSAgICBwcml2YXRlIGludCBlZGl0Q29sdW1uXzsKLQotCXB1YmxpYyBUYWJsZUVkaXRvckxpc3RlbmVyKCkKLQl7Ci0JICBzdXBlcigpOwotCSAgY3VyclNlbGVjdGlvbkluZGV4XyA9IC0xOwotICAgICAgICAgZWRpdFJvd18gPSAtMTsKLSAgICAgICAgIGVkaXRDb2x1bW5fID0gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpCi0JewotCSAgbW91c2VEb3duKGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0JewotCSAgLy8gcmVmcmVzaCB0YWJsZQotCSAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0JICAvLyBDbGVhbiB1cCBwcmV2aW91cyB0ZXh0IGVkaXRvciBjb250cm9sCi0JICBpbnRlcm5hbERpc3Bvc2UoKTsKLQkgIC8vIHVwZGF0ZSB0YWJsZQotCSAgaWYgKHRhYmxlXy5pc0ZvY3VzQ29udHJvbCgpKQotCSAgewotCQlpbnQgc2VsZWN0ZWRSb3dJbmRleCA9IGdldFNlbGVjdGVkUm93KHRhYmxlXywgZS55KTsKLQkJaWYgKGN1cnJTZWxlY3Rpb25JbmRleF8gIT0gLTEgJiYgc2VsZWN0ZWRSb3dJbmRleCAhPSAtMSAmJiBjdXJyU2VsZWN0aW9uSW5kZXhfID09IHNlbGVjdGVkUm93SW5kZXgpCi0JCXsKLQkJICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVfLmdldEl0ZW0oc2VsZWN0ZWRSb3dJbmRleCk7Ci0JCSAgaW50IHNlbGVjdGVkQ29sdW1uSW5kZXggPSBnZXRTZWxlY3RlZENvbHVtbih0YWJsZUl0ZW0sIGUueCwgZS55KTsKLQkJICBpZiAoc2VsZWN0ZWRDb2x1bW5JbmRleCAhPSAtMSAmJiAodGV4dF8gPT0gbnVsbCB8fCB0ZXh0Xy5pc0Rpc3Bvc2VkKCkgfHwgc2VsZWN0ZWRDb2x1bW5JbmRleCAhPSBlZGl0b3JfLmdldENvbHVtbigpKSkKLQkJCWVkaXRTZWxlY3Rpb24oc2VsZWN0ZWRSb3dJbmRleCwgc2VsZWN0ZWRDb2x1bW5JbmRleCk7Ci0JCX0KLQkJY3VyclNlbGVjdGlvbkluZGV4XyA9IHNlbGVjdGVkUm93SW5kZXg7Ci0JICB9Ci0JfQotCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpCi0JewotCX0KLQotCXByaXZhdGUgaW50IGdldFNlbGVjdGVkUm93KFRhYmxlIHRhYmxlLCBpbnQgeSkKLQl7Ci0JICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykKLQkgIHsKLQkJUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IHRhYmxlSXRlbXNbaV0uZ2V0Qm91bmRzKDApOwotCQlpZiAocmVjdGFuZ2xlICE9IG51bGwgJiYgeSA+PSByZWN0YW5nbGUueSAmJiB5IDwgKHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCkpCi0JCSAgcmV0dXJuIGk7Ci0JICB9Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0U2VsZWN0ZWRDb2x1bW4oVGFibGVJdGVtIHRhYmxlSXRlbSwgaW50IHgsIGludCB5KQotCXsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspCi0JICB7Ci0JCWlmICh0YWJsZUl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHgsIHkpKQotCQkgIHJldHVybiBpOwotCSAgfQotCSAgcmV0dXJuIC0xOwotCX0KLQotCXByaXZhdGUgdm9pZCBlZGl0U2VsZWN0aW9uKGludCByb3csIGludCBjb2x1bW4pCi0JewotICAgICAgICAgZWRpdFJvd18gPSByb3c7Ci0gICAgICAgICBlZGl0Q29sdW1uXyA9IGNvbHVtbjsKLQkgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZV8uZ2V0SXRlbShyb3cpOwotCSAgLy8gU2V0dXAgYWRhcHRlciBmb3IgdGhlIG5ldyBzZWxlY3Rpb24KLQkgIHRleHRfID0gbmV3IFRleHQodGFibGVfLCBTV1QuTk9ORSk7Ci0JICBTdHJpbmcgdGV4dCA9IHRhYmxlSXRlbS5nZXRUZXh0KGNvbHVtbik7Ci0JICB0ZXh0Xy5zZXRUZXh0KCh0ZXh0ICE9IG51bGwpID8gdGV4dCA6ICIiKTsKLSAgICAgICAgIHRleHRfLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgLy8gRXNjCi0gICAgICAgICAgICAgICBpZiAoKChpbnQpZS5jaGFyYWN0ZXIpID09IDI3KQotICAgICAgICAgICAgICAgICBjYW5jZWxTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICApOwotICAgICAgICAgdGV4dF8uYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpCi0gICAgICAgICAgICAgICAgIHRyYXZlcnNlVGFiTmV4dCgpOwotICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykKLSAgICAgICAgICAgICAgICAgdHJhdmVyc2VUYWJQcmV2aW91cygpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgKTsKLQkgIGVkaXRvcl8uc2V0RWRpdG9yKHRleHRfLCB0YWJsZUl0ZW0sIGNvbHVtbik7Ci0JICB0ZXh0Xy5zZXRGb2N1cygpOwotCSAgdGV4dF8uc2VsZWN0QWxsKCk7Ci0JfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUYWJOZXh0KCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaWYgKCEoZWRpdFJvd18gPT0gdGFibGVfLmdldEl0ZW1zKCkubGVuZ3RoLTEgJiYgZWRpdENvbHVtbl8gPT0gY29sdW1uc18ubGVuZ3RoLTEpKQotICAgICAgewotICAgICAgICBpZiAoZWRpdENvbHVtbl8gPCBjb2x1bW5zXy5sZW5ndGgtMSkKLSAgICAgICAgICBlZGl0Q29sdW1uXysrOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0Q29sdW1uXyA9IDA7Ci0gICAgICAgICAgZWRpdFJvd18rKzsKLSAgICAgICAgICB0YWJsZV8uc2VsZWN0KGVkaXRSb3dfKTsKLSAgICAgICAgfQotICAgICAgICBlZGl0U2VsZWN0aW9uKGVkaXRSb3dfLCBlZGl0Q29sdW1uXyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUYWJQcmV2aW91cygpCi0gICAgewotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIGlmICghKGVkaXRSb3dfID09IDAgJiYgZWRpdENvbHVtbl8gPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0Q29sdW1uXyA+IDApCi0gICAgICAgICAgZWRpdENvbHVtbl8tLTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdENvbHVtbl8gPSBjb2x1bW5zXy5sZW5ndGgtMTsKLSAgICAgICAgICBlZGl0Um93Xy0tOwotICAgICAgICAgIHRhYmxlXy5zZWxlY3QoZWRpdFJvd18pOwotICAgICAgICB9Ci0gICAgICAgIGVkaXRTZWxlY3Rpb24oZWRpdFJvd18sIGVkaXRDb2x1bW5fKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgZWRpdFNlbGVjdGlvbigpCi0JewotCSAgaW50IHNlbGVjdGVkUm93SW5kZXggPSB0YWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkgIGlmIChzZWxlY3RlZFJvd0luZGV4ICE9IC0xICYmIGNvbHVtbnNfLmxlbmd0aCA+IDApCi0JICB7Ci0JCS8vIHJlZnJlc2ggdGFibGUKLQkJaW50ZXJuYWxSZWZyZXNoKCk7Ci0JCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQlpbnRlcm5hbERpc3Bvc2UoKTsKLQkJZWRpdFNlbGVjdGlvbihzZWxlY3RlZFJvd0luZGV4LCAwKTsKLQkgIH0KLQkgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSBzZWxlY3RlZFJvd0luZGV4OwotCX0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0JewotCSAgdGFibGVWaWV3ZXJfLmFkZChnZXRFbGVtZW50cyhuZXdJbnB1dCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotCXsKLQkgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KQotCSAgewotCQlMaXN0IGxpc3QgPSAoTGlzdClpbnB1dEVsZW1lbnQ7Ci0JCU9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKQotCQkgIG9iamVjdHNbaV0gPSBsaXN0LmdldChpKTsKLQkJcmV0dXJuIG9iamVjdHM7Ci0JICB9Ci0JICBlbHNlCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCXsKLQkgIHJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotCXsKLQkJcmV0dXJuICgoU3RyaW5nW10pZWxlbWVudClbY29sdW1uSW5kZXhdOwkgIAkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLQl7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLQl7Ci0JfQotICB9Ci0gfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MDFiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWwuRGlhbG9nV1dXQXV0aGVudGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5LldlYlNlcnZpY2VzUGFyc2VyRXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbmRpdGlvbgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSTsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotICBwcml2YXRlIFN0cmluZyBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBuZWVkV1NETFNlbGVjdGlvblRyZWVXaWRnZXQ7Ci0gIAotICBwdWJsaWMgV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQoKQotICB7Ci0gICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgCWlmICh3ZWJTZXJ2aWNlc1BhcnNlciA9PSBudWxsKQotICAJICB3ZWJTZXJ2aWNlc1BhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAJcmV0dXJuIHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAluZWVkV1NETFNlbGVjdGlvblRyZWVXaWRnZXQgPSBmYWxzZTsKLSAgCVdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlciA9IGdldFdlYlNlcnZpY2VzUGFyc2VyKCk7Ci0gIAlwYXJzZXIuc2V0VVJJKHdlYlNlcnZpY2VVUkkpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHBhcnNlci5wYXJzZShXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9XU0lMIHwgV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfRElTQ08gfCBXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9MSU5LUyk7Ci0gICAgfQotICAgIGNhdGNoIChXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB3d3dhZSkKLSAgICB7Ci0gICAgICBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbiBkaWFsb2cgPSBuZXcgRGlhbG9nV1dXQXV0aGVudGljYXRpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLSAgICAgIGRpYWxvZy5oYW5kbGVXV1dBdXRoZW50aWNhdGlvbih3d3dhZSk7Ci0gICAgICBTdHJpbmcgdXNlcm5hbWUgPSBkaWFsb2cuZ2V0VXNlcm5hbWUoKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IGRpYWxvZy5nZXRQYXNzd29yZCgpOwotICAgICAgaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gdXNlcm5hbWU7Ci0gICAgICBodHRwQmFzaWNBdXRoUGFzc3dvcmQgPSBwYXNzd29yZDsKLSAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsICYmIHBhc3N3b3JkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBhcnNlci5zZXRIVFRQQmFzaWNBdXRoVXNlcm5hbWUodXNlcm5hbWUpOwotICAgICAgICBwYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKHBhc3N3b3JkKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBwYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfV1NJTCB8IFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX0RJU0NPIHwgV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfTElOS1MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VSSV9OT1RfUkVTT0xWQUJMRSIsIG5ldyBPYmplY3RbXSB7d2ViU2VydmljZVVSSX0pLCBTdGF0dXMuRVJST1IsIHQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIHBhcnNlci5zZXRIVFRQQmFzaWNBdXRoVXNlcm5hbWUobnVsbCk7Ci0gICAgICAgICAgcGFyc2VyLnNldEhUVFBCYXNpY0F1dGhQYXNzd29yZChudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVVJJX05PVF9SRVNPTFZBQkxFIiwgbmV3IE9iamVjdFtdIHt3ZWJTZXJ2aWNlVVJJfSksIFN0YXR1cy5FUlJPUiwgdCk7Ci0gICAgfQotICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NFbnRpdHkgPSBwYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdlYlNlcnZpY2VVUkkpOwotICAgIGlmICh3c0VudGl0eSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCB0eXBlID0gd3NFbnRpdHkuZ2V0VHlwZSgpOwotICAgICAgaWYgKHR5cGUgIT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpCi0gICAgICAJbmVlZFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmVlZFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVVJJKCkKLSAgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlVVJJOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVVSSShTdHJpbmcgd2ViU2VydmljZVVSSSkKLSAgewotICAgIHRoaXMud2ViU2VydmljZVVSSSA9IHdlYlNlcnZpY2VVUkk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0V2ViU2VydmljZVVSSSgpOwotICB9Ci0vKioKLSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaHR0cEJhc2ljQXV0aFBhc3N3b3JkLgotICovCi1wdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhQYXNzd29yZCgpIHsKLQlyZXR1cm4gaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotfQotLyoqCi0gKiBAcmV0dXJuIFJldHVybnMgdGhlIGh0dHBCYXNpY0F1dGhVc2VybmFtZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUoKSB7Ci0JcmV0dXJuIGh0dHBCYXNpY0F1dGhVc2VybmFtZTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjU1YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICBwcml2YXRlIFN0cmluZyB3c2RsVVJJOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNvbXBvbmVudE5hbWU7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gdGVzdFNlcnZpY2U7Ci0gIAotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKSB7Ci0gICAgcmV0dXJuIHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKGJvb2xlYW4gdGVzdFNlcnZpY2UpIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwcm9qZWN0LgotICAgKi8KLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHByb2plY3Q7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QKLSAgICogICAgICAgICAgVGhlIHByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLSAgfQotICAKLSAgCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBvbmVudE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnROYW1lKFN0cmluZyBjb21wb25lbnROYW1lKQotICB7Ci0gICAgdGhpcy5jb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgICB0aGlzLndzZGxVUkkgPSB3c2RsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VzUGFyc2VyICE9IG51bGwpCi0gICAgICByZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucGx1Z2luIiwgdGhpcyk7ICAgIAotICAgIGlmICh3c2RsVVJJICE9IG51bGwgJiYgZ2V0V2ViU2VydmljZXNQYXJzZXIoKS5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKSAhPSBudWxsKSB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7ICAgICAKLSAgICAgIE1hcCBzZXJ2aWNlcyA9IGdldFdlYlNlcnZpY2VzUGFyc2VyKCkuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSkuZ2V0U2VydmljZXMoKTsKLSAgICAgIGlmIChzZXJ2aWNlcy5pc0VtcHR5KCkpewotICAgICAgICBpZiAodGVzdFNlcnZpY2U9PXRydWUpewotICAgICAgICAgICAgdGVzdFNlcnZpY2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19XQVJOSU5HX05PX1NFUlZJQ0VfRUxFTUVOVCIpLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICAgICAgICB0cnl7Ci0gICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0gICAgICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfV0FSTklOR19OT19TRVJWSUNFX0VMRU1FTlQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX01TR19TRUxFQ1RJT05fTVVTVF9CRV9XU0RMIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uVHJlZVdpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25UcmVlV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDhhYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25UcmVlV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLS8qKgotKiBUaGlzIHdpemFyZCBwYWdlIGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIFdTREwgVVJJIGZvciBjb25zdW1wdGlvbgotKi8KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotICAvKkNPTlRFWFRfSUQgUFdXUzAwMDEgZm9yIHRoZSBXU0RMIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QV1dTX1BBR0UgPSAiLlBXV1MwMDAxIjsKLQotICAvKkNPTlRFWFRfSUQgUFdXUzAwMDIgZm9yIHRoZSBXU0RMIERvY3VtZW50IHRleHQgZmllbGQgb2YgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BXV1NfVEVYVF9XU0RMID0gIi5QV1dTMDAwMiI7Ci0KLSAgLypDT05URVhUX0lEIFBXV1MwMDAzIGZvciB0aGUgV1NETCBSZXNvdXJjZSBCcm93c2UgYnV0dG9uIG9mIHRoZSBXU0RMIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QV1dTX0JVVFRPTl9CUk9XU0VfV1NETCA9ICIuUFdXUzAwMDMiOwotCi0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgU3RyaW5nIHdlYlNlcnZpY2VVUkk7Ci0gIAotICBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0gIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0gIHByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyXzsKLSAgcHJpdmF0ZSBUcmVlQ29udGVudFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXI7Ci0gIHByaXZhdGUgVHJlZSB0cmVlXzsKLSAgcHJpdmF0ZSBpbnQgcGFnZVdpZHRoXzsKLQotICAvKioKLSAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAqLwotICBwdWJsaWMgV1NETFNlbGVjdGlvblRyZWVXaWRnZXQoKQotICB7Ci0gICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gIAl0aGlzLnN0YXR1c0xpc3RlbmVyID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXV1NfUEFHRSIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgcGx1Z2luSWRfICsgSU5GT1BPUF9QV1dTX1BBR0UpOwotCi0gICAgTGFiZWwgd3NkbExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotICAgIHdzZGxMYWJlbC5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9TRUxFQ1RfV1NETCIpKTsKLSAgICB3c2RsTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICB0cmVlXyA9IG5ldyBUcmVlKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IDIwMDsKLSAgICB0cmVlXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBwYWdlV2lkdGhfID0gdHJlZV8uZ2V0U2hlbGwoKS5nZXRTaXplKCkueDsKLSAgICB0cmVlVmlld2VyXyA9IG5ldyBUcmVlVmlld2VyKHRyZWVfKTsKLSAgICB0cmVlQ29udGVudFByb3ZpZGVyID0gbmV3IFRyZWVDb250ZW50UHJvdmlkZXIoKTsKLSAgICB0cmVlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIodHJlZUNvbnRlbnRQcm92aWRlcik7Ci0gICAgdHJlZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcihuZXcgVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgdHJlZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICAgICAgewotICAgICAgICAJaGFuZGxlVHJlZVNlbGVjdGlvbkNoYW5nZWRFdmVudChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlVHJlZVNlbGVjdGlvbkNoYW5nZWRFdmVudChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgCXN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG5ldyBFdmVudCgpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2ViU2VydmljZXNQYXJzZXIuCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gIAlyZXR1cm4gd2ViU2VydmljZXNQYXJzZXI7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB3ZWJTZXJ2aWNlc1BhcnNlciBUaGUgd2ViU2VydmljZXNQYXJzZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXIpCi0gIHsKLSAgCXRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgCXRyZWVWaWV3ZXJfLnNldElucHV0KHRoaXMud2ViU2VydmljZXNQYXJzZXIpOwotICAJcmVmcmVzaFRyZWVWaWV3ZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VVUkkoU3RyaW5nIHdzVVJJKQotICB7Ci0gIAl3ZWJTZXJ2aWNlVVJJID0gd3NVUkk7Ci0gIAl0cmVlQ29udGVudFByb3ZpZGVyLnNldFdlYlNlcnZpY2VVUkkod2ViU2VydmljZVVSSSk7Ci0gICAgcmVmcmVzaFRyZWVWaWV3ZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hUcmVlVmlld2VyKCkKLSAgewotICAJaWYgKHdlYlNlcnZpY2VzUGFyc2VyICE9IG51bGwgJiYgd2ViU2VydmljZVVSSSAhPSBudWxsKQotICAJewotICAJICB0cmVlVmlld2VyXy5yZWZyZXNoKCk7Ci0gIAkgIENvbnRyb2wgc2hlbGwgPSB0cmVlXy5nZXRTaGVsbCgpOwotICAJICBpZiAodHJlZV8uZ2V0U2l6ZSgpLnggPiBwYWdlV2lkdGhfIHx8IHNoZWxsLmdldFNpemUoKS54ID4gcGFnZVdpZHRoXykKLSAgCSAgewotICAJICAgIHRyZWVfLnNldFNpemUocGFnZVdpZHRoXywgdHJlZV8uZ2V0U2l6ZSgpLnkpOwotICAJICAgIHNoZWxsLnNldFNpemUocGFnZVdpZHRoXywgc2hlbGwuZ2V0U2l6ZSgpLnkpOwotICAJICAgIHNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gIAkgICAgc2hlbGwucmVkcmF3KCk7Ci0gIAkgIH0KLSAgCX0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gIHsKLSAgICB0cmVlXy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIHRyZWVfLmlzRW5hYmxlZCgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVUkkoKQotICB7Ci0gIAlXZWJTZXJ2aWNlRW50aXR5IGVudGl0eSA9IGdldFNlbGVjdGlvbkFzV2ViU2VydmljZUVudGl0eSgpOwotICAJaWYgKGVudGl0eSAhPSBudWxsKQotICAJICByZXR1cm4gZW50aXR5LmdldFVSSSgpOwotICAJZWxzZQotICAJICByZXR1cm4gd2ViU2VydmljZVVSSTsKLSAgfQotICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlRW50aXR5IGdldFNlbGVjdGlvbkFzV2ViU2VydmljZUVudGl0eSgpCi0gIHsKLSAgCWlmICh0cmVlVmlld2VyXyAhPSBudWxsKQotICAJewotICAgICAgSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmICghc2VsLmlzRW1wdHkoKSAmJiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotICAgICAgewotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbDsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRW50aXR5KQotICAgICAgICAgIHJldHVybiAoV2ViU2VydmljZUVudGl0eSlvYmplY3Q7Ci0gICAgICB9Ci0gIAl9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICBXZWJTZXJ2aWNlRW50aXR5IHdzRW50aXR5ID0gZ2V0U2VsZWN0aW9uQXNXZWJTZXJ2aWNlRW50aXR5KCk7Ci0gICAgaWYgKHdzRW50aXR5ID09IG51bGwgfHwgd3NFbnRpdHkuZ2V0VHlwZSgpICE9IFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0RMKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQQUdFX01TR19TRUxFQ1RJT05fTVVTVF9CRV9XU0RMIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLSAgewotICAJcHJpdmF0ZSBTdHJpbmcgd2ViU2VydmljZVVSSTsKLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlc1BhcnNlcikKLSAgICAgIHsKLSAgICAgIAlXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIgPSAoV2ViU2VydmljZXNQYXJzZXIpaW5wdXRFbGVtZW50OwotICAgICAgICBPYmplY3Qgd3NFbnRpdHkgPSBwYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdlYlNlcnZpY2VVUkkpOwotICAgICAgICBpZiAod3NFbnRpdHkgIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt3c0VudGl0eX07Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpCi0gICAgewotICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBXZWJTZXJ2aWNlRW50aXR5KQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSAoKFdlYlNlcnZpY2VFbnRpdHkpcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbGlzdC5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgb2JqZWN0c1tpXSA9IGxpc3QuZ2V0KGkpOwotICAgICAgICByZXR1cm4gb2JqZWN0czsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViU2VydmljZUVudGl0eSkKLSAgICAgICAgcmV0dXJuICgoV2ViU2VydmljZUVudGl0eSllbGVtZW50KS5nZXRQYXJlbnQoKTsKLSAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VVUkkoU3RyaW5nIHdzVVJJKQotICAgIHsKLSAgICAgIHdlYlNlcnZpY2VVUkkgPSB3c1VSSTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCgoV2ViU2VydmljZUVudGl0eSllbGVtZW50KS5nZXRUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV2ViU2VydmljZUVudGl0eS5UWVBFX0hUTUw6Ci0gICAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd3NpbC9odG1sLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGNhc2UgV2ViU2VydmljZUVudGl0eS5UWVBFX1dTSUw6Ci0gICAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd3NpbC93c2lsLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGNhc2UgV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREw6Ci0gICAgICAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd3NpbC93c2RsLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoKFdlYlNlcnZpY2VFbnRpdHkpZWxlbWVudCkuZ2V0VVJJKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjVjYTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uXzsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVVSSSgpCi0gIHsKLSAgCWlmIChzZWxlY3Rpb25fICE9IG51bGwgJiYgIXNlbGVjdGlvbl8uaXNFbXB0eSgpKQotICAJewotICAJICBPYmplY3QgZmlyc3RTZWwgPSBzZWxlY3Rpb25fLmdldEZpcnN0RWxlbWVudCgpOwotICAJICBpZiAoZmlyc3RTZWwgaW5zdGFuY2VvZiBJRmlsZSkKLSAgCSAgewotICAJICAgIElGaWxlIGlmaWxlID0gKElGaWxlKWZpcnN0U2VsOwotICAJICAgIFN0cmluZyBleHQgPSBpZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gIAkgICAgaWYgKGV4dCAhPSBudWxsICYmIChleHQuZXF1YWxzKCJ3c2RsIikgfHwgZXh0LmVxdWFscygid3NpbCIpIHx8IGV4dC5lcXVhbHMoImh0bWwiKSkpCi0gIAkgICAgewotICAJICAgICAgcmV0dXJuIGlmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCSAgaWYgKGZpcnN0U2VsIGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICB7Ci0gICAgICAgIFNlcnZpY2VJbXBsIHNlcnZpY2VJbXBsID0gKFNlcnZpY2VJbXBsKWZpcnN0U2VsOwotICAgICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoc2VydmljZUltcGwpOwotICAgICAgfQotICAJICBpZiAoZmlyc3RTZWwgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKQotICAgICAgewotICAJICAgIFNlcnZpY2VSZWYgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKWZpcnN0U2VsOwotICAgICAgICByZXR1cm4gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoc2VydmljZVJlZik7Ci0gICAgICB9Ci0gIAkgIGlmIChmaXJzdFNlbCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gIAkgIHsKLSAgCSAgICBXU0RMUmVzb3VyY2VJbXBsIHdzZGxSSSA9IChXU0RMUmVzb3VyY2VJbXBsKWZpcnN0U2VsOwotICAJICAgIHJldHVybiBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSh3c2RsUkkpOwotICAJICB9Ci0gIAkgIGlmIChmaXJzdFNlbCBpbnN0YW5jZW9mIFN0cmluZykKLSAgCSAgICByZXR1cm4gKFN0cmluZylmaXJzdFNlbDsKLSAgCX0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbiggSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotICAgIHNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbldTSUwoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdzaWxVUkkoKQotICB7Ci0gIAlTdHJpbmcgd3NVUkkgPSBnZXRXZWJTZXJ2aWNlVVJJKCk7Ci0gIAlpZiAod3NVUkkgIT0gbnVsbCAmJiB3c1VSSS5sZW5ndGgoKSA+IDAgJiYgd3NVUkkuZW5kc1dpdGgoIndzZGwiKSkKLSAgCXsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIod3NVUkkuc3Vic3RyaW5nKDAsIHdzVVJJLmxlbmd0aCgpLTQpKTsKLSAgICAgIHNiLmFwcGVuZCgid3NpbCIpOwotICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gIAl9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oc2VsZWN0aW9uXyk7Ci0gIAlyZXR1cm4gcDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkKLSAgewotICAgIFN0cmluZyBjbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tSW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb25fKTsKLSAgICByZXR1cm4gY25hbWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb21wb25lbnROYW1lRnJvbUluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgCi0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgICBpZiAocmVzb3VyY2U9PW51bGwpIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgCi0gICAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgaWYgKGNvbXAhPW51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjMzOTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlciBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0KLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICAKLSAgcHJpdmF0ZSBXU0RMU2VsZWN0aW9uV2lkZ2V0IHdzZGxTZWxlY3Rpb25XaWRnZXQ7Ci0gIHByaXZhdGUgU3RyaW5nIHdlYlNlcnZpY2VVUkk7Ci0gIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50TmFtZTsKLSAgCi0gIHB1YmxpYyBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcigpCi0gIHsKLSAgICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIHdzZGxTZWxlY3Rpb25XaWRnZXQgPSBuZXcgV1NETFNlbGVjdGlvbldpZGdldCgpOwotICAgIHdzZGxTZWxlY3Rpb25XaWRnZXQuYWRkQ29udHJvbHMocGFyZW50LCBzdGF0dXNMaXN0ZW5lcik7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiB3c2RsU2VsZWN0aW9uV2lkZ2V0LmdldFN0YXR1cygpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVVJJKFN0cmluZyB3c1VyaSkKLSAgewotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbDsKLSAgICBpZiAod3NVcmkgIT0gbnVsbCkKLSAgICAgIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzVXJpKTsKLSAgICBlbHNlCi0gICAgICBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotICAgIHdzZGxTZWxlY3Rpb25XaWRnZXQuc2V0SW5pdGlhbFNlbGVjdGlvbihzZWwpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VVUkkoKQotICB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsICAgID0gd3NkbFNlbGVjdGlvbldpZGdldC5nZXRPYmplY3RTZWxlY3Rpb24oKTsKLSAgICBPYmplY3QgICAgICAgICAgICAgICBvYmplY3QgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiAob2JqZWN0ICE9IG51bGwgKQotICAgIHsKLSAgICAgIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBXU0RMU2VsZWN0aW9uV3JhcHBlciApCi0gICAgICB7ICAgIAotICAgICAgICAvLyBHZXQgYXQgdGhlIGlubmVyIHN0cnVjdHVyZWQgc2VsZWN0aW9uIG9iamVjdC4KLSAgICAgICAgV1NETFNlbGVjdGlvbldyYXBwZXIgd3JhcHBlciAgICAgICAgPSAoV1NETFNlbGVjdGlvbldyYXBwZXIpb2JqZWN0OwotICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbm5lclNlbGVjdGlvbiA9IHdyYXBwZXIud3NkbFNlbGVjdGlvbjsKLSAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAgaW5uZXJPYmplY3QgICAgPSBpbm5lclNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGlubmVyT2JqZWN0ID09IG51bGwgPyBudWxsIDogaW5uZXJPYmplY3QudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFVSSSgpCi0gIHsKLSAgCXJldHVybiBnZXRXZWJTZXJ2aWNlVVJJKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICByZXR1cm4gd3NkbFNlbGVjdGlvbldpZGdldC5nZXRXZWJTZXJ2aWNlc1BhcnNlcigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAJSVByb2plY3QgcCA9IHdzZGxTZWxlY3Rpb25XaWRnZXQuZ2V0UHJvamVjdCgpOwotICAJaWYgKHA9PW51bGwpCi0gIAl7Ci0gIAkgIHJldHVybiBwcm9qZWN0OwotICAJfQotICAJZWxzZQotICAJICByZXR1cm4gcDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgY25hbWUgPSB3c2RsU2VsZWN0aW9uV2lkZ2V0LmdldENvbXBvbmVudE5hbWUoKTsKLSAgICBpZiAoY25hbWU9PW51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGNvbXBvbmVudE5hbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBjbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudE5hbWUoU3RyaW5nIGNvbXBvbmVudE5hbWUpCi0gIHsKLSAgICB0aGlzLmNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICB9Ci0gIAotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL1dlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0NjIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV2ViU2VydmljZUNsaWVudFR5cGVXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgoteyAgICAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxMyBmb3IgdGhlIFdpemFyZCBTY2VuYXJpbyBDbGllbnQgZ3JvdXAgb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9HUk9VUF9TQ0VOQVJJT19DTElFTlQgPSAiUFdQUjAwMTMiOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDE0IGZvciB0aGUgV2ViIFNlcnZpY2UgQ2xpZW50IFR5cGUgY29tYm8gYm94IG9mIHRoZSBQcm9qZWN0IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ09NQk9fQ0xJRU5UVFlQRSA9ICJQV1BSMDAxNCI7Ci0gIHByaXZhdGUgQ29tYm8gIGNsaWVudFR5cGVDb21ib187Ci0gICAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwNiBmb3IgdGhlIFRlc3QgUHJveHkgY2hlY2sgYm94IG9mIHRoZSBQcm9qZWN0IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfVEVTVF9QUk9YWSA9ICJQV1BSMDAwNiI7Ci0gIHByaXZhdGUgQnV0dG9uIHRlc3RQcm94eUNoZWNrYm94XzsKLSAgCi0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzXzsKLSAgcHJpdmF0ZSBMYWJlbHNBbmRJZHMgICAgICBsYWJlbElkc187Ci0gICAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNhZGRDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyKQotICAgKi8KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdXRpbHMgICAgPSBuZXcgVUlVdGlscyggbXNnVXRpbHMsIHBsdWdpbklkICk7Ci0gIAkKLSAgICBHcm91cCBjbGllbnRHcm91cCA9IHV0aWxzLmNyZWF0ZUdyb3VwKCBwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUk9VUF9TQ0VOQVJJT19DTElFTlQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfR1JPVVBfU0NFTkFSSU9fQ0xJRU5UIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0dST1VQX1NDRU5BUklPX0NMSUVOVCwKLQkJCQkJCQkJCQkgICAyLCAxMCwgMTAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgIGludCBjb21ib1N0eWxlID0gU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZOwotICAgIGNsaWVudFR5cGVDb21ib18gPSB1dGlscy5jcmVhdGVDb21ibyggY2xpZW50R3JvdXAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBQkVMX1dFQlNFUlZJQ0VDTElFTlRUWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ09NQk9fQ0xJRU5UVFlQRSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NPTUJPX0NMSUVOVFRZUEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYm9TdHlsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0KCBib29sZWFuIGVuYWJsZSApCi0gIHsKLSAgICBjbGllbnRUeXBlQ29tYm9fLnNldEVuYWJsZWQoIGVuYWJsZSApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLQkJLy8gcnNrcmVnCi0gICAgLy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ICAgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgLy9MYWJlbHNBbmRJZHMgICAgICAgICAgICAgICAgIGxhYmVsSWRzICAgPSByZWdpc3RyeS5nZXRDbGllbnRUeXBlTGFiZWxzKCk7Ci0JCUxhYmVsc0FuZElkcyAgICAgICAgICAgICAgICAgbGFiZWxJZHMgICA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0Q2xpZW50VHlwZUxhYmVscygpOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICA9IDA7Ci0gICAgU3RyaW5nW10gICAgICAgICAgICAgICAgICAgICBjbGllbnRJZHMgID0gbGFiZWxJZHMuZ2V0SWRzXygpOwotICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJZCA9IGlkcy5nZXRUeXBlSWQoKTsKLSAgICAKLQkJLy8gcnNrcmVnCi0gICAgY2xpZW50VHlwZUNvbWJvXy5zZXRJdGVtcyggbGFiZWxJZHMuZ2V0TGFiZWxzXygpICk7Ci0gICAgCi0gICAgLy8gTm93IGZpbmQgdGhlIHNlbGVjdGVkIG9uZS4KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2xpZW50SWRzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgaWYoIHNlbGVjdGVkSWQuZXF1YWxzKCBjbGllbnRJZHNbaW5kZXggXSkgKQotICAgICAgewotICAgICAgICBzZWxlY3Rpb24gPSBpbmRleDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGNsaWVudFR5cGVDb21ib18uc2VsZWN0KCBzZWxlY3Rpb24gKTsKLSAgICBpZHNfICAgICAgPSBpZHM7ICAKLSAgICBsYWJlbElkc18gPSBsYWJlbElkczsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIGludCBzZWxlY3Rpb25JbmRleCA9IGNsaWVudFR5cGVDb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAKLSAgICBpZHNfLnNldFR5cGVJZCggbGFiZWxJZHNfLmdldElkc18oKVtzZWxlY3Rpb25JbmRleF0gKTsKLSAgICAKLSAgICByZXR1cm4gaWRzXzsgIAotICB9Ci0gICAgICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9DbGllbnRXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9DbGllbnRXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWY4YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ2xpZW50V2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkdldE1vbml0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkNoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uRmluaXNoRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbi5DbGllbnRSb290RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmV4dGVuc2lvbi5QcmVDbGllbnREZXZlbG9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRXaXphcmRXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLkNsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5BZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkNsaWVudFRlc3RXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hEZWZhdWx0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaEphdmFUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5GaW5pc2hUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5UZXN0RGVmYXVsdGluZ0ZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuQXNzZW1ibGVDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5EZXBsb3lDbGllbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5EZXZlbG9wQ2xpZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuSW5zdGFsbENsaWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLlJ1bkNsaWVudEZyYWdtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudFJvb3RDb21tYW5kRnJhZ21lbnQoKTsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyA9IGRhdGFSZWdpc3RyeTsKLSAgICAKLSAgICAvLyBCZWZvcmUgQ2xpZW50V2l6YXJkV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzICk7Ci0gICAgCi0gICAgLy8gQWZ0ZXIgQ2xpZW50V2l6YXJkV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0LmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAgICAgICAKLSAgICAvLyBCZWZvcmUgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiSjJFRVZlcnNpb24iLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50TmFtZSIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhckNvbXBvbmVudE5hbWUiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywiTmVlZEVBUiIsbnVsbCk7Ci0gICAgCi0gICAgLy8gQWZ0ZXIgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiSjJFRVZlcnNpb24iLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudENvbXBvbmVudE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudEVhckNvbXBvbmVudE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudENvbXBvbmVudFR5cGUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gVGhlIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQgY2FuIGNvbnRyb2wgd2hhdCBjbGllbnQgZXh0ZW5zaW9uIGNvbWVzIHVwLgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBCZWZvcmUgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlVVJJIiwgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MgKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDb21wb25lbnROYW1lIiwgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIuY2xhc3MgKTsKLSAgICAKLSAgICAvLyBBZnRlciBXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlcgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmNsYXNzLCAiV3NkbFVSSSIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXRXcmFwcGVyLmNsYXNzLCAiUHJvamVjdCIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlci5jbGFzcywgIkNvbXBvbmVudE5hbWUiLCBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAgIAotICAgIC8vIEJlZm9yZSBDbGllbnQgVGVzdCB3aWRnZXQuCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0KLSAgICAvLyBBZnRlciB0aGUgY2xpZW50IHRlc3Qgd2lkZ2V0ICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlTWV0aG9kcyIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RTZXJ2aWNlIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0SUQiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIklzVGVzdFdpZGdldCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeV8gPSB3aWRnZXRSZWdpc3RyeTsKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJDbGllbnRXaXphcmRXaWRnZXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfUFJPSkVDVCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1BST0pFQ1QiKSwKLQkJCQkgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotCQkJCSAgICAgICAgewotCQkJCSAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJCQkgICAgICAgICAgewotCQkJCSAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50V2l6YXJkV2lkZ2V0KCk7Ci0JCQkJICAgICAgICAgIH0KLQkJCQkgICAgICAgIH0gKTsKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTiIpLAotCQkJCQkJbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJCQkgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkJCQkJICB7Ci0JCQkJCQkgICAgcmV0dXJuIG5ldyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0KCk7Ci0JCQkJCQkgIH0KLQkJCQkJCX0gKTsKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJXU0RMU2VsZWN0aW9uV2lkZ2V0V3JhcHBlciIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19TRUxFQ1RJT04iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19TRUxFQ1RJT04iKSwKLQkJICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJICAgICAgICAgICAgICAgICAgewotCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIoKTsKLQkJICAgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgfSApOwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIkNsaWVudFRlc3RXaWRnZXQiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfU0FNUExFIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfU0FNUExFIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudFRlc3RXaWRnZXQoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBJbml0Q2xpZW50UmVnaXN0cnkgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0gIHsgIAotICAgIHByaXZhdGUgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBjbGllbnRSZWdpc3RyeV8gPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNleGVjdXRlKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICAgIHsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyApOwotICAgICAgY2xpZW50UmVnaXN0cnlfLnNldFdpZGdldFJlZ2lzdHJ5KCB3aWRnZXRSZWdpc3RyeV8gKTsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXRDYW5GaW5pc2hSZWdpc3RyeSggY2FuRmluaXNoUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBDbGllbnRSb290Q29tbWFuZEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotICB7Ci0gICAgcHVibGljIENsaWVudFJvb3RDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIC8vYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDaGVja0Zvck1pc3NpbmdGaWxlcygpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFdpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgSW5pdENsaWVudFJlZ2lzdHJ5KCksICIiICkpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJDbGllbnRXaXphcmRXaWRnZXQiICkgKTsKLQkgIC8vYWRkKCBuZXcgVGVzdENvbW1hbmRGYWN0b3J5RnJhZ21lbnQoKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiV1NETFNlbGVjdGlvbldpZGdldFdyYXBwZXIiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0JICAvL2FkZCggbmV3IFRlc3RDb21tYW5kRmFjdG9yeUZyYWdtZW50MigpICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIkNsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQiICkgKTsKLSAgICAgIC8vYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCggdHJ1ZSApLCAiIikpOwotICAgICAgLy9hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZChmYWxzZSksICIiKSk7IC8vTm90ZTogYWRkZWQgaGVyZSBmb3IgY2xpZW50ICAgICAgCi0gICAgICAvL2FkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQoKSwgIiIpKTsgIAotICAgICAgLy9hZGQoIG5ldyBDbGllbnRFeHRlbnNpb25GcmFnbWVudCgpICk7Ci0JICBhZGQoIG5ldyBDbGllbnRSb290RnJhZ21lbnQoKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kKCksICIiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KG5ldyBHZXRNb25pdG9yQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFRlc3REZWZhdWx0aW5nRnJhZ21lbnQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50VGVzdEZyYWdtZW50KCAiQ2xpZW50VGVzdFdpZGdldCIpICk7IAotICAgICAgYWRkKG5ldyBGaW5pc2hGcmFnbWVudCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgICB7Ci0gICAgICAvL01hcCBTZWxlY3Rpb25Db21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkluaXRpYWxJbml0aWFsU2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7ICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIEdldE1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhckNvbXBvbmVudE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50VHlwZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDaGVja0ZvclNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5XU0lMIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NpbFVSSSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VVUkkiLCBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBuZXcgRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNvbXBvbmVudE5hbWUiLCBXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VzUGFyc2VyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgR2V0TW9uaXRvckNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIEdldE1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEluaXRpYWxQcm9qZWN0IiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJDb21wb25lbnROYW1lIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbENvbXBvbmVudE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgQ2hlY2tGb3JTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIENoZWNrRm9yU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIAotICAgICAgLy9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQgZm9yIGNsaWVudCAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJTYW1wbGVTZXJ2ZXJUeXBlSUQiLCBudWxsKTsKLQkgIAotCSAgLy8gU2V0dXAgdGhlIFByZUNsaWVudERldmVsb3BDb21tYW5kLgotCQkJLy8KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MpOwkJCQkJCQotCQkJLy8KLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlVHlwZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgbnVsbCApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0JICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyApOwotICAgICAgCi0JCQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VDbGllbnQiLCBudWxsICk7Ci0JCQkKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3RFQVIiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZSIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdFR5cGVJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlNlcnZlckZhY3RvcnlJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiSjJFRVZlcnNpb24iLCBudWxsKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiTmVlZEVBUiIsIG51bGwpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkNsaWVudElkcyIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKMmVlVmVyc2lvbiIsIG51bGwpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyApOyAgICAgCi0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm94eUJlYW4iLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaEphdmFUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIlNldEVuZHBvaW50TWV0aG9kIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmVySW5zdGFuY2VJZCIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzKTsKLQkgIAotICAgICAgLy8gR2V0TW9uaXRvckNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEdldE1vbml0b3JDb21tYW5kLmNsYXNzLCAiRW5kcG9pbnRzIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAgIC8vIE1BUCBwb3N0IHNlcnZlciBjb25maWcgY2FsbCAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkVhclByb2plY3ROYW1lIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlckluc3RhbmNlIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiU2FtcGxlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlckluc3RJZCIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJBZGRlZFByb2plY3RUb1NlcnZlciIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiU2FtcGxlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLSAgICAgIAotICAgICAgLy8gTWFwIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlByb3h5QmVhbiIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiVGVzdEZhY2lsaXR5IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUnVuQ2xpZW50VGVzdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy9NYXBwaW5ncyB0byBlbmFibGUgcGVlay1haGVhZCBmb3IgUGFnZSAzIG9mIHRoZSBjbGllbnQgd2l6YXJkCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIERldmVsb3BDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzLCAiUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgRGV2ZWxvcENsaWVudEZyYWdtZW50LmNsYXNzLCAiTW9kdWxlIiwgbnVsbCApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXJQcm9qZWN0IiwgbnVsbCApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhckNvbXBvbmVudE5hbWUiLCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJQcm9qZWN0IiwgbnVsbCApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudENvbXBvbmVudE5hbWUiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzLCAiTW9kdWxlIiwgbnVsbCApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBBc3NlbWJsZUNsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgQXNzZW1ibGVDbGllbnRGcmFnbWVudC5jbGFzcywgIkVhciIsIG51bGwgKTsKLSAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBEZXBsb3lDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzLCAiUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIERlcGxveUNsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgRGVwbG95Q2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIEluc3RhbGxDbGllbnRGcmFnbWVudC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3ROYW1lIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzLCAiUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgSW5zdGFsbENsaWVudEZyYWdtZW50LmNsYXNzLCAiTW9kdWxlIiwgbnVsbCApOyAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyUHJvamVjdE5hbWUiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXJQcm9qZWN0IiwgbnVsbCApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhckNvbXBvbmVudE5hbWUiLCBJbnN0YWxsQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MgKTsgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzLCAiUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7ICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIFJ1bkNsaWVudEZyYWdtZW50LmNsYXNzLCAiRWFyUHJvamVjdCIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgUnVuQ2xpZW50RnJhZ21lbnQuY2xhc3MsICJFYXIiLCBudWxsICk7ICAgICAgCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ0NsaWVudEhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzJhZTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ0NsaWVudEhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5PcGVuSmF2YUVkaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLS8qKgotICogCi0gKiBIYW5kbGVyIENvbmZpZ3VyYXRpb24gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdDbGllbnRIYW5kbGVyc1dpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZyB7Ci0gIAotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpIHsKLQotICAgIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgd2lkZ2V0UmVnaXN0cnlfID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0IiwgCi0gICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfQ0xJRU5UX0hETFJfQ09ORklHIiksIAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfQ0xJRU5UX0hETFJfQ09ORklHIiksIAotICAgICAgICBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotCi0gICAgICAJcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgIAkgIHJldHVybiBuZXcgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCgpOwotICAgICAgCX0KLSAgICB9KTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gZGF0YVJlZ2lzdHJ5OwotICAgIAotICAgIAotLy8gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiQWxsSGFuZGxlcnMiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJIYW5kbGVycyIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIldzUmVmc1RvSGFuZGxlcnMiLCBudWxsKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIlNlcnZpY2VSZWZOYW1lIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiUmVmTmFtZVRvU2VydmljZVJlZiIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiQWxsSGFuZGxlcnNMaXN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJXc1JlZnNUb0hhbmRsZXJzIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCJIYW5kbGVyc1RhYmxlIixudWxsKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiT3V0cHV0TG9jYXRpb24iLG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkhhbmRsZXJDbGFzc05hbWVzIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJIYW5kbGVyTmFtZXMiLG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIlByb2plY3QiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywiQ2xhc3NOYW1lcyIsIE9wZW5KYXZhRWRpdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIHsKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSBjYW5GaW5pc2hSZWdpc3RyeTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKSB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCgpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIENsaWVudEhhbmRsZXJzQ29uZmlnQ29tbWFuZEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudHsKLSAgIAotICAgIHB1YmxpYyBDbGllbnRIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCgpCi0gICAgewotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiICkpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0IiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpLCAiIikpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzQ2xpZW50UmVzb3VyY2UiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiV3NTZXJ2aWNlUmVmcyIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJDbGllbnRQcm9qZWN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICB9Ci0gCi0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdTZXJ2aWNlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9Db25maWdTZXJ2aWNlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZWViZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlnU2VydmljZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLkdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbWFuZC5PcGVuSmF2YUVkaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLS8qKgotICogCi0gKiBIYW5kbGVyIENvbmZpZ3VyYXRpb24gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdTZXJ2aWNlSGFuZGxlcnNXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcgewotICAKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KSB7Ci0KLSAgICBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQiLCAKLSAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9TRVJWSUNFX0hETFJfQ09ORklHIiksIAotICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfU0VSVklDRV9IRExSX0NPTkZJRyIpLCAKLSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLQotICAgICAgCXB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAJICByZXR1cm4gbmV3IENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0KCk7Ci0gICAgICAJfQotICAgIH0pOwotCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeV8gPSBkYXRhUmVnaXN0cnk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzUmVmc1RvSGFuZGxlcnMiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiU291cmNlT3V0cHV0TG9jYXRpb24iLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIlNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaiIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiRGVzY3JpcHRpb25OYW1lIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCJIYW5kbGVyc0xpc3QiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiV3NEZXNjVG9IYW5kbGVycyIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTZXJ2aWNlRGVzY05hbWVUb0Rlc2NPYmoiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiU291cmNlT3V0cHV0TG9jYXRpb24iLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIk91dHB1dExvY2F0aW9uIixudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywiSGFuZGxlckNsYXNzTmFtZXMiLCBHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIkhhbmRsZXJOYW1lcyIsbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsIkdlblNrZWxldG9uRW5hYmxlZCIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7Ci0gCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCJQcm9qZWN0IiwgT3BlbkphdmFFZGl0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhHZW5lcmF0ZUhhbmRsZXJTa2VsZXRvbkNvbW1hbmQuY2xhc3MsIkNsYXNzTmFtZXMiLCBPcGVuSmF2YUVkaXRvckNvbW1hbmQuY2xhc3MpOwotICAgCi0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIHsKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSBjYW5GaW5pc2hSZWdpc3RyeTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKSB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlSGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBTZXJ2aWNlSGFuZGxlcnNDb25maWdDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50ewotICAgCi0gICAgcHVibGljIFNlcnZpY2VIYW5kbGVyc0NvbmZpZ0NvbW1hbmRGcmFnbWVudCgpCi0gICAgewotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCAiQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IE9wZW5KYXZhRWRpdG9yQ29tbWFuZCgpLCAiIikpOwotCi0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkZFJlc291cmNlIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIAotICAgIH0KLSAKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0NvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlndXJlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjVkOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvQ29uZmlndXJlSGFuZGxlcnNXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5TZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5TZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIENvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nIHsKLQotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLQotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5XzsKLQotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeV87Ci0KLSAgcHVibGljIENvbmZpZ3VyZUhhbmRsZXJzV2lkZ2V0QmluZGluZygpIHsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpIHsKLQotICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFuZGxlcnNDb21tYW5kRnJhZ21lbnQoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpLAotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gZGF0YVJlZ2lzdHJ5OwotCi0gICAgLy8gTWFwIGNsaWVudC1zaWRlIHdpZGdldHMgdG8gY29tbWFuZHMKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSGFuZGxlcnMiLCBDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiV3NSZWZzVG9IYW5kbGVycyIsIG51bGwpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlblNrZWxldG9uRW5hYmxlZCIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUmVmTmFtZSIsIENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZWZOYW1lVG9TZXJ2aWNlUmVmIiwgQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdDbGllbnRIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiV3NSZWZzVG9IYW5kbGVycyIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkhhbmRsZXJzVGFibGUiLCBudWxsKTsKLQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywgIk91dHB1dExvY2F0aW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIkhhbmRsZXJDbGFzc05hbWVzIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzLCAiSGFuZGxlck5hbWVzIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIkdlblNrZWxldG9uRW5hYmxlZCIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAvLyBNYXAgc2VydmljZS1zaWRlIHdpZGdldHMgdG8gY29tbWFuZHMKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzUmVmc1RvSGFuZGxlcnMiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5Ta2VsZXRvbkVuYWJsZWQiLCBDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaiIsIENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzKTsKLQotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZpY2VIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRGVzY3JpcHRpb25OYW1lIiwgQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJIYW5kbGVyc0xpc3QiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldC5jbGFzcywgIldzRGVzY1RvSGFuZGxlcnMiLCBTZXJ2aWNlSGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VEZXNjTmFtZVRvRGVzY09iaiIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJTb3VyY2VPdXRwdXRMb2NhdGlvbiIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywgIk91dHB1dExvY2F0aW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29uZmlnU2VydmljZUhhbmRsZXJzVGFibGVXaWRnZXQuY2xhc3MsICJIYW5kbGVyQ2xhc3NOYW1lcyIsIEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZC5jbGFzcywgIkhhbmRsZXJOYW1lcyIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0LmNsYXNzLCAiR2VuU2tlbGV0b25FbmFibGVkIiwgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kLmNsYXNzKTsKLQotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkgewotICAgIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIkNvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0IiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9TRVJWSUNFX0hETFJfQ09ORklHIiksIG1zZ1V0aWxzCi0gICAgICAgIC5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfU0VSVklDRV9IRExSX0NPTkZJRyIpLCBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotCi0gICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ1NlcnZpY2VIYW5kbGVyc1RhYmxlV2lkZ2V0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoIkNvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX0NMSUVOVF9IRExSX0NPTkZJRyIpLCBtc2dVdGlscwotICAgICAgICAuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX0NMSUVOVF9IRExSX0NPTkZJRyIpLCBuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotCi0gICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IENvbmZpZ0NsaWVudEhhbmRsZXJzVGFibGVXaWRnZXQoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBIYW5kbGVyc0NvbW1hbmRGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgewotCi0gICAgcHVibGljIEhhbmRsZXJzQ29tbWFuZEZyYWdtZW50KCkgewotCi0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0KLSAgICAgIGFkZChuZXcgU2VydmljZUhhbmRsZXJzRnJhZ21lbnQoKSk7Ci0gICAgICBhZGQobmV3IENsaWVudEhhbmRsZXJzRnJhZ21lbnQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBIYW5kbGVyc0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSGFuZGxlcnNEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIklzQ2xpZW50SGFuZGxlciIsIENsaWVudEhhbmRsZXJzRnJhZ21lbnQuY2xhc3MsICJDbGllbnRIYW5kbGVyc0VuYWJsZWQiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEhhbmRsZXJzRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJc1NlcnZpY2VIYW5kbGVyIiwgU2VydmljZUhhbmRsZXJzRnJhZ21lbnQuY2xhc3MsICJTZXJ2aWNlSGFuZGxlcnNFbmFibGVkIiwgbnVsbCk7Ci0KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIldzQ2xpZW50UmVzb3VyY2UiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywiV3NTZXJ2aWNlUmVmcyIsIENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJDbGllbnRQcm9qZWN0IiwgQ2xpZW50SGFuZGxlcnNXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGRSZXNvdXJjZSIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpIHsKLSAgICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50SGFuZGxlcnNGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudCB7Ci0KLSAgICBib29sZWFuIGlzQ2xpZW50XyA9IGZhbHNlOwotCi0gICAgcHVibGljIENsaWVudEhhbmRsZXJzRnJhZ21lbnQoKSB7Ci0gICAgICBzZXRDb25kaXRpb24obmV3IENvbmRpdGlvbigpIHsKLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpIHsKLSAgICAgICAgICByZXR1cm4gaXNDbGllbnRfOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgU2VxdWVuY2VGcmFnbWVudCBjbGllbnRIYW5kbGVyc1Jvb3RGcmFnbWVudCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0KLSAgICAgIGNsaWVudEhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENsaWVudEhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLQotICAgICAgY2xpZW50SGFuZGxlcnNSb290RnJhZ21lbnQuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiQ29uZmlnQ2xpZW50SGFuZGxlcnNUYWJsZVdpZGdldCIpKTsKLSAgICAgIGNsaWVudEhhbmRsZXJzUm9vdEZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENsaWVudEhhbmRsZXJzV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIikpOwotICAgICAgY2xpZW50SGFuZGxlcnNSb290RnJhZ21lbnQuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgR2VuZXJhdGVIYW5kbGVyU2tlbGV0b25Db21tYW5kKCksICIiKSk7Ci0KLSAgICAgIHNldFRydWVGcmFnbWVudChjbGllbnRIYW5kbGVyc1Jvb3RGcmFnbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2xpZW50SGFuZGxlcnNFbmFibGVkKGJvb2xlYW4gaXNDbGllbnQpIHsKLSAgICAgIGlzQ2xpZW50XyA9IGlzQ2xpZW50OwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBDbGllbnRIYW5kbGVyc1dpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzQ2xpZW50UmVzb3VyY2UiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50SGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDbGllbnRIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotCi0gICAgfQotCi0gIH0KLQotICBwcml2YXRlIGNsYXNzIFNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50IHsKLQotICAgIGJvb2xlYW4gaXNTZXJ2aWNlXyA9IGZhbHNlOwotCi0gICAgcHVibGljIFNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50KCkgewotICAgICAgc2V0Q29uZGl0aW9uKG5ldyBDb25kaXRpb24oKSB7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKSB7Ci0gICAgICAgICAgcmV0dXJuIGlzU2VydmljZV87Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBTZXF1ZW5jZUZyYWdtZW50IHNlcnZpY2VIYW5kbGVyc1Jvb3RGcmFnbWVudCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICBzZXJ2aWNlSGFuZGxlcnNSb290RnJhZ21lbnQuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLQotICAgICAgU2VxdWVuY2VGcmFnbWVudCBzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgICBzZXJ2aWNlSGFuZGxlcnNGcmFnbWVudC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJDb25maWdTZXJ2aWNlSGFuZGxlcnNUYWJsZVdpZGdldCIpKTsKLSAgICAgIHNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQoKSwgIiIpKTsKLSAgICAgIHNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEdlbmVyYXRlSGFuZGxlclNrZWxldG9uQ29tbWFuZCgpLCAiIikpOwotCi0gICAgICBzZXJ2aWNlSGFuZGxlcnNSb290RnJhZ21lbnQuYWRkKHNlcnZpY2VIYW5kbGVyc0ZyYWdtZW50KTsKLQotICAgICAgc2V0VHJ1ZUZyYWdtZW50KHNlcnZpY2VIYW5kbGVyc1Jvb3RGcmFnbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUhhbmRsZXJzRW5hYmxlZChib29sZWFuIGlzU2VydmljZSkgewotICAgICAgaXNTZXJ2aWNlXyA9IGlzU2VydmljZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgU2VydmljZUhhbmRsZXJzV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlSGFuZGxlcnNXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGRSZXNvdXJjZSIsIFNlcnZpY2VIYW5kbGVyc1dpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotCi0gICAgfQotCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9HZW5TYW1wbGVXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9HZW5TYW1wbGVXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTQxNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvR2VuU2FtcGxlV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVTZXJ2ZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tYW5kLmRhdGEuRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uRmluaXNoRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLkNsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaERlZmF1bHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoSmF2YVRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LlRlc3REZWZhdWx0aW5nRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5UZXN0V2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LldlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVN0YXRlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5TYW1wbGVXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gbmV3IEdlblNhbXBsZVJvb3RDb21tYW5kRnJhZ21lbnQoKTsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyA9IGRhdGFSZWdpc3RyeTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gQmVmb3JlIENsaWVudCBUZXN0IHdpZGdldC4KLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLQotICAgIC8vIEFmdGVyIHRoZSBjbGllbnQgdGVzdCB3aWRnZXQgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlNhbXBsZVByb2plY3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlTWV0aG9kcyIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgCi0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RTZXJ2aWNlIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJUZXN0SUQiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIklzVGVzdFdpZGdldCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlcldpZGdldE1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICAgIFN0cmluZyAgICAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICAKLSAgICB3aWRnZXRSZWdpc3RyeV8gPSB3aWRnZXRSZWdpc3RyeTsKLSAgICAgICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQ2xpZW50VGVzdFdpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19TQU1QTEUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19TQU1QTEUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50VGVzdFdpZGdldCgpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIEluaXRDbGllbnRSZWdpc3RyeSBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLSAgeyAgCi0gICAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IGNsaWVudFJlZ2lzdHJ5XyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50KQotICAgICAqLwotICAgIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkgCi0gICAgewotICAgICAgY2xpZW50UmVnaXN0cnlfLnNldERhdGFNYXBwaW5nUmVnaXN0cnkoIGRhdGFNYXBwaW5nUmVnaXN0cnlfICk7Ci0gICAgICBjbGllbnRSZWdpc3RyeV8uc2V0V2lkZ2V0UmVnaXN0cnkoIHdpZGdldFJlZ2lzdHJ5XyApOwotICAgICAgY2xpZW50UmVnaXN0cnlfLnNldENhbkZpbmlzaFJlZ2lzdHJ5KCBjYW5GaW5pc2hSZWdpc3RyeV8gKTsKLSAgICAgIAotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIEluaXRpYWxpemVQcm94eUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi0gIHsKLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0JcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcl87Ci0JcHJpdmF0ZSBJQ29udGV4dCAgICAgICAgICBjb250ZXh0XzsKLQlwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHByb2plY3RfOwotCXByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlXzsKLQlwcml2YXRlIFN0cmluZyAgICAgICAgICAgIG1vZHVsZVR5cGVfOwotCXByaXZhdGUgU3RyaW5nICAgICAgICAgICAgZWFyUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBlYXJfOwotCXByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZUNsaWVudF87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBqMmVlTGV2ZWxfOwotCXByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICAgcmVzb3VyY2VDb250ZXh0XzsKLQlwcml2YXRlIGJvb2xlYW4JCQkgIHRlc3RfOwotCXByaXZhdGUgU3RyaW5nICAgICAgICAgICAgd3NkbFVSSV87Ci0gICAgCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50Xyl7Ci0JICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsJCi0JICAKLSAgICAgIC8vIFNwbGl0IHVwIHRoZSBwcm9qZWN0IGFuZCBtb2R1bGUKLSAgICAgIGludCBpbmRleCA9IG1vZHVsZV8uaW5kZXhPZigiLyIpOwotICAgICAgaWYgKGluZGV4IT0tMSl7Ci0gICAgICAgIHByb2plY3RfID0gbW9kdWxlXy5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgIG1vZHVsZV8gPSBtb2R1bGVfLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGVhcl8hPW51bGwgJiYgZWFyXy5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBpbnQgZWFySW5kZXggPSBlYXJfLmluZGV4T2YoIi8iKTsKLSAgICAgICAgaWYgKGVhckluZGV4IT0tMSkgewotICAgICAgICAgIGVhclByb2plY3RfID0gZWFyXy5zdWJzdHJpbmcoMCxlYXJJbmRleCk7Ci0gICAgICAgICAgZWFyXyA9IGVhcl8uc3Vic3RyaW5nKGVhckluZGV4KzEpOwotICAgICAgICB9Ci0gICAgICB9ICAgIAotCSAgCi0JICBXZWJTZXJ2aWNlQ2xpZW50SW5mbyBjbGllbnRJbmZvID0gbmV3IFdlYlNlcnZpY2VDbGllbnRJbmZvKCk7Ci0JICBjbGllbnRJbmZvLnNldEltcGxVUkwoZ2V0UHJveHlCZWFuKCkpOwotCSAgY2xpZW50SW5mby5zZXRKMmVlTGV2ZWwoajJlZUxldmVsXyk7Ci0JICBjbGllbnRJbmZvLnNldFNlcnZlckZhY3RvcnlJZCh0eXBlUnVudGltZVNlcnZlcl8uZ2V0U2VydmVySWQoKSk7Ci0JICBjbGllbnRJbmZvLnNldFNlcnZlckluc3RhbmNlSWQodHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0JICBjbGllbnRJbmZvLnNldFN0YXRlKFdlYlNlcnZpY2VTdGF0ZS5VTktOT1dOX0xJVEVSQUwpOwotCSAgY2xpZW50SW5mby5zZXRXZWJTZXJ2aWNlUnVudGltZUlkKHR5cGVSdW50aW1lU2VydmVyXy5nZXRSdW50aW1lSWQoKSk7Ci0JICBjbGllbnRJbmZvLnNldFdzZGxVUkwod3NkbFVSSV8pOwotCSAgaWYgKGNsaWVudEluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpPT1udWxsKQotCSAgewotCSAgICBDcmVhdGVTZXJ2ZXJDb21tYW5kIGNyZWF0ZVNlcnZlckNvbW1hbmQgPSBuZXcgQ3JlYXRlU2VydmVyQ29tbWFuZCgpOwotCSAgICBjcmVhdGVTZXJ2ZXJDb21tYW5kLnNldFNlcnZlckZhY3RvcnlpZChjbGllbnRJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpKTsKLQkgICAgU3RhdHVzIGNyZWF0ZVNlcnZlclN0YXR1cyA9IGNyZWF0ZVNlcnZlckNvbW1hbmQuZXhlY3V0ZShlbnZpcm9ubWVudF8pOwotCSAgICBpZiAoY3JlYXRlU2VydmVyU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5PSyl7Ci0JICAgICAgY2xpZW50SW5mby5zZXRTZXJ2ZXJJbnN0YW5jZUlkKGNyZWF0ZVNlcnZlckNvbW1hbmQuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLQkgICAgfQotCSAgICBlbHNlIGlmIChjcmVhdGVTZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKXsKLQkgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGNyZWF0ZVNlcnZlclN0YXR1cyk7Ci0JICAgIH0gICAgICAgICAgICAgICAKLQkgICAgCi0JICB9Ci0JICAKLQkgIEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZCgpOwotICAgICAgY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKGNsaWVudEluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0XyAhPSBudWxsICYmIGVhclByb2plY3RfLmxlbmd0aCgpPjAgJiYgZWFyXyE9IG51bGwgJiYgZWFyXy5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBjb21tYW5kLnNldFByb2plY3QoZWFyUHJvamVjdF8pOwotICAgICAgICBjb21tYW5kLnNldE1vZHVsZShlYXJfKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tbWFuZC5zZXRQcm9qZWN0KHByb2plY3RfKTsKLSAgICAgICAgY29tbWFuZC5zZXRNb2R1bGUobW9kdWxlXyk7ICAgICAgIAotICAgICAgfQotCi0gICAgICBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoZW52aXJvbm1lbnRfKTsKLSAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgewotICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICB9ICAgICAKLQotCSAgd2ViU2VydmljZUNsaWVudF8gPSBuZXcgVGVzdFdlYlNlcnZpY2VDbGllbnQoY2xpZW50SW5mbyk7Ci0JICByZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3h5QmVhbigpCi0gICAgewotICAgICAgU3RyaW5nIHByb3h5QmVhbiA9ICIiOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVJlc291cmNlIHJlc291cmNlICAgID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24oIHNlbGVjdGlvbl8uZ2V0Rmlyc3RFbGVtZW50KCkgKTsKLSAgICAgICAgU3RyaW5nICAgIGJlYW5QYWNrYWdlID0gUmVzb3VyY2VVdGlscy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZSggcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSApOwotICAgICAgICAKLSAgICAgICAgaWYoIGJlYW5QYWNrYWdlPT1udWxsICkKLSAgICAgICAgICBiZWFuUGFja2FnZSA9ICIiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYmVhblBhY2thZ2UgPSBiZWFuUGFja2FnZSArICIuIjsKLQotICAgICAgICBwcm94eUJlYW4gPSBiZWFuUGFja2FnZSArIHJlc291cmNlLmdldE5hbWUoKTsKLQotICAgICAgICBpZiggcHJveHlCZWFuLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXZhIikgfHwgcHJveHlCZWFuLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSAKLSAgICAgICAgewotICAgICAgICAgIHByb3h5QmVhbiA9IHByb3h5QmVhbi5zdWJzdHJpbmcoMCxwcm94eUJlYW4ubGFzdEluZGV4T2YoJy4nKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHByb3h5QmVhbjsKLSAgICB9Ci0gICAgCi0JcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2VDbGllbnQoKQotCXsKLQkgIHJldHVybiB3ZWJTZXJ2aWNlQ2xpZW50XzsKLQl9Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlciApCi0JewotICAgICAgdHlwZVJ1bnRpbWVTZXJ2ZXJfID0gdHlwZVJ1bnRpbWVTZXJ2ZXI7ICAKLQl9Ci0JICAKLQlwdWJsaWMgdm9pZCBzZXRDbGllbnRKMkVFVmVyc2lvbiggU3RyaW5nIGoyZWVMZXZlbCApCi0JewotCSAgajJlZUxldmVsXyA9IGoyZWVMZXZlbDsgIAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotCXsKLQkgIG1vZHVsZV8gPSBtb2R1bGU7Ci0JfQotCSAgCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVHlwZSggU3RyaW5nIG1vZHVsZVR5cGUpCi0JewotCSAgbW9kdWxlVHlwZV8gPSBtb2R1bGVUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQgKQotCXsKLQkgIHJlc291cmNlQ29udGV4dF8gPSByZXNvdXJjZUNvbnRleHQ7CSAgCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gICAgewotICAgICAgc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBHZW5TYW1wbGVSb290Q29tbWFuZEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotICB7Ci0gICAgcHVibGljIEdlblNhbXBsZVJvb3RDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBJbml0Q2xpZW50UmVnaXN0cnkoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQoKSwgIiIgKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoIHRydWUgKSwgIiIpKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFRlc3REZWZhdWx0aW5nRnJhZ21lbnQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50VGVzdEZyYWdtZW50KCAiQ2xpZW50VGVzdFdpZGdldCIpICk7IAotICAgICAgYWRkKCBuZXcgRmluaXNoRnJhZ21lbnQoKSApOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICAgIHsKLSAgICAgIC8vTWFwIFNlbGVjdGlvbkNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzICk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIG5ldyBGb3JjZVRydWUoKSApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvLyBNYXAgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50RWFyQ29tcG9uZW50TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudENvbXBvbmVudE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7ICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnRUeXBlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgY29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5XU0lMIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV1NETFNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NpbFVSSSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdTRExTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VVUkkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBuZXcgRWNsaXBzZUlQYXRoMlVSTFN0cmluZ1RyYW5zZm9ybWVyKCkpOwotICAgICAgICAgICAgIAotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQuY2xhc3MpOwotICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJ1bnRpbWUyQ2xpZW50VHlwZXMiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiQ2xpZW50SWRzIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkoyZWVWZXJzaW9uIiwgbnVsbCk7ICAgICAgCi0gICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzICk7ICAgICAKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckluc3RhbmNlSWQiLCBGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBJbml0aWFsaXplUHJveHlDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZSIsIEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MsICJNb2R1bGVUeXBlIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZC5jbGFzcywgIkVhciIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZC5jbGFzcyk7Ci0JICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZC5jbGFzcyApOwotCSAgCi0JICAKLQkgIAotCSAgCi0gICAgICAvLyBNYXAgSW5pdGlhbGl6ZVByb3h5Q29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSW5pdGlhbGl6ZVByb3h5Q29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2VDbGllbnQiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEluaXRpYWxpemVQcm94eUNvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kIGNvbW1hbmQuCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBGaW5pc2hKYXZhVGVzdEZyYWdtZW50LmNsYXNzKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJJbnN0YW5jZUlkIiwgRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotCSAgCi0gICAgICAvLyBNQVAgcG9zdCBzZXJ2ZXIgY29uZmlnIGNhbGwgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJFQVJQcm9qZWN0TmFtZSIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlckluc3RhbmNlIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLSAgICAgICAgICAgIAotICAgICAgCi0gICAgICAvLyBNYXAgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZCBjb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiSnNwRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBGb3JjZVRydWUgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotICB7Ci0gICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU0lMV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvSW1wb3J0V1NJTFdpZGdldEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3YjBmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvYmluZGluZy9JbXBvcnRXU0lMV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuSW1wb3J0V1NJTFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgSW1wb3J0V1NJTFdpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnk7Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeTsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLSAgcHVibGljIEltcG9ydFdTSUxXaWRnZXRCaW5kaW5nKCkKLSAgewotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2VxdWVuY2VGcmFnbWVudCByb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiSW1wb3J0V1NJTFdpZGdldCIpKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kKCksICIiKSk7Ci0gICAgICAgICAgICAgICByZXR1cm4gcm9vdDsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5jYW5GaW5pc2hSZWdpc3RyeSA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5kYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gZGF0YVJlZ2lzdHJ5OwotICAgIAotICAgIC8vIEltcG9ydFdTSUxXaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIEltcG9ydFdTSUxXaWRnZXQuY2xhc3MpOwotICAgIAotICAgIC8vIEFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEltcG9ydFdTSUxXaWRnZXQuY2xhc3MsICJHZW5XU0lMQXJndW1lbnRzIiwgQWRkV1NETFRvV1NJTFdyYXBwZXJDb21tYW5kLmNsYXNzLCAiQXJncyIsIG51bGwpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiSW1wb3J0V1NJTFdpZGdldCIsIAotICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiVElUTEVfV1NJTF9JTVBPUlQiKSwKLSAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkRFU0NfV1NJTF9JTVBPUlQiKSwKLSAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgewotICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgSW1wb3J0V1NJTFdpZGdldCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0ltcG9ydFdTV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvSW1wb3J0V1NXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYWY2MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvSW1wb3J0V1NXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFdTV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kOwotCi0KLXB1YmxpYyBjbGFzcyBJbXBvcnRXU1dpZGdldEJpbmRpbmcgaW1wbGVtZW50cyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnk7Ci0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkgICAgICB3aWRnZXRSZWdpc3RyeTsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0gIHByaXZhdGUgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnOwotCi0gIHB1YmxpYyBJbXBvcnRXU1dpZGdldEJpbmRpbmcoKQotICB7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnID0gbmV3IFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50KCk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI2NyZWF0ZSgpCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5KCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KCJXU0ltcG9ydCIpKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZyk7Ci0gICAgICAgICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQoKSwgIiIpKTsKLSAgICAgICAgICAgICAgIHJldHVybiByb290OyAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5ID0gY2FuRmluaXNoUmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyQ2FuRmluaXNoKHRoaXMuY2FuRmluaXNoUmVnaXN0cnkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5kYXRhTWFwcGluZ1JlZ2lzdHJ5ID0gZGF0YVJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlckRhdGFNYXBwaW5ncyh0aGlzLmRhdGFNYXBwaW5nUmVnaXN0cnkpOwotICAgIAotICAgIC8vIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIlB1Ymxpc2hUb1ByaXZhdGVVRERJIiwgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vIExhdW5jaFdlYlNlcnZpY2VzRXhwbG9yZXJDb21tYW5kCi0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkZvcmNlTGF1bmNoT3V0c2lkZUlERSIsIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJMYXVuY2hPcHRpb25zIiwgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZC5jbGFzcyk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgdGhpcy53aWRnZXRSZWdpc3RyeSA9IHdpZGdldFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHRoaXMud2lkZ2V0UmVnaXN0cnkpOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJXU0ltcG9ydCIsIAotICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19GSU5EIiksCi0gICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfRklORCIpLAotICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBQdWJsaXNoV1NXaWRnZXQoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTc3ZDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgLy8gQ2xpZW50V2l6YXJkV2lkZ2V0Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgY2xpZW50SWRzXzsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICB0ZXN0U2VydmljZTsKLSAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgICAgICByZXNvdXJjZUNvbnRleHQ7Ci0gIAotICAvLyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xpZW50Q2hvaWNlc187Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50RWFyUHJvamVjdE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRDb21wb25lbnROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50RWFyQ29tcG9uZW50TmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudENvbXBvbmVudFR5cGVfOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbjsKLSAgcHJpdmF0ZSBib29sZWFuIGNsaWVudE5lZWRFQVJfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkXzsKLSAgCi0gIC8vIFdTRExTZWxlY3Rpb25XaWRnZXQKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBnZW5XU0lMOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHdzaWxVUkk7Ci0gIAotICAvLyBXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZAotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotICAKLSAgLy8gV1NETFNlbGVjdGlvblRyZWVXaWRnZXQKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICB3c2RsVVJJOwotICAKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBpc0NsaWVudFNjZW5hcmlvXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBnZW5Qcm94eV8gPSB0cnVlOwotICBwcml2YXRlIFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgCi0gIC8vU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kCi0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckluc3RJZF87Ci0gIAotICBwdWJsaWMgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoIGJvb2xlYW4gaXNDbGllbnRTY2VuYXJpbyApCi0gIHsKLSAgICBpc0NsaWVudFNjZW5hcmlvXyA9IGlzQ2xpZW50U2NlbmFyaW87Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoaXMgY29tbWFuZCBpcyBydW5uaW5nIGluIHRoZSBjbGllbnQgd2l6YXJkIGFuZAotICAgKiBmYWxzZSBpZiB0aGlzIGNvbW1hbmQgaXMgcnVubmluZyBpbiB0aGUgY3JlYXRlIHdlYiBzZXJ2aWNlIHdpemFyZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldElzQ2xpZW50U2NlbmFyaW8oKQotICB7Ci0gICAgcmV0dXJuIGlzQ2xpZW50U2NlbmFyaW9fOyAKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWUyQ2xpZW50VHlwZXMoIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNob2ljZXMgKQotICB7Ci0gICAgY2xpZW50Q2hvaWNlc18gPSBjaG9pY2VzOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkKLSAgewotICAgIHJldHVybiBjbGllbnRDaG9pY2VzXzsgIAotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzKQotICB7Ci0gICAgY2xpZW50SWRzXyA9IGlkczsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotCWlmIChjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKT09bnVsbCB8fCBjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKS5sZW5ndGgoKT09MCkKLQl7Ci0JCS8vU2V0IHRoZSBpbnN0YW5jZSBpZCBmcm9tIHRoZSBzZXJ2aWNlIHNpZGUgaWYgdGhlIGZhY3RvcnkgaWRzIG1hdGNoCi0JCWlmIChzZXJ2aWNlU2VydmVySW5zdGFuY2VJZF8hPW51bGwgJiYgc2VydmljZVNlcnZlckluc3RhbmNlSWRfLmxlbmd0aCgpPjApCi0JCXsKLQkJCWlmIChzZXJ2aWNlU2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2aWNlU2VydmVyRmFjdG9yeUlkXy5sZW5ndGgoKT4wKQotCQkJewotCQkJCWlmIChzZXJ2aWNlU2VydmVyRmFjdG9yeUlkXy5lcXVhbHMoY2xpZW50SWRzXy5nZXRTZXJ2ZXJJZCgpKSkKLQkJCQl7Ci0JCQkJCWNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2aWNlU2VydmVySW5zdGFuY2VJZF8pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLSAgICByZXR1cm4gY2xpZW50SWRzXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkKFN0cmluZyBzZXJ2ZXJJbnN0SWQpIHsKLSAgCXRoaXMuc2VydmVySW5zdElkXyA9IHNlcnZlckluc3RJZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQoKXsKLSAgCXJldHVybiB0aGlzLnNlcnZlckluc3RJZF87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudElzRXhpc3RpbmdTZXJ2ZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NsaWVudElzRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRQcm9qZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0KCkKLSAgewotCSAgcmV0dXJuIGNsaWVudFByb2plY3ROYW1lXyArICIvIiArIGNsaWVudENvbXBvbmVudE5hbWVfOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdEVBUi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdEVBUigpCi0gIHsKLSAgICBpZiAoY2xpZW50RWFyUHJvamVjdE5hbWVfIT1udWxsICYmIGNsaWVudEVhclByb2plY3ROYW1lXy5sZW5ndGgoKT4wIAotICAgICAgICAmJiBjbGllbnRFYXJDb21wb25lbnROYW1lXyE9bnVsbCAmJiBjbGllbnRFYXJDb21wb25lbnROYW1lXy5sZW5ndGgoKT4wKQotICAgIHsKLQkgICAgcmV0dXJuIGNsaWVudEVhclByb2plY3ROYW1lXyArICIvIiArIGNsaWVudEVhckNvbXBvbmVudE5hbWVfOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfQotICAKLSAgLyoKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TW9kdWxlUHJvamVjdE5hbWUoIFN0cmluZyBwcm9qZWN0TmFtZSApCi0gIHsKLQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCi0JaWYoIHByb2plY3ROYW1lICE9IG51bGwgJiYgIXByb2plY3ROYW1lLmVxdWFscygiIikgKQotCXsKLQkgIElQYXRoICAgIHByb2plY3RQYXRoID0gbmV3IFBhdGgoIHByb2plY3ROYW1lICk7Ci0JICBJUHJvamVjdCBwcm9qZWN0ICAgICA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZSggcHJvamVjdFBhdGggKTsKLQkgIFN0cmluZyAgIG1vZHVsZU5hbWUgID0gSjJFRVV0aWxzLmdldEZpcnN0V2ViTW9kdWxlTmFtZSggcHJvamVjdCApOwotCSAgCi0JICByZXN1bHQgPSBwcm9qZWN0TmFtZSArICIvIiArIG1vZHVsZU5hbWU7Ci0JfQotCQotCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgKi8KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50UHJvamVjdFR5cGUuCi0gICAqLwotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0VHlwZSgpCi0gIHsKLSAgICAvL3JldHVybiBjbGllbnRDaG9pY2VzXy5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgcmV0dXJuIGNsaWVudENvbXBvbmVudFR5cGVfOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGllbnRSdW50aW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRSdW50aW1lKCkKLSAgewotICAgIHJldHVybiBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xpZW50U2VydmVyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudElkc18uZ2V0U2VydmVySWQoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTZXJ2ZXJJbnN0YW5jZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50SWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2ZXJJbnN0SWQpewotICAgIAotICAgIGlmIChjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKT09bnVsbCkKLSAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbnN0SWQpOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBnZW5XU0lMLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHZW5XU0lMKCkKLSAgewotICAgIHJldHVybiBnZW5XU0lMOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBnZW5XU0lMCi0gICAqICAgICAgICAgICAgVGhlIGdlbldTSUwgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuV1NJTChib29sZWFuIGdlbldTSUwpCi0gIHsKLSAgICB0aGlzLmdlbldTSUwgPSBnZW5XU0lMOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVzb3VyY2VDb250ZXh0LgotICAgKi8KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlQ29udGV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcmVzb3VyY2VDb250ZXh0Ci0gICAqICAgICAgICAgICAgVGhlIHJlc291cmNlQ29udGV4dCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCkKLSAgewotICAgIHRoaXMucmVzb3VyY2VDb250ZXh0ID0gcmVzb3VyY2VDb250ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGVzdFByb3h5U2VsZWN0ZWQuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRUZXN0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRlc3RQcm94eVNlbGVjdGVkCi0gICAqICAgICAgICAgICAgVGhlIHRlc3RQcm94eVNlbGVjdGVkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKEJvb2xlYW4gdGVzdFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAgIHJldHVybiB3c2RsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2RsVVJJCi0gICAqICAgICAgICAgICAgVGhlIHdzZGxVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2lsVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVVJJKCkKLSAgewotICAgIHJldHVybiB3c2lsVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c2lsVVJJCi0gICAqICAgICAgICAgICAgVGhlIHdzaWxVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NpbFVSSShTdHJpbmcgd3NpbFVSSSkKLSAgewotICAgIHRoaXMud3NpbFVSSSA9IHdzaWxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3ZWJTZXJ2aWNlc1BhcnNlci4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlc1BhcnNlciBnZXRXZWJTZXJ2aWNlc1BhcnNlcigpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZXNQYXJzZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyCi0gICAqICAgICAgICAgICAgVGhlIHdlYlNlcnZpY2VzUGFyc2VyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgajJlZVZlcnNpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEoyRUVWZXJzaW9uKCkKLSAgewotCSAgcmV0dXJuIGoyZWVWZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBqMmVlVmVyc2lvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRKMkVFVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotCSAgajJlZVZlcnNpb24gPSB2ZXJzaW9uOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIGEgcHJveHkgc2hvdWxkIGJlIGdlbmVyYXRlZCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2VuUHJveHlfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBib29sZWFuIGdlblByb3h5ICkKLSAgewotICAgIGdlblByb3h5XyA9IGdlblByb3h5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lKQotICB7Ci0gIAl0aGlzLmxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmYWNpbGl0eSB0byBsYXVuY2guCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVkU2VydmljZVRlc3ROYW1lKCkKLSAgewotICAJcmV0dXJuIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQgcHJvamVjdCBuZWVkcyBhbiBFQVIgcHJvamVjdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldENsaWVudE5lZWRFQVIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudE5lZWRFQVJfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnROZWVkRUFSKGJvb2xlYW4gY2xpZW50TmVlZEVBUikKLSAgewotICAgIGNsaWVudE5lZWRFQVJfID0gY2xpZW50TmVlZEVBUjsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRDb21wb25lbnRUeXBlKFN0cmluZyBjbGllbnRDb21wb25lbnRUeXBlKQotICB7Ci0gICAgdGhpcy5jbGllbnRDb21wb25lbnRUeXBlXyA9IGNsaWVudENvbXBvbmVudFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0TmFtZShTdHJpbmcgY2xpZW50UHJvamVjdE5hbWUpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3ROYW1lXyA9IGNsaWVudFByb2plY3ROYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50Q29tcG9uZW50TmFtZShTdHJpbmcgY2xpZW50Q29tcG9uZW50TmFtZSkKLSAgewotICAgIHRoaXMuY2xpZW50Q29tcG9uZW50TmFtZV8gPSBjbGllbnRDb21wb25lbnROYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoU3RyaW5nIGNsaWVudEVhclByb2plY3ROYW1lKQotICB7Ci0gICAgdGhpcy5jbGllbnRFYXJQcm9qZWN0TmFtZV8gPSBjbGllbnRFYXJQcm9qZWN0TmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50RWFyQ29tcG9uZW50TmFtZShTdHJpbmcgY2xpZW50RWFyQ29tcG9uZW50TmFtZSkKLSAgewotICAgIHRoaXMuY2xpZW50RWFyQ29tcG9uZW50TmFtZV8gPSBjbGllbnRFYXJDb21wb25lbnROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyRmFjdG9yeUlkKFN0cmluZyBpZCkKLSAgewotICAJc2VydmljZVNlcnZlckZhY3RvcnlJZF8gPSBpZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBpZCkKLSAgewotICAJc2VydmljZVNlcnZlckluc3RhbmNlSWRfID0gaWQ7Ci0gIH0KLSAgCi0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTE5NTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuRXh0ZW5zaW9uRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudEV4dGVuc2lvbkZyYWdtZW50IGV4dGVuZHMgRXh0ZW5zaW9uRnJhZ21lbnQKLXsgIAotICBwdWJsaWMgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQoKQotICB7Ci0gICAgc2V0RXh0ZW5zaW9uUmVnaXN0cnkoIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKSApOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQoIENsaWVudEV4dGVuc2lvbkZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgc2V0RXh0ZW5zaW9uSWRzKCBuZXcgU3RyaW5nW117IGlkcy5nZXRUeXBlSWQoKSwgaWRzLmdldFJ1bnRpbWVJZCgpLCBpZHMuZ2V0U2VydmVySWQoKSB9ICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotICAgIHJldHVybiBuZXcgQ2xpZW50RXh0ZW5zaW9uRnJhZ21lbnQoIHRoaXMgKTsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjVhOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5BYnN0cmFjdFN0YXJ0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VDbGllbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyAgcHJveHlCZWFuXzsKLSAgcHJpdmF0ZSBib29sZWFuIGdlblByb3h5XzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0JcHJpdmF0ZSBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlQ2xpZW50XzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGV4aXN0aW5nU2VydmVySWRfOwotICBwcml2YXRlIFN0cmluZyBlYXJQcm9qZWN0TmFtZV87ICAKLSAgcHJpdmF0ZSBJU2VydmVyIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlKCl7Ci0gIAlyZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyhFbnZpcm9ubWVudCBlbnYpewotICAJU3RhdHVzIHN0YXQgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIHRyeQl7Ci0gICAgCQotICAgICAgLy8gY2hlY2sgZXhpc3RpbmdTZXJ2ZXIKLSAgICAgIGlmIChmRXhpc3RpbmdTZXJ2ZXIhPW51bGwpIHsKLSAgICAJCi0gICAgICAgIC8vIGdldCBFQVIgcHJvamVjdAotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgICAgIGlmIChlYXJQcm9qZWN0TmFtZV8hPW51bGwgJiYgZWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpPjApIHsKLSAgICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lXyk7Ci0gICAgCX0gICAgCQotICAgIAkKLSAgICAJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgIAlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChmRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgIAlpZiAoZWFyUHJvamVjdCE9bnVsbCkgewotICAgIAkJc3RhcnRTZXJ2ZXJDb21tYW5kLnJ1blByZVNlcnZlckNvbmZpZyhmRXhpc3RpbmdTZXJ2ZXIsIGVhclByb2plY3QpOwotICAgIAl9Ci0gICAgICB9Ci0gICAJfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkgewotICAgICAgSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgc3RhdCA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXQpOwotICAJCXJldHVybiBzdGF0OwotICAJfSAgCQotICAJCi0gIAlyZXR1cm4gc3RhdDsKLSAgfSAgCi0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KXsKLSAgCQotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAgCQotICAJCi0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICBJU2VydmVyIGV4aXN0aW5nU2VydmVyID0gbnVsbDsKLSAgICBmRXhpc3RpbmdTZXJ2ZXIgPSBudWxsOyAKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyIHRoaXNTZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLSAgICAgIFN0cmluZyB0aGlzU2VydmVySWQgPSBudWxsOwotICAgICAgaWYgKHRoaXNTZXJ2ZXIhPW51bGwpIHsKLSAgICAgIAl3YyA9IHRoaXNTZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLSAgICAgICAgdGhpc1NlcnZlcklkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAodGhpc1NlcnZlcklkLmVxdWFscyhleGlzdGluZ1NlcnZlcklkXykpCi0gICAgICAgIGV4aXN0aW5nU2VydmVyID0gdGhpc1NlcnZlcjsKLSAgICB9ICAgIAkKLSAgICB0cnkJewotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgICAgIGlmIChlYXJQcm9qZWN0TmFtZV8hPW51bGwgJiYgZWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lXyk7Ci0gICAgICAgIH0gICAgCQotICAgIAkKLSAgICAgICAgaWYgKGV4aXN0aW5nU2VydmVyIT1udWxsKXsKLSAgIAkJICBBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAJCSAgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgCSAgc3RhcnRTZXJ2ZXJDb21tYW5kID0gKEFic3RyYWN0U3RhcnRTZXJ2ZXIpcmVnLmdldFNlcnZlclN0YXJ0QnlUeXBlSWQoZXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgICAJICBpZiAoZWFyUHJvamVjdCE9bnVsbCl7Ci0gICAgIAkgIAlzdGFydFNlcnZlckNvbW1hbmQucnVuUG9zdFNlcnZlckNvbmZpZyhleGlzdGluZ1NlcnZlciwgZWFyUHJvamVjdCk7Ci0gICAgIAkgIAlmRXhpc3RpbmdTZXJ2ZXIgPSBleGlzdGluZ1NlcnZlcjsKLSAgICAgCSAgfQotICAgICAgICB9Ci0gICAJfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkgewotICAgIAlJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgCXN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgCQlyZXR1cm4gc3RhdHVzOwotICAJfQotICAJCi0gIAlyZXR1cm4gc3RhdHVzOyAgICAgIAkKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJveHlCZWFuLgotICAgKi8KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlCZWFuKCkKLSAgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlQ2xpZW50Xy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldEltcGxVUkwoKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHByb3h5QmVhbiBUaGUgcHJveHlCZWFuIHRvIHNldC4KLSAgICovCi0JLyoKLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pCi0gIHsKLSAgICB0aGlzLnByb3h5QmVhbl8gPSBwcm94eUJlYW47Ci0gIH0KLSAgKi8KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgLy9yZXR1cm4gZ2VuUHJveHlfOwotCQlyZXR1cm4gdHJ1ZTsKLSAgfQotICAKLQkvKgotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBib29sZWFuIGdlblByb3h5ICkKLSAgewotICAgIGdlblByb3h5XyA9IGdlblByb3h5OwotICB9Ci0gICovCi0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXRFbmRwb2ludE1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0RW5kcG9pbnRNZXRob2QoKQotICB7Ci0gICAgLy9yZXR1cm4gc2V0RW5kcG9pbnRNZXRob2Q7Ci0JCXJldHVybiAic2V0RW5kcG9pbnQiOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gc2V0RW5kcG9pbnRNZXRob2QgVGhlIHNldEVuZHBvaW50TWV0aG9kIHRvIHNldC4KLSAgICovCi0JLyoKLSAgcHVibGljIHZvaWQgc2V0U2V0RW5kcG9pbnRNZXRob2QoU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kKQotICB7Ci0gICAgdGhpcy5zZXRFbmRwb2ludE1ldGhvZCA9IHNldEVuZHBvaW50TWV0aG9kOwotICB9Ci0gICovCi0gIC8qKgotICAgKiBAcGFyYW0gZWFyUHJvamVjdE5hbWUgVGhlIGVhclByb2plY3ROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKFN0cmluZyBlYXJQcm9qZWN0TmFtZSkgewotICAJdGhpcy5lYXJQcm9qZWN0TmFtZV8gPSBlYXJQcm9qZWN0TmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGV4aXN0aW5nU2VydmVySWQgVGhlIGV4aXN0aW5nU2VydmVySWQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXJJZChTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZCkgewotICAJdGhpcy5leGlzdGluZ1NlcnZlcklkXyA9IGV4aXN0aW5nU2VydmVySWQ7Ci0gIH0gIAotCQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VDbGllbnQoSVdlYlNlcnZpY2VDbGllbnQgd3NjKQotCXsKLQkJd2ViU2VydmljZUNsaWVudF8gPSB3c2M7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VJZCgpCi0JewotCQlyZXR1cm4gd2ViU2VydmljZUNsaWVudF8uZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkKCkKLQl7Ci0JCXJldHVybiB3ZWJTZXJ2aWNlQ2xpZW50Xy5nZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFNlcnZlckZhY3RvcnlJZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRmZjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBCb29sZWFuICAgICAgICAgICAgICBzdGFydFNlcnZpY2U7Ci0gIHByaXZhdGUgQm9vbGVhbiAgICAgICAgICAgICAgdGVzdFNlcnZpY2U7Ci0gIHByaXZhdGUgQm9vbGVhbiAgICAgICAgICAgICAgcHVibGlzaFNlcnZpY2U7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgc2VydmljZUlkc187Ci0gIC8vcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBzZXJ2aWNlQ2hvaWNlc187Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgc2VydmljZVByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBzZXJ2aWNlRWFyUHJvamVjdE5hbWVfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgIHNlcnZpY2VDb21wb25lbnROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICBzZXJ2aWNlRWFyQ29tcG9uZW50TmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uOwotICBwcml2YXRlIGJvb2xlYW4gc2VydmljZU5lZWRFQVJfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdzZGxQYXJzZXJfOwotICAKLQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIGlkcykKLSAgewotICAgIHNlcnZpY2VJZHNfID0gaWRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUV4aXN0aW5nU2VydmVySW5zdGFuY2VJZChTdHJpbmcgc2VydmVySW5zdElkKXsKLSAgICAKLSAgICBpZiAoc2VydmljZUlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpPT1udWxsKQotICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbnN0SWQpOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgVHlwZVJ1bnRpbWVTZXJ2aWNlIG9iamVjdCB0aGF0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZCBvbgotICAgKiBwYWdlIDMgb2YgdGhlIHdpemFyZC4KLSAgICovCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfOwotICB9Ci0KLSAgLyoKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdChTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjaG9pY2VzKQotICB7Ci0gICAgc2VydmljZUNob2ljZXNfID0gY2hvaWNlczsKLSAgfQotICAqLwotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHB1Ymxpc2hTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0UHVibGlzaFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHB1Ymxpc2hTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwdWJsaXNoU2VydmljZQotICAgKiAgICAgICAgICAgIFRoZSBwdWJsaXNoU2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoU2VydmljZShCb29sZWFuIHB1Ymxpc2hTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy5wdWJsaXNoU2VydmljZSA9IHB1Ymxpc2hTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVySXNFeGlzdGluZ1NlcnZlci4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNlcnZlcklzRXhpc3RpbmdTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsOwotICB9Ci0KLSAgLyoqCi0KLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJJbnN0YW5jZUlkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlSWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclByb2plY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VQcm9qZWN0TmFtZV8gKyAiLyIgKyBzZXJ2aWNlQ29tcG9uZW50TmFtZV87IAotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRNb2R1bGVQcm9qZWN0TmFtZSggU3RyaW5nIHByb2plY3ROYW1lICkKLSAgewotICAgIAotCVN0cmluZyByZXN1bHQgPSAiIjsKLQkKLQlpZiggcHJvamVjdE5hbWUgIT0gbnVsbCAmJiAhcHJvamVjdE5hbWUuZXF1YWxzKCIiKSApCi0JewotCSAgSVBhdGggICAgcHJvamVjdFBhdGggPSBuZXcgUGF0aCggcHJvamVjdE5hbWUgKTsKLQkgIElQcm9qZWN0IHByb2plY3QgICAgID0gKElQcm9qZWN0KVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKCBwcm9qZWN0UGF0aCApOwotCSAgU3RyaW5nICAgbW9kdWxlTmFtZSAgPSBKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJNb2R1bGVOYW1lKCBwcm9qZWN0ICk7Ci0JICAKLQkgIHJlc3VsdCA9IHByb2plY3ROYW1lICsgIi8iICsgbW9kdWxlTmFtZTsKLQl9Ci0JCi0JcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclByb2plY3RFQVIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclByb2plY3RFQVIoKQotICB7Ci0gICAgaWYgKHNlcnZpY2VFYXJQcm9qZWN0TmFtZV8hPW51bGwgJiYgc2VydmljZUVhclByb2plY3ROYW1lXy5sZW5ndGgoKT4wICYmIAotICAgICAgICBzZXJ2aWNlRWFyQ29tcG9uZW50TmFtZV8hPW51bGwgJiYgc2VydmljZUVhckNvbXBvbmVudE5hbWVfLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgcmV0dXJuIHNlcnZpY2VFYXJQcm9qZWN0TmFtZV8gKyAiLyIgKyBzZXJ2aWNlRWFyQ29tcG9uZW50TmFtZV87Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VydmVyUnVudGltZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUnVudGltZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJTZXJ2ZXIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUlkc18uZ2V0U2VydmVySWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZpY2VTY2VuYXJpb0lkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlU2NlbmFyaW9JZCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUlkc18uZ2V0VHlwZUlkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzdGFydFNlcnZpY2UuCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbiBnZXRTdGFydFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHN0YXJ0U2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc3RhcnRTZXJ2aWNlCi0gICAqICAgICAgICAgICAgVGhlIHN0YXJ0U2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGFydFNlcnZpY2UoQm9vbGVhbiBzdGFydFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLnN0YXJ0U2VydmljZSA9IHN0YXJ0U2VydmljZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRlc3RTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIEJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0ZXN0U2VydmljZQotICAgKiAgICAgICAgICAgIFRoZSB0ZXN0U2VydmljZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZShCb29sZWFuIHRlc3RTZXJ2aWNlKQotICB7Ci0gICAgdGhpcy50ZXN0U2VydmljZSA9IHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIEJvb2xlYW4gZ2V0UHVibGlzaCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBqMmVlVmVyc2lvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUoyRUVWZXJzaW9uKCkKLSAgewotICAJcmV0dXJuIGoyZWVWZXJzaW9uOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIHZlcnNpb24gVGhlIGoyZWVWZXJzaW9uIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VKMkVFVmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotICAJajJlZVZlcnNpb24gPSB2ZXJzaW9uOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSB3ZWIgc2VydmljZSBwcm9qZWN0IG5lZWRzIHRvIGJlIGluIGFuIEVBUiBwcm9qZWN0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U2VydmljZU5lZWRFQVIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VOZWVkRUFSXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZU5lZWRFQVIoYm9vbGVhbiBzZXJ2aWNlTmVlZEVBUikKLSAgewotICAgIHNlcnZpY2VOZWVkRUFSXyA9IHNlcnZpY2VOZWVkRUFSOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgdGhlIHdlYiBzZXJ2aWNlIHByb2plY3QgaXMgYW4gRUpCIHByb2plY3QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRJc1NlcnZpY2VQcm9qZWN0RUpCKCkKLSAgewotICAgIC8vSWYgdGhlIHR5cGUvc2VydmVyL3J1bnRpbWUgc3VnZ2VzdHMgdGhhdCBhbiBFSkIgcHJvamVjdAotICAgIC8vaXMgcmVxdWlyZWQsIHJldHVybiB0cnVlLgotICAgIGJvb2xlYW4gZWpiUmVxdWlyZWQgPSBmYWxzZTsKLSAgICBib29sZWFuIGVqYlJlcXVpcmVkMiA9IGZhbHNlOwotCS8vIHJza3JlZwotICAgIC8vV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWdpc3RyeSA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgaWYgKHNlcnZpY2VJZHNfICE9IG51bGwpCi0gICAgeyAgICAgIAotICAgICAgLy9TdHJpbmcgc2VydmVyVHlwZUlkID0gd3NzcnRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoc2VydmljZUlkc18uZ2V0U2VydmVySWQoKSkuZ2V0SWQoKTsKLQkgIC8vU3RyaW5nIHNlcnZlclR5cGVJZCA9IHdzc3J0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlckJ5RmFjdG9yeUlkKHNlcnZpY2VJZHNfLmdldFNlcnZlcklkKCkpLmdldElkKCk7Ci0gICAgICAvL2VqYlJlcXVpcmVkID0gd3NzcnRSZWdpc3RyeS5yZXF1aXJlc0VKQk1vZHVsZUZvcihzZXJ2ZXJUeXBlSWQsIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpLCBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0JICBlamJSZXF1aXJlZCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMucmVxdWlyZXNFSkJNb2R1bGVGb3Ioc2VydmljZUlkc18uZ2V0U2VydmVySWQoKSwgc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCksIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpKTsKLSAgICAgIC8vZWpiUmVxdWlyZWQyID0gd3NzcnRSZWdpc3RyeS5yZXF1aXJlc0VKQlByb2plY3Qoc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpOyAKLQkgIGVqYlJlcXVpcmVkMiA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMucmVxdWlyZXNFSkJQcm9qZWN0KHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpLCBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0gICAgfQotCi0JLy8gcnNrcmVnCi0gICAgcmV0dXJuIChlamJSZXF1aXJlZCB8fCBlamJSZXF1aXJlZDIpOyAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbFBhcnNlcl8uCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgaWYoIHdzZGxQYXJzZXJfID09IG51bGwgKQotICAgIHsKLSAgICAgIHdzZGxQYXJzZXJfID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7ICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHdzZGxQYXJzZXJfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFBhcnNlcl8gVGhlIHdzZGxQYXJzZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdzZGxQYXJzZXIgKQotICB7Ci0gICAgd3NkbFBhcnNlcl8gPSB3c2RsUGFyc2VyOwotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3ROYW1lKFN0cmluZyBzZXJ2aWNlUHJvamVjdE5hbWUpCi0gIHsKLSAgICB0aGlzLnNlcnZpY2VQcm9qZWN0TmFtZV8gPSBzZXJ2aWNlUHJvamVjdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ29tcG9uZW50TmFtZShTdHJpbmcgcykKLSAgewotICAgIHNlcnZpY2VDb21wb25lbnROYW1lXyA9IHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRWFyUHJvamVjdE5hbWUoU3RyaW5nIHNlcnZpY2VFYXJQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuc2VydmljZUVhclByb2plY3ROYW1lXyA9IHNlcnZpY2VFYXJQcm9qZWN0TmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUVhckNvbXBvbmVudE5hbWUoU3RyaW5nIHMpCi0gIHsKLSAgICBzZXJ2aWNlRWFyQ29tcG9uZW50TmFtZV8gPSBzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL1NlcnZlckV4dGVuc2lvbkZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMTgyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuRXh0ZW5zaW9uRnJhZ21lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50IGV4dGVuZHMgRXh0ZW5zaW9uRnJhZ21lbnQKLXsgIAotICBwdWJsaWMgU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQoKQotICB7Ci0gICAgc2V0RXh0ZW5zaW9uUmVnaXN0cnkoIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkgICk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCggU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgc3VwZXIoIGZyYWdtZW50ICk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgc2V0RXh0ZW5zaW9uSWRzKCBuZXcgU3RyaW5nW117IGlkcy5nZXRUeXBlSWQoKSwgaWRzLmdldFJ1bnRpbWVJZCgpLCBpZHMuZ2V0U2VydmVySWQoKSB9ICk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotICAgIHJldHVybiBuZXcgU2VydmVyRXh0ZW5zaW9uRnJhZ21lbnQoIHRoaXMgKTsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9TZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTAxODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgLy9wcml2YXRlIFN0cmluZyAgICAgICAgICAgIHdzZGxVUklfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdzZGxQYXJzZXJfOwotCXByaXZhdGUgSVdlYlNlcnZpY2UgCQkJd2ViU2VydmljZV87Ci0gIAotICBwcml2YXRlIFN0cmluZyBleGlzdGluZ1NlcnZlcklkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZWFyUHJvamVjdE5hbWVfOwotICBwcml2YXRlIGJvb2xlYW4gaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF8gPSBmYWxzZTsKLSAgCi0gIHByaXZhdGUgSVNlcnZlciBmRXhpc3RpbmdTZXJ2ZXIgPSBudWxsOwotICAKLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvYWJsZSgpewotICAJcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHVuZG8oRW52aXJvbm1lbnQgZW52KXsKLQkJCi0KLSAgCVN0YXR1cyBzdGF0ID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCQotCQkvL0NvbW1lbnRpbmcgb3V0IGFsbCBleHRyYW5zZW91cyBzZXZlciBzdGFydHVwcwotCQkvKgotICAgIHRyeQl7Ci0gICAgCQotICAgICAgLy8gY2hlY2sgZXhpc3RpbmdTZXJ2ZXIKLSAgICAgIGlmIChmRXhpc3RpbmdTZXJ2ZXIhPW51bGwpIHsKLSAgICAJCi0gICAgICAgIC8vIGdldCBFQVIgcHJvamVjdAotICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgICAgIGlmIChlYXJQcm9qZWN0TmFtZV8hPW51bGwgJiYgZWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpPjApIHsKLSAgICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lXyk7Ci0gICAgCX0gICAgCQotICAgIAkKLSAgICAJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgIAlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChmRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgIAlpZiAoZWFyUHJvamVjdCE9bnVsbCkgewotICAgIAkJc3RhcnRTZXJ2ZXJDb21tYW5kLnJ1blByZVNlcnZlckNvbmZpZyhmRXhpc3RpbmdTZXJ2ZXIsIGVhclByb2plY3QpOwotICAgIAl9Ci0gICAgICB9Ci0gICAJfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkgewotICAgICAgSVN0YXR1cyBlbWJlZGRlZFN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgc3RhdCA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXQpOwotICAJCXJldHVybiBzdGF0OwotICAJfSAgCQotICAJKi8KLSAgCXJldHVybiBzdGF0OwotICB9ICAKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KXsKLSAgCQotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAgCQotICAJLy8gQ29tbWVudGluZyBvdXQgYWxsIGV4dHJhbmVvdXMgc2VydmVyIHN0YXJ0dXBzCi0JCS8qCi0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICBJU2VydmVyIGV4aXN0aW5nU2VydmVyID1udWxsOwotICAgIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7IAotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgdGhpc1NlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJJZCA9IG51bGw7Ci0gICAgICBpZiAodGhpc1NlcnZlciE9bnVsbCkgewotICAgICAgCXdjID0gdGhpc1NlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotICAgICAgICB0aGlzU2VydmVySWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh0aGlzU2VydmVySWQuZXF1YWxzKGV4aXN0aW5nU2VydmVySWRfKSkKLSAgICAgICAgZXhpc3RpbmdTZXJ2ZXIgPSB0aGlzU2VydmVyOwotICAgIH0gICAgCQotICAgIHRyeQl7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGVhclByb2plY3ROYW1lXyE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgICAgfSAgICAJCi0gICAgCQotICAgCQlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAJCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChleGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgIAlpZiAoZWFyUHJvamVjdCE9bnVsbCkgewotICAgICAJCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5Qb3N0U2VydmVyQ29uZmlnKGV4aXN0aW5nU2VydmVyLCBlYXJQcm9qZWN0KTsKLSAgICAgCQlmRXhpc3RpbmdTZXJ2ZXIgPSBleGlzdGluZ1NlcnZlcjsKLSAgICAgCX0KLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gIAkqLwotICAJcmV0dXJuIHN0YXR1czsgICAgICAJCi0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSB3c2RsVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVVJJKCkKLSAgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFdzZGxVUkwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFVSSQotICAgKiAgICAgICAgICAgIFRoZSB3c2RsVVJJIHRvIHNldC4KLSAgICovCi0JLyoKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHdzZGxVUklfID0gd3NkbFVSSTsKLSAgfQotICAqLwotCQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugd3MpCi0JewotCQl3ZWJTZXJ2aWNlXyA9IHdzOwotCX0KLQkKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3NkbFBhcnNlcl8uCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgaWYoIHdzZGxQYXJzZXJfID09IG51bGwgKQotICAgIHsKLSAgICAgIHdzZGxQYXJzZXJfID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7ICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHdzZGxQYXJzZXJfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gd3NkbFBhcnNlcl8gVGhlIHdzZGxQYXJzZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdzZGxQYXJzZXJfKQotICB7Ci0gICAgdGhpcy53c2RsUGFyc2VyXyA9IHdzZGxQYXJzZXJfOwotICB9Ci0vKioKLSAqIEBwYXJhbSBlYXJQcm9qZWN0TmFtZSBUaGUgZWFyUHJvamVjdE5hbWUgdG8gc2V0LgotICovCi1wdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0TmFtZShTdHJpbmcgZWFyUHJvamVjdE5hbWUpIHsKLQl0aGlzLmVhclByb2plY3ROYW1lXyA9IGVhclByb2plY3ROYW1lOwotfQotLyoqCi0gKiBAcGFyYW0gZXhpc3RpbmdTZXJ2ZXJJZCBUaGUgZXhpc3RpbmdTZXJ2ZXJJZCB0byBzZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVySWQoU3RyaW5nIGV4aXN0aW5nU2VydmVySWQpIHsKLQl0aGlzLmV4aXN0aW5nU2VydmVySWRfID0gZXhpc3RpbmdTZXJ2ZXJJZDsKLX0KLQotLyoqCi0gKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzUmVzdGFydFByb2plY3ROZWVkZWQuCi0gKi8KLXB1YmxpYyBib29sZWFuIGdldElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQoKSB7Ci0JcmV0dXJuIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfOwotfQotLyoqCi0gKiBAcGFyYW0gaXNSZXN0YXJ0UHJvamVjdE5lZWRlZCBUaGUgaXNSZXN0YXJ0UHJvamVjdE5lZWRlZCB0byBzZXQuCi0gKi8KLXB1YmxpYyB2b2lkIHNldElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQoYm9vbGVhbiBpc1Jlc3RhcnRQcm9qZWN0TmVlZGVkKSB7Ci0JdGhpcy5pc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyA9IGlzUmVzdGFydFByb2plY3ROZWVkZWQ7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVNlcnZlckZhY3RvcnlJZCgpCi17Ci0JcmV0dXJuIHdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVyRmFjdG9yeUlkKCk7Ci19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVNlcnZlckluc3RhbmNlSWQoKQotewotCXJldHVybiB3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4Yjg4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0Fic3RyYWN0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU9iamVjdFNlbGVjdGlvbldpZGdldAotewotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICAvLyBzdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLSAgfQotCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgLy8gc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIC8vICBzdWJjbGFzcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICAvLyAgc3ViY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjZlM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIEVKQlNlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLQotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBPYmplY3Qgc2VsID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbil2YWx1ZSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAoc2VsIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigoKEVudGVycHJpc2VCZWFuKXNlbCkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyY2Y2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0VKQlNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgRUpCU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQgaW1wbGVtZW50cyBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIENvbWJvIGVhckxpc3Q7Ci0gIHByaXZhdGUgRUpCVGFibGVWaWV3ZXIgYmVhbkxpc3Q7Ci0gIHByaXZhdGUgSVZpcnR1YWxDb21wb25lbnRbXSBlYXJDb21wb25lbnRzOwotICAvL3Jza2VqYiBwcml2YXRlIEVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0czsKLSAgcHJpdmF0ZSBJbnRlZ2VyIHNlbGVjdGVkQmVhbkluZGV4ID0gbnVsbDsKLSAgcHJpdmF0ZSBWZWN0b3IgZWpiQmVhbk5hbWVzOwotICBwcml2YXRlIFZlY3RvciBlamJDb21wb25lbnROYW1lczsKLSAgcHJpdmF0ZSBWZWN0b3IgZWpiQ29tcG9uZW50UHJvamVjdE5hbWVzOwotICAvL3Jza2VqYiBwcml2YXRlIFZlY3RvciBlamJQcm9qZWN0TmFtZXM7Ci0gIHByaXZhdGUgTGlzdGVuZXIgIHN0YXR1c0xpc3RlbmVyXzsKLSAgLyogQ09OVEVYVF9JRCBQRUJEMDAwMSBmb3IgdGhlIEVBUiBQcm9qZWN0cyBkcm9wLWRvd24gYm94ICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEVCRF9FQVJfUFJPSkVDVFMgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLlBFQkQwMDAxIjsKLSAgLyogQ09OVEVYVF9JRCBQRUJEMDAwMiBmb3IgdGhlIHRhYmxlIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBiZWFuIG5hbWVzICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEVCRF9UQUJMRV9CRUFOX05BTUVTID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5QRUJEMDAwMiI7Ci0KLSAgcHVibGljIEVKQlNlbGVjdGlvbldpZGdldCgpCi0gIHsKLQllYXJDb21wb25lbnRzID0gSjJFRVV0aWxzLmdldEFsbEVBUkNvbXBvbmVudHMoKTsKLSAgICAvKiByc2tlamIgCi0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cygpOwotCQotCQotICAgIFZlY3RvciBlYXJWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZWFyVmVjdG9yLmFkZChwcm9qZWN0c1tpXS5nZXROYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBlYXJQcm9qZWN0cyA9IChFQVJOYXR1cmVSdW50aW1lW10pIGVhclZlY3Rvci50b0FycmF5KG5ldyBFQVJOYXR1cmVSdW50aW1lWzBdKTsKLQlyc2tlamIgKi8KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRCZWFuKCkKLSAgewotICAgIGlmIChzZWxlY3RlZEJlYW5JbmRleCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKSAoZWpiQmVhbk5hbWVzLmVsZW1lbnRBdChzZWxlY3RlZEJlYW5JbmRleC5pbnRWYWx1ZSgpKSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFByb2plY3QoKQotICB7Ci0gICAgaWYgKHNlbGVjdGVkQmVhbkluZGV4ICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIChTdHJpbmcpIChlamJDb21wb25lbnRQcm9qZWN0TmFtZXMuZWxlbWVudEF0KHNlbGVjdGVkQmVhbkluZGV4LmludFZhbHVlKCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBzdGF0dXNMaXN0ZW5lcl8gID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIENvbXBvc2l0ZSBwcm9qZWN0Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBwcm9qZWN0Q29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIHByb2plY3RDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotICAgIG5ldyBMYWJlbChwcm9qZWN0Q29tcG9zaXRlLCBTV1QuTlVMTCkuc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9FQVJfUFJPSkVDVFMiKSk7Ci0gICAgZWFyTGlzdCA9IG5ldyBDb21ibyhwcm9qZWN0Q29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgZWFyTGlzdC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBlYXJMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpCi0gICAgICB7Ci0gICAgICAgIENvbWJvIHdpZGdldCA9IChDb21ibykgKGV2dC53aWRnZXQpOwotICAgICAgICBzZXRCZWFuTGlzdChlYXJDb21wb25lbnRzW3dpZGdldC5nZXRTZWxlY3Rpb25JbmRleCgpXSk7Ci0gICAgICAgIHNlbGVjdGVkQmVhbkluZGV4ID0gbnVsbDsKLSAgICAgICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgfQotICAgIH0pOwotICAgIGFkZEVBUk5hbWVzVG9MaXN0KCk7Ci0gICAgZWFyTGlzdC5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX0VBUl9QUk9KRUNUUyIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGVhckxpc3QsIElORk9QT1BfUEVCRF9FQVJfUFJPSkVDVFMpOwotICAgIEdyb3VwIGJlYW5Db21wb3NpdGUgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBiZWFuQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIGJlYW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotICAgIGJlYW5Db21wb3NpdGUuc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9FSkJfQkVBTl9OQU1FIikpOwotICAgIGJlYW5MaXN0ID0gbmV3IEVKQlRhYmxlVmlld2VyKGJlYW5Db21wb3NpdGUpOwotICAgIFRhYmxlIGJlYW5UYWJsZSA9IGJlYW5MaXN0LmdldFRhYmxlKCk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IDEwMDsKLSAgICBiZWFuVGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgYmVhblRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldnQpCi0gICAgICB7Ci0gICAgICAgIFRhYmxlIHRhYmxlID0gKFRhYmxlKSAoZXZ0LndpZGdldCk7Ci0gICAgICAgIHNlbGVjdGVkQmVhbkluZGV4ID0gbmV3IEludGVnZXIodGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0gICAgICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBiZWFuVGFibGUuc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9UQUJMRV9CRUFOX05BTUVTIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYmVhblRhYmxlLCBJTkZPUE9QX1BFQkRfVEFCTEVfQkVBTl9OQU1FUyk7Ci0gICAgaWYgKGVhckNvbXBvbmVudHMgIT0gbnVsbCAmJiBlYXJDb21wb25lbnRzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgc2V0QmVhbkxpc3QoZWFyQ29tcG9uZW50c1swXSk7Ci0gICAgfQotICAgIGJlYW5UYWJsZS5nZXRDb2x1bW4oMCkucGFjaygpOwotICAgIGJlYW5UYWJsZS5nZXRDb2x1bW4oMSkucGFjaygpOwotICAgIC8vIFRoaXMgaXMgYSBkdW1teSBsYWJlbCB0aGF0IGZvcmNlcyB0aGUgc3RhdHVzIGxhYmVsIGludG8gdGhlIHNlY29uZAotICAgIC8vIGNvbHVtbi4KLSAgICBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTlVMTCkuc2V0VGV4dCgiIik7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkRUFSTmFtZXNUb0xpc3QoKQotICB7Ci0gICAgaWYgKGVhckNvbXBvbmVudHMgIT0gbnVsbCAmJiBlYXJDb21wb25lbnRzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVhckNvbXBvbmVudHMubGVuZ3RoOyBpbmRleCsrKQotICAgICAgewotICAgICAgICBlYXJMaXN0LmFkZChlYXJDb21wb25lbnRzW2luZGV4XS5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgZWFyTGlzdC5zZXRUZXh0KGVhckxpc3QuZ2V0SXRlbSgwKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldEJlYW5MaXN0KElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCkKLSAgewotICAgIElWaXJ0dWFsQ29tcG9uZW50W10gZWpiQ29tcG9uZW50c0FycmF5ID0gSjJFRVV0aWxzLmdldFJlZmVyZW5jaW5nRUpCQ29tcG9uZW50c0Zyb21FQVIoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSwgZWFyQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0gICAgVGFibGUgYmVhblRhYmxlID0gYmVhbkxpc3QuZ2V0VGFibGUoKTsKLSAgICBiZWFuVGFibGUucmVtb3ZlQWxsKCk7Ci0gICAgZWpiQmVhbk5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGVqYkNvbXBvbmVudE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGVqYkNvbXBvbmVudFByb2plY3ROYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWpiQ29tcG9uZW50c0FycmF5Lmxlbmd0aDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFSkJBcnRpZmFjdEVkaXQgIGVqYkVkaXQgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgZWpiRWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkKGVqYkNvbXBvbmVudHNBcnJheVtpbmRleF0pOwotICAgICAgICBFSkJSZXNvdXJjZSBlamJSZXMgPSBlamJFZGl0LmdldEVKQkphclhtaVJlc291cmNlKCk7Ci0gICAgICAgIEVKQkphciBqYXIgPSBlamJSZXMuZ2V0RUpCSmFyKCk7Ci0gICAgICAgIFZlY3RvciBiZWFucyA9IEoyRUVVdGlscy5nZXRCZWFuTmFtZXMoamFyKTsKLSAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBlamJDb21wb25lbnRzQXJyYXlbaW5kZXhdLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gZWpiQ29tcG9uZW50c0FycmF5W2luZGV4XS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotICAgICAgICBlamJCZWFuTmFtZXMuYWRkQWxsKGJlYW5zKTsKLSAgICAgICAgZWpiQ29tcG9uZW50TmFtZXMuYWRkQWxsKENvbGxlY3Rpb25zLm5Db3BpZXMoYmVhbnMuc2l6ZSgpLCBjb21wb25lbnROYW1lKSk7Ci0gICAgICAgIGVqYkNvbXBvbmVudFByb2plY3ROYW1lcy5hZGRBbGwoQ29sbGVjdGlvbnMubkNvcGllcyhiZWFucy5zaXplKCksIHByb2plY3ROYW1lKSk7ICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZmluYWxseSB7Ci0gICAgICAgIGlmIChlamJFZGl0IT1udWxsKQotICAgICAgICAgIGVqYkVkaXQuZGlzcG9zZSgpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICBiZWFuTGlzdC5zZXREYXRhKGVqYkJlYW5OYW1lcywgZWpiQ29tcG9uZW50TmFtZXMpOwotICAgIGJlYW5MaXN0LnNldElucHV0KGVqYkJlYW5OYW1lcyk7ICAgIAotICAgIAotICB9Ci0gIAotICAvKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgLyoKLSAgcHJpdmF0ZSB2b2lkIHNldEJlYW5MaXN0KEVBUk5hdHVyZVJ1bnRpbWUgZWFyUHJvamVjdCkKLSAgewotICAgIFZlY3RvciBlamJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFSkJQcm9qZWN0cyhlYXJQcm9qZWN0KTsKLSAgICBUYWJsZSBiZWFuVGFibGUgPSBiZWFuTGlzdC5nZXRUYWJsZSgpOwotICAgIGJlYW5UYWJsZS5yZW1vdmVBbGwoKTsKLSAgICBlamJCZWFuTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgLy9yc2tlamIgZWpiUHJvamVjdE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGVqYkNvbXBvbmVudE5hbWVzID0gbmV3IFZlY3RvcigpOwotICAgIGVqYkNvbXBvbmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVqYlByb2plY3RzLnNpemUoKTsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFSkJOYXR1cmVSdW50aW1lIGVqYk5hdHVyZSA9IChFSkJOYXR1cmVSdW50aW1lKSAoZWpiUHJvamVjdHMuZWxlbWVudEF0KGluZGV4KSk7Ci0gICAgICBFSkJQcm9qZWN0UmVzb3VyY2VzIGVqYlJlc291cmNlID0gbmV3IEVKQlByb2plY3RSZXNvdXJjZXMoZWpiTmF0dXJlLmdldFByb2plY3QoKSk7Ci0gICAgICBFSkJKYXIgamFyID0gZWpiUmVzb3VyY2UuZ2V0RUpCSmFyKCk7Ci0gICAgICBWZWN0b3IgYmVhbnMgPSBKMkVFVXRpbHMuZ2V0QmVhbk5hbWVzKGphcik7Ci0gICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBlamJOYXR1cmUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLSAgICAgIGVqYkJlYW5OYW1lcy5hZGRBbGwoYmVhbnMpOwotICAgICAgZWpiUHJvamVjdE5hbWVzLmFkZEFsbChDb2xsZWN0aW9ucy5uQ29waWVzKGJlYW5zLnNpemUoKSwgcHJvamVjdE5hbWUpKTsKLSAgICAgIGVqYlJlc291cmNlLmNsZWFudXAoKTsKLSAgICB9Ci0gICAgYmVhbkxpc3Quc2V0RGF0YShlamJCZWFuTmFtZXMsIGVqYlByb2plY3ROYW1lcyk7Ci0gICAgYmVhbkxpc3Quc2V0SW5wdXQoZWpiQmVhbk5hbWVzKTsKLSAgfQotICAqLwotICAKLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCAmJiAhaW5pdGlhbFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2Vzc2lvbikKLSAgICAgIHsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pIG9iamVjdDsKLSAgICAgICAgRUpCSmFyIGphciA9IHNlc3Npb24uZ2V0RWpiSmFyKCk7Ci0gICAgICAgIGlmIChqYXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWFyQ29tcG9uZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0JCQkgICAgICBJVmlydHVhbENvbXBvbmVudFtdIGVqYkNvbXBvbmVudHMgPSBKMkVFVXRpbHMuZ2V0UmVmZXJlbmNpbmdFSkJDb21wb25lbnRzRnJvbUVBUihlYXJDb21wb25lbnRzW2ldLmdldFByb2plY3QoKSwgZWFyQ29tcG9uZW50c1tpXS5nZXROYW1lKCkpOwotCQkJICAgICAgZm9yIChpbnQgaj0wOyBqIDxlamJDb21wb25lbnRzLmxlbmd0aDsgaisrKQotCQkJICAgICAgewotICAgICAgICAgICAgICBFSkJBcnRpZmFjdEVkaXQgIGVqYkVkaXQgPSBudWxsOwotICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVqYkVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChlamJDb21wb25lbnRzW2pdKTsKLSAgICAgICAgICAgICAgICBFSkJSZXNvdXJjZSBlamJSZXMgPSBlamJFZGl0LmdldEVKQkphclhtaVJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVqYlJlcy5nZXRFSkJKYXIoKSA9PSBqYXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZWFyTGlzdC5zZXRUZXh0KGVhckNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgIHNldEJlYW5MaXN0KGVhckNvbXBvbmVudHNbaV0pOwotICAgICAgICAgICAgICAgICAgYmVhbkxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoZWpiQmVhbk5hbWVzLmluZGV4T2Yoc2Vzc2lvbi5nZXROYW1lKCkpKX0pKTsKLSAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQmVhbkluZGV4ID0gbmV3IEludGVnZXIoZWpiQmVhbk5hbWVzLmluZGV4T2Yoc2Vzc2lvbi5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVqYkVkaXQhPW51bGwpCi0gICAgICAgICAgICAgICAgICBlamJFZGl0LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgfQotCQkJCQotCQkJICAgICAgfQotCQkJICAgICAgLyogcnNrZWpiCi0gICAgICAgICAgICBWZWN0b3IgZWpiUHJvamVjdHMgPSBKMkVFVXRpbHMuZ2V0RUpCUHJvamVjdHMoZWFyUHJvamVjdHNbaV0pOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGVqYlByb2plY3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVKQlByb2plY3RSZXNvdXJjZXMgZWpiUmVzb3VyY2UgPSBuZXcgRUpCUHJvamVjdFJlc291cmNlcygoKEVKQk5hdHVyZVJ1bnRpbWUpIGl0Lm5leHQoKSkuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgICAgaWYgKGVqYlJlc291cmNlLmdldEVKQkphcigpID09IGphcikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVhckxpc3Quc2V0VGV4dChlYXJQcm9qZWN0c1tpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBzZXRCZWFuTGlzdChlYXJQcm9qZWN0c1tpXSk7Ci0gICAgICAgICAgICAgICAgYmVhbkxpc3Quc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBJbnRlZ2VyW117bmV3IEludGVnZXIoZWpiQmVhbk5hbWVzLmluZGV4T2Yoc2Vzc2lvbi5nZXROYW1lKCkpKX0pKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEJlYW5JbmRleCA9IG5ldyBJbnRlZ2VyKGVqYkJlYW5OYW1lcy5pbmRleE9mKHNlc3Npb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgZWpiUmVzb3VyY2UuY2xlYW51cCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlamJSZXNvdXJjZS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9Ci0JCQkgICAgICByc2tlamIgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0T2JqZWN0U2VsZWN0aW9uKCkKLSAgewotICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYmVhbkxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbCAhPSBudWxsICYmICFzZWwuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHNlbEVKQk5hbWUgPSAoU3RyaW5nKSBlamJCZWFuTmFtZXMuZ2V0KCgoSW50ZWdlcikgb2JqZWN0KS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgaWYgKHNlbEVKQk5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBlYXJDb21wb25lbnRzW2Vhckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKV0uZ2V0UHJvamVjdCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gZWFyQ29tcG9uZW50c1tlYXJMaXN0LmdldFNlbGVjdGlvbkluZGV4KCldLmdldE5hbWUoKTsKLSAgICAgICAgICBJVmlydHVhbENvbXBvbmVudFtdIGVqYkNvbXBvbmVudHMgPSBKMkVFVXRpbHMuZ2V0UmVmZXJlbmNpbmdFSkJDb21wb25lbnRzRnJvbUVBUihwcm9qZWN0LCBuYW1lKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7IGk8ZWpiQ29tcG9uZW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFSkJBcnRpZmFjdEVkaXQgIGVqYkVkaXQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBlamJFZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiQ29tcG9uZW50c1tpXSk7Ci0gICAgICAgICAgICAgIEVKQlJlc291cmNlIGVqYlJlcyA9IGVqYkVkaXQuZ2V0RUpCSmFyWG1pUmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgRUpCSmFyIGphciA9IGVqYlJlcy5nZXRFSkJKYXIoKTsKLSAgICAgICAgICAgICAgamF2YS51dGlsLkxpc3Qgc2Vzc2lvbnMgPSBqYXIuZ2V0U2Vzc2lvbkJlYW5zKCk7Ci0gICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gc2Vzc2lvbnMuaXRlcmF0b3IoKTsgaXQyLmhhc05leHQoKTspCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbikgaXQyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VsRUpCTmFtZS5lcXVhbHMoc2Vzc2lvbi5nZXROYW1lKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgU2Vzc2lvbltde3Nlc3Npb259KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICBpZiAoZWpiRWRpdCE9bnVsbCkKLSAgICAgICAgICAgICAgICBlamJFZGl0LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgLyogcnNrZWpiCi0gICAgICAgICAgVmVjdG9yIGVqYlByb2plY3RzID0gSjJFRVV0aWxzLmdldEVKQlByb2plY3RzKGVhclByb2plY3RzW2Vhckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKV0pOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlamJQcm9qZWN0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVKQlByb2plY3RSZXNvdXJjZXMgZWpiUmVzb3VyY2UgPSBuZXcgRUpCUHJvamVjdFJlc291cmNlcygoKEVKQk5hdHVyZVJ1bnRpbWUpIGl0Lm5leHQoKSkuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIEVKQkphciBqYXIgPSBlamJSZXNvdXJjZS5nZXRFSkJKYXIoKTsKLSAgICAgICAgICAgIGphdmEudXRpbC5MaXN0IHNlc3Npb25zID0gamFyLmdldFNlc3Npb25CZWFucygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdDIgPSBzZXNzaW9ucy5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gKFNlc3Npb24pIGl0Mi5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChzZWxFSkJOYW1lLmVxdWFscyhzZXNzaW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlamJSZXNvdXJjZS5jbGVhbnVwKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBTZXNzaW9uW117c2Vzc2lvbn0pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlamJSZXNvdXJjZS5jbGVhbnVwKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJza2VqYiAqLwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0WzBdKTsKLSAgfQotICAKLSAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotICB7Ci0gICAgU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0U2VsZWN0ZWRQcm9qZWN0KCk7Ci0gICAgaWYgKHByb2plY3ROYW1lICE9IG51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICBpZiAoc2VsZWN0ZWRCZWFuSW5kZXggIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFN0cmluZykgKGVqYkNvbXBvbmVudE5hbWVzLmVsZW1lbnRBdChzZWxlY3RlZEJlYW5JbmRleC5pbnRWYWx1ZSgpKSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9ICAgIAotICAKLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgeyAgCQotICAgIGlmIChzZWxlY3RlZEJlYW5JbmRleCA9PSBudWxsKQotICAgIHsKLSAgICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIiIsU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0gICAgCi0gIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJUYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9FSkJUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGFmZDY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvRUpCVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotcHVibGljIGNsYXNzIEVKQlRhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgVmVjdG9yIGJlYW5OYW1lczsKLSAgcHJpdmF0ZSBWZWN0b3IgcHJvamVjdE5hbWVzOwotCi0gIHB1YmxpYyBFSkJUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgU3RyaW5nIGNvbHVtblByb3BlcnRpZXNbXSA9IHttc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9USVRMRV9FSkJfQkVBTl9OQU1FUyIpLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJUQUJMRV9USVRMRV9FSkJfUFJPSkVDVF9OQU1FIil9OwotICAgIFRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIHRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbaV0pOwotICAgICAgY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0gICAgICBsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgODAsIHRydWUpKTsKLSAgICB9Ci0gICAgdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLSAgICBzZXRDb250ZW50UHJvdmlkZXIobmV3IEVKQkNvbnRlbnRQcm92aWRlcigpKTsKLSAgICBzZXRMYWJlbFByb3ZpZGVyKG5ldyBFSkJMYWJlbFByb3ZpZGVyKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGF0YShWZWN0b3IgYmVhbk5hbWVzLCBWZWN0b3IgcHJvamVjdE5hbWVzKQotICB7Ci0gICAgdGhpcy5iZWFuTmFtZXMgPSBiZWFuTmFtZXM7Ci0gICAgdGhpcy5wcm9qZWN0TmFtZXMgPSBwcm9qZWN0TmFtZXM7Ci0gIH0KLSAgcHJpdmF0ZSBjbGFzcyBFSkJMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZWdlcikKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gKChJbnRlZ2VyKSBvYmplY3QpLmludFZhbHVlKCk7Ci0gICAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChTdHJpbmcpIChiZWFuTmFtZXMuZWxlbWVudEF0KGluZGV4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoU3RyaW5nKSAocHJvamVjdE5hbWVzLmVsZW1lbnRBdChpbmRleCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0gIHB1YmxpYyBjbGFzcyBFSkJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChiZWFuTmFtZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IHNpemUgPSBiZWFuTmFtZXMuc2l6ZSgpOwotICAgICAgICBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemVdOwotICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBuZXcgSW50ZWdlcihpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSGFuZGxlclRhYmxlSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9IYW5kbGVyVGFibGVJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YmU2ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9IYW5kbGVyVGFibGVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotCi0KLQotcHVibGljIGNsYXNzIEhhbmRsZXJUYWJsZUl0ZW0gewotICAKLSAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgaGFuZGxlck5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIHBvcnROYW1lOwotICBwcml2YXRlIGludCBpbmRleDsKLSAgCi0gIHByaXZhdGUgUG9ydENvbXBvbmVudCBwb3J0OwotICBwcml2YXRlIE9iamVjdCBoYW5kbGVyOwotICBwcml2YXRlIE9iamVjdCB3c0Rlc2NSZWY7Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlckNsYXNzTmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlckNsYXNzTmFtZSgpIHsKLSAgICByZXR1cm4gaGFuZGxlckNsYXNzTmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGhhbmRsZXJDbGFzc05hbWUgVGhlIGhhbmRsZXJDbGFzc05hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SGFuZGxlckNsYXNzTmFtZShTdHJpbmcgaGFuZGxlckNsYXNzTmFtZSkgewotICAgIHRoaXMuaGFuZGxlckNsYXNzTmFtZSA9IGhhbmRsZXJDbGFzc05hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlck5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJOYW1lKCkgewotICAgIHJldHVybiBoYW5kbGVyTmFtZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGhhbmRsZXJOYW1lIFRoZSBoYW5kbGVyTmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTmFtZShTdHJpbmcgaGFuZGxlck5hbWUpIHsKLSAgICB0aGlzLmhhbmRsZXJOYW1lID0gaGFuZGxlck5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcG9ydC4KLSAgICovCi0gIHB1YmxpYyBQb3J0Q29tcG9uZW50IGdldFBvcnQoKSB7Ci0gICAgcmV0dXJuIHBvcnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBwb3J0IFRoZSBwb3J0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnQoUG9ydENvbXBvbmVudCBwb3J0KSB7Ci0gICAgdGhpcy5wb3J0ID0gcG9ydDsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBoYW5kbGVyLgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRIYW5kbGVyKCkgewotICAgIHJldHVybiBoYW5kbGVyOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgaGFuZGxlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyKE9iamVjdCBoYW5kbGVyKSB7Ci0gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBwb3J0TmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7Ci0gICAgcmV0dXJuIHBvcnROYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcG9ydE5hbWUgVGhlIHBvcnROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBwb3J0TmFtZSkgewotICAgIHRoaXMucG9ydE5hbWUgPSBwb3J0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGluZGV4LgotICAgKi8KLSAgcHVibGljIGludCBnZXRJbmRleCgpIHsKLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KSB7Ci0gICAgdGhpcy5pbmRleCA9IGluZGV4OwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzRGVzY1JlZi4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0V3NEZXNjUmVmKCkgewotICAgIHJldHVybiB3c0Rlc2NSZWY7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB3c0Rlc2NSZWYgVGhlIHdzRGVzY1JlZiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXc0Rlc2NSZWYoT2JqZWN0IHdzRGVzY1JlZikgewotICAgIHRoaXMud3NEZXNjUmVmID0gd3NEZXNjUmVmOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L0lPYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSU9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFmYTAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSU9iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgZXh0cmEgbWV0aG9kcyB0aGF0IE9iamVjdCBTZWxlY3Rpb24gV2lkZ2V0cwotICogbmVlZCB0byBpbXBsZW1lbnQuICBPYmplY3QgU2VsZWN0aW9uIFdpZGdldHMgYXJlIGRpc3BsYXllZCBvbiBwYWdlIDIKLSAqIG9mIHRoZSBXZWIgc2VydmljZXMgd2l6YXJkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgLyoqCi0gICAqIFRoZSBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIHNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICogdmFsdWUgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gdGhlIGluaXRpYWwgc2VsZWN0aW9uIHRoZSB1c2VyIHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbik7Ci0gIAotICAvKioKLSAgICogVGhlIGludGVudCBvZiB0aGUgT2JqZWN0IFNlbGVjdGlvbiBXaWRnZXQgaXMgdGhhdCB0aGUgdXNlciBoYXMKLSAgICogdGhlIG9wcG9ydHVuaXR5IGNoYW5nZS9maW5kIHRoZSBvYmplY3QgdGhhdCB0aGV5IHdhbnQgdG8gdHVybiBpbnRvCi0gICAqIGEgV2ViIHNlcnZpY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGFuIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdCB0aGF0IHRoZSB1c2VyCi0gICAqIHdhbnQgdG8gdHVybiBpbnRvIGEgV2ViIHNlcnZpY2UuICBUaGlzIG9iamVjdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4KLSAgICogdGhlIGluaXRpYWxTZWxlY3Rpb24gcGFzc2VkIGluIGJ5IHRoZSBzZXRJbml0aWFsU2VsZWN0aW9uIG1ldGhvZC4KLSAgICovCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKTsKLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgd2hldGhlciB0aGUgb2JqZWN0U2VsZWN0aW9uIHBhcmFtZXRlciBpcyB2YWxpZCBmb3IKLSAgICogdGhpcyBPYmplY3Qgc2VsZWN0aW9uIHdpZGdldC4gIEFuIGVycm9yIHN0YXR1cyBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICogaWYgdGhpcyBvYmplY3QgaXMgbm90IHZhbHVlLiAgT3RoZXJ3aXNlLCBhbmQgb2sgc3RhdHVzIHNob3VsZCBiZQotICAgKiByZXR1cm5lZAotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdFNlbGVjdGlvbiB0aGUgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZC4KLSAgICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIElQcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGlvbgotICAgKiBvYmplY3QgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIHdpdGggdGhpcyB3aWRnZXQuICBUaGUgdmFsdWUgY2FuIGJlIAotICAgKiBudWxsIGlmIHRoZXJlIGlzIG5vIElQcm9qZWN0IGZvciB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgSVZpcnR1YWxDb21wb25lbnQgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0aW9uCi0gICAqIG9iamVjdCB0aGF0IHRoZSB1c2VyIGhhcyBjaG9zZW4gd2l0aCB0aGlzIHdpZGdldC4gIFRoZSB2YWx1ZSBjYW4gYmUgCi0gICAqIG51bGwgaWYgdGhlcmUgaXMgbm8gSVZpcnR1YWxDb21wb25lbnQgZm9yIHRoaXMgb2JqZWN0Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKTsgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSmF2YUJlYW5TZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjJkMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUJlYW5TZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWwgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZhbHVlKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXB1dGVGdWxseVF1YWxpZmllZEphdmFOYW1lKChJRmlsZSlzZWwpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpCi0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZSByZXMgPSAoKElDb21waWxhdGlvblVuaXQpc2VsKS5nZXRSZXNvdXJjZSgpOwotICAgICAgICBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbXB1dGVGdWxseVF1YWxpZmllZEphdmFOYW1lKChJRmlsZSlyZXMpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZUZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoSUZpbGUgcmVzb3VyY2UpCi0gIHsKLSAgICBJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICBTdHJpbmcgYmFzZW5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0gICAgU3RyaW5nIGJlYW5DbGFzcyA9ICIiOwotICAgIGlmIChiYXNlbmFtZSAhPSBudWxsICYmIGJhc2VuYW1lLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmVhblBhY2thZ2UgPSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHMuZ2V0SmF2YVJlc291cmNlUGFja2FnZU5hbWUocGF0aCk7Ci0gICAgICBiZWFuQ2xhc3MgPSAoYmVhblBhY2thZ2UgPT0gbnVsbCA/IGJhc2VuYW1lIDogKGJlYW5QYWNrYWdlICsgIi4iICsgYmFzZW5hbWUpKTsKLSAgICAgIGlmIChiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIikpCi0gICAgICAgIGJlYW5DbGFzcyA9IGJlYW5DbGFzcy5zdWJzdHJpbmcoMCwgYmVhbkNsYXNzLmxhc3RJbmRleE9mKCcuJykpOwotICAgIH0KLSAgICByZXR1cm4gYmVhbkNsYXNzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KYXZhQmVhblNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODZlZGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSmF2YUJlYW5TZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5pbXBsLlBvcnRDb21wb25lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5pbXBsLlNlcnZpY2VJbXBsQmVhbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmRpYWxvZy5EaWFsb2dVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQmVhblNlbGVjdGlvbldpZGdldCBleHRlbmRzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0IGltcGxlbWVudHMgSU9iamVjdFNlbGVjdGlvbldpZGdldAotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBJUHJvamVjdCAgICAgICAgICAgc2VydmVyUHJvamVjdF8gPSBudWxsOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lXyA9IG51bGw7Ci0gIHByaXZhdGUgQ29tcG9zaXRlICAgICAgICAgIHBhcmVudF8gPSBudWxsOwotICBwcml2YXRlIElXaXphcmRDb250YWluZXIgICBjb250ZXh0XyA9IG51bGw7Ci0gIHByaXZhdGUgSmF2YVJlc291cmNlRmlsdGVyIGZpbHRlcl8gPSBuZXcgSmF2YVJlc291cmNlRmlsdGVyKCk7Ci0gIHByaXZhdGUgSVJlc291cmNlICAgICAgICAgIGluaXRpYWxSZXNvdXJjZV8gPSBudWxsOwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICAKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAxIGZvciB0aGUgQmVhbiBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUEJDTF9QQUdFID0gIlBCQ0wwMDAxIjsKLSAgCi0gIHByaXZhdGUgVGV4dCBiZWFuQ2xhc3NUZXh0XzsKLSAgLypDT05URVhUX0lEIFBCQ0wwMDAyIGZvciB0aGUgQmVhbiBTZWxlY3Rpb24gZmllbGQgb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfVEVYVF9CRUFOX0NMQVNTID0gIlBCQ0wwMDAyIjsKLQotICBwcml2YXRlIEJ1dHRvbiBiZWFuQ2xhc3NCcm93c2VCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUEJDTDAwMDMgZm9yIHRoZSBCZWFuIENsYXNzIEJyb3dzZSBidXR0b24gb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFID0gIlBCQ0wwMDAzIjsKLQotICBwcml2YXRlIEJ1dHRvbiBiZWFuUmVzb3VyY2VCcm93c2VCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUEJDTDAwMDQgZm9yIHRoZSBCZWFuIFJlc291cmNlIEJyb3dzZSBidXR0b24gb2YgdGhlIEJlYW4gU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fUkVTT1VSQ0VfQlJPV1NFID0gIlBCQ0wwMDA0IjsKLSAgIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsgCi0gICAgCi0gICAgcGFyZW50XyA9IHBhcmVudDsKLSAgICAKLSAgICBDb21wb3NpdGUgZ3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCA0ICk7Ci0gICAgCi0gICAgZ3JvdXAuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUEJDTF9QQUdFIikgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBncm91cCwgcGx1Z2luSWRfICsgIi4iICsgSU5GT1BPUF9QQkNMX1BBR0UgKTsKLSAgICAKLSAgICBiZWFuQ2xhc3NUZXh0XyA9IHVpVXRpbHMuY3JlYXRlVGV4dCggZ3JvdXAsICJMQUJFTF9CRUFOX0NMQVNTX05BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QQkNMX1RFWFRfQkVBTl9DTEFTUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUEJDTF9URVhUX0JFQU5fQ0xBU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBiZWFuQ2xhc3NUZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lcigKLSAgICAgIG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZU1vZGlmeUJlYW5DbGFzc1RleHQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgCi0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggZ3JvdXAsICJCVVRUT05fQlJPV1NFX0NMQVNTRVMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BCQ0xfQlVUVE9OX0JFQU5fQ0xBU1NfQlJPV1NFICk7Ci0gICAgYmVhbkNsYXNzQnJvd3NlQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCBldnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCcm93c2VDbGFzc2VzKCk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgYmVhblJlc291cmNlQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggZ3JvdXAsICJCVVRUT05fQlJPV1NFX0ZJTEVTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QQkNMX0JVVFRPTl9CRUFOX1JFU09VUkNFX0JST1dTRSApOwotICAgIGJlYW5SZXNvdXJjZUJyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQnJvd3NlRmlsZXMoKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1vZGlmeUJlYW5DbGFzc1RleHQoKQotICB7Ci0gICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgc2VydmVyUHJvamVjdF8gPSBudWxsOwotICAgIHNlcnZlckNvbXBvbmVudE5hbWVfID0gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVCcm93c2VDbGFzc2VzKCkKLSAgewotICAgIFNoZWxsIHNoZWxsID0gcGFyZW50Xy5nZXRTaGVsbCgpOwotICAgIElUeXBlIGl0eXBlID0gRGlhbG9nVXRpbHMuYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoc2hlbGwsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSwgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkpOwotICAgIGlmIChpdHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJlYW5DbGFzc1RleHRfLnNldFRleHQoaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZSByZXMgPSBpdHlwZS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKHJlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVyUHJvamVjdF8gPSByZXMuZ2V0UHJvamVjdCgpOwotICAgICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBSZXNvdXJjZVV0aWxzLmdldENvbXBvbmVudE9mKHJlcy5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICBpZiAoY29tcCE9bnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lXyA9IGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJQcm9qZWN0XyA9IG51bGw7Ci0gICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZV8gPSBudWxsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkKLSAgICAgIHsKLSAgICAgICAgc2VydmVyUHJvamVjdF8gPSBudWxsOwotICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lXyA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlQnJvd3NlRmlsZXMoKQotICB7Ci0gICAgSVJlc291cmNlIHRvcFJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCk7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gRGlhbG9nVXRpbHMuYnJvd3NlUmVzb3VyY2VzKCBwYXJlbnRfLmdldFNoZWxsKCksIHRvcFJlc291cmNlLCBpbml0aWFsUmVzb3VyY2VfLCBmaWx0ZXJfICk7Ci0gICAgc2V0QmVhbkNsYXNzKHJlc291cmNlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldEJlYW5DbGFzcyhJUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICkKLSAgICB7Ci0gICAgICBJUGF0aCAgcGF0aCAgICAgPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgICAgU3RyaW5nIGJhc2VuYW1lID0gcGF0aC5sYXN0U2VnbWVudCgpOwotICAgICAgCi0gICAgICBpZiggYmFzZW5hbWUgIT0gbnVsbCAmJiBiYXNlbmFtZS5sZW5ndGgoKSA+IDAgKQotICAgICAgewotICAgICAgICBTdHJpbmcgYmVhblBhY2thZ2UgPSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHMuZ2V0SmF2YVJlc291cmNlUGFja2FnZU5hbWUocGF0aCk7Ci0gICAgICAgIFN0cmluZyBiZWFuQ2xhc3MgPSAoYmVhblBhY2thZ2UgPT0gbnVsbCA/IGJhc2VuYW1lIDogKGJlYW5QYWNrYWdlICsgIi4iICsgYmFzZW5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKSB8fCBiZWFuQ2xhc3MudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmNsYXNzIiApICkKLSAgICAgICAgewotICAgICAgICAgIGJlYW5DbGFzcyA9IGJlYW5DbGFzcy5zdWJzdHJpbmcoIDAsIGJlYW5DbGFzcy5sYXN0SW5kZXhPZignLicpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGJlYW5DbGFzc1RleHRfLnNldFRleHQoYmVhbkNsYXNzKTsKLSAgICAgICAgc2VydmVyUHJvamVjdF8gPSAgUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocGF0aCk7Ci0gICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBSZXNvdXJjZVV0aWxzLmdldENvbXBvbmVudE9mKHBhdGgpOwotICAgICAgICBpZiAoY29tcCE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWVfID0gY29tcC5nZXROYW1lKCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0QmVhbkNsYXNzKFNlcnZpY2VJbXBsQmVhbkltcGwgc2VydmljZUltcGwpCi0gIHsKLSAgICBpZiggc2VydmljZUltcGwgIT0gbnVsbCApCi0gICAgewotICAgICAgRU9iamVjdCBlT2JqZWN0ID0gc2VydmljZUltcGwuZUNvbnRhaW5lcigpOwotICAgICAgaWYoZU9iamVjdCBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnRJbXBsKXsKLSAgICAgIAlQb3J0Q29tcG9uZW50SW1wbCBwY2kgPSAoUG9ydENvbXBvbmVudEltcGwpZU9iamVjdDsKLSAgICAgIAlTdHJpbmcgYmVhbkNsYXNzID0gcGNpLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgCWJlYW5DbGFzc1RleHRfLnNldFRleHQoYmVhbkNsYXNzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXRCZWFuQ2xhc3MoQmVhbkxpbmsgc2VydmljZUltcGwpCi0gIHsKLSAgICBpZiggc2VydmljZUltcGwgIT0gbnVsbCApCi0gICAgewotICAgICAgRU9iamVjdCBlT2JqZWN0ID0gc2VydmljZUltcGwuZUNvbnRhaW5lcigpOwotICAgICAgaWYoZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbkltcGwpewotICAgICAgCXNldEJlYW5DbGFzcygoU2VydmljZUltcGxCZWFuSW1wbCllT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikKLSAgewotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgIWluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgCUlGaWxlIGlGaWxlID0gKElGaWxlKW9iamVjdDsKLSAgICAgIAlTdHJpbmcgZmlsZUV4dCA9IGlGaWxlLmdldEZpbGVFeHRlbnNpb24oKS50b0xvd2VyQ2FzZSgpOwotICAgICAgCWlmIChmaWxlRXh0LmVxdWFscygiamF2YSIpIHx8IGZpbGVFeHQuZXF1YWxzKCJjbGFzcyIpKQotICAgICAgICAgIHNldEJlYW5DbGFzcyhpRmlsZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotICAgICAgCXNldEJlYW5DbGFzcygoKElDb21waWxhdGlvblVuaXQpb2JqZWN0KS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2VJbXBsQmVhbkltcGwpCi0gICAgICAJc2V0QmVhbkNsYXNzKChTZXJ2aWNlSW1wbEJlYW5JbXBsKW9iamVjdCk7Ci0gICAgICBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEJlYW5MaW5rKQotICAgICAgCXNldEJlYW5DbGFzcygoQmVhbkxpbmspb2JqZWN0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJlYW5DbGFzc1RleHRfLmdldFRleHQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJQcm9qZWN0XzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmVyQ29tcG9uZW50TmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIFN0cmluZyBiZWFuQ2xhc3NOYW1lID0gYmVhbkNsYXNzVGV4dF8uZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBpZiAoYmVhbkNsYXNzTmFtZSA9PSBudWxsIHx8IGJlYW5DbGFzc05hbWUubGVuZ3RoKCkgPD0gMCkKLSAgICB7Ci0gICAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9NU0dfQkVBTl9DQU5OT1RfQkVfRU1QVFkiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9iamVjdFNlbGVjdGlvbikKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdiMzFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLQotcHVibGljIGNsYXNzIE9iamVjdFNlbGVjdGlvbkZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudCBpbXBsZW1lbnRzIENvbmRpdGlvbgotewotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyOwotICBwcml2YXRlIGJvb2xlYW4gaGFzT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotCi0gIHB1YmxpYyBPYmplY3RTZWxlY3Rpb25GcmFnbWVudCgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIEJvb2xlYW5GcmFnbWVudCBib29sRnJhZ21lbnQgPSBuZXcgQm9vbGVhbkZyYWdtZW50KG5ldyBTaW1wbGVGcmFnbWVudCgiT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IiksIG5ldyBTaW1wbGVGcmFnbWVudCgiIiksIHRoaXMpOwotICAgIGFkZChib29sRnJhZ21lbnQpOwotICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQoKSwgIiIpKTsKLSAgICBoYXNPYmplY3RTZWxlY3Rpb25XaWRnZXQgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHJldHJpZXZlIHRoZSBkYXRhIG1hcHBpbmdzIGZvciB0aGlzIGNvbW1hbmQgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuY2xhc3MsICJUeXBlUnVudGltZVNlcnZlciIsIE9iamVjdFNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQuY2xhc3MsICJUeXBlUnVudGltZVNlcnZlciIsIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbldpZGdldC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbldpZGdldC5jbGFzcywgIlByb2plY3QiLCBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDb21wb25lbnROYW1lIiwgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gaGFzT2JqZWN0U2VsZWN0aW9uV2lkZ2V0OwotICB9Ci0KLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiB0eXBlUnVudGltZVNlcnZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gdHlwZVJ1bnRpbWVTZXJ2ZXIgVGhlIHR5cGVSdW50aW1lU2VydmVyIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyKQotICB7Ci0gICAgdGhpcy50eXBlUnVudGltZVNlcnZlciA9IHR5cGVSdW50aW1lU2VydmVyOwotICAgIGlmICh0eXBlUnVudGltZVNlcnZlciAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB3c3QgPSB0eXBlUnVudGltZVNlcnZlci5nZXRUeXBlSWQoKTsKLQotICAgICAgaW50IHNjZW5hcmlvID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRTY2VuYXJpb0Zyb21UeXBlSWQod3N0KTsKLSAgICAgIFN0cmluZyBpbXBsSWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldEltcGxJZEZyb21UeXBlSWQod3N0KTsKLSAgICAgIGlmIChzY2VuYXJpbyA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikKLSAgICAgIHsKLSAgICAgICAgLy9NdXN0IGhhdmUgV1NETCBvYmplY3Qgc2VsZWN0aW9uLiBObyBjaG9pY2UuCi0gICAgICAgIGhhc09iamVjdFNlbGVjdGlvbldpZGdldD10cnVlOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFdlYlNlcnZpY2VJbXBsIHdzaW1wbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZUltcGxCeUlkKGltcGxJZCk7Ci0gICAgICAgIGlmICh3c2ltcGwhPW51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIFN0cmluZyBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZCA9IHdzaW1wbC5nZXRPYmplY3RTZWxlY3Rpb25XaWRnZXQoKTsgCi0gICAgICAgICAgaGFzT2JqZWN0U2VsZWN0aW9uV2lkZ2V0ID0gb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgIT0gbnVsbCAmJiBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZC5sZW5ndGgoKSA+IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjBlY2JhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotCi1wdWJsaWMgY2xhc3MgT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldElkXzsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiAgIG9iamVjdFNlbGVjdGlvbl87Ci0gIHByaXZhdGUgSU9iamVjdFNlbGVjdGlvbldpZGdldCBvYmplY3RTZWxlY3Rpb25XaWRnZXRfOwotICBwcml2YXRlIElQcm9qZWN0ICAgICAgICAgICAgICAgcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciAgICAgIHBhcnNlcl87Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIC8vIFRyYW5zZm9ybWF0aW9uCi0gICAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldElkXyAhPSBudWxsICYmIG9iamVjdFNlbGVjdGlvbldpZGdldElkXy5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKG9iamVjdFNlbGVjdGlvbldpZGdldElkXy5lcXVhbHMoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0cmFuc2Zvcm1lcklkID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm1lciIpOwotICAgICAgICAgIGlmICh0cmFuc2Zvcm1lcklkICE9IG51bGwgJiYgdHJhbnNmb3JtZXJJZC5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE9iamVjdCB0cmFuc2Zvcm1lciA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oInRyYW5zZm9ybWVyIik7Ci0gICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lciBpbnN0YW5jZW9mIFRyYW5zZm9ybWVyKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHRyYW5zZm9ybWVkU2VsZWN0aW9uID0gKChUcmFuc2Zvcm1lcil0cmFuc2Zvcm1lcikudHJhbnNmb3JtKG9iamVjdFNlbGVjdGlvbl8pOwotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lZFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uXyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil0cmFuc2Zvcm1lZFNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCQotICAgIC8vIFZhbGlkYXRpb24KLSAgICBTdGF0dXMgc3RhdHVzID0gKG9iamVjdFNlbGVjdGlvbldpZGdldF8gIT0gbnVsbCkgPyBvYmplY3RTZWxlY3Rpb25XaWRnZXRfLnZhbGlkYXRlU2VsZWN0aW9uKGdldE9iamVjdFNlbGVjdGlvbigpKSA6IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLQkKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlUnVudGltZVNlcnZlciBUaGUgdHlwZVJ1bnRpbWVTZXJ2ZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXIpCi0gIHsKLSAgICBpZiAodHlwZVJ1bnRpbWVTZXJ2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgd3N0ID0gdHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0VHlwZUlkKCk7Ci0KLSAgICAgIGludCBzY2VuYXJpbyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0U2NlbmFyaW9Gcm9tVHlwZUlkKHdzdCk7Ci0gICAgICBTdHJpbmcgaW1wbElkID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRJbXBsSWRGcm9tVHlwZUlkKHdzdCk7Ci0KLSAgICAgIFdlYlNlcnZpY2VJbXBsIHdzaW1wbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZUltcGxCeUlkKGltcGxJZCk7Ci0JICAgIC8vSVdlYlNlcnZpY2VUeXBlIHdzdCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVSdW50aW1lU2VydmVyLmdldFR5cGVJZCgpKTsKLQotICAgICAgaWYgKHdzaW1wbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSBudWxsOwotICAgICAgICBpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pCi0gICAgICAgIHsKLSAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSB3c2ltcGwuZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAKLQkJb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfID0gb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQ7Ci0JCQotICAgICAgICBpZiAob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfICE9IG51bGwgJiYgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWRfLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXRJZF8uZXF1YWxzKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElPYmplY3RTZWxlY3Rpb25XaWRnZXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0XyA9IChJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0KW9iamVjdDsKLSAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIG9iamVjdFNlbGVjdGlvbl87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZWxlY3Rpb24gVGhlIHNlbGVjdGlvbiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRPYmplY3RTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gb2JqZWN0U2VsZWN0aW9uKQotICB7Ci0gICAgb2JqZWN0U2VsZWN0aW9uXyA9IG9iamVjdFNlbGVjdGlvbjsKLSAgICAKLSAgICAvL1NldCB0aGUgcHJvamVjdCBpZiB5b3UgY2FuCi0gICAgaWYgKHByb2plY3RfPT1udWxsKQotICAgIHsKLSAgICAgIHByb2plY3RfID0gZ2V0UHJvamVjdEZyb21PYmplY3RTZWxlY3Rpb24ob2JqZWN0U2VsZWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgLy9TZXQgdGhlIGNvbXBvbmVudE5hbWUgaWYgeW91IGNhbgotICAgIGlmIChjb21wb25lbnROYW1lXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGNvbXBvbmVudE5hbWVfID0gZ2V0Q29tcG9uZW50TmFtZUZyb21PYmplY3RTZWxlY3Rpb24ob2JqZWN0U2VsZWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIFdTREwgc2VsZWN0aW9uIG9iamVjdC4gIElmIGl0IGlzIHdlIG5lZWQKLSAgICAvLyB0byB1bndyYXAgaXQuCi0gICAgaWYoIG9iamVjdFNlbGVjdGlvbiAhPSBudWxsICYmICFvYmplY3RTZWxlY3Rpb24uaXNFbXB0eSgpICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gb2JqZWN0U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgCi0gICAgICBpZiggb2JqZWN0IGluc3RhbmNlb2YgV1NETFNlbGVjdGlvbldyYXBwZXIgKQotICAgICAgewotICAgICAgICBXU0RMU2VsZWN0aW9uV3JhcHBlciB3c2RsV3JhcHBlciA9IChXU0RMU2VsZWN0aW9uV3JhcHBlcilvYmplY3Q7Ci0gICAgICAgIAotICAgICAgICBvYmplY3RTZWxlY3Rpb25fID0gd3NkbFdyYXBwZXIud3NkbFNlbGVjdGlvbjsKLSAgICAgICAgcGFyc2VyXyAgICAgICAgICA9IHdzZGxXcmFwcGVyLnBhcnNlcjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0XzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdGhpcy5wcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0gIAotICAKLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnROYW1lKCkKLSAgewotICAgIHJldHVybiBjb21wb25lbnROYW1lXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudE5hbWUoU3RyaW5nIGNvbXBvbmVudE5hbWUpCi0gIHsKLSAgICB0aGlzLmNvbXBvbmVudE5hbWVfID0gY29tcG9uZW50TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhcnNlcl8uCi0gICAqLwotICBwdWJsaWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V2ViU2VydmljZXNQYXJzZXIoKQotICB7Ci0gICAgcmV0dXJuIHBhcnNlcl87Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21PYmplY3RTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgCi0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFByb2plY3RGcm9tT2JqZWN0U2VsZWN0aW9uIC0gcmVzb3VyY2UgPSAiK3Jlc291cmNlKTsKLSAgICAgICAgICBpZiAocmVzb3VyY2U9PW51bGwpIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgSVByb2plY3QgcCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0U2VsZWN0aW9uIHByb2plY3QgPSAiK3ApOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb21wb25lbnROYW1lRnJvbU9iamVjdFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0UHJvamVjdEZyb21PYmplY3RTZWxlY3Rpb24gLSByZXNvdXJjZSA9ICIrcmVzb3VyY2UpOwotICAgICAgICAgIGlmIChyZXNvdXJjZT09bnVsbCkgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgCi0gICAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgaWYgKGNvbXAhPW51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9iamVjdFNlbGVjdGlvbiBjb21wb25lbnQgPSAiK2NvbXAuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2RiZDY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvT2JqZWN0U2VsZWN0aW9uUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeQotewotICBwcml2YXRlIHN0YXRpYyBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeSBpbnN0YW5jZTsKLSAgcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0gIAotICBwcml2YXRlIE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5KCkKLSAgewotICAgIGVsZW1lbnRzID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJvYmplY3RTZWxlY3Rpb25XaWRnZXQiKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBPYmplY3RTZWxlY3Rpb25SZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgIGluc3RhbmNlID0gbmV3IE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5KCk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudHM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9PYmplY3RTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3MjI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L09iamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi0KLXB1YmxpYyBjbGFzcyBPYmplY3RTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdFNlbGVjdGlvbldpZGdldCBpbXBsZW1lbnRzIElPYmplY3RTZWxlY3Rpb25XaWRnZXQKLXsKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50czsKLSAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyOwotICBwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXI7Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLSAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBjb21wb25lbnROYW1lOwotICBwcml2YXRlIElPYmplY3RTZWxlY3Rpb25XaWRnZXQgY2hpbGQ7Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotCSAgU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3RTZWxlY3Rpb25XaWRnZXQgLSAtIDEiKTsJICAKLSAgICBlbGVtZW50cyA9IE9iamVjdFNlbGVjdGlvblJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIGNvbXBvc2l0ZSA9IG51bGw7Ci0JU3lzdGVtLm91dC5wcmludGxuKCJPYmplY3RTZWxlY3Rpb25XaWRnZXQgLSAtIDIiKTsJCQotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIHR5cGVSdW50aW1lU2VydmVyIFRoZSB0eXBlUnVudGltZVNlcnZlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcikKLSAgewotICAgIHRoaXMudHlwZVJ1bnRpbWVTZXJ2ZXIgPSB0eXBlUnVudGltZVNlcnZlcjsKLSAgICBpZiAoY29tcG9zaXRlICE9IG51bGwpCi0gICAgewotICAgICAgY29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgIGNoaWxkID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKHR5cGVSdW50aW1lU2VydmVyICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHdzdCA9IHR5cGVSdW50aW1lU2VydmVyLmdldFR5cGVJZCgpOwotICAgICAgaW50IHNjZW5hcmlvID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRTY2VuYXJpb0Zyb21UeXBlSWQod3N0KTsKLSAgICAgIFN0cmluZyBpbXBsSWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldEltcGxJZEZyb21UeXBlSWQod3N0KTsKLSAgICAgIFdlYlNlcnZpY2VJbXBsIHdzaW1wbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZUltcGxCeUlkKGltcGxJZCk7Ci0gICAgICAKLQkgICAgLy9JV2ViU2VydmljZVR5cGUgd3N0ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZVJ1bnRpbWVTZXJ2ZXIuZ2V0VHlwZUlkKCkpOwotICAgICAgaWYgKHdzaW1wbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSBudWxsOwotICAgICAgICBpZiAoc2NlbmFyaW8gPT0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV04pCi0gICAgICAgIHsKLSAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgPSB3c2ltcGwuZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob2JqZWN0U2VsZWN0aW9uV2lkZ2V0SWQgIT0gbnVsbCAmJiBvYmplY3RTZWxlY3Rpb25XaWRnZXRJZC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXRJZC5lcXVhbHMoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSU9iamVjdFNlbGVjdGlvbldpZGdldCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBDb250cm9sIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgICBpbnQgeCA9IHNoZWxsLmdldFNpemUoKS54OwotICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICAgICAgICAgICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICAgICAgICAgICAgICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgICAgICAgICAgIGNoaWxkID0gKElPYmplY3RTZWxlY3Rpb25XaWRnZXQpb2JqZWN0OwotICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkQ29udHJvbHMoY29tcG9zaXRlLCBzdGF0dXNMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICBjaGlsZC5zZXRJbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLnNldFNpemUoeC0yMCwgY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueSk7Ci0gICAgICAgICAgICAgICAgICBwYXJlbnQuc2V0U2l6ZSh4LTEwLCBwYXJlbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLSAgICAgICAgICAgICAgICAgIHNoZWxsLnNldFNpemUoeCwgc2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55KTsKLSAgICAgICAgICAgICAgICAgIHNoZWxsLnNldFJlZHJhdyh0cnVlKTsKLSAgICAgICAgICAgICAgICAgIHNoZWxsLnJlZHJhdygpOwotICAgICAgICAgICAgICAgICAgc2hlbGwudXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRTdGF0dXMoKSA6IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgICBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotICAgIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUluaXRpYWxTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbik7Ci0gICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgICBjaGlsZC5zZXRJbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotICB9Ci0gICAgCi0gIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldE9iamVjdFNlbGVjdGlvbigpIDogbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gKGNoaWxkICE9IG51bGwpID8gY2hpbGQudmFsaWRhdGVTZWxlY3Rpb24ob2JqZWN0U2VsZWN0aW9uKSA6IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICBwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpCi0gIHsKLSAgICBpZiAoY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJUHJvamVjdCBwID0gY2hpbGQuZ2V0UHJvamVjdCgpOwotICAgICAgaWYgKHAgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGNuYW1lID0gY2hpbGQuZ2V0Q29tcG9uZW50TmFtZSgpOwotICAgICAgaWYgKGNuYW1lICE9IG51bGwgJiYgY25hbWUubGVuZ3RoKCk+MCkKLSAgICAgICAgcmV0dXJuIGNuYW1lOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gY29tcG9uZW50TmFtZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAgCi0JIAotICB9Ci0gIAotICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIGlmIChyZXNvdXJjZT09bnVsbCkgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICBJUHJvamVjdCBwID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZUZyb21Jbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgaWYgKHJlc291cmNlPT1udWxsKSAKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFByb2plY3RPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICBpZiAoY29tcCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wLmdldE5hbWUoKTsgIAotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1RpbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1RpbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NjEyMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9UaW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgVGltZXIgZXh0ZW5kcyBUaHJlYWQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgVGltZXIgaW5zdGFuY2UgPSBudWxsOwotICBwcml2YXRlIGZpbmFsIGxvbmcgT05FX1NFQ09ORCA9IDEwMDA7Ci0gIHByaXZhdGUgbG9uZyByZWZyZXNoVGltZTsKLSAgcHJpdmF0ZSBEaXNwbGF5IGRpc3BsYXk7Ci0gIHByaXZhdGUgUnVubmFibGUgcnVubmFibGU7Ci0KLSAgcHJpdmF0ZSBUaW1lcihEaXNwbGF5IGRpc3BsYXksIFJ1bm5hYmxlIHJ1bm5hYmxlKQotICB7Ci0gICAgdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsKLSAgICB0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7Ci0gIH0KLQotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBUaW1lciBuZXdJbnN0YW5jZShEaXNwbGF5IGRpc3BsYXksIFJ1bm5hYmxlIHJ1bm5hYmxlKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICBpbnN0YW5jZSA9IG5ldyBUaW1lcihkaXNwbGF5LCBydW5uYWJsZSk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBib29sZWFuIGlzUnVubmluZygpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2UgIT0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydFRpbWVyKCkKLSAgewotICAgIHJlZnJlc2hUaW1lID0gZ2V0Q3VycmVudFRpbWUoKSArIE9ORV9TRUNPTkQ7Ci0gICAgaWYgKCFpc0FsaXZlKCkpCi0gICAgICB0aGlzLnN0YXJ0KCk7Ci0gIH0KLQotICBwcml2YXRlIGxvbmcgZ2V0Q3VycmVudFRpbWUoKQotICB7Ci0gICAgcmV0dXJuIENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpLmdldFRpbWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBsb25nIGN1cnJUaW1lID0gZ2V0Q3VycmVudFRpbWUoKTsKLSAgICB3aGlsZSAoY3VyclRpbWUgPCByZWZyZXNoVGltZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2xlZXAocmVmcmVzaFRpbWUgLSBjdXJyVGltZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBjdXJyVGltZSA9IGdldEN1cnJlbnRUaW1lKCk7Ci0gICAgfQotICAgIGluc3RhbmNlID0gbnVsbDsKLSAgICBkaXNwbGF5LnN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDBlN2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzY2xpZW50LmltcGwuU2VydmljZVJlZkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFQWN0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyCi17Ci0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWwgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXZhbHVlKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChzZWwgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCgoSVJlc291cmNlKXNlbCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoc2VsIGluc3RhbmNlb2YgU2VydmljZUltcGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoU2VydmljZUltcGwpc2VsKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWwgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmSW1wbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0RMVVJJKChTZXJ2aWNlUmVmSW1wbClzZWwpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbCBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoV1NETFJlc291cmNlSW1wbClzZWwpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyMDA2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvb2JqZWN0L1dTRExTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvbkNvbmRpdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuV1NETFNlbGVjdGlvblRyZWVXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5EaWFsb2dSZXNvdXJjZUJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5GaWxlRXh0ZW5zaW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RTZWxlY3Rpb25XaWRnZXQgaW1wbGVtZW50cyBJT2JqZWN0U2VsZWN0aW9uV2lkZ2V0LCBSdW5uYWJsZQotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgcGx1Z2luSWRfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyAgICAgICAgbXNnVXRpbHNfOwotICBwcml2YXRlIEZpbGVFeHRlbnNpb25GaWx0ZXIgd3NGaWx0ZXJfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotCi0gIHByaXZhdGUgQ29tcG9zaXRlIHBhcmVudF87Ci0gIHByaXZhdGUgTGlzdGVuZXIgIHN0YXR1c0xpc3RlbmVyXzsKLSAgcHJpdmF0ZSBXU0RMU2VsZWN0aW9uVHJlZVdpZGdldCB0cmVlOwotICAKLSAgLypDT05URVhUX0lEIFBDT04wMDAxIGZvciB0aGUgV1NETCBTZWxlY3Rpb24gUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUENPTl9QQUdFID0gIlBDT04wMDAxIjsKLQotICAvKkNPTlRFWFRfSUQgUENPTjAwMDIgZm9yIHRoZSBXU0RMIERvY3VtZW50IHRleHQgZmllbGQgb2YgdGhlIFdTREwgU2VsZWN0aW9uIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BDT05fVEVYVF9XU0RMID0gIlBDT04wMDAyIjsKLSAgcHJpdmF0ZSBUZXh0IHdlYlNlcnZpY2VVUkk7Ci0KLSAgLypDT05URVhUX0lEIFBDT04wMDAzIGZvciB0aGUgV1NETCBSZXNvdXJjZSBCcm93c2UgYnV0dG9uIG9mIHRoZSBXU0RMIFNlbGVjdGlvbiBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QQ09OX0JVVFRPTl9CUk9XU0VfV1NETCA9ICJQQ09OMDAwMyI7Ci0gIHByaXZhdGUgQnV0dG9uIHdzQnJvd3NlQnV0dG9uXzsKLSAgCi0gIHB1YmxpYyBXU0RMU2VsZWN0aW9uV2lkZ2V0KCkKLSAgewotICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIHdzRmlsdGVyXyA9IG5ldyBGaWxlRXh0ZW5zaW9uRmlsdGVyKG5ldyBTdHJpbmdbXSB7IndzZGwiLCAid3NpbCIsICJodG1sIn0pOwotICAgIHdlYlNlcnZpY2VzUGFyc2VyID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBVSVV0aWxzIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMoIG1zZ1V0aWxzXywgcGx1Z2luSWRfICk7Ci0gICAgcGFyZW50XyAgICAgICAgICA9IHBhcmVudDsKLSAgICBzdGF0dXNMaXN0ZW5lcl8gID0gc3RhdHVzTGlzdGVuZXI7Ci0KLQkgIHBhcmVudC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJUT09MVElQX1BDT05fUEFHRSIgKSApOwotCSAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggcGFyZW50LCBwbHVnaW5JZF8gKyAiLiIgKyBJTkZPUE9QX1BDT05fUEFHRSApOwotICAgIAotICAgIENvbXBvc2l0ZSB3c2RsR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAyLCA1LCAwICk7Ci0gICAgCi0gICAgTGFiZWwgd3NMYWJlbCA9IG5ldyBMYWJlbCggd3NkbEdyb3VwLCBTV1QuV1JBUCk7Ci0gICAgd3NMYWJlbC5zZXRUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfV1NfU0VMRUNUSU9OIikpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgIHdzTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgd3NMYWJlbC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUENPTl9URVhUX1dTIikgKTsKLSAgICAKLSAgICB3ZWJTZXJ2aWNlVVJJID0gdWlVdGlscy5jcmVhdGVUZXh0KCB3c2RsR3JvdXAsIG51bGwsICJUT09MVElQX1BDT05fVEVYVF9XUyIsIElORk9QT1BfUENPTl9URVhUX1dTREwsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0gICAgd2ViU2VydmljZVVSSS5hZGRNb2RpZnlMaXN0ZW5lcigKLSAgICAgIG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVXZWJTZXJ2aWNlVVJJTW9kaWZ5RXZlbnQoKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgd2ViU2VydmljZVVSSS5hZGRMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXIgKTsKLQotICAgIHdzQnJvd3NlQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggd3NkbEdyb3VwLCAiQlVUVE9OX0JST1dTRSIsICJUT09MVElQX1BDT05fQlVUVE9OX0JST1dTRV9XUyIsIElORk9QT1BfUENPTl9CVVRUT05fQlJPV1NFX1dTREwgKTsKLSAgICB3c0Jyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0gICAgICBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVXU0RMQnV0dG9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaGFuZGxlV1NETEJ1dHRvbigpOwotICAgICAgICB9IAotICAgICAgfSk7Ci0KLSAgICB0cmVlID0gbmV3IFdTRExTZWxlY3Rpb25UcmVlV2lkZ2V0KCk7Ci0gICAgdHJlZS5hZGRDb250cm9scyhwYXJlbnQsIHN0YXR1c0xpc3RlbmVyKTsKLSAgICB0cmVlLnNldFdlYlNlcnZpY2VzUGFyc2VyKHdlYlNlcnZpY2VzUGFyc2VyKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdlYlNlcnZpY2VVUklNb2RpZnlFdmVudCgpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZVVSSS5nZXRUZXh0KCkuaW5kZXhPZignOicpID4gMCkKLSAgICAgIFRpbWVyLm5ld0luc3RhbmNlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCB0aGlzKS5zdGFydFRpbWVyKCk7Ci0gICAgZWxzZQotICAgICAgaGFuZGxlV2ViU2VydmljZVVSSSgpOwotICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdlYlNlcnZpY2VVUkkoKQotICB7Ci0gICAgU3RyaW5nIHdzVVJJID0gd2ViU2VydmljZVVSSS5nZXRUZXh0KCk7Ci0gICAgaWYgKHdzVVJJLmluZGV4T2YoJzonKSA8IDApCi0gICAgewotICAgICAgSUZpbGUgZmlsZSA9IHVyaTJJRmlsZSh3c1VSSSk7Ci0gICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgICB3c1VSSSA9IGlGaWxlMlVSSShmaWxlKTsKLSAgICB9Ci0gICAgaWYgKHdzVVJJICE9IG51bGwgJiYgd3NVUkkuaW5kZXhPZignOicpID49IDAgJiYgd2ViU2VydmljZXNQYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzVVJJKSA9PSBudWxsKQotICAgIHsKLSAgICAgIFdTRExTZWxlY3Rpb25Db25kaXRpb25Db21tYW5kIGNtZCA9IG5ldyBXU0RMU2VsZWN0aW9uQ29uZGl0aW9uQ29tbWFuZCgpOwotICAgICAgY21kLnNldFdlYlNlcnZpY2VzUGFyc2VyKHdlYlNlcnZpY2VzUGFyc2VyKTsKLSAgICAgIGNtZC5zZXRXZWJTZXJ2aWNlVVJJKHdzVVJJKTsKLSAgICAgIGNtZC5leGVjdXRlKG51bGwpOwotICAgIH0KLSAgICBXZWJTZXJ2aWNlRW50aXR5IGVudGl0eSA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh3c1VSSSk7Ci0gICAgaWYgKGVudGl0eSAhPSBudWxsICYmIGVudGl0eS5nZXRUeXBlKCkgPT0gV2ViU2VydmljZUVudGl0eS5UWVBFX1dTREwpCi0gICAgICB0cmVlLnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGVsc2UKLSAgICAgIHRyZWUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB0cmVlLnNldFdlYlNlcnZpY2VVUkkod3NVUkkpOwotICAgIHRyZWUucmVmcmVzaFRyZWVWaWV3ZXIoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGhhbmRsZVdlYlNlcnZpY2VVUkkoKTsKLSAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQobnVsbCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlV1NETEJ1dHRvbigpCi0gIHsKLSAgICBEaWFsb2dSZXNvdXJjZUJyb3dzZXIgZGlhbG9nID0gbmV3IERpYWxvZ1Jlc291cmNlQnJvd3NlciggcGFyZW50Xy5nZXRTaGVsbCgpLCBudWxsLCB3c0ZpbHRlcl8pOwotICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgSVJlc291cmNlIHJlcyA9IGRpYWxvZy5nZXRGaXJzdFNlbGVjdGlvbigpOwotICAgIGlmKCByZXMgIT0gbnVsbCApIHdlYlNlcnZpY2VVUkkuc2V0VGV4dCggcmVzLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSApOwotICAgIHN0YXR1c0xpc3RlbmVyXy5oYW5kbGVFdmVudChudWxsKTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKQotICB7Ci0gICAgLy8gVGltZXIgdmFsaWRhdGlvbgotICAgIC8qCi0gICAgICogQ29tbWVudGluZyBvdXQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGJsb2NrIGZhc3QgdHlwZXJzIGZyb20gaGl0dGluZyBOZXh0L0ZpbmlzaCAKLSAgICBpZiAoVGltZXIuaXNSdW5uaW5nKCkpCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlBBR0VfTVNHX0xPQURJTkdfV0VCX1NFUlZJQ0VfVVJJIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgKi8KLQotICAgIC8vIFZhbGlkYXRlIHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFdlYiBzZXJ2aWNlIFVSSQotICAgIC8vIEZvciBleGFtcGxlLCBpcyBpdCBwb2ludGluZyB0byBhbiBleGlzdGluZyByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlPwotICAgIFN0cmluZyB3c1BhdGggID0gd2ViU2VydmljZVVSSS5nZXRUZXh0KCk7Ci0gICAgaWYoIHdzUGF0aCA9PSBudWxsIHx8IHdzUGF0aC5sZW5ndGgoKSA8PSAwICkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUEFHRV9NU0dfSU5WQUxJRF9XRUJfU0VSVklDRV9VUkkiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICBlbHNlIGlmKCB3c1BhdGguaW5kZXhPZignOicpIDwgMCApCi0gICAgewotICAgICAgSVJlc291cmNlIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdzUGF0aCk7Ci0gICAgICBpZiggcmVzID09IG51bGwgKQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlBBR0VfTVNHX05PX1NVQ0hfRklMRSIsIG5ldyBPYmplY3RbXSB7d3NQYXRofSksIFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbHNlIGlmKCByZXMuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFICkKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQQUdFX01TR19JTlZBTElEX1dFQl9TRVJWSUNFX1VSSSIpLCBTdGF0dXMuRVJST1IpOwotICAgIH0KLQotICAgIC8vIFZhbGlkYXRlIHRoZSBjb250ZW50IG9mIHRoZSBXZWIgc2VydmljZSBVUkkKLSAgICAvLyBGb3IgZXhhbXBsZSwgaXMgc2VsZWN0aW9uIGEgV1NETCBVUkk/Ci0gICAgaWYgKCFUaW1lci5pc1J1bm5pbmcoKSAmJiB0cmVlLmlzRW5hYmxlZCgpKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSB0cmVlLmdldFN0YXR1cygpOwotICAgICAgaWYgKHN0YXR1cyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgaWYgKHNldmVyaXR5ID09IFN0YXR1cy5FUlJPUiB8fCBzZXZlcml0eSA9PSBTdGF0dXMuV0FSTklORykKLSAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYoIHdzUGF0aC5pbmRleE9mKCc6JykgPCAwICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHdzZGxVUkkgPSBpRmlsZTJVUkkoKElGaWxlKVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdzUGF0aCkpOwotICAgICAgICBpZiAod2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSkgPT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIlBBR0VfTVNHX1NFTEVDVElPTl9NVVNUX0JFX1dTREwiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPSyBzdGF0dXMKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBJRmlsZSB1cmkySUZpbGUoU3RyaW5nIHVyaSkKLSAgewotICAgIElSZXNvdXJjZSByZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIodXJpKTsKLSAgICBpZiAocmVzIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICByZXR1cm4gKElGaWxlKXJlczsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgaUZpbGUyVVJJKElGaWxlIGZpbGUpCi0gIHsKLSAgCUZpbGUgZiA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gZi50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gZi50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCAmJiAhaW5pdGlhbFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iamVjdCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBTdHJpbmcgd3NkbFVSSSA9IHRvV3NkbFVSSShvYmplY3QpOwotICAgICAgaWYgKHdzZGxVUkkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd2ViU2VydmljZVVSSS5zZXRUZXh0KHdzZGxVUkkpOwotICAgICAgICBoYW5kbGVXZWJTZXJ2aWNlVVJJKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyB0b1dzZGxVUkkoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkKLSAgICAgIHJldHVybiBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoU2VydmljZUltcGwpb2JqZWN0KTsKLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKQotICAgICAgcmV0dXJuIEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0RMVVJJKChXU0RMUmVzb3VyY2VJbXBsKW9iamVjdCk7Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VydmljZVJlZikKLSAgICAgIHJldHVybiBKMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuZ2V0V1NETFVSSSgoU2VydmljZVJlZilvYmplY3QpOwotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgcmV0dXJuICgoSUZpbGUpb2JqZWN0KS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgcmV0dXJuIChTdHJpbmcpb2JqZWN0OwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyB0b0Fic29sdXRlV3NkbFVSSShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGaWxlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICByZXR1cm4gKChJRmlsZSlvYmplY3QpLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkwoKS50b1N0cmluZygpOwotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRvV3NkbFVSSShvYmplY3QpOwotICB9Ci0KLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldE9iamVjdFNlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oIAotICAgICAgICAgICAgICAgbmV3IFdTRExTZWxlY3Rpb25XcmFwcGVyKCB3ZWJTZXJ2aWNlc1BhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odHJlZS5nZXRXc2RsVVJJKCkpICkgKTsKLSAgfQotICAKLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyIGdldFdlYlNlcnZpY2VzUGFyc2VyKCkKLSAgewotICAgIHJldHVybiB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIFN0cmluZyB3c2RsVVJJID0gdHJlZS5nZXRXc2RsVVJJKCk7Ci0gICAgaWYgKHdzZGxVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJUHJvamVjdCBwID0gZ2V0UHJvamVjdEZyb21VUkkod3NkbFVSSSk7Ci0gICAgICBpZiAocCE9bnVsbCAmJiBwLmV4aXN0cygpKQotICAgICAgICByZXR1cm4gcDsKLSAgICAgIAotICAgICAgU3RyaW5nIHdzUmVsUGF0aCA9IHdlYlNlcnZpY2VVUkkuZ2V0VGV4dCgpOwotICAgICAgSVJlc291cmNlIHdzUmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uod3NSZWxQYXRoKTsKLSAgICAgIGlmICh3c1JlcyE9bnVsbCAmJiB3c1JlcyBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgICBJUHJvamVjdCBwMiA9ICgoSUZpbGUpd3NSZXMpLmdldFByb2plY3QoKTsKLSAgICAgICAgcmV0dXJuIHAyOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgU3RyaW5nIHdzZGxVUkkgPSB0cmVlLmdldFdzZGxVUkkoKTsKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBjbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVVJJKHdzZGxVUkkpOwotICAgICAgaWYgKGNuYW1lIT1udWxsICYmIGNuYW1lLmxlbmd0aCgpPjApCi0gICAgICAgIHJldHVybiBjbmFtZTsKLSAgICAgIAotICAgICAgU3RyaW5nIHdzUmVsUGF0aCA9IHdlYlNlcnZpY2VVUkkuZ2V0VGV4dCgpOwotICAgICAgSVJlc291cmNlIHdzUmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uod3NSZWxQYXRoKTsKLSAgICAgIGlmICh3c1JlcyE9bnVsbCAmJiB3c1JlcyBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZih3c1Jlcy5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgaWYgKGNvbXAhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gY29tcC5nZXROYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgU3RyaW5nIHdrc3BjUm9vdExvYyA9IHJvb3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotICAgIGludCBpZHggPSB1cmkuaW5kZXhPZih3a3NwY1Jvb3RMb2MpOwotICAgIGlmIChpZHggIT0gLTEpIAotICAgIHsKLSAgICAgIFN0cmluZyByZWxQYXRoID0gdXJpLnN1YnN0cmluZyh3a3NwY1Jvb3RMb2MubGVuZ3RoKCkraWR4KTsKLSAgICAgIElSZXNvdXJjZSByZXMgPSByb290LmZpbmRNZW1iZXIobmV3IFBhdGgocmVsUGF0aCkpOwotICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgICBJUHJvamVjdCBwID0gKChJRmlsZSlyZXMpLmdldFByb2plY3QoKTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb21wb25lbnROYW1lRnJvbVVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgU3RyaW5nIHdrc3BjUm9vdExvYyA9IHJvb3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotICAgIGludCBpZHggPSB1cmkuaW5kZXhPZih3a3NwY1Jvb3RMb2MpOwotICAgIGlmIChpZHggIT0gLTEpIAotICAgIHsKLSAgICAgIFN0cmluZyByZWxQYXRoID0gdXJpLnN1YnN0cmluZyh3a3NwY1Jvb3RMb2MubGVuZ3RoKCkraWR4KTsKLSAgICAgIElSZXNvdXJjZSByZXMgPSByb290LmZpbmRNZW1iZXIobmV3IFBhdGgocmVsUGF0aCkpOwotICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihyZXMuZ2V0RnVsbFBhdGgoKSk7Ci0gICAgICAgIGlmIChjb21wIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV3JhcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9XU0RMU2VsZWN0aW9uV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGE2MDA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvV1NETFNlbGVjdGlvbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHZlcnkgc2ltcGxlIHdyYXBwZXIgdGhhdCBiaW5kcyBhIFdTREwgcGFyc2VyIHdpdGgKLSAqIGEgd3NkbFNlbGVjdGlvbiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uV3JhcHBlciAKLXsKLSAgcHVibGljIFdlYlNlcnZpY2VzUGFyc2VyICAgIHBhcnNlcjsKLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHdzZGxTZWxlY3Rpb247Ci0gIAotICBwdWJsaWMgV1NETFNlbGVjdGlvbldyYXBwZXIoIFdlYlNlcnZpY2VzUGFyc2VyICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7Ci0gICAgdGhpcy5wYXJzZXIgICAgICAgID0gcGFyc2VyOwotICAgIHRoaXMud3NkbFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTA0YTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL0NsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlZhbGlkYXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLkNsaWVudFByb2plY3RUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci0KLQotcHVibGljIGNsYXNzIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIAotICAvKiBDT05URVhUX0lEIFBXUlMwMDAzIGZvciB0aGUgV2l6YXJkIFNjZW5hcmlvIENsaWVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBSdW50aW1lIFNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19HUk9VUF9DTElFTlQgPSBwbHVnaW5JZF8gKyAiLlBXUlMwMDAzIjsKLSAgCi0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTY2VuYXJpb0lkOwotICBwcml2YXRlIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50R3JvdXBfOwotICBwcml2YXRlIFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQgcnVudGltZVdpZGdldF87Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgICAgICAgICBydW50aW1lMkNsaWVudFR5cGVzXzsKLSAgcHJpdmF0ZSBDb21ibyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFR5cGVfOwotICBwcml2YXRlIFNlbGVjdGlvbkFkYXB0ZXIgICAgICAgICAgICAgY2xpZW50VHlwZVNlbExpc3RlbmVyOwotICBwcml2YXRlIFByb2plY3RTZWxlY3Rpb25XaWRnZXQgICAgICAgcHJvamVjdFdpZGdldF87Ci0gIHByaXZhdGUgYm9vbGVhbiAJCQkJCSAgIGlzVmlzaWJsZV87Ci0gIAotICAvLyByc2sgcmV2aXNpdCAtIFB1dHRpbmcgdGhpcyBpbiB0ZW1wb3JhcmlseS4gVGhlIFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2cgbmVlZHMgdGhlIHNlcnZlcgotICAvLyBpbmZvcm1hdGlvbiBldmVuIHdoZW4gaXQgaXMgbGF1bmNoZWQgZm9yIHRoZSBjbGllbnQgaGFsZiBvZiB0aGUgY29uZmlndXJhdGlvbi4KLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VTY2VuYXJpb0lkOwotICAvLwotICAKLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgPSBuZXcgVUlVdGlscyhtc2dVdGlscywgcGx1Z2luSWRfICk7IAotICAgIAotICAgIGNsaWVudEdyb3VwXyA9IHVpVXRpbHMuY3JlYXRlR3JvdXAoIHBhcmVudCwgIkxBQkVMX0NMSUVOVF9TRUxFQ1RJT05fVklFV19USVRMRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgSU5GT1BPUF9QV1JTX0dST1VQX0NMSUVOVCwgMiwgNSwgNSApOwotICAgIAotICAgIHJ1bnRpbWVXaWRnZXRfID0gbmV3IFJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQoIHRydWUgKTsKLSAgICBydW50aW1lV2lkZ2V0Xy5hZGRDb250cm9scyggY2xpZW50R3JvdXBfLCBzdGF0dXNMaXN0ZW5lciApOwotICAgIHJ1bnRpbWVXaWRnZXRfLmFkZE1vZGlmeUxpc3RlbmVyKCBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVJ1bnRpbWUyQ2xpZW50VHlwZXNFdmVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVXBkYXRlUHJvamVjdFdpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgY2xpZW50VHlwZV8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCBjbGllbnRHcm91cF8sICJMQUJFTF9DTElFTlRfVFlQRSIsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXQ1JfQ09NQk9fQ0xJRU5UX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1JTX0dST1VQX0NMSUVOVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICAKLSAgICBjbGllbnRUeXBlU2VsTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZXRQcm9qZWN0cyggY2xpZW50VHlwZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBjbGllbnRUeXBlXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihjbGllbnRUeXBlU2VsTGlzdGVuZXIpOwotICAgIAotICAgIHByb2plY3RXaWRnZXRfID0gbmV3IFByb2plY3RTZWxlY3Rpb25XaWRnZXQodHJ1ZSk7Ci0gICAgcHJvamVjdFdpZGdldF8uYWRkQ29udHJvbHMoIGNsaWVudEdyb3VwXywgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICAvL3Byb2plY3RXaWRnZXRfLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotICAgIC8vICAJCQkJCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSl7Ci0gICAgLy8gIAkJCQkJCQkJICBnZXRQcm9qZWN0U2VsZWN0aW9ucygpOwotICAgIC8vICAJCQkJCQkJCX0KLSAgICAvLwkJCQkJCQkJfSk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgY3JlYXRvciBvZiB0aGlzIHdpZGdldCB0byBjb250cm9sCi0gIC8vIHdoZXRoZXIgaXQgaXMgdmlzaWJsZSBvciBub3QuCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoIGJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgY2xpZW50R3JvdXBfLnNldFZpc2libGUoIHZhbHVlICk7IAotICAgIGlzVmlzaWJsZV8gPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCl7Ci0gIAlyZXR1cm4gdGhpcy5pc1Zpc2libGVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsgICAgIAotICAgIHJ1bnRpbWVXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKCBpZHMgKTsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlcihpZHMpOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gcnVudGltZVdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgcnVudGltZVdpZGdldF8uc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICAgIHByb2plY3RXaWRnZXRfLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnROZWVkRUFSKCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0V2lkZ2V0Xy5nZXROZWVkRUFSKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudE5lZWRFQVIoYm9vbGVhbiBiKQotICB7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0TmVlZEVBUihiKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudENvbXBvbmVudE5hbWUoKQotICB7Ci0JcmV0dXJuIHByb2plY3RXaWRnZXRfLmdldENvbXBvbmVudE5hbWUoKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRDb21wb25lbnROYW1lKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5zZXRDb21wb25lbnROYW1lKCBuYW1lICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50RWFyQ29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcHJvamVjdFdpZGdldF8uZ2V0RWFyQ29tcG9uZW50TmFtZSgpOwkgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRFYXJDb21wb25lbnROYW1lKCBTdHJpbmcgbmFtZSApCi0gIHsKLQlwcm9qZWN0V2lkZ2V0Xy5zZXRFYXJDb21wb25lbnROYW1lKCBuYW1lICk7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRDb21wb25lbnRUeXBlKCkKLSAgewotICAgIFNlbGVjdGlvbkxpc3QgcHJvalR5cGVMaXN0ID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpOwotICAgIHByb2pUeXBlTGlzdC5zZXRJbmRleCggY2xpZW50VHlwZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgIHJldHVybiBwcm9qVHlwZUxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudENvbXBvbmVudFR5cGUoIGludCB0eXBlICkKLSAgewotCXByb2plY3RXaWRnZXRfLnNldENvbXBvbmVudFR5cGUoIHR5cGUgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFByb2plY3ROYW1lKCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0V2lkZ2V0Xy5nZXRQcm9qZWN0TmFtZSgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoKQotICB7Ci0JcmV0dXJuIHByb2plY3RXaWRnZXRfLmdldEVhclByb2plY3ROYW1lKCk7ICAKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBydW50aW1lMkNsaWVudFR5cGVzIFRoZSBydW50aW1lMkNsaWVudFR5cGVzIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWUyQ2xpZW50VHlwZXMoU2VsZWN0aW9uTGlzdENob2ljZXMgcnVudGltZTJDbGllbnRUeXBlcykKLSAgewotICAgIHJ1bnRpbWUyQ2xpZW50VHlwZXNfID0gcnVudGltZTJDbGllbnRUeXBlczsKLSAgICBoYW5kbGVSdW50aW1lMkNsaWVudFR5cGVzRXZlbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkKLSAgewotICAgIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCi0gICAgU3RyaW5nIHJ1bnRpbWUgICAgICAgPSBydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFJ1bnRpbWVJZCgpOwotICAgIFN0cmluZyBjbGllbnRQcm9qZWN0ID0gcHJvamVjdFdpZGdldF8uZ2V0UHJvamVjdENob2ljZXMoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgU3RyaW5nIGVhclByb2plY3QgICAgPSBwcm9qZWN0V2lkZ2V0Xy5nZXRQcm9qZWN0Q2hvaWNlcygpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICBTZWxlY3Rpb25MaXN0IHJ1bnRpbWVMaXN0ICA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldExpc3QoKTsKLSAgICBydW50aW1lTGlzdC5zZXRTZWxlY3Rpb25WYWx1ZSggcnVudGltZSApOwotICAgIAotICAgIFNlbGVjdGlvbkxpc3QgcHJvalR5cGVMaXN0ID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpOwotICAgIHByb2pUeXBlTGlzdC5zZXRJbmRleCggY2xpZW50VHlwZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKSApOwotICAgIAotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNsaWVudFByb2pDaG9pY2UgPSBydW50aW1lMkNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKTsKLSAgICBTZWxlY3Rpb25MaXN0ICAgICAgICBjbGllbnRQcm9qTGlzdCAgID0gY2xpZW50UHJvakNob2ljZS5nZXRMaXN0KCk7Ci0gICAgY2xpZW50UHJvakxpc3Quc2V0U2VsZWN0aW9uVmFsdWUoIGNsaWVudFByb2plY3QgKTsgICAgCi0gICAgCi0gICAgU2VsZWN0aW9uTGlzdCAgICAgICAgZWFyUHJvakxpc3QgICAgICA9IGNsaWVudFByb2pDaG9pY2UuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpOyAgIAotICAgIGVhclByb2pMaXN0LnNldFNlbGVjdGlvblZhbHVlKCBlYXJQcm9qZWN0ICk7Ci0gICAgCi0gICAgcmV0dXJuIHJ1bnRpbWUyQ2xpZW50VHlwZXNfOyAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJ1bnRpbWUyQ2xpZW50VHlwZXNFdmVudCgpCi0gIHsKLSAgICBpZiAocnVudGltZTJDbGllbnRUeXBlc18gIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIC8vSWYgdGhlIHJ1bnRpbWVJZCBmcm9tIHJ1bnRpbWVXaWRnZXRfIGlzIGFscmVhZHkgc2VsZWN0ZWQgaW4KLSAgICAgIC8vaW4gcnVudGltZTJDbGllbnRUeXBlc18sIGRvIG5vdGhpbmcuIAotICAgICAgU3RyaW5nIGN1cnJlbnRSdW50aW1lSWQgPSBydW50aW1lMkNsaWVudFR5cGVzXy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBTdHJpbmcgbmV3UnVudGltZUlkID0gcnVudGltZVdpZGdldF8uZ2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5nZXRSdW50aW1lSWQoKTsKLSAgICAgIGlmIChjdXJyZW50UnVudGltZUlkICE9IG5ld1J1bnRpbWVJZCkKLSAgICAgIHsKLSAgICAgICAgU2VsZWN0aW9uTGlzdCBydW50aW1lcyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldExpc3QoKTsKLSAgICAgICAgcnVudGltZXMuc2V0U2VsZWN0aW9uVmFsdWUoIHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkuZ2V0UnVudGltZUlkKCkgKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nW10gY2xpZW50VHlwZUlkcyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgICBpbnQgc2VsZWN0ZWRDbGllbnRUeXBlSWR4ID0gcnVudGltZTJDbGllbnRUeXBlc18uZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldEluZGV4KCk7Ci0gICAgICAKLSAgICAgIGNsaWVudFR5cGVfLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGNsaWVudFR5cGVTZWxMaXN0ZW5lcik7Ci0gICAgICBjbGllbnRUeXBlXy5zZXRJdGVtcyggZ2V0Q2xpZW50VHlwZUxhYmVscyggY2xpZW50VHlwZUlkcyApKTsKLSAgICAgIGNsaWVudFR5cGVfLnNlbGVjdChzZWxlY3RlZENsaWVudFR5cGVJZHgpOwotICAgICAgY2xpZW50VHlwZV8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoY2xpZW50VHlwZVNlbExpc3RlbmVyKTsKLSAgICAgIGhhbmRsZVNldFByb2plY3RzKHNlbGVjdGVkQ2xpZW50VHlwZUlkeCk7Ci0gICAgICAKLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVVcGRhdGVQcm9qZWN0V2lkZ2V0KCkKLSAgewotICAgIHByb2plY3RXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkpOwotICAgIHByb2plY3RXaWRnZXRfLnNldEoyRUVWZXJzaW9uKHJ1bnRpbWVXaWRnZXRfLmdldEoyRUVWZXJzaW9uKCkpOwotICB9Ci0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVTZXRQcm9qZWN0cyggaW50IGNsaWVudFR5cGVJbmRleCApCi0gIHsgICAgCi0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xpZW50VHlwZTJQcm9qZWN0cyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXNfLmdldENob2ljZSgpOwotICAgIGNsaWVudFR5cGUyUHJvamVjdHMuZ2V0TGlzdCgpLnNldEluZGV4KCBjbGllbnRUeXBlSW5kZXggKTsKLSAgICAKLSAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcHJvamVjdCBuYW1lIGFuZCBFQVIgbmFtZSBhcmUga2VwdCB0aGUgc2FtZQotICAgIC8vIGV2ZW4gaWYgdGhlIGNsaWVudCB0eXBlIGlzIGNoYW5nZWQuICBOb3RlOiB0aGUgcHJvamVjdCBhbmQgRUFSIGxpc3RzCi0gICAgLy8gd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZyB0byB3aGF0IGlzIHNldCBieSB0aGUgY2xpZW50IHR5cGUuCi0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgY3VycmVudFByb2plY3RzID0gcHJvamVjdFdpZGdldF8uZ2V0UHJvamVjdENob2ljZXMoKTsKLSAgICAKLSAgICBpZiggY3VycmVudFByb2plY3RzICE9IG51bGwgKQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGN1cnJlbnRQcm9qZWN0cy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBTdHJpbmcgZWFyTmFtZSAgICAgPSBjdXJyZW50UHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgICAgCi0gICAgICAvLyBTZXQgdGhlIHByb2plY3QgdG8gaXQncyBvcmlnaW5hbCBzdGF0ZS4KLSAgICAgIGNsaWVudFR5cGUyUHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKCBwcm9qZWN0TmFtZSApOwotCQotCSAgLy8gU2V0IHRoZSBFQVIgbmFtZSB0byBpdCdzIG9yaWdpbmFsIHN0YXRlLgotICAgICAgY2xpZW50VHlwZTJQcm9qZWN0cy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoIGVhck5hbWUgKTsKLSAgICB9Ci0JCi0gICAgcHJvamVjdFdpZGdldF8uc2V0UHJvamVjdFR5cGVJZChjbGllbnRUeXBlMlByb2plY3RzLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0UHJvamVjdENob2ljZXMoIGNsaWVudFR5cGUyUHJvamVjdHMuZ2V0Q2hvaWNlKCkgKTsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZUxhYmVscyggU3RyaW5nW10gdHlwZXMgKQotICB7Ci0gICAgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeSByZWdpc3RyeSAgICAgICAgID0gQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZ1tdICAgICAgICAgICAgICAgICAgY2xpZW50VHlwZUxhYmVscyA9IG5ldyBTdHJpbmdbdHlwZXMubGVuZ3RoXTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZXMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBjbGllbnRUeXBlTGFiZWxzW2luZGV4XSA9IHJlZ2lzdHJ5LmdldEVsZW1lbnRCeUlkKHR5cGVzW2luZGV4XSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY2xpZW50VHlwZUxhYmVsczsKLSAgfQotICAKLSAgcHVibGljIFByb2plY3RTZWxlY3Rpb25XaWRnZXQgZ2V0UHJvamVjdFNlbGVjdGlvbldpZGdldCgpIHsKLSAgICByZXR1cm4gdGhpcy5wcm9qZWN0V2lkZ2V0XzsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2dldFN0YXR1cygpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIAotICB7Ci0gICAgU3RhdHVzIGZpbmFsU3RhdHVzICAgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIFN0YXR1cyBwcm9qZWN0U3RhdHVzID0gcHJvamVjdFdpZGdldF8uZ2V0U3RhdHVzKCk7Ci0gICAgU3RhdHVzIHJ1bnRpbWVTdGF0dXMgPSBydW50aW1lV2lkZ2V0Xy5nZXRTdGF0dXMoKTsKLSAgICAKLSAgICBpZiggcnVudGltZVN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgewotICAgICAgZmluYWxTdGF0dXMgPSBydW50aW1lU3RhdHVzOwotICAgIH0KLSAgICBlbHNlIGlmKCBwcm9qZWN0U3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICB7Ci0gICAgICBmaW5hbFN0YXR1cyA9IHByb2plY3RTdGF0dXM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjbGllbnRQcm9qZWN0cyA9IGdldFByb2plY3RTZWxlY3Rpb25XaWRnZXQoKS5nZXRQcm9qZWN0Q2hvaWNlcygpOwotICAgICAgVmFsaWRhdGlvblV0aWxzIHZhbFV0aWxzID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgICAgaWYgKGNsaWVudFByb2plY3RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjbGllbnRFQVJOYW1lID0gY2xpZW50UHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAgICAgICBTdHJpbmcgY2xpZW50UHJvak5hbWUgPSBjbGllbnRQcm9qZWN0cy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgY2xpZW50Q29tcE5hbWUgPSBwcm9qZWN0V2lkZ2V0Xy5nZXRDb21wb25lbnROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBjbGllbnRFQVJDb21wTmFtZSA9IHByb2plY3RXaWRnZXRfLmdldEVhckNvbXBvbmVudE5hbWUoKTsKLQotICAgICAgICAvL1ZhbGlkYXRlIHRoYXQgdGhlIHNlbGVjdGVkIGNsaWVudCBwcm9qZWN0IGlzIG9mIHRoZSB0eXBlIGluZGljYXRlZCBieSBjbGllbnQgcHJvamVjdCB0eXBlLgotICAgICAgICBTdGF0dXMgY2xpZW50UHJvamVjdFR5cGVTdGF0dXMgPSB2YWxVdGlscy52YWxpZGF0ZVByb2plY3RUeXBlKGNsaWVudFByb2pOYW1lLCBydW50aW1lMkNsaWVudFR5cGVzXyk7Ci0gICAgICAgIGlmIChjbGllbnRQcm9qZWN0VHlwZVN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsU3RhdHVzID0gY2xpZW50UHJvamVjdFR5cGVTdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vVmFsaWRhdGUgY2xpZW50IHNpZGUgc2VydmVyIHRhcmdldHMgYW5kIEoyRUUgbGV2ZWxzCi0gICAgICAgIFN0cmluZyBjbGllbnRTZXJ2ZXJGYWN0b3J5SWQgPSBnZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpLmdldFNlcnZlcklkKCk7Ci0gICAgICAgIFN0cmluZyBjbGllbnRKMkVFbGV2ZWwgPSBnZXRKMkVFVmVyc2lvbigpOwotICAgICAgICBTdGF0dXMgY2xpZW50UHJvamVjdFN0YXR1cyA9IHZhbFV0aWxzLnZhbGlkYXRlUHJvamVjdFRhcmdldEFuZEoyRUUoY2xpZW50UHJvak5hbWUsIGNsaWVudENvbXBOYW1lLCBjbGllbnRFQVJOYW1lLCBjbGllbnRFQVJDb21wTmFtZSwgY2xpZW50U2VydmVyRmFjdG9yeUlkLAotICAgICAgICAgICAgY2xpZW50SjJFRWxldmVsKTsKLSAgICAgICAgaWYgKGNsaWVudFByb2plY3RTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICBmaW5hbFN0YXR1cyA9IGNsaWVudFByb2plY3RTdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZpbmFsU3RhdHVzOyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyZGE4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLkNsaWVudFNlcnZlclNlbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5jb21tb24uU2VydmVyU2VsZWN0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5DbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3RDaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZUNsaWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5TaW1wbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAoteyAgIAotICBwcm90ZWN0ZWQgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgLy8gY2xpZW50UnVudGltZUoyRUVUeXBlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNsaWVudCBydW50aW1lIGFuZCBKMkVFIGxldmVsIGJhc2VkIG9uIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4KLSAgLy8gSWYgdGhlIGluaXRpYWxTZWxlY2l0b24gZG9lcyBub3QgcmVzdWx0IGluIGEgdmFsaWQgY2xpZW50IHJ1bnRpbWUgYW5kIEoyRUUgbGV2ZWwsIGNsaWVudFJ1bnRpbWVKMkVFVHlwZQotICAvLyBzaG91bGQgcmVtYWluIG51bGwgZm9yIHRoZSBsaWZlIG9mIHRoaXMgaW5zdGFuY2UuICAKLSAgcHJpdmF0ZSBXU1J1bnRpbWVKMkVFVHlwZSAgICBjbGllbnRSdW50aW1lSjJFRVR5cGVfOwotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciAgICBjbGllbnRJZHNfOwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJ1bnRpbWVDbGllbnRUeXBlc187Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudENvbXBvbmVudE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRFYXJDb21wb25lbnROYW1lXzsKLSAgCi0gIHByaXZhdGUgRW52aXJvbm1lbnQgICAgICAgZW52aXJvbm1lbnRfOwotICBwcml2YXRlIElDb250ZXh0ICAgICAgICAgIGNvbnRleHRfOwotICBwcml2YXRlIElTZWxlY3Rpb24gICAgICAgIHNlbGVjdGlvbl87Ci0gIHByaXZhdGUgSVdlYlNlcnZpY2VDbGllbnQgd2ViU2VydmljZUNsaWVudF87Ci0gIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICAgcmVzb3VyY2VDb250ZXh0XzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICB0ZXN0XzsKLSAgCi0gIC8vQSBub3RlIG9uIGluaXRpYWxTZWxlY3Rpb25zIC4uLgotICAvL1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gY2xpZW50SW5pdGlhbFNlbGVjdGlvbl8gYW5kIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uIGlzIHRoYXQKLSAgLy9jbGllbnRJbml0aWFsU2VsZWN0aW9uXyBjb21lcyBmcm9tIHRoZSBPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kIHdoaWxlIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uCi0gIC8vaXMgdGhlIGFjdHVhbCB0aGluZyB0aGF0IHdhcyBzZWxlY3RlZCBiZWZvcmUgdGhlIHdpemFyZCB3YXMgbGF1bmNoZWQuIEluIHRoZSBydW50aW1lL2oyZWUvcHJvamVjdCAKLSAgLy9kZWZhdWx0aW5nIGFsZ29yaXRobSwgY2xpZW50SW5pdGlhbFNlbGVjdGlvbiB3aWxsIGJlIGdpdmVuIGZpcnN0IHByaW9yaXR5LiBJZiwgaG93ZXZlciwgaXQgaXMgCi0gIC8vZGVlbWVkIHRoYXQgY2xpZW50SW5pdGlhbFByb2plY3QgaXMgbm90IGEgdmFsaWQgaW5pdGlhbCBzZWxlY3Rpb24sIGluaXRpYWxJbml0aWFsU2VsZWN0aW9uCi0gIC8vd2lsbCBiZSBnaXZlbiBzZWNvbmQgcHJpb3JpdHkuIFRoaW5ncyB0aGF0IGNvdWxkIG1ha2UgYW4gaW5pdGlhbFNlbGVjdGlvbiBpbnZhbGlkIGluY2x1ZGUKLSAgLy8xLiBUaGUgY29udGFpbmluZyBwcm9qZWN0IGNvbnRhaW5zIHRoZSBXZWIgc2VydmljZSBmb3Igd2hpY2ggd2UgYXJlIHRyeWluZyB0byBjcmVhdGUgYSBjbGllbnQKLSAgLy8yLiBUaGUgY29udGFpbmluZyBwcm9qZWN0IGhhcyBhIEoyRUUgbGV2ZWwsIHNlcnZlciB0YXJnZXQsIGFuZCBwcm9qZWN0IHR5cGUgY29tYmluYXRpb24gd2hpY2gKLSAgLy8gICBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFueSBvZiB0aGUgcmVnaXN0ZXJlZCBXZWIgc2VydmljZSBydW50aW1lcy4KLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBjbGllbnRJbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBjbGllbnRJbml0aWFsUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudEluaXRpYWxDb21wb25lbnROYW1lXzsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbl87Ci0gIHByaXZhdGUgSVByb2plY3QgaW5pdGlhbEluaXRpYWxQcm9qZWN0XzsKLQotICBwcml2YXRlIFN0cmluZyBjbGllbnRKMkVFVmVyc2lvbl87Ci0gIHByb3RlY3RlZCBib29sZWFuIGNsaWVudE5lZWRFQVJfID0gdHJ1ZTsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUklfOwotICBwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHBhcnNlcl87Ci0KLQotICBwdWJsaWMgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgU3RyaW5nICBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgY2xpZW50SWRzXyA9IGlkczsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBjbGllbnRJZHNfOyAKLSAgfQotICAKLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVDbGllbnRUeXBlc187Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50Q29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50Q29tcG9uZW50TmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50RWFyQ29tcG9uZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50RWFyQ29tcG9uZW50TmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50Q29tcG9uZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50SjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudEoyRUVWZXJzaW9uXzsKLSAgfQotICAKLSAgcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VDbGllbnRfOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBFbnZpcm9ubWVudCBnZXRFbnZpcm9ubWVudCgpCi0gIHsKLSAgICByZXR1cm4gZW52aXJvbm1lbnRfOwotICB9Ci0gIAotICBwdWJsaWMgSUNvbnRleHQgZ2V0Q29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gY29udGV4dF87Ci0gIH0gIAotICAKLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOyAgICAKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLkNvbW1hbmQjZXhlY3V0ZShvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0JICAvLyByc2tyZWcJCQotICAgICAgLy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQotICAgICAgLy9TdHJpbmdbXSBydW50aW1lSWRzID0gZ2F0aGVyQXR0cmlidXRlVmFsdWVzKHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudChjbGllbnRJZHNfLmdldFR5cGVJZCgpKSwgInJ1bnRpbWUiKTsKLQkgIFN0cmluZ1tdIHJ1bnRpbWVJZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFJ1bnRpbWVzQnlDbGllbnRUeXBlKGNsaWVudElkc18uZ2V0VHlwZUlkKCkpOyAKLQkgIC8vIHJza3JlZwotICAgICAgU2VsZWN0aW9uTGlzdCBsaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3QocnVudGltZUlkcywgMCk7Ci0gICAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZUlkcy5sZW5ndGg7IGkrKykgewotICAgICAgICBjaG9pY2VzLmFkZChnZXRDbGllbnRUeXBlc0Nob2ljZShydW50aW1lSWRzW2ldKSk7Ci0gICAgICB9Ci0gICAgICBydW50aW1lQ2xpZW50VHlwZXNfID0gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGxpc3QsIGNob2ljZXMpOwotICAgICAgLy9zZXRDbGllbnREZWZhdWx0UnVudGltZUZyb21QcmVmZXJlbmNlKCk7Ci0gICAgICAvL3NldENsaWVudERlZmF1bHRKMkVFVmVyc2lvbkZyb21QcmVmZXJlbmNlKCk7Ci0gICAgICAvL2NsaWVudFJ1bnRpbWVKMkVFVHlwZV8gPSBnZXRDbGllbnRSdW50aW1lQW5kSjJFRUZyb21Qcm9qZWN0KGNsaWVudEluaXRpYWxQcm9qZWN0Xyk7Ci0gICAgICAvL2lmIChjbGllbnRSdW50aW1lSjJFRVR5cGVfICE9IG51bGwpCi0gICAgICAvL3sKLSAgICAgICAgLy9jbGllbnRKMkVFVmVyc2lvbl8gPSBjbGllbnRSdW50aW1lSjJFRVR5cGVfLmdldEoyZWVWZXJzaW9uSWQoKTsKLSAgICAgICAgLy9zZXRDbGllbnRSdW50aW1lSWQoY2xpZW50UnVudGltZUoyRUVUeXBlXy5nZXRXc3JJZCgpKTsKLSAgICAgICAgLy9zZXRDbGllbnRQcm9qZWN0VHlwZShjbGllbnRSdW50aW1lSjJFRVR5cGVfLmdldENsaWVudFByb2plY3RUeXBlSWQoKSk7Ci0gICAgICAvL30KLQkgIHNldENsaWVudFJ1bnRpbWVJZCgoV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRSdW50aW1lc0J5Q2xpZW50VHlwZShjbGllbnRJZHNfLmdldFR5cGVJZCgpKSlbMF0pOwotCSAgY2xpZW50SjJFRVZlcnNpb25fID0gKFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKGNsaWVudElkc18uZ2V0UnVudGltZUlkKCkpLmdldEoyZWVMZXZlbHMoKSlbMF07Ci0JICAKLSAgICAgIC8vSWYgY2xpZW50SW5pdGlhbFByb2plY3QgaXMgdGhlIHNlcnZpY2UgcHJvamVjdCwgY2hlY2sgdGhlIGluaXRpYWxJbml0aWFsUHJvamVjdAotICAgICAgLy90byBzZWUgaWYgaXQgaXMgdmFsaWQuCi0JICAvKgotICAgICAgVmFsaWRhdGlvblV0aWxzIHZ1ID0gbmV3IFZhbGlkYXRpb25VdGlscygpOwotICAgICAgaWYgKHZ1LmlzUHJvamVjdFNlcnZpY2VQcm9qZWN0KGNsaWVudEluaXRpYWxQcm9qZWN0Xywgd3NkbFVSSV8sIHBhcnNlcl8pKQotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBjbGllbnRSdW50aW1lSjJFRVR5cGVfID0gZ2V0Q2xpZW50UnVudGltZUFuZEoyRUVGcm9tUHJvamVjdChpbml0aWFsSW5pdGlhbFByb2plY3RfKTsKLSAgICAgICAgaWYgKGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNsaWVudEoyRUVWZXJzaW9uXyA9IGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8uZ2V0SjJlZVZlcnNpb25JZCgpOwotICAgICAgICAgIHNldENsaWVudFJ1bnRpbWVJZChjbGllbnRSdW50aW1lSjJFRVR5cGVfLmdldFdzcklkKCkpOwotICAgICAgICAgIHNldENsaWVudFByb2plY3RUeXBlKGNsaWVudFJ1bnRpbWVKMkVFVHlwZV8uZ2V0Q2xpZW50UHJvamVjdFR5cGVJZCgpKTsKLSAgICAgICAgICAvL1NpbmNlIHRoZSBvcmlnaW5hbCBjbGllbnRJbnRpYWxQcm9qZWN0IHdhcyBpbnZhbGlkIGJ1dCBpbml0aWFsSW5pdGlhbFByb2plY3QgaXMgdmFsaWQsCi0gICAgICAgICAgLy9yZXNldCBjbGllbnRJbml0YWxQcm9qZWN0XyB0byBiZSBpbml0aWFsSW5pdGlhbFByb2plY3QgZm9yIHRoZSBiZW5lZml0IG9mCi0gICAgICAgICAgLy9kb3duc3RyZWFtIHByb2plY3QgZGVmYXVsdGluZy4KLSAgICAgICAgICBjbGllbnRJbml0aWFsUHJvamVjdF8gPSBpbml0aWFsSW5pdGlhbFByb2plY3RfOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAqLwotICAgICAgc2V0Q2xpZW50RGVmYXVsdFByb2plY3QoKTsKLSAgICAgIHNldENsaWVudERlZmF1bHRFQVIoKTsKLSAgICAgIHNldENsaWVudERlZmF1bHRTZXJ2ZXIoKTsKLSAgICAgIHVwZGF0ZUNsaWVudEVBUnMoKTsKLSAgICAgIAotICAgICAgLy9DYWxjdWxhdGUgZGVmYXVsdCBJV2ViU2VydmljZUNsaWVudAotICAgICAgc2V0RGVmYXVsdHNGb3JFeHRlbnNpb24oZW52aXJvbm1lbnQpOwotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vQ2F0Y2ggYWxsIEV4Y2VwdGlvbnMgaW4gb3JkZXIgdG8gZ2l2ZSBzb21lIGZlZWRiYWNrIHRvIHRoZSB1c2VyCi0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQiLG5ldyBTdHJpbmdbXXtlLmdldE1lc3NhZ2UoKX0pLFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwotICAgICAgcmV0dXJuIGVycm9yU3RhdHVzOwotICAgIH0KLSAgICAKLSAgfQotICAKLQotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBydW50aW1lSWQKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRDbGllbnRUeXBlc0Nob2ljZShTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgLy9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5IGNwdHIgPSBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nW10gY2xpZW50VHlwZXM7Ci0JLy8gcnNrcmVnCi0gICAgLy9TdHJpbmdbXSBjbGllbnRQcm9qZWN0VHlwZXMgPSBnYXRoZXJBdHRyaWJ1dGVWYWx1ZXMocmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50KGNsaWVudElkc18uZ2V0VHlwZUlkKCksIHJ1bnRpbWVJZCksICJjbGllbnRQcm9qZWN0VHlwZSIpOwotCWNsaWVudFR5cGVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRDbGllbnRQcm9qZWN0VHlwZXMoY2xpZW50SWRzXy5nZXRUeXBlSWQoKSwgcnVudGltZUlkKTsKLQkvKgotICAgIGlmIChjbGllbnRQcm9qZWN0VHlwZXMhPW51bGwgJiYgY2xpZW50UHJvamVjdFR5cGVzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGllbnRQcm9qZWN0VHlwZXNbMF0pOwotICAgICAgY2xpZW50VHlwZXMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGllbnRUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgY2xpZW50VHlwZXNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgY2xpZW50VHlwZXMgPSBuZXcgU3RyaW5nW10ge2NwdHIuZ2V0RGVmYXVsdEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoImlkIil9OwotICAgICovCi0gICAgLy8gcnNrcmVnCi0JLy8gU2VuZydzIE5vdGU6IENoZWNrIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlIG5vbi1zdXBwb3J0IGhlcmUhISEKLSAgICBTZWxlY3Rpb25MaXN0IGxpc3QgPSBuZXcgU2VsZWN0aW9uTGlzdChjbGllbnRUeXBlcywgMCk7Ci0gICAgVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGllbnRUeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgY2hvaWNlcy5hZGQoZ2V0UHJvamVjdENob2ljZShjbGllbnRUeXBlc1tpXSkpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGxpc3QsIGNob2ljZXMpOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGNsaWVudFR5cGUKLSAgICogQHJldHVybgotICAgKiAKLSAgICovCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0UHJvamVjdENob2ljZShTdHJpbmcgY2xpZW50VHlwZSkKLSAgewotICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdHMoY2xpZW50VHlwZSk7Ci0gICAgU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1twcm9qZWN0cy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgICBwcm9qZWN0TmFtZXNbaV0gPSBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgU2VsZWN0aW9uTGlzdCBsaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3QocHJvamVjdE5hbWVzLCAwKTsKLSAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgICAgY2hvaWNlcy5hZGQoZ2V0UHJvamVjdEVBUkNob2ljZShwcm9qZWN0c1tpXSkpOwotICAgIHJldHVybiBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMobGlzdCwgY2hvaWNlcywgZ2V0RUFSUHJvamVjdHMoKSk7Ci0gIH0KLSAgCi0vKioKLSAqIAotICogQHBhcmFtIHByb2plY3QKLSAqIEByZXR1cm4KLSAqLwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0UHJvamVjdEVBUkNob2ljZShJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgLyoKLQkvLyBUT0RPIHVzZWQgdG8gYmUgSjJFRVV0aWxzLmdldEVBUlByb2plY3RzKHByb2plY3QpIC0tIHJlZmVyZW5jZWQgRUFScwotICAgIElQcm9qZWN0W10gZWFyTmF0dXJlcyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cygpOwotICAgIGlmIChlYXJOYXR1cmVzICE9IG51bGwpewotICAgICAgZm9yKGludCBpID0gMDsgaSA8IGVhck5hdHVyZXMubGVuZ3RoOyBpKyspewotICAgICAgICB2LmFkZChlYXJOYXR1cmVzW2ldLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIElQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBKMkVFVXRpbHMuZ2V0RUFSUHJvamVjdHMoKTsKLSAgICBpZiAoZWFyUHJvamVjdHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgCXsKLSAgICAJICBTdHJpbmcgZWFyUHJvamVjdE5hbWUgPSBlYXJQcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgCSAgaWYgKCF2LmNvbnRhaW5zKGVhclByb2plY3ROYW1lKSkKLSAgICAJICAJdi5hZGQoZWFyUHJvamVjdE5hbWUpOwotICAgIAl9Ci0gICAgfQotICAgICovCi0KLSAgICBTdHJpbmdbXSBmbGV4UHJvamVjdHMgPSBnZXRBbGxGbGV4aWJsZVByb2plY3RzKCk7Ci0gICAgU2VsZWN0aW9uTGlzdCBsaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3QoZmxleFByb2plY3RzLCAwKTsKLSAgICByZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGxpc3QsIG51bGwpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdCBnZXRFQVJQcm9qZWN0cygpCi0gIHsKLSAgICAvKgotICAgIElQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBKMkVFVXRpbHMuZ2V0RUFSUHJvamVjdHMoKTsKLSAgICBTdHJpbmdbXSBlYXJQcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW2VhclByb2plY3RzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpPGVhclByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGVhclByb2plY3ROYW1lc1tpXSA9IGVhclByb2plY3RzW2ldLmdldE5hbWUoKTsKLSAgICB9Ci0gICAgKi8KLSAgICBTdHJpbmdbXSBmbGV4UHJvamVjdHMgPSBnZXRBbGxGbGV4aWJsZVByb2plY3RzKCk7Ci0gICAgcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0KGZsZXhQcm9qZWN0cywgMCk7Ci0gIH0KLQotICAvLyByc2tyZWcKLSAgLyoKLSAgcHJpdmF0ZSBTdHJpbmdbXSBnYXRoZXJBdHRyaWJ1dGVWYWx1ZXMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMsIFN0cmluZyBrZXkpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShrZXkpOwotICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBpZiAoIXYuY29udGFpbnModmFsdWUpKQotICAgICAgICAgIHYuYWRkKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChTdHJpbmcgW10pdi50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0gICovCi0gIC8vIHJza3JlZwotICAKLSAgLy8gcnNrcmVnCi0gIC8qCi0gIHByaXZhdGUgdm9pZCBzZXRDbGllbnREZWZhdWx0UnVudGltZUZyb21QcmVmZXJlbmNlKCkKLSAgewotICAgIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgIFN0cmluZyBwUnVudGltZUlkID0gY29udGV4dC5nZXRSdW50aW1lSWQoKTsKLQotICAgIC8vc2V0IHRoZSBjbGllbnQgcnVudGltZSB0byBiZSB0aGUgcHJlZmVycmVkIHJ1bnRpbWUgaWYgdGhlIGNsaWVudCB0eXBlIGFsbG93cy4KLSAgICBzZXRDbGllbnRSdW50aW1lSWQocFJ1bnRpbWVJZCk7Ci0gIH0KLSAgKi8KLSAgLy8gcnNrcmVnCi0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50UnVudGltZUlkKFN0cmluZyBpZCkKLSAgewotICAgIFN0cmluZ1tdIGNsaWVudFJ1bnRpbWVJZHMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y2xpZW50UnVudGltZUlkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAJaWYoY2xpZW50UnVudGltZUlkc1tpXS5lcXVhbHMoaWQpKQotICAgIAl7Ci0gICAgCSAgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKS5zZXRSdW50aW1lSWQoaWQpOwotCQkgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRMaXN0KCkuc2V0SW5kZXgoaSk7Ci0JCSAgYnJlYWs7Ci0gICAJICAgIH0KLSAgICB9ICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50UHJvamVjdFR5cGUoU3RyaW5nIGlkKQotICB7Ci0gICAgU3RyaW5nW10gY2xpZW50UHJvamVjdFR5cGVJZHMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y2xpZW50UHJvamVjdFR5cGVJZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgCWlmKGNsaWVudFByb2plY3RUeXBlSWRzW2ldLmVxdWFscyhpZCkpCi0gICAgCXsKLSAgICAJICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldEluZGV4KGkpOwotCQkgIGJyZWFrOwotICAgCSAgICB9Ci0gICAgfSAgICAgICAgCi0gIH0KLSAgCi0gIC8vIHJza3JlZwotICAvKgotICBwcm90ZWN0ZWQgdm9pZCBzZXRDbGllbnREZWZhdWx0SjJFRVZlcnNpb25Gcm9tUHJlZmVyZW5jZSgpCi0gIHsKLSAgICBpZiAoY2xpZW50SWRzXyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBydW50aW1lSWQgPSBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpOwotICAgICAgaWYgKHJ1bnRpbWVJZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBJV2ViU2VydmljZVJ1bnRpbWUgd3NyID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQocnVudGltZUlkKTsKLSAgICAgICAgaWYgKHdzciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nW10gdmVyc2lvbnMgPSB3c3IuZ2V0SjJFRVZlcnNpb25zKCk7Ci0gICAgICAgICAgaWYgKHZlcnNpb25zICE9IG51bGwgJiYgdmVyc2lvbnMubGVuZ3RoID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCVBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgICAgICAgIAlTdHJpbmcgcEoyRUUgPSBjb250ZXh0LmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICAgICAgCWlmIChwSjJFRSE9bnVsbCAmJiBwSjJFRS5sZW5ndGgoKT4wKQotICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPHZlcnNpb25zLmxlbmd0aDtpKyspCi0gICAgICAgICAgCSAgewotICAgICAgICAgIAkJaWYgKHZlcnNpb25zW2ldLmVxdWFscyhwSjJFRSkpCi0gICAgICAgICAgCQl7Ci0gICAgICAgICAgCSAgICAgIGNsaWVudEoyRUVWZXJzaW9uXyA9IHZlcnNpb25zW2ldOwotICAgICAgICAgIAkJICByZXR1cm47Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCSAgfQotICAgICAgICAgIAl9Ci0gICAgICAgICAgCWNsaWVudEoyRUVWZXJzaW9uXyA9IHZlcnNpb25zWzBdOwotICAgICAgICAgIAlyZXR1cm47ICAgICAgICAgIAkKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAJCi0gIH0KLSAgKi8KLSAgLy8gcnNrcmVnCi0gIC8vIHJza3JlZwotICAvKgotICBwcml2YXRlIFdTUnVudGltZUoyRUVUeXBlIGdldENsaWVudFJ1bnRpbWVBbmRKMkVFRnJvbVByb2plY3QoSVByb2plY3QgcHJvamVjdCkKLSAgewotICAgIFdTUnVudGltZUoyRUVUeXBlIGNSSjJFRSA9IG51bGw7Ci0gICAgLy9JZiB0aGVyZSBpcyBhIHZhbGlkIGluaXRpYWwgc2VsZWN0aW9uLCB1c2UgaXQgdG8gZGV0ZXJtaW5lCi0gICAgLy9yZWFzb25hYmxlIEoyRUUgdmVyc2lvbiBhbmQgV2ViIHNlcnZpY2UgcnVudGltZSB2YWx1ZXMKLQotICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3QocHJvamVjdCkgfHwgUmVzb3VyY2VVdGlscy5pc1RydWVKYXZhUHJvamVjdChwcm9qZWN0KSkKLSAgICAgIHsKLSAgICAgICAgV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIEoyRUUgbGV2ZWwKLSAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBudWxsOwotICAgICAgICBpZiAoIVJlc291cmNlVXRpbHMuaXNUcnVlSmF2YVByb2plY3QocHJvamVjdCkpCi0gICAgICAgIHsKLQkgICAgICBpbnQgdmVyc2lvbklkID0gSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHByb2plY3QpOyAgICAgICAgCi0JICAgICAgdmVyc2lvblN0cmluZyA9IFN0cmluZy52YWx1ZU9mKHZlcnNpb25JZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0dldCB0aGUgcnVudGltZSB0YXJnZXQgb2YgdGhlIHByb2plY3QKLSAgICAgICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQocHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gbnVsbDsKLSAgICAgICAgaWYgKHJ1bnRpbWVUYXJnZXQgIT0gbnVsbCkgCi0gICAgICAgICAgcnVudGltZVRhcmdldElkID0gcnVudGltZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIAotICAgICAgICAvL0dldCB0aGUgY2xpZW50IHByb2plY3QgdHlwZQotICAgICAgICBTdHJpbmcgY2xpZW50UHJvamVjdFR5cGVJZCA9IGdldENsaWVudFByb2plY3RUeXBlRnJvbVJ1bnRpbWVJZChwcm9qZWN0LCBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vSWYgdGhlIHByZWZlcnJlZCBydW50aW1lIHN1cHBvcnRzIHRoaXMgSjJFRSBsZXZlbCBhbmQgc2VydmVyIHRhcmdldCwga2VlcCBpdAotICAgICAgICBpZiAoKHZlcnNpb25TdHJpbmcgPT0gbnVsbCB8fCB3c2N0UmVnLmRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbCh2ZXJzaW9uU3RyaW5nLCBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKSkgJiYKLSAgICAgICAgICAgICgocnVudGltZVRhcmdldCA9PSBudWxsKSB8fAotICAgICAgICAgICAgICgocnVudGltZVRhcmdldCAhPSBudWxsKSAmJiB3c2N0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCkpKSkgJiYKLSAgICAgICAgICAgICAoY2xpZW50UHJvamVjdFR5cGVJZCAhPSBudWxsKQotICAgICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAvL1NldCB0aGUgSjJFRSBsZXZlbCBhbmQgd2ViIHNlcnZpY2UgcnVudGltZSB0byBtYXRjaCB0aGUgcHJvamVjdAotICAgICAgICAgIGNSSjJFRSA9IG5ldyBXU1J1bnRpbWVKMkVFVHlwZSgpOwotICAgICAgICAgIGNSSjJFRS5zZXRKMmVlVmVyc2lvbklkKHZlcnNpb25TdHJpbmcpOwotICAgICAgICAgIGNSSjJFRS5zZXRXc3JJZChjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKTsKLSAgICAgICAgICBjUkoyRUUuc2V0Q2xpZW50UHJvamVjdFR5cGVJZChjbGllbnRQcm9qZWN0VHlwZUlkKTsKLSAgICAgICAgICByZXR1cm4gY1JKMkVFOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vTG9vayBmb3IgYSBydW50aW1lIHRoYXQgbWF0Y2hlcwotICAgICAgICAgIFN0cmluZ1tdIHZhbGlkUnVudGltZXMgPSB3c2N0UmVnLmdldFJ1bnRpbWVzQnlUeXBlKGNsaWVudElkc18uZ2V0VHlwZUlkKCkpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRSdW50aW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdGhpc0NsaWVudFByb2plY3RUeXBlSWQgPSBnZXRDbGllbnRQcm9qZWN0VHlwZUZyb21SdW50aW1lSWQocHJvamVjdCwgdmFsaWRSdW50aW1lc1tpXSk7IAotICAgICAgICAgICAgaWYgKCh2ZXJzaW9uU3RyaW5nID09IG51bGwgfHwgd3NjdFJlZy5kb2VzUnVudGltZVN1cHBvcnRKMkVFTGV2ZWwodmVyc2lvblN0cmluZywgdmFsaWRSdW50aW1lc1tpXSkpICYmCi0gICAgICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0ID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgICgocnVudGltZVRhcmdldCAhPSBudWxsKSAmJiB3c2N0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIHZhbGlkUnVudGltZXNbaV0pKSkgJiYKLSAgICAgICAgICAgICAgICAgKHRoaXNDbGllbnRQcm9qZWN0VHlwZUlkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjUkoyRUUgPSBuZXcgV1NSdW50aW1lSjJFRVR5cGUoKTsKLSAgICAgICAgICAgICAgY1JKMkVFLnNldEoyZWVWZXJzaW9uSWQodmVyc2lvblN0cmluZyk7Ci0gICAgICAgICAgICAgIGNSSjJFRS5zZXRXc3JJZCh2YWxpZFJ1bnRpbWVzW2ldKTsKLSAgICAgICAgICAgICAgY1JKMkVFLnNldENsaWVudFByb2plY3RUeXBlSWQodGhpc0NsaWVudFByb2plY3RUeXBlSWQpOwotICAgICAgICAgICAgICByZXR1cm4gY1JKMkVFOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0gICAgcmV0dXJuIGNSSjJFRTsKLSAgfQotICAqLwotICAvLyByc2tyZWcKLSAgcHJpdmF0ZSB2b2lkIHNldENsaWVudERlZmF1bHRQcm9qZWN0KCkKLSAgewotICAgIGlmIChjbGllbnRJbml0aWFsUHJvamVjdF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGNsaWVudEluaXRpYWxQcm9qZWN0Xy5nZXROYW1lKCkpOwotICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBudWxsOwotICAgICAgaWYgKGNsaWVudEluaXRpYWxDb21wb25lbnROYW1lXyE9bnVsbCAmJiBjbGllbnRJbml0aWFsQ29tcG9uZW50TmFtZV8ubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgbW9kdWxlTmFtZSA9IGNsaWVudEluaXRpYWxDb21wb25lbnROYW1lXzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbW9kdWxlTmFtZSA9IEoyRUVVdGlscy5nZXRGaXJzdFdlYk1vZHVsZU5hbWUoY2xpZW50SW5pdGlhbFByb2plY3RfKTsKLSAgICAgIH0KLSAgICAgIGNsaWVudENvbXBvbmVudE5hbWVfID0gbW9kdWxlTmFtZTsKLSAgICAgIFN0cmluZyB2ZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKGNsaWVudEluaXRpYWxQcm9qZWN0XywgbW9kdWxlTmFtZSkpOwotICAgICAgU3RyaW5nW10gdmFsaWRWZXJzaW9ucyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKGNsaWVudElkc18uZ2V0UnVudGltZUlkKCkpLmdldEoyZWVMZXZlbHMoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTwgdmFsaWRWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHZhbGlkVmVyc2lvbnNbaV0uZXF1YWxzKHZlcnNpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgY2xpZW50SjJFRVZlcnNpb25fID0gdmFsaWRWZXJzaW9uc1tpXTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1BpY2sgdGhlIGZpcnN0IG9uZQotICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0QWxsUHJvamVjdHMoKTsKLSAgICAgIGlmIChwcm9qZWN0cy5sZW5ndGg+MCkKLSAgICAgIHsKLSAgICAgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShwcm9qZWN0c1swXS5nZXROYW1lKCkpOwotICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IEoyRUVVdGlscy5nZXRGaXJzdFdlYk1vZHVsZU5hbWUocHJvamVjdHNbMF0pOwotICAgICAgICBjbGllbnRDb21wb25lbnROYW1lXyA9IG1vZHVsZU5hbWU7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKHByb2plY3RzWzBdLCBtb2R1bGVOYW1lKSk7Ci0gICAgICAgIFN0cmluZ1tdIHZhbGlkVmVyc2lvbnMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKS5nZXRKMmVlTGV2ZWxzKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTwgdmFsaWRWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmICh2YWxpZFZlcnNpb25zW2ldLmVxdWFscyh2ZXJzaW9uKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbGllbnRKMkVFVmVyc2lvbl8gPSB2YWxpZFZlcnNpb25zW2ldOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL3RoZXJlIGFyZSBubyBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLiBQYXNzIHRoZSBkZWZhdWx0IG5hbWVzIGZvciBuZXcgcHJvamVjdHMuCi0gICAgICAgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0V2ViUHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIGNsaWVudENvbXBvbmVudE5hbWVfID0gUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0V2ViQ29tcG9uZW50TmFtZSgpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgfQotICAvLyByc2tyZWcKLSAgLyoKLSAgcHJpdmF0ZSB2b2lkIHNldENsaWVudERlZmF1bHRQcm9qZWN0KCkKLSAgeyAgICAKLQkvL0hhbmRsZSB0aGUgY2FzZSB3aGVyZSBubyB2YWxpZCBpbml0aWFsIHNlbGVjdGlvbiBleGlzdHMKLSAgICBpZiAoY2xpZW50SW5pdGlhbFByb2plY3RfID09IG51bGwgfHwgKGNsaWVudEluaXRpYWxQcm9qZWN0XyE9bnVsbCAmJiBjbGllbnRSdW50aW1lSjJFRVR5cGVfPT1udWxsKSkKLSAgICB7Ci0gICAgICAvL1NlbGVjdCB0aGUgZmlyc3QgZXhpc3RpbmcgcHJvamVjdCB0aGF0IGlzIHZhbGlkLgotICAgICAgc2V0Q2xpZW50UHJvamVjdFRvRmlyc3RWYWxpZCgpOwotICAgICAgcmV0dXJuOwotICAgIH0gICAgCi0KLSAgICBWYWxpZGF0aW9uVXRpbHMgdnUgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0gICAgaWYgKCF2dS5pc1Byb2plY3RTZXJ2aWNlUHJvamVjdChjbGllbnRJbml0aWFsUHJvamVjdF8sIHdzZGxVUklfLCBwYXJzZXJfKSkKLSAgICB7Ci0gICAgICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGNsaWVudEluaXRpYWxQcm9qZWN0Xy5nZXROYW1lKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0Q2xpZW50UHJvamVjdFRvRmlyc3RWYWxpZCgpOwotICAgIH0KLQotICB9Ci0gICovCi0gIC8qCi0gIHByaXZhdGUgdm9pZCBzZXRDbGllbnRQcm9qZWN0VG9GaXJzdFZhbGlkKCkKLSAgewotICAgIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgd3NjdFJlZyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBWYWxpZGF0aW9uVXRpbHMgdnUgPSBuZXcgVmFsaWRhdGlvblV0aWxzKCk7Ci0gICAgU3RyaW5nW10gcHJvamVjdE5hbWVzID0gZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8cHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtKHByb2plY3ROYW1lc1tpXSkpKTsKLSAgICAgIGlmIChwcm9qZWN0LmlzT3BlbigpICYmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0KSB8fCBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0KSB8fCBSZXNvdXJjZVV0aWxzLmlzQXBwQ2xpZW50UHJvamVjdChwcm9qZWN0KSkpCi0gICAgICB7Ci0gICAgICAgIC8vR2V0IHRoZSBKMkVFIGxldmVsCi0gICAgICAgIGludCB2ZXJzaW9uSWQgPSBKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24ocHJvamVjdCk7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YodmVyc2lvbklkKTsKLSAgICAgICAgCi0gICAgICAgIC8vR2V0IHRoZSBydW50aW1lIHRhcmdldCBvZiB0aGUgcHJvamVjdAotICAgICAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0UnVudGltZVRhcmdldChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBudWxsOwotICAgICAgICBpZiAocnVudGltZVRhcmdldCAhPSBudWxsKSAKLSAgICAgICAgICBydW50aW1lVGFyZ2V0SWQgPSBydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjbGllbnRKMkVFVmVyc2lvbl8gIT0gbnVsbCAmJiBjbGllbnRKMkVFVmVyc2lvbl8ubGVuZ3RoKCk+MCAmJiBjbGllbnRKMkVFVmVyc2lvbl8uZXF1YWxzKHZlcnNpb25TdHJpbmcpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHdzY3RSZWcuZG9lc1J1bnRpbWVTdXBwb3J0SjJFRUxldmVsKHZlcnNpb25TdHJpbmcsIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCkpICYmCi0gICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0ID09IG51bGwpIHx8IAotICAgICAgICAgICAgICgocnVudGltZVRhcmdldCE9bnVsbCkgJiYgd3NjdFJlZy5kb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQocnVudGltZVRhcmdldElkLCBjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKSkpIAotICAgICAgICAgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXZ1LmlzUHJvamVjdFNlcnZpY2VQcm9qZWN0KHByb2plY3QsIHdzZGxVUklfLCBwYXJzZXJfKSkKLSAgICAgICAgICAgIHsgICAgICAgIAkKLSAgICAgICAgICAgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShwcm9qZWN0TmFtZXNbaV0pOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vTm8gdmFsaWQgcHJvamVjdCB3YXMgZm91bmQuIEVudGVyIGEgbmV3IHByb2plY3QgbmFtZS4KLSAgICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKFJlc291cmNlVXRpbHMuZ2V0RGVmYXVsdFdlYlByb2plY3ROYW1lKCkpOwotICB9Ci0gICovCi0gIC8vIHJza3JlZwotICAKLSAgcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21Jbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmogIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7IAotICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKG9iaik7Ci0gICAgICAgICAgcmV0dXJuIHJlc291cmNlOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gIHByaXZhdGUgdm9pZCBzZXRDbGllbnREZWZhdWx0RUFSMigpCi0gIHsKLSAgICAvL0NsaWVudC1zaWRlCi0gICAgU3RyaW5nIGluaXRpYWxDbGllbnRQcm9qZWN0TmFtZSA9IGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxDbGllbnRQcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0oaW5pdGlhbENsaWVudFByb2plY3ROYW1lKSk7ICAgIAotICAgIElQcm9qZWN0IGRlZmF1bHRDbGllbnRFQVIgPSBnZXREZWZhdWx0RUFSRnJvbUNsaWVudFByb2plY3QoaW5pdGlhbENsaWVudFByb2plY3QpOwotICAgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdENsaWVudEVBUi5nZXROYW1lKCkpOwotICB9Ci0gICovCi0gIAotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50RGVmYXVsdEVBUigpCi0gIHsgICAgCi0gICAgU3RyaW5nIGluaXRpYWxDbGllbnRQcm9qZWN0TmFtZSA9IGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxDbGllbnRQcm9qZWN0ID0gICAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShpbml0aWFsQ2xpZW50UHJvamVjdE5hbWUpKTsKLSAgICBJVmlydHVhbENvbXBvbmVudFtdIGVhckNvbXBzID0gSjJFRVV0aWxzLmdldFJlZmVyZW5jaW5nRUFSQ29tcG9uZW50cyhpbml0aWFsQ2xpZW50UHJvamVjdCwgY2xpZW50Q29tcG9uZW50TmFtZV8pOwotICAgIGlmIChlYXJDb21wcy5sZW5ndGg+MCkKLSAgICB7Ci0gICAgICAvL1BpY2sgdGhlIGZpcnN0IG9uZQotICAgICAgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcCA9IGVhckNvbXBzWzBdOwotICAgICAgU3RyaW5nIGVhclByb2plY3ROYW1lID0gZWFyQ29tcC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotICAgICAgU3RyaW5nIGVhckNvbXBvbmVudE5hbWUgPSBlYXJDb21wLmdldE5hbWUoKTsKLSAgICAgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZWFyUHJvamVjdE5hbWUpOwotICAgICAgY2xpZW50RWFyQ29tcG9uZW50TmFtZV8gPSBlYXJDb21wb25lbnROYW1lOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9Db21wb25lbnQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgRUFScywgc28gcGljayB0aGUgZmlyc3QgRUFSIHlvdSBzZWUgd2l0aCB0aGUgY29ycmVjdCBKMkVFIHZlcnNpb24uCi0gICAgICBJVmlydHVhbENvbXBvbmVudFtdIGFsbEVhckNvbXBzID0gSjJFRVV0aWxzLmdldEFsbEVBUkNvbXBvbmVudHMoKTsKLSAgICAgIGlmIChhbGxFYXJDb21wcy5sZW5ndGg+MCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGFsbEVhckNvbXBzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNsaWVudEoyRUVWZXJzaW9uXy5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKGFsbEVhckNvbXBzW2ldKSkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IGFsbEVhckNvbXBzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGVhclByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIGNsaWVudEVhckNvbXBvbmVudE5hbWVfID0gYWxsRWFyQ29tcHNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy90aGVyZSBhcmUgbm8gRWFycy4KLSAgICAgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShSZXNvdXJjZVV0aWxzLmdldERlZmF1bHRDbGllbnRFQVJQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgY2xpZW50RWFyQ29tcG9uZW50TmFtZV8gPSBSZXNvdXJjZVV0aWxzLmdldERlZmF1bHRDbGllbnRFQVJDb21wb25lbnROYW1lKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIAotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gcHJvamVjdAotICAgKiBAcmV0dXJuCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZCBOZWVkcyB0byBiZSByZS13cml0dGVuIHRvIGRlYWwgd2l0aCBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZSBBUElzIAotICAgKi8KLSAgLyoKLSAgcHJvdGVjdGVkIElQcm9qZWN0IGdldERlZmF1bHRFQVJGcm9tQ2xpZW50UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgaWYgKHByb2plY3QhPW51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkgCi0gICAgewotICAgICAgSVNlcnZlcltdIGNvbmZpZ3VyZWRTZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotICAgICAgSVNlcnZlciBmaXJzdFN1cHBvcnRlZFNlcnZlciA9IENsaWVudFNlcnZlclNlbGVjdGlvblV0aWxzLmdldEZpcnN0U3VwcG9ydGVkU2VydmVyKGNvbmZpZ3VyZWRTZXJ2ZXJzLCBjbGllbnRJZHNfLmdldFR5cGVJZCgpICk7Ci0gICAgICAKLSAgICAgIEVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cyhwcm9qZWN0LCBmaXJzdFN1cHBvcnRlZFNlcnZlcik7Ci0gICAgICBpZiAoZWFyUHJvamVjdHMhPW51bGwgJiYgZWFyUHJvamVjdHNbMF0gaW5zdGFuY2VvZiBFQVJOYXR1cmVSdW50aW1lKSAKLSAgICAgICAgcmV0dXJuIGVhclByb2plY3RzWzBdLmdldFByb2plY3QoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IHZlcnNpb25JZCA9IC0xOwotICAgIGlmIChjbGllbnRKMkVFVmVyc2lvbl8gIT0gbnVsbCAmJiBjbGllbnRKMkVFVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICB2ZXJzaW9uSWQgPSBJbnRlZ2VyLnBhcnNlSW50KGNsaWVudEoyRUVWZXJzaW9uXyk7Ci0gICAgfQotICAgIEVBUk5hdHVyZVJ1bnRpbWUgbmV3RUFSID0gSjJFRVV0aWxzLmdldEVBUih2ZXJzaW9uSWQpOwotCi0gICAgSVByb2plY3QgZWFyUHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0Q2xpZW50RUFSUHJvamVjdE5hbWUoKSk7Ci0gICAgICAKLSAgICBpZiAobmV3RUFSIT1udWxsKQotICAgICAgZWFyUHJvamVjdCA9IG5ld0VBUi5nZXRQcm9qZWN0KCk7Ci0KLSAgICByZXR1cm4gZWFyUHJvamVjdDsgIAkKLSAgfQotICAqLwotICBwcml2YXRlIHZvaWQgc2V0Q2xpZW50RGVmYXVsdFNlcnZlcigpCi0gIHsKLSAgICBTdHJpbmcgaW5pdGlhbENsaWVudFByb2plY3ROYW1lID0gcnVudGltZUNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQoaW5pdGlhbENsaWVudFByb2plY3ROYW1lKTsKLSAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gbnVsbDsKLSAgICBpZiAocnVudGltZVRhcmdldCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJ1bnRpbWVUYXJnZXRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgLy9QaWNrIGEgY29tcGF0aWJsZSBleGlzdGluZyBzZXJ2ZXIgaWYgb25lIGV4aXN0cy4KLSAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhydW50aW1lVGFyZ2V0KTsKLSAgICAgIGlmIChzZXJ2ZXJzIT1udWxsICYmIHNlcnZlcnMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRoaXNGYWN0b3J5SWQgPSBzZXJ2ZXJzWzBdLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgIGlmIChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlcihjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpLCB0aGlzRmFjdG9yeUlkKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL1BpY2sgdGhpcyBzZXJ2ZXIgYW5kIHJldHVybi4KLSAgICAgICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySWQodGhpc0ZhY3RvcnlJZCk7Ci0gICAgICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVyc1swXS5nZXRJZCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9ObyBjb21wYXRpYmxlIGV4aXN0aW5nIHNlcnZlciwgc2V0IHRoZSBmYWN0b3J5IGlkIHRvIHNvbWV0aGluZyB0aGUgcnVudGltZSBzdXBwb3J0cwotICAgICAgU3RyaW5nW10gZmFjdG9yeUlkcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKGNsaWVudElkc18uZ2V0UnVudGltZUlkKCkpLmdldFNlcnZlckZhY3RvcnlJZHMoKTsKLSAgICAgIGlmIChmYWN0b3J5SWRzIT1udWxsICYmIGZhY3RvcnlJZHMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxmYWN0b3J5SWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoZmFjdG9yeUlkc1tpXSk7Ci0gICAgICAgICAgaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmVyUnVudGltZVR5cGVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOyAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNlcnZlclJ1bnRpbWVUeXBlSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXRJZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vRm91bmQgYSBtYXRjaAotICAgICAgICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlcklkKGZhY3RvcnlJZHNbaV0pOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy9SdW50aW1lIGRvZXMgbm90IHNwZWNpZnkgYW55IHNlcnZlciBmYWN0b3J5IGlkcwotICAgICAgICBJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlcklkKHNlcnZlclR5cGVzWzBdLmdldElkKCkpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUaGUgcHJvamVjdCBoYXMgbm8gc2VydmVyIHRhcmdldCBzbyBwaWNrIGEgc2VydmVyIGZhY3RvcnkgaWQgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWUKLSAgICAgIFN0cmluZ1tdIGZpZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChjbGllbnRJZHNfLmdldFJ1bnRpbWVJZCgpKS5nZXRTZXJ2ZXJGYWN0b3J5SWRzKCk7Ci0gICAgICBpZiAoZmlkcyE9bnVsbCAmJiBmaWRzLmxlbmd0aD4wKQotICAgICAgewotICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlcklkKGZpZHNbMF0pOyAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vUnVudGltZSBkb2VzIG5vdCBzcGVjaWZ5IGFueSBzZXJ2ZXIgZmFjdG9yeSBpZHMKLSAgICAgICAgSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLSAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJUeXBlc1swXS5nZXRJZCgpKTsgICAgICAgIAotICAgICAgfQotICAgICAgICAgICAgCi0gICAgfSAgICAgICAgCi0gIH0KLSAgLyoKLSAgcHJpdmF0ZSB2b2lkIHNldENsaWVudERlZmF1bHRTZXJ2ZXIoKQotICB7Ci0gICAgLy9DYWxjdWxhdGUgcmVhc29uYWJsZSBkZWZhdWx0IHNlcnZlciBiYXNlZCBvbiBpbml0aWFsIHByb2plY3Qgc2VsZWN0aW9uLiAKLSAgICBTdHJpbmcgaW5pdGlhbENsaWVudFByb2plY3ROYW1lID0gcnVudGltZUNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxDbGllbnRQcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0oaW5pdGlhbENsaWVudFByb2plY3ROYW1lKSk7Ci0gICAgaWYgKGluaXRpYWxDbGllbnRQcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBDbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChpbml0aWFsQ2xpZW50UHJvamVjdCwgY2xpZW50SWRzXy5nZXRUeXBlSWQoKSwgY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSwgdHJ1ZSk7Ci0gICAgICBpZiAoc2VydmVySW5mbyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNlcnZlckluZm9bMF0hPW51bGwgJiYgc2VydmVySW5mb1swXS5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmVySW5mb1sxXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzFdLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBjbGllbnRJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVySW5mb1sxXSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfSAgICAgIAotICAgIH0KLSAgICBlbHNlIC8vdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3QuCi0gICAgewotICAgICAgLy9Eb2VzIHRoZSBFQVIgZXhpc3Q/Ci0gICAgICBTdHJpbmcgaW5pdGlhbENsaWVudEVBUlByb2plY3ROYW1lID0gcnVudGltZUNsaWVudFR5cGVzXy5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBJUHJvamVjdCBpbml0aWFsQ2xpZW50RUFSUHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxDbGllbnRFQVJQcm9qZWN0TmFtZSkpOwotICAgICAgaWYgKGluaXRpYWxDbGllbnRFQVJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gQ2xpZW50U2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoaW5pdGlhbENsaWVudEVBUlByb2plY3QsIGNsaWVudElkc18uZ2V0VHlwZUlkKCksIGNsaWVudElkc18uZ2V0UnVudGltZUlkKCksIGZhbHNlKTsKLSAgICAgICAgaWYgKHNlcnZlckluZm8hPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc2VydmVySW5mb1swXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzBdLmxlbmd0aCgpPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMV0hPW51bGwgJiYgc2VydmVySW5mb1sxXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbmZvWzFdKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBDbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRTZXJ2ZXJGcm9tQ2xpZW50UnVudGltZUFuZEoyRUUoY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSwgY2xpZW50SjJFRVZlcnNpb25fKTsKLSAgICAgICAgaWYgKHNlcnZlckluZm8hPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc2VydmVySW5mb1swXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzBdLmxlbmd0aCgpPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgY2xpZW50SWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMV0hPW51bGwgJiYgc2VydmVySW5mb1sxXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudElkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbmZvWzFdKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICB9ICAgICAgICAKLSAgfSAgCi0gICovCi0gIAotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDbGllbnRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIFN0cmluZyBzZXJ2aWNlVHlwZUlkKQotICB7Ci0gICAgYm9vbGVhbiBpc0VKQiA9IGZhbHNlOwotICAgIFN0cmluZyBpbXBsSWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldEltcGxJZEZyb21UeXBlSWQoc2VydmljZVR5cGVJZCk7Ci0gICAgaXNFSkIgPSAoaW1wbElkLmVxdWFscygib3JnLmVjbGlwc2UuanN0LndzLndzSW1wbC5lamIiKSk7Ci0gICAgU3RyaW5nW10gdXBkYXRlZE5hbWVzID0gUmVzb3VyY2VVdGlscy5nZXRDbGllbnRQcm9qZWN0Q29tcG9uZW50TmFtZShwcm9qZWN0TmFtZSwgY29tcG9uZW50TmFtZSwgaXNFSkIpOwotICAgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUodXBkYXRlZE5hbWVzWzBdKTsKLSAgICBjbGllbnRDb21wb25lbnROYW1lXyA9IHVwZGF0ZWROYW1lc1sxXTsKLSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2xpZW50RUFScygpCi0gIHsKLSAgCS8vU2V0IEVBUiBzZWxlY3Rpb24gdG8gbnVsbCBpZiB0aGUgcHJvamVjdC9zZXJ2ZXIgZGVmYXVsdHMgaW1wbHkgYW4gRUFSIHNob3VsZCBub3QgYmUgY3JlYXRlZAotICAgIFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSA9IGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIAlJUHJvamVjdCBjbGllbnRQcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0oY2xpZW50UHJvamVjdE5hbWUpKTsKLSAgCWlmIChjbGllbnRQcm9qZWN0ICE9IG51bGwgJiYgY2xpZW50UHJvamVjdC5leGlzdHMoKSkKLSAgCXsKLSAgCSAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9uIHRoZSBzZXJ2aWNlUHJvamVjdAotICAJICBJUnVudGltZSBjbGllbnRUYXJnZXQgPSBDbGllbnRTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRSdW50aW1lVGFyZ2V0KGNsaWVudFByb2plY3ROYW1lKTsKLSAgCSAgU3RyaW5nIGoyZWVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKGNsaWVudFByb2plY3QsIGNsaWVudENvbXBvbmVudE5hbWVfKSk7Ci0gIAkgIGlmIChjbGllbnRUYXJnZXQgIT0gbnVsbCkKLSAgCSAgewotICAJICAJaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKGNsaWVudFRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCksajJlZVZlcnNpb24pKQotICAJICAJewotICAJICAgICAgLy9EZWZhdWx0IHRoZSBFQVIgc2VsZWN0aW9uIHRvIGJlIGVtcHR5Ci0gIAkgIAkgIGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0SW5kZXgoLTEpOwotICAgICAgICAgIGNsaWVudEVhckNvbXBvbmVudE5hbWVfPSIiOwotICAJICAJICBjbGllbnROZWVkRUFSXyA9IGZhbHNlOwotICAJICAJfSAgCSAgCQkKLSAgCSAgfQotICAJICAKLSAgCX0KLSAgCWVsc2UKLSAgCXsKLSAgCQkvL1VzZSB0aGUgc2VydmVyIHR5cGUKLSAgCQlTdHJpbmcgY2xpZW50U2VydmVyVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKGNsaWVudElkc18uZ2V0U2VydmVySWQoKSk7Ci0gIAkJaWYgKGNsaWVudFNlcnZlclRhcmdldElkIT1udWxsICYmIGNsaWVudFNlcnZlclRhcmdldElkLmxlbmd0aCgpPjApCi0gIAkJewotICAJCSAgaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKGNsaWVudFNlcnZlclRhcmdldElkLGNsaWVudEoyRUVWZXJzaW9uXykpCi0gIAkgIAkgIHsKLSAgCSAgICAgICAgLy9EZWZhdWx0IHRoZSBFQVIgc2VsZWN0aW9uIHRvIGJlIGVtcHR5Ci0gIAkgIAkgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRJbmRleCgtMSk7Ci0gICAgICAgICAgICBjbGllbnRFYXJDb21wb25lbnROYW1lXz0iIjsKLSAgCSAgCSAgICBjbGllbnROZWVkRUFSXyA9IGZhbHNlOwotICAJICAJICB9Ci0gIAkJfQotICAJfSAgCQotICB9ICAKLSAgCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0c0ZvckV4dGVuc2lvbihFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBJV2ViU2VydmljZVJ1bnRpbWUgd3NydCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWUoY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0gICAgaWYgKHdzcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlQ2xpZW50SW5mbyB3c0luZm8gPSBuZXcgV2ViU2VydmljZUNsaWVudEluZm8oKTsKLQotICAgICAgd3NJbmZvLnNldEoyZWVMZXZlbChjbGllbnRKMkVFVmVyc2lvbl8pOwotICAgICAgd3NJbmZvLnNldFNlcnZlckZhY3RvcnlJZChjbGllbnRJZHNfLmdldFNlcnZlcklkKCkpOwotICAgICAgd3NJbmZvLnNldFNlcnZlckluc3RhbmNlSWQoY2xpZW50SWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgICAgd3NJbmZvLnNldFN0YXRlKFdlYlNlcnZpY2VTdGF0ZS5VTktOT1dOX0xJVEVSQUwpOwotICAgICAgd3NJbmZvLnNldFdlYlNlcnZpY2VSdW50aW1lSWQoY2xpZW50SWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0gICAgICB3c0luZm8uc2V0V3NkbFVSTCh3c2RsVVJJXyk7Ci0KLSAgICAgIGVudmlyb25tZW50XyA9IGVudjsKLSAgICAgIHdlYlNlcnZpY2VDbGllbnRfID0gd3NydC5nZXRXZWJTZXJ2aWNlQ2xpZW50KHdzSW5mbyk7Ci0gICAgICBXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW8gPSBXZWJTZXJ2aWNlU2NlbmFyaW8uQ0xJRU5UX0xJVEVSQUw7Ci0gICAgICBpZiAocmVzb3VyY2VDb250ZXh0XyAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb250ZXh0XyA9IG5ldyBTaW1wbGVDb250ZXh0KHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRlc3RfLCBmYWxzZSwgc2NlbmFyaW8sIHJlc291cmNlQ29udGV4dF8uaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSwgcmVzb3VyY2VDb250ZXh0XwotICAgICAgICAgICAgLmlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKSwgcmVzb3VyY2VDb250ZXh0Xy5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpOwotICAgICAgfQotICAgIH0KLSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgY2xpZW50SW5pdGlhbFNlbGVjdGlvbl8gPSBzZWxlY3Rpb247Ci0gICAgaWYgKGNsaWVudEluaXRpYWxQcm9qZWN0XyA9PSBudWxsKQotICAgIHsKLSAgICAgIGNsaWVudEluaXRpYWxQcm9qZWN0XyA9IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgICAgY2xpZW50SW5pdGlhbENvbXBvbmVudE5hbWVfID0gZ2V0Q29tcG9uZW50TmFtZUZyb21Jbml0aWFsU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50SW5pdGlhbFByb2plY3QoSVByb2plY3QgY2xpZW50SW5pdGlhbFByb2plY3QpCi0gIHsKLSAgICBjbGllbnRJbml0aWFsUHJvamVjdF8gPSBjbGllbnRJbml0aWFsUHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50SW5pdGlhbENvbXBvbmVudE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBjbGllbnRJbml0aWFsQ29tcG9uZW50TmFtZV8gPSBuYW1lOwotICB9ICAKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gaW5pdGlhbEluaXRpYWxTZWxlY3Rpb25fIFRoZSBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbEluaXRpYWxTZWxlY3Rpb24pCi0gIHsKLSAgICBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbl8gPSBpbml0aWFsSW5pdGlhbFNlbGVjdGlvbjsKLSAgICBpbml0aWFsSW5pdGlhbFByb2plY3RfID0gZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKGluaXRpYWxJbml0aWFsU2VsZWN0aW9uKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50TmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50TmVlZEVBUl87Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHBhcnNlcl8gVGhlIHBhcnNlcl8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZXNQYXJzZXIoV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyKSB7Ci0gIAlwYXJzZXJfID0gcGFyc2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgd3NkbFVSSV8gPSB3c2RsVVJJOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZShib29sZWFuIHRlc3RTZXJ2aWNlKQotICB7Ci0gICAgdGVzdF8gPSB0ZXN0U2VydmljZTsKLSAgfSAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VDb250ZXh0KCBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0ICkKLSAgewotICAgIHJlc291cmNlQ29udGV4dF8gPSByZXNvdXJjZUNvbnRleHQ7ICAgCi0gIH0gIAotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsgCi0gICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgICBpZiAocmVzb3VyY2U9PW51bGwpIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgSVByb2plY3QgcCA9IFJlc291cmNlVXRpbHMuZ2V0UHJvamVjdE9mKHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENvbXBvbmVudE5hbWVGcm9tSW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqICE9IG51bGwpIAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgeyAKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihvYmopOwotICAgICAgICAgIGlmIChyZXNvdXJjZT09bnVsbCkgCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAKLSAgICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gUmVzb3VyY2VVdGlscy5nZXRDb21wb25lbnRPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLSAgICAgICAgICBpZiAoY29tcCE9bnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcC5nZXROYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENsaWVudFByb2plY3RUeXBlRnJvbVJ1bnRpbWVJZChJUHJvamVjdCBwLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgLy9OYXZpZ2F0ZSB0aGUgcnVudGltZUNsaWVudFR5cGVzIHRvIHNlZSBpZiB3ZSBjYW4gbmF2aWdhdGUgZnJvbSB0aGUgcHJvdmlkZWQKLSAgICAvL3J1bnRpbWUgdG8gdGhlIHByb3ZpZGVkIHByb2plY3QncyBuYW1lLgotICAgIFN0cmluZyBwTmFtZSA9IHAuZ2V0TmFtZSgpOwotICAgIFN0cmluZ1tdIHJ1bnRpbWVJZHMgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICBpbnQgbnVtYmVyT2ZSdW50aW1lcyA9IHJ1bnRpbWVJZHMubGVuZ3RoOwotICAgIC8vR2V0IHRoZSBpbmRleCBvZiB0aGUgcnVudGltZUlkIHdlIGFyZSBpbnRlcmVzdGVkIGluCi0gICAgZm9yIChpbnQgaT0wOyBpPG51bWJlck9mUnVudGltZXM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocnVudGltZUlkc1tpXS5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgIHsKLSAgICAgICAgLy9HZXQgdGhlIGxpc3Qgb2YgY2xpZW50IHByb2plY3QgdHlwZXMgZm9yIHRoaXMgcnVudGltZUlkCi0gICAgICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNsaWVudFByb2plY3RUeXBlc1RvUHJvamVjdHM9IGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoaSk7Ci0gICAgICAgIFN0cmluZ1tdIGNsaWVudFByb2plY3RUeXBlcyA9IGNsaWVudFByb2plY3RUeXBlc1RvUHJvamVjdHMuZ2V0TGlzdCgpLmdldExpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaj0wOyBqPGNsaWVudFByb2plY3RUeXBlcy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIC8vR2V0IHRoZSBsaXN0IG9mIHByb2plY3RzIGZvciB0aGlzIGNsaWVudFByb2plY3RUeXBlLiBJZiBwTmFtZQotICAgICAgICAgIC8vaXMgaW4gdGhpcyBsaXN0LCB3ZSBrbm93IHRoZSBydW50aW1lSWQgc3VwcG9ydHMgdGhpcyBwcm9qZWN0Ci0gICAgICAgICAgLy9hbmQgd2Uga25vdyB0aGUgY2xpZW50IHByb2plY3QgdHlwZS4KLSAgICAgICAgICBTdHJpbmdbXSBjbGllbnRQcm9qZWN0cyA9IGNsaWVudFByb2plY3RUeXBlc1RvUHJvamVjdHMuZ2V0Q2hvaWNlKGopLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgICAgICAgZm9yIChpbnQgaz0wOyBrPGNsaWVudFByb2plY3RzLmxlbmd0aDsgaysrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjbGllbnRQcm9qZWN0c1trXS5lcXVhbHMocE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL0ZvdW5kIHRoZSBwcm9qZWN0ISEKLSAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudFByb2plY3RUeXBlc1tqXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgLy9XZSBkaWRuJ3QgZmluZCB0aGUgcHJvamVjdCB1bmRlciBhbnkgb2YgdGhpcyBydW50aW1lcyBjbGllbnQgcHJvamVjdCB0eXBlcy4KLSAgICAvL1RoaXMgbWVhbnMgdGhhdCB0aGlzIHJ1bnRpbWUgZG9lcyBub3Qgc3VwcG9ydCB0aGF0IGNsaWVudCB0eXBlLiBSZXR1cm4gbnVsbAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QWxsRmxleGlibGVQcm9qZWN0cygpCi0gIHsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKCFwcm9qZWN0c1tpXS5nZXROYW1lKCkuZXF1YWxzKCJTZXJ2ZXJzIikgJiYgIXByb2plY3RzW2ldLmdldE5hbWUoKS5zdGFydHNXaXRoKCIuIikpCi0gICAgICB7Ci0gICAgICAgIHYuYWRkKHByb2plY3RzW2ldLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgICAKLSAgICByZXR1cm4gKFN0cmluZ1tdKXYudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgYmVpbmcgdXNlZCB0byBwYXNzIGFyb3VuZCBXZWIgc2VydmljZSBydW50aW1lCi0gICAqIGFuZCBKMkVFIGxldmVsIGluZm9ybWF0aW9uLgotICAgKiAKLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBXU1J1bnRpbWVKMkVFVHlwZQotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3NySWRfOwotICAgIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uSWRfOwotICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3RUeXBlSWQ7IC8vb25seSB1c2VkIGZvciBjbGllbnQtc2lkZSBkZWZhdWx0aW5nCi0gICAgCi0gICAgcHVibGljIFdTUnVudGltZUoyRUVUeXBlKCkKLSAgICB7Ci0gICAgIC8vbWFraW5nIHRoaXMgY3RvciBwdWJsaWMgc28gdGhhdCBzdWJjbGFzc2VzIGNhbiBpbnN0YW50aWF0ZS4gCi0gICAgfSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGoyZWVWZXJzaW9uSWRfLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SjJlZVZlcnNpb25JZCgpCi0gICAgewotICAgICAgcmV0dXJuIGoyZWVWZXJzaW9uSWRfOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdmVyc2lvbklkXyBUaGUgajJlZVZlcnNpb25JZF8gdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEoyZWVWZXJzaW9uSWQoU3RyaW5nIHZlcnNpb25JZF8pCi0gICAgewotICAgICAgajJlZVZlcnNpb25JZF8gPSB2ZXJzaW9uSWRfOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdzcklkXy4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzcklkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gd3NySWRfOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd3NySWRfIFRoZSB3c3JJZF8gdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzcklkKFN0cmluZyB3c3JJZF8pCi0gICAgewotICAgICAgdGhpcy53c3JJZF8gPSB3c3JJZF87Ci0gICAgfSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsaWVudFByb2plY3RUeXBlSWQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0VHlwZUlkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gY2xpZW50UHJvamVjdFR5cGVJZDsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHBhcmFtIGNsaWVudFByb2plY3RUeXBlSWQgVGhlIGNsaWVudFByb2plY3RUeXBlSWQgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3RUeXBlSWQoU3RyaW5nIGNsaWVudFByb2plY3RUeXBlSWQpCi0gICAgewotICAgICAgdGhpcy5jbGllbnRQcm9qZWN0VHlwZUlkID0gY2xpZW50UHJvamVjdFR5cGVJZDsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9Qcm9qZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9Qcm9qZWN0U2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYTNkNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvUHJvamVjdFNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlNlcnZlclNlbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIHsKLQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFQVJfUEVSTUlUVEVEX1BST0pFQ1RfVFlQRSA9ICJFQVJfUEVSTUlUVEVEX1BST0pFQ1RfVFlQRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEpBVkFfUFJPSkVDVF9UWVBFX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5Db250YWluZXJsZXNzIjsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgcHJvamVjdHNfOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRFQVJfOwotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0cnNJZHNfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdFR5cGVJZF8gPSBFQVJfUEVSTUlUVEVEX1BST0pFQ1RfVFlQRTsKLQotICBwcml2YXRlIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyXzsKLQotICBwcml2YXRlIFRleHQgbWVzc2FnZVRleHRfOwotCi0gIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudF8gPSBmYWxzZTsKLQotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLQotICBwcml2YXRlIGJ5dGUgQ1JFQVRFX1BST0pFQ1QgPSAoYnl0ZSkgMTsKLQotICBwcml2YXRlIGJ5dGUgQ1JFQVRFX0VBUiA9IChieXRlKSAyOwotCi0gIHByaXZhdGUgYnl0ZSBBRERfRUFSX0FTU09DSUFUSU9OID0gKGJ5dGUpIDQ7Ci0gIAotICBwcml2YXRlIENvbWJvIG1vZHVsZVByb2plY3RfOwotICBwcml2YXRlIENvbWJvIGVhclByb2plY3RfOwotICBwcml2YXRlIGludCAgIGNvbXBvbmVudFR5cGVfOwotICAKLSAgcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2R1bGVQcm9qZWN0TGlzdGVuZXJfOwotICBwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZHVsZUxpc3RlbmVyXzsKLSAgcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBlYXJQcm9qZWN0TGlzdGVuZXJfOwotCi0gIHByaXZhdGUgU3RyaW5nIGluaXRpYWxNb2R1bGVOYW1lXzsKLSAgCi0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDYgZm9yIHRoZSBzZXJ2aWNlLXNpZGUgV2ViIHByb2plY3QgY29tYm8gYm94IG9mIHRoZQotICAgKiBydW50aW1lIHNlbGVjdGlvbiBQYWdlCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCA9IHBsdWdpbklkXyArICIuUFdSUzAwMDYiOwotCi0gIHByaXZhdGUgQ29tYm8gbW9kdWxlXzsKLQotICAvKiBDT05URVhUX0lEIFBXUlMwMDEyIGZvciB0aGUgRUFSIGNvbWJvIGJveCBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfQ09NQk9fRUFSID0gcGx1Z2luSWRfICsgIi5QV1JTMDAxMiI7Ci0KLSAgcHJpdmF0ZSBDb21ibyBlYXJNb2R1bGVfOwotCi0gIC8qCi0gICAqIERlZmF1bHQgQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KCkgewotICB9Ci0KLSAgLyoKLSAgICogUHJvamVjdFNlbGVjdGlvbldpZGdldCBAcGFyYW0gaXNDbGllbnQKLSAgICovCi0gIHB1YmxpYyBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0KGJvb2xlYW4gaXNDbGllbnQpIHsKLSAgICB0aGlzLmlzQ2xpZW50XyA9IGlzQ2xpZW50OwotICB9Ci0KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBVSVV0aWxzIHVpVXRpbHMgPSBuZXcgVUlVdGlscyhtc2dVdGlscywgcGx1Z2luSWRfKTsKLQotICAgIHN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOwotCQkKLSAgICBpZiAoaXNDbGllbnRfKQotCXsKLQkgIG1vZHVsZVByb2plY3RfID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYXJlbnQsICJMQUJFTF9DTElFTlRfUFJPSkVDVCIsICJMQUJFTF9DTElFTlRfUFJPSkVDVCIsIElORk9QT1BfUFdSU19DT01CT19QUk9KRUNULCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotICAgICAgbW9kdWxlXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCAiTEFCRUxfQ0xJRU5UX01PRFVMRSIsICJMQUJFTF9DTElFTlRfTU9EVUxFIiwgSU5GT1BPUF9QV1JTX0NPTUJPX1BST0pFQ1QsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkgIGVhclByb2plY3RfID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYXJlbnQsICJMQUJFTF9DTElFTlRfRUFSX1BST0pFQ1QiLCAiTEFCRUxfQ0xJRU5UX0VBUl9QUk9KRUNUIiwgSU5GT1BPUF9QV1JTX0NPTUJPX1BST0pFQ1QsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSICk7Ci0JICBlYXJNb2R1bGVfID0gdWlVdGlscy5jcmVhdGVDb21ibyhwYXJlbnQsICJMQUJFTF9DTElFTlRfRUFSX01PRFVMRSIsICJMQUJFTF9DTElFTlRfRUFSX01PRFVMRSIsIElORk9QT1BfUFdSU19DT01CT19FQVIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICB9Ci0gICAgZWxzZSAKLQl7Ci0JICBtb2R1bGVQcm9qZWN0XyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCAiTEFCRUxfU0VSVklDRV9QUk9KRUNUIiwgIkxBQkVMX1NFUlZJQ0VfUFJPSkVDVCIsIElORk9QT1BfUFdSU19DT01CT19QUk9KRUNULCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotICAgICAgbW9kdWxlXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCAiTEFCRUxfU0VSVklDRV9NT0RVTEUiLCAiTEFCRUxfU0VSVklDRV9NT0RVTEUiLCBJTkZPUE9QX1BXUlNfQ09NQk9fUFJPSkVDVCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCSAgZWFyUHJvamVjdF8gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKHBhcmVudCwgIkxBQkVMX1NFUlZJQ0VfRUFSX1BST0pFQ1QiLCAiTEFCRUxfU0VSVklDRV9FQVJfUFJPSkVDVCIsIElORk9QT1BfUFdSU19DT01CT19QUk9KRUNULCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotCSAgZWFyTW9kdWxlXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8ocGFyZW50LCAiTEFCRUxfU0VSVklDRV9FQVJfTU9EVUxFIiwgIkxBQkVMX1NFUlZJQ0VfRUFSX01PRFVMRSIsIElORk9QT1BfUFdSU19DT01CT19FQVIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICB9Ci0JCi0gICAgLy9tb2R1bGVfLmFkZE1vZGlmeUxpc3RlbmVyKHByb2plY3RMaXN0ZW5lcl8pOwotCQotICAgIC8vZWFyTW9kdWxlXy5hZGRNb2RpZnlMaXN0ZW5lcihlYXJMaXN0ZW5lcl8pOwotICAgIC8vZWFyTW9kdWxlXy5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lcik7Ci0JCi0JbW9kdWxlUHJvamVjdExpc3RlbmVyXyA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2dCkgCi0JCQkJCSAgICAgICAgICAgewotCQkJCQkgICAgICAgICAgICAgaGFuZGxlTW9kdWxlUHJvamVjdENoYW5nZWQobnVsbCk7Ci0JCQkJCSAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLQltb2R1bGVMaXN0ZW5lcl8gPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZ0KSAKLQkJCSAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgICAgaGFuZGxlTW9kdWxlQ2hhbmdlZCgpOwotCQkJCSAgICAgICAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLQkgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICB9OwotCQotCWVhclByb2plY3RMaXN0ZW5lcl8gPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldnQpIAotCQkJCSAgICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICAgIGhhbmRsZUVhclByb2plY3RDaGFuZ2VkKCk7Ci0JCQkJICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lcl8uaGFuZGxlRXZlbnQoIG51bGwgKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0JCQkJCQkJICAKLSAgICAvLyBtZXNzYWdlIGFyZWEKLSAgICBtZXNzYWdlVGV4dF8gPSB1aVV0aWxzLmNyZWF0ZVRleHQocGFyZW50LCAiTEFCRUxfTk9fTEFCRUwiLCAiTEFCRUxfTk9fTEFCRUwiLCBudWxsLCBTV1QuV1JBUCB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgbGlzdGVuZXJzT24oKQotICB7Ci0JbW9kdWxlXy5hZGRNb2RpZnlMaXN0ZW5lciggbW9kdWxlTGlzdGVuZXJfICk7Ci0JbW9kdWxlUHJvamVjdF8uYWRkTW9kaWZ5TGlzdGVuZXIoIG1vZHVsZVByb2plY3RMaXN0ZW5lcl8gKTsKLQllYXJQcm9qZWN0Xy5hZGRNb2RpZnlMaXN0ZW5lciggZWFyUHJvamVjdExpc3RlbmVyXyApOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgbGlzdGVuZXJzT2ZmKCkKLSAgewotICAgIG1vZHVsZV8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoIG1vZHVsZUxpc3RlbmVyXyApOwotCW1vZHVsZVByb2plY3RfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKCBtb2R1bGVQcm9qZWN0TGlzdGVuZXJfICk7Ci0JZWFyUHJvamVjdF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoIGVhclByb2plY3RMaXN0ZW5lcl8gKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1vZHVsZVByb2plY3RDaGFuZ2VkKFN0cmluZyBtb2R1bGVOYW1lKQotICB7Ci0JU3RyaW5nICAgcHJvamVjdE5hbWUgPSBtb2R1bGVQcm9qZWN0Xy5nZXRUZXh0KCk7IAotCUlQcm9qZWN0IHByb2plY3QgICAgID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KCBwcm9qZWN0TmFtZSApOwotCQotCWNvbXBvbmVudFR5cGVfID0gSjJFRVV0aWxzLldFQiB8IEoyRUVVdGlscy5FSkI7Ci0JCi0JSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzID0gSjJFRVV0aWxzLmdldENvbXBvbmVudHNCeVR5cGUoIHByb2plY3QsIGNvbXBvbmVudFR5cGVfICk7Ci0JU3RyaW5nW10gbW9kdWxlcyA9IG5ldyBTdHJpbmdbY29tcG9uZW50cy5sZW5ndGhdOwotCQotCWZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjb21wb25lbnRzLmxlbmd0aDsgaW5kZXgrKyApCi0JewotCSAgbW9kdWxlc1tpbmRleF0gPSBjb21wb25lbnRzW2luZGV4XS5nZXROYW1lKCk7CQotCX0KLQkKLQltb2R1bGVfLnNldEl0ZW1zKCBtb2R1bGVzICk7Ci0JCi0JICBpZiggbW9kdWxlcy5sZW5ndGggPiAwICkKLQkgIHsKLSAgICAgIGlmIChtb2R1bGVOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgbW9kdWxlXy5zZXRUZXh0KG1vZHVsZU5hbWUpOyAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkgICAgICBtb2R1bGVfLnNldFRleHQoIG1vZHVsZXNbMF0gKTsKLSAgICAgIH0KLSAgICAgICAKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkgICAgbW9kdWxlXy5zZXRUZXh0KCIiKTsKLQkgIH0KLSAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVNb2R1bGVDaGFuZ2VkKCkKLSAgewotCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IGdldEVhck1vZHVsZUZvck1vZHVsZSgpOwotCQotCWlmKCBjb21wb25lbnQgIT0gbnVsbCApCi0JewotCSAgU3RyaW5nIGVhclByb2plY3QgICAgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkgIFN0cmluZyBjb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQkKLSAgICAgIC8vIFRoaXMgd2lsbCBjYXVzZSB0aGUgbW9kdWxlIGxpc3QgdG8gYmUgdXBkYXRlIHZpYSBhIGxpc3RlbmVyLgotCSAgZWFyUHJvamVjdF8uc2V0VGV4dCggZWFyUHJvamVjdCApOyAgCi0JICBlYXJNb2R1bGVfLnNldFRleHQoIGNvbXBvbmVudE5hbWUgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGVhclByb2plY3RfLnNldFRleHQoICIiICk7ICAKLQkgIGVhck1vZHVsZV8uc2V0VGV4dCggIiIgKTsKLQl9Ci0JCi0JdXBkYXRlRUFSRW5hYmxlZFN0YXRlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlRWFyUHJvamVjdENoYW5nZWQoKQotICB7Ci0JCi0JU3RyaW5nICAgcHJvamVjdE5hbWUgPSBlYXJQcm9qZWN0Xy5nZXRUZXh0KCk7IAotCQotCWlmKCBwcm9qZWN0TmFtZSAhPSBudWxsICYmICFwcm9qZWN0TmFtZS5lcXVhbHMoICIiICkpCi0JewotCSAgSVByb2plY3QgcHJvamVjdCAgICAgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoIHByb2plY3ROYW1lICk7Ci0JCi0JICBJVmlydHVhbENvbXBvbmVudFtdIGNvbXBvbmVudHMgPSBKMkVFVXRpbHMuZ2V0Q29tcG9uZW50c0J5VHlwZSggcHJvamVjdCwgSjJFRVV0aWxzLkVBUiApOwotCSAgU3RyaW5nW10gZWFyTW9kdWxlcyA9IG5ldyBTdHJpbmdbY29tcG9uZW50cy5sZW5ndGhdOwotCQotCSAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvbXBvbmVudHMubGVuZ3RoOyBpbmRleCsrICkKLQkgIHsKLQkgICAgZWFyTW9kdWxlc1tpbmRleF0gPSBjb21wb25lbnRzW2luZGV4XS5nZXROYW1lKCk7CQotCSAgfQotCQotCSAgZWFyTW9kdWxlXy5zZXRJdGVtcyggZWFyTW9kdWxlcyApOwotCQotCSAgaWYoIGVhck1vZHVsZXMubGVuZ3RoID4gMCApCi0JICB7Ci0JICAgIGVhck1vZHVsZV8uc2V0VGV4dCggZWFyTW9kdWxlc1swXSApOwkKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkgICAgZWFyTW9kdWxlXy5zZXRUZXh0KCAiIiApOwkKLQkgIH0KLQl9Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgZ2V0RWFyTW9kdWxlRm9yTW9kdWxlKCkKLSAgewotCVN0cmluZyAgIHByb2plY3ROYW1lID0gbW9kdWxlUHJvamVjdF8uZ2V0VGV4dCgpOyAKLQlJUHJvamVjdCBwcm9qZWN0ICAgICA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCggcHJvamVjdE5hbWUgKTsKLQlTdHJpbmcgICBjb21wTmFtZSAgICA9IG1vZHVsZV8uZ2V0VGV4dCgpOwotCQotCUlWaXJ0dWFsQ29tcG9uZW50W10gY29tcG9uZW50cyA9IEoyRUVVdGlscy5nZXRSZWZlcmVuY2luZ0VBUkNvbXBvbmVudHMoIHByb2plY3QsIGNvbXBOYW1lICk7Ci0JCi0JcmV0dXJuIGNvbXBvbmVudHMubGVuZ3RoID09IDAgPyBudWxsIDogY29tcG9uZW50c1swXTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0Q2hvaWNlcyhTZWxlY3Rpb25MaXN0Q2hvaWNlcyBwcm9qZWN0cykgCi0gIHsKLQlsaXN0ZW5lcnNPZmYoKTsKLQkKLSAgICBwcm9qZWN0c18gPSBwcm9qZWN0czsKLQkKLQlTdHJpbmcgICBzZWxlY3RlZE1vZHVsZVByb2plY3QgICAgPSBwcm9qZWN0cy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JU3RyaW5nICAgc2VsZWN0ZWRFYXJNb2R1bGVQcm9qZWN0ID0gcHJvamVjdHMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotCVN0cmluZ1tdIHByb2plY3ROYW1lcyAgICAgICAgICAgICA9IGdldFByb2plY3RzKCk7Ci0JCi0JbW9kdWxlUHJvamVjdF8uc2V0SXRlbXMoIHByb2plY3ROYW1lcyApOwotCW1vZHVsZVByb2plY3RfLnNldFRleHQoIHNlbGVjdGVkTW9kdWxlUHJvamVjdCApOwotCWVhclByb2plY3RfLnNldEl0ZW1zKCBwcm9qZWN0TmFtZXMgKTsKLQllYXJQcm9qZWN0Xy5zZXRUZXh0KCBzZWxlY3RlZEVhck1vZHVsZVByb2plY3QgKTsKLQkJCi0JaGFuZGxlTW9kdWxlUHJvamVjdENoYW5nZWQoaW5pdGlhbE1vZHVsZU5hbWVfKTsKLSAgaGFuZGxlTW9kdWxlQ2hhbmdlZCgpOwotCXVwZGF0ZUVBUkVuYWJsZWRTdGF0ZSgpOwkKLSAgICBsaXN0ZW5lcnNPbigpOwotICB9Ci0KLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFByb2plY3RDaG9pY2VzKCkgCi0gIHsKLSAgICByZXR1cm4gcHJvamVjdHNfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudE5hbWUoKQotICB7Ci0JcmV0dXJuIG1vZHVsZV8uZ2V0VGV4dCgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudE5hbWUoIFN0cmluZyBuYW1lICkKLSAgewotCWxpc3RlbmVyc09mZigpOwotICAgIG1vZHVsZV8uc2V0VGV4dCggbmFtZSApOwotICAgIGluaXRpYWxNb2R1bGVOYW1lXyA9IG5hbWU7Ci0JbGlzdGVuZXJzT24oKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRFYXJDb21wb25lbnROYW1lKCkKLSAgewotICAgIHJldHVybiBlYXJNb2R1bGVfLmdldFRleHQoKTsJICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyQ29tcG9uZW50TmFtZSggU3RyaW5nIG5hbWUgKQotICB7Ci0JZWFyTW9kdWxlXy5zZXRUZXh0KCBuYW1lICk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZSggaW50IHR5cGUgKQotICB7Ci0JY29tcG9uZW50VHlwZV8gPSB0eXBlOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldE5lZWRFQVIoKQotICB7Ci0gICAgcmV0dXJuIG5lZWRFQVJfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkKLSAgewotICAgIHJldHVybiBtb2R1bGVQcm9qZWN0Xy5nZXRUZXh0KCk7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRFYXJQcm9qZWN0TmFtZSgpCi0gIHsKLQlyZXR1cm4gZWFyUHJvamVjdF8uZ2V0VGV4dCgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5lZWRFQVIoYm9vbGVhbiBiKQotICB7Ci0gICAgbmVlZEVBUl8gPSBiOwotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHRycykKLSAgewotICAgIHRyc0lkc18gPSB0cnM7Ci0JbGlzdGVuZXJzT2ZmKCk7Ci0gICAgdXBkYXRlRUFSRW5hYmxlZFN0YXRlKCk7Ci0gICAgbGlzdGVuZXJzT24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgajJlZVZlcnNpb25fID0gajJlZVZlcnNpb247Ci0JbGlzdGVuZXJzT2ZmKCk7Ci0gICAgdXBkYXRlRUFSRW5hYmxlZFN0YXRlKCk7Ci0JbGlzdGVuZXJzT24oKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdFR5cGVJZChTdHJpbmcgaWQpCi0gIHsKLSAgICBwcm9qZWN0VHlwZUlkXyA9IGlkOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZ1tdIGdldFByb2plY3RzKCkKLSAgewotCUlQcm9qZWN0W10gcHJvamVjdHMgICAgID0gSjJFRVV0aWxzLmdldEFsbEZsZXhpYmxlUHJvamVjdHMoKTsKLQlTdHJpbmdbXSAgIHByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbcHJvamVjdHMubGVuZ3RoXTsKLQkKLQlmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgcHJvamVjdHMubGVuZ3RoOyBpbmRleCsrICkKLQl7Ci0JICBwcm9qZWN0TmFtZXNbaW5kZXhdID0gcHJvamVjdHNbaW5kZXhdLmdldE5hbWUoKTsJCi0JfQotCQotCXJldHVybiBwcm9qZWN0TmFtZXM7Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUVBUkVuYWJsZWRTdGF0ZSgpCi0gIHsKLSAgICBpZiAocHJvamVjdHNfICE9IG51bGwpCi0gICAgewotICAgICAgaWYoIXByb2plY3ROZWVkc0VBUihtb2R1bGVQcm9qZWN0Xy5nZXRUZXh0KCkpKQotICAgICAgewotCSAgICBlYXJNb2R1bGVfLnNldEVuYWJsZWQoZmFsc2UpOyAgIAotCQllYXJQcm9qZWN0Xy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZWFyTW9kdWxlXy5zZXRUZXh0KCIiKTsKLQkJZWFyUHJvamVjdF8uc2V0VGV4dCgiIik7Ci0gICAgICAgIG5lZWRFQVJfID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG5lZWRFQVJfID0gdHJ1ZTsKLSAgICAgICAgZWFyTW9kdWxlXy5zZXRFbmFibGVkKHRydWUpOwotCQllYXJQcm9qZWN0Xy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBwcm9qZWN0TmVlZHNFQVIoU3RyaW5nIHByb2plY3ROYW1lKQotICB7Ci0gICAgaWYgKHByb2plY3RUeXBlSWRfLmVxdWFscyhKQVZBX1BST0pFQ1RfVFlQRV9JRCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaWYgKHByb2plY3ROYW1lID09IG51bGwgfHwgcHJvamVjdE5hbWUubGVuZ3RoKCk9PTApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICAvL0lQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShwcm9qZWN0TmFtZSkpOwotCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLSAgCXsKLSAgCSAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9uIHRoZSBwcm9qZWN0Ci0gIAkgIElSdW50aW1lIHRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQocHJvamVjdE5hbWUpOwotICAJICBTdHJpbmcgajJlZVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24ocHJvamVjdCkpOwotICAJICBpZiAodGFyZ2V0ICE9IG51bGwpCi0gIAkgIHsKLSAgCSAgCWlmICghU2VydmVyVXRpbHMuaXNUYXJnZXRWYWxpZEZvckVBUih0YXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLGoyZWVWZXJzaW9uKSkKLSAgCSAgCXsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gIAkgIAl9Ci0gIAkgIAkJCi0gIAkgIH0KLSAgCX0KLSAgCWVsc2UKLSAgCXsKLSAgCQkvL1VzZSB0aGUgc2VydmVyIHR5cGUKLSAgCSAgICBpZiAodHJzSWRzXyAhPSBudWxsKQotICAJICAgIHsKLSAgCQkgIFN0cmluZyB0YXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQodHJzSWRzXy5nZXRTZXJ2ZXJJZCgpKTsKLSAgCQkgIGlmICh0YXJnZXRJZCE9bnVsbCAmJiB0YXJnZXRJZC5sZW5ndGgoKT4wKQotICAJCSAgewotICAJCSAgICBpZiAoIVNlcnZlclV0aWxzLmlzVGFyZ2V0VmFsaWRGb3JFQVIodGFyZ2V0SWQsajJlZVZlcnNpb25fKSkKLSAgCQkgICAgewotICAJCSAgICAgIHJldHVybiBmYWxzZTsKLSAgCSAgCSAgICB9Ci0gIAkJICB9Ci0gIAkgICAgfQotICAJfSAgICAgIAkKLSAgCQotICAJcmV0dXJuIHRydWU7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIFN0YXR1cyBoYW5kbGVTZXRNZXNzYWdlVGV4dCgpIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGUgcmVzdWx0ID0gKGJ5dGUpIDA7Ci0gICAgICBpZiAobW9kdWxlXy5nZXRUZXh0KCkubGVuZ3RoKCkgIT0gMCAmJiBlYXJNb2R1bGVfLmdldFRleHQoKS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0VGV4dCA9IG1vZHVsZV8uZ2V0VGV4dCgpOwotICAgICAgICBTdHJpbmcgZWFyVGV4dCA9IGVhck1vZHVsZV8uZ2V0VGV4dCgpOwotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0VGV4dCk7Ci0gICAgICAgIElQcm9qZWN0IGVhciA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoZWFyVGV4dCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICBpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IChieXRlKSAocmVzdWx0IHwgQ1JFQVRFX1BST0pFQ1QpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIWVhci5leGlzdHMoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gKGJ5dGUpIChyZXN1bHQgfCBDUkVBVEVfRUFSKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgZWFyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBpZiAoIUoyRUVVdGlscy5pc0VBUkFzc29jaWF0ZWQocHJvamVjdCwgZWFyKSkgcmVzdWx0ID0gKGJ5dGUpIChyZXN1bHQgfCBBRERfRUFSX0FTU09DSUFUSU9OKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc0NsaWVudF8pIHsKLSAgICAgICAgbWVzc2FnZVRleHRfLnNldFRleHQoZ2V0VmFsaWRhdGlvbk1lc3NhZ2UocmVzdWx0LCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfQ0xJRU5UX1NVQiIpKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbWVzc2FnZVRleHRfLnNldFRleHQoZ2V0VmFsaWRhdGlvbk1lc3NhZ2UocmVzdWx0LCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfU0VSVklDRV9TVUIiKSkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX01TR19WQUxJREFUSU9OX0lOVEVSTkFMX0VSUk9SIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFZhbGlkYXRpb25NZXNzYWdlKGJ5dGUgcmVzdWx0LCBTdHJpbmcgc2VydmljZU9yQ2xpZW50KSB7Ci0gICAgU3RyaW5nIG1zZyA9IG51bGw7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgNToKLSAgICAgIG1zZyA9ICJNU0dfUFJPSkVDVF9XSUxMX0JFX0NSRUFURUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgNjoKLSAgICAgIG1zZyA9ICJNU0dfRUFSX1dJTExfQkVfQ1JFQVRFRCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA3OgotICAgICAgbXNnID0gIk1TR19QUk9KRUNUX0FORF9FQVJfQ1JFQVRFRCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBtc2cgPSAiTVNHX0VBUl9XSUxMX0JFX0FTU09DSUFURUQiOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBtc2cgIT0gbnVsbCA/IG1zZ1V0aWxzLmdldE1lc3NhZ2UobXNnLCBuZXcgT2JqZWN0W10geyBzZXJ2aWNlT3JDbGllbnR9KSA6ICIiOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgU3RhdHVzIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgaGFuZGxlU2V0TWVzc2FnZVRleHQoKTsKLSAgICBTdHJpbmcgcHJvamVjdFRleHQgPSBtb2R1bGVfLmdldFRleHQoKTsKLSAgICBTdHJpbmcgZWFyVGV4dCA9IGVhck1vZHVsZV8uZ2V0VGV4dCgpOwotICAgIGlmIChwcm9qZWN0VGV4dD09bnVsbCB8fCBwcm9qZWN0VGV4dC5sZW5ndGgoKT09MCkKLSAgICB7Ci0gICAgICBpZiAoaXNDbGllbnRfKQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfQ0xJRU5UX1BST0pFQ1RfRU1QVFkiKSxTdGF0dXMuRVJST1IpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfU0VSVklDRV9QUk9KRUNUX0VNUFRZIiksU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG5lZWRFQVJfICYmIChlYXJUZXh0PT1udWxsIHx8IGVhclRleHQubGVuZ3RoKCk9PTApKQotICAgIHsKLSAgICAgIGlmIChpc0NsaWVudF8pCi0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19DTElFTlRfRUFSX0VNUFRZIiksU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX1NFUlZJQ0VfRUFSX0VNUFRZIiksU3RhdHVzLkVSUk9SKTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZpbmFsU3RhdHVzOwotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9SdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvcnVudGltZS9SdW50aW1lU2VydmVyU2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDk5Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5SdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICBwcml2YXRlIFRleHQgICAgICAgICAgICAgIHJ1bnRpbWVfOwotICBwcml2YXRlIFRleHQgICAgICAgICAgICAgIHNlcnZlcl87Ci0gIHByaXZhdGUgVGV4dCAgICAgICAgICAgICAgajJlZVZlcnNpb25UZXh0OwotICBwcml2YXRlIENvbXBvc2l0ZSAgICAgICAgIHBhcmVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgaXNDbGllbnRDb250ZXh0XzsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBpZHNfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICBqMmVlVmVyc2lvbl87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzICAgICAgIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciAgICAgICAgICAgc3RhdHVzTGlzdGVuZXJfOwotICAKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwNCBmb3IgdGhlIHNlcnZpY2Utc2lkZSBydW50aW1lIHNlbGVjdGlvbiBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gUGFnZSAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfR1JPVVBfU0VSVklDRV9SVU5USU1FID0gcGx1Z2luSWRfICsgIi5QV1JTMDAwNCI7Ci0KLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwNSBmb3IgdGhlIHNlcnZpY2Utc2RpZSBzZXJ2ZXIgc2VsZWN0aW9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19HUk9VUF9TRVJWSUNFX1NFUlZFUiA9IHBsdWdpbklkXyArICIuUFdSUzAwMDUiOwotCi0gIC8qIENPTlRFWFRfSUQgUFdSUzAwMDkgZm9yIHRoZSBKMkVFIHZlcnNpb24gc2VsZWN0aW9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBQYWdlICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19KMkVFX1ZFUlNJT04gPSBwbHVnaW5JZF8gKyAiLlBXUlMwMDA5IjsKLQotICBwdWJsaWMgUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldCggYm9vbGVhbiBpc0NsaWVudFNjZW5hcmlvICkKLSAgewotICAgIGlzQ2xpZW50Q29udGV4dF8gPSBpc0NsaWVudFNjZW5hcmlvOyAKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yI2FkZENvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIpCi0gICAqLwotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgVUlVdGlscyAgICAgIHVpVXRpbHMgID0gbmV3IFVJVXRpbHMobXNnVXRpbHNfLCBwbHVnaW5JZF8gKTsgCi0gICAgCi0gICAgcGFyZW50XyAgICAgICAgID0gcGFyZW50OwotICAgIHN0YXR1c0xpc3RlbmVyXyA9IHN0YXR1c0xpc3RlbmVyOwotICAgICAgICAKLSAgICAvLyBSdW50aW1lIGxhYmVsIGFuZCB0ZXh0Ci0gICAgcnVudGltZV8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHBhcmVudCwgIkxBQkVMX1JVTlRJTUVTX0xJU1QiLCAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUlNfVEVYVF9SVU5USU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1JTX0dST1VQX1NFUlZJQ0VfUlVOVElNRSwgU1dULlJFQURfT05MWSApOwotICAgIAotICAgIC8vIFNlcnZlciBsYWJlbCBhbmQgdGV4dAotICAgIHNlcnZlcl8gPSB1aVV0aWxzLmNyZWF0ZVRleHQoIHBhcmVudCwgIkxBQkVMX1NFUlZFUlNfTElTVCIsICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1JTX1RFWFRfU0VSVkVSIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUlNfR1JPVVBfU0VSVklDRV9TRVJWRVIsIFNXVC5SRUFEX09OTFkgKTsKLSAgICAKLSAgICBqMmVlVmVyc2lvblRleHQgPSB1aVV0aWxzLmNyZWF0ZVRleHQocGFyZW50LCAiTEFCRUxfSjJFRV9WRVJTSU9OIiwgIlRPT0xUSVBfUFdSU19KMkVFX1ZFUlNJT04iLCBJTkZPUE9QX1BXUlNfSjJFRV9WRVJTSU9OLCBTV1QuUkVBRF9PTkxZKTsKLSAgICAKLSAgICBCdXR0b24gZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICBlZGl0QnV0dG9uLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9FRElUX0JVVFRPTiIpKTsgCi0gICAgZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBTZWxlY3Rpb25FdmVudCAgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRWRpdEJ1dHRvbigpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgLy8gRHVtbXkgbGFiZWwgdGhhdCBnb2VzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBlZGl0IGJ1dHRvbi4KLSAgICBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRUeXBlUnVudGltZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gaWRzXzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIGlkc18gPSBpZHM7Ci0gICAgc2V0TGFiZWxzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIGoyZWVWZXJzaW9uXzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgdGhpcy5qMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsKLSAgICBqMmVlVmVyc2lvblRleHQuc2V0VGV4dCgoajJlZVZlcnNpb25fICE9IG51bGwpID8gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXykgOiBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfTkEiKSk7Ci0gICAgLy9zZXRMYWJlbHMoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldExhYmVscygpCi0gIHsKLQkgIC8vIHJza3JlZwotICAgIC8vV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSByZWdpc3RyeSAgICAgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgLy9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMYWJlbCA9IHJlZ2lzdHJ5LmdldFJ1bnRpbWVMYWJlbEJ5SWQoIGlkc18uZ2V0UnVudGltZUlkKCkgKTsKLQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0UnVudGltZUxhYmVsQnlJZCggaWRzXy5nZXRSdW50aW1lSWQoKSApOwotICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTGFiZWwgID0gbnVsbDsKLSAgICAKLSAgICBpZiggaWRzXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkgPT0gbnVsbCApCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBsYWJlbCBmb3IgdGhlIGdlbmVyYWwgc2VydmVyIHR5cGUuCi0gICAgICAvL1dlYlNlcnZpY2VTZXJ2ZXIgc2VydmVyID0gcmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlckJ5RmFjdG9yeUlkKCBpZHNfLmdldFNlcnZlcklkKCkgKTsKLSAgICAgIC8vc2VydmVyTGFiZWwgPSBzZXJ2ZXIgPT0gbnVsbCA/ICIiIDogc2VydmVyLmdldExhYmVsKCk7Ci0JCXNlcnZlckxhYmVsID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRTZXJ2ZXJMYWJlbEJ5SWQoaWRzXy5nZXRTZXJ2ZXJJZCgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgbGFiZWwgZm9yIHRoZSBzZXJ2ZXIgaW5zdGFuY2UuCi0gICAgICAvL3NlcnZlckxhYmVsID0gcmVnaXN0cnkuZ2V0U2VydmVySW5zdGFuY2VMYWJlbEZyb21JbnN0YW5jZUlkKCBpZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKSApOwotCQlzZXJ2ZXJMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0U2VydmVySW5zdGFuY2VMYWJlbEZyb21JbnN0YW5jZUlkKGlkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLSAgICB9Ci0gICAgLy8gcnNrcmVnCi0gICAgcnVudGltZUxhYmVsID0gcnVudGltZUxhYmVsID09IG51bGwgPyAiIiA6IHJ1bnRpbWVMYWJlbDsKLSAgICAKLSAgICBydW50aW1lXy5zZXRUZXh0KCBydW50aW1lTGFiZWwgKTsKLSAgICBzZXJ2ZXJfLnNldFRleHQoIHNlcnZlckxhYmVsICk7Ci0gICAgajJlZVZlcnNpb25UZXh0LnNldFRleHQoKGoyZWVWZXJzaW9uXyAhPSBudWxsKSA/IEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pIDogbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX05BIikpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBoYW5kbGVFZGl0QnV0dG9uKCkKLSAgewotICAgIGJ5dGUgbW9kZSA9IGlzQ2xpZW50Q29udGV4dF8gPyAoYnl0ZSkxIDogKGJ5dGUpMDsKLSAgICAKLSAgICBSdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyAgICAgCi0gICAgICA9IGRpYWxvZyA9IG5ldyBSdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nKCBwYXJlbnRfLmdldFNoZWxsKCksIG1vZGUsIGlkc18sIGoyZWVWZXJzaW9uXyApOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICBkaWFsb2cuaGFuZGxlU2VydmVyVmlld1NlbGVjdGlvbkV2ZW50KCk7Ci0gICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICB7Ci0gICAgICBpZHNfID0gZGlhbG9nLmdldFR5cGVSdW50aW1lU2VydmVyKCk7Ci0gICAgICBqMmVlVmVyc2lvbl8gPSBkaWFsb2cuZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgIHNldExhYmVscygpOwotICAgICAgc3RhdHVzTGlzdGVuZXJfLmhhbmRsZUV2ZW50KG51bGwpOwotICAgIH0gIAotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaWYgKHJ1bnRpbWVfICE9IG51bGwpCi0gICAgICBydW50aW1lXy5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgaWYgKHJ1bnRpbWVfICE9IG51bGwpCi0gICAgICBydW50aW1lXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSAKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIFN0cmluZyBzY2VuYXJpbyA9IGlzQ2xpZW50Q29udGV4dF8gPyBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIk1TR19DTElFTlRfU1VCIiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIk1TR19TRVJWSUNFX1NVQiIgKTsKLSAgICAKLSAgICAvLyBLbHVkZ2UhISEgIFdlIHNob3VsZG4ndCBoYXZlIHRvIGNoZWNrIGZvciBibGFuayBsYWJlbHMuICBUaGUgZGVmYXVsdGluZyBjb21tYW5kcyBzaG91bGQgYmUgc2V0dGluZyB0aGUKLSAgICAvLyAgICAgICAgICAgIGlkcyB0byBudWxsIGlmIHRoZXJlIGlzbid0IGEgdmFsaWQgb25lLiAgVGhpcyBjb2RlIHNob3VsZCBiZSByZW1vdmVkIGluIEM0LgotCQotCS8vIHJza3JlZwotICAgIC8vV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSB3c2N0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgLy9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVMYWJlbCA9IHdzY3RSZWdpc3RyeS5nZXRSdW50aW1lTGFiZWxCeUlkKCBpZHNfLmdldFJ1bnRpbWVJZCgpICk7Ci0JU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lTGFiZWwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFJ1bnRpbWVMYWJlbEJ5SWQoIGlkc18uZ2V0UnVudGltZUlkKCkgKTsKLSAgICAvL1dlYlNlcnZpY2VTZXJ2ZXIgICAgICAgICAgICAgc2VydmVyICAgICAgID0gd3NjdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZCggaWRzXy5nZXRTZXJ2ZXJJZCgpICk7Ci0gICAgLy9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckxhYmVsICA9IHNlcnZlciA9PSBudWxsID8gIiIgOiBzZXJ2ZXIuZ2V0TGFiZWwoKTsKLQlTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckxhYmVsICA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0U2VydmVyTGFiZWxCeUlkKGlkc18uZ2V0U2VydmVySWQoKSk7Ci0gICAgLy8gcnNrcmVnCi0JCi0gICAgaWYoIGlkc18uZ2V0UnVudGltZUlkKCkgPT0gbnVsbCB8fCBydW50aW1lTGFiZWwgPT0gbnVsbCB8fCBydW50aW1lTGFiZWwuZXF1YWxzKCIiICkpCi0gICAgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX05PX1JVTlRJTUUiLCBuZXcgU3RyaW5nW117IHNjZW5hcmlvIH0gKSwgU3RhdHVzLkVSUk9SICk7Ci0gICAgfQotICAgIGVsc2UgaWYoIGlkc18uZ2V0U2VydmVySWQoKSA9PSBudWxsIHx8IHNlcnZlckxhYmVsLmVxdWFscyggIiIgKSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfTk9fU0VSVkVSIiwgbmV3IFN0cmluZ1tdeyBzY2VuYXJpbyB9ICksIFN0YXR1cy5FUlJPUiApOyAgICAgIAotICAgIH0KLQotCS8vLS0tLS0tLS0tIGNoZWNrIGlmIFdTQ1QgZXhpc3RzIGZvciB0aGVzZSBzZWxlY3Rpb25zCi0JaWYgKCEoaWRzXy5nZXRTZXJ2ZXJJZCgpID09IG51bGwpICYmICEoaWRzXy5nZXRSdW50aW1lSWQoKSA9PSBudWxsKSAmJiBpc0NsaWVudENvbnRleHRfKQotCXsKLQkJLy8gcnNrcmVnCi0JCWlmICghV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy53ZWJTZXJ2aWNlQ2xpZW50UnVudGltZVR5cGVFeGlzdHMoIGlkc18uZ2V0U2VydmVySWQoKSwgaWRzXy5nZXRSdW50aW1lSWQoKSwgaWRzXy5nZXRUeXBlSWQoKSkpIAotCQl7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUyIsIG5ldyBTdHJpbmdbXXsgc2NlbmFyaW8gfSApLCBTdGF0dXMuRVJST1IgKTsJCSAgCi0JCX0KLQkJLyoKLQkJV2ViU2VydmljZVNlcnZlciB3c3MgPSB3c2N0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlckJ5RmFjdG9yeUlkKGlkc18uZ2V0U2VydmVySWQoKSk7Ci0JCWlmICh3c3MgIT0gbnVsbCkKLQkJewotCQkJU3RyaW5nIHNlcnZlclR5cGVJZCA9IHdzcy5nZXRJZCgpOwotCQkJU3RyaW5nIHJ1bnRpbWVJZCA9IGlkc18uZ2V0VHlwZUlkKCk7Ci0JCQlpZiAoIXdzY3RSZWdpc3RyeS53ZWJTZXJ2aWNlQ2xpZW50UnVudGltZVR5cGVFeGlzdHMoIHNlcnZlclR5cGVJZCwgaWRzXy5nZXRSdW50aW1lSWQoKSwgcnVudGltZUlkKSkgewotCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggIk1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TIiwgbmV3IFN0cmluZ1tdeyBzY2VuYXJpbyB9ICksIFN0YXR1cy5FUlJPUiApOwkJICAKLQkJCX0KLQkJfQotCQllbHNlCi0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJNU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUyIsIG5ldyBTdHJpbmdbXXsgc2NlbmFyaW8gfSApLCBTdGF0dXMuRVJST1IgKTsKLQkJKi8KLQkJLy8gcnNrcmVnCi0JfSAgICAKLSAgICAKLSAgICAvLy0tLS0tLS0tLSBjaGVjayBpZiBXU1NSVCBleGlzdHMgZm9yIHRoZXNlIHNlbGVjdGlvbnMKLSAgICBpZiAoIShpZHNfLmdldFNlcnZlcklkKCkgPT0gbnVsbCkgJiYgIShpZHNfLmdldFJ1bnRpbWVJZCgpID09IG51bGwpICYmICFpc0NsaWVudENvbnRleHRfKQotICAgIHsKLQkJLy8gcnNrcmVnCi0gICAgICAvL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgLy9TdHJpbmcgc2VydmVyVHlwZUlkID0gd3NjdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChpZHNfLmdldFNlcnZlcklkKCkpLmdldElkKCk7Ci0gICAgICAvL2lmICghd3NzcnRSZWdpc3RyeS5pc1NlcnZlclJ1bnRpbWVUeXBlU3VwcG9ydGVkKHNlcnZlclR5cGVJZCwgaWRzXy5nZXRSdW50aW1lSWQoKSwgaWRzXy5nZXRUeXBlSWQoKSkpIHsKLQkgIGlmICghV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5pc1NlcnZlclJ1bnRpbWVUeXBlU3VwcG9ydGVkKGlkc18uZ2V0U2VydmVySWQoKSwgaWRzXy5nZXRSdW50aW1lSWQoKSwgaWRzXy5nZXRUeXBlSWQoKSkpIHsJICAKLSAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlMiLCBuZXcgU3RyaW5nW117IHNjZW5hcmlvIH0gKSwgU3RhdHVzLkVSUk9SICk7ICAgICAgCi0gICAgICB9Ci0JICAvLyByc2tyZWcKLSAgICB9Ci0JCi0gICAgCi0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJhZTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0FkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5JQXBwbGljYXRpb25DbGllbnROYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uQWRkVXRpbGl0eUpBUk1hcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklFSkJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5JV2ViTmF0dXJlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIFN0cmluZyBzYW1wbGVQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVFQVI7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVA7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZUM7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudEM7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFA7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBjbGllbnRKMkVFVmVyc2lvbjsKLQotICBwdWJsaWMgQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFkZE1vZHVsZURlcGVuZGVuY2llc1Rhc2siLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFkZE1vZHVsZURlcGVuZGVuY2llc1Rhc2siKTsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlIFdlYlNlcnZlckRlZmF1bHRpbmdUYXNrIFNldCB0aGUgZGVmYXVsdCBzZXJ2ZXIgbmFtZSBhbmQgaWQgZ2l2ZW4gYQotICAgKiBkZXBsb3lhYmxlLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIAotCSAgaWYoc2FtcGxlUHJvamVjdCAhPSBudWxsKXsKLQkgICAgaW50IGluZGV4ID0gc2FtcGxlUHJvamVjdC5pbmRleE9mKCIvIik7Ci0JCXNhbXBsZVAgPSBzYW1wbGVQcm9qZWN0LnN1YnN0cmluZygwLGluZGV4KTsKLQkJc2FtcGxlQyA9IHNhbXBsZVByb2plY3Quc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JICB9Ci0JICBJUHJvamVjdCBzYW1wbGVJUHJvamVjdCA9IChJUHJvamVjdClQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2FtcGxlUCk7Ci0gICAgICAgICAgICAgIAotICAgICAgaWYgKHNhbXBsZUlQcm9qZWN0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZVNhbXBsZVByb2plY3RDb21tYW5kIGNyZWF0ZVNhbXBsZSA9IG5ldyBDcmVhdGVTYW1wbGVQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgICBjcmVhdGVTYW1wbGUuc2V0U2FtcGxlUHJvamVjdChzYW1wbGVQcm9qZWN0KTsKLSAgICAgICAgY3JlYXRlU2FtcGxlLnNldFNhbXBsZVByb2plY3RFQVIoc2FtcGxlRUFSKTsKLSAgICAgICAgaWYgKHNhbXBsZUVBUiE9bnVsbCAmJiBzYW1wbGVFQVIubGVuZ3RoKCk+MCkKLSAgICAgICAgICBjcmVhdGVTYW1wbGUuc2V0TmVlZEVBUih0cnVlKTsgICAgCi0gICAgICAgIGNyZWF0ZVNhbXBsZS5zZXRFeGlzdGluZ1NlcnZlcihzYW1wbGVFeGlzdGluZ1NlcnZlcik7Ci0gICAgICAgIGNyZWF0ZVNhbXBsZS5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2FtcGxlU2VydmVyVHlwZUlEKTsKLSAgICAgICAgY3JlYXRlU2FtcGxlLnNldEoyZWVWZXJzaW9uKGNsaWVudEoyRUVWZXJzaW9uKTsKLSAgICAgICAgU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVNhbXBsZS5leGVjdXRlKGVudik7Ci0gICAgICB9Ci0gICAgICBJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uoc2FtcGxlRUFSKTsKLSAgICAgIElQcm9qZWN0IHNhbXBsZUlFQVIgPSBudWxsOwotICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIElQcm9qZWN0KQotICAgICAgICBzYW1wbGVJRUFSID0gKElQcm9qZWN0KXJlczsKLSAgICAgIGlmIChzYW1wbGVJUHJvamVjdCA9PSBudWxsKQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgIiIsIFN0YXR1cy5FUlJPUik7Ci0gICAgICAKLQkgIGlmKGNsaWVudFByb2plY3QgIT0gbnVsbCl7Ci0JICAgIGludCBpbmRleCA9IGNsaWVudFByb2plY3QuaW5kZXhPZigiLyIpOwotCQljbGllbnRQID0gY2xpZW50UHJvamVjdC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JCWNsaWVudEMgPSBjbGllbnRQcm9qZWN0LnN1YnN0cmluZyhpbmRleCArIDEpOwotCSAgfQotCSAgSVByb2plY3QgY2xpZW50SVByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoY2xpZW50UCk7Ci0JICAgICAgIAotICAgICAgCi0gICAgICBpZiAoY2xpZW50SVByb2plY3QgIT0gbnVsbCAmJiAhSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KGNsaWVudElQcm9qZWN0LCBjbGllbnRDKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHVyaSA9IGNsaWVudElQcm9qZWN0LmdldE5hbWUoKSArICIuamFyIjsKLSAgICAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNUcnVlSmF2YVByb2plY3QoY2xpZW50SVByb2plY3QpKQotICAgICAgICAgIGFkZEphdmFQcm9qZWN0QXNVdGlsaXR5SmFyKGNsaWVudElQcm9qZWN0LCBzYW1wbGVJRUFSLCB1cmkpOwotICAgICAgICBhZGRKQVJPck1vZHVsZURlcGVuZGVuY3koc2FtcGxlSVByb2plY3QsIHNhbXBsZUMsIHVyaSk7Ci0gICAgICAgIGFkZEJ1aWxkUGF0aChzYW1wbGVJUHJvamVjdCwgY2xpZW50SVByb2plY3QpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkSmF2YVByb2plY3RBc1V0aWxpdHlKYXIoSVByb2plY3QgamF2YVByb2plY3QsIElQcm9qZWN0IGVhclByb2plY3QsIFN0cmluZyB1cmkpCi0gIHsKLSAgICBBZGRVdGlsaXR5SkFSTWFwQ29tbWFuZCBjbWQgPSBuZXcgQWRkVXRpbGl0eUpBUk1hcENvbW1hbmQoZWFyUHJvamVjdCwgdXJpLCBqYXZhUHJvamVjdCk7Ci0gICAgY21kLmV4ZWN1dGUoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRKQVJPck1vZHVsZURlcGVuZGVuY3koSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBOYW1lLCBTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLSAgewotICAgIEoyRUVOYXR1cmUgbmF0dXJlID0gbnVsbDsKLSAgICBpZiAoSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KHByb2plY3QsIGNvbXBOYW1lKSkKLSAgICAgIG5hdHVyZSA9IGdldFdlYk5hdHVyZShwcm9qZWN0KTsKLSAgICBlbHNlIGlmIChKMkVFVXRpbHMuaXNBcHBDbGllbnRDb21wb25lbnQocHJvamVjdCwgY29tcE5hbWUpKQotICAgICAgbmF0dXJlID0gZ2V0QXBwQ2xpZW50TmF0dXJlKHByb2plY3QpOwotICAgIGVsc2UgaWYgKEoyRUVVdGlscy5pc0VKQkNvbXBvbmVudChwcm9qZWN0LCBjb21wTmFtZSkpCi0gICAgICBuYXR1cmUgPSBnZXRFSkJOYXR1cmUocHJvamVjdCk7Ci0gICAgaWYgKG5hdHVyZSAhPSBudWxsKQotICAgIHsKLSAgICAgIEFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChwcm9qZWN0KTsKLSAgICAgIG1hbmlmZXN0Lm1lcmdlQ2xhc3NQYXRoKG5ldyBTdHJpbmdbXXt1cml9KTsKLSAgICAgIEoyRUVQcm9qZWN0VXRpbGl0aWVzLndyaXRlTWFuaWZlc3QocHJvamVjdCwgbWFuaWZlc3QpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRCdWlsZFBhdGgoSVByb2plY3QgcmVmZXJlbmNpbmdQcm9qZWN0LCBJUHJvamVjdCByZWZlcmVuY2VkUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotICB7Ci0gICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHJlZmVyZW5jaW5nUHJvamVjdCk7Ci0gICAgaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgSUNsYXNzcGF0aEVudHJ5W10gb2xkQ3AgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLSAgICAgIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NwID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRDcC5sZW5ndGhdOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRDcC5sZW5ndGg7IGkrKykKLSAgICAgICAgbmV3Q3BbaV0gPSBvbGRDcFtpXTsKLSAgICAgIG5ld0NwW25ld0NwLmxlbmd0aCAtIDFdID0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHJlZmVyZW5jZWRQcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NwLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIEoyRUVOYXR1cmUgZ2V0V2ViTmF0dXJlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gKEoyRUVOYXR1cmUpcHJvamVjdC5nZXROYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIEoyRUVOYXR1cmUgZ2V0QXBwQ2xpZW50TmF0dXJlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5BUFBDTElFTlRfTkFUVVJFX0lEUy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChKMkVFTmF0dXJlKXByb2plY3QuZ2V0TmF0dXJlKElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5BUFBDTElFTlRfTkFUVVJFX0lEU1tpXSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIEoyRUVOYXR1cmUgZ2V0RUpCTmF0dXJlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBrc2MgcmV0dXJuCi0gICAgICAvLyAoSjJFRU5hdHVyZSlwcm9qZWN0LmdldE5hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLkVKQl8yMF9OQVRVUkVfSUQpOwotICAgICAgcmV0dXJuIChKMkVFTmF0dXJlKXByb2plY3QuZ2V0TmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gKEoyRUVOYXR1cmUpcHJvamVjdC5nZXROYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXRFQVJQcm9qZWN0KElQcm9qZWN0IHNhbXBsZVByb2plY3QpCi0gIHsKLSAgICBFQVJOYXR1cmVSdW50aW1lW10gbmF0dXJlcyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cyhzYW1wbGVQcm9qZWN0KTsKLSAgICBpZiAobmF0dXJlcyAhPSBudWxsICYmIG5hdHVyZXMubGVuZ3RoID4gMCkKLSAgICAgIHJldHVybiBuYXR1cmVzWzBdLmdldFByb2plY3QoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcHJveHlQcm9qZWN0Ci0gICAqICAgICAgICAgIFRoZSBwcm94eVByb2plY3QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChTdHJpbmcgc2FtcGxlUHJvamVjdCkKLSAgewotICAgIHRoaXMuc2FtcGxlUHJvamVjdCA9IHNhbXBsZVByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIHNhbXBsZVByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0RUFSKFN0cmluZyBzYW1wbGVFQVIpCi0gIHsKLSAgICB0aGlzLnNhbXBsZUVBUiA9IHNhbXBsZUVBUjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlU2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgICB0aGlzLnNhbXBsZVNlcnZlclR5cGVJRCA9IHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpCi0gIHsKLSAgICB0aGlzLnNhbXBsZUV4aXN0aW5nU2VydmVyID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudEoyRUVWZXJzaW9uKFN0cmluZyBjbGllbnRKMkVFVmVyc2lvbikKLSAgewotICAgIHRoaXMuY2xpZW50SjJFRVZlcnNpb24gPSBjbGllbnRKMkVFVmVyc2lvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODJlYmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlVGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LlRlc3RJbmZvOwotCi0KLS8qCi0qIFRoZSBKU1BHZW5lcmF0aW9uIHRhc2sgcnVucyB0aGUganNwIGdlbmVyYXRpb24gZW5naW5lIGZvdW5kIGluIHRoZSAKLSogSkJXaXphcmQgUGx1Z2luCi0qCi0qCi0qLwotcHVibGljIGNsYXNzIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIkpTUEdlbmVyYXRpb25UYXNrIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiUnVuIHRoZSBKU1AgR2VuZXJhdGlvbiI7Ci0gIAotICBwcml2YXRlIFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQ7Ci0gIHByaXZhdGUgV2ViU2VydmljZVRlc3RSZWdpc3RyeSB0ZXN0UmVnaXN0cnk7Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCB0ZXN0RmFjaWxpdGllczsKLSAgcHJpdmF0ZSBTdHJpbmcgZm9sZGVyOwotICBwcml2YXRlIFN0cmluZyBqc3BGb2xkZXI7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBydW5DbGllbnRUZXN0PXRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBwcm94eUJlYW47Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVA7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZUM7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFA7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudEM7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFNlcnZlcjsKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHM7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmVySWRzOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVA7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VDOwotICBwcml2YXRlIFN0cmluZyB3c2RsU2VydmljZVVSTDsKLSAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUHJveHk7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc1Rlc3RXaWRnZXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0KLSAgcHVibGljIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQgKCkKLSAgewotICAgIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgICBzZXROYW1lKExBQkVMKTsgIAotICAgIHNjZW5hcmlvQ29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTY2VuYXJpb0NvbnRleHQoKS5jb3B5KCk7Ci0gICAgdGVzdFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIAlTdHJpbmcgY2xpZW50VGVzdElEID0gdGVzdEZhY2lsaXRpZXMuZ2V0U2VsZWN0aW9uKCk7Ci0gIAkKLQkvL0dldCB0aGUgd2Vic2VydmljZSBleHRlbnNpb24KLQkKLQlXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2N0ZSA9IChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbil0ZXN0UmVnaXN0cnkuZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUoY2xpZW50VGVzdElEKTsKLSAgICBJV2ViU2VydmljZVRlc3RlciBpd3N0ID0gKElXZWJTZXJ2aWNlVGVzdGVyKXdzY3RlLmdldFdlYlNlcnZpY2VFeGVjdXRhYmxlRXh0ZW5zaW9uKCk7Ci0JVGVzdEluZm8gdGVzdEluZm8gPSBnZXRUZXN0SW5mbygpOwotCQotCXN0YXR1cyA9IGNvbW1hbmRGYWN0b3J5RXhlY3V0aW9uKGl3c3QuZ2VuZXJhdGUodGVzdEluZm8pLGVudik7Ci0JaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKXsKLQkgIHJldHVybiBzdGF0dXM7CQotCX0KLQlzdGF0dXMgPSBjb21tYW5kRmFjdG9yeUV4ZWN1dGlvbihpd3N0LmxhdW5jaCh0ZXN0SW5mbyksZW52KTsKLQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpewotCSAgcmV0dXJuIHN0YXR1czsJCi0JfQotCQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RhdHVzIGNvbW1hbmRGYWN0b3J5RXhlY3V0aW9uKElDb21tYW5kRmFjdG9yeSBjb21tYW5kRmFjdG9yeSxFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsgIAkKLQkKLQl3aGlsZShjb21tYW5kRmFjdG9yeS5oYXNOZXh0KCkpeyAKLSAgICAgIHN0YXR1cyA9IGNvbW1hbmRGYWN0b3J5LmdldE5leHRDb21tYW5kKCkuZXhlY3V0ZShlbnYpOwotCSAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKXsKLQkgICAgU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0JCXNIYW5kbGVyLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIAotICAvL0hlbHBlciBtZXRob2Qgd2hpY2ggc2V0cyB1cCB0aGUgVGVzdEluZm8gZGF0YSBzdHJ1Y3R1cmUKLSAgcHJpdmF0ZSBUZXN0SW5mbyBnZXRUZXN0SW5mbygpCi0gIHsKLQlJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IG51bGw7Ci0JU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQgPSBudWxsOwotCQkKLQkvL3NlcnZpY2Ugc2VydmVyIGluZm8KLQlpZihzZXJ2ZXJJZHMgIT0gbnVsbCl7Ci0JICBpZiAoc2VydmVySWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSAhPSBudWxsKSAKLQkgICAgc2VydmljZUV4aXN0aW5nU2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlcklkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCX0JCi0JaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgICAgc2VydmljZVNlcnZlclR5cGVJRCA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICAKLQkKLQlpZihjbGllbnRQcm9qZWN0ICE9IG51bGwpewotICAJICBpbnQgaW5kZXggPSBjbGllbnRQcm9qZWN0LmluZGV4T2YoIi8iKTsKLSAgICAgIGlmIChpbmRleCE9LTEpewotICAgICAgICBjbGllbnRQID0gY2xpZW50UHJvamVjdC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgIGNsaWVudEMgPSBjbGllbnRQcm9qZWN0LnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgfQotICAJfQotCi0gIAotCWlmKHNhbXBsZVByb2plY3QgIT0gbnVsbCl7Ci0JICBpbnQgaW5kZXggPSBzYW1wbGVQcm9qZWN0LmluZGV4T2YoIi8iKTsKLSAgICBpZiAoaW5kZXghPS0xKXsKLSAgICAgIHNhbXBsZVAgPSBzYW1wbGVQcm9qZWN0LnN1YnN0cmluZygwLGluZGV4KTsKLSAgICAgIHNhbXBsZUMgPSBzYW1wbGVQcm9qZWN0LnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLQl9Ci0JCi0gICAgCi0JCi0JVGVzdEluZm8gdGVzdEluZm8gPSBuZXcgVGVzdEluZm8oKTsgIAotCXRlc3RJbmZvLnNldENsaWVudEV4aXN0aW5nU2VydmVyKHNhbXBsZUV4aXN0aW5nU2VydmVyKTsKLQl0ZXN0SW5mby5zZXRDbGllbnRTZXJ2ZXJUeXBlSUQoc2FtcGxlU2VydmVyVHlwZUlEKTsKLQl0ZXN0SW5mby5zZXRKc3BGb2xkZXIoanNwRm9sZGVyKTsKLQl0ZXN0SW5mby5zZXRFbmRwb2ludChlbmRwb2ludHMpOwotCXRlc3RJbmZvLnNldEdlbmVyYXRpb25Qcm9qZWN0KHNhbXBsZVApOwotCXRlc3RJbmZvLnNldEdlbmVyYXRpb25Nb2R1bGUoc2FtcGxlQyk7Ci0JdGVzdEluZm8uc2V0UHJveHlCZWFuKHByb3h5QmVhbik7Ci0JdGVzdEluZm8uc2V0U2V0RW5kcG9pbnRNZXRob2Qoc2V0RW5kcG9pbnRNZXRob2QpOwotCXRlc3RJbmZvLnNldENsaWVudFByb2plY3QoY2xpZW50UCk7Ci0JdGVzdEluZm8uc2V0TWV0aG9kcyhtZXRob2RzKTsKLQkKLQkvL2lmIHRoaXMgaXMgYSBjbGllbnQgc2NlbmFyaW8gdGhlIHNlcnZpY2Ugc3R1ZmYgaXMgZW1wdHkKLQlpZihzZXJ2aWNlU2VydmVyVHlwZUlEID09IG51bGwpewotCSAgc2VydmljZVNlcnZlclR5cGVJRCA9IHNhbXBsZVNlcnZlclR5cGVJRDsKLQkgIHNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IHNhbXBsZUV4aXN0aW5nU2VydmVyOwotCX0KLQkKLQkKLQl0ZXN0SW5mby5zZXRTZXJ2aWNlU2VydmVyVHlwZUlEKHNlcnZpY2VTZXJ2ZXJUeXBlSUQpOwotCXRlc3RJbmZvLnNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIpOwotCS8vd3NkbCBzdHVmZgotCXRlc3RJbmZvLnNldFNlcnZpY2VQcm9qZWN0KGdldFdTRExQcm9qZWN0KCkpOwotCXRlc3RJbmZvLnNldFdzZGxTZXJ2aWNlVVJMKHdzZGxTZXJ2aWNlVVJMKTsKLQlyZXR1cm4gdGVzdEluZm87Ci0gIH0KLSAgIAotCi0gIAotICAvL1RoZSB0ZXN0IGZhY2lsaXRpZXMgcmV0cmlldmVkIGZyb20gdGhlIGV4dGVuc2lvbgotICAvL3BsdXMgdGhlIGRlZmF1bHQKLSAgcHVibGljIHZvaWQgc2V0VGVzdEZhY2lsaXR5KFNlbGVjdGlvbkxpc3Qgc2VsZWN0aW9uKQotICB7Ci0gICAgdGVzdEZhY2lsaXRpZXMgPSBzZWxlY3Rpb247Ci0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCBzZXRGb2xkZXIoU3RyaW5nIGZvbGRlcikKLSAgewotICAJdGhpcy5mb2xkZXIgPSBmb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKQotICB7Ci0gIAl0aGlzLmpzcEZvbGRlciA9IGpzcEZvbGRlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcykKLSAgewotICAgIHRoaXMubWV0aG9kcyA9IG1ldGhvZHM7ICAKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRSdW5DbGllbnRUZXN0KGJvb2xlYW4gcnVuQ2xpZW50VGVzdCkKLSAgewotICAJdGhpcy5ydW5DbGllbnRUZXN0ID0gcnVuQ2xpZW50VGVzdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pCi0gIHsKLSAgCXRoaXMucHJveHlCZWFuID0gcHJveHlCZWFuOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KFN0cmluZyBzYW1wbGVQcm9qZWN0KQotICB7Ci0gIAl0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0KFN0cmluZyBjbGllbnRQcm9qZWN0KQotICB7Ci0gIAl0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTY2VuYXJpb0NvbnRleHQoU2NlbmFyaW9Db250ZXh0IHNjZW5hcmlvQ29udGV4dCkKLSAgewotICAJdGhpcy5zY2VuYXJpb0NvbnRleHQgPSBzY2VuYXJpb0NvbnRleHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFRlc3RSZWdpc3RyeShXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHRlc3RSZWdpc3RyeSkKLSAgewotICAJdGhpcy50ZXN0UmVnaXN0cnkgPSB0ZXN0UmVnaXN0cnk7Ci0gIH0KLSAgIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRCkKLSAgewotICAJdGhpcy5zYW1wbGVTZXJ2ZXJUeXBlSUQgPSBzYW1wbGVTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpCi0gIHsKLSAgCXRoaXMuc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgPSBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIGlkcykKLSAgewotICAgIGNsaWVudElkcyA9IGlkczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIGlkcykKLSAgewotICAgIHNlcnZlcklkcyA9IGlkczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoKQotICB7Ci0gIAlyZXR1cm4gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0gIAotICBwdWJsaWMgSVNlcnZlciBnZXRTYW1wbGVFeGlzdGluZ1NlcnZlcigpCi0gIHsKLSAgCXJldHVybiBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFNlcnZlcihTdHJpbmcgY2xpZW50U2VydmVyKQotICB7Ci0gIAl0aGlzLmNsaWVudFNlcnZlciA9IGNsaWVudFNlcnZlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChTdHJpbmcgc2VydmljZVByb2plY3QpCi0gIHsKLSAgCXRoaXMuc2VydmljZVByb2plY3QgPSBzZXJ2aWNlUHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXU0RMUHJvamVjdCgpCi0gIHsKLSAgCSBpZihzZXJ2aWNlUHJvamVjdCAhPSBudWxsKXsKLQkgICAgIGludCBpbmRleCA9IHNlcnZpY2VQcm9qZWN0LmluZGV4T2YoIi8iKTsKLSAgICAgICBpZiAoaW5kZXghPS0xKSB7Ci0JCSAgICAgc2VydmljZVAgPSBzZXJ2aWNlUHJvamVjdC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JCSAgICAgc2VydmljZUMgPSBzZXJ2aWNlUHJvamVjdC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkgICAgICAgcmV0dXJuIHNlcnZpY2VQOwotICAgICAgIH0KLSAgCX0JCi0JCi0gIAlyZXR1cm4gY2xpZW50UDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFNlcnZpY2VVUkwpCi0gIHsKLSAgICB0aGlzLndzZGxTZXJ2aWNlVVJMID0gd3NkbFNlcnZpY2VVUkw7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpCi0gIHsKLSAgCXRoaXMuZ2VuZXJhdGVQcm94eSA9IGdlbmVyYXRlUHJveHk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldElzVGVzdFdpZGdldCgpCi0gIHsKLSAgCXJldHVybiBpc1Rlc3RXaWRnZXQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHNldEVuZHBvaW50TWV0aG9kIFRoZSBzZXRFbmRwb2ludE1ldGhvZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXRFbmRwb2ludE1ldGhvZChTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2QpCi0gIHsKLSAgICB0aGlzLnNldEVuZHBvaW50TWV0aG9kID0gc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgZW5kcG9pbnQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50KQotICB7Ci0gICAgaWYgKGVuZHBvaW50ICE9IG51bGwgJiYgZW5kcG9pbnQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgdi5hZGQoZW5kcG9pbnQpOwotICAgICAgc2V0RW5kcG9pbnRzKHYpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnRzKExpc3QgZW5kcG9pbnRzKQotICB7Ci0gICAgdGhpcy5lbmRwb2ludHMgPSBlbmRwb2ludHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NsaWVudFRlc3RGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMTNlM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ2xpZW50VGVzdEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiB0ZXN0U2VydmljZTsKLSAgcHJpdmF0ZSBib29sZWFuIGdlblByb3h5OwotICBwcml2YXRlIGJvb2xlYW4gbGF1bmNoZWRUZXN0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgQ2xpZW50VGVzdEZyYWdtZW50KCBTdHJpbmcgaWQgKQotICB7Ci0gICAgU2VxdWVuY2VGcmFnbWVudCBjbGllbnRUZXN0Um9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gICAgQ29uZGl0aW9uICAgICAgICBjb25kaXRpb24gICAgICA9IG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0U2VydmljZSAmJiBnZW5Qcm94eTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgc2V0Q29uZGl0aW9uKCBjb25kaXRpb24gKTsKLSAgICAKLSAgICBjbGllbnRUZXN0Um9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQoKSwgIiIgKSApOwotICAgIGNsaWVudFRlc3RSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBpZCApICk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCBjbGllbnRUZXN0Um9vdCApOwotICAgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KCBib29sZWFuIGdlblByb3h5ICkKLSAgewotICAgIHRoaXMuZ2VuUHJveHkgPSBnZW5Qcm94eTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZSggQm9vbGVhbiB0ZXN0U2VydmljZSApCi0gIHsKLSAgICB0aGlzLnRlc3RTZXJ2aWNlID0gdGVzdFNlcnZpY2UuYm9vbGVhblZhbHVlKCk7ICAKLSAgfSAKLQotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hlZFRlc3QoKQotICB7Ci0gIAlyZXR1cm4gbGF1bmNoZWRUZXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0V2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9DbGllbnRUZXN0V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDYzNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ2xpZW50VGVzdFdpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5Gb2xkZXJSZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmRpYWxvZy5EaWFsb2dVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDbGllbnRUZXN0V2lkZ2V0IGV4dGVuZHMgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17Ci0gIHByaXZhdGUgU3RyaW5nIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCi0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwMSBmb3IgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX1BBR0UgPSAgIlBXU00wMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gdGVzdENoZWNrYm94XzsKLSAgLypDT05URVhUX0lEIFBXU00wMDAyIGZvciB0aGUgVGVzdCBjaGVjayBib3ggb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX0NIRUNLQk9YX1RFU1QgPSAiUFdTTTAwMDIiOwotCi0gIHByaXZhdGUgQ29tYm8gdGVzdFR5cGVDb21ib187Ci0gICAvKkNPTlRFWFRfSUQgUFdTTTAwMDMgZm9yIHRoZSBUZXN0IFR5cGUgQ29tYm8gYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9DT01CT0JPWF9URVNUID0gIlBXU00wMDAzIjsKLQotICBwcml2YXRlIFRleHQgIGpzcEZvbGRlclRleHRfOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDggZm9yIHRoZSBKU1AgRm9sZGVyIGZpZWxkIG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9URVhUX0pTUF9GT0xERVIgPSAiUFdTTTAwMDgiOwotCi0gIHByaXZhdGUgQnV0dG9uIHNhbXBsZUZvbGRlckJyb3dzZUJ1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwOSBmb3IgdGhlIEpTUCBGb2xkZXIgQnJvd3NlIGJ1dHRvbiBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fQlVUVE9OX0pTUF9GT0xERVJfQlJPV1NFID0gIlBXU00wMDA5IjsKLQotICBwcml2YXRlIENvbWJvIHByb2plY3RDb21ib187Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAxMCBmb3IgdGhlIFByb2plY3QgY29tYm8gYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9DT01CT19QUk9KRUNUID0gIlBXU00wMDEwIjsKLQotICBwcml2YXRlIFRyZWUgbWV0aG9kc1RyZWVfOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMDUgZm9yIHRoZSBNZXRob2RzIHRyZWUgb2YgdGhlIFNhbXBsZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX1RSRUVfTUVUSE9EUyA9ICJQV1NNMDAwNSI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl87Ci0gIC8qQ09OVEVYVF9JRCBQV1NNMDAwNiBmb3IgdGhlIFNlbGVjdCBBbGwgYnV0dG9uIG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9CVVRUT05fU0VMRUNUX0FMTCA9ICJQV1NNMDAwNiI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXzsKLSAgLypDT05URVhUX0lEIFBXU00wMDA3IGZvciB0aGUgRGVzZWxlY3QgQWxsIGJ1dHRvbiBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fQlVUVE9OX0RFU0VMRUNUX0FMTCA9ICJQV1NNMDAwNyI7Ci0KLSAgcHJpdmF0ZSBUZXh0IHNhbXBsZUZvbGRlclRleHRfOwotICAvKkNPTlRFWFRfSUQgUFdTTTAwMTQgZm9yIHRoZSBGb2xkZXIgZmllbGQgb2YgdGhlIFNhbXBsZSBQYWdlKi8gICAKLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NNX1RFWFRfU0FNUExFX0ZPTERFUiA9ICJQV1NNMDAxNCI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIHJ1blRlc3RDaGVja2JveF87ICAKLSAgLypDT05URVhUX0lEIFBXU00wMDE1IGZvciB0aGUgcnVuIHRlc3QgY2hlY2sgYm94IG9mIHRoZSBTYW1wbGUgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTTV9DSEVDS0JPWF9MQVVOQ0ggPSAiUFdTTTAwMTUiOwotICAvLwotICBwcml2YXRlIENvbWJvIGVhckNvbWJvXzsKLSAgLypDT05URVhUX0lEIFBXU00wMDE2IGZvciB0aGUgRUFSIGNvbWJvIGJveCBvZiB0aGUgU2FtcGxlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU01fRUFSX0NPTUJPID0gIlBXU00wMDE2IjsKLSAgCi0gIHByaXZhdGUgTGFiZWwgICAgICAgICAgICAgICAgcHJvamVjdEV4aXN0c0xhYmVsXzsKLSAgcHJpdmF0ZSBMYWJlbCAgICAgICAgICAgICAgICBlYXJFeGlzdHNMYWJlbF87Ci0gIHByaXZhdGUgQ29tcG9zaXRlICAgICAgICAgICAgY29tYm9Hcm91cF87IAotICBwcml2YXRlIFNlbGVjdGlvbkxpc3QgICAgICAgIHRlc3RGYWNpbGl0aWVzXzsKLSAgcHJpdmF0ZSBGb2xkZXJSZXNvdXJjZUZpbHRlciBmb2xkZXJGaWx0ZXJfID0gbmV3IEZvbGRlclJlc291cmNlRmlsdGVyKCk7Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbl87Ci0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIGJvb2xlYW4gaXNUZXN0V2lkZ2V0ID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyggQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIgKQotICB7Ci0gICAgaXNUZXN0V2lkZ2V0ID0gdHJ1ZTsKLSAgCU1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBwbHVnaW5JZF8gKTsKLSAgICAgICAgCi0JcGFyZW50LnNldFRvb2xUaXBUZXh0KCBtc2dVdGlscy5nZXRNZXNzYWdlKCAiVE9PTFRJUF9QV1NNX1BBR0UiICkgKTsKLQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkXyArICIuIiArIElORk9QT1BfUFdTTV9QQUdFICk7Ci0gICAgCi0gICAgdGVzdENoZWNrYm94XyA9IHVpVXRpbHMuY3JlYXRlQ2hlY2tib3goIHBhcmVudCwgIkJVVFRPTl9URVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9DSEVDS0JPWF9URVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0NIRUNLQk9YX1RFU1QgKTsKLSAgICB0ZXN0Q2hlY2tib3hfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRlc3RCdXR0b24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICBjb21ib0dyb3VwXyA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDMsIDUsIDAgKTsKLSAgICAKLSAgICB0ZXN0VHlwZUNvbWJvXyA9IHVpVXRpbHMuY3JlYXRlQ29tYm8oIGNvbWJvR3JvdXBfLCAiTEFCRUxfVEVTVF9UWVBFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX0NPTUJPQk9YX1RFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0NPTUJPQk9YX1RFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICBMYWJlbCBkdW1teUxhYmVsID0gbmV3IExhYmVsKCBjb21ib0dyb3VwXywgU1dULk5PTkUgKTsKLSAgICAKLSAgICBwcm9qZWN0Q29tYm9fID0gdWlVdGlscy5jcmVhdGVDb21ibyggY29tYm9Hcm91cF8sICJMQUJFTF9KU1BfUFJPSkVDVF9OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXU01fQ09NQk9fUFJPSkVDVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fQ09NQk9fUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSApOwotICAgIHByb2plY3RDb21ib18uc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICBwcm9qZWN0RXhpc3RzTGFiZWxfID0gbmV3IExhYmVsKCBjb21ib0dyb3VwXywgU1dULk5PTkUgKTsKLSAgICAKLSAgICAKLSAgICBlYXJDb21ib18gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCBjb21ib0dyb3VwXywgIkxBQkVMX0VBUl9QUk9KRUNUUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9FQVJfUFJPSkVDVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0VBUl9DT01CTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkgKTsKLSAgICBlYXJDb21ib18uc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICBlYXJFeGlzdHNMYWJlbF8gPSBuZXcgTGFiZWwoIGNvbWJvR3JvdXBfLCBTV1QuTk9ORSApOwotICAgIAotICAgIAotICAgIAotICAgIHNhbXBsZUZvbGRlclRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCBjb21ib0dyb3VwXywgIkxBQkVMX0ZPTERFUl9OQU1FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9URVhUX1NBTVBMRV9GT0xERVIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXU01fVEVYVF9TQU1QTEVfRk9MREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotICAgIAotICAgIHNhbXBsZUZvbGRlclRleHRfLmFkZE1vZGlmeUxpc3RlbmVyKCBuZXcgTW9kaWZ5TGlzdGVuZXIoKQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoIE1vZGlmeUV2ZW50IGV2dCApCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVGb2xkZXJUZXh0KCk7IAotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAKLSAgICAgICAKLSAgICBzYW1wbGVGb2xkZXJCcm93c2VCdXR0b25fID0gdWlVdGlscy5jcmVhdGVQdXNoQnV0dG9uKCBjb21ib0dyb3VwXywgIkJVVFRPTl9CUk9XU0UiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX0JVVFRPTl9KU1BfRk9MREVSX0JST1dTRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0JVVFRPTl9KU1BfRk9MREVSX0JST1dTRSApOwotICAgIHNhbXBsZUZvbGRlckJyb3dzZUJ1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2FtcGxlQnJvd3NlKCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIGpzcEZvbGRlclRleHRfID0gdWlVdGlscy5jcmVhdGVUZXh0KCBjb21ib0dyb3VwXywgIkxBQkVMX0pTUF9GT0xERVJfTkFNRSIsCi0gICAgICAgICAgICAiVE9PTFRJUF9QV1NNX1RFWFRfSlNQX0ZPTERFUiIsCi0gICAgICAgICAgICBJTkZPUE9QX1BXU01fVEVYVF9KU1BfRk9MREVSLAotICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAganNwRm9sZGVyVGV4dF8uc2V0RW5hYmxlZCggZmFsc2UgKTsKLSAgICAKLSAgICBHcm91cCBtZXRob2RzR3JvdXAgPSB1aVV0aWxzLmNyZWF0ZUdyb3VwKCBwYXJlbnQsICJMQUJFTF9NRVRIT0RTIiwgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9UUkVFX01FVEhPRFMiLCBudWxsICk7Ci0gICAgCi0JbWV0aG9kc0dyb3VwLnNldExheW91dERhdGEoIHVpVXRpbHMuY3JlYXRlRmlsbEFsbCgpICk7Ci0JCi0JR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JbWV0aG9kc0dyb3VwLnNldExheW91dCggbGF5b3V0ICk7Ci0JCi0JLy8gVE9ETyBObyBpbmZvcG9wIGZvciB0aGlzIHRyZWUuCi0JbWV0aG9kc1RyZWVfID0gdWlVdGlscy5jcmVhdGVUcmVlKCBtZXRob2RzR3JvdXAsICJUT09MVElQX1BXU01fVFJFRV9NRVRIT0RTIiwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotCSAgICAgICAgICAgICAgICAgICAJCQkJICAgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTAl8IFNXVC5DSEVDSyApOwotCi0gICAgQ29tcG9zaXRlIHNlbGVjdEJ1dHRvbnMgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggbWV0aG9kc0dyb3VwLCAyICk7Ci0gICAgCi0gICAgc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8gCi0gICAgICA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggc2VsZWN0QnV0dG9ucywgIkJVVFRPTl9TRUxFQ1RfQUxMIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdTTV9CVVRUT05fU0VMRUNUX0FMTCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1NNX0JVVFRPTl9TRUxFQ1RfQUxMICk7Ci0gICAgc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RBbGwoIHRydWUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIGRlc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8gCi0gICAgICA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggc2VsZWN0QnV0dG9ucywgIkJVVFRPTl9ERVNFTEVDVF9BTEwiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX0JVVFRPTl9ERVNFTEVDVF9BTEwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9CVVRUT05fREVTRUxFQ1RfQUxMICk7Ci0gICAgZGVzZWxlY3RBbGxNZXRob2RzQnV0dG9uXy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0QWxsKCBmYWxzZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIAotICAgIHJ1blRlc3RDaGVja2JveF8gPSB1aVV0aWxzLmNyZWF0ZUNoZWNrYm94KCBwYXJlbnQsICJCVVRUT05fUlVOX1RFU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1NNX0NIRUNLQk9YX0xBVU5DSCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdTTV9DSEVDS0JPWF9MQVVOQ0ggKTsKLSAgICAKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUZvbGRlclRleHQoKQotICB7Ci0gIAlTdHJpbmcgZm9sZGVyID0gc2FtcGxlRm9sZGVyVGV4dF8uZ2V0VGV4dCgpOwkKLSAgICBTdHJpbmcganNwRm9sZGVyID0ganNwRm9sZGVyVGV4dF8uZ2V0VGV4dCgpOwotICAgIGludCBpbmRleCA9IGpzcEZvbGRlci5sYXN0SW5kZXhPZihQYXRoLlNFUEFSQVRPUik7Ci0gICAgaWYoaW5kZXggPT0gLTEpIHJldHVybjsKLSAgICBqc3BGb2xkZXIgPSBqc3BGb2xkZXIuc3Vic3RyaW5nKDAsaW5kZXggKyAxKTsKLSAgICBqc3BGb2xkZXIgPSBqc3BGb2xkZXIgKyBmb2xkZXI7Ci0gICAganNwRm9sZGVyVGV4dF8uc2V0VGV4dChqc3BGb2xkZXIpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlU2FtcGxlQnJvd3NlKCkKLSAgewotICAgIElQYXRoICAgICAgc2VsZWN0ZWRQYXRoICAgICAgID0gbnVsbDsKLSAgICBJUmVzb3VyY2UgIGluaXRpYWxSZXNvdXJjZSAgICA9IG51bGw7Ci0gICAgSVBhdGggICAgICBwcm9qZWN0UGF0aCAgICAgICAgPSBuZXcgUGF0aCggcHJvamVjdENvbWJvXy5nZXRUZXh0KCkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICBJUmVzb3VyY2UgIHByb2plY3QgICAgICAgICAgICA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKCBwcm9qZWN0UGF0aCApOwotLy8gICAgSUNvbnRhaW5lciB3ZWJNb2R1bGVDb250YWluZXIgPSBSZXNvdXJjZVV0aWxzLmdldFdlYk1vZHVsZVNlcnZlclJvb3QoIChJUHJvamVjdClwcm9qZWN0KTsKLSAgICBJQ29udGFpbmVyIHdlYk1vZHVsZUNvbnRhaW5lciA9IEoyRUVVdGlscy5nZXRGaXJzdFdlYkNvbnRlbnRDb250YWluZXIoKElQcm9qZWN0KXByb2plY3QpOyAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW5pdGlhbFJlc291cmNlID0gUmVzb3VyY2VVdGlscy5nZXRSZXNvdXJjZUZyb21TZWxlY3Rpb24oIGluaXRpYWxTZWxlY3Rpb25fICk7Ci0gICAgfQotICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgeyAgCi0gICAgfQotICAgIAotICAgIGlmKCBpbml0aWFsUmVzb3VyY2UgPT0gbnVsbCApaW5pdGlhbFJlc291cmNlID0gcHJvamVjdDsKLSAgICAKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBEaWFsb2dVdGlscy5icm93c2VSZXNvdXJjZXMoIGNvbWJvR3JvdXBfLmdldFNoZWxsKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxSZXNvdXJjZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJGaWx0ZXJfICk7Ci0gICAgCi0gICAgaWYoIHJlc291cmNlICE9IG51bGwgKQotICAgIHsKLSAgICAgIHNlbGVjdGVkUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7ICAgCi0gICAgCi0gICAgICBpbnQgd2ViTW9kdWxlU2VnbWVudHMgPSBzZWxlY3RlZFBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHdlYk1vZHVsZUNvbnRhaW5lci5nZXRGdWxsUGF0aCgpKTsKLSAgICAgIAotICAgICAgaWYgKCB3ZWJNb2R1bGVTZWdtZW50cyA8IDIgKQotICAgICAgewotICAgICAgICBzYW1wbGVGb2xkZXJUZXh0Xy5zZXRUZXh0KCIiKTsKLSAgICAgICAgaGFuZGxlRm9sZGVyVGV4dCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzYW1wbGVGb2xkZXJUZXh0Xy5zZXRUZXh0KHNlbGVjdGVkUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHdlYk1vZHVsZVNlZ21lbnRzKS50b1N0cmluZygpKTsKLSAgICAgICAgaGFuZGxlRm9sZGVyVGV4dCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRlc3RCdXR0b24oKQotICB7Ci0gICAgYm9vbGVhbiBlbmFibGVkID0gdGVzdENoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKTsKLSAgICAKLSAgICB0ZXN0VHlwZUNvbWJvXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgc2FtcGxlRm9sZGVyVGV4dF8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIG1ldGhvZHNUcmVlXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgcnVuVGVzdENoZWNrYm94Xy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIGRlc2VsZWN0QWxsTWV0aG9kc0J1dHRvbl8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIHNhbXBsZUZvbGRlckJyb3dzZUJ1dHRvbl8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsKCBib29sZWFuIHZhbHVlICkKLSAgewotCVRyZWVJdGVtW10gaXRlbXMgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLQkKLQlmb3IoIGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrICkgCi0JewotCSAgaXRlbXNbaV0uc2V0Q2hlY2tlZCh2YWx1ZSk7Ci0JfQotICB9IAotICAKLSAgLy8gSGVyZSBhcmUgdGhlIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIHRoaXMgd2lkZ2V0LgotICBwdWJsaWMgdm9pZCBzZXRUZXN0U2VydmljZSggQm9vbGVhbiB0ZXN0U2VydmljZSApCi0gIHsKLSAgICB0ZXN0Q2hlY2tib3hfLnNldFNlbGVjdGlvbiggdGVzdFNlcnZpY2UuYm9vbGVhblZhbHVlKCkgKTsKLSAgICBoYW5kbGVUZXN0QnV0dG9uKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldFRlc3RTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggdGVzdENoZWNrYm94Xy5nZXRTZWxlY3Rpb24oKSApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0RmFjaWxpdHkoIFNlbGVjdGlvbkxpc3QgdGVzdEZhY2lsaXRpZXMgKQotICB7Ci0gICAgdGVzdEZhY2lsaXRpZXNfID0gdGVzdEZhY2lsaXRpZXM7Ci0gICAgdGVzdFR5cGVDb21ib18uc2V0SXRlbXMoIHRlc3RGYWNpbGl0aWVzLmdldExpc3QoKSApOwotICAgIHRlc3RUeXBlQ29tYm9fLnNlbGVjdCggdGVzdEZhY2lsaXRpZXMuZ2V0SW5kZXgoKSApOwotICB9Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCBnZXRUZXN0RmFjaWxpdHkoKQotICB7Ci0gICAgdGVzdEZhY2lsaXRpZXNfLnNldEluZGV4KCB0ZXN0VHlwZUNvbWJvXy5nZXRTZWxlY3Rpb25JbmRleCgpICk7Ci0gICAgcmV0dXJuIHRlc3RGYWNpbGl0aWVzXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXN0SUQoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RUeXBlQ29tYm9fLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkgCi0gIHsKLQlwcm9qZWN0Q29tYm9fLnNldEl0ZW1zKCBuZXcgU3RyaW5nW117IGNsaWVudFByb2plY3QgfSApOwotCXByb2plY3RDb21ib18uc2VsZWN0KDApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0RUFSKFN0cmluZyBjbGllbnRQcm9qZWN0RUFSKSAKLSAgewotICAgIGVhckNvbWJvXy5zZXRJdGVtcyggbmV3IFN0cmluZ1tdeyBjbGllbnRQcm9qZWN0RUFSIH0gKTsKLSAgICBlYXJDb21ib18uc2VsZWN0KDApOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEZvbGRlcigpCi0gIHsKLSAgICByZXR1cm4gc2FtcGxlRm9sZGVyVGV4dF8uZ2V0VGV4dCgpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRGb2xkZXIoIFN0cmluZyBmb2xkZXIgKQotICB7Ci0gICAgc2FtcGxlRm9sZGVyVGV4dF8uc2V0VGV4dCggZm9sZGVyICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldElzVGVzdFdpZGdldCgpCi0gIHsKLSAgCXJldHVybiBpc1Rlc3RXaWRnZXQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlciggU3RyaW5nIGZvbGRlciApCi0gIHsKLSAgICBqc3BGb2xkZXJUZXh0Xy5zZXRUZXh0KCBmb2xkZXIgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgKFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSkKLSAgewotICAJdGhpcy5sYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSA9IGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRSdW5DbGllbnRUZXN0KCkKLSAgewotICAgIHJldHVybiBydW5UZXN0Q2hlY2tib3hfLmdldFNlbGVjdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSdW5DbGllbnRUZXN0KCBib29sZWFuIHZhbHVlICkKLSAgewotICAgIHJ1blRlc3RDaGVja2JveF8uc2V0U2VsZWN0aW9uKCB2YWx1ZSApOwotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhblNlbGVjdGlvbltdIGdldE1ldGhvZHMoKQotICB7Ci0gICAgVHJlZUl0ZW1bXSAgICAgICAgIGl0ZW1zICAgPSBtZXRob2RzVHJlZV8uZ2V0SXRlbXMoKTsKLSAgICBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcyA9IG5ldyBCb29sZWFuU2VsZWN0aW9uW2l0ZW1zLmxlbmd0aF07Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgbWV0aG9kc1tpbmRleF0gPSBuZXcgQm9vbGVhblNlbGVjdGlvbiggaXRlbXNbaW5kZXhdLmdldFRleHQoKSwgaXRlbXNbaW5kZXhdLmdldENoZWNrZWQoKSApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbWV0aG9kczsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyggQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHMgKQotICB7Ci0gICAgbWV0aG9kc1RyZWVfLnJlbW92ZUFsbCgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBtZXRob2RzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgaWYobWV0aG9kc1tpbmRleF0gPT0gbnVsbCljb250aW51ZTsKLSAgICAgIFRyZWVJdGVtIGl0ZW0gPSBuZXcgVHJlZUl0ZW0oIG1ldGhvZHNUcmVlXywgU1dULk5VTEwgKTsKLSAgICAgIGl0ZW0uc2V0VGV4dCggbWV0aG9kc1tpbmRleF0uZ2V0VmFsdWUoKSApOwotICAgICAgaXRlbS5zZXRDaGVja2VkKCBtZXRob2RzW2luZGV4XS5pc1NlbGVjdGVkKCkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLSAgICBpbml0aWFsU2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZWRmNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRJT04gPSAiQ29weSBXZWJzZXJ2aWNlVXRpbHMuamFyIjsKLQlwcml2YXRlIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIExBQkVMICAgICAgICAgICA9ICJDb3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZCI7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgc2FtcGxlQzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0JCi0vKioKLSAqIERlZmF1bHQgQ1RPUjsKLSAqLwotCi0KLXB1YmxpYyBDb3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZCgpCi17Ci0gIHN1cGVyKExBQkVMLERFU0NSSVBUSU9OKTsKLSAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7ICAKLX0KLQotLyoqCi0gKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gKi8KLXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi17Ci0gIHRyeQotICB7Ci0gICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydCggbXNnVXRpbHMuZ2V0TWVzc2FnZSggIlBST0dSRVNTX0lORk9fQ09QWV9XRUJTRVJWSUNFX1VUSUxTIiApICk7Ci0gICAgSVByb2plY3Qgc2FtcGxlSVByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2FtcGxlUHJvamVjdCk7ICAgIAotICAgIElQYXRoIHdlYk1vZHVsZVBhdGggPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgoc2FtcGxlSVByb2plY3QsIHNhbXBsZUMpOwkKLSAgICBpZiAod2ViTW9kdWxlUGF0aCA9PSBudWxsKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfTk9UX0ZPVU5EIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAKLSAgICBTdGF0dXMgc3RhdHVzID0gY29weUlGaWxlKCJ3ZWJzZXJ2aWNldXRpbHMuamFyIix3ZWJNb2R1bGVQYXRoLCJXRUItSU5GL2xpYi93ZWJzZXJ2aWNldXRpbHMuamFyIiwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldEluc3RhbmNlKCksZW52KTsKLSAgICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpewotICAgICAgU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRklMRUNPUFlfV0VCU0VSVklDRV9VVElMUyIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgc0hhbmRsZXIucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwkKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgIH0KLSAgICAgIAotICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRklMRUNPUFlfV0VCU0VSVklDRV9VVElMUyIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgc0hhbmRsZXIucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklELG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTIiksU3RhdHVzLkVSUk9SLGUpOwotICAgIH0KLSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotfQotCi0vKioKLSAqCi0gKi8KLXByaXZhdGUgU3RhdHVzIGNvcHlJRmlsZShTdHJpbmcgc291cmNlLCBJUGF0aCB0YXJnZXRQYXRoLCBTdHJpbmcgdGFyZ2V0RmlsZSxFbnZpcm9ubWVudCBlbnYpCi17Ci0gIHJldHVybiBjb3B5SUZpbGUoc291cmNlLCB0YXJnZXRQYXRoLCB0YXJnZXRGaWxlLCBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCksZW52KTsKLX0KLQotLyoqCi0gKgotICovCi1wcml2YXRlIFN0YXR1cyBjb3B5SUZpbGUoU3RyaW5nIHNvdXJjZSwgSVBhdGggdGFyZ2V0UGF0aCwgU3RyaW5nIHRhcmdldEZpbGUsIFBsdWdpbiBwbHVnaW4sRW52aXJvbm1lbnQgZW52KQotewotICAgIAotICBpZiAocGx1Z2luICE9IG51bGwpCi0gIHsKLSAgICBJUGF0aCB0YXJnZXQgPSB0YXJnZXRQYXRoLmFwcGVuZChuZXcgUGF0aCh0YXJnZXRGaWxlKSk7Ci0gICAgCi0gICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydCggbXNnVXRpbHMuZ2V0TWVzc2FnZSggIlBST0dSRVNTX0lORk9fQ09QWUlOR19GSUxFIiApICk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgIFJlc291cmNlQ29udGV4dCBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgICAgIGNvbnRleHQuc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKHRydWUpOwotICAgICAgIGNvbnRleHQuc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgY29udGV4dC5zZXRDaGVja291dEZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBGaWxlUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UodGFyZ2V0KTsKLSAgICAgICBpZihyZXNvdXJjZSAhPSBudWxsKSByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgICAgSUZpbGUgZmlsZSA9IEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoY29udGV4dCwgCi0gICAgICAgCQkJCQkJCQl0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5vcGVuU3RyZWFtKG5ldyBQYXRoKHNvdXJjZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklELG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GSUxFQ09QWV9XRUJTRVJWSUNFX1VUSUxTIiksU3RhdHVzLkVSUk9SLGUpOwotICAgIH0KLSAgfQotICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpCi17Ci0gIHRoaXMuc2FtcGxlUHJvamVjdCA9IHNhbXBsZVByb2plY3Q7ICAKLX0KLQotcHVibGljIHZvaWQgc2V0U2FtcGxlQ29tcG9uZW50KFN0cmluZyBzYW1wbGVDb21wb25lbnQpewotICB0aGlzLnNhbXBsZUMgPSBzYW1wbGVDb21wb25lbnQ7Ci19Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0NyZWF0ZVNhbXBsZVByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MzI0ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3RFYXI7Ci0gIHByaXZhdGUgSVNlcnZlciBleGlzdGluZ1NlcnZlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotICBwcml2YXRlIGJvb2xlYW4gbmVlZEVBUjsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb247Ci0gIAotICAKLSAgcHVibGljIENyZWF0ZVNhbXBsZVByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jb21tb24uQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQiLCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jb21tb24uQ3JlYXRlU2FtcGxlUHJvamVjdENvbW1hbmQiKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBpZiAoIXJvb3QuZ2V0UHJvamVjdChzYW1wbGVQcm9qZWN0KS5leGlzdHMoKSB8fCAhcm9vdC5nZXRQcm9qZWN0KHNhbXBsZVByb2plY3RFYXIpLmV4aXN0cygpKQotICAgIHsKLSAgICAgIENyZWF0ZVdlYlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQoKTsKLSAgICAgIGMuc2V0UHJvamVjdE5hbWUoc2FtcGxlUHJvamVjdCk7Ci0gICAgICBjLnNldEVhclByb2plY3ROYW1lKHNhbXBsZVByb2plY3RFYXIpOwotICAgICAgYy5zZXRFeGlzdGluZ1NlcnZlcihleGlzdGluZ1NlcnZlcik7Ci0gICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQpOwotICAgICAgYy5zZXROZWVkRUFSKG5lZWRFQVIpOwotICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbik7Ci0gICAgICByZXR1cm4gYy5leGVjdXRlKGVudik7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpCi0gIHsKLSAgICB0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OyAJCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0RUFSKFN0cmluZyBzYW1wbGVQcm9qZWN0RWFyKQotICB7Ci0gIAl0aGlzLnNhbXBsZVByb2plY3RFYXIgPSBzYW1wbGVQcm9qZWN0RWFyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBleGlzdGluZ1NlcnZlcikgewotCi0gICAgdGhpcy5leGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJdGhpcy5zZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG5lZWRFQVIgVGhlIG5lZWRFQVIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIG5lZWRFQVIpCi0gIHsKLSAgICB0aGlzLm5lZWRFQVIgPSBuZWVkRUFSOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgajJlZVZlcnNpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SjJlZVZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgICBqMmVlVmVyc2lvbiA9IHZlcnNpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaERlZmF1bHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hEZWZhdWx0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVjMzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaERlZmF1bHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotCi0vKgotKiBUaGUgSlNQR2VuZXJhdGlvbiB0YXNrIHJ1bnMgdGhlIGpzcCBnZW5lcmF0aW9uIGVuZ2luZSBmb3VuZCBpbiB0aGUgCi0qIEpCV2l6YXJkIFBsdWdpbgotKgotKgotKi8KLXB1YmxpYyBjbGFzcyBGaW5pc2hEZWZhdWx0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiSlNQR2VuZXJhdGlvblRhc2siOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJSdW4gdGhlIEpTUCBHZW5lcmF0aW9uIjsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBleGlzdGluZ1NlcnZlcklkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVySW5zdGFuY2VJZDsKLQotICAKLSAgcHVibGljIEZpbmlzaERlZmF1bHRDb21tYW5kICgpCi0gIHsKLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7ICAKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAJaWYoc2FtcGxlU2VydmVySW5zdGFuY2VJZCAhPSBudWxsKXsKLSAgCSAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2FtcGxlU2VydmVySW5zdGFuY2VJZCk7Ci0gIAlpZiAoc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgIT0gbnVsbCkKLSAgICAgIHNhbXBsZVNlcnZlclR5cGVJRCA9IHNhbXBsZUV4aXN0aW5nU2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgCi0gIAl9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0gIHsKLQl0aGlzLnNhbXBsZVNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVNlcnZlclR5cGVJRCgpCi0gIHsKLSAgCXJldHVybiBzYW1wbGVTZXJ2ZXJUeXBlSUQ7Ci0JCi0gIH0KLSAgCi0gIHB1YmxpYyBJU2VydmVyIGdldFNhbXBsZUV4aXN0aW5nU2VydmVyKCkKLSAgewotICAJcmV0dXJuIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXJJZChTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZCkKLSAgewotICAgIGV4aXN0aW5nU2VydmVySWRfID0gZXhpc3RpbmdTZXJ2ZXJJZDsKLSAgfSAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaEphdmFUZXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaEphdmFUZXN0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3NTI3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9GaW5pc2hKYXZhVGVzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkJvb2xlYW5GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmluaXNoSmF2YVRlc3RGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudCAKLXsKLSAgcHJpdmF0ZSBib29sZWFuIGdlbmVyYXRlUHJveHk7Ci0JCi0gIHB1YmxpYyBGaW5pc2hKYXZhVGVzdEZyYWdtZW50KCkKLSAgewotICAJU2VxdWVuY2VGcmFnbWVudCBqYXZhVGVzdFJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oKQotCXsKLQkgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLQkgIHsKLQkgICAgcmV0dXJuIGdlbmVyYXRlUHJveHk7IAotCSAgfQotCX07Ci0gICAgc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7Ci0gICAgamF2YVRlc3RSb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFRlc3RDbGllbnREZXBhcnR1cmVJbml0Q29tbWFuZCgpLCAiIikpOwotICAgIGphdmFUZXN0Um9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kKCksICIiKSk7Ci0gICAgamF2YVRlc3RSb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEJ1aWxkUHJvamVjdENvbW1hbmQoKSwgIiIpKTsKLSAgICBzZXRUcnVlRnJhZ21lbnQoamF2YVRlc3RSb290KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoYm9vbGVhbiBnZW5lcmF0ZVByb3h5KQotICB7Ci0gIAl0aGlzLmdlbmVyYXRlUHJveHkgPSBnZW5lcmF0ZVByb3h5OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJc0pTUEdlbihib29sZWFuIGpzcEdlbikKLSAgewotICAJCi0gIH0KLSAgCi0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L0ZpbmlzaFRlc3RGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvRmluaXNoVGVzdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDBiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvRmluaXNoVGVzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Cb29sZWFuRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBGaW5pc2hUZXN0RnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnR7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzVGVzdFdpZGdldDsJCi0gIHByaXZhdGUgYm9vbGVhbiBsYXVuY2hlZFRlc3Q7Ci0gIHByaXZhdGUgYm9vbGVhbiBnZW5lcmF0ZVByb3h5OwotICBwcml2YXRlIFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RTZXJ2aWNlOwotICBwcml2YXRlIFN0cmluZyB0ZXN0SUQ7Ci0gIHB1YmxpYyBGaW5pc2hUZXN0RnJhZ21lbnQoKQotICB7Ci0gICAgQ29uZGl0aW9uIGNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oKQotCXsKLQkgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLQkgIHsKLQkgICAgaWYoIXRlc3RTZXJ2aWNlKSByZXR1cm4gZmFsc2U7Ci0JICAJaWYobGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0JICAgIGlmKGxhdW5jaGVkU2VydmljZVRlc3ROYW1lICE9IG51bGwpCi0JICAgICAgaWYoKCFsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZS5lcXVhbHMoIiIpICYmICAoIWlzUHJlZmVyZWRBV1NETFRlc3QoKSB8fCAoaXNUZXN0V2lkZ2V0ICYmIGlzQ2xpZW50VGVzdEphdmEoKSkpICYmIGdlbmVyYXRlUHJveHkpIHx8IGxhdW5jaGVkU2VydmljZVRlc3ROYW1lLmVxdWFscygiIikpIHJldHVybiB0cnVlOwkKLQkgICAgCi0JICAJcmV0dXJuIGZhbHNlOyAKLQkgIH0KLQl9OwotCSAgIAotCXNldFRydWVGcmFnbWVudChuZXcgV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudCgpKTsKLSAgICBzZXRDb25kaXRpb24oY29uZGl0aW9uKTsKLSAgfQotCSAgICAKLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lKQotICB7Ci0JdGhpcy5sYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSA9IGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICB9Ci0JICAKLSAgcHVibGljIGJvb2xlYW4gaXNQcmVmZXJlZEFXU0RMVGVzdCgpCi0gIHsKLSAgICBTY2VuYXJpb0NvbnRleHQgc2NlbmFyaW9Db250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpLmNvcHkoKTsKLQlTdHJpbmdbXSB0ZXN0VHlwZXMgPSBzY2VuYXJpb0NvbnRleHQuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotCVdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgd3N0dFJlZ2lzdHJ5ID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCVdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIHdzY3RlID0gKFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKXdzdHRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSh0ZXN0VHlwZXNbMF0pOyAgCQotCWlmKHdzY3RlLnRlc3RXU0RMKCkpCQotCSAgcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDbGllbnRUZXN0SmF2YSgpCi0gIHsKLSAgCWlmKHRlc3RJRCA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gIAlXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHdzdHRSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQlXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbiB3c2N0ZSA9IChXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbil3c3R0UmVnaXN0cnkuZ2V0V2ViU2VydmljZUV4dGVuc2lvbnNCeU5hbWUodGVzdElEKTsgIAkKLQlpZighd3NjdGUudGVzdFdTREwoKSkJCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7ICAgCQotICB9Ci0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoYm9vbGVhbiB0ZXN0U2VydmljZSkKLSAgewotICAgIHRoaXMudGVzdFNlcnZpY2UgPSB0ZXN0U2VydmljZTsJIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHkpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRlUHJveHkgPSBnZW5lcmF0ZVByb3h5OwkgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUZXN0SUQoU3RyaW5nIHRlc3RJRCkKLSAgewotICAgIHRoaXMudGVzdElEID0gdGVzdElEOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNUZXN0V2lkZ2V0KGJvb2xlYW4gaXNUZXN0V2lkZ2V0KQotICB7Ci0gIAl0aGlzLmlzVGVzdFdpZGdldCA9IGlzVGVzdFdpZGdldDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvVGVzdENsaWVudERlcGFydHVyZUluaXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmN2QxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDbGllbnREZXBhcnR1cmVJbml0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZm9yY2VCdWlsZDsJCi0JCi0gIHB1YmxpYyBUZXN0Q2xpZW50RGVwYXJ0dXJlSW5pdENvbW1hbmQoKQotICB7Ci0gIAlmb3JjZUJ1aWxkID0gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEZvcmNlQnVpbGQoKQotICB7Ci0gIAlyZXR1cm4gZm9yY2VCdWlsZDsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3REZWZhdWx0aW5nRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3REZWZhdWx0aW5nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiNjNjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0RGVmYXVsdGluZ0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFRlc3REZWZhdWx0aW5nRnJhZ21lbnQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIAotICBwcml2YXRlIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgdGVzdFJlZ2lzdHJ5OwotICBwcml2YXRlIFNlbGVjdGlvbkxpc3QgdGVzdEZhY2lsaXRpZXM7Ci0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIFNjZW5hcmlvQ29udGV4dCBzY2VuYXJpb0NvbnRleHQ7CQotICAKLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVNpbXBsZVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCQotICAJc2NlbmFyaW9Db250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpLmNvcHkoKTsKLSAgCS8vICB0ZXN0IGZhY2lsaXRpZXMKLSAgICBzZWxlY3RUZXN0RmFjaWxpdHkoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0JCi0gIC8vIFRoZSB0ZXN0IGZhY2lsaXRpZXMgcmV0cmlldmVkIGZyb20gdGhlIGV4dGVuc2lvbgotICAvLyBwbHVzIHRoZSBkZWZhdWx0Ci0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0IGdldFRlc3RGYWNpbGl0eSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdEZhY2lsaXRpZXM7Ci0gIH0gCi0JICAKLSAgCi0gIAotICAvLwkqKioqKioqKioqKioqKioqKioqKioqKiAKLSAgLy8gVGhpcyBtZXRob2QgdXNlcyB0aGUgcHJlZmVyZW5jZSB0byAKLSAgLy8gc2VsZWN0IHRoZSBjb3JyZWN0IHRlc3QgZmFjaWxpdHkgCi0gIC8vIAotICAvLyoqKioqKioqKioqKioqKioqKioqKioqCi0gIHByaXZhdGUgdm9pZCBzZWxlY3RUZXN0RmFjaWxpdHkoKQotICB7Ci0gICAgLy9pZiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSBsYXVuY2hlZCBlYXJsaWVyIAotICAgIC8vcHV0IGl0IG9uIHRoZSBib3R0b20KLSAgICBTdHJpbmdbXSB0ZXN0VHlwZXMgPSBzY2VuYXJpb0NvbnRleHQuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwkgIAotICAgIFN0cmluZ1tdIG5ld1Rlc3RUeXBlcyA9IG5ldyBTdHJpbmdbdGVzdFR5cGVzLmxlbmd0aF07Ci0gICAgYm9vbGVhbiBsYXVuY2hlZCA9IGZhbHNlOwotICAgIGludCBqID0gMDsKLSAgICBmb3IoaW50IGkgPSAwO2k8dGVzdFR5cGVzLmxlbmd0aDtpKyspewotCSAgaWYodGVzdFR5cGVzW2ldLmVxdWFscyhsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSkpCi0JICAgIGxhdW5jaGVkID0gdHJ1ZTsKLQkgIGVsc2V7Ci0JICAgICBuZXdUZXN0VHlwZXNbal0gPSB0ZXN0VHlwZXNbaV07Ci0JICAgICBqKys7Ci0JICB9Ci0JfQotCSAgIAkKLSAgICBpZihsYXVuY2hlZCkKLQkgIG5ld1Rlc3RUeXBlc1t0ZXN0VHlwZXMubGVuZ3RoIC0gMV0gPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLQkgIAkKLSAgICB0ZXN0RmFjaWxpdGllcyA9IG5ldyBTZWxlY3Rpb25MaXN0KG5ld1Rlc3RUeXBlcywwKTsJCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZShTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUpCi0gIHsKLSAgCXRoaXMubGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3RXZWJTZXJ2aWNlQ2xpZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9UZXN0V2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODk0YTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1Rlc3RXZWJTZXJ2aWNlQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotCi1wdWJsaWMgY2xhc3MgVGVzdFdlYlNlcnZpY2VDbGllbnQgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQgewotICAKLSAgcHVibGljIFRlc3RXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGNsaWVudEluZm8pewotCXN1cGVyKGNsaWVudEluZm8pOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotICAgICAgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKXsKLSAgICByZXR1cm4gbnVsbDsJICAKLSAgfQotCQkJCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLSAgICAgIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcil7Ci0gICAgcmV0dXJuIG51bGw7CSAgCi0gIH0KLQkJCQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0JCSAgICAgIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcil7Ci0gICAgcmV0dXJuIG51bGw7CSAgCi0gIH0KLQkJCQkKLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJICAgICAgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKXsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCQkJCi0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotCQkgICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBlYXIpewotICAgIHJldHVybiBudWxsOwkgIAotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV1NETEZpbmlzaEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMRmluaXNoRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmNDM2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMRmluaXNoRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRmluaXNoRnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnR7Ci0gIAotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV1NETFRlc3RMYXVuY2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMVGVzdExhdW5jaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5Y2Q3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XU0RMVGVzdExhdW5jaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNCwgMjAwNAotICoKLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5UZXN0SW5mbzsKLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVGVzdExhdW5jaENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHRlc3RJRDsgCi0gIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHNlcnZpY2VpZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlclByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlck1vZHVsZTsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBleHRlcm5hbEJyb3dzZXI7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0gIHByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlckluc3RhbmNlSWQgPSBudWxsOwotCQotICBwdWJsaWMgV1NETFRlc3RMYXVuY2hDb21tYW5kKCkKLSAgewotICAJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0JbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsgIAkKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAJCi0gIAlXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHRlc3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgCVdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIHdzY3RlID0gKFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKXRlc3RSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSh0ZXN0SUQpOwotCUlXZWJTZXJ2aWNlVGVzdGVyIGl3c3QgPSAoSVdlYlNlcnZpY2VUZXN0ZXIpd3NjdGUuZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24oKTsKLQlUZXN0SW5mbyB0ZXN0SW5mbyA9IGdldFRlc3RJbmZvKCk7Ci0JCi0JCi0Jc3RhdHVzID0gY29tbWFuZEZhY3RvcnlFeGVjdXRpb24oaXdzdC5sYXVuY2godGVzdEluZm8pLGVudik7Ci0JCi0gICAgLy9Eb250IG5lZWQgdG8gc2h1dCBldmVyeXRoaW5nIGRvd24gYmVjYXVzZSB0aGUgd3NkbCB0ZXN0IGRvZXNudCB3b3JrCi0gICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gU3RhdHVzLk9LKXsKLSAgICAgIFN0YXR1c0hhbmRsZXIgc0hhbmRsZXIgPSBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpOwotICAgICAgU3RhdHVzIGluZm9TdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX0xBVU5DSF9XU0RMX1RFU1QiKSwgU3RhdHVzLklORk8pOwotICAgICAgc0hhbmRsZXIucmVwb3J0SW5mbyhpbmZvU3RhdHVzKTsKLSAgICAgIHJldHVybiBpbmZvU3RhdHVzOwkKLSAgICB9Ci0gICByZXR1cm4gc3RhdHVzOwotICAJCi0gIH0KLQotICBwcml2YXRlIFN0YXR1cyBjb21tYW5kRmFjdG9yeUV4ZWN1dGlvbihJQ29tbWFuZEZhY3RvcnkgY29tbWFuZEZhY3RvcnksRW52aXJvbm1lbnQgZW52KQotICB7Ci0JU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7ICAJCi0Jd2hpbGUoY29tbWFuZEZhY3RvcnkuaGFzTmV4dCgpKXsgCi0JICBDb21tYW5kIGNvbW1hbmQgPSBjb21tYW5kRmFjdG9yeS5nZXROZXh0Q29tbWFuZCgpOwotCSAgaWYgKGNvbW1hbmQgIT0gbnVsbCkKLQkgICAgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKGVudik7Ci0JICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpewotCSAgICBTdGF0dXNIYW5kbGVyIHNIYW5kbGVyID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKTsKLQkJc0hhbmRsZXIucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJcmV0dXJuIHN0YXR1czsKLQkgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotICAKLSAgCi0gIHByaXZhdGUgVGVzdEluZm8gZ2V0VGVzdEluZm8oKQotICB7Ci0gICAgLy8JZ2V0IHRoZSBzZXJ2ZXIgc3R1ZmYKLSAgICBpZiAoc2VydmljZWlkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkgIT0gbnVsbCkgCi0JICBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmljZWlkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotICAgIGVsc2UgaWYgKHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkIT1udWxsKQotCQlzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmljZVNlcnZlckluc3RhbmNlSWQpOwotCQotCWlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgIT0gbnVsbCkKLQkgIHNlcnZpY2VTZXJ2ZXJUeXBlSUQgPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0JZWxzZQotCSAgc2VydmljZVNlcnZlclR5cGVJRCA9IHNlcnZpY2VpZHMuZ2V0U2VydmVySWQoKTsKLQkvLyBzZXJ2ZXIgd2lsbCBiZSBjcmVhdGVkIGluIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZAotICAKLSAgICBUZXN0SW5mbyB0ZXN0SW5mbyA9IG5ldyBUZXN0SW5mbygpOwotCWlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIhPW51bGwpCi0JCXRlc3RJbmZvLnNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIpOwotICAgIHRlc3RJbmZvLnNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoc2VydmljZVNlcnZlclR5cGVJRCk7Ci0JdGVzdEluZm8uc2V0U2VydmljZVByb2plY3Qoc2VydmVyUHJvamVjdCk7Ci0JdGVzdEluZm8uc2V0V3NkbFNlcnZpY2VVUkwod3NkbFVSSSk7Ci0JdGVzdEluZm8uc2V0RW5kcG9pbnQoZW5kcG9pbnRzKTsKLQlyZXR1cm4gdGVzdEluZm87Ci0JCi0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRUZXN0SUQoU3RyaW5nIHRlc3RJRCkKLSAgewotICAJdGhpcy50ZXN0SUQgPSB0ZXN0SUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVkU2VydmljZVRlc3ROYW1lKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsJCi0gIH0KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAJdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZWlkcykKLSAgewotICAgIHRoaXMuc2VydmljZWlkcyA9IHNlcnZpY2VpZHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEJyb3dzZXIoYm9vbGVhbiBleHRlcm5hbEJyb3dzZXIpCi0gIHsKLSAgCXRoaXMuZXh0ZXJuYWxCcm93c2VyID0gZXh0ZXJuYWxCcm93c2VyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChMaXN0IGVuZHBvaW50cykKLSAgewotICAgIHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzOwotICB9Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTW9kdWxlKCkgewotCXJldHVybiBzZXJ2ZXJNb2R1bGU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNlcnZlck1vZHVsZShTdHJpbmcgc2VydmVyTW9kdWxlKSB7Ci0JdGhpcy5zZXJ2ZXJNb2R1bGUgPSBzZXJ2ZXJNb2R1bGU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzc0luc3RhbmNlSWQpewotCXRoaXMuc2VydmljZVNlcnZlckluc3RhbmNlSWQgPSBzc0luc3RhbmNlSWQ7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1YTQzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotCi0vKioKLSogVGhpcyB0YXNrIHNldHMgdXAgYWxsIHRoZSBkZWZhdWx0cyBmb3IgdGhlIHdlYnNlcnZpY2UgdGVzdAotKiBjbGllbnQgcGFnZQotKgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dFQl9NT0RVTEVfUk9PVCA9ICJXZWJDb250ZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQU1QTEVfV0VCX1BST0pFQ1RfRVhUID0gIlNhbXBsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0FNUExFX0VBUl9QUk9KRUNUX0VYVCA9ICJFQVIiOwotCi0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIldlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbFRhc2siOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJkZWZhdWx0IGFjdGlvbnMiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0FNUExFX0RJUiA9ICJzYW1wbGUiOwotICBwdWJsaWMgU3RyaW5nIFNFVF9FTkRQT0lOVCA9ICJzZXRFbmRQb2ludChqYXZhLm5ldC5VUkwpIjsKLSAgcHVibGljIFN0cmluZyBHRVRfRU5EUE9JTlQgPSAiZ2V0RW5kUG9pbnQoKSI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgUFJPWFkgPSAiUHJveHkiOwotCi0gIHByaXZhdGUgU2NlbmFyaW9Db250ZXh0IHNjZW5hcmlvQ29udGV4dDsKLSAKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFA7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudENvbXBvbmVudDsKLSAgcHJpdmF0ZSBJUHJvamVjdCBjbGllbnRJUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdEVBUjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIHByaXZhdGUgV2ViU2VydmljZVRlc3RSZWdpc3RyeSB0ZXN0UmVnaXN0cnk7Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCB0ZXN0RmFjaWxpdGllczsKLSAgcHJpdmF0ZSBTdHJpbmcgZm9sZGVyOwotICBwcml2YXRlIFN0cmluZyBqc3BGb2xkZXI7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBydW50aW1lMkNsaWVudFR5cGVzOwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVQcm9qZWN0OwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVFQVI7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbjsKLQotICBwcml2YXRlIFN0cmluZyBsYXVuY2hlZFNlcnZpY2VUZXN0TmFtZTsKLSAgcHJpdmF0ZSBib29sZWFuIHJ1bkNsaWVudFRlc3Q9dHJ1ZTsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsVGFzayBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgYW5kIGRlc2NyaXB0aW9uLgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZCAoKQotICB7Ci0gIAlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gIAlzZXROYW1lKExBQkVMKTsKLSAgCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotCW1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7ICAJCi0gICAgCi0gICAgc2NlbmFyaW9Db250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpLmNvcHkoKTsKLSAgCXRlc3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCQotCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAJCi0Jc2FtcGxlUHJvamVjdEFuZEVhclNldHVwKCk7Ci0gIAkKLSAgICAvL0dldCB0aGUgc2FtcGxlIEZvbGRlciByZWFkeQotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQoIi8iKS5hcHBlbmQoc2FtcGxlUHJvamVjdCkuYXBwZW5kKCIvIikuYXBwZW5kKERFRkFVTFRfV0VCX01PRFVMRV9ST09UKS5hcHBlbmQoIi8iKTsKLSAgICBmb2xkZXIgPSBTQU1QTEVfRElSICsgZ2V0QmVhbigpOyAKLSAgICAgICAgCi0gICAgc2IuYXBwZW5kKGZvbGRlcik7Ci0gICAganNwRm9sZGVyID0gc2IudG9TdHJpbmcoKTsKLSAgICAKLSAgICAvL2dldCB0aGUgbWV0aG9kIG5hbWVzIHJlYWR5Ci0gICAgLy9maW5kIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUgaW4gdGhlIHByb2plY3QKLSAgICAvKgotICAgICogR2V0dGluZyB0aGUgbWV0aG9kIG5hbWVzIHVzaW5nIGphdmFtb2YgaW50cm9zcGVjdGlvbgotICAgICovCi0gICAgaWYocHJveHlCZWFuID09IG51bGwpewotICAgICAgU3RhdHVzSGFuZGxlciBzSGFuZGxlciA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCk7Ci0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX1BST1hZX05PVF9DT01QSUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgc0hhbmRsZXIucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwotICAgICAgcmV0dXJuIGVycm9yU3RhdHVzOwotICAgICAgCi0gICAgfSAJCi0gICAgCi0gICAgCi0gICAgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIGphdmFtb2Zjb21tYW5kID0gbmV3IEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCgpOyAKLSAgICBqYXZhbW9mY29tbWFuZC5zZXRQcm94eUJlYW4ocHJveHlCZWFuKTsKLSAgICBqYXZhbW9mY29tbWFuZC5zZXRDbGllbnRQcm9qZWN0KGNsaWVudFApOwotICAgIAotICAgIAotICAgIAotICAgIHRyeXsgCi0gICAgICBTdGF0dXMgbW9mU3RhdHVzID0gamF2YW1vZmNvbW1hbmQuZXhlY3V0ZShlbnYpOwotICAgICAgaWYobW9mU3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgCXJldHVybiBtb2ZTdGF0dXM7Ci0gICAgfWNhdGNoKEV4Y2VwdGlvbiBleGMpewotICAgIAlTdGF0dXNIYW5kbGVyIHNIYW5kbGVyID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKTsKLSAgICAgICAgU3RhdHVzIGVycm9yU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19QUk9YWV9OT1RfQ09NUElMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgc0hhbmRsZXIucmVwb3J0RXJyb3IoZXJyb3JTdGF0dXMpOwotICAgICAgICByZXR1cm4gZXJyb3JTdGF0dXM7Ci0gICAgfSAgCi0gICAgSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMgPSBqYXZhbW9mY29tbWFuZC5nZXRKYXZhQ2xhc3MoKTsKLSAgICBpZiAoamF2YUhlbHBlcnMgPT0gbnVsbCkgcmV0dXJuIHN0YXR1czsKLSAgICAgIAotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBudWxsOyAKLSAgICBpZihqYXZhSGVscGVycyBpbnN0YW5jZW9mIEphdmFDbGFzcykgCi0gICAgIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YUhlbHBlcnM7IAotICAgIGVsc2UgcmV0dXJuIHN0YXR1czsgCi0gICAgTGlzdCBtZXRob2RMaXN0ID0gamF2YUNsYXNzLmdldFB1YmxpY01ldGhvZHMoKTsKLSAJQm9vbGVhblNlbGVjdGlvbltdIHRlbXBNZXRob2RzID0gbmV3IEJvb2xlYW5TZWxlY3Rpb25bbWV0aG9kTGlzdC5zaXplKCldOwotICAgIExpc3RJdGVyYXRvciBsaXN0SXRlcmF0b3IgPSBtZXRob2RMaXN0Lmxpc3RJdGVyYXRvcigpOwotICAgIAotICAgIGludCBqID0gMDsKLSAJd2hpbGUgKGxpc3RJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpbGlzdEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIGNvbnRpbnVlOwotICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCk7Ci0gICAgICAKLSAgICAgIHRlbXBNZXRob2RzW2pdID0gbmV3IEJvb2xlYW5TZWxlY3Rpb24oIG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCksIHRydWUpOyAgICAgIAotICAgICAgaisrOwotICAgIH0gCi0gICAgbWV0aG9kcyA9IHRlbXBNZXRob2RzOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQklEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5XZWIiOyAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgRUpCSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFByb2plY3RUeXBlLkVKQiI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFQUENMSUVOVCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuQXBwQ2xpZW50IjsKLSAgCi0gIAotICBwcml2YXRlIHZvaWQgc2FtcGxlUHJvamVjdEFuZEVhclNldHVwKCkKLSAgewotICAJaWYoY2xpZW50UHJvamVjdCA9PSBudWxsKSByZXR1cm47Ci0gIAllbHNlewotCSAgaW50IGluZGV4ID0gY2xpZW50UHJvamVjdC5pbmRleE9mKCIvIik7Ci0JICBjbGllbnRQID0gY2xpZW50UHJvamVjdC5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JICBjbGllbnRDb21wb25lbnQgPSBjbGllbnRQcm9qZWN0LnN1YnN0cmluZyhpbmRleCArIDEpOwotICAJfQotCSAgCi0JY2xpZW50SVByb2plY3QgPSAoSVByb2plY3QpUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGNsaWVudFApOwotICAJLy9tb3ZlIHRvIHRoZSB3ZWIgbGV2ZWwKLSAgCVNlbGVjdGlvbkxpc3RDaG9pY2VzIHNsYyA9IHJ1bnRpbWUyQ2xpZW50VHlwZXMuZ2V0Q2hvaWNlKCk7Ci0gIAlTdHJpbmcgcHJvamVjdFR5cGUgPSBzbGMuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAJaWYocHJvamVjdFR5cGUuZXF1YWxzKFdFQklEKSl7Ci0gICAgICBzYW1wbGVQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgCX0gIAkKLSAgCWVsc2V7IAotICAJICBzYW1wbGVQcm9qZWN0ID0gKG5ldyBTdHJpbmdCdWZmZXIoY2xpZW50SVByb2plY3QuZ2V0TmFtZSgpKSkuYXBwZW5kKERFRkFVTFRfU0FNUExFX1dFQl9QUk9KRUNUX0VYVCkudG9TdHJpbmcoKTsJCi0gIAl9Ci0gIAlzYW1wbGVFQVIgPSBzbGMuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICAJaWYgKHNhbXBsZUVBUiA9PSBudWxsIHx8IHNhbXBsZUVBUi5sZW5ndGgoKT09MCkKLSAgCXsKLSAgCSAgLy9DcmVhdGUgYSBkZWZhdWx0IG5hbWUgaWYgYW4gRUFSIGlzIG5lZWRlZC4KLQkJLy9Vc2UgdGhlIHNlcnZlciB0eXBlCi0JCVN0cmluZyB0YXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQoY2xpZW50SWRzLmdldFNlcnZlcklkKCkpOwotCQlpZiAodGFyZ2V0SWQhPW51bGwgJiYgdGFyZ2V0SWQubGVuZ3RoKCk+MCkKLQkJewotCQkgIGlmIChTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHRhcmdldElkLGoyZWVWZXJzaW9uKSkKLQkgIAkgIHsKLQkJICAgIHNhbXBsZUVBUiA9IChuZXcgU3RyaW5nQnVmZmVyKHNhbXBsZVByb2plY3QpKS5hcHBlbmQoREVGQVVMVF9TQU1QTEVfRUFSX1BST0pFQ1RfRVhUKS50b1N0cmluZygpOwotCSAgCSAgfQotCQl9ICAJICAKLSAgCX0KLSAgfQotICAgIAotICAvL2dldHRlcnMgYW5kIHNldHRlcnMKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEJlYW4oKQotICB7Ci0gIAlpbnQgaW5kZXggPSBwcm94eUJlYW4ubGFzdEluZGV4T2YoIi4iKTsKLSAgCVN0cmluZyBlbmQgPSAiIjsKLSAgCWlmKGluZGV4ICE9IC0xKXsKLSAgCSAgZW5kID0gcHJveHlCZWFuLnN1YnN0cmluZyhpbmRleCArIDEpOyAgCQotICAJfQotICAJU3RyaW5nIGJlYW4gPSBlbmQuc3Vic3RyaW5nKDAsZW5kLmxlbmd0aCgpKTsKLSAgICAKLSAgCXJldHVybiBiZWFuOwotICB9Ci0gIAotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UnVuQ2xpZW50VGVzdCgpCi0gIHsKLSAgCXJldHVybiBydW5DbGllbnRUZXN0OwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEZvbGRlcigpCi0gIHsKLSAgCXJldHVybiBmb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SnNwRm9sZGVyKCkKLSAgewotICAJcmV0dXJuIGpzcEZvbGRlcjsKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW5TZWxlY3Rpb25bXSBnZXRNZXRob2RzKCkKLSAgewotICAgIHJldHVybiBtZXRob2RzOyAgCi0gIH0KLSAgICAKLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVQcm9qZWN0RUFSKCkKLSAgewotICAJcmV0dXJuIHNhbXBsZUVBUjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTYW1wbGVQcm9qZWN0KCkKLSAgewotICAJcmV0dXJuIHNhbXBsZVByb2plY3Q7Ci0gIH0KLSAgICAgICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm94eUJlYW4oKQotICB7Ci0gICAgcmV0dXJuIHByb3h5QmVhbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3RFQVIoU3RyaW5nIGNsaWVudFByb2plY3RFQVIpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3RFQVIgPSBjbGllbnRQcm9qZWN0RUFSOwotICB9CQotICAKLSAgcHVibGljIHZvaWQgc2V0UnVudGltZTJDbGllbnRUeXBlcyggU2VsZWN0aW9uTGlzdENob2ljZXMgc2VsZWN0aW9uTGlzdCApCi0gIHsKLSAgICBydW50aW1lMkNsaWVudFR5cGVzID0gc2VsZWN0aW9uTGlzdDsgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoU3RyaW5nIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lKQotICB7Ci0gIAl0aGlzLmxhdW5jaGVkU2VydmljZVRlc3ROYW1lID0gbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWU7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBjbGllbnRJZHMgVGhlIGNsaWVudElkcyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRJZHMoVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzKQotICB7Ci0gICAgdGhpcy5jbGllbnRJZHMgPSBjbGllbnRJZHM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgajJlZVZlcnNpb24gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SjJlZVZlcnNpb24oU3RyaW5nIHZlcnNpb24pCi0gIHsKLSAgICBqMmVlVmVyc2lvbiA9IHZlcnNpb247Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTgwYWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L1dlYlNlcnZpY2VUZXN0Q2xpZW50RGVwYXJ0dXJlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5CdWlsZFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0Q2xpZW50RGVwYXJ0dXJlRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50IAotewotICBwdWJsaWMgV2ViU2VydmljZVRlc3RDbGllbnREZXBhcnR1cmVGcmFnbWVudCgpCi0gIHsKLSAgCWFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IEZpbmlzaERlZmF1bHRDb21tYW5kKCksIiIpKTsKLSAgCWFkZChuZXcgRmluaXNoSmF2YVRlc3RGcmFnbWVudCgpKTsKLSAgCWFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQoKSwiIikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFRlc3RDbGllbnREZXBhcnR1cmVJbml0Q29tbWFuZC5jbGFzcywgIkZvcmNlQnVpbGQiLEJ1aWxkUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MsICJTYW1wbGVTZXJ2ZXJUeXBlSUQiLEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MpOwotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MsICJTYW1wbGVFeGlzdGluZ1NlcnZlciIsQWRkTW9kdWxlRGVwZW5kZW5jaWVzQ29tbWFuZC5jbGFzcyk7Ci0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcywgIlNhbXBsZVNlcnZlclR5cGVJRCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcywgIlNhbXBsZUV4aXN0aW5nU2VydmVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MsICJzYW1wbGVQcm9qZWN0IixCdWlsZFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9FeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkMmEyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9FeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0UHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldTRExUZXN0RmluaXNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIGltcGxlbWVudHMgV1NETFRlc3RGaW5pc2hDb21tYW5kCi17Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiRXhwbG9yZXJTZXJ2aWNlVGVzdENvbW1hbmQiOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJMYXVuY2ggdGhlIEV4cGxvcmVyIjsKLSAgcHJpdmF0ZSBib29sZWFuIGV4dGVybmFsQnJvd3NlciA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxTZXJ2aWNlVVJMOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEOwotICBwcml2YXRlIElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdDsKLSAgcHJpdmF0ZSBMaXN0IGVuZHBvaW50czsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgV2ViU2VydmljZUV4cGxvcmVyTGF1bmNoIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBsYWJlbCBhbmQgZGVzY3JpcHRpb24uCi0gICovCi0gIHB1YmxpYyBFeHBsb3JlclNlcnZpY2VUZXN0Q29tbWFuZCAoKQotICB7Ci0gIAlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gIAlzZXROYW1lKExBQkVMKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIAotICAgIFN0YXJ0UHJvamVjdENvbW1hbmQgc3BjID0gbmV3IFN0YXJ0UHJvamVjdENvbW1hbmQoIHRydWUgKTsKLSAgICBzcGMuc2V0U2VydmljZVNlcnZlclR5cGVJRChzZXJ2aWNlU2VydmVyVHlwZUlEKTsKLSAgICBzcGMuc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHNlcnZpY2VFeGlzdGluZ1NlcnZlcik7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uoc2VydmljZVByb2plY3QpOwotICAgIHNwYy5zZXRTZXJ2aWNlUHJvamVjdChwcm9qZWN0KTsKLSAgICBzcGMuc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZCh0cnVlKTsKLSAgICAKLSAgICBzdGF0dXMgPSBzcGMuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBzdGF0dXM7Ci0KLSAgICBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kIGxhdW5jaENvbW1hbmQgPSBuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpOwotICAgIGxhdW5jaENvbW1hbmQuc2V0Rm9yY2VMYXVuY2hPdXRzaWRlSURFKGV4dGVybmFsQnJvd3Nlcik7Ci0gICAgVmVjdG9yIGxhdW5jaE9wdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQlTdHJpbmcgc3RhdGVMb2NhdGlvbiA9IEV4cGxvcmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpOwotCVN0cmluZyBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24gPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbigpOwotCWxhdW5jaE9wdGlvblZlY3Rvci5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlNUQVRFX0xPQ0FUSU9OLHN0YXRlTG9jYXRpb24pKTsKLQlsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5ERUZBVUxUX0ZBVk9SSVRFU19MT0NBVElPTixkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24pKTsKLSAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5XU0RMX1VSTCx3c2RsU2VydmljZVVSTCkpOwotICAgIGlmIChlbmRwb2ludHMgIT0gbnVsbCkKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlbmRwb2ludHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV0VCX1NFUlZJQ0VfRU5EUE9JTlQsIGl0Lm5leHQoKS50b1N0cmluZygpKSk7Ci0gICAgbGF1bmNoQ29tbWFuZC5zZXRMYXVuY2hPcHRpb25zKChMYXVuY2hPcHRpb25bXSlsYXVuY2hPcHRpb25WZWN0b3IudG9BcnJheShuZXcgTGF1bmNoT3B0aW9uWzBdKSk7Ci0gICAgc3RhdHVzID0gbGF1bmNoQ29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVybmFsQnJvd3Nlcihib29sZWFuIGV4dGVybmFsQnJvd3NlcikKLSAgewotICAJdGhpcy5leHRlcm5hbEJyb3dzZXIgPSBleHRlcm5hbEJyb3dzZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxTZXJ2aWNlVVJMKFN0cmluZyB3c2RsU2VydmljZVVSTCkKLSAgewotICAJdGhpcy53c2RsU2VydmljZVVSTCA9IHdzZGxTZXJ2aWNlVVJMOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgCXRoaXMuc2VydmljZVNlcnZlclR5cGVJRCA9IHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gIAl0aGlzLnNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoU3RyaW5nIHNlcnZpY2VQcm9qZWN0KQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlUHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChMaXN0IGVuZHBvaW50cykKLSAgewotICAgIHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV1NFR2VuZXJhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XU0VHZW5lcmF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3NjAzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XU0VHZW5lcmF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5leHBsb3JlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsdWdpbi5FeHBsb3JlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5UZXN0SW5mbzsKLQotcHVibGljIGNsYXNzIFdTRUdlbmVyYXRlQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHByaXZhdGUgVGVzdEluZm8gdGVzdEluZm87Ci0gIHByaXZhdGUgTW9kZWwgcHJveHlNb2RlbDsKLQkgIAotICBwdWJsaWMgV1NFR2VuZXJhdGVDb21tYW5kKFRlc3RJbmZvIHRlc3RJbmZvKXsKLSAgICB0aGlzLnRlc3RJbmZvID0gdGVzdEluZm87Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICAKLSAgICBTdGFydFByb2plY3RDb21tYW5kIHNwYyA9IG5ldyBTdGFydFByb2plY3RDb21tYW5kKCB0cnVlICk7Ci0gICAgc3BjLnNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQodGVzdEluZm8uZ2V0U2VydmljZVNlcnZlclR5cGVJRCgpKTsKLSAgICBzcGMuc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHRlc3RJbmZvLmdldFNlcnZpY2VFeGlzdGluZ1NlcnZlcigpKTsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QodGVzdEluZm8uZ2V0U2VydmljZVByb2plY3QoKSk7Ci0gICAgc3BjLnNldFNlcnZpY2VQcm9qZWN0KHByb2plY3QpOwotICAgIHNwYy5zZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKHRydWUpOwotICAgIAotICAgIHN0YXR1cyA9IHNwYy5leGVjdXRlKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIHN0YXR1czsKLQotICAgIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQgbGF1bmNoQ29tbWFuZCA9IG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCk7Ci0gICAgbGF1bmNoQ29tbWFuZC5zZXRGb3JjZUxhdW5jaE91dHNpZGVJREUoZmFsc2UpOwotICAgIFZlY3RvciBsYXVuY2hPcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JU3RyaW5nIHN0YXRlTG9jYXRpb24gPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblN0YXRlTG9jYXRpb24oKTsKLQlTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uID0gRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24oKTsKLQlsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5TVEFURV9MT0NBVElPTixzdGF0ZUxvY2F0aW9uKSk7Ci0JbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuREVGQVVMVF9GQVZPUklURVNfTE9DQVRJT04sZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKSk7Ci0gICAgbGF1bmNoT3B0aW9uVmVjdG9yLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV1NETF9VUkwsdGVzdEluZm8uZ2V0V3NkbFNlcnZpY2VVUkwoKSkpOwotICAgIGlmICh0ZXN0SW5mby5nZXRFbmRwb2ludCgpICE9IG51bGwpCi0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdEluZm8uZ2V0RW5kcG9pbnQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICBsYXVuY2hPcHRpb25WZWN0b3IuYWRkKG5ldyBMYXVuY2hPcHRpb24oTGF1bmNoT3B0aW9ucy5XRUJfU0VSVklDRV9FTkRQT0lOVCwgaXQubmV4dCgpLnRvU3RyaW5nKCkpKTsKLSAgICBsYXVuY2hDb21tYW5kLnNldExhdW5jaE9wdGlvbnMoKExhdW5jaE9wdGlvbltdKWxhdW5jaE9wdGlvblZlY3Rvci50b0FycmF5KG5ldyBMYXVuY2hPcHRpb25bMF0pKTsKLSAgICBzdGF0dXMgPSBsYXVuY2hDb21tYW5kLmV4ZWN1dGUoZW52KTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XU0VXZWJTZXJ2aWNlVGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC9leHBsb3Jlci9XU0VXZWJTZXJ2aWNlVGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjNiOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV1NFV2ViU2VydmljZVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5UZXN0SW5mbzsKLQotcHVibGljIGNsYXNzIFdTRVdlYlNlcnZpY2VUZXN0ZXIgaW1wbGVtZW50cyBJV2ViU2VydmljZVRlc3RlciAgewotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2VuZXJhdGUoVGVzdEluZm8gdGVzdEluZm8pewotICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLSAgfQotCSAgCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgbGF1bmNoKFRlc3RJbmZvIHRlc3RJbmZvKXsKLSAgICBWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0JY29tbWFuZHMuYWRkKG5ldyBXU0VHZW5lcmF0ZUNvbW1hbmQodGVzdEluZm8pKTsKLQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsJCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3QvZXhwbG9yZXIvV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmIzNWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L2V4cGxvcmVyL1dlYlNlcnZpY2VFeHBsb3JlckV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LmV4cGxvcmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VGaW5pc2hDb21tYW5kOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUV4cGxvcmVyRXhlY3V0YWJsZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAgCi0gIAotICBwdWJsaWMgV2ViU2VydmljZUZpbmlzaENvbW1hbmQgZ2V0RmluaXNoQ29tbWFuZCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEV4cGxvcmVyU2VydmljZVRlc3RDb21tYW5kKCk7Ci0gIH0KLSAgCi19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvR1NUQ0dlbmVyYXRlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvR1NUQ0dlbmVyYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2U1ZTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL0dTVENHZW5lcmF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Qud3NzYW1wbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW4uSW5wdXRGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5NZXRob2RGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5SZXN1bHRGaWxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbi5UZXN0Q2xpZW50RmlsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1hbmQuR2VuZXJhdGVQYWdlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1hbmQuSmF2YVRvTW9kZWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuVGVzdEluZm87Ci0KLXB1YmxpYyBjbGFzcyBHU1RDR2VuZXJhdGVDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSU5QVVQgICAgICAgPSAiSW5wdXQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEVTVF9DTElFTlQgPSAiVGVzdENsaWVudC5qc3AiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNVTFQgICAgICA9ICJSZXN1bHQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTUVUSE9EICAgICAgPSAiTWV0aG9kLmpzcCI7Ci0JCi0gIHByaXZhdGUgVGVzdEluZm8gdGVzdEluZm87Ci0gIHByaXZhdGUgTW9kZWwgcHJveHlNb2RlbDsKLSAgCi0gIHB1YmxpYyBHU1RDR2VuZXJhdGVDb21tYW5kKFRlc3RJbmZvIHRlc3RJbmZvKXsKLSAgCXRoaXMudGVzdEluZm8gPSB0ZXN0SW5mbzsKLSAgfQotCQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQgY29weSA9IG5ldyBDb3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZCgpOyAgICAKLQljb3B5LnNldFNhbXBsZVByb2plY3QodGVzdEluZm8uZ2V0R2VuZXJhdGlvblByb2plY3QoKSk7Ci0gIGNvcHkuc2V0U2FtcGxlQ29tcG9uZW50KHRlc3RJbmZvLmdldEdlbmVyYXRpb25Nb2R1bGUoKSk7Ci0Jc3RhdHVzID0gY29weS5leGVjdXRlKGVudik7Ci0JaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLQlzdGF0dXMgPSBjcmVhdGVNb2RlbChlbnYpOwotCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0Jc3RhdHVzID0gZ2VuZXJhdGVQYWdlcyhlbnYpOwotCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0JcmV0dXJuIHN0YXR1czsgICAKLSAgfQotCi0gIC8vY3JlYXRlIHRoZSBtb2RlbCBmcm9tIHRoZSByZXNvdXJjZQotICBwcml2YXRlIFN0YXR1cyBjcmVhdGVNb2RlbChFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBKYXZhVG9Nb2RlbENvbW1hbmQganRtYyA9IG5ldyBKYXZhVG9Nb2RlbENvbW1hbmQoKTsKLQlqdG1jLnNldE1ldGhvZHModGVzdEluZm8uZ2V0TWV0aG9kcygpKTsKLQlqdG1jLnNldENsaWVudFByb2plY3QodGVzdEluZm8uZ2V0Q2xpZW50UHJvamVjdCgpKTsKLQlqdG1jLnNldFByb3h5QmVhbih0ZXN0SW5mby5nZXRQcm94eUJlYW4oKSk7Ci0JU3RhdHVzIHN0YXR1cyA9IGp0bWMuZXhlY3V0ZShlbnYpOwotCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgcHJveHlNb2RlbCA9IGp0bWMuZ2V0RGF0YU1vZGVsKCk7Ci0JcmV0dXJuIHN0YXR1czsKLSAgfSAKLSAgCi0gICAvKioKLSAgICogR2VuZXJhdGUgdGhlIGZvdXIganNwcyB0aGF0IG1ha2UgdXAgdGhpcwotICAgKiBzYW1wbGUgYXBwLgotICAgKi8KLSAgIHByaXZhdGUgU3RhdHVzIGdlbmVyYXRlUGFnZXMoRW52aXJvbm1lbnQgZW52KQotICAgewotICAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgICBJUGF0aCBmRGVzdGluYXRpb25Gb2xkZXJQYXRoID0gbmV3IFBhdGgodGVzdEluZm8uZ2V0SnNwRm9sZGVyKCkpOwotICAgICBmRGVzdGluYXRpb25Gb2xkZXJQYXRoID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5tYWtlQWJzb2x1dGUoKTsgICAgCi0gICAgIElXb3Jrc3BhY2VSb290IGZXb3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCi0gICAgIElQYXRoIHBhdGhUZXN0ID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5hcHBlbmQoVEVTVF9DTElFTlQpOwotICAgICBJRmlsZSBmaWxlVGVzdCA9IGZXb3Jrc3BhY2UuZ2V0RmlsZShwYXRoVGVzdCk7Ci0gICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjVGVzdCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICAgbmV3IFRlc3RDbGllbnRGaWxlR2VuZXJhdG9yKElOUFVULE1FVEhPRCxSRVNVTFQpLGZpbGVUZXN0KTsKLSAgICAgLy9ncGNUZXN0LnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgc3RhdHVzID0gZ3BjVGVzdC5leGVjdXRlKGVudik7Ci0gICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgCi0KLSAgICAgLy9pbnB1dCBjb2RlZ2VuCi0gICAgIElQYXRoIHBhdGhJbnB1dCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGguYXBwZW5kKElOUFVUKTsKLSAgICAgSUZpbGUgZmlsZUlucHV0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhJbnB1dCk7Ci0gICAgIElucHV0RmlsZUdlbmVyYXRvciBpbnB1dEdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVHZW5lcmF0b3IoUkVTVUxUKTsKLSAgICAgR2VuZXJhdGVQYWdlQ29tbWFuZCBncGNJbnB1dCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICAgaW5wdXRHZW5lcmF0b3IsZmlsZUlucHV0KTsKLSAgICAgLy9ncGNJbnB1dC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgIHN0YXR1cyA9IGdwY0lucHV0LmV4ZWN1dGUoZW52KTsKLSAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgIAlyZXR1cm4gc3RhdHVzOwotCi0gICAgIC8vbWV0aG9kIGNvZGVnZW4KLSAgICAgSVBhdGggcGF0aE1ldGhvZCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGguYXBwZW5kKE1FVEhPRCk7Ci0gICAgIElGaWxlIGZpbGVNZXRob2QgPSBmV29ya3NwYWNlLmdldEZpbGUocGF0aE1ldGhvZCk7Ci0gICAgIE1ldGhvZEZpbGVHZW5lcmF0b3IgbWV0aG9kR2VuZXJhdG9yID0gbmV3IE1ldGhvZEZpbGVHZW5lcmF0b3IoSU5QVVQpOwotICAgICBtZXRob2RHZW5lcmF0b3Iuc2V0Q2xpZW50Rm9sZGVyUGF0aCh0ZXN0SW5mby5nZXRKc3BGb2xkZXIoKSk7Ci0gICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjTWV0aG9kID0gbmV3IEdlbmVyYXRlUGFnZUNvbW1hbmQoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgcHJveHlNb2RlbCwKLSAgICAgICBtZXRob2RHZW5lcmF0b3IsZmlsZU1ldGhvZCk7Ci0gICAgIC8vZ3BjTWV0aG9kLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgc3RhdHVzID0gZ3BjTWV0aG9kLmV4ZWN1dGUoZW52KTsKLSAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgIAlyZXR1cm4gc3RhdHVzOyAgICAKLQotCi0gICAgIC8vcmVzdWx0IGNvZGVnZW4KLSAgICAgSVBhdGggcGF0aFJlc3VsdCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGguYXBwZW5kKFJFU1VMVCk7Ci0gICAgIElGaWxlIGZpbGVSZXN1bHQgPSBmV29ya3NwYWNlLmdldEZpbGUocGF0aFJlc3VsdCk7Ci0gICAgIFJlc3VsdEZpbGVHZW5lcmF0b3IgcmZnID0gbmV3IFJlc3VsdEZpbGVHZW5lcmF0b3IoKTsKLSAgICAgcmZnLnNldENsaWVudEZvbGRlclBhdGgodGVzdEluZm8uZ2V0SnNwRm9sZGVyKCkpOwotICAgICByZmcuc2V0U2V0RW5kcG9pbnRNZXRob2QodGVzdEluZm8uZ2V0U2V0RW5kcG9pbnRNZXRob2QoKSk7Ci0gICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjUmVzdWx0ID0gbmV3IEdlbmVyYXRlUGFnZUNvbW1hbmQoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgcHJveHlNb2RlbCwKLSAgICAgICByZmcsZmlsZVJlc3VsdCk7Ci0gICAgIHN0YXR1cyA9IGdwY1Jlc3VsdC5leGVjdXRlKGVudik7Ci0gICAgIAotICAgICByZXR1cm4gc3RhdHVzOwotICAgfQotCi0gICAKLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL0dTVENMYXVuY2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9HU1RDTGF1bmNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzEwNDI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL0dTVENMYXVuY2hDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uUHVibGlzaFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV2ViQnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXb3JrYmVuY2hCcm93c2VyU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuVGVzdEluZm87Ci0KLXB1YmxpYyBjbGFzcyBHU1RDTGF1bmNoQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOUFVUICAgICAgID0gIklucHV0LmpzcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRFU1RfQ0xJRU5UID0gIlRlc3RDbGllbnQuanNwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTVUxUICAgICAgPSAiUmVzdWx0LmpzcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1FVEhPRCAgICAgID0gIk1ldGhvZC5qc3AiOwotCQkKLSAgcHJpdmF0ZSBUZXN0SW5mbyB0ZXN0SW5mbzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIAotICBwdWJsaWMgR1NUQ0xhdW5jaENvbW1hbmQoVGVzdEluZm8gdGVzdEluZm8pewotICAgIHRoaXMudGVzdEluZm8gPSB0ZXN0SW5mbzsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQltc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICB9Ci0JCQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KXsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLQlyZXR1cm4gc3RhdHVzID0gbGF1bmNoU2FtcGxlKGVudik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RhdHVzIGxhdW5jaFNhbXBsZSAoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0JSVBhdGggZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCA9IG5ldyBQYXRoKHRlc3RJbmZvLmdldEpzcEZvbGRlcigpKTsKLQlmRGVzdGluYXRpb25Gb2xkZXJQYXRoID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5tYWtlQWJzb2x1dGUoKTsgICAgCi0gICAgUHVibGlzaFByb2plY3RDb21tYW5kIHBwYyA9IG5ldyBQdWJsaXNoUHJvamVjdENvbW1hbmQoKTsKLSAgICBwcGMuc2V0U2VydmVyVHlwZUlEKHRlc3RJbmZvLmdldENsaWVudFNlcnZlclR5cGVJRCgpKTsKLSAgICBwcGMuc2V0RXhpc3RpbmdTZXJ2ZXIodGVzdEluZm8uZ2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXIoKSk7Ci0gICAgcHBjLnNldFByb2plY3QodGVzdEluZm8uZ2V0R2VuZXJhdGlvblByb2plY3QoKSk7Ci0Jc3RhdHVzID0gcHBjLmV4ZWN1dGUoZW52KTsKLQotCVN0YXJ0UHJvamVjdENvbW1hbmQgc3BjID0gbmV3IFN0YXJ0UHJvamVjdENvbW1hbmQoZmFsc2UgKTsKLQlzcGMuc2V0U2VydmljZVNlcnZlclR5cGVJRCh0ZXN0SW5mby5nZXRDbGllbnRTZXJ2ZXJUeXBlSUQoKSk7Ci0Jc3BjLnNldFNhbXBsZUV4aXN0aW5nU2VydmVyKHRlc3RJbmZvLmdldENsaWVudEV4aXN0aW5nU2VydmVyKCkpOwotCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHRlc3RJbmZvLmdldEdlbmVyYXRpb25Qcm9qZWN0KCkpOwotCXNwYy5zZXRTYW1wbGVQcm9qZWN0KHByb2plY3QpOwotCXNwYy5zZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKHRydWUpOwotCSAgICAKLQlzdGF0dXMgPSBzcGMuZXhlY3V0ZShlbnYpOwotCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0JICAgIAotCUlQYXRoIG5ld1BhdGggPSBuZXcgUGF0aChSZXNvdXJjZVV0aWxzLmdldFdlYlByb2plY3RVUkwoUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YoZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCksdGVzdEluZm8uZ2V0Q2xpZW50U2VydmVyVHlwZUlEKCksdGVzdEluZm8uZ2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXIoKSkpOwotCW5ld1BhdGggPSBuZXdQYXRoLmFwcGVuZChmRGVzdGluYXRpb25Gb2xkZXJQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMykubWFrZUFic29sdXRlKCkpOwotCVN0cmluZ0J1ZmZlciB1cmxTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKG5ld1BhdGguYXBwZW5kKFRFU1RfQ0xJRU5UKS50b1N0cmluZygpKTsKLQlpZiAodGVzdEluZm8uZ2V0RW5kcG9pbnQoKSAhPSBudWxsICYmICF0ZXN0SW5mby5nZXRFbmRwb2ludCgpLmlzRW1wdHkoKSkKLQl7Ci0JICB1cmxTdHJpbmcuYXBwZW5kKCI/ZW5kcG9pbnQ9Iik7Ci0JICB1cmxTdHJpbmcuYXBwZW5kKHRlc3RJbmZvLmdldEVuZHBvaW50KCkuZ2V0KDApLnRvU3RyaW5nKCkpOwotCX0KLQkgICAgCi0JdHJ5ewotCSAgICAgIFVSTCB1cmw7Ci0JICAgICAgdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcudG9TdHJpbmcoKSk7Ci0KLQkgICAgICBmb3IoIGludCByZXRyaWVzID0gMDsgcmV0cmllcyA8IDEwOyByZXRyaWVzKysgKQotCSAgICAgIHsKLQkgICAgICAgIHRyeQotCSAgICAgICAgewotCSAgICAgICAgICAvLyBUZXN0IHRoZSBVUkxzCi0JICAgICAgICAgIChuZXcgVVJMKG5ld1BhdGguYXBwZW5kKFJFU1VMVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLQkgICAgICAgICAgKG5ldyBVUkwobmV3UGF0aC5hcHBlbmQoTUVUSE9EKS50b1N0cmluZygpKSkub3BlblN0cmVhbSgpOwotCSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChJTlBVVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLQkgICAgICAgICAgKG5ldyBVUkwobmV3UGF0aC5hcHBlbmQoVEVTVF9DTElFTlQpLnRvU3RyaW5nKCkpKS5vcGVuU3RyZWFtKCk7Ci0JICAgICAgICAgIC8vIExvb2tzIGdvb2QsIGV4aXQgbG9vcAotCSAgICAgICAgICBicmVhazsKLQkgICAgICAgIH0KLQkgICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBpb2UgKQotCSAgICAgICAgewotCSAgICAgICAgICB0cnkKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHt9IAkgIAkgICAgICAgICAgCi0JICAgICAgICB9Ci0JICAgICAgfQotCi0JCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCQlJV2ViQnJvd3NlciBicm93c2VyID0gYnJvd3NlclN1cHBvcnQuY3JlYXRlQnJvd3NlcihJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTE9DQVRJT05fQkFSLCBudWxsLCBudWxsLCBudWxsKTsKLQkJCWJyb3dzZXIub3BlblVSTCh1cmwpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JCSB9Y2F0Y2goUGFydEluaXRFeGNlcHRpb24gZXhjKXsKLQkJCS8vVE9ETzogY2hhbmdlIGVycm9yIG1lc3NhZ2UKLQkJCWVudi5nZXRMb2coKS5sb2coTG9nLldBUk5JTkcsIDUwNDgsIHRoaXMsICJsYXVuY2hTYW1wbGUiLCBleGMpOwotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5XQVJOSU5HICk7Ci0JCQl0cnkgewotCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0JCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICJsYXVuY2hTYW1wbGUiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTUFMRk9STUVEX1VSTCIpLCBTdGF0dXMuRVJST1IgKTsKLQkJCX0KLQkgICAgCXJldHVybiBzdGF0dXM7Ci0JICAgIH1jYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjKXsKLQkgICAgCWVudi5nZXRMb2coKS5sb2coTG9nLldBUk5JTkcsIDUwNDgsIHRoaXMsICJsYXVuY2hTYW1wbGUiLCBleGMpOwotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5XQVJOSU5HICk7Ci0JCQl0cnkgewotCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0JCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICJsYXVuY2hTYW1wbGUiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTUFMRk9STUVEX1VSTCIpLCBTdGF0dXMuRVJST1IgKTsKLQkJCX0KLQkgICAgCXJldHVybiBzdGF0dXM7Ci0JICAgIH0KLSAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL0dTVENXZWJTZXJ2aWNlVGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9HU1RDV2ViU2VydmljZVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRlY2M2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL0dTVENXZWJTZXJ2aWNlVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3Qud3NzYW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlVGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LlRlc3RJbmZvOwotCi1wdWJsaWMgY2xhc3MgR1NUQ1dlYlNlcnZpY2VUZXN0ZXIgaW1wbGVtZW50cyBJV2ViU2VydmljZVRlc3RlciAgewotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2VuZXJhdGUoVGVzdEluZm8gdGVzdEluZm8pewotICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQljb21tYW5kcy5hZGQobmV3IEdTVENHZW5lcmF0ZUNvbW1hbmQodGVzdEluZm8pKTsKLQlyZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLSAgfQotICAKLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBsYXVuY2goVGVzdEluZm8gdGVzdEluZm8pewotCVZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjb21tYW5kcy5hZGQobmV3IEdTVENMYXVuY2hDb21tYW5kKHRlc3RJbmZvKSk7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7CQotICB9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvdGVzdC93c3NhbXBsZS9XU1NhbXBsZUZpbmlzaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL1dTU2FtcGxlRmluaXNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYxMTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL1dTU2FtcGxlRmluaXNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5QdWJsaXNoUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0UHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLklucHV0RmlsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW4uTWV0aG9kRmlsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW4uUmVzdWx0RmlsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW4uVGVzdENsaWVudEZpbGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tYW5kLkdlbmVyYXRlUGFnZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tYW5kLkphdmFUb01vZGVsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ29weVdlYlNlcnZpY2VVdGlsc0phckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LkphdmFQcm94eVRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBXU1NhbXBsZUZpbmlzaENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIGltcGxlbWVudHMgSmF2YVByb3h5VGVzdENvbW1hbmQKLXsKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlBVVCAgICAgICA9ICJJbnB1dC5qc3AiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBURVNUX0NMSUVOVCA9ICJUZXN0Q2xpZW50LmpzcCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU1VMVCAgICAgID0gIlJlc3VsdC5qc3AiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBNRVRIT0QgICAgICA9ICJNZXRob2QuanNwIjsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSAiSmF2YUJlYW5Ub1NhbXBsZUFjdGl2ZVRhc2siOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVmYXVsdCBhY3Rpb25zIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0gIAotICBwcml2YXRlIE1vZGVsIHByb3h5TW9kZWw7Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICAKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHFuYW1lOwotICBwcml2YXRlIFN0cmluZyBqc3BGb2xkZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBydW5DbGllbnRUZXN0OwotICBwcml2YXRlIFN0cmluZyBzYW1wbGVQcm9qZWN0OwotICBwcml2YXRlIEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzOwotICBwcml2YXRlIFN0cmluZyBwcm94eUJlYW47Ci0gIHByaXZhdGUgU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kOwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyBKYXZhQmVhblRvU2FtcGxlQWN0aXZlVGFzayBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgYW5kIGRlc2NyaXB0aW9uLgotICAqLwotICBwdWJsaWMgV1NTYW1wbGVGaW5pc2hDb21tYW5kICgpCi0gIHsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLQltc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQlzZXROYW1lKExBQkVMKTsgIAkKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIC8vc2V0dGVycyBhbmQgZ2V0dGVycyB0byBiZSByZW1vdmVkCi0gIAlDb3B5V2ViU2VydmljZVV0aWxzSmFyQ29tbWFuZCBjb3B5ID0gbmV3IENvcHlXZWJTZXJ2aWNlVXRpbHNKYXJDb21tYW5kKCk7ICAgIAotICAJY29weS5zZXRTYW1wbGVQcm9qZWN0KHNhbXBsZVByb2plY3QpOwotICAJc3RhdHVzID0gY29weS5leGVjdXRlKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBzdGF0dXMgPSBjcmVhdGVNb2RlbChlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgc3RhdHVzID0gZ2VuZXJhdGVQYWdlcyhlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgLy9pZiAoIWlzU3VjY2Vzc2Z1bCgpKSByZXR1cm47Ci0gICAgc3RhdHVzID0gbGF1bmNoU2FtcGxlKGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsgICAKLSAgfQotCi0gICAKLSAgLyoqCi0gICogR2VuZXJhdGUgdGhlIGZvdXIganNwcyB0aGF0IG1ha2UgdXAgdGhpcwotICAqIHNhbXBsZSBhcHAuCi0gICovCi0gIHByb3RlY3RlZCBTdGF0dXMgZ2VuZXJhdGVQYWdlcyhFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIElQYXRoIGZEZXN0aW5hdGlvbkZvbGRlclBhdGggPSBuZXcgUGF0aChqc3BGb2xkZXIpOwotICAgIGZEZXN0aW5hdGlvbkZvbGRlclBhdGggPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLm1ha2VBYnNvbHV0ZSgpOyAgICAKLSAgICBJV29ya3NwYWNlUm9vdCBmV29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotICAgIElQYXRoIHBhdGhUZXN0ID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5hcHBlbmQoVEVTVF9DTElFTlQpOwotICAgIElGaWxlIGZpbGVUZXN0ID0gZldvcmtzcGFjZS5nZXRGaWxlKHBhdGhUZXN0KTsKLSAgICBHZW5lcmF0ZVBhZ2VDb21tYW5kIGdwY1Rlc3QgPSBuZXcgR2VuZXJhdGVQYWdlQ29tbWFuZChFbnZpcm9ubWVudFV0aWxzLmdldFJlc291cmNlQ29udGV4dChlbnYpLCBwcm94eU1vZGVsLAotICAgICAgbmV3IFRlc3RDbGllbnRGaWxlR2VuZXJhdG9yKElOUFVULE1FVEhPRCxSRVNVTFQpLGZpbGVUZXN0KTsKLSAgICAvL2dwY1Rlc3Quc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgIHN0YXR1cyA9IGdwY1Rlc3QuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgIAlyZXR1cm4gc3RhdHVzOwotICAgIAotCi0gICAgLy9pbnB1dCBjb2RlZ2VuCi0gICAgSVBhdGggcGF0aElucHV0ID0gZkRlc3RpbmF0aW9uRm9sZGVyUGF0aC5hcHBlbmQoSU5QVVQpOwotICAgIElGaWxlIGZpbGVJbnB1dCA9IGZXb3Jrc3BhY2UuZ2V0RmlsZShwYXRoSW5wdXQpOwotICAgIElucHV0RmlsZUdlbmVyYXRvciBpbnB1dEdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVHZW5lcmF0b3IoUkVTVUxUKTsKLSAgICBHZW5lcmF0ZVBhZ2VDb21tYW5kIGdwY0lucHV0ID0gbmV3IEdlbmVyYXRlUGFnZUNvbW1hbmQoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgcHJveHlNb2RlbCwKLSAgICAgIGlucHV0R2VuZXJhdG9yLGZpbGVJbnB1dCk7Ci0gICAgLy9ncGNJbnB1dC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgc3RhdHVzID0gZ3BjSW5wdXQuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgIAlyZXR1cm4gc3RhdHVzOwotCi0gICAgLy9tZXRob2QgY29kZWdlbgotICAgIElQYXRoIHBhdGhNZXRob2QgPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLmFwcGVuZChNRVRIT0QpOwotICAgIElGaWxlIGZpbGVNZXRob2QgPSBmV29ya3NwYWNlLmdldEZpbGUocGF0aE1ldGhvZCk7Ci0gICAgTWV0aG9kRmlsZUdlbmVyYXRvciBtZXRob2RHZW5lcmF0b3IgPSBuZXcgTWV0aG9kRmlsZUdlbmVyYXRvcihJTlBVVCk7Ci0gICAgbWV0aG9kR2VuZXJhdG9yLnNldENsaWVudEZvbGRlclBhdGgoanNwRm9sZGVyKTsKLSAgICBHZW5lcmF0ZVBhZ2VDb21tYW5kIGdwY01ldGhvZCA9IG5ldyBHZW5lcmF0ZVBhZ2VDb21tYW5kKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksIHByb3h5TW9kZWwsCi0gICAgICBtZXRob2RHZW5lcmF0b3IsZmlsZU1ldGhvZCk7Ci0gICAgLy9ncGNNZXRob2Quc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgIHN0YXR1cyA9IGdwY01ldGhvZC5leGVjdXRlKGVudik7Ci0gICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUiApCi0gICAgCXJldHVybiBzdGF0dXM7ICAgIAotCi0KLSAgICAvL3Jlc3VsdCBjb2RlZ2VuCi0gICAgSVBhdGggcGF0aFJlc3VsdCA9IGZEZXN0aW5hdGlvbkZvbGRlclBhdGguYXBwZW5kKFJFU1VMVCk7Ci0gICAgSUZpbGUgZmlsZVJlc3VsdCA9IGZXb3Jrc3BhY2UuZ2V0RmlsZShwYXRoUmVzdWx0KTsKLSAgICBSZXN1bHRGaWxlR2VuZXJhdG9yIHJmZyA9IG5ldyBSZXN1bHRGaWxlR2VuZXJhdG9yKCk7Ci0gICAgcmZnLnNldENsaWVudEZvbGRlclBhdGgoanNwRm9sZGVyKTsKLSAgICByZmcuc2V0U2V0RW5kcG9pbnRNZXRob2Qoc2V0RW5kcG9pbnRNZXRob2QpOwotICAgIEdlbmVyYXRlUGFnZUNvbW1hbmQgZ3BjUmVzdWx0ID0gbmV3IEdlbmVyYXRlUGFnZUNvbW1hbmQoRW52aXJvbm1lbnRVdGlscy5nZXRSZXNvdXJjZUNvbnRleHQoZW52KSwgcHJveHlNb2RlbCwKLSAgICAgIHJmZyxmaWxlUmVzdWx0KTsKLSAgICAvL2dwY1Jlc3VsdC5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgc3RhdHVzID0gZ3BjUmVzdWx0LmV4ZWN1dGUoZW52KTsKLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgU3RhdHVzIGxhdW5jaFNhbXBsZSAoRW52aXJvbm1lbnQgZW52KSB7Ci0KLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIGlmICghcnVuQ2xpZW50VGVzdCkgcmV0dXJuIHN0YXR1czsKLSAgICAKLQotICAgIElQYXRoIGZEZXN0aW5hdGlvbkZvbGRlclBhdGggPSBuZXcgUGF0aChqc3BGb2xkZXIpOwotICAgIGZEZXN0aW5hdGlvbkZvbGRlclBhdGggPSBmRGVzdGluYXRpb25Gb2xkZXJQYXRoLm1ha2VBYnNvbHV0ZSgpOyAgICAKLQotICAgIFB1Ymxpc2hQcm9qZWN0Q29tbWFuZCBwcGMgPSBuZXcgUHVibGlzaFByb2plY3RDb21tYW5kKCk7Ci0gICAgcHBjLnNldFNlcnZlclR5cGVJRChzYW1wbGVTZXJ2ZXJUeXBlSUQpOwotICAgIHBwYy5zZXRFeGlzdGluZ1NlcnZlcihzYW1wbGVFeGlzdGluZ1NlcnZlcik7Ci0gICAgcHBjLnNldFByb2plY3Qoc2FtcGxlUHJvamVjdCk7Ci0gICAgc3RhdHVzID0gcHBjLmV4ZWN1dGUoZW52KTsKLQotICAgIFN0YXJ0UHJvamVjdENvbW1hbmQgc3BjID0gbmV3IFN0YXJ0UHJvamVjdENvbW1hbmQoZmFsc2UgKTsKLSAgICBzcGMuc2V0U2VydmljZVNlcnZlclR5cGVJRChzYW1wbGVTZXJ2ZXJUeXBlSUQpOwotICAgIHNwYy5zZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihzYW1wbGVFeGlzdGluZ1NlcnZlcik7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uoc2FtcGxlUHJvamVjdCk7Ci0gICAgc3BjLnNldFNhbXBsZVByb2plY3QocHJvamVjdCk7Ci0gICAgc3BjLnNldElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQodHJ1ZSk7Ci0gICAgCi0gICAgc3RhdHVzID0gc3BjLmV4ZWN1dGUoZW52KTsKLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIAotICAgIElQYXRoIG5ld1BhdGggPSBuZXcgUGF0aChSZXNvdXJjZVV0aWxzLmdldFdlYlByb2plY3RVUkwoUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YoZkRlc3RpbmF0aW9uRm9sZGVyUGF0aCksc2FtcGxlU2VydmVyVHlwZUlELHNhbXBsZUV4aXN0aW5nU2VydmVyKSk7Ci0gICAgbmV3UGF0aCA9IG5ld1BhdGguYXBwZW5kKGZEZXN0aW5hdGlvbkZvbGRlclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygyKS5tYWtlQWJzb2x1dGUoKSk7Ci0gICAgU3RyaW5nQnVmZmVyIHVybFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIobmV3UGF0aC5hcHBlbmQoVEVTVF9DTElFTlQpLnRvU3RyaW5nKCkpOwotICAgIGlmIChlbmRwb2ludHMgIT0gbnVsbCAmJiAhZW5kcG9pbnRzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICB1cmxTdHJpbmcuYXBwZW5kKCI/ZW5kcG9pbnQ9Iik7Ci0gICAgICB1cmxTdHJpbmcuYXBwZW5kKGVuZHBvaW50cy5nZXQoMCkudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIAotICAgIHRyeXsKLSAgICAgIFVSTCB1cmw7Ci0gICAgICB1cmwgPSBuZXcgVVJMKHVybFN0cmluZy50b1N0cmluZygpKTsKLQotICAgICAgZm9yKCBpbnQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCAxMDsgcmV0cmllcysrICkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBUZXN0IHRoZSBVUkxzCi0gICAgICAgICAgKG5ldyBVUkwobmV3UGF0aC5hcHBlbmQoUkVTVUxUKS50b1N0cmluZygpKSkub3BlblN0cmVhbSgpOwotICAgICAgICAgIChuZXcgVVJMKG5ld1BhdGguYXBwZW5kKE1FVEhPRCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChJTlBVVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAobmV3IFVSTChuZXdQYXRoLmFwcGVuZChURVNUX0NMSUVOVCkudG9TdHJpbmcoKSkpLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAvLyBMb29rcyBnb29kLCBleGl0IGxvb3AKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggSU9FeGNlcHRpb24gaW9lICkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7fSAJICAJICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0KLQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IGJyb3dzZXJTdXBwb3J0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRCcm93c2VyU3VwcG9ydCgpOwotCQlJV2ViQnJvd3NlciBicm93c2VyID0gYnJvd3NlclN1cHBvcnQuY3JlYXRlQnJvd3NlcihJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTE9DQVRJT05fQkFSIHwgSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0Lk5BVklHQVRJT05fQkFSLCBudWxsLCBudWxsLCBudWxsKTsKLQkJYnJvd3Nlci5vcGVuVVJMKHVybCk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotCSB9Y2F0Y2goUGFydEluaXRFeGNlcHRpb24gZXhjKXsKLQkJLy9UT0RPOiBjaGFuZ2UgZXJyb3IgbWVzc2FnZQotCQllbnYuZ2V0TG9nKCkubG9nKExvZy5XQVJOSU5HLCA1MDQ4LCB0aGlzLCAibGF1bmNoU2FtcGxlIiwgZXhjKTsKLQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5XQVJOSU5HICk7Ci0JCXRyeSB7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5FUlJPUiApOwotCQl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMpewotICAgIAllbnYuZ2V0TG9nKCkubG9nKExvZy5XQVJOSU5HLCA1MDQ4LCB0aGlzLCAibGF1bmNoU2FtcGxlIiwgZXhjKTsKLQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5XQVJOSU5HICk7Ci0JCXRyeSB7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggImxhdW5jaFNhbXBsZSIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9NQUxGT1JNRURfVVJMIiksIFN0YXR1cy5FUlJPUiApOwotCQl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgCi0KLSAgcHJvdGVjdGVkIFN0YXR1cyBjcmVhdGVNb2RlbChFbnZpcm9ubWVudCBlbnYpIHsKLQotICAJLy9jcmVhdGUgdGhlIG1vZGVsIGZyb20gdGhlIHJlc291cmNlCi0gICAgSmF2YVRvTW9kZWxDb21tYW5kIGp0bWMgPSBuZXcgSmF2YVRvTW9kZWxDb21tYW5kKCk7Ci0gICAganRtYy5zZXRNZXRob2RzKG1ldGhvZHMpOwotICAgIGp0bWMuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICBqdG1jLnNldFByb3h5QmVhbihwcm94eUJlYW4pOwotICAgIC8vanRtYy5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGp0bWMuZXhlY3V0ZShlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpIHJldHVybiBzdGF0dXM7Ci0KLSAgICBwcm94eU1vZGVsID0ganRtYy5nZXREYXRhTW9kZWwoKTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpCi0gIHsKLSAgCXRoaXMuc2FtcGxlU2VydmVyVHlwZUlEID0gc2FtcGxlU2VydmVyVHlwZUlEOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKQotICB7Ci0gIAl0aGlzLnNhbXBsZUV4aXN0aW5nU2VydmVyID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKQotICB7Ci0gICAgdGhpcy5qc3BGb2xkZXIgPSBqc3BGb2xkZXI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoYm9vbGVhbiBydW5DbGllbnRUZXN0KQotICB7Ci0gIAl0aGlzLnJ1bkNsaWVudFRlc3QgPSBydW5DbGllbnRUZXN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVQcm9qZWN0KFN0cmluZyBzYW1wbGVQcm9qZWN0KQotICB7Ci0gIAl0aGlzLnNhbXBsZVByb2plY3QgPSBzYW1wbGVQcm9qZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAJdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcykKLSAgewotICAJdGhpcy5tZXRob2RzID0gbWV0aG9kczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2V0RW5kcG9pbnRNZXRob2QgVGhlIHNldEVuZHBvaW50TWV0aG9kIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNldEVuZHBvaW50TWV0aG9kKFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZCkKLSAgewotICAgIHRoaXMuc2V0RW5kcG9pbnRNZXRob2QgPSBzZXRFbmRwb2ludE1ldGhvZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoTGlzdCBlbmRwb2ludHMpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL3Rlc3Qvd3NzYW1wbGUvV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzNDAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy90ZXN0L3dzc2FtcGxlL1dlYlNlcnZpY2VXU1NhbXBsZUV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0Lndzc2FtcGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXhlY3V0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VGaW5pc2hDb21tYW5kOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdTU2FtcGxlRXhlY3V0YWJsZSBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gICAKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRmluaXNoQ29tbWFuZCBnZXRGaW5pc2hDb21tYW5kKCkKLSAgewotICAJcmV0dXJuIG5ldyBXU1NhbXBsZUZpbmlzaENvbW1hbmQoKTsKLSAgfQotICAgIAotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0NsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0NsaWVudFByb2plY3RUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmNmM0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9DbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UHJvamVjdFR5cGVSZWdpc3RyeQotewotICBwcml2YXRlIHN0YXRpYyBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5IGluc3RhbmNlXzsKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c187Ci0KLSAgcHJpdmF0ZSBDbGllbnRQcm9qZWN0VHlwZVJlZ2lzdHJ5KCkKLSAgewotICAgIGluaXQoKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgICAgaW5zdGFuY2VfID0gbmV3IENsaWVudFByb2plY3RUeXBlUmVnaXN0cnkoKTsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBjb25maWdFbGVtZW50c18gPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAiY2xpZW50UHJvamVjdFR5cGUiKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RGVmYXVsdEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRCeUlkKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIik7Ci0gIH0KLQotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBpZCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImlkIiwgaWQpOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50QnlMYWJlbChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudEJ5QXR0cmlidXRlKCJsYWJlbCIsIGxhYmVsKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0RWxlbWVudEJ5UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50c18ubGVuZ3RoOyBpKyspCi0gICAgICBpZiAoaW5jbHVkZShwcm9qZWN0LCBjb25maWdFbGVtZW50c19baV0uZ2V0QXR0cmlidXRlKCJpbmNsdWRlIikpICYmIGV4Y2x1ZGUocHJvamVjdCwgY29uZmlnRWxlbWVudHNfW2ldLmdldEF0dHJpYnV0ZSgiZXhjbHVkZSIpKSkKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRzX1tpXTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldEVsZW1lbnRCeUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50c18ubGVuZ3RoOyBpKyspCi0gICAgICBpZiAoY29uZmlnRWxlbWVudHNfW2ldLmdldEF0dHJpYnV0ZShuYW1lKS5lcXVhbHModmFsdWUpKQotICAgICAgICByZXR1cm4gY29uZmlnRWxlbWVudHNfW2ldOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElQcm9qZWN0W10gZ2V0UHJvamVjdHMoU3RyaW5nIGlkKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50QnlJZChpZCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJUHJvamVjdFtdIHdvcmtzcGFjZVByb2pzID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgIElWaXJ0dWFsQ29tcG9uZW50W10gY29tcHMgPSBKMkVFVXRpbHMuZ2V0QWxsQ29tcG9uZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wcy5sZW5ndGg7IGkrKykgewotCQkgIC8vIFRPRE86IE5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgdG8gd29yayB3aXRoIHByb2plY3QvbW9kdWxlIHRvcG9sb2d5IGRlc2NyaWJlZCBpbiBYUAotICAgICAgICAvL2lmIChpbmNsdWRlKHdvcmtzcGFjZVByb2pzW2ldLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaW5jbHVkZSIpKSAmJiBleGNsdWRlKHdvcmtzcGFjZVByb2pzW2ldLCBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZXhjbHVkZSIpKSkKLSAgICAgICAgLy8gTm90ZTogQWRkaW5nIGEgcHJvamVjdCBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIHdlYiBvciBlamIgbW9kdWxlLgotCQkgICAgaWYgKEoyRUVVdGlscy5pc1dlYkNvbXBvbmVudChjb21wc1tpXS5nZXRQcm9qZWN0KCksIGNvbXBzW2ldLmdldE5hbWUoKSkgCi0gICAgICAgICAgICB8fCBKMkVFVXRpbHMuaXNFSkJDb21wb25lbnQoY29tcHNbaV0uZ2V0UHJvamVjdCgpLCBjb21wc1tpXS5nZXROYW1lKCkpKQl7Ci0gICAgICAgICAgdi5hZGQoY29tcHNbaV0uZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElQcm9qZWN0W3Yuc2l6ZSgpXTsKLSAgICB2LmNvcHlJbnRvKHByb2plY3RzKTsKLSAgICByZXR1cm4gcHJvamVjdHM7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgaW5jbHVkZSkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5jbHVkZSk7Ci0gICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAocHJvamVjdC5oYXNOYXR1cmUoc3QubmV4dFRva2VuKCkpKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBleGNsdWRlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBleGNsdWRlKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihleGNsdWRlKTsKLSAgICB3aGlsZShzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShzdC5uZXh0VG9rZW4oKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVJ1bnRpbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0lXZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2M3ZDkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL0lXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZSBhcnRpZmFjdC4gCi0qLwotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVJ1bnRpbWUKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqIEByZXR1cm4gaWQgb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIExhYmVsIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBMYWJlbCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwgKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBhIFN0cmluZywgSjJFRSB2ZXJzaW9uCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRKMkVFVmVyc2lvbnMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aAotICAgKiB0aGlzIHJ1bnRpbWUuCi0gICAqIAotICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVNlcnZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwZDk2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VUeXBlCi0qIG9iamVjdCBpcyB0byBtYW51ZmFjdHVyZSB0aGUgd2l6YXJkIHBhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgdHlwZS4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlU2VydmVyCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKTsKLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgbmFtZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsICgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBzZXQgdHJ1ZSBpbiBwbHVnaW4ueG1sCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0SXNEZWZhdWx0KCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBydW50aW1lIHRhcmdldCBJZAotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lVHlwZUlkKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aAotICAgKiB0aGlzIHJ1bnRpbWUuCi0gICAqIAotICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvSVdlYlNlcnZpY2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0OTY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9JV2ViU2VydmljZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhIGtpbmQgb2YKLSogV2ViIFNlcnZpY2UgYXJ0aWZhY3QuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYSBXZWJTZXJ2aWNlVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUuCi0qLwotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVR5cGUKLXsKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gaWQgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkICgpOwotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZSdzIGV4dGVuc2lvbiBtZXRhZGF0YS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZSdzIGV4dGVuc2lvbiBtZXRhZGF0YS4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEV4dGVuc2lvbk1ldGFkYXRhICgpOwotICAKLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyByZXNvdXJjZSBtZXRhZGF0YS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZSdzIHJlc291cmNlIG1ldGFkYXRhLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VUeXBlTWV0YWRhdGEgKCk7ICAKLSAgCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGx1Z2luLnhtbCBjb250YWlucyBhbiBhdHRyaWJ1dGUgb2YgImNhbkZpbmlzaCIgd2l0aCBhIHZhbHVlIG9mIHRydWUuICBPdGhlcndpc2UsIAotICAqIGZhbHNlIGlzIHJldHVybmVkLiAgTm90ZTogaWYgdGhlICJjYW5GaW5pc2giIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkIHRydWUgaXMgcmV0dXJuZWQgYnkgZGVmYXVsdC4KLSAgKiBAcmV0dXJuIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHVzZXIgY2FuIGZpbmlzaCBvbiB0aGUgcGFnZXMgYmVmb3JlIHRoZSB3ZWIgc2VydmljZSB0eXBlIHBhZ2VzLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRDYW5GaW5pc2goKTsgIAotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoCi0gICAqIHRoaXMgcnVudGltZS4KLSAgICogCi0gICAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudAotICAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOWI3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS51ZGRpLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5Ci17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwcml2YXRlIHN0YXRpYyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IGluc3RhbmNlXzsKLQotICBwcml2YXRlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKSB7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHB1YmxpYyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcml2YXRlVURESVJlZ2lzdHJ5VHlwZSIpOwotCi0gICAgdHJ5IHsKLSAgICAgIE9iamVjdCBjb25maWdFbGVtZW50ID0gKChjb25maWcubGVuZ3RoID4gMCkgPyBjb25maWdbMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKSA6IG51bGwpOwotICAgICAgaWYoY29uZmlnRWxlbWVudCAhPSBudWxsICYmIGNvbmZpZ0VsZW1lbnQgaW5zdGFuY2VvZiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSkgCi0gICAgICAgIHJldHVybiAoUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUpY29uZmlnRWxlbWVudDsgCi0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1B1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMjg3MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaS5QdWJsaWNVRERJUmVnaXN0cnlUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICBwcml2YXRlIHN0YXRpYyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotICBwcml2YXRlIFZlY3RvciB0eXBlc187Ci0gIHByaXZhdGUgVmVjdG9yIGNvbmZpZ0VsZW1lbnRzXzsKLQotICBwcml2YXRlIFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpIHsKLSAgICB0eXBlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgY29uZmlnRWxlbWVudHNfID0gbmV3IFZlY3RvcigpOwotCi0gICAgaW5pdCgpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgUHVibGljVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFB1YmxpY1VERElSZWdpc3RyeVR5cGVSZWdpc3RyeSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdWJsaWNVRERJUmVnaXN0cnlUeXBlIik7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZy5sZW5ndGg7IGkrKykgewotICAgICAgdHJ5IHsKLSAgICAgICAgT2JqZWN0IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQotICAgICAgICBpZiggY29uZmlnRWxlbWVudCBpbnN0YW5jZW9mIFB1YmxpY1VERElSZWdpc3RyeVR5cGUpICB7Ci0gICAgICAgICAgdHlwZXNfLmFkZChjb25maWdFbGVtZW50KTsKLSAgICAgICAgICBjb25maWdFbGVtZW50c18uYWRkKGNvbmZpZ1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHt9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeVR5cGVbXSBnZXRBbGxQdWJsaWNVRERJUmVnaXN0cnlUeXBlcygpIHsKLSAgICBQdWJsaWNVRERJUmVnaXN0cnlUeXBlW10gdHlwZXMgPSBuZXcgUHVibGljVURESVJlZ2lzdHJ5VHlwZVt0eXBlc18uc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzXy5zaXplKCk7IGkrKykgewotICAgICAgdHlwZXNbaV0gPSAoUHVibGljVURESVJlZ2lzdHJ5VHlwZSl0eXBlc18uZWxlbWVudEF0KGkpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLQotICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5VHlwZSBnZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlQnlJRChTdHJpbmcgaWQpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5zaXplKCk7IGkrKykgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGMgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KWNvbmZpZ0VsZW1lbnRzXy5lbGVtZW50QXQoaSk7Ci0gICAgICBpZiAoYy5nZXRBdHRyaWJ1dGUoImlkIikuZXF1YWxzKGlkKSkKLSAgICAgICAgcmV0dXJuIChQdWJsaWNVRERJUmVnaXN0cnlUeXBlKXR5cGVzXy5lbGVtZW50QXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNVRERJUmVnaXN0cnlUeXBlSURCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzXy5zaXplKCk7IGkrKykgewotICAgICAgUHVibGljVURESVJlZ2lzdHJ5VHlwZSB0eXBlID0gKFB1YmxpY1VERElSZWdpc3RyeVR5cGUpdHlwZXNfLmVsZW1lbnRBdChpKTsKLSAgICAgIGlmICh0eXBlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgIHJldHVybiAoKElDb25maWd1cmF0aW9uRWxlbWVudCljb25maWdFbGVtZW50c18uZWxlbWVudEF0KGkpKS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1J1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1J1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMjBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9SdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldC5JU2VydmVyVGFyZ2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydC5XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwotCi1wdWJsaWMgY2xhc3MgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotICBwcml2YXRlIFNoZWxsIHRoaXNTaGVsbDsKLSAgcHJpdmF0ZSBHcm91cCB2aWV3U2VsZWN0aW9uR3JvdXBfOwotICBwcml2YXRlIFRleHQgbWVzc2FnZUJhbm5lcl87Ci0gIHByaXZhdGUgQ29tcG9zaXRlIHByaW1hcnlHcm91cF87Ci0gIHByaXZhdGUgR3JvdXAgcnVudGltZXNHcm91cF87Ci0gIHByaXZhdGUgR3JvdXAgc2VydmVyc0dyb3VwXzsKLSAgcHJpdmF0ZSBUcmVlIHJ1bnRpbWVzTGlzdF87Ci0gIHByaXZhdGUgVHJlZSBzZXJ2ZXJMaXN0XzsKLSAgcHJpdmF0ZSBCdXR0b24gdmlld1NlbGVjdGlvbkJ5UnVudGltZUJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl87Ci0gIHByaXZhdGUgQnV0dG9uIHZpZXdTZWxlY3Rpb25CeUV4cGxvcmVCdXR0b25fOwotICBwcml2YXRlIENvbWJvIGoyZWVWZXJzaW9uQ29tYm87Ci0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDEgZm9yIHRoZSBzZWxlY3Rpb24gb2YgcnVudGltZSwgc2VydmVyIGFuZCBwcm9qZWN0IGNvbWJpbmF0aW9uCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfRElBTE9HID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDAxIjsKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwMiBmb3IgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIG9uIGluIHRoZSBkYWlsb2cgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0xJU1RfUlVOVElNRVMgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDIiOwotICAvKiBDT05URVhUX0lEIFBXUlMwMDAzIGZvciB0aGUgc2VydmVyIHNlbGVjdGlvbiBpbiB0aGUgZGlhbG9nICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19MSVNUX1NFUlZFUlMgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDMiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA0IGZvciB0aGUgRUpCIFByb2plY3QgY29tYm8gYm94IG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBkaWFsb2cKLSAgICovCi0gIC8vICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfRUpCX1BST0pFQ1QgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRAotICAvLyArICIuUFdSUzAwMDQiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA1IGZvciB0aGUgcnVudGltZSB2aWV3IHJhZGlvIGJ1dHRvbiBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfUkFESU9fUlVOVElNRSA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwNSI7Ci0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDYgZm9yIHRoZSBzZXJ2ZXIgdmlldyByYWRpbyBidXR0b24gb2YgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGRpYWxvZwotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX1JBRElPX1NFUlZFUiA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLklEICsgIi5QV1JTMDAwNiI7Ci0gIC8qCi0gICAqIENPTlRFWFRfSUQgUFdSUzAwMDcgZm9yIHRoZSBleHBsb3JlIHZpZXcgcmFkaW8gYnV0dG9uIG9mIHRoZSBydW50aW1lIHNlbGVjdGlvbiBkaWFsb2cKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdSU19SQURJT19FWFBMT1JFID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDA3IjsKLSAgLyoKLSAgICogQ09OVEVYVF9JRCBQV1JTMDAwOCBmb3IgdGhlIFdlYiBQcm9qZWN0IGNvbWJvIGJveCBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICAvLyAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0NPTUJPX1BST0pFQ1QgPQotICAvLyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5JRCArICIuUFdSUzAwMDgiOwotICAvKgotICAgKiBDT05URVhUX0lEIFBXUlMwMDA5IGZvciB0aGUgSjJFRSB2ZXJzaW9uIGNvbWJvIGJveCBvZiB0aGUgcnVudGltZSBzZWxlY3Rpb24gZGlhbG9nCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUlNfSjJFRV9WRVJTSU9OID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLlBXUlMwMDA5IjsKLQotICAvLyByc2tyZWcKLSAgLy9wcml2YXRlIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnaXN0cnk7Ci0gIC8vcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IHdzY3RSZWdpc3RyeTsKLSAgLy8gcnNrcmVnCi0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZlckxhYmVsc187Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGV4aXN0aW5nU2VydmVyc1RhYmxlXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFNlcnZlcl87Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRSdW50aW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50VHlwZUlkXzsKLSAgLy8gcnNrcmVnCi0gIC8vcHJpdmF0ZSBJV2ViU2VydmljZVJ1bnRpbWUgc2VsZWN0ZWRSdW50aW1lXzsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlUnVudGltZUluZm8gc2VsZWN0ZWRSdW50aW1lXzsKLSAgLy8gcnNrcmVnCi0gIHByaXZhdGUgSVNlcnZlciBzZWxlY3RlZFNlcnZlcl87Ci0gIHByaXZhdGUgU3RyaW5nIHNlbGVjdGVkU2VydmVyTGFiZWxfOwotICBwcml2YXRlIFN0cmluZyBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF87Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0V4aXN0aW5nU2VydmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlT25fID0gZmFsc2U7Ci0gIHByaXZhdGUgYnl0ZSBzZWxlY3Rpb25Nb2RlXzsKLSAgcHJpdmF0ZSBmaW5hbCBieXRlIE1PREVfU0VSVklDRSA9IChieXRlKSAwOwotICBwcml2YXRlIGZpbmFsIGJ5dGUgTU9ERV9DTElFTlQgPSAoYnl0ZSkgMTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VSVkVSX1RZUEVTX0lDT04gPSAiaWNvbnMvc2VydmVycy9zZXJ2ZXJzX29iai5naWYiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFWElTVElOR19TRVJWRVJTX0lDT04gPSAiaWNvbnMvc2VydmVycy9leGlzdGluZ19zZXJ2ZXJfb2JqLmdpZiI7Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlEXzsKLQotICBwdWJsaWMgUnVudGltZVNlcnZlclNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgYnl0ZSBtb2RlLCBUeXBlUnVudGltZVNlcnZlciBpZHMsIFN0cmluZyBqMmVlVmVyc2lvbikgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgICBzZWxlY3Rpb25Nb2RlXyA9IG1vZGU7Ci0gICAgdHlwZUlkXyA9IGlkcy5nZXRUeXBlSWQoKTsKLSAgICBkZWZhdWx0UnVudGltZV8gPSBpZHMuZ2V0UnVudGltZUlkKCk7Ci0gICAgZGVmYXVsdFNlcnZlcl8gPSBpZHMuZ2V0U2VydmVySWQoKTsKLSAgICBzZXJ2ZXJJbnN0YW5jZUlEXyA9IGlkcy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk7Ci0gICAgc2V0SXNFeGlzdGluZ1NlcnZlcihpZHMuZ2V0U2VydmVySW5zdGFuY2VJZCgpICE9IG51bGwpOwotICAgIHNlcnZlckxhYmVsc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZXhpc3RpbmdTZXJ2ZXJzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotCS8vIHJza3JlZwotICAgIC8vd3NjdFJlZ2lzdHJ5ID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIC8vd3NzcnRSZWdpc3RyeSA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JLy8gcnNrcmVnCi0gICAgdGhpcy5qMmVlVmVyc2lvbiA9IGoyZWVWZXJzaW9uOwotICB9Ci0KLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFR5cGVSdW50aW1lU2VydmVyKCkgewotICAgIFR5cGVSdW50aW1lU2VydmVyIGlkcyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotCi0gICAgaWRzLnNldFR5cGVJZCh0eXBlSWRfKTsKLSAgICBpZiAoc2VsZWN0ZWRSdW50aW1lXyAhPSBudWxsKQotICAgICAgaWRzLnNldFJ1bnRpbWVJZChzZWxlY3RlZFJ1bnRpbWVfLmdldElkKCkpOwotICAgIAotICAgIGlmKCBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPT0gbnVsbCApCi0gICAgewotICAgICAgaWRzLnNldFNlcnZlcklkKCBkZWZhdWx0U2VydmVyXyApOwotICAgICAgaWRzLnNldFNlcnZlckluc3RhbmNlSWQoIHNlcnZlckluc3RhbmNlSURfICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZHMuc2V0U2VydmVySWQoc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfKTsKLQotICAgICAgaWYgKGlzRXhpc3RpbmdTZXJ2ZXJfICYmIHNlbGVjdGVkU2VydmVyXyAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgaWRzLnNldFNlcnZlckluc3RhbmNlSWQoc2VsZWN0ZWRTZXJ2ZXJfLmdldElkKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaWRzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbigpIHsKLSAgICByZXR1cm4gajJlZVZlcnNpb247Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZ2V0SXNFeGlzdGluZ1NlcnZlcigpIHsKLSAgICByZXR1cm4gaXNFeGlzdGluZ1NlcnZlcl87Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0SXNFeGlzdGluZ1NlcnZlcihib29sZWFuIGlzRXhpc3RpbmcpIHsKLSAgICBpc0V4aXN0aW5nU2VydmVyXyA9IGlzRXhpc3Rpbmc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIHBhcmVudC5nZXRTaGVsbCgpLnBhY2soKTsKLSAgICByZXR1cm4gY29tcDsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIHZhbGlkYXRlT25fID0gZmFsc2U7Ci0gICAgdGhpc1NoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgaWYgKHRoaXNTaGVsbCA9PSBudWxsKSB7Ci0gICAgICB0aGlzU2hlbGwgPSBjcmVhdGVTaGVsbCgpOwotICAgIH0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIEdyaWRMYXlvdXQgZ2w7Ci0gICAgR3JpZERhdGEgZ2Q7Ci0gICAgLy8gV2luZG93IHRpdGxlCi0gICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkKLSAgICAgIHRoaXNTaGVsbC5zZXRUZXh0KGdldE1lc3NhZ2UoIiVQQUdFX1RJVExFX1dTX1JVTlRJTUVfU0VMRUNUSU9OIikpOwotICAgIGVsc2UKLSAgICAgIHRoaXNTaGVsbC5zZXRUZXh0KGdldE1lc3NhZ2UoIiVQQUdFX1RJVExFX1dTX0NMSUVOVF9SVU5USU1FX1NFTEVDVElPTiIpKTsKLSAgICAKLSAgICBJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0gICAgCi0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHRoaXNTaGVsbCwgSU5GT1BPUF9QV1JTX0RJQUxPRyk7Ci0gICAgLy8gRGlhbG9nIGRlc2NyaXB0aW9uIGJhbm5lcgotICAgIG1lc3NhZ2VCYW5uZXJfID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotICAgIG1lc3NhZ2VCYW5uZXJfLnNldFRleHQoZ2V0TWVzc2FnZSgiJVBBR0VfREVTQ19XU19SVU5USU1FX1NFTEVDVElPTiIpICsgIlxuIiArICIgICAgICAiKTsgLy8gcmVzZXJ2ZXMgYSBzZWNvbmQgbGluZSBmb3IgbWVzc2FnZSBkaXNwbGF5Ci0gICAgbWVzc2FnZUJhbm5lcl8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVBBR0VfREVTQ19XU19SVU5USU1FX1NFTEVDVElPTiIpKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIG1lc3NhZ2VCYW5uZXJfLnNldExheW91dERhdGEoZ2QpOwotICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkhPUklaT05UQUwpOwotICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0gICAgLy8gU2VsZWN0aW9uCi0gICAgdGhpc1NoZWxsLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BXUlNfUEFHRSIpKTsKLSAgICB2aWV3U2VsZWN0aW9uR3JvdXBfID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICB2aWV3U2VsZWN0aW9uR3JvdXBfLnNldExheW91dChnbCk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICB2aWV3U2VsZWN0aW9uR3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIGlmIChzZWxlY3Rpb25Nb2RlXyA9PSBNT0RFX1NFUlZJQ0UpCi0gICAgICB2aWV3U2VsZWN0aW9uR3JvdXBfLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1NFTEVDVElPTl9WSUVXX1RJVExFIikpOwotICAgIGVsc2UKLSAgICAgIHZpZXdTZWxlY3Rpb25Hcm91cF8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfQ0xJRU5UX1NFTEVDVElPTl9WSUVXX1RJVExFIikpOwotICAgIHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8gPSBuZXcgQnV0dG9uKHZpZXdTZWxlY3Rpb25Hcm91cF8sIFNXVC5SQURJTyk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9TRUxFQ1RJT05fVklFV19TRVJWRVIiKSk7Ci0gICAgdmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXy5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BXUlNfUkFESU9fU0VSVkVSIikpOwotICAgIHZpZXdTZWxlY3Rpb25CeVNlcnZlckJ1dHRvbl8uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh2aWV3U2VsZWN0aW9uQnlTZXJ2ZXJCdXR0b25fLCBJTkZPUE9QX1BXUlNfUkFESU9fU0VSVkVSKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlSdW50aW1lQnV0dG9uXyA9IG5ldyBCdXR0b24odmlld1NlbGVjdGlvbkdyb3VwXywgU1dULlJBRElPKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlSdW50aW1lQnV0dG9uXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9TRUxFQ1RJT05fVklFV19SVU5USU1FIikpOwotICAgIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHZpZXdTZWxlY3Rpb25CeVJ1bnRpbWVCdXR0b25fLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BXUlNfUkFESU9fUlVOVElNRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodmlld1NlbGVjdGlvbkJ5UnVudGltZUJ1dHRvbl8sIElORk9QT1BfUFdSU19SQURJT19SVU5USU1FKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXyA9IG5ldyBCdXR0b24odmlld1NlbGVjdGlvbkdyb3VwXywgU1dULlJBRElPKTsKLSAgICB2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9TRUxFQ1RJT05fVklFV19FWFBMT1JFIikpOwotICAgIHZpZXdTZWxlY3Rpb25CeUV4cGxvcmVCdXR0b25fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHZpZXdTZWxlY3Rpb25CeUV4cGxvcmVCdXR0b25fLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BXUlNfUkFESU9fRVhQTE9SRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodmlld1NlbGVjdGlvbkJ5RXhwbG9yZUJ1dHRvbl8sIElORk9QT1BfUFdSU19SQURJT19FWFBMT1JFKTsKLSAgICBwcmltYXJ5R3JvdXBfID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIHJ1bnRpbWVzR3JvdXBfID0gbmV3IEdyb3VwKHByaW1hcnlHcm91cF8sIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgcnVudGltZXNHcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHJ1bnRpbWVzR3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIHJ1bnRpbWVzR3JvdXBfLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1JVTlRJTUVTX0xJU1QiKSk7Ci0gICAgcnVudGltZXNMaXN0XyA9IG5ldyBUcmVlKHJ1bnRpbWVzR3JvdXBfLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBydW50aW1lc0xpc3RfLnNldExheW91dERhdGEoZ2QpOwotICAgIHJ1bnRpbWVzTGlzdF8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgcnVudGltZXNMaXN0Xy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QV1JTX0xJU1RfUlVOVElNRVMiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHJ1bnRpbWVzTGlzdF8sIElORk9QT1BfUFdSU19MSVNUX1JVTlRJTUVTKTsKLSAgICAvLyAgU2VydmVyIGxhYmVscyBjb250cm9sCi0gICAgc2VydmVyc0dyb3VwXyA9IG5ldyBHcm91cChwcmltYXJ5R3JvdXBfLCBTV1QuTk9ORSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHNlcnZlcnNHcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHNlcnZlcnNHcm91cF8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgc2VydmVyc0dyb3VwXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9TRVJWRVJTX0xJU1QiKSk7Ci0gICAgc2VydmVyTGlzdF8gPSBuZXcgVHJlZShzZXJ2ZXJzR3JvdXBfLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgc2VydmVyTGlzdF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotICAgIHNlcnZlckxpc3RfLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHNlcnZlckxpc3RfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BXUlNfTElTVF9TRVJWRVJTIikpOwotICAgIFNlcnZlcnNMaXN0IHNlcnZlckxpc3QgPSBuZXcgU2VydmVyc0xpc3QoKTsKLSAgICBzZXJ2ZXJMaXN0LnNldFNlcnZlclRyZWVJdGVtcyhzZXJ2ZXJMaXN0Xyk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHNlcnZlckxpc3RfLCBJTkZPUE9QX1BXUlNfTElTVF9TRVJWRVJTKTsKLSAgICBzZXRSdW50aW1lc0dyb3VwKCk7Ci0gICAgLy8gSjJFRSB2ZXJzaW9uCi0gICAgQ29tcG9zaXRlIGoyZWVWZXJzaW9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICBqMmVlVmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIGoyZWVWZXJzaW9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotICAgIExhYmVsIGoyZWVWZXJzaW9uTGFiZWwgPSBuZXcgTGFiZWwoajJlZVZlcnNpb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBqMmVlVmVyc2lvbkxhYmVsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0oyRUVfVkVSU0lPTiIpKTsKLSAgICBqMmVlVmVyc2lvbkNvbWJvID0gbmV3IENvbWJvKGoyZWVWZXJzaW9uQ29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgajJlZVZlcnNpb25Db21iby5zZXRMYXlvdXQoZ2wpOwotICAgIGoyZWVWZXJzaW9uQ29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgajJlZVZlcnNpb25Db21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLSAgICBqMmVlVmVyc2lvbkNvbWJvLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BXUlNfSjJFRV9WRVJTSU9OIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscChqMmVlVmVyc2lvbkNvbWJvLCBJTkZPUE9QX1BXUlNfSjJFRV9WRVJTSU9OKTsKLSAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotICAgIG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5IT1JJWk9OVEFMKTsKLSAgICB2YWxpZGF0ZU9uXyA9IHRydWU7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0gICAgc2V0SjJFRVZlcnNpb25zKCk7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRKMkVFVmVyc2lvbnMoKSB7Ci0gICAgajJlZVZlcnNpb25Db21iby5zZXRFbmFibGVkKHRydWUpOwotICAgIGoyZWVWZXJzaW9uQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgU3RyaW5nW10gdmVyc2lvbnMgPSBudWxsOwotCS8vIHJza3JlZwotICAgIC8vaWYgKHNlbGVjdGVkUnVudGltZV8gIT0gbnVsbCkKLSAgICAgIC8vdmVyc2lvbnMgPSBzZWxlY3RlZFJ1bnRpbWVfLmdldEoyRUVWZXJzaW9ucygpOwotICAgIGlmIChzZWxlY3RlZFJ1bnRpbWVfICE9IG51bGwpCi0JICAgICAgdmVyc2lvbnMgPSBzZWxlY3RlZFJ1bnRpbWVfLmdldEoyZWVMZXZlbHMoKTsKLQkvLyByc2tyZWcJCi0gICAgaWYgKHZlcnNpb25zICE9IG51bGwpIHsKLSAgICAgIC8vajJlZVZlcnNpb25Db21iby5zZXRJdGVtcyh2ZXJzaW9ucyk7Ci0gICAgICBzZXRKMkVFQ29tYm9JdGVtcyh2ZXJzaW9ucyk7Ci0gICAgICBqMmVlVmVyc2lvbkNvbWJvLnNlbGVjdCgwKTsKLSAgICAgIGlmIChqMmVlVmVyc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgIGludCBpID0gajJlZVZlcnNpb25Db21iby5pbmRleE9mKEoyRUVVdGlscy5nZXRMYWJlbEZyb21KMkVFVmVyc2lvbihqMmVlVmVyc2lvbikpOwotICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgajJlZVZlcnNpb25Db21iby5zZWxlY3QoaSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGoyZWVWZXJzaW9uQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0SjJFRUNvbWJvSXRlbXMoU3RyaW5nW10gdmVyc2lvbnMpCi0gIHsKLSAgICBTdHJpbmdbXSBqMmVlTGFiZWxzID0gbmV3IFN0cmluZ1t2ZXJzaW9ucy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVyc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKHZlcnNpb25zW2ldKTsKLSAgICAgIGlmIChsYWJlbCAhPSBudWxsICYmIGxhYmVsLmxlbmd0aCgpID4wKQotICAgICAgICBqMmVlTGFiZWxzW2ldID0gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKHZlcnNpb25zW2ldKTsKLSAgICAgIGVsc2UKLSAgICAgICAgajJlZUxhYmVsc1tpXSA9IGdldE1lc3NhZ2UoIiVMQUJFTF9OQSIpOyAKLSAgICB9Ci0gICAgajJlZVZlcnNpb25Db21iby5zZXRJdGVtcyhqMmVlTGFiZWxzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRKMkVFVmVyc2lvbkJhc2VkT25TZXJ2ZXIoKQotICB7Ci0gICAgLy9HZXQgdGhlIGxpc3Qgb2YgSjJFRSB2ZXJzaW9ucwotICAgIFN0cmluZ1tdIHZlcnNpb25zID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0ZWRSdW50aW1lXyA9PSBudWxsIHx8IHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXz09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAKLQkvLyByc2tyZWcKLSAgICAvL3ZlcnNpb25zID0gc2VsZWN0ZWRSdW50aW1lXy5nZXRKMkVFVmVyc2lvbnMoKTsKLQl2ZXJzaW9ucyA9IHNlbGVjdGVkUnVudGltZV8uZ2V0SjJlZUxldmVscygpOwotCS8vIHJza3JlZwotICAgIGlmICh2ZXJzaW9ucz09bnVsbCkKLSAgICAgIHJldHVybjsKLSAgICAKLSAgICAvL1BpY2sgdGhlIGZpcnN0IHZlcnNpb24gdGhhdCB0aGUgc2VsZWN0ZWQgc2VydmVyIHN1cHBvcnRzCi0gICAgZm9yIChpbnQgaT0wOyBpPHZlcnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpc1NlcnZlclZhbGlkKHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXywgdmVyc2lvbnNbaV0pKQotICAgICAgewotICAgICAgICAvL1NldCB0aGUgajJlZSBsZXZlbCB0byB0aGlzIHZlcnNpb24KLSAgICAgICAgU3RyaW5nIGxhYmVsID0gSjJFRVV0aWxzLmdldExhYmVsRnJvbUoyRUVWZXJzaW9uKHZlcnNpb25zW2ldKTsKLSAgICAgICAgajJlZVZlcnNpb25Db21iby5zZXRUZXh0KGxhYmVsKTsKLSAgICAgICAgc2V0SjJFRVZlcnNpb25Gcm9tSjJFRVZlcnNpb25Db21ibygpOwotICAgICAgfQotICAgIH0gICAgICAKLSAgfQotCi0gIAotICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2ZXJWYWxpZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgICBTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgICBpZiAoc3RKMkVFVmVyc2lvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZCk7Ci0gICAgaWYgKHNlcnZlclR5cGUhPW51bGwpCi0gICAgewotICAgICAgSVJ1bnRpbWVUeXBlIHNlcnZlclJ1bnRpbWUgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCk7Ci0gICAgICBJTW9kdWxlVHlwZVtdIG1UeXBlcyA9IHNlcnZlclJ1bnRpbWUuZ2V0TW9kdWxlVHlwZXMoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxtVHlwZXMubGVuZ3RoOyBpKyspICAgICAgCi0gICAgICB7Ci0gICAgICAgIElNb2R1bGVUeXBlIG1UeXBlID0gbVR5cGVzW2ldOwotICAgICAgICBTdHJpbmcgdHlwZSA9IG1UeXBlLmdldElkKCk7Ci0gICAgICAgIFN0cmluZyBtb2R1bGVWZXJzaW9uID0gbVR5cGUuZ2V0VmVyc2lvbigpOwotICAgICAgICBpZiAodHlwZS5lcXVhbHMoSVNlcnZlclRhcmdldENvbnN0YW50cy5XRUJfVFlQRSkgJiYgbW9kdWxlVmVyc2lvbi5lcXVhbHMoc3RKMkVFVmVyc2lvbikpCi0gICAgICAgIHsKLSAgICAgICAgICAvL0ZvdW5kIGEgbWF0Y2gsIHJldHVybiB0cnVlIQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vbm8gbWF0Y2ggZm91bmQgb3IgdGhlIHNlcnZlciB0eXBlIHdhcyBudWxsLiBSZXR1cm4gZmFsc2UuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uKCkgewotICAgIC8vIENoZWNrIGlmIHRoZSBleHRlbnNpb24gZXhpc3RzCi0gICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkgewotICAgICAgaWYgKHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyE9bnVsbCAmJiBzZWxlY3RlZFJ1bnRpbWVfIT1udWxsKSB7Ci0JCSAgLy8gcnNrcmVnCi0gICAgICAvL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSB3c3NydCA9IHdzc3J0UmVnaXN0cnkuZ2V0V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlKHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXywgc2VsZWN0ZWRSdW50aW1lXy5nZXRJZCgpLCB0eXBlSWRfKTsKLQkJICAvLyByc2tyZWcKLSAgICAgIC8vIHJtIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSB3c3NydCA9Ci0gICAgICAvLyB3c3NydFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZShzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8sCi0gICAgICAvLyBzZWxlY3RlZFJ1bnRpbWVfLmdldElkKCksIHdzZS5nZXRXZWJTZXJ2aWNlVHlwZSgpKTsKLSAgICAgIC8vIHJtIGlmICh3c3NydCE9bnVsbCAmJgotICAgICAgLy8gd3NzcnRSZWdpc3RyeS5pc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUod3NlLmdldFdlYlNlcnZpY2VUeXBlKCksc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfKSkKLSAgICAgIC8vIHsKLQkJICAKLQkJICAvL3Jza3JlZwotICAgICAgYm9vbGVhbiB3c3NydFN1cHBvcnRlZCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuaXNTZXJ2ZXJSdW50aW1lVHlwZVN1cHBvcnRlZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8sc2VsZWN0ZWRSdW50aW1lXy5nZXRJZCgpLHR5cGVJZF8pOwkJICAKLSAgICAgIC8vaWYgKHdzc3J0ICE9IG51bGwgJiYgd3NzcnRSZWdpc3RyeS5pc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUodHlwZUlkXywgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfKSkgewotICAgICAgICAvL3NldE9LU3RhdHVzTWVzc2FnZSgpOwotICAgICAgLy99Ci0JICAKLSAgICAgIGlmICh3c3NydFN1cHBvcnRlZCAmJiBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmlzU2VydmVyU3VwcG9ydGVkRm9yQ2hvc2VuVHlwZSh0eXBlSWRfLCBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8pKSB7Ci0JICAgICAgICBzZXRPS1N0YXR1c01lc3NhZ2UoKTsKLQkgICAgICB9Ci0JICAvLyByc2tyZWcKLSAgICAgIGVsc2UgewotICAgICAgICBzZXRFUlJPUlN0YXR1c01lc3NhZ2UoIiVNU0dfSU5WQUxJRF9TUlRfU0VMRUNUSU9OUyIpOwotICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8vIHJtIFN0cmluZyBjbGllbnRJZCA9Ci0gICAgICAvLyB3c2N0UmVnaXN0cnkuZ2V0Q2xpZW50VHlwZUlkQnlOYW1lKGNsaWVudFNjZW5hcmlvSWRfKTsKLSAgICAgIFN0cmluZyBjbGllbnRJZCA9IHR5cGVJZF87Ci0gICAgICAvLyBybSBTdHJpbmcgY2xpZW50SWQgPQotICAgICAgLy8gd3NjdFJlZ2lzdHJ5LmdldENsaWVudFR5cGVJZEJ5TmFtZSh3c2UuZ2V0UHJveHlTZWxlY3RlZCgpKTsKLQkgIC8vIHJza3JlZwotCSAgCi0gICAgICAvL1dlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gd3NjdFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8pOwotCi0gICAgICAvL2lmICh3c3MgPT0gbnVsbCB8fCBzZWxlY3RlZFJ1bnRpbWVfID09IG51bGwgfHwgIXdzY3RSZWdpc3RyeS53ZWJTZXJ2aWNlQ2xpZW50UnVudGltZVR5cGVFeGlzdHMod3NzLmdldElkKCksIHNlbGVjdGVkUnVudGltZV8uZ2V0SWQoKSwgY2xpZW50SWQpKSB7Ci0gICAgICAgIC8vc2V0RVJST1JTdGF0dXNNZXNzYWdlKCIlTVNHX0lOVkFMSURfU1JUX1NFTEVDVElPTlMiKTsKLSAgICAgIC8vfQotICAgICAgaWYgKHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXz09bnVsbCB8fCBzZWxlY3RlZFJ1bnRpbWVfID09IG51bGwgfHwgIVdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMud2ViU2VydmljZUNsaWVudFJ1bnRpbWVUeXBlRXhpc3RzKHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXywgc2VsZWN0ZWRSdW50aW1lXy5nZXRJZCgpLCBjbGllbnRJZCkpIHsKLQkgICAgICAgIHNldEVSUk9SU3RhdHVzTWVzc2FnZSgiJU1TR19JTlZBTElEX1NSVF9TRUxFQ1RJT05TIik7Ci0JICB9CSAgCi0JICAvLyByc2tyZWcKLSAgICAgIGVsc2UgewotICAgICAgICBzZXRPS1N0YXR1c01lc3NhZ2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gRGlzYWJsZSBPSyBidXR0b24gaWYgdGhlIHJ1bnRpbWUgc2VsZWN0aW9uIGlzIGludmFsaWQKLSAgICBUcmVlSXRlbVtdIHJ1bnRpbWVTZWwgPSBydW50aW1lc0xpc3RfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChydW50aW1lU2VsID09IG51bGwgfHwgcnVudGltZVNlbC5sZW5ndGggPD0gMCB8fCBydW50aW1lU2VsWzBdLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICBkaXNhYmxlT0tCdXR0b24oKTsKLSAgICB9Ci0gICAgLy8gRGlzYWJsZSBPSyBidXR0b24gaWYgc2VydmVyIHNlbGVjdGlvbiBpcyBpbnZhbGlkCi0gICAgVHJlZUl0ZW1bXSBzZXJ2ZXJTZWwgPSBzZXJ2ZXJMaXN0Xy5nZXRTZWxlY3Rpb24oKTsKLSAgICBTdHJpbmcgY3VycmVudFNlbGVjdGlvbiA9IChzZXJ2ZXJTZWwgIT0gbnVsbCAmJiBzZXJ2ZXJTZWwubGVuZ3RoID4gMCkgPyBzZXJ2ZXJTZWxbMF0uZ2V0VGV4dCgpIDogIiI7Ci0gICAgaWYgKHNlcnZlclNlbCA9PSBudWxsIHx8IGN1cnJlbnRTZWxlY3Rpb24ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgZGlzYWJsZU9LQnV0dG9uKCk7Ci0gICAgfQotICAgIGlmICghc2VydmVyTGFiZWxzXy5jb250YWluc0tleShjdXJyZW50U2VsZWN0aW9uKSB8fCAhZXhpc3RpbmdTZXJ2ZXJzVGFibGVfLmNvbnRhaW5zS2V5KGN1cnJlbnRTZWxlY3Rpb24pKSB7Ci0gICAgICBkaXNhYmxlT0tCdXR0b24oKTsKLSAgICAgIHNldE9LU3RhdHVzTWVzc2FnZSgpOwotICAgIH0KLSAgICAvLyBEaXNhYmxlIE9LIGJ1dHRvbiBpZiBjYXRlZ29yeSBpcyBzZWxlY3RlZCByYXRoZXIgdGhhbiBhIHNlcnZlcgotICAgIGlmIChzZXJ2ZXJTZWwubGVuZ3RoID4gMCAmJiBzZXJ2ZXJTZWxbMF0uZ2V0SXRlbUNvdW50KCkhPTApIHsKLSAgICAJZGlzYWJsZU9LQnV0dG9uKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgIAllbmFibGVPS0J1dHRvbigpOwotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRPS1N0YXR1c01lc3NhZ2UoKSB7Ci0gICAgbWVzc2FnZUJhbm5lcl8uc2V0VGV4dChnZXRNZXNzYWdlKCIlUEFHRV9ERVNDX1dTX1JVTlRJTUVfU0VMRUNUSU9OIikpOwotICAgIENvbG9yIGJsYWNrID0gbmV3IENvbG9yKHRoaXNTaGVsbC5nZXREaXNwbGF5KCksIDB4MDAsIDAsIDApOwotICAgIG1lc3NhZ2VCYW5uZXJfLnNldEZvcmVncm91bmQoYmxhY2spOwotICAgIGVuYWJsZU9LQnV0dG9uKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0RVJST1JTdGF0dXNNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZUJhbm5lcl8uc2V0VGV4dChnZXRNZXNzYWdlKG1lc3NhZ2UpKTsKLSAgICBDb2xvciByZWQgPSBuZXcgQ29sb3IodGhpc1NoZWxsLmdldERpc3BsYXkoKSwgMHhGRiwgMCwgMCk7Ci0gICAgbWVzc2FnZUJhbm5lcl8uc2V0Rm9yZWdyb3VuZChyZWQpOwotICAgIGRpc2FibGVPS0J1dHRvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRpc2FibGVPS0J1dHRvbigpIHsKLSAgICBpZiAoZ2V0QnV0dG9uKDApICE9IG51bGwpCi0gICAgICBnZXRCdXR0b24oMCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlT0tCdXR0b24oKSB7Ci0gICAgaWYgKGdldEJ1dHRvbigwKSAhPSBudWxsKQotICAgICAgZ2V0QnV0dG9uKDApLnNldEVuYWJsZWQodHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0gICAgc2V0SjJFRVZlcnNpb25Gcm9tSjJFRVZlcnNpb25Db21ibygpOwotICAgIC8vajJlZVZlcnNpb24gPSAoajJlZVZlcnNpb25Db21iby5nZXRFbmFibGVkKCkpID8gajJlZVZlcnNpb25Db21iby5nZXRUZXh0KCkgOiBudWxsOwotICAgIHNldFJldHVybkNvZGUoT0spOwotICAgIGNsb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0SjJFRVZlcnNpb25Gcm9tSjJFRVZlcnNpb25Db21ibygpCi0gIHsKLSAgICBpZiAoajJlZVZlcnNpb25Db21iby5nZXRFbmFibGVkKCkpCi0gICAgewotICAgICAgU3RyaW5nIGoyZWVMYWJlbCA9IGoyZWVWZXJzaW9uQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgU3RyaW5nIGoyZWVWZXJzaW9uU3RyaW5nID0gSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uRnJvbUxhYmVsKGoyZWVMYWJlbCk7Ci0gICAgICBpZiAoajJlZVZlcnNpb25TdHJpbmcgIT0gbnVsbCAmJiBqMmVlVmVyc2lvblN0cmluZy5sZW5ndGgoKSA+IDApCi0gICAgICAgIGoyZWVWZXJzaW9uID0gajJlZVZlcnNpb25TdHJpbmc7Ci0gICAgICBlbHNlCi0gICAgICAgIGoyZWVWZXJzaW9uID0gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgajJlZVZlcnNpb24gPSBudWxsOyAgICAKLSAgfQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYW4gZXZlbnQgb2NjdXJzIG9uIHRoZSBwYWdlLiBIYW5kbGVzIHRoZSBldmVudCBhbmQgcmV2YWxpZGF0ZXMgdGhlIHBhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gZXZlbnQKLSAgICogICAgICAgICAgVGhlIGV2ZW50IHRoYXQgb2NjdXJlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0gICAgaWYgKCF2YWxpZGF0ZU9uXykKLSAgICAgIHJldHVybjsKLSAgICBlbmFibGVPS0J1dHRvbigpOwotICAgIGlmICh2aWV3U2VsZWN0aW9uQnlSdW50aW1lQnV0dG9uXyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIGhhbmRsZVJ1bnRpbWVWaWV3U2VsZWN0aW9uRXZlbnQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAodmlld1NlbGVjdGlvbkJ5U2VydmVyQnV0dG9uXyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIGhhbmRsZVNlcnZlclZpZXdTZWxlY3Rpb25FdmVudCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmICh2aWV3U2VsZWN0aW9uQnlFeHBsb3JlQnV0dG9uXyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIGhhbmRsZUV4cGxvcmVWaWV3U2VsZWN0aW9uRXZlbnQoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoajJlZVZlcnNpb25Db21ibyA9PSBldmVudC53aWRnZXQpIHsKLSAgICAgIHNldEoyRUVWZXJzaW9uRnJvbUoyRUVWZXJzaW9uQ29tYm8oKTsKLSAgICAgIC8vajJlZVZlcnNpb24gPSAoajJlZVZlcnNpb25Db21iby5nZXRFbmFibGVkKCkpID8gajJlZVZlcnNpb25Db21iby5nZXRUZXh0KCkgOiBudWxsOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChydW50aW1lc0xpc3RfID09IGV2ZW50LndpZGdldCkgewotICAgICAgVHJlZUl0ZW1bXSBydW50aW1lU2VsID0gcnVudGltZXNMaXN0Xy5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIHByb2Nlc3NSdW50aW1lTGlzdFNlbGVjdGlvbihydW50aW1lU2VsWzBdLmdldFRleHQoKSk7Ci0gICAgICB2YWxpZGF0ZVNlcnZlclJ1bnRpbWVTZWxlY3Rpb24oKTsKLSAgICAgIHNldEoyRUVWZXJzaW9ucygpOwotICAgICAgc2V0SjJFRVZlcnNpb25CYXNlZE9uU2VydmVyKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlcnZlckxpc3RfID09IGV2ZW50LndpZGdldCkgewotICAgICAgcHJvY2Vzc1NlcnZlckxpc3RTZWxlY3Rpb24oKTsKLSAgICAgIHZhbGlkYXRlU2VydmVyUnVudGltZVNlbGVjdGlvbigpOwotICAgICAgc2V0SjJFRVZlcnNpb25CYXNlZE9uU2VydmVyKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJ1bnRpbWVWaWV3U2VsZWN0aW9uRXZlbnQoKSB7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIHByaW1hcnlHcm91cF8ubGF5b3V0KCk7Ci0KLSAgICAvLyBUT0RPOiBTaG93IGFsbCBydW50aW1lcywgYW5kIG9ubHkgc2VydmVycyBzdXBwb3J0ZWQgYnkgY3VycmVudCB0eXBlIGlkCi0gIH0KLQotICAvLyAKLSAgLy8gQ2FsbGVkIGJ5IGhhbmRsZUV2ZW50KCkgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoZSBsYXlvdXQgdG8gdmlldwotICAvLwotICBwdWJsaWMgdm9pZCBoYW5kbGVTZXJ2ZXJWaWV3U2VsZWN0aW9uRXZlbnQoKSB7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ2wubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgIHByaW1hcnlHcm91cF8uc2V0TGF5b3V0KGdsKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dERhdGEoZ2QpOwotICAgIHByaW1hcnlHcm91cF8ubGF5b3V0KCk7Ci0gICAgc2VydmVyc0dyb3VwXy5zZXRMb2NhdGlvbig1LCA1KTsKLSAgICBydW50aW1lc0dyb3VwXy5zZXRMb2NhdGlvbig0LCAxMDApOwotICAgIHNlcnZlcnNHcm91cF8ubGF5b3V0KCk7Ci0gICAgcnVudGltZXNHcm91cF8ubGF5b3V0KCk7Ci0KLSAgICAvLyBUT0RPOiBTaG93IGFsbCBzZXJ2ZXJzLCBhbmQgb25seSBydW50aW1lcyBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgdHlwZSBpZAotICB9Ci0KLSAgLy8gCi0gIC8vIENhbGxlZCBieSBoYW5kbGVFdmVudCgpIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgbGF5b3V0IHRvIHZpZXcKLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZUV4cGxvcmVWaWV3U2VsZWN0aW9uRXZlbnQoKSB7Ci0gICAgR3JpZExheW91dCBnbDsKLSAgICBnbCA9IChHcmlkTGF5b3V0KSBwcmltYXJ5R3JvdXBfLmdldExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBwcmltYXJ5R3JvdXBfLnNldExheW91dChnbCk7Ci0gICAgcHJpbWFyeUdyb3VwXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBwcmltYXJ5R3JvdXBfLmxheW91dCgpOwotCi0gICAgLy8gVE9ETzogU2hvdyBhbGwgc2VydmVycyBhbmQgcnVudGltZXMgZnJvbSB0aGUgdHlwZSBpZAotCi0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1J1bnRpbWVMaXN0U2VsZWN0aW9uKFN0cmluZyBydW50aW1lTmFtZSkgewotCSAgLy8gcnNrcmVnCi0gICAgaWYgKHNlbGVjdGlvbk1vZGVfID09IE1PREVfU0VSVklDRSkgewotICAgICAgLy9zZWxlY3RlZFJ1bnRpbWVfID0gd3NzcnRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5TGFiZWwocnVudGltZU5hbWUpOwotCQlzZWxlY3RlZFJ1bnRpbWVfID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5TGFiZWwocnVudGltZU5hbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8vc2VsZWN0ZWRSdW50aW1lXyA9IHdzY3RSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5TmFtZShydW50aW1lTmFtZSk7Ci0JCXNlbGVjdGVkUnVudGltZV8gPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lQnlMYWJlbChydW50aW1lTmFtZSk7Ci0gICAgfQotCSAvLyByc2tyZWcKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzU2VydmVyTGlzdFNlbGVjdGlvbigpIHsKLSAgICBTdHJpbmcgY3VycmVudFNlbGVjdGlvbjsKLSAgICBUcmVlSXRlbVtdIHNlcnZlclNlbCA9IHNlcnZlckxpc3RfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZXJ2ZXJTZWwgIT0gbnVsbCAmJiBzZXJ2ZXJTZWwubGVuZ3RoID4gMCkgewotICAgICAgY3VycmVudFNlbGVjdGlvbiA9IHNlcnZlclNlbFswXS5nZXRUZXh0KCk7Ci0gICAgICBpZiAoc2VydmVyTGFiZWxzXy5jb250YWluc0tleShjdXJyZW50U2VsZWN0aW9uKSB8fCBleGlzdGluZ1NlcnZlcnNUYWJsZV8uY29udGFpbnNLZXkoY3VycmVudFNlbGVjdGlvbikpIHsKLSAgICAgICAgaWYgKGV4aXN0aW5nU2VydmVyc1RhYmxlXy5jb250YWluc0tleShjdXJyZW50U2VsZWN0aW9uKSkgewotICAgICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IChJU2VydmVyKSBleGlzdGluZ1NlcnZlcnNUYWJsZV8uZ2V0KGN1cnJlbnRTZWxlY3Rpb24pOwotICAgICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gY3VycmVudFNlbGVjdGlvbjsKLSAgICAgICAgICBzZWxlY3RlZFNlcnZlckZhY3RvcnlJRF8gPSBzZWxlY3RlZFNlcnZlcl8uZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2VydmVyTGFiZWxzXy5jb250YWluc0tleShjdXJyZW50U2VsZWN0aW9uKSkgewotICAgICAgICAgIFRyZWVJdGVtIHBhcmVudEl0ZW0gPSBzZXJ2ZXJTZWxbMF0uZ2V0UGFyZW50SXRlbSgpOwotICAgICAgICAgIGlmIChwYXJlbnRJdGVtICE9IG51bGwgJiYgIXBhcmVudEl0ZW0uZ2V0VGV4dCgpLmVxdWFsc0lnbm9yZUNhc2UoZ2V0TWVzc2FnZSgiJUxBQkVMX1RSRUVfRVhJU1RJTkdfU0VSVkVSUyIpKSkgewotICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJMYWJlbF8gPSBjdXJyZW50U2VsZWN0aW9uOwotICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJfID0gbnVsbDsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyA9IChTdHJpbmcpIHNlcnZlckxhYmVsc18uZ2V0KGN1cnJlbnRTZWxlY3Rpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIGlmIGlzRXhpc3RpbmdTZXJ2ZXIgb3IgbmV3IFNlcnZlclR5cGUKLSAgICAgICAgVHJlZUl0ZW0gcGFyZW50SXRlbSA9IHNlcnZlclNlbFswXS5nZXRQYXJlbnRJdGVtKCk7Ci0gICAgICAgIGlmIChwYXJlbnRJdGVtICE9IG51bGwgJiYgcGFyZW50SXRlbS5nZXRUZXh0KCkuZXF1YWxzSWdub3JlQ2FzZShnZXRNZXNzYWdlKCIlTEFCRUxfVFJFRV9FWElTVElOR19TRVJWRVJTIikpKSB7Ci0gICAgICAgICAgc2V0SXNFeGlzdGluZ1NlcnZlcih0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBzZXRJc0V4aXN0aW5nU2VydmVyKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IG51bGw7Ci0gICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gbnVsbDsKLSAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfID0gbnVsbDsKLSAgICAgICAgc2V0SXNFeGlzdGluZ1NlcnZlcihmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2Uoa2V5KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZShrZXksIGFyZ3MpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldFJ1bnRpbWVzR3JvdXAoKSB7Ci0gICAgcnVudGltZXNMaXN0Xy5yZW1vdmVBbGwoKTsKLSAgICBTdHJpbmdbXSBydW50aW1lcyA9IG51bGw7Ci0KLSAgICBpZiAoc2VsZWN0aW9uTW9kZV8gPT0gTU9ERV9TRVJWSUNFKSB7Ci0JCS8vIHJza3JlZwotICAgICAgLy9ydW50aW1lcyA9IHdzc3J0UmVnaXN0cnkuZ2V0UnVudGltZXNCeVR5cGUodHlwZUlkXyk7Ci0JCXJ1bnRpbWVzID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRSdW50aW1lc0J5VHlwZSh0eXBlSWRfKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvL3J1bnRpbWVzID0gd3NjdFJlZ2lzdHJ5LmdldEFsbENsaWVudFJ1bnRpbWVzKCk7Ci0JICBydW50aW1lcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0QWxsQ2xpZW50UnVudGltZXMoKTsKLQkgIC8vIHJza3JlZwotICAgIH0KLQotICAgIFRyZWVJdGVtW10gcnVudGltZU5hbWUgPSBuZXcgVHJlZUl0ZW1bcnVudGltZXMubGVuZ3RoXTsKLQotICAgIGlmIChydW50aW1lcyAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIFN0cmluZyBydW50aW1lTGFiZWwgPSBnZXRSdW50aW1lTGFiZWwocnVudGltZXNbaV0pOwotICAgICAgICBydW50aW1lTmFtZVtpXSA9IG5ldyBUcmVlSXRlbShydW50aW1lc0xpc3RfLCBTV1QuTk9ORSk7Ci0gICAgICAgIHJ1bnRpbWVOYW1lW2ldLnNldFRleHQocnVudGltZUxhYmVsKTsKLQotICAgICAgICBpZiAocnVudGltZXNbaV0uZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0UnVudGltZV8pKSB7Ci0gICAgICAgICAgcnVudGltZXNMaXN0Xy5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBydW50aW1lTmFtZVtpXX0pOwotICAgICAgICAgIHNlbGVjdGVkUnVudGltZV8gPSBnZXRSdW50aW1lKHJ1bnRpbWVzW2ldKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbChTdHJpbmcgdHlwZSkgewotICAgIHJldHVybiBnZXRSdW50aW1lKHR5cGUpLmdldExhYmVsKCk7Ci0gIH0KLQotICAvLyByc2tyZWcKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlUnVudGltZUluZm8gZ2V0UnVudGltZShTdHJpbmcgdHlwZSkgewotICAgIGlmIChzZWxlY3Rpb25Nb2RlXyA9PSBNT0RFX1NFUlZJQ0UpIHsKLSAgICAgIC8vcmV0dXJuIHdzc3J0UmVnaXN0cnkuZ2V0UnVudGltZUJ5SWQodHlwZSk7Ci0JICByZXR1cm4gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQodHlwZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLy9yZXR1cm4gd3NjdFJlZ2lzdHJ5LmdldFJ1bnRpbWVCeUlkKHR5cGUpOwotCSAgcmV0dXJuIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHR5cGUpOwotICAgIH0KLSAgfQotICAvLyByc2tyZWcKLQotICAvLyBSZXR1cm5zIHRoZSBzZXJ2ZXIgRmFjdG9yeSBJZCBnaXZlbiBhIHNlcnZlciBuYW1lCi0gIHByaXZhdGUgU3RyaW5nIGdldFNlcnZlclNlbGVjdGlvbkZhY3RvcnlJZChTdHJpbmcgc2VsZWN0ZWRTZXJ2ZXJOYW1lKSB7Ci0gICAgaWYgKHNlcnZlckxhYmVsc18uY29udGFpbnNLZXkoc2VsZWN0ZWRTZXJ2ZXJOYW1lKSAmJiAhaXNFeGlzdGluZ1NlcnZlcl8pCi0gICAgICByZXR1cm4gKFN0cmluZykgc2VydmVyTGFiZWxzXy5nZXQoc2VsZWN0ZWRTZXJ2ZXJOYW1lKTsKLSAgICBlbHNlIHsKLSAgICAgIHJldHVybiAoKElTZXJ2ZXIpIGV4aXN0aW5nU2VydmVyc1RhYmxlXy5nZXQoc2VsZWN0ZWRTZXJ2ZXJOYW1lKSkuZ2V0U2VydmVyVHlwZSgpLmdldElkKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKiBTZXJ2ZXJzTGlzdCBjbGFzcwotICAgKiAKLSAgICogQ2xhc3Mgd2hpY2ggZWFzaWx5IGNyZWF0ZXMgdGhlIFRyZWUgc3RydWN0dXJlIGFuZCBlbnRyaWVzIGZvciBleGlzdGluZyBzZXJ2ZXJzIGFuZCBzZXJ2ZXIgdHlwZXMKLSAgICovCi0gIHB1YmxpYyBjbGFzcyBTZXJ2ZXJzTGlzdCB7Ci0KLSAgICBwcml2YXRlIFRyZWVJdGVtW10gZXhpc3RpbmdTZXJ2ZXJzVHJlZTsKLSAgICBwcml2YXRlIFRyZWVJdGVtW10gc2VydmVyVHlwZXNUcmVlOwotICAgIGJvb2xlYW4gZXhpc3RpbmdTZXJ2ZXIgPSBmYWxzZTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclRyZWVJdGVtcyhUcmVlIHNlcnZlcnNMaXN0KSB7Ci0gICAgICB0aGlzLnNldEV4aXN0aW5nU2VydmVyc1RyZWUoc2VydmVyc0xpc3QpOwotICAgICAgdGhpcy5zZXRTZXJ2ZXJUeXBlc1RyZWUoc2VydmVyc0xpc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyc1RyZWUoVHJlZSBzZXJ2ZXJMaXN0KSB7Ci0gICAgICBTdHJpbmdbXSBzZXJ2ZXJJZHMgPSB0aGlzLmdldEFsbEV4aXN0aW5nU2VydmVycygpOwotICAgICAgZXhpc3RpbmdTZXJ2ZXJzVHJlZSA9IG5ldyBUcmVlSXRlbVsxXTsKLSAgICAgIFRyZWVJdGVtW10gZXhpc3RpbmdTZXJ2ZXJJdGVtcyA9IG5ldyBUcmVlSXRlbVtzZXJ2ZXJJZHMubGVuZ3RoXTsKLSAgICAgIGV4aXN0aW5nU2VydmVyc1RyZWVbMF0gPSBuZXcgVHJlZUl0ZW0oc2VydmVyTGlzdCwgU1dULk5PTkUpOwotICAgICAgZXhpc3RpbmdTZXJ2ZXJzVHJlZVswXS5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9UUkVFX0VYSVNUSU5HX1NFUlZFUlMiKSk7Ci0gICAgICBJbWFnZURlc2NyaXB0b3IgaWQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoRVhJU1RJTkdfU0VSVkVSU19JQ09OKTsKLSAgICAgIGlmIChpZCAhPSBudWxsKQotICAgICAgICBleGlzdGluZ1NlcnZlcnNUcmVlWzBdLnNldEltYWdlKGlkLmNyZWF0ZUltYWdlKCkpOwotICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBzZXJ2ZXJJZHMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoKChJU2VydmVyKSBleGlzdGluZ1NlcnZlcnNUYWJsZV8uZ2V0KHNlcnZlcklkc1trXSkpLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAgICAgaWYgKHNlcnZlclR5cGUgIT0gbnVsbCkgewotICAgICAgICAgIGV4aXN0aW5nU2VydmVySXRlbXNba10gPSBuZXcgVHJlZUl0ZW0oZXhpc3RpbmdTZXJ2ZXJzVHJlZVswXSwgU1dULk5PTkUpOwotICAgICAgICAgIGV4aXN0aW5nU2VydmVySXRlbXNba10uc2V0VGV4dChzZXJ2ZXJJZHNba10pOwotICAgICAgICAgIGlmIChzZXJ2ZXJJZHNba10uZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0U2VydmVyXykgJiYgZ2V0SXNFeGlzdGluZ1NlcnZlcigpKSB7Ci0gICAgICAgICAgICBleGlzdGluZ1NlcnZlcnNUcmVlWzBdLnNldEV4cGFuZGVkKHRydWUpOwotICAgICAgICAgICAgc2VydmVyTGlzdC5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBleGlzdGluZ1NlcnZlckl0ZW1zW2tdfSk7Ci0gICAgICAgICAgICBleGlzdGluZ1NlcnZlciA9IHRydWU7Ci0gICAgICAgICAgICBSdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLnRoaXMuc2V0SXNFeGlzdGluZ1NlcnZlcih0cnVlKTsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyXyA9IChJU2VydmVyKSBleGlzdGluZ1NlcnZlcnNUYWJsZV8uZ2V0KGRlZmF1bHRTZXJ2ZXJfKTsKLSAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyTGFiZWxfID0gc2VydmVySWRzW2tdOwotICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJGYWN0b3J5SURfID0gc2VsZWN0ZWRTZXJ2ZXJfLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBleGlzdGluZ1NlcnZlckl0ZW1zW2tdLnNldEltYWdlKFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2Uoc2VydmVyVHlwZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmVyVHlwZXNUcmVlKFRyZWUgc2VydmVyTGlzdCkgewotCi0gICAgICBUcmVlSXRlbVtdIHNlcnZlclR5cGVzVHJlZSA9IG5ldyBUcmVlSXRlbVsxXTsKLSAgICAgIHNlcnZlclR5cGVzVHJlZVswXSA9IG5ldyBUcmVlSXRlbShzZXJ2ZXJMaXN0LCBTV1QuTk9ORSk7Ci0gICAgICBzZXJ2ZXJUeXBlc1RyZWVbMF0uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfVFJFRV9TRVJWRVJfVFlQRVMiKSk7Ci0gICAgICBJbWFnZURlc2NyaXB0b3IgaWQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoU0VSVkVSX1RZUEVTX0lDT04pOwotICAgICAgaWYgKGlkICE9IG51bGwpCi0gICAgICAgIHNlcnZlclR5cGVzVHJlZVswXS5zZXRJbWFnZShpZC5jcmVhdGVJbWFnZSgpKTsKLSAgICAgIEhhc2h0YWJsZSBjYXRlZ29yaWVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIEhhc2h0YWJsZSBjYXRlZ29yeVRyZWVJdGVtID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgU3RyaW5nW10gc2VydmVySWRzID0gbnVsbDsKLSAgICAgIC8vIHJtIFN0cmluZyB3c3QgPSB3c2UuZ2V0V2ViU2VydmljZVR5cGUoKTsKLSAgICAgIGlmIChzZWxlY3Rpb25Nb2RlXyA9PSBNT0RFX1NFUlZJQ0UpIHsKLQkJICAvLyByc2tyZWcKLSAgICAgICAgLy9zZXJ2ZXJJZHMgPSB3c3NydFJlZ2lzdHJ5LmdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUodHlwZUlkXyk7Ci0JCXNlcnZlcklkcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0U2VydmVyRmFjdG9yeUlkc0J5VHlwZSh0eXBlSWRfKTsKLQkJICAvLyByc2tyZWcKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAvL3NlcnZlcklkcyA9IHdzY3RSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlDbGllbnRUeXBlKHR5cGVJZF8pOwotCQkgIC8vIHJza3JlZwotICAgICAgICAvL3NlcnZlcklkcyA9IHdzY3RSZWdpc3RyeS5nZXRBbGxDbGllbnRTZXJ2ZXJGYWN0b3J5SWRzKCk7Ci0JCXNlcnZlcklkcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpOwotCQkvLyByc2tyZWcKLQotICAgICAgfQotICAgICAgLy8gcm0gc2VydmVySWQgPQotICAgICAgLy8gd3NzcnRSZWdpc3RyeS5nZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHdzZS5nZXRXZWJTZXJ2aWNlVHlwZSgpKTsKLSAgICAgIGlmIChzZXJ2ZXJJZHMgPT0gbnVsbCkgewotICAgICAgICBzZXJ2ZXJJZHMgPSBnZXRBbGxTZXJ2ZXJUeXBlcygpOwotICAgICAgfQotICAgICAgVHJlZUl0ZW1bXSBwYXJlbnQgPSBuZXcgVHJlZUl0ZW1bc2VydmVySWRzLmxlbmd0aF07Ci0gICAgICBUcmVlSXRlbVtdIGl0ZW0gPSBuZXcgVHJlZUl0ZW1bc2VydmVySWRzLmxlbmd0aF07Ci0gICAgICBpZiAoc2VydmVySWRzICE9IG51bGwpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBTdHJpbmcgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJMYWJlbEZvcklkKHNlcnZlcklkc1tpXSk7Ci0gICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSdW50aW1lU2VydmVyU2VsZWN0aW9uRGlhbG9nLnRoaXMuc2VydmVyTGFiZWxzXy5wdXQoc2VydmVyLCBzZXJ2ZXJJZHNbaV0pOwotICAgICAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVySWRzW2ldKTsKLSAgICAgICAgICAgIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKTsKLSAgICAgICAgICAgIGlmICghY2F0ZWdvcmllc18uY29udGFpbnNLZXkoc2VydmVyVHlwZSkgJiYgcnVudGltZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICBjYXRlZ29yaWVzXy5wdXQoc2VydmVyVHlwZSwgcnVudGltZVR5cGUpOwotICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlUcmVlSXRlbS5nZXQocnVudGltZVR5cGUpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnlUZXh0ID0gcnVudGltZVR5cGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIEltYWdlIGNhdGVnb3J5SW1hZ2UgPSBTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKHJ1bnRpbWVUeXBlKTsKLSAgICAgICAgICAgICAgICBwYXJlbnRbaV0gPSBuZXcgVHJlZUl0ZW0oc2VydmVyVHlwZXNUcmVlWzBdLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgcGFyZW50W2ldLnNldFRleHQoY2F0ZWdvcnlUZXh0KTsKLSAgICAgICAgICAgICAgICBwYXJlbnRbaV0uc2V0SW1hZ2UoY2F0ZWdvcnlJbWFnZSk7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcnlUcmVlSXRlbS5wdXQocnVudGltZVR5cGUsIHBhcmVudFtpXSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50W2ldID0gKFRyZWVJdGVtKSBjYXRlZ29yeVRyZWVJdGVtLmdldChydW50aW1lVHlwZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlUZXh0ID0gc2VydmVyVHlwZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIEltYWdlIGZhY3RvcnlJbWFnZSA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0SW1hZ2Uoc2VydmVyVHlwZSk7Ci0gICAgICAgICAgICAgIGl0ZW1baV0gPSBuZXcgVHJlZUl0ZW0ocGFyZW50W2ldLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgIGl0ZW1baV0uc2V0VGV4dChmYWN0b3J5VGV4dCk7Ci0gICAgICAgICAgICAgIGl0ZW1baV0uc2V0SW1hZ2UoZmFjdG9yeUltYWdlKTsKLSAgICAgICAgICAgICAgaXRlbVtpXS5zZXREYXRhKHNlcnZlclR5cGUpOwotICAgICAgICAgICAgICBpZiAoZmFjdG9yeVRleHQuZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0U2VydmVyXykgJiYgIWV4aXN0aW5nU2VydmVyKSB7Ci0gICAgICAgICAgICAgICAgc2VydmVyTGlzdC5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBpdGVtW2ldfSk7Ci0gICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2ZXJfID0gbnVsbDsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZFNlcnZlckxhYmVsXyA9IGZhY3RvcnlUZXh0OwotICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VydmVyRmFjdG9yeUlEXyA9IChTdHJpbmcpIHNlcnZlckxhYmVsc18uZ2V0KHNlbGVjdGVkU2VydmVyTGFiZWxfKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBzZXJ2ZXJzIGluIHRoZSB3b3Jrc3BhY2UKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFN0cmluZ1tdIG9mIGV4aXN0aW5nIHNlcnZlciBuYW1lcwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0QWxsRXhpc3RpbmdTZXJ2ZXJzKCkgewotICAgICAgVmVjdG9yIHNlcnZlcklkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHsKLSAgICAgICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICAgICAgaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCE9MCkgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgc2VydmVyc1tpXTsKLSAgICAgICAgICAgIHNlcnZlcklkcy5hZGQoc2VydmVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBleGlzdGluZ1NlcnZlcnNUYWJsZV8ucHV0KHNlcnZlci5nZXROYW1lKCksIHNlcnZlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKFN0cmluZ1tdKSBzZXJ2ZXJJZHMudG9BcnJheShuZXcgU3RyaW5nW3NlcnZlcklkcy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHNlcnZlciB0eXBlcyBhdmFpbGFibGUgZm9yIGNyZWF0aW9uCi0gICAgICogCi0gICAgICogQHJldHVybiBTdHJpbmdbXSBvZiBzZXJ2ZXIgbmFtZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldEFsbFNlcnZlclR5cGVzKCkgewotICAgICAgVmVjdG9yIHNlcnZlclR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIElTZXJ2ZXJUeXBlW10gZGVmYXVsdFNlcnZlcnNMaXN0ID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0U2VydmVyc0xpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IChJU2VydmVyVHlwZSkgZGVmYXVsdFNlcnZlcnNMaXN0W2ldOwotICAgICAgICBzZXJ2ZXJUeXBlc18uYWRkKHNlcnZlclR5cGUuZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKFN0cmluZ1tdKSBzZXJ2ZXJUeXBlc18udG9BcnJheShuZXcgU3RyaW5nW3NlcnZlclR5cGVzXy5zaXplKCldKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMWI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9UeXBlU2VsZWN0aW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi0KLXB1YmxpYyBjbGFzcyBUeXBlU2VsZWN0aW9uRmlsdGVyCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdFNlbGVjdGlvbl87Ci0KLSAgLyoKLSAgICogQGRlcHJlY2F0ZWQgc2hvdWxkIGJlIHJlbW92ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uLCBIYXNoTWFwIHdlYlNlcnZpY2VUeXBlcykKLSAgewotICAgICAgICAKLSAgICBIYXNoU2V0IHN1cHBvcnRlZFR5cGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmIGluaXRpYWxTZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgCi0gICAgICAvLyBDaGVjayBmb3IgbnVsbCBpbml0aWFsIHNlbGVjdGlvbgotICAgICAgT2JqZWN0IGluaXRpYWxPYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGluaXRpYWxPYmplY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICAvLyBNYXRjaCB1cCByZXNvdXJjZSB0eXBlIG1ldGFkYXRhIHdpdGggaW5pdGlhbCBzZWxlY3Rpb24KLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IChJV2ViU2VydmljZVR5cGUpaXRlci5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKXdzdC5nZXRJZCgpOwotICAgICAgICBpZiAoIXN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGVJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdbXSByZXNvdXJjZVR5cGVzID0gd3N0LmdldFJlc291cmNlVHlwZU1ldGFkYXRhKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlc291cmNlVHlwZXNbaV0hPW51bGwpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKChpbml0aWFsT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKS5lbmRzV2l0aChyZXNvdXJjZVR5cGVzW2ldKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFJlc291cmNlRnJvbVNlbGVjdGlvbihpbml0aWFsT2JqZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBuYW1lID0gaW5pdGlhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbml0aWFsT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBleHRlbnNpb25zID0gd3N0LmdldEV4dGVuc2lvbk1ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFjY2VwdHNOYW1lKG5hbWUsIGV4dGVuc2lvbnMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzLmFkZCh0eXBlSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0gICAgCi0gIAotICAgIGlmIChzdXBwb3J0ZWRUeXBlcy5pc0VtcHR5KCkpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIChTdHJpbmdbXSlzdXBwb3J0ZWRUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SW5pdGlhbFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uLCBBcnJheUxpc3Qgd2ViU2VydmljZVR5cGVMaXN0KQotICB7Ci0gICAgICAgIAotICAgIEFycmF5TGlzdCBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmIGluaXRpYWxTZWxlY3Rpb24uc2l6ZSgpID09IDEpCi0gICAgewotICAgICAgCi0gICAgICAvLyBDaGVjayBmb3IgbnVsbCBpbml0aWFsIHNlbGVjdGlvbgotICAgICAgT2JqZWN0IGluaXRpYWxPYmplY3QgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGluaXRpYWxPYmplY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICAvLyBNYXRjaCB1cCByZXNvdXJjZSB0eXBlIG1ldGFkYXRhIHdpdGggaW5pdGlhbCBzZWxlY3Rpb24KLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlVHlwZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHdzdCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBzY2VuYXJpbyA9IHdzdC5zdWJzdHJpbmcoMCx3c3QuaW5kZXhPZigiLyIpKTsKLSAgICAgICAgU3RyaW5nIGltcGxJZCA9IHdzdC5zdWJzdHJpbmcod3N0LmluZGV4T2YoIi8iKSsxKTsgICAgICAgIAotICAgICAgICAvL0lXZWJTZXJ2aWNlVHlwZSB3c3QgPSAoSVdlYlNlcnZpY2VUeXBlKWl0ZXIubmV4dCgpOwotICAgICAgICAvL1N0cmluZyB0eXBlSWQgPSAoU3RyaW5nKXdzdC5nZXRJZCgpOwotICAgICAgICBpZiAoc2NlbmFyaW8uZXF1YWxzKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkpICYmICFzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh3c3QpKQotICAgICAgICB7Ci0KLSAgICAgICAgICAKLSAgICAgICAgICBXZWJTZXJ2aWNlSW1wbCB3c2ltcGwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VJbXBsQnlJZChpbXBsSWQpOwotICAgICAgICAgIFN0cmluZ1tdIHJlc291cmNlVHlwZXMgPSB3c2ltcGwuZ2V0UmVzb3VyY2VUeXBlTWV0YWRhdGEoKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VUeXBlc1tpXSE9bnVsbCkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoKGluaXRpYWxPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLmVuZHNXaXRoKHJlc291cmNlVHlwZXNbaV0pKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKGluaXRpYWxPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbml0aWFsT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCByZXNvdXJjZSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZSA9IGluaXRpYWxPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGV4dGVuc2lvbnMgPSB3c2ltcGwuZ2V0RXh0ZW5zaW9uTWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWNjZXB0c05hbWUobmFtZSwgZXh0ZW5zaW9ucykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkVHlwZXMuYWRkKHdzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICAvL0lmIG5vIHdzSW1wbHMgaGF2ZSBhY2NlcHRlZCB0aGlzIHNlbGVjdGlvbiwgY2hlY2sgaWYgdGhpcyBpcyBXU0RMLiBJZiBpdCBpcywKLSAgICAgIC8vYWRkIHRoZSB0b3AtZG93biBKYXZhIHNlcnZpY2UgdHlwZSB0byB0aGUgbGlzdC4KLSAgICAgIGlmIChzdXBwb3J0ZWRUeXBlcy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIHJlc291cmNlVHlwZXMgPSB7IkZpbGUiLCAiSVJlc291cmNlIiwgIlN0cmluZyIsICJTZXJ2aWNlSW1wbCIsICJTZXJ2aWNlUmVmSW1wbCIsICJXU0RMUmVzb3VyY2VJbXBsIn07Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHJlc291cmNlVHlwZXNbaV0hPW51bGwpCi0gICAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoKGluaXRpYWxPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLmVuZHNXaXRoKHJlc291cmNlVHlwZXNbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0UmVzb3VyY2VGcm9tU2VsZWN0aW9uKGluaXRpYWxPYmplY3QpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGluaXRpYWxPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWUgPSBpbml0aWFsT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFN0cmluZ1tdIGV4dGVuc2lvbnMgPSB7Ii53c2RsIiwgIi53c2lsIiwgIi5odG1sIiwgIi5TZXJ2aWNlSW1wbCIsICIuU2VydmljZVJlZkltcGwiLCAiLldTRExSZXNvdXJjZUltcGwifTsKLSAgICAgICAgICAgICAgaWYgKGFjY2VwdHNOYW1lKG5hbWUsIGV4dGVuc2lvbnMpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVudHJ5YnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSk7Ci0gICAgICAgICAgICAgICAgZW50cnlidWZmLmFwcGVuZCgiLyIpOwotICAgICAgICAgICAgICAgIGVudHJ5YnVmZi5hcHBlbmQoIm9yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuamF2YSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeSA9IGVudHJ5YnVmZi50b1N0cmluZygpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcy5hZGQoZW50cnkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgIH0gICAgCi0gIAotCi0gICAgCi0gICAgaWYgKHN1cHBvcnRlZFR5cGVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICAvL0l0J3Mgbm90IGEgcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbiBhbmQgaXRzIG5vdCBXU0RMIHNvIHJldHVybiBudWxsOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gKFN0cmluZ1tdKXN1cHBvcnRlZFR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotICB9Ci0gIC8vCi0gIC8vIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhY2NlcHRhYmxlIGJhc2VkIHVwb24gaXRzIGV4dGVuc2lvbgotICAvLwotICBwcml2YXRlIGJvb2xlYW4gYWNjZXB0c05hbWUgKCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gZXh0ZW5zaW9ucykKLSAgewotICAgIC8vUmV0dXJuIHRydWUgaWYgImFsbCIgZXh0ZW5zaW9ucyBhcmUgc3VwcG9ydGVkLgotCi0gICAgaWYgKGV4dGVuc2lvbnNbMF0hPW51bGwpCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbMF0uZXF1YWxzKCJhbGwiKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaT0wOyBpPGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0hPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKGV4dGVuc2lvbnNbaV0pKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9UeXBlU2VsZWN0aW9uTWV0YWRhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOThjMTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1R5cGVTZWxlY3Rpb25NZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0gIC8vCi0gIC8vIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHNldCBvZiBkaXN0aW5ndWlzaGluZyBmYWN0b3JzIGluIGRldGVybWluaW5nIAotICAvLyB0aGUgZGVmYXVsdCBXZWIgc2VydmljZSB0eXBlLiAgVGhlIGRlZmF1bHQgV2ViIFNlcnZpY2UgdHlwZSB3aWxsIGJlIGRldGVybWluZWQKLSAgLy8gYnkgcGF0dGVybiBtYXRjaGluZyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gd2l0aCB0aGUgc3VwcG9ydGVkIGV4dGVuc2lvbiAKLSAgLy8gYW5kIHRoZSByZXNvdXJjZSB0eXBlIG1ldGFkYXRhIHNwZWNpZmllZCBpbiB0aGUgbWFuaWZlc3QgZmlsZS4KLSAgLy8KLSAgcHVibGljIGNsYXNzIFR5cGVTZWxlY3Rpb25NZXRhZGF0YQotICB7Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAgcHVibGljIFN0cmluZ1tdIGV4dGVuc2lvbk1ldGE7Ci0gICAgcHVibGljIFN0cmluZ1tdIHJlc291cmNlVHlwZU1ldGE7Ci0KLSAgICBwdWJsaWMgVHlwZVNlbGVjdGlvbk1ldGFkYXRhKFN0cmluZyBleHRlbnNpb25NRCwgU3RyaW5nIHJlc291cmNlVHlwZU1EKQotICAgIHsKLSAgICAgIHNldEV4dGVuc2lvbk1ldGFkYXRhKGV4dGVuc2lvbk1EKTsKLSAgICAgIHNldFJlc291cmNlVHlwZU1ldGFkYXRhKHJlc291cmNlVHlwZU1EKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uTWV0YWRhdGEoU3RyaW5nIGV4dGVuc2lvbk1ldGFkYXRhKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZXh0ZW5zaW9uTWV0YWRhdGEpOwotICAgICAgZXh0ZW5zaW9uTWV0YSA9IG5ldyBTdHJpbmdbc3QuY291bnRUb2tlbnMoKV07Ci0gICAgICBpbnQgaT0wOwotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgZXh0ZW4gPSAoU3RyaW5nKXN0Lm5leHRUb2tlbigpOwotICAgICAgICBpZiAoZXh0ZW4hPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBleHRlbnNpb25NZXRhW2ldPWV4dGVuOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25NZXRhZGF0YSgpCi0gICAgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbk1ldGE7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVHlwZU1ldGFkYXRhKFN0cmluZyByZXNvdXJjZVR5cGVNZXRhZGF0YSkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHJlc291cmNlVHlwZU1ldGFkYXRhKTsKLSAgICAgIHJlc291cmNlVHlwZU1ldGEgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgICAgaW50IGk9MDsKLSAgICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc291cmNlVHlwZSA9IChTdHJpbmcpc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZVR5cGUhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhW2ldPXJlc291cmNlVHlwZTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVzb3VyY2VUeXBlTWV0YTsKLSAgICB9Ci0KLSAgfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGI0ZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzLkNsaWVudFByZURlcGxveUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLkxhYmVsc0FuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5yZWdpc3RyeS5Db21tYW5kUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5IGltcGxlbWVudHMgQ29tbWFuZFJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgVmVjdG9yICBjb25maWdFbGVtc187Ci0gIHByaXZhdGUgSGFzaFNldCB0eXBlTmFtZXNfOyAgLy8gbm8gZHVwbGljYXRlIGNsaWVudCB0eXBlIG5hbWVzCi0gIHByaXZhdGUgSGFzaE1hcCB0eXBlc187Ci0gIHByaXZhdGUgSGFzaE1hcCBjbGllbnRUeXBlQW5kSWRzXzsKLSAgcHJpdmF0ZSBIYXNoTWFwIGNsaWVudElkVG9MYWJlbF87Ci0KLSAgcHJpdmF0ZSBIYXNoTWFwIHdlYlNlcnZpY2VTZXJ2ZXJzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVJ1bnRpbWVzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZUNsaWVudFR5cGVzOwotICAKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnlfOwotICBwcml2YXRlIENhbkZpbmlzaFJlZ2lzdHJ5ICAgY2FuRmluaXNoUmVnaXN0cnlfOwotICBwcml2YXRlIEhhc2hNYXAgICAgICAgICAgICAgZmFjdG9yeUNhY2hlXzsKLSAgICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5KCkKLSAgewotICB9Ci0gIAotICAvLwotICAvLyBMb2FkcyBXZWJTZXJ2aWNlQ2xpZW50VHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gIC8vIGhhbmdpbmcgb24gdGhlIHdlYlNlcnZpY2VDbGllbnRUeXBlIGV4dGVuc2lvbiBwb2ludC4gRXh0ZW5zaW9ucwotICAvLyBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpLndpemFyZC5XZWJTZXJ2aWNlQ2xpZW50VHlwZQotICAvLyBpbnRlcmZhY2UuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkVHlwZXMgKCkKLSAgeyAgICAKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIpOwotCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotCi0gICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlU2VydmVyIikpIHsgCi0gICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gbmV3IFdlYlNlcnZpY2VTZXJ2ZXIoZWxlbSk7Ci0gICAgICAgIHdlYlNlcnZpY2VTZXJ2ZXJzLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3NzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZVJ1bnRpbWUiKSkgewotICAgICAgICBXZWJTZXJ2aWNlUnVudGltZSBydCA9IG5ldyBXZWJTZXJ2aWNlUnVudGltZShlbGVtKTsKLSAgICAgICAgd2ViU2VydmljZVJ1bnRpbWVzLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlQ2xpZW50VHlwZSIpKQotICAgICAgewotCi0gICAgICAgIFN0cmluZyBuYW1lID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOyAgICAgICAgICAgICAgICAKLSAgICAgICAgdHlwZU5hbWVzXy5hZGQoIG5hbWUgKTsgIAotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHR5cGVJZCA9IGVsZW0uZ2V0QXR0cmlidXRlKCJjbGllbnRUeXBlIik7Ci0gICAgICAgIGlmICh0eXBlSWQ9PW51bGwpIHsKLSAgICAgICAgICB0eXBlSWQgPSBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7ICAgICAgIAotICAgICAgICBjbGllbnRUeXBlQW5kSWRzXy5wdXQobmFtZSwgdHlwZUlkKTsKLSAgICAgICAgU3RyaW5nIHNlcnZlcklkID0gZWxlbS5nZXRBdHRyaWJ1dGUoInNlcnZlciIpOwotICAgICAgICBTdHJpbmcgcnVudGltZUlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoInJ1bnRpbWUiKTsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzdCA9IG5ldyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUoc2VydmVySWQsIHJ1bnRpbWVJZCwgdHlwZUlkLCBuYW1lLCBlbGVtKTsKLSAgICAgICAgd2ViU2VydmljZUNsaWVudFR5cGVzLnB1dChpZCwgd3N0KTsKLSAgICAgICAgdHlwZXNfLnB1dChpZCwgbnVsbCApOyAgCi0gICAgICAgIGNsaWVudElkVG9MYWJlbF8ucHV0KCB0eXBlSWQsIG5hbWUgKTsKLSAgICAgIH0KLSAgICAgIGNvbmZpZ0VsZW1zXy5hZGQoIGVsZW0gKTsKLSAgICAgIAotICAgIH0KLSAgfQotCi0gCi0gIC8qKgotICAqIExvYWRzIFdlYlNlcnZpY2VDbGllbnRUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAqIFNlZSBtZXRob2QgZ2V0SW5zdGFuY2UoKS4KLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvYWQgKCkKLSAgewotICAgIHR5cGVOYW1lc18gPSBuZXcgSGFzaFNldCgpOwotICAgIGNvbmZpZ0VsZW1zXyA9IG5ldyBWZWN0b3IoKTsKLSAgICB0eXBlc18gICAgICAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGNsaWVudFR5cGVBbmRJZHNfID0gbmV3IEhhc2hNYXAoKTsKLSAgICB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHdlYlNlcnZpY2VSdW50aW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgd2ViU2VydmljZVNlcnZlcnMgPSBuZXcgSGFzaE1hcCgpOwotICAgIGNsaWVudElkVG9MYWJlbF8gID0gbmV3IEhhc2hNYXAoKTsKLSAgICBsb2FkVHlwZXMoKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZVJ1bnRpbWUgZ2V0UnVudGltZUJ5SWQoIFN0cmluZyBpZCApCi0gIHsKLSAgICByZXR1cm4gKFdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQoIGlkICk7IAotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVzQnlUeXBlKFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtcyA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KHR5cGVJZCk7Ci0gICAgVmVjdG9yIHJ1bnRpbWVzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIFN0cmluZ1tdIHJ1bnRpbWVJZHMgPSBuZXcgU3RyaW5nW2VsZW1zLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaT0wOyBpPGVsZW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gKElDb25maWd1cmF0aW9uRWxlbWVudCllbGVtc1tpXTsKLSAgICAgIHJ1bnRpbWVJZHNbaV0gPSBlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZSIpOwotICAgIH0KLSAgICByZXR1cm4gcnVudGltZUlkczsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbChTdHJpbmcgajJlZVZlcnNpb25JZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoSVdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQocnVudGltZUlkKTsKLSAgICBTdHJpbmdbXSBqMmVlVmVyc2lvbnMgPSB3c3IuZ2V0SjJFRVZlcnNpb25zKCk7Ci0gICAgaWYgKGoyZWVWZXJzaW9ucz09bnVsbCB8fCBqMmVlVmVyc2lvbnMubGVuZ3RoPT0wKSAKLSAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIGZvcihpbnQgaT0wOyBpPGoyZWVWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoajJlZVZlcnNpb25zW2ldLmVxdWFscyhqMmVlVmVyc2lvbklkKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLSAgCi0gIHB1YmxpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChTdHJpbmcgc2VydmVyVGFyZ2V0SWQsIFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICAvL1ZlY3RvciBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSlpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQucnVudGltZUlkXyE9bnVsbCkgewotICAgICAgICBpZiAoKHdzc3J0LnJ1bnRpbWVJZF8pLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlkKSkgewotICAgICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHdzc3J0LnNlcnZlcklkXyk7Ci0gICAgICAgICAgU3RyaW5nIHRoaXNGYWN0b3J5SWQgPSB3c3MuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUodGhpc0ZhY3RvcnlJZCk7Ci0gICAgICAgICAgaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyB0aGlzU2VydmVyVGFyZ2V0SWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsgICAgICAgICAgCi0gICAgICAgICAgaWYgKHRoaXNTZXJ2ZXJUYXJnZXRJZC5lcXVhbHMoc2VydmVyVGFyZ2V0SWQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlQ2xpZW50VHlwZTwvY29kZT4KLSAgKiBvYmplY3RzLgotICAqIEByZXR1cm4gVGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VDbGllbnRUeXBlPC9jb2RlPgotICAqIG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlQ2xpZW50VHlwZU5hbWVzICgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKXR5cGVOYW1lc18udG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotICB9Ci0KLSAgcHVibGljIExhYmVsc0FuZElkcyBnZXRDbGllbnRUeXBlTGFiZWxzKCkKLSAgewotICAgIExhYmVsc0FuZElkcyBsYWJlbElkcyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgICBJdGVyYXRvciAgICAgaXRlcmF0b3IgPSBjbGllbnRJZFRvTGFiZWxfLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBpbnQgICAgICAgICAgc2l6ZSAgICAgPSBjbGllbnRJZFRvTGFiZWxfLnNpemUoKTsKLSAgICBTdHJpbmdbXSAgICAgbGFiZWxzICAgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgIFN0cmluZ1tdICAgICBpZHMgICAgICA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgaW50ICAgICAgICAgIGluZGV4ICAgID0gMDsKLSAgICAKLSAgICBsYWJlbElkcy5zZXRMYWJlbHNfKCBsYWJlbHMgKTsKLSAgICBsYWJlbElkcy5zZXRJZHNfKCBpZHMgKTsKLSAgICAKLSAgICB3aGlsZSggaXRlcmF0b3IuaGFzTmV4dCgpICkgCi0gICAgewotICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAKLSAgICAgIGlkc1tpbmRleF0gICAgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotICAgICAgbGFiZWxzW2luZGV4XSA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgIGluZGV4Kys7Ci0gICAgfSAgICAKLSAgICAKLSAgICByZXR1cm4gbGFiZWxJZHM7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBnaXZlbiB0aGUgc2VydmVyLCBydW50aW1lLCBhbmQgdHlwZSBhdHRyaWJ1dGVzCi0gICogVGhlIGJlbmVmaXQgb2YgZ2V0dGluZyB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MKLSAgKiBmaWxlIGFuZCBwbHVnaW4gYXJlIG5vdCBsb2FkZWQgaW1tZWRpYXRlbHkuCi0gICogQHBhcmFtIHNlcnZlciBsYWJlbAotICAqIEBwYXJhbSBydW50aW1lIGxhYmVsCi0gICogQHBhcmFtIHR5cGUgbGFiZWwKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUpaXRlci5uZXh0KCk7Ci0gICAgICAgIGlmICh3c3NydC5oYXNDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXJJZCwgcnVudGltZUlkLCB0eXBlSWQpKSB7Ci0gICAgICAgICAgcmV0dXJuIHdzc3J0LmVsZW1lbnRfOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudEZvcihTdHJpbmcgZmFjdG9yeUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VDbGllbnRUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKWl0ZXIubmV4dCgpOwotICAgICAgICBpZiAod3NzcnQuaGFzQ29uZmlnRWxlbWVudEZvcihmYWN0b3J5SWQsIHJ1bnRpbWVJZCwgdHlwZUlkKSkgewotICAgICAgICAgIHJldHVybiB3c3NydC5lbGVtZW50XzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRFeHRlbnNpb25JZEZvcihTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKHNlcnZlcklkLCBydW50aW1lSWQsIHR5cGVJZCk7Ci0gICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwotICB9Ci0KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudEJ5SWQoU3RyaW5nIGlkKSB7Ci0gICAgCi0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKXdlYlNlcnZpY2VDbGllbnRUeXBlcy5nZXQoaWQpOwotICAgIHJldHVybiAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KXdzcnQuZWxlbWVudF87ICAgIAotCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWd1cmF0aW9uRWxlbWVudChTdHJpbmcgY2xpZW50VHlwZUlkKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ0VsZW1zXy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudClpdC5uZXh0KCk7Ci0gICAgICBTdHJpbmcgY2xpZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGllbnRUeXBlIik7Ci0gICAgICBpZiAoY2xpZW50VHlwZSAhPSBudWxsICYmIGNsaWVudFR5cGUuZXF1YWxzKGNsaWVudFR5cGVJZCkpCi0gICAgICAgIHYuYWRkKGVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKXYudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBnZXRDb25maWd1cmF0aW9uRWxlbWVudChTdHJpbmcgY2xpZW50VHlwZUlkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ0VsZW1zXy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudClpdC5uZXh0KCk7Ci0gICAgICBTdHJpbmcgY2xpZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGllbnRUeXBlIik7Ci0gICAgICBTdHJpbmcgcnVudGltZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lIik7Ci0gICAgICBpZiAoY2xpZW50VHlwZSAhPSBudWxsICYmIHJ1bnRpbWUgIT0gbnVsbCAmJiBjbGllbnRUeXBlLmVxdWFscyhjbGllbnRUeXBlSWQpICYmIHJ1bnRpbWUuZXF1YWxzKHJ1bnRpbWVJZCkpCi0gICAgICAgIHYuYWRkKGVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gKElDb25maWd1cmF0aW9uRWxlbWVudFtdKXYudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdKTsKLSAgfQotICAKLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySWRGb3JGYWN0b3J5SWQoU3RyaW5nIGZhY3RvcnlJZCkgewotCi0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcy5nZXRGYWN0b3J5SWQoKS5lcXVhbHMoZmFjdG9yeUlkKSkgewotICAgICAgICByZXR1cm4gd3NzLmdldElkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZEJ5U2VydmVyTGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcy5nZXRMYWJlbCgpLmVxdWFscyhsYWJlbCkpIHsKLSAgICAgICAgcmV0dXJuIHdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV2ViU2VydmljZVJ1bnRpbWUgZ2V0V2ViU2VydmljZVJ1bnRpbWVCeU5hbWUoU3RyaW5nIHJ1bnRpbWVOYW1lKSB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VSdW50aW1lcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVJ1bnRpbWUgd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzci5nZXRMYWJlbCgpLmVxdWFscyhydW50aW1lTmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIHdzcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgV2ViU2VydmljZVNlcnZlciBnZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoU3RyaW5nIGZhY3RvcnlJZCkgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcilpdGVyLm5leHQoKTsKLSAgICAgIGlmICh3c3MuZ2V0RmFjdG9yeUlkKCkuZXF1YWxzKGZhY3RvcnlJZCkpIHsKLSAgICAgICAgcmV0dXJuIHdzczsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VMYWJlbEZyb21JbnN0YW5jZUlkKCBTdHJpbmcgaW5zdGFuY2VJZCApCi0gIHsKLSAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlciggaW5zdGFuY2VJZCApOwotICAgIAotICAgIHJldHVybiBzZXJ2ZXIuZ2V0TmFtZSgpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IFN0cmluZ1t3ZWJTZXJ2aWNlU2VydmVycy5zaXplKCldOwotICAgIGludCBpPTA7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcy5nZXRGYWN0b3J5SWQoKSE9bnVsbCkgewotICAgICAgICBzZXJ2ZXJGYWN0b3J5SWRzW2ldPXdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2VydmVyRmFjdG9yeUlkczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBbGxDbGllbnRSdW50aW1lcygpIHsKLSAgICBTdHJpbmdbXSBydW50aW1lcyA9IG5ldyBTdHJpbmdbd2ViU2VydmljZVJ1bnRpbWVzLnNpemUoKV07Ci0gICAgaW50IGk9MDsKLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVJ1bnRpbWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWUpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NyLmdldElkKCkgIT0gbnVsbCkgewotICAgICAgICBydW50aW1lc1tpXT13c3IuZ2V0SWQoKTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcnVudGltZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbEJ5SWQoU3RyaW5nIHJ1bnRpbWVJZCkgewotICAgIFdlYlNlcnZpY2VSdW50aW1lIHdzUnVudGltZSA9IChXZWJTZXJ2aWNlUnVudGltZSl3ZWJTZXJ2aWNlUnVudGltZXMuZ2V0KHJ1bnRpbWVJZCk7Ci0gICAgaWYgKHdzUnVudGltZSE9bnVsbCkgewotICAgICAgcmV0dXJuIHdzUnVudGltZS5nZXRMYWJlbCgpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50VHlwZUlkQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIChTdHJpbmcpY2xpZW50VHlwZUFuZElkc18uZ2V0KG5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgSVdlYlNlcnZpY2VSdW50aW1lIGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgcmV0dXJuIChJV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldChydW50aW1lSWQpOyAKLSAgfQotCi0KLSAgLyoqCi0gICogR2V0cyB0aGUgcnVudGltZSBJRHMgb2YgYWxsIHdlYiBzZXJ2aWNlIHNlcnZlciBydW50aW1lIHR5cGUKLSAgKiB3aXRoIGFuIHNlcnZlciBmYWN0b3J5IElEIGVxdWFscyB0byB0aGUgaW5wdXQKLSAgKiBAcGFyYW0gc2VydmVyIGZhY3RvcnkgSUQKLSAgKiBAcmV0dXJuIGFycmF5IG9mIHJ1bnRpbWUgSURzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lSWRzQnlTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJRCkgewotICAgIFZlY3RvciBydW50aW1lSWRzID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSlpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQuc2VydmVySWRfIT1udWxsKSB7Ci0gICAgICAJU3RyaW5nIHNlcnZlcklkID0gd3NzcnQuc2VydmVySWRfOwotICAgICAgCVdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHNlcnZlcklkKTsKLSAgICAgIAlTdHJpbmcgd3NzZklkID0gd3NzLmdldEZhY3RvcnlJZCgpOwotICAgICAgCWlmICh3c3NmSWQuZXF1YWxzKHNlcnZlckZhY3RvcnlJRCkpCi0gICAgICAJCXJ1bnRpbWVJZHMuYWRkKHdzc3J0LnJ1bnRpbWVJZF8pOwotICAgICAgCS8qCi0gICAgICAgIFN0cmluZyB3c3NGYWN0b3J5SWQgPSAoKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHdzc3J0LnNlcnZlcklkXykpLmdldEZhY3RvcnlJZCgpOwotICAgICAgICBpZiAod3NzRmFjdG9yeUlkLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmVyRmFjdG9yeUlEKSkgewotICAgICAgICAgIHJ1bnRpbWVJZHMuYWRkKHdzc3J0LnJ1bnRpbWVJZF8pOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pcnVudGltZUlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHNCeUNsaWVudFR5cGUoU3RyaW5nIGNsaWVudFR5cGVOYW1lKSB7Ci0gICAgCi0gICAgVmVjdG9yIGZhY3RvcnlJZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nIGNsaWVudFR5cGVJZCA9IGdldENsaWVudFR5cGVJZEJ5TmFtZShjbGllbnRUeXBlTmFtZSk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VDbGllbnRUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZUNsaWVudFR5cGUgd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKCh3c3NydC50eXBlSWRfKS5lcXVhbHNJZ25vcmVDYXNlKGNsaWVudFR5cGVJZCkpIHsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlciB3c3MgPSAoV2ViU2VydmljZVNlcnZlcil3ZWJTZXJ2aWNlU2VydmVycy5nZXQod3NzcnQuc2VydmVySWRfKTsKLSAgICAgICAgZmFjdG9yeUlkcy5hZGQod3NzLmdldEZhY3RvcnlJZCgpKTsKLSAgICAgIH0KLSAgCi0gICAgfQotICAgIHJldHVybiAoU3RyaW5nW10pZmFjdG9yeUlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOyAgIAotCi0gIH0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBzZXJ2ZXIgZmFjdG9yeUlkcyBvZiBhbGwgd2ViIHNlcnZpY2Ugc2VydmVyIHJ1bnRpbWUgdHlwZQotICAqIHdpdGggYW4gcnVudGltZSBJZCBlcXVhbHMgdG8gdGhlIGlucHV0Ci0gICogQHBhcmFtIHJ1bnRpbWUgSWQKLSAgKiBAcmV0dXJuIGFycmF5IG9mIGZhY3RvcnkgSWRzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlSdW50aW1lSWQoU3RyaW5nIHJ1bnRpbWVJRCkgewotICAgIFZlY3RvciBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZUNsaWVudFR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVDbGllbnRUeXBlIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSlpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQucnVudGltZUlkXyE9bnVsbCkgewotICAgICAgICBpZiAoKHdzc3J0LnJ1bnRpbWVJZF8pLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlEKSkgewotICAgICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHdzc3J0LnNlcnZlcklkXyk7Ci0gICAgICAgICAgc2VydmVyRmFjdG9yeUlkcy5hZGQod3NzLmdldEZhY3RvcnlJZCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKFN0cmluZ1tdKXNlcnZlckZhY3RvcnlJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHdlYlNlcnZpY2VDbGllbnRSdW50aW1lVHlwZUV4aXN0cyhTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpIHsKLSAgICBpZiAoZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySWQsIHJ1bnRpbWVJZCwgdHlwZUlkKT09bnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLQotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUoU3RyaW5nIGNsaWVudFR5cGVJZCkKLSAgewotICAgIFN0cmluZyBjbGllbnRUeXBlTmFtZSA9IChTdHJpbmcpY2xpZW50SWRUb0xhYmVsXy5nZXQoY2xpZW50VHlwZUlkKTsKLSAgICByZXR1cm4gZ2V0U2VydmVyRmFjdG9yeUlkc0J5Q2xpZW50VHlwZShjbGllbnRUeXBlTmFtZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzU2VydmVyU3VwcG9ydGVkRm9yQ2hvc2VuVHlwZShTdHJpbmcgY2xpZW50VHlwZUlkLCBTdHJpbmcgc2VydmVyRmFjdG9yeUlEKQotICB7Ci0gICAgU3RyaW5nW10gc3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkcyA9IGdldFNlcnZlckZhY3RvcnlJZHNCeVR5cGUoY2xpZW50VHlwZUlkKTsKLSAgICBpZiAoc3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkcyE9bnVsbCAmJiBzdXBwb3J0ZWRTZXJ2ZXJGYWN0b3J5SWRzLmxlbmd0aD4wKQotICAgIHsKLQkgICAgZm9yIChpbnQgaT0wOyBpPHN1cHBvcnRlZFNlcnZlckZhY3RvcnlJZHMubGVuZ3RoOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3VwcG9ydGVkU2VydmVyRmFjdG9yeUlkc1tpXS5lcXVhbHMoc2VydmVyRmFjdG9yeUlEKSkKLQkgICAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgCi0KLSAgLyoqCi0gICogIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZSBpcyB0aGUgY2FjaGVkIG1ldGFkYXRhIGluY2x1ZGluZyB0aGUgSUNvbmZpZ3VyYXRpb24KLSAgKi8KLSAgcHVibGljIGZpbmFsIGNsYXNzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZQotICB7Ci0gICAgCi0gICBwcml2YXRlIFN0cmluZyB0eXBlSWRfID0gbnVsbDsKLSAgIHByaXZhdGUgU3RyaW5nIHNlcnZlcklkXyA9IG51bGw7Ci0gICBwcml2YXRlIFN0cmluZyBydW50aW1lSWRfID0gbnVsbDsKLSAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnRfOwotICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzU2VydmVyUnVudGltZV8gPSBmYWxzZTsKLSAgIHByaXZhdGUgU3RyaW5nIGxhYmVsXzsKLSAgIAotICAgcHJvdGVjdGVkIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lQ2xpZW50VHlwZShTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGxhYmVsLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgIHsKLSAgICB0eXBlSWRfID0gbmV3IFN0cmluZyh0eXBlSWQudHJpbSgpKTsKLSAgICBpZiAoc2VydmVySWQhPW51bGwpCi0gICAgICBzZXJ2ZXJJZF8gPSBuZXcgU3RyaW5nKHNlcnZlcklkLnRyaW0oKSk7Ci0gICAgaWYgKHJ1bnRpbWVJZCE9bnVsbCkKLSAgICAgIHJ1bnRpbWVJZF8gPSBuZXcgU3RyaW5nKHJ1bnRpbWVJZC50cmltKCkpOwotICAgIGVsZW1lbnRfID0gZWxlbTsKLSAgICBpZiAoc2VydmVySWRfIT1udWxsICYmIHJ1bnRpbWVJZF8hPW51bGwpIHsKLSAgICAgIHJlcXVpcmVzU2VydmVyUnVudGltZV8gPSB0cnVlOwotICAgIH0KLQotICAgIGxhYmVsXyA9IGxhYmVsOwotICAgfQotCi0gICBwdWJsaWMgYm9vbGVhbiBoYXNDb25maWd1cmF0aW9uRWxlbWVudEZvcihTdHJpbmcgc2VydmVySUQsIFN0cmluZyBydW50aW1lSUQsIFN0cmluZyB0eXBlSUQpIHsKLSAgICBpZiAodHlwZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHR5cGVJRCkgJiYgIXJlcXVpcmVzU2VydmVyUnVudGltZV8pCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChyZXF1aXJlc1NlcnZlclJ1bnRpbWVfKSB7Ci0gICAgICBpZiAodHlwZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHR5cGVJRCkgJiYKLSAgICAgICAgIHNlcnZlcklkXy5lcXVhbHNJZ25vcmVDYXNlKHNlcnZlcklEKSAmJgotICAgICAgICAgcnVudGltZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHJ1bnRpbWVJRCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci0gICAKLSAgIHB1YmxpYyBib29sZWFuIGhhc0NvbmZpZ0VsZW1lbnRGb3IoU3RyaW5nIGZhY3RvcnlJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkgewotICAgICBpZiAodHlwZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHR5cGVJRCkgJiYgIXJlcXVpcmVzU2VydmVyUnVudGltZV8pCi0gICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgaWYgKHJlcXVpcmVzU2VydmVyUnVudGltZV8pIAotICAgICB7Ci0gICAgICAgU3RyaW5nIHNlcnZlcklEID0gZ2V0U2VydmVySWRGb3JGYWN0b3J5SWQoIGZhY3RvcnlJRCApOyAKLSAgICAgICAKLSAgICAgICBpZiAodHlwZUlkXy5lcXVhbHNJZ25vcmVDYXNlKHR5cGVJRCkgJiYKLSAgICAgICAgICBzZXJ2ZXJJZF8uZXF1YWxzSWdub3JlQ2FzZShzZXJ2ZXJJRCkgJiYKLSAgICAgICAgICBydW50aW1lSWRfLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlEKSkKLSAgICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAKLSAgIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q2xpZW50VHlwZUNvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKFN0cmluZyBzZXJ2ZXJJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkKLSAgIHsKLSAgICBpZiAodGhpcy50eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJiBzZXJ2ZXJJRD09bnVsbCAmJiBydW50aW1lSUQ9PW51bGwpCi0gICAgICByZXR1cm4gdGhpcy5lbGVtZW50XzsKLSAgICAKLSAgICBpZiAodGhpcy50eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJiAKLSAgICAgICB0aGlzLnNlcnZlcklkXy5lcXVhbHNJZ25vcmVDYXNlKHNlcnZlcklEKSAmJiAKLSAgICAgICB0aGlzLnJ1bnRpbWVJZF8uZXF1YWxzSWdub3JlQ2FzZShydW50aW1lSUQpKQotICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudF87Ci0gICAgcmV0dXJuIG51bGw7Ci0gICB9IAotICB9Ci0gIAotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkgZ2V0RmFjdG9yeUZhY3RvcnkoIFN0cmluZ1tdIGlkcyApCi0gIHsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICAgaGFzaEtleSA9IGlkc1syXSArICIjIiArIGlkc1sxXSArICIjIiArIGlkc1swXTsKLSAgICBDb21tYW5kV2lkZ2V0QmluZGluZyAgYmluZGluZyA9IChDb21tYW5kV2lkZ2V0QmluZGluZylmYWN0b3J5Q2FjaGVfLmdldCggaGFzaEtleSApOwotICAgIAotICAgIGlmKCBiaW5kaW5nID09IG51bGwgKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0Q29uZmlnRWxlbWVudEZvciggaWRzWzJdLCBpZHNbMV0sIGlkc1swXSApOyAKLSAgICAKLSAgICAgIGlmKCBlbGVtZW50ID09IG51bGwgKSByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAgIGJpbmRpbmcgPSBjcmVhdGVCaW5kaW5nKCBlbGVtZW50ICk7Ci0gICAgICAKLSAgICAgIGZhY3RvcnlDYWNoZV8ucHV0KCBoYXNoS2V5LCBiaW5kaW5nICk7Ci0gICAgICAKLSAgICAgIGJpbmRpbmcucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFNYXBwaW5nUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIGlmKCB3aWRnZXRSZWdpc3RyeV8gIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgICAgIGJpbmRpbmcucmVnaXN0ZXJDYW5GaW5pc2goIGNhbkZpbmlzaFJlZ2lzdHJ5XyApOwotICAgICAgfQotICAgIH0gIAotICAgICAgCi0gICAgcmV0dXJuIGJpbmRpbmc7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIENvbW1hbmRXaWRnZXRCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgKSAKLSAgewotICAgIFZlY3RvciBiaW5kaW5ncyA9IG5ldyBWZWN0b3IoNCk7Ci0gICAgVmVjdG9yIGZyYWdtZW50cyA9IG5ldyBWZWN0b3IoNCk7Ci0gICAgCi0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImRldmVsb3BCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICBhZGRCaW5kaW5nKCBlbGVtZW50LCAiYXNzZW1ibHlCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICBhZGRCaW5kaW5nKCBlbGVtZW50LCAiZGVwbG95QmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImluc3RhbGxCaW5kaW5nIiwgYmluZGluZ3MgKTsKLSAgICAKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50KCkgKTsKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudCgpICk7Ci0gICAgZnJhZ21lbnRzLmFkZCggbmV3IENsaWVudFByZURlcGxveUZyYWdtZW50KCkgKTsKLSAgICBmcmFnbWVudHMuYWRkKCBuZXcgQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50KCkgKTsKLSAgICAgCi0gICAgcmV0dXJuIG5ldyBDb21tYW5kV2lkZ2V0QmluZGluZ0xpc3QoIGJpbmRpbmdzLCBmcmFnbWVudHMgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFkZEJpbmRpbmcoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYmluZGluZ05hbWUsIFZlY3RvciBsaXN0ICkKLSAgewotICAgIE9iamVjdCBiaW5kaW5nID0gbnVsbDsKLSAgICAKLSAgICBpZiggZWxlbWVudC5nZXRBdHRyaWJ1dGUoIGJpbmRpbmdOYW1lICkgIT0gbnVsbCApCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcgPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oIGJpbmRpbmdOYW1lICk7IAotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgbGlzdC5hZGQoIGJpbmRpbmcgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RGF0YU1hcHBpbmdSZWdpc3RyeSggRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyA9IHJlZ2lzdHJ5OwotICAgIAotICAgIC8vIFdlIG5lZWQgdG8gcmVidWlsZCB0aGUgZmFjdG9yeSBjYWNoZSBlYWNoIHRpbWUgd2Ugc3RhcnQgdGhlIGNsaWVudAotICAgIC8vIHdpemFyZC4KLSAgICBmYWN0b3J5Q2FjaGVfICAgICAgICA9IG5ldyBIYXNoTWFwKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdpZGdldFJlZ2lzdHJ5KCBXaWRnZXRSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgICB3aWRnZXRSZWdpc3RyeV8gPSByZWdpc3RyeTs7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2FuRmluaXNoUmVnaXN0cnkoIENhbkZpbmlzaFJlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IHJlZ2lzdHJ5OwotICB9Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJjNTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotCi0vKioKLSogVGhpcyB0eXBlIGlzIHVzZWQgdG8gaG9sZCB1c2VyIG9yIGNhbGN1bGF0ZWQgCi0qIGRhdGEgdG8gYmUgdXNlIGJ5IGZpbnNpaCB0YXNrcwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUluZm8KLXsKLQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlUnVudGltZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ZWVmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbjsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZSBhcnRpZmFjdC4gCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSdW50aW1lIGltcGxlbWVudHMgSVdlYlNlcnZpY2VSdW50aW1lCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnRfOwotICBwdWJsaWMgU3RyaW5nIHJ1bnRpbWVJZF87Ci0gIHB1YmxpYyBTdHJpbmcgcnVudGltZUxhYmVsXzsKLSAgcHVibGljIFN0cmluZyBydW50aW1lRGVzY3JpcHRpb25fOwotICBwdWJsaWMgU3RyaW5nW10gajJlZVZlcnNpb25zOwotICAKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUnVudGltZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtZW50XyA9IGVsZW07IAotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICogQHJldHVybiBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQgKCkKLSAgewotICAgIGlmIChydW50aW1lSWRfID09IG51bGwpCi0gICAgICBydW50aW1lSWRfID0gZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIHJldHVybiBydW50aW1lSWRfOwotICB9Ci0gIAotICAKLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHJ1bnRpbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIGlmIChydW50aW1lRGVzY3JpcHRpb25fID09IG51bGwpCi0gICAgICBydW50aW1lRGVzY3JpcHRpb25fID0gZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOwotICAgIHJldHVybiBydW50aW1lRGVzY3JpcHRpb25fOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNob3J0LCBsb2NhbGUgc3BlY2lmaWMgTGFiZWwgb2YgdGhpcyBXZWIgU2VydmljZSBydW50aW1lLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIExhYmVsIG9mIHRoaXMgV2ViIFNlcnZpY2UgcnVudGltZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCAoKQotICB7Ci0gICAgaWYgKHJ1bnRpbWVMYWJlbF89PW51bGwpCi0gICAgICBydW50aW1lTGFiZWxfID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0TWVzc2FnZSgoU3RyaW5nKWVsZW1lbnRfLmdldEF0dHJpYnV0ZSgibGFiZWwiKSk7ICAgIAotICAgIHJldHVybiBydW50aW1lTGFiZWxfOwotICB9Ci0KLSAgLyoqCi0gICAqICBSZXR1cm5zIGEgVHJ1ZSBpZiB0aGlzIHJ1bnRpbWUgaGFzIGJlZW4gc2V0IGFzIGRlZmF1bHQKLSAgICogIEByZXR1cm4gYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRJc0RlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImlzRGVmYXVsdCIpKS5ib29sZWFuVmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgU3RyaW5nLCBKMkVFIHZlcnNpb24KLSAgICogQHJldHVybgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEoyRUVWZXJzaW9ucygpCi0gIHsKLSAgICBpZiAoajJlZVZlcnNpb25zID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImoyZWV2ZXJzaW9uIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgajJlZVZlcnNpb25zID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqMmVlVmVyc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgajJlZVZlcnNpb25zW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBqMmVlVmVyc2lvbnM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aAotICAgKiB0aGlzIHJ1bnRpbWUuCi0gICAqIAotICAgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRfOwotICB9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmU0N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCByZXByZXNlbnQgYSBraW5kIG9mCi0qIFdlYiBTZXJ2aWNlIGFydGlmYWN0LiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIGEgV2ViU2VydmljZVR5cGUKLSogb2JqZWN0IGlzIHRvIG1hbnVmYWN0dXJlIHRoZSB3aXphcmQgcGFnZXMgdGhhdCBzdXBwb3J0IHRoZSB0eXBlLgotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU2VydmVyIGltcGxlbWVudHMgSVdlYlNlcnZpY2VTZXJ2ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnRfOwotICBwdWJsaWMgU3RyaW5nIHNlcnZlcklkXzsKLSAgcHVibGljIFN0cmluZyBmYWN0b3J5SWRfOwotICBwdWJsaWMgU3RyaW5nIHNlcnZlckxhYmVsXzsKLQotICBwdWJsaWMgV2ViU2VydmljZVNlcnZlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtZW50XyA9IGVsZW07IAotICB9Ci0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIGlkIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKQotICB7Ci0gICAgaWYgKHNlcnZlcklkXz09bnVsbCkKLSAgICAgIHNlcnZlcklkXyA9IGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICByZXR1cm4gc2VydmVySWRfOwotICB9Ci0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCAoKQotICB7Ci0gICAgaWYgKGZhY3RvcnlJZF89PW51bGwpCi0gICAgICBmYWN0b3J5SWRfID0gZWxlbWVudF8uZ2V0QXR0cmlidXRlKCJmYWN0b3J5SWQiKTsKLSAgICByZXR1cm4gZmFjdG9yeUlkXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExhYmVsICgpCi0gIHsKLSAgICBpZiAoc2VydmVyTGFiZWxfID09IG51bGwpCi0gICAgewotICAgICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoZ2V0RmFjdG9yeUlkKCkpOyAgICAKLSAgICAgIHNlcnZlckxhYmVsXyA9IFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0VGV4dChzZXJ2ZXJUeXBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZlckxhYmVsXzsgICAgCi0gIH0gIAotCi0gIC8qKgotICAgKiAgUmV0dXJucyBhIFRydWUgaWYgdGhpcyBzZXJ2ZXIgaGFzIGJlZW4gc2V0IGFzIGRlZmF1bHQKLSAgICogIEByZXR1cm4gYSBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRJc0RlZmF1bHQoKQotICB7Ci0KLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiaXNEZWZhdWx0IikpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyBydW50aW1lIHRhcmdldCBJZAotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lVHlwZUlkKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoInJ1bnRpbWVUeXBlSWRzIik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoCi0gICAqIHRoaXMgdHlwZS4KLSAgICogCi0gICAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudAotICAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbGVtZW50XzsgCi0gIH0gCi0KLSAgfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2ZTFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZS1TZXJ2ZXItUnVudGltZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUsIHNlcnZlciwgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotewotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlLgotICAqIEByZXR1cm4gQSBsb2NhbGUgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBsYWJlbCBmb3IgdGhlIFNlcnZlciBzdXBwb3J0ZWQgYnkgdGhpcyBXZWIgU2VydmljZSBTZXJ2ZXItUnVudGltZSB0eXBlCi0gICogQHJldHVybiBBIHNlcnZlciBsYWJlbCBmcm9tIHNlcnZlciBwbHVnaW5zCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTGFiZWwoKTsKLQotICAvKioKLSAgKiBTZXRzIGEgbGFiZWwgZm9yIHRoZSBTZXJ2ZXIgc3VwcG9ydGVkIGJ5IHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZQotICAqIEBwYXJhbSBBIHNlcnZlciBsYWJlbCBmcm9tIHNlcnZlciBwbHVnaW5zCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckxhYmVsKFN0cmluZyBzZXJ2ZXJMYWJlbCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgZGVwbG95bWVudCBydW50aW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgU2VydmVyLVJ1bnRpbWUgdHlwZQotICAqIEByZXR1cm4gQSBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbCgpOwotCi0gIC8qKgotICAqIFNldHMgYSBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZSBvZiB0aGlzIFdlYiBTZXJ2aWNlIFNlcnZlci1SdW50aW1lIHR5cGUKLSAgKiBAcGFyYW0gQSBsYWJlbCBmb3IgdGhlIGRlcGxveW1lbnQgcnVudGltZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lTGFiZWwoU3RyaW5nIHJ1bnRpbWVMYWJlbCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgV2ViIFNlcnZpY2UgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUKLSAgKiBAcmV0dXJuIEEgbGFiZWwgZm9yIHRoZSBXZWIgU2VydmljZSB0eXBlCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGVMYWJlbCgpOwotCi0gIC8qKgotICAqIFJldHVybnMgd2hldGhlciBvciBub3QgYSBXZWIgTW9kdWxlIGlzIHJlcXVpcmVkIGZvciB0aGlzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZQotICAqIEByZXR1cm4gdHJ1ZSBpZiByZXF1aXJlV2ViTW9kdWxlCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzV2ViTW9kdWxlUmVxdWlyZWQoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSBib29sZWFuIHZhbHVlIGF0IHJ1bnRpbWUgYWNjb3JkaW5nIHRvIHJlcXVpcmVXZWJNb2R1bGUgYXR0cmlidXRlIGZyb20gdGhlIG1hbmlmZXN0IGZpbGUKLSAgKiBAcGFyYW0gcmVxdWlyZVdlYk1vZHVsZSAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViTW9kdWxlUmVxdWlyZWQoYm9vbGVhbiByZXF1aXJlV2ViTW9kdWxlKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGFuIEVKQiBNb2R1bGUgaXMgcmVxdWlyZWQgZm9yIHRoaXMgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gICogQHJldHVybiB0cnVlIGlzIHJlcXVpcmVFSkJNb2R1bGUgaXMgdHJ1ZQotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VKQk1vZHVsZVJlcXVpcmVkKCk7Ci0KLSAgLyoqCi0gICogU2V0cyB0aGUgYm9vbGVhbiB2YWx1ZSBhdCBydW50aW1lIGFjY29yZGluZyB0byByZXF1aXJlRUpCTW9kdWxlIGF0dHJpYnV0ZSBmcm9tIHRoZSBtYW5pZmVzdCBmaWxlCi0gICogQHBhcmFtIHJlcXVpcmVFSkJNb2R1bGUgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEVKQk1vZHVsZVJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZUVKQk1vZHVsZSk7IAotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDBhYWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklFSkJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuU2VydmljZVByZUFzc2VtYmx5RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5TZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50cy5TZXJ2aWNlUHJlRGV2ZWxvcEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHMuU2VydmljZVByZUluc3RhbGxGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUucmVnaXN0cnkuQ29tbWFuZFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSBpbXBsZW1lbnRzIENvbW1hbmRSZWdpc3RyeQotewotCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IGluc3RhbmNlXzsKLQotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGluZGV4ZWRDb25maWdFbGVtc187Ci0KLSAgcHJpdmF0ZSBIYXNoTWFwIHdlYlNlcnZpY2VTZXJ2ZXJzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVJ1bnRpbWVzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVR5cGVzOwotICBwcml2YXRlIEhhc2hNYXAgd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlczsKLSAKLSAgcHJpdmF0ZSBIYXNodGFibGUgcnVudGltZXNCeVR5cGVfOwotICBwcml2YXRlIEhhc2h0YWJsZSBydW50aW1lTGFiZWxCeUlkXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcnVudGltZUlkQnlMYWJlbF87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHNlcnZlcnNCeVR5cGVfOwotICBwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJMYWJlbEJ5RmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgc2VydmVyRmFjdG9yeUlkQnlMYWJlbF87Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgY29uZmlnRWxlbXNCeUlkXzsKLSAgCi0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBIYXNoTWFwICAgICAgICAgICAgIGZhY3RvcnlDYWNoZV87Ci0gIAotICBwcml2YXRlIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHNlcnZlclRvUnVudGltZVRvSjJFRV87Ci0gIHByaXZhdGUgTG9nCQkJCQlsb2dfOwotICAKLSAgcHVibGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5KCkgewotICAgIGxvZ18gPSBuZXcgRWNsaXBzZUxvZygpOwotICB9Ci0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gIC8vIGhhbmdpbmcgb24gdGhlIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBleHRlbnNpb24gcG9pbnQuIEV4dGVuc2lvbnMKLSAgLy8gbXVzdCBpbXBsZW1lbnQgdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aS53aXphcmQuV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlCi0gIC8vIGludGVyZmFjZS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRUeXBlcyAoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIik7Ci0KLSAgICBmb3IoaW50IGlkeD0wOyBpZHg8Y29uZmlnLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gY29uZmlnW2lkeF07Ci0gICAgICB0cnkgCi0gICAgICB7Ci0gICAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VTZXJ2ZXIiKSkKLSAgICAgICAgeyAKLSAgICAgICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IG5ldyBXZWJTZXJ2aWNlU2VydmVyKGVsZW0pOwotICAgICAgICAgIHdlYlNlcnZpY2VTZXJ2ZXJzLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3NzKTsKLSAgICAgICAgICBTdHJpbmcgc2VydmVyTGFiZWwgPSB3c3MuZ2V0TGFiZWwoKTsKLSAgICAgICAgICBpZiAoc2VydmVyTGFiZWwgIT0gbnVsbCAmJiBzZXJ2ZXJMYWJlbC5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8uY29udGFpbnNLZXkod3NzLmdldEZhY3RvcnlJZCgpKSk7Ci0gICAgICAgICAgICAgIHNlcnZlckxhYmVsQnlGYWN0b3J5SWRfLnB1dCh3c3MuZ2V0RmFjdG9yeUlkKCksIHNlcnZlckxhYmVsKTsKLSAgICAgICAgICAgIGlmICghc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8uY29udGFpbnNLZXkoc2VydmVyTGFiZWwpKTsKLSAgICAgICAgICAgICAgc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8ucHV0KHNlcnZlckxhYmVsLCB3c3MuZ2V0RmFjdG9yeUlkKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VSdW50aW1lIikpCi0gICAgICAgIHsKLSAgICAgICAgICBXZWJTZXJ2aWNlUnVudGltZSBydCA9IG5ldyBXZWJTZXJ2aWNlUnVudGltZShlbGVtKTsKLSAgICAgICAgICB3ZWJTZXJ2aWNlUnVudGltZXMucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCBydCk7Ci0gICAgICAgICAgaWYoIXJ1bnRpbWVMYWJlbEJ5SWRfLmNvbnRhaW5zS2V5KHJ0LmdldElkKCkpKQotICAgICAgICAgIAlydW50aW1lTGFiZWxCeUlkXy5wdXQocnQuZ2V0SWQoKSwgcnQuZ2V0TGFiZWwoKSk7Ci0gICAgICAgICAgaWYoIXJ1bnRpbWVJZEJ5TGFiZWxfLmNvbnRhaW5zS2V5KHJ0LmdldExhYmVsKCkpKQotICAgICAgICAgIAlydW50aW1lSWRCeUxhYmVsXy5wdXQocnQuZ2V0TGFiZWwoKSwgcnQuZ2V0SWQoKSk7Ci0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgV2ViU2VydmljZVR5cGVJbXBsIHdzdCA9IG5ldyBXZWJTZXJ2aWNlVHlwZUltcGwoZWxlbSk7Ci0gICAgICAgICAgd2ViU2VydmljZVR5cGVzLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3N0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29uZmlnRWxlbXNCeUlkXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIGVsZW0pOwotCi0gICAgICAgICAgU3RyaW5nIHR5cGVJZCA9IGVsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIik7Ci0gICAgICAgICAgU3RyaW5nIHNlcnZlcklkID0gZWxlbS5nZXRBdHRyaWJ1dGUoInNlcnZlciIpOwotICAgICAgICAgIFN0cmluZyBydW50aW1lSWQgPSBlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZSIpOwotICAgICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8gd3NzcnQgPSBuZXcgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyhzZXJ2ZXJJZCwgcnVudGltZUlkLCB0eXBlSWQsIGVsZW0pOwotICAgICAgICAgIHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c3NydCk7Ci0KLSAgICAgICAgICBzZXRSdW50aW1lc0J5VHlwZSh0eXBlSWQscnVudGltZUlkKTsKLSAgICAgICAgICBzZXRTZXJ2ZXJzQnlUeXBlKHR5cGVJZCwgc2VydmVySWQpOwotICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICB9IAotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNTgsIHRoaXMsICJsb2FkVHlwZXMiLCBlKTsKLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICogU2V0cyB0aGUgV2ViIHNlcnZpY2UgcnVudGltZXMgYW5kIHR5cGUgZnJvbSBlYWNoIGV4dGVuc2lvbiAKLSAgKiBpbiBhIEhhc2h0YWJsZS4gIFRoZSB0eXBlIGlzIHRoZSBrZXksIGFuZCB2YWx1ZSBpcyBhIFZlY3RvciBjb250YWluaW5nIAotICAqIGVhY2ggcnVudGltZSBzdXBwb3J0ZWQgaW4gdGhhdCBXZWIgc2VydmljZSB0eXBlLgotICAqIEBwYXJhbSBydW50aW1lIG5hbWUKLSAgKiBAcGFyYW0gdHlwZSBuYW1lCi0gICovCi0gIHByaXZhdGUgdm9pZCBzZXRSdW50aW1lc0J5VHlwZShTdHJpbmcgdHlwZUlkLCBTdHJpbmcgcnVudGltZSkKLSAgewotICAgIGlmKHJ1bnRpbWVzQnlUeXBlXy5nZXQodHlwZUlkKSE9bnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IChWZWN0b3IpcnVudGltZXNCeVR5cGVfLmdldCh0eXBlSWQpOwotICAgICAgaWYgKCF2LmNvbnRhaW5zKHJ1bnRpbWUudHJpbSgpKSkgewotICAgICAgICB2LmFkZChydW50aW1lLnRyaW0oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBWZWN0b3IgdmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHZlY3QuYWRkKHJ1bnRpbWUudHJpbSgpKTsKLSAgICAgIHJ1bnRpbWVzQnlUeXBlXy5wdXQodHlwZUlkLHZlY3QpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUnVudGltZSBnZXRSdW50aW1lQnlJZCggU3RyaW5nIGlkICkKLSAgewotICAgIHJldHVybiAoV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldCggaWQgKTsgCi0gIH0KLSAgCi0gIC8qKgotICAqIEdldHMgdGhlIFdlYiBzZXZpY2UgcnVudGltZXMgdmVjdG9yIGdpdmVuIGEgdHlwZQotICAqIEBwYXJhbSBXZWIgc2VydmljZSB0eXBlCi0gICogQHJldHVybiBhcnJheSBvZiBydW50aW1lIGxhYmVscwotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZXNCeVR5cGUoU3RyaW5nIHdlYlNlcnZpY2VUeXBlKSAKLSAgewotICAgIFN0cmluZ1tdIHJ1bnRpbWVzOwotICAgIGlmIChydW50aW1lc0J5VHlwZV8uY29udGFpbnNLZXkod2ViU2VydmljZVR5cGUpKQotICAgIHsKLSAgICAgIFZlY3RvciB2ZWN0ID0oVmVjdG9yKXJ1bnRpbWVzQnlUeXBlXy5nZXQod2ViU2VydmljZVR5cGUpOwotICAgICAgcnVudGltZXMgPSBuZXcgU3RyaW5nW3ZlY3Quc2l6ZSgpXTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTx2ZWN0LnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgcnVudGltZUlkID0gKFN0cmluZyl2ZWN0LmVsZW1lbnRBdChpKTsKLSAgICAgICAgV2ViU2VydmljZVJ1bnRpbWUgd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQocnVudGltZUlkKTsKLSAgICAgICAgaWYgKHdzciE9bnVsbCkgewotICAgICAgICAgIHJ1bnRpbWVzW2ldID0gKFN0cmluZyl3c3IuZ2V0SWQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJ1bnRpbWVzOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNTksIHRoaXMsICJnZXRSdW50aW1lc0J5VHlwZSIsICJydW50aW1lcyBub3QgZm91bmQgZm9yIFdlYiBzZXJ2aWNlIHR5cGUgIit3ZWJTZXJ2aWNlVHlwZSk7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNSdW50aW1lU3VwcG9ydGVkRm9yVHlwZShTdHJpbmcgd2ViU2VydmljZVR5cGVJZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAJU3RyaW5nW10gcnVudGltZXMgPSBnZXRSdW50aW1lc0J5VHlwZSh3ZWJTZXJ2aWNlVHlwZUlkKTsKLQlmb3IoaW50IGk9MDtpPHJ1bnRpbWVzLmxlbmd0aDtpKyspCi0JewotICAJCWlmIChydW50aW1lc1tpXS5lcXVhbHMocnVudGltZUlkKSkKLSAgCQkgIHJldHVybiB0cnVlOwotCX0KLSAgCXJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbChTdHJpbmcgajJlZVZlcnNpb25JZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoSVdlYlNlcnZpY2VSdW50aW1lKXdlYlNlcnZpY2VSdW50aW1lcy5nZXQocnVudGltZUlkKTsKLSAgICBTdHJpbmdbXSBqMmVlVmVyc2lvbnMgPSB3c3IuZ2V0SjJFRVZlcnNpb25zKCk7Ci0gICAgaWYgKGoyZWVWZXJzaW9ucz09bnVsbCB8fCBqMmVlVmVyc2lvbnMubGVuZ3RoPT0wKSAKLSAgICAgIHJldHVybiB0cnVlOwotICAgIAotICAgIGZvcihpbnQgaT0wOyBpPGoyZWVWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoajJlZVZlcnNpb25zW2ldLmVxdWFscyhqMmVlVmVyc2lvbklkKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBkb2VzUnVudGltZVN1cHBvcnRTZXJ2ZXJUYXJnZXQoU3RyaW5nIHNlcnZlclRhcmdldElkLCBTdHJpbmcgcnVudGltZUlkKQotICB7Ci0gICAgSXRlcmF0b3IgaXQgPSB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgCi0gICAgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKWl0Lm5leHQoKTsKLSAgICAgIGlmICh3c3NydCE9bnVsbCkgewotICAgICAgICBpZiAod3NzcnQucnVudGltZUlkXy5lcXVhbHMocnVudGltZUlkKSkKLSAgICAgICAgewotICAgICAgICAgIElXZWJTZXJ2aWNlU2VydmVyIHdzc2VydmVyID0gZ2V0V2ViU2VydmljZVNlcnZlckJ5SWQod3NzcnQuc2VydmVySWRfKTsKLSAgICAgICAgICBTdHJpbmcgdGhpc0ZhY3RvcnlJZCA9IHdzc2VydmVyLmdldEZhY3RvcnlJZCgpOwotICAgICAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHRoaXNGYWN0b3J5SWQpOwotICAgICAgICAgIGlmIChzZXJ2ZXJUeXBlID09IG51bGwpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgdGhpc1NlcnZlclRhcmdldElkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7IAotICAgICAgICAgIGlmICh0aGlzU2VydmVyVGFyZ2V0SWQuZXF1YWxzKHNlcnZlclRhcmdldElkKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAKLSAgICByZXR1cm4gZmFsc2U7ICAKLSAgfQotICAKLSAgLyoqCi0gICogR2V0cyB0aGUgc2VydmVyIGZhY3RvcnlJRHMgb2YgYWxsIHdlYiBzZXJ2aWNlIHNlcnZlciBydW50aW1lIHR5cGUKLSAgKiB3aXRoIGFuIHJ1bnRpbWUgSUQgZXF1YWxzIHRvIHRoZSBpbnB1dAotICAqIEBwYXJhbSBydW50aW1lIElECi0gICogQHJldHVybiBhcnJheSBvZiBmYWN0b3J5IElEcwotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlEQnlSdW50aW1lSUQoU3RyaW5nIHJ1bnRpbWVJRCkgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8gd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXylpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQhPW51bGwpIHsKLSAgICAgICAgaWYgKHdzc3J0LnJ1bnRpbWVJZF8uZXF1YWxzKHJ1bnRpbWVJRCkpCi0gICAgICAgICAgdi5hZGQoZ2V0V2ViU2VydmljZVNlcnZlckJ5SWQod3NzcnQuc2VydmVySWRfKS5nZXRGYWN0b3J5SWQoKSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nW10gc2VydmVyRmFjdG9yeUlEcyA9IG5ldyBTdHJpbmdbdi5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykgewotICAgICAgc2VydmVyRmFjdG9yeUlEc1tpXSA9IChTdHJpbmcpdi5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SURzOwotICB9Ci0KLSAgLyoqCi0gICogR2V0cyB0aGUgcnVudGltZSBJRHMgb2YgYWxsIHdlYiBzZXJ2aWNlIHNlcnZlciBydW50aW1lIHR5cGUKLSAgKiB3aXRoIGFuIHNlcnZlciBmYWN0b3J5IElEIGVxdWFscyB0byB0aGUgaW5wdXQKLSAgKiBAcGFyYW0gc2VydmVyIGZhY3RvcnkgSUQKLSAgKiBAcmV0dXJuIGFycmF5IG9mIHJ1bnRpbWUgSURzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lSURzQnlTZXJ2ZXJGYWN0b3J5SUQoU3RyaW5nIHNlcnZlckZhY3RvcnlJRCkgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIEl0ZXJhdG9yIGl0ID0gd2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZV8gd3NzcnQgPSAoV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXylpdC5uZXh0KCk7Ci0gICAgICBpZiAod3NzcnQhPW51bGwpIHsKLSAgICAgIAlJV2ViU2VydmljZVNlcnZlciB3c3MgPSBnZXRXZWJTZXJ2aWNlU2VydmVyQnlJZCh3c3NydC5zZXJ2ZXJJZF8pOwotICAgICAgCVN0cmluZyB3c3NmSWQgPSB3c3MuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgICAJaWYgKHdzc2ZJZC5lcXVhbHMoc2VydmVyRmFjdG9yeUlEKSkKLSAgICAgIAl7Ci0gICAgICAJCWlmICghdi5jb250YWlucyh3c3NydC5ydW50aW1lSWRfKSkKLSAgICAgIAkJewotICAgICAgCQkJdi5hZGQod3NzcnQucnVudGltZUlkXyk7CQotICAgICAgCQl9ICAgICAgCQkKLSAgICAgIAl9Ci0gICAgICAgIC8qaWYgKGdldFdlYlNlcnZpY2VTZXJ2ZXJCeUlkKHdzc3J0LnNlcnZlcklkXykuZ2V0RmFjdG9yeUlkKCkuZXF1YWxzKHNlcnZlckZhY3RvcnlJRCkpCi0gICAgICAgICAgdi5hZGQoZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHdzc3J0LnJ1bnRpbWVJZF8pLmdldElkKCkpOyovCi0gICAgICB9Ci0gICAgfQotICAgIFN0cmluZ1tdIHJ1bnRpbWVJRHMgPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHJ1bnRpbWVJRHNbaV0gPSAoU3RyaW5nKXYuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gcnVudGltZUlEczsKLSAgfQotICAKLSAgLyoqCi0gICogU2V0cyB0aGUgV2ViIHNlcnZpY2Ugc2VydmVycyBhbmQgdHlwZSBmcm9tIGVhY2ggZXh0ZW5zaW9uIAotICAqIGluIGEgSGFzaHRhYmxlLiAgVGhlIHR5cGUgaXMgdGhlIGtleSwgYW5kIHZhbHVlIGlzIGEgVmVjdG9yIGNvbnRhaW5pbmcgCi0gICogZWFjaCBydW50aW1lIHN1cHBvcnRlZCBpbiB0aGF0IFdlYiBzZXJ2aWNlIHR5cGUuCi0gICogQHBhcmFtIHNlcnZlciBuYW1lCi0gICogQHBhcmFtIHR5cGUgbmFtZQotICAqLwotICBwcml2YXRlIHZvaWQgc2V0U2VydmVyc0J5VHlwZShTdHJpbmcgdHlwZUlkLCBTdHJpbmcgc2VydmVyKQotICB7Ci0gICAgaWYoc2VydmVyc0J5VHlwZV8uZ2V0KHR5cGVJZCkhPW51bGwpCi0gICAgewotICAgICAgVmVjdG9yIHYgPSAoVmVjdG9yKXNlcnZlcnNCeVR5cGVfLmdldCh0eXBlSWQpOwotICAgICAgaWYgKCF2LmNvbnRhaW5zKHNlcnZlci50cmltKCkpKSAKLSAgICAgIHsKLSAgICAgICAgdi5hZGQoc2VydmVyLnRyaW0oKSk7ICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBWZWN0b3IgdmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHZlY3QuYWRkKHNlcnZlci50cmltKCkpOwotICAgICAgc2VydmVyc0J5VHlwZV8ucHV0KHR5cGVJZCwgdmVjdCk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgKiBHZXRzIHRoZSBXZWIgc2VydmljZSBzZXJ2ZXJzIHZlY3RvciBnaXZlbiBhIHR5cGUKLSAgKiBAcGFyYW0gV2ViIHNlcnZpY2UgdHlwZQotICAqIEByZXR1cm4gYXJyYXkgb2Ygc2VydmVyIGZhY3RvcnkgSWRzCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKFN0cmluZyB3ZWJTZXJ2aWNlVHlwZSkgCi0gIHsKLSAgICBTdHJpbmdbXSBzZXJ2ZXJzOyAKLSAgICBpZiAoc2VydmVyc0J5VHlwZV8uY29udGFpbnNLZXkod2ViU2VydmljZVR5cGUpKQotICAgIHsKLSAgICAgIFZlY3RvciB2ZWN0ID0gKFZlY3RvcilzZXJ2ZXJzQnlUeXBlXy5nZXQod2ViU2VydmljZVR5cGUpOwotICAgICAgc2VydmVycyA9IG5ldyBTdHJpbmdbdmVjdC5zaXplKCldOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHZlY3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJJZCA9IChTdHJpbmcpdmVjdC5lbGVtZW50QXQoaSk7Ci0gICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHNlcnZlcklkKTsKLSAgICAgICAgaWYgKHdzcyE9bnVsbCkgewotICAgICAgICAgIHNlcnZlcnNbaV0gPSAoU3RyaW5nKXdzcy5nZXRGYWN0b3J5SWQoKTsgLy9Ob3RlOiByZXR1cm5pbmcgc2VydmVyIGZhY3RvcnkgSWRzCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBzZXJ2ZXJzOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgCi0gICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNjAsIHRoaXMsICJnZXRTZXJ2ZXJCeVR5cGUiLCAiV2ViIHNlcnZpY2Ugc2VydmVyIG5vdCBmb3VuZCBmb3IgV2ViIHNlcnZpY2UgdHlwZSAiK3dlYlNlcnZpY2VUeXBlKTsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIElXZWJTZXJ2aWNlUnVudGltZSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5TGFiZWwoU3RyaW5nIHJ1bnRpbWVMYWJlbCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlUnVudGltZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVJ1bnRpbWUgd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzciE9bnVsbCkgewotICAgICAgICBpZiAocnVudGltZUxhYmVsLmVxdWFscyh3c3IuZ2V0TGFiZWwoKSkpCi0gICAgICAgICAgcmV0dXJuIHdzcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZVJ1bnRpbWUgZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICByZXR1cm4gKElXZWJTZXJ2aWNlUnVudGltZSl3ZWJTZXJ2aWNlUnVudGltZXMuZ2V0KHJ1bnRpbWVJZCk7IAotICB9Ci0KLSAgcHVibGljIElXZWJTZXJ2aWNlU2VydmVyIGdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgaWYgKHNlcnZlckZhY3RvcnlJZD09bnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzIT1udWxsICYmIHdzcy5nZXRGYWN0b3J5SWQoKSE9bnVsbCkgewotICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkLmVxdWFscyh3c3MuZ2V0RmFjdG9yeUlkKCkpKSB7Ci0gICAgICAgICAgcmV0dXJuIHdzczsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gICAgCi0gIH0KLQotICBwdWJsaWMgSVdlYlNlcnZpY2VTZXJ2ZXIgZ2V0V2ViU2VydmljZVNlcnZlckJ5TGFiZWwoU3RyaW5nIHNlcnZlckxhYmVsKQotICB7Ci0gICAgaWYgKHNlcnZlckxhYmVsPT1udWxsKSAKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzcyE9bnVsbCkgewotICAgICAgICBpZiAoc2VydmVyTGFiZWwuZXF1YWxzKHdzcy5nZXRMYWJlbCgpKSkKLSAgICAgICAgICByZXR1cm4gd3NzOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJV2ViU2VydmljZVNlcnZlciBnZXRXZWJTZXJ2aWNlU2VydmVyQnlJZChTdHJpbmcgc2VydmVySWQpCi0gIHsKLSAgICByZXR1cm4gKElXZWJTZXJ2aWNlU2VydmVyKXdlYlNlcnZpY2VTZXJ2ZXJzLmdldChzZXJ2ZXJJZCk7Ci0gIH0KLQotICBwdWJsaWMgSVdlYlNlcnZpY2VUeXBlIGdldFdlYlNlcnZpY2VUeXBlQnlMYWJlbChTdHJpbmcgdHlwZUxhYmVsKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VUeXBlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlVHlwZUltcGwgd3N0ID0gKFdlYlNlcnZpY2VUeXBlSW1wbClpdGVyLm5leHQoKTsKLSAgICAgIGlmICh3c3QhPW51bGwpIHsKLSAgICAgICAgaWYgKHR5cGVMYWJlbC5lcXVhbHMod3N0LmdldExhYmVsKCkpKQotICAgICAgICAgIHJldHVybiB3c3Q7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIElXZWJTZXJ2aWNlVHlwZSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SWQoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIGlmICh3ZWJTZXJ2aWNlVHlwZXMuZ2V0KHR5cGVJZCkhPSBudWxsKQotICAgICAgcmV0dXJuIChXZWJTZXJ2aWNlVHlwZUltcGwpd2ViU2VydmljZVR5cGVzLmdldCh0eXBlSWQpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhbiBFSkIgcHJvamVjdCBpcyBuZWVkZWQgdG8gaG9zdCBhIFdlYiBzZXJ2aWNlCi0gICAqIG9mIHRoZSB0eXBlIGlkZW50aWZpZWQgYnkgdHlwZUlkLiBJZiBtdWx0aXBsZSBuYXR1cmVJZHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgCi0gICAqICJpbmNsdWRlTmF0dXJlcyIgYXR0cmlidXRlLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgY2hlY2tlZC4gSWYgbm8gbmF0dXJlSWRzIGFyZSBzcGVjaWZpZWQsIAotICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkICAKLSAgICogCVNob3VsZCBiZSByZWZhY3RvcmVkIGluIGZ1dHVyZSAKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzRUpCUHJvamVjdChTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVJZCk7Ci0gICAgaWYgKHdzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3N0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0gICAgICBTdHJpbmcgaW5jbHVkZWROYXR1cmVzID0gZWxlbS5nZXRBdHRyaWJ1dGUoImluY2x1ZGVOYXR1cmVzIik7Ci0gICAgICBpZiAoaW5jbHVkZWROYXR1cmVzPT1udWxsIHx8IGluY2x1ZGVkTmF0dXJlcy5sZW5ndGgoKT09MCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGVkTmF0dXJlcyk7Ci0gICAgICAgIGlmKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBmaXJzdEluY2x1ZGVkTmF0dXJlID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgaWYgKGZpcnN0SW5jbHVkZWROYXR1cmUuZXF1YWxzKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIHZhbGlkIHByb2plY3RzIGZvciB0aGUgV2ViIHNlcnZpY2UgdHlwZSB3aXRoIGFuIGlkIG9mIHR5cGVJZC4KLSAgICogSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIFdlYiBzZXJ2aWNlIHR5cGUgZXh0ZW5zaW9uIGRvZXMgbm90IHNwZWNpZnkgd2hpY2ggcHJvamVjdAotICAgKiBuYXR1cmVzIGFyZSBpbmNsdWRlZCwgYSBhcnJheSBvZiBhbGwgV2ViIGFuZCBFSkIgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSB3aWxsCi0gICAqIGJlIHJldHVybmVkLgotICAgKiBAcGFyYW0gdHlwZUlkCi0gICAqIEByZXR1cm4gSVByb2plY3RbXSBhbiBhcnJheSBvZiB2YWxpZCBwcm9qZWN0cwotICAgKi8KLSAgcHVibGljIElQcm9qZWN0W10gZ2V0UHJvamVjdHNCeVdlYlNlcnZpY2VUeXBlKFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotICAgIEFycmF5TGlzdCB2YWxpZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotLy8gICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0V2ViU2VydmljZVR5cGVCeUlkKHR5cGVJZCk7Ci0vLyAgICBpZiAod3N0ICE9IG51bGwpCi0vLyAgICB7Ci0KLQkJLy9UT0RPOiBUaGlzIHNlY3Rpb24gbmVlZHMgdG8gYmUgcmVmYWN0b3JlZCB0byBmaWx0ZXIgQXJ0aWZhY3RFZGl0cwotCQkvLyBhbmQgdXBob2xkIHByb2plY3QgdG9wb2xvZ3kgZGVzY3JpYmVkIGluIHRoZSBleHRlbnNpb24KLQkJCi0vLyAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3N0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0vLyAgICAgIFN0cmluZyBpbmNsdWRlZE5hdHVyZXMgPSBlbGVtLmdldEF0dHJpYnV0ZSgiaW5jbHVkZU5hdHVyZXMiKTsKLS8vICAgICAgU3RyaW5nIGV4Y2x1ZGVkTmF0dXJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKCJleGNsdWRlTmF0dXJlcyIpOwotLy8gICAgICBpZiAoaW5jbHVkZWROYXR1cmVzIT1udWxsICYmIGluY2x1ZGVkTmF0dXJlcy5sZW5ndGgoKT4wKQotLy8gICAgICB7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBpZiAoaW5jbHVkZShwcm9qZWN0c1tpXSwgaW5jbHVkZWROYXR1cmVzKSAmJiBleGNsdWRlKHByb2plY3RzW2ldLCBleGNsdWRlZE5hdHVyZXMpKQotLy8gICAgICAgICAgICB2YWxpZFByb2plY3RzLmFkZChwcm9qZWN0c1tpXSk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHJldHVybiAoSVByb2plY3RbXSl2YWxpZFByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKLS8vICAgICAgfQotLy8gICAgfQotICAgIAotICAgIC8vSWYgd3N0IHdhcyBudWxsIG9yIHRoZSBleHRlbnNpb24gZGlkbid0IHNwZWNpZnkgd2hpY2ggcHJvamVjdCBuYXR1cmVzIGFyZQotICAgIC8vIHRvIGJlIGluY2x1ZGVkLCByZXZlcnQgdG8gdGhlIG9sZCBiZWhhdmlvdXIKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHByb2plY3RzLmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0c1tqXSkgfHwgUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdHNbal0pKQotICAgICAgICB2YWxpZFByb2plY3RzLmFkZChwcm9qZWN0c1tqXSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gKElQcm9qZWN0W10pdmFsaWRQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBpbmNsdWRlKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmNsdWRlKTsKLSAgICB3aGlsZShzdC5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChwcm9qZWN0Lmhhc05hdHVyZShzdC5uZXh0VG9rZW4oKSkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGV4Y2x1ZGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGV4Y2x1ZGUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4Y2x1ZGUpOwotICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gU2VlIG1ldGhvZCBnZXRJbnN0YW5jZSgpLgotICAvLwotICBwcml2YXRlIHZvaWQgbG9hZCAoKQotICB7Ci0gICAgcnVudGltZXNCeVR5cGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHNlcnZlcnNCeVR5cGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGNvbmZpZ0VsZW1zQnlJZF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcnVudGltZUlkQnlMYWJlbF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcnVudGltZUxhYmVsQnlJZF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICB3ZWJTZXJ2aWNlU2VydmVycyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgd2ViU2VydmljZVJ1bnRpbWVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICB3ZWJTZXJ2aWNlVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIAotICAgIGxvYWRUeXBlcygpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlICgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgV2ViIFNlcnZpY2UgdHlwZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU8L2NvZGU+Ci0gICogb2JqZWN0cy4KLSAgKiBAcmV0dXJuIFRoZSBXZWIgU2VydmljZSB0eXBlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTwvY29kZT4KLSAgKiBvYmplY3RzLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVR5cGVOYW1lcygpCi0gIHsKLSAgICAKLSAgICBTdHJpbmdbXSB0eXBlcyA9IG5ldyBTdHJpbmdbd2ViU2VydmljZVR5cGVzLnNpemUoKV07Ci0KLSAgICBpbnQgaT0wOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSB3ZWJTZXJ2aWNlVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVR5cGVJbXBsIHdzdCA9IChXZWJTZXJ2aWNlVHlwZUltcGwpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3N0IT1udWxsKSB7Ci0gICAgICAgIHR5cGVzW2ldID0gd3N0LmdldExhYmVsKCk7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0gIAotICBwdWJsaWMgTGFiZWxzQW5kSWRzIGdldFNlcnZpY2VUeXBlTGFiZWxzKCkKLSAgewotICAgIExhYmVsc0FuZElkcyBsYWJlbElkcyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgICBJdGVyYXRvciAgICAgaXRlcmF0b3IgPSB3ZWJTZXJ2aWNlVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICBpbnQgICAgICAgICAgc2l6ZSAgICAgPSB3ZWJTZXJ2aWNlVHlwZXMuc2l6ZSgpOwotICAgIFN0cmluZ1tdICAgICBsYWJlbHMgICA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgU3RyaW5nW10gICAgIGlkcyAgICAgID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICBpbnQgICAgICAgICAgaW5kZXggICAgPSAwOwotICAgIAotICAgIGxhYmVsSWRzLnNldExhYmVsc18oIGxhYmVscyApOwotICAgIGxhYmVsSWRzLnNldElkc18oIGlkcyApOwotICAgIAotICAgIHdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSAKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlVHlwZUltcGwgdHlwZSA9IChXZWJTZXJ2aWNlVHlwZUltcGwpaXRlcmF0b3IubmV4dCgpOwotICAgICAgCi0gICAgICBpZHNbaW5kZXhdICAgID0gdHlwZS5nZXRJZCgpOwotICAgICAgbGFiZWxzW2luZGV4XSA9IHR5cGUuZ2V0TGFiZWwoKTsKLSAgICAgIGluZGV4Kys7Ci0gICAgfSAgICAKLSAgICAKLSAgICByZXR1cm4gbGFiZWxJZHM7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBnaXZlbiB0aGUgc2VydmVyLCBydW50aW1lLCBhbmQgdHlwZSBhdHRyaWJ1dGVzCi0gICogVGhlIGJlbmVmaXQgb2YgZ2V0dGluZyB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGlzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3MKLSAgKiBmaWxlIGFuZCBwbHVnaW4gYXJlIG5vdCBsb2FkZWQgaW1tZWRpYXRlbHkuCi0gICogQHBhcmFtIHNlcnZlciBsYWJlbAotICAqIEBwYXJhbSBydW50aW1lIGxhYmVsCi0gICogQHBhcmFtIHR5cGUgbGFiZWwKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihTdHJpbmcgc2VydmVySWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBpZiAoc2VydmVySWQ9PW51bGwgfHwgcnVudGltZUlkPT1udWxsIHx8IHR5cGVJZD09bnVsbCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzc3J0IT1udWxsICkgewotICAgICAgICBpZiAod3NzcnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySWQsIHJ1bnRpbWVJZCwgdHlwZUlkKSE9bnVsbCkKLSAgICAgICAgICByZXR1cm4gd3NzcnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySWQsIHJ1bnRpbWVJZCx0eXBlSWQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudEZvcihTdHJpbmcgZmFjdG9yeUlkLCBTdHJpbmcgcnVudGltZUlkLCBTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXyB3c3NydCA9IChXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKWl0ZXIubmV4dCgpOwotICAgICAgICBpZiAod3NzcnQuaGFzQ29uZmlnRWxlbWVudEZvcihmYWN0b3J5SWQsIHJ1bnRpbWVJZCwgdHlwZUlkKSkgewotICAgICAgICAgIHJldHVybiB3c3NydC5lbGVtZW50XzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNXZWJNb2R1bGVGb3IoU3RyaW5nIHNlcnZlciwgU3RyaW5nIHJ1bnRpbWUsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudEZvcihzZXJ2ZXIsIHJ1bnRpbWUsIHR5cGUpOwotICAgIGlmIChlbGVtPT1udWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsgIC8vIHJlcG9ydCBlcnJvciBoZXJlIGluc3RlYWQKLSAgICB9Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihlbGVtLmdldEF0dHJpYnV0ZSgicmVxdWlyZVdlYk1vZHVsZSIpKS5ib29sZWFuVmFsdWUoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzRUpCTW9kdWxlRm9yKFN0cmluZyBzZXJ2ZXIsIFN0cmluZyBydW50aW1lLCBTdHJpbmcgdHlwZSkKLSAgewotICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsgICAgCi0gICAgaWYgKGVsZW09PW51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGVsZW0uZ2V0QXR0cmlidXRlKCJyZXF1aXJlRUpCTW9kdWxlIikpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIDxjb2RlPldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZTwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgU2VydmVyLAotICAqIFJ1bnRpbWUsIGFuZCBXZWIgU2VydmljZSBUeXBlLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiB3ZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVFeGlzdHMoU3RyaW5nIHNlcnZlcklELCBTdHJpbmcgcnVudGltZUlELCBTdHJpbmcgdHlwZUlEKSAKLSAgewotICAgIHJldHVybiAoZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVySUQsIHJ1bnRpbWVJRCwgdHlwZUlEKSAhPSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSA8Y29kZT5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNlcnZlciwKLSAgKiBSdW50aW1lLCBhbmQgV2ViIFNlcnZpY2UgVHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVOYW1lKFN0cmluZyBzZXJ2ZXIsIFN0cmluZyBydW50aW1lLCBTdHJpbmcgdHlwZSkgCi0gIHsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsKLSAgICByZXR1cm4gKGVsZW09PW51bGwgPyBudWxsIDogZWxlbS5nZXRBdHRyaWJ1dGUoImlkIikpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgPGNvZGU+V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPC9jb2RlPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBTZXJ2ZXIsIAotICAqIFJ1bnRpbWUsIGFuZCBXZWIgU2VydmljZSB0eXBlLiBUaGlzIHdpbGwgcmV0dXJuIHRoZSA8Y29kZT5XZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGU8L2NvZGU+Ci0gICogb2JqZWN0IGFuZCBzZXQgdGhlIHByb3BlcnRpZXMgZm91bmQgaW4gdGhlIG1hbmlmZXN0IGZpbGUuIGkuZS4gaXNXZWJNb2R1bGVSZXF1aXJlZCwgaXNFSkJNb2R1bGVSZXF1aXJlZAotICAqIEBwYXJhbSBzZXJ2ZXIgbGFiZWwKLSAgKiBAcGFyYW0gcnVudGltZSBsYWJlbAotICAqIEBwYXJhbSBXZWIgc2VydmljZSB0eXBlCi0gICogQHJldHVybiBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgb2JqZWN0Ci0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGUgZ2V0V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlKFN0cmluZyBzZXJ2ZXIsIFN0cmluZyBydW50aW1lLCBTdHJpbmcgdHlwZSkKLSAgewotCi0gICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIHdzc3J0ID0gbnVsbDsKLSAgICBTdHJpbmcgc2VydmVySWQgPSBnZXRXZWJTZXJ2aWNlU2VydmVyQnlGYWN0b3J5SWQoc2VydmVyKS5nZXRJZCgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsKLSAgIAotICAgIGlmKCBlbGVtID09IG51bGwgKQotICAgIHsKLSAgICAgIC8vIFdlIGNvdWxkbid0IGZpbmQgdGhlIHNlcnZlciBhbmQgcnVudGltZSBzcGVjaWZpZWQgc28gd2Ugd2lsbAotICAgICAgLy8gZmluZCB0aGUgZGVmYXVsdCBzZXJ2ZXIgYW5kIHJ1bnRpbWUuCi0gICAgICAKLSAgICAgIHNlcnZlciAgPSBnZXREZWZhdWx0U2VydmVyVmFsdWVGb3IodHlwZSk7Ci0gICAgICBydW50aW1lID0gZ2V0RGVmYXVsdFJ1bnRpbWVWYWx1ZUZvcih0eXBlKTsKLQotICAgICAgZWxlbSA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKHNlcnZlciwgcnVudGltZSwgdHlwZSk7Ci0gICAgICAKLSAgICB9Ci0gICAKLSAgICByZXR1cm4gd3NzcnQ7Ci0KLSAgfQotCi0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgPGNvZGU+V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlPC9jb2RlPiBnaXZlbiB0aGUgdHlwZSBuYW1lLgotICAqIEBwYXJhbSB0eXBlIG5hbWUKLSAgKiBAcmV0cnVuIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBvYmplY3QKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSBnZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVCeUlkKFN0cmluZyBpZCkKLSAgewotICAgIFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSB3c3NydCA9IG51bGw7Ci0gICAgaWYgKGNvbmZpZ0VsZW1zQnlJZF8uY29udGFpbnNLZXkoaWQpKQotICAgIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gKElDb25maWd1cmF0aW9uRWxlbWVudCljb25maWdFbGVtc0J5SWRfLmdldChpZCk7Ci0gICAgICAgIE9iamVjdCB3ZWJTZXJ2aWNlVHlwZSA9IGVsZW0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VUeXBlIGluc3RhbmNlb2YgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlKSAKLSAgICAgICAgewotICAgICAgICAgIHdzc3J0ID0gKFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSl3ZWJTZXJ2aWNlVHlwZTsKLSAgICAgICAgICB3c3NydC5zZXRTZXJ2ZXJMYWJlbChlbGVtLmdldEF0dHJpYnV0ZSgic2VydmVyIikpOwotICAgICAgICAgIHdzc3J0LnNldFJ1bnRpbWVMYWJlbChlbGVtLmdldEF0dHJpYnV0ZSgicnVudGltZSIpKTsKLSAgICAgICAgICB3c3NydC5zZXRXZWJNb2R1bGVSZXF1aXJlZCggQm9vbGVhbi52YWx1ZU9mKGVsZW0uZ2V0QXR0cmlidXRlKCJyZXF1aXJlV2ViTW9kdWxlIikpLmJvb2xlYW5WYWx1ZSgpICk7Ci0gICAgICAgICAgd3NzcnQuc2V0RUpCTW9kdWxlUmVxdWlyZWQoIEJvb2xlYW4udmFsdWVPZihlbGVtLmdldEF0dHJpYnV0ZSgicmVxdWlyZUVKQk1vZHVsZSIpKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbXBsZW1lbnRlZEludGVyZmFjZSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MudWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSAiOwotICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAiRXh0ZW5zaW9ucyBvZiB0aGUgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlcyBleHRlbnNpb24gcG9pbnQgbXVzdCBpbXBsZW1lbnQgdGhlICI7Ci0gICAgICAgICAgZXJyTXNnID0gZXJyTXNnICsgaW1wbGVtZW50ZWRJbnRlcmZhY2UgKyAiaW50ZXJmYWNlLiI7Ci0gICAgICAgICAgbG9nXy5sb2coTG9nLkVSUk9SLCA1MDYxLCB0aGlzLCAiZ2V0V2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlQnlJZCIsIGVyck1zZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwNjIsIHRoaXMsICJnZXRXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVCeUlkIiwgY2UpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB3c3NydDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVHlwZUJ5U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotCi0gICAgVHlwZVNlbGVjdGlvbkZpbHRlciB0c2YgPSBuZXcgVHlwZVNlbGVjdGlvbkZpbHRlcigpOwotICAgIFN0cmluZ1tdIHdzdCA9IHRzZi5nZXRXZWJTZXJ2aWNlVHlwZUJ5SW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb24sIHdlYlNlcnZpY2VUeXBlcyk7Ci0gICAgcmV0dXJuIHdzdCA9PSBudWxsID8gbnVsbCA6IHdzdDsKLQotICB9Ci0KLSAgcHVibGljIElXZWJTZXJ2aWNlVHlwZSBnZXRXZWJTZXJ2aWNlVHlwZUJ5VHlwZUxhYmVsKFN0cmluZyB3ZWJTZXJ2aWNlVHlwZUxhYmVsKQotICB7Ci0KLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVR5cGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VUeXBlSW1wbCB3c3QgPSAoV2ViU2VydmljZVR5cGVJbXBsKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzdCE9bnVsbCkgewotICAgICAgICBpZiAod3N0LmdldExhYmVsKCkuZXF1YWxzKHdlYlNlcnZpY2VUeXBlTGFiZWwpKSB7Ci0gICAgICAgICAgcmV0dXJuIHdzdDsgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxTZWxlY3Rpb25WYWxpZEZvckNob3NlblR5cGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdbXSBzdXBwb3J0ZWRUeXBlcyA9IGdldFdlYlNlcnZpY2VUeXBlQnlTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICBpZiAoc3VwcG9ydGVkVHlwZXMhPW51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHN1cHBvcnRlZFR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoc3VwcG9ydGVkVHlwZXNbaV0uZXF1YWxzKHR5cGVOYW1lKSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHNlcnZlcklEKQotICB7Ci0gICAgaWYgKHNlcnZlcnNCeVR5cGVfLmNvbnRhaW5zS2V5KHR5cGVJZCkpCi0gICAgewotICAgICAgVmVjdG9yIHZlY3QgPSAoVmVjdG9yKXNlcnZlcnNCeVR5cGVfLmdldCh0eXBlSWQpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHZlY3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KChTdHJpbmcpdmVjdC5lbGVtZW50QXQoaSkpOwotICAgICAgICBpZiAoc2VydmVySUQhPW51bGwpIHsKLSAgICAgICAgICBpZiAoc2VydmVySUQuZXF1YWxzSWdub3JlQ2FzZSh3c3MuZ2V0RmFjdG9yeUlkKCkpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc1NlcnZlclJ1bnRpbWVUeXBlU3VwcG9ydGVkKFN0cmluZyBzZXJ2ZXIsIFN0cmluZyBydW50aW1lLCBTdHJpbmcgdHlwZSkgIHsKLQotICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIHdzc3J0ID0gbnVsbDsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRGb3Ioc2VydmVyLCBydW50aW1lLCB0eXBlKTsKLSAgICAgIHJldHVybiBlbGVtID09IG51bGwgPyBmYWxzZSA6IHRydWU7IAotICAgICAgICAgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXJ2ZXJWYWx1ZUZvcihTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgU3RyaW5nW10gc2VydmVyczsgCi0gICAgaWYgKHNlcnZlcnNCeVR5cGVfLmNvbnRhaW5zS2V5KHR5cGVJZCkpCi0gICAgewotICAgICAgVmVjdG9yIHZlY3QgPSAoVmVjdG9yKXNlcnZlcnNCeVR5cGVfLmdldCh0eXBlSWQpOwotICAgICAgc2VydmVycyA9IG5ldyBTdHJpbmdbdmVjdC5zaXplKCldOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHZlY3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzZXJ2ZXJJZCA9IChTdHJpbmcpdmVjdC5lbGVtZW50QXQoaSk7Ci0gICAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpd2ViU2VydmljZVNlcnZlcnMuZ2V0KHNlcnZlcklkKTsKLSAgICAgICAgc2VydmVyc1tpXSA9IChTdHJpbmcpd3NzLmdldElkKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2VydmVyc1swXTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxvZ18ubG9nKExvZy5FUlJPUiwgNTA2MywgdGhpcywgImdldFNlcnZlckJ5VHlwZSIsICJVbmFibGUgdG8gZmluZCBkZWZhdWx0IHNlcnZlciBmb3IgIit0eXBlSWQpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lVmFsdWVGb3IoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFN0cmluZ1tdIHJ1bnRpbWVOYW1lID0gZ2V0UnVudGltZXNCeVR5cGUodHlwZUlkKTsKLSAgICBmb3IgKGludCBpPTA7IGk8cnVudGltZU5hbWUubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgICBXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWUpd2ViU2VydmljZVJ1bnRpbWVzLmdldChydW50aW1lTmFtZVtpXSk7Ci0gICAgICAgIGlmICh3c3IuZ2V0SXNEZWZhdWx0KCkpCi0gICAgICAgIAlyZXR1cm4gcnVudGltZU5hbWVbaV07Ci0gICAgfSAgIAotICAgIHJldHVybiBydW50aW1lTmFtZVswXTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJJZEZvckZhY3RvcnlJZChTdHJpbmcgZmFjdG9yeUlkKSB7Ci0KLSAgICBJdGVyYXRvciBpdGVyID0gd2ViU2VydmljZVNlcnZlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIFdlYlNlcnZpY2VTZXJ2ZXIgd3NzID0gKFdlYlNlcnZpY2VTZXJ2ZXIpaXRlci5uZXh0KCk7Ci0gICAgICBpZiAod3NzLmdldEZhY3RvcnlJZCgpLmVxdWFscyhmYWN0b3J5SWQpKSB7Ci0gICAgICAgIHJldHVybiB3c3MuZ2V0SWQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0KLSAgfQotIAotICBwdWJsaWMgZmluYWwgY2xhc3MgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlXwotICB7Ci0gICAgCi0gICBwdWJsaWMgU3RyaW5nIHR5cGVJZF87Ci0gICBwdWJsaWMgU3RyaW5nIHNlcnZlcklkXzsKLSAgIHB1YmxpYyBTdHJpbmcgcnVudGltZUlkXzsKLSAgIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudF87Ci0gICAKLSAgIHB1YmxpYyBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVfKFN0cmluZyBzZXJ2ZXJJZCwgU3RyaW5nIHJ1bnRpbWVJZCxTdHJpbmcgdHlwZUlkLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkKLSAgIHsKLSAgICB0aGlzLnR5cGVJZF8gPSB0eXBlSWQ7Ci0gICAgdGhpcy5zZXJ2ZXJJZF8gPSBzZXJ2ZXJJZDsKLSAgICB0aGlzLnJ1bnRpbWVJZF8gPSBydW50aW1lSWQ7Ci0gICAgdGhpcy5lbGVtZW50XyA9IGVsZW07Ci0gICB9Ci0gICAgCi0gICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50Rm9yKFN0cmluZyBzZXJ2ZXJJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkKLSAgIHsKLSAgICBpZiAodGhpcy50eXBlSWRfLmVxdWFscyh0eXBlSUQpICYmIHRoaXMuc2VydmVySWRfLmVxdWFscyhzZXJ2ZXJJRCkgJiYgdGhpcy5ydW50aW1lSWRfLmVxdWFscyhydW50aW1lSUQpKQotICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudF87Ci0gICAgcmV0dXJuIG51bGw7Ci0gICB9Ci0gICAKLSAgIHB1YmxpYyBib29sZWFuIGhhc0NvbmZpZ0VsZW1lbnRGb3IoU3RyaW5nIGZhY3RvcnlJRCwgU3RyaW5nIHJ1bnRpbWVJRCwgU3RyaW5nIHR5cGVJRCkgCi0gICB7Ci0gICAgIFN0cmluZyBzZXJ2ZXJJRCA9IGdldFNlcnZlcklkRm9yRmFjdG9yeUlkKCBmYWN0b3J5SUQgKTsgCi0gICAgICAgCi0gICAgIGlmICh0eXBlSWRfLmVxdWFsc0lnbm9yZUNhc2UodHlwZUlEKSAmJgotICAgICAgICAgc2VydmVySWRfLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmVySUQpICYmCi0gICAgICAgICBydW50aW1lSWRfLmVxdWFsc0lnbm9yZUNhc2UocnVudGltZUlEKSkKLSAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgfQotICAgICAKLSAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAKLSAgfQotCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSBnZXRGYWN0b3J5RmFjdG9yeSggU3RyaW5nW10gaWRzICkKLSAgewotICAgIFN0cmluZyAgICAgICAgICAgICAgICBoYXNoS2V5ID0gaWRzWzJdICsgIiMiICsgaWRzWzFdICsgIiMiICsgaWRzWzBdOwotICAgIENvbW1hbmRXaWRnZXRCaW5kaW5nICBiaW5kaW5nID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKWZhY3RvcnlDYWNoZV8uZ2V0KCBoYXNoS2V5ICk7Ci0gICAgCi0gICAgaWYoIGJpbmRpbmcgPT0gbnVsbCApIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZ2V0Q29uZmlnRWxlbWVudEZvciggaWRzWzJdLCBpZHNbMV0sIGlkc1swXSApOyAKLSAgICAKLSAgICAgIGlmKCBlbGVtZW50ID09IG51bGwgKSByZXR1cm4gbnVsbDsKLSAgICAKLSAgICAgIGJpbmRpbmcgPSBjcmVhdGVCaW5kaW5nKCBlbGVtZW50ICk7Ci0gICAgICAKLSAgICAgIGZhY3RvcnlDYWNoZV8ucHV0KCBoYXNoS2V5LCBiaW5kaW5nICk7Ci0gICAgICAKLSAgICAgIGJpbmRpbmcucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFNYXBwaW5nUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIGlmKCB3aWRnZXRSZWdpc3RyeV8gIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgICAgIGJpbmRpbmcucmVnaXN0ZXJDYW5GaW5pc2goIGNhbkZpbmlzaFJlZ2lzdHJ5XyApOwotICAgICAgfQotICAgIH0KLSAgICAgICAgIAotICAgIHJldHVybiBiaW5kaW5nOyAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSBDb21tYW5kV2lkZ2V0QmluZGluZyBjcmVhdGVCaW5kaW5nKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ICkgCi0gIHsKLSAgICBWZWN0b3IgYmluZGluZ3MgPSBuZXcgVmVjdG9yKDQpOwotICAgIFZlY3RvciBmcmFnbWVudHMgPSBuZXcgVmVjdG9yKDQpOwotICAgIAotICAgIGFkZEJpbmRpbmcoIGVsZW1lbnQsICJkZXZlbG9wQmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImFzc2VtYmx5QmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgYWRkQmluZGluZyggZWxlbWVudCwgImRlcGxveUJpbmRpbmciLCBiaW5kaW5ncyApOwotICAgIGFkZEJpbmRpbmcoIGVsZW1lbnQsICJpbnN0YWxsQmluZGluZyIsIGJpbmRpbmdzICk7Ci0gICAgCi0gICAgZnJhZ21lbnRzLmFkZCggbmV3IFNlcnZpY2VQcmVEZXZlbG9wRnJhZ21lbnQoKSApOwotICAgIGZyYWdtZW50cy5hZGQoIG5ldyBTZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudCgpICk7Ci0gICAgZnJhZ21lbnRzLmFkZCggbmV3IFNlcnZpY2VQcmVEZXBsb3lGcmFnbWVudCgpICk7Ci0gICAgZnJhZ21lbnRzLmFkZCggbmV3IFNlcnZpY2VQcmVJbnN0YWxsRnJhZ21lbnQoKSApOwotICAgICAKLSAgICByZXR1cm4gbmV3IENvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdCggYmluZGluZ3MsIGZyYWdtZW50cyApOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYWRkQmluZGluZyggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBiaW5kaW5nTmFtZSwgVmVjdG9yIGxpc3QgKQotICB7Ci0gICAgT2JqZWN0IGJpbmRpbmcgPSBudWxsOwotICAgIAotICAgIGlmKCBlbGVtZW50LmdldEF0dHJpYnV0ZSggYmluZGluZ05hbWUgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZyA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbiggYmluZGluZ05hbWUgKTsgCi0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBsaXN0LmFkZCggYmluZGluZyApOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnlfID0gcmVnaXN0cnk7Ci0gICAgCi0gICAgLy8gV2UgbmVlZCB0byByZWJ1aWxkIHRoZSBmYWN0b3J5IGNhY2hlIGVhY2ggdGltZSB3ZSBzdGFydCB0aGUgc2VydmVyCi0gICAgLy8gd2l6YXJkLgotICAgIGZhY3RvcnlDYWNoZV8gICAgICAgID0gbmV3IEhhc2hNYXAoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V2lkZ2V0UmVnaXN0cnkoIFdpZGdldFJlZ2lzdHJ5IHJlZ2lzdHJ5ICkKLSAgewotICAgIHdpZGdldFJlZ2lzdHJ5XyA9IHJlZ2lzdHJ5OzsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDYW5GaW5pc2hSZWdpc3RyeSggQ2FuRmluaXNoUmVnaXN0cnkgcmVnaXN0cnkgKQotICB7Ci0gICAgY2FuRmluaXNoUmVnaXN0cnlfID0gcmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QWxsU2VydmVyRmFjdG9yeUlkcygpCi0gIHsKLSAgCU9iamVjdFtdIHNlcnZlcnMgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS50b0FycmF5KCk7Ci0gIAlTdHJpbmdbXSBmYWN0b3J5SWRzID0gbmV3IFN0cmluZ1tzZXJ2ZXJzLmxlbmd0aF07Ci0gIAlmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgCXsKLSAgCQlXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKXNlcnZlcnNbaV07Ci0gIAkJZmFjdG9yeUlkc1tpXSA9IHdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgCX0KLSAgCXJldHVybiBmYWN0b3J5SWRzOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZEZyb21TZXJ2ZXJJZChTdHJpbmcgc2VydmVySWQpCi0gIHsKLSAgCU9iamVjdFtdIHNlcnZlcnMgPSB3ZWJTZXJ2aWNlU2VydmVycy52YWx1ZXMoKS50b0FycmF5KCk7Ci0gIAlmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgCXsKLSAgCQlXZWJTZXJ2aWNlU2VydmVyIHdzcyA9IChXZWJTZXJ2aWNlU2VydmVyKXNlcnZlcnNbaV07Ci0gIAkJaWYgKHNlcnZlcklkID09IHdzcy5nZXRJZCgpKQotICAJCXsKLSAgCQkJcmV0dXJuIHdzcy5nZXRGYWN0b3J5SWQoKTsKLSAgCQl9Ci0gIAkJCQotICAJfQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIFJldHVybnMgYSBjYXNjYWRpbmcgbGlzdCBvZiB2YWxpZCBjaG9pY2VzIGZvciBzZXJ2ZXIsIHJ1bnRpbWUsIGFuZCBKMkVFIGxldmVscy4gCi0gICAqIFRoaXMgaXMgYW4gaW50ZXJzZWN0aW9uIG9mIHdoYXQgaXMgYXZhaWxhYmxlIGZvciBzZXJ2aWNlIGFuZCBjbGllbnQuIAotICAgKi8KLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGdldFNlcnZlclRvUnVudGltZVRvSjJFRSgpCi0gIHsKLSAgCWlmIChzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfIT1udWxsKQotICAJewotICAJCXJldHVybiBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfOwotICAJfQotICAJCi0gIAlTdHJpbmdbXSBzZXJ2ZXJzID0gZ2V0U3RyaW5nQXJyYXlJbnRlcnNlY3Rpb24oZ2V0QWxsU2VydmVyRmFjdG9yeUlkcygpLCBXZWJTZXJ2aWNlQ2xpZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0QWxsQ2xpZW50U2VydmVyRmFjdG9yeUlkcygpKTsKLSAgICBTZWxlY3Rpb25MaXN0IHNlcnZlcnNMaXN0ID0gbmV3IFNlbGVjdGlvbkxpc3Qoc2VydmVycywgMCk7Ci0gICAgVmVjdG9yIGNob2ljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPHNlcnZlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgIAljaG9pY2VzLmFkZChnZXRSdW50aW1lQ2hvaWNlcyhzZXJ2ZXJzW2ldKSk7Ci0gICAgfQotICAgIHNlcnZlclRvUnVudGltZVRvSjJFRV8gPSBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMoc2VydmVyc0xpc3QsIGNob2ljZXMpOwotICAgIHJldHVybiBzZXJ2ZXJUb1J1bnRpbWVUb0oyRUVfOwotICAJCi0gIH0KLSAgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0UnVudGltZUNob2ljZXMoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJU3RyaW5nW10gc2VydmljZVJ1bnRpbWVzID0gZ2V0UnVudGltZUlEc0J5U2VydmVyRmFjdG9yeUlEKHNlcnZlckZhY3RvcnlJZCk7Ci0gIAlTdHJpbmdbXSBjbGllbnRSdW50aW1lcyA9IFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRSdW50aW1lSWRzQnlTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkKTsKLSAgCVN0cmluZ1tdIHJ1bnRpbWVzID0gZ2V0U3RyaW5nQXJyYXlJbnRlcnNlY3Rpb24oc2VydmljZVJ1bnRpbWVzLCBjbGllbnRSdW50aW1lcyk7Ci0gIAlTZWxlY3Rpb25MaXN0IHJ1bnRpbWVzTGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KHJ1bnRpbWVzLCAwKTsKLSAgCVZlY3RvciBjaG9pY2VzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDsgaTxydW50aW1lcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgCWNob2ljZXMuYWRkKGdldEoyRUVDaG9pY2VzKHJ1bnRpbWVzW2ldKSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMocnVudGltZXNMaXN0LCBjaG9pY2VzKTsgICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0SjJFRUNob2ljZXMoU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAJU3RyaW5nW10gc2VydmljZUoyRUVWZXJzaW9ucyA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpLmdldEoyRUVWZXJzaW9ucygpOwotICAJU3RyaW5nW10gY2xpZW50SjJFRVZlcnNpb25zID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpLmdldEoyRUVWZXJzaW9ucygpOwotICAJU3RyaW5nW10gajJlZVZlcnNpb25zID0gZ2V0U3RyaW5nQXJyYXlJbnRlcnNlY3Rpb24oc2VydmljZUoyRUVWZXJzaW9ucywgY2xpZW50SjJFRVZlcnNpb25zKTsKLSAgCVNlbGVjdGlvbkxpc3QgajJlZVZlcnNpb25zTGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KGoyZWVWZXJzaW9ucywgMCk7Ci0gIAlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGoyZWVWZXJzaW9uc0xpc3QsIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckxhYmVsKFN0cmluZyBmYWN0b3J5SWQpCi0gIHsKLSAgCWlmIChmYWN0b3J5SWQ9PW51bGwgfHwgZmFjdG9yeUlkLmxlbmd0aCgpPT0wKQotICAJCXJldHVybiBudWxsOwotICAJCi0gIAlpZiAoc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8uY29udGFpbnNLZXkoZmFjdG9yeUlkKSkKLSAgCXsKLSAgCSAgcmV0dXJuIChTdHJpbmcpc2VydmVyTGFiZWxCeUZhY3RvcnlJZF8uZ2V0KGZhY3RvcnlJZCk7Ci0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gIAkgIHJldHVybiBudWxsOwotICAJfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgCWlmIChsYWJlbD09bnVsbCB8fCBsYWJlbC5sZW5ndGgoKT09MCkKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCQotICAJaWYgKHNlcnZlckZhY3RvcnlJZEJ5TGFiZWxfLmNvbnRhaW5zS2V5KGxhYmVsKSkKLSAgCXsKLSAgCSAgcmV0dXJuIChTdHJpbmcpc2VydmVyRmFjdG9yeUlkQnlMYWJlbF8uZ2V0KGxhYmVsKTsgIAotICAJfQotICAJZWxzZQotICAJewotICAJICByZXR1cm4gbnVsbDsKLSAgCX0gIAkgIAkKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lTGFiZWwoU3RyaW5nIGlkKQotICB7Ci0gIAlpZiAoaWQ9PW51bGwgfHwgaWQubGVuZ3RoKCk9PTApCi0gIAkJcmV0dXJuIG51bGw7Ci0gIAkKLSAgCXJldHVybiAoU3RyaW5nKSBydW50aW1lTGFiZWxCeUlkXy5nZXQoaWQpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVJZChTdHJpbmcgbGFiZWwpCi0gIHsKLSAgCWlmIChsYWJlbD09bnVsbCB8fCBsYWJlbC5sZW5ndGgoKT09MCkKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCQotICAJcmV0dXJuIChTdHJpbmcpcnVudGltZUlkQnlMYWJlbF8uZ2V0KGxhYmVsKTsgIAkKLSAgfSAgCi0gIAotICBwcml2YXRlIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5SW50ZXJzZWN0aW9uKFN0cmluZ1tdIGExLCBTdHJpbmdbXSBhMikKLSAgewotICAJVmVjdG9yIHZmID0gbmV3IFZlY3RvcigpOwotICAJaWYgKGExPT1udWxsIHx8IGEyPT1udWxsKQotICAJewotICAJCXJldHVybiBjb252ZXJ0VG9TdHJpbmdBcnJheSh2Zi50b0FycmF5KCkpOwotICAJfSAgCQotICAJCi0gIAlmb3IgKGludCBpPTA7IGk8YTEubGVuZ3RoOyBpKyspCi0gIAl7Ci0gIAkJZm9yIChpbnQgaj0wOyBqPGEyLmxlbmd0aDsgaisrKQotICAJCXsKLSAgCQkJaWYgKGExW2ldLmVxdWFscyhhMltqXSkpCi0gIAkJCXsKLSAgCQkJCXZmLmFkZChhMVtpXSk7Ci0gIAkJCQlicmVhazsKLSAgCQkJfQotICAJCX0KLSAgCX0KLSAgCQotICAJcmV0dXJuIGNvbnZlcnRUb1N0cmluZ0FycmF5KHZmLnRvQXJyYXkoKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gY29udmVydFRvU3RyaW5nQXJyYXkoT2JqZWN0W10gYSkKLSAgewotICAJaWYgKGE9PW51bGwpIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAJCi0gIAlpbnQgbGVuZ3RoID0gYS5sZW5ndGg7Ci0gIAlTdHJpbmdbXSBzYSA9IG5ldyBTdHJpbmdbbGVuZ3RoXTsKLSAgCWZvciAoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykKLSAgCXsKLSAgCQlPYmplY3Qgb2JqID0gYVtpXTsKLSAgCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQotICAJCXsKLSAgCQkJc2FbaV0gPSAoU3RyaW5nKW9iajsKLSAgCQl9Ci0gIAl9Ci0gIAlyZXR1cm4gc2E7Ci0gIH0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGY0ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZDsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGEga2luZCBvZgotKiBXZWIgU2VydmljZSBhcnRpZmFjdC4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIFdlYlNlcnZpY2VUeXBlCi0qIG9iamVjdCBpcyB0byBtYW51ZmFjdHVyZSB0aGUgd2l6YXJkIHBhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgdHlwZS4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VUeXBlCi17Ci0gIC8qKgotICAqIFJldHVybnMgYSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqIEByZXR1cm4gQSBzaG9ydCwgbG9jYWxlIHNwZWNpZmljIG5hbWUgb2YgdGhpcyBXZWIgU2VydmljZSB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjlkZTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL1dlYlNlcnZpY2VUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhIGtpbmQgb2YKLSogV2ViIFNlcnZpY2UgYXJ0aWZhY3QuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYSBXZWJTZXJ2aWNlVHlwZQotKiBvYmplY3QgaXMgdG8gbWFudWZhY3R1cmUgdGhlIHdpemFyZCBwYWdlcyB0aGF0IHN1cHBvcnQgdGhlIHR5cGUuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUeXBlSW1wbCBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudF87Ci0gIHB1YmxpYyBTdHJpbmcgdHlwZUlkXzsKLSAgcHVibGljIFN0cmluZyB0eXBlTGFiZWxfOwotICBwdWJsaWMgU3RyaW5nW10gZXh0ZW5zaW9uTWV0YWRhdGFfOwotICBwdWJsaWMgU3RyaW5nW10gcmVzb3VyY2VUeXBlTWV0YWRhdGFfOwotICBwdWJsaWMgQm9vbGVhbiBjYW5GaW5pc2hfOwotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlVHlwZUltcGwoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0pCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWxlbWVudF8gPSBlbGVtOyAKLSAgfQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICogQHJldHVybiBpZCBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQgKCkKLSAgewotICAgIGlmICh0eXBlSWRfPT1udWxsKQotICAgICAgdHlwZUlkXyA9IGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICByZXR1cm4gdHlwZUlkXzsKLSAgfQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKiBAcmV0dXJuIEEgc2hvcnQsIGxvY2FsZSBzcGVjaWZpYyBuYW1lIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCAoKQotICB7Ci0gICAgaWYgKHR5cGVMYWJlbF8gPT0gbnVsbCkKLSAgICAgIHR5cGVMYWJlbF8gPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgcmV0dXJuIHR5cGVMYWJlbF87ICAgIAotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyBleHRlbnNpb24gbWV0YWRhdGEuCi0gICogQHJldHVybiBBIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyBleHRlbnNpb24gbWV0YWRhdGEuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRFeHRlbnNpb25NZXRhZGF0YSAoKQotICB7Ci0gICAgaWYgKGV4dGVuc2lvbk1ldGFkYXRhXyA9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImV4dGVuc2lvbk1ldGFkYXRhIikpOwotICAgICAgZXh0ZW5zaW9uTWV0YWRhdGFfID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLSAgICAgIGludCBpPTA7Ci0gICAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBleHRlbiA9IChTdHJpbmcpc3QubmV4dFRva2VuKCk7Ci0gICAgICAgIGlmIChleHRlbiE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGV4dGVuc2lvbk1ldGFkYXRhX1tpXT1leHRlbjsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgICByZXR1cm4gdGhpcy5leHRlbnNpb25NZXRhZGF0YV87Ci0gIH0gICAgCi0KLSAgLyoqCi0gICogUmV0dXJucyBhIGxvY2FsZSBzcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIFdlYiBTZXJ2aWNlIHR5cGUncyByZXNvdXJjZSBtZXRhZGF0YS4KLSAgKiBAcmV0dXJuIEEgbG9jYWxlIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgV2ViIFNlcnZpY2UgdHlwZSdzIHJlc291cmNlIG1ldGFkYXRhLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VUeXBlTWV0YWRhdGEgKCkKLSAgewotICAgIGlmIChyZXNvdXJjZVR5cGVNZXRhZGF0YV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVsZW1lbnRfLmdldEF0dHJpYnV0ZSgicmVzb3VyY2VUeXBlTWV0YWRhdGEiKSk7ICAgIAotICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGFfID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLSAgICAgIGludCBpPTA7Ci0gICAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZXNvdXJjZVR5cGUgPSAoU3RyaW5nKXN0Lm5leHRUb2tlbigpOwotICAgICAgICBpZiAocmVzb3VyY2VUeXBlIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGFfW2ldPXJlc291cmNlVHlwZTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXNvdXJjZVR5cGVNZXRhZGF0YV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsdWdpbi54bWwgY29udGFpbnMgYW4gYXR0cmlidXRlIG9mICJjYW5GaW5pc2giIHdpdGggYSB2YWx1ZSBvZiB0cnVlLiAgT3RoZXJ3aXNlLCAKLSAgKiBmYWxzZSBpcyByZXR1cm5lZC4gIE5vdGU6IGlmIHRoZSAiY2FuRmluaXNoIiBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCB0cnVlIGlzIHJldHVybmVkIGJ5IGRlZmF1bHQuCi0gICogQHJldHVybiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB1c2VyIGNhbiBmaW5pc2ggb24gdGhlIHBhZ2VzIGJlZm9yZSB0aGUgd2ViIHNlcnZpY2UgdHlwZSBwYWdlcy4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuRmluaXNoKCkKLSAgewotICAgIGlmKCBjYW5GaW5pc2hfID09IG51bGwgKQotICAgIHsgICAgICAKLSAgICAgIFN0cmluZyBjYW5GaW5pc2hTdHJpbmcgPSBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoImNhbkZpbmlzaCIpOwotCi0gICAgICBjYW5GaW5pc2hfID0gY2FuRmluaXNoU3RyaW5nID09IG51bGwgPyBuZXcgQm9vbGVhbiggdHJ1ZSApIDogQm9vbGVhbi52YWx1ZU9mKCBjYW5GaW5pc2hTdHJpbmcgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2FuRmluaXNoXy5ib29sZWFuVmFsdWUoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGgKLSAgICogdGhpcyB0eXBlLgotICAgKiAKLSAgICogQHJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ci0gICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkKLSAgewotICAgIHJldHVybiB0aGlzLmVsZW1lbnRfOyAKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCkKLSAgewotICAgIHJldHVybiBlbGVtZW50Xy5nZXRBdHRyaWJ1dGUoIm9iamVjdFNlbGVjdGlvbldpZGdldCIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC9XZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTgyMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvV2ViU2VydmljZVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUeXBlUmVnaXN0cnkKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHR5cGVzQnlOYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSB0eXBlTmFtZXNfOwotCi0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBUaGlzIGlzIGRvbmUgYnkgcXVlcnlpbmcgdGhlIHBsdWdpbiByZWdpc3RyeSBmb3IgYWxsIGV4dGVuc2lvbnMKLSAgLy8gaGFuZ2luZyBvbiB0aGUgd2ViU2VydmljZVR5cGUgZXh0ZW5zaW9uIHBvaW50LiBFeHRlbnNpb25zCi0gIC8vIG11c3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5qc3Qud3MudWkud2l6YXJkLldlYlNlcnZpY2VUeXBlCi0gIC8vIGludGVyZmFjZS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRUeXBlcyAoKQotICB7Ci0gIAlMb2cgbG9nID0gbmV3IEVjbGlwc2VMb2coKTsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJTZXJ2aWNlVHlwZSIpOwotCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICBPYmplY3Qgd2ViU2VydmljZVR5cGUgPSBlbGVtLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgIGlmICh3ZWJTZXJ2aWNlVHlwZSBpbnN0YW5jZW9mIFdlYlNlcnZpY2VUeXBlKSAKLSAgICAgICAgewotICAgICAgICAgIGFkZCgoV2ViU2VydmljZVR5cGUpd2ViU2VydmljZVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbXBsZW1lbnRlZEludGVyZmFjZSA9ICJvcmcuZWNsaXBzZS5qc3Qud3MudWkud2l6YXJkLldlYlNlcnZpY2VUeXBlICI7Ci0gICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJFeHRlbnNpb25zIG9mIHRoZSB3ZWJTZXJ2aWNlVHlwZXMgZXh0ZW5zaW9uIHBvaW50IG11c3QgaW1wbGVtZW50IHRoZSAiOwotICAgICAgICAgIGVyck1zZyA9IGVyck1zZyArIGltcGxlbWVudGVkSW50ZXJmYWNlICsgImludGVyZmFjZS4iOwotICAgICAgCSAgbG9nLmxvZyhMb2cuRVJST1IsIDUwNTYsIHRoaXMsICJsb2FkVHlwZXMiLCBlcnJNc2cpOwotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAJbG9nLmxvZyhMb2cuRVJST1IsIDUwNTcsIHRoaXMsICJsb2FkVHlwZXMiLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLwotICAvLyBMb2FkcyBXZWJTZXJ2aWNlVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gU2VlIG1ldGhvZCBnZXRJbnN0YW5jZSgpLgotICAvLwotICBwcml2YXRlIHZvaWQgbG9hZCAoKQotICB7Ci0gICAgdHlwZXNCeU5hbWVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGxvYWRUeXBlcygpOwotICAgIGluZGV4VHlwZXNCeU5hbWUoKTsKLSAgfQotCi0gIC8vCi0gIC8vIEFkZCB0aGUgZ2l2ZW4gV2ViU2VydmljZVR5cGUgdG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gU2VlIG1ldGhvZCBsb2FkKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBhZGQgKCBXZWJTZXJ2aWNlVHlwZSB3c3QgKQotICB7Ci0gICAgdHlwZXNCeU5hbWVfLnB1dCh3c3QuZ2V0TmFtZSgpLHdzdCk7Ci0gIH0KLQotICAvLwotICAvLyBCdWlsZHMgYW4gaW5kZXggb2YgV2ViU2VydmljZVR5cGUgb2JqZWN0cyBieSB0aGVpciBuYW1lcy4KLSAgLy8gU2VlIG1ldGhvZCBsb2FkKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBpbmRleFR5cGVzQnlOYW1lICgpCi0gIHsKLSAgICBpZiAodHlwZU5hbWVzXyA9PSBudWxsKQotICAgIHsKLSAgICAgIHR5cGVOYW1lc18gPSBuZXcgU3RyaW5nW3R5cGVzQnlOYW1lXy5zaXplKCldOwotICAgICAgRW51bWVyYXRpb24gZSA9IHR5cGVzQnlOYW1lXy5rZXlzKCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgdHlwZU5hbWVzX1tpXSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdlYlNlcnZpY2VUeXBlUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZV8gPSBuZXcgV2ViU2VydmljZVR5cGVSZWdpc3RyeSgpOwotICAgICAgaW5zdGFuY2VfLmxvYWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+IG9iamVjdHMuCi0gICogQHJldHVybiBBbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VUeXBlW10gZ2V0V2ViU2VydmljZVR5cGVzICgpCi0gIHsKLSAgICBXZWJTZXJ2aWNlVHlwZVtdIHdzdHMgPSBuZXcgV2ViU2VydmljZVR5cGVbdHlwZXNCeU5hbWVfLnNpemUoKV07Ci0gICAgRW51bWVyYXRpb24gZSA9IHR5cGVzQnlOYW1lXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIHdzdHNbaV0gPSAoV2ViU2VydmljZVR5cGUpZS5uZXh0RWxlbWVudCgpOwotICAgIH0KLSAgICByZXR1cm4gd3N0czsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPgotICAqIG9iamVjdHMuCi0gICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+Ci0gICogb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUeXBlTmFtZXMgKCkKLSAgewotICAgIHJldHVybiB0eXBlTmFtZXNfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+IG9iamVjdCBvZiB0aGUgZ2l2ZW4KLSAgKiA8Y29kZT5uYW1lPC9jb2RlPiBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggb2JqZWN0LgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gdG8gZmluZC4KLSAgKiBAcmV0dXJuIFRoZSA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb3IgbnVsbCBpZiBubyBzdWNoIG9iamVjdAotICAqIHdhcyBmb3VuZC4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VUeXBlIGdldFdlYlNlcnZpY2VUeXBlQnlOYW1lICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgcmV0dXJuIChuYW1lID09IG51bGwgPyBudWxsIDogKFdlYlNlcnZpY2VUeXBlKXR5cGVzQnlOYW1lXy5nZXQobmFtZSkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5SUJNLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeUlCTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODZjZDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5SUJNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeUlCTSBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5SUJNKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFdTUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS5pYm0uY29tL3Vici9pbnF1aXJ5YXBpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpLmlibS5jb20vdWJyL3B1Ymxpc2hhcGkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLmlibS5jb20vdWJyL3JlZ2lzdHJ5Lmh0bWwiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlJQk1UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlODYyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeUlCTVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5SUJNVGVzdCBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5SUJNVGVzdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9JQk1fVEVTVCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS5pYm0uY29tL3Rlc3RyZWdpc3RyeS9pbnF1aXJ5YXBpIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpLmlibS5jb20vdGVzdHJlZ2lzdHJ5L3B1Ymxpc2hhcGkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLmlibS5jb20vdGVzdHJlZ2lzdHJ5L3JlZ2lzdHJ5Lmh0bWwiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMjViY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0IGltcGxlbWVudHMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpLm1pY3Jvc29mdC5jb20vaW5xdWlyZSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS5taWNyb3NvZnQuY29tL3B1Ymxpc2giOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS5taWNyb3NvZnQuY29tL3JlZ2lzdGVyLmFzcHgiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlNaWNyb3NvZnRUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyYTM1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU1pY3Jvc29mdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0VGVzdCBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5TWljcm9zb2Z0VGVzdCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlRfVEVTVCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdGVzdC51ZGRpLm1pY3Jvc29mdC5jb20vaW5xdWlyZSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdGVzdC51ZGRpLm1pY3Jvc29mdC5jb20vcHVibGlzaCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RyYXRpb25VUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3Rlc3QudWRkaS5taWNyb3NvZnQuY29tL3JlZ2lzdGVyLmFzcHgiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlOVFRDb21tLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU5UVENvbW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmYmE0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeU5UVENvbW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGx1Z2luLldTUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbSBpbXBsZW1lbnRzIFB1YmxpY1VERElSZWdpc3RyeVR5cGUKLXsKLQotICAgIC8vIENvcHlyaWdodAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgICBwdWJsaWMgUHVibGljVURESVJlZ2lzdHJ5TlRUQ29tbSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9OVFRDT01NIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cudWRkaS5uZS5qcC91YnIvaW5xdWlyeWFwaSI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vd3d3LnVkZGkubmUuanAvdWJyL3B1Ymxpc2hhcGkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly93d3cubnR0LmNvbS91ZGRpLyI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlTQVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjMmE4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlTQVAgaW1wbGVtZW50cyBQdWJsaWNVRERJUmVnaXN0cnlUeXBlCi17Ci0KLSAgICAvLyBDb3B5cmlnaHQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gICAgcHVibGljIFB1YmxpY1VERElSZWdpc3RyeVNBUCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVAiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cDovL3VkZGkuc2FwLmNvbS9VRERJL2FwaS9pbnF1aXJ5LyI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHBzOi8vdWRkaS5zYXAuY29tL1VEREkvYXBpL3B1Ymxpc2gvIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS5zYXAuY29tLyI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVNBUFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGJlZWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5U0FQVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQudWRkaTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaWNVRERJUmVnaXN0cnlTQVBUZXN0IGltcGxlbWVudHMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlTQVBUZXN0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFdTUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCIlUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1NBUF9URVNUIik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkgewotICAgICAgICByZXR1cm4gImh0dHA6Ly91ZGRpdGVzdC5zYXAuY29tL1VEREkvYXBpL2lucXVpcnkvIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hVUkwoKSB7Ci0gICAgICAgIHJldHVybiAiaHR0cHM6Ly91ZGRpdGVzdC5zYXAuY29tL1VEREkvYXBpL3B1Ymxpc2gvIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaXRlc3Quc2FwLmNvbS8iOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aXphcmQvdWRkaS9QdWJsaWNVRERJUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkOWU2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLnVkZGk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0cmF0aW9uVVJMKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5WE1ldGhvZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2l6YXJkL3VkZGkvUHVibGljVURESVJlZ2lzdHJ5WE1ldGhvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyZDZlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpemFyZC91ZGRpL1B1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbi5XU1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFB1YmxpY1VERElSZWdpc3RyeVhNZXRob2RzIGltcGxlbWVudHMgUHVibGljVURESVJlZ2lzdHJ5VHlwZQotewotCi0gICAgLy8gQ29weXJpZ2h0Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDIuIjsKLQotICAgIHB1YmxpYyBQdWJsaWNVRERJUmVnaXN0cnlYTWV0aG9kcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiJVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9YTUVUSE9EUyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICAgICAgLy9yZXR1cm4gImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIjsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vdWRkaS54bWV0aG9kcy5uZXQvaW5xdWlyZTIiOwotICAgIH0KLQotICAgIC8vIFJlYWQtb25seSByZWdpc3RyeS4gVGhlIHB1Ymxpc2ggYW5kIHJlZ2lzdHJhdGlvbiBVUkxzIGRvbid0IGV4aXN0LgotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaFVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwczovL3VkZGkueG1ldGhvZHMubmV0L3B1Ymxpc2gyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICAgICAgcmV0dXJuICJodHRwOi8vd3d3LnhtZXRob2RzLm5ldC92ZTIvUmVnaXN0ZXIucG8/ZXZlbnQ9cmVnaXN0ZXJPcmciOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE0NmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NpbC9BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2lsLkFkZFdTRExUb1dTSUxDb21tYW5kOwotCi0KLQotcHVibGljIGNsYXNzIEFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBBZGRXU0RMVG9XU0lMQ29tbWFuZCBjb21tYW5kOwotICBwcml2YXRlIEFyZ3VtZW50cyBhcmdzOwotCi0gIHB1YmxpYyBBZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsLkFkZFdTRExUb1dTSUxXcmFwcGVyQ29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbC5BZGRXU0RMVG9XU0lMV3JhcHBlckNvbW1hbmQiKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBpZiAoY29tbWFuZCA9PSBudWxsKQotICAgICAgY29tbWFuZCA9IG5ldyBBZGRXU0RMVG9XU0lMQ29tbWFuZCgpOwotICAgIGlmICghYXJncy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgY29tbWFuZC5zZXRBcmd1bWVudHMoYXJncy5nZXRTdHJpbmdBcmd1bWVudHMoKSk7Ci0gICAgICBjb21tYW5kLnNldFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcihuZXcgRGlhbG9nV1dXQXV0aGVudGljYXRpb24oUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKSk7Ci0gICAgICByZXR1cm4gY29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3MgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXJncyhBcmd1bWVudHMgYXJncykKLSAgewotICAgIHRoaXMuYXJncyA9IGFyZ3M7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGNvbW1hbmQgVGhlIGNvbW1hbmQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChBZGRXU0RMVG9XU0lMQ29tbWFuZCBjb21tYW5kKQotICB7Ci0gICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvQXJndW1lbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTc3YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0FyZ3VtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c2lsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEFyZ3VtZW50cwotewotICBwcml2YXRlIFZlY3RvciBhcmdzXzsKLQotICBwdWJsaWMgQXJndW1lbnRzKCkKLSAgewotICAgIGFyZ3NfID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGFyZ3NfLmFkZChrZXkpOwotICAgIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgYXJnc18uYWRkKHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcga2V5KQotICB7Ci0gICAgaW50IGluZGV4ID0gYXJnc18uaW5kZXhPZihrZXkpOwotICAgIGlmIChpbmRleCA+PSAwKQotICAgIHsKLSAgICAgIGFyZ3NfLnJlbW92ZShpbmRleCk7Ci0gICAgICBhcmdzXy5yZW1vdmUoaW5kZXgrMSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkKLSAgewotICAgIGludCBpbmRleCA9IGFyZ3NfLmluZGV4T2Yoa2V5KTsKLSAgICBpZiAoaW5kZXggPj0gMCkKLSAgICAgIHJldHVybiBhcmdzXy5nZXQoaW5kZXgrMSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbGVhcigpCi0gIHsKLSAgICBhcmdzXy5jbGVhcigpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdFtdIGdldEFyZ3VtZW50cygpCi0gIHsKLSAgICBPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFthcmdzXy5zaXplKCldOwotICAgIGFyZ3NfLmNvcHlJbnRvKGFyZ3MpOwotICAgIHJldHVybiBhcmdzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ0FyZ3VtZW50cygpCi0gIHsKLSAgICBTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1thcmdzXy5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLSAgICAgIGFyZ3NbaV0gPSBhcmdzXy5nZXQoaSkudG9TdHJpbmcoKTsKLSAgICByZXR1cm4gYXJnczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotICB7Ci0gICAgcmV0dXJuIGFyZ3NfLmlzRW1wdHkoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL0RpYWxvZ1dXV0F1dGhlbnRpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvRGlhbG9nV1dXQXV0aGVudGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmOWQ1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvRGlhbG9nV1dXQXV0aGVudGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25IYW5kbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbiBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcgotewotCi0gIC8qQ09OVEVYVF9JRCBEQkFTMDAwMSBmb3IgdGhlIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gdXNlciBuYW1lKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9EQkFTX1VTRVJOQU1FID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLkRCQVMwMDAxIjsKLQotICAvKkNPTlRFWFRfSUQgREJBUzAwMDIgZm9yIHRoZSBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHBhc3N3b3JkKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9EQkFTX1BBU1NXT1JEID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uSUQgKyAiLkRCQVMwMDAyIjsKLQotICBwcml2YXRlIFN0cmluZyB1c2VybmFtZVN0cmluZ187Ci0gIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkU3RyaW5nXzsKLQotICBwcml2YXRlIFRleHQgdXNlcm5hbWVfOwotICBwcml2YXRlIFRleHQgcGFzc3dvcmRfOwotCi0gIHByaXZhdGUgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24gd3d3YWVfOwotCi0gIHB1YmxpYyBEaWFsb2dXV1dBdXRoZW50aWNhdGlvbihTaGVsbCBzaGVsbCkKLSAgewotICAgIHN1cGVyKHNoZWxsKTsKLSAgICB1c2VybmFtZVN0cmluZ18gPSBudWxsOwotICAgIHBhc3N3b3JkU3RyaW5nXyA9IG51bGw7Ci0gICAgd3d3YWVfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKQotICB7Ci0gICAgdXNlcm5hbWVTdHJpbmdfID0gbnVsbDsKLSAgICBwYXNzd29yZFN0cmluZ18gPSBudWxsOwotICAgIHN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgcHJlc3NlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIFN0cmluZyB1c2VybmFtZVN0cmluZyA9IHVzZXJuYW1lXy5nZXRUZXh0KCk7Ci0gICAgdXNlcm5hbWVTdHJpbmdfID0gKHVzZXJuYW1lU3RyaW5nLmxlbmd0aCgpID4gMCkgPyB1c2VybmFtZVN0cmluZyA6IG51bGw7Ci0gICAgU3RyaW5nIHBhc3N3b3JkU3RyaW5nID0gcGFzc3dvcmRfLmdldFRleHQoKTsKLSAgICBwYXNzd29yZFN0cmluZ18gPSAocGFzc3dvcmRTdHJpbmcubGVuZ3RoKCkgPiAwKSA/IHBhc3N3b3JkU3RyaW5nIDogbnVsbDsKLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5PSyk7Ci0gICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGx9LgotICAqIEBwYXJhbSBzaGVsbCBUaGUgc2hlbGwuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9IVFRQX0JBU0lDX0FVVEgiKSk7Ci0gIH0KLQotICAvKiogCi0gICogQ3JlYXRlcyB0aGUgZGlhbG9nIGFyZWEuCi0gICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLSAgKiBAcmV0dXJuIFRoZSBjb250cm9sIGFyZWEuCi0gICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gNDAwOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wudmVydGljYWxTcGFjaW5nID0gMTU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0KLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9VUkwiKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KHd3d2FlXy5nZXRVUkwoKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICBsYWJlbC5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUiKSk7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLSAgICB1c2VybmFtZV8gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgIHVzZXJuYW1lXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICB1c2VybmFtZV8uc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodXNlcm5hbWVfLCBJTkZPUE9QX0RCQVNfVVNFUk5BTUUpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgbGFiZWwuc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEIikpOwotICAgIGxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCi0gICAgcGFzc3dvcmRfID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICBwYXNzd29yZF8uc2V0RWNob0NoYXIoJyonKTsKLSAgICBwYXNzd29yZF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgcGFzc3dvcmRfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRCIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVzZXJuYW1lXywgSU5GT1BPUF9EQkFTX1BBU1NXT1JEKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dJZCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRNZXNzYWdlKG1zZ0lkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVdXV0F1dGhlbnRpY2F0aW9uKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlKQotICB7Ci0gICAgdXNlcm5hbWVTdHJpbmdfID0gbnVsbDsKLSAgICBwYXNzd29yZFN0cmluZ18gPSBudWxsOwotICAgIHd3d2FlXyA9IHd3d2FlOwotICAgIG9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHVzZXJuYW1lU3RyaW5nXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKQotICB7Ci0gICAgcmV0dXJuIHBhc3N3b3JkU3RyaW5nXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1RhYmxlVmlld2VyRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVGFibGVWaWV3ZXJFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5OGMxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVGFibGVWaWV3ZXJFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzaWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIFRhYmxlVmlld2VyRWRpdG9yIGV4dGVuZHMgQ29tcG9zaXRlCi17Ci0gIHByaXZhdGUgaW50IERFRkFVTFRfVEFCTEVfSEVJR0hUX0hJTlQgPSAxMDA7Ci0gIHByaXZhdGUgaW50IERFRkFVTFRfQ09MVU1OX1dJRFRIID0gODA7Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5zXzsKLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcl87Ci0gIHByaXZhdGUgVGFibGUgdGFibGVfOwotICBwcml2YXRlIFRhYmxlRWRpdG9yIGVkaXRvcl87Ci0gIHByaXZhdGUgVGFibGVFZGl0b3JMaXN0ZW5lciB0YWJsZUVkaXRvckxpc3RlbmVyXzsKLSAgcHJpdmF0ZSBUZXh0IHRleHRfOwotICBwcml2YXRlIEJ1dHRvbiBhZGRfOwotICBwcml2YXRlIEJ1dHRvbiByZW1vdmVfOwotCi0gIHByaXZhdGUgTGlzdCB2YWx1ZXNfOwotICBwcml2YXRlIE9iamVjdCBkZWZhdWx0VmFsdWVfOwotCi0gIHB1YmxpYyBUYWJsZVZpZXdlckVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBjb2x1bW5zLCBMaXN0IGluaXRWYWx1ZXMsIE9iamVjdCBkZWZhdWx0VmFsdWUpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBjb2x1bW5zXyA9IGNvbHVtbnM7Ci0gICAgdmFsdWVzXyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoaW5pdFZhbHVlcyAhPSBudWxsICYmIGluaXRWYWx1ZXMuc2l6ZSgpID4gMCkKLSAgICAgIHZhbHVlc18uYWRkQWxsKGluaXRWYWx1ZXMpOwotICAgIGRlZmF1bHRWYWx1ZV8gPSAoZGVmYXVsdFZhbHVlICE9IG51bGwpID8gZGVmYXVsdFZhbHVlIDogbmV3IFN0cmluZygiIik7Ci0gICAgY3JlYXRlUGFydENvbnRyb2wodGhpcyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIHNldExheW91dChnbCk7Ci0gICAgc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChnbCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgdGFibGVfID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IERFRkFVTFRfVEFCTEVfSEVJR0hUX0hJTlQ7Ci0gICAgdGFibGVfLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlXy5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIHRhYmxlXy5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLSAgICBpbnQgbWF4V2lkdGggPSBERUZBVUxUX0NPTFVNTl9XSURUSDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNfLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlXywgU1dULk5PTkUpOwotICAgICAgdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5zX1tpXSk7Ci0gICAgICB0YWJsZUNvbHVtbi5wYWNrKCk7Ci0gICAgICBpbnQgdGFibGVDb2x1bW5XaWR0aCA9IE1hdGgubWF4KERFRkFVTFRfQ09MVU1OX1dJRFRILCB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpKTsKLSAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIHRhYmxlQ29sdW1uV2lkdGgpOwotICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEodGFibGVDb2x1bW5XaWR0aCwgdGFibGVDb2x1bW5XaWR0aCwgdHJ1ZSk7Ci0gICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkRhdGEpOwotICAgIH0KLSAgICB0YWJsZV8uc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLSAgICAvLyBpbml0aWFsaXplIHRoZSB0YWJsZSBlZGl0b3IKLSAgICBlZGl0b3JfID0gbmV3IFRhYmxlRWRpdG9yKHRhYmxlXyk7Ci0gICAgLy8gVGhlIGVkaXRvciBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgY2VsbCBhbmQgbXVzdAotICAgIC8vIG5vdCBiZSBhbnkgc21hbGxlciB0aGFuIDUwIHBpeGVscy4KLSAgICBlZGl0b3JfLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuTEVGVDsKLSAgICBlZGl0b3JfLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLSAgICBlZGl0b3JfLm1pbmltdW1XaWR0aCA9IG1heFdpZHRoOwotICAgIHRhYmxlRWRpdG9yTGlzdGVuZXJfID0gbmV3IFRhYmxlRWRpdG9yTGlzdGVuZXIoKTsKLSAgICB0YWJsZV8uYWRkTW91c2VMaXN0ZW5lcih0YWJsZUVkaXRvckxpc3RlbmVyXyk7Ci0gICAgdGFibGVWaWV3ZXJfID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlXyk7Ci0gICAgdGFibGVWaWV3ZXJfLmdldENvbnRyb2woKS5hZGRLZXlMaXN0ZW5lcigKLSAgICAgIG5ldyBLZXlMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIERlbAotICAgICAgICAgIGlmICgoKGludCllLmNoYXJhY3RlcikgPT0gMTI3KSAKLSAgICAgICAgICAgIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKTsKLSAgICAgICAgICAvLyBFbnRlciBvciBzcGFjZQotICAgICAgICAgIGlmICgoKGludCllLmNoYXJhY3RlcikgPT0gMTMgfHwgKChpbnQpZS5jaGFyYWN0ZXIpID09IDMyKQotICAgICAgICAgICAgdGFibGVFZGl0b3JMaXN0ZW5lcl8uZWRpdFNlbGVjdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldENvbnRlbnRQcm92aWRlcihuZXcgTGlzdENvbnRlbnRQcm92aWRlcigpKTsKLSAgICB0YWJsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcihuZXcgTGlzdExhYmVsUHJvdmlkZXIoKSk7Ci0gICAgdGFibGVWaWV3ZXJfLnNldElucHV0KHZhbHVlc18pOwotICAgIHRhYmxlVmlld2VyXy5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0gICAgICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgICAgZW5hYmxlUmVtb3ZlKHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLQotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0gICAgYWRkXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgYWRkXy5zZXRUZXh0KFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9BREQiKSk7Ci0gICAgYWRkXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBhZGRfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotICAgICAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotCi0gICAgcmVtb3ZlXyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgcmVtb3ZlXy5zZXRUZXh0KFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9SRU1PVkUiKSk7Ci0gICAgcmVtb3ZlXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICByZW1vdmVfLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotICAgICAgbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChldmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGVuYWJsZVJlbW92ZShmYWxzZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5hYmxlUmVtb3ZlKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICAgIHJlbW92ZV8uc2V0RW5hYmxlZChlbmFibGVkICYmICF0YWJsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICAgIHZhbHVlc18uYWRkKGRlZmF1bHRWYWx1ZV8pOwotICAgIHJlZnJlc2goKTsKLSAgICBzZXRTZWxlY3Rpb25Bc09iamVjdCh2YWx1ZXNfLmdldCh0YWJsZV8uZ2V0SXRlbUNvdW50KCktMSkpOwotICAgIHRhYmxlRWRpdG9yTGlzdGVuZXJfLmVkaXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgewotICAgIGhhbmRsZURlbGV0ZUtleVByZXNzZWQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoYW5kbGVEZWxldGVLZXlQcmVzc2VkKCkKLSAgewotICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXJfLmdldFNlbGVjdGlvbigpOwotICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotICAgIHsKLSAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IHRhYmxlXy5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgaW50IHNlbGVjdGlvbkNvdW50ID0gdGFibGVfLmdldEl0ZW1Db3VudCgpOwotICAgICAgdmFsdWVzXy5yZW1vdmUoc2VsZWN0aW9uSW5kZXgpOwotICAgICAgaWYgKHNlbGVjdGlvbkluZGV4IDwgc2VsZWN0aW9uQ291bnQtMSkKLSAgICAgICAgc2V0U2VsZWN0aW9uQXNPYmplY3QodmFsdWVzXy5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGlvbkNvdW50IC0yID49IDApCi0gICAgICAgIHNldFNlbGVjdGlvbkFzT2JqZWN0KHZhbHVlc18uZ2V0KHNlbGVjdGlvbkNvdW50LTIpKTsKLSAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW50ZXJuYWxSZWZyZXNoKCkKLSAgewotICAgIC8vIHN5bmNocm9uaXplIHRleHQgZmllbGQsIHByZXZpb3VzbHkgc2VsZWN0ZWQgdGFibGUgY2VsbCBhbmQgbW9kZWwgKGlucHV0T2JqZWN0KQotICAgIGlmICh0ZXh0XyAhPSBudWxsKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSBvbGRUYWJsZUl0ZW0gPSBlZGl0b3JfLmdldEl0ZW0oKTsKLSAgICAgIGludCBvbGRDb2x1bW5JbmRleCA9IGVkaXRvcl8uZ2V0Q29sdW1uKCk7Ci0gICAgICBpZiAob2xkVGFibGVJdGVtICE9IG51bGwgJiYgb2xkQ29sdW1uSW5kZXggPj0gMCAmJiBvbGRDb2x1bW5JbmRleCA8IGNvbHVtbnNfLmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG9sZFRleHQgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0gICAgICAgIG9sZFRhYmxlSXRlbS5zZXRUZXh0KG9sZENvbHVtbkluZGV4LCBvbGRUZXh0KTsKLSAgICAgICAgaW50IG9sZFJvd0luZGV4ID0gdGFibGVfLmluZGV4T2Yob2xkVGFibGVJdGVtKTsKLSAgICAgICAgdmFsdWVzXy5zZXQob2xkUm93SW5kZXgsIG9sZFRleHQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb25Bc09iamVjdChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgdGFibGVWaWV3ZXJfLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpLCB0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICB0YWJsZV8uc2V0VG9vbFRpcFRleHQoc3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEluZm9wb3AoU3RyaW5nIHN0cmluZykKLSAgewotICAJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZV8sIHN0cmluZyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KExpc3QgbGlzdCkKLSAgewotICAgIHZhbHVlc18uY2xlYXIoKTsKLSAgICB2YWx1ZXNfLmFkZEFsbChsaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2goKQotICB7Ci0gICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgdGFibGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgfQotCi0gIHB1YmxpYyBUYWJsZUl0ZW1bXSBnZXRJdGVtcygpCi0gIHsKLSAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICByZXR1cm4gdGFibGVfLmdldEl0ZW1zKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICAgIHN1cGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgYWRkXy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgIGVuYWJsZVJlbW92ZShlbmFibGVkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgIGlmIChlZGl0b3JfICE9IG51bGwpCi0gICAgICBlZGl0b3JfLmRpc3Bvc2UoKTsKLSAgICBpZiAodGFibGVfICE9IG51bGwpCi0gICAgICB0YWJsZV8uZGlzcG9zZSgpOwotICAgIGlmIChhZGRfICE9IG51bGwpCi0gICAgICBhZGRfLmRpc3Bvc2UoKTsKLSAgICBpZiAocmVtb3ZlXyAhPSBudWxsKQotICAgICAgcmVtb3ZlXy5kaXNwb3NlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW50ZXJuYWxEaXNwb3NlKCkKLSAgewotICAgIGlmICh0ZXh0XyAhPSBudWxsKQotICAgICAgdGV4dF8uZGlzcG9zZSgpOwotICAgIHRleHRfID0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBUYWJsZUVkaXRvckxpc3RlbmVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lcgotICB7Ci0gICAgcHJpdmF0ZSBpbnQgY3VyclNlbGVjdGlvbkluZGV4XzsKLSAgICBwcml2YXRlIGludCBlZGl0Um93XzsKLSAgICBwcml2YXRlIGludCBlZGl0Q29sdW1uXzsKLQotICAgIHB1YmxpYyBUYWJsZUVkaXRvckxpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgY3VyclNlbGVjdGlvbkluZGV4XyA9IC0xOwotICAgICAgZWRpdFJvd18gPSAtMTsKLSAgICAgIGVkaXRDb2x1bW5fID0gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpCi0gICAgewotICAgICAgbW91c2VEb3duKGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpCi0gICAgewotICAgICAgLy8gcmVmcmVzaCB0YWJsZQotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICAvLyBDbGVhbiB1cCBwcmV2aW91cyB0ZXh0IGVkaXRvciBjb250cm9sCi0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIC8vIHVwZGF0ZSB0YWJsZQotICAgICAgaWYgKHRhYmxlXy5pc0ZvY3VzQ29udHJvbCgpKQotICAgICAgewotICAgICAgICBpbnQgc2VsZWN0ZWRSb3dJbmRleCA9IGdldFNlbGVjdGVkUm93KHRhYmxlXywgZS55KTsKLSAgICAgICAgaWYgKGN1cnJTZWxlY3Rpb25JbmRleF8gIT0gLTEgJiYgc2VsZWN0ZWRSb3dJbmRleCAhPSAtMSAmJiBjdXJyU2VsZWN0aW9uSW5kZXhfID09IHNlbGVjdGVkUm93SW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGVfLmdldEl0ZW0oc2VsZWN0ZWRSb3dJbmRleCk7Ci0gICAgICAgICAgaW50IHNlbGVjdGVkQ29sdW1uSW5kZXggPSBnZXRTZWxlY3RlZENvbHVtbih0YWJsZUl0ZW0sIGUueCwgZS55KTsKLSAgICAgICAgICBpZiAoc2VsZWN0ZWRDb2x1bW5JbmRleCAhPSAtMSAmJiAodGV4dF8gPT0gbnVsbCB8fCB0ZXh0Xy5pc0Rpc3Bvc2VkKCkgfHwgc2VsZWN0ZWRDb2x1bW5JbmRleCAhPSBlZGl0b3JfLmdldENvbHVtbigpKSkKLSAgICAgICAgICAgIGVkaXRTZWxlY3Rpb24oc2VsZWN0ZWRSb3dJbmRleCwgc2VsZWN0ZWRDb2x1bW5JbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyclNlbGVjdGlvbkluZGV4XyA9IHNlbGVjdGVkUm93SW5kZXg7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpCi0gICAgewotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFNlbGVjdGVkUm93KFRhYmxlIHRhYmxlLCBpbnQgeSkKLSAgICB7Ci0gICAgICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gdGFibGUuZ2V0SXRlbXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVJdGVtcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IHRhYmxlSXRlbXNbaV0uZ2V0Qm91bmRzKDApOwotICAgICAgICBpZiAocmVjdGFuZ2xlICE9IG51bGwgJiYgeSA+PSByZWN0YW5nbGUueSAmJiB5IDwgKHJlY3RhbmdsZS55ICsgcmVjdGFuZ2xlLmhlaWdodCkpCi0gICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U2VsZWN0ZWRDb2x1bW4oVGFibGVJdGVtIHRhYmxlSXRlbSwgaW50IHgsIGludCB5KQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc18ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmICh0YWJsZUl0ZW0uZ2V0Qm91bmRzKGkpLmNvbnRhaW5zKHgsIHkpKQotICAgICAgICAgIHJldHVybiBpOwotICAgICAgfQotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlZGl0U2VsZWN0aW9uKGludCByb3csIGludCBjb2x1bW4pCi0gICAgewotICAgICAgZWRpdFJvd18gPSByb3c7Ci0gICAgICBlZGl0Q29sdW1uXyA9IGNvbHVtbjsKLSAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZV8uZ2V0SXRlbShyb3cpOwotICAgICAgLy8gU2V0dXAgYWRhcHRlciBmb3IgdGhlIG5ldyBzZWxlY3Rpb24KLSAgICAgIHRleHRfID0gbmV3IFRleHQodGFibGVfLCBTV1QuTk9ORSk7Ci0gICAgICBTdHJpbmcgdGV4dCA9IHRhYmxlSXRlbS5nZXRUZXh0KGNvbHVtbik7Ci0gICAgICB0ZXh0Xy5zZXRUZXh0KCh0ZXh0ICE9IG51bGwpID8gdGV4dCA6ICIiKTsKLSAgICAgIHRleHRfLmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gRXNjCi0gICAgICAgICAgICBpZiAoKChpbnQpZS5jaGFyYWN0ZXIpID09IDI3KQotICAgICAgICAgICAgICBjYW5jZWxTZWxlY3Rpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICApOwotICAgICAgdGV4dF8uYWRkVHJhdmVyc2VMaXN0ZW5lcihuZXcgVHJhdmVyc2VMaXN0ZW5lcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfVEFCX05FWFQpCi0gICAgICAgICAgICAgIHRyYXZlcnNlVGFiTmV4dCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykKLSAgICAgICAgICAgICAgdHJhdmVyc2VUYWJQcmV2aW91cygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgKTsKLSAgICAgIGVkaXRvcl8uc2V0RWRpdG9yKHRleHRfLCB0YWJsZUl0ZW0sIGNvbHVtbik7Ci0gICAgICB0ZXh0Xy5zZXRGb2N1cygpOwotICAgICAgdGV4dF8uc2VsZWN0QWxsKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUYWJOZXh0KCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbFJlZnJlc2goKTsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaWYgKCEoZWRpdFJvd18gPT0gdGFibGVfLmdldEl0ZW1zKCkubGVuZ3RoLTEgJiYgZWRpdENvbHVtbl8gPT0gY29sdW1uc18ubGVuZ3RoLTEpKQotICAgICAgewotICAgICAgICBpZiAoZWRpdENvbHVtbl8gPCBjb2x1bW5zXy5sZW5ndGgtMSkKLSAgICAgICAgICBlZGl0Q29sdW1uXysrOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBlZGl0Q29sdW1uXyA9IDA7Ci0gICAgICAgICAgZWRpdFJvd18rKzsKLSAgICAgICAgICB0YWJsZV8uc2VsZWN0KGVkaXRSb3dfKTsKLSAgICAgICAgfQotICAgICAgICBlZGl0U2VsZWN0aW9uKGVkaXRSb3dfLCBlZGl0Q29sdW1uXyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgdHJhdmVyc2VUYWJQcmV2aW91cygpCi0gICAgewotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgIGlmICghKGVkaXRSb3dfID09IDAgJiYgZWRpdENvbHVtbl8gPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0Q29sdW1uXyA+IDApCi0gICAgICAgICAgZWRpdENvbHVtbl8tLTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWRpdENvbHVtbl8gPSBjb2x1bW5zXy5sZW5ndGgtMTsKLSAgICAgICAgICBlZGl0Um93Xy0tOwotICAgICAgICAgIHRhYmxlXy5zZWxlY3QoZWRpdFJvd18pOwotICAgICAgICB9Ci0gICAgICAgIGVkaXRTZWxlY3Rpb24oZWRpdFJvd18sIGVkaXRDb2x1bW5fKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxTZWxlY3Rpb24oKQotICAgIHsKLSAgICAgIGludGVybmFsRGlzcG9zZSgpOwotICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZWRpdFNlbGVjdGlvbigpCi0gICAgewotICAgICAgaW50IHNlbGVjdGVkUm93SW5kZXggPSB0YWJsZV8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIGlmIChzZWxlY3RlZFJvd0luZGV4ICE9IC0xICYmIGNvbHVtbnNfLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIC8vIHJlZnJlc2ggdGFibGUKLSAgICAgICAgaW50ZXJuYWxSZWZyZXNoKCk7Ci0gICAgICAgIC8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotICAgICAgICBpbnRlcm5hbERpc3Bvc2UoKTsKLSAgICAgICAgZWRpdFNlbGVjdGlvbihzZWxlY3RlZFJvd0luZGV4LCAwKTsKLSAgICAgIH0KLSAgICAgIGN1cnJTZWxlY3Rpb25JbmRleF8gPSBzZWxlY3RlZFJvd0luZGV4OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gICAgewotICAgICAgdGFibGVWaWV3ZXJfLmFkZChnZXRFbGVtZW50cyhuZXdJbnB1dCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0KQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdClpbnB1dEVsZW1lbnQ7Ci0gICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIG9iamVjdHNbaV0gPSBsaXN0LmdldChpKTsKLSAgICAgICAgcmV0dXJuIG9iamVjdHM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBMaXN0TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIKLSAgewotICAgIHB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0gICAgewotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c2lsL1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlMTdjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzaWwvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBVdGlscwotewotICBwdWJsaWMgVXRpbHMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvRmlsZVN5c3RlbVVSSShTdHJpbmcgcmVsYXRpdmVQbGF0Zm9ybVVSSSkKLSAgewotICAgIGlmIChyZWxhdGl2ZVBsYXRmb3JtVVJJICE9IG51bGwpCi0gICAgICByZXR1cm4gdG9GaWxlU3lzdGVtVVJJKFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHJlbGF0aXZlUGxhdGZvcm1VUkkpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9GaWxlU3lzdGVtVVJJKElSZXNvdXJjZSByZXMpCi0gIHsKLSAgICBpZiAocmVzICE9IG51bGwpCi0gICAgewotICAgICAgSVBhdGggcGF0aCA9IHJlcy5nZXRMb2NhdGlvbigpOwotICAgICAgaWYgKHBhdGggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gcGF0aC50b0ZpbGUoKS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ2xpZW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L0NsaWVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUzZDIwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ2xpZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50VHlwZSB7Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdlYlNlcnZpY2VDbGllbnRJbXBsc187Ci0gICAgCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50SW1wbCB3ZWJTZXJ2aWNlQ2xpZW50SW1wbDsKLQlwcml2YXRlIFN0cmluZ1tdIG1vZHVsZVR5cGVzSW5jbHVkZTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBtb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIHByaXZhdGUgU3RyaW5nIHdlYlNlcnZpY2VDbGllbnRUeXBlSWQ7Ci0JCi0gIAotICAKLQlwdWJsaWMgQ2xpZW50VHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV8sIEhhc2h0YWJsZSB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1fID0gZWxlbV87Ci0gICAgdGhpcy53ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfID0gd2ViU2VydmljZUNsaWVudEltcGxzXzsKLSAgfQotCi0KLQotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZD09bnVsbCkKLSAgICB7Ci0gICAgICBpZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGlkOwotICB9Ci0gIAotCi0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlVHlwZXNFeGNsdWRlKCkKLSAgewotICAgIGlmIChtb2R1bGVUeXBlc0V4Y2x1ZGU9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoIm1vZHVsZVR5cGVzRXhjbHVkZSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBtb2R1bGVUeXBlc0V4Y2x1ZGUgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZVR5cGVzRXhjbHVkZS5sZW5ndGg7IGkrKykKLSAgICAgICAgICBtb2R1bGVUeXBlc0V4Y2x1ZGVbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgfQotICAKLQotCi0KLSAgcHVibGljIFN0cmluZ1tdIGdldE1vZHVsZVR5cGVzSW5jbHVkZSgpCi0gIHsKLSAgICBpZiAobW9kdWxlVHlwZXNJbmNsdWRlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJtb2R1bGVUeXBlc0luY2x1ZGUiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgbW9kdWxlVHlwZXNJbmNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVUeXBlc0luY2x1ZGUubGVuZ3RoOyBpKyspCi0gICAgICAgICAgbW9kdWxlVHlwZXNJbmNsdWRlW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0KLQotCi0gIHB1YmxpYyBXZWJTZXJ2aWNlQ2xpZW50SW1wbCBnZXRXZWJTZXJ2aWNlQ2xpZW50SW1wbCgpCi0gIHsKLSAgICBpZiAod2ViU2VydmljZUNsaWVudEltcGw9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHdzY2ltcGxJZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaW1wbElkIik7Ci0gICAgICB3ZWJTZXJ2aWNlQ2xpZW50SW1wbCA9IChXZWJTZXJ2aWNlQ2xpZW50SW1wbCl3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfLmdldCh3c2NpbXBsSWQpOwotICAgIH0KLSAgICByZXR1cm4gd2ViU2VydmljZUNsaWVudEltcGw7Ci0gIH0KLSAgCi0KLQotICAvKgotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VDbGllbnRUeXBlSWQoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VDbGllbnRUeXBlSWQ9PW51bGwpCi0gICAgewotICAgICAgd2ViU2VydmljZUNsaWVudFR5cGVJZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgid2ViU2VydmljZUNsaWVudFR5cGVJZCIpOwotICAgIH0KLSAgICByZXR1cm4gd2ViU2VydmljZUNsaWVudFR5cGVJZDsKLSAgfQotICAqLwotCi0KLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWJmYjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotLyoqCi0gKiBAYXV0aG9yIHJzaW5oYQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHQgaW1wbGVtZW50cyBJQ29udGV4dCB7CQotCXByaXZhdGUgV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvOwotCXByaXZhdGUgYm9vbGVhbiBkZXZlbG9wOwotCXByaXZhdGUgYm9vbGVhbiBhc3NlbWJsZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVwbG95OwotCXByaXZhdGUgYm9vbGVhbiBpbnN0YWxsOwotCXByaXZhdGUgYm9vbGVhbiBydW47Ci0JcHJpdmF0ZSBib29sZWFuIGNsaWVudDsKLQlwcml2YXRlIGJvb2xlYW4gdGVzdDsKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaDsKLQlwcml2YXRlIGJvb2xlYW4gb3ZlcldyaXRlRmlsZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZUZvbGRlcnM7Ci0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT3V0RmlsZXM7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0QXNzZW1ibGUoKSB7Ci0JCXJldHVybiBhc3NlbWJsZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2hlY2tPdXRGaWxlcygpIHsKLQkJcmV0dXJuIGNoZWNrT3V0RmlsZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldENsaWVudCgpIHsKLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0Q3JlYXRlRm9sZGVycygpIHsKLQkJcmV0dXJuIGNyZWF0ZUZvbGRlcnM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldERlcGxveSgpIHsKLQkJcmV0dXJuIGRlcGxveTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcCgpIHsKLQkJcmV0dXJuIGRldmVsb3A7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEluc3RhbGwoKSB7Ci0JCXJldHVybiBpbnN0YWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRPdmVyV3JpdGVGaWxlcygpIHsKLQkJcmV0dXJuIG92ZXJXcml0ZUZpbGVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoKCkgewotCQlyZXR1cm4gcHVibGlzaDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0UnVuKCkgewotCQlyZXR1cm4gcnVuOwotCX0KLQkKLQlwdWJsaWMgV2ViU2VydmljZVNjZW5hcmlvIGdldFNjZW5hcmlvKCkgewotCQlyZXR1cm4gc2NlbmFyaW87Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldFRlc3QoKSB7Ci0JCXJldHVybiB0ZXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFzc2VtYmxlKGJvb2xlYW4gYXNzZW1ibGUpIHsKLQkJdGhpcy5hc3NlbWJsZSA9IGFzc2VtYmxlOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldENoZWNrT3V0RmlsZXMoYm9vbGVhbiBjaGVja091dEZpbGVzKSB7Ci0JCXRoaXMuY2hlY2tPdXRGaWxlcyA9IGNoZWNrT3V0RmlsZXM7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0Q2xpZW50KGJvb2xlYW4gY2xpZW50KSB7Ci0JCXRoaXMuY2xpZW50ID0gY2xpZW50OwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldENyZWF0ZUZvbGRlcnMoYm9vbGVhbiBjcmVhdGVGb2xkZXJzKSB7Ci0JCXRoaXMuY3JlYXRlRm9sZGVycyA9IGNyZWF0ZUZvbGRlcnM7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0RGVwbG95KGJvb2xlYW4gZGVwbG95KSB7Ci0JCXRoaXMuZGVwbG95ID0gZGVwbG95OwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldERldmVsb3AoYm9vbGVhbiBkZXZlbG9wKSB7Ci0JCXRoaXMuZGV2ZWxvcCA9IGRldmVsb3A7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbChib29sZWFuIGluc3RhbGwpIHsKLQkJdGhpcy5pbnN0YWxsID0gaW5zdGFsbDsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRPdmVyV3JpdGVGaWxlcyhib29sZWFuIG92ZXJXcml0ZUZpbGVzKSB7Ci0JCXRoaXMub3ZlcldyaXRlRmlsZXMgPSBvdmVyV3JpdGVGaWxlczsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoKGJvb2xlYW4gcHVibGlzaCkgewotCQl0aGlzLnB1Ymxpc2ggPSBwdWJsaXNoOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldFJ1bihib29sZWFuIHJ1bikgewotCQl0aGlzLnJ1biA9IHJ1bjsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCBzZXRTY2VuYXJpbyhXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW8pIHsKLQkJdGhpcy5zY2VuYXJpbyA9IHNjZW5hcmlvOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHNldFRlc3QoYm9vbGVhbiB0ZXN0KSB7Ci0JCXRoaXMudGVzdCA9IHRlc3Q7Ci0JfQkJCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvU2VsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDY0MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1NlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIFNlbGVjdGlvbiBpbXBsZW1lbnRzIElTZWxlY3Rpb24gewotCi0JcHJpdmF0ZSBPYmplY3RbXSBzZWxlY3Rpb247Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbigpIAotCXsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKE9iamVjdFtdIHNlbGVjdGlvbikKLQl7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1NlcnZpY2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvU2VydmljZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjNmY1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvU2VydmljZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLklXZWJTZXJ2aWNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlVHlwZSB7Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHdlYlNlcnZpY2VJbXBsc187Ci0gIHByaXZhdGUgSGFzaE1hcCB3ZWJTZXJ2aWNlVHlwZXNfOwotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgV2ViU2VydmljZUltcGwgd2ViU2VydmljZUltcGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZTsKLQlwcml2YXRlIFN0cmluZ1tdIHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIHByaXZhdGUgU3RyaW5nW10gYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIHByaXZhdGUgU3RyaW5nW10gdG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgcHJpdmF0ZSBJV2ViU2VydmljZVR5cGUgd2ViU2VydmljZVR5cGU7Ci0gIAotCi0gIAotICBwdWJsaWMgU2VydmljZVR5cGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fLCBIYXNodGFibGUgd2ViU2VydmljZUltcGxzXywgSGFzaE1hcCB3ZWJTZXJ2aWNlVHlwZXNfKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1fID0gZWxlbV87Ci0gICAgdGhpcy53ZWJTZXJ2aWNlSW1wbHNfID0gd2ViU2VydmljZUltcGxzXzsKLSAgICB0aGlzLndlYlNlcnZpY2VUeXBlc18gPSB3ZWJTZXJ2aWNlVHlwZXNfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlKCkKLSAgewotICAgIGlmIChib3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZT09bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiYnVNb2R1bGVUeXBlc0V4Y2x1ZGUiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlLmxlbmd0aDsgaSsrKQotICAgICAgICAgIGJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBib3R0b21VcE1vZHVsZVR5cGVzRXhjbHVkZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Qm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUoU3RyaW5nW10gYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGUpCi0gIHsKLSAgICB0aGlzLmJvdHRvbVVwTW9kdWxlVHlwZXNFeGNsdWRlID0gYm90dG9tVXBNb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRCb3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZSgpCi0gIHsKLSAgICBpZiAoYm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGU9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImJ1TW9kdWxlVHlwZXNJbmNsdWRlIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIGJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZS5sZW5ndGg7IGkrKykKLSAgICAgICAgICBib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZVtpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlKFN0cmluZ1tdIGJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlKQotICB7Ci0gICAgdGhpcy5ib3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZSA9IGJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZD09bnVsbCkKLSAgICB7Ci0gICAgICBpZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpCi0gIHsKLSAgICB0aGlzLmlkID0gaWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRUb3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlKCkKLSAgewotICAgIGlmICh0b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJ0ZE1vZHVsZVR5cGVzRXhjbHVkZSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICB0b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BEb3duTW9kdWxlVHlwZXNFeGNsdWRlLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGVbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGUoU3RyaW5nW10gdG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZSkKLSAgewotICAgIHRoaXMudG9wRG93bk1vZHVsZVR5cGVzRXhjbHVkZSA9IHRvcERvd25Nb2R1bGVUeXBlc0V4Y2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRUb3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlKCkKLSAgewotICAgIGlmICh0b3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJ0ZE1vZHVsZVR5cGVzSW5jbHVkZSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICB0b3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BEb3duTW9kdWxlVHlwZXNJbmNsdWRlLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGVbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGUoU3RyaW5nW10gdG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZSkKLSAgewotICAgIHRoaXMudG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZSA9IHRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGU7Ci0gIH0KLSAgCi0gIC8qCi0gIHB1YmxpYyBJV2ViU2VydmljZVR5cGUgZ2V0V2ViU2VyaXZjZVR5cGUoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VUeXBlPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB3c2lkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJ3ZWJTZXJ2aWNlVHlwZUlkIik7Ci0gICAgICB3ZWJTZXJ2aWNlVHlwZSA9IChJV2ViU2VydmljZVR5cGUpd2ViU2VydmljZVR5cGVzXy5nZXQod3NpZCk7Ci0gICAgfQotICAgIHJldHVybiB3ZWJTZXJ2aWNlVHlwZTsKLSAgfQotICAqLwotICAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVR5cGUoSVdlYlNlcnZpY2VUeXBlIHdlYlNlcnZpY2VUeXBlKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlVHlwZSA9IHdlYlNlcnZpY2VUeXBlOwotICB9Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZUltcGwgZ2V0V2ViU2VydmljZUltcGwoKQotICB7Ci0gICAgaWYgKHdlYlNlcnZpY2VJbXBsID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHdzaW1wbElkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJpbXBsSWQiKTsKLSAgICAgIHdlYlNlcnZpY2VJbXBsID0gKFdlYlNlcnZpY2VJbXBsKXdlYlNlcnZpY2VJbXBsc18uZ2V0KHdzaW1wbElkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VJbXBsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlSW1wbDEoV2ViU2VydmljZUltcGwgd2ViU2VydmljZUltcGwpCi0gIHsKLSAgICB0aGlzLndlYlNlcnZpY2VJbXBsID0gd2ViU2VydmljZUltcGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2NlbmFyaW8oaW50IHNjZW5hcmlvKQotICB7Ci0gICAgc3dpdGNoKHNjZW5hcmlvKQotICAgIHsKLSAgICBjYXNlIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUDoKLSAgICAgIFN0cmluZ1tdIGJ1cyA9IGdldEJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlKCk7Ci0gICAgICBpZiAoYnVzIT1udWxsICYmIGJ1cy5sZW5ndGg+MCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOOgotICAgICAgU3RyaW5nW10gdGRzID0gZ2V0VG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZSgpOwotICAgICAgaWYgKHRkcyE9bnVsbCAmJiB0ZHMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLQlwdWJsaWMgU3RyaW5nW10gZ2V0TW9kdWxlVHlwZXNJbmNsdWRlKGludCBzY2VuYXJpbykKLSAgewotICAgIHN3aXRjaChzY2VuYXJpbykKLSAgICB7Ci0gICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVA6Ci0gICAgICByZXR1cm4gZ2V0Qm90dG9tVXBNb2R1bGVUeXBlc0luY2x1ZGUoKTsKLSAgICBjYXNlIFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOOgotICAgICAgcmV0dXJuIGdldFRvcERvd25Nb2R1bGVUeXBlc0luY2x1ZGUoKTsKLSAgICBkZWZhdWx0OiAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotICAKLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VDbGllbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODdiM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VDbGllbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDbGllbnRJbXBsIHsKLQotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtXzsgCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZUNsaWVudEltcGwoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1fID0gZWxlbV87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIGlmIChpZD09bnVsbCkKLSAgICB7Ci0gICAgICBpZCA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiaWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGlkOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKQotICB7Ci0gICAgaWYgKGxhYmVsPT1udWxsKQotICAgIHsKLSAgICAgIGxhYmVsID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJsYWJlbCIpOwotICAgIH0KLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE4NzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VJbXBsIHsKLQkKLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSByZXNvdXJjZVR5cGVNZXRhZGF0YTsKLQlwcml2YXRlIFN0cmluZ1tdIGV4dGVuc2lvbk1ldGFkYXRhOwotICBwcml2YXRlIFN0cmluZyBvYmplY3RTZWxlY3Rpb25XaWRnZXQ7Ci0gIAotICBwdWJsaWMgV2ViU2VydmljZUltcGwoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVsZW1fID0gZWxlbV87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uTWV0YWRhdGEoKQotICB7Ci0gICAgaWYgKGV4dGVuc2lvbk1ldGFkYXRhPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJleHRlbnNpb25NZXRhZGF0YSIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBleHRlbnNpb25NZXRhZGF0YSA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uTWV0YWRhdGEubGVuZ3RoOyBpKyspCi0gICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGFbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVuc2lvbk1ldGFkYXRhOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgaWYgKGlkPT1udWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIH0KLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gIHsKLSAgICBpZiAobGFiZWw9PW51bGwpCi0gICAgewotICAgICAgbGFiZWwgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgfQotICAgIHJldHVybiBsYWJlbDsKLSAgfSAKLSAgCi0KLSAgcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlVHlwZU1ldGFkYXRhKCkKLSAgewotICAgIGlmIChyZXNvdXJjZVR5cGVNZXRhZGF0YT09bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgicmVzb3VyY2VUeXBlTWV0YWRhdGEiKTsKLSAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHIsICIgIik7Ci0gICAgICAgIGludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLSAgICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGEgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlVHlwZU1ldGFkYXRhLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICB9ICAgICAgCi0gICAgfQotICAgIHJldHVybiByZXNvdXJjZVR5cGVNZXRhZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0U2VsZWN0aW9uV2lkZ2V0KCkKLSAgewotICAgIGlmIChvYmplY3RTZWxlY3Rpb25XaWRnZXQ9PW51bGwpCi0gICAgewotICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0ID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJvYmplY3RTZWxlY3Rpb25XaWRnZXQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG9iamVjdFNlbGVjdGlvbldpZGdldDsKLSAgfQotICAKLQkKLSAgCi0gIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTZhYTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd3NydC9XZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU2NlbmFyaW87Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeSBpbnN0YW5jZV87Ci0KLSAgSGFzaE1hcCB3ZWJTZXJ2aWNlVHlwZXNfOwotICAKLSAgQXJyYXlMaXN0IHdlYlNlcnZpY2VUeXBlc0xpc3RfOwotICAKLSAgQXJyYXlMaXN0IHdlYlNlcnZpY2VDbGllbnRUeXBlc0xpc3RfOwotCi0gIEhhc2h0YWJsZSB3ZWJTZXJ2aWNlSW1wbHNfOwotCi0gIEhhc2h0YWJsZSB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfOwotCi0gIEhhc2h0YWJsZSBzZXJ2aWNlVHlwZXNfOwotCi0gIEhhc2h0YWJsZSBjbGllbnRUeXBlc187Ci0KLSAgSGFzaHRhYmxlIHdlYlNlcnZpY2VSdW50aW1lc187Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICogCi0gICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGxvYWQoKQotICB7Ci0gICAgLy8gQ2FuJ3QgZ2V0IHJpZCBvZiB3ZWJTZXJ2aWNlVHlwZXMgaW4gTTQKLSAgICB3ZWJTZXJ2aWNlVHlwZXNfID0gbmV3IEhhc2hNYXAoKTsKLSAgICB3ZWJTZXJ2aWNlVHlwZXNMaXN0XyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB3ZWJTZXJ2aWNlQ2xpZW50VHlwZXNMaXN0XyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB3ZWJTZXJ2aWNlSW1wbHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHdlYlNlcnZpY2VDbGllbnRJbXBsc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgc2VydmljZVR5cGVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBjbGllbnRUeXBlc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgd2ViU2VydmljZVJ1bnRpbWVzXyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAKLSAgICAvL0xvYWQgV2ViU2VydmljZVR5cGVzCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotCi0gICAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBXZWJTZXJ2aWNlVHlwZUltcGwgd3N0ID0gbmV3IFdlYlNlcnZpY2VUeXBlSW1wbChlbGVtKTsKLSAgICAgICAgICB3ZWJTZXJ2aWNlVHlwZXNfLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3N0KTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgLy9Mb2FkIFdlYlNlcnZpY2VJbXBscwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHdzSW1wbEV4dHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgIndzSW1wbCIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDx3c0ltcGxFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3NJbXBsRXh0c1tpZHhdOwotCi0gICAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoIndlYlNlcnZpY2VJbXBsIikpCi0gICAgICAgIHsKLSAgICAgICAgICBXZWJTZXJ2aWNlSW1wbCB3c2ltcGwgPSBuZXcgV2ViU2VydmljZUltcGwoZWxlbSk7Ci0gICAgICAgICAgd2ViU2VydmljZUltcGxzXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHdzaW1wbCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0xvYWQgV2ViU2VydmljZUNsaWVudEltcGxzCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gd3NDbGllbnRJbXBsRXh0cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAid3NDbGllbnRJbXBsIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PHdzQ2xpZW50SW1wbEV4dHMubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSB3c0NsaWVudEltcGxFeHRzW2lkeF07Ci0KLSAgICAgICAgaWYgKGVsZW0uZ2V0TmFtZSgpLmVxdWFscygid2ViU2VydmljZUNsaWVudEltcGwiKSkKLSAgICAgICAgewotICAgICAgICAgIFdlYlNlcnZpY2VDbGllbnRJbXBsIHdzQ2xpZW50SW1wbCA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50SW1wbChlbGVtKTsKLSAgICAgICAgICB3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfLnB1dChlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSwgd3NDbGllbnRJbXBsKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8vTG9hZCBTZXJ2aWNlVHlwZXMKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBzZXJ2aWNlVHlwZUV4dHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgInNlcnZpY2VUeXBlIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PHNlcnZpY2VUeXBlRXh0cy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IHNlcnZpY2VUeXBlRXh0c1tpZHhdOwotCi0gICAgICAgIGlmIChlbGVtLmdldE5hbWUoKS5lcXVhbHMoInNlcnZpY2VUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlVHlwZSBzdCA9IG5ldyBTZXJ2aWNlVHlwZShlbGVtLHdlYlNlcnZpY2VJbXBsc18sd2ViU2VydmljZVR5cGVzXyk7Ci0gICAgICAgICAgc2VydmljZVR5cGVzXy5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoImlkIiksIHN0KTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8vTG9hZCBDbGllbnRUeXBlcwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNsaWVudFR5cGVFeHRzID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsICJjbGllbnRUeXBlIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNsaWVudFR5cGVFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gY2xpZW50VHlwZUV4dHNbaWR4XTsKLQotICAgICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJjbGllbnRUeXBlIikpCi0gICAgICAgIHsKLSAgICAgICAgICBDbGllbnRUeXBlIGN0ID0gbmV3IENsaWVudFR5cGUoZWxlbSx3ZWJTZXJ2aWNlQ2xpZW50SW1wbHNfKTsKLSAgICAgICAgICBjbGllbnRUeXBlc18ucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCBjdCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICAvL0xvYWQgV2ViU2VyaXZjZVJ1bnRpbWVzCi0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gd3NydEV4dHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIiwgIndlYlNlcnZpY2VSdW50aW1lIik7Ci0gICAgCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PHdzcnRFeHRzLmxlbmd0aDsgaWR4KyspIAotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gd3NydEV4dHNbaWR4XTsKLQotICAgICAgICBpZiAoZWxlbS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJTZXJ2aWNlUnVudGltZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgV2ViU2VydmljZVJ1bnRpbWVJbmZvIHdzcnRJbmZvID0gbmV3IFdlYlNlcnZpY2VSdW50aW1lSW5mbyhlbGVtLCBzZXJ2aWNlVHlwZXNfLCBjbGllbnRUeXBlc18pOwotICAgICAgICAgIHdlYlNlcnZpY2VSdW50aW1lc18ucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpLCB3c3J0SW5mbyk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy9VcGRhdGUgdGhlIHR5cGUgbGlzdHMKLSAgICAgICAgICB1cGRhdGVXZWJTZXJ2aWNlVHlwZUxpc3Qod3NydEluZm8pOwotICAgICAgICAgIHVwZGF0ZVdlYlNlcnZpY2VDbGllbnRUeXBlTGlzdCh3c3J0SW5mbyk7Ci0gICAgICAgICAgCi0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgfSAgCi0gICAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVXZWJTZXJ2aWNlVHlwZUxpc3QoV2ViU2VydmljZVJ1bnRpbWVJbmZvIHdzcnRJbmZvKQotICB7Ci0gICAgU2VydmljZVR5cGVbXSBzdHMgPSB3c3J0SW5mby5nZXRTZXJ2aWNlVHlwZXMoKTsKLSAgICBmb3IgKGludCBqPTA7IGo8c3RzLmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIFN0cmluZyBpbXBsSWQgPSBzdHNbal0uZ2V0V2ViU2VydmljZUltcGwoKS5nZXRJZCgpOwotICAgICAgU3RyaW5nW10gYnVzID0gc3RzW2pdLmdldEJvdHRvbVVwTW9kdWxlVHlwZXNJbmNsdWRlKCk7Ci0gICAgICBTdHJpbmdbXSB0ZHMgPSBzdHNbal0uZ2V0VG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZSgpOwotICAgICAgaWYgKGJ1cyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgZW50cnlidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUCkpOwotICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKCIvIik7Ci0gICAgICAgIGVudHJ5YnVmZi5hcHBlbmQoaW1wbElkKTsKLSAgICAgICAgU3RyaW5nIGVudHJ5ID0gZW50cnlidWZmLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmICghd2ViU2VydmljZVR5cGVzTGlzdF8uY29udGFpbnMoZW50cnkpKQotICAgICAgICB7Ci0gICAgICAgICAgd2ViU2VydmljZVR5cGVzTGlzdF8uYWRkKGVudHJ5KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHRkcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgZW50cnlidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKFN0cmluZy52YWx1ZU9mKFdlYlNlcnZpY2VTY2VuYXJpby5UT1BET1dOKSk7Ci0gICAgICAgIGVudHJ5YnVmZi5hcHBlbmQoIi8iKTsKLSAgICAgICAgZW50cnlidWZmLmFwcGVuZChpbXBsSWQpOwotICAgICAgICBTdHJpbmcgZW50cnkgPSBlbnRyeWJ1ZmYudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKCF3ZWJTZXJ2aWNlVHlwZXNMaXN0Xy5jb250YWlucyhlbnRyeSkpCi0gICAgICAgIHsKLSAgICAgICAgICB3ZWJTZXJ2aWNlVHlwZXNMaXN0Xy5hZGQoZW50cnkpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgfSAgICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdlYlNlcnZpY2VDbGllbnRUeXBlTGlzdChXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NydEluZm8pCi0gIHsKLSAgICBDbGllbnRUeXBlW10gY3RzID0gd3NydEluZm8uZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICBmb3IgKGludCBqPTA7IGo8Y3RzLmxlbmd0aDsgaisrKQotICAgIHsKLSAgICAgIFN0cmluZyBpbXBsSWQgPSBjdHNbal0uZ2V0V2ViU2VydmljZUNsaWVudEltcGwoKS5nZXRJZCgpOwotICAgICAgU3RyaW5nW10gbW9kcyA9IGN0c1tqXS5nZXRNb2R1bGVUeXBlc0luY2x1ZGUoKTsKLSAgICAgIGlmIChtb2RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBlbnRyeWJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGVudHJ5YnVmZi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoV2ViU2VydmljZVNjZW5hcmlvLkNMSUVOVCkpOwotICAgICAgICBlbnRyeWJ1ZmYuYXBwZW5kKCIvIik7Ci0gICAgICAgIGVudHJ5YnVmZi5hcHBlbmQoaW1wbElkKTsKLSAgICAgICAgU3RyaW5nIGVudHJ5ID0gZW50cnlidWZmLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmICghd2ViU2VydmljZUNsaWVudFR5cGVzTGlzdF8uY29udGFpbnMoZW50cnkpKQotICAgICAgICB7Ci0gICAgICAgICAgd2ViU2VydmljZUNsaWVudFR5cGVzTGlzdF8uYWRkKGVudHJ5KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmMDdlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklFSkJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5JV2ViU2VydmljZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5UeXBlU2VsZWN0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZVR5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLkxhYmVsc0FuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlclVJQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscwotewotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAKLSAgcHVibGljIHN0YXRpYyBJV2ViU2VydmljZVJ1bnRpbWUgZ2V0V2ViU2VydmljZVJ1bnRpbWUoIFN0cmluZyBydW50aW1lSWQgKQotICB7Ci0JV2ViU2VydmljZVJ1bnRpbWVJbmZvIHdzcnRJbmZvICAgICAgIAkJPSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQocnVudGltZUlkKTsKLQlJV2ViU2VydmljZVJ1bnRpbWUgICAgd2Vic2VydmljZVJ1bnRpbWUgICAgID0gbnVsbDsKLQlpZiAod3NydEluZm8gIT0gbnVsbCkKLQl7Ci0JCXdlYnNlcnZpY2VSdW50aW1lID0gd3NydEluZm8uZ2V0V2ViU2VydmljZVJ1bnRpbWUoKTsKLQl9Ci0JCi0JcmV0dXJuIHdlYnNlcnZpY2VSdW50aW1lOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIElXZWJTZXJ2aWNlVHlwZSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VUeXBlc18uZ2V0KGlkKTsKLQkKLSAgICBpZiAocmVzdWx0IT1udWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoV2ViU2VydmljZVR5cGVJbXBsKXJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUltcGwgZ2V0V2ViU2VydmljZUltcGxCeUlkKFN0cmluZyBpZCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSByZWdpc3RyeS53ZWJTZXJ2aWNlSW1wbHNfLmdldChpZCk7Ci0gICAgaWYgKHJlc3VsdCE9bnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFdlYlNlcnZpY2VJbXBsKXJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGludCBnZXRTY2VuYXJpb0Zyb21UeXBlSWQoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHR5cGVJZC5zdWJzdHJpbmcoMCx0eXBlSWQuaW5kZXhPZigiLyIpKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEltcGxJZEZyb21UeXBlSWQoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIHJldHVybiB0eXBlSWQuc3Vic3RyaW5nKHR5cGVJZC5pbmRleE9mKCIvIikrMSk7Ci0gIH0KLSAgLyoKLSAgICogQHBhcmFtIHR5cGVJZCB3aWxsIGJlIGEgU3RyaW5nIG9mIHRoZSBmb3JtYXQgIjAvaW1wbElkIgotICAgKiB3aGVyZSB0aGUgZGlnaXQgYmVmb3JlIHRoZSAiLyIgcmVwcmVzZW50cyB0aGUgc2NlbmFyaW8KLSAgICogKGUuZy4gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTV9VUCkgYW5kIHRoZSBpbXBsSWQgaXMgdGhlIGlkCi0gICAqIG9mIHRoZSBXZWJTZXJ2aWNlSW1wbAotICAgKi8gIAotICBwdWJsaWMgc3RhdGljIFNlcnZpY2VUeXBlIGdldFNlcnZpY2VUeXBlKFN0cmluZyBydW50aW1lSWQsIFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NydCA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpOwotICAgIGlmICh3c3J0IT1udWxsKQotICAgIHsKLSAgICAgIGludCBzY2VuYXJpbyA9IGdldFNjZW5hcmlvRnJvbVR5cGVJZCh0eXBlSWQpOwotICAgICAgU3RyaW5nIGltcGxJZCA9IGdldEltcGxJZEZyb21UeXBlSWQodHlwZUlkKTsKLSAgICAgIC8vUmV0dXJuIHRoZSBmaXJzdCBzZXJ2aWNlIHR5cGUgdGhhdCBzdXBwb3J0cyB0aGUgaW1wbCBhbmQgc2NlbmFyaW8KLSAgICAgIFNlcnZpY2VUeXBlW10gc3RzID0gd3NydC5nZXRTZXJ2aWNlVHlwZXMoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxzdHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0aGlzSW1wbElkID0gc3RzW2ldLmdldFdlYlNlcnZpY2VJbXBsKCkuZ2V0SWQoKTsKLSAgICAgICAgaWYgKGltcGxJZC5lcXVhbHModGhpc0ltcGxJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvL0NoZWNrIGlmIHNjZW5hcmlvIGlzIHN1cHBvcnRlZAotICAgICAgICAgIGlmIChzdHNbaV0uc3VwcG9ydHNTY2VuYXJpbyhzY2VuYXJpbykpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN0c1tpXTsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VSdW50aW1lSW5mbyBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VSdW50aW1lc18uZ2V0KGlkKTsKLSAgICBpZiAocmVzdWx0IT1udWxsKQotICAgIHsKLSAgICAgIHJldHVybiAoV2ViU2VydmljZVJ1bnRpbWVJbmZvKXJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUnVudGltZUluZm8gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUxhYmVsKFN0cmluZyBsYWJlbCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXIgPSByZWdpc3RyeS53ZWJTZXJ2aWNlUnVudGltZXNfLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3IgPSAoV2ViU2VydmljZVJ1bnRpbWVJbmZvKWl0ZXIubmV4dCgpOwotICAgICAgaWYgKHdzciE9bnVsbCkgewotICAgICAgICBpZiAobGFiZWwuZXF1YWxzKHdzci5nZXRMYWJlbCgpKSkKLSAgICAgICAgICByZXR1cm4gd3NyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsgICAgICAKLSAgfSAgCi0KLSAgLyoKLSAgICogQHBhcmFtIHR5cGVJZCB3aWxsIGJlIGEgU3RyaW5nIG9mIHRoZSBmb3JtYXQgIjAvaW1wbElkIgotICAgKiB3aGVyZSB0aGUgZGlnaXQgYmVmb3JlIHRoZSAiLyIgcmVwcmVzZW50cyB0aGUgc2NlbmFyaW8KLSAgICogKGUuZy4gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTV9VUCkgYW5kIHRoZSBpbXBsSWQgaXMgdGhlIGlkCi0gICAqIG9mIHRoZSBXZWJTZXJ2aWNlSW1wbAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRSdW50aW1lc0J5VHlwZShTdHJpbmcgdHlwZUlkKSAKLSAgewotICAgIGludCBzY2VuYXJpbyA9IGdldFNjZW5hcmlvRnJvbVR5cGVJZCh0eXBlSWQpOwotICAgIFN0cmluZyBpbXBsSWQgPSBnZXRJbXBsSWRGcm9tVHlwZUlkKHR5cGVJZCk7ICAgIAotICAgIEFycmF5TGlzdCBpZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVJ1bnRpbWVJbmZvIHdzciA9IChXZWJTZXJ2aWNlUnVudGltZUluZm8paXRlci5uZXh0KCk7Ci0gICAgICBTZXJ2aWNlVHlwZVtdIHN0cyA9IHdzci5nZXRTZXJ2aWNlVHlwZXMoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxzdHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0aGlzSW1wbElkID0gc3RzW2ldLmdldFdlYlNlcnZpY2VJbXBsKCkuZ2V0SWQoKTsKLSAgICAgICAgaWYgKGltcGxJZC5lcXVhbHModGhpc0ltcGxJZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvL0NoZWNrIGlmIHNjZW5hcmlvIGlzIHN1cHBvcnRlZAotICAgICAgICAgIGlmIChzdHNbaV0uc3VwcG9ydHNTY2VuYXJpbyhzY2VuYXJpbykpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWRzLmFkZCh3c3IuZ2V0SWQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlkcy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHJ1bnRpbWVJZHMgPSAoU3RyaW5nW10paWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICByZXR1cm4gcnVudGltZUlkczsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyRmFjdG9yeUlkc0J5VHlwZShTdHJpbmcgdHlwZUlkKSAKLSAgewotICAgIFN0cmluZ1tdIHdzcnRzID0gZ2V0UnVudGltZXNCeVR5cGUodHlwZUlkKTsKLSAgICBpZiAod3NydHMgPT0gbnVsbCApCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgICAgCi0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8d3NydHMubGVuZ3RoIDtpKyspCi0gICAgewotICAgICAgU3RyaW5nW10gZklkcyA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZCh3c3J0c1tpXSkuZ2V0U2VydmVyRmFjdG9yeUlkcygpOwotICAgICAgaWYgKGZJZHMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaj0wOyBqPGZJZHMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlkcy5jb250YWlucyhmSWRzW2pdKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZHMuYWRkKGZJZHNbal0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoaWRzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nW10gc2VydmVyRmFjdG9yeUlkcyA9IChTdHJpbmdbXSlpZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsgICAgCi0gIH0KLSAgCi0gIC8qCi0gICAqIEBwYXJhbSB0eXBlSWQgd2lsbCBiZSBhIFN0cmluZyBvZiB0aGUgZm9ybWF0ICIwL2ltcGxJZCIKLSAgICogd2hlcmUgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgIi8iIHJlcHJlc2VudHMgdGhlIHNjZW5hcmlvCi0gICAqIChlLmcuIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVApIGFuZCB0aGUgaW1wbElkIGlzIHRoZSBpZAotICAgKiBvZiB0aGUgV2ViU2VydmljZUltcGwKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlcnZlclN1cHBvcnRlZEZvckNob3NlblR5cGUoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIFN0cmluZ1tdIGZJZHMgPSBnZXRTZXJ2ZXJGYWN0b3J5SWRzQnlUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKGZJZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaT0wO2k8Zklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWQuZXF1YWxzKGZJZHNbaV0pKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKgotICAgKiBAcGFyYW0gdHlwZUlkIHdpbGwgYmUgYSBTdHJpbmcgb2YgdGhlIGZvcm1hdCAiMC9pbXBsSWQiCi0gICAqIHdoZXJlIHRoZSBkaWdpdCBiZWZvcmUgdGhlICIvIiByZXByZXNlbnRzIHRoZSBzY2VuYXJpbwotICAgKiAoZS5nLiBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NX1VQKSBhbmQgdGhlIGltcGxJZCBpcyB0aGUgaWQKLSAgICogb2YgdGhlIFdlYlNlcnZpY2VJbXBsCi0gICAqLyAgICAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VydmVyUnVudGltZVR5cGVTdXBwb3J0ZWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIHR5cGVJZCkgIAotICB7Ci0gICAgU3RyaW5nW10gcklkcyA9IGdldFJ1bnRpbWVzQnlUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKHJJZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcklkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocnVudGltZUlkLmVxdWFscyhySWRzW2ldKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gZklkcyA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChySWRzW2ldKS5nZXRTZXJ2ZXJGYWN0b3J5SWRzKCk7Ci0gICAgICAgIGlmIChmSWRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZJZHMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHNlcnZlckZhY3RvcnlJZC5lcXVhbHMoZklkc1tqXSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzUnVudGltZVN1cHBvcnRKMkVFTGV2ZWwoU3RyaW5nIGoyZWVWZXJzaW9uSWQsIFN0cmluZyBydW50aW1lSWQpCi0gIHsKLSAgICBXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NydCA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpOwotICAgIGlmICh3c3J0PT1udWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIFN0cmluZ1tdIGoyZWVWZXJzaW9ucyA9IHdzcnQuZ2V0SjJlZUxldmVscygpOwotICAgIGlmIChqMmVlVmVyc2lvbnM9PW51bGwgfHwgajJlZVZlcnNpb25zLmxlbmd0aD09MCkgCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAKLSAgICBmb3IoaW50IGk9MDsgaTxqMmVlVmVyc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGoyZWVWZXJzaW9uc1tpXS5lcXVhbHMoajJlZVZlcnNpb25JZCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7ICAgICAgICAKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyVGFyZ2V0KFN0cmluZyBzZXJ2ZXJUYXJnZXRJZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3J0ID0gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCk7Ci0gICAgaWYgKHdzcnQ9PW51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgU3RyaW5nW10gZklkcyA9IHdzcnQuZ2V0U2VydmVyRmFjdG9yeUlkcygpOwotICAgIGZvcihpbnQgaT0wO2k8Zklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKGZJZHNbaV0pOwotICAgICAgaWYgKHNlcnZlclR5cGUgPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICAKLSAgICAgIFN0cmluZyB0aGlzU2VydmVyVGFyZ2V0SWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsgCi0gICAgICBpZiAodGhpc1NlcnZlclRhcmdldElkLmVxdWFscyhzZXJ2ZXJUYXJnZXRJZCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgdmFsaWQgcHJvamVjdHMgZm9yIHRoZSBXZWIgc2VydmljZSB0eXBlIHdpdGggYW4gaWQgb2YgdHlwZUlkLgotICAgKiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgV2ViIHNlcnZpY2UgdHlwZSBleHRlbnNpb24gZG9lcyBub3Qgc3BlY2lmeSB3aGljaCBwcm9qZWN0Ci0gICAqIG5hdHVyZXMgYXJlIGluY2x1ZGVkLCBhIGFycmF5IG9mIGFsbCBXZWIgYW5kIEVKQiBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlIHdpbGwKLSAgICogYmUgcmV0dXJuZWQuCi0gICAqIEBwYXJhbSB0eXBlSWQKLSAgICogQHJldHVybiBJUHJvamVjdFtdIGFuIGFycmF5IG9mIHZhbGlkIHByb2plY3RzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QWxsUHJvamVjdHMoKQotICB7Ci0gICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICBBcnJheUxpc3QgdmFsaWRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghcHJvamVjdHNbaV0uZ2V0TmFtZSgpLmVxdWFscygiU2VydmVycyIpICYmICFwcm9qZWN0c1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiLiIpKQotICAgICAgewotICAgICAgICB2YWxpZFByb2plY3RzLmFkZChwcm9qZWN0c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAoSVByb2plY3RbXSl2YWxpZFByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsgCi0gICAgLy8gcnNrdG9kbwotICAgIC8qCi0gICAgSVdlYlNlcnZpY2VUeXBlIHdzdCA9IGdldFdlYlNlcnZpY2VUeXBlQnlJZCh0eXBlSWQpOwotICAgIGlmICh3c3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IHdzdC5nZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotICAgICAgU3RyaW5nIGluY2x1ZGVkTmF0dXJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKCJpbmNsdWRlTmF0dXJlcyIpOwotICAgICAgU3RyaW5nIGV4Y2x1ZGVkTmF0dXJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKCJleGNsdWRlTmF0dXJlcyIpOwotICAgICAgaWYgKGluY2x1ZGVkTmF0dXJlcyE9bnVsbCAmJiBpbmNsdWRlZE5hdHVyZXMubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpbmNsdWRlKHByb2plY3RzW2ldLCBpbmNsdWRlZE5hdHVyZXMpICYmIGV4Y2x1ZGUocHJvamVjdHNbaV0sIGV4Y2x1ZGVkTmF0dXJlcykpCi0gICAgICAgICAgICB2YWxpZFByb2plY3RzLmFkZChwcm9qZWN0c1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChJUHJvamVjdFtdKXZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvL0lmIHdzdCB3YXMgbnVsbCBvciB0aGUgZXh0ZW5zaW9uIGRpZG4ndCBzcGVjaWZ5IHdoaWNoIHByb2plY3QgbmF0dXJlcyBhcmUKLSAgICAvLyB0byBiZSBpbmNsdWRlZCwgcmV2ZXJ0IHRvIHRoZSBvbGQgYmVoYXZpb3VyCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9qZWN0cy5sZW5ndGg7IGorKykKLSAgICB7Ci0gICAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdHNbal0pIHx8IFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3RzW2pdKSkKLSAgICAgICAgdmFsaWRQcm9qZWN0cy5hZGQocHJvamVjdHNbal0pOwotICAgIH0gICAgCi0gICAgcmV0dXJuIChJUHJvamVjdFtdKXZhbGlkUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotICAgICovCi0gICAgLy8gcnNrdG9kbwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGluY2x1ZGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGluY2x1ZGUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGUpOwotICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4Y2x1ZGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGV4Y2x1ZGUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4Y2x1ZGUpOwotICAgIHdoaWxlKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByb2plY3QuaGFzTmF0dXJlKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBMYWJlbHNBbmRJZHMgZ2V0U2VydmljZVR5cGVMYWJlbHMoKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHJlZ2lzdHJ5ICk7Ci0gICAgCi0gICAgTGFiZWxzQW5kSWRzIGxhYmVsSWRzID0gbmV3IExhYmVsc0FuZElkcygpOwotICAgIEl0ZXJhdG9yICAgICBpdGVyYXRvciA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VUeXBlc0xpc3RfLml0ZXJhdG9yKCk7Ci0gICAgaW50ICAgICAgICAgIHNpemUgICAgID0gcmVnaXN0cnkud2ViU2VydmljZVR5cGVzTGlzdF8uc2l6ZSgpOwotICAgIFN0cmluZ1tdICAgICBsYWJlbHMgICA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgU3RyaW5nW10gICAgIGlkcyAgICAgID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICBpbnQgICAgICAgICAgaW5kZXggICAgPSAwOwotICAgIAotICAgIGxhYmVsSWRzLnNldExhYmVsc18oIGxhYmVscyApOwotICAgIGxhYmVsSWRzLnNldElkc18oIGlkcyApOwotICAgIAotICAgIHdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgd3N0ID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpbnQgc2NlbmFyaW8gPSBnZXRTY2VuYXJpb0Zyb21UeXBlSWQod3N0KTsKLSAgICAgIFN0cmluZyBpbXBsSWQgPSBnZXRJbXBsSWRGcm9tVHlwZUlkKHdzdCk7Ci0gICAgICBXZWJTZXJ2aWNlSW1wbCB3c2ltcGwgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VJbXBsQnlJZChpbXBsSWQpOwotICAgICAgU3RyaW5nIGltcGxsYWJlbCA9IHdzaW1wbC5nZXRMYWJlbCgpOwotICAgICAgaWRzW2luZGV4XSAgICA9IHdzdDsKLSAgICAgIFN0cmluZyBzY2VuTGFiZWwgPSAiIjsKLSAgICAgIHN3aXRjaChzY2VuYXJpbykKLSAgICAgIHsKLSAgICAgIGNhc2UgV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTVVQOgotICAgICAgICBzY2VuTGFiZWwgPSBtc2dVdGlscy5nZXRNZXNzYWdlKFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01VUF9MQUJFTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTjoKLSAgICAgICAgc2NlbkxhYmVsID0gbXNnVXRpbHMuZ2V0TWVzc2FnZShXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTl9MQUJFTCk7Ci0gICAgICAgIGJyZWFrOyAKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB9Ci0gICAgICBsYWJlbHNbaW5kZXhdID0gc2NlbkxhYmVsICsiICIraW1wbGxhYmVsOwotICAgICAgaW5kZXgrKzsKLSAgICB9ICAgIAotICAgIAotICAgIHJldHVybiBsYWJlbElkczsKLSAgfQotICAKLSAgLyoKLSAgICogQHBhcmFtIHR5cGVJZCB3aWxsIGJlIGEgU3RyaW5nIG9mIHRoZSBmb3JtYXQgIjAvaW1wbElkIgotICAgKiB3aGVyZSB0aGUgZGlnaXQgYmVmb3JlIHRoZSAiLyIgcmVwcmVzZW50cyB0aGUgc2NlbmFyaW8KLSAgICogKGUuZy4gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTV9VUCkgYW5kIHRoZSBpbXBsSWQgaXMgdGhlIGlkCi0gICAqIG9mIHRoZSBXZWJTZXJ2aWNlSW1wbAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVWYWx1ZUZvcihTdHJpbmcgdHlwZUlkKQotICB7Ci0gICAgU3RyaW5nW10gcklkcyA9IGdldFJ1bnRpbWVzQnlUeXBlKHR5cGVJZCk7Ci0gICAgaWYgKHJJZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJJZHNbMF07Ci0gIH0gICAgCi0gIAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcnZlclZhbHVlRm9yKFN0cmluZyB0eXBlSWQpCi0gIHsKLSAgICBTdHJpbmdbXSBmSWRzID0gZ2V0U2VydmVyRmFjdG9yeUlkc0J5VHlwZSh0eXBlSWQpOwotICAgIGlmIChmSWRzPT1udWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgcmV0dXJuIGZJZHNbMF07Ci0gIH0gIAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVHlwZUJ5U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIFR5cGVTZWxlY3Rpb25GaWx0ZXIgdHNmID0gbmV3IFR5cGVTZWxlY3Rpb25GaWx0ZXIoKTsKLSAgICBTdHJpbmdbXSB3c3QgPSB0c2YuZ2V0V2ViU2VydmljZVR5cGVCeUluaXRpYWxTZWxlY3Rpb24oc2VsZWN0aW9uLCByZWdpc3RyeS53ZWJTZXJ2aWNlVHlwZXNMaXN0Xyk7Ci0gICAgcmV0dXJuIHdzdCA9PSBudWxsID8gbnVsbCA6IHdzdDsKLSAgfSAgICAKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhbiBFSkIgcHJvamVjdCBpcyBuZWVkZWQgdG8gaG9zdCBhIFdlYiBzZXJ2aWNlCi0gICAqIG9mIHRoZSB0eXBlIGlkZW50aWZpZWQgYnkgdHlwZUlkLiBJZiBtdWx0aXBsZSBuYXR1cmVJZHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgCi0gICAqICJpbmNsdWRlTmF0dXJlcyIgYXR0cmlidXRlLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgY2hlY2tlZC4gSWYgbm8gbmF0dXJlSWRzIGFyZSBzcGVjaWZpZWQsIAotICAgKiBmYWxzZSBpcyByZXR1cm5lZC4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkICAKLSAgICogCVNob3VsZCBiZSByZWZhY3RvcmVkIGluIGZ1dHVyZSAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlc0VKQlByb2plY3QoU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIElXZWJTZXJ2aWNlVHlwZSB3c3QgPSBnZXRXZWJTZXJ2aWNlVHlwZUJ5SWQodHlwZUlkKTsKLSAgICBpZiAod3N0ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSB3c3QuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKTsKLSAgICAgIFN0cmluZyBpbmNsdWRlZE5hdHVyZXMgPSBlbGVtLmdldEF0dHJpYnV0ZSgiaW5jbHVkZU5hdHVyZXMiKTsKLSAgICAgIGlmIChpbmNsdWRlZE5hdHVyZXM9PW51bGwgfHwgaW5jbHVkZWROYXR1cmVzLmxlbmd0aCgpPT0wKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5jbHVkZWROYXR1cmVzKTsKLSAgICAgICAgaWYoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGZpcnN0SW5jbHVkZWROYXR1cmUgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICBpZiAoZmlyc3RJbmNsdWRlZE5hdHVyZS5lcXVhbHMoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLSAgCi0gIC8qCi0gICAqIEBwYXJhbSB0eXBlSWQgd2lsbCBiZSBhIFN0cmluZyBvZiB0aGUgZm9ybWF0ICIwL2ltcGxJZCIKLSAgICogd2hlcmUgdGhlIGRpZ2l0IGJlZm9yZSB0aGUgIi8iIHJlcHJlc2VudHMgdGhlIHNjZW5hcmlvCi0gICAqIChlLmcuIFdlYlNlcnZpY2VTY2VuYXJpby5CT1RUT01fVVApIGFuZCB0aGUgaW1wbElkIGlzIHRoZSBpZAotICAgKiBvZiB0aGUgV2ViU2VydmljZUltcGwKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlc0VKQlByb2plY3QoU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIHR5cGVJZCkKLSAgewotICAgIFNlcnZpY2VUeXBlIHN0ID0gZ2V0U2VydmljZVR5cGUocnVudGltZUlkLCB0eXBlSWQpOwotICAgIGlmIChzdCE9bnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBpbmNsdWRlZE5hdHVyZXMgPSBzdC5nZXRNb2R1bGVUeXBlc0luY2x1ZGUoZ2V0U2NlbmFyaW9Gcm9tVHlwZUlkKHR5cGVJZCkpOwotICAgICAgaWYgKGluY2x1ZGVkTmF0dXJlcyE9bnVsbCAmJiBpbmNsdWRlZE5hdHVyZXMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmNsdWRlZE5hdHVyZXNbMF0uZXF1YWxzKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVxdWlyZXNFSkJNb2R1bGVGb3IoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgU3RyaW5nIHJ1bnRpbWVJZCwgU3RyaW5nIHR5cGVJZCkKLSAgewotCSAgLy8gcnNrdG9kbwotCSAgcmV0dXJuIGZhbHNlOwotICB9ICAKLSAgCi0gIC8vUG9ydGVkIGZyb20gdGhlIGZvcm1lciBXZWJTZXJ2aWNlQ2xpZW50UmVnaXN0cnkKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJ1bnRpbWVMYWJlbEJ5SWQoU3RyaW5nIHJ1bnRpbWVJZCkgCi0gIHsKLSAgICBXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NydCA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpOwotICAgIGlmICh3c3J0ID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICByZXR1cm4gd3NydC5nZXRMYWJlbCgpOwotICB9ICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlckxhYmVsQnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gICAgSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLSAgICBpZiAoc2VydmVyVHlwZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgU3RyaW5nIHNlcnZlckxhYmVsID0gU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KHNlcnZlclR5cGUpOyAgIAotICAgIHJldHVybiBzZXJ2ZXJMYWJlbDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VMYWJlbEZyb21JbnN0YW5jZUlkKCBTdHJpbmcgaW5zdGFuY2VJZCApCi0gIHsKLSAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlciggaW5zdGFuY2VJZCApOyAgICAKLSAgICByZXR1cm4gc2VydmVyLmdldE5hbWUoKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyKFN0cmluZyBydW50aW1lSWQsIFN0cmluZyBmYWN0b3J5SWQpCi0gIHsKLSAgICBXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NydCA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpOwotICAgIGlmICh3c3J0ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nW10gZmlkcyA9IHdzcnQuZ2V0U2VydmVyRmFjdG9yeUlkcygpOwotICAgICAgaWYgKGZpZHMhPW51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxmaWRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGZpZHNbaV0uZXF1YWxzKGZhY3RvcnlJZCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB3c3J0ID0gZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHJ1bnRpbWVJZCk7Ci0gICAgCi0gICAgaWYgKHdzcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBmaWRzID0gd3NydC5nZXRTZXJ2ZXJGYWN0b3J5SWRzKCk7Ci0gICAgICBpZiAoZmlkcyE9bnVsbCAmJiBmaWRzLmxlbmd0aD4wKQotICAgICAgewotICAgICAgICByZXR1cm4gZmlkc1swXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFJ1bnRpbWVzQnlDbGllbnRUeXBlKFN0cmluZyBjbGllbnRJbXBsSWQpIAotICB7Ci0gICAgQXJyYXlMaXN0IGlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gcmVnaXN0cnkud2ViU2VydmljZVJ1bnRpbWVzXy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NyID0gKFdlYlNlcnZpY2VSdW50aW1lSW5mbylpdGVyLm5leHQoKTsKLSAgICAgIENsaWVudFR5cGVbXSBjdHMgPSB3c3IuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICAgIGZvciAoaW50IGk9MDsgaTxjdHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB3c0NsaWVudEltcGxJZCA9IGN0c1tpXS5nZXRXZWJTZXJ2aWNlQ2xpZW50SW1wbCgpLmdldElkKCk7Ci0gICAgICAgIGlmICh3c0NsaWVudEltcGxJZC5lcXVhbHMoY2xpZW50SW1wbElkKSkKLSAgICAgICAgewotICAgICAgICAgIGlkcy5hZGQod3NyLmdldElkKCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlkcy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHJ1bnRpbWVJZHMgPSAoU3RyaW5nW10paWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICByZXR1cm4gcnVudGltZUlkczsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0gIAotCi0gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2ViU2VydmljZUNsaWVudFJ1bnRpbWVUeXBlRXhpc3RzKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIFN0cmluZyBydW50aW1lSWQsIFN0cmluZyBjbGllbnRUeXBlSWQpIAotICB7Ci0gICAgU3RyaW5nW10gcklkcyA9IGdldFJ1bnRpbWVzQnlDbGllbnRUeXBlKGNsaWVudFR5cGVJZCk7Ci0gICAgaWYgKHJJZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcklkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocnVudGltZUlkLmVxdWFscyhySWRzW2ldKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gZklkcyA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChySWRzW2ldKS5nZXRTZXJ2ZXJGYWN0b3J5SWRzKCk7Ci0gICAgICAgIGlmIChmSWRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZJZHMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHNlcnZlckZhY3RvcnlJZC5lcXVhbHMoZklkc1tqXSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0QWxsQ2xpZW50UnVudGltZXMoKSAKLSAgewotICAgIEFycmF5TGlzdCBpZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHJlZ2lzdHJ5LndlYlNlcnZpY2VSdW50aW1lc18udmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgV2ViU2VydmljZVJ1bnRpbWVJbmZvIHdzciA9IChXZWJTZXJ2aWNlUnVudGltZUluZm8paXRlci5uZXh0KCk7Ci0gICAgICBDbGllbnRUeXBlW10gY3RzID0gd3NyLmdldENsaWVudFR5cGVzKCk7Ci0gICAgICBpZiAoY3RzIT1udWxsICYmIGN0cy5sZW5ndGg+MCkKLSAgICAgIHsKLSAgICAgICAgLy90aGlzIHJ1bnRpbWUgc3VwcG9ydHMgdGhlIGNsaWVudCBzY2VuYXJpbwotICAgICAgICBpZHMuYWRkKHdzci5nZXRJZCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlkcy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHJ1bnRpbWVJZHMgPSAoU3RyaW5nW10paWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgICByZXR1cm4gcnVudGltZUlkczsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxDbGllbnRTZXJ2ZXJGYWN0b3J5SWRzKCkgCi0gIHsgICAgCi0gICAgU3RyaW5nW10gcklkcyA9IGdldEFsbENsaWVudFJ1bnRpbWVzKCk7Ci0gICAgaWYgKHJJZHM9PW51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBBcnJheUxpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGk9MDsgaTxySWRzLmxlbmd0aCA7aSsrKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIGZJZHMgPSBnZXRXZWJTZXJ2aWNlUnVudGltZUJ5SWQocklkc1tpXSkuZ2V0U2VydmVyRmFjdG9yeUlkcygpOwotICAgICAgaWYgKGZJZHMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaj0wOyBqPGZJZHMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlkcy5jb250YWlucyhmSWRzW2pdKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZHMuYWRkKGZJZHNbal0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoaWRzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgU3RyaW5nW10gc2VydmVyRmFjdG9yeUlkcyA9IChTdHJpbmdbXSlpZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWRzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDbGllbnRQcm9qZWN0VHlwZXMoU3RyaW5nIGNsaWVudEltcGxJZCwgU3RyaW5nIHJ1bnRpbWVJZCkKLSAgewotICAgIFN0cmluZ1tdIHJJZHMgPSBnZXRSdW50aW1lc0J5Q2xpZW50VHlwZShjbGllbnRJbXBsSWQpOwotICAgIGlmIChySWRzID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcklkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocnVudGltZUlkLmVxdWFscyhySWRzW2ldKSkKLSAgICAgIHsKLSAgICAgICAgQ2xpZW50VHlwZVtdIGN0cyA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChySWRzW2ldKS5nZXRDbGllbnRUeXBlcygpOwotICAgICAgICBmb3IgKGludCBqPTA7IGo8Y3RzLmxlbmd0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRoaXNDbGllbnRJbXBsSWQgPSBjdHNbal0uZ2V0V2ViU2VydmljZUNsaWVudEltcGwoKS5nZXRJZCgpOwotICAgICAgICAgIGlmIChjbGllbnRJbXBsSWQuZXF1YWxzKHRoaXNDbGllbnRJbXBsSWQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vRm91bmQgdGhlIG9uZSEKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3RUeXBlcyA9IGN0c1tqXS5nZXRNb2R1bGVUeXBlc0luY2x1ZGUoKTsKLSAgICAgICAgICAgIHJldHVybiBwcm9qZWN0VHlwZXM7Ci0gICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgCi0gICAgcmV0dXJuIG51bGw7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIExhYmVsc0FuZElkcyBnZXRDbGllbnRUeXBlTGFiZWxzKCkKLSAgewotICAgIAotICAgIExhYmVsc0FuZElkcyBsYWJlbElkcyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgICBTdHJpbmdbXSBpZHNBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0gICAgU3RyaW5nW10gbGFiZWxzQXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotICAgIGxhYmVsSWRzLnNldElkc18oaWRzQXJyYXkpOwotICAgIGxhYmVsSWRzLnNldExhYmVsc18obGFiZWxzQXJyYXkpOwotICAKLSAgICBTdHJpbmdbXSBySWRzID0gZ2V0QWxsQ2xpZW50UnVudGltZXMoKTsKLSAgICBpZiAocklkcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBsYWJlbElkczsKLSAgICB9Ci0gIAotICAgIEFycmF5TGlzdCBpZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQXJyYXlMaXN0IGxhYmVscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgcklkcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlUnVudGltZUluZm8gd3NydCA9IGdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChySWRzW2ldKTsKLSAgICAgIENsaWVudFR5cGVbXSBjdHMgPSB3c3J0LmdldENsaWVudFR5cGVzKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGN0cy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgQ2xpZW50VHlwZSBjdCA9IGN0c1tqXTsKLSAgICAgICAgLy9TdHJpbmcgaWQgPSBjdC5nZXRXZWJTZXJ2aWNlQ2xpZW50VHlwZUlkKCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IGN0LmdldFdlYlNlcnZpY2VDbGllbnRJbXBsKCkuZ2V0SWQoKTsKLSAgICAgICAgaWYgKCFpZHMuY29udGFpbnMoaWQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWRzLmFkZChpZCk7Ci0gICAgICAgICAgbGFiZWxzLmFkZChjdC5nZXRXZWJTZXJ2aWNlQ2xpZW50SW1wbCgpLmdldExhYmVsKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBpZiAoaWRzLnNpemUoKSA+IDApCi0gICAgewotICAgICAgaWRzQXJyYXkgPSAoU3RyaW5nW10pIGlkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgbGFiZWxzQXJyYXkgPSAoU3RyaW5nW10pIGxhYmVscy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgbGFiZWxJZHMuc2V0SWRzXyhpZHNBcnJheSk7Ci0gICAgICBsYWJlbElkcy5zZXRMYWJlbHNfKGxhYmVsc0FycmF5KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbGFiZWxJZHM7Ci0KLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dzcnQvV2ViU2VydmljZVJ1bnRpbWVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWI3MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93c3J0L1dlYlNlcnZpY2VSdW50aW1lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZVJ1bnRpbWU7Ci0KLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VSdW50aW1lSW5mbyB7Ci0KLSAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGFsbFNlcnZpY2VUeXBlc187Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGFsbENsaWVudFR5cGVzXzsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGlkOwotICBwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFNlcnZpY2VUeXBlW10gc2VydmljZVR5cGVzOwotCXByaXZhdGUgQ2xpZW50VHlwZVtdIGNsaWVudFR5cGVzOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIHNlcnZsZXRMZXZlbHM7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nW10gajJlZUxldmVsczsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmdbXSBydW50aW1lSWRzOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZ1tdIHNlcnZlckZhY3RvcnlJZHM7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCXByaXZhdGUgSVdlYlNlcnZpY2VSdW50aW1lIHdlYlNlcnZpY2VSdW50aW1lXzsKLSAgCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUnVudGltZUluZm8oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1fLCBIYXNodGFibGUgYWxsU2VydmljZVR5cGVzXywgSGFzaHRhYmxlIGFsbENsaWVudFR5cGVzXykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5lbGVtXyA9IGVsZW1fOwotICAgIHRoaXMuYWxsU2VydmljZVR5cGVzXyA9IGFsbFNlcnZpY2VUeXBlc187Ci0gICAgdGhpcy5hbGxDbGllbnRUeXBlc18gPSBhbGxDbGllbnRUeXBlc187Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0gIHsKLSAgICBpZiAoY2xhc3NOYW1lPT1udWxsKQotICAgIHsKLSAgICAgIGNsYXNzTmFtZT1lbGVtXy5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ci0gICAgfQotICAgIHJldHVybiBjbGFzc05hbWU7Ci0gIH0KLSAgCi0KLSAgcHVibGljIENsaWVudFR5cGVbXSBnZXRDbGllbnRUeXBlcygpCi0gIHsKLSAgICBpZiAoY2xpZW50VHlwZXM9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImNsaWVudFR5cGVzIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIGNsaWVudFR5cGVzID0gbmV3IENsaWVudFR5cGVbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpZW50VHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgY3RpZCA9IHN0Lm5leHRUb2tlbigpOyAgICAgICAgICAKLSAgICAgICAgICBjbGllbnRUeXBlc1tpXSA9IChDbGllbnRUeXBlKWFsbENsaWVudFR5cGVzXy5nZXQoY3RpZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNsaWVudFR5cGVzOwotICB9Ci0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgaWYgKGlkPT1udWxsKQotICAgIHsKLSAgICAgIGlkID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJpZCIpOwotICAgIH0KLSAgICByZXR1cm4gaWQ7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gIHsKLSAgICBpZiAobGFiZWw9PW51bGwpCi0gICAgewotICAgICAgbGFiZWwgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoImxhYmVsIik7Ci0gICAgfQotICAgIHJldHVybiBsYWJlbDsKLSAgfSAgIAotCi0gIAotICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldEoyZWVMZXZlbHMoKQotICB7Ci0gICAgaWYgKGoyZWVMZXZlbHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgiajJlZUxldmVscyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBqMmVlTGV2ZWxzID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqMmVlTGV2ZWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIGoyZWVMZXZlbHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICB9ICAgICAgCi0gICAgCi0gICAgcmV0dXJuIGoyZWVMZXZlbHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRSdW50aW1lSWRzKCkKLSAgewotICAgIGlmIChydW50aW1lSWRzID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoInJ1bnRpbWVzIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIHJ1bnRpbWVJZHMgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnRpbWVJZHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgcnVudGltZUlkc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfQotICAgIH0gICAgICAKLSAgICAKLSAgICByZXR1cm4gcnVudGltZUlkczsKLSAgfQotICAKLQotICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIGdldFNlcnZlckZhY3RvcnlJZHMoKQotICB7Ci0gICAgaWYgKHNlcnZlckZhY3RvcnlJZHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ciA9IGVsZW1fLmdldEF0dHJpYnV0ZSgic2VydmVycyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBzZXJ2ZXJGYWN0b3J5SWRzID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJGYWN0b3J5SWRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHNlcnZlckZhY3RvcnlJZHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZlckZhY3RvcnlJZHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFNlcnZpY2VUeXBlW10gZ2V0U2VydmljZVR5cGVzKCkKLSAgewotICAgIGlmIChzZXJ2aWNlVHlwZXM9PW51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGF0dHIgPSBlbGVtXy5nZXRBdHRyaWJ1dGUoInNlcnZpY2VUeXBlcyIpOwotICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiBhdHRyLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0ciwgIiAiKTsKLSAgICAgICAgaW50IHNpemUgPSBzdC5jb3VudFRva2VucygpOwotICAgICAgICBzZXJ2aWNlVHlwZXMgPSBuZXcgU2VydmljZVR5cGVbc2l6ZV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGN0aWQgPSBzdC5uZXh0VG9rZW4oKTsgICAgICAgICAgCi0gICAgICAgICAgc2VydmljZVR5cGVzW2ldID0gKFNlcnZpY2VUeXBlKWFsbFNlcnZpY2VUeXBlc18uZ2V0KGN0aWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZXJ2aWNlVHlwZXM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRTZXJ2bGV0TGV2ZWxzKCkKLSAgewotICAgIGlmIChzZXJ2bGV0TGV2ZWxzPT1udWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyID0gZWxlbV8uZ2V0QXR0cmlidXRlKCJzZXJ2bGV0TGV2ZWxzIik7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsICYmIGF0dHIubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyLCAiICIpOwotICAgICAgICBpbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICAgIHNlcnZsZXRMZXZlbHMgPSBuZXcgU3RyaW5nW3NpemVdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRMZXZlbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgc2VydmxldExldmVsc1tpXSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgfSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gc2VydmxldExldmVsczsKLSAgfQotICAKLSAgcHVibGljIElXZWJTZXJ2aWNlUnVudGltZSBnZXRXZWJTZXJ2aWNlUnVudGltZSgpCi0gIHsKLQlpZiAod2ViU2VydmljZVJ1bnRpbWVfID09IG51bGwpCi0JewotCQl0cnkKLQkJewotCQkJd2ViU2VydmljZVJ1bnRpbWVfID0gKElXZWJTZXJ2aWNlUnVudGltZSllbGVtXy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gY2UpCi0JCXsKLQkJCQotCQl9Ci0JfQotCQotCXJldHVybiB3ZWJTZXJ2aWNlUnVudGltZV87Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkNDU4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJzZXJ2aWNldXRpbHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjRkZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi13ZWJzZXJ2aWNldXRpbHMuamFyCi13c2MuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTg5Y2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LndzZGw8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzdjYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHdzYy5qYXIsCi0gd2Vic2VydmljZXV0aWxzLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24sCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXIsCi0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UueHNkLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2Uud3N0LndzLAotIG9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLAotIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcywKLSBvcmcud3NkbDRqLAotIG9yZy5lY2xpcHNlLmplbS51dGlsCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZGNmMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS53c2MuamFyID0gc3JjLwotc291cmNlLndlYnNlcnZpY2V1dGlscy5qYXIgPSB3ZWJzZXJ2aWNldXRpbHMvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGRvYy8KLWphcnMuY29tcGlsZS5vcmRlciA9IHdzYy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgd2Vic2VydmljZXV0aWxzLmphcgotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3c2MuamFyLFwKLSAgICAgICAgICAgICAgIHdlYnNlcnZpY2V1dGlscy5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDg0ZTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIENvbnN1bXB0aW9uCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLVhQX1dTRklOREVSPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlcgotWFBfV0VCX1NFUlZJQ0VfU1RBUlRfU0VSVkVSX1RZUEU9V2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZQotWFBfU0VSVkVSX0RFRkFVTFRFUj1TZXJ2ZXIgRGVmYXVsdGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5YTdhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0id3NmaW5kZXIiCi0gICAgICBuYW1lPSIlWFBfV1NGSU5ERVIiLz4KLQotICAgPCEtLSBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbiBwb2ludCB3aWxsIGJlIHJlbW92ZWQuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9IndlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUiCi0gICAgICBuYW1lPSIlWFBfV0VCX1NFUlZJQ0VfU1RBUlRfU0VSVkVSX1RZUEUiLz4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgaWQ9InNlcnZlckRlZmF1bHRlciIKLSAgICAgIG5hbWU9IiVYUF9TRVJWRVJfREVGQVVMVEVSIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ud2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZSI+Ci0gICAgICA8d2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZQotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC4zMiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRUb21jYXRTZXJ2ZXIiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDMyX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZT4KLSAgICAgIDx3ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlCi0gICAgICAgICAgICBmYWN0b3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjQwIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFRvbWNhdFNlcnZlciIKLSAgICAgICAgICAgIGlkPSJTRVJWRVJfSURfVE9NQ0FUNDBfTE9DQUwiPgotICAgICAgPC93ZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlPgotICAgICAgPHdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUKLSAgICAgICAgICAgIGZhY3RvcnlJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNDEiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLlN0YXJ0VG9tY2F0U2VydmVyIgotICAgICAgICAgICAgaWQ9IlNFUlZFUl9JRF9UT01DQVQ0MV9MT0NBTCI+Ci0gICAgICA8L3dlYlNlcnZpY2VTdGFydFNlcnZlclR5cGU+Ci0gICAgICA8d2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZQotICAgICAgICAgICAgZmFjdG9yeUlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uU3RhcnRUb21jYXRTZXJ2ZXIiCi0gICAgICAgICAgICBpZD0iU0VSVkVSX0lEX1RPTUNBVDUwX0xPQ0FMIj4KLSAgICAgIDwvd2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY29uc3VtcHRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NvbnN1bXB0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTlmYmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY29uc3VtcHRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBTYW1wbGUgbWVzc2FnZXMKLSMKLU1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX01FVEhPRFM9SVdBQjAxNzlFIFVuYWJsZSB0byBjcmVhdGUgYSBzYW1wbGUgdG8gdGhlIHByb3h5IGJlY2F1c2UgdGhlIHByb3h5IGRvZXMgbm90IGNvbnRhaW4gbWV0aG9kcy4KLU1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX0RFRkFVTFQ9SVdBQjAxODBFIFVuYWJsZSB0byBjcmVhdGUgYSBzYW1wbGUgdG8gdGhlIHByb3h5IGJlY2F1c2UgdGhlIHByb3h5IGlzIG5vdCBhIGJlYW4gKGkuZS4uIHRoZSBzYW1wbGUgZG9lcyBub3QgaGF2ZSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvcikuCi1NU0dfRVJST1JfSlRTX05PX1BST1hZX01FVEhPRFNfUFJPQ0VTU0VEPUlXQUIwMTgxRSBVbmFibGUgdG8gY3JlYXRlIGEgc2FtcGxlIHRvIHRoZSBwcm94eSBiZWNhdXNlIG5vbmUgb2YgdGhlIG1ldGhvZHMgaW4gdGhlIHByb3h5IHdlcmUgcHJvY2Vzc2VkLgotTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEU9SVdBQjAxODJXIFRoZSBTYW1wbGUgSlNQIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgdHlwZToKLU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9JTkRFWEVEX1BST1BFUlRJRVM9SVdBQjAxODdXIFRoZSBTYW1wbGUgSlNQIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IEluZGV4ZWQgcHJvcGVydGllcy4KLU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9QQVJBTUVURVJTX0FSUkFZUz1JV0FCMDIzN1cgVGhlIFNhbXBsZSBKU1AgY2xpZW50IGRvZXMgbm90IHN1cHBvcnQgYXJyYXlzOgotTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfSU5QVVRTPUlXQUIwMTI0VyBUaGUgU2FtcGxlIEpTUCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCBpbnB1dCBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBiZWFuczoKLU1TR19FUlJPUl9KVFNfQ1lDTElDX0JFQU49SVdBQjAxODhFIFRoZSBTYW1wbGUgSlNQIGNsaWVudCBkb2VzIG5vdCBzdXBwb3J0IGJlYW5zIGNvbnRhaW5pbmcgYXR0cmlidXRlcyB0aGF0IHJlZmVyZW5jZSB0aGUgYmVhbnMuCi1NU0dfV0FSTl9KVFNfUFJPWFlfTUVUSE9EU19PTUlUVEVEPUlXQUIwMTg5VyBUaGUgU2FtcGxlIEpTUCBjbGllbnQgb21pdHRlZCBzb21lIG1ldGhvZHMgYmVjYXVzZSB0aGV5IGNvbnRhaW5lZCB1bnN1cHBvcnRlZCB0eXBlcy4KLU1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQ9SVdBQjAwMjFFIFNhbXBsZSBjcmVhdGlvbiB3YXMgY2FuY2VsZWQKLU1TR19XQVJOX1VOQUJMRV9UT19GSU5EX1BST1hZPUlXQUIwMDIyVyBUaGUgUHJveHkgUmVzb3VyY2UgY291bmQgbm90IG5vdCBiZSBmb3VuZC4KLQotCi0jCi0jIEZpbHRlcnMKLSMKLUZJTFRFUl9NU0dfRVJST1JfTlVMTF9PQkpFQ1Q9SVdBQjAwOTdFIE5vIG9iamVjdCBoYXMgYmVlbiBwcm92aWRlZC4KLUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEU9SVdBQjAwOThFIFRoZSBvYmplY3QgInswfSIgaXMgbm90IGEgZmlsZS4KLUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZPTERFUj1JV0FCMDEzN0UgVGhlIG9iamVjdCAiezB9IiBpcyBub3QgYSBmb2xkZXIuCi0KLUpBVkFfRklMVEVSX05BTUU9SmF2YSBmaWxlcwotSkFWQV9GSUxURVJfREVTQz1GaWxlcyB3aXRoIG5hbWVzIGVuZGluZyBpbiAiLmphdmEiIG9yICIuY2xhc3MiLgotSkFWQV9GSUxURVJfTVNHX0VSUk9SX1dST05HX0VYVEVOU0lPTj1JV0FCMDEwMkUgVGhlIGZpbGUgInswfSIgZG9lcyBub3QgZW5kIGluICIuamF2YSIgb3IgIi5jbGFzcyIuCi0KLVdTRExfRklMVEVSX05BTUU9V1NETCBmaWxlcwotV1NETF9GSUxURVJfREVTQz1GaWxlcyB3aXRoIG5hbWVzIGVuZGluZyBpbiAiLndzZGwiLgotV1NETF9GSUxURVJfTVNHX0VSUk9SX1dST05HX0VYVEVOU0lPTj1JV0FCMDEwM0UgVGhlIGZpbGUgInswfSIgZG9lcyBub3QgZW5kIGluICIud3NkbCIuCi0KLUlTRF9GSUxURVJfTkFNRT1JU0QgZmlsZXMKLUlTRF9GSUxURVJfREVTQz1GaWxlcyB3aXRoIG5hbWVzIGVuZGluZyBpbiAiLmlzZCIuCi1JU0RfRklMVEVSX01TR19FUlJPUl9XUk9OR19FWFRFTlNJT049SVdBQjAwOTVFIFRoZSBmaWxlICJ7MH0iIGRvZXMgbm90IGVuZCBpbiAiLmlzZCIuCi0KLUZPTERFUl9GSUxURVJfTkFNRT1Gb2xkZXJzCi1GT0xERVJfRklMVEVSX0RFU0M9Rm9sZGVycy4KLQotCi0jCi0jIENvbW1vbiBtZXNzYWdlcwotIwotCi0KLU1TR19FUlJPUl9QUk9KRUNUX05PVF9GT1VORD1JV0FCMDA2OUUgV2ViIHByb2plY3Qgd2FzIG5vdCBmb3VuZC4KLU1TR19FUlJPUl9JTlNUQU5DRV9OT1RfRk9VTkQ9SVdBQjAwNzBFIFNlcnZlciB3YXMgbm90IGZvdW5kLgotCi1QUk9HUkVTU19JTkZPX1BVQkxJU0hfV0VCX1BST0pFQ1Q9SVdBQjAwNzJJIFB1Ymxpc2hpbmcgV2ViIHByb2plY3QuCi0KLSMKLSMgRGVwbG95bWVudCBzdGF0dXMKLSMKLVBST0dSRVNTX0lORk9fQ09QWV9XRUJTRVJWSUNFX1VUSUxTPUlXQUIwMDIzSSBDb3B5aW5nIHRoZSB3ZWJzZXJ2aWNlIHV0aWxpdGllcy4KLVBST0dSRVNTX0lORk9fQ09QWUlOR19GSUxFPUlXQUIwMTk3SSBDb3B5aW5nIFNPQVAgcnVuLXRpbWUgZmlsZS4KLVBST0dSRVNTX0lORk9fU1RBUlRfV0VCX1BST0pFQ1Q9SVdBQjAxOThJIFN0YXJ0aW5nIFdlYiBwcm9qZWN0LgotUFJPR1JFU1NfSU5GT19QVUJMSVNISU5HX1NFUlZFUj1JV0FCMDE5OUkgUHVibGlzaGluZyBzZXJ2ZXIuCi1QUk9HUkVTU19JTkZPX1NUQVJUSU5HX1NFUlZFUj1JV0FCMDIwMEkgU3RhcnRpbmcgc2VydmVyLgotUFJPR1JFU1NfSU5GT19QVUJMSVNIX1dFQl9QUk9KRUNUPUlXQUIwMjA1SSBQdWJsaXNoaW5nIFdlYiBwcm9qZWN0LgotCi0KLSMKLSMgRGVwbG95bWVudCBtZXNzYWdlcwotIwotTVNHX0VSUk9SX1BST0pFQ1RfTk9UX0ZPVU5EPUlXQUIwMjA3RSBXZWIgcHJvamVjdCB3YXMgbm90IGZvdW5kLgotTVNHX0VSUk9SX0ZJTEVDT1BZX1dFQlNFUlZJQ0VfVVRJTFM9SVdBQjAwMjRFIEVycm9yIGluIGNvcHlpbmcgV2Vic2VydmljZSBVdGlsaXR5IGZpbGUuCi1NU0dfRVJST1JfSU5TVEFOQ0VfTk9UX0ZPVU5EPUlXQUIwMjEyRSBTZXJ2ZXIgd2FzIG5vdCBmb3VuZC4KLU1TR19FUlJPUl9TRVJWRVI9SVdBQjAyMTNFIEVycm9yIGluIHN0YXJ0aW5nIHNlcnZlci4KLU1TR19FUlJPUl9QVUJMSVNIPUlXQUIwMjE3RSBFcnJvciBpbiBwdWJsaXNoaW5nIFdlYiBwcm9qZWN0LgotTVNHX0VSUk9SX0FERF9NT0RVTEU9RXJyb3Igb2NjdXJlZCB3aGVuIGFkZGluZyB0aGUgbW9kdWxlLCB7MH0sIHRvIHRoZSBzZXJ2ZXIKLQotTVNHX1dBUk5fTk9fREJfRFJJVkVSPUlXQUIwMjIxVyBVbmFibGUgdG8gbG9jYXRlIGRiMmphdmEuemlwLCBwbGVhc2UgZW5zdXJlIGRiMmphdmEuemlwIGlzIGFkZGVkIHRvIHRoZSBzZXJ2ZXIgY2xhc3MgcGF0aC4KLQotTVNHX0VSUk9SX0JBRF9TRVJWRVJfQ09ORklHPUlXQUIwNTM0RSBVbmFibGUgdG8gYWRkIEVBUiBwcm9qZWN0IHRvIFNlcnZlciBDb25maWd1cmF0aW9uLgotTVNHX0VSUk9SX0NSRUFURV9TRVJWRVI9SVdBQjAwMjVFIFVuYWJsZSB0byBjcmVhdGUgc2VydmVyLgotCi0KLQotIwotIyBFSkIgbWVzc2FnZXMKLSMKLVRBU0tfTEFCRUxfQ1JFQVRFX0VKQl9QUk9KRUNUPUNyZWF0ZUVKQlByb2plY3RUYXNrCi1UQVNLX0RFU0NfQ1JFQVRFX0VKQl9QUk9KRUNUPUNyZWF0ZSBhbiBFSkIgUHJvamVjdC4KLU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0VKQl9QUk9KRUNUPUlXQUIwNDMyRSBVbmFibGUgdG8gY3JlYXRlIEVKQiBwcm9qZWN0LgotTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfQVBQX0NMSUVOVF9QUk9KRUNUPUlXQUIwMDI2RSBVbmFibGUgdG8gY3JlYXRlIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0IHswfS4KLU1TR19FUlJPUl9DQU5OT1RfQ1JFQVRFX0pBVkFfUFJPSkVDVD1JV0FCMDAyN0UgVW5hYmxlIHRvIGNyZWF0ZSBKYXZhIHByb2plY3QgezB9LgotTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUFSX1BST0pFQ1Q9SVdBQjAwNjJFIFVuYWJsZSB0byBjcmVhdGUgRUFSIHByb2plY3QgezB9LgotCi0jCi0jIFdlYlNlcnZpY2VNYXBwaW5nUGFnZSBNZXNzYWdlcwotIwotCi0jCi0jIFZhbGlkYXRvciB0YXNrIGRlc2NyaXB0aW9ucwotIwotVEFTS19MQUJFTF9XRUJTRVJWSUNFX0RJU0FCTEVfVkFMSURBVElPTj1EaXNhYmxlIHZhbGlkYXRvcnMuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT049VGVtcG9yYXJpbHkgZGlzYWJsaW5nIHZhbGlkYXRvcnMuCi1UQVNLX0xBQkVMX1dFQlNFUlZJQ0VfUkVTVE9SRV9WQUxJREFUSU9OPVJlc3RvcmUgdmFsaWRhdG9ycy4KLVRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfVkFMSURBVElPTj1SZXN0b3Jpbmcgc3RhdGVzIG9mIHZhbGlkYXRvcnMuCi1UQVNLX0xBQkVMX1dFQlNFUlZJQ0VfRElTQUJMRV9CVUlMRD1EaXNhYmxlIGF1dG8gYnVpbGQuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX0JVSUxEPVRlbXBvcmFyaWx5IGRpc2FibGluZyBhdXRvIGJ1aWxkLgotVEFTS19MQUJFTF9XRUJTRVJWSUNFX1JFU1RPUkVfQlVJTEQ9UmVzdG9yZSBhdXRvIGJ1aWxkLgotVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9CVUlMRD1SZXN0b3Jpbmcgc3RhdGUgb2YgYXV0byBidWlsZC4KLVRBU0tfTEFCRUxfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUPUJ1aWxkIHByb2plY3QuCi1UQVNLX0RFU0NfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUPUJ1aWxkaW5nIHByb2plY3QuCi0KLSMKLSMgTUlTQwotIwotVEFTS19ERVNDX0NSRUFURV9XRUJfUFJPSkVDVD1DcmVhdGUgV2ViIFByb2plY3QKLVRBU0tfTEFCRUxfQ1JFQVRFX1dFQl9QUk9KRUNUPUNyZWF0ZSBXZWIgUHJvamVjdAotTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURT1JV0FCMDMxMEUgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGNyZWF0aW9uIG9mIHRoZSBXZWIgUHJvamVjdC4KLU1TR19FUlJPUl9TRVJWRVJfVklFV19PUEVOPUlXQUIwMTI2RSBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGlzIG9wZW4gZm9yIHswfS4gIENsb3NlIGl0IGFuZCByZXN0YXJ0IHRoZSB3aXphcmQuCi0KLSMKLSMgRGVmYXVsdCBQcm94eSBwcm9qZWN0IG1lc3NhZ2VzCi0jCi0KLQotIwotIwlEZXRlY3ROb25KYXZhQ2hhcnNDb21tYW5kCi0jCi1NU0dfV0FSTl9KQVZBX01FVEhPRF9TVEFSVF9XSVRIX1VQUEVSX0NBU0U9SVdBQjAxMjlXIEphdmEgbWV0aG9kIHswfSBpbiBjbGFzcyB7MX0gc3RhcnRzIHdpdGggYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE1ldGhvZCBuYW1lcyBzaG91bGQgYmVnaW4gd2l0aCBsb3dlciBjYXNlIGxldHRlcnMuCi1NU0dfV0FSTl9NRVRIT0RfTkFNRV9JTlZBTElEPUlXQUIwMTMxVyBKYXZhIG1ldGhvZCB7MH0gbmFtZSBjb250YWlucyB1bmRlcnNjb3JlIG9yIG51bWVyaWMgZGlnaXRzIGZvbGxvd2VkIGJ5IGEgbG93ZXIgY2FzZSBsZXR0ZXIuXAotTWV0aG9kIG5hbWVzIHNob3VsZCBub3QgY29udGFpbiBsb3dlciBjYXNlIGxldHRlcnMgYWZ0ZXIgYSBudW1lcmljIG9yIHVuZGVyc2NvcmUuCi1NU0dfV0FSTl9CT09MRUFOX1BST1BFUlRZX0FDQ0VTU09SUz1JV0FCMDEzMlcgQm9vbGVhbiBwcm9wZXJ0eSBhY2Nlc3NvciB7MH0gaW4gYmVhbiB7MX0gYmVnaW5zIHdpdGggImdldCIuIEJvb2xlYW4gZ2V0dGVyIG1ldGhvZHMgc2hvdWxkIGJlZ2luIHd0aCAiaXMiLgotTVNHX1dBUk5fUEFDS0FHRV9OQU1FX0hBU19VUFBFUl9DQVNFPUlXQUIwMTMzVyBUaGUgcGFja2FnZSBuYW1lIHswfSBvZiBjbGFzcyB7MX0gaW5jbHVkZXMgdXBwZXIgY2FzZSBsZXR0ZXJzLiBQYWNrYWdlIG5hbWVzIHNob3VsZCBjb25zaXN0IG9mIGxvd2VyIGNhc2UgbGV0dGVycyBvbmx5LgotCi0jCi0jIEphdmFUb01vZGVsQ29tbWFuZAotIwotTEFCRUxfT0s9T0sKLURFU0NSSVBUSU9OX09LPVNlbGVjdCBPSyB0byBjb250aW51ZQotCi1MQUJFTF9DQU5DRUw9Q2FuY2VsCi1ERVNDUklQVElPTl9DQU5DRUw9U2VsZWN0IENhbmNlbCB0byBjYW5jZWwKLQotIwotIyBDcmVhdGVNb25pdG9yQ29tbWFuZAotIwotTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SPUlXQUIwMDAxRSBVbmFibGUgdG8gbW9uaXRvciBwb3J0IHswfSBvZiB7MX0uCi1NU0dfSU5GT19NT05JVE9SSU5HX05PVF9TVVBQT1JURUQ9SVdBQjAwMDJJIHswfSBkb2VzIG5vdCBzdXBwb3J0IHBvcnQgbW9uaXRvcmluZy4KLQotIwotIyBDb3B5V1NETENvbW1hbmQKLSMKLUNPTU1BTkRfTEFCRUxfQ09QWV9XU0RMPUNvcHlpbmcgV1NETAotQ09NTUFORF9ERVNDX0NPUFlfV1NETD1Db3B5aW5nIFdTREwgaW50byB0aGUgd29ya3NwYWNlIGZvciBXZWIgc2VydmljZSBkZXBsb3ltZW50Ci1NU0dfRVJST1JfQ09QWV9XU0RMPUlXQUIwMDI4RSBGYWlsZWQgdG8gY29weSBXU0RMIHswfSB0byB7MX0KLQotIwotIyBBc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZAotIwotTVNHX0VSUk9SX1VOQUJMRV9UT19BU1NPQ0lBVEU9VW5hYmxlIHRvIGFzc29jaWF0ZSBjb21wb25lbnQgezB9IHRvIGVhciBjb21wb25lbnQgezF9LgotCi0jCi0jIENyZWF0ZU1vZHVsZUNvbW1hbmQKLSMKLU1TR19FUlJPUl9DUkVBVEVfRkxFWF9QUk9KRVQ9QW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgY3JlYXRpb24gb2YgZmxleGlibGUgcHJvamVjdCB7MH0uCi1NU0dfRVJST1JfQ1JFQVRFX1dFQl9DT01QT05FTlQ9QW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgY3JlYXRpb24gb2YgV2ViIGNvbXBvbmVudCB7MH0uCi1NU0dfRVJST1JfQ1JFQVRFX0VKQl9DT01QT05FTlQ9QW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgY3JlYXRpb24gb2YgRUpCIGNvbXBvbmVudCB7MH0uCi1NU0dfRVJST1JfQ1JFQVRFX0FQUENMSUVOVF9DT01QT05FTlQ9QW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgY3JlYXRpb24gb2YgQXBwbGljYXRpb24gQ2xpZW50IGNvbXBvbmVudCB7MH0uCi1NU0dfRVJST1JfQ1JFQVRFX0VBUl9DT01QT05FTlQ9QW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgY3JlYXRpb24gb2YgRUFSIGNvbXBvbmVudCB7MH0uIAotTVNHX0VSUk9SX0NPTVBPTkVOVF9DUkVBVElPTj1VbmFibGUgdG8gY3JlYXRlIHByb2plY3QgezB9IGFuZC9vciBjb21wb25lbnQgezF9LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL0dlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY4N2FmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9yIGltcGxlbWVudHMgVmlzaXRvckFjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgLyoqCi0gICogVGhlIFN0cmluZ0J1ZmZlciB0aGF0IGhvbGRzIHRoZSBjb2RlZ2VuIAotICAqICovCi0gIHByb3RlY3RlZCBTdHJpbmdCdWZmZXIgZmJ1ZmZlcjsgCi0KLSAgLyoqCi0gICogVGhlIFZpc2l0b3IgdGhhdCBjYWxscyB0aGUgdmlzaXQgbWV0aG9kIAotICAqICovCi0gIHByb3RlY3RlZCBWaXNpdG9yIGZWaXNpdG9yOyAKLQotICAvKioKLSAgKiBWZWN0b3IgdGhhdCBob2xkcyBzdGF0ZSBkYXRhIGZvciB0aGlzICBnZW5lcmF0b3IgCi0gICogKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBmUmVzaWRlbnRWZWN0b3I7Ci0gCi0gIC8qCi0gICogVGhpcyBpbnQgaG9sZHMgdGhlIGN1cnJlbnQgbnVtYmVyIAotICAqLwotICBwcm90ZWN0ZWQgaW50IGZVbmlxdWVOdW1iZXIgPTA7Ci0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBmQ2xpZW50Rm9sZGVyUGF0aDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZID0gIkZhY3RvcnkiOyAKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAiICAgICI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9UQUIgPSAiICAgICAgICAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICIgIjsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgR2VuZXJhdG9yICgpCi0gIHsKLSAgICAgIGZidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBmUmVzaWRlbnRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7IAotICAgIAotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIFN0cmluZ0J1ZmZlciBUYWtlcyB0aGUgYnVmZmVyIGl0IHdpbGwgd3JpdGUgY29kZSB0bwotICAqLwotICBwdWJsaWMgR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBmYnVmZmVyID0gYnVmZmVyOwotICAgICAgZlJlc2lkZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgcmVzaWRlbnQpCi0gIHsKLSAgICAvL25vdGhpbmcgdG8gYmUgZG9uZSBidXQgbXVzdCBiZSBpbXBsZW1lbnRlZAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEZvbGRlclBhdGgoKQotICB7Ci0gICAgcmV0dXJuIGZDbGllbnRGb2xkZXJQYXRoOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50Rm9sZGVyUGF0aChTdHJpbmcgZkNsaWVudEZvbGRlclBhdGhfKQotICB7Ci0gICAgZkNsaWVudEZvbGRlclBhdGggPSBmQ2xpZW50Rm9sZGVyUGF0aF87Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lID0gIiI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWUgPSAiIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdlTmFtZSA9ICIiOwotICBwcm90ZWN0ZWQgU3RyaW5nIHByb3h5QmFzZU5hbWUgPSAiIjsKLQotICBwdWJsaWMgdm9pZCBzZXRJbmZvKFN0cmluZyBzZXJ2aWNlLCBTdHJpbmcgcG9ydCwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcHJveHlCYXNlKQotICB7Ci0gICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlOwotICAgIHBvcnROYW1lID0gcG9ydDsKLSAgICB0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7IAotICAgIHByb3h5QmFzZU5hbWUgPSBwcm94eUJhc2U7ICAKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCQURfU1lNQk9MUyA9IHsnLScsICcgJ307IC8vIHN5bWJvbHMgdGhhdCBjYW4gYXBwZWFyIGluIHRoZSBmb2xkZXIgbmFtZSBidXQgaXQgaXMgbm90IGFsbG93ZWQgaW4gYSBqYXZhIGJlYW4gbmFtZQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFVOREVSU0NPUkUgPSAnXyc7CS8vIHJlcGxhY2UgdGhlIGFib3ZlIG9uZXMgYnkgdW5kZXJzY29yZQotICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25CZWFuSWQoKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBnZXRDbGllbnRGb2xkZXJQYXRoKCk7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLyIpOwotICAgIGluZGV4Kys7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0gICAgZm9yICggaW50IGkgPSAwOyBpIDwgQkFEX1NZTUJPTFMubGVuZ3RoOyBpKysgKSB7Ci0gICAgCW5ld05hbWUgPSBuZXdOYW1lLnJlcGxhY2UgKCBCQURfU1lNQk9MU1tpXSwgVU5ERVJTQ09SRSApOwotICAgIH0KLSAgICByZXR1cm4gbmV3TmFtZSsgImlkIjsKLSAgfQotCi0gIC8qCi0gICogVGhlIE51bWJlciBGYWN0b3J5IGlzIGhlcmUgZm9yIG5hbWluZyBwdXJwb3Nlcy4gSW4gCi0gICogdGhpcyB3YXkgd2UgaW5zdXJlIG5vIG5hbWVzIHdlIGNyZWF0ZSBpbiBhIHBpZWNlIG9mCi0gICogY29kZSBnZW4gYXJlIHRoZSBzYW1lLiBXZSBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXJzCi0gICogdXNlZCBhbmQgd2UgaGFuZCBiYWNrIHRoZSBuZXh0IG9uZS4gTGlrZSB0YWtlIGEgbnVtYmVyIAotICAqIGJ1ZGR5Ci0gICogQHBhcmFtIGludCBudW1iZXIgd2UgYXJlIGF0IGFzIHRoZSBzdGF0ZSBkYXRhIGhhcyB0byBiZSBzZXR0YWJsZQotICAqLwotICBwdWJsaWMgdm9pZCBzZXROdW1iZXJGYWN0b3J5KGludCBudW1iZXIpCi0gIHsKLSAgICAgZlVuaXF1ZU51bWJlciA9IG51bWJlcjsKLSAgfQotCi0KLSAgLyoKLSAgKiBUaGlzIGlzIGEgdW5pcXVlIG51bWJlciBmb3Igc3RhdGUgcHVycG9zZXMKLSAgKiBAcmV0dXJuIGludCAKLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJGYWN0b3J5KCkKLSAgewotICAgICByZXR1cm4gZlVuaXF1ZU51bWJlcjsgCi0gIH0KLSAgLyoKLSAgKiBUaGlzIGlzIGEgdW5pcXVlIG51bWJlciBmb3IgbmFtaW5nIHB1cnBvc2VzCi0gICogQHJldHVybiBpbnQgCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0VW5pcXVlTnVtYmVyKCkKLSAgewotICAgICByZXR1cm4gZlVuaXF1ZU51bWJlcisrOwotICB9Ci0KLQotICAvKioKLSAgKiByZXR1cm5zIHRoZSBjdXJyZW50IFN0cmluZ0J1ZmZlcgotICAqIEByZXR1cm4gU3RyaW5nQnVmZmVyIFRha2VzIHRoZSBidWZmZXIgaXQgd2lsbCB3cml0ZSBjb2RlIHRvbwotICAqLwotICBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFN0cmluZ0J1ZmZlciAoKQotICB7Ci0gICAgICByZXR1cm4gZmJ1ZmZlcjsKLSAgfQotCi0gIAotICAvKioKLSAgKiByZXR1cm5zIHRoZSBWaXNpdG9yIHRoYXQgY2FsbGVkIHRoaXMgZ2VuZXJhdG9yCi0gICogQHJldHVybiBWaXNpdG9yIAotICAqLwotICBwdWJsaWMgVmlzaXRvciBnZXRWaXNpdG9yICgpCi0gIHsKLSAgICAgIHJldHVybiBmVmlzaXRvcjsKLSAgfQotICAKLQotCi0KLSAgLyoqCi0gICogdmVjdG9yIHVzZWQgdG8gaG9sZCBzdGF0ZSBkYXRhIAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvciAKLSAgKi8KLSAgcHVibGljIHZvaWQgcHV0UmVzaWRlbnRWZWN0b3IgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIGZSZXNpZGVudFZlY3Rvci5hZGRFbGVtZW50KG9iamVjdCk7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICogdmVjdG9yIHVzZWQgdG8gaG9sZCBzdGF0ZSBkYXRhIAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvciAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IgKFZlY3RvciB2ZWN0b3IpCi0gIHsKLSAgICAgIGZSZXNpZGVudFZlY3RvciA9IHZlY3RvcjsKLSAgfQotICAKLQotICAvKioKLSAgKiByZXR1cm5zIHRoZSByZXNpZGVudCB2ZWN0b3IKLSAgKiBAcmV0dXJuIFZpc2l0b3IgCi0gICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0UmVzaWRlbnRWZWN0b3IgKCkKLSAgewotICAgICAgcmV0dXJuIGZSZXNpZGVudFZlY3RvcjsKLSAgfQotICAKLQotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbnkgc3RhdGUgYSBnZW5lcmF0b3IgbWF5IGhhdmUKLSAgKgotICAqKi8KLQotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLSAgewotICAgICAvL3RvIGJlIGltcGxlbWVudGVkIGluIHN1Ymxhc3NlcwotICB9Ci0KLQotICAgLyoqCi0gICogc2V0cyB0aGUgdmlzaXRvciB0aGF0IGNhbGxzIHRoZSB2aXNpdAotICAqIEBwYXJhbWV0ZXIgVmlzaXRvciAKLSAgKi8KLQotICBwdWJsaWMgdm9pZCBzZXRWaXNpdG9yKFZpc2l0b3IgdmlzaXRvcikKLSAgewotICAgICAgZlZpc2l0b3IgPSB2aXNpdG9yOwotICB9Ci0KLQotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAvL2ltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKLSAgCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1JlbFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9SZWxWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZmI1NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1JlbFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbjsKLSAgICAgIAotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qIFRoaXMgdmlzdG9yIHdpbGwgdmlzaXQgZWxlbWVudHMgaW4gYSBtb2RlbCBnaXZlbiBhIAotKiBwYXJ0aWN1bGFyIHJlbAotKiAqLwotcHVibGljIGNsYXNzIFJlbFZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHByaXZhdGUgaW50IGZFbGVtZW50Q291bnRlcjsKLSAgcHJpdmF0ZSBpbnQgZlRvdGFsRWxlbWVudHM7Ci0gIHByaXZhdGUgU3RyaW5nIGZyZWxOYW1lOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBSZWxWaXNpdG9yIChTdHJpbmcgcmVsTmFtZSkKLSAgewotICAgICBmcmVsTmFtZSA9IHJlbE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgZ2V0VG90YWxFbGVtZW50c1RvVmlzaXQoKQotICB7Ci0gICAgIHJldHVybiBmVG90YWxFbGVtZW50czsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoKQotICB7Ci0gICAgIGlmKGdldFRvdGFsRWxlbWVudHNUb1Zpc2l0KCkgLSBwcmVzZW50RWxlbWVudCgpID09IDApIHJldHVybiB0cnVlOwotICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgaW50IHByZXNlbnRFbGVtZW50KCkKLSAgewotICAgICByZXR1cm4gZkVsZW1lbnRDb3VudGVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFZpc2l0b3JBY3Rpb24gdmEpCi0gIHsKLSAgICAvL2ltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKLSAgfSAgCi0gIHB1YmxpYyBTdGF0dXMgcnVuIChPYmplY3Qgc291cmNlRWxlbWVudCxWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgCSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgICAgIGluaXRpYWxpemUodkFjdGlvbik7Ci0gIAotICAgICAgICB2QWN0aW9uLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgICAgIFJlbCByZWwgPSAoKEJhc2ljRWxlbWVudClzb3VyY2VFbGVtZW50KS5nZXRSZWwoZnJlbE5hbWUpOwotICAgICAgICAvL3NldCBzb21lIHN0YXRlIGRhdGEKLSAgICAgICAgZlRvdGFsRWxlbWVudHMgPSByZWwuZ2V0TnVtYmVyT2ZUYXJnZXRFbGVtZW50cygpOwotICAgICAgICBmRWxlbWVudENvdW50ZXIgPSAwOyAgCi0gICAgICAgIAotICAgICAgICBFbnVtZXJhdGlvbiBlID0gcmVsLmdldFRhcmdldEVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICAgQmFzaWNFbGVtZW50IHRhcmdldEVsZW1lbnQgPSAoQmFzaWNFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsgCi0gICAgICAgICAgIGZFbGVtZW50Q291bnRlcisrOwotICAgICAgICAgICBpbml0aWFsaXplKHZBY3Rpb24pOwotICAgICAgICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KHRhcmdldEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9WaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzM5NDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHVibGljIFN0YXR1cyBydW4gKE9iamVjdCBvYmplY3QsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbik7Ci0gICAgICAgIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL1Zpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiNzJkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFZpc2l0b3JBY3Rpb24uCi0qIFRoZSB2aXNpdG9yIHdhbGtzIHRoZSBtb2RlbCBhbmQgdGhlIFZpc2l0b3JBY3Rpb24gCi0qIGRvZXMgdGhlIGFjdGlvbgotKiAqLwotcHVibGljIGludGVyZmFjZSBWaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpOwotICBwdWJsaWMgdm9pZCBzZXRWaXNpdG9yKFZpc2l0b3IgdmlzaXRvcik7Ci0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHJlc2lkZW50U3RyaW5nKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL0F0dHJpYnV0ZVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL0F0dHJpYnV0ZVZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmZmRhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9BdHRyaWJ1dGVWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5SZWxWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLklucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlVmlzaXRvciBleHRlbmRzIFJlbFZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZlJlc2lkZW50U3RyaW5nOyAKLSAgcHJpdmF0ZSBWZWN0b3IgZlJlc2lkZW50VmVjdG9yMTsKLSAgcHJpdmF0ZSBWZWN0b3IgZlJlc2lkZW50VmVjdG9yMjsKLQotICAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIEF0dHJpYnV0ZVZpc2l0b3IgKCkKLSAgewotICAgIHN1cGVyKFR5cGVFbGVtZW50LlJFTF9BVFRSSUJVVEVTKTsKLSAgICBmUmVzaWRlbnRTdHJpbmcgPSAiIjsKLSAgfQotCi0gIHB1YmxpYyBBdHRyaWJ1dGVWaXNpdG9yIChTdHJpbmcgcmVsKQotICB7Ci0gICAgc3VwZXIocmVsKTsKLSAgICBmUmVzaWRlbnRTdHJpbmcgPSAiIjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRTdHJpbmcoU3RyaW5nIHJlc2lkZW50KQotICB7Ci0gICAgZlJlc2lkZW50U3RyaW5nID0gcmVzaWRlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNpZGVudFZlY3RvcjEoVmVjdG9yIHJlc2lkZW50KQotICB7Ci0gICAgZlJlc2lkZW50VmVjdG9yMSA9IHJlc2lkZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IyKFZlY3RvciByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFZlY3RvcjIgPSByZXNpZGVudDsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAgICAvL2hhY2sgZm9yIDE5NzcyNgotCi0gICAgIGlmKHZBY3Rpb24gaW5zdGFuY2VvZiBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IpewotICAgICAgIGlmKGZSZXNpZGVudFZlY3RvcjEgPT0gbnVsbCkgZlJlc2lkZW50VmVjdG9yMT1uZXcgVmVjdG9yKCk7Ci0gICAgICAgaWYoZlJlc2lkZW50VmVjdG9yMiA9PSBudWxsKSBmUmVzaWRlbnRWZWN0b3IyPW5ldyBWZWN0b3IoKTsKLSAgICAgICAoKElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcil2QWN0aW9uKS5zZXRQYXJlbnRHZXR0ZXJzKGZSZXNpZGVudFZlY3RvcjEsZlJlc2lkZW50VmVjdG9yMik7Ci0gICAgIH0KLSAgfQotIAotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vRmllbGRWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9GaWVsZFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkYjM4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9GaWVsZFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuLklucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgRmllbGRWaXNpdG9yIGV4dGVuZHMgQXR0cmlidXRlVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICBwcml2YXRlIFN0cmluZyBmUmVzaWRlbnRTdHJpbmc7IAotICBwcml2YXRlIFZlY3RvciBmUmVzaWRlbnRWZWN0b3IxOwotICBwcml2YXRlIFZlY3RvciBmUmVzaWRlbnRWZWN0b3IyOwotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgRmllbGRWaXNpdG9yICgpCi0gIHsKLSAgICBzdXBlcihUeXBlRWxlbWVudC5SRUxfRklFTERTKTsKLSAgICBmUmVzaWRlbnRTdHJpbmcgPSAiIjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRTdHJpbmcoU3RyaW5nIHJlc2lkZW50KQotICB7Ci0gICAgZlJlc2lkZW50U3RyaW5nID0gcmVzaWRlbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNpZGVudFZlY3RvcjEoVmVjdG9yIHJlc2lkZW50KQotICB7Ci0gICAgZlJlc2lkZW50VmVjdG9yMSA9IHJlc2lkZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzaWRlbnRWZWN0b3IyKFZlY3RvciByZXNpZGVudCkKLSAgewotICAgIGZSZXNpZGVudFZlY3RvcjIgPSByZXNpZGVudDsKLSAgfQotCi0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAgICAvL2hhY2sgZm9yIDE5NzcyNgotCi0gICAgIGlmKHZBY3Rpb24gaW5zdGFuY2VvZiBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IpewotICAgICAgIGlmKGZSZXNpZGVudFZlY3RvcjEgPT0gbnVsbCkgZlJlc2lkZW50VmVjdG9yMT1uZXcgVmVjdG9yKCk7Ci0gICAgICAgaWYoZlJlc2lkZW50VmVjdG9yMiA9PSBudWxsKSBmUmVzaWRlbnRWZWN0b3IyPW5ldyBWZWN0b3IoKTsKLSAgICAgICAoKElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcil2QWN0aW9uKS5zZXRQYXJlbnRHZXR0ZXJzKGZSZXNpZGVudFZlY3RvcjEsZlJlc2lkZW50VmVjdG9yMik7Ci0gICAgIH0KLSAgfQotIAotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vTWV0aG9kVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vTWV0aG9kVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDY2NDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL01ldGhvZFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uUmVsVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVmlzaXRvciBleHRlbmRzIFJlbFZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIE1ldGhvZFZpc2l0b3IgKCkKLSAgewotICAgICBzdXBlcihCZWFuRWxlbWVudC5SRUxfTUVUSE9EUyk7Ci0gIH0KLSAgCi0gICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vUGFyYW1ldGVyVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vUGFyYW1ldGVyVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ5MzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1BhcmFtZXRlclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uUmVsVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdmlzaXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJWaXNpdG9yIGV4dGVuZHMgUmVsVmlzaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLQotICBwdWJsaWMgUGFyYW1ldGVyVmlzaXRvciAoKQotICB7Ci0gICAgIHN1cGVyKE1ldGhvZEVsZW1lbnQuUkVMX1BBUkFNRVRFUlMpOwotICB9Ci0gIAotICAgCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1JldHVyblBhcmFtZXRlclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1JldHVyblBhcmFtZXRlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2MjA3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vYmVhbi9SZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlJlbFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmV0dXJuUGFyYW1ldGVyVmlzaXRvciBleHRlbmRzIFJlbFZpc2l0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0KLSAgcHVibGljIFJldHVyblBhcmFtZXRlclZpc2l0b3IgKCkKLSAgewotICAgICBzdXBlcihNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyk7Ci0gIH0KLSAgCi0gICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vVHlwZVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9iZWFuL1R5cGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNTQ2MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2JlYW4vVHlwZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uUmVsVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgVHlwZVZpc2l0b3IgZXh0ZW5kcyBSZWxWaXNpdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotCi0gIHB1YmxpYyBUeXBlVmlzaXRvciAoKQotICB7Ci0gICAgc3VwZXIoVHlwZUVsZW1lbnQuUkVMX1RZUEUpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTk2NWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mTWV0aG9kVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLgotKiBUaGlzIFZpc2l0b3JBY3Rpb24gd2lsbCBjcmVhdGUgYSBCZWFuRWxlbWVudCB1c2luZyB0aGUKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgdGhlIG1ldGhvZHMgaW4gdGhlIEphdmFDbGFzcwotKiAqLwotcHVibGljIGNsYXNzIERldGVjdE5vbkphdmFDaGFyc0JlYW5WaXNpdG9yQWN0aW9uIGV4dGVuZHMgVmlzaXRvckFjdGlvbkltcGwKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBVTkRFUlNDT1JFID0gJ18nOwotICBwcml2YXRlIGJvb2xlYW4gc2VydmljZUJlYW4gPSBmYWxzZTsKLQotICBwdWJsaWMgRGV0ZWN0Tm9uSmF2YUNoYXJzQmVhblZpc2l0b3JBY3Rpb24gKCBWZWN0b3IgbWVzc2FnZXMsIFZlY3RvciBiZWFucykKLSAgCXsKLSAgCQlzdXBlciAobWVzc2FnZXMsIGJlYW5zKTsKLSAgCQkvLyBpZiBmaXJzdCBiZWFuIGZpc2l0ZWQgdGhhdCBtZWFucyBpdCBpcyB0aGUgU2VydmljZSBiZWFuCi0gIAkJaWYgKCBiZWFucyA9PSBudWxsICkgCi0gIAkJCXNlcnZpY2VCZWFuID0gdHJ1ZTsKLSAgCX0KLQotICAvKioKLSAgKiBUaGUgdmlzaXQgd2lsbCBjcmVhdGUgdGhlIGJlYW4KLSAgKiBXYWxrIHRoZSBtZXRob2RzCi0gICogQHBhcmFtIEphdmFDbGFzcyB0aGUgY2xhc3MgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGJlYW4gbW9kZWwKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBqYXZhY2xhc3MpCi0gIHsKLSAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhY2xhc3M7Ci0gICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gamF2YUNsYXNzLmdldEphdmFQYWNrYWdlKCkuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICBTdHJpbmcgYmVhbk5hbWUgPSBqYXZhQ2xhc3MuZ2V0TmFtZSgpOwotCi0gICAgaWYgKCFpc0JlYW5WaXNpdGVkKGphdmFDbGFzcykpIHsKLSAgICAgIAlhZGRWaXNpdGVkQmVhbihqYXZhQ2xhc3MpOwotCQkvLyBjaGVjayB0aGUgYmVhbiBuYW1lCi0JCWNoZWNrQmVhbk5hbWUoYmVhbk5hbWUpOwotCQljaGVja1BhY2thZ2VOYW1lKHBhY2thZ2VOYW1lLCBiZWFuTmFtZSk7Ci0JICAJRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbiBtZXRob2RWaXNpdG9yQWN0aW9uID0gbmV3IERldGVjdE5vbkphdmFDaGFyc01ldGhvZFZpc2l0b3JBY3Rpb24oZ2V0TWVzc2FnZXMoKSwgZ2V0QmVhbnNWaXNpdGVkKCkpOwotICAgICAgCUphdmFNb2ZNZXRob2RWaXNpdG9yIG1ldGhvZFZpc2l0b3IgPSBuZXcgSmF2YU1vZk1ldGhvZFZpc2l0b3IoKTsKLSAgICAJbWV0aG9kVmlzaXRvci5ydW4oamF2YUNsYXNzLG1ldGhvZFZpc2l0b3JBY3Rpb24pOwotICAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgfQotCi0gICBwcml2YXRlIHZvaWQgY2hlY2tCZWFuTmFtZShTdHJpbmcgYmVhbk5hbWUpCi0gICAJewotCSAKLQkgLy8gY2hlY2sgaWYgdGhlIGJlYW4gc3RhcnRzIHdpdGggYSBsb3dlciBjYXNlCi0JIGlmICggQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGJlYW5OYW1lLmNoYXJBdCgwKSkpCi0gICAgCWFkZE1lc3NhZ2UoIldBUk5fQkVBTl9OQU1FX1NUQVJUU19XSVRIX0xPV0VSX0NBU0UiLCBuZXcgU3RyaW5nW117YmVhbk5hbWV9KTsgIAotCi0JCi0gICAgIC8vY2hlY2sgaWYgdGhlIG5hbWUgaGFzIGFuIHVuZGVyc2NvcmUsIHRoZW4gbmV4dCBsZXR0ZXIgc2hvdWxkIGJlIHVwcGVyIGNhc2UKLSAgICAgaW50IHVuZGVyU2NvcmVJbmRleCA9IGJlYW5OYW1lLmluZGV4T2YoVU5ERVJTQ09SRSk7Ci0JIFN0cmluZyB0ZW1wTmFtZSA9IGJlYW5OYW1lOwotCSB3aGlsZSh1bmRlclNjb3JlSW5kZXggIT0tMSkgewotCQl0ZW1wTmFtZSA9IHRlbXBOYW1lLnN1YnN0cmluZyh1bmRlclNjb3JlSW5kZXgrMSk7Ci0JCWlmICggQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHRlbXBOYW1lLmNoYXJBdCgwKSkpIHsKLSAgICAgIAkJYWRkTWVzc2FnZSgiTVNHX1dBUk5fTUVUSE9EX05BTUVfSU5WQUxJRCIsIG5ldyBTdHJpbmdbXSB7IGJlYW5OYW1lIH0pOyAgCi0gICAgICAJCWJyZWFrOwotCQkJfQotCQllbHNlCi0JCQl1bmRlclNjb3JlSW5kZXggPSB0ZW1wTmFtZS5pbmRleE9mKFVOREVSU0NPUkUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGFja2FnZU5hbWUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgYmVhbk5hbWUpCi0JCXsKLQkJCWlmICghcGFja2FnZU5hbWUuZXF1YWxzKHBhY2thZ2VOYW1lLnRvTG93ZXJDYXNlKCkpKQotCQkJCWFkZE1lc3NhZ2UoIk1TR19XQVJOX1BBQ0tBR0VfTkFNRV9IQVNfVVBQRVJfQ0FTRSIsIG5ldyBTdHJpbmdbXSB7IHBhY2thZ2VOYW1lLCBiZWFuTmFtZSB9KTsKLQkJfQotIH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZGQ2MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNNZXRob2RWaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlIAotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayB0aGUgbWV0aG9kcyBpbiB0aGUgSmF2YUNsYXNzCi0qICovCi1wdWJsaWMgY2xhc3MgRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbiBleHRlbmRzIFZpc2l0b3JBY3Rpb25JbXBsIAotewotICBwcml2YXRlIHN0YXRpYyBjaGFyIFVOREVSU0NPUkUgPSAnXyc7Ci0gIHByaXZhdGUgYm9vbGVhbiBzZXJ2aWNlQmVhbiA9IGZhbHNlOwotCi0gICBwdWJsaWMgRGV0ZWN0Tm9uSmF2YUNoYXJzTWV0aG9kVmlzaXRvckFjdGlvbiAoIFZlY3RvciBtZXNzYWdlcywgVmVjdG9yIGJlYW5zKQotICAJewotICAJCXN1cGVyIChtZXNzYWdlcywgYmVhbnMpOwotICAJCWlmICggYmVhbnMuc2l6ZSgpID09IDEpCi0gIAkJCXNlcnZpY2VCZWFuID0gdHJ1ZTsKLSAgCX0KLQotICAvKioKLSAgKiBDcmVhdGUgYSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBtZXRob2QgCi0gICogQHBhcmFtIE1ldGhvZCB0aGUgY2xhc3MgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IGltZXRob2QpCi0gIHsKLSAgICAKLSAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClpbWV0aG9kOwotICAgIFN0cmluZyAgY2xhc3NOYW1lID0gbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOwotCi0JaWYgKCBzZXJ2aWNlQmVhbiAmJiAhbWV0aG9kLmlzQ29uc3RydWN0b3IoKSApCi0JCWNoZWNrVXBwZXJDYXNlKG5hbWUsIGNsYXNzTmFtZSk7Ci0JCi0JLy8gZm9yIHNlcnZpY2UgYmVhbiBvciBhbnkgcmVmZXJlbmNlZCBiZWFuIHByb3BlcnR5IGFjY2Vzc29ycwotCSBpZiAoIHNlcnZpY2VCZWFuIHx8IG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikgfHwgbmFtZS5zdGFydHNXaXRoKCJzZXQiKSB8fCBuYW1lLnN0YXJ0c1dpdGgoImlzIikpIAotCSB7Ci0JICAgIGNoZWNrVW5kZXJTY29yZShuYW1lLCBjbGFzc05hbWUpOwotCSAgICBjaGVja051bWVyaWNEaWdpdHMobmFtZSwgY2xhc3NOYW1lKTsKLQkgICAgY2hlY2tCb29sZWFuUHJvcGVydGllcyhtZXRob2QsIGNsYXNzTmFtZSk7Ci0JCSAgCQotCSAJRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uID0gbmV3IERldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24oZ2V0TWVzc2FnZXMoKSwgZ2V0QmVhbnNWaXNpdGVkKCkpOwotCSAJLy8gcnNrIFBhc3NpbmcgaW4gbnVsbCBmb3IgdGhlIGVudmlyb25tZW50LiBEZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIE9LIHN0YXR1cy4KLSAgICAJSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IgcGFyYW1ldGVyVmlzaXRvciA9IG5ldyBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvcihudWxsKTsKLSAgICAJcGFyYW1ldGVyVmlzaXRvci5ydW4obWV0aG9kLCBwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKTsgICAKLQkgIH0KLQkgCi0JIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrVXBwZXJDYXNlKFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gIAkgLy8gaW4gYSBzZXJ2aWNlIGJlYW4gY2hlY2sgaWYgYW55IG1ldGhvZCBzdGFydHMgd2l0aCB1cHBlciBjYXNlIGxldHRlcgotCSBpZiAoIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShuYW1lLmNoYXJBdCgwKSkpCi0gICAgCQlhZGRNZXNzYWdlKCJNU0dfV0FSTl9KQVZBX01FVEhPRF9TVEFSVF9XSVRIX1VQUEVSX0NBU0UiLCBuZXcgU3RyaW5nW117bmFtZSwgY2xhc3NOYW1lfSk7ICAKLQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrVW5kZXJTY29yZShTdHJpbmcgbmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgICAvL2NoZWNrIGlmIHRoZSBuYW1lIGhhcyBhbiB1bmRlcnNjb3JlLCB0aGVuIG5leHQgbGV0dGVyIHNob3VsZCBiZSB1cHBlciBjYXNlCi0gICAgIGludCB1bmRlclNjb3JlSW5kZXggPSBuYW1lLmluZGV4T2YoVU5ERVJTQ09SRSk7Ci0JIFN0cmluZyB0ZW1wTmFtZSA9IG5hbWU7Ci0JIHdoaWxlKHVuZGVyU2NvcmVJbmRleCAhPS0xKSB7Ci0JCXRlbXBOYW1lID0gdGVtcE5hbWUuc3Vic3RyaW5nKHVuZGVyU2NvcmVJbmRleCsxKTsKLQkJaWYgKCBDaGFyYWN0ZXIuaXNMb3dlckNhc2UodGVtcE5hbWUuY2hhckF0KDApKSkgewotICAgIAkJYWRkTWVzc2FnZSgiTVNHX1dBUk5fTUVUSE9EX05BTUVfSU5WQUxJRCIsIG5ldyBTdHJpbmdbXXtuYW1lLCBjbGFzc05hbWV9KTsgIAotICAgICAJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCXVuZGVyU2NvcmVJbmRleCA9IHRlbXBOYW1lLmluZGV4T2YoVU5ERVJTQ09SRSk7Ci0JICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrTnVtZXJpY0RpZ2l0cyhTdHJpbmcgbmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgICAvL2NoZWNrIGlmIHRoZSBuYW1lIGhhcyBhIG51bWVyaWMsIHRoZW4gbmV4dCBsZXR0ZXIgc2hvdWxkIGJlIHVwcGVyIGNhc2UKLSAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKQotICAgICAJewotICAgICAJCWlmICggQ2hhcmFjdGVyLmlzRGlnaXQobmFtZS5jaGFyQXQoaSkpKQotICAgICAJCQl7Ci0gICAgIAkJCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKG5hbWUuY2hhckF0KGkrMSkpKSB7Ci0JCQkgICAgCQlhZGRNZXNzYWdlKCJNU0dfV0FSTl9NRVRIT0RfTkFNRV9JTlZBTElEIiwgbmV3IFN0cmluZ1tde25hbWUsIGNsYXNzTmFtZX0pOyAgCi0JCQkgICAgIAkJYnJlYWs7Ci0gCQkJCQl9Ci0JCX0KLSAgICAgfQotICB9Ci0gIHByaXZhdGUgdm9pZCBjaGVja0Jvb2xlYW5Qcm9wZXJ0aWVzKE1ldGhvZCBtZXRob2QsIFN0cmluZyBjbGFzc05hbWUpCi0gIAl7Ci0gIAkJaWYgKCFzZXJ2aWNlQmVhbiAmJiBtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImdldCIpICYmIAotICAJCQkobWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKCJib29sZWFuIikgfHwKLSAgCQkJIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiamF2YS5sYW5nLkJvb2xlYW4iKSkpCi0gIAkJCWFkZE1lc3NhZ2UoIk1TR19XQVJOX0JPT0xFQU5fUFJPUEVSVFlfQUNDRVNTT1JTIiwgbmV3IFN0cmluZ1tde21ldGhvZC5nZXROYW1lKCksIGNsYXNzTmFtZX0pOyAgCi0gIAl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvRGV0ZWN0Tm9uSmF2YUNoYXJzUGFyYW1ldGVyVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjNjNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9EZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZkJlYW5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLgotKiBUaGlzIFZpc2l0b3JBY3Rpb24gd2lsbCBjcmVhdGUgYSBCZWFuRWxlbWVudCB1c2luZyB0aGUgCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBjbGFzcyBEZXRlY3ROb25KYXZhQ2hhcnNQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uIGV4dGVuZHMgVmlzaXRvckFjdGlvbkltcGwgCi17Ci0KLSAgcHVibGljIERldGVjdE5vbkphdmFDaGFyc1BhcmFtZXRlclZpc2l0b3JBY3Rpb24gKCBWZWN0b3IgbWVzc2FnZXMsIFZlY3RvciBiZWFucykKLSAgCXsKLSAgCQlzdXBlciAobWVzc2FnZXMsIGJlYW5zKTsKLSAgCX0KLQotICAvKioKLSAgKiBDcmVhdGUgYSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBtZXRob2QgCi0gICogQHBhcmFtIE1ldGhvZCB0aGUgY2xhc3MgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IGlqYXZhUGFyYW1ldGVyKQotICB7Ci0gICAgCi0gICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyID0gKEphdmFQYXJhbWV0ZXIpIGlqYXZhUGFyYW1ldGVyOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBudWxsOwotICAgIGlmICggamF2YVBhcmFtZXRlci5nZXRKYXZhVHlwZSgpIGluc3RhbmNlb2YgSmF2YUNsYXNzKSAKLSAgICAJewotICAgIAlqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKSBqYXZhUGFyYW1ldGVyLmdldEphdmFUeXBlKCk7Ci0gICAgCWlmIChqYXZhQ2xhc3MuaXNBcnJheSgpKQotICAgIAkgIHsKLSAgICAJICAgIEphdmFIZWxwZXJzIGNvbXBvbmVudFR5cGUgPSAoKEFycmF5VHlwZSlqYXZhQ2xhc3MpLmdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpOwotICAgIAkgICAgaWYgKGNvbXBvbmVudFR5cGUgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpCi0gICAgCSAgICAgIHsKLSAgICAJICAgICAgICBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWNvbXBvbmVudFR5cGU7Ci0gICAgCSAgICAgIH0KLSAgICAJICAgIGVsc2UKLSAgICAJICAgICAgewotICAgIAkgICAgICAgIGphdmFDbGFzcyA9IG51bGw7IC8vVGhlIGFycmF5IGNvbnRhaW5zIHByaW1pdGl2ZSB0eXBlcywgdGhlcmUgaXMgbm8gbmVlZCBmb3IgZnVydGhlciBjaGVja2luZy4KLSAgICAJICAgICAgfQotICAgIAkgIH0KLSAgICAJfQotICAgCWlmICh0b0JlVmlzaXRlZChqYXZhQ2xhc3MpKSAgICB7Ci0JCQlEZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbiBiZWFuVmlzaXRvckFjdGlvbiA9IG5ldyBEZXRlY3ROb25KYXZhQ2hhcnNCZWFuVmlzaXRvckFjdGlvbihnZXRNZXNzYWdlcygpLCBnZXRCZWFuc1Zpc2l0ZWQoKSk7Ci0JCQlKYXZhTW9mQmVhblZpc2l0b3IgYmVhblZpc2l0b3IgPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yKCk7Ci0JCQliZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLSAgCSAgCX0KLSAgIAkKLSAgIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0KLSAgcHJpdmF0ZSBib29sZWFuIHRvQmVWaXNpdGVkIChKYXZhQ2xhc3MgamF2YUNsYXNzKQotICB7Ci0JLy9jaGVjayBmb3IgcmVjb2duaXplZCB0eXBlcyAKLQlpZiggamF2YUNsYXNzID09IG51bGwJfHwKLQkgICBqYXZhQ2xhc3MuaXNQcmltaXRpdmUoKSB8fAotCSAgIGphdmFDbGFzcy5nZXRKYXZhTmFtZSgpLnN0YXJ0c1dpdGgoImphdmF4IikgfHwKLSAgICAgICBUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihqYXZhQ2xhc3MuZ2V0SmF2YU5hbWUoKSkpCi0JICAgIAlyZXR1cm4gZmFsc2U7Ci0JZWxzZQotCQkgIAlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTY4MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkF0dHJpYnV0ZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbW9uLlNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQXR0cmlidXRlRWxlbWVudCB1c2luZyB0aGUKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgYSBjb21wbGV4IHR5cGUKLSogKi8KLXB1YmxpYyBjbGFzcyBKYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbiBleHRlbmRzIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbgotewotCQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi0gIC8qCi0gICpDb25zdHJ1Y3RvcgotICAqKi8KLSAgcHVibGljIEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIHByb2plY3QsIEVudmlyb25tZW50IGVudikKLSAgewotICAgIHN1cGVyKHBhcmVudEVsZW1lbnQscHJvamVjdCwgZW52KTsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgfQotCi0gIC8qKgotICAqIENyZWF0ZSBhIHR5cGUgZWxlbWVudCBmcm9tIHRoZSBKYXZhSGVscGVyCi0gICogQHBhcmFtIEphdmFQYXJhbWV0ZXIgdGhlIG1vZiBlbGVtZW50IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUKLSAgKiovCi0KLQotICAvL2JlYW4gaW5mbyBjb2RlCi0KLQotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgcHJvcGVydHlEZWNvcmF0b3IpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCSAgCQotICAgIC8vUHJvcGVydHlEZWNvcmF0b3IgcGQgPSAoUHJvcGVydHlEZWNvcmF0b3IpcHJvcGVydHlEZWNvcmF0b3I7Ci0gICAgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gKFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcilwcm9wZXJ0eURlY29yYXRvcjsgIAotICAgIAotICAgIAotICAgIHRyeXsKLSAgICAgICAvL2lmIHRoZSB0eXBlIG9mIHRoaXMgYXR0cmlidXRlIGlzIHVuc3VwcG9ydGVkIGRvbnQgbWFrZSBhbiBBdHRyaWJ1dGUKLSAgICAgIGlmKCEoZ2V0UmV0dXJuUGFyYW0oKSAmJiBUeXBlRmFjdG9yeS5pc1JlY29nbml6ZWRSZXR1cm5UeXBlKChKYXZhSGVscGVycylwZC5nZXRQcm9wZXJ0eVR5cGUoKSkpIAotICAgICAgCSYmIChUeXBlRmFjdG9yeS5pc1VuU3VwcG9ydGVkVHlwZSgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpKSl7Ci0gICAgICAJICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1RZUEUiKSArICgoSmF2YUhlbHBlcnMpcGQuZ2V0UHJvcGVydHlUeXBlKCkpLmdldEphdmFOYW1lKCksIFN0YXR1cy5XQVJOSU5HICk7Ci0JICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLQkgICAgICAvL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9UWVBFIikgKyAoKEphdmFIZWxwZXJzKXBkLmdldFByb3BlcnR5VHlwZSgpKS5nZXRKYXZhTmFtZSgpLG51bGwpKTsKLQkgICAgICByZXR1cm4gc3RhdHVzOwotCSAgfQkKLQotICAgICAgTWV0aG9kIHNldE1ldGhvZCA9IHBkLmdldFdyaXRlTWV0aG9kKCk7Ci0gICAgICBNZXRob2QgZ2V0TWV0aG9kID0gcGQuZ2V0UmVhZE1ldGhvZCgpOwotICAgICAgaWYoc2V0TWV0aG9kICE9IG51bGwpewotICAgICAgCWlmKHNldE1ldGhvZC5pc1N0YXRpYygpKXsKLSAgICAgICAgICBzZXRNZXRob2Q9bnVsbDsgCi0gICAgICAJfQotICAgICAgfQotICAgICAgaWYoZ2V0TWV0aG9kICE9IG51bGwpewotICAgICAgCWlmKGdldE1ldGhvZC5pc1N0YXRpYygpKXsKLSAgICAgICAgICBnZXRNZXRob2Q9bnVsbDsKLSAgICAgIAl9Ci0gICAgICB9Ci0gICAgICBpZihwZC5pc2ZTdGF0aWMoKSl7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEF0dHJpYnV0ZUVsZW1lbnQgYXR0cmlidXRlRWxlbWVudCA9IChBdHRyaWJ1dGVFbGVtZW50KUJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KHByb3BlcnR5RGVjb3JhdG9yLGZQYXJlbnRFbGVtZW50KTsKLQotICAgICAgaWYoYXR0cmlidXRlRWxlbWVudCAhPSBudWxsKXsKLSAgICAgICAgCi0gICAgICAgIC8vbGV0cyBjaGVjayBhbmQgc2VlIGlmIHRoZSBnZXR0ZXIgdGFrZXMgaW5wdXQgcGFyYW1zCi0gICAgICAgIC8vaWYgc28gdGhyb3cgYW4gZXJyb3IKLSAgICAgICAgLy9ub3cgdGhlIGlucHV0cwotICAgICAgICBpZihnZXRNZXRob2QgIT0gbnVsbCl7Ci0JICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBnZXRNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0JICAgICAgICBpZihqYXZhUGFyYW1ldGVyLmxlbmd0aCA+IDApewotCSAgICAgICAgICBpZihnZXRSZXR1cm5QYXJhbSgpKSByZXR1cm4gc3RhdHVzOwotCSAgICAgICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX0lOREVYRURfUFJPUEVSVElFUyIpICsgZ2V0TWV0aG9kLmdldE5hbWUoKSwgU3RhdHVzLldBUk5JTkcgKTsKLQkgICAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzIChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLQkgICAgICAgICAgLy8JCVdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9JTkRFWEVEX1BST1BFUlRJRVMiICkgKyBnZXRNZXRob2QuZ2V0TmFtZSgpLG51bGwpKTsKLQkgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihzZXRNZXRob2QgIT0gbnVsbCkgYXR0cmlidXRlRWxlbWVudC5zZXRTZXR0ZXJNZXRob2Qoc2V0TWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgICAgIGlmKGdldE1ldGhvZCAhPSBudWxsKSBhdHRyaWJ1dGVFbGVtZW50LnNldEdldHRlck1ldGhvZChnZXRNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQotICAgICAgICBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24gdHlwZVZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uKGF0dHJpYnV0ZUVsZW1lbnQsY2xpZW50UHJvamVjdCwgZW52Xyk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgICAgdHlwZVZpc2l0b3JBY3Rpb24uc2V0QmVhbnNDcmVhdGVkKGdldEJlYW5zQ3JlYXRlZCgpKTsKLSAgICAgICAgdHlwZVZpc2l0b3JBY3Rpb24uc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7IAotICAgICAgICBKYXZhTW9mVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgSmF2YU1vZlR5cGVWaXNpdG9yKGVudl8pOwotICAgICAgICB0eXBlVmlzaXRvci5zZXRDbGllbnRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgICAgIHN0YXR1cyA9IHR5cGVWaXNpdG9yLnJ1bihwZCx0eXBlVmlzaXRvckFjdGlvbik7Ci0gICAgICAgCi0gICAgICB9Ci0gICAgCi0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH1jYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgCWVudl8uZ2V0TG9nKCkubG9nKExvZy5XQVJOSU5HLCA1MDU0LCB0aGlzLCAidmlzaXQiLCBlKTsKLSAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24iLCAvLyROT04tTkxTLTEkCi0gICAgCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfSlNQX0dFTiIpLCBTdGF0dXMuV0FSTklORywgZSk7Ci0gICAgCXRyeSB7Ci0JCQllbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzKTsKLQkJfSBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIGUxKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCJKYXZhTW9mQXR0cmlidXRlVmlzaXRvckFjdGlvbiIsIC8vJE5PTi1OTFMtMSQKLQkgICAgCQkJbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfSlNQX0dFTiIpLCBTdGF0dXMuRVJST1IpOwotCQl9Ci0gICAgCXJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vZW52LkxvZy53cml0ZSh0aGlzLCJ2aXNpdCIsTG9nLk9LLGUpO30KLQotICB9Ci0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyNWE5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1hbmQuTnVsbFN0YXR1c01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1hbmQuU3RhdHVzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mRmllbGRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mTWV0aG9kVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuTW9kZWxFbGVtZW50c0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uLgotKiBUaGlzIFZpc2l0b3JBY3Rpb24gd2lsbCBjcmVhdGUgYSBCZWFuRWxlbWVudCB1c2luZyB0aGUKLSogSmF2YUNsYXNzIGFuZCB0aGUgQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5Ci0qIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IHdhbGsgdGhlIG1ldGhvZHMgaW4gdGhlIEphdmFDbGFzcwotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbiBpbXBsZW1lbnRzIFZpc2l0b3JBY3Rpb24KLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByb3RlY3RlZCBFbnZpcm9ubWVudCBlbnZfOwotIC8vIHByb3RlY3RlZCBCZWFuRWxlbWVudCBmQmVhbkVsZW1lbnQ7Ci0KLSAgcHJvdGVjdGVkIFZpc2l0b3IgZlZpc2l0b3I7Ci0KLSAgLyoKLSAgKiBUaGUgcHJvamVjdCB0aGF0IGRlZmluZXMgdGhlIGNvbnRleHQKLSAgKiovCi0gIHByb3RlY3RlZCBTdHJpbmcgY2xpZW50UHJvamVjdDsKLQotICAvKgotICAqIFRoZSBTdGF0dXMgbW9uaXRvcgotICAqKi8KLSAgcHJvdGVjdGVkIFN0YXR1c01vbml0b3IgbW9uaXRvcl87Ci0KLSAgLyoKLSAgKiBUaGUgbW9kZWwgdGhhdCB3aWxsIGJlIGNyZWF0ZWQKLSAgKiovCi0gIHByb3RlY3RlZCBNb2RlbCBmTW9kZWw7Ci0KLSAgLyoKLSAgKiBUaGlzIGlzIHRoZSBwYXJlbnQgZWxlbWVudCB1c2VkIHdoZW4gY3JlYXRpbmcgYQotICAqIG5ldyBlbGVtZW50Ci0gICovCi0gIHByb3RlY3RlZCBFbGVtZW50IGZQYXJlbnRFbGVtZW50OwotCi0gIC8qCi0gICogTWV0aG9kcyBwcm9jZXNzZWQgZnJvbSBwcm94eQotICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGZCZWFuc0NyZWF0ZWQ7Ci0KLSAgcHJpdmF0ZSBCb29sZWFuU2VsZWN0aW9uW10gZk1ldGhvZHNTZWxlY3RlZDsKLQotICAvKgotICAqIHRoaXMgYm9vbGVhbiB0ZWxscyB3ZXRoZXIgdGhlIGJlYW4gaXMgYSByZXR1cm4gcGFyYW1ldGVyIG9yIGFuIGlucHV0IHBhcmFtZXRlcgotICAqIHVzdWFsbHkgdGhpcyBzaG91bGQgYmUgc2V0IGFyb3VuZCB0aGUgcGFyYW1ldGVydmlzaXRvcmFjdGlvbiwgYW5kIHBhc3NlZCBvbiBmcm9tIHRoZXJlCi0gICovCi0gIHByb3RlY3RlZCBib29sZWFuIGZSZXR1cm5QYXJhbT1mYWxzZTsKLQotICBwdWJsaWMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uKFN0cmluZyBjbGllbnRQcm9qZWN0LEJvb2xlYW5TZWxlY3Rpb25bXSBtZXRob2RzLCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICAgIGZNZXRob2RzU2VsZWN0ZWQgPSBtZXRob2RzOwotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAKLQllbnZfID0gZW52OwotICB9Ci0KLQotCi0gIC8qCi0gICpDb25zdHJ1Y3RvcgotICAqIEBwYXJhbSBNb2RlbCBtb2RlbCBpcyB0aGUgTW9kZWwgdGhhdCB0aGlzIGJlYW4gd2lsbCBiZSBwbGFjZWQgaW4KLSAgKiBAcGFyYW0gSVByb2plY3QgdXNlZCBpbiBuYXR1cmUKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24oTW9kZWwgbW9kZWwsIFN0cmluZyBjbGllbnRQcm9qZWN0LCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICAgIGZNb2RlbCA9IG1vZGVsOwotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCWVudl8gPSBlbnY7Ci0gIH0KLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiBAcGFyYW0gRWxlbWVudCB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdCB0aGlzIGVsZW1lbnQgd2lsbCBiZSBhZGRlZCB0b28KLSAgKiBAcGFyYW0gSVByb2plY3QgdXNlZCBpbiBuYXR1cmUKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24oRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgY2xpZW50UHJvamVjdCwgRW52aXJvbm1lbnQgZW52ICkKLSAgewotICAgIGZQYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCWVudl8gPSBlbnY7Ci0gIH0KLQotICAvKioKLSAgKiBUaGUgdmlzaXQgd2lsbCBjcmVhdGUgdGhlIGJlYW4KLSAgKiBXYWxrIHRoZSBtZXRob2RzCi0gICogQHBhcmFtIEphdmFDbGFzcyB0aGUgY2xhc3MgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGJlYW4gbW9kZWwKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBqYXZhY2xhc3MpCi0gIHsKLSAgCUNob2ljZSBPS0Nob2ljZSA9IG5ldyBDaG9pY2UoJ08nLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfT0siKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkRFU0NSSVBUSU9OX09LIikpOwotICAJQ2hvaWNlIENhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ0MnLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfQ0FOQ0VMIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9DQU5DRUwiKSk7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YWNsYXNzOwotICAgIAotICAgIAotICAgIEJlYW5FbGVtZW50IGJlYW5FbGVtZW50ID0gKEJlYW5FbGVtZW50KUJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KGphdmFDbGFzcyxmUGFyZW50RWxlbWVudCxmTW9kZWwpOwotICAgIGlmKGJlYW5FbGVtZW50LmlzT3duZXJQYXJhbWV0ZXIoKSkgewotICAgICAgICByZXNldEJlYW5zQ3JlYXRlZCgpOwotICAgIH0KLSAgICBmTW9kZWwgPSBiZWFuRWxlbWVudC5nZXRNb2RlbCgpOwotCi0gICAgLy90aGlzIGZvciB0aGUgc3Vic2VxdWVudCBiZWFucyB0aGF0IHJlcHJlc2VudCB0eXBlcwotICAgIC8vZmlyc3QgZG8gdGhlIGF0dHJpYnV0ZXMKLSAgICAvL2lmIHdlIGFyZSBub3Qgb24gdGhlIHJvb3QKLSAgICBpZiAoIShiZWFuRWxlbWVudCA9PSBmTW9kZWwuZ2V0Um9vdEVsZW1lbnQoKSkpewotICAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRCZWFuc0NyZWF0ZWQoKS5lbGVtZW50cygpOwotICAgICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpewotICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgaWYobmFtZS5lcXVhbHMoamF2YUNsYXNzLmdldE5hbWUoKSkpewotICAgICAgICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19DWUNMSUNfQkVBTiIpLCBTdGF0dXMuV0FSTklORyk7Ci0gICAgICAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0gICAgICAgICAgICAJCQkvL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19FUlJPUl9KVFNfQ1lDTElDX0JFQU4iICksbnVsbCkpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIAotICAgICAgIEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yQWN0aW9uIGF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24oYmVhbkVsZW1lbnQsY2xpZW50UHJvamVjdCwgZW52Xyk7Ci0gICAgICAgLy9hdHRyaWJ1dGVWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgICBWZWN0b3IgY2hpbGRWZWN0b3IgPSAoKFZlY3RvcilnZXRCZWFuc0NyZWF0ZWQoKS5jbG9uZSgpKTsKLSAgICAgICBjaGlsZFZlY3Rvci5hZGRFbGVtZW50KGphdmFDbGFzcy5nZXROYW1lKCkpOyAgCi0gICAgICAgYXR0cmlidXRlVmlzaXRvckFjdGlvbi5zZXRCZWFuc0NyZWF0ZWQoY2hpbGRWZWN0b3IpOwotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24uc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7Ci0gICAgICAgSmF2YU1vZkF0dHJpYnV0ZVZpc2l0b3IgYXR0cmlidXRlVmlzaXRvciA9IG5ldyBKYXZhTW9mQXR0cmlidXRlVmlzaXRvcigpOwotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3Iuc2V0UmV0dXJuUGFyYW1ldGVyKGdldFJldHVyblBhcmFtKCkpOwotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3Iuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgIGF0dHJpYnV0ZVZpc2l0b3Iuc2V0RW52aXJvbm1lbnQoZW52Xyk7Ci0gICAgICAgc3RhdHVzID0gYXR0cmlidXRlVmlzaXRvci5ydW4oamF2YUNsYXNzLGF0dHJpYnV0ZVZpc2l0b3JBY3Rpb24pOwotICAgICAgIC8vCi0gICAgICAgaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgIAotICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICAgewotICAgICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudl8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgIHsKLSAgICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgIH0KLSAgICAgICAgIAkKLSAgICAgICB9Ci0gICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICAgIEphdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24gZmllbGRWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24oYmVhbkVsZW1lbnQsY2xpZW50UHJvamVjdCwgZW52Xyk7Ci0gICAgICAgLy9maWVsZFZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgICAgIFZlY3RvciBjaGlsZFZlY3RvcjIgPSAoKFZlY3RvcilnZXRCZWFuc0NyZWF0ZWQoKS5jbG9uZSgpKTsKLSAgICAgICBjaGlsZFZlY3RvcjIuYWRkRWxlbWVudChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsgIAotICAgICAgIGZpZWxkVmlzaXRvckFjdGlvbi5zZXRCZWFuc0NyZWF0ZWQoY2hpbGRWZWN0b3IyKTsKLSAgICAgICBmaWVsZFZpc2l0b3JBY3Rpb24uc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7Ci0gICAgICAgSmF2YU1vZkZpZWxkVmlzaXRvciBmaWVsZFZpc2l0b3IgPSBuZXcgSmF2YU1vZkZpZWxkVmlzaXRvcigpOwotICAgICAgIGZpZWxkVmlzaXRvci5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgICAgc3RhdHVzID0gZmllbGRWaXNpdG9yLnJ1bihqYXZhQ2xhc3MsZmllbGRWaXNpdG9yQWN0aW9uKTsKLSAgICAgICAvLwotICAgICAgIHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgIAotICAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICAgewotICAgICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudl8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMsIG5ldyBDaG9pY2VbXXtPS0Nob2ljZSwgQ2FuY2VsQ2hvaWNlfSk7Ci0gICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgIHsKLSAgICAgICAgIAkgLy9yZXR1cm4gYW4gZXJyb3Igc3RhdHVzIHNpbmNlIHRoZSB1c2VyIGNhbmNlbGVkCi0gICAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgIH0KLSAgICAgICAgIAkKLSAgICAgICB9Ci0gICAgICAgLy8gICAgICAgCi0gICAgICAgCi0gICB9Ci0KLSAgICAvL3RoaXMgaXMgdG8gaW5zdXJlIHdlIGFyZSBvbiB0aGUgcHJveHkKLSAgICAvL25vdyBkbyB0aGUgbWV0aG9kcwotICAgIGlmIChiZWFuRWxlbWVudCA9PSBmTW9kZWwuZ2V0Um9vdEVsZW1lbnQoKSl7Ci0gICAgICAvL2ZpcnN0IGxldHMgbWFrZSBzdXJlIHRoZSBwcm94eSBpcyBpbiBnb29kIGZvcm0KLSAgICAgIC8vLWl0IGhhcyBhIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgIC8vLWl0IGhhcyBhdCBsZWFzdCBvbmUgbWV0aG9kCi0gICAgICAvL290aGVyd2lzZSByZXR1cm4gdGhlIHByb2JsZW0gaW4gdGhlIGZvcm0gb2YgYSBzdGF0dXMKLQotICAgICAgaWYgKCFwcm94eUNoZWNrKGphdmFDbGFzcywgc3RhdHVzKSkgcmV0dXJuIHN0YXR1czsKLSAgICAgIEphdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uIG1ldGhvZFZpc2l0b3JBY3Rpb24gPSBuZXcgSmF2YU1vZk1ldGhvZFZpc2l0b3JBY3Rpb24oYmVhbkVsZW1lbnQsY2xpZW50UHJvamVjdCwgZW52Xyk7Ci0gICAgICAKLSAgICAgIC8vbWV0aG9kVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0gICAgICBKYXZhTW9mTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IEphdmFNb2ZNZXRob2RWaXNpdG9yKCk7Ci0gICAgICBtZXRob2RWaXNpdG9yLnNldE1ldGhvZFNlbGVjdGlvbihmTWV0aG9kc1NlbGVjdGVkKTsKLSAgICAgIHN0YXR1cyA9IG1ldGhvZFZpc2l0b3IucnVuKGphdmFDbGFzcyxtZXRob2RWaXNpdG9yQWN0aW9uKTsKLQotICAgICAgLy8KLSAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLkVSUk9SKQotICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICAgIGlmIChzZXZlcml0eT09U3RhdHVzLldBUk5JTkcpCi0gICAgICB7Ci0gICAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgewotICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgfQotICAgICAgICAJCi0gICAgICB9Ci0gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vVGhpcyBpcyB3aGVyZSB3ZSBjaGVjayBmb3Igc2V2ZXJhbCB0aGluZ3M6Ci0gICAgICAvLy1pZiBubyBtZXRob2RzIHdlcmUgcHJvY2Vzc2VkIGJlY2F1c2Ugb2YgdW5zdXBwb3J0ZWQgdHlwZXMgdGhlbiB3ZSBzZW5kIGJhY2sgdGhhdCByZXN1bHQKLSAgICAgIC8vLWlmIHRoZXJlIHdlcmUgYW55IG1ldGhvZHMgb21pdHRlZCB3ZSBzaG91bGQgd2FybiB0aGVtCi0KLSAgICAgIC8vZmlyc3Qgbm8gbWV0aG9kcwotICAgICAgaWYgKCFtZXRob2RWaXNpdG9yQWN0aW9uLndlcmVNZXRob2RzUHJvY2Vzc2VkKCkpewotICAgICAgICAvL3RoaXMgaGFzIHRvIGJlIGRvbmUgdG8gaW5zdXJlIHRoZSBkaWFsb2cgaXMgYW4gZXJyb3IKLSAgICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX05PX1BST1hZX01FVEhPRFNfUFJPQ0VTU0VEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0gICAgICAgIC8vCQlXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfRVJST1JfSlRTX05PX1BST1hZX01FVEhPRFNfUFJPQ0VTU0VEIiApLG51bGwpKTsKLSAgICAgIH0gICAgICAgIAkKLSAgICAgIC8vbm93IG1ldGhvZHMgb21pdHRlZAotICAgICAgZWxzZSBpZihtZXRob2RWaXNpdG9yQWN0aW9uLndlcmVNZXRob2RzT21pdHRlZCgpKXsKLSAgICAgICAgLy9UaGUgZGlhbG9nIGlzIGFscmVhZHkgYSB3YXJuaW5nIHNvIHdlIGp1c3QgbmVlZCB0byBzZXQgdGhlIG92ZXJhbGwgbWVzc2FnZQotICAgICAgCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19QUk9YWV9NRVRIT0RTX09NSVRURUQiKSwgU3RhdHVzLldBUk5JTkcpOwotICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0gICAgICAgIC8vCQlXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfV0FSTl9KVFNfUFJPWFlfTUVUSE9EU19PTUlUVEVEIiApLG51bGwpKTsKLSAgICAgIH0JCi0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cmluZyByZXNpZGVudCkKLSAgewotICAgIC8vbm90aGluZyB0byBiZSBkb25lIGJ1dCBtdXN0IGJlIGltcGxlbWVudGVkCi0gIH0KLQotCi0gIC8qCi0gICogUmV0dXJuIHRoZSBtb2RlbCB0aGF0IHdhcyBjcmVhdGVkCi0gICogQHJldHVybiBNb2RlbCB0aGUgYmVhbiBtb2RlbCB0aGF0IHdhcyBjcmVhdGVkCi0gICovCi0gIHB1YmxpYyBNb2RlbCBnZXRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gZk1vZGVsOwotICB9Ci0KLSAgLyoKLSAgKiBUaGUgcHJveHkgY2hlY2sgaW5zdXJlcyB0aGVyZSBpcyBhIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kCi0gICogYXQgTGVhc3Qgb25lIG1ldGhvZAotICAqIEBwYXJhbSBKYXZhQ2xhc3MgamF2YUNsYXNzIGlzIHVzZWQgdG8gdHJhdmVyc2UgdGhlIG1ldGhvZHMgb24gdGhlIHByb3h5Ci0gICovCi0gIHB1YmxpYyBib29sZWFuIHByb3h5Q2hlY2soSmF2YUNsYXNzIGphdmFDbGFzcywgU3RhdHVzIHN0YXR1cykKLSAgewotICAgICAvLyBmaXJzdCBjaGVjayBmb3IgYSBtZXRob2QKLSAgICAgSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0gICAgIGlmICghbS5oYXNOZXh0KCkpewotICAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX01FVEhPRFMiKSxTdGF0dXMuRVJST1IpOwotICAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgIC8vCQkJV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX0VSUk9SX0pUU19QUk9YWV9IQVNfTk9fTUVUSE9EUyIgKSxudWxsKSk7Ci0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgICB9CQotICAgICAvL25vdyBjaGVjayBmb3IgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgICBpZiAoamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpewotICAgICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLSAgICAgICAgICBpZiAoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLSAgICAgICAgICAgICAvL3RoZW4gd2UgaGF2ZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgICAgCSBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19QUk9YWV9IQVNfTk9fREVGQVVMVCIpLFN0YXR1cy5FUlJPUik7Ci0gICAgICAgICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0gICAgICAgICAgICAgCQkvL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCAiJU1TR19FUlJPUl9KVFNfUFJPWFlfSEFTX05PX0RFRkFVTFQiICksbnVsbCkpOwotICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLQotICB9Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBzdGF0dXMgbW9uaXRvciB0aGF0IHRoaXMgYWN0aW9uIHdpbGwgdXNlIHRvIHJlcG9ydCBzdGF0dXMgdGhhdCBvY2NyZXMgd2hpbGUgZXhlY3V0aW5nIHRoZSBBY3Rpb24uCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1c01vbml0b3IgKCBTdGF0dXNNb25pdG9yIG1vbml0b3IgKQotICB7Ci0JbW9uaXRvcl8gPSBtb25pdG9yOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc3RhdHVzIG1vbml0b3IgdGhhdCB0aGlzIHRhc2sgaXMgdXNpbmcgdG8gcmVwb3J0IHN0YXR1cy4KLSAgKi8KLSAgcHVibGljIFN0YXR1c01vbml0b3IgZ2V0U3RhdHVzTW9uaXRvciAoKQotICB7Ci0gICAgaWYgKG1vbml0b3JfID09IG51bGwpCi0gICAgewotICAgICAgbW9uaXRvcl8gPSBuZXcgTnVsbFN0YXR1c01vbml0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1vbml0b3JfOwotICB9Ci0KLQotICAgLyoqCi0gICogY2hlY2sgaWYgdGhlIGFjdGlvbiBoYXMgZmluaXNoZWQgc3Vjc2Vzc2Z1bGx5IAotICAqLwotICAvKgotICBwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwgKCkKLSAgewotICAgCXJldHVybiBnZXRTdGF0dXNNb25pdG9yKCkuY2FuQ29udGludWUoKTsKLSAgfQotICAqLyAKLSAgcHVibGljIHZvaWQgcmVzZXRCZWFuc0NyZWF0ZWQoKQotICB7Ci0gICAgZkJlYW5zQ3JlYXRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KEVudmlyb25tZW50IGVudikKLSAgewotICAJZW52XyA9IGVudjsKLSAgfQotICAKLSAgLyoKLSAgKiBUaGUgY29tbWFuZCB0aGF0IGNhbGxlZCB0aGlzIHdpbGwgZ2V0IHRoZSByZXN1bHRzIG9mIHRoZSBvcGVyYXRpb24gaW4gdGhlIGZvcm0KLSAgKiBvZiBhIHN0YXR1cy4KLSAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRCZWFuc0NyZWF0ZWQgKCkKLSAgewotICAgIGlmKGZCZWFuc0NyZWF0ZWQgPT0gbnVsbCkgZkJlYW5zQ3JlYXRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgICByZXR1cm4gZkJlYW5zQ3JlYXRlZDsKLSAgfQotCi0gIC8qCi0gICogVGhlIGNvbW1hbmQgdGhhdCBjYWxsZWQgdGhpcyB3aWxsIGdldCB0aGUgcmVzdWx0cyBvZiB0aGUgb3BlcmF0aW9uIGluIHRoZSBmb3JtCi0gICogb2YgYSBzdGF0dXMuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEJlYW5zQ3JlYXRlZCAoVmVjdG9yIGJlYW5zQ3JlYXRlZCkKLSAgewotICAgIGZCZWFuc0NyZWF0ZWQgPSBiZWFuc0NyZWF0ZWQ7Ci0gIH0KLQotICAgLyoKLSAgKiBUaGlzIGJvb2xlYW4gdGVsbHMgd2V0aGVyIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZXR1cm4gcGFyYW0gCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGdldFJldHVyblBhcmFtICgpCi0gIHsKLSAgICByZXR1cm4gZlJldHVyblBhcmFtOwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIGJvb2xlYW4gdGVsbHMgd2V0aGVyIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZXR1cm4gcGFyYW0gCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFJldHVyblBhcmFtIChib29sZWFuIHJldHVybnBhcmFtKQotICB7Ci0gICAgZlJldHVyblBhcmFtID0gcmV0dXJucGFyYW07Ci0gIH0KLQotICAgLyoKLSAgKiBUaGlzIGJvb2xlYW4gdGVsbHMgd2V0aGVyIHdlIGFyZSBkZWFsaW5nIHdpdGggYSByZXR1cm4gcGFyYW0gCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdCAoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICAvKgotICAqIFRoaXMgYm9vbGVhbiB0ZWxscyB3ZXRoZXIgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHJldHVybiBwYXJhbSAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdCAoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0KLQotICAvKioKLSAgKiBzZXRzIHRoZSB2aXNpdG9yIHRoYXQgY2FsbHMgdGhlIHZpc2l0Ci0gICogQHBhcmFtZXRlciBWaXNpdG9yCi0gICovCi0KLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpCi0gIHsKLSAgICAgIGZWaXNpdG9yID0gdmlzaXRvcjsKLSAgfQotCi0gIC8qCi0gICogU2V0cyB0aGUgcGFyZW50IGVsZW1lbnQgdGhlIGNoaWxkIHRoZW4ga25vd3Mgd2hlcmUgdG8KLSAgKiBhZGQgaXRzZWxmIHRvIHRoZSBtb2RlbAotICAqIEBwYXJhbSBFbGVtZW50IHBhcmVudCBlbGVtZW50Ci0gICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmVudEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgZlBhcmVudEVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZkZpZWxkVmlzaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRiYzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZkZpZWxkVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5GaWVsZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24uCi0qIFRoaXMgVmlzaXRvckFjdGlvbiB3aWxsIGNyZWF0ZSBhIEF0dHJpYnV0ZUVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIGEgY29tcGxleCB0eXBlCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZkZpZWxkVmlzaXRvckFjdGlvbiBleHRlbmRzIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mRmllbGRWaXNpdG9yQWN0aW9uKEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIHByb2plY3QsIEVudmlyb25tZW50IGVudikKLSAgewotICAgIHN1cGVyKHBhcmVudEVsZW1lbnQscHJvamVjdCwgZW52KTsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgfQotCi0gIC8qKgotICAqIENyZWF0ZSBhIHR5cGUgZWxlbWVudCBmcm9tIHRoZSBKYXZhSGVscGVyCi0gICogQHBhcmFtIEphdmFQYXJhbWV0ZXIgdGhlIG1vZiBlbGVtZW50IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUKLSAgKiovCi0KLQotICAvL2JlYW4gaW5mbyBjb2RlCi0KLQotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgZmllbGRfKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgRmllbGQgZmllbGQgPSAoRmllbGQpZmllbGRfOwotICAgICAKLSAgICB0cnl7Ci0gICAgICAgLy9pZiB0aGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyB1bnN1cHBvcnRlZCBkb250IG1ha2UgYW4gQXR0cmlidXRlCi0gICAgICBpZighKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZSgoSmF2YUhlbHBlcnMpZmllbGQuZ2V0SmF2YUNsYXNzKCkpKSAKLSAgICAgIAkmJiAoVHlwZUZhY3RvcnkuaXNVblN1cHBvcnRlZFR5cGUoKEphdmFIZWxwZXJzKWZpZWxkLmdldEphdmFDbGFzcygpKSkpewotICAgICAgCSAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9UWVBFIikgKyAoKEphdmFIZWxwZXJzKWZpZWxkLmdldEphdmFDbGFzcygpKS5nZXRKYXZhTmFtZSgpLCBTdGF0dXMuV0FSTklORyApOwotCSAgICAgIC8vZ2V0U3RhdHVzTW9uaXRvcigpLnJlcG9ydFN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsCi0JICAgICAgLy9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSIpICsgKChKYXZhSGVscGVycylmaWVsZC5nZXRKYXZhQ2xhc3MoKSkuZ2V0SmF2YU5hbWUoKSxudWxsKSk7Ci0JICAgICAgcmV0dXJuIHN0YXR1czsKLQkgIH0JCi0KLQotICAgICAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCA9IChGaWVsZEVsZW1lbnQpQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQoZmllbGQsZlBhcmVudEVsZW1lbnQpOwotCi0gICAgICBpZihmaWVsZEVsZW1lbnQgIT0gbnVsbCl7Ci0gICAgICAgIC8vbGV0cyBjaGVjayBhbmQgc2VlIGlmIHRoZSBnZXR0ZXIgdGFrZXMgaW5wdXQgcGFyYW1zCi0gICAgICAgIC8vaWYgc28gdGhyb3cgYW4gZXJyb3IKLSAgICAgICAgLy9ub3cgdGhlIGlucHV0cwotICAgICAgICAKLSAgICAgICAgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uIHR5cGVWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbihmaWVsZEVsZW1lbnQsY2xpZW50UHJvamVjdCwgZW52Xyk7Ci0gICAgICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldFN0YXR1c01vbml0b3IoZ2V0U3RhdHVzTW9uaXRvcigpKTsKLSAgICAgICAgdHlwZVZpc2l0b3JBY3Rpb24uc2V0QmVhbnNDcmVhdGVkKGdldEJlYW5zQ3JlYXRlZCgpKTsKLSAgICAgICAgdHlwZVZpc2l0b3JBY3Rpb24uc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7IAotICAgICAgICBKYXZhTW9mVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgSmF2YU1vZlR5cGVWaXNpdG9yKGVudl8pOwotICAgICAgICB0eXBlVmlzaXRvci5zZXRDbGllbnRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgICAgIHN0YXR1cyA9IHR5cGVWaXNpdG9yLnJ1bihmaWVsZCx0eXBlVmlzaXRvckFjdGlvbik7Ci0gICAgICAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIAotICAgIH1jYXRjaChFeGNlcHRpb24gZSkKLQl7Ci0gICAgCWVudl8uZ2V0TG9nKCkubG9nKExvZy5XQVJOSU5HLCA1MDU1LCB0aGlzLCAidmlzaXQiLCBlKTsKLSAgICAJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiSmF2YU1vZkZpZWxkVmlzaXRvckFjdGlvbiIsIC8vJE5PTi1OTFMtMSQKLSAgICAJCQltc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0pUU19KU1BfR0VOIiksIFN0YXR1cy5XQVJOSU5HLCBlKTsKLSAgICAJdHJ5IHsKLSAgICAJCWVudl8uZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydChzdGF0dXMpOwotICAgIAl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZTEpIHsKLSAgICAJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIkphdmFNb2ZGaWVsZFZpc2l0b3JBY3Rpb24iLCAvLyROT04tTkxTLTEkCi0gICAgCQkJCW1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSlRTX0pTUF9HRU4iKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAJfQotICAgIAlyZXR1cm4gc3RhdHVzOwotCX0KLQotICB9Ci0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZNZXRob2RWaXNpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmJlNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mTWV0aG9kVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnMuSmF2YU1vZlBhcmFtZXRlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgQmVhbkVsZW1lbnQgdXNpbmcgdGhlIAotKiBKYXZhQ2xhc3MgYW5kIHRoZSBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkKLSogSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgd2FsayB0aGUgbWV0aG9kcyBpbiB0aGUgSmF2YUNsYXNzCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZk1ldGhvZFZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwdWJsaWMgU3RyaW5nIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWU7Ci0KLSAvKgotICAqIE1ldGhvZHMgb21pdHRlZCBmcm9tIHRoZSBwcm94eQotICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGZNZXRob2RzT21pdHRlZDsKLQotICAvKgotICAqIE1ldGhvZHMgcHJvY2Vzc2VkIGZyb20gcHJveHkKLSAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBmTWV0aG9kc1Byb2Nlc3NlZDsKLQotICAgICAKLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZk1ldGhvZFZpc2l0b3JBY3Rpb24oRWxlbWVudCBwYXJlbnRFbGVtZW50LFN0cmluZyBwcm9qZWN0LCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgZk1ldGhvZHNPbWl0dGVkID0gbmV3IFZlY3RvcigpOwotICAgIGZNZXRob2RzUHJvY2Vzc2VkID0gbmV3IFZlY3RvcigpOwotCi0gIH0KLSAgIAotICAvKioKLSAgKiBDcmVhdGUgYSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBtZXRob2QgCi0gICogQHBhcmFtIE1ldGhvZCB0aGUgY2xhc3MgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IGltZXRob2QpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClpbWV0aG9kOwotICAgICAgICAgICAKLSAgICBpZiAobWV0aG9kQ2hlY2sobWV0aG9kKSl7Ci0gICAgICAvL3RoaXMgaXMgdG8gY2hlY2sgaW1tZWRpYXRlIGlucHV0IGFuZCByZXR1cm4gcGFyYW1ldGVycwotICAgICAgLy9pZiB0aGVyZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlIGluIHRoZXNlIHdlIGNhbiByZWFjdCBpbW1lZGlhdGVseQotICAgICAgLy93ZSBhZGQgaXQgdG8gdGhlIG9taXR0ZWQgbWV0aG9kcyBhbiBnbyB0byB0aGUgbmV4dCBvbmUKLSAgICAgIGlmKCFwYXJhbWV0ZXJDaGVjayhtZXRob2QpKXsKLSAgICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfQVJSQVlTIikgKyBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lLCBTdGF0dXMuV0FSTklORyApOwotICAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMgKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgICAvLwkJV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoICIlTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfQVJSQVlTIiApICsgZlVuc3VwcG9ydGVkUGFyYW1ldGVyTmFtZSxudWxsKSk7Ci0gICAgICAgIGZNZXRob2RzT21pdHRlZC5hZGRFbGVtZW50KG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgICAgaWYoIW51bGxDb25zdHJ1Y3RvcihtZXRob2QpKXsKLSAgICAgIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX1dBUk5fSlRTX1VOU1VQUE9SVEVEX1BBUkFNRVRFUlNfSU5QVVRTIikgKyBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lLCBTdGF0dXMuV0FSTklORyApOwotICAgICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMgKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLAotICAgICAgIAkvLwlXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfUEFSQU1FVEVSU19JTlBVVFMiICkgKyBmVW5zdXBwb3J0ZWRQYXJhbWV0ZXJOYW1lLG51bGwpKTsKLSAgICAgICAgZk1ldGhvZHNPbWl0dGVkLmFkZEVsZW1lbnQobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICAgIH0KLQotICAgICAgLy9jYXJyeSBvbiBhbGwgcGFyYW1ldGVycyBzdXBwb3J0ZWQKLSAgICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KUJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KG1ldGhvZCxmUGFyZW50RWxlbWVudCk7Ci0gICAgICBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvckFjdGlvbiBwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKG1ldGhvZEVsZW1lbnQsY2xpZW50UHJvamVjdCxlbnZfKTsKLSAgICAgIHBhcmFtZXRlclZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgICAgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IgcGFyYW1ldGVyVmlzaXRvciA9IG5ldyBKYXZhTW9mUGFyYW1ldGVyVmlzaXRvcihlbnZfKTsKLSAgICAgIHN0YXR1cyA9IHBhcmFtZXRlclZpc2l0b3IucnVuKG1ldGhvZCxwYXJhbWV0ZXJWaXNpdG9yQWN0aW9uKTsgICAKLSAgICAgIC8vc29tZXRoaW5nIG1heSBoYXZlIGdvbmUgd3Jvbmcgd2l0aCBhbiBpbnRlcm5hbCB0eXBlCi0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkhPVN0YXR1cy5PSyl7Ci0gICAgICAgIC8vVGhpcyBtZXRob2QgaGFzIHRvIGJlIG9taXR0ZWQKLSAgICAgICAgZk1ldGhvZHNPbWl0dGVkLmFkZEVsZW1lbnQobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgICAgIG1ldGhvZEVsZW1lbnQuc2V0TWV0aG9kT21taXNzaW9uKHRydWUpOyAgCi0gICAgICB9CQotICAgICAgZWxzZSB7Ci0gICAgICAgIGZNZXRob2RzUHJvY2Vzc2VkLmFkZEVsZW1lbnQobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgICB9CQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gCi0gIC8qCi0gICogVGVsbHMgd2V0aGVyIGFueSBtZXRob2RzIHdlcmUgcHJvY2Vzc2VkIAotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGFueSBtZXRob2RzIHdlcmUgcHJvY2Vzc2VkIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiB3ZXJlTWV0aG9kc1Byb2Nlc3NlZCgpCi0gIHsKLSAgICBpZihmTWV0aG9kc1Byb2Nlc3NlZC5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICogVGVsbHMgd2V0aGVyIHRoZXJlIHdlcmUgbWV0aG9kcyBvbWl0dGVkIGJlY2F1c2Ugb2YgdW5zdXBwb3J0ZWQgdHlwZXMKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBtZXRob2RzIHdlcmUgb21pdHRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiB3ZXJlTWV0aG9kc09taXR0ZWQoKQotICB7Ci0gICAgaWYoZk1ldGhvZHNPbWl0dGVkLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgKiBUaGVyZSBtYXkgYmUgbWV0aG9kcyB0aGF0IHdlIGRvbnQgc3VwcG9ydAotICAqIGFuZCBkb250IHdhbnQgaW4gdGhlIG1vZGVsCi0gICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgZmluZQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gbWV0aG9kQ2hlY2soTWV0aG9kIG1ldGhvZCkKLSAgewotICAgIGJvb2xlYW4gb2sgPSB0cnVlOwotICAgIC8vIGlmIHdlIGhhdmUgYSBjb25zdHJ1Y3RvciB3ZSByZXR1cm4gZmFsc2UKLSAgICBpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgCi0gICAgcmV0dXJuIG9rOwotICB9Ci0KLSAgLyoqCi0gICogVGhlcmUgbWF5IGJlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QgdGhhdCBoYXZlIHR5cGVzCi0gICogbm90IHlldCBzdXBwb3J0ZWQgcmV0dXJuIGZhbHNlIGlmIHdlIGZpbmQgYW55Ci0gICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgZmluZQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gcGFyYW1ldGVyQ2hlY2soTWV0aG9kIG1ldGhvZCkKLSAgewotCi0gICAgYm9vbGVhbiBvayA9IHRydWU7Ci0gICAgCi0gICAgLy9ub3cgdGhlIGlucHV0cwotICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOyAKLSAgICBib29sZWFuIHBhcmFtU3VwcG9ydGVkID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDtpPGphdmFQYXJhbWV0ZXIubGVuZ3RoO2krKykgewotICAgICAgSmF2YVBhcmFtZXRlciBwYXJhbT1qYXZhUGFyYW1ldGVyW2ldOwotICAgICAgSmF2YUhlbHBlcnMgamF2YUhlbHBlcjEgPSBwYXJhbS5nZXRKYXZhVHlwZSgpOwotICAgICAgaWYoVHlwZUZhY3RvcnkuaXNVblN1cHBvcnRlZFR5cGUoamF2YUhlbHBlcjEpKSB7Ci0gICAgICAgIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWUgPSBwYXJhbS5nZXROYW1lKCk7IAotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgcmV0dXJuIG9rOwotICB9Ci0KLSAKLSAgLyoqCi0gICogVGhlcmUgbWF5IGJlIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QgdGhhdCBoYXZlIHR5cGVzCi0gICogbm90IHlldCBzdXBwb3J0ZWQgcmV0dXJuIGZhbHNlIGlmIHdlIGZpbmQgYW55Ci0gICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiBhbGwgcGFyYW1ldGVycyBhcmUgZmluZQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gbnVsbENvbnN0cnVjdG9yKE1ldGhvZCBtZXRob2QpCi0gIHsKLSAgICAKLSAgICBib29sZWFuIG9rID0gdHJ1ZTsKLSAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7IAotICAgIGJvb2xlYW4gcGFyYW1TdXBwb3J0ZWQgPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwO2k8amF2YVBhcmFtZXRlci5sZW5ndGg7aSsrKSB7Ci0gICAgICBKYXZhUGFyYW1ldGVyIHBhcmFtPWphdmFQYXJhbWV0ZXJbaV07Ci0gICAgICBKYXZhSGVscGVycyBqYXZhSGVscGVyMSA9IHBhcmFtLmdldEphdmFUeXBlKCk7Ci0gICAgICBpZihqYXZhSGVscGVyMSBpbnN0YW5jZW9mIEphdmFDbGFzcyl7Ci0gICAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFIZWxwZXIxOwotICAgICAgICBpZihUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihqYXZhQ2xhc3MuZ2V0SmF2YU5hbWUoKSkpcmV0dXJuIHRydWU7Ci0gICAgICAgICAgSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKG0uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kMj0oTWV0aG9kKW0ubmV4dCgpOwotICAgICAgICAgICAgaWYgKGphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZDIuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1bXSA9IG1ldGhvZDIubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7Ci0gICAgICAgICAgICAgIGlmIChqYXZhUGFyYW0ubGVuZ3RoID4gMCl7Ci0gICAgICAgICAgICAgICAgLy90aGVuIHdlIGhhdmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAgICAgICAgIGZVbnN1cHBvcnRlZFBhcmFtZXRlck5hbWUgPSBwYXJhbS5nZXROYW1lKCk7IAotICAgIAkgICAgICAgIG9rID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0gICAgCi0gICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gb2s7Ci0gIH0KLQotIAotCi0KLQotCi0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5MjZmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZUeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuTW9kZWxFbGVtZW50c0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuUGFyYW1ldGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgcGFyYW1ldGVyRWxlbWVudCB1c2luZyB0aGUgCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIHRvIGl0cyB0eXBlCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24gZXh0ZW5kcyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24gCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgICAKLSAgLyoKLSAgKkNvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3JBY3Rpb24oRWxlbWVudCBwYXJlbnRFbGVtZW50LFN0cmluZyBwcm9qZWN0LCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7ICAgIAotICB9Ci0gICAKLSAgLyoqCi0gICogQ3JlYXRlIGEgcGFyYW1ldGVyIGVsZW1lbnQgZnJvbSB0aGUgbWV0aG9kIAotICAqIEBwYXJhbSBKYXZhUGFyYW1ldGVyIHRoZSBtb2YgZWxlbWVudCB0byBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgUGFyYW1ldGVyCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3QgaWphdmFQYXJhbWV0ZXIpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCUNob2ljZSBPS0Nob2ljZSA9IG5ldyBDaG9pY2UoJ08nLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfT0siKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkRFU0NSSVBUSU9OX09LIikpOwotICAJQ2hvaWNlIENhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ0MnLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfQ0FOQ0VMIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9DQU5DRUwiKSk7Ci0gIAkKLSAgICBQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQgPSAoUGFyYW1ldGVyRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudChpamF2YVBhcmFtZXRlcixmUGFyZW50RWxlbWVudCk7Ci0gICAgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uIHR5cGVWaXNpdG9yQWN0aW9uID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvckFjdGlvbihwYXJhbWV0ZXJFbGVtZW50LGNsaWVudFByb2plY3QsIGVudl8pOwotICAgIC8vdHlwZVZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgIHR5cGVWaXNpdG9yQWN0aW9uLnNldFJldHVyblBhcmFtKHBhcmFtZXRlckVsZW1lbnQuaXNSZXR1cm4oKSk7Ci0gICAgSmF2YU1vZlR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IEphdmFNb2ZUeXBlVmlzaXRvcihlbnZfKTsKLSAgICB0eXBlVmlzaXRvci5zZXRDbGllbnRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgc3RhdHVzID0gdHlwZVZpc2l0b3IucnVuKGlqYXZhUGFyYW1ldGVyLHR5cGVWaXNpdG9yQWN0aW9uKTsKLSAgICAvLwotICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgIHsKLSAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICB7Ci0gICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICB9Ci0gICAgICAJCi0gICAgfQotICAgIC8vICAgICAgICAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZUeXBlVmlzaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9yYWN0aW9ucy9KYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlNzdhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL0phdmFNb2ZUeXBlVmlzaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzLkphdmFNb2ZCZWFuVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuTW9kZWxFbGVtZW50c0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbi4KLSogVGhpcyBWaXNpdG9yQWN0aW9uIHdpbGwgY3JlYXRlIGEgVHlwZUVsZW1lbnQgdXNpbmcgdGhlCi0qIEphdmFDbGFzcyBhbmQgdGhlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeQotKiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSB3YWxrIGEgY29tcGxleCB0eXBlCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZlR5cGVWaXNpdG9yQWN0aW9uIGV4dGVuZHMgSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mVHlwZVZpc2l0b3JBY3Rpb24oRWxlbWVudCBwYXJlbnRFbGVtZW50LFN0cmluZyBwcm9qZWN0LCBFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRFbGVtZW50LHByb2plY3QsIGVudik7Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7ICAgIAotICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlIGEgdHlwZSBlbGVtZW50IGZyb20gdGhlIEphdmFIZWxwZXIKLSAgKiBAcGFyYW0gSmF2YUhlbHBlciB0aGUgbW9mIGVsZW1lbnQgdG8gYmUgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGUKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCB0eXBlTmF2aWdhdG9yKQotICB7Ci0gIAkgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgCSBDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkxBQkVMX09LIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9PSyIpKTsKLSAgCSBDaG9pY2UgQ2FuY2VsQ2hvaWNlID0gbmV3IENob2ljZSgnQycsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9DQU5DRUwiKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkRFU0NSSVBUSU9OX0NBTkNFTCIpKTsgIAkgCi0KLSAgICAgLy9pZiBiZWFuCi0JIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBudWxsOwotCSBpZih0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgSmF2YUNsYXNzKXsKLQkgICAgamF2YUNsYXNzID0gKEphdmFDbGFzcyl0eXBlTmF2aWdhdG9yOwotCSB9Ci0KLQotICAgICAvKiBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcmV0dXJuIHBhcmFtZXRlciB0aGVuIHdlIG5lZWQgdG8gdHJlYXQgdGhpcyBkaWZmZXJlbnRseSB0aGVuIGlmIGl0IGlzIGFuIGlucHV0IAotICAgICAqICBwYXJhbWV0ZXIuCi0gICAgICogIFdlIG5lZWQgdG8gZmlyc3Qgc2VlIGlmIGl0IGlzIGEgc3BlY2lhbCBjYXNlIGZvciByZXR1cm4gdHlwZXMgaWYgbm90IHdlIHRyZWF0IGl0IHRoZSBzYW1lIGFzIGV2ZXJ5dGhpbmcKLSAgICAgKiAgZWxzZS4KLSAgICAgKi8KLSAgICAgaWYoZ2V0UmV0dXJuUGFyYW0oKSAmJiBUeXBlRmFjdG9yeS5pc1JlY29nbml6ZWRSZXR1cm5UeXBlKChKYXZhSGVscGVycyl0eXBlTmF2aWdhdG9yKSl7Ci0gICAgICAgVHlwZUVsZW1lbnQgdHlwZUVsZW1lbnQgPSAoVHlwZUVsZW1lbnQpQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQodHlwZU5hdmlnYXRvcixmUGFyZW50RWxlbWVudCk7Ci0gICAgIH0JCi0gICAgIGVsc2V7Ci0JICAgIGlmKFR5cGVGYWN0b3J5LmlzVW5TdXBwb3J0ZWRUeXBlKChKYXZhSGVscGVycyl0eXBlTmF2aWdhdG9yKSl7Ci0JICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19XQVJOX0pUU19VTlNVUFBPUlRFRF9UWVBFIikgKyAoKEphdmFIZWxwZXJzKXR5cGVOYXZpZ2F0b3IpLmdldEphdmFOYW1lKCksIFN0YXR1cy5XQVJOSU5HICk7CSAgICAJCi0JICAgICAgLy9nZXRTdGF0dXNNb25pdG9yKCkucmVwb3J0U3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwKLSAgICAgICAgICAgICAgLy9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSggIiVNU0dfV0FSTl9KVFNfVU5TVVBQT1JURURfVFlQRSIgKSArICgoSmF2YUhlbHBlcnMpdHlwZU5hdmlnYXRvcikuZ2V0SmF2YU5hbWUoKSxudWxsKSk7Ci0JICAgICAgcmV0dXJuIHN0YXR1czsKLQkgICAgfQkKLQkgICAgCi0JICAgIC8vaWYgamF2YWNsYXNzIGlzIG51bGwgdGhlbiB3ZSBoYXZlIGEgc2ltcGxlIHR5cGUgCi0JICAgIGlmKChqYXZhQ2xhc3MgPT0gbnVsbCkgfHwgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oamF2YUNsYXNzLmdldEphdmFOYW1lKCkpKXsKLQkgICAgICBUeXBlRWxlbWVudCB0eXBlRWxlbWVudCA9IChUeXBlRWxlbWVudClCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuZ2V0QmVhbk1vZGVsRWxlbWVudCh0eXBlTmF2aWdhdG9yLGZQYXJlbnRFbGVtZW50KTsKLQkgICAgfQotCSAgICBlbHNlewotCSAgICAgIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbiBiZWFuVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24oZlBhcmVudEVsZW1lbnQsY2xpZW50UHJvamVjdCwgZW52Xyk7Ci0JICAgICAgYmVhblZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotCSAgICAgIGJlYW5WaXNpdG9yQWN0aW9uLnNldEJlYW5zQ3JlYXRlZChnZXRCZWFuc0NyZWF0ZWQoKSk7Ci0gICAgICAgICAgYmVhblZpc2l0b3JBY3Rpb24uc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7Ci0JCSAgSmF2YU1vZkJlYW5WaXNpdG9yIGJlYW5WaXNpdG9yID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvcigpOwotCSAgICAgIHN0YXR1cyA9IGJlYW5WaXNpdG9yLnJ1bihqYXZhQ2xhc3MsYmVhblZpc2l0b3JBY3Rpb24pOwotCSAgICB9Ci0gICAgIH0KLSAgICAgCi0gICAgIC8vCi0gICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAKLSAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICAgewotICAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgIGlmIChyZXN1bHQuZ2V0TGFiZWwoKS5lcXVhbHMoQ2FuY2VsQ2hvaWNlLmdldExhYmVsKCkpKQotICAgICAgIHsKLSAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgIAkgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgIH0KLSAgICAgICAJCi0gICAgIH0KLSAgICAgLy8KLSAgICAgcmV0dXJuIHN0YXR1czsKLSAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvVmlzaXRvckFjdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcmFjdGlvbnMvVmlzaXRvckFjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlMDBkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JhY3Rpb25zL1Zpc2l0b3JBY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JhY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLQotCi0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFZpc2l0b3JBY3Rpb24uCi0qIEl0IHdpbGwgYXV0b21hdGljYWxseSB3YWxrIHRoZSBtZXRob2RzIGluIHRoZSBKYXZhQ2xhc3MKLSogKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWaXNpdG9yQWN0aW9uSW1wbCBpbXBsZW1lbnRzIFZpc2l0b3JBY3Rpb24gCi17Ci0KLSAgcHJpdmF0ZSBWaXNpdG9yIGZWaXNpdG9yID0gbnVsbDsKLSAgcHJpdmF0ZSBWZWN0b3IgYmVhbnNWaXNpdGVkID0gbnVsbDsKLSAgcHJpdmF0ZSBWZWN0b3IgbWVzc2FnZXMgPSBudWxsOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgcHVibGljIFZpc2l0b3JBY3Rpb25JbXBsKCBWZWN0b3IgbWVzc2FnZXMsIFZlY3RvciBiZWFuc1Zpc2l0ZWQpCi0gIAl7Ci0gIAkgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzOwotICAJIHRoaXMuYmVhbnNWaXNpdGVkID0gYmVhbnNWaXNpdGVkOwotICAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnBsdWdpbiIsIHRoaXMgKTsKLSAgCX0KLSAgCi0gIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIHJlc2lkZW50KQotICB7Ci0gICAgLy9ub3RoaW5nIHRvIGJlIGRvbmUgYnV0IG11c3QgYmUgaW1wbGVtZW50ZWQKLSAgfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgdmVjdG9yIG9mIGFsbCBtZXNzYWdlcyBmb3VuZAotICAqLwotICBwdWJsaWMgVmVjdG9yIGdldE1lc3NhZ2VzICgpCi0gIHsKLSAgCWlmIChtZXNzYWdlcyA9PSBudWxsKSAKLSAgCQltZXNzYWdlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICByZXR1cm4gbWVzc2FnZXM7Ci0gIH0KLQotICBwdWJsaWMgVmVjdG9yIGdldEJlYW5zVmlzaXRlZCgpCi0gIAl7Ci0JCWlmICggYmVhbnNWaXNpdGVkID09IG51bGwpCi0gIAkJCWJlYW5zVmlzaXRlZCA9IG5ldyBWZWN0b3IoKTsgCi0gICAgICAgIHJldHVybiBiZWFuc1Zpc2l0ZWQ7Ci0gICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkVmlzaXRlZEJlYW4oIEphdmFDbGFzcyBiZWFuKQotICAJewotICAJCWlmICggYmVhbnNWaXNpdGVkID09IG51bGwpCi0gIAkJCWJlYW5zVmlzaXRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgCQliZWFuc1Zpc2l0ZWQuYWRkKGJlYW4pOwotICAJfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQmVhblZpc2l0ZWQgKEphdmFDbGFzcyBiZWFuKQotICAJewotICAJCXJldHVybiAoYmVhbnNWaXNpdGVkICE9IG51bGwgJiYgYmVhbnNWaXNpdGVkLmNvbnRhaW5zKGJlYW4pKTsKLSAgCX0KLQotICAvKioKLSAgKiBzZXRzIHRoZSB2aXNpdG9yIHRoYXQgY2FsbHMgdGhlIHZpc2l0Ci0gICogQHBhcmFtZXRlciBWaXNpdG9yCi0gICovCi0KLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpCi0gIHsKLSAgICAgIGZWaXNpdG9yID0gdmlzaXRvcjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIGdldE1lc3NhZ2VzKCkuYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKGtleSkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgZ2V0TWVzc2FnZXMoKS5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2Uoa2V5LGFyZ3MpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMGNhNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQXR0cmlidXRlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5GaWVsZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tb24uU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZBdHRyaWJ1dGVWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgYm9vbGVhbiByZXR1cm5QYXJhbWV0ZXI7Ci0gIHByaXZhdGUgRW52aXJvbm1lbnQgZW52OwotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KEVudmlyb25tZW50IGVudikKLSAgewotICAJdGhpcy5lbnYgPSBlbnY7Ci0gIH0KLSAgCi0gIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICAgLyoKLSAgKiBVc2UgdGhpcyB0byByZWZsZWN0IAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXR1cm5QYXJhbWV0ZXIoYm9vbGVhbiByZXR1cm5QYXJhbWV0ZXIpCi0gIHsKLSAgICB0aGlzLnJldHVyblBhcmFtZXRlciA9IHJldHVyblBhcmFtZXRlcjsKLSAgfQotIAotICAKLSAgLyoKLSAgKiBHZXQgdGhlIGF0dHJpYnV0ZSBiZWxvbmdpbmcgdG8gdGhpcyBjb21wbGV4IHR5cGUgCi0gICogQHBhcmFtIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciB0aGF0IG93bnMgdGhlIHR5cGUKLSAgKiBAcGFyYW0gVmlzaXRvckFjdGlvbiBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGVhY2ggbWV0aG9kCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHJ1biAoIE9iamVjdCBqYXZhY2xhc3MsIFZpc2l0b3JBY3Rpb24gdkFjdGlvbikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKWphdmFjbGFzczsgICAgIAotCi0gICAgSGFzaHRhYmxlIHNwZE1hcCA9IG5ldyBIYXNodGFibGUoKTsgIAotICAgIGZvciAoSXRlcmF0b3IgbT1qYXZhQ2xhc3MuZ2V0UHVibGljTWV0aG9kcygpLml0ZXJhdG9yKCk7IG0uaGFzTmV4dCgpOyApIHsKLSAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgIGlmICgoKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgiZ2V0IikgCi0gICAgICAJfHwgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJpcyIpKSAKLSAgICAgICAgJiYgbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpLmxlbmd0aCA9PSAwICkKLSAgICAgICAgfHwgKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgic2V0IikgCi0gICAgICAgICYmIG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggPiAwKSkgewotICAgICAgICBpbnQgc3ViID0gMzsKLSAgICAgICAgaWYobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJpcyIpKQotICAgICAgICAgIHN1YiA9IDI7CQotICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdWJzdHJpbmcoc3ViKTsgICAgCi0gICAgICAgIFN0cmluZyBsb3dlciA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwxKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICBTdHJpbmcgcmVtYWluZGVyID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsgCi0gICAgICAgIHByb3BlcnR5TmFtZSA9IGxvd2VyICsgcmVtYWluZGVyOwotICAgICAgICBpbnQgaW5kZXggPSBwcm9wZXJ0eU5hbWUubGFzdEluZGV4T2YoIigiKTsKLSAgICAgICAgU3RyaW5nIHRlbXAgPSBwcm9wZXJ0eU5hbWU7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9IHRlbXAuc3Vic3RyaW5nKDAsaW5kZXgpOyAKLSAgICAgICAgCi0gICAgICAgIC8vZmluZCB0aGUgcHJvcGVydHlkZXNjcmlwdG9yCi0gICAgICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBzcGQgPSAoU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXNwZE1hcC5nZXQocHJvcGVydHlOYW1lKTsgCi0gICAgICAgIGlmKHNwZCA9PSBudWxsKXsKLSAgICAgICAgICBzcGQgPSBuZXcgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgc3BkTWFwLnB1dChwcm9wZXJ0eU5hbWUsc3BkKTsgCi0gICAgICAgIH0KLSAgICAgICAgaWYobWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKS5zdGFydHNXaXRoKCJzZXQiKSkKLSAgICAgICAgICBzcGQuc2V0V3JpdGVNZXRob2QobWV0aG9kKTsKLSAgICAgICAgZWxzZSAKLSAgICAgICAgICBzcGQuc2V0UmVhZE1ldGhvZChtZXRob2QpOwotCi0gICAgICAgIEZpZWxkSW1wbCBmaWVsZCA9IChGaWVsZEltcGwpamF2YUNsYXNzLmdldEZpZWxkTmFtZWQocHJvcGVydHlOYW1lKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgcHJvcGVydHlUeXBlID0gbnVsbDsgCi0gICAgICAgIGlmKGZpZWxkICE9IG51bGwpewotICAgICAgICAgIHByb3BlcnR5VHlwZSA9IGZpZWxkLmdldEphdmFUeXBlKCk7Ci0gICAgICAgICAgc3BkLnNldGZTdGF0aWMoZmllbGQuaXNTdGF0aWMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICBpZihtZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLnN0YXJ0c1dpdGgoImdldCIpIHx8IG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkuc3RhcnRzV2l0aCgiaXMiKSkKLSAgICAgICAgICAJcHJvcGVydHlUeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICBlbHNlewotICAgICAgICAgICAgIEphdmFQYXJhbWV0ZXIgcGFyYW1zW10gPSBtZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCk7IAotICAgICAgICAgICAgIHByb3BlcnR5VHlwZSA9IHBhcmFtc1swXS5nZXRKYXZhVHlwZSgpOwotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgICAgCQotICAgICAgICBzcGQuc2V0UHJvcGVydHlUeXBlKHByb3BlcnR5VHlwZSk7IAotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgRW51bWVyYXRpb24gc3BkRW51bSA9IHNwZE1hcC5lbGVtZW50cygpOwotICAgIHdoaWxlKHNwZEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpewotICAgICAgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHNwZCA9IChTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3Ipc3BkRW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYoc3BkQ2hlY2soc3BkKSkKLSAgICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChzcGQpOyAgIAotICAgIH0gCi0gICAKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBzcGRDaGVjayhTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3Igc3BkKQotICB7ICAKLSAgICAvL2NoZWNrIGZvciBpbmRleGVkIHByb3BlcnRpZXMKLSAgCU1ldGhvZCB3cml0ZU1ldGhvZCA9IHNwZC5nZXRXcml0ZU1ldGhvZCgpOwotICAJaWYod3JpdGVNZXRob2QgIT0gbnVsbCkKLSAgCSAgaWYod3JpdGVNZXRob2QubGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlOwotICAJCi0gIAlpZihzcGQuZ2V0UHJvcGVydHlUeXBlKCkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIGlmKHNwZC5nZXRQcm9wZXJ0eVR5cGUoKS5pc1ByaW1pdGl2ZSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZihyZXR1cm5QYXJhbWV0ZXIgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZShzcGQuZ2V0UHJvcGVydHlUeXBlKCkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZighcmV0dXJuUGFyYW1ldGVyICYmIFR5cGVGYWN0b3J5LmlzVW5TdXBwb3J0ZWRUeXBlKHNwZC5nZXRQcm9wZXJ0eVR5cGUoKSkpIHJldHVybiB0cnVlOwotICAgIGlmKCFjaGVja1BvbGFyaXR5KHNwZCkpIHJldHVybiBmYWxzZTsgICAKLSAgICAgICAKLSAgICAvLyBzbyBpdHMgYSBiZWFuIG1ha2Ugc3VyZSBpdCBoYXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yICAgICAgIAotICAgIEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCBqYXZhTW9mUmVmID0gbmV3IEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCgpOwotICAgIGphdmFNb2ZSZWYuc2V0Q2xpZW50UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgIGphdmFNb2ZSZWYuc2V0UHJveHlCZWFuKCgoSmF2YUhlbHBlcnMpc3BkLmdldFByb3BlcnR5VHlwZSgpKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgIGphdmFNb2ZSZWYuZXhlY3V0ZShlbnYpOwotICAgIGlmKGphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpewotICAgICAgIGlmKFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKSkpIHJldHVybiB0cnVlOwotICAgICAgIHJldHVybiBkZWZhdWx0Q2hlY2soKEphdmFDbGFzcylqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpKTsKLSAgICAgICAgICAgICAgIAotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBjaGVja1BvbGFyaXR5KFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBzcGQpewotICAgIAotICAJTWV0aG9kIHJlYWRNZXRob2QgPSBzcGQuZ2V0UmVhZE1ldGhvZCgpOwotICAJTWV0aG9kIHdyaXRlTWV0aG9kID0gc3BkLmdldFdyaXRlTWV0aG9kKCk7Ci0gIAlpZigocmVhZE1ldGhvZCA9PSBudWxsICYmIHdyaXRlTWV0aG9kICE9IG51bGwpIHx8IChyZWFkTWV0aG9kICE9IG51bGwgJiYgd3JpdGVNZXRob2QgPT0gbnVsbCkpCi0gIAkgIHJldHVybiB0cnVlOwkKLSAgCWlmKHJlYWRNZXRob2QgPT0gbnVsbCAmJiB3cml0ZU1ldGhvZCA9PSBudWxsKQotICAJICByZXR1cm4gZmFsc2U7CQotICAJICAJCi0gIAlKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IHdyaXRlTWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotICAgIGZvcihpbnQgaSA9IDA7aTwgamF2YVBhcmFtZXRlci5sZW5ndGg7aSsrKXsKLSAgICAgIEphdmFQYXJhbWV0ZXIganAgPSBqYXZhUGFyYW1ldGVyW2ldOyAJCi0gICAgICBTdHJpbmcgbmFtZTEgPSBqcC5nZXRKYXZhVHlwZSgpLmdldEphdmFOYW1lKCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IHJlYWRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCk7Ci0gICAgICBpZihqcC5nZXRKYXZhVHlwZSgpLmdldEphdmFOYW1lKCkuZXF1YWxzKHJlYWRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEphdmFOYW1lKCkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsgCi0gICAgfQotICAJcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdENoZWNrKEphdmFDbGFzcyBqYXZhQ2xhc3MpewotICAgIAotICAgICAgIEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpOwotICAgICAgICAvL25vdyBjaGVjayBmb3IgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgIGJvb2xlYW4gZGVmYXVsdENvbnN0ID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKG0uaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgTWV0aG9kIG1ldGhvZD0oTWV0aG9kKW0ubmV4dCgpOwotICAgICAgICAgIGlmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSl7Ci0gICAgICAgICAgICAgICAgLy9ub3cgdGhlIGlucHV0cwotICAgICAgICAgICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcltdID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotICAgICAgICAgICAgICAgIGlmIChqYXZhUGFyYW1ldGVyLmxlbmd0aCA+IDApewotICAgICAgICAgICAgICAgICAgICAgIC8vdGhlbiB3ZSBoYXZlIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29uc3QgPSBmYWxzZTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoamF2YVBhcmFtZXRlci5sZW5ndGggPT0gMCl7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAKLSAgICAgICByZXR1cm4gZGVmYXVsdENvbnN0OwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gcG9sYXJpdHlDaGVjayhKYXZhQ2xhc3MgamF2YUNsYXNzKXsKLSAgICAKLSAgICAgICBJdGVyYXRvciBtPWphdmFDbGFzcy5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgLy9ub3cgY2hlY2sgZm9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICBib29sZWFuIGRlZmF1bHRDb25zdCA9IHRydWU7Ci0gICAgICAgIHdoaWxlIChtLmhhc05leHQoKSkgewotICAgICAgICAgIE1ldGhvZCBtZXRob2Q9KE1ldGhvZCltLm5leHQoKTsKLSAgICAgICAgICBpZiAoamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpewotICAgICAgICAgICAgICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICAgICAgICAgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVBhcmFtZXRlci5sZW5ndGggPiAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAvL3RoZW4gd2UgaGF2ZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0ID0gZmFsc2U7IAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKGphdmFQYXJhbWV0ZXIubGVuZ3RoID09IDApewotICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRKYXZhVmlzaWJpbGl0eSgpLmdldFZhbHVlKCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgCi0gICAgICAgcmV0dXJuIGRlZmF1bHRDb25zdDsKLSAgfQotICAgICAgICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZCZWFuVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mQmVhblZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1OTYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZCZWFuVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZCZWFuVmlzaXRvciBpbXBsZW1lbnRzIFZpc2l0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICAvKgotICAqQ29uc3RydWN0b3IKLSAgKiovCi0gIHB1YmxpYyBKYXZhTW9mQmVhblZpc2l0b3IoKQotICB7Ci0gIH0KLSAKLSAgcHVibGljIFN0YXR1cyBydW4gKCBPYmplY3QgamF2YUNsYXNzLCBWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgICByZXR1cm4gdkFjdGlvbi52aXNpdCgoSmF2YUNsYXNzKWphdmFDbGFzcyk7ICAgCi0gIH0KLSAgICAgICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mRmllbGRWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZGaWVsZFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzNTFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZGaWVsZFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uamF2YW1vZnZpc2l0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkZpZWxkSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZGaWVsZFZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLQotICAvKgotICAqIENvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZkZpZWxkVmlzaXRvcigpCi0gIHsKLSAgfQotCi0gIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCkKLSAgewotICAgIHRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICAgLyoKLSAgKiBVc2UgdGhpcyB0byByZWZsZWN0IAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFByb2plY3Q7Ci0gIH0KLQotICAvKgotICAqIEdldCB0aGUgYXR0cmlidXRlIGJlbG9uZ2luZyB0byB0aGlzIGNvbXBsZXggdHlwZSAKLSAgKiBAcGFyYW0gSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyIHRoYXQgb3ducyB0aGUgdHlwZQotICAqIEBwYXJhbSBWaXNpdG9yQWN0aW9uIEFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZWFjaCBtZXRob2QKLSAgKiovCi0gIHB1YmxpYyBTdGF0dXMgcnVuICggT2JqZWN0IGphdmFjbGFzcywgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IChKYXZhQ2xhc3MpamF2YWNsYXNzOyAgICAgCi0KLSAgICBib29sZWFuIGhvbGRlckNsYXNzID0gZmFsc2U7Ci0gICAgRUxpc3QgaW1wbGVtZW50ZWQgPSBqYXZhQ2xhc3MuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGltcGxlbWVudGVkLnNpemUoKTsgaSsrKSB7Ci0JICBKYXZhQ2xhc3MgYW5JbnRlcmZhY2UgPSAoSmF2YUNsYXNzKSBpbXBsZW1lbnRlZC5nZXQoaSk7Ci0JICBpZiAoYW5JbnRlcmZhY2UuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygiamF2YXgueG1sLnJwYy5ob2xkZXJzLkhvbGRlciIpKQotCSAgICBob2xkZXJDbGFzcyA9IHRydWU7Ci0JfSAgICAgIAotCi0gICAgIC8vYmVhbmluZm8gY29kZQotICAgIGlmKGhvbGRlckNsYXNzKXsgICAgIAotICAgICAgRUxpc3QgZSAgPSBqYXZhQ2xhc3MuZ2V0RmllbGRzKCk7Ci0gICAgICBMaXN0SXRlcmF0b3IgbGlzdCA9IGUubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShsaXN0Lmhhc05leHQoKSl7Ci0gICAgICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKWxpc3QubmV4dCgpOyAgICAgCi0gICAgICAgIGlmKGZpZWxkLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDICYmICFmaWVsZC5pc0ZpbmFsKCkgJiYgIWZpZWxkLmlzU3RhdGljKCkpewotICAgICAgICAgIGlmKGZpZWxkQ2hlY2soKEZpZWxkSW1wbClmaWVsZCkpCi0gICAgICAgICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KGZpZWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9ICAgICAgIAotICBwcml2YXRlIGJvb2xlYW4gZmllbGRDaGVjayhGaWVsZEltcGwgZmllbGQpCi0gIHsKLSAgICAvLyBzbyBpdHMgYSBiZWFuIG1ha2Ugc3VyZSBpdCBoYXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIAotICAgIEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCBqYXZhTW9mUmVmID0gbmV3IEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCgpOwotICAgIGphdmFNb2ZSZWYuc2V0UHJveHlCZWFuKGZpZWxkLmdldEphdmFUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICBqYXZhTW9mUmVmLnNldENsaWVudFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICBqYXZhTW9mUmVmLmV4ZWN1dGUobnVsbCk7Ci0gICAgaWYoamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSBpbnN0YW5jZW9mIEphdmFDbGFzcyl7Ci0gICAgICBpZihUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpLmdldEphdmFOYW1lKCkpKSByZXR1cm4gdHJ1ZTsKLSAgICAgIHJldHVybiBkZWZhdWx0Q2hlY2soKEphdmFDbGFzcylqYXZhTW9mUmVmLmdldEphdmFDbGFzcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgICAgICAgCi0gcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRDaGVjayhKYXZhQ2xhc3MgamF2YUNsYXNzKXsKLSAgICAKLSAgIEl0ZXJhdG9yIG09amF2YUNsYXNzLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpOwotICAgLy9ub3cgY2hlY2sgZm9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgYm9vbGVhbiBkZWZhdWx0Q29uc3QgPSB0cnVlOwotICAgd2hpbGUgKG0uaGFzTmV4dCgpKSB7Ci0gICAgTWV0aG9kIG1ldGhvZD0oTWV0aG9kKW0ubmV4dCgpOwotICAgIGlmIChqYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKSl7Ci0gICAgICAvL25vdyB0aGUgaW5wdXRzCi0gICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXJbXSA9IG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLSAgICAgIGlmIChqYXZhUGFyYW1ldGVyLmxlbmd0aCA+IDApewotICAgICAgICAvL3RoZW4gd2UgaGF2ZSBubyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICAgIGRlZmF1bHRDb25zdCA9IGZhbHNlOyAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoamF2YVBhcmFtZXRlci5sZW5ndGggPT0gMCl7Ci0gICAgICAgIGlmIChtZXRob2QuZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpID09IDApCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UgaWYobWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSAxKSAKLSAgICAgICAgICBkZWZhdWx0Q29uc3QgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAKLSAgcmV0dXJuIGRlZmF1bHRDb25zdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mTWV0aG9kVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mTWV0aG9kVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjkxN2FiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZk1ldGhvZFZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuc2VsZWN0aW9uLkJvb2xlYW5TZWxlY3Rpb247Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB2aXNpdG9yLgotKiAqLwotcHVibGljIGNsYXNzIEphdmFNb2ZNZXRob2RWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHVibGljIFN0cmluZyBTRVRfRU5EUE9JTlQgPSAic2V0RW5kUG9pbnQiOwotICBwdWJsaWMgU3RyaW5nIEdFVF9FTkRQT0lOVCA9ICJnZXRFbmRQb2ludCI7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIGZNZXRob2RzU2VsZWN0ZWQ7Ci0KLQotICAvKgotICAqIENvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZk1ldGhvZFZpc2l0b3IoKQotICB7Ci0gIH0KLSAKLSAgcHVibGljIFN0cmluZyBVTkRFUl9TQ09SRSA9ICJfIjsKLQotICAvKgotICAqIFJ1biB0aHJvdWdoIGFsbCB0aGUgbWV0aG9kcyBpbiB0aGlzIGJlYW4KLSAgKiBAcGFyYW0gSmF2YUNsYXNzIGphdmFjbGFzcyB0aGF0IGhvbGRzIHRoZSBtZXRob2RzCi0gICogQHBhcmFtIFZpc2l0b3JBY3Rpb24gQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBlYWNoIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyBydW4gKCBPYmplY3QgamF2YWNsYXNzLCBWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhY2xhc3M7Ci0gICAgZm9yIChJdGVyYXRvciBtPWphdmFDbGFzcy5nZXRQdWJsaWNNZXRob2RzKCkuaXRlcmF0b3IoKTsgbS5oYXNOZXh0KCk7ICkgewotICAgICAgTWV0aG9kIG1ldGhvZD0oTWV0aG9kKW0ubmV4dCgpOwotICAgICAgaWYoZk1ldGhvZHNTZWxlY3RlZCAhPSBudWxsKSAgewotICAgICAgICBib29sZWFuIG1ldGhvZFNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAJZm9yKGludCBpID0wO2kgPCBmTWV0aG9kc1NlbGVjdGVkLmxlbmd0aDtpKyspewotICAgICAgICAgIGlmKGZNZXRob2RzU2VsZWN0ZWRbaV0gPT0gbnVsbCkgY29udGludWU7Ci0gICAgICAgICAgaWYgKCBmTWV0aG9kc1NlbGVjdGVkW2ldLmdldFZhbHVlKCkuZXF1YWxzKG1ldGhvZC5nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCkpKQotICAgICAgICAgICAgbWV0aG9kU2VsZWN0ZWQgPSAoYm9vbGVhbikgZk1ldGhvZHNTZWxlY3RlZFtpXS5pc1NlbGVjdGVkKCk7Ci0gICAgICAgIH0JCSAgICAgICAgCQotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgIGlmKG1ldGhvZFNlbGVjdGVkKQotICAgICAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQobWV0aG9kKTsgIAotICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KG1ldGhvZCk7ICAgCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZFNlbGVjdGlvbihCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kU2VsZWN0ZWQpCi0gIHsKLSAgICBmTWV0aG9kc1NlbGVjdGVkID0gbWV0aG9kU2VsZWN0ZWQ7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvZGVnZW4vamF2YW1vZnZpc2l0b3JzL0phdmFNb2ZQYXJhbWV0ZXJWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTEwZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mUGFyYW1ldGVyVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgRW52aXJvbm1lbnQgZW52XzsKLQotICAvKgotICAqIENvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZlBhcmFtZXRlclZpc2l0b3IoRW52aXJvbm1lbnQgZW52KQotICB7Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7ICAJCi0gIAllbnZfID0gZW52OwotICB9Ci0gIAotICAvKgotICAqIFJ1biB0aHJvdWdoIGFsbCB0aGUgcGFyYW1ldGVycyBpbiB0aGlzIG1ldGhvZAotICAqIEBwYXJhbSBKYXZhQ2xhc3MgamF2YWNsYXNzIHRoYXQgaG9sZHMgdGhlIHBhcmFtZXRlcnMKLSAgKiBAcGFyYW0gVmlzaXRvckFjdGlvbiBBY3Rpb24gdG8gYmUgcGVyZm9ybWVkIG9uIGVhY2ggbWV0aG9kCi0gICoqLwotICBwdWJsaWMgU3RhdHVzIHJ1biAoIE9iamVjdCBpbWV0aG9kLCBWaXNpdG9yQWN0aW9uIHZBY3Rpb24pCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgCUNob2ljZSBPS0Nob2ljZSA9IG5ldyBDaG9pY2UoJ08nLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfT0siKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkRFU0NSSVBUSU9OX09LIikpOwotICAJQ2hvaWNlIENhbmNlbENob2ljZSA9IG5ldyBDaG9pY2UoJ0MnLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfQ0FOQ0VMIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9DQU5DRUwiKSk7ICAJCi0gICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpaW1ldGhvZDsKLSAgIAotICAgIEphdmFIZWxwZXJzIGphdmFSZXR1cm5QYXJhbWV0ZXIgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgIC8vcGdtIFRoaXMgdmlzaXRvciB1c2VkIHRvIHRha2UgYSBKYXZhUGFyYW1ldGVyIHR5cGUgYW5kIG5vdyBpdCBpcyBiZWluZyBjYWxsZWQKLSAgICAvLyAgICB3aXRoIGEgSmF2YUhlbHBlcnMgdHlwZS4gIEdpbCwgcGxlYXNlIGVuc3VyZSB0aGF0IHRoaXMgaXMgT2suCi0gICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChqYXZhUmV0dXJuUGFyYW1ldGVyKTsKLSAgICAvLwotICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOyAKLSAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgIHsKLSAgICAgIENob2ljZSByZXN1bHQgPSBlbnZfLmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICB7Ci0gICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICB9Ci0gICAgICAJCi0gICAgfQotICAgIC8vICAgICAgICAgICAKLQotICAgIC8vbm93IHRoZSBpbnB1dHMKLSAgICBMaXN0IHBhcmFtZXRlcnMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOyAKLSAgICAKLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgcGFyYW1ldGVycy5zaXplKCk7IGluZGV4KyspIAotICAgIHsKLSAgICAgIEphdmFQYXJhbWV0ZXIgcGFyYW09KEphdmFQYXJhbWV0ZXIpcGFyYW1ldGVycy5nZXQoaW5kZXgpOwotICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChwYXJhbSk7Ci0gICAgICAvLwotICAgICAgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgewotICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgIHsKLSAgICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0FNUExFX0NSRUFUSU9OX0NBTkNFTEVEIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgICAgCQotICAgICAgfQotICAgICAgLy8gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgICAKLSAgfQotICAKLSAgICAgICAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mVHlwZVZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29kZWdlbi9qYXZhbW9mdmlzaXRvcnMvSmF2YU1vZlR5cGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNGZmMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb2RlZ2VuL2phdmFtb2Z2aXNpdG9ycy9KYXZhTW9mVHlwZVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5GaWVsZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tb24uU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHZpc2l0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZlR5cGVWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIEVudmlyb25tZW50IGVudl87Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLQotICAvKgotICAqIENvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgSmF2YU1vZlR5cGVWaXNpdG9yKEVudmlyb25tZW50IGVudikKLSAgewotICAJZW52XyA9IGVudjsKLSAgfQotCi0gICAvKgotICAqIFVzZSB0aGlzIHRvIHJlZmxlY3QgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgICB0aGlzLmNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qZWN0OwotICB9Ci0KLSAgIC8qCi0gICogVXNlIHRoaXMgdG8gcmVmbGVjdCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBjbGllbnRQcm9qZWN0OwotICB9Ci0gIAotICAvKgotICAqIEdldCB0aGUgdHlwZSBiZWxvbmdpbmcgdG8gdGhlIHBhcmFtZXRlcgotICAqIEBwYXJhbSBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgdGhhdCBvd25zIHRoZSB0eXBlCi0gICogQHBhcmFtIFZpc2l0b3JBY3Rpb24gQWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBlYWNoIG1ldGhvZAotICAqKi8KLSAgcHVibGljIFN0YXR1cyBydW4gKCBPYmplY3QgdHlwZU5hdmlnYXRvciwgVmlzaXRvckFjdGlvbiB2QWN0aW9uKQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgaWYgKHR5cGVOYXZpZ2F0b3IgaW5zdGFuY2VvZiBKYXZhUGFyYW1ldGVyKXsKLQotICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyID0gKEphdmFQYXJhbWV0ZXIpdHlwZU5hdmlnYXRvcjsKLSAgICAgIEphdmFIZWxwZXJzIGphdmFIZWxwZXJzID0gamF2YVBhcmFtZXRlci5nZXRKYXZhVHlwZSgpOwotICAgICAgc3RhdHVzID0gdkFjdGlvbi52aXNpdChqYXZhSGVscGVycyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGVOYXZpZ2F0b3IgaW5zdGFuY2VvZiBKYXZhSGVscGVycyl7Ci0gICAgCXN0YXR1cyA9IHZBY3Rpb24udmlzaXQodHlwZU5hdmlnYXRvcik7CQotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlTmF2aWdhdG9yIGluc3RhbmNlb2YgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKXsKLSAgICAgIFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvciBwZCA9IChTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpdHlwZU5hdmlnYXRvcjsKLSAgICAgIEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCBqYXZhTW9mUmVmID0gbmV3IEphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCgpOwotICAgICAgamF2YU1vZlJlZi5zZXRDbGllbnRQcm9qZWN0KGNsaWVudFByb2plY3QpOwotICAgICAgamF2YU1vZlJlZi5zZXRQcm94eUJlYW4oKChKYXZhSGVscGVycylwZC5nZXRQcm9wZXJ0eVR5cGUoKSkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgIHN0YXR1cyA9IGphdmFNb2ZSZWYuZXhlY3V0ZShlbnZfKTsKLSAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICAKLSAgICAgIHN0YXR1cyA9IHZBY3Rpb24udmlzaXQoamF2YU1vZlJlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGVOYXZpZ2F0b3IgaW5zdGFuY2VvZiBGaWVsZCl7Ci0gICAgICBGaWVsZEltcGwgZmllbGQgPSAoRmllbGRJbXBsKXR5cGVOYXZpZ2F0b3I7Ci0gICAgICBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgamF2YU1vZlJlZiA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICAgIGphdmFNb2ZSZWYuc2V0UHJveHlCZWFuKGZpZWxkLmdldEphdmFUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgCi0gICAgICBzdGF0dXMgPSBqYXZhTW9mUmVmLmV4ZWN1dGUoZW52Xyk7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgCi0gICAgICBzdGF0dXMgPSB2QWN0aW9uLnZpc2l0KGphdmFNb2ZSZWYuZ2V0SmF2YUNsYXNzKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICAgICAgICAKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQWJzdHJhY3RTdGFydFNlcnZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9BYnN0cmFjdFN0YXJ0U2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzODE2YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9BYnN0cmFjdFN0YXJ0U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RhcnRTZXJ2ZXIgewotIAotcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci1wcml2YXRlIExvZyBsb2dfOwotcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi1wdWJsaWMgQWJzdHJhY3RTdGFydFNlcnZlcigpCi17Ci0JbG9nXyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5wbHVnaW4iLCB0aGlzICk7Ci19Ci0KLS8qKgotICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICovCi1wdWJsaWMgdm9pZCBTdGFydFNlcnZlciAoSVByb2plY3QgcHJvamVjdCwgSVNlcnZlciBzZXJ2ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiByZXN0YXJ0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotewotCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQotICAgdHJ5Ci0gIHsKLSAgIAkKLS8vICAgIElKYXZhU2VydmVyIGphdmFTZXJ2ZXIgPSAoSUphdmFTZXJ2ZXIpIHNlcnZlci5nZXREZWxlZ2F0ZSgpOwotLy8gICAgYWRkSmFyc1RvQ2xhc3NQYXRoKGphdmFTZXJ2ZXIpOwotICAgIHZhbGlkYXRlUmVtb3RlU2VydmVyUGF0aChzZXJ2ZXIpOwotCi0gICAgaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgIC8vIFRoZSBTZXJ2ZXIgaXMgcnVubmluZwotICAgIHsgCi0gICAgICBpZiAoc2VydmVyLmdldFNlcnZlclJlc3RhcnRTdGF0ZSgpKQotICAgICAgeyAgICAKLSAgICAgIAkKLSAgICAgICAgc2VydmVyLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7Ci0gICAgICAgIGxvZ18ubG9nKExvZy5JTkZPLCA1MDUwLCB0aGlzLCAiU3RhcnRTZXJ2ZXIiLCAicHJvamVjdD0iK3Byb2plY3QrIiwgU3RvcCBjb21tYW5kIGNvbXBsZXRlZCwgcmVzdGFydCBuZWVkZWQiKTsKLSAgICAgICAgcHVibGlzaFByb2plY3Qoc2VydmVyKTsKLSAgICAJc3RhcnRQcm9qZWN0KHNlcnZlcik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJCi0gICAgICAgIGlmIChyZXN0YXJ0KSAvLyBXRUItSU5GXGxpYiBuZWVkIHRvIGJlIHJlbG9hZGVkCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaXNoUHJvamVjdChzZXJ2ZXIpOyAgICAgIAotICAgICAgICAgIHJlc3RhcnRQcm9qZWN0KHByb2plY3QsIHNlcnZlcik7Ci0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAJCi0gICAgCQlwdWJsaXNoUHJvamVjdChzZXJ2ZXIpOwotICAgIAkJc3RhcnRQcm9qZWN0KHNlcnZlcik7Ci0gICAgCX0KLX0KLQotICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAJdGhyb3cgY2U7Ci0gIAl9Ci0gIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCxtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLGUpKTsKLSAgfQotfQotCi1wcm90ZWN0ZWQgdm9pZCBwdWJsaXNoUHJvamVjdChJU2VydmVyIHNlcnZlcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLXsKLSAgICAgIG1vbml0b3Iuc3ViVGFzayggbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJQUk9HUkVTU19JTkZPX1BVQkxJU0hJTkdfU0VSVkVSIiApICk7Ci0gICAgICBJU3RhdHVzIHN0YXR1cyA9IHNlcnZlci5wdWJsaXNoKElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCwgbW9uaXRvcik7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykKLSAgICAgIAl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotICAgICAgbG9nXy5sb2coTG9nLklORk8sIDUwNTEsIHRoaXMsICJwdWJsaXNoUHJvamVjdCIsICJJU2VydmVyPSIrc2VydmVyKyIsIFB1Ymxpc2ggY29tbWFuZCBjb21wbGV0ZWQiKTsKLSB9Ci0KLXByb3RlY3RlZCB2b2lkIHN0YXJ0UHJvamVjdChJU2VydmVyIHNlcnZlcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLXsKLSAgdHJ5Ci0gIHsKLSAgICBtb25pdG9yLnN1YlRhc2soIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiUFJPR1JFU1NfSU5GT19TVEFSVElOR19TRVJWRVIiICkgKTsgICAgCi0gICAgc2VydmVyLnN5bmNocm9ub3VzU3RhcnQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG1vbml0b3IpOwotICAgIGxvZ18ubG9nKExvZy5JTkZPLCA1MDUyLCB0aGlzLCAic3RhcnRQcm9qZWN0IiwgIklTZXJ2ZXI9IitzZXJ2ZXIrIiwgU3RhcnQgY29tbWFuZCBjb21wbGV0ZWQiKTsKLSAgICAKLSAgfQotICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSxlKSk7Ci0gIH0gIAotfQotCi1wcm90ZWN0ZWQgdm9pZCByZXN0YXJ0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJU2VydmVyIHNlcnZlcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLXsKLSAgdHJ5Ci0gIHsKLQotICAgIG1vbml0b3Iuc3ViVGFzayggbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJQUk9HUkVTU19JTkZPX1NUQVJUSU5HX1NFUlZFUiIgKSApOwotICAgIEVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gSjJFRVV0aWxzLmdldEVBUlByb2plY3RzKHByb2plY3QpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gZWFyc1tpXS5nZXRQcm9qZWN0KCk7Ci0gICAgICBpZiAoZWFyUHJvamVjdCAhPSBudWxsICYmIFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoc2VydmVyLFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBtb25pdG9yKSkgICAgCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE86IHJlc3RhcnQgcHJvamVjdD8KLSAgICAgICAgbG9nXy5sb2coTG9nLklORk8sIDUwNTMsIHRoaXMsICJyZXN0YXJ0UHJvamVjdCIsICJlYXJQcm9qZWN0PSIrZWFyUHJvamVjdCsiLCBSZXN0YXJ0IHByb2plY3QgY29tbWFuZCBjb21wbGV0ZWQiKTsKLSAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCxtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLGUpKTsKLSAgfSAgCi19Ci0KLXB1YmxpYyB2b2lkIHJ1blByZVNlcnZlckNvbmZpZyhJU2VydmVyIHNlcnZlciwgSVByb2plY3QgRUFSUHJvamVjdCl7Ci0KLQlyZXR1cm47Ci0JCi19Ci0KLXB1YmxpYyB2b2lkIHJ1blBvc3RTZXJ2ZXJDb25maWcoSVNlcnZlciBzZXJ2ZXIsIElQcm9qZWN0IEVBUlByb2plY3QpewotCi0JcmV0dXJuOwotfQotCi0KLXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZEphcnNUb0NsYXNzUGF0aChJU2VydmVyIHNlcnZlcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci1wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZVJlbW90ZVNlcnZlclBhdGgoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgdm9pZCBzdG9wU2VydmVyKElTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQotCQlpZiAoc2VydmVyLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQlzZXJ2ZXIuc3luY2hyb25vdXNTdG9wKGZhbHNlKTsKLQkJfQotCX0JCi0JCi19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0FkZE1vZHVsZVRvU2VydmVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODYzNDg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0JICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRJT04gPSAiKFJlKVN0YXJ0IGFuZCBwdWJsaXNoIHRoZSBzZXJ2ZXIiOwotCSAgcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIExBQkVMID0gIlN0YXJ0U2VydmVyQ29tbWFuZCI7Ci0JICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0JICAKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIG1vZHVsZTsKLQkKLQlwdWJsaWMgQWRkTW9kdWxlVG9TZXJ2ZXJDb21tYW5kKCkKLQl7Ci0JICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQkgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCSAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotCSAgc2V0TmFtZShMQUJFTCk7CQkKLQl9Ci0JCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQl7Ci0JICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsJICAgIAotCSAgICAKLQkgICAgSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXIoc2VydmVySW5zdGFuY2VJZCk7Ci0JICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5TVEFOQ0VfTk9UX0ZPVU5EIiksIFN0YXR1cy5FUlJPUik7Ci0JICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCSAgICAgIHJldHVybiBzdGF0dXM7Ci0JICAgIH0KLQkgICAKLQkgICAgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcndjID0gbnVsbDsKLQkgICAgCi0JICAgIHRyeQotCSAgICB7Ci0JICAgIC8vRW5zdXJlIHRoZSBtb2R1bGUgaXMgbm90IGEgSmF2YSB1dGlsaXR5Ci0JICAgIElQcm9qZWN0IGlwcm9qZWN0ID0gKElQcm9qZWN0KShuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShwcm9qZWN0KTsKLQkgICAgaWYgKCFKMkVFVXRpbHMuaXNKYXZhQ29tcG9uZW50KGlwcm9qZWN0LCBtb2R1bGUpKQotCSAgICB7ICAgICAgCi0JICAgICAgSU1vZHVsZSBpbW9kdWxlID0gU2VydmVyVXRpbHMuZ2V0TW9kdWxlKGlwcm9qZWN0LCBtb2R1bGUpOwotCSAgICAgIGlmICghU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzZXJ2ZXIsIGltb2R1bGUsIG51bGwpKQotCSAgICAgIHsKLQkgICAgICAgIElNb2R1bGVbXSBpbW9kdWxlcyA9IG5ldyBJTW9kdWxlW117aW1vZHVsZX07Ci0JICAgICAgICBzZXJ2ZXJ3YyA9IHNlcnZlci5jcmVhdGVXb3JraW5nQ29weSgpOwotCSAgICAgICAgU2VydmVyVXRpbC5tb2RpZnlNb2R1bGVzKHNlcnZlcndjLCBpbW9kdWxlcywgbnVsbCwgbnVsbCk7Ci0JICAgICAgfQotCi0JICAgIH0KLQkgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCSAgICB7Ci0JICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfTU9EVUxFIiwgbmV3IFN0cmluZ1tde21vZHVsZX0pLCBTdGF0dXMuRVJST1IpOwotCSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkgICAgICByZXR1cm4gc3RhdHVzOyAgICAgIAotCSAgICB9IGZpbmFsbHkKLQkgICAgewotCSAgICAgIHRyeQotCSAgICAgIHsKLQkgICAgICAgIGlmIChzZXJ2ZXJ3YyAhPSBudWxsKQotCSAgICAgICAgewotCSAgICAgICAgICBzZXJ2ZXJ3Yy5zYXZlKHRydWUsIG51bGwpOwotCSAgICAgICAgfQotCSAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0JICAgICAgewotCSAgICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfTU9EVUxFIiwgbmV3IFN0cmluZ1tdIHsgbW9kdWxlIH0pLCBTdGF0dXMuRVJST1IpOwotCSAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQkgICAgICB9ICAgICAgCi0JICAgIH0KLQkgICAgCi0JCXJldHVybiBzdGF0dXM7Ci0JICAgIAotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGUoU3RyaW5nIG1vZHVsZSkKLQl7Ci0JCXRoaXMubW9kdWxlID0gbW9kdWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIHByb2plY3QpCi0JewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0JewotCQl0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0JCi0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2NzNmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Fzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIEFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotCXByaXZhdGUgU3RyaW5nIHByb2plY3RfOwotCXByaXZhdGUgU3RyaW5nIG1vZHVsZV87Ci0JcHJpdmF0ZSBTdHJpbmcgZWFyUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgZWFyXzsKLQkKLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIAotICBwdWJsaWMgQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQoKXsKLQkgICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICB9Ci0gIAotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0JewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCUlQcm9qZWN0IG1vZHVsZVByb2plY3QgPSBudWxsOwotCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLQotCQkvLyBnZXQgcHJvamVjdHMKLQkJaWYgKHByb2plY3RfIT1udWxsKQotCQkJbW9kdWxlUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0Xyk7Ci0JCWlmIChlYXJQcm9qZWN0XyE9bnVsbCkKLQkJCWVhclByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZWFyUHJvamVjdF8pOwotCQkKLQkJLy8gYXNzb2NpYXRlIG1vZHVsZXMgaWYgbm90IGFscmVhZHkgYXNzb2NpYXRlZAotCQlpZiAobW9kdWxlUHJvamVjdCE9bnVsbCAmJiBlYXJQcm9qZWN0IT1udWxsKSB7Ci0JCQlpZiAoIUoyRUVVdGlscy5pc0NvbXBvbmVudEFzc29jaWF0ZWQoZWFyUHJvamVjdCwgZWFyXywgbW9kdWxlUHJvamVjdCwgbW9kdWxlXykpCi0JCQkJSjJFRVV0aWxzLmFzc29jaWF0ZUNvbXBvbmVudFRvRUFSKG1vZHVsZVByb2plY3QsIG1vZHVsZV8sIGVhclByb2plY3QsIGVhcl8pOwotCQl9Ci0JCQotCQkvLyBlbnN1cmUgbW9kdWxlcyBhcmUgYXNzb2NpYXRlZCBvdGhlcndpc2UgcmVwb3J0IGVycm9yCi0JCWlmICghSjJFRVV0aWxzLmlzQ29tcG9uZW50QXNzb2NpYXRlZChlYXJQcm9qZWN0LCBlYXJfLCBtb2R1bGVQcm9qZWN0LCBtb2R1bGVfKSl7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VOQUJMRV9UT19BU1NPQ0lBVEUiLCBuZXcgU3RyaW5nW117bW9kdWxlXywgZWFyX30pLCBTdGF0dXMuRVJST1IpOwotCQkJaWYgKGVudiE9bnVsbCkKLQkJCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgICByZXR1cm4gc3RhdHVzOyAKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0ICkKLSAgewotCSAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0JICAKLSAgcHVibGljIHZvaWQgc2V0TW9kdWxlKCBTdHJpbmcgbW9kdWxlICkKLSAgewotCSAgbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQkKLQkKLSAgcHVibGljIHZvaWQgc2V0RUFSUHJvamVjdCggU3RyaW5nIGVhclByb2plY3QgKQotICB7Ci0JICBlYXJQcm9qZWN0XyA9IGVhclByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVhciggU3RyaW5nIGVhciApCi0gIHsKLQkgIGVhcl8gPSBlYXI7ICAKLSAgfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQnVpbGRQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9CdWlsZFByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGY3OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9CdWlsZFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIEJ1aWxkUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIHZhbGlkYXRpb25NYW5hZ2VyOwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3RfOwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2VCdWlsZF87Ci0gIC8vIHJtIHByaXZhdGUgTW9kZWwgbW9kZWw7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUjsKLSAgICovCi0gIHB1YmxpYyBCdWlsZFByb2plY3RDb21tYW5kKCkKLSAgewotICAgIHN1cGVyKCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVRBU0tfTEFCRUxfV0VCU0VSVklDRV9CVUlMRF9QUk9KRUNUIiksCi0gICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlVEFTS19ERVNDX1dFQlNFUlZJQ0VfQlVJTERfUFJPSkVDVCIpICk7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChmb3JjZUJ1aWxkXykKLSAgICAgICAgcHJvamVjdF8uYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBlbHNlIGlmICh2YWxpZGF0aW9uTWFuYWdlciA9PSBudWxsKQotICAgICAgICBwcm9qZWN0Xy5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGVsc2UgaWYgKHZhbGlkYXRpb25NYW5hZ2VyLmdldFdvcmtzcGFjZUF1dG9CdWlsZFByZWZlcmVuY2UoKSkKLSAgICAgICAgcHJvamVjdF8uYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7ICAgCi0gICAgfQotICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkKLSAgICB7Ci0gICAgICAvLyBjb250aW51ZSBleGVjdXRpb24KLSAgICB9Ci0gICAgY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkKLSAgICB7Ci0gICAgICAvLyBjb250aW51ZSBleGVjdXRpb24KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gZm9yY2VCdWlsZCBUaGUgZm9yY2VCdWlsZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGb3JjZUJ1aWxkKGJvb2xlYW4gZm9yY2VCdWlsZCkgewotICAgIHRoaXMuZm9yY2VCdWlsZF8gPSBmb3JjZUJ1aWxkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotICAgIHRoaXMucHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB2YWxpZGF0aW9uTWFuYWdlciBUaGUgdmFsaWRhdGlvbk1hbmFnZXIgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvbk1hbmFnZXIoVmFsaWRhdGlvbk1hbmFnZXIgdmFsaWRhdGlvbk1hbmFnZXIpIHsKLSAgICB0aGlzLnZhbGlkYXRpb25NYW5hZ2VyID0gdmFsaWRhdGlvbk1hbmFnZXI7Ci0gIH0KLQotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DaGVja1Byb2plY3RPS0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ2hlY2tQcm9qZWN0T0tDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjQwOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DaGVja1Byb2plY3RPS0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotcHVibGljIGNsYXNzIENoZWNrUHJvamVjdE9LQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSWRfOwotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SCi0gICAqLwotICBwdWJsaWMgQ2hlY2tQcm9qZWN0T0tDb21tYW5kKCkgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCi0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIAotICAgIFN0cmluZyB0eXBlaWQgPSBzZXJ2aWNlU2VydmVyVHlwZUlkXzsKLSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwotLy8gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBzZXJ2ZXJzLml0ZXJhdG9yKCk7Ci0gICAgYm9vbGVhbiB2aWV3T3BlbiA9IGZhbHNlOwotICAgIFN0cmluZyBzZXJ2ZXJOYW1lID0gbnVsbDsKLQotICAgIGZvciAoaW50IGk9MDtpPHNlcnZlcnMubGVuZ3RoO2krKykgewotICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgc2VydmVyc1tpXTsKLQotICAgICAgLy8gSWYgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGlzIG9wZW4gZm9yIHRoZSBzZXJ2ZXIgdGhhdCB3ZSBhcmUKLSAgICAgIC8vIGRlcGxveWluZwotICAgICAgLy8gdG8gd2Ugd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gY2xvc2UgaXQuCi0gICAgICBpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFscyh0eXBlaWQpKSB7Ci0gICAgICAgIHZpZXdPcGVuID0gdHJ1ZTsKLSAgICAgICAgc2VydmVyTmFtZSA9IHNlcnZlci5nZXROYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2aWV3T3BlbikgewotICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0VSVkVSX1ZJRVdfT1BFTiIsIG5ldyBTdHJpbmdbXSB7IHNlcnZlck5hbWV9KTsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLCBlcnJvck1lc3NhZ2UsIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmljZVNlcnZlcklkCi0gICAqICAgICAgICAgICAgVGhlIHNlcnZpY2VTZXJ2ZXIgZmFjdG9yeSBJZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVySWQpIHsKLSAgICB0aGlzLnNlcnZpY2VTZXJ2ZXJUeXBlSWRfID0gc2VydmljZVNlcnZlcklkOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOTQ4ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLQotcHVibGljIGNsYXNzIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQiOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJFbnN1cmUgRGVwbG95YWJsZSBpcyBhZGRlZCB0byBTZXJ2ZXIgQ29uZmlndXJhdGlvbiBmb3IgY2xpZW50IHByb2plY3RzIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIEJvb2xlYW4gY3JlYXRpb25TY2VuYXJpb18gPSBCb29sZWFuLlRSVUU7Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzYW1wbGVQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRF87Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRF87Ci0gIHByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotICBwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlUHJvamVjdFVSTF87Ci0gIHByaXZhdGUgU3RyaW5nIHNhbXBsZVByb2plY3RVUkxfOwotCi0gIC8vYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfIGlzIHNldCB0byB0cnVlIGlmCi0gIC8vLSB0aGUgcHJvamVjdCBleGlzdHMgQU5ECi0gIC8vLSB0aGUgc2VydmVyIGV4aXN0cyAoaS5lLiB0aGlzIGNvbW1hbmQgZGlkIG5vdCBjcmVhdGUgaXQpIEFORAotICAvLy0gdGhpcyBjb21tYW5kIGFkZGVkIHRoZSBwcm9qZWN0IHRvIHRoZSBzZXJ2ZXIKLSAgcHJpdmF0ZSBib29sZWFuIGFkZGVkUHJvamVjdFRvU2VydmVyXyA9IGZhbHNlOyAgCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZCgpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7Ci0gIH0KLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SCi0gICAqLwotICBwdWJsaWMgQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQoYm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvKSB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICAgIHNldE5hbWUoTEFCRUwpOwotICAgIGNyZWF0aW9uU2NlbmFyaW9fID0gbmV3IEJvb2xlYW4oY3JlYXRpb25TY2VuYXJpbyk7Ci0gIH0KLQotICAvKioKLSAgICogZXhlY3V0ZQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotCi0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIHRyeSB7Ci0KLSAgICAgIC8vIGRldGVybWluZSBjbGllbnQgb3Igc2VydmljZSBwcm9qZWN0Ci0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gIHNhbXBsZVByb2plY3RfOwotICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQotICAgICAgLy8gZ2V0IHNhbXBsZSBzZXJ2ZXIgZmFjdG9yeSBJZCBhbmQgaW5zdGFuY2VJZAotICAgICAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9IGNsaWVudElkc18uZ2V0U2VydmVySWQoKTsKLSAgICAgIFN0cmluZyBleGlzdGluZ1NlcnZlckluc3RJZCA9IGNsaWVudElkc18uZ2V0U2VydmVySW5zdGFuY2VJZCgpOwotICAgICAgSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotICAgICAgaWYgKGV4aXN0aW5nU2VydmVySW5zdElkID09bnVsbCkgewotICAgICAgCXNlcnZlcj0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAvLyBnZXQgYW4gSVNlcnZlciBvYmplY3Q7IGVpdGhlciBleGlzdGluZyBvciBjcmVhdGUgb25lCi0gICAgICAgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKGV4aXN0aW5nU2VydmVySW5zdElkKTsKLSAgICAgIH0KLSAgIAotICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0gICAgICAJLy8gZmluZCBleGFjdCBzZXJ2ZXIgZm9yIGdpdmVuIHByb2plY3QKLSAgICAgICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgICAgIGJvb2xlYW4gZm91bmRTZXJ2ZXIgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgaWYgKHNlcnZlcnNbaV0uZXF1YWxzKHNlcnZlcikpCi0gICAgICAgICAgICBmb3VuZFNlcnZlciA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3VuZFNlcnZlcikgewotICAgICAgICAJU3RhdHVzIG1vZFN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYgLHNlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIHRydWUsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgICAgCWlmIChtb2RTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAJCXJldHVybiBtb2RTdGF0dXM7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIGFkZGVkUHJvamVjdFRvU2VydmVyXyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBpZiAoUmVzb3VyY2VVdGlscy5pc1RydWVKYXZhUHJvamVjdChwcm9qZWN0KSkKLSAgICAgICAgewotICAgICAgICAgIC8vRG9uJ3QgYXR0ZW1wdCB0byBhZGQgYSBKYXZhIHByb2plY3QgdG8gYSBzZXJ2ZXIsIHRoZXJlZm9yZSBwYXNzaW5nIGluIG51bGwgZm9yIHRoZSBtb2R1bGUuCi0gICAgICAgICAgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVTZXJ2ZXIoZW52LCBudWxsLCBzZXJ2ZXJGYWN0b3J5SWQsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXIgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZVNlcnZlcihlbnYsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBzZXJ2ZXJGYWN0b3J5SWQsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKLSAgICAgICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NSRUFURV9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSU1vZHVsZVtdIHBhcmVudE1vZHVsZXMgPSBzZXJ2ZXIuZ2V0Um9vdE1vZHVsZXMoUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksbnVsbCk7Ci0gICAgICAgIGlmIChwYXJlbnRNb2R1bGVzIT1udWxsICYmIHBhcmVudE1vZHVsZXMubGVuZ3RoIT0wKSB7Ci0gICAgICAgICAgaWYgKCFTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpKSB7Ci0gICAgICAgICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBzZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCB0cnVlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgICAgICByZXR1cm4gbW1TdGF0dXM7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLQotICAgICAgfQotICAgICAgCi0gICAgICAvLwotICAgICAgU3RyaW5nIHByb2plY3RVUkwgPSBSZXNvdXJjZVV0aWxzLmdldFdlYlByb2plY3RVUkwocHJvamVjdCwgc2VydmVyRmFjdG9yeUlkLCBzZXJ2ZXIpOwotICAgICAgaWYgKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICAgIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2ZXI7Ci0gICAgICAgIHNlcnZpY2VQcm9qZWN0VVJMXyA9IHByb2plY3RVUkw7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmVyOwotICAgICAgICBzYW1wbGVQcm9qZWN0VVJMXyA9IHByb2plY3RVUkw7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9CQURfU0VSVkVSX0NPTkZJRyIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoSVByb2plY3Qgc2FtcGxlUHJvamVjdCkgewotICAgIHNhbXBsZVByb2plY3RfID0gc2FtcGxlUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQpIHsKLSAgICBzZXJ2aWNlU2VydmVyVHlwZUlEXyA9IHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRCkgewotICAgIHNhbXBsZVNlcnZlclR5cGVJRF8gPSBzYW1wbGVTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIpIHsKLSAgICBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmljZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2VydmljZUV4aXN0aW5nU2VydmVyKCkgewotICAgIHJldHVybiBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQoKSB7Ci0JU3RyaW5nIGlkID0gbnVsbDsKLQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCWlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfIT1udWxsKXsKLQkgIHdjID0gc2VydmljZUV4aXN0aW5nU2VydmVyXy5jcmVhdGVXb3JraW5nQ29weSgpOwotCSAgaWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0JfQotCXJldHVybiBpZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpIHsKLSAgICBzYW1wbGVFeGlzdGluZ1NlcnZlcl8gPSBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIHB1YmxpYyBJU2VydmVyIGdldFNhbXBsZUV4aXN0aW5nU2VydmVyKCkgewotICAgIHJldHVybiBzYW1wbGVFeGlzdGluZ1NlcnZlcl87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZUV4aXN0aW5nU2VydmVySW5zdElkKCkgewotCVN0cmluZyBpZCA9IG51bGw7Ci0JSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLQlpZiAoc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfIT1udWxsKXsKLQkgIHdjID0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JICBpZCA9ICh3YyE9bnVsbCA/IHdjLmdldElkKCkgOiBudWxsKTsKLQl9Ci0JcmV0dXJuIGlkOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VQcm9qZWN0VVJMKCkgewotICAgIHJldHVybiBzZXJ2aWNlUHJvamVjdFVSTF87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVByb2plY3RVUkwoKSB7Ci0gICAgcmV0dXJuIHNhbXBsZVByb2plY3RVUkxfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcihUeXBlUnVudGltZVNlcnZlciB0cnMpewotICAJdGhpcy5jbGllbnRJZHNfID0gdHJzOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRBZGRlZFByb2plY3RUb1NlcnZlcigpIHsKLSAgICByZXR1cm4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfOwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db21wdXRlRW5kcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyM2FmNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9Db21wdXRlRW5kcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBCb29sZWFuIG1vbml0b3JTZXJ2aWNlOwotICBwcml2YXRlIEludGVnZXIgbW9uaXRvcmVkUG9ydDsKLQotICBwdWJsaWMgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNvbXB1dGVFbmRwb2ludENvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNvbXB1dGVFbmRwb2ludENvbW1hbmQiKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gbW9uaXRvcmVkUG9ydCBUaGUgbW9uaXRvcmVkUG9ydCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yZWRQb3J0KEludGVnZXIgbW9uaXRvcmVkUG9ydCkKLSAgewotICAgIHRoaXMubW9uaXRvcmVkUG9ydCA9IG1vbml0b3JlZFBvcnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBtb25pdG9yU2VydmljZSBUaGUgbW9uaXRvclNlcnZpY2UgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoQm9vbGVhbiBtb25pdG9yU2VydmljZSkKLSAgewotICAgIHRoaXMubW9uaXRvclNlcnZpY2UgPSBtb25pdG9yU2VydmljZTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdlYlNlcnZpY2VzUGFyc2VyIFRoZSB3ZWJTZXJ2aWNlc1BhcnNlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHdzZGxVUkkgVGhlIHdzZGxVUkkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKQotICB7Ci0gICAgaWYgKG1vbml0b3JTZXJ2aWNlICE9IG51bGwgJiYgbW9uaXRvclNlcnZpY2UuYm9vbGVhblZhbHVlKCkgJiYgbW9uaXRvcmVkUG9ydCAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gd2ViU2VydmljZXNQYXJzZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSSSk7Ci0gICAgICBpZiAoZGVmICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBkZWYuZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpaXQubmV4dCgpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KWl0Mi5uZXh0KCk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0MyA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQzLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpdDMubmV4dCgpOwotICAgICAgICAgICAgICBpZiAoZXh0IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSAoKFNPQVBBZGRyZXNzKWV4dCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCBtb25pdG9yZWRQb3J0LmludFZhbHVlKCksIHVybC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGludCBwcm90b2NvbEluZGV4ID0gbG9jYXRpb24uaW5kZXhPZigiOi8vIik7Ci0gICAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xJbmRleCAhPSAtMSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3RvY29sID0gbG9jYXRpb24uc3Vic3RyaW5nKDAsIHByb3RvY29sSW5kZXgrMyk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBob3N0UG9ydEluZGV4ID0gbG9jYXRpb24uaW5kZXhPZignLycsIHByb3RvY29sSW5kZXgrMyk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlOwotICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdFBvcnRJbmRleCA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGhvc3RQb3J0SW5kZXggPSBsb2NhdGlvbi5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBsb2NhdGlvbi5zdWJzdHJpbmcoaG9zdFBvcnRJbmRleCwgbG9jYXRpb24ubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdFBvcnQgPSBsb2NhdGlvbi5zdWJzdHJpbmcocHJvdG9jb2xJbmRleCszLCBob3N0UG9ydEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGhvc3RJbmRleCA9IGhvc3RQb3J0LmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChob3N0SW5kZXggIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IGhvc3RQb3J0LnN1YnN0cmluZygwLCBob3N0SW5kZXgrMSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICBob3N0ID0gaG9zdFBvcnQgKyAnOic7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuZXdQb3J0ID0gU3RyaW5nLnZhbHVlT2YobW9uaXRvcmVkUG9ydC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGVuZHBvaW50ID0gbmV3IFN0cmluZ0J1ZmZlcihwcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LmFwcGVuZChob3N0KTsKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuYXBwZW5kKG5ld1BvcnQpOwotICAgICAgICAgICAgICAgICAgICBlbmRwb2ludC5hcHBlbmQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRwb2ludC50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29weVdTRExDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NvcHlXU0RMQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGM1ZDVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ29weVdTRExDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuTmV0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ai5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb3B5V1NETENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxVUkk7Ci0gIHByaXZhdGUgV2ViU2VydmljZXNQYXJzZXIgd2ViU2VydmljZXNQYXJzZXI7Ci0gIHByaXZhdGUgU3RyaW5nIGRlc3RpbmF0aW9uVVJJOwotICBwcml2YXRlIERlZmluaXRpb24gZGVmOwotICBwcml2YXRlIFZlY3RvciBpZ25vcmVMaXN0OwotCi0gIHB1YmxpYyBDb3B5V1NETENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIkNPTU1BTkRfTEFCRUxfQ09QWV9XU0RMIiksIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCJDT01NQU5EX0RFU0NfQ09QWV9XU0RMIikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZ25vcmVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgaWYgKGRlZiA9PSBudWxsKQotICAgICAgICBkZWYgPSB3ZWJTZXJ2aWNlc1BhcnNlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJJKTsKLSAgICAgIGNvcHlXU0RMKGVudiwgd3NkbFVSSSwgZ2V0QmFzZVVSSShkZXN0aW5hdGlvblVSSSksIGdldExvY2FsbmFtZShkZXN0aW5hdGlvblVSSSksIGRlZik7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NPUFlfV1NETCIsIG5ldyBTdHJpbmdbXXt3c2RsVVJJLCBkZXN0aW5hdGlvblVSSX0pLCBTdGF0dXMuRVJST1IsIHQpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weVdTREwoRW52aXJvbm1lbnQgZW52LCBTdHJpbmcgdXJpLCBTdHJpbmcgZGVzdFVSSSwgU3RyaW5nIGRlc3RMb2NhbG5hbWUpIHRocm93cyBXU0RMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFVSSUV4Y2VwdGlvbgotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb247Ci0JCi0JdHJ5IHsKLQkJZGVmaW5pdGlvbiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uVmVyYm9zZSh1cmkpOwotCQljb3B5V1NETChlbnYsIHVyaSwgZGVzdFVSSSwgZGVzdExvY2FsbmFtZSwgZGVmaW5pdGlvbik7CQotCX0gY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotCQljb3B5WE1MU2NoZW1hKGVudiwgdXJpLCBkZXN0VVJJKTsKLQl9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weVdTREwoRW52aXJvbm1lbnQgZW52LCBTdHJpbmcgdXJpLCBTdHJpbmcgZGVzdFVSSSwgU3RyaW5nIGRlc3RMb2NhbG5hbWUsIERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIFdTRExFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24sIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoaWdub3JlTGlzdC5jb250YWlucyh1cmkpKQotICAgICAgcmV0dXJuOwotICAgIGlnbm9yZUxpc3QuYWRkKHVyaSk7Ci0gICAgaW50IGluZGV4ID0gd3NkbFVSSS5sYXN0SW5kZXhPZignLycpOwotICAgIFN0cmluZyBiYXNlVVJJID0gZ2V0QmFzZVVSSSh3c2RsVVJJKTsKLSAgICBpZiAoZGVzdExvY2FsbmFtZSA9PSBudWxsIHx8IGRlc3RMb2NhbG5hbWUubGVuZ3RoKCkgPD0gMCkKLSAgICAgIGRlc3RMb2NhbG5hbWUgPSBnZXRMb2NhbG5hbWUod3NkbFVSSSk7Ci0gICAgLy8gY29weSBXU0RMCi0gICAgU3RyaW5nQnVmZmVyIGRlc3RpbmF0aW9uRmlsZVVSSSA9IG5ldyBTdHJpbmdCdWZmZXIoYWRkVHJhaWxpbmdTZXBhcmF0b3IoZGVzdFVSSSkpOwotICAgIGRlc3RpbmF0aW9uRmlsZVVSSS5hcHBlbmQoZGVzdExvY2FsbmFtZSk7Ci0gICAgV1NETEZhY3Rvcnkgd3NkbEZhY3RvcnkgPSBuZXcgV1NETEZhY3RvcnlJbXBsKCk7Ci0gICAgV1NETFdyaXRlciB3c2RsV3JpdGVyID0gd3NkbEZhY3RvcnkubmV3V1NETFdyaXRlcigpOwotICAgIE91dHB1dFN0cmVhbSBvcyA9IGVudi5nZXRVUklGYWN0b3J5KCkubmV3VVJJKGRlc3RpbmF0aW9uRmlsZVVSSS50b1N0cmluZygpKS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICB3c2RsV3JpdGVyLndyaXRlV1NETChkZWZpbml0aW9uLCBvcyk7Ci0gICAgb3MuY2xvc2UoKTsKLSAgICAvLyBjb3B5IDx3c2RsOmltcG9ydD5zCi0gICAgTWFwIGltcG9ydHMgPSBkZWZpbml0aW9uLmdldEltcG9ydHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaW1wb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IChMaXN0KWl0Lm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgbGlzdEl0ID0gbGlzdC5pdGVyYXRvcigpOyBsaXN0SXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgSW1wb3J0IHdzZGxJbXBvcnQgPSAoSW1wb3J0KWxpc3RJdC5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB3c2RsSW1wb3J0VVJJID0gd3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICBpZiAoaXNSZWxhdGl2ZSh3c2RsSW1wb3J0VVJJKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBpbXBvcnRCYXNlVVJJID0gKG5ldyBTdHJpbmdCdWZmZXIoYmFzZVVSSSkpLmFwcGVuZCh3c2RsSW1wb3J0VVJJKS50b1N0cmluZygpOwotICAgICAgICAgIFN0cmluZyB3c2RsSW1wb3J0QmFzZVVSSSA9IGdldEJhc2VVUkkod3NkbEltcG9ydFVSSSk7Ci0gICAgICAgICAgU3RyaW5nQnVmZmVyIGltcG9ydERlc3RVUkkgPSBuZXcgU3RyaW5nQnVmZmVyKGRlc3RVUkkpOwotICAgICAgICAgIGlmICh3c2RsSW1wb3J0QmFzZVVSSSAhPSBudWxsKQotICAgICAgICAgICAgaW1wb3J0RGVzdFVSSS5hcHBlbmQod3NkbEltcG9ydEJhc2VVUkkpOwotICAgICAgICAgIGNvcHlXU0RMKGVudiwgaW1wb3J0QmFzZVVSSSwgaW1wb3J0RGVzdFVSSS50b1N0cmluZygpLCBnZXRMb2NhbG5hbWUod3NkbEltcG9ydFVSSSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3Qgc2NoZW1hcyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNjaGVtYXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1lbnQ7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoc2NoZW1hRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaWdub3JlIGFueSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBpbnRvIGEKLSAgICAgICAgICAgIC8vIFhTRFNjaGVtYSBpbnN0YW5jZQotICAgICAgICAgIH0KLSAgICAgICAgICBjb3B5WE1MU2NoZW1hKGVudiwgeHNkU2NoZW1hLCBiYXNlVVJJLCBkZXN0VVJJKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIHNjaGVtYUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKWV4dEVsZW1lbnQ7Ci0gICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IG51bGw7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoc2NoZW1hRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gaWdub3JlIGFueSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBpbnRvIGEKLSAgICAgICAgICAgIC8vIFhTRFNjaGVtYSBpbnN0YW5jZQotICAgICAgICAgIH0KLSAgICAgICAgICBjb3B5WE1MU2NoZW1hKGVudiwgeHNkU2NoZW1hLCBiYXNlVVJJLCBkZXN0VVJJKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEJhc2VVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIGludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCdcXCcpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRMb2NhbG5hbWUoU3RyaW5nIHVyaSkKLSAgewotICAgIGludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZignLycpOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIGluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCdcXCcpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHVyaTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFkZFRyYWlsaW5nU2VwYXJhdG9yKFN0cmluZyBzKQotICB7Ci0gICAgaWYgKCEocy5lbmRzV2l0aCgiLyIpIHx8IHMuZW5kc1dpdGgoIlxcIikpKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocyk7Ci0gICAgICBzYi5hcHBlbmQoJy8nKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gczsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc1JlbGF0aXZlKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gKHVyaS5pbmRleE9mKCc6JykgPT0gLTEpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlYTUxTY2hlbWEoRW52aXJvbm1lbnQgZW52LCBTdHJpbmcgdXJpLCBTdHJpbmcgZGVzdFVSSSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBVUklFeGNlcHRpb24KLSAgewotICAgIGlmIChpZ25vcmVMaXN0LmNvbnRhaW5zKHVyaSkpCi0gICAgICByZXR1cm47Ci0gICAgaWdub3JlTGlzdC5hZGQodXJpKTsKLSAgICAvLyBsb2FkIGFzIGEgY2FjaGVkIHNjaGVtYQotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYSh1cmkpOwotICAgIC8vIGlmIHNjaGVtYSBpcyBub3QgY2FjaGVkLCBwYXJzZSBpdAotICAgIGlmICh4c2RTY2hlbWEgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RQYXJzZXIgcCA9IG5ldyBYU0RQYXJzZXIoKTsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gTmV0VXRpbHMuZ2V0VVJMSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBwLnBhcnNlKGlzKTsKLSAgICAgICAgeHNkU2NoZW1hID0gcC5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGNvcHkgc2NoZW1hCi0gICAgICBFbGVtZW50IGUgPSB4c2RTY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgRE9NU291cmNlIGRvbVNvdXJjZSA9IG5ldyBET01Tb3VyY2UoZSk7Ci0gICAgICBUcmFuc2Zvcm1lciBzZXJpYWxpemVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi04Iik7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICBPdXRwdXRTdHJlYW0gb3MgPSBlbnYuZ2V0VVJJRmFjdG9yeSgpLm5ld1VSSSgobmV3IFN0cmluZ0J1ZmZlcihkZXN0VVJJKSkuYXBwZW5kKGdldExvY2FsbmFtZSh1cmkpKS50b1N0cmluZygpKS5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgIHNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChvcykpOwotICAgICAgb3MuY2xvc2UoKTsKLSAgICAgIC8vIGNvcHkgPHhzZDppbXBvcnQ+cyBhbmQgPHhzZDppbmNsdWRlPnMKLSAgICAgIGNvcHlYTUxTY2hlbWEoZW52LCB4c2RTY2hlbWEsIGdldEJhc2VVUkkodXJpKSwgZGVzdFVSSSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlYTUxTY2hlbWEoRW52aXJvbm1lbnQgZW52LCBYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgYmFzZVVSSSwgU3RyaW5nIGRlc3RVUkkpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgLy8gY29weSA8eHNkOmltcG9ydD5zIGFuZCA8eHNkOmluY2x1ZGU+cwotICAgICAgRUxpc3QgeHNkU2NoZW1hQ29udGVudHMgPSB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB4c2RTY2hlbWFDb250ZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3QgY29udGVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFEaXJlY3RpdmUgeHNkU2NoZW1hRGlyZWN0aXZlID0gKFhTRFNjaGVtYURpcmVjdGl2ZSljb250ZW50OwotICAgICAgICAgIFN0cmluZyB4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbiA9IHhzZFNjaGVtYURpcmVjdGl2ZS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICAgIGlmICh4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbiAhPSBudWxsICYmIGlzUmVsYXRpdmUoeHNkU2NoZW1hRGlyZWN0aXZlTG9jYXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBkaXJlY3RpdmVVUkkgPSAobmV3IFN0cmluZ0J1ZmZlcihiYXNlVVJJKSkuYXBwZW5kKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uKS50b1N0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIGRpcmVjdGl2ZUJhc2VVUkkgPSBnZXRCYXNlVVJJKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBkaXJlY3RpdmVEZXN0VVJJID0gbmV3IFN0cmluZ0J1ZmZlcihkZXN0VVJJKTsKLSAgICAgICAgICAgIGlmIChkaXJlY3RpdmVCYXNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICAgIGRpcmVjdGl2ZURlc3RVUkkuYXBwZW5kKGRpcmVjdGl2ZUJhc2VVUkkpOwotICAgICAgICAgICAgY29weVhNTFNjaGVtYShlbnYsIGRpcmVjdGl2ZVVSSSwgZGlyZWN0aXZlRGVzdFVSSS50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKQotICB7Ci0gICAgdGhpcy53c2RsVVJJID0gd3NkbFVSSTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlc1BhcnNlciA9IHdlYlNlcnZpY2VzUGFyc2VyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb25VUkkoU3RyaW5nIGRlc3RpbmF0aW9uVVJJKQotICB7Ci0gICAgdGhpcy5kZXN0aW5hdGlvblVSSSA9IGRlc3RpbmF0aW9uVVJJOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIHRoaXMuZGVmID0gZGVmOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTk5OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgYXBwQ2xpZW50UHJvamVjdE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBlYXJQcm9qZWN0TmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsgIAotICAKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUFwcENsaWVudFByb2plY3RDb21tYW5kIiwgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZCIpOwotICAgIC8vc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotCU1lc3NhZ2VVdGlscyBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnBsdWdpbiIsIHRoaXMgKTsKLQkKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgIWVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZUVBUlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgICBjLmV4ZWN1dGUoZW52KTsKLSAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgfQotICAgICAgSVByb2plY3QgYXBwQ2xpZW50UHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChhcHBDbGllbnRQcm9qZWN0TmFtZV8pOwotICAgICAgaWYgKGFwcENsaWVudFByb2plY3QgIT0gbnVsbCAmJiAhYXBwQ2xpZW50UHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgSURhdGFNb2RlbCBpbmZvID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoSUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgYXBwQ2xpZW50UHJvamVjdE5hbWVfKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShJQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSwgZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShJQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgSjJFRSB2ZXJzaW9uCi0gICAgICAgIFN0cmluZyBmaW5hbEoyRUVWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGoyZWVWZXJzaW9uXyAhPSBudWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShJQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbl8pKTsKLSAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gajJlZVZlcnNpb25fOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgZWFyUHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShlYXJQcm9qZWN0KTsKLSAgICAgICAgICAgIGludCBlYXJWZXJzaW9uID0gZWFyLmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KElBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGVhclZlcnNpb24pKTsKLSAgICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihlYXJWZXJzaW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoSUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLSAgICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBzZXJ2ZXIgdGFyZ2V0Ci0gICAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZlckZhY3RvcnlJZF8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotCQkvL1RPRE8gLSBBZGQgdGhpcyBsb2dpYyB0byBGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCwgYW5kIG9wLi4uLgotCQkKLS8vICAgICAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXywgSVNlcnZlclRhcmdldENvbnN0YW50cy5BUFBfQ0xJRU5UX1RZUEUsIGZpbmFsSjJFRVZlcnNpb24pOyAKLS8vCQkgIGluZm8uc2V0UHJvcGVydHkoQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuU0VSVkVSX1RBUkdFVF9JRCwgcnVudGltZVRhcmdldElkICk7Ci0vLyAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9TRVJWRVJfVEFSR0VULCBCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9DcmVhdGUgdGhlIEFwcENsaWVudCBwcm9qZWN0Ci0gICAgICAgIElEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uID0gaW5mby5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0gICAgICAgIG9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGl0ZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9BUFBfQ0xJRU5UX1BST0pFQ1QiLCBuZXcgU3RyaW5nW10ge2FwcENsaWVudFByb2plY3ROYW1lX30pLCBTdGF0dXMuRVJST1IsIGl0ZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFwcENsaWVudFByb2plY3ROYW1lKFN0cmluZyBhcHBDbGllbnRQcm9qZWN0TmFtZSkKLSAgewotICAgIGFwcENsaWVudFByb2plY3ROYW1lXyA9IGFwcENsaWVudFByb2plY3ROYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0TmFtZShTdHJpbmcgZWFyUHJvamVjdE5hbWUpCi0gIHsKLSAgICBlYXJQcm9qZWN0TmFtZV8gPSBlYXJQcm9qZWN0TmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgCXNlcnZlckZhY3RvcnlJZF8gPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAJajJlZVZlcnNpb25fID0gajJlZVZlcnNpb247CQotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1NzBlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIElEX1dFQiA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuY2xpZW50UHJvamVjdFR5cGUuV2ViIjsKLSAgcHJpdmF0ZSBTdHJpbmcgSURfRUpCID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5FSkIiOwotICBwcml2YXRlIFN0cmluZyBJRF9BUFBfQ0xJRU5UID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5BcHBDbGllbnQiOwotICBwcml2YXRlIFN0cmluZyBJRF9KQVZBID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5Db250YWluZXJsZXNzIjsKLQotICBwcml2YXRlIGJvb2xlYW4gcHJveHlDb2RlZ2VuRW5hYmxlZCA9IHRydWU7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3RUeXBlSWQ7Ci0gIHByaXZhdGUgSVByb2plY3QgcHJveHlQcm9qZWN0OwotICBwcml2YXRlIElQcm9qZWN0IHByb3h5UHJvamVjdEVBUjsKLSAgcHJpdmF0ZSBTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZF87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckZhY3RvcnlJZF87Ci0gIHByaXZhdGUgU3RyaW5nIGoyZWVWZXJzaW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRFQVJfOwotICBwcml2YXRlIGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBJU2VydmVyIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlTmFtZV87Ci0gIAotICAvKioKLSAgICogRGVmYXVsdCBDVE9SCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQoIFN0cmluZyBtb2R1bGVOYW1lICkKLSAgewotICAgIHN1cGVyKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kIik7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsgIAotCQotCW1vZHVsZU5hbWVfID0gbW9kdWxlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKXsKLSAgCXJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudil7Ci0gIAlTdGF0dXMgc3RhdCA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIHRyeQl7Ci0gICAgCQotICAgICAgLy8gY2hlY2sgZXhpc3RpbmdTZXJ2ZXIKLSAgICAgIGlmIChmRXhpc3RpbmdTZXJ2ZXIhPW51bGwpIHsKLQkgICAgCQotICAgIAlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAgCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgCXN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGZFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgCWlmIChwcm94eVByb2plY3RFQVIhPW51bGwpIHsKLSAgICAJCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5Qb3N0U2VydmVyQ29uZmlnKGZFeGlzdGluZ1NlcnZlciwgcHJveHlQcm9qZWN0RUFSKTsKLSAgICAJfQotICAgICAgfQotICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApIHsKLSAgICAgIElTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgIHN0YXQgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0KTsKLSAgCQlyZXR1cm4gc3RhdDsKLSAgCX0gIAkKLSAgCQotICAJcmV0dXJuIHN0YXQ7Ci0gIH0gIAotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAJLy9HZXQgdGhlIGV4aXN0aW5nIHNlcnZlcgotCi0gICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsKLSAgICBJU2VydmVyIGV4aXN0aW5nU2VydmVyID0gbnVsbDsKLQlmRXhpc3RpbmdTZXJ2ZXIgPSBudWxsOyAgICAKLSAgICBmb3IgKGludCBpPTA7IGk8c2VydmVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJU2VydmVyIHRoaXNTZXJ2ZXIgPSAoSVNlcnZlcilzZXJ2ZXJzW2ldOwotICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHdjID0gbnVsbDsKLSAgICAgIFN0cmluZyB0aGlzU2VydmVySWQgPSBudWxsOwotICAgICAgaWYgKHRoaXNTZXJ2ZXIhPW51bGwpIHsKLSAgICAgIAl3YyA9IHRoaXNTZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsKLSAgICAgIAl0aGlzU2VydmVySWQgPSAod2MhPW51bGwgPyB3Yy5nZXRJZCgpIDogbnVsbCk7Ci0gICAgICB9Ci0gICAgICBpZiAodGhpc1NlcnZlcklkLmVxdWFscyhleGlzdGluZ1NlcnZlcklkXykpewotICAgICAgICBleGlzdGluZ1NlcnZlciA9IHRoaXNTZXJ2ZXI7Ci0gICAgICAgIGZFeGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotICAgICAgfQotICAgIH0gCi0gICAgCi0gICAgLy9DcmVhdGUgdGhlIHByb2plY3QKLSAgICBpZiAocHJveHlDb2RlZ2VuRW5hYmxlZCkKLSAgICB7Ci0gICAgICBpZiAoY2xpZW50UHJvamVjdFR5cGVJZCA9PSBudWxsIHx8IGNsaWVudFByb2plY3RUeXBlSWQubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgY2xpZW50UHJvamVjdFR5cGVJZCA9IChXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpLmdldENsaWVudFR5cGVzKCkpWzBdOwotICAgICAgaWYgKElEX1dFQi5lcXVhbHMoY2xpZW50UHJvamVjdFR5cGVJZCkpCi0gICAgICB7ICAKLSAgICAgICAgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgICBjLnNldFByb2plY3ROYW1lKHByb3h5UHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKHByb3h5UHJvamVjdEVBUiAhPSBudWxsKQotICAgICAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUocHJveHlQcm9qZWN0RUFSLmdldE5hbWUoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjLnNldEVhclByb2plY3ROYW1lKCIiKTsKLSAgICAgICAgCi0gICAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7ICAgICAgICAgICAgCi0gICAgICAgIGMuc2V0RXhpc3RpbmdTZXJ2ZXIoZXhpc3RpbmdTZXJ2ZXIpOwotICAgICAgICBjLnNldE5lZWRFQVIobmVlZEVBUl8pOwotICAgICAgICBjLnNldEFkZGVkUHJvamVjdFRvU2VydmVyKGFkZGVkUHJvamVjdFRvU2VydmVyXyk7Ci0gICAgICAgIAotICAgICAgICBzdGF0dXMgPSBjLmV4ZWN1dGUoZW52KTsKLSAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpewotICAgICAgCXJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFN0YXR1cyBzdGFydFNlcnZlclN0YXR1cyA9IHN0YXJ0U2VydmVyKGVudiwgcHJveHlQcm9qZWN0KTsKLSAgICAgIGlmIChzdGFydFNlcnZlclN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAJcmV0dXJuIHN0YXJ0U2VydmVyU3RhdHVzOwotICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKElEX0VKQi5lcXVhbHMoY2xpZW50UHJvamVjdFR5cGVJZCkpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZUVKQlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRFamJQcm9qZWN0TmFtZShwcm94eVByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZShwcm94eVByb2plY3RFQVIuZ2V0TmFtZSgpKTsKLSAgICAgICAgYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyk7Ci0gICAgICAgIGMuc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb25fKTsKLSAgICAgICAgc3RhdHVzID0gYy5leGVjdXRlKGVudik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChJRF9BUFBfQ0xJRU5ULmVxdWFscyhjbGllbnRQcm9qZWN0VHlwZUlkKSkKLSAgICAgIHsKLSAgICAgICAgQ3JlYXRlQXBwQ2xpZW50UHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVBcHBDbGllbnRQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgICBjLnNldEFwcENsaWVudFByb2plY3ROYW1lKHByb3h5UHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBjLnNldEVhclByb2plY3ROYW1lKHByb3h5UHJvamVjdEVBUi5nZXROYW1lKCkpOwotICAgICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgICBzdGF0dXMgPSBjLmV4ZWN1dGUoZW52KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKElEX0pBVkEuZXF1YWxzKGNsaWVudFByb2plY3RUeXBlSWQpKQotICAgICAgewotICAgICAgICBDcmVhdGVKYXZhUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVKYXZhUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRQcm9qZWN0TmFtZShwcm94eVByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3RhdHVzID0gYy5leGVjdXRlKGVudik7Ci0gICAgICB9Ci0gICAgICAgICAKLSAgICB9Ci0KLSAgICB0cnkJewotICAgIAkKLSAgIAkJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgCQlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kID0gKEFic3RyYWN0U3RhcnRTZXJ2ZXIpcmVnLmdldFNlcnZlclN0YXJ0QnlUeXBlSWQoZXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgICAJaWYgKHByb3h5UHJvamVjdEVBUiE9bnVsbCAmJiBleGlzdGluZ1NlcnZlciE9bnVsbCkgewotICAgICAJCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5QcmVTZXJ2ZXJDb25maWcoZXhpc3RpbmdTZXJ2ZXIsIHByb3h5UHJvamVjdEVBUik7Ci0gICAgIAkJZkV4aXN0aW5nU2VydmVyID0gZXhpc3RpbmdTZXJ2ZXI7Ci0gICAgIAl9Ci0gICAJfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlICkgewotICAgIAlJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgCXN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgCQlyZXR1cm4gc3RhdHVzOwotICAJfQotICAJCi0gIAlyZXR1cm4gc3RhdHVzOyAgIAotICAgIAotICB9Ci0gIAotICBwcml2YXRlIFN0YXR1cyBzdGFydFNlcnZlcihFbnZpcm9ubWVudCBlbnYsIElQcm9qZWN0IHdlYlByb2plY3QpewotICAJdHJ5ewotICAJICAgIC8vIHN0YXJ0IHNlcnZlcihCdWcgNDM3NykKLSAgCSAgICBpZiAobmVlZEVBUl8gJiYgIGZFeGlzdGluZ1NlcnZlciAhPSBudWxsKXsKLSAgCSAgICAJU3RhcnRQcm9qZWN0Q29tbWFuZCBzcGMgPSBuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZCggbW9kdWxlTmFtZV8gKTsKLSAgCSAgICAJc3BjLnNldFNhbXBsZVByb2plY3Qod2ViUHJvamVjdCk7Ci0gIAkgICAgCXNwYy5zZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihmRXhpc3RpbmdTZXJ2ZXIpOwotICAJICAgIAlzcGMuc2V0Q3JlYXRpb25TY2VuYXJpbyhuZXcgQm9vbGVhbigiZmFsc2UiKSk7Ci0gIAkgICAgCXJldHVybiBzcGMuZXhlY3V0ZShlbnYpOwkgICAgCQotICAJICAgIAkKLSAgCSAgICB9ICAJCQotICAJfQotICAJY2F0Y2goRXhjZXB0aW9uIGNlKXsKLSAgICAgICAgZW52LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwNDYsIHRoaXMsICJleGVjdXRlIiwgY2UpOwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgY2UpOwotICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CQkKLSAgCX0KLSAgCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfSAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlDb2RlZ2VuRW5hYmxlZChib29sZWFuIHByb3h5Q29kZWdlbkVuYWJsZWQpCi0gIHsKLSAgICB0aGlzLnByb3h5Q29kZWdlbkVuYWJsZWQgPSBwcm94eUNvZGVnZW5FbmFibGVkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBwcm94eVByb2plY3RFQVIgVGhlIHByb3h5UHJvamVjdEVBUiB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eVByb2plY3RFQVIoSVByb2plY3QgcHJveHlQcm9qZWN0RUFSKQotICB7Ci0gICAgdGhpcy5wcm94eVByb2plY3RFQVIgPSBwcm94eVByb2plY3RFQVI7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHByb3h5UHJvamVjdCBUaGUgcHJveHlQcm9qZWN0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5UHJvamVjdChJUHJvamVjdCBwcm94eVByb2plY3QpCi0gIHsKLSAgICB0aGlzLnByb3h5UHJvamVjdCA9IHByb3h5UHJvamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gY2xpZW50UHJvamVjdFR5cGVJZCBUaGUgY2xpZW50UHJvamVjdFR5cGVJZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRQcm9qZWN0VHlwZUlkKFN0cmluZyBjbGllbnRQcm9qZWN0VHlwZUlkKQotICB7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0VHlwZUlkID0gY2xpZW50UHJvamVjdFR5cGVJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyRmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0gIHsKLSAgCXNlcnZlckZhY3RvcnlJZF8gPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uKFN0cmluZyBqMmVlVmVyc2lvbikKLSAgewotICAJajJlZVZlcnNpb25fID0gajJlZVZlcnNpb247CQotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5lZWRFQVIoYm9vbGVhbiBuZWVkRUFSKQotICB7Ci0gICAgbmVlZEVBUl8gPSBuZWVkRUFSOwotICB9ICAgIAotICAKLSAgcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXJJZChTdHJpbmcgZXhpc3RpbmdTZXJ2ZXJJZCkKLSAgewotICAgIGV4aXN0aW5nU2VydmVySWRfID0gZXhpc3RpbmdTZXJ2ZXJJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0QWRkZWRQcm9qZWN0VG9TZXJ2ZXIoYm9vbGVhbiBhZGRlZFByb2plY3RUb1NlcnZlcikgCi0gIHsKLSAgICBhZGRlZFByb2plY3RUb1NlcnZlcl8gPSBhZGRlZFByb2plY3RUb1NlcnZlcjsKLSAgfSAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFQVJQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFQVJQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTBkOGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOyAgCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQiKTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLQlNZXNzYWdlVXRpbHMgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi5wbHVnaW4iLCB0aGlzICk7Ci0JCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgSURhdGFNb2RlbCBpbmZvID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoSUVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBKMkVFIHZlcnNpb24KLSAgICAgICAgU3RyaW5nIGZpbmFsSjJFRVZlcnNpb24gPSBudWxsOwotICAgICAgICBpZiAoajJlZVZlcnNpb25fICE9IG51bGwgJiYgajJlZVZlcnNpb25fLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KElFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uXykpOwotICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBqMmVlVmVyc2lvbl87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShJRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vU2V0IHRoZSBzZXJ2ZXIgdGFyZ2V0Ci0gICAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZlckZhY3RvcnlJZF8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotLy8JCQlUT0RPIC0gQWRkIHRoaXMgbG9naWMgdG8gRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwsIGFuZCBvcC4uLi4KLS8vICAgICAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXywgSVNlcnZlclRhcmdldENvbnN0YW50cy5FQVJfVFlQRSwgZmluYWxKMkVFVmVyc2lvbik7IAotLy8gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5TRVJWRVJfVEFSR0VUX0lELCBydW50aW1lVGFyZ2V0SWQgKTsKLS8vICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1NFUlZFUl9UQVJHRVQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0NyZWF0ZSB0aGUgRUFSCi0gICAgICAgIElEYXRhTW9kZWxPcGVyYXRpb24gb3BlcmF0aW9uID0gaW5mby5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0gICAgICAgIG9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGl0ZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FQVJfUFJPSkVDVCIsIG5ldyBTdHJpbmdbXSB7ZWFyUHJvamVjdE5hbWVffSksIFN0YXR1cy5FUlJPUiwgaXRlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGVhclByb2plY3ROYW1lXyBUaGUgZWFyUHJvamVjdE5hbWVfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3ROYW1lKFN0cmluZyBlYXJQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuZWFyUHJvamVjdE5hbWVfID0gZWFyUHJvamVjdE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJc2VydmVyRmFjdG9yeUlkXyA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gIAlqMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsJCi0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFSkJQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVFSkJQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDI5ODcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5kYXRhbW9kZWwucHJvcGVydGllcy5JRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLmFyY2hpdmVvcGVyYXRpb25zLkVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVFSkJQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExBQkVMID0gIiVUQVNLX0xBQkVMX0NSRUFURV9FSkJfUFJPSkVDVCI7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICIlVEFTS19ERVNDX0NSRUFURV9FSkJfUFJPSkVDVCI7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0VKQlByb2plY3RSZXF1aXJlZF8gPSB0cnVlOwotICBwcml2YXRlIFN0cmluZyBlamJQcm9qZWN0TmFtZV8gPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBlYXJQcm9qZWN0TmFtZV8gPSBudWxsOwotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOyAgCi0gIAotIAotICBwdWJsaWMgQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoTEFCRUwsIERFU0NSSVBUSU9OKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQ3JlYXRlRUpCUHJvamVjdFRhc2suCi0gICAqIEBwYXJhbSBhcmcwCi0gICAqIEBwYXJhbSBhcmcxCi0gICAqLwotICBwdWJsaWMgQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYykKLSAgewotICAgIHN1cGVyKGxhYmVsLCBkZXNjKTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgIHRyeQotICAgewotICAgIGlmIChlamJQcm9qZWN0TmFtZV8gIT0gbnVsbCAmJiBlamJQcm9qZWN0TmFtZV8ubGVuZ3RoKCkgPiAwICYmIGVhclByb2plY3ROYW1lXyAhPSBudWxsICYmIGVhclByb2plY3ROYW1lXy5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZUVKQlByb2plY3QoZWpiUHJvamVjdE5hbWVfLCBlYXJQcm9qZWN0TmFtZV8sIGVudik7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKSAKLSAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIAotICAgIH0KLQotICAgIC8vIEdldCB3ZWIgcHJvamVjdCBhbmQgZm9ybSBlamJQcm9qZWN0TmFtZQotICAgIGlmICghaXNFSkJQcm9qZWN0UmVxdWlyZWRfKQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIAotICAgIGlmIChlamJQcm9qZWN0TmFtZV8gPT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAKLSAgICAvLyBFSkIgUHJvamVjdCBhbHJlYWR5IGV4aXN0cwotICAgIElDb250YWluZXIgY29udGFpbmVyID0gSjJFRVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChlamJQcm9qZWN0TmFtZV8pOwotICAgIGlmIChjb250YWluZXIuZXhpc3RzKCkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSBFSkJQcm9qZWN0SW5mbwotICAgIElEYXRhTW9kZWwgcHJvamVjdEluZm8gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgZWpiUHJvamVjdE5hbWVfICk7Ci0gICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9TRVNTSU9OX0JFQU4sQm9vbGVhbi5UUlVFKTsKLQotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgaWYgKGVhclByb2plY3ROYW1lXyAhPSBudWxsKQotICAgICAgc3RhdHVzID0gYWRkRUFSVG9Qcm9qZWN0KGVhclByb2plY3ROYW1lXywgcHJvamVjdEluZm8pOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBhZGRFQVJUb1Byb2plY3Qoc2VydmljZVByb2plY3QsIHByb2plY3RJbmZvLCBlbnYpOwotICAgIH0KLSAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gICB9Ci0gICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgIH0KLSAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIGFkZEVBUlRvUHJvamVjdChTdHJpbmcgZWFyUHJvamVjdE5hbWUsIElEYXRhTW9kZWwgcHJvamVjdEluZm8pCi0gIHsKLSAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAvLyBJUHJvamVjdCBlYXJQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAvLyBpZiAoIWVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgeyAgICAJCi0gICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IG51bGw7Ci0gICAgICBpZiAoajJlZVZlcnNpb25fIT1udWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgICAgewotICAgICAgCWVhciA9IEoyRUVVdGlscy5nZXRFQVIoSW50ZWdlci5wYXJzZUludChqMmVlVmVyc2lvbl8pKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWFyID0gSjJFRVV0aWxzLmdldDEzRUFSKCk7ICAgICAgCi0gICAgICAgIGlmIChlYXIgIT0gbnVsbCkKLSAgICAgICAgICBlYXJQcm9qZWN0ID0gZWFyLmdldFByb2plY3QoKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZWFyID0gSjJFRVV0aWxzLmdldDEyRUFSKCk7Ci0gICAgICAgICAgaWYgKGVhciAhPSBudWxsKQotICAgICAgICAgICAgZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSwgZWFyUHJvamVjdC5nZXROYW1lKCkpOwotICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgQm9vbGVhbi5UUlVFKTsKLSAgICAKLSAgICAvL1NldCB0aGUgSjJFRSB2ZXJzaW9uCi0gICAgU3RyaW5nIGZpbmFsSjJFRVZlcnNpb24gPSBudWxsOyAgICAKLSAgICBpZiAoajJlZVZlcnNpb25fICE9IG51bGwgJiYgajJlZVZlcnNpb25fLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgbmV3IEludGVnZXIoajJlZVZlcnNpb25fKSk7Ci0gICAgICBmaW5hbEoyRUVWZXJzaW9uID0gajJlZVZlcnNpb25fOwotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgZWFyUHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgRUFSTmF0dXJlUnVudGltZSBlYXIgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUoZWFyUHJvamVjdCk7Ci0gICAgICAgIGludCBlYXJWZXJzaW9uID0gZWFyLmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGVhclZlcnNpb24pKTsKLSAgICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKGVhclZlcnNpb24pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgfSAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0gICAgewotCQkvLwkJVE9ETyAtIEFkZCB0aGlzIGxvZ2ljIHRvIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLCBhbmQgb3AuLi4uCi0vLyAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXywgSVNlcnZlclRhcmdldENvbnN0YW50cy5FSkJfVFlQRSwgajJlZVZlcnNpb25fKTsgCi0vLyAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlNFUlZFUl9UQVJHRVRfSUQsIHJ1bnRpbWVUYXJnZXRJZCApOwotLy8gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfU0VSVkVSX1RBUkdFVCwgQm9vbGVhbi5UUlVFKTsKLSAgICB9Ci0KLSAgICBJRGF0YU1vZGVsT3BlcmF0aW9uIGVqYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiA9IHByb2plY3RJbmZvLmdldERlZmF1bHRPcGVyYXRpb24oKTsgICAgCQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgZWpiUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FSkJfUFJPSkVDVCIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwcml2YXRlIFN0YXR1cyBhZGRFQVJUb1Byb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QsIElEYXRhTW9kZWwgcHJvamVjdEluZm8sIEVudmlyb25tZW50IGVudikKLSAgewotICAgICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IG51bGw7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgICAgICBib29sZWFuIGFkZFNlcnZpY2VFQVJUb1NlcnZlciA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGFkZERpc2NvdmVyZWRFQVJUb1NlcnZlciA9IGZhbHNlOwotICAgICAgICBJU2VydmVyIGRpc2NvdmVyZWRFQVJzU2VydmVyID0gbnVsbDsKLSAgICAgICAgRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBKMkVFVXRpbHMuZ2V0RUFSUHJvamVjdHMoc2VydmljZVByb2plY3QpOwotICAgICAgICB0cnkgeyAgICAJCi0gICAgICAKLQkgICAgaWYgKGVhcnMhPW51bGwgJiYgZWFycy5sZW5ndGggPj0gMSkgewotCSAgICAgIGVhciA9IGVhcnNbMF07ICAgICAgCi0gICAgICAgICAgICAgZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlciAhPSBudWxsKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0gICAgICAgICAgICAgICAgIHNlcnZpY2VFeGlzdGluZ1NlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOyAgICAgCi0gICAgICAgICAgICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAgICAgICAgCXJldHVybiBtbVN0YXR1czsKLSAgICAgICAgICAgICAgIGFkZFNlcnZpY2VFQVJUb1NlcnZlciA9IHRydWU7Ci0gICAgICAgICAgICAgfQotCi0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgLy9DaGVjayB0byBzZWUgaWYgYW55IGVsaWdpYmxlIEVBUnMgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgICAgICBlYXIgPSBKMkVFVXRpbHMuZ2V0MTJFQVIoKTsKLQkgICAgICBpZiAoZWFyIT1udWxsKQotCSAgICAgIHsKLQkgICAgICAJZWFyUHJvamVjdCA9IGVhci5nZXRQcm9qZWN0KCk7Ci0KLQkgICAgICAJLy8gQWRkIGRlZmF1bHQgc2VydmVyCi0gICAgICAgICAgICAgIElTZXJ2ZXIgZGVmYXVsdFNlcnZlciA9IFNlcnZlclV0aWxzLmdldERlZmF1bHRFeGlzdGluZ1NlcnZlcihlYXJQcm9qZWN0KTsgICAgCi0gICAgICAgICAgICAgIGlmIChkZWZhdWx0U2VydmVyIT1udWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIAlpZiAoZGVmYXVsdFNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAgICAgICAgIAkgZGVmYXVsdFNlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgCSB9Ci0gICAgICAgICAgICAgIAlTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBkZWZhdWx0U2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgICAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAgICAgICAgIAkKLQkJCWFkZERpc2NvdmVyZWRFQVJUb1NlcnZlciA9IHRydWU7Ci0JCQlkaXNjb3ZlcmVkRUFSc1NlcnZlciA9IGRlZmF1bHRTZXJ2ZXI7CQkJCi0gICAgICAgICAgICAgICB9Ci0JICAgICAgIH0KLQkgICAgfQotCSAgICAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUpCX1BST0pFQ1QiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgICAgfQotCSAgICAgIAotICAgICAgSVByb2plY3QgZWpiUHJvamVjdCA9IG51bGw7Ci0gICAgICAvL0FkZCB0aGUgcHJvamVjdCBiYWNrIHRvIHRoZSBTZXJ2ZXIgY29uZmlnCi0gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSwgZWFyUHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBCb29sZWFuLlRSVUUpOwkKLSAgICAgIElEYXRhTW9kZWxPcGVyYXRpb24gZWpiUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uID0gcHJvamVjdEluZm8uZ2V0RGVmYXVsdE9wZXJhdGlvbigpOyAgICAJCi0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGVqYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0NBTk5PVF9DUkVBVEVfRUpCX1BST0pFQ1QiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIH0KLSAgICAgIC8vZWpiUHJvamVjdCA9IHByb2plY3RJbmZvLnByaW1HZXRQcm9qZWN0KCk7Ci0KLSAgICAgIC8vQWRkIHRoZSBwcm9qZWN0IGJhY2sgdG8gdGhlIFNlcnZlciBjb25maWcKLSAgICAgIGlmIChhZGRTZXJ2aWNlRUFSVG9TZXJ2ZXIpCi0gICAgICB7Ci0gICAgICAJU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmljZUV4aXN0aW5nU2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAKLSAgICAgIH0KLSAgICAgIGlmIChhZGREaXNjb3ZlcmVkRUFSVG9TZXJ2ZXIpCi0gICAgICB7Ci0gICAgICAJU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZGlzY292ZXJlZEVBUnNTZXJ2ZXIsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAgCXJldHVybiBtbVN0YXR1czsgIAotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgY3JlYXRlRUpCUHJvamVjdChTdHJpbmcgZWpiUHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0TmFtZSwgRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgIWVhclByb2plY3QuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIENyZWF0ZUVBUlByb2plY3RDb21tYW5kIGMgPSBuZXcgQ3JlYXRlRUFSUHJvamVjdENvbW1hbmQoKTsKLSAgICAgICAgYy5zZXRFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZSk7Ci0gICAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICAgIGMuZXhlY3V0ZShlbnYpOwotICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAgIH0KLSAgICAgIElQcm9qZWN0IGVqYlByb2plY3QgPSByb290LmdldFByb2plY3QoZWpiUHJvamVjdE5hbWUpOwotICAgICAgaWYgKGVqYlByb2plY3QgIT0gbnVsbCAmJiAhZWpiUHJvamVjdC5leGlzdHMoKSkKLSAgICAgIHsKLSAgICAgICAgSURhdGFNb2RlbCBpbmZvID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGVqYlByb2plY3ROYW1lKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShJRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSwgZWFyUHJvamVjdE5hbWUpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KElFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgCi0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9TRVNTSU9OX0JFQU4sQm9vbGVhbi5UUlVFKTsgICAgICAgIAotICAgICAgICAKLSAgICAgICAgLy9TZXQgdGhlIEoyRUUgdmVyc2lvbgotICAgICAgICBTdHJpbmcgZmluYWxKMkVFVmVyc2lvbiA9IG51bGw7Ci0gICAgICAgIGlmIChqMmVlVmVyc2lvbl8gIT0gbnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgbmV3IEludGVnZXIoajJlZVZlcnNpb25fKSk7Ci0gICAgICAgICAgZmluYWxKMkVFVmVyc2lvbiA9IGoyZWVWZXJzaW9uXzsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgZWFyUHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFQVJOYXR1cmVSdW50aW1lIGVhciA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShlYXJQcm9qZWN0KTsKLSAgICAgICAgICAgIGludCBlYXJWZXJzaW9uID0gZWFyLmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KElFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGVhclZlcnNpb24pKTsKLSAgICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihlYXJWZXJzaW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLSAgICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvL1NldCB0aGUgc2VydmVyIHRhcmdldAotICAgICAgICBpZiAoc2VydmVyRmFjdG9yeUlkXyE9bnVsbCAmJiBzZXJ2ZXJGYWN0b3J5SWRfLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLS8vCQkJVE9ETyAtIEFkZCB0aGlzIGxvZ2ljIHRvIEZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLCBhbmQgb3AuLi4uCi0vLyAgICAgICAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8sSVNlcnZlclRhcmdldENvbnN0YW50cy5FSkJfVFlQRSwgZmluYWxKMkVFVmVyc2lvbik7IAotLy8gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5TRVJWRVJfVEFSR0VUX0lELCBydW50aW1lVGFyZ2V0SWQgKTsKLS8vICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1NFUlZFUl9UQVJHRVQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0NyZWF0ZSB0aGUgRUpCIFByb2plY3QKLSAgICAgICAgSURhdGFNb2RlbE9wZXJhdGlvbiBvcGVyYXRpb24gPSBpbmZvLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLSAgICAgICAgb3BlcmF0aW9uLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIGFkZCBFQVIgdG8gU2VydmVyCi0gICAgICBpZiAoc2VydmljZUV4aXN0aW5nU2VydmVyIT1udWxsKXsKLSAgICAgICAgYm9vbGVhbiBlYXJBZGRlZFRvU2VydmVyID0gU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIsUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFlYXJBZGRlZFRvU2VydmVyKSB7Ci0gICAgICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmljZUV4aXN0aW5nU2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAgCi0gICAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gaXRlKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9FSkJfUFJPSkVDVCIpLCBTdGF0dXMuRVJST1IsIGl0ZSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBlYXJQcm9qZWN0TmFtZSBUaGUgZWFyUHJvamVjdE5hbWUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdE5hbWUoU3RyaW5nIGVhclByb2plY3ROYW1lKQotICB7Ci0gICAgdGhpcy5lYXJQcm9qZWN0TmFtZV8gPSBlYXJQcm9qZWN0TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gZWpiUHJvamVjdE5hbWUgVGhlIGVqYlByb2plY3ROYW1lIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVqYlByb2plY3ROYW1lKFN0cmluZyBlamJQcm9qZWN0TmFtZSkKLSAgewotICAgIHRoaXMuZWpiUHJvamVjdE5hbWVfID0gZWpiUHJvamVjdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGlzRUpCUHJvamVjdFJlcXVpcmVkIFRoZSBpc0VKQlByb2plY3RSZXF1aXJlZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFSkJQcm9qZWN0UmVxdWlyZWQoYm9vbGVhbiBpc0VKQlByb2plY3RSZXF1aXJlZCkKLSAgewotICAgIHRoaXMuaXNFSkJQcm9qZWN0UmVxdWlyZWRfID0gaXNFSkJQcm9qZWN0UmVxdWlyZWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGVqYlByb2plY3ROYW1lIFRoZSBlamJQcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFSkJQcm9qZWN0TmFtZShTdHJpbmcgZWpiUHJvamVjdE5hbWUpIHsKLSAgICB0aGlzLmVqYlByb2plY3ROYW1lXyA9IGVqYlByb2plY3ROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgVGhlIHNlcnZpY2VFeGlzdGluZ1NlcnZlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIpIHsKLSAgICB0aGlzLnNlcnZpY2VFeGlzdGluZ1NlcnZlciA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gc2VydmljZVByb2plY3QgVGhlIHNlcnZpY2VQcm9qZWN0IHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KSB7Ci0gICAgdGhpcy5zZXJ2aWNlUHJvamVjdCA9IHNlcnZpY2VQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJc2VydmVyRmFjdG9yeUlkXyA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gIAlqMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsJCi0gIH0gIAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVKYXZhUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2ZDMwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotcHVibGljIGNsYXNzIENyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWVfOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVKYXZhUHJvamVjdENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVKYXZhUHJvamVjdENvbW1hbmQiLCAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZUphdmFQcm9qZWN0Q29tbWFuZCIpOwotICAgIC8vc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWVfKTsKLSAgICBpZiAocHJvamVjdCAhPSBudWxsICYmICFwcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBOdWxsUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICBwcm9qZWN0LmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkubmV3UHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QuZ2V0TmFtZSgpKSwgbW9uaXRvcik7Ci0gICAgICAgIHByb2plY3Qub3Blbihtb25pdG9yKTsKLSAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBkZXNjLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nW10ge0phdmFDb3JlLk5BVFVSRV9JRH0pOwotICAgICAgICBJQ29tbWFuZCBjbWQgPSBkZXNjLm5ld0NvbW1hbmQoKTsKLSAgICAgICAgY21kLnNldEJ1aWxkZXJOYW1lKEphdmFDb3JlLkJVSUxERVJfSUQpOwotICAgICAgICBkZXNjLnNldEJ1aWxkU3BlYyhuZXcgSUNvbW1hbmRbXSB7Y21kfSk7Ci0gICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzYywgbW9uaXRvcik7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICAgICAgUGF0aCBwcm9qZWN0Um9vdCA9IG5ldyBQYXRoKFBhdGguUk9PVC5hcHBlbmQobmV3IFBhdGgocHJvamVjdC5nZXROYW1lKCkpKS50b1N0cmluZygpKTsKLSAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7SmF2YUNvcmUubmV3U291cmNlRW50cnkocHJvamVjdFJvb3QpLCBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKSl9LCBtb25pdG9yKTsKLSAgICAgICAgamF2YVByb2plY3Quc2V0T3V0cHV0TG9jYXRpb24ocHJvamVjdFJvb3QsIG1vbml0b3IpOwotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfQ0FOTk9UX0NSRUFURV9KQVZBX1BST0pFQ1QiLCBuZXcgU3RyaW5nW10ge3Byb2plY3ROYW1lX30pLCBTdGF0dXMuRVJST1IsIGNlKTsKLSAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkKLSAgewotICAgIHByb2plY3ROYW1lXyA9IHByb2plY3ROYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vZHVsZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlTW9kdWxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBjODVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlTW9kdWxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklFamJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuYXJjaGl2ZW9wZXJhdGlvbnMuRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENyZWF0ZU1vZHVsZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0VCID0gSjJFRVV0aWxzLldFQjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFSkIgPSBKMkVFVXRpbHMuRUpCOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFQUENMSUVOVCA9IEoyRUVVdGlscy5BUFBDTElFTlQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRUFSID0gSjJFRVV0aWxzLkVBUjsKLQkKLQlwcml2YXRlIFN0cmluZyAgIHByb2plY3ROYW1lOwotCXByaXZhdGUgU3RyaW5nICAgbW9kdWxlTmFtZTsKLQlwcml2YXRlIGludCAgICAgIG1vZHVsZVR5cGU7OwotCXByaXZhdGUgU3RyaW5nICAgajJlZUxldmVsOwotCXByaXZhdGUgU3RyaW5nICAgc2VydmVyRmFjdG9yeUlkOwotCXByaXZhdGUgRW52aXJvbm1lbnQgZW52OwotCQotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotCQotCXB1YmxpYyBDcmVhdGVNb2R1bGVDb21tYW5kKCl7Ci0JCW1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCXsKLQkJdGhpcy5lbnYgPSBlbnY7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJCi0JCS8vIGNoZWNrIGlmIGRhdGEgcmVhZHkKLQkJc3RhdHVzID0gY2hlY2tEYXRhUmVhZHkoKTsKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQkKLQkJCi0JCS8vIGNoZWNrIGlmIGZsZXhpYmxlIHByb2plY3QgZXhpc3RzCi0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAocHJvamVjdD09bnVsbCB8fCAhcHJvamVjdC5leGlzdHMoKSl7Ci0JCQlzdGF0dXMgPSBjcmVhdGVGbGV4aWJsZUphdmFQcm9qZWN0KCk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUil7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0JCQkKLQkJfQotCi0JCS8vIGNoZWNrIGlmIGNvbXBvbmVudCBleGlzdHMKLQkJaWYgKHByb2plY3ROYW1lIT1udWxsICYmIG1vZHVsZU5hbWUhPW51bGwpewotCQkJaWYgKEoyRUVVdGlscy5leGlzdHMocHJvamVjdE5hbWUsIG1vZHVsZU5hbWUpKQotCQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ09NUE9ORU5UX0NSRUFUSU9OIiwgbmV3IFN0cmluZ1tde3Byb2plY3ROYW1lLCBtb2R1bGVOYW1lfSksU3RhdHVzLkVSUk9SLCBudWxsKTsKLQkJfQotCQkKLQkJLy8gY3JlYXRlIHRoZSBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZSBjb21wb25lbnQgdHlwZSBzcGVjaWZpZWQKLQkJaW50IHR5cGUgPSBnZXRNb2R1bGVUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIFdFQjoKLQkJCXN0YXR1cyA9IGNyZWF0ZVdlYkNvbXBvbmVudCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRUpCOgotCQkJc3RhdHVzID0gY3JlYXRlRUpCQ29tcG9uZW50KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBBUFBDTElFTlQ6Ci0JCQlzdGF0dXMgPSBjcmVhdGVBcHBDbGllbnRDb21wb25lbnQoKTsKLQkJCWJyZWFrOwotCQljYXNlIEVBUjoKLQkJCXN0YXR1cyA9IGNyZWF0ZUVBUkNvbXBvbmVudCgpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCS8vIGRldGVybWluZSBhbiBlcnJvciBzdGF0dXMgbWVzc2FnZT8KLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBTdGF0dXMgY2hlY2tEYXRhUmVhZHkoKXsKLQkJCi0JCWlmIChwcm9qZWN0TmFtZT09bnVsbCB8fCBtb2R1bGVOYW1lPT1udWxsIHx8Ci0JCQkJc2VydmVyRmFjdG9yeUlkPT1udWxsKXsKLQkJCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DT01QT05FTlRfQ1JFQVRJT04iLCBuZXcgU3RyaW5nW117cHJvamVjdE5hbWUsIG1vZHVsZU5hbWV9KSxTdGF0dXMuRVJST1IsbnVsbCk7Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlIGEgV2ViIGNvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RhdHVzIGNyZWF0ZVdlYkNvbXBvbmVudCgpewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCXRyeQotCQl7Ci0JCSAgSURhdGFNb2RlbCBwcm9qZWN0SW5mbyA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLHByb2plY3ROYW1lKTsKLQkJICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBtb2R1bGVOYW1lKTsKLQkJICBpZiAoajJlZUxldmVsIT1udWxsKQotCQkJICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBJbnRlZ2VyLnZhbHVlT2YoajJlZUxldmVsKSk7Ci0JCSAgSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IHByb2plY3RJbmZvLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJICBpZiAoZW52IT1udWxsKQotCQkJICBvcC5leGVjdXRlKEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpLCBudWxsKTsKLQkJICBlbHNlIAotCQkJICBvcC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixlLmdldE1lc3NhZ2UoKSxTdGF0dXMuRVJST1IsZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsJCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYW4gRUFSIGNvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RhdHVzIGNyZWF0ZUVBUkNvbXBvbmVudCgpewotCQlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCXRyeQotCQl7Ci0JCSAgSURhdGFNb2RlbCBwcm9qZWN0SW5mbyA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLHByb2plY3ROYW1lKTsKLQkJICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBtb2R1bGVOYW1lKTsKLQkJICBpZiAoajJlZUxldmVsIT1udWxsKQotCQkJICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJRWFyQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBJbnRlZ2VyLnZhbHVlT2YoajJlZUxldmVsKSk7Ci0JCSAgSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9cHJvamVjdEluZm8uZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQkgIGlmIChlbnYhPW51bGwpCi0JCQkgIG9wLmV4ZWN1dGUoRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudiksIG51bGwpOwotCQkgIGVsc2UgCi0JCQkgIG9wLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLGUuZ2V0TWVzc2FnZSgpLFN0YXR1cy5FUlJPUixlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwkJCQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIEVKQiBDb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0YXR1cyBjcmVhdGVFSkJDb21wb25lbnQoKXsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQl0cnkKLQkJewotCQkgIElEYXRhTW9kZWwgcHJvamVjdEluZm8gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJRWpiQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSxwcm9qZWN0TmFtZSk7Ci0JCSAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgbW9kdWxlTmFtZSk7Ci0JCSAgaWYgKGoyZWVMZXZlbCE9bnVsbCkKLQkJCSAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgSW50ZWdlci52YWx1ZU9mKGoyZWVMZXZlbCkpOwotCQkgIElEYXRhTW9kZWxPcGVyYXRpb24gb3AgPSBwcm9qZWN0SW5mby5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JCSAgaWYgKGVudiE9bnVsbCkKLQkJCSAgb3AuZXhlY3V0ZShFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSwgbnVsbCk7Ci0JCSAgZWxzZSAKLQkJCSAgb3AuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NSRUFURV9FSkJfQ09NUE9ORU5UIiwgbmV3IFN0cmluZ1tde3Byb2plY3ROYW1lfSksU3RhdHVzLkVSUk9SLGUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7CQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIEFwcGxpY2F0aW9uIENsaWVudCBjb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0YXR1cyBjcmVhdGVBcHBDbGllbnRDb21wb25lbnQoKXsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQl0cnkKLQkJewotCQkgIElEYXRhTW9kZWwgcHJvamVjdEluZm8gPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSxwcm9qZWN0TmFtZSk7Ci0JCSAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgbW9kdWxlTmFtZSk7Ci0JCSAgaWYgKGoyZWVMZXZlbCE9bnVsbCkJCSAgCi0JCQkgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04sIEludGVnZXIudmFsdWVPZihqMmVlTGV2ZWwpKTsKLQkJICBJRGF0YU1vZGVsT3BlcmF0aW9uIG9wID0gcHJvamVjdEluZm8uZ2V0RGVmYXVsdE9wZXJhdGlvbigpOwotCQkgIGlmIChlbnYhPW51bGwpCi0JCQkgIG9wLmV4ZWN1dGUoRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudiksIG51bGwpOwotCQkgIGVsc2UgCi0JCQkgIG9wLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DUkVBVEVfQVBQQ0lFTlRfUFJPSkVUIiwgbmV3IFN0cmluZ1tde3Byb2plY3ROYW1lfSksU3RhdHVzLkVSUk9SLGUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7CQkKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBGbGV4aWJsZSBKYXZhIFByb2plY3Qgc3RydWN0dXJlCi0JICogVGhpcyBwcm9qZWN0IGlzIHJlcXVpcmVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogTm90ZTogVGhpcyBjYWxsIG1heSBub3QgYmUgbmVjZXNzYXJ5IG9uY2UgSjJFRSBpbXBsZW1lbnRzIGNyZWF0aW5nIGEgZmxleCBwcm9qZWN0IGF1dG9tYXRpY2FsbHkKLQkgKiAJCXdpdGggdGhlIGNyZWF0aW9uIG9mIGNvbXBvbmVudHMuCi0JICovCi0JcHVibGljIFN0YXR1cyBjcmVhdGVGbGV4aWJsZUphdmFQcm9qZWN0KCl7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJdHJ5Ci0JCXsKLQkJICBJRGF0YU1vZGVsIHByb2plY3RJbmZvID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElGbGV4aWJsZUphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSxwcm9qZWN0TmFtZSk7Ci0JCSAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldElkRnJvbUZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWQsIFNlcnZlclV0aWxzLmdldFNlcnZlclRhcmdldE1vZHVsZVR5cGUobW9kdWxlVHlwZSksIGoyZWVMZXZlbCk7Ci0JCSAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSUZsZXhpYmxlSmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuU0VSVkVSX1RBUkdFVF9JRCxydW50aW1lVGFyZ2V0SWQpOwotCQkgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElGbGV4aWJsZUphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9TRVJWRVJfVEFSR0VULEJvb2xlYW4uVFJVRSk7Ci0JCSAgSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IHByb2plY3RJbmZvLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJICBpZiAoZW52IT1udWxsKQotCQkJICBvcC5leGVjdXRlKEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpLCBudWxsKTsKLQkJICBlbHNlIAotCQkJICBvcC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DUkVBVEVfRkxFWF9QUk9KRVQiLCBuZXcgU3RyaW5nW117cHJvamVjdE5hbWV9KSxTdGF0dXMuRVJST1IsZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsJCQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRNb2R1bGVOYW1lKFN0cmluZyBtb2R1bGVOYW1lKQotCXsKLQkJdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTsKLQl9CQotCi0JcHVibGljIGludCBnZXRNb2R1bGVUeXBlKCkKLQl7Ci0JCXJldHVybiBtb2R1bGVUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVR5cGUoaW50IG1vZHVsZVR5cGUpCi0JewotCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkKLQl7Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBFeHBlY3RpbmcgMTIsMTMsMTQgZXRjLgotCSAqIEBwYXJhbSBsZXZlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEoyZWVMZXZlbChTdHJpbmcgbGV2ZWwpCi0JewotCQlpZiAobGV2ZWwgIT1udWxsICYmIGxldmVsLmluZGV4T2YoIi4iKSE9LTEpCi0JCQlqMmVlTGV2ZWwgPSBKMkVFVXRpbHMuZ2V0SjJFRUludFZlcnNpb25Bc1N0cmluZyhsZXZlbCk7Ci0JCWVsc2UKLQkJCWoyZWVMZXZlbCA9IGxldmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotCXsKLQkJdGhpcy5zZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vbml0b3JDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZU1vbml0b3JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDA4MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVNb25pdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLklNb25pdG9yZWRTZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJNb25pdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSVNlcnZlck1vbml0b3JNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTW9uaXRvckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1NFUlZJQ0VTID0gIldlYiBzZXJ2aWNlcyI7Ci0KLSAgcHJpdmF0ZSBCb29sZWFuIG1vbml0b3JTZXJ2aWNlOwotCi0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkOwotCi0gIHByaXZhdGUgSW50ZWdlciBtb25pdG9yZWRQb3J0OwotCi0gIHB1YmxpYyBDcmVhdGVNb25pdG9yQ29tbWFuZCgpIHsKLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZU1vbml0b3JDb21tYW5kIiwKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb25pdG9yQ29tbWFuZCIpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotICAgIGlmIChtb25pdG9yU2VydmljZSAhPSBudWxsICYmIG1vbml0b3JTZXJ2aWNlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0gICAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlckNvcmUuZmluZFNlcnZlcihzZXJ2aWNlU2VydmVySW5zdGFuY2VJZCk7Ci0gICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKLQotICAgICAgICAvLyBJTW9uaXRvcmFibGVTZXJ2ZXIgbW9uaXRvcmFibGVTZXJ2ZXIgPSAoSU1vbml0b3JhYmxlU2VydmVyKQotICAgICAgICAvLyBzZXJ2ZXJEZWxlZ2F0ZTsKLSAgICAgICAgU2VydmVyUG9ydFtdIHBvcnRzID0gc2VydmVyLmdldFNlcnZlclBvcnRzKG51bGwpOwotICAgICAgICBTZXJ2ZXJQb3J0IHBvcnQgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpdCA9IDA7IGl0IDwgcG9ydHMubGVuZ3RoOyBpdCsrKSB7Ci0gICAgICAgICAgU2VydmVyUG9ydCBwID0gcG9ydHNbaXRdOwotICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHAuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgICBpZiAocHJvdG9jb2wgIT0gbnVsbCAmJiBwcm90b2NvbC50cmltKCkudG9Mb3dlckNhc2UoKS5lcXVhbHMoImh0dHAiKSkgewotICAgICAgICAgICAgcG9ydCA9IHA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgewotICAgICAgICAgIElTZXJ2ZXJNb25pdG9yTWFuYWdlciBzZXJ2ZXJNb25pdG9yTWFuYWdlciA9IFNlcnZlck1vbml0b3JNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgSU1vbml0b3JlZFNlcnZlclBvcnRbXSBtb25pdG9yZWRQb3J0cyA9IHNlcnZlck1vbml0b3JNYW5hZ2VyLmdldE1vbml0b3JlZFBvcnRzKHNlcnZlcik7Ci0gICAgICAgICAgZm9yIChpbnQgaXQyID0gMDsgaXQyIDwgbW9uaXRvcmVkUG9ydHMubGVuZ3RoOyBpdDIrKykgewotICAgICAgICAgICAgSU1vbml0b3JlZFNlcnZlclBvcnQgaW1zUG9ydCA9IG1vbml0b3JlZFBvcnRzW2l0Ml07Ci0gICAgICAgICAgICBpZiAocG9ydC5nZXRQb3J0KCkgPT0gaW1zUG9ydC5nZXRTZXJ2ZXJQb3J0KCkuZ2V0UG9ydCgpICYmIGhhc0NvbnRlbnRXZWJTZXJ2aWNlcyhpbXNQb3J0KSkgLy8gcG9ydAotICAgICAgICAgICAgLy8gYWxyZWFkeQotICAgICAgICAgICAgLy8gYmVpbmcKLSAgICAgICAgICAgIC8vIG1vbml0b3JlZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIWltc1BvcnQuaXNTdGFydGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgc2VydmVyTW9uaXRvck1hbmFnZXIuc3RhcnRNb25pdG9yKGltc1BvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgU3RhdHVzIGVycm9yID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUiIsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgU3RyaW5nLnZhbHVlT2YocG9ydC5nZXRQb3J0KCkpLCBzZXJ2ZXIuZ2V0TmFtZSgpfSksIFN0YXR1cy5FUlJPUiwgY2UpOwotICAgICAgICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvcik7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1vbml0b3JlZFBvcnQgPSBuZXcgSW50ZWdlcihpbXNQb3J0LmdldE1vbml0b3JQb3J0KCkpOwotICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJTW9uaXRvcmVkU2VydmVyUG9ydCBpbXNQb3J0ID0gc2VydmVyTW9uaXRvck1hbmFnZXIuY3JlYXRlTW9uaXRvcihzZXJ2ZXIsIHBvcnQsIC0xLCBuZXcgU3RyaW5nW10geyBXRUJfU0VSVklDRVN9KTsKLSAgICAgICAgICAgIHNlcnZlck1vbml0b3JNYW5hZ2VyLnN0YXJ0TW9uaXRvcihpbXNQb3J0KTsKLSAgICAgICAgICAgIG1vbml0b3JlZFBvcnQgPSBuZXcgSW50ZWdlcihpbXNQb3J0LmdldE1vbml0b3JQb3J0KCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgICAgICAgICAgU3RhdHVzIGVycm9yID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkFCTEVfVE9fU1RBUlRfTU9OSVRPUiIsIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YocG9ydC5nZXRQb3J0KCkpLCBzZXJ2ZXIuZ2V0TmFtZSgpfSksIFN0YXR1cy5FUlJPUiwgY2UpOwotICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihlcnJvcik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgICAgICAgIFN0YXR1cyBpbmZvID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19JTkZPX01PTklUT1JJTkdfTk9UX1NVUFBPUlRFRCIsCi0gICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHNlcnZlci5nZXROYW1lKCl9KSwgU3RhdHVzLklORk8pOwotICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0SW5mbyhpbmZvKTsKLSAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaGFzQ29udGVudFdlYlNlcnZpY2VzKElNb25pdG9yZWRTZXJ2ZXJQb3J0IGltc1BvcnQpIHsKLSAgICBTdHJpbmdbXSBjb250ZW50cyA9IGltc1BvcnQuZ2V0Q29udGVudFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIGlmIChXRUJfU0VSVklDRVMuZXF1YWxzKGNvbnRlbnRzW2ldKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyKSB7Ci0gICAgdGhpcy5zZXJ2aWNlU2VydmVySW5zdGFuY2VJZCA9IHR5cGVSdW50aW1lU2VydmVyLmdldFNlcnZlckluc3RhbmNlSWQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2aWNlU2VydmVySW5zdGFuY2VJZCkgewotICAgIHRoaXMuc2VydmljZVNlcnZlckluc3RhbmNlSWQgPSBzZXJ2aWNlU2VydmVySW5zdGFuY2VJZDsKLSAgfQotCi0gIHB1YmxpYyBJbnRlZ2VyIGdldE1vbml0b3JlZFBvcnQoKSB7Ci0gICAgcmV0dXJuIG1vbml0b3JlZFBvcnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShCb29sZWFuIHZhbHVlKSB7Ci0gICAgbW9uaXRvclNlcnZpY2UgPSB2YWx1ZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlU2VydmVyQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVTZXJ2ZXJDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDdiNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVTZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotcHVibGljIGNsYXNzIENyZWF0ZVNlcnZlckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotCXByaXZhdGUgU3RyaW5nIHNlcnZlckluc3RhbmNlSWQ7Ci0JCi0JcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNlcnZlciBvZiB0aGUgZmFjdG9yeSBpZAotCSAqIE5vdGUxOiBDaGVja2luZyBmb3Igc2VydmVyIGluc3RhbmNlID09IG51bGwgaXMgZG9uZSBpbiB0aGUgUHJlU2VydmljZS9DbGllbnRJbnN0YWxsQ29tbWFuZHMKLQkgKiBOb3RlMjogUmVwb3J0aW5nIG9mIGVycm9ycyBpcyBkb25lIGluIFByZVNlcnZpY2UvQ2xpZW50SW5zdGFsbENvbW1hbmRzOyBzaW1wbHkgcmV0dXJuIHRoZSBzdGF0dXMuCi0JICovCi0JcHVibGljIENyZWF0ZVNlcnZlckNvbW1hbmQoKXsKLQkJbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotCXsKLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCQkKLQkJaWYgKHNlcnZlckZhY3RvcnlJZD09bnVsbCl7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ1JFQVRFX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIG51bGwpOwotCQkJcmV0dXJuIHN0YXR1czsJCQkKLQkJfQotCQkKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDID0gbnVsbDsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQl0cnkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLQkJCWlmIChzZXJ2ZXJUeXBlIT1udWxsKSB7Ci0JCQkJaWYgKGVudiE9bnVsbCkKLQkJCQkJc2VydmVyV0MgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihudWxsLCBudWxsLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0JCQkJZWxzZSAKLQkJCQkJc2VydmVyV0MgPSBzZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcihudWxsLCBudWxsLCBudWxsKTsKLQkJCQkKLQkJCQlpZiAoc2VydmVyV0MgIT0gbnVsbCkgewotCQkJCQlpZiAoZW52IT1udWxsKQotCQkJCQkJc2VydmVyID0gc2VydmVyV0Muc2F2ZUFsbCh0cnVlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXNlcnZlciA9IHNlcnZlcldDLnNhdmVBbGwodHJ1ZSwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQ1JFQVRFX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIGNlKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCS8vIHNldCBzZXJ2ZXJJbnN0YW5jZUlkCi0JCWlmIChzZXJ2ZXIhPW51bGwpCi0JCQlzZXJ2ZXJJbnN0YW5jZUlkID0gc2VydmVyLmdldElkKCk7Ci0JCWVsc2UgewotCQkJc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NSRUFURV9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBudWxsKTsJCQkKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5aWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLQl7Ci0JCXRoaXMuc2VydmVyRmFjdG9yeUlkID0gc2VydmVyRmFjdG9yeUlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VJZCgpCi0JewotCQlyZXR1cm4gc2VydmVySW5zdGFuY2VJZDsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9DcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1NGU2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLldlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKioKLSAqIAotICogCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzRUpCID0gZmFsc2U7ICAvLyBmdXR1cmUgaW1wbGVtZW50YXRpb24gcGVyaGFwcwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNXZWIgPSBmYWxzZTsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lOwotICBwcml2YXRlIFN0cmluZyBleGlzdGluZ1NlcnZlcklkOwotICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWRfOwotICBwcml2YXRlIFN0cmluZyBqMmVlVmVyc2lvbl87ICAKLSAgcHJpdmF0ZSBib29sZWFuIG5lZWRFQVJfOwotICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2aWNlUHJvamVjdEVKQl89IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBJU2VydmVyIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7Ci0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQoKSB7Ci0KLSAgICBzdXBlcigib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZCIsCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKXsKLSAgCXJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudil7Ci0gIAlTdGF0dXMgc3RhdCA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIHRyeQl7Ci0gICAgCQotICAgICAgLy8gY2hlY2sgZXhpc3RpbmdTZXJ2ZXIKLSAgICAgIGlmIChmRXhpc3RpbmdTZXJ2ZXIhPW51bGwpIHsKLQotICAgICAgICAvLyBnZXQgRUFSIHByb2plY3QKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotICAgICAgICBpZiAoZWFyUHJvamVjdE5hbWUhPW51bGwgJiYgZWFyUHJvamVjdE5hbWUubGVuZ3RoKCk+MCkgewotICAgICAgICAgIGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWUpOwotICAgIAl9ICAgIAotICAgICAgICAKLSAgICAJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSBudWxsOwotICAgIAlXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSByZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChmRXhpc3RpbmdTZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgIAlpZiAoZWFyUHJvamVjdCE9bnVsbCkgewotICAgIAkJc3RhcnRTZXJ2ZXJDb21tYW5kLnJ1blBvc3RTZXJ2ZXJDb25maWcoZkV4aXN0aW5nU2VydmVyLCBlYXJQcm9qZWN0KTsKLSAgICAJfQotICAgICAgfQotICAgCX0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApIHsKLSAgICAgIElTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgIHN0YXQgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoZW1iZWRkZWRTdGF0dXMpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0KTsKLSAgCQlyZXR1cm4gc3RhdDsKLSAgCX0gIAkKLSAgCQotICAJcmV0dXJuIHN0YXQ7Ci0gIH0gIAotICAKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotCQotICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfQotICAgIAotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7Ci0gICAgSVNlcnZlciBleGlzdGluZ1NlcnZlciA9IG51bGw7ICAgIAotICAgIGZFeGlzdGluZ1NlcnZlciA9IG51bGw7IAotICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElTZXJ2ZXIgdGhpc1NlcnZlciA9IChJU2VydmVyKXNlcnZlcnNbaV07Ci0gICAgICBJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotICAgICAgU3RyaW5nIHRoaXNTZXJ2ZXJJZCA9IG51bGw7Ci0gICAgICAKLSAgICAgIGlmICh0aGlzU2VydmVyIT1udWxsKSB7Ci0gICAgICAJd2MgPSB0aGlzU2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0gICAgICAJdGhpc1NlcnZlcklkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotICAgICAgfQotICAgICAgaWYgKHRoaXNTZXJ2ZXJJZC5lcXVhbHMoZXhpc3RpbmdTZXJ2ZXJJZCkpIHsKLSAgICAgICAgZXhpc3RpbmdTZXJ2ZXIgPSB0aGlzU2VydmVyOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaXNTZXJ2aWNlUHJvamVjdEVKQl8pCi0gICAgewotICAgICAgQ3JlYXRlRUpCUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVFSkJQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgYy5zZXRFamJQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICBjLnNldEVhclByb2plY3ROYW1lKGVhclByb2plY3ROYW1lKTsKLSAgICAgIGMuc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKGV4aXN0aW5nU2VydmVyKTsKLSAgICAgIGMuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgc3RhdHVzID0gYy5leGVjdXRlKGVudik7Ci0gICAgfSAKLSAgICBlbHNlCi0gICAgewotICAgICAgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQgYyA9IG5ldyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZCgpOwotICAgICAgYy5zZXRQcm9qZWN0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICBjLnNldEVhclByb2plY3ROYW1lKGVhclByb2plY3ROYW1lKTsKLSAgICAgIGMuc2V0RXhpc3RpbmdTZXJ2ZXIoZXhpc3RpbmdTZXJ2ZXIpOwotICAgICAgYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoc2VydmVyRmFjdG9yeUlkXyk7Ci0gICAgICBjLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uXyk7Ci0gICAgICBjLnNldE5lZWRFQVIobmVlZEVBUl8pOwotICAgICAgYy5zZXRBZGRlZFByb2plY3RUb1NlcnZlcihhZGRlZFByb2plY3RUb1NlcnZlcl8pOwotICAgICAgc3RhdHVzID0gYy5leGVjdXRlKGVudik7Ci0gICAgfQotICAgIAotICAgIHRyeQl7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGVhclByb2plY3ROYW1lIT1udWxsICYmIGVhclByb2plY3ROYW1lLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lKTsKLSAgICAgICAgfSAgICAJCi0gICAgCQotICAgCQlBYnN0cmFjdFN0YXJ0U2VydmVyIHN0YXJ0U2VydmVyQ29tbWFuZCA9IG51bGw7Ci0gICAJCVdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IHJlZyA9IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgIAlzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChleGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7Ci0gICAgCXN0YXJ0U2VydmVyQ29tbWFuZC5ydW5QcmVTZXJ2ZXJDb25maWcoZXhpc3RpbmdTZXJ2ZXIsIGVhclByb2plY3QpOwotICAgIAlmRXhpc3RpbmdTZXJ2ZXIgPSBleGlzdGluZ1NlcnZlcjsKLSAgIAl9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKSB7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAJCXJldHVybiBzdGF0dXM7Ci0gIAl9Ci0gICAgCi0gICAgLy8gU3RhcnQgc2VydmVyIGlmIHJlcSdkCi0vLyAgICBJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBmRXhpc3RpbmdTZXJ2ZXIuY3JlYXRlV29ya2luZ0NvcHkoKTsgICAgIAotLy8gICAgaWYgKHdjIT1udWxsKXsKLS8vICAgICAgdHJ5IHsKLS8vICAgICAgICBPYmplY3QgeCA9IGZFeGlzdGluZ1NlcnZlci5nZXRBZGFwdGVyKElSdW5uaW5nQWN0aW9uU2VydmVyLmNsYXNzKTsKLS8vICAgICAgICBpZiAoeCE9bnVsbCAmJiB4IGluc3RhbmNlb2YgSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIpIHsKLS8vICAgICAgICAgIGludCBzdGF0ZSA9IGZFeGlzdGluZ1NlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotLy8gICAgICAgICAgaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCB8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIHsKLS8vICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLS8vICAgICAgICAgICAgZkV4aXN0aW5nU2VydmVyLnN5bmNocm9ub3VzU3RhcnQobW9kZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZXgpIHsKLS8vICAgIAlJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gY2V4LmdldFN0YXR1cygpOwotLy8gICAgCXN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0vLyAgICAJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotLy8gIAkJcmV0dXJuIHN0YXR1czsgICAgICAgICAKLS8vICAgICAgfQotLy8gICAgfQotICAgIAotICAgCi0gIAkKLSAgCXJldHVybiBzdGF0dXM7ICAgIAotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBlYXJQcm9qZWN0TmFtZSBUaGUgZWFyUHJvamVjdE5hbWUgdG8gc2V0LgotICAgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdE5hbWUoU3RyaW5nIGVhclByb2plY3ROYW1lKSB7Ci0KLSAgICB0aGlzLmVhclByb2plY3ROYW1lID0gZWFyUHJvamVjdE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVySWQoU3RyaW5nIGV4aXN0aW5nU2VydmVySWQpCi0gIHsKLSAgICB0aGlzLmV4aXN0aW5nU2VydmVySWQgPSBleGlzdGluZ1NlcnZlcklkOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcHJvamVjdE5hbWUgVGhlIHByb2plY3ROYW1lIHRvIHNldC4KLSAgICogQHRvZG8gR2VuZXJhdGVkIGNvbW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCi0gICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcmVxdWlyZXNFSkIgVGhlIHJlcXVpcmVzRUpCIHRvIHNldC4KLSAgICogQHRvZG8gR2VuZXJhdGVkIGNvbW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVzRUpCKGJvb2xlYW4gcmVxdWlyZXNFSkIpIHsKLQotICAgIHRoaXMucmVxdWlyZXNFSkIgPSByZXF1aXJlc0VKQjsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHJlcXVpcmVzV2ViIFRoZSByZXF1aXJlc1dlYiB0byBzZXQuCi0gICAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlc1dlYihib29sZWFuIHJlcXVpcmVzV2ViKSB7Ci0KLSAgICB0aGlzLnJlcXVpcmVzV2ViID0gcmVxdWlyZXNXZWI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKQotICB7Ci0gIAlzZXJ2ZXJGYWN0b3J5SWRfID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgCWoyZWVWZXJzaW9uXyA9IGoyZWVWZXJzaW9uOwkKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmVlZEVBUihib29sZWFuIG5lZWRFQVIpCi0gIHsKLSAgICBuZWVkRUFSXyA9IG5lZWRFQVI7Ci0gIH0gIAotICAKLSAgcHVibGljIHZvaWQgc2V0SXNTZXJ2aWNlUHJvamVjdEVKQihib29sZWFuIGlzU2VydmljZVByb2plY3RFSkIpCi0gIHsKLSAgICB0aGlzLmlzU2VydmljZVByb2plY3RFSkJfID0gaXNTZXJ2aWNlUHJvamVjdEVKQjsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFkZGVkUHJvamVjdFRvU2VydmVyKGJvb2xlYW4gYWRkZWRQcm9qZWN0VG9TZXJ2ZXIpIAotICB7Ci0gICAgYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gYWRkZWRQcm9qZWN0VG9TZXJ2ZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2YTg3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0NyZWF0ZVdlYlByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5XZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlV2ViUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX0NSRUFURV9XRUJfUFJPSkVDVCI7Ci0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX0NSRUFURV9XRUJfUFJPSkVDVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfRUFSX05BTUUgPSAiV2ViU2VydmljZUVBUiI7Ci0gIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lXyA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGVhclByb2plY3ROYW1lXyA9IG51bGw7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm94eUNvZGVnZW5FbmFibGVkID0gdHJ1ZTsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyRmFjdG9yeUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgajJlZVZlcnNpb25fOwotICBwcml2YXRlIElTZXJ2ZXIgZXhpc3RpbmdTZXJ2ZXJfOwotICBwcml2YXRlIGJvb2xlYW4gbmVlZEVBUl87Ci0gIHByaXZhdGUgYm9vbGVhbiB3ZUFkZGVkUHJvamVjdFRvU2VydmVyXyA9IGZhbHNlOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgQ1RPUgotICAgKi8KLSAgcHVibGljIENyZWF0ZVdlYlByb2plY3RDb21tYW5kKCkgewotCi0gICAgc3VwZXIoTEFCRUwsIERFU0NSSVBUSU9OKTsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIC8vc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2aWNlIFdlYiBQcm9qZWN0IHVzaW5nIHRoZSBwYXJhbWV0ZXIgUHJvamVjdCBuYW1lIE5vdGU6IHRvIGJlCi0gICAqIGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyBDcmVhdGVXZWJQcm9qZWN0Q29tbWFuZChTdHJpbmcgc2VydmljZVByb2plY3ROYW1lKSB7Ci0KLSAgICBzdXBlcihMQUJFTCwgREVTQ1JJUFRJT04pOwotICAgIHByb2plY3ROYW1lXyA9IHNlcnZpY2VQcm9qZWN0TmFtZTsKLSAgICAvL3NldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQotICAgIGlmIChwcm9qZWN0TmFtZV8gPT0gbnVsbCB8fCBwcm9qZWN0TmFtZV8ubGVuZ3RoKCkgPT0gMCkgewotICAgIAllbnYuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTA0NCwgdGhpcywgImV4ZWN1dGUiLCAiV2ViIHByb2plY3QgbmFtZSBub3Qgc2V0Iik7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAKLSAgICB9Ci0KLSAgICBpZiAoZXhpc3RpbmdTZXJ2ZXJfID09IG51bGwpCi0gICAgewotICAgICAgZW52LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwNDQsIHRoaXMsICJleGVjdXRlIiwgIlNlcnZlciBpcyBudWxsIik7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgbnVsbCk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgICAgIAotICAgIH0KLSAgICAKLSAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lXyk7Ci0gICAgSVByb2plY3QgZWFyUHJvamVjdCA9IG51bGw7Ci0gICAgaWYgKGVhclByb2plY3ROYW1lXyE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lXyk7Ci0gICAgfQotICAgIAotICAgIGJvb2xlYW4gcHJvamVjdEV4aXN0cyA9IHdlYlByb2plY3QgIT0gbnVsbCAmJiB3ZWJQcm9qZWN0LmV4aXN0cygpOwotICAgIGJvb2xlYW4gYWRkZWRUb1NlcnZlciA9IGZhbHNlOwotICAgIGlmIChwcm9qZWN0RXhpc3RzKQotICAgIHsKLSAgICAgIGFkZGVkVG9TZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKGV4aXN0aW5nU2VydmVyXyxSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgfQotICAgIAotICAgIGJvb2xlYW4gZWFyRXhpc3RzID0gZWFyUHJvamVjdCE9bnVsbCAmJiBlYXJQcm9qZWN0LmV4aXN0cygpOwotICAgIGJvb2xlYW4gZWFyQWRkZWRUb1NlcnZlciA9IHRydWU7Ci0gICAgaWYgKGVhckV4aXN0cykKLSAgICB7Ci0gICAgICBlYXJBZGRlZFRvU2VydmVyID0gU2VydmVyVXRpbC5jb250YWluc01vZHVsZShleGlzdGluZ1NlcnZlcl8sUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgIH0KLSAgICAKLSAgICBib29sZWFuIGFyZUFzc29jaWF0ZWQgPSBmYWxzZTsKLSAgICBpZiAocHJvamVjdEV4aXN0cyAmJiBlYXJFeGlzdHMpCi0gICAgewotICAgICAgYXJlQXNzb2NpYXRlZCA9IEoyRUVVdGlscy5pc0VBUkFzc29jaWF0ZWQod2ViUHJvamVjdCwgZWFyUHJvamVjdCk7Ci0gICAgfQotICAgIAotICAgIGJvb2xlYW4gc2VydmVyUmVxdWlyZXNFQVJSZW1vdmFsID0gdHJ1ZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBjaGVjayB0aGUgUmVnaXN0cnkgdG8gc2VlIGlmIHRoZSBzZXJ2ZXIgcmVxdWlyZXMgRUFSIHJlbW92YWwKLSAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsKQotICAgICAgewotICAgICAgICBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeSB3c3NSZWcgPSBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICBzZXJ2ZXJSZXF1aXJlc0VBUlJlbW92YWwgPSB3c3NSZWcuaXNSZW1vdmVFQVJSZXF1aXJlZChzZXJ2ZXJGYWN0b3J5SWRfKTsgICAgCQkKLSAgICAgIH0gICAgCi0gICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgICBlbnYuZ2V0TG9nKCkubG9nKExvZy5FUlJPUiwgNTA0NiwgdGhpcywgImV4ZWN1dGUiLCBjZSk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgY2UpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgaWYgKCFuZWVkRUFSXyAmJiBwcm9qZWN0RXhpc3RzICYmIGFkZGVkVG9TZXJ2ZXIgJiYgIXdlQWRkZWRQcm9qZWN0VG9TZXJ2ZXJfKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gZXhpc3RpbmcgcHJvamVjdCwgZWFyIGFuZCBzZXJ2ZXIgY29uZmlndXJhdGlvbgotICAgIGlmIChuZWVkRUFSXyAmJiBwcm9qZWN0RXhpc3RzICYmIGVhckV4aXN0cyAmJiBlYXJBZGRlZFRvU2VydmVyICYmIGFyZUFzc29jaWF0ZWQgJiYgIXdlQWRkZWRQcm9qZWN0VG9TZXJ2ZXJfKXsKLSAgICAJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0KLSAgICAKLSAgICAvL0Fsd2F5cyBzdG9wIHRoZSBzZXJ2ZXIKLSAgICBTdGF0dXMgc3RvcHBpbmdTdGF0dXMgPSBzdG9wU2VydmVyKGVudik7Ci0gICAgaWYoc3RvcHBpbmdTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgIHJldHVybiBzdG9wcGluZ1N0YXR1czsKLSAgICAKLSAgICBpZiAoIW5lZWRFQVJfICYmIHByb2plY3RFeGlzdHMgJiYgYWRkZWRUb1NlcnZlcikKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfSAgICAgICAKLSAgICBlbHNlIGlmICghbmVlZEVBUl8gJiYgcHJvamVjdEV4aXN0cyAmJiAhYWRkZWRUb1NlcnZlcikKLSAgICB7Ci0gICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHdlYlByb2plY3QpICwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKCFuZWVkRUFSXyAmJiAhcHJvamVjdEV4aXN0cykKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlV2ViUHJvamVjdChlbnYpOwotICAgICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgd2ViUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZV8pOwotICAgICAgCi0gICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHdlYlByb2plY3QpICwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChwcm9qZWN0RXhpc3RzICYmIGVhckV4aXN0cyAmJiBhcmVBc3NvY2lhdGVkICYmIGFkZGVkVG9TZXJ2ZXIpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9qZWN0RXhpc3RzICYmIGVhckV4aXN0cyAmJiBhcmVBc3NvY2lhdGVkICYmICFhZGRlZFRvU2VydmVyKQotICAgIHsKLSAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGV4aXN0aW5nU2VydmVyXywgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUod2ViUHJvamVjdCkgLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgCXJldHVybiBtbVN0YXR1czsgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKHByb2plY3RFeGlzdHMgJiYgIWVhckV4aXN0cykKLSAgICB7Ci0gICAgICAvL0NyZWF0ZSB0aGUgRUFSIHByb2plY3QKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBjcmVhdGVFQVJQcm9qZWN0KGVudik7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgCi0gICAgICAvL0Fzc29jaWF0ZSB0aGUgV2ViIHByb2plY3QgYW5kIHRoZSBFQVIgcHJvamVjdAotICAgICAgSjJFRVV0aWxzLmFzc29jaWF0ZVdlYlByb2plY3Qod2ViUHJvamVjdCwgZWFyUHJvamVjdCk7Ci0gICAgICAKLSAgICAgIC8vQWRkIHRvIHNlcnZlcgotICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZXhpc3RpbmdTZXJ2ZXJfLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXByb2plY3RFeGlzdHMgJiYgIWVhckV4aXN0cykKLSAgICB7Ci0gICAgICAvL0NyZWF0ZSBFQVIKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBjcmVhdGVFQVJQcm9qZWN0KGVudik7Ci0gICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZV8pOwotICAgICAgCi0gICAgICAvL0NyZWF0ZSBwcm9qZWN0Ci0gICAgICBzdGF0dXMgPSBjcmVhdGVXZWJQcm9qZWN0KGVudik7Ci0gICAgICBpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB3ZWJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lXyk7Ci0gICAgICAKLSAgICAgIC8vQWRkIHRvIHNlcnZlcgotICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgZXhpc3RpbmdTZXJ2ZXJfLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZSh3ZWJQcm9qZWN0KSAsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmICghcHJvamVjdEV4aXN0cyAmJiBlYXJFeGlzdHMpCi0gICAgewotICAgICAgLy9SZW1vdmUgdGhlIGVhciBmcm9tIHRoZSBzZXJ2ZXIgaWYgbmVjZXNzYXJ5Ci0gICAgICBpZiAoZWFyQWRkZWRUb1NlcnZlciAmJiBzZXJ2ZXJSZXF1aXJlc0VBUlJlbW92YWwpCi0gICAgICB7Ci0gICAgICAgIC8vIFN0b3BwaW5nIHNlcnZlciBhbmQgcmVtb3ZpbmcgRUFSIGZyb20gU2VydmVyCi0gICAgICAgIGlmIChleGlzdGluZ1NlcnZlcl8uZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpCi0gICAgICAgIHsKLSAgICAgICAgICBleGlzdGluZ1NlcnZlcl8uc3luY2hyb25vdXNTdG9wKGZhbHNlKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGV4aXN0aW5nU2VydmVyXywgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUoZWFyUHJvamVjdCksIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9DcmVhdGUgdGhlIFdlYiBwcm9qZWN0Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gY3JlYXRlV2ViUHJvamVjdChlbnYpOwotICAgICAgaWYoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgd2ViUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZV8pOwotCi0gICAgICBib29sZWFuIGVhckFkZGVkVG9TZXJ2ZXJGaW5hbCA9IFNlcnZlclV0aWwuY29udGFpbnNNb2R1bGUoZXhpc3RpbmdTZXJ2ZXJfLFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgIGlmICghZWFyQWRkZWRUb1NlcnZlckZpbmFsKQotICAgICAgewotICAgICAgCVN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIGV4aXN0aW5nU2VydmVyXywgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUod2ViUHJvamVjdCkgLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgIAotICAgICAgICBpZiAobW1TdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICAgICAJcmV0dXJuIG1tU3RhdHVzOyAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKHByb2plY3RFeGlzdHMgJiYgZWFyRXhpc3RzICYmICFhcmVBc3NvY2lhdGVkKQotICAgIHsKLSAgICAgIC8vUmVtb3ZlIHRoZSBlYXIgZnJvbSB0aGUgc2VydmVyIGlmIG5lY2Vzc2FyeQotICAgICAgaWYgKGVhckFkZGVkVG9TZXJ2ZXIgJiYgc2VydmVyUmVxdWlyZXNFQVJSZW1vdmFsKQotICAgICAgewotICAgICAgICAvLyBTdG9wcGluZyBzZXJ2ZXIgYW5kIHJlbW92aW5nIEVBUiBmcm9tIFNlcnZlcgotICAgICAgICBpZiAoZXhpc3RpbmdTZXJ2ZXJfLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKQotICAgICAgICB7Ci0gICAgICAgICAgZXhpc3RpbmdTZXJ2ZXJfLnN5bmNocm9ub3VzU3RvcChmYWxzZSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICBTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGVhclByb2plY3QpLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vQXNzb2NpYXRlIHRoZSBXZWIgcHJvamVjdCBhbmQgdGhlIEVBUiBwcm9qZWN0Ci0gICAgICBKMkVFVXRpbHMuYXNzb2NpYXRlV2ViUHJvamVjdCh3ZWJQcm9qZWN0LCBlYXJQcm9qZWN0KTsKLSAgICAgIAotICAgICAgYm9vbGVhbiBlYXJBZGRlZFRvU2VydmVyRmluYWwgPSBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKGV4aXN0aW5nU2VydmVyXyxSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7ICAgICAgCi0gICAgICBpZiAoIWVhckFkZGVkVG9TZXJ2ZXJGaW5hbCkKLSAgICAgIHsKLSAgICAgIAlTdGF0dXMgbW1TdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLm1vZGlmeU1vZHVsZXMoZW52LCBleGlzdGluZ1NlcnZlcl8sIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHdlYlByb2plY3QpICwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7ICAKLSAgICAgICAgaWYgKG1tU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgCXJldHVybiBtbVN0YXR1czsgICAgICAKLSAgICAgIH0gICAgICAKLSAgICAgIAotICAgIH0KLQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RhdHVzIGNyZWF0ZVdlYlByb2plY3QoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgIAkKLSAgICBJRGF0YU1vZGVsIHByb2plY3RJbmZvID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lXyk7Ci0gICAgU3RyaW5nIGZpbmFsSjJFRVZlcnNpb24gPSBudWxsOwotICAgIGlmIChqMmVlVmVyc2lvbl8gIT0gbnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBuZXcgSW50ZWdlcihqMmVlVmVyc2lvbl8pKTsKLSAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBqMmVlVmVyc2lvbl87Ci0gICAgfSAgICAgICAgCi0gICAgZWxzZSAgICAgICAgCi0gICAgewotICAgICAgaWYgKGVhclByb2plY3ROYW1lXyAhPW51bGwgJiYgZWFyUHJvamVjdE5hbWVfLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KGVhclByb2plY3ROYW1lXyk7Ci0gICAgICAgIGlmIChlYXJQcm9qZWN0ICE9IG51bGwgJiYgZWFyUHJvamVjdC5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIEVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGVhclByb2plY3QpOwotICAgICAgICAgIGludCBlYXJWZXJzaW9uID0gZWFyLmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgbmV3IEludGVnZXIoZWFyVmVyc2lvbikpOwotICAgICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihlYXJWZXJzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfVkVSU0lPTiwgbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLSAgICAgICAgICBmaW5hbEoyRUVWZXJzaW9uID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSk7Ci0gICAgICAgIGZpbmFsSjJFRVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7ICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgIH0gICAgCi0gICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IG51bGw7Ci0gICAgaWYgKHNlcnZlckZhY3RvcnlJZF8hPW51bGwgJiYgc2VydmVyRmFjdG9yeUlkXy5sZW5ndGgoKT4wKQotICAgIHsKLS8vCQlUT0RPIC0gQWRkIHRoaXMgbG9naWMgdG8gRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwsIGFuZCBvcC4uLi4KLS8vICAgICAgcnVudGltZVRhcmdldElkID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8sSVNlcnZlclRhcmdldENvbnN0YW50cy5XRUJfVFlQRSwgZmluYWxKMkVFVmVyc2lvbik7IAotLy8gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5TRVJWRVJfVEFSR0VUX0lELCBydW50aW1lVGFyZ2V0SWQgKTsKLS8vICAgICAgcHJvamVjdEluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1NFUlZFUl9UQVJHRVQsIEJvb2xlYW4uVFJVRSk7ICAgICAgCi0gICAgfSAKLSAgICAKLSAgICBpZiAoZWFyUHJvamVjdE5hbWVfICE9bnVsbCAmJiBlYXJQcm9qZWN0TmFtZV8ubGVuZ3RoKCk+MCkKLSAgICB7Ci0gICAgICBwcm9qZWN0SW5mby5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSwgZWFyUHJvamVjdE5hbWVfKTsKLSAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgQm9vbGVhbi5UUlVFKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHByb2plY3RJbmZvLnNldFByb3BlcnR5KElXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgfQotICAgIAkKLSAgICAKLQotICAgIC8vQ3JlYXRlIGFuZCBydW4gdGhlIG9wZXJhdGlvbgotICAgIElEYXRhTW9kZWxPcGVyYXRpb24gb3AgPSBwcm9qZWN0SW5mby5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0gICAgICBvcC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOyAgICAKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZW52LmdldExvZygpLmxvZyhMb2cuRVJST1IsIDUwNDYsIHRoaXMsICJjcmVhdGVXZWJQcm9qZWN0IiwgZSk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0VCX1BST0pFQ1RfQ1JFQVRFIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgICAgIAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBTdGF0dXMgY3JlYXRlRUFSUHJvamVjdChFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBDcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCB0ID0gbmV3IENyZWF0ZUVBUlByb2plY3RDb21tYW5kKCk7Ci0gICAgdC5zZXRFYXJQcm9qZWN0TmFtZShlYXJQcm9qZWN0TmFtZV8pOwotICAgIHQuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOwotICAgIHQuc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb25fKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gdC5leGVjdXRlKGVudik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSAgICAgICAgICAgICAKLSAgCi0gIHByaXZhdGUgU3RhdHVzIHN0b3BTZXJ2ZXIoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gCQotICAgIHRyeQotICAgCXsKLSAgIAkJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgIAkJQWJzdHJhY3RTdGFydFNlcnZlciBzdGFydFNlcnZlckNvbW1hbmQgPSAoQWJzdHJhY3RTdGFydFNlcnZlcilyZWcuZ2V0U2VydmVyU3RhcnRCeVR5cGVJZChleGlzdGluZ1NlcnZlcl8uZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotICAgIAlzdGFydFNlcnZlckNvbW1hbmQuc3RvcFNlcnZlcihleGlzdGluZ1NlcnZlcl8pOwotICAgIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAJfQotICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSApCi0gIAl7Ci0gICAgCUlTdGF0dXMgZW1iZWRkZWRTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAJU3RhdHVzIHN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgCQlyZXR1cm4gc3RhdHVzOwotICAJfSAgCQotICAJCi0KLSAgfQotICAKLSAgLy8gVG8gYmUgZGVwcmVjYXRlZAotICAvKgotICBwcml2YXRlIFN0YXR1cyBjcmVhdGVXZWJQcm9qZWN0KFN0cmluZyB3ZWJQcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3ROYW1lLCBFbnZpcm9ubWVudCBlbnYpIHsKLQotICAgIHRyeSB7Ci0gICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgIElQcm9qZWN0IGVhclByb2plY3QgPSByb290LmdldFByb2plY3QoZWFyUHJvamVjdE5hbWUpOwotICAgICAgaWYgKGVhclByb2plY3QgIT0gbnVsbCAmJiAhZWFyUHJvamVjdC5leGlzdHMoKSkgewotICAgICAgICBDcmVhdGVFQVJQcm9qZWN0Q29tbWFuZCBjID0gbmV3IENyZWF0ZUVBUlByb2plY3RDb21tYW5kKCk7Ci0gICAgICAgIGMuc2V0RWFyUHJvamVjdE5hbWUoZWFyUHJvamVjdE5hbWUpOwotICAgICAgICBjLnNldFNlcnZlckZhY3RvcnlJZChzZXJ2ZXJGYWN0b3J5SWRfKTsKLSAgICAgICAgYy5zZXRKMkVFVmVyc2lvbihqMmVlVmVyc2lvbl8pOwotICAgICAgICBjLmV4ZWN1dGUoZW52KTsKLSAgICAgICAgZWFyUHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChlYXJQcm9qZWN0TmFtZSk7Ci0gICAgICB9Ci0gICAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHdlYlByb2plY3ROYW1lKTsKLSAgICAgIGlmICh3ZWJQcm9qZWN0ICE9IG51bGwgJiYgIXdlYlByb2plY3QuZXhpc3RzKCkpIHsKLSAgICAgICAgV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgaW5mbyA9IG5ldyBXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgd2ViUHJvamVjdE5hbWUpOwotICAgICAgICBpbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkVBUl9QUk9KRUNUX05BTUUsIGVhclByb2plY3ROYW1lKTsKLSAgICAgICAgLy9pbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkFERF9UT19FQVIsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUiwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgIGlmIChzZXJ2ZXJGYWN0b3J5SWRfIT1udWxsICYmIHNlcnZlckZhY3RvcnlJZF8ubGVuZ3RoKCk+MCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBTZXJ2ZXJVdGlscy5nZXRSdW50aW1lVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZF8pOyAKLSAgICAgICAgICBpbmZvLnNldFByb3BlcnR5KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlNFUlZFUl9UQVJHRVRfSUQsIHJ1bnRpbWVUYXJnZXRJZCApOwotICAgICAgICAgIGluZm8uc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1NFUlZFUl9UQVJHRVQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGoyZWVWZXJzaW9uXyAhPSBudWxsICYmIGoyZWVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgICAgICB7Ci0gICAgICAgICAgaW5mby5zZXRQcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5KMkVFX1ZFUlNJT04sIG5ldyBJbnRlZ2VyKGoyZWVWZXJzaW9uXykpOwotICAgICAgICB9ICAgICAgICAgICAgICAgIAotCi0gICAgICAgIFdlYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKGluZm8pOwotICAgICAgICBvcGVyYXRpb24ucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XRUJfUFJPSkVDVF9DUkVBVEUiKSwgU3RhdHVzLkVSUk9SLAotICAgICAgICAgIGl0ZSk7Ci0gICAgfQotICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1dFQl9QUk9KRUNUX0NSRUFURSIpLCBTdGF0dXMuRVJST1IsCi0gICAgICAgICAgaWUpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgKi8KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE5ld0VBUk5hbWUoKSB7Ci0KLSAgICBTdHJpbmcgbmV3RUFSTmFtZSA9IERFRkFVTFRfRUFSX05BTUU7Ci0gICAgLy9DaGVjayB0byBzZWUgaWYgaXQgZXhpc3RzCi0gICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmV3RUFSTmFtZSk7Ci0gICAgcmV0dXJuIG5ld0VBUk5hbWU7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXREZWZhdWx0RUFSUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLSAgICB0cnkgewotICAgICAgRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBudWxsOwotICAgICAgRUFSTmF0dXJlUnVudGltZSBlYXIgPSBudWxsOwotICAgICAgZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0gICAgICBpZiAoZWFyc1swXSAhPSBudWxsICYmIGVhcnMubGVuZ3RoID49IDEpIHsKLSAgICAgICAgLy8gZm91bmQgYW4gRUFSIGNvbnRhaW5pbmcgdGhlIHdlYiBwcm9qZWN0Ci0gICAgICAgIHJldHVybiBlYXJzWzBdLmdldFByb2plY3QoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGoyZWVWZXJzaW9uXyE9bnVsbCAmJiBqMmVlVmVyc2lvbl8ubGVuZ3RoKCk+MCkKLSAgICAgIHsKLSAgICAgIAllYXIgPSBKMkVFVXRpbHMuZ2V0RUFSKEludGVnZXIucGFyc2VJbnQoajJlZVZlcnNpb25fKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGVhciA9IEoyRUVVdGlscy5nZXQxMkVBUigpOwotICAgICAgICBpZiAoZWFyID09IG51bGwpCi0gICAgICAgICAgZWFyID0gSjJFRVV0aWxzLmdldDEzRUFSKCk7Ci0gICAgICAgIGlmIChlYXIgPT0gbnVsbCkKLSAgICAgICAgICBlYXIgPSBKMkVFVXRpbHMuZ2V0RUFSKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVhciAhPSBudWxsKQotICAgICAgICByZXR1cm4gZWFyLmdldFByb2plY3QoKTsKLSAgICAgIGVsc2UgewotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9IGdldE5ld0VBUk5hbWUoKTsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIHJldHVybiByb290LmdldFByb2plY3QoZWFyTmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGVhclByb2plY3ROYW1lCi0gICAqICAgICAgICAgIFRoZSBlYXJQcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0TmFtZShTdHJpbmcgZWFyUHJvamVjdE5hbWUpIHsKLQotICAgIHRoaXMuZWFyUHJvamVjdE5hbWVfID0gZWFyUHJvamVjdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHByb2plY3ROYW1lCi0gICAqICAgICAgICAgIFRoZSBwcm9qZWN0TmFtZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQotICAgIHRoaXMucHJvamVjdE5hbWVfID0gcHJvamVjdE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGV4aXN0aW5nU2VydmVyCi0gICAqICAgICAgICAgIFRoZSBleGlzdGluZ1NlcnZlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ1NlcnZlcihJU2VydmVyIGV4aXN0aW5nU2VydmVyKSB7Ci0KLSAgICB0aGlzLmV4aXN0aW5nU2VydmVyXyA9IGV4aXN0aW5nU2VydmVyOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAJc2VydmVyRmFjdG9yeUlkXyA9IHNlcnZlckZhY3RvcnlJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gIAlqMmVlVmVyc2lvbl8gPSBqMmVlVmVyc2lvbjsJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5lZWRFQVIoYm9vbGVhbiBuZWVkRUFSKQotICB7Ci0gICAgbmVlZEVBUl8gPSBuZWVkRUFSOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBZGRlZFByb2plY3RUb1NlcnZlcihib29sZWFuIGFkZGVkUHJvamVjdFRvU2VydmVyKSAKLSAgewotICAgIHdlQWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gYWRkZWRQcm9qZWN0VG9TZXJ2ZXI7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9EaXNhYmxlQnVpbGRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVCdWlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljNDA1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVCdWlsZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLnZhbGlkYXRlLlZhbGlkYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIERpc2FibGVCdWlsZENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgTW9kZWwgbW9kZWxfOwotICBwcml2YXRlIFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXJfOwotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dFQlNFUlZJQ0VfRElTQUJMRV9CVUlMRCI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19XRUJTRVJWSUNFX0RJU0FCTEVfQlVJTEQiOwotICAvKioKLSAgICogQ1RPUjsKLSAgICovCi0gIHB1YmxpYyBEaXNhYmxlQnVpbGRDb21tYW5kKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCi0gICAgc2V0TmFtZShtc2dVdGlsc18uZ2V0TWVzc2FnZShMQUJFTCkpOwotICAgIHNldERlc2NyaXB0aW9uKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKERFU0NSSVBUSU9OKSk7Ci0gIH0KLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX0JVSUxEIikpOwotCi0gICAgaWYgKG1hbmFnZXJfIT1udWxsKSB7Ci0gICAgICBtYW5hZ2VyXy5kaXNhYmxlQXV0b0J1aWxkKCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtb2RlbAotICAgKiAKLSAgICogQHBhcmFtIG1vZGVsCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb2RlbChNb2RlbCBtb2RlbCkgewotICAgIHRoaXMubW9kZWxfID0gbW9kZWw7Ci0gIH0gIAotICAKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gbWFuYWdlcl8gVGhlIG1hbmFnZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICB0aGlzLm1hbmFnZXJfID0gbWFuYWdlcjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVWYWxpZGF0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9EaXNhYmxlVmFsaWRhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkYTY0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0Rpc2FibGVWYWxpZGF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGUuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIERpc2FibGVWYWxpZGF0aW9uQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nIExBQkVMID0gIlRBU0tfTEFCRUxfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT04iOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJUQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT04iOwotCi0gIC8qKgotICAgKiBDVE9SOwotICAgKi8KLSAgcHVibGljIERpc2FibGVWYWxpZGF0aW9uQ29tbWFuZCgpIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUQVNLX0RFU0NfV0VCU0VSVklDRV9ESVNBQkxFX1ZBTElEQVRJT04iKSk7Ci0KLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gc2VydmljZVByb2plY3RfOwotICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIG1hbmFnZXJfLmRpc2FibGVWYWxpZGF0aW9uRm9yUHJvamVjdChwcm9qZWN0KTsKLQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIG1hbmFnZXJfCi0gICAqICAgICAgICAgICAgVGhlIG1hbmFnZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICB0aGlzLm1hbmFnZXJfID0gbWFuYWdlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpewotICAgIHRoaXMuc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vR2V0TW9uaXRvckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vR2V0TW9uaXRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllZDBiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL0dldE1vbml0b3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLS8vIFRPRE86IEdldCByaWQgb2YgdGhpcy4gQSByZXBsYWNlbWVudCBpcyBpbiBvcmcuZWNsaXBzZS53c3Qud3MuCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3JXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk1vbml0b3JDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgR2V0TW9uaXRvckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBtb25pdG9yU2VydmljZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZTsKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBMaXN0IGVuZHBvaW50czsKLQotICBwdWJsaWMgR2V0TW9uaXRvckNvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5HZXRNb25pdG9yQ29tbWFuZCIsICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uR2V0TW9uaXRvckNvbW1hbmQiKTsKLSAgICBtb25pdG9yU2VydmljZSA9IHRydWU7Ci0gICAgY3JlYXRlID0gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBlbmRwb2ludHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKG1vbml0b3JTZXJ2aWNlICYmIHdlYlNlcnZpY2VzUGFyc2VyICE9IG51bGwgJiYgd3NkbFVSSSAhPSBudWxsICYmIHdzZGxVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdlYlNlcnZpY2VzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpOwotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXQgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlzZXJ2aWNlc0l0Lm5leHQoKTsKLSAgICAgICAgICBNYXAgcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBwb3J0c0l0ID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgcG9ydHNJdC5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBvcnQgd3NkbFBvcnQgPSAoUG9ydClwb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgIExpc3QgZXh0RWxlbWVudHMgPSB3c2RsUG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZXh0RWxlbWVudHNJdCA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IGV4dEVsZW1lbnRzSXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtZW50c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgVVJMIGVuZHBvaW50VVJMID0gbnVsbDsKLSAgICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICAgICAgICBlbmRwb2ludCA9ICgoU09BUEFkZHJlc3MpZXh0RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIEhUVFBBZGRyZXNzKQotICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gKChIVFRQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICAgICAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGVuZHBvaW50VVJMID0gbmV3IFVSTChlbmRwb2ludCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRVUkwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IGVuZHBvaW50VVJMLmdldFByb3RvY29sKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBlbmRwb2ludFVSTC5nZXRIb3N0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHBvcnQgPSBlbmRwb2ludFVSTC5nZXRQb3J0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnQgPT0gLTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKCJodHRwIi5lcXVhbHNJZ25vcmVDYXNlKHByb3RvY29sKSkKLSAgICAgICAgICAgICAgICAgICAgcG9ydCA9IDgwOwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoImh0dHBzIi5lcXVhbHNJZ25vcmVDYXNlKHByb3RvY29sKSkKLSAgICAgICAgICAgICAgICAgICAgcG9ydCA9IDQ0MzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb3RvY29sICE9IG51bGwgJiYgcHJvdG9jb2wuc3RhcnRzV2l0aCgiaHR0cCIpICYmIGhvc3QgIT0gbnVsbCAmJiBob3N0Lmxlbmd0aCgpID4gMCAmJiBwb3J0ICE9IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIElNb25pdG9yIG0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgSU1vbml0b3JbXSBtb25pdG9ycyA9IE1vbml0b3JDb3JlLmdldE1vbml0b3JzKCk7Ci0gICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bW9uaXRvcnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChob3N0LmVxdWFsc0lnbm9yZUNhc2UobW9uaXRvcnNbaV0uZ2V0UmVtb3RlSG9zdCgpKSAmJiBwb3J0ID09IG1vbml0b3JzW2ldLmdldFJlbW90ZVBvcnQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIG0gPSBtb25pdG9yc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKG0gPT0gbnVsbCAmJiBjcmVhdGUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtb25pdG9yZWRQb3J0ID0gU29ja2V0VXRpbC5maW5kVW51c2VkUG9ydCg1MDAwLCAxNTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIElNb25pdG9yV29ya2luZ0NvcHkgbW9uaXRvcldvcmtpbmdDb3B5ID0gTW9uaXRvckNvcmUuY3JlYXRlTW9uaXRvcigpOwotICAgICAgICAgICAgICAgICAgICBtb25pdG9yV29ya2luZ0NvcHkuc2V0TG9jYWxQb3J0KG1vbml0b3JlZFBvcnQpOwotICAgICAgICAgICAgICAgICAgICBtb25pdG9yV29ya2luZ0NvcHkuc2V0UmVtb3RlSG9zdChob3N0KTsKLSAgICAgICAgICAgICAgICAgICAgbW9uaXRvcldvcmtpbmdDb3B5LnNldFJlbW90ZVBvcnQocG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIG1vbml0b3JXb3JraW5nQ29weS5zZXRQcm90b2NvbCgiSFRUUCIpOwotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIG0gPSBtb25pdG9yV29ya2luZ0NvcHkuc2F2ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyB3YXJuaW5nID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IiLCBuZXcgT2JqZWN0W117U3RyaW5nLnZhbHVlT2YocG9ydCksIGVuZHBvaW50fSksIFN0YXR1cy5XQVJOSU5HLCB0KTsKLSAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHdhcm5pbmcpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKCFtLmlzUnVubmluZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgbS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoZW5kcG9pbnRVUkwuZ2V0UHJvdG9jb2woKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCI6Ly9sb2NhbGhvc3Q6Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy52YWx1ZU9mKG0uZ2V0TG9jYWxQb3J0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZW5kcG9pbnRVUkwuZ2V0RmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludHMuYWRkKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyB3YXJuaW5nID0gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IiLCBuZXcgT2JqZWN0W117U3RyaW5nLnZhbHVlT2YocG9ydCksIGVuZHBvaW50fSksIFN0YXR1cy5XQVJOSU5HLCB0KTsKLSAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHdhcm5pbmcpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3RhdHVzRXhjZXB0aW9uIHNlKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvclNlcnZpY2UoYm9vbGVhbiBtb25pdG9yU2VydmljZSkKLSAgewotICAgIHRoaXMubW9uaXRvclNlcnZpY2UgPSBtb25pdG9yU2VydmljZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlc1BhcnNlcihXZWJTZXJ2aWNlc1BhcnNlciB3ZWJTZXJ2aWNlc1BhcnNlcikKLSAgewotICAgIHRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0V3NkbFVSSShTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIHRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDcmVhdGUoYm9vbGVhbiBjcmVhdGUpCi0gIHsKLSAgICB0aGlzLmNyZWF0ZSA9IGNyZWF0ZTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEVuZHBvaW50cygpCi0gIHsKLSAgICByZXR1cm4gZW5kcG9pbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllODZmZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9KYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi0KLS8vY29yZSBzdHVmZgotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIHRvIEJ1aWxkIHRoZSBkYXRhIG1vZGVsCi0qIGZpcnN0IHdlIGdldCB0aGUgamF2YSBjbGFzcyBhbmQgdGhlbiBidWlsZCB0aGUgbW9kZWwKLSovCi1wdWJsaWMgY2xhc3MgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gIkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJyZWZsZWN0aW9uIGZvciBhIGdpdmVuIGNsYXNzIjsgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9LX01FU1NBR0UgPSAgIlRoZSBtb2RlbCBoYXMgYmVlbiBidWlsdCAiOyAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gIi5qYXZhIjsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENMQVNTX0VYVEVOU0lPTiA9ICIuY2xhc3MiOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIAotICBwcml2YXRlIFN0cmluZyBjbGllbnRQcm9qZWN0OwotICBwcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotICBwcml2YXRlIEphdmFIZWxwZXJzIGphdmFDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgcW5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBJUHJvamVjdCBjbGllbnRJUHJvamVjdDsKLSAKLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgYW5kIGRlc2NyaXB0aW9uCi0gICogCi0gICovCi0gIHB1YmxpYyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKQotICB7Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0KLSAgICBzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0gICAgc2V0TmFtZShMQUJFTCk7Ci0gIH0KLSAgCi0gIC8vIHNldHRlcnMgZm9yIHRoaXMgY29tbWFuZAotICAKLSAgICAKLSAgLyoqCi0gICogVGhlIGVuZCByZXN1bHQgb2YgdGhpcyB3aG9sZSBwcm9jZXNzIGlzIHRvIGdldCB0aGUgSmF2YSBDbGFzcwotICAqLwotICBwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0SmF2YUNsYXNzKCkKLSAgewotICAgIHJldHVybiBqYXZhQ2xhc3M7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NRTmFtZSgpCi0gIHsKLSAgICAgIHFuYW1lID0gcHJveHlCZWFuOwotCSAgaWYgKHFuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoSkFWQV9FWFRFTlNJT04pKSB7Ci0JCSAgcW5hbWUgPSBxbmFtZS5zdWJzdHJpbmcoMCwocW5hbWUubGVuZ3RoKCkgLTUpKTsKLQkgIH0KLQkgIGlmIChxbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKENMQVNTX0VYVEVOU0lPTikpIHsKLQkJICBxbmFtZSA9IHFuYW1lLnN1YnN0cmluZygwLChxbmFtZS5sZW5ndGgoKSAtNikpOwotCSAgfQotICAgfQotICAgICAgCi0gIC8qKgotICAqIEdldCB0aGUgamF2YSBtb2RlbCBmcm9tIHRoZSByZXNvdXJjZSB0aGVuIAotICAqIGJ1aWxkIHRoZSBtb2RlbCBmcm9tIHRoZSBtb2YKLSAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotIAkvL2p1c3QgbWFrZSBzdXJlIHRoZSBwcm9qZWN0IGFuZCBxbmFtZSBhcmUgdGhlcmUKLSAgCS8vdGhleSBhcmUgZXNzZW50aWFsIGZvciB0aGlzIG9wZXJhdGlvbgotICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAJSVByb2plY3QgY2xpZW50SVByb2plY3QgPSAoSVByb2plY3QpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoY2xpZW50UHJvamVjdCk7Ci0gIAlwcm9jZXNzUU5hbWUoKTsKLSAgCWlmKGNsaWVudFByb2plY3QgPT0gbnVsbCB8fCBxbmFtZSA9PSBudWxsKQotICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfV0FSTl9VTkFCTEVfVE9fRklORF9QUk9YWSIpLFN0YXR1cy5XQVJOSU5HKTsKLSAgCQotICAgIEphdmFFTUZOYXR1cmUgbmF0dXJlID0gKEphdmFFTUZOYXR1cmUpSmF2YUVNRk5hdHVyZS5nZXRSdW50aW1lKGNsaWVudElQcm9qZWN0KTsKLSAgICBpZihuYXR1cmUgPT0gbnVsbCl7Ci0gICAgICB0cnl7Ci0gICAgICAgIG5hdHVyZSA9IChKYXZhRU1GTmF0dXJlKUphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShjbGllbnRJUHJvamVjdCk7ICAJCi0gICAgICB9Y2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpe30KLSAgICB9Ci0gICAgcmVzb3VyY2VTZXQgPSBuYXR1cmUuZ2V0UmVzb3VyY2VTZXQoKTsKLSAgICBqYXZhQ2xhc3MgPSAoSmF2YUhlbHBlcnMpSmF2YUNsYXNzSW1wbC5yZWZsZWN0KHFuYW1lLCByZXNvdXJjZVNldCk7IAotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5QmVhbihTdHJpbmcgcHJveHlCZWFuKQotICB7Ci0gIAl0aGlzLnByb3h5QmVhbiA9IHByb3h5QmVhbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgCXRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLSAgCi0gfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9NYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9NYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDJmNjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLS8qKgotICogQGF1dGhvciBzZW5ncGwKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIERFU0NSSVBUSU9OID0gIlN0YXJ0IFdlYiBQcm9qZWN0IjsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgTEFCRUwgPSAiU2VydmVyU3RhcnRVcE1hbmFnZXIiOwotCXByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkKLQlwcml2YXRlIEJvb2xlYW4gaXNTdGFydFNlcnZpY2VFbmFibGVkXzsKLQlwcml2YXRlIEJvb2xlYW4gaXNUZXN0U2VydmljZUVuYWJsZWRfOwotCQotCXByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3RfOwotCXByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSWRfOwotCXByaXZhdGUgSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotCQotCXByaXZhdGUgSVByb2plY3Qgc2FtcGxlUHJvamVjdF87Ci0JcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlkXzsKLQlwcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotCQotCXByaXZhdGUgYm9vbGVhbiBpc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXzsKLQlwcml2YXRlIFN0cmluZyAgbW9kdWxlTmFtZV87Ci0KLQkvKioKLQkgKiBEZWZhdWx0IENUT1I7Ci0JICovCi0JcHVibGljIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kKCBTdHJpbmcgbW9kdWxlTmFtZSApIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0JCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCQkKLQkJbW9kdWxlTmFtZV8gPSBtb2R1bGVOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0JICovCi0JcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLQl7Ci0JICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotCSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQUk9HUkVTU19JTkZPX1NUQVJUX1dFQl9QUk9KRUNUIikpOwotCSAKLQkgICAgaWYgKGlzU3RhcnRTZXJ2aWNlRW5hYmxlZF8uYm9vbGVhblZhbHVlKCkgJiYgc2VydmljZUV4aXN0aW5nU2VydmVyXyE9bnVsbCl7Ci0JICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ2FsbGluZyBzZXJ2aWNlIHNlcnZlciBzdGFydDogIitzZXJ2aWNlUHJvamVjdF8rIiAgIitzZXJ2aWNlU2VydmVyVHlwZUlkXyk7Ci0JICAgIAlTdGFydFByb2plY3RDb21tYW5kIHNwYyA9IG5ldyBTdGFydFByb2plY3RDb21tYW5kKCBtb2R1bGVOYW1lXyApOwotCSAgICAJc3BjLnNldFNlcnZpY2VQcm9qZWN0KHNlcnZpY2VQcm9qZWN0Xyk7Ci0JICAgIAlzcGMuc2V0U2VydmljZVNlcnZlclR5cGVJRChzZXJ2aWNlU2VydmVyVHlwZUlkXyk7Ci0JICAgIAlzcGMuc2V0U2VydmljZUV4aXN0aW5nU2VydmVyKHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8pOwotCSAgICAJc3BjLnNldElzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQoaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF8pOwotCSAgICAJc3BjLmV4ZWN1dGUoZW52KTsKLQkgICAgfQotCSAgICAKLQkgICAgaWYoaXNUZXN0U2VydmljZUVuYWJsZWRfLmJvb2xlYW5WYWx1ZSgpJiYgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfIT1udWxsICYmIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8hPW51bGwgJiYgIXNhbXBsZUV4aXN0aW5nU2VydmVyXy5lcXVhbHMoc2VydmljZUV4aXN0aW5nU2VydmVyXykpewotCSAgICAJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNhbGxpbmcgY2xpZW50IHNlcnZlciBzdGFydDogIitzYW1wbGVQcm9qZWN0XysiICAiK3NhbXBsZUV4aXN0aW5nU2VydmVyX18pOwotCSAgICAJU3RhcnRQcm9qZWN0Q29tbWFuZCBzcGMgPSBuZXcgU3RhcnRQcm9qZWN0Q29tbWFuZCggbW9kdWxlTmFtZV8gKTsKLQkgICAgCXNwYy5zZXRTYW1wbGVQcm9qZWN0KHNhbXBsZVByb2plY3RfKTsKLQkgICAgCXNwYy5zZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoc2FtcGxlU2VydmVyVHlwZUlkXyk7Ci0JICAgIAlzcGMuc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfKTsKLQkgICAgCXNwYy5zZXRDcmVhdGlvblNjZW5hcmlvKG5ldyBCb29sZWFuKCJmYWxzZSIpKTsKLQkgICAgCXNwYy5leGVjdXRlKGVudik7CSAgICAJCi0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBzdGF0dXM7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBpc1N0YXJ0U2VydmljZUVuYWJsZWQgVGhlIGlzU3RhcnRTZXJ2aWNlRW5hYmxlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRTZXJ2aWNlKEJvb2xlYW4gaXNTdGFydFNlcnZpY2VFbmFibGVkKSB7Ci0JCXRoaXMuaXNTdGFydFNlcnZpY2VFbmFibGVkXyA9IGlzU3RhcnRTZXJ2aWNlRW5hYmxlZDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGlzVGVzdFNlcnZpY2VFbmFibGVkIFRoZSBpc1Rlc3RTZXJ2aWNlRW5hYmxlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoQm9vbGVhbiBpc1Rlc3RTZXJ2aWNlRW5hYmxlZCkgewotCQl0aGlzLmlzVGVzdFNlcnZpY2VFbmFibGVkXyA9IGlzVGVzdFNlcnZpY2VFbmFibGVkOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2VydmljZUV4aXN0aW5nU2VydmVyIFRoZSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcikgewotCQl0aGlzLnNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlcnZpY2VTZXJ2ZXJUeXBlSWQgVGhlIHNlcnZpY2VTZXJ2ZXJUeXBlSWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJUeXBlSWQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSWQpIHsKLQkJdGhpcy5zZXJ2aWNlU2VydmVyVHlwZUlkXyA9IHNlcnZpY2VTZXJ2ZXJUeXBlSWQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBzZXJ2aWNlUHJvamVjdCBUaGUgc2VydmljZVByb2plY3QgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KSB7Ci0JCXRoaXMuc2VydmljZVByb2plY3RfID0gc2VydmljZVByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzYW1wbGVFeGlzdGluZ1NlcnZlciBUaGUgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhbXBsZUV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXIpIHsKLQkJdGhpcy5zYW1wbGVFeGlzdGluZ1NlcnZlcl8gPSBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNhbXBsZVByb2plY3QgVGhlIHNhbXBsZVByb2plY3QgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoSVByb2plY3Qgc2FtcGxlUHJvamVjdCkgewotCQl0aGlzLnNhbXBsZVByb2plY3RfID0gc2FtcGxlUHJvamVjdDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNhbXBsZVNlcnZlclR5cGVJZCBUaGUgc2FtcGxlU2VydmVyVHlwZUlkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTYW1wbGVTZXJ2ZXJUeXBlSWQoU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJZCkgewotCQl0aGlzLnNhbXBsZVNlcnZlclR5cGVJZF8gPSBzYW1wbGVTZXJ2ZXJUeXBlSWQ7Ci0JfQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gaXNSZXN0YXJ0UHJvamVjdE5lZWRlZCBUaGUgaXNSZXN0YXJ0UHJvamVjdE5lZWRlZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZChib29sZWFuIGlzUmVzdGFydFByb2plY3ROZWVkZWQpIHsKLQkJdGhpcy5pc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkXyA9IGlzUmVzdGFydFByb2plY3ROZWVkZWQ7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUHVibGlzaFByb2plY3RDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1B1Ymxpc2hQcm9qZWN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YThjMTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUHVibGlzaFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgY2xhc3MgUHVibGlzaFByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVElPTiA9ICJQdWJsaXNoIFdlYiBQcm9qZWN0IjsKLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBMQUJFTCAgICAgICA9ICJQdWJsaXNoUHJvamVjdENvbW1hbmQiOwotcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCi1wcml2YXRlIFN0cmluZyBwcm9qZWN0OwotcHJpdmF0ZSBTdHJpbmcgc2VydmVyVHlwZUlEOwotcHJpdmF0ZSBJU2VydmVyIGV4aXN0aW5nU2VydmVyOwotCi0KLS8qKgotICogRGVmYXVsdCBDVE9SOwotICovCi1wdWJsaWMgUHVibGlzaFByb2plY3RDb21tYW5kKCkgewotICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgc2V0TmFtZShMQUJFTCk7ICAKLSAgLy9UT0RPIHNldFJ1bkluV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKGZhbHNlKTsKLX0KLQotLyoqCi0gKiBFeGVjdXRlIHRoZSBjb21tYW5kCi0gKi8KLXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi17Ci0gIAotICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIHRyeQotICB7Ci0gICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLnJlcG9ydCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoICJQUk9HUkVTU19JTkZPX1BVQkxJU0hfV0VCX1BST0pFQ1QiICkgKTsKLSAgICAKLSAgICBpZiAocHJvamVjdCA9PSBudWxsKXsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUFJPSkVDVF9OT1RfRk9VTkQiKSwgU3RhdHVzLkVSUk9SKTsgCi0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQkKLSAgICBJUHJvamVjdCBpUHJvamVjdCA9IChJUHJvamVjdClSZXNvdXJjZVV0aWxzLmZpbmRSZXNvdXJjZShwcm9qZWN0KTsKLSAgICBJU2VydmVyIGluc3RhbmNlID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyRm9yTW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKGlQcm9qZWN0KSwgc2VydmVyVHlwZUlELCBleGlzdGluZ1NlcnZlciwgdHJ1ZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5TVEFOQ0VfTk9UX0ZPVU5EIiksIFN0YXR1cy5FUlJPUik7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgICAgSVN0YXR1cyByZXR1cm5lZFN0YXR1cyA9IGluc3RhbmNlLnB1Ymxpc2goSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgICBzdGF0dXMgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMocmV0dXJuZWRTdGF0dXMpOwotICAgICAgCi0gICAgICAvL2dldFN0YXR1c01vbml0b3IoKS5yZXBvcnRTdGF0dXMgKGluc3RhbmNlLnB1Ymxpc2goZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpKTsKLSAgICAgIGVudi5nZXRMb2coKS5sb2coTG9nLk9LLCA1MDI2LCB0aGlzLCAiZXhlY3V0ZSIsIG5ldyBTdHJpbmcoInByb2plY3Q9Iitwcm9qZWN0KyIgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZCIpKTsKLSAgICAgIC8vTG9nLndyaXRlKFB1Ymxpc2hQcm9qZWN0Q29tbWFuZC5jbGFzcywiZXhlY3V0ZSIsTG9nLk9LLCJwcm9qZWN0PSIrcHJvamVjdCsiIHN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQiKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QVUJMSVNIIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci0KLSAgfQotfQotCi0KLXB1YmxpYyB2b2lkIHNldFByb2plY3QoU3RyaW5nIHByb2plY3QpCi17Ci0gIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNlcnZlclR5cGVJRChTdHJpbmcgc2VydmVyVHlwZUlEKQotewotICB0aGlzLnNlcnZlclR5cGVJRCA9IHNlcnZlclR5cGVJRDsKLX0KLQotcHVibGljIHZvaWQgc2V0RXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBleGlzdGluZ1NlcnZlcikKLXsKLSAgdGhpcy5leGlzdGluZ1NlcnZlciA9IGV4aXN0aW5nU2VydmVyOwotfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9SZXN0b3JlQnVpbGRTdGF0ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vUmVzdG9yZUJ1aWxkU3RhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODI2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9SZXN0b3JlQnVpbGRTdGF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGUuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFJlc3RvcmVCdWlsZFN0YXRlQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlcl87Ci0gIAotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dFQlNFUlZJQ0VfUkVTVE9SRV9CVUlMRCI7Ci0gIHByaXZhdGUgU3RyaW5nIERFU0NSSVBUSU9OID0gIlRBU0tfREVTQ19XRUJTRVJWSUNFX1JFU1RPUkVfQlVJTEQiOwotICAvKioKLSAgICogRGVmYXVsdCBDVE9SOwotICAgKi8KLSAgcHVibGljIFJlc3RvcmVCdWlsZFN0YXRlQ29tbWFuZCgpCi0gIHsKLSAgICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQotICAgIHNldE5hbWUobXNnVXRpbHNfLmdldE1lc3NhZ2UoTEFCRUwpKTsKLSAgICBzZXREZXNjcmlwdGlvbihtc2dVdGlsc18uZ2V0TWVzc2FnZShERVNDUklQVElPTikpOyAgICAKLQotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUQVNLX0RFU0NfV0VCU0VSVklDRV9SRVNUT1JFX0JVSUxEIikpOwotCi0gICAgbWFuYWdlcl8ucmVzdG9yZUF1dG9CdWlsZCgpOwotCi0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcGFyYW0gbWFuYWdlcl8gVGhlIG1hbmFnZXJfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25NYW5hZ2VyKFZhbGlkYXRpb25NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICB0aGlzLm1hbmFnZXJfID0gbWFuYWdlcjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVWYWxpZGF0aW9uU3RhdGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1Jlc3RvcmVWYWxpZGF0aW9uU3RhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZjU0ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9SZXN0b3JlVmFsaWRhdGlvblN0YXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC52YWxpZGF0ZS5WYWxpZGF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgUmVzdG9yZVZhbGlkYXRpb25TdGF0ZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0gIHByaXZhdGUgVmFsaWRhdGlvbk1hbmFnZXIgbWFuYWdlcl87Ci0gIAotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJUQVNLX0xBQkVMX1dFQlNFUlZJQ0VfUkVTVE9SRV9WQUxJREFUSU9OIjsKLSAgcHJpdmF0ZSBTdHJpbmcgREVTQ1JJUFRJT04gPSAiVEFTS19ERVNDX1dFQlNFUlZJQ0VfUkVTVE9SRV9WQUxJREFUSU9OIjsgIAotCi0gIHByaXZhdGUgYm9vbGVhbiBydW5WYWxpZGF0aW9uXzsKLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SOwotICAgKi8KLSAgcHVibGljIFJlc3RvcmVWYWxpZGF0aW9uU3RhdGVDb21tYW5kKCBib29sZWFuIHJ1blZhbGlkYXRpb24gKQotICB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0KLSAgICBzZXROYW1lKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKExBQkVMKSk7Ci0gICAgc2V0RGVzY3JpcHRpb24obXNnVXRpbHNfLmdldE1lc3NhZ2UoREVTQ1JJUFRJT04pKTsgCi0gICAgcnVuVmFsaWRhdGlvbl8gPSBydW5WYWxpZGF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUQVNLX0RFU0NfV0VCU0VSVklDRV9SRVNUT1JFX1ZBTElEQVRJT04iKSk7Ci0KLSAgICBtYW5hZ2VyXy5yZXN0b3JlVmFsaWRhdGlvbkZvclByb2plY3RzKCBydW5WYWxpZGF0aW9uXyApOyAgICAKLQotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAgIAotICAvKioKLSAgICogQHBhcmFtIG1hbmFnZXIgVGhlIHZhbGlkYXRpb24gbWFuYWdlciB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uTWFuYWdlcihWYWxpZGF0aW9uTWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgdGhpcy5tYW5hZ2VyXyA9IG1hbmFnZXI7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzc5Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQotICBwcml2YXRlIFN0cmluZyBMQUJFTCA9ICJTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQiOwotICBwcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJFbnN1cmUgRGVwbG95YWJsZSBpcyBhZGRlZCB0byBTZXJ2ZXIgQ29uZmlndXJhdGlvbiI7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgcHJpdmF0ZSBCb29sZWFuIGNyZWF0aW9uU2NlbmFyaW9fID0gQm9vbGVhbi5UUlVFOwotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkc187Ci0gIHByaXZhdGUgSVByb2plY3Qgc2VydmljZVByb2plY3RfOwotICBwcml2YXRlIElQcm9qZWN0IHNhbXBsZVByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlU2VydmVyVHlwZUlEXzsKLSAgcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci0gIHByaXZhdGUgSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcl87Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VQcm9qZWN0VVJMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2FtcGxlUHJvamVjdFVSTF87Ci0gIAotICAvL2FkZGVkUHJvamVjdFRvU2VydmVyXyBpcyBzZXQgdG8gdHJ1ZSBpZgotICAvLy0gdGhlIHByb2plY3QgZXhpc3RzIEFORAotICAvLy0gdGhlIHNlcnZlciBleGlzdHMgKGkuZS4gdGhpcyBjb21tYW5kIGRpZCBub3QgY3JlYXRlIGl0KSBBTkQKLSAgLy8tIHRoaXMgY29tbWFuZCBhZGRlZCB0aGUgcHJvamVjdCB0byB0aGUgc2VydmVyCi0gIHByaXZhdGUgYm9vbGVhbiBhZGRlZFByb2plY3RUb1NlcnZlcl8gPSBmYWxzZTsKLQotICAvKioKLSAgICogRGVmYXVsdCBDVE9SCi0gICAqLwotICBwdWJsaWMgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kKCkgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgICBzZXROYW1lKExBQkVMKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWZhdWx0IENUT1IKLSAgICovCi0gIHB1YmxpYyBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQoYm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvKSB7Ci0gICAgU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiI7Ci0gICAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gICAgc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICAgIHNldE5hbWUoTEFCRUwpOwotICAgIGNyZWF0aW9uU2NlbmFyaW9fID0gbmV3IEJvb2xlYW4oY3JlYXRpb25TY2VuYXJpbyk7Ci0gIH0KLQotICAvKioKLSAgICogZXhlY3V0ZQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikgewotCi0JICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZCIpOwotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB0cnkgewotCi0gICAgICBpZiAoIShjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotCi0gICAgICAvLyBkZXRlcm1pbmUgY2xpZW50IG9yIHNlcnZpY2UgcHJvamVjdAotICAgICAgSVByb2plY3QgcHJvamVjdCA9ICgoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpID8gc2VydmljZVByb2plY3RfIDogc2FtcGxlUHJvamVjdF8pOwotICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQotICAgICAgc2FtcGxlU2VydmVyVHlwZUlEXyA9IGNsaWVudElkc18uZ2V0U2VydmVySWQoKTsKLSAgICAgIAotICAgICAgLy8gZGV0ZXJtaW5lIHNlcnZpY2Ugb3Igc2FtcGxlIHNlcnZlciBmYWN0b3J5IElkCi0gICAgICBTdHJpbmcgc2VydmVyRmFjdG9yeUlkID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlU2VydmVyVHlwZUlEXyA6IHNhbXBsZVNlcnZlclR5cGVJRF8pOwotCi0gICAgICAvLyBnZXQgYW4gSVNlcnZlciBvYmplY3Q7IGVpdGhlciBleGlzdGluZyBvciBjcmVhdGUgb25lCi0gICAgICBJU2VydmVyIHNlcnZlciA9ICgoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpID8gc2VydmljZUV4aXN0aW5nU2VydmVyXyA6IHNhbXBsZUV4aXN0aW5nU2VydmVyXyk7Ci0gICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKLSAgICAgIAkvLyBmaW5kIGV4YWN0IHNlcnZlciBmb3IgZ2l2ZW4gcHJvamVjdAotICAgICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZFNlcnZlciA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICBpZiAoc2VydmVyc1tpXS5lcXVhbHMoc2VydmVyKSkKLSAgICAgICAgICAgIGZvdW5kU2VydmVyID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kU2VydmVyKSB7Ci0gICAgICAgICAgU3RhdHVzIG1tU3RhdHVzID0gU2VydmVyVXRpbHMuZ2V0SW5zdGFuY2UoKS5tb2RpZnlNb2R1bGVzKGVudiwgc2VydmVyLCBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgdHJ1ZSwgRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudikpOwotICAgICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgIAlyZXR1cm4gbW1TdGF0dXM7ICAgICAgICAgICAgCi0gICAgICAgICAgYWRkZWRQcm9qZWN0VG9TZXJ2ZXJfID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGlmICghKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSAmJiBzZXJ2aWNlU2VydmVyVHlwZUlEXyA9PSBzYW1wbGVTZXJ2ZXJUeXBlSURfKSAvL0NsaWVudAotICAgICAgICB7Ci0gICAgICAgICAgc2VydmVyID0gc2VydmljZUV4aXN0aW5nU2VydmVyXzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBzZXJ2ZXIgPSBTZXJ2ZXJVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZVNlcnZlcihlbnYsIFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpLCBzZXJ2ZXJGYWN0b3J5SWQsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKLSAgICAgICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0NSRUFURV9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgaWYgbW9kdWxlIGlzIGFscmVhZHkgYXNzb2NpYXRlZAotICAgICAgICBJTW9kdWxlW10gcGFyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgICAgIGlmIChwYXJlbnRNb2R1bGVzIT1udWxsICYmIHBhcmVudE1vZHVsZXMubGVuZ3RoIT0wKSB7Ci0gICAgICAgICAgaWYgKCFTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpKSB7ICAgICAgICAKLSAgICAgICAgICAgIFN0YXR1cyBtbVN0YXR1cyA9IFNlcnZlclV0aWxzLmdldEluc3RhbmNlKCkubW9kaWZ5TW9kdWxlcyhlbnYsIHNlcnZlciwgUmVzb3VyY2VVdGlscy5nZXRNb2R1bGUocHJvamVjdCksIHRydWUsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgICAgICAgIGlmIChtbVN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAgICAgIHJldHVybiBtbVN0YXR1czsgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vCi0gICAgICBTdHJpbmcgcHJvamVjdFVSTCA9IFJlc291cmNlVXRpbHMuZ2V0V2ViUHJvamVjdFVSTChwcm9qZWN0LCBzZXJ2ZXJGYWN0b3J5SWQsIHNlcnZlcik7Ci0gICAgICBpZiAoY3JlYXRpb25TY2VuYXJpb18uYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgc2VydmljZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZlcjsKLSAgICAgICAgc2VydmljZVByb2plY3RVUkxfID0gcHJvamVjdFVSTDsKLSAgICAgICAgaWYgKHNlcnZpY2VTZXJ2ZXJUeXBlSURfLmVxdWFscyhzYW1wbGVTZXJ2ZXJUeXBlSURfKSAmJiBjbGllbnRJZHNfLmdldFNlcnZlckluc3RhbmNlSWQoKT09bnVsbCl7Ci0gICAgICAgIAlzYW1wbGVFeGlzdGluZ1NlcnZlcl8gPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmVyOwotICAgICAgICBzYW1wbGVQcm9qZWN0VVJMXyA9IHByb2plY3RVUkw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQkFEX1NFUlZFUl9DT05GSUciKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoSVByb2plY3Qgc2VydmljZVByb2plY3QpIHsKLSAgICBzZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoSVByb2plY3Qgc2FtcGxlUHJvamVjdCkgewotICAgIHNhbXBsZVByb2plY3RfID0gc2FtcGxlUHJvamVjdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQpIHsKLSAgICBzZXJ2aWNlU2VydmVyVHlwZUlEXyA9IHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTYW1wbGVTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNhbXBsZVNlcnZlclR5cGVJRCkgewotICAgIHNhbXBsZVNlcnZlclR5cGVJRF8gPSBzYW1wbGVTZXJ2ZXJUeXBlSUQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIpIHsKLSAgICBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfID0gc2VydmljZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2VydmljZUV4aXN0aW5nU2VydmVyKCkgewotICAgIHJldHVybiBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQoKSB7Ci0JU3RyaW5nIGlkID0gbnVsbDsKLQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCi0JaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8hPW51bGwpewotCSAgd2MgPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JICBpZCA9ICh3YyE9bnVsbCA/IHdjLmdldElkKCkgOiBudWxsKTsKLQl9Ci0KLQlyZXR1cm4gaWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNhbXBsZUV4aXN0aW5nU2VydmVySW5zdElkKCl7Ci0JU3RyaW5nIGlkID0gbnVsbDsKLQlJU2VydmVyV29ya2luZ0NvcHkgd2MgPSBudWxsOwotCWlmIChzYW1wbGVFeGlzdGluZ1NlcnZlcl8hPW51bGwpewotCSAgd2MgPSBzYW1wbGVFeGlzdGluZ1NlcnZlcl8uY3JlYXRlV29ya2luZ0NvcHkoKTsKLQkgIGlkID0gKHdjIT1udWxsID8gd2MuZ2V0SWQoKSA6IG51bGwpOwotCX0KLQotCXJldHVybiBpZDsKLQkKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBzYW1wbGVFeGlzdGluZ1NlcnZlcikgewotICAgIHNhbXBsZUV4aXN0aW5nU2VydmVyXyA9IHNhbXBsZUV4aXN0aW5nU2VydmVyOwotICB9Ci0KLSAgcHVibGljIElTZXJ2ZXIgZ2V0U2FtcGxlRXhpc3RpbmdTZXJ2ZXIoKSB7Ci0gICAgcmV0dXJuIHNhbXBsZUV4aXN0aW5nU2VydmVyXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVByb2plY3RVUkwoKSB7Ci0gICAgcmV0dXJuIHNlcnZpY2VQcm9qZWN0VVJMXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlUHJvamVjdFVSTCgpIHsKLSAgICByZXR1cm4gc2FtcGxlUHJvamVjdFVSTF87Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKFR5cGVSdW50aW1lU2VydmVyIGNsaWVudElkKXsKLSAgCXRoaXMuY2xpZW50SWRzXyA9IGNsaWVudElkOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBhZGRlZFByb2plY3RUb1NlcnZlcl8uCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGdldEFkZGVkUHJvamVjdFRvU2VydmVyKCkgewotICAgIHJldHVybiBhZGRlZFByb2plY3RUb1NlcnZlcl87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRQcm9qZWN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFByb2plY3RDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDA2YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tYW5kL2NvbW1vbi9TdGFydFByb2plY3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb24uV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdGFydFByb2plY3RDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0KLXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBERVNDUklQVElPTiA9ICJTdGFydCBXZWIgUHJvamVjdCI7Ci1wcml2YXRlIGphdmEubGFuZy5TdHJpbmcgTEFCRUwgPSAiU3RhcnRQcm9qZWN0Q29tbWFuZCI7Ci1wcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLXByaXZhdGUgQm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvXyA9IEJvb2xlYW4uVFJVRTsKLQotcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfOwotcHJpdmF0ZSBJUHJvamVjdCBzZXJ2aWNlUHJvamVjdF87Ci1wcml2YXRlIElQcm9qZWN0IHNhbXBsZVByb2plY3RfOwotcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRF87Ci1wcml2YXRlIFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSURfOwotcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcl87Ci1wcml2YXRlIElTZXJ2ZXIgc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfOwotcHJpdmF0ZSBTdHJpbmcgIG1vZHVsZU5hbWVfOwotCi0vLyBybSBwcml2YXRlIE1vZGVsIG1vZGVsXzsKLQotLyoqCi0gKiBEZWZhdWx0IENUT1I7Ci0gKi8KLXB1YmxpYyBTdGFydFByb2plY3RDb21tYW5kKCBTdHJpbmcgbW9kdWxlTmFtZSApIHsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0Jc2V0TmFtZShMQUJFTCk7ICAgIAotICAgIC8vVE9ETyBzZXRSdW5JbldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbihmYWxzZSk7Ci0JCi0JbW9kdWxlTmFtZV8gPSBtb2R1bGVOYW1lOwotfQotCi0vKioKLSAqIERlZmF1bHQgQ1RPUjsKLSAqLwotcHVibGljIFN0YXJ0UHJvamVjdENvbW1hbmQoYm9vbGVhbiBjcmVhdGlvblNjZW5hcmlvICkgewotCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLQlzZXROYW1lKExBQkVMKTsKLQkKLQkvL1RPRE8gc2V0UnVuSW5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oZmFsc2UpOwotCWNyZWF0aW9uU2NlbmFyaW9fID0gbmV3IEJvb2xlYW4oY3JlYXRpb25TY2VuYXJpbyk7Ci19Ci0KLS8qKgotICogRXhlY3V0ZSB0aGUgY29tbWFuZAotICovCi1wdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotewotICAgIAotICAKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkucmVwb3J0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQUk9HUkVTU19JTkZPX1NUQVJUX1dFQl9QUk9KRUNUIikpOwotICAgIAotICAgIAotICAgIElQcm9qZWN0IHByb2plY3QgPSAoKGNyZWF0aW9uU2NlbmFyaW9fLmJvb2xlYW5WYWx1ZSgpKSA/IHNlcnZpY2VQcm9qZWN0XyA6IHNhbXBsZVByb2plY3RfKTsKLSAgICBTdHJpbmcgc2VydmVyVHlwZUlEID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlU2VydmVyVHlwZUlEXyA6IHNhbXBsZVNlcnZlclR5cGVJRF8pOwotICAgIElTZXJ2ZXIgc2VydmVyID0gKChjcmVhdGlvblNjZW5hcmlvXy5ib29sZWFuVmFsdWUoKSkgPyBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJfIDogc2FtcGxlRXhpc3RpbmdTZXJ2ZXJfKTsgICAKLSAgICBpZiAoc2VydmVyVHlwZUlEID09IG51bGwgJiYgc2VydmVyIT1udWxsKSB7Ci0gICAgCXNlcnZlclR5cGVJRCA9IHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKTsKLSAgICB9Ci0gICAgaWYgKHByb2plY3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BST0pFQ1RfTk9UX0ZPVU5EIiksIFN0YXR1cy5FUlJPUik7ICAKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQkKLSAgICBJU2VydmVyIGluc3RhbmNlID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyRm9yTW9kdWxlKFNlcnZlclV0aWxzLmdldE1vZHVsZShwcm9qZWN0LCBtb2R1bGVOYW1lXyksIHNlcnZlclR5cGVJRCwgc2VydmVyLCB0cnVlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlNUQU5DRV9OT1RfRk9VTkQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICB0cnkKLSAgIAl7Ci0gICAJCUFic3RyYWN0U3RhcnRTZXJ2ZXIgc3RhcnRTZXJ2ZXJDb21tYW5kID0gbnVsbDsKLSAgIAkJV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgcmVnID0gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgCXN0YXJ0U2VydmVyQ29tbWFuZCA9IChBYnN0cmFjdFN0YXJ0U2VydmVyKXJlZy5nZXRTZXJ2ZXJTdGFydEJ5VHlwZUlkKGluc3RhbmNlLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKLSAgICAJc3RhcnRTZXJ2ZXJDb21tYW5kLlN0YXJ0U2VydmVyKHByb2plY3QsIGluc3RhbmNlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSwgaXNXZWJQcm9qZWN0U3RhcnR1cFJlcXVlc3RlZF8pOwotICAgIAlyZXR1cm4gc3RhdHVzOwotICAgCX0KLSAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UgKQotICAJewotICAgIAlJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgCXN0YXR1cyA9IEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhlbWJlZGRlZFN0YXR1cyk7Ci0gICAgCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgCQlyZXR1cm4gc3RhdHVzOwotICAJfQotICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgCXsKLSAgICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgIAkgICByZXR1cm4gc3RhdHVzOwotICAgCX0KLSAgIAotfQotCi1wdWJsaWMgdm9pZCBzZXRDcmVhdGlvblNjZW5hcmlvKEJvb2xlYW4gY3JlYXRpb25TY2VuYXJpbykKLXsKLQljcmVhdGlvblNjZW5hcmlvXyA9IGNyZWF0aW9uU2NlbmFyaW87Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0KQotewotICBzZXJ2aWNlUHJvamVjdF8gPSBzZXJ2aWNlUHJvamVjdDsKLX0KLQotcHVibGljIHZvaWQgc2V0U2FtcGxlUHJvamVjdChJUHJvamVjdCBzYW1wbGVQcm9qZWN0KQotewotICBzYW1wbGVQcm9qZWN0XyA9IHNhbXBsZVByb2plY3Q7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNlcnZpY2VTZXJ2ZXJUeXBlSUQoU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQpCi17Ci0gIHNlcnZpY2VTZXJ2ZXJUeXBlSURfID0gc2VydmljZVNlcnZlclR5cGVJRDsKLX0KLQotcHVibGljIHZvaWQgc2V0U2FtcGxlU2VydmVyVHlwZUlEKFN0cmluZyBzYW1wbGVTZXJ2ZXJUeXBlSUQpCi17Ci0gIHNhbXBsZVNlcnZlclR5cGVJRF8gPSBzYW1wbGVTZXJ2ZXJUeXBlSUQ7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcikKLXsKLSAgc2VydmljZUV4aXN0aW5nU2VydmVyXyA9IHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgaWYgKHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8gIT0gbnVsbCkKLSAgICBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKHNlcnZpY2VFeGlzdGluZ1NlcnZlcl8uZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRTYW1wbGVFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNhbXBsZUV4aXN0aW5nU2VydmVyKQotewotICBzYW1wbGVFeGlzdGluZ1NlcnZlcl8gPSBzYW1wbGVFeGlzdGluZ1NlcnZlcjsKLSAgaWYgKHNhbXBsZUV4aXN0aW5nU2VydmVyXyAhPSBudWxsKQotICAgIHNldFNhbXBsZVNlcnZlclR5cGVJRChzYW1wbGVFeGlzdGluZ1NlcnZlcl8uZ2V0U2VydmVyVHlwZSgpLmdldElkKCkpOwotfQotCi1wdWJsaWMgdm9pZCBzZXRJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkKGJvb2xlYW4gd2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQpCi17Ci0gIGlzV2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWRfID0gd2ViUHJvamVjdFN0YXJ0dXBSZXF1ZXN0ZWQ7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRTZXJ2ZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0U2VydmVyQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODEzN2Y1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRTZXJ2ZXJDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLS8qKgotICogKFJlKVN0YXJ0cyBhbmQgcHVibGlzaGVzIHRoZSBzZXJ2ZXIgc3BlY2lmZWQgYnkgdGhlIHNlcnZlckluc3RhbmNlSWQgYXR0cmlidXRlLgotICogCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3RhcnRTZXJ2ZXJDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgREVTQ1JJUFRJT04gPSAiKFJlKVN0YXJ0IGFuZCBwdWJsaXNoIHRoZSBzZXJ2ZXIiOwotICBwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgTEFCRUwgPSAiU3RhcnRTZXJ2ZXJDb21tYW5kIjsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICBwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLSAgcHJpdmF0ZSBMb2cgbG9nOwotICAKLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkOwotCQotICAKLQlwdWJsaWMgU3RhcnRTZXJ2ZXJDb21tYW5kKCkKLSAgewotICAgIFN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotICAgIG1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotICAgIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgICBzZXROYW1lKExBQkVMKTsKLSAgICBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotICB9Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgIElTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlckluc3RhbmNlSWQpOwotICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOU1RBTkNFX05PVF9GT1VORCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBtb25pdG9yID0gRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudik7Ci0gICAgaW50IHNlcnZlclN0YXRlID0gc2VydmVyLmdldFNlcnZlclN0YXRlKCk7Ci0gICAgaW50IHB1Ymxpc2hTdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJQdWJsaXNoU3RhdGUoKTsKLSAgICAKLSAgICAvL1B1Ymxpc2ggaWYgcmVxdWlyZWQKLSAgICBzd2l0Y2ggKHB1Ymxpc2hTdGF0ZSkKLSAgICB7Ci0gICAgICBjYXNlIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9JTkNSRU1FTlRBTDoKLSAgICAgICAgaWYgKHNlcnZlci5jYW5QdWJsaXNoKCkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gcHVibGlzaChzZXJ2ZXIsIElTZXJ2ZXIuUFVCTElTSF9JTkNSRU1FTlRBTCk7Ci0gICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9GVUxMOgotICAgICAgICBpZiAoc2VydmVyLmNhblB1Ymxpc2goKS5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXMgPSBwdWJsaXNoKHNlcnZlciwgSVNlcnZlci5QVUJMSVNIX0ZVTEwpOwotICAgICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgICAgewotICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgY2FzZSBJU2VydmVyLlBVQkxJU0hfU1RBVEVfVU5LTk9XTjoKLSAgICAgICAgaWYgKHNlcnZlci5jYW5QdWJsaXNoKCkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gcHVibGlzaChzZXJ2ZXIsIElTZXJ2ZXIuUFVCTElTSF9DTEVBTik7Ci0gICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5FUlJPUikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsgIAotICAgICAgICAKLSAgICAgICAgZGVmYXVsdDoKLSAgICB9Ci0KLQotICAgIHN3aXRjaCAoc2VydmVyU3RhdGUpCi0gICAgewotICAgICAgY2FzZSBJU2VydmVyLlNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgIGlmIChzZXJ2ZXIuY2FuU3RhcnQoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpLmdldFNldmVyaXR5KCk9PUlTdGF0dXMuT0spCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0dXMgPSBzdGFydChzZXJ2ZXIpOwotICAgICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgICAgewotICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICB9ICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJU2VydmVyLlNUQVRFX1NUQVJURUQ6Ci0gICAgICAgIC8vUmVzdGFydCB0aGUgc2VydmVyIGlmIG5lZWRlZAotICAgICAgICBpZiAocHVibGlzaFN0YXRlICE9IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FICYmIHNlcnZlci5jYW5SZXN0YXJ0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKS5nZXRTZXZlcml0eSgpPT1JU3RhdHVzLk9LKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhdHVzID0gcmVzdGFydChzZXJ2ZXIpOwotICAgICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IpCi0gICAgICAgICAgewotICAgICAgICAgICAgZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICB9ICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgcHVibGlzaChJU2VydmVyIHNlcnZlciwgaW50IGtpbmQpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgbW9uaXRvci5zdWJUYXNrKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQUk9HUkVTU19JTkZPX1BVQkxJU0hJTkdfU0VSVkVSIikpOwotICAgIElTdGF0dXMgaXN0YXR1cyA9IHNlcnZlci5wdWJsaXNoKGtpbmQsIG1vbml0b3IpOwotICAgIGlmIChpc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBFbnZpcm9ubWVudFV0aWxzLmNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoaXN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBsb2cubG9nKExvZy5JTkZPLCA1MDUxLCB0aGlzLCAicHVibGlzaFByb2plY3QiLCAiSVNlcnZlcj0iICsgc2VydmVyICsgIiwgUHVibGlzaCBjb21tYW5kIGNvbXBsZXRlZCIpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICBwcml2YXRlIFN0YXR1cyByZXN0YXJ0KElTZXJ2ZXIgc2VydmVyKQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1vbml0b3Iuc3ViVGFzayhtc2dVdGlsc18uZ2V0TWVzc2FnZSgiUFJPR1JFU1NfSU5GT19TVEFSVElOR19TRVJWRVIiKSk7Ci0gICAgICBzZXJ2ZXIuc3luY2hyb25vdXNSZXN0YXJ0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBtb25pdG9yKTsKLSAgICAgIGxvZy5sb2coTG9nLklORk8sIDUwNTIsIHRoaXMsICJleGVjdXRlIiwgIklTZXJ2ZXI9IiArIHNlcnZlciArICIsIFJlc3RhcnQgY29tbWFuZCBjb21wbGV0ZWQiKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0VSVkVSIiksIFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgc3RhcnQoSVNlcnZlciBzZXJ2ZXIpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbW9uaXRvci5zdWJUYXNrKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJQUk9HUkVTU19JTkZPX1NUQVJUSU5HX1NFUlZFUiIpKTsKLSAgICAgIHNlcnZlci5zeW5jaHJvbm91c1N0YXJ0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBtb25pdG9yKTsKLSAgICAgIGxvZy5sb2coTG9nLklORk8sIDUwNTMsIHRoaXMsICJleGVjdXRlIiwgIklTZXJ2ZXI9IiArIHNlcnZlciArICIsIFN0YXJ0IGNvbW1hbmQgY29tcGxldGVkIik7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIGUpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJbnN0YW5jZUlkKFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkKQotICB7Ci0gICAgdGhpcy5zZXJ2ZXJJbnN0YW5jZUlkID0gc2VydmVySW5zdGFuY2VJZDsKLSAgfQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRUb21jYXRTZXJ2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbWFuZC9jb21tb24vU3RhcnRUb21jYXRTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4YmM0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1hbmQvY29tbW9uL1N0YXJ0VG9tY2F0U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBTdGFydFRvbWNhdFNlcnZlciBleHRlbmRzIEFic3RyYWN0U3RhcnRTZXJ2ZXIgewotCQotCXByb3RlY3RlZCB2b2lkIGFkZEphcnNUb0NsYXNzUGF0aChJU2VydmVyIHRJbnN0YW5jZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZW1vdGVTZXJ2ZXJQYXRoKElTZXJ2ZXIgc2VydmVyKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQotCQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCkgewotCQkJCXNlcnZlci5zeW5jaHJvbm91c1N0b3AoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZvbGRlclJlc291cmNlRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9Gb2xkZXJSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzAzMjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0ZvbGRlclJlc291cmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uQW55RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luOwotCi0KLS8qKgotKiBUaGlzIGlzIGEga2luZCBvZiB7QGxpbmsgRmlsdGVyfSB0aGF0IGFjY2VwdHMgb25seSBvYmplY3RzCi0qIHdoaWNoIGluZGljYXRlIGEgSmF2YSByZXNvdXJjZS4gSW4gcGFydGljdWxhciwgYW55Ci0qIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9IHdob3NlCi0qIHBhdGhuYW1lLCBvciBhbnkgb2JqZWN0IHdob3NlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcwotKiByZXR1cm5lZCBieSA8Y29kZT50b1N0cmluZygpPC9jb2RlPiwgZW5kcyBpbgotKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBvciAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgd2lsbCBiZSBhY2NlcHRlZC4KLSogQWxsIG90aGVyIG9iamVjdHMgd2lsbCBiZSByZWplY3RlZC4KLSovCi1wdWJsaWMgY2xhc3MgRm9sZGVyUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBBbnlGaWx0ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gdGhhdCBmaWx0ZXJzCi0gICogIjxjb2RlPi5qYXZhPC9jb2RlPiIgYW5kICI8Y29kZT4uY2xhc3M8L2NvZGU+IiBvYmplY3RzLgotICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyKEFMTF9GSUxFUyk8L2NvZGU+LgotICAqLwotICBwdWJsaWMgRm9sZGVyUmVzb3VyY2VGaWx0ZXIgKCkgeyB9Ci0KLSAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGT0xERVJfRklMVEVSX05BTUUiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZPTERFUl9GSUxURVJfREVTQyIpOwotICB9Ci0KLSBwdWJsaWMgSVN0YXR1cyBzdGF0dXNPZiAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRklMVEVSX01TR19FUlJPUl9OVUxMX09CSkVDVCIpLAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRk9MREVSKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgICAwLAotICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRklMVEVSX01TR19FUlJPUl9OT1RfRk9MREVSIixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgICBudWxsCi0gICAgICAgICk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELDAsIiIsbnVsbCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gYWNjZXB0c05hbWUgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vSVNlcnZlckRlZmF1bHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vSVNlcnZlckRlZmF1bHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFmMWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0lTZXJ2ZXJEZWZhdWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLQotLyoqCi0gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gcHJvdmlkZSBsb2dpYyB0aGF0IGNhbiBiZSBwbHVnZ2VkIGludG8KLSAqIHRoZSBzZXJ2ZXIgZGVmYXVsdGluZyBhbGdvcml0aG0uIAotICogKFNlZSB0aGUgb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnNlcnZlckRlZmF1bHRlciBleHRlbnNpb24gcG9pbnQpICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VydmVyRGVmYXVsdGVyCi17Ci0gIAotICAvKioKLSAgICogQHBhcmFtIHByb2plY3QKLSAgICogQHJldHVybiBTZXJ2ZXJJbmZvLiAKLSAgICogSWYgbm8gZXhpc3Rpbmcgc2VydmVyIG9yIHNlcnZlciB0eXBlIGlzIHJlY29tbWVuZGVkLCByZXR1cm4gbnVsbC4KLSAgICogSWYgYSBzZXJ2ZXIgdHlwZSBpcyByZWNvbW1lbmRlZCwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIFNlcnZlckluZm8gd2l0aCBhIG5vbi1udWxsCi0gICAqIG5vbi1lbXB0eSBTdHJpbmcgZm9yIHRoZSBzZXJ2ZXJGYWN0b3J5SWQgYW5kIG51bGwgZm9yIHRoZSBzZXJ2ZXJJbnN0YW5jZUlkLgotICAgKiBJZiBhIHNlcnZlciBpbnN0YW5jZSBpcyByZWNvbW1lbmRlZCwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIFNlcnZlckluZm8gd2l0aCBhIG5vbi1udWxsCi0gICAqIG5vbi1lbXB0eSBTdHJpbmcgZm9yIHRoZSBzZXJ2ZXJGYWN0b3J5SWQgYW5kIHRoZSBzZXJ2ZXJJbnN0YW5jZUlkLgotICAgKi8KLSAgcHVibGljIFNlcnZlckluZm8gcmVjb21tZW5kRGVmYXVsdFNlcnZlcihJUHJvamVjdCBwcm9qZWN0KTsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9KYXZhUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0phdmFSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0ZjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL0phdmFSZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5BbnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBraW5kIG9mIHtAbGluayBGaWx0ZXJ9IHRoYXQgYWNjZXB0cyBvbmx5IG9iamVjdHMKLSogd2hpY2ggaW5kaWNhdGUgYSBKYXZhIHJlc291cmNlLiBJbiBwYXJ0aWN1bGFyLCBhbnkKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZX0gd2hvc2UKLSogcGF0aG5hbWUsIG9yIGFueSBvYmplY3Qgd2hvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzCi0qIHJldHVybmVkIGJ5IDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LCBlbmRzIGluCi0qICI8Y29kZT4uamF2YTwvY29kZT4iIG9yICI8Y29kZT4uY2xhc3M8L2NvZGU+IiB3aWxsIGJlIGFjY2VwdGVkLgotKiBBbGwgb3RoZXIgb2JqZWN0cyB3aWxsIGJlIHJlamVjdGVkLgotKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBBbnlGaWx0ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBBIDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gY29uc3RydWN0ZWQgd2l0aCB0aGlzIHZhbHVlIHdpbGwKLSAgKiBhY2NlcHQgIjxjb2RlPi5qYXZhPC9jb2RlPiIsIGJ1dCBub3QgIjxjb2RlPi5jbGFzczwvY29kZT4iLCBvYmplY3RzLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgSkFWQV9GSUxFUyA9IChieXRlKTE7Ci0KLSAgLyoqCi0gICogQSA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXI8L2NvZGU+IGNvbnN0cnVjdGVkIHdpdGggdGhpcyB2YWx1ZSB3aWxsCi0gICogYWNjZXB0ICI8Y29kZT4uY2xhc3M8L2NvZGU+IiwgYnV0IG5vdCAiPGNvZGU+LmphdmE8L2NvZGU+Iiwgb2JqZWN0cy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENMQVNTX0ZJTEVTID0gKGJ5dGUpMjsKLQotICAvKioKLSAgKiBBIDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gY29uc3RydWN0ZWQgd2l0aCB0aGlzIHZhbHVlIHdpbGwKLSAgKiBhY2NlcHQgYm90aCAiPGNvZGU+LmphdmE8L2NvZGU+IiBhbmQgIjxjb2RlPi5jbGFzczwvY29kZT4iIG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBBTExfRklMRVMgPSAoYnl0ZSkyNTU7Ci0KLSAgcHJpdmF0ZSBieXRlIGV4dGVuc2lvbnNfOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMKLSAgKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBhbmQgIjxjb2RlPi5jbGFzczwvY29kZT4iIG9iamVjdHMuCi0gICogRXF1aXZhbGVudCB0byA8Y29kZT5KYXZhUmVzb3VyY2VGaWx0ZXIoQUxMX0ZJTEVTKTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBKYXZhUmVzb3VyY2VGaWx0ZXIgKCkKLSAgewotICAgIHRoaXMoQUxMX0ZJTEVTKTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMKLSAgKiAiPGNvZGU+LmphdmE8L2NvZGU+IiBvYmplY3RzLCAiPGNvZGU+LmNsYXNzPC9jb2RlPiIgb2JqZWN0cywKLSAgKiBvciBib3RoIGlmIHRoZSB2YWx1ZSBvZiA8Y29kZT5leHRlbnNpb25zPC9jb2RlPiBpcwotICAqIHtAbGluayAjSkFWQV9GSUxFU30sIHtAbGluayAjQ0xBU1NfRklMRVN9IG9yIHtAbGluayAjQUxMX0ZJTEVTfQotICAqIHJlc3BlY3RpdmVseS4KLSAgKiBAcGFyYW0gZXh0ZW5zaW9ucyBPbmUgb2YKLSAgKiB7QGxpbmsgI0pBVkFfRklMRVN9LCB7QGxpbmsgI0NMQVNTX0ZJTEVTfSBvciB7QGxpbmsgI0FMTF9GSUxFU30uCi0gICovCi0gIHB1YmxpYyBKYXZhUmVzb3VyY2VGaWx0ZXIgKCBieXRlIGV4dGVuc2lvbnMgKQotICB7Ci0gICAgZXh0ZW5zaW9uc18gPSBleHRlbnNpb25zOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlSkFWQV9GSUxURVJfTkFNRSIpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlSkFWQV9GSUxURVJfREVTQyIpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogZGVzY3JpYmluZyB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPidzIGFzc2Vzc21lbnQgb2YKLSAgKiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKiBTZWUge0BsaW5rIEZpbHRlciNzdGF0dXNPZn0gZm9yIGdlbmVyYWwgY29tbWVudHMuCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIEFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30KLSAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGlmIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogcmVwcmVzZW50cyBhIEphdmEgcmVzb3VyY2UuCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGSUxURVJfTVNHX0VSUk9SX05VTExfT0JKRUNUIiksCi0gICAgICAgIG51bGwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKW9iamVjdDsKLSAgICAgIG5hbWUgPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgICAwLAotICAgICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRklMVEVSX01TR19FUlJPUl9OT1RfRklMRSIsbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgICAgbnVsbAotICAgICAgICApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgbmFtZSA9IG9iamVjdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIGlmICghYWNjZXB0c05hbWUobmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVKQVZBX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OIixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLCIiLG51bGwpOwotICB9Ci0KLSAgLy8KLSAgLy8gQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lIGlzIGFjY2VwdGFibGUgYmFzZWQgdXBvbiBpdHMgZXh0ZW5zaW9uCi0gIC8vIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGV4dGVuc2lvbnNfIGJpdG1hc2suCi0gIC8vCi0gIHByaXZhdGUgYm9vbGVhbiBhY2NlcHRzTmFtZSAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIHJldHVybiAoIAotICAgICAgKG5hbWUuZW5kc1dpdGgoIi5qYXZhIikgJiYgKChleHRlbnNpb25zXyAmIEpBVkFfRklMRVMpICE9IDApKSB8fAotICAgICAgKG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpICYmICgoZXh0ZW5zaW9uc18gJiBDTEFTU19GSUxFUykgIT0gMCkpCi0gICAgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vTWFwcGluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9NYXBwaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2NTBlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9NYXBwaW5nVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotCi0KLS8qKgotKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHVzZWZ1bCBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggU2VydmVyIHBsdWdpbiBmdW5jdGlvbnMKLSovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFwcGluZ1V0aWxzCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRV9FWFQgPSAiU2VydmljZS53c2RsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQklORElOR19FWFQgPSAiQmluZGluZy53c2RsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVjRfU0VSVklDRV9FWFQgPSAiLXNlcnZpY2Uud3NkbCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1Y0X0JJTkRJTkdfRVhUID0gIi1iaW5kaW5nLndzZGwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFRFTlNJT04gPSAiLndzZGwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GT0xERVIgPSAid3NkbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0tFTEVUT05fUEFDS0FHRU5BTUUgPSAic2VydmljZSI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgV1NETCBmb2xkZXIgcGF0aAotICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0Ci0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0V1NETEZvbGRlclBhdGggKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wb25lbnROYW1lKQotICB7Ci0gICAgSVBhdGggd3NkbEZvbGRlcj1udWxsOwotLy8gIAlJUGF0aCB3ZWJNb2R1bGVTZXJ2ZXJSb290ID0gUmVzb3VyY2VVdGlscy5nZXRXZWJNb2R1bGVTZXJ2ZXJSb290KCBwcm9qZWN0ICkuZ2V0RnVsbFBhdGgoKTsKLSAgCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0gIAlpZiAod2ViTW9kdWxlU2VydmVyUm9vdCAhPSBudWxsICkKLSAgCQl3c2RsRm9sZGVyID0gd2ViTW9kdWxlU2VydmVyUm9vdC5hcHBlbmQoV1NETF9GT0xERVIpOwotICAgIHJldHVybiB3c2RsRm9sZGVyOwotICB9Ci0gICAgCi0KLSAgIC8qKgotICAqIFJldHVybnMgdGhlIGJhc2UgbmFtZSBiYXNlZCBvbiBXU0RMIGZpbGUgbmFtZQotICAqIEBwYXJhbSB3c2RsTmFtZSBXU0RMIGZpbGUgbmFtZQotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZSAoU3RyaW5nIHdzZGxMb2NhdGlvbiApCi0gIHsKLSAgCVN0cmluZyB3c2RsTmFtZT13c2RsTG9jYXRpb247Ci0gIAkKLSAgCWludCBpbmRleCA9IHdzZGxMb2NhdGlvbi5sYXN0SW5kZXhPZignLycpOwotICAgIGlmIChpbmRleCE9IC0xKSB7Ci0gICAgICB3c2RsTmFtZSA9IHdzZGxMb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXgrMSx3c2RsTmFtZS5sZW5ndGgoKSk7Ci0gICAgfQotICAgIAotICAgIFN0cmluZyBiYXNlTmFtZT13c2RsTmFtZTsKLSAgICBpZiAoIHdzZGxOYW1lLmVuZHNXaXRoKERFRkFVTFRfU0VSVklDRV9FWFQpICkgewotICAgICAgYmFzZU5hbWUgPSB3c2RsTmFtZS5zdWJzdHJpbmcoMCwod3NkbE5hbWUubGVuZ3RoKCkgLSBERUZBVUxUX1NFUlZJQ0VfRVhULmxlbmd0aCgpKSk7Ci0gICAgfSBlbHNlIGlmICggd3NkbE5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChERUZBVUxUX1Y0X1NFUlZJQ0VfRVhUKSApIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpIC0gREVGQVVMVF9WNF9TRVJWSUNFX0VYVC5sZW5ndGgoKSkpOwotICAgIH0gZWxzZSBpZiAod3NkbE5hbWUuZW5kc1dpdGgoREVGQVVMVF9CSU5ESU5HX0VYVCkpIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpLURFRkFVTFRfQklORElOR19FWFQubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgaWYgKHdzZGxOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoREVGQVVMVF9WNF9CSU5ESU5HX0VYVCkpIHsKLSAgICAgIGJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpLURFRkFVTFRfVjRfQklORElOR19FWFQubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgaWYgKHdzZGxOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoV1NETF9FWFRFTlNJT04pKSB7Ci0gICAgCWJhc2VOYW1lID0gd3NkbE5hbWUuc3Vic3RyaW5nKDAsKHdzZGxOYW1lLmxlbmd0aCgpIC0gV1NETF9FWFRFTlNJT04ubGVuZ3RoKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gbm8gcmVjb2duaXphYmxlIHN1ZmZpeCwganVzdCByZW1vdmUgZXh0ZW5zaW9uLCBpZiBhbnkKLSAgICAgIGludCBpbmRleDQgPSBiYXNlTmFtZS5sYXN0SW5kZXhPZignLicpOwotICAgICAgaWYgKGluZGV4NCE9LTEpCi0gICAgICAgIGJhc2VOYW1lID0gYmFzZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4NCk7Ci0gICAgfQotICAgIHJldHVybiBiYXNlTmFtZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9Qcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1Byb3BlcnRpZXNSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZiMmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1Byb3BlcnRpZXNSZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5BbnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBraW5kIG9mIHtAbGluayBGaWx0ZXJ9IHRoYXQgYWNjZXB0cyBvbmx5IG9iamVjdHMKLSogd2hpY2ggaW5kaWNhdGUgYSBKYXZhIHJlc291cmNlLiBJbiBwYXJ0aWN1bGFyLCBhbnkKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZX0gd2hvc2UKLSogcGF0aG5hbWUsIG9yIGFueSBvYmplY3Qgd2hvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzCi0qIHJldHVybmVkIGJ5IDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LCBlbmRzIGluCi0qICI8Y29kZT4uamF2YTwvY29kZT4iIG9yICI8Y29kZT4uY2xhc3M8L2NvZGU+IiB3aWxsIGJlIGFjY2VwdGVkLgotKiBBbGwgb3RoZXIgb2JqZWN0cyB3aWxsIGJlIHJlamVjdGVkLgotKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzUmVzb3VyY2VGaWx0ZXIgZXh0ZW5kcyBBbnlGaWx0ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPkphdmFSZXNvdXJjZUZpbHRlcjwvY29kZT4gdGhhdCBmaWx0ZXJzCi0gICogIjxjb2RlPi5qYXZhPC9jb2RlPiIgYW5kICI8Y29kZT4uY2xhc3M8L2NvZGU+IiBvYmplY3RzLgotICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+SmF2YVJlc291cmNlRmlsdGVyKEFMTF9GSUxFUyk8L2NvZGU+LgotICAqLwotICBwdWJsaWMgUHJvcGVydGllc1Jlc291cmNlRmlsdGVyICgpCi0gIHsKLSAgICAKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVBST1BFUlRJRVNfRklMVEVSX05BTUUiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJVBST1BFUlRJRVNfRklMVEVSX0RFU0MiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogU2VlIHtAbGluayBGaWx0ZXIjc3RhdHVzT2Z9IGZvciBnZW5lcmFsIGNvbW1lbnRzLgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBmaWx0ZXIuCi0gICogQHJldHVybiBBbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBpZiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPgotICAqIHJlcHJlc2VudHMgYSBKYXZhIHJlc291cmNlLgotICAqLwotICBwdWJsaWMgSVN0YXR1cyBzdGF0dXNPZiAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgaWYgKG9iamVjdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlRklMVEVSX01TR19FUlJPUl9OVUxMX09CSkVDVCIpLAotICAgICAgICBudWxsCi0gICAgICApOwotICAgIH0KLQotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICBuYW1lID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgICAgMCwKLSAgICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTk9UX0ZJTEUiLG5ldyBPYmplY3RbXSB7bmFtZX0pLAotICAgICAgICAgIG51bGwKLSAgICAgICAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWUgPSBvYmplY3QudG9TdHJpbmcoKTsKLSAgICB9Ci0KLQlpZiAoIW5hbWUuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoCi0gICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwKLSAgICAgICAgMCwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVQUk9QRVJUSUVTX0ZJTFRFUl9NU0dfRVJST1JfV1JPTkdfRVhURU5TSU9OIixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5JRCwwLCIiLG51bGwpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1NlcnZlckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1NlcnZlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyNWNiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9TZXJ2ZXJJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckluZm8KLXsKLSAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZDsKLSAgU3RyaW5nIHNlcnZlckluc3RhbmNlSWQ7Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckZhY3RvcnlJZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkKCkKLSAgewotICAgIHJldHVybiBzZXJ2ZXJGYWN0b3J5SWQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQgVGhlIHNlcnZlckZhY3RvcnlJZCB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkKLSAgewotICAgIHRoaXMuc2VydmVyRmFjdG9yeUlkID0gc2VydmVyRmFjdG9yeUlkOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckluc3RhbmNlSWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckluc3RhbmNlSWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZlckluc3RhbmNlSWQ7Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2ZXJJbnN0YW5jZUlkIFRoZSBzZXJ2ZXJJbnN0YW5jZUlkIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlckluc3RhbmNlSWQoU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0gIHsKLSAgICB0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XU0RMUGFyc2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV1NETFBhcnNlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMTY1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XU0RMUGFyc2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLS8qKgotICogCi0gKiBUaGUgZmFjdG9yeSBjbGFzcyBjYW4gYmUgdXNlZCB0byBnZXQgYXQgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlCi0gKiBXU0RMIHBhcnNlci4gIE5vdGU6ICBUaGlzIGNsYXNzIGlzIHRlbXBvcmFyeS4gIFdlIHdpbGwgcHJvYmFibHkgY29tZQotICogdXAgd2l0aCBhIGJldHRlciBtZXRob2Qgb2YgaGFuZGxpbmcgcGFzc2luZyBhcm91bmQgdGhlIHBhcnNlci4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUGFyc2VyRmFjdG9yeSAKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZXNQYXJzZXJFeHQgcGFyc2VyXzsKLSAgCi0gIHByaXZhdGUgV1NETFBhcnNlckZhY3RvcnkoKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNQYXJzZXIgZ2V0V1NETFBhcnNlcigpCi0gIHsKLSAgICBpZiggcGFyc2VyXyA9PSBudWxsICkKLQl7Ci0JICBwYXJzZXJfID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyRXh0KCk7Ci0JfQotCQotCXJldHVybiBwYXJzZXJfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2NvbW1vbi9XU0RMUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dTRExSZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODcyZjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dTRExSZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5BbnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnBsdWdpbi5XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW47Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBraW5kIG9mIHtAbGluayBGaWx0ZXJ9IHRoYXQgYWNjZXB0cyBvbmx5IG9iamVjdHMKLSogd2hpY2ggaW5kaWNhdGUgYSBXU0RMIHJlc291cmNlLiBJbiBwYXJ0aWN1bGFyLCBhbnkKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZX0gd2hvc2UKLSogcGF0aG5hbWUsIG9yIGFueSBvYmplY3Qgd2hvc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFzCi0qIHJldHVybmVkIGJ5IDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LCBlbmRzIGluCi0qICI8Y29kZT4ud3NkbDwvY29kZT4iIHdpbGwgYmUgYWNjZXB0ZWQuCi0qIEFsbCBvdGhlciBvYmplY3RzIHdpbGwgYmUgcmVqZWN0ZWQuCi0qLwotcHVibGljIGNsYXNzIFdTRExSZXNvdXJjZUZpbHRlciBleHRlbmRzIEFueUZpbHRlcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+V1NETFJlc291cmNlRmlsdGVyPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIFdTRExSZXNvdXJjZUZpbHRlciAoKQotICB7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVXU0RMX0ZJTFRFUl9OQU1FIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVXU0RMX0ZJTFRFUl9ERVNDIik7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30KLSAgKiBkZXNjcmliaW5nIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+J3MgYXNzZXNzbWVudCBvZgotICAqIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqIFNlZSB7QGxpbmsgRmlsdGVyI3N0YXR1c09mfSBmb3IgZ2VuZXJhbCBjb21tZW50cy4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gQW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgaWYgdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4KLSAgKiByZXByZXNlbnRzIGEgV1NETCByZXNvdXJjZS4KLSAgKi8KLSAgcHVibGljIElTdGF0dXMgc3RhdHVzT2YgKCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0YXR1cygKLSAgICAgICAgSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAwLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uZ2V0TWVzc2FnZSgiJUZJTFRFUl9NU0dfRVJST1JfTlVMTF9PQkpFQ1QiKSwKLSAgICAgICAgbnVsbAotICAgICAgKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgbmFtZSA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICAgIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLklELAotICAgICAgICAgIDAsCi0gICAgICAgICAgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luLmdldE1lc3NhZ2UoIiVGSUxURVJfTVNHX0VSUk9SX05PVF9GSUxFIixuZXcgT2JqZWN0W10ge25hbWV9KSwKLSAgICAgICAgICBudWxsCi0gICAgICAgICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lID0gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIud3NkbCIpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RhdHVzKAotICAgICAgICBJU3RhdHVzLkVSUk9SLAotICAgICAgICBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsCi0gICAgICAgIDAsCi0gICAgICAgIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5nZXRNZXNzYWdlKCIlV1NETF9GSUxURVJfTVNHX0VSUk9SX1dST05HX0VYVEVOU0lPTiIsbmV3IE9iamVjdFtdIHtuYW1lfSksCi0gICAgICAgIG51bGwKLSAgICAgICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSyxXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vY29tbW9uL1dlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwM2JmMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9jb21tb24vV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLQotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSByZWdpc3RyeSBvZiBXZWJTZXJ2aWNlU3RhcnRTZXJ2ZXJUeXBlIG9iamVjdHMuCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5Ci17Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgaW5zdGFuY2VfOwotICBwcml2YXRlIEhhc2h0YWJsZSBTdGFydFNlcnZlclR5cGVzOwotCi0gIC8vCi0gIC8vIExvYWRzIFdlYlNlcnZpY2VTdGFydFNlcnZlclR5cGUgb2JqZWN0cyBpbnRvIHRoaXMgcmVnaXN0cnkuCi0gIC8vIFNlZSBtZXRob2QgZ2V0SW5zdGFuY2UoKS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGxvYWQgKCkKLSAgewotICAgIFN0YXJ0U2VydmVyVHlwZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnID0gcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ViU2VydmljZVN0YXJ0U2VydmVyVHlwZSIpOwotCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotICAgICAgdHJ5IAotICAgICAgewotICAgICAgICAgIFN0cmluZyBmYWN0b3J5SWRfID0gZWxlbS5nZXRBdHRyaWJ1dGUoImZhY3RvcnlJZCIpOwotCQkgIFN0YXJ0U2VydmVyVHlwZXMucHV0KGZhY3RvcnlJZF8sIGVsZW0pOwotCSAgCi0gICAgICB9IAotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBFY2xpcHNlTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0gICAgICAgIGxvZy5sb2coTG9nLkVSUk9SLCA1MDQ3LCB0aGlzLCAibG9hZCIsIGUpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZVN0YXJ0U2VydmVyUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5IGdldEluc3RhbmNlICgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFdlYlNlcnZpY2VTdGFydFNlcnZlclJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8ubG9hZCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgIHB1YmxpYyBPYmplY3QgZ2V0U2VydmVyU3RhcnRCeVR5cGVJZCAoU3RyaW5nIHR5cGVJRCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICBpZiAodHlwZUlEPT1udWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgcmV0dXJuICgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KVN0YXJ0U2VydmVyVHlwZXMuZ2V0KHR5cGVJRCkpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gIH0KLSAgCi0gICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZUVBUlJlcXVpcmVkKFN0cmluZyB0eXBlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgIAlpZiAodHlwZUlkIT1udWxsKSB7Ci0gICAJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtID0gKElDb25maWd1cmF0aW9uRWxlbWVudClTdGFydFNlcnZlclR5cGVzLmdldCh0eXBlSWQpOwotICAgCQlpZiAoZWxlbSE9bnVsbCl7Ci0gICAJCQlTdHJpbmcgdmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZSgicmVtb3ZlRUFSIik7Ci0gICAJCQlpZiAodmFsdWUhPW51bGwpewotICAgCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotICAgCQkJfQotICAgCQl9Ci0gICAJfQotCXJldHVybiB0cnVlOyAgIAkJIAotICAgfSAgIAotfQotCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXJyYXlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXJyYXlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwN2FhNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0FycmF5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuLgotKiBOZWFyZXN0IG1vcmFsIGVxdWl2YWxlbnRzOiBqYXZhLmxhbmcuQ2xhc3MsIGphdmEuYmVhbnMuQmVhbkRlc2NyaXB0b3IuCi0qLwotcHVibGljIGNsYXNzIEFycmF5RWxlbWVudCBleHRlbmRzIFR5cGVFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSUkFZX05BTUUgPSAiMTAxMDEwMTBhcnJheTEwMTAxMDEwIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX01FVEhPRFMgPSAicmVsbWV0aG9kcyI7Ci0gCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIAotICAqIEBwYXJhbSBwcm9qZWN0RWxlbWVudCBUaGUgcHJvamVjdCB0aGlzIEJlYW4gYmVsb25ncyB0by4KLSAgKi8KLSAgcHVibGljIEFycmF5RWxlbWVudCAoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzKG5hbWUsbmV3IEJhc2ljTW9kZWwoIlByb2plY3QiKSx0cnVlKTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIAotICAqIEBwYXJhbSBwYXJhbWV0ZXJFbGVtZW50IFRoZSBwYXJhbWV0ZXIgdGhpcyBCZWFuIGJlbG9uZ3MgdG8uCi0gICovCi0gIHB1YmxpYyBBcnJheUVsZW1lbnQgKFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCxib29sZWFuIGlzUm9vdCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwsVHlwZUVsZW1lbnQuQVJSQVkpOwotICAgIGlmKGlzUm9vdCkgbW9kZWwuc2V0Um9vdEVsZW1lbnQodGhpcyk7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LlJPT1Q7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgYmVhbiBlbGVtZW50LgotICAqLwotICBwdWJsaWMgQXJyYXlFbGVtZW50ICggUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUscGFyYW1ldGVyRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQVJSQVkpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5QQVJBTUVURVJfT1dORVI7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgUGFyYW1ldGVyRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEFycmF5RWxlbWVudCAoIEF0dHJpYnV0ZUVsZW1lbnQgYXR0cmlidXRlRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGF0dHJpYnV0ZUVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LkFSUkFZKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuQVRUUklCVVRFX09XTkVSOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgZm9yIHRoZSBjYXNlIHdoZW4gdGhpcyBpcyBub3QgdGhlIHJvb3Qgb2JqZWN0Ci0gICogaGVyZSBpdCByZXByZXNlbnRzIGNvbXBsZXggdHlwZXMKLSAgKiBAcGFyYW0gRmllbGRFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgUGFyYW1ldGVyRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEFycmF5RWxlbWVudCAoIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxmaWVsZEVsZW1lbnQsVHlwZUVsZW1lbnQuUkVMX09XTkVSLFR5cGVFbGVtZW50LlJFTF9UWVBFLFR5cGVFbGVtZW50LkFSUkFZKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuRklFTERfT1dORVI7Ci0gIH0KLQotCi0gIC8qCi0gICogZGV0ZXJtaW5lIHdldGhlciB0aGlzIGlzIGFuIG9iamVjdCBhcnJheSBvcgotICAqIHByaW1pdGl2ZSBhcnJheQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiBBUlJBWV9OQU1FICsgZ2V0TmFtZSgpOwotICB9Ci0KLSAKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BcnJheVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4YzdlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXJyYXlUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIEFycmF5VHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGZUeXBlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICB0aGlzKFR5cGVGYWN0b3J5LkFSUkFZX05BTUUsdHlwZU5hbWUpOwotICB9Ci0KLSAgcHVibGljIEFycmF5VHlwZShTdHJpbmcgbmFtZSxTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgICBmVHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgfSAKLQotIAotICAgLyoqCi0gICogVGhpcyBpcyBiYXNpY2FsbHkgdGhlIGZ1bmN0aW9uIHRoYXQgZGljdGF0ZXMgaG93IHdlIHdhbnQgdG8gZGlzcGxheSB0aGlzIHR5cGUgCi0gICogdXBvbiByZWNlaXZpbmcgaXQgYXMgYSByZXR1cm4gZnJvbSBhIHByb3h5IG1ldGhvZAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZGlzcGxheSBzdHJpbmcKLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotICAgICAKLSAgICBTdHJpbmcgbm9uQmVhbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudXRpbC5MaXN0IGxpc3QiICsgZ2V0VW5pcXVlTmFtZSgpICsgIj0gamF2YS51dGlsLkFycmF5cy5hc0xpc3QoIiArIG5hbWUgKyAiKTsiICtTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wIisgZ2V0VW5pcXVlTmFtZSgpICsiID0gbGlzdCIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiLnRvU3RyaW5nKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT10ZW1wIisgZ2V0VW5pcXVlTmFtZSgpICsiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIrIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gbm9uQmVhbjsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwNjc5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvQXR0cmlidXRlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4gbWV0aG9kIHBhcmFtZXRlci4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5iZWFucy5QYXJhbWV0ZXJEZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50IGltcGxlbWVudHMgQXR0cmlidXRlRWxlbWVudFR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfVFlQRSA9ICJ0eXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX09XTklOR19CRUFOID0gIm93bmluZ2JlYW4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZTZXR0ZXJNZXRob2Q7Ci0gIHByaXZhdGUgU3RyaW5nIGZHZXR0ZXJNZXRob2Q7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgdGhpcyB0YWtlcyB0aGUgb3duaW5nIGJlYW4uCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgKiBAcGFyYW0gYmVhbkVsZW1lbnQgdGhlIGJlYW4gdGhhdCBvd25zIHRoaXMgYXR0cmlidXRlLgotICAqLwotICBwdWJsaWMgQXR0cmlidXRlRWxlbWVudCAoIEJlYW5FbGVtZW50IGJlYW5FbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYmVhbkVsZW1lbnQsUkVMX09XTklOR19CRUFOLEJlYW5FbGVtZW50LlJFTF9BVFRSSUJVVEVTKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2V0dGVyTWV0aG9kKFN0cmluZyBzZXR0ZXJNZXRob2QpCi0gIHsKLSAgICBmU2V0dGVyTWV0aG9kID0gc2V0dGVyTWV0aG9kOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXR0ZXJNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIGZTZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEdldHRlck1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gZkdldHRlck1ldGhvZDsKLSAgfQotIAotICBwdWJsaWMgdm9pZCBzZXRHZXR0ZXJNZXRob2QoU3RyaW5nIGdldHRlck1ldGhvZCkKLSAgewotICAgIGZHZXR0ZXJNZXRob2QgPSBnZXR0ZXJNZXRob2Q7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNldHRlclNpZ25hdHVyZShTdHJpbmcgYXR0cmlidXRlKQotICB7Ci0gICAgaW50IGJyYWNrZXQgPSBmU2V0dGVyTWV0aG9kLmluZGV4T2YoIigiKTsKLSAgICBicmFja2V0Kys7Ci0gICAgU3RyaW5nIHNldHRlciA9IGZTZXR0ZXJNZXRob2Quc3Vic3RyaW5nKDAsYnJhY2tldCk7Ci0gICAgU3RyaW5nIGZ1bGxTZXR0ZXIgPSBzZXR0ZXIgKyBhdHRyaWJ1dGUgKyAiKTsiOwotICAgCi0gICAgcmV0dXJuIGZ1bGxTZXR0ZXI7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBCZWFuIHRoYXQgb3ducyB0aGlzIEF0dHJpYnV0ZS4KLSAgKiBAcmV0dXJuIEJlYW5FbGVtZW50IFRoZSBiZWFuIHRoYXQgb3ducyB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50IGdldE93bmluZ0JlYW5FbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX09XTklOR19CRUFOKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCZWFuRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgdHlwZSB0aGF0IGlzIG93bmVkIGJ5IHRoaXMgYXR0cmlidXR0ZS4KLSAgKiBAcmV0dXJuIFR5cGVFbGVtZW50IFRoZSBUeXBlIHRoYXQgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBUeXBlRWxlbWVudCBnZXRUeXBlRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9UWVBFKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChUeXBlRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9BdHRyaWJ1dGVFbGVtZW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMGI2ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0F0dHJpYnV0ZUVsZW1lbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4gbWV0aG9kIHBhcmFtZXRlci4KLSogTmVhcmVzdCBtb3JhbCBlcXVpdmFsZW50czogamF2YS5iZWFucy5QYXJhbWV0ZXJEZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlRWxlbWVudFR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXJNZXRob2QoU3RyaW5nIHNldHRlck1ldGhvZCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyTWV0aG9kKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0R2V0dGVyTWV0aG9kKCk7Ci0gIHB1YmxpYyB2b2lkIHNldEdldHRlck1ldGhvZChTdHJpbmcgZ2V0dGVyTWV0aG9kKTsKLSAgcHVibGljIEJlYW5FbGVtZW50IGdldE93bmluZ0JlYW5FbGVtZW50ICgpOwotICBwdWJsaWMgVHlwZUVsZW1lbnQgZ2V0VHlwZUVsZW1lbnQgKCk7Ci0gIC8qKgotICAqIFJldHVybiB0aGUgc2lnbmF0dXJlIHdpdGggdGhpcyB2YWx1ZSBhcyB0aGUgcGFybWV0ZXIKLSAgKgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNldHRlclNpZ25hdHVyZShTdHJpbmcgYXR0cmlidXRlKTsKLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CZWFuRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2RhOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBKYXZhIGJlYW4uCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEubGFuZy5DbGFzcywgamF2YS5iZWFucy5CZWFuRGVzY3JpcHRvci4KLSovCi1wdWJsaWMgY2xhc3MgQmVhbkVsZW1lbnQgZXh0ZW5kcyBUeXBlRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBTVEFURUxFU1NfQkVBTiA9ICIxMDEwMTAxMHN0YXRlbGVzc2JlYW4xMDEwMTAxMCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9NRVRIT0RTID0gInJlbG1ldGhvZHMiOwotIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciAKLSAgKiBAcGFyYW0gcHJvamVjdEVsZW1lbnQgVGhlIHByb2plY3QgdGhpcyBCZWFuIGJlbG9uZ3MgdG8uCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCAoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzKG5hbWUsbmV3IEJhc2ljTW9kZWwoIlByb2plY3QiKSx0cnVlKTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIAotICAqIEBwYXJhbSBwYXJhbWV0ZXJFbGVtZW50IFRoZSBwYXJhbWV0ZXIgdGhpcyBCZWFuIGJlbG9uZ3MgdG8uCi0gICovCi0gIHB1YmxpYyBCZWFuRWxlbWVudCAoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLGJvb2xlYW4gaXNSb290KQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCxUeXBlRWxlbWVudC5CRUFOKTsKLSAgICBpZihpc1Jvb3QpIG1vZGVsLnNldFJvb3RFbGVtZW50KHRoaXMpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5ST09UOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgZm9yIHRoZSBjYXNlIHdoZW4gdGhpcyBpcyBub3QgdGhlIHJvb3Qgb2JqZWN0Ci0gICogaGVyZSBpdCByZXByZXNlbnRzIGNvbXBsZXggdHlwZXMKLSAgKiBAcGFyYW0gUGFyYW1ldGVyRWxlbWVudCBUaGUgUGFyYW1ldGVyIHRoYXQgb3ducyB0aGlzIGJlYW4gdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIGJlYW4gZWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50ICggUGFyYW1ldGVyRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50LCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUscGFyYW1ldGVyRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQkVBTik7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LlBBUkFNRVRFUl9PV05FUjsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2FzZSB3aGVuIHRoaXMgaXMgbm90IHRoZSByb290IG9iamVjdAotICAqIGhlcmUgaXQgcmVwcmVzZW50cyBjb21wbGV4IHR5cGVzCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBiZWFuIHR5cGUuCi0gICogQHBhcmFtIFN0cmluZyBOYW1lIG9mIHRoZSBQYXJhbWV0ZXJFbGVtZW50LgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgKCBBdHRyaWJ1dGVFbGVtZW50IGF0dHJpYnV0ZUVsZW1lbnQsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxhdHRyaWJ1dGVFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5CRUFOKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuQVRUUklCVVRFX09XTkVSOwotICAKLSAgfQotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNhc2Ugd2hlbiB0aGlzIGlzIG5vdCB0aGUgcm9vdCBvYmplY3QKLSAgKiBoZXJlIGl0IHJlcHJlc2VudHMgY29tcGxleCB0eXBlcwotICAqIEBwYXJhbSBQYXJhbWV0ZXJFbGVtZW50IFRoZSBQYXJhbWV0ZXIgdGhhdCBvd25zIHRoaXMgYmVhbiB0eXBlLgotICAqIEBwYXJhbSBTdHJpbmcgTmFtZSBvZiB0aGUgUGFyYW1ldGVyRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50ICggRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGZpZWxkRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuQkVBTik7Ci0gICAgZk93bmVyVHlwZSA9IFR5cGVFbGVtZW50LkZJRUxEX09XTkVSOwotICAKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIEFsbCBNZXRob2Qgb2JqZWN0cyBvZiB0aGlzIEJlYW4uCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRNZXRob2RzICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX01FVEhPRFMpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIE1ldGhvZCBvYmplY3RzIG9mIHRoaXMgQmVhbi4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZk1ldGhvZEVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfTUVUSE9EUyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIGlmKGlzU3RhdGVMZXNzKCkpIHJldHVybiBTVEFURUxFU1NfQkVBTiArIGdldE5hbWUoKTsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNTdGF0ZUxlc3MoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZWEgPSBnZXRFbGVtZW50cyhUeXBlRWxlbWVudC5SRUxfQVRUUklCVVRFUyk7Ci0gICAgRW51bWVyYXRpb24gZWYgPSBnZXRFbGVtZW50cyhUeXBlRWxlbWVudC5SRUxfRklFTERTKTsKLSAgICBpZihlYS5oYXNNb3JlRWxlbWVudHMoKSB8fCBlZi5oYXNNb3JlRWxlbWVudHMoKSkgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQ3OTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tb24uU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFR5cGVGYWN0b3J5Ci0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDEyOjQxOjQ4IFBNKQotICogQGF1dGhvcjogR2lsYmVydCBBbmRyZXdzCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuTW9kZWxFbGVtZW50c0ZhY3RvcnkgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVFVSTl9QQVJBTV9OQU1FPSJyZXR1cm5wIjsKLQotICBwcml2YXRlIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeSgpe30KLQotICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0QmVhbk1vZGVsRWxlbWVudChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIEJlYW5Nb2RlbEVsZW1lbnRzRmFjdG9yeS5nZXRCZWFuTW9kZWxFbGVtZW50KG9iamVjdCxudWxsLG51bGwpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEJlYW5Nb2RlbEVsZW1lbnQoT2JqZWN0IG9iamVjdCxFbGVtZW50IHBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gQmVhbk1vZGVsRWxlbWVudHNGYWN0b3J5LmdldEJlYW5Nb2RlbEVsZW1lbnQob2JqZWN0LHBhcmVudEVsZW1lbnQsbnVsbCk7Ci0gIH0KLSAgCi0gLyoKLSAgKiBUYWtlIGluIGFuIG9iamVjdCBhbmQgcmV0dXJuIGFuIGVsZW1lbnQgZGVwZW5kaW5nIG9uIHdoYXQgCi0gICogdHlwZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGZyb20gdGhlIGphdmFtb2YKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRCZWFuTW9kZWxFbGVtZW50KE9iamVjdCBvYmplY3QsRWxlbWVudCBwYXJlbnRFbGVtZW50LCBNb2RlbCBtb2RlbCkKLSAgewotICAgIEVsZW1lbnQgcmV0dXJuRWxlbWVudCA9IG51bGw7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSmF2YUNsYXNzKXsKLSAgICAgIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKW9iamVjdDsKLSAgICAgIFN0cmluZyBqYXZhTmFtZSA9IGphdmFDbGFzcy5nZXRKYXZhTmFtZSgpOwotICAgICAgaWYgKCFqYXZhQ2xhc3MuaXNBcnJheSgpKXsgCi0JICAgICAgaWYocGFyZW50RWxlbWVudCA9PSBudWxsICYmIG1vZGVsID09bnVsbCkgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudChqYXZhTmFtZSk7Ci0JICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgIT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEJlYW5FbGVtZW50KGphdmFOYW1lLG1vZGVsLGZhbHNlKTsKLQkgICAgICBlbHNlewotCSAgICAgICAgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtZXRlckVsZW1lbnQpeyAKLQkgICAgICAgICAgIFBhcmFtZXRlckVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoUGFyYW1ldGVyRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVFbGVtZW50KXsKLQkgICAgICAgICAgIEF0dHJpYnV0ZUVsZW1lbnQgdGVtcEVsZW1lbnQgPSAoQXR0cmlidXRlRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGaWVsZEVsZW1lbnQpewotICAgICAgICAgICAgICAgRmllbGRFbGVtZW50IHRlbXBFbGVtZW50ID0gKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBCZWFuRWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLSAgICAgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgUGFyYW1ldGVyRWxlbWVudCgoTWV0aG9kRWxlbWVudClwYXJlbnRFbGVtZW50LFJFVFVSTl9QQVJBTV9OQU1FLE1ldGhvZEVsZW1lbnQuUkVMX1JFVFVSTl9QQVJBTUVURVJTLHRydWUpOwotICAgICAgICAgICAgfQkgICAgICAgICAKLQkgICAgICB9Ci0gICAgICB9IAotICAgICAgZWxzZXsKLSAgICAgICAgICBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgPT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudChqYXZhTmFtZSk7Ci0JICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50ID09IG51bGwgJiYgbW9kZWwgIT1udWxsKSByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudChqYXZhTmFtZSxtb2RlbCxmYWxzZSk7Ci0JICAgICAgZWxzZXsKLQkgICAgICAgIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbGVtZW50KXsgCi0JICAgICAgICAgICBQYXJhbWV0ZXJFbGVtZW50IHRlbXBFbGVtZW50ID0gKFBhcmFtZXRlckVsZW1lbnQpcGFyZW50RWxlbWVudDsKLQkgICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgQXJyYXlFbGVtZW50KHRlbXBFbGVtZW50LGphdmFOYW1lKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgaWYocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUVsZW1lbnQpewotCSAgICAgICAgICAgQXR0cmlidXRlRWxlbWVudCB0ZW1wRWxlbWVudCA9IChBdHRyaWJ1dGVFbGVtZW50KXBhcmVudEVsZW1lbnQ7Ci0JICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEFycmF5RWxlbWVudCh0ZW1wRWxlbWVudCxqYXZhTmFtZSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBGaWVsZEVsZW1lbnQpewotICAgICAgICAgICAgICAgRmllbGRFbGVtZW50IHRlbXBFbGVtZW50ID0gKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50OwotCSAgICAgICAgICAgcmV0dXJuRWxlbWVudCA9IG5ldyBBcnJheUVsZW1lbnQodGVtcEVsZW1lbnQsamF2YU5hbWUpOwotCSAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCl7Ci0gICAgICAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsKLSAgICAgICAgICAgIH0KLQotCSAgICAgIH0KLSAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBTYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IpewotICAgICAgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIHBkID0gKFNhbXBsZVByb3BlcnR5RGVzY3JpcHRvcilvYmplY3Q7Ci0gICAgICByZXR1cm5FbGVtZW50ID0gbmV3IEF0dHJpYnV0ZUVsZW1lbnQoKEJlYW5FbGVtZW50KXBhcmVudEVsZW1lbnQscGQuZ2V0TmFtZSgpKTsgIAotICAgIH0KLSAgICBlbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEZpZWxkKXsKLSAgICAgIEZpZWxkIGZpZWxkID0gKEZpZWxkKW9iamVjdDsKLSAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgRmllbGRFbGVtZW50KChCZWFuRWxlbWVudClwYXJlbnRFbGVtZW50LGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZCl7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZClvYmplY3Q7Ci0gICAgICByZXR1cm5FbGVtZW50ID0gbmV3IE1ldGhvZEVsZW1lbnQoKEJlYW5FbGVtZW50KXBhcmVudEVsZW1lbnQsbWV0aG9kLmdldE5hbWUoKSwgbWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0gICAgfQotICAgIC8vbm9uIGJlYW5pbmZvCi0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKXsKLSAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylvYmplY3Q7ICAKLSAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgQXR0cmlidXRlRWxlbWVudCgoQmVhbkVsZW1lbnQpcGFyZW50RWxlbWVudCxuYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSmF2YVBhcmFtZXRlcil7Ci0gICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSAoSmF2YVBhcmFtZXRlcilvYmplY3Q7Ci0KLSAgICAgIAotICAgICAgaWYgKGphdmFQYXJhbWV0ZXIuaXNSZXR1cm4oKSkgCi0gICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsgCi0gICAgICBlbHNleyAKLSAgICAgICAgIC8vYSBqYXZhIHBhcmFtZXRlciBnaXZlcyB1cyB0aGUgcXVhbGlmaWVkIG5hbWUgd2UgZG9udCB3YW50IHRoaXMKLSAgICAgICAgIFN0cmluZyBuYW1lID0gamF2YVBhcmFtZXRlci5nZXRRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICBTdHJpbmcgc2hvcnROYW1lOwotICAgICAgICAgaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgaWYgKGluZGV4ICE9IC0xKXsKLSAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgc2hvcnROYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgICAgICAgfQotICAgICAgZWxzZSBzaG9ydE5hbWUgPSBuYW1lOwotCi0gICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxzaG9ydE5hbWUsTWV0aG9kRWxlbWVudC5SRUxfUEFSQU1FVEVSUyxmYWxzZSk7IAotCi0gICAgICB9Ci0gICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBKYXZhSGVscGVycyl7Ci0gICAgICBKYXZhSGVscGVycyBqYXZhSGVscGVyID0gKEphdmFIZWxwZXJzKW9iamVjdDsKLSAgICAgIFN0cmluZyBqYXZhTmFtZTsgCi0gICAgICBpZiAoamF2YUhlbHBlci5pc0FycmF5KCkpIGphdmFOYW1lID0gVHlwZUZhY3RvcnkuQVJSQVlfTkFNRTsKLSAgICAgIGVsc2UgamF2YU5hbWUgPSBqYXZhSGVscGVyLmdldEphdmFOYW1lKCk7Ci0gICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtZXRlckVsZW1lbnQpewotICAgICAgICAgIHJldHVybkVsZW1lbnQgPSBuZXcgU2ltcGxlRWxlbWVudCgoUGFyYW1ldGVyRWxlbWVudClwYXJlbnRFbGVtZW50LGphdmFOYW1lLGphdmFIZWxwZXIuaXNQcmltaXRpdmUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVFbGVtZW50KXsKLSAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFNpbXBsZUVsZW1lbnQoKEF0dHJpYnV0ZUVsZW1lbnQpcGFyZW50RWxlbWVudCxqYXZhTmFtZSxqYXZhSGVscGVyLmlzUHJpbWl0aXZlKCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZihwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRmllbGRFbGVtZW50KXsKLSAgICAgICAgICByZXR1cm5FbGVtZW50ID0gbmV3IFNpbXBsZUVsZW1lbnQoKEZpZWxkRWxlbWVudClwYXJlbnRFbGVtZW50LGphdmFOYW1lLGphdmFIZWxwZXIuaXNQcmltaXRpdmUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KXsKLSAgICAgIAlyZXR1cm5FbGVtZW50ID0gbmV3IFBhcmFtZXRlckVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpcGFyZW50RWxlbWVudCxSRVRVUk5fUEFSQU1fTkFNRSxNZXRob2RFbGVtZW50LlJFTF9SRVRVUk5fUEFSQU1FVEVSUyx0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldHVybkVsZW1lbnQ7Ci0gIH0KLSAgCi0gIAotICAKLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CaWdEZWNpbWFsVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0RlY2ltYWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZGEwYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0RlY2ltYWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgQmlnRGVjaW1hbFR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEJpZ0RlY2ltYWxUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkJJR19ERUNJTUFMX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAibmV3IGphdmEubWF0aC5CaWdEZWNpbWFsKCIgKyBuYW1lICsgIik7IjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmFtZSArICIudG9TdHJpbmcoKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9CaWdJbnRlZ2VyVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0ludGVnZXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjYwMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0JpZ0ludGVnZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgQmlnSW50ZWdlclR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIEJpZ0ludGVnZXJUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkJJR19JTlRFR0VSX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAibmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIgKyBuYW1lICsgIik7IjsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmFtZSArICIudG9TdHJpbmcoKSI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9EYXRhVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjFhNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzaW1wbGlmeSB0aGUgY29kZWdlbiBwcm9jZXNzCi0qIEJlY2F1c2UgY29kZWdlbiBtYXkgYmUgcHJvY2Vzc2VkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgdHlwZQotKiB3ZSBjYW4gaGFuZGxlIGhvdyBlYWNoIHR5cGUgd2FudHMgdGhlIGNvZGUgdG8gbG9vayBmb3IgYSBzcGVjaWZpYyB0YXNrIAotKiBieSBjcmVhdGluZyBhIGRhdGF0eXBlIGFuZCBjYWxsaW5nIGdlbmVyaWMgbWV0aG9kcyB0aGF0IGFyZSAKLSogdG8gYmUgc3BlY2lhbGl6ZWQgaW4gc3ViY2xhc3NlcwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaGFuZHMgYmFjayB0aGUgY29kZSByZXF1aXJlZCB0byBnbyBmcm9tIHRoZSAKLSAgKiBzdHJpbmcgdGhlIHVzZXIgZW50ZXJlZCB0byB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotICAvKioKLSAgKiBPZnRlbiB0aW1lcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgdHlwZSB0byBzdHJpbmcsIHN0cmluZyB0byB0eXBlIG9yIGp1c3QgcGxhaW4gcHJvdmlkZSBhbiBpbnB1dCBmb3JtCi0gICogQSB0ZW1wb3JhcnkgdmFyaWFibGUgaXMgdXNlZC4gSWYgd2UgcnVuIGludG8gYSBzaXR1dGlvbiB3aGVyZSB0d28gb2YgdGhlIHNhbWUgdHlwZXMgYXJlIHVzZWQgaW4gdGhlICAKLSAgKiBzYW1lIG1ldGhvZCB0aGVzZSB0ZW1wb3JhcnkgdmFyaWFibGVzIHNoYXJlIHRoZSBzYW1lIG5hbWUgc3BhY2UuIEl0IGlzbnQgZW5vdWdoIHRvIHVzZSBhIG5hbWUgCi0gICogYmVjYXVzZSBvZiB3ZSBtYXkgaGF2ZSBhIG5lc3RlZCBzY2VuYXJpby4gVGhlcmVmb3JlIGFueSB0ZW1wb3JhcnkgdmFyaWFibGUgdGhhdCBpcyB1c2VkIGluIGEgZGF0YVR5cGUKLSAgKiBtdXN0IHVzZSBhIHVuaXF1ZSBuYW1lIGFwZWVuZGVkIHRvIHRoZSBlbmQuIFRoaXMgbmFtZSBtdXN0IGJlIHBhc3NlZCBpbiBhbmQgaXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YKLSAgKiBEYXRhVHlwZSB0byBpbnN1cmUgaXQgaXMgdW5pcXVlLgotICAqIEByZXR1cm4gVW5pcXVlIE5hbWUgCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIG5hbWUgZWFjaCB0ZW1wIHZhcmlhYmxlIHdpbGwgdXNlCi0gICogCi0gICoKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCk7Ci0gIAotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGRpY3RhdGVzIGhvdyB5b3Ugd2FudCB0byBwcm9jZXNzIHRoZSAKLSAgKiBpbmNvbWluZyBzdHJpbmcgZnJvbSB0aGUgaW5wdXQganNwLiBZb3UgbWF5IG9yIG1heSBub3QgdXNlIHRoZSBtYXJrdXAgCi0gICogZnVuY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlLiBUaGUgc2ltcGxlIHR5cGVzIHVzZSBpdC4gRG9tRWxlbWVudCBkb2VzIG5vdAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBjb2RlIHRvIGJlIGdlbmVyYXRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpOwotCi0KLSAgLyoqCi0gICogSW5wdXQgZm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpOwotICAKLSAgLyoqCi0gICogY29udmVydHMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJveHkgCi0gICogYmFjayB0byBhIHN0cmluZyAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSB0eXBlIHRvIHN0cmluZy4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIHR5cGUoaW5jbHVkaW5nIHBhY2thZ2UpLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RhdGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Mzk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRGF0ZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIERhdGVUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBEYXRlVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5CSUdfREVDSU1BTF9OQU1FKTsKLSAgfQotIAotCi0gIC8qKgotICAqIGlucHV0Rm9ybSByZXR1cm5zIHRoZSB1c2VyIGlucHV0IGh0bWwKLSAgKiBUaGUgc2ltcGxlIGZvcm0gaXMganVzdCBhIHRleHQgaW5wdXQgYm94Ci0gICogVGhpcyBoYXMgYmVlbiBzcGVjaWFsaXplZCB0byBzaG93IGFuIGV4YW1wbGUKLSAgKiBAcGFyYW0gU3RyaW5nIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGVsZW1lbnQKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZm9ybSB1c2VkIHRvIGNvbGxlY3QgdGhlIGRhdGEKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGlucHV0Rm9ybSA9ICI8VEQgQUxJR049XCJsZWZ0XCI+PElOUFVUIFRZUEU9XCJURVhUXCIgTkFNRT1cIiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIlwiIFNJWkU9MjA+PC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgImphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciBnY0V4YW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIiAgPSBuZXcgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiamF2YS51dGlsLkRhdGUgZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBnY0V4YW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIi5nZXRUaW1lKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLmZvcm1hdChkYXRlIiArIGdldFVuaXF1ZU5hbWUoKSsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQgQUxJR049XCJsZWZ0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VFI+IiAgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREPiA8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPFREIEFMSUdOPVwibGVmdFwiPiBlZy4gPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IDwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8L1RSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICByZXR1cm4gaW5wdXRGb3JtOwotICB9Ci0KLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgc3BlY2lhbGl6ZWQKLSAgKiBXZSBtdXN0IHVzZSB0aGUgZGF0ZSBmdW5jdGlvbiB0byBoZWxwCi0gICogdXMgY29udmVydCBiYWNrIGFuZCBmb3J0aAotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAgImphdmEudXRpbC5EYXRlICIgKyBub2RlTmFtZSAgKyAgIj0gZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIucGFyc2UoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAqIHRoaXMgaXMgbmVlZGVkIGZvciBtb3N0IGNhc2UgCi0gICogYnV0IGl0IGlzIHBlcmlwaGVyYWwgYXMgdGhlIHN0cmluZ2NvbnZlcnNpb24gbmVlZGVkIAotICAqIHRvIGJlIG92ZXJyaWRkZW4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICogY29udmVydHMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJveHkgCi0gICogYmFjayB0byBhIHN0cmluZyAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSB0eXBlIHRvIHN0cmluZy4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotCi0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnRleHQuRGF0ZUZvcm1hdCBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IGphdmEudGV4dC5EYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgIAkgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkpzcFV0aWxzLm1hcmt1cChkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5mb3JtYXQoIiArIG5hbWUgKyIpKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9IHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotCi0KLSAgLyoqCi0gICogVGhlIHN0cmluZ0NvbnZlcnNpb24gZnVuY3Rpb24gbmFpbHMgb3V0IHNwZWNpZmljIGNvbnZlcnNpb24gbWV0aG9kcyB1c2VkIGFtb25nIHNpbXBsZSB0eXBlcyAKLSAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBTaW1wbGVUeXBlIHN1YmNsYXNzZXMKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHN0cmluZyBhZnRlciB0aGUgcmVxdWVzdCBjYWxsCi0gICogQHJldHVybiBTdHJpbmcgdGhlIGFjdHVhbCBjb252ZXJzaW9uIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVUb1N0cmluZyhTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0RvbUVsZW1lbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRG9tRWxlbWVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA0MDZhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvRG9tRWxlbWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIERvbUVsZW1lbnRUeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIERvbUVsZW1lbnRUeXBlKCkKLSAgewotICAgIGZUeXBlID0gIm9yZy53M2MuZG9tLkVsZW1lbnQiOwotICAgIGZVbmlxdWVOYW1lID0gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIERvbUVsZW1lbnQgZm9ybSBpcyBhIHRleHQgYm94Ci0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxURVhUQVJFQSBSb3dzPTcgQ29scz00NSBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCI+PC9URVhUQVJFQT48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLQotICAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBkaWN0YXRlcyBob3cgeW91IHdhbnQgdG8gcHJvY2VzcyB0aGUgCi0gICogaW5jb21pbmcgc3RyaW5nIGZyb20gdGhlIGlucHV0IGpzcC4gWW91IG1heSBvciBtYXkgbm90IHVzZSB0aGUgbWFya3VwIAotICAqIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4gVGhlIHNpbXBsZSB0eXBlcyB1c2UgaXQuIERvbUVsZW1lbnQgZG9lcyBub3QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0Q29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKQotICB7Ci0gICAgIFN0cmluZyByZXF1ZXN0Q29kZSA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyIgKyBHZW5lcmF0b3IuU1BBQ0UgCi0gICAgIAkgICAgICAgICAgICAgICAgICAgKyBpZCArICI9ICByZXF1ZXN0LmdldFBhcmFtZXRlcihcIiIKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIG5hbWUgKyJcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiByZXF1ZXN0Q29kZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaGFuZHMgYmFjayB0aGUgY29kZSByZXF1aXJlZCB0byBnbyBmcm9tIHRoZSAKLSAgKiBzdHJpbmcgdGhlIHVzZXIgZW50ZXJlZCB0byB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCIAotICAgICAgICAgICAgICAgICAgICAgICArICJvcmcudzNjLmRvbS5FbGVtZW50ICIgKyBub2RlTmFtZSArICI9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkRvbUVsZW1lbnRIZWxwZXIuY3JlYXRlRG9tRWxlbWVudEZyb21YTUxTdHJpbmcoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiIAotCSAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBjb252ZXJzaW9uOyAKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBmdW5jdGlvbiB0aGF0IGRpY3RhdGVzIGhvdyB3ZSB3YW50IHRvIGRpc3BsYXkgdGhpcyB0eXBlIAotICAqIHVwb24gcmVjZWl2aW5nIGl0IGFzIGEgcmV0dXJuIGZyb20gYSBwcm94eSBtZXRob2QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGRpc3BsYXkgc3RyaW5nCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZUNvbnZlcnNpb24oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgdHlwZVRvU3RyaW5nID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiU3RyaW5nIHRlbXBSZXN1bHQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gb3JnLmVjbGlwc2UuanN0LndzLnV0aWwuRG9tRWxlbWVudEhlbHBlci5kb21Xcml0ZXIoIiArIG5hbWUgKyAiLCBuZXcgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcigpIiArICIpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICI8JT0gdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0KLSAgICByZXR1cm4gdHlwZVRvU3RyaW5nOwotICB9Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBuYW1lKGluY2x1ZGluZyBwYWNrYWdlKS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBmVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZlVuaXF1ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlVuaXF1ZU5hbWUgPSBuYW1lOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0ZpZWxkRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL0ZpZWxkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY4ZmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9GaWVsZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuIG1ldGhvZCBwYXJhbWV0ZXIuCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEuYmVhbnMuUGFyYW1ldGVyRGVzY3JpcHRvci4KLSovCi1wdWJsaWMgY2xhc3MgRmllbGRFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50IGltcGxlbWVudHMgQXR0cmlidXRlRWxlbWVudFR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIFN0cmluZyBmU2V0dGVyTWV0aG9kOwotICBwcml2YXRlIFN0cmluZyBmR2V0dGVyTWV0aG9kOwotCi0gCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9UWVBFID0gInR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfT1dOSU5HX0JFQU4gPSAib3duaW5nYmVhbiI7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3RvciB0aGlzIHRha2VzIHRoZSBvd25pbmcgYmVhbi4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgotICAqIEBwYXJhbSBiZWFuRWxlbWVudCB0aGUgYmVhbiB0aGF0IG93bnMgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBGaWVsZEVsZW1lbnQgKCBCZWFuRWxlbWVudCBiZWFuRWxlbWVudCwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLGJlYW5FbGVtZW50LFJFTF9PV05JTkdfQkVBTixCZWFuRWxlbWVudC5SRUxfRklFTERTKTsKLSAgICBmU2V0dGVyTWV0aG9kID0gbmFtZTsKLSAgICBmR2V0dGVyTWV0aG9kID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNldHRlck1ldGhvZChTdHJpbmcgc2V0dGVyTWV0aG9kKQotICB7Ci0gICAgZlNldHRlck1ldGhvZCA9IHNldHRlck1ldGhvZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2V0dGVyTWV0aG9kKCkKLSAgewotICAgIHJldHVybiBmU2V0dGVyTWV0aG9kOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRHZXR0ZXJNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIGZHZXR0ZXJNZXRob2Q7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0R2V0dGVyTWV0aG9kKFN0cmluZyBnZXR0ZXJNZXRob2QpCi0gIHsKLSAgICBmR2V0dGVyTWV0aG9kID0gZ2V0dGVyTWV0aG9kOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXR0ZXJTaWduYXR1cmUoU3RyaW5nIGF0dHJpYnV0ZSkKLSAgewotICAgIHJldHVybiBmU2V0dGVyTWV0aG9kICsgIiA9ICIgKyBhdHRyaWJ1dGUgKyAiOyI7Ci0gIH0KLSAgIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBCZWFuIHRoYXQgb3ducyB0aGlzIEF0dHJpYnV0ZS4KLSAgKiBAcmV0dXJuIEJlYW5FbGVtZW50IFRoZSBiZWFuIHRoYXQgb3ducyB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIEJlYW5FbGVtZW50IGdldE93bmluZ0JlYW5FbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0RWxlbWVudHMoUkVMX09XTklOR19CRUFOKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCZWFuRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgdHlwZSB0aGF0IGlzIG93bmVkIGJ5IHRoaXMgYXR0cmlidXR0ZS4KLSAgKiBAcmV0dXJuIFR5cGVFbGVtZW50IFRoZSBUeXBlIHRoYXQgb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICovCi0gIHB1YmxpYyBUeXBlRWxlbWVudCBnZXRUeXBlRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9UWVBFKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChUeXBlRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9HcmVnb3JpYW5DYWxlbmRhclR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9HcmVnb3JpYW5DYWxlbmRhclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjZmJmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvR3JlZ29yaWFuQ2FsZW5kYXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgR3JlZ29yaWFuQ2FsZW5kYXJUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBHcmVnb3JpYW5DYWxlbmRhclR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuR1JFR09SSUFOX0NBTEVOREFSX05BTUUpOwotICB9Ci0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIHNpbXBsZSBmb3JtIGlzIGp1c3QgYSB0ZXh0IGlucHV0IGJveAotICAqIFRoaXMgaGFzIGJlZW4gc3BlY2lhbGl6ZWQgdG8gc2hvdyBhbiBleGFtcGxlCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxJTlBVVCBUWVBFPVwiVEVYVFwiIE5BTUU9XCIiIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICJcIiBTSVpFPTIwPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIgZ2NFeGFtcCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgID0gbmV3IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcigpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgImphdmEudXRpbC5EYXRlIGRhdGUiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gZ2NFeGFtcCIgKyBnZXRVbmlxdWVOYW1lKCkrICIuZ2V0VGltZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJTdHJpbmcgdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5mb3JtYXQoZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkrICIpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxURCBBTElHTj1cImxlZnRcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9UUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxUUj4iICArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQ+IDwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICArICI8VEQgQUxJR049XCJsZWZ0XCI+IGVnLiA8JT0gdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgJT4gPC9URD4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLSAKLSAKLSAgLyoKLSAgKiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHNwZWNpYWxpemVkCi0gICogV2UgbXVzdCB1c2UgdGhlIGRhdGUgZnVuY3Rpb24gdG8gaGVscAotICAqIHVzIGNvbnZlcnQgYmFjayBhbmQgZm9ydGgKLSAgKi8KLSAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICAgU3RyaW5nIGNvbnZlcnNpb24gPSAgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiamF2YS50ZXh0LkRhdGVGb3JtYXQgZGF0ZUZvcm1hdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBqYXZhLnRleHQuRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKTsiICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICAiamF2YS51dGlsLkRhdGUgZGF0ZVRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpKyAiICA9IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiLnBhcnNlKCIgKyBhdHRyaWJ1dGVOYW1lICsgIik7IiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIiICsgR2VuZXJhdG9yLlNQQUNFICsgbm9kZU5hbWUgKyAiID0gIiArICJuZXcgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyKCk7IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIG5vZGVOYW1lICsgIi5zZXRUaW1lKGRhdGVUZW1wIiArIGdldFVuaXF1ZU5hbWUoKSsgIik7IgotICAgICAgICAgICAgICAgICAgICAgICAgICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotICAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAqIHRoaXMgaXMgbmVlZGVkIGZvciBtb3N0IGNhc2UgCi0gICogYnV0IGl0IGlzIHBlcmlwaGVyYWwgYXMgdGhlIHN0cmluZ2NvbnZlcnNpb24gbmVlZGVkIAotICAqIHRvIGJlIG92ZXJyaWRkZW4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBjb252ZXJ0cyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm94eSAKLSAgKiBiYWNrIHRvIGEgc3RyaW5nIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHR5cGUgdG8gc3RyaW5nLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0KLSAgICBTdHJpbmcgY29udmVyc2lvbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImphdmEudGV4dC5EYXRlRm9ybWF0IGRhdGVGb3JtYXQiICsgZ2V0VW5pcXVlTmFtZSgpKyAiID0gamF2YS50ZXh0LkRhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgCSAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiamF2YS51dGlsLkRhdGUgZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSAiICsgbmFtZSArICIuZ2V0VGltZSgpOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgIAkgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkpzcFV0aWxzLm1hcmt1cChkYXRlRm9ybWF0IiArIGdldFVuaXF1ZU5hbWUoKSsgIi5mb3JtYXQoZGF0ZSIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiKSk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlPSB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLQotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0KLQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9IYXNodGFibGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvSGFzaHRhYmxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWZmMmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9IYXNodGFibGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSByZWNvZ25pemVkIHJldHVybiB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBIYXNodGFibGVUeXBlIGV4dGVuZHMgUmVjb2duaXplZFJldHVyblR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBIYXNodGFibGVUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LkhBU0hUQUJMRV9OQU1FKTsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvTWFwVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01hcFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNWJmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvTWFwVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgTWFwVHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgTWFwVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5NQVBfTkFNRSk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01ldGhvZEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODkyZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL01ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIEphdmEgYmVhbiBtZXRob2QuCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCwgamF2YS5iZWFucy5NZXRob2REZXNjcmlwdG9yLgotKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9CRUFOID0gImJlYW4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUEFSQU1FVEVSUyA9ICJwYXJhbWV0ZXJzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1JFVFVSTl9QQVJBTUVURVJTID0gInJldHVybnBhcmFtZXRlcnMiOwotICBwcml2YXRlIFN0cmluZyBmRGlzcGxheU5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIGJvb2xlYW4gZk1ldGhvZE9taXR0ZWQ7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIGJlYW4gVGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgbWV0aG9kLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuCi0gICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG1ldGhvZC4KLSAgKi8KLSAgcHVibGljIE1ldGhvZEVsZW1lbnQgKCBCZWFuRWxlbWVudCBiZWFuRWxlbWVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkaXNwbGF5TmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYmVhbkVsZW1lbnQsUkVMX0JFQU4sQmVhbkVsZW1lbnQuUkVMX01FVEhPRFMpOwotICAgIGZEaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmTWV0aG9kT21pdHRlZCA9IGZhbHNlOwotICAgIAotICB9Ci0KLSAgLyoKLSAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlCi0gICogd2Ugd2lsbCBzZXQgdGhlIG9tbWlzc2lvbiBib29sZWFuIHZhcmlhYmxlCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhpcyBtZXRob2QgaXMgdG8gYmUgb21taXRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRNZXRob2RPbW1pc3Npb24oKQotICB7Ci0gICAgcmV0dXJuIGZNZXRob2RPbWl0dGVkOwotICB9Ci0KLSAgLyoKLSAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGVyZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlCi0gICogd2Ugd2lsbCBnZXQgdGhlIG9tbWlzc2lvbiBib29sZWFuIHZhcmlhYmxlCi0gICogQHBhcmFtIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIG1ldGhvZCBpcyB0byBiZSBvbW1pdGVkCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZE9tbWlzc2lvbihib29sZWFuIGJvb2wpCi0gIHsKLSAgICBmTWV0aG9kT21pdHRlZCA9IGJvb2w7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZk5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkKLSAgewotICAgIHJldHVybiBmRGlzcGxheU5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBCZWFuIHRoYXQgb3ducyB0aGlzIG1ldGhvZC4KLSAgKiBAcmV0dXJuIEJlYW4gVGhlIEJlYW4gdGhhdCBvd25zIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgQmVhbkVsZW1lbnQgZ2V0QmVhbkVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfQkVBTik7Ci0gICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoQmVhbkVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgdGhlIHJldHVybiBwYXJhbWV0ZXIgb2YgdGhpcyBtZXRob2QuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBob2xkcyB0aGUgcmV0dXJuIHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZC4KLSAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFJldHVyblBhcmFtZXRlckVudW0gKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfUkVUVVJOX1BBUkFNRVRFUlMpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgcmV0dXJuIHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZC4KLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIGhvbGRzIHRoZSByZXR1cm4gcGFyYW1ldGVyIG9mIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgUGFyYW1ldGVyRWxlbWVudCBnZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50ICgpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0UmV0dXJuUGFyYW1ldGVyRW51bSgpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKFBhcmFtZXRlckVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIFBhcmFtZXRlciBvYmplY3RzIG9mIHRoaXMgbWV0aG9kLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gQWxsIFBhcmFtZXRlciBvYmplY3RzIG9mIHRoaXMgbWV0aG9kLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyRWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfUEFSQU1FVEVSUyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgUGFyYW1ldGVyIG9iamVjdHMgb2YgdGhpcyBtZXRob2QuCi0gICogQHJldHVybiBpbnQgVGhlIG51bWJlciBvZiBQYXJhbWV0ZXIgb2JqZWN0cyBvZiB0aGlzIG1ldGhvZC4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlBhcmFtZXRlckVsZW1lbnRzICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfUEFSQU1FVEVSUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1BhcmFtZXRlckVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QYXJhbWV0ZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYjA2NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1BhcmFtZXRlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSmF2YSBiZWFuIG1ldGhvZCBwYXJhbWV0ZXIuCi0qIE5lYXJlc3QgbW9yYWwgZXF1aXZhbGVudHM6IGphdmEuYmVhbnMuUGFyYW1ldGVyRGVzY3JpcHRvci4KLSovCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9NRVRIT0QgPSAibWV0aG9kIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1RZUEUgPSAidHlwZSI7Ci0KLSAgcHVibGljIGJvb2xlYW4gZlJldHVyblBhcmFtZXRlcj1mYWxzZTsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBtZXRob2QgVGhlIE1ldGhvZCB0aGF0IG93bnMgdGhpcyBwYXJhbWV0ZXIuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KLSAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyLgotICAqLwotICBwdWJsaWMgUGFyYW1ldGVyRWxlbWVudCAoIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyByZWxUeXBlLGJvb2xlYW4gcmV0dXJuUGFyYW1ldGVyICkKLSAgewotICAgIHRoaXMobmFtZSxtZXRob2RFbGVtZW50LFJFTF9NRVRIT0QscmVsVHlwZSk7Ci0gICAgZlJldHVyblBhcmFtZXRlciA9IHJldHVyblBhcmFtZXRlcjsKLSAgfQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIG1ldGhvZCBUaGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLgotICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuCi0gICovCi0gIHB1YmxpYyBQYXJhbWV0ZXJFbGVtZW50IChTdHJpbmcgbmFtZSwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBTdHJpbmcgb3V0UmVsLFN0cmluZyBpblJlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbWV0aG9kRWxlbWVudCxvdXRSZWwsaW5SZWwpOwotICB9Ci0gICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKiBAcmV0dXJuIE1ldGhvZCBUaGUgTWV0aG9kIHRoYXQgb3ducyB0aGlzIHBhcmFtZXRlci4KLSAgKi8KLSAgcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9NRVRIT0QpOwotICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpID8gKE1ldGhvZEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIE1ldGhvZCB0aGF0IG93bnMgdGhpcyBwYXJhbWV0ZXIuCi0gICogQHJldHVybiBNZXRob2QgVGhlIE1ldGhvZCB0aGF0IG93bnMgdGhpcyBwYXJhbWV0ZXIuCi0gICovCi0gIHB1YmxpYyBUeXBlRWxlbWVudCBnZXRUeXBlRWxlbWVudCAoKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9UWVBFKTsKLSAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChUeXBlRWxlbWVudCllLm5leHRFbGVtZW50KCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNSZXR1cm4oKQotICB7Ci0gICAgcmV0dXJuIGZSZXR1cm5QYXJhbWV0ZXI7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQXJyYXlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQXJyYXlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzMwNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUFycmF5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSByZWNvZ25pemVkIHJldHVybiB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVBcnJheVR5cGUgZXh0ZW5kcyBBcnJheVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTUlUSVZFX0FSUkFZX05BTUUsIHR5cGVOYW1lKTsKLSAgfQotCi0gICAvKioKLSAgKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgZnVuY3Rpb24gdGhhdCBkaWN0YXRlcyBob3cgd2Ugd2FudCB0byBkaXNwbGF5IHRoaXMgdHlwZSAKLSAgKiB1cG9uIHJlY2VpdmluZyBpdCBhcyBhIHJldHVybiBmcm9tIGEgcHJveHkgbWV0aG9kCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBkaXNwbGF5IHN0cmluZwotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIHRyaXBwbGVUYWIgPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIEdlbmVyYXRvci5UQUI7Ci0KLSAgICBTdHJpbmcgbm9uQmVhbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wIiArIGdldFVuaXF1ZU5hbWUoKSArICIgPSBcIltcIjsiIAotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJmb3IoaW50IGkiICsgZ2V0VW5pcXVlTmFtZSgpICsgIj0wO2kiICtnZXRVbmlxdWVOYW1lKCkgKyAiPCAiICsgbmFtZSAKLSAgICAJICAgICAgICAgICAgICAgICAgICsgIi5sZW5ndGg7aSIgKyBnZXRVbmlxdWVOYW1lKCkgKyAiKyspeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAKLSAgICAJICAgICAgICAgICAgICsgdHJpcHBsZVRhYiArICJ0ZW1wIisgZ2V0VW5pcXVlTmFtZSgpICsiID0gdGVtcCIrZ2V0VW5pcXVlTmFtZSgpICsgIiArICIgKyBuYW1lICsgIltpIiArIGdldFVuaXF1ZU5hbWUoKSAKLSAgICAJICAgICAgICAgICAgICAgICAgICsgIl0gKyBcIixcIjsiICsgU3RyaW5nVXRpbHMuTkVXTElORSAKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImludCBsZW5ndGgiICsgZ2V0VW5pcXVlTmFtZSgpICsgIiA9IHRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpICsgIi5sZW5ndGgoKTsiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgInRlbXAiICsgZ2V0VW5pcXVlTmFtZSgpICsgIiA9IHRlbXAiK2dldFVuaXF1ZU5hbWUoKSsiLnN1YnN0cmluZygwLChsZW5ndGgiK2dldFVuaXF1ZU5hbWUoKSsiIC0gMSkpICsgXCJdXCI7IiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAKLSAgICAJICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCU9dGVtcCIrIGdldFVuaXF1ZU5hbWUoKSArIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUKLSAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiKyBTdHJpbmdVdGlscy5ORVdMSU5FOwotCi0gICAgcmV0dXJuIG5vbkJlYW47Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUJvb2xlYW5UeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQm9vbGVhblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4YWQ5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlQm9vbGVhblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUJvb2xlYW5UeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVCb29sZWFuVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0JPT0xFQU5fTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJCb29sZWFuLnZhbHVlT2YoIiArIG5hbWUgKyAiKS5ib29sZWFuVmFsdWUoKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVCeXRlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUJ5dGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDVkMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUJ5dGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVCeXRlVHlwZSBleHRlbmRzIFByaW1pdGl2ZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUHJpbWl0aXZlQnl0ZVR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9CWVRFX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiQnl0ZS5wYXJzZUJ5dGUoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVDaGFyVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUNoYXJUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MmY5MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUNoYXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVDaGFyVHlwZSBleHRlbmRzIFByaW1pdGl2ZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUHJpbWl0aXZlQ2hhclR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9DSEFSX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiIiArIG5hbWUgKyAiLmNoYXJBdCgwKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVEb3VibGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlRG91YmxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjM2MmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVEb3VibGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVEb3VibGVUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVEb3VibGVUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fRE9VQkxFX05BTUUpOwotICB9Ci0gCi0gIC8qKgotICAqIFN0cmluZ1RvVHlwZSBnZXRzIHRoZSBzdHJpbmcgdGFrZW4gYnkgdGhlIAotICAqIHVzZXIgaW50byBwcm94eSBmb3JtCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSAiRG91YmxlLnBhcnNlRG91YmxlKCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotICAKLSAgCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlRmxvYXRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlRmxvYXRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMGY5ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUZsb2F0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlRmxvYXRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVGbG9hdFR5cGUoKQotICB7Ci0gICAgc3VwZXIoVHlwZUZhY3RvcnkuUFJJTV9GTE9BVF9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIkZsb2F0LnBhcnNlRmxvYXQoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVJbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlSW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjMzZGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVJbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVJbnRUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVJbnRUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fSU5URUdFUl9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFN0cmluZ1RvVHlwZShTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBjb252ZXJzaW9uID0gIkludGVnZXIucGFyc2VJbnQoIiArIG5hbWUgKyAiKTsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0gIAotICAKLSB9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVKYXZhVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVKYXZhVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxNTIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlSmF2YVR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgUHJpbWl0aXZlSmF2YVR5cGVzIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVKYXZhVHlwZXMoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBzdXBlcih0eXBlKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlIC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9IGZUeXBlICsgIi52YWx1ZU9mKCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsgICAgCi0gIH0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICJTdHJpbmcudmFsdWVPZigiICsgbmFtZSArICIpIjsKLSAgfQotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZUxvbmdUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlTG9uZ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwYzgyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlTG9uZ1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZUxvbmdUeXBlIGV4dGVuZHMgUHJpbWl0aXZlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBQcmltaXRpdmVMb25nVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5QUklNX0xPTkdfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJMb25nLnBhcnNlTG9uZygiICsgbmFtZSArICIpOyI7Ci0gICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLSAgCi0gIAotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZVNob3J0VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZVNob3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkxY2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9QcmltaXRpdmVTaG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZVNob3J0VHlwZSBleHRlbmRzIFByaW1pdGl2ZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgUHJpbWl0aXZlU2hvcnRUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlBSSU1fU0hPUlRfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJTaG9ydC5wYXJzZVNob3J0KCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsKLSAgfQotICAKLSAgCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ByaW1pdGl2ZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MTc2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUHJpbWl0aXZlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW1pdGl2ZVR5cGUgZXh0ZW5kcyBTaW1wbGVUeXBlIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBzdXBlcih0eXBlKTsKLSAgfQotIAotIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIlN0cmluZy52YWx1ZU9mKCIgKyBuYW1lICsgIikiOwotICB9Ci0gIAotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1JlY29nbml6ZWRSZXR1cm5UeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUmVjb2duaXplZFJldHVyblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3MjFhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvUmVjb2duaXplZFJldHVyblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHJlY29nbml6ZWQgcmV0dXJuIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFJlY29nbml6ZWRSZXR1cm5UeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFJlY29nbml6ZWRSZXR1cm5UeXBlKFN0cmluZyB0eXBlKQotICB7Ci0gICAgZlR5cGUgPSB0eXBlOwotICAgIGZVbmlxdWVOYW1lID0gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBub3QgcmVsZXZhbnQgYXQgdGhpcyBwb2ludCAKLSAgKi8KLSAgcHVibGljIFN0cmluZyBpbnB1dEZvcm0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgICAgcmV0dXJuICIiOwotICB9Ci0KLSAgIC8qKgotICAqIGFnYWluIG5vdCByZWxldmFudAotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RDb2RlKFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpCi0gIHsKLSAgICAgcmV0dXJuICIiOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBoYW5kcyBiYWNrIHRoZSBjb2RlIHJlcXVpcmVkIHRvIGdvIGZyb20gdGhlIAotICAqIHN0cmluZyB0aGUgdXNlciBlbnRlcmVkIHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZWxlbWVudAotICAqIEBwYXJhbSBTdHJpbmcgdHlwZU5hbWUgdGhpcyBpcyB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHR5cGUgaWUgaW50LGJvb2xlYW4KLSAgKiBAcGFyYW0gU3RyaW5nIG5vZGVOYW1lIFRoZSBub2RlTmFtZSBpcyBqdXN0IHRoZSBhdHRyaWJ1dGVuYW1lICsgVGVtcC4gCi0gICogQHBhcmFtIFN0cmluZyB0aGUgYXR0cmlidXRlTmFtZSAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgc3RyaW5nQ29udmVyc2lvbihTdHJpbmcgdHlwZU5hbWUsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgZnVuY3Rpb24gdGhhdCBkaWN0YXRlcyBob3cgd2Ugd2FudCB0byBkaXNwbGF5IHRoaXMgdHlwZSAKLSAgKiB1cG9uIHJlY2VpdmluZyBpdCBhcyBhIHJldHVybiBmcm9tIGEgcHJveHkgbWV0aG9kCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiB0aGUgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBkaXNwbGF5IHN0cmluZwotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIG5vbkJlYW4gPSAgIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgImlmKCIgKyBuYW1lICsgIiE9IG51bGwpeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICAgCi0gICAgCSAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wIiArIGdldFVuaXF1ZU5hbWUoKSsiID0gIiArIG5hbWUgKyAiLnRvU3RyaW5nKCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgIAotICAgIAkgICAgICAgICAgICAgKyBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICAiPCU9dGVtcCIgKyBnZXRVbmlxdWVOYW1lKCkgKyIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgICI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIn0iOwotICAgIHJldHVybiBub25CZWFuOwotICB9Ci0KLSAgLyoqCi0gICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdHlwZQotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBuYW1lKGluY2x1ZGluZyBwYWNrYWdlKS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBmVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZlVuaXF1ZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVbmlxdWVOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlVuaXF1ZU5hbWUgPSBuYW1lOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NPQVBFbGVtZW50VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NPQVBFbGVtZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODllMDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TT0FQRWxlbWVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFNPQVBFbGVtZW50VHlwZSBpbXBsZW1lbnRzIERhdGFUeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgZlR5cGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZlVuaXF1ZU5hbWU7Ci0KLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBTT0FQRWxlbWVudFR5cGUoKQotICB7Ci0gICAgZlR5cGUgPSAiamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQiOwotICAgIGZVbmlxdWVOYW1lID0gIiI7Ci0gIH0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIERvbUVsZW1lbnQgZm9ybSBpcyBhIHRleHQgYm94Ci0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnB1dCBlbGVtZW50Ci0gICogQHJldHVybiBTdHJpbmcgVGhlIGZvcm0gdXNlZCB0byBjb2xsZWN0IHRoZSBkYXRhCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgaW5wdXRGb3JtKFN0cmluZyBuYW1lKQotICB7Ci0gICAgIFN0cmluZyBpbnB1dEZvcm0gPSAiPFREIEFMSUdOPVwibGVmdFwiPjxURVhUQVJFQSBSb3dzPTcgQ29scz00NSBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCI+PC9URVhUQVJFQT48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLQotICAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBkaWN0YXRlcyBob3cgeW91IHdhbnQgdG8gcHJvY2VzcyB0aGUgCi0gICogaW5jb21pbmcgc3RyaW5nIGZyb20gdGhlIGlucHV0IGpzcC4gWW91IG1heSBvciBtYXkgbm90IHVzZSB0aGUgbWFya3VwIAotICAqIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4gVGhlIHNpbXBsZSB0eXBlcyB1c2UgaXQuIERvbUVsZW1lbnQgZG9lcyBub3QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0Q29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKQotICB7Ci0gICAgIFN0cmluZyByZXF1ZXN0Q29kZSA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyIgKyBHZW5lcmF0b3IuU1BBQ0UgCi0gICAgIAkgICAgICAgICAgICAgICAgICAgKyBpZCArICI9ICByZXF1ZXN0LmdldFBhcmFtZXRlcihcIiIKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIG5hbWUgKyJcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiByZXF1ZXN0Q29kZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgZnVuY3Rpb24gaGFuZHMgYmFjayB0aGUgY29kZSByZXF1aXJlZCB0byBnbyBmcm9tIHRoZSAKLSAgKiBzdHJpbmcgdGhlIHVzZXIgZW50ZXJlZCB0byB0aGUgYWN0dWFsIHR5cGUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gIEdlbmVyYXRvci5ET1VCTEVfVEFCIAotICAgICAgICAgICAgICAgICAgICAgICArICJqYXZheC54bWwuc29hcC5TT0FQRWxlbWVudCAiICsgbm9kZU5hbWUgKyAiPSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbC5Tb2FwRWxlbWVudEhlbHBlci5jcmVhdGVTT0FQRWxlbWVudEZyb21YTUxTdHJpbmcoIiArIGF0dHJpYnV0ZU5hbWUgKyAiKTsiIAotCSAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0KLSAgLyoqCi0gICogVGhpcyBpcyBiYXNpY2FsbHkgdGhlIGZ1bmN0aW9uIHRoYXQgZGljdGF0ZXMgaG93IHdlIHdhbnQgdG8gZGlzcGxheSB0aGlzIHR5cGUgCi0gICogdXBvbiByZWNlaXZpbmcgaXQgYXMgYSByZXR1cm4gZnJvbSBhIHByb3h5IG1ldGhvZAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgZGlzcGxheSBzdHJpbmcKLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlQ29udmVyc2lvbihTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyB0eXBlVG9TdHJpbmcgPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJTdHJpbmcgdGVtcFJlc3VsdCIgKyBnZXRVbmlxdWVOYW1lKCkrICIgPSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbC5Tb2FwRWxlbWVudEhlbHBlci5zb2FwRWxlbWVudFdyaXRlcigiICsgbmFtZSArICIsIG5ldyBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyKCkiICsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlPSB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLQotICAgIHJldHVybiB0eXBlVG9TdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0eXBlCi0gICogQHJldHVybiBTdHJpbmcgdGhlIG5hbWUoaW5jbHVkaW5nIHBhY2thZ2UpLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZUeXBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCkKLSAgewotICAgIHJldHVybiBmVW5pcXVlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVW5pcXVlTmFtZSA9IG5hbWU7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU2ltcGxlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1NpbXBsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3ODM0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU2ltcGxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiAxIG9mIHRocmVlIHR5cGUgZWxlbWVudHMgcmVwcmVzZW50cyBwcmltaXRpdmVzIAotKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVFbGVtZW50IGV4dGVuZHMgVHlwZUVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIFBhcmFtZXRlciB0aGF0IG93bnMgdGhpcyBzaW1wbGUgdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIHNpbXBsZSBlbGVtZW50LgotICAqLwotICBwdWJsaWMgU2ltcGxlRWxlbWVudCAoIFBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcHJpbSkKLSAgewotICAgIHN1cGVyKG5hbWUscGFyYW1ldGVyRWxlbWVudCxUeXBlRWxlbWVudC5SRUxfT1dORVIsVHlwZUVsZW1lbnQuUkVMX1RZUEUsVHlwZUVsZW1lbnQuU0lNUExFKTsKLSAgICBmT3duZXJUeXBlID0gVHlwZUVsZW1lbnQuUEFSQU1FVEVSX09XTkVSOwotICAgIHNldFByaW1pdGl2ZShwcmltKTsKLSAgfQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIEF0dHJpYnV0ZSB0aGF0IG93bnMgdGhpcyBzaW1wbGUgdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIEF0dHJpYnV0ZUVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBTaW1wbGVFbGVtZW50ICggQXR0cmlidXRlRWxlbWVudCBhdHRyaWJ1dGVFbGVtZW50LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBwcmltKQotICB7Ci0gICAgc3VwZXIobmFtZSxhdHRyaWJ1dGVFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5TSU1QTEUpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5BVFRSSUJVVEVfT1dORVI7Ci0gICAgc2V0UHJpbWl0aXZlKHByaW0pOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IgCi0gICogQHBhcmFtIFBhcmFtZXRlckVsZW1lbnQgVGhlIEF0dHJpYnV0ZSB0aGF0IG93bnMgdGhpcyBzaW1wbGUgdHlwZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE5hbWUgb2YgdGhlIEF0dHJpYnV0ZUVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBTaW1wbGVFbGVtZW50ICggRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcHJpbSkKLSAgewotICAgIHN1cGVyKG5hbWUsZmllbGRFbGVtZW50LFR5cGVFbGVtZW50LlJFTF9PV05FUixUeXBlRWxlbWVudC5SRUxfVFlQRSxUeXBlRWxlbWVudC5TSU1QTEUpOwotICAgIGZPd25lclR5cGUgPSBUeXBlRWxlbWVudC5GSUVMRF9PV05FUjsKLSAgICBzZXRQcmltaXRpdmUocHJpbSk7Ci0gIH0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU2ltcGxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE5NDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TaW1wbGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci0KLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVUeXBlIGltcGxlbWVudHMgRGF0YVR5cGUKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBmVW5pcXVlTmFtZTsKLQotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFNpbXBsZVR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBmVHlwZSA9IHR5cGU7Ci0gIH0KLQotICAvKioKLSAgKiBpbnB1dEZvcm0gcmV0dXJucyB0aGUgdXNlciBpbnB1dCBodG1sCi0gICogVGhlIHNpbXBsZSBmb3JtIGlzIGp1c3QgYSB0ZXh0IGlucHV0IGJveAotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW5wdXQgZWxlbWVudAotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBmb3JtIHVzZWQgdG8gY29sbGVjdCB0aGUgZGF0YQotICAqLwotICBwdWJsaWMgU3RyaW5nIGlucHV0Rm9ybShTdHJpbmcgbmFtZSkKLSAgewotICAgICBTdHJpbmcgaW5wdXRGb3JtID0gIjxURCBBTElHTj1cImxlZnRcIj48SU5QVVQgVFlQRT1cIlRFWFRcIiBOQU1FPVwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUgKyAiXCIgU0laRT0yMD48L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FIAotICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiBpbnB1dEZvcm07Ci0gIH0KLQotICAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBkaWN0YXRlcyBob3cgeW91IHdhbnQgdG8gcHJvY2VzcyB0aGUgCi0gICogaW5jb21pbmcgc3RyaW5nIGZyb20gdGhlIGlucHV0IGpzcC4gWW91IG1heSBvciBtYXkgbm90IHVzZSB0aGUgbWFya3VwIAotICAqIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZS4gVGhlIHNpbXBsZSB0eXBlcyB1c2UgaXQuIERvbUVsZW1lbnQgZG9lcyBub3QKLSAgKiBAcGFyYW0gU3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29kZSB0byBiZSBnZW5lcmF0ZWQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0Q29kZShTdHJpbmcgbmFtZSwgU3RyaW5nIGlkKQotICB7Ci0gICAgIFN0cmluZyByZXF1ZXN0Q29kZSA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyIgKyBHZW5lcmF0b3IuU1BBQ0UgCi0gICAgIAkgICAgICAgICAgICAgICAgICAgKyBpZCArICI9ICByZXF1ZXN0LmdldFBhcmFtZXRlcihcIiIKLSAgICAgCSAgICAgICAgICAgICAgICAgICArIG5hbWUgKyJcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkU7Ci0gICAgIHJldHVybiByZXF1ZXN0Q29kZTsKLSAgIH0KLSAKLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiBoYW5kcyBiYWNrIHRoZSBjb2RlIHJlcXVpcmVkIHRvIGdvIGZyb20gdGhlIAotICAqIHN0cmluZyB0aGUgdXNlciBlbnRlcmVkIHRvIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZWxlbWVudAotICAqIGl0IHVzZXMgYW5vdGhlciBmdW5jdGlvbiB0aGF0IGFsbCBzdWJjbGFzc2VzIG9mIFNpbXBsZVR5cGUgYXJlIHJlcXVpcmVkIHRvIGltcGxlbWVudAotICAqIFRoZSBTdHJpbmdUb1R5cGUgZnVuY3Rpb24KLSAgKiBAcGFyYW0gU3RyaW5nIHR5cGVOYW1lIHRoaXMgaXMgdGhlIGFjdHVhbCBuYW1lIG9mIHRoZSB0eXBlIGllIGludCxib29sZWFuCi0gICogQHBhcmFtIFN0cmluZyBub2RlTmFtZSBUaGUgbm9kZU5hbWUgaXMganVzdCB0aGUgYXR0cmlidXRlbmFtZSArIFRlbXAuIAotICAqIEBwYXJhbSBTdHJpbmcgdGhlIGF0dHJpYnV0ZU5hbWUgCi0gICogQHJldHVybiBTdHJpbmcgY29udmVydCB0aGUgc3RyaW5nIHRvIHR5cGUgLgotICAqLwotICBwdWJsaWMgU3RyaW5nIHN0cmluZ0NvbnZlcnNpb24oU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgIFN0cmluZyBjb252ZXJzaW9uID0gR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyB0eXBlTmFtZSArIEdlbmVyYXRvci5TUEFDRSArIG5vZGVOYW1lIAotICAgICAJICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5TUEFDRSArICIgPSAiICsgU3RyaW5nVG9UeXBlKGF0dHJpYnV0ZU5hbWUpIAotICAgICAJICAgICAgICAgICAgICAgICArICIiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLSAgICAgcmV0dXJuIGNvbnZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgKiBjb252ZXJ0cyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm94eSAKLSAgKiBiYWNrIHRvIGEgc3RyaW5nIAotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHR5cGUgdG8gc3RyaW5nLgotICAqLwotICBwdWJsaWMgU3RyaW5nIFR5cGVDb252ZXJzaW9uKFN0cmluZyBuYW1lKQotICB7Ci0KLSAgICBTdHJpbmcgY29udmVyc2lvbiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIlN0cmluZyB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiA9IG9yZy5lY2xpcHNlLmpzdC53cy51dGlsLkpzcFV0aWxzLm1hcmt1cCgiICsgVHlwZVRvU3RyaW5nKG5hbWUpICsgIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORQotICAgICAgICAgICAgICAgICAgICAgICArIEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlPSB0ZW1wUmVzdWx0IiArIGdldFVuaXF1ZU5hbWUoKSsgIiAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FCi0gICAgICAgICAgICAgICAgICAgICAgICsgR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORTsKLQotICAgIHJldHVybiBjb252ZXJzaW9uOwotICB9Ci0KLSAgIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAqIHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHR5cGUKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgbmFtZShpbmNsdWRpbmcgcGFja2FnZSkuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZlR5cGU7Ci0gIH0KLQotICAgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKCkKLSAgewotICAgIHJldHVybiBmVW5pcXVlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVuaXF1ZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVW5pcXVlTmFtZSA9IG5hbWU7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU3RhdGVMZXNzQmVhblR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdGF0ZUxlc3NCZWFuVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE5OGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdGF0ZUxlc3NCZWFuVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgU3RhdGVMZXNzQmVhblR5cGUgZXh0ZW5kcyBSZWNvZ25pemVkUmV0dXJuVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotCi0gIHByaXZhdGUgU3RyaW5nIGZUeXBlTmFtZTsKLQotCi0KLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIAotICBwdWJsaWMgU3RhdGVMZXNzQmVhblR5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5TVEFURUxFU1NfQkVBTik7Ci0gICAgZlR5cGVOYW1lID0gbmFtZTsKLQotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdHJpbmdUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvU3RyaW5nVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjk5Yzc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9TdHJpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWw7Ci0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVHlwZSBleHRlbmRzIFNpbXBsZVR5cGUgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgU3RyaW5nVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5TVFJJTkdfTkFNRSk7Ci0gIH0KLSAKLSAgLyoqCi0gICogU3RyaW5nVG9UeXBlIGdldHMgdGhlIHN0cmluZyB0YWtlbiBieSB0aGUgCi0gICogdXNlciBpbnRvIHByb3h5IGZvcm0KLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIGNvbnZlcnNpb24gPSBuYW1lICsgIjsiOwotICAgIHJldHVybiBjb252ZXJzaW9uOyAgICAKLSAgfQotCi0gIC8qKgotICAqIFRoZSBzdHJpbmdDb252ZXJzaW9uIGZ1bmN0aW9uIG5haWxzIG91dCBzcGVjaWZpYyBjb252ZXJzaW9uIG1ldGhvZHMgdXNlZCBhbW9uZyBzaW1wbGUgdHlwZXMgCi0gICogVGhpcyBtZXRob2QgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgU2ltcGxlVHlwZSBzdWJjbGFzc2VzCi0gICogQHBhcmFtIFN0cmluZyB0aGUgbmFtZSBvZiBzdHJpbmcgYWZ0ZXIgdGhlIHJlcXVlc3QgY2FsbAotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY3R1YWwgY29udmVyc2lvbiBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBUeXBlVG9TdHJpbmcoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gIlN0cmluZy52YWx1ZU9mKCIgKyBuYW1lICsgIikiOwotICB9Ci0gCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVHlwZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGYyMmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSogVHlwZUVsZW1lbnQgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIEphdmEgYmVhbiBmZWF0dXJlcyB0aGF0IGhhdmUgdHlwZXMuCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVFbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIGludCBCRUFOID0gMDsKLSAgcHVibGljIHN0YXRpYyBpbnQgU0lNUExFID0gMTsKLSAgcHVibGljIHN0YXRpYyBpbnQgQVJSQVkgPSAyOwotCi0gIHByaXZhdGUgaW50IGZUeXBlOwotICBwcm90ZWN0ZWQgaW50IGZPd25lclR5cGU7Ci0gIHByaXZhdGUgYm9vbGVhbiBmUHJpbWl0aXZlID0gZmFsc2U7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuIEF1dG9tYXRpY2FsbHkgYWRkcyB0aGlzIG9iamVjdCB0byB0aGUgZ2l2ZW4gbW9kZWwuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQKLSAgKiBAcGFyYW0gbW9kZWwgVGhlIG1vZGVsIHRvIG93biB0aGlzIG9iamVjdC4KLSAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdCwgb25lIG9mCi0gICogPGNvZGU+QkVBTjwvY29kZT4sIDxjb2RlPlNJTVBMRTwvY29kZT4gb3IgPGNvZGU+QVJSQVk8L2NvZGU+LgotICAqLwotICBwcm90ZWN0ZWQgVHlwZUVsZW1lbnQgKCBTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIGludCB0eXBlICkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIGZUeXBlID0gdHlwZTsKLSAgfQotCi0gIC8qKgotICAqLwotICBwcm90ZWN0ZWQgVHlwZUVsZW1lbnQgKCBTdHJpbmcgbmFtZSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lLCBTdHJpbmcgaW5ib3VuZFJlbE5hbWUsIGludCB0eXBlICkKLSAgewotICAgIHN1cGVyKG5hbWUsZWxlbWVudCxvdXRib3VuZFJlbE5hbWUsaW5ib3VuZFJlbE5hbWUpOwotICAgIGZUeXBlID0gdHlwZTsKLSAgfQotCi0gIC8qCi0gICpUaGlzIHdpbGwgdGVsbCB5b3Ugd2V0aGVyIHRoZSB0eXBlIGlzIGEgYmVhbgotICAqQHBhcmFtIEJvb2xlYW4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYmVhbgotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gaXNCZWFuKCkKLSAgewotICAgIGlmIChmVHlwZSA9PSBCRUFOKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAqVGhpcyB3aWxsIHRlbGwgeW91IHdldGhlciB0aGUgdHlwZSBpcyBhIGJlYW4KLSAgKkBwYXJhbSBCb29sZWFuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGJlYW4KLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkKLSAgewotICAgIHJldHVybiBmUHJpbWl0aXZlOwotICB9Ci0KLSAgLyoKLSAgKlRoaXMgd2lsbCB0ZWxsIHlvdSB3ZXRoZXIgdGhlIHR5cGUgaXMgYSBiZWFuCi0gICpAcGFyYW0gQm9vbGVhbiByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBiZWFuCi0gICoqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRQcmltaXRpdmUoYm9vbGVhbiBwcmltKQotICB7Ci0gICAgZlByaW1pdGl2ZSA9IHByaW07IAotICB9Ci0KLQotICAvKgotICAqIFRoaXMgaXMgbWFpbmx5IG5lZWRlZCBmb3IgYXJyYXlzIGFzIHdpdGggYWxsIHR5cGVzIHRoZQotICAqIG5hbWVzIGNvbWUgb3V0IGFzIGphdmEudXRpbC50eXBlLCBidXQgd2l0aCBhbiBhcnJheSBpdCAKLSAgKiBpc250IGV4cGxpY2l0IGluIHRlbGxpbmcgdXMgaXRzIGFuIGFycmF5Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotICAKLSAgLyoKLSAgKlRoaXMgd2lsbCB0ZWxsIHlvdSB3ZXRoZXIgdGhlIHR5cGUgaXMgYSBzaW1wbGUKLSAgKkBwYXJhbSBCb29sZWFuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHNpbXBsZQotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTaW1wbGUoKQotICB7Ci0gICAgaWYgKGZUeXBlID09IFNJTVBMRSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoKLSAgKlRoaXMgd2lsbCB0ZWxsIHlvdSB3ZXRoZXIgdGhlIHR5cGUgaXMgYSBhcnJheQotICAqQHBhcmFtIEJvb2xlYW4gcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYXJyYXkKLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKQotICB7Ci0gICAgaWYgKGZUeXBlID09IEFSUkFZKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfQVRUUklCVVRFUyA9ICJhdHRyaWJ1dGVzIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0ZJRUxEUyA9ICJmaWVsZHMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfVFlQRSA9ICJ0eXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX09XTkVSID0gIm93bmVyIjsKLQotICBwdWJsaWMgc3RhdGljIGludCBQQVJBTUVURVJfT1dORVIgPSAwOwotICBwdWJsaWMgc3RhdGljIGludCBBVFRSSUJVVEVfT1dORVIgPSAxOwotICBwdWJsaWMgc3RhdGljIGludCBGSUVMRF9PV05FUiA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFJPT1QgPSAzOwotCi0gIC8qCi0gICogVGhpcyBjb3VsZCBiZSBUaGUgcm9vdCB0ZXN0IGJlYW4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIGlzIHJvb3QgYmVhbgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoKQotICB7Ci0gICAgaWYoZk93bmVyVHlwZSA9PSBST09UKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAqIFRoaXMgVHlwZSBjb3VsZCBiZSBvd25lZCBieSBhIFBhcmFtZXRlciBvciBhbiBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIGlzIG93bmVkIGJ5IGEgcGFyYW1ldGVyCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGlzT3duZXJQYXJhbWV0ZXIoKQotICB7Ci0gICAgaWYoZk93bmVyVHlwZSA9PSBQQVJBTUVURVJfT1dORVIpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qCi0gICogVGhpcyBUeXBlIGNvdWxkIGJlIG93bmVkIGJ5IGEgUGFyYW1ldGVyIG9yIGFuIGF0dHJpYnV0ZQotICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoaXMgaXMgb3duZWQgYnkgYW4gYXR0cmlidXRlIAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc093bmVyQXR0cmlidXRlKCkKLSAgewotICAgIGlmKGZPd25lclR5cGUgPT0gQVRUUklCVVRFX09XTkVSKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKgotICAqIFRoaXMgVHlwZSBjb3VsZCBiZSBvd25lZCBieSBhIFBhcmFtZXRlciBvciBhbiBhdHRyaWJ1dGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGlzIGlzIG93bmVkIGJ5IGFuIGF0dHJpYnV0ZSAKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPd25lckZpZWxkKCkKLSAgewotICAgIGlmKGZPd25lclR5cGUgPT0gRklFTERfT1dORVIpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgVHlwZSBtYXkgYmUgb3duZWQgYnkgYSBwYXJhbWV0ZXIgb3IgYW4gYXR0cmlidXRlIAotICAqIFVzZSB0aGlzIG1ldGhvZCBpbiBjb25qdW5jdGlvbiB3aXRoIGlzT3duZXJQYXJhbXRlciwgaXNPd25lcgotICAqIEByZXR1cm4gQmFzaWNFbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgb3ducyB0aGlzIGF0dHJpYnV0ZS4KLSAgKi8KLSAgcHVibGljIEJhc2ljRWxlbWVudCBnZXRPd25pbmdFbGVtZW50ICgpCi0gIHsKLSAgICBpZiAoaXNPd25lclBhcmFtZXRlcigpKXsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfT1dORVIpOwotICAgICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoQmFzaWNFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gICAgfQotICAgIGVsc2UgaWYoaXNPd25lckF0dHJpYnV0ZSgpKXsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhSRUxfT1dORVIpOwotICAgICAgcmV0dXJuIGUuaGFzTW9yZUVsZW1lbnRzKCkgPyAoQmFzaWNFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGw7Ci0gICAgfQotICAgIGVsc2UgaWYoaXNPd25lckZpZWxkKCkpewotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFJFTF9PV05FUik7Ci0gICAgICByZXR1cm4gZS5oYXNNb3JlRWxlbWVudHMoKSA/IChCYXNpY0VsZW1lbnQpZS5uZXh0RWxlbWVudCgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVHlwZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk4MjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9UeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLS8qKgotICogVHlwZUZhY3RvcnkKLSAqIENyZWF0aW9uIGRhdGU6ICg0LzEwLzIwMDEgMTI6NDE6NDggUE0pCi0gKiBAYXV0aG9yOiBHaWxiZXJ0IEFuZHJld3MKLSAqLwotcHVibGljIGNsYXNzIFR5cGVGYWN0b3J5IAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX05BTUUgICAgICAgICAgICAgICAgICAgPSAiamF2YS5uZXQuVVJMIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX05BTUUgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklHX0RFQ0lNQUxfTkFNRSAgICAgICAgICA9ICJqYXZhLm1hdGguQmlnRGVjaW1hbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJR19JTlRFR0VSX05BTUUgICAgICAgICAgPSAiamF2YS5tYXRoLkJpZ0ludGVnZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX05BTUUgICAgICAgICAgICAgICAgID0gImphdmEudXRpbC5EYXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFR09SSUFOX0NBTEVOREFSX05BTUUgPSAiamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMRU5EQVJfTkFNRSAgICAgICAgICAgICA9ICJqYXZhLnV0aWwuQ2FsZW5kYXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOX05BTUUgICAgICAgICAgICAgID0gImphdmEubGFuZy5Cb29sZWFuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQllURV9OQU1FICAgICAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLkJ5dGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfTkFNRSAgICAgICAgICAgICAgID0gImphdmEubGFuZy5Eb3VibGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTE9BVF9OQU1FICAgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuRmxvYXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFR0VSX05BTUUgICAgICAgICAgICAgICA9ICJqYXZhLmxhbmcuSW50ZWdlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPTkdfTkFNRSAgICAgICAgICAgICAgICAgID0gImphdmEubGFuZy5Mb25nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPUlRfTkFNRSAgICAgICAgICAgICAgICAgPSAiamF2YS5sYW5nLlNob3J0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUkFDVEVSX05BTUUgICAgICAgICAgICA9ICJqYXZhLmxhbmcuQ2hhcmFjdGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9CT09MRUFOX05BTUUgICAgICAgICA9ICJib29sZWFuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9CWVRFX05BTUUgICAgICAgICAgICA9ICJieXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9ET1VCTEVfTkFNRSAgICAgICAgICA9ICJkb3VibGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0ZMT0FUX05BTUUgICAgICAgICAgID0gImZsb2F0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9JTlRFR0VSX05BTUUgICAgICAgICA9ICJpbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0xPTkdfTkFNRSAgICAgICAgICAgID0gImxvbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX1NIT1JUX05BTUUgICAgICAgICAgID0gInNob3J0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9DSEFSX05BTUUgICAgICAgICAgICA9ICJjaGFyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9OQU1FICAgICAgICAgICAgICAgICAgPSAidm9pZCI7Ci0KLSAgLy9zb21lIHNwZWNpYWwgY29tcGxleAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET01fRUxFTUVOVF9OQU1FICAgPSAib3JnLnczYy5kb20uRWxlbWVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRUxFTUVOVF9OQU1FID0gImphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVMRVNTX0JFQU4gPSBCZWFuRWxlbWVudC5TVEFURUxFU1NfQkVBTjsKLQotCi0KLSAgcHVibGljIHN0YXRpYyBIYXNodGFibGUgamF2YVR5cGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgcHVibGljIFR5cGVGYWN0b3J5KCl7fQotCi0gIHN0YXRpY3sKLSAgICBqYXZhVHlwZXMucHV0KEJPT0xFQU5fTkFNRSxuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKEJPT0xFQU5fTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoQllURV9OQU1FLCAgIG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoQllURV9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChET1VCTEVfTkFNRSwgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhET1VCTEVfTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoRkxPQVRfTkFNRSwgIG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoRkxPQVRfTkFNRSkpOwotICAgIGphdmFUeXBlcy5wdXQoSU5URUdFUl9OQU1FLG5ldyBQcmltaXRpdmVKYXZhVHlwZXMoSU5URUdFUl9OQU1FKSk7Ci0gICAgamF2YVR5cGVzLnB1dChMT05HX05BTUUsICAgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhMT05HX05BTUUpKTsKLSAgICBqYXZhVHlwZXMucHV0KFNIT1JUX05BTUUsICBuZXcgUHJpbWl0aXZlSmF2YVR5cGVzKFNIT1JUX05BTUUpKTsKLSAgICBqYXZhVHlwZXMucHV0KENIQVJBQ1RFUl9OQU1FLCAgbmV3IFByaW1pdGl2ZUphdmFUeXBlcyhDSEFSQUNURVJfTkFNRSkpOwotICB9Ci0KLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHVzIHRvIGhhbmRsZSByZWNvZ25pemVkIGJlYW5zIAotICAqIGluIGRpc3BsYXlpbmcgYW5kIGdlbmVyYXRpbmcgY29kZSBmb3IgdGhlbSBpbnN0ZWFkIG9mIAotICAqIHRyZWF0aW5nIHRoZW0gYXMgY29tcGxleCB0eXBlcwotICAqLyAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlY29nbml6ZWRCZWFuKFN0cmluZyB0eXBlKQotICB7Ci0KLSAgICAvLyAgICAgCi0gICAgLy9jdXJyZW50IHJlY29nbml6ZWQgYmVhbnMgKG1vc3RseSBqYXZhLmxhbmcpCi0gICAgaWYgKHR5cGUuZXF1YWxzKEJPT0xFQU5fTkFNRSkgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoQllURV9OQU1FKSAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKERPVUJMRV9OQU1FKSAgICAgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhGTE9BVF9OQU1FKSAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKElOVEVHRVJfTkFNRSkgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoTE9OR19OQU1FKSAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKFNIT1JUX05BTUUpICAgICAgICAgICAgICB8fCAgICAgIAotICAgICAgICB0eXBlLmVxdWFscyhDSEFSQUNURVJfTkFNRSkgICAgICAgICAgfHwgICAgICAKLSAgICAgICAgdHlwZS5lcXVhbHMoRE9NX0VMRU1FTlRfTkFNRSkgICAgICAgIHx8ICAgICAgCi0JICAgIHR5cGUuZXF1YWxzKFNPQVBfRUxFTUVOVF9OQU1FKSAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoQklHX0RFQ0lNQUxfTkFNRSkgICAgICAgICB8fAotICAgICAgICB0eXBlLmVxdWFscyhCSUdfSU5URUdFUl9OQU1FKSAgICAgICAgIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKERBVEVfTkFNRSkgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgdHlwZS5lcXVhbHMoR1JFR09SSUFOX0NBTEVOREFSX05BTUUpIHx8Ci0gICAgICAgIHR5cGUuZXF1YWxzKENBTEVOREFSX05BTUUpICAgICAgICAgICB8fCAKLSAgICAgICAgdHlwZS5lcXVhbHMoVVJMX05BTUUpICAgICAgICAgICAgICAgICB8fCAgICAKLSAgICAgICAgdHlwZS5lcXVhbHMoU1RSSU5HX05BTUUpKSAgcmV0dXJuIHRydWU7ICAgICAgCi0gICAgIHJldHVybiBmYWxzZTsgCi0gIAotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB1cyB0byBoYW5kbGUgdW5zdXBwb3J0ZWQgdHlwZXMgCi0gICogaWYgd2UgZG9udCB3YW50IHRvIHN1cHBvcnQgYSB0eXBlIGFuZCB3ZSB3YW50IHRvIG9taXR0IHRoaXMgIAotICAqIG1ldGhvZCBmcm9tIHRoZSBzYW1wbGVzCi0gICogQHBhcmFtIGphdmFIZWxwZXJzIHRoaXMgaXMgdGhlIHR5cGUgdG8gYmUgZXZhbHVhdGVkCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIHR5cGUgaXMgbm90IHN1cHBvcnRlZAotICAqLyAKLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5TdXBwb3J0ZWRUeXBlKEphdmFIZWxwZXJzIGphdmFIZWxwZXJzKQotICB7Ci0gICAgLy93ZSBhbHNvIGRvbnQgc3VwcG9ydCBhcnJheXMKLSAgICBpZiAoamF2YUhlbHBlcnMuaXNBcnJheSgpfHwKLSAgICAJCWphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKE1BUF9OQU1FKXx8Ci0gICAgCQlqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpLmVxdWFscyhWRUNUT1JfTkFNRSl8fAotICAgIAkJamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5jbGFzcyIpCSkgcmV0dXJuIHRydWU7Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFTSFRBQkxFX05BTUUgPSAiamF2YS51dGlsLkhhc2h0YWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUF9OQU1FID0gImphdmEudXRpbC5NYXAiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBWRUNUT1JfTkFNRSA9ICJqYXZhLnV0aWwuVmVjdG9yIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQVJSQVlfTkFNRSA9IEFycmF5RWxlbWVudC5BUlJBWV9OQU1FOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUklNSVRJVkVfQVJSQVlfTkFNRSA9ICJwcmltaXRpdmVhcnJheSI7Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVjb2duaXplZFJldHVyblR5cGUoSmF2YUhlbHBlcnMgamF2YUhlbHBlcnMpCi0gIHsKLSAgICAvL2FycmF5cyAKLSAgICAvL0hhc2h0YWJsZQotICAgIC8vVmVjdG9ycwotICAgIGlmIChqYXZhSGVscGVycy5pc0FycmF5KCkpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKGphdmFIZWxwZXJzLmdldEphdmFOYW1lKCkuZXF1YWxzKEhBU0hUQUJMRV9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmIChqYXZhSGVscGVycy5nZXRKYXZhTmFtZSgpLmVxdWFscyhWRUNUT1JfTkFNRSkpcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAoamF2YUhlbHBlcnMuZ2V0SmF2YU5hbWUoKS5lcXVhbHMoTUFQX05BTUUpKXJldHVybiB0cnVlOwotICAgIGVsc2UgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVjb2duaXplZFJldHVyblR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICAvL2FycmF5cyAKLSAgICAvL0hhc2h0YWJsZQotICAgIC8vVmVjdG9ycwotICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoQVJSQVlfTkFNRSkpIHJldHVybiB0cnVlOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEhBU0hUQUJMRV9OQU1FKSlyZXR1cm4gdHJ1ZTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhWRUNUT1JfTkFNRSkpcmV0dXJuIHRydWU7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoTUFQX05BTUUpKXJldHVybiB0cnVlOwotICAgIGVsc2UgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhdGVMZXNzQmVhbihTdHJpbmcgdHlwZSkKLSAgewotICAgIGlmKHR5cGUuc3RhcnRzV2l0aChTVEFURUxFU1NfQkVBTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0KLSAgLyoqCi0gICogQ3JlYXRlcyBhIHR5cGUgYmFzZWQgb24gdGhlIEphdmFIZWxwZXIgdGhlbiBzZXRzIHRoaXMgdHlwZSBpbiB0aGUgZWxlbWVudAotICAqIEBwYXJhbXMgSmF2YUhlbHBlcnMgdGhpcyBob2xkcyB0aGUgdHlwZQotICAqIEBwYXJhbSBUeXBlRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCB3aWxsIGhvbGQgdGhlIHR5cGUgY3JlYXRlZAotICAqIEBwYXJhbSBTdHJpbmcgVW5pcXVlbmFtZSB0byBiZSB1c2VkIHdoZW4gbmFtaW5nIHRlbXAgdmFyaWFibGVzCi0gICovCi0gCi0gIHB1YmxpYyBzdGF0aWMgRGF0YVR5cGUgY3JlYXRlVHlwZShTdHJpbmcgdHlwZSwgU3RyaW5nIFVuaXF1ZU5hbWUpCi0gIHsKLSAgICAvL3RoaXMgZ3V5IG1pZ2h0IGJlIGJvdGggc3RhdGVsZXNzIGFuZCBvbmUgb2YgdGhlIGJlbG93IGVsZW1lbnRzCi0gICAgLy93ZSB3b3VsZCBsaWtlIHRvIGJlIGFzIHNwZWNpZmljIGFzIHdlIGNhbiwgc3RhdGVsZXNzIGlzIHRoZSB3b3JzdCBjYXNlIAotICAgIGJvb2xlYW4gc3RhdGVsZXNzID0gZmFsc2U7ICAKLSAgICBpZih0eXBlLnN0YXJ0c1dpdGgoU1RBVEVMRVNTX0JFQU4pKSB7Ci0gICAgICBzdGF0ZWxlc3MgPSB0cnVlOwotICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyaW5nKDI5KTsgCi0gICAgfQotICAgCi0gICAgRGF0YVR5cGUgZGF0YXR5cGUgPSBudWxsOwotICAgIGlmICAgICAgKHR5cGUuZXF1YWxzKFBSSU1fQk9PTEVBTl9OQU1FKSkgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlQm9vbGVhblR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX0JZVEVfTkFNRSkpICAgICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVCeXRlVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fRE9VQkxFX05BTUUpKSAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlRG91YmxlVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fRkxPQVRfTkFNRSkpICAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlRmxvYXRUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoUFJJTV9MT05HX05BTUUpKSAgICBkYXRhdHlwZSA9IG5ldyBQcmltaXRpdmVMb25nVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fSU5URUdFUl9OQU1FKSkgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlSW50VHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFBSSU1fQ0hBUl9OQU1FKSkgICAgZGF0YXR5cGUgPSBuZXcgUHJpbWl0aXZlQ2hhclR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQUklNX1NIT1JUX05BTUUpKSAgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZVNob3J0VHlwZSgpOwotICAgIAotCi0gICAgLy9zZWUgaWYgdGhpcyBjcml0dGVyIGlzIGEgamF2YXR5cGUKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhCT09MRUFOX05BTUUpICAgICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoQllURV9OQU1FKSAgICAgICAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKERPVUJMRV9OQU1FKSAgICAgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhGTE9BVF9OQU1FKSAgICAgICB8fAotICAgICAgICAgICAgdHlwZS5lcXVhbHMoSU5URUdFUl9OQU1FKSAgICAgfHwKLSAgICAgICAgICAgIHR5cGUuZXF1YWxzKExPTkdfTkFNRSkgICAgICAgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhDSEFSQUNURVJfTkFNRSkgIHx8Ci0gICAgICAgICAgICB0eXBlLmVxdWFscyhTSE9SVF9OQU1FKSkgICAgICAgIGRhdGF0eXBlID0gKERhdGFUeXBlKWphdmFUeXBlcy5nZXQodHlwZSk7ICAgCi0KLSAgICAvL3NlZSBpZiBpdHMgYSBjYXNlIHdlIGhhbmRsZQotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFNUUklOR19OQU1FKSkgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBTdHJpbmdUeXBlKCk7IAotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFZPSURfTkFNRSkpICAgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBWb2lkVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKERPTV9FTEVNRU5UX05BTUUpKSAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBEb21FbGVtZW50VHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKFNPQVBfRUxFTUVOVF9OQU1FKSkgICAgICAgICBkYXRhdHlwZSA9IG5ldyBTT0FQRWxlbWVudFR5cGUoKTsgIAotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEJJR19ERUNJTUFMX05BTUUpKSAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBCaWdEZWNpbWFsVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKEJJR19JTlRFR0VSX05BTUUpKSAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBCaWdJbnRlZ2VyVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKERBVEVfTkFNRSkpICAgICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgRGF0ZVR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhVUkxfTkFNRSkpICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IFVSTFR5cGUoKTsgCi0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoR1JFR09SSUFOX0NBTEVOREFSX05BTUUpKSAgZGF0YXR5cGUgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXJUeXBlKCk7Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoQ0FMRU5EQVJfTkFNRSkpICBkYXRhdHlwZSA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhclR5cGUoKTsKLQotICAgIC8vaXQgY291bGQgYmUgYSByZXR1cm4gdHlwZSB3ZSBzdXBwb3J0Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHMoSEFTSFRBQkxFX05BTUUpKSAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IEhhc2h0YWJsZVR5cGUoKTsKLSAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhWRUNUT1JfTkFNRSkpICAgICAgICAgICAgICAgZGF0YXR5cGUgPSBuZXcgVmVjdG9yVHlwZSgpOwotICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKE1BUF9OQU1FKSkgICAgICAgICAgICAgICAgICBkYXRhdHlwZSA9IG5ldyBNYXBUeXBlKCk7Ci0KLSAgICAvLyBuZWVkIHRvIHNlZSBpZiBpdCBpcyBhbiBvYmplY3QgYXJyYXkKLSAgICAvL29yIGEgcHJpbWl0aXZlCi0gICAgZWxzZSBpZiAodHlwZS5zdGFydHNXaXRoKEFSUkFZX05BTUUpKXsgICAgICAgICAgICAgIAotICAgIAlTdHJpbmcgbmFtZSA9IHR5cGUuc3Vic3RyaW5nKDIxKTsgCi0gICAgICAgIGlmKG5hbWUuc3RhcnRzV2l0aChQUklNX0JPT0xFQU5fTkFNRSkgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9CWVRFX05BTUUpICAgICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0RPVUJMRV9OQU1FKSAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9GTE9BVF9OQU1FKSAgICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0xPTkdfTkFNRSkgICAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9JTlRFR0VSX05BTUUpICB8fAotICAgICAgICAgIG5hbWUuc3RhcnRzV2l0aChQUklNX0NIQVJfTkFNRSkgICAgfHwKLSAgICAgICAgICBuYW1lLnN0YXJ0c1dpdGgoUFJJTV9TSE9SVF9OQU1FKSkKLSAgICAgICAgICAgIGRhdGF0eXBlID0gbmV3IFByaW1pdGl2ZUFycmF5VHlwZShuYW1lKTsgIAotICAgICAgICBlbHNlCi0gICAgICAgIAlkYXRhdHlwZSA9IG5ldyBBcnJheVR5cGUobmFtZSk7Ci0KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RhdGVsZXNzKXsKLSAgICAgICAgZGF0YXR5cGUgPSBuZXcgU3RhdGVMZXNzQmVhblR5cGUodHlwZSk7Ci0KLSAgICB9Ci0KLQotICAgIGRhdGF0eXBlLnNldFVuaXF1ZU5hbWUoVW5pcXVlTmFtZSk7Ci0gICAgcmV0dXJuIGRhdGF0eXBlOwotICAgICAKLSAgfQotICAKLSAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1VSTFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL2JlYW5tb2RlbC9VUkxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMGZiMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1VSTFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotLyoqCi0qIG9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSB0eXBlCi0qIAotKi8KLXB1YmxpYyBjbGFzcyBVUkxUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZSAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAKLSAgLyoqCi0gICpDb25zdHJ1Y3RvcgotICAqCi0gICovCi0gIHB1YmxpYyBVUkxUeXBlKCkKLSAgewotICAgIHN1cGVyKFR5cGVGYWN0b3J5LlVSTF9OQU1FKTsKLSAgfQotIAotICAvKioKLSAgKiBTdHJpbmdUb1R5cGUgZ2V0cyB0aGUgc3RyaW5nIHRha2VuIGJ5IHRoZSAKLSAgKiB1c2VyIGludG8gcHJveHkgZm9ybQotICAqIEByZXR1cm4gU3RyaW5nIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0eXBlIC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBTdHJpbmdUb1R5cGUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgY29udmVyc2lvbiA9ICJuZXcgamF2YS5uZXQuVVJMKCIgKyBuYW1lICsgIik7IjsKLSAgICByZXR1cm4gY29udmVyc2lvbjsgICAgCi0gIH0KLQotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIG5hbWUgKyAiLnRvU3RyaW5nKCkiOwotICB9Ci0gCi0gfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVmVjdG9yVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ZlY3RvclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNzE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVmVjdG9yVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsOwotCi0KLS8qKgotKiBvYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgcmVjb2duaXplZCByZXR1cm4gdHlwZQotKiAKLSovCi1wdWJsaWMgY2xhc3MgVmVjdG9yVHlwZSBleHRlbmRzIFJlY29nbml6ZWRSZXR1cm5UeXBlCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgCi0gIC8qKgotICAqQ29uc3RydWN0b3IKLSAgKgotICAqLwotICBwdWJsaWMgVmVjdG9yVHlwZSgpCi0gIHsKLSAgICBzdXBlcihUeXBlRmFjdG9yeS5WRUNUT1JfTkFNRSk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvYmVhbm1vZGVsL1ZvaWRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVm9pZFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZkZTkxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC9iZWFubW9kZWwvVm9pZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbDsKLQotCi0vKioKLSogb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHR5cGUKLSogCi0qLwotcHVibGljIGNsYXNzIFZvaWRUeXBlIGV4dGVuZHMgU2ltcGxlVHlwZQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIAotICAvKioKLSAgKkNvbnN0cnVjdG9yCi0gICoKLSAgKi8KLSAgcHVibGljIFZvaWRUeXBlKCkKLSAgewotICAgIHN1cGVyKCJ2b2lkIik7Ci0gIH0KLQotICAgLyoqCi0gICogZm9yIGEgdm9pZCB0aGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiAKLSAgKiBAcmV0dXJuIFN0cmluZyBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdHlwZSAuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgU3RyaW5nVG9UeXBlKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICAvKioKLSAgKiBUaGUgc3RyaW5nQ29udmVyc2lvbiBmdW5jdGlvbiBuYWlscyBvdXQgc3BlY2lmaWMgY29udmVyc2lvbiBtZXRob2RzIHVzZWQgYW1vbmcgc2ltcGxlIHR5cGVzIAotICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IFNpbXBsZVR5cGUgc3ViY2xhc3NlcwotICAqIEBwYXJhbSBTdHJpbmcgdGhlIG5hbWUgb2Ygc3RyaW5nIGFmdGVyIHRoZSByZXF1ZXN0IGNhbGwKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgYWN0dWFsIGNvbnZlcnNpb24gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgVHlwZVRvU3RyaW5nKFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuICJTdHJpbmcudmFsdWVPZigiICsgbmFtZSArICIpIjsKLSAgfQotIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhOTc2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC92YWxpZGF0ZS9WYWxpZGF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwudmFsaWRhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci0KLS8qKgotICAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgdmFsaWRhdGlvbiBzdGF0ZSBvZiBwcm9qZWN0cyB0aGF0IHNvbWUgdGFza3MgbWF5IHdhbnQKLSAgKiB0byBkaXNhYmxlLiAgVGhlIG1hbmFnZXIgY2FuIHRoZW4gYmUgdXNlZCB0byByZXN0b3JlIHRoZSB2YWxpZGF0aW9uIHN0YXRlLgotKiovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1hbmFnZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgICAqIFRoaXMgc2V0IGNvbnRhaW5zIGEgc2V0IG9mIElQcm9qZWN0cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWRhdGVkLgotICAqKi8KLSAgcHJpdmF0ZSBIYXNoU2V0IHByb2plY3RzID0gbnVsbDsgICAgICAgICAgICAgIAotCi0gIC8qKgotICAgICogVGhpcyBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGoyZWUgdmFsaWRhdG9yLgotICAqKi8KLSAgLy9wZ20gcHJpdmF0ZSBWYWxpZGF0b3JNYW5hZ2VyIGoyZWVNYW5hZ2VyID0gbnVsbDsKLQotICAvKioKLSAgICAqIFRoaXMgYm9vbGVhbiBjb250YWlucyB0aGUgYXV0byBidWlsZCBzZXR0aW5nIHVuZGVyIHByZWZlcnJlbmNlCi0gICoqLwotICBwcml2YXRlIGJvb2xlYW4gaXNBdXRvQnVpbGRfOwotICBwcml2YXRlIGJvb2xlYW4gYXV0b0J1aWxkRGlzYWJsZWRfOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBWYWxpZGF0aW9uTWFuYWdlcigpCi0gIHsKLSAgICBwcm9qZWN0cyAgICA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgLy9wZ20gajJlZU1hbmFnZXIgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLSAgICBzZXRBdXRvQnVpbGRQcmVmZXJlbmNlKCk7Ci0gICAgYXV0b0J1aWxkRGlzYWJsZWRfID0gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgICogRGlzYWJsZXMgdGhlIHZhbGlkYXRpb24gZm9yIGEgcHJvamVjdCBpZiByZXF1aXJlZC4KLSAgKiovCi0gIHB1YmxpYyB2b2lkIGRpc2FibGVWYWxpZGF0aW9uRm9yUHJvamVjdCggSVByb2plY3QgcHJvamVjdCApCi0gIHsgICAgCi0gICAgLy8gV2UgbmVlZCB0byByZW1lbWJlciB0aGF0IHRoaXMgcHJvamVjdCBuZWVkcyBoYXZlIHZhbGlkYXRpb24gdHVybmVkIGJhY2sgb24uCi0gICAgcHJvamVjdHMuYWRkKCBwcm9qZWN0ICk7Ci0gICAgCi0gICAgLy9wZ20gajJlZU1hbmFnZXIuc3VzcGVuZEFsbFZhbGlkYXRpb24oIHRydWUgKTsKLSAgfQotCi0gIC8qKgotICAgICogUmVzdG9yZXMgdGhlIHZhbGlkYXRpb24gc3RhdGUgZm9yIGFsbCBuZWVkZWQgcHJvamVjdHMuCi0gICoqLwotICBwdWJsaWMgdm9pZCByZXN0b3JlVmFsaWRhdGlvbkZvclByb2plY3RzKCBib29sZWFuIHJ1blZhbGlkYXRpb24gKQotICB7Ci0gICAgLy9wZ20gajJlZU1hbmFnZXIuc3VzcGVuZEFsbFZhbGlkYXRpb24oIGZhbHNlICk7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9qZWN0cy5pdGVyYXRvcigpOwotCi0gICAgd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApCi0gICAgewotICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkoaXRlcmF0b3IubmV4dCgpKTsKLQotICAgICAgLy8gTm93IGtpY2sgb2ZmIHZhbGlkYXRpb24gZm9yIHRoaXMgcHJvamVjdCBpZiB0aGlzIHdhcyByZXF1ZXN0ZWQuCi0gICAgICBpZiggcnVuVmFsaWRhdGlvbiApCi0gICAgICB7Ci0JICAgIC8vcGdtIEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIHZhbGlkT3AgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oIHByb2plY3QsIG51bGwgKTsKLQkgICAgLy9wZ20gdmFsaWRPcC5ydW4oIG1vbml0b3IgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlBdXRvQnVpbGQoYm9vbGVhbiBpc0F1dG9CdWlsZCkgewotICAgIHRyeSB7Ci0gICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgIElXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3b3Jrc3BhY2VEZXNjID0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICB3b3Jrc3BhY2VEZXNjLnNldEF1dG9CdWlsZGluZyhpc0F1dG9CdWlsZCk7Ci0gICAgICB3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24od29ya3NwYWNlRGVzYyk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc2FibGVBdXRvQnVpbGQoKSB7Ci0gICAgaWYgKCFhdXRvQnVpbGREaXNhYmxlZF8pIHsKLSAgICAgIHNldEF1dG9CdWlsZFByZWZlcmVuY2UoKTsKLSAgICAgIG1vZGlmeUF1dG9CdWlsZChmYWxzZSk7Ci0gICAgICBhdXRvQnVpbGREaXNhYmxlZF8gPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc3RvcmVBdXRvQnVpbGQoKSB7Ci0gICAgaWYgKGF1dG9CdWlsZERpc2FibGVkXykgewotICAgICAgbW9kaWZ5QXV0b0J1aWxkKGdldEF1dG9CdWlsZFByZWZlcmVuY2UoKSk7Ci0gICAgICBhdXRvQnVpbGREaXNhYmxlZF8gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRBdXRvQnVpbGRQcmVmZXJlbmNlKCkgewotICAgIGlzQXV0b0J1aWxkXyA9IGdldFdvcmtzcGFjZUF1dG9CdWlsZFByZWZlcmVuY2UoKTsKLSAgICByZXR1cm4gaXNBdXRvQnVpbGRfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0QXV0b0J1aWxkUHJlZmVyZW5jZSgpIHsKLSAgICByZXR1cm4gaXNBdXRvQnVpbGRfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0V29ya3NwYWNlQXV0b0J1aWxkUHJlZmVyZW5jZSgpIHsKLSAgICBJV29ya3NwYWNlRGVzY3JpcHRpb24gd29ya3NwYWNlRGVzYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotICAgIHJldHVybiB3b3Jrc3BhY2VEZXNjLmlzQXV0b0J1aWxkaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL0JpbmRpbmdFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvQmluZGluZ0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg0ZmI2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvQmluZGluZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX1BPUlQgPSAicG9ydCI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9PUEVSQVRJT05TID0gIm9wZXJhdGlvbnMiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfUE9SVF9UWVBFID0gInBvcnR0eXBlIjsKLSAgCi0gIHB1YmxpYyBCaW5kaW5nRWxlbWVudCAoUG9ydEVsZW1lbnQgcG9ydEVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLHBvcnRFbGVtZW50LFJFTF9QT1JULFBvcnRFbGVtZW50LlJFTF9CSU5ESU5HKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQb3J0KCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfUE9SVCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UG9ydFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9QT1JUX1RZUEUpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldE9wZXJhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9PUEVSQVRJT05TKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZPcGVyYXRpb25zKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9PUEVSQVRJT05TKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvRGVmaW5pdGlvbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9EZWZpbml0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTgxNTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9EZWZpbml0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIERlZmluaXRpb25FbGVtZW50IGV4dGVuZHMgQmFzaWNFbGVtZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfU0VSVklDRVMgPSAic2VydmljZXMiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfV1NETCA9ICJ3c2RsIjsKLSAgCi0gIHB1YmxpYyBEZWZpbml0aW9uRWxlbWVudCAoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLHdzZGxFbGVtZW50LFJFTF9XU0RMLFdTRExFbGVtZW50LlJFTF9ERUZJTklUSU9OUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0V1NETCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1dTREwpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfU0VSVklDRVMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9TRVJWSUNFUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL01lc3NhZ2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvTWVzc2FnZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2YmIxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvTWVzc2FnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX09QRVJBVElPTiA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfUEFSVFMgPSAicGFydHMiOwotICAKLSAgcHVibGljIE1lc3NhZ2VFbGVtZW50IChPcGVyYXRpb25FbGVtZW50IG9wZXJhdGlvbkVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLG9wZXJhdGlvbkVsZW1lbnQsUkVMX09QRVJBVElPTixPcGVyYXRpb25FbGVtZW50LlJFTF9NRVNTQUdFUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0T3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfT1BFUkFUSU9OKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQYXJ0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1BBUlRTKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQYXJ0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfUEFSVFMpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9PcGVyYXRpb25FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvT3BlcmF0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBhZjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9PcGVyYXRpb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0JJTkRJTkcgPSAiYmluZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9NRVNTQUdFUyA9ICJtZXNzYWdlcyI7Ci0KLSAgcHVibGljIE9wZXJhdGlvbkVsZW1lbnQgKEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxiaW5kaW5nRWxlbWVudCxSRUxfQklORElORyxCaW5kaW5nRWxlbWVudC5SRUxfT1BFUkFUSU9OUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX0JJTkRJTkcpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfTUVTU0FHRVMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZk1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9NRVNTQUdFUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BhcnRFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUGFydEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkZjY3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUGFydEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBQYXJ0RWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX01FU1NBR0UgPSAibWVzc2FnZSI7Ci0gICAgCi0gIHB1YmxpYyBQYXJ0RWxlbWVudCAoTWVzc2FnZUVsZW1lbnQgbWVzc2FnZUVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1lc3NhZ2VFbGVtZW50LFJFTF9NRVNTQUdFLE1lc3NhZ2VFbGVtZW50LlJFTF9QQVJUUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX01FU1NBR0UpOwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9Qb3J0RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYTgwZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgUG9ydEVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9CSU5ESU5HID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRUxfU0VSVklDRSA9ICJzZXJ2aWNlIjsKLSAgCi0gIHB1YmxpYyBQb3J0RWxlbWVudCAoU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lLHNlcnZpY2VFbGVtZW50LFJFTF9TRVJWSUNFLFNlcnZpY2VFbGVtZW50LlJFTF9QT1JUUyk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1NFUlZJQ0UpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEJpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9CSU5ESU5HKTsKLSAgfQotIAotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUG9ydFR5cGVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvUG9ydFR5cGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWNjZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1BvcnRUeXBlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwud3NkbG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFBvcnRUeXBlRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0JJTkRJTkcgPSAiYmluZGluZyI7Ci0gIAotICBwdWJsaWMgUG9ydFR5cGVFbGVtZW50IChCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCxTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUsYmluZGluZ0VsZW1lbnQsUkVMX0JJTkRJTkcsQmluZGluZ0VsZW1lbnQuUkVMX1BPUlRfVFlQRSk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX0JJTkRJTkcpOwotICB9Ci0KLSAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1NlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU2VydmljZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlODYzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU2VydmljZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLndzZGxtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX1BPUlRTID0gInBvcnRzIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVMX0RFRklOSVRJT04gPSAiZGVmaW5pdGlvbiI7Ci0gIAotICBwdWJsaWMgU2VydmljZUVsZW1lbnQgKERlZmluaXRpb25FbGVtZW50IGRlZmluaXRpb25FbGVtZW50LFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSxkZWZpbml0aW9uRWxlbWVudCxSRUxfREVGSU5JVElPTixEZWZpbml0aW9uRWxlbWVudC5SRUxfU0VSVklDRVMpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldERlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFJFTF9ERUZJTklUSU9OKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQb3J0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoUkVMX1BPUlRTKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZQb3J0cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0TnVtYmVyT2ZFbGVtZW50cyhSRUxfUE9SVFMpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TdHViYmVkV1NETE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2RhdGFtb2RlbC93c2RsbW9kZWwvU3R1YmJlZFdTRExNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTVlMjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9TdHViYmVkV1NETE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi1wdWJsaWMgY2xhc3MgU3R1YmJlZFdTRExNb2RlbAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJvdGVjdGVkIE1vZGVsIGZNb2RlbDsKLSAgcHVibGljIFN0dWJiZWRXU0RMTW9kZWwoKQotICB7Ci0gICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSBuZXcgV1NETEVsZW1lbnQoIldTRExGaWxlcyIpOwotICAgIGZNb2RlbCA9IHdzZGxFbGVtZW50LmdldE1vZGVsKCk7ICAgCi0gIH0KLQotICBwdWJsaWMgTW9kZWwgZ2V0V1NETE1vZGVsKCkKLSAgewotICAgIHJldHVybiBmTW9kZWw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBidWlsZE1vZGVsKCkKLSAgewotICAgIERlZmluaXRpb25FbGVtZW50IGRlZjEgPSBuZXcgRGVmaW5pdGlvbkVsZW1lbnQoKFdTRExFbGVtZW50KWZNb2RlbC5nZXRSb290RWxlbWVudCgpLCJTdG9ja1F1b3RlIik7IAotICAgIFNlcnZpY2VFbGVtZW50IHNlcjEgPSBuZXcgU2VydmljZUVsZW1lbnQoZGVmMSwiZ2V0UXVvdGUiKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBzZXIyID0gbmV3IFNlcnZpY2VFbGVtZW50KGRlZjEsInNldFF1b3RlIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDEgPSBuZXcgUG9ydEVsZW1lbnQoc2VyMSwicG9ydDEiKTsKLSAgICBQb3J0RWxlbWVudCBwb3J0MiA9IG5ldyBQb3J0RWxlbWVudChzZXIxLCJwb3J0MiIpOwotICAgIFBvcnRFbGVtZW50IHBvcnQzID0gbmV3IFBvcnRFbGVtZW50KHNlcjIsInBvcnQxIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDQgPSBuZXcgUG9ydEVsZW1lbnQoc2VyMiwicG9ydDIiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMSA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MSwiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMiA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MiwiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kMyA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0MywiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kNCA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0NCwiYmluZDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wMSA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQxLCJvcDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wMiA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQyLCJvcDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wMyA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQzLCJvcDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wNCA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQ0LCJvcDEiKTsKLSAgICBNZXNzYWdlRWxlbWVudCBtZTEgPSBuZXcgTWVzc2FnZUVsZW1lbnQob3AxLCJtZTEiKTsKLSAgICBNZXNzYWdlRWxlbWVudCBtZTIgPSBuZXcgTWVzc2FnZUVsZW1lbnQob3AxLCJtZTIiKTsKLSAgICBQYXJ0RWxlbWVudCBwZTEgID0gbmV3IFBhcnRFbGVtZW50KG1lMSwicGUxIik7Ci0gICAgUGFydEVsZW1lbnQgcGUyICA9IG5ldyBQYXJ0RWxlbWVudChtZTIsInBlMiIpOwotCi0gICAgRGVmaW5pdGlvbkVsZW1lbnQgZGVmMiA9IG5ldyBEZWZpbml0aW9uRWxlbWVudCgoV1NETEVsZW1lbnQpZk1vZGVsLmdldFJvb3RFbGVtZW50KCksIlRlbXBDb252ZXJzaW9uIik7IAotICAgIFNlcnZpY2VFbGVtZW50IHNlcjMgPSBuZXcgU2VydmljZUVsZW1lbnQoZGVmMiwiZ2V0VGVtcCIpOwotICAgIFNlcnZpY2VFbGVtZW50IHNlcjQgPSBuZXcgU2VydmljZUVsZW1lbnQoZGVmMiwic2V0VGVtcCIpOwotICAgIFBvcnRFbGVtZW50IHBvcnQ1ID0gbmV3IFBvcnRFbGVtZW50KHNlcjMsInBvcnQxIik7Ci0gICAgUG9ydEVsZW1lbnQgcG9ydDYgPSBuZXcgUG9ydEVsZW1lbnQoc2VyNCwicG9ydDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kNSA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0NSwiYmluZDEiKTsKLSAgICBCaW5kaW5nRWxlbWVudCBiaW5kNiA9IG5ldyBCaW5kaW5nRWxlbWVudChwb3J0NiwiYmluZDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wNSA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQ1LCJvcDEiKTsKLSAgICBPcGVyYXRpb25FbGVtZW50IG9wNiA9IG5ldyBPcGVyYXRpb25FbGVtZW50KGJpbmQ2LCJvcDEiKTsKLQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZGF0YW1vZGVsL3dzZGxtb2RlbC9XU0RMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1dTRExFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWE3OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9kYXRhbW9kZWwvd3NkbG1vZGVsL1dTRExFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC53c2RsbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETEVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTF9ERUZJTklUSU9OUyA9ICJkZWZpbml0aW9ucyI7Ci0gIAotICAvKgotICAqCi0gICoqLwotICBwdWJsaWMgV1NETEVsZW1lbnQgKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcyhuYW1lLG5ldyBCYXNpY01vZGVsKCJXU0RMTW9kZWwiKSk7Ci0gIH0KLQotICBwdWJsaWMgV1NETEVsZW1lbnQgKFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIG1vZGVsLnNldFJvb3RFbGVtZW50KHRoaXMpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldERlZmluaXRpb25zKCkKLSAgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhSRUxfREVGSU5JVElPTlMpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkRlZmluaXRpb25zKCkKLSAgewotICAgIHJldHVybiBnZXROdW1iZXJPZkVsZW1lbnRzKFJFTF9ERUZJTklUSU9OUyk7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNhYjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZUFzc2VtYmx5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcmVBc3NlbWJseUZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGVwbG95RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZURlcGxveUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMDljZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGVwbG95RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcmVEZXBsb3lGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQKLXsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vZnJhZ21lbnRzL0NsaWVudFByZURldmVsb3BGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2Y1Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5mcmFnbWVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50UHJlRGV2ZWxvcEZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvQ2xpZW50UHJlSW5zdGFsbEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkYTNkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9DbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRQcmVJbnN0YWxsRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZUFzc2VtYmx5RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkMWI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlQXNzZW1ibHlGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcmVBc3NlbWJseUZyYWdtZW50IGV4dGVuZHMgU2VxdWVuY2VGcmFnbWVudAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZURlcGxveUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxZGI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmZyYWdtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlUHJlRGVwbG95RnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGV2ZWxvcEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlRGV2ZWxvcEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZTljMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZURldmVsb3BGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcmVEZXZlbG9wRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlSW5zdGFsbEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL2ZyYWdtZW50cy9TZXJ2aWNlUHJlSW5zdGFsbEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODI2OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9mcmFnbWVudHMvU2VydmljZVByZUluc3RhbGxGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZnJhZ21lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VQcmVJbnN0YWxsRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3BsdWdpbi9XZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vcGx1Z2luL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTljYTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vcGx1Z2luL1dlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBidWxrIG9mIHRoZSBXZWIgU2VydmljZXMgcnVudGltZS4KLSogT25seSB0aGUgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHBvcnRpb24gb2YgdGhlIHJ1bnRpbWUgaXMKLSogZm91bmQgZWxzZXdoZXJlIC0gaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aSBwbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbiBleHRlbmRzIFBsdWdpbgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbiBpbiBwbHVnaW4ueG1sLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iOwotCi0gIC8qKgotICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIGluc3RhbmNlXzsKLQotICBwcml2YXRlIExvZyBsb2dfOwotIAotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VDb25zdW1wdGlvblBsdWdpbiAoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbnN0YW5jZV8gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgKiAoV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzIik7Ci0gICogQHJldHVybiBUaGUgV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlQ29uc3VtcHRpb25QbHVnaW4gZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAgIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogcGx1Z2luLnByb3BlcnRpZXMuCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24ucGx1Z2luIiwgaW5zdGFuY2VfICk7Ci0gICAgCi0gICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0gICAgewotICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyggMSwga2V5Lmxlbmd0aCgpICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBtc2dVdGlscy5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIHRoZSBKREsncwotICAqIHtAbGluayBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdH0KLSAgKiBjbGFzcyBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHN1YnN0aXR1dGlvbi4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSxhcmdzKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczOWYyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkF0dHJpYnV0ZUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIElucHV0RmlsZVR5cGVHZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIGV4dGVuZHMgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHByaXZhdGUgYm9vbGVhbiBmU3RhdGVMZXNzOwotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgY3VycmVudExldmVsLCBpbnQgbGV2ZWxzRGVlcCkKLSAgewotICAgICBzdXBlcihidWZmZXIsY3VycmVudExldmVsLGxldmVsc0RlZXApOwotICB9Ci0KLSAKLSAgLyoKLSAgKiBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbiBieSB0aGlzIHZpc2l0b3IgYWN0aW9uCi0gICogQHBhcmFtIE9iamVjdCBUaGUgb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24KLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICAKLSAgICAgQXR0cmlidXRlRWxlbWVudFR5cGUgYXR0cmlidXRlRWxlbWVudFR5cGUgPSAoQXR0cmlidXRlRWxlbWVudFR5cGUpb2JqZWN0OwotICAgICAvL2lmIGl0IGlzIGEgYmVhbiBpcyBpdCBzdGF0ZWxlc3MKLSAgICAgYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKTsgCi0gICAgICAgIAotICAgICBpZihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmlzQmVhbigpKXsKLSAgICAgICBCZWFuRWxlbWVudCBiZWFuID0gKEJlYW5FbGVtZW50KWF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCk7Ci0gICAgICAgZlN0YXRlTGVzcyA9IGJlYW4uaXNTdGF0ZUxlc3MoKTsKLSAgICAgfQkgCi0KLSAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZVR5cGVHZW5lcmF0b3IoZmJ1ZmZlcixmQ3VycmVudExldmVsLGZMZXZlbHNEZWVwKTsKLSAgICAgaWYoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5pc0JlYW4oKSAmJiAhVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCkpIAotICAgICAJJiYgIShnZXRSZXR1cm5QYXJhbSgpICYmIChUeXBlRmFjdG9yeS5pc1JlY29nbml6ZWRSZXR1cm5UeXBlKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLmdldFR5cGVFbGVtZW50KCkuZ2V0VHlwZU5hbWUoKSkgfHwgZlN0YXRlTGVzcykpKQotICAgICAgICAgICAgICAgIAotICAgICBhZGRQYXJlbnRHZXR0ZXIoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0R2V0dGVyTWV0aG9kKCksYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLmFkZFBhcmVudEdldHRlcihyZXR1cm5QYXJlbnRHZXR0ZXIoKSxyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkpOwotICAgICBpbnB1dEZpbGVUeXBlR2VuZXJhdG9yLnNldEluc3RhbmNlTmFtZShmSW5zdGFuY2VOYW1lKTsKLSAgICAgaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgdHlwZVZpc2l0b3IucnVuKGF0dHJpYnV0ZUVsZW1lbnRUeXBlLGlucHV0RmlsZVR5cGVHZW5lcmF0b3IpOyAgIAotICAgICBmYnVmZmVyID0gaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgCi0gICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2U0M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLk1ldGhvZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIE1ldGhvZEZpbGVnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHVibGljIFN0cmluZyBmUmVzdWx0TmFtZTsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiB1c2VkIGRpcmVjdGx5IAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlR2VuZXJhdG9yIChTdHJpbmcgcmVzdWx0KQotICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgZlJlc3VsdE5hbWUgPSByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyByZXN1bHQpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgICBmUmVzdWx0TmFtZSA9IHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIGNhbGxlZCBmcm9tIHN1YmNsYXNzZXMKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWVzKFN0cmluZyByZXN1bHRzKQotICB7Ci0gICAgZlJlc3VsdE5hbWUgPSByZXN1bHRzOwotICB9Ci0KLSAgLy90YWtlcyBpbiBhIGJlYW4gbm9kZQotICAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgIHsKLSAgICAgIEVsZW1lbnQgYmVhbkVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCVAcGFnZSBjb250ZW50VHlwZT1cInRleHQvaHRtbDtjaGFyc2V0PVVURi04XCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEhFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUSVRMRT5JbnB1dHM8L1RJVExFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SDE+SW5wdXRzPC9IMT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICIiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSArICJTdHJpbmcgbWV0aG9kID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJtZXRob2RcIik7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImludCBtZXRob2RJRCA9IDA7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmIChtZXRob2QgPT0gbnVsbCkgbWV0aG9kSUQgPSAtMTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSArICIiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiYm9vbGVhbiB2YWxpZCA9IHRydWU7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmKG1ldGhvZElEICE9IC0xKSBtZXRob2RJRCA9IEludGVnZXIucGFyc2VJbnQobWV0aG9kKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7IAotICAgICAgZmJ1ZmZlci5hcHBlbmQoInN3aXRjaCAobWV0aG9kSUQpeyAiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAJCi0gICAgICAvLyBnbyB0byB0aGUgbmV4dCBnZW5lcmF0b3IKLSAgICAgIE1ldGhvZFZpc2l0b3IgbWV0aG9kVmlzaXRvciA9IG5ldyBNZXRob2RWaXNpdG9yKCk7Ci0gICAgICBJbnB1dEZpbGVIZWxwMUdlbmVyYXRvciBpbnB1dEZpbGVIZWxwMUdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVIZWxwMUdlbmVyYXRvcihmYnVmZmVyLGZSZXN1bHROYW1lKTsgCi0gICAgICBtZXRob2RWaXNpdG9yLnJ1bihiZWFuRWxlbWVudCxpbnB1dEZpbGVIZWxwMUdlbmVyYXRvcik7Ci0gICAgICBmYnVmZmVyID0gaW5wdXRGaWxlSGVscDFHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCJjYXNlIDExMTExMTExMTE6IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInZhbGlkID0gZmFsc2U7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGT1JNIE1FVEhPRD1cIlBPU1RcIiBBQ1RJT049XCIiICsgZlJlc3VsdE5hbWUgKyAiXCIgVEFSR0VUPVwicmVzdWx0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiSElEREVOXCIgTkFNRT1cIm1ldGhvZFwiIFZBTFVFPVwiPCU9bWV0aG9kJT5cIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPFRBQkxFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8VFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxURCBDT0xTUEFOPVwiMVwiIEFMSUdOPVwiTEVGVFwiPlVSTFN0cmluZzo8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQgQUxJR049XCJsZWZ0XCI+PElOUFVUIFRZUEU9XCJURVhUXCIgTkFNRT1cInVybDExMTExMTExMTFcIiBTSVpFPTIwPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVFI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVEFCTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCUj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJTVUJNSVRcIiBWQUxVRT1cIkludm9rZVwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIlJFU0VUXCIgVkFMVUU9XCJDbGVhclwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0ZPUk0+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoImJyZWFrOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJjYXNlIDExMTExMTExMTI6IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInZhbGlkID0gZmFsc2U7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGT1JNIE1FVEhPRD1cIlBPU1RcIiBBQ1RJT049XCIiICsgZlJlc3VsdE5hbWUgKyAiXCIgVEFSR0VUPVwicmVzdWx0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiSElEREVOXCIgTkFNRT1cIm1ldGhvZFwiIFZBTFVFPVwiPCU9bWV0aG9kJT5cIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEJSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SU5QVVQgVFlQRT1cIlNVQk1JVFwiIFZBTFVFPVwiSW52b2tlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiUkVTRVRcIiBWQUxVRT1cIkNsZWFyXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvRk9STT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiYnJlYWs7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgCi0gICAgICAKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7ICAgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmICh2YWxpZCkgeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIlNlbGVjdCBhIG1ldGhvZCB0byB0ZXN0LiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLlRBQiArICJyZXR1cm47IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvQk9EWT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9IVE1MPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIAotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWM1NWZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlSGVscDFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5QYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIGV4dGVuZHMgSW5wdXRGaWxlR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9TVEFURSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTkFMX1NUQVRFID0gMjsKLQotICBwdWJsaWMgaW50IGZzdGF0ZTsKLSAgIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUhlbHAxR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgZnN0YXRlID0gSU5JVElBTF9TVEFURTsKLSAgfQotICAKLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogCi0gICovCi0gIHB1YmxpYyBJbnB1dEZpbGVIZWxwMUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcixTdHJpbmcgcmVzdWx0TmFtZSkKLSAgewotICAgICAgc3VwZXIoYnVmZmVyLHJlc3VsdE5hbWUpOwotICAgICAgZnN0YXRlID0gSU5JVElBTF9TVEFURTsKLSAgfQotICAKLSAgLyoKLSAgKiBUYWtlcyBpbiBhbiBlbGVtZW50Ci0gICogQHBhcmFtIE9iamVjdCBUYWtlcyBpbiBhbiBvYmplY3QgdG8gYmUgYWN0ZWQgdXBvbgotICAqLwotICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgTWV0aG9kRWxlbWVudCBtZXRob2QgPSAoTWV0aG9kRWxlbWVudCltZXRob2RFbGVtZW50OwotICAgICBpZiAobWV0aG9kLmdldE1ldGhvZE9tbWlzc2lvbigpKSByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgIAotICAgICBQYXJhbWV0ZXJWaXNpdG9yIHBhcmFtZXRlclZpc2l0b3IgPSBuZXcgUGFyYW1ldGVyVmlzaXRvcigpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiY2FzZSAiICsgbWV0aG9kLmdldE51bWJlcklEKCkrICI6IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgidmFsaWQgPSBmYWxzZTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGT1JNIE1FVEhPRD1cIlBPU1RcIiBBQ1RJT049XCIiICsgZlJlc3VsdE5hbWUgKyAiXCIgVEFSR0VUPVwicmVzdWx0XCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJISURERU5cIiBOQU1FPVwibWV0aG9kXCIgVkFMVUU9XCI8JT1tZXRob2QlPlwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAKLSAgICAgLy8gZ28gdG8gdGhlIG5leHQgZ2VuZXJhdG9yCi0gICAgIElucHV0RmlsZUhlbHAyR2VuZXJhdG9yIGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUhlbHAyR2VuZXJhdG9yKGZidWZmZXIpOyAKLSAgICAgcGFyYW1ldGVyVmlzaXRvci5ydW4obWV0aG9kRWxlbWVudCxpbnB1dEZpbGVIZWxwMkdlbmVyYXRvcik7Ci0gICAgIGZidWZmZXIgPSBpbnB1dEZpbGVIZWxwMkdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgCi0gICAgIGZidWZmZXIuYXBwZW5kKCI8QlI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPElOUFVUIFRZUEU9XCJTVUJNSVRcIiBWQUxVRT1cIkludm9rZVwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjxJTlBVVCBUWVBFPVwiUkVTRVRcIiBWQUxVRT1cIkNsZWFyXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiPC9GT1JNPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICBmYnVmZmVyLmFwcGVuZCgiYnJlYWs7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgCi0KLSAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICAgICAKLSAgCi0gIH0gICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzUwNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9JbnB1dEZpbGVIZWxwMkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5SZWxWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuUGFyYW1ldGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgZXh0ZW5kcyBJbnB1dEZpbGVIZWxwMUdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIC8qCi0gICogVGhpcyBpcyBhY3R1YWxseSB1c2VkIGJ5IHRoZSByZXN1bHQgZ2VuZXJhdG9yIHRvIHNob3cgdGhlIAotICAqIHJlc3VsdGFudCBCZWFuCi0gICogVGhlIG5hbWUgaXMgdGhlIG5hbWUgdGhlIHJlc3VsdGFudCBiZWFuIGlzIHVzaW5nIGFzIGl0cyBpbnN0YW5jZSBuYW1lCi0gICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZkluc3RhbmNlTmFtZTsKLSAgcHJpdmF0ZSBib29sZWFuIGZSZXR1cm5QYXJhbT1mYWxzZTsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZUhlbHAyR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgZkluc3RhbmNlTmFtZT0iIjsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgc3RhdGUgZGF0YSB0byBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0b3JzCi0gICogQHBhcmFtIFN0cmluZyBuYW1lIFRoZSBpbnN0YW5jZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXJzIHR5cGUgYmVhbgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnN0YW5jZU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmSW5zdGFuY2VOYW1lID0gbmFtZTsKLSAgfQotCi0gIC8qKgotICAqIFRoaXMgaXMgc3RhdGUgZGF0YSB0byBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0b3JzCi0gICogQHJldHVybiBTdHJpbmcgbmFtZSBUaGUgaW5zdGFuY2UgbmFtZSBvZiB0aGUgcGFyYW1ldGVycyB0eXBlIGJlYW4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZJbnN0YW5jZU5hbWU7Ci0gIH0KLQotCi0gIC8qCi0gICogVGFrZXMgaW4gYW4gb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24gYnkgdGhpcyB2aXNpdG9yIGFjdGlvbgotICAqIEBwYXJhbSBPYmplY3QgVGhlIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIFJlbFZpc2l0b3IgdmlzaXRvciA9IChSZWxWaXNpdG9yKWdldFZpc2l0b3IoKTsKLSAgICAgIFBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyID0gKFBhcmFtZXRlckVsZW1lbnQpcGFyYW1ldGVyRWxlbWVudDsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUQUJMRT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0KLSAgICAgIFR5cGVWaXNpdG9yIHR5cGVWaXNpdG9yID0gbmV3IFR5cGVWaXNpdG9yKCk7Ci0gICAgICBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yIGlucHV0RmlsZVR5cGVHZW5lcmF0b3IgPSBuZXcgSW5wdXRGaWxlVHlwZUdlbmVyYXRvcihmYnVmZmVyLDApOwotICAgICAgaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgIGlucHV0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0SW5zdGFuY2VOYW1lKGZJbnN0YW5jZU5hbWUpOwotICAgICAgdHlwZVZpc2l0b3IucnVuKHBhcmFtZXRlckVsZW1lbnQsaW5wdXRGaWxlVHlwZUdlbmVyYXRvcik7Ci0gICAgICBmYnVmZmVyID0gaW5wdXRGaWxlVHlwZUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVEFCTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0UmV0dXJuUGFyYW0oKQotICB7Ci0gICAgcmV0dXJuIGZSZXR1cm5QYXJhbTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJldHVyblBhcmFtKGJvb2xlYW4gcmV0dXJuUGFyYW0pCi0gIHsKLSAgICBmUmV0dXJuUGFyYW0gPSByZXR1cm5QYXJhbTsKLSAgfSAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0lucHV0RmlsZVR5cGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlVHlwZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vSW5wdXRGaWxlVHlwZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5BdHRyaWJ1dGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uRmllbGRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkF0dHJpYnV0ZUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlNpbXBsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgSW5wdXRGaWxlVHlwZUdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBJbnB1dEZpbGVUeXBlR2VuZXJhdG9yIGV4dGVuZHMgSW5wdXRGaWxlSGVscDJHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGZQYXJlbnRHZXR0ZXJzOwotICBwcm90ZWN0ZWQgaW50IGZMZXZlbHNEZWVwOwotICBwcm90ZWN0ZWQgaW50IGZDb2xzcGFuOwotICBwcm90ZWN0ZWQgaW50IGZDdXJyZW50TGV2ZWw7Ci0gIHByaXZhdGUgYm9vbGVhbiBmSXNTaW1wbGU7Ci0gIHByaXZhdGUgYm9vbGVhbiBmU3RhdGVMZXNzQmVhbjsKLSAgcHJpdmF0ZSBWZWN0b3IgZkdldHRlcnM7Ci0gIHByaXZhdGUgVmVjdG9yIGZUeXBlczsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIElucHV0RmlsZVR5cGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBjdXJyZW50TGV2ZWwpCi0gIHsKLSAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgZkN1cnJlbnRMZXZlbCA9IGN1cnJlbnRMZXZlbDsKLSAgICAgZkxldmVsc0RlZXAgPSAtMTsKLSAgICAgZlBhcmVudEdldHRlcnMgPSAiIjsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgSW5wdXRGaWxlVHlwZUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IGN1cnJlbnRMZXZlbCxpbnQgbGV2ZWxzRGVlcCkKLSAgewotICAgICBzdXBlcihidWZmZXIpOwotICAgICBmQ3VycmVudExldmVsID0gY3VycmVudExldmVsOwotICAgICBmTGV2ZWxzRGVlcCA9IGxldmVsc0RlZXA7Ci0gICAgIGZQYXJlbnRHZXR0ZXJzID0gIiI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRHZXR0ZXJzKFZlY3RvciBnZXR0ZXIsVmVjdG9yIHR5cGUpCi0gIHsKLSAgICAgaWYoZkdldHRlcnMgIT0gbnVsbCl7Ci0gICAgICAgZkdldHRlcnMuY2xlYXIoKTsKLSAgICAgICBmVHlwZXMuY2xlYXIoKTsKLSAgICAgfQotICAgICBhZGRQYXJlbnRHZXR0ZXIoZ2V0dGVyLHR5cGUpOwotICB9Ci0KLQotICAvKioKLSAgKiBUaGlzIGZ1bmN0aW9uIGhvbGRzIHNvbWUgc3RhdGUgZGF0YSB0aGF0IGlzIGltcG9ydGFudCBpbiBnZXR0aW5nIHRoZSAKLSAgKiBTdHJpbmdzIGZvciBkaXNwbGF5IG9mIHJlc3VsdGFudCBiZWFucwotICAqIEBwYXJhbSBTdHJpbmcgZ2V0dGVyIHRoaXMgaXMgdGhlIGdldHRlciBvZiBhbiBhdHRyaWJ1dGUKLSAgKiBUaGUgaWRlYSBpcyB0aGF0IGJ5IHRoZSB0aW1lIHdlIGdldCB0byB0aGUgc2ltcGxlIHR5cGUKLSAgKiB3ZSBoYXZlIGdldEFkZHJlc3MoKS5nZXRTdHJlZXQoKS4uLi4KLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFyZW50R2V0dGVyKFN0cmluZyBnZXR0ZXIsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgaWYoZkdldHRlcnMgPT0gbnVsbCkgZkdldHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYoZlR5cGVzID09IG51bGwpIGZUeXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmR2V0dGVycy5hZGRFbGVtZW50KGdldHRlcik7Ci0gICAgZlR5cGVzLmFkZEVsZW1lbnQodHlwZSk7Ci0gIH0KLQotICAvKgotICAqIHRoaXMgd2lsbCBiZSB1c2VkIHdoZW4gcGFzc2luZyBiZXR3ZWVuIHR3byB2aXNpdG9ycwotICAqCi0gICovCi0gIHB1YmxpYyB2b2lkIGFkZFBhcmVudEdldHRlcihWZWN0b3IgZ2V0dGVycywgVmVjdG9yIHR5cGVzKQotICB7Ci0gICAgaWYoZkdldHRlcnMgPT0gbnVsbCkgZkdldHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYoZlR5cGVzID09IG51bGwpIGZUeXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpbnQgc2l6ZSA9IGdldHRlcnMuc2l6ZSgpOyAgICAKLSAgICBmb3IoaW50IGkgPSAwOyBpPHNpemU7IGkrKyl7Ci0gICAgICBmR2V0dGVycy5hZGRFbGVtZW50KGdldHRlcnMuZ2V0KGkpKTsKLSAgICAgIGZUeXBlcy5hZGRFbGVtZW50KHR5cGVzLmdldChpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyByZXR1cm5QYXJlbnRHZXR0ZXIoaW50IGNvdW50KQotICB7Ci0gICAgaWYgKGZHZXR0ZXJzID09IG51bGwgfHwgY291bnQgPiBmR2V0dGVycy5zaXplKCkpIHJldHVybiBudWxsOwotICAgIHJldHVybiAoU3RyaW5nKWZHZXR0ZXJzLmdldChjb3VudCk7ICAKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgcmV0dXJuUGFyZW50R2V0dGVyVHlwZShpbnQgY291bnQpCi0gIHsKLSAgICBpZiAoZlR5cGVzID09IG51bGwgfHwgY291bnQgPiBmVHlwZXMuc2l6ZSgpKSByZXR1cm4gbnVsbDsKLSAgICByZXR1cm4gKFN0cmluZylmVHlwZXMuZ2V0KGNvdW50KTsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIFZlY3RvciByZXR1cm5QYXJlbnRHZXR0ZXIoKQotICB7Ci0gICAgaWYgKGZHZXR0ZXJzID09IG51bGwgKSByZXR1cm4gbmV3IFZlY3RvcigpOwotICAgIHJldHVybiBmR2V0dGVyczsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIFZlY3RvciByZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkKLSAgewotICAgIGlmIChmVHlwZXMgPT0gbnVsbCApIHJldHVybiBuZXcgVmVjdG9yKCk7Ci0gICAgcmV0dXJuIGZUeXBlczsgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXR0ZXJDb3VudCgpCi0gIHsKLSAgICBpZihmR2V0dGVycyA9PSBudWxsKSByZXR1cm4gMDsKLSAgICByZXR1cm4gZkdldHRlcnMuc2l6ZSgpOyAKLSAgfQotCi0KLSAgLyoqCi0gICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHNvbWUgc3RhdGUgZGF0YSB0aGF0IGlzIGltcG9ydGFudCBpbiBnZXR0aW5nIHRoZSAKLSAgKiBTdHJpbmdzIGZvciBkaXNwbGF5IG9mIHJlc3VsdGFudCBiZWFucwotICAqIEByZXR1cm4gU3RyaW5nIHRoZSBzdHJpbmcgb2YgZ2V0dGVycyB0byB0aGlzIHBvaW50Ci0gICogVGhlIGlkZWEgaXMgdGhhdCBieSB0aGUgdGltZSB3ZSBnZXQgdG8gdGhlIHNpbXBsZSB0eXBlCi0gICogd2UgaGF2ZSBnZXRBZGRyZXNzKCkuZ2V0U3RyZWV0KCkuLi4uCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50R2V0dGVycygpCi0gIHsKLSAgICByZXR1cm4gZlBhcmVudEdldHRlcnM7Ci0gIH0KLSAgCi0gIC8qCi0gICogVGFrZXMgaW4gYW4gb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24gYnkgdGhpcyB2aXNpdG9yIGFjdGlvbgotICAqIEBwYXJhbSBPYmplY3QgVGhlIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgVHlwZUVsZW1lbnQgZWxlbWVudCA9IChUeXBlRWxlbWVudClvYmplY3Q7Ci0gICAgICAgICAgCi0gICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2ltcGxlRWxlbWVudCkgZklzU2ltcGxlID0gdHJ1ZTsKLSAgICAgZWxzZSBmSXNTaW1wbGUgPSBmYWxzZTsKLQotICAgICAvL3RoaXMgY291bGQgYmUgYSBzdGF0ZWxlc3NiZWFuIG5lZWQgdG8ga25vdwotICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5FbGVtZW50ICl7Ci0gICAgICAgIEJlYW5FbGVtZW50IGJlYW4gPSAoQmVhbkVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgaWYgKGJlYW4uaXNTdGF0ZUxlc3MoKSkgZlN0YXRlTGVzc0JlYW4gPSB0cnVlOwotICAgICB9Ci0KLQotCi0gICAgIC8vQ29tcGxleCB0eXBlIHN1cHBvcnQKLSAgICAgLy9maXJzdCBJIG5lZWQgdG8gZmluZCBvdXQgaG93IG1hbnkgbGV2ZWxzIGRlZXAKLSAgICAgaWYoZkxldmVsc0RlZXAgPT0gLTEpewotICAgICAgICBBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgQXR0cmlidXRlVmlzaXRvcigpOwotICAgICAgICBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbiBsZHZhID0gbmV3IExldmVsc0RlZXBWaXNpdG9yQWN0aW9uKCk7Ci0gICAgICAgIGF0dHJpYnV0ZVZpc2l0b3IucnVuKGVsZW1lbnQsbGR2YSk7Ci0gICAgICAgIGZMZXZlbHNEZWVwID0gbGR2YS5nZXRMZXZlbHNEZWVwKCk7Ci0gICAgICAgIC8vY2hlY2sgb3V0IHRoZSBmaWVsZHMgCi0gICAgICAgIEZpZWxkVmlzaXRvciBmaWVsZFZpc2l0b3IgPSBuZXcgRmllbGRWaXNpdG9yKCk7Ci0gICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGxkdmEyID0gbmV3IExldmVsc0RlZXBWaXNpdG9yQWN0aW9uKCk7Ci0gICAgICAgIGZpZWxkVmlzaXRvci5ydW4oZWxlbWVudCxsZHZhMik7Ci0KLSAgICAgICAgaWYoZkxldmVsc0RlZXAgPCBsZHZhMi5nZXRMZXZlbHNEZWVwKCkpZkxldmVsc0RlZXAgPSBsZHZhMi5nZXRMZXZlbHNEZWVwKCk7IAotICAgICAgICBmTGV2ZWxzRGVlcCsrOwotICAgICB9IAotICAgICBmQ29sc3BhbiA9IGZMZXZlbHNEZWVwIC0gZkN1cnJlbnRMZXZlbDsKLQotICAgICAvL2lmIHdlIGhhdmUgYSByZXR1cm4gcGFyYW0gd2l0aCBubyBnZXR0ZXIgbWFrZSBzdXJlIHdlIGFyZSBvbiB0aGUgCi0gICAgIC8vYXR0cmlidXRlIGFuZCBub3QgdGhlIHBhcmFtZXRlciB0aGVuIHJldHVybgotICAgICBpZihnZXRSZXR1cm5QYXJhbSgpICYmICBlbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUVsZW1lbnRUeXBlICYmKCgoQXR0cmlidXRlRWxlbWVudFR5cGUpZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkpLmdldEdldHRlck1ldGhvZCgpID09IG51bGwpICkgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0gICAgIC8vQ29kZSBnZW4gZm9yIGFsbCBlbGVtZW50cwotICAgICBmYnVmZmVyLmFwcGVuZCgiPFRSPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmQ3VycmVudExldmVsO2krKyl7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQgV0lEVEg9XCI1JVwiPjwvVEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICB9Ci0gICAgIGZidWZmZXIuYXBwZW5kKCI8VEQgQ09MU1BBTj1cIiIgKyBmQ29sc3BhbiArICJcIiBBTElHTj1cIkxFRlRcIj4iICsgZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TmFtZSgpICsgIjo8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgICAKLSAgICAgaWYoZklzU2ltcGxlIHx8IFR5cGVGYWN0b3J5LnJlY29nbml6ZWRCZWFuKGVsZW1lbnQuZ2V0TmFtZSgpKSAKLSAgICAgICAgICAgICAgICB8fCAoZ2V0UmV0dXJuUGFyYW0oKSAmJiBmU3RhdGVMZXNzQmVhbikgCi0gICAgICAgICAgICAgICAgfHwgKGdldFJldHVyblBhcmFtKCkgJiYgVHlwZUZhY3RvcnkuaXNSZWNvZ25pemVkUmV0dXJuVHlwZShlbGVtZW50LmdldFR5cGVOYW1lKCkpKSl7Ci0gICAgICAgIGlmKGdldEluc3RhbmNlTmFtZSgpLmVxdWFscygiIikpewotICAgICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZVR5cGUoZWxlbWVudC5nZXROYW1lKCksZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TVVJRCgpKTsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoZGF0YVR5cGUuaW5wdXRGb3JtKGVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpLmdldE1VSUQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgIGlmKGdldFJldHVyblBhcmFtKCkgJiYgKFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUoZWxlbWVudC5nZXRUeXBlTmFtZSgpKSB8fCBmU3RhdGVMZXNzQmVhbikpewotICAgICAgICAgICAgIERhdGFUeXBlIGRhdGFUeXBlID0gVHlwZUZhY3RvcnkuY3JlYXRlVHlwZShlbGVtZW50LmdldFR5cGVOYW1lKCksZWxlbWVudC5nZXRPd25pbmdFbGVtZW50KCkuZ2V0TVVJRCgpKTsgIAotICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVOYW1lID0gInR5cGUiICsgZGF0YVR5cGUuZ2V0VW5pcXVlTmFtZSgpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArICBnZXRJbnN0YW5jZU5hbWUoKSArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIFN0cmluZyBhZnRlclN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOyAKLSAgICAgICAgICAgICBTdHJpbmcgdG1wU3RyaW5nID0gInRlYmVjZSI7Ci0gICAgICAgICAgICAgU3RyaW5nIHByZXZTdHJpbmcgPSBnZXRJbnN0YW5jZU5hbWUoKTsKLSAgICAgICAgICAgICBTdHJpbmcgbmV3VG1wU3RyaW5nID0gIiI7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBuZXdUbXBTdHJpbmcgPSB0bXBTdHJpbmcgKyBpOwotICAgICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQocmV0dXJuUGFyZW50R2V0dGVyVHlwZShpKSArICIgIiArIG5ld1RtcFN0cmluZyArICI9IiArIHByZXZTdHJpbmcgKyAiLiIgKyByZXR1cm5QYXJlbnRHZXR0ZXIoaSkgKyAiOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICAgIHByZXZTdHJpbmcgPSBuZXdUbXBTdHJpbmc7IAotICAgICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoImlmKCIgKyBuZXdUbXBTdHJpbmcgKyAiICE9IG51bGwpeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICAgIGFmdGVyU3RyaW5nID0gbmV3VG1wU3RyaW5nOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChlbGVtZW50LmdldE5hbWUoKSArICIgIiArIHVuaXF1ZU5hbWUgKyAiID0gIiArIGFmdGVyU3RyaW5nICsgIi4iICsgKChBdHRyaWJ1dGVFbGVtZW50VHlwZSllbGVtZW50LmdldE93bmluZ0VsZW1lbnQoKSkuZ2V0R2V0dGVyTWV0aG9kKCkrICI7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5UeXBlQ29udmVyc2lvbih1bmlxdWVOYW1lKSk7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIGVsc2V7IAotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8VEQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArICBnZXRJbnN0YW5jZU5hbWUoKSArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIFN0cmluZyBhZnRlclN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOwotICAgICAgICAgICAgIFN0cmluZyB0bXBTdHJpbmcgPSAidGViZWNlIjsKLSAgICAgICAgICAgICBTdHJpbmcgcHJldlN0cmluZyA9IGdldEluc3RhbmNlTmFtZSgpOwotICAgICAgICAgICAgIFN0cmluZyBuZXdUbXBTdHJpbmcgPSAiIjsKLSAgICAgICAgICAgICBmb3IoaW50IGk9MDtpPGdldHRlckNvdW50KCk7aSsrKXsKLSAgICAgICAgICAgICAgIG5ld1RtcFN0cmluZyA9IHRtcFN0cmluZyArIGk7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZChyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKGkpICsgIiAiICsgbmV3VG1wU3RyaW5nICsgIj0iICsgcHJldlN0cmluZyArICIuIiArIHJldHVyblBhcmVudEdldHRlcihpKSArICI7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgICAgcHJldlN0cmluZyA9IG5ld1RtcFN0cmluZzsgCi0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIiArIG5ld1RtcFN0cmluZyArICIgIT0gbnVsbCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgICAgYWZ0ZXJTdHJpbmcgPSBuZXdUbXBTdHJpbmc7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCU9Iik7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoYWZ0ZXJTdHJpbmcgKyAiLiIgKyAoKEF0dHJpYnV0ZUVsZW1lbnRUeXBlKWVsZW1lbnQuZ2V0T3duaW5nRWxlbWVudCgpKS5nZXRHZXR0ZXJNZXRob2QoKSsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+Iik7Ci0gICAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIik7Ci0gICAgICAgICAgICAgZm9yKGludCBpPTA7aTxnZXR0ZXJDb3VudCgpO2krKyl7Ci0gICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSIpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgifSU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8L1REPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgCi0gICAgIH0KLSAgICAgICAgIAotICAgICAgLy9Ob3cgY2Fycnkgb24gZG93biB0aGUgcmVzdCBvZiB0aGUgYmVhbgotICAgICBlbHNlIHsKLSAgICAgICAgQXR0cmlidXRlVmlzaXRvciBhdHRyaWJ1dGVWaXNpdG9yID0gbmV3IEF0dHJpYnV0ZVZpc2l0b3IoKTsKLSAgICAgICAgYXR0cmlidXRlVmlzaXRvci5zZXRSZXNpZGVudFZlY3RvcjEocmV0dXJuUGFyZW50R2V0dGVyKCkpOwotICAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnNldFJlc2lkZW50VmVjdG9yMihyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkpOwotICAgICAgICBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yID0gbmV3IElucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcihmYnVmZmVyLChmQ3VycmVudExldmVsICsgMSksZkxldmVsc0RlZXApOwotICAgICAgICBpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3Iuc2V0UmV0dXJuUGFyYW0oZ2V0UmV0dXJuUGFyYW0oKSk7Ci0gICAgICAgIGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgICAgIGF0dHJpYnV0ZVZpc2l0b3IucnVuKGVsZW1lbnQsaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yKTsKLSAgICAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAKLSAgICAgICAgLy9ub3cgZG8gZmllbGRzIHZlcnkgc2ltaWxhcgotICAgICAgICBGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcigpOwotICAgICAgICBmaWVsZFZpc2l0b3Iuc2V0UmVzaWRlbnRWZWN0b3IxKHJldHVyblBhcmVudEdldHRlcigpKTsKLSAgICAgICAgZmllbGRWaXNpdG9yLnNldFJlc2lkZW50VmVjdG9yMihyZXR1cm5QYXJlbnRHZXR0ZXJUeXBlKCkpOwotICAgICAgICBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMiA9IG5ldyBJbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IoZmJ1ZmZlciwoZkN1cnJlbnRMZXZlbCArIDEpLGZMZXZlbHNEZWVwKTsKLSAgICAgICAgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5zZXRSZXR1cm5QYXJhbShnZXRSZXR1cm5QYXJhbSgpKTsKLSAgICAgICAgaW5wdXRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5zZXRJbnN0YW5jZU5hbWUoZkluc3RhbmNlTmFtZSk7Ci0gICAgICAgIGZpZWxkVmlzaXRvci5ydW4oZWxlbWVudCxpbnB1dEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyKTsKLSAgICAgICAgZmJ1ZmZlciA9IGlucHV0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjIuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgCi0gICAgICAgIAotCi0gICAgIH0KLQotCi0gICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4OGI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL0xldmVsc0RlZXBWaXNpdG9yQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLlZpc2l0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5BdHRyaWJ1dGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uRmllbGRWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmJlYW4uVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuQXR0cmlidXRlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5CZWFuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24uCi0qICovCi1wdWJsaWMgY2xhc3MgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gaW1wbGVtZW50cyBWaXNpdG9yQWN0aW9uIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJpdmF0ZSBWaXNpdG9yIGZWaXNpdG9yOwotICBwcml2YXRlIGludCBmTGV2ZWxzRGVlcDsKLSAgcHJpdmF0ZSBpbnQgZkRlZXBlc3RMZXZlbDsKLSAgCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIFRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvaW50Ci0gICogCi0gICovCi0gIHB1YmxpYyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbiAoKQotICB7Ci0gICAgZkxldmVsc0RlZXAgPSAwOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQKLSAgKiAKLSAgKi8KLSAgcHVibGljIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIChpbnQgY3VycmVudCxib29sZWFuIGluY3JlbWVudCkKLSAgewotICAgIGZMZXZlbHNEZWVwID0gY3VycmVudDsKLSAgICBpZihpbmNyZW1lbnQpIGZMZXZlbHNEZWVwKys7Ci0gICAgZkRlZXBlc3RMZXZlbCA9IGZMZXZlbHNEZWVwOyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTdHJpbmcgcmVzaWRlbnQpCi0gIHsKLSAgICAvL25vdGhpbmcgdG8gYmUgZG9uZSBidXQgbXVzdCBiZSBpbXBsZW1lbnRlZAotICB9Ci0KLQotCi0gIC8qKgotICAqIFRoZSB2aXNpdG9yIHRoYXQgY2FsbGVkIHRoaXMgVmlzaXRvckFjdGlvbgotICAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIHRoYXQgY2FsbGVkIHRoaXMgdmlzaXRvciBhY3Rpb24KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmlzaXRvcihWaXNpdG9yIHZpc2l0b3IpCi0gIHsKLSAgICAgZlZpc2l0b3IgPSB2aXNpdG9yOwotICB9Ci0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsZXZlbCBvZiBuZXN0aW5nIHdpdGhpbiB0aGlzIGJlYW4KLSAgKiBAcmV0dXJuIGludCByZXR1cm5zIHRoZSBpbnQgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG5lc3RzIG9mIHRoaXMgYmVhbgotICAqLwotICBwdWJsaWMgaW50IGdldExldmVsc0RlZXAoKQotICB7Ci0gICAgIHJldHVybiBmRGVlcGVzdExldmVsOwotICB9Ci0gCi0KLSAgLyoqCi0gICogVGFrZXMgaW4gYW4gb2JqZWN0IHRvIGJlIGFjdGVkIHVwb24gYnkgdGhpcyB2aXNpdG9yIGFjdGlvbgotICAqIEBwYXJhbSBPYmplY3QgVGhlIG9iamVjdCB0byBiZSBhY3RlZCB1cG9uCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXR0cmlidXRlRWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgVHlwZUVsZW1lbnQpewotICAgICAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGx2ZGEgPSBuZXcgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24oZkxldmVsc0RlZXAsdHJ1ZSk7Ci0gICAgICAgICB0eXBlVmlzaXRvci5ydW4oZWxlbWVudCxsdmRhKTsKLQotICAgICAgICAgaWYgKGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpOyAKLSAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5FbGVtZW50ICYmICEoVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oZWxlbWVudC5nZXROYW1lKCkpKSl7Ci0gICAgICAgICBBdHRyaWJ1dGVWaXNpdG9yIGF0dHJpYnV0ZVZpc2l0b3IgPSBuZXcgQXR0cmlidXRlVmlzaXRvcigpOwotICAgICAgICAgTGV2ZWxzRGVlcFZpc2l0b3JBY3Rpb24gbHZkYSA9IG5ldyBMZXZlbHNEZWVwVmlzaXRvckFjdGlvbihmTGV2ZWxzRGVlcCxmYWxzZSk7Ci0gICAgICAgICBhdHRyaWJ1dGVWaXNpdG9yLnJ1bihlbGVtZW50LGx2ZGEpOwotICAgICAgICAgaWYgKGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEuZ2V0TGV2ZWxzRGVlcCgpOyAKLSAgIAotICAgICAgICAgRmllbGRWaXNpdG9yIGZpZWxkVmlzaXRvciA9IG5ldyBGaWVsZFZpc2l0b3IoKTsKLSAgICAgICAgIExldmVsc0RlZXBWaXNpdG9yQWN0aW9uIGx2ZGEyID0gbmV3IExldmVsc0RlZXBWaXNpdG9yQWN0aW9uKGZMZXZlbHNEZWVwLGZhbHNlKTsKLSAgICAgICAgIGZpZWxkVmlzaXRvci5ydW4oZWxlbWVudCxsdmRhMik7Ci0gICAgICAgICBpZiAobHZkYTIuZ2V0TGV2ZWxzRGVlcCgpID4gZkRlZXBlc3RMZXZlbCkgZkRlZXBlc3RMZXZlbCA9IGx2ZGEyLmdldExldmVsc0RlZXAoKTsgCi0gICAKLSAgICAgIH0KLSAgICAgICAgIAotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7ICAgCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9NZXRob2RGaWxlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkNjY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5NZXRob2RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBNZXRob2RGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIE1ldGhvZEZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgIAotICBwdWJsaWMgU3RyaW5nIGZJbnB1dE5hbWU7Ci0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIAotICAqLwotICBwdWJsaWMgTWV0aG9kRmlsZUdlbmVyYXRvciAoU3RyaW5nIGlucHV0cykKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgZklucHV0TmFtZSA9IGlucHV0czsKLSAgfQotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gU3RyaW5nQnVmZmVyIGJ1ZmZlciB0byBhcHBlbmQgY29kZWdlbiAKLSAgKi8KLSAgcHVibGljIE1ldGhvZEZpbGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIsU3RyaW5nIGlucHV0cykKLSAgewotICAgIHN1cGVyKGJ1ZmZlcik7Ci0gICAgZklucHV0TmFtZSA9IGlucHV0czsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc2V0RmlsZU5hbWVzKFN0cmluZyBpbnB1dHMpCi0gIHsKLSAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICB9Ci0KLSAgLy9wdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBVE9SID0gIkxvY2F0b3IiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBCRUFOID0gIlByb3h5IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgR0VUID0gImdldCI7Ci0KLSAgCi0gIC8vdGFrZXMgaW4gYSBiZWFuIG5vZGUKLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgIHsKLSAgICAgIEVsZW1lbnQgYmVhbkVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgICBCZWFuRWxlbWVudCBiZWFuID0gKEJlYW5FbGVtZW50KWJlYW5FbGVtZW50OwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlQHBhZ2UgY29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiJT4iKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8SEVBRD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8VElUTEU+TWV0aG9kczwvVElUTEU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPC9IRUFEPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjxIMT5NZXRob2RzPC9IMT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArICI8VUw+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgTWV0aG9kVmlzaXRvciBtZXRob2RWaXNpdG9yID0gbmV3IE1ldGhvZFZpc2l0b3IoKTsKLSAgICAgIE1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yIG1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yID0gbmV3IE1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yKGZidWZmZXIsZklucHV0TmFtZSk7IAotICAgICAgbWV0aG9kVmlzaXRvci5ydW4oYmVhbkVsZW1lbnQsbWV0aG9kRmlsZUhlbHBHZW5lcmF0b3IpOwotICAgICAgZmJ1ZmZlciA9IG1ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvVUw+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIjwvSFRNTD4iKTsKLSAgICAgIAotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL01ldGhvZEZpbGVIZWxwR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzQyMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9NZXRob2RGaWxlSGVscEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotCi0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgTWV0aG9kRmlsZWdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RGaWxlSGVscEdlbmVyYXRvciBleHRlbmRzIE1ldGhvZEZpbGVHZW5lcmF0b3IKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqCi0gICovCi0gIHB1YmxpYyBNZXRob2RGaWxlSGVscEdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcixTdHJpbmcgaW5wdXROYW1lKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIsaW5wdXROYW1lKTsKLSAgfQotCi0KLSAgLy90YWtlcyBpbiBhIE1ldGhvZCBub2RlCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kID0gKE1ldGhvZEVsZW1lbnQpbWV0aG9kRWxlbWVudDsKLSAgICAgIGlmIChtZXRob2QuZ2V0TWV0aG9kT21taXNzaW9uKCkpIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICAgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxMST48QSBIUkVGPVwiIiArIGZJbnB1dE5hbWUgKyAiP21ldGhvZD0iICsgbWV0aG9kLmdldE51bWJlcklEKCkpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIlwiIFRBUkdFVD1cImlucHV0c1wiPiAiICsgbWV0aG9kLmdldERpc3BsYXlOYW1lKCkpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvQT48L0xJPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3YzkxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5UeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5BdHRyaWJ1dGVFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uZGF0YW1vZGVsLmJlYW5tb2RlbC5UeXBlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY0VsZW1lbnQ7Ci0KLS8qKgotKiBPYmplY3RzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGEgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci4KLSogKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIGV4dGVuZHMgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHJpdmF0ZSBWZWN0b3IgZlNldHRlclZlY3RvcjsgCi0KLSAgLyoqCi0gICogQ29uc3RydWN0b3IuCi0gICogQHBhcmFtIGJ1ZmZlciBTdHJpbmdCdWZmZXIgb2JqZWN0IHRoYXQgdGhpcyBjb2RlIGdlbmVyYXRvciB3cml0ZXMgdG8gCi0gICovCi0gIHB1YmxpYyBSZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yIChTdHJpbmdCdWZmZXIgYnVmZmVyKQotICB7Ci0gICAgICBzdXBlcihidWZmZXIpOwotICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAqIFNldHRlciB2ZWN0b3IKLSAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRTZXR0ZXJWZWN0b3IoKQotICB7Ci0gICAgICByZXR1cm4gZlNldHRlclZlY3RvcjsKLSAgfQotICAKLQotICAvKioKLSAgKiBWaXNpdCBNZXRob2QgZ2VuZXJhdGVzIGNvZGUgZm9yIHRoaXMgVmlzaXRvcgotICAqIEBwYXJhbSBQYXJhbWV0ZXIgcGFyYW1ldGVyIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgQXR0cmlidXRlRWxlbWVudFR5cGUgYXR0cmlidXRlRWxlbWVudFR5cGUgPSAoQXR0cmlidXRlRWxlbWVudFR5cGUpb2JqZWN0OwotICAgICBCYXNpY0VsZW1lbnQgZWxlbWVudCA9IChCYXNpY0VsZW1lbnQpb2JqZWN0OwotICAgICBpZihhdHRyaWJ1dGVFbGVtZW50VHlwZS5nZXRUeXBlRWxlbWVudCgpLmlzU2ltcGxlKCkgfHwgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4oYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCkpKXsgICAgICAKLSAgICAgICAgLy9zdGFydCB0aGUgY29kZWdlbgotICAgICAgICAvL2FzayB0aGUgZGF0YXR5cGUgZm9yIGl0cyByZXF1ZXN0IGxpbmUsIGl0IG1heSBuZWVkIG1hcmsgdXAgb3Igbm90LgotICAgICAgICAvL2llIEZvciB0aGUgc2ltcGxlIHR5cGVzIHdlIG5lZWQgdGhlIG1hcmsgdXAKLSAgICAgICAgLy9mb3IgdGhlIGRvbSBlbGVtZW50IHdlIGNhbnQgdXNlIGl0LgotICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZVR5cGUoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0VHlwZUVsZW1lbnQoKS5nZXROYW1lKCksZWxlbWVudC5nZXRNVUlEKCkpOwotICAgICAgICBzZXRUeXBlT3duZXJJZChpZE5hbWUoZWxlbWVudC5nZXROYW1lKCkpKTsgCi0gICAgICAgIGZidWZmZXIuYXBwZW5kKGRhdGFUeXBlLmdldFJlcXVlc3RDb2RlKGVsZW1lbnQuZ2V0TVVJRCgpLGdldFR5cGVPd25lcklkKCkpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgfQotICAgICAKLSAgICAgVHlwZVZpc2l0b3IgdHlwZVZpc2l0b3IgPSBuZXcgVHlwZVZpc2l0b3IoKTsKLSAgICAgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgPSBuZXcgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IoZmJ1ZmZlcik7Ci0gICAgIHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0VHlwZU93bmVySWQoZ2V0VHlwZU93bmVySWQoKSk7Ci0gICAgIAotICAgICB0eXBlVmlzaXRvci5ydW4oYXR0cmlidXRlRWxlbWVudFR5cGUscmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IpOwotICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgIFZlY3RvciBzZXR0ZXJJbnB1dHMgPSByZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5nZXRSZXNpZGVudFZlY3RvcigpOyAKLSAgICAgaWYoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0U2V0dGVyTWV0aG9kKCkgPT0gbnVsbCkgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOyAKLSAgICAgcHV0UmVzaWRlbnRWZWN0b3IoYXR0cmlidXRlRWxlbWVudFR5cGUuZ2V0U2V0dGVyU2lnbmF0dXJlKChTdHJpbmcpc2V0dGVySW5wdXRzLmZpcnN0RWxlbWVudCgpKSk7Ci0gICAgIAotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0gICAKLQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ1NWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5NZXRob2RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkJlYW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBNZXRob2RGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFJlc3VsdEZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRSSVBMRV9UQUIgPSBHZW5lcmF0b3IuRE9VQkxFX1RBQiArIEdlbmVyYXRvci5UQUI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBRVUFEX1RBQiA9IEdlbmVyYXRvci5ET1VCTEVfVEFCICsgR2VuZXJhdG9yLkRPVUJMRV9UQUI7Ci0gIAotICBwcml2YXRlIFN0cmluZyBzZXRFbmRwb2ludE1ldGhvZDsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVHZW5lcmF0b3IgKCkKLSAgewotICAgICAgc3VwZXIoKTsKLSAgfQotCi0gICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gIH0KLQotICAvL3Rha2VzIGluIGEgYmVhbiBub2RlCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgIEVsZW1lbnQgYmVhbkVsZW1lbnQgPSAoRWxlbWVudClvYmplY3Q7Ci0gICAgICBCZWFuRWxlbWVudCBiZWFuID0gKEJlYW5FbGVtZW50KWJlYW5FbGVtZW50OwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlQHBhZ2UgY29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiJT4iKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEhFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUSVRMRT5SZXN1bHQ8L1RJVExFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SDE+UmVzdWx0PC9IMT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0gICAgICBmYnVmZmVyLmFwcGVuZCgiPGpzcDp1c2VCZWFuIGlkPVwiIisgZ2V0U2Vzc2lvbkJlYW5JZCgpICsgIlwiIHNjb3BlPVwic2Vzc2lvblwiIGNsYXNzPVwiIik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZChiZWFuLmdldE5hbWUoKSArICJcIiAvPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGlmIChzZXRFbmRwb2ludE1ldGhvZCAhPSBudWxsICYmIHNldEVuZHBvaW50TWV0aG9kLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIik7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFwiZW5kcG9pbnRcIikgIT0gbnVsbCAmJiByZXF1ZXN0LmdldFBhcmFtZXRlcihcImVuZHBvaW50XCIpLmxlbmd0aCgpID4gMCkiKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKGdldFNlc3Npb25CZWFuSWQoKSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIuIik7Ci0gICAgICAgIGludCBpbmRleCA9IHNldEVuZHBvaW50TWV0aG9kLmluZGV4T2YoJz8nKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2Quc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIihuZXcgIik7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2Quc3Vic3RyaW5nKGluZGV4KzEsIHNldEVuZHBvaW50TWV0aG9kLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIihyZXF1ZXN0LmdldFBhcmFtZXRlcihcImVuZHBvaW50XCIpKSk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoc2V0RW5kcG9pbnRNZXRob2QpOwotICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCIocmVxdWVzdC5nZXRQYXJhbWV0ZXIoXCJlbmRwb2ludFwiKSk7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIH0KLSAgICAgIGZidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAKLSAgICAgICAgICAgIAotICAgICAgLy9jYXJyeSBvbiB3aXRoIHJlZ3VsYXIgZ29ycAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIlN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihcIm1ldGhvZFwiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaW50IG1ldGhvZElEID0gMDsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYgKG1ldGhvZCA9PSBudWxsKSBtZXRob2RJRCA9IC0xOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgIiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJpZihtZXRob2RJRCAhPSAtMSkgbWV0aG9kSUQgPSBJbnRlZ2VyLnBhcnNlSW50KG1ldGhvZCk7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJib29sZWFuIGdvdE1ldGhvZCA9IGZhbHNlOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ0cnkgeyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJzd2l0Y2ggKG1ldGhvZElEKXsgIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgIAotICAgICAgLy8gZ28gdG8gdGhlIG5leHQgZ2VuZXJhdG9yCi0gICAgICBNZXRob2RWaXNpdG9yIG1ldGhvZFZpc2l0b3IgPSBuZXcgTWV0aG9kVmlzaXRvcigpOwotICAgICAgUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yIHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvciA9IG5ldyBSZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IoZmJ1ZmZlcik7IAotICAgICAgcmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgIHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5zZXRDbGllbnRGb2xkZXJQYXRoKGdldENsaWVudEZvbGRlclBhdGgoKSk7Ci0gICAgICBtZXRob2RWaXNpdG9yLnJ1bihiZWFuRWxlbWVudCxyZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IpOwotICAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IuZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLQotICAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOyAgICAKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiZXhjZXB0aW9uOiA8JT0gZSAlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJyZXR1cm47IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiaWYoIWdvdE1ldGhvZCl7IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoInJlc3VsdDogTi9BIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIn0iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hUTUw+Iik7Ci0KLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXRFbmRwb2ludE1ldGhvZCBUaGUgc2V0RW5kcG9pbnRNZXRob2QgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V0RW5kcG9pbnRNZXRob2QoU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kKQotICB7Ci0gICAgdGhpcy5zZXRFbmRwb2ludE1ldGhvZCA9IHNldEVuZHBvaW50TWV0aG9kOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlSGVscDFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmNGFlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlBhcmFtZXRlclZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5SZXR1cm5QYXJhbWV0ZXJWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFJlc3VsdEZpbGVnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZUhlbHAxR2VuZXJhdG9yIGV4dGVuZHMgUmVzdWx0RmlsZUdlbmVyYXRvciAKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfU1RBVEUgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5BTF9TVEFURSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1URU1QID0gIm10ZW1wIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQkVBTiA9ICJQcm94eSI7Ci0KLSAgLyoqCi0gICoga2VlcHMgdGhlIHN0YXRlIG9mIHRoZSB2aXNpdG9yIAotICAqICovCi0KLSAgcHJpdmF0ZSBpbnQgZnN0YXRlOwotCi0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYnVmZmVyIFN0cmluZ0J1ZmZlciBvYmplY3QgdGhhdCB0aGlzIGNvZGUgZ2VuZXJhdG9yIHdyaXRlcyB0byAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVIZWxwMUdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgIGZzdGF0ZSA9IElOSVRJQUxfU1RBVEU7Ci0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAqIFZpc2l0IE1ldGhvZCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhpcyBWaXNpdG9yCi0gICogQHBhcmFtIG1ldGhvZCBtZXRob2QgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAgRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAKLQotICAgICBNZXRob2RFbGVtZW50IG1ldGhvZCA9IChNZXRob2RFbGVtZW50KW1ldGhvZEVsZW1lbnQ7Ci0gICAgIGlmIChtZXRob2QuZ2V0TWV0aG9kT21taXNzaW9uKCkpIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQotICAgICBmYnVmZmVyLmFwcGVuZCgiY2FzZSAiICsgbWV0aG9kLmdldE51bWJlcklEKCkrICI6IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICB2aXNpdEhlbHBlcihtZXRob2QpOwotICAgICAKLSAgICAgZmJ1ZmZlci5hcHBlbmQoImJyZWFrOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgCi0gIAotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0gICAKLSAgLyoqCi0gICogSGVscHMgb3V0IHRoZSB2aXNpdG9yCi0gICogQHBhcmFtIG1ldGhvZCBtZXRob2QgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0SGVscGVyIChFbGVtZW50IG1ldGhvZEVsZW1lbnQpCi0gIHsKLQotICAgICBmYnVmZmVyLmFwcGVuZChHZW5lcmF0b3IuRE9VQkxFX1RBQiArICJnb3RNZXRob2QgPSB0cnVlOyIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgCi0gICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kID0gKE1ldGhvZEVsZW1lbnQpbWV0aG9kRWxlbWVudDsKLSAgICAgLy8gZ28gdG8gdGhlIG5leHQgZ2VuZXJhdG9yCi0gICAgIFJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvciByZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgPSBuZXcgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yKGZidWZmZXIpOyAKLSAgICAgcmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgUGFyYW1ldGVyVmlzaXRvciBwYXJhbWV0ZXJWaXNpdG9yID0gbmV3IFBhcmFtZXRlclZpc2l0b3IoKTsKLSAgICAgcGFyYW1ldGVyVmlzaXRvci5ydW4obWV0aG9kRWxlbWVudCxyZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IpOwotICAgICBmYnVmZmVyID0gcmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvci5nZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICAvLyB3ZSBtdXN0IG5vdyBncmFiIHRoZSBzdGF0ZSBkYXRhIGZyb20gdGhlIHJlc2lkZW50IHZlY3RvcgotICAgICBzZXRSZXNpZGVudFZlY3RvcihyZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IuZ2V0UmVzaWRlbnRWZWN0b3IoKSk7Ci0KLSAgICAgCi0gICAgIC8vdGhlcmUgaXMgbm8gcmV0dXJuIHR5cGUgaWYgdm9pZCBvY2N1cnMgICAgCi0gICAgCi0gICAgIAotICAgICBpZiAobWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSkKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBnZXRTZXNzaW9uQmVhbklkKCkgKyAiLiIgK21ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotCi0gICAgIGVsc2V7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSArIEdlbmVyYXRvci5TUEFDRSArIG1ldGhvZC5nZXRNVUlEKCkgKyBNVEVNUCArIEdlbmVyYXRvci5TUEFDRSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCI9IiArIEdlbmVyYXRvci5TUEFDRSArIGdldFNlc3Npb25CZWFuSWQoKSArICIuIiArIG1ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotICAgICB9Ci0KLSAgICAgRW51bWVyYXRpb24gZSA9IGZSZXNpZGVudFZlY3Rvci5lbGVtZW50cygpOwotICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoKFN0cmluZyllLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgIGlmIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgICAgICBmYnVmZmVyLmFwcGVuZCgiLCIpOyAgICAKLSAgICAgfQotICAgICBmYnVmZmVyLmFwcGVuZCgiKTsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIGlmICghbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSAmJiAhbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmlzUHJpbWl0aXZlKCkpewotICAgICAgICAvL2luIGNhc2Ugb3VyIHJlc3VsdCBpcyBudWxsCi0gICAgICAgIGZidWZmZXIuYXBwZW5kKCJpZigiICsgbWV0aG9kLmdldE1VSUQoKSArICJtdGVtcCA9PSBudWxsKXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCIlPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlPSIgKyBtZXRob2QuZ2V0TVVJRCgpICsgIm10ZW1wICU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgIGZidWZmZXIuYXBwZW5kKCJ9ZWxzZXsiICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgIH0KLSAgICAgCi0gICAgIC8vbm93IGxldHMgZGlzcGxheSB0aGUgcmV0dXJuIGJlYW4KLSAgICAgLy8gaWYgaXQgaXMgc2ltcGxlIHdlIGRvbnQgbmVlZCB0byB1c2UgdGhlIGdlbmVyYXRvcgotICAgICAKLSAgICAgaWYgKCFtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpLmVxdWFscygidm9pZCIpKXsKLSAgICAgICAgaWYgKG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5pc1NpbXBsZSgpIAotICAgICAgICAgICB8fCBUeXBlRmFjdG9yeS5yZWNvZ25pemVkQmVhbihtZXRob2QuZ2V0UmV0dXJuUGFyYW1ldGVyRWxlbWVudCgpLmdldFR5cGVFbGVtZW50KCkuZ2V0TmFtZSgpKQotICAgICAgICAgICB8fCBUeXBlRmFjdG9yeS5pc1N0YXRlTGVzc0JlYW4obWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldFR5cGVOYW1lKCkpCi0gICAgICAgICAgIHx8IFR5cGVGYWN0b3J5LmlzUmVjb2duaXplZFJldHVyblR5cGUobWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldFR5cGVOYW1lKCkpKXsKLSAgICAgICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGVUeXBlKG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5nZXRUeXBlTmFtZSgpLG1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0TVVJRCgpKTsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoZGF0YVR5cGUuVHlwZUNvbnZlcnNpb24obWV0aG9kLmdldE1VSUQoKSArIE1URU1QKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgICBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvciBpbnB1dEZpbGVIZWxwMkdlbmVyYXRvciA9IG5ldyBJbnB1dEZpbGVIZWxwMkdlbmVyYXRvcihmYnVmZmVyKTsKLSAgICAgICAgICAgaW5wdXRGaWxlSGVscDJHZW5lcmF0b3Iuc2V0SW5zdGFuY2VOYW1lKG1ldGhvZC5nZXRNVUlEKCkgKyBNVEVNUCk7Ci0gICAgICAgICAgIGlucHV0RmlsZUhlbHAyR2VuZXJhdG9yLnNldFJldHVyblBhcmFtKHRydWUpOwotICAgICAgICAgICBSZXR1cm5QYXJhbWV0ZXJWaXNpdG9yIHJldHVyblBhcmFtZXRlclZpc2l0b3IgPSBuZXcgUmV0dXJuUGFyYW1ldGVyVmlzaXRvcigpOwotICAgICAgICAgICByZXR1cm5QYXJhbWV0ZXJWaXNpdG9yLnJ1bihtZXRob2QsaW5wdXRGaWxlSGVscDJHZW5lcmF0b3IpOwotICAgICAgICAgICBmYnVmZmVyID0gaW5wdXRGaWxlSGVscDJHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgIGZidWZmZXIuYXBwZW5kKCI8JSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLQotICAgICAgICB9Ci0gICAgIH0KLQotICAgIGlmICghbWV0aG9kLmdldFJldHVyblBhcmFtZXRlckVsZW1lbnQoKS5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKS5lcXVhbHMoInZvaWQiKSAgJiYgIW1ldGhvZC5nZXRSZXR1cm5QYXJhbWV0ZXJFbGVtZW50KCkuZ2V0VHlwZUVsZW1lbnQoKS5pc1ByaW1pdGl2ZSgpKSBmYnVmZmVyLmFwcGVuZCgifSIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsgICAgCi0gICAgCi0gIH0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVIZWxwMkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdkM2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29kZWdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLlR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLkRhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5kYXRhbW9kZWwuYmVhbm1vZGVsLlBhcmFtZXRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlSGVscDJnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZUhlbHAyR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gICAKLSAgcHJpdmF0ZSBTdHJpbmcgZlR5cGVPd25lcklkOyAgCi0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKiBAcGFyYW0gYnVmZmVyIFN0cmluZ0J1ZmZlciBvYmplY3QgdGhhdCB0aGlzIGNvZGUgZ2VuZXJhdG9yIHdyaXRlcyB0byAKLSAgKi8KLSAgcHVibGljIFJlc3VsdEZpbGVIZWxwMkdlbmVyYXRvciAoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgICAgc3VwZXIoYnVmZmVyKTsKLSAgICAgIAotICB9Ci0gIAotICAvKioKLSAgKiBWaXNpdCBNZXRob2QgZ2VuZXJhdGVzIGNvZGUgZm9yIHRoaXMgVmlzaXRvcgotICAqIEBwYXJhbSBQYXJhbWV0ZXIgcGFyYW1ldGVyIGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQgCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgdmlzaXQgKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICAKLQotICAgICBQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQgPSAoUGFyYW1ldGVyRWxlbWVudClvYmplY3Q7Ci0gICAgIEVsZW1lbnQgZWxlbWVudD0gcGFyYW1ldGVyRWxlbWVudC5nZXRUeXBlRWxlbWVudCgpOyAKLSAgICAgaWYocGFyYW1ldGVyRWxlbWVudC5nZXRUeXBlRWxlbWVudCgpLmlzU2ltcGxlKCkgfHwgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4ocGFyYW1ldGVyRWxlbWVudC5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSkpeyAgICAgIAotICAgICAgICAvL3N0YXJ0IHRoZSBjb2RlZ2VuCi0gICAgICAgICAvL2FzayB0aGUgZGF0YXR5cGUgZm9yIGl0cyByZXF1ZXN0IGxpbmUsIGl0IG1heSBuZWVkIG1hcmsgdXAgb3Igbm90LgotICAgICAgICAvL2llIEZvciB0aGUgc2ltcGxlIHR5cGVzIHdlIG5lZWQgdGhlIG1hcmsgdXAKLSAgICAgICAgLy9mb3IgdGhlIGRvbSBlbGVtZW50IHdlIGNhbnQgdXNlIGl0LgotICAgICAgICBEYXRhVHlwZSBkYXRhVHlwZSA9IFR5cGVGYWN0b3J5LmNyZWF0ZVR5cGUocGFyYW1ldGVyRWxlbWVudC5nZXRUeXBlRWxlbWVudCgpLmdldE5hbWUoKSxwYXJhbWV0ZXJFbGVtZW50LmdldE1VSUQoKSk7Ci0gICAgICAgIHNldFR5cGVPd25lcklkKGlkTmFtZShwYXJhbWV0ZXJFbGVtZW50LmdldE5hbWUoKSkpOwotICAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5nZXRSZXF1ZXN0Q29kZShwYXJhbWV0ZXJFbGVtZW50LmdldE1VSUQoKSxnZXRUeXBlT3duZXJJZCgpKSk7Ci0gICAgIH0KLSAgICAgICAgIAotICAgICAvL3Zpc2l0IHRoZSB0eXBlIGdlbmVyYXRvcgotICAgICBSZXN1bHRGaWxlVHlwZUdlbmVyYXRvciByZXN1bHRGaWxlVHlwZUdlbmVyYXRvciA9IG5ldyBSZXN1bHRGaWxlVHlwZUdlbmVyYXRvcihmYnVmZmVyKTsgCi0gICAgIHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLnNldE51bWJlckZhY3RvcnkoZ2V0TnVtYmVyRmFjdG9yeSgpKTsKLSAgICAgcmVzdWx0RmlsZVR5cGVHZW5lcmF0b3Iuc2V0VHlwZU93bmVySWQoZ2V0VHlwZU93bmVySWQoKSk7Ci0gICAgIFR5cGVWaXNpdG9yIFR5cGVWaXNpdG9yID0gbmV3IFR5cGVWaXNpdG9yKCk7Ci0gICAgIFR5cGVWaXNpdG9yLnJ1bihwYXJhbWV0ZXJFbGVtZW50LHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yKTsKLSAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldFN0cmluZ0J1ZmZlcigpOwotICAgICBzZXROdW1iZXJGYWN0b3J5KHJlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylyZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5nZXRSZXNpZGVudFZlY3RvcigpLmZpcnN0RWxlbWVudCgpOwotICAgICBwdXRSZXNpZGVudFZlY3RvcihuYW1lKTsgCi0gICAgIAotICAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU93bmVySWQoKQotICB7Ci0gICAgIGlmIChmVHlwZU93bmVySWQgPT0gbnVsbCkgZlR5cGVPd25lcklkID0gIiI7IAotICAgICByZXR1cm4gZlR5cGVPd25lcklkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VHlwZU93bmVySWQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmVHlwZU93bmVySWQgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBpZE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgCQotICAgIFN0cmluZyB1bmlxdWVOdW0gPSBTdHJpbmcudmFsdWVPZihnZXRVbmlxdWVOdW1iZXIoKSk7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBuYW1lLnJlcGxhY2UoJy4nLCcxJykgKyAiXyIgK3VuaXF1ZU51bSArICJpZCI7Ci0gICAgcmV0dXJuIG5ld05hbWU7Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Jlc3VsdEZpbGVUeXBlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNzMzMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29kZWdlbi9SZXN1bHRGaWxlVHlwZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uc2FtcGxlYXBwLmNvZGVnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5iZWFuLkF0dHJpYnV0ZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvZGVnZW4uYmVhbi5GaWVsZFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmRhdGFtb2RlbC5iZWFubW9kZWwuVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBSZXN1bHRGaWxlSGVscDJnZW5lcmF0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgZXh0ZW5kcyBSZXN1bHRGaWxlSGVscDJHZW5lcmF0b3IgCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotCi0gIHB1YmxpYyBTdHJpbmcgZlR5cGVJZE5hbWU7Ci0gCi0gIC8qKgotICAqIENvbnN0cnVjdG9yLgotICAqIEBwYXJhbSBidWZmZXIgU3RyaW5nQnVmZmVyIG9iamVjdCB0aGF0IHRoaXMgY29kZSBnZW5lcmF0b3Igd3JpdGVzIHRvIAotICAqLwotICBwdWJsaWMgUmVzdWx0RmlsZVR5cGVHZW5lcmF0b3IgKFN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICAgIHN1cGVyKGJ1ZmZlcik7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFZpc2l0IE1ldGhvZCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhpcyBWaXNpdG9yCi0gICogQHBhcmFtIFBhcmFtZXRlciBwYXJhbWV0ZXIgY29kZSB3aWxsIGJlIGdlbmVyYXRlZCAKLSAgKi8KLSAgcHVibGljIFN0YXR1cyB2aXNpdCAoT2JqZWN0IG9iamVjdCkKLSAgewotICAgICBFbGVtZW50IHR5cGVFbGVtZW50ID0gKEVsZW1lbnQpb2JqZWN0OwotICAgICBUeXBlRWxlbWVudCB0eXBlID0gKFR5cGVFbGVtZW50KXR5cGVFbGVtZW50OyAgICAgIAotICAgICAvLyByaWdodCBub3cgd2Ugb25seSBoYXZlIHNpbXBsZSB0byB3b3JyeSBhYm91dAotICAgICBpZih0eXBlLmlzU2ltcGxlKCkgfHwgVHlwZUZhY3RvcnkucmVjb2duaXplZEJlYW4odHlwZS5nZXROYW1lKCkpKXsKLSAgICAgICAvLyBjcmVhdGUgdGhlIHR5cGUgdGhhdCByZXByZXNlbnRzIHRoZSBzaW1wbGUgdHlwZSBuYW1lCi0gICAgICAgRGF0YVR5cGUgZGF0YVR5cGUgPSBUeXBlRmFjdG9yeS5jcmVhdGVUeXBlKHR5cGUuZ2V0TmFtZSgpLHR5cGUuZ2V0T3duaW5nRWxlbWVudCgpLmdldE1VSUQoKSk7Ci0gIAotICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGdldFR5cGVPd25lcklkKCkrICJUZW1wIjsKLSAgICAgICBmYnVmZmVyLmFwcGVuZChkYXRhVHlwZS5zdHJpbmdDb252ZXJzaW9uKHR5cGUuZ2V0TmFtZSgpLG5vZGVOYW1lLGdldFR5cGVPd25lcklkKCkpKTsKLQotICAgICAgIHB1dFJlc2lkZW50VmVjdG9yKG5vZGVOYW1lKTsKLSAgICAgfQotCi0gICAgIGVsc2UgewotICAgICAgIC8vbXVzdCBiZSBjb21wbGV4Ci0gICAgICAgU3RyaW5nIHR5cGVOYW1lID0gdHlwZUVsZW1lbnQuZ2V0TmFtZSgpOyAKLSAgICAgICBmVHlwZUlkTmFtZSA9IGlkTmFtZSh0eXBlTmFtZSk7Ci0gICAgICAgICAgICAgIAotICAgICAgIEF0dHJpYnV0ZVZpc2l0b3IgYXR0cmlidXRlVmlzaXRvciA9IG5ldyBBdHRyaWJ1dGVWaXNpdG9yKCk7Ci0gICAgICAgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvciByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yID0gbmV3IFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IoZmJ1ZmZlcik7Ci0gICAgICAgcmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvci5zZXROdW1iZXJGYWN0b3J5KGdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgICAgYXR0cmlidXRlVmlzaXRvci5ydW4odHlwZUVsZW1lbnQscmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcik7Ci0gICAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yLmdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgICAgZmJ1ZmZlciA9IHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuZ2V0U3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICBGaWVsZFZpc2l0b3IgZmllbGRWaXNpdG9yID0gbmV3IEZpZWxkVmlzaXRvcigpOwotICAgICAgIFJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IgcmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcjIgPSBuZXcgUmVzdWx0RmlsZUF0dHJpYnV0ZUdlbmVyYXRvcihmYnVmZmVyKTsKLSAgICAgICByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5zZXROdW1iZXJGYWN0b3J5KGdldE51bWJlckZhY3RvcnkoKSk7Ci0gICAgICAgZmllbGRWaXNpdG9yLnJ1bih0eXBlRWxlbWVudCxyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMik7Ci0gICAgICAgc2V0TnVtYmVyRmFjdG9yeShyZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5nZXROdW1iZXJGYWN0b3J5KCkpOwotICAgICAgIGZidWZmZXIgPSByZXN1bHRGaWxlQXR0cmlidXRlR2VuZXJhdG9yMi5nZXRTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgCi0gICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiJT4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyAiPGpzcDp1c2VCZWFuIGlkPVwiIiArIGZUeXBlSWROYW1lICsgIlwiIHNjb3BlPVwic2Vzc2lvblwiIGNsYXNzPVwiIiArIHR5cGVOYW1lICsgIlwiIC8+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgIjwlIiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgICAgCi0gICAgICAgRW51bWVyYXRpb24gZSA9IHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IuZ2V0UmVzaWRlbnRWZWN0b3IoKS5lbGVtZW50cygpOwotICAgICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpewotICAgICAgICAgIGZidWZmZXIuYXBwZW5kKEdlbmVyYXRvci5ET1VCTEVfVEFCICsgZlR5cGVJZE5hbWUgKyAiLiIgKyBlLm5leHRFbGVtZW50KCkgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICB9Ci0KLSAgICAgICBFbnVtZXJhdGlvbiBlMiA9IHJlc3VsdEZpbGVBdHRyaWJ1dGVHZW5lcmF0b3IyLmdldFJlc2lkZW50VmVjdG9yKCkuZWxlbWVudHMoKTsKLSAgICAgICB3aGlsZShlMi5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgICAgZmJ1ZmZlci5hcHBlbmQoR2VuZXJhdG9yLkRPVUJMRV9UQUIgKyBmVHlwZUlkTmFtZSArICIuIiArIGUyLm5leHRFbGVtZW50KCkgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgICB9IAotICAgICAgIHB1dFJlc2lkZW50VmVjdG9yKGZUeXBlSWROYW1lKTsKLSAgICAgICAvL2VuZCBvZiBjaGFuZ2VzCi0gICAgIAotICAgIH0KLSAgICAgCi0gICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfSAgIAotICAKLQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vVGVzdENsaWVudEZpbGVHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvZGVnZW4vVGVzdENsaWVudEZpbGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4ZjE4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb2RlZ2VuL1Rlc3RDbGllbnRGaWxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb2RlZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLQotCi0vKioKLSogT2JqZWN0cyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIFRlc3RDbGllbnRGaWxlZ2VuZXJhdG9yLgotKiAqLwotcHVibGljIGNsYXNzIFRlc3RDbGllbnRGaWxlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLQotICBwdWJsaWMgU3RyaW5nIGZNZXRob2ROYW1lOwotICBwdWJsaWMgU3RyaW5nIGZJbnB1dE5hbWU7Ci0gIHB1YmxpYyBTdHJpbmcgZlJlc3VsdE5hbWU7Ci0gIAotICAvKioKLSAgKiBDb25zdHJ1Y3Rvci4KLSAgKgotICAqLwotICBwdWJsaWMgVGVzdENsaWVudEZpbGVHZW5lcmF0b3IgKFN0cmluZyBpbnB1dHMsIFN0cmluZyBtZXRob2RzLCBTdHJpbmcgcmVzdWx0cykKLSAgewotICAgICBzdXBlcigpOwotICAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICAgICBmTWV0aG9kTmFtZSA9IG1ldGhvZHM7Ci0gICAgIGZSZXN1bHROYW1lID0gcmVzdWx0czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lcyhTdHJpbmcgaW5wdXRzLCBTdHJpbmcgbWV0aG9kcywgU3RyaW5nIHJlc3VsdHMpCi0gIHsKLSAgICBmSW5wdXROYW1lID0gaW5wdXRzOwotICAgIGZNZXRob2ROYW1lID0gbWV0aG9kczsKLSAgICBmUmVzdWx0TmFtZSA9IHJlc3VsdHM7Ci0gIH0KLQotICAvL3Rha2VzIGluIGEgYmVhbiBub2RlCi0gICBwdWJsaWMgU3RhdHVzIHZpc2l0IChPYmplY3Qgb2JqZWN0KQotICAgewotICAgICAgRWxlbWVudCBiZWFuRWxlbWVudCA9IChFbGVtZW50KW9iamVjdDsKLSAgICAgIAotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwlQHBhZ2UgY29udGVudFR5cGU9XCJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOFwiJT4iKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8SFRNTD4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEhFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxUSVRMRT5XZWIgU2VydmljZXMgVGVzdCBDbGllbnQ8L1RJVExFPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hFQUQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUgKyAiIik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZSQU1FU0VUICBDT0xTPVwiMjIwLCpcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPEZSQU1FIFNSQz1cIiIrIGZNZXRob2ROYW1lICsgIlwiIE5BTUU9XCJtZXRob2RzXCIgTUFSR0lOV0lEVEg9XCIxXCIgTUFSR0lOSEVJR0hUPVwiMVwiIFNDUk9MTElORz1cInllc1wiIEZSQU1FQk9SREVSPVwiMVwiPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8RlJBTUVTRVQgIFJPV1M9XCI4MCUsMjAlXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGUkFNRSBTUkM9XCIiKyBmSW5wdXROYW1lICArICJcIiBOQU1FPVwiaW5wdXRzXCIgIE1BUkdJTldJRFRIPVwiMVwiIE1BUkdJTkhFSUdIVD1cIjFcIiBTQ1JPTExJTkc9XCJ5ZXNcIiBGUkFNRUJPUkRFUj1cIjFcIj4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPCUiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiU3RyaW5nQnVmZmVyIHJlc3VsdEpTUCA9IG5ldyBTdHJpbmdCdWZmZXIoXCIiKS5hcHBlbmQoZlJlc3VsdE5hbWUpLmFwcGVuZCgiXCIpOyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJyZXN1bHRKU1AuYXBwZW5kKFwiP1wiKTsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiamF2YS51dGlsLkVudW1lcmF0aW9uIHJlc3VsdEVudW0gPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Iik7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgid2hpbGUgKHJlc3VsdEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiT2JqZWN0IHJlc3VsdE9iaiA9IHJlc3VsdEVudW0ubmV4dEVsZW1lbnQoKTsiKS5hcHBlbmQoU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgicmVzdWx0SlNQLmFwcGVuZChyZXN1bHRPYmoudG9TdHJpbmcoKSkuYXBwZW5kKFwiPVwiKS5hcHBlbmQocmVxdWVzdC5nZXRQYXJhbWV0ZXIocmVzdWx0T2JqLnRvU3RyaW5nKCkpKS5hcHBlbmQoXCImXCIpOyIpLmFwcGVuZChTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJ9IikuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIiU+IikuYXBwZW5kKFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxGUkFNRSBTUkM9XCI8JT1yZXN1bHRKU1AudG9TdHJpbmcoKSU+XCIgTkFNRT1cInJlc3VsdFwiICBNQVJHSU5XSURUSD1cIjFcIiBNQVJHSU5IRUlHSFQ9XCIxXCIgU0NST0xMSU5HPVwieWVzXCIgRlJBTUVCT1JERVI9XCIxXCI+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjwvRlJBTUVTRVQ+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotCi0KLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8Tk9GUkFNRVM+IiArIFN0cmluZ1V0aWxzLk5FV0xJTkUpOwotICAgICAgZmJ1ZmZlci5hcHBlbmQoIjxCT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCJUaGUgV2ViIFNlcnZpY2VzIFRlc3QgQ2xpZW50IHJlcXVpcmVzIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIGZyYW1lcy4iICsgU3RyaW5nVXRpbHMuTkVXTElORSk7Ci0gICAgICBmYnVmZmVyLmFwcGVuZCgiPC9CT0RZPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L05PRlJBTUVTPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0ZSQU1FU0VUPiIgKyBTdHJpbmdVdGlscy5ORVdMSU5FKTsKLSAgICAgIGZidWZmZXIuYXBwZW5kKCI8L0hUTUw+Iik7Ci0KLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbWFuZC9HZW5lcmF0ZVBhZ2VDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0dlbmVyYXRlUGFnZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3ZDBmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0dlbmVyYXRlUGFnZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0KLS8qKgotICogTW9mVG9CZWFuTW9kZWxDb21tYW5kCi0gKiBDcmVhdGlvbiBkYXRlOiAoNC8xMC8yMDAxIDEyOjQxOjQ4IFBNKQotICogQGF1dGhvcjogR2lsYmVydCBBbmRyZXdzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVBhZ2VDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCB7Ci0JCQotcHJpdmF0ZSBTdHJpbmcgTEFCRUwgPSAiR2VuZXJhdGVQYWdlQ29tbWFuZCI7Ci1wcml2YXRlIFN0cmluZyBERVNDUklQVElPTiA9ICJHZW5lcmF0ZSBjb2RlIGJhc2VkIG9uIHRoZSBtb2RlbCI7Ci1wcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLXByaXZhdGUgTW9kZWwgbW9kZWxfOwotcHJpdmF0ZSBHZW5lcmF0b3IgZkdlbmVyYXRvcjsKLXByaXZhdGUgSUZpbGUgZklGaWxlOwotcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0XzsKLXByaXZhdGUgU3RyaW5nQnVmZmVyIGZTdHJpbmdCdWZmZXI7Ci0KLXByaXZhdGUgRWxlbWVudCByb290RWxlbWVudF87Ci0vKioKLSAqIEJ1aWxkIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBHZW5lcmF0ZVBhZ2VDb21tYW5kKCkKLXsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKHBsdWdpbklkICsgIi5wbHVnaW4iLCB0aGlzKTsKLQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0Jc2V0TmFtZShMQUJFTCk7ICAJCQotfQotCi0vKioKLSogQ29uc3RydWN0b3IKLSogVGhpcyBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgY29kZSBmcm9tIGEgTW9kZWwKLSogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0byBiZSB0cmF2ZXJzZWQKLSogQHBhcmFtIGdlbmVyYXRvciBUaGUgY29kZSBnZW5lcmF0b3IgdG8gYmUgdXNlZAotKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIHBsYWNlIHRoZSBmaW5pc2hlZCBwcm9kdWN0Ci0qLwotcHVibGljIEdlbmVyYXRlUGFnZUNvbW1hbmQoUmVzb3VyY2VDb250ZXh0IGNvbnRleHQsIE1vZGVsIG1vZGVsLCBHZW5lcmF0b3IgZ2VuZXJhdG9yLCBJRmlsZSBmaWxlKQotewotICBTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLSAgbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIHNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKLSAgc2V0TmFtZShMQUJFTCk7CQotICAKLSAgbW9kZWxfID0gbW9kZWw7Ci0gIGZHZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0gIGZJRmlsZSA9IGZpbGU7Ci0gIHJlc291cmNlQ29udGV4dF8gPSBjb250ZXh0OwotfQotCi1wdWJsaWMgTW9kZWwgZ2V0RGF0YU1vZGVsKCkKLXsKLSAgcmV0dXJuIG1vZGVsXzsKLX0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotewotICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgdHJ5IHsKLSAgICBmR2VuZXJhdG9yLnZpc2l0KG1vZGVsXy5nZXRSb290RWxlbWVudCgpKTsKLSAgICBmU3RyaW5nQnVmZmVyID0gZkdlbmVyYXRvci5nZXRTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmcgdGVtcFN0cmluZyA9IGZTdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKLSAgICBPdXRwdXRTdHJlYW0gZmlsZVJlc291cmNlID0gRmlsZVJlc291cmNlVXRpbHMubmV3RmlsZU91dHB1dFN0cmVhbShyZXNvdXJjZUNvbnRleHRfLCBmSUZpbGUuZ2V0RnVsbFBhdGgoKSwgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLCBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpKTsKLSAgICAvL1ByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGZpbGVSZXNvdXJjZSk7Ci0gICAgLy9wcy5wcmludCh0ZW1wU3RyaW5nKTsKLSAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmaWxlUmVzb3VyY2UsIlVURi04Iik7Ci0gICAgb3N3LndyaXRlKHRlbXBTdHJpbmcsMCxmU3RyaW5nQnVmZmVyLmxlbmd0aCgpKTsgIAotICAgIG9zdy5jbG9zZSgpOwotICAgIGZpbGVSZXNvdXJjZS5jbG9zZSgpOwotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXhjKSB7Ci0gIAlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBpb2V4Yy5nZXRNZXNzYWdlKCksIFN0YXR1cy5FUlJPUik7Ci0gIAlyZXR1cm4gc3RhdHVzOwotICB9Ci19Ci0KLXB1YmxpYyB2b2lkIHNldFJvb3RFbGVtZW50KEVsZW1lbnQgcm9vdEVsZW1lbnQpCi17Ci0gIHJvb3RFbGVtZW50XyA9IHJvb3RFbGVtZW50OwotfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvSmF2YVRvTW9kZWxDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3NhbXBsZWFwcC9jb21tYW5kL0phdmFUb01vZGVsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTgyMTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1hbmQvSmF2YVRvTW9kZWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5zYW1wbGVhcHAuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29kZWdlbi5qYXZhbW9mdmlzaXRvcmFjdGlvbnMuSmF2YU1vZkJlYW5WaXNpdG9yQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb2RlZ2VuLmphdmFtb2Z2aXNpdG9ycy5KYXZhTW9mQmVhblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdGhhdCBuZWVkIHRvIHJlcG9ydCBwcm9ncmVzcwotKiBhbmQgc3RhdHVzIGR1cmluZyBhbmQgYWZ0ZXIgdGhlaXIgZXhlY3V0aW9uLiBUaGlzIGNsYXNzIGV4dGVuZHMKLSoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQgQWJzdHJhY3RDb21tYW5kfQotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0qIHdpdGggbWV0aG9kcyB0byB7QGxpbmsgI3NldFByb2dyZXNzTW9uaXRvciBzZXR9Ci0qIGFuZCB7QGxpbmsgI2dldFByb2dyZXNzTW9uaXRvciBnZXR9IGEgcHJvZ3Jlc3MgbW9uaXRvciwKLSogYW5kIHRvIGdldCBhIHN0YXR1cyBvYmplY3Qge0BsaW5rICNnZXRSZWFkeVN0YXR1cyBiZWZvcmV9Ci0qIG9yIHtAbGluayAjZ2V0UmVzdWx0U3RhdHVzIGFmdGVyfSBleGVjdXRpb24uCi0qIDxwPgotKiBOb3RlIHRoYXQgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHByb3ZpZGluZyBhbgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgSVByb2dyZXNzTW9uaXRvcn0KLSogcmVzdHMgd2l0aCBmcmFtZXdvcmtzIHRoYXQgY29uc3RydWN0IG9yIHJ1biBQcm9ncmVzc0NvbW1hbmQgb2JqZWN0cywKLSogd2hlcmVhcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgcHJvdmlkaW5nIGFuCi0qIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotKiBvYmplY3QgbGllcyB3aXRoIHRoZSBzdWJjbGFzc2VzIG9mIFByb2dyZXNzQ29tbWFuZC4KLSogU3ViY2xhc3NlcyBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZGVzY3JpYmVkIGZvcgotKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCBBYnN0cmFjdENvbW1hbmR9LgotKi8KLXB1YmxpYyBjbGFzcyBKYXZhVG9Nb2RlbENvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kCi17Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzOwotICBwcml2YXRlIElSZXNvdXJjZSByZXNvdXJjZTsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50UHJvamVjdDsKLSAgcHJpdmF0ZSBCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kczsKLSAgcHJpdmF0ZSBTdHJpbmcgcHJveHlCZWFuOwotICBwcml2YXRlIEphdmFDbGFzcyBqYXZhQ2xhc3M7Ci0gIHByaXZhdGUgTW9kZWwgbW9kZWw7Ci0gIHByaXZhdGUgRWxlbWVudCBwYXJlbnRFbGVtZW50OwotICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9ICJKYXZhVG9Nb2RlbENvbW1hbmQiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBERVNDUklQVElPTiA9ICJ0aGlzIGNyZWF0ZXMgYSBtb2RlbCBmcm9tIGEgcmVzb3VyY2UiOwotIAotICAKLQotICBwdWJsaWMgSmF2YVRvTW9kZWxDb21tYW5kICgpCi0gIHsKLQlTdHJpbmcgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIjsKLQltc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOyAgCQotICAJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotICAJc2V0TmFtZShMQUJFTCk7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBTdGF0dXMgY3JlYXRlSmF2YVJlZmxlY3Rpb24oRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gICAgSmF2YU1vZlJlZmxlY3Rpb25Db21tYW5kIGphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZCA9IG5ldyBKYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQoKTsKLSAgICBqYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuc2V0Q2xpZW50UHJvamVjdChjbGllbnRQcm9qZWN0KTsKLSAgICBqYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuc2V0UHJveHlCZWFuKHByb3h5QmVhbik7Ci0gICAgLy9qYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotICAgIHN0YXR1cyA9IGphdmFNb2ZSZWZsZWN0aW9uQ29tbWFuZC5leGVjdXRlKGVudik7Ci0gICAgamF2YUNsYXNzID0gKEphdmFDbGFzcylqYXZhTW9mUmVmbGVjdGlvbkNvbW1hbmQuZ2V0SmF2YUNsYXNzKCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAqIFRoZSBNb2RlbCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gdGhpcyBqYXZhbW9mCi0gICogQHJldHVybiBNb2RlbCBUaGUgZGF0YSBtb2RlbCB0aGF0IHdhcyBjcmVhdGVkCi0gICoqLwotICBwdWJsaWMgTW9kZWwgZ2V0RGF0YU1vZGVsKCkKLSAgewotICAgIHJldHVybiBtb2RlbDsKLSAgfQotCi0gIC8qKgotICAqIEJ1aWxkIHRoZSBkYXRhbW9kZWwgZnJvbSB0aGUgbW9mCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgYnVpbGRNb2RlbEZyb21Nb2YgKEVudmlyb25tZW50IGVudikgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAJCi0gIAlDaG9pY2UgT0tDaG9pY2UgPSBuZXcgQ2hvaWNlKCdPJywgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTEFCRUxfT0siKSwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiREVTQ1JJUFRJT05fT0siKSk7Ci0gIAlDaG9pY2UgQ2FuY2VsQ2hvaWNlID0gbmV3IENob2ljZSgnQycsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpLCBtc2dVdGlscy5nZXRNZXNzYWdlKCJERVNDUklQVElPTl9DQU5DRUwiKSk7Ci0gIAkKLSAgICAvLyB3ZSBjb3VsZCBoYXZlIG9uZSBvZiB0aHJlZSBjYXNlczoKLSAgICAvLzEuIFRoZSBtb2RlbCBpcyBudWxsIG1lYW5pbmcgd2Ugd2FudCBhbmQgdGhlIHBhcmVudCBlbGVtZW50IGlzIG51bGwsIG1lYW5pbmcgd2Ugd2FudCB0bwotICAgIC8vICAgY3JlYXRlIGEgYnJhbmQgbmV3IG1vZGVsIGFuZCBtYWtlIHRoaXMgYmVhbiBpdHMgcm9vdAotICAgIC8vMi4gVGhlIG1vZGVsIGlzIG51bGwgYnV0IHRoZSBwYXJlbnRFbGVtZW50IGlzIG5vdCwgbWVhbmluZyB3ZSB3YW50IHRvIGFkZCB0aGUgQmVhbiB0byB0aGUKLSAgICAvLyAgIGdpdmVuIHBhcmVudCBlbGVtZW50Ci0gICAgLy8zLiBUaGUgbW9kZWwgaXMgbm90IG51bGwgaG93ZXZlciB0aGUgcGFyZW50RWxlbWVudCBpcywgbWVhbmluZyB3ZSB3YW50IHRvIGFkZCB0aGlzIEJlYW4gdG8KLSAgICAvLyAgIFRoaXMgbW9kZWwgYnV0IGRvbnQgYXR0YWNoIGl0IHRvIGFueXRoaW5nCi0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0KLSAgICAgIGlmKG1vZGVsID09IG51bGwgJiYgcGFyZW50RWxlbWVudCA9PSBudWxsKXsKLSAgICAgICAgIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbiBiZWFuVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24oY2xpZW50UHJvamVjdCxtZXRob2RzLCBlbnYpOwotICAgICAgICAgLy9iZWFuVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0JICAgICBKYXZhTW9mQmVhblZpc2l0b3IgYmVhblZpc2l0b3IgPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yKCk7Ci0gICAgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLSAgICAgICAgIC8vCi0gICAgICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgICAgewotICAgICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIAkKLSAgICAgICAgIH0KLSAgICAgICAgIC8vCi0gICAgICAgICBtb2RlbCA9IGJlYW5WaXNpdG9yQWN0aW9uLmdldE1vZGVsKCk7Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1vZGVsID09IG51bGwgJiYgcGFyZW50RWxlbWVudCAhPSBudWxsKXsKLSAgICAgICAgIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbiBiZWFuVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24ocGFyZW50RWxlbWVudCxjbGllbnRQcm9qZWN0LCBlbnYpOwotICAgICAgICAgLy9iZWFuVmlzaXRvckFjdGlvbi5zZXRTdGF0dXNNb25pdG9yKGdldFN0YXR1c01vbml0b3IoKSk7Ci0JICAgICBKYXZhTW9mQmVhblZpc2l0b3IgYmVhblZpc2l0b3IgPSBuZXcgSmF2YU1vZkJlYW5WaXNpdG9yKCk7Ci0gICAgICAgICBzdGF0dXMgPSBiZWFuVmlzaXRvci5ydW4oamF2YUNsYXNzLGJlYW5WaXNpdG9yQWN0aW9uKTsKLSAgICAgICAgIC8vCi0gICAgICAgICBpbnQgc2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5FUlJPUikKLSAgICAgICAgIAlyZXR1cm4gc3RhdHVzOwotICAgICAgICAgCi0gICAgICAgICBpZiAoc2V2ZXJpdHk9PVN0YXR1cy5XQVJOSU5HKQotICAgICAgICAgewotICAgICAgICAgICBDaG9pY2UgcmVzdWx0ID0gZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnQoc3RhdHVzLCBuZXcgQ2hvaWNlW117T0tDaG9pY2UsIENhbmNlbENob2ljZX0pOwotICAgICAgICAgICBpZiAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKENhbmNlbENob2ljZS5nZXRMYWJlbCgpKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAJIC8vcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBzaW5jZSB0aGUgdXNlciBjYW5jZWxlZAotICAgICAgICAgICAJICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBTVBMRV9DUkVBVElPTl9DQU5DRUxFRCIpLCBTdGF0dXMuRVJST1IpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIAkKLSAgICAgICAgIH0KLSAgICAgICAgIC8vICAgICAgICAgCi0gICAgICAgICBtb2RlbCA9IGJlYW5WaXNpdG9yQWN0aW9uLmdldE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIEphdmFNb2ZCZWFuVmlzaXRvckFjdGlvbiBiZWFuVmlzaXRvckFjdGlvbiA9IG5ldyBKYXZhTW9mQmVhblZpc2l0b3JBY3Rpb24obW9kZWwsY2xpZW50UHJvamVjdCwgZW52KTsKLSAgICAgICAgIC8vYmVhblZpc2l0b3JBY3Rpb24uc2V0U3RhdHVzTW9uaXRvcihnZXRTdGF0dXNNb25pdG9yKCkpOwotCSAgICAgSmF2YU1vZkJlYW5WaXNpdG9yIGJlYW5WaXNpdG9yID0gbmV3IEphdmFNb2ZCZWFuVmlzaXRvcigpOwotICAgICAgICAgc3RhdHVzID0gYmVhblZpc2l0b3IucnVuKGphdmFDbGFzcyxiZWFuVmlzaXRvckFjdGlvbik7Ci0gICAgICAgICAvLwotICAgICAgICAgaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7IAotICAgICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuRVJST1IpCi0gICAgICAgICAJcmV0dXJuIHN0YXR1czsKLSAgICAgICAgIAotICAgICAgICAgaWYgKHNldmVyaXR5PT1TdGF0dXMuV0FSTklORykKLSAgICAgICAgIHsKLSAgICAgICAgICAgQ2hvaWNlIHJlc3VsdCA9IGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cywgbmV3IENob2ljZVtde09LQ2hvaWNlLCBDYW5jZWxDaG9pY2V9KTsKLSAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhDYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgCSAvL3JldHVybiBhbiBlcnJvciBzdGF0dXMgc2luY2UgdGhlIHVzZXIgY2FuY2VsZWQKLSAgICAgICAgICAgCSAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TQU1QTEVfQ1JFQVRJT05fQ0FOQ0VMRUQiKSwgU3RhdHVzLkVSUk9SKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICAJCi0gICAgICAgICB9Ci0gICAgICAgICAvLyAgICAgICAgIAotICAgICAgICAgbW9kZWwgPSBiZWFuVmlzaXRvckFjdGlvbi5nZXRNb2RlbCgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICogR2V0IHRoZSBqYXZhIG1vZGVsIGZyb20gdGhlIHJlc291cmNlIHRoZW4KLSAgKiBidWlsZCB0aGUgbW9kZWwgZnJvbSB0aGUgbW9mCi0gICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgICBpZihjbGllbnRQcm9qZWN0ID09IG51bGwpIHJldHVybiBzdGF0dXM7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoY2xpZW50UHJvamVjdCk7Ci0gICAgCi0gIAlzdGF0dXMgPSBjcmVhdGVKYXZhUmVmbGVjdGlvbihlbnYpOwotICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHRyeXsKLSAgICAgIHN0YXR1cyA9IGJ1aWxkTW9kZWxGcm9tTW9mKGVudik7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH1jYXRjaChDb3JlRXhjZXB0aW9uIGV4Yyl7Ci0gICAgICBJU3RhdHVzIGVtYmVkZGVkU3RhdHVzID0gZXhjLmdldFN0YXR1cygpOwotICAgICAgc3RhdHVzID0gRW52aXJvbm1lbnRVdGlscy5jb252ZXJ0SVN0YXR1c1RvU3RhdHVzKGVtYmVkZGVkU3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcykKLSAgewotICAJdGhpcy5tZXRob2RzID0gIG1ldGhvZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpCi0gIHsKLSAgCXRoaXMuY2xpZW50UHJvamVjdCA9IGNsaWVudFByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFBhcmVudEVsZW1lbnQoRWxlbWVudCBwYXJlbnRFbGVtZW50KQotICB7Ci0gIAl0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50OwotICB9Ci0gICAgIAotICBwdWJsaWMgdm9pZCBzZXRQcm94eUJlYW4oU3RyaW5nIHByb3h5QmVhbikKLSAgewotICAJdGhpcy5wcm94eUJlYW4gPSBwcm94eUJlYW47Ci0gIH0KLQotIH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbW9uL1NhbXBsZVByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi9zYW1wbGVhcHAvY29tbW9uL1NhbXBsZVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGY0YjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vc2FtcGxlYXBwL2NvbW1vbi9TYW1wbGVQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnNhbXBsZWFwcC5jb21tb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci0KLQotLyoqCi0qIE9iamVjdHMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBQcm9wZXJ0eURlc2NyaXB0b3IuCi0qICovCi1wdWJsaWMgY2xhc3MgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yIAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0KLSAgcHJpdmF0ZSBNZXRob2QgZlJlYWRNZXRob2Q7Ci0gIHByaXZhdGUgTWV0aG9kIGZXcml0ZU1ldGhvZDsKLSAgcHJpdmF0ZSBTdHJpbmcgZlByb3BlcnR5TmFtZTsKLSAgcHJpdmF0ZSBKYXZhSGVscGVycyBmUHJvcGVydHlUeXBlOyAKLSAgcHJpdmF0ZSBib29sZWFuIGZTdGF0aWM7Ci0gIAotICAvKgotICAqIENvbnN0cnVjdG9yCi0gICoqLwotICBwdWJsaWMgU2FtcGxlUHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBuYW1lKQotICB7Ci0gICAgZlByb3BlcnR5TmFtZSA9IG5hbWU7IAotICB9Ci0KLSAgLyoKLSAgKiBzZXQgdGhlIFJlYWRNZXRob2QKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVhZE1ldGhvZChNZXRob2QgcmVhZE1ldGhvZCkKLSAgewotICAgIGZSZWFkTWV0aG9kID0gcmVhZE1ldGhvZDsKLSAgfQotCi0gICAvKgotICAqIGdldCB0aGUgUmVhZE1ldGhvZCAKLSAgKi8KLSAgcHVibGljIE1ldGhvZCBnZXRSZWFkTWV0aG9kKCkKLSAgewotICAgIHJldHVybiBmUmVhZE1ldGhvZDsKLSAgfQotCi0gIC8qCi0gICogc2V0IHRoZSB3cml0ZU1ldGhvZAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRXcml0ZU1ldGhvZChNZXRob2Qgd3JpdGVNZXRob2QpCi0gIHsKLSAgICBmV3JpdGVNZXRob2QgPSB3cml0ZU1ldGhvZDsKLSAgfQotCi0gICAvKgotICAqIGdldCB0aGUgd3JpdGVNZXRob2QgCi0gICovCi0gIHB1YmxpYyBNZXRob2QgZ2V0V3JpdGVNZXRob2QoKQotICB7Ci0gICAgcmV0dXJuIGZXcml0ZU1ldGhvZDsKLSAgfQotCi0gIC8qCi0gICogc2V0IHRoZSBwcm9wZXJ0eU5hbWUKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGZQcm9wZXJ0eU5hbWU9IG5hbWU7Ci0gIH0KLQotICAgLyoKLSAgKiBnZXQgdGhlIHByb3BlcnR5TmFtZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZQcm9wZXJ0eU5hbWU7Ci0gIH0KLQotICAvKgotICAqIHNldCB0aGUgUHJvcGVydHlUeXBlCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VHlwZShKYXZhSGVscGVycyBwcm9wZXJ0eVR5cGUpCi0gIHsKLSAgICBmUHJvcGVydHlUeXBlID0gcHJvcGVydHlUeXBlOwotICB9Ci0KLSAgIC8qCi0gICogZ2V0IHRoZSBQcm9wZXJ0eVR5cGUgCi0gICovCi0gIHB1YmxpYyBKYXZhSGVscGVycyBnZXRQcm9wZXJ0eVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGZQcm9wZXJ0eVR5cGU7Ci0gIH0KLSAgICAgIAotICBwdWJsaWMgYm9vbGVhbiBpc2ZTdGF0aWMoKQotICB7Ci0gIAlyZXR1cm4gZlN0YXRpYzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldGZTdGF0aWMoYm9vbGVhbiBmU3RhdGljKQotICB7Ci0gICAgdGhpcy5mU3RhdGljID0gZlN0YXRpYzsJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvSVdTRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL0lXU0ZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE3ZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvSVdTRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdTRmluZGVyCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKLSAgcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKTsKLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzYyk7Ci0KLSAgcHVibGljIExpc3QgZmluZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9MaXZlV1NETEZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9MaXZlV1NETEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGIxZjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvTGl2ZVdTRExGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLndzZmluZGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTGl2ZVdTRExGaWx0ZXIgZXh0ZW5kcyBUaHJlYWQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSTF87Ci0gIHByaXZhdGUgYm9vbGVhbiBmaW5pc2hfOwotICBwcml2YXRlIGJvb2xlYW4gbGl2ZV87Ci0KLSAgcHVibGljIExpdmVXU0RMRmlsdGVyKFN0cmluZyB3c2RsVVJMKQotICB7Ci0gICAgd3NkbFVSTF8gPSB3c2RsVVJMOwotICAgIGZpbmlzaF8gPSBmYWxzZTsKLSAgICBsaXZlXyA9IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMVVJMKCkKLSAgewotICAgIHJldHVybiB3c2RsVVJMXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRmluaXNoKCkKLSAgewotICAgIHJldHVybiBmaW5pc2hfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNXU0RMTGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gbGl2ZV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbGl2ZV8gPSB2YWxpZGF0ZVdTREwoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIGxpdmVfID0gZmFsc2U7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBmaW5pc2hfID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVXU0RMKCkgdGhyb3dzIFdTRExFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uCi0gIHsKLSAgCVdlYlNlcnZpY2VzUGFyc2VyRXh0IHBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcGFyc2VyLmdldFdTRExEZWZpbml0aW9uVmVyYm9zZSh3c2RsVVJMXyk7Ci0gICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgIEl0ZXJhdG9yIHNlcnZpY2VJdGVyYXRvciA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2Upc2VydmljZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIE1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgIEl0ZXJhdG9yIHBvcnRJdGVyYXRvciA9IHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAocG9ydEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpcG9ydEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBwb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBJdGVyYXRvciBleHRlbnNpYmlsaXR5RWxlbWVudHNJdGVyYXRvciA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0ZW5zaWJpbGl0eUVsZW1lbnRzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgIGlmICgoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgfHwgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL1dTRmluZGVyQ29tbW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL1dTRmluZGVyQ29tbW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYzFjYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi93c2ZpbmRlci9XU0ZpbmRlckNvbW1vbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24ud3NmaW5kZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5FSkJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSUVKQk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LklXZWJOYXR1cmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSjJFRVdlYk5hdHVyZVJ1bnRpbWU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0ZpbmRlckNvbW1vbiBpbXBsZW1lbnRzIElXU0ZpbmRlcgotewotICBwcml2YXRlIFN0cmluZyBpZF87Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVfOwotICBwcml2YXRlIFN0cmluZyBkZXNjXzsKLQotICBwdWJsaWMgV1NGaW5kZXJDb21tb24oKQotICB7Ci0gICAgaWRfID0gbnVsbDsKLSAgICBuYW1lXyA9IG51bGw7Ci0gICAgZGVzY18gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJRCgpCi0gIHsKLSAgICByZXR1cm4gaWRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKQotICB7Ci0gICAgaWRfID0gaWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIG5hbWVfID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIGRlc2NfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpCi0gIHsKLSAgICBkZXNjXyA9IGRlc2M7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVByb2plY3RbXSBnZXRXb3Jrc3BhY2VQcm9qZWN0cygpCi0gIHsKLSAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICByZXR1cm4gcm9vdC5nZXRQcm9qZWN0cygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEoyRUVXZWJOYXR1cmVSdW50aW1lIGdldFdlYk5hdHVyZShJUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVByb2plY3ROYXR1cmUgbmF0dXJlID0gcHJvamVjdC5nZXROYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCk7Ci0gICAgICBpZiAobmF0dXJlICE9IG51bGwgJiYgbmF0dXJlIGluc3RhbmNlb2YgSjJFRVdlYk5hdHVyZVJ1bnRpbWUpCi0gICAgICAgIHJldHVybiAoSjJFRVdlYk5hdHVyZVJ1bnRpbWUpbmF0dXJlOwotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVKQk5hdHVyZVJ1bnRpbWUgZ2V0RUpCTmF0dXJlKElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUHJvamVjdE5hdHVyZSBuYXR1cmUgPSBwcm9qZWN0LmdldE5hdHVyZShJRUpCTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCk7Ci0gICAgICBpZiAobmF0dXJlICE9IG51bGwgJiYgbmF0dXJlIGluc3RhbmNlb2YgRUpCTmF0dXJlUnVudGltZSkKLSAgICAgICAgcmV0dXJuIChFSkJOYXR1cmVSdW50aW1lKW5hdHVyZTsKLSAgICB9Ci0gICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBJRm9sZGVyIGdldEZvbGRlclJvb3RQdWJsaXNoYWJsZShKMkVFV2ViTmF0dXJlUnVudGltZSB3ZWJOYXR1cmUpCi0gIHsKLSAgICByZXR1cm4gKElGb2xkZXIpd2ViTmF0dXJlLmdldFJvb3RQdWJsaXNoYWJsZUZvbGRlcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGb2xkZXIgZ2V0Rm9sZGVyV0VCSU5GKEoyRUVXZWJOYXR1cmVSdW50aW1lIHdlYk5hdHVyZSkKLSAgewotICAgIHJldHVybiB3ZWJOYXR1cmUuZ2V0UHJvamVjdCgpLmdldEZvbGRlcih3ZWJOYXR1cmUuZ2V0V0VCSU5GUGF0aCgpLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElGb2xkZXIgZ2V0Rm9sZGVyTUVUQUlORihFSkJOYXR1cmVSdW50aW1lIGVqYk5hdHVyZSkKLSAgewotICAgIHJldHVybiBlamJOYXR1cmUuZ2V0TWV0YUZvbGRlcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3dzZmluZGVyL1dTRmluZGVyUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvV1NGaW5kZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQ3YzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vd3NmaW5kZXIvV1NGaW5kZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIFdTRmluZGVyUmVnaXN0cnkKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgV1NGaW5kZXJSZWdpc3RyeSBpbnN0YW5jZV87Ci0gIHByaXZhdGUgVmVjdG9yIHdzZmluZGVyc187Ci0KLSAgcHJpdmF0ZSBXU0ZpbmRlclJlZ2lzdHJ5KCkKLSAgewotICAgIHdzZmluZGVyc18gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgKiBAcmV0dXJuIEEgc2luZ2xldG9uIFdTRmluZGVyUmVnaXN0cnkgb2JqZWN0LgotICAqLwotICBwdWJsaWMgc3RhdGljIFdTRmluZGVyUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlXyA9IG5ldyBXU0ZpbmRlclJlZ2lzdHJ5KCk7Ci0gICAgICBpbnN0YW5jZV8uaW5pdCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IHBsdWdpblJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiIsICJ3c2ZpbmRlciIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBjb25maWdFbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVdTRmluZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgSVdTRmluZGVyIHdzZmluZGVyID0gKElXU0ZpbmRlcilvYmplY3Q7Ci0gICAgICAgICAgd3NmaW5kZXIuc2V0SUQoY29uZmlnRWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLSAgICAgICAgICB3c2ZpbmRlci5zZXROYW1lKGNvbmZpZ0VsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICAgICAgICB3c2ZpbmRlci5zZXREZXNjcmlwdGlvbihjb25maWdFbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIikpOwotICAgICAgICAgIHdzZmluZGVyc18uYWRkKHdzZmluZGVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0V1NGaW5kZXJzKCkKLSAgewotICAgIHJldHVybiB3c2ZpbmRlcnNfOwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRXZWJTZXJ2aWNlcygpCi0gIHsKLSAgICBMaXN0IHdzID0gbmV3IFZlY3RvcigpOwotICAgIExpc3Qgd3NGaW5kZXJzID0gZ2V0V1NGaW5kZXJzKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHdzRmluZGVycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIElXU0ZpbmRlciB3c0ZpbmRlciA9IChJV1NGaW5kZXIpaXQubmV4dCgpOwotICAgICAgd3MuYWRkQWxsKHdzRmluZGVyLmZpbmQoKSk7Ci0gICAgfQotICAgIHJldHVybiB3czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL0RvbUVsZW1lbnRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Eb21FbGVtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MWNkZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL0RvbUVsZW1lbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnV0aWw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERvbUVsZW1lbnRIZWxwZXIgewotCi0KLSAgcHVibGljIHN0YXRpYyBvcmcudzNjLmRvbS5FbGVtZW50IGNyZWF0ZURvbUVsZW1lbnRGcm9tWE1MU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgeG1sU3RyaW5nICkKLSAgewotICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHN0cmluZ1JlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcih4bWxTdHJpbmcpOyAKLSAgICBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZShzdHJpbmdSZWFkZXIpOyAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY0J1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkb2NCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jQnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZG9tV3JpdGVyKG9yZy53M2MuZG9tLk5vZGUgbm9kZSxqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgIGlmICggbm9kZSA9PSBudWxsICkgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLQlpbnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQlzd2l0Y2ggKCB0eXBlICkgewotCSAgY2FzZSBvcmcudzNjLmRvbS5Ob2RlLkRPQ1VNRU5UX05PREU6IHsKLQkgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKSArICI8YnI+Iik7Ci0JICBkb21Xcml0ZXIoKChvcmcudzNjLmRvbS5Eb2N1bWVudClub2RlKS5nZXREb2N1bWVudEVsZW1lbnQoKSxidWZmZXIpOwotCSAgYnJlYWs7Ci0JfQotCSAgY2FzZSBvcmcudzNjLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERTogewotCSAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIjwiICsgbm9kZS5nZXROb2RlTmFtZSgpKSk7Ci0JICBvcmcudzNjLmRvbS5BdHRyIGF0dHJzW10gPSBzb3J0QXR0cmlidXRlcyhub2RlLmdldEF0dHJpYnV0ZXMoKSk7Ci0JICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKyApIHsKLQkgICAgb3JnLnczYy5kb20uQXR0ciBhdHRyID0gYXR0cnNbaV07Ci0JICAgIGJ1ZmZlci5hcHBlbmQoIiAiICsgYXR0ci5nZXROb2RlTmFtZSgpICsgIj1cIiIgKyBKc3BVdGlscy5tYXJrdXAoYXR0ci5nZXROb2RlVmFsdWUoKSkgKyAiXCIiKTsKLQkgIH0KLQkgICAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIj4iKSk7Ci0JICAgIG9yZy53M2MuZG9tLk5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JICAgIGlmICggY2hpbGRyZW4gIT0gbnVsbCApIHsKLQkgICAgICBpbnQgbGVuID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCSAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0JCSAgICBpZigoKG9yZy53M2MuZG9tLk5vZGUpY2hpbGRyZW4uaXRlbShpKSkuZ2V0Tm9kZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERSkKLQkJCSAgYnVmZmVyLmFwcGVuZCgiPGJyPiIpOwotCQkJZG9tV3JpdGVyKGNoaWxkcmVuLml0ZW0oaSksYnVmZmVyKTsKLQkJICB9Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAoIjwvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IikpOwotCQlicmVhazsKLSAgICAgIH0KLQkgIGNhc2Ugb3JnLnczYy5kb20uTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREU6IHsKLQkgICAgb3JnLnczYy5kb20uTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkgICAgaWYgKCBjaGlsZHJlbiAhPSBudWxsICkgewotCQkgIGludCBsZW4gPSBjaGlsZHJlbi5nZXRMZW5ndGgoKTsKLQkJICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApCi0JICAgICAgewotCQkgICAgYnVmZmVyLmFwcGVuZChjaGlsZHJlbi5pdGVtKGkpKTsKLQkJICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICB9Ci0JICBjYXNlIG9yZy53M2MuZG9tLk5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFOiB7Ci0JICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKTsKLQkgICAgYnJlYWs7Ci0gICAgICB9Ci0JICBjYXNlIG9yZy53M2MuZG9tLk5vZGUuVEVYVF9OT0RFOnsKLQkgICAgYnVmZmVyLmFwcGVuZChKc3BVdGlscy5tYXJrdXAobm9kZS5nZXROb2RlVmFsdWUoKSkpOwotCSAgICBicmVhazsKLQkgIH0KLQkgIGNhc2Ugb3JnLnczYy5kb20uTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6ewotCQlidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgiPD8iKSk7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJU3RyaW5nIGRhdGEgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQlpZiAoIGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCApewotCSAgICAgIGJ1ZmZlci5hcHBlbmQoIiAiKTsKLQkJICBidWZmZXIuYXBwZW5kKGRhdGEpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI/PiIpKTsKLQkJICBicmVhazsKLQkJfQotCSAgfQotCSAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICAgIH0KLSAKLQlwdWJsaWMgc3RhdGljIG9yZy53M2MuZG9tLkF0dHJbXSBzb3J0QXR0cmlidXRlcyhvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAgYXR0cnMpCi0JewotCSAgaW50IGxlbiA9IChhdHRycyAhPSBudWxsKSA/IGF0dHJzLmdldExlbmd0aCgpIDogMDsKLQkgIG9yZy53M2MuZG9tLkF0dHIgYXJyYXlbXSA9IG5ldyBvcmcudzNjLmRvbS5BdHRyW2xlbl07Ci0JICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKyApewotCSAgIGFycmF5W2ldID0gKG9yZy53M2MuZG9tLkF0dHIpYXR0cnMuaXRlbShpKTsKLQkgIH0KLQkgIGZvciAoIGludCBpID0gMDsgaSA8IGxlbiAtIDE7IGkrKyApIHsKLQkgICAgU3RyaW5nIG5hbWUgID0gYXJyYXlbaV0uZ2V0Tm9kZU5hbWUoKTsKLQkgICAgaW50IGluZGV4ID0gaTsKLQkgICAgZm9yICggaW50IGogPSBpICsgMTsgaiA8IGxlbjsgaisrICkgewotCSAgICAgIFN0cmluZyBjdXJOYW1lID0gYXJyYXlbal0uZ2V0Tm9kZU5hbWUoKTsKLQkJICBpZiAoIGN1ck5hbWUuY29tcGFyZVRvKG5hbWUpIDwgMCApIHsKLQkJICAgIG5hbWUgID0gY3VyTmFtZTsKLQkJCWluZGV4ID0gajsKLQkJICB9Ci0JCX0KLQkJaWYgKCBpbmRleCAhPSBpICkgewotCQkgIG9yZy53M2MuZG9tLkF0dHIgdGVtcCA9IGFycmF5W2ldOwotCQkgIGFycmF5W2ldID0gYXJyYXlbaW5kZXhdOwotCQkgIGFycmF5W2luZGV4XSA9IHRlbXA7Ci0JCX0KLQkgIH0KLQkgIHJldHVybiAoYXJyYXkpOwotICAgIH0KLSAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL0pzcFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvSnNwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiOTAxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvSnNwVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEpzcFV0aWxzIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXJrdXAoU3RyaW5nIHRleHQpIHsKLQkJCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJY2hhciBjID0gdGV4dC5jaGFyQXQoaSk7Ci0JCQkJc3dpdGNoIChjKSB7Ci0JCQkJCWNhc2UgJzwnOgotCQkJCQkJYnVmZmVyLmFwcGVuZCgiJmx0OyIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJyYnOgotCQkJCQkJYnVmZmVyLmFwcGVuZCgiJmFtcDsiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICc+JzoKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiZndDsiKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlICciJzoKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoIiZxdW90OyIpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL1NvYXBFbGVtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODUxOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL1NvYXBFbGVtZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBnaWxiZXJ0YQotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTb2FwRWxlbWVudEhlbHBlciB7Ci0vKgotICogVGhpcyBjbGFzcyBpcyBiZWluZyBndXR0ZWQgZm9yIHRoZSBtb21lbnQsCi0gKiB1bnRpbCBhIG1lYW5zIGZvciBpbmNsdWRpbmcgc2Fhai5qYXIgb3IgYW4KLSAqIGVxdWl2YWxlbnQga2VlcGVyIG9mIHRoZSBqYXZheC54bWwuc29hcCBwYWNrYWdlCi0gKiBjYW4gYmUgZGV0ZXJtaW5lZC4gVGhlIGRpc2FibGluZyBvZiB0aGlzIGNsYXNzCi0gKiB3aWxsIG9ubHkgY2F1c2UgcHJvYmxlbXMgaWYgU2FtcGxlIEpTUHMgYXJlCi0gKiBnZW5lcmF0ZWQgZm9yIFdlYiBTZXJ2aWNlIHByb3hpZXMgdGhhdCBoYXZlCi0gKiBTT0FQRWxlbWVudHMgb24gdGhlaXIgaW50ZXJmYWNlcy4KLSAqIAotICBwdWJsaWMgc3RhdGljIGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50IGNyZWF0ZVNPQVBFbGVtZW50RnJvbVhNTFN0cmluZyhTdHJpbmcgeG1sU3RyaW5nKSB0aHJvd3MgU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgU29hcEVsZW1lbnRSdW50aW1lRXhjZXB0aW9uKCJTb2FwRWxlbWVudCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzYW1wbGUgb24gdGhlIGN1cnJlbnQgcnVudGltZS4gUGxlYXNlIHVzZSBXZWJTcGhlcmUgdjUuMSBvciBoaWdoZXIuIik7ICAgIAotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIHNvYXBFbGVtZW50V3JpdGVyKGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50IG5vZGUsamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBidWZmZXIpCi0gIHsKLSAgICBpZiAobm9kZSA9PSBudWxsICkgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICAKLSAgICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI8IiArIG5vZGUuZ2V0RWxlbWVudE5hbWUoKS5nZXRMb2NhbE5hbWUoKSkpOwotICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGF0dHJzID0gbm9kZS5nZXRBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICB3aGlsZShhdHRycy5oYXNOZXh0KCkpIHsKLSAgICAgICAgamF2YXgueG1sLnNvYXAuTmFtZSBhdHRyID0gKGphdmF4LnhtbC5zb2FwLk5hbWUpYXR0cnMubmV4dCgpOwotICAgICAgICBidWZmZXIuYXBwZW5kKCIgIiArIGF0dHIuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIj1cIiIgKyBKc3BVdGlscy5tYXJrdXAobm9kZS5nZXRBdHRyaWJ1dGVWYWx1ZShhdHRyKSkgKyAiXCIiKTsKLSAgICAgIH0KLSAgICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI+IikpOwotICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZEVsZW1lbnRzKCk7Ci0gICAgICBpZiAoIGNoaWxkcmVuICE9IG51bGwgKSB7Ci0gICAgICAgIHdoaWxlKGNoaWxkcmVuLmhhc05leHQoKSl7Ci0gICAgICAgICAgamF2YXgueG1sLnNvYXAuTm9kZSBjaGlsZE5vZGUgPSAoamF2YXgueG1sLnNvYXAuTm9kZSljaGlsZHJlbi5uZXh0KCk7Ci0gICAgICAgICAgaWYoY2hpbGROb2RlIGluc3RhbmNlb2YgamF2YXgueG1sLnNvYXAuU09BUEVsZW1lbnQpewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiPGJyPiIpOwotICAgICAgICAgICAgc29hcEVsZW1lbnRXcml0ZXIoKGphdmF4LnhtbC5zb2FwLlNPQVBFbGVtZW50KWNoaWxkTm9kZSxidWZmZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKEpzcFV0aWxzLm1hcmt1cCgoKGphdmF4LnhtbC5zb2FwLlRleHQpY2hpbGROb2RlKS5nZXRWYWx1ZSgpKSk7IAotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoSnNwVXRpbHMubWFya3VwKCI8LyIgKyBub2RlLmdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxOYW1lKCkgKyAiPiIpKTsKLQkgIH0KLSAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0qLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL1NvYXBFbGVtZW50UnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL1NvYXBFbGVtZW50UnVudGltZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM1ZWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNvYXBFbGVtZW50UnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiAgewotCi0gIC8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzc2MTY5MzM3MjY3NDc0ODQ3MUw7Ci0KLXB1YmxpYyBTb2FwRWxlbWVudFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICB9Ci0gIAotICAKLSAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDIzNDYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2Q4NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi5lamIudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWksCi0gb3JnLmVjbGlwc2UudWkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTBhOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICoucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2ZlNjU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBDcmVhdGlvbiBFSkIgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotIwotIyBXZWIgc2VydmljZSB0eXBlcwotIwotV0VCU0VSVklDRVRZUEVfTkFNRV9FSkJfVFA9RUpCIFdlYiBTZXJ2aWNlCi1XRUJTRVJWSUNFVFlQRV9OQU1FX1dTRExfRUpCX1RQPVNrZWxldG9uIEVKQiBXZWIgU2VydmljZQotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1BQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0U9Q3JlYXRlIFdlYiBzZXJ2aWNlCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLmVqYi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwN2M0MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICAgPCEtLSBFSkIgV2ViIFNlcnZpY2UgVHlwZXMgLS0+Ci08IS0tICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZSI+Ci0KLSAgICAgIDx3ZWJTZXJ2aWNlVHlwZQotICAgICAgICAgICAgbGFiZWw9IiVXRUJTRVJWSUNFVFlQRV9OQU1FX1dTRExfRUpCX1RQIgotICAgICAgICAgICAgcmVzb3VyY2VUeXBlTWV0YWRhdGE9IkZpbGUgSVJlc291cmNlIgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii53c2RsIgotICAgICAgICAgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuV1NETFNlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIGluY2x1ZGVOYXR1cmVzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIgotICAgICAgICAgICAgZXhjbHVkZU5hdHVyZXM9IiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudHlwZS53c2RsLmVqYiI+Ci0gICAgICA8L3dlYlNlcnZpY2VUeXBlPgotCi0gICAgICA8d2ViU2VydmljZVR5cGUKLQkJICAgIGxhYmVsPSIlV0VCU0VSVklDRVRZUEVfTkFNRV9FSkJfVFAiCi0JCSAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRUpCT2JqZWN0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiBTZXNzaW9uSW1wbCIKLQkJICAgIGV4dGVuc2lvbk1ldGFkYXRhPSIuamF2YSAuY2xhc3MgLlNlc3Npb25JbXBsIgotCQkgICAgb2JqZWN0U2VsZWN0aW9uV2lkZ2V0PSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuRUpCU2VsZWN0aW9uV2lkZ2V0IgotCQkgICAgaW5jbHVkZU5hdHVyZXM9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiCi0JCSAgICBleGNsdWRlTmF0dXJlcz0iIgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50eXBlLmVqYiI+Ci0gIAkgPC93ZWJTZXJ2aWNlVHlwZT4KLQk8L2V4dGVuc2lvbj4KLS0tPgotCi0gICA8IS0tIFBvcHVwcyAtLT4KLSAgICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LmVqYi5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotCi08IS0tIEVKQiBzdHVmZiAtLT4KLSAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndzSW1wbCI+Ci0gICAgIDx3ZWJTZXJ2aWNlSW1wbAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuZWpiIgotICAgICAgICAgICAgbGFiZWw9IiVXRUJTRVJWSUNFVFlQRV9OQU1FX0VKQl9UUCIKLSAgICAgICAgICAgIHJlc291cmNlVHlwZU1ldGFkYXRhPSJFSkJPYmplY3Qgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIFNlc3Npb25JbXBsIgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyAuU2Vzc2lvbkltcGwiCi0gICAgICAgICAgICBvYmplY3RTZWxlY3Rpb25XaWRnZXQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5FSkJTZWxlY3Rpb25XaWRnZXQiPgotICAgICA8L3dlYlNlcnZpY2VJbXBsPgotICAgIDwvZXh0ZW5zaW9uPiAgICAKLSAgICAKLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5zZXJ2aWNlVHlwZSI+Ci0gIDxzZXJ2aWNlVHlwZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5zZXJ2aWNlVHlwZS5lamIiCi0gICAgICAgICAgICBpbXBsSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy53c0ltcGwuZWpiIgotICAgICAgICAgICAgYnVNb2R1bGVUeXBlc0luY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiCi0gICAgICAgICAgICBidU1vZHVsZVR5cGVzRXhjbHVkZT0iIgotICAgICAgICAgICAgdGRNb2R1bGVUeXBlc0luY2x1ZGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJOYXR1cmUiCi0gICAgICAgICAgICB0ZE1vZHVsZVR5cGVzRXhjbHVkZT0iIj4KLSAgPC9zZXJ2aWNlVHlwZT4KLTwvZXh0ZW5zaW9uPiAgIAotCi0gICAgICAgICAgICAKLSAgIAotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViYmRjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzcy11aS5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDU0ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb248L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLnVpPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTgzNDM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB3c3MtdWkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWksCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5iaW5kaW5nLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMudGVzdAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwsCi0gb3JnLmVjbGlwc2Uud3N0LndzLAotIG9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLAotIG9yZy5lY2xpcHNlLmpzdC53cy51aSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWksCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIsCi0gb3JnLndzZGw0agotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDcyYmUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2Uud3NzLXVpLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHdzcy11aS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2V4cG9ydF93cy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQ0ZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2V4cG9ydF93cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9leHBvcnRfd3Nfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2V4cG9ydF93c193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGZjZDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2V4cG9ydF93c193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld193ZWJzZXJ2X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3X3dlYnNlcnZfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3MzdmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3X3dlYnNlcnZfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQxZjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTI0NzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIENyZWF0aW9uIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUz1XZWIgU2VydmljZXMKLVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfU0VSVklDRT1XZWIgU2VydmljZQotUExVR0lOX0VYUE9SVF9XSVpBUkRfTkFNRV9XUz1XZWIgU2VydmljZQotUExVR0lOX05FV19XSVpBUkRfREVTQ19XU19TRVJWSUNFPUNyZWF0ZSBhIG5ldyBYTUwgd2ViIHNlcnZpY2UuCi1QTFVHSU5fRVhQT1JUX1dJWkFSRF9ERVNDX1dTPUEgd2l6YXJkIGZvciBleHBvcnRpbmcgYSB3ZWIgc2VydmljZS4KLQotIwotIwlXZWIgU2VydmljZXMgUHJlZmVyYW5jZSBQYWdlcwotIwotIyBEaWFsb2dzCi1DSEVDS0JPWF9TSE9XX0RFUExPWV9XRUJfU0VSVklDRV9ESUFMT0c9SGlkZSBDcmVhdGUgV2ViIHNlcnZpY2UgRGlhbG9nCi1DSEVDS0JPWF9TSE9XX0dFTkVSQVRFX1NLRUxFVE9OX0RJQUxPRz1IaWRlIEdlbmVyYXRlIEphdmEgQmVhbiBTa2VsZXRvbiBEaWFsb2cKLUNIRUNLQk9YX1NIT1dfR0VORVJBVEVfV1NETF9GSUxFU19ESUFMT0c9SGlkZSBHZW5lcmF0ZSBXU0RMIEZpbGVzIERpYWxvZwotQ0hFQ0tCT1hfU0hPV19QVUJMSVNIX1dTRExfRElBTE9HPUhpZGUgUHVibGlzaCBXU0RMIERpYWxvZwotCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1NDRU5BUklPX0RFRkFVTFRTPVNjZW5hcmlvIERlZmF1bHRzCi0KLQotIwotIyBQcmVmZXJlbmNlcyBUb29sdGlwcwotIwotI0FjdGlvbiBEaWFsb2dzCi1UT09MVElQX1BQQURfQ0hFQ0tCT1hfREVQTE9ZPUhpZGVzIHRoZSBkaWFsb2cgZm9yIGRlcGxveWluZyBhIFdlYiBzZXJ2aWNlIGFjdGlvbgotVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1NLRUxFVE9OPUhpZGVzIHRoZSBkaWFsb2cgZm9yIGdlbmVyYXRpbmcgSmF2YSBiZWFuIFNrZWxldG9uIGFjdGlvbgotVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1dTREw9SGlkZXMgdGhlIGRpYWxvZyBmb3IgZ2VuZXJhdGluZyBXU0RMIGZpbGVzIGFjdGlvbgotVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1BVQkxJU0g9SGlkZXMgdGhlIGRpYWxvZyBmb3IgcHVibGlzaGluZyB0aGUgV1NETCBhY3Rpb24KLQotIwotIyBQb3AtdXAgYWN0aW9ucwotIwotQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFPUNyZWF0ZSBXZWIgc2VydmljZQotQUNUSU9OX0dFTkVSQVRFX0pBVkFfU0tFTEVUT049R2VuZXJhdGUgSmF2YSBiZWFuIHNrZWxldG9uCi1BQ1RJT05fUFVCTElTSF9XU0RMPVB1Ymxpc2ggV1NETCBmaWxlCi0KLSMKLSMgV2l6YXJkcy4KLSMKLVdJWkFSRF9USVRMRV9XU1M9V2ViIFNlcnZpY2UKLQotCi0jCi0jIFBvcC11cCBhY3Rpb25zCi0jCi1BQ1RJT05fREVQTE9ZX1dFQlNFUlZJQ0U9Q3JlYXRlIFdlYiBzZXJ2aWNlCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzkyZDExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgICA8IS0tIFdpemFyZHMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19TRVJWSUNFIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld193ZWJzZXJ2X3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVQTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX1NFUlZJQ0UKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiPgotICAgICAgPGR5bmFtaWNXaXphcmQKLSAgICAgICAgICAgIGljb25iYW5uZXI9Imljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzX3dpei5naWYiCi0gICAgICAgICAgICB0aXRsZT0iJVdJWkFSRF9USVRMRV9XU1MiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZy5TZXJ2ZXJXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgIDwvZHluYW1pY1dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX0VYUE9SVF9XSVpBUkRfTkFNRV9XUyIKLSAgICAgICAgICAgIGljb249Imljb25zL2V4cG9ydF93cy5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCIKLSAgICAgICAgICAgIGlkPSJ3c2V4cG9ydCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlUExVR0lOX0VYUE9SVF9XSVpBUkRfREVTQ19XUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvZXhwb3J0X3dzX3dpei5naWYiCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX0VYUE9SVF9XSVpBUkRfTkFNRV9XUyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkV4cG9ydFdTV2lkZ2V0QmluZGluZyIKLSAgICAgICAgICAgIGlkPSJ3c2V4cG9ydCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5keW5hbWljV2l6YXJkIj4KLSAgICAgIDxkeW5hbWljV2l6YXJkCi0gICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9leHBvcnRfd3Nfd2l6LmdpZiIKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fRVhQT1JUX1dJWkFSRF9OQU1FX1dTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLmJpbmRpbmcuRXhwb3J0V1NXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICA8L2R5bmFtaWNXaXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSAiRG9uJ3QgU2hvdyBNZSIgUHJlZmVyZW5jZXMgLS0+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUiPgotCi0gICAgICA8YWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUKLSAgICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX0RFUExPWV9XRUJfU0VSVklDRV9ESUFMT0ciCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX0RFUExPWSIKLSAgICAgICAgICAgIGluZm9wb3A9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS5QUEFEMDAwNiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3NzLnBvcHVwLmNhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLmphdmEiPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19HRU5FUkFURV9TS0VMRVRPTl9ESUFMT0ciCi0gICAgICAgICAgICB0b29sdGlwPSIlVE9PTFRJUF9QUEFEX0NIRUNLQk9YX1NLRUxFVE9OIgotICAgICAgICAgICAgaW5mb3BvcD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLlBQQUQwMDA4IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgPC9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZT4KLQotICAgICAgPGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gICAgICAgICAgICBuYW1lPSIlQ0hFQ0tCT1hfU0hPV19QVUJMSVNIX1dTRExfRElBTE9HIgotICAgICAgICAgICAgdG9vbHRpcD0iJVRPT0xUSVBfUFBBRF9DSEVDS0JPWF9QVUJMSVNIIgotICAgICAgICAgICAgaW5mb3BvcD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLlBQQUQwMDA5IgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5wdWJsaXNoIj4KLSAgICAgIDwvYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGU+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8IS0tIFBvcHVwcyAtLT4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLmphdmEiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzZGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkLnNrZWxldG9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfU0tFTEVUT04iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9HRU5FUkFURV9KQVZBX1NLRUxFVE9OIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0RFUExPWV9XRUJTRVJWSUNFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluayIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuamF2YSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9ERVBMT1lfV0VCU0VSVklDRSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgIAotICAgICAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzaWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQuc2tlbGV0b24iPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9TS0VMRVRPTiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJUFDVElPTl9QVUJMSVNIX1dTREwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkud2Vic2VydmljZS5jYXRlZ29yeS5wb3B1cE1lbnUvcG9wdXBBY3Rpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQucHVibGlzaCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSBQcmVmZXJlbmNlIFBhZ2VzIC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX1NDRU5BUklPX0RFRkFVTFRTIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5wcmVmZXJlbmNlcy5TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnByZWZlcmVuY2VzLlNjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9jcmVhdGlvbi91aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0YzQ3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2NyZWF0aW9uL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBXU0RMIFRlc3QgRXJyb3JzCi0jCi1NU0dfRVJST1JfVU5BQkxFX1RPX0xBVU5DSF9XU0RMX1RFU1Q9SVdBQjAzNjFFIEFuIGVycm9yIG9jY3VycmVkLiBVbmFibGUgdG8gbGF1bmNoIFdTREwgdGVzdCBmYWNpbGl0eS4KLQotCi0jCi0jIFdpemFyZCBwYWdlcwotIwotUEFHRV9USVRMRV9PQkpFQ1RfU0VMRUNUSU9OPU9iamVjdCBTZWxlY3Rpb24gUGFnZQotUEFHRV9ERVNDX09CSkVDVF9TRUxFQ1RJT049T2JqZWN0IFNlbGVjdGlvbiBQYWdlCi0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjZmNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZUFzc2VtYmxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZTsKLQotcHVibGljIGNsYXNzIFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotCXByaXZhdGUgSVdlYlNlcnZpY2UJCQkJd2ViU2VydmljZV87Ci0JcHJpdmF0ZSBTdHJpbmcJCQkJCQlwcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICBtb2R1bGVfOwotCXByaXZhdGUgU3RyaW5nCQkJCQkJZWFyUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgZWFyXzsKLQlwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGoyZWVMZXZlbF87Ci0KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLSAgewotCSAgU3lzdGVtLm91dC5wcmludGxuKCAiSW4gUHJlIHNlcnZpY2UgYXNzZW1ibGUgY29tbWFuZC4iICk7Ci0gICAgCi0JCS8vIENoZWNrIGlmIEVBUiBtb2R1bGUgaXMgcmVxJ2QsIGllLiAhPW51bGwKLQkJaWYgKGVhclByb2plY3RfPT1udWxsKQotCQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCSAgCi0JICAKLQkJLy9DcmVhdGUgdGhlIHNlcnZpY2UgRUFSIG1vZHVsZQotCQlDcmVhdGVNb2R1bGVDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ3JlYXRlTW9kdWxlQ29tbWFuZCgpOwotCQljb21tYW5kLnNldFByb2plY3ROYW1lKGVhclByb2plY3RfKTsKLQkJY29tbWFuZC5zZXRNb2R1bGVOYW1lKGVhcl8pOwotCQljb21tYW5kLnNldE1vZHVsZVR5cGUoQ3JlYXRlTW9kdWxlQ29tbWFuZC5FQVIpOwotCQljb21tYW5kLnNldFNlcnZlckZhY3RvcnlJZCh3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckZhY3RvcnlJZCgpKTsKLQkJY29tbWFuZC5zZXRKMmVlTGV2ZWwoajJlZUxldmVsXyk7Ci0JCVN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLQkJewotCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCSAgcmV0dXJuIHN0YXR1czsKLQkJfQkJCQotCQkKLQkJCi0JCS8vQXNzb2NpYXRlIHRoZSBzZXJ2aWNlIG1vZHVsZSBhbmQgc2VydmljZSBFQVIKLQkJQXNzb2NpYXRlTW9kdWxlV2l0aEVBUkNvbW1hbmQgYXNzb2NpYXRlQ29tbWFuZCA9IG5ldyBBc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZCgpOwotCQlhc3NvY2lhdGVDb21tYW5kLnNldFByb2plY3QocHJvamVjdF8pOwotCQlhc3NvY2lhdGVDb21tYW5kLnNldE1vZHVsZShtb2R1bGVfKTsKLQkJYXNzb2NpYXRlQ29tbWFuZC5zZXRFQVJQcm9qZWN0KGVhclByb2plY3RfKTsKLQkJYXNzb2NpYXRlQ29tbWFuZC5zZXRFYXIoZWFyXyk7Ci0JCXN0YXR1cyA9IGFzc29jaWF0ZUNvbW1hbmQuZXhlY3V0ZShlbnZpcm9ubWVudCk7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQl7Ci0JCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsJCSAgCi0JCX0JCQkKLQkJCi0JCXJldHVybiBzdGF0dXM7CSAgCi0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdCggU3RyaW5nIHByb2plY3QgKQotICB7Ci0JICBwcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0KLQkgIAotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotICB7Ci0JICBtb2R1bGVfID0gbW9kdWxlOwotICB9CQotCQotICBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0KCBTdHJpbmcgZWFyUHJvamVjdCApCi0gIHsKLQkgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyKCBTdHJpbmcgZWFyICkKLSAgewotCSAgZWFyXyA9IGVhcjsgIAotICB9Ci0JCi0gCi0gIHB1YmxpYyB2b2lkIHNldEoyZWVMZXZlbCggU3RyaW5nIGoyZWVMZXZlbCApCi0gIHsKLQkgIGoyZWVMZXZlbF8gPSBqMmVlTGV2ZWw7ICAKLSAgfQotCQotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlKCBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlICkKLSAgewotCSAgd2ViU2VydmljZV8gPSB3ZWJTZXJ2aWNlOyAgCi0gIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlRGVwbG95Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vUHJlU2VydmljZURlcGxveUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyN2EyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlRGVwbG95Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgUHJlU2VydmljZURlcGxveUNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIAotewotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICB7Ci0JU3lzdGVtLm91dC5wcmludGxuKCAiSW4gUHJlIHNlcnZpY2UgZGVwbG95IGNvbW1hbmQuIiApOwotCi0JcmV0dXJuIHN1cGVyLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTAxZGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZU1vZHVsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVdlYlNlcnZpY2VSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5XZWJTZXJ2aWNlU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuU2ltcGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgCi17Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXJfOwotICBwcml2YXRlIEVudmlyb25tZW50ICAgICAgIGVudmlyb25tZW50XzsKLSAgcHJpdmF0ZSBJQ29udGV4dCAgICAgICAgICBjb250ZXh0XzsKLSAgcHJpdmF0ZSBJU2VsZWN0aW9uICAgICAgICBzZWxlY3Rpb25fOwotCXByaXZhdGUgU3RyaW5nCQkJCQkJcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlXzsKLQlwcml2YXRlIFN0cmluZwkJCQkJCWVhclByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGVhcl87Ci0JCi0gIHByaXZhdGUgSVdlYlNlcnZpY2UgICAgICAgd2ViU2VydmljZV87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgajJlZUxldmVsXzsKLSAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgICByZXNvdXJjZUNvbnRleHRfOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIHJ1bl87Ci0gIHByaXZhdGUgYm9vbGVhbiBjbGllbnRfOwotICBwcml2YXRlIGJvb2xlYW4gdGVzdF87Ci0gIHByaXZhdGUgYm9vbGVhbiBwdWJsaXNoXzsKLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICB7Ci0gICAgLy8gU3BsaXQgdXAgdGhlIHByb2plY3QgYW5kIG1vZHVsZQotICAgIGludCBpbmRleCA9IG1vZHVsZV8uaW5kZXhPZigiLyIpOwotICAgIGlmIChpbmRleCE9LTEpewotICAgICAgcHJvamVjdF8gPSBtb2R1bGVfLnN1YnN0cmluZygwLGluZGV4KTsKLSAgICAgIG1vZHVsZV8gPSBtb2R1bGVfLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICB9Ci0KLSAgICBpZiAoZWFyXyE9bnVsbCAmJiBlYXJfLmxlbmd0aCgpPjApCi0gICAgewotICAgICAgaW50IGVhckluZGV4ID0gZWFyXy5pbmRleE9mKCIvIik7Ci0gICAgICBpZiAoZWFySW5kZXghPS0xKSB7Ci0gICAgICAgIGVhclByb2plY3RfID0gZWFyXy5zdWJzdHJpbmcoMCxlYXJJbmRleCk7Ci0gICAgICAgIGVhcl8gPSBlYXJfLnN1YnN0cmluZyhlYXJJbmRleCsxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0JICBJV2ViU2VydmljZVJ1bnRpbWUgd3NydCAgID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXRXZWJTZXJ2aWNlUnVudGltZSggdHlwZVJ1bnRpbWVTZXJ2ZXJfLmdldFJ1bnRpbWVJZCgpICk7Ci0JICBXZWJTZXJ2aWNlSW5mbyAgICAgd3NJbmZvID0gbmV3IFdlYlNlcnZpY2VJbmZvKCk7Ci0KLQkgIFN5c3RlbS5vdXQucHJpbnRsbiggIkluIFByZSBzZXJ2aWNlIGRldmVsb3AgY29tbWFuZC4iICk7Ci0JCi0JICB3c0luZm8uc2V0SjJlZUxldmVsKCBqMmVlTGV2ZWxfICk7Ci0JCXdzSW5mby5zZXRTZXJ2ZXJGYWN0b3J5SWQoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJZCgpICk7Ci0gICAgd3NJbmZvLnNldFNlcnZlckluc3RhbmNlSWQoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCkpOwotCQl3c0luZm8uc2V0U3RhdGUoIFdlYlNlcnZpY2VTdGF0ZS5VTktOT1dOX0xJVEVSQUwgKTsKLQkJd3NJbmZvLnNldFdlYlNlcnZpY2VSdW50aW1lSWQoIHR5cGVSdW50aW1lU2VydmVyXy5nZXRSdW50aW1lSWQoKSApOwotICAgIAotCi0JCWVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotCQl3ZWJTZXJ2aWNlXyAgPSB3c3J0LmdldFdlYlNlcnZpY2UoIHdzSW5mbyApOwotCQotCQkvL1NldCB1cCB0aGUgSUNvbnRleHQKLQkJV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvID0gbnVsbDsKLSAgICBpbnQgc2NlbmFyaW9JbnQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFNjZW5hcmlvRnJvbVR5cGVJZCh0eXBlUnVudGltZVNlcnZlcl8uZ2V0VHlwZUlkKCkpOwotICAgIGlmIChzY2VuYXJpb0ludCA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApCi0JCXsKLQkJCXNjZW5hcmlvID0gV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTVVQX0xJVEVSQUw7Ci0gICAgICBTdHJpbmcgaW1wbCA9IChTdHJpbmcpKHNlbGVjdGlvbl8uZ2V0U2VsZWN0aW9uKCkpWzBdOwotICAgICAgd3NJbmZvLnNldEltcGxVUkwoaW1wbCk7Ci0JCX0KLSAgICBlbHNlIGlmIChzY2VuYXJpb0ludCA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikKLQkJewotCQkgIHNjZW5hcmlvID0gV2ViU2VydmljZVNjZW5hcmlvLlRPUERPV05fTElURVJBTDsKLSAgICAgIFN0cmluZyB3c2RsVVJMID0gKFN0cmluZykoc2VsZWN0aW9uXy5nZXRTZWxlY3Rpb24oKSlbMF07Ci0gICAgICB3c0luZm8uc2V0V3NkbFVSTCh3c2RsVVJMKTsgICAgICAKLQkJfQotCQotCQljb250ZXh0XyAgICAgPSBuZXcgU2ltcGxlQ29udGV4dCh0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCBydW5fLCBjbGllbnRfLCB0ZXN0XywgcHVibGlzaF8sIAotCQkJCQkJCQkJCQkJCQkJCQkJc2NlbmFyaW8sIAotCQkJCQkJCQkJCQkJCQkJCQkJcmVzb3VyY2VDb250ZXh0Xy5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpLAotCQkJCQkJCQkJCQkJCQkJCQkJcmVzb3VyY2VDb250ZXh0Xy5pc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCksCi0JCQkJCQkJCQkJCQkJCQkJCQlyZXNvdXJjZUNvbnRleHRfLmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSk7Ci0KLSAgICAvL0NyZWF0ZSB0aGUgc2VydmljZSBtb2R1bGUKLQkJQ3JlYXRlTW9kdWxlQ29tbWFuZCBjb21tYW5kID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLQkJY29tbWFuZC5zZXRQcm9qZWN0TmFtZShwcm9qZWN0Xyk7Ci0JCWNvbW1hbmQuc2V0TW9kdWxlTmFtZShtb2R1bGVfKTsKLQkJLy9yc2sgdG9kbyAtLSBwaWNrIHRoZSBjb3JyZWN0IG1vZHVsZSB0eXBlIGJhc2VkIG9uIHRoZSBXZWIgc2VydmljZSB0eXBlLCBpdCdzIGhhcmQgY29kZWQgdG8gV0VCIGZvciBub3cuCi0JCWNvbW1hbmQuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLldFQik7Ci0JCWNvbW1hbmQuc2V0U2VydmVyRmFjdG9yeUlkKHR5cGVSdW50aW1lU2VydmVyXy5nZXRTZXJ2ZXJJZCgpKTsKLQkJY29tbWFuZC5zZXRKMmVlTGV2ZWwoajJlZUxldmVsXyk7Ci0JCVN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotCQkKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JCXsKLQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQl9CQkJCi0JICByZXR1cm4gc3RhdHVzOwkJCQkKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlciApCi0gIHsKLQkgIHR5cGVSdW50aW1lU2VydmVyXyA9IHR5cGVSdW50aW1lU2VydmVyOyAgCi0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2V0SjJlZUxldmVsKCBTdHJpbmcgajJlZUxldmVsICkKLSAgewotCWoyZWVMZXZlbF8gPSBqMmVlTGV2ZWw7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKMmVlTGV2ZWwoKQotICB7Ci0JICByZXR1cm4gajJlZUxldmVsXzsgIAotICB9Ci0JCi0gIHB1YmxpYyBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKCkKLSAgewotCXJldHVybiB3ZWJTZXJ2aWNlXzsgIAotICB9Ci0gIAotICBwdWJsaWMgRW52aXJvbm1lbnQgZ2V0RW52aXJvbm1lbnQoKQotICB7Ci0JcmV0dXJuIGVudmlyb25tZW50XzsKLSAgfQotICAKLSAgcHVibGljIElDb250ZXh0IGdldENvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRleHRfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQgKQotICB7Ci0gICAgcmVzb3VyY2VDb250ZXh0XyA9IHJlc291cmNlQ29udGV4dDsJICAKLSAgfQotICAKLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOwkgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oIElTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotCXNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0XzsJICAKLSAgfQotCSAKLSAgcHVibGljIFN0cmluZyBnZXRNb2R1bGUoKQotICB7Ci0gICAgcmV0dXJuIG1vZHVsZV87CSAgCi0gIH0KLQkKLSAgcHVibGljIHZvaWQgc2V0TW9kdWxlKCBTdHJpbmcgbW9kdWxlICkKLSAgewotCSAgbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQotCQotICBwdWJsaWMgU3RyaW5nIGdldEVhclByb2plY3QoKQotICB7Ci0gICAgcmV0dXJuIGVhclByb2plY3RfOwkgIAotICB9Ci0JCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWFyKCkKLSAgewotCSAgcmV0dXJuIGVhcl87ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyKCBTdHJpbmcgZWFyICkKLSAgewotCSAgZWFyXyA9IGVhcjsgIAotICB9Ci0gIAotCXB1YmxpYyB2b2lkIHNldFN0YXJ0U2VydmljZShib29sZWFuIHN0YXJ0U2VydmljZSkKLQl7Ci0JCXJ1bl8gPSBzdGFydFNlcnZpY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKGJvb2xlYW4gdGVzdFNlcnZpY2UpCi0JewotCQl0ZXN0XyA9IHRlc3RTZXJ2aWNlOwotCX0JCi0JCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hTZXJ2aWNlKGJvb2xlYW4gcHVibGlzaFNlcnZpY2UpCi0gIHsKLSAgICBwdWJsaXNoXyA9IHB1Ymxpc2hTZXJ2aWNlOwotICB9Ci0JCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoYm9vbGVhbiBnZW5Qcm94eSkKLSAgewotICAgIGNsaWVudF8gPSBnZW5Qcm94eTsgIAotICB9CQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzgwNWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFkZE1vZHVsZVRvU2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlU2VydmVyQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgUHJlU2VydmljZUluc3RhbGxDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCAKLXsKLQlwcml2YXRlIElXZWJTZXJ2aWNlCQkJCXdlYlNlcnZpY2VfOwotCXByaXZhdGUgU3RyaW5nCQkJCQkJcHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgICAgbW9kdWxlXzsKLQlwcml2YXRlIFN0cmluZwkJCQkJCWVhclByb2plY3RfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgIGVhcl87Ci0JCQotCSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLQkgIHsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oICJJbiBQcmUgc2VydmljZSBpbnN0YWxsIGNvbW1hbmQuIiApOwotCQkJCi0JCQlpZiAod2ViU2VydmljZV8uZ2V0V2ViU2VydmljZUluZm8oKS5nZXRTZXJ2ZXJJbnN0YW5jZUlkKCk9PW51bGwpCi0JCQl7Ci0JCQkJQ3JlYXRlU2VydmVyQ29tbWFuZCBjcmVhdGVTZXJ2ZXJDb21tYW5kID0gbmV3IENyZWF0ZVNlcnZlckNvbW1hbmQoKTsKLQkJCQljcmVhdGVTZXJ2ZXJDb21tYW5kLnNldFNlcnZlckZhY3RvcnlpZCh3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckZhY3RvcnlJZCgpKTsKLQkJCQlTdGF0dXMgY3JlYXRlU2VydmVyU3RhdHVzID0gY3JlYXRlU2VydmVyQ29tbWFuZC5leGVjdXRlKGVudmlyb25tZW50KTsKLQkJCQlpZiAoY3JlYXRlU2VydmVyU3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5PSykKLQkJCQl7Ci0JCQkJCXdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuc2V0U2VydmVySW5zdGFuY2VJZChjcmVhdGVTZXJ2ZXJDb21tYW5kLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmIChjcmVhdGVTZXJ2ZXJTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQkJCQl7Ci0JCQkJCQllbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoY3JlYXRlU2VydmVyU3RhdHVzKTsKLQkJCQkJfQkJCQkJCQkJCi0JCQkJCXJldHVybiBjcmVhdGVTZXJ2ZXJTdGF0dXM7Ci0JCQkJfQotCQkJfQotCQkJICAKLQkJCQotCQkJCi0JCQlBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRNb2R1bGVUb1NlcnZlckNvbW1hbmQoKTsKLQkJCWNvbW1hbmQuc2V0U2VydmVySW5zdGFuY2VJZCh3ZWJTZXJ2aWNlXy5nZXRXZWJTZXJ2aWNlSW5mbygpLmdldFNlcnZlckluc3RhbmNlSWQoKSk7Ci0JCQlpZiAoZWFyUHJvamVjdF8gIT0gbnVsbCAmJiBlYXJQcm9qZWN0Xy5sZW5ndGgoKT4wICYmIGVhcl8hPSBudWxsICYmIGVhcl8ubGVuZ3RoKCk+MCkKLQkJCXsKLQkJCQljb21tYW5kLnNldFByb2plY3QoZWFyUHJvamVjdF8pOwotCQkJCWNvbW1hbmQuc2V0TW9kdWxlKGVhcl8pOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWNvbW1hbmQuc2V0UHJvamVjdChwcm9qZWN0Xyk7Ci0JCQkJY29tbWFuZC5zZXRNb2R1bGUobW9kdWxlXyk7CQkJCQotCQkJfQotCi0JCQlTdGF0dXMgc3RhdHVzID0gY29tbWFuZC5leGVjdXRlKGVudmlyb25tZW50KTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotCQkJewotCQkJCWVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJfQkJCQotCQkgIHJldHVybiBzdGF0dXM7Ci0JICB9Ci0KLQkgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0ICkKLQkgIHsKLQkJICBwcm9qZWN0XyA9IHByb2plY3Q7Ci0JICB9Ci0JCSAgCi0JICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotCSAgewotCQkgIG1vZHVsZV8gPSBtb2R1bGU7Ci0JICB9CQotCQkKLQkgIHB1YmxpYyB2b2lkIHNldEVhclByb2plY3QoIFN0cmluZyBlYXJQcm9qZWN0ICkKLQkgIHsKLQkJICBlYXJQcm9qZWN0XyA9IGVhclByb2plY3Q7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHNldEVhciggU3RyaW5nIGVhciApCi0JICB7Ci0JCSAgZWFyXyA9IGVhcjsgIAotCSAgfQotCQkKLQkgIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgKQotCSAgewotCQkgIHdlYlNlcnZpY2VfID0gd2ViU2VydmljZTsgIAotCSAgfQotCQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VSdW5Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL2V4dGVuc2lvbi9QcmVTZXJ2aWNlUnVuQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmY4MzliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1ByZVNlcnZpY2VSdW5Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TdGFydFNlcnZlckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZTsKLQotcHVibGljIGNsYXNzIFByZVNlcnZpY2VSdW5Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCAKLXsKLQlwcml2YXRlIElXZWJTZXJ2aWNlCQkJCXdlYlNlcnZpY2VfOwotCQotCSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50KSAKLQkgIHsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oICJJbiBQcmUgc2VydmljZSBydW4gY29tbWFuZC4iICk7Ci0JCQkKLQkJCVN0YXJ0U2VydmVyQ29tbWFuZCBjb21tYW5kID0gbmV3IFN0YXJ0U2VydmVyQ29tbWFuZCgpOwotCQkJY29tbWFuZC5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHdlYlNlcnZpY2VfLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0U2VydmVySW5zdGFuY2VJZCgpKTsKLQkJCVN0YXR1cyBzdGF0dXMgPSBjb21tYW5kLmV4ZWN1dGUoZW52aXJvbm1lbnQpOwotCQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpPT1TdGF0dXMuRVJST1IpCi0JCQl7Ci0JCQkJZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7CQkJICAKLQkJCX0JCQkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCQkKLQkgIH0KLQkJCi0JICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlKCBJV2ViU2VydmljZSB3ZWJTZXJ2aWNlICkKLQkgIHsKLQkJICB3ZWJTZXJ2aWNlXyA9IHdlYlNlcnZpY2U7ICAKLQkgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vU2VydmljZVJvb3RGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9leHRlbnNpb24vU2VydmljZVJvb3RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDAwNDhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvZXh0ZW5zaW9uL1NlcnZpY2VSb290RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkFzc2VtYmxlU2VydmljZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkRlcGxveVNlcnZpY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9ucy5EZXZlbG9wU2VydmljZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zLkluc3RhbGxTZXJ2aWNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMuUnVuU2VydmljZUZyYWdtZW50OwotCi1wdWJsaWMgY2xhc3MgU2VydmljZVJvb3RGcmFnbWVudCBleHRlbmRzIFNlcXVlbmNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBTZXJ2aWNlUm9vdEZyYWdtZW50KCkKLSAgewotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlU2VydmljZURldmVsb3BDb21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBEZXZlbG9wU2VydmljZUZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZVNlcnZpY2VBc3NlbWJsZUNvbW1hbmQoKSwgIiIgKSApOwotICAgIGFkZCggbmV3IEFzc2VtYmxlU2VydmljZUZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZVNlcnZpY2VEZXBsb3lDb21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQoKSApOwotICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgUHJlU2VydmljZUluc3RhbGxDb21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBJbnN0YWxsU2VydmljZUZyYWdtZW50KCkgKTsKLSAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IFByZVNlcnZpY2VSdW5Db21tYW5kKCksICIiICkgKTsKLSAgICBhZGQoIG5ldyBSdW5TZXJ2aWNlRnJhZ21lbnQoKSApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSkgCi0gIHsKLQkJLy9NYXBwaW5ncyBmcm9tIGZyYW1ld29yayB0byBleHRlbnNpb24gZnJhZ21lbnRzCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIERldmVsb3BTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBEZXZlbG9wU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCQotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIEFzc2VtYmxlU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiQ29udGV4dCIsIEFzc2VtYmxlU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIEFzc2VtYmxlU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0IiwgQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIEFzc2VtYmxlU2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgRGVwbG95U2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVudmlyb25tZW50IiwgRGVwbG95U2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiU2VsZWN0aW9uIiwgRGVwbG95U2VydmljZUZyYWdtZW50LmNsYXNzICk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIERlcGxveVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIERlcGxveVNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotCQotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBJbnN0YWxsU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkNvbnRleHQiLCBJbnN0YWxsU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsgIAotCQlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXJQcm9qZWN0IiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotCQotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZSIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFbnZpcm9ubWVudCIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJDb250ZXh0IiwgUnVuU2VydmljZUZyYWdtZW50LmNsYXNzICk7ICAKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBSdW5TZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOyAgCi0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBSdW5TZXJ2aWNlRnJhZ21lbnQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIFJ1blNlcnZpY2VGcmFnbWVudC5jbGFzcyApOwotCQkKLQkJLy9NYXBwaW5ncyBmcm9tIGZyYW1ld29yayB0byBmcmFtZXdvcmsgY29tbWFuZHMKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlByb2plY3QiLCBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmNsYXNzICk7Ci0gIAlyZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBQcmVTZXJ2aWNlQXNzZW1ibGVDb21tYW5kLmNsYXNzICk7CQkKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiSjJlZUxldmVsIiwgUHJlU2VydmljZUFzc2VtYmxlQ29tbWFuZC5jbGFzcyApOwotCQkKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBQcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQuY2xhc3MgKTsKLQkJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiUHJvamVjdCIsIFByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwotICAJcmVnaXN0cnkuYWRkTWFwcGluZyggUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlIiwgUHJlU2VydmljZUluc3RhbGxDb21tYW5kLmNsYXNzICk7Ci0JCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhclByb2plY3QiLCBQcmVTZXJ2aWNlSW5zdGFsbENvbW1hbmQuY2xhc3MgKTsKLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIkVhciIsIFByZVNlcnZpY2VJbnN0YWxsQ29tbWFuZC5jbGFzcyApOwkJCi0KLSAgCXJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBQcmVTZXJ2aWNlUnVuQ29tbWFuZC5jbGFzcyApOwotCQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9wbHVnaW4vV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMjYwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3BsdWdpbi9XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotLyoqCi0qIFRoaXMgaXMgdGhlIHBsdWdpbiBjbGFzcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBDcmVhdGlvbiBVSSBwbHVnaW4uCi0qIDxwPgotKiBUaGUgV2ViIFNlcnZpY2VzIENyZWF0aW9uIFVJIHBsdWdpbidzIHNvbGUgZnVuY3Rpb24gaXMgdG8gYWRkIAotKiB1c2VyIGludGVyZmFjZSBvZiB0aGUgV2ViIFNlcnZpY2VzIENyZWF0aW9uIFdpemFyZCwgY29udGFpbmVkIGluICAKLSogdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aSBwbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotCi0gIC8qKgotICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0KLSAgLyoqCi0gICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiBpbnN0YW5jZV87Ci0gIHByaXZhdGUgTG9nIGxvZ187Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uCi0gICogVGhlICJwbHVnaW4iIGVsZW1lbnQgaW4gcGx1Z2luLnhtbCBzaG91bGQgaW5jbHVkZSB0aGUgYXR0cmlidXRlCi0gICogY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnBsdWdpbi5XZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiIuCi0gICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiAoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbnN0YW5jZV8gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLSAgKiAoV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlQ3JlYXRpb25VSVBsdWdpbiBzaW5nbGV0b24uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZUNyZWF0aW9uVUlQbHVnaW4gZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICAqIHBsdWdpbi5wcm9wZXJ0aWVzLgotICAqIEByZXR1cm4gVGhlIFN0cmluZyBtZXNzYWdlLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIGtleSApCi0gIHsKLSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLnBsdWdpbiIsIGluc3RhbmNlXyApOwotICAgIAotICAgIGlmKCBrZXkuc3RhcnRzV2l0aCgiJSIpKQotICAgIHsKLSAgICAgIGtleSA9IGtleS5zdWJzdHJpbmcoIDEsIGtleS5sZW5ndGgoKSApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbXNnVXRpbHMuZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4gU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcKLSAgKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotICAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSB0aGUgSkRLJ3MKLSAgKiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9Ci0gICogY2xhc3MgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksYXJncyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvciAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCBpbnN0YWxsVVJMID0gaW5zdGFuY2VfLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0gICAgICBVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsbmFtZSk7Ci0gICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3ByZWZlcmVuY2VzL1NjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhYjRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3ByZWZlcmVuY2VzL1NjZW5hcmlvRGVmYXVsdHNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSAKLXsKLQlwcml2YXRlIFNlcnZlcldpemFyZFdpZGdldCBzZXJ2ZXJXaWRnZXRfID0gbnVsbDsKLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgIHsgfQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAKLQl7Ci0JICBVSVV0aWxzIHV0aWxzID0gbmV3IFVJVXRpbHMobnVsbCwgbnVsbCk7Ci0JICAKLQkgIENvbXBvc2l0ZSBwYWdlID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDEgKTsKLQkgIAotICAgICAgc2VydmVyV2lkZ2V0XyA9IG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXQoIGZhbHNlICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLmFkZENvbnRyb2xzKCBwYWdlLCBuZXcgTGlzdGVuZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggRXZlbnQgZXZ0ICl7fQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSApOwotCSAgaW5pdGlhbGl6ZVZhbHVlcygpOwotCSAgcmV0dXJuIHBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotCXsKLQkgIFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotCi0gICAgICAvLyBTZXQgdmFsdWVzIGZyb20gY29udGV4dC4KLQkgIFR5cGVSdW50aW1lU2VydmVyIHNlcnZlcklkcyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JCQotCSAgc2VydmVySWRzLnNldFR5cGVJZCggY29udGV4dC5nZXRXZWJTZXJ2aWNlVHlwZSgpICk7Ci0JICBjbGllbnRJZHMuc2V0VHlwZUlkKCBjb250ZXh0LmdldENsaWVudFdlYlNlcnZpY2VUeXBlKCkgKTsKLQkJCi0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlciggc2VydmVySWRzICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBjbGllbnRJZHMgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0R2VuZXJhdGVQcm94eSggbmV3IEJvb2xlYW4oY29udGV4dC5nZXRHZW5lcmF0ZVByb3h5KCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFB1Ymxpc2hTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpKSApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRTdGFydFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0U3RhcnRXZWJTZXJ2aWNlKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFRlc3RTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldFRlc3RXZWJTZXJ2aWNlKCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldE1vbml0b3JTZXJ2aWNlKG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0TW9uaXRvcldlYlNlcnZpY2UoKSkpOwotICAgICAgc2VydmVyV2lkZ2V0Xy5pbnRlcm5hbGl6ZSgpOwotCX0KLQkKLSAgICAvKioKLQkgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLQl7Ci0JICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkgIHNldFRvRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRvRGVmYXVsdHMoKQotCXsKLQkgIFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotCi0gICAgICAvLyBTZXQgdmFsdWVzIGZyb20gY29udGV4dC4KLQkgIFR5cGVSdW50aW1lU2VydmVyIHNlcnZlcklkcyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzID0gbmV3IFR5cGVSdW50aW1lU2VydmVyKCk7Ci0JCQotCSAgc2VydmVySWRzLnNldFR5cGVJZCggY29udGV4dC5nZXRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKSApOwotCSAgY2xpZW50SWRzLnNldFR5cGVJZCggY29udGV4dC5nZXRDbGllbnRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKSApOwotCQkKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBzZXJ2ZXJJZHMgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIGNsaWVudElkcyApOwotICAgICAgc2VydmVyV2lkZ2V0Xy5zZXRHZW5lcmF0ZVByb3h5KCBuZXcgQm9vbGVhbihjb250ZXh0LmdldEdlbmVyYXRlUHJveHlEZWZhdWx0KCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldFB1Ymxpc2hTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlckRlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0U3RhcnRTZXJ2aWNlKCBuZXcgQm9vbGVhbihjb250ZXh0LmdldFN0YXJ0V2ViU2VydmljZURlZmF1bHQoKSkgKTsKLSAgICAgIHNlcnZlcldpZGdldF8uc2V0VGVzdFNlcnZpY2UoIG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0VGVzdFdlYlNlcnZpY2VEZWZhdWx0KCkpICk7Ci0gICAgICBzZXJ2ZXJXaWRnZXRfLnNldE1vbml0b3JTZXJ2aWNlKG5ldyBCb29sZWFuKGNvbnRleHQuZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCkpKTsKLSAgICAgIHNlcnZlcldpZGdldF8uaW50ZXJuYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0JICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotCXsKLQkgIHN0b3JlVmFsdWVzKCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotCXsKLQkgIFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpOwotCSAgCi0JICBUeXBlUnVudGltZVNlcnZlciBzZXJ2ZXJJZHMgPSBzZXJ2ZXJXaWRnZXRfLmdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpOwotCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgY2xpZW50SWRzID0gc2VydmVyV2lkZ2V0Xy5nZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpOwotCSAgCi0gICAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUeXBlKCBzZXJ2ZXJJZHMuZ2V0VHlwZUlkKCkgKTsKLSAgICAgIGNvbnRleHQuc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoIGNsaWVudElkcy5nZXRUeXBlSWQoKSApOwotICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVByb3h5KCBzZXJ2ZXJXaWRnZXRfLmdldEdlbmVyYXRlUHJveHkoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoIHNlcnZlcldpZGdldF8uZ2V0UHVibGlzaFNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRTdGFydFdlYlNlcnZpY2UoIHNlcnZlcldpZGdldF8uZ2V0U3RhcnRTZXJ2aWNlKCkuYm9vbGVhblZhbHVlKCkgKTsKLSAgICAgIGNvbnRleHQuc2V0VGVzdFdlYlNlcnZpY2UoIHNlcnZlcldpZGdldF8uZ2V0VGVzdFNlcnZpY2UoKS5ib29sZWFuVmFsdWUoKSApOwotICAgICAgY29udGV4dC5zZXRNb25pdG9yV2ViU2VydmljZShzZXJ2ZXJXaWRnZXRfLmdldE1vbml0b3JTZXJ2aWNlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotCXsKLQkgIHBlcmZvcm1PaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5MjdmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLldlYlNlcnZpY2VDbGllbnRUeXBlV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuTGFiZWxzQW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLlR5cGVSdW50aW1lU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5jb21tb24uVUlVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJXaXphcmRXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsgICAKLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCBjbGllbnRXaWRnZXRfOwotICBwcml2YXRlIFByZWZlcmVuY2VzU2VsZWN0aW9uV2lkZ2V0IHByZWZlcmVuY2VzV2lkZ2V0XzsKLSAgcHJpdmF0ZSBMaXN0ZW5lciAgICAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lcl87Ci0gIHByaXZhdGUgVHlwZVJ1bnRpbWVTZXJ2ZXIgICAgICAgICAgaWRzXzsKLSAgcHJpdmF0ZSBMYWJlbHNBbmRJZHMgICAgICAgICAgICAgICBsYWJlbElkc187Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVByZWZlcmVuY2VzXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwMSBmb3IgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9QQUdFID0gIlBXUFIwMDAxIjsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwNSBmb3IgdGhlIEdlbmVyYXRlIFByb3h5IGNoZWNrIGJveCBvZiB0aGUgUHJvamVjdCBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX0dFTkVSQVRFX1BST1hZID0gIlBXUFIwMDA1IjsKLSAgcHJpdmF0ZSBCdXR0b24gIGdlbmVyYXRlUHJveHlfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDEwIGZvciB0aGUgV2ViIFNlcnZpY2UgVHlwZSBjb21ibyBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DT01CT19UWVBFID0gIlBXUFIwMDEwIjsKLSAgcHJpdmF0ZSBDb21ibyAgd2Vic2VydmljZVR5cGVfOwotICAKLSAgLypDT05URVhUX0lEIFBXUFIwMDExIGZvciB0aGUgV2l6YXJkIFNjZW5hcmlvIFNlcnZpY2UgZ3JvdXAgb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9HUk9VUF9TQ0VOQVJJT19TRVJWSUNFID0gIlBXUFIwMDExIjsKLSAgcHJpdmF0ZSBCdXR0b24gc3RhcnRTZXJ2aWNlXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAwOSBmb3IgdGhlIFN0YXJ0IFdlYiBQcm9qZWN0IGNoZWNrIGJveCBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9TVEFSVF9XRUJfUFJPSkVDVCA9ICJQV1BSMDAwOSI7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTMgZm9yIHRoZSB0ZXN0IHNlcnZpY2UgY2hlY2tib3ggb2YgdGhlIHByb2plY3QgcGFnZSovICAKLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX1RFU1RfU0VSVklDRSA9ICJQV1BSMDAxMyI7Ci0gIHByaXZhdGUgQnV0dG9uIHRlc3RTZXJ2aWNlXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1BSMDAxNCBmb3IgdGhlIG1vbml0b3Igc2VydmljZSBjaGVja2JveCBvZiB0aGUgcHJvamVjIHBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFID0gIlBXUFIwMDE0IjsKLSAgcHJpdmF0ZSBCdXR0b24gbW9uaXRvclNlcnZpY2U7Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdQUjAwMTIgZm9yIHRoZSBMYXVuY2ggVURESSBjaGVjayBib3ggb2YgdGhlIFByb2plY3QgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdQUl9DSEVDS0JPWF9MQVVOQ0hfV1MgPSAiUFdQUjAwMTIiOwotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hVZGRpXzsKLSAgCi0gIHB1YmxpYyBTZXJ2ZXJXaXphcmRXaWRnZXQoIGJvb2xlYW4gZGlzcGxheVByZWZlcmVuY2VzICkKLSAgewotICAgIGRpc3BsYXlQcmVmZXJlbmNlc18gPSBkaXNwbGF5UHJlZmVyZW5jZXM7ICAKLSAgfQotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgU3RyaW5nICAgICAgIGNyZWF0ZVBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdXRpbHMgICAgPSBuZXcgVUlVdGlscyggbXNnVXRpbHMsIGNyZWF0ZVBsdWdpbklkICk7Ci0gICAgCi0gICAgc3RhdHVzTGlzdGVuZXJfID0gc3RhdHVzTGlzdGVuZXI7Ci0gICAgCi0gIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCBwYXJlbnQsIHBsdWdpbklkICsgIi4iICsgIElORk9QT1BfUFdQUl9QQUdFICk7Ci0gIAkKLSAgCUNvbXBvc2l0ZSBzZXJ2ZXJDb21wb3NpdGUgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSApOwotICAJCi0gIAlHcm91cCBzZXJ2aWNlR3JvdXAgPSB1dGlscy5jcmVhdGVHcm91cCggc2VydmVyQ29tcG9zaXRlLCAiR1JPVVBfU0NFTkFSSU9fU0VSVklDRSIsCi0gIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9HUk9VUF9TQ0VOQVJJT19TRVJWSUNFIiwgCi0gIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0dST1VQX1NDRU5BUklPX1NFUlZJQ0UsCi0JCQkJCQkJCQkJCTIsIDEwLCAxMCk7Ci0gIAkKLSAgCQotICAJLy8gQ3JlYXRlIHdlYnNlcnZpY2UgY29tYm8gYm94LgotICAgIHdlYnNlcnZpY2VUeXBlXyA9IHV0aWxzLmNyZWF0ZUNvbWJvKCBzZXJ2aWNlR3JvdXAsICJMQUJFTF9XRUJTRVJWSUNFVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ09NQk9fVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DT01CT19UWVBFLCAKLQkJCQkJCQkJCQkgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgd2Vic2VydmljZVR5cGVfLmFkZExpc3RlbmVyKCBTV1QuTW9kaWZ5LCBzdGF0dXNMaXN0ZW5lciApOwotICAgIAotICAgIENvbXBvc2l0ZSBidXR0b25zR3JvdXAgPSB1dGlscy5jcmVhdGVDb21wb3NpdGUoIHNlcnZpY2VHcm91cCwgMSApOwotICAgIEdyaWREYXRhICBidXR0b25HcmlkICAgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBidXR0b25HcmlkLmhvcml6b250YWxTcGFuID0gMjsKLSAgICBidXR0b25zR3JvdXAuc2V0TGF5b3V0RGF0YSggYnV0dG9uR3JpZCApOwotICAgIAotICAgIC8vIENyZWF0ZSBzdGFydCBzZXJ2aWNlIGNoZWNrIGJveC4KLSAgICBzdGFydFNlcnZpY2VfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIGJ1dHRvbnNHcm91cCwgIkJVVFRPTl9TVEFSVF9XRUJfUFJPSkVDVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1BSX0NIRUNLQk9YX1NUQVJUX1dFQl9QUk9KRUNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFdQUl9DSEVDS0JPWF9TVEFSVF9XRUJfUFJPSkVDVCApOwotICAgIHN0YXJ0U2VydmljZV8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU3RhcnRQcmVzc2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgbGF1bmNoVWRkaV8gPSB1dGlscy5jcmVhdGVDaGVja2JveCggYnV0dG9uc0dyb3VwLCAiQlVUVE9OX1dTX1BVQkxJU0giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ0hFQ0tCT1hfTEFVTkNIX1dTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfTEFVTkNIX1dTICk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHByb3h5Q29tcG9zaXRlID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBzZXJ2ZXJDb21wb3NpdGUsIDEsIDUsIDAgKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgZ2VuZXJhdGUgcHJveHkgY2hlY2sgYm94LgotICAgIGdlbmVyYXRlUHJveHlfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIHByb3h5Q29tcG9zaXRlLCAiQlVUVE9OX0dFTkVSQVRFX1BST1hZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE9PTFRJUF9QV1BSX0NIRUNLQk9YX0dFTkVSQVRFX1BST1hZIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfR0VORVJBVEVfUFJPWFkgKTsKLSAgICBnZW5lcmF0ZVByb3h5Xy5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2dCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V2lkZ2V0Xy5lbmFibGVXaWRnZXQoIGdlbmVyYXRlUHJveHlfLmdldFNlbGVjdGlvbigpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAKLSAgICAvLyBDcmVhdGUgY2xpZW50IHNlbGVjdGlvbiB3aWRnZXQuCi0gICAgY2xpZW50V2lkZ2V0XyA9IG5ldyBXZWJTZXJ2aWNlQ2xpZW50VHlwZVdpZGdldCgpOwotICAgIGNsaWVudFdpZGdldF8uYWRkQ29udHJvbHMoIHNlcnZlckNvbXBvc2l0ZSwgc3RhdHVzTGlzdGVuZXIgKTsKLSAgICAKLSAgICBDb21wb3NpdGUgdGVzdEdyb3VwID0gdXRpbHMuY3JlYXRlQ29tcG9zaXRlKHNlcnZlckNvbXBvc2l0ZSwxKTsKLSAgICAKLSAgICAvLyAgQ3JlYXRlIHRlc3Qgc2VydmljZSBjaGVjayBib3guCi0gICAgdGVzdFNlcnZpY2VfID0gdXRpbHMuY3JlYXRlQ2hlY2tib3goIHRlc3RHcm91cCwgIkNIRUNLQk9YX1RFU1RfV0VCU0VSVklDRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUT09MVElQX1BXUFJfQ0hFQ0tCT1hfVEVTVF9TRVJWSUNFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QV1BSX0NIRUNLQk9YX1RFU1RfU0VSVklDRSApOwotCi0gICAgbW9uaXRvclNlcnZpY2UgPSB1dGlscy5jcmVhdGVDaGVja2JveCggdGVzdEdyb3VwLCAiQ0hFQ0tCT1hfTU9OSVRPUl9XRUJTRVJWSUNFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRPT0xUSVBfUFdQUl9DSEVDS0JPWF9NT05JVE9SX1NFUlZJQ0UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUE9QX1BXUFJfQ0hFQ0tCT1hfTU9OSVRPUl9TRVJWSUNFICk7Ci0gICAgCi0gICAgaWYoIGRpc3BsYXlQcmVmZXJlbmNlc18gKQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSB0aGUgcHJlZmVyZW5jZXMgd2lkZ2V0cy4KLSAgICAgIHByZWZlcmVuY2VzV2lkZ2V0XyA9IG5ldyBQcmVmZXJlbmNlc1NlbGVjdGlvbldpZGdldCgpOwotICAgICAgcHJlZmVyZW5jZXNXaWRnZXRfLmFkZENvbnRyb2xzKCBzZXJ2ZXJDb21wb3NpdGUsIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVN0YXJ0UHJlc3NlZCgpCi0gIHsKLSAgICBib29sZWFuIGVuYWJsZWQgPSBzdGFydFNlcnZpY2VfLmdldFNlbGVjdGlvbigpOwotICAgIAotICAgIHRlc3RTZXJ2aWNlXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgbW9uaXRvclNlcnZpY2Uuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICBsYXVuY2hVZGRpXy5zZXRFbmFibGVkKCBlbmFibGVkICk7Ci0gICAgZ2VuZXJhdGVQcm94eV8uc2V0RW5hYmxlZCggZW5hYmxlZCApOwotICAgIGNsaWVudFdpZGdldF8uZW5hYmxlV2lkZ2V0KCBnZXRHZW5lcmF0ZVByb3h5KCkuYm9vbGVhblZhbHVlKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBjbGllbnRXaWRnZXRfLnNldFR5cGVSdW50aW1lU2VydmVyKCBpZHMgKTsKLSAgfQotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgTGFiZWxzQW5kSWRzICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxJZHMgICA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0U2VydmljZVR5cGVMYWJlbHMoKTsKLQkvL3Jza3JlZwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiAgPSAwOwotICAgIFN0cmluZ1tdICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VJZHMgPSBsYWJlbElkcy5nZXRJZHNfKCk7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJZCA9IGlkcy5nZXRUeXBlSWQoKTsKLSAgICAKLSAgICB3ZWJzZXJ2aWNlVHlwZV8ucmVtb3ZlTGlzdGVuZXIoIFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyXyApOwotICAgIHdlYnNlcnZpY2VUeXBlXy5zZXRJdGVtcyggbGFiZWxJZHMuZ2V0TGFiZWxzXygpICk7Ci0gICAgICAgIAotICAgIC8vIE5vdyBmaW5kIHRoZSBzZWxlY3RlZCBvbmUuCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNlcnZpY2VJZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBpZiggc2VsZWN0ZWRJZC5lcXVhbHMoIHNlcnZpY2VJZHNbaW5kZXggXSkgKQotICAgICAgewotICAgICAgICBzZWxlY3Rpb24gPSBpbmRleDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHdlYnNlcnZpY2VUeXBlXy5zZWxlY3QoIHNlbGVjdGlvbiApOwotICAgIHdlYnNlcnZpY2VUeXBlXy5hZGRMaXN0ZW5lciggU1dULk1vZGlmeSwgc3RhdHVzTGlzdGVuZXJfICk7Ci0gICAgaWRzXyAgICAgID0gaWRzOyAgCi0gICAgbGFiZWxJZHNfID0gbGFiZWxJZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgaW50IHNlbGVjdGlvbkluZGV4ID0gd2Vic2VydmljZVR5cGVfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgCi0gICAgaWRzXy5zZXRUeXBlSWQoIGxhYmVsSWRzXy5nZXRJZHNfKClbc2VsZWN0aW9uSW5kZXhdICk7Ci0gICAgCi0gICAgcmV0dXJuIGlkc187ICAKLSAgfQotICAKLSAgcHVibGljIEJvb2xlYW4gZ2V0U3RhcnRTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggc3RhcnRTZXJ2aWNlXy5nZXRTZWxlY3Rpb24oKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0U2VydmljZSggQm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICBzdGFydFNlcnZpY2VfLnNldFNlbGVjdGlvbiggdmFsdWUuYm9vbGVhblZhbHVlKCkgKTsKLSAgfQotCi0gIHB1YmxpYyBCb29sZWFuIGdldFRlc3RTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggdGVzdFNlcnZpY2VfLmdldFNlbGVjdGlvbigpICYmIHN0YXJ0U2VydmljZV8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIEJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgdGVzdFNlcnZpY2VfLnNldFNlbGVjdGlvbiggdmFsdWUuYm9vbGVhblZhbHVlKCkgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRNb25pdG9yU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4obW9uaXRvclNlcnZpY2UuZ2V0U2VsZWN0aW9uKCkgJiYgc3RhcnRTZXJ2aWNlXy5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JTZXJ2aWNlKEJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBtb25pdG9yU2VydmljZS5zZXRTZWxlY3Rpb24odmFsdWUuYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIEJvb2xlYW4gZ2V0UHVibGlzaFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBsYXVuY2hVZGRpXy5nZXRTZWxlY3Rpb24oKSAmJiBzdGFydFNlcnZpY2VfLmdldFNlbGVjdGlvbigpICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hTZXJ2aWNlKCBCb29sZWFuIHZhbHVlICkKLSAgewotICAgIGxhdW5jaFVkZGlfLnNldFNlbGVjdGlvbiggdmFsdWUuYm9vbGVhblZhbHVlKCkgKTsgIAotICB9Ci0KLSAgcHVibGljIEJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oIGdlbmVyYXRlUHJveHlfLmdldFNlbGVjdGlvbigpICYmIHN0YXJ0U2VydmljZV8uZ2V0U2VsZWN0aW9uKCkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggQm9vbGVhbiB2YWx1ZSApCi0gIHsKLSAgICBnZW5lcmF0ZVByb3h5Xy5zZXRTZWxlY3Rpb24oIHZhbHVlLmJvb2xlYW5WYWx1ZSgpICk7ICAKLSAgfQotCi0gIHB1YmxpYyBSZXNvdXJjZUNvbnRleHQgZ2V0UmVzb3VyY2VDb250ZXh0KCkKLSAgewotICAgIHJldHVybiBwcmVmZXJlbmNlc1dpZGdldF8uZ2V0UmVzb3VyY2VDb250ZXh0KCk7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VDb250ZXh0KCBSZXNvdXJjZUNvbnRleHQgY29udGV4dCApCi0gIHsKLSAgICBwcmVmZXJlbmNlc1dpZGdldF8uc2V0UmVzb3VyY2VDb250ZXh0KCBjb250ZXh0ICk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpCi0gIHsKLSAgICBoYW5kbGVTdGFydFByZXNzZWQoKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICAKLSAgICAvLyBJZiB0aGUgd2Vic2VydmljZSBoYXMgbm90IGJlZW4gc2VsZWN0ZWQgdGhlbiB1c2VyIGNhbiBub3QgbW92ZQotICAgIC8vIGZvcndhcmQgdG8gdGhlIG5leHQgcGFnZS4KLSAgICBpZiggd2Vic2VydmljZVR5cGVfLmdldFRleHQoKS5lcXVhbHMoIiIpICkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgIiIsIFN0YXR1cy5FUlJPUiApOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDM2MDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9TZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuQ2xpZW50V2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQgZXh0ZW5kcyBDbGllbnRXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAoteyAgICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciB0eXBlUnVudGltZVNlcnZlcl87Ci0gIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbl87Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7ICAgIAotICAgIFN0cmluZyB0eXBlICAgICAgPSBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRXZWJTZXJ2aWNlVHlwZSgpOwotICAgIFN0cmluZyBydW50aW1lICAgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldERlZmF1bHRSdW50aW1lVmFsdWVGb3IoIHR5cGUgKTsKLQkKLSAgICBTdHJpbmcgZmFjdG9yeUlEID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5nZXREZWZhdWx0U2VydmVyVmFsdWVGb3IodHlwZSk7ICAgIAotICAgIHR5cGVSdW50aW1lU2VydmVyXyA9IG5ldyBUeXBlUnVudGltZVNlcnZlcigpOwotICAgIAotICAgIHR5cGVSdW50aW1lU2VydmVyXy5zZXRUeXBlSWQoIHR5cGUgKTsKLSAgICB0eXBlUnVudGltZVNlcnZlcl8uc2V0UnVudGltZUlkKCBydW50aW1lICk7Ci0gICAgdHlwZVJ1bnRpbWVTZXJ2ZXJfLnNldFNlcnZlcklkKCBmYWN0b3J5SUQgKTsKLSAgICAKLSAgICAvL0RlZmF1bHQgdGhlIHR5cGVJZCBmcm9tIHRoZSBpbml0aWFsIHNlbGVjdGlvbgotICAgIFN0cmluZ1tdIHR5cGVJZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VUeXBlQnlTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbl8pOwotCi0gICAgaWYgKHR5cGVJZHMhPW51bGwgJiYgdHlwZUlkcy5sZW5ndGg+MCkKLSAgICB7Ci0gICAgICB0eXBlUnVudGltZVNlcnZlcl8uc2V0VHlwZUlkKHR5cGVJZHNbMF0pOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaW5pdGlhbFNlbGVjdGlvbl8gPSBzZWxlY3Rpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7IAotICAgIHJldHVybiB0eXBlUnVudGltZVNlcnZlcl87Ci0gIH0KLQotICBwdWJsaWMgQm9vbGVhbiBnZXRTdGFydFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRTdGFydFdlYlNlcnZpY2UoKSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBCb29sZWFuIGdldFB1Ymxpc2hTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbiggZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkgKTsKLSAgfQotCi0gIHB1YmxpYyBCb29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBCb29sZWFuKCBnZXRTY2VuYXJpb0NvbnRleHQoKS5nZXRHZW5lcmF0ZVByb3h5KCkgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhbiBnZXRNb25pdG9yU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW4oZ2V0U2NlbmFyaW9Db250ZXh0KCkuZ2V0TW9uaXRvcldlYlNlcnZpY2UoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL1NlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5NWM5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkNsaWVudFdpemFyZFdpZGdldE91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQgZXh0ZW5kcyBDbGllbnRXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kCi17ICAgIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBzdGFydFNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgIHRlc3RTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBwdWJsaXNoU2VydmljZV87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgZ2VuZXJhdGVQcm94eV87Ci0JcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgICByZXNvdXJjZUNvbnRleHRfOwotICAgIAotICAKLSAgcHVibGljIFR5cGVSdW50aW1lU2VydmVyIGdldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcigpCi0gIHsgCi0gICAgcmV0dXJuIHR5cGVSdW50aW1lU2VydmVyXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gc3RhcnRTZXJ2aWNlXzsgIAotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0VGVzdFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RTZXJ2aWNlXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHB1Ymxpc2hTZXJ2aWNlXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlUHJveHlfOyAgCi0gIH0KLQkKLQlwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpCi0JewotCQlyZXR1cm4gcmVzb3VyY2VDb250ZXh0XzsKLQl9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGdlbmVyYXRlUHJveHlfIFRoZSBnZW5lcmF0ZVByb3h5XyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gZ2VuZXJhdGVQcm94eV8pCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRlUHJveHlfID0gZ2VuZXJhdGVQcm94eV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBwdWJsaXNoU2VydmljZV8gVGhlIHB1Ymxpc2hTZXJ2aWNlXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQdWJsaXNoU2VydmljZShib29sZWFuIHB1Ymxpc2hTZXJ2aWNlXykKLSAgewotICAgIHRoaXMucHVibGlzaFNlcnZpY2VfID0gcHVibGlzaFNlcnZpY2VfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gc3RhcnRTZXJ2aWNlXyBUaGUgc3RhcnRTZXJ2aWNlXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGFydFNlcnZpY2UoYm9vbGVhbiBzdGFydFNlcnZpY2VfKQotICB7Ci0gICAgdGhpcy5zdGFydFNlcnZpY2VfID0gc3RhcnRTZXJ2aWNlXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHRlc3RTZXJ2aWNlXyBUaGUgdGVzdFNlcnZpY2VfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RTZXJ2aWNlKGJvb2xlYW4gdGVzdFNlcnZpY2VfKQotICB7Ci0gICAgdGhpcy50ZXN0U2VydmljZV8gPSB0ZXN0U2VydmljZV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSB0eXBlUnVudGltZVNlcnZlcl8gVGhlIHR5cGVSdW50aW1lU2VydmVyXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgdHlwZVJ1bnRpbWVTZXJ2ZXJfKQotICB7Ci0gICAgdGhpcy50eXBlUnVudGltZVNlcnZlcl8gPSB0eXBlUnVudGltZVNlcnZlcl87Ci0gIH0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoUmVzb3VyY2VDb250ZXh0IHJjKQotCXsKLQkJcmVzb3VyY2VDb250ZXh0XyA9IHJjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9FeHBvcnRXU1dpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0V4cG9ydFdTV2lkZ2V0QmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYzMDcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL0V4cG9ydFdTV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLlB1Ymxpc2hXU1dpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwb3J0V1NXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5OwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnk7Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5OwotICBwcml2YXRlIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50IHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZzsKLQotICBwdWJsaWMgRXhwb3J0V1NXaWRnZXRCaW5kaW5nKCkKLSAgewotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZyA9IG5ldyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudCgpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgU2VxdWVuY2VGcmFnbWVudCByb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgICAgICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiV1NFeHBvcnQiKSk7Ci0gICAgICAgICAgICAgICByb290LmFkZChwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcpOwotICAgICAgICAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCksICIiKSk7Ci0gICAgICAgICAgICAgICByZXR1cm4gcm9vdDsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5jYW5GaW5pc2hSZWdpc3RyeSA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICAgIHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZy5yZWdpc3RlckNhbkZpbmlzaCh0aGlzLmNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuZGF0YU1hcHBpbmdSZWdpc3RyeSA9IGRhdGFSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJEYXRhTWFwcGluZ3ModGhpcy5kYXRhTWFwcGluZ1JlZ2lzdHJ5KTsKLSAgICAKLSAgICAvLyBQdWJsaXNoVG9Qcml2YXRlVURESUNvbW1hbmRGcmFnbWVudAotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9Qcml2YXRlVURESSIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBMYXVuY2hXZWJTZXJ2aWNlc0V4cGxvcmVyQ29tbWFuZAotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJGb3JjZUxhdW5jaE91dHNpZGVJREUiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHVibGlzaFdTV2lkZ2V0LmNsYXNzLCAiTGF1bmNoT3B0aW9ucyIsIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuY2xhc3MpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgU3RyaW5nICAgICAgIHBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiOwotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyh0aGlzLndpZGdldFJlZ2lzdHJ5KTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCgiV1NFeHBvcnQiLCAKLSAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfV1NfUFVCTElTSCIpLAotICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTX1BVQkxJU0giKSwKLSAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgewotICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgUHVibGlzaFdTV2lkZ2V0KHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9iaW5kaW5nL1B1Ymxpc2hXU0RMV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvUHVibGlzaFdTRExXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGQ0YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvUHVibGlzaFdTRExXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLmJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TaW1wbGVGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFB1Ymxpc2hXU0RMV2lkZ2V0QmluZGluZyBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHB1YmxpYyBQdWJsaXNoV1NETFdpZGdldEJpbmRpbmcoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlRnJhZ21lbnQoKTsgIAotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpLCAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9TZXJ2ZXJXaWRnZXRCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvYmluZGluZy9TZXJ2ZXJXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODNmNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL2JpbmRpbmcvU2VydmVyV2lkZ2V0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuYmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ29tcHV0ZUVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkNyZWF0ZU1vbml0b3JDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLk1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1hbmQuZGF0YS5TZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5GaW5pc2hGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uLkNsaWVudFJvb3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuZXh0ZW5zaW9uLlByZUNsaWVudERldmVsb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5zZWxlY3Rpb24uU2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuUHVibGlzaFdTV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5DbGllbnRFeHRlbnNpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLkNsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zLlNlcnZlckV4dGVuc2lvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuT2JqZWN0U2VsZWN0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0Lk9iamVjdFNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5DbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuQ2xpZW50VGVzdFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaERlZmF1bHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuRmluaXNoSmF2YVRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LkZpbmlzaFRlc3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy50ZXN0LlRlc3REZWZhdWx0aW5nRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2l6YXJkLldlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb24uUHJlU2VydmljZURldmVsb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS5leHRlbnNpb24uU2VydmljZVJvb3RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5ydW50aW1lLlNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMucnVudGltZS5TZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMudGVzdC5MYXVuY2hGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0LlNlcnZpY2VUZXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMudGVzdC5TZXJ2aWNlVGVzdFdpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0LldlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2VsZWN0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSAgICAgIHdpZGdldFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFNYXBwaW5nUmVnaXN0cnlfOwotICBwcml2YXRlIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50IHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZzsKLQotICBwdWJsaWMgU2VydmVyV2lkZ2V0QmluZGluZygpCi0gIHsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcgPSBuZXcgUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNjcmVhdGUoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgY3JlYXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSgpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlUm9vdENvbW1hbmRGcmFnbWVudCgpOyAgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICB9OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyQ2FuRmluaXNoKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goQ2FuRmluaXNoUmVnaXN0cnkgY2FuRmluaXNoUmVnaXN0cnkpCi0gIHsKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8gPSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJDYW5GaW5pc2goY2FuRmluaXNoUmVnaXN0cnlfKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYyksIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeV8gPSBkYXRhUmVnaXN0cnk7Ci0gICAgCi0gICAgLy8gQmVmb3JlIFNlcnZlcldpemFyZFdpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJNb25pdG9yU2VydmljZSIsIENyZWF0ZU1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIk1vbml0b3JTZXJ2aWNlIiwgQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIFNlcnZlcldpemFyZFdpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQWZ0ZXIgU2VydmVyV2l6YXJkV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlN0YXJ0U2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiTW9uaXRvclNlcnZpY2UiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldC5jbGFzcywgIlJlc291cmNlQ29udGV4dCIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIEJlZm9yZSBPYmplY3RTZWxlY3Rpb25XaWRnZXQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRUZXN0V2lkZ2V0LmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIAotICAgIC8vIEJlZm9yZSBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlQ29tcG9uZW50TmFtZSIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFYXJDb21wb25lbnROYW1lIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZUNvbXBvbmVudFR5cGUiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50TmFtZSIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhckNvbXBvbmVudE5hbWUiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VKMkVFVmVyc2lvbiIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZU5lZWRFQVIiLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgICAgICAgICAKLSAgICAvLyBBZnRlciBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0ICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlNlcnZpY2VKMkVFVmVyc2lvbiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0gICAgLy9kYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiU2VydmljZVByb2plY3QyRUFSUHJvamVjdCIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiU2VydmljZVByb2plY3ROYW1lIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJTZXJ2aWNlQ29tcG9uZW50TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiU2VydmljZUVhclByb2plY3ROYW1lIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJTZXJ2aWNlRWFyQ29tcG9uZW50TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIkNsaWVudEVhclByb2plY3ROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRFYXJDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJDbGllbnRDb21wb25lbnRUeXBlIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJTZXJ2aWNlTmVlZEVBUiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiQ2xpZW50TmVlZEVBUiIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAKLQotICAgIC8vIE1hcCBmcmFnbWVudHMgdGhhdCBkZXBlbmQgb24gZGF0YS4gICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0LmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRFeHRlbnNpb25GcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBDcmVhdGVNb25pdG9yQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENyZWF0ZU1vbml0b3JDb21tYW5kLmNsYXNzLCAiTW9uaXRvcmVkUG9ydCIsIENvbXB1dGVFbmRwb2ludENvbW1hbmQuY2xhc3MpOwotICAgIAotICAgIC8vIENvbXB1dGVFbmRwb2ludENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzLCAiRW5kcG9pbnQiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ29tcHV0ZUVuZHBvaW50Q29tbWFuZC5jbGFzcywgIkVuZHBvaW50IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0KLSAgICAvL1NlcnZpY2VUZXN0V2lkZ2V0IG1hcHBpbmdzICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFNlcnZpY2VUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIENyZWF0ZU1vbml0b3JDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFNlcnZpY2VUZXN0V2lkZ2V0LmNsYXNzKTsKLQlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckluc3RhbmNlSWQiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDb21wdXRlRW5kcG9pbnRDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVRlc3RGYWNpbGl0aWVzIiwgU2VydmljZVRlc3RXaWRnZXQuY2xhc3MpOyAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiRW52aXJvbm1lbnQiLCBTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmljZVRlc3RXaWRnZXQuY2xhc3MsICJMYXVuY2hlZFNlcnZpY2VUZXN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIkxhdW5jaGVkU2VydmljZVRlc3ROYW1lIiwgRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIkxhdW5jaGVkU2VydmljZVRlc3ROYW1lIiwgVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcyk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIlByb3h5UHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm94eVByb2plY3RFQVIiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdFR5cGUiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3RUeXBlSWQiLCBudWxsKTsgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVyIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJGYWN0b3J5SWQiLCBudWxsKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIG51bGwpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50U2VydmVyRGVwbG95YWJsZUNvbmZpZ0NvbW1hbmQuY2xhc3MsICJBZGRlZFByb2plY3RUb1NlcnZlciIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBCZWZvcmUgQ2xpZW50IFRlc3Qgd2lkZ2V0LgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIAotICAgIC8vIEJlZm9yZSBDbGllbnRUZXN0V2lkZ2V0Ci0gICAgICAgIAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIiwgQ2xpZW50VGVzdFdpZGdldC5jbGFzcyApOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFRlc3REZWZhdWx0aW5nRnJhZ21lbnQuY2xhc3MsICJUZXN0RmFjaWxpdHkiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJGb2xkZXIiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3RXaWRnZXQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJSdW5DbGllbnRUZXN0IixDbGllbnRUZXN0V2lkZ2V0LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiTWV0aG9kcyIsQ2xpZW50VGVzdFdpZGdldC5jbGFzcyk7Ci0gICAgCi0gICAgCi0gICAgLy8gQWZ0ZXIgQ2xpZW50VGVzdFdpZGdldCAgICAKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiU2FtcGxlUHJvamVjdEVBUiIsRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixGaW5pc2hEZWZhdWx0Q29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIkpzcEZvbGRlciIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudFRlc3RXaWRnZXQuY2xhc3MsICJNZXRob2RzIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiVGVzdFNlcnZpY2UiLEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50VGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsRmluaXNoVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRUZXN0V2lkZ2V0LmNsYXNzLCAiSXNUZXN0V2lkZ2V0IixGaW5pc2hUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgIC8vIFB1Ymxpc2hXU1dpZGdldAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9QdWJsaWNVRERJIiwgbnVsbCk7Ci0gICAgCi0gICAgLy8gUHVibGlzaFRvUHJpdmF0ZVVERElDb21tYW5kRnJhZ21lbnQKLSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9Qcml2YXRlVURESSIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsKLSAgICAKLSAgICAvLyBMYXVuY2hXZWJTZXJ2aWNlc0V4cGxvcmVyQ29tbWFuZAotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIlB1Ymxpc2hUb1ByaXZhdGVVRERJIiwgTGF1bmNoRnJhZ21lbnQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIlB1Ymxpc2hUb1B1YmxpY1VEREkiLCBMYXVuY2hGcmFnbWVudC5jbGFzcyk7Ci0gICAgLy8gVE9ETyBOZWVkIGRlZmF1bHRzIGZvciB0aGVzZSBwcm9wZXJ0aWVzLgotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkZvcmNlTGF1bmNoT3V0c2lkZUlERSIsIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuY2xhc3MpOwotICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFB1Ymxpc2hXU1dpZGdldC5jbGFzcywgIkxhdW5jaE9wdGlvbnMiLCBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmNsYXNzKTsKLSAgCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoV2lkZ2V0UmVnaXN0cnkgd2lkZ2V0UmVnaXN0cnkpCi0gIHsKLSAgICBTdHJpbmcgICAgICAgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyggcGx1Z2luSWRfICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnlfID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgcHVibGlzaFRvUHJpdmF0ZVVERElDbWRGcmFnLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mod2lkZ2V0UmVnaXN0cnlfKTsKLQotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIlNlcnZlcldpemFyZFdpZGdldCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19QUk9KRUNUIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfUFJPSkVDVCIpLAotCQkJCSAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0JCQkJICAgICAgICB7Ci0JCQkJICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCQkJCSAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXQoIHRydWUgKTsKLQkJCQkgICAgICAgICAgfQotCQkJCSAgICAgICAgfSApOwotCi0gICAgTWVzc2FnZVV0aWxzIGNyZWF0aW9uVUlNZXNzYWdlVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkucGx1Z2luIiwgdGhpcyk7Ci0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiT2JqZWN0U2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvblVJTWVzc2FnZVV0aWxzLmdldE1lc3NhZ2UoIlBBR0VfVElUTEVfT0JKRUNUX1NFTEVDVElPTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25VSU1lc3NhZ2VVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfT0JKRUNUX1NFTEVDVElPTiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RTZWxlY3Rpb25XaWRnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICB3aWRnZXRSZWdpc3RyeS5hZGQoICJTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTX1JVTlRJTUVfU0VMRUNUSU9OIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfUlVOVElNRV9TRUxFQ1RJT04iKSwKLQkJCQkJCW5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotCQkJCQkJICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLQkJCQkJCSAgewotCQkJCQkJICAgIHJldHVybiBuZXcgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldCgpOwotCQkJCQkJICB9Ci0JCQkJCQl9ICk7IAotICAgIAotICAgIHdpZGdldFJlZ2lzdHJ5LmFkZCggIlRlc3RTZXJ2aWNlIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX1RJVExFX1dTVEVTVCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9ERVNDX1dTVEVTVCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2aWNlVGVzdFdpZGdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiQ2xpZW50VGVzdFdpZGdldCIsIAotICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19TQU1QTEUiKSwKLSAgICAgICAgICAgIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlBBR0VfREVTQ19XU19TQU1QTEUiKSwKLSAgICAgICAgICAgIG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50VGVzdFdpZGdldCgpOyAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCAiUHVibGlzaCIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9XU19QVUJMSVNIIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfV1NfUFVCTElTSCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQdWJsaXNoV1NXaWRnZXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLSAgfQotICAgIAotICBwcml2YXRlIGNsYXNzIEluaXRSZWdpc3RyaWVzIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotICB7ICAKLSAgICBwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRUeXBlUmVnaXN0cnkgY2xpZW50UmVnaXN0cnlfID0gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIHByaXZhdGUgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgc2VydmVyUmVnaXN0cnlfID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAKLSAgICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICAgIHsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyApOwotICAgICAgY2xpZW50UmVnaXN0cnlfLnNldFdpZGdldFJlZ2lzdHJ5KCB3aWRnZXRSZWdpc3RyeV8gKTsKLSAgICAgIGNsaWVudFJlZ2lzdHJ5Xy5zZXRDYW5GaW5pc2hSZWdpc3RyeSggY2FuRmluaXNoUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIHNlcnZlclJlZ2lzdHJ5Xy5zZXREYXRhTWFwcGluZ1JlZ2lzdHJ5KCBkYXRhTWFwcGluZ1JlZ2lzdHJ5XyApOwotICAgICAgc2VydmVyUmVnaXN0cnlfLnNldFdpZGdldFJlZ2lzdHJ5KCB3aWRnZXRSZWdpc3RyeV8gKTsKLSAgICAgIHNlcnZlclJlZ2lzdHJ5Xy5zZXRDYW5GaW5pc2hSZWdpc3RyeSggY2FuRmluaXNoUmVnaXN0cnlfICk7Ci0gICAgICAKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBDbGllbnRGcmFnbWVudCBleHRlbmRzIEJvb2xlYW5GcmFnbWVudAotICB7Ci0gICAgYm9vbGVhbiBnZW5Qcm94eV8gPSBmYWxzZTsKLSAgICAKLSAgICBwdWJsaWMgQ2xpZW50RnJhZ21lbnQoKQotICAgIHsgICAgICAKLSAgICAgIHNldENvbmRpdGlvbiggbmV3IENvbmRpdGlvbigpIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5Qcm94eV87Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgIAotICAgICAgU2VxdWVuY2VGcmFnbWVudCBjbGllbnRSb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgIAotICAgICAgY2xpZW50Um9vdC5hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kKCBmYWxzZSApLCAiIikpOwotICAgICAgLy9jbGllbnRSb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kKCksICIiKSk7IC8vTm90ZTogYWRkZWQgaGVyZSBmb3IgY2xpZW50Ci0gICAgICAvL2NsaWVudFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZCgpLCAiIikpOyAgICAgIAotICAgICAgLy9jbGllbnRSb290LmFkZCggbmV3IENsaWVudEV4dGVuc2lvbkZyYWdtZW50KCkgKTsKLSAgICAgIGNsaWVudFJvb3QuYWRkKCBuZXcgQ2xpZW50Um9vdEZyYWdtZW50KCkgKTsKLSAgICAgIGNsaWVudFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kKCksICIiICkpOwotICAgICAgCi0gICAgICBzZXRUcnVlRnJhZ21lbnQoIGNsaWVudFJvb3QgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eSggYm9vbGVhbiBnZW5Qcm94eSApCi0gICAgewotICAgICAgZ2VuUHJveHlfID0gZ2VuUHJveHk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNyZWdpc3RlckRhdGFNYXBwaW5ncyhvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnkpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gICAgewotICAgICAgLy8gTWFwIHRoZSBvdXRwdXQgb2YgdGhlIHNlcnZpY2Ugc2NlbmFyaW8gdG8gdGhlIGNsaWVudCBzY2VuYXJpby4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZXNQYXJzZXIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotCSAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlU2VydmVyRmFjdG9yeUlkIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MgKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckluc3RhbmNlSWQiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyApOwotCSAgCi0gICAgICAKLSAgICAgIC8vIFNldHVwIHRoZSBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC4KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgICAgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MpOyAgICAgICAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SjJFRVZlcnNpb24iLCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgUHJlQ2xpZW50RGV2ZWxvcENvbW1hbmQuY2xhc3MsICJNb2R1bGUiLCBudWxsICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0VHlwZSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiTW9kdWxlVHlwZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzLCAiRWFyIiwgbnVsbCApOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiV3NkbFVSSSIsIFByZUNsaWVudERldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVDbGllbnREZXZlbG9wQ29tbWFuZC5jbGFzcywgIldlYlNlcnZpY2UiLCBDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiV2ViU2VydmljZUNsaWVudCIsIG51bGwgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgU2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQgZXh0ZW5kcyBTZXF1ZW5jZUZyYWdtZW50Ci0gIHsKLSAgICBwdWJsaWMgU2VydmljZVJvb3RDb21tYW5kRnJhZ21lbnQoKQotICAgIHsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgSW5pdFJlZ2lzdHJpZXMoKSwgIiIgKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpLCAiIikpOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoICJTZXJ2ZXJXaXphcmRXaWRnZXQiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZCggbmV3IE9iamVjdFNlbGVjdGlvbkZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIlNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQiICkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQoKSwgIiIpKTsKLSAgICAgIC8vYWRkKG5ldyBTaW1wbGVGcmFnbWVudChuZXcgU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kKCksICIiKSk7IC8vTm90ZTogYWRkZWQgaGVyZSAgICAgICAgICAgIAotICAgICAgLy9hZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggbmV3IENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZCgpLCAiIikpOwotICAgICAgLy9hZGQoIG5ldyBTZXJ2ZXJFeHRlbnNpb25GcmFnbWVudCgpICk7Ci0JICBhZGQoIG5ldyBTZXJ2aWNlUm9vdEZyYWdtZW50KCkgKTsKLSAgICAgIGFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCgpLCAiIiApKTsKLSAgICAgIGFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IENyZWF0ZU1vbml0b3JDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQobmV3IFNpbXBsZUZyYWdtZW50KG5ldyBDb21wdXRlRW5kcG9pbnRDb21tYW5kKCksICIiKSk7Ci0gICAgICBhZGQoIG5ldyBTZXJ2aWNlVGVzdEZyYWdtZW50KCAiVGVzdFNlcnZpY2UiKSApOwotICAgICAgYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFRlc3REZWZhdWx0aW5nRnJhZ21lbnQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50RnJhZ21lbnQoKSApOwotLy8gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudChuZXcgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQoKSwiIikpOwotICAgICAgYWRkKCBuZXcgQ2xpZW50VGVzdEZyYWdtZW50KCAiQ2xpZW50VGVzdFdpZGdldCIpICk7Ci0gICAgICBhZGQoIG5ldyBTaW1wbGVGcmFnbWVudCggIlB1Ymxpc2giKSApOwotICAgICAgYWRkKHB1Ymxpc2hUb1ByaXZhdGVVRERJQ21kRnJhZyk7Ci0gICAgICBhZGQobmV3IExhdW5jaEZyYWdtZW50KCkpOwotICAgICAgYWRkKG5ldyBGaW5pc2hGcmFnbWVudCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkKLSAgICB7Ci0gICAgICBwdWJsaXNoVG9Qcml2YXRlVURESUNtZEZyYWcucmVnaXN0ZXJEYXRhTWFwcGluZ3MoZGF0YU1hcHBpbmdSZWdpc3RyeV8pOyAgIAotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0KLSAgICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VsZWN0aW9uQ29tbWFuZC5jbGFzcywgIkluaXRpYWxTZWxlY3Rpb24iLCBTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgbnVsbCk7Ci0gICAgICAvL2RhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MsICJJbml0aWFsU2VsZWN0aW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhPYmplY3RTZWxlY3Rpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiT2JqZWN0U2VsZWN0aW9uIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbFNlbGVjdGlvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEluaXRpYWxTZWxlY3Rpb24iLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbFByb2plY3QiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJQcm9qZWN0IiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbFByb2plY3QiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJDb21wb25lbnROYW1lIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiSW5pdGlhbENvbXBvbmVudE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJDb21wb25lbnROYW1lIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50SW5pdGlhbENvbXBvbmVudE5hbWUiLCBudWxsKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKE9iamVjdFNlbGVjdGlvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlc1BhcnNlciIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzICk7Ci0gICAgICAKLSAgICAgIC8vIE1hcCBTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MpOyAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlB1Ymxpc2hTZXJ2aWNlIiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAJICAKLSAgICAgIC8vIE1hcCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLgotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIE9iamVjdFNlbGVjdGlvbkZyYWdtZW50LmNsYXNzLCAiVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUHVibGlzaFNlcnZpY2UiLCBQdWJsaXNoV1NXaWRnZXQuY2xhc3MsICJQdWJsaXNoVG9QdWJsaWNVRERJIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiUmVzb3VyY2VDb250ZXh0IiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICAvL3RvIHRoZSB0ZXN0IHdpemFyZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBTZXJ2aWNlVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJXc2RsVVJJIiwgV1NETFRlc3RMYXVuY2hDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLQkgIAotICAgICAgCi0gICAgICAvLyBNYXAgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIC8vZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVByb2plY3QyRUFSUHJvamVjdCIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFYXJQcm9qZWN0TmFtZSIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VDb21wb25lbnROYW1lIiwgU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZUVhckNvbXBvbmVudE5hbWUiLCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJSdW50aW1lMkNsaWVudFR5cGVzIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRFYXJQcm9qZWN0TmFtZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEVhckNvbXBvbmVudE5hbWUiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRDb21wb25lbnROYW1lIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50Q29tcG9uZW50VHlwZSIsIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VKMkVFVmVyc2lvbiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIENsaWVudEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJSdW50aW1lU2VsZWN0aW9uV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlTmVlZEVBUiIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudE5lZWRFQVIiLCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAgICAgIAotICAgICAgLy8gTWFwIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VUeXBlUnVudGltZVNlcnZlciIsIFNlcnZlckV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBTZXJ2aWNlVGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUHVibGlzaCIsIFB1Ymxpc2hUb1ByaXZhdGVVRERJQ29tbWFuZEZyYWdtZW50LmNsYXNzKTsgICAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIixXU0RMVGVzdExhdW5jaENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQkgIAotCSAgICAvLyBTZXR1cCB0aGUgUHJlU2VydmljZURldmVsb3BDb21tYW5kLgotCQkJLy8KLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiVGVzdFNlcnZpY2UiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJQdWJsaXNoU2VydmljZSIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIkdlbmVyYXRlUHJveHkiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOyAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQuY2xhc3MsICJSZXNvdXJjZUNvbnRleHQiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwkJCQotCQkJLy8KLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVR5cGVSdW50aW1lU2VydmVyIiwgUHJlU2VydmljZURldmVsb3BDb21tYW5kLmNsYXNzICk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlSjJFRVZlcnNpb24iLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIk1vZHVsZSIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3RFQVIiLCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJFYXIiLCBudWxsICk7Ci0gICAgICAvLwotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyggT2JqZWN0U2VsZWN0aW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIk9iamVjdFNlbGVjdGlvbiIsIFByZVNlcnZpY2VEZXZlbG9wQ29tbWFuZC5jbGFzcywgIlNlbGVjdGlvbiIsIG5ldyBTZWxlY3Rpb25UcmFuc2Zvcm1lcigpICk7Ci0JCQkKLQkJCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKCBQcmVTZXJ2aWNlRGV2ZWxvcENvbW1hbmQuY2xhc3MsICJXZWJTZXJ2aWNlIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcyApOwotICAgICAgCi0gICAgICAvLyBNYXAgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MsICJQcm9qZWN0TmFtZSIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0RUFSIiwgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCAiRWFyUHJvamVjdE5hbWUiLCBudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyU2VydmVyIiwgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCJTZXJ2ZXJGYWN0b3J5SWQiLG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2aWNlSjJFRVZlcnNpb24iLCBDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIlNlcnZpY2VOZWVkRUFSIixDcmVhdGVTZXJ2aWNlUHJvamVjdENvbW1hbmQuY2xhc3MsIk5lZWRFQVIiLG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIklzU2VydmljZVByb2plY3RFSkIiLENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcyk7Ci0gICAgICAKLSAKLSAgICAgIC8vIE1hcCBDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudEV4dGVuc2lvbkZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiQ2xpZW50SWRzIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFR5cGVSdW50aW1lU2VydmVyIiwgRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RGcmFnbWVudC5jbGFzcyApOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJUZXN0U2VydmljZSIsIENsaWVudFRlc3RXaWRnZXQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiTGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUiLCBXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIEFkZE1vZHVsZURlcGVuZGVuY2llc0NvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRKMkVFVmVyc2lvbiIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKMmVlVmVyc2lvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXIiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiUnVudGltZTJDbGllbnRUeXBlcyIsIFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaEphdmFUZXN0RnJhZ21lbnQuY2xhc3MpOwotICAgICAgCi0gICAgICAvL1NlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTdGFydFNlcnZpY2UiLCBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIldzZGxVUkkiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckluc3RhbmNlSWQiLCBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsIlNlcnZpY2VFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclNlcnZlciIsIFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywiU2VydmljZVNlcnZlclR5cGVJRCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIiLCBTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIG51bGwgKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCIsIFNlcnZlckV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0YW5jZUlkIixudWxsKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckRlcGxveWFibGVDb25maWd1cmF0aW9uQ29tbWFuZC5jbGFzcywgIlNhbXBsZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsIkNsaWVudEV4aXN0aW5nU2VydmVySW5zdGFuY2VJZCIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRGVwbG95YWJsZUNvbmZpZ3VyYXRpb25Db21tYW5kLmNsYXNzLCAiU2VydmljZUV4aXN0aW5nU2VydmVySW5zdElkIiwgQ3JlYXRlU2VydmljZVByb2plY3RDb21tYW5kLmNsYXNzLCJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJBZGRlZFByb2plY3RUb1NlcnZlciIsIENyZWF0ZVNlcnZpY2VQcm9qZWN0Q29tbWFuZC5jbGFzcyk7ICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2VydmljZVNlcnZlckluc3RhbmNlSWQiLCBDcmVhdGVNb25pdG9yQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIlNlcnZpY2VFeGlzdGluZ1NlcnZlckluc3RJZCIsIEZpbmlzaERlZmF1bHRDb21tYW5kLmNsYXNzLCAiRXhpc3RpbmdTZXJ2ZXJJZCIsIG51bGwpOwotCi0gICAgICAvLyBNYXAgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZCBmb3IgU2VydmVyU3RhcnQoKQotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0RUFSIiwgU2VydmVyRXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkVhclByb2plY3ROYW1lIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBTZXJ2ZXJFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCJFeGlzdGluZ1NlcnZlcklkIiwgbnVsbCk7Ci0gICAgICAgICAgCi0gICAgICAvLyBNYXAgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdCIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJveHlQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50UHJvamVjdEVBUiIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiUHJveHlQcm9qZWN0RUFSIiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBDcmVhdGVDbGllbnRQcm9qZWN0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVyIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlciIsIENyZWF0ZUNsaWVudFByb2plY3RDb21tYW5kLmNsYXNzLCAiU2VydmVyRmFjdG9yeUlkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudEoyRUVWZXJzaW9uIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJKMkVFVmVyc2lvbiIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnROZWVkRUFSIiwgQ3JlYXRlQ2xpZW50UHJvamVjdENvbW1hbmQuY2xhc3MsICJOZWVkRUFSIiwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgLy9TZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQgZm9yIGNsaWVudCBzaWRlCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFByb2plY3QiLCBDbGllbnRTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlnQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLCBuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJDbGllbnRUeXBlUnVudGltZVNlcnZlciIsIG51bGwpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRTZXJ2ZXJJbnN0YW5jZSIsIENsaWVudFNlcnZlckRlcGxveWFibGVDb25maWdDb21tYW5kLmNsYXNzLCJTYW1wbGVFeGlzdGluZ1NlcnZlciIsIG5ldyBTZXJ2ZXJJbnN0VG9JU2VydmVyVHJhbnNmb3JtZXIoKSk7Ci0KLSAgICAgIC8vIE1BUCBwb3N0IHNlcnZlciBjb25maWcgY2FsbAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0RUFSIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkVhclByb2plY3ROYW1lIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIkNsaWVudFNlcnZlckluc3RhbmNlIiwgQ2xpZW50RXh0ZW5zaW9uT3V0cHV0Q29tbWFuZC5jbGFzcywgIkV4aXN0aW5nU2VydmVySWQiLCBudWxsKTsKLSAgICAgIAotICAgICAgLy8gTWFwIENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdEZyYWdtZW50LmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJHZW5lcmF0ZVByb3h5IiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiR2VuZXJhdGVQcm94eSIsIEZpbmlzaFRlc3RGcmFnbWVudC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiUHJveHlCZWFuIiwgQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhDbGllbnRFeHRlbnNpb25PdXRwdXRDb21tYW5kLmNsYXNzLCAiU2V0RW5kcG9pbnRNZXRob2QiLCBDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLQkgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJTZXJ2ZXJJbnN0YW5jZUlkIiwgRmluaXNoRGVmYXVsdENvbW1hbmQuY2xhc3MpOwotCSAgCi0gICAgICAvLyBNYXAgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFNlcnZlckV4dGVuc2lvbk91dHB1dENvbW1hbmQuY2xhc3MsICJJc1dlYlByb2plY3RTdGFydHVwUmVxdWVzdGVkIiwgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuY2xhc3MpOwotICAgICAgCi0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJXaXphcmRXaWRnZXRPdXRwdXRDb21tYW5kLmNsYXNzLCAiU3RhcnRTZXJ2aWNlIiwgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZC5jbGFzcywgIlRlc3RTZXJ2aWNlIiwgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJTZXJ2ZXJQcm9qZWN0IiwgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuY2xhc3MsICJTZXJ2aWNlUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclNlcnZlciIsIE1hbmFnZVNlcnZlclN0YXJ0VXBDb21tYW5kLmNsYXNzLCJTZXJ2aWNlU2VydmVyVHlwZUlkIiwgbnVsbCk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJEZXBsb3lhYmxlQ29uZmlndXJhdGlvbkNvbW1hbmQuY2xhc3MsICJTZXJ2aWNlRXhpc3RpbmdTZXJ2ZXJJbnN0SWQiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcywiU2VydmljZUV4aXN0aW5nU2VydmVyIiwgbmV3IFNlcnZlckluc3RUb0lTZXJ2ZXJUcmFuc2Zvcm1lcigpKTsKLSAgICAgIAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJDbGllbnRQcm9qZWN0IiwgTWFuYWdlU2VydmVyU3RhcnRVcENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IiwgbmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzLCAiQ2xpZW50U2VydmVySW5zdGFuY2UiLCBNYW5hZ2VTZXJ2ZXJTdGFydFVwQ29tbWFuZC5jbGFzcywiU2FtcGxlRXhpc3RpbmdTZXJ2ZXIiLCBuZXcgU2VydmVySW5zdFRvSVNlcnZlclRyYW5zZm9ybWVyKCkpOyAgICAgIAotICAgICAgCi0gICAgICAvLyBNYXAgV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZAotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoVGVzdERlZmF1bHRpbmdGcmFnbWVudC5jbGFzcywgIlRlc3RGYWNpbGl0eSIsQ2xpZW50VGVzdERlbGVnYXRlQ29tbWFuZC5jbGFzcyk7Ci0gICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXZWJTZXJ2aWNlQ2xpZW50VGVzdEFycml2YWxDb21tYW5kLmNsYXNzLCAiRm9sZGVyIixDbGllbnRUZXN0RGVsZWdhdGVDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJKc3BGb2xkZXIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlJ1bkNsaWVudFRlc3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIk1ldGhvZHMiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3QiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOwotICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZUNsaWVudFRlc3RBcnJpdmFsQ29tbWFuZC5jbGFzcywgIlNhbXBsZVByb2plY3RFQVIiLENsaWVudFRlc3REZWxlZ2F0ZUNvbW1hbmQuY2xhc3MpOyAgICAKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0IixBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzKTsKLSAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VDbGllbnRUZXN0QXJyaXZhbENvbW1hbmQuY2xhc3MsICJTYW1wbGVQcm9qZWN0RUFSIixBZGRNb2R1bGVEZXBlbmRlbmNpZXNDb21tYW5kLmNsYXNzKTsgICAgIAotICAgIAotICAgICAgLy9NYXAgRmluaXNoIENvbW1hbmQgCi0gICAgICAKLSAgICAgIAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWE4ZmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1NlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnJ1bnRpbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbi5WYWxpZGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMucnVudGltZS5DbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuUHJvamVjdFNlbGVjdGlvbldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5ydW50aW1lLlJ1bnRpbWVTZXJ2ZXJTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndzcnQuV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5UeXBlUnVudGltZVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uLlVJVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24uU2VsZWN0aW9uTGlzdENob2ljZXM7Ci0KLS8qCi0gKgotICogU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldAotICogVGhpcyB3aWRnZXQgaXMgdGhlIHBhcmVudCB3aWRnZXQgZm9yIHNlcnZlciBhbmQgY2xpZW50IGRlcGxveW1lbnQvZW52aXJvbm1lbnQgc2V0dGluZ3MgCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSI7Ci0gIHByaXZhdGUgU3RyaW5nIGNyZWF0ZVBsdWdpbklkXyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiOwotICAKLSAgLyogQ09OVEVYVF9JRCBQV1JTMDAwMiBmb3IgdGhlIFdpemFyZCBTY2VuYXJpbyBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFJ1bnRpbWUgU2VsZWN0aW9uIFBhZ2UgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1JTX0dST1VQX1NFUlZJQ0UgPSAgIlBXUlMwMDAyIjsKLSAgCi0gIHByaXZhdGUgUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldCBydW50aW1lV2lkZ2V0XzsKLSAgcHJpdmF0ZSBQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0ICAgICAgIHByb2plY3RXaWRnZXRfOwotICBwcml2YXRlIENsaWVudFJ1bnRpbWVTZWxlY3Rpb25XaWRnZXQgY2xpZW50V2lkZ2V0XzsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyAgICAgICAgIHNlcnZpY2VDaG9pY2VzXzsKLSAgcHJpdmF0ZSBUZXh0TW9kaWZ5TGlzdGVuZXIgICAgICAgICAgIHRleHRMaXN0ZW5lcl87Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBpc0NsaWVudFdpZGdldFZpc2libGVfID0gdHJ1ZTsKLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lciApCi0gIHsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZF8gKyAiLnBsdWdpbiIsIHRoaXMgKTsKLSAgICBVSVV0aWxzICAgICAgdWlVdGlscyAgPSBuZXcgVUlVdGlscyhtc2dVdGlsc18sIGNyZWF0ZVBsdWdpbklkXyApOyAKLSAgICAKLSAgICBDb21wb3NpdGUgcm9vdCA9IHVpVXRpbHMuY3JlYXRlQ29tcG9zaXRlKCBwYXJlbnQsIDEgKTsKLSAgICAKLSAgICBUZXh0IG1lc3NhZ2VUZXh0ID0gbmV3IFRleHQoIHJvb3QsIFNXVC5XUkFQIHwgU1dULk1VTFRJIHwgU1dULlJFQURfT05MWSApOwotICAgIAotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7IAotICAgIGdkLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLSAgICAKLSAgICBtZXNzYWdlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBtZXNzYWdlVGV4dC5zZXRUZXh0KAotICAgICAgICBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0dFTkVSQUxfUFJPSkVDVF9BTkRfRUFSIiwgbmV3IFN0cmluZ1tdIHsgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19TRVJWSUNFX1NVQiIpfSkKLSAgICAgICAgKyAiXG4iCi0gICAgICAgICsgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19FQVJfUFJPSkVDVF9XSUxMX0JFX0NSRUFURUQiKSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIHNlcnZlckNvbXAgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcm9vdCwgMSwgNSwgMCApOwotICAgIAotICAgIEdyb3VwIHNlcnZlckdyb3VwID0gdWlVdGlscy5jcmVhdGVHcm91cCggc2VydmVyQ29tcCwgIkxBQkVMX1NFTEVDVElPTl9WSUVXX1RJVExFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIElORk9QT1BfUFdSU19HUk9VUF9TRVJWSUNFLAotCQkJCQkJCQkJCQkgMiwgNSwgNSk7Ci0gICAgCi0gICAgcnVudGltZVdpZGdldF8gPSBuZXcgUnVudGltZVNlcnZlclNlbGVjdGlvbldpZGdldCggZmFsc2UgKTsKLSAgICBydW50aW1lV2lkZ2V0Xy5hZGRDb250cm9scyggc2VydmVyR3JvdXAsIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgdGV4dExpc3RlbmVyXyA9IG5ldyBUZXh0TW9kaWZ5TGlzdGVuZXIoKTsKLSAgICBydW50aW1lV2lkZ2V0Xy5hZGRNb2RpZnlMaXN0ZW5lciggdGV4dExpc3RlbmVyXyApOwotICAgICAgICAgICAgIAotICAgIHByb2plY3RXaWRnZXRfID0gbmV3IFByb2plY3RTZWxlY3Rpb25XaWRnZXQoKTsKLSAgICBwcm9qZWN0V2lkZ2V0Xy5hZGRDb250cm9scyggc2VydmVyR3JvdXAsIHN0YXR1c0xpc3RlbmVyICk7Ci0gICAgCi0gICAgY2xpZW50V2lkZ2V0XyA9IG5ldyBDbGllbnRSdW50aW1lU2VsZWN0aW9uV2lkZ2V0KCk7Ci0gICAgY2xpZW50V2lkZ2V0Xy5hZGRDb250cm9scyggcm9vdCwgc3RhdHVzTGlzdGVuZXIgKTsKLQotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICAvL0lmIGdlbmVyYXRlIHByb3h5IGlzIG5vdCBzZWxlY3RlZCwgZG9uJ3Qgc2hvdyB0aGUgY2xpZW50IHBvcnRpb24gb2YgdGhlIHBhZ2UuCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoIEJvb2xlYW4gdmFsdWUgKQotICB7Ci0gICAgY2xpZW50V2lkZ2V0Xy5zZXRWaXNpYmxlKCB2YWx1ZS5ib29sZWFuVmFsdWUoKSApOyAKLSAgICBpc0NsaWVudFdpZGdldFZpc2libGVfID0gdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7ICAKLSAgfQotICAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlciggVHlwZVJ1bnRpbWVTZXJ2ZXIgaWRzICkKLSAgewotICAgIHJ1bnRpbWVXaWRnZXRfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKCB0ZXh0TGlzdGVuZXJfICk7Ci0gICAgcnVudGltZVdpZGdldF8uc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoIGlkcyApOyAgCi0gICAgcHJvamVjdFdpZGdldF8uc2V0VHlwZVJ1bnRpbWVTZXJ2ZXIoaWRzKTsKLSAgICBydW50aW1lV2lkZ2V0Xy5hZGRNb2RpZnlMaXN0ZW5lciggdGV4dExpc3RlbmVyXyApOwotICB9Ci0gIAotICBwdWJsaWMgVHlwZVJ1bnRpbWVTZXJ2ZXIgZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoKTsgIAotICB9Ci0gICAKLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZVJ1bnRpbWVTZXJ2ZXIoIFR5cGVSdW50aW1lU2VydmVyIGlkcyApCi0gIHsKLSAgICBjbGllbnRXaWRnZXRfLnNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBpZHMgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpCi0gIHsKLSAgICByZXR1cm4gcHJvamVjdFdpZGdldF8uZ2V0UHJvamVjdENob2ljZXMoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdChTZWxlY3Rpb25MaXN0Q2hvaWNlcyBzZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KQotICB7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0UHJvamVjdENob2ljZXMoc2VydmljZVByb2plY3QyRUFSUHJvamVjdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkKLSAgewotICAgIHJldHVybiBjbGllbnRXaWRnZXRfLmdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lMkNsaWVudFR5cGVzKFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJ1bnRpbWUyQ2xpZW50VHlwZXMpCi0gIHsKLSAgICBjbGllbnRXaWRnZXRfLnNldFJ1bnRpbWUyQ2xpZW50VHlwZXMocnVudGltZTJDbGllbnRUeXBlcyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUoyRUVWZXJzaW9uKCkKLSAgewotICAgIHJldHVybiBydW50aW1lV2lkZ2V0Xy5nZXRKMkVFVmVyc2lvbigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKQotICB7Ci0gICAgcnVudGltZVdpZGdldF8uc2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotICAgIHByb2plY3RXaWRnZXRfLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRKMkVFVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRKMkVFVmVyc2lvbigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRKMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb24pCi0gIHsKLSAgICBjbGllbnRXaWRnZXRfLnNldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0U2VydmljZU5lZWRFQVIoKQotICB7Ci0gICAgcmV0dXJuIHByb2plY3RXaWRnZXRfLmdldE5lZWRFQVIoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZU5lZWRFQVIoYm9vbGVhbiBiKQotICB7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0TmVlZEVBUihiKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50TmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnROZWVkRUFSKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudE5lZWRFQVIoYm9vbGVhbiBiKQotICB7Ci0gICAgY2xpZW50V2lkZ2V0Xy5zZXRDbGllbnROZWVkRUFSKGIpOwotICB9ICAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUNvbXBvbmVudE5hbWUoKQotICB7Ci0JcmV0dXJuIHByb2plY3RXaWRnZXRfLmdldENvbXBvbmVudE5hbWUoKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlQ29tcG9uZW50TmFtZSggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgcHJvamVjdFdpZGdldF8uc2V0Q29tcG9uZW50TmFtZSggbmFtZSApOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VFYXJDb21wb25lbnROYW1lKCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0V2lkZ2V0Xy5nZXRFYXJDb21wb25lbnROYW1lKCk7CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFYXJDb21wb25lbnROYW1lKCBTdHJpbmcgbmFtZSApCi0gIHsKLQlwcm9qZWN0V2lkZ2V0Xy5zZXRFYXJDb21wb25lbnROYW1lKCBuYW1lICk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUNvbXBvbmVudFR5cGUoIGludCB0eXBlICkKLSAgewotCXByb2plY3RXaWRnZXRfLnNldENvbXBvbmVudFR5cGUoIHR5cGUgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudENvbXBvbmVudE5hbWUoKQotICB7Ci0JcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50Q29tcG9uZW50TmFtZSgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudENvbXBvbmVudE5hbWUoIFN0cmluZyBuYW1lICkKLSAgewotICAgIGNsaWVudFdpZGdldF8uc2V0Q2xpZW50Q29tcG9uZW50TmFtZSggbmFtZSApOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEVhckNvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50RWFyQ29tcG9uZW50TmFtZSgpOwkgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDbGllbnRFYXJDb21wb25lbnROYW1lKCBTdHJpbmcgbmFtZSApCi0gIHsKLQljbGllbnRXaWRnZXRfLnNldENsaWVudEVhckNvbXBvbmVudE5hbWUoIG5hbWUgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudENvbXBvbmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50Q29tcG9uZW50VHlwZSgpOwotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGUoIGludCB0eXBlICkKLSAgewotCWNsaWVudFdpZGdldF8uc2V0Q2xpZW50Q29tcG9uZW50VHlwZSggdHlwZSApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVByb2plY3ROYW1lKCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0V2lkZ2V0Xy5nZXRQcm9qZWN0TmFtZSgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVhclByb2plY3ROYW1lKCkKLSAgewotCXJldHVybiBwcm9qZWN0V2lkZ2V0Xy5nZXRFYXJQcm9qZWN0TmFtZSgpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50UHJvamVjdE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50UHJvamVjdE5hbWUoKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudEVhclByb2plY3ROYW1lKCkKLSAgewotCXJldHVybiBjbGllbnRXaWRnZXRfLmdldENsaWVudEVhclByb2plY3ROYW1lKCk7ICAKLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBUZXh0TW9kaWZ5TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciAKLSAgewotICAJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICAJewotCQlpZiggY2xpZW50V2lkZ2V0Xy5pc1Zpc2libGUoKSApCi0gIAkJeyAgCSAgCi0JCSAgVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZUlkcyA9IHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCk7Ci0gIAkJICBUeXBlUnVudGltZVNlcnZlciBjbGllbnRJZHMgID0gY2xpZW50V2lkZ2V0Xy5nZXRDbGllbnRUeXBlUnVudGltZVNlcnZlcigpOwotICAJCQotICAJCSAgY2xpZW50SWRzLnNldFJ1bnRpbWVJZCggc2VydmljZUlkcy5nZXRSdW50aW1lSWQoKSApOwotICAJCSAgY2xpZW50SWRzLnNldFNlcnZlcklkKCBzZXJ2aWNlSWRzLmdldFNlcnZlcklkKCkgKTsKLSAgCQkgIGNsaWVudElkcy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKCBzZXJ2aWNlSWRzLmdldFNlcnZlckluc3RhbmNlSWQoKSApOwotCi0gIAkJICBjbGllbnRXaWRnZXRfLnNldENsaWVudFR5cGVSdW50aW1lU2VydmVyKCBjbGllbnRJZHMgKTsKLSAgCQkgIGNsaWVudFdpZGdldF8uc2V0SjJFRVZlcnNpb24ocnVudGltZVdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKSk7ICAJCi0gIAkJfQotCQkKLQkJLy9TZXQgdGhlIGN1cnJlbnQgc2VydmVyIHNlbGVjdGlvbiBhbmQgSjJFRSBsZXZlbCBvbiB0aGUgUHJvamVjdFNlbGVjdGlvbldpZGdldAotCQlwcm9qZWN0V2lkZ2V0Xy5zZXRUeXBlUnVudGltZVNlcnZlcihydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpKTsKLQkJcHJvamVjdFdpZGdldF8uc2V0SjJFRVZlcnNpb24ocnVudGltZVdpZGdldF8uZ2V0SjJFRVZlcnNpb24oKSk7Ci0gIAl9Ci0gIH0KLSAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvciNnZXRTdGF0dXMoKQotICAgKi8KLSAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSAKLSAgewotICAgIFN0YXR1cyBzZXJ2aWNlU3RhdHVzID0gcnVudGltZVdpZGdldF8uZ2V0U3RhdHVzKCk7Ci0gICAgU3RhdHVzIHByb2plY3RTdGF0dXMgPSBwcm9qZWN0V2lkZ2V0Xy5nZXRTdGF0dXMoKTsKLSAgICBTdGF0dXMgY2xpZW50U3RhdHVzICA9IGNsaWVudFdpZGdldF8uZ2V0U3RhdHVzKCk7ICAgIAotICAgIFN0YXR1cyBmaW5hbFN0YXR1cyAgID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICAKLSAgICAvLyBjYWxsIGNoaWxkIHdpZGdldHMnIGdldFN0YXR1cygpCi0gICAgaWYoIHNlcnZpY2VTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAgIHsKLSAgICAgIGZpbmFsU3RhdHVzID0gc2VydmljZVN0YXR1czsKLSAgICB9Ci0gICAgZWxzZSBpZiggY2xpZW50U3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICB7Ci0gICAgICBpZiAoaXNDbGllbnRXaWRnZXRWaXNpYmxlXykKLSAgICAgICAgZmluYWxTdGF0dXMgPSBjbGllbnRTdGF0dXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBwcm9qZWN0U3RhdHVzLmdldFNldmVyaXR5KCk9PSBTdGF0dXMuRVJST1IpIHsKLSAgICAgIGZpbmFsU3RhdHVzID0gcHJvamVjdFN0YXR1czsKLSAgICB9Ci0gICAgCi0gICAgLy9WYWxpZGF0ZSBzZXJ2aWNlIHNpZGUgc2VydmVyIHRhcmdldCBhbmQgSjJFRSBsZXZlbAotCVZhbGlkYXRpb25VdGlscyB2YWxVdGlscyA9IG5ldyBWYWxpZGF0aW9uVXRpbHMoKTsKLQlTdHJpbmcgc2VydmljZUVBUk5hbWUgID0gcHJvamVjdFdpZGdldF8uZ2V0RWFyUHJvamVjdE5hbWUoKTsKLQlTdHJpbmcgc2VydmljZVByb2pOYW1lID0gcHJvamVjdFdpZGdldF8uZ2V0UHJvamVjdE5hbWUoKTsKLQlTdHJpbmcgc2VydmljZVNlcnZlckZhY3RvcnlJZCA9IHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkuZ2V0U2VydmVySWQoKTsKLQlTdHJpbmcgc2VydmljZUoyRUVsZXZlbCA9IHJ1bnRpbWVXaWRnZXRfLmdldEoyRUVWZXJzaW9uKCk7Ci0gIFN0cmluZyBzZXJ2aWNlQ29tcG9uZW50TmFtZSA9IHByb2plY3RXaWRnZXRfLmdldENvbXBvbmVudE5hbWUoKTsKLSAgU3RyaW5nIHNlcnZpY2VFQVJDb21wb25lbnROYW1lID0gcHJvamVjdFdpZGdldF8uZ2V0RWFyQ29tcG9uZW50TmFtZSgpOwotCVN0YXR1cyBzZXJ2aWNlUHJvamVjdFN0YXR1cyA9IHZhbFV0aWxzLnZhbGlkYXRlUHJvamVjdFRhcmdldEFuZEoyRUUoc2VydmljZVByb2pOYW1lLHNlcnZpY2VDb21wb25lbnROYW1lLCBzZXJ2aWNlRUFSTmFtZSwgc2VydmljZUVBUkNvbXBvbmVudE5hbWUsIHNlcnZpY2VTZXJ2ZXJGYWN0b3J5SWQsIHNlcnZpY2VKMkVFbGV2ZWwpOwotCWlmKHNlcnZpY2VQcm9qZWN0U3RhdHVzLmdldFNldmVyaXR5KCk9PVN0YXR1cy5FUlJPUikKLQl7Ci0JCWZpbmFsU3RhdHVzID0gc2VydmljZVByb2plY3RTdGF0dXM7Ci0JfQotICAgIAotICAgIC8vRW5zdXJlIHRoZSBzZXJ2aWNlIHByb2plY3QgdHlwZSAoV2ViL0VKQikgaXMgdmFsaWQKLSAgICBpZiAoc2VydmljZVByb2pOYW1lIT1udWxsICYmIHNlcnZpY2VQcm9qTmFtZS5sZW5ndGgoKT4wKQotICAgIHsKLSAgICAgIElQcm9qZWN0IHNlcnZpY2VQcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlcnZpY2VQcm9qTmFtZSk7Ci0gICAgICBpZiAoc2VydmljZVByb2ouZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIC8vRGV0ZXJtaW5lIHdoZXRoZXIgYW4gRUpCIHByb2plY3QgaXMgcmVxdWlyZWQKLSAgICAgICAgU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQgPSBydW50aW1lV2lkZ2V0Xy5nZXRUeXBlUnVudGltZVNlcnZlcigpLmdldFJ1bnRpbWVJZCgpOwotICAgICAgICBTdHJpbmcgd2ViU2VydmljZVR5cGVJZCA9IHJ1bnRpbWVXaWRnZXRfLmdldFR5cGVSdW50aW1lU2VydmVyKCkuZ2V0VHlwZUlkKCk7Ci0JCS8vIHJza3JlZwotICAgICAgICAvL1dlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5IHdzc3J0UmVnaXN0cnkgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAvL1N0cmluZyBzZXJ2ZXJUeXBlSWQgPSB3c3NydFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChzZXJ2aWNlU2VydmVyRmFjdG9yeUlkKS5nZXRJZCgpOwotCQkvL1N0cmluZyBzZXJ2ZXJUeXBlSWQgPSB3c3NydFJlZ2lzdHJ5LmdldFdlYlNlcnZpY2VTZXJ2ZXJCeUZhY3RvcnlJZChzZXJ2aWNlU2VydmVyRmFjdG9yeUlkKS5nZXRJZCgpOwotICAgICAgICAvKiByc2tlamIKLSAgICAgICAgYm9vbGVhbiBpc0VKQlJlcXVpcmVkID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5yZXF1aXJlc0VKQk1vZHVsZUZvcihzZXJ2aWNlU2VydmVyRmFjdG9yeUlkLCB3ZWJTZXJ2aWNlUnVudGltZUlkLCB3ZWJTZXJ2aWNlVHlwZUlkKTsKLSAgICAgICAgaWYgKCFpc0VKQlJlcXVpcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgLy9DaGVjayB0aGUgV2ViIHNlcnZpY2UgdHlwZSB0byBzZWUgaWYgYW4gRUpCIHByb2plY3QgaXMgcmVxdWlyZWQKLSAgICAgICAgICAvL2lzRUpCUmVxdWlyZWQgPSB3c3NydFJlZ2lzdHJ5LnJlcXVpcmVzRUpCUHJvamVjdCh3ZWJTZXJ2aWNlVHlwZUlkKTsKLQkJCWlzRUpCUmVxdWlyZWQgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLnJlcXVpcmVzRUpCUHJvamVjdCh3ZWJTZXJ2aWNlVHlwZUlkKTsKLSAgICAgICAgfQotICAgICAgICByc2tlamIgKi8KLSAgICAgICAgYm9vbGVhbiBpc0VKQlJlcXVpcmVkID0gV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlscy5yZXF1aXJlc0VKQlByb2plY3Qod2ViU2VydmljZVJ1bnRpbWVJZCwgd2ViU2VydmljZVR5cGVJZCk7Ci0gICAgICAgIGlmIChpc0VKQlJlcXVpcmVkICYmICFKMkVFVXRpbHMuaXNFSkJDb21wb25lbnQoc2VydmljZVByb2osIHNlcnZpY2VDb21wb25lbnROYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIGZpbmFsU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0lOVkFMSURfRUpCX1BST0pFQ1QiLG5ldyBTdHJpbmdbXXtzZXJ2aWNlUHJvak5hbWV9KSxTdGF0dXMuRVJST1IpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlzRUpCUmVxdWlyZWQgJiYgIUoyRUVVdGlscy5pc1dlYkNvbXBvbmVudChzZXJ2aWNlUHJvaiwgc2VydmljZUNvbXBvbmVudE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgZmluYWxTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfSU5WQUxJRF9XRUJfUFJPSkVDVCIsbmV3IFN0cmluZ1tde3NlcnZpY2VQcm9qTmFtZX0pLFN0YXR1cy5FUlJPUik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGlzQ2xpZW50V2lkZ2V0VmlzaWJsZV8pIAotICAgIHsKLQkgICAgU3RyaW5nIGNsaWVudEVBUk5hbWUgICA9IGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50RWFyUHJvamVjdE5hbWUoKTsKLQkgICAgU3RyaW5nIGNsaWVudFByb2pOYW1lICA9IGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50UHJvamVjdE5hbWUoKTsKLQkKLSAgCQlTdHJpbmcgY2xpZW50Q29tcG9uZW50TmFtZSA9IGNsaWVudFdpZGdldF8uZ2V0Q2xpZW50Q29tcG9uZW50TmFtZSgpOwotCQkKLQkgICAgLy8gY2hlY2sgc2FtZSBFQVItbmVzcyAtLS0tLQotCSAgICBTdHJpbmcgd2FybmluZ19tc2cgPSBnZXRFQVJQcm9qZWN0V2FybmluZ01lc3NhZ2Uoc2VydmljZUVBUk5hbWUsIGNsaWVudEVBUk5hbWUpOwotCSAgICAKLQkJaWYgKHNlcnZpY2VDb21wb25lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2xpZW50Q29tcG9uZW50TmFtZSkpewotCQkJICBTdHJpbmcgZXJyX21zZyA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCAiTVNHX1NBTUVfQ0xJRU5UX0FORF9TRVJWSUNFX0NPTVBPTkVOVFMiLCBuZXcgU3RyaW5nW117ICJXRUIiIH0gKTsKLQkJCSAgZmluYWxTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgZXJyX21zZywgU3RhdHVzLkVSUk9SICk7CQkJCQotCQl9Ci0JCQotCSAgICBpZiggY2xpZW50UHJvak5hbWUgIT0gbnVsbCAmJiBzZXJ2aWNlUHJvak5hbWUgIT0gbnVsbCAmJiAKLQkgICAgICAgIGNsaWVudFByb2pOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIHNlcnZpY2VQcm9qTmFtZSApKQotCSAgICB7Ci0JCSAgU3RyaW5nIGVycm9yX21zZyA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJNU0dfU0FNRV9DTElFTlRfQU5EX1NFUlZJQ0VfUFJPSkVDVFMiKTsKLQkJICBmaW5hbFN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIGVycm9yX21zZywgU3RhdHVzLkVSUk9SKTsKLQkgICAgfQotCSAgICAKLQkJaWYgKHdhcm5pbmdfbXNnICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBpZiAoZmluYWxTdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9U3RhdHVzLkVSUk9SKQotCSAgICAgIAlyZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyggIiIsIHdhcm5pbmdfbXNnLCBTdGF0dXMuV0FSTklORyApOyAgICAgICAgICAKLQkgICAgfSAgICAgICAgIAotICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybiBmaW5hbFN0YXR1czsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0RUFSUHJvamVjdFdhcm5pbmdNZXNzYWdlKFN0cmluZyBzZXJ2aWNlRUFSTmFtZSwgU3RyaW5nIGNsaWVudEVBUk5hbWUgKSB7Ci0KLSAgICAvLyBjaGVjayBpZiBzZXJ2aWNlIGFuZCBjbGllbnQgc2hhcmUgdGhlIHNhbWUgRUFSCi0gICAgaWYgKHNlcnZpY2VFQVJOYW1lIT1udWxsICYmIGNsaWVudEVBUk5hbWUhPW51bGwpIHsKLSAgICAKLSAgICAgIGlmIChjbGllbnRFQVJOYW1lLmVxdWFsc0lnbm9yZUNhc2Uoc2VydmljZUVBUk5hbWUpICYmIGNsaWVudEVBUk5hbWUubGVuZ3RoKCk+MCkgewotICAgICAgICByZXR1cm4gbXNnVXRpbHNfLmdldE1lc3NhZ2UoIk1TR19TQU1FX0NMSUVOVF9BTkRfU0VSVklDRV9FQVJTIiwgbmV3IFN0cmluZ1tdeyAiRUFSIiB9KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLQotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy9ydW50aW1lL1NlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWYxYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3J1bnRpbWUvU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5ydW50aW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TZXJ2ZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuY29tbW9uLlNlcnZlclNlbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnJ1bnRpbWUuQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LlNlcnZpY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5GaWxlUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0Q2hvaWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1wdWJsaWMgY2xhc3MgU2VydmVyUnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgQ2xpZW50UnVudGltZVNlbGVjdGlvbldpZGdldERlZmF1bHRpbmdDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIERFRkFVTFRfQ0xJRU5UX0VBUl9QUk9KRUNUX0VYVCA9ICJFQVIiOwkKLSAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICBnZW5lcmF0ZVByb3h5XzsKLSAgCi0gIC8vIHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUgY29udGFpbnMgdGhlIGRlZmF1bHQgV2ViIHNlcnZpY2UgcnVudGltZSBhbmQgSjJFRSBsZXZlbCBiYXNlZCBvbiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24uCi0gIC8vIElmIHRoZSBpbml0aWFsU2VsZWNpdG9uIGRvZXMgbm90IHJlc3VsdCBpbiBhIHZhbGlkIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgYW5kIEoyRUUgbGV2ZWwsIHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUKLSAgLy8gc2hvdWxkIHJlbWFpbiBudWxsIGZvciB0aGUgbGlmZSBvZiB0aGlzIGluc3RhbmNlLgotICBwcml2YXRlIFdTUnVudGltZUoyRUVUeXBlIHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUgPSBudWxsOwotICAKLSAgcHJpdmF0ZSBUeXBlUnVudGltZVNlcnZlciBzZXJ2aWNlSWRzXzsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBzZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUNvbXBvbmVudE5hbWVfOwotICBwcml2YXRlIFN0cmluZyBzZXJ2aWNlRWFyQ29tcG9uZW50TmFtZV87Ci0gIHByaXZhdGUgaW50IHNlcnZpY2VDb21wb25lbnRUeXBlXzsKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBJUHJvamVjdCBpbml0aWFsUHJvamVjdF87Ci0gIHByaXZhdGUgU3RyaW5nIGluaXRpYWxDb21wb25lbnROYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZUoyRUVWZXJzaW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIHNlcnZpY2VOZWVkRUFSXyA9IHRydWU7Ci0KLSAgcHVibGljIFNlcnZlclJ1bnRpbWVTZWxlY3Rpb25XaWRnZXREZWZhdWx0aW5nQ29tbWFuZCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICBTdGF0dXMgY2xpZW50U2lkZVN0YXR1cyA9IHN1cGVyLmV4ZWN1dGUoZW52KTsKLSAgICAgaWYgKGNsaWVudFNpZGVTdGF0dXMuZ2V0U2V2ZXJpdHkoKT09U3RhdHVzLkVSUk9SKQotICAgICB7Ci0gICAgICAgcmV0dXJuIGNsaWVudFNpZGVTdGF0dXM7Ci0gICAgIH0KLSAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCi0JIC8vIHJza3JlZyBSZW1vdmUgYWxsIHRoZSBpbnRlbGxpZ2VudCBkZWZhdWx0aW5nIGZvciBNNAotICAgICAvL3NldERlZmF1bHRTZXJ2aWNlUnVudGltZUZyb21QcmVmZXJlbmNlKCk7Ci0gICAgIC8vc2V0RGVmYXVsdFNlcnZpY2VKMkVFVmVyc2lvbkZyb21QcmVmZXJlbmNlKCk7ICAgICAgCi0gICAgIC8vd2ViU2VydmljZVJ1bnRpbWVKMkVFVHlwZSA9IGdldFdTUnVudGltZUFuZEoyRUVGcm9tUHJvamVjdChpbml0aWFsUHJvamVjdF8pOwotICAgICAvL2lmICh3ZWJTZXJ2aWNlUnVudGltZUoyRUVUeXBlICE9IG51bGwpCi0gICAgIC8vewotICAgICAgIC8vc2VydmljZUoyRUVWZXJzaW9uXyA9IHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUuZ2V0SjJlZVZlcnNpb25JZCgpOwotICAgICAgIC8vc2VydmljZUlkc18uc2V0UnVudGltZUlkKHdlYlNlcnZpY2VSdW50aW1lSjJFRVR5cGUuZ2V0V3NySWQoKSk7IAotICAgICAvL30KLQkgCi0JIHNlcnZpY2VJZHNfLnNldFJ1bnRpbWVJZChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldERlZmF1bHRSdW50aW1lVmFsdWVGb3Ioc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpKTsKLQkgc2VydmljZUoyRUVWZXJzaW9uXyA9IChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSkuZ2V0SjJlZUxldmVscygpKVswXTsgCi0KLQkgCi0gICAgIC8vIFNldCB0aGUgZGVmYXVsdCBjbGllbnQgdHlwZSB0byBhIHdlYiBjbGllbnQgdHlwZS4KLSAgICAgc2V0V2ViQ2xpZW50VHlwZSgpOwotICAgICAKLSAgICAgc2V0U2VydmljZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgLy8gRGVmYXVsdCBwcm9qZWN0cyBFQVJzIGFuZCBzZXJ2ZXJzLgotICAgICBzZXREZWZhdWx0UHJvamVjdHMoKTsKLSAgICAgc2V0RGVmYXVsdEVBUnMoKTsKLSAgICAgc2V0RGVmYXVsdFNlcnZlcigpOwotICAgICB1cGRhdGVTZXJ2aWNlRUFScygpOwotICAgICB1cGRhdGVDbGllbnRQcm9qZWN0KGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCksIHNlcnZpY2VDb21wb25lbnROYW1lXywgc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpOwotICAgICB1cGRhdGVDbGllbnRFQVJzKCk7Ci0JIAotICAgICAvLyByc2tyZWcJIAotICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vQ2F0Y2ggYWxsIEV4Y2VwdGlvbnMgaW4gb3JkZXIgdG8gZ2l2ZSBzb21lIGZlZWRiYWNrIHRvIHRoZSB1c2VyCi0gICAgICBTdGF0dXMgZXJyb3JTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1RBU0tfRVhDRVBURUQiLG5ldyBTdHJpbmdbXXtlLmdldE1lc3NhZ2UoKX0pLFN0YXR1cy5FUlJPUiwgZSk7Ci0gICAgICBlbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKGVycm9yU3RhdHVzKTsKLSAgICAgIHJldHVybiBlcnJvclN0YXR1czsKLSAgICB9Ci0gICAgCi0gIH0gIAotCi0gIHByaXZhdGUgdm9pZCBzZXRTZXJ2aWNlQ29tcG9uZW50VHlwZSgpCi0gIHsKLSAgICBTZXJ2aWNlVHlwZSBzdCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0U2VydmljZVR5cGUoc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCksIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpKTsKLSAgICBpbnQgc2NlbmFyaW8gPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFNjZW5hcmlvRnJvbVR5cGVJZChzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0gICAgU3RyaW5nW10gaW5jbHVkZU5hdHVyZXMgPSBudWxsOwotICAgIHN3aXRjaCAoc2NlbmFyaW8pCi0gICAgewotICAgIGNhc2UgV2ViU2VydmljZVNjZW5hcmlvLkJPVFRPTVVQOgotICAgICAgaW5jbHVkZU5hdHVyZXMgPSBzdC5nZXRCb3R0b21VcE1vZHVsZVR5cGVzSW5jbHVkZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTjoKLSAgICAgIGluY2x1ZGVOYXR1cmVzID0gc3QuZ2V0VG9wRG93bk1vZHVsZVR5cGVzSW5jbHVkZSgpOwotICAgIH0KLSAgICAvL0lXZWJTZXJ2aWNlVHlwZSB3c3QgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VUeXBlQnlJZChzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0gICAgLy9TdHJpbmcgaW5jbHVkZU5hdHVyZXMgPSB3c3QuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoImluY2x1ZGVOYXR1cmVzIik7Ci0gICAgCi0gICAgaWYgKGluY2x1ZGVOYXR1cmVzID09IG51bGwgfHwgaW5jbHVkZU5hdHVyZXMubGVuZ3RoPT0wKQotICAgIHsKLSAgICAgIHNlcnZpY2VDb21wb25lbnRUeXBlXyA9IEoyRUVVdGlscy5XRUIgfCBKMkVFVXRpbHMuRUpCOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9TdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGVOYXR1cmVzLCAiICIpOwotICAgICAgLy9pbnQgc2l6ZSA9IHN0LmNvdW50VG9rZW5zKCk7Ci0gICAgICBBcnJheUxpc3QgbmF0dXJlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZU5hdHVyZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG5hdHVyZUxpc3QuYWRkKGluY2x1ZGVOYXR1cmVzW2ldKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgYm9vbGVhbiBjb250YWluc1dlYiA9IG5hdHVyZUxpc3QuY29udGFpbnMoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5XZWJOYXR1cmUiKTsKLSAgICAgIGJvb2xlYW4gY29udGFpbnNFSkIgPSBuYXR1cmVMaXN0LmNvbnRhaW5zKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCTmF0dXJlIik7Ci0gICAgICAKLSAgICAgIHNlcnZpY2VDb21wb25lbnRUeXBlXyA9IDA7Ci0gICAgICBpZiAoY29udGFpbnNXZWIpCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2VDb21wb25lbnRUeXBlXyA9IEoyRUVVdGlscy5XRUI7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChjb250YWluc0VKQikKLSAgICAgIHsKLSAgICAgICAgc2VydmljZUNvbXBvbmVudFR5cGVfID0gc2VydmljZUNvbXBvbmVudFR5cGVfIHwgSjJFRVV0aWxzLkVKQjsKLSAgICAgIH0KLQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldFdlYkNsaWVudFR5cGUoKQotICB7Ci0gICAgU2VsZWN0aW9uTGlzdENob2ljZXMgY2hvaWNlcyA9IGdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKTsKLSAgICBTdHJpbmcgICAgICAgICAgICAgICB3ZWJJZCAgID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5jbGllbnRQcm9qZWN0VHlwZS5XZWIiOwotICAgIAotICAgIGlmKCBjaG9pY2VzICE9IG51bGwgKQotICAgIHsKLSAgICAgIGNob2ljZXMuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKCB3ZWJJZCApOyAgIAotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGFyZ2V0IFJ1bnRpbWUgYW5kIEoyRUUgdmFsdWUKLSAgICogQHBhcmFtIHByb2plY3QKLSAgICogQHJldHVybgotICAgKi8KLSAgLy8gcnNrcmVnCi0gIC8qCi0gIHByaXZhdGUgV1NSdW50aW1lSjJFRVR5cGUgZ2V0V1NSdW50aW1lQW5kSjJFRUZyb21Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBXU1J1bnRpbWVKMkVFVHlwZSB3c3JKMkVFID0gbnVsbDsKLSAgICAvL0lmIHRoZXJlIGlzIGEgdmFsaWQgaW5pdGlhbCBzZWxlY3Rpb24sIHVzZSBpdCB0byBkZXRlcm1pbmUKLSAgICAvL3JlYXNvbmFibGUgSjJFRSB2ZXJzaW9uIGFuZCBXZWIgc2VydmljZSBydW50aW1lIHZhbHVlcwotCi0gICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0KSB8fCBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkKLSAgICAgIHsKLSAgICAgICAgV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkgd3NzcnRSZWcgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIEoyRUUgbGV2ZWwKLSAgICAgICAgaW50IHZlcnNpb25JZCA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihwcm9qZWN0KTsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBTdHJpbmcudmFsdWVPZih2ZXJzaW9uSWQpOwotICAgICAgICAKLSAgICAgICAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9mIHRoZSBwcm9qZWN0Ci0gICAgICAgIElSdW50aW1lIHJ1bnRpbWVUYXJnZXQgPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRSdW50aW1lVGFyZ2V0KHByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCA9IG51bGw7Ci0gICAgICAgIGlmIChydW50aW1lVGFyZ2V0ICE9IG51bGwpIAotICAgICAgICAgIHJ1bnRpbWVUYXJnZXRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgICAKLSAgICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIFdlYiBzZXJ2aWNlIHJ1bnRpbWUgc3VwcG9ydHMgdGhpcyBKMkVFIGxldmVsIGFuZCB0aGlzIHNlcnZlciB0YXJnZXQsIGtlZXAgaXQKLSAgICAgICAgaWYgKHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydEoyRUVMZXZlbCh2ZXJzaW9uU3RyaW5nLCBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSkgJiYKLSAgICAgICAgICAgICgocnVudGltZVRhcmdldCA9PSBudWxsKSB8fCAKLSAgICAgICAgICAgICAocnVudGltZVRhcmdldCAhPSBudWxsICYmIHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKSkKLSAgICAgICAgICAgICkKLSAgICAgICAgICAgKQotICAgICAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgICAvL1NldCB0aGUgSjJFRSBsZXZlbCBhbmQgV2ViIHNlcnZpY2UgcnVudGltZQotICAgICAgICAgICAgd3NySjJFRSA9IG5ldyBXU1J1bnRpbWVKMkVFVHlwZSgpOwotICAgICAgICAgICAgd3NySjJFRS5zZXRXc3JJZChzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSk7Ci0gICAgICAgICAgICB3c3JKMkVFLnNldEoyZWVWZXJzaW9uSWQodmVyc2lvblN0cmluZyk7Ci0gICAgICAgICAgICByZXR1cm4gd3NySjJFRTsKLQotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vTG9vayBmb3IgYSBydW50aW1lIHRoYXQgbWF0Y2hlcyBib3RoIHRoZSBKMkVFIGxldmVsIGFuZCB0aGUgc2VydmVyIHRhcmdldC4KLSAgICAgICAgICBTdHJpbmdbXSB2YWxpZFJ1bnRpbWVzID0gd3NzcnRSZWcuZ2V0UnVudGltZXNCeVR5cGUoc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRSdW50aW1lcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod3NzcnRSZWcuZG9lc1J1bnRpbWVTdXBwb3J0SjJFRUxldmVsKHZlcnNpb25TdHJpbmcsIHZhbGlkUnVudGltZXNbaV0pICYmCi0gICAgICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0ID09IG51bGwpIHx8Ci0gICAgICAgICAgICAgICAgIChydW50aW1lVGFyZ2V0IT1udWxsICYmIHdzc3J0UmVnLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlclRhcmdldChydW50aW1lVGFyZ2V0SWQsIHZhbGlkUnVudGltZXNbaV0pKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHdzckoyRUUgPSBuZXcgV1NSdW50aW1lSjJFRVR5cGUoKTsKLSAgICAgICAgICAgICAgd3NySjJFRS5zZXRXc3JJZCh2YWxpZFJ1bnRpbWVzW2ldKTsKLSAgICAgICAgICAgICAgd3NySjJFRS5zZXRKMmVlVmVyc2lvbklkKHZlcnNpb25TdHJpbmcpOwotICAgICAgICAgICAgICByZXR1cm4gd3NySjJFRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHJldHVybiB3c3JKMkVFOwotICB9Ci0gICovCi0gIC8vIHJza3JlZwotICAKLSAgLy8gcnNrcmVnCi0gIC8qCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0U2VydmljZVJ1bnRpbWVGcm9tUHJlZmVyZW5jZSgpCi0gIHsKLSAgCQotICAgIFBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTZXJ2ZXJSdW50aW1lQ29udGV4dCgpOwotICAgIFN0cmluZyBwUnVudGltZUlkID0gY29udGV4dC5nZXRSdW50aW1lSWQoKTsKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgLy9pZiB0aGUgcHJlZmVycmVkIHJ1bnRpbWUgaW4gY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlLCBzZWxlY3QgaXQuCi0gICAgaWYgKHdzc3J0UmVnLmlzUnVudGltZVN1cHBvcnRlZEZvclR5cGUoc2VydmljZUlkc18uZ2V0VHlwZUlkKCksIHBSdW50aW1lSWQpKQotICAgIHsKLSAgICAgIHNlcnZpY2VJZHNfLnNldFJ1bnRpbWVJZChwUnVudGltZUlkKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vU2V0IHRoZSBXZWIgc2VydmljZSBydW50aW1lIHRvIG9uZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgdHlwZS4KLSAgICAgIFN0cmluZ1tdIHZhbGlkUnVudGltZXMgPSB3c3NydFJlZy5nZXRSdW50aW1lc0J5VHlwZShzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSk7Ci0gICAgICBpZiAodmFsaWRSdW50aW1lcyAhPSBudWxsICYmIHZhbGlkUnVudGltZXMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2VJZHNfLnNldFJ1bnRpbWVJZCh2YWxpZFJ1bnRpbWVzWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgKi8KLSAgLy8gcnNrcmVnCi0gIAotICAvLyByc2tyZWcKLSAgLyoKLSAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRTZXJ2aWNlSjJFRVZlcnNpb25Gcm9tUHJlZmVyZW5jZSgpCi0gIHsKLSAgICBpZiAoc2VydmljZUlkc18gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcnVudGltZUlkID0gc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCk7Ci0gICAgICBpZiAocnVudGltZUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXZWJTZXJ2aWNlUnVudGltZSB3c3IgPSBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChydW50aW1lSWQpOwotICAgICAgICBpZiAod3NyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdbXSB2ZXJzaW9ucyA9IHdzci5nZXRKMkVFVmVyc2lvbnMoKTsgICAgICAgICAgCi0gICAgICAgICAgLy9JZiB0aGUgcHJlZmVycmVkIEoyRUUgdmVyc2lvbiBpcyBpbiB2ZXJzaW9ucywgcGljayB0aGUgcHJlZmVycmVkIG9uZS4gCi0gICAgICAgICAgLy9PdGhlcndpc2UsIHBpY2sgdGhlIGZpcnN0IG9uZS4KLSAgICAgICAgICBpZiAodmVyc2lvbnMgIT0gbnVsbCAmJiB2ZXJzaW9ucy5sZW5ndGggPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAJUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlQ29uc3VtcHRpb25VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNlcnZlclJ1bnRpbWVDb250ZXh0KCk7Ci0gICAgICAgICAgCVN0cmluZyBwSjJFRSA9IGNvbnRleHQuZ2V0SjJFRVZlcnNpb24oKTsKLSAgICAgICAgICAJaWYgKHBKMkVFIT1udWxsICYmIHBKMkVFLmxlbmd0aCgpPjApCi0gICAgICAgICAgCXsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8dmVyc2lvbnMubGVuZ3RoO2krKykKLSAgICAgICAgICAJICB7Ci0gICAgICAgICAgCQlpZiAodmVyc2lvbnNbaV0uZXF1YWxzKHBKMkVFKSkKLSAgICAgICAgICAJCXsKLSAgICAgICAgICAJCQlzZXJ2aWNlSjJFRVZlcnNpb25fID0gdmVyc2lvbnNbaV07Ci0gICAgICAgICAgCQkgICAgcmV0dXJuOwotICAgICAgICAgIAkJfQotICAgICAgICAgIAkgIH0KLSAgICAgICAgICAJfQotICAgICAgICAgIAlzZXJ2aWNlSjJFRVZlcnNpb25fID0gdmVyc2lvbnNbMF07Ci0gICAgICAgICAgCXJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAKLSAgKi8gCi0gIC8vIHJza3JlZwotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIG5lZWRzIGEgbG90IG9mIHdvcmsuIEl0IGRvZXMgbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBjb21wb25lbnQgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZQotICAgKiBzZWxlY3RlZCBXZWIgc2VydmljZSB0eXBlIG9yIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIGNvbXBvbmVudHMgaW4gYSBwcm9qZWN0LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRQcm9qZWN0cygpCi0gIHsKLSAgICBpZiAoaW5pdGlhbFByb2plY3RfICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShpbml0aWFsUHJvamVjdF8uZ2V0TmFtZSgpKTsKLSAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gbnVsbDsKLSAgICAgIGlmIChpbml0aWFsQ29tcG9uZW50TmFtZV8hPW51bGwgJiYgaW5pdGlhbENvbXBvbmVudE5hbWVfLmxlbmd0aCgpPjApCi0gICAgICB7Ci0gICAgICAgIG1vZHVsZU5hbWUgPSBpbml0aWFsQ29tcG9uZW50TmFtZV87Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1vZHVsZU5hbWUgPSBKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJNb2R1bGVOYW1lKGluaXRpYWxQcm9qZWN0Xyk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHNlcnZpY2VDb21wb25lbnROYW1lXyA9IG1vZHVsZU5hbWU7Ci0gICAgICBTdHJpbmcgdmVyc2lvbiA9IFN0cmluZy52YWx1ZU9mKEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbihpbml0aWFsUHJvamVjdF8sIG1vZHVsZU5hbWUpKTsKLSAgICAgIFN0cmluZ1tdIHZhbGlkVmVyc2lvbnMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSkuZ2V0SjJlZUxldmVscygpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPCB2YWxpZFZlcnNpb25zLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAodmFsaWRWZXJzaW9uc1tpXS5lcXVhbHModmVyc2lvbikpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlSjJFRVZlcnNpb25fID0gdmFsaWRWZXJzaW9uc1tpXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9QaWNrIHRoZSBmaXJzdCBvbmUKLSAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldEFsbFByb2plY3RzKCk7Ci0gICAgICBpZiAocHJvamVjdHMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUocHJvamVjdHNbMF0uZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBKMkVFVXRpbHMuZ2V0Rmlyc3RXZWJNb2R1bGVOYW1lKHByb2plY3RzWzBdKTsKLSAgICAgICAgc2VydmljZUNvbXBvbmVudE5hbWVfID0gbW9kdWxlTmFtZTsKLSAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24ocHJvamVjdHNbMF0sIG1vZHVsZU5hbWUpKTsKLSAgICAgICAgU3RyaW5nW10gdmFsaWRWZXJzaW9ucyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKS5nZXRKMmVlTGV2ZWxzKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTwgdmFsaWRWZXJzaW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmICh2YWxpZFZlcnNpb25zW2ldLmVxdWFscyh2ZXJzaW9uKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXJ2aWNlSjJFRVZlcnNpb25fID0gdmFsaWRWZXJzaW9uc1tpXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy90aGVyZSBhcmUgbm8gcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gUGFzcyB0aGUgZGVmYXVsdCBuYW1lcyBmb3IgbmV3IHByb2plY3RzLgotICAgICAgICAKLSAgICAgICAgaWYgKChzZXJ2aWNlQ29tcG9uZW50VHlwZV8gJiBKMkVFVXRpbHMuRUpCKSA9PSBKMkVFVXRpbHMuRUpCICkKLSAgICAgICAgewotICAgICAgICAgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0RUpCUHJvamVjdE5hbWUoKSk7Ci0gICAgICAgICAgc2VydmljZUNvbXBvbmVudE5hbWVfID0gUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0RUpCQ29tcG9uZW50TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0V2ViUHJvamVjdE5hbWUoKSk7Ci0gICAgICAgICAgc2VydmljZUNvbXBvbmVudE5hbWVfID0gUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0V2ViQ29tcG9uZW50TmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIAotICAgIH0KLSAgfQotCi0gIC8vIHJza3JlZwotICAvKgotICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFByb2plY3RzKCkKLSAgewotCQotCS8vSGFuZGxlIHRoZSBjYXNlIHdoZXJlIG5vIHZhbGlkIGluaXRpYWwgc2VsZWN0aW9uIGV4aXN0cwotICAgIGlmIChpbml0aWFsUHJvamVjdF89PSBudWxsIHx8IChpbml0aWFsUHJvamVjdF8hPW51bGwgJiYgd2ViU2VydmljZVJ1bnRpbWVKMkVFVHlwZT09bnVsbCkpCi0gICAgewotICAgICAgLy9TZWxlY3QgdGhlIGZpcnN0IGV4aXN0aW5nIHByb2plY3QgdGhhdCBpcyB2YWxpZC4KLSAgICAgIHNldFNlcnZpY2VQcm9qZWN0VG9GaXJzdFZhbGlkKCk7Ci0gICAgICBTdHJpbmcgc2VydmljZVByb2plY3ROYW1lID0gZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgCi0gICAgICAvL1NlbGVjdCBhIGNsaWVudCBwcm9qZWN0IHdpdGggImNsaWVudCIgYWRkZWQgdG8gdGhlIGFib3ZlIHByb2plY3QgbmFtZS4KLSAgICAgIFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSA9IFJlc291cmNlVXRpbHMuZ2V0Q2xpZW50V2ViUHJvamVjdE5hbWUoc2VydmljZVByb2plY3ROYW1lLCBzZXJ2aWNlSWRzXy5nZXRUeXBlSWQoKSApOwotICAgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShjbGllbnRQcm9qZWN0TmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSAgICAKLQkgICAgCi0KLQkvL1NldCB0aGUgc2VydmljZSBwcm9qZWN0IHNlbGVjdGlvbiB0byB0aGlzIGluaXRpYWxQcm9qZWN0Ci0JZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShpbml0aWFsUHJvamVjdF8uZ2V0TmFtZSgpKTsKLQlTdHJpbmcgY2xpZW50UHJvamVjdE5hbWUgPSBSZXNvdXJjZVV0aWxzLmdldENsaWVudFdlYlByb2plY3ROYW1lKGluaXRpYWxQcm9qZWN0Xy5nZXROYW1lKCksIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpICk7IAotCS8vU2V0IHRoZSBjbGllbnQgcHJvamVjdCBzZWxlY3Rpb24gdG8gY2xpZW50UHJvamVjdAotCWdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoY2xpZW50UHJvamVjdE5hbWUpOwotCQkgICAgICAJICAgIAotICB9Ci0gIAotCi0gIHByaXZhdGUgdm9pZCBzZXRTZXJ2aWNlUHJvamVjdFRvRmlyc3RWYWxpZCgpCi0gIHsKLSAgICBXZWJTZXJ2aWNlU2VydmVyUnVudGltZVR5cGVSZWdpc3RyeSB3c3NydFJlZyA9IFdlYlNlcnZpY2VTZXJ2ZXJSdW50aW1lVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nW10gcHJvamVjdE5hbWVzID0gZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5nZXRMaXN0KCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8cHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpKChuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtKHByb2plY3ROYW1lc1tpXSkpKTsKLSAgICAgIGlmIChwcm9qZWN0LmlzT3BlbigpICYmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0KSB8fCBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkpCi0gICAgICB7Ci0gICAgICAgIC8vR2V0IHRoZSBKMkVFIGxldmVsCi0gICAgICAgIGludCB2ZXJzaW9uSWQgPSBKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24ocHJvamVjdCk7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YodmVyc2lvbklkKTsKLSAgICAgICAgCi0gICAgICAgIC8vR2V0IHRoZSBydW50aW1lIHRhcmdldCBvZiB0aGUgcHJvamVjdAotICAgICAgICBJUnVudGltZSBydW50aW1lVGFyZ2V0ID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0UnVudGltZVRhcmdldChwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgIFN0cmluZyBydW50aW1lVGFyZ2V0SWQgPSBudWxsOwotICAgICAgICBpZiAocnVudGltZVRhcmdldCAhPSBudWxsKSAKLSAgICAgICAgICBydW50aW1lVGFyZ2V0SWQgPSBydW50aW1lVGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzZXJ2aWNlSjJFRVZlcnNpb25fIT1udWxsICYmIHNlcnZpY2VKMkVFVmVyc2lvbl8ubGVuZ3RoKCk+MCAmJiBzZXJ2aWNlSjJFRVZlcnNpb25fLmVxdWFscyh2ZXJzaW9uU3RyaW5nKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICh3c3NydFJlZy5kb2VzUnVudGltZVN1cHBvcnRKMkVFTGV2ZWwodmVyc2lvblN0cmluZywgc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCkpICYmCi0gICAgICAgICAgICAgKChydW50aW1lVGFyZ2V0ID09IG51bGwpIHx8IAotICAgICAgICAgICAgICgocnVudGltZVRhcmdldCE9bnVsbCkgJiYgd3NzcnRSZWcuZG9lc1J1bnRpbWVTdXBwb3J0U2VydmVyVGFyZ2V0KHJ1bnRpbWVUYXJnZXRJZCwgc2VydmljZUlkc18uZ2V0UnVudGltZUlkKCkpKSkgCi0gICAgICAgICAgICAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUocHJvamVjdE5hbWVzW2ldKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9EaWRuJ3QgZmluZCBhIHNpbmdsZSBwcm9qZWN0IHRoYXQgd29ya2VkLiBEZWZhdWx0IHRvIGEgbmV3IHByb2plY3QgbmFtZS4KLSAgICBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKFJlc291cmNlVXRpbHMuZ2V0RGVmYXVsdFdlYlByb2plY3ROYW1lKCkpOwotICB9Ci0gICovCi0gIC8vIHJza3JlZwotCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0RUFScygpCi0gIHsKLSAgICBTdHJpbmcgaW5pdGlhbFByb2plY3ROYW1lID0gZ2V0U2VydmljZVByb2plY3QyRUFSUHJvamVjdCgpLmdldExpc3QoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICBJUHJvamVjdCBpbml0aWFsUHJvamVjdCA9ICAgRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoaW5pdGlhbFByb2plY3ROYW1lKTsKLSAgICBJVmlydHVhbENvbXBvbmVudFtdIGVhckNvbXBzID0gSjJFRVV0aWxzLmdldFJlZmVyZW5jaW5nRUFSQ29tcG9uZW50cyhpbml0aWFsUHJvamVjdCwgc2VydmljZUNvbXBvbmVudE5hbWVfKTsKLSAgICBpZiAoZWFyQ29tcHMubGVuZ3RoPjApCi0gICAgewotICAgICAgLy9QaWNrIHRoZSBmaXJzdCBvbmUKLSAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXAgPSBlYXJDb21wc1swXTsKLSAgICAgIFN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IGVhckNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLSAgICAgIFN0cmluZyBlYXJDb21wb25lbnROYW1lID0gZWFyQ29tcC5nZXROYW1lKCk7Ci0gICAgICBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGVhclByb2plY3ROYW1lKTsKLSAgICAgIHNlcnZpY2VFYXJDb21wb25lbnROYW1lXyA9IGVhckNvbXBvbmVudE5hbWU7ICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL0NvbXBvbmVudCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBFQVJzLCBzbyBwaWNrIHRoZSBmaXJzdCBFQVIgeW91IHNlZSB3aXRoIHRoZSBjb3JyZWN0IEoyRUUgdmVyc2lvbi4KLSAgICAgIElWaXJ0dWFsQ29tcG9uZW50W10gYWxsRWFyQ29tcHMgPSBKMkVFVXRpbHMuZ2V0QWxsRUFSQ29tcG9uZW50cygpOwotICAgICAgaWYgKGFsbEVhckNvbXBzLmxlbmd0aD4wKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8YWxsRWFyQ29tcHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc2VydmljZUoyRUVWZXJzaW9uXy5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoSjJFRVV0aWxzLmdldEoyRUVWZXJzaW9uKGFsbEVhckNvbXBzW2ldKSkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0TmFtZSA9IGFsbEVhckNvbXBzW2ldLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLnNldFNlbGVjdGlvblZhbHVlKGVhclByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIHNlcnZpY2VFYXJDb21wb25lbnROYW1lXyA9IGFsbEVhckNvbXBzW2ldLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vdGhlcmUgYXJlIG5vIEVhcnMuCi0gICAgICAgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoUmVzb3VyY2VVdGlscy5nZXREZWZhdWx0U2VydmljZUVBUlByb2plY3ROYW1lKCkpOwotICAgICAgICBzZXJ2aWNlRWFyQ29tcG9uZW50TmFtZV8gPSBSZXNvdXJjZVV0aWxzLmdldERlZmF1bHRTZXJ2aWNlRUFSQ29tcG9uZW50TmFtZSgpOwotICAgICAgfQotICAgICAgCi0gICAgICAKLSAgICB9Ci0gICAgCi0gIH0KLQotICAvLwotICAvKgotICBwcml2YXRlIHZvaWQgc2V0RGVmYXVsdEVBUnMoKQotICB7Ci0KLSAgCS8vU2VydmljZS1zaWRlCi0gICAgU3RyaW5nIGluaXRpYWxQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0ID0gICBGaWxlUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChpbml0aWFsUHJvamVjdE5hbWUpOyAgCQotICAJSVByb2plY3QgZGVmYXVsdFNlcnZpY2VFQVIgPSBnZXREZWZhdWx0RUFSRnJvbVNlcnZpY2VQcm9qZWN0KGluaXRpYWxQcm9qZWN0KTsKLSAgCWdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdFNlcnZpY2VFQVIuZ2V0TmFtZSgpKTsKLSAgCQotICAJLy9DbGllbnQtc2lkZQotICAgIFN0cmluZyBpbml0aWFsQ2xpZW50UHJvamVjdE5hbWUgPSBnZXRSdW50aW1lMkNsaWVudFR5cGVzKCkuZ2V0Q2hvaWNlKCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOyAKLSAgICBJUHJvamVjdCBpbml0aWFsQ2xpZW50UHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxDbGllbnRQcm9qZWN0TmFtZSkpOyAgCQotICAJSVByb2plY3QgZGVmYXVsdENsaWVudEVBUiA9IGdldERlZmF1bHRFQVJGcm9tQ2xpZW50UHJvamVjdChpbml0aWFsQ2xpZW50UHJvamVjdCk7Ci0gIAkKLSAgCS8vSWYgdGhlIGNsaWVudCBwcm9qZWN0IGV4aXN0cyBhbmQgdGhlIGRlZmF1bHQgRUFSIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIHNlcnZpY2UgcHJvamVjdCwgCi0gIAkvL3BpY2sgdGhlIGRlZmF1bHRDbGllbnRFQVIKLSAgCWlmKGluaXRpYWxDbGllbnRQcm9qZWN0IT1udWxsICYmIGluaXRpYWxDbGllbnRQcm9qZWN0LmV4aXN0cygpIAotICAJICAgJiYgZGVmYXVsdENsaWVudEVBUi5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0U2VydmljZUVBUi5nZXROYW1lKCkpKQotICAJewotICAJCWdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdENsaWVudEVBUi5nZXROYW1lKCkpOwotICAJfQotICAJZWxzZQotICAJewotICAgICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBwdGM9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0gICAgICBpZiAoIXB0Yy5pc1VzZVR3b0VBUnMoKSkgewotICAgICAgCWdldFJ1bnRpbWUyQ2xpZW50VHlwZXMoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0U2VsZWN0aW9uVmFsdWUoZGVmYXVsdFNlcnZpY2VFQVIuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICBJUHJvamVjdCBwcm94eUVBUlByb2plY3QgPSBnZXRVbmlxdWVDbGllbnRFQVIoZGVmYXVsdENsaWVudEVBUi5nZXROYW1lKCksIGRlZmF1bHRTZXJ2aWNlRUFSLmdldE5hbWUoKSwgaW5pdGlhbENsaWVudFByb2plY3ROYW1lKTsKLSAgICAgICAgZ2V0UnVudGltZTJDbGllbnRUeXBlcygpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldENob2ljZSgpLmdldExpc3QoKS5zZXRTZWxlY3Rpb25WYWx1ZShwcm94eUVBUlByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgIH0gIAkJCi0gIAl9Ci0gIH0KLSAgKi8KLSAgCi0gIHByaXZhdGUgSVByb2plY3QgZ2V0VW5pcXVlQ2xpZW50RUFSKFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgc2VydmljZVByb2plY3QsIFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSkgewotCi0gICAgU3RyaW5nIHByb2plY3ROYW1lID0gbmV3IFN0cmluZygpOwotICAgIGlmICghZWFyUHJvamVjdC5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2VQcm9qZWN0KSkgewotICAgICAgcHJvamVjdE5hbWUgPSBlYXJQcm9qZWN0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHByb2plY3ROYW1lID0gY2xpZW50UHJvamVjdE5hbWUrREVGQVVMVF9DTElFTlRfRUFSX1BST0pFQ1RfRVhUOwotICAgICAgaW50IGk9MTsgICAgICAKLSAgICAgIHdoaWxlIChwcm9qZWN0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNlcnZpY2VQcm9qZWN0KSkgewotICAgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lK2k7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb2plY3ROYW1lLmVxdWFscygiIikgPyBudWxsIDogUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0U2VydmVyKCkKLSAgewotICAgIFN0cmluZyBpbml0aWFsUHJvamVjdE5hbWUgPSBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotCSAgSVJ1bnRpbWUgcnVudGltZVRhcmdldCA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFJ1bnRpbWVUYXJnZXQoaW5pdGlhbFByb2plY3ROYW1lKTsKLSAgICBTdHJpbmcgcnVudGltZVRhcmdldElkID0gbnVsbDsKLSAgICBpZiAocnVudGltZVRhcmdldCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJ1bnRpbWVUYXJnZXRJZCA9IHJ1bnRpbWVUYXJnZXQuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotICAgICAgLy9QaWNrIGEgY29tcGF0aWJsZSBleGlzdGluZyBzZXJ2ZXIgaWYgb25lIGV4aXN0cy4KLSAgICAgIElTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0Q29tcGF0aWJsZUV4aXN0aW5nU2VydmVycyhydW50aW1lVGFyZ2V0KTsKLSAgICAgIGlmIChzZXJ2ZXJzIT1udWxsICYmIHNlcnZlcnMubGVuZ3RoPjApCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzZXJ2ZXJzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRoaXNGYWN0b3J5SWQgPSBzZXJ2ZXJzWzBdLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpOwotICAgICAgICAgIGlmIChXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmRvZXNSdW50aW1lU3VwcG9ydFNlcnZlcihzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSwgdGhpc0ZhY3RvcnlJZCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy9QaWNrIHRoaXMgc2VydmVyIGFuZCByZXR1cm4uCi0gICAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZCh0aGlzRmFjdG9yeUlkKTsKLSAgICAgICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVyc1swXS5nZXRJZCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9ObyBjb21wYXRpYmxlIGV4aXN0aW5nIHNlcnZlciwgc2V0IHRoZSBmYWN0b3J5IGlkIHRvIHNvbWV0aGluZyB0aGUgcnVudGltZSBzdXBwb3J0cwotICAgICAgU3RyaW5nW10gZmFjdG9yeUlkcyA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMuZ2V0V2ViU2VydmljZVJ1bnRpbWVCeUlkKHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpKS5nZXRTZXJ2ZXJGYWN0b3J5SWRzKCk7Ci0gICAgICBpZiAoZmFjdG9yeUlkcyE9bnVsbCAmJiBmYWN0b3J5SWRzLmxlbmd0aD4wKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZmFjdG9yeUlkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIElTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKGZhY3RvcnlJZHNbaV0pOwotICAgICAgICAgIGlmIChzZXJ2ZXJUeXBlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNlcnZlclJ1bnRpbWVUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzZXJ2ZXJSdW50aW1lVHlwZUlkLmVxdWFscyhydW50aW1lVGFyZ2V0SWQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL0ZvdW5kIGEgbWF0Y2gKLSAgICAgICAgICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySWQoZmFjdG9yeUlkc1tpXSk7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL1J1bnRpbWUgZG9lcyBub3Qgc3BlY2lmeSBhbnkgc2VydmVyIGZhY3RvcnkgaWRzCi0gICAgICAgIElTZXJ2ZXJUeXBlW10gc2VydmVyVHlwZXMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlclR5cGVzKCk7Ci0gICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlcklkKHNlcnZlclR5cGVzWzBdLmdldElkKCkpOwotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUaGUgcHJvamVjdCBoYXMgbm8gc2VydmVyIHRhcmdldCBzbyBwaWNrIGEgc2VydmVyIGZhY3RvcnkgaWQgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJ1bnRpbWUKLSAgICAgIFN0cmluZ1tdIGZpZHMgPSBXZWJTZXJ2aWNlUnVudGltZUV4dGVuc2lvblV0aWxzLmdldFdlYlNlcnZpY2VSdW50aW1lQnlJZChzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSkuZ2V0U2VydmVyRmFjdG9yeUlkcygpOwotICAgICAgaWYgKGZpZHMhPW51bGwgJiYgZmlkcy5sZW5ndGg+MCkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySWQoZmlkc1swXSk7ICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy9SdW50aW1lIGRvZXMgbm90IHNwZWNpZnkgYW55IHNlcnZlciBmYWN0b3J5IGlkcwotICAgICAgICBJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJUeXBlc1swXS5nZXRJZCgpKTsgICAgICAgIAotICAgICAgfQotICAgICAgICAgICAgCi0gICAgfSAgICAgICAgCi0gIH0KLSAgLy8gcnNrcmVnCi0gIC8qCi0gIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0U2VydmVyKCkKLSAgewotICAgIC8vQ2FsY3VsYXRlIHJlYXNvbmFibGUgZGVmYXVsdCBzZXJ2ZXIgYmFzZWQgb24gdGhlIGRlZmF1bHQgcHJvamVjdCBzZWxlY3Rpb24uIAotCi0gICAgU3RyaW5nIGluaXRpYWxQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7IAotICAgIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0ID0gKElQcm9qZWN0KSgobmV3IFN0cmluZ1RvSVByb2plY3RUcmFuc2Zvcm1lcigpKS50cmFuc2Zvcm0oaW5pdGlhbFByb2plY3ROYW1lKSk7Ci0gICAgaWYgKGluaXRpYWxQcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNlcnZlckluZm8gPSBTZXJ2ZXJTZWxlY3Rpb25VdGlscy5nZXRTZXJ2ZXJJbmZvRnJvbUV4aXN0aW5nUHJvamVjdChpbml0aWFsUHJvamVjdCwgc2VydmljZUlkc18uZ2V0VHlwZUlkKCksIHNlcnZpY2VJZHNfLmdldFJ1bnRpbWVJZCgpLCB0cnVlKTsKLSAgICAgIGlmIChzZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAoc2VydmVySW5mb1swXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzBdLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VydmVySW5mb1sxXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzFdLmxlbmd0aCgpPjApCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZlckluZm9bMV0pOwotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgZWxzZSAvL3RoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotICAgIHsKLSAgICAgIC8vRG9lcyB0aGUgRUFSIGV4aXN0PwotICAgICAgU3RyaW5nIGluaXRpYWxFQVJQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICBJUHJvamVjdCBpbml0aWFsRUFSUHJvamVjdCA9IChJUHJvamVjdCkoKG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSkudHJhbnNmb3JtKGluaXRpYWxFQVJQcm9qZWN0TmFtZSkpOwotICAgICAgaWYgKGluaXRpYWxFQVJQcm9qZWN0LmV4aXN0cygpKQotICAgICAgewotICAgICAgICBTdHJpbmdbXSBzZXJ2ZXJJbmZvID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0U2VydmVySW5mb0Zyb21FeGlzdGluZ1Byb2plY3QoaW5pdGlhbEVBUlByb2plY3QsIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpLCBzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSwgZmFsc2UpOwotICAgICAgICBpZiAoc2VydmVySW5mbyE9bnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChzZXJ2ZXJJbmZvWzBdIT1udWxsICYmIHNlcnZlckluZm9bMF0ubGVuZ3RoKCk+MCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXJ2aWNlSWRzXy5zZXRTZXJ2ZXJJZChzZXJ2ZXJJbmZvWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMV0hPW51bGwgJiYgc2VydmVySW5mb1sxXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlckluc3RhbmNlSWQoc2VydmVySW5mb1sxXSk7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL1dlIGhhdmUgYSBuZXcgcHJvamVjdCBhbmQgRUFSLiBVc2UgdGhlIHJ1bnRpbWUvc2VydmVyIHNlbGVjdGlvbiAKLSAgICAgICAgLy9wcmVmZXJlbmNlcyB0byBzZXQgdGhlIGRlZmF1bHQgc2VydmVyL3NlcnZlciB0eXBlLgotICAgICAgICAvL1BpY2sgYSBzZXJ2ZXIgdHlwZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgV2ViIHNlcnZpY2UgcnVudGltZQotICAgICAgICAvL0lmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNlcnZlciB0aGF0IHdvcmtzLCBwaWNrIHRoYXQgb25lLgotICAgICAgICAKLSAgICAgICAgU3RyaW5nW10gc2VydmVySW5mbyA9IFNlcnZlclNlbGVjdGlvblV0aWxzLmdldFNlcnZlckZyb21XZWJTZXJ2Y2VSdW50aW1lQW5kSjJFRShzZXJ2aWNlSWRzXy5nZXRSdW50aW1lSWQoKSwgc2VydmljZUoyRUVWZXJzaW9uXyk7Ci0gICAgICAgIGlmIChzZXJ2ZXJJbmZvIT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHNlcnZlckluZm9bMF0hPW51bGwgJiYgc2VydmVySW5mb1swXS5sZW5ndGgoKT4wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlcnZpY2VJZHNfLnNldFNlcnZlcklkKHNlcnZlckluZm9bMF0pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc2VydmVySW5mb1sxXSE9bnVsbCAmJiBzZXJ2ZXJJbmZvWzFdLmxlbmd0aCgpPjApCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VydmljZUlkc18uc2V0U2VydmVySW5zdGFuY2VJZChzZXJ2ZXJJbmZvWzFdKTsKLSAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIC8vRGVmYXVsdCB0aGUgY2xpZW50IHNlcnZlciAgICAKLSAgfQotICAqLwotICAvLyByc2tyZWcKLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVTZXJ2aWNlRUFScygpCi0gIHsKLSAgCS8vU2V0IEVBUiBzZWxlY3Rpb24gdG8gbnVsbCBpZiB0aGUgcHJvamVjdC9zZXJ2ZXIgZGVmYXVsdHMgaW1wbHkgYW4gRUFSIHNob3VsZCBub3QgYmUgY3JlYXRlZAotICAJU3RyaW5nIHNlcnZpY2VQcm9qZWN0TmFtZSA9IGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIAlJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCA9IEZpbGVSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHNlcnZpY2VQcm9qZWN0TmFtZSk7Ci0gIAlpZiAoc2VydmljZVByb2plY3QgIT0gbnVsbCAmJiBzZXJ2aWNlUHJvamVjdC5leGlzdHMoKSkKLSAgCXsKLSAgCSAgLy9HZXQgdGhlIHJ1bnRpbWUgdGFyZ2V0IG9uIHRoZSBzZXJ2aWNlUHJvamVjdAotICAJICBJUnVudGltZSBzZXJ2aWNlVGFyZ2V0ID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0UnVudGltZVRhcmdldChzZXJ2aWNlUHJvamVjdE5hbWUpOwotICAJICBTdHJpbmcgajJlZVZlcnNpb24gPSBTdHJpbmcudmFsdWVPZihKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24oc2VydmljZVByb2plY3QsIHNlcnZpY2VDb21wb25lbnROYW1lXykpOwotICAJICBpZiAoc2VydmljZVRhcmdldCAhPSBudWxsKQotICAJICB7Ci0gIAkgIAlpZiAoIVNlcnZlclV0aWxzLmlzVGFyZ2V0VmFsaWRGb3JFQVIoc2VydmljZVRhcmdldC5nZXRSdW50aW1lVHlwZSgpLmdldElkKCksajJlZVZlcnNpb24pKQotICAJICAJewotICAJICAgICAgLy9EZWZhdWx0IHRoZSBFQVIgc2VsZWN0aW9uIHRvIGJlIGVtcHR5Ci0gIAkgIAkgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0SW5kZXgoLTEpOwotICAgICAgICAgIHNlcnZpY2VFYXJDb21wb25lbnROYW1lXyA9ICIiOwotICAJICAJICBzZXJ2aWNlTmVlZEVBUl8gPSBmYWxzZTsKLSAgCSAgCX0KLSAgCSAgCQkKLSAgCSAgfQotICAJfQotICAJZWxzZQotICAJewotICAJCS8vVXNlIHRoZSBzZXJ2ZXIgdHlwZQotICAJCVN0cmluZyBzZXJ2ZXJUYXJnZXRJZCA9IFNlcnZlclV0aWxzLmdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQoc2VydmljZUlkc18uZ2V0U2VydmVySWQoKSk7Ci0gIAkJaWYgKHNlcnZlclRhcmdldElkIT1udWxsICYmIHNlcnZlclRhcmdldElkLmxlbmd0aCgpPjApCi0gIAkJewotICAJCSAgaWYgKCFTZXJ2ZXJVdGlscy5pc1RhcmdldFZhbGlkRm9yRUFSKHNlcnZlclRhcmdldElkLHNlcnZpY2VKMkVFVmVyc2lvbl8pKQotICAJICAJICB7Ci0gIAkgICAgICAgIC8vRGVmYXVsdCB0aGUgRUFSIHNlbGVjdGlvbiB0byBiZSBlbXB0eQotICAJICAJICAgIGdldFNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3QoKS5nZXRDaG9pY2UoKS5nZXRMaXN0KCkuc2V0SW5kZXgoLTEpOwotICAgICAgICAgICAgc2VydmljZUVhckNvbXBvbmVudE5hbWVfID0gIiI7Ci0gIAkgIAkgICAgc2VydmljZU5lZWRFQVJfID0gZmFsc2U7Ci0gIAkgIAkgIH0KLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCQkKLSAgfQotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGluaXRpYWxTZWxlY3Rpb25fID0gc2VsZWN0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsUHJvamVjdChJUHJvamVjdCBpbml0aWFsUHJvamVjdCkKLSAgewotICAgIGluaXRpYWxQcm9qZWN0XyA9IGluaXRpYWxQcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsQ29tcG9uZW50TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGluaXRpYWxDb21wb25lbnROYW1lXyA9IG5hbWU7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVR5cGVSdW50aW1lU2VydmVyKCBUeXBlUnVudGltZVNlcnZlciBpZHMgKQotICB7Ci0gICAgc2VydmljZUlkc18gPSBpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUeXBlUnVudGltZVNlcnZlciBnZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VJZHNfOyAKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkKLSAgewotICAgIGlmIChzZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0XyA9PSBudWxsKQotICAgIHsKLQkgIC8vIHJza3JlZwotICAgICAgLy9JUHJvamVjdFtdIHByb2plY3RzID0gV2ViU2VydmljZVNlcnZlclJ1bnRpbWVUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0c0J5V2ViU2VydmljZVR5cGUoc2VydmljZUlkc18uZ2V0VHlwZUlkKCkpOwotICAgICAgLy9Qb3B1bGF0ZSB0aGUgbGlzdCB3aXRoIGFsbCB0aGUgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZSBleGNlcHQgU2VydmVycyBhbmQgb25lcyB0aGF0IHN0YXJ0IHdpdGggIi4iCi0JICAvLyByc2tyZWcKLQkgIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IGdldEFsbEZsZXhpYmxlUHJvamVjdHMoKTsKLQkgIFNlbGVjdGlvbkxpc3QgbGlzdCA9IG5ldyBTZWxlY3Rpb25MaXN0KHByb2plY3ROYW1lcywgMCk7Ci0JICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KShuZXcgU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyKCkpLnRyYW5zZm9ybShwcm9qZWN0TmFtZXNbaV0pOwotCSAgICBjaG9pY2VzLmFkZChnZXRQcm9qZWN0RUFSQ2hvaWNlKHByb2plY3QpKTsKLQkgIH0KLQkgIHNlcnZpY2VQcm9qZWN0MkVBUlByb2plY3RfID0gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKGxpc3QsIGNob2ljZXMsIGdldEVBUlByb2plY3RzKCkpOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVByb2plY3QyRUFSUHJvamVjdF87IAotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGdlbmVyYXRlUHJveHlfLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVQcm94eV87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBnZW5lcmF0ZVByb3h5XyBUaGUgZ2VuZXJhdGVQcm94eV8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVQcm94eShib29sZWFuIGdlbmVyYXRlUHJveHlfKQotICB7Ci0gICAgdGhpcy5nZW5lcmF0ZVByb3h5XyA9IGdlbmVyYXRlUHJveHlfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlSjJFRVZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VKMkVFVmVyc2lvbl87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVByb2plY3ROYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVhclByb2plY3ROYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRTZXJ2aWNlUHJvamVjdDJFQVJQcm9qZWN0KCkuZ2V0Q2hvaWNlKCkuZ2V0TGlzdCgpLmdldFNlbGVjdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VDb21wb25lbnROYW1lKCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlQ29tcG9uZW50TmFtZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVhckNvbXBvbmVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZpY2VFYXJDb21wb25lbnROYW1lXzsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRTZXJ2aWNlQ29tcG9uZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZUNvbXBvbmVudFR5cGVfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRTZXJ2aWNlTmVlZEVBUigpCi0gIHsKLSAgICByZXR1cm4gc2VydmljZU5lZWRFQVJfOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmlyc3QgRUFSIGZvciBhIGdpdmVuIHByb2plY3QKLSAgICogQHBhcmFtIHByb2plY3QKLSAgICogQHJldHVybgotICAgKi8KLSAgLyoKLSAgcHJpdmF0ZSBJUHJvamVjdCBnZXREZWZhdWx0RUFSRnJvbVNlcnZpY2VQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBpZiAocHJvamVjdCE9bnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKSAKLSAgICB7Ci0gICAgICBJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0gICAgICBJU2VydmVyIGZpcnN0U3VwcG9ydGVkU2VydmVyID0gU2VydmVyU2VsZWN0aW9uVXRpbHMuZ2V0Rmlyc3RTdXBwb3J0ZWRTZXJ2ZXIoY29uZmlndXJlZFNlcnZlcnMsIHNlcnZpY2VJZHNfLmdldFR5cGVJZCgpICk7Ci0gICAgICAKLSAgICAgIEVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRFQVJQcm9qZWN0cyhwcm9qZWN0LCBmaXJzdFN1cHBvcnRlZFNlcnZlcik7Ci0gICAgICBpZiAoZWFyUHJvamVjdHMhPW51bGwgJiYgZWFyUHJvamVjdHNbMF0gaW5zdGFuY2VvZiBFQVJOYXR1cmVSdW50aW1lKSAKLSAgICAgICAgcmV0dXJuIGVhclByb2plY3RzWzBdLmdldFByb2plY3QoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IHZlcnNpb25JZCA9IC0xOwotICAgIGlmIChzZXJ2aWNlSjJFRVZlcnNpb25fICE9IG51bGwgJiYgc2VydmljZUoyRUVWZXJzaW9uXy5sZW5ndGgoKT4wKQotICAgIHsKLSAgICAgIHZlcnNpb25JZCA9IEludGVnZXIucGFyc2VJbnQoc2VydmljZUoyRUVWZXJzaW9uXyk7Ci0gICAgfQotICAgIEVBUk5hdHVyZVJ1bnRpbWUgbmV3RUFSID0gSjJFRVV0aWxzLmdldEVBUih2ZXJzaW9uSWQpOwotICAgIElQcm9qZWN0IGVhclByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KFJlc291cmNlVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VFQVJQcm9qZWN0TmFtZSgpKTsKLSAgICAgIAotICAgIGlmIChuZXdFQVIhPW51bGwpCi0gICAgICBlYXJQcm9qZWN0ID0gbmV3RUFSLmdldFByb2plY3QoKTsKLQotICAgIHJldHVybiBlYXJQcm9qZWN0OyAgCQotICB9Ci0gICovCi0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L0xhdW5jaEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9MYXVuY2hGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUwNTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L0xhdW5jaEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQ7Ci0KLQotcHVibGljIGNsYXNzIExhdW5jaEZyYWdtZW50IGV4dGVuZHMgQm9vbGVhbkZyYWdtZW50Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVG9QdWJsaWNVRERJXzsgIAotICBwcml2YXRlIGJvb2xlYW4gcHVibGlzaFRvUHJpdmF0ZVVERElfOwotICAKLSAgcHVibGljIExhdW5jaEZyYWdtZW50KCkKLSAgewotICAgIENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAocHVibGlzaFRvUHVibGljVURESV8gfHwgcHVibGlzaFRvUHJpdmF0ZVVERElfKTsKLSAgICAgIH0KLSAgICB9OwotICAgIHNldENvbmRpdGlvbiggY29uZGl0aW9uICk7Ci0gICAgc2V0VHJ1ZUZyYWdtZW50KCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kKCksICIiICkgKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHVibGlzaFRvUHVibGljVURESShib29sZWFuIHB1Ymxpc2hUb1B1YmxpY1VEREkpCi0gIHsKLSAgICBwdWJsaXNoVG9QdWJsaWNVRERJXyA9IHB1Ymxpc2hUb1B1YmxpY1VEREk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hUb1ByaXZhdGVVRERJKGJvb2xlYW4gcHVibGlzaFRvUHJpdmF0ZVVEREkpCi0gIHsKLSAgCXB1Ymxpc2hUb1ByaXZhdGVVRERJXyA9IHB1Ymxpc2hUb1ByaXZhdGVVRERJOwotICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkODIxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9TZXJ2aWNlVGVzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQm9vbGVhbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNlcXVlbmNlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2ltcGxlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkNvbmRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFNlcnZpY2VUZXN0RnJhZ21lbnQgZXh0ZW5kcyBCb29sZWFuRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBib29sZWFuIHRlc3RTZXJ2aWNlOwotICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVQcm94eTsKLSAgCi0gIAotICBwdWJsaWMgU2VydmljZVRlc3RGcmFnbWVudCggU3RyaW5nIGlkICkKLSAgewotICAJU2VxdWVuY2VGcmFnbWVudCB0ZXN0Um9vdCA9IG5ldyBTZXF1ZW5jZUZyYWdtZW50KCk7Ci0gIAlDb25kaXRpb24gY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RTZXJ2aWNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICBzZXRDb25kaXRpb24oIGNvbmRpdGlvbiApOwotICAgIAotICAgIHRlc3RSb290LmFkZCggbmV3IFNpbXBsZUZyYWdtZW50KCBuZXcgV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZCgpLCAiIiApICk7Ci0gICAgdGVzdFJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIGlkICkgKTsKLSAgICBzZXRUcnVlRnJhZ21lbnQoIHRlc3RSb290ICk7Ci0gICAgICAKLSAgfQotIAotICAKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpCi0gIHsKLSAgCQotICAJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlRlc3RJRCIsV1NETFRlc3RMYXVuY2hDb21tYW5kLmNsYXNzKTsKLSAgCQotICAJLy9mcm9tIHRoZSB3aXphcmQgCi0gIAlkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2aWNlVGVzdFdpZGdldC5jbGFzcywgIlRlc3RJRCIsV1NETFRlc3RMYXVuY2hDb21tYW5kLmNsYXNzKTsKLSAgCWRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKFdlYlNlcnZpY2VUZXN0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJFeHRlcm5hbEJyb3dzZXIiLFdTRExUZXN0TGF1bmNoQ29tbWFuZC5jbGFzcyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoYm9vbGVhbiBnZW5lcmF0ZVByb3h5KQotICB7Ci0gIAl0aGlzLmdlbmVyYXRlUHJveHkgPSBnZW5lcmF0ZVByb3h5OwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAJcmV0dXJuIGdlbmVyYXRlUHJveHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRlc3RTZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGVzdFNlcnZpY2UoIGJvb2xlYW4gdGVzdFNlcnZpY2UgKQotICB7Ci0gICAgdGhpcy50ZXN0U2VydmljZSA9IHRlc3RTZXJ2aWNlOwotICB9Ci0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvU2VydmljZVRlc3RXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3JlYXRpb24vdWkvd2lkZ2V0cy90ZXN0L1NlcnZpY2VUZXN0V2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDFmZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvU2VydmljZVRlc3RXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMudGVzdC5XU0RMVGVzdExhdW5jaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuVHlwZVJ1bnRpbWVTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbi5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5TZWxlY3Rpb25MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlVGVzdFdpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIFN0cmluZyBwbHVnaW5JZF8gPSAib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpIjsKLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUGx1Z2luSWRfID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSI7Ci0KLSAgcHJpdmF0ZSBDb21ibyB0ZXN0VHlwZUNvbWJvXzsKLSAgLypDT05URVhUX0lEIFBTVFAwMDAxIGZvciB0aGUgVGVzdCBUeXBlIENvbWJvIGJveCBvZiB0aGUgU2VydmljZSBUZXN0IFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BTVFBfQ09NQk9CT1hfVEVTVCA9ICJQU1RQMDAwMSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFRPT0xUSVBfUFNUUF9DT01CT0JPWF9URVNUID0gIlRPT0xUSVBfUFNUUF9DT01CT0JPWF9URVNUIjsKLQotICBwcml2YXRlIEJ1dHRvbiBsYXVuY2hCdXR0b25fOwotICAvKkNPTlRFWFRfSUQgUFNUUDAwMDIgZm9yIHRoZSBsYXVuY2ggYnV0dG9uIG9mIHRoZSBTZXJ2aWNlIFRlc3QgUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFNUUF9MQVVOQ0hfQlVUVE9OID0gIlBTVFAwMDAyIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT04gPSAiVE9PTFRJUF9QU1RQX0xBVU5DSF9CVVRUT04iOwotICAKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IGZhY2lsaXRpZXNfOwotICAKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVNlcnZlckluc3RhbmNlSWQgPSBudWxsOwotICAKLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoIHBsdWdpbklkXyArICIucGx1Z2luIiwgdGhpcyApOwotICAgIFVJVXRpbHMgICAgICB1aVV0aWxzICA9IG5ldyBVSVV0aWxzKG1zZ1V0aWxzLCBjcmVhdGVQbHVnaW5JZF8gKTsKLSAgICAgICAgCi0gICAgQ29tcG9zaXRlIHRlc3RDb21wb3NpdGUgPSB1aVV0aWxzLmNyZWF0ZUNvbXBvc2l0ZSggcGFyZW50LCAzLCAwLCAwICk7Ci0gICAgCi0gICAgdGVzdFR5cGVDb21ib18gPSB1aVV0aWxzLmNyZWF0ZUNvbWJvKCB0ZXN0Q29tcG9zaXRlLCAiTEFCRUxfVEVTVF9UWVBFUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT09MVElQX1BTVFBfQ09NQk9CT1hfVEVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk9QT1BfUFNUUF9DT01CT0JPWF9URVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZICk7Ci0gICAgCi0gICAgbGF1bmNoQnV0dG9uXyA9IHVpVXRpbHMuY3JlYXRlUHVzaEJ1dHRvbiggdGVzdENvbXBvc2l0ZSwgIkJVVFRPTl9MQVVOQ0hfU0VSVklDRV9URVNUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPT0xUSVBfUFNUUF9MQVVOQ0hfQlVUVE9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GT1BPUF9QU1RQX0xBVU5DSF9CVVRUT04gKTsKLSAgICBsYXVuY2hCdXR0b25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTGF1bmNoQnV0dG9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgCi0gICAgIAotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIAotICBwcml2YXRlIFR5cGVSdW50aW1lU2VydmVyIHNlcnZpY2VpZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlclByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIG1vZHVsZTsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLSAgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSAiIjsKLSAgcHJpdmF0ZSBFbnZpcm9ubWVudCBlbnY7Ci0gIHByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0gIAotICBwcml2YXRlIHZvaWQgaGFuZGxlTGF1bmNoQnV0dG9uKCkKLSAgewotCS8vIFNwbGl0IHVwIHRoZSBwcm9qZWN0IGFuZCBtb2R1bGUKLQlpbnQgcCA9IHNlcnZlclByb2plY3QuaW5kZXhPZigiLyIpOwotCWlmIChwICE9IC0xKXsKLQkJbW9kdWxlID0gc2VydmVyUHJvamVjdC5zdWJzdHJpbmcocCsxKTsKLQkJc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Quc3Vic3RyaW5nKDAscCk7Ci0JfQotICAJCi0gIAlTdHJpbmcgdGVzdElEID0gdGVzdFR5cGVDb21ib18uZ2V0VGV4dCgpOwotICAJbGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUgPSB0ZXN0SUQ7Ci0gIAlXU0RMVGVzdExhdW5jaENvbW1hbmQgd3RsYyA9IG5ldyBXU0RMVGVzdExhdW5jaENvbW1hbmQoKTsKLSAgCXd0bGMuc2V0VGVzdElEKHRlc3RJRCk7Ci0gIAl3dGxjLnNldFNlcnZpY2VUeXBlUnVudGltZVNlcnZlcihzZXJ2aWNlaWRzKTsKLQl3dGxjLnNldFNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKHNlcnZpY2VTZXJ2ZXJJbnN0YW5jZUlkKTsKLSAgCXd0bGMuc2V0U2VydmVyUHJvamVjdChzZXJ2ZXJQcm9qZWN0KTsKLQl3dGxjLnNldFNlcnZlck1vZHVsZShtb2R1bGUpOwotICAJd3RsYy5zZXRXc2RsVVJJKHdzZGxVUkkpOwotICAJd3RsYy5zZXRFeHRlcm5hbEJyb3dzZXIodHJ1ZSk7Ci0gIAl3dGxjLnNldEVuZHBvaW50KGVuZHBvaW50cyk7Ci0gIAlTdGF0dXMgc3RhdHVzID0gd3RsYy5leGVjdXRlKGVudik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VUZXN0RmFjaWxpdGllcyggU2VsZWN0aW9uTGlzdCBmYWNpbGl0aWVzICkKLSAgewotICAgIGZhY2lsaXRpZXNfID0gZmFjaWxpdGllczsKLSAgICB0ZXN0VHlwZUNvbWJvXy5zZXRJdGVtcyggZmFjaWxpdGllcy5nZXRMaXN0KCkgKTsKLSAgICB0ZXN0VHlwZUNvbWJvXy5zZWxlY3QoIGZhY2lsaXRpZXMuZ2V0SW5kZXgoKSApOwotICB9Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCBnZXRTZXJ2aWNlVGVzdEZhY2lsaXRpZXMoKQotICB7Ci0gICAgZmFjaWxpdGllc18uc2V0SW5kZXgoIHRlc3RUeXBlQ29tYm9fLmdldFNlbGVjdGlvbkluZGV4KCkgKTsKLSAgICByZXR1cm4gZmFjaWxpdGllc187Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRlc3RJRCgpCi0gIHsKLSAgCXJldHVybiB0ZXN0VHlwZUNvbWJvXy5nZXRUZXh0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxVUkkoU3RyaW5nIHdzZGxVUkkpCi0gIHsKLSAgCXRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgc2V0U2VydmVyUHJvamVjdChTdHJpbmcgc2VydmVyUHJvamVjdCkKLSAgewotICAgIHRoaXMuc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIoVHlwZVJ1bnRpbWVTZXJ2ZXIgc2VydmljZWlkcykKLSAgewotICAgIHRoaXMuc2VydmljZWlkcyA9IHNlcnZpY2VpZHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZWRTZXJ2aWNlVGVzdE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGxhdW5jaGVkU2VydmljZVRlc3ROYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAl0aGlzLmVudiA9IGVudjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KFN0cmluZyBlbmRwb2ludCkKLSAgewotICAgIGlmIChlbmRwb2ludCAhPSBudWxsICYmIGVuZHBvaW50Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHYuYWRkKGVuZHBvaW50KTsKLSAgICAgIHNldEVuZHBvaW50cyh2KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50cyhMaXN0IGVuZHBvaW50cykKLSAgewotICAgIHRoaXMuZW5kcG9pbnRzID0gZW5kcG9pbnRzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVySW5zdGFuY2VJZChTdHJpbmcgc3NJbnN0YW5jZUlkKXsKLQkgIHRoaXMuc2VydmljZVNlcnZlckluc3RhbmNlSWQgPSBzc0luc3RhbmNlSWQ7Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NyZWF0aW9uL3VpL3dpZGdldHMvdGVzdC9XZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYjZjZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jcmVhdGlvbi91aS93aWRnZXRzL3Rlc3QvV2ViU2VydmljZVRlc3REZWZhdWx0aW5nQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxNSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuc2VsZWN0aW9uLlNlbGVjdGlvbkxpc3Q7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGdpbGJlcnRhCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlVGVzdERlZmF1bHRpbmdDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZCAKLXsKLSAgCi0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCBzZXJ2aWNlVGVzdEZhY2lsaXRpZXM7CQotICBwcml2YXRlIEVudmlyb25tZW50IGVudmlyb25tZW50OwotICBwcml2YXRlIFN0cmluZyB0ZXN0SUQ7Ci0gIAotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAlTY2VuYXJpb0NvbnRleHQgc2NlbmFyaW9Db250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNjZW5hcmlvQ29udGV4dCgpLmNvcHkoKTsKLSAgCXRlc3RJRCA9IHNjZW5hcmlvQ29udGV4dC5nZXROb25KYXZhVGVzdFNlcnZpY2UoKTsKLSAgCVN0cmluZ1tdIHRlc3RUeXBlcyA9IHNjZW5hcmlvQ29udGV4dC5nZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0gIAkKLSAgCQotICAJZW52aXJvbm1lbnQgPSBlbnY7Ci0gIAlTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0gIAlXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHdzdHRSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgCQotICAgIAotICAJVmVjdG9yIHdzZGxOYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgCWZvcihpbnQgaSA9MCA7aTx0ZXN0VHlwZXMubGVuZ3RoO2krKyl7Ci0gIAkgIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIHdzY3RlID0gKFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKXdzdHRSZWdpc3RyeS5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSh0ZXN0VHlwZXNbaV0pOyAgCQotICAJICBpZih3c2N0ZS50ZXN0V1NETCgpKXsKLSAgCSAgICB3c2RsTmFtZXMuYWRkRWxlbWVudCh0ZXN0VHlwZXNbaV0pOwotICAJICB9Ci0gIAl9Ci0gICAgCi0gIAlTdHJpbmcgamF2YU5hbWVzQXJyYXlbXSA9IG5ldyBTdHJpbmdbd3NkbE5hbWVzLnNpemUoKV07Ci0gIAlFbnVtZXJhdGlvbiBlID0gd3NkbE5hbWVzLmVsZW1lbnRzKCk7Ci0gIAlpbnQgaSA9IDA7Ci0gIAl3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgIGphdmFOYW1lc0FycmF5W2ldID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gIAkgIGkrKzsKLSAgCX0KLSAgCQotICAJCi0gIAlzZXJ2aWNlVGVzdEZhY2lsaXRpZXMgPSBuZXcgU2VsZWN0aW9uTGlzdChqYXZhTmFtZXNBcnJheSwwKTsgIAkKLSAgCQotIAlyZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIFNlbGVjdGlvbkxpc3QgZ2V0U2VydmljZVRlc3RGYWNpbGl0aWVzKCkKLSAgewotICAJcmV0dXJuIHNlcnZpY2VUZXN0RmFjaWxpdGllczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdElEKCkKLSAgewotICAJcmV0dXJuIHRlc3RJRDsKLSAgfQotICAKLSAgcHVibGljIEVudmlyb25tZW50IGdldEVudmlyb25tZW50KCkKLSAgewotICAJcmV0dXJuIGVudmlyb25tZW50OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZ2V0RXh0ZXJuYWxCcm93c2VyKCkKLSAgewotICAJcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ly5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQ2YTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXVkZGlyZWdpc3RyeS5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5OTlmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53czwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpzdC53cy51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWFiNDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHVkZGlyZWdpc3RyeS5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkucGx1Z2luLldlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkucGx1Z2luLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuYmluZGluZywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpzdC53cy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1YmZkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS51ZGRpcmVnaXN0cnkuamFyID0gc3JjLwotYmluLmluY2x1ZGVzID0gdWRkaXJlZ2lzdHJ5LmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3JlZ2lzdHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9pY29ucy9yZWdpc3RyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDNjYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3JlZ2lzdHJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9pY29ucy91ZGRpcHJpdmF0ZWNvbmZpZ193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNjExZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L2ljb25zL3VkZGlwcml2YXRlY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Y2ZiZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9V2ViIFNlcnZpY2VzIFVuaXZlcnNhbCBEZXNjcmlwdGlvbiBEaXNjb3ZlcnkgYW5kIEludGVncmF0aW9uIFJlZ2lzdHJ5Ci1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKLQotUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19VTklUX1RFU1RfVUREST1Vbml0IFRlc3QgVURESQotCi1YUF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVM9UHJpdmF0ZSBVRERJIFJlZ2lzdHJ5IFR5cGVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2EyYzQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgCi08IS0tCi0gIDxkZXNjcmlwdGlvbj4KLSAgJVBMVUdJTl9ERVNDCi0gIDwvZGVzY3JpcHRpb24+Ci0gIC0tPgotICAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByaXZhdGVVRERJUmVnaXN0cnlUeXBlIiBuYW1lPSIlWFBfUFJJVkFURV9VRERJX1JFR0lTVFJZX1RZUEVTIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkucHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiPgotICAgICAgPHByaXZhdGVVRERJUmVnaXN0cnlUeXBlCi0gICAgICAgICAgICBuYW1lPSIlUFJJVkFURV9VRERJX1JFR0lTVFJZX1RZUEVfSU1QTCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVJbXBsIj4KLSAgICAgIDwvcHJpdmF0ZVVERElSZWdpc3RyeVR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX1VOSVRfVEVTVF9VRERJIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvcmVnaXN0cnkuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy51aS5uZXciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuYmluZGluZy5Qcml2YXRlVURESVdpZGdldEJpbmRpbmciPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCI+Ci0gICAgICA8ZHluYW1pY1dpemFyZAotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfV0laQVJEX05BTUVfV1NfVU5JVF9URVNUX1VEREkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLmJpbmRpbmcuUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nIgotICAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvdWRkaXByaXZhdGVjb25maWdfd2l6LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuYmluZGluZy5Qcml2YXRlVURESVdpZGdldEJpbmRpbmciPgotICAgICAgPC9keW5hbWljV2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19XSVpBUkRfTkFNRV9XU19VTklUX1RFU1RfVURESSIKLSAgICAgICAgICAgIGljb249Imljb25zL3JlZ2lzdHJ5LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJV2l6YXJkIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJV2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVQTFVHSU5fTkVXX1dJWkFSRF9ERVNDX1dTX1VOSVRfVEVTVF9VRERJCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAtLT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3BsdWdpbi9XZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvcGx1Z2luL1dlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4ZDQ5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvcGx1Z2luL1dlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkucGx1Z2luOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIFVEREkgUmVnaXN0cnkgcGx1Z2luLgotKiA8cD4KLSogVGhlIFdlYiBTZXJ2aWNlcyBVRERJIFJlZ2lzdHJ5IHBsdWdpbidzIGlzIHRvIGFkZCB0aGUKLSogb3B0aW9uIHRvIGNyZWF0ZSBhIHVuaXQgdGVzdCBVRERJIHJlZ2lzdHJ5IAotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luIGV4dGVuZHMgUGx1Z2luCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMi4iOwotICAvKioKLSAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbiBpbiBwbHVnaW4ueG1sLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5IjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4gaW5zdGFuY2VfOwotICBwcml2YXRlIExvZyBsb2dfOwotICAKLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luICgpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luKVBsYXRmb3JtLmdldFBsdWdpbigib3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeSIpOwotICAqIEByZXR1cm4gVGhlIFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4gZ2V0SW5zdGFuY2UgKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvciAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCBpbnN0YWxsVVJMID0gaW5zdGFuY2VfLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0gICAgICBVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsbmFtZSk7Ci0gICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXkgKQotICB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGluc3RhbmNlXy5nZXRCdW5kbGUoKSxrZXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4gU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcKLSAgKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotICAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSB0aGUgSkRLJ3MKLSAgKiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9Ci0gICogY2xhc3MgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksYXJncyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjMxMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkLlByaXZhdGVVRERJUmVnaXN0cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0vKgotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LnBsdWdpbi5XZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luOwotKi8KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBieXRlIG9wZXJhdGlvblR5cGU7Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgcmVnaXN0cnlUeXBlOwotICAKLSAgLyoKLSAgcHVibGljIFN0YXR1cyBleGVjdXRlKEVudmlyb25tZW50IGVudikKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5JRCArICIucGx1Z2luIiwgdGhpcyk7Ci0gIAlpZiAocmVnaXN0cnlUeXBlICE9IG51bGwpCi0gIAl7Ci0gIAkgIHN3aXRjaCAob3BlcmF0aW9uVHlwZSkKLSAgCSAgewotICAJICAJY2FzZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9ERVBMT1k6Ci0gIAkgICAgICByZXR1cm4gcmVnaXN0cnlUeXBlLmRlcGxveShlbnYpOwotICAJICAJY2FzZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9VUERBVEU6Ci0gIAkgIAkgIHJldHVybiByZWdpc3RyeVR5cGUudXBkYXRlKGVudik7Ci0gIAkgIAljYXNlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX1JFTU9WRToKLSAgCSAgCSAgcmV0dXJuIHJlZ2lzdHJ5VHlwZS5yZW1vdmUoZW52KTsKLSAgCSAgCWRlZmF1bHQ6Ci0gIAkgIH0KLSAgCX0KLSAgCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAqLwotCi0gIHB1YmxpYyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBnZXRSZWdpc3RyeVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBieXRlIGdldE9wZXJhdGlvblR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSgpCi0gIHsKLSAgCXJldHVybiByZWdpc3RyeVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWdpc3RyeVR5cGUoUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgcmVnVHlwZSkKLSAgewotICAJc2V0UHJpdmF0ZVVERElSZWdpc3RyeVR5cGUocmVnVHlwZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvblR5cGUoYnl0ZSB0eXBlKQotICB7Ci0gICAgb3BlcmF0aW9uVHlwZSA9IHR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIHJlZ1R5cGUpCi0gIHsKLSAgCXJlZ2lzdHJ5VHlwZSA9IHJlZ1R5cGU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwYzIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZC5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5BYnN0cmFjdENvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuQ2FuRmluaXNoUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50Ci17Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgcmVnaXN0cnlUeXBlOwotICBwcml2YXRlIERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YU1hcHBpbmdSZWdpc3RyeTsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeTsKLSAgcHJpdmF0ZSBXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeTsKLSAgCi0gIHB1YmxpYyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudCgpCi0gIHsKLSAgCXN1cGVyKChDb21tYW5kRmFjdG9yeSludWxsLCAiIik7Ci0gIH0KLQotICAvKiogCi0gICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkKLSAgewotICAJaWYgKHJlZ2lzdHJ5VHlwZSAhPSBudWxsKQotICAJewotICAgICAgcmVnaXN0cnlUeXBlLnJlZ2lzdGVyQ2FuRmluaXNoKGNhbkZpbmlzaFJlZ2lzdHJ5KTsKLSAgICAgIHJlZ2lzdHJ5VHlwZS5yZWdpc3RlckRhdGFNYXBwaW5ncyhkYXRhTWFwcGluZ1JlZ2lzdHJ5KTsKLSAgICAgIHJlZ2lzdHJ5VHlwZS5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHdpZGdldFJlZ2lzdHJ5KTsKLSAgICAgIHJldHVybiByZWdpc3RyeVR5cGUuY3JlYXRlKCkuY3JlYXRlKCk7Ci0gIAl9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICAqIEdldHMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucyBudWxsCi0gICAgKiB3aGVuIHRoZXJlIGlzIG5vIG5leHQgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudChDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQpCi0gIHsKLSAgCXJldHVybiBudWxsOwotICB9Ci0gIAotICAvKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcmV0cmlldmUgdGhlIGRhdGEgbWFwcGluZ3MgZm9yIHRoaXMgY29tbWFuZCBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgCWRhdGFNYXBwaW5nUmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5jYW5GaW5pc2hSZWdpc3RyeSA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyhXaWRnZXRSZWdpc3RyeSB3aWRnZXRSZWdpc3RyeSkKLSAgewotICAgIHRoaXMud2lkZ2V0UmVnaXN0cnkgPSB3aWRnZXRSZWdpc3RyeTsKLSAgfQotCi0gIC8qKgotICAgICogQWxsIHdpemFyZCBmcmFnbWVudHMgbmVlZCB0byBiZSBjbG9uZWFibGUuCi0gICoqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAJUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgPSBuZXcgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQoKTsKLSAgCWZyYWdtZW50LnJlZ2lzdGVyRGF0YU1hcHBpbmdzKGRhdGFNYXBwaW5nUmVnaXN0cnkpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJDYW5GaW5pc2goY2FuRmluaXNoUmVnaXN0cnkpOwotICAJZnJhZ21lbnQucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyh3aWRnZXRSZWdpc3RyeSk7Ci0gIAlmcmFnbWVudC5zZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZShyZWdpc3RyeVR5cGUpOwotICAJcmV0dXJuIGZyYWdtZW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRQcml2YXRlVURESVJlZ2lzdHJ5VHlwZShQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSByZWdpc3RyeVR5cGUpCi0gIHsKLSAgCXRoaXMucmVnaXN0cnlUeXBlID0gcmVnaXN0cnlUeXBlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL1ByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTA5YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkucGx1Z2luLldlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQuUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotKiBUaGlzIFVEREkgY29uZmlndXJhdGlvbiBwYWdlIHByb21wdHMgdGhlIHVzZXIKLSogZm9yIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBjb25maWd1cmUgdGhlCi0qIHVuaXQgdGVzdCBVRERJIHJlZ2lzdHJ5LgotKi8KLXB1YmxpYyBjbGFzcyBQcml2YXRlVURESVNlbGVjdGlvbldpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcgotewotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsczsKLSAgcHJpdmF0ZSBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcjsKLQotICBwcml2YXRlIEJ1dHRvbiBkZXBsb3lSYWRpb187Ci0gIHByaXZhdGUgTGFiZWwgdHlwZXNMYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gdHlwZXNDb21ib187Ci0gIHByaXZhdGUgQnV0dG9uIHVwZGF0ZVJhZGlvXzsKLSAgcHJpdmF0ZSBCdXR0b24gcmVtb3ZlUmFkaW9fOwotICBwcml2YXRlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gdHlwZXNfOwotICBwcml2YXRlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGluc3RhbGxlZFR5cGVfOwotCi0gIC8vIEluZm9wb3AKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QVVBSX1BSSVZBVEVfVURESV9QQUdFID0gV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5JRCArICIucHVwcjAwMDEiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BVUFJfUFJJVkFURV9VRERJX1RZUEUgPSBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wdXByMDAwMiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFVQUl9ERVBMT1lfUFJJVkFURV9VRERJID0gV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbi5JRCArICIucHVwcjAwMDMiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BVUFJfVVBEQVRFX1BSSVZBVEVfVURESSA9IFdlYlNlcnZpY2VVRERJUmVnaXN0cnlQbHVnaW4uSUQgKyAiLnB1cHIwMDA1IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QVVBSX1JFTU9WRV9QUklWQVRFX1VEREkgPSBXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wdXByMDAwNCI7Ci0KLSAgcHVibGljIFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0KCkKLSAgewotICAgIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzICk7Ci0gIH0KLQotICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAJdGhpcy5zdGF0dXNMaXN0ZW5lciA9IHN0YXR1c0xpc3RlbmVyOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BVUFJfUFJJVkFURV9VRERJX1BBR0UiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElORk9QT1BfUFVQUl9QUklWQVRFX1VERElfUEFHRSk7Ci0KLSAgICBHcmlkTGF5b3V0IGdsOwotICAgIEdyaWREYXRhIGdkOwotICAgIAotICAgIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgIAloYW5kbGVXaWRnZXRFdmVudChldmVudCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgICAKLSAgICBkZXBsb3lSYWRpb18gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICBkZXBsb3lSYWRpb18uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJCVVRUT05fREVQTE9ZX1VERElfUkVHSVNUUlkiKSk7Ci0gICAgZGVwbG95UmFkaW9fLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICBkZXBsb3lSYWRpb18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotICAgIGRlcGxveVJhZGlvXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BVUFJfREVQTE9ZX1BSSVZBVEVfVURESSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAoZGVwbG95UmFkaW9fLCBJTkZPUE9QX1BVUFJfREVQTE9ZX1BSSVZBVEVfVURESSk7Ci0KLSAgICBDb21wb3NpdGUgdHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gNTsKLSAgICBnbC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDIwOwotICAgIHR5cGVDb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgIHR5cGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICB0eXBlc0xhYmVsXyA9IG5ldyBMYWJlbCh0eXBlQ29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0gICAgdHlwZXNMYWJlbF8uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJMQUJFTF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVMiKSk7Ci0gICAgdHlwZXNMYWJlbF8uc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9QVVBSX1BSSVZBVEVfVURESV9UWVBFIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh0eXBlc0xhYmVsXywgSU5GT1BPUF9QVVBSX1BSSVZBVEVfVURESV9UWVBFKTsKLQotICAgIHR5cGVzQ29tYm9fID0gbmV3IENvbWJvKHR5cGVDb21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgIHR5cGVzQ29tYm9fLnNldExheW91dERhdGEoZ2QpOwotICAgIHR5cGVzQ29tYm9fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLSAgICB0eXBlc0NvbWJvXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BVUFJfUFJJVkFURV9VRERJX1RZUEUiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHR5cGVzQ29tYm9fLCBJTkZPUE9QX1BVUFJfUFJJVkFURV9VRERJX1RZUEUpOwotCi0gICAgdXBkYXRlUmFkaW9fID0gbmV3IEJ1dHRvbihwYXJlbnQsU1dULlJBRElPKTsKLSAgICB1cGRhdGVSYWRpb18uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJCVVRUT05fVVBEQVRFX1VERElfUkVHSVNUUlkiKSk7Ci0gICAgdXBkYXRlUmFkaW9fLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgdXBkYXRlUmFkaW9fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sbGlzdGVuZXIpOwotICAgIHVwZGF0ZVJhZGlvXy5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BVUFJfVVBEQVRFX1BSSVZBVEVfVURESSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAodXBkYXRlUmFkaW9fLCBJTkZPUE9QX1BVUFJfVVBEQVRFX1BSSVZBVEVfVURESSk7Ci0KLSAgICByZW1vdmVSYWRpb18gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsKLSAgICByZW1vdmVSYWRpb18uc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJCVVRUT05fUkVNT1ZFX1VERElfUkVHSVNUUlkiKSk7Ci0gICAgcmVtb3ZlUmFkaW9fLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgcmVtb3ZlUmFkaW9fLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLSAgICByZW1vdmVSYWRpb18uc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9QVVBSX1JFTU9WRV9QUklWQVRFX1VEREkiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHJlbW92ZVJhZGlvXywgSU5GT1BPUF9QVVBSX1JFTU9WRV9QUklWQVRFX1VEREkpOyAgICAgICAgICAgICAgICAKLQotICAgIGxvYWRUeXBlcygpOwotICAgIGluaXQoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBsb2FkVHlwZXMoKQotICB7Ci0gICAgdHlwZXNfID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGVzKCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgaW5pdCgpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzXy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAodHlwZXNfW2ldICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHR5cGVzQ29tYm9fLmFkZCh0eXBlc19baV0uZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHR5cGVzX1tpXS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkKLSAgICAgICAgICBpbnN0YWxsZWRUeXBlXyA9IHR5cGVzX1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHR5cGVzQ29tYm9fLmdldEl0ZW1Db3VudCgpID4gMCkKLSAgICAgIHR5cGVzQ29tYm9fLnNldFRleHQodHlwZXNDb21ib18uZ2V0SXRlbSgwKSk7Ci0gICAgaWYgKGluc3RhbGxlZFR5cGVfICE9IG51bGwpCi0gICAgewotICAgICAgdXBkYXRlUmFkaW9fLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICByZW1vdmVSYWRpb18uc2V0RW5hYmxlZCh0cnVlKTsgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB1cGRhdGVSYWRpb18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICByZW1vdmVSYWRpb18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdpZGdldEV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSByZW1vdmVSYWRpb18gfHwgZXZlbnQud2lkZ2V0ID09IHVwZGF0ZVJhZGlvXykKLSAgICB7Ci0gICAgICBib29sZWFuIGlzVXBkYXRlT3JSZW1vdmVTZWxlY3RlZCA9ICgoQnV0dG9uKWV2ZW50LndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICB0eXBlc0xhYmVsXy5zZXRFbmFibGVkKCFpc1VwZGF0ZU9yUmVtb3ZlU2VsZWN0ZWQpOwotICAgICAgdHlwZXNDb21ib18uc2V0RW5hYmxlZCghaXNVcGRhdGVPclJlbW92ZVNlbGVjdGVkKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRlcGxveVJhZGlvXykKLSAgICB7Ci0gICAgICBib29sZWFuIGlzRGVwbG95U2VsZWN0ZWQgPSAoKEJ1dHRvbilldmVudC53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgdHlwZXNMYWJlbF8uc2V0RW5hYmxlZChpc0RlcGxveVNlbGVjdGVkKTsKLSAgICAgIHR5cGVzQ29tYm9fLnNldEVuYWJsZWQoaXNEZXBsb3lTZWxlY3RlZCk7Ci0gICAgfQotICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKLSAgfQotICAKLSAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCkKLSAgewotICAJaWYgKGRlcGxveVJhZGlvXy5nZXRTZWxlY3Rpb24oKSkKLSAgCXsKLSAgCSAgU3RyaW5nIHNlbGVjdGVkUmVnaXN0cnlOYW1lID0gdHlwZXNDb21ib18uZ2V0VGV4dCgpOwotICAJICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzXy5sZW5ndGg7IGkrKykKLSAgICAgICAgaWYgKHNlbGVjdGVkUmVnaXN0cnlOYW1lLmVxdWFscyh0eXBlc19baV0uZ2V0TmFtZSgpKSkKLSAgCSAgCSAgcmV0dXJuIHR5cGVzX1tpXTsKLSAgICAgIHJldHVybiBudWxsOwotICAJfQotICAJZWxzZQotICAJICByZXR1cm4gaW5zdGFsbGVkVHlwZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBieXRlIGdldE9wZXJhdGlvblR5cGUoKQotICB7Ci0gIAlpZiAoZGVwbG95UmFkaW9fLmdldFNlbGVjdGlvbigpKQotICAJICByZXR1cm4gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuT1BfREVQTE9ZOwotICAJZWxzZSBpZiAodXBkYXRlUmFkaW9fLmdldFNlbGVjdGlvbigpKQotICAgICAgcmV0dXJuIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlLk9QX1VQREFURTsKLSAgCWVsc2UgaWYgKHJlbW92ZVJhZGlvXy5nZXRTZWxlY3Rpb24oKSkKLSAgICAgIHJldHVybiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9SRU1PVkU7Ci0gIAllbHNlCi0gIAkgIHJldHVybiBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5PUF9ERVBMT1k7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSBwcml2YXRlVURESVJlZ2lzdHJ5VHlwZSA9IGdldFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKCk7Ci0gICAgaWYgKHByaXZhdGVVRERJUmVnaXN0cnlUeXBlICE9IG51bGwpCi0gICAgICByZXR1cm4gcHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuZ2V0T3BlcmF0aW9uU3RhdHVzKGdldE9wZXJhdGlvblR5cGUoKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19VRERJX1JFR0lTVFJZX0FWQUlMQUJMRSIpLCBTdGF0dXMuRVJST1IpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlYzQ5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91ZGRpcmVnaXN0cnkvd2lkZ2V0cy9Qcml2YXRlVURESVNlbGVjdGlvbldpZGdldENvbmRpdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgaW1wbGVtZW50cyBDb25kaXRpb24KLXsKLSAgcHJpdmF0ZSBib29sZWFuIGNvbmRpdGlvbjsKLQotICBwdWJsaWMgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kKCkKLSAgewotICAgIGNvbmRpdGlvbiA9IHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpCi0gIHsKLSAgICBjb25kaXRpb24gPSAhY29uZGl0aW9uOwotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLSAgfQotICAKLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudikKLSAgewotICAgIGNvbmRpdGlvbiA9ICFjb25kaXRpb247Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuQ29tbWFuZCNpc1VuZG9hYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gY29uZGl0aW9uOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvYmluZGluZy9Qcml2YXRlVURESVdpZGdldEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aWRnZXRzL2JpbmRpbmcvUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZGVkZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpZGdldHMvYmluZGluZy9Qcml2YXRlVURESVdpZGdldEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5iaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS5wbHVnaW4uV2ViU2VydmljZVVERElSZWdpc3RyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2lkZ2V0cy5Qcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpZGdldHMuUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLlByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nIGltcGxlbWVudHMgQ29tbWFuZFdpZGdldEJpbmRpbmcKLXsKLSAgcHJpdmF0ZSBDYW5GaW5pc2hSZWdpc3RyeSAgIGNhbkZpbmlzaFJlZ2lzdHJ5OwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgd2lkZ2V0UmVnaXN0cnk7Ci0gIHByaXZhdGUgRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhTWFwcGluZ1JlZ2lzdHJ5OwotICBwcml2YXRlIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZEZyYWdtZW50IHByaXZhdGVVRERJU2VsRnJhZ21lbnQ7Ci0gIHByaXZhdGUgUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXRDb25kaXRpb25Db21tYW5kIGNvbmRpdGlvbkNvbW1hbmQ7Ci0gIAotICBwdWJsaWMgUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nKCkKLSAgewotICAgIHByaXZhdGVVRERJU2VsRnJhZ21lbnQgPSBuZXcgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQoKTsKLSAgICBjb25kaXRpb25Db21tYW5kID0gbmV3IFByaXZhdGVVRERJU2VsZWN0aW9uV2lkZ2V0Q29uZGl0aW9uQ29tbWFuZCgpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgIHsKLSAgICAgIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgY3JlYXRlKCkKLSAgICAgIHsKLSAgICAgICAgU2VxdWVuY2VGcmFnbWVudCByb290ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgICAgcm9vdC5hZGQobmV3IFNpbXBsZUZyYWdtZW50KGNvbmRpdGlvbkNvbW1hbmQsICIiKSk7Ci0gICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudCgiUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQiKSk7Ci0gICAgICAgIHJvb3QuYWRkKG5ldyBTaW1wbGVGcmFnbWVudChjb25kaXRpb25Db21tYW5kLCAiIikpOwotICAgICAgICByb290LmFkZChuZXcgU2ltcGxlRnJhZ21lbnQobmV3IFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZCgpLCAiIikpOwotICAgICAgICByb290LmFkZChwcml2YXRlVURESVNlbEZyYWdtZW50KTsKLSAgICAgICAgcmV0dXJuIHJvb3Q7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5jYW5GaW5pc2hSZWdpc3RyeSA9IGNhbkZpbmlzaFJlZ2lzdHJ5OwotICAgIHByaXZhdGVVRERJU2VsRnJhZ21lbnQucmVnaXN0ZXJDYW5GaW5pc2godGhpcy5jYW5GaW5pc2hSZWdpc3RyeSk7Ci0gICAgCi0gICAgY2FuRmluaXNoUmVnaXN0cnkuYWRkQ29uZGl0aW9uKGNvbmRpdGlvbkNvbW1hbmQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyRGF0YU1hcHBpbmdzKG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KQotICB7Ci0gICAgZGF0YU1hcHBpbmdSZWdpc3RyeSA9IGRhdGFSZWdpc3RyeTsKLSAgICBwcml2YXRlVURESVNlbEZyYWdtZW50LnJlZ2lzdGVyRGF0YU1hcHBpbmdzKGRhdGFNYXBwaW5nUmVnaXN0cnkpOwotICAgIAotICAgIC8vIFByaXZhdGVVRERJU2VsZWN0aW9uQ29tbWFuZAotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlByaXZhdGVVRERJUmVnaXN0cnlUeXBlIiwgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kLmNsYXNzKTsKLSAgICBkYXRhTWFwcGluZ1JlZ2lzdHJ5LmFkZE1hcHBpbmcoUHJpdmF0ZVVERElTZWxlY3Rpb25XaWRnZXQuY2xhc3MsICJPcGVyYXRpb25UeXBlIiwgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kLmNsYXNzKTsKLSAgICAKLSAgICAvLyBQcml2YXRlVURESVNlbGVjdGlvbkNvbW1hbmRGcmFnbWVudAotICAgIGRhdGFNYXBwaW5nUmVnaXN0cnkuYWRkTWFwcGluZyhQcml2YXRlVURESVNlbGVjdGlvbldpZGdldC5jbGFzcywgIlByaXZhdGVVRERJUmVnaXN0cnlUeXBlIiwgUHJpdmF0ZVVERElTZWxlY3Rpb25Db21tYW5kRnJhZ21lbnQuY2xhc3MpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KQotICB7Ci0gICAgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzID0gbmV3IE1lc3NhZ2VVdGlscyhXZWJTZXJ2aWNlVURESVJlZ2lzdHJ5UGx1Z2luLklEICsgIi5wbHVnaW4iLCB0aGlzKTsKLSAgICB0aGlzLndpZGdldFJlZ2lzdHJ5ID0gd2lkZ2V0UmVnaXN0cnk7Ci0gICAgcHJpdmF0ZVVERElTZWxGcmFnbWVudC5yZWdpc3RlcldpZGdldE1hcHBpbmdzKHRoaXMud2lkZ2V0UmVnaXN0cnkpOwotCi0gICAgd2lkZ2V0UmVnaXN0cnkuYWRkKCJQcml2YXRlVURESVNlbGVjdGlvbldpZGdldCIsIAotICAgICAgbXNnVXRpbHMuZ2V0TWVzc2FnZSgiUEFHRV9USVRMRV9QUklWQVRFX1VERElfQ09ORklHIiksCi0gICAgICBtc2dVdGlscy5nZXRNZXNzYWdlKCJQQUdFX0RFU0NfUFJJVkFURV9VRERJX0NPTkZJRyIpLAotCSAgbmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpCi0gICAgICB7Ci0JICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIG5ldyBQcml2YXRlVURESVNlbGVjdGlvbldpZGdldCgpOwotCSAgICB9Ci0JICB9Ci0gICAgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg3YTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUgZXh0ZW5kcyBDb21tYW5kV2lkZ2V0QmluZGluZwotewotICAvLyBvcGVyYXRpb24gdHlwZXMKLSAgcHVibGljIHN0YXRpYyBieXRlIE9QX0RFUExPWSA9IDB4MDsKLSAgcHVibGljIHN0YXRpYyBieXRlIE9QX1VQREFURSA9IDB4MTsKLSAgcHVibGljIHN0YXRpYyBieXRlIE9QX1JFTU9WRSA9IDB4MjsKLQotICAvLyBnZW5lcmFsIGluZm9ybWF0aW9uCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpOwotICBwdWJsaWMgU3RhdHVzIGdldE9wZXJhdGlvblN0YXR1cyhieXRlIG9wZXJhdGlvbik7Ci0KLSAgLy8gcmVnaXN0cnkgVVJMcwotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlBUEkoKTsKLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoQVBJKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjUzM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWRkaXJlZ2lzdHJ5LndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVkZGlyZWdpc3RyeS53aWRnZXRzLmJpbmRpbmcuUHJpdmF0ZVVERElXaWRnZXRCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nOwotCi0KLXB1YmxpYyBjbGFzcyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkudWRkaS5Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZQotewotICAgIHB1YmxpYyBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZUltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCkgewotICAgICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzID0gUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0eXBlc1tpXS5pc1ByaXZhdGVVRERJUmVnaXN0cnlJbnN0YWxsZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFByaXZhdGVVRERJUmVnaXN0cnlJbnF1aXJ5QVBJKCkgewotICAgICAgICBWZWN0b3IgaW5xdWlyeUFQSVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbXSB0eXBlcyA9IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodHlwZXNbaV0uaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IHR5cGVzW2ldLmdldElucXVpcnlBUEkoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5xdWlyeUFQSSAhPSBudWxsICYmIGlucXVpcnlBUEkuc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgICAgICAgICAgICAgICBpbnF1aXJ5QVBJVmVjdG9yLmFkZChpbnF1aXJ5QVBJKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIGlucXVpcnlBUElBcnJheSA9IG5ldyBTdHJpbmdbaW5xdWlyeUFQSVZlY3Rvci5zaXplKCldOwotICAgICAgICBFbnVtZXJhdGlvbiBlID0gaW5xdWlyeUFQSVZlY3Rvci5lbGVtZW50cygpOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGlucXVpcnlBUElBcnJheVtqXSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaisrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnF1aXJ5QVBJQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFByaXZhdGVVRERJUmVnaXN0cnlQdWJsaXNoQVBJKCkgewotICAgICAgICBWZWN0b3IgcHVibGlzaEFQSVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbXSB0eXBlcyA9IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAodHlwZXNbaV0uaXNQcml2YXRlVURESVJlZ2lzdHJ5SW5zdGFsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHVibGlzaEFQSSA9IHR5cGVzW2ldLmdldFB1Ymxpc2hBUEkoKTsKLSAgICAgICAgICAgICAgICBpZiAocHVibGlzaEFQSSAhPSBudWxsICYmIHB1Ymxpc2hBUEkuc3RhcnRzV2l0aCgiaHR0cCIpKQotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoQVBJVmVjdG9yLmFkZChwdWJsaXNoQVBJKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ1tdIHB1Ymxpc2hBUElBcnJheSA9IG5ldyBTdHJpbmdbcHVibGlzaEFQSVZlY3Rvci5zaXplKCldOwotICAgICAgICBFbnVtZXJhdGlvbiBlID0gcHVibGlzaEFQSVZlY3Rvci5lbGVtZW50cygpOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIHB1Ymxpc2hBUElBcnJheVtqXSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaisrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwdWJsaXNoQVBJQXJyYXk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb21tYW5kV2lkZ2V0QmluZGluZyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFByaXZhdGVVRERJV2lkZ2V0QmluZGluZygpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VkZGlyZWdpc3RyeS93aXphcmQvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MWQ2YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5L3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWRkaXJlZ2lzdHJ5L3dpemFyZC9Qcml2YXRlVURESVJlZ2lzdHJ5VHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51ZGRpcmVnaXN0cnkud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVSZWdpc3RyeSBpbnN0YW5jZV87Ci0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c187Ci0KLSAgICBwcml2YXRlIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKSB7Ci0gICAgfQotICAKLSAgICAvKioKLSAgICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICAqIEByZXR1cm4gQSBzaW5nbGV0b24gV2ViU2VydmljZUNsaWVudFR5cGVSZWdpc3RyeSBvYmplY3QuCi0gICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIGlmIChpbnN0YW5jZV8gPT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFuY2VfID0gbmV3IFByaXZhdGVVRERJUmVnaXN0cnlUeXBlUmVnaXN0cnkoKTsKLSAgICAgICAgICAgIGluc3RhbmNlXy5nZXRDb25maWdFbGVtZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZV87Ci0gICAgfQotICAKLSAgICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29uZmlnRWxlbWVudHMoKSB7Ci0gICAgICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgICBjb25maWdFbGVtZW50c18gPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZVVERElSZWdpc3RyeVR5cGUiKTsKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRWxlbWVudHNfLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IHdlaWdodCA9IGdldFdlaWdodChjb25maWdFbGVtZW50c19baV0pOwotICAgICAgICAgIGludCBpbmRleCA9IC0xOwotICAgICAgICAgIGZvciAoaW50IGogPSB2LnNpemUoKS0xOyBqID49IDA7IGotLSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAod2VpZ2h0ID4gZ2V0V2VpZ2h0KChJQ29uZmlndXJhdGlvbkVsZW1lbnQpdi5nZXQoaikpKQotICAgICAgICAgICAgICBpbmRleCA9IGo7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgICB2LmFkZChpbmRleCwgY29uZmlnRWxlbWVudHNfW2ldKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB2LmFkZChjb25maWdFbGVtZW50c19baV0pOwotICAgICAgICB9Ci0gICAgICAgIHYuY29weUludG8oY29uZmlnRWxlbWVudHNfKTsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0VsZW1lbnRzXzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRXZWlnaHQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJ3ZWlnaHQiKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ0VsZW1lbnRCeUlEKFN0cmluZyBpZCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8Y29uZmlnRWxlbWVudHNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlnRWxlbWVudHNfW2ldLmdldEF0dHJpYnV0ZSgiaWQiKS5lcXVhbHMoaWQpKQotICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdFbGVtZW50c19baV07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlW10gZ2V0VHlwZXMoKSB7Ci0gICAgICAgIFZlY3RvciB0eXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbGVtZW50c18ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHR5cGVPYmogPSBjb25maWdFbGVtZW50c19baV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZU9iaiBpbnN0YW5jZW9mIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlKQotICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGQodHlwZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIH0KLQotICAgICAgICBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZVtdIHR5cGVzQXJyYXkgPSBuZXcgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGVbdHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgdHlwZXNBcnJheVtqXSA9IChQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSl0eXBlcy5lbGVtZW50QXQoaik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVzQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFByaXZhdGVVRERJUmVnaXN0cnlUeXBlIGdldFR5cGVCeUlEKFN0cmluZyBpZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IHR5cGVPYmogPSBnZXRDb25maWdFbGVtZW50QnlJRChpZCkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICAgICAgICAgIGlmICh0eXBlT2JqIGluc3RhbmNlb2YgUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChQcml2YXRlVURESVJlZ2lzdHJ5VHlwZSl0eXBlT2JqOyAKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRTZXJ2ZXJGYWN0b3J5SURCeUlEKFN0cmluZyBpZCkgewotICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGdldENvbmZpZ0VsZW1lbnRCeUlEKGlkKTsKLSAgICAgICAgaWYgKGNvbmZpZ0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgICAgICBWZWN0b3IgaWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInNlcnZlckZhY3RvcnlJRCIpLCAiLCIpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBpZFZlY3Rvci5hZGQoc3QubmV4dFRva2VuKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbaWRWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWRzW2ldID0gKFN0cmluZylpZFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlkczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VkZGlyZWdpc3RyeS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVkZGlyZWdpc3RyeS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VkZGlyZWdpc3RyeS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkOGFmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51ZGRpcmVnaXN0cnkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy91ZGRpcmVnaXN0cnkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIFByaXZhdGVVRERJQ29uZmlnUGFnZQotIwotUEFHRV9USVRMRV9QUklWQVRFX1VERElfQ09ORklHPVVuaXQgVGVzdCBVRERJIFJlZ2lzdHJ5IENvbmZpZ3VyYXRpb24KLVBBR0VfREVTQ19QUklWQVRFX1VERElfQ09ORklHPUNvbmZpZ3VyZSB0aGUgdW5pdCB0ZXN0IFVEREkgcmVnaXN0cnkuCi0KLSMKLSMgVG9vbHRpcCBmb3IgUHJpdmF0ZVVERElDb25maWdQYWdlCi0jCi1UT09MVElQX1BVUFJfUFJJVkFURV9VRERJX1BBR0U9RGVwbG95IG9yIHJlbW92ZSBhIFVuaXQgVGVzdCBVRERJIFJlZ2lzdHJ5Ci1UT09MVElQX1BVUFJfUFJJVkFURV9VRERJX1RZUEU9Q2hvb3NlIHRoZSB0eXBlIG9mIFVuaXQgVGVzdCBVRERJIFJlZ2lzdHJ5IHlvdSB3YW50IHRvIGRlcGxveQotVE9PTFRJUF9QVVBSX0RFUExPWV9QUklWQVRFX1VEREk9RGVwbG95IGEgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLVRPT0xUSVBfUFVQUl9VUERBVEVfUFJJVkFURV9VRERJPVVwZGF0ZSB0aGUgZXhpc3RpbmcgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLVRPT0xUSVBfUFVQUl9SRU1PVkVfUFJJVkFURV9VRERJPVJlbW92ZSB0aGUgZXhpc3RpbmcgVW5pdCBUZXN0IFVEREkgUmVnaXN0cnkKLQotIwotIyBDb21tb24gd2l6YXJkIHN0cmluZ3MuCi0jCi1MQUJFTF9QUklWQVRFX1VERElfUkVHSVNUUllfVFlQRVM9UHJpdmF0ZSBVRERJIFJlZ2lzdHJ5IHR5cGU6Ci1CVVRUT05fREVQTE9ZX1VERElfUkVHSVNUUlk9RGVwbG95IHRoZSBVbml0IFRlc3QgVURESSBSZWdpc3RyeQotQlVUVE9OX1VQREFURV9VRERJX1JFR0lTVFJZPVVwZGF0ZSB0aGUgcHJldmlvdXNseSBkZXBsb3llZCBVRERJIHJlZ2lzdHJ5Ci1CVVRUT05fUkVNT1ZFX1VERElfUkVHSVNUUlk9UmVtb3ZlIHRoZSBwcmV2aW91c2x5IGRlcGxveWVkIFVEREkgcmVnaXN0cnkKLQotIwotIyBXaXphcmQgcGFnZSB0YXNrIGxhYmVscyBhbmQgZGVzY3JpcHRpb25zCi0jICh1c2VkIG9ubHkgZm9yIHByb2dyZXNzIGluZGljYXRpb24pLgotIwotCi0jCi0jIERpYWxvZyBtZXNzYWdlcwotIwotCi0jCi0jIFByb2dyZXNzIG1lc3NhZ2VzCi0jCi0KLSMKLSMgV2FybmluZyBtZXNzYWdlcwotIwotCi0jCi0jIEVycm9yIG1lc3NhZ2VzCi0jCi1NU0dfRVJST1JfTk9fVURESV9SRUdJU1RSWV9BVkFJTEFCTEU9SVdBQjAzNjNFIE5vIFVEREkgcmVnaXN0cnkgYXZhaWxhYmxlLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmYWQzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzLXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlZjlhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5qc3Qud3M8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODgxZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHdzLXVpLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5hY3Rpb24sCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS51ZGRpLAotIG9yZy5lY2xpcHNlLmpzdC53cy51aQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmpkdC51aSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxZmZjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotc291cmNlLndzLXVpLmphciA9IHNyYy8KLWJpbi5pbmNsdWRlcyA9IHdzLXVpLmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZG9jLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIHRlc3QvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9pY29ucy9qYXJfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2ljb25zL2phcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTJmNGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL2ljb25zL2phcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhZWU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1QTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi0KLSMKLSMJV2ViIFNlcnZpY2VzIFByZWZlcmFuY2UgUGFnZXMKLSMKLSMgQ2F0ZWdvcmllcwotUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UPVJlc291cmNlIE1hbmFnZW1lbnQKLQotIwotIyAgV1MtSSBQcmVmZXJlbmNlIHBhZ2VzCi0jCi0jIFdTLUkgQ29tcGxpYW5jZSBQYWdlCi0jCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1dTST1XUy1JIENvbXBsaWFuY2UKLQotIwotIyBQb3B1cCBhY3Rpb24gQ2F0ZWdvcnkKLSMKLUxBQkVMX1BPUFVQX0NBVEVHT1JZX1dFQl9TRVJWSUNFUz1XZWIgU2VydmljZXMKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzA3MDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJVBMVUdJTl9ORVdfQ0FURUdPUllfTkFNRV9XUyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3Ij4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9SRVNPVVJDRV9NQU5BR0VNRU5UIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIj4KLSAgICAgIDwvcGFnZT4KLQotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQotICAgICAgCi0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudSI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9QT1BVUF9DQVRFR09SWV9XRUJfU0VSVklDRVMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudSI+Ci0gICAgICAgICAgICA8c2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICBuYW1lPSJwb3B1cEFjdGlvbnMiPgotICAgICAgICAgICAgPC9zZXBhcmF0b3I+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLQotPCEtLQotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkuZWpiLnBvcHVwTWVudSI+Ci0gICAgICAgICA8bWVudQotICAgICAgICAgICAgICAgbGFiZWw9IiVMQUJFTF9QT1BVUF9DQVRFR09SWV9XRUJfU0VSVklDRVMiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LmVqYi5wb3B1cE1lbnUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0icG9wdXBBY3Rpb25zIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0tLT4gICAgICAKLQotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vTGF1bmNoSW1wb3J0V2l6YXJkQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9MYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5N2FiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9MYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgbGF1bmNoZXMgdGhlIGltcG9ydCB3aXphcmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hJbXBvcnRXaXphcmRBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIAotICAgIHsKLSAgICAgIER5bmFtaWNXaXphcmQgd2l6YXJkID0gbmV3IER5bmFtaWNXaXphcmQoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHdpemFyZC5zZXRJbml0aWFsRGF0YSggIndzaW1wb3J0IiApOwotICAgICAgICB3aXphcmQuaW5pdCggUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uXyApOwotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgCi0gIAkgIFdpemFyZERpYWxvZyBkaWFsb2c9IG5ldyBXaXphcmREaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCB3aXphcmQpOwotCSAgZGlhbG9nLnNldFBhZ2VTaXplKCA1MDAsIDQwMCApOwotCSAgZGlhbG9nLmNyZWF0ZSgpOwotCSAgZGlhbG9nLm9wZW4oKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgCi0gICAgewotICAgICAgaWYoIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICkKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uXyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ0OGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvYWN0aW9uL1dlYlNlcnZpY2VEZXBsb3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VEZXBsb3kgewotCXB1YmxpYyB2b2lkIHJ1bihJUmVzb3VyY2Ugc2VsZWN0aW9uKTsgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XZWJTZXJ2aWNlRGVwbG95QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XZWJTZXJ2aWNlRGVwbG95QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjEwOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2ViU2VydmljZURlcGxveUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVwbG95QWN0aW9uIGV4dGVuZHMgV2luZG93QWN0aW9uRGVsZWdhdGUgewotcHVibGljIHZvaWQgcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uIGFjdGlvbikgewotCi0gICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0U2VsZWN0ZWRSZXNvdXJjZVByb2plY3QoKTsKLQotICAgU3RyaW5nIFtdIHR5cGVJZHMgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJUeXBlSWRzQnlNb2R1bGUocHJvamVjdCk7Ci0gICBPYmplY3QgdGhlQWN0aW9uID0gbnVsbDsKLQotICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoIm9yZy5lY2xpcHNlLmpzdC53cy51aSIsICJ3ZWJzZXJ2aWNlZGVwbG95Iik7Ci0gICB0cnkgewotICAgCQotICAgCWlmICh0eXBlSWRzID09IG51bGwgfHwgdHlwZUlkcy5sZW5ndGggPD0gMCkKLSAgIAl7Ci0gICAJIAkvLyB0aGF0IG1lYW5zIHRoZSBtb2R1bGUgaXMgbm90IGF0dGFjaGVkIHRvIGEgc2VydmVyIHRoZW4gcGljayB0aGUgZmlyc3QgZXh0ZW5zaW9uIGZvdW5kCi0gICAJICAgIHRoZUFjdGlvbiA9IGVsZW1lbnRzWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAJfQotICAgCWVsc2UgaWYgKCB0eXBlSWRzLmxlbmd0aCA9PSAxKQotICAgCXsKLSAgIAkJLy8gdGhhdCBtZWFucyB0aGUgbW9kdWxlIGlzIGF0dGFjaGVkIHRvIG9uZSBzZXJ2ZXIgdGhlbiBmaW5kcyBpdCBpZCBhbmQgYSBtYXRjaGluIGV4dGVuc2lvbiBvciBnaXZlIGEgbWVzc2FnZQotICAgCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgCXsKLQkJICAgCVN0cmluZyBpZCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiZmFjdG9yeUlkIik7Ci0gICAgCSAgIAlpZiAoIHR5cGVJZHNbMF0uZXF1YWxzKGlkKSkKLQkJICAgCXsKLQkJICAgCQl0aGVBY3Rpb24gPSBlbGVtZW50c1tpXS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkgICAJCWJyZWFrOwotCQkgICAJfQotICAgCQl9Ci0gICAJCWlmICh0aGVBY3Rpb24gPT0gbnVsbCApCi0gICAJCQl7Ci0gICAJCQkJLy8gZ2l2ZSBhIG1lc3NhZ2UKLSAgIAkJCX0KLSAgIAl9Ci0gICAJZWxzZQotICAgCXsKLQkJLy8gVGhlIG1vZHVsZSBpcyBhdHRhY2hlZCB0byBtb3JlIHRoYW4gb25lIHNlcnZlciBmaW5kIHRoZSBmaXJzdCBzZXJ2ZXItZXh0ZW5zaW9uIGNvdXBsZQotCQkvLyBUQkQ6IGFkZCBhIGRpYWxvZyB0byBjaG9vc2UgdGhlIHNlcnZlciBmb3IgZGVwbG95bWVudAotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgCXsKLQkJICAgCVN0cmluZyBpZCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZSgiZmFjdG9yeUlkIik7Ci0JCSAgIAlmb3IgKCBpbnQgaz0wOyBrPCB0eXBlSWRzLmxlbmd0aDsgaysrKQotCQkgICAJewotICAgIAkgICAJCWlmICggdHlwZUlkc1trXS5lcXVhbHMoaWQpKQotCQkgICAJCXsKLQkJICAgCQkJdGhlQWN0aW9uID0gZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJICAgCQkJYnJlYWs7Ci0JCSAgIAkJfQotCQkgICAJfQotCQkgICBpZiAodGhlQWN0aW9uICE9IG51bGwpIGJyZWFrOwotICAgCQkgfQotCQlpZiAodGhlQWN0aW9uID09IG51bGwpIAotCQkJewotCQkJCS8vIGdpdmUgYSBNZXNzYWdlCi0JCQl9Ci0gICAJfQotCi0gICAgaWYgKHRoZUFjdGlvbiBpbnN0YW5jZW9mIFdlYlNlcnZpY2VEZXBsb3kpCi0gICAgICAgICAgKChXZWJTZXJ2aWNlRGVwbG95KXRoZUFjdGlvbikucnVuKHByb2plY3QpOyAgIAotICB9Ci0KLSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotfQotIAotCi0JcHJpdmF0ZSBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCi0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2plY3QpOwotCQlpZiAobW9kdWxlcyE9bnVsbCAmJiBtb2R1bGVzLmxlbmd0aCE9MCkgewotCQkJcmV0dXJuIG1vZHVsZXNbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotIAl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9hY3Rpb24vV2luZG93QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZTI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2FjdGlvbi9XaW5kb3dBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5hY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdpbmRvd0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi1wdWJsaWMgV2luZG93QWN0aW9uRGVsZWdhdGUoKSB7Ci0gICAgc3VwZXIoKTsKLSB9Ci0KLXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSAKLSB7Ci0gfQotCi1wdWJsaWMgdm9pZCBpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7IH0KLQotcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICBmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gfQotCi1wdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLX0KLXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JcmV0dXJuIGZTZWxlY3Rpb247Ci19Ci0KLXB1YmxpYyBJUHJvamVjdCBnZXRTZWxlY3RlZFJlc291cmNlUHJvamVjdCgpIHsKLSBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLSBJUmVzb3VyY2UgcmVzb3VyY2VfID0gbnVsbDsKLSAgIHRyeSB7Ci0gICAJCWlmIChmU2VsZWN0aW9uICE9IG51bGwgJiYgZlNlbGVjdGlvbi5zaXplKCkgPT0gMSkgICAgewotICAgICAgCQlPYmplY3Qgb2JqID0gZlNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgCQlpZiAob2JqICE9IG51bGwpICAgIHsKLSAgICAgIAkJCWlmICggb2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSAKLSAgICAgIAkJCQl7Ci0gICAgICAJCQkJCXJlc291cmNlXyA9IChJUmVzb3VyY2UpIG9iajsKLSAgICAgIAkJCQl9Ci0gICAgICAJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KQotICAgICAgCQkJewotICAgICAgICAJCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBVbml0ID0gKElDb21waWxhdGlvblVuaXQpb2JqOwotICAgICAgICAJCQlyZXNvdXJjZV89IGNvbXBVbml0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotICAgICAgCQkJfQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQlwcm9qZWN0ID0gKChJSmF2YVByb2plY3QpIG9iaikuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQotCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqKTsKLQkJCQl9Ci0KLSAgICAgIAkJCWlmICggcmVzb3VyY2VfICE9IG51bGwgKQotICAgCQkJCQlwcm9qZWN0ID0gcmVzb3VyY2VfLmdldFByb2plY3QoKTsKLSAgICAgICAgIAkJCi0gICAgCQl9Ci0gICAJCX0KLSAgIAl9CQotICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgcmV0dXJuIHByb2plY3Q7Ci0gfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9EaWFsb2dSZXNvdXJjZUJyb3dzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0RpYWxvZ1Jlc291cmNlQnJvd3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZmYjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0RpYWxvZ1Jlc291cmNlQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0qIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHdvcmtzcGFjZSByZXNvdXJjZXMuCi0qIFNlZSBhbHNvIHtAbGluayBEaWFsb2dVdGlscyNicm93c2VSZXNvdXJjZXN9LgotKi8KLXB1YmxpYyBjbGFzcyBEaWFsb2dSZXNvdXJjZUJyb3dzZXIgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9SRVNPVVJDRV9UUkVFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5EUkVTMDAwMSI7Ci0KLSAgcHJpdmF0ZSBTaGVsbCBzaGVsbF87Ci0gIHByaXZhdGUgSVJlc291cmNlIHJvb3RfOwotICBwcml2YXRlIElGaWx0ZXJbXSBmaWx0ZXJzXzsKLSAgcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF87Ci0gIHByaXZhdGUgSVJlc291cmNlW10gc2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBUcmVlIHJlc291cmNlVHJlZV87Ci0gIHByaXZhdGUgVHJlZVZpZXdlciBmaWxlVmlld2VyXzsKLQotICBwdWJsaWMgRGlhbG9nUmVzb3VyY2VCcm93c2VyKFNoZWxsIHNoZWxsLCBJUmVzb3VyY2Ugcm9vdCwgSUZpbHRlciBmaWx0ZXIpCi0gIHsKLSAgICB0aGlzKHNoZWxsLCByb290LCBuZXcgSUZpbHRlcltde2ZpbHRlcn0pOwotICB9Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5EaWFsb2dSZXNvdXJjZUJyb3dzZXI8L2NvZGU+Ci0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnBhcmVudCBTaGVsbDwvY29kZT4uCi0gICogVGhlIGRpYWxvZyByZW5kZXJzIGFsbCByZXNvdXJjZXMgaW5jbHVkaW5nIGFuZAotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5yb290IElSZXNvdXJjZTwvY29kZT4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsfS4KLSAgKiBvciBudWxsIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbC4KLSAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSwKLSAgKiBvciBudWxsIHRvIGJlZ2luIHdpdGggdGhlIHdvcmtzcGFjZSByb290LgotICAqIEBwYXJhbSBmaWx0ZXJzIEFuIGFycmF5IG9mIGphdmEubGFuZy5TdHJpbmcKLSAgKi8KLSAgcHVibGljIERpYWxvZ1Jlc291cmNlQnJvd3NlcihTaGVsbCBzaGVsbCwgSVJlc291cmNlIHJvb3QsIElGaWx0ZXJbXSBmaWx0ZXJzKQotICB7Ci0gICAgc3VwZXIoc2hlbGwpOwotICAgIHNoZWxsXyA9IHNoZWxsOwotCi0gICAgSVJlc291cmNlIG1vZHVsZVJvb3QgPSByb290OwotICAgIGlmIChyb290IGluc3RhbmNlb2YgSVByb2plY3QpCi0gICAgewotICAgICAgSVByb2plY3QgcCA9IChJUHJvamVjdCltb2R1bGVSb290OwotICAgICAgSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwKTsKLSAgICAgIGlmIChuYXR1cmUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbW9kdWxlUm9vdCA9IG5hdHVyZS5nZXRNb2R1bGVTZXJ2ZXJSb290KCk7Ci0gICAgICB9Ci0gICAgCi0gICAgfQotCi0gICAgcm9vdF8gPSAobW9kdWxlUm9vdCA9PSBudWxsKSA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkgOiBtb2R1bGVSb290OwotICAgIGZpbHRlcnNfID0gKGZpbHRlcnMgPT0gbnVsbCkgPyBuZXcgSUZpbHRlclswXSA6IGZpbHRlcnM7Ci0gICAgbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXyA9IGZhbHNlOwotICAgIHNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gIH0KLQotICAvKioKLSAgKiBFbmFibGVzIG9yIGRpc2FibGVzIG11bHRpcGxlIHNlbGVjdGlvbiBpbiB0aGUgdHJlZSB2aWV3LgotICAqIE11bHRpcGxlIHNlbGVjdGlvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQgVHJ1ZSB0byBlbmFibGVkIG9yIGZhbHNlIHRvIGRpc2FibGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZChib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZCkKLSAgewotICAgIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF8gPSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQ7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIG1hZGUgaW4gdGhlIGRpYWxvZyBpZiBPSyB3YXMgcHJlc3NlZCwKLSAgKiBvciBudWxsIGlmIENhbmNlbCB3YXMgcHJlc3NlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBoYXMgbmV2ZXIgYmVlbiBvcGVuZWQuCi0gICogQHJldHVybiBBbiBhcnJheSBvZiBzZWxlY3RlZCByZXNvdXJjZXMsIHBvc3NpYmx5IGVtcHR5LCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgSVJlc291cmNlW10gZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25fOwotICB9Ci0KLSAgcHVibGljIElSZXNvdXJjZSBnZXRGaXJzdFNlbGVjdGlvbigpCi0gIHsKLSAgICBpZiAoc2VsZWN0aW9uXyAhPSBudWxsICYmIHNlbGVjdGlvbl8ubGVuZ3RoID4gMCkKLSAgICAgIHJldHVybiBzZWxlY3Rpb25fWzBdOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQuCi0gICogSW5zdXJlcyB0aGF0IHtAbGluayAjZ2V0UmVzdWx0fSB3aWxsIHJldHVybiBudWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkKLSAgewotICAgIHNlbGVjdGlvbl8gPSBudWxsOwotICAgIHNldFJldHVybkNvZGUoRGlhbG9nLkNBTkNFTCk7Ci0gICAgc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBwcmVzc2VkLgotICAqIFNxdWlycmVscyBhd2F5IHRoZSBsaXN0IG9mIHplcm8gb3IgbW9yZSBzZWxlY3RlZAotICAqIDxjb2RlPklSZXNvdXJjZTwvY29kZT5zIHRvIGJlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UmVzdWx0fS4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkKLSAgewotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZmlsZVZpZXdlcl8uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgc2VsZWN0aW9uXyA9IG5ldyBJUmVzb3VyY2Vbc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCldOwotICAgICAgaW50IGkgPSAwOwotICAgICAgSXRlcmF0b3IgaXQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICAgIHNlbGVjdGlvbl9baSsrXSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgfQotICAgIH0KLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5PSyk7Ci0gICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gIH0KLQotICAvKioKLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGx9LgotICAqIEBwYXJhbSBzaGVsbCBUaGUgc2hlbGwuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKQotICB7Ci0gICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgIHNoZWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9SRVNPVVJDRV9CUk9XU0VSIikpOwotICB9Ci0KLSAgLyoqIAotICAqIENyZWF0ZXMgdGhlIGRpYWxvZyBhcmVhLgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0gICogQHJldHVybiBUaGUgY29udHJvbCBhcmVhLgotICAqLwotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGdkLndpZHRoSGludCA9IDQwMDsKLSAgICBnZC5oZWlnaHRIaW50ID0gMzAwOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBpZiAobXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXykKLSAgICB7Ci0gICAgICByZXNvdXJjZVRyZWVfID0gbmV3IFRyZWUoY29tcG9zaXRlLFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzb3VyY2VUcmVlXyA9IG5ldyBUcmVlKGNvbXBvc2l0ZSxTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgfQotICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgcmVzb3VyY2VUcmVlXy5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICByZXNvdXJjZVRyZWVfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1JFU09VUkNFX1RSRUUiKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXNvdXJjZVRyZWVfLCBJTkZPUE9QX1JFU09VUkNFX1RSRUUpOwotCi0gICAgZmlsZVZpZXdlcl8gPSBuZXcgVHJlZVZpZXdlcihyZXNvdXJjZVRyZWVfKTsKLSAgICBmaWxlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLSAgICBmaWxlVmlld2VyXy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKSkpOwotICAgIGZpbGVWaWV3ZXJfLmFkZEZpbHRlcigKLSAgICAgIG5ldyBWaWV3ZXJGaWx0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudE9iamVjdCwgT2JqZWN0IG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSAmJiAoKElSZXNvdXJjZSlvYmplY3QpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnNfLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoZmlsdGVyc19baV0uYWNjZXB0cyhvYmplY3QpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0SW5wdXQocm9vdF8pOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtc2dJZCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShtc2dJZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0ZpbGVFeHRlbnNpb25GaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0ZpbGVFeHRlbnNpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzNTVjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9GaWxlRXh0ZW5zaW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi0vKioKLSogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIGNsYXNzIG9mIG9iamVjdHMgdGhhdCBmaWx0ZXIKLSogb3RoZXIgb2JqZWN0cyBmb3IgaW5jbHVzaW9uIG9yIGV4Y2x1c2lvbiBieSBzb21lIGNvbnN1bWVyLgotKi8KLXB1YmxpYyBjbGFzcyBGaWxlRXh0ZW5zaW9uRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlcgotewotICBwcml2YXRlIFN0cmluZ1tdIGV4dGVuc2lvbnNfOwotCi0gIHB1YmxpYyBGaWxlRXh0ZW5zaW9uRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMpCi0gIHsKLSAgICBleHRlbnNpb25zXyA9IChleHRlbnNpb25zICE9IG51bGwpID8gZXh0ZW5zaW9ucyA6IG5ldyBTdHJpbmdbMF07Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS5lZGl0b3IuY29tbW9uLkZpbGVFeHRlbnNpb25GaWx0ZXIiOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmpzdC53cy5hdGsudWkuZWRpdG9yLmNvbW1vbi5GaWxlRXh0ZW5zaW9uRmlsdGVyIjsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LiBUaGlzIG1ldGhvZAotICAqIG11c3QgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0KLSAgKiByZXR1cm5zIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggYSBzZXZlcml0eSBvZgotICAqIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpCi0gICAgewotICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSlvYmplY3Q7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnNfLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZXh0ZW5zaW9uc19baV0pKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0lGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL0lGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1ZGI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLmNvbW1vbjsKLQotLyoqCi0qIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSBjbGFzcyBvZiBvYmplY3RzIHRoYXQgZmlsdGVyCi0qIG90aGVyIG9iamVjdHMgZm9yIGluY2x1c2lvbiBvciBleGNsdXNpb24gYnkgc29tZSBjb25zdW1lci4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIKLXsKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG5hbWUgb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gICogYWNjZXB0cyB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4gVGhpcyBtZXRob2QKLSAgKiBtdXN0IHJldHVybiB0cnVlIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjc3RhdHVzT2Z9Ci0gICogcmV0dXJucyBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiB3aXRoIGEgc2V2ZXJpdHkgb2YKLSAgKiBsZXNzIHRoYW4gPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4uCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyA8Y29kZT5GaWx0ZXI8L2NvZGU+Ci0gICogYWNjZXB0cyB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyhPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL1VJVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvY29tbW9uL1VJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExNWE4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2NvbW1vbi9VSVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFVJVXRpbHMgCi17Ci0gIFN0cmluZyAgICAgICBpbmZvUG9waWRfOwotICBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotICAKLSAgcHVibGljIFVJVXRpbHMoIE1lc3NhZ2VVdGlscyBtc2dVdGlscywgU3RyaW5nIGluZm9Qb3BpZCApCi0gIHsKLSAgICBtc2dVdGlsc18gID0gbXNnVXRpbHM7Ci0gICAgaW5mb1BvcGlkXyA9IGluZm9Qb3BpZDsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbiggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIHJldHVybiBjcmVhdGVCdXR0b24oIFNXVC5SQURJTywgcGFyZW50LCBsYWJlbE5hbWUsIHRvb2x0aXAsIGluZm9wb3AgKTsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIHJldHVybiBjcmVhdGVCdXR0b24oIFNXVC5DSEVDSywgcGFyZW50LCBsYWJlbE5hbWUsIHRvb2x0aXAsIGluZm9wb3AgKTsKLSAgfQotICAKLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxOYW1lLCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIGluZm9wb3AgKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUJ1dHRvbiggU1dULk5PTkUsIHBhcmVudCwgbGFiZWxOYW1lLCB0b29sdGlwLCBpbmZvcG9wICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKCBpbnQga2luZCwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIGtpbmQgKTsKLSAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gbGFiZWxOYW1lIDogdG9vbHRpcDsKLSAgICBidXR0b24uc2V0VGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIGxhYmVsTmFtZSApICk7Ci0gICAgYnV0dG9uLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSggdG9vbHRpcCApICk7Ci0gICAgCi0gICAgaWYoIGluZm9wb3AgIT0gbnVsbCApIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGJ1dHRvbiwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0gIAotICBwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm8oIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbE5hbWUsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCwgaW50IHN0eWxlICkKLSAgeyAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gbGFiZWxOYW1lIDogdG9vbHRpcDsKLSAgICAKLSAgICBpZiggbGFiZWxOYW1lICE9IG51bGwgKQotICAgIHsKLSAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5XUkFQKTsKLSAgICAgIGxhYmVsLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBsYWJlbE5hbWUgKSApOwotICAgICAgbGFiZWwuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCB0b29sdGlwICkgKTsKLSAgICB9Ci0gICAgCi0gICAgQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oIHBhcmVudCwgc3R5bGUgKTsKLSAgICBHcmlkRGF0YSBncmlkZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAKLSAgICBjb21iby5zZXRMYXlvdXREYXRhKCBncmlkZGF0YSApOwotICAgIGNvbWJvLnNldFRvb2xUaXBUZXh0KCBtc2dVdGlsc18uZ2V0TWVzc2FnZSh0b29sdGlwKSk7Ci0gICAgCi0gICAgaWYoIGluZm9wb3AgIT0gbnVsbCApIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoIGNvbWJvLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCApOwotICAgIAotICAgIHJldHVybiBjb21ibzsgICAgICAKLSAgfQotICAKLSAgcHVibGljIFRleHQgY3JlYXRlVGV4dCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wLCBpbnQgc3R5bGUgKQotICB7ICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyBsYWJlbE5hbWUgOiB0b29sdGlwOwotICAgIAotICAgIGlmKCBsYWJlbE5hbWUgIT0gbnVsbCApCi0gICAgewotICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULldSQVApOwotICAgICAgbGFiZWwuc2V0VGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIGxhYmVsTmFtZSApICk7Ci0gICAgICBsYWJlbC5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UoIHRvb2x0aXAgKSApOwotICAgIH0KLSAgICAKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dCggcGFyZW50LCBzdHlsZSApOwotICAgIEdyaWREYXRhIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgCi0gICAgdGV4dC5zZXRMYXlvdXREYXRhKCBncmlkZGF0YSApOwotICAgIHRleHQuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKHRvb2x0aXApKTsKLSAgICAKLSAgICBpZiggaW5mb3BvcCAhPSBudWxsICkgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggdGV4dCwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gdGV4dDsgICAgICAKLSAgfQotICAKLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoIENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zICkKLSAgewotICAgIHJldHVybiBjcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgY29sdW1ucywgLTEsIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKCBDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucywgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoICkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgCi0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICAgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRsYXlvdXQubnVtQ29sdW1ucyAgID0gY29sdW1uczsKLSAgCi0gICAgaWYoIG1hcmdpbkhlaWdodCA+PSAwICkgZ3JpZGxheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7Ci0gICAgaWYoIG1hcmdpbldpZHRoID49IDAgKSAgZ3JpZGxheW91dC5tYXJnaW5XaWR0aCAgPSBtYXJnaW5XaWR0aDsKLSAgICAKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KCBncmlkbGF5b3V0ICk7Ci0gICAgR3JpZERhdGEgZ3JpZGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggZ3JpZGRhdGEgKTsKLSAgICAKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIAotICB9Ci0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wICkKLSAgewotICAJcmV0dXJuIGNyZWF0ZUdyb3VwKCBwYXJlbnQsIGdyb3VwTmFtZSwgdG9vbHRpcCwgaW5mb3BvcCwgMSwgLTEsIC0xICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGdyb3VwTmFtZSwgU3RyaW5nIHRvb2x0aXAsIFN0cmluZyBpbmZvcG9wLCBpbnQgY29sdW1ucywgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoICkKLSAgewotICAgIEdyb3VwICAgICAgbmV3R3JvdXAgICAgPSBuZXcgR3JvdXAoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgICBHcmlkRGF0YSAgIGdyaWRkYXRhICAgID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgCi0gICAgZ3JpZGxheW91dC5udW1Db2x1bW5zICA9IGNvbHVtbnM7Ci0gIAotICAgIGlmKCBtYXJnaW5IZWlnaHQgPj0gMCApIGdyaWRsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotICAgIGlmKCBtYXJnaW5XaWR0aCA+PSAwICkgIGdyaWRsYXlvdXQubWFyZ2luV2lkdGggID0gbWFyZ2luV2lkdGg7Ci0gICAgICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyBncm91cE5hbWUgOiB0b29sdGlwOwotICAgIG5ld0dyb3VwLnNldExheW91dCggZ3JpZGxheW91dCApOwotICAgIG5ld0dyb3VwLnNldFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCBncm91cE5hbWUgKSApOwotICAgIG5ld0dyb3VwLnNldExheW91dERhdGEoIGdyaWRkYXRhICk7Ci0gICAgbmV3R3JvdXAuc2V0VG9vbFRpcFRleHQoIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCB0b29sdGlwICkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5ld0dyb3VwLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCk7Ci0gICAgCi0gICAgcmV0dXJuIG5ld0dyb3VwOwotICB9Ci0gIAotICBwdWJsaWMgVHJlZSBjcmVhdGVUcmVlKCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdG9vbHRpcCwgU3RyaW5nIGluZm9wb3AsIGludCBzdHlsZSApCi0gIHsKLSAgICAKLSAgICB0b29sdGlwID0gdG9vbHRpcCA9PSBudWxsID8gIiIgOiB0b29sdGlwOwotICAgIAotICAgIFRyZWUgdHJlZSA9IG5ldyBUcmVlKCBwYXJlbnQsIHN0eWxlICk7Ci0gICAgIAotICAgIHRyZWUuc2V0TGF5b3V0RGF0YSggY3JlYXRlRmlsbEFsbCgpICk7Ci0gICAgdHJlZS5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UodG9vbHRpcCkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCB0cmVlLCBpbmZvUG9waWRfICsgIi4iICsgaW5mb3BvcCApOwotICAgIAotICAgIHJldHVybiB0cmVlOyAgICAgIAotICAgIAotICB9Ci0gIAotICBwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0b29sdGlwLCBTdHJpbmcgaW5mb3BvcCwgaW50IHN0eWxlICkKLSAgewotICAgIAotICAgIHRvb2x0aXAgPSB0b29sdGlwID09IG51bGwgPyAiIiA6IHRvb2x0aXA7Ci0gICAgCi0gICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoIHBhcmVudCwgc3R5bGUgKTsKLSAgICAgCi0gICAgLy90YWJsZS5zZXRMYXlvdXREYXRhKCBjcmVhdGVGaWxsQWxsKCkgKTsKLSAgICB0YWJsZS5zZXRUb29sVGlwVGV4dCggbXNnVXRpbHNfLmdldE1lc3NhZ2UodG9vbHRpcCkpOwotICAgIAotICAgIGlmKCBpbmZvcG9wICE9IG51bGwgKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKCB0YWJsZSwgaW5mb1BvcGlkXyArICIuIiArIGluZm9wb3AgKTsKLSAgICAKLSAgICByZXR1cm4gdGFibGU7ICAgICAgCi0gICAgCi0gIH0gIAotICAKLSAgcHVibGljIExhYmVsIGNyZWF0ZUhvcml6b250YWxTZXBhcmF0b3IoIENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFjaW5nICkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoIHBhcmVudCwgMSwgc3BhY2luZywgLTEgKTsKLSAgICAgCi0JTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCApOwotCQotCUdyaWREYXRhIGdyaWRkYXRhICA9IG5ldyBHcmlkRGF0YSggR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMICk7Ci0Jc2VwYXJhdG9yLnNldExheW91dERhdGEoIGdyaWRkYXRhICk7Ci0gICAKLQlyZXR1cm4gc2VwYXJhdG9yOwotICB9Ci0gIAotICBwdWJsaWMgR3JpZERhdGEgY3JlYXRlRmlsbEFsbCgpCi0gIHsKLQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfAotCQkJICAgICAgICAgICAgICAgICAgICAgIEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCApOwotICAgIHJldHVybiBkYXRhOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9EaWFsb2dVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9kaWFsb2cvRGlhbG9nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlYWYwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9EaWFsb2dVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkuZGlhbG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lclNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLQotCi0vKioKLSogQ29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBsYXVuY2hpbmcgdmFyaW91cyBjb21tb24gZGlhbG9ncy4KLSovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhbG9nVXRpbHMKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgY29udGFpbmVycy4KLSAgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCwgb3B0aW9uYWxseSBudWxsLgotICAqIEBwYXJhbSBpbml0aWFsUGF0aG5hbWUgVGhlIGluaXRpYWwgc2VsZWN0aW9uLgotICAqIEByZXR1cm4gVGhlIHNlbGVjdGVkIGNvbnRhaW5lciBvciBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBpcyBjYW5jZWxsZWQsIG9yIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiwgb3IgdGhlIHNlbGVjdGlvbgotICAqIGlzIG5vdCBhIHByb2plY3Qgb3IgYSBmb2xkZXIuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUNvbnRhaW5lcnMgKCBTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGluaXRpYWxQYXRobmFtZSApCi0gIHsKLSAgICBTdHJpbmcgc2VsZWN0ZWRQYXRobmFtZSA9IG51bGw7Ci0gICAgSVBhdGggaW5pdGlhbFBhdGggPSBuZXcgUGF0aChpbml0aWFsUGF0aG5hbWUpOwotICAgIElSZXNvdXJjZSBpbml0aWFsUmVzb3VyY2UgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGluaXRpYWxQYXRoKTsKLSAgICBpZiAoaW5pdGlhbFJlc291cmNlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGluaXRpYWxQYXRoLnNlZ21lbnRDb3VudCgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoaW5pdGlhbFBhdGguc2VnbWVudCgwKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbml0aWFsUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0gICAgICB7Ci0gICAgICAgIGluaXRpYWxSZXNvdXJjZSA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldEZvbGRlcihpbml0aWFsUGF0aCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5pdGlhbFJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgaW5pdGlhbFJlc291cmNlID0gaW5pdGlhbFJlc291cmNlLmdldFBhcmVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBDb250YWluZXJTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IENvbnRhaW5lclNlbGVjdGlvbkRpYWxvZyhwYXJlbnRTaGVsbCwoSUNvbnRhaW5lcilpbml0aWFsUmVzb3VyY2UsdHJ1ZSxudWxsKTsKLSAgICBkaWFsb2cub3BlbigpOwotICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCA+IDApCi0gICAgewotICAgICAgaWYgKHJlc3VsdFswXSBpbnN0YW5jZW9mIElQYXRoKQotICAgICAgewotICAgICAgICBJUGF0aCBwYXRoID0gKElQYXRoKXJlc3VsdFswXTsKLSAgICAgICAgc2VsZWN0ZWRQYXRobmFtZSA9IHBhdGgudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNlbGVjdGVkUGF0aG5hbWU7Ci0gIH0KLQotICAvKioKLSAgKiBSYWlzZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHJlc291cmNlcy4KLSAgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCwgb3B0aW9uYWxseSBudWxsLgotICAqIEBwYXJhbSB0b3BSZXNvdXJjZSBUaGUgcmVzb3VyY2UgdW5kZXIgd2hpY2ggdG8gYnJvd3NlLgotICAqIElmIG51bGwsIGFsbCByZXNvdXJjZXMgaW4gdGhlIHdvcmtzcGFjZSBhcmUgYnJvd3NlZC4KLSAgKiBAcGFyYW0gaW5pdGlhbFNlbGVjdGlvbiBUaGUgaW5pdGlhbCBzZWxlY3Rpb24sIG9yIG51bGwgZm9yIG5vbmUuCi0gICogSWYgdGhlIGluaXRpYWwgc2VsZWN0aW9uIGlzIG5vdCBudWxsIGFuZCBleGlzdHMgaW4gdGhlIHNldCBvZgotICAqIHJlc291cmNlcyBmb3VuZCBieSB0aGUgYnJvd3NlciwgdGhhdCByZXNvdXJjZSBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHJlc291cmNlIGZpbHRlciBvYmplY3QuCi0gICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcmVzb3VyY2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGJyb3dzZVJlc291cmNlcyAoIFNoZWxsIHBhcmVudFNoZWxsLCBJUmVzb3VyY2UgdG9wUmVzb3VyY2UsIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uLCBGaWx0ZXIgZmlsdGVyKQotICB7Ci0gICAgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgcmRzID0gbmV3IFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKHBhcmVudFNoZWxsLHRvcFJlc291cmNlLGluaXRpYWxTZWxlY3Rpb24sZmlsdGVyKTsKLSAgICByZHMuc2V0TXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkKGZhbHNlKTsKLSAgICBpZiAocmRzLm9wZW4oKSA9PSBEaWFsb2cuT0spCi0gICAgewotICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gcmRzLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlcy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICByZXR1cm4gcmVzb3VyY2VzWzBdOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIDxiPkltcGxlbWVudGF0aW9uIHJlbWFpbnMgVEJELjwvYj48YnI+Ci0gICogUmFpc2VzIGEgZGlhbG9nIGZvciBicm93c2luZyBjbGFzc2VzIG9uIGEgcHJvamVjdCdzIGNsYXNzIHBhdGguCi0gICogQHBhcmFtIHBhcmVudFNoZWxsIFRoZSBwYXJlbnQgc2hlbGwsIG9wdGlvbmFsbHkgbnVsbC4KLSAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdC4KLSAgKiBAcmV0dXJuIFRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgamF2YSBjbGFzcy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQ2xhc3NlcyAoIFNoZWxsIHBhcmVudFNoZWxsLCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgewotICAgIHJldHVybiBicm93c2VDbGFzc2VzKHBhcmVudFNoZWxsLCBwcm9qZWN0LCAoSVJ1bm5hYmxlQ29udGV4dCludWxsKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUNsYXNzZXMgKCBTaGVsbCBwYXJlbnRTaGVsbCwgSVByb2plY3QgcHJvamVjdCwgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIpCi0gIHsKLSAgICByZXR1cm4gYnJvd3NlQ2xhc3NlcyhwYXJlbnRTaGVsbCwgcHJvamVjdCwgKElSdW5uYWJsZUNvbnRleHQpY29udGFpbmVyKTsKLSAgfQotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgY2xhc3NlcyBvbiBhIHByb2plY3QncyBjbGFzcyBwYXRoLgotICAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsLCBvcHRpb25hbGx5IG51bGwuCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBsYXVuY2hpbmcgd2l6YXJkLgotICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWxlY3RlZCBqYXZhIGNsYXNzLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VDbGFzc2VzICggU2hlbGwgcGFyZW50U2hlbGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUnVubmFibGVDb250ZXh0IGN0eHQpIAotICB7Ci0gICAgcmV0dXJuIGJyb3dzZUNsYXNzZXMocGFyZW50U2hlbGwsIG5ldyBJUmVzb3VyY2VbXSB7cHJvamVjdH0sIGN0eHQpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VDbGFzc2VzKFNoZWxsIHBhcmVudFNoZWxsLCBJUmVzb3VyY2VbXSByZXNvdXJjZXMsIElSdW5uYWJsZUNvbnRleHQgY3R4dCkKLSAgewotICAgIElUeXBlIGl0eXBlID0gYnJvd3NlQ2xhc3Nlc0FzSVR5cGUocGFyZW50U2hlbGwsIHJlc291cmNlcywgY3R4dCk7Ci0gICAgaWYgKGl0eXBlICE9IG51bGwpCi0gICAgICByZXR1cm4gaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgSVR5cGUgYnJvd3NlQ2xhc3Nlc0FzSVR5cGUoU2hlbGwgcGFyZW50U2hlbGwsIElSZXNvdXJjZVtdIHJlc291cmNlcywgSVJ1bm5hYmxlQ29udGV4dCBjdHh0KQotICB7Ci0JVmVjdG9yIGphdmFFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykKLQl7Ci0JICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2VzW2ldKTsKLQkgIGlmIChqYXZhRWxlbWVudCAhPSBudWxsKQotCSAgICBqYXZhRWxlbWVudHMuYWRkKGphdmFFbGVtZW50KTsKLQl9Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSAoSUphdmFFbGVtZW50W10pamF2YUVsZW1lbnRzLnRvQXJyYXkobmV3IElKYXZhRWxlbWVudFswXSk7Ci0JCi0gICAgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotICAgIHNjb3BlLnNldEluY2x1ZGVzQ2xhc3NwYXRocyh0cnVlKTsKLSAgICBzY29wZS5zZXRJbmNsdWRlc0JpbmFyaWVzKHRydWUpOwotCi0gICAgLy9DcmVhdGluZyBhbmQgb3BlbmluZyBhIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSAgICB0cnkKLQl7Ci0gICAgICBTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2cocGFyZW50U2hlbGwsIGN0eHQsIHNjb3BlLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgZmFsc2UpOwotICAgICAgZGlhbG9nLnNldFRpdGxlKFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX0NMQVNTX0JST1dTRSIpKTsKLSAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX0NMQVNTX0JST1dTRSIpKTsgICAgCi0gICAgICBkaWFsb2cub3BlbigpOwotCi0gICAgICAvL0dldHRpbmcgdGhlIHJlc3VsdCBhbmQgcmV0dXJuaW5nIGl0Ci0gICAgICBPYmplY3RbXSByZXN1bHRzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgaWYgKHJlc3VsdHMgIT0gbnVsbCAmJiByZXN1bHRzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChyZXN1bHRzWzBdIGluc3RhbmNlb2YgSVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKElUeXBlKXJlc3VsdHNbMF07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JewotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAqIFJhaXNlcyBhIGRpYWxvZyBmb3IgYnJvd3NpbmcgaW50ZXJmYWNlcyBvbiBhIHByb2plY3QncyBjbGFzcyBwYXRoLgotICAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsLCBvcHRpb25hbGx5IG51bGwuCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QuCi0gICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBsYXVuY2hpbmcgd2l6YXJkLgotICAqIEByZXR1cm4gVGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZWxlY3RlZCBqYXZhIGludGVyZmFjZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlSW50ZXJmYWNlcyggU2hlbGwgcGFyZW50U2hlbGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdpemFyZENvbnRhaW5lciBjb250YWluZXIpIAotICAJCQkJCQkJCQkgICAgCi0gIHsKLSAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG51bGw7Ci0KLSAgICAvL0xpbWl0aW5nIHNlYXJjaCBzY29wZSB0byB0aGUgcHJvamVjdAotICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbMV07Ci0gICAgcmVzb3VyY2VzWzBdPXByb2plY3Q7Ci0JSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50WzFdOwotCWVsZW1lbnRzWzBdID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlc1swXSk7Ci0gICAgSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotICAgIHNjb3BlLnNldEluY2x1ZGVzQ2xhc3NwYXRocyh0cnVlKTsKLSAgICBzY29wZS5zZXRJbmNsdWRlc0JpbmFyaWVzKHRydWUpOwotCi0gICAgLy9DcmVhdGluZyBhbmQgb3BlbmluZyBhIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSAgICB0cnkKLQl7Ci0gICAgCVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZyhwYXJlbnRTaGVsbCwgY29udGFpbmVyLCBzY29wZSwgSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX1RZUEVTLCBmYWxzZSk7Ci0gICAgCWRpYWxvZy5zZXRUaXRsZShXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFIikpOwotICAgIAlkaWFsb2cuc2V0TWVzc2FnZShXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFIikpOyAgICAKLSAgICAJZGlhbG9nLm9wZW4oKTsKLQotICAgIAkvL0dldHRpbmcgdGhlIHJlc3VsdCBhbmQgcmV0dXJuaW5nIGl0Ci0gICAgCU9iamVjdFtdIHJlc3VsdHMgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgCWlmIChyZXN1bHRzICE9IG51bGwgJiYgcmVzdWx0cy5sZW5ndGggPiAwKQotICAgIAl7Ci0gICAgCQlpZiAocmVzdWx0c1swXSBpbnN0YW5jZW9mIElUeXBlKQotICAgIAkJewotICAgIAkJCUlUeXBlIHJlc3VsdEludGVyZmFjZSA9IChJVHlwZSlyZXN1bHRzWzBdOwotICAgIAkJCWludGVyZmFjZU5hbWUgPSByZXN1bHRJbnRlcmZhY2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpCi0JewotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW50ZXJmYWNlTmFtZTsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvZGlhbG9nL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL2RpYWxvZy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzQ3OGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvZGlhbG9nL1Jlc291cmNlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5kaWFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5EZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkFueUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLQotLyoqCi0qIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBkaWFsb2cgZm9yIGJyb3dzaW5nIHdvcmtzcGFjZSByZXNvdXJjZXMuCi0qIFNlZSBhbHNvIHtAbGluayBEaWFsb2dVdGlscyNicm93c2VSZXNvdXJjZXN9LgotKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIExpc3RlbmVyCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8vCi0gIC8vIERpYWxvZyBjb250cm9scy4KLSAgLy8KLSAgcHJpdmF0ZSBMYWJlbCBmaWx0ZXJMYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gZmlsdGVyQ29tYm9fOwotICAvKkNPTlRFWFRfSUQgRFJFUzAwMDEgZm9yIHRoZSBSZXNvdXJjZSBUeXBlIGNvbWJvIGJveCBvZiB0aGUgUmVzb3VyY2UgU2VsZWN0aW9uIERpYWxvZyovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuRFJFUzAwMDEiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEUgPSAiJVRPT0xUSVBfRFJFU19DT01CT19SRVNPVVJDRV9UWVBFIjsKLSAgLy8KLSAgcHJpdmF0ZSBUcmVlIHJlc291cmNlVHJlZV87Ci0gIHByaXZhdGUgVHJlZVZpZXdlciBmaWxlVmlld2VyXzsKLSAgLypDT05URVhUX0lEIERSRVMwMDAyIGZvciB0aGUgUmVzb3VyY2UgdHJlZSBvZiB0aGUgUmVzb3VyY2UgU2VsZWN0aW9uIERpYWxvZyovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPUE9QX0RSRVNfVFJFRV9SRVNPVVJDRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuRFJFUzAwMDIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFRJUF9EUkVTX1RSRUVfUkVTT1VSQ0UgPSAiJVRPT0xUSVBfRFJFU19UUkVFX1JFU09VUkNFIjsKLQotICAvLwotICAvLyBFc3NlbnRpYWwgZ29vZGllcy4KLSAgLy8KLSAgcHJpdmF0ZSBTaGVsbCBzaGVsbF87Ci0gIHByaXZhdGUgSVJlc291cmNlIHJvb3RfOwotICBwcml2YXRlIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBGaWx0ZXJbXSBmaWx0ZXJzXzsKLSAgcHJpdmF0ZSBGaWx0ZXIgY3VycmVudEZpbHRlcl87Ci0gIHByaXZhdGUgSVJlc291cmNlW10gc2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF87Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4KLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cGFyZW50IFNoZWxsPC9jb2RlPi4KLSAgKiBUaGUgZGlhbG9nIHJlbmRlcnMgYWxsIHJlc291cmNlcyBpbmNsdWRpbmcgYW5kCi0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnJvb3QgSVJlc291cmNlPC9jb2RlPi4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQge0BsaW5rIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsfSwKLSAgKiBvciBudWxsIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbCBzaGVsbC4KLSAgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlfSwKLSAgKiBvciBudWxsIHRvIGJlZ2luIHdpdGggdGhlIHdvcmtzcGFjZSByb290LgotICAqIEBwYXJhbSBpbml0aWFsU2VsZWN0aW9uIFRoZSBpbml0aWFsbHkgc2VsZWN0ZWQgb2JqZWN0IG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nICggU2hlbGwgcGFyZW50LCBJUmVzb3VyY2Ugcm9vdCwgSVJlc291cmNlIGluaXRpYWxTZWxlY3Rpb24gKQotICB7Ci0gICAgdGhpcyhwYXJlbnQscm9vdCxpbml0aWFsU2VsZWN0aW9uLG5ldyBGaWx0ZXJbXSB7bmV3IEFueUZpbHRlcigpfSk7Ci0gIH0KLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgbmV3IDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nPC9jb2RlPgotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5wYXJlbnQgU2hlbGw8L2NvZGU+LgotICAqIFRoZSBkaWFsb2cgcmVuZGVycyBhbGwgcmVzb3VyY2VzIGluY2x1ZGluZyBhbmQKLSAgKiB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cm9vdCBJUmVzb3VyY2U8L2NvZGU+IHRoYXQKLSAgKiBhcmUgYWNjZXB0ZWQgYnkgdGhlIGdpdmVuIGZpbHRlci4KLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyI2FjY2VwdHN9LgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LAotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gVGhlIGluaXRpYWxseSBzZWxlY3RlZCBvYmplY3Qgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBmaWx0ZXIgVGhlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcn0sCi0gICogb3IgbnVsbCB0byBkZWZhdWx0IHRvIGFsbCByZXNvdXJjZXMgdW5kZXIgdGhlIDxjb2RlPnJvb3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgKCBTaGVsbCBwYXJlbnQsIElSZXNvdXJjZSByb290LCBJUmVzb3VyY2UgaW5pdGlhbFNlbGVjdGlvbiwgRmlsdGVyIGZpbHRlciApCi0gIHsKLSAgICB0aGlzKHBhcmVudCxyb290LGluaXRpYWxTZWxlY3Rpb24sbmV3IEZpbHRlcltdIHtmaWx0ZXJ9KTsKLSAgfQotCi0gIC8qKgotICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+UmVzb3VyY2VTZWxlY3Rpb25EaWFsb2c8L2NvZGU+Ci0gICogdW5kZXIgdGhlIGdpdmVuIDxjb2RlPnBhcmVudCBTaGVsbDwvY29kZT4uCi0gICogVGhlIGRpYWxvZyByZW5kZXJzIGFsbCByZXNvdXJjZXMgaW5jbHVkaW5nIGFuZAotICAqIHVuZGVyIHRoZSBnaXZlbiA8Y29kZT5yb290IElSZXNvdXJjZTwvY29kZT4gdGhhdAotICAqIGFyZSBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVycy4KLSAgKiBTZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRmlsdGVyI2FjY2VwdHN9LgotICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGx9LgotICAqIG9yIG51bGwgdG8gY3JlYXRlIGEgdG9wLWxldmVsIHNoZWxsLgotICAqIEBwYXJhbSByb290IFRoZSByb290IHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2V9LAotICAqIG9yIG51bGwgdG8gYmVnaW4gd2l0aCB0aGUgd29ya3NwYWNlIHJvb3QuCi0gICogQHBhcmFtIGluaXRpYWxTZWxlY3Rpb24gVGhlIGluaXRpYWxseSBzZWxlY3RlZCBvYmplY3Qgb3IgbnVsbCBpZiBub25lLgotICAqIEBwYXJhbSBmaWx0ZXJzIEFuIGFycmF5IG9mIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkZpbHRlcn0KLSAgKiBvYmplY3RzLgotICAqIElmIHRoZSBhcnJheSBpcyBudWxsIG9yIG9mIGxlbmd0aCB6ZXJvLCB0aGVuIGFsbCByZXNvdXJjZXMgYXJlIGFjY2VwdGVkCi0gICogKGllLiBlcXVpdmFsZW50IHRvIDxjb2RlPlJlc291cmNlU2VsZWN0aW9uRGlhbG9nKHBhcmVudCxyb290KTwvY29kZT4uCi0gICogSWYgdGhlIGFycmF5IGlzIG9mIGxlbmd0aCBvbmUsIHRoZW4gdGhlIGRpYWxvZyB3aWxsIGNvbnNpc3Qgb2YgYSBzaW5nbGUKLSAgKiBjb250cm9sIHNob3dpbmcgYSBsaXN0IG9mIGFsbCBmaWx0ZXJlZCByZXNvdXJjZXMuCi0gICogSWYgdGhlIGFycmF5IGlzIG9mIGxlbmd0aCBncmVhdGVyIHRoYW4gb25lLCB0aGVuIHRoZSBkaWFsb2cgd2lsbAotICAqIGNvbnNpc3Qgb2YgYSBjb21ibyBib3ggY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGZpbHRlcnMgYW5kIHdpdGggdGhlCi0gICogZmlyc3QgZmlsdGVyIChpZS4gPGNvZGU+ZmlsdGVyc1swXTwvY29kZT4pIHNlbGVjdGVkIGJ5IGRlZmF1bHQsIGZvbGxvd2VkCi0gICogYnkgYSBjb250cm9sIHNob3dpbmcgYSBsaXN0IG9mIGFsbCByZXNvdXJjZXMgZmlsdGVyZWQgYnkgdGhlIHNlbGVjdGVkIGZpbHRlci4gCi0gICovCi0gIHB1YmxpYyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZyAoIFNoZWxsIHBhcmVudCwgSVJlc291cmNlIHJvb3QsIElSZXNvdXJjZSBpbml0aWFsU2VsZWN0aW9uLCBGaWx0ZXJbXSBmaWx0ZXJzICkKLSAgewotICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgc2hlbGxfID0gcGFyZW50OwotICAgIHJvb3RfID0gcm9vdCA9PSBudWxsID8gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkgOiByb290OwotICAgIGluaXRpYWxTZWxlY3Rpb25fID0gaW5pdGlhbFNlbGVjdGlvbjsKLSAgICBmaWx0ZXJzXyA9IChmaWx0ZXJzID09IG51bGwgfHwgZmlsdGVycy5sZW5ndGggPT0gMCkgPyBuZXcgRmlsdGVyW10ge25ldyBBbnlGaWx0ZXIoKX0gOiBmaWx0ZXJzOwotICAgIGN1cnJlbnRGaWx0ZXJfID0gZmlsdGVyc19bMF07Ci0gICAgbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkXyA9IGZhbHNlOwotICAgIHNldFNoZWxsU3R5bGUoU1dULkRJQUxPR19UUklNIHwgU1dULlJFU0laRSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0gIH0KLQotICAvKioKLSAgKiBFbmFibGVzIG9yIGRpc2FibGVzIG11bHRpcGxlIHNlbGVjdGlvbiBpbiB0aGUgdHJlZSB2aWV3LgotICAqIE11bHRpcGxlIHNlbGVjdGlvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAqIEBwYXJhbSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQgVHJ1ZSB0byBlbmFibGVkIG9yIGZhbHNlIHRvIGRpc2FibGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZCAoIGJvb2xlYW4gbXVsdGlwbGVTZWxlY3Rpb25FbmFibGVkICkKLSAgewotICAgIG11bHRpcGxlU2VsZWN0aW9uRW5hYmxlZF8gPSBtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWQ7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIG1hZGUgaW4gdGhlIGRpYWxvZyBpZiBPSyB3YXMgcHJlc3NlZCwKLSAgKiBvciBudWxsIGlmIENhbmNlbCB3YXMgcHJlc3NlZC4gUmV0dXJucyBudWxsIGlmIHRoZSBkaWFsb2cKLSAgKiBoYXMgbmV2ZXIgYmVlbiBvcGVuZWQuCi0gICogQHJldHVybiBBbiBhcnJheSBvZiBzZWxlY3RlZCByZXNvdXJjZXMsIHBvc3NpYmx5IGVtcHR5LCBwb3NzaWJseSBudWxsLgotICAqLwotICBwdWJsaWMgSVJlc291cmNlW10gZ2V0UmVzdWx0ICgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uXzsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQuCi0gICogSW5zdXJlcyB0aGF0IHtAbGluayAjZ2V0UmVzdWx0fSB3aWxsIHJldHVybiBudWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkICgpCi0gIHsKLSAgICBzZWxlY3Rpb25fID0gbnVsbDsKLSAgICBzZXRSZXR1cm5Db2RlKERpYWxvZy5DQU5DRUwpOwotICAgIHN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgcHJlc3NlZC4KLSAgKiBTcXVpcnJlbHMgYXdheSB0aGUgbGlzdCBvZiB6ZXJvIG9yIG1vcmUgc2VsZWN0ZWQKLSAgKiA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+cyB0byBiZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldFJlc3VsdH0uCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCAoKQotICB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmaWxlVmlld2VyXy5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBzZWxlY3Rpb25fID0gbmV3IElSZXNvdXJjZVtzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKV07Ci0gICAgICBpbnQgaT0wOwotICAgICAgSXRlcmF0b3IgaXRlciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uX1tpKytdID0gKElSZXNvdXJjZSlvYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0UmV0dXJuQ29kZShEaWFsb2cuT0spOwotICAgIHN1cGVyLm9rUHJlc3NlZCgpOwotICB9Ci0KLSAgLyoqCi0gICogU2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsfS4KLSAgKiBAcGFyYW0gc2hlbGwgVGhlIHNoZWxsLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbCAoIFNoZWxsIHNoZWxsICkKLSAgewotICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICBzaGVsbC5zZXRUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlRElBTE9HX1RJVExFX1JFU09VUkNFX0JST1dTRSIpKTsKLSAgfQotCi0gIC8qKiAKLSAgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYXJlYS4KLSAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlLgotICAqIEByZXR1cm4gVGhlIGNvbnRyb2wgYXJlYS4KLSAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYSAoIENvbXBvc2l0ZSBwYXJlbnQgKQotICB7Ci0gICAgR3JpZExheW91dCBnbDsKLSAgICBHcmlkRGF0YSBnZDsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gNDAwOwotICAgIGdkLmhlaWdodEhpbnQgPSAzMDA7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIGlmIChmaWx0ZXJzXy5sZW5ndGggPiAxKQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBmID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsU1dULk5PTkUpOwotICAgICAgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgICAgZi5zZXRMYXlvdXQoZ2wpOwotICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLSAgICAgIGYuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgIGZpbHRlckxhYmVsXyA9IG5ldyBMYWJlbChmLFNXVC5XUkFQKTsKLSAgICAgIGZpbHRlckxhYmVsXy5zZXRUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfUkVTT1VSQ0VfRklMVEVSIikpOwotICAgICAgZmlsdGVyTGFiZWxfLnNldFRvb2xUaXBUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKFRPT0xUSVBfRFJFU19DT01CT19SRVNPVVJDRV9UWVBFKSk7Ci0KLSAgICAgIGZpbHRlckNvbWJvXyA9IG5ldyBDb21ibyhmLFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0gICAgICBmaWx0ZXJDb21ib18uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICBmaWx0ZXJDb21ib18uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLSAgICAgIGZpbHRlckNvbWJvXy5zZXRUb29sVGlwVGV4dChXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShUT09MVElQX0RSRVNfQ09NQk9fUkVTT1VSQ0VfVFlQRSkpOwotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmaWx0ZXJDb21ib18sSU5GT1BPUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEUpOwotICAgIH0KLQotICAgIGlmIChtdWx0aXBsZVNlbGVjdGlvbkVuYWJsZWRfKQotICAgIHsKLSAgICAgIHJlc291cmNlVHJlZV8gPSBuZXcgVHJlZShjb21wb3NpdGUsU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXNvdXJjZVRyZWVfID0gbmV3IFRyZWUoY29tcG9zaXRlLFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLSAgICB9Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICByZXNvdXJjZVRyZWVfLnNldExheW91dERhdGEoZ2QpOwotLy8gIHJlc291cmNlVHJlZV8uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbix0aGlzKTsKLSAgICByZXNvdXJjZVRyZWVfLnNldFRvb2xUaXBUZXh0KFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKFRPT0xUSVBfRFJFU19UUkVFX1JFU09VUkNFKSk7Ci0gICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyZXNvdXJjZVRyZWVfLElORk9QT1BfRFJFU19UUkVFX1JFU09VUkNFKTsKLQotICAgIGZpbGVWaWV3ZXJfID0gbmV3IFRyZWVWaWV3ZXIocmVzb3VyY2VUcmVlXyk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgZmlsZVZpZXdlcl8uc2V0TGFiZWxQcm92aWRlcigKLSAgICAgICAgICAgICAgICBuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIoCi0JCQkJICAgICAgICBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCAKLQkJCQkgICAgICAgIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKSk7Ci0gICAgZmlsZVZpZXdlcl8uYWRkRmlsdGVyKAotICAgICAgbmV3IFZpZXdlckZpbHRlciAoKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QgKCBWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50T2JqZWN0LCBPYmplY3Qgb2JqZWN0ICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybgotICAgICAgICAgICgKLSAgICAgICAgICAgICgob2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSAmJiAoKElSZXNvdXJjZSlvYmplY3QpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgICAgIHx8IChSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLmN1cnJlbnRGaWx0ZXJfLmFjY2VwdHMob2JqZWN0KSkKLSAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgKTsKLSAgICBmaWxlVmlld2VyXy5zZXRJbnB1dChyb290Xyk7Ci0gICAgZmlsZVZpZXdlcl8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotICAgICAgbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCAoIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCApCi0gICAgICAgIHsKLS8vICAgICAgICBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLnZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICApOwotICAgIGlmIChpbml0aWFsU2VsZWN0aW9uXyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZpbGVWaWV3ZXJfLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy50aGlzLmluaXRpYWxTZWxlY3Rpb25fKSx0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYW4gZXZlbnQgb2NjdXJzIG9uIHRoZSBwYWdlLgotICAqIEhhbmRsZXMgdGhlIGV2ZW50IGFuZCByZXZhbGlkYXRlcyB0aGUgcGFnZS4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgb2NjdXJlZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKCBFdmVudCBldmVudCApCi0gIHsKLS8vICB2YWxpZGF0ZVBhZ2VUb1N0YXR1cygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3BsdWdpbi9XZWJTZXJ2aWNlVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dlYlNlcnZpY2VVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTMwNDRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcGx1Z2luL1dlYlNlcnZpY2VVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCS8vIENvcHlyaWdodAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9Ci0JCSIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLnVpIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VVSVBsdWdpbiBpbnN0YW5jZV87Ci0KLSAgcHJpdmF0ZSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgYWN0aW9uRGlhbG9nc0NvbnRleHRfOwotICBwcml2YXRlIExvZyBsb2dfOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBydW50aW1lIHBsdWdpbiBvYmplY3QgZm9yIHRoaXMgcGx1Z2luLgotICAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbigpIHsKLQlzdXBlcigpOwotCWluc3RhbmNlXyA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICAqIChXZWJTZXJ2aWNlVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5qc3Qud3MudWkiKTsKLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlVUlQbHVnaW4gc2luZ2xldG9uLgotICAqLwotICBzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLQotICBwdWJsaWMgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGdldEFjdGlvbkRpYWxvZ3NDb250ZXh0KCkgCi0gIAl7Ci0gIAkgIGlmIChhY3Rpb25EaWFsb2dzQ29udGV4dF8gPT0gbnVsbCkKLSAgCSAgCXsKLSAgCSAgCQlhY3Rpb25EaWFsb2dzQ29udGV4dF8gPSBuZXcgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0KCk7Ci0gIAkgIAkJYWN0aW9uRGlhbG9nc0NvbnRleHRfLmxvYWQoKTsKLSAgCSAgCX0KLSAgCSAgcmV0dXJuIGFjdGlvbkRpYWxvZ3NDb250ZXh0XzsKLSAgCX0KLQkJCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tCi0gICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgCi0JewotCSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLnVpLnBsdWdpbiIsIGluc3RhbmNlXyApOwotCSAgICAKLQkgICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0JICAgIHsKLQkgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKCAxLCBrZXkubGVuZ3RoKCkgKTsKLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIG1zZ1V0aWxzLmdldE1lc3NhZ2Uoa2V5KTsKLSAgICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLSAgKiBTdWJzdGl0dXRpb24gc2VxdWVuY2VzIGluIHRoZSBtZXNzYWdlIHN0cmluZwotICAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gICogYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IGZvcgotICAqIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAgKiBUaGF0IGlzLCB0aGUgc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIgotICAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAgKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICAqIEBwYXJhbSBhcmdzIFRoZSBzdWJzdGl0dXRpb24gdmFsdWVzIGZvciB0aGUgbWVzc2FnZQotICAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBtZXNzYWdlIGluIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZAotICAqIGJ5IHRoZSBydWxlcyBvZiBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2Uoa2V5KSwgYXJncyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBuYW1lZCByZXNvdXJjZQotICAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgKiBAcmV0dXJuIEFuIGltYWdlIGRlc2NyaXB0b3IsIHBvc3NpYmx5IG51bGwuCi0gICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGluc3RhbmNlXy5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQkJVVJMIGltYWdlVVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBuYW1lKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKSB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykudG9PU1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmJhOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkXzsKLQlwdWJsaWMgdm9pZCBzZXRJZCAoU3RyaW5nIGlkKSB7Ci0JCWlkXyA9IGlkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgIAlyZXR1cm4gaWRfOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIG5hbWVfOwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbmFtZV8gPSBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgCXJldHVybiBuYW1lXzsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBpbmZvcG9wXzsKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmZvcG9wIChTdHJpbmcgaW5mb3BvcCkgewotICAgIAlpbmZvcG9wXyA9IGluZm9wb3A7Ci0gICAgCX0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEluZm9wb3AgKCkgewotICAgIAlyZXR1cm4gaW5mb3BvcF87Ci0gICAgCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvb2x0aXBfOwotICAgIHB1YmxpYyB2b2lkIHNldFRvb2x0aXAgKFN0cmluZyB0b29sdGlwKSB7Ci0gICAgCXRvb2x0aXBfPSB0b29sdGlwOwotICAgIAl9Ci0gICAgcHVibGljIFN0cmluZyBnZXRUb29sdGlwICgpIHsKLSAgICAJcmV0dXJuIHRvb2x0aXBfOwotICAgIAl9Ci0KLSB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmEzYTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgc3RhdGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkgaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgSGFzaHRhYmxlIHR5cGVzQnlOYW1lXzsKLQotICAvLwotICAvLyBMb2FkcyBXZWJTZXJ2aWNlVHlwZSBvYmplY3RzIGludG8gdGhpcyByZWdpc3RyeS4KLSAgLy8gVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gIC8vIGhhbmdpbmcgb24gdGhlIHdlYlNlcnZpY2VUeXBlIGV4dGVuc2lvbiBwb2ludC4gRXh0ZW5zaW9ucwotICAvLyBtdXN0IGltcGxlbWVudCB0aGUgb3JnLmVjbGlwc2UuanN0LndzLnVpLndpemFyZC5XZWJTZXJ2aWNlVHlwZQotICAvLyBpbnRlcmZhY2UuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkRGlhbG9nc1ByZWZlcmVuY2VzICgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MudWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSIpOwotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0gPSBjb25maWdbaWR4XTsKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlID0gZWxlbS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotICAgICAgICBpZiAoYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgaW5zdGFuY2VvZiBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBkaWFsb2cgPSAoQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUpIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotICAgICAgICAgIGRpYWxvZy5zZXRJZCgoU3RyaW5nKWVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpKTsKLSAgICAgICAgICBkaWFsb2cuc2V0TmFtZSgoU3RyaW5nKWVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgICAgICAgIGRpYWxvZy5zZXRJbmZvcG9wKChTdHJpbmcpZWxlbS5nZXRBdHRyaWJ1dGUoImluZm9wb3AiKSk7Ci0gICAgICAgICAgZGlhbG9nLnNldFRvb2x0aXAoKFN0cmluZyllbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcCIpKTsKLSAgICAgICAgICBhZGQoZGlhbG9nKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vCi0gIC8vIExvYWRzIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIG9iamVjdHMgaW50byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGdldEluc3RhbmNlKCkuCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkICgpCi0gIHsKLSAgICB0eXBlc0J5TmFtZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgbG9hZERpYWxvZ3NQcmVmZXJlbmNlcygpOwotICB9Ci0KLSAgLy8KLSAgLy8gQWRkIHRoZSBnaXZlbiBXZWJTZXJ2aWNlVHlwZSB0byB0aGlzIHJlZ2lzdHJ5LgotICAvLyBTZWUgbWV0aG9kIGxvYWQoKS4KLSAgLy8KLSAgcHJpdmF0ZSB2b2lkIGFkZCAoIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyApCi0gIHsKLSAgICB0eXBlc0J5TmFtZV8ucHV0KGRpYWxvZy5nZXRJZCgpLGRpYWxvZyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCi0gICogQHJldHVybiBBIHNpbmdsZXRvbiBXZWJTZXJ2aWNlVHlwZVJlZ2lzdHJ5IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlICgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2VfID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkoKTsKLSAgICAgIGluc3RhbmNlXy5sb2FkKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZV87Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPiBvYmplY3RzLgotICAqIEByZXR1cm4gQWxsIHJlZ2lzdGVyZWQgPGNvZGU+V2ViU2VydmljZVR5cGU8L2NvZGU+IG9iamVjdHMuCi0gICovCi0gIHB1YmxpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdIGdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2VzICgpCi0gIHsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdIGRpYWxvZ3MgPSBuZXcgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbdHlwZXNCeU5hbWVfLnNpemUoKV07Ci0gICAgRW51bWVyYXRpb24gZSA9IHR5cGVzQnlOYW1lXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIGRpYWxvZ3NbaV0gPSAoQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUpZS5uZXh0RWxlbWVudCgpOwotICAgIH0KLSAgICByZXR1cm4gZGlhbG9nczsKLSAgfQotCi0gIHB1YmxpYyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBnZXRBY3Rpb25EaWFsb2dQcmVmcmVuY2VUeXBlQnlOYW1lIChTdHJpbmcgbmFtZSkKLSAgewotICAJcmV0dXJuIChuYW1lID09IG51bGwgPyBudWxsIDogKEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlKXR5cGVzQnlOYW1lXy5nZXQobmFtZSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3YmM0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FjdGlvbkRpYWxvZ3NQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi07Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgTGlzdGVuZXIKLXsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAxIGZvciB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX1BBR0UgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQQUQwMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gc2hvd0FsbDsKLSAgLypDT05URVhUX0lEIFBQQUQwMDAyIGZvciB0aGUgIHNob3cgYWxsIGNoZWNrIGJveCBvbiB0aGUgQWN0aW9uIERpYWxvZ3MgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUEFEX0JVVFRPTl9TSE9XX0FMTCA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFBBRDAwMDIiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBoaWRlQWxsOwotICAvKkNPTlRFWFRfSUQgUFBBRDAwMDMgZm9yIHRoZSAgaGlkZSBhbGwgY2hlY2sgYm94IG9uIHRoZSBBY3Rpb24gRGlhbG9ncyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQQURfQlVUVE9OX0hJREVfQUxMID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUEFEMDAwMyI7Ci0KLSAgcHJpdmF0ZSBIYXNodGFibGUgY2hlY2tCb3hlc187Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIGNoZWNrQm94ZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGFkZE9wdGlvbmFsRGlhbG9nc0NoZWNrQm94ZXMgKHN1cGVycGFyZW50KTsKLQluZXcgTGFiZWwoc3VwZXJwYXJlbnQsIFNXVC5IT1JJWk9OVEFMKTsKLQkKLQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQQURfUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LElORk9QT1BfUFBBRF9QQUdFKTsKLQkKLSAgICBzaG93QWxsID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBzaG93QWxsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUJVVFRPTl9TSE9XX0FMTF9ESUFMT0dTIikpOwotICAgIHNob3dBbGwuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgc2hvd0FsbC5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QUEFEX0JVVFRPTl9TSE9XX0FMTCIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAoc2hvd0FsbCxJTkZPUE9QX1BQQURfQlVUVE9OX1NIT1dfQUxMKTsKLSAgIAotICAgIGhpZGVBbGwgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGhpZGVBbGwuc2V0VGV4dChnZXRNZXNzYWdlKCIlQlVUVE9OX0hJREVfQUxMX0RJQUxPR1MiKSk7Ci0gICAgaGlkZUFsbC5hZGRMaXN0ZW5lciAoIFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIGhpZGVBbGwuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBBRF9CVVRUT05fSElERV9BTEwiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGhpZGVBbGwsSU5GT1BPUF9QUEFEX0JVVFRPTl9ISURFX0FMTCk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsKLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSAKLSAgewotICAJCXJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0KLSBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZXZlbnQpIAotIHsKLSAgICBpZiAoc2hvd0FsbCA9PSBldmVudC53aWRnZXQpCi0JCWhhbmRsZVNob3dBbGxFdmVudCgpOwotICAgIAotICAgIGVsc2UgaWYgKCBoaWRlQWxsID09IGV2ZW50LndpZGdldCkKLSAgICAJaGFuZGxlSGlkZUFsbEV2ZW50KCk7Ci0gfQotCi0gcHJpdmF0ZSB2b2lkIGhhbmRsZVNob3dBbGxFdmVudCAoKQotIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gY2hlY2tCb3hlc18uZWxlbWVudHMoKTsKLSAJZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgCXsKLSAgICAJCUJ1dHRvbiBkaWFsb2cgPSAoQnV0dG9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgCQlkaWFsb2cuc2V0U2VsZWN0aW9uKCB0cnVlICk7Ci0gICAgCX0gICAgICAgICAgICAgICAgICAgICAgCi0gfQotCi0gcHJpdmF0ZSB2b2lkIGhhbmRsZUhpZGVBbGxFdmVudCAoKQotIHsKLSAJRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmVsZW1lbnRzKCk7Ci0gCWZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIAl7Ci0gICAgCQlCdXR0b24gZGlhbG9nID0gKEJ1dHRvbikgZS5uZXh0RWxlbWVudCgpOwotICAgIAkJZGlhbG9nLnNldFNlbGVjdGlvbiggZmFsc2UgKTsKLSAgICAJfQotIH0KLSAKLSBwcml2YXRlIHZvaWQgYWRkT3B0aW9uYWxEaWFsb2dzQ2hlY2tCb3hlcyAoIENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEFjdGlvbkRpYWxvZ3NDb250ZXh0KCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBkaWFsb2dzID0gY29udGV4dC5nZXREaWFsb2dzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCUJ1dHRvbiBjaGVja0JveCA9IGNyZWF0ZUNoZWNrQm94KHBhcmVudCAsIGRpYWxvZ3NbaV0uZ2V0TmFtZSgpKTsKLSAgICAJY2hlY2tCb3guc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZShkaWFsb2dzW2ldLmdldFRvb2x0aXAoKSkpOwotICAgIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNoZWNrQm94LGRpYWxvZ3NbaV0uZ2V0SW5mb3BvcCgpKTsKLSAgICAJY2hlY2tCb3hlc18ucHV0KGRpYWxvZ3NbaV0uZ2V0SWQoKSwgY2hlY2tCb3gpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0ICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5DSEVDSyApOwotICAgIGJ1dHRvbi5zZXRUZXh0KCB0ZXh0ICk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgeyB9Ci0KLSAgLyoqCi0gICAqIFRoZSBwcm94eSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKQotICB7Ci0gICAgcmV0dXJuIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIEJ1dHRvbiBkaWFsb2cgPSAoQnV0dG9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBkaWFsb2cuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2VzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRBY3Rpb25EaWFsb2dzQ29udGV4dCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5rZXlzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGNoZWNrQm94ZXNfLmdldChpZCk7Ci0gICAgICBidXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBY3Rpb25EaWFsb2dFbmFibGVkKGlkKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0QWN0aW9uRGlhbG9nc0NvbnRleHQoKTsKLQotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5rZXlzKCk7Ci0gICAgZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgY29udGV4dC5zZXRBY3Rpb25EaWFsb2dFbmFibGVkKGlkLCAoKEJ1dHRvbiljaGVja0JveGVzXy5nZXQoaWQpKS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJlZmU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0Ci17Ci0gcHJpdmF0ZSBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBbXSBkaWFsb2dzXzsKLQotcHVibGljIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCAoKSAKLXsKLQlzdXBlciggIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsKLX0KLXB1YmxpYyB2b2lkIGxvYWQoKSAKLXsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5IHJlZyA9IEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBkaWFsb2dzXyA9IHJlZy5nZXRBY3Rpb25EaWFsb2dzUHJlZnJlbmNlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGlhbG9nc18ubGVuZ3RoOyBpKyspIHsKLSAgICAJc2V0RGVmYXVsdChkaWFsb2dzX1tpXS5nZXRJZCgpLCB0cnVlKTsKLSAgIH0KLX0KLQotcHVibGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlW10gZ2V0RGlhbG9ncygpCi17Ci0gIHJldHVybiBkaWFsb2dzXzsKLX0KLQotcHVibGljIHZvaWQgc2V0QWN0aW9uRGlhbG9nRW5hYmxlZCAoIFN0cmluZyBpZCwgYm9vbGVhbiB2YWx1ZSkKLXsKLSAJc2V0VmFsdWUgKGlkLCB2YWx1ZSk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIGlzQWN0aW9uRGlhbG9nRW5hYmxlZCggU3RyaW5nIGlkKQotewotICAgICBpZiAoaWQgPT0gbnVsbCApIAotICAgICAJcmV0dXJuIHRydWU7Ci0JIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihpZCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUHJvamVjdFRvcG9sb2d5UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliNjQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1Byb2plY3RUb3BvbG9neVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlByb2plY3RUb3BvbG9neURlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VG9wb2xvZ3lQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotICAvKkNPTlRFWFRfSUQgUFBTRDAwMDEgZm9yIHRoZSBQcm9qZWN0IFRvcG9sb2d5IFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFRQUF9QQUdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFRQMDAwMSI7Ci0KLSAgcHJpdmF0ZSBUYWJsZVZpZXdlciBjbGllbnRUeXBlVmlld2VyXzsKLSAgcHJpdmF0ZSBCdXR0b24gbW92ZVVwXzsKLSAgcHJpdmF0ZSBCdXR0b24gbW92ZURvd25fOwotICBwcml2YXRlIFZlY3RvciBjbGllbnRUeXBlc187Ci0gIC8qIENPTlRFWFRfSUQgUFRQUDAwMDIgZm9yIHRoZSBjbGllbnQgdHlwZSB0YWJsZSB2aWV3ZXIgb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9DTElFTlRfVFlQRSA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFRQUDAwMDIiOwotICAvKiBDT05URVhUX0lEIFBUUFAwMDAzIGZvciB0aGUgbW92ZSB1cCBidXR0b24gb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9NT1ZFX1VQID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwMyI7Ci0gIC8qIENPTlRFWFRfSUQgUFRQUDAwMDQgZm9yIHRoZSBtb3ZlIGRvd24gYnV0dG9uIG9uIHRoZSBQcm9qZWN0IFRvcG9sb2d5IFByZWZlcmVuY2UgUGFnZSAqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BUUFBfTU9WRV9ET1dOID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwNCI7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gdHdvRUFSXzsKLSAgLyogQ09OVEVYVF9JRCBQVFBQMDAwNSBmb3IgdGhlIGVuYWJsZSAyIEVBUnMgY2hlY2tib3ggb24gdGhlIFByb2plY3QgVG9wb2xvZ3kgUHJlZmVyZW5jZSBQYWdlICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFRQUF9UV09fRUFSX0NIRUNLQk9YID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QVFBQMDAwNSI7Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSAgIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIHN1cGVycGFyZW50LCBTV1QuTk9ORSApOwkKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIHBhcmVudC5zZXRMYXlvdXQoIGxheW91dCApOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QVFBQX1BBR0UiKSk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCxJTkZPUE9QX1BUUFBfUEFHRSk7ICAgIAotCi0gICAgVGV4dCBjbGllbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCk7Ci0gICAgY2xpZW50VHlwZUxhYmVsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0NMSUVOVF9UWVBFX05BTUUiKSk7Ci0KLSAgICBDb21wb3NpdGUgY2xpZW50VHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY2xpZW50VHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgVGFibGUgdGFibGU9IG5ldyBUYWJsZShjbGllbnRUeXBlQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMjU2OwotICAgIHRhYmxlLnNldExheW91dERhdGEoZ2QpOwotICAgIHRhYmxlLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0NMSUVOVF9UWVBFX1RBQkxFX1ZJRVdFUiIpKTsKLQotICAgIGNsaWVudFR5cGVzXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBjbGllbnRUeXBlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgY2xpZW50VHlwZVZpZXdlcl8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDbGllbnRUeXBlQ29udGVudFByb3ZpZGVyKCkpOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IENsaWVudFR5cGVMYWJlbFByb3ZpZGVyKCkpOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnNldElucHV0KGNsaWVudFR5cGVzXyk7Ci0KLSAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgdGFibGVDb2x1bW4uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfQ0xJRU5UX1RZUEUiKSk7Ci0gICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5EYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjU2LCAyNTYsIGZhbHNlKTsKLSAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbkRhdGEpOwotICAgIHRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICBDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUoY2xpZW50VHlwZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMTsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLSAgICBjLnNldExheW91dChnbCk7Ci0KLSAgICBtb3ZlVXBfID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgbW92ZVVwXy5zZXRUZXh0KGdldE1lc3NhZ2UoIiVMQUJFTF9NT1ZFX1VQIikpOwotICAgIG1vdmVVcF8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgbW92ZVVwXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBtb3ZlVXBfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX01PVkVfVVAiKSk7Ci0KLSAgICBtb3ZlRG93bl8gPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsKLSAgICBtb3ZlRG93bl8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfTU9WRV9ET1dOIikpOwotICAgIG1vdmVEb3duXy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICBtb3ZlRG93bl8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgbW92ZURvd25fLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX01PVkVfRE9XTiIpKTsKLQotICAgIHR3b0VBUl8gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICB0d29FQVJfLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX0VOQUJMRV9UV09fRUFSUyIpKTsKLSAgICB0d29FQVJfLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX0VOQUJMRV9UV09fRUFSUyIpKTsKLQotICAgIGluaXRpYWxpemVWYWx1ZXMoKTsKLSAgICBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZy5hcHBseURpYWxvZ0ZvbnQoc3VwZXJwYXJlbnQpOyAgICAKLQotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgCi0gIHsKLSAgICAgIAlyZXR1cm4gV2ViU2VydmljZVVJUGx1Z2luLmdldE1lc3NhZ2Uoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgeyB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdG8gdGhlaXIgYnVybmVkLWluIGRlZmF1bHRzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpCi0gIHsKLSAgICBjbGllbnRUeXBlc18uY2xlYXIoKTsKLSAgICBTdHJpbmdbXSB0eXBlcyA9IFByb2plY3RUb3BvbG9neURlZmF1bHRzLmdldENsaWVudFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIGNsaWVudFR5cGVzXy5hZGQodHlwZXNbaV0pOwotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB0d29FQVJfLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb250ZXh0ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLSAgICBTdHJpbmdbXSB0eXBlcyA9IGNvbnRleHQuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgY2xpZW50VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgLy8gY2hlY2sgd2hldGhlciB3ZSBtaXNzZWQgYW55IHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgbGlzdAotICAgIGJvb2xlYW4gbWlzc2VkID0gZmFsc2U7Ci0gICAgdHlwZXMgPSBQcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5nZXRDbGllbnRUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNsaWVudFR5cGVzXy5pbmRleE9mKHR5cGVzW2ldKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgY2xpZW50VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgICAgIG1pc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtaXNzZWQpCi0gICAgewotICAgICAgdHlwZXMgPSBuZXcgU3RyaW5nW2NsaWVudFR5cGVzXy5zaXplKCldOwotICAgICAgY2xpZW50VHlwZXNfLmNvcHlJbnRvKHR5cGVzKTsKLSAgICAgIGNvbnRleHQuc2V0Q2xpZW50VHlwZXModHlwZXMpOwotICAgIH0KLSAgICAvLyByZWZyZXNoIHZpZXdlcgotICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICB0d29FQVJfLnNldFNlbGVjdGlvbihjb250ZXh0LmlzVXNlVHdvRUFScygpKTsKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2UgaGVscGVyLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAgIFByb2plY3RUb3BvbG9neUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0KCk7Ci0gICAgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW2NsaWVudFR5cGVzXy5zaXplKCldOwotICAgIGNsaWVudFR5cGVzXy5jb3B5SW50byh0eXBlcyk7Ci0gICAgY29udGV4dC5zZXRDbGllbnRUeXBlcyh0eXBlcyk7Ci0gICAgY29udGV4dC5zZXRVc2VUd29FQVJzKHR3b0VBUl8uZ2V0U2VsZWN0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBjbGllbnRUeXBlVmlld2VyXy5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGlmIChlLndpZGdldCA9PSBtb3ZlVXBfICYmIGluZGV4ID4gMCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGNsaWVudFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBjbGllbnRUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXgtMSk7Ci0gICAgICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUud2lkZ2V0ID09IG1vdmVEb3duXyAmJiBpbmRleCA8IGNsaWVudFR5cGVzXy5zaXplKCktMSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IGNsaWVudFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICBjbGllbnRUeXBlc18uaW5zZXJ0RWxlbWVudEF0KG9iamVjdCwgaW5kZXgrMSk7Ci0gICAgICAgIGNsaWVudFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIENsaWVudFR5cGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gKChWZWN0b3IpdmFsdWUpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIAotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgCi0gICAgewotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ2xpZW50VHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0gIHsKLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzXzsKLQotICAgIHB1YmxpYyBDbGllbnRUeXBlTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBjb25maWdFbGVtZW50c18gPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAiY2xpZW50UHJvamVjdFR5cGUiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsZW1lbnRzXy5sZW5ndGg7IGkrKykKLSAgICAgICAgaWYgKGNvbmZpZ0VsZW1lbnRzX1tpXS5nZXRBdHRyaWJ1dGUobmFtZSkuZXF1YWxzKHZhbHVlKSkKLSAgICAgICAgICByZXR1cm4gY29uZmlnRWxlbWVudHNfW2ldOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotICAgICovCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBhcmcwKSAKLSAgICB7IAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIHJldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImlkIiwgdmFsdWUudG9TdHJpbmcoKSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvUmVzb3VyY2VNYW5hZ21lbnRQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjI2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9SZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldlYlNlcnZpY2VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VEZWZhdWx0czsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnbWVudFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLXsKLSAgLypDT05URVhUX0lEIFBQUk0wMDAxIGZvciB0aGUgUmVzb3VyY2UgTWFuYWdtZW50IFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFBSTV9QQUdFID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwMSI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIG92ZXJXcml0ZUZpbGVzOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDIgZm9yIHRoZSBmaWxlIG92ZXJ3cml0ZSBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyA9IFdlYlNlcnZpY2VVSVBsdWdpbi5JRCArICIuUFBSTTAwMDIiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVGb2xkZXJzOwotICAvKkNPTlRFWFRfSUQgUFBSTTAwMDMgZm9yIHRoZSBjcmVhdGUgZm9sZGVycyBjaGVjayBib3ggb24gdGhlIFJlc291cmNlIE1hbmFnZW1lbnQgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFJNX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwMyI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIGNoZWNrb3V0RmlsZXM7Ci0gIC8qQ09OVEVYVF9JRCBQUFJNMDAwNCBmb3IgdGhlIGNoZWNrb3V0IGZpbGVzIGNoZWNrIGJveCBvbiB0aGUgUmVzb3VyY2UgTWFuYWdlbWVudCBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQUk1fQ0hFQ0tCT1hfQ0hFQ0tfT1VUID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFJNMDAwNCI7Ci0KLSAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAJSVdvcmtiZW5jaEhlbHBTeXN0ZW0gaGVscFN5c3RlbSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotICAJCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQUk1fUEFHRSIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1BQUk1fUEFHRSk7Ci0KLSAgICBvdmVyV3JpdGVGaWxlcyA9IGNyZWF0ZUNoZWNrQm94KHBhcmVudCwgV2ViU2VydmljZVVJUGx1Z2luLmdldE1lc3NhZ2UoIiVCVVRUT05fT1ZFUldSSVRFX0ZJTEVTIiApKTsKLSAgICBvdmVyV3JpdGVGaWxlcy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUyIpKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAob3ZlcldyaXRlRmlsZXMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9PVkVSV1JJVEVfRklMRVMpOwotCi0gICAgY3JlYXRlRm9sZGVycyAgPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKCIlQlVUVE9OX0NSRUFURV9GT0xERVJTIiApKTsKLSAgICBjcmVhdGVGb2xkZXJzLnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQUk1fQ0hFQ0tCT1hfQ1JFQVRFX0ZPTERFUlMiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGNyZWF0ZUZvbGRlcnMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9DUkVBVEVfRk9MREVSUyk7Ci0KLSAgICBjaGVja291dEZpbGVzID0gY3JlYXRlQ2hlY2tCb3gocGFyZW50LCBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZSgiJUJVVFRPTl9DSEVDS09VVF9GSUxFUyIgKSk7ICAgIAotICAgIGNoZWNrb3V0RmlsZXMuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKGNoZWNrb3V0RmlsZXMsIElORk9QT1BfUFBSTV9DSEVDS0JPWF9DSEVDS19PVVQpOwotCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzdXBlcnBhcmVudCk7ICAgIAotCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotIAotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIAotICB7Ci0gIAkJcmV0dXJuIFdlYlNlcnZpY2VVSVBsdWdpbi5nZXRNZXNzYWdlKGtleSk7Ci0gIH0KLQotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0JveCggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQgKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULkNIRUNLICk7Ci0gICAgYnV0dG9uLnNldFRleHQoIHRleHQgKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLSAgewotICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotICB7Ci0gICAgcGVyZm9ybU9rKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICB7IH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZXMgc3RhdGVzIG9mIHRoZSBjb250cm9scyB1c2luZyBkZWZhdWx0IHZhbHVlcwotICAgKiBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgb3ZlcldyaXRlRmlsZXMuc2V0U2VsZWN0aW9uKCBSZXNvdXJjZURlZmF1bHRzLmdldE92ZXJ3cml0ZUZpbGVzRGVmYXVsdCgpKTsKLSAgICBjcmVhdGVGb2xkZXJzLnNldFNlbGVjdGlvbiggUmVzb3VyY2VEZWZhdWx0cy5nZXRDcmVhdGVGb2xkZXJzRGVmYXVsdCgpKTsKLSAgICBjaGVja291dEZpbGVzLnNldFNlbGVjdGlvbiggUmVzb3VyY2VEZWZhdWx0cy5nZXRDaGVja291dEZpbGVzRGVmYXVsdCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0gIHsKLSAgICAvLyBnZXQgdGhlIHBlcnNpc3RlbnQgY29udGV4dCBmcm9tIHRoZSBwbHVnaW4KLSAgICBSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICBvdmVyV3JpdGVGaWxlcy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSk7Ci0gICAgY3JlYXRlRm9sZGVycy5zZXRTZWxlY3Rpb24oIGNvbnRleHQuaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpKTsKLSAgICBjaGVja291dEZpbGVzLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpOyAgICAKLSAgIH0KLQotICAvKioKLSAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgLy8gZ2V0IHRoZSBwZXJzaXN0ZW50IGNvbnRleHQgZnJvbSB0aGUgcGx1Z2luCi0gICAgUmVzb3VyY2VDb250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgY29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQoIG92ZXJXcml0ZUZpbGVzLmdldFNlbGVjdGlvbigpICk7Ci0gICAgY29udGV4dC5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZCggY3JlYXRlRm9sZGVycy5nZXRTZWxlY3Rpb24oKSApOwotICAgIGNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoIGNoZWNrb3V0RmlsZXMuZ2V0U2VsZWN0aW9uKCkgKTsgICAgCi0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDlkMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TY2VuYXJpb0RlZmF1bHRzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9EZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnBsdWdpbi5XZWJTZXJ2aWNlVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2NlbmFyaW9EZWZhdWx0c1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIAotICBwcml2YXRlIFRhYmxlVmlld2VyIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl87IAotICBwcml2YXRlIEJ1dHRvbiBtb3ZlVXBfOwotICBwcml2YXRlIEJ1dHRvbiBtb3ZlRG93bl87Ci0gIHByaXZhdGUgVmVjdG9yIHdlYlNlcnZpY2VUZXN0VHlwZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBQU0QwMDAxIGZvciB0aGUgU2NlbmFyaW8gRGVmYXVsdHMgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QUFNEX1BBR0UgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAxIjsKLSAgLy8KLSAgcHJpdmF0ZSBCdXR0b24gbGF1bmNoU2FtcGxlOwotICAvKkNPTlRFWFRfSUQgUFBTRDAwMDIgZm9yIHRoZSBsYXVuY2ggc2FtcGxlIGNoZWNrIGJveCBvbiB0aGUgU2NlbmFyaW8gRGVmYXVsdHMgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU5GT1BPUF9QUFNEX0NIRUNLQk9YX0xBVU5DSF9TQU1QTEUgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAyIjsKLSAgLy8KLSAgcHJpdmF0ZSBMYWJlbCBzYW1wbGVHZW5lcmF0aW9uTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHNhbXBsZUdlbmVyYXRpb25UeXBlc187Ci0gIC8qQ09OVEVYVF9JRCBQUFNEMDAwNCBmb3IgdGhlIHNhbXBsZSBKU1AgdHlwZSBjb21ibyBib3ggb24gdGhlIFNjZW5hcmlvIERlZmF1bHRzIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElORk9QT1BfUFBTRF9DT01CT19TQU1QTEVfR0VOID0gV2ViU2VydmljZVVJUGx1Z2luLklEICsgIi5QUFNEMDAwNCI7Ci0KLSAgcHJpdmF0ZSBMYWJlbCB3c2V4cGxvcmVyVHlwZXNMYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gd3NleHBsb3JlclR5cGVzXzsKLSAgLypDT05URVhUX0lEIFBQU0QwMDAzIGZvciB0aGUgd2ViIGV4cGxvcmVyIHR5cGUgY29tYm8gYm94IG9uIHRoZSBTY2VuYXJpbyBEZWZhdWx0cyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJTkZPUE9QX1BQU0RfQ09NQk9fRVhQTE9SRVIgPSBXZWJTZXJ2aWNlVUlQbHVnaW4uSUQgKyAiLlBQU0QwMDAzIjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIAotICAJQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KGdldE1lc3NhZ2UoIiVUT09MVElQX1BQU0RfUEFHRSIpKTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LElORk9QT1BfUFBTRF9QQUdFKTsgICAgCi0KLSAgICBsYXVuY2hTYW1wbGUgPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIGdldE1lc3NhZ2UoIiVCVVRUT05fTEFVTkNIX1NBTVBMRSIpKTsKLSAgICBsYXVuY2hTYW1wbGUuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfUFBTRF9DSEVDS0JPWF9MQVVOQ0hfU0FNUExFIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobGF1bmNoU2FtcGxlLCBJTkZPUE9QX1BQU0RfQ0hFQ0tCT1hfTEFVTkNIX1NBTVBMRSk7Ci0KLSAgICAKLSAgICBUZXh0IHRlc3RTZXJ2aWNlVHlwZUxhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULldSQVApOwotICAgIHRlc3RTZXJ2aWNlVHlwZUxhYmVsLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX1NBTVBMRV9UWVBFUyIpKTsKLQotICAgIENvbXBvc2l0ZSB3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGdsLm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgZ2wubWFyZ2luV2lkdGggPSAwOwotICAgIHdlYlNlcnZpY2VUZXN0VHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotCi0gICAgVGFibGUgdGFibGU9IG5ldyBUYWJsZSh3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLSAgICBnZC53aWR0aEhpbnQgPSAyNTY7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgdGFibGUuc2V0VG9vbFRpcFRleHQoZ2V0TWVzc2FnZSgiJVRPT0xUSVBfQ0xJRU5UX1RZUEVfVEFCTEVfVklFV0VSIikpOwotCi0gICAgd2ViU2VydmljZVRlc3RUeXBlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXyA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5zZXRDb250ZW50UHJvdmlkZXIobmV3IFdlYlNlcnZpY2VUZXN0VHlwZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnNldExhYmVsUHJvdmlkZXIobmV3IFdlYlNlcnZpY2VUZXN0VHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5zZXRJbnB1dCh3ZWJTZXJ2aWNlVGVzdFR5cGVzXyk7Ci0KLSAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0gICAgdGFibGVDb2x1bW4uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRSIpKTsKLSAgICBDb2x1bW5XZWlnaHREYXRhIGNvbHVtbkRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyNTYsIDI1NiwgZmFsc2UpOwotICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uRGF0YSk7Ci0gICAgdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZSh3ZWJTZXJ2aWNlVGVzdFR5cGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgYy5zZXRMYXlvdXQoZ2wpOwotCi0gICAgbW92ZVVwXyA9IG5ldyBCdXR0b24oYywgU1dULlBVU0gpOwotICAgIG1vdmVVcF8uc2V0VGV4dChnZXRNZXNzYWdlKCIlTEFCRUxfTU9WRV9VUCIpKTsKLSAgICBtb3ZlVXBfLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgIG1vdmVVcF8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgbW92ZVVwXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9NT1ZFX1VQIikpOwotCi0gICAgbW92ZURvd25fID0gbmV3IEJ1dHRvbihjLCBTV1QuUFVTSCk7Ci0gICAgbW92ZURvd25fLnNldFRleHQoZ2V0TWVzc2FnZSgiJUxBQkVMX01PVkVfRE9XTiIpKTsKLSAgICBtb3ZlRG93bl8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgbW92ZURvd25fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIG1vdmVEb3duXy5zZXRUb29sVGlwVGV4dChnZXRNZXNzYWdlKCIlVE9PTFRJUF9NT1ZFX0RPV04iKSk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsgICAgCi0KLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSAKLSAgewotICAgICAgCXJldHVybiBXZWJTZXJ2aWNlVUlQbHVnaW4uZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0gCi0gIHByaXZhdGUgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCApCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuQ0hFQ0sgKTsKLSAgICBidXR0b24uc2V0VGV4dCggdGV4dCApOwotICAgIHJldHVybiBidXR0b247Ci0gIH0KLQotICAvKioKLSAgICogRG9lcyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgZGVmYXVsdCBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpCi0gIHsKLSAgICBzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLSAgICBpbml0aWFsaXplRGVmYXVsdHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBEbyBhbnl0aGluZyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgT0sgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqICBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKQotICB7Ci0gICAgdHJ5ewotICAgICAgc3RvcmVWYWx1ZXMoKTsKLSAgICB9Y2F0Y2ggKEV4Y2VwdGlvbiBleGMpewotICAgIAlleGMucHJpbnRTdGFja1RyYWNlKCk7fQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHRyeXsKLSAgCXBlcmZvcm1PaygpOwotICAgIH1jYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpewotICAgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgIHsgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIHRvIHRoZWlyIGJ1cm5lZC1pbiBkZWZhdWx0cy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKQotICB7Ci0gICAgU2NlbmFyaW9EZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBTY2VuYXJpb0RlZmF1bHRzKCk7Ci0gICAgLy9wZ20gbGF1bmNoU2FtcGxlLnNldFNlbGVjdGlvbiggZGVmYXVsdHMuZ2V0TGF1bmNoU2FtcGxlRGVmYXVsdCgpKTsKLSAgICAKLSAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5jbGVhcigpOwotICAgIFN0cmluZ1tdIHR5cGVzID0gZGVmYXVsdHMuZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspCi0gICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5hZGQodHlwZXNbaV0pOwotICAgIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBoZWxwZXIuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0gIHsKLSAgCVNjZW5hcmlvQ29udGV4dCAgY29udGV4dCAgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0gICAgU2NlbmFyaW9EZWZhdWx0cyBkZWZhdWx0cyA9IG5ldyBTY2VuYXJpb0RlZmF1bHRzKCk7Ci0gICAgLy9wZ20gbGF1bmNoU2FtcGxlLnNldFNlbGVjdGlvbiggY29udGV4dC5pc0xhdW5jaFNhbXBsZUVuYWJsZWQoKSk7Ci0gICAgICAgIAotICAgIFN0cmluZ1tdIHR5cGVzID0gY29udGV4dC5nZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgLy8gY2hlY2sgd2hldGhlciB3ZSBtaXNzZWQgYW55IHR5cGVzIGZyb20gdGhlIGRlZmF1bHQgbGlzdAotICAgIGJvb2xlYW4gbWlzc2VkID0gZmFsc2U7Ci0gICAgdHlwZXMgPSBkZWZhdWx0cy5nZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAod2ViU2VydmljZVRlc3RUeXBlc18uaW5kZXhPZih0eXBlc1tpXSkgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmFkZCh0eXBlc1tpXSk7Ci0gICAgICAgIG1pc3NlZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtaXNzZWQpCi0gICAgewotICAgICAgdHlwZXMgPSBuZXcgU3RyaW5nW3dlYlNlcnZpY2VUZXN0VHlwZXNfLnNpemUoKV07Ci0gICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5jb3B5SW50byh0eXBlcyk7Ci0gICAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUZXN0VHlwZXModHlwZXMpOwotICAgIH0KLSAgICAvLyByZWZyZXNoIHZpZXdlcgotICAgIHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8ucmVmcmVzaCgpOwotICAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBoZWxwZXIuCi0gICAqLwotICBwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKQotICB7Ci0gICAgU2NlbmFyaW9Db250ZXh0IGNvbnRleHQgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0gICAgU3RyaW5nW10gdHlwZXMgPSBuZXcgU3RyaW5nW3dlYlNlcnZpY2VUZXN0VHlwZXNfLnNpemUoKV07Ci0gICAgd2ViU2VydmljZVRlc3RUeXBlc18uY29weUludG8odHlwZXMpOwotICAgIGNvbnRleHQuc2V0V2ViU2VydmljZVRlc3RUeXBlcyh0eXBlcyk7Ci0gICAgCi0gICAgLy9wZ20gY29udGV4dC5zZXRMYXVuY2hTYW1wbGVFbmFibGVkKGxhdW5jaFNhbXBsZS5nZXRTZWxlY3Rpb24oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGludCBpbmRleCA9IHdlYlNlcnZpY2VUZXN0VHlwZVZpZXdlcl8uZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoZS53aWRnZXQgPT0gbW92ZVVwXyAmJiBpbmRleCA+IDApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5yZW1vdmUoaW5kZXgpOwotICAgICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5pbnNlcnRFbGVtZW50QXQob2JqZWN0LCBpbmRleC0xKTsKLSAgICAgICAgd2ViU2VydmljZVRlc3RUeXBlVmlld2VyXy5yZWZyZXNoKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBtb3ZlRG93bl8gJiYgaW5kZXggPCB3ZWJTZXJ2aWNlVGVzdFR5cGVzXy5zaXplKCktMSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iamVjdCA9IHdlYlNlcnZpY2VUZXN0VHlwZXNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXN0VHlwZXNfLmluc2VydEVsZW1lbnRBdChvYmplY3QsIGluZGV4KzEpOwotICAgICAgICB3ZWJTZXJ2aWNlVGVzdFR5cGVWaWV3ZXJfLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFdlYlNlcnZpY2VUZXN0VHlwZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgdmFsdWUpIAotICAgIHsKLSAgICAgIHJldHVybiAoKFZlY3Rvcil2YWx1ZSkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYXJnMCwgT2JqZWN0IGFyZzEsIE9iamVjdCBhcmcyKSAKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBXZWJTZXJ2aWNlVGVzdFR5cGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotICB7Ci0gICAgcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c187Ci0KLSAgICBwdWJsaWMgV2ViU2VydmljZVRlc3RUeXBlTGFiZWxQcm92aWRlcigpCi0gICAgewotICAgICAgV2ViU2VydmljZVRlc3RSZWdpc3RyeSB3c3RyID0gV2ViU2VydmljZVRlc3RSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgICAgY29uZmlnRWxlbWVudHNfID0gd3N0ci5nZXRDb25maWdFbGVtZW50cygpOwotICAgIH0KLQotICAgIC8qKgotICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLSAgICAqLwotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgYXJnMCkgCi0gICAgeyAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IHZhbHVlKSAKLSAgICB7Ci0gICAgICAvL3JldHVybiBnZXRFbGVtZW50QnlBdHRyaWJ1dGUoImlkIiwgdmFsdWUudG9TdHJpbmcoKSkuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAKLSAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC91aS91ZGRpL1ByaXZhdGVVRERJUmVnaXN0cnlUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3VkZGkvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3YWJjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3VpL3VkZGkvUHJpdmF0ZVVERElSZWdpc3RyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnVpLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZzsKLQotcHVibGljIGludGVyZmFjZSBQcml2YXRlVURESVJlZ2lzdHJ5VHlwZQotewotICAgIHB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZVVERElSZWdpc3RyeUluc3RhbGxlZCgpOwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5SW5xdWlyeUFQSSgpOwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQcml2YXRlVURESVJlZ2lzdHJ5UHVibGlzaEFQSSgpOwotICAgIHB1YmxpYyBDb21tYW5kV2lkZ2V0QmluZGluZyBnZXRCaW5kaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy91aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNGU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBHcmFwaGljYWwgVXNlciBJbnRlcmZhY2UKLVBMVUdJTl9WRU5ET1I9SW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLgotUExVR0lOX0RFU0M9XAotVGhlIFdlYiBzZXJ2aWNlcyBHVUkgcGx1Z2luIGRlbGl2ZXJzIHRoZSBncmFwaGljYWwgXAotdXNlciBpbnRlcmZhY2UgdG8gdGhlIFdlYiBzZXJ2aWNlcyBmdW5jdGlvbiBvZiB0aGUgXAotV2ViIHNlcnZpY2VzIHBsdWdpbi4KLQotUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTPVdlYiBTZXJ2aWNlcwotCi0jCi0jCVdlYiBTZXJ2aWNlcyBQcmVmZXJhbmNlIFBhZ2VzCi0jCi0jIENhdGVnb3JpZXMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUkVTT1VSQ0VfTUFOQUdFTUVOVD1SZXNvdXJjZSBNYW5hZ2VtZW50Ci1QUkVGRVJFTkNFX0NBVEVHT1JZX0NPREVfR0VORVJBVElPTj1Db2RlIEdlbmVyYXRpb24KLVBSRUZFUkVOQ0VfQ0FURUdPUllfU0NFTkFSSU9fREVGQVVMVFM9U2NlbmFyaW8gRGVmYXVsdHMKLVBSRUZFUkVOQ0VfQ0FURUdPUllfUFJPSkVDVF9UT1BPTE9HWT1Qcm9qZWN0IFRvcG9sb2d5Ci1QUkVGRVJFTkNFX0NBVEVHT1JZX0RSSVZFUl9KQVJTPUpEQkMgZHJpdmVycwotCi0KLSMKLSNTY2VuYXJpbyBEZWZhdWx0cwotQlVUVE9OX0xBVU5DSF9TQU1QTEU9TGF1bmNoIHRoZSBzYW1wbGUgd2hlbiBnZW5lcmF0ZWQKLUxBQkVMX1VERElfQ0FUX0RBVEFfQ09MVU1OX0RFTElNPVVzZXIgZGVmaW5lZCBVRERJIENhdGVnb3J5IGRhdGEgY29sdW1uIGRlbGltaXRlcjoKLUxBQkVMX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNPVVzZXIgZGVmaW5lZCBVRERJIENhdGVnb3J5IGRhdGEgc3RyaW5nIGRlbGltaXRlcjoKLU1TR19FUlJPUl9DT0xVTU5fU1RSSU5HX0RFTElNU19JREVOVElDQUw9SVdBQjA0ODFFIFVEREkgY29sdW1uIGFuZCBzdHJpbmcgZGVsaW1pdGVycyBtdXN0IG5vdCBiZSBpZGVudGljYWwuCi1MQUJFTF9NT1ZFX1VQPU1vdmUgdXAKLUxBQkVMX01PVkVfRE9XTj1Nb3ZlIGRvd24KLQotIwotIyBQcmVmZXJlbmNlcyBUb29sdGlwcwotIwotCi0jU2NlbmFyaW8gRGVmYXVsdHMKLVRPT0xUSVBfUFBTRF9QQUdFPVNldCB0aGUgZGVmYXVsdHMgZm9yIHRoZSBXZWIgc2VydmljZSBzY2VuYXJpb3MuCi1UT09MVElQX1BQU0RfQ0hFQ0tCT1hfTEFVTkNIX1NBTVBMRT1MYXVuY2ggdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBhZnRlciBnZW5lcmF0aW9uLgotVE9PTFRJUF9QUFNEX0NPTUJPX1NBTVBMRV9HRU49U2VsZWN0IHRoZSB0eXBlIG9mIHNhbXBsZSBKU1AgdG8gYmUgZ2VuZXJhdGVkLgotVE9PTFRJUF9QUFNEX0NPTUJPX0VYUExPUkVSPVNlbGVjdCB0aGUgdHlwZSBvZiB0aGUgV2ViIHNlcnZpY2VzIGV4cGxvcmVyIHRvIGJlIHVzZWQuCi1UT09MVElQX1BQU0RfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU09Y29sdW1uIGRlbGltaXRlciBmb3IgdXNlciBkZWZpbmVkIFVEREkgY2F0ZWdvcnkgZGF0YQotVE9PTFRJUF9QUFNEX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNPXN0cmluZyBkZWxpbWl0ZXIgZm9yIHVzZXIgZGVmaW5lZCBVRERJIGNhdGVnb3J5IGRhdGEKLVRPT0xUSVBfQ0xJRU5UX1RZUEVfVEFCTEVfVklFV0VSPVByZWZlcnJlZCBvcmRlciBvZiB0aGUgbGlzdCBvZiBjbGllbnQgdHlwZXMKLVRPT0xUSVBfTU9WRV9VUD1Nb3ZlIHRoZSBzZWxlY3RlZCBjbGllbnQgdHlwZSB1cCB0aGUgbGlzdAotVE9PTFRJUF9NT1ZFX0RPV049TW92ZSB0aGUgc2VsZWN0ZWQgY2xpZW50IHR5cGUgZG93biB0aGUgbGlzdAotCi0jCi0jIFJlc291cmNlIE1hbmFnbWVudAotVE9PTFRJUF9QUFJNX1BBR0U9U2V0IHByZWZlcmVuY2VzIHRoYXQgY29udHJvbCByZXNvdXJjZXMgdXNlZC9nZW5lcmF0ZWQgYnkgdGhlIFdlYiBzZXJ2aWNlLgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX09WRVJXUklURV9GSUxFUz1PdmVyd3JpdGUgZmlsZXMgd2l0aG91dCB3YXJuaW5nLgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NSRUFURV9GT0xERVJTPUNyZWF0ZSBmb2xkZXJzIHdoZW4gbmVjZXNzYXJ5LgotVE9PTFRJUF9QUFJNX0NIRUNLQk9YX0NIRUNLX09VVD1DaGVjayBvdXQgZmlsZXMgd2l0aG91dCB3YXJuaW5nLgotQlVUVE9OX0NSRUFURV9GT0xERVJTPUNyZWF0ZSBmb2xkZXJzIHdoZW4gbmVjZXNzYXJ5Ci1CVVRUT05fT1ZFUldSSVRFX0ZJTEVTPU92ZXJ3cml0ZSBmaWxlcyB3aXRob3V0IHdhcm5pbmcKLUJVVFRPTl9DSEVDS09VVF9GSUxFUz1DaGVjayBvdXQgZmlsZXMgd2l0aG91dCB3YXJuaW5nCi0KLSMKLSMgR2VuZXJhbCBtZXNzYWdlcy4KLSMKLUlTVEFUVVNfV0lUSE9VVF9FWENFUFRJT049ezB9Ci1JU1RBVFVTX1dJVEhfRVhDRVBUSU9OPXswfVxuRXhjZXB0aW9uOiB7MX0KLU1TR19JTkZPX1NBVkVEX1NUQVRVUz1JV0FCMDI5N0kgUHJlc3MgdGhlIERldGFpbHMgYnV0dG9uIHRvIHNlZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotCi0jCi0jIFR5cGVTZWxlY3Rpb25EaWFsb2cKLSMKLURJQUxPR19USVRMRV9DTEFTU19CUk9XU0U9QnJvd3NlIENsYXNzZXMKLURJQUxPR19USVRMRV9JTlRFUkZBQ0VfQlJPV1NFPUJyb3dzZSBJbnRlcmZhY2VzCi0KLSMKLSMgQ29tbW9uIHdpemFyZCBzdHJpbmdzLgotIwotTEFCRUxfV1NFWFBMT1JFUl9UWVBFUz1XZWIgU2VydmljZXMgRXhwbG9yZXIKLUxBQkVMX1NBTVBMRV9UWVBFUz1KYXZhIHByb3h5IHNhbXBsZQotCi0jCi0jIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nCi0jCi1ESUFMT0dfVElUTEVfUkVTT1VSQ0VfQlJPV1NFPUJyb3dzZSBGaWxlcwotTEFCRUxfUkVTT1VSQ0VfRklMVEVSPUZpbHRlcjoKLQotIwotIyBUb29sdGlwcyBmb3IgZGlhbG9nLlJlc291cmNlU2VsZWN0aW9uRGlhbG9nCi0jIERSRVM9RGlhbG9nL1JFU291cmNlcwotIwotVE9PTFRJUF9EUkVTX0NPTUJPX1JFU09VUkNFX1RZUEU9VHlwZSBvZiByZXNvdXJjZXMgdG8gYnJvd3NlLgotVE9PTFRJUF9EUkVTX1RSRUVfUkVTT1VSQ0U9UmVzb3VyY2VzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uLgotCi0KLQotIwotIyBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uCi0jCi1QUkVGRVJFTkNFX0NBVEVHT1JZX0hUVFBfQkFTSUNfQVVUSD1IVFRQIEJhc2ljIEF1dGgKLUNIRUNLQk9YX1BSRUZFUkVOQ0VfRU5BQkxFX0hUVFBfQkFTSUNfQVVUSD1FbmFibGUgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbgotTEFCRUxfUFJFRkVSRU5DRV9IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUU9SFRUUCBiYXNpYyBhdXRoIHVzZXIgbmFtZToKLUxBQkVMX1BSRUZFUkVOQ0VfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEPUhUVFAgYmFzaWMgYXV0aCBwYXNzd29yZDoKLQotVE9PTFRJUF9FTkFCTEVfSFRUUF9CQVNJQ19BVVRIPVNwZWNpZnkgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiBzZXR0aW5nIGZvciBXZWIgc2VydmljZXMgdG9vbGluZ3MuCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9VU0VSTkFNRT1Vc2VyIG5hbWUgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24uCi1UT09MVElQX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRD1QYXNzd29yZCBmb3IgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbi4KLQotCi0jCi0jIE1lc3NhZ2VzIGZvciBwcm9qZWN0IHRvcG9sb2d5IHByZWZlcmVuY2UgcGFnZQotIwotVE9PTFRJUF9QVFBQX1BBR0U9UHJlZmVyZW5jZSB0aGF0IGNvbnRyb2wgdGhlIHByb2plY3QgdG9wb2xvZ3kgb2YgeW91ciBXZWIgc2VydmljZSBhbmQgY2xpZW50IHNjZW5hcmlvcy4KLVRPT0xUSVBfRU5BQkxFX1RXT19FQVJTPUVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSB5b3VyIFdlYiBzZXJ2aWNlIGFuZCBXZWIgc2VydmljZSBjbGllbnQgaW4gZGlmZmVyZW50IEVBUiBwcm9qZWN0cy4KLQotTEFCRUxfRU5BQkxFX1RXT19FQVJTPUdlbmVyYXRlIFdlYiBzZXJ2aWNlIGFuZCBXZWIgc2VydmljZSBjbGllbnQgaW4gZGlmZmVyZW50IEVBUiBwcm9qZWN0cwotTEFCRUxfQ0xJRU5UX1RZUEVfTkFNRT1DbGllbnQgdHlwZToKLQotCi0jCi0jCUFjdGlvbkRpYWxvZ3MgUGFnZQotIwotUFJFRkVSRU5DRV9DQVRFR09SWV9ESUFMT0dTPURpYWxvZ3MKLQotIwotIyBSZXNvdXJjZSBCcm93c2VyCi0jCi1ESUFMT0dfVElUTEVfUkVTT1VSQ0VfQlJPV1NFUj1SZXNvdXJjZSBicm93c2VyCi1UT09MVElQX1JFU09VUkNFX1RSRUU9Q2hvb3NlIGEgcmVzb3VyY2UuCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGU1N2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotd3MuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzA5MTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLndzdC53c2RsPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUzZTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogd3MuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kYXRhLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5kaWFsb2csCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS5qZW0sCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LndlYiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUsCi0gb3JnLnVkZGk0aiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbAotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZlMTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGRvYy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgd3MuamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlLndzLmphciA9IHNyYy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBiZjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MiPgotICAgPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+Ci0gICA8L2NvbXBvbmVudC1kZXBlbmRzPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5heGlzLmNvbnN1bXB0aW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY3JlYXRpb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24uZWpiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWRkaXJlZ2lzdHJ5IiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNWE4YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL051bGxTdGF0dXNNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvTnVsbFN0YXR1c01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyY2JjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvTnVsbFN0YXR1c01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0qIEEgTnVsbFN0YXR1c1JlbmRlcmVyIHRocm93cyBhd2F5IElTdGF0dXMgaW5mb3JtYXRpb24uCi0qLwotcHVibGljIGNsYXNzIE51bGxTdGF0dXNNb25pdG9yIGltcGxlbWVudHMgU3RhdHVzTW9uaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHJlc3VsdDsKLQotICAvKioKLSAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAqLwotICBwdWJsaWMgTnVsbFN0YXR1c01vbml0b3IgKCkgIHt9Ci0gIC8qKgotICAqIERvZXMgbm90aGluZy4KLSAgKi8KLSAgcHVibGljIGludCByZXBvcnRTdGF0dXMoSVN0YXR1cyBzdGF0dXMsIFZlY3RvciBvcHRpb25zKSB7IHJldHVybiAwOyB9Ci0gIHB1YmxpYyBib29sZWFuIHJlcG9ydFN0YXR1cyhJU3RhdHVzIHN0YXR1cykgCi0gIHsgCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIElTdGF0dXMuRVJST1I6Ci0gICAgICBjYXNlIElTdGF0dXMuV0FSTklORzoKLSAgICAgIAkJcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAJCWJyZWFrOwotCSAgY2FzZSBJU3RhdHVzLklORk86Ci0gICAgICBkZWZhdWx0OiAvL0lTdGF0dXMuT0sKLSAgICAgIAkJcmVzdWx0ID0gdHJ1ZTsgCi0gICAgICAJCWJyZWFrOwotICAgICB9Ci0gCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgcHVibGljIHZvaWQgZHVtcFNhdmVkU3RhdHVzKCkgeyB9Ci0gIHB1YmxpYyBib29sZWFuIGNhbkNvbnRpbnVlKCkgCi0gIHsgCi0JcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0ICgpIHsKLSAgCQlyZXN1bHQgPSB0cnVlOwotICAJfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlOTFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSogQSBTdGF0dXNNb25pdG9yIHJlcG9ydHMgSVN0YXR1cyBpbmZvcm1hdGlvbiB0byBhIGRpc3BsYXkgc3lzdGVtLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdHVzTW9uaXRvcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIHJlcG9ydHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBzdGF0dXMgb2JqZWN0LgotICAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVwb3J0Ci0gICogSVN0YXR1cyBpbmZvcm1hdGlvbiB0byBhIGdpdmVuIGRpc3BsYXkgc3lzdGVtLAotICAqIHN1Y2ggYXMgU1dULCB0aGUgY29tbWFuZCBsaW5lLCBvciBhIHRyYWNlIGZpbGUuCi0gICovCi0gIHB1YmxpYyBpbnQgcmVwb3J0U3RhdHVzKElTdGF0dXMgc3RhdHVzLCBWZWN0b3Igb3B0aW9ucyk7Ci0gIHB1YmxpYyBib29sZWFuIHJlcG9ydFN0YXR1cyhJU3RhdHVzIHN0YXR1cyk7Ci0gIHB1YmxpYyB2b2lkIGR1bXBTYXZlZFN0YXR1cygpOwotICBwdWJsaWMgYm9vbGVhbiBjYW5Db250aW51ZSgpOwotICBwdWJsaWMgdm9pZCByZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tYW5kL1N0YXR1c1JlbmRlcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNmZjNhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1hbmQvU3RhdHVzUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSogQSBTdGF0dXNSZW5kZXJlciByZW5kZXJzIElTdGF0dXMgaW5mb3JtYXRpb24gdG8gYSBkaXNwbGF5IHN5c3RlbS4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c1JlbmRlcmVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogUmVuZGVycyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHN0YXR1cyBvYmplY3QuCi0gICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW5kZXIKLSAgKiBJU3RhdHVzIGluZm9ybWF0aW9uIHRvIGEgZ2l2ZW4gZGlzcGxheSBzeXN0ZW0sCi0gICogc3VjaCBhcyBTV1QsIHRoZSBjb21tYW5kIGxpbmUsIG9yIGEgdHJhY2UgZmlsZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcmVuZGVyICggSVN0YXR1cyBzdGF0dXMgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0FueUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vQW55RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDBhMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vQW55RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi0KLS8qKgotKiBUaGlzIGlzIGEga2luZCBvZiB7QGxpbmsgRmlsdGVyfSB0aGF0IGFjY2VwdHMgYWxsIG9iamVjdHMsCi0qIGFuZCBpcyBhIHN1aXRhYmxlIGJhc2UgY2xhc3MgZm9yIG5ldyA8Y29kZT5GaWx0ZXJzPC9jb2RlPi4KLSovCi1wdWJsaWMgY2xhc3MgQW55RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5BbnlGaWx0ZXI8L2NvZGU+LgotICAqLwotICBwdWJsaWMgQW55RmlsdGVyICgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBuYW1lIG9mIHRoaXMgZmlsdGVyLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVBTllfRklMVEVSX05BTUUiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCkKLSAgewotICAgIHJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVBTllfRklMVEVSX0RFU0MiKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogU2VlIHtAbGluayBGaWx0ZXIjc3RhdHVzT2Z9IGZvciBnZW5lcmFsIGNvbW1lbnRzLgotICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkFueUZpbHRlcjwvY29kZT4KLSAgKiByZXR1cm5zIGEgc3RhdHVzIHdpdGggc2V2ZXJpdHkgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4uCi0gICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0gICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGZpbHRlci4KLSAgKiBAcmV0dXJuIEFuIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1c30uCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCwiIixudWxsKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB7QGxpbmsgI3N0YXR1c09mfSByZXR1cm5zCi0gICogYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfSB3aXRoIGEKLSAgKiBzZXZlcml0eSBvZiBsZXNzIHRoYW4gPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4uCi0gICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhIGhpZ2hlci1wZXJmb3JtYW5jZQotICAqIGltcGxlbWVudGF0aW9uLgotICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBmaWx0ZXIuCi0gICogQHJldHVybiBUcnVlIGlmIGFuZCBvbmx5IGlmIHtAbGluayAjc3RhdHVzT2Z9IHJldHVybnMKLSAgKiBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9IHdpdGggYQotICAqIHNldmVyaXR5IG9mIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWNjZXB0cyAoIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgcmV0dXJuICFzdGF0dXNPZihvYmplY3QpLm1hdGNoZXMoSVN0YXR1cy5FUlJPUik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc3YTU4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9FbnZpcm9ubWVudFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlRyYW5zaWVudFJlc291cmNlQ29udGV4dDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbnZpcm9ubWVudFV0aWxzCi17Ci0gIC8qKgotICAgKiBAcGFyYW0gZW52Ci0gICAqIEByZXR1cm4gSVByb2dyZXNzTW9uaXRvcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldElQcm9ncmVzc01vbml0b3IoRW52aXJvbm1lbnQgZW52KQotICB7Ci0gIAkgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBlbnYuZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgIAkgSVByb2dyZXNzTW9uaXRvciBlY2xpcHNlTW9uaXRvciA9IG51bGw7Ci0gICAgIAkgaWYgKG1vbml0b3IgaW5zdGFuY2VvZiBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKQotICAgICAJIHsKLSAgICAgCSAJZWNsaXBzZU1vbml0b3IgPSAoKEVjbGlwc2VQcm9ncmVzc01vbml0b3IpbW9uaXRvcikuZ2V0TW9uaXRvcigpOwotICAgICAJIH0KLSAgICAgCSByZXR1cm4gZWNsaXBzZU1vbml0b3I7Ci0gIH0KLSAgCi0gIAotICAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGVudiBUaGlzIHNob3VsZCBiZSBhbiBFY2xpcHNlRW52aXJvbm1lbnQuCi0gICAqIEByZXR1cm4gUmV0dXJucyBhIFJlc291cmNlQ29udGV4dC4KLSAgICovIAotICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoIEVudmlyb25tZW50IGVudiApCi0gIHsKLSAgICBSZXNvdXJjZUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0gICAgCi0gICAgaWYoIGVudiBpbnN0YW5jZW9mIEVjbGlwc2VFbnZpcm9ubWVudCApCi0gICAgewotICAgICAgY29udGV4dCA9ICgoRWNsaXBzZUVudmlyb25tZW50KWVudikuZ2V0UmVzb3VyY2VDb250ZXh0KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY29udGV4dDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBpc3RhdHVzCi0gICAqIEByZXR1cm4gU3RhdHVzCi0gICAqLwotCi0gIC8qKgotICAgKiBUT0RPOiBEZWxldGUuIFRoZXJlJ3MgYSByZXBsYWNlbWVudCBpbiB0aGUgZW52IHBsdWdpbi4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0YXR1cyBjb252ZXJ0SVN0YXR1c1RvU3RhdHVzKElTdGF0dXMgaXN0YXR1cykKLSAgewotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSBpc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICBJU3RhdHVzW10gY2hpbGRyZW4gPSBpc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgaW50IG5vT2ZDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICBpZiAobm9PZkNoaWxkcmVuID4gMCkKLSAgICB7Ci0gICAgICBTdGF0dXNbXSBzdGF0dXNDaGlsZHJlbiA9IG5ldyBTdGF0dXNbbm9PZkNoaWxkcmVuXTsKLSAgICAgIGZvciAoaW50IGk9MDtpPG5vT2ZDaGlsZHJlbjtpKyspCi0gICAgICB7Ci0gICAgICAgIHN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydElTdGF0dXNUb1N0YXR1cyhjaGlsZHJlbltpXSk7Ci0gICAgICB9Ci0KLSAgICAgIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsbWVzc2FnZSxzdGF0dXNDaGlsZHJlbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc2V2ZXJpdHkgPSBpc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICBpbnQgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuT0s7Ci0gICAgICBzd2l0Y2ggKHNldmVyaXR5KQotICAgICAgewotICAgICAgICBjYXNlIElTdGF0dXMuRVJST1I6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuRVJST1I7Ci0gICAgICAgIAlicmVhazsKLSAgICAgICAgY2FzZSBJU3RhdHVzLldBUk5JTkc6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuV0FSTklORzsKLSAgICAgICAgCWJyZWFrOwotICAgICAgICBjYXNlIElTdGF0dXMuSU5GTwk6Ci0gICAgICAgICAgc3RhdHVzU2V2ZXJpdHkgPSBTdGF0dXMuSU5GTzsKLSAgICAgICAgCWJyZWFrOyAgICAgIAkKLSAgICAgICAgY2FzZSBJU3RhdHVzLk9LOgotICAgICAgICAgIHN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLk9LOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBkZWZhdWx0OgotICAgICAgfQotICAgICAgVGhyb3dhYmxlIGUgPSBpc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixtZXNzYWdlLHN0YXR1c1NldmVyaXR5LGUpOwotICAgIH0KLSAgICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogVE9ETzogRGVsZXRlLiBUaGVyZSdzIGEgcmVwbGFjZW1lbnQgaW4gdGhlIGVudiBwbHVnaW4uIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoU3RhdHVzIHN0YXR1cywgU3RyaW5nIHBsdWdpbklkKQotICB7Ci0gICAgSVN0YXR1cyBpc3RhdHVzOwotICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLSAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0gc3RhdHVzLmdldFRocm93YWJsZSgpOwotICAgIGlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSkKLSAgICB7Ci0gICAgICBTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgICAgaW50IG5vT2ZDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aDsKLSAgICAgIElTdGF0dXNbXSBpc3RhdHVzQ2hpbGRyZW4gPSBuZXcgSVN0YXR1c1tub09mQ2hpbGRyZW5dOwotICAgICAgZm9yIChpbnQgaT0wO2k8bm9PZkNoaWxkcmVuO2krKykKLSAgICAgIHsKLSAgICAgICAgaXN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydFN0YXR1c1RvSVN0YXR1cyhjaGlsZHJlbltpXSwgcGx1Z2luSWQpOwotICAgICAgfQotCi0gICAgICBpc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLDAsaXN0YXR1c0NoaWxkcmVuLG1lc3NhZ2UsdGhyb3dhYmxlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgaW50IGlzdGF0dXNTZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0gICAgICBzd2l0Y2ggKHNldmVyaXR5KQotICAgICAgewotICAgICAgICBjYXNlIFN0YXR1cy5FUlJPUjoKLSAgICAgICAgICBpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotICAgICAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgU3RhdHVzLldBUk5JTkc6Ci0gICAgICAgICAgaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotICAgICAgICAJYnJlYWs7Ci0gICAgICAgIGNhc2UgU3RhdHVzLklORk86Ci0gICAgICAgICAgaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBjYXNlIFN0YXR1cy5PSzoKLSAgICAgICAgICBpc3RhdHVzU2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotICAgICAgICAJYnJlYWs7ICAgICAgCQotICAgICAgICBkZWZhdWx0OgotICAgICAgfSAgICAgIAotICAgICAgaXN0YXR1cyA9IG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzKGlzdGF0dXNTZXZlcml0eSxwbHVnaW5JZCwwLG1lc3NhZ2UsdGhyb3dhYmxlKTsKLSAgICB9Ci0gICAgICAKLSAgICByZXR1cm4gaXN0YXR1czsKLSAgfSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmMGJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgY2xhc3Mgb2Ygb2JqZWN0cyB0aGF0IGZpbHRlcgotKiBvdGhlciBvYmplY3RzIGZvciBpbmNsdXNpb24gb3IgZXhjbHVzaW9uIGJ5IHNvbWUgY29uc3VtZXIuCi0qLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXIKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbmFtZSBvZiB0aGlzIGZpbHRlci4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpbHRlci4KLSAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhpcyBmaWx0ZXIuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24gKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXN9Ci0gICogZGVzY3JpYmluZyB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPidzIGFzc2Vzc21lbnQgb2YKLSAgKiB0aGUgZ2l2ZW4gPGNvZGU+b2JqZWN0PC9jb2RlPi4KLSAgKiBUaGUgc2V2ZXJpdHkgb2YgdGhlCi0gICogcmV0dXJuZWQgPGNvZGU+SVN0YXR1czwvY29kZT4gaXMgYXMgZm9sbG93czoKLSAgKiA8dWw+Ci0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNPS30KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBhY2NlcHRzIHRoZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogd2l0aCBubyBmdXJ0aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgY2FsbGVyIChtZWFuaW5nIHRoZQotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRNZXNzYWdlfSBhbmQKLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjZ2V0RXhjZXB0aW9ufSBtZXRob2RzCi0gICogYXJlIGlnbm9yZWQpLgotICAqIDxsaT4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjSU5GT30KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBhY2NlcHRzIHRoZSA8Y29kZT5vYmplY3Q8L2NvZGU+Ci0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNXQVJOSU5HfQotICAqIGlmIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+IGFjY2VwdHMgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPGxpPgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNFUlJPUn0KLSAgKiBpZiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPiBkb2VzIG5vdCBhY2NlcHQgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYXkgYmUgYXZhaWxhYmxlIGZyb20gdGhlCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI2dldE1lc3NhZ2V9IGFuZAotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNnZXRFeGNlcHRpb259IG1ldGhvZHMuCi0gICogPC91bD4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gQW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzfQotICAqIGRlc2NyaWJpbmcgdGhlIDxjb2RlPkZpbHRlcjwvY29kZT4ncyBhc3Nlc3NtZW50IG9mCi0gICogdGhlIGdpdmVuIDxjb2RlPm9iamVjdDwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBJU3RhdHVzIHN0YXR1c09mICggT2JqZWN0IG9iamVjdCApOwotCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LiBUaGlzIG1ldGhvZAotICAqIG11c3QgcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYge0BsaW5rICNzdGF0dXNPZn0KLSAgKiByZXR1cm5zIGFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IHdpdGggYSBzZXZlcml0eSBvZgotICAqIGxlc3MgdGhhbiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPi4KLSAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gZmlsdGVyLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAgKiBhY2NlcHRzIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzICggT2JqZWN0IG9iamVjdCApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSVByb2plY3RUb1N0cmluZ1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9JUHJvamVjdFRvU3RyaW5nVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwNGMwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9JUHJvamVjdFRvU3RyaW5nVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotCi0vKioKLSAqIFRyYW5zZnJvbXMgYSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2plY3QgdG8gamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgSVByb2plY3RUb1N0cmluZ1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCQotCSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotCSAgewotCSAgCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpdmFsdWU7Ci0JICAgIHJldHVybiBwcm9qZWN0LmdldE5hbWUoKTsKLQkgIH0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KMkVFQWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTk4ZGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSA4LCAyMDA0Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLQotCi0vKioKLSAqIEBhdXRob3IgZ2lsYmVydGEKLSAqLwotcHVibGljIGNsYXNzIEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeSB7Ci0JCi0gCQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFNlcnZpY2VJbXBsIHNlcnZpY2VJbXBsKQotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBzZXJ2aWNlSW1wbC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gIAlTdHJpbmcgbG9jYXRpb24gPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0gIAkKLSAgCXJldHVybiBsb2NhdGlvbjsKLSAgfQotICAgCi0gIC8vaGFzIHRvIGJlIHVuZGVyIHRoZSB3ZWJjb250ZW50Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9DT05URU5UID0gIldlYkNvbnRlbnQiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFNlcnZpY2VSZWYgc2VydmljZUltcGwpCi0gIHsKLSAgCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc2VydmljZUltcGwpOwotICAJSVBhdGggcGF0aCA9IHByb2plY3QuZ2V0TG9jYXRpb24oKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAJcGF0aCA9IHBhdGguYXBwZW5kKFdFQl9DT05URU5UKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAJcGF0aCA9IHBhdGguYXBwZW5kKHNlcnZpY2VJbXBsLmdldFdzZGxGaWxlKCkpOwotICAJRmlsZSBmaWxlID0gbmV3IEZpbGUocGF0aC50b1N0cmluZygpKTsKLSAgCXRyeXsKLSAgCSAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgCSAgcmV0dXJuIHVybC50b1N0cmluZygpOwotICAJfWNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXtyZXR1cm4gbnVsbDt9Ci0gIAkKLSB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMVVJJKFdTRExSZXNvdXJjZUltcGwgd3NkbFJJKQotICB7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUkkuZ2V0RGVmaW5pdGlvbigpOwotICAJU3RyaW5nIGxvY2F0aW9uID0gZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpOwotICAJCi0gIAlyZXR1cm4gbG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTSUxQYXRoKFdTRExSZXNvdXJjZUltcGwgd3NkbFJJKQotICB7Ci0gIAlyZXR1cm4gY29udmVydFRvUmVsYXRpdmUoZ2V0V1NETFVSSSh3c2RsUkkpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NJTFBhdGgoU2VydmljZVJlZiBzZXJ2aWNlSW1wbCkKLSAgewotICAJcmV0dXJuIGNvbnZlcnRUb1JlbGF0aXZlKGdldFdTRExVUkkoc2VydmljZUltcGwpKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NJTFBhdGgoU2VydmljZUltcGwgc2VydmljZUltcGwpCi0gIHsKLSAgCXJldHVybiBjb252ZXJ0VG9SZWxhdGl2ZShnZXRXU0RMVVJJKHNlcnZpY2VJbXBsKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEU9ImZpbGU6LyI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTEVMPSJmaWxlOiI7IAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZWxhdGl2ZShTdHJpbmcgdXJpKQotICB7Ci0gIAkvL3JlbW92ZSBmaWxlOgotICAJU3RyaW5nIHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLSAgICByb290ID0gRklMRSArIHJvb3Q7Ci0gIAlTdHJpbmcgcm9vdEwgPSBGSUxFTCArIHJvb3Q7Ci0gICAgaWYodXJpLnN0YXJ0c1dpdGgocm9vdCkgfHwgdXJpLnN0YXJ0c1dpdGgocm9vdEwpKXsKLSAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKHJvb3QubGVuZ3RoKCkpOyAgCQotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9KMkVFVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWJjOTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0oyRUVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmNvbXBvbmVudGNvcmUudXRpbC5BcHBDbGllbnRBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5BZGRNb2R1bGVUb0VBUlByb2plY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUk5hdHVyZVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uSUVBUk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5FSkJOYXR1cmVSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSUVKQk5hdHVyZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5KMkVFV2ViTmF0dXJlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JRmxleGlibGVQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHNvbWUgdXNlZnVsIEoyRUUgdXRpbGl0aWVzIGZvciBXZWIgc2VydmljZXMgaW50ZXJuYWwgdXNlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSjJFRVV0aWxzIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBXRUIgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVKQiA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVBQQ0xJRU5UID0gNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFQVIgPSA4OwkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIElWaXJ0dWFsQ29tcG9uZW50Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gY29tcG9uZW50TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldFZpcnR1YWxDb21wb25lbnQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpewotCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0VmlydHVhbENvbXBvbmVudChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBjb21wb25lbnROYW1lKXsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChwcm9qZWN0TmFtZSE9bnVsbCAmJiBwcm9qZWN0TmFtZS5sZW5ndGgoKSA+IDAgKQotICAgICAgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQotCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEoyRUUgdmVyc2lvbiBpZCAoZGVmaW5lZCBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cykgb2YgdGhlCi0JICogcHJvamVjdC4gSWYgdGhlIHByb2plY3QgZG9lcyBub3QgaGF2ZSBhIEoyRUVOYXR1cmUsIC0xIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogQHJldHVybiB0aGUgSjJFRSB2ZXJzaW9uIGlkIChkZWZpbmVkIGluIEoyRUVWZXJzaW9uQ29uc3RhbnRzKSwgLTEgaWYgcAotCSAqICAgICAgICAgZG9lcyBub3QgaGF2ZSBhIEoyRUVOYXR1cmUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEoyRUVWZXJzaW9uKElQcm9qZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SjJFRVZlcnNpb24oSVByb2plY3QgcCkgewotCSAgCUoyRUVOYXR1cmUgbmF0dXJlID0gSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZShwKTsKLQkgIAlpZiAobmF0dXJlICE9IG51bGwpCi0JICAJewotCSAgCQlyZXR1cm4gbmF0dXJlLmdldEoyRUVWZXJzaW9uKCk7Ci0JICAJfQotCSAgCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKMkVFIHZlcnNpb24KLQkgKiBAcGFyYW0gcCBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbXBvbmVudCBuYW1lCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRKMkVFVmVyc2lvbihJUHJvamVjdCBwLCBTdHJpbmcgY29tcG9uZW50TmFtZSl7Ci0JCWludCBqMmVlVmVyID0gLTE7Ci0JCXRyeSB7Ci0gICAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwLCBjb21wb25lbnROYW1lKTsKLSAgICAgICAgICBpZiAodmMhPW51bGwpewotICAgICAgICAgICAgajJlZVZlciA9IGdldEoyRUVWZXJzaW9uKHZjKTsKLSAgICAgICAgICB9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0KLQkJcmV0dXJuIGoyZWVWZXI7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXRKMkVFVmVyc2lvbihJVmlydHVhbENvbXBvbmVudCBjaCl7Ci0gICAgICBpbnQgajJlZVZlciA9IC0xOwotICAgICAgLy9jaGVjayB0eXBlCi0gICAgICBpZiAoY2ghPW51bGwpIHsKLSAgICAgICAgaWYgKGlzV2ViQ29tcG9uZW50KGNoKSkKLSAgICAgICAgICBqMmVlVmVyID0gZ2V0V2ViQ29tcG9uZW50SjJFRVZlcnNpb24oY2gpOwotICAgICAgICBpZiAoaXNBcHBDbGllbnRDb21wb25lbnQoY2gpKQotICAgICAgICAgIGoyZWVWZXIgPSBnZXRBcHBDbGllbnRDb21wb25lbnRKMkVFVmVyc2lvbihjaCk7Ci0gICAgICAgIGlmIChpc0VKQkNvbXBvbmVudChjaCkpCi0gICAgICAgICAgajJlZVZlciA9IGdldEVKQkNvbXBvbmVudEoyRUVWZXJzaW9uKGNoKTsKLSAgICAgICAgaWYgKGlzRUFSQ29tcG9uZW50KGNoKSkKLSAgICAgICAgICBqMmVlVmVyID0gZ2V0RUFSQ29tcG9uZW50SjJFRVZlcnNpb24oY2gpOwotICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiBqMmVlVmVyOyAKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuJ3MgdGhlIEVBUiBtb2R1bGUncyBKMkVFVmVyc2lvbgotCSAqIEBwYXJhbSB3YmMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldEVBUkNvbXBvbmVudEoyRUVWZXJzaW9uKElWaXJ0dWFsQ29tcG9uZW50IGNoKXsKLQkJRUFSQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQlpbnQgblZlcnNpb24gPSAxMjsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZChjaCk7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJblZlcnNpb24gPSBlZGl0LmdldEoyRUVWZXJzaW9uKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gblZlcnNpb247CQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKMkVFVmVyc2lvbkFzU3RyaW5nKElQcm9qZWN0IHApewotCQlpbnQgajJlZVZlciA9IGdldEoyRUVWZXJzaW9uKHApOwotCQlpZiAoajJlZVZlciE9LTEpewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGoyZWVWZXIpOwotCQl9Ci0JCWVsc2UgCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSjJFRVZlcnNpb24KLQkgKiBAcGFyYW0gcCBJUHJvamVjdAotCSAqIEBwYXJhbSBjb21wTmFtZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb25Bc1N0cmluZyhJUHJvamVjdCBwLCBTdHJpbmcgY29tcE5hbWUpewotCQlpbnQgajJlZVZlciA9IGdldEoyRUVWZXJzaW9uKHAsIGNvbXBOYW1lKTsKLQkJaWYgKGoyZWVWZXIhPS0xKXsKLQkJCXJldHVybiBKMkVFVmVyc2lvblV0aWwuZ2V0SjJFRVRleHRWZXJzaW9uKGoyZWVWZXIpOwotCQl9Ci0JCWVsc2UgCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgV2ViIE1vZHVsZSdzIEoyRUUgdmVyc2lvbgotCSAqIEBwYXJhbSB3Yk1vZHVsZQotCSAqIEByZXR1cm4gdGhlIEoyRUUgdmVyc2lvbiBpZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRXZWJDb21wb25lbnRKMkVFVmVyc2lvbihJVmlydHVhbENvbXBvbmVudCBjaCkgewotCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0JCWludCBuVmVyc2lvbiA9IDEyOwotCQl0cnkgewotICAgICAgICAgIHdlYkVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChjaCk7Ci0gICAgICAgICAgaWYgKHdlYkVkaXQgIT0gbnVsbCkgewotCQkJblZlcnNpb24gPSB3ZWJFZGl0LmdldEoyRUVWZXJzaW9uKCk7Ci0gICAgICAgICAgfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIG5WZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgQXBwbGljYXRpb24gY2xpZW50J3MgSjJFRSB2ZXJzaW9uCi0JICogQHBhcmFtIHdiYwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0QXBwQ2xpZW50Q29tcG9uZW50SjJFRVZlcnNpb24oSVZpcnR1YWxDb21wb25lbnQgY2gpewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCWludCBuVmVyc2lvbiA9IDEyOwotCQl0cnkgewotICAgICAgZWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKGNoKTsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQluVmVyc2lvbiA9IGVkaXQuZ2V0SjJFRVZlcnNpb24oKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKQotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiBuVmVyc2lvbjsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIEVKQiBjb21wb25lbnQncyBKMkVFIHZlcnNpb24KLQkgKiBAcGFyYW0gd2JjCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRFSkJDb21wb25lbnRKMkVFVmVyc2lvbihJVmlydHVhbENvbXBvbmVudCBjaCl7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJaW50IG5WZXJzaW9uID0gMTI7Ci0JCXRyeSB7Ci0gICAgICBlZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoY2gpOwotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCW5WZXJzaW9uID0gZWRpdC5nZXRKMkVFVmVyc2lvbigpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpCi0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIG5WZXJzaW9uOwkJCQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFsbCBvZiB0aGUgRUFSIHByb2plY3RzIHRoYXQgcmVmZXJlbmNlIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9qZWN0LgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFQVJOYXR1cmVSdW50aW1lW10gZ2V0RUFSUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCkgewotCQkKLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwotCQlyZXR1cm4gZWFyczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldEFsbENvbXBvbmVudHMoKXsKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkgIElGbGV4aWJsZVByb2plY3QgZnAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZsZXhpYmxlUHJvamVjdChwcm9qZWN0c1tpXSk7Ci0gICAgICAgICAgSVZpcnR1YWxDb21wb25lbnRbXSB2Y3MgPSBmcC5nZXRDb21wb25lbnRzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaj0wO2o8dmNzLmxlbmd0aDtqKyspewotICAgICAgICAgICAgIHYuYWRkKHZjc1tqXSk7Ci0gICAgICAgICAgfQotCQl9Ci0KLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKXYudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgRUFSIGNvbXBvbmVudHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gSVZpcnR1YWxDb21wb25lbnRbXTsgZW1wdHkgaWYgbm9uZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRBbGxFQVJDb21wb25lbnRzKCkgewotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gY29tcG9uZW50cyA9IGdldEVBUkNvbXBvbmVudHNGcm9tUHJvamVjdChwcm9qZWN0c1tpXSk7Ci0JCQkJZm9yIChpbnQgaj0wOyBqPGNvbXBvbmVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKGNvbXBvbmVudHNbal0hPW51bGwpCi0JCQkJCQl2LmFkZChjb21wb25lbnRzW2pdKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJLy9oYW5kbGUgZXhjZXB0aW9uCi0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pdi50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRBbGxXZWJDb21wb25lbnRzKCl7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzID0gZ2V0V2ViQ29tcG9uZW50cyhwcm9qZWN0c1tpXSk7Ci0JCQkJZm9yIChpbnQgaj0wOyBqPGNvbXBvbmVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKGNvbXBvbmVudHNbal0hPW51bGwpCi0JCQkJCQl2LmFkZChjb21wb25lbnRzW2pdKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJLy9oYW5kbGUgZXhjZXB0aW9uCi0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pdi50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRUFSIGNvbXBvbmVudHMgaW4gYSBnaXZlbiBJUHJvamVjdAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBlbXB0eSBpZiBubyBFQVIgY29tcG9uZW50czsgbXVzdCBub3QgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0RUFSQ29tcG9uZW50c0Zyb21Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QpewotCQkvL2dldCBhbGwgY29tcG9uZW50cyBpbiB0aGUgcHJvamVjdAotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJdHJ5IHsKLQkJCUlGbGV4aWJsZVByb2plY3QgZmxleCA9IENvbXBvbmVudENvcmUuY3JlYXRlRmxleGlibGVQcm9qZWN0KHByb2plY3QpOwotCQkJSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzID0gZmxleC5nZXRDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBpPTA7aTxjb21wb25lbnRzLmxlbmd0aDtpKyspewotCQkJCWlmIChpc0VBUkNvbXBvbmVudChwcm9qZWN0LCBjb21wb25lbnRzW2ldLmdldE5hbWUoKSkpewotCQkJCQl2LmFkZChjb21wb25lbnRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pdi50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgV2ViIGNvbXBvbmVudHMgaW4gYSBwcm9qZWN0Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuIGVtcHR5IGFycmF5IGlmIG5vIHdlYiBjb21wb25lbnRzOyBtdXN0IG5vdCByZXR1cm4gbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRXZWJDb21wb25lbnRzKElQcm9qZWN0IHByb2plY3QpewotCQkKLQkJLy9nZXQgYWxsIGNvbXBvbmVudHMgaW4gdGhlIHByb2plY3QKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSUZsZXhpYmxlUHJvamVjdCBmbGV4ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGbGV4aWJsZVByb2plY3QocHJvamVjdCk7Ci0JCQlJVmlydHVhbENvbXBvbmVudFtdIGNvbXBvbmVudHMgPSBmbGV4LmdldENvbXBvbmVudHMoKTsKLQkJCWZvciAoaW50IGk9MDtpPGNvbXBvbmVudHMubGVuZ3RoO2krKyl7Ci0JCQkJaWYgKGlzV2ViQ29tcG9uZW50KHByb2plY3QsIGNvbXBvbmVudHNbaV0uZ2V0TmFtZSgpKSl7Ci0JCQkJCXYuYWRkKGNvbXBvbmVudHNbaV0pOwotCQkJCX0KLQkJCX0JCQkKLQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkvL2hhbmRsZSBleGNlcHRpb24KLQkJfQotCQkKLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKXYudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwotCX0gCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRXZWJDb21wb25lbnROYW1lcyhJUHJvamVjdCBwcm9qZWN0KXsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSB2Y3MgPSBnZXRXZWJDb21wb25lbnRzKHByb2plY3QpOwotCQlyZXR1cm4gdG9Db21wb25lbnROYW1lc0FycmF5KHZjcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RUFSQ29tcG9uZW50TmFtZXMoSVByb2plY3QgcHJvamVjdCl7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50W10gdmNzID0gZ2V0RUFSQ29tcG9uZW50c0Zyb21Qcm9qZWN0KHByb2plY3QpOwotCQlyZXR1cm4gdG9Db21wb25lbnROYW1lc0FycmF5KHZjcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGNvbXBvbmVudHMgb2YgdHlwZSwgY29tcG9uZW50VHlwZSBpbiB0aGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBjb21wb25lbnRUeXBlIGkuZS4gSjJFRVV0aWxzLldFQgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0Q29tcG9uZW50c0J5VHlwZShJUHJvamVjdCBwcm9qZWN0LCBpbnQgY29tcG9uZW50VHlwZSl7Ci0JCQotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICggKFdFQiAmIGNvbXBvbmVudFR5cGUpPT1XRUIgKXsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gd2ViVkMgPSBnZXRXZWJDb21wb25lbnRzKHByb2plY3QpOwotCQkJYWRkVG9BcnJheUxpc3RIZWxwZXIod2ViVkMsIHYpOwotCQl9Ci0JCWlmICggKEVKQiAmIGNvbXBvbmVudFR5cGUpPT1FSkIgKXsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gZWpiVkMgPSBnZXRFSkJDb21wb25lbnRzKHByb2plY3QpOwotCQkJYWRkVG9BcnJheUxpc3RIZWxwZXIoZWpiVkMsIHYpOwotCQl9Ci0JCWlmICggKEFQUENMSUVOVCAmIGNvbXBvbmVudFR5cGUpPT1BUFBDTElFTlQgKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudFtdIGFwcENsaWVudFZDID0gZ2V0QXBwQ2xpZW50Q29tcG9uZW50cyhwcm9qZWN0KTsKLQkJCWFkZFRvQXJyYXlMaXN0SGVscGVyKGFwcENsaWVudFZDLCB2KTsKLQkJfQotCQlpZiAoIChFQVIgJiBjb21wb25lbnRUeXBlKT09RUFSICkgewotCQkJSVZpcnR1YWxDb21wb25lbnRbXSBlYXJWQyA9IGdldEVBUkNvbXBvbmVudHNGcm9tUHJvamVjdChwcm9qZWN0KTsKLQkJCWFkZFRvQXJyYXlMaXN0SGVscGVyKGVhclZDLCB2KTsKLQkJfQotCQkKLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKXYudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwkJCi0JfQotCQotCS8qKgotCSAqIEhlbHBlciBtZXRob2QgZm9yIGdldENvbXBvbmVudHNCeVR5cGUKLQkgKiBAcGFyYW0gdmNzCi0JICogQHBhcmFtIHZlY3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvQXJyYXlMaXN0SGVscGVyKElWaXJ0dWFsQ29tcG9uZW50W10gdmNzLCBMaXN0IGFsKXsKLQkJZm9yIChpbnQgaT0wO2k8dmNzLmxlbmd0aDtpKyspewotCQkJYWwuYWRkKHZjc1tpXSk7Ci0JCX0JCQotCX0KLQotCQotCS8qKgotCSAqIEVzc2VudGlhbGx5LCByZXR1cm5zIGFsbCBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRBbGxGbGV4aWJsZVByb2plY3RzKCl7Ci0KLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHMoKTsKLQkJCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDtpKyspIHsKLQkJCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3RzW2ldKSE9bnVsbCl7Ci0JCQkJCXYuYWRkKHByb2plY3RzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpewotCQl9Ci0KLQkJcmV0dXJuIChJUHJvamVjdFtdKXYudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCX0KLQkKLQkKLQkvKioKLQkgKiBUcnVlIGlmIHRoZXJlIGV4aXN0cyBhIHVuZGVybHlpbmcgcmVzb3VyY2UgYmFja2luZyB1cCB0aGUgY29tcG9uZW50IGFuZCBwcm9qZWN0IAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGlzdHMoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZSl7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAocHJvamVjdE5hbWUhPW51bGwgJiYgcHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwICkKLQkJICBwcm9qZWN0ID0gRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQllbHNlIAotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIGV4aXN0cyhwcm9qZWN0LCBjb21wb25lbnROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVHJ1ZSBpZiB0aGVyZSBleGlzdHMgYSB1bmRlcmx5aW5nIHJlc291cmNlIGJhY2tpbmcgdXAgdGhlIGNvbXBvbmVudCBhbmQgcHJvamVjdAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbXBvbmVudE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGV4aXN0cyhJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSl7Ci0JCWlmIChwcm9qZWN0IT1udWxsICYmIAotCQkJCWNvbXBvbmVudE5hbWUhPW51bGwgJiYgCi0JCQkJY29tcG9uZW50TmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JCQlyZXR1cm4gdmMuZXhpc3RzKCk7Ci0JCX0KLQkJZWxzZSAKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBkZXByZWNhdGVkICAtLSAgdXNlIGdldEVBUkNvbXBvbmVudE5hbWVzKElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RUFSUHJvamVjdE5hbWVzRm9yV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgRUFSTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gZ2V0RUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlFQVJOYW1lcy5hZGQoZWFyc1tpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRUFSTmFtZXMuaXNFbXB0eSgpID8gbnVsbCA6IChTdHJpbmdbXSkgRUFSTmFtZXMKLQkJCQkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIEVBUiBjb21wb25lbnRzIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBjb21wb25lbnQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRSZWZlcmVuY2luZ0VBUkNvbXBvbmVudHMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpewotCQlMaXN0IGVhcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeXsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHRhcmdldFZDID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JCQkKLQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gZWFyVkMgPSBnZXRBbGxFQVJDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8ZWFyVkMubGVuZ3RoO2krKykgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGVhclZDW2ldLmdldFJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBrPTA7azxyZWZzLmxlbmd0aDtrKyspIHsKLQkJCQkJaWYgKHRhcmdldFZDLmVxdWFscyhyZWZzW2tdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSkpewotCQkJCQkJZWFycy5hZGQocmVmc1trXS5nZXRFbmNsb3NpbmdDb21wb25lbnQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQl9Ci0KLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKWVhcnMudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwotCX0KLQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFsbCBvZiB0aGUgRUFSIHByb2plY3RzIHRoYXQgcmVmZXJlbmNlIHRoZSBzcGVjaWZpZWQKLQkgKiBlamIgcHJvamVjdC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAgLSB1c2UgZ2V0RUFSUHJvamVjdHMoSVByb2plY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBFQVJOYXR1cmVSdW50aW1lW10gZ2V0RUpCRUFSUHJvamVjdHMoSVByb2plY3QgcHJvamVjdCkgewotCQlFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCXJldHVybiBlYXJzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRFQVJQcm9qZWN0TmFtZXMgKG5vdCB1c2VkOyB0byBiZSBkZWxldGVkKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RUFSUHJvamVjdE5hbWVzRm9yRUpCUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgRUFSTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gZ2V0RUpCRUFSUHJvamVjdHMocHJvamVjdCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlFQVJOYW1lcy5hZGQoZWFyc1tpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRUFSTmFtZXMuaXNFbXB0eSgpID8gbnVsbCA6IChTdHJpbmdbXSkgRUFSTmFtZXMKLQkJCQkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBub3QgdXNlZDsgdG8gYmUgZGVsZXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUFSTmF0dXJlUnVudGltZVtdIGdldEFwcENsaWVudEVBUlByb2plY3RzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhcnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwotCQlyZXR1cm4gZWFyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFQVIgbmF0dXJlIHJ1bnRpbWUgZnJvbSBhbiBFQVIgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBJUHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIEVBUiBwcm9qZWN0Ci0JICogQHJldHVybiBFQVJOYXR1cmVSdW50aW1lIG9mIHRoZSBwcm9qZWN0Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgbm90IHVzZWQ7IHRvIGJlIGRlbGV0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWUgZ2V0RUFSTmF0dXJlUnVudGltZUZyb21Qcm9qZWN0KAotCQkJSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIEVBUiBuYW1lcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCB3ZWIgcHJvamVjdC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBub3QgdXNlZDsgdG8gYmUgZGVsZXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RUFSTmFtZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlFQVJOYXR1cmVSdW50aW1lW10gZWFycyA9IGdldEVBUlByb2plY3RzKHByb2plY3QpOwotCQlTdHJpbmdbXSBlYXJOYW1lcyA9IG5ldyBTdHJpbmdbZWFycyA9PSBudWxsID8gMCA6IGVhcnMubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWFyTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQllYXJOYW1lc1tpbmRleF0gPSBlYXJzW2luZGV4XS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGVhck5hbWVzOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYWxsIEVKQiBwcm9qZWN0cyBmb3IgYSBwYXJ0aWN1bGFyIEVBUiBOYXR1cmUuCi0JICogCi0JICogQHJldHVybiBhIFZlY3RvciBvZiBFSkJOYXR1cmVSdW50aW1lcy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UmVmZXJlbmNpbmdFSkJDb21wb25lbnRzKElQcm9qZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0RUpCUHJvamVjdHMoRUFSTmF0dXJlUnVudGltZSBlYXIpIHsKLQkJVmVjdG9yIGVqYnMgPSBuZXcgVmVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGVhclByb2plY3RzID0gZWFyLmdldE1vZHVsZVByb2plY3RzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoZWFyUHJvamVjdHMuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZWFyUHJvamVjdHMubmV4dCgpOwotCi0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlKMkVFTmF0dXJlIGoyZWVOYXR1cmUgPSAoSjJFRU5hdHVyZSkgb2JqZWN0OwotCi0JCQkJaWYgKGoyZWVOYXR1cmUgaW5zdGFuY2VvZiBFSkJOYXR1cmVSdW50aW1lKSB7Ci0JCQkJCWVqYnMuYWRkKGoyZWVOYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlamJzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFSkIgQ29tcG9uZW50cyByZWZlcmVuY2VkIGJ5IHRoZSBlYXIKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRSZWZlcmVuY2luZ0VKQkNvbXBvbmVudHNGcm9tRUFSKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBlYXJDb21wb25lbnROYW1lKXsKLQotCQlMaXN0IGVqYkNvbXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnl7Ci0JCQlJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGVhckNvbXBvbmVudE5hbWUpOwotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gdmMuZ2V0UmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaT0wO2k8cmVmcy5sZW5ndGg7aSsrKXsKLQkJCQlpZiAoaXNFSkJDb21wb25lbnQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKXsKLQkJCQkJZWpiQ29tcHMuYWRkKHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpewotCQl9Ci0JCQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pZWpiQ29tcHMudG9BcnJheShuZXcgSVZpcnR1YWxDb21wb25lbnRbMF0pOwkJCi0JfQotCi0JLyoqCi0JICogRmluZCBhbGwgV2ViIHByb2plY3RzIGZvciBhIHBhcnRpY3VsYXIgRUFSIE5hdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmVjdG9yIG9mIEoyRUVXZWJOYXR1cmVSdW50aW1lcy4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0V2ViUHJvamVjdHNGcm9tRUFSKElQcm9qZWN0LCBTdHJpbmcpCi0JICogCQkJISEgbm90IHVzZWQ7IHRvIGJlIGRlbGV0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRXZWJQcm9qZWN0cyhFQVJOYXR1cmVSdW50aW1lIGVhcikgewotCQlWZWN0b3Igd2ViUHJvamVjdHMgPSBuZXcgVmVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGVhclByb2plY3RzID0gZWFyLmdldE1vZHVsZVByb2plY3RzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoZWFyUHJvamVjdHMuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZWFyUHJvamVjdHMubmV4dCgpOwotCi0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlKMkVFTmF0dXJlIGoyZWVOYXR1cmUgPSAoSjJFRU5hdHVyZSkgb2JqZWN0OwotCi0JCQkJaWYgKGoyZWVOYXR1cmUgaW5zdGFuY2VvZiBKMkVFV2ViTmF0dXJlUnVudGltZSkgewotCQkJCQl3ZWJQcm9qZWN0cy5hZGQoajJlZU5hdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHdlYlByb2plY3RzOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiByZXR1cm5zIGEgbGlzdCBvZiBwcm9qZWN0cyBuYW1lcyBmb3IgYSBnaXZlbiBlYXIuCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEVKQlByb2plY3RGcm9tRUFSKElQcm9qZWN0LCBTdHJpbmcpCi0JICogCSEhIG5vdCB1c2VkOyB0byBiZSBkZWxldGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFSkJQcm9qZWN0TmFtZXMoRUFSTmF0dXJlUnVudGltZSBlYXIpIHsKLQkJVmVjdG9yIGVqYk5hdHVyZXMgPSBnZXRFSkJQcm9qZWN0cyhlYXIpOwotCQlTdHJpbmdbXSBlamJQcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW2VqYk5hdHVyZXMuc2l6ZSgpXTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZWpiUHJvamVjdE5hbWVzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJZWpiUHJvamVjdE5hbWVzW2luZGV4XSA9ICgoRUpCTmF0dXJlUnVudGltZSkgKGVqYk5hdHVyZXMKLQkJCQkJLmVsZW1lbnRBdChpbmRleCkpKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGVqYlByb2plY3ROYW1lczsKLQl9Ci0KLQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBqYXIKLQkgKiBAcmV0dXJuICBWZWN0b3Igb2YgYmVhbiBTdHJpbmcgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0QmVhbk5hbWVzKEVKQkphciBqYXIpIHsKLQkJLy8gV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBTdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFucy4KLQkJLy8gTGlzdCBjbXBCZWFucyA9IGphci5nZXRCZWFuTWFuYWdlZEJlYW5zKCk7Ci0JCS8vIExpc3QgYm1wQmVhbnMgPSBqYXIuZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0JCUxpc3Qgc2Vzc2lvbkJlYW5zID0gamFyLmdldFNlc3Npb25CZWFucygpOwotCi0JCVZlY3RvciBuYW1lcyA9IG5ldyBWZWN0b3IoKTsKLQotCQkvLyBnZXRCZWFuTmFtZXMoIG5hbWVzLCBjbXBCZWFucyApOwotCQkvLyBnZXRCZWFuTmFtZXMoIG5hbWVzLCBibXBCZWFucyApOwotCQlnZXRCZWFuTmFtZXMobmFtZXMsIHNlc3Npb25CZWFucyk7Ci0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgdmVjdG9yIG9mIHN0cmluZ3MgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWRkIGJlYW4KLQkgKiAgICAgICAgICAgIG5hbWVzIHRvLgotCSAqIEBwYXJhbSBiZWFucwotCSAqICAgICAgICAgICAgc3BlY2lmaWVzIGEgbGlzdCBvZiBiZWFucy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEJlYW5OYW1lcyhWZWN0b3IgbmFtZXMsIExpc3QgYmVhbnMpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBiZWFucy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIChpdGVyYXRvci5uZXh0KCkpOwotCi0JCQlpZiAoYmVhbi5pc1Nlc3Npb24oKSkgewotCQkJCVNlc3Npb24gc2Vzc2lvbkJlYW4gPSAoU2Vzc2lvbikgYmVhbjsKLQotCQkJCWlmIChzZXNzaW9uQmVhbi5nZXRTZXNzaW9uVHlwZSgpLmdldFZhbHVlKCkgPT0gU2Vzc2lvblR5cGUuU1RBVEVMRVNTKSB7Ci0JCQkJCW5hbWVzLmFkZChiZWFuLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlcyBqZW0gUHJvamVjdFV0aWxpdGllcyB0byBnZXQgdGhlIHByb2plY3QKLQkgKiBAcGFyYW0gZWpiIGVPYmplY3QKLQkgKiBAcmV0dXJuIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUVKQihFbnRlcnByaXNlQmVhbiBlamIpIHsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlamIpOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhcnJheSBvZiBJUHJvamVjdCwgZ2l2ZW4gYSBWZWN0b3Igb2YgSjJFRU5hdHVyZSdzCi0JICogCi0JICogQGRlcHJlY2F0ZWQgcGxzIHJlcXVlc3QgYSBuZXcgbWV0aG9kIGlmIG5lY2Vzc2FyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRJUHJvamVjdHNGcm9tSjJFRU5hdHVyZXMoVmVjdG9yIGoyZWVuYXR1cmVWZWN0b3IpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtqMmVlbmF0dXJlVmVjdG9yID09IG51bGwKLQkJCQk/IDAKLQkJCQk6IGoyZWVuYXR1cmVWZWN0b3Iuc2l6ZSgpXTsKLQkJRW51bWVyYXRpb24gZSA9IGoyZWVuYXR1cmVWZWN0b3IuZWxlbWVudHMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgZS5uZXh0RWxlbWVudCgpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG5hdHVyZS5nZXRQcm9qZWN0KCk7Ci0JCQlwcm9qZWN0c1tpXSA9IHByb2plY3Q7Ci0JCQlpKys7Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdHM7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIEoyRUUgMS4yIEVBUiBQcm9qZWN0LiBSZXR1cm5zIG51bGwgaWYgbm8gSjJFRSAxLjIgRUFSIFByb2plY3RzCi0JICogZXhpc3QKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAgdXNlIGdldERlZmF1bHQxMkVBUlByb2plY3QoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUFSTmF0dXJlUnVudGltZSBnZXQxMkVBUigpIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0W10gYWxsRUFScyA9IGdldEVBUlByb2plY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEVBUnMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyByZXR1cm4gdGhlIGZpcnN0IDEuMiBFQVIgZW5jb3VudGVyZWQKLQkJCQlFQVJOYXR1cmVSdW50aW1lIHRoaXNFQVIgPSAoRUFSTmF0dXJlUnVudGltZSkgKGFsbEVBUnNbaV0KLQkJCQkJCS5nZXROYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKTsKLQkJCQlpZiAodGhpc0VBUi5nZXRKMkVFVmVyc2lvbigpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSB7Ci0JCQkJCXJldHVybiB0aGlzRUFSOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCQotCS8qKgotCSAqICBSZXR1cm5zIHRoZSBmaXJzdCBqMmVlIDEuMiBFQVIgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBudWxsIGlmIG5vIDEuMiBFQVIgcHJvamVjdHMKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtICBpZiBub3QgdXNlZDsgdG8gYmUgZGVsZXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0RGVmYXVsdDEyRUFSUHJvamVjdCgpewotCQl0cnl7Ci0JCQlJUHJvamVjdFtdIGFsbEVBUnMgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0cygpOyAvLyBnZXRFQVJQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaT0wO2k8YWxsRUFScy5sZW5ndGg7aSsrKXsKLQkJCQkvLyByZXR1cm4gdGhlIGZpcnN0IDEuMiBFQVIgcHJvamVjdAotCQkJCUlQcm9qZWN0IGVhciA9IGFsbEVBUnNbaV07Ci0JCQkJaWYgKGdldEoyRUVWZXJzaW9uQXNTdHJpbmcoZWFyKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KMkVFX1ZFUlNJT05fMV8yKSl7Ci0JCQkJCXJldHVybiBlYXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvL2hhbmRsZSBleGNlcHRpb24KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCQotCS8qKgotCSAqIEdldCBhIEoyRUUgMS4zIEVBUiBQcm9qZWN0LiBSZXR1cm5zIG51bGwgaWYgbm8gSjJFRSAxLjMgRUFSIFByb2plY3RzCi0JICogZXhpc3QKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RGVmYXVsdDEzRUFSQ29tcG9uZW50KCkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWUgZ2V0MTNFQVIoKSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGFsbEVBUnMgPSBnZXRFQVJQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFQVJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSBmaXJzdCAxLjMgRUFSIGVuY291bnRlcmVkCi0JCQkJRUFSTmF0dXJlUnVudGltZSB0aGlzRUFSID0gKEVBUk5hdHVyZVJ1bnRpbWUpIChhbGxFQVJzW2ldCi0JCQkJCQkuZ2V0TmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSk7Ci0JCQkJaWYgKHRoaXNFQVIuZ2V0SjJFRVZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgewotCQkJCQlyZXR1cm4gdGhpc0VBUjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgSjJFRSAxLjMgRUFSIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBFQVIgY29tcG9uZW50IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldERlZmF1bHQxM0VBUkNvbXBvbmVudCgpewotCQlJVmlydHVhbENvbXBvbmVudFtdIGFsbEVBUkNvbXBvbmVudHMgPSBnZXRBbGxFQVJDb21wb25lbnRzKCk7Ci0JCWZvciAoaW50IGo9MDtqPGFsbEVBUkNvbXBvbmVudHMubGVuZ3RoO2orKyl7Ci0JCQlpbnQgajJlZVZlcnNpb24gPSBnZXRKMkVFVmVyc2lvbihhbGxFQVJDb21wb25lbnRzW2pdKTsKLQkJCWlmIChqMmVlVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkKLQkJCQkgcmV0dXJuIGFsbEVBUkNvbXBvbmVudHNbal07Ci0JCSB9CQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGRlZmF1bHQgSjJFRSAxLjQgRUFSIGNvbXBvbmVudCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBFQVIgY29tcG9uZW50IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldERlZmF1bHQxNEVBUkNvbXBvbmVudCgpewotCQlJVmlydHVhbENvbXBvbmVudFtdIGFsbEVBUkNvbXBvbmVudHMgPSBnZXRBbGxFQVJDb21wb25lbnRzKCk7Ci0JCWZvciAoaW50IGo9MDtqPGFsbEVBUkNvbXBvbmVudHMubGVuZ3RoO2orKyl7Ci0JCQlpbnQgajJlZVZlcnNpb24gPSBnZXRKMkVFVmVyc2lvbihhbGxFQVJDb21wb25lbnRzW2pdKTsKLQkJCWlmIChqMmVlVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCQkgcmV0dXJuIGFsbEVBUkNvbXBvbmVudHNbal07Ci0JCSB9CQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB2ZXJzaW9uSWQKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEVBUlByb2plY3RPZlZlcnNpb24oaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUFSTmF0dXJlUnVudGltZSBnZXRFQVIoaW50IHZlcnNpb25JZCkgewotCQl0cnkgewotCQkJSVByb2plY3RbXSBhbGxFQVJzID0gZ2V0RUFSUHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRUFScy5sZW5ndGg7IGkrKykgewotCQkJCUVBUk5hdHVyZVJ1bnRpbWUgdGhpc0VBUiA9IChFQVJOYXR1cmVSdW50aW1lKSAoYWxsRUFSc1tpXQotCQkJCQkJLmdldE5hdHVyZShJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCkpOwotCQkJCWlmICh0aGlzRUFSLmdldEoyRUVWZXJzaW9uKCkgPT0gdmVyc2lvbklkKSB7Ci0JCQkJCXJldHVybiB0aGlzRUFSOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBFQVIgY29tcG9uZW50IG9mIHRoZSBKMkVFIHZlcnNpb24KLQkgKiBAcGFyYW0gdmVyc2lvbklkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0RUFSQ29tcG9uZW50b2ZKMkVFVmVyc2lvbihpbnQgdmVyc2lvbklkKXsKLQkJSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzID0gZ2V0QWxsRUFSQ29tcG9uZW50cygpOwotCQlmb3IgKGludCBpPTA7IGk8Y29tcG9uZW50cy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoZ2V0SjJFRVZlcnNpb24oY29tcG9uZW50c1tpXSkgPT0gdmVyc2lvbklkKQotCQkJCXJldHVybiBjb21wb25lbnRzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBFQVIgcHJvamVjdCBvZiBhIGdpdmVuIHZlcnNpb24gaWQKLQkgKiBAcGFyYW0gdmVyc2lvbklkCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIC8vIHVzZSBnZXRFQVJDb21wb25lbnRvZkoyRUVWZXJzaW9uCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldEVBUlByb2plY3RPZlZlcnNpb24oaW50IHZlcnNpb25JZCl7Ci0vLwkJdHJ5IHsKLS8vCQkJSVByb2plY3RbXSBhbGxFQVJzID0gZ2V0RUFSUHJvamVjdHMoKTsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFQVJzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQlJUHJvamVjdCBlYXIgPSBhbGxFQVJzW2ldOwotLy8JCQkJaWYgKGdldEoyRUVWZXJzaW9uKGVhcikgPT0gdmVyc2lvbklkKSB7Ci0vLwkJCQkJcmV0dXJuIGVhcjsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwkJCi0vLwl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBqMmVlVmVyc2lvbkludAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbEZyb21KMkVFVmVyc2lvbihTdHJpbmcgajJlZVZlcnNpb25JbnQpIHsKLQkJaWYgKGoyZWVWZXJzaW9uSW50ID09IG51bGwgfHwgajJlZVZlcnNpb25JbnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsKLQotCQlpbnQgajJlZVZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KGoyZWVWZXJzaW9uSW50KTsKLQkJc3dpdGNoIChqMmVlVmVyc2lvbikgewotCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCA6Ci0JCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yX1RFWFQ7Ci0JCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEIDoKLQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVDsKLQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQgOgotCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuICIiOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SjJFRVZlcnNpb25Gcm9tTGFiZWwoU3RyaW5nIGoyZWVMYWJlbCkgewotCQlTdHJpbmcgajJlZTEyU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlTdHJpbmcgajJlZTEzU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlTdHJpbmcgajJlZTE0U3RyaW5nID0gU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlpZiAoajJlZUxhYmVsLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUKSkKLQkJCXJldHVybiBqMmVlMTJTdHJpbmc7Ci0KLQkJaWYgKGoyZWVMYWJlbC5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpCi0JCQlyZXR1cm4gajJlZTEzU3RyaW5nOwotCi0JCWlmIChqMmVlTGFiZWwuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80X1RFWFQpKQotCQkJcmV0dXJuIGoyZWUxNFN0cmluZzsKLQotCQlyZXR1cm4gIiI7Ci0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBTdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIEoyRUUgdmVyc2lvbnMKLQkgKiBAcGFyYW0gYVZlcnNpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SjJFRUludFZlcnNpb25Bc1N0cmluZyhTdHJpbmcgYVZlcnNpb24pIHsKLQkJaWYgKGFWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUKSkKLQkJCXJldHVybiBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkudG9TdHJpbmcoKTsKLQkJaWYgKGFWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfM19URVhUKSkKLQkJCXJldHVybiBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkudG9TdHJpbmcoKTsKLQkJaWYgKGFWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkKLQkJCXJldHVybiBuZXcgSW50ZWdlcihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkudG9TdHJpbmcoKTsKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gbmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpLnRvU3RyaW5nKCk7Ci0JfQkKLQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGVhciBwcm9qZWN0cyBpbiB3aGljaCB0aGlzIHByb2plY3QgaXMgYSBuZXN0ZWQgbW9kdWxlOwotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdAotCSAqIEByZXR1cm4gRUFScyBFQVIgcHJvamVjdHMsIHBvc3NpYmx5IG51bGwKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqICAgVGhpcyBtZXRob2QgaGFzIHRvbyBtdWNoIGNvbXBsZXhpdHk7IHRvIGJlIHNpbXBsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBUk5hdHVyZVJ1bnRpbWVbXSBnZXRFQVJQcm9qZWN0cyhJUHJvamVjdCBzZXJ2aWNlUHJvamVjdCwKLQkJCUlTZXJ2ZXIgc2VydmVyKSB7Ci0KLQkKLQkJRUFSTmF0dXJlUnVudGltZVtdIGVhclByb2plY3RzID0gbnVsbDsKLQkJRUFSTmF0dXJlUnVudGltZSBlYXIgPSBudWxsOwotCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAoc2VydmljZVByb2plY3QgIT0gbnVsbCAmJiBzZXJ2aWNlUHJvamVjdC5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQotCQkJCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gbnVsbDsKLQkJCQlib29sZWFuIGlzV2ViRUpCT3JBcHBDbGllbnQgPSBSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSVdlYk5hdHVyZUNvbnN0YW50cy5KMkVFX05BVFVSRV9JRCkKLQkJCQkJCXx8ICBSZXNvdXJjZVV0aWxzLmlzRUpCUHJvamVjdChzZXJ2aWNlUHJvamVjdCkgLy9zZXJ2aWNlUHJvamVjdC5oYXNOYXR1cmUoSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpCi0JCQkJCQl8fCAgUmVzb3VyY2VVdGlscy5pc0FwcENsaWVudFByb2plY3Qoc2VydmljZVByb2plY3QpOy8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElBcHBsaWNhdGlvbkNsaWVudE5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpOwotCQkJCWlmICghaXNXZWJFSkJPckFwcENsaWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQllYXJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhzZXJ2aWNlUHJvamVjdCk7Ci0KLQkJCQkvLyBzZXBhcmF0ZSBFQVJzIHdoaWNoIGFyZSBhbHJlYWR5IGRlcGxveWVkIHRvIHRoZSBleGlzdGluZwotCQkJCS8vIHNlcnZlcgotCQkJCWlmIChlYXJzICE9IG51bGwgJiYgZWFycy5sZW5ndGggPj0gMSkgewotCQkJCQlBcnJheUxpc3QgcHJlZmVycmVkRUFSTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJQXJyYXlMaXN0IHNlY29uZGFyeUVBUkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFycy5sZW5ndGg7IGkrKykgewotCQkJCQkJZWFyID0gZWFyc1tpXTsKLQkJCQkJCWVhclByb2plY3QgPSBlYXIuZ2V0UHJvamVjdCgpOwotCQkJCQkJSU1vZHVsZSBtb2R1bGUgPSBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXJQcm9qZWN0KTsKLQkJCQkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJCQkJCWlmIChzZXJ2ZXIgIT0gbnVsbAotCQkJCQkJCQkJfHwgU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzZXJ2ZXIsCi0JCQkJCQkJCQkJCW1vZHVsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkpIHsKLQkJCQkJCQkJcHJlZmVycmVkRUFSTGlzdC5hZGQoZWFyKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzZWNvbmRhcnlFQVJMaXN0LmFkZChlYXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBhZGQgc2Vjb25kYXJ5RUFSTGlzdCBpdGVtcyB0byBlbmQgb2YgcHJpbWFyeSBsaXN0Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2Vjb25kYXJ5RUFSTGlzdC5zaXplKCk7IGorKykgewotCQkJCQkJcHJlZmVycmVkRUFSTGlzdC5hZGQoc2Vjb25kYXJ5RUFSTGlzdC5nZXQoaikpOwotCQkJCQl9Ci0JCQkJCS8vIHRvQXJyYXkKLQkJCQkJaWYgKHByZWZlcnJlZEVBUkxpc3QgIT0gbnVsbCkgewotCQkJCQkJZWFyUHJvamVjdHMgPSAoRUFSTmF0dXJlUnVudGltZVtdKSBwcmVmZXJyZWRFQVJMaXN0Ci0JCQkJCQkJCS50b0FycmF5KG5ldyBFQVJOYXR1cmVSdW50aW1lWzBdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjZSkgewotCQkJCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQkJCWxvZy5sb2coTG9nLkVSUk9SLCA1MDM5LCBKMkVFVXRpbHMuY2xhc3MsICJnZXRFQVJQcm9qZWN0cyIsIGNlKTsKLQotCQkJfQotCQl9Ci0JCXJldHVybiBlYXJQcm9qZWN0czsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgIC8vIHVzZSBnZXRBTExFQVJDb21wb25lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEVBUlByb2plY3RzKCkgewotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0vLwkJCQlpZiAocHJvamVjdHNbaV0uaGFzTmF0dXJlKElFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKSkgewotCQkJCWlmIChSZXNvdXJjZVV0aWxzLmlzRUFSUHJvamVjdChwcm9qZWN0c1tpXSkpIHsKLQkJCQkJdi5hZGQocHJvamVjdHNbaV0pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkvL2hhbmRsZSBleGNlcHRpb24KLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIChJUHJvamVjdFtdKXYudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBFQVIgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QgYW5kIHNlcnZlcgotCSAqIEBwYXJhbSBzZXJ2aWNlUHJvamVjdAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgIC8vIHRvIGJlIHNpbXBsaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldERlZmF1bHRFQVJQcm9qZWN0KElQcm9qZWN0IHNlcnZpY2VQcm9qZWN0LCBJU2VydmVyIHNlcnZlcikgewotCi0JCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBudWxsOwotCQlJUHJvamVjdCBlYXIgPSBudWxsOwotCi0JCWlmIChzZXJ2aWNlUHJvamVjdCAhPSBudWxsICYmIHNlcnZpY2VQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCi0JCQkJYm9vbGVhbiBpc1dlYkVKQk9yQXBwQ2xpZW50ID0gUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3Qoc2VydmljZVByb2plY3QpIC8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpCi0JCQkJCQl8fCAgUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3Qoc2VydmljZVByb2plY3QpIC8vc2VydmljZVByb2plY3QuaGFzTmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKQotCQkJCQkJfHwgIFJlc291cmNlVXRpbHMuaXNBcHBDbGllbnRQcm9qZWN0KHNlcnZpY2VQcm9qZWN0KTsvL3NlcnZpY2VQcm9qZWN0Lmhhc05hdHVyZShJQXBwbGljYXRpb25DbGllbnROYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKTsKLQkJCQlpZiAoIWlzV2ViRUpCT3JBcHBDbGllbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJSVByb2plY3RbXSBlYXJzID0gZ2V0RUFSUHJvamVjdHMoKTsKLQotCQkJCS8vIHNlcGFyYXRlIEVBUnMgd2hpY2ggYXJlIGFscmVhZHkgZGVwbG95ZWQgdG8gdGhlIGV4aXN0aW5nCi0JCQkJLy8gc2VydmVyCi0JCQkJaWYgKGVhcnMgIT0gbnVsbCAmJiBlYXJzLmxlbmd0aCA+PSAxKSB7Ci0JCQkJCUFycmF5TGlzdCBwcmVmZXJyZWRFQVJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlBcnJheUxpc3Qgc2Vjb25kYXJ5RUFSTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQllYXIgPSBlYXJzW2ldOwotCQkJCQkJSU1vZHVsZSBtb2R1bGUgPSBSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShlYXIpOwotCQkJCQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHNlcnZlciAhPSBudWxsCi0JCQkJCQkJCQl8fCBTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHNlcnZlciwKLQkJCQkJCQkJCQkJbW9kdWxlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKSkgewotCQkJCQkJCQlwcmVmZXJyZWRFQVJMaXN0LmFkZChlYXIpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNlY29uZGFyeUVBUkxpc3QuYWRkKGVhcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIGFkZCBzZWNvbmRhcnlFQVJMaXN0IGl0ZW1zIHRvIGVuZCBvZiBwcmltYXJ5IGxpc3QKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWNvbmRhcnlFQVJMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCQlwcmVmZXJyZWRFQVJMaXN0LmFkZChzZWNvbmRhcnlFQVJMaXN0LmdldChqKSk7Ci0JCQkJCX0KLQkJCQkJLy8gdG9BcnJheQotCQkJCQlpZiAocHJlZmVycmVkRUFSTGlzdCAhPSBudWxsKSB7Ci0JCQkJCQllYXJQcm9qZWN0cyA9IChJUHJvamVjdFtdKSBwcmVmZXJyZWRFQVJMaXN0LnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBjZSkgewotCQkJCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQkJCWxvZy5sb2coTG9nLkVSUk9SLCA1MDM5LCBKMkVFVXRpbHMuY2xhc3MsICJnZXRFQVJQcm9qZWN0cyIsIGNlKTsKLQotCQkJfQotCQl9Ci0JCXJldHVybiBlYXJQcm9qZWN0c1swXTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBFSkIgcHJvamVjdHMgaW4gdGhlIGVhcnMKLQkgKiAKLQkgKiBAcGFyYW0gZWFyUHJvamVjdHMKLQkgKiBAcmV0dXJuIHByb2plY3RzIEVKQiBwcm9qZWN0cwotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRFSkIyMENvbXBvbmVudHNGcm9tRWFycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRFSkIyXzBQcm9qZWN0c0Zyb21FQVJTKEVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0cykgewotCQlpZiAoZWFyUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFycmF5TGlzdCBlamJQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVhclByb2plY3RzW2ldIGluc3RhbmNlb2YgRUFSTmF0dXJlUnVudGltZSkgewotCQkJCUVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gKEVBUk5hdHVyZVJ1bnRpbWUpIGVhclByb2plY3RzW2ldOwotCQkJCU1hcCBwcm9qZWN0c0luRUFSID0gZWFyLmdldE1vZHVsZVByb2plY3RzKCk7Ci0JCQkJaWYgKHByb2plY3RzSW5FQVIgIT0gbnVsbCAmJiAhcHJvamVjdHNJbkVBUi5pc0VtcHR5KCkpIHsKLQkJCQkJSXRlcmF0b3IgaXRlciA9IHByb2plY3RzSW5FQVIudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgTU9GT2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoTU9GT2JqZWN0IGluc3RhbmNlb2YgRUpCTmF0dXJlUnVudGltZSkgewotCQkJCQkJCWlmICgoKEVKQk5hdHVyZVJ1bnRpbWUpIE1PRk9iamVjdCkKLQkJCQkJCQkJCS5nZXRNb2R1bGVWZXJzaW9uKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKChFSkJOYXR1cmVSdW50aW1lKSBNT0ZPYmplY3QpCi0JCQkJCQkJCQkJLmdldFByb2plY3QoKTsKLQkJCQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQkJZWpiUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBmb3IgZWFyUHJvamVjdHMgbG9vcAotCi0JCXJldHVybiAoSVByb2plY3RbXSkgZWpiUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIEVKQiBwcm9qZWN0cyBpbiB0aGUgZWFycwotCSAqIAotCSAqIEBwYXJhbSBlYXJQcm9qZWN0cwotCSAqIEByZXR1cm4gcHJvamVjdHMgRUpCIHByb2plY3RzCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0RUpCUHJvamVjdHNGcm9tRUFSUygKLQkJCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJQcm9qZWN0cykgewotCQlpZiAoZWFyUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFycmF5TGlzdCBlamJQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVhclByb2plY3RzW2ldIGluc3RhbmNlb2YgRUFSTmF0dXJlUnVudGltZSkgewotCQkJCUVBUk5hdHVyZVJ1bnRpbWUgZWFyID0gKEVBUk5hdHVyZVJ1bnRpbWUpIGVhclByb2plY3RzW2ldOwotCQkJCU1hcCBwcm9qZWN0c0luRUFSID0gZWFyLmdldE1vZHVsZVByb2plY3RzKCk7Ci0JCQkJaWYgKHByb2plY3RzSW5FQVIgIT0gbnVsbCAmJiAhcHJvamVjdHNJbkVBUi5pc0VtcHR5KCkpIHsKLQkJCQkJSXRlcmF0b3IgaXRlciA9IHByb2plY3RzSW5FQVIudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgTU9GT2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoTU9GT2JqZWN0IGluc3RhbmNlb2YgRUpCTmF0dXJlUnVudGltZSkgewotCi0JCQkJCQkJSVByb2plY3QgcHJvamVjdCA9ICgoRUpCTmF0dXJlUnVudGltZSkgTU9GT2JqZWN0KQotCQkJCQkJCQkJLmdldFByb2plY3QoKTsKLQkJCQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCWVqYlByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSAvLyBlbmQgZm9yIGVhclByb2plY3RzIGxvb3AKLQotCQlyZXR1cm4gKElQcm9qZWN0W10pIGVqYlByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBFSkIgQ29tcG9uZW50cyBpbiB0aGUgcHJvamVjdAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRFSkJDb21wb25lbnRzKElQcm9qZWN0IHByb2plY3QpewotCQkKLQkJLy9nZXQgYWxsIGNvbXBvbmVudHMgaW4gdGhlIHByb2plY3QKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSUZsZXhpYmxlUHJvamVjdCBmbGV4ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVGbGV4aWJsZVByb2plY3QocHJvamVjdCk7Ci0JCQlJVmlydHVhbENvbXBvbmVudFtdIGNvbXBzID0gZmxleC5nZXRDb21wb25lbnRzKCk7Ci0JCQlmb3IgKGludCBpPTA7aTxjb21wcy5sZW5ndGg7aSsrKXsKLQkJCQlpZiAoaXNFSkJDb21wb25lbnQoY29tcHNbaV0pKQotCQkJCQl2LmFkZChjb21wc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCS8vaGFuZGxlIGV4Y2VwdGlvbgotCQl9Ci0JCQotCQlyZXR1cm4gKElWaXJ0dWFsQ29tcG9uZW50W10pdi50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7Ci0JfSAKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBBcHBsaWNhdGlvbiBDbGllbnQgY29tcG9uZW50cyBpbiBhIHByb2plY3QuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudFtdIGdldEFwcENsaWVudENvbXBvbmVudHMoSVByb2plY3QgcHJvamVjdCl7Ci0JCQotCQkvL2dldCBhbGwgY29tcG9uZW50cyBpbiB0aGUgcHJvamVjdAotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJRmxleGlibGVQcm9qZWN0IGZsZXggPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZsZXhpYmxlUHJvamVjdChwcm9qZWN0KTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50W10gY29tcHMgPSBmbGV4LmdldENvbXBvbmVudHMoKTsKLQkJCWZvciAoaW50IGk9MDtpPGNvbXBzLmxlbmd0aDtpKyspewotCQkJCWlmIChpc0FwcENsaWVudENvbXBvbmVudChjb21wc1tpXSkpCi0JCQkJCXYuYWRkKGNvbXBzW2ldKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJLy9oYW5kbGUgZXhjZXB0aW9uCi0JCX0KLQkJCi0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSl2LnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50WzBdKTsKLQl9IAkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBlYXJDb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRSZWZlcmVuY2luZ0VKQjIwQ29tcG9uZW50c0Zyb21FQVIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGVhckNvbXBvbmVudE5hbWUpewotCQkgCi0JCUxpc3QgZWpiQ29tcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeXsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgZWFyQ29tcG9uZW50TmFtZSk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSB2Yy5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8cmVmcy5sZW5ndGg7aSsrKSB7Ci0JCQkJaWYgKGlzRUpCMjBDb21wb25lbnQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKQotCQkJCQllamJDb21wcy5hZGQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCX0KLQkJCi0JCXJldHVybiAoSVZpcnR1YWxDb21wb25lbnRbXSllamJDb21wcy50b0FycmF5KG5ldyBJVmlydHVhbENvbXBvbmVudFswXSk7CQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdG8gY29tYmluZSB0d28gSVByb2plY3RbXQotCSAqIEBwYXJhbSBwcm9qZWN0QXJyYXkxCi0JICogQHBhcmFtIHByb2plY3RBcnJheTIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGNvbWJpbmVQcm9qZWN0QXJyYXlzKElQcm9qZWN0W10gcHJvamVjdEFycmF5MSwKLQkJCUlQcm9qZWN0W10gcHJvamVjdEFycmF5MikgewotCi0JCS8vIGNoZWNrIGlmIGVpdGhlciBvciBib3RoIGFycmF5cyBhcmUgbnVsbC4KLQkJaWYgKHByb2plY3RBcnJheTEgPT0gbnVsbCAmJiBwcm9qZWN0QXJyYXkyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAocHJvamVjdEFycmF5MSAhPSBudWxsICYmIHByb2plY3RBcnJheTIgPT0gbnVsbCkKLQkJCXJldHVybiBwcm9qZWN0QXJyYXkxOwotCQllbHNlIGlmIChwcm9qZWN0QXJyYXkxID09IG51bGwgJiYgcHJvamVjdEFycmF5MiAhPSBudWxsKQotCQkJcmV0dXJuIHByb2plY3RBcnJheTI7Ci0KLQkJSVByb2plY3RbXSBjb21iaW5lZFByb2plY3RzID0gbmV3IElQcm9qZWN0W3Byb2plY3RBcnJheTEubGVuZ3RoCi0JCQkJKyBwcm9qZWN0QXJyYXkyLmxlbmd0aF07Ci0KLQkJU3lzdGVtLmFycmF5Y29weShwcm9qZWN0QXJyYXkxLCAwLCBjb21iaW5lZFByb2plY3RzLCAwLAotCQkJCXByb2plY3RBcnJheTEubGVuZ3RoKTsKLQkJaWYgKHByb2plY3RBcnJheTIubGVuZ3RoID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShwcm9qZWN0QXJyYXkyLCAwLCBjb21iaW5lZFByb2plY3RzLAotCQkJCQlwcm9qZWN0QXJyYXkxLmxlbmd0aCwgcHJvamVjdEFycmF5Mi5sZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbWJpbmVkUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgV2ViIHByb2plY3RzIGluIHRoZSBlYXIocykKLQkgKiAKLQkgKiBAcGFyYW0gZWFyUHJvamVjdHMKLQkgKiBAcmV0dXJuIHByb2plY3RzIFdlYiBwcm9qZWN0cwotCSAqIEBkZXByZWNhdGVkICB1c2UgZ2V0UmVmZXJlbmNpbmdXZWJDb21wb25lbnRzRm9yRWFyCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFdlYlByb2plY3RzRnJvbUVBUlMoCi0JCQlFQVJOYXR1cmVSdW50aW1lW10gZWFyUHJvamVjdHMpIHsKLQkJaWYgKGVhclByb2plY3RzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlBcnJheUxpc3Qgd2ViUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlYXJQcm9qZWN0c1tpXSBpbnN0YW5jZW9mIEVBUk5hdHVyZVJ1bnRpbWUpIHsKLQkJCQlFQVJOYXR1cmVSdW50aW1lIGVhciA9IChFQVJOYXR1cmVSdW50aW1lKSBlYXJQcm9qZWN0c1tpXTsKLQkJCQlNYXAgcHJvamVjdHNJbkVBUiA9IGVhci5nZXRNb2R1bGVQcm9qZWN0cygpOwotCQkJCWlmIChwcm9qZWN0c0luRUFSICE9IG51bGwgJiYgIXByb2plY3RzSW5FQVIuaXNFbXB0eSgpKSB7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0c0luRUFSLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJLy8gSVByb2plY3ROYXR1cmUgbmF0dXJlID0KLQkJCQkJCS8vIGl0ZXIubmV4dCgpLmdldE5hdHVyZShJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEKTsKLQkJCQkJCU9iamVjdCBNT0ZPYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChNT0ZPYmplY3QgaW5zdGFuY2VvZiBKMkVFV2ViTmF0dXJlUnVudGltZSkgewotCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKEoyRUVXZWJOYXR1cmVSdW50aW1lKSBNT0ZPYmplY3QpCi0JCQkJCQkJCQkuZ2V0UHJvamVjdCgpOwotCQkJCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJd2ViUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBmb3IgZWFyUHJvamVjdHMgbG9vcAotCi0JCXJldHVybiAoSVByb2plY3RbXSkgd2ViUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlYXJDb21wb25lbnRzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnRbXSBnZXRSZWZlcmVuY2luZ1dlYkNvbXBvbmVudHNGcm9tRUFSKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBlYXJDb21wb25lbnROYW1lKXsKLQkJTGlzdCB3ZWJDb21wcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5ewotCQkJSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCBlYXJDb21wb25lbnROYW1lKTsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IHZjLmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxyZWZzLmxlbmd0aDtpKyspIHsKLQkJCQlpZiAoaXNXZWJDb21wb25lbnQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKQotCQkJCQl3ZWJDb21wcy5hZGQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJfQkJCQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJfQotCQkKLQkJcmV0dXJuIChJVmlydHVhbENvbXBvbmVudFtdKXdlYkNvbXBzLnRvQXJyYXkobmV3IElWaXJ0dWFsQ29tcG9uZW50WzBdKTsJCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC8vIHVzZSBpc0VKQjIwQ29tcG9uZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCMl8wUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLQkJaWYgKFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQl0cnkgewotCi0JCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKElFSkJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEKQotCQkJCQkJJiYgRUpCTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpCi0JCQkJCQkJCS5nZXRNb2R1bGVWZXJzaW9uKCkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlamJDb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCMjBDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgZWpiQ29tcG9uZW50KXsKLQkJcmV0dXJuIGlzRUpCMjBDb21wb25lbnQoZWpiQ29tcG9uZW50LmdldFByb2plY3QoKSwgZWpiQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbXBvbmVudE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCMjBDb21wb25lbnQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpewotCQlib29sZWFuIGlzRUpCID0gZmFsc2U7Ci0JCXRyeSB7Ci0gICAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGNvbXBvbmVudE5hbWUpOwotCQkgIGlmIChFSkJBcnRpZmFjdEVkaXQuaXNWYWxpZEVKQk1vZHVsZSh2YykpIHsKLQkJCSAgRUpCQXJ0aWZhY3RFZGl0ICBlamJFZGl0ID0gbnVsbDsKLQkJCSAgdHJ5IHsKLQkJCQkgIGVqYkVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZCh2Yyk7Ci0JCQkJICBFSkJSZXNvdXJjZSBlamJSZXMgPSBlamJFZGl0LmdldEVKQkphclhtaVJlc291cmNlKCk7Ci0JCQkJICBpZiAoZWpiUmVzLmdldE1vZHVsZVZlcnNpb25JRCgpPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotCQkJCQkgIHJldHVybiB0cnVlOwotCQkJCSAgfQotCQkJICB9Ci0JCQkgIGZpbmFsbHkgewotCQkJCSAgaWYgKGVqYkVkaXQhPW51bGwpCi0JCQkJCSAgZWpiRWRpdC5kaXNwb3NlKCk7Ci0JCQkgIH0KLQkJICB9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGV4KXt9Ci0JCQotCQlyZXR1cm4gaXNFSkI7CQkJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBhbiBFQVIgMS4yIG9yIEVBUiAxLjMKLQkgKiBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYW4gRUFSIDEuMiBvciBhbiBFQVIgMS4zIFByb2plY3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLy8gdXNlIGlzRUFSQ29tcG9uZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUFSUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG1vZHVsZQotCSAqIEBwYXJhbSBFQVIKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgICB1c2UgaXNDb21wb25lbnRBc3NvY2lhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUFSQXNzb2NpYXRlZChJUHJvamVjdCBtb2R1bGUsIElQcm9qZWN0IEVBUikgewotCi0JCUVBUk5hdHVyZVJ1bnRpbWVbXSBlYXJzID0gZ2V0RUFSUHJvamVjdHMobW9kdWxlKTsKLQkJaWYgKGVhcnMgIT0gbnVsbCAmJiBlYXJzLmxlbmd0aCAhPSAwKSB7Ci0JCQlWZWN0b3IgRUFSTmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlFQVJOYW1lcy5hZGQoZWFyc1tpXS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGVhck5hbWVzID0gKFN0cmluZ1tdKSBFQVJOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCQkJaWYgKEFycmF5cy5iaW5hcnlTZWFyY2goZWFyTmFtZXMsIEVBUi5nZXROYW1lKCkpID49IDApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGF0IGNvbXBOYW1lIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGVhciBhdCBlYXJDb21wTmFtZQotCSAqIEBwYXJhbSBlYXJQcm9qZWN0Ci0JICogQHBhcmFtIGVhckNvbXBOYW1lCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gY29tcE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29tcG9uZW50QXNzb2NpYXRlZChJUHJvamVjdCBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyQ29tcE5hbWUsCi0JCQkJCQkJCUlQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wTmFtZSkgewotCQlJVmlydHVhbENvbXBvbmVudCB2YzEgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0LCBlYXJDb21wTmFtZSk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZjMiA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGNvbXBOYW1lKTsKLQkJcmV0dXJuIGlzQ29tcG9uZW50QXNzb2NpYXRlZCh2YzEsIHZjMik7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGlzIHJlZmVyZW5jZWQgYnkgdGhlIGVhcgotCSAqIEBwYXJhbSBlYXIgCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29tcG9uZW50QXNzb2NpYXRlZChJVmlydHVhbENvbXBvbmVudCBlYXIsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7Ci0JCWJvb2xlYW4gaXNBc3NvY2lhdGVkID0gZmFsc2U7Ci0JCQotCQkvLyBOb3RlOiBub3QgaW1wbGVtZW50ZWQgYnkgSjJFRSB5ZXQuLiB0byBiZSB1c2VkIGxhdGVyLgotCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNvbXBSZWZzID0gZWFyLmdldFJlZmVyZW5jZXMoKTsKLQkJaWYgKGNvbXBSZWZzIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaT0wO2k8Y29tcFJlZnMubGVuZ3RoO2krKyl7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2UgdnJlZiA9IGNvbXBSZWZzW2ldOwotCQkJCWlmIChjb21wb25lbnQuZXF1YWxzKHZyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKSkKLQkJCQkJCWlzQXNzb2NpYXRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzQXNzb2NpYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHBhcmFtIGVhclByb2plY3QKLQkgKiBAcGFyYW0gZWFyQ29tcG9uZW50TmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NvY2lhdGVDb21wb25lbnRUb0VBUihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSwKLQkJCQkJCQlJUHJvamVjdCBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyQ29tcG9uZW50TmFtZSkgewotCQkKLSAgICAgICAgU3RydWN0dXJlRWRpdCBjb3JlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJaWYgKGNvcmUhPW51bGwpewotCSAgICAgICAgICAgIFdvcmtiZW5jaENvbXBvbmVudCB3YyA9IGNvcmUuZmluZENvbXBvbmVudEJ5TmFtZShjb21wb25lbnROYW1lKTsKLQkgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL0lEYXRhTW9kZWwgYWRkQ29tcG9uZW50VG9FQVJEYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkgICAgICAgICAgICBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbCBhZGRDb21wb25lbnRUb0VBUkRhdGFNb2RlbCA9IG5ldyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbCgpOzsKLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICBhZGRDb21wb25lbnRUb0VBUkRhdGFNb2RlbC5zZXRQcm9wZXJ0eShBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbC5FQVJfUFJPSkVDVF9OQU1FLCBlYXJQcm9qZWN0LmdldE5hbWUoKSk7Ci0JICAgICAgICAgICAgYWRkQ29tcG9uZW50VG9FQVJEYXRhTW9kZWwuc2V0UHJvcGVydHkoQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7ICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgYWRkQ29tcG9uZW50VG9FQVJEYXRhTW9kZWwuc2V0UHJvcGVydHkoQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWwuTU9EVUxFX05BTUUsIGNvbXBvbmVudE5hbWUpOwotCSAgICAgICAgICAgIGFkZENvbXBvbmVudFRvRUFSRGF0YU1vZGVsLnNldFByb3BlcnR5KEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsLkVBUl9NT0RVTEVfTkFNRSwgZWFyQ29tcG9uZW50TmFtZSk7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgTGlzdCBtb2R1bGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkgICAgICAgICAgICBtb2R1bGVzTGlzdC5hZGQod2MpOwotCSAgICAgICAgICAgIC8vU3RyaW5nIGVqYkNvbXBvbmVudERlcGxveU5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShFSkJfQ09NUE9ORU5UX0RFUExPWV9OQU1FKTsKLQkgICAgICAgICAgICAKLQkgICAgICAgICAgICBhZGRDb21wb25lbnRUb0VBUkRhdGFNb2RlbC5zZXRQcm9wZXJ0eShBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbC5NT0RVTEVfTElTVCxtb2R1bGVzTGlzdCk7Ci0JICAgICAgICAgICAgCi0JICAgICAgICAgICAgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24gYWRkTW9kdWxlT3AgPSBuZXcgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24oYWRkQ29tcG9uZW50VG9FQVJEYXRhTW9kZWwpOwotCSAgICAgICAgICAgIGFkZE1vZHVsZU9wLnJ1bihudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCSAgLy9oYW5kbGUgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotICAgICAgICB9ZmluYWxseSB7Ci0gICAgICAgICAgICBpZihjb3JlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY29yZS5kaXNwb3NlKCk7Ci0gICAgICAgIH0JCQotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHBhcmFtIEVBUlByb2plY3QKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzb2NpYXRlV2ViUHJvamVjdChJUHJvamVjdCBtb2R1bGUsIElQcm9qZWN0IEVBUlByb2plY3QpIHsKLQkJCVN0cmluZyB1cmkgPSBtb2R1bGUuZ2V0TmFtZSgpICsgIi53YXIiOwotCQkJU3RyaW5nIGNvbnRleHRSb290ID0gbW9kdWxlLmdldE5hbWUoKTsKLQkJCUFkZE1vZHVsZVRvRUFSUHJvamVjdENvbW1hbmQgYW1pZWMgPSBuZXcgQWRkTW9kdWxlVG9FQVJQcm9qZWN0Q29tbWFuZCgKLQkJCQkJbW9kdWxlLCBFQVJQcm9qZWN0LCB1cmksIGNvbnRleHRSb290LCBudWxsKTsKLQkJCWlmIChhbWllYy5jYW5FeGVjdXRlKCkpCi0JCQkJYW1pZWMuZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlamJQcm9qZWN0Ci0JICogQHBhcmFtIEVBUlByb2plY3QKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB0byBiZSBkZXRlcm1pbmVkCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgYXNzb2NpYXRlRUpCUHJvamVjdChJUHJvamVjdCBlamJQcm9qZWN0LAotLy8JCQlJUHJvamVjdCBFQVJQcm9qZWN0KSB7Ci0vLwkJdHJ5IHsKLS8vCQkJU3RyaW5nIHVyaSA9IGVqYlByb2plY3QuZ2V0TmFtZSgpICsgIi5qYXIiOwotLy8JCQlTdHJpbmcgY29udGV4dFJvb3QgPSBlamJQcm9qZWN0LmdldE5hbWUoKTsKLS8vCQkJQWRkTW9kdWxlVG9FQVJQcm9qZWN0Q29tbWFuZCBhbWllYyA9IG5ldyBBZGRNb2R1bGVUb0VBUlByb2plY3RDb21tYW5kKAotLy8JCQkJCWVqYlByb2plY3QsIEVBUlByb2plY3QsIHVyaSwgY29udGV4dFJvb3QsIG51bGwpOwotLy8JCQlpZiAoYW1pZWMuY2FuRXhlY3V0ZSgpKQotLy8JCQkJYW1pZWMuZXhlY3V0ZSgpOwotLy8KLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8KLS8vCQl9Ci0vLwotLy8JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IE1vZHVsZSdzIFdFQi1JTkYgZGlyZWN0b3J5Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgIHVzZSBnZXRXZWJJbmZQYXRoKHByb2plY3QsIGNvbXBOYW1lKSBpbnN0ZWFkCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIElQYXRoIGdldEZpcnN0V2ViSW5mUGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLS8vCQlJUGF0aCBtb2R1bGVQYXRoID0gbnVsbDsKLS8vCQlTdHJ1Y3R1cmVFZGl0IG1jID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotLy8JCSAgV29ya2JlbmNoQ29tcG9uZW50W10gd2JjcyA9IG1jLmdldFdvcmtiZW5jaE1vZHVsZXMoKTsKLS8vCQkgIAotLy8JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0vLwkJCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLS8vCQkJdHJ5IHsKLS8vCQkJICB3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2Jjc1swXSk7Ci0vLwkJCSAgaWYgKHdlYkVkaXQhPW51bGwpewotLy8JCQkJICBJUGF0aCB3ZWJYTUxQYXRoID0gd2ViRWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclBhdGgoKTsKLS8vCQkJCSAgbW9kdWxlUGF0aCA9IHdlYlhNTFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotLy8JCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIldlYk1vZHVsZVBhdGgvRERQYXRoID0gIittb2R1bGVQYXRoKTsKLS8vCQkJICB9Ci0vLwkJCX0KLS8vCQkJZmluYWxseXsKLS8vCQkJCWlmICh3ZWJFZGl0IT1udWxsKQotLy8JCQkJCXdlYkVkaXQuZGlzcG9zZSgpOwotLy8JCQl9Ci0vLwkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIHdiY3NbMF0uZ2V0TmFtZSgpKTsKLS8vCQkJSVZpcnR1YWxGb2xkZXIgd2ViSW5mRGlyID0gY29tcG9uZW50LmdldEZvbGRlcihuZXcgUGF0aCgiL1dFQi1JTkYiKSk7Ci0vLwkJCW1vZHVsZVBhdGggPSB3ZWJJbmZEaXIuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlyc3RXZWJJbmZQYXRoID0gIiArbW9kdWxlUGF0aCk7Ci0vLwkJICB9Ci0vLwkJfQotLy8JCWNhdGNoKEV4Y2VwdGlvbiBleCl7fQotLy8JCWZpbmFsbHl7Ci0vLwkJCWlmIChtYyE9bnVsbCkKLS8vCQkJCW1jLmRpc3Bvc2UoKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBtb2R1bGVQYXRoOwkJCi0vLwl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gY29tcG9uZW50TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkluZlBhdGgoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpewotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHdlYkluZkRpciA9IGNvbXBvbmVudC5nZXRGb2xkZXIobmV3IFBhdGgoIi9XRUItSU5GIikpOwotCQlJUGF0aCBtb2R1bGVQYXRoID0gd2ViSW5mRGlyLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQotCQlyZXR1cm4gbW9kdWxlUGF0aDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRGaXJzdFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QpewotCQkKLQkJSVBhdGggbW9kdWxlUGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0gICAgICAgICAgSUZsZXhpYmxlUHJvamVjdCBmcCA9IENvbXBvbmVudENvcmUuY3JlYXRlRmxleGlibGVQcm9qZWN0KHByb2plY3QpOwotICAgICAgICAgIElWaXJ0dWFsQ29tcG9uZW50W10gdmNzID0gZnAuZ2V0Q29tcG9uZW50cygpOwotCQkgIGlmICh2Y3MubGVuZ3RoIT0wKSB7Ci0gICAgICAgICAgICBtb2R1bGVQYXRoID0gdmNzWzBdLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQotCQlyZXR1cm4gbW9kdWxlUGF0aDsJCQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gY29tcG9uZW50TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFdlYkNvbnRlbnRQYXRoKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wb25lbnROYW1lKXsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBjb21wb25lbnQuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCXJldHVybiBtb2R1bGVQYXRoOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0Rmlyc3RXZWJDb250ZW50Q29udGFpbmVyKElQcm9qZWN0IHByb2plY3QpewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBnZXRGaXJzdFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQlJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UobW9kdWxlUGF0aCk7Ci0JCWlmIChyZXMhPW51bGwpewotCQkgIGNvbnRhaW5lciA9IHJlcy5nZXRQYXJlbnQoKTsKLQkJfQkJCi0JCSAgCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbXBvbmVudE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldFdlYkNvbnRlbnRDb250YWluZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpewotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0LCBjb21wb25lbnROYW1lKTsKLQkJSVJlc291cmNlIHJlcyA9IFJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKG1vZHVsZVBhdGgpOwotCQlpZiAocmVzIGluc3RhbmNlb2YgSUNvbnRhaW5lcil7Ci0JCSAgY29udGFpbmVyID0gKElDb250YWluZXIpcmVzOwotCQl9CQkKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgTW9kdWxlIG5hbWUgCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RXZWJNb2R1bGVOYW1lKElQcm9qZWN0IHByb2plY3QpewotICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBudWxsOwotICAgICAgdHJ5IHsKLSAgICAgICAgSUZsZXhpYmxlUHJvamVjdCBmcCA9IENvbXBvbmVudENvcmUuY3JlYXRlRmxleGlibGVQcm9qZWN0KHByb2plY3QpOwotICAgICAgICBJVmlydHVhbENvbXBvbmVudFtdIHZjcyA9IGZwLmdldENvbXBvbmVudHMoKTsKLSAgICAgICAgaWYgKHZjcy5sZW5ndGghPTApCi0gICAgICAgICAgbW9kdWxlTmFtZSA9IHZjc1swXS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChFeGNlcHRpb24gZXgpe30KLSAgCi0gICAgICByZXR1cm4gbW9kdWxlTmFtZTsgIAkJCQotCX0KLQkKLQotCS8qKgotCSAqIFRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyBhIHZhbGlkIFdlYiBjb21wb25lbnQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYkNvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSkgewotICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0gICAgcmV0dXJuIGlzV2ViQ29tcG9uZW50KHZjKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2ViQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXApewotICAgIGlmICggY29tcC5nZXRDb21wb25lbnRUeXBlSWQoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0JLyoqCi0JICogVHJ1ZSBpcyB0aGUgY29tcG9uZW50IGlzIGEgdmFsaWQgRUFSIGNvbXBvbmVudAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbXBvbmVudE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUFSQ29tcG9uZW50KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wb25lbnROYW1lKXsKLSAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGNvbXBvbmVudE5hbWUpOwotICAgIHJldHVybiBpc0VBUkNvbXBvbmVudCh2Yyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VBUkNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wKXsKLSAgICBpZiAoY29tcC5nZXRDb21wb25lbnRUeXBlSWQoKS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSkpewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUcnVlIGlmIHRoZSBjb21wb25lbnQgaXMgYSB2YWxpZCBFSkIgY29tcG9uZW50Ci0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gY29tcG9uZW50TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFSkJDb21wb25lbnQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKLSAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGNvbXBvbmVudE5hbWUpOwotICAgIHJldHVybiBpc0VKQkNvbXBvbmVudCh2Yyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXApewotICAgIGlmIChjb21wLmdldENvbXBvbmVudFR5cGVJZCgpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFKSl7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBUcnVlIGlmIHRoZSBjb21wb25lbnQgaXMgYSB0cnVlIEFwcGxpY2F0aW9uIGNsaWVudCBjb21wb25lbnQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FwcENsaWVudENvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSkgewotICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0gICAgcmV0dXJuIGlzQXBwQ2xpZW50Q29tcG9uZW50KHZjKTsKLQl9CQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwQ2xpZW50Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXApewotICAgIGlmIChjb21wLmdldENvbXBvbmVudFR5cGVJZCgpLmVxdWFscyhJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFKSl7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBUcnVlIGlmIHRoZSBjb21wb25lbnQgaXMgYSB2YWxpZCBKYXZhIGNvbXBvbmVudAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGNvbXBvbmVudE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YUNvbXBvbmVudChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSkgewotICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0gICAgcmV0dXJuIGlzSmF2YUNvbXBvbmVudCh2Yyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmFDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcCl7Ci0gICAgaWYgKGNvbXAuZ2V0Q29tcG9uZW50VHlwZUlkKCkuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuSlNUX1VUSUxJVFlfTU9EVUxFKSl7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b0NvbXBvbmVudE5hbWVzQXJyYXkoSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzKXsKLQkJU3RyaW5nW10gZWNOYW1lcyA9IG5ldyBTdHJpbmdbY29tcG9uZW50cy5sZW5ndGhdOwotCQlmb3IoaW50IGk9MDsgaTxjb21wb25lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCWVjTmFtZXNbaV0gPSBjb21wb25lbnRzW2ldLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZWNOYW1lczsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gdG9Qcm9qZWN0QXJyYXkoSVZpcnR1YWxDb21wb25lbnRbXSBjb21wb25lbnRzKXsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtjb21wb25lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGk9MDsgaTxjb21wb25lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCXByb2plY3RzW2ldID0gY29tcG9uZW50c1tpXS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3RzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL0phdmFNT0ZVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSmF2YU1PRlV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGNkYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vSmF2YU1PRlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFDbGFzc0ltcGw7Ci0KLS8qKgotKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHNvbWUgdXNlZnVsIHV0aWxpdGllcyBmb3IgZGVhbGluZyB3aXRoIHRoZSBKYXZhTU9GCi0qLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YU1PRlV0aWxzCi17Ci0gLyoqCi0gICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjbGFzcyBvZiB0aGUgZ2l2ZW4gbmFtZSBpcyBsb2FkYWJsZSBpbiB0aGUgZ2l2ZW4KLSAgKiBwcm9qZWN0LgotICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0Ci0gICogQHJldHVybiBUcnVlIGlmIHRoZSBjbGFzcyBpcyBsb2FkYWJsZSBhbmQgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duLiAKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NMb2FkYWJsZShTdHJpbmcgY2xhc3NOYW1lLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAJcmV0dXJuIGlzQ2xhc3NMb2FkYWJsZShnZXRKYXZhQ2xhc3MoY2xhc3NOYW1lLHByb2plY3QpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzTG9hZGFibGUoSmF2YUNsYXNzIGphdmFDbGFzcykKLSAgewotCXJldHVybiBqYXZhQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKTsgICAgCi0gIH0KLQotICAvKioKLSAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGhhcyBhIHB1YmxpYyBjb25zdHJ1Y3RvcgotICAqIHdpdGggYW4gZW1wdHkgcGFyYW1ldGVyIGxpc3QuCi0gICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGlzIGxvYWRhYmxlIGZyb20gdGhlIHByb2plY3QgYW5kIHRoZSAKLSAgKiAgICAgICAgIGNsYXNzIGhhcyBhIHB1YmxpYyBjb25zdHJ1Y3RvciB3aXRoIGFuIGVtcHR5IHBhcmFtZXRlciBsaXN0ICAKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1B1YmxpY0RlZmF1bHRDdG9yKFN0cmluZyBjbGFzc05hbWUsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gaGFzUHVibGljRGVmYXVsdEN0b3IoZ2V0SmF2YUNsYXNzKGNsYXNzTmFtZSwgcHJvamVjdCkpOwotICB9Ci0KLQotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNQdWJsaWNEZWZhdWx0Q3RvcihKYXZhQ2xhc3MgamF2YUNsYXNzKQotICB7Ci0gICAKLSAgICBMaXN0IG1ldGhvZExpc3QgPSBqYXZhQ2xhc3MuZ2V0TWV0aG9kcygpOwotICAgIGlmIChtZXRob2RMaXN0PT1udWxsKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBJdGVyYXRvciBpTWV0aG9kcyA9IG1ldGhvZExpc3QuaXRlcmF0b3IoKTsKLSAgICBib29sZWFuIHVzZXJEZWZpbmVkQ3RvciA9IGZhbHNlOwotICAgIHdoaWxlIChpTWV0aG9kcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgTWV0aG9kIHRoaXNNZXRob2QgPSAoTWV0aG9kKWlNZXRob2RzLm5leHQoKTsKLQotICAgICAgaWYgKHRoaXNNZXRob2QuaXNDb25zdHJ1Y3RvcigpKQotICAgICAgewotICAgICAgICB1c2VyRGVmaW5lZEN0b3IgPSB0cnVlOyAKLQotICAgICAgICAvL1NpbmNlIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgY3RvciwgdGhlIGRlZmF1bHQgY3RvciBpcyBubyBsb25nZXIgYXZhaWxhYmxlLgotICAgICAgICAvL1dlIG11c3QgZW5zdXJlIHRoYXQgdGhlIHVzZXIgaGFzIHByb3ZpZGVkIGEgcHVibGljIGN0b3Igd2l0aCBubyBwYXJhbWV0ZXJzLgotCi0gICAgICAgIC8vY2hlY2sgaWYgcHVibGljCi0gICAgICAgIGlmICh0aGlzTWV0aG9kLmdldEphdmFWaXNpYmlsaXR5KCkuZ2V0VmFsdWUoKSA9PSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDKQotICAgICAgICB7Ci0gICAgICAgICAgLy9zZWUgaWYgcGFyYW1ldGVyIGxpc3QgaXMgZW1wdHkKLSAgICAgICAgICBMaXN0IHBhcmFtTGlzdCA9IHRoaXNNZXRob2QuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgIGlmIChwYXJhbUxpc3QuaXNFbXB0eSgpICkKLSAgICAgICAgICB7Ci0JICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBpZiAodXNlckRlZmluZWRDdG9yKQotICAgIHsKLQkgIHJldHVybiBmYWxzZTsgLy9pZiB0aGUgdXNlciBkZWZpbmVkIGEgY3RvciBhbmQgd2Ugc3RpbGwgaGF2ZW4ndAotCSAgCSAgICAgICAgICAgIC8vcmV0dXJuZWQgdHJ1ZSwgbm9uZSBvZiB0aGVtIHdlcmUgcHVibGljIHdpdGggbm8gcGFyYW1ldGVycy4KLSAgICB9Ci0gICAgZWxzZQotICAgIHsgCi0gICAgICAgcmV0dXJuIHRydWU7ICAgIAotICAgIH0KLQotICB9Ci0gIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaW1wbGVtZW50cyB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4KLSAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MKLSAgKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyZmFjZQotICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0Ci0gICogQHJldHVybiBUcnVlIGlmIHRoZSBjbGFzcyBhbmQgaW50ZXJmYWNlIGFyZSBsb2FkYWJsZSBmcm9tIHRoZSBwcm9qZWN0IGFuZAotICAqICAgICAgICAgdGhlIGNsYXNzIGltcGxlbWVudHMgdGhlIGludGVyZmFjZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGludGVyZmFjZU5hbWUsIElQcm9qZWN0IHByb2plY3QpCi0gIAkJCXRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgIHJldHVybiBpbXBsZW1lbnRzSW50ZXJmYWNlKGdldEphdmFDbGFzcyhjbGFzc05hbWUsIHByb2plY3QpLCBnZXRKYXZhQ2xhc3MoaW50ZXJmYWNlTmFtZSwgcHJvamVjdCkpOwotICB9Ci0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbXBsZW1lbnRzSW50ZXJmYWNlKEphdmFDbGFzcyBqYXZhQ2xhc3MsIEphdmFDbGFzcyBpbnRlcmZhY2VDbGFzcykKLSAgewotICAgCi0gICAgaWYgKCFqYXZhQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghaW50ZXJmYWNlQ2xhc3MuaXNFeGlzdGluZ1R5cGUoKSkgIHJldHVybiBmYWxzZTsKLSAgICAgICAgCi0gICAgcmV0dXJuIGphdmFDbGFzcy5pbXBsZW1lbnRzSW50ZXJmYWNlKGludGVyZmFjZUNsYXNzKTsKLSAgfQotCi0gIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgZXh0ZW5kcyB0aGUgc3BlY2lmaWVkIHN1cGVyY2xhc3MKLSAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MKLSAgKiBAcGFyYW0gc3VwZXJDbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBzdXBlcmNsYXNzCi0gICogQHBhcmFtIHByb2plY3QgVGhlIHByb2plY3QKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNsYXNzIGFuZCBzdXBlckNsYXNzIGFyZSBsb2FkYWJsZSBmcm9tIHRoZSBwcm9qZWN0IGFuZAotICAqICAgICAgICAgdGhlIGNsYXNzIGV4dGVuZHMgdGhlIHN1cGVyQ2xhc3MKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4dGVuZHNDbGFzcyhTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgc3VwZXJDbGFzc05hbWUsIElQcm9qZWN0IHByb2plY3QpCi0gICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIGV4dGVuZHNDbGFzcyhnZXRKYXZhQ2xhc3MoY2xhc3NOYW1lLHByb2plY3QpLCBnZXRKYXZhQ2xhc3Moc3VwZXJDbGFzc05hbWUsIHByb2plY3QpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleHRlbmRzQ2xhc3MoSmF2YUNsYXNzIGphdmFDbGFzcywgSmF2YUNsYXNzIHN1cGVyQ2xhc3MpCi0gIHsKLSAgICByZXR1cm4gc3VwZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGphdmFDbGFzcyk7Ci0gIH0KLQotICAvKioKLSAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFjdHVhbGx5IGFuIGludGVyZmFjZQotICAqIEBwYXJhbSBjbGFzc05hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0Ci0gICogQHJldHVybiBUcnVlIGlmIHRoZSBjbGFzcyBpcyBsb2FkYWJsZSBmcm9tIHRoZSBwcm9qZWN0IGFuZCBpcyAKLSAgKiAgICAgICAgIGFjdHVhbGx5IGFuIGludGVyZmFjZQotICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoU3RyaW5nIGNsYXNzTmFtZSwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgICByZXR1cm4gaXNJbnRlcmZhY2UoZ2V0SmF2YUNsYXNzKGNsYXNzTmFtZSwgcHJvamVjdCkpOwotICB9Ci0KLSBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnRlcmZhY2UoSmF2YUNsYXNzIGphdmFDbGFzcykKLSAgewotICAgICAgcmV0dXJuIGphdmFDbGFzcy5pc0ludGVyZmFjZSgpOwotICB9Ci0gcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0Fic3RyYWN0TWV0aG9kcyAoU3RyaW5nIGNsYXNzTmFtZSwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAJewotCSAgICByZXR1cm4gaGFzQWJzdHJhY3RNZXRob2RzKGdldEphdmFDbGFzcyhjbGFzc05hbWUsIHByb2plY3QpKTsKLSAgCX0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQWJzdHJhY3RNZXRob2RzIChKYXZhQ2xhc3MgamF2YUNsYXNzKQotIAl7Ci0JICAgTGlzdCBtZXRob2RMaXN0ID0gamF2YUNsYXNzLmdldE1ldGhvZHMoKTsKLSAgICAgICBpZiAobWV0aG9kTGlzdD09bnVsbCkKLSAgICAgIAlyZXR1cm4gZmFsc2U7Ci0KLQkgICBJdGVyYXRvciBpTWV0aG9kcyA9IG1ldGhvZExpc3QuaXRlcmF0b3IoKTsKLQkgICB3aGlsZSAoaU1ldGhvZHMuaGFzTmV4dCgpKQotICAgIAl7Ci0gICAgICAJCU1ldGhvZCB0aGlzTWV0aG9kID0gKE1ldGhvZClpTWV0aG9kcy5uZXh0KCk7Ci0JCQlpZiAoIHRoaXNNZXRob2QuaXNBYnN0cmFjdCgpKSByZXR1cm4gdHJ1ZTsKLQkgICAJfQotCQlyZXR1cm4gZmFsc2U7Ci0gCX0KLQotIHB1YmxpYyBzdGF0aWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcyhTdHJpbmcgY2xhc3NOYW1lICwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAJewotIAkJSmF2YUVNRk5hdHVyZSBqTU9GID0gKEphdmFFTUZOYXR1cmUpSmF2YUVNRk5hdHVyZS5jcmVhdGVSdW50aW1lKHByb2plY3QpOwotICAgIAlyZXR1cm4gIChKYXZhQ2xhc3MpSmF2YUNsYXNzSW1wbC5yZWZsZWN0KGNsYXNzTmFtZSwgak1PRi5nZXRSZXNvdXJjZVNldCgpKTsKLSAJfQotCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRTRUlGaWxlKEphdmFDbGFzcyBiZWFuQ2xhc3MsIEphdmFDbGFzcyBzZWlDbGFzcykKLSAJewotIAkJaWYgKCFzZWlDbGFzcy5pc0ludGVyZmFjZSgpKQotIAkJCXJldHVybiBmYWxzZTsKLQotCQlWZWN0b3IgYmVhbk1ldGhvZHNMaXN0ID0gbmV3IFZlY3RvcigpOwotIAkJTGlzdCBiZWFuTWV0aG9kcyA9IGJlYW5DbGFzcy5nZXRNZXRob2RzKCk7Ci0JCUl0ZXJhdG9yIGJlYW5NZXRob2RzSXRlcmF0b3IgPSBiZWFuTWV0aG9kcy5pdGVyYXRvcigpOwotCSAgIAl3aGlsZSAoYmVhbk1ldGhvZHNJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgCXsKLSAgICAgIAkJTWV0aG9kIHRoaXNNZXRob2QgPSAoTWV0aG9kKWJlYW5NZXRob2RzSXRlcmF0b3IubmV4dCgpOwotCQkJYmVhbk1ldGhvZHNMaXN0LmFkZCh0aGlzTWV0aG9kLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSk7Ci0JICAgCX0KLQotCQlMaXN0IHNlaU1ldGhvZHMgPSBzZWlDbGFzcy5nZXRNZXRob2RzKCk7Ci0gCQlpZiAoYmVhbk1ldGhvZHMgPT0gbnVsbCApIHsKLSAJCQlpZiAoIHNlaU1ldGhvZHMgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gCQkJZWxzZQlyZXR1cm4gZmFsc2U7Ci0gCQl9Ci0JCWlmIChzZWlNZXRob2RzID09IG51bGwpIHJldHVybiBmYWxzZTsKLQotCQlJdGVyYXRvciBzZWlNZXRob2RzSXRlcmF0b3IgPSBzZWlNZXRob2RzLml0ZXJhdG9yKCk7Ci0JICAgCXdoaWxlIChzZWlNZXRob2RzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIAl7Ci0gICAgICAJCU1ldGhvZCB0aGlzTWV0aG9kID0gKE1ldGhvZClzZWlNZXRob2RzSXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCAhYmVhbk1ldGhvZHNMaXN0LmNvbnRhaW5zKHRoaXNNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkgICAJfQotCQlyZXR1cm4gdHJ1ZTsKLSAJCQotIAl9Ci0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9SZXNvdXJjZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9SZXNvdXJjZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNGJmM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vUmVzb3VyY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuY29tcG9uZW50Y29yZS51dGlsLkFwcENsaWVudEFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuY29tcG9uZW50Y29yZS51dGlsLkVKQkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JVVJMUHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB1c2VmdWwgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEVjbGlwc2UgcmVzb3VyY2VzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzb3VyY2VVdGlscyB7Ci0KLQkvLyBLZWVwcyB0aGUgSVdvcmtzcGFjZVJvb3QgaGFuZ2luZyBhcm91bmQuIFNlZSBnZXRXb3Jrc3BhY2VSb290KCkuCi0JcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZVJvb3Qgcm9vdF8gPSBudWxsOwotCi0JLy8gS2VlcHMgdGhlIElXb3Jrc3BhY2UgaGFuZ2luZyBhcm91bmQuIFNlZSBnZXRXb3Jrc3BhY2UoKS4KLQotCXByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2Ugd29ya3NwYWNlXyA9IG51bGw7Ci0KLQkvKioKLQkgKiBBcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3RUeXBlIGdldFByb2plY3RUeXBlKCl9LCBpbmRpY2F0ZXMgdGhhdAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBubyBKYXZhIG9yIFdlYiBuYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIFBST0pFQ1RfVFlQRV9OT05FID0gMDsKLQotCS8qKgotCSAqIEFzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UHJvamVjdFR5cGUgZ2V0UHJvamVjdFR5cGUoKX0sIGluZGljYXRlcyB0aGF0Ci0JICogdGhlIGdpdmVuIHByb2plY3QgaGFzIGEgSmF2YSBwcm9qZWN0IG5hdHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGUgUFJPSkVDVF9UWVBFX0pBVkEgPSAxOwotCi0JLyoqCi0JICogQXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRQcm9qZWN0VHlwZSBnZXRQcm9qZWN0VHlwZSgpfSwgaW5kaWNhdGVzIHRoYXQKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBoYXMgYSBXZWIgcHJvamVjdCBuYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlIFBST0pFQ1RfVFlQRV9XRUIgPSAyOwotCi0JLyoqCi0JICogQXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRQcm9qZWN0VHlwZSBnZXRQcm9qZWN0VHlwZSgpfSwgaW5kaWNhdGVzIHRoYXQKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBoYXMgYW4gRUpCIHByb2plY3QgbmF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZSBQUk9KRUNUX1RZUEVfRUpCID0gNDsKLQkKLQkvKioKLQkgKiBBcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldFByb2plY3RUeXBlIGdldFByb2plY3RUeXBlKCl9LCBpbmRpY2F0ZXMgdGhhdAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyBhbiBBcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdCBuYXR1cmUuCi0JICovCQotCXB1YmxpYyBzdGF0aWMgYnl0ZSBQUk9KRUNUX1RZUEVfQVBQQ0xJRU5UID0gODsKLQotCS8qKgotCSAqIFRoZSBTT0FQIHJwY3JvdXRlciBzZXJ2bGV0IGV4dGVuc2lvbiB0byBiZSBhZGRlZCB0byB3ZWIgcHJvamVjdCBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX0VYVCA9ICIvc2VydmxldC9ycGNyb3V0ZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xJRU5UX1dFQl9QUk9KRUNUX0VYVCA9ICJDbGllbnQiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTElFTlRfRUpCX1BST0pFQ1RfRVhUID0gIkVKQkNsaWVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRUpCX1BST0pFQ1RfTkFNRSA9ICJXZWJTZXJ2aWNlRUpCUHJvamVjdCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VKQl9DT01QT05FTlRfTkFNRSA9ICJXZWJTZXJ2aWNlRUpCIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XRUJfUFJPSkVDVF9OQU1FID0gIldlYlNlcnZpY2VQcm9qZWN0IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfV0VCX0NPTVBPTkVOVF9OQU1FID0gIldlYlNlcnZpY2VXZWIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JPVVRFUl9QUk9KRUNUX0VYVCA9ICJSb3V0ZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRV9FQVJfUFJPSkVDVF9OQU1FID0gIldlYlNlcnZpY2VFQVJQcm9qZWN0IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0VSVklDRV9FQVJfQ09NUE9ORU5UX05BTUUgPSAiV2ViU2VydmljZUVBUiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0xJRU5UX0VBUl9QUk9KRUNUX05BTUUgPSAiV2ViU2VydmljZUNsaWVudEVBUlByb2plY3QiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTElFTlRfRUFSX0NPTVBPTkVOVF9OQU1FID0gIldlYlNlcnZpY2VDbGllbnRFQVIiOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZVJvb3Qgb2JqZWN0LgotCSAqIEByZXR1cm4gVGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7Ci0JCWlmIChyb290XyA9PSBudWxsKSB7Ci0JCQlyb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCX0KLQkJcmV0dXJuIHJvb3RfOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElXb3Jrc3BhY2Ugb2JqZWN0LgotCSAqIEByZXR1cm4gVGhlIElXb3Jrc3BhY2Ugb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCWlmICh3b3Jrc3BhY2VfID09IG51bGwpIHsKLQkJCWlmIChyb290XyA9PSBudWxsKSB7Ci0JCQkJcm9vdF8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJfQotCQkJd29ya3NwYWNlXyA9IHJvb3RfLmdldFdvcmtzcGFjZSgpOwotCQl9Ci0JCXJldHVybiB3b3Jrc3BhY2VfOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBJUmVzb3VyY2V9b2YgdGhlCi0JICogZ2l2ZW4gYWJzb2x1dGUgcGF0aG5hbWUgb3IgbnVsbCBpZiBubyBzdWNoIHJlc291cmNlIGV4aXN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRobmFtZQotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlLgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlKFN0cmluZyBhYnNvbHV0ZVBhdGhuYW1lKSB7Ci0JCWlmIChhYnNvbHV0ZVBhdGhuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmaW5kUmVzb3VyY2UobmV3IFBhdGgoYWJzb2x1dGVQYXRobmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBJUmVzb3VyY2V9b2YgdGhlCi0JICogZ2l2ZW4gYWJzb2x1dGUgcGF0aCBvciBudWxsIGlmIG5vIHN1Y2ggcmVzb3VyY2UgZXhpc3RzLgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSA8Y29kZT5JUGF0aDwvY29kZT4gb2YgdGhlIHJlc291cmNlLgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlKElQYXRoIGFic29sdXRlUGF0aCkgewotCQlpZiAoYWJzb2x1dGVQYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGFic29sdXRlUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSBuYW1lIGZvciBhIHJlc291cmNlIG9mIHRoZSBnaXZlbiB0eXBlKHMpLgotCSAqIFRoaXMgbWV0aG9kIG9iZXlzIHRoZSBjb250cmFjdCBvZgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3ZhbGlkYXRlTmFtZSBJV29ya3NwYWNlLnZhbGlkYXRlTmFtZSgpfS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VnbWVudAotCSAqICAgICAgICAgICAgVGhlIHBhdGggdG8gdmFsaWRhdGUuCi0JICogQHBhcmFtIHR5cGVNYXNrCi0JICogICAgICAgICAgICBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiB0eXBlIG9yIHR5cGVzLgotCSAqIEByZXR1cm4gVGhlIHN0YXR1cyB3aXRoIGEgdmFsdWUgaWYgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHBhdGgKLQkgKiAgICAgICAgIGlzIHZhbGlkLCBvciB3aXRoIGFwcHJvcHJpYXRlIHNldmVyaXR5IGFuZCBtZXNzYWdlIGluZm9ybWF0aW9uIGlmCi0JICogICAgICAgICB0aGUgcGF0aCBpcyBub3QgdmFsaWQuCi0JICogICAgICAgICAKLQkgKiBAZGVwcmVjYXRlZCBub3QgdXNlZCAgICAgICAgIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZU5hbWUoU3RyaW5nIHNlZ21lbnQsIGludCB0eXBlTWFzaykgewotCQlyZXR1cm4gZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVOYW1lKHNlZ21lbnQsIHR5cGVNYXNrKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIHN0cmluZyBhcyB0aGUgcGF0aCBvZiBhIHJlc291cmNlIG9mIHRoZSBnaXZlbgotCSAqIHR5cGUocykuIFRoaXMgbWV0aG9kIG9iZXlzIHRoZSBjb250cmFjdCBvZgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlI3ZhbGlkYXRlUGF0aCBJV29ya3NwYWNlLnZhbGlkYXRlUGF0aCgpfS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHBhdGggdG8gdmFsaWRhdGUuCi0JICogQHBhcmFtIHR5cGVNYXNrCi0JICogICAgICAgICAgICBUaGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiB0eXBlIG9yIHR5cGVzLgotCSAqIEByZXR1cm4gVGhlIHN0YXR1cyB3aXRoIGEgdmFsdWUgaWYgPGNvZGU+SVN0YXR1cy5PSzwvY29kZT4gaWYgdGhlIHBhdGgKLQkgKiAgICAgICAgIGlzIHZhbGlkLCBvciB3aXRoIGFwcHJvcHJpYXRlIHNldmVyaXR5IGFuZCBtZXNzYWdlIGluZm9ybWF0aW9uIGlmCi0JICogICAgICAgICB0aGUgcGF0aCBpcyBub3QgdmFsaWQuCi0JICogQGRlcHJlY2F0ZWQgbm90IHVzZWQgCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlUGF0aChTdHJpbmcgcGF0aCwgaW50IHR5cGVNYXNrKSB7Ci0JCXJldHVybiBnZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZVBhdGgocGF0aCwgdHlwZU1hc2spOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gSmF2YSB0eXBlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIHR5cGVOYW1lCi0JICogICAgICAgICAgICBUaGUgSmF2YSB0eXBlIG5hbWUuCi0JICogQHJldHVybiBUaGUgc3RhdHVzIHdpdGggYSB2YWx1ZSBvZiA8Y29kZT5JU3RhdHVzLk9LPC9jb2RlPiBpZiB0aGUgbmFtZQotCSAqICAgICAgICAgaXMgdmFsaWQsIG9yIHdpdGggYXBwcm9wcmlhdGUgc2V2ZXJpdHkgYW5kIG1lc3NhZ2UgaW5mb3JtYXRpb24gaWYKLQkgKiAgICAgICAgIG5hbWUgaXMgbm90IHZhbGlkLiBUaGUgcHJpbWl0aXZlIHR5cGVzIChib29sZWFuLCBjaGFyLCBieXRlLAotCSAqICAgICAgICAgc2hvcnQsIGludCwgbG9uZywgZmxvYXQsIGRvdWJsZSkgYXJlIHZhbGlkLiBBcnJheXMgb2YgdmFsaWQgdHlwZXMKLQkgKiAgICAgICAgIGFyZSB0aGVtc2VsdmVzIHZhbGlkLgotCSAqIEBkZXByZWNhdGVkIHVzZSBKYXZhQ29udmVudGlvbnMgaW4gdGhlIGpkdCBjb3JlIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUphdmFUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJLy8KLQkJLy8gU3RyaXAgb2ZmIHRoZSB0cmFpbGluZyBhcnJheSBiaXRzLCBpZiBhbnkuCi0JCS8vCi0JCWludCBhID0gdHlwZU5hbWUuaW5kZXhPZignWycpOwotCQlpZiAoYSA+IDApIHsKLQkJCXR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGEpOwotCQl9Ci0JCS8vCi0JCS8vIEFsbG93IHByaW1pdGl2ZXMuCi0JCS8vCi0JCWlmIChpc1ByaW1pdGl2ZUphdmFUeXBlKHR5cGVOYW1lKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgV2ViU2VydmljZVBsdWdpbi5JRCwgMCwgIiIsIG51bGwpOwotCQl9Ci0JCS8vCi0JCS8vIERlZmVyIHRvIEphdmFDb252ZW50aW9ucy4KLQkJLy8KLQkJcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZSh0eXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8Y29kZT50eXBlTmFtZTwvY29kZT4gaXMgYSBKYXZhIHByaW1pdGl2ZQotCSAqIChib29sZWFuLCBjaGFyLCBieXRlLCBzaG9ydCwgaW50LCBsb25nLCBmbG9hdCwgZG91YmxlKS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHR5cGUgbmFtZSBpcyBhIEphdmEgcHJpbWl0aXZlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlSmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiAodHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikgfHwgdHlwZU5hbWUuZXF1YWxzKCJjaGFyIikKLQkJCQl8fCB0eXBlTmFtZS5lcXVhbHMoImJ5dGUiKSB8fCB0eXBlTmFtZS5lcXVhbHMoInNob3J0IikKLQkJCQl8fCB0eXBlTmFtZS5lcXVhbHMoImludCIpIHx8IHR5cGVOYW1lLmVxdWFscygibG9uZyIpCi0JCQkJfHwgdHlwZU5hbWUuZXF1YWxzKCJmbG9hdCIpIHx8IHR5cGVOYW1lLmVxdWFscygiZG91YmxlIikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhbmRsZSBvZiB0aGUgSVByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+LiBOZWl0aGVyIHRoZSBnaXZlbiBwYXRoIG5vciB0aGUgcHJvamVjdCBuZWVkCi0JICogZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4gVGhlIHBhdGggbXVzdCBiZSBhYnNvbHV0ZSwgYW5kIG11c3QgY29uc2lzdCBvZiBhdAotCSAqIGxlYXN0IG9uZSBzZWdtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQW4gSVByb2plY3QgaGFuZGxlIGZvciB0aGUgcHJvamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcGF0aCBkb2VzIG5vdAotCSAqICAgICAgICAgc3BlY2lmeSBhIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0T2YoSVBhdGggYWJzb2x1dGVQYXRoKSB7Ci0JCWlmIChhYnNvbHV0ZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBhYnNvbHV0ZVBhdGguc2VnbWVudCgwKTsKLQkJCWlmIChwcm9qZWN0TmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYWJzb2x1dGVQYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50T2YoSVBhdGggYWJzb2x1dGVQYXRoKXsKLQkJaWYgKGFic29sdXRlUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCVN0cmluZyBjb21wb25lbnROYW1lID0gYWJzb2x1dGVQYXRoLnNlZ21lbnQoMSk7Ci0JCQlpZiAoY29tcG9uZW50TmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gYWJzb2x1dGVQYXRoLnNlZ21lbnQoMCk7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCQlpZiAocHJvamVjdE5hbWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgSmF2YSBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYSBKYXZhIFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgSmF2YSBQcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYSBKYXZhIFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZUphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuICghaXNXZWJQcm9qZWN0KHByb2plY3QpICYmICFpc0FwcENsaWVudFByb2plY3QocHJvamVjdCkgJiYgIWlzRUFSUHJvamVjdChwcm9qZWN0KQotCQkJCSYmICFpc0VKQlByb2plY3QocHJvamVjdCkgJiYgaXNKYXZhUHJvamVjdChwcm9qZWN0KSk7Ci0JCS8qCi0JCSAqIHRyeSB7IFN0cmluZ1tdIG5hdHVyZXMgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0TmF0dXJlSWRzKCk7Ci0JCSAqIHJldHVybiAobmF0dXJlcy5sZW5ndGggPT0gMSAmJgotCQkgKiBuYXR1cmVzWzBdLmVxdWFscyhKYXZhQ29yZS5OQVRVUkVfSUQpKTsgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7IH0KLQkJICogcmV0dXJuIGZhbHNlOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGEgV2ViIFByb2plY3QuCi0JICogTm90ZTogRm9yIGNvbXBvbmVudHM7IHVzZSBKMkVFVXRpbHMuaXNXZWJDb21wb25lbnQoKQotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYSBXZWIgUHJvamVjdC4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNXZWIgPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0JCQkgIC8vaXNXZWIgPSBXZWJBcnRpZmFjdEVkaXQuaXNWYWxpZFdlYk1vZHVsZSh3YmNzWzBdKTsKLQkJICB9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGV4KXsKLQkJCS8vIGhhbmRsZSBleGNlcHRpb24KLQkJfQotCQlmaW5hbGx5ewotCQkJaWYgKG1jIT1udWxsKQotCQkJCW1jLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXJldHVybiBpc1dlYjsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBmb3IgY29tcG9uZW50czsgdXNlIEoyRUVVdGlscy5pc0VBUkNvbXBvbmVudCgpCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VBUlByb2plY3QoSVByb2plY3QgcHJvamVjdCl7Ci0JCWJvb2xlYW4gaXNFQVIgPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0JCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJICAvL2VhckVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZCh3YmNzWzBdKTsKLQkJCSAgaWYgKGVhckVkaXQhPW51bGwpewotCQkJCWlzRUFSID0gdHJ1ZTsKLQkJCSAgfQotCQkJfQotCQkJZmluYWxseXsKLQkJCQlpZiAoZWFyRWRpdCE9bnVsbCkKLQkJCQkJZWFyRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCSAgfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBleCl7fQotCQlmaW5hbGx5ewotCQkJaWYgKG1jIT1udWxsKQotCQkJCW1jLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGlzRUFSOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGFuIEVKQiAxLjEgb3IgRUpCIDIuMAotCSAqIFByb2plY3QuCi0JICogTm90ZTogZm9yIGNvbXBvbmVudHMsIHVzZSBKMkVFVXRpbHMuaXNFSkJDb21wb25lbnQKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgVGhlIHByb2plY3QuCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBwcm9qZWN0IGlzIGFuIEVKQiAxLjEgb3IgYW4gRUpCIDIuMCBQcm9qZWN0LgotICAgKiAKLSAgICogQGRlcHJlY2F0ZWQKLSAgICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNFSkIgPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0JCQlFSkJBcnRpZmFjdEVkaXQgZWpiRWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJICAvL2VqYkVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZCh3YmNzWzBdKTsKLQkJCSAgaWYgKGVqYkVkaXQhPW51bGwpewotCQkJCWlzRUpCID0gdHJ1ZTsKLQkJCSAgfQotCQkJfQotCQkJZmluYWxseXsKLQkJCQlpZiAoZWpiRWRpdCE9bnVsbCkKLQkJCQkJZWpiRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCSAgfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBleCl7fQotCQlmaW5hbGx5ewotCQkJaWYgKG1jIT1udWxsKQotCQkJCW1jLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGlzRUpCOwkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxjb2RlPnByb2plY3Q8L2NvZGU+IGlzIGFuIEFwcGxpY2F0aW9uIENsaWVudAotCSAqIFByb2plY3QuCi0JICogTm90ZTogZm9yIGNvbXBvbmVudHMsIHVzZSBKMkVFVXRpbHMuaXNBcHBDbGllbnRDb21wb25lbnQoKQotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHByb2plY3QgaXMgYW4gQXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKLSAgICogCi0gICAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXBwQ2xpZW50UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaXNBcHBDbGllbnQgPSBmYWxzZTsKLQkJU3RydWN0dXJlRWRpdCBtYyA9IG51bGw7Ci0JCXRyeSB7Ci0JCSAgbWMgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkgIFdvcmtiZW5jaENvbXBvbmVudFtdIHdiY3MgPSBtYy5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCSAgaWYgKHdiY3MubGVuZ3RoIT0wKSB7Ci0JCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgYXBwQ2xpZW50RWRpdCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vYXBwQ2xpZW50RWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKHdiY3NbMF0pOwotCQkJICBpZiAoYXBwQ2xpZW50RWRpdCE9bnVsbCl7Ci0JCQkJICBpc0FwcENsaWVudCA9IHRydWU7Ci0JCQkgIH0KLQkJCX0KLQkJCWZpbmFsbHl7Ci0JCQkJaWYgKGFwcENsaWVudEVkaXQhPW51bGwpCi0JCQkJCWFwcENsaWVudEVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkgIH0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZXgpe30KLQkJZmluYWxseXsKLQkJCWlmIChtYyE9bnVsbCkKLQkJCQltYy5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBpc0FwcENsaWVudDsJCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgYSBiaXRtYXNrLgotCSAqIFJlbGV2YW50IGJpdG1hc2sgdmFsdWVzIGFyZToKLQkgKiA8b2w+Ci0JICogPGxpPntAbGluayAjUFJPSkVDVF9UWVBFX0pBVkEgUFJPSkVDVF9UWVBFX0pBVkF9Ci0JICogPGxpPntAbGluayAjUFJPSkVDVF9UWVBFX1dFQiBQUk9KRUNUX1RZUEVfV0VCfQotCSAqIDxsaT57QGxpbmsgI1BST0pFQ1RfVFlQRV9FSkIgUFJPSkVDVF9UWVBFX0VKQn0KLQkgKiA8bGk+e0BsaW5rICNQUk9KRUNUX1RZUEVfTk9ORSBQUk9KRUNUX1RZUEVfTk9ORX0KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSB0eXBlIGJpdG1hc2sgb2YgdGhlIHByb2plY3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldENvbXBvbmVudFR5cGUKLQkgKi8gCi0JcHVibGljIHN0YXRpYyBieXRlIGdldFByb2plY3RUeXBlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJYnl0ZSBwcm9qZWN0VHlwZSA9IFBST0pFQ1RfVFlQRV9OT05FOwotCQlpZiAoUmVzb3VyY2VVdGlscy5pc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlwcm9qZWN0VHlwZSB8PSBQUk9KRUNUX1RZUEVfSkFWQTsKLQkJfQotCQlpZiAoUmVzb3VyY2VVdGlscy5pc1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCXByb2plY3RUeXBlIHw9IFBST0pFQ1RfVFlQRV9XRUI7Ci0JCX0KLQkJaWYgKFJlc291cmNlVXRpbHMuaXNFSkJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlwcm9qZWN0VHlwZSB8PSBQUk9KRUNUX1RZUEVfRUpCOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBpZCBhcyBkZWZpbmVkIGluIElNb2R1bGVDb25zdGFudHMKLQkgKiBpLmUuIElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUgPSAianN0LndlYiIKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JCXJldHVybiBnZXRDb21wb25lbnRUeXBlKGNvbXApOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZQotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpewotCQlyZXR1cm4gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGVJZCgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBub3QgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2plY3RUeXBlQXNTdHJpbmcoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoUmVzb3VyY2VVdGlscy5pc0VKQlByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfRUpCIik7Ci0JCWVsc2UgaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1dFQiIpOwotCQllbHNlIGlmIChSZXNvdXJjZVV0aWxzLmlzSmF2YVByb2plY3QocHJvamVjdCkpCi0JCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfSkFWQSIpOwotCQllbHNlCi0JCQlyZXR1cm4gIiI7Ci0JfQotCQotCi0JLyoqCi0JICogUmV0dXJucyBXZWJNb2R1bGUgRGVwbG95YWJsZSBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgYW4KLQkgKiA8Y29kZT5JRGVwbG95YWJsZTwvY29kZT4sIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gV2ViTW9kdWxlIERlcGxveWFibGUgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IG9yIG51bGwgaWYgdGhlCi0JICogICAgICAgICBwcm9qZWN0IGhhcyBubyBXZWIgbmF0dXJlLgotCSAqIEBkZXByZWNhdGVkICBzZWUgU2VydmVyVXRpbHMuZ2V0TW9kdWxlKElQcm9qZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2plY3QpOwotCQlpZiAobW9kdWxlcyE9bnVsbCAmJiBtb2R1bGVzLmxlbmd0aCE9MCkgewotCQkJcmV0dXJuIG1vZHVsZXNbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGQgb3V0cHV0IGxvY2F0aW9uIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyBhbgotCSAqIDxjb2RlPklQYXRoPC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUuCi0JICogaS5lLiBXUFwuZGVwbG95YWJsZXNcd2ViTW9kdWxlXFdFQi1JTkZcY2xhc3NlcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBidWlsZCBvdXRwdXQgbG9jYXRpb24gb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IG9yIG51bGwKLQkgKiAgICAgICAgIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBKYXZhIG5hdHVyZS4KLQkgKiBAZGVwcmVjYXRlZCBub3QgdXNlZCAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFPdXRwdXRMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQYXRoIG91dHB1dExvY2F0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJb3V0cHV0TG9jYXRpb24gPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQlsb2cubG9nKExvZy5JTkZPLCA1MDMyLCBSZXNvdXJjZVV0aWxzLmNsYXNzLCAiZ2V0SmF2YU91dHB1dExvY2F0aW9uIiwKLQkJCQkicHJvamVjdD0iICsgcHJvamVjdCArICIsb3V0cHV0TG9jYXRpb249IiArIG91dHB1dExvY2F0aW9uKTsKLQotCQlyZXR1cm4gb3V0cHV0TG9jYXRpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBidWlsZCBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFzIGFuCi0JICogPGNvZGU+SVBhdGg8L2NvZGU+LCBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGVpdGhlciBoYXMgbm8gSmF2YSBuYXR1cmUKLQkgKiBvciBpZiB0aGUgcHJvamVjdCdzIGJ1aWxkIGNsYXNzcGF0aCBjb250YWlucyBubyBmb2xkZXJzIGxvY2FsIHRvIHRoZQotCSAqIHByb2plY3QuIElmIHRoZSBwcm9qZWN0IGhhcyBtb3JlIHRoYW4gb25lIG9mIGl0cyBvd24gZm9sZGVycyBvbiB0aGUgYnVpbGQKLQkgKiBjbGFzc3BhdGgsIHRoZW4gb25lIG9mIHRoZW0gaXMgY2hvc2VuIGFyYml0cmFyaWx5IGFzIHRoZSBidWlsZCBzb3VyY2UKLQkgKiBsb2NhdGlvbi4gVG8gd29yayB3aXRoIGFsbCBlbnRyaWVzIG9uIHRoZSBidWlsZCBjbGFzc3BhdGgsIHVzZQotCSAqIHtAbGluayAjZ2V0SmF2YVBhY2thZ2VGcmFnbWVudFJvb3RzIGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cygpfW9yCi0JICoge0BsaW5rICNnZXRKYXZhQ2xhc3NwYXRoIGdldEphdmFDbGFzc3BhdGgoKX0uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gQSBidWlsZCBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IG9yIG51bGwgaWYKLQkgKiAgICAgICAgIHRoZSBwcm9qZWN0IGhhcyBubyBKYXZhIG5hdHVyZSBvciBpZiB0aGUgcHJvamVjdCdzIGJ1aWxkCi0JICogICAgICAgICBjbGFzc3BhdGggY29udGFpbnMgbm8gZm9sZGVycyBsb2NhbCB0byB0aGUgcHJvamVjdC4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFTb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQYXRoIHNvdXJjZUxvY2F0aW9uID0gbnVsbDsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBmcmFnbWVudFJvb3RzID0gZ2V0SmF2YVBhY2thZ2VGcmFnbWVudFJvb3RzKHByb2plY3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50Um9vdHMubGVuZ3RoICYmIHNvdXJjZUxvY2F0aW9uID09IG51bGw7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJUmVzb3VyY2UgZnJhZ21lbnRSb290ID0gZnJhZ21lbnRSb290c1tpXQotCQkJCQkJLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJCWlmIChmcmFnbWVudFJvb3QgIT0gbnVsbAotCQkJCQkJJiYgKGZyYWdtZW50Um9vdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCQkJJiYgKGZyYWdtZW50Um9vdC5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpKSB7Ci0JCQkJCXNvdXJjZUxvY2F0aW9uID0gZnJhZ21lbnRSb290LmdldEZ1bGxQYXRoKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotCQlsb2cubG9nKExvZy5JTkZPLCA1MDMwLCBSZXNvdXJjZVV0aWxzLmNsYXNzLCAiZ2V0SmF2YVNvdXJjZUxvY2F0aW9uIiwKLQkJCQkicHJvamVjdD0iICsgcHJvamVjdCArICIsc291cmNlTG9jYXRpb249IiArIHNvdXJjZUxvY2F0aW9uKTsKLQkJCi0JCXJldHVybiBzb3VyY2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAiSmF2YVNvdXJjZSIgZm9sZGVyCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gY29tcE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhU291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBOYW1lKXsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCwgY29tcE5hbWUpOwotCQlyZXR1cm4gZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKGNvbXBvbmVudCk7CQkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmFTb3VyY2UgbG9jYXRpb24gZm9sZGVyCi0JICogQHBhcmFtIGNvbXAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhU291cmNlTG9jYXRpb24oSVZpcnR1YWxDb21wb25lbnQgY29tcCl7Ci0JCWlmIChjb21wIT1udWxsKXsKLQkJICAgSVZpcnR1YWxGb2xkZXIgZm9sZGVyID0gY29tcC5nZXRGb2xkZXIobmV3IFBhdGgoIi9XRUItSU5GL2NsYXNzZXMiKSk7Ci0JCSAgIHJldHVybiBmb2xkZXIuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmFTb3VyY2UgbG9jYXRpb25zIGluIGVhY2ggcHJvamVjdAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGhbXSBnZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKElQcm9qZWN0IHByb2plY3QpIHsKLQkJVmVjdG9yIHBhdGhWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZnJhZ21lbnRSb290cyA9IGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290cyhwcm9qZWN0KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50Um9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSVJlc291cmNlIGZyYWdtZW50Um9vdCA9IGZyYWdtZW50Um9vdHNbaV0uZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQkJaWYgKGZyYWdtZW50Um9vdCAhPSBudWxsICYmIChmcmFnbWVudFJvb3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJCSYmIChmcmFnbWVudFJvb3QuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSkgewotCQkJCQlwYXRoVmVjdG9yLmFkZChmcmFnbWVudFJvb3QuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElQYXRoW10pIHBhdGhWZWN0b3IudG9BcnJheShuZXcgUGF0aFtwYXRoVmVjdG9yLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVBhdGhbXSBnZXRBbGxKYXZhU291cmNlTG9jYXRpb25zKElWaXJ0dWFsQ29tcG9uZW50W10gY29tcG9uZW50cykgewotCQkvL1RPRE8KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBidWlsZCBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPgotCSAqIGFzIGFuIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBlaXRoZXIKLQkgKiBoYXMgbm8gSmF2YSBuYXR1cmUgb3IgaWYgdGhlIHByb2plY3QncyBidWlsZCBjbGFzc3BhdGggY29udGFpbnMgbm8KLQkgKiBmb2xkZXJzIGxvY2FsIHRvIHRoZSBwcm9qZWN0LiBJZiB0aGUgcHJvamVjdCBoYXMgbW9yZSB0aGFuIG9uZSBvZiBpdHMgb3duCi0JICogZm9sZGVycyBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoLCB0aGVuIG9uZSBvZiB0aGVtIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhcwotCSAqIHRoZSBidWlsZCBzb3VyY2UgbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gQSBidWlsZCBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290IG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPgotCSAqICAgICAgICAgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gSmF2YSBuYXR1cmUgb3IgaWYgdGhlIHByb2plY3QncwotCSAqICAgICAgICAgYnVpbGQgY2xhc3NwYXRoIGNvbnRhaW5zIG5vIGZvbGRlcnMgbG9jYWwgdG8gdGhlIHByb2plY3QuCi0JICogICAgICAgICAKLQkgKiBAZGVwcmVjYXRlZCBub3QgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0SmF2YVNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QoSVByb2plY3QgcHJvamVjdCkgewotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gbnVsbDsKLQkJSVBhdGggamF2YVNvdXJjZUxvY2F0aW9uID0gZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKHByb2plY3QpOwotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290ID0gamF2YVByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QoamF2YVNvdXJjZUxvY2F0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyBhbgotCSAqIGFycmF5IG9mIDxjb2RlPklQYWNrYWdlRnJhZ21lbnRSb290PC9jb2RlPiBvYmplY3RzLiBJZiB0aGUgcHJvamVjdCBoYXMKLQkgKiBubyBKYXZhIG5hdHVyZSB0aGVuIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIG9mIGxlbmd0aCB6ZXJvLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3RzIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0SmF2YVBhY2thZ2VGcmFnbWVudFJvb3RzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0Ci0JCQkJCQkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdHM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBidWlsZCBjbGFzc3BhdGggZW50cmllcyBvZiB0aGUgPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgYW4KLQkgKiBhcnJheSBvZiA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IG9iamVjdHMuIElmIHRoZSBwcm9qZWN0IGhhcyBubwotCSAqIEphdmEgbmF0dXJlIHRoZW4gdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgb2YgbGVuZ3RoIHplcm8uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIGNsYXNzcGF0aCBlbnRyaWVzIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBub3QgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0SmF2YUNsYXNzcGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQlyZXR1cm4gY2xhc3NwYXRoRW50cmllczsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBjb21wb25lbnROYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBnZXRXZWJDb21wb25lbnRTZXJ2ZXJSb290KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wb25lbnROYW1lKXsKLQkJCi0gICAgICBJRm9sZGVyIHdlYk1vZHVsZVNlcnZlclJvb3QgPSBudWxsOwotICAgICAgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCBjb21wb25lbnROYW1lKTsKLSAgICAgIGlmICh2Yy5leGlzdHMoKSkKLSAgICAgICAgd2ViTW9kdWxlU2VydmVyUm9vdCA9IFN0cnVjdHVyZUVkaXQuZ2V0T3V0cHV0Q29udGFpbmVyUm9vdCh2Yyk7Ci0KLQkgIHJldHVybiB3ZWJNb2R1bGVTZXJ2ZXJSb290OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBvZiB0aGUKLQkgKiBwcm9qZWN0IGluIGEgc2VydmVyIGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUgb3IKLQkgKiBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqICAgICAgICAgbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0V2ViQ29tcG9uZW50VVJMKC4uKSB3aGljaCBiZWxvbmdzIGluIFNlcnZlclV0aWxzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViUHJvamVjdFVSTChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgSVNlcnZlciBzZXJ2ZXIpIHsKLQotCQlTdHJpbmcgd2ViUHJvamVjdFVSTCA9IG51bGw7Ci0JCUlNb2R1bGUgbW9kdWxlID0gZ2V0TW9kdWxlKHByb2plY3QpOwotCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXIgc2VydmVySW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUobW9kdWxlLAotCQkJCQlzZXJ2ZXJGYWN0b3J5SWQsIHNlcnZlciwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlpZiAoc2VydmVySW5zdGFuY2UgIT0gbnVsbCkgewotLy8JCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBzZXJ2ZXJJbnN0YW5jZS5nZXREZWxlZ2F0ZSgpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZSk7Ci0JCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKXNlcnZlckluc3RhbmNlLmdldEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzKSkuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGUpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcyA9IHVybC50b1N0cmluZygpOwotCQkJCQl3ZWJQcm9qZWN0VVJMID0gKHMuZW5kc1dpdGgoIi8iKSA/IHMuc3Vic3RyaW5nKDAsIHMKLQkJCQkJCQkubGVuZ3RoKCkgLSAxKSA6IHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0JCWxvZy5sb2coTG9nLklORk8sIDUwMzYsIFJlc291cmNlVXRpbHMuY2xhc3MsICJnZXRXZWJQcm9qZWN0VVJMIiwKLQkJCQkicHJvamVjdD0iICsgcHJvamVjdCArICIsd2ViUHJvamVjdFVSTD0iICsgd2ViUHJvamVjdFVSTCk7Ci0KLQkJcmV0dXJuIHdlYlByb2plY3RVUkw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcmdlZCBVUkwgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QKLQkgKiBvZiB0aGUgcHJvamVjdCBpbiBhIHNlcnZlciBpbnN0YW5jZSBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBXZWIKLQkgKiBuYXR1cmUgb3IgaGFzIG5vIGFzc29jaWF0aW9uIHRvIGEgc2VydmVyIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiBUaGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBVUkwgb3IgbnVsbCBpZiB0aGUgcHJvamVjdCBoYXMgbm8gV2ViCi0JICogICAgICAgICBuYXR1cmUgb3IgaGFzIG5vIGFzc29jaWF0aW9uIHRvIGEgc2VydmVyIGluc3RhbmNlLgotCSAqIEBkZXByZWNhdGVkICBub3QgdXNlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcmdlZFdlYlByb2plY3RVUkwoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCwgSVNlcnZlciBzZXJ2ZXIpewotICAJCi0gIAlTdHJpbmcgd2ViUHJvamVjdFVSTCA9IG51bGw7Ci0gIAlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShwcm9qZWN0KTsKLSAgCWlmIChtb2R1bGUgIT0gbnVsbCkKLSAgCXsKLSAgCQkvL0lTZXJ2ZXIgc2VydmVySW5zdGFuY2UgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJGb3JNb2R1bGUobW9kdWxlLAotCQkgIC8vIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgCQlpZiAoc2VydmVyICE9IG51bGwpCi0gIAkJewotICAJCQlTdHJpbmcgaG9zdG5hbWUgPSBzZXJ2ZXIuZ2V0SG9zdCgpOwotCi0gIAkJCS8vIGdldCBTZXJ2ZXJQb3J0Ci0gIAkJCWludCBwb3J0TnVtYmVyID0gMDsKLQotICAJICAgICAgICAgIFNlcnZlclBvcnRbXSBwb3J0cyA9IHNlcnZlci5nZXRTZXJ2ZXJQb3J0cyhudWxsKTsKLSAgCSAgICAgICAgICBTZXJ2ZXJQb3J0IHBvcnQgPSBudWxsOwotICAJICAgICAgICAgIGZvciAoaW50IGl0ID0gMDsgaXQ8cG9ydHMubGVuZ3RoOyBpdCsrKQotICAJICAgICAgICAgIHsKLSAgCSAgICAgICAgICAgIFNlcnZlclBvcnQgcCA9IHBvcnRzW2l0XTsKLSAgCSAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbCA9IHAuZ2V0UHJvdG9jb2woKTsKLSAgCSAgICAgICAgICAgIGlmIChwcm90b2NvbCAhPSBudWxsICYmIHByb3RvY29sLnRyaW0oKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiaHR0cCIpKQotICAJICAgICAgICAgICAgewotICAJICAgICAgICAgICAgICBwb3J0ID0gcDsKLSAgCSAgICAgICAgICAgICAgcG9ydE51bWJlciA9IHAuZ2V0UG9ydCgpOwotICAJICAgICAgICAgICAgICBicmVhazsKLSAgCSAgICAgICAgICAgIH0KLSAgCSAgICAgICAgICB9Ci0gIAkgICAgICAgICAgCi0gIAkgICAgICAgIAotICAJICAgICAgICAKLSAgCSAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0gIAkgICAgICAgIHRyeSB7Ci0gIAkgICAgICAgIAl1cmwgPSBuZXcgVVJMKCJodHRwIiwgaG9zdG5hbWUsIHBvcnROdW1iZXIsICIiKTsKLSAgCSAgICAgICAgfQotICAJICAgICAgICBjYXRjaChFeGNlcHRpb24gZSl7Ci0gIAkgICAgICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAJICAgICAgICB9Ci0KLSAgCSAgICAgICAgCi0gIAkJCS8vVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBzZXJ2ZXJJbnN0YW5jZS5nZXREZWxlZ2F0ZSgpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZSk7Ci0gIAkJCQotICAJCQlpZiAodXJsICE9IG51bGwpCi0gIAkJCXsKLSAgCQkJCVN0cmluZyBzID0gdXJsLnRvU3RyaW5nKCk7Ci0gIAkJCQl3ZWJQcm9qZWN0VVJMID0gcyArICIvIitwcm9qZWN0LmdldE5hbWUoKTsKLSAgCQkJCS8vd2ViUHJvamVjdFVSTCA9IChzLmVuZHNXaXRoKCIvIikgPyBzLnN1YnN0cmluZygwLHMubGVuZ3RoKCktMSkgOiBzKTsKLSAgCQkJfQotICAJCX0KLSAgCX0KLSAJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0gICAgbG9nLmxvZyhMb2cuSU5GTywgNTAzNiwgUmVzb3VyY2VVdGlscy5jbGFzcywgImdldFdlYlByb2plY3RVUkwiLCAicHJvamVjdD0iK3Byb2plY3QrIix3ZWJQcm9qZWN0VVJMPSIrd2ViUHJvamVjdFVSTCk7Ci0gIAlyZXR1cm4gd2ViUHJvamVjdFVSTDsgIAkKLSAgfQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBvZiB0aGUKLQkgKiBwcm9qZWN0IGluIGEgc2VydmVyIGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUgb3IKLQkgKiBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqICAgICAgICAgbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKiBAZGVwcmVjYXRlZCBiZWxvbmdzIGluIFNlcnZlclV0aWxzCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJQcm9qZWN0VVJMKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nIHdlYlByb2plY3RVUkwgPSBudWxsOwotCQlJTW9kdWxlIG1vZHVsZSA9IGdldE1vZHVsZShwcm9qZWN0KTsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlJU2VydmVyIHNlcnZlckluc3RhbmNlID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyRm9yTW9kdWxlKG1vZHVsZSk7Ci0JCQlpZiAoc2VydmVySW5zdGFuY2UgIT0gbnVsbCkgewotCQkJCVVSTCB1cmwgPSAoKElVUkxQcm92aWRlcilzZXJ2ZXJJbnN0YW5jZS5nZXRBZGFwdGVyKElVUkxQcm92aWRlci5jbGFzcykpLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlKTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHMgPSB1cmwudG9TdHJpbmcoKTsKLQkJCQkJd2ViUHJvamVjdFVSTCA9IChzLmVuZHNXaXRoKCIvIikgPyBzLnN1YnN0cmluZygwLCBzCi0JCQkJCQkJLmxlbmd0aCgpIC0gMSkgOiBzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTG9nIGxvZyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0JCWxvZy5sb2coTG9nLklORk8sIDUwMzcsIFJlc291cmNlVXRpbHMuY2xhc3MsICJnZXRXZWJQcm9qZWN0VVJMIiwKLQkJCQkicHJvamVjdD0iICsgcHJvamVjdCArICIsd2ViUHJvamVjdFVSTD0iICsgd2ViUHJvamVjdFVSTCk7Ci0KLQkJcmV0dXJuIHdlYlByb2plY3RVUkw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgc2hvdWxkIGJlIGluIFNlcnZlclV0aWxzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RlZFdlYlByb2plY3RVUkwoSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcgdXJsID0gZ2V0V2ViUHJvamVjdFVSTChwcm9qZWN0KTsKLQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZ0J1ZmZlciBlbmNvZGVkVVJMID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWVuY29kZWRVUkwuYXBwZW5kKHVybC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGN0eHRSb290ID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsLnN1YnN0cmluZyhpbmRleCArIDEsIHVybC5sZW5ndGgoKSksICJVVEYtOCIpOwotCQkJCQlpbnQgcGx1c0luZGV4ID0gY3R4dFJvb3QuaW5kZXhPZignKycpOwotCQkJCQl3aGlsZSAocGx1c0luZGV4ICE9IC0xKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlzYi5hcHBlbmQoY3R4dFJvb3Quc3Vic3RyaW5nKDAsIHBsdXNJbmRleCkpOwotCQkJCQkJc2IuYXBwZW5kKCIlMjAiKTsKLQkJCQkJCXNiLmFwcGVuZChjdHh0Um9vdC5zdWJzdHJpbmcocGx1c0luZGV4ICsgMSwgY3R4dFJvb3QKLQkJCQkJCQkubGVuZ3RoKCkpKTsKLQkJCQkJCWN0eHRSb290ID0gc2IudG9TdHJpbmcoKTsKLQkJCQkJCXBsdXNJbmRleCA9IGN0eHRSb290LmluZGV4T2YoJysnKTsKLQkJCQkJfQotCQkJCQllbmNvZGVkVVJMLmFwcGVuZChjdHh0Um9vdCk7Ci0JCQkJfWNhdGNoIChJT0V4Y2VwdGlvbiBpbyl7Ci0JCQkJCS8vaGFuZGxlciBleGNlcHRpb24KLQkJCQl9CQkJCQotCQkJCXVybCA9IGVuY29kZWRVUkwudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IG9mIGEgSmF2YSByZXNvdXJjZSwgcmV0dXJucyB0aGUKLQkgKiBwYWNrYWdlIG5hbWUgb2YgdGhlIHJlc291cmNlIG9yIG51bGwgaWYgdGhlIHJlc291cmNlIGlzIG5vdCBwcm9wZXJseQotCSAqIGxvY2F0ZWQgaW4gYSBwcm9qZWN0IG9yIGZvbGRlciBvbiB0aGUgYnVpbGQgY2xhc3NwYXRoIG9yIHRoYXQgaXMgdGhlCi0JICogYnVpbGQgb3V0cHV0IHBhdGguCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIEphdmEgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBKYXZhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEphdmFSZXNvdXJjZVBhY2thZ2VOYW1lKElQYXRoIGFic29sdXRlUGF0aCkgewotCQl0cnkgewotCQkJSVBhdGggamF2YUZvbGRlclBhdGggPSBhYnNvbHV0ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RPZihhYnNvbHV0ZVBhdGgpOwotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gamF2YVByb2plY3QKLQkJCQkJCS5maW5kUGFja2FnZUZyYWdtZW50KGphdmFGb2xkZXJQYXRoKTsKLQkJCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQl9Ci0JCQkJSVBhdGggb3V0cHV0UGF0aCA9IGdldEphdmFPdXRwdXRMb2NhdGlvbihwcm9qZWN0KTsKLQkJCQlpZiAob3V0cHV0UGF0aC5pc1ByZWZpeE9mKGphdmFGb2xkZXJQYXRoKSkgewotCQkJCQlJUGF0aCBqYXZhUGFja2FnZVBhdGggPSBqYXZhRm9sZGVyUGF0aAotCQkJCQkJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKG91dHB1dFBhdGguc2VnbWVudENvdW50KCkpOwotCQkJCQlyZXR1cm4gamF2YVBhY2thZ2VQYXRoLmlzRW1wdHkoKSA/IG51bGwgOiBqYXZhUGFja2FnZVBhdGgKLQkJCQkJCQkudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gb2YgYSBKYXZhIHJlc291cmNlLCByZXR1cm5zIHRoZQotCSAqIHBhY2thZ2UgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYXMgYSByZWxhdGl2ZSBwYXRobmFtZSBvciBudWxsIGlmIHRoZQotCSAqIHJlc291cmNlIGlzIG5vdCBwcm9wZXJseSBsb2NhdGVkIGluIGEgcHJvamVjdCBvciBmb2xkZXIgb24gdGhlIGJ1aWxkCi0JICogY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBKYXZhIHJlc291cmNlLgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgSmF2YSByZXNvdXJjZSBhcyBhIHJlbGF0aXZlIHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlUGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gUmVzb3VyY2VVdGlscwotCQkJCS5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlTmFtZShhYnNvbHV0ZVBhdGgpOwotCQlyZXR1cm4gKHBhY2thZ2VOYW1lID09IG51bGwgPyBudWxsIDogbmV3IFBhdGgocGFja2FnZU5hbWUucmVwbGFjZSgnLicsCi0JCQkJSVBhdGguU0VQQVJBVE9SKSkpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IG9mIGEgSmF2YSByZXNvdXJjZSwgcmV0dXJucyB0aGUKLQkgKiBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IGlzIG9uIHRoZSBidWlsZCBjbGFzc3BhdGggb3IKLQkgKiBpcyB0aGUgYnVpbGQgb3V0cHV0IHBhdGggYW5kIHRoYXQgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBKYXZhCi0JICogcmVzb3VyY2UsIG9yIG51bGwgaWYgbm8gc3VjaCBwcm9qZWN0IG9yIGZvbGRlciBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIEphdmEgcmVzb3VyY2UuCi0JICogQHJldHVybiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcHJvamVjdCBvciBmb2xkZXIgY29udGFpbmluZyB0aGUgZnVsbHkKLQkgKiAgICAgICAgIHF1YWxpZmllZCBKYXZhIHJlc291cmNlLgotCSAqIEBkZXByZWNhdGVkIG5vdCB1c2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUmVzb3VyY2VSb290UGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0T2YoYWJzb2x1dGVQYXRoKTsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwZnJzID0gamF2YVByb2plY3QKLQkJCQkJCS5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGZycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUmVzb3VyY2UgZnJhZ21lbnRSb290ID0gcGZyc1tpXS5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJCQkJaWYgKGZyYWdtZW50Um9vdCAhPSBudWxsKSB7Ci0JCQkJCQlJUGF0aCBmcmFnbWVudFBhdGggPSBmcmFnbWVudFJvb3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCWlmIChmcmFnbWVudFBhdGguaXNQcmVmaXhPZihhYnNvbHV0ZVBhdGgpKSB7Ci0JCQkJCQkJcmV0dXJuIGZyYWdtZW50UGF0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlJUGF0aCBvdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dExvY2F0aW9uKHByb2plY3QpOwotCQkJCWlmIChvdXRwdXRQYXRoLmlzUHJlZml4T2YoYWJzb2x1dGVQYXRoKSkgewotCQkJCQlyZXR1cm4gb3V0cHV0UGF0aDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBhbiBVUkwgKEhUVFAgb3IgRklMRSkgdG8gYW4gRWNsaXBzZSByZXNvdXJjZSwgcmV0dXJuaW5nIHRoZQotCSAqIFVSTCBzdHJpbmcgaWYgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiBBIHZhbHVlIG9mIG51bGwgd2lsbAotCSAqIGRlZmluaXRlbHkgYmUgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbm90IG1ldDoKLQkgKiA8b2w+Ci0JICogPGxpPlRoZSBhYnNvbHV0ZSBwYXRoIGJlZ2lucyB3aXRoIGEgV2ViIFByb2plY3QuCi0JICogPGxpPlRoZSBsZWFkaW5nIHBvcnRpb24gb2YgdGhlIGFic29sdXRlIHBhdGggbWF0Y2hlcyB0aGUgcGF0aCBvZiB0aGUKLQkgKiBjb250YWluZXIgcmV0dXJuZWQgYnkgeyNsaW5rICNnZXRXZWJNb2R1bGVTZXJ2ZXJSb290Ci0JICogZ2V0V2ViTW9kdWxlU2VydmVyUm9vdH0gZm9yIHRoZSBwcm9qZWN0LgotCSAqIDxsaT5UaGUgcGF0aCBkb2VzIG5vdCBsZWFkIHRvIHRoZSBXRUItSU5GIGZvbGRlciBvciBhbnkgZGVzY2VuZGVudAotCSAqIHRoZXJlb2YuCi0JICogPGxpPlRoZSBXZWIgUHJvamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZXhwbGljaXQgb3IgZGVmYXVsdCBzZXJ2ZXIKLQkgKiBpbnN0YW5jZS4KLQkgKiA8L29sPgotCSAqIAotCSAqIEBwYXJhbSBhYnNvbHV0ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXNvdXJjZS4KLQkgKiBAcmV0dXJuIFRoZSBVUkwgb2YgdGhlIGZpbGUsIG9yIG51bGwgaWYgbm8gVVJMIGNhbiBiZSBkZXRlcm1pbmVkLgotCSAqIEBkZXByZWNhdGVkIG5vdCB1c2VkCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUkxGcm9tUGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgsCi0vLwkJCVN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIElTZXJ2ZXIgc2VydmVyKSB7Ci0vLwkJcmV0dXJuIGdldFVSTEZyb21QYXRoKGFic29sdXRlUGF0aCwgZ2V0V2ViUHJvamVjdFVSTCgKLS8vCQkJCWdldFByb2plY3RPZihhYnNvbHV0ZVBhdGgpLCBzZXJ2ZXJGYWN0b3J5SWQsIHNlcnZlcikpOwotLy8JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFic29sdXRlUGF0aAotCSAqIEBwYXJhbSB3ZWJQcm9qZWN0VVJMCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIG5vdCB1c2VkCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUkxGcm9tUGF0aChJUGF0aCBhYnNvbHV0ZVBhdGgsIFN0cmluZyB3ZWJQcm9qZWN0VVJMKSB7Ci0vLwkJU3RyaW5nQnVmZmVyIHVybCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdE9mKGFic29sdXRlUGF0aCk7Ci0vLwkJSUNvbnRhaW5lciB3ZWJNb2R1bGVTZXJ2ZXJSb290ID0gZ2V0V2ViTW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KTsKLS8vCQlpZiAod2ViTW9kdWxlU2VydmVyUm9vdCAhPSBudWxsKSB7Ci0vLwkJCUlQYXRoIHdlYk1vZHVsZVNlcnZlclJvb3RQYXRoID0gd2ViTW9kdWxlU2VydmVyUm9vdC5nZXRGdWxsUGF0aCgpOwotLy8JCQlpZiAod2ViTW9kdWxlU2VydmVyUm9vdFBhdGguaXNQcmVmaXhPZihhYnNvbHV0ZVBhdGgpKSB7Ci0vLwkJCQlpbnQgbnVtU2VnbWVudCA9IHdlYk1vZHVsZVNlcnZlclJvb3RQYXRoLnNlZ21lbnRDb3VudCgpOwotLy8JCQkJaW50IG51bVNlZ21lbnRGcm9tUGF0aCA9IGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKTsKLS8vCQkJCWlmIChudW1TZWdtZW50RnJvbVBhdGggPiBudW1TZWdtZW50KSB7Ci0vLwkJCQkJU3RyaW5nIG5leHRTZWdtZW50ID0gYWJzb2x1dGVQYXRoLnNlZ21lbnQobnVtU2VnbWVudCk7Ci0vLwkJCQkJLy8gY2hlY2sgaWYgdGhlIHNlZ21lbnQgYWZ0ZXIgdGhlIFdlYk1vZHVsZVNlcnZlclJvb3QgaXMKLS8vCQkJCQkvLyBXRUItSU5GIChpZ25vcmluZyBjYXNlKQotLy8JCQkJCWlmIChuZXh0U2VnbWVudCAhPSBudWxsCSYmICFuZXh0U2VnbWVudC5lcXVhbHNJZ25vcmVDYXNlKCJXRUItSU5GIikpIHsKLS8vCQkJCQkJSVBhdGggcmVsYXRpdmVQYXRoID0gYWJzb2x1dGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMobnVtU2VnbWVudCk7Ci0vLwkJCQkJCWlmICh3ZWJQcm9qZWN0VVJMICE9IG51bGwpCi0vLwkJCQkJCQl1cmwuYXBwZW5kKHdlYlByb2plY3RVUkwpLmFwcGVuZChJUGF0aC5TRVBBUkFUT1IpLmFwcGVuZChyZWxhdGl2ZVBhdGgudG9TdHJpbmcoKSk7Ci0vLwkJCQkJfQotLy8JCQkJfSBlbHNlIGlmIChudW1TZWdtZW50RnJvbVBhdGggPT0gbnVtU2VnbWVudCkKLS8vCQkJCQl1cmwuYXBwZW5kKHdlYlByb2plY3RVUkwpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWlmICh1cmwubGVuZ3RoKCkgPCAxKSB7Ci0vLwkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZSA9IGdldFdvcmtzcGFjZVJvb3QoKTsKLS8vCQkJdXJsLmFwcGVuZChnZXRSZXNvdXJjZVVSSSh3b3Jrc3BhY2UuZ2V0RmlsZShhYnNvbHV0ZVBhdGgpKSk7Ci0vLwkJfQotLy8JCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotLy8JCWxvZy5sb2coTG9nLklORk8sIDUwMzgsIFJlc291cmNlVXRpbHMuY2xhc3MsICJnZXRVUkxGcm9tUGF0aCIsCi0vLwkJCQkiYWJzb2x1dGVQYXRoPSIgKyBhYnNvbHV0ZVBhdGggKyAiLHVybD0iICsgdXJsKTsKLS8vCi0vLwkJcmV0dXJuIHVybC50b1N0cmluZygpOwotLy8JfQotCi0JLyoqCi0JICogQ29waWVzIGEgc2V0IG9mIGZpbGVzIGZyb20gYSBwbHVnaW4ncyBpbnN0YWxsYXRpb24gbG9jYXRpb24gdG8gYSBuYXRpdmUKLQkgKiBkaXJlY3RvcnkuIFRoZSBmaWxlcyBhcmUgbmFtZWQgaW4gYW4gaW5kZXggZmlsZSBsb2NhdGVkIHJlbGF0aXZlIHRvIHRoZQotCSAqIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuIE11c3Qgbm90IGJlIG51bGwuCi0JICogQHBhcmFtIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luPC9jb2RlPiBpbnN0YWxsCi0JICogICAgICAgICAgICBsb2NhdGlvbiwgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gSWYgbnVsbCwgdGhlbiB0aGUKLQkgKiAgICAgICAgICAgIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uIGlzIHRoZSBzb3VyY2UgcGF0aCAoaWUuIG51bGwgaXMKLQkgKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gIi4iKS4KLQkgKiBAcGFyYW0gaW5kZXhQYXRobmFtZQotCSAqICAgICAgICAgICAgQSBmaWxlIGNvbnRhaW5pbmcgYSB3aGl0ZXNwYWNlLWRlbGltaXR0ZWQgbGlzdCBvZiBwYXRobmFtZXMgb2YKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlcyB0byBjb3B5LiBUaGUgcGF0aG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnBsdWdpbiBzb3VyY2VQYXRoPC9jb2RlPi4gTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gdGFyZ2V0UGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG5hdGl2ZSBkaXJlY3RvcnkgdG8gd2hpY2ggdGhlIGZpbGVzCi0JICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgbmFtZWQgaW4KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5pbmRleFBhdGhuYW1lPC9jb2RlPiBmaWxlIGFyZSBwcmVzZXJ2ZWQuIE11c3Qgbm90Ci0JICogICAgICAgICAgICBiZSBudWxsLgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gaW5kaWNhdGluZyBhbiBJTyBlcnJvciBoYXMgb2NjdXJlZC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgY29weUluZGV4ZWRGaWxlc1RvT1MoUGx1Z2luIHBsdWdpbiwgSVBhdGggc291cmNlUGF0aCwKLQkJCUlQYXRoIGluZGV4UGF0aG5hbWUsIElQYXRoIHRhcmdldFBhdGgsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBwbHVnaW4ub3BlblN0cmVhbShpbmRleFBhdGhuYW1lKTsKLQkJRW51bWVyYXRpb24gZmlsZW5hbWVzID0gU3RyaW5nVXRpbHMucGFyc2VGaWxlbmFtZXNGcm9tU3RyZWFtKGlucHV0KTsKLQkJY29weUVudW1lcmF0ZWRGaWxlc1RvT1MocGx1Z2luLCBzb3VyY2VQYXRoLCBmaWxlbmFtZXMsIHRhcmdldFBhdGgsCi0JCQkJcHJvZ3Jlc3NNb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgYSBzZXQgb2YgZmlsZXMgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbiB0byBhIG5hdGl2ZQotCSAqIGRpcmVjdG9yeS4gVGhlIGZpbGVzIGFyZSBuYW1lZCBpbiBhbiBlbnVtZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuIE11c3Qgbm90IGJlIG51bGwuCi0JICogQHBhcmFtIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luPC9jb2RlPiBpbnN0YWxsCi0JICogICAgICAgICAgICBsb2NhdGlvbiwgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gSWYgbnVsbCwgdGhlbiB0aGUKLQkgKiAgICAgICAgICAgIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uIGlzIHRoZSBzb3VyY2UgcGF0aCAoaWUuIG51bGwgaXMKLQkgKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gIi4iKS4KLQkgKiBAcGFyYW0gcGF0aG5hbWVzCi0JICogICAgICAgICAgICBBbiBlbnVtZXJhdGlvbiBvZiBwYXRobmFtZXMgb2YgdGhlIGZpbGVzIHRvIGNvcHkuIFRoZQotCSAqICAgICAgICAgICAgcGF0aG5hbWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luIHNvdXJjZVBhdGg8L2NvZGU+LgotCSAqICAgICAgICAgICAgTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gdGFyZ2V0UGF0aAotCSAqICAgICAgICAgICAgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIG5hdGl2ZSBkaXJlY3RvcnkgdG8gd2hpY2ggdGhlIGZpbGVzCi0JICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lcyBvZiB0aGUgZmlsZXMgbmFtZWQgaW4KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5wYXRobmFtZXM8L2NvZGU+IGVudW1lcmF0aW9uIGFyZSBwcmVzZXJ2ZWQuIE11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSBudWxsLgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBBbiBleGNlcHRpb24gaW5kaWNhdGluZyBhbiBJTyBlcnJvciBoYXMgb2NjdXJlZC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIHZvaWQgY29weUVudW1lcmF0ZWRGaWxlc1RvT1MoUGx1Z2luIHBsdWdpbiwgSVBhdGggc291cmNlUGF0aCwKLQkJCUVudW1lcmF0aW9uIHBhdGhuYW1lcywgSVBhdGggdGFyZ2V0UGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3aGlsZSAocGF0aG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSAoU3RyaW5nKSBwYXRobmFtZXMubmV4dEVsZW1lbnQoKTsKLQkJCWNvcHlGaWxlVG9PUyhwbHVnaW4sIHNvdXJjZVBhdGgsIG5ldyBQYXRoKGZpbGVuYW1lKSwgdGFyZ2V0UGF0aCwKLQkJCQkJcHJvZ3Jlc3NNb25pdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcGllcyBhIGZpbGUgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbiB0byBhIG5hdGl2ZQotCSAqIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuIE11c3Qgbm90IGJlIG51bGwuCi0JICogQHBhcmFtIHNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luPC9jb2RlPiBpbnN0YWxsCi0JICogICAgICAgICAgICBsb2NhdGlvbiwgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gY29weS4gSWYgbnVsbCwgdGhlbiB0aGUKLQkgKiAgICAgICAgICAgIHBsdWdpbiBpbnN0YWxsIGxvY2F0aW9uIGlzIHRoZSBzb3VyY2UgcGF0aCAoaWUuIG51bGwgaXMKLQkgKiAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gIi4iKS4KLQkgKiBAcGFyYW0gcGF0aG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSB0byBjb3B5LiBUaGUgcGF0aG5hbWUgaXMgcmVsYXRpdmUgdG8KLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5wbHVnaW4gc291cmNlUGF0aDwvY29kZT4uIE11c3Qgbm90IGJlIG51bGwuCi0JICogQHBhcmFtIHRhcmdldFBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBuYXRpdmUgZGlyZWN0b3J5IHRvIHdoaWNoIHRoZSBmaWxlCi0JICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZC4gVGhlIHJlbGF0aXZlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIGlzCi0JICogICAgICAgICAgICBwcmVzZXJ2ZWQuIE11c3Qgbm90IGJlIG51bGwuCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGFuIElPIGVycm9yIGhhcyBvY2N1cmVkLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RmlsZVRvT1MoUGx1Z2luIHBsdWdpbiwgSVBhdGggc291cmNlUGF0aCwKLQkJCUlQYXRoIHBhdGhuYW1lLCBJUGF0aCB0YXJnZXRQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlQYXRoIHRhcmdldCA9IHRhcmdldFBhdGguYXBwZW5kKHBhdGhuYW1lKTsKLQkJSVBhdGggc291cmNlID0gc291cmNlUGF0aCA9PSBudWxsID8gcGF0aG5hbWUgOiBzb3VyY2VQYXRoCi0JCQkJLmFwcGVuZChwYXRobmFtZSk7Ci0JCUlucHV0U3RyZWFtIGlucHV0ID0gcGx1Z2luLm9wZW5TdHJlYW0oc291cmNlKTsKLQkJT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldC50b09TU3RyaW5nKCkpOwotCQljb3B5U3RyZWFtKGlucHV0LCBvdXRwdXQpOwotCQlpbnB1dC5jbG9zZSgpOwotCQlvdXRwdXQuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgZGF0YSBmcm9tIG9uZSBzdHJlYW0gdG8gYW5vdGhlci4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIFRoZSBpbnB1dCBzdHJlYW0uCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCBzdHJlYW0uCi0JICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgQW4gZXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwcm9jZXNzaW5nIGVpdGhlciBvZgotCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW1zLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgaW50IGNvcHlTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXQsIE91dHB1dFN0cmVhbSBvdXRwdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgdCA9IDA7Ci0JCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJaW50IG4gPSBpbnB1dC5yZWFkKGJ1ZmZlcik7Ci0JCXdoaWxlIChuID49IDApIHsKLQkJCW91dHB1dC53cml0ZShidWZmZXIsIDAsIG4pOwotCQkJdCArPSBuOwotCQkJbiA9IGlucHV0LnJlYWQoYnVmZmVyKTsKLQkJfQotCQlyZXR1cm4gdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmF0aXZlIGRpcmVjdG9yeSBwYXRoIGVxdWFsIHRvIHRoZSBwYXJlbnQgcG9ydGlvbiBvZiB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5wYXRobmFtZTwvY29kZT4uIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIHRoZW4gbm8gYWN0aW9uCi0JICogaXMgdGFrZW4uCi0JICogCi0JICogQHBhcmFtIHBhdGhuYW1lCi0JICogICAgICAgICAgICBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgd2hvc2UgcGFyZW50IGRpcmVjdG9yeSBzaG91bGQgYmUKLQkgKiAgICAgICAgICAgIGNyZWF0ZWQuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIEFuIGV4Y2VwdGlvbiBpZiBhbiBJTyBlcnJvciBvY2N1cnMuCi0JICovCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcmVudERpcmVjdG9yeUZvcihTdHJpbmcgcGF0aG5hbWUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRobmFtZSk7Ci0JCUZpbGUgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50Lm1rZGlycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGlvbgotCSAqIEByZXR1cm4gSVJlc291cmNlIGlmIHRoZSBzZWxlY3Rpb24gcmVwcmVzZW50cyBhbiBJUmVzb3VyY2UuIFJldHVybnMgbnVsbAotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXN0YXRpYyBwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlRnJvbVNlbGVjdGlvbihPYmplY3Qgb2JqKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmVzID0gKElSZXNvdXJjZSkgb2JqOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21wVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBvYmo7Ci0JCQkJcmVzID0gY29tcFVuaXQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSB7Ci0JCQkJRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiA9IChFbnRlcnByaXNlQmVhbikgb2JqOwotCQkJCUlQcm9qZWN0IGVqYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZWpiQmVhbik7Ci0JCQkJaWYgKGVqYlByb2plY3QgIT0gbnVsbCkKLQkJCQkJcmVzID0gZWpiUHJvamVjdDsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBOYXVnaHR5IGJpdHMuLi4KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8vCi0JLy8gQ3JlYXRlcyBhIHBhdGggb2YgZm9sZGVycy4KLQkvLyBEbyBub3QgY2FsbCB3aXRoIGFuIGFic29sdXRlUGF0aCBvZiBsZXNzIHRoYW4gb25lIHNlZ21lbnQuCi0JLy8KLQkvLyAgcHJpdmF0ZSBzdGF0aWMgSUNvbnRhaW5lciBtYWtlRm9sZGVyUGF0aCAoCi0JLy8gICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JLy8gICAgSVBhdGggYWJzb2x1dGVQYXRoLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICBpZiAoYWJzb2x1dGVQYXRoLnNlZ21lbnRDb3VudCgpIDw9IDEpCi0JLy8gICAgewotCS8vICAgICAgcmV0dXJuIGdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGFic29sdXRlUGF0aC5zZWdtZW50KDApKTsKLQkvLyAgICB9Ci0JLy8gICAgZWxzZQotCS8vICAgIHsKLQkvLyAgICAgIElDb250YWluZXIgcGFyZW50ID0gbWFrZUZvbGRlclBhdGgocmVzb3VyY2VDb250ZXh0LAotCS8vIGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0JLy8gICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotCS8vICAgICAgcmV0dXJuIG1ha2VGb2xkZXIocmVzb3VyY2VDb250ZXh0LCBwYXJlbnQsZm9sZGVyTmFtZSwgcHJvZ3Jlc3NNb25pdG9yICwKLQkvLyBzdGF0dXNNb25pdG9yKTsKLQkvLyAgICB9Ci0JLy8gIH0KLQkvLwotCS8vIENyZWF0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0JLy8gVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0JLy8KLQkvLyBwcml2YXRlIHN0YXRpYyBJRm9sZGVyIG1ha2VGb2xkZXIgKAotCS8vICAgICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCS8vICAgIElDb250YWluZXIgcGFyZW50LAotCS8vICAgIFN0cmluZyBmb2xkZXJOYW1lLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvcgotCS8vICApCi0JLy8gIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JLy8gIHsKLQkvLyAgICBJUmVzb3VyY2UgY2hpbGQgPSBwYXJlbnQuZmluZE1lbWJlcihmb2xkZXJOYW1lKTsKLQkvLyAgICBpZiAoY2hpbGQgPT0gbnVsbCkKLQkvLyAgICB7Ci0JLy8gICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkpIHsKLQkvLyAgICAgICAgaW50IHJlc3VsdCA9IHN0YXR1c01vbml0b3IucmVwb3J0U3RhdHVzKG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0ZPTERFUl9DUkVBVElPTl9ESVNBQkxFRCIsCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BhcmVudC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksZm9sZGVyTmFtZX0pLG51bGwpLAotCS8vIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpKTsKLQkvLyAgICAgICAgaWYgKHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCS8vCi0JLy8gICAgICAgICAgaWYgKCByZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKHRydWUpOwotCS8vCi0JLy8gICAgICB9Ci0JLy8gICAgICBJRm9sZGVyIGZvbGRlciA9IHBhcmVudC5nZXRGb2xkZXIobmV3IFBhdGgoZm9sZGVyTmFtZSkpOwotCS8vICAgICAgZm9sZGVyLmNyZWF0ZSh0cnVlLHRydWUscHJvZ3Jlc3NNb25pdG9yKTsKLQkvLyAgICAgIHJldHVybiBmb2xkZXI7Ci0JLy8gICAgfQotCS8vICAgIGVsc2UgaWYgKGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotCS8vICAgIHsKLQkvLyAgICAgIHJldHVybiAoSUZvbGRlciljaGlsZDsKLQkvLyAgICB9Ci0JLy8gICAgZWxzZQotCS8vICAgIHsKLQkvLyAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLkVSUk9SLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCxXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfUkVTT1VSQ0VfTk9UX0ZPTERFUiIsbmV3Ci0JLy8gT2JqZWN0W10ge3BhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmb2xkZXJOYW1lKS50b1N0cmluZygpfSksbnVsbCkpOwotCS8vICAgIH0KLQkvLyAgfQotCi0JLy8KLQkvLyBDcmVhdGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4KLQkvLyBUaGUgY29udGFpbmVyIG11c3QgYWxyZWFkeSBleGlzdC4KLQkvLwotCS8vIHByaXZhdGUgc3RhdGljIElGaWxlIG1ha2VGaWxlICgKLQkvLyAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCS8vICAgIElDb250YWluZXIgcGFyZW50LAotCS8vICAgIFN0cmluZyBmaWxlTmFtZSwKLQkvLyAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwKLQkvLyAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLQkvLyAgICBTdGF0dXNNb25pdG9yIHN0YXR1c01vbml0b3IKLQkvLyAgKQotCS8vICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICB7Ci0JLy8gICAgSVJlc291cmNlIGNoaWxkID0gcGFyZW50LmZpbmRNZW1iZXIoZmlsZU5hbWUpOwotCS8vICAgIGlmIChjaGlsZCAhPSBudWxsKQotCS8vICAgIHsKLQkvLyAgICAgIGlmIChjaGlsZC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JLy8gICAgICB7Ci0JLy8gICAgICAgIGlmICghcmVzb3VyY2VDb250ZXh0LmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkpIHsKLQkvLyAgICAgICAgICBpbnQgcmVzdWx0ID0gc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoIG5ldwotCS8vIFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsV2ViU2VydmljZVBsdWdpbi5JRCwwLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0ZJTEVfT1ZFUldSSVRFX0RJU0FCTEVEIiwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmaWxlTmFtZX0pLG51bGwpLAotCS8vIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpKTsKLQkvLwotCS8vICAgICAgICAgIGlmIChyZXN1bHQgPT0gSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQkvLwotCS8vICAgICAgICAgIGlmICggcmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0JLy8gICAgICAgIH0KLQkvLyAgICAgICAgLy9XZSBoYXZlIHBlcm1pc3Npb24gdG8gb3ZlcndyaXRlIHNvIGNoZWNrIGlmIGZpbGUgaXMgcmVhZC1vbmx5Ci0JLy8gICAgICAgIGlmIChjaGlsZC5pc1JlYWRPbmx5KCkpCi0JLy8gICAgICAgIHsKLQkvLyAgICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpIHsKLQkvLwotCS8vICAgICAgICAgICAgaW50IHJlc3VsdCA9IHN0YXR1c01vbml0b3IucmVwb3J0U3RhdHVzKCBuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9GSUxFX0NIRUNLT1VUX0RJU0FCTEVEIiwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmaWxlTmFtZX0pLG51bGwpLAotCS8vIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpKTsKLQkvLwotCS8vICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCS8vCi0JLy8gICAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0JLy8gICAgICAgICAgfQotCS8vCi0JLy8gICAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLQkvLyAgICAgICAgICBmaWxlc1swXSA9IChJRmlsZSljaGlsZDsKLQkvLwotCS8vICAgICAgICAgIGlmICgKLQkvLyAhc3RhdHVzTW9uaXRvci5yZXBvcnRTdGF0dXMoZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLG51bGwpKSkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JLy8gICAgICAgIH0KLQkvLwotCS8vICAgICAgICAvL0NoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIGV4aXN0aW5nIGZpbGUuCi0JLy8gICAgICAgICAgICBJRmlsZSBmaWxlID0gcGFyZW50LmdldEZpbGUobmV3IFBhdGgoZmlsZU5hbWUpKTsKLQkvLyAgICAgICAgZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSx0cnVlLHRydWUscHJvZ3Jlc3NNb25pdG9yKTsKLQkvLyAgICAgICAgcmV0dXJuIGZpbGU7Ci0JLy8KLQkvLyAgICAgIH0KLQkvLyAgICAgIGVsc2UKLQkvLyAgICAgIHsKLQkvLyAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3Ci0JLy8gU3RhdHVzKElTdGF0dXMuRVJST1IsV2ViU2VydmljZVBsdWdpbi5JRCwwLFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRklMRSIsbmV3Ci0JLy8gT2JqZWN0W10ge3BhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmaWxlTmFtZSl9KSxudWxsKSk7Ci0JLy8gICAgICB9Ci0JLy8gICAgfQotCS8vICAgIGVsc2UKLQkvLyAgICB7Ci0JLy8gICAgICAgIC8vQ3JlYXRlIGEgbmV3IGZpbGUuCi0JLy8gICAgICAgIElGaWxlIGZpbGUgPSBwYXJlbnQuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwotCS8vICAgICAgICBmaWxlLmNyZWF0ZShpbnB1dFN0cmVhbSx0cnVlLHByb2dyZXNzTW9uaXRvcik7Ci0JLy8gICAgICAgIHJldHVybiBmaWxlOwotCS8vICAgIH0KLQkvLyAgfQotCi0JLyoqCi0JICogRGVsZXRlcyBhIGZpbGUgdW5kZXIgYSBjb250YWluZXIuIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIC0KLQkgKiAgICAgICAgICAgIHRoZSBJRmlsZSB0byBiZSBkZWxldGVkCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBzdGF0dXNNb25pdG9yCi0JICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlmIGl0IGV4aXN0cyBhbmQgaXMKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseSBkZWxldGVkLiBGYWxzZSBvdGhlcndpc2UuCi0JICovCi0JLy8gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVGaWxlICgKLQkvLyAgICAgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJRmlsZSBmaWxlLAotCS8vICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotCS8vICAgIFN0YXR1c01vbml0b3Igc3RhdHVzTW9uaXRvciApCi0JLy8gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkvLyAgICB7Ci0JLy8gICAgICAgIGlmIChmaWxlLmV4aXN0cygpKQotCS8vICAgICAgICB7Ci0JLy8gICAgICAgICAgICAgICAgaWYgKCFyZXNvdXJjZUNvbnRleHQuaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSkgewotCS8vICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IHN0YXR1c01vbml0b3IucmVwb3J0U3RhdHVzKCBuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0ZJTEVfT1ZFUldSSVRFX0RJU0FCTEVEIiwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdCi0JLy8ge2ZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLGZpbGUuZ2V0TmFtZSgpfSksbnVsbCksCi0JLy8gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkpOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkvLwotCS8vICAgICAgICAgICAgICAgIGlmICggcmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCkKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkvLyAgICAgICAgICAgICAgICAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLQkvLyAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc1JlYWRPbmx5KCkpCi0JLy8gICAgICAgICAgICAgICAgewotCS8vICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvdXJjZUNvbnRleHQuaXNDaGVja291dEZpbGVzRW5hYmxlZCgpKSB7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IHN0YXR1c01vbml0b3IucmVwb3J0U3RhdHVzKCBuZXcKLQkvLyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLFdlYlNlcnZpY2VQbHVnaW4uSUQsMCwKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQiLAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10KLQkvLyB7ZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksZmlsZS5nZXROYW1lKCl9KSxudWxsKSwKLQkvLyBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSk7Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IElTdGF0dXNEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29udGV4dC5zZXRDaGVja291dEZpbGVzRW5hYmxlZCh0cnVlKTsKLQkvLwotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotCS8vICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNbMF0gPSBmaWxlOwotCS8vCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICBpZiAoCi0JLy8gIXN0YXR1c01vbml0b3IucmVwb3J0U3RhdHVzKGdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcyxudWxsKSkpCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkvLyAgICAgICAgICAgICAgICB9Ci0JLy8gICAgICAgICAgICAgICAgZmlsZS5kZWxldGUodHJ1ZSxwcm9ncmVzc01vbml0b3IpOwotCS8vICAgICAgICAgICAgICAgIH0KLQkvLyAgICAgICAgLy9BdCB0aGlzIHBvaW50LCBlaXRoZXIgdGhlIGZpbGUgZGlkIG5vdCBleGlzdCBvciB3ZSBzdWNjZXNzZnVsbHkgZGVsZXRlZAotCS8vIGl0LiBSZXR1cm4gc3VjY2Vzcy4KLQkvLyAgICAgICAgcmV0dXJuIHRydWU7Ci0JLy8gIH0KLQkvKioKLQkgKiBEZWxldGVzIGEgZm9sZGVyIHVuZGVyIGEgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBmb2xkZXIgLQotCSAqICAgICAgICAgICAgdGhlIElGb2xkZXIgdG8gYmUgZGVsZXRlZAotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcGFyYW0gc3RhdHVzTW9uaXRvcgotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZm9sZGVyIGRvZXMgbm90IGV4aXN0IG9yIGlmIGl0IGV4aXN0cyBhbmQgaXMKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseSBkZWxldGVkIGFsb25nIHdpdGggaXRzIG1lbWJlcnMuIEZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQkvLyAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZvbGRlciAoCi0JLy8gICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLQkvLyAgICBJRm9sZGVyIGZvbGRlciwKLQkvLyAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLQkvLyAgICBTdGF0dXNNb25pdG9yIHN0YXR1c01vbml0b3IKLQkvLyAgKQotCS8vICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCS8vICB7Ci0JLy8gICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHJldHVybiB0cnVlOwotCS8vCi0JLy8gICAgYm9vbGVhbiBkZWxldGVkID0gdHJ1ZTsKLQkvLyAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBmb2xkZXIubWVtYmVycygpOwotCS8vICAgIGZvciAoaW50IGk9MDsgaTxyZXNvdXJjZXMubGVuZ3RoOyBpKyspCi0JLy8gICAgewotCS8vICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCS8vICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpCi0JLy8gICAgICB7Ci0JLy8gICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGaWxlKHJlc291cmNlQ29udGV4dCwgKElGaWxlKXJlc291cmNlLCBwcm9ncmVzc01vbml0b3IsCi0JLy8gc3RhdHVzTW9uaXRvcik7Ci0JLy8gICAgICB9Ci0JLy8gICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKQotCS8vICAgICAgewotCS8vICAgICAgICBkZWxldGVkID0gZGVsZXRlRm9sZGVyKCByZXNvdXJjZUNvbnRleHQsIChJRm9sZGVyKXJlc291cmNlLAotCS8vIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0JLy8gICAgICB9Ci0JLy8KLQkvLyAgICAgIGlmICghZGVsZXRlZCkgYnJlYWs7Ci0JLy8gICAgfQotCS8vICAgIGlmIChkZWxldGVkKSB7Ci0JLy8gICAgICBmb2xkZXIuZGVsZXRlKHRydWUsIHRydWUsIHByb2dyZXNzTW9uaXRvcik7Ci0JLy8gICAgICByZXR1cm4gdHJ1ZTsKLQkvLyAgICB9Ci0JLy8gICAgZWxzZQotCS8vICAgICAgcmV0dXJuIGZhbHNlOwotCS8vCi0JLy8gIH0KLQkvKioKLQkgKiBEZWxldGVzIGEgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIG5hbWVkIGluIGFuIGluZGV4IGZpbGUgbG9jYXRlZCByZWxhdGl2ZQotCSAqIHRvIHRoZSBwbHVnaW4ncyBpbnN0YWxsYXRpb24gbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgVGhlIHBsdWdpbiBjb250YWluaW5nIHRoZSBpbmRleGVkIGZpbGUgTXVzdCBub3QgYmUgbnVsbC4KLQkgKiBAcGFyYW0gc291cmNlUGF0aCAtCi0JICogICAgICAgICAgICByZWxhdGl2ZSBwYXRoIG9mIHRoZSBpbmRleGVkIGZpbGUgcGFzc2luZyBhIG51bGwgaW4gaGFzIHRoZQotCSAqICAgICAgICAgICAgc2FtZSBlZmZlY3QgYXMgcGFzc2luZyBhICIuIiBpbgotCSAqIEBwYXJhbSBpbmRleEZpbGVQYXRoIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbmRleGVkIGZpbGVuYW1lIE11c3Qgbm90IGJlIG51bGwKLQkgKiBAcGFyYW0gdGFyZ2V0UGF0aCAtCi0JICogICAgICAgICAgICBwYXRoIGNvbnRhaW5pbmcgdGhlIGZpbGVzIG5hbWVkIGluIHRoZSBpbmRleGVkIGZpbGUgTXVzdCBub3QKLQkgKiAgICAgICAgICAgIGJlIG51bGwsIHRoaXMgcGF0aCBtdXN0IGVuZCB3aXRoIGEgdHJhaWxpbmcgc2VwYXJhdG9yCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqLwotCS8vICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlSW5kZXhGaWxlc0Zyb21PUyAoCi0JLy8gICAgUGx1Z2luIHBsdWdpbiwKLQkvLyAgICBJUGF0aCBpbmRleEZpbGVQYXRoLAotCS8vICAgIElQYXRoIHRhcmdldFBhdGgKLQkvLyAgKQotCS8vICB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vICAgIElucHV0U3RyZWFtIGlucHV0ID0gcGx1Z2luLm9wZW5TdHJlYW0oaW5kZXhGaWxlUGF0aCk7Ci0JLy8gICAgRW51bWVyYXRpb24gZmlsZW5hbWVzID0gU3RyaW5nVXRpbHMucGFyc2VGaWxlbmFtZXNGcm9tU3RyZWFtKGlucHV0KTsKLQkvLyAgICB3aGlsZSAoZmlsZW5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JLy8gICAgICBGaWxlIHRhcmdldEZpbGUgPQotCS8vIHRhcmdldFBhdGguYXBwZW5kKChTdHJpbmcpZmlsZW5hbWVzLm5leHRFbGVtZW50KCkpLnRvRmlsZSgpOwotCS8vICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpCi0JLy8gICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0JLy8gICAgfQotCS8vICB9Ci0JLyoqCi0JICogUmV0dXJucyBhIFVSSSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIEVjbGlwc2UgcmVzb3VyY2UsIG9yIG51bGwgaWYgbm8gc3VjaAotCSAqIHJlZmVyZW5jZSBjYW4gYmUgZGV0ZXJtaW5lZCAoZm9yIGV4YW1wbGUsIGlmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdAotCSAqIGluIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0pLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlLgotCSAqIEByZXR1cm4gVGhlIFVSSSBhcyBhIHN0cmluZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBVUkkgdG8gdGhlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlVVJJKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJSVBhdGggbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJdXJpID0gImZpbGU6IiArIGxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgVVJJIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gRWNsaXBzZSByZXNvdXJjZSB1c2luZyB0aGUKLQkgKiAicGxhdGZvcm06IiBwcm90b2NvbCwgb3IgbnVsbCBpZiBubyBzdWNoIHJlZmVyZW5jZSBjYW4gYmUgZGV0ZXJtaW5lZCAoZm9yCi0JICogZXhhbXBsZSwgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0IGluIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0pLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIHJlc291cmNlLgotCSAqIEByZXR1cm4gVGhlIFVSSSBhcyBhIHN0cmluZywgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBVUkkgdG8gdGhlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsYXRmb3JtUmVzb3VyY2VVUkkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyB1cmkgPSBudWxsOwotCQlJUGF0aCBsb2NhdGlvbiA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQl1cmkgPSAicGxhdGZvcm06L3Jlc291cmNlIiArIGxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGJpbmRpbmcgbmFtZXNwYWNlIHN0cmluZyBnaXZlbiBhIEphdmEgYmVhbiBuYW1lCi0JICogKHVzaW5nIHRoZSBjb252ZW50aW9uIHVzZWQgYnkgQ1RDIGluIEdNKS4gZS5nLiBKYXZhIGJlYW4gTXlDbGFzcyByZXN1bHQKLQkgKiBpbiBiaW5kaW5nIG5hbWVzcGFjZSBvZgotCSAqICJodHRwOi8vd3d3Lm15Y2xhc3MuY29tL2RlZmluaXRpb25zL015Q2xhc3NSZW1vdGVJbnRlcmZhY2UiCi0JICogCi0JICogQHBhcmFtIGJlYW5OYW1lCi0JICogICAgICAgICAgICBUaGUgamF2YSBiZWFuLgotCSAqIEByZXR1cm4gVGhlIGJpbmRpbmcgbmFtZXNwYWNlIGFzIGEgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJpbmRpbmdOYW1lc3BhY2UoU3RyaW5nIGJlYW5OYW1lKSB7Ci0JCXJldHVybiAiaHR0cDovL3d3dy4iICsgYmVhbk5hbWUudG9Mb3dlckNhc2UoKSArICIuY29tL2RlZmluaXRpb25zLyIKLQkJCQkrIGJlYW5OYW1lICsgIlJlbW90ZUludGVyZmFjZSI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzY2hlbWEgbmFtZXNwYWNlIHN0cmluZyBnaXZlbiBhIEphdmEgYmVhbiBuYW1lICh1c2luZwotCSAqIHRoZSBjb252ZW50aW9uIHVzZWQgYnkgQ1RDIGluIEdNKS4gZS5nLiBKYXZhIGJlYW4gTXlDbGFzcyByZXN1bHQgaW4KLQkgKiBzY2hlbWEgbmFtZXNwYWNlIG9mCi0JICogImh0dHA6Ly93d3cubXljbGFzcy5jb20vc2NoZW1hcy9NeUNsYXNzUmVtb3RlSW50ZXJmYWNlIgotCSAqIAotCSAqIEBwYXJhbSBiZWFuTmFtZQotCSAqICAgICAgICAgICAgVGhlIGphdmEgYmVhbi4KLQkgKiBAcmV0dXJuIFRoZSBzY2hlbWFzIG5hbWVzcGFjZSBhcyBhIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTY2hlbWFOYW1lc3BhY2UoU3RyaW5nIGJlYW5OYW1lKSB7Ci0JCXJldHVybiAiaHR0cDovL3d3dy4iICsgYmVhbk5hbWUudG9Mb3dlckNhc2UoKSArICIuY29tL3NjaGVtYXMvIgotCQkJCSsgYmVhbk5hbWUgKyAiUmVtb3RlSW50ZXJmYWNlIjsKLQl9Ci0KLQkvLyAgcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkgewotCS8vICAgICAgICBWZWN0b3Igb3B0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLQkvLyAgICBvcHRpb25zLmFkZChuZXcKLQkvLyBTdGF0dXNPcHRpb24oSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfSUQsSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIiIsIiIpKTsKLQkvLyAgICBvcHRpb25zLmFkZChuZXcKLQkvLyBTdGF0dXNPcHRpb24oSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lELElTdGF0dXNEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwiIiwiIikpOwotCS8vICAgIG9wdGlvbnMuYWRkKG5ldwotCS8vIFN0YXR1c09wdGlvbihJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCxJU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwiIiwiIikpOwotCS8vICAgIHJldHVybiBvcHRpb25zOwotCS8vICB9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIEdldHMgdGhlIFNPQVAgcnBjcm91dGVyIHNlcnZsZXQgVVJMIGZvciB0aGUgc2VydmljZSBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEBwYXJhbSBzZXJ2ZXJGYWN0b3J5SWQKLQkgKiAgICAgICAgICAgIFRoZSBzZXJ2ZXIgZmFjdG9yeSBpZAotCSAqIEBwYXJhbSBzZXJ2ZXIKLQkgKiAgICAgICAgICAgIFRoZSBzZXJ2ZXIKLQkgKiBAcmV0dXJuIFRoZSBVUkwsIHBvc3NpYmx5IG51bGwuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2bGV0VVJMKElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gZ2V0U2VydmxldFVSTChnZXRXZWJQcm9qZWN0VVJMKHByb2plY3QsIHNlcnZlckZhY3RvcnlJZCwgc2VydmVyKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmxldFVSTChTdHJpbmcgd2ViUHJvamVjdFVSTCkgewotCQlpZiAod2ViUHJvamVjdFVSTCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UKLQkJCXJldHVybiB3ZWJQcm9qZWN0VVJMICsgU0VSVkxFVF9FWFQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2xpZW50IFdlYiBwcm9qZWN0IG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0IG5hbWUgdG8gYmFzZSBvbi4KLQkgKiBAcGFyYW0gdHlwZUlkIHRoZSB3ZWJzZXJ2aWNlIHR5cGUgaWQuCi0JICogQHJldHVybiBUaGUgY2xpZW50IFdlYiBwcm9qZWN0IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50V2ViUHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgdHlwZUlkKSAKLQl7Ci0JCVN0cmluZyAgIGJhc2VDbGllbnRXZWJQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lICsgREVGQVVMVF9DTElFTlRfV0VCX1BST0pFQ1RfRVhUOwotCQlJUGF0aCAgICBwcm9qZWN0UGF0aDsKLQkJSVByb2plY3QgcHJvamVjdDsKLQkJYm9vbGVhbiAgZm91bmRXZWJQcm9qZWN0ICAgICA9IGZhbHNlOwotCQlpbnQgICAgICBpICAgICAgICAgICAgICAgICAgID0gMTsKLQkJCi0JCWlmKCBpc1NrZWxldG9uRUpCVHlwZSggdHlwZUlkICkgKQotCQl7Ci0JCSAgLy8gRm9yIHRoZSBza2VsZXRvbiBFSkIgc2NlbmFyaW8gd2UgbmVlZCB0byBjcmVhdGUgYSBzbGlnaHRseSBkaWZmZXJlbnQKLQkJICAvLyBiYXNlIG5hbWUuICBXaGVuIHRoZSBFSkIgcHJvamVjdCBpcyBjcmVhdGVkIGFub3RoZXIgcHJvamVjdAotCQkgIC8vIGlzIGNyZWF0ZWQgd2l0aCAiQ2xpZW50IiB0YWNrZWQgb250byB0aGUgZW5kLiAgV2Ugd2lsbAotCQkgIC8vIGFkZCAiV1MiIHRvIG91ciBjbGllbnQgc28gd2UgZG9uJ3QgY29sbGlkZSB3aXRoIHRoZSBvdGhlcgotCQkgIC8vIGNsaWVudCBwcm9qZWN0LgotCQkgIGJhc2VDbGllbnRXZWJQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lICsgIldTIiArIERFRkFVTFRfQ0xJRU5UX1dFQl9QUk9KRUNUX0VYVDsgICAgCi0JCX0KLQkJCi0JCVN0cmluZyAgY2xpZW50V2ViUHJvamVjdE5hbWUgPSBiYXNlQ2xpZW50V2ViUHJvamVjdE5hbWU7Ci0JCQotCQl3aGlsZSAoIWZvdW5kV2ViUHJvamVjdCkgCi0JCXsKLQkJICBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKGNsaWVudFdlYlByb2plY3ROYW1lKS5tYWtlQWJzb2x1dGUoKTsKLQkJICBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocHJvamVjdFBhdGgpOwotCQkgIAotCQkgIGlmIChwcm9qZWN0LmV4aXN0cygpICYmICFSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0KSkgCi0JCSAgewotCQkJY2xpZW50V2ViUHJvamVjdE5hbWUgPSBiYXNlQ2xpZW50V2ViUHJvamVjdE5hbWUgKyBpOwotCQkJaSsrOwotCQkgIH0KLQkJICBlbHNlIAotCQkgIHsKLQkJCWZvdW5kV2ViUHJvamVjdCA9IHRydWU7Ci0JCSAgfQotCQl9Ci0JCQotCQlyZXR1cm4gY2xpZW50V2ViUHJvamVjdE5hbWU7Ci0JfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xpZW50UHJvamVjdENvbXBvbmVudE5hbWUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgYm9vbGVhbiBpc0VKQikKLSAgewotICAgIFN0cmluZyBjbGllbnRQcm9qZWN0TmFtZSA9IG51bGw7Ci0gICAgU3RyaW5nIGNsaWVudENvbXBvbmVudE5hbWUgPSBudWxsOwotICAgIGlmIChpc0VKQikKLSAgICB7Ci0gICAgICBjbGllbnRQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lICsgREVGQVVMVF9DTElFTlRfRUpCX1BST0pFQ1RfRVhUOwotICAgICAgY2xpZW50Q29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgKyBERUZBVUxUX0NMSUVOVF9FSkJfUFJPSkVDVF9FWFQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjbGllbnRQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lICsgREVGQVVMVF9DTElFTlRfV0VCX1BST0pFQ1RfRVhUOwotICAgICAgU3RyaW5nIGJhc2VOYW1lID0gY2xpZW50UHJvamVjdE5hbWU7Ci0gICAgICBjbGllbnRDb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSArIERFRkFVTFRfQ0xJRU5UX1dFQl9QUk9KRUNUX0VYVDsKLSAgICAgIFN0cmluZyBiYXNlQ29tcE5hbWUgPSBjbGllbnRDb21wb25lbnROYW1lOwotICAgIH0KLSAgICAKLS8vICAgIGJvb2xlYW4gIGZvdW5kV2ViUHJvamVjdCAgICAgPSBmYWxzZTsKLS8vICAgIGludCAgICAgIGkgICAgICAgICAgICAgICAgICAgPSAxOwotLy8gICAgCi0vLyAgICB3aGlsZSAoIWZvdW5kV2ViUHJvamVjdCkgCi0vLyAgICB7Ci0vLyAgICAgIElQYXRoIHByb2plY3RQYXRoID0gbmV3IFBhdGgoY2xpZW50UHJvamVjdE5hbWUpLm1ha2VBYnNvbHV0ZSgpOwotLy8gICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRQcm9qZWN0T2YocHJvamVjdFBhdGgpOwotLy8gICAgICAKLS8vICAgICAgaWYgKHByb2plY3QuZXhpc3RzKCkpIAotLy8gICAgICB7Ci0vLyAgICAgICAgY2xpZW50UHJvamVjdE5hbWUgPSBiYXNlTmFtZSArIGk7Ci0vLyAgICAgICAgY2xpZW50Q29tcG9uZW50TmFtZSA9IGJhc2VDb21wTmFtZSArIGk7Ci0vLyAgICAgICAgaSsrOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgCi0vLyAgICAgIHsKLS8vICAgICAgICBmb3VuZFdlYlByb2plY3QgPSB0cnVlOwotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5ldyBTdHJpbmdbXXtjbGllbnRQcm9qZWN0TmFtZSwgY2xpZW50Q29tcG9uZW50TmFtZX07Ci0gIH0KLSAgCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2tlbGV0b25FSkJUeXBlKCBTdHJpbmcgdHlwZUlEICkKLQl7Ci0JICByZXR1cm4gdHlwZUlELmVxdWFscyggIm9yZy5lY2xpcHNlLmpzdC53cy50eXBlLndzZGwuZWpiIiApOyAgICAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEVKQlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9FSkJfUFJPSkVDVF9OQU1FOwotCX0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFSkJDb21wb25lbnROYW1lKCkgewotICAgIHJldHVybiBERUZBVUxUX0VKQl9DT01QT05FTlRfTkFNRTsKLSAgfSAgCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0V2ViUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQl9QUk9KRUNUX05BTUU7Ci0JfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFdlYkNvbXBvbmVudE5hbWUoKSB7Ci0gICAgcmV0dXJuIERFRkFVTFRfV0VCX0NPTVBPTkVOVF9OQU1FOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdENsaWVudEV4dGVuc2lvbigpIHsKLSAgICByZXR1cm4gREVGQVVMVF9DTElFTlRfV0VCX1BST0pFQ1RfRVhUOwotICB9Ci0gIAotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSb3V0ZXJQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJcmV0dXJuIHByb2plY3ROYW1lICsgREVGQVVMVF9ST1VURVJfUFJPSkVDVF9FWFQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlcnZpY2VFQVJQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0VSVklDRV9FQVJfUFJPSkVDVF9OQU1FOwotCX0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRTZXJ2aWNlRUFSQ29tcG9uZW50TmFtZSgpIHsKLSAgICByZXR1cm4gREVGQVVMVF9TRVJWSUNFX0VBUl9DT01QT05FTlRfTkFNRTsKLSAgfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdENsaWVudEVBUlByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9DTElFTlRfRUFSX1BST0pFQ1RfTkFNRTsKLQl9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdENsaWVudEVBUkNvbXBvbmVudE5hbWUoKSB7Ci0gICAgcmV0dXJuIERFRkFVTFRfQ0xJRU5UX0VBUl9DT01QT05FTlRfTkFNRTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TZWxlY3Rpb25Ub1Jlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TZWxlY3Rpb25Ub1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDI4MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VsZWN0aW9uVG9SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25Ub1Jlc291cmNlIGltcGxlbWVudHMgVHJhbnNmb3JtZXIKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIjdHJhbnNmb3JtKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdmFsdWU7Ci0gICAgSVJlc291cmNlICAgICAgICAgICAgcmVzb3VyY2UgID0gbnVsbDsKLSAgICAKLSAgICBpZiggc2VsZWN0aW9uICE9IG51bGwgKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIGlmKCBvYmplY3QgIT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIGlmKCBvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvdXJjZSA9IChJUmVzb3VyY2Upb2JqZWN0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9iamVjdCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21wVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KW9iamVjdDsKLSAgICAgICAgICAKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNvdXJjZSA9IGNvbXBVbml0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCggSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIG9iamVjdCBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuICkgCi0gICAgICAgIHsKLSAgICAgICAgICBFbnRlcnByaXNlQmVhbiBlamJCZWFuICAgID0gKEVudGVycHJpc2VCZWFuKW9iamVjdDsKLSAgICAgICAgICBJUHJvamVjdCAgICAgICBlamJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KCBlamJCZWFuICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIGVqYlByb2plY3QgIT0gbnVsbCApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb3VyY2UgPSBlamJQcm9qZWN0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXNvdXJjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VydmVyVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1NlcnZlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MWFlZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU2VydmVyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuSVNlcnZlclRhcmdldENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5zZXJ2ZXJ0YXJnZXQuU2VydmVyVGFyZ2V0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUHJvamVjdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JVVJMUHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB1c2VmdWwgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIFNlcnZlciBwbHVnaW4gZnVuY3Rpb25zCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2ZXJVdGlscyB7Ci0KLQlwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSBzZXJ2ZXJJZFRvTGFiZWxfOwotCi0JcHJpdmF0ZSBIYXNodGFibGUgc2VydmVyTGFiZWxUb0lkXzsKLQotCXByaXZhdGUgc3RhdGljIFNlcnZlclV0aWxzIGluc3RhbmNlXzsKLQotCXB1YmxpYyBzdGF0aWMgU2VydmVyVXRpbHMgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZV8gPT0gbnVsbCkgewotCQkJaW5zdGFuY2VfID0gbmV3IFNlcnZlclV0aWxzKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlXzsKLQotCX0KLQotCXB1YmxpYyBTZXJ2ZXJVdGlscygpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLmpzdC53cyI7Ci0JCW1zZ1V0aWxzXyA9IG5ldyBNZXNzYWdlVXRpbHMocGx1Z2luSWQgKyAiLnBsdWdpbiIsIHRoaXMpOwotCX0KLQotCS8vIEdldHMgdGhlIFNlcnZlciBsYWJlbHMgZ2l2ZW4gdGhlIHNlcnZlciBmYWN0b3J5IGlkCi0JcHVibGljIHZvaWQgZ2V0U2VydmVyTGFiZWxzQW5kSWRzKCkgewotCQlzZXJ2ZXJJZFRvTGFiZWxfID0gbmV3IEhhc2h0YWJsZSgpOwotCQlzZXJ2ZXJMYWJlbFRvSWRfID0gbmV3IEhhc2h0YWJsZSgpOwotCQlJU2VydmVyVHlwZVtdIHNlcnZlclR5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwotCQlmb3IgKGludCBpZHggPSAwOyBpZHggPCBzZXJ2ZXJUeXBlcy5sZW5ndGg7IGlkeCsrKSB7Ci0KLQkJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSAoSVNlcnZlclR5cGUpIHNlcnZlclR5cGVzW2lkeF07Ci0KLQkJCVN0cmluZyBpZCA9IHNlcnZlclR5cGUuZ2V0SWQoKTsKLQkJCVN0cmluZyBzZXJ2ZXJMYWJlbCA9IHNlcnZlclR5cGUuZ2V0TmFtZSgpOwotCQkJaWYgKCEoaWQgPT0gbnVsbCkgJiYgIShzZXJ2ZXJMYWJlbCA9PSBudWxsKSkgewotCQkJCXNlcnZlcklkVG9MYWJlbF8ucHV0KGlkLCBzZXJ2ZXJMYWJlbCk7Ci0JCQkJc2VydmVyTGFiZWxUb0lkXy5wdXQoc2VydmVyTGFiZWwsIGlkKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTGFiZWxGb3JJZChTdHJpbmcgZmFjdG9yeUlkKSB7Ci0JCWlmIChzZXJ2ZXJJZFRvTGFiZWxfID09IG51bGwpCi0JCQl0aGlzLmdldFNlcnZlckxhYmVsc0FuZElkcygpOwotCQlyZXR1cm4gKFN0cmluZykgc2VydmVySWRUb0xhYmVsXy5nZXQoZmFjdG9yeUlkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZlcklkRm9yTGFiZWwoU3RyaW5nIGZhY3RvcnlMYWJlbCkgewotCQlpZiAoc2VydmVyTGFiZWxUb0lkXyA9PSBudWxsKQotCQkJdGhpcy5nZXRTZXJ2ZXJMYWJlbHNBbmRJZHMoKTsKLQkJcmV0dXJuIChTdHJpbmcpIHNlcnZlckxhYmVsVG9JZF8uZ2V0KGZhY3RvcnlMYWJlbCk7Ci0JfQotCi0JcHVibGljIFN0YXR1cyBtb2RpZnlNb2R1bGVzKEVudmlyb25tZW50IGVudiwgSVNlcnZlciBzZXJ2ZXIsCi0JCQlJTW9kdWxlIG1vZHVsZSwgYm9vbGVhbiBhZGQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7Ci0JCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkJdHJ5IHsKLQotCQkJaWYgKG1vZHVsZSA9PSBudWxsIHx8ICFtb2R1bGUuZ2V0UHJvamVjdCgpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgbW9kdWxlIGlzIGEgdHJ1ZSBKYXZhIHByb2plY3QKLQkJCWlmIChtb2R1bGUgaW5zdGFuY2VvZiBJTW9kdWxlKSB7Ci0JCQkJSU1vZHVsZSBwbSA9IChJTW9kdWxlKSBtb2R1bGU7Ci0JCQkJaWYgKHBtICE9IG51bGwpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IHBtLmdldFByb2plY3QoKTsKLQkJCQkJaWYgKHByb2plY3QgPT0gbnVsbAotCQkJCQkJCXx8IFJlc291cmNlVXRpbHMuaXNUcnVlSmF2YVByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXdjID0gc2VydmVyLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQlpZiAod2MgIT0gbnVsbCkgewotLy8JCQkJT2JqZWN0IHggPSBzZXJ2ZXIuZ2V0QWRhcHRlcihJUnVubmluZ0FjdGlvblNlcnZlci5jbGFzcyk7Ci0vLwkJCQlpZiAoeCAhPSBudWxsICYmIHggaW5zdGFuY2VvZiBJUnVubmluZ0FjdGlvblNlcnZlcikgewotLy8JCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotLy8JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQKLS8vCQkJCQkJCXx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotLy8JCQkJCQlTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotLy8JCQkJCQlzZXJ2ZXIuc3luY2hyb25vdXNTdGFydChtb2RlLCBtb25pdG9yKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0KLQkJCQlMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KHNlcnZlci5nZXRNb2R1bGVzKCkpOwotCQkJCWlmIChhZGQpIHsKLQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG1vZHVsZSkpIHsKLQkJCQkJCVNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyh3YywgbmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAotCQkJCQkJCQluZXcgSU1vZHVsZVswXSwgbW9uaXRvcik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeyAvLyByZW1vdmVzIG1vZHVsZQotCQkJCQlpZiAobGlzdC5jb250YWlucyhtb2R1bGUpKSB7Ci0JCQkJCQlTZXJ2ZXJVdGlsLm1vZGlmeU1vZHVsZXMod2MsIG5ldyBJTW9kdWxlWzBdLAotCQkJCQkJCQluZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBoYW5kbGUgY2FzZSBvZiBOdWxsIFdDOyBub24taXNzdWUgZm9yIG5vdwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18KLQkJCQkJLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0JCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdjICE9IG51bGwpIHsKLQkJCQkvLyBBbHdheXMgc2F2ZUFsbCBhbmQgcmVsZWFzZSB0aGUgc2VydmVyV29ya2luZ0NvcHkKLQkJCQl0cnkgewotCQkJCQl3Yy5zYXZlQWxsKHRydWUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2V4KSB7Ci0JCQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXwotCQkJCQkJCS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0VSVkVSIiksIFN0YXR1cy5FUlJPUiwgY2V4KTsKLQkJCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRTZXJ2ZXJGb3JNb2R1bGUoSU1vZHVsZSBtb2R1bGUsCi0JCQlTdHJpbmcgc2VydmVyVHlwZUlkLCBJU2VydmVyIHNlcnZlciwgYm9vbGVhbiBjcmVhdGUsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHNlcnZlcjsKLQkJZWxzZQotCQkJcmV0dXJuIGdldFNlcnZlckZvck1vZHVsZShtb2R1bGUsIHNlcnZlclR5cGVJZCwgY3JlYXRlLCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0U2VydmVyRm9yTW9kdWxlKElNb2R1bGUgbW9kdWxlLAotCQkJU3RyaW5nIHNlcnZlclR5cGVJZCwgYm9vbGVhbiBjcmVhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCi0JCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKG1vZHVsZSwgbW9uaXRvcik7Ci0KLQkJCWlmIChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJaWYgKHNlcnZlclR5cGVJZCA9PSBudWxsIHx8IHNlcnZlclR5cGVJZC5sZW5ndGgoKSA9PSAwKQotCQkJCQlyZXR1cm4gc2VydmVyc1swXTsgLy8gV1NBRCB2NCBiZWhhdmlvcgotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCQkJc2VydmVyVHlwZUlkKSkKLQkJCQkJCXJldHVybiBzZXJ2ZXJzW2ldOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGNyZWF0ZVNlcnZlcihtb2R1bGUsIHNlcnZlclR5cGVJZCwgbW9uaXRvcik7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGdldFNlcnZlckZvck1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQl0cnkgewotCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShtb2R1bGUsIG51bGwpOwotCQkJcmV0dXJuICgoc2VydmVycyAhPSBudWxsICYmIHNlcnZlcnMubGVuZ3RoID4gMCkgPyBzZXJ2ZXJzWzBdIDogbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlbnYKLQkgKiBAcGFyYW0gbW9kdWxlCi0JICogQHBhcmFtIHNlcnZlclR5cGVJZAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHJldHVybgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIElTZXJ2ZXIgY3JlYXRlU2VydmVyKEVudmlyb25tZW50IGVudiwgSU1vZHVsZSBtb2R1bGUsCi0JCQlTdHJpbmcgc2VydmVyVHlwZUlkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDID0gbnVsbDsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQl0cnkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLQkJCXNlcnZlcldDID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZUlkLCBudWxsLCBtb25pdG9yKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNlcnZlcldDICE9IG51bGwpIHsKLQkJCQkJc2VydmVyID0gc2VydmVyV0Muc2F2ZUFsbCh0cnVlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXwotCQkJCQkJLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWRVIiKSwgU3RhdHVzLkVSUk9SLCBjZSk7Ci0JCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQotLy8JCQkJT2JqZWN0IHggPSBzZXJ2ZXIuZ2V0QWRhcHRlcihJUnVubmluZ0FjdGlvblNlcnZlci5jbGFzcyk7Ci0vLwkJCQlpZiAoeCAhPSBudWxsICYmIHggaW5zdGFuY2VvZiBJUnVubmluZ0FjdGlvblNlcnZlcikgewotLy8JCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpOwotLy8JCQkJCWlmIChzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQKLS8vCQkJCQkJCXx8IHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfVU5LTk9XTikgewotLy8JCQkJCQlTdHJpbmcgbW9kZSA9IElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFOwotLy8JCQkJCQlzZXJ2ZXIuc3luY2hyb25vdXNTdGFydChtb2RlLCBtb25pdG9yKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0KLQkJCQlpZiAobW9kdWxlICE9IG51bGwgJiYgbW9kdWxlLmdldFByb2plY3QoKS5leGlzdHMoKSkgewotCQkJCQlJTW9kdWxlW10gcGFyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsCi0JCQkJCQkJbW9uaXRvcik7Ci0JCQkJCWlmIChwYXJlbnRNb2R1bGVzICE9IG51bGwgJiYgcGFyZW50TW9kdWxlcy5sZW5ndGggIT0gMCkgewotCQkJCQkJbW9kdWxlID0gKElNb2R1bGUpIHBhcmVudE1vZHVsZXNbMF07Ci0JCQkJCX0KLQkJCQkJc2VydmVyV0MubW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sCi0JCQkJCQkJbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotCQkJCX0KLQotCQkJfQotCi0JCQlyZXR1cm4gc2VydmVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1zZ1V0aWxzXwotCQkJCQkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NFUlZFUiIpLCBTdGF0dXMuRVJST1IsIGUpOwotCQkJZW52LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChzZXJ2ZXJXQyAhPSBudWxsKSB7Ci0JCQkJCXNlcnZlcldDLnNhdmVBbGwodHJ1ZSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiLCBtc2dVdGlsc18KLQkJCQkJCS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0VSVkVSIiksIFN0YXR1cy5FUlJPUiwgY2UpOwotCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZVNlcnZlciBUaGlzIGNyZWF0ZXMgYSBzZXJ2ZXIgYnV0IGRvZXMgbm90IHJlcG9ydCBlcnJvcnMuIEBwYXJhbQotCSAqIG1vZHVsZSAKLQkgKiBAcGFyYW0gc2VydmVyVHlwZUlkIAotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IgCi0JICogQHJldHVybiBJU2VydmVyIHJldHVybnMgbnVsbCBpZiB1bnN1Y2Nlc3NmdWwKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBjcmVhdGVTZXJ2ZXIoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBzZXJ2ZXJUeXBlSWQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDID0gbnVsbDsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBudWxsOwotCQl0cnkgewotCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLQkJCXNlcnZlcldDID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZUlkLCBudWxsLCBtb25pdG9yKTsKLQotCQkJdHJ5IHsKLQkJCQlpZiAoc2VydmVyV0MgIT0gbnVsbCkgewotCQkJCQlzZXJ2ZXIgPSBzZXJ2ZXJXQy5zYXZlQWxsKHRydWUsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0KLS8vCQkJCU9iamVjdCB4ID0gc2VydmVyLmdldEFkYXB0ZXIoSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIuY2xhc3MpOwotLy8JCQkJaWYgKHggIT0gbnVsbCAmJiB4IGluc3RhbmNlb2YgSVJ1bm5pbmdBY3Rpb25TZXJ2ZXIpIHsKLS8vCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0U2VydmVyU3RhdGUoKTsKLS8vCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVECi0vLwkJCQkJCQl8fCBzdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1VOS05PV04pIHsKLS8vCQkJCQkJU3RyaW5nIG1vZGUgPSBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERTsKLS8vCQkJCQkJc2VydmVyLnN5bmNocm9ub3VzU3RhcnQobW9kZSwgbW9uaXRvcik7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gcGFyZW50TW9kdWxlcyA9IHNlcnZlci5nZXRSb290TW9kdWxlcyhtb2R1bGUsCi0JCQkJCQkJbW9uaXRvcik7Ci0JCQkJCWlmIChwYXJlbnRNb2R1bGVzICE9IG51bGwgJiYgcGFyZW50TW9kdWxlcy5sZW5ndGggIT0gMCkgewotCQkJCQkJbW9kdWxlID0gKElNb2R1bGUpIHBhcmVudE1vZHVsZXNbMF07Ci0JCQkJCX0KLQkJCQkJc2VydmVyV0MubW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sCi0JCQkJCQkJbmV3IElNb2R1bGVbMF0sIG1vbml0b3IpOwotCQkJCX0KLQotCQkJfQotCi0JCQlyZXR1cm4gc2VydmVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChzZXJ2ZXJXQyAhPSBudWxsKSB7Ci0JCQkJCXNlcnZlcldDLnNhdmVBbGwodHJ1ZSwgbW9uaXRvcik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJCS8vIGhhbmRsZXIgY29yZSBleGNlcHRpb24KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0U2VydmVyVHlwZUlkc0J5TW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJU3RyaW5nW10gc2VydmVySWRzID0gbnVsbDsKLQotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKGdldE1vZHVsZShwcm9qZWN0LCBjb21wb25lbnQuZ2V0TmFtZSgpKSwgbnVsbCk7Ci0JCQlpZiAoc2VydmVycyAhPSBudWxsKSB7Ci0JCQkJc2VydmVySWRzID0gbmV3IFN0cmluZ1tzZXJ2ZXJzLmxlbmd0aF07Ci0KLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2VydmVycy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJc2VydmVySWRzW2luZGV4XSA9IHNlcnZlcnNbaW5kZXhdLmdldElkKCk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2VydmVySWRzID09IG51bGwpIHsKLQkJCXNlcnZlcklkcyA9IG5ldyBTdHJpbmdbMF07Ci0JCX0KLQotCQlyZXR1cm4gc2VydmVySWRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIHNob3VsZCBiZSB1c2luZyBnZXRTZXJ2ZXJUeXBlSWRzQnlNb2R1bGUoIElWaXJ0dWFsQ29tcG9uZW50ICkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFNlcnZlclR5cGVJZHNCeU1vZHVsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVZlY3RvciBzZXJ2ZXJJZHMgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoUmVzb3VyY2VVdGlscwotCQkJCQkuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKLQkJCWlmIChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXNlcnZlcklkcy5hZGQoc2VydmVyc1tpXS5nZXRJZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgc2VydmVySWRzLnRvQXJyYXkobmV3IFN0cmluZ1tzZXJ2ZXJJZHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29tcG9uZW50TmFtZSkgewotCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KTsKLQkJSU1vZHVsZSBtb2R1bGVGb3VuZCA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1vZHVsZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAobW9kdWxlc1tpbmRleF0uZ2V0TmFtZSgpLmVxdWFscyhjb21wb25lbnROYW1lKSkgewotCQkJCW1vZHVsZUZvdW5kID0gbW9kdWxlc1tpbmRleF07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kdWxlRm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290IG9mIHRoZQotCSAqIGNvbXBvbmVudCBpbiBhIHNlcnZlciBpbnN0YW5jZSBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBXZWIgbmF0dXJlCi0JICogb3IgaGFzIG5vIGFzc29jaWF0aW9uIHRvIGEgc2VydmVyIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBUaGUgcHJvamVjdC4KLQkgKiBAcmV0dXJuIFRoZSB3ZWIgc2VydmVyIG1vZHVsZSByb290IFVSTCBvciBudWxsIGlmIHRoZSBwcm9qZWN0IGhhcyBubyBXZWIKLQkgKiAgICAgICAgIG5hdHVyZSBvciBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViQ29tcG9uZW50VVJMKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb21wb25lbnROYW1lKSB7Ci0JCVN0cmluZyB3ZWJQcm9qZWN0VVJMID0gbnVsbDsKLQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJSVNlcnZlciBzZXJ2ZXJJbnN0YW5jZSA9IGdldFNlcnZlckZvck1vZHVsZShtb2R1bGUpOwotCQkJaWYgKHNlcnZlckluc3RhbmNlICE9IG51bGwpIHsKLQkJCQlVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlckluc3RhbmNlLmdldEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzKSkuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGUpOwotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcyA9IHVybC50b1N0cmluZygpOwotCQkJCQl3ZWJQcm9qZWN0VVJMID0gKHMuZW5kc1dpdGgoIi8iKSA/IHMuc3Vic3RyaW5nKDAsIHMubGVuZ3RoKCkgLSAxKSA6IHMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlSdW50aW1lIHByb2plY3RUYXJnZXQgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJCQlpZiAocHJvamVjdFRhcmdldCE9bnVsbCkKLQkJCQl7Ci0JCQkJCVN0cmluZyBwcm9qZWN0VGFyZ2V0SWQgPSBwcm9qZWN0VGFyZ2V0LmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJCQkJU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9IGdldEZhY3RvcnlJZEZyb21SdW50aW1lVGFyZ2V0SWQocHJvamVjdFRhcmdldElkKTsKLQkJCQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyRmFjdG9yeUlkKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChzZXJ2ZXJUeXBlIT1udWxsKSB7Ci0JCQkJCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldDID0gc2VydmVyVHlwZS5jcmVhdGVTZXJ2ZXIobnVsbCwgbnVsbCwgcHJvamVjdFRhcmdldCwgbnVsbCk7Ci0JCQkJCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKXNlcnZlcldDLmdldEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzKSkuZ2V0TW9kdWxlUm9vdFVSTChtb2R1bGUpOwotCQkJCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgcyA9IHVybC50b1N0cmluZygpOwotCQkJCQkJCQl3ZWJQcm9qZWN0VVJMID0gKHMuZW5kc1dpdGgoIi8iKSA/IHMuc3Vic3RyaW5nKDAsIHMubGVuZ3RoKCkgLSAxKSA6IHMpOwotCQkJCQkJCX0JCQkJCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSl7Ci0JCQkJCQljZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5ewotCQkJCQkJCi0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3ZWJQcm9qZWN0VVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgd2ViIHNlcnZlciBtb2R1bGUgcm9vdCBvZiB0aGUKLQkgKiBwcm9qZWN0IGluIGEgc2VydmVyIGluc3RhbmNlIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYiBuYXR1cmUgb3IKLQkgKiBoYXMgbm8gYXNzb2NpYXRpb24gdG8gYSBzZXJ2ZXIgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFRoZSBwcm9qZWN0LgotCSAqIEByZXR1cm4gVGhlIHdlYiBzZXJ2ZXIgbW9kdWxlIHJvb3QgVVJMIG9yIG51bGwgaWYgdGhlIHByb2plY3QgaGFzIG5vIFdlYgotCSAqICAgICAgICAgbmF0dXJlIG9yIGhhcyBubyBhc3NvY2lhdGlvbiB0byBhIHNlcnZlciBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJDb21wb25lbnRVUkwoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgc2VydmVyRmFjdG9yeUlkLCBJU2VydmVyIHNlcnZlcikgewotCi0JCVN0cmluZyB3ZWJQcm9qZWN0VVJMID0gbnVsbDsKLQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUocHJvamVjdCwgY29tcG9uZW50TmFtZSk7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJSVNlcnZlciBzZXJ2ZXJJbnN0YW5jZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlckZvck1vZHVsZShtb2R1bGUsCi0JCQkJCXNlcnZlckZhY3RvcnlJZCwgc2VydmVyLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmIChzZXJ2ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQkJVVJMIHVybCA9ICgoSVVSTFByb3ZpZGVyKSBzZXJ2ZXJJbnN0YW5jZQotCQkJCQkJLmdldEFkYXB0ZXIoSVVSTFByb3ZpZGVyLmNsYXNzKSkKLQkJCQkJCS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZSk7Ci0JCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBzID0gdXJsLnRvU3RyaW5nKCk7Ci0JCQkJCXdlYlByb2plY3RVUkwgPSAocy5lbmRzV2l0aCgiLyIpID8gcy5zdWJzdHJpbmcoMCwgcwotCQkJCQkJCS5sZW5ndGgoKSAtIDEpIDogcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3ZWJQcm9qZWN0VVJMOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVuY29kZWRXZWJDb21wb25lbnRVUkwoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKLQkJU3RyaW5nIHVybCA9IGdldFdlYkNvbXBvbmVudFVSTChwcm9qZWN0LCBjb21wb25lbnROYW1lKTsKLQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZ0J1ZmZlciBlbmNvZGVkVVJMID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWVuY29kZWRVUkwuYXBwZW5kKHVybC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGN0eHRSb290ID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsLnN1YnN0cmluZyhpbmRleCArIDEsIHVybC5sZW5ndGgoKSksICJVVEYtOCIpOwotCQkJCQlpbnQgcGx1c0luZGV4ID0gY3R4dFJvb3QuaW5kZXhPZignKycpOwotCQkJCQl3aGlsZSAocGx1c0luZGV4ICE9IC0xKSB7Ci0JCQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCQlzYi5hcHBlbmQoY3R4dFJvb3Quc3Vic3RyaW5nKDAsIHBsdXNJbmRleCkpOwotCQkJCQkJc2IuYXBwZW5kKCIlMjAiKTsKLQkJCQkJCXNiLmFwcGVuZChjdHh0Um9vdC5zdWJzdHJpbmcocGx1c0luZGV4ICsgMSwgY3R4dFJvb3QKLQkJCQkJCQkubGVuZ3RoKCkpKTsKLQkJCQkJCWN0eHRSb290ID0gc2IudG9TdHJpbmcoKTsKLQkJCQkJCXBsdXNJbmRleCA9IGN0eHRSb290LmluZGV4T2YoJysnKTsKLQkJCQkJfQotCQkJCQllbmNvZGVkVVJMLmFwcGVuZChjdHh0Um9vdCk7Ci0JCQkJfWNhdGNoIChJT0V4Y2VwdGlvbiBpbyl7Ci0JCQkJCS8vaGFuZGxlciBleGNlcHRpb24KLQkJCQl9CQkJCQotCQkJCXVybCA9IGVuY29kZWRVUkwudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJsOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGdldERlZmF1bHRFeGlzdGluZ1NlcnZlcihJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCUlQcm9qZWN0UHJvcGVydGllcyBwcm9wcyA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCUlTZXJ2ZXIgcHJlZmVycmVkU2VydmVyID0gcHJvcHMuZ2V0RGVmYXVsdFNlcnZlcigpOwotCi0JCWlmIChwcmVmZXJyZWRTZXJ2ZXIgPT0gbnVsbCkgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBnZXRNb2R1bGUocHJvamVjdCwgY29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCQlJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShtb2R1bGUsCi0JCQkJCW51bGwpOwotCi0JCQlpZiAoY29uZmlndXJlZFNlcnZlcnMgIT0gbnVsbCAmJiBjb25maWd1cmVkU2VydmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJcHJlZmVycmVkU2VydmVyID0gY29uZmlndXJlZFNlcnZlcnNbMF07Ci0JCQl9IGVsc2UgewotCQkJCUlTZXJ2ZXJbXSBub25Db25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwKLQkJCQkJCS5nZXRBdmFpbGFibGVTZXJ2ZXJzRm9yTW9kdWxlKG1vZHVsZSwgZmFsc2UsIG51bGwpOwotCi0JCQkJaWYgKG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzICE9IG51bGwKLQkJCQkJCSYmIG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLQkJCQkJcHJlZmVycmVkU2VydmVyID0gbm9uQ29uZmlndXJlZFNlcnZlcnNbMF07Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHByZWZlcnJlZFNlcnZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBzaG91bGQgYmUgdXNpbmcgZ2V0RGVmYXVsdEV4aXN0aW5nU2VydmVyKCBJVmlydHVhbENvbXBvbmVudCApCi0JICovCi0JcHVibGljIHN0YXRpYyBJU2VydmVyIGdldERlZmF1bHRFeGlzdGluZ1NlcnZlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0U2VydmVyTmFtZTsKLQotCQkvLyBJU2VydmVyUHJlZmVyZW5jZXMgc2VydmVyUHJlZmVyZW5jZXMgPQotCQkvLyBTZXJ2ZXJDb3JlLmdldFNlcnZlclByZWZlcmVuY2VzKCk7Ci0JCUlQcm9qZWN0UHJvcGVydGllcyBwcm9wcyA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCUlTZXJ2ZXIgcHJlZmVycmVkU2VydmVyID0gcHJvcHMuZ2V0RGVmYXVsdFNlcnZlcigpOwotCQkvLyBJU2VydmVyIHByZWZlcnJlZFNlcnZlciA9Ci0JCS8vIHNlcnZlclByZWZlcmVuY2VzLmdldERlcGxveWFibGVTZXJ2ZXJQcmVmZXJlbmNlKFJlc291cmNlVXRpbHMuZ2V0TW9kdWxlKHByb2plY3QpKTsKLQkJaWYgKHByZWZlcnJlZFNlcnZlciAhPSBudWxsKQotCQkJcmV0dXJuIHByZWZlcnJlZFNlcnZlcjsKLQotCQlJU2VydmVyW10gY29uZmlndXJlZFNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZSgKLQkJCQlSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwgbnVsbCk7Ci0JCWlmIChjb25maWd1cmVkU2VydmVycyAhPSBudWxsICYmIGNvbmZpZ3VyZWRTZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBjb25maWd1cmVkU2VydmVyc1swXTsKLQkJfQotCi0JCUlTZXJ2ZXJbXSBub25Db25maWd1cmVkU2VydmVycyA9IFNlcnZlclV0aWwKLQkJCQkuZ2V0QXZhaWxhYmxlU2VydmVyc0Zvck1vZHVsZShSZXNvdXJjZVV0aWxzLmdldE1vZHVsZShwcm9qZWN0KSwKLQkJCQkJCWZhbHNlLCBudWxsKTsKLQkJaWYgKG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzICE9IG51bGwgJiYgbm9uQ29uZmlndXJlZFNlcnZlcnMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIG5vbkNvbmZpZ3VyZWRTZXJ2ZXJzWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHBhcmFtIG1vZHVsZVR5cGUgLSBhZCBkZWZpbmVkIGluIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMgKGkuZS4gRUFSX1RZUEUsCi0JICogV0VCX1RZUEUsIGV0Yy4pIEBwYXJhbSBqMmVlVmVyc2lvbiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludAotCSAqIHZhbHVlcyBpbiBKMkVFVmVyc2lvbkNvbnN0YW50cyBpLmUuICIxMiIgb3IgIjEzIiBvciAiMTQiIEByZXR1cm4gU3RyaW5nCi0JICogdGhlIGlkIG9mIHRoZSBzZXJ2ZXIgdGFyZ2V0IC0gdG8gYmUgdXNlZCBpbiBwcm9qZWN0IGNyZWF0aW9uIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyVGFyZ2V0SWRGcm9tRmFjdG9yeUlkKFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsCi0JCQlTdHJpbmcgbW9kdWxlVHlwZSwgU3RyaW5nIGoyZWVWZXJzaW9uKSB7Ci0JCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZCk7Ci0JCWlmIChzZXJ2ZXJUeXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgc2VydmVyUnVudGltZVR5cGVJZCA9IHNlcnZlclR5cGUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwotCi0JCVN0cmluZyBzdEoyRUVWZXJzaW9uID0gU2VydmVyVXRpbHMKLQkJCQkuZ2V0U2VydmVyVGFyZ2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotCQlMaXN0IHJ1bnRpbWVzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFNlcnZlclRhcmdldHMobW9kdWxlVHlwZSwKLQkJCQlzdEoyRUVWZXJzaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydW50aW1lcy5zaXplKCk7IGkrKykgewotCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgcnVudGltZXMuZ2V0KGkpOwotCQkJU3RyaW5nIHRoaXNSdW50aW1lVHlwZUlkID0gcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCQlpZiAodGhpc1J1bnRpbWVUeXBlSWQuZXF1YWxzKHNlcnZlclJ1bnRpbWVUeXBlSWQpKSB7Ci0JCQkJcmV0dXJuIHJ1bnRpbWUuZ2V0SWQoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZCB0aGUgc2VydmVyJ3MgZmFjdG9yeSBpZCBAcmV0dXJucyB0aGUgcnVudGltZSB0eXBlCi0JICogaWQgZ2l2ZW4gdGhlIHNlcnZlcidzIGZhY3RvcnkgaWQuIFJldHVybnMgYSBibGFuayBTdHJpbmcgaWYgdGhlIG5vCi0JICogU2VydmVyVHlwZSBleGlzdHMgZm9yIHRoZSBnaXZlbiBmYWN0b3J5IGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJ1bnRpbWVUYXJnZXRJZEZyb21GYWN0b3J5SWQoU3RyaW5nIHNlcnZlckZhY3RvcnlJZCkgewotCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJGYWN0b3J5SWQpOwotCQlpZiAoc2VydmVyVHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2VydmVyUnVudGltZUlkID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7Ci0JCQlyZXR1cm4gc2VydmVyUnVudGltZUlkOwotCQl9IGVsc2UKLQkJCXJldHVybiAiIjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkRnJvbVJ1bnRpbWVUYXJnZXRJZChTdHJpbmcgcnVudGltZVRhcmdldElkKXsKLQkJSVNlcnZlclR5cGVbXSBzZXJ2ZXJUeXBlcyA9IFNlcnZlckNvcmUuZ2V0U2VydmVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaT0wO2k8c2VydmVyVHlwZXMubGVuZ3RoO2krKykgewotCQkJaWYgKHNlcnZlclR5cGVzW2ldLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMocnVudGltZVRhcmdldElkKSkKLQkJCQlyZXR1cm4gc2VydmVyVHlwZXNbaV0uZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gIiI7Ci0JCQotCX0KLQkKLQotCS8qCi0JICogQHBhcmFtIHNlcnZlckZhY3RvcnlJZCB0aGUgc2VydmVyJ3MgZmFjdG9yeSBpZCBAcmV0dXJucyB0aGUgc2VydmVyIHR5cGUKLQkgKiBpZCBnaXZlbiB0aGUgc2VydmVyJ3MgZmFjdG9yeSBpZC4gUmV0dXJucyBhIGJsYW5rIFN0cmluZyBpZiB0aGUgbm8KLQkgKiBTZXJ2ZXJUeXBlIGV4aXN0cyBmb3IgdGhlIGdpdmVuIGZhY3RvcnkgaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyVHlwZUlkRnJvbUZhY3RvcnlJZChTdHJpbmcgc2VydmVyRmFjdG9yeUlkKSB7Ci0JCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBTZXJ2ZXJDb3JlLmZpbmRTZXJ2ZXJUeXBlKHNlcnZlckZhY3RvcnlJZCk7Ci0JCWlmIChzZXJ2ZXJUeXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBzZXJ2ZXJUeXBlSWQgPSBzZXJ2ZXJUeXBlLmdldElkKCk7Ci0JCQlyZXR1cm4gc2VydmVyVHlwZUlkOwotCQl9IGVsc2UKLQkJCXJldHVybiAiIjsKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBqMmVlVmVyc2lvbiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludCB2YWx1ZXMgaW4KLQkgKiBKMkVFVmVyc2lvbkNvbnN0YW50cyBpLmUuICIxMiIgb3IgIjEzIiBvciAiMTQiCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGFyZ2V0VmFsaWRGb3JFQVIoU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCwKLQkJCVN0cmluZyBqMmVlVmVyc2lvbikgewotCQlpZiAocnVudGltZVRhcmdldElkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIGVhck1vZHVsZVR5cGUgPSBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkVBUl9UWVBFOwotCQlTdHJpbmcgc3RKMkVFVmVyc2lvbiA9IFNlcnZlclV0aWxzCi0JCQkJLmdldFNlcnZlclRhcmdldEoyRUVWZXJzaW9uKGoyZWVWZXJzaW9uKTsKLQkJTGlzdCBydW50aW1lcyA9IFNlcnZlclRhcmdldEhlbHBlci5nZXRTZXJ2ZXJUYXJnZXRzKGVhck1vZHVsZVR5cGUsCi0JCQkJc3RKMkVFVmVyc2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHJ1bnRpbWVzLmdldChpKTsKLQkJCVN0cmluZyB0aGlzSWQgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJCWlmICh0aGlzSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXRJZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gajJlZVZlcnNpb24gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnQgdmFsdWVzIGluCi0JICogSjJFRVZlcnNpb25Db25zdGFudHMgaS5lLiAiMTIiIG9yICIxMyIgb3IgIjE0IiBAcGFyYW0gdGhlIHByb2plY3QgdHlwZQotCSAqIGZyb20gSVNlcnZlclRhcmdldENvbnN0YW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RhcmdldFZhbGlkRm9yUHJvamVjdFR5cGUoU3RyaW5nIHJ1bnRpbWVUYXJnZXRJZCwKLQkJCVN0cmluZyBqMmVlVmVyc2lvbiwgU3RyaW5nIHByb2plY3RUeXBlKSB7Ci0JCWlmIChydW50aW1lVGFyZ2V0SWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAocHJvamVjdFR5cGUgPT0gbnVsbCB8fCBwcm9qZWN0VHlwZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBzdEoyRUVWZXJzaW9uID0gU2VydmVyVXRpbHMKLQkJCQkuZ2V0U2VydmVyVGFyZ2V0SjJFRVZlcnNpb24oajJlZVZlcnNpb24pOwotCQlMaXN0IHJ1bnRpbWVzID0gU2VydmVyVGFyZ2V0SGVscGVyLmdldFNlcnZlclRhcmdldHMocHJvamVjdFR5cGUsCi0JCQkJc3RKMkVFVmVyc2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcnVudGltZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHJ1bnRpbWVzLmdldChpKTsKLQkJCVN0cmluZyB0aGlzSWQgPSBydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKTsKLQkJCWlmICh0aGlzSWQuZXF1YWxzKHJ1bnRpbWVUYXJnZXRJZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyVGFyZ2V0SjJFRVZlcnNpb24oU3RyaW5nIGoyZWVWZXJzaW9uKSB7Ci0JCVN0cmluZyBzdEoyRUVWZXJzaW9uID0gbnVsbDsKLQkJaWYgKGoyZWVWZXJzaW9uID09IG51bGwgfHwgajJlZVZlcnNpb24ubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBqMmVlVmVyc2lvbkludCA9IEludGVnZXIucGFyc2VJbnQoajJlZVZlcnNpb24pOwotCQlzd2l0Y2ggKGoyZWVWZXJzaW9uSW50KSB7Ci0JCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKToKLQkJCXJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTI7Ci0JCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKToKLQkJCXJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTM7Ci0JCWNhc2UgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKToKLQkJCXJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLkoyRUVfMTQ7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvL0NvbnZlcnRzIGEgbW9kdWxlIHR5cGUgZnJvbSBKMkVFVXRpbHMgdG8gYSBtb2R1bGUgdHlwZSBsaWtlCi0JLy90aGUgb25lIGluIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyVGFyZ2V0TW9kdWxlVHlwZShpbnQgbW9kdWxlVHlwZSkKLQl7Ci0JCXN3aXRjaCAobW9kdWxlVHlwZSkKLSAgICB7Ci0gICAgY2FzZSBKMkVFVXRpbHMuV0VCIDoKLSAgICAgIHJldHVybiBJU2VydmVyVGFyZ2V0Q29uc3RhbnRzLldFQl9UWVBFOwotICAgIGNhc2UgSjJFRVV0aWxzLkVKQiA6Ci0gICAgICByZXR1cm4gSVNlcnZlclRhcmdldENvbnN0YW50cy5FSkJfVFlQRTsKLSAgICBjYXNlIEoyRUVVdGlscy5BUFBDTElFTlQgOgotICAgICAgcmV0dXJuIElTZXJ2ZXJUYXJnZXRDb25zdGFudHMuQVBQX0NMSUVOVF9UWVBFOwotICAgIGNhc2UgSjJFRVV0aWxzLkVBUiA6Ci0gICAgICByZXR1cm4gSVNlcnZlclRhcmdldENvbnN0YW50cy5FQVJfVFlQRTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAKLSAgICB9ICAgICAgCQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RhdHVzT2JqZWN0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RhdHVzT2JqZWN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmYwZmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0YXR1c09iamVjdEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgU3RhdHVzT2JqZWN0SGFuZGxlcgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9ERVRBSUxTID0gMTY7Ci0KLSAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGdlbmVyYXRlVHJlZVN0YXR1cyAoSVN0YXR1cyBzdGF0dXMpIAotICAJewotICAgIC8vCi0gICAgLy8gVGhlcmUgY291bGQgYmUgbG90cyBvZiBUaHJvd2FibGVzLCBDb3JlRXhjZXB0aW9ucywKLSAgICAvLyBXcmFwcGVkRXhjZXB0aW9ucyBhbmQgSVN0YXR1cyBvYmplY3RzIGJlbmVhdGggdGhlCi0gICAgLy8gZ2l2ZW4gc3RhdHVzLiBGaW5kIHRoZW0uCi0gICAgLy8KLSAgICBMaW5rZWRMaXN0IHN0YXR1c0xpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgIGFwcGVuZFN0YXR1cyhNQVhfREVUQUlMUywgc3RhdHVzTGlzdCwgc3RhdHVzLCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7Ci0gICAgaWYgKHN0YXR1c0xpc3Quc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBJU3RhdHVzIG5ld1N0YXR1cyA9IChJU3RhdHVzKXN0YXR1c0xpc3QucmVtb3ZlRmlyc3QoKTsKLSAgICAgIGlmIChzdGF0dXNMaXN0LnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIElTdGF0dXNbXSBzZWNvbmRhcnlTdGF0dXNBcnJheSA9IG5ldyBJU3RhdHVzW3N0YXR1c0xpc3Quc2l6ZSgpXTsKLSAgICAgICAgaW50IG4gPSAwOwotICAgICAgICBJdGVyYXRvciBpID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWNvbmRhcnlTdGF0dXNBcnJheVtuKytdID0gKElTdGF0dXMpaS5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgbmV3U3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHN0YXR1cy5nZXRQbHVnaW4oKSxzdGF0dXMuZ2V0Q29kZSgpLHNlY29uZGFyeVN0YXR1c0FycmF5LHN0YXR1cy5nZXRNZXNzYWdlKCksc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBuZXdTdGF0dXM7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgCXJldHVybiBudWxsOwotICB9Ci0KLSAgLy8KLSAgLy8gQXBwZW5kcyB6ZXJvIG9yIG1vcmUgSVN0YXR1cyBvYmplY3RzIHRvIHRoZSBsaXN0IG9mIElTdGF0dXMgb2JqZWN0cwotICAvLyBiYXNlZCB1cG9uIGFuIElTdGF0dXMuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGludCBhcHBlbmRTdGF0dXMgKCBpbnQgbWF4LCBMaXN0IHN0YXR1c0xpc3QsIElTdGF0dXMgc3RhdHVzLCBpbnQgc2V2ZXJpdHkgKQotICB7Ci0gICAgaWYgKG1heCA+IDAgJiYgc3RhdHVzICE9IG51bGwpCi0gICAgewotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCBhbiBJU3RhdHVzIG9iamVjdCBmb3IgdGhlIGdpdmVuIHN0YXR1cycgbWVzc2FnZS4KLSAgICAgIC8vCi0gICAgICBpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBtYXggPSBhcHBlbmQoc3RhdHVzTGlzdCxtYXgsc2V2ZXJpdHksc3RhdHVzLmdldFBsdWdpbigpLHN0YXR1cy5nZXRDb2RlKCksc3RhdHVzLmdldE1lc3NhZ2UoKSxzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotICAgICAgfQotICAgICAgLy8KLSAgICAgIC8vIEFwcGVuZCB0aGUgSVN0YXR1cycgVGhyb3dhYmxlLCBpZiBhbnkuCi0gICAgICAvLwotICAgICAgbWF4ID0gYXBwZW5kVGhyb3dhYmxlKG1heCxzdGF0dXNMaXN0LHN0YXR1cy5nZXRFeGNlcHRpb24oKSxzZXZlcml0eSk7Ci0gICAgICAvLwotICAgICAgLy8gSWYgdGhlIElTdGF0dXMgaXMgYSBtdWx0aSBzdGF0dXMsIGFwcGVuZCB0aGUgY2hpbGRyZW4uCi0gICAgICAvLwotICAgICAgSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0gICAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoICYmIG1heD4wOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG1heCA9IGFwcGVuZFN0YXR1cyhtYXgsc3RhdHVzTGlzdCxjaGlsZHJlbltpXSxzZXZlcml0eSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXg7Ci0gIH0KLQotICAvLwotICAvLyBBcHBlbmRzIHplcm8gb3IgbW9yZSBJU3RhdHVzIG9iamVjdHMgdG8gdGhlIGxpc3Qgb2YgSVN0YXR1cyBvYmplY3RzCi0gIC8vIGJhc2VkIHVwb24gYSBUaHJvd2FibGUuIFdyYXBwZWRFeGNlcHRpb25zIGFuZCBDb3JlRXhjZXB0aW9ucyBhcmUKLSAgLy8gZ2l2ZW4gc3BlY2lhbCB0cmVhdG1lbnQuCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGludCBhcHBlbmRUaHJvd2FibGUgKCBpbnQgbWF4LCBMaXN0IHN0YXR1c0xpc3QsIFRocm93YWJsZSB0aHJvd2FibGUsIGludCBzZXZlcml0eSApCi0gIHsKLSAgICBpZiAobWF4ID4gMCAmJiB0aHJvd2FibGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLwotICAgICAgLy8gQXBwZW5kIGFuIElTdGF0dXMgb2JqZWN0IGZvciB0aGUgZXhjZXB0aW9uJ3MgbWVzc2FnZS4KLSAgICAgIC8vCi0gICAgICBpZiAodGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBtYXggPSBhcHBlbmQoc3RhdHVzTGlzdCxtYXgsc2V2ZXJpdHksV2ViU2VydmljZVBsdWdpbi5JRCwwLHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksdGhyb3dhYmxlKTsKLSAgICAgIH0KLSAgICAgIC8vCi0gICAgICAvLyBJZiB0aGUgZXhjZXB0aW9uIGlzIGEgV3JhcHBlZEV4Y2VwdGlvbiwgYXBwZW5kIHRoZSB3cmFwcGVkIEV4Y2VwdGlvbi4KLSAgICAgIC8vCi0gICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgV3JhcHBlZEV4Y2VwdGlvbiB3ZXhjID0gKFdyYXBwZWRFeGNlcHRpb24pdGhyb3dhYmxlOwotICAgICAgICBtYXggPSBhcHBlbmRUaHJvd2FibGUobWF4LHN0YXR1c0xpc3Qsd2V4Yy5leGNlcHRpb24oKSxzZXZlcml0eSk7Ci0gICAgICB9Ci0gICAgICAvLwotICAgICAgLy8gSWYgdGhlIGV4Y2VwdGlvbiBpcyBhIENvcmVFeGNlcHRpb24sIGFwcGVuZCB0aGUgZW5jbG9zZWQgSVN0YXR1cy4KLSAgICAgIC8vCi0gICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgQ29yZUV4Y2VwdGlvbiBjZXhjID0gKENvcmVFeGNlcHRpb24pdGhyb3dhYmxlOwotICAgICAgICBtYXggPSBhcHBlbmRTdGF0dXMobWF4LHN0YXR1c0xpc3QsY2V4Yy5nZXRTdGF0dXMoKSxzZXZlcml0eSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXg7Ci0gIH0KLQotICAvLwotICAvLyBDcmVhdGVzIGFuZCBhcHBlbmRzIGFuIElTdGF0dXMgdG8gdGhlIGxpc3Qgb2YgSVN0YXR1cyBvYmplY3RzLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBpbnQgYXBwZW5kICggTGlzdCBzdGF0dXNMaXN0LCBpbnQgbWF4LCBpbnQgc2V2ZXJpdHksIFN0cmluZyBpZCwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlICkKLSAgewotICAgIGlmIChtYXggPiAwKQotICAgIHsKLSAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSxpZCxjb2RlLG1lc3NhZ2UsdGhyb3dhYmxlKTsKLSAgICAgIHN0YXR1c0xpc3QuYWRkKHN0YXR1cyk7Ci0gICAgICBtYXgtLTsKLSAgICB9Ci0gICAgcmV0dXJuIG1heDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb21tb24vU3RyaW5nVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjMWE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi0KLS8qKgotICogVHJhbnNmcm9tcyBhIGphdmEubGFuZy5TdHJpbmcgdG8gYW4gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9qZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5UcmFuc2Zvcm1lciN0cmFuc2Zvcm0oamF2YS5sYW5nLk9iamVjdCkKLSAgICogQHBhcmFtIE9iamVjdCBUaGlzIG11c3QgYmUgYSBqYXZhLmxhbmcuU3RyaW5nCi0gICAqIEByZXR1cm4gT2JqZWN0IFJldHVybnMgYW4gSVByb2plY3QKLSAgICovCi0KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKQotICB7Ci0JU3RyaW5nIHByb2plY3QgICAgID0gKFN0cmluZyl2YWx1ZTsKLQlpbnQgICAgc2xhc2hJbmRleCAgPSBwcm9qZWN0LmluZGV4T2YoICcvJyApOwotCVN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3Q7Ci0JCi0JaWYoIHNsYXNoSW5kZXggIT0gLTEgKQotCXsKLQkgIHByb2plY3ROYW1lID0gcHJvamVjdC5zdWJzdHJpbmcoIDAsIHNsYXNoSW5kZXggKTsKLQl9Ci0JCi0gICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZ1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbW1vbi9TdHJpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDlmZDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29tbW9uL1N0cmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci0KLS8qKgotICAqIFRoaXMgY2xhc3MgY29udGFpbnMgc29tZSB1c2VmdWwgc3RyaW5nIHV0aWxpdGllcyB0aGF0IGFyZSBub3QgcHJvdmlkZWQgYnkKLSAgKiBlaXRoZXIgU3RyaW5nIG9yIFN0cmluZ0J1ZmZlci4KLSAgKgotICAqIEBhdXRob3IgUGV0ZXIgTW9vZ2sKLSAgKiBAZGF0ZSAgIEp1bHkgMTMsIDIwMDAKLSoqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1V0aWxzCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIHBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gIHByaXZhdGUgU3RyaW5nVXRpbHMoKXt9OwotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2Qgc3BsaXRzIGEgc2luZ2xlIGxpbmUgb2YgdGV4dCBpbnRvIG11bHRpcGxlIGxpbmVzCi0gICAgKiBiYXNlZCBvbiBhIG1heGltdW0gbGluZSBsZW5ndGguICBUaGUgbWV0aG9kIHdpbGwgdHJ5IHRvIGZpdCBhcwotICAgICogbWFueSB3b3JkcyBhcyBwb3NzaWJsZSBvbnRvIGEgbGluZSB3aXRob3V0IGV4Y2VlZGluZyB0aGUgbWF4aW11bQotICAgICogbGluZSBsZW5ndGguICBOb3RlOiB0aGUgb25seSBjYXNlIHdoZXJlIGEgbGluZSBtaWdodCBleGNlZWQgdGhlCi0gICAgKiBtYXhpbXVtIGlzIGlmIGEgc2luZ2xlIHdvcmQgaXMgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0uCi0gICoqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHNwbGl0dGVyKCBTdHJpbmcgdGV4dCwgaW50IG1heF9sZW5ndGggKQotICB7Ci0gICAgVmVjdG9yICAgICAgICAgIHJldHVybl90ZXh0ID0gbmV3IFZlY3RvcigyMCk7Ci0gICAgU3RyaW5nW10gICAgICAgIHJldHVybl9zdHI7Ci0gICAgaW50ICAgICAgICAgICAgIGluZGV4ID0gMDsKLQotICAgIHdoaWxlKCBpbmRleCA8IHRleHQubGVuZ3RoKCkgKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSB0ZXh0LnN1YnN0cmluZyggaW5kZXgsIE1hdGgubWluKCBtYXhfbGVuZ3RoICsgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5sZW5ndGgoKSApICk7Ci0gICAgICBpbnQgc3BhY2VfaW5kZXggPSBzdHIubGFzdEluZGV4T2YoICIgIiApOwotCi0gICAgICBpZiggaW5kZXggKyBzdHIubGVuZ3RoKCkgPCB0ZXh0Lmxlbmd0aCgpICYmCi0gICAgICAgICAgdGV4dC5jaGFyQXQoIGluZGV4ICsgc3RyLmxlbmd0aCgpIC0gMSApICE9ICcgJyAmJgotICAgICAgICAgIHRleHQuY2hhckF0KCBpbmRleCArIHN0ci5sZW5ndGgoKSApICE9ICcgJyAmJgotICAgICAgICAgIHNwYWNlX2luZGV4ICE9IC0xICkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuX3RleHQuYWRkRWxlbWVudCggc3RyLnN1YnN0cmluZyggMCwgc3BhY2VfaW5kZXggKSApOwotICAgICAgICBpbmRleCArPSBzcGFjZV9pbmRleCArIDE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybl90ZXh0LmFkZEVsZW1lbnQoIHN0ci50cmltKCkgKTsKLSAgICAgICAgaW5kZXggKz0gc3RyLmxlbmd0aCgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybl9zdHIgPSBuZXcgU3RyaW5nW3JldHVybl90ZXh0LnNpemUoKV07Ci0KLSAgICBmb3IoIGluZGV4ID0gMDsgaW5kZXggPCByZXR1cm5fdGV4dC5zaXplKCk7IGluZGV4KysgKQotICAgIHsKLSAgICAgIHJldHVybl9zdHJbaW5kZXhdID0gKFN0cmluZykocmV0dXJuX3RleHQuZWxlbWVudEF0KGluZGV4KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHVybl9zdHI7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcgd2l0aCBhIHJlcGVhdGVkIG51bWJlciBvZiBjaGFyYWN0ZXJzLgotICAqKi8KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgcmVwZWF0KCBjaGFyIHRoZV9jaGFyLCBpbnQgY291bnQgKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIGNvdW50ICk7Ci0KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGJ1Zi5hcHBlbmQoIHRoZV9jaGFyICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBmbGF0dGVucyBhbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gYSBzdHJpbmcuCi0gICAgKiBUaGUgbWV0aG9kIHJlc3BlY3RzIGVtYmVkZGVkIHdoaXRlc3BhY2UgYW5kIHF1b3Rlcy4KLSAgICAqIDx1bD4KLSAgICAqIDxsaT5BbnkgYXJndW1lbnQgd2l0aCBlbWJlZGRlZCB3aGl0ZXNwYWNlIHdpbGwgYmUgZmxhdHRlbmVkIG91dAotICAgICogd2l0aCBlbmNsb3NpbmcgcXVvdGVzLiBGb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSBhcmd1bWVudAotICAgICogPHU+SGVsbG8gV29ybGQ8L3U+Ci0gICAgKiB3aWxsIGJlIHJldHVybmVkIGFzCi0gICAgKiA8dT4iSGVsbG8gV29ybGQiPC91Pi4KLSAgICAqIDxsaT5BbnkgYXJndW1lbnQgd2l0aCBxdW90ZXMgd2lsbCBiZSBmbGF0dGVuZWQgb3V0IHdpdGggdGhlCi0gICAgKiBxdW90ZXMgZXNjYXBlZC4gRm9yIGV4YW1wbGUsIHRoZSBzaW5nbGUgYXJndW1lbnQKLSAgICAqIDx1PiJIYXBweSBkYXlzIjwvdT4KLSAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMKLSAgICAqIDx1PlwiSGFwcHkgZGF5c1wiPC91Pi4KLSAgICAqIDwvdWw+Ci0gICAgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBhcnJheSBvZiBzdHJpbmdzIHRvIGZsYXR0ZW4uCi0gICAgKiBAcmV0dXJuIHRoZSBmbGF0dGVuZWQgc3RyaW5nLgotICAqLwotICBzdGF0aWMgcHVibGljIFN0cmluZyBmbGF0dGVuQXJndW1lbnRzICggU3RyaW5nW10gYXJndW1lbnRzICkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBmb3IgKGludCBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgYSBzZXBhcmF0b3IgKGV4Y2VwdCB0aGUgZmlyc3QgdGltZSkuCi0gICAgICAvLwotICAgICAgaWYgKGkgPiAwKSBidWYuYXBwZW5kKCcgJyk7Ci0KLSAgICAgIC8vCi0gICAgICAvLyBMb29rIGZvciB3aGl0ZXNwYWNlLgotICAgICAgLy8KLSAgICAgIGJvb2xlYW4gd2hpdGVzcGFjZSA9IGZhbHNlOwotICAgICAgY2hhcltdIGNoYXJzID0gYXJndW1lbnRzW2ldLnRvQ2hhckFycmF5KCk7Ci0gICAgICBmb3IgKGludCBqPTA7ICF3aGl0ZXNwYWNlICYmIGo8Y2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2pdKSkKLSAgICAgICAgewotICAgICAgICAgIHdoaXRlc3BhY2UgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgdGhlIGFyZ3VtZW50LCBxdW90ZWQgYXMgbmVjZXNzYXJ5LgotICAgICAgLy8KLSAgICAgIGlmICh3aGl0ZXNwYWNlKSBidWYuYXBwZW5kKCciJyk7Ci0gICAgICBmb3IgKGludCBqPTA7IGo8Y2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGFyc1tqXSA9PSAnIicpIGJ1Zi5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoY2hhcnNbal0pOwotICAgICAgfQotICAgICAgaWYgKHdoaXRlc3BhY2UpIGJ1Zi5hcHBlbmQoJyInKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHBhcnNlcyB3aGl0ZXNwYWNlLWRlbGltaXR0ZWQgZmlsZW5hbWVzIGZyb20KLSAgICAqIHRoZSBnaXZlbiA8Y29kZT5pbnB1dDwvY29kZT4gc3RyZWFtLiA8Yj5MaW1pdGF0aW9uOjwvYj4KLSAgICAqIFF1b3RlZCBmaWxlbmFtZXMgb3IgZmlsZW5hbWVzIHdpdGggZW1iZWRkZWQgd2hpdGVzcGFjZQotICAgICogYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgotICAgICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCBzdHJlYW0uCi0gICAgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGZpbGVuYW1lcyBmcm9tIHRoZSBzdHJlYW0uCi0gICovCi0gIHN0YXRpYyBwdWJsaWMgRW51bWVyYXRpb24gcGFyc2VGaWxlbmFtZXNGcm9tU3RyZWFtICggSW5wdXRTdHJlYW0gaW5wdXQgKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFZlY3RvciBmaWxlbmFtZXMgPSBuZXcgVmVjdG9yKDY0LDY0KTsKLSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLSAgICBieXRlIHN0YXRlID0gU1RBVEVfV1M7Ci0gICAgaW50IGljID0gaW5wdXQucmVhZCgpOwotICAgIHdoaWxlIChpYyA+PSAwKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IChjaGFyKWljOwotICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBTVEFURV9XUzoKLSAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLSAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfTldTOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9OV1M6Ci0gICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBidWZmZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGZpbGVuYW1lcy5hZGQoZmlsZW5hbWUpOwotICAgICAgICAgICAgYnVmZmVyID0gbnVsbDsKLSAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfV1M7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWMgPSBpbnB1dC5yZWFkKCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlbmFtZXMuZWxlbWVudHMoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1RBVEVfV1MgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFNUQVRFX05XUyA9IDE7Ci0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaXMgdGhlIHR5cGUgcGFzc2VkIGluIGlzIGEgcHJpbXRpdmUgamF2YSB0eXBlCi0gICogQHBhcmFtIGNsYXNzIG5hbWUgU3RyaW5nCi0gICogQHJldHVybiB0cnVlIGlzIHByaW1pdGl2ZSB0eXBlCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSAKLSAgewotCi0gICAgaWYgKHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJvb2xlYW4iKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYnl0ZSIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJkb3VibGUiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZmxvYXQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW50IikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImxvbmciKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2hvcnQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY2hhciIpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICAvKioKLSAgKiBUaGUgbWV0aG9kIHJlcGxhY2UgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsb3dlZCBpbiBVUklzCi0gICogYW5kIG5vdCBhbGxvd2VkIGluIEphdmEgY2xhc3MgbmFtZXMgdG8gYW4gdW5kZXJzY29yZSAoJ18nKQotICAqIEBwYXJhbSBVUkkgU3RyaW5nCi0gICogQHJldHVybiB2YWxpZCBKYXZhIGNsYXNzIG5hbWUgU3RyaW5nCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSTJDbGFzc05hbWUoIFN0cmluZyB1cmkgKSB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IHVyaTsKLSAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBVUklfU1lNQk9MUy5sZW5ndGg7IGkrKyApIHsKLSAgICAJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UgKCBVUklfU1lNQk9MU1tpXSwgVU5ERVJTQ09SRSApOwotICAgIH0KLSAgICByZXR1cm4gY2xhc3NOYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFVSSV9TWU1CT0xTID0geyctJywgJ34nLCAnIycsICcvJywgJy4nfTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBVTkRFUlNDT1JFID0gJ18nOwotCi0KLSAgLyoqCi0gICAqIFRoaXMgcmV0dXJucyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBiYXNlZCBvbiB0aGUgZ2l2ZW4gbmFtZS4gCi0gICAqIChmb2xsb3dzIEpBWC1SUEMgMS4wIFB1YmxpYyBSZXZpZXcgRHJhZnQgMiByZWNvbW1lbmRhdGlvbnMpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBqYXZhSWRlbnRpZmllckZvcihTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBib29sZWFuIHNraXBwZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gbG9jYWxOYW1lLmxlbmd0aCgpOyBpIDwgbGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgY2hhciBjaGFyYWN0ZXIgPSBsb2NhbE5hbWUuY2hhckF0KGkpOwotICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjaGFyYWN0ZXIpICYmICFpc0RlbGltaXRlcihjaGFyYWN0ZXIpKQotICAgICAgewotICAgICAgICBpZiAoc2tpcHBlZCAmJiByZXN1bHQubGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGNoYXJhY3RlciA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaGFyYWN0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoY2hhcmFjdGVyKTsKLSAgICAgICAgc2tpcHBlZCA9IGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBza2lwcGVkID10cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSWRlbnRpZmllcihyZXN1bHQudG9TdHJpbmcoKSkuaXNPSygpKQotICAgIHsKLSAgICAgIHJlc3VsdC5pbnNlcnQoMCwgIl8iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVsaW1pdGVyKGNoYXIgY2hhcmFjdGVyKQotICB7Ci0gICAgcmV0dXJuICJcdTAwMkRcdTAwMkVcdTAwM0FcdTAwNUZcdTAwQjdcdTAzODdcdTA2RERcdTA2REUiLmluZGV4T2YoY2hhcmFjdGVyKSAhPSAtMTsKLSAgfQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudFByb2plY3RUb3BvbG9neUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWNmNTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50Q29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFByb2plY3RUb3BvbG9neUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIFByb2plY3RUb3BvbG9neUNvbnRleHQKLXsKLQotcHVibGljIFBlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0ICgpIAotewotCXN1cGVyKCBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkpOwotfQotIHB1YmxpYyB2b2lkIGxvYWQoKSB7Ci0gICAgU3RyaW5nW10gaWRzID0gUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuZ2V0Q2xpZW50VHlwZXMoKTsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgc2IuYXBwZW5kKCIgIik7Ci0gICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgICB9Ci0gICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NMSUVOVF9UWVBFUywgc2IudG9TdHJpbmcoKSk7Ci0gICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1VTRV9UV09fRUFSUywgUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuaXNVc2VUd29FQVJzKCkpOwotIH0KLQotIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVzKFN0cmluZ1tdIGlkcykKLSB7Ci0gICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICBmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKLSAgIHsKLSAgICAgaWYgKGkgIT0gMCkKLSAgICAgICBzYi5hcHBlbmQoIiAiKTsKLSAgICAgc2IuYXBwZW5kKGlkc1tpXSk7Ci0gICB9Ci0gICBzZXRWYWx1ZShQUkVGRVJFTkNFX0NMSUVOVF9UWVBFUywgc2IudG9TdHJpbmcoKSk7Ci0gfQotCi0gcHVibGljIFN0cmluZ1tdIGdldENsaWVudFR5cGVzKCkKLSB7Ci0gICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9DTElFTlRfVFlQRVMpKTsKLSAgIFN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKQotICAgICBzW2ldID0gc3QubmV4dFRva2VuKCk7Ci0gICByZXR1cm4gczsKLSB9Ci0KLSBwdWJsaWMgdm9pZCBzZXRVc2VUd29FQVJzKGJvb2xlYW4gdXNlKQotIHsKLSAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVVNFX1RXT19FQVJTLCB1c2UpOwotIH0KLSBwdWJsaWMgYm9vbGVhbiBpc1VzZVR3b0VBUnMoKQotIHsKLSAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1VTRV9UV09fRUFSUyk7Ci0gfQotCi0gcHVibGljIFByb2plY3RUb3BvbG9neUNvbnRleHQgY29weSgpIHsKLSAJVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQoKTsKLQljb250ZXh0LnNldENsaWVudFR5cGVzKGdldENsaWVudFR5cGVzKCkpOwotCWNvbnRleHQuc2V0VXNlVHdvRUFScyhpc1VzZVR3b0VBUnMoKSk7Ci0JcmV0dXJuIGNvbnRleHQ7Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudFNjZW5hcmlvQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2MTQzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudFNjZW5hcmlvQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3QuV2ViU2VydmljZVRlc3RFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0LldlYlNlcnZpY2VUZXN0UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50U2NlbmFyaW9Db250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBTY2VuYXJpb0NvbnRleHQKLXsKLSAgcHVibGljIFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQoKQotICB7Ci0gICAgc3VwZXIoV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBsb2FkKCkKLSAgewotICAgIFNjZW5hcmlvRGVmYXVsdHMgZGVmYXVsdHMgPSBuZXcgU2NlbmFyaW9EZWZhdWx0cygpOwotICAgIFN0cmluZ1tdIGlkcyA9IGRlZmF1bHRzLmdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKTsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgIT0gMCkgc2IuYXBwZW5kKCIsIik7Ci0gICAgICBzYi5hcHBlbmQoaWRzW2ldKTsKLSAgICB9Ci0gICAgU3RyaW5nIG5vbkphdmFUZXN0U2VydmljZSA9IGRlZmF1bHRzLmdldE5vbkphdmFUZXN0U2VydmljZURlZmF1bHQoKTsKLSAgICBzZXREZWZhdWx0U3RyaW5nSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RFU1RfVFlQRVMsIHNiLnRvU3RyaW5nKCkpOwotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX05PTl9KQVZBX1RFU1RfU0VSVklDRSwgbm9uSmF2YVRlc3RTZXJ2aWNlKTsKLSAgICAKLSAgICBzZXREZWZhdWx0U3RyaW5nSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9DTElFTlRfV0VCU0VSVklDRV9UWVBFLCBkZWZhdWx0cy53ZWJzZXJ2aWNlQ2xpZW50VHlwZURlZmF1bHQoKSApOwotICAgIHNldERlZmF1bHRTdHJpbmdJZk5vRGVmYXVsdChQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVFlQRSwgZGVmYXVsdHMud2Vic2VydmljZVR5cGVJZERlZmF1bHQoKSApOwotICAgIHNldERlZmF1bHRCb29sZWFuSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9HRU5FUkFURV9QUk9YWSwgZGVmYXVsdHMuZ2VuZXJhdGVQcm94eURlZmF1bHQoKSApOwotICAgIHNldERlZmF1bHRCb29sZWFuSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9MQVVOQ0hfV0VCU0VSVklDRV9FWFBMT1JFUiwgZGVmYXVsdHMubGF1bmNoV2Vic2VydmljZUV4cGxvcmVyRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX1NUQVJUX1dFQlNFUlZJQ0UsIGRlZmF1bHRzLnN0YXJ0V2Vic2VydmljZURlZmF1bHQoKSApOwotICAgIHNldERlZmF1bHRCb29sZWFuSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UsIGRlZmF1bHRzLnRlc3RXZWJzZXJ2aWNlRGVmYXVsdCgpICk7Ci0gICAgc2V0RGVmYXVsdEJvb2xlYW5JZk5vRGVmYXVsdChQUkVGRVJFTkNFX01PTklUT1JfV0VCU0VSVklDRSwgZGVmYXVsdHMuZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCkpOwotICAgIHNldERlZmF1bHRCb29sZWFuSWZOb0RlZmF1bHQoUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFLCBkZWZhdWx0cy5sYXVuY2hTYW1wbGUoKSApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb25KYXZhVGVzdFNlcnZpY2UoKQotICB7Ci0gICAgV2ViU2VydmljZVRlc3RSZWdpc3RyeSByZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgICBTdHJpbmdbXSB0ZXN0VHlwZXMgPSBnZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgV2ViU2VydmljZVRlc3RFeHRlbnNpb24gd3NlID0gKFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKSByZWdpc3RyeQotICAgICAgICAgIC5nZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uc0J5TmFtZSh0ZXN0VHlwZXNbaV0pOwotICAgICAgaWYgKHdzZS50ZXN0V1NETCgpKSByZXR1cm4gdGVzdFR5cGVzW2ldOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VUZXN0VHlwZXMoU3RyaW5nW10gaWRzKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpICE9IDApIHNiLmFwcGVuZCgiLCIpOwotICAgICAgc2IuYXBwZW5kKGlkc1tpXSk7Ci0gICAgfQotICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9URVNUX1RZUEVTLCBzYi50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RFU1RfVFlQRVMpLCAiLCIpOwotICAgIFN0cmluZ1tdIHMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykKLSAgICAgIHNbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIHB1YmxpYyBTY2VuYXJpb0NvbnRleHQgY29weSgpCi0gIHsKLSAgICBUcmFuc2llbnRTY2VuYXJpb0NvbnRleHQgY29udGV4dCA9IG5ldyBUcmFuc2llbnRTY2VuYXJpb0NvbnRleHQoKTsKLSAgICBjb250ZXh0LnNldFdlYlNlcnZpY2VUZXN0VHlwZXMoZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpKTsKLSAgICBjb250ZXh0LnNldE5vbkphdmFUZXN0U2VydmljZShnZXROb25KYXZhVGVzdFNlcnZpY2UoKSk7Ci0gICAgCi0gICAgY29udGV4dC5zZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSggZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKSApOwotICAgIGNvbnRleHQuc2V0V2ViU2VydmljZVR5cGUoIGdldFdlYlNlcnZpY2VUeXBlKCkgKTsKLSAgICBjb250ZXh0LnNldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlciggZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkgKTsKLSAgICBjb250ZXh0LnNldFN0YXJ0V2ViU2VydmljZSggZ2V0U3RhcnRXZWJTZXJ2aWNlKCkgKTsKLSAgICBjb250ZXh0LnNldEdlbmVyYXRlUHJveHkoIGdldEdlbmVyYXRlUHJveHkoKSApOwotICAgIGNvbnRleHQuc2V0VGVzdFdlYlNlcnZpY2UoIGdldFRlc3RXZWJTZXJ2aWNlKCkgKTsKLSAgICBjb250ZXh0LnNldE1vbml0b3JXZWJTZXJ2aWNlKGdldE1vbml0b3JXZWJTZXJ2aWNlKCkpOwotICAgIGNvbnRleHQuc2V0TGF1bmNoU2FtcGxlRW5hYmxlZCggaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkgKTsKLSAgICAKLSAgICByZXR1cm4gY29udGV4dDsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQ0xJRU5UX1dFQlNFUlZJQ0VfVFlQRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50V2ViU2VydmljZVR5cGVEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfQ0xJRU5UX1dFQlNFUlZJQ0VfVFlQRSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0R2VuZXJhdGVQcm94eSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1BST1hZKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRCb29sZWFuKFBSRUZFUkVOQ0VfR0VORVJBVEVfUFJPWFkpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfTEFVTkNIX1dFQlNFUlZJQ0VfRVhQTE9SRVIpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXJEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0Qm9vbGVhbihQUkVGRVJFTkNFX0xBVU5DSF9XRUJTRVJWSUNFX0VYUExPUkVSKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRTdGFydFdlYlNlcnZpY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0U3RhcnRXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1NUQVJUX1dFQlNFUlZJQ0UpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGFydFdlYlNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0Qm9vbGVhbihQUkVGRVJFTkNFX1NUQVJUX1dFQlNFUlZJQ0UpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldFRlc3RXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1RFU1RfV0VCU0VSVklDRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFRlc3RXZWJTZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldFdlYlNlcnZpY2VUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RZUEUpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX1dFQlNFUlZJQ0VfVFlQRSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFdlYlNlcnZpY2VUeXBlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKCBQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUsIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVByb3h5KGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9HRU5FUkFURV9QUk9YWSwgdmFsdWUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldExhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcihib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9MQVVOQ0hfV0VCU0VSVklDRV9FWFBMT1JFUiwgdmFsdWUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFN0YXJ0V2ViU2VydmljZShib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3RhcnRXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9TVEFSVF9XRUJTRVJWSUNFLCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0VGVzdFdlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9URVNUX1dFQlNFUlZJQ0UsIHZhbHVlKTsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFdlYlNlcnZpY2VUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVHlwZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBzZXRWYWx1ZSggUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RZUEUsIHZhbHVlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TW9uaXRvcldlYlNlcnZpY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXREZWZhdWx0Qm9vbGVhbihQUkVGRVJFTkNFX01PTklUT1JfV0VCU0VSVklDRSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldE1vbml0b3JXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yV2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9NT05JVE9SX1dFQlNFUlZJQ0UsIHZhbHVlKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRMYXVuY2hTYW1wbGVFbmFibGVkRGVmYXVsdCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hTYW1wbGVFbmFibGVkRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEJvb2xlYW4oUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0xBVU5DSF9TQU1QTEUpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldExhdW5jaFNhbXBsZUVuYWJsZWQoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFNhbXBsZUVuYWJsZWQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHNldFZhbHVlKCBQUkVGRVJFTkNFX0xBVU5DSF9TQU1QTEUsIHZhbHVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRVRERJUHJlZmVyZW5jZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODg4MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRVRERJUHJlZmVyZW5jZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudENvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRVRERJUHJlZmVyZW5jZUNvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dCBpbXBsZW1lbnRzIFVERElQcmVmZXJlbmNlQ29udGV4dAotewotICBwdWJsaWMgUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dCgpCi0gIHsKLSAgICBzdXBlcihXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbG9hZCgpCi0gIHsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU1JVEVSLCBVRERJUHJlZmVyZW5jZURlZmF1bHRzLmdldFVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyKCkpOwotICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX1NUUklOR19ERUxJTUlURVIsIFVERElQcmVmZXJlbmNlRGVmYXVsdHMuZ2V0VWRkaUNhdERhdGFTdHJpbmdEZWxpbWl0ZXIoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVZGRpQ2F0RGF0YUNvbHVtbkRlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX0NPTFVNTl9ERUxJTUlURVIsIGRlbGltaXRlcik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU1JVEVSKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpCi0gIHsKLSAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1VERElfQ0FUX0RBVEFfU1RSSU5HX0RFTElNSVRFUiwgZGVsaW1pdGVyKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VWRkaUNhdERhdGFTdHJpbmdEZWxpbWl0ZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX1NUUklOR19ERUxJTUlURVIpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1Byb2plY3RUb3BvbG9neUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNmQzMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1Byb2plY3RUb3BvbG9neUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotcHVibGljIGludGVyZmFjZSBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IAotewotICAvKioKLSAgICAqIFRoaXMgY29uc3RhbnQgU3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBwcmVmZXJyZWQgb3JkZXIgb2YgdGhlIGRpZmZlcmVudCBjbGllbnQgdHlwZXMKLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ0xJRU5UX1RZUEVTID0gImNsaWVudFR5cGVzIjsKLSAgCi0gIC8qKgotICAgICogVGhpcyBjb25zdGFudCBTdHJpbmcgaXMgdXNlZCB0byBsb29rdXAgdGhlIHR3byBFQVIgb3B0aW9uCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1VTRV9UV09fRUFSUyA9ICJ1c2VUd29FQVJzIjsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFR5cGVzKFN0cmluZ1tdIGlkcyk7Ci0gIHB1YmxpYyBTdHJpbmdbXSBnZXRDbGllbnRUeXBlcygpOwotCi0gIHB1YmxpYyB2b2lkIHNldFVzZVR3b0VBUnMoYm9vbGVhbiB1c2UpOwotICBwdWJsaWMgYm9vbGVhbiBpc1VzZVR3b0VBUnMoKTsKLQotICBwdWJsaWMgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb3B5KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvUHJvamVjdFRvcG9sb2d5RGVmYXVsdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9Qcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjBjNjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9Qcm9qZWN0VG9wb2xvZ3lEZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotcHVibGljIGNsYXNzIFByb2plY3RUb3BvbG9neURlZmF1bHRzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZXMoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWcuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiLCAiY2xpZW50UHJvamVjdFR5cGUiKTsKLSAgICBTdHJpbmdbXSB0eXBlcyA9IG5ldyBTdHJpbmdbZWxlbWVudHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgdHlwZXNbaV0gPSBlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoImlkIik7Ci0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVXNlVHdvRUFScygpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmNiZDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9TY2VuYXJpb0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU2NlbmFyaW9Db250ZXh0IAotewotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfV0VCU0VSVklDRV9URVNUX1RZUEVTID0gIndlYlNlcnZpY2VUZXN0VHlwZXMiOwotICAgIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTk9OX0pBVkFfVEVTVF9TRVJWSUNFPSAibm9uSmF2YVRlc3RTZXJ2aWNlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XRUJTRVJWSUNFX1RZUEUgPSAid2ViU2VydmljZVR5cGUiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1NUQVJUX1dFQlNFUlZJQ0UgPSAic3RhcnRXZWJTZXJ2aWNlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9MQVVOQ0hfV0VCU0VSVklDRV9FWFBMT1JFUiA9ICJsYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0dFTkVSQVRFX1BST1hZID0gImdlbmVyYXRlUHJveHkiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NMSUVOVF9XRUJTRVJWSUNFX1RZUEUgPSAiY2xpZW50V2ViU2VydmljZVR5cGUiOwotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1RFU1RfV0VCU0VSVklDRSA9ICJ0ZXN0V2ViU2VydmljZSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfTU9OSVRPUl9XRUJTRVJWSUNFID0gIm1vbml0b3JXZWJTZXJ2aWNlIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9MQVVOQ0hfU0FNUExFID0gImxhdW5jaFNhbXBsZSI7Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZVRlc3RUeXBlcygpOwotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKFN0cmluZ1tdIHRlc3RUeXBlcyk7Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE5vbkphdmFUZXN0U2VydmljZSgpOwotICAKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgIHNldFdlYlNlcnZpY2VUeXBlKCBTdHJpbmcgdmFsdWUgKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZSgpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGFydFdlYlNlcnZpY2VEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldFN0YXJ0V2ViU2VydmljZSggYm9vbGVhbiB2YWx1ZSApOwotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCk7Ci0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlckRlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICAgc2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCBib29sZWFuIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCk7Ci0gIHB1YmxpYyBib29sZWFuIGdldEdlbmVyYXRlUHJveHlEZWZhdWx0KCk7Ci0gIHB1YmxpYyB2b2lkICAgIHNldEdlbmVyYXRlUHJveHkoIGJvb2xlYW4gdmFsdWUgKTsKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKTsKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICBzZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSggU3RyaW5nIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZSgpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZURlZmF1bHQoKTsKLSAgcHVibGljIHZvaWQgICAgc2V0VGVzdFdlYlNlcnZpY2UoIGJvb2xlYW4gdmFsdWUgKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlKCk7Ci0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlRGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCBzZXRNb25pdG9yV2ViU2VydmljZShib29sZWFuIHZhbHVlKTsKLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzTGF1bmNoU2FtcGxlRW5hYmxlZCgpOwotICBwdWJsaWMgYm9vbGVhbiBnZXRMYXVuY2hTYW1wbGVFbmFibGVkRGVmYXVsdCgpOwotICBwdWJsaWMgdm9pZCAgICBzZXRMYXVuY2hTYW1wbGVFbmFibGVkKCBib29sZWFuIHZhbHVlICk7Ci0gIAotICBwdWJsaWMgU2NlbmFyaW9Db250ZXh0IGNvcHkoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvU2NlbmFyaW9EZWZhdWx0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1NjZW5hcmlvRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhZWIyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvU2NlbmFyaW9EZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmRhdGEuTGFiZWxzQW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdC5XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5OwotCi0KLQotcHVibGljIGNsYXNzIFNjZW5hcmlvRGVmYXVsdHMKLXsgIAotICAKLQkKLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKQotICB7Ci0gIAkvL3dlIHdpbGwgc2V0IHRoZSBob21lIGdyb3duIHNhbXBsZSBhcyB0aGUgZmlyc3QgY2hvaWNlCi0gIAlXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHRlc3RSZWdpc3RyeSA9IFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgCQotICAJTGFiZWxzQW5kSWRzIGxhYmVsc2FuZGlkcyA9IHRlc3RSZWdpc3RyeS5nZXRMYWJlbHNBbmRJRHMoKTsKLSAgCVN0cmluZ1tdIGxhYmVscyA9IGxhYmVsc2FuZGlkcy5nZXRMYWJlbHNfKCk7Ci0gIAlTdHJpbmdbXSBpZHMgPSBsYWJlbHNhbmRpZHMuZ2V0SWRzXygpOwotICAJCi0gIAlTdHJpbmdbXSBuZXdOYW1lcyA9IG5ldyBTdHJpbmdbbGFiZWxzLmxlbmd0aF07Ci0gIAlpbnQgaW5kZXggPSAtMTsKLSAgCWZvcihpbnQgaSA9IDA7aTxpZHMubGVuZ3RoO2krKyl7Ci0gIAkgIGlmKGlkc1tpXS5lcXVhbHMoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLnRlc3QuV2ViU2VydmljZVNhbXBsZVRlc3QiKSkgIAkKLSAgCSAgICBpbmRleCA9IGk7ICAgCi0gIAl9Ci0gIAlpZihpbmRleCAhPSAtMSl7Ci0gIAkgIG5ld05hbWVzWzBdID0gbGFiZWxzW2luZGV4XTsKLSAgCSAgaW50IGogPSAxOwotICAJICBmb3IoaW50IGkgPSAwO2k8bGFiZWxzLmxlbmd0aDtpKyspewotICAJICAgIGlmKGkgIT0gaW5kZXgpewotICAJICAJICBuZXdOYW1lc1tqXSA9IGxhYmVsc1tpXTsgCi0gIAkgICAgICBqKys7Ci0gIAkgICAgfQotICAJICB9Ci0gIAl9Ci0gIAllbHNlIHJldHVybiBsYWJlbHM7Ci0gIAkKLSAgCXJldHVybiBuZXdOYW1lczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXROb25KYXZhVGVzdFNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiAiV2ViIFNlcnZpY2VzIEV4cGxvcmVyIjsJCi0gIH0gCi0gIAotICBwdWJsaWMgU3RyaW5nIHdlYnNlcnZpY2VUeXBlSWREZWZhdWx0KCkKLSAgewotICAgIHJldHVybiAiMC9vcmcuZWNsaXBzZS5qc3Qud3MudHlwZS5qYXZhIjsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gc3RhcnRXZWJzZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gbGF1bmNoV2Vic2VydmljZUV4cGxvcmVyRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdlbmVyYXRlUHJveHlEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyB3ZWJzZXJ2aWNlQ2xpZW50VHlwZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS5qc3Qud3MuY2xpZW50LnR5cGUuamF2YSI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHRlc3RXZWJzZXJ2aWNlRGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBsYXVuY2hTYW1wbGUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9UcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGEyODliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9UcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFRyYW5zaWVudFByb2plY3RUb3BvbG9neUNvbnRleHQgaW1wbGVtZW50cyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0Ci17Ci0gcHJpdmF0ZSBTdHJpbmdbXSBjbGllbnRUeXBlczsKLSBwcml2YXRlIGJvb2xlYW4gdHdvRUFSczsKLSAKLSBwdWJsaWMgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCAoKSB7fQotCi0gcHVibGljIHZvaWQgc2V0Q2xpZW50VHlwZXMoU3RyaW5nW10gY2xpZW50VHlwZXMpCi0gewotICAgdGhpcy5jbGllbnRUeXBlcyA9IGNsaWVudFR5cGVzOwotIH0KLSBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xpZW50VHlwZXMoKQotIHsKLSAgIHJldHVybiBjbGllbnRUeXBlczsKLSB9Ci0KLSBwdWJsaWMgdm9pZCBzZXRVc2VUd29FQVJzKGJvb2xlYW4gdXNlKQotIHsKLSAgIHRoaXMudHdvRUFScyA9IHVzZTsKLSB9Ci0gcHVibGljIGJvb2xlYW4gaXNVc2VUd29FQVJzKCkKLSB7Ci0gICByZXR1cm4gdHdvRUFSczsKLSB9Ci0KLSBwdWJsaWMgUHJvamVjdFRvcG9sb2d5Q29udGV4dCBjb3B5KCkgewotIAlUcmFuc2llbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGNvbnRleHQgPSBuZXcgVHJhbnNpZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotCWNvbnRleHQuc2V0Q2xpZW50VHlwZXMoZ2V0Q2xpZW50VHlwZXMoKSk7Ci0JY29udGV4dC5zZXRVc2VUd29FQVJzKGlzVXNlVHdvRUFScygpKTsKLQlyZXR1cm4gY29udGV4dDsKLSB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVHJhbnNpZW50U2NlbmFyaW9Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MzA2MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1RyYW5zaWVudFNjZW5hcmlvQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotcHVibGljIGNsYXNzIFRyYW5zaWVudFNjZW5hcmlvQ29udGV4dCBpbXBsZW1lbnRzIFNjZW5hcmlvQ29udGV4dAotewotICBwcml2YXRlIFN0cmluZ1tdIHdlYlNlcnZpY2VUZXN0VHlwZXM7Ci0gIHByaXZhdGUgU3RyaW5nICAgbm9uSmF2YVRlc3RTZXJ2aWNlOwotICBwcml2YXRlIFN0cmluZyAgIHdlYlNlcnZpY2VUeXBlXzsKLSAgcHJpdmF0ZSBib29sZWFuICBzdGFydFdlYlNlcnZpY2VfOwotICBwcml2YXRlIGJvb2xlYW4gIGxhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcl87Ci0gIHByaXZhdGUgYm9vbGVhbiAgZ2VuZXJhdGVQcm94eV87Ci0gIHByaXZhdGUgU3RyaW5nICAgY2xpZW50V2ViU2VydmljZVR5cGVfOwotICBwcml2YXRlIGJvb2xlYW4gIHRlc3RXZWJTZXJ2aWNlXzsKLSAgcHJpdmF0ZSBib29sZWFuICBtb25pdG9yV2ViU2VydmljZTsKLSAgcHJpdmF0ZSBib29sZWFuICBsYXVuY2hTYW1wbGVfOwotICAKLSAgcHJpdmF0ZSBTY2VuYXJpb0RlZmF1bHRzIGRlZmF1bHRzID0gbmV3IFNjZW5hcmlvRGVmYXVsdHMoKTsKLSAKLSAgcHVibGljIFRyYW5zaWVudFNjZW5hcmlvQ29udGV4dCAoKSB7fQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBub25KYXZhVGVzdFNlcnZpY2U7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKFN0cmluZyBub25KYXZhVGVzdFNlcnZpY2UpCi0gIHsKLSAgICB0aGlzLm5vbkphdmFUZXN0U2VydmljZSA9IG5vbkphdmFUZXN0U2VydmljZTsJCi0gIH0KLSAKLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVRlc3RUeXBlcyhTdHJpbmdbXSB3ZWJTZXJ2aWNlVGVzdFR5cGVzKQotICB7Ci0gICAgdGhpcy53ZWJTZXJ2aWNlVGVzdFR5cGVzID0gd2ViU2VydmljZVRlc3RUeXBlczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldFdlYlNlcnZpY2VUZXN0VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VUZXN0VHlwZXM7CQotICB9Ci0gCi0gIHB1YmxpYyBTY2VuYXJpb0NvbnRleHQgY29weSgpIHsKLSAgCVRyYW5zaWVudFNjZW5hcmlvQ29udGV4dCBjb250ZXh0ID0gbmV3IFRyYW5zaWVudFNjZW5hcmlvQ29udGV4dCgpOwotCWNvbnRleHQuc2V0V2ViU2VydmljZVRlc3RUeXBlcyhnZXRXZWJTZXJ2aWNlVGVzdFR5cGVzKCkpOwotCWNvbnRleHQuc2V0Tm9uSmF2YVRlc3RTZXJ2aWNlKGdldE5vbkphdmFUZXN0U2VydmljZSgpKTsKLQkKLQljb250ZXh0LnNldFdlYlNlcnZpY2VUeXBlKCBnZXRXZWJTZXJ2aWNlVHlwZSgpICk7Ci0JY29udGV4dC5zZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSggZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKSApOwotCWNvbnRleHQuc2V0R2VuZXJhdGVQcm94eSggZ2V0R2VuZXJhdGVQcm94eSgpICk7Ci0JY29udGV4dC5zZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpICk7Ci0JY29udGV4dC5zZXRTdGFydFdlYlNlcnZpY2UoIGdldFN0YXJ0V2ViU2VydmljZSgpICk7Ci0JY29udGV4dC5zZXRUZXN0V2ViU2VydmljZSggZ2V0VGVzdFdlYlNlcnZpY2UoKSApOwotCWNvbnRleHQuc2V0TW9uaXRvcldlYlNlcnZpY2UoZ2V0TW9uaXRvcldlYlNlcnZpY2UoKSk7Ci0JY29udGV4dC5zZXRMYXVuY2hTYW1wbGVFbmFibGVkKCBpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKSApOwotCXJldHVybiBjb250ZXh0OwotICB9Ci0gCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0Q2xpZW50V2ViU2VydmljZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRXZWJTZXJ2aWNlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gY2xpZW50V2ViU2VydmljZVR5cGVfOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFdlYlNlcnZpY2VUeXBlRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMud2Vic2VydmljZUNsaWVudFR5cGVEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0R2VuZXJhdGVQcm94eSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRHZW5lcmF0ZVByb3h5KCkKLSAgewotICAgIHJldHVybiBnZW5lcmF0ZVByb3h5XzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0R2VuZXJhdGVQcm94eURlZmF1bHQoKXsgcmV0dXJuIGRlZmF1bHRzLmdlbmVyYXRlUHJveHlEZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFdlYlNlcnZpY2VFeHBsb3JlcigpCi0gIHsKLSAgICByZXR1cm4gbGF1bmNoV2ViU2VydmljZUV4cGxvcmVyXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyRGVmYXVsdCgpeyByZXR1cm4gZGVmYXVsdHMubGF1bmNoV2Vic2VydmljZUV4cGxvcmVyRGVmYXVsdCgpOyB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldFN0YXJ0V2ViU2VydmljZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTdGFydFdlYlNlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIHN0YXJ0V2ViU2VydmljZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFN0YXJ0V2ViU2VydmljZURlZmF1bHQoKXsgcmV0dXJuIGRlZmF1bHRzLnN0YXJ0V2Vic2VydmljZURlZmF1bHQoKTsgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNnZXRUZXN0V2ViU2VydmljZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gdGVzdFdlYlNlcnZpY2VfOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRUZXN0V2ViU2VydmljZURlZmF1bHQoKXsgcmV0dXJuIGRlZmF1bHRzLnRlc3RXZWJzZXJ2aWNlRGVmYXVsdCgpOyB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldFdlYlNlcnZpY2VUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHdlYlNlcnZpY2VUeXBlXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXZWJTZXJ2aWNlVHlwZURlZmF1bHQoKXsgcmV0dXJuIGRlZmF1bHRzLndlYnNlcnZpY2VUeXBlSWREZWZhdWx0KCk7IH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0Q2xpZW50V2ViU2VydmljZVR5cGUoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFdlYlNlcnZpY2VUeXBlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGNsaWVudFdlYlNlcnZpY2VUeXBlXyA9IHZhbHVlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldEdlbmVyYXRlUHJveHkoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlUHJveHkoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIGdlbmVyYXRlUHJveHlfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0TGF1bmNoV2ViU2VydmljZUV4cGxvcmVyKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMYXVuY2hXZWJTZXJ2aWNlRXhwbG9yZXIoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIGxhdW5jaFdlYlNlcnZpY2VFeHBsb3Jlcl8gPSB2YWx1ZTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRTdGFydFdlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0V2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc3RhcnRXZWJTZXJ2aWNlXyA9IHZhbHVlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldFRlc3RXZWJTZXJ2aWNlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXN0V2ViU2VydmljZShib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdGVzdFdlYlNlcnZpY2VfID0gdmFsdWU7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNzZXRXZWJTZXJ2aWNlVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVR5cGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgd2ViU2VydmljZVR5cGVfID0gdmFsdWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldE1vbml0b3JXZWJTZXJ2aWNlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldE1vbml0b3JXZWJTZXJ2aWNlKCkKLSAgewotICAgIHJldHVybiBtb25pdG9yV2ViU2VydmljZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0TW9uaXRvcldlYlNlcnZpY2VEZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBkZWZhdWx0cy5nZXRNb25pdG9yV2ViU2VydmljZURlZmF1bHQoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQjc2V0TW9uaXRvcldlYlNlcnZpY2UoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1vbml0b3JXZWJTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBtb25pdG9yV2ViU2VydmljZSA9IHZhbHVlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I2dldExhdW5jaFNhbXBsZUVuYWJsZWREZWZhdWx0KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldExhdW5jaFNhbXBsZUVuYWJsZWREZWZhdWx0KCkKLSAgewotICAgIHJldHVybiBkZWZhdWx0cy5sYXVuY2hTYW1wbGUoKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dCNpc0xhdW5jaFNhbXBsZUVuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMYXVuY2hTYW1wbGVFbmFibGVkKCkKLSAgewotICAgIHJldHVybiBsYXVuY2hTYW1wbGVfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuU2NlbmFyaW9Db250ZXh0I3NldExhdW5jaFNhbXBsZUVuYWJsZWQoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhdW5jaFNhbXBsZUVuYWJsZWQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIGxhdW5jaFNhbXBsZV8gPSB2YWx1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1VERElQcmVmZXJlbmNlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1VERElQcmVmZXJlbmNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjRhZGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29udGV4dC9VRERJUHJlZmVyZW5jZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVURESVByZWZlcmVuY2VDb250ZXh0IAotewotICAvKgotICAgKiBUaGlzIGNvbnN0YW50IFN0cmluZyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgY29sdW1uIGRlbGltaXRlciBmb3IgdXNlci1kZWZpbmVkIFVEREkKLSAgICogQ2F0ZWdvcnkgZGF0YS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVURESV9DQVRfREFUQV9DT0xVTU5fREVMSU1JVEVSID0gInVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyIjsKLSAgCi0gIC8qCi0gICAqIFRoaXMgY29uc3RhbnQgU3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBzdHJpbmcgZGVsaW1pdGVyIGZvciB1c2VyLWRlZmluZWQgVURESQotICAgKiBDYXRlZ29yeSBkYXRhLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9VRERJX0NBVF9EQVRBX1NUUklOR19ERUxJTUlURVIgPSAidWRkaUNhdERhdGFTdHJpbmdEZWxpbWl0ZXIiOwotICAKLSAgcHVibGljIHZvaWQgc2V0VWRkaUNhdERhdGFDb2x1bW5EZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcik7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0VWRkaUNhdERhdGFDb2x1bW5EZWxpbWl0ZXIoKTsKLSAgcHVibGljIHZvaWQgc2V0VWRkaUNhdERhdGFTdHJpbmdEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcik7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0VWRkaUNhdERhdGFTdHJpbmdEZWxpbWl0ZXIoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VEZWZhdWx0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb250ZXh0L1VERElQcmVmZXJlbmNlRGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllYmE5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnRleHQvVURESVByZWZlcmVuY2VEZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dDsKLQotcHVibGljIGNsYXNzIFVERElQcmVmZXJlbmNlRGVmYXVsdHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VWRkaUNhdERhdGFDb2x1bW5EZWxpbWl0ZXIoKQotICB7Ci0gICAgcmV0dXJuICIjIjsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VWRkaUNhdERhdGFTdHJpbmdEZWxpbWl0ZXIoKQotICB7Ci0gICAgcmV0dXJuICJcIiI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZGF0YS9MYWJlbHNBbmRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZGF0YS9MYWJlbHNBbmRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMGY2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2RhdGEvTGFiZWxzQW5kSWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YTsKLQotcHVibGljIGNsYXNzIExhYmVsc0FuZElkcwotewotICBwcml2YXRlIFN0cmluZ1tdIGxhYmVsc187Ci0gIHByaXZhdGUgU3RyaW5nW10gaWRzXzsKLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlkc18uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0SWRzXygpCi0gIHsKLSAgICByZXR1cm4gaWRzXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIGlkc18gVGhlIGlkc18gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SWRzXyhTdHJpbmdbXSBpZHNfKQotICB7Ci0gICAgdGhpcy5pZHNfID0gaWRzXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsYWJlbHNfLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldExhYmVsc18oKQotICB7Ci0gICAgcmV0dXJuIGxhYmVsc187Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBsYWJlbHNfIFRoZSBsYWJlbHNfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExhYmVsc18oU3RyaW5nW10gbGFiZWxzXykKLSAgewotICAgIHRoaXMubGFiZWxzXyA9IGxhYmVsc187Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZGF0YS9UeXBlUnVudGltZVNlcnZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL1R5cGVSdW50aW1lU2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYzM0OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kYXRhL1R5cGVSdW50aW1lU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YTsKLQotcHVibGljIGNsYXNzIFR5cGVSdW50aW1lU2VydmVyCi17Ci0gIHByaXZhdGUgU3RyaW5nIHR5cGVJZF8gICAgID0gIiI7Ci0gIHByaXZhdGUgU3RyaW5nIHJ1bnRpbWVJZF8gID0gIiI7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlcklkXyAgID0gIiI7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZlckluc3RhbmNlSWRfOwotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcnVudGltZUlkXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUlkKCkKLSAgewotICAgIHJldHVybiBydW50aW1lSWRfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gcnVudGltZUlkXyBUaGUgcnVudGltZUlkXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lSWQoU3RyaW5nIHJ1bnRpbWVJZF8pCi0gIHsKLSAgICB0aGlzLnJ1bnRpbWVJZF8gPSBydW50aW1lSWRfOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlcklkXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySWQoKQotICB7Ci0gICAgcmV0dXJuIHNlcnZlcklkXzsKLSAgfQotICAvKioKLSAgICogQHBhcmFtIHNlcnZlcklkXyBUaGUgc2VydmVySWRfIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlcklkKFN0cmluZyBzZXJ2ZXJJZF8pCi0gIHsKLSAgICB0aGlzLnNlcnZlcklkXyA9IHNlcnZlcklkXzsKLSAgfQotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJJbnN0YW5jZUlkXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VJZCgpCi0gIHsKLSAgICByZXR1cm4gc2VydmVySW5zdGFuY2VJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEBwYXJhbSBzZXJ2ZXJJbnN0YW5jZUlkXyBUaGUgc2VydmVySW5zdGFuY2VJZF8gdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmVySW5zdGFuY2VJZChTdHJpbmcgc2VydmVySW5zdGFuY2VJZF8pCi0gIHsKLSAgICB0aGlzLnNlcnZlckluc3RhbmNlSWRfID0gc2VydmVySW5zdGFuY2VJZF87Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHlwZUlkXy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUlkKCkKLSAgewotICAgIHJldHVybiB0eXBlSWRfOwotICB9Ci0gIC8qKgotICAgKiBAcGFyYW0gdHlwZUlkXyBUaGUgdHlwZUlkXyB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlSWQoU3RyaW5nIHR5cGVJZF8pCi0gIHsKLSAgICB0aGlzLnR5cGVJZF8gPSB0eXBlSWRfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiAidHlwZSgiICsgdHlwZUlkXyArICIpIHJ1bnRpbWUoIiArIHJ1bnRpbWVJZF8gKyAiKSBmYWN0b3J5KCIgKyBzZXJ2ZXJJZF8gKyAiKSBzZXJ2SW5zdElkKCIgKyBzZXJ2ZXJJbnN0YW5jZUlkXyArICIpIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kaWFsb2cvSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9kaWFsb2cvSVN0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODdiZmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZGlhbG9nL0lTdGF0dXNEaWFsb2dDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotCi0vKioKLSogQ29uc3RhbnRzIGZvciBzdGF0dXMgZGlhbG9ncwotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXR1c0RpYWxvZ0NvbnN0YW50cyB7Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAyLiI7Ci0KLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiWWVzIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWUVTX0lEID0gMjsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiWWVzIHRvIGFsbCIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFU19UT19BTExfSUQgPSA0OwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJDYW5jZWwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfSUQgPSAxOwotICAvKgotICAqIEJ1dHRvbiBJRCBmb3IgdGhlICJPSyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0lEID0gMDsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiRGV0YWlscyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVEFJTFNfSUQgPSAxMzsKLQotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJZZXMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfTEFCRUwgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX1lFU19MQUJFTCIpOwotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX1RPX0FMTF9MQUJFTCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJVNUQVRVU19ESUFMT0dfWUVTX1RPX0FMTF9MQUJFTCIpOwotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJDYW5jZWwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5DRUxfTEFCRUwgPSBXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX0NBTkNFTF9MQUJFTCIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4ZWN1dGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeGVjdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzI2YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4ZWN1dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0OwotCi0vKioKLSogQWxsIEV4dGVuc2lvbnMgd2l0aCBleGVjdHV0YWJsZSBleHRlbnNpb25zIHNob3VsZCBpbXBsZW1lbnQgdGhpcyAKLSogdG8gZml0IG91ciBmcmFtZXdvcmsKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VFeGVjdXRhYmxlCi17Ci0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotICAvKioKLSAgKlJldHVybnMgYSB3aXphcmQgZnJhZ21lbnQgZm9yIHRoaXMgZXhlbnRpb24gdHlwZSAKLSAgKgotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUZpbmlzaENvbW1hbmQgZ2V0RmluaXNoQ29tbWFuZCgpOwotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMzMmQwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViU2VydmljZUV4dGVuc2lvbgotewotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgb3IgYSBmcmFnbWVudCBhZGRlZAotICAqIEByZXR1cm4gV2ViU2VydmljZUV4ZWN1dGFibGUgdGhpcyBpbnRlcmZhY2UgaG9sZHMgZXhlY3V0YWJsZSBjb2RlIGFuZCBhIAotICAqIGZyYWdtZW50Ci0gICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24oKTsKLQotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBjb25maWcgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBleHRlbnNpb24gaW5mbwotICAqIEBwYXJhbSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgRXh0ZW5zaW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29uZmlnRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCk7Ci0gCi0gIC8qKgotICAqIElmIHRoZSBleHRlbnNpb24gaGFzIGNvZGUgdGhhdCAKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uRWxlbWVudCBFeHRlbnNpb24gZWxlbWVudAotICAqLwotICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ0VsZW1lbnQoKTsKLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxNmJiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci0KLQotCi0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRXh0ZW5zaW9uSW1wbCBpbXBsZW1lbnRzIFdlYlNlcnZpY2VFeHRlbnNpb24KLXsKLQotCXByaXZhdGUgTG9nCWxvZ187Ci0JCi0gIC8qCi0gICogVGhlIENvbmZpZ0VsZW1lbnQgdGhhdCBob2xkcyBleHRlbnNpb24gaW5mbwotICAqLwotICBwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnRfOwotCi0gIC8qCi0gICogVGhlIGV4dGVuc2lvbiBleGVjdXRhYmxlIAotICAqLwotICBwcm90ZWN0ZWQgV2ViU2VydmljZUV4ZWN1dGFibGUgd2ViU2VydmljZUV4ZWN1dGFibGVfOwotICAKLQotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbkltcGwoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpCi0gIHsKLSAgICBjb25maWdFbGVtZW50XyA9IGNvbmZpZ0VsZW1lbnQ7Ci0gICAgbG9nXyA9IG5ldyBFY2xpcHNlTG9nKCk7Ci0gIH0KLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBJZiB0aGUgZXh0ZW5zaW9uIGhhcyBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgb3IgYSBmcmFnbWVudCBhZGRlZAotICAqIEByZXR1cm4gV2ViU2VydmljZUV4ZWN1dGFibGUgdGhpcyBpbnRlcmZhY2UgaG9sZHMgZXhlY3V0YWJsZSBjb2RlIGFuZCBhIAotICAqIGZyYWdtZW50Ci0gICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0V2ViU2VydmljZUV4ZWN1dGFibGVFeHRlbnNpb24oKQotICB7Ci0gICAgaWYod2ViU2VydmljZUV4ZWN1dGFibGVfICE9IG51bGwpIHJldHVybiB3ZWJTZXJ2aWNlRXhlY3V0YWJsZV87Ci0KLSAgICB0cnl7Ci0gICAgICByZXR1cm4gY29uZmlnRWxlbWVudF8uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLSAgICB9Y2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0gICAgICBsb2dfLmxvZyhMb2cuRVJST1IsIDUwMjksIHRoaXMsICJnZXRXZWJTZXJ2aWNlRXhlY3V0YWJsZUV4dGVuc2lvbiIsZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBjb25maWcgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBleHRlbnNpb24gaW5mbwotICAqIEBwYXJhbSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgRXh0ZW5zaW9uIGVsZW1lbnQKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29uZmlnRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkKLSAgewotICAgIGNvbmZpZ0VsZW1lbnRfID0gY29uZmlnRWxlbWVudDsKLSAgfQkKLQotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBjb25maWcgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBleHRlbnNpb24gaW5mbwotICAqIEByZXR1cm4gSUNvbmZpZ3VyYXRpb25FbGVtZW50IEV4dGVuc2lvbiBlbGVtZW50Ci0gICovCi0gIHB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gY29uZmlnRWxlbWVudF87Ci0gIH0KLSAgCi0gIC8qKgotICAqIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gYmVpbmcgdXNlZAotICAqIEByZXR1cm4gU3RyaW5nIG5hbWUgb2YgdGhpcyBleHRlbnNpb24KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAibmFtZSIgKTsKLSAgfQotCi0KLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmMxZDA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQ7Ci0KLQotLyoqCi0qIFJldHVybnMgdGhlIG5hbWVzIG9mIHRoZSBleHRlbnNpb25zIGZvciBhIGdpdmVuIGV4dGVuc2lvbi1wb2ludCAKLSogYWxzbyByZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0cyAKLSoKLSovCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeQotewotICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbmFtZXMgb2YgYWxsIHJlZ2lzdGVyZWQgZXh0ZW5zaW9ucwotICAqIEByZXR1cm4gVGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIGV4dGVuc2lvbnMuCi0gICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRXZWJTZXJ2aWNlRXh0ZW5zaW9uTmFtZXMgKCk7Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0IG9mIHRoZSBnaXZlbiBuYW1lCi0gICpAcmV0dXJuIFdlYlNlcnZpY2VFeHRlbnNpb24gb2JqZWN0Ci0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uIGdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKCBTdHJpbmcgbmFtZSk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBBbGwgZXh0ZW50aW9uIG9iamVjdHMgaW4gdGhpcyByZWdpc3RyeQotICAqQHJldHVybiBXZWJTZXJ2aWNlRXh0ZW5zaW9uIG9iamVjdHMKLSAgKi8KLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb25bXSBnZXRXZWJTZXJ2aWNlRXh0ZW5zaW9ucygpOwotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC9XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNTNmZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZGF0YS5MYWJlbHNBbmRJZHM7Ci0KLQotLyoqCi0qIFRoaXMgaXMgYSBnZW5lcmljIHJlZ2lzdHJ5IHdoaWNoIHNldHMgdXAgZ2VuZXJhbCBjb2RlIGluIGhhbmRsaW5nICAgCi0qIElDb25maWdFbGVtZW50cyBmb3IgYW4gZXh0ZW5zaW9uCi0qLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwgaW1wbGVtZW50cyBXZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIAotICBwcml2YXRlIEhhc2h0YWJsZSBuYW1lRXh0ZW5zaW9uVGFibGVfOwotICBwcml2YXRlIFZlY3RvciBpZF87Ci0gIHByaXZhdGUgVmVjdG9yIGxhYmVsXzsKLSAgcHJpdmF0ZSBMYWJlbHNBbmRJZHMgbGFiZWxzYW5kaWRzXzsKLSAgICAKLSAgcHVibGljIFdlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwoKQotICB7Ci0gICAgbmFtZUV4dGVuc2lvblRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBsYWJlbF8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWRfID0gbmV3IFZlY3RvcigpOwotICAgIGxvYWRFeHRlbnNpb25zKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIENoaWxkcmVuIHJlZ2lzdHJpZXMgd2lsbCBoYXZlIGRpZmZlcmVudCBleHRlbnNpb24gdHlwZXMgCi0gICogQHJldHVybiBXZWJzZXJ2aWNlRXh0ZW5zaW9uIGhvbGRzIGEgY29uZmlnIGVsZW0KLSAgKiBmb3IgdGhhdCBleHRlbnNpb24gY2FwYWJsZSBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIGZpbGUKLSAgKi8KLSAgcHVibGljIGFic3RyYWN0IFdlYlNlcnZpY2VFeHRlbnNpb24gY3JlYXRlV2ViU2VydmljZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCk7Ci0KLSAgLyoqCi0gICogQ2hpbGRyZW4gbXVzdCBpbXBsZW1lbnQgaG93IHRoZXkgZ2V0IHRoZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSAKLSAgKiBAcmV0dXJuIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGFuIGFycmF5IG9mIGVsZW1lbnRzIHBhcnRpY3VsYXIgdG8gdGhhdAotICAqIGV4dGVuc2lvbgotICAqLwotICBwdWJsaWMgYWJzdHJhY3QgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0Q29uZmlnRWxlbWVudHMoKTsKLQotICAvKgotICAqIExvYWRzIFdlYlNlcnZpY2VFeHRlbnNpb25zIGZvciBXZWJTZXJ2aWNlQ2xpZW50VGVzdCBpbnRvIHRoaXMgcmVnaXN0cnkuCi0gICogVGhpcyBpcyBkb25lIGJ5IHF1ZXJ5aW5nIHRoZSBwbHVnaW4gcmVnaXN0cnkgZm9yIGFsbCBleHRlbnNpb25zCi0gICogdGhhdCBleHRlbmQgd2ViU2VydmljZUNsaWVudFRlc3QgIAotICAqLwotICBwcml2YXRlIHZvaWQgbG9hZEV4dGVuc2lvbnMgKCkKLSAgeyAgICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSBnZXRDb25maWdFbGVtZW50cygpOwotCi0gICAgZm9yKGludCBpZHg9MDsgaWR4PGNvbmZpZy5sZW5ndGg7IGlkeCsrKSAKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSA9IGNvbmZpZ1tpZHhdOwotICAgICAgU3RyaW5nIGxhYmVsID0gZWxlbS5nZXRBdHRyaWJ1dGUoICJsYWJlbCIgKTsKLSAgICAgIFN0cmluZyBpZCA9ICAgZWxlbS5nZXRBdHRyaWJ1dGUoICJpZCIgKTsgICAgICAKLSAgICAgIFdlYlNlcnZpY2VFeHRlbnNpb24gd2ViU2VydmljZUV4dGVuc2lvbiA9IGNyZWF0ZVdlYlNlcnZpY2VFeHRlbnNpb24oZWxlbSk7CQotICAgICAgbmFtZUV4dGVuc2lvblRhYmxlXy5wdXQobGFiZWwsd2ViU2VydmljZUV4dGVuc2lvbik7Ci0gICAgICBsYWJlbF8uYWRkKGxhYmVsKTsKLSAgICAgIGlkXy5hZGQoaWQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIGV4dGVuc2lvbnMKLSAgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiBhbGwgcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbk5hbWVzICgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKW5hbWVFeHRlbnNpb25UYWJsZV8ua2V5U2V0KCkudG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbmFtZXMgYW5kIElkcyAKLSAgICovCi0gIHB1YmxpYyBMYWJlbHNBbmRJZHMgZ2V0TGFiZWxzQW5kSURzKCkKLSAgewotICAJbGFiZWxzYW5kaWRzXyA9IG5ldyBMYWJlbHNBbmRJZHMoKTsKLSAgCWxhYmVsc2FuZGlkc18uc2V0TGFiZWxzXygoU3RyaW5nW10pbGFiZWxfLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKSk7Ci0gIAlsYWJlbHNhbmRpZHNfLnNldElkc18oKFN0cmluZ1tdKWlkXy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICkpOwotICAJcmV0dXJuIGxhYmVsc2FuZGlkc187Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvYmplY3Qgb2YgdGhlIGdpdmVuIG5hbWUKLSAgKiBAcmV0dXJuIFdlYlNlcnZpY2VFeHRlbnNpb24gb2JqZWN0Ci0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uIGdldFdlYlNlcnZpY2VFeHRlbnNpb25zQnlOYW1lKCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiAoV2ViU2VydmljZUV4dGVuc2lvbiluYW1lRXh0ZW5zaW9uVGFibGVfLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgQWxsIGV4dGVudGlvbiBvYmplY3RzIGluIHRoaXMgcmVnaXN0cnkKLSAgKkByZXR1cm4gV2ViU2VydmljZUV4dGVuc2lvbiBvYmplY3RzCi0gICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlRXh0ZW5zaW9uW10gZ2V0V2ViU2VydmljZUV4dGVuc2lvbnMoKQotICB7Ci0gICAgcmV0dXJuIChXZWJTZXJ2aWNlRXh0ZW5zaW9uW10pbmFtZUV4dGVuc2lvblRhYmxlXy52YWx1ZXMoKS50b0FycmF5KCBuZXcgV2ViU2VydmljZUV4dGVuc2lvblswXSApOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUZpbmlzaENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L1dlYlNlcnZpY2VGaW5pc2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1N2NiMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvV2ViU2VydmljZUZpbmlzaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VGaW5pc2hDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9KYXZhUHJveHlUZXN0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9KYXZhUHJveHlUZXN0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWMzODdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvSmF2YVByb3h5VGVzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKgotKiA8Y29weXJpZ2h0PgotKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSoKLSogPC9jb3B5cmlnaHQ+Ci0qLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5leHQudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbi5Cb29sZWFuU2VsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQcm94eVRlc3RDb21tYW5kIGV4dGVuZHMgV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kCi17Ci0KLSAvKioKLSAgKiBUaGlzIGhvbGRzIGFuIGluZm8gY2xhc3MgdGhhdCBjb21lcyBmcm9tIHVzZXIgaW5wdXQgb3Igc29tZSBjYWxjaWxhdGlvbnMgdGhhdCBuZWVkcyB0byBiZQotICAqIHVzZWQgZm9yIHRoZSBmaW5pc2gKLSAgKi8KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEpzcEZvbGRlcihTdHJpbmcganNwRm9sZGVyKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFJ1bkNsaWVudFRlc3QoYm9vbGVhbiBydW5DbGllbnRUZXN0KTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldFNhbXBsZVByb2plY3QoU3RyaW5nIHNhbXBsZVByb2plY3QpOwotICAKLSAgcHVibGljIHZvaWQgc2V0UHJveHlCZWFuKFN0cmluZyBwcm94eUJlYW4pOwotICAKLSAgcHVibGljIHZvaWQgc2V0U2V0RW5kcG9pbnRNZXRob2QoU3RyaW5nIHNldEVuZHBvaW50TWV0aG9kKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHNldENsaWVudFByb2plY3QoU3RyaW5nIGNsaWVudFByb2plY3QpOwotICAKLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcyk7Ci0gIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV1NETFRlc3RGaW5pc2hDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC90ZXN0L1dTRExUZXN0RmluaXNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTIzZGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV1NETFRlc3RGaW5pc2hDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioKLSogPGNvcHlyaWdodD4KLSoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qCi0qIDwvY29weXJpZ2h0PgotKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LnRlc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFRlc3RGaW5pc2hDb21tYW5kIGV4dGVuZHMgV2ViU2VydmljZVRlc3RGaW5pc2hDb21tYW5kCi17Ci0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm9qZWN0KFN0cmluZyBzZXJ2ZXJQcm9qZWN0KTsKLSAgcHVibGljIHZvaWQgc2V0V3NkbFNlcnZpY2VVUkwoU3RyaW5nIHdzZGxVUkkpOwotICBwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbEJyb3dzZXIoYm9vbGVhbiBleHRlcm5hbCk7IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmY3ZDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeHRlbnNpb25JbXBsOwotCi0KLQotLyoqCi0qIFRoaXMgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gaW4gdGhlIHBsdWdpbiByZWdpc3RyeSAKLSogSXQgam9iIGlzIHRvIGFjdCBhcyBhIHByb3h5IHRvIHRoZSBpY29uZmlnZWxlbWVudAotKiBJbiBwYXJ0aWN1bGFyIGl0IGhvbGRzIGEgY2xpZW50IHRlc3QgZXh0ZW5zaW9uIGVsZW1lbnQgCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uIGV4dGVuZHMgV2ViU2VydmljZUV4dGVuc2lvbkltcGwKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHVibGljIFdlYlNlcnZpY2VUZXN0RXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgc3VwZXIoY29uZmlnRWxlbWVudCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFdpbGwgdGhpcyB0ZXN0Q2xpZW50IGdlbmVyYXRlIGNvZGUKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjb2RlZ2VuIG5lZWRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NvZGVHZW5OZWVkZWQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAiY29kZWdlbiIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFVzZSB0aGUgZGVmYXVsdCBGb2xkZXIgUHJvdmlkZWQgYnkgdXMKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBubyBzcGVjaWFsIGZvbGRlciByZXF1aXJlcwotICAqLwotICBwdWJsaWMgYm9vbGVhbiB1c2VEZWZhdWx0Q29kZUdlbkZvbGRlcigpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJkZWZhdWx0Y29kZWdlbmZvbGRlciIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBVc2UgU3BlY2lhbCBGb2xkZXIgZm9yIGdlbmVyYXRlZCBjb2RlCi0gICogQHJldHVybiBTdHJpbmcgc3BlY2lhbCBmb2xkZXIgbmFtZQotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvZGVHZW5Gb2xkZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJjb2RlZ2VuZm9sZGVyIiApOwotICB9Ci0KLSAgLyoqCi0gICogRG8gd2UgbmVlZCB0byBsYXVuY2ggc29tZXRoaW5nCi0gICogQHJldHVybiBCb29sZWFuIGlmIHRydWUgbGF1bmNoIGNvZGVnZW4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMYXVuY2hSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldENvbmZpZ0VsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoICJsYXVuY2hSZXF1aXJlZCIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBEbyB3ZSBuZWVkIHRoZSBtZXRob2RzIGZvciB0aGUgcHJveHkKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBwcm94eSBtZXRob2RzIG5lZWRlZAotICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcmVNZXRob2RzTmVlZGVkKCkKLSAgewotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggIm1ldGhvZHNuZWVkZWQiICkpLmJvb2xlYW5WYWx1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICogRG9lcyB0aGlzIHRlc3QgbWFjaGluZSBuZWVkIGEgc2VydmVyCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgYSBzZXJ2ZXIgaXMgcmVxdWlyZWQKLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJOZWVkZWQoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAic2VydmVybmVlZGVkIiApKS5ib29sZWFuVmFsdWUoKTsKLSAgfQotCi0gIC8qKgotICAqIFVzZSB0aGUgRGVmYXVsdCBTZXJ2ZXIgY2hvc2VuIGJ5IHRoZSB3aXphcmQKLSAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0aGUgZGVmYXVsdCBzZXJ2ZXIgaXMgd2FudGVkCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHVzZURlZmF1bHRTZXJ2ZXIoKQotICB7Ci0gICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAiZGVmYXVsdHNlcnZlciIgKSkuYm9vbGVhblZhbHVlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBVc2UgdGhlIERlZmF1bHQgU2VydmVyIGNob3NlbiBieSB0aGUgd2l6YXJkCi0gICogQHJldHVybiBib29sZWFuIHRydWUgaWYgdGhlIGRlZmF1bHQgc2VydmVyIGlzIHdhbnRlZAotICAqLwotICBwdWJsaWMgU3RyaW5nIHVzZVNlcnZlcigpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29uZmlnRWxlbWVudCgpLmdldEF0dHJpYnV0ZSggInVzZXNlcnZlciIgKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHRlc3RXU0RMKCkKLSAgewotICAJU3RyaW5nIHdzZGwgPSBnZXRDb25maWdFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCAidGVzdFdTREwiICk7Ci0gICAgaWYod3NkbC5lcXVhbHMoInllcyIpIHx8IHdzZGwuZXF1YWxzKCJ0cnVlIikpCi0JICByZXR1cm4gdHJ1ZTsKLQkgCi0JcmV0dXJuIGZhbHNlOyAgCi0gIH0KLSAgCQotICAKLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC90ZXN0L1dlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdEZpbmlzaENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4N2ZmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2V4dC90ZXN0L1dlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqCi0qIDxjb3B5cmlnaHQ+Ci0qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKgotKiA8L2NvcHlyaWdodD4KLSovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VGaW5pc2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VUZXN0RmluaXNoQ29tbWFuZCBleHRlbmRzIFdlYlNlcnZpY2VGaW5pc2hDb21tYW5kCi17Ci0KLSAgLyoqCi0gICAqIElmIHRoZSBjb21tYW5kIG5lZWRzIGEgc2VydmVyIHRoaXMgaXMgdGhlIGNob3NlbiAKLSAgICogY2xpZW50IHNlcnZlcklECi0gICAqIEBwYXJhbSBzYW1wbGVTZXJ2ZXJUeXBlSUQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZlclR5cGVJRChTdHJpbmcgc2VydmljZVNlcnZlclR5cGVJRCk7Ci0gIAotICAvKioKLSAgICogVGhpcyBpcyB0aGUgSVNlcnZlciBpZiByZXF1aXJlZAotICAgKiBAcGFyYW0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4aXN0aW5nU2VydmVyKElTZXJ2ZXIgc2VydmljZUV4aXN0aW5nU2VydmVyKTsKLSAgCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBlbmRwb2ludHMgaWYgbW9uaXRvciBzZXJ2aWNlIGlzIGVuYWJsZWQKLSAgICogQHBhcmFtIGVuZHBvaW50cwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoTGlzdCBlbmRwb2ludHMpOwotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvZXh0L3Rlc3QvV2ViU2VydmljZVRlc3RSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGUzZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3Mvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9leHQvdGVzdC9XZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuZXh0LldlYlNlcnZpY2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmV4dC5XZWJTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRlc3RSZWdpc3RyeSBleHRlbmRzIFdlYlNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeUltcGwKLXsKLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0gIC8qCi0gICAqIFRoaXMgaXMgYSBzaW5nbGV0b24gYmVjYXN1ZSBpdCB3YXMgZGVjaWRlZCB0aGF0IHRoZSBtZW1vcnkgZm9vdCBwcmludCAKLSAgICogaXMgbm90IGFzIGV4cGVuc2l2ZSBhcyB0aGUgdGltZSB0YWtlbiByZXRyaWV2aW5nIHRoZSBkYXRhCi0gICAqIAotICAgKi8KLSAgCi0gIAotICBwcml2YXRlIHN0YXRpYyBXZWJTZXJ2aWNlVGVzdFJlZ2lzdHJ5IHdzdHI7Ci0gIAotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gIAlpZih3c3RyID09IG51bGwpIHdzdHIgPSBuZXcgV2ViU2VydmljZVRlc3RSZWdpc3RyeSgpOwotICAgIHJldHVybiB3c3RyOwotICB9Ci0gIAotICBwcml2YXRlIFdlYlNlcnZpY2VUZXN0UmVnaXN0cnkoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotICAKLSAgLyoqCi0gICogQ2hpbGRyZW4gcmVnaXN0cmllcyB3aWxsIGhhdmUgZGlmZmVyZW50IGV4dGVuc2lvbiB0eXBlcyAKLSAgKiBAcmV0dXJuIFdlYnNlcnZpY2VFeHRlbnNpb24gaG9sZHMgYSBjb25maWcgZWxlbQotICAqIGZvciB0aGF0IGV4dGVuc2lvbiBjYXBhYmxlIG9mIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUgZmlsZQotICAqLwotICBwdWJsaWMgV2ViU2VydmljZUV4dGVuc2lvbiBjcmVhdGVXZWJTZXJ2aWNlRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBXZWJTZXJ2aWNlVGVzdEV4dGVuc2lvbihjb25maWdFbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAqIENoaWxkcmVuIG11c3QgaW1wbGVtZW50IGhvdyB0aGV5IGdldCB0aGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gCi0gICogQHJldHVybiBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBhbiBhcnJheSBvZiBlbGVtZW50cyBwYXJ0aWN1bGFyIHRvIHRoYXQKLSAgKiBleHRlbnNpb24KLSAgKi8KLSAgcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGdldENvbmZpZ0VsZW1lbnRzKCkKLSAgewotICAgIElFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RlciIpOwotICAgIHJldHVybiBjb25maWc7ICAgIAotICB9Ci0KLQotICAgIAotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2MDcyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL3BsdWdpbi9XZWJTZXJ2aWNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRQcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5Qcm9qZWN0VG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb250ZXh0LlNjZW5hcmlvQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5VRERJUHJlZmVyZW5jZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLQotCi0vKioKLSogVGhpcyBpcyB0aGUgcGx1Z2luIGNsYXNzIGZvciB0aGUgV2ViIFNlcnZpY2VzIHBsdWdpbi4KLSogPHA+Ci0qIFRoaXMgcGx1Z2luIGNvbnRhaW5zIHRoZSBidWxrIG9mIHRoZSBXZWIgU2VydmljZXMgcnVudGltZS4KLSogT25seSB0aGUgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHBvcnRpb24gb2YgdGhlIHJ1bnRpbWUgaXMKLSogZm91bmQgZWxzZXdoZXJlIC0gaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC53cy51aSBwbHVnaW4uCi0qLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLSAgLyoqCi0gICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4gaW4gcGx1Z2luLnhtbC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzIjsKLQotICAvKioKLSAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0gICovCi0gIHByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VQbHVnaW4gaW5zdGFuY2VfOwotCi0gIHByaXZhdGUgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHRfOwotICBwcml2YXRlIFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQgc2NlbmFyaW9Db250ZXh0XzsKLSAgcHJpdmF0ZSBQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XzsKLSAgcHJpdmF0ZSBQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0IHVkZGlQcmVmZXJlbmNlQ29udGV4dDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgICovCi0gIHB1YmxpYyBXZWJTZXJ2aWNlUGx1Z2luKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgaW5zdGFuY2VfID0gdGhpczsgCi0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgKiBAcmV0dXJuIFRoZSBXZWJTZXJ2aWNlUGx1Z2luIHNpbmdsZXRvbi4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBXZWJTZXJ2aWNlUGx1Z2luIGdldEluc3RhbmNlICgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIAotICB7Ci0gIAkJKChQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCkgZ2V0UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpKS5sb2FkKCk7Ci0gIAkJKChQZXJzaXN0ZW50VURESVByZWZlcmVuY2VDb250ZXh0KSBnZXRVRERJUHJlZmVyZW5jZUNvbnRleHQoKSkubG9hZCgpOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gIAkJaWYgKHJlc291cmNlQ29udGV4dF8gPT0gbnVsbCkgCi0gIAkJCXJlc291cmNlQ29udGV4dF8gPSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZUNvbnRleHRfOwotICB9Ci0KLSAgcHVibGljIFNjZW5hcmlvQ29udGV4dCBnZXRTY2VuYXJpb0NvbnRleHQoKQotICB7Ci0gIAkJaWYgKHNjZW5hcmlvQ29udGV4dF8gPT0gbnVsbCkKLSAgCQl7Ci0gIAkJICBzY2VuYXJpb0NvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRTY2VuYXJpb0NvbnRleHQoKTsKLSAgCQkgIHNjZW5hcmlvQ29udGV4dF8ubG9hZCgpOwotICAJCX0KLQotCQlyZXR1cm4gc2NlbmFyaW9Db250ZXh0XzsKLSAgfQotCi0gIHB1YmxpYyBQcm9qZWN0VG9wb2xvZ3lDb250ZXh0IGdldFByb2plY3RUb3BvbG9neUNvbnRleHQoKQotICB7Ci0gICAgaWYgKHByb2plY3RUb3BvbG9neUNvbnRleHRfID09IG51bGwpCi0gICAgICBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50UHJvamVjdFRvcG9sb2d5Q29udGV4dCgpOwotICAgIHJldHVybiBwcm9qZWN0VG9wb2xvZ3lDb250ZXh0XzsKLSAgfQotCi0gIAotICBwdWJsaWMgVURESVByZWZlcmVuY2VDb250ZXh0IGdldFVERElQcmVmZXJlbmNlQ29udGV4dCgpCi0gIHsKLSAgICBpZiAodWRkaVByZWZlcmVuY2VDb250ZXh0ID09IG51bGwpCi0gICAgICB1ZGRpUHJlZmVyZW5jZUNvbnRleHQgPSBuZXcgUGVyc2lzdGVudFVERElQcmVmZXJlbmNlQ29udGV4dCgpOwotICAgIHJldHVybiB1ZGRpUHJlZmVyZW5jZUNvbnRleHQ7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4KLSAgKiBAcmV0dXJuIFRoZSBTdHJpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXkgKQotICB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGluc3RhbmNlXy5nZXRCdW5kbGUoKSxrZXkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAgKiBwbHVnaW4ucHJvcGVydGllcy4gU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcKLSAgKiBhcmUgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIGFycmF5IG9mIHN1YnN0aXR1dGlvbiBvYmplY3RzICh3aGljaAotICAqIGFyZSBtb3N0IGZyZXF1ZW50bHkgc3RyaW5ncykuIFNlZSB0aGUgSkRLJ3MKLSAgKiB7QGxpbmsgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXR9Ci0gICogY2xhc3MgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0gICogQHJldHVybiBUaGUgU3RyaW5nIG1lc3NhZ2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzICkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksYXJncyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWJkYWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi0KLU1TR19FUlJPUl9TRVJWRVI9SVdBQjAyMTNFIEVycm9yIGluIHN0YXJ0aW5nIHNlcnZlci4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTkwYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotcnVudGltZQotdGVtcC5mb2xkZXIKLWVudmNvcmUuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyN2RlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTc0YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogZW52Y29yZS5qYXIKLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUucmVnaXN0cnksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUudXJpLmZpbGUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24sCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYTA0M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBlbnZjb3JlLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IC5jbGFzc3BhdGgsXAotICAgICAgICAgICAgICAgLnByb2plY3QsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbAotc291cmNlLmVudmNvcmUuamFyID0gc3JjLwotb3V0cHV0LmVudmNvcmUuamFyID0gYmluLwotamFycy5jb21waWxlLm9yZGVyID0gZW52Y29yZS5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0NThmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kIj4KLSAgIDxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPgotICAgPC9jb21wb25lbnQtZGVwZW5kcz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxNzA5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9RW52aXJvbm1lbnQgQ29tbWFuZCBGcmFtZXdvcmsgKGNvcmUpCi1QTFVHSU5fUFJPVklERVI9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmMjc5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L2NvcmUvZW52aXJvbm1lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkNzc2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvY29yZS9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgU2ltcGxlVVJJRmFjdG9yeQotIwotTVNHX05VTExfQVJHX1NQRUNJRklFRD1OdWxsIHNwZWNpZmllZCBhcyBhcmd1bWVudCB0byB7MH0uCi1NU0dfU0NIRU1FX05PVF9GT1VORD1TY2hlbWUgbm90IGZvdW5kIGZvciBVUkkgezB9LgotTVNHX0FCU09MVVRFX1BBVEhfV0lUSE9VVF9TQ0hFTUU9QWJzb2x1dGUgcGF0aCBzcGVjaWZpZWQgd2l0aG91dCBhIHNjaGVtZSBmb3IgVVJJIHswfS4KLQotIwotIyBDb21tb24gTWVzc2FnZXMKLSMKLU1TR19VUklfTk9UX1JFTEFUSVZFPVVSTDogezB9IGlzIG5vdCByZWxhdGl2ZS4KLU1TR19FUlJPUl9VTkVYUEVDVEVEX0VSUk9SPUlXQUIwMDE0RSBVbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cmVkLgotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9kYXRhL0NsYXNzRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvQ2xhc3NFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA4ZDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvQ2xhc3NFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NFbnRyeQotewotICBwdWJsaWMgT2JqZWN0IGxhc3RPYmplY3RfOwotICBwdWJsaWMgVmVjdG9yIGdldHRlckxpc3RfOwotICBwdWJsaWMgVmVjdG9yIHNldHRlckxpc3RfOwotICBwdWJsaWMgaW50ICAgIG9yZGVyXzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YUZsb3dNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9kYXRhL0RhdGFGbG93TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjYyYTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YUZsb3dNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotcHVibGljIGNsYXNzIERhdGFGbG93TWFuYWdlciAKLXsKLSAgcHJpdmF0ZSBEYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbCByZWdpc3RyeV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlICAgICAgICAgICAgICAgY2xhc3NUYWJsZV87Ci0gIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgb3JkZXJfOwotICBwcml2YXRlIEVudmlyb25tZW50CQkJCWVudmlyb25tZW50XzsKLSAgCi0gIHB1YmxpYyBEYXRhRmxvd01hbmFnZXIoIERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsIHJlZ2lzdHJ5LCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICByZWdpc3RyeV8gICA9IHJlZ2lzdHJ5OwotICAgIGNsYXNzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIG9yZGVyXyAgICAgID0gMDsKLSAgICBlbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgfQotICAKLSAgcHVibGljIERhdGFNYXBwaW5nUmVnaXN0cnkgZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkKLSAgewotICAgIHJldHVybiByZWdpc3RyeV87IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9jZXNzKCBPYmplY3Qgb2JqZWN0ICkKLSAgewotICAgIC8vIEFkZCB0aGlzIG9iamVjdCB0byB0aGUgY2xhc3NUYWJsZV8gaWYgcmVxdWlyZWQuCi0gICAgU3RyaW5nICAgICBvYmplY3RUeXBlID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgIENsYXNzRW50cnkgY2xhc3NFbnRyeSA9IChDbGFzc0VudHJ5KWNsYXNzVGFibGVfLmdldCggb2JqZWN0VHlwZSApOwotCQotICAgIGVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coTG9nLklORk8sICJkYXRhIiwgNTAwNCwgdGhpcywgInByb2Nlc3MiLCAiUHJvY2Vzc2luZzogIiArIG9iamVjdFR5cGUgKTsKLSAgICAKLSAgICBpZiggY2xhc3NFbnRyeSA9PSBudWxsICkKLSAgICB7Ci0gICAgICBjbGFzc0VudHJ5ID0gbmV3IENsYXNzRW50cnkoKTsKLSAgICAgIGNsYXNzVGFibGVfLnB1dCggb2JqZWN0VHlwZSwgY2xhc3NFbnRyeSApOwotICAgIH0KLSAgICAKLSAgICBjbGFzc0VudHJ5Lmxhc3RPYmplY3RfID0gb2JqZWN0OwotICAgIGNsYXNzRW50cnkub3JkZXJfICAgICAgPSBvcmRlcl8rKzsKLSAgICAKLSAgICAvLyBOb3cgcHJvY2VzcyB0aGUgc2V0dGVycyBmb3IgdGhpcyBvYmplY3QKLSAgICBWZWN0b3IgcnVsZUVudHJpZXMgID0gcmVnaXN0cnlfLmdldFJ1bGVFbnRyaWVzKCBvYmplY3RUeXBlICk7Ci0gICAgCi0gICAgaWYoIHJ1bGVFbnRyaWVzICE9IG51bGwgKQotICAgIHsKLSAgICAgIGlmKCBjbGFzc0VudHJ5LnNldHRlckxpc3RfID09IG51bGwgKQotICAgICAgewotICAgICAgICBjbGFzc0VudHJ5LnNldHRlckxpc3RfID0gZ2V0U2V0dGVyTGlzdCggb2JqZWN0ICk7ICAKLSAgICAgIH0gICAgCi0gICAgICAKLSAgICAgIC8vIEZvciBlYWNoIHNldHRlciBpbiB0aGlzIG9iamVjdCB0cnkgdG8gZmluZCBhIHJ1bGUuCi0gICAgICBmb3IoIGludCBzZXR0ZXJJbmRleCA9IDA7IHNldHRlckluZGV4IDwgY2xhc3NFbnRyeS5zZXR0ZXJMaXN0Xy5zaXplKCk7IHNldHRlckluZGV4KysgKQotICAgICAgewotICAgICAgICBPYmplY3RNZXRob2QgY3VycmVudE9iamVjdE1ldGhvZCA9IG5ldyBPYmplY3RNZXRob2QoKTsKLSAgICAgICAgTWV0aG9kICAgICAgIHNldHRlck1ldGhvZCAgICAgICAgPSAoTWV0aG9kKWNsYXNzRW50cnkuc2V0dGVyTGlzdF8uZWxlbWVudEF0KCBzZXR0ZXJJbmRleCApOwotICAgICAgICBSdWxlRW50cnkgICAgY3VycmVudFJ1bGVFbnRyeSAgICA9IG51bGw7Ci0KLSAgICAgICAgY3VycmVudE9iamVjdE1ldGhvZC5vcmRlciA9IC0xOwotICAgICAgICAKLSAgICAgICAgLy8gRmluZCBydWxlcyB0aGF0IG1hdGNoIHRoaXMgc2V0dGVyLiAgTm90ZTogdGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgcnVsZQotICAgICAgICAvLyB0aGF0IG1hdGNoZXMgdGhpcyBzZXR0ZXIuICBJbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBtb3N0IHJlY2VudCwgd2hpY2ggaXMgCi0gICAgICAgIC8vIGRlZmluZWQgYnkgdGhlIG9yZGVyIGZpZWxkLgotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgcnVsZUVudHJpZXMuc2l6ZSgpOyBpbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIFJ1bGVFbnRyeSBydWxlRW50cnkgPSAoUnVsZUVudHJ5KXJ1bGVFbnRyaWVzLmVsZW1lbnRBdCggaW5kZXggKTsgICAgICAgCi0gICAgICAgICAgCi0gICAgICAgICAgaWYoIHNldHRlck1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCAic2V0IiArIHJ1bGVFbnRyeS50YXJnZXRQcm9wZXJ0eV8gKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBzZXR0ZXIgZm9yIHRoaXMgcnVsZS4gIE5vdyBmaW5kIHRoZSBnZXR0ZXIgbWV0aG9kLgotICAgICAgICAgICAgLy8gTm90ZTogZ2V0R2V0dGVyTWV0aG9kIGFsd2F5cyByZXR1cm5zIGEgdmFsdWUsIGJ1dCBpZiB0aGVyZSBpcyBubwotICAgICAgICAgICAgLy8gICAgICAgZ2V0dGVycyBhdmFpbGFibGUgaXQgd2lsbCBzZXQgdGhlIG9yZGVyIHRvIC0xLgotICAgICAgICAgICAgT2JqZWN0TWV0aG9kIGdldHRlciA9IGdldEdldHRlck1ldGhvZCggcnVsZUVudHJ5LnNvdXJjZVR5cGVfLCBydWxlRW50cnkuc291cmNlUHJvcGVydHlfICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBnZXR0ZXIub3JkZXIgPT0gLTEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgCWVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coTG9nLklORk8gLCAiZGF0YSIsIDUwMDUsIHRoaXMsICJwcm9jZXNzIiwgIiAgPj5ObyBnZXR0ZXIgZm91bmQgZm9yIHByb3BlcnR5OiAiICsgc2V0dGVyTWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBjdXJyZW50T2JqZWN0TWV0aG9kLm9yZGVyIDwgZ2V0dGVyLm9yZGVyICkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFdlIGZvdW5kIGEgbW9yZSByZWNlbnQgZ2V0dGVyLgotICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0TWV0aG9kID0gZ2V0dGVyOwotICAgICAgICAgICAgICBjdXJyZW50UnVsZUVudHJ5ID0gcnVsZUVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlmKCBjdXJyZW50T2JqZWN0TWV0aG9kLm9yZGVyICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAgIGludm9rZU1ldGhvZCggY3VycmVudE9iamVjdE1ldGhvZC5vYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdE1ldGhvZC5tZXRob2QsIAotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlck1ldGhvZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UnVsZUVudHJ5LnRyYW5zZm9ybWVyXyApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAJZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImRhdGEiLCA1MDA2LCB0aGlzLCAicHJvY2VzcyIsICIgID4+Tm8gcnVsZSBmb3VuZCBmb3Igc2V0dGVyOiAiICsgc2V0dGVyTWV0aG9kLmdldE5hbWUoKSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0gIAotICAvKioKLSAgICogRmluZCBhbGwgdGhlIHNldHRlcnMgZm9yIHRoaXMgb2JqZWN0IGFuZCByZXR1cm4gYSB2ZWN0b3Igb2YgdGhlbS4KLSAgICogCi0gICAqIEBwYXJhbSBvYmplY3QKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJpdmF0ZSBWZWN0b3IgZ2V0U2V0dGVyTGlzdCggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1ldGhvZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBNZXRob2QgIG1ldGhvZCAgICAgPSBtZXRob2RzW2luZGV4XTsKLSAgICAgIGJvb2xlYW4gaXNQdWJsaWMgICA9IE1vZGlmaWVyLmlzUHVibGljKCBtZXRob2QuZ2V0TW9kaWZpZXJzKCkgKTsKLSAgICAgIENsYXNzICAgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgCi0gICAgICBpZiggaXNQdWJsaWMgJiYgCi0gICAgICAgICAgcmV0dXJuVHlwZSA9PSBWb2lkLlRZUEUgJiYgCi0gICAgICAgICAgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEgJiYKLSAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoICJzZXQiICkpCi0gICAgICB7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKCB0cnVlICk7Ci0gICAgICAgIHJlc3VsdC5hZGQoIG1ldGhvZCApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcml2YXRlIE9iamVjdE1ldGhvZCBnZXRHZXR0ZXJNZXRob2QoIFN0cmluZyBzb3VyY2VUeXBlLCBTdHJpbmcgc291cmNlUHJvcGVydHkgKQotICB7Ci0gICAgQ2xhc3NFbnRyeSAgIGNsYXNzRW50cnkgPSAoQ2xhc3NFbnRyeSljbGFzc1RhYmxlXy5nZXQoIHNvdXJjZVR5cGUgKTsKLSAgICBPYmplY3RNZXRob2QgZ2V0dGVyRm91bmQgPSBuZXcgT2JqZWN0TWV0aG9kKCk7Ci0gICAgCi0gICAgLy8gSW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBnZXR0ZXIgeWV0LgotICAgIGdldHRlckZvdW5kLm9yZGVyID0gLTE7Ci0gICAgCi0gICAgaWYoIGNsYXNzRW50cnkgIT0gbnVsbCApCi0gICAgewotICAgICAgaWYoIGNsYXNzRW50cnkuZ2V0dGVyTGlzdF8gPT0gbnVsbCApCi0gICAgICB7Ci0gICAgICAgIC8vIEJ1aWxkIHRoZSBnZXR0ZXIgbGlzdC4KLSAgICAgICAgY2xhc3NFbnRyeS5nZXR0ZXJMaXN0XyA9IGdldEdldHRlckxpc3QoIGNsYXNzRW50cnkubGFzdE9iamVjdF8gKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNsYXNzRW50cnkuZ2V0dGVyTGlzdF8uc2l6ZSgpOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgTWV0aG9kIGdldHRlciA9IChNZXRob2QpY2xhc3NFbnRyeS5nZXR0ZXJMaXN0Xy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZ2V0dGVyLmdldE5hbWUoKS5lcXVhbHMoICJnZXQiICsgc291cmNlUHJvcGVydHkgKSkKLSAgICAgICAgewotICAgICAgICAgIGdldHRlckZvdW5kLm9yZGVyICA9IGNsYXNzRW50cnkub3JkZXJfOwotICAgICAgICAgIGdldHRlckZvdW5kLm1ldGhvZCA9IGdldHRlcjsKLSAgICAgICAgICBnZXR0ZXJGb3VuZC5vYmplY3QgPSBjbGFzc0VudHJ5Lmxhc3RPYmplY3RfOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBnZXR0ZXJGb3VuZDsKLSAgfQotICAKLSAgcHJpdmF0ZSBWZWN0b3IgZ2V0R2V0dGVyTGlzdCggT2JqZWN0IG9iamVjdCApCi0gIHsKLSAgICBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1ldGhvZHMubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBNZXRob2QgIG1ldGhvZCAgICAgPSBtZXRob2RzW2luZGV4XTsKLSAgICAgIGJvb2xlYW4gaXNQdWJsaWMgICA9IE1vZGlmaWVyLmlzUHVibGljKCBtZXRob2QuZ2V0TW9kaWZpZXJzKCkgKTsKLSAgICAgIENsYXNzICAgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgCi0gICAgICBpZiggaXNQdWJsaWMgJiYgCi0gICAgICAgICAgcmV0dXJuVHlwZSAhPSBWb2lkLlRZUEUgJiYgCi0gICAgICAgICAgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDAgJiYKLSAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoICJnZXQiICkpCi0gICAgICB7Ci0gICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKCB0cnVlICk7Ci0gICAgICAgIHJlc3VsdC5hZGQoIG1ldGhvZCApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gIHByaXZhdGUgdm9pZCBpbnZva2VNZXRob2QoIE9iamVjdCAgICAgIHNvdXJjZU9iamVjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCAgICAgIHNvdXJjZU1ldGhvZCAsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgICAgICBjbGllbnRPYmplY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2QgICAgICBjbGllbnRNZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKQotICB7ICAJCi0gIAlPYmplY3QgZGF0YSA9IG51bGw7Ci0gIAkgIAkgIAkKLSAgCXRyeQotICAJewotICAJICBkYXRhID0gc291cmNlTWV0aG9kLmludm9rZSggc291cmNlT2JqZWN0LCBuZXcgT2JqZWN0WzBdICk7Ci0gIAl9Ci0gIAljYXRjaCggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMgKQotICAJewotICAJICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAvLyBwZ20gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGlzIHN0cmluZy4KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcm92aWRlciBcIiIgKyBzb3VyY2VPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIHRocmV3IGFuIGV4Y2VwdGlvbi4iICk7Ci0gIAl9Ci0gIAljYXRjaCggSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleGMgKQotICAJewotICAJICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAvLyBwZ20gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGlzIHN0cmluZy4KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJQcm92aWRlciBcIiIgKyBzb3VyY2VPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiB0aHJldyBhbiBleGNlcHRpb24uIiApOwotICAJfQotICAJCi0gIAllbnZpcm9ubWVudF8uZ2V0TG9nKCkubG9nKExvZy5JTkZPLCAiZGF0YSIsIDUwMDcsIHRoaXMsICJpbnZva2VNZXRob2QgIiwiICBTZXR0aW5nIHByb3A6ICIgKyBjbGllbnRNZXRob2QuZ2V0TmFtZSgpICsgIiBkYXRhPSIgKyBkYXRhICsgIiBmcm9tOiAiICsgc291cmNlT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpICk7Ci0gIAkKLSAgCQotICAJaWYoIHRyYW5zZm9ybWVyICE9IG51bGwgKQotICAJewotICAJICBkYXRhID0gdHJhbnNmb3JtZXIudHJhbnNmb3JtKCBkYXRhICk7ICAJICAgIAotICAJfQotICAJCi0gIAl0cnkKLSAgCXsgIAkgIAotICAJICBjbGllbnRNZXRob2QuaW52b2tlKCBjbGllbnRPYmplY3QsIG5ldyBPYmplY3RbXXsgZGF0YSB9ICk7Ci0gIAl9Ci0gIAljYXRjaCggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMgKQotICAJewotICAJICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAvLyBwZ20gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGlzIHN0cmluZy4KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJDbGllbnQgXCIiICsgY2xpZW50T2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiB0aHJldyBhbiBleGNlcHRpb24uIiApOwotICAJfQotICAJY2F0Y2goIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXhjICkKLSAgCXsKLSAgCSAgZXhjLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgLy8gcGdtIE5lZWQgdG8gZXh0ZXJuYWxpemUgdGhpcyBzdHJpbmcuCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQ2xpZW50IFwiIiArIGNsaWVudE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgdGhyZXcgYW4gZXhjZXB0aW9uLiIgKTsKLSAgCX0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBPYmplY3RNZXRob2QKLSAgewotICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0OwotICAgIHB1YmxpYyBNZXRob2QgbWV0aG9kOwotICAgIHB1YmxpYyBpbnQgICAgb3JkZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkMzQyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9kYXRhL0RhdGFNYXBwaW5nUmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLQotcHVibGljIGNsYXNzIERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsIGltcGxlbWVudHMgRGF0YU1hcHBpbmdSZWdpc3RyeQoteyAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIHJ1bGVzVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0UnVsZUVudHJpZXMoIFN0cmluZyB0YXJnZXRUeXBlICkKLSAgewotICAgIHJldHVybiAoVmVjdG9yKXJ1bGVzVGFibGVfLmdldCggdGFyZ2V0VHlwZSApOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5I2FkZE1hcHBpbmcoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKCBDbGFzcyBzb3VyY2VUeXBlLCBTdHJpbmcgc291cmNlUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHRhcmdldFR5cGUsIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyKSAKLSAgewotICAgIFZlY3RvciAgICBydWxlRW50cmllcyA9IChWZWN0b3IpcnVsZXNUYWJsZV8uZ2V0KCB0YXJnZXRUeXBlLmdldE5hbWUoKSApOwotICAgIFJ1bGVFbnRyeSBydWxlRW50cnkgICA9IG51bGw7Ci0gICAgCi0gICAgaWYoIHJ1bGVFbnRyaWVzID09IG51bGwgKQotICAgIHsKLSAgICAgIHJ1bGVFbnRyaWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgcnVsZXNUYWJsZV8ucHV0KCB0YXJnZXRUeXBlLmdldE5hbWUoKSwgcnVsZUVudHJpZXMgKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gRmluZCB0aGUgcnVsZSBlbnRyeQotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBydWxlRW50cmllcy5zaXplKCk7IGluZGV4KysgKQotICAgIHsKLSAgICAgIFJ1bGVFbnRyeSBuZXdFbnRyeSA9IChSdWxlRW50cnkpcnVsZUVudHJpZXMuZWxlbWVudEF0KCBpbmRleCApOwotICAgIAotICAgICAgaWYoIHNvdXJjZVByb3BlcnR5LmVxdWFscyggbmV3RW50cnkuc291cmNlUHJvcGVydHlfICkgJiYKLSAgICAgICAgICBzb3VyY2VUeXBlLmVxdWFscyggbmV3RW50cnkuc291cmNlVHlwZV8gKSAmJgotICAgICAgICAgIHRhcmdldFByb3BlcnR5LmVxdWFscyggbmV3RW50cnkudGFyZ2V0UHJvcGVydHlfICkgKQotICAgICAgewotICAgICAgICAvLyBUaGUgZW50cnkgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgcnVsZUVudHJ5ID0gbmV3RW50cnk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiggcnVsZUVudHJ5ID09IG51bGwgKQotICAgIHsKLSAgICAgIC8vIFRoZSBydWxlIGRpZG4ndCBleGlzdCBhbHJlYWR5IHNvIHdlIHdpbGwgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgIHJ1bGVFbnRyeSA9IG5ldyBSdWxlRW50cnkoc291cmNlVHlwZS5nZXROYW1lKCksIHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSwgdHJhbnNmb3JtZXIgKTsKLSAgICAgIHJ1bGVFbnRyaWVzLmFkZCggcnVsZUVudHJ5ICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBKdXN0IHVwZGF0ZSB0aGUgdHJhbnNmb3JtZXIuCi0gICAgICBydWxlRW50cnkudHJhbnNmb3JtZXJfID0gdHJhbnNmb3JtZXI7ICAKLSAgICB9Ci0gIH0KLSAgICAKLSAgICAvL3J1bGVFbnRyaWVzXy4KLS8vICAgIFN0cmluZyAgICBzb3VyY2VDbGFzcyA9IHNvdXJjZVR5cGUuZ2V0TmFtZSgpOwotLy8gICAgU3RyaW5nICAgIHRhcmdldENsYXNzID0gdGFyZ2V0VHlwZS5nZXROYW1lKCk7Ci0vLyAgICBWZWN0b3IgICAgZW50cmllcyAgICAgPSAoVmVjdG9yKXJ1bGVFbnRyaWVzXy5nZXQoIHNvdXJjZUNsYXNzICk7IAotLy8gICAgUnVsZUVudHJ5IHJ1bGVFbnRyeSAgID0gbnVsbDsKLS8vICAgIAotLy8gICAgaWYoIGVudHJpZXMgIT0gbnVsbCApCi0vLyAgICB7Ci0vLyAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMuCi0vLyAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbnRyaWVzLnNpemUoKTsgaW5kZXgrKyApCi0vLyAgICAgIHsKLS8vICAgICAgICBSdWxlRW50cnkgZm91bmRFbnRyeSA9IChSdWxlRW50cnkpZW50cmllcy5lbGVtZW50QXQoIGluZGV4ICk7Ci0vLyAgICAgICAgCi0vLyAgICAgICAgaWYoIHNvdXJjZVByb3BlcnR5LmVxdWFscyggZm91bmRFbnRyeS5zb3VyY2VQcm9wZXJ0eV8gKSAmJgotLy8gICAgICAgICAgICB0YXJnZXRUeXBlLmVxdWFscyggZm91bmRFbnRyeS50YXJnZXRUeXBlXyApICYmCi0vLyAgICAgICAgICAgIHRhcmdldFByb3BlcnR5LmVxdWFscyggZm91bmRFbnRyeS50YXJnZXRQcm9wZXJ0eV8gKSApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcnVsZUVudHJ5ID0gZm91bmRFbnRyeTsKLS8vICAgICAgICAgIHJ1bGVFbnRyeS50cmFuc2Zvcm1lcl8gPSB0cmFuc2Zvcm1lcjsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgCi0vLyAgICAgIC8vIFRoZXJlIGlzIGFuIGV4aXN0aW5nIHZlY3RvciBmb3IgdGhpcyBzb3VyY2VDbGFzcywgYnV0IGl0IGRpZG4ndAotLy8gICAgICAvLyBjb250YWluIHRoaXMgbmV3IHJ1bGUgc28gd2Ugd2lsbCBhZGQgaXQgaW4uCi0vLyAgICAgIGlmKCBydWxlRW50cnkgPT0gbnVsbCApCi0vLyAgICAgIHsKLS8vICAgICAgICBydWxlRW50cnkgPSBuZXcgUnVsZUVudHJ5KCBzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0Q2xhc3MsIHRhcmdldFByb3BlcnR5LCB0cmFuc2Zvcm1lciApOwotLy8gICAgICAgIGVudHJpZXMuYWRkKCBydWxlRW50cnkgKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICAvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyB2ZWN0b3IgZm9yIHRoaXMgc291cmNlQ2xhc3MuCi0vLyAgICAgIGVudHJpZXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICAgIHJ1bGVFbnRyeSA9IG5ldyBSdWxlRW50cnkoIHNvdXJjZVByb3BlcnR5LCB0YXJnZXRDbGFzcywgdGFyZ2V0UHJvcGVydHksIHRyYW5zZm9ybWVyICk7Ci0vLyAgICAgIGVudHJpZXMuYWRkKCBydWxlRW50cnkgKTsKLS8vICAgICAgcnVsZUVudHJpZXNfLnB1dCggc291cmNlQ2xhc3MsIGVudHJpZXMgKTsgIAotLy8gICAgfSAgICAKLS8vICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5I2FkZE1hcHBpbmcoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuQ2xhc3MpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKENsYXNzIHNvdXJjZVR5cGUsIFN0cmluZyBzb3VyY2VQcm9wZXJ0eSwgQ2xhc3MgdGFyZ2V0VHlwZSkgCi0gIHsKLSAgICBhZGRNYXBwaW5nKCBzb3VyY2VUeXBlLCBzb3VyY2VQcm9wZXJ0eSwgdGFyZ2V0VHlwZSwgc291cmNlUHJvcGVydHksIG51bGwgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9SdWxlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2RhdGEvUnVsZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzUyMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZGF0YS9SdWxlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBSdWxlRW50cnkgCi17Ci0gIHB1YmxpYyBTdHJpbmcgICAgICBzb3VyY2VUeXBlXzsKLSAgcHVibGljIFN0cmluZyAgICAgIHNvdXJjZVByb3BlcnR5XzsKLSAgcHVibGljIFN0cmluZyAgICAgIHRhcmdldFByb3BlcnR5XzsKLSAgcHVibGljIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyXzsKLSAgCi0gCi0gIHB1YmxpYyBSdWxlRW50cnkoIFN0cmluZyBzb3VyY2VUeXBlLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc291cmNlUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSwgCi0gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyICkKLSAgewotICAgIHNvdXJjZVR5cGVfICAgICA9IHNvdXJjZVR5cGU7Ci0gICAgc291cmNlUHJvcGVydHlfID0gc291cmNlUHJvcGVydHk7Ci0gICAgdGFyZ2V0UHJvcGVydHlfID0gdGFyZ2V0UHJvcGVydHk7ICAgIAotICAgIHRyYW5zZm9ybWVyXyAgICA9IHRyYW5zZm9ybWVyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9BYnN0cmFjdENvbW1hbmRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4ZWE0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9BYnN0cmFjdENvbW1hbmRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLQotLyoqCi0gICogVGhpcyBjbGFzcyBpcyB1c2VkIGFzIHRoZSBiYXNlIGNsYXNzIGZvciBvdGhlciBzdGFuZGFyZCBmcmFnbWVudCBjbGFzc2VzLgotICAqIAotKiovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQgaW1wbGVtZW50cyBDb21tYW5kRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBDb21tYW5kRmFjdG9yeSBjb21tYW5kRmFjdG9yeV87Ci0gIHByaXZhdGUgU3RyaW5nICAgICAgICAgaWRfOwotICBwcml2YXRlIGJvb2xlYW4gICAgICAgIGRvTm90UnVuSW5UcmFuc2FjdGlvbl8gPSBmYWxzZTsKLQotICAvKioKLSAgICogQ29weSBjb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIGZyYWdtZW50Ci0gICAqLwotICBwcm90ZWN0ZWQgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQoIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIGNvbW1hbmRGYWN0b3J5XyA9IGZyYWdtZW50LmNvbW1hbmRGYWN0b3J5XzsKLSAgICBpZF8gICAgICAgICAgICAgPSBmcmFnbWVudC5pZF87Ci0gIH0KLSAgCi0gIC8qKgotICAgICogQ3JlYXRlcyBhIG5ldyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcGFyYW0gY29tbWFuZCB0aGUgZXhlY3V0YWJsZSBjb21tYW5kIGZvciB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHVibGljIEFic3RyYWN0Q29tbWFuZEZyYWdtZW50KCBDb21tYW5kRmFjdG9yeSBjb21tYW5kRmFjdG9yeSwgU3RyaW5nIGlkICkKLSAgewotICAgIGNvbW1hbmRGYWN0b3J5XyA9IGNvbW1hbmRGYWN0b3J5OyAgCi0gICAgaWRfICAgICAgPSBpZDsKLSAgfSAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuIGlkXzsKLSAgfQotICAgCi0gIHB1YmxpYyB2b2lkIHNldElkKCBTdHJpbmcgaWQgKQotICB7Ci0gICAgaWRfID0gaWQ7IAotICB9Ci0gIAotICAvKiogCi0gICAgKiBHZXRzIGV4ZWN1dGFibGUgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGYWN0b3J5IGdldENvbW1hbmRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBjb21tYW5kRmFjdG9yeV87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHJldHJpZXZlIHRoZSBkYXRhIG1hcHBpbmdzIGZvciB0aGlzIGNvbW1hbmQgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyggRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgICAvLyBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm90IHRvIGFkZCBhbnkgZW50cmllcyB0byB0aGUgcmVnaXN0cnkuCi0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiBJZiB0aGUgY29tbWFuZHMgZm9yIHRoaXMgZnJhZ21lbnQgc2hvdWxkIG5vdCBiZSBydW4gd2l0aGluIGEgdHJhbnNhY3Rpb24gdGhlbgotICAgKiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRydWUuICBJZiB0aGUgZnJhZ21lbnQgZG9lcyBub3QgY2FyZSBpZiBpdCBpcyBydW4gaW4gYSB0cmFuc2FjdGlvbgotICAgKiBvciBub3QgaXQgc2hvdWxkIHJldHVybiBmYWxzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGRvTm90UnVuSW5UcmFuc2FjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZG9Ob3RSdW5JblRyYW5zYWN0aW9uXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIHJ1biBpbiB0cmFuc2FjdGlvbiBwcm9wZXJ0eS4KLSAgICogQHBhcmFtIGRvTm90UnVuSW5UcmFuc2FjdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RG9Ob3RSdW5JblRyYW5zYWN0aW9uKCBib29sZWFuIGRvTm90UnVuSW5UcmFuc2FjdGlvbiApCi0gIHsKLSAgICBkb05vdFJ1bkluVHJhbnNhY3Rpb25fID0gZG9Ob3RSdW5JblRyYW5zYWN0aW9uOwotICB9Ci0gIAotICAvKioKLSAgICAqIEFsbCBmcmFnbWVudHMgbmVlZCB0byBiZSBjbG9uZWFibGUuCi0gICoqLwotICBhYnN0cmFjdCBwdWJsaWMgT2JqZWN0IGNsb25lKCk7ICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9Cb29sZWFuRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0Jvb2xlYW5GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzc5YzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0Jvb2xlYW5GcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ29uZGl0aW9uOwotCi0KLS8qKgotICAqIFRoaXMgY2xhc3MgcmV0dXJucyBlaXRoZXIgdGhlIHRydWUgZnJhZ21lbnQgb3IgdGhlIGZhbHNlIGZyYWdtZW50Ci0gICogYmFzZWQgb24gdGhlIHJlc3BvbnNlIGZyb20gdGhlIGNvbmRpdGlvbiBvYmplY3QuCi0qKi8KLXB1YmxpYyBjbGFzcyBCb29sZWFuRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudAotewotICBwcml2YXRlIENvbW1hbmRGcmFnbWVudCB0cnVlRnJhZ21lbnRfOwotICBwcml2YXRlIENvbW1hbmRGcmFnbWVudCBmYWxzZUZyYWdtZW50XzsKLSAgcHJpdmF0ZSBDb25kaXRpb24gICAgICAgY29uZGl0aW9uXzsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgQm9vbGVhbkZyYWdtZW50IHdpdGggZGVmYXVsdCB2YWx1ZXMuCi0gICAqCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbkZyYWdtZW50KCkKLSAgewotICAgIHRoaXMoIG51bGwsIG51bGwsIG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfSwgCi0gICAgICAgICAgICAgICAgICAgICAgbnVsbCwgIiIgKTsgIAotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSB0cnVlRnJhZ21lbnQgIFRoZSBmcmFnbWVudCBjaG9zZW4gaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgotICAgKiBAcGFyYW0gZmFsc2VGcmFnbWVudCBUaGUgZnJhZ21lbnQgY2hvc2VuIGlmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCi0gICAqIEBwYXJhbSBjb25kaXRpb24gICAgIFRoZSBjb25kaXRpb24uCi0gICAqLwotICBwdWJsaWMgQm9vbGVhbkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgdHJ1ZUZyYWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRnJhZ21lbnQgZmFsc2VGcmFnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgIGNvbmRpdGlvbiApCi0gIHsKLSAgICB0aGlzKCB0cnVlRnJhZ21lbnQsIGZhbHNlRnJhZ21lbnQsIGNvbmRpdGlvbiwgbnVsbCwgIiIgKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgLyoqCi0gICAgKiBDcmVhdGVzIGEgbmV3IEJvb2xlYW5GcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcGFyYW0gdHJ1ZUZyYWdtZW50IHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyB0cnVlLgotICAgICogQHBhcmFtIGZhbHNlRnJhZ21lbnQgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIGZhbHNlLgotICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uIGZvciB0aGlzIGZyYWdtZW50LgotICAgICogQHBhcmFtIHN0YXRlIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlIGNvbmRpdGlvbi4KLSAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSBleGVjdGFibGUgY29tbWFuZCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHB1YmxpYyBCb29sZWFuRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCAgdHJ1ZUZyYWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEZyYWdtZW50IGZhbHNlRnJhZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgY29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEZhY3RvcnkgIGNvbW1hbmRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgIGlkICkKLSAgewotICAgIHN1cGVyKCBjb21tYW5kRmFjdG9yeSwgaWQgKTsKLQotICAgIHRydWVGcmFnbWVudF8gICAgICAgPSB0cnVlRnJhZ21lbnQ7Ci0gICAgZmFsc2VGcmFnbWVudF8gICAgICA9IGZhbHNlRnJhZ21lbnQ7Ci0gICAgY29uZGl0aW9uXyAgICAgICAgICA9IGNvbmRpdGlvbjsgCi0gIH0KLQotICAvKioKLSAgICogQ29weSBjb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIGZyYWcKLSAgICovCi0gIHByb3RlY3RlZCBCb29sZWFuRnJhZ21lbnQoIEJvb2xlYW5GcmFnbWVudCBmcmFnICkKLSAgewotICAgIHRoaXMoIG51bGwsCi0gICAgCSAgbnVsbCwKLSAgICAJICBmcmFnLmNvbmRpdGlvbl8sCi0gICAgCSAgZnJhZy5nZXRDb21tYW5kRmFjdG9yeSgpLAotICAgIAkgIGZyYWcuZ2V0SWQoKSApOwotCi0gICAgLy8gTm93IHdlIGhhdmUgdG8gY2xvbmUgaW4gdGhlIHRydWUgYW5kIGZhbHNlCi0gICAgLy8gZnJhZ21lbnRzLgotICAgIHRydWVGcmFnbWVudF8gID0gKENvbW1hbmRGcmFnbWVudCl0cnVlRnJhZ21lbnRfLmNsb25lKCk7Ci0gICAgZmFsc2VGcmFnbWVudF8gPSAoQ29tbWFuZEZyYWdtZW50KWZhbHNlRnJhZ21lbnRfLmNsb25lKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgICogTWFrZXMgYSBjb3B5IG9mIHRoZSBDb21tYW5kRnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJvb2xlYW5GcmFnbWVudCggdGhpcyApOwotICB9Ci0KLSAgLyoqIAotICAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpCi0gIHsgICAgCi0gICAgcmV0dXJuIGNvbmRpdGlvbl8uZXZhbHVhdGUoKSA/IHRydWVGcmFnbWVudF8gOiBmYWxzZUZyYWdtZW50XzsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbmRpdGlvbi4KLSAgICogQHBhcmFtIGNvbmRpdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29uZGl0aW9uKCBDb25kaXRpb24gY29uZGl0aW9uICkKLSAgewotICAgIGNvbmRpdGlvbl8gPSBjb25kaXRpb247ICAgIAotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgdHJ1ZSBmcmFnbWVudC4KLSAgICogQHBhcmFtIGZyYWdtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUcnVlRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICB0cnVlRnJhZ21lbnRfID0gZnJhZ21lbnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBmYWxzZSBmcmFnbWVudC4KLSAgICogQHBhcmFtIGZyYWdtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWxzZUZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgZmFsc2VGcmFnbWVudF8gPSBmcmFnbWVudDsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0Nob2ljZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9DaG9pY2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdlZGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0Nob2ljZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkV2YWx1YXRlOwotCi0KLS8qKgotICAqIFRoaXMgY2xhc3MgcmV0dXJucyBhIGZyYWdtZW50IGZyb20gYSBsaXN0IG9mIGZyYWdtZW50cyBiYXNlZAotICAqIG9uIHRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgRXZhbHVhdGUgb2JqZWN0LgotKiovCi1wdWJsaWMgY2xhc3MgQ2hvaWNlRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudCAKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgICBmcmFnbWVudFRhYmxlXzsKLSAgcHJpdmF0ZSBFdmFsdWF0ZSAgICAgICBldmFsdWF0ZV87Ci0KLSAgLyoqCi0gICAgKiBDcmVhdGUgYSBjbG9uZSB3aXRoIG5ldyBhIG5ldyBoYXNodGFibGUuCi0gICoqLwotICBwcm90ZWN0ZWQgQ2hvaWNlRnJhZ21lbnQoIENob2ljZUZyYWdtZW50IGZyYWcgKQotICB7Ci0gICAgc3VwZXIoIGZyYWcuZ2V0Q29tbWFuZEZhY3RvcnkoKSwgZnJhZy5nZXRJZCgpICk7Ci0gICAgCi0gICAgZXZhbHVhdGVfICAgICAgPSBmcmFnLmV2YWx1YXRlXzsKLSAgICBmcmFnbWVudFRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgIAotICAgIEVudW1lcmF0aW9uIGtleXMgPSBmcmFnLmZyYWdtZW50VGFibGVfLmtleXMoKTsKLQotICAgIC8vIENsb25lIHRoZSBmcmFnbWVudHMgaW4gdGhlIHRhYmxlLgotICAgIHdoaWxlKCBrZXlzLmhhc01vcmVFbGVtZW50cygpICkKLSAgICB7Ci0gICAgICBPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgZnJhZ21lbnRUYWJsZV8ucHV0KCBrZXksICgoQ29tbWFuZEZyYWdtZW50KWZyYWcuZnJhZ21lbnRUYWJsZV8uZ2V0KGtleSkpLmNsb25lKCkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBDaG9pY2VGcmFnbWVudCggT2JqZWN0W10gICAgICAgICAga2V5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRnJhZ21lbnRbXSBmcmFnbWVudHMgKQotICB7Ci0gIAl0aGlzKCBrZXlzLCBmcmFnbWVudHMsIG51bGwsIG51bGwsICIiICk7ICAgIAotICB9Ci0gIAotICBwdWJsaWMgQ2hvaWNlRnJhZ21lbnQoIE9iamVjdFtdICAgICAgICAgIGtleXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEZyYWdtZW50W10gZnJhZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWx1YXRlICAgICAgICAgIGV2YWx1YXRlICkKLSAgewotICAJdGhpcygga2V5cywgZnJhZ21lbnRzLCBldmFsdWF0ZSwgbnVsbCwgIiIgKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV2YWx1YXRlKCBFdmFsdWF0ZSBldmFsdWF0ZSApCi0gIHsKLSAgICBldmFsdWF0ZV8gPSBldmFsdWF0ZTsgIAotICB9Ci0gIAotICAvKioKLSAgICAqIENvbnN0cnVjdHMgYSBjaG9pY2UgZnJhZ21lbnQuICBUaGUga2V5IGF0IGluZGV4IFggaXMgbWFwcGVkIHRvIAotICAgICogdG8gdGhlIGZyYWdtZW50IGF0IGluZGV4IFguCi0gICAgKgotICAgICogQHBhcmFtIGtleXMgdGhlc2Uga2V5cyBtdXN0IGJlIHVuaXF1ZSBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBlcXVhbHMgbWV0aG9kLgotICAgICogVGhleSBhcmUgdXNlZCB0byBpZGVudGlmeSB3aGljaCBmcmFnbWVudCB0byByZXR1cm4uCi0gICAgKiBAcGFyYW0gZnJhZ21lbnRzIHRoZXNlIGFyZSB0aGUgZnJhZ21lbnRzIHRvIGJlIHJldHVybmVkLiAgTnVsbCBpcyBub3QgYWxsb3dlZAotICAgICogYXMgYW4gZW50cnkgaW4gdGhlIGFycmF5LgotICAgICogQHBhcmFtIGV2YWx1YXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBldmFsdWF0ZSBvYmplY3QgaXMgdXNlZAotICAgICogYXMgdGhlIGtleSB0byBsb2NhdGUgYSBmcmFnbWVudC4KLSAgICAqIEBwYXJhbSBzdGF0ZSB0aGUgc3RhdGUgcGFzc2VkIHRvIGV2YWx1YXRlLgotICAqKi8KLSAgcHVibGljIENob2ljZUZyYWdtZW50KCBPYmplY3RbXSAgICAgICAgICBrZXlzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRGcmFnbWVudFtdIGZyYWdtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBFdmFsdWF0ZSAgICAgICAgICBldmFsdWF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kRmFjdG9yeSAgICBjb21tYW5kRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICBpZCApCi0gIHsKLSAgICBzdXBlciggY29tbWFuZEZhY3RvcnksIGlkICk7Ci0KLSAgICBldmFsdWF0ZV8gICAgICA9IGV2YWx1YXRlOwotICAgIGZyYWdtZW50VGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgaWYoIGtleXMgPT0gbnVsbCB8fCBmcmFnbWVudHMgPT0gbnVsbCB8fCBrZXlzLmxlbmd0aCAhPSBmcmFnbWVudHMubGVuZ3RoICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiQmFkIGtleXMgb3IgZnJhZ21lbnRzLiIgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSB0aGUgZnJhZ21lbnQgdGFibGUuCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwga2V5cy5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBmcmFnbWVudFRhYmxlXy5wdXQoIGtleXNbaW5kZXhdLCBmcmFnbWVudHNbaW5kZXhdICk7Ci0gICAgICB9ICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgICogTWFrZXMgYSBjb3B5IG9mIHRoZSBDb21tYW5kRnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IENob2ljZUZyYWdtZW50KCB0aGlzICk7Ci0gIH0KLSAgCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKQotICB7ICAgIAotICAgIE9iamVjdCBrZXkgICAgICAgICAgICAgID0gZXZhbHVhdGVfLmV2YWx1YXRlKCk7Ci0gICAgQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ID0gKENvbW1hbmRGcmFnbWVudClmcmFnbWVudFRhYmxlXy5nZXQoa2V5KTsKLQotICAgIGlmKCBmcmFnbWVudCA9PSBudWxsICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCAiS2V5IG5vdCBmb3VuZCBpbiB0YWJsZS4gS2V5PSIgKyBrZXkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZnJhZ21lbnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGYWN0b3J5RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGYWN0b3J5RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MDI5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRmFjdG9yeUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1hbmRGYWN0b3J5RnJhZ21lbnQgaW1wbGVtZW50cyBDb21tYW5kRnJhZ21lbnQgCi17Ci0gIHByaXZhdGUgVmVjdG9yIGNvbW1hbmRzXzsKLSAgCi0gIC8qKgotICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgcmV0dXJuCi0gICAqIGFuIENvbW1hbmRGYWN0b3J5LgotICAgKiBAcmV0dXJuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpOwotICAKLSAgLyoqCi0gICAqIEFsbCB3aXphcmQgZnJhZ21lbnRzIG5lZWQgdG8gYmUgY2xvbmVhYmxlLgotICAqKi8KLSAgcHVibGljIGFic3RyYWN0IE9iamVjdCBjbG9uZSgpOwotICAKLSAgcHJvdGVjdGVkIENvbW1hbmRGYWN0b3J5RnJhZ21lbnQoIENvbW1hbmRGYWN0b3J5RnJhZ21lbnQgZnJhZyApCi0gIHsKLSAgICBjb21tYW5kc18gPSBmcmFnLmNvbW1hbmRzXzsgIAotICB9Ci0gIAotICBwdWJsaWMgQ29tbWFuZEZhY3RvcnlGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIFJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICAvKiogCi0gICAgKiBHZXRzIGV4ZWN1dGFibGUgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGYWN0b3J5IGdldENvbW1hbmRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqIAotICAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpCi0gIHsKLQlDb21tYW5kRnJhZ21lbnQgcmVzdWx0ID0gbnVsbDsKLQkKLSAgICBjb21tYW5kc18gPSBjcmVhdGVDb21tYW5kcygpOwkKLQotCWlmKCBjb21tYW5kc18uc2l6ZSgpID4gMCApCi0JewotCSAgcmVzdWx0ID0gKENoaWxkRnJhZ21lbnQpY29tbWFuZHNfLmVsZW1lbnRBdCgwKTsKLQl9Ci0JCi0JcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0JQ29tbWFuZEZyYWdtZW50IHJlc3VsdCA9IG51bGw7Ci0JCQotCWlmKCBjb21tYW5kc18gIT0gbnVsbCAmJiBmcmFnbWVudCBpbnN0YW5jZW9mIENoaWxkRnJhZ21lbnQgKSAKLQl7Ci0JICBDaGlsZEZyYWdtZW50IGNoaWxkID0gKENoaWxkRnJhZ21lbnQpZnJhZ21lbnQ7Ci0JICAKLQkgIGludCBpbmRleCA9IGNoaWxkLmluZGV4XzsKLQkKLSAgICAgIGlmKCBpbmRleCAhPSAtMSApCi0JICB7Ci0JICAgIGluZGV4Kys7Ci0JICAKLQkgICAgaWYoIGluZGV4IDwgY29tbWFuZHNfLnNpemUoKSApCi0JCXsKLQkJICByZXN1bHQgPSAoQ29tbWFuZEZyYWdtZW50KWNvbW1hbmRzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0JCX0KLQkgIH0KLQl9Ci0JCi0JcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1hcHBpbmdzIGZvciB0aGlzIGNvbW1hbmQgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyggRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiBJZiB0aGUgY29tbWFuZHMgZm9yIHRoaXMgZnJhZ21lbnQgc2hvdWxkIG5vdCBiZSBydW4gd2l0aGluIGEgdHJhbnNhY3Rpb24gdGhlbgotICAgKiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRydWUuICBJZiB0aGUgZnJhZ21lbnQgZG9lcyBub3QgY2FyZSBpZiBpdCBpcyBydW4gaW4gYSB0cmFuc2FjdGlvbgotICAgKiBvciBub3QgaXQgc2hvdWxkIHJldHVybiBmYWxzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGRvTm90UnVuSW5UcmFuc2FjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gIAotICAKLSAgcHJpdmF0ZSBWZWN0b3IgY3JlYXRlQ29tbWFuZHMoKQotICB7Ci0JVmVjdG9yICAgICAgICAgIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ICA9IGdldElDb21tYW5kRmFjdG9yeSgpOwotCWludCAgICAgICAgICAgICBpbmRleCAgICA9IDA7Ci0JCSAgCi0Jd2hpbGUoIGZhY3RvcnkgIT0gbnVsbCAmJiBmYWN0b3J5Lmhhc05leHQoKSApCi0JewotCSAgQ29tbWFuZCBjb21tYW5kID0gKENvbW1hbmQpZmFjdG9yeS5nZXROZXh0Q29tbWFuZCgpOwotCQkJCi0JICBjb21tYW5kcy5hZGQoIG5ldyBDaGlsZEZyYWdtZW50KCBjb21tYW5kLCBpbmRleCsrICkgKTsKLQl9Ci0JCi0JcmV0dXJuIGNvbW1hbmRzOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIENoaWxkRnJhZ21lbnQgZXh0ZW5kcyBTaW1wbGVGcmFnbWVudAotICB7Ci0JaW50IGluZGV4XzsKLQkKLQlwdWJsaWMgQ2hpbGRGcmFnbWVudCggQ29tbWFuZCBjb21tYW5kLCBpbnQgaW5kZXggKQotCXsKLQkgIHN1cGVyKCBjb21tYW5kLCBjb21tYW5kLmdldENsYXNzKCkuZ2V0TmFtZSgpICk7Ci0JICBpbmRleF8gPSBpbmRleDsKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ODc2MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLS8qKgotICAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyBhIGxpc3Qgb2YgaW50ZXJydXB0YWJsZSBjb21tYW5kcy4gIFRoZQotICAqIG9yZGVyIG9mIHRoaXMgbGlzdCBvZiBjb21tYW5kcyBpcyBkZWZpbmVkIGJ5IHRoZSBnZXRGaXJzdFN1YkZyYWdtZW50IGFuZAotICAqIGdldE5leHRTdWJGcmFnbWVudCBtZXRob2RzLgotKiovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRGcmFnbWVudCBleHRlbmRzIENsb25lYWJsZQoteyAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIFJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLSAgCi0gIC8qKiAKLSAgICAqIEdldHMgZXhlY3V0YWJsZSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZhY3RvcnkgZ2V0Q29tbWFuZEZhY3RvcnkoKTsKLQotICAvKiogCi0gICAgKiBHZXRzIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucwotICAgICogbnVsbCB3aGVuIHRoZXJlIGlzIG5vIGZpcnN0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCk7Ci0KLSAgLyoqCi0gICAgKiBHZXRzIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMgbnVsbAotICAgICogd2hlbiB0aGVyZSBpcyBubyBuZXh0IGNoaWxkLgotICAqKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApOwotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBkYXRhIG1hcHBpbmdzIGZvciB0aGlzIGNvbW1hbmQgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyggRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSApOwotCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiBJZiB0aGUgY29tbWFuZHMgZm9yIHRoaXMgZnJhZ21lbnQgc2hvdWxkIG5vdCBiZSBydW4gd2l0aGluIGEgdHJhbnNhY3Rpb24gdGhlbgotICAgKiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRydWUuICBJZiB0aGUgZnJhZ21lbnQgZG9lcyBub3QgY2FyZSBpZiBpdCBpcyBydW4gaW4gYSB0cmFuc2FjdGlvbgotICAgKiBvciBub3QgaXQgc2hvdWxkIHJldHVybiBmYWxzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGRvTm90UnVuSW5UcmFuc2FjdGlvbigpOwotICAKLSAgLyoqCi0gICAgKiBBbGwgd2l6YXJkIGZyYWdtZW50cyBuZWVkIHRvIGJlIGNsb25lYWJsZS4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKTsgIAotfSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9Db21tYW5kRnJhZ21lbnRFbmdpbmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWFjYWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFGbG93TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLkNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLkNvbW1hbmRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotCi0KLS8qKgotICogVGhlIENvbW1hbmRGcmFnbWVudEVuZ2luZSBwcm92aWRlcyBhIGNvbnZpZW5lbnQgd2F5IHRvIHRyYXZlcnNlIENvbW1hbmRGcmFnbWVudHMKLSAqIGFuZCBwb3NzaWJsaXR5IGV4ZWN1dGUgaXRzIGFzc29jaWF0ZSBDb21tYW5kLgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZEZyYWdtZW50RW5naW5lIGltcGxlbWVudHMgQ29tbWFuZE1hbmFnZXIKLXsKLSAgcHJpdmF0ZSBTdGFjayAgICAgICAgICAgIGNvbW1hbmRTdGFja187Ci0gIHByaXZhdGUgRnJhZ21lbnRMaXN0ZW5lciB1bmRvRnJhZ21lbnRMaXN0ZW5lcl87Ci0gIHByaXZhdGUgRnJhZ21lbnRMaXN0ZW5lciBuZXh0RnJhZ21lbnRMaXN0ZW5lcl87Ci0gIHByaXZhdGUgRnJhZ21lbnRMaXN0ZW5lciBwZWVrRnJhZ21lbnRMaXN0ZW5lcl87Ci0gIHByaXZhdGUgRGF0YUZsb3dNYW5hZ2VyICBkYXRhTWFuYWdlcl87Ci0gIHByaXZhdGUgRW52aXJvbm1lbnQgICAgICBlbnZpcm9ubWVudF87Ci0gIHByaXZhdGUgU3RhdHVzICAgICAgICAgICBsYXN0U3RhdHVzXzsKLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgQ29tbWFuZEZyYWdtZW50RW5naW5lLgotICAgKiAKLSAgICogQHBhcmFtIHN0YXJ0RnJhZ21lbnQgdGhlIHJvb3QgZnJhZ21lbnQgd2hlcmUgdHJhdmVyc2FsIHdpbGwgYmVnaW4uCi0gICAqIEBwYXJhbSBkYXRhTWFuYWdlciB0aGUgZGF0YSBtYW5hZ2VyIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBkYXRhIG1hcHBpbmdzLgotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgdGhlIGVudmlyb25tZW50LgotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudEVuZ2luZSggQ29tbWFuZEZyYWdtZW50IHN0YXJ0RnJhZ21lbnQsIERhdGFGbG93TWFuYWdlciBkYXRhTWFuYWdlciwgRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gIAlTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAJcm9vdC5hZGQoIHN0YXJ0RnJhZ21lbnQgKTsKLSAgCSAgCQotICAJY29tbWFuZFN0YWNrXyA9IG5ldyBTdGFjaygpOwotICAJCi0gIAlhZGRUb1N0YWNrKCByb290LCAtMSApOwotICAJYWRkVG9TdGFjayggc3RhcnRGcmFnbWVudCwgMCApOwotICAJCi0gIAlkYXRhTWFuYWdlcl8gPSBkYXRhTWFuYWdlcjsKLSAgCWVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICB9IAotICAKLSAgLyoqCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgRGF0YSBtYXBwaW5nIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIERhdGFNYXBwaW5nUmVnaXN0cnkgZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkKLSAgewotCXJldHVybiBkYXRhTWFuYWdlcl8uZ2V0TWFwcGluZ1JlZ2lzdHJ5KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiB0aGUgU3RhdHVzIGZyb20gdGhlIGxhc3QgQ29tbWFuZCBleGVjdXRlZC4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0TGFzdFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gbGFzdFN0YXR1c187Ci0gIH0KLSAgCi0gIC8qKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRvRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIG5leHQgZnJhZ21lbnQgbGlzdGVuZXIgZm9yIHRoaXMgZW5naW5lLiAgVGhpcyBsaXN0ZW5lciB3aWxsIGJlCi0gICAqIGNhbGxlZCBmb3IgZWFjaCBmcmFnbWVudCB0aGF0IGlzIHRyYXZlcnNlZCBpbiBtb3ZlRm9yd2FyZFRvTmV4dFN0b3Agb3BlcmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBmcmFnbWVudCBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5leHRGcmFnbWVudExpc3RlbmVyKCBGcmFnbWVudExpc3RlbmVyIGxpc3RlbmVyICkKLSAgewotICAgIG5leHRGcmFnbWVudExpc3RlbmVyXyA9IGxpc3RlbmVyOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgbmV4dCBmcmFnbWVudCBsaXN0ZW5lciBmb3IgdGhpcyBlbmdpbmUuICBUaGlzIGxpc3RlbmVyIHdpbGwgYmUKLSAgICogY2FsbGVkIGZvciBlYWNoIGZyYWdtZW50IHRoYXQgaXMgdHJhdmVyc2VkIGluIHBlZWtGb3J3YXJkVG9OZXh0U3RvcCBvcGVyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGZyYWdtZW50IGxpc3RlbmVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGVla0ZyYWdtZW50TGlzdGVuZXIoIEZyYWdtZW50TGlzdGVuZXIgbGlzdGVuZXIgKQotICB7Ci0gICAgcGVla0ZyYWdtZW50TGlzdGVuZXJfID0gbGlzdGVuZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwZWVrIGZyYWdtZW50IGxpc3RlbmVyIGZvciB0aGlzIGVuZ2luZS4gIFRoaXMgbGlzdGVuZXIgd2lsbCBiZQotICAgKiBjYWxsZWQgZm9yIGVhY2ggZnJhZ21lbnQgdGhhdCBpcyB0cmF2ZXJzZWQgaW4gdW5kb1RvTGFzdFN0b3Agb3BlcmF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBmcmFnbWVudCBsaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuZG9GcmFnbWVudExpc3RlbmVyKCBGcmFnbWVudExpc3RlbmVyIGxpc3RlbmVyICkKLSAgewotICAgIHVuZG9GcmFnbWVudExpc3RlbmVyXyA9IGxpc3RlbmVyOwotICB9Ci0gIAotICAvKioKLSAgICogVHJhdmVyc2UgdGhlIENvbW1hbmRGcmFnbWVudHMgc3RhcnRpbmcgd2l0aCB0aGUgQ29tbWFuZEZyYWdtZW50IG9uIHRoZQotICAgKiB0b3Agb2YgdGhlIGNvbW1hbmQgZnJhZ21lbnQgc3RhY2suICBUaGUgb3BlcmF0aW9uIGRvZXMgTk9UIGNoYW5nZSB0aGUKLSAgICogY29tbWFuZCBmcmFnbWVudCBzdGFjayBhbmQgZG9lcyBub3QgZXhlY3V0ZSBhbnkgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGgKLSAgICogYSBDb21tYW5kRnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwZWVrRm9yd2FyZFRvTmV4dFN0b3AoKQotICB7Ci0gIAlDb21tYW5kTGlzdEVudHJ5IHRvcEVudHJ5ICAgICAgPSAoQ29tbWFuZExpc3RFbnRyeSljb21tYW5kU3RhY2tfLmxhc3RFbGVtZW50KCk7ICAJCi0gIAlpbnQgICAgICAgICAgICAgIHBhcmVudEluZGV4ICAgPSB0b3BFbnRyeS5wYXJlbnRJbmRleF87Ci0gIAlDb21tYW5kRnJhZ21lbnQgIGNoaWxkRnJhZ21lbnQgPSB0b3BFbnRyeS5mcmFnbWVudF87IAotICAJYm9vbGVhbiAgICAgICAgICBjb250aW51ZUxvb3AgID0gbmF2aWdhdGVDaGlsZEZyYWdtZW50cyggY2hpbGRGcmFnbWVudCwgZmFsc2UgKTsKLSAgCSAgCQotICAJd2hpbGUoIHBhcmVudEluZGV4ICE9IC0xICYmIGNvbnRpbnVlTG9vcCApCi0gIAl7ICAJCi0gIAkgIENvbW1hbmRMaXN0RW50cnkgcGFyZW50RW50cnkgICAgPSAoQ29tbWFuZExpc3RFbnRyeSljb21tYW5kU3RhY2tfLmVsZW1lbnRBdCggcGFyZW50SW5kZXggKTsKLSAgCSAgQ29tbWFuZEZyYWdtZW50ICBwYXJlbnRGcmFnbWVudCA9IHBhcmVudEVudHJ5LmZyYWdtZW50XzsKLSAgCSAgQ29tbWFuZEZyYWdtZW50ICBuZXh0RnJhZ21lbnQgICA9IHBhcmVudEZyYWdtZW50LmdldE5leHRTdWJGcmFnbWVudCggY2hpbGRGcmFnbWVudCApOwotICAJICAKLSAgCSAgaWYoIG5leHRGcmFnbWVudCA9PSBudWxsICkKLSAgCSAgewotICAJICAJLy8gVGhlcmUgYXJlIG5vIG1vcmUgc2libGluZyBmcmFnbWVudHMgdG8gbmF2aWdhdGUgc28gd2Ugd2lsbCBwb3AgdXAgdG8gdGhlIHBhcmVudAotICAJICAJLy8gYW4gY29udGludWUgbmF2aWdhdGlvbiB0aGVyZS4KLSAgCSAgCXBhcmVudEluZGV4ICAgPSBwYXJlbnRFbnRyeS5wYXJlbnRJbmRleF87Ci0gIAkgIAljaGlsZEZyYWdtZW50ID0gcGFyZW50RnJhZ21lbnQ7IAotICAJICB9Ci0gIAkgIGVsc2UKLSAgCSAgeyAgCSAgCQotICAJICAJaWYoIG5hdmlnYXRlQ2hpbGRGcmFnbWVudHMoIG5leHRGcmFnbWVudCwgdHJ1ZSApICkgCi0gIAkgIAl7Ci0gIAkgIAkgIC8vIFdlIGFyZSBjb250aW51aW5nIHRvIG5hdmlnYXRlLiAgVGhpcyB0aW1lIHdlIHdhbnQgdG8gdHJhdmVyc2UgdGhlIHNpYmxpbmcKLSAgCSAgCSAgLy8gb2YgbmV4dEZyYWdtZW50LiAKLSAgCSAgCSAgY2hpbGRGcmFnbWVudCA9IG5leHRGcmFnbWVudDsKLSAgCSAgCX0KLSAgCSAgCWVsc2UKLSAgCSAgCXsKLSAgCSAgCSAgLy8gV2UgYXJlIHN0b3BwaW5nIG91ciBuYXZpZ2F0aW9uLgotICAJICAJICBjb250aW51ZUxvb3AgPSBmYWxzZTsKLSAgCSAgCX0KLSAgCSAgfQotICAJfQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIFRyYXZlcnNlIHRoZSBDb21tYW5kRnJhZ21lbnRzIHN0YXJ0aW5nIHdpdGggdGhlIENvbW1hbmRGcmFnbWVudCBvbiB0aGUKLSAgICogdG9wIG9mIHRoZSBjb21tYW5kIGZyYWdtZW50IHN0YWNrLiAgVGhpcyBvcGVyYXRpb24gZG9lcyBjaGFuZ2UgdGhlCi0gICAqIGNvbW1hbmQgZnJhZ21lbnQgc3RhY2sgYW5kIGRvZXMgZXhlY3V0ZSBhbnkgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGgKLSAgICogYSBDb21tYW5kRnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBtb3ZlRm9yd2FyZFRvTmV4dFN0b3AoKQotICB7Ci0gIAlDb21tYW5kTGlzdEVudHJ5IHRvcEVudHJ5ICAgICAgICA9IChDb21tYW5kTGlzdEVudHJ5KWNvbW1hbmRTdGFja18ubGFzdEVsZW1lbnQoKTsgIAkKLSAgCWludCAgICAgICAgICAgICAgcGFyZW50SW5kZXggICAgID0gdG9wRW50cnkucGFyZW50SW5kZXhfOwotICAJQ29tbWFuZEZyYWdtZW50ICBjdXJyZW50RnJhZ21lbnQgPSB0b3BFbnRyeS5mcmFnbWVudF87ICAKLSAgCWJvb2xlYW4gICAgICAgICAgY29udGludWVFeGVjdXRlID0gdmlzaXRUb3AoKTsKLSAgCUNvbW1hbmRGcmFnbWVudCAgY2hpbGRGcmFnbWVudCAgICA9IGN1cnJlbnRGcmFnbWVudC5nZXRGaXJzdFN1YkZyYWdtZW50KCk7Ci0gIAkKLSAgCS8vIElmIHRoZSBjdXJyZW50IGZyYWdtZW50IGhhcyBjaGlsZCBmcmFnbWVudHMgd2UgbmVlZCB0byB0cmF2ZXJzZSB0aGVzZSBjaGlsZHJlbi4KLSAgCXdoaWxlKCBjaGlsZEZyYWdtZW50ICE9IG51bGwgJiYgY29udGludWVFeGVjdXRlICkKLSAgCXsKLSAgCSAgcGFyZW50SW5kZXggPSBjb21tYW5kU3RhY2tfLnNpemUoKSAtIDE7Ci0gIAkgIGFkZFRvU3RhY2soIGNoaWxkRnJhZ21lbnQsIHBhcmVudEluZGV4ICk7Ci0gIAkgIGNvbnRpbnVlRXhlY3V0ZSA9IHZpc2l0VG9wKCk7Ci0gIAkgIGN1cnJlbnRGcmFnbWVudCA9IGNoaWxkRnJhZ21lbnQ7Ci0gIAkgIGNoaWxkRnJhZ21lbnQgICA9IGN1cnJlbnRGcmFnbWVudC5nZXRGaXJzdFN1YkZyYWdtZW50KCk7Ci0gIAl9Ci0gIAkKLSAgCS8vIFRoZSBwcmV2aW91cyB3aGlsZSBsb29wIGhhcyBndWFyYW50ZWVkIHRoYXQgY3VycmVudEZyYWdtZW50IGhhcyBubwotICAJLy8gY2hpbGQgZnJhZ21lbnRzLiBUaGlzIHdoaWxlIGxvb3AgYXNzdW1lcyB0aGlzIHRvIGJlIHRoZSBjYXNlLgotICAJd2hpbGUoIHBhcmVudEluZGV4ICE9IC0xICYmIGNvbnRpbnVlRXhlY3V0ZSApCi0gIAl7ICAJICAgCQotICAJICBDb21tYW5kTGlzdEVudHJ5IHBhcmVudEVudHJ5ICAgID0gKENvbW1hbmRMaXN0RW50cnkpY29tbWFuZFN0YWNrXy5lbGVtZW50QXQoIHBhcmVudEluZGV4ICk7Ci0gIAkgIENvbW1hbmRGcmFnbWVudCAgcGFyZW50RnJhZ21lbnQgPSBwYXJlbnRFbnRyeS5mcmFnbWVudF87Ci0gIAkgIENvbW1hbmRGcmFnbWVudCAgbmV4dEZyYWdtZW50ICAgPSBudWxsOwotICAJICAKLSAgCSAgaWYoIGN1cnJlbnRGcmFnbWVudCA9PSBudWxsICkKLSAgCSAgewotICAJICAgIG5leHRGcmFnbWVudCA9IHBhcmVudEZyYWdtZW50LmdldEZpcnN0U3ViRnJhZ21lbnQoKTsKLSAgCSAgfQotICAJICBlbHNlCi0gIAkgIHsJCi0gIAkgICAgbmV4dEZyYWdtZW50ID0gcGFyZW50RnJhZ21lbnQuZ2V0TmV4dFN1YkZyYWdtZW50KCBjdXJyZW50RnJhZ21lbnQgKTsKLSAgCSAgfQotICAJICAKLSAgCSAgaWYoIG5leHRGcmFnbWVudCA9PSBudWxsICkKLSAgCSAgewotICAJICAJLy8gVGhlcmUgYXJlIG5vIG1vcmUgc2libGluZyBmcmFnbWVudHMgdG8gbmF2aWdhdGUgc28gd2Ugd2lsbCBwb3AgdXAgdG8gdGhlIHBhcmVudAotICAJICAJLy8gYW5kIGNvbnRpbnVlIG5hdmlnYXRpb24gdGhlcmUuCi0gIAkgIAlwYXJlbnRJbmRleCAgICAgPSBwYXJlbnRFbnRyeS5wYXJlbnRJbmRleF87Ci0gIAkgIAljdXJyZW50RnJhZ21lbnQgPSBwYXJlbnRGcmFnbWVudDsgCi0gIAkgIH0KLSAgCSAgZWxzZQotICAJICB7ICAJCi0gIAkgIAkvLyBXZSBoYXZlIGEgbmV3IGZyYWdtZW50IHRoYXQgd2UgbmVlZCB0byBhZGQgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0gIAkgIAlhZGRUb1N0YWNrKCBuZXh0RnJhZ21lbnQsIHBhcmVudEluZGV4ICk7ICAJICAJCi0gIAkgICAgcGFyZW50SW5kZXggICAgID0gY29tbWFuZFN0YWNrXy5zaXplKCkgLSAxOyAgCQotICAJICAgIGNvbnRpbnVlRXhlY3V0ZSA9IHZpc2l0VG9wKCk7Ci0gIAkgICAgY3VycmVudEZyYWdtZW50ID0gbnVsbDsgIAkgIAkKLSAgCSAgfQotICAJfQotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSB0aGVyZSBpcyBub3QgbG9uZ2VyIGFueSBlbGVtZW50cyBvbiB0aGUgc3RhY2suICBOb3RlOgotICAgKiAgICAgICAgICAgICAgICAgdGhhdCBsYXN0IHR3byBlbnRyaWVzIGFyZSBhbHdheXMgbGVmdCBvbiB0aGUgc3RhY2suCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiB1bmRvVG9MYXN0U3RvcCgpCi0gIHsgICAgCi0gIAlDb21tYW5kTGlzdEVudHJ5IHRvcEVudHJ5ID0gKENvbW1hbmRMaXN0RW50cnkpY29tbWFuZFN0YWNrXy5sYXN0RWxlbWVudCgpOwkKLSAgCQotCS8vIEFsd2F5cyB1bmRvIHRoZSB0b3AgZWxlbWVudC4KLSAgCXBlcmZvcm1VbmRvKCB0b3BFbnRyeSApOwotICAJCQotICAgIHdoaWxlKCB0b3BFbnRyeS5wYXJlbnRJbmRleF8gIT0gMCApCi0gIAl7Ci0gICAgICBjb21tYW5kU3RhY2tfLnBvcCgpOwotICAJICB0b3BFbnRyeSA9IChDb21tYW5kTGlzdEVudHJ5KWNvbW1hbmRTdGFja18ubGFzdEVsZW1lbnQoKTsJICAKLSAgICAgIAotICAJICBwZXJmb3JtVW5kbyggdG9wRW50cnkgKTsKLSAgCSAgCi0gIAkgIGlmKCB0b3BFbnRyeS5mcmFnbWVudFN0b3BwZWRfICkKLSAgCSAgewotICAJICAgIGJyZWFrOwotICAJICB9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiB0b3BFbnRyeS5wYXJlbnRJbmRleF8gPT0gMDsKLSAgfQotICAgCi0gIHByaXZhdGUgdm9pZCBwZXJmb3JtVW5kbyggQ29tbWFuZExpc3RFbnRyeSBlbnRyeSApCi0gIHsKLSAgICBpZiggZW50cnkucGFyZW50SW5kZXhfID09IDAgKSByZXR1cm47Ci0gICAgCi0JQ29tbWFuZCBjbWQgPSBlbnRyeS5jb21tYW5kXzsKLSAgCSAgCi0gIAlpZiggY21kICE9IG51bGwgJiYgY21kLmlzVW5kb2FibGUoKSAmJiAhZW50cnkuYmVmb3JlRXhlY3V0ZV8gKQotCXsKLQkgIGNtZC51bmRvKCBlbnZpcm9ubWVudF8gKTsKLQkgIGVudHJ5LmJlZm9yZUV4ZWN1dGVfID0gdHJ1ZTsKLQl9Ci0gIAkgIAotCXVuZG9GcmFnbWVudExpc3RlbmVyXy5ub3RpZnkoIGVudHJ5LmZyYWdtZW50XyApOyAgCQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gbmF2aWdhdGVDaGlsZEZyYWdtZW50cyggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50LCBib29sZWFuIHZpc2l0Q3VycmVudCApCi0gIHsKLSAgCWJvb2xlYW4gICAgICAgICBjb250aW51ZU5hdmlnYXRlID0gdHJ1ZTsKLSAgCUNvbW1hbmRGcmFnbWVudCBjaGlsZEZyYWcgICAgICAgID0gbnVsbDsgCi0gIAkgIAotICAJaWYoIHZpc2l0Q3VycmVudCApCi0gIAl7Ci0gIAkgIGNvbnRpbnVlTmF2aWdhdGUgPSBwZWVrRnJhZ21lbnRMaXN0ZW5lcl8ubm90aWZ5KCBmcmFnbWVudCApOwotICAgICAgZGF0YU1hbmFnZXJfLnByb2Nlc3MoIGZyYWdtZW50ICk7Ci0gIAl9Ci0gIAkKLSAgCWNoaWxkRnJhZyA9IGZyYWdtZW50LmdldEZpcnN0U3ViRnJhZ21lbnQoKTsKLSAgIAkKLSAgCXdoaWxlKCBjaGlsZEZyYWcgIT0gbnVsbCAmJiBjb250aW51ZU5hdmlnYXRlICkKLSAgCXsKLSAgCSAgY29udGludWVOYXZpZ2F0ZSA9IG5hdmlnYXRlQ2hpbGRGcmFnbWVudHMoIGNoaWxkRnJhZywgdHJ1ZSApOwotICAJICBjaGlsZEZyYWcgICAgICAgID0gZnJhZ21lbnQuZ2V0TmV4dFN1YkZyYWdtZW50KCBjaGlsZEZyYWcgKTsKLSAgCX0KLSAgCQotICAJcmV0dXJuIGNvbnRpbnVlTmF2aWdhdGU7Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0VG9wKCkKLSAgeyAgCi0gIAlDb21tYW5kTGlzdEVudHJ5IGVudHJ5ICAgICAgICAgICA9IChDb21tYW5kTGlzdEVudHJ5KWNvbW1hbmRTdGFja18ubGFzdEVsZW1lbnQoKTsKLSAgCWJvb2xlYW4gICAgICAgICBjb250aW51ZU5hdmlnYXRlID0gbmV4dEZyYWdtZW50TGlzdGVuZXJfLm5vdGlmeSggZW50cnkuZnJhZ21lbnRfICk7Ci0gIAkgIAotICAJaWYoIGNvbnRpbnVlTmF2aWdhdGUgKQotICAJewotICAJICAvLyBDYWxsIHRoZSBzZXR0ZXJzIGZvciB0aGlzIGZyYWdtZW50LgotICAgICAgZGF0YU1hbmFnZXJfLnByb2Nlc3MoIGVudHJ5LmZyYWdtZW50XyApOwotICAgICAgCi0gICAgICAvLyBBZGQgYW55IHJ1bGVzIHRvIHRoZSBtYXBwaW5nIHJlZ2lzdHJ5IGJlZm9yZSB3ZSBleGVjdXRlIHRoZSBjb21tYW5kLgotICAgICAgZW50cnkuZnJhZ21lbnRfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhTWFuYWdlcl8uZ2V0TWFwcGluZ1JlZ2lzdHJ5KCkgKTsKLSAgIAotICAJICBsYXN0U3RhdHVzXyA9IHJ1bkNvbW1hbmQoIGVudHJ5ICk7Ci0gIAkgIAotICAJICBpZiggbGFzdFN0YXR1c18uZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKSBjb250aW51ZU5hdmlnYXRlID0gZmFsc2U7Ci0gIAl9Ci0gIAkKLSAgIAlpZiggIWNvbnRpbnVlTmF2aWdhdGUgKSBlbnRyeS5mcmFnbWVudFN0b3BwZWRfID0gdHJ1ZTsKLSAgIAkKLSAgCXJldHVybiBjb250aW51ZU5hdmlnYXRlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYWRkVG9TdGFjayggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50LCBpbnQgcGFyZW50SW5kZXggKQotICB7Ci0gICAgQ29tbWFuZExpc3RFbnRyeSBlbnRyeSA9IG5ldyBDb21tYW5kTGlzdEVudHJ5KCBmcmFnbWVudCwgcGFyZW50SW5kZXggKTsKLSAgICBjb21tYW5kU3RhY2tfLnB1c2goIGVudHJ5ICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RhdHVzIHJ1bkNvbW1hbmQoIENvbW1hbmRMaXN0RW50cnkgZW50cnkgKQotICB7Ci0JQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSAgPSBlbnRyeS5mcmFnbWVudF8uZ2V0Q29tbWFuZEZhY3RvcnkoKTsKLSAgCVN0YXR1cyAgICAgICAgIHN0YXR1cyAgID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgCQotICAJaWYoIGZhY3RvcnkgIT0gbnVsbCApCi0gIAl7Ci0gIAkgIENvbW1hbmQgY21kICAgID0gZmFjdG9yeS5jcmVhdGUoKTsKLSAgCSAgZW50cnkuY29tbWFuZF8gPSBjbWQ7Ci0gIAkgICAgCi0gIAkgIGlmKCBjbWQgIT0gbnVsbCApCi0gIAkgIHsKLSAgCSAgICBkYXRhTWFuYWdlcl8ucHJvY2VzcyggY21kICk7Ci0gIAkgIAkgIAotICAJICAgIHRyeQotICAJICAgIHsKLSAgCSAgICAgIGVudmlyb25tZW50Xy5nZXRMb2coKS5sb2coTG9nLklORk8sICJjb21tYW5kIiwgNTAwMSwgdGhpcywgInJ1bkNvbW1hbmQiLCAiRXhlY3V0aW5nOiAiICsgY21kLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgCSAgCSAgICAKLSAJICAgICAgc3RhdHVzID0gY21kLmV4ZWN1dGUoIGVudmlyb25tZW50XyApOyAJICAgICAgCi0JCSAgZW50cnkuYmVmb3JlRXhlY3V0ZV8gPSBmYWxzZTsKLSAgCSAgICB9Ci0gIAkgICAgY2F0Y2goIFRocm93YWJsZSBleGMgKQotICAJICAgIHsKLSAgCSAgICAgIE1lc3NhZ2VVdGlscyB1dGlscyAgICAgICAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUuZW52aXJvbm1lbnQiLCB0aGlzICk7Ci0gIAkgICAgICBTaW1wbGVTdGF0dXMgdW5leHBlY3RlZEVycm9yID0gbmV3IFNpbXBsZVN0YXR1cygiaWQiLCBleGMuZ2V0TWVzc2FnZSgpLCBTdGF0dXMuRVJST1IsIGV4YyApOwotICAJICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIHV0aWxzLmdldE1lc3NhZ2UoICJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FUlJPUiIgKSwgbmV3IFN0YXR1c1tde3VuZXhwZWN0ZWRFcnJvcn0gKTsKLSAgCSAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3IoIHN0YXR1cyApOwotICAJICAgIH0KLSAgCSAgICBmaW5hbGx5Ci0gIAkgICAgewotICAJICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiT2siOwotICAJICAgICAgCi0gIAkgICAgICBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgCSAgICAgIHsKLSAgCSAgICAgICAgbWVzc2FnZSA9ICJFcnJvcjogIiArIHN0YXR1cy5nZXRNZXNzYWdlKCk7IAotICAJICAgICAgfQotICAJICAgICAgCi0JICAgICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImNvbW1hbmQiLCA1MDAxLCB0aGlzLCAicnVuQ29tbWFuZCIsICJFeGVjdXRpb24gc3RhdHVzOiAiICsgbWVzc2FnZSApOwotICAJICAgIH0KLSAgCSAgfQotICAJfQotICAJCi0gIAlyZXR1cm4gc3RhdHVzOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIENvbW1hbmRMaXN0RW50cnkKLSAgewotICAJcHVibGljIENvbW1hbmRMaXN0RW50cnkoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCwgaW50IHBhcmVudEluZGV4ICkKLSAgCXsKLSAgCSAgZnJhZ21lbnRfICAgICAgICA9IGZyYWdtZW50OwotICAJICBwYXJlbnRJbmRleF8gICAgID0gcGFyZW50SW5kZXg7Ci0gIAkgIGZyYWdtZW50U3RvcHBlZF8gPSBmYWxzZTsKLQkgIGJlZm9yZUV4ZWN1dGVfICAgPSB0cnVlOwotICAJfQotICAJICAJCi0gIAlwdWJsaWMgQ29tbWFuZCAgICAgICAgIGNvbW1hbmRfOwotICAJcHVibGljIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudF87Ci0gIAlwdWJsaWMgaW50ICAgICAgICAgICAgIHBhcmVudEluZGV4XzsKLSAgCXB1YmxpYyBib29sZWFuICAgICAgICAgZnJhZ21lbnRTdG9wcGVkXzsKLQlwdWJsaWMgYm9vbGVhbiAgICAgICAgIGJlZm9yZUV4ZWN1dGVfOwotICB9ICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTliZTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYSB3YXkgdG8gY3JlYXRlIENvbW1hbmRGcmFnbWVudHMuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRGcmFnbWVudEZhY3RvcnkKLXsKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBjcmVhdGVkIENvbW1hbmRGcmFnbWVudCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGNyZWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0NvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTcwMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkgCi17Ci0gIC8qKgotICAgKiBUaGUgZnJhbWV3b3JrIGNhbGxzIHRoaXMgbWV0aG9kIHRvIGdldCB0aGUgQ29tbWFuZEZyYWdtZW50RmFjdG9yeQotICAgKiBmb3IgYSBwYXJ0aWN1bGFyIGV4dGVuc2lvbi4KLSAgICogCi0gICAqIEByZXR1cm4gQ3JlYXRlcyBhIENvbW1hbmRGcmFnbWVudEZhY3RvcnkuCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50RmFjdG9yeSBjcmVhdGUoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvRXh0ZW5zaW9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0V4dGVuc2lvbkZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTNmYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvRXh0ZW5zaW9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLnJlZ2lzdHJ5LkNvbW1hbmRSZWdpc3RyeTsKLQotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudCAKLXsKLSAgcHJpdmF0ZSBTdHJpbmdbXSAgICAgICAgaWRzXzs7Ci0gIHByaXZhdGUgQ29tbWFuZFJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgICAgZnJhZ21lbnRzXzsKLSAgCi0gIC8qKgotICAgKiAgVGhlIGRlZmF1bHQgY29uc3RydWN0b3IKLSAgICoKLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpb25GcmFnbWVudCgpCi0gIHsKLSAgICBzdXBlciggbnVsbCwgIiIgKTsgIAotICAgIGZyYWdtZW50c18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIENvcHkgY29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBGcmFnbWVudCB0aGUgZnJhZ21lbnQgdG8gY29weQotICAgKi8KLSAgcHJvdGVjdGVkIEV4dGVuc2lvbkZyYWdtZW50KCBFeHRlbnNpb25GcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICBzdXBlciggZnJhZ21lbnQgKTsKLSAgICAKLSAgICBpZHNfICAgICAgICAgICAgICAgPSBmcmFnbWVudC5pZHNfOwotICAgIGV4dGVuc2lvblJlZ2lzdHJ5XyA9IGZyYWdtZW50LmV4dGVuc2lvblJlZ2lzdHJ5XzsKLSAgICBmcmFnbWVudHNfICAgICAgICAgPSBmcmFnbWVudC5mcmFnbWVudHNfOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBpZHMgU2V0cyB0aGUgSURzIGZvciB0aGlzIGV4dGVuc2lvbiBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvbklkcyggU3RyaW5nW10gaWRzICkKLSAgewotICAgIGlkc18gPSBpZHM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIHJlZ2lzdHJ5IFNldHMgdGhlIHJlZ2lzdHJ5IGZvciB0aGlzIGV4dGVuc2lvbiBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblJlZ2lzdHJ5KCBDb21tYW5kUmVnaXN0cnkgcmVnaXN0cnkgKQotICB7Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnlfID0gcmVnaXN0cnk7IAotICB9Ci0gICAgICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50I2dldEZpcnN0U3ViRnJhZ21lbnQoKQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXRGaXJzdFN1YkZyYWdtZW50KCkgCi0gIHsKLSAgICBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSBmYWN0b3J5ICA9IGV4dGVuc2lvblJlZ2lzdHJ5Xy5nZXRGYWN0b3J5RmFjdG9yeSggaWRzXyApOwotICAgIAotICAgIGlmKCBmYWN0b3J5ID09IG51bGwgKSByZXR1cm4gbnVsbDsKLSAgICAKLSAgICBDb21tYW5kRnJhZ21lbnQgICAgICAgICAgICAgICBmcmFnbWVudCA9IChDb21tYW5kRnJhZ21lbnQpZnJhZ21lbnRzXy5nZXQoIGZhY3RvcnkgKTsKLSAgICAKLSAgICBpZiggZnJhZ21lbnQgPT0gbnVsbCApCi0gICAgewotICAgICAgZnJhZ21lbnQgPSBmYWN0b3J5LmNyZWF0ZSgpLmNyZWF0ZSgpOwotICAgICAgZnJhZ21lbnRzXy5wdXQoIGZhY3RvcnksIGZyYWdtZW50ICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAgZnJhZ21lbnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudCNnZXROZXh0U3ViRnJhZ21lbnQob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50KQotICAgKi8KLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50KSAKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uRnJhZ21lbnQoIHRoaXMgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvRnJhZ21lbnRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvRnJhZ21lbnRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNkN2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0ZyYWdtZW50TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudCBmb3IgY29kZSB0aGF0IG5lZWRzIHRvIGxpc3RlbiB0byBmcmFnbWVudHMKLSAqIHRoYXQgYXJlIGJlaW5nIHRyYXZlcnNlIGJ5IHRoZSBDb21tYW5kRnJhZ21lbnRFbmdpbmUuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZyYWdtZW50TGlzdGVuZXIgCi17Ci0gIC8qCi0gICAqIE5vdGlmaWVzIHRoaXMgbGlzdGVuZXIgdGhhdCBhIGNvbW1hbmRGcmFnbWVudCBpcyBiZWluZyB2aXNpdGVkIGR1cmluZwotICAgKiBhIHRyYXZlcnNhbC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIG5vdGlmeSggQ29tbWFuZEZyYWdtZW50IGNvbW1hbmRGcmFnbWVudCApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvTG9vcENvbmRpdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvTG9vcENvbmRpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzNlNGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0xvb3BDb25kaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLS8qKgotICAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHdoZW4gYSBjb25kaXRpb25hbCBvYmplY3QgbmVlZHMgdG8gYmUgcmV0dXJuZWQuCi0qKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9vcENvbmRpdGlvbgotewotICAvKioKLSAgICAqIEV2YWx1YXRlcyBhIGxvb3AgY29uZGl0aW9uLgotICAgICoKLSAgICAqIEBwYXJhbSBsb29wIHRoZSBsb29wIGZyYWdtZW50IHRoYXQgaXMgYmVpbmcgZXZhbHVhdGVkLgotICAgICogQHBhcmFtIGZyYWdtZW50IHRoZSBjaGlsZCBmcmFnbWVudCBvZiB0aGUgbG9vcCAKLSAgICAqICAgICAgICB1bmRlciBldmFsdWF0aW9uLiAgTm90ZTogZnJhZ21lbnQgY2FuIGJlIG51bGwuCi0gICAgKiBAcmV0dXJuIHJldHVybnMgYW4gb2JqZWN0IGJhc2VkIG9uIHNvbWUgZXZhbHVhdGVkIGNvbmRpdGlvbi4KLSAgKiovCi0gIHB1YmxpYyBib29sZWFuIGV2YWx1YXRlKCBMb29wRnJhZ21lbnQgbG9vcCwgQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9Mb29wRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0xvb3BGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDQxZmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L0xvb3BGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uUmFuZ2VWZWN0b3I7Ci0KLQotLyoqCi0gICogVGhpcyBjbGFzcyByZXR1cm5zIGEgZHluYW1pY2FsbHkgZGV0ZXJtaW5lZCBudW1iZXIgb2YKLSAgKiBmcmFnbWVudHMuICBUaGlzIGxvb3Agd2lsbCByZXR1cm4gdGhlIGZyYWdtZW50IHBhcmFtZXRlcgotICAqIGFzIGxvbmcgYXMgdGhlIHN0b3BDb25kaXRpb24gZXZhbHVhdGVzIHRvIGZhbHNlLiAgT3RoZXJ3aXNlLAotICAqIG51bGwgaXMgcmV0dXJuZWQuCi0qKi8KLXB1YmxpYyBjbGFzcyBMb29wRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudAotewotICBwcml2YXRlIExvb3BDb25kaXRpb24gICBzdG9wQ29uZGl0aW9uXzsKLSAgcHJpdmF0ZSBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnRfOwotICBwcml2YXRlIFJhbmdlVmVjdG9yICAgICBmcmFnbWVudEhpc3RvcnlfOwotCi0gIC8qKgotICAgICogQ29weSBjb250cnVjdG9yIGZvciB0aGlzIGZyYWdtZW50LgotICAqKi8KLSAgcHJvdGVjdGVkIExvb3BGcmFnbWVudCggTG9vcEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHRoaXMoIGZyYWdtZW50LmZyYWdtZW50XywKLSAgICAJICBmcmFnbWVudC5zdG9wQ29uZGl0aW9uXywKLSAgICAJICBmcmFnbWVudC5nZXRDb21tYW5kRmFjdG9yeSgpLAotICAgIAkgIGZyYWdtZW50LmdldElkKCkgKTsKLSAgfQotICAKLSAgcHVibGljIExvb3BGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgTG9vcENvbmRpdGlvbiAgIHN0b3BDb25kaXRpb24gKQotICB7Ci0gICAgdGhpcyggZnJhZ21lbnQsIHN0b3BDb25kaXRpb24sIG51bGwsICIiICk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgLyoqCi0gICAgKiBAcGFyYW0gZnJhZ21lbnQgdGhlIGZyYWdtZW50IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgbG9vcC4KLSAgICAqIEBwYXJhbSBzdG9wQ29uZGl0aW9uIHdoZW4gZmFsc2UgdGhlIGZyYWdtZW50IHdpbGwgYmUgcmV0dXJuZWQsIAotICAgICogb3RoZXJ3aXNlIG51bGwgaXMgcmV0dXJuZWQuCi0gICAgKiBAcGFyYW0gc3RhdGUgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgY29uZGl0aW9uLgotICAgICogQHBhcmFtIGNvbW1hbmQgdGhlIGV4ZWN1dGFibGUgY29tbWFuZCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHB1YmxpYyBMb29wRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgTG9vcENvbmRpdGlvbiAgIHN0b3BDb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRGYWN0b3J5ICBjb21tYW5kRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgIGlkICAgKQotICB7Ci0gICAgc3VwZXIoIGNvbW1hbmRGYWN0b3J5LCBpZCApOwotCi0gICAgZnJhZ21lbnRfICAgICAgICA9IGZyYWdtZW50OwotICAgIHN0b3BDb25kaXRpb25fICAgPSBzdG9wQ29uZGl0aW9uOwotICAgIGZyYWdtZW50SGlzdG9yeV8gPSBuZXcgUmFuZ2VWZWN0b3IoKTsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBNYWtlcyBhIGNvcHkgb2YgdGhlIENvbW1hbmRGcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIHJldHVybiBuZXcgTG9vcEZyYWdtZW50KCB0aGlzICk7Ci0gIH0KLQotICAvKioKLSAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmcmFnbWVudAotICAgICoKLSAgICAqIEBwYXJhbSBmcmFnbWVudCB0aGUgZnJhZ21lbnQgdG8gc2VhcmNoLgotICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhpcyBmcmFnbWVudC4KLSAgKiovCi0gIHB1YmxpYyBpbnQgaW5kZXhPZiggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIHJldHVybiBmcmFnbWVudEhpc3RvcnlfLmluZGV4T2YoIGZyYWdtZW50ICk7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICAqIEdldHMgdGhlIGZpcnN0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LgotICAgICoKLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zCi0gICAgKiBudWxsIHdoZW4gdGhlcmUgaXMgbm8gZmlyc3QgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldEZpcnN0U3ViRnJhZ21lbnQoKQotICB7ICAgIAotICAgIHJldHVybiBnZXROZXh0U3ViRnJhZ21lbnQoIG51bGwgKTsKLSAgfQotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0TmV4dFN1YkZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZyApCi0gIHsKLSAgICBDb21tYW5kRnJhZ21lbnQgbmV4dEZyYWcgID0gbnVsbDsKLSAgICAKLSAgICBpZiggc3RvcENvbmRpdGlvbl8uZXZhbHVhdGUoIHRoaXMsIGZyYWcgKSApCi0gICAgewotICAgICAgLy8gVGhlIHN0b3AgY29uZGl0aW9uIGhhcyBiZWVuIG1ldC4KLSAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgICAgCi0gICAgICBpbnQgZnJhZ0luZGV4ID0gaW5kZXhPZiggZnJhZyApOwotCi0gICAgICAvLyBOb3RlOiB3aGVuIGZyYWdtZW50ID09IG51bGwgdGhlIGZyYWdJbmRleAotICAgICAgLy8gICAgICAgc2hvdWxkIGJlIC0xLiAgVGhlcmVmb3JlLCBpZiB0aGVyZQotICAgICAgLy8gICAgICAgaXMgYWxyZWFkeSBhIGZpcnN0IGZyYWdtZW50IGluCi0gICAgICAvLyAgICAgICBmcmFnbWVudEhpc3RvcnkgdGhhdCB3aWxsIGJlIHJldHVybmVkLgotICAgICAgaWYoIGZyYWdJbmRleCArIDEgPCBmcmFnbWVudEhpc3RvcnlfLnNpemUoKSApCi0gICAgICB7Ci0gICAgICAgIC8vIFdlIGhhdmUgYSBjb3B5IG9mIHRoZSBmcmFnbWVudCBhbHJlYWR5LgotICAgICAgICBuZXh0RnJhZyA9IChDb21tYW5kRnJhZ21lbnQpKGZyYWdtZW50SGlzdG9yeV8uZWxlbWVudEF0KCBmcmFnSW5kZXggKyAxICkpOyAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbmV4dEZyYWcgPSAoQ29tbWFuZEZyYWdtZW50KShmcmFnbWVudF8uY2xvbmUoKSk7Ci0gICAgICAgIGZyYWdtZW50SGlzdG9yeV8uYWRkKCBuZXh0RnJhZyApOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuZXh0RnJhZzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvU2VxdWVuY2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvU2VxdWVuY2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJjYjM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL2ZyYWdtZW50L1NlcXVlbmNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci0KLQotLyoqCi0gICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgc2VxdWVuY2Ugb2YgQ29tbWFuZEZyYWdtZW50cy4KLSoqLwotcHVibGljIGNsYXNzIFNlcXVlbmNlRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmRGcmFnbWVudAotewotICBwcml2YXRlIExpc3QgZnJhZ21lbnRMaXN0XzsKLQotICBwcm90ZWN0ZWQgU2VxdWVuY2VGcmFnbWVudCggU2VxdWVuY2VGcmFnbWVudCBmcmFnICkKLSAgewotICAJc3VwZXIoIGZyYWcuZ2V0Q29tbWFuZEZhY3RvcnkoKSwgZnJhZy5nZXRJZCgpICk7Ci0gIAkKLSAgICBmcmFnbWVudExpc3RfID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBmcmFnLmZyYWdtZW50TGlzdF8uc2l6ZSgpOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBPYmplY3QgbmV3RnJhZyA9ICgoQ29tbWFuZEZyYWdtZW50KWZyYWcuZnJhZ21lbnRMaXN0Xy5nZXQoaW5kZXgpKS5jbG9uZSgpOwotICAgICAgZnJhZ21lbnRMaXN0Xy5hZGQoIG5ld0ZyYWcgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTZXF1ZW5jZUZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnRbXSBmcmFnbWVudHMsIAotCQkJCQkJICAgQ29tbWFuZEZhY3RvcnkgICAgY29tbWFuZEZhY3RvcnksIAotCQkJCQkgICAgICAgU3RyaW5nICAgICAgICAgICAgaWQgICkKLSAgewotICAJc3VwZXIoIGNvbW1hbmRGYWN0b3J5LCBpZCApOwotICAJCi0gICAgaWYoIGZyYWdtZW50cyAhPSBudWxsICkKLSAgICB7Ci0gICAgICBmcmFnbWVudExpc3RfID0gQXJyYXlzLmFzTGlzdCggZnJhZ21lbnRzICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmcmFnbWVudExpc3RfID0gbmV3IFZlY3RvcigpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFNlcXVlbmNlRnJhZ21lbnQoKQotICB7Ci0gIAlzdXBlciggbnVsbCwgIiIgKTsKLSAgCQotICAJZnJhZ21lbnRMaXN0XyA9IG5ldyBWZWN0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgICogQXBwZW5kcyBhIGZyYWdtZW50IHRvIHRoZSBzZXF1ZW5jZS4gCi0gICoqLwotICBwdWJsaWMgdm9pZCBhZGQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICBmcmFnbWVudExpc3RfLmFkZCggZnJhZ21lbnQgKTsKLSAgfQotICAKLSAgLyoqCi0gICAgKiBNYWtlcyBhIGNvcHkgb2YgdGhlIENvbW1hbmRGcmFnbWVudC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgZnJhZ21lbnQuCi0gICoqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIHJldHVybiBuZXcgU2VxdWVuY2VGcmFnbWVudCggdGhpcyApOwotICB9Ci0KLSAgLyoqIAotICAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpCi0gIHsKLSAgICBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgPSBudWxsOwotCi0gICAgaWYoIGZyYWdtZW50TGlzdF8gPT0gbnVsbCB8fCBmcmFnbWVudExpc3RfLnNpemUoKSA9PSAwICkKLSAgICB7Ci0gICAgICBmcmFnbWVudCA9IG51bGw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgICAgCi0gICAgICBmcmFnbWVudCA9IChDb21tYW5kRnJhZ21lbnQpKCBmcmFnbWVudExpc3RfLmdldCgwKSApOwotICAgIH0KLQotICAgIHJldHVybiBmcmFnbWVudDsgICAgCi0gIH0KLQotICAvKioKLSAgICAqIEdldHMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBuZXh0IGNoaWxkIGZyYWdtZW50IGZvciB0aGlzIGZyYWdtZW50LiAgUmV0dXJucyBudWxsCi0gICAgKiB3aGVuIHRoZXJlIGlzIG5vIG5leHQgY2hpbGQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZEZyYWdtZW50IGdldE5leHRTdWJGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotICAgIGludCBpbmRleCA9IGZyYWdtZW50TGlzdF8uaW5kZXhPZiggZnJhZ21lbnQgKTsKLQotICAgIGlmKCBpbmRleCA9PSAtMSApCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkZyYWdtZW50IG5vdCBmb3VuZCBpbiBzZXF1ZW5jZS4iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4Kys7Ci0KLSAgICAgIGlmKCBpbmRleCA+PSBmcmFnbWVudExpc3RfLnNpemUoKSApCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vdGhpbmcgZm9sbG93aW5nIHRoaXMgZnJhZ21lbnQgc28gcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBSZXR1cm4gdGhlIG5leHQgZnJhZ21lbnQuCi0gICAgICAgIHJldHVybiAoQ29tbWFuZEZyYWdtZW50KShmcmFnbWVudExpc3RfLmdldCggaW5kZXggKSk7Ci0gICAgICB9Ci0gICAgfQotICB9CQotfSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9TaW1wbGVGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvZnJhZ21lbnQvU2ltcGxlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0ODU3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9mcmFnbWVudC9TaW1wbGVGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZEZhY3Rvcnk7Ci0KLS8qKgotICAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBlbXB0eSBvZiBXaXphcmRGcmFnbWVudC4KLSoqLwotcHVibGljIGNsYXNzIFNpbXBsZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kRnJhZ21lbnQKLXsKLSAgcHVibGljIFNpbXBsZUZyYWdtZW50KCkKLSAgewotICAgIHRoaXMoIChDb21tYW5kRmFjdG9yeSludWxsLCAiIiApOwotICB9Ci0gIAotICBwdWJsaWMgU2ltcGxlRnJhZ21lbnQoIFN0cmluZyBpZCApCi0gIHsKLSAgICB0aGlzKCAoQ29tbWFuZEZhY3RvcnkpbnVsbCwgaWQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgU2ltcGxlRnJhZ21lbnQoIGZpbmFsIENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIGlkICkKLSAgewotICAgIHN1cGVyKCBuZXcgQ29tbWFuZEZhY3RvcnkoKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcHVibGljIENvbW1hbmQgY3JlYXRlKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0sIGlkICk7ICAKLSAgfQotICAKLSAgcHVibGljIFNpbXBsZUZyYWdtZW50KCBDb21tYW5kRmFjdG9yeSBjb21tYW5kRmFjdG9yeSwgU3RyaW5nIGlkICkKLSAgewotICAJc3VwZXIoIGNvbW1hbmRGYWN0b3J5LCBpZCApOwotICB9Ci0gIAotICAvKioKLSAgICAqIENvcHkgY29uc3RydWN0b3IgZm9yIGZyYWdtZW50LgotICAqKi8KLSAgcHJvdGVjdGVkIFNpbXBsZUZyYWdtZW50KCBTaW1wbGVGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLSAgICBzdXBlciggZnJhZ21lbnQuZ2V0Q29tbWFuZEZhY3RvcnkoKSwgZnJhZ21lbnQuZ2V0SWQoKSApOwotICB9Ci0gICAgCi0gIC8qKgotICAgICogQWxsIHdpemFyZCBmcmFnbWVudHMgbmVlZCB0byBiZSBjbG9uZWFibGUuCi0gICoqLwotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlRnJhZ21lbnQoIHRoaXMgKTsKLSAgfQotCi0KLSAgLyoqIAotICAgICogR2V0cyB0aGUgZmlyc3QgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuCi0gICAgKgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4gIFJldHVybnMKLSAgICAqIG51bGwgd2hlbiB0aGVyZSBpcyBubyBmaXJzdCBjaGlsZC4KLSAgKiovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnQgZ2V0Rmlyc3RTdWJGcmFnbWVudCgpeyByZXR1cm4gbnVsbDsgfQotCi0gIC8qKgotICAgICogR2V0cyB0aGUgbmV4dCBjaGlsZCBmcmFnbWVudCBmb3IgdGhpcyBmcmFnbWVudC4KLSAgICAqIFNpbmNlIHRoaXMgaXMgYSBzaW1wbGUgZnJhZ21lbnQsIHRoZXJlIGlzIG5vIG5leHQgZnJhZ21lbnQKLSAgICAqIHNvIHdlIHdpbGwgYWx3YXlzIHJldHVybiBudWxsLiAKLSAgICAqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgY2hpbGQgZnJhZ21lbnQgZm9yIHRoaXMgZnJhZ21lbnQuICBSZXR1cm5zIG51bGwKLSAgICAqIHdoZW4gdGhlcmUgaXMgbm8gbmV4dCBjaGlsZC4KLSAgKiovICAKLSAgcHVibGljIENvbW1hbmRGcmFnbWVudCBnZXROZXh0U3ViRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApeyByZXR1cm4gbnVsbDsgfQotfSAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS9yZWdpc3RyeS9Db21tYW5kUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL3JlZ2lzdHJ5L0NvbW1hbmRSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY0ODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb3JlL3JlZ2lzdHJ5L0NvbW1hbmRSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IHRvIGNyZWF0ZSBhIENvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5Ci0gKiBmcm9tIGFuIGFycmF5IG9mIGlkcy4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZFJlZ2lzdHJ5IAoteyAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkgZnJvbSBhbiBhcnJheSBvZiBpZHMuCi0gICAqIAotICAgKiBAcGFyYW0gaWRzIHRoZSBpZHMuCi0gICAqIEByZXR1cm4gdGhlIENvbW1hbmRGcmFnbWVudEZhY3RvcnlGYWN0b3J5IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeSBnZXRGYWN0b3J5RmFjdG9yeSggU3RyaW5nW10gaWRzICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS91cmkvZmlsZS9GaWxlU2NoZW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDc1MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvdXJpL2ZpbGUvRmlsZVNjaGVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS51cmkuZmlsZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5SZWxhdGl2ZVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuUmVsYXRpdmVVUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSTsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZVNjaGVtZSBleHRlbmRzIFJlbGF0aXZlU2NoZW1lIAotewotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjaXNWYWxpZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoVVJJIHVyaSkKLSAgewotICAgIHJldHVybiB1cmkudG9TdHJpbmcoKS5zdGFydHNXaXRoKCAiZmlsZToiICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShTdHJpbmcgdXJpKSAKLSAgewotICAgIFN0cmluZyBuZXdVUkkgPSBudWxsOwotICAgIAotICAgIGlmKCB1cmkuc3RhcnRzV2l0aCggImZpbGU6IikgKQotICAgIHsKLSAgICAgIC8vIFRoZSBmaWxlIHByb3RvY29sIGhhcyBiZWVuIHNwZWNpZmllZCBzbyBrZWVwIGl0IGFzIGlzLgotICAgICAgbmV3VVJJID0gdXJpOwotICAgIH0KLSAgICBlbHNlIGlmKCB1cmkuc3RhcnRzV2l0aCggIi8iKSApCi0gICAgewotICAgICAgLy8gVGhlIGZpbGUgc2NoZW1lIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQgc28gd2Ugd2lsbCBhZGQgaXQuCi0gICAgICBuZXdVUkkgPSAiZmlsZToiICsgdXJpOwotICAgIH0KLSAgICAKLSAgICBpZiggbmV3VVJJID09IG51bGwgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVyaSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGaWxlVVJJKCBuZXdVUkkgKTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoVVJJIHVyaSkgCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVVUkkoIHVyaS50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKGphdmEubmV0LlVSTCkKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFVSTCB1cmwpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlVVJJKCB1cmwudG9TdHJpbmcoKSApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS91cmkvZmlsZS9GaWxlVVJJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29yZS91cmkvZmlsZS9GaWxlVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OWNiZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvcmUvdXJpL2ZpbGUvRmlsZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUudXJpLmZpbGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5SZWxhdGl2ZVVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5VUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuVVJJU2NoZW1lOwotCi0KLXB1YmxpYyBjbGFzcyBGaWxlVVJJIGV4dGVuZHMgUmVsYXRpdmVVUkkgCi17Ci0gIHByaXZhdGUgRmlsZSBmaWxlXyA9IG51bGw7Ci0gIAotICBwdWJsaWMgRmlsZVVSSSggU3RyaW5nIHVyaSApCi0gIHsKLSAgICBzdXBlciggdXJpICk7Ci0gICAgCi0gICAgaWYoIGdldFVSSVNjaGVtZSgpLmlzVmFsaWQoIHRoaXMgKSApCi0gICAgewotICAgICAgZmlsZV8gPSBuZXcgRmlsZSggdXJpLnN1YnN0cmluZyggNSwgdXJpLmxlbmd0aCgpICkgKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNhc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIEZpbGUgYXNGaWxlKCkgCi0gIHsKLSAgICByZXR1cm4gZmlsZV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNlcmFzZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGRlbGV0ZUZpbGUoIGZpbGVfICk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZGVsZXRlRmlsZSggRmlsZSBmaWxlICkKLSAgewotICAgIGlmKCBmaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7Ci0gICAgICAKLSAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KysgKQotICAgICAgewotICAgICAgICBGaWxlIGNoaWxkID0gY2hpbGRyZW5baW5kZXhdOwotICAgICAgICAKLSAgICAgICAgaWYoIGNoaWxkLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVsZXRlRmlsZSggY2hpbGQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZC5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBmaWxlLmRlbGV0ZSgpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0SW5wdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlXy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAKLSAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGVfICk7ICAKLSAgICB9Ci0gICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCBleGMuZ2V0TWVzc2FnZSgpLCBTdGF0dXMuRVJST1IsIGV4YyApOwotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggc3RhdHVzLCB0aGlzICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgcGFyZW50ID0gZmlsZV8uZ2V0UGFyZW50RmlsZSgpOwotICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgCi0gICAgICBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggZmlsZV8gKTsgIAotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIGV4Yy5nZXRNZXNzYWdlKCksIFN0YXR1cy5FUlJPUiwgZXhjICk7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBzdGF0dXMsIHRoaXMgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRVUklTY2hlbWUoKQotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBnZXRVUklTY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlU2NoZW1lKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc0ZpbGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGVBc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfICE9IG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNBdmFpbGFibGVBc1VSTCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzTGVhZigpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfLmlzRmlsZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUHJlc2VudCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVfLmV4aXN0cygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uY2FuUmVhZCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzV3JpdGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmlsZV8uY2FuV3JpdGUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KCkKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVtdIGNoaWxkcmVuID0gZmlsZV8ubGlzdEZpbGVzKCk7Ci0gICAgVVJJW10gIFVSSXMgICAgID0gbmV3IFVSSVswXTsKLSAgICAKLSAgICBpZiggY2hpbGRyZW4gIT0gbnVsbCApCi0gICAgewotICAgICAgaW50ICAgbGVuZ3RoICAgPSBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgICAKLSAgICAgIFVSSXMgPSBuZXcgVVJJW2xlbmd0aF07Ci0gICAgCi0gICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgVVJJc1tpbmRleF0gPSBuZXcgRmlsZVVSSSggImZpbGU6IiArIGNoaWxkcmVuW2luZGV4XS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gVVJJczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgcHVibGljIFVSSVtdIGxpc3QoVVJJRmlsdGVyIHVyaUZpbHRlcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVtdICAgY2hpbGRyZW4gPSBmaWxlXy5saXN0RmlsZXMoKTsKLSAgICBpbnQgICAgICBsZW5ndGggICA9IGNoaWxkcmVuID09IG51bGwgPyAwIDogY2hpbGRyZW4ubGVuZ3RoOwotICAgIFZlY3RvciAgIFVSSXMgICAgID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIFVSSSBuZXdVUkkgPSBuZXcgRmlsZVVSSSggImZpbGU6IiArIGNoaWxkcmVuW2luZGV4XS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgCi0gICAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIG5ld1VSSSkgKQotICAgICAgewotICAgICAgICBVUklzLmFkZCggbmV3VVJJICk7Ci0gICAgICB9IAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gKFVSSVtdKVVSSXMudG9BcnJheSggbmV3IFVSSVswXSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3JlbmFtZShvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbmFtZShVUkkgbmV3VVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB1cmlfID0gbmV3VVJJLnRvU3RyaW5nKCk7Ci0gICAgZmlsZV8ucmVuYW1lVG8oIG5ldyBGaWxlKCB1cmlfICkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaEZvbGRlcigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlcigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGZpbGVfLm1rZGlycygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoTGVhZigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaExlYWYoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcGFyZW50IGZvbGRlcnMgYXJlIGNyZWF0ZWQuCi0gICAgICBGaWxlIHBhcmVudCA9IGZpbGVfLmdldFBhcmVudEZpbGUoKTsKLSAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgIAotICAgICAgZmlsZV8uY3JlYXRlTmV3RmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCggSU9FeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIsIGV4Yy5nZXRNZXNzYWdlKCksIFN0YXR1cy5FUlJPUiwgZXhjICk7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCBzdGF0dXMsIHRoaXMgKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBjbGFzcyBEdW1teSAKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNTEzOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIENvbW1hbmRzIGFyZSBleGVjdXRhYmxlLCB1bmRvYWJsZSwgcmVkb2FibGUgb2JqZWN0cy4KLSAqIEV2ZXJ5IENvbW1hbmQgaGFzIGEgbmFtZSBhbmQgYSBkZXNjcmlwdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBDb21tYW5kLCBhIHNob3J0IHRyYW5zbGF0YWJsZSBzdHJpbmcKLSAgICogaW5kaWNhdGluZyB3aGF0IHRoZSBDb21tYW5kIGRvZXMuIENhbiBiZSBudWxsLgotICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBDb21tYW5kLiBDYW4gYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIENvbW1hbmQuIENhbiBiZSBudWxsLgotICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQ29tbWFuZC4gQ2FuIGJlIG51bGwuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpOwotICAKLSAgLyoqCi0gICAqIEV4ZWN1dGVzIHRoZSBDb21tYW5kLgotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgVGhlIGVudmlyb25tZW50LgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIEEgPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgZGVncmVlCi0gICAqIHRvIHdoaWNoIHRoZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBtZXRob2Qgd2FzIHN1Y2Nlc3NmdWwuCi0gICAqIEEgdmFsdWQgb2YgPGNvZGU+bnVsbDwvY29kZT4sIG9yIGEgU3RhdHVzIHdpdGggYSBzZXZlcml0eQotICAgKiBvZiBsZXNzIHRoYW4gPGNvZGU+U3RhdHVzLkVSUk9SPC9jb2RlPiBzaWduaWZpZXMgc3VjY2Vzcy4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZSAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYsIGFuZCBvbmx5IGlmLCB0aGUgQ29tbWFuZCdzCi0gICAqIDxjb2RlPnVuZG88L2NvZGU+IG1ldGhvZCBpcyBzdXBwb3J0ZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgQ29tbWFuZCBzdXBwb3J0cyBiZWluZyB1bmRvbmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlICgpOwotCi0gIC8qKgotICAgKiBVbmRvZXMgdGhlIENvbW1hbmQuCi0gICAqIEBwYXJhbSBlbnZpcm9ubWVudCBUaGUgZW52aXJvbm1lbnQuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUKLSAgICogdG8gd2hpY2ggdGhlIDxjb2RlPnVuZG88L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICogQSB2YWx1ZCBvZiA8Y29kZT5udWxsPC9jb2RlPiwgb3IgYSBTdGF0dXMgd2l0aCBhIHNldmVyaXR5Ci0gICAqIG9mIGxlc3MgdGhhbiA8Y29kZT5TdGF0dXMuRVJST1I8L2NvZGU+IHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyB1bmRvICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKTsKLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiwgYW5kIG9ubHkgaWYsIHRoZSBDb21tYW5kJ3MKLSAgICogPGNvZGU+cmVkbzwvY29kZT4gbWV0aG9kIGlzIHN1cHBvcnRlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBDb21tYW5kIHN1cHBvcnRzIGJlaW5nIHJlZG9uZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVkb2FibGUgKCk7Ci0KLSAgLyoqCi0gICAqIFJlLWV4ZWN1dGVzIHRoZSBDb21tYW5kLgotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgVGhlIGVudmlyb25tZW50LgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIEEgPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgZGVncmVlCi0gICAqIHRvIHdoaWNoIHRoZSA8Y29kZT5yZWRvPC9jb2RlPiBtZXRob2Qgd2FzIHN1Y2Nlc3NmdWwuCi0gICAqIEEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4sIG9yIGEgU3RhdHVzIHdpdGggYSBzZXZlcml0eQotICAgKiBvZiBsZXNzIHRoZW4gPGNvZGU+U3RhdHVzLkVSUk9SPC9jb2RlPiBzaWduaWZpZXMgc3VjY2Vzcy4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9Db21tYW5kRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvQ29tbWFuZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxOGIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9Db21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGNyZWF0ZSBDb21tYW5kIG9iamVjdHMuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRGYWN0b3J5IAotewotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIGNyZWF0ZWQgQ29tbWFuZCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgQ29tbWFuZCBjcmVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL0NvbW1hbmRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9Db21tYW5kTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzNhMzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL0NvbW1hbmRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0vKioKLSAqIENvbW1hbmRNYW5hZ2VycyBoZWxwIG1hbmFnZSB0aGUgbGlmZWN5Y2xlIG9mIENvbW1hbmRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRNYW5hZ2VyCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBDb21tYW5kTWFuYWdlciBpcyBjYXBhYmxlIG9mIHVuZG9pbmcKLSAgICogQ29tbWFuZHMuIFNvbWUgQ29tbWFuZE1hbmFnZXJzIGFuZCBFbnZpcm9ubWVudHMgbWF5IGJlIG9mCi0gICAqIGEgc29ydCB0aGF0IHdpbGwgbmV2ZXIgdW5kbygpIENvbW1hbmRzLiBDb21tYW5kLmV4ZWN1dGUoKQotICAgKiBtZXRob2RzIHNob3VsZCB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCB0byBvcHRpbWl6ZQotICAgKiBvdXQgYW55IGNhY2hpbmcgbG9naWMgd2hlbmV2ZXIgdGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb0VuYWJsZWQgKCk7Ci0KLSAgLy8gVGhlcmUncyBwcm9iYWJseSBtb3JlLCBsaWtlIGZhY3RvcnkgbWV0aG9kcyBmb3IgY3JlYXRpbmcKLSAgLy8gVW5kby9SZWRvIHN0YWNrcyBhbmQgc3R1ZmYgbGlrZSB0aGF0LgotICAKLSAgcHVibGljIERhdGFNYXBwaW5nUmVnaXN0cnkgZ2V0TWFwcGluZ1JlZ2lzdHJ5KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9JQ29tbWFuZEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL0lDb21tYW5kRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFlNDI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL0lDb21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmV0dXJuIGEgc2VxdWVuY2Ugb2YgQ29tbWFuZHMuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb21tYW5kRmFjdG9yeSBleHRlbmRzIEl0ZXJhdG9yIAotewotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgbmV4dCBDb21tYW5kIGluIHRoZSBzZXF1ZW5jZS4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kIGdldE5leHRDb21tYW5kKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9NdWx0aUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL011bHRpQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjZkYzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL011bHRpQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBncm91cCBtdWx0aXBsZSBDb21tYW5kcyB0b2dldGhlcgotICogaW50byBhIHNpbmdsZSBzZXF1ZW5jZSBsaXN0IG9mIGNvbW1hbmRzIHRvIGV4ZWN1dGUuCi0gKgotICoKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLQkgIAotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgICAgICAgID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBMaXN0ICAgICAgICAgICAgY29tbWFuZHNfICAgICAgPSBuZXcgTGlua2VkTGlzdCgpOwotICBwcml2YXRlIENvbW1hbmRbXSAgICAgICBjb21tYW5kc0FycmF5XyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBNdWx0aUNvbW1hbmQgd2l0aCBubyBuYW1lLCBkZXNjcmlwdGlvbiwgb3IgbGlzdCBvZiBjb21tYW5kcy4KLSAgICoKLSAgICovCi0gIHB1YmxpYyBNdWx0aUNvbW1hbmQgKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBNdXRpbENvbW1hbmRzIHdpdGggYW4gZW1wdHkgbGlzdCBvZiBjb21tYW5kcy4KLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLgotICAgKi8KLSAgcHVibGljIE11bHRpQ29tbWFuZCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24gKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIE11bHRpQ29tbWFuZAotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZC4KLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuCi0gICAqIEBwYXJhbSBjb21tYW5kcyBhbiBpbml0aWFsIGxpc3Qgb2YgdGhlIGNvbW1hbmRzIHRvIGV4ZWN1dGUuCi0gICAqLwotICBwdWJsaWMgTXVsdGlDb21tYW5kICggU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgQ29tbWFuZFtdIGNvbW1hbmRzICkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIGNvbW1hbmRzXy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21tYW5kcykpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBjb21tYW5kIHRvIHRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIGV4ZWN1dGUuCi0gICAqIEBwYXJhbSBjb21tYW5kIHRoZSBjb21tYW5kIHRvIGFkZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZCAoIENvbW1hbmQgY29tbWFuZCApCi0gIHsKLSAgICBjb21tYW5kc0FycmF5XyA9IG51bGw7Ci0gICAgY29tbWFuZHNfLmFkZChjb21tYW5kKTsKLSAgfQotCi0gIC8qKgotICAgKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZCNnZXROYW1lKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKQotICB7Ci0gICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUgOiAoY29tbWFuZHNfLnNpemUoKSA+IDAgPyAoKENvbW1hbmQpY29tbWFuZHNfLmdldCgwKSkuZ2V0TmFtZSgpIDogbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZCNnZXREZXNjcmlwdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpCi0gIHsKLSAgICByZXR1cm4gZGVzY3JpcHRpb24gIT0gbnVsbCA/IGRlc2NyaXB0aW9uIDogKGNvbW1hbmRzXy5zaXplKCkgPiAwID8gKChDb21tYW5kKWNvbW1hbmRzXy5nZXQoMCkpLmdldERlc2NyaXB0aW9uKCkgOiBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBFeGVjdXRlcyB0aGUgbGlzdCBvZiBjb21tYW5kcyBpbiB0aGUgTXVsdGlDb21tYW5kLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyBleGVjdXRlICggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgQ29tbWFuZFtdIGNvbW1hbmRzID0gY29tbWFuZHNBcnJheSgpOwotICAgIGZvciAoaW50IGk9MDsgaTxjb21tYW5kcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBjb21tYW5kc1tpXS5leGVjdXRlKGVudmlyb25tZW50KTsKLSAgICAgIAotICAgICAgaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5tYXRjaGVzKFN0YXR1cy5FUlJPUikpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaS0tOyBpPj0wOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tYW5kc1tpXS51bmRvKGVudmlyb25tZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyBpZiB0aGlzIGNvbW1hbmQgaXMgdW5kb2FibGUuICBJZiBvbmUgb2YgdGhlIGNvbW1hbmRzCi0gICAqIGluIHRoZSBsaXN0IGlzIHVuZG9hYmxlIHRoZSBlbnRpcmUgbGlzdCBpcyBjb25zaWRlcmVkIHRvIGJlIAotICAgKiB1bmRvYWJsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVW5kb2FibGUgKCkKLSAgewotICAgIExpc3RJdGVyYXRvciBpID0gY29tbWFuZHNfLmxpc3RJdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc1ByZXZpb3VzKCkpCi0gICAgewotICAgICAgaWYgKCEoKENvbW1hbmQpaS5wcmV2aW91cygpKS5pc1VuZG9hYmxlKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogVW5kb3MgdGhpcyBjb21tYW5kIGlmIGl0IGNhbi4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAgIExpc3RJdGVyYXRvciBpID0gY29tbWFuZHNfLmxpc3RJdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc1ByZXZpb3VzKCkpCi0gICAgewotICAgICAgc3RhdHVzID0gKChDb21tYW5kKWkucHJldmlvdXMoKSkudW5kbyhlbnZpcm9ubWVudCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29tbWFuZCBpcyByZWRvYWJsZSBvciBub3QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlZG9hYmxlICgpCi0gIHsKLSAgICBMaXN0SXRlcmF0b3IgaSA9IGNvbW1hbmRzXy5saXN0SXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgaWYgKCEoKENvbW1hbmQpaS5uZXh0KCkpLmlzUmVkb2FibGUoKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWV4ZWN1dGVzIHRoaXMgY29tbWFuZC4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIFN0YXR1cyBzdGF0dXMgPSBudWxsOwotICAgIENvbW1hbmRbXSBjb21tYW5kcyA9IGNvbW1hbmRzQXJyYXkoKTsKLSAgICBmb3IgKGludCBpPTA7IGk8Y29tbWFuZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgc3RhdHVzID0gY29tbWFuZHNbaV0ucmVkbyhlbnZpcm9ubWVudCk7Ci0gICAgICBpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLm1hdGNoZXMoU3RhdHVzLkVSUk9SKSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpLS07IGk+PTA7IGktLSkKLSAgICAgICAgewotICAgICAgICAgIGNvbW1hbmRzW2ldLnVuZG8oZW52aXJvbm1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgQ29tbWFuZFtdIGNvbW1hbmRzQXJyYXkgKCkKLSAgewotICAgIGlmIChjb21tYW5kc0FycmF5XyA9PSBudWxsKQotICAgIHsKLSAgICAgIGNvbW1hbmRzQXJyYXlfID0gKENvbW1hbmRbXSljb21tYW5kc18udG9BcnJheShuZXcgQ29tbWFuZFswXSk7Ci0gICAgfQotICAgIHJldHVybiBjb21tYW5kc0FycmF5XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvU2ltcGxlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvU2ltcGxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk2NWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL1NpbXBsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kIGludGVyZmFjZSB0aGF0IHN1YmNsYXNzCi0gKiBjYW4gZXh0ZW5kLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kCi17Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVfOwotICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbl87Ci0gIAotICBwdWJsaWMgU2ltcGxlQ29tbWFuZCggU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiApCi0gIHsKLSAgICBuYW1lXyAgICAgICAgPSBuYW1lOwotICAgIGRlc2NyaXB0aW9uXyA9IGRlc2NyaXB0aW9uOwotICB9Ci0gIAotICBwdWJsaWMgU2ltcGxlQ29tbWFuZCgpCi0gIHsgIAotICAgIG5hbWVfICAgICAgICA9ICIiOwotICAgIGRlc2NyaXB0aW9uXyA9ICIiOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoIFN0cmluZyBuYW1lICkKLSAgewotICAgIG5hbWVfID0gbmFtZTsgIAotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQuCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiB0aGUgZGVzY3JpcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbiggU3RyaW5nIGRlc2NyaXB0aW9uICkKLSAgewotICAgIGRlc2NyaXB0aW9uXyA9IGRlc2NyaXB0aW9uOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5Db21tYW5kI2dldERlc2NyaXB0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uXzsKLSAgfQotCi0gIC8qKikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5Db21tYW5kI2dldE5hbWUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotICAKLSAgLyoqKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjaXNSZWRvYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlZG9hYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjaXNVbmRvYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tYW5kLkNvbW1hbmQjcmVkbyhvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkVudmlyb25tZW50KQotICAgKi8KLSAgcHVibGljIFN0YXR1cyByZWRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoICIiICk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5Db21tYW5kI3VuZG8ob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5FbnZpcm9ubWVudCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgdW5kbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCAiIiApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9TaW1wbGVDb21tYW5kRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvU2ltcGxlQ29tbWFuZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkZDExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9TaW1wbGVDb21tYW5kRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbW1hbmRGYWN0b3J5IGltcGxlbWVudHMgSUNvbW1hbmRGYWN0b3J5IAotewotICAgIHByaXZhdGUgVmVjdG9yIGNvbW1hbmRzXzsKLQlwcml2YXRlIGludCAgICBpbmRleF87Ci0JCi0JcHVibGljIFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBWZWN0b3IgY29tbWFuZHMgKQotCXsKLQkgIGNvbW1hbmRzXyA9IGNvbW1hbmRzOwotCSAgaW5kZXhfICAgID0gMDsKLQl9Ci0JCi0JcHVibGljIENvbW1hbmQgZ2V0TmV4dENvbW1hbmQoKSAKLQl7Ci0JCXJldHVybiAoQ29tbWFuZCluZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgCi0JewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIAotCXsKLQkJcmV0dXJuIGluZGV4XyA8IGNvbW1hbmRzXy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBuZXh0KCkgCi0JewotCQlyZXR1cm4gY29tbWFuZHNfLmVsZW1lbnRBdChpbmRleF8rKyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vQ2hvaWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vQ2hvaWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjkzNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL0Nob2ljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb247Ci0KLXB1YmxpYyBjbGFzcyBDaG9pY2UgewotCi0gIAlwcm90ZWN0ZWQgY2hhciBzaG9ydGN1dCA9ICcgJzsgCi0JcHJvdGVjdGVkIFN0cmluZyBsYWJlbCA9IG51bGw7Ci0gIAlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLSAgCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDaG9pY2UuCi0JICovCi0JcHVibGljIENob2ljZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotCSAqIEBwYXJhbSBzaG9ydGN1dAotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBDaG9pY2UoY2hhciBzaG9ydGN1dCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMuc2hvcnRjdXQgPSBzaG9ydGN1dDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ2hvaWNlLgotCSAqIEBwYXJhbSBzaG9ydGN1dAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBDaG9pY2UoY2hhciBzaG9ydGN1dCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5zaG9ydGN1dCA9IHNob3J0Y3V0OwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbi4KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvcnRjdXQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgY2hhcgotCSAqLwotCXB1YmxpYyBjaGFyIGdldFNob3J0Y3V0KCkgewotCQlyZXR1cm4gc2hvcnRjdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvcnRjdXQuCi0JICogQHBhcmFtIHNob3J0Y3V0IFRoZSBzaG9ydGN1dCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydGN1dChjaGFyIHNob3J0Y3V0KSB7Ci0JCXRoaXMuc2hvcnRjdXQgPSBzaG9ydGN1dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9Db25kaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9Db25kaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwNThhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vQ29uZGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgYm9vbGVhbiBjb25kaXRpb24gdGhhdCBjYW4gYmUgZXZhbHVhdGVkIGZvciBhbnkgb2JqZWN0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmRpdGlvbgotewotICAvKioKLSAgICogVGhpcyByZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBwYXNzZXMgdGhpcyBjb25kaXRpb24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBldmFsdWF0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL0Vudmlyb25tZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxYzIzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuQ29tbWFuZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBBbiBFbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgbWVhbnMgZm9yIGEgCi0gKiA8b2w+Ci0gKiA8bGk+QSBsb2cgZm9yIHdyaXRpbmcgbWVzc2FnZXMgdG8gYSBsb2dnaW5nIGZhY2lsaXR5LDwvbGk+Ci0gKiA8bGk+QSBwcm9ncmVzcyBtb25pdG9yIGZvciByZWNlaXZpbmcgcHJvZ3Jlc3MgaW5mb3JtYXRpb24sPC9saT4KLSAqIDxsaT5BIHN0YXR1cyBoYW5kbGVyIGZvciByZWNlaXZpbmcgYW5kIHByb2Nlc3Npbmcgc3RhdHVzIHJlcG9ydHMsPC9saT4KLSAqIDxsaT5BIGZhY3RvcnkgZm9yIHRoZSBoYW5kbGluZyBvZiBVUklzIChyZXNvdXJjZXMpLjwvbGk+Ci0gKiA8L29sPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudmlyb25tZW50Ci17Ci0gIC8qKgotICAgKiBSZXR1cm5zIGEgbG9nZ2luZyBmYWNpbGl0eS4KLSAgICovCi0gIHB1YmxpYyBMb2cgZ2V0TG9nICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICovCi0gIHB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc3RhdHVzIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzSGFuZGxlciBnZXRTdGF0dXNIYW5kbGVyICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgVVJJIGZhY3RvcnkuCi0gICAqIEhpbnQ6IEltcGxlbWVudGVycyBzaG91bGQgaW5zdXJlIHRoYXQgdGhlIEZhY3RvcnkgdGhleSByZXR1cm4KLSAgICogaGFzIGEgcmVmZXJlbmNlIHRvIHRoaXMgRW52aXJvbm1lbnQgc28gdGhhdCBVUkkgb2JqZWN0cyBjYW4KLSAgICogcmVwb3J0IHByb2dyZXNzIGFuZCBhbm5vdW5jZSBzdGF0dXMuCi0gICAqLwotICBwdWJsaWMgVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5ICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgY29tcGlsZXIgYXBwcm9wcmlhdGUgdG8gdGhlIGVudmlyb25tZW50LgotICAgKi8KLSAgcHVibGljIEphdmFDb21waWxlciBnZXRKYXZhQ29tcGlsZXIgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgaGVscHMgbWFuYWdlIGV4ZWN1dGlvbi91bmRvaW5nIG9mIENvbW1hbmRzLgotICAgKi8KLSAgcHVibGljIENvbW1hbmRNYW5hZ2VyIGdldENvbW1hbmRNYW5hZ2VyICgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL0Vudmlyb25tZW50RXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmOWY0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vRW52aXJvbm1lbnRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgY29uZGl0aW9ucyByYWlzZWQgYnkgdGhlIEVudmlyb25tZW50LgotICovCi1wdWJsaWMgY2xhc3MgRW52aXJvbm1lbnRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgLyoqCi0gICAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTc4OTgzMjc1ODk5NDAyMDM2TDsKLSAgCi0gIHByb3RlY3RlZCBTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IEVudmlyb25tZW50RXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIEVudmlyb25tZW50RXhjZXB0aW9uICgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgRW52aXJvbm1lbnRFeGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgRW52aXJvbm1lbnRFeGNlcHRpb24gKCBTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIHN1cGVyKHN0YXR1cyA9PSBudWxsID8gbnVsbCA6IHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFN0YXR1cyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vRXZhbHVhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9FdmFsdWF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTVhODFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9FdmFsdWF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHdoZW4gYSBjb25kaXRpb25hbCBvYmplY3QgbmVlZHMgdG8gYmUgcmV0dXJuZWQuCi0qKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXZhbHVhdGUKLXsKLSAgLyoqCi0gICAgKiBAcmV0dXJuIHJldHVybnMgYW4gb2JqZWN0IGJhc2VkIG9uIHNvbWUgZXZhbHVhdGVkIGNvbmRpdGlvbi4KLSAgKiovCi0gIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhNDI2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vSmF2YUNvbXBpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5VUkk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhbiBvYmplY3QgdGhhdCBkb2VzIEphdmEgY29tcGlsYXRpb24KLSAqIG9mIGEgcmVzb3VyY2UuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbXBpbGVyCi17Ci0gIC8qKgotICAgKiBDb21waWxlcyB0aGUgZ2l2ZW4gSmF2YSBmaWxlIHRvIHRoZSBnaXZlbiBjbGFzcyBmaWxlLAotICAgKiB1c2luZyBjb250ZXh0IGluZm9ybWF0aW9uIG9uIGNsYXNzcGF0aHMsIG9wdGlvbnMsIGV0Yy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXBpbGUgKCBVUkkgamF2YVVyaSwgVVJJIGNsYXNzVXJpLCBKYXZhQ29tcGlsZXJDb250ZXh0IGNvbnRleHQgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXJDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vSmF2YUNvbXBpbGVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmNmZDdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9KYXZhQ29tcGlsZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRhdGEKLSAqIHJlcXVpcmVkIGJ5IEphdmFDb21waWxlci5jb21waWxlKCkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbXBpbGVyQ29udGV4dAotewotICAvLyBUQkQuLi4KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9Mb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9Mb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4MjI1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogTG9nIG9iamVjdHMgcHJvdmlkZSBhIG1lYW5zIGZvciBsb2dnaW5nIGluZm9ybWF0aW9uIGZvciBGRkRDIGV0Yy4KLSAqLwotcHVibGljIGludGVyZmFjZSBMb2cKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gNDsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZC4KLSAgICogVGhlcmUgaXMgbm8gcmVxdWlyZW1lbnQgdG8gY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgYXR0ZW1wdGluZwotICAgKiBhIGNhbGwgdG8gb25lIG9mIHRoZSA8Y29kZT5sb2c8L2NvZGU+IG1ldGhvZHMsIGFzIHRoZXkgd2lsbAotICAgKiBxdWlldGx5IGRvIG5vdGhpbmcgaWYgbG9nZ2luZyBpcyBkaXNhYmxlZC4gVGhpcyBtZXRob2QgY2FuIGJlCi0gICAqIHVzZWZ1bCwgaG93ZXZlciwgYW55d2hlcmUgdGhlIGNvc3Qgb2YgYnVpbGRpbmcgdXAgdGhlIHBhcmFtZXRlcnMKLSAgICogdG8gYSBsb2cgbWV0aG9kIG1pZ2h0IGJlIGhpZ2ggYW5kIGJlc3QgYXZvaWRlZCBleGNlcHQgd2hlbiBsb2dnaW5nCi0gICAqIGlzIGVuYWJsZWQuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBsb2dnaW5nIGlzIGVuYWJsZWQsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQgKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0aGUgZGVidWcgb3B0aW9uIGlzIHNldCB0byB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkIChTdHJpbmcgb3B0aW9uKTsKLQotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgVGhyb3dhYmxlIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUgKTsKLSAgCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIGRlYnVnIG9wdGlvbgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHRocm93YWJsZSBUaGUgVGhyb3dhYmxlIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgU3RyaW5nIG9wdGlvbiwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFRocm93YWJsZSB0aHJvd2FibGUgKTsKLQotICAvKioKLSAgICogTG9ncyBhIDxjb2RlPlN0YXR1czwvY29kZT4uCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIGxvZ2dpbmcgZW50cnkuCi0gICAqIEBwYXJhbSBtZXNzYWdlTnVtICBUaGUgbWVzc2FnZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjYWxsZXIgVGhlIG9iamVjdCAoZm9yIG5vbi1zdGF0aWMgbWV0aG9kcykgb3IgY2xhc3MgKGZvcgotICAgKiBzdGF0aWMgbWV0aG9kcykgZG9pbmcgdGhlIGxvZ2dpbmcuCi0gICAqIEBwYXJhbSBtZXRob2QgVGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBtZXRob2QgZG9pbmcgdGhlIGxvZ2luZy4KLSAgICogQHBhcmFtIHN0YXR1cyBUaGUgU3RhdHVzIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZyAoIGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFN0YXR1cyBzdGF0dXMgKTsKLSAgCi0gIC8qKgotICAgKiBMb2dzIGEgPGNvZGU+U3RhdHVzPC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIGRlYnVnIG9wdGlvbgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBzdGF0dXMgVGhlIFN0YXR1cyB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBTdGF0dXMgc3RhdHVzICk7Ci0KLSAgLyoqCi0gICAqIExvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIG1lc3NhZ2VOdW0gIFRoZSBtZXNzYWdlIG51bWJlci4KLSAgICogQHBhcmFtIGNhbGxlciBUaGUgb2JqZWN0IChmb3Igbm9uLXN0YXRpYyBtZXRob2RzKSBvciBjbGFzcyAoZm9yCi0gICAqIHN0YXRpYyBtZXRob2RzKSBkb2luZyB0aGUgbG9nZ2luZy4KLSAgICogQHBhcmFtIG1ldGhvZCBUaGUgc2ltcGxlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2luZyB0aGUgbG9naW5nLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBPYmplY3QgdG8gbG9nLgotICAgKi8KLSAgcHVibGljIHZvaWQgbG9nICggaW50IHNldmVyaXR5LCBpbnQgbWVzc2FnZU51bSwgT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCApOwotICAKLSAgLyoqCi0gICAqIExvZ3MgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPi4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSBvZiB0aGUgbG9nZ2luZyBlbnRyeS4KLSAgICogQHBhcmFtIGRlYnVnIG9wdGlvbgotICAgKiBAcGFyYW0gbWVzc2FnZU51bSAgVGhlIG1lc3NhZ2UgbnVtYmVyLgotICAgKiBAcGFyYW0gY2FsbGVyIFRoZSBvYmplY3QgKGZvciBub24tc3RhdGljIG1ldGhvZHMpIG9yIGNsYXNzIChmb3IKLSAgICogc3RhdGljIG1ldGhvZHMpIGRvaW5nIHRoZSBsb2dnaW5nLgotICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRvaW5nIHRoZSBsb2dpbmcuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIE9iamVjdCB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2cgKCBpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLCBTdHJpbmcgbWV0aG9kLCBPYmplY3Qgb2JqZWN0ICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vTWVzc2FnZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vTWVzc2FnZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYmYxODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL01lc3NhZ2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjb252aWVuZW50IHdheSB0byBhY2Nlc3MgcmVzb3VyY2UgYnVuZGxlcyBhbmQKLSAqIHJldGlldmUgdHJhbnNsYXRlZCBzdHJpbmdzLgotICoKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlVXRpbHMKLXsKLSAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZV87Ci0gIAotICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgYnVuZGxlc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBidW5kbGVJZCB0aGUgcmVzb3VyY2UgYnVuZGxlIElELgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSBjbGFzcyBsb2FkZXIgZm9yIHRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byByZXRyaWV2ZQotICAgKiAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVV0aWxzKCBTdHJpbmcgYnVuZGxlSWQsIE9iamVjdCBvYmplY3QgKQotICB7Ci0gICAgdGhpcyggYnVuZGxlSWQsIG9iamVjdC5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gYnVuZGxlSWQgdGhlIHJlc291cmNlIGJ1bmRsZSBJRC4KLSAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3MgbG9hZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlCi0gICAqICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVXRpbHMoIFN0cmluZyBidW5kbGVJZCwgQ2xhc3NMb2FkZXIgbG9hZGVyICkKLSAgewotICAgIHJlc291cmNlXyA9IChSZXNvdXJjZUJ1bmRsZSlidW5kbGVzXy5nZXQoIGJ1bmRsZUlkICk7Ci0gICAgCi0gICAgaWYoIHJlc291cmNlXyA9PSBudWxsICkKLSAgICB7Ci0gICAgICByZXNvdXJjZV8gPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIGJ1bmRsZUlkLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBsb2FkZXIgKTsKLSAgICAgIGJ1bmRsZXNfLnB1dCggYnVuZGxlSWQsIHJlc291cmNlXyApOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgZm9yIHRoZSBzdHJpbmcgdG8gcmV0cmlldmUuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgdHJhbnNsYXRlZCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UgKCBTdHJpbmcga2V5ICkKLSAgewotICAgIFN0cmluZyB2YWx1ZSA9IGtleTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IHJlc291cmNlXy5nZXRTdHJpbmcoIGtleSApOyAKLSAgICB9Ci0gICAgY2F0Y2goIFRocm93YWJsZSBleGMgKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSBrZXkgdGhlIGtleSBmb3IgdGhlIHN0cmluZyB0byByZXRyaWV2ZS4KLSAgICogQHBhcmFtIGFyZ3MgVGhlc2UgYXJndW1lbnRzIHdpbGwgYmUgc3Vic3RpdHV0ZWQgaW50byB0aGUgdHJhbnNsYXRlZCBzdHJpbmcuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgd2l0aCBhbnkgc3Vic3RpdHV0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MgKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBnZXRNZXNzYWdlKGtleSksYXJncyApOwotICB9IAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL051bGxQcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9OdWxsUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjM2YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL051bGxQcm9ncmVzc01vbml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uOwotCi0vKioKLSAqICBBIFByb2dyZXNzTW9uaXRvciB0aGF0IGRvZXMgbm90aGluZy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsUHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgUHJvZ3Jlc3NNb25pdG9yCi17Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI2dldENoaWxkUHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yIGdldENoaWxkUHJvZ3Jlc3NNb25pdG9yKCkgCi0JewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvciNpc0NhbmNlbFJlcXVlc3RlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDYW5jZWxSZXF1ZXN0ZWQoKSAKLQl7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvciNyZXBvcnQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoU3RyaW5nIHByb2dyZXNzKSAKLQl7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL051bGxTdGF0dXNIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vTnVsbFN0YXR1c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwNzg2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vTnVsbFN0YXR1c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uOwotCi1wdWJsaWMgY2xhc3MgTnVsbFN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBTdGF0dXNIYW5kbGVyCi17Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzLCBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLkNob2ljZVtdKQotICAgKi8KLSAgcHVibGljIENob2ljZSByZXBvcnQoU3RhdHVzIHN0YXR1cywgQ2hvaWNlW10gY2hvaWNlcykgCi0gIHsKLSAgCUNob2ljZSByZXN1bHQgPSBudWxsOwotICAJCi0gIAkvLyBBbHdheXMgdGFrZSB0aGUgZmlyc3QgY2hvaWNlIGlmIGF2YWlsYWJsZS4KLSAgICBpZiggY2hvaWNlcyAhPSBudWxsICYmIGNob2ljZXMubGVuZ3RoID4gMCApCi0gICAgewotICAgIAlyZXN1bHQgPSBjaG9pY2VzWzBdOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydChTdGF0dXMgc3RhdHVzKSB0aHJvd3MgU3RhdHVzRXhjZXB0aW9uCi0gIHsKLSAgfQotICAKLSAgLyoKLSAgICogUmVwb3J0IGEgd2FybmluZy4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZXBvcnRXYXJuaW5nKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIFJlcG9ydCBhbmQgZXJyb3IuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0RXJyb3JTdGF0dXMoU3RhdHVzIHN0YXR1cykKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXBvcnRFcnJvclN0YXR1cyggc3RhdHVzICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8ob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oU3RhdHVzIHN0YXR1cykKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTI2NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1Byb2dyZXNzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZ3Jlc3NNb25pdG9yCi17Ci0gIC8qKgotICAgKiBSZXBvcnRzIHByb2dyZXNzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0ICggU3RyaW5nIHByb2dyZXNzICk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgcHJvZ3Jlc3MgbW9uaXRvciB0aGF0IHdpbGwgcmVjb3JkIHByb2dyZXNzCi0gICAqIG1lc3NhZ2VzIGFzICJjaGlsZHJlbiIgb2YgdGhlIG1lc3NhZ2UgbW9zdCByZWNlbnRseSByZXBvcnRlZAotICAgKiB0aHJ1IHRoZSBwYXJlbnQgbW9uaXRvci4KLSAgICovCi0gIHB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0Q2hpbGRQcm9ncmVzc01vbml0b3IgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW52aXJvbm1lbnQgaGFzIHJlcXVlc3RlZCBjYW5jZWxsYXRpb24KLSAgICogb2YgdGhlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4gSXQgaXMgZW50aXJlbHkgdXAgdG8gYSBDb21tYW5kCi0gICAqIHRvIGRlY2lkZSBpZiwgYW5kIHdoZW4sIHRvIGNvbnN1bHQgdGhpcyBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbFJlcXVlc3RlZCAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9SYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1JhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZmY1MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5VUkk7Ci0KLS8qKgotICogQ2FycmllcyBwb3NpdGlvbiBpbmZvcm1hdGlvbiB3aXRoaW4gYSByZXNvdXJjZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBSYW5nZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gLTE7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHRoZSByYW5nZSBhcHBsaWVzIHRvLgotICAgKi8KLSAgcHVibGljIFVSSSBnZXRVUkkgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluZGV4LCB6ZXJvLWluZGV4ZWQsIG9mIHRoZSBmaXJzdCBsaW5lCi0gICAqIG9mIHRoZSByYW5nZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RhcnRpbmdMaW5lTnVtYmVyICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmRleCwgemVyby1pbmRleGVkLCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoZSByYW5nZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgotICAgKi8KLSAgcHVibGljIGludCBnZXRTdGFydGluZ0NoYXJOdW1iZXJJbkxpbmUgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluZGV4LCB6ZXJvLWluZGV4ZWQsIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhlIHJhbmdlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0YXJ0aW5nQ2hhck51bWJlckluVVJJICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmRleCwgemVyby1pbmRleGVkLCBvZiB0aGUgbGFzdCBsaW5lCi0gICAqIG9mIHRoZSByYW5nZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RW5kaW5nTGluZU51bWJlciAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb2Zmc2V0LCB6ZXJvLWluZGV4ZWQsIG9mIHRoZSBsYXN0IGNoYXJhY3RlcgotICAgKiBvZiB0aGUgcmFuZ2UgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RW5kaW5nQ2hhck51bWJlckluTGluZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5kZXgsIHplcm8taW5kZXhlZCwgb2YgdGhlIGxhc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoZSByYW5nZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRFbmRpbmdDaGFyTnVtYmVySW5VUkkgKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vUmFuZ2VWZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9SYW5nZVZlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTNjNTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9SYW5nZVZlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoaXMgVmVjdG9yIG1ha2VzIHRoZSBwcm90ZWN0ZWQgbWV0aG9kIHJlbW92ZVJhbmdlIHB1YmxpYy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSYW5nZVZlY3RvciBleHRlbmRzIFZlY3RvcgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQwNDg3OTM0NzY2NTkyMzA3NzNMOwotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVJhbmdlKCBpbnQgc3RhcnQsIGludCBlbmQgKQotICB7Ci0gICAgc3VwZXIucmVtb3ZlUmFuZ2UoIHN0YXJ0LCBlbmQgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1NpbXBsZVN0YXR1cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1NpbXBsZVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzVmOThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9TaW1wbGVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBBIHVzdWFsbHkgc3VmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBTdGF0dXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGF0dXMgaW1wbGVtZW50cyBTdGF0dXMKLXsKLSAgCi0gIHByaXZhdGUgTGlzdCBjaGlsZHJlbl8gPSBuZXcgTGlua2VkTGlzdCgpOwotICBwcml2YXRlIFN0cmluZyBpZF87Ci0gIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VfOwotICBwcml2YXRlIGludCBzZXZlcml0eV87Ci0gIHByaXZhdGUgVGhyb3dhYmxlIHRocm93YWJsZV87Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBTaW1wbGVTdGF0dXMuCi0gICAqIEBwYXJhbSBpZAotICAgKi8KLSAgcHVibGljIFNpbXBsZVN0YXR1cyAoIFN0cmluZyBpZCApCi0gIHsKLSAgICB0aGlzKGlkLCIiLE9LLG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBTaW1wbGVTdGF0dXMuCi0gICAqIEBwYXJhbSBpZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiBAcGFyYW0gc2V2ZXJpdHkKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVTdGF0dXMgKCBTdHJpbmcgaWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHkgKQotICB7Ci0gICAgdGhpcyhpZCxtZXNzYWdlLHNldmVyaXR5LG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBTaW1wbGVTdGF0dXMuCi0gICAqIEBwYXJhbSBpZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiBAcGFyYW0gY2hpbGRyZW4KLSAgICovCi0gIHB1YmxpYyBTaW1wbGVTdGF0dXMgKCBTdHJpbmcgaWQsIFN0cmluZyBtZXNzYWdlLCBTdGF0dXNbXSBjaGlsZHJlbiApCi0gIHsKLSAgICB0aGlzKGlkLG1lc3NhZ2UsT0ssbnVsbCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGNoaWxkcmVuXy5hZGQoY2hpbGRyZW5baV0pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgU2ltcGxlU3RhdHVzLgotICAgKiBAcGFyYW0gaWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogQHBhcmFtIHNldmVyaXR5Ci0gICAqIEBwYXJhbSB0aHJvd2FibGUKLSAgICovCi0gIHB1YmxpYyBTaW1wbGVTdGF0dXMgKCBTdHJpbmcgaWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHksIFRocm93YWJsZSB0aHJvd2FibGUgKQotICB7Ci0gICAgaWRfID0gaWQ7Ci0gICAgbWVzc2FnZV8gPSBtZXNzYWdlOwotICAgIHNldmVyaXR5XyA9IHNldmVyaXR5OwotICAgIHRocm93YWJsZV8gPSB0aHJvd2FibGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBTdGF0dXMjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCAoKQotICB7Ci0gICAgcmV0dXJuIGlkXzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFN0YXR1cyNnZXRNZXNzYWdlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgU3RhdHVzI2dldFNldmVyaXR5KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkgKCkKLSAgewotICAgIGludCBzZXZlcml0eSA9IHNldmVyaXR5XzsKLSAgICBpZiAoY2hpbGRyZW5fLnNpemUoKSA+IDApCi0gICAgewotICAgICAgSXRlcmF0b3IgaSA9IGNoaWxkcmVuXy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdGF0dXMgc3RhdHVzID0gKFN0YXR1cylpLm5leHQoKTsKLSAgICAgICAgaW50IGNoaWxkU2V2ZXJpdHkgPSBzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgaWYgKGNoaWxkU2V2ZXJpdHkgPiBzZXZlcml0eSkKLSAgICAgICAgewotICAgICAgICAgIHNldmVyaXR5ID0gY2hpbGRTZXZlcml0eTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBTdGF0dXMjZ2V0VGhyb3dhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlICgpCi0gIHsKLSAgICByZXR1cm4gdGhyb3dhYmxlXzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFN0YXR1cyNoYXNDaGlsZHJlbigpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbiAoKQotICB7Ci0gICAgcmV0dXJuIGNoaWxkcmVuXy5zaXplKCkgPiAwOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgU3RhdHVzI2dldENoaWxkcmVuKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXNbXSBnZXRDaGlsZHJlbiAoKQotICB7Ci0gICAgcmV0dXJuIChTdGF0dXNbXSljaGlsZHJlbl8udG9BcnJheShuZXcgU3RhdHVzWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFN0YXR1cyNtYXRjaGVzKGludCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIG1hdGNoZXMgKCBpbnQgbWFzayApCi0gIHsKLSAgICByZXR1cm4gKGdldFNldmVyaXR5KCkgfCBtYXNrKSAhPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBhZGRDaGlsZC4KLSAgICogQHBhcmFtIHN0YXR1cwotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ2hpbGQgKCBTdGF0dXMgc3RhdHVzICkKLSAgewotICAgIGNoaWxkcmVuXy5hZGQoc3RhdHVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1N0YXR1cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1N0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjg5ZDE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbW1vbi9TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uOwotCi0vKioKLSAqIENhcnJpZXMgc3RhdHVzIGluZm9ybWF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1cwotewotICAvKioKLSAgICogU3RhdHVzOiBFdmVyeXRoaW5nIGlzIGZpbmUsIGFuZCB0aGVyZSBhcmUgbm8gbWVzc2FnZXMgb3IgZGV0YWlscy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gMDsKLQotICAvKioKLSAgICogU3RhdHVzOiBFdmVyeXRoaW5nIGlzIGZpbmUsIGJ1dCB0aGVyZSBpcyBpbmZvcm1hdGlvbiB0byByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMTsKLQotICAvKioKLSAgICogU3RhdHVzOiBUaGluZ3MgYXJlIHdvcmtpbmcsIGJ1dCBwb3NzaWJseSBub3QgYXMgZXhwZWN0ZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLQotICAvKioKLSAgICogU3RhdHVzOiBCbGFtbW8uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBub24tdHJhbnNsYXRlZCBhcHBsaWNhdGlvbiBzcGVjaWZpYyBpZGVudGlmaWVyLgotICAgKiBNYXkgcmV0dXJuIG51bGwuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgdHJhbnNsYXRlZCAobG9jYWxlLXNlbnNpdGl2ZSkgbWVzc2FnZS4KLSAgICogTWF5IHJldHVybiBudWxsLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZXZlcml0eS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gZXhjZXB0aW9uICh0aHJvd2FibGUpIGJlaGluZCB0aGUgc3RhdHVzLCBpZiBhbnkuCi0gICAqIE1heSByZXR1cm4gbnVsbC4KLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdGF0dXMgb2JqZWN0IGhhcyBjaGlsZCBzdGF0dXMgb2JqZWN0cy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbW1lZGlhdGUgY2hpbGQgU3RhdHVzIG9iamVjdHMgb2YgdGhpcyBvYmplY3QuCi0gICAqIE5ldmVyIHJldHVybnMgbnVsbCwgYnV0IG1heSByZXR1cm4gYSB6ZXJvLWxlbmd0aCBhcnJheS4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNbXSBnZXRDaGlsZHJlbiAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc3RhdHVzJyBzZXZlcml0eSBtYXRjaGVzIHRoZSBzZXZlcml0eQotICAgKiBtYXNrIHBhc3NlZCBpbi4gU3RyaWN0bHkgc3BlYWtpbmc6Ci0gICAqIHRoaXMubWF0Y2hlcyh0aGF0KSA9PSAodGhpcy5nZXRTZXZlcml0eSgpIHwgdGhhdCAhPSAwKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyAoIGludCBtYXNrICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vU3RhdHVzRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vU3RhdHVzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDE5YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1N0YXR1c0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgYnkgU3RhdHVzSGFuZGxlcnMgdG8gdGVsbCB0aGVpcgotICogY2FsbGVycyB0aGF0IHByb2Nlc3Npbmcgc2hvdWxkIHN0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNFeGNlcHRpb24gZXh0ZW5kcyBFbnZpcm9ubWVudEV4Y2VwdGlvbgotewotICAvKioKLSAgICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLSAgICogKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzYxODE0MTE2MDMyMjExOTk5Mkw7Ci0KLSAgLyoqCi0gICAqIFRoZSBDaG9pY2UgdGhhdCBsZWFkIHRvIHRoZSBleGNlcHRpb24gYmVpbmcgdGhyb3duLAotICAgKiBpZiBhbnkgKGllLiBtYXkgYmUgbnVsbCkuCi0gICAqLwotICBwcm90ZWN0ZWQgQ2hvaWNlIGNob2ljZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiggU3RhdHVzIHN0YXR1cyApCi0gIHsKLSAgICBzdXBlciggc3RhdHVzICk7ICAKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgU3RhdHVzRXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIENob2ljZS4KLSAgICogVGhlIENob2ljZSBtYXkgYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXNFeGNlcHRpb24gKCBDaG9pY2UgY2hvaWNlICkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5jaG9pY2UgPSBjaG9pY2U7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBTdGF0dXNFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gQ2hvaWNlCi0gICAqIGFuZCBzdGF0dXMgb2JqZWN0LiBUaGUgQ2hvaWNlIG1heSBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFN0YXR1c0V4Y2VwdGlvbiAoIFN0YXR1cyBzdGF0dXMsIENob2ljZSBjaG9pY2UgKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzKTsKLSAgICB0aGlzLmNob2ljZSA9IGNob2ljZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDaG9pY2Ugb2JqZWN0IGluc2lkZSB0aGlzIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgZ2V0Q2hvaWNlICgpCi0gIHsKLSAgICByZXR1cm4gY2hvaWNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vU3RhdHVzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29tbW9uL1N0YXR1c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0NjkxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb21tb24vU3RhdHVzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb247Ci0KLS8qKgotICogUHJvY2Vzc2VzIHN0YXR1cyBldmVudHMgcmFpc2VkIGJ5IHRoZSBjYWxsZXIgYW5kIHJldHVybnMgYW4KLSAqIGluZGljYXRpb24gb2YgY2hvaWNlcyBtYWRlIGJ5IHRoZSByZWNpcGllbnQgb2YgdGhlIHN0YXR1cyBhbmQKLSAqIG1heSByYWlzZSBhbiBleGNlcHRpb24gYWdhaW5zdCB0aGUgY2FsbGVyIHRvIGhhdmUgdGhlbSBhYm9ydAotICogcHJvY2VzaW5nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXR1c0hhbmRsZXIKLXsKLSAgLyoqCi0gICAqIFJlcG9ydHMgdGhlIGdpdmVuIFN0YXR1cyBhbmQgc2V0IG9mIHBvc3NpYmxlIHJlc3BvbnNlcy4KLSAgICogUmV0dXJucyB0aGUgY2hvaWNlIG1hZGUgYnkgdGhlIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgQ2hvaWNlIHJlcG9ydCAoIFN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMgKTsKLSAgCi0gIC8qKgotICAgKiBSZXBvcnRzIHRoZSBnaXZlbiBTdGF0dXMgd2l0aCBpbXBsaWVkIG9wdGlvbnMgdG8gZWl0aGVyCi0gICAqIGNvbnRpbnVlIG9yIGFib3J0LgotICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBoYW5kbGVyIGRlY2lkZXMgdGhlIGNhbGxlcgotICAgKiBzaG91bGQgc3RvcCBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0ICggU3RhdHVzIHN0YXR1cyApIHRocm93cyBTdGF0dXNFeGNlcHRpb247Ci0gIAotICAvKioKLSAgICogUmVwb3J0IHRoZSBnaXZlbiBFcnJvciBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRFcnJvciggU3RhdHVzIHN0YXR1cyApOwotICAKLSAgLyoqCi0gICAqIFJlcG9ydCB0aGUgZ2l2ZW4gSW5mbyBTdGF0dXMuICBObyB1c2VyIGZlZWRiYWNrIGlzIHByb3ZpZGVkLgotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXBvcnRJbmZvKCBTdGF0dXMgc3RhdHVzICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9jb250ZXh0L0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbnRleHQvQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjI3OGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbnRleHQvQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IHRvIGdldCBhbmQgc2V0IHByZWZlcmVuY2UgaW5mb3JtYXRpb24uCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgCi17Ci0gLyoqCi0gICogTG9hZHMgdGhlIHByZWZlcmVuY2UgZGF0YSBpbnRvIHRoaXMgQ29udGV4dCBvYmplY3QuCi0gICoKLSAgKi8KLSBwdWJsaWMgdm9pZCBsb2FkKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IGZvciBhIGJvb2xlYW4gcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0IChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSk7IAotIAotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0RGVmYXVsdCAoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgYSBpbnQgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0IChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsgCi0KLSAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgYm9vbGVhbiBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldFZhbHVlIChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSk7Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgaW50IHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0VmFsdWUgKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpOyAgIAotCi0gLyoqCi0gICogR2V0cyB0aGUgdmFsdWUgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZyAoIFN0cmluZyBuYW1lKTsKLSAKLSAvKioKLSAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBib29sZWFuIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyBib29sZWFuIGdldFZhbHVlQXNCb29sZWFuICggU3RyaW5nIG5hbWUpOwotIAotIC8qKgotICAqIEdldHMgdGhlIHZhbHVlIGZvciBhIGludCBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgaW50IGdldFZhbHVlQXNJbnQgKCBTdHJpbmcgbmFtZSk7ICAJCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbnRleHQvUmVzb3VyY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYWZmMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dDsKLQotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUNvbnRleHQgCi17Ci0gLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgc3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBvdmVyd3JpdGUgZmlsZXMgZ2VuZXJhbCBwcmVmZXJlbmNlIGZyb20KLSAgICogdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gKiovCi0gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9PVkVSV1JJVEUgPSAiZmlsZXNPdmVyd3JpdGUiOwotCi0gLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgc3RyaW5nIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBjcmVhdGUgZm9sZGVycyBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbQotICAgKiB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAqKi8KLSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NSRUFURV9GT0xERVJTID0gImNyZWF0ZUZvbGRlcnMiOwotIAotIC8qKgotICAgKiBUaGlzIGNvbnN0YW50IHN0cmluZyBpcyB1c2VkIHRvIGxvb2t1cCB0aGUgY2hlY2tvdXQgZmlsZXMgZ2VuZXJhbCBwcmVmZXJlbmNlIGZyb20KLSAgICogdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gKiovCi0gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DSEVDS09VVCA9ICJmaWxlc0NoZWNrb3V0IjsKLQotIC8qKgotICAqIAotICAqIEBwYXJhbSBlbmFibGUgc2V0IHdoZXRoZXIgb3ZlcndyaXRpbmcgb2YgZmlsZXMgaXMgZW5hYmxlZC4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQgKCBib29sZWFuIGVuYWJsZSk7Ci0gCi0gLyoqCi0gICogCi0gICogQHJldHVybiByZXR1cm5zIHdoZXRoZXIgb3ZlcndyaXRpbmcgb2YgZmlsZXMgaXMgZW5hYmxlZC4KLSAgKi8KLSBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpOwotIAotIC8qKgotICAqIAotICAqIEBwYXJhbSBlbmFibGUgc2V0IHdoZXRoZXIgY3JlYXRpb24gb2YgZm9sZGVycyBpcyBlbmFibGVkLgotICAqLwotIHB1YmxpYyB2b2lkIHNldENyZWF0ZUZvbGRlcnNFbmFibGVkKCBib29sZWFuIGVuYWJsZSk7Ci0gCi0gLyoqCi0gICogCi0gICogQHJldHVybiByZXR1cm5zIHdoZXRoZXIgY3JlYXRpb24gb2YgZm9sZGVycyBpcyBlbmFibGVkLgotICAqLwotIHB1YmxpYyBib29sZWFuIGlzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKTsgCi0gCi0gLyoqCi0gICogCi0gICogQHBhcmFtIGVuYWJsZSBzZXRzIHdoZXRoZXIgYXV0b21hdGljIGNoZWNrb3V0IG9mIGZpbGVzIGlzIGVuYWJsZWQuCi0gICovCi0gcHVibGljIHZvaWQgc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoIGJvb2xlYW4gZW5hYmxlKTsKLSAKLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgd2hldGhlciBhdXRvbWF0aWMgY2hlY2tvdXQgb2YgZmlsZXMgaXMgZW5hYmxlZC4KLSAgKi8KLSBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrb3V0RmlsZXNFbmFibGVkKCk7Ci0gCi0gLyoqCi0gICogCi0gICogQHJldHVybiByZXR1cm5zIGEgY29weSBvZiB0aGlzIFJlc291cmNlQ29udGV4dC4KLSAgKi8KLSBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGNvcHkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbnRleHQvUmVzb3VyY2VEZWZhdWx0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZURlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjJhMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29udGV4dC9SZXNvdXJjZURlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZURlZmF1bHRzCi17Ci0gcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX09WRVJXUklURV9ERUZBVUxUID0gZmFsc2U7Ci0gcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUkVGRVJFTkNFX0NSRUFURV9GT0xERVJTX0RFRkFVTFQgPSB0cnVlOwotIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJFRkVSRU5DRV9DSEVDS09VVF9ERUZBVUxUID0gZmFsc2U7Ci0KLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3Igb3ZlcndyaXRpbmcgZmlsZXMuCi0gICovCi0gcHVibGljIHN0YXRpYyBib29sZWFuIGdldE92ZXJ3cml0ZUZpbGVzRGVmYXVsdCAoKQotIHsKLSAJcmV0dXJuIFBSRUZFUkVOQ0VfT1ZFUldSSVRFX0RFRkFVTFQ7Ci0gfQotIAotIC8qKgotICAqIAotICAqIEByZXR1cm4gcmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIG9mciBjcmVhdGluZyBmb2xkZXJzLgotICAqLwotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDcmVhdGVGb2xkZXJzRGVmYXVsdCAoKQotIHsgCi0JcmV0dXJuIFBSRUZFUkVOQ0VfQ1JFQVRFX0ZPTERFUlNfREVGQVVMVDsKLSB9Ci0KLSAvKioKLSAgKiAKLSAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgY2hlY2tpbmcgb3V0IGZpbGVzLgotICAqLwotIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDaGVja291dEZpbGVzRGVmYXVsdCgpCi0gewotCXJldHVybiBQUkVGRVJFTkNFX0NIRUNLT1VUX0RFRkFVTFQ7Ci0gfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29udGV4dC9UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2NvbnRleHQvVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MWFhOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvY29udGV4dC9UcmFuc2llbnRSZXNvdXJjZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBSZXNvdXJjZUNvbnRleHQgaW50ZXJmYWNlIHdoZXJlIHRoZSBzdGF0ZQotICogb2YgdGhlIGNvbnRleHQgZGF0YSBpcyB0cmFuc2llbnQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0IGltcGxlbWVudHMgUmVzb3VyY2VDb250ZXh0IAotewotICBwcml2YXRlIGJvb2xlYW4gb3ZlcldyaXRlRmlsZXM7Ci0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVGb2xkZXJzOwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tPdXRGaWxlczsKLQotICBwdWJsaWMgVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0KCkgewotICAgIHNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZChSZXNvdXJjZURlZmF1bHRzLmdldE92ZXJ3cml0ZUZpbGVzRGVmYXVsdCgpKTsKLSAgICBzZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChSZXNvdXJjZURlZmF1bHRzLmdldENyZWF0ZUZvbGRlcnNEZWZhdWx0KCkpOwotICAgIHNldENoZWNrb3V0RmlsZXNFbmFibGVkKFJlc291cmNlRGVmYXVsdHMuZ2V0Q2hlY2tvdXRGaWxlc0RlZmF1bHQoKSk7Ci0gIH0KLQotICAvKiogIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0I3NldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZChib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgb3ZlcldyaXRlRmlsZXMgPSBlbmFibGU7Ci0gIH0KLSAgCi0gIC8qKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQjaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIG92ZXJXcml0ZUZpbGVzOwotICB9Ci0KLSAgLyoqICAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dCNzZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChib29sZWFuKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKLSAgICBjcmVhdGVGb2xkZXJzID0gZW5hYmxlOwotICB9Ci0gIAotICAvKiogIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0I2lzQ3JlYXRlRm9sZGVyc0VuYWJsZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpIHsKLSAgICByZXR1cm4gY3JlYXRlRm9sZGVyczsKLSAgfQotCi0gIC8qKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQjc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQoYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENoZWNrb3V0RmlsZXNFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgY2hlY2tPdXRGaWxlcyA9IGVuYWJsZTsKLSAgfQotICAKLSAgLyoqICAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dCNpc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSB7Ci0gICAgcmV0dXJuIGNoZWNrT3V0RmlsZXM7Ci0gIH0KLSAgCi0gIC8qKiAgCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQjY29weSgpCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGNvcHkoKSB7Ci0gICAgUmVzb3VyY2VDb250ZXh0IGNjID0gbmV3IFRyYW5zaWVudFJlc291cmNlQ29udGV4dCgpOwotICAgIGNjLnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZChpc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKTsKLSAgICBjYy5zZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChpc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkpOwotICAgIGNjLnNldENoZWNrb3V0RmlsZXNFbmFibGVkKGlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSk7Ci0gICAgcmV0dXJuIGNjOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9kYXRhL0RhdGFNYXBwaW5nUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzRhODc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2RhdGEvRGF0YU1hcHBpbmdSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFNYXBwaW5nUmVnaXN0cnkKLXsKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBkYXRhIG1hcHBpbmcgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQKLSAgICogb2JqZWN0LiAgV2hlbiB0aGUgc291cmNlT2JqZWN0IGlzIGVuY291bnRlcmVkIGJ5IHRoZSBmcmFtZXdvcmsgdGhlCi0gICAqIHNvdXJjZVByb3BlcnR5IHdpbGwgYmUgY2FsbGVkIGFuZCB0aGUgZGF0YSB3aWxsIGJlIHBhc3NlZCB0byB0aGUKLSAgICogdGFyZ2V0UHJvcGVydHkgaW4gdGhlIHRhcmdldE9iamVjdC4gIElmIGEgdHJhbnNmb3JtZXIgb2JqZWN0IGlzCi0gICAqIHNwZWNpZmllZCB0aGUgc291cmNlT2JqZWN0IGlzIHRyYW5zZm9ybWVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8KLSAgICogdGhlIHRhcmdldCBvYmplY3QuCi0gICAqIAotICAgKiBAcGFyYW0gc291cmNlVHlwZSAgICAgIFRoZSBzb3VyY2Ugb2JqZWN0LgotICAgKiBAcGFyYW0gc291cmNlUHJvcGVydHkgIFRoZSBzb3VyY2UgcHJvcGVydHkuCi0gICAqIEBwYXJhbSB0YXJnZXRUeXBlICAgICAgVGhlIHRhcmdldCBvYmplY3QuCi0gICAqIEBwYXJhbSB0YXJnZXRQcm9wZXJ0eSAgVGhlIHRhcmdldCBwcm9wZXJ0eS4KLSAgICogQHBhcmFtIHRyYW5zZm9ybWVyICAgICBUaGUgdHJhbnNmb3JtZXIgb2JqZWN0IHRoYXQgdHJhbnNmb3JtcyB0aGUKLSAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE1hcHBpbmcoIENsYXNzICAgICAgIHNvdXJjZVR5cGUsCi0JCQkJCQkgIFN0cmluZyAgICAgIHNvdXJjZVByb3BlcnR5LAotCQkJCQkJICBDbGFzcyAgICAgICB0YXJnZXRUeXBlLAotCQkJCQkJICBTdHJpbmcgICAgICB0YXJnZXRQcm9wZXJ0eSwKLQkJCQkJCSAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgKTsKLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHRoZSBhYm92ZSB3aXRoIHRhcmdldFByb3BlcnR5IHRoZSBzYW1lCi0gICAqIGFzIHRoZSBzb3VyY2VQcm9wZXJ0eSBhbmQgd2l0aCB0aGUgdHJhbnNmb3JtZXIgc2V0IHRvIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gc291cmNlVHlwZSAgICAgVGhlIHNvdXJjZSBvYmplY3QuCi0gICAqIEBwYXJhbSBzb3VyY2VQcm9wZXJ0eSBUaGUgc291cmNlIHByb3BlcnR5LgotICAgKiBAcGFyYW0gdGFyZ2V0VHlwZSAgICAgVGhlIHRhcmdldCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNYXBwaW5nKCBDbGFzcyAgICAgICBzb3VyY2VUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICBzb3VyY2VQcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgdGFyZ2V0VHlwZSApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvZGF0YS9UcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvZGF0YS9UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzJiZGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL2RhdGEvVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIHRyYW5zZm9ybSBhbiBvYmplY3QgZnJvbSBvbmUgY2xhc3MgdG8gYW5vdGhlci4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNmb3JtZXIKLXsKLSAgLyoKLSAgICogQHJldHVybiByZXR1cm5zIGEgdHJhbnNmb3JtZWQgb2JqZWN0IGJhc2VkIG9uIHRoZSBpbnB1dCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKCBPYmplY3QgdmFsdWUgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3NlbGVjdGlvbi9Cb29sZWFuU2VsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9zZWxlY3Rpb24vQm9vbGVhblNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzg2NTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3NlbGVjdGlvbi9Cb29sZWFuU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioKLSAqIFRoaXMgY2xhc3MgY29tYmluZXMgYSBzdHJpbmcgd2l0aCBhIGJvb2xlYW4gdmFsdWUuICBUaGlzIGlzCi0gKiB1c2VmdWwgZm9yIHN0b3JpbmcgdGhlIHN0YXRlIGRhdGEgZm9yIGEgYm9vbGVhbiBzZWxlY3Rpb24gbGlzdC4KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuU2VsZWN0aW9uCi17Ci0gIHByaXZhdGUgU3RyaW5nICB2YWx1ZV87Ci0gIHByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZF87Ci0gIAotICBwdWJsaWMgQm9vbGVhblNlbGVjdGlvbiggU3RyaW5nIHZhbHVlLCBib29sZWFuIHNlbGVjdGVkICkKLSAgewotICAgIHZhbHVlXyAgICA9IHZhbHVlOwotICAgIHNlbGVjdGVkXyA9IHNlbGVjdGVkOwotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gR2V0IHRoZSBzdHJpbmcgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiBHZXQgdGhlIGJvb2xlYW4gdmFsdWUgZm9yIHRoaXMgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWRfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9zZWxlY3Rpb24vQ2hvaWNlc1RvU3RyaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS9zZWxlY3Rpb24vQ2hvaWNlc1RvU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzliNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvc2VsZWN0aW9uL0Nob2ljZXNUb1N0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIFRoaXMgdHJhbnNmb3JtZXIgY2xhc3Mgc2VsZWN0cyBhIHN0cmluZyBhdCBhIHBhcnRpY3VsYXIgbGV2ZWwKLSAqIGluIGEgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaG9pY2VzVG9TdHJpbmcgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcgotewotICBwcml2YXRlIGludCBsZXZlbF87Ci0gIAotICBwdWJsaWMgQ2hvaWNlc1RvU3RyaW5nKCBpbnQgbGV2ZWwgKQotICB7Ci0gICAgbGV2ZWxfID0gbGV2ZWw7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyI3RyYW5zZm9ybShqYXZhLmxhbmcuT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oIE9iamVjdCB2YWx1ZSApCi0gIHsKLSAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjaG9pY2VzID0gKFNlbGVjdGlvbkxpc3RDaG9pY2VzKXZhbHVlOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZXZlbF87IGluZGV4KysgKQotICAgIHsKLSAgICAgIGNob2ljZXMgPSBjaG9pY2VzLmdldENob2ljZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY2hvaWNlcy5nZXRMaXN0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCB0cmFuc2Zvcm0oIFNlbGVjdGlvbkxpc3RDaG9pY2VzIGNob2ljZXMgKQotICB7Ci0gICAgcmV0dXJuIChTZWxlY3Rpb25MaXN0KXRyYW5zZm9ybSggKE9iamVjdCljaG9pY2VzICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3NlbGVjdGlvbi9EeW5hbWljTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvc2VsZWN0aW9uL0R5bmFtaWNMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmIwNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvc2VsZWN0aW9uL0R5bmFtaWNMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnNlbGVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBhIER5bmFtaWMgdmVyc2lvbiBvZiB0aGUgU2VsZWN0aW9uTGlzdENob2ljZXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljTGlzdCAKLXsKLSAgcHJpdmF0ZSBWZWN0b3Igc3RyaW5nTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIGR5bmFtaWNMaXN0VmVjdG9yTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gIAotICAvKioKLSAgICogQWRkcyBhbiBlbnRyeSBpbnRvIHRoZSBkeW5hbWljIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBzdHJpbmcgdmFsdWVzIHRoYXQgbGVhZCB0byB0aGUgdGFyZ2V0LgotICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSB0YXJnZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGQoIFN0cmluZ1tdIHZhbHVlcywgT2JqZWN0IHRhcmdldCApCi0gIHsKLSAgICBEeW5hbWljTGlzdCBjdXJyZW50TGlzdCA9IHRoaXM7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHZhbHVlcy5sZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSAgICAgID0gdmFsdWVzW2luZGV4XTsKLSAgICAgIGludCAgICBsZW5ndGggICAgID0gY3VycmVudExpc3Quc3RyaW5nTGlzdF8uc2l6ZSgpOwotICAgICAgaW50ICAgIGZvdW5kSW5kZXggPSAtMTsKLSAgICAgIAotICAgICAgLy8gRmluZCB0aGUgc3RyaW5nIGluIHRoZSBjdXJyZW50IGxpc3QuCi0gICAgICBmb3IoIGludCBzZWFyY2hJbmRleCA9IDA7IHNlYXJjaEluZGV4IDwgbGVuZ3RoOyBzZWFyY2hJbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpY3VycmVudExpc3Quc3RyaW5nTGlzdF8uZWxlbWVudEF0KCBzZWFyY2hJbmRleCApOyAKLSAgICAgICAgCi0gICAgICAgIGlmKCBzdHJpbmcuZXF1YWxzKCB2YWx1ZSApICkgCi0gICAgICAgIHsKLSAgICAgICAgICBmb3VuZEluZGV4ID0gc2VhcmNoSW5kZXg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYoIGZvdW5kSW5kZXggPT0gLTEgKQotICAgICAgewotICAgICAgICAvLyBXZSBoYXZlIGEgbmV3IHN0cmluZyBzbyBhZGQgaXQgdG8gdGhlIGxpc3QuCi0gICAgICAgIGN1cnJlbnRMaXN0LnN0cmluZ0xpc3RfLmFkZCggdmFsdWUgKTsKLSAgICAgICAgY3VycmVudExpc3QuZHluYW1pY0xpc3RWZWN0b3JMaXN0Xy5hZGQoIG5ldyBEeW5hbWljTGlzdCgpICk7Ci0gICAgICAgIGZvdW5kSW5kZXggPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGN1cnJlbnRMaXN0ID0gKER5bmFtaWNMaXN0KWN1cnJlbnRMaXN0LmR5bmFtaWNMaXN0VmVjdG9yTGlzdF8uZWxlbWVudEF0KCBmb3VuZEluZGV4ICk7ICAgICAgIAotICAgIH0KLSAgICAKLSAgICBjdXJyZW50TGlzdC5keW5hbWljTGlzdFZlY3Rvckxpc3RfLmFkZCggdGFyZ2V0ICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgU2VsZWN0aW9uTGlzdENob2ljZXMgb2JqZWN0IGZyb20gdGhpcyBEeW5hbWljTGlzdAotICAgKiBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgdG9MaXN0Q2hvaWNlcygpCi0gIHsKLSAgICBTZWxlY3Rpb25MaXN0IGxpc3QgICA9IG5ldyBTZWxlY3Rpb25MaXN0KCAoU3RyaW5nW10pc3RyaW5nTGlzdF8udG9BcnJheSggbmV3IFN0cmluZ1swXSApLCAwKTsKLSAgICBpbnQgICAgICAgICAgIGxlbmd0aCA9IGR5bmFtaWNMaXN0VmVjdG9yTGlzdF8uc2l6ZSgpOwotICAgIFZlY3RvciAgICAgICAgdmVjdG9yID0gbmV3IFZlY3RvcigpOyAKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gZHluYW1pY0xpc3RWZWN0b3JMaXN0Xy5lbGVtZW50QXQoaW5kZXgpOwotICAgICAgCi0gICAgICBpZiggb2JqIGluc3RhbmNlb2YgRHluYW1pY0xpc3QgKQotICAgICAgewotICAgICAgICB2ZWN0b3IuYWRkKCAoKER5bmFtaWNMaXN0KW9iaikudG9MaXN0Q2hvaWNlcygpICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHZlY3Rvci5hZGQoIG9iaiApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RDaG9pY2VzKCBsaXN0LCB2ZWN0b3IgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3NlbGVjdGlvbi9TZWxlY3Rpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzU0ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuc2VsZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3RvcmVzIGEgbGlzdCBzdHJpbmdzIGFsb25nIHdpdGggYSBzZWxlY3Rpb25JbmRleCB3aGljaAotICogc3RvcmVzIHRoZSBjdXJyZW50IHN0cmluZyB0aGF0IHNlbGVjdGVkLiAgVGhlcmUgaXMgYWxzbyBhIHNlbGVjdGlvbgotICogdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIG9uZSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgdGhlIHN0cmluZyBsaXN0Ci0gKiB0aGVuIHNlbGVjdGlvbkluZGV4IHdpbGwgY29udGFpbiB0aGUgaW5kZXggb2YgdGhpcyBzdHJpbmcuICBJZiBpdAotICogaXMgbm90IGluIHRoZSBsaXN0IHRoZW4gdGhlIHNlbGVjdGlvblZhbHVlIHN0cmluZyB3aWxsIGNvbnRhaW4gdGhpcwotICogdmFsdWUgYW5kIHNlbGVjdGlvbkluZGV4IHdpbGwgYmUgc2V0IHRvIC0xLiAgVGhpcyBjbGFzcyBjYW4gYmUKLSAqIHVzZWQgdG8gc3RvcmUgdGhlIHN0YXRlIGRhdGEgZm9yIGEgQ29tYm8gYm94LgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uTGlzdAotewotICBwcml2YXRlIGludCAgICAgIHNlbGVjdGlvbkluZGV4XzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBsaXN0XzsKLSAgcHJpdmF0ZSBTdHJpbmcgICBzZWxlY3Rpb25WYWx1ZV87Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCggU3RyaW5nW10gbGlzdCwgaW50IHNlbGVjdGlvbkluZGV4ICkKLSAgewotICAgIGxpc3RfICAgICAgICAgICA9IGxpc3Q7Ci0gICAgc2VsZWN0aW9uSW5kZXhfID0gc2VsZWN0aW9uSW5kZXg7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24gdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgotICAgKiAKLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblZhbHVlKCBTdHJpbmcgdmFsdWUgKQotICB7Ci0gICAgc2VsZWN0aW9uVmFsdWVfID0gdmFsdWU7ICAKLSAgICBzZWxlY3Rpb25JbmRleF8gPSAtMTsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGlzdF8ubGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBpZiggdmFsdWUuZXF1YWxzKCBsaXN0X1tpbmRleF0gKSApCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvbkluZGV4XyA9IGluZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gCi0gIAotICAvKgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHN0cmluZyBsaXN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldExpc3QoKQotICB7Ci0gICAgcmV0dXJuIGxpc3RfOwotICB9Ci0gIAotICAvKgotICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3RyaW5nIGluIHRoZSBsaXN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5kZXgoIGludCBpbmRleCApCi0gIHsKLSAgICBzZWxlY3Rpb25JbmRleF8gPSBpbmRleDsKLSAgICBzZWxlY3Rpb25WYWx1ZV8gPSBudWxsOwotICB9Ci0gCi0gIC8qCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3RyaW5nLiAgVGhlIHZhbHVlCi0gICAqIHdpbGwgYmUgLTEgaWYgdGhlIHNlbGVjdGlvbiB2YWx1ZSBpcyBub3QgaW4gdGhlIHN0cmluZyBsaXN0LgotICAgKi8KLSAgcHVibGljIGludCBnZXRJbmRleCgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0aW9uSW5kZXhfOyAgCi0gIH0KLSAgCi0gIC8qCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgY3VycmVudCBzdHJpbmcgc2VsZWN0aW9uIGZvciB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0aW9uKCkKLSAgewotICAgIGlmKCBzZWxlY3Rpb25WYWx1ZV8gIT0gbnVsbCApIHJldHVybiBzZWxlY3Rpb25WYWx1ZV87Ci0gICAgCi0gICAgaWYoIHNlbGVjdGlvbkluZGV4XyA9PSAtMSB8fCBzZWxlY3Rpb25JbmRleF8gPiBsaXN0Xy5sZW5ndGgtMSApCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIGxpc3RfWyBzZWxlY3Rpb25JbmRleF8gXTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3NlbGVjdGlvbi9TZWxlY3Rpb25MaXN0Q2hvaWNlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3RDaG9pY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YjBkNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvc2VsZWN0aW9uL1NlbGVjdGlvbkxpc3RDaG9pY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBzdG9yZSBhIGhpZXJhcmNoeSBvZiBTZWxlY3Rpb25MaXN0Ci0gKiBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0aW9uTGlzdENob2ljZXMKLXsKLSAgcHJpdmF0ZSBTZWxlY3Rpb25MaXN0IHNlbGVjdGlvbkxpc3RfOwotICBwcml2YXRlIFZlY3RvciAgICAgICAgY2hvaWNlc187Ci0gIHByaXZhdGUgU2VsZWN0aW9uTGlzdCBuZXdWYWx1ZVNlbGVjdGlvbkxpc3RfOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gbGlzdCAgICAgVGhlIHNlbGVjdGlvbiBsaXN0LgotICAgKiBAcGFyYW0gY2hvaWNlcyAgVGhpcyBpcyBhIHZlY3RvciBvZiBTZWxlY3Rpb25MaXN0Q2hvaWVzIGFuZCBjYW4gYmUKLSAgICogICAgICAgICAgICAgICAgIG51bGwgaWYgdGhlcmUgYXJlIG5vIGNob2ljZXMuICBUaGlzIGluZGV4IG9mIGxpc3QKLSAgICogICAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gaW5kZXggaW50byBjaG9pY2VzLiAgSWYgaW5kZXggaXMgLTEgdGhlbgotICAgKiAgICAgICAgICAgICAgICAgdGhlIG5ld1ZhbHVlU2VsZWN0aW9uTGlzdCBpcyB1c2VkLgotICAgKi8KLSAgcHVibGljIFNlbGVjdGlvbkxpc3RDaG9pY2VzKCBTZWxlY3Rpb25MaXN0IGxpc3QsIFZlY3RvciBjaG9pY2VzICkKLSAgewotICAgIHNlbGVjdGlvbkxpc3RfID0gbGlzdDsKLSAgICBjaG9pY2VzXyAgICAgICA9IGNob2ljZXM7Ci0gICAgCi0gICAgbmV3VmFsdWVTZWxlY3Rpb25MaXN0XyA9IG5ldyBTZWxlY3Rpb25MaXN0KCBuZXcgU3RyaW5nWzBdLCAtMSApOwotICB9Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMoIFNlbGVjdGlvbkxpc3QgbGlzdCwgVmVjdG9yIGNob2ljZXMsIFNlbGVjdGlvbkxpc3QgbmV3TGlzdCApCi0gIHsKLSAgICB0aGlzKCBsaXN0LCBjaG9pY2VzICk7Ci0gICAgbmV3VmFsdWVTZWxlY3Rpb25MaXN0XyA9IG5ld0xpc3Q7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGN1cnJlbnQgU2VsZWN0aW9uIGxpc3QuCi0gICAqLwotICBwdWJsaWMgU2VsZWN0aW9uTGlzdCBnZXRMaXN0KCkKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb25MaXN0XzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGNob2ljZXMgZm9yIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRDaG9pY2VzKCkKLSAgewotICAgIHJldHVybiBjaG9pY2VzXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gbGV2ZWwgdGhlIGxldmVsIGluIHRoZSBoaWVyYXJjaHkgd2hlcmUgd2Ugd2FudCB0byBnZXQgdGhlIGNob2ljZXMuCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIHZlY3RvciBvZiBTZWxlY3Rpb25MaXN0Q2hvaWNlcy4KLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0Q2hvaWNlc0F0TGV2ZWwoIGludCBsZXZlbCApCi0gIHsKLSAgICBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBjaG9pY2VzID0gdGhpczsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGV2ZWw7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGNob2ljZXMgPSBjaG9pY2VzLmdldENob2ljZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gY2hvaWNlcy5nZXRDaG9pY2VzKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBjdXJyZW50IFNlbGVjdGlvbkxpc3RDaG9pY2UKLSAgICovCi0gIHB1YmxpYyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyBnZXRDaG9pY2UoKQotICB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXggPSBzZWxlY3Rpb25MaXN0Xy5nZXRJbmRleCgpOwotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJlc3VsdCAgICAgICAgID0gbnVsbDsKLSAgICAKLSAgICBpZiggc2VsZWN0aW9uSW5kZXggPT0gLTEgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTZWxlY3Rpb25MaXN0Q2hvaWNlcyggbmV3VmFsdWVTZWxlY3Rpb25MaXN0XywgbnVsbCApOwotICAgIH0KLSAgICBlbHNlIGlmKCBjaG9pY2VzXyAhPSBudWxsICYmIGNob2ljZXNfLnNpemUoKSAhPSAwICkgCi0gICAgewotICAgICAgcmVzdWx0ID0gKFNlbGVjdGlvbkxpc3RDaG9pY2VzKWNob2ljZXNfLmVsZW1lbnRBdCggc2VsZWN0aW9uSW5kZXggKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBjaG9pY2Ugd2Ugd2FudC4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBTZWxlY3Rpb25MaXN0Q2hvaWNlIGF0IHRoZSBpbmRleCBzcGVjaWZpZWQuCi0gICAqLwotICBwdWJsaWMgU2VsZWN0aW9uTGlzdENob2ljZXMgZ2V0Q2hvaWNlKGludCBpbmRleCkKLSAgewotICAgIFNlbGVjdGlvbkxpc3RDaG9pY2VzIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBnZXRMaXN0KCkuZ2V0TGlzdCgpLmxlbmd0aCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU2VsZWN0aW9uTGlzdENob2ljZXMoIG5ld1ZhbHVlU2VsZWN0aW9uTGlzdF8sIG51bGwgKTsgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChTZWxlY3Rpb25MaXN0Q2hvaWNlcyljaG9pY2VzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgfQotICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvdXJpL05hdGl2ZUZpbGVDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvTmF0aXZlRmlsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjZDg0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvTmF0aXZlRmlsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuVVJJRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmF0aXZlRmlsZUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0gIHByb3RlY3RlZCBVUklbXSB1cmlzVG9SZWFkOwotCi0gIHByb3RlY3RlZCBVUklbXSB1cmlzVG9Xcml0ZTsKLQotICBwcm90ZWN0ZWQgTmF0aXZlRmlsZUNvbW1hbmQgKCkKLSAgewotICAgIHRoaXMobnVsbCxudWxsKTsKLSAgfQotCi0gIHByb3RlY3RlZCBOYXRpdmVGaWxlQ29tbWFuZCAoIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24gKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0VVJJc1RvUmVhZCAoIFVSSVtdIHVyaXNUb1JlYWQgKQotICB7Ci0gICAgdGhpcy51cmlzVG9SZWFkID0gdXJpc1RvUmVhZDsKLSAgfQotCi0gIHB1YmxpYyBVUklbXSBnZXRVUklzVG9SZWFkICgpCi0gIHsKLSAgICByZXR1cm4gdXJpc1RvUmVhZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVSSXNUb1dyaXRlICggVVJJW10gdXJpc1RvV3JpdGUgKQotICB7Ci0gICAgdGhpcy51cmlzVG9Xcml0ZSA9IHVyaXNUb1dyaXRlOwotICB9Ci0KLSAgcHVibGljIFVSSVtdIGdldFVSSXNUb1dyaXRlICgpCi0gIHsKLSAgICByZXR1cm4gdXJpc1RvV3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUgKCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICBGaWxlW10gZmlsZXNUb1JlYWQgPSBnZXRGaWxlcyh1cmlzVG9SZWFkKTsKLSAgICBGaWxlW10gZmlsZXNUb1dyaXRlID0gZ2V0RmlsZXModXJpc1RvV3JpdGUpOwotICAgIHByZVByb2Nlc3MoZmlsZXNUb1JlYWQsZmlsZXNUb1dyaXRlKTsKLSAgICBTdGF0dXMgc3RhdHVzID0gZXhlY3V0ZShlbnZpcm9ubWVudCxmaWxlc1RvUmVhZCxmaWxlc1RvV3JpdGUpOwotICAgIHBvc3RQcm9jZXNzKGZpbGVzVG9SZWFkLGZpbGVzVG9Xcml0ZSk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBTdGF0dXMgZXhlY3V0ZSAoIEVudmlyb25tZW50IGVudmlyb25tZW50LCBGaWxlW10gZmlsZXNUb1JlYWQsIEZpbGVbXSBmaWxlc1RvV3JpdGUgKTsKLQotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlICgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHVuZG8gKCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzUmVkb2FibGUgKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyAoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByZVByb2Nlc3MgKCBGaWxlW10gZmlsZXNUb1JlYWQsIEZpbGVbXSBmaWxlc1RvV3JpdGUgKQotICB7Ci0gICAgLy8gVEJELgotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBvc3RQcm9jZXNzICggRmlsZVtdIGZpbGVzVG9SZWFkLCBGaWxlW10gZmlsZXNUb1dyaXRlICkKLSAgewotICAgIC8vIFRCRC4KLSAgfQotCi0gIHByaXZhdGUgRmlsZVtdIGdldEZpbGVzICggVVJJW10gdXJpcyApCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgIGlmICh1cmlzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaT0wOyBpPHVyaXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmICh1cmlzW2ldLmlzQXZhaWxhYmxlQXNGaWxlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZCh1cmlzW2ldLmFzRmlsZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFVSSUV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChGaWxlW10pbGlzdC50b0FycmF5KG5ldyBGaWxlWzBdKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvdXJpL1JlbGF0aXZlU2NoZW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvUmVsYXRpdmVTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2ZDIyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvUmVsYXRpdmVTY2hlbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVNjaGVtZSBpbXBsZW1lbnRzIFVSSVNjaGVtZQotewotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc0hpZXJhcmNoaWNhbCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChVUkkgdXJpKQotICB7Ci0gICAgcmV0dXJuICF1cmkudG9TdHJpbmcoKS5zdGFydHNXaXRoKCAiLyIgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVNjaGVtZSNuZXdVUkkoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFN0cmluZyB1cmkpIAotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjbmV3VVJJKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkoVVJJIHVyaSkgCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlbGF0aXZlVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJU2NoZW1lI25ld1VSSShqYXZhLm5ldC5VUkwpCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShVUkwgdXJsKSAKLSAgewotICAgIHJldHVybiBuZXcgUmVsYXRpdmVVUkkoIHVybC50b1N0cmluZygpICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUklTY2hlbWUjdmFsaWRhdGUob3JnLmVjbGlwc2UuZW52LnVyaS5VUkkpCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlKFVSSSB1cmkpCi0gIHsKLSAgICBTdGF0dXMgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiggaXNWYWxpZCggdXJpICkgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCAiIiwgU3RhdHVzLk9LICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgIiIsIFN0YXR1cy5FUlJPUiApOyAgICAgIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvUmVsYXRpdmVVUkkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9SZWxhdGl2ZVVSSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNiYWFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9SZWxhdGl2ZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVVSSSBpbXBsZW1lbnRzIFVSSQotewotICBwcm90ZWN0ZWQgU3RyaW5nIHVyaV87Ci0gIAotICBwdWJsaWMgUmVsYXRpdmVVUkkoIFN0cmluZyB1cmkgKQotICB7Ci0gICAgdXJpXyA9IHVyaTsgICAKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FwcGVuZChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSkKLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kKFVSSSByZWxhdGl2ZVVSSSkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYoICFyZWxhdGl2ZVVSSS5pc1JlbGF0aXZlKCkpIAotICAgICB7Ci0gICAgICBNZXNzYWdlVXRpbHMgbXNnID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmVudmlyb25tZW50IiwgbmV3IER1bW15KCkgKTsKLSAgICAgIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIlJlbGF0aXZlVVJJIiwgCi0gICAgICAgICAgICAgIG1zZy5nZXRNZXNzYWdlKCAiTVNHX1VSSV9OT1RfUkVMQVRJVkUiLCBuZXcgT2JqZWN0W117IHJlbGF0aXZlVVJJLnRvU3RyaW5nKCkgfSksCi0gICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIG5ld1VSSSA9IHVyaV8gKyAiLyIgKyByZWxhdGl2ZVVSSS50b1N0cmluZygpOwotICAgIAotICAgIHJldHVybiBnZXRVUklTY2hlbWUoKS5uZXdVUkkoIG5ld1VSSSApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgRmlsZSBhc0ZpbGUoKSAKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2FzU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIHVyaV87Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB1cmlfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjYXNVUkwoKQotICAgKi8KLSAgcHVibGljIFVSTCBhc1VSTCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFVSTCB1cmwgPSBudWxsOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwoIHVyaV8gKTsKLSAgICB9Ci0gICAgY2F0Y2goIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiUmVsYXRpdmVVUkkiLCBleGMuZ2V0TWVzc2FnZSgpLCBTdGF0dXMuRVJST1IgKSwKLSAgICAgICAgICAgIHRoaXMgKTsgCi0gICAgfQotICAgIAotICAgIHJldHVybiB1cmw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZXJhc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJhc2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRJbnB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRVUklTY2hlbWUoKQotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBnZXRVUklTY2hlbWUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVNjaGVtZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzQXZhaWxhYmxlQXNGaWxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNGaWxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc0F2YWlsYWJsZUFzVVJMKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlQXNVUkwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNIaWVyYXJjaGljYWwoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNMZWFmKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNQcmVzZW50KCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWFkYWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1JlbGF0aXZlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNXcml0YWJsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRhYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KCkKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBVUklbMF07Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjbGlzdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSUZpbHRlcikKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KFVSSUZpbHRlciB1cmlGaWx0ZXIpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBuZXcgVVJJWzBdOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3BhcmVudCgpCi0gICAqLwotICBwdWJsaWMgVVJJIHBhcmVudCgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGludCBsYXN0U2xhc2ggID0gdXJpXy5sYXN0SW5kZXhPZiggJy8nICk7Ci0gICAgaW50IGZpcnN0U2xhc2ggPSB1cmlfLmluZGV4T2YoICcvJyApOwotICAgIAotICAgIC8vIElmIHRoZXJlIGlzIGEgcGFyZW50LCB0aGVuIGl0IG11c3Qgc3RhcnQgd2l0aCBhIHNsYXNoCi0gICAgLy8gYW5kIGVuZCB3aXRoIGEgc2xhc2guCi0gICAgaWYoIGxhc3RTbGFzaCA9PSAtMSB8fCBmaXJzdFNsYXNoID09IC0xICkgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotICAgIHJldHVybiBnZXRVUklTY2hlbWUoKS5uZXdVUkkoIHVyaV8uc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCApICk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lKFVSSSBuZXdVUkkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHVyaV8gPSBuZXdVUkkudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaEZvbGRlcigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlcigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3RvdWNoTGVhZigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaExlYWYoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN2aXNpdChvcmcuZWNsaXBzZS5lbnYudXJpLlVSSVZpc2l0b3IsIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJRmlsdGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoVVJJVmlzaXRvciB1cmlWaXNpdG9yLCBVUklGaWx0ZXIgdXJpRmlsdGVyKQotICAgIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gY29udGludWVWaXNpdCA9IHRydWU7Ci0gICAgCi0gICAgLy8gSWYgdGhlIGZpbHRlciBhY2NlcHRzIHRoaXMgd2Ugd2lsbCB2aXNpdCBpdC4KLSAgICBpZiggdXJpRmlsdGVyLmFjY2VwdHMoIHRoaXMgKSApCi0gICAgewotICAgICAgY29udGludWVWaXNpdCA9IHVyaVZpc2l0b3IudmlzaXQoIHRoaXMgKTsgIAotICAgIH0KLSAgICAgICAKLSAgICBVUklbXSBjaGlsZHJlbiAgPSBsaXN0KCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjb250aW51ZVZpc2l0OyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBjaGlsZHJlbltpbmRleF0udmlzaXQoIHVyaVZpc2l0b3IsIHVyaUZpbHRlciApOwotICAgIH0gIAotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI3Zpc2l0KG9yZy5lY2xpcHNlLmVudi51cmkuVVJJVmlzaXRvcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFVSSVZpc2l0b3IgdXJpVmlzaXRvcikgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBjb250aW51ZVZpc2l0ID0gdXJpVmlzaXRvci52aXNpdCggdGhpcyApOyAgCi0gICAgCi0gICAgVVJJW10gY2hpbGRyZW4gID0gbGlzdCgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGggJiYgY29udGludWVWaXNpdDsgaW5kZXgrKyApCi0gICAgIHsKLSAgICAgIGNoaWxkcmVuW2luZGV4XS52aXNpdCggdXJpVmlzaXRvciApOwotICAgIH0gIAotICB9Ci0gICAgCi0gIHByaXZhdGUgY2xhc3MgRHVtbXkgCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvdXJpL1NpbXBsZVVSSUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9TaW1wbGVVUklGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTY2MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvdXJpL1NpbXBsZVVSSUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlVVJJRmFjdG9yeSBpbXBsZW1lbnRzIFVSSUZhY3RvcnkKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgc2NoZW1lc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ18gICAgID0gbmV3IE1lc3NhZ2VVdGlscyggIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLmVudmlyb25tZW50IiwgdGhpcyApOwotICAKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFVSSVNjaGVtZSBzY2hlbWUgPSBuZXdVUklTY2hlbWUoIHVyaSApOwotICAgIAotICAgIHJldHVybiBzY2hlbWUubmV3VVJJKCB1cmkgKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFVSTCB1cmwpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFVSSVNjaGVtZSBzY2hlbWUgPSBuZXdVUklTY2hlbWUoIHVybC50b1N0cmluZygpICk7Ci0gICAgCi0gICAgcmV0dXJuIHNjaGVtZS5uZXdVUkkoIHVybCApOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBuZXdVUklTY2hlbWUoU3RyaW5nIHNjaGVtZU9yVVJJKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBVUklTY2hlbWUgbmV3U2NoZW1lID0gbnVsbDsKLSAgICAKLSAgICBpZiggc2NoZW1lT3JVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJTaW1wbGVVUklGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX05VTExfQVJHX1NQRUNJRklFRCIsIG5ldyBPYmplY3RbXXsibmV3VVJJU2NoZW1lIn0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IgKSApOwotICAgIH0KLSAgICAKLSAgICBpbnQgY29sb24gICAgPSBzY2hlbWVPclVSSS5pbmRleE9mKCc6Jyk7Ci0gICAgaW50IHNsYXNoICAgID0gc2NoZW1lT3JVUkkuaW5kZXhPZignLycpOwotICAgIAotICAgIC8vIEEgcHJvdG9jb2wgd2FzIHNwZWNpZmllZC4gIE5vdGU6IGEgY29sb24gYXBwZWFyaW5nIGFmdGVyIGEgcGF0aCBpcyBub3QKLSAgICAvLyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByb3RvY29sIGZvciB0aGlzIFVSSS4KLSAgICBpZiggKGNvbG9uICE9IC0xICYmIHNsYXNoID09IC0xKSB8fCAoIGNvbG9uICE9IC0xICYmIGNvbG9uIDwgc2xhc2ggKSApCi0gICAgewotICAgICAgU3RyaW5nIHByb3RvY29sID0gc2NoZW1lT3JVUkkuc3Vic3RyaW5nKDAsIGNvbG9uICk7Ci0gICAgICBuZXdTY2hlbWUgICAgICAgPSAoVVJJU2NoZW1lKXNjaGVtZXNfLmdldCggcHJvdG9jb2wgKTsKLSAgICAgIAotICAgICAgaWYoIG5ld1NjaGVtZSA9PSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiU2ltcGxlVVJJRmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX1NDSEVNRV9OT1RfRk9VTkQiLCBuZXcgT2JqZWN0W117IHNjaGVtZU9yVVJJIH0pLAotICAgICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApICk7ICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKCBzY2hlbWVPclVSSS5zdGFydHNXaXRoKCAiLyIpICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiU2ltcGxlVVJJRmFjdG9yeSIsCi0gICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19BQlNPTFVURV9QQVRIX1dJVEhPVVRfU0NIRU1FIiwgbmV3IE9iamVjdFtdeyBzY2hlbWVPclVSSSB9KSwKLSAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SICkgKTsKLSAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbmV3U2NoZW1lID0gbmV3IFJlbGF0aXZlU2NoZW1lKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuZXdTY2hlbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyU2NoZW1lKCBTdHJpbmcgcHJvdG9jb2wsIFVSSVNjaGVtZSBzY2hlbWUgKQotICB7Ci0gICAgc2NoZW1lc18ucHV0KCBwcm90b2NvbCwgc2NoZW1lICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9VUkkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9VUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMDQ4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSBVUkkgcmVwcmVzZW50cyBhIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZlci4KLSAqLwotcHVibGljIGludGVyZmFjZSBVUkkKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyBmb3JtIG9mIHRoZSBVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSVNjaGVtZSBmb3IgdGhlIHNjaGVtZSBvZiB0aGlzIFVSSS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKi8KLSAgcHVibGljIFVSSVNjaGVtZSBnZXRVUklTY2hlbWUgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBVUkkgZXhpc3RzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50ICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgVVJJIGV4aXN0cwotICAgKiBhbmQgaXMgYSBsZWFmLiBSZXR1cm5zIHRydWUgYWx3YXlzIGZvciBub24taGllcmFyY2hpY2FsIHNjaGVtZXMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xlYWYgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBVUkkgZXhpc3RzCi0gICAqIGFuZCBpcyByZWFkYWJsZS4gQSByZWFkYWJsZSBsZWFmIHJlc291cmNlIGluZGljYXRlcyB0aGF0IGFuCi0gICAqIGlucHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSByZWFkYWJsZSBmb2xkZXIKLSAgICogcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBmb2xkZXIsIGlmIGFueSwKLSAgICogY2FuIGJlIGRldGVybWluZWQgdmlhIHRoZSBsaXN0KCkgb3IgdmlzaXQoKSBtZXRob2RzLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmZiB0aGUgcmVzb3VyY2UgaWRlbnRpZmllZCBieSB0aGlzIFVSSSBleGlzdHMKLSAgICogYW5kIGlzIHdyaXRhYmxlLiBBIHdyaXRhYmxlIGxlYWYgcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgYW4KLSAgICogb3V0cHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIG9uIHRoZSByZXNvdXJjZS4gQSB3cml0YWJsZSBmb2xkZXIKLSAgICogcmVzb3VyY2UgaW5kaWNhdGVzIHRoYXQgbmV3IHJlc291cmNlcyBjYW4gYmUgY3JlYXRlZCBpbiB0aGUgZm9sZGVyLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNXcml0YWJsZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmZiB0aGlzIFVSSSBiZWxvbmdzIHRvIGEgaGllcmFyY2hpY2FsIHNjaGVtZS4KLSAgICogVGhlIHJlc291cmNlIG5lZWQgbm90IGV4aXN0LgotICAgKiB0aGlzLmlzSGllcmFyY2hpY2FsKCkgPT0gdGhpcy5nZXRVUklTY2hlbWUoKS5pc0hpZXJhcmNoaWNhbCgpLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBVUkkgaXMgYSByZWxhdGl2ZSBVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVsYXRpdmUgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBvZiB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhpcyBVUkkuCi0gICAqIFRoZSByZXNvdXJjZSBuZWVkIG5vdCBleGlzdC4KLSAgICovCi0gIHB1YmxpYyBVUkkgcGFyZW50ICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcsIG5vcm1hbGl6ZWQgVVJJIGZvcm1lZCBieSBhcHBlbmRpbmcgdGhlIGdpdmVuCi0gICAqIHJlbGF0aXZlIFVSSSB0byB0aGlzIFVSSS4gQm90aCBVUklzIG11c3QgYmUgaGllcmFyY2hpY2FsLgotICAgKiBUaGUgcmVzdWx0aW5nIFVSSSB3aWxsIGFsd2F5cyBiZSBoaWVyYXJjaGljYWwuIFRoZSBnaXZlbgotICAgKiBVUkkgbXVzdCBiZSByZWxhdGl2ZS4gVGhpcyBVUkkgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlLgotICAgKiB0aGUgcmVzdWx0aW5nIFVSSSB3aWxsIGJlIGVxdWl2YWxlbnRseSByZWxhdGl2ZSBvciBhYnNvbHV0ZS4KLSAgICovCi0gIHB1YmxpYyBVUkkgYXBwZW5kICggVVJJIHJlbGF0aXZlVVJJICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0cyBhbiBJbnB1dFN0cmVhbSBmb3IgcmVhZGluZyBmcm9tIHRoZSByZXNvdXJjZQotICAgKiBpZGVudGlmaWVkIGJ5IHRoaXMgbGVhZiBvciBub24taGllcmFyY2hpY2FsIFVSSS4KLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHZXRzIGFuIE91dHB1dFN0cmVhbSBmb3Igd3JpdGluZyB0byB0aGUgcmVzb3VyY2UKLSAgICogaWRlbnRpZmllZCBieSB0aGlzIGxlYWYgb3Igbm9uLWhpZXJhcmNoaWNhbCBVUkkuCi0gICAqLwotICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotICAgKiB0aGUgVVJJLiBPbiBjb21wbGV0aW9uLCB0aGlzLmlzTGVhZigpID09IHRydWUuIElmIGEgbGVhZgotICAgKiByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBJZiBhCi0gICAqIG5vbi1sZWFmIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIHVuZGVyIHRoaXMgVVJJLCBjcmVhdGlvbgotICAgKiB3aWxsIGZhaWwgYW5kIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRvdWNoTGVhZiAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGZvbGRlciByZXNvdXJjZSBhdCB0aGUgbG9jYXRpb24gaWRlbnRpZmllZCBieQotICAgKiB0aGUgVVJJLiBUaGUgc2NoZW1lIG9mIHRoZSBVUkkgbXVzdCBiZSBoaWVyYXJjaGljYWwuCi0gICAqIE9uIGNvbXBsZXRpb24sIHRoaXMuaXNMZWFmKCkgPT0gZmFsc2UuIElmIGEgZm9sZGVyIHJlc291cmNlCi0gICAqIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIElmIGEgbGVhZiByZXNvdXJjZQotICAgKiBhbHJlYWR5IGV4aXN0cyB1bmRlciB0aGlzIFVSSSwgY3JlYXRpb24gd2lsbCBmYWlsIGFuZCBhbgotICAgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlciAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBFcmFzZXMgdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhpcyBVUkkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcmFzZSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZW5hbWVzIG9yIG1vdmVzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IHRoaXMgVVJJCi0gICAqIHRvIHRoZSBuZXcgVVJJLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lICggVVJJIG5ld1VSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFZpc2l0cyB0aGlzIHJlc291cmNlIGFuZCBpdHMgZGVjZW5kYW50cyBpbiBwcmUtb3JkZXIgZmFzaGlvbi4KLSAgICogRm9yIGVhY2ggcmVzb3VyY2UsIHdoZXRoZXIgYSBmb2xkZXIgb3IgYSBsZWFmLCB0aGUgZ2l2ZW4KLSAgICogVVJJVmlzaXRvcidzIHZpc2l0KCkgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZSBVUkkgb2YgdGhlCi0gICAqIHJlc291cmNlLiBJZiBVUklWaXNpdG9yLnZpc2l0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHZpc2l0aW5nCi0gICAqIGFsZ29yaXRobSB3aWxsICJwcnVuZSIgdGhlIGRlY2VuZGFudHMgb2YgdGhlIHJlc291cmNlIGFuZAotICAgKiBjYXJyeSBvbiB2aXNpdGluZyB0aGUgcmVzdCBvZiB0aGUgdHJlZS4gSWYgVVJJVmlzaXRvci52aXNpdCgpCi0gICAqIHJldHVybnMgdHJ1ZSwgdGhlIHZpc2l0aW5nIGFsZ29yaXRobSB3aWxsIGNvbnRpbnVlIGl0cyB3YWxrCi0gICAqIGRvd24gdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCAoIFVSSVZpc2l0b3IgdXJpVmlzaXRvciApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEFzIGZvciB2aXNpdChVUklWaXNpdG9yKSwgZXhjZXB0IG9ubHkgcmVzb3VyY2UgVVJJcyB0aGF0IGFyZQotICAgKiBhY2NlcHRlZCBieSB0aGUgZ2l2ZW4gZmlsdGVyIGFyZSB2aXNpdGVkLiBJZiBhIGZvbGRlciByZXNvdXJjZQotICAgKiBmYWlscyB0byBiZSBhY2NlcHRlZCBieSB0aGUgZmlsdGVyLCB0aGlzIHdpbGwgbm90IHByZXZlbnQgdGhlCi0gICAqIHZpc2l0aW5nIGFsZ29yaXRobSBmcm9tIHdhbGtpbmcgdGhlIHJlc291cmNlJ3MgZGVzY2VuZGFudHMuCi0gICAqIEl0IHJlbWFpbnMgdGhlIGpvYiBvZiB0aGUgdmlzaXRvciB0byBjaG9vc2Ugd2hldGhlciBvciBub3QgdG8KLSAgICogcHJ1bmUgYSBicmFuY2ggYnkgcmV0dXJuaW5nIGZhbHNlIG9yIHRydWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCAoIFVSSVZpc2l0b3IgdXJpVmlzaXRvciwgVVJJRmlsdGVyIHVyaUZpbHRlciApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIFVSSXMgZm9yIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gICAqIGhpZXJhcmNoaWNhbCwgbm9uLWxlYWYgVVJJLiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsCi0gICAqIHRob3VnaCBpdCBtYXkgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkuCi0gICAqLwotICBwdWJsaWMgVVJJW10gbGlzdCAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBBcyBmb3IgbGlzdCgpLCBleGNlcHQgb25seSBVUklzIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBnaXZlbgotICAgKiBmaWx0ZXIgYXJlIHJldHVybmVkIGluIHRoZSBhcnJheS4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLAotICAgKiB0aG91Z2ggaXQgbWF5IHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5LgotICAgKi8KLSAgcHVibGljIFVSSVtdIGxpc3QgKCBVUklGaWx0ZXIgdXJpRmlsdGVyICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBhc1VSTCgpIG1ldGhvZCBpcyBmYWlyIGdhbWUsCi0gICAqIGluIG90aGVyIHdvcmRzLCBpZiB0aGlzIFVSSSBjYW4gYmUgY29udmVydGVkIGludG8gYSBVUkwuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzVVJMICgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgVVJMIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSByZXByZXNlbnRhYmxlIGFzIFVSTHMuCi0gICAqLwotICBwdWJsaWMgVVJMIGFzVVJMICgpIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXNGaWxlKCkgbWV0aG9kIGlzIGZhaXIgZ2FtZSwKLSAgICogaW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgVVJJIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIEZpbGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIEZpbGUgb2JqZWN0IGZvciB0aGUgcmVzb3VyY2UgdW5kZXIgdGhpcyBVUkkuCi0gICAqIFRoZXJlIGFyZSBtYW55IFVSSXMgYW5kIFVSSVNjaGVtZXMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kCi0gICAqIHdpbGwgZmFpbCBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5Ci0gICAqIGluIGNhc2VzIHdoZXJlIFVSSXMgYXJlIGtub3duIHRvIGJlIGJhY2tlZCBieSBwaHlzaWNhbCBmaWxlcy4KLSAgICovCi0gIHB1YmxpYyBGaWxlIGFzRmlsZSAoKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgYXMgYSBzdHJpbmcuCi0gICAqIEVxdWl2YWxlbnQgdG8gdG9TdHJpbmcoKS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgYXNTdHJpbmcgKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMzlmMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvdXJpL1VSSUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG1vc3QgZXhjZXB0aW9ucyB0aHJvd24gYnkgVVJJIGNsYXNzZXMuCi0gKiBFdmVyeSBVUklFeGNlcHRpb24gY2FycmllcyBhIFVSSSBhbmQgYSBTdGF0dXMsIGVhY2ggb2Ygd2hpY2ggbWF5Ci0gKiBiZSBudWxsLiBUaGUgZ2V0TWVzc2FnZSgpIG1ldGhvZCBhcyBpbmhlcml0ZWQgZnJvbSBFeGNlcHRpb24gd2lsbAotICogcmV0dXJuIHRoZSBtZXNzYWdlIGZyb20gdGhlIFVSSUV4Y2VwdGluJ3MgU3RhdHVzIG9iamVjdCwgaWYgYW55LgotICovCi1wdWJsaWMgY2xhc3MgVVJJRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODEzMDI3MTQyNDc1NjAxOEw7Ci0KLSAgLyoqCi0gICAqIEEgU3RhdHVzIG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGV4Y2VwdGlvbiwKLSAgICogaWYgYXBwbGljYWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdGF0dXMgc3RhdHVzOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIGZvciB3aGljaCB0aGUgZXhjZXB0aW9uIG9jY3VyZWQsCi0gICAqIGlmIGFwcGxpY2FibGUuCi0gICAqLwotICBwcm90ZWN0ZWQgVVJJIHVyaTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBVUklFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gU3RhdHVzLgotICAgKiBUaGUgc3RhdHVzIG1heSBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFVSSUV4Y2VwdGlvbiAoIFN0YXR1cyBzdGF0dXMgKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFVSSUV4Y2VwdGlvbiBmb3IgdGhlIGdpdmVuIFN0YXR1cyBhbmQgVVJJLAotICAgKiBlYWNoIG9mIHdoaWNoIG1heSBiZSBudWxsLgotICAgKi8KLSAgcHVibGljIFVSSUV4Y2VwdGlvbiAoIFN0YXR1cyBzdGF0dXMsIFVSSSB1cmkgKQotICB7Ci0gICAgc3VwZXIoc3RhdHVzICE9IG51bGwgPyBzdGF0dXMuZ2V0TWVzc2FnZSgpIDogbnVsbCk7Ci0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgdGhpcy51cmkgPSB1cmk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgU3RhdHVzIG9iamVjdCBpbnNpZGUgdGhpcyBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cyAoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgaW5zaWRlIHRoaXMgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFVSSSBnZXRVUkkgKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9VUklGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzgxNWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9VUklGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGlzIGlzIGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IFVSSSBhbmQgVVJJU2NoZW1lIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJRmFjdG9yeQotewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBVUkkgZm9yIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSSAoIFN0cmluZyB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFVSSSBmb3IgdGhlIGdpdmVuIFVSTC4KLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJICggVVJMIHVybCApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgVVJJU2NoZW1lIGZvciB0aGUgZ2l2ZW4gc2NoZW1lIHN0cmluZy4KLSAgICogSWYgdGhlIHN0cmluZyBjb250YWlucyBubyBjb2xvbnMsIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGludGVycHJldHRlZAotICAgKiBhcyB0aGUgbmFtZSBvZiB0aGUgc2NoZW1lLiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIGEgY29sb24sIHRoZW4gdGhlCi0gICAqIHN1YnN0cmluZyB1cCB0byBidXQgZXhjbHVkaW5nIHRoZSBmaXJzdCBjb2xvbiBpcyBpbnRlcnByZXR0ZWQgYXMgdGhlCi0gICAqIG5hbWUgb2YgdGhlIHNjaGVtZSwgbWVhbmluZyB0aGUgY2FsbGVyIGNhbiBwYXNzIGluIGFueSBVUkkgc3RyaW5nIGluCi0gICAqIG9yZGVyIHRvIGdldCBhIFVSSVNjaGVtZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgVVJJU2NoZW1lIG5ld1VSSVNjaGVtZSAoIFN0cmluZyBzY2hlbWVPclVSSSApIHRocm93cyBVUklFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZTExMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvdXJpL1VSSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IHZpc2l0IG9yIGxpc3QgVVJJcy4KLSAqIFJlZmVyIHRvIHtAbGluayBVUkkjZ2V0Q2hpbGRyZW59LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSSUZpbHRlcgotewotICAvKioKLSAgICogRmlsdGVycyB0aGUgZ2l2ZW4gVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSB0byBmaWx0ZXIuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVzb3VyY2UgbWF0Y2hlcyB0aGUgZmlsdGVyLAotICAgKiBmYWxzZSBpZiBpdCBkb2VzIG5vdC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gSWYgdGhlIGZpbHRlciBmYWlscyB0byBhbmFseXplIHRoZSByZXNvdXJjZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFjY2VwdHMgKCBVUkkgdXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9VUklTY2hlbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9VUklTY2hlbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxMTM1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotICogQSBVUklTY2hlbWUgcmVwcmVzZW50cyBhIHNpbmdsZSBzY2hlbWUgZm9yIHNvbWUgYSBmYW1pbHkgb2YKLSAqIFVuaXZlcmFsIFJlc291cmNlIElkZW50aWZpZXJzLiBFeGFtcGxlcyBpbmNsdWRlICJmaWxlIiwgImh0dHAiCi0gKiBhbmQgInBsYXRmb3JtIiAoRWNsaXBzZSkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVVJJU2NoZW1lCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFVSSS4KLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJICggU3RyaW5nIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgVVJJLgotICAgKi8KLSAgcHVibGljIFVSSSBuZXdVUkkgKCBVUkwgdXJsICkgdGhyb3dzIFVSSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBVUkkuCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSSAoIFVSSSB1cmkgKSB0aHJvd3MgVVJJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwcm9wZXIgbmFtZSBvZiB0aGUgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgaXMgYSBoaWVyYXJjaGljYWwgc2NoZW1lLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNIaWVyYXJjaGljYWwgKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZ2l2ZW4gVVJJIHNhdGlzZmllcyB0aGUKLSAgICogZ3JhbW1hdGljYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBzY2hlbWUuIEFic29sdXRlIFVSSXMgbXVzdAotICAgKiBiZWdpbiB3aXRoICI8c2NoZW1lPjoiLiBSZWxhdGl2ZSBVUklzIG11c3QgZWl0aGVyIG5vdCBjb250YWluCi0gICAqIGEgY29sb24sICI6Iiwgb3IgaXQgbXVzdCBiZWdpbiB3aXRoICIuLyIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkICggVVJJIHVyaSApOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgU3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbgotICAgKiBVUkkgaXMgdmFsaWQuIFRoZSBzZXZlcml0eSBhbmQgbWVzc2FnZSBvZiB0aGUgU3RhdHVzIG9iamVjdAotICAgKiB3aWxsIGRlc2NyaWJlIHRoaXMuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlICggVVJJIHVyaSApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L2NvcmUvdXJpL1VSSVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllN2VmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgc2V2ZXJhbCBzdGF0aWMgdXRpbGl0eSBtZXRob2RzIGZvcgotICogd29ya2luZyB3aXRoIFVSSXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklVdGlscwotewotICAvKioKLSAgICogQ29waWVzIGFsbCBieXRlcyBmcm9tIHRoZSBvbGQgVVJJIHRvIHRoZSBuZXcgVVJJLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHkgKCBVUkkgb2xkVXJpLCBVUkkgbmV3VXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKioKLSAgICogTW92ZXMgb25lIFVSSSB0byBhbm90aGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1vdmUgKCBVUkkgb2xkVXJpLCBVUkkgbmV3VXJpICkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldywgdGVtcG9yYXJ5IGxlYWYgVVJJLgotICAgKiBUaGUgc2NoZW1lIG9mIHRoZSBVUkkgbWF5IGJlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUsICJmaWxlOiIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBnZXRUZW1wb3JhcnlMZWFmVVJJICgpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcsIHRlbXBvcmFyeSBmb2xkZXIgVVJJLgotICAgKiBUaGUgc2NoZW1lIG9mIHRoZSBVUkkgbWF5IGJlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUsICJmaWxlOiIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFVSSSBnZXRUZW1wb3JhcnlGb2xkZXJVUkkgKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9VUklWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvY29yZS91cmkvVVJJVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzAxNjI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi9jb3JlL3VyaS9VUklWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBjbGFzc2VzIHRoYXQgdmlzaXQgVVJJcy4KLSAqIFJlZmVyIHRvIHtAbGluayBVUkkjdmlzaXR9LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVSSVZpc2l0b3IKLXsKLSAgLyoqCi0gICAqIFZpc2l0cyB0aGUgZ2l2ZW4gVVJJLgotICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSB0byB2aXNpdC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZXNvdXJjZSdzIGRlc2NlbmRhbnRzIHNob3VsZCBiZSB2aXNpdGVkLAotICAgKiBvciBmYWxzZSBpZiB0aGV5IHNob3VsZCBub3QgYmUgdmlzaXRlZC4KLSAgICogQHRocm93cyBVUklFeGNlcHRpb24gSWYgdGhlIHZpc2l0IG1ldGhvZCBmYWlscy4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHZpc2l0ICggVVJJIHVyaSApIHRocm93cyBVUklFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MmNhYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1lbnZ1aS5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjBiMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyNjg5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogZW52dWkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucGx1Z2luLkVudlVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZywKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucGx1Z2luLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkucmVnaXN0cnksCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LnVpLndpZGdldHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLm9zZ2kKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0YzI0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBlbnZ1aS5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSAuY2xhc3NwYXRoLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBlbnZ1aS5qYXIKLXNvdXJjZS5lbnZ1aS5qYXIgPSBzcmMvCi1vdXRwdXQuZW52dWkuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDNmNDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLQotcHVibGljIGludGVyZmFjZSBJTmFtZWRXaWRnZXRDb250cmlidXRvciAKLXsKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIFdpZGdldENvbnRyaWJ1dG9yIGZvciB0aGlzIE5hbWVkIHdpZGdldC4KLSAgICovCi0gIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBnZXRXaWRnZXRDb250cmlidXRvcigpOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIGRlc2NyaXB0aW9uIHRoYXQgbWlnaHQgYmUgZGlzcGxheWVkIG9uCi0gICAqIGEgd2l6YXJkIHBhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uICgpOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGl0bGUgdGhhdCBtYXkgYmUgZGlzcGxheWVkIG9uIAotICAgKiBhIHdpemFyZCBwYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpOwotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgZXh0ZW5pb25zIHRvIHJlZ2lzdGVyIHRoZSBkYXRhIG1hcHBpbmdzCi0gICAqIHRoYXQgdGhlaXIgd2lkZ2V0cyB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gZGF0YVJlZ2lzdHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyggRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkgKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC91aS93aWRnZXRzL0lOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWYxNDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LnVpLndpZGdldHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IAotewotICBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCk7Ci0gIAotICBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzE1MDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBpbiBwbHVnaW4ueG1sLgotIwotUExVR0lOX05BTUU9RW52aXJvbm1lbnQgQ29tbWFuZCBGcmFtZXdvcmsgKEdVSSkKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1XSURHRVRfUkVHSVNUUllfTkFNRT1XaWRnZXQgY29udHJpYnV0b3IgcmVnaXN0cnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGVlMGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbi1wb2ludCBpZD0id2lkZ2V0UmVnaXN0cnkiIG5hbWU9IiVXSURHRVRfUkVHSVNUUllfTkFNRSIgc2NoZW1hPSJzY2hlbWEvd2lkZ2V0UmVnaXN0cnkuZXhzZCIvPiAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zY2hlbWEvd2lkZ2V0UmVnaXN0cnkuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NjaGVtYS93aWRnZXRSZWdpc3RyeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjU5Y2ExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NjaGVtYS93aWRnZXRSZWdpc3RyeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpIiBpZD0id2lkZ2V0UmVnaXN0cnkiIG5hbWU9IndpZGdldFJlZ2lzdHJ5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpZGdldEZhY3RvcnkiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aWRnZXRGYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0QmVmb3JlQ29tbWFuZElkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS9lbnZpcm9ubWVudHVpLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL2Vudmlyb25tZW50dWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxZjQwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvZW52L3VpL2Vudmlyb25tZW50dWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUJVVFRPTl9TSE9XX0FMTF9ESUFMT0dTPVNob3cgQWxsCi1CVVRUT05fSElERV9BTExfRElBTE9HUz1IaWRlIEFsbAotQ0hFQ0tCT1hfRE9fTk9UX1NIT1dfRElBTE9HX0FHQUlOPURvIG5vdCBzaG93IG1lIHRoaXMgZGlhbG9nIGJveCBhZ2Fpbi4KLQotVE9PTFRJUF9QUEFEX1BBR0U9Q29udHJvbCB0byBzaG93L2hpZGUgdGhlIGRpYWxvZ3MgdGhhdCBhcHBlYXIgd2hlbiBhIHBvcC11cCBhY3Rpb24gaXMgZXhlY3V0ZWQuCi1UT09MVElQX0RPX05PVF9TSE9XX0RJQUxPR19BR0FJTj1UbyBhbGxvdyB0aGlzIGRpYWxvZyB0byBzaG93IGFnYWluLCBlbmFibGUgZnJvbSBwcmVmZXJlbmNlIC0gZGlhbG9ncy4KLVRPT0xUSVBfUFBBRF9CVVRUT05fU0hPV19BTEw9U2hvdyBhbGwgZGlhbG9ncy4KLVRPT0xUSVBfUFBBRF9CVVRUT05fSElERV9BTEw9SGlkZSBhbGwgZGlhbG9ncyBhbmQgZXhlY3V0ZSBwb3AtdXAgYWN0aW9ucy4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9lbnYvdWkvd2lkZ2V0cy9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL2Vudmlyb25tZW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOThlMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2Vudi91aS93aWRnZXRzL2Vudmlyb25tZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1NU0dfRVJST1JfV0laQVJEX0lEX05PVF9GT1VORD1JV0FCMDAxM0UgQ291bGQgbm90IGZpbmQgd2l6YXJkIGlkOiB7MH0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvRXJyb3JEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0Vycm9yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjE3YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvRXJyb3JEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLS8qKgotICogQSBkaWFsb2cgdG8gZGlzcGxheSBvbmUgb3IgbW9yZSBlcnJvcnMgdG8gdGhlIHVzZXIsIGFzIGNvbnRhaW5lZCBpbiBhbgotICogPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QuIElmIGFuIGVycm9yIGNvbnRhaW5zIGFkZGl0aW9uYWwgZGV0YWlsZWQKLSAqIGluZm9ybWF0aW9uIHRoZW4gYSBEZXRhaWxzIGJ1dHRvbiBpcyBhdXRvbWF0aWNhbGx5IHN1cHBsaWVkLCB3aGljaCBzaG93cyBvcgotICogaGlkZXMgYW4gZXJyb3IgZGV0YWlscyB2aWV3ZXIgd2hlbiBwcmVzc2VkIGJ5IHRoZSB1c2VyLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIEVycm9yRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBPSyBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSB8fCBzdGF0dXMuZ2V0VGhyb3dhYmxlKCkgIT0gbnVsbCApCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXREaWFsb2dJbWFnZSgpCi0gIHsKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fRVJST1IpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0luZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL0luZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjMjk3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9JbmZvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEluZm9EaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotICAgKiByZXByZXNlbnRhdGlvbiAobm8gd2lkZ2V0cykgdW50aWwgaXQgaXMgdG9sZCB0byBvcGVuLgotICAgKiA8cD4KLSAgICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lIG9mCi0gICAqIHRoZXNlLiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWZ1bCBvbmx5IGlmIHRoZSBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkCi0gICAqIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQ8L2l0PiB5b3UgbmVlZCB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsCi0gICAqIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlIGNoaWxkcmVuLgotICAgKiA8L3A+Ci0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0gICAqIEBwYXJhbSBkaWFsb2dUaXRsZQotICAgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UKLSAgICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotICAgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0gICAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotICAgKiBAcGFyYW0gZGlzcGxheU1hc2sKLSAgICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcyBwZXIKLSAgICogICAgICAgICAgICA8Y29kZT5TdGF0dXMubWF0Y2hlczwvY29kZT4KLSAgICovCi0gIHB1YmxpYyBJbmZvRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIFRoaXMgc2hvdWxkIGFsc28gYmUgb3ZlcndyaXR0ZW4gTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBPSyBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvTWVzc2FnZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvTWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNjYjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL01lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5DaG9pY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIEEgZGlhbG9nIHRvIGRpc3BsYXkgb25lIG9yIG1vcmUgZXJyb3JzIHRvIHRoZSB1c2VyLCBhcyBjb250YWluZWQgaW4gYW4KLSAqIDxjb2RlPlN0YXR1czwvY29kZT4gb2JqZWN0LiBJZiBhbiBlcnJvciBjb250YWlucyBhZGRpdGlvbmFsIGRldGFpbGVkCi0gKiBpbmZvcm1hdGlvbiB0aGVuIGEgRGV0YWlscyBidXR0b24gaXMgYXV0b21hdGljYWxseSBzdXBwbGllZCwgd2hpY2ggc2hvd3Mgb3IKLSAqIGhpZGVzIGFuIGVycm9yIGRldGFpbHMgdmlld2VyIHdoZW4gcHJlc3NlZCBieSB0aGUgdXNlci4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLSAgLyoqCi0gICAqIFJlc2VydmUgcm9vbSBmb3IgdGhpcyBtYW55IGxpc3QgaXRlbXMuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBMSVNUX0lURU1fQ09VTlQgPSA3OwotCi0gIC8qKgotICAgKiBUaGUgRGV0YWlscyBidXR0b24uCi0gICAqLwotICBwcm90ZWN0ZWQgQnV0dG9uIGRldGFpbHNCdXR0b247Ci0KLSAgLyoqCi0gICAqIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotICAvKioKLSAgICogVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLQotICAvKioKLSAgICogVGhlIFNXVCBsaXN0IGNvbnRyb2wgdGhhdCBkaXNwbGF5cyB0aGUgZXJyb3IgZGV0YWlscy4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0gIHByb3RlY3RlZCBUZXh0IGRldGFpbHM7Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlcnJvciBkZXRhaWxzIHZpZXdlciBpcyBjdXJyZW50bHkgY3JlYXRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGxpc3RDcmVhdGVkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIGRldGFpbHNDcmVhdGVkID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIEZpbHRlciBtYXNrIGZvciBkZXRlcm1pbmluZyB3aGljaCBzdGF0dXMgaXRlbXMgdG8gZGlzcGxheS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgZGlzcGxheU1hc2sgPSAweEZGRkY7Ci0KLSAgLyoqCi0gICAqIFRoZSBtYWluIHN0YXR1cyBvYmplY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RhdHVzIHN0YXR1czsKLSAgCi0gIHByaXZhdGUgUG9pbnQgc2F2ZWRTaXplID0gbnVsbDsKLQotICAvKioKLSAgICogTGlzdCBvZiB0aGUgbWFpbiBlcnJvciBvYmplY3QncyBkZXRhaWxlZCBlcnJvcnMgKGVsZW1lbnQgdHlwZTogPGNvZGU+U3RhdHVzPC9jb2RlPikuCi0gICAqLwotICBwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3Qgc3RhdHVzTGlzdDsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gZXJyb3IgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIGRpYWxvZyB3aWxsIGhhdmUgbm8gdmlzdWFsCi0gICAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0gICAqIDxwPgotICAgKiBOb3JtYWxseSBvbmUgc2hvdWxkIHVzZSA8Y29kZT5vcGVuRXJyb3I8L2NvZGU+IHRvIGNyZWF0ZSBhbmQgb3BlbiBvbmUgb2YKLSAgICogdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQKLSAgICogY29udGFpbnMgY2hpbGQgaXRlbXMgPGl0PmFuZDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrIHdoaWNoIHdpbGwKLSAgICogYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UgY2hpbGRyZW4uCi0gICAqIDwvcD4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRTaGVsbAotICAgKiAgICAgICAgICAgIHRoZSBzaGVsbCB1bmRlciB3aGljaCB0byBjcmVhdGUgdGhpcyBkaWFsb2cKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VEaWFsb2coCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIGRpYWxvZ1RpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIFN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwpOwotICAgICAgdGhpcy50aXRsZSA9IGRpYWxvZ1RpdGxlID09IG51bGwgPyBKRmFjZVJlc291cmNlcy5nZXRTdHJpbmcoIlByb2JsZW1fT2NjdXJyZWQiKSA6IC8vJE5PTi1OTFMtMSQKLSAgZGlhbG9nVGl0bGU7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSA9PSBudWxsID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6IEpGYWNlUmVzb3VyY2VzLmZvcm1hdCgiUmVhc29uIiwgbmV3IE9iamVjdFtdIHsgbWVzc2FnZSwgc3RhdHVzLmdldE1lc3NhZ2UoKX0pOyAvLyROT04tTkxTLTEkCi0gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgc3RhdHVzTGlzdCA9IEFycmF5cy5hc0xpc3Qoc3RhdHVzLmdldENoaWxkcmVuKCkpOwotICAgIHRoaXMuZGlzcGxheU1hc2sgPSBkaXNwbGF5TWFzazsKLSAgICBzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5SRVNJWkUgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4gSGFuZGxlcyB0aGUgcHJlc3Npbmcgb2YgdGhlIE9rIG9yCi0gICAqIERldGFpbHMgYnV0dG9uIGluIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UKLSAgICogdGhpcyBkaWFsb2cuIElmIHRoZSBEZXRhaWxzIGJ1dHRvbiB3YXMgcHJlc3NlZCB0aGVuIHRvZ2dsZSB0aGUgZGlzcGxheWluZwotICAgKiBvZiB0aGUgZXJyb3IgZGV0YWlscyBhcmVhLiBOb3RlIHRoYXQgdGhlIERldGFpbHMgYnV0dG9uIHdpbGwgb25seSBiZQotICAgKiB2aXNpYmxlIGlmIHRoZSBlcnJvciBiZWluZyBkaXNwbGF5ZWQgc3BlY2lmaWVzIGNoaWxkIGRldGFpbHMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkKLSAgewotICAgIGlmIChpZCA9PSBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkKLSAgICB7IC8vIHdhcyB0aGUgZGV0YWlscyBidXR0b24gcHJlc3NlZD8KLSAgICAgIHRvZ2dsZURldGFpbHNBcmVhKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLSAgICB9Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0gIH0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0sgYW5kIERldGFpbHMgYnV0dG9ucwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5PS19JRCwKLSAgICAgIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICB0cnVlKTsKLSAgICBpZiAoc3RhdHVzLmhhc0NoaWxkcmVuKCkgfHwgc3RhdHVzLmdldFRocm93YWJsZSgpICE9IG51bGwgKQotICAgIHsKLSAgICAgIGRldGFpbHNCdXR0b24gPQotICAgICAgICBjcmVhdGVCdXR0b24oCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLAotICAgICAgICAgIGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcGFyZW50LnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkpOwotICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzCi0gICAqIG9mIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBkaWFsb2cgKGFib3ZlIHRoZSBidXR0b24gYmFyKS4KLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotCi0gICAgLy8gY3JlYXRlIGNvbXBvc2l0ZQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgQ29tcG9zaXRlIGltYWdlQW5kTGFiZWwgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdsLm51bUNvbHVtbnMgPSAyOwotICAgIGltYWdlQW5kTGFiZWwuc2V0TGF5b3V0KGdsKTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSk7Ci0gICAgCi0gICAgLy8gY3JlYXRlIGltYWdlCi0gICAgSW1hZ2UgaW1hZ2UgPSBnZXREaWFsb2dJbWFnZSgpOwotICAgIGlmIChpbWFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGltYWdlQW5kTGFiZWwsIDApOwotICAgICAgaW1hZ2Uuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YSgKLSAgICAgICAgbmV3IEdyaWREYXRhKAotICAgICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSCi0gICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSBtZXNzYWdlCi0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChpbWFnZUFuZExhYmVsLCBTV1QuUkVBRF9PTkxZfFNXVC5XUkFQKTsKLSAgICAgIHRleHQuc2V0VGV4dChtZXNzYWdlKTsKLSAgICAgIEdyaWREYXRhIGRhdGEgPQotICAgICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgICAgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwKLSAgICAgICAgICAgIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0gICAgICBkYXRhLndpZHRoSGludCA9Ci0gICAgICAgIGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKAotICAgICAgICAgIElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEgpOwotICAgICAKLSAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgIHRleHQuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgY3JlYXRlRHJvcERvd25MaXN0KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgdGhlIGxpc3QKLSAgICBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQotICAgIC8vIGZpbGwgdGhlIGxpc3QKLSAgICBwb3B1bGF0ZUxpc3QobGlzdCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0KLSAgICAgIG5ldyBHcmlkRGF0YSgKLSAgICAgICAgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLSAgICAgICAgICB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLSAgICAgICAgICB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotICAgIGRhdGEuaGVpZ2h0SGludCA9IGxpc3QuZ2V0SXRlbUhlaWdodCgpICogTElTVF9JVEVNX0NPVU5UOwotICAgIGxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBsaXN0Q3JlYXRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgcHJvdGVjdGVkIFRleHQgY3JlYXRlRHJvcERvd25EZXRhaWxzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBkZXRhaWxzID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0gICAgLy9kZXRhaWxzLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICBDb2xvciBjb2xvciA9IG5ldyBDb2xvcihwYXJlbnQuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIDI1NSwgMjU1LCAyNTUpOwotICAgIGRldGFpbHMuc2V0QmFja2dyb3VuZChjb2xvcik7Ci0gICAgcG9wdWxhdGVEZXRhaWxzKGRldGFpbHMsIHN0YXR1cywgMCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9Ci0gICAgICBuZXcgR3JpZERhdGEoCi0gICAgICAgIEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotICAgICAgICAgIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0gICAgICAgICAgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMCi0gICAgICAgICAgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLSAgICBkZXRhaWxzLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZGV0YWlscy5zZXRTZWxlY3Rpb24oMCk7Ci0gICAgZGV0YWlsc0NyZWF0ZWQgPSB0cnVlOwotICAgIHJldHVybiBkZXRhaWxzOwotICB9Ci0gIC8qCi0gICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLSAgICovCi0gIC8qKgotICAgKiBFeHRlbmRzIDxjb2RlPldpbmRvdy5vcGVuKCk8L2NvZGU+LiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheQotICAgKiB0aGUgZXJyb3IuIElmIHlvdSBzcGVjaWZpZWQgYSBtYXNrIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZQotICAgKiBjaGlsZHJlbiwgdGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotICAgKiBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0gICAqLwotICBwdWJsaWMgaW50IG9wZW4oKQotICB7Ci0gICAgaWYgKHNob3VsZERpc3BsYXkoc3RhdHVzLCBkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLm9wZW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLyoqCi0gICAqIFRoaXMgZXNzZW50aWFsbHkgZG9lcyB0aGUgd29yayBvZiBhIGZhY3RvcnkgT3BlbnMgYW4gZXJyb3IgZGlhbG9nIHRvCi0gICAqIGRpc3BsYXkgdGhlIGdpdmVuIGVycm9yLiBVc2UgdGhpcyBtZXRob2QgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZwotICAgKiBkaXNwbGF5ZWQgZG9lcyBub3QgY29udGFpbiBjaGlsZCBpdGVtcywgb3IgaWYgeW91IHdpc2ggdG8gZGlzcGxheSBhbGwgc3VjaAotICAgKiBpdGVtcyB3aXRob3V0IGZpbHRlcmluZy4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEByZXR1cm4gdGhlIGNvZGUgb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcwotICAgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLSAgICogICAgICAgICBidXR0b24gd2FzIHByZXNzZWQsIG9yIDxjb2RlPkRpYWxvZy5DQU5DRUw8L2NvZGU+IGlmIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cncyBjbG9zZSB3aW5kb3cgZGVjb3JhdGlvbiBvciB0aGUgRVNDIGtleSB3YXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5NZXNzYWdlKAotICAgIFNoZWxsIHBhcmVudCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgU3RhdHVzIHN0YXR1cykKLSAgewotCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICBjYXNlIFN0YXR1cy5JTkZPIDoKLSAgICAgICAgcmV0dXJuIG9wZW5JbmZvKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBkaWFsb2dUaXRsZSwKLSAgICAgICAgICBtZXNzYWdlLAotICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICBTdGF0dXMuT0sgfCBTdGF0dXMuSU5GTyB8IFN0YXR1cy5XQVJOSU5HIHwgU3RhdHVzLkVSUk9SKTsKLSAgICAgIGNhc2UgU3RhdHVzLldBUk5JTkcgOgotICAgICAgICByZXR1cm4gb3Blbldhcm5pbmcoCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIFN0YXR1cy5PSyB8IFN0YXR1cy5JTkZPIHwgU3RhdHVzLldBUk5JTkcgfCBTdGF0dXMuRVJST1IpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHJldHVybiBvcGVuRXJyb3IoCi0gICAgICAgICAgcGFyZW50LAotICAgICAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgICAgIG1lc3NhZ2UsCi0gICAgICAgICAgc3RhdHVzLAotICAgICAgICAgIFN0YXR1cy5PSyB8IFN0YXR1cy5JTkZPIHwgU3RhdHVzLldBUk5JTkcgfCBTdGF0dXMuRVJST1IpOwotICAgIH0KLQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3Blbk1lc3NhZ2UoCi0gICAgU2hlbGwgcGFyZW50LAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBTdGF0dXMgc3RhdHVzLAotICAgIENob2ljZVtdIG9wdGlvbnMpCi0gIHsKLQotICAgIHJldHVybiBvcGVuT3B0aW9ucygKLSAgICAgIHBhcmVudCwKLSAgICAgIGRpYWxvZ1RpdGxlLAotICAgICAgbWVzc2FnZSwKLSAgICAgIHN0YXR1cywKLSAgICAgIFN0YXR1cy5PSyB8IFN0YXR1cy5JTkZPIHwgU3RhdHVzLldBUk5JTkcgfCBTdGF0dXMuRVJST1IsCi0gICAgICBvcHRpb25zKTsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUKLSAgICogZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZCBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IHdpc2gKLSAgICogdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZQotICAgKiBjaGlsZHJlbi4gVGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQotICAgKiBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50U2hlbGwKLSAgICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLSAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0gICAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLSAgICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLSAgICogQHBhcmFtIHN0YXR1cwotICAgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0gICAqIEBwYXJhbSBkaXNwbGF5TWFzawotICAgKiAgICAgICAgICAgIHRoZSBtYXNrIHRvIHVzZSB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgY2hpbGQgaXRlbXMsIGFzIHBlcgotICAgKiAgICAgICAgICAgIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLSAgICogICAgICAgICBkaWFsb2cgY2xvc2luZy4gVGhpcyB3aWxsIGJlIDxjb2RlPkRpYWxvZy5PSzwvY29kZT4gaWYgdGhlIE9LCi0gICAqICAgICAgICAgYnV0dG9uIHdhcyBwcmVzc2VkLCBvciA8Y29kZT5EaWFsb2cuQ0FOQ0VMPC9jb2RlPiBpZiB0aGlzCi0gICAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBvcGVuRXJyb3IoCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIFN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgRXJyb3JEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBFcnJvckRpYWxvZyhwYXJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICAgIHJldHVybiBkaWFsb2cub3BlbigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBpbnQgb3BlbkluZm8oCi0gICAgU2hlbGwgcGFyZW50U2hlbGwsCi0gICAgU3RyaW5nIHRpdGxlLAotICAgIFN0cmluZyBtZXNzYWdlLAotICAgIFN0YXR1cyBzdGF0dXMsCi0gICAgaW50IGRpc3BsYXlNYXNrKQotICB7Ci0gICAgSW5mb0RpYWxvZyBkaWFsb2cgPQotICAgICAgbmV3IEluZm9EaWFsb2cocGFyZW50U2hlbGwsIHRpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICByZXR1cm4gZGlhbG9nLm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IG9wZW5XYXJuaW5nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyB0aXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaykKLSAgewotICAgIFdhcm5pbmdEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBXYXJuaW5nRGlhbG9nKHBhcmVudFNoZWxsLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBkaXNwbGF5TWFzayk7Ci0gICAgcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGludCBvcGVuT3B0aW9ucygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgdGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2ssCi0gICAgQ2hvaWNlW10gb3B0aW9ucykKLSAgewotICAgIE9wdGlvbnNEaWFsb2cgZGlhbG9nID0KLSAgICAgIG5ldyBPcHRpb25zRGlhbG9nKAotICAgICAgICBwYXJlbnRTaGVsbCwKLSAgICAgICAgdGl0bGUsCi0gICAgICAgIG1lc3NhZ2UsCi0gICAgICAgIHN0YXR1cywKLSAgICAgICAgZGlzcGxheU1hc2ssCi0gICAgICAgIG9wdGlvbnMpOwotICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgcmV0dXJuIGRpYWxvZy5nZXRSZXR1cm5Db2RlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUG9wdWxhdGVzIHRoZSBsaXN0IHVzaW5nIHRoaXMgZXJyb3IgZGlhbG9nJ3Mgc3RhdHVzIG9iamVjdC4gVGhpcyB3YWxrcyB0aGUKLSAgICogY2hpbGQgc3RhdGkgb2YgdGhlIHN0YXR1cyBvYmplY3QgYW5kIGRpc3BsYXlzIHRoZW0gaW4gYSBsaXN0LiBUaGUgZm9ybWF0Ci0gICAqIGZvciBlYWNoIGVudHJ5IGlzIHN0YXR1c19wYXRoIDogc3RhdHVzX21lc3NhZ2UgSWYgdGhlIHN0YXR1cydzIHBhdGggd2FzCi0gICAqIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3QgbGlzdCkKLSAgewotICAgIEl0ZXJhdG9yIGVudW1lcmF0aW9uID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RhdHVzIGNoaWxkU3RhdHVzID0gKFN0YXR1cykgZW51bWVyYXRpb24ubmV4dCgpOwotICAgICAgcG9wdWxhdGVMaXN0KGxpc3QsIGNoaWxkU3RhdHVzLCAwKTsKLSAgICB9Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0IGxpc3QsIFN0YXR1cyBzdGF0dXMsIGludCBuZXN0aW5nKQotICB7Ci0gICAgaWYgKCFzdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspCi0gICAgewotICAgICAgc2IuYXBwZW5kKCIgICIpOwotICAgIH0KLSAgICBzYi5hcHBlbmQoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0gICAgbGlzdC5hZGQoc2IudG9TdHJpbmcoKSk7Ci0gICAgU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHBvcHVsYXRlTGlzdChsaXN0LCBjaGlsZHJlbltpXSwgbmVzdGluZyArIDEpOwotICAgIH0KLSAgfQotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEZXRhaWxzKFRleHQgdGV4dCwgU3RhdHVzIHN0YXR1cywgaW50IG5lc3RpbmcpCi0gIHsKLSAgICBpZiAoIXN0YXR1cy5tYXRjaGVzKGRpc3BsYXlNYXNrKSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICAgICAKLSAgICBTdHJpbmcgICAgdGFiQ2hhcnMgICAgPSBTdHJpbmdVdGlscy5yZXBlYXQoICcgJywgbmVzdGluZyAqIDIgKTsKLSAgICBTdHJpbmcgICAgbWVzc2FnZUxpbmUgPSB0YWJDaGFycyArIHN0YXR1cy5nZXRNZXNzYWdlKCkgKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgVGhyb3dhYmxlIGV4Y2VwdCAgICAgID0gc3RhdHVzLmdldFRocm93YWJsZSgpOwotICAgIAotICAgIHRleHQuYXBwZW5kKCBtZXNzYWdlTGluZSApOwotICAgIAotICAgIGlmKCBleGNlcHQgIT0gbnVsbCApCi0gICAgewotICAgICAgU3RyaW5nW10gdHJhY2UgPSBTdHJpbmdVdGlscy5nZXRTdGFja1RyYWNlKCBleGNlcHQgKTsKLSAgICAgIAotICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNlLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICB7Ci0gICAgICAgIHRleHQuYXBwZW5kKCB0YWJDaGFycyArICIgICAgIiArIHRyYWNlW2luZGV4XSArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSApOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcG9wdWxhdGVEZXRhaWxzKHRleHQsIGNoaWxkcmVuW2ldLCBuZXN0aW5nICsgMSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHN0YXR1cyBvYmplY3Qgc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogCi0gICAqIEBwYXJhbSBzdGF0dXMKLSAgICogICAgICAgICAgICBhIHN0YXR1cyBvYmplY3QKLSAgICogQHBhcmFtIG1hc2sKLSAgICogICAgICAgICAgICBhIG1hc2sgYXMgcGVyIDxjb2RlPlN0YXR1cy5tYXRjaGVzPC9jb2RlPgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdGF0dXMgc2hvdWxkIGJlIGRpc3BsYXllZCwgYW5kCi0gICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNob3VsZERpc3BsYXkoU3RhdHVzIHN0YXR1cywgaW50IG1hc2spCi0gIHsKLSAgICBTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotICAgIGlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBzdGF0dXMubWF0Y2hlcyhtYXNrKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoY2hpbGRyZW5baV0ubWF0Y2hlcyhtYXNrKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKioKLSAgICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyCi0gICAqIHByZXNzaW5nIHRoZSBkZXRhaWxzIGJ1dHRvbi4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0b2dnbGVEZXRhaWxzQXJlYSgpCi0gIHsKLSAgICBQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0gICAgaW50ICAgbmV3SGVpZ2h0ICA9IC0xOwotICAgIAotICAgIGlmIChkZXRhaWxzQ3JlYXRlZCkKLSAgICB7Ci0gICAgICBkZXRhaWxzLmRpc3Bvc2UoKTsKLSAgICAgIGRldGFpbHNDcmVhdGVkID0gZmFsc2U7Ci0gICAgICBkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotICAgICAgCi0gICAgICAvLyBXaXRob3V0IHRoZSBmb2xsb3dpbmcgY29tcHV0ZVNpemUgY2FsbCB0aGUgc2V0U2l6ZSBjYWxsIGJlbG93IHRocm93cyBhbiBhcnJheSBvdXQgb2YgYm91bmRzIGV4Y2VwdGlvbi4KLSAgICAgIC8vIFZlcnkgd2VpcmQuCi0gICAgICBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgICAKLSAgICAgIG5ld0hlaWdodCA9IHNhdmVkU2l6ZS55OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYoIHNhdmVkU2l6ZSA9PSBudWxsICkgc2F2ZWRTaXplID0gd2luZG93U2l6ZTsKLSAgICAgICAgCi0gICAgICBkZXRhaWxzID0gY3JlYXRlRHJvcERvd25EZXRhaWxzKChDb21wb3NpdGUpIGdldENvbnRlbnRzKCkpOwotICAgICAgZGV0YWlsc0J1dHRvbi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLSAgICAgIG5ld0hlaWdodCA9IGdldENvbnRlbnRzKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotICAgIH0KLQotCi0gICAgbmV3SGVpZ2h0ID0gbmV3SGVpZ2h0ID4gNDAwID8gNDAwIDogbmV3SGVpZ2h0OwotICAgIAotICAgIGdldFNoZWxsKCkuc2V0U2l6ZSggbmV3IFBvaW50KHdpbmRvd1NpemUueCwgbmV3SGVpZ2h0KSApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9PcHRpb25zRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9PcHRpb25zRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZjEwNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvT3B0aW9uc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25zRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotICBwcml2YXRlIENob2ljZVtdIGNob2ljZXM7Ci0gIHByaXZhdGUgaW50IHJldHVybkNvZGVfOwotCi0gIHB1YmxpYyBPcHRpb25zRGlhbG9nKAotICAgIFNoZWxsIHBhcmVudFNoZWxsLAotICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBTdGF0dXMgc3RhdHVzLAotICAgIGludCBkaXNwbGF5TWFzaywKLSAgICBDaG9pY2VbXSBjaG9pY2VzKQotICB7Ci0gICAgc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBtZXNzYWdlLCBzdGF0dXMsIGRpc3BsYXlNYXNrKTsKLSAgICB0aGlzLmNob2ljZXMgPSBjaG9pY2VzOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgYSBidXR0b24gZm9yIGVhY2ggb3B0aW9ucwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBjaG9pY2VzW2ldLmdldFNob3J0Y3V0KCksIGNob2ljZXNbaV0uZ2V0TGFiZWwoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChzdGF0dXMuaGFzQ2hpbGRyZW4oKSkKLSAgICB7Ci0gICAgICBkZXRhaWxzQnV0dG9uID0KLSAgICAgICAgY3JlYXRlQnV0dG9uKAotICAgICAgICAgIHBhcmVudCwKLSAgICAgICAgICBTdGF0dXNEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCwKLSAgICAgICAgICBJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpCi0gIHsKLSAgICBpZiAoaWQgPT0gU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpCi0gICAgICAvLyB3YXMgdGhlIERldGFpbHMgYnV0dG9uIHByZXNzZWQ/Ci0gICAgICBzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0UmV0dXJuQ29kZShpZCk7Ci0gICAgICBjbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldFJldHVybkNvZGUoaW50IGlkKQotICB7Ci0gICAgcmV0dXJuQ29kZV8gPSBpZDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0UmV0dXJuQ29kZSgpCi0gIHsKLSAgICByZXR1cm4gcmV0dXJuQ29kZV87Ci0gIH0KLSAgLyoKLSAgICogVGhpcyBpcyBvbmUgb2YgdGhlIGZldyBtZXRob2RzIHRoYXQgbmVlZHMgdG8gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gICAqIHN1YmNsYXNzZXMuIFRoZSBpbWFnZSBuYW1lcyBjYW4gYmUgZm91bmQgaW4gdGhlIERpYWxvZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIEltYWdlIGdldERpYWxvZ0ltYWdlKCkKLSAgewotICAgIC8vIGNyZWF0ZSBpbWFnZQotICAgIHN3aXRjaCAoc3RhdHVzLmdldFNldmVyaXR5KCkpCi0gICAgewotICAgICAgY2FzZSBTdGF0dXMuSU5GTyA6Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9JTkZPUk1BVElPTik7Ci0gICAgICBjYXNlIFN0YXR1cy5XQVJOSU5HIDoKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUltYWdlKFNXVC5JQ09OX1dBUk5JTkcpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9FUlJPUik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL1N0YXR1c0RpYWxvZ0NvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTY3ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9kaWFsb2cvU3RhdHVzRGlhbG9nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2c7Ci0KLS8qKgotKiBDb25zdGFudHMgZm9yIHN0YXR1cyBkaWFsb2dzCi0qLwotcHVibGljIGludGVyZmFjZSBTdGF0dXNEaWFsb2dDb25zdGFudHMgewotCi0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIlllcyIgYnV0dG9uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlFU19JRCA9IDI7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIlllcyB0byBhbGwiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfVE9fQUxMX0lEID0gNDsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiQ2FuY2VsIiBidXR0b24KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMX0lEID0gMTsKLSAgLyoKLSAgKiBCdXR0b24gSUQgZm9yIHRoZSAiT0siIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19JRCA9IDA7Ci0gIC8qCi0gICogQnV0dG9uIElEIGZvciB0aGUgIkRldGFpbHMiIGJ1dHRvbgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBSUxTX0lEID0gMTM7Ci0KLSAgLyoKLSAgKiBCdXR0b24gbGFiZWwgZm9yIHRoZSAiWWVzIiBidXR0b24KLSAgKi8KLSAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfTEFCRUwgPSBFbnZpcm9ubWVudFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1lc3NhZ2UoIiVTVEFUVVNfRElBTE9HX1lFU19MQUJFTCIpOwotICAvKgotICAqIEJ1dHRvbiBsYWJlbCBmb3IgdGhlICJZZXMgdG8gYWxsIiBidXR0b24KLSAgKi8KLSAvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZRVNfVE9fQUxMX0xBQkVMID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19ZRVNfVE9fQUxMX0xBQkVMIik7Ci0gIC8qCi0gICogQnV0dG9uIGxhYmVsIGZvciB0aGUgIkNhbmNlbCIgYnV0dG9uCi0gICovCi0gLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOQ0VMX0xBQkVMID0gRW52aXJvbm1lbnRQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRNZXNzYWdlKCIlU1RBVFVTX0RJQUxPR19DQU5DRUxfTEFCRUwiKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL1dhcm5pbmdEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZGlhbG9nL1dhcm5pbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3ZDY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2RpYWxvZy9XYXJuaW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBBIGRpYWxvZyB0byBkaXNwbGF5IG9uZSBvciBtb3JlIGVycm9ycyB0byB0aGUgdXNlciwgYXMgY29udGFpbmVkIGluIGFuCi0gKiA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdC4gSWYgYW4gZXJyb3IgY29udGFpbnMgYWRkaXRpb25hbCBkZXRhaWxlZAotICogaW5mb3JtYXRpb24gdGhlbiBhIERldGFpbHMgYnV0dG9uIGlzIGF1dG9tYXRpY2FsbHkgc3VwcGxpZWQsIHdoaWNoIHNob3dzIG9yCi0gKiBoaWRlcyBhbiBlcnJvciBkZXRhaWxzIHZpZXdlciB3aGVuIHByZXNzZWQgYnkgdGhlIHVzZXIuCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBXYXJuaW5nRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZwotewotICAvKioKLSAgICogQ3JlYXRlcyBhbiBlcnJvciBkaWFsb2cuIE5vdGUgdGhhdCB0aGUgZGlhbG9nIHdpbGwgaGF2ZSBubyB2aXN1YWwKLSAgICogcmVwcmVzZW50YXRpb24gKG5vIHdpZGdldHMpIHVudGlsIGl0IGlzIHRvbGQgdG8gb3Blbi4KLSAgICogPHA+Ci0gICAqIE5vcm1hbGx5IG9uZSBzaG91bGQgdXNlIDxjb2RlPm9wZW5FcnJvcjwvY29kZT4gdG8gY3JlYXRlIGFuZCBvcGVuIG9uZSBvZgotICAgKiB0aGVzZS4gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VmdWwgb25seSBpZiB0aGUgZXJyb3Igb2JqZWN0IGJlaW5nIGRpc3BsYXllZAotICAgKiBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kPC9pdD4geW91IG5lZWQgdG8gc3BlY2lmeSBhIG1hc2sgd2hpY2ggd2lsbAotICAgKiBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLSAgICogPC9wPgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudFNoZWxsCi0gICAqICAgICAgICAgICAgdGhlIHNoZWxsIHVuZGVyIHdoaWNoIHRvIGNyZWF0ZSB0aGlzIGRpYWxvZwotICAgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLSAgICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLSAgICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotICAgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotICAgKiBAcGFyYW0gc3RhdHVzCi0gICAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLSAgICogQHBhcmFtIGRpc3BsYXlNYXNrCi0gICAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMgcGVyCi0gICAqICAgICAgICAgICAgPGNvZGU+U3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0gICAqLwotICBwdWJsaWMgV2FybmluZ0RpYWxvZygKLSAgICBTaGVsbCBwYXJlbnRTaGVsbCwKLSAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgU3RhdHVzIHN0YXR1cywKLSAgICBpbnQgZGlzcGxheU1hc2spCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKSBUaGlzIHNob3VsZCBhbHNvIGJlIG92ZXJ3cml0dGVuIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgT0ssIENhbmNlbCBhbmQgRGV0YWlscyBidXR0b25zCi0gICAgY3JlYXRlQnV0dG9uKAotICAgICAgcGFyZW50LAotICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotICAgICAgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLSAgICAgIHRydWUpOwotICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgIHBhcmVudCwKLSAgICAgIFN0YXR1c0RpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0gICAgICBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwKLSAgICAgIGZhbHNlKTsKLSAgICBpZiAoc3RhdHVzLmhhc0NoaWxkcmVuKCkpCi0gICAgewotICAgICAgZGV0YWlsc0J1dHRvbiA9Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbigKLSAgICAgICAgICBwYXJlbnQsCi0gICAgICAgICAgU3RhdHVzRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0gICAgICAgICAgSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwsCi0gICAgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIFRoaXMgaXMgb25lIG9mIHRoZSBmZXcgbWV0aG9kcyB0aGF0IG5lZWRzIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQotICAgKiBzdWJjbGFzc2VzLiBUaGUgaW1hZ2UgbmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBEaWFsb2cgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBJbWFnZSBnZXREaWFsb2dJbWFnZSgpCi0gIHsKLSAgICAvLyBjcmVhdGUgaW1hZ2UKLSAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VFbnZpcm9ubWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVmMzQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZWNsaXBzZS9FY2xpcHNlRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUudXJpLmZpbGUuRmlsZVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5CYXNlRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2UuRWNsaXBzZVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uSmF2YUNvbXBpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LlJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuU2ltcGxlVVJJRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuVVJJRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBFbnZpcm9ubWVudCBjbGFzcyBmb3IgdGhlIEVjbGlwc2UgRW52aXJvbm1lbnQuCi0gKiBUaGlzIEVudmlyb25tZW50IGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgInBsYXRmb3JtIiBwcm90b2NvbCBhbmQgdGhlICJmaWxlIgotICogcHJvdG9jb2wuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUVudmlyb25tZW50IGltcGxlbWVudHMgQmFzZUVjbGlwc2VFbnZpcm9ubWVudAotewotICBwcml2YXRlIENvbW1hbmRNYW5hZ2VyICAgY29tbWFuZE1hbmFnZXJfICA9IG51bGw7Ci0gIHByaXZhdGUgU2ltcGxlVVJJRmFjdG9yeSB1cmlGYWN0b3J5XyAgICAgID0gbnVsbDsKLSAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dF8gPSBudWxsOwotICBwcml2YXRlIFByb2dyZXNzTW9uaXRvciAgbW9uaXRvcl8gICAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgU3RhdHVzSGFuZGxlciAgICBzdGF0dXNIYW5kbGVyXyAgID0gbnVsbDsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlRW52aXJvbm1lbnQoIENvbW1hbmRNYW5hZ2VyICBjb21tYW5kTWFuYWdlciwgCi0JCSAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0JCQkJCSAgICAgICAgIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCQkJICAgICBTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0gIHsKLSAgICBjb21tYW5kTWFuYWdlcl8gID0gY29tbWFuZE1hbmFnZXI7Ci0gICAgcmVzb3VyY2VDb250ZXh0XyA9IHJlc291cmNlQ29udGV4dDsKLSAgICB1cmlGYWN0b3J5XyAgICAgID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLSAgICBtb25pdG9yXyAgICAgICAgID0gbW9uaXRvcjsKLSAgICBzdGF0dXNIYW5kbGVyXyAgID0gc3RhdHVzSGFuZGxlcjsKLSAgICAKLSAgICB1cmlGYWN0b3J5Xy5yZWdpc3RlclNjaGVtZSggInBsYXRmb3JtIiwgbmV3IEVjbGlwc2VTY2hlbWUoIHRoaXMgKSApOwotICAgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIG5ldyBGaWxlU2NoZW1lKCkgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldENvbW1hbmRNYW5hZ2VyKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kTWFuYWdlciBnZXRDb21tYW5kTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gY29tbWFuZE1hbmFnZXJfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldEphdmFDb21waWxlcigpCi0gICAqLwotICBwdWJsaWMgSmF2YUNvbXBpbGVyIGdldEphdmFDb21waWxlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRMb2coKQotICAgKi8KLSAgcHVibGljIExvZyBnZXRMb2coKQotICB7Ci0gICAgcmV0dXJuIG5ldyBFY2xpcHNlTG9nKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLSAgICovCi0gIHB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLSAgewotICAgIHJldHVybiBtb25pdG9yXzsKLSAgfQotCi0gCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRTdGF0dXNIYW5kbGVyKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXNIYW5kbGVyIGdldFN0YXR1c0hhbmRsZXIoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c0hhbmRsZXJfOwotICB9Ci0KLSAgLyoqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0VVJJRmFjdG9yeSgpCi0gICAqLwotICBwdWJsaWMgVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiB1cmlGYWN0b3J5XzsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHJldHVybnMgYSBSZXNvdXJjZUNvbnRleHQgZm9yIHRoaXMgRW52aXJvbm1lbnQuCi0gICAqLwotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0XzsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0Q29tbWFuZE1hbmFnZXIoIENvbW1hbmRNYW5hZ2VyIG1hbmFnZXIgKQotICB7Ci0JY29tbWFuZE1hbmFnZXJfID0gbWFuYWdlcjsgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2VjbGlwc2UvRWNsaXBzZVByb2dyZXNzTW9uaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwNWE4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL2VjbGlwc2UvRWNsaXBzZVByb2dyZXNzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlByb2dyZXNzTW9uaXRvcjsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVByb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIFByb2dyZXNzTW9uaXRvcgotewotICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3JfOwotICAKLSAgcHVibGljIEVjbGlwc2VQcm9ncmVzc01vbml0b3IoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIGFuIGVjbGlwc2UgSVByb2dyZXNzTW9uaXRvciB0byB0aGlzIG1vbml0b3IuIAotICAgKiBAcGFyYW0gbW9uaXRvcgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TW9uaXRvciggSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKLSAgewotICAgIG1vbml0b3JfID0gbW9uaXRvcjsgIAotICB9Ci0gIAotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgRWNsaXBzZSBJUHJvZ3Jlc3NNb25pdG9yIGZvciB0aGlzIG1vbml0b3IuCi0gICAqLwotICBwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yKCkKLSAgewotICAJcmV0dXJuIG1vbml0b3JfOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlByb2dyZXNzTW9uaXRvciNnZXRDaGlsZFByb2dyZXNzTW9uaXRvcigpCi0gICAqLwotICBwdWJsaWMgUHJvZ3Jlc3NNb25pdG9yIGdldENoaWxkUHJvZ3Jlc3NNb25pdG9yKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5Qcm9ncmVzc01vbml0b3IjaXNDYW5jZWxSZXF1ZXN0ZWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxSZXF1ZXN0ZWQoKQotICB7Ci0gICAgcmV0dXJuIG1vbml0b3JfID09IG51bGwgPyBmYWxzZSA6IG1vbml0b3JfLmlzQ2FuY2VsZWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uUHJvZ3Jlc3NNb25pdG9yI3JlcG9ydChqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KFN0cmluZyBwcm9ncmVzcykKLSAgewotICAgIGlmKCBtb25pdG9yXyAhPSBudWxsICkgCi0gICAgewotICAgICAgRGlzcGxheSBjdXJyZW50VGhyZWFkRGlzcGxheSA9IERpc3BsYXkuZmluZERpc3BsYXkoIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKTsKLSAgICAgIAotICAgICAgaWYoIGN1cnJlbnRUaHJlYWREaXNwbGF5ICE9IG51bGwgKQotICAgICAgewotICAgICAgICBtb25pdG9yXy5iZWdpblRhc2soIHByb2dyZXNzLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04gKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvZWNsaXBzZS9FY2xpcHNlU3RhdHVzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VTdGF0dXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDhkMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9lY2xpcHNlL0VjbGlwc2VTdGF0dXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5kaWFsb2cuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZGlhbG9nLlN0YXR1c0RpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgRWNsaXBzZSBVSSB2ZXJzaW9uIG9mIHRoZSBTdGF0dXNIYW5kbGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlU3RhdHVzSGFuZGxlciBpbXBsZW1lbnRzIFN0YXR1c0hhbmRsZXIKLXsKLSAgcHJpdmF0ZSBTaGVsbCAgICAgICAgc2hlbGxfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyBtc2dfOwotICAKLSAgcHVibGljIEVjbGlwc2VTdGF0dXNIYW5kbGVyKCkKLSAgewotICAgIHRoaXMoIG5ldyBTaGVsbCgpICk7Ci0gIH0KLQotICBwdWJsaWMgRWNsaXBzZVN0YXR1c0hhbmRsZXIoU2hlbGwgc2hlbGwpCi0gIHsKLSAgICBtc2dfICAgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5lbnZpcm9ubWVudCIsIHRoaXMgKTsKLSAgICBzaGVsbF8gPSBzaGVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cywgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5DaG9pY2VbXSkKLSAgICovCi0gIHB1YmxpYyBDaG9pY2UgcmVwb3J0KFN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMpIAotICB7Ci0gICAgaW50IHJlc3VsdCA9Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgICAgc2hlbGxfLAotICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIlRJVExFX1dBUk5JTkciKSwKLQkJCQludWxsLAotCQkJCXN0YXR1cywKLQkJCQljaG9pY2VzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspCi0gICAgIHsKLSAgICAgIGlmIChjaG9pY2VzW2ldLmdldFNob3J0Y3V0KCkgPT0gcmVzdWx0KQotICAgICAgICByZXR1cm4gY2hvaWNlc1tpXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0KG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVwb3J0KFN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gdXNlck9rID0gZmFsc2U7Ci0gICAgCi0gICAgc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkKLSAgICB7Ci0gICAgICAvLyBhbiBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCBhbmQgd2UgbmVlZCB0byBzdG9wIGV4ZWN1dGluZyB0aGUgY29tbWluZwotICAgICAgLy8gY29tbWFuZHMKLSAgICAgIGNhc2UgU3RhdHVzLkVSUk9SIDoKLSAgICAgIHsKLSAgICAgICAgdXNlck9rID0gcmVwb3J0RXJyb3JTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFN0YXR1cy5XQVJOSU5HIDoKLSAgICAgIHsKLSAgICAgICAgdXNlck9rID0gcmVwb3J0V2FybmluZyhzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgIAotICAgICAgY2FzZSBTdGF0dXMuSU5GTyA6Ci0gICAgICB7Ci0gICAgICAgIHVzZXJPayA9IHRydWU7Ci0gICAgICAgIHJlcG9ydEluZm8oc3RhdHVzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmKCAhdXNlck9rICkgdGhyb3cgbmV3IFN0YXR1c0V4Y2VwdGlvbiggc3RhdHVzICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiByZXBvcnRXYXJuaW5nKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICBpbnQgdXNlclJlc3BvbnNlID0KLSAgICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCJUSVRMRV9XQVJOSU5HIiksCi0gICAgICAgIG51bGwsCi0gICAgICAgIHN0YXR1cyk7Ci0gICAgcmV0dXJuICh1c2VyUmVzcG9uc2UgPT0gU3RhdHVzRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiByZXBvcnRFcnJvclN0YXR1cyhTdGF0dXMgc3RhdHVzKQotICB7Ci0gICAgTWVzc2FnZURpYWxvZy5vcGVuTWVzc2FnZSgKLSAgICAgIHNoZWxsXywKLSAgICAgIG1zZ18uZ2V0TWVzc2FnZSgiVElUTEVfRVJST1IiKSwKLSAgICAgIG51bGwsCi0gICAgICBzdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3Iob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0YXR1cyBzdGF0dXMpCi0gIHsKLSAgICByZXBvcnRFcnJvclN0YXR1cyggc3RhdHVzICk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8ob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlcG9ydEluZm8oU3RhdHVzIHN0YXR1cykKLSAgewotICAgIE1lc3NhZ2VEaWFsb2cub3Blbk1lc3NhZ2UoCi0gICAgICAgIHNoZWxsXywKLSAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCJUSVRMRV9JTkZPIiksCi0gICAgICAgIG51bGwsCi0gICAgICAgIHN0YXR1cyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcGx1Z2luL0VudlVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3BsdWdpbi9FbnZVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWYyYmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcGx1Z2luL0VudlVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgRW52VUlQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEVudlVJUGx1Z2luIGluc3RhbmNlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBFbnZVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudlVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNGJjOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzLkFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHBvcHVwIGFjdGlvbnMgcHJlZmVyZW5jZSBwYWdlIGZvciBhIAotICogcGFydGljdWxhciBjYXRlZ29yeS4gIEZvciBleGFtcGxlOgotICoKLSAqIDxwcmU+Ci0gKiAgJmx0O2V4dGVuc2lvbgotICogICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiJmd0OwotICogICAgICZsdDtwYWdlCi0gKiAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfRElBTE9HUyIKLSAqICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLnByZWZlcmVuY2VzLm5hbWUiCi0gKiAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wcmVmZXJlbmNlcy5BY3Rpb25EaWFsb2dzUHJlZmVyZW5jZVBhZ2UiCi0gKiAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkiJmd0OwotICogICAgICZsdDsvcGFnZSZndDsKLSAqICogPC9wcmU+Ci0gKiBUaGlzIGVudHJ5IHNwZWNpZmllcyB0aGF0IGFsbCBwb3B1cCBhY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSAqIG9yZy5lY2xpcHNlLmpzdC53c3MucG9wdXAuY2F0ZWdvcnkgd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhpcwotICogcHJlZmVyZW5jZSBwYWdlLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGlhbG9nc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIExpc3RlbmVyLCBJRXhlY3V0YWJsZUV4dGVuc2lvbgotewotICAvKkNPTlRFWFRfSUQgUFBBRDAwMDEgZm9yIHRoZSBBY3Rpb24gRGlhbG9ncyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQQURfUEFHRSA9ICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuUFBBRDAwMDEiOwotICAvLwotICBwcml2YXRlIEJ1dHRvbiBzaG93QWxsOwotICAvKkNPTlRFWFRfSUQgUFBBRDAwMDIgZm9yIHRoZSAgc2hvdyBhbGwgY2hlY2sgYm94IG9uIHRoZSBBY3Rpb24gRGlhbG9ncyBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BQQURfQlVUVE9OX1NIT1dfQUxMID0gIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5QUEFEMDAwMiI7Ci0gIC8vCi0gIHByaXZhdGUgQnV0dG9uIGhpZGVBbGw7Ci0gIC8qQ09OVEVYVF9JRCBQUEFEMDAwMyBmb3IgdGhlICBoaWRlIGFsbCBjaGVjayBib3ggb24gdGhlIEFjdGlvbiBEaWFsb2dzIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFBBRF9CVVRUT05fSElERV9BTEwgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLlBQQUQwMDAzIjsKLQotICBwcml2YXRlIEhhc2h0YWJsZSBjaGVja0JveGVzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgY2F0ZWdvcnlJZF87Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICAgICAgZGF0YSApCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGNhdGVnb3J5SWRfICAgPSBjb25maWcuZ2V0QXR0cmlidXRlKCAiaWQiICk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgKiAgIEBwYXJhbSBwYXJlbnQgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBzdXBlcnBhcmVudCkKLSAgewotICAgIE1lc3NhZ2VVdGlscyBtc2dVdGlscyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkuZW52aXJvbm1lbnR1aSIsIHRoaXMgKTsKLSAgICAKLSAgICBjaGVja0JveGVzXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBhZGRPcHRpb25hbERpYWxvZ3NDaGVja0JveGVzIChzdXBlcnBhcmVudCk7Ci0JbmV3IExhYmVsKHN1cGVycGFyZW50LCBTV1QuSE9SSVpPTlRBTCk7Ci0JCi0gICAgQ29tcG9zaXRlICAgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggc3VwZXJwYXJlbnQsIFNXVC5OT05FICk7CQotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgcGFyZW50LnNldExheW91dCggbGF5b3V0ICk7Ci0gICAgcGFyZW50LnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFBBRF9QQUdFIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJTkZPUE9QX1BQQURfUEFHRSApOwotCQotICAgIHNob3dBbGwgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHNob3dBbGwuc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJCVVRUT05fU0hPV19BTExfRElBTE9HUyIpKTsKLSAgICBzaG93QWxsLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotICAgIHNob3dBbGwuc2V0VG9vbFRpcFRleHQobXNnVXRpbHMuZ2V0TWVzc2FnZSgiVE9PTFRJUF9QUEFEX0JVVFRPTl9TSE9XX0FMTCIpKTsKLSAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNob3dBbGwsIElORk9QT1BfUFBBRF9CVVRUT05fU0hPV19BTEwgKTsKLSAgIAotICAgIGhpZGVBbGwgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGhpZGVBbGwuc2V0VGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJCVVRUT05fSElERV9BTExfRElBTE9HUyIpKTsKLSAgICBoaWRlQWxsLmFkZExpc3RlbmVyICggU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0gICAgaGlkZUFsbC5zZXRUb29sVGlwVGV4dChtc2dVdGlscy5nZXRNZXNzYWdlKCJUT09MVElQX1BQQURfQlVUVE9OX0hJREVfQUxMIikpOwotICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoaGlkZUFsbCwgSU5GT1BPUF9QUEFEX0JVVFRPTl9ISURFX0FMTCApOwotCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzdXBlcnBhcmVudCk7Ci0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KSAKLSB7Ci0gICAgaWYgKHNob3dBbGwgPT0gZXZlbnQud2lkZ2V0KQotCQloYW5kbGVTaG93QWxsRXZlbnQoKTsKLSAgICAKLSAgICBlbHNlIGlmICggaGlkZUFsbCA9PSBldmVudC53aWRnZXQpCi0gICAgCWhhbmRsZUhpZGVBbGxFdmVudCgpOwotIH0KLQotIHByaXZhdGUgdm9pZCBoYW5kbGVTaG93QWxsRXZlbnQgKCkKLSB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmVsZW1lbnRzKCk7Ci0gCWZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIAl7Ci0gICAgCQlCdXR0b24gZGlhbG9nID0gKEJ1dHRvbikgZS5uZXh0RWxlbWVudCgpOwotICAgIAkJZGlhbG9nLnNldFNlbGVjdGlvbiggZmFsc2UgKTsKLSAgICAJfSAgICAgICAgICAgICAgICAgICAgICAKLSB9Ci0KLSBwcml2YXRlIHZvaWQgaGFuZGxlSGlkZUFsbEV2ZW50ICgpCi0gewotIAlFbnVtZXJhdGlvbiBlID0gY2hlY2tCb3hlc18uZWxlbWVudHMoKTsKLSAJZm9yIChpbnQgaT0wOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0gICAgCXsKLSAgICAJCUJ1dHRvbiBkaWFsb2cgPSAoQnV0dG9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgCQlkaWFsb2cuc2V0U2VsZWN0aW9uKCB0cnVlICk7Ci0gICAgCX0KLSB9Ci0gCi0gcHJpdmF0ZSB2b2lkIGFkZE9wdGlvbmFsRGlhbG9nc0NoZWNrQm94ZXMgKCBDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgPSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLSAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdIGRpYWxvZ3MgPSBjb250ZXh0LmdldERpYWxvZ3MoKTsKLSAgICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpYWxvZ3MubGVuZ3RoOyBpKyspIAotICAgIHsKLSAgICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyAgID0gZGlhbG9nc1tpXTsKLSAgICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gZGlhbG9nLmdldENhdGVnb3J5KCk7Ci0gICAgICAKLSAgICAgIGlmKCBkaWFsb2cuZ2V0U2hvd0NoZWNrYm94KCkgJiYgIGNhdGVnb3J5ICE9IG51bGwgJiYgY2F0ZWdvcnkuZXF1YWxzKCBjYXRlZ29yeUlkXykgKQotICAgICAgewotICAgIAlCdXR0b24gY2hlY2tCb3ggPSBjcmVhdGVDaGVja0JveChwYXJlbnQsIGRpYWxvZy5nZXROYW1lKCkpOwotICAgIAljaGVja0JveC5zZXRUb29sVGlwVGV4dCggZGlhbG9nLmdldFRvb2x0aXAoKSApOwotICAgIAlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNoZWNrQm94LCBkaWFsb2cuZ2V0SW5mb3BvcCgpICk7Ci0gICAgCWNoZWNrQm94ZXNfLnB1dChkaWFsb2cuZ2V0SWQoKSwgY2hlY2tCb3gpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0ICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5DSEVDSyApOwotICAgIGJ1dHRvbi5zZXRUZXh0KCB0ZXh0ICk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSAgeyB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBjaGVja0JveGVzXy5lbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIEJ1dHRvbiBkaWFsb2cgPSAoQnV0dG9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBkaWFsb2cuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2VzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKQotICB7Ci0gICAgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgPSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gY2hlY2tCb3hlc18ua2V5cygpOwotICAgIGZvciAoaW50IGk9MDsgZS5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBpZCA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBjaGVja0JveGVzXy5nZXQoaWQpOwotICAgICAgYnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzQWN0aW9uRGlhbG9nRW5hYmxlZChpZCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpCi0gIHsKLSAgICBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgY29udGV4dCA9IFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5nZXRJbnN0YW5jZSgpOwotCi0gICAgRW51bWVyYXRpb24gZSA9IGNoZWNrQm94ZXNfLmtleXMoKTsKLSAgICBmb3IgKGludCBpPTA7IGUuaGFzTW9yZUVsZW1lbnRzKCk7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgaWQgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBjb250ZXh0LnNldEFjdGlvbkRpYWxvZ0VuYWJsZWQoaWQsICgoQnV0dG9uKWNoZWNrQm94ZXNfLmdldChpZCkpLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9yZWdpc3RyeS9XaWRnZXRSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS9yZWdpc3RyeS9XaWRnZXRSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWY3ZmMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvcmVnaXN0cnkvV2lkZ2V0UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFdpZGdldFJlZ2lzdHJ5IAotewotICBwcml2YXRlIHN0YXRpYyBXaWRnZXRSZWdpc3RyeSByZWdpc3RyeV87Ci0gIAotICBwcml2YXRlIEhhc2h0YWJsZSBlbnRyaWVzXzsKLSAgCi0gIHByaXZhdGUgV2lkZ2V0UmVnaXN0cnkoKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgV2lkZ2V0UmVnaXN0cnkgaW5zdGFuY2UoKQotICB7Ci0gICAgaWYoIHJlZ2lzdHJ5XyA9PSBudWxsICkKLQl7Ci0JICByZWdpc3RyeV8gPSBuZXcgV2lkZ2V0UmVnaXN0cnkoKTsKLQkgIHJlZ2lzdHJ5Xy5sb2FkKCk7Ci0JfQotCQotCXJldHVybiByZWdpc3RyeV87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHBhcmFtIGlkIHRoZSBtZXRob2RJZCB0aGF0IG1heSBoYXZlIFdpZGdldENvbnRyaWJ1dG9yIGFzc29jaWF0ZWQgd2l0aCBpdC4KLSAgICogQHJldHVybiByZXR1cm5zIGEgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGlmIG9uZSB3YXMgZGVmaW5lZCBpbiB0aGUgcmVnaXN0cnkuCi0gICAqIE90aGVyd2lzZSBudWxsIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBnZXRGYWN0b3J5KCBTdHJpbmcgaWQgKQotICB7Ci0JSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSAgID0gKEVudHJ5KWVudHJpZXNfLmdldCggaWQgKTsKLQkKLQlpZiggZW50cnkgIT0gbnVsbCApCi0JewotCSAgdHJ5Ci0JICB7Ci0JCWlmKCBlbnRyeS5mYWN0b3J5XyA9PSBudWxsICkKLQkJewotCQkgIGVudHJ5LmZhY3RvcnlfID0gKElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSllbnRyeS5lbGVtZW50Xy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCAiY2xhc3MiICk7Ci0JCX0KLQkJCi0JCWZhY3RvcnkgPSBlbnRyeS5mYWN0b3J5XzsKLQkgIH0KLQkgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0JICB7Ci0JICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkgIH0KLQkgIGNhdGNoKCBUaHJvd2FibGUgZXhjICkKLQkgIHsKLQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCSAgfQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGxvYWQoKQotICB7Ci0JSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0Zvcigib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Iik7Ci0JCi0JZW50cmllc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCi0JZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGVsZW1lbnRzLmxlbmd0aDsgaW5kZXgrKyApCi0JewotCSAgLy8gSWYgdGhpcyBpcyBub3QgYW4gZWxlbWVudCB0aGF0IGtub3cgYWJvdXQgd2Ugd2lsbCBza2lwIGl0LgotCSAgaWYoICFlbGVtZW50c1tpbmRleF0uZ2V0TmFtZSgpLmVxdWFscygid2lkZ2V0RmFjdG9yeSIpICkgY29udGludWU7Ci0JICAKLQkgIEVudHJ5ICAgICAgICAgICAgICAgICBlbnRyeSAgICA9IG5ldyBFbnRyeSgpOwotCSAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgID0gZWxlbWVudHNbaW5kZXhdOwotCSAgU3RyaW5nICAgICAgICAgICAgICAgIGlkICAgICAgID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoICJpZCIgKTsKLQkgIFN0cmluZyAgICAgICAgICAgICAgICBtZXRob2RJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCAiaW5zZXJ0QmVmb3JlQ29tbWFuZElkIiApOwotCSAgCi0JICBlbnRyeS5lbGVtZW50XyA9IGVsZW1lbnQ7Ci0JICBlbnRyeS5pZF8gICAgICA9IGlkOwotCSAgCi0JICBlbnRyaWVzXy5wdXQoIG1ldGhvZElkLCBlbnRyeSApOwotCX0KLSAgfQotICAKLSAgcHJpdmF0ZSBjbGFzcyBFbnRyeQotICB7Ci0gICAgU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgIGlkXzsKLQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgICAgICAgICAgZWxlbWVudF87Ci0JSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGZhY3RvcnlfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQ2FuRmluaXNoUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9DYW5GaW5pc2hSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRlNTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9DYW5GaW5pc2hSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci0KLS8qKgotICogVGhpcyBpcyBhbiBpbnRlcmZhY2UgZm9yIGFuIGFic3RyYWN0IGNhbiBmaW5pc2ggcmVnaXN0cnkuCi0gKiBUaGlzIHJlZ2lzdHJ5IGlzIHVzdWFsbHkgYXNzb2NpYXRlIHdpdGggYW4gRWNsaXBzZSB3aXphcmQuICBUaGlzCi0gKiByZWdpc3RyeSBhbGxvdyBjb25kaXRpb24gb2JqZWN0IHRvIGJlIGFkZGVkIHRvIGl0IGluIG9yZGVyIHRvCi0gKiBkZXRlcm1pbmUgaWYgdGhlIHdpemFyZCBjYW4gZmluaXNoIG9yIG5vdC4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FuRmluaXNoUmVnaXN0cnkKLXsKLSAgLyoqCi0gICAqIEFkZCBhIGNvbmRpdGlvbiBvYmplY3QgdG8gdGhlIHJlZ2lzdHJ5LgotICAgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBjb25kaXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb25kaXRpb24oIENvbmRpdGlvbiBjb25kaXRpb24gKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9Db21tYW5kV2lkZ2V0QmluZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0NvbW1hbmRXaWRnZXRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3N2MzYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0NvbW1hbmRXaWRnZXRCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZFdpZGdldEJpbmRpbmcgZXh0ZW5kcyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5RmFjdG9yeQotewotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBleHRlbnNpb25zIHRvIHJlZ2lzdGVyIHRoZWlyIHdpZGdldHMgd2l0aAotICAgKiBDb21tYW5kRnJhZ21lbnRzCi0gICAqIAotICAgKiBAcGFyYW0gd2lkZ2V0UmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoIFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5ICk7Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBleHRlbmlvbnMgdG8gcmVnaXN0ZXIgdGhlIGRhdGEgbWFwcGluZ3MKLSAgICogdGhhdCB0aGVpciB3aWRnZXRzIHVzZS4KLSAgICogCi0gICAqIEBwYXJhbSBkYXRhUmVnaXN0cnkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSApOwotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgZXh0ZW5zaW9ucyB0byByZWdpc3RlciBjb25kaXRpb24gb2JqZWN0cwotICAgKiB0aGF0IGNvbnRyb2wgaWYgdGhlIHdpemFyZCBjYW4gZmluaXNoIG9yIG5vdC4KLSAgICogCi0gICAqIEBwYXJhbSBjYW5GaW5pc2hSZWdpc3RyeQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJDYW5GaW5pc2goIENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5ICk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvQ29tbWFuZFdpZGdldEJpbmRpbmdMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzI2ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0NvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuU2VxdWVuY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIENvbW1hbmRXaWRnZXRCaW5kaW5nTGlzdCBpbXBsZW1lbnRzIENvbW1hbmRXaWRnZXRCaW5kaW5nCi17Ci0gIHByaXZhdGUgVmVjdG9yICAgICAgICAgICAgICAgICBiaW5kaW5nc187Ci0gIHByaXZhdGUgVmVjdG9yICAgICAgICAgICAgICAgICBmcmFnbWVudHNfOwotICBwcml2YXRlIENvbW1hbmRGcmFnbWVudEZhY3RvcnkgZmFjdG9yeV87Ci0gIAotICAvKioKLSAgICogVGhpcyBDb21tYW5kV2lkZ2V0QmluZGluZyBjb21iaW5lcyBhIGxpc3Qgb2YgQ29tbWFuZFdpZGdldEJpbmRpbmdzLgotICAgKiBUaGVyZSBzaG91bGQgYmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYm90aCB0aGUgYmluZGluZ3MKLSAgICogcGFyYW1ldGVyIGFuZCB0aGUgZnJhZ21lbnRzIHBhcmFtZXRlci4gIEVudHJpZXMgaW4gZWl0aGVyIG9mIHRoZQotICAgKiBiaW5kaW5ncyBmb3IgZnJhZ21lbnRzIHZlY3RvcnMgYXJlIGFsbG93ZWQgdG8gYmUgbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5ncyAgIHRoZSBiaW5kaW5ncyB0byBjb21iaW5lLgotICAgKiBAcGFyYW0gZnJhZ21lbnRzICBUaGVzZSBmcmFnbWVudHMgd2lsbCBiZSBpbnRlcnNwZXJzZWQgd2l0aCB0aGUKLSAgICogICAgICAgICAgICAgICAgICAgZnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGJpbmRpbmcuICBUaGUgZmlyc3QKLSAgICogICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgd2lsbCBiZSBwdXQgYmVmb3JlIHRoZSBmcmFnbWVudCBmcm9tIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICBmaXJzdCBiaW5kaW5nLiAgRm9sbG93aW5nIHRoaXMgd2lsbCBiZSB0aGUgc2Vjb25kCi0gICAqICAgICAgICAgICAgICAgICAgIGZyYWdtZW50IGZyb20gdGhlIGZyYWdtZW50cyB2ZWN0b3IgYW5kIHRoZW4gdGhlCi0gICAqICAgICAgICAgICAgICAgICAgIHNlY29uZCBmcmFnbWVudCBmcm9tIHRoZSBiaW5kaW5ncyB2ZWN0b3IsIGV0Yy4KLSAgICovCi0gIHB1YmxpYyBDb21tYW5kV2lkZ2V0QmluZGluZ0xpc3QoIFZlY3RvciBiaW5kaW5ncywgVmVjdG9yIGZyYWdtZW50cyApCi0gIHsKLSAgICBiaW5kaW5nc18gID0gYmluZGluZ3M7IAotICAgIGZyYWdtZW50c18gPSBmcmFnbWVudHM7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5Db21tYW5kV2lkZ2V0QmluZGluZyNyZWdpc3RlckNhbkZpbmlzaChvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0cy5DYW5GaW5pc2hSZWdpc3RyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyQ2FuRmluaXNoKENhbkZpbmlzaFJlZ2lzdHJ5IGNhbkZpbmlzaFJlZ2lzdHJ5KSAKLSAgewotICAgIGludCBsZW5ndGggPSBiaW5kaW5nc18uc2l6ZSgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIENvbW1hbmRXaWRnZXRCaW5kaW5nIGJpbmRpbmcgPSAoQ29tbWFuZFdpZGdldEJpbmRpbmcpYmluZGluZ3NfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAgIAotICAgICAgaWYoIGJpbmRpbmcgIT0gbnVsbCApIGJpbmRpbmcucmVnaXN0ZXJDYW5GaW5pc2goIGNhbkZpbmlzaFJlZ2lzdHJ5ICk7Ci0gICAgfQotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcjcmVnaXN0ZXJEYXRhTWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotICB7Ci0gICAgaW50IGxlbmd0aCA9IGJpbmRpbmdzXy5zaXplKCk7Ci0gICAgCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgQ29tbWFuZFdpZGdldEJpbmRpbmcgYmluZGluZyA9IChDb21tYW5kV2lkZ2V0QmluZGluZyliaW5kaW5nc18uZWxlbWVudEF0KCBpbmRleCApOwotICAgICAgaWYoIGJpbmRpbmcgIT0gbnVsbCApIGJpbmRpbmcucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFSZWdpc3RyeSApOwotICAgIH0KLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLkNvbW1hbmRXaWRnZXRCaW5kaW5nI3JlZ2lzdGVyV2lkZ2V0TWFwcGluZ3Mob3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuV2lkZ2V0UmVnaXN0cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldpZGdldE1hcHBpbmdzKFdpZGdldFJlZ2lzdHJ5IHdpZGdldFJlZ2lzdHJ5KSAKLSAgewotICAgIGludCBsZW5ndGggPSBiaW5kaW5nc18uc2l6ZSgpOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKQotICAgIHsKLSAgICAgIENvbW1hbmRXaWRnZXRCaW5kaW5nIGJpbmRpbmcgPSAoQ29tbWFuZFdpZGdldEJpbmRpbmcpYmluZGluZ3NfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAgIGlmKCBiaW5kaW5nICE9IG51bGwgKSBiaW5kaW5nLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoIHdpZGdldFJlZ2lzdHJ5ICk7Ci0gICAgfQotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZyYWdtZW50RmFjdG9yeUZhY3RvcnkjY3JlYXRlKCkKLSAgICovCi0gIHB1YmxpYyBDb21tYW5kRnJhZ21lbnRGYWN0b3J5IGNyZWF0ZSgpIAotICB7Ci0gICAgaWYoIGZhY3RvcnlfID09IG51bGwgKQotICAgIHsKLSAgICAgIGZhY3RvcnlfID0gbmV3IENvbW1hbmRGcmFnbWVudEZhY3RvcnkoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIENvbW1hbmRGcmFnbWVudCBjcmVhdGUoKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFNlcXVlbmNlRnJhZ21lbnQgZnJhZ21lbnRMaXN0ID0gbmV3IFNlcXVlbmNlRnJhZ21lbnQoKTsKLSAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbGVuZ3RoICAgICAgID0gYmluZGluZ3NfLnNpemUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCA9IChDb21tYW5kRnJhZ21lbnQpZnJhZ21lbnRzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiggZnJhZ21lbnQgIT0gbnVsbCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcmFnbWVudExpc3QuYWRkKCBmcmFnbWVudCApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBDb21tYW5kV2lkZ2V0QmluZGluZyBiaW5kaW5nID0gKENvbW1hbmRXaWRnZXRCaW5kaW5nKWJpbmRpbmdzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiggYmluZGluZyAhPSBudWxsICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyYWdtZW50TGlzdC5hZGQoIGJpbmRpbmcuY3JlYXRlKCkuY3JlYXRlKCkgKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZnJhZ21lbnRMaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgfTsgCi0gICAgfQotICAgIAotICAgIHJldHVybiBmYWN0b3J5XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0N1cnJlbnRQYWdlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0N1cnJlbnRQYWdlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDFjYmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9DdXJyZW50UGFnZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotCi0KLS8qKgotICogVGhpcyBDb21tYW5kIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBwYWdlLgotICogVXNlIG9mIHRoaXMgY2xhc3MgaXMgbm90IHJlY29tbWVuZGVkLgotICoKLSAqLwotcHVibGljIGNsYXNzIEN1cnJlbnRQYWdlQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlcl87Ci0gIAotICBwdWJsaWMgQ3VycmVudFBhZ2VDb21tYW5kKCBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlciApCi0gIHsKLSAgICBwYWdlTWFuYWdlcl8gPSBwYWdlTWFuYWdlcjsKLSAgfQotICAKLSAgcHVibGljIElXaXphcmRQYWdlIGdldEN1cnJlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBwYWdlTWFuYWdlcl8uZ2V0Q3VycmVudFBhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0R5bmFtaWNXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9EeW5hbWljV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjN2YxOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL0R5bmFtaWNXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFGbG93TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5TZXF1ZW5jZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LlNpbXBsZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGFkZCBkeW5hbWljIHdpemFyZHMgaW50byBFY2xpcHNlLiAgV2hlbiBhZGRpbmcKLSAqIGEgZHluYW1pYyB3aXphcmQgaW50byBlY2xpcHNlIHR3byBlbnRyaWVzIG5lZWQgdG8gYmUgbWFkZSBpbiB0aGUgcGx1Z2luLnhtbAotICogZmlsZS4gIFRoaXMgZmlyc3QgZW50cnkgdGVsbHMgRWNsaXBzZSB0aGF0IGEgbmV3IHdpemFyZCBzaG91bGQgYmUgYWRkZWQKLSAqIGFuZCBpdCByZWZlcmVuY2VzIHRoaXMgY2xhc3MuICBUaGUgc2Vjb25kIGVudHJ5IHNwZWNpZmllcyBkZXRhaWxlZCBpbmZvcm1hdGlvbgotICogdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgd2l6YXJkIHRvIGJlIGFkZGVkLiAgVGhlc2UgdHdvIHBsdWdpbi54bWwgZW50cmllcwotICogYXJlIGxpbmtlZCB0b2dldGhlciB2aWEgdGhlaXIgaWQgYXR0cmlidXRlcy4gIEZvciBleGFtcGxlIGhlcmUgaXMgYW4KLSAqIGVudHJ5IHRoYXQgcmVnaXN0ZXJzIGEgbmV3IHdpemFyZCB3aXRoIGVjbGlwc2UuICBOb3RlIHRoZSBjbGFzcyBhdHRyaWJ1dGUKLSAqIHJlZmVyZW5jZXMgdGhpcyBjbGFzcy4KLSAqIDxwcmU+Ci0gKiAgICZsdDtleHRlbnNpb24KLSAqICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyImZ3Q7Ci0gKiAgICAgJmx0O3dpemFyZAotICogICAgICAgICAgIG5hbWU9IiVQTFVHSU5fTkVXX1dJWkFSRF9OQU1FX1dTX0NMSUVOVCIKLSAqICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZiIKLSAqICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAqICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZCIKLSAqICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIiZndDsKLSAqICAgICAgICAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci0gKiAgICAgICAgICAgJVBMVUdJTl9ORVdfV0laQVJEX0RFU0NfV1NfQ0xJRU5UCi0gKiAgICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAqICAgICAgICAmbHQ7c2VsZWN0aW9uCi0gKiAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSImZ3Q7Ci0gKiAgICAgICAgJmx0Oy9zZWxlY3Rpb24mZ3Q7Ci0gKiAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gKiAgICZsdDsvZXh0ZW5zaW9uJmd0OwotICoKLSAqIDwvcHJlPgotICogSGVyZSBpcyB0aGUgZHluYW1pY1dpemFyZCBlbnRyeSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdpemFyZC4gIFRoaXMgaWQgYXR0cmlidXRlcwotICogbGluayB0aGVzZSB0d28gZW50cmllcyB0b2dldGhlci4gIFRoZSBjbGFzcyBhdHRyaWJ1dGUgbXVzdCBzcGVjaWZ5IGEgY2xhc3MgdGhhdAotICogaW1wbGVtZW50cyB0aGUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuQ29tbWFuZFdpZGdldEJpbmRpbmcgaW50ZXJmYWNlLiAgVGhpcwotICogaW50ZXJmYWNlIHNwZWNpZmllcyB3aGF0IHRoZSBVSSBzaG91bGQgbG9vayBsaWtlIGFuZCB0aGUgY29tbWFuZHMgdGhlIHNob3VsZAotICogYmUgZXhlY3V0ZWQgaW4gdGhlIHdpemFyZC4KLSAqIAotICogPHByZT4KLSAqICAgJmx0O2V4dGVuc2lvbgotICogICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuZHluYW1pY1dpemFyZCImZ3Q7Ci0gKiAgICAgJmx0O2R5bmFtaWNXaXphcmQKLSAqICAgICAgICAgICBpY29uYmFubmVyPSJpY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmIgotICogICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2lkZ2V0cy5iaW5kaW5nLkNsaWVudFdpZGdldEJpbmRpbmciCi0gKiAgICAgICAgICAgdGl0bGU9IiVXSVpBUkRfVElUTEVfV1NDIgotICogICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud2l6YXJkLmNsaWVudC5jbGllbnR3aXphcmQiJmd0OwotICogICAgICZsdDsvZHluYW1pY1dpemFyZCZndDsKLSAqICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKiA8L3ByZT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEeW5hbWljV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCwgSUV4ZWN1dGFibGVFeHRlbnNpb24KLXsKLSAgcHJpdmF0ZSAgIFN0cmluZyAgICAgICAgICAgICAgICAgIGljb25CYW5uZXJOYW1lXzsKLSAgcHJpdmF0ZSAgIEJ1bmRsZSAgICAgICAgICAgICAgICAgIGJ1bmRsZV87Ci0gIHByaXZhdGUgICBTaW1wbGVDYW5GaW5pc2hSZWdpc3RyeSBjYW5GaW5pc2hSZWdpc3RyeV87IAotICBwcml2YXRlICAgV2l6YXJkUGFnZU1hbmFnZXIgICAgICAgcGFnZU1hbmFnZXJfOwotICBwcml2YXRlICAgU3RyaW5nICAgICAgICAgICAgICAgICAgd2l6YXJkVGl0bGVfOwotICBwcml2YXRlICAgSVdpemFyZFBhZ2UgICAgICAgICAgICAgc3RhcnRQYWdlXyA9IG51bGw7Ci0gIAotICBwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50ICAgd2l6YXJkRWxlbWVudF87Ci0gIHByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgICBvcmlnaW5hbEVsZW1lbnRfOwotICBwcm90ZWN0ZWQgQ29tbWFuZFdpZGdldEJpbmRpbmcgICAgY29tbWFuZFdpZGdldEJpbmRpbmdfOwotICAKLSAgcHVibGljIER5bmFtaWNXaXphcmQoKQotICB7Ci0Jc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgRHluYW1pYyB3aXphcmQgaXMgY3JlYXRlZCBieSBlY2xpcHNlLgotICAgKiBXZSBuZWVkIHRvIGZpbmQgYSBkeW5hbWljV2l6YXJkIGV4dGVuc2lvbiBwb2ludCB0aGF0IG1hdGNoZXMgdGhlIGlkCi0gICAqIGZvciB0aGlzIHdpemFyZC4gIE9uY2UgdGhlIGV4dGVuc2lvbiBwb2ludCBpcyBmb3VuZCBpdCB3aWxsIGNvbnRhaW4KLSAgICogYSByZWZlcmVuY2UgdG8gYSBDb21tYW5kV2lkZ2V0QmluZGluZyBjbGFzcyB3aGljaCBkZWZpbmVzIHRoZSB3aWRnZXRzIAotICAgKiBhbmQgY29tbWFuZHMgZm9yIHRoaXMgd2l6YXJkLgotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICAgICAgZGF0YSApCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyB3aXphcmRJZCAgID0gY29uZmlnLmdldEF0dHJpYnV0ZSggImlkIiApOwotICAgIAotICAgIHNldEluaXRpYWxEYXRhKCB3aXphcmRJZCApOwotICAgIG9yaWdpbmFsRWxlbWVudF8gPSBjb25maWc7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdGhlIER5bmFtaWMgV2l6YXJkIGlzIGJlaW5nCi0gICAqIGxhdW5jaGVkIHRocm91Z2ggc29tZSBvdGhlciBtZWNoYW5pc2Ugb3RoZXIgdGhhbiB0aGUgRWNsaXBzZSBOZXcgV2l6YXJkCi0gICAqIG1lY2hhbmlzbS4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nICAgICAgICB0aGUgY29tbWFuZCB3aWRnZXQgYmluZGluZyBmb3IgdGhpcyB3aXphcmQuCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yICAgICB0aGUgcGx1Z2luIGRlc2NyaXB0b3Igd2hlcmUgdGhlIGljb24gYmFubmVyIGlzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGVkLgotICAgKiBAcGFyYW0gaWNvbkJhbm5lclBhdGggdGhlIGljb24gYmFubmVyIHBhdGggZm9yIHRoaXMgd2l6YXJkLiAgVGhlIHBhdGgKLSAgICogICAgICAgICAgICAgICAgICAgICAgIGlzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gc3BlY2lmaWVkIGJ5IHRoZSAKLSAgICogICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgcGFyYW1ldGVyLgotICAgKiBAcGFyYW0gd2l6YXJkVGl0bGUgICAgdGhlIHdpemFyZCB0aXRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbERhdGEoIENvbW1hbmRXaWRnZXRCaW5kaW5nIGJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgICAgICAgICAgICAgICBidW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgICAgICAgICAgICAgICBpY29uQmFubmVyUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgICAgIHdpemFyZFRpdGxlICkKLSAgewotICAgIGNvbW1hbmRXaWRnZXRCaW5kaW5nXyA9IGJpbmRpbmc7Ci0gICAgYnVuZGxlXyAgICAgICAgICAgICAgID0gYnVuZGxlOwotICAgIGljb25CYW5uZXJOYW1lXyAgICAgICA9IGljb25CYW5uZXJQYXRoOwotICAgIHdpemFyZFRpdGxlXyAgICAgICAgICA9IHdpemFyZFRpdGxlOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgaW5pdGlhbCBkYXRhIGJhc2VkIG9uIHRoZSBkeW5hbWljIHdpemFyZCBpZC4KLSAgICogCi0gICAqIEBwYXJhbSB3aXphcmRJZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5pdGlhbERhdGEoIFN0cmluZyB3aXphcmRJZCApIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgICAgcmVnaXN0cnkgICAgICA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgSUV4dGVuc2lvblBvaW50ICAgICAgIHBvaW50ICAgICAgICAgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiKTsKLSAgICBJRXh0ZW5zaW9uW10gICAgICAgICAgZXh0ZW5zaW9ucyAgICA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgd2l6YXJkSW5kZXggICA9IC0xOwotICAgIAotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBleHRlbnNpb25zLmxlbmd0aDsgaW5kZXgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25zW2luZGV4XS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIAotICAgICAgaWYoIGVsZW1lbnRzLmxlbmd0aCA9PSAxICYmIGVsZW1lbnRzWzBdLmdldE5hbWUoKS5lcXVhbHMoICJkeW5hbWljV2l6YXJkIikgKSAKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGlkID0gZWxlbWVudHNbMF0uZ2V0QXR0cmlidXRlKCAiaWQiICk7Ci0gICAgICAgIAotICAgICAgICBpZiggaWQgIT0gbnVsbCAmJiBpZC5lcXVhbHMoIHdpemFyZElkICkgKQotICAgICAgICB7Ci0gICAgICAgICAgd2l6YXJkRWxlbWVudF8gPSBlbGVtZW50c1swXTsKLSAgICAgICAgICB3aXphcmRJbmRleCAgID0gaW5kZXg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYoIHdpemFyZEVsZW1lbnRfICE9IG51bGwgKQotICAgIHsKLSAgICAgIGNvbW1hbmRXaWRnZXRCaW5kaW5nXyA9IChDb21tYW5kV2lkZ2V0QmluZGluZyl3aXphcmRFbGVtZW50Xy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCAiY2xhc3MiICk7Ci0gICAgICBidW5kbGVfICAgICAgICAgICAgICAgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZXh0ZW5zaW9uc1t3aXphcmRJbmRleF0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgaWNvbkJhbm5lck5hbWVfICAgICAgID0gd2l6YXJkRWxlbWVudF8uZ2V0QXR0cmlidXRlKCAiaWNvbmJhbm5lciIgKTsKLSAgICAgIHdpemFyZFRpdGxlXyAgICAgICAgICA9IHdpemFyZEVsZW1lbnRfLmdldEF0dHJpYnV0ZSggInRpdGxlIiApOwotICAgIH0KLSAgICAKLSAgICBpZiggY29tbWFuZFdpZGdldEJpbmRpbmdfID09IG51bGwgKQotICAgIHsKLSAgICAgIE1lc3NhZ2VVdGlscyBtc2cgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldHMuZW52aXJvbm1lbnQiLCB0aGlzICk7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyggU3RhdHVzLkVSUk9SLCAiaWQiLCAwLCBtc2cuZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9XSVpBUkRfSURfTk9UX0ZPVU5EIiwgbmV3IFN0cmluZ1tdeyB3aXphcmRJZH0pICwgbnVsbCApOwotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIHN0YXR1cyApOwotICAgIH0KLSAgfQotICAgIAotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBlY2xpcHNlIGZyYW1ld29yayB0byBpbml0aWFsaXplIHRoZQotICAgKiB3aXphcmQuIAotICAgKiAKLSAgICogQHBhcmFtIHdvcmtiZW5jaCB0aGUgZWNsaXBzZSB3b3JrYmVuY2gKLSAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gdGhhdCB0aGUgdXNlciBoYXMgbWFkZSB3aXRoaW4KLSAgICogICAgICAgICAgICAgICAgICBlY2xpcHNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdCAoIElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gKQotICB7ICAgIAotICAgIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgY29udGV4dCAgICAgICAgPSBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmdldEluc3RhbmNlKCk7Ci0gICAgRWNsaXBzZVN0YXR1c0hhbmRsZXIgICAgICBoYW5kbGVyICAgICAgICA9IG5ldyBFY2xpcHNlU3RhdHVzSGFuZGxlcigpOwotICAgIEVjbGlwc2VQcm9ncmVzc01vbml0b3IgICAgbW9uaXRvciAgICAgICAgPSBuZXcgRWNsaXBzZVByb2dyZXNzTW9uaXRvcigpOwotICAgIEVjbGlwc2VFbnZpcm9ubWVudCAgICAgICAgZW52aXJvbm1lbnQgICAgPSBuZXcgRWNsaXBzZUVudmlyb25tZW50KCBudWxsLCBjb250ZXh0LCBtb25pdG9yLCBoYW5kbGVyICk7Ci0gICAgCi0gICAgRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwgZGF0YVJlZ2lzdHJ5XyAgID0gbmV3IERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsKCk7Ci0gICAgU2ltcGxlV2lkZ2V0UmVnaXN0cnkgICAgd2lkZ2V0UmVnaXN0cnlfID0gbmV3IFNpbXBsZVdpZGdldFJlZ2lzdHJ5KCk7Ci0gICAgCi0gICAgRGF0YUZsb3dNYW5hZ2VyICAgIGRhdGFNYW5hZ2VyICAgID0gbmV3IERhdGFGbG93TWFuYWdlciggZGF0YVJlZ2lzdHJ5XywgZW52aXJvbm1lbnQgKTsKLSAgICAKLSAgICBzdGFydFBhZ2VfICAgICAgICAgPSBudWxsOwotICAgIGNhbkZpbmlzaFJlZ2lzdHJ5XyA9IG5ldyBTaW1wbGVDYW5GaW5pc2hSZWdpc3RyeSgpOyAKLSAgICBwYWdlTWFuYWdlcl8gICAgICAgPSBuZXcgV2l6YXJkUGFnZU1hbmFnZXIoIHdpZGdldFJlZ2lzdHJ5XywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXaXphcmRQYWdlRmFjdG9yeSgpLCAKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTWFuYWdlciwKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ICk7ICAKLSAgICAKLSAgICBwYWdlTWFuYWdlcl8uc2V0Um9vdEZyYWdtZW50KCBnZXRSb290RnJhZ21lbnQoIHNlbGVjdGlvbiwgcGFnZU1hbmFnZXJfICkgKTsKLSAgICAKLSAgICBjb21tYW5kV2lkZ2V0QmluZGluZ18ucmVnaXN0ZXJXaWRnZXRNYXBwaW5ncyggd2lkZ2V0UmVnaXN0cnlfICk7Ci0gICAgY29tbWFuZFdpZGdldEJpbmRpbmdfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnlfICk7Ci0gICAgY29tbWFuZFdpZGdldEJpbmRpbmdfLnJlZ2lzdGVyQ2FuRmluaXNoKCBjYW5GaW5pc2hSZWdpc3RyeV8gKTsKLSAgICAgICAgCi0gICAgLy8gSWYgYSBwYWdlIGlzIG5vdCBjb21wbGV0ZSBlbnN1cmUgdGhhdCBjYW5GaW5pc2ggaXMgZmFsc2UuCi0gICAgQ29uZGl0aW9uIGNhbkZpbmlzaCA9IG5ldyBDb25kaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbHVhdGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXaXphcmRQYWdlIGN1cnJlbnRQYWdlID0gcGFnZU1hbmFnZXJfLmdldEN1cnJlbnRQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGFnZSAhPSBudWxsID8gY3VycmVudFBhZ2UuaXNQYWdlQ29tcGxldGUoKSA6IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAKLSAgICAKLSAgICBjYW5GaW5pc2hSZWdpc3RyeV8uYWRkKCBjYW5GaW5pc2ggKTsKLSAgICAKLSAgICAvLyBTZXQgdGhhdCB3ZSBuZWVkIGEgcHJvZ3Jlc3MgbW9uaXRvci4KLSAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvciggdHJ1ZSApOwotICAgIAotICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBuZXh0L2JhY2sgYnV0dG9ucyBhcmUgZW5hYmxlZC4KLQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnMoIHRydWUgKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIGljb24gYmFubmVyIGlmIHNwZWNpZmllZC4KLSAgICBpZiggaWNvbkJhbm5lck5hbWVfICE9IG51bGwgJiYgaWNvbkJhbm5lck5hbWVfLmxlbmd0aCgpID4gMCApCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSTCBpbnN0YWxsVVJMICAgICAgICA9IGJ1bmRsZV8uZ2V0RW50cnkoIi8iKTsKLSAgICAgICAgVVJMIGltYWdlVVJMICAgICAgICAgID0gbmV3IFVSTChpbnN0YWxsVVJMLCBpY29uQmFubmVyTmFtZV8gKTsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotICAgICAgICAKLSAgICAgICAgaWYoIGltYWdlICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoIGltYWdlICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYoIHdpemFyZFRpdGxlXyAhPSBudWxsICYmIHdpemFyZFRpdGxlXy5sZW5ndGgoKSA+IDAgKQotICAgIHsKLSAgICAgIHNldFdpbmRvd1RpdGxlKCB3aXphcmRUaXRsZV8gKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMuCi0gIHByb3RlY3RlZCBXaXphcmRQYWdlRmFjdG9yeSBnZXRXaXphcmRQYWdlRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVBhZ2VGYWN0b3J5KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgcGFnZXMgYXJlIGNvbXBsZXRlLgotICAqIEByZXR1cm4gVHJ1ZSBpZiBhbGwgcGFnZXMgYXJlIGNvbXBsZXRlLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2ggKCkKLSAgewotICAJaW50ICAgICBsZW5ndGggPSBjYW5GaW5pc2hSZWdpc3RyeV8uc2l6ZSgpOwotICAJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAJCi0gICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgQ29uZGl0aW9uIGNvbmRpdGlvbiA9IChDb25kaXRpb24pY2FuRmluaXNoUmVnaXN0cnlfLmVsZW1lbnRBdCggaW5kZXggKTsKLSAgICAKLSAgICAgIHJlc3VsdCA9IGNvbmRpdGlvbi5ldmFsdWF0ZSgpOwotICAgICAgCi0gICAgICBpZiggIXJlc3VsdCApIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBwYWdlIGZvciB0aGlzIHdpemFyZC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBwYWdlIGZvciB0aGlzIHdpemFyZC4KLSAgKiovCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXRTdGFydGluZ1BhZ2UoKQotICB7Ci0gIAlpZiggc3RhcnRQYWdlXyA9PSBudWxsICkKLSAgCXsKLSAgCQlzdGFydFBhZ2VfID0gcGFnZU1hbmFnZXJfLmdldE5leHRQYWdlKCk7Ci0gIAl9Ci0gIAkKLSAgICByZXR1cm4gc3RhcnRQYWdlXzsKLSAgfQotCi0gIC8qKgotICAgICogUmV0dXJucyB0aGUgbmV4dCBwYWdlIGFmdGVyIHBhZ2UgYW5kCi0gICAgKiBydW5zIHRoZSBhcHByb3ByaWF0ZSB0YXNrcy4KLSAgICAqCi0gICAgKiBAcmV0dXJuIHRoZSBuZXh0IHBhZ2UgYWZ0ZXIgcGFnZS4KLSAgKiovCi0gIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSggSVdpemFyZFBhZ2UgcGFnZSApCi0gIHsgICAKLSAgICByZXR1cm4gcGFnZU1hbmFnZXJfLmdldE5leHRQYWdlKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoICgpCi0gIHsgCi0gIAlyZXR1cm4gcGFnZU1hbmFnZXJfLnBlcmZvcm1GaW5pc2goKTsKLSAgfQotCi0gIC8qKgotICAgKiBVbmRvIGZyYWdtZW50cwotICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsICgpCi0gIHsKLSAgCXJldHVybiBwYWdlTWFuYWdlcl8ucGVyZm9ybUNhbmNlbCgpOwotICB9ICAKLSAgICAgIAotICBwcm90ZWN0ZWQgQ29tbWFuZEZyYWdtZW50IGdldFJvb3RGcmFnbWVudCggSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBXaXphcmRQYWdlTWFuYWdlciBwYWdlTWFuYWdlciApCi0gIHsKLSAgICBTZXF1ZW5jZUZyYWdtZW50IHJvb3QgPSBuZXcgU2VxdWVuY2VGcmFnbWVudCgpOwotICAgIAotICAgIHJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBTZWxlY3Rpb25Db21tYW5kKCBzZWxlY3Rpb24gKSwgIiIgKSApOwotICAgIHJvb3QuYWRkKCBuZXcgU2ltcGxlRnJhZ21lbnQoIG5ldyBDdXJyZW50UGFnZUNvbW1hbmQoIHBhZ2VNYW5hZ2VyICksICIiICkgKTsKLSAgICByb290LmFkZCggY29tbWFuZFdpZGdldEJpbmRpbmdfLmNyZWF0ZSgpLmNyZWF0ZSgpICk7Ci0gICAgCi0gICAgcmV0dXJuIHJvb3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gd2l6YXJkRWxlbWVudF87Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvUGFnZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9QYWdlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmFkN2IyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9QYWdlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotCi0KLXB1YmxpYyBjbGFzcyBQYWdlSW5mbyAKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgcGFnZU5hbWVfOwotICBwcml2YXRlIFN0cmluZyAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGVfOwotICBwcml2YXRlIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB3aWRnZXRGYWN0b3J5XzsKLSAgCi0gIHB1YmxpYyBQYWdlSW5mbyggU3RyaW5nICAgICAgICAgICAgICAgICAgIHBhZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHdpZGdldEZhY3RvcnkgKQotICB7Ci0gICAgcGFnZU5hbWVfICAgICAgID0gcGFnZU5hbWU7Ci0gICAgcGFnZVRpdGxlXyAgICAgID0gcGFnZVRpdGxlOwotICAgIHdpZGdldEZhY3RvcnlfICA9IHdpZGdldEZhY3Rvcnk7Ci0gIH0gICAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFnZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHBhZ2VOYW1lXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQYWdlVGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIHBhZ2VUaXRsZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gd2lkZ2V0RmFjdG9yeV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9QYWdlV2l6YXJkRGF0YUV2ZW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1BhZ2VXaXphcmREYXRhRXZlbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Yzg1ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1BhZ2VXaXphcmREYXRhRXZlbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotCi0vKioKLSAqIER5bmFtaWMgd2l6YXJkIGltcGxlbWVudGF0aW9ucyB0aGF0IHdhbnQgdG8gY3JlYXRlIGRpZmZlcmVudAotICoga2luZHMgb2Ygd2l6YXJkIHBhZ2VzIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogVGhlIFdpemFyZFBhZ2VGYWN0b3J5IHJldHVybnMgYSBjbGFzcyBvZiB0aGlzIHR5cGUuCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhZ2VXaXphcmREYXRhRXZlbnRzIGV4dGVuZHMgSVdpemFyZFBhZ2UKLXsKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIFdpZGdldERhdGFFdmVudHMgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIGFkZENvbnRyb2xzCi0gICAqIG1ldGhvZCBvZiBhIFdpZGdldENvbnRyaWJ1dG9yLgotICAgKi8KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgZ2V0RGF0YUV2ZW50cygpOwotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGF0IHRoaXMgd2l6YXJkIHBhZ2UgaXMgY29tcGxldGUuIAotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVQYWdlVG9TdGF0dXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TZWxlY3Rpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2VsZWN0aW9uQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RhMWUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TZWxlY3Rpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci0KLQotLyoqCi0gKiBUaGlzIFNlbGVjdGlvbkNvbW1hbmQgaXMgZXhlY3V0ZSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlCi0gKiBkeW5hbWljIHdpemFyZC4gIENvbW1hbmRzIGV4ZWN1dGVkIGluIHRoZSB3aXphcmQgdGhhdCBuZWVkCi0gKiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gY2FuIGdldCBpdCB0aHJvdWdoIGEgZGF0YSBtYXBwaW5nIGZyb20gCi0gKiB0aGlzIGNvbW1hbmQgdG8gdGhlIGNvbW1hbmQgdGhhdCBuZWVkcyBpdC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25Db21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0gIAotICBwdWJsaWMgU2VsZWN0aW9uQ29tbWFuZCggSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotICAgIHNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAKLSAgfQotICAKLSAgcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEluaXRpYWxTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGlvbl87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDYW5GaW5pc2hSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZUNhbkZpbmlzaFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGJlNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZUNhbkZpbmlzaFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Db25kaXRpb247Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ2FuRmluaXNoUmVnaXN0cnkgZXh0ZW5kcyBWZWN0b3IgaW1wbGVtZW50cyBDYW5GaW5pc2hSZWdpc3RyeQotewotCi0gIC8qKgotICAgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzI4NTgzNzg3MDc0MTMwNUw7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi53aWRnZXRzLkNhbkZpbmlzaFJlZ2lzdHJ5I2FkZENvbmRpdGlvbihvcmcuZWNsaXBzZS5lbnYuY29tbWFuZC5mcmFnbWVudC5Db25kaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb25kaXRpb24oQ29uZGl0aW9uIGNvbmRpdGlvbikKLSAgewotICAgIGFkZCggY29uZGl0aW9uICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZmIzYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YUZsb3dNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnRFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuRnJhZ21lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGV4ZWN1dGlvbiBvZiBDb21tYW5kcyBpbiBhIGZsb3cgb2YgQ29tbWFuZEZyYWdtZW50cy4KLSAqIFRoZSBidWxrIG9mIHRoaXMgd29yayBpcyBkb25lIGJ5IHRoZSBDb21tYW5kRnJhZ21lbnRFbmdpbmUuICBUaGUgbWFpbiBqb2Igb2YKLSAqIHRoaXMgY2xhc3MgaXMgcnVuIHRoZSBmcmFnbWVudHMgaW4gYSBwYXJ0aWN1bGFyIHRyYW5zYWN0aW9uYWwgZW52aXJvbm1lbnQuCi0gKiBBIGZyYWdtZW50IGhhcyBhIG1ldGhvZCBjYWxsZWQgZG9Ob3RSdW5JblRyYW5zYWN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCi0gKiBpZiBpdHMgY29tbWFuZHMgc2hvdWxkIGJlIHJ1biBpbiBhIHRyYW5zYWN0aW9uIG9yIG5vdC4gIElmIHRoaXMgbWV0aG9kIHJldHVybnMKLSAqIHRydWUoaWUuIG5vdCBpbiBhIHRyYW5zYWN0aW9uKSB0aGUgQ29tbWFuZHMgYXJlIHdyYXBwZWQgaW4gYSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MuCi0gKiBJZiBmYWxzZSggaWUuIGluIGEgdHJhbnNhY3Rpb24gKSB0aGUgQ29tbWFuZHMgYXJlIHdyYXBwZWQgaW4gYSBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24uIAotICoKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyCi17Ci0gIHByb3RlY3RlZCBDb21tYW5kRnJhZ21lbnRFbmdpbmUgZW5naW5lXzsKLSAgcHJvdGVjdGVkIERhdGFGbG93TWFuYWdlciAgICAgICBkYXRhTWFuYWdlcl87Ci0gIHByaXZhdGUgICBFY2xpcHNlRW52aXJvbm1lbnQgICAgZW52aXJvbm1lbnRfOwotICAKLSAgcHJpdmF0ZSAgIGJvb2xlYW4gICAgICAgICAgICAgICBmb3VuZFN0b3BfOwotICBwcml2YXRlICAgYm9vbGVhbiAgICAgICAgICAgICAgIGRvTm90UnVuSW5UcmFuc2FjdGlvbl87Ci0gIAotICBwdWJsaWMgU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIoIEVjbGlwc2VFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgRGF0YUZsb3dNYW5hZ2VyIGRhdGFNYW5hZ2VyICkKLSAgewotICAgIGVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICAgIGRhdGFNYW5hZ2VyXyA9IGRhdGFNYW5hZ2VyOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0cyB0aGUgcm9vdCBmcmFnbWVudC4gIFRoZSBleGVjdXRpb24gZW5naW5lIHdpbGwgc3RhcnQgZXhlY3V0aW5nIGNvbW1hbmRzCi0gICAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyByb290IGZyYWdtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHJvb3QgdGhlIHJvb3QgZnJhZ21lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSb290RnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCByb290ICkKLSAgewotICAJZW5naW5lXyA9IG5ldyBDb21tYW5kRnJhZ21lbnRFbmdpbmUoIHJvb3QsIGRhdGFNYW5hZ2VyXywgZW52aXJvbm1lbnRfICk7Ci0JCi0JZW52aXJvbm1lbnRfLnNldENvbW1hbmRNYW5hZ2VyKCBlbmdpbmVfICk7Ci0gIAkKLSAgICBlbmdpbmVfLnNldFBlZWtGcmFnbWVudExpc3RlbmVyKCAKLSAgICAgIG5ldyBGcmFnbWVudExpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljICBib29sZWFuIG5vdGlmeSggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBwZWVrRnJhZ21lbnQoIGZyYWdtZW50ICk7Ci0gICAgICAgIH0KLSAgICAgIH0gKTsgIAotICAgICAgICAgICAgICAgICAgCi0gICAgZW5naW5lXy5zZXROZXh0RnJhZ21lbnRMaXN0ZW5lciggCi0gICAgICBuZXcgRnJhZ21lbnRMaXN0ZW5lcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyAgYm9vbGVhbiBub3RpZnkoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV4dEZyYWdtZW50KCBmcmFnbWVudCApOwotICAgICAgICB9Ci0gICAgICB9ICk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQllbmdpbmVfLnNldFVuZG9GcmFnbWVudExpc3RlbmVyKAotICAgICAgbmV3IEZyYWdtZW50TGlzdGVuZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBub3RpZnkoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdW5kb0ZyYWdtZW50KCBmcmFnbWVudCApOwotICAgICAgICB9Ci0gICAgICB9ICk7ICAgICAgICAgICAgICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGUgQ29tbWFuZEZyYWdtZW50RW5naW5lIGNhbGxzIHRoaXMgbWV0aG9kIHdoZW4gaXQgaXMgcGVla2luZyBmb3J3YXJkCi0gICAqIGluIHRoZSBmcmFnbWVudHMuICBXaGVuIHBlZWtpbmcgZm9yd2FyZCB0aGUgY29tbWFuZCBzdGFjayBzdGF0ZSBpbiB0aGUKLSAgICogZW5naW5lIGlzIG5vdCBjaGFuZ2VzLgotICAgKiAKLSAgICogCi0gICAqIEBwYXJhbSBmcmFnbWVudCB0aGUgZnJhZ21lbnQgdGhhdCBpdCBpcyBwZWVraW5nIGF0LgotICAgKiBAcmV0dXJuIEluZGljYXRlcyB3aGV0aGVyIHBlZWtpbmcgc2hvdWxkIHN0b3Agb3Igbm90LgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcGVla0ZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7ICAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZSBDb21tYW5kRnJhZ21lbnRFbmdpbmUgY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiBpdCBpcyBtb3ZpbmcgZm9yd2FyZAotICAgKiBpbiB0aGUgZnJhZ21lbnRzLiAgIFdoZW4gbW92aW5nIGZvcndhcmQgdGhlIGNvbW1hbmQgc3RhY2sgc3RhdGUgaXMgc2F2ZWQKLSAgICogYXQgZWFjaCBmcmFnbWVudCBpcyB0cmF2ZXJzZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZnJhZ21lbnQgdGhlIGZyYWdtZW50IHRoYXQgaXMgYmVpbmcgdHJhdmVyc2VkLgotICAgKiBAcmV0dXJuIGluZGljYXRlcyBpZiB0aGUgZm9yd2FyZCB0cmF2ZXJzYWwgc2hvdWxkIGNvbnRpbnVlLiAgCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBuZXh0RnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsgICAgIAotICAgIGlmKCBmcmFnbWVudC5kb05vdFJ1bkluVHJhbnNhY3Rpb24oKSAhPSBkb05vdFJ1bkluVHJhbnNhY3Rpb25fICkKLSAgICB7Ci0gICAgICAvLyBUaGUgZnJhZ21lbnQgaXMgcmVxdWVzdGluZyBhIGRpZmZlcmVudCB0cmFuc2FjdGlvbiBlbnZpcm9ubWVudCB0aGFuCi0gICAgICAvLyB0aGUgb25lIHRoYXQgd2UgYXJlIGluIHNvIHdlIG11c3Qgc3RvcCBhbmQgY2hhbmdlIGVudmlyb25tZW50cy4KLSAgICAgIGRvTm90UnVuSW5UcmFuc2FjdGlvbl8gPSBmcmFnbWVudC5kb05vdFJ1bkluVHJhbnNhY3Rpb24oKTsKLSAgICAgIGZvdW5kU3RvcF8gICAgICAgICAgICAgPSBmYWxzZTsgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZvdW5kU3RvcF87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGVhY2ggZnJhZ21lbnQgd2hlbiB0aGUgY29tbWFuZCBlbmdpbmUgaXMgdW53aW5kaW5nCi0gICAqIGl0cyBzdGFjayBkdXJpbmcgYW4gdW5kbyBvcGVyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZnJhZ21lbnQgIHRoZSBmcmFnbWVudCBiZWluZyB1bmRvbmUuCi0gICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoZSB1bmRvIHByb2Nlc3Mgc2hvdWxkIGNvbnRpbnVlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdW5kb0ZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7ICAJICAJCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgICAKLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgZXhlY3V0ZXMgdGhlIENvbW1hbmRGcmFnbWVudCBjb21tYW5kcyBpbiB0aGUgY29udGV4dCBwcm92aWRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0Ci0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgc3RhdHVzIG9mIGV4ZWN1dGluZyB0aGUgY29tbWFuZHMuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHJ1bkZvcndhcmRUb05leHRTdG9wKCBJUnVubmFibGVDb250ZXh0IGNvbnRleHQgKQotICB7Ci0gICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgCi0gIAlkb05vdFJ1bkluVHJhbnNhY3Rpb25fID0gZmFsc2U7Ci0gIAkKLSAgCWRvCi0gIAl7Ci0gIAkgIC8vIFdlIHdpbGwgc3RvcCB1bmxlc3Mgd2UgYXJlIGNoYW5naW5nIHRyYW5zYWN0aW9uIG1vZGVzLgotICAgICAgZm91bmRTdG9wXyA9IHRydWU7Ci0gICAgICAKLSAgCSAgaWYoIGRvTm90UnVuSW5UcmFuc2FjdGlvbl8gKQotICAJICB7Ci0gIAkgICAgb3BlcmF0aW9uID0gZ2V0Tm9UcmFuc2FjdGlvbk9wZXJhdGlvbigpOwotICAJICB9Ci0gIAkgIGVsc2UKLSAgCSAgewotICAJICAgIG9wZXJhdGlvbiA9IGdldFRyYW5zYWN0aW9uT3BlcmF0aW9uKCk7Ci0gIAkgIH0KLSAgCSAgCi0gICAJICB0cnkKLSAgCSAgeyAgCSAgIAotICAJICAgIGlmKCBjb250ZXh0ID09IG51bGwgKQotICAJICAgIHsKLSAgCSAgIAkgIC8vIFdlIGRvbid0IGhhdmUgYSBjb250YWluZXIgeWV0IHNvIGp1c3QgcnVuIHRoZSBvcGVyYXRpb24uCi0gIAkgICAJICBvcGVyYXRpb24ucnVuKCBudWxsICk7Ci0gIAkgICAgfQotICAJICAgIGVsc2UKLSAgCSAgICB7Ci0gIAkgICAJICAvLyBXZSBoYXZlIGEgY29udGFpbmVyIHdoZXJlIHRoaXMgb3BlcmF0aW9uIGNhbiBydW4gYW5kIGhhdmUKLSAgCSAgIAkgIC8vIGl0cyBwcm9ncmVzcyBkaXNwbGF5ZWQuCi0gIAkgICAgICBjb250ZXh0LnJ1biggZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24gKTsKLSAgCSAgICB9Ci0gIAkgIH0KLSAgCSAgY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGV4YyApCi0gIAkgIHsKLSAgCSAgICAvL1RPRE8gc2hvdWxkIGxvZyB0aGVzZSBleGNlcHRpb25zLgotICAJICAgIGV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLSAgCSAgfQotICAJICBjYXRjaCggSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMgKQotICAJICB7Ci0gIAkgICAgLy9UT0RPIHNob3VsZCBsb2cgdGhlc2UgZXhjZXB0aW9ucy4KLSAgCSAgICBleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0gIAkgIH0KLSAgCX0gIAotICAJd2hpbGUoICFmb3VuZFN0b3BfICk7IAotICAJCi0gIAlyZXR1cm4gZW5naW5lXy5nZXRMYXN0U3RhdHVzKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGdldFRyYW5zYWN0aW9uT3BlcmF0aW9uKCkKLSAgewotICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgLy9Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpCi0gICAgLy97Ci0gICAgLy8gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgICB7Ci0gICAgICAgIEVjbGlwc2VQcm9ncmVzc01vbml0b3IgZWNsaXBzZU1vbml0b3IgPSAoRWNsaXBzZVByb2dyZXNzTW9uaXRvcillbnZpcm9ubWVudF8uZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgIGVjbGlwc2VNb25pdG9yLnNldE1vbml0b3IoIG1vbml0b3IgKTsKLSAgICAgICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImNvbW1hbmQiLCA1MDAyLCB0aGlzLCAiZ2V0VHJhbnNhY3Rpb25PcGVyYXRpb24iLCAiU3RhcnQgb2YgdHJhbnNhY3Rpb24iKTsKLSAgICAgICAgZW5naW5lXy5tb3ZlRm9yd2FyZFRvTmV4dFN0b3AoKTsKLSAgICAgICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImNvbW1hbmQiLCA1MDAzLCB0aGlzLCAiZ2V0VHJhbnNhY3Rpb25PcGVyYXRpb24iLCAiRW5kIG9mIHRyYW5zYWN0aW9uIik7Ci0gICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICByZXR1cm4gb3BlcmF0aW9uOwotICB9Ci0gIAotICBwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXROb1RyYW5zYWN0aW9uT3BlcmF0aW9uKCkKLSAgewotICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciApCi0gICAgICB7Ci0gICAgICAgIEVjbGlwc2VQcm9ncmVzc01vbml0b3IgZWNsaXBzZU1vbml0b3IgPSAoRWNsaXBzZVByb2dyZXNzTW9uaXRvcillbnZpcm9ubWVudF8uZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgIGVjbGlwc2VNb25pdG9yLnNldE1vbml0b3IoIG1vbml0b3IgKTsKLSAgICAgICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImNvbW1hbmQiLCA1MDg1LCB0aGlzLCAiZ2V0Tm9UcmFuc2FjdGlvbk9wZXJhdGlvbiIsICJTdGFydCBvZiBOT04gdHJhbnNhY3Rpb24iKTsKLSAgICAgICAgZW5naW5lXy5tb3ZlRm9yd2FyZFRvTmV4dFN0b3AoKTsKLSAgICAgICAgZW52aXJvbm1lbnRfLmdldExvZygpLmxvZyhMb2cuSU5GTywgImNvbW1hbmQiLCA1MDg2LCB0aGlzLCAiZ2V0Tm9UcmFuc2FjdGlvbk9wZXJhdGlvbiIsICJFbmQgb2YgTk9OIHRyYW5zYWN0aW9uIik7Ci0gICAgICB9Ci0gICAgfTsgCi0gICAgCi0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBhZ2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUGFnZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwMmU2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZVBhZ2VGYWN0b3J5IGltcGxlbWVudHMgV2l6YXJkUGFnZUZhY3RvcnkKLXsgICAKLSAgcHVibGljIFBhZ2VXaXphcmREYXRhRXZlbnRzIGdldFBhZ2UoIFBhZ2VJbmZvIHBhZ2VJbmZvLCBXaXphcmRQYWdlTWFuYWdlciBtYW5hZ2VyICkKLSAgewotICAgIHJldHVybiBuZXcgU2ltcGxlV2l6YXJkUGFnZSggcGFnZUluZm8sIG1hbmFnZXIgKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBvcHVwUGFnZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVQb3B1cFBhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTk2ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBvcHVwUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLQotcHVibGljIGNsYXNzIFNpbXBsZVBvcHVwUGFnZUZhY3RvcnkgaW1wbGVtZW50cyBXaXphcmRQYWdlRmFjdG9yeQoteyAgIAotICBwcml2YXRlIFN0cmluZyBpZF87Ci0gIAotICBwdWJsaWMgU2ltcGxlUG9wdXBQYWdlRmFjdG9yeSggU3RyaW5nIGlkICkKLSAgewotICAgIGlkXyA9IGlkOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBQYWdlV2l6YXJkRGF0YUV2ZW50cyBnZXRQYWdlKCBQYWdlSW5mbyBwYWdlSW5mbywgV2l6YXJkUGFnZU1hbmFnZXIgbWFuYWdlciApCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVBvcHVwV2l6YXJkUGFnZSggcGFnZUluZm8sIG1hbmFnZXIsIGlkXyApOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUG9wdXBXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlUG9wdXBXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjM5OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVBvcHVwV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLQotcHVibGljIGNsYXNzIFNpbXBsZVBvcHVwV2l6YXJkUGFnZSBleHRlbmRzIFNpbXBsZVdpemFyZFBhZ2UKLXsgIAotICBwcml2YXRlIFN0cmluZyBpZF87Ci0gIAotICBwdWJsaWMgU2ltcGxlUG9wdXBXaXphcmRQYWdlKCBQYWdlSW5mbyBwYWdlSW5mbywgV2l6YXJkUGFnZU1hbmFnZXIgcGFnZU1hbmFnZXIsIFN0cmluZyBpZCApCi0gIHsKLSAgCXN1cGVyKCBwYWdlSW5mbywgcGFnZU1hbmFnZXIgKTsKLSAgCQotICAJaWRfID0gaWQ7Ci0gIH0gCSAgCi0gIAkKLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggQ29tcG9zaXRlIHBhcmVudCApIAotICB7Ci0gIAkgICAgICBDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTk9ORSApOwotICAJICAgICAgTWVzc2FnZVV0aWxzICAgICAgICAgICAgICAgICAgIG1zZ1V0aWxzICA9IG5ldyBNZXNzYWdlVXRpbHMoIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5lbnZpcm9ubWVudHVpIiwgdGhpcyApOwotICAJZmluYWwgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGNvbnRleHQgICA9IFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5nZXRJbnN0YW5jZSgpOwotICAJCi0gICAgR3JpZExheW91dCBncmlkbGF5b3V0ICAgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0gICAgCi0gICAgY29tcG9zaXRlLnNldExheW91dCggZ3JpZGxheW91dCApOwotICAgIEdyaWREYXRhIGdyaWRkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCApOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKCBncmlkZGF0YSApOwotICAgICAgCQotICAJc3VwZXIuY3JlYXRlQ29udHJvbCggY29tcG9zaXRlICk7Ci0gIAkKLSAgCS8vIElmIHRoZSBjdXJyZW50IHBhZ2UgaXMgbnVsbCB0aGVuIHRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgcGFnZS4KLSAgCWlmKCBwYWdlTWFuYWdlcl8uZ2V0Q3VycmVudFBhZ2UoKSA9PSBudWxsICYmIGNvbnRleHQuc2hvd0NoZWNrYm94KGlkXykgKQotICAJewotICAgICAgZmluYWwgIEJ1dHRvbiBidXR0b24gID0gbmV3IEJ1dHRvbiggY29tcG9zaXRlLCBTV1QuQ0hFQ0sgKTsKLSAgICAgIFN0cmluZyBsYWJlbCAgID0gbXNnVXRpbHMuZ2V0TWVzc2FnZSggIkNIRUNLQk9YX0RPX05PVF9TSE9XX0RJQUxPR19BR0FJTiIgKTsKLSAgICAgIAotICAgICAgLypDT05URVhUX0lEIFRXUDAwMDEgZm9yIHRoZSBzaG93L2hpZGUgY2hlY2sgYm94Ki8KLSAgICAgIFN0cmluZyBpbmZvcG9wID0JIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS5UV1AwMDAxIjsKLSAgICAgIFN0cmluZyB0b29sdGlwID0gbXNnVXRpbHMuZ2V0TWVzc2FnZSggIlRPT0xUSVBfRE9fTk9UX1NIT1dfRElBTE9HX0FHQUlOIiApOwotICAgICAgCi0gICAgICBidXR0b24uc2V0VGV4dCggbGFiZWwgKTsKLSAgICAgIGJ1dHRvbi5zZXRUb29sVGlwVGV4dCggdG9vbHRpcCApOwotICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggU2VsZWN0aW9uRXZlbnQgZXZ0ICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEFjdGlvbkRpYWxvZ0VuYWJsZWQoIGlkXywgYnV0dG9uLmdldFNlbGVjdGlvbigpICk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgYnV0dG9uLnNldFNlbGVjdGlvbiggZmFsc2UgKTsKLSAgICAgIAotICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCggYnV0dG9uLCBpbmZvcG9wICk7ICAJCi0gIAl9Ci0gIAkKLSAgCXNldENvbnRyb2woIGNvbXBvc2l0ZSApOwotICB9ICAKLX0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpZGdldENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjNmMzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgCi17Ci0gICAgcHJpdmF0ZSBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZmFjdG9yeV87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgbmFtZV87Ci0JcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25fOwotCXByaXZhdGUgU3RyaW5nICAgICAgICAgICAgICAgICAgIHRpdGxlXzsKLQkKLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIAotCXsKLQkJZGVzY3JpcHRpb25fID0gZGVzY3JpcHRpb247Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeShXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZmFjdG9yeSkgCi0JewotCQlmYWN0b3J5XyA9IGZhY3Rvcnk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgCi0JewotCQluYW1lXyA9IG5hbWU7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSAKLQl7Ci0JCXRpdGxlXyA9IHRpdGxlOwotCX0KLQkKLQotCXB1YmxpYyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZ2V0V2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgCi0JewotCQlyZXR1cm4gZmFjdG9yeV87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgCi0JewotCQlyZXR1cm4gbmFtZV87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIAotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uXzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgCi0JewotCQlyZXR1cm4gdGl0bGVfOwotCX0KLQotCS8qKgotCSAqIFN1YnNjbGFzc2VycyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIAotCXsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyNzI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2ltcGxlIFdpZGdldERhdGFDb250cmlidXRvciBjbGFzcyB0aGF0IGNvbmNyZXRlIAotICogV2lkZ2V0RGF0YUNvbnRyaWJ1dG9ycyBjYW4gc3ViY2xhc3MuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIGltcGxlbWVudHMgV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yCi17ICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjYWRkQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcikKLSAgICovCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKCBDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikKLSAgewotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3IjZ2V0U3RhdHVzKCkKLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZ2V0U3RhdHVzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50cyNleHRlcm5hbGl6ZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBleHRlcm5hbGl6ZSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHMjaW50ZXJuYWxpemUoKQotICAgKi8KLSAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaWRnZXRSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpZGdldFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODliY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1NpbXBsZVdpZGdldFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBTaW1wbGVXaWRnZXRSZWdpc3RyeSBpbXBsZW1lbnRzIFdpZGdldFJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgCi0gIHB1YmxpYyB2b2lkIGFkZCggU3RyaW5nIGZyYWdtZW50SWQsCi0gICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWdlVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHdpZGdldEZhY3RvcnkgKQotICB7Ci0gIAlQYWdlSW5mbyBlbnRyeSA9IG5ldyBQYWdlSW5mbyggcGFnZU5hbWUsIHBhZ2VUaXRsZSwgd2lkZ2V0RmFjdG9yeSApOwotICAJdGFibGVfLnB1dCggZnJhZ21lbnRJZCwgZW50cnkgKTsKLSAgfSAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHB1YmxpYyBQYWdlSW5mbyBnZXRQYWdlSW5mbyggU3RyaW5nIGZyYWdtZW50SWQgKQotICB7Ci0gICAgcmV0dXJuIChQYWdlSW5mbyl0YWJsZV8uZ2V0KCBmcmFnbWVudElkICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvU2ltcGxlV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDgxMzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9TaW1wbGVXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0KLQotcHVibGljIGNsYXNzIFNpbXBsZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgUGFnZVdpemFyZERhdGFFdmVudHMKLXsKLSAgcHJpdmF0ZSAgIFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldF87Ci0gIHByaXZhdGUgICBXaWRnZXREYXRhRXZlbnRzICBkYXRhRXZlbnRzXzsKLSAgcHJpdmF0ZSAgIExpc3RlbmVyICAgICAgICAgIHN0YXR1c0xpc3RlbmVyXzsKLSAgcHJvdGVjdGVkIFdpemFyZFBhZ2VNYW5hZ2VyIHBhZ2VNYW5hZ2VyXzsKLSAgCQotICBwdWJsaWMgU2ltcGxlV2l6YXJkUGFnZSggUGFnZUluZm8gcGFnZUluZm8sIFdpemFyZFBhZ2VNYW5hZ2VyIHBhZ2VNYW5hZ2VyICkKLSAgewotICAJc3VwZXIoICIiICk7Ci0gIAkKLSAgCXNldFRpdGxlKCBwYWdlSW5mby5nZXRQYWdlTmFtZSgpICk7Ci0gIAlzZXREZXNjcmlwdGlvbiggcGFnZUluZm8uZ2V0UGFnZVRpdGxlKCkpOwotICAJICAKLSAgCXdpZGdldF8gICAgICAgICA9IHBhZ2VJbmZvLmdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGUoKTsKLSAgCXN0YXR1c0xpc3RlbmVyXyA9IG5ldyBTdGF0dXNMaXN0ZW5lcigpOwotICAJcGFnZU1hbmFnZXJfICAgID0gcGFnZU1hbmFnZXI7Ci0gIH0gCSAgCi0gIAkKLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbCggQ29tcG9zaXRlIHBhcmVudCApIAotICB7Ci0gIAlDb21wb3NpdGUgY29udHJvbCA9IG5ldyBDb21wb3NpdGUoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAgCWNvbnRyb2wuc2V0TGF5b3V0KCBuZXcgR3JpZExheW91dCgpICk7Ci0gIAljb250cm9sLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9CT1RIICkpOwotICAJCi0JZGF0YUV2ZW50c18gPSB3aWRnZXRfLmFkZENvbnRyb2xzKCBjb250cm9sLCBzdGF0dXNMaXN0ZW5lcl8gKTsKLQkgIAotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb250cm9sKTsKLSAgICBzZXRDb250cm9sKCBjb250cm9sICk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGdldERhdGFFdmVudHMoKQotICB7Ci0gICAgcmV0dXJuIGRhdGFFdmVudHNfOwotICB9Ci0gIAkgIAotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVBhZ2VUb1N0YXR1cygpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzICA9IHdpZGdldF8uZ2V0U3RhdHVzKCk7Ci0gICAgCi0gICAgaWYoIHN0YXR1cyAhPSBudWxsICkKLSAgICB7Ci0gICAgICBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgIGlmKCBtZXNzYWdlLmxlbmd0aCgpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCBudWxsICk7Ci0gICAgICAgICAgc2V0TWVzc2FnZSggZ2V0RGVzY3JpcHRpb24oKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNldEVycm9yTWVzc2FnZSggbWVzc2FnZSApOwotICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSggZmFsc2UgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5XQVJOSU5HICkKLSAgICAgIHsKLSAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCBudWxsICk7Ci0gICAgICAgIHNldE1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSwgSVN0YXR1cy5XQVJOSU5HICk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSggdHJ1ZSApOwotICAgICAgfQotICAgICAgZWxzZSBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLklORk8gKQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIG51bGwgKTsKLSAgICAgICAgc2V0TWVzc2FnZSggc3RhdHVzLmdldE1lc3NhZ2UoKSwgSVN0YXR1cy5JTkZPICk7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZSggdHJ1ZSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIG51bGwgKTsKLSAgICAgICAgc2V0TWVzc2FnZSggZ2V0RGVzY3JpcHRpb24oKSApOwotICAgICAgICBzZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldEVycm9yTWVzc2FnZSggbnVsbCApOwotICAgICAgc2V0TWVzc2FnZSggZ2V0RGVzY3JpcHRpb24oKSApOwotICAgICAgc2V0UGFnZUNvbXBsZXRlKCB0cnVlICk7Ci0gICAgfQotICAgIAotICAgIGdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIAotICB7Ci0JcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCkgJiYgcGFnZU1hbmFnZXJfLmhhc05leHRQYWdlKCk7Ci0gIH0KLQotICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSAKLSAgewotCXJldHVybiBwYWdlTWFuYWdlcl8uZ2V0TmV4dFBhZ2UoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZhbHVlKSAKLSAgewotICAJcGFnZU1hbmFnZXJfLmhhbmRsZVBhZ2VWaXNpYmxlKCB0aGlzLCB2YWx1ZSApOwotICAJCi0gICAgc3VwZXIuc2V0VmlzaWJsZSh2YWx1ZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgU3RhdHVzTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lcgotICB7Ci0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIEV2ZW50IGV2dCApIAotCXsKLSAgICAgIHZhbGlkYXRlUGFnZVRvU3RhdHVzKCk7Ci0JfQotICB9Ci19ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXRCaW5kaW5nVG9XaWRnZXRGYWN0b3J5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3N2I2NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotCi1wdWJsaWMgY2xhc3MgV2lkZ2V0QmluZGluZ1RvV2lkZ2V0RmFjdG9yeUFkYXB0ZXIgCi17Ci0gIHByaXZhdGUgSGFzaHRhYmxlICAgICAgICAgICAgd2lkZ2V0Q29udHJpYnV0b3JfOwotICBwcml2YXRlIENvbW1hbmRXaWRnZXRCaW5kaW5nIGJpbmRpbmdfOwotICAKLSAgcHVibGljIFdpZGdldEJpbmRpbmdUb1dpZGdldEZhY3RvcnlBZGFwdGVyKCBDb21tYW5kV2lkZ2V0QmluZGluZyBiaW5kaW5nICkKLSAgewotICAgIHdpZGdldENvbnRyaWJ1dG9yXyA9IG5ldyBIYXNodGFibGUoKTsgCi0JYmluZGluZ18gICAgICAgICAgID0gYmluZGluZzsKLQkKLQliaW5kaW5nLnJlZ2lzdGVyV2lkZ2V0TWFwcGluZ3MoIG5ldyBNeVdpZGdldFJlZ2lzdHJ5KCkgKTsKLSAgfQotICAKLSAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldFdpZGdldCggU3RyaW5nIGlkICkKLSAgewotICAgIHJldHVybiAoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Ipd2lkZ2V0Q29udHJpYnV0b3JfLmdldCggaWQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyggRGF0YU1hcHBpbmdSZWdpc3RyeSByZWdpc3RyeSApCi0gIHsKLSAgICBiaW5kaW5nXy5yZWdpc3RlckRhdGFNYXBwaW5ncyggcmVnaXN0cnkgKTsgIAotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIE15V2lkZ2V0UmVnaXN0cnkgaW1wbGVtZW50cyBXaWRnZXRSZWdpc3RyeQotICB7Ci0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBmcmFnbWVudElkLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlVGl0bGUsIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB3aWRnZXRGYWN0b3J5KSAKLQl7Ci0JICBTaW1wbGVXaWRnZXRDb250cmlidXRvciB3aWRnZXQgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLQkgIHdpZGdldC5zZXRUaXRsZSggcGFnZU5hbWUgKTsKLQkgIHdpZGdldC5zZXREZXNjcmlwdGlvbiggcGFnZU5hbWUgKTsKLQkgIHdpZGdldC5zZXRGYWN0b3J5KCBuZXcgTXlXaWRnZXRDb250cmlidXRvckZhY3RvcnkoIHdpZGdldEZhY3RvcnkgKSApOwotCSAgCi0JICB3aWRnZXRDb250cmlidXRvcl8ucHV0KCBmcmFnbWVudElkLCB3aWRnZXQgKTsKLQl9CSAgCi0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgTXlXaWRnZXRDb250cmlidXRvckZhY3RvcnkgaW1wbGVtZW50cyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkKLSAgewotCXByaXZhdGUgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGZhY3RvcnlfOwotCXByaXZhdGUgV2lkZ2V0Q29udHJpYnV0b3IgICAgICAgIHdpZGdldF87Ci0JCi0JcHVibGljIE15V2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgZmFjdG9yeSApCi0JewotCSAgZmFjdG9yeV8gPSBmYWN0b3J5OwkKLQl9Ci0JCi0JcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIAotCXsKLSAgICAgIGlmKCB3aWRnZXRfID09IG51bGwgKQotCSAgewotCSAgICB3aWRnZXRfID0gZmFjdG9yeV8uY3JlYXRlKCk7Ci0JICB9Ci0JICAKLQkgIHJldHVybiB3aWRnZXRfOwotCX0JICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldENvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwZDc0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0Q29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGEgd2F5IGZvciBkZXZlbG9wZXJzIHRvIGNyZWF0ZSB2YWxpZGF0YWJsZSB3aWRnZXRzCi0gKiB0aGF0IGNhbiBiZSB1c2VkIGluIG1hbnkgZGlmZmVyZW50IEVjbGlwc2UgVUkgY29udGV4dHMuIChpZS4gaW4gYSBXaW5kb3dzLCBEaWFnbG9ncywKLSAqIHdpemFyZCBwYWdlcywgZXRjKQotICoKLSAqIFRoZSBtYWluIGZ1bmN0aW9uYWxpdHkgdGhpcyBpbnRlcmZhY2UgaGFzIG92ZXIganVzdCBhIHJlZ3VsYXIgRWNsaXBzZSBDb21wb3NpdGUKLSAqIGlzIHRoYXQgaXQgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIHZhbGlkYXRpbmcgdGhlIFdpZGdldC4gIFdoZW4gdmFsaWRhdGluZwotICogdGhlcmUgYXJlIHR3byBhc3BlY3RzIHRvIGtlZXAgaW4gbWluZC4gIFRoZSBmaXJzdCBhc3BlY3QgZGVhbHMgd2l0aCBXSEVOIHZhbGlkYXRpb24KLSAqIG9jY3VycyBhbmQgdGhlIHNlY29uZCBhc3BlY3QgZGVhbHMgd2l0aCBXSEFUIHRvIGRvIGZvciBhIHZhbGlkYXRpb24gZXZlbnQuCi0gKiAKLSAqIFRoZSBmaXJzdCBhc3BlY3Qgb2YgdHJpZ2dlcmluZyB2YWxpZGF0aW9uIGV2ZW50cyBpcyBoYW5kbGVkIGJ5IHRoZSBzdGF0dXNMaXN0ZW5lcgotICogcGFyYW1ldGVyIG9mIHRoZSBhZGRDb250cm9scyBtZXRob2QuICBJZiBhIHBhcnRpY3VsYXIgY29udHJvbCB0aGF0IGlzIGNvbnRyaWJ1dGVkIGNhbgotICogYWZmZWN0IHRoZSB2YWxpZGl0eSBvZiB0aGlzIFdpZGdldENvbnRyaWJ1dG9yIHRoZW4gdGhlIHN0YXR1c0xpc3RlbmVyIG9iamVjdAotICogc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBsaXN0ZW5lciBsaXN0IG9mIHRoYXQgY29udHJvbC4gIEZvciBleGFtcGxlLCBpZiB0aGUgdGV4dCBpbgotICogYSBUZXh0IHdpZGdldCBjYW4gYWZmZWN0IHRoZSB2YWxpZGl0eSBvZiB0aGlzIFdpZGdldENvbnRyaWJ1dG9yIHRoZW4geW91IHdvdWxkCi0gKiBhZGQgdGhlIHN0YXR1c0xpc3RlbmVyIHRvIHRoZSBUZXh0IHdpZGdldHMgTW9kaWZ5IGxpc3RlbmVyIGxpc3Q6Ci0gKiAKLSAqIAotICogICBUZXh0IHNvbWVUZXh0ID0gbmV3IFRleHQoIHBhcmVudCwgU1dULk5PTkUgKTsKLSAqICAgc29tZVRleHQuYWRkTGlzdGVuZXIoIFNXVC5Nb2RpZnksIHN0YXR1c0xpc3RlbmVyICk7Ci0gKiAKLSAqIE5vdGU6IGlmIHlvdSB3YW50IHRvIGZvcmNlIHZhbGlkYXRpb24gb2YgdGhpcyB3aWRnZXQgeW91IGNhbiBjYWxsCi0gKiAgICAgICB0aGUgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCkgbWV0aG9kIGRpcmVjdGx5LiAgVGhpcwotICogICAgICAgaXMgbm90IHRoZSBwcmVmZXJlZCBtYXkgdG8gdHJpZ2dlciB2YWxpZGF0aW9uLCBob3dldmVyLgotICogICAgICAgCi0gKiBUaGUgc2Vjb25kIGFzcGVjdCBvZiB2YWxpYXRpb24gaXMgd2hhdCB0byBkbyB3aGVuIHRoZSB2YWxpZGF0aW9uIGV2ZW50IG9jY3Vycy4KLSAqIFRoaXMgaXMgaGFuZGxlZCBieSBnZXRTdGF0dXMgbWV0aG9kLiAgQW55IGNvZGUgdGhhdCBlbnN1cmVzIHRoYXQgdGhpcyB3aWRnZXQgaXMKLSAqIHZhbGlkIHNob3VsZCBiZSBwdXQgaW4gdGhlIGdldFN0YXR1cyBpbXBsZW1lbnRhdGlvbi4gCi0gKiAKLSAqIAotKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2lkZ2V0Q29udHJpYnV0b3IgCi17Ci0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIFVJIGNvbnRyaWJ1dGlvbnMgZm9yIHRoaXMgd2lkZ2V0LgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudCBUaGUgY29tcG9zaXRlIHBhcmVudCB0aGF0IHN1YiB3aWRnZXRzIHNob3VsZCB1c2UuCi0gICAqIEBwYXJhbSBzdGF0dXNMaXN0ZW5lciBUaGlzIGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZCB0byBhbnkgd2lkZ2V0IHRoYXQgY2FuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICBhZmZlY3QgdGhlIHZhbGlkaXR5IG9mIHRoaXMgV2lkZ2V0Q29udHJpYnV0b3IuCi0gICAqIEByZXR1cm4gcmV0dXJucyBhIFdpZGdldERhdGFFdmVudHMgb2JqZWN0LiAgVGhpcyBvYmplY3QgaXMgdXNlZCBieSB0aGUKLSAgICogICAgICAgICBmcmFtZXdvcmsgdG8gaW50ZXJuYWxpemUgYW5kIGV4dGVybmFsaXplIGRhdGEgZm9yIHRoaXMgd2lkZ2V0LgotICAgKi8KLSAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoIENvbXBvc2l0ZSBwYXJlbnQsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyICk7Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGltcGxlbWVudCB2YWxpZGF0aW9uIGNvZGUgZm9yIHRoaXMgV2lkZ2V0Q29udHJpYnV0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgdGhlIHZhbGlkaXR5IG9mIHRoaXMgd2lkZ2V0LgotICAgKiAgICAgICAgIElmIHRoZSBzdGF0dXMgc2V2ZXJpdHkgaXMgRVJST1IgdGhlbiB0aGlzIHdpZGdldCBpcyBjb25zaWRlcmVkIHRvCi0gICAqICAgICAgICAgYmUgaW52YWxpZC4gIEZvciBhbnkgb3RoZXIgc3RhdHVzIHNldmVyaXR5IG9yIGlmIHRoZSBzdGF0dXMgcmV0dXJuZWQKLSAgICogICAgICAgICBpcyBudWxsIHRoaXMgd2lkZ2V0IGlzIGNvbnNpZGVyZWQgdG8gYmUgdmFsaWQuCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldENvbnRyaWJ1dG9yRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldENvbnRyaWJ1dG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI1ZDBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXRDb250cmlidXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZSBhIHdheSBmb3IgY3JlYXRpbmcgV2lkZ2V0Q29udHJpYnV0b3JzCi0gKgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgCi17Ci0gIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXREYXRhQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXREYXRhQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhYTMxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIFdpZGdldENvbnRyaWJ1dG9yIGludGVyZmFjZSBhbmQKLSAqIHRoZSBXaWRnZXREYXRhRXZlbnRzIGludGVyZmFjZS4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yIGV4dGVuZHMgV2lkZ2V0Q29udHJpYnV0b3IsIFdpZGdldERhdGFFdmVudHMgCi17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0RGF0YUV2ZW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldERhdGFFdmVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiMDNmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvV2lkZ2V0RGF0YUV2ZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBhIHdheSBmb3IgaW50ZXJuYWxpemluZyBhbmQgZXh0ZXJuYWxpemluZyBzdGF0ZQotICogZGF0YSBpbiBhIFdpZGdldENvbnRyaWJ1dG9yLiAgVGhlIGludGVybmFsaXplIG1ldGhvZCB3aWxsIGJlIGNhbGxlZAotICogYmVmb3JlIHRoZSB3aWRnZXQgaXMgZGlzcGxheWVkIHNvIHRoYXQgaXQgY2FuIHNldCB0aGUgZGVmYXVsdCBkYXRhCi0gKiBmb3IgdGhhdCB3aWRnZXQuICBUaGUgZXh0ZXJuYWxpemUgbWV0aG9kIHByb3ZpZGVzIGEgd2F5IG9mIGdldHRpbmcgZGF0YQotICogZnJvbSB0aGUgd2lkZ2V0IGFmdGVyIGl0IGlzIGRpc3BsYXllZC4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2lkZ2V0RGF0YUV2ZW50cyAKLXsKLSAgLyoqCi0gICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgc2V0IHdpZGdldCBzdGF0ZSBkYXRhIGhlcmUuCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpOwotICAKLSAgLyoqCi0gICAqIEltcGxlbWVuYXRpb25zIHNob3VsZCBnZXQgd2lkZ2V0IHN0YXRlIGRhdGEgaGVyZS4KLSAgICoKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4dGVybmFsaXplKCk7ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaWRnZXRSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMTEwN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpZGdldFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgaG93IFdpZGdldENvbnRyaWJ1dG9ycyBhcmUgbWFkZSBrbm93biB0byB0aGUKLSAqIGR5bmFtaWMgd2l6YXJkIGZyYW1ld29yay4gIFRoaXMgd2lkZ2V0IHdpbGwgYmUgZGlzcGxheWVkIGFzIGEgd2l6YXJkIHBhZ2UKLSAqIHdpdGggdGhlIG5hbWUgYW5kIHRpdGxlIHNwZWNpZmllZCBpbiB0aGUgYWRkIG1ldGhvZC4gIFRoZSBmcmFnbWVudElkIGlzIAotICogdXNlZCB0byBhc3NvY2lhdGUgdGhpcyB3aWRnZXQgd2l0aCBhIHBhcnRpY3VsYXIgQ29tbWFuZEZyYWdtZW50LiAgV2hlbgotICogYSBDb21tYW5kRnJhZ21lbnQgd2l0aCB0aGlzIGZyYWdtZW50SWQgaXMgdHJhdmVyc2VkIHRoZSBjb3JyZXNwb25kaW5nCi0gKiBXaWRnZXRDb250cmlidXRvciB3aWxsIGJlIGRpc3BsYXllZC4KLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2lkZ2V0UmVnaXN0cnkKLXsKLSAgLyoqCi0gICAqIEFkZHMgYSBXaWRnZXRDb250cmlidXRvckZhY3RvcnkgdG8gdGhlIGZyYW1ld29yay4gIFRoaXMgZmFjdG9yeQotICAgKiBpcyB1c2VkIHRvIGdldCB0aGUgV2lkZ2V0Q29udHJpYnV0b3IuICBUaGlzIFdpZGdldENvbnRyaWJ1dG9yCi0gICAqIHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIHdpemFyZCBwYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGZyYWdtZW50SWQgdGhlIENvbW1hbmRGcmFnbWVudCBpZCB0aGF0IHRoaXMgV2lkZ2V0Q29udHJpYnV0b3IgaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgKiBAcGFyYW0gcGFnZU5hbWUgdGhlIG5hbWUgb2YgdGhpcyB3aXphcmQgcGFnZS4KLSAgICogQHBhcmFtIHBhZ2VUaXRsZSB0aGUgdGl0bGUgb2YgdGhpcyB3aXphcmQgcGFnZS4KLSAgICogQHBhcmFtIHdpZGdldEZhY3RvcnkgdGhlIGZhY3Rvcnkgd2hpY2ggd2lsbCBjcmVhdGUgdGhlIFdpZGdldENvbnRyaWJ1dG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKCBTdHJpbmcgZnJhZ21lbnRJZCwKLQkJCQkgICBTdHJpbmcgcGFnZU5hbWUsCi0JCQkJICAgU3RyaW5nIHBhZ2VUaXRsZSwKLQkJCQkgICBXaWRnZXRDb250cmlidXRvckZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSApOwotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaXphcmRQYWdlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpemFyZFBhZ2VGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MjA5NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpemFyZFBhZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzOwotCi0KLS8qKgotICogCi0gKgotICoKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2l6YXJkUGFnZUZhY3RvcnkgCi17Ci0gIHB1YmxpYyBQYWdlV2l6YXJkRGF0YUV2ZW50cyBnZXRQYWdlKCBQYWdlSW5mbyBwYWdlSW5mbywgV2l6YXJkUGFnZU1hbmFnZXIgbWFuYWdlciApOyAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvdWkvd2lkZ2V0cy9XaXphcmRQYWdlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpemFyZFBhZ2VNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGJiMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL1dpemFyZFBhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YUZsb3dNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLnJlZ2lzdHJ5LldpZGdldFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi0KLQotcHVibGljIGNsYXNzIFdpemFyZFBhZ2VNYW5hZ2VyIGV4dGVuZHMgU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIKLXsKLSAgcHJpdmF0ZSAgIFdpemFyZFBhZ2VGYWN0b3J5ICAgICAgcGFnZUZhY3RvcnlfOwotICBwcml2YXRlICAgSGFzaHRhYmxlICAgICAgICAgICAgICBwYWdlVGFibGVfOwotICBwcml2YXRlICAgSVdpemFyZCAgICAgICAgICAgICAgICB3aXphcmRfOwotICBwcm90ZWN0ZWQgU2ltcGxlV2lkZ2V0UmVnaXN0cnkgICByZWdpc3RyeV87Ci0gIAotICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgYW5kIHNldCBieSBvdXIgbWV0aG9kcyB3aGljaCBpcwotICAvLyB3aHkgdGhleSBhcmUgbm90IGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgcHJpdmF0ZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBjdXJyZW50UGFnZV87Ci0gIHByaXZhdGUgUGFnZVdpemFyZERhdGFFdmVudHMgbmV4dFBhZ2VfOwotICBwcml2YXRlIFBhZ2VXaXphcmREYXRhRXZlbnRzIGZpcnN0UGFnZV87Ci0gIHByaXZhdGUgQ29tbWFuZEZyYWdtZW50ICAgICAgbGFzdFVuZG9GcmFnbWVudF87Ci0gIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgZmlyc3RGcmFnbWVudF87Ci0gIAotICBwcml2YXRlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB3aWRnZXRGYWN0b3J5XzsKLSAgcHJpdmF0ZSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0U3RhY2tfOwotICBwcml2YXRlIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRTdGFja1N0YWNrXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0VGFibGVfOwotICBwcml2YXRlIFdpZGdldFJlZ2lzdHJ5ICAgICAgICAgICAgICAgICB3aWRnZXRSZWdpc3RyeV87Ci0gICAgCi0gIHB1YmxpYyBXaXphcmRQYWdlTWFuYWdlciggU2ltcGxlV2lkZ2V0UmVnaXN0cnkgIHJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpemFyZFBhZ2VGYWN0b3J5ICAgICBwYWdlRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV2l6YXJkICAgICAgICAgICAgICAgd2l6YXJkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFGbG93TWFuYWdlciAgICAgICBkYXRhTWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlRW52aXJvbm1lbnQgICAgZW52aXJvbm1lbnQgKQotICB7IAotICAgIHN1cGVyKCBlbnZpcm9ubWVudCwgZGF0YU1hbmFnZXIgKTsgIAotICAgIAotICAJcGFnZUZhY3RvcnlfICAgID0gcGFnZUZhY3Rvcnk7Ci0gIAlwYWdlVGFibGVfICAgICAgPSBuZXcgSGFzaHRhYmxlKCk7ICAKLSAgCXJlZ2lzdHJ5XyAgICAgICA9IHJlZ2lzdHJ5OwotICAJd2l6YXJkXyAgICAgICAgID0gd2l6YXJkOwotCXdpZGdldFRhYmxlXyAgICA9IG5ldyBIYXNodGFibGUoKTsKLQl3aWRnZXRSZWdpc3RyeV8gPSBXaWRnZXRSZWdpc3RyeS5pbnN0YW5jZSgpOwotCQotCXdpZGdldFN0YWNrU3RhY2tfID0gbmV3IFN0YWNrKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdGF0dXMgcnVuRm9yd2FyZFRvTmV4dFN0b3AoKQotICB7ICAgIAotICAJZmlyc3RGcmFnbWVudF8gID0gdHJ1ZTsKLSAgCW5leHRQYWdlXyAgICAgICA9IG51bGw7Ci0gCi0gIAlJV2l6YXJkQ29udGFpbmVyIGNvbnRhaW5lciA9IHdpemFyZF8uZ2V0Q29udGFpbmVyKCk7Ci0gIAkKLSAgCWlmKCBjb250YWluZXIgPT0gbnVsbCB8fCBjb250YWluZXIuZ2V0Q3VycmVudFBhZ2UoKSA9PSBudWxsICkKLSAgCXsKLSAgCSAgY29udGFpbmVyID0gbnVsbDsKLSAgCX0KLSAgCQotICAJcmV0dXJuIHN1cGVyLnJ1bkZvcndhcmRUb05leHRTdG9wKCBjb250YWluZXIgKTsKLSAgfQotICAgIAotICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0Q3VycmVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRQYWdlXzsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0UGFnZSgpCi0gIHsJCi0gIAluZXh0UGFnZV8gPSBnZXROZXh0UGFnZUluR3JvdXAoIHdpZGdldEZhY3RvcnlfLCBmYWxzZSApOwotCQkKLQkgIGlmKCBuZXh0UGFnZV8gPT0gbnVsbCApCi0JICB7Ci0JICAgIC8vIElmIGEgcGFnZSBpcyBmb3VuZCBuZXh0UGFnZV8gd2lsbCBiZSBzZXQgdG8gaXRzIHZhbHVlIGluIHRoZSBtZXRob2QgYmVsb3cuCi0gIAkgIGVuZ2luZV8ucGVla0ZvcndhcmRUb05leHRTdG9wKCk7Ci0JICB9Ci0gIAkKLSAgICByZXR1cm4gbmV4dFBhZ2VfICE9IG51bGw7Ci0JICAvL3JldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKQotICB7ICAJCi0JdHJ5Ci0JewotCSAgU3lzdGVtLm91dC5wcmludGxuKCAiU3RhcnQgZ2V0IG5leHQgcGFnZSIgKTsKLQkKLSAgCSAgLy8gTmVlZCB0byBleHRlcm5hbGl6ZSB0aGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcGFnZSBzbyB0aGF0Ci0gIAkgIC8vIHdoZW4gd2UgbW92ZSBmb3J3YXJkIGJlbG93IHRoZSBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgCSAgaWYoIGN1cnJlbnRQYWdlXyAhPSBudWxsICkgY3VycmVudFBhZ2VfLmdldERhdGFFdmVudHMoKS5leHRlcm5hbGl6ZSgpOwotICAJCi0JICBuZXh0UGFnZV8gPSBnZXROZXh0UGFnZUluR3JvdXAoIHdpZGdldEZhY3RvcnlfLCB0cnVlICk7Ci0JCi0JICBpZiggbmV4dFBhZ2VfID09IG51bGwgKQotCSAgewotCSAgICB3aWRnZXRGYWN0b3J5XyA9IG51bGw7Ci0JICAgIHdpZGdldFN0YWNrXyAgID0gbnVsbDsKLQkJCi0gIAkgICAgU3RhdHVzIHN0YXR1cyA9IHJ1bkZvcndhcmRUb05leHRTdG9wKCk7Ci0gIAkKLSAgCSAgICBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLkVSUk9SICkKLSAgCSAgICB7Ci0gIAkgICAgICAvLyBBbiBlcnJvciBoYXMgb2NjdXJlZCBzbyB3ZSBuZWVkIHVuZG8gdG8gdGhlIHByZXZpb3VzIHN0b3AgcG9pbnQuCi0gIAkgICAgICB1bmRvVG9MYXN0UGFnZSgpOwotICAJICAgIH0KLQkgIH0KLQkKLSAgCSAgaWYoIG5leHRQYWdlXyAhPSBudWxsICkgbmV4dFBhZ2VfLnNldFdpemFyZCggd2l6YXJkXyApOwotICAJICAJCi0gIAkgIHJldHVybiBuZXh0UGFnZV87Ci0JfQotCWNhdGNoKCBUaHJvd2FibGUgZXhjICkKLQl7Ci0JICBleGMucHJpbnRTdGFja1RyYWNlKCk7CQotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBoYW5kbGVQYWdlVmlzaWJsZSggUGFnZVdpemFyZERhdGFFdmVudHMgcGFnZSwgYm9vbGVhbiBpc1BhZ2VWaXNpYmxlICkKLSAgewotICAgIGlmKCAhaXNQYWdlVmlzaWJsZSAmJiBwYWdlID09IGZpcnN0UGFnZV8gJiYgcGFnZSA9PSBjdXJyZW50UGFnZV8gKQotICAgIHsKLSAgICAgIC8vIFdlIGFyZSBtb3ZpbmcgYmFjayBvbmUgcGFnZSBmcm9tIHRoZSBmaXJzdCBwYWdlLiAgVGhpcyBjYW4ndCBoYXBwZW4gd2l0aCBwb3B1cCB3aXphcmRzCi0gICAgICAvLyBzaW5jZSB0aGUgcHJldmlvdXMgYnV0dG9uIHdvdWxkIGJlIGdyZXllZCBvdXQuICBCdXQgd2hlbiB0aGUgbmV3IHdpemFyZCBsYXVuY2hlcyB0aGlzIHdpemFyZAotICAgICAgLy8gdGhlIHByZXZpb3VzIGJ1dHRvbiBpcyBub3QgZ3JleWVkIG91dCBhbmQgYnJpbmdzIHRoZSB1c2VyIGJhY2sgdG8gdGhlIGxpc3Qgd2l6YXJkcyB0byBzZWxlY3QuCi0gICAgICAvLyBUaGVyZWZvcmUsIHdlIG11c3QgdW53aW5kIHRoZSBjb21tYW5kIGVuZ2luZSBhbmQgZ2V0IHJlYWR5IGZvciB0aGUgdXNlciB0byBpbnZva2UgdGhpcyB3aXphcmQgCi0gICAgICAvLyBhZ2Fpbi4KLSAgCSAgdW5kb1RvTGFzdFBhZ2UoKTsJICAKLSAgICAgIGN1cnJlbnRQYWdlXyA9IG51bGw7Ci0gICAgICBmaXJzdFBhZ2VfICAgPSBudWxsOwotICAgIH0KLSAgCWlmKCBjdXJyZW50UGFnZV8gIT0gbnVsbCAmJiBwYWdlID09IGN1cnJlbnRQYWdlXy5nZXRQcmV2aW91c1BhZ2UoKSAmJiBpc1BhZ2VWaXNpYmxlICkKLSAgCXsKLSAgCSAgLy8gV2UgYXJlIG1vdmluZyBiYWNrIG9uZSBwYWdlLgotICAJICAvLyBOb3RlOiB3ZSBkb24ndCBpbnRlcm5hbGl6ZSB0aGUgcHJldmlvdXMgcGFnZSBhbmQgd2UgZG8gbm90IGV4dGVybmFsaXplIHRoZSBjdXJyZW50IHBhZ2UuCi0gIAkgIC8vICAgICAgIHdlIGFyZSBiYXNpY2FsbHkganVzdCBsZWF2aW5nIHRoZSBjdXJyZW50IHBhZ2Ugd2l0aG91dCByZXRyaWV2aW5nIGl0cyBzdGF0ZSBhbmQKLSAgCSAgLy8gICAgICAgbW92aW5nIHRvIHRoZSBwcmV2aW91cyBwYWdlIHdoaWNoIGFscmVhZHkgaGFzIGl0cyBzdGF0ZSBzZXQuCi0JCi0JICBpZiggd2lkZ2V0RmFjdG9yeV8gIT0gbnVsbCApCi0JICB7Ci0JCWlmKCB3aWRnZXRTdGFja18uc2l6ZSgpID4gMCApCi0JCXsKLQkJICB3aWRnZXRTdGFja18ucG9wKCk7Ci0JCX0KLQkJCi0JCWlmKCB3aWRnZXRTdGFja18uc2l6ZSgpID09IDAgKQotCQl7Ci0JCSAgd2lkZ2V0RmFjdG9yeV8gPSBudWxsOwotCQkgIHdpZGdldFN0YWNrXyA9IG51bGw7Ci0JCSAgd2lkZ2V0U3RhY2tTdGFja18ucG9wKCk7Ci0JCX0KLQkgIH0KLQkgIAotCSAgaWYoIHdpZGdldEZhY3RvcnlfID09IG51bGwgKQotCSAgewotICAJICAgIHVuZG9Ub0xhc3RQYWdlKCk7Ci0JICB9Ci0JICAKLSAgCSAgY3VycmVudFBhZ2VfID0gcGFnZTsKLSAgCX0JCi0gIAllbHNlIGlmKCBpc1BhZ2VWaXNpYmxlICkKLSAgCXsKLQkgIHRyeQotCSAgewotICAJICAgIC8vIFdlIGFyZSBtb3ZpbmcgZm9yd2FyZCBvbmUgcGFnZS4KLSAgCSAgICBXaWRnZXREYXRhRXZlbnRzIGRhdGFFdmVudHMgPSBwYWdlLmdldERhdGFFdmVudHMoKTsKLSAgCSAgCi0gIAkgICAgZGF0YU1hbmFnZXJfLnByb2Nlc3MoIGRhdGFFdmVudHMgKTsgIC8vIFB1c2ggbW9kZWwgZGF0YSBpbnRvIHRoZSBuZXcgcGFnZS4KLSAgCSAgICBkYXRhRXZlbnRzLmludGVybmFsaXplKCk7Ci0gIAkgIAotICAJICAgIHBhZ2UudmFsaWRhdGVQYWdlVG9TdGF0dXMoKTsKLSAgCSAgCi0gIAkgICAgaWYoIGN1cnJlbnRQYWdlXyAhPSBudWxsICkgcGFnZS5zZXRQcmV2aW91c1BhZ2UoIGN1cnJlbnRQYWdlXyApOwotICAJICAKLSAgCSAgICBpZiggZmlyc3RQYWdlXyA9PSBudWxsICkgZmlyc3RQYWdlXyA9IHBhZ2U7Ci0gIAkgIAotICAJICAgIGN1cnJlbnRQYWdlXyA9IHBhZ2U7Ci0JICB9Ci0JICBjYXRjaCggVGhyb3dhYmxlIGV4YyApCi0JICB7Ci0JCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkgIH0KLSAgCX0KLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsgCQotICAJLy8gV2UgbmVlZCB0byBzaW11bGF0ZSB0aGUgbmV4dCBidXR0b24gYmVpbmcgcHJlc3NlZCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBwYWdlcy4KLSAgCS8vIElmIGFuIGVycm9yIG9jY3VycyB3ZSB3aWxsIHJldHVybiBmYWxzZSBhbmQgcmVzZXQgdGhlIGNvbW1hbmQgc3RhY2sgYmFjayBvdXIgb3JpZ2luYWwgc3RhdGUuCi0gIAlib29sZWFuICAgIGRvbmVPayAgICA9IHRydWU7Ci0gIAlQYWdlV2l6YXJkRGF0YUV2ZW50cyBzdGFydFBhZ2UgPSBjdXJyZW50UGFnZV87Ci0gIAkKLSAgCS8vIEV4dGVybmFsaXplIHRoZSBjdXJyZW50IHBhZ2UuCi0gIAljdXJyZW50UGFnZV8uZ2V0RGF0YUV2ZW50cygpLmV4dGVybmFsaXplKCk7Ci0gIAkKLSAgCS8vIExvb3AgdGhyb3VnaCBzdWJzZXF1ZW50IHBhZ2VzLgotICAJZG8KLSAgCXsgIAkgIAotICAJICBTdGF0dXMgc3RhdHVzID0gcnVuRm9yd2FyZFRvTmV4dFN0b3AoKTsJICAKLSAgCSAgCi0gIAkgIGlmKCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuRVJST1IgKQotICAJICB7Ci0gIAkgIAkvLyBBbiBlcnJvciBvY2N1cmVkIGluIG9uZSBvZiB0aGUgY29tbWFuZHMuCi0gIAkgIAlkb25lT2sgPSBmYWxzZTsKLSAgCSAgfQotICAJICBlbHNlCi0gIAkgIHsKLSAgCSAgCWN1cnJlbnRQYWdlXyA9IG5leHRQYWdlXzsKLSAgCSAgfQotICAJfQotICAJd2hpbGUoIG5leHRQYWdlXyAhPSBudWxsICYmIGRvbmVPayk7Ci0gIAkKLSAgCWlmKCAhZG9uZU9rICkKLSAgCXsKLSAgCSAgLy8gQW4gZXJyb3Igb2NjdXJlZCwgc28gd2UgbmVlZCB0byByZXR1cm4gdGhlIGNvbW1hbmQgc3RhY2sgdG8gaXQncwotICAJICAvLyBvcmdpbmFsIHN0YXRlLgotICAJICBQYWdlV2l6YXJkRGF0YUV2ZW50cyBwYWdlID0gbnVsbDsKLSAgCSAgYm9vbGVhbiAgICAgICAgICAgICAgZG9uZSA9IGZhbHNlOwotICAJICAKLSAgCSAgZG8KLSAgCSAgewotICAJICAgIGRvbmUgPSBlbmdpbmVfLnVuZG9Ub0xhc3RTdG9wKCk7Ci0gIAkgICAgcGFnZSA9IGdldFBhZ2UoIGxhc3RVbmRvRnJhZ21lbnRfICk7Ci0gIAkgIH0KLSAgCSAgd2hpbGUoIHBhZ2UgIT0gc3RhcnRQYWdlICYmICFkb25lICk7IAkgIAotICAJICAKLSAgCSAgY3VycmVudFBhZ2VfID0gcGFnZTsKLSAgCX0KLSAgCQotICAJcmV0dXJuIGRvbmVPazsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpCi0gIHsKLSAgCXdoaWxlKCAhZW5naW5lXy51bmRvVG9MYXN0U3RvcCgpICl7fQotICAJCi0gIAlyZXR1cm4gdHJ1ZTsKLSAgfQotICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwZWVrRnJhZ21lbnQoIENvbW1hbmRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsgICAgIAkKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmcmFnbWVudCBpcyBpbiBvdXIgcGFnZSB0YWJsZS4KLSAgICBuZXh0UGFnZV8gPSBnZXRQYWdlKCBmcmFnbWVudCApOwotICAgICAgICAgIAkKLQlpZiggbmV4dFBhZ2VfID09IG51bGwgKQotCXsKLQkgIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBmYWN0b3J5ID0gd2lkZ2V0UmVnaXN0cnlfLmdldEZhY3RvcnkoIGZyYWdtZW50LmdldElkKCkgKTsKLQkgIAotCSAgaWYoIGZhY3RvcnkgIT0gbnVsbCApCi0JICB7Ci0JCW5leHRQYWdlXyA9IGdldE5leHRQYWdlSW5Hcm91cCggZmFjdG9yeSwgZmFsc2UgKTsgIAotCSAgfQotCX0KLQkKLSAgICByZXR1cm4gbmV4dFBhZ2VfID09IG51bGw7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIG5leHRGcmFnbWVudCggQ29tbWFuZEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCS8vU3lzdGVtLm91dC5wcmludGxuKCAiTmV4dCBmcmFnPSIgKyBmcmFnbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgc3RhY2sgc2l6ZT0iICsgd2lkZ2V0U3RhY2tTdGFja18uc2l6ZSgpICk7Ci0JCi0gICAgLy8gSWYgdGhlIHN1cGVyIGNsYXNzIG5leHRGcmFnbWVudCB3YW50IHVzIHRvIHN0b3AgdGhlbiB3ZSB3aWxsIHN0b3AgcmlnaHQgYXdheS4KLSAgICBpZiggIXN1cGVyLm5leHRGcmFnbWVudCggZnJhZ21lbnQgKSApIHJldHVybiBmYWxzZTsKLSAgICAKLSAgCS8vIFRoZSBmaXJzdCBmcmFnbWVudCBpcyBlaXRoZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSB3aXphcmQKLSAgCS8vIG9yIGl0IGlzIG9uIGEgd2l6YXJkIHBhZ2UuICBJbiBlaXRoZXIgY2FzZSB3ZSBkbyBub3Qgd2FudCAKLSAgCS8vIHRvIHN0b3AgaWYgYSBwYWdlIGlzIGZvdW5kLgotICAJaWYoIGZpcnN0RnJhZ21lbnRfICkKLSAgCXsKLSAgCSAgZmlyc3RGcmFnbWVudF8gPSBmYWxzZTsKLSAgCX0KLSAgCWVsc2UKLSAgCXsKLQkgIHdpZGdldEZhY3RvcnlfID0gd2lkZ2V0UmVnaXN0cnlfLmdldEZhY3RvcnkoIGZyYWdtZW50LmdldElkKCkgKTsKLQkgIAotCSAgaWYoIHdpZGdldEZhY3RvcnlfICE9IG51bGwgKQotCSAgewotCQl3aWRnZXRTdGFja18gPSBuZXcgU3RhY2soKTsKLQkJCi0JCVN0YWNrRW50cnkgZW50cnkgPSBuZXcgU3RhY2tFbnRyeSgpOwotCQkKLQkJd2lkZ2V0RmFjdG9yeV8ucmVnaXN0ZXJEYXRhTWFwcGluZ3MoIGRhdGFNYW5hZ2VyXy5nZXRNYXBwaW5nUmVnaXN0cnkoKSApOwotCQkKLQkJZW50cnkuZmFjdG9yeV8gPSB3aWRnZXRGYWN0b3J5XzsKLQkJZW50cnkuc3RhY2tfICAgPSB3aWRnZXRTdGFja187Ci0JCXdpZGdldFN0YWNrU3RhY2tfLnB1c2goIGVudHJ5ICk7Ci0JCQotCQluZXh0UGFnZV8gPSBnZXROZXh0UGFnZUluR3JvdXAoIHdpZGdldEZhY3RvcnlfLCB0cnVlICk7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0gIAkgICAgbmV4dFBhZ2VfID0gZ2V0UGFnZSggZnJhZ21lbnQgKTsKLQkgIH0KLSAgCX0gIAkgIAkKLSAgCQotICAgIHJldHVybiBuZXh0UGFnZV8gPT0gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdW5kb0ZyYWdtZW50KCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0JLy9TeXN0ZW0ub3V0LnByaW50bG4oICJVbmRvIGZyYWc9IiArIGZyYWdtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzdGFjayBzaXplPSIgKyB3aWRnZXRTdGFja1N0YWNrXy5zaXplKCkgKTsKLSAgCWxhc3RVbmRvRnJhZ21lbnRfID0gZnJhZ21lbnQ7Ci0gIAkKLSAgCXJldHVybiB0cnVlOwotICB9Ci0gIAotICAKLSAgcHJpdmF0ZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBnZXROZXh0UGFnZUluR3JvdXAoIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBmYWN0b3J5LCBib29sZWFuIHB1c2hOZXdXaWRnZXQgKQotICB7Ci0JUGFnZVdpemFyZERhdGFFdmVudHMgcGFnZSA9IG51bGw7Ci0JCi0JaWYoIGZhY3RvcnkgIT0gbnVsbCApCi0JewkgIAotCSAgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgbmV3V2lkZ2V0ID0gbnVsbDsKLQkJICAKLQkgIGlmKCB3aWRnZXRTdGFja18uc2l6ZSgpID09IDAgKQotCSAgewotCQluZXdXaWRnZXQgPSBmYWN0b3J5LmdldEZpcnN0TmFtZWRXaWRnZXQoKTsgICAKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkJSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgY3VycmVudFdpZGdldCA9IChJTmFtZWRXaWRnZXRDb250cmlidXRvcil3aWRnZXRTdGFja18ucGVlaygpOwotCQluZXdXaWRnZXQgPSBmYWN0b3J5LmdldE5leHROYW1lZFdpZGdldCggY3VycmVudFdpZGdldCApOyAKLQkgIH0KLQkJICAKLQkgIGlmKCBuZXdXaWRnZXQgIT0gbnVsbCApCi0JICB7Ci0JCXBhZ2UgPSBnZXRQYWdlKCBuZXdXaWRnZXQgKTsKLQkJCi0JCWlmKCBwdXNoTmV3V2lkZ2V0ICkKLQkJewotCQkgIHdpZGdldFN0YWNrXy5wdXNoKCBuZXdXaWRnZXQgKTsKLQkJfQotCSAgfQotCX0KLQkJCi0JcmV0dXJuIHBhZ2U7ICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHVuZG9Ub0xhc3RQYWdlKCkKLSAgewotCVN5c3RlbS5vdXQucHJpbnRsbiggIlVuZG8gdG8gbGFzdCBwYWdlIiApOwotCQotICAgIGJvb2xlYW4gc3RhY2tFbXB0eSAgPSBmYWxzZTsKLQlib29sZWFuIGRvbmVVbmRvaW5nID0gZmFsc2U7Ci0gICAgCi0Jd2hpbGUoICFkb25lVW5kb2luZyApCi0JewotCSAgc3RhY2tFbXB0eSA9IGVuZ2luZV8udW5kb1RvTGFzdFN0b3AoKTsKLQkgIAotCSAgSVdpemFyZFBhZ2UgcGFnZSA9IGdldFBhZ2UoIGxhc3RVbmRvRnJhZ21lbnRfICk7Ci0JCQotCSAgaWYoIHBhZ2UgPT0gbnVsbCAmJiBsYXN0VW5kb0ZyYWdtZW50XyAhPSBudWxsICkKLQkgIHsKLQkJLy8gQ2hlY2sgdG8gc2VlIGlmIGEgZ3JvdXAgcGFnZSBmcmFnbWVudCB3YXMgZm91bmQuCi0JCUlOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBmYWN0b3J5ID0gd2lkZ2V0UmVnaXN0cnlfLmdldEZhY3RvcnkoIGxhc3RVbmRvRnJhZ21lbnRfLmdldElkKCkgKTsKLQkJICAKLQkJaWYoIGZhY3RvcnkgIT0gbnVsbCApCi0JCXsKLQkJICBTdGFja0VudHJ5IGVudHJ5ID0gKFN0YWNrRW50cnkpd2lkZ2V0U3RhY2tTdGFja18ucGVlaygpOwotCQkJCi0JCSAgd2lkZ2V0RmFjdG9yeV8gPSBlbnRyeS5mYWN0b3J5XzsKLQkJICB3aWRnZXRTdGFja18gICA9IGVudHJ5LnN0YWNrXzsJCi0JCQkKLQkJICBJTmFtZWRXaWRnZXRDb250cmlidXRvciBjdXJyZW50V2lkZ2V0ID0gKElOYW1lZFdpZGdldENvbnRyaWJ1dG9yKXdpZGdldFN0YWNrXy5wZWVrKCk7Ci0JCQkKLQkJICBwYWdlID0gZ2V0UGFnZSggY3VycmVudFdpZGdldCApOwotCQl9Ci0JICB9Ci0JICAKLQkgIGRvbmVVbmRvaW5nID0gcGFnZSAhPSBudWxsIHx8IHN0YWNrRW1wdHk7Ci0JfQkKLSAgfQotICAKLSAgcHJpdmF0ZSBQYWdlV2l6YXJkRGF0YUV2ZW50cyBnZXRQYWdlKCBDb21tYW5kRnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgZnJhZ21lbnQgaXMgaW4gb3VyIHBhZ2UgdGFibGUuCi0gIAlQYWdlV2l6YXJkRGF0YUV2ZW50cyBwYWdlID0gKFBhZ2VXaXphcmREYXRhRXZlbnRzKXBhZ2VUYWJsZV8uZ2V0KCBmcmFnbWVudCApOyAKLSAgCVN0cmluZyAgICAgIGlkICAgPSBmcmFnbWVudC5nZXRJZCgpOyAgICAgIAkKLSAgICAgICAgICAJCi0gICAgaWYoIHBhZ2UgPT0gbnVsbCAmJiBpZCAhPSBudWxsICkKLSAgICB7Ci0gICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBmcmFnbWVudCBpZCBpcyBpbiB0aGUgcmVnaXN0cnkuCi0gICAgICBQYWdlSW5mbyBwYWdlSW5mbyA9IHJlZ2lzdHJ5Xy5nZXRQYWdlSW5mbyggaWQgKTsgICAgICAgICAgCSAgCi0gICAgICAgICAgICAgIAotICAgICAgaWYoIHBhZ2VJbmZvICE9IG51bGwgKQotICAgICAgewotICAgICAgICBwYWdlID0gcGFnZUZhY3RvcnlfLmdldFBhZ2UoIHBhZ2VJbmZvLCB0aGlzICk7Ci0gICAgICAgIHBhZ2VUYWJsZV8ucHV0KCBmcmFnbWVudCwgcGFnZSApOyAgICAgICAgICAgIAkKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcGFnZTsKLSAgfSAgICAKLSAgCi0gIHByaXZhdGUgUGFnZVdpemFyZERhdGFFdmVudHMgZ2V0UGFnZSggSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0ICkKLSAgewotCVBhZ2VXaXphcmREYXRhRXZlbnRzIHBhZ2UgPSAoUGFnZVdpemFyZERhdGFFdmVudHMpd2lkZ2V0VGFibGVfLmdldCggd2lkZ2V0ICk7Ci0KLQlpZiggcGFnZSA9PSBudWxsICkKLQl7Ci0JICBQYWdlSW5mbyBwYWdlSW5mbyA9IG5ldyBQYWdlSW5mbyh3aWRnZXQuZ2V0VGl0bGUoKSwgd2lkZ2V0LmdldERlc2NyaXB0aW9uKCksIHdpZGdldC5nZXRXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSApOwotCSAgCi0JICBwYWdlID0gcGFnZUZhY3RvcnlfLmdldFBhZ2UoIHBhZ2VJbmZvLCB0aGlzICk7Ci0JICB3aWRnZXRUYWJsZV8ucHV0KCB3aWRnZXQsIHBhZ2UgKTsKLQl9Ci0JCi0JcmV0dXJuIHBhZ2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgU3RhY2tFbnRyeQotICB7Ci0gICAgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IGZhY3RvcnlfOwotCVN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja187Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvcG9wdXAvRHluYW1pY1BvcHVwV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3VpL3dpZGdldHMvcG9wdXAvRHluYW1pY1BvcHVwV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2RiMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi91aS93aWRnZXRzL3BvcHVwL0R5bmFtaWNQb3B1cFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXA7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhRmxvd01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuRHluYW1pY1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVQb3B1cFBhZ2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpemFyZFBhZ2VGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHBvcHVwIGR5bmFtaWMgd2l6YXJkcy4gIFRoZSBwb3B1cE1lbnVzIGV4dGVuc2lvbiBpcyB1c2VkCi0gKiB0aGUgY29udHJpYnV0ZSBhIHBvcHVwIHRvIEVjbGlwc2UuICBUaGUgY2xhc3MgaW4gdGhlIGFjdGlvbiBlbGVtZW50IHNob3VsZCByZWZlcmVuY2UKLSAqIHRoaXMgRHluYW1pY1BvcHVwV2l6YXJkIGNsYXNzLiAgVGhpcyBpZCBhdHRyaWJ1dGUgaW4gdGhlIGFjdGlvbiBlbGVtZW50IHNob3VsZCBjb250YWluCi0gKiBhbiBpZCB0aGF0IHJlZmVyZW5jZXMgYSBkeW5hbWljV2l6YXJkIGV4dGVuc2lvbiBwb2ludC4gIFRoaXMgaXMgaG93IHRoZSBEeW5hbWljUG9wdXBXaXphcmQKLSAqIGNsYXNzIGtub3dzIHdoaWNoIHdpemFyZCB0byBkaXNwbGF5LgotICogICAKLSAqIE5vdGU6IHRoZSBpZCBhdHRyaWJ1dGUgaW4gdGhlIG9iamVjdENvbnRyaWJ1dGlvbiBlbGVtZW50IHJlZmVycyB0byBhbgotICogICAgICAgYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgZXh0ZW5zaW9uIHBvaW50LiAgVGhlIGlkcyBpbiBvYmplY3RDb250cmlidXRpb24KLSAqICAgICAgIGVsZW1lbnQgYW5kIHRoZSBhY3Rpb24gZWxlbWVudCBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGV5IGFyZSBpbiB0aGUKLSAqICAgICAgIGV4YW1wbGUgYmVsb3cuCi0gKgotICo8cHJlPgotICogICAmbHQ7ZXh0ZW5zaW9uCi0gKiAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIiZndDsKLSAqJmx0OyEtLSBJRmlsZSAqLndzZGwgcG9wdXAgbWVudSAtLSZndDsKLSAqICAgICAmbHQ7b2JqZWN0Q29udHJpYnV0aW9uCi0gKiAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICogICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAqICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIiZndDsKLSAqJmx0OyEtLSBXU0RMIFRvIEphdmEgQmVhbiBQcm94eSAtLSZndDsKLSAqICAgICAgICAmbHQ7YWN0aW9uCi0gKiAgICAgICAgICAgICAgbGFiZWw9IiVBQ1RJT05fR0VORVJBVEVfSkFWQV9QUk9YWSIKLSAqICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMucG9wdXAuRHluYW1pY1BvcHVwV2l6YXJkIgotICogICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAqICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIiZndDsKLSAqICAgICAgICAmbHQ7L2FjdGlvbiZndDsKLSAqICAgICAmbHQ7L29iamVjdENvbnRyaWJ1dGlvbiZndDsKLSAqICAmbHQ7L2V4dGVuc2lvbiZndDsKLSAqCi0gKiAgICZsdDtleHRlbnNpb24KLSAqICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmR5bmFtaWNXaXphcmQiJmd0OwotICogICAgICZsdDtkeW5hbWljV2l6YXJkCi0gKiAgICAgICAgICAgaWNvbmJhbm5lcj0iaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZiIKLSAqICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuYmluZGluZy5DbGllbnRXaWRnZXRCaW5kaW5nIgotICogICAgICAgICAgIHRpdGxlPSIlV0laQVJEX1RJVExFX1dTQyIKLSAqICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIiZndDsKLSAqICAgICAmbHQ7L2R5bmFtaWNXaXphcmQmZ3Q7Ci0gKiAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gKjwvcHJlPgotICoKLSAqLwotcHVibGljIGNsYXNzIER5bmFtaWNQb3B1cFdpemFyZCBleHRlbmRzIER5bmFtaWNXaXphcmQgaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUKLXsKLSAgcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbl87Ci0gIAotICBwdWJsaWMgRHluYW1pY1BvcHVwV2l6YXJkKCkKLSAgewotCXN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkI2dldFdpemFyZFBhZ2VGYWN0b3J5KCkKLSAgICovCi0gIHByb3RlY3RlZCBXaXphcmRQYWdlRmFjdG9yeSBnZXRXaXphcmRQYWdlRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFNpbXBsZVBvcHVwUGFnZUZhY3RvcnkoIGdldElkKCkgKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KW9yaWdpbmFsRWxlbWVudF8uZ2V0UGFyZW50KCkpLmdldEF0dHJpYnV0ZSggImlkIiApOyAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIElBY3Rpb25EZWxlZ2F0ZSNydW4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgCi0gIHsKLSAgICBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgY29udGV4dCA9IFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dC5nZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICBpZCAgICAgID0gZ2V0SWQoKTsKLSAgICAKLQlpZiggY29udGV4dC5zaG93RGlhbG9nKGlkKSApCi0JewotCSAgLy8gTGF1bmNoIHRoZSB3aXphcmQuCi0JICBpbml0KCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBnZXRTZWxlY3Rpb24oKSApOyAgCi0JICAgIAotCSAgV2l6YXJkRGlhbG9nIGRpYWxvZz0gbmV3IFdpemFyZERpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIHRoaXMpOwotCSAgZGlhbG9nLnNldFBhZ2VTaXplKCA0MDAsIDUwMCApOwotCSAgZGlhbG9nLmNyZWF0ZSgpOwotCSAgZGlhbG9nLm9wZW4oKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZpbmFsIFByb2dyZXNzTW9uaXRvckRpYWxvZyBtb25pdG9yID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCSAgCi0JICB0cnkKLQkgIHsKLQkgICAgbW9uaXRvci5ydW4oIGZhbHNlLCBmYWxzZSwgbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yICkKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICBydW5IZWFkTGVzcyggZ2V0U2VsZWN0aW9uKCksIG1vbml0b3IgKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gKTsKLQkgIH0KLQkgIGNhdGNoKCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGMgKQotCSAgeyAKLQkgIH0KLQkgIGNhdGNoKCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YyApCi0JICB7Ci0JICB9Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogUnVucyBvbmx5IHRoZSBDb21tYW5kcyBhc3NvY2lhdGVkIHdpdGggdGhlIGR5bmFtaWMgd2l6YXJkLgotICAgKiAKLSAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gZnJvbSB0aGUgdXNlci4KLSAgICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgdGhhdCB0aGlzIGV4ZWN1dGlvbiBzaG91bGQgdGFrZSBwbGFjZSBpbi4gIFRoaXMKLSAgICogICAgICAgICAgICAgICAgaXMgdXN1YWxseSBhIHByb2dyZXNzIGNvbnRleHQgc28gdGhhdCB0aGUgdXNlciBjYW4gZ2V0IGZlZWRiYWNrCi0gICAqICAgICAgICAgICAgICAgIG9uIGhvdyBleGVjdXRpb24gaXMgcHJvZ3Jlc3NpbmcuICBUaGUgY29udGV4dCBtYXkgYmUgbnVsbC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bkhlYWRMZXNzKCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIElSdW5uYWJsZUNvbnRleHQgY29udGV4dCApCi0gIHsKLQlDb21tYW5kRnJhZ21lbnQgICAgICAgICAgICByb290RnJhZ21lbnQgICAgPSBnZXRSb290RnJhZ21lbnQoIHNlbGVjdGlvbiwgbnVsbCApOwotCVBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dCA9IFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLQlFY2xpcHNlU3RhdHVzSGFuZGxlciAgICAgICBoYW5kbGVyICAgICAgICAgPSBuZXcgRWNsaXBzZVN0YXR1c0hhbmRsZXIoKTsKLQlFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yICAgICBtb25pdG9yICAgICAgICAgPSBuZXcgRWNsaXBzZVByb2dyZXNzTW9uaXRvcigpOwotCUVjbGlwc2VFbnZpcm9ubWVudCAgICAgICAgIGVudmlyb25tZW50ICAgICA9IG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoIG51bGwsIHJlc291cmNlQ29udGV4dCwgbW9uaXRvciwgaGFuZGxlciApOwotCSAgICAKLQlEYXRhTWFwcGluZ1JlZ2lzdHJ5SW1wbCAgICBkYXRhUmVnaXN0cnlfICAgPSBuZXcgRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwoKTsJICAgIAotCURhdGFGbG93TWFuYWdlciAgICAgICAgICAgIGRhdGFNYW5hZ2VyICAgICA9IG5ldyBEYXRhRmxvd01hbmFnZXIoIGRhdGFSZWdpc3RyeV8sIGVudmlyb25tZW50ICk7Ci0JU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIgbWFuYWdlciAgICAgICAgID0gbmV3IFNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyKGVudmlyb25tZW50LCBkYXRhTWFuYWdlciApOwotCSAgCi0JY29tbWFuZFdpZGdldEJpbmRpbmdfLnJlZ2lzdGVyRGF0YU1hcHBpbmdzKCBkYXRhUmVnaXN0cnlfICk7Ci0JbWFuYWdlci5zZXRSb290RnJhZ21lbnQoIHJvb3RGcmFnbWVudCApOwotCW1hbmFnZXIucnVuRm9yd2FyZFRvTmV4dFN0b3AoIGNvbnRleHQgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSAKLSAgewotICAgICAgc2VsZWN0aW9uXyA9IHNlbGVjdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgICAKLQlpZiggc2VsZWN0aW9uXyAhPSBudWxsKSAKLQl7CQotCSAgaWYoIHNlbGVjdGlvbl8gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiApIAotCSAgewotCSAgICByZXN1bHQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uXzsKLQkgIH0KLQl9Ci0JZWxzZSAKLQl7Ci0JICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JICAKLQkgIGlmKCB3aW5kb3cgIT0gbnVsbCApIAotCSAgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQotCQlpZiggc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gKSAKLQkJewotCQkgIHJlc3VsdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCX0KLQkgIH0KLQl9Ci0JCi0JcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZW52L3VpL3dpZGdldHMvSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTU0Y2U5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIAotewotICAvKioKLSAgICogCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgV2lkZ2V0Q29udHJpYnV0b3IgZm9yIHRoaXMgTmFtZWQgd2lkZ2V0LgotICAgKi8KLSAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSBnZXRXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBuYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYSBkZXNjcmlwdGlvbiB0aGF0IG1pZ2h0IGJlIGRpc3BsYXllZCBvbgotICAgKiBhIHdpemFyZCBwYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbiAoKTsKLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRpdGxlIHRoYXQgbWF5IGJlIGRpc3BsYXllZCBvbiAKLSAgICogYSB3aXphcmQgcGFnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKTsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi91aS93aWRnZXRzL0lOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Vudi91aS93aWRnZXRzL0lOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg1ZmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9wcm92aXNpb25hbC9lbnYvdWkvd2lkZ2V0cy9JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLQotcHVibGljIGludGVyZmFjZSBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBmaXJzdCBuYW1lZCB3aWRnZXQuCi0gICAqLwotICBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXRGaXJzdE5hbWVkV2lkZ2V0KCk7Ci0gIAotICAvKioKLSAgICogCi0gICAqIEBwYXJhbSB3aWRnZXRDb250cmlidXRvcgotICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIG5leHQgbmFtZWQgd2lkZ2V0IGFmdGVyIHRoZSBvbmUgc3BlY2lmaWVkLgotICAgKi8KLSAgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KCBJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvciApOwotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgZXh0ZW5pb25zIHRvIHJlZ2lzdGVyIHRoZSBkYXRhIG1hcHBpbmdzCi0gICAqIHRoYXQgdGhlaXIgd2lkZ2V0cyB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gZGF0YVJlZ2lzdHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyggRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkgKTsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTBmYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXJ1bnRpbWUKLXRlbXAuZm9sZGVyCi1lbnYuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTBiNzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLndzdC5lbnYgcGx1Z2luLgotCi0jIFR1cm4gb24gZGVidWdnaW5nIG1hc3RlciBzd2l0Y2ggZm9yIHRoZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYgcGx1Z2luLgotb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L2RlYnVnPXRydWUKLQotIyBUdXJuIG9uIGRpZmZlcmVudCB0cmFjaW5nIGxldmVsCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2UvaW5mbz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2Uvd2FybmluZz10cnVlCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2UvZXJyb3I9dHJ1ZQotCi0jIFR1cm4gb24gZGF0YSBmbG93IHRyYWNpbmcKLW9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi90cmFjZS9kYXRhPXRydWUKLQotIyBUdXJuIG9uIGNvbW1hbmQgdHJhY2luZwotb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3RyYWNlL2NvbW1hbmQ9dHJ1ZQotCi0jIFR1cm4gb24gZW1pdHRlciB0cmFjaW5nCi1vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvdHJhY2UvZW1pdHRlcj10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRhZDEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNWJjYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IGVudi5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wbHVnaW4uRW52UGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbWFuZGxpbmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYucGx1Z2luLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wcmVmZXJlbmNlcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcwotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZkNjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVudi5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSAuY2xhc3NwYXRoLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuZW52LmphciA9IHNyYy8KLW91dHB1dC5lbnYuamFyID0gYmluLwotamFycy5jb21waWxlLm9yZGVyID0gZW52LmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkZTA4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPUVudmlyb25tZW50IENvbW1hbmQgRnJhbWV3b3JrIChoZWFkbGVzcykKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1QTFVHSU5fWFBfRFlOQU1JQ19XSVpBUkQ9RHluYW1pYyBXaXphcmQKLVBMVUdJTl9YUF9QT1BVUF9ESUFMT0dTPU9wdGlvbmFsIFBvcC11cCBBY3Rpb24gRGlhbG9ncyBUeXBlcwotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDNhNTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgIGlkPSJkeW5hbWljV2l6YXJkIgotICAgICAgbmFtZT0iJVBMVUdJTl9YUF9EWU5BTUlDX1dJWkFSRCIvPgotICAgCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICBpZD0iYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUiCi0gICAgICBuYW1lPSIlUExVR0lOX1hQX1BPUFVQX0RJQUxPR1MiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL0NvbW1hbmRMaW5lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL0NvbW1hbmRMaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWZiNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tYW5kbGluZS9Db21tYW5kTGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1hbmRsaW5lOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQml0U2V0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5TdHJpbmdVdGlsczsKLQotCi0vKioKLSAgKiA8cD5UaGlzIGlzIGEgZ2VuZXJpYyBjb21tYW5kIGxpbmUgcGFyc2luZyBjbGFzcy4gIFRoZSBwcm9ncmFtbWVyIG5lZWQgb25seSBzcGVjaWZ5Ci0gICogdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGVpciBjb21tYW5kIGxpbmUoaWUuIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZmxhZ3MsIGV0YykKLSAgKiBhbmQgdGhpcyBjbGFzcyB3aWxsIHBlcmZvcm0gdGhlIHJlc3Qgb2YgdGhlIHBhcnNpbmcgd29yay4gIEFzIGFuIGFkZGVkIGJvbnVzIHRoaXMKLSAgKiBjbGFzcyB3aWxsIGFsc28gY3JlYXRlIGZvcm1hdGVkIGhlbHAgdGV4dCB0aGF0IGRpc3BsYXlzIHRoZSBzeW50YXggb2YgdGhpcwotICAqIGNvbW1hbmQgbGluZS4KLSAgKgotICAqIDxwPlRoZSBtYWluIHBhcmFtZXRlciB0byB0aGUgQ29tbWFuZExpbmUgY29uc3RydWN0b3IgaXMgYSB0d28gZGltZW5zaW9uYWwgU3RyaW5nCi0gICogYXJyYXkuICBUaGVyZSBhcmUgNSBjb2x1bW5zIGluIHRoaXMgYXJyYXkgYW5kIGFzIG1hbnkgcm93cyBhcyBuZWVkZWQgZm9yIGVhY2gKLSAgKiBmbGFnIG9yIHBvc2l0aW9uYWwgcGFyYW1ldGVyLiAgVGhlIGZpdmUgY29sdW1ucyBhcmU6Ci0gICoKLSAgKiA8b2w+Ci0gICogPGxpPlRoZSBuYW1lIG9mIHRoZSBmbGFnKGVnLiAiaGVscCIgb3IgImEiLCBldGMpCi0gICogICAgIE5vdGU6IG5vIGRhc2ggc2hvdWxkIGJlIGluIHRoZSBuYW1lIGhlcmUuICBUaGUgdXNlciB3b3VsZCBzcGVjaWZ5ICItaGVscCIgb24gdGhlCi0gICogICAgICAgICAgIGNvbW1hbmQgbGluZSB0aG91Z2guCi0gICogPGxpPlRoZSBuYW1lIG9mIHRoZSBmbGFnIHBhcmFtZXRlcihpZiBhbnkpCi0gICogPGxpPkEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGlzIGZsYWcgY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZSBvbiB0aGUKLSAgKiAgICAgY29tbWFuZCBsaW5lLgotICAqIDxsaT5BIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBmbGFnIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICogPGxpPkEgaGVscCB0ZXh0IHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhpcyBwYXJ0aWN1bGFyIGZsYWcgb3IgcG9zaXRpb25hbCBwYXJhbWV0ZXIuCi0gICogPC9vbD4KLSAgKgotICAqIDxwPkVhY2ggcm93IGluIHRoZSBzdHJpbmcgYXJyYXkgaXMgYXNzb2NpYXRlIHdpdGggZWl0aGVyIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIKLSAgKiBvciB3aXRoIGEgZmxhZy4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIGNvbW1hbmQgbGluZToKLSAgKiA8dWw+Ci0gICogPGxpPk15X3Byb2cgcmVxdWlyZWRfcGFybTEgLWFiIHBhcm1fZm9yX2FiIHJlcXVpcmVkX3Bhcm0yIC1oZWxwIG9wdGlvbmFsX3Bhcm1zCi0gICogPC91bD4KLSAgKgotICAqIDxwPkluIHRoaXMgZXhhbXBsZSBNeV9wcm9nIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLiAgcmVxdWlyZWRfcGFybTEgYW5kCi0gICogcmVxdWlyZWRfcGFybTIgbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIE5vdGljZSB0aGF0IHRoZXkgZG8gbm90Ci0gICogaGF2ZSB0byBiZSBhZGphY2VudCB0byBlYWNoIG90aGVyIG9uIHRoZSBjb21tYW5kIGxpbmUuIG9wdGlvbmFsX3Bhcm1zIG1heSBvcHRpb25hbGx5Ci0gICogc3BlY2lmaWVkLiAgb3B0aW9uYWxfcGFybXMgY2FuIGJlIDAgb3IgbW9yZSBwYXJhbWV0ZXJzLiAgVGhleSBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gICogYWRqYWNlbnQgdG8gdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGJ1dCB0aGV5IGRvIG5lZWQgdG8gZm9sbG93IHRoZSByZXF1aXJlZAotICAqIHBhcmFtZXRlcnMuIFR3byBmbGFncyBhcmUgc3BlY2lmaWVkICItYWIiIGFuZCAiLWhlbHAiLiAgVGhlICItYWIiIGZsYWcgaGFzIGEKLSAgKiBwYXJhbWV0ZXIgInBhcm1fZm9yX2FiIiBhc3NvY2lhdGVkIHdpdGggaXQuICBOb3RlOiBhIGZsYWcgY2FuIG5vdCBoYXZlIGFuIG9wdGlvbmFsCi0gICogcGFyYW1ldGVyLiAoaWUuIGEgZmxhZyBlaXRoZXIgbmV2ZXIgaGF2ZSBhIHBhcmFtZXRlciBvciBpdCBhbHdheXMgaGFzIGEgcGFyYW1ldGVyKQotICAqIEluIHRoaXMgZXhhbXBsZSwgdGhlIGZpcnN0IHR3byByb3dzIGluIHRoZSBzdHJpbmcgYXJyYXkgd291bGQgZGVzY3JpYmUgcmVxdWlyZWRfcGFybTEKLSAgKiBhbmQgcmVxdWlyZWRfcGFybTIuICBUaGUgdGhpcmQgZW50cnkgd291bGQgZGVzY3JpYmUgb3B0aW9uYWxfcGFybXMuICBUaGUgZm91cnRoIGFuZAotICAqIGZpZnRoIHJvd3Mgd291bGQgZGVzY3JpYmUgIi1hYiIgYW5kICItaGVscCIuICBGb3IgdGhpcyBjb21tYW5kIGxpbmUgdGhlIHN0cmluZyBhcnJheQotICAqIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgotICAqCi0gICogPHVsPgotICAqIDxsaT57IHsgQ29tbWFuZExpbmUuUE9TSVRJT05BTCwgInBhcm0xIiwgQ29tbWFuZExpbmUuTk9fRFVQUywKLSAgKiAgICAgICBDb21tYW5kTGluZS5SRVFVSVJFRCwgInBhcm0xIGhlbHAgdGV4dCIgfSwKLSAgKiA8bGk+eyBDb21tYW5kTGluZS5QT1NJVElPTkFMLCAicGFybTIiLCBDb21tYW5kTGluZS5OT19EVVBTLAotICAqICAgICAgIENvbW1hbmRMaW5lLlJFUVVJUkVELCAicGFybTIgaGVscCB0ZXh0IiB9LAotICAqIDxsaT57IENvbW1hbmRMaW5lLlBPU0lUSU9OQUwsICJvcHRpb25hbF9wYXJtcyIsIENvbW1hbmRMaW5lLkRVUFNfT0ssCi0gICogICAgICAgQ29tbWFuZExpbmUuUkVRVUlSRUQsICJvcHRpb25hbCBoZWxwIHRleHQiIH0sCi0gICogPGxpPnsgImFiIiwgInBhcm1fZm9yX2FiIiwgQ29tbWFuZExpbmUuTk9fRFVQUywKLSAgKiAgICAgICBDb21tYW5kTGluZS5PUFRJT05BTCwgImFiIGhlbHAgdGV4dCIgfSwKLSAgKiA8bGk+eyAiaGVscCIsIENvbW1hbmRMaW5lLk5PX1BBUk0sIENvbW1hbmRMaW5lLk5PX0RVUFMsCi0gICogICAgICAgQ29tbWFuZExpbmUuT1BUSU9OQUwsICJkaXNwbGF5cyB0aGlzIGhlbHAgdGV4dCIgfSB9Ci0gICogPC91bD4KLSAgKgotICAqIDxwPlN0cmluZyBhcnJheSBydWxlczoKLSAgKgotICAqIDxvbD4KLSAgKiA8bGk+UG9zaXRpb25hbCByb3dzIG11c3QgYWx3YXlzIGNvbWUgZmlyc3QgaW4gdGhlIGFycmF5LiAgVGhlc2Ugcm93cyBtdXN0Ci0gICogICAgIGhhdmUgYSBuYW1lIHNwZWNpZmllZCBpbiBjb2x1bW4gMiwgZXhjZXB0IGZvciBvbmUgY2FzZS4gIElmIHlvdSB3YW50IHRvIGluZGljYXRlIHRoYXQKLSAgKiAgICAgdGhlcmUgYXJlIG5vIG9wdGlvbmFsIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB5b3Ugd291bGQgcHV0IENvbW1hbmRMaW5lLk5PX1BBUk0KLSAgKiAgICAgaW4gY29sdW1uIDIgb2YgdGhlIHBvc2l0aW9uYWwgcm93LiAgWW91IHdvdWxkIGFsc28gbmVlZCB0byBwdXQgQ29tbWFuZExpbmUuT1BUSU9OQUwKLSAgKiAgICAgaW4gY29sdW1uIDQgc2luY2UgdGhpcyByb3cgaXMgZm9yIG9wdGlvbmFsIHBhcmFtZXRlcnMob3IgdGhlIG5vbi1leGlzdGVuY2Ugb2YKLSAgKiAgICAgb3B0aW9uYWwgcGFyYW1ldGVycyBhcyB0aGUgY2FzZSBtYXkgYmUpCi0gICogPGxpPk9uY2UgYSBwb3NpdGlvbmFsIHJvdyBzcGVjaWZpZXMgdGhhdCBpdCBpcyBvcHRpb25hbCwgbm8gZnVydGhlciBwb3NpdGlvbmFsIHJvd3MKLSAgKiAgICAgbWF5IGJlIHNwZWNpZmllZC4KLSAgKiA8bGk+QXQgbGVhc3Qgb25lIHBvc2l0aW9uYWwgcm93IG11c3QgYmUgc3BlY2lmaWVkLCBldmVuIGlmIGl0IGlzIHRvIGp1c3QgdG8gc3BlY2lmeSB0aGF0Ci0gICogICAgIHRoZXJlIGFyZSBubyBvcHRpb25hbCBwYXJhbWV0ZXJzLgotICAqIDxsaT5GbGFnIG5hbWVzIG11c3QgYmUgaW4gbG93ZXIgY2FzZS4gIE5vdGU6IHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHVwcGVyIG9yIGxvd2VyIGNhc2UKLSAgKiAgICAgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgKiA8bGk+SWYgYSBmbGFnIGhhcyBhIHBhcmFtZXRlciB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSBwdXQgaW50byBjb2x1bW4gMi4KLSAgKiAgICAgb3RoZXJ3aXNlIENvbW1hbmRMaW5lLk5PX1BBUk0gc2hvdWxkIGJlIHB1dCBpbiBjb2x1bW4gMi4KLSAgKiA8bGk+SWYgYSBmbGFnIGlzIGFsbG93ZWQgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBjb21tYW5kIGxpbmUgdGhlbgotICAqICAgICBDb21tYW5kTGluZS5EVVBTX09LIHNob3VsZCBiZSBwdXQgaW50byBjb2x1bW4gMywgb3RoZXJ3aXNlIENvbW1hbmRMaW5lLk5PX0RVUFMKLSAgKiAgICAgc2hvdWxkIGJlIHB1dCBpbnRvIGNvbHVtbiAzLgotICAqIDxsaT5JZiBhIGZsYWcgbXVzdCBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSB0aGVuIENvbW1hbmRMaW5lLlJFUVVJUkVEIHNob3VsZAotICAqICAgICBiZSBzcGVjaWZpZWQgaW4gY29sdW1uIDQsIG90aGVyd2lzZSBDb21tYW5kTGluZS5PUFRJT05BTCBzaG91bGQgYmUgc3BlY2lmaWVkLgotICAqIDxsaT5BIGhlbHAgZmxhZyBtdXN0IGJlIHNwZWNpZmllZC4KLSAgKiA8bGk+VGhlIHN0cmluZ3Mgc3BlY2lmaWVkIGluIHRoZSBmbGFncyBjb2x1bW4sIHRoZSBwYXJhbWV0ZXIgbmFtZSBjb2x1bW4sIGFuZCB0aGUKLSAgKiAgICAgaGVscCBjb2x1bW4gYXJlIGFsd2F5cyB0cmFuc2xhdGVkIHVzaW5nIHRoZSByZXNvdXJjZSBidW5kbGUgc3BlY2lmaWVkLiAgT2YKLSAgKiAgICAgY291cnNlIHRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZXMgc3VjaCBhcyBQT1NJVElPTkFMIGFuZCBOT19QQVJNIGFyZSBub3QKLSAgKiAgICAgdHJhbnNsYXRlZC4KLSAgKiA8L29sPgotICAqCi0gICogPHA+IEZsYWcgbWF0Y2hpbmcgcnVsZXM6Ci0gICogPG9sPgotICAqIDxsaT5UaGUgcGFyc2VyIHdpbGwgYXR0ZW1wdCB0byBtYXRjaCBhIHVzZXIgc3BlY2lmaWVkIGZsYWcgd2l0aCB0aGUgbWluaW11bSBudW1iZXIKLSAgKiAgICAgb2YgcHJvZ3JhbW1lciBzcGVjaWZpZWQgZmxhZyBjaGFyYWN0ZXJzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9ncmFtbWVyIGhhcwotICAqICAgICBzcGVjaWZpZWQgdGhhdCB0aGUgZmxhZyBpcyAiaGVscCIgdGhlIHVzZXIgY291bGQgc3BlY2lmeSAiLWgiLCAiLWhlIiwgIi1oZWwiLCBvcgotICAqICAgICAiLWhlbHAiLiAgSWYgdGhlIHByb2dyYW1tZXIgaGFzIGFsc28gc3BlY2lmaWVkIGEgZmxhZyBjYWxsZWQgImhlbGxvIiwgdGhlCi0gICogICAgIHVzZXIgd291bGQgZ2V0IGFuIGVycm9yIG1lc3NhZ2UgZm9yIHNwZWNpZmluZyBlaXRoZXIgIi1oIiwgIi1oZSIgb3IgIi1oZWwiLCBzaW5jZQotICAqICAgICBpdCBpcyBhbWJpZ3VvdXMgd2hpY2ggZmxhZyBpcyBiZWluZyByZWZlcmVkIHRvLiAgQm90aCAiLWhlbGwiIGFuZCAiLWhlbGxvIgotICAqICAgICB3b3VsZCBiZSBvayBmb3IgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgaGVsbG8gZmxhZyBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAqIDxsaT5JZiBhIGZsYWcgaGFzIGEgcGFyYW1ldGVyLCB0aGUgcGFyYW1ldGVyIG1heSBiZSBpbW1lZGlhdGVseSBhZGphY2VudCB0byB0aGUgZmxhZy4KLSAgKiAgICAgRm9yIGV4YW1wbGUgaWYgImFiY2QiIGlzIHNwZWNpZmllZCBhcyBhIGZsYWcgd2l0aCBhIHBhcmFtZXRlciwgdGhlIHVzZXIgY291bGQKLSAgKiAgICAgc3BlY2lmeSB0aGUgZm9sbG93aW5nIGFzc3VtaW5nIHRoZXJlIGFyZSBubyBvdGhlciBhbWJpZ3VvdXMgZmxhZ3MuICItYWJjZHBhcm0iLAotICAqICAgICAiLWFiY3Bhcm0iLCAiLWFicGFybSIsIG9yICItYXBhcm0iIHdoZXJlIHBhcm0gaXMgdGhlIHBhcmFtZXRlciBmb3IgdGhlIGZsYWcuCi0gICogICAgIChPZiBjb3Vyc2UgdGhlIHVzZXIgY2FuIGFsd2F5cyBwdXQgYSB3aGl0ZSBzcGFjZSBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUKLSAgKiAgICAgcGFyYW1ldGVyLikKLSAgKiA8bGk+SWYgYSBmbGFnIGRvZXMgbm90IGhhdmUgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGlzIGFkamFjZW50IHRvIGl0IHRoZW4gdGhpcwotICAqICAgICBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQgYXMgYSBwb3NpdGlvbmFsIHBhcmFtZXRlci4gIEZvciBleGFtcGxlIGlmICJhYmNiIiBpcwotICAqICAgICBzcGVjaWZpZWQgYXMgYSBmbGFnIGFuZCB0aGUgdXNlciBzcGVjaWZpZXMgIi1hYmhlbGxvIiwgdGhlbiB0aGUgZmlyc3QgImFiIiB3aWxsIGJlCi0gICogICAgIGludGVycHJldGVkIGFzIHRoZSBmbGFnIGFuZCAiaGVsbG8iIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYSBwb3NpdGlvbmFsCi0gICogICAgIHBhcmFtZXRlci4KLSAgKiA8L29sPgotICAqCi0gICogQGF1dGhvciBQZXRlciBNb29nawotICAqIEBkYXRlICAgSnVseSAxMywgMjAwMAotKiovCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTGluZQotewotICAvLyBDb25zdGFudCBzdHJpbmdzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIHVzZSBpbiB0aGVpciBmbGFnc19pbmZvIGlucHV0IGFycmF5LgotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IHRoaXMgZmxhZyBvciBwb3NpdGlvbmFsIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVEICAgPSAicmVxdWlyZWQiOwotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IHRoaXMgZmxhZyBvciBwb3NpdGlvbmFsIHBhcmFtZXRlciBpcyBvcHRpb25hbC4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMICAgPSAib3B0aW9uYWwiOwotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IHRoaXMgZmxhZyBtYXkgYmUgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgKiBOb3RlOiBUaGlzIHN0cmluZyBoYXMgbm8gbWVhbmluZyBmb3IgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFVQU19PSyAgICA9ICJkdXBzX29rIjsKLSAgLyoqCi0gICAgKiBTcGVjaWZpZXMgdGhhdCB0aGlzIGZsYWcgbWF5IG5vdCBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAqIE5vdGU6IFRoaXMgc3RyaW5nIGhhcyBubyBtZWFuaW5nIGZvciBwb3NpdGlvbmFsIHBhcmFtZXRlcnMuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19EVVBTICAgID0gIm5vX2R1cHMiOwotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IGEgcm93IGlzIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIgcm93LgotICAqKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TSVRJT05BTCA9ICIiOwotICAvKioKLSAgICAqIFNwZWNpZmllcyB0aGF0IGEgZmxhZyBoYXMgbm8gcGFyYW1ldGVyLiAgRm9yIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB0aGlzCi0gICAgKiBzdHJpbmcgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIG9wdGlvbmFsIHBhcmFtZXRlcnMuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19QQVJNICAgID0gIiI7Ci0gIAotICAvKioKLSAgICAqIEBwYXJhbSBmbGFnc19pbmZvIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZQotICAgICogICAgICAgICAgICAgICAgICAgY29tbWFuZCBsaW5lIHBhcnNlci4gIFNlZSB0aGUgY2xhc3MgZGVzY3JpcHRpb24gZm9yIGEKLSAgICAqICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24gb2Ygd2hhdCB0aGlzIHN0cmluZyBhcnJheSBzaG91bGQgbG9vayBsaWtlLgotICAgICogQHBhcmFtIGhlbHBfZmxhZyAgVGhpcyBzdHJpbmcgaW5kaWNhdGVzIHdoaWNoIGZsYWcgaW4gdGhlIGZsYWdzX2luZm8KLSAgICAqICAgICAgICAgICAgICAgICAgIGFycmF5IGlzIHRoZSBoZWxwIGZsYWcuCi0gICAgKiBAcGFyYW0gdG9vbF9uYW1lICBUaGlzIHN0cmluZyBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIHRvb2wgdGhhdCB0aGlzCi0gICAgKiAgICAgICAgICAgICAgICAgICBjb21tYW5kIGxpbmUgcGFyc2VyIGlzIGJlaW5nIHVzZWQgZm9yLiAgVGhpcyBzdHJpbmcKLSAgICAqICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBoZWxwIHRleHQuCi0gICoqLwotICBwdWJsaWMgQ29tbWFuZExpbmUoIFN0cmluZ1tdW10gICAgIGZsYWdzX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgICAgICAgIGhlbHBfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgICAgICAgdG9vbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUJ1bmRsZSBmbGFnTWVzc2FnZXMgKQotICAgICAgICAgICAgICAgICAgIAotICAgIHRocm93cyBJbnRlcm5hbEVycm9yRXhjCi0gIHsKLSAgICB0aGlzLmZsYWdzX2luZm8gICA9IGZsYWdzX2luZm87Ci0gICAgdGhpcy5oZWxwX2ZsYWcgICAgPSBoZWxwX2ZsYWc7Ci0gICAgdGhpcy50b29sX25hbWUgICAgPSB0b29sX25hbWU7Ci0gICAgdGhpcy5mbGFnTWVzc2FnZXMgPSBmbGFnTWVzc2FnZXM7Ci0gICAgCi0gICAgbWVzc2FnZXMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbWFuZGxpbmUuY29tbWFuZGxpbmUiICk7Ci0gICAgdmVyaWZ5X2ZsYWdzX2luZm8oKTsKLSAgfQotCi0gIC8qKgotICAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBwYXJzZSBhIGNvbW1hbmQgbGluZS4KLSAgICAqIEBwYXJhbSBhcmdzIFRoaXMgaXMgdGhlIHN0cmluZyBhcnJheSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgKiBAdGhyb3dzIEZsYWdfZXJyb3IgSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGUgY29tbWFuZCBsaW5lIGluY29ycmVjdGx5Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgYSBGbGFnX2Vycm9yIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gIFVzZSBnZXRNZXNzYWdlCi0gICAgKiAgICAgICAgICAgICAgICAgICAgdG8gZ2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIHVzZXIgZXJyb3IuCi0gICAgKgotICAgICogQHRocm93cyBIZWxwX3NwZWNpZmllZCBJZiB0aGUgdXNlciBzcGVjaWZpZXMgdGhlIGhlbHAgZmxhZyB0aGlzIGV4Y2VwdGlvbgotICAgICogICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHRocm93bi4gIFVzZSBnZXRNZXNzYWdlIHRvIGdldCBhIGZ1bGx5Ci0gICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCBzeW50YXggZGVzY3JpcHRpb24gb2YgdGhpcyBjb21tYW5kIGxpbmUuCi0gICoqLwotICBwdWJsaWMgdm9pZCBjaGVja19mbGFncyggU3RyaW5nW10gYXJncyApIHRocm93cyBGbGFnX2Vycm9yCi0gIHsKLSAgICBmbGFnc19zcGVjaWZpZWQgPSBuZXcgVmVjdG9yW2ZsYWdzX2luZm8ubGVuZ3RoXTsKLQotICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBhcmdzLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgewotICAgICAgYm9vbGVhbiBwcm9jZXNzZWRfdGhlX25leHRfYXJnID0gcHJvY2Vzc19hcmcoIGFyZ3MsIGluZGV4ICk7Ci0gICAgICBpZiggcHJvY2Vzc2VkX3RoZV9uZXh0X2FyZyA9PSB0cnVlICkgaW5kZXgrKzsKLSAgICB9Ci0KLSAgICAvLyBJZiBoZWxwIHdhcyBzcGVjaWZpZWQgd2Ugd2lsbCBub3QgY2hlY2sgdGhlIHJlZ3VsYXIgcnVsZXMuCi0gICAgaWYoICFmbGFnX3NwZWNpZmllZCggaGVscF9mbGFnICkgKQotICAgIHsKLSAgICAgIC8vIENoZWNrIGZvciBmbGFncyBicmVha2luZyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIGZsYWdzX2luZm8uCi0gICAgICBjaGVja19ydWxlcygpOwotCi0gICAgICAvLyBDYWxsIHN1YmNsYXNzZWQgbWV0aG9kIHRvIHNlZSBpZiBtb3JlIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuCi0gICAgICBtb3JlX3Byb2Nlc3NpbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIGlzIGZvciBzdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3MuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXQKLSAgICAqIHRoZSB2ZXJ5IGVuZCBvZiBjaGVja19mbGFncyBtZXRob2QuICBJdCBpcyBpbnRlbmRlZCB0aGF0IHN1YmNsYXNzZXMgd291bGQKLSAgICAqIHBlcmZvcm0gYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgY2hlY2tpbmcgaGVyZS4KLSAgKiovCi0gIHByb3RlY3RlZCB2b2lkIG1vcmVfcHJvY2Vzc2luZygpIHRocm93cyBGbGFnX2Vycm9yLCBJbnRlcm5hbEVycm9yRXhjCi0gIHsKLSAgfQotCi0gIC8qKgotICAgICogT25jZSB0aGUgY29tbWFuZCBsaW5lIGhhcyBiZWVuIHBhcnNlZCBieSBjYWxsaW5nIGNoZWNrX2ZsYWdzIGEKLSAgICAqIGNhbGwgY2FuIGJlIG1hZGUgdG8gdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGZsYWcuCi0gICAgKiBJZiB0aGUgZmxhZyB3YXMgbm90IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAqIElmIHRoZSBmbGFnIHdhcyBzcGVjaWZpZWQsIGJ1dCBoYXMgbm8gcGFyYW1ldGVycyBhIHZhbGlkIHZlY3RvciB3aWxsIGJlCi0gICAgKiByZXR1cm5lZCBjb250YWluaW5nIGEgbnVsbC4KLSAgKiovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRfZmxhZ19wYXJtcyggU3RyaW5nIGZsYWcgKQotICB7Ci0gICAgaW50ICAgICByb3cgICAgICAgID0gMDsKLSAgICBib29sZWFuIGZsYWdfZm91bmQgPSBmYWxzZTsKLQotICAgIHdoaWxlKCBmbGFnX2ZvdW5kID09IGZhbHNlICYmIHJvdyA8IGZsYWdzX2luZm8ubGVuZ3RoICkKLSAgICB7Ci0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXS5lcXVhbHMoIGZsYWcgKSApCi0gICAgICB7Ci0gICAgICAgIGZsYWdfZm91bmQgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByb3crKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiggZmxhZ19mb3VuZCA9PSB0cnVlICkgCi0gICAgewotICAgICAgVmVjdG9yIHBhcm1zID0gZmxhZ3Nfc3BlY2lmaWVkW3Jvd107Ci0gICAgICByZXR1cm4gcGFybXMgPT0gbnVsbCA/IG51bGwgOiAoU3RyaW5nW10pKHBhcm1zLnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZ2V0IGFsbCBvZiB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgotICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBib3RoIHRoZSByZXF1aXJlZCBwb3NpdGlvbmFscyBhbmQgdGhlCi0gICAgKiBvcHRpb25hbCBwb3NpdGlvbmFscyBpbiB0aGF0IG9yZGVyLiAgSWYgbm8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzCi0gICAgKiB3ZXJlIHNwZWNpZmllZCBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0gICoqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0X3Bvc2l0aW9uYWxzKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nW10pZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXS50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGZsYWcgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlcgotICAgICogb3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgotICAqKi8KLSAgcHVibGljIGJvb2xlYW4gZmxhZ19zcGVjaWZpZWQoIFN0cmluZyBmbGFnICkKLSAgewotICAgIHJldHVybiBnZXRfZmxhZ19wYXJtcyggZmxhZyApICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZnVsbHkgZm9ybWF0ZWQgaGVscCB0ZXh0IHN5bnRheCBmb3IgdGhpcwotICAgICogY29tbWFuZCBsaW5lLgotICAqKi8KLSAgcHVibGljIFN0cmluZyBnZXRfaGVscF90ZXh0KCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBoZWxwX3RleHQgID0gbmV3IFN0cmluZ0J1ZmZlcig0MDApOwotICAgIGludCAgICAgICAgICBoZWxwX3dpZHRoID0gSEVMUF9MSU5FX0xFTiAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gICAgICAgICAgICAgIC8vIGJsYW5rcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtICAgICAgICAgICAgICAvLyBkYXNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZmxhZ19zaXplIC0gIC8vIGZsYWcgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSAgICAgICAgICAgICAgLy8gYmxhbmsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9uYW1lX3NpemUgLSAgLy8gbmFtZSBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsgICAgICAgICAgICAgICAvLyBibGFuawotCi0gICAgaGVscF90ZXh0LmFwcGVuZCggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0lORk9fU1lOVEFYICkgKwotICAgICAgICAgICAgICAgICAgICAgICI6ICIgKyB0b29sX25hbWUgKyAiICIgKTsKLQotICAgIC8vIERpc3BsYXkgdGhlIHJlcXVpcmVkIHBvc2l0aW9uYWxzIGlmIGFueS4KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgcmVxdWlyZWRfcG9zaXRpb25hbHM7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9baW5kZXhdW05BTUVfQ09MXSApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgIiApOwotICAgIH0KLQotICAgIGhlbHBfdGV4dC5hcHBlbmQoICJbIiArIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9GTEFHUyApICsKLSAgICAgICAgICAgICAgICAgICAgICAiXSAiICk7Ci0KLSAgICBpZiggb3B0aW9uYWxfcG9zaXRpb25hbHNfYWxsb3dlZCA9PSB0cnVlICkKLSAgICB7Ci0gICAgICBoZWxwX3RleHQuYXBwZW5kKCBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW29wdGlvbmFsX2xpc3RfaW5kZXhdW05BTUVfQ09MXSApICk7Ci0gICAgfQotCi0gICAgaGVscF90ZXh0LmFwcGVuZCggIlxuICAiICsgbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0lORk9fV0hFUkUgKSArICJcbiIgKTsKLQotICAgIC8vIENyZWF0ZSBvbmUgbGluZSBvZiBkZXNjcmlwdGlvbiBmb3IgZWFjaCBwYXJhbWV0ZXIKLSAgICBmb3IoIGludCByb3cgPSAwOyByb3cgPCBmbGFnc19pbmZvLmxlbmd0aDsgcm93KysgKQotICAgIHsKLSAgICAgIFN0cmluZyBjb2x1bW5JZCAgID0gZmxhZ3NfaW5mb1tyb3ddW05BTUVfQ09MXTsKLSAgICAgIFN0cmluZyBjb2x1bW5OYW1lID0gY29sdW1uSWQgPT0gTk9fUEFSTSA/ICIiIDogZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggY29sdW1uSWQgKTsKLQotICAgICAgU3RyaW5nIGZsYWdJZCAgICAgPSBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdOwotICAgICAgU3RyaW5nIGZsYWdOYW1lICAgPSBmbGFnSWQgPT0gUE9TSVRJT05BTCA/IFBPU0lUSU9OQUwgOiBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKGZsYWdJZCk7Ci0KLSAgICAgIGludCBmbGFnX3BhZGRpbmcgPSBtYXhfZmxhZ19zaXplIC0gZmxhZ05hbWUubGVuZ3RoKCk7Ci0gICAgICBpbnQgbmFtZV9wYWRkaW5nID0gbWF4X25hbWVfc2l6ZSAtIGNvbHVtbk5hbWUubGVuZ3RoKCk7Ci0KLSAgICAgIC8vIFNraXAgdGhpcyByb3cgaWYgdGhpcyBpcyBhIG1hcmtlciBmb3Igbm8gb3B0aW9uYWwgcG9zaXRpb25hbHMuCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBQT1NJVElPTkFMICYmCi0gICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW05BTUVfQ09MXSA9PSBOT19QQVJNICkgY29udGludWU7Ci0KLSAgICAgIGlmKCBmbGFnTmFtZSA9PSBQT1NJVElPTkFMICkKLSAgICAgIHsKLSAgICAgICAgaGVscF90ZXh0LmFwcGVuZCggZ2V0QmxhbmtzKDMgKSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoZWxwX3RleHQuYXBwZW5kKCAiICAtIiArIGZsYWdOYW1lICk7Ci0gICAgICB9Ci0KLSAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIGdldEJsYW5rcyggZmxhZ19wYWRkaW5nICsgMSApICk7Ci0gICAgICBoZWxwX3RleHQuYXBwZW5kKCBjb2x1bW5OYW1lICk7Ci0gICAgICBoZWxwX3RleHQuYXBwZW5kKCBnZXRCbGFua3MoIG5hbWVfcGFkZGluZyArIDEgKSApOwotCi0gICAgICBTdHJpbmcgICBjb2x1bW5IZWxwID0gZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW0hFTFBfQ09MXSApOwotICAgICAgU3RyaW5nW10gc3BsaXRfaGVscF90ZXh0Ci0gICAgICAgID0gU3RyaW5nVXRpbHMuc3BsaXR0ZXIoIGNvbHVtbkhlbHAsIGhlbHBfd2lkdGggKTsKLQotICAgICAgaWYoIHNwbGl0X2hlbHBfdGV4dC5sZW5ndGggPiAwICkKLSAgICAgICAgaGVscF90ZXh0LmFwcGVuZCggc3BsaXRfaGVscF90ZXh0WzBdICsgIlxuIiApOwotICAgICAgZWxzZQotICAgICAgICBoZWxwX3RleHQuYXBwZW5kKCAiXG4iICk7Ci0KLSAgICAgIGZvciggaW50IGluZGV4ID0gMTsgaW5kZXggPCBzcGxpdF9oZWxwX3RleHQubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgIHsKLSAgICAgICAgaGVscF90ZXh0LmFwcGVuZCggZ2V0QmxhbmtzKCBIRUxQX0xJTkVfTEVOIC0gaGVscF93aWR0aCApICk7Ci0gICAgICAgIGhlbHBfdGV4dC5hcHBlbmQoIHNwbGl0X2hlbHBfdGV4dFtpbmRleF0gKyAiXG4iICk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGhlbHBfdGV4dC5hcHBlbmQoICJcbiIgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gIiIgKyBoZWxwX3RleHQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAgUmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYmxhbmtzLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmxhbmtzKCBpbnQgY291bnQgKQotICB7Ci0gIAljaGFyW10gYmxhbmtzID0gbmV3IGNoYXJbY291bnRdOwotICAJQXJyYXlzLmZpbGwoIGJsYW5rcywgMCwgY291bnQsICcgJyApOwotICAJCi0gIAlyZXR1cm4gbmV3IFN0cmluZyggYmxhbmtzICk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgZm9yIGFsbCBjb21tYW5kIGxpbmUgZXhjZXB0aW9uIGNsYXNzZXMuCi0gICoqLwotICBzdGF0aWMgcHVibGljIGNsYXNzIEVycm9yRXhjIGV4dGVuZHMgRXhjZXB0aW9uCi0gIHsKLSAgCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU2NzMxNzI1OTc5MzcyMEw7Ci0KLQlwdWJsaWMgRXJyb3JFeGMoIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBhcmdzICkKLSAgCXsKLSAgCSAgc3VwZXIoIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCBtZXNzYWdlLCBhcmdzICkgKTsKLSAgCX0KLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBjbGFzcyB3aWxsIGJlIHRocm93biB3aGVuIGFuIGludGVybmFsIGVycm9yIGlzIGRldGVjdGVkLgotICAgICogVGhpcyB1c3VhbGx5IGhhcHBlbnMgaWYgdGhlIGZsYWcgZGVzY3JpcHRpb24gaW5mb3JtYXRpb24gd2FzCi0gICAgKiBzcGVjaWZpZWQgaW5jb3JyZWN0bHkuCi0gICoqLwotICBzdGF0aWMgcHVibGljIGNsYXNzIEludGVybmFsRXJyb3JFeGMgZXh0ZW5kcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgeyAgCQotICAJLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4NDEwNjIxMTM2NjE0NDUwTDsKLQotCXB1YmxpYyBJbnRlcm5hbEVycm9yRXhjKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nW10gYXJncyApCi0gIAl7Ci0gIAkgIHN1cGVyKCBNZXNzYWdlRm9ybWF0LmZvcm1hdCggbWVzc2FnZSwgYXJncyApICk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBJbnRlcm5hbEVycm9yRXhjKCBTdHJpbmcgbWVzc2FnZSApCi0gIAl7Ci0gIAkgIHRoaXMoIG1lc3NhZ2UsIChTdHJpbmdbXSludWxsICk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBJbnRlcm5hbEVycm9yRXhjKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGFyZyApCi0gIAl7Ci0gIAkgIHRoaXMoIG1lc3NhZ2UsIG5ldyBTdHJpbmdbXXsgYXJnIH0gKTsKLSAgCX0KLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBjbGFzcyB3aWxsIGJlIHRocm93biBpZiBhIHVzZXIgZXJyb3Igb2NjdXJzIHdoaWxlIHBhcnNpbmcgdGhlIGNvbW1hbmQgbGluZS4KLSAgKiovCi0gIHN0YXRpYyBwdWJsaWMgY2xhc3MgRmxhZ19lcnJvciBleHRlbmRzIEVycm9yRXhjCi0gIHsKLSAgICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MzI2MjE3NzY4Nzc2NjM1MzdMOwotCi0JcHVibGljIEZsYWdfZXJyb3IoIFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICBzdXBlciggbWVzc2FnZSwgYXJncyApOwotICAgIH0KLQotICAgIHB1YmxpYyBGbGFnX2Vycm9yKCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGFyZyApCi0gICAgewotICAgICAgc3VwZXIoIG1lc3NhZ2UsIG5ldyBTdHJpbmdbXXsgYXJnIH0gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmxhZ19lcnJvciggU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgIHN1cGVyKCBtZXNzYWdlLCBudWxsICk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAgKiBUcmllcyB0byBwcm9jZXNzIGEgc2luZ2xlIGZsYWcgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAqIEBwYXJhbSAgYXJncyAgICAgIEFsbCB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCi0gICAgKiBAcGFyYW0gIGFyZ19pbmRleCBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGUgYXJndW1lbnQgdGhhdCBpcyB0byBiZSBwcm9jZXNzZWQuCi0gICAgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgd2UgYXJlIHByb2Nlc3NpbmcgaXMgYSBmbGFnIHRoYXQgaGFzIGEKLSAgICAqICAgICAgICAgcGFyYW1ldGVyIGFuZCB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgbmV4dCBhcmd1bWVudC4KLSAgKiovCi0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzX2FyZyggU3RyaW5nW10gYXJncywgaW50IGFyZ19pbmRleCApIHRocm93cyBGbGFnX2Vycm9yCi0gIHsKLSAgICBib29sZWFuIHByb2Nlc3NlZF9uZXh0X2FyZyA9IGZhbHNlOwotCi0gICAgaWYoIGFyZ3NbYXJnX2luZGV4XS5jaGFyQXQoMCkgPT0gJy0nICkKLSAgICB7Ci0gICAgICAvLyBUaGlzIGlzIHRoZSBzdGFydCBvZiBhIGZsYWcuCi0gICAgICBpbnQgZmxhZ19pbmRleCA9IDE7Ci0gICAgICBpbnQgaW5mb19pbmRleCA9IGdldF9pbmZvX2luZGV4KCBhcmdzW2FyZ19pbmRleF0sIGZsYWdfaW5kZXggKTsKLSAgICAgIGludCBtYXhfaW5kZXggID0gZ2V0X21heF9pbmRleCggYXJnc1thcmdfaW5kZXhdLCBmbGFnX2luZGV4LCBpbmZvX2luZGV4ICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW2luZm9faW5kZXhdW05BTUVfQ09MXSAhPSBOT19QQVJNICkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhpcyBmbGFnIHRha2VzIGEgcGFyYW1ldGVyIHNvIGNoZWNrIGlmIGl0IGlzIHN0dWNrIHRvIHRoaXMKLSAgICAgICAgLy8gYXJnLgotICAgICAgICBpZiggbWF4X2luZGV4IDwgYXJnc1thcmdfaW5kZXhdLmxlbmd0aCgpICkKLSAgICAgICAgewotICAgICAgICAgIGFkZF9mbGFnX3Bhcm0oIGluZm9faW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdfaW5kZXhdLnN1YnN0cmluZyggbWF4X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnX2luZGV4XS5sZW5ndGgoKSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gVGhpcyBmbGFnIGhhcyBhIHBhcmFtZXRlciBhbmQgaXQgd2Fzbid0IHN0dWNrIHRvIHRoZSBmbGFnLAotICAgICAgICAgIC8vIHNvIHdlIHdpbGwgdHJ5IHRvIGdldCBpdCBmcm9tIHRoZSBuZXh0IGFyZy4KLSAgICAgICAgICBpZiggYXJnX2luZGV4KzEgPCBhcmdzLmxlbmd0aCAmJgotICAgICAgICAgICAgICBhcmdzW2FyZ19pbmRleCsxXS5jaGFyQXQoMCkgIT0gJy0nICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBmb3VuZCBhbiBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgc3RyaW5nIHNvIHdlIHdpbGwgdXNlIHRoaXMKLSAgICAgICAgICAgIC8vIG9uZSBhcyBhIHBhcmFtZXRlciBmb3IgdGhpcyBmbGFnLiAgTm90ZTogaWYgd2FzIG5vIHBhcmFtZXRlcgotICAgICAgICAgICAgLy8gYWZ0ZXIgdGhlIGZsYWcgYXQgYWxsLCB0aGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgaW4gdGhlCi0gICAgICAgICAgICAvLyBjaGVja19ydWxlcyBtZXRob2QuCi0gICAgICAgICAgICBhZGRfZmxhZ19wYXJtKCBpbmZvX2luZGV4LCBhcmdzW2FyZ19pbmRleCsxXSApOwotICAgICAgICAgICAgcHJvY2Vzc2VkX25leHRfYXJnID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEVycm9yIG1pc3NpbmcgcGFyYW1hdGVyLiBUaGlzIGVycm9yIGlzIGNhdWdodCBieSBjaGVja19ydWxlcy4KLSAgICAgICAgICAgIGFkZF9mbGFnX3Bhcm0oIGluZm9faW5kZXgsIG51bGwgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlIGZsYWcgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciBzbyB3ZSB3aWxsIGFkZCBhIG51bGwuCi0gICAgICAgIGFkZF9mbGFnX3Bhcm0oIGluZm9faW5kZXgsIG51bGwgKTsKLQotICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgYSBwb3NpdGlvbmFsIHBhcmFtZXRlciBpcyBzdHVjayB0byB0aGlzIGZsYWcuCi0gICAgICAgIGlmKCBtYXhfaW5kZXggPCBhcmdzW2FyZ19pbmRleF0ubGVuZ3RoKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgYWRkX3Bvc2l0aW9uYWwoIGFyZ3NbYXJnX2luZGV4XS5zdWJzdHJpbmcoIG1heF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdfaW5kZXhdLmxlbmd0aCgpICkgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVGhpcyBpcyBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyLgotICAgICAgYWRkX3Bvc2l0aW9uYWwoIGFyZ3NbYXJnX2luZGV4XSApOwotICAgIH0KLQotICAgIHJldHVybiBwcm9jZXNzZWRfbmV4dF9hcmc7Ci0gIH0KLQotICAvKioKLSAgICAqIEZpbmRzIHRoZSByb3cgZm9yIHRoZSBmbGFnIHRoYXQgdW5pcXVlbHkgbWF0Y2hlZCB0aGlzIGZsYWcgc3RyLgotICAgICogQHJldHVybiByZXR1cm5zIHRoZSBmbGFnc19pbmZvIGluZGV4IG9mIHRoZSBtYXRjaGluZyBmbGFnLgotICAqKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0X2luZm9faW5kZXgoIFN0cmluZyBmbGFnX3N0ciwgaW50IHN0YXJ0X2luZGV4ICkKLSAgICB0aHJvd3MgRmxhZ19lcnJvcgotICB7Ci0gICAgLy9pbnQgaW5mb19zdGFydCAgPSAxOwotICAgIC8vaW50IGluZm9fZW5kICAgID0gZmxhZ3NfaW5mby5sZW5ndGg7Ci0gICAgaW50IGluZm9faW5kZXg7Ci0gICAgaW50IGZvdW5kX2NvdW50ID0gMDsKLSAgICBpbnQgaW5mb19jb2xfaW5kZXggPSAwOwotICAgIGludCBsYXN0X2luZm9faW5kZXggPSAwOwotCi0gICAgQml0U2V0IGZsYWdzX3JlamVjdGVkID0gbmV3IEJpdFNldCgpOwotCi0gICAgLy8gTG9vcCBvdmVyIGVhY2ggY2hhciBpbiBmbGFnX3N0ci4gIE5vdGU6IHdlIHdpbGwgcHJvYmFibHkgYmFpbCBlYXJseS4KLSAgICBmb3IoIGludCBmbGFnX2NvbF9pbmRleCA9IHN0YXJ0X2luZGV4OyBmbGFnX2NvbF9pbmRleCA8IGZsYWdfc3RyLmxlbmd0aCgpOyBmbGFnX2NvbF9pbmRleCsrICkKLSAgICB7Ci0gICAgICAvLyBMb29wIG92ZXIgZWFjaCBmbGFnIGluIGZsYWdfaW5mbwotICAgICAgZm9yKCBpbmZvX2luZGV4ID0gMDsgaW5mb19pbmRleCA8IGZsYWdzX2luZm8ubGVuZ3RoOyBpbmZvX2luZGV4KysgKQotICAgICAgewotICAgICAgICBTdHJpbmcgZmxhZ0lkICAgPSBmbGFnc19pbmZvW2luZm9faW5kZXhdW0ZMQUdfQ09MXTsKLSAgICAgICAgU3RyaW5nIGZsYWdOYW1lID0gZmxhZ0lkID09IFBPU0lUSU9OQUwgPyBQT1NJVElPTkFMIDogZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ0lkICk7Ci0KLSAgICAgICAgaWYoIGZsYWdzX3JlamVjdGVkLmdldCggaW5mb19pbmRleCApID09IGZhbHNlICYmCi0gICAgICAgICAgICBpbmZvX2NvbF9pbmRleCA8IGZsYWdOYW1lLmxlbmd0aCgpICYmCi0gICAgICAgICAgICAgIENoYXJhY3Rlci50b0xvd2VyQ2FzZShmbGFnX3N0ci5jaGFyQXQoZmxhZ19jb2xfaW5kZXgpKSA9PQotICAgICAgICAgICAgICBmbGFnTmFtZS5jaGFyQXQoaW5mb19jb2xfaW5kZXgpICkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kX2NvdW50Kys7Ci0gICAgICAgICAgbGFzdF9pbmZvX2luZGV4ID0gaW5mb19pbmRleDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmbGFnc19yZWplY3RlZC5zZXQoIGluZm9faW5kZXggKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiggZm91bmRfY291bnQgPT0gMSApCi0gICAgICB7Ci0gICAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4KLSAgICAgICAgcmV0dXJuIGxhc3RfaW5mb19pbmRleDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIGZvdW5kX2NvdW50ID09IDAgKQotICAgICAgewotICAgICAgICAvLyBGbGFnIG5vdCBmb3VuZCBhdCBhbGwuCi0gICAgICAgIHRocm93IG5ldyBGbGFnX2Vycm9yKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfRkxBR19OT1RfRk9VTkQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfc3RyLnN1YnN0cmluZyggc3RhcnRfaW5kZXggKSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNb3JlIHRoYW4gb25lIGZsYWcgd2FzIGZvdW5kIHdpdGggdGhpcyBjaGFyIHNvIHdlIHdpbGwgZ28gdG8gdGhlCi0gICAgICAgIC8vIG5leHQgY2hhciB0byB1bmlxdWVseSBtYXRjaCBpdC4KLSAgICAgICAgaW5mb19jb2xfaW5kZXgrKzsKLSAgICAgICAgLy9pbmZvX3N0YXJ0ID0gbGFzdF9pbmZvX2luZGV4IC0gZm91bmRfY291bnQgKyAxOwotICAgICAgICAvL2luZm9fZW5kICAgPSBsYXN0X2luZm9faW5kZXggKyAxOwotICAgICAgICBmb3VuZF9jb3VudCA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIG9ubHkgd2F5IHRvIGdldCB0byB0aGlzIGNvZGUgaXMgaWYgdGhlIGxvb3AgZXhpdGVkIHdpdGgKLSAgICAvLyB0aGUgZm91bmRfY291bnQgZ3JlYXRlciB0aGFuIDEuICBUaGVyZWZvcmUsIHRoZSBmbGFnIHNwZWNpZmllZCBpcwotICAgIC8vIGFtYmlndW91cy4KLSAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0FNQklHVU9VU19GTEFHICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfc3RyLnN1YnN0cmluZyggc3RhcnRfaW5kZXgpICk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHRyaWVzIHRvIG1hdGNoIGFzIG1hbnkgY2hhcmFjdGVycyBhcyBwb3NzaWJsZSBvZiB0aGUgdXNlcgotICAgICogc3BlY2lmaWVkIGZsYWcgd2l0aCB0aGUgbWF0Y2hlZCBmbGFnIHN0cmluZy4KLSAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgbWF0Y2hpbmcgZmxhZyBjaGFyYXJhY3Rlci4KLSAgKiovCi0gIHByaXZhdGUgaW50IGdldF9tYXhfaW5kZXgoIFN0cmluZyBmbGFnX3N0ciwgaW50IGZsYWdfc3RhcnQsIGludCBpbmZvX2luZGV4ICkKLSAgewotICAgIGludCBmbGFnX2NvbF9pbmRleCA9IGZsYWdfc3RhcnQ7Ci0gICAgaW50IGluZm9fY29sX2luZGV4ID0gMDsKLQotICAgIFN0cmluZyBpbmZvX3N0ciA9IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9baW5mb19pbmRleF1bRkxBR19DT0xdICk7Ci0KLSAgICB3aGlsZSggZmxhZ19jb2xfaW5kZXggPCBmbGFnX3N0ci5sZW5ndGgoKSAmJgotICAgICAgICAgICBpbmZvX2NvbF9pbmRleCA8IGluZm9fc3RyLmxlbmd0aCgpICkKLSAgICB7Ci0gICAgICBpZiggQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKCBmbGFnX3N0ci5jaGFyQXQoZmxhZ19jb2xfaW5kZXgpICkgIT0KLSAgICAgICAgICBpbmZvX3N0ci5jaGFyQXQoaW5mb19jb2xfaW5kZXgpICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGZsYWdfY29sX2luZGV4Kys7Ci0gICAgICBpbmZvX2NvbF9pbmRleCsrOwotICAgIH0KLQotICAgIHJldHVybiBmbGFnX2NvbF9pbmRleDsKLSAgfQotCi0gIC8qKgotICAgICogQWRkcyBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHRvIGZsYWdzX3NwZWNpZmllZC4KLSAgKiovCi0gIHByaXZhdGUgdm9pZCBhZGRfcG9zaXRpb25hbCggU3RyaW5nIHBvc2l0aW9uYWxfcGFybSApCi0gIHsKLSAgICBpZiggZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXSA9PSBudWxsICkKLSAgICAgIGZsYWdzX3NwZWNpZmllZFtQT1NJVElPTkFMX1JPV10gPSBuZXcgVmVjdG9yKDMpOwotCi0gICAgZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXS5hZGQoIHBvc2l0aW9uYWxfcGFybSApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBBZGRzIGEgZmxhZyBhbmQgaXRzIHBhcmFtZXRlciB0byBmbGFnc19zcGVjaWZpZWQuICBJZiBvbmx5IHRoZQotICAgICogZmxhZyB3YXMgc3BlY2lmaWVkLCB0aGVuIGEgbnVsbCBzaG91bGQgYmUgcGFzc2VkIHRvIGZsYWdfcGFybS4KLSAgKiovCi0gIHByaXZhdGUgdm9pZCBhZGRfZmxhZ19wYXJtKCBpbnQgZmxhZ19pbmRleCwgU3RyaW5nIGZsYWdfcGFybSApCi0gICAgdGhyb3dzIEZsYWdfZXJyb3IKLSAgewotICAgIGlmKCBmbGFnc19pbmZvW2ZsYWdfaW5kZXhdW0RVUF9DT0xdID09IE5PX0RVUFMgJiYKLSAgICAgICAgZmxhZ3Nfc3BlY2lmaWVkW2ZsYWdfaW5kZXhdICE9IG51bGwgKQotICAgICAgdGhyb3cgbmV3IEZsYWdfZXJyb3IoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9EVVBMSUNBVEVfRkxBR1NfTk9UX0FMTE9XRUQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tmbGFnX2luZGV4XVtGTEFHX0NPTF0gKSApOwotCi0gICAgaWYoIGZsYWdzX3NwZWNpZmllZFtmbGFnX2luZGV4XSA9PSBudWxsICkKLSAgICAgIGZsYWdzX3NwZWNpZmllZFtmbGFnX2luZGV4XSA9IG5ldyBWZWN0b3IoMyk7Ci0KLSAgICBmbGFnc19zcGVjaWZpZWRbZmxhZ19pbmRleF0uYWRkKCBmbGFnX3Bhcm0gKTsKLSAgfQotCi0gIC8qKgotICAgICogQ2hlY2tzIHRoYXQgdGhlIHVzZXIgaGFzbid0IGJyb2tlbiBhbnkgY29tbWFuZCBsaW5lIHJ1bGVzLgotICAqKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrX3J1bGVzKCkgdGhyb3dzIEZsYWdfZXJyb3IKLSAgewotICAgIC8vIENoZWNrIHRoYXQgYWxsIG9mIHRoZSByZXF1aXJlZCBwb3NpdGlvbmFscyB3ZXJlIHNwZWNpZmllZC4KLSAgICBpbnQgcG9zaXRpb25hbF9jb3VudCA9IDA7Ci0KLSAgICBpZiggZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXSAhPSBudWxsICkKLSAgICB7Ci0gICAgICBwb3NpdGlvbmFsX2NvdW50ID0gZmxhZ3Nfc3BlY2lmaWVkW1BPU0lUSU9OQUxfUk9XXS5zaXplKCk7Ci0gICAgfQotCi0gICAgaWYoIHJlcXVpcmVkX3Bvc2l0aW9uYWxzID4gcG9zaXRpb25hbF9jb3VudCApCi0gICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX01JU1NJTkdfUE9TSVRJT05BTCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW3JlcXVpcmVkX3Bvc2l0aW9uYWxzLTFdW05BTUVfQ09MXSApICk7Ci0KLSAgICBlbHNlIGlmKCByZXF1aXJlZF9wb3NpdGlvbmFscyA8IHBvc2l0aW9uYWxfY291bnQgJiYKLSAgICAgICAgICAgICBvcHRpb25hbF9wb3NpdGlvbmFsc19hbGxvd2VkID09IGZhbHNlICkKLSAgICAgIHRocm93IG5ldyBGbGFnX2Vycm9yKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfVE9PX01BTllfUE9TSVRJT05BTFMgKSApOwotCi0gICAgZm9yKCBpbnQgcm93ID0gMDsgcm93IDwgZmxhZ3NfaW5mby5sZW5ndGg7IHJvdysrICkKLSAgICB7Ci0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBQT1NJVElPTkFMICkgY29udGludWU7Ci0KLSAgICAgIGlmKCBmbGFnc19zcGVjaWZpZWRbcm93XSA9PSBudWxsICYmCi0gICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW1JFUVVJUkVEX0NPTF0gPT0gUkVRVUlSRUQgKQotICAgICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX01JU1NJTkdfUkVRVUlSRURfRkxBRyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0gKSApOwotCi0gICAgICBpbnQgcGFybV9jb3VudCA9IDA7Ci0KLSAgICAgIGlmKCBmbGFnc19zcGVjaWZpZWRbcm93XSAhPSBudWxsICkgcGFybV9jb3VudCA9IGZsYWdzX3NwZWNpZmllZFtyb3ddLnNpemUoKTsKLQotICAgICAgLy8gQ2hlY2sgZm9yIHRvbyBtYW55IGZsYWcgcGFyYW1ldGVycy4KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bRFVQX0NPTF0gPT0gTk9fRFVQUyAmJiBwYXJtX2NvdW50ID4gMSApCi0gICAgICAgIHRocm93IG5ldyBGbGFnX2Vycm9yKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfRFVQTElDQVRFX0ZMQUdTX05PVF9BTExPV0VEICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSApICk7Ci0KLSAgICAgIC8vIENoZWNrIGZvciBtaXNzaW5nIGZsYWcgcGFyYW1ldGVyLgotICAgICAgaWYoIHBhcm1fY291bnQgPiAwICYmIGZsYWdzX2luZm9bcm93XVtOQU1FX0NPTF0gIT0gTk9fUEFSTSApCi0gICAgICB7Ci0gICAgICAgIGZvciggaW50IGluZGV4ID0gMDsgaW5kZXggPCBmbGFnc19zcGVjaWZpZWRbcm93XS5zaXplKCk7IGluZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoIGZsYWdzX3NwZWNpZmllZFtyb3ddLmVsZW1lbnRBdChpbmRleCkgPT0gbnVsbCApCi0gICAgICAgICAgICB0aHJvdyBuZXcgRmxhZ19lcnJvciggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX01JU1NJTkdfRkxBR19QQVJBTUVURVIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnTWVzc2FnZXMuZ2V0U3RyaW5nKCBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdICkgfSApOwotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHZlcmlmaWVzIHRoYXQgYSBwcm9wZXIgZmxhZ3NfaW5mbyBzdHJpbmcgYXJyYXkgd2FzIHBhc3NlZAotICAgICogdG8gdXMgYnkgdGhlIHByb2dyYW1tZXIuCi0gICoqLwotICBwcml2YXRlIHZvaWQgdmVyaWZ5X2ZsYWdzX2luZm8oKSB0aHJvd3MgSW50ZXJuYWxFcnJvckV4YwotICB7Ci0gICAgYm9vbGVhbiBkb25lX3Bvc2l0aW9uYWxzID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBoZWxwX3NwZWNpZmllZCAgID0gZmFsc2U7Ci0KLSAgICByZXF1aXJlZF9wb3NpdGlvbmFscyA9IDA7Ci0gICAgb3B0aW9uYWxfcG9zaXRpb25hbHNfYWxsb3dlZCA9IGZhbHNlOwotICAgIG9wdGlvbmFsX2xpc3RfaW5kZXggPSAtMTsKLSAgICBtYXhfZmxhZ19zaXplID0gMDsKLSAgICBtYXhfbmFtZV9zaXplID0gMDsKLQotICAgIGlmKCBmbGFnc19pbmZvID09IG51bGwgfHwgZmxhZ3NfaW5mby5sZW5ndGggPT0gMCApCi0gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX05PX0ZMQUdTX0RBVEFfU1BFQ0lGSUVEICApICk7Ci0KLSAgICBpZiggZmxhZ3NfaW5mb1tQT1NJVElPTkFMX1JPV10gIT0gbnVsbCAmJgotICAgICAgICBmbGFnc19pbmZvW1BPU0lUSU9OQUxfUk9XXS5sZW5ndGggPiAwICYmCi0gICAgICAgIGZsYWdzX2luZm9bUE9TSVRJT05BTF9ST1ddW0ZMQUdfQ09MXSAhPSBQT1NJVElPTkFMICkKLSAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfRklSU1RfRkxBR19OT1RfUE9TSVRJT05BTCApICk7Ci0KLSAgICBmb3IoIGludCByb3cgPSAwOyByb3cgPCBmbGFnc19pbmZvLmxlbmd0aDsgcm93KysgKQotICAgIHsKLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd10gPT0gbnVsbCApCi0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfTlVMTF9GTEFHX1JPVyApICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd10ubGVuZ3RoICE9IDUgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9ST1dfU0laRSApICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdID09IG51bGwgfHwKLSAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdID09IG51bGwgfHwKLSAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bSEVMUF9DT0xdID09IG51bGwgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX05VTExfSU5fUk9XICkgKTsKLQotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtGTEFHX0NPTF0uZXF1YWxzKCBoZWxwX2ZsYWcgKSApIGhlbHBfc3BlY2lmaWVkID0gdHJ1ZTsKLQotICAgICAgU3RyaW5nIGZsYWdJZCAgID0gZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXTsKLSAgICAgIFN0cmluZyBuYW1lSWQgICA9IGZsYWdzX2luZm9bcm93XVtOQU1FX0NPTF07Ci0KLSAgICAgIFN0cmluZyBmbGFnX2NvbCA9IGZsYWdJZCA9PSBQT1NJVElPTkFMID8gUE9TSVRJT05BTCA6IGZsYWdNZXNzYWdlcy5nZXRTdHJpbmcoIGZsYWdJZCApOwotICAgICAgU3RyaW5nIG5hbWVfY29sID0gbmFtZUlkID09IE5PX1BBUk0gPyBOT19QQVJNIDogZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggbmFtZUlkICk7Ci0KLSAgICAgIGlmKCBmbGFnX2NvbC5sZW5ndGgoKSA+IG1heF9mbGFnX3NpemUgKQotICAgICAgICBtYXhfZmxhZ19zaXplID0gZmxhZ19jb2wubGVuZ3RoKCk7Ci0KLSAgICAgIGlmKCBuYW1lX2NvbCAhPSBOT19QQVJNICYmIG5hbWVfY29sLmxlbmd0aCgpID4gbWF4X25hbWVfc2l6ZSApCi0gICAgICAgIG1heF9uYW1lX3NpemUgPSBuYW1lX2NvbC5sZW5ndGgoKTsKLQotICAgICAgLy8gRW5zdXJlIHRoYXQgZmxhZ3MgYXJlIGFsbCBpbiBsb3dlcmNhc2UuCi0gICAgICBpZiggIWZsYWdfY29sLmVxdWFscyggZmxhZ19jb2wudG9Mb3dlckNhc2UoKSApICkKLSAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3JFeGMoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9GTEFHX05PVF9MT1dFUkNBU0UgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfY29sICk7Ci0KLSAgICAgIC8vIEVuc3VyZSB0aGF0IG9ubHkgdGhlIHByZWRlZmluZWQgZHVwIHN0cmluZ3MgYXJlIHVzZWQuCi0gICAgICAvLyBOb3RlOiBpdCdzIG9rIHRvIHVzZSAhPSB3aGVuIGNvbXBhcmluZyBjb25zdGFudCBzdHJpbmdzIGxpdGVyYWxzLgotICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtEVVBfQ09MXSA9PSBudWxsIHx8Ci0gICAgICAgICAgKCBmbGFnc19pbmZvW3Jvd11bRFVQX0NPTF0gIT0gTk9fRFVQUyAmJgotICAgICAgICAgICAgZmxhZ3NfaW5mb1tyb3ddW0RVUF9DT0xdICE9IERVUFNfT0sgKSApCi0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfSU5DT1JSRUNUX0RVUF9TVFJJTkcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtEVVBfQ09MXSApOwotCi0gICAgICAvLyBFbnN1cmUgdGhhdCBvbmx5IHRoZSBwcmVkZWZpbmVkIHJlcXVpcmVkIHN0cmluZ3MgYXJlIHVzZWQuCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW1JFUVVJUkVEX0NPTF0gPT0gbnVsbCB8fAotICAgICAgICAgICggZmxhZ3NfaW5mb1tyb3ddW1JFUVVJUkVEX0NPTF0gIT0gUkVRVUlSRUQgJiYKLSAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdICE9IE9QVElPTkFMICkgKQotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvckV4YyggbWVzc2FnZXMuZ2V0U3RyaW5nKCBGbGFnTWVzc2FnZXMuUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9SRVFVSVJFRF9TVFJJTkcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdICk7Ci0KLSAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgcG9zaXRpb25hbHMuCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSA9PSBQT1NJVElPTkFMICkKLSAgICAgIHsKLSAgICAgICAgaWYoIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdID09IFJFUVVJUkVEICkKLSAgICAgICAgewotICAgICAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdID09IE5PX1BBUk0gKQotICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3JFeGMoIG1lc3NhZ2VzLmdldFN0cmluZyggRmxhZ01lc3NhZ2VzLlBBUlNFUl9FUlJPUl9SRVFVSVJFRF9QT1NJVElPTkFMX05FRURTX05BTUUgKSApOwotCi0gICAgICAgICAgcmVxdWlyZWRfcG9zaXRpb25hbHMrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBmbGFnc19pbmZvW3Jvd11bTkFNRV9DT0xdICE9IE5PX1BBUk0gKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gV2UgdXNlIHRoZSBOQU1FX0NPTCBmaWVsZCBmb3IgYW4gb3B0aW9uYWwgcG9zaXRpb25hbCB0byBkZW5vdGUKLSAgICAgICAgICAvLyB3aGV0aGVyIGFkZGl0aW9uYWwgcG9zaXRpb25hbHMgYXJlIGFsbG93ZWQgb3Igbm90LgotICAgICAgICAgIG9wdGlvbmFsX3Bvc2l0aW9uYWxzX2FsbG93ZWQgPSB0cnVlOwotICAgICAgICAgIG9wdGlvbmFsX2xpc3RfaW5kZXggPSByb3c7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRW5zdXJlIHRoYXQgcG9zaXRpb25hbHMgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluZm8uCi0gICAgICBpZiggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSAhPSBQT1NJVElPTkFMIHx8Ci0gICAgICAgICAgKCBkb25lX3Bvc2l0aW9uYWxzID09IGZhbHNlICYmCi0gICAgICAgICAgICBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdID09IFBPU0lUSU9OQUwgJiYKLSAgICAgICAgICAgIGZsYWdzX2luZm9bcm93XVtSRVFVSVJFRF9DT0xdID09IE9QVElPTkFMICkgKQotICAgICAgewotICAgICAgICBkb25lX3Bvc2l0aW9uYWxzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIGRvbmVfcG9zaXRpb25hbHMgPT0gdHJ1ZSApCi0gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfUE9TSVRJT05BTF9OT1RfQVRfQkVHSU5OSU5HICkgKTsKLSAgICB9Ci0KLSAgICAvLyBFbnN1cmUgdGhhdCBhIGhlbHAgZmxhZyB3YXMgc3BlY2lmaWVkIGluIHRoZSBpbmZvIGxpc3QuCi0gICAgaWYoIGhlbHBfc3BlY2lmaWVkID09IGZhbHNlICkKLSAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yRXhjKCBtZXNzYWdlcy5nZXRTdHJpbmcoIEZsYWdNZXNzYWdlcy5QQVJTRVJfRVJST1JfSEVMUF9GTEFHX05PVF9TUEVDSUZJRUQgKSApOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGR1bXAgaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBwYXJzZWQKLSAgICAqIGNvbW1hbmQgbGluZS4KLSAgKiovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0KLSAgICBmb3IoIGludCByb3cgPSAwOyByb3cgPCBmbGFnc19pbmZvLmxlbmd0aDsgcm93KysgKQotICAgIHsKLSAgICAgIGIuYXBwZW5kKCAiXG4iICk7Ci0KLSAgICAgIGlmKCBmbGFnc19pbmZvW3Jvd11bRkxBR19DT0xdID09IFBPU0lUSU9OQUwgKQotICAgICAgICBiLmFwcGVuZCggIlBvc2l0aW9uYWw6IiApOwotICAgICAgZWxzZQotICAgICAgICBiLmFwcGVuZCggZmxhZ01lc3NhZ2VzLmdldFN0cmluZyggZmxhZ3NfaW5mb1tyb3ddW0ZMQUdfQ09MXSApICsgIjoiICk7Ci0KLQotICAgICAgaWYoIGZsYWdzX3NwZWNpZmllZFtyb3ddID09IG51bGwgKQotICAgICAgICBiLmFwcGVuZCggIm5vIHBhcmFtZXRlcnMiICk7Ci0gICAgICBlbHNlCi0gICAgICAgIGZvciggaW50IHBhcm1faW5kZXggPSAwOyBwYXJtX2luZGV4IDwgZmxhZ3Nfc3BlY2lmaWVkW3Jvd10uc2l6ZSgpOyBwYXJtX2luZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHBhcm0gPSAoU3RyaW5nKWZsYWdzX3NwZWNpZmllZFtyb3ddLmVsZW1lbnRBdChwYXJtX2luZGV4KTsKLSAgICAgICAgICBiLmFwcGVuZCggcGFybSArICI6IiApOwotICAgICAgICB9Ci0gICAgICBiLmFwcGVuZCggIlxuIiApOwotICAgIH0KLQotICAgIHJldHVybiAiIitiOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfQ09MICAgICA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTCAgICAgPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFVQX0NPTCAgICAgID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEX0NPTCA9IDM7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUxQX0NPTCAgICAgPSA0OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NJVElPTkFMX1JPVyA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUxQX0xJTkVfTEVOICA9IDc1OwotCi0gIHByaXZhdGUgU3RyaW5nW11bXSBmbGFnc19pbmZvOwotICBwcml2YXRlIFN0cmluZyAgICAgaGVscF9mbGFnOwotICBwcml2YXRlIFN0cmluZyAgICAgdG9vbF9uYW1lOwotICBwcml2YXRlIFZlY3RvcltdICAgZmxhZ3Nfc3BlY2lmaWVkOwotICBwcml2YXRlIGludCAgICAgICAgcmVxdWlyZWRfcG9zaXRpb25hbHM7Ci0gIHByaXZhdGUgYm9vbGVhbiAgICBvcHRpb25hbF9wb3NpdGlvbmFsc19hbGxvd2VkOwotICBwcml2YXRlIGludCAgICAgICAgb3B0aW9uYWxfbGlzdF9pbmRleDsKLSAgcHJpdmF0ZSBpbnQgICAgICAgIG1heF9mbGFnX3NpemU7Ci0gIHByaXZhdGUgaW50ICAgICAgICBtYXhfbmFtZV9zaXplOwotCi0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBtZXNzYWdlczsKLSAgcHJpdmF0ZSAgIFJlc291cmNlQnVuZGxlIGZsYWdNZXNzYWdlczsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvRmxhZ01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL0ZsYWdNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWExMjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvRmxhZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tYW5kbGluZTsKLQotLyoqCi0gICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHN0b3JlIGNvbnN0YW50IHN0cmluZyBlcnJvciBtZXNzYWdlcwotICAqIGdlbmVyYXRlZCBieSBDb21tYW5kTGluZS5qYXZhCi0gICoKLSAgKgotICAqIEBhdXRob3IgUGV0ZXIgTW9vZ2sKLSAgKiBAZGF0ZSAgIEp1bHkgMTMsIDIwMDAKLSAgKiBAc2VlICAgIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tYW5kbGluZS5Db21tYW5kTGluZQotKiovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGbGFnTWVzc2FnZXMKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfRkxBR19OT1RfRk9VTkQgPSAiUEFSU0VSX0VSUk9SX0ZMQUdfTk9UX0ZPVU5EIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfQU1CSUdVT1VTX0ZMQUcgPSAiUEFSU0VSX0VSUk9SX0FNQklHVU9VU19GTEFHIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTUlTU0lOR19QT1NJVElPTkFMID0gIlBBUlNFUl9FUlJPUl9NSVNTSU5HX1BPU0lUSU9OQUwiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9UT09fTUFOWV9QT1NJVElPTkFMUyA9ICJQQVJTRVJfRVJST1JfVE9PX01BTllfUE9TSVRJT05BTFMiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9NSVNTSU5HX1JFUVVJUkVEX0ZMQUcgPSAiUEFSU0VSX0VSUk9SX01JU1NJTkdfUkVRVUlSRURfRkxBRyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0RVUExJQ0FURV9GTEFHU19OT1RfQUxMT1dFRCA9ICJQQVJTRVJfRVJST1JfRFVQTElDQVRFX0ZMQUdTX05PVF9BTExPV0VEIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTUlTU0lOR19GTEFHX1BBUkFNRVRFUiA9ICJQQVJTRVJfRVJST1JfTUlTU0lOR19GTEFHX1BBUkFNRVRFUiI7Ci0KLSAgLy8gRXJyb3IgaW50ZXJuYWwgZXJyb3IgbWVzc2FnZXMuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9NRVNTQUdFX01JU1NJTkdfQVJHID0gIlBBUlNFUl9FUlJPUl9NRVNTQUdFX01JU1NJTkdfQVJHIjsKLQotICAvLyBJbnRlcm5hbCBjb21tYW5kIGxpbmUgZXJyb3IgbWVzc2FnZXMuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9OT19GTEFHU19EQVRBX1NQRUNJRklFRCA9ICJQQVJTRVJfRVJST1JfTk9fRkxBR1NfREFUQV9TUEVDSUZJRUQiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9GSVJTVF9GTEFHX05PVF9QT1NJVElPTkFMID0gIlBBUlNFUl9FUlJPUl9GSVJTVF9GTEFHX05PVF9QT1NJVElPTkFMIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTlVMTF9GTEFHX1JPVyA9ICJQQVJTRVJfRVJST1JfTlVMTF9GTEFHX1JPVyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9ST1dfU0laRSA9ICJQQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JPV19TSVpFIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfTlVMTF9JTl9ST1cgPSAiUEFSU0VSX0VSUk9SX05VTExfSU5fUk9XIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfSU5DT1JSRUNUX0RVUF9TVFJJTkcgPSAiUEFSU0VSX0VSUk9SX0lOQ09SUkVDVF9EVVBfU1RSSU5HIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JFUVVJUkVEX1NUUklORyA9ICJQQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JFUVVJUkVEX1NUUklORyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0VSUk9SX1BPU0lUSU9OQUxfTk9UX0FUX0JFR0lOTklORyA9ICJQQVJTRVJfRVJST1JfUE9TSVRJT05BTF9OT1RfQVRfQkVHSU5OSU5HIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfSEVMUF9GTEFHX05PVF9TUEVDSUZJRUQgPSAiUEFSU0VSX0VSUk9SX0hFTFBfRkxBR19OT1RfU1BFQ0lGSUVEIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfRkxBR1NfTk9UX09SREVSRUQgPSAiUEFSU0VSX0VSUk9SX0ZMQUdTX05PVF9PUkRFUkVEIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJTRVJfRVJST1JfRkxBR19OT1RfTE9XRVJDQVNFID0gIlBBUlNFUl9FUlJPUl9GTEFHX05PVF9MT1dFUkNBU0UiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9FUlJPUl9SRVFVSVJFRF9QT1NJVElPTkFMX05FRURTX05BTUUgPSAiUEFSU0VSX0VSUk9SX1JFUVVJUkVEX1BPU0lUSU9OQUxfTkVFRFNfTkFNRSI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0lORk9fU1lOVEFYID0gIlBBUlNFUl9TWU5UQVgiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlNFUl9GTEFHUyA9ICJQQVJTRVJfRkxBR1MiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VSX0lORk9fV0hFUkUgPSAiUEFSU0VSX1dIRVJFIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvY29tbWFuZGxpbmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbWFuZGxpbmUvY29tbWFuZGxpbmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg1Mjk4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1hbmRsaW5lL2NvbW1hbmRsaW5lLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QQVJTRVJfRVJST1JfRkxBR19OT1RfRk9VTkQ9SVdBQjAxMjNFIEZsYWcgLXswfSBpcyBub3QgdmFsaWQuCi1QQVJTRVJfRVJST1JfQU1CSUdVT1VTX0ZMQUc9SVdBQjAyODRFIEZsYWcgLXswfSBpcyBhbWJpZ3VvdXMuCi1QQVJTRVJfRVJST1JfTUlTU0lOR19QT1NJVElPTkFMPUlXQUIwMjg1RSBNaXNzaW5nIHswfSBwYXJhbWV0ZXIuCi1QQVJTRVJfRVJST1JfVE9PX01BTllfUE9TSVRJT05BTFM9SVdBQjAyODZFIFRvbyBtYW55IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBzcGVjaWZpZWQuCi1QQVJTRVJfRVJST1JfTUlTU0lOR19SRVFVSVJFRF9GTEFHPUlXQUIwMjg4RSBGbGFnIC17MH0gaXMgbWlzc2luZy4KLVBBUlNFUl9FUlJPUl9EVVBMSUNBVEVfRkxBR1NfTk9UX0FMTE9XRUQ9SVdBQjAyOTNFIEZsYWcgLXswfSBoYXMgYmVlbiBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuCi1QQVJTRVJfRVJST1JfTUlTU0lOR19GTEFHX1BBUkFNRVRFUj1JV0FCMDI5NEUgRmxhZyAtezB9IGlzIG1pc3NpbmcgcGFyYW1ldGVyIHsxfS4KLVBBUlNFUl9FUlJPUl9NRVNTQUdFX01JU1NJTkdfQVJHPUlXQUIwMzE5RSBFcnJvciBtZXNzYWdlIHswfSBpcyBtaXNzaW5nIGFuIGFyZ3VtZW50LgotUEFSU0VSX0VSUk9SX05PX0ZMQUdTX0RBVEFfU1BFQ0lGSUVEPUlXQUIwMzQ1RSBTcGVjaWZ5IGZsYWcgaW5mb3JtYXRpb24uCi1QQVJTRVJfRVJST1JfRklSU1RfRkxBR19OT1RfUE9TSVRJT05BTD1JV0FCMDM0NkUgVGhlIGZpcnN0IGZsYWcgbXVzdCBiZSBwb3NpdGlvbmFsLgotUEFSU0VSX0VSUk9SX05VTExfRkxBR19ST1c9SVdBQjAzNDdFIE51bGwgZmxhZyByb3cuCi1QQVJTRVJfRVJST1JfSU5DT1JSRUNUX1JPV19TSVpFPUlXQUIwMzQ4RSBGbGFnIHJvdyBtdXN0IGhhdmUgNSBzdHJpbmdzLgotUEFSU0VSX0VSUk9SX05VTExfSU5fUk9XPUlXQUIwMzQ5RSBGbGFnIGluZm9ybWF0aW9uIGNvbnRhaW5zIGEgbnVsbCBzdHJpbmcuCi1QQVJTRVJfRVJST1JfSU5DT1JSRUNUX0RVUF9TVFJJTkc9SVdBQjAzNTBFIER1cGxpY2F0ZSBzdHJpbmcgezB9IGlzIG5vdCB2YWxpZC4KLVBBUlNFUl9FUlJPUl9JTkNPUlJFQ1RfUkVRVUlSRURfU1RSSU5HPUlXQUIwMzUxRSBSZXF1aXJlZCBzdHJpbmcgezB9IGlzIG5vdCB2YWxpZC4KLVBBUlNFUl9FUlJPUl9QT1NJVElPTkFMX05PVF9BVF9CRUdJTk5JTkc9SVdBQjAzNTJFIFBvc2l0aW9uYWwgZmxhZyBpcyBub3QgYXQgdGhlIGJlZ2lubmluZy4KLVBBUlNFUl9FUlJPUl9IRUxQX0ZMQUdfTk9UX1NQRUNJRklFRD1JV0FCMDM1M0UgSGVscCBmbGFnIGlzIG5vdCBzcGVjaWZpZWQgaW4gaW5mb3JtYXRpb24gYXJyYXkuCi1QQVJTRVJfRVJST1JfRkxBR1NfTk9UX09SREVSRUQ9SVdBQjAzNTRFIEZsYWdzIGFyZSBub3QgaW4gbGV4aWNhbCBvcmRlci4KLVBBUlNFUl9FUlJPUl9GTEFHX05PVF9MT1dFUkNBU0U9SVdBQjAzNTVFIEZsYWcgezB9IGlzIG5vdCBsb3dlcmNhc2UuCi1QQVJTRVJfRVJST1JfUkVRVUlSRURfUE9TSVRJT05BTF9ORUVEU19OQU1FPUlXQUIwMzU2RSBSZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgbXVzdCBoYXZlIGEgbmFtZSBzcGVjaWZpZWQuCi1QQVJTRVJfU1lOVEFYPVN5bnRheAotUEFSU0VSX0ZMQUdTPUZsYWdzCi1QQVJTRVJfV0hFUkU9V2hlcmUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbW9uL0NsYXNzUGF0aC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tb24vQ2xhc3NQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMTkyM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tb24vQ2xhc3NQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogCi0gKiBUaGUgY2xhc3MgcHJvdmlkZXMgYW5kIGVhc3kgd2F5IHRvIGJ1aWxkIGNsYXNzcGF0aHMuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NQYXRoIAotewotICBwcml2YXRlIFN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gbmV3UGF0aCBhcHBlbmRzIHRoaXMgbmV3IHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgY2xhc3NwYXRoLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXBwZW5kUGF0aCggU3RyaW5nIG5ld1BhdGggKQotICB7Ci0gIAkvLyBObyB2YWx1ZSB0byBwdXQgb24gcGF0aCwgc28ganVzdCByZXR1cm4KLSAgCWlmKCBuZXdQYXRoLmVxdWFscyggIiIgKSApIHJldHVybjsKLSAgCQotICAJLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgcGF0aCBpbiB0aGUgc3RyaW5nIHRoZW4gd2UgZG9uJ3QgbmVlZCBhIHBhdGgKLSAgCS8vIHNlcGFyYXRvci4KLSAgCWlmKCBwYXRoLmxlbmd0aCgpID09IDAgKQotICAJewotICAJICBwYXRoLmFwcGVuZCggbmV3UGF0aCApOwotICAJfQotICAJZWxzZQotICAJewotICAJICBwYXRoLmFwcGVuZCggRmlsZS5wYXRoU2VwYXJhdG9yQ2hhciArIG5ld1BhdGggKTsKLSAgCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGFwcGVuZHMgYWxsIGphciBhbmQgemlwIGZpbGVzIGluIGEgcGFydGljdWxhciBkaXJlY3RvcnkgdG8KLSAgICogdGhlIGNsYXNzcGF0aC4KLSAgICogCi0gICAqIEBwYXJhbSBkaXJlY3Rvcnkgc3BlY2lmaWVzIGEgZGlyZWN0b3J5IGNvbnRhaW5zIGphciBhbmQgemlwIGZpbGVzLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXBwZW5kRGlyKCBTdHJpbmcgZGlyZWN0b3J5ICkKLSAgewotICAJRmlsZSBkaXIgPSBuZXcgRmlsZSggZGlyZWN0b3J5ICk7Ci0gIAkKLSAgCWlmKCAhZGlyLmlzRGlyZWN0b3J5KCkgKSByZXR1cm47Ci0gIAkKLSAgCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLSAgCQotICAJZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGZpbGVzLmxlbmd0aDsgaW5kZXgrKyApCi0gIAl7Ci0gIAkgIEZpbGUgICBmaWxlID0gZmlsZXNbaW5kZXhdOwotICAJICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAJICAKLSAgCSAgaWYoIGZpbGUuaXNGaWxlKCkgJiYKLSAgCSAgICAgICggbmFtZS5lbmRzV2l0aCggIi5qYXIiICkgfHwKLSAgCSAgICAgICAgbmFtZS5lbmRzV2l0aCggIi56aXAiICkgKSApCi0gIAkgIHsKLSAgCSAgCWFwcGVuZFBhdGgoIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgCSAgfQotICAJICAgICAgICAKLSAgCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gbmV3UGF0aCBhcHBlbmRzIGEgbmV3IGNsYXNzcGF0aCB0byB0aGUgZW5kIG9mIHRoaXMgY2xhc3NwYXRoLgotICAgKi8KLSAgcHVibGljIHZvaWQgYXBwZW5kUGF0aCggQ2xhc3NQYXRoIG5ld1BhdGggKQotICB7Ci0gIAlhcHBlbmRQYXRoKCBuZXdQYXRoLnBhdGgudG9TdHJpbmcoKSApOwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBmdWxsIHN0cmluZyBjbGFzc3BhdGggd2l0aCBzZXBhcmF0b3JzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbW9uL0Vudmlyb25tZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3YWY2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9FbnZpcm9ubWVudFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmVhbGV5QGNhLmlibS5jb20KLSAqIAotICogVGhpcyBjbGFzcyBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBnZW5lcmljCi0gKiBFbnZpcm9ubWVudCBjbGFzZXMgYW5kIEVjbGlwc2UgY2xhc3Nlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVudmlyb25tZW50VXRpbHMgewotCS8qKgotCSAqIENvbnZlcnRzIGFuIEVjbGlwc2UgPGNvZGU+SVN0YXR1czwvY29kZT4gdG8gYW4gRW52aXJvbm1lbnQKLQkgKiA8Y29kZT5TdGF0dXM8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgRWNsaXBzZSBzdGF0dXMgb2JqZWN0LgotCSAqIEByZXR1cm4gQW4gZXF1aXZhbGVudCBFbnZpcm9ubWVudCBzdGF0dXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RhdHVzIGNvbnZlcnRJU3RhdHVzVG9TdGF0dXMoSVN0YXR1cyBpc3RhdHVzKSB7Ci0JCVN0YXR1cyBzdGF0dXM7Ci0JCVN0cmluZyBtZXNzYWdlID0gaXN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IGlzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IG5vT2ZDaGlsZHJlbiA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJaWYgKG5vT2ZDaGlsZHJlbiA+IDApIHsKLQkJCVN0YXR1c1tdIHN0YXR1c0NoaWxkcmVuID0gbmV3IFN0YXR1c1tub09mQ2hpbGRyZW5dOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub09mQ2hpbGRyZW47IGkrKykgewotCQkJCXN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydElTdGF0dXNUb1N0YXR1cyhjaGlsZHJlbltpXSk7Ci0JCQl9Ci0KLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1lc3NhZ2UsIHN0YXR1c0NoaWxkcmVuKTsKLQkJfSBlbHNlIHsKLQkJCWludCBzZXZlcml0eSA9IGlzdGF0dXMuZ2V0U2V2ZXJpdHkoKTsKLQkJCWludCBzdGF0dXNTZXZlcml0eSA9IFN0YXR1cy5PSzsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCWNhc2UgSVN0YXR1cy5FUlJPUjoKLQkJCQlzdGF0dXNTZXZlcml0eSA9IFN0YXR1cy5FUlJPUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HOgotCQkJCXN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTzoKLQkJCQlzdGF0dXNTZXZlcml0eSA9IFN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJU3RhdHVzLk9LOgotCQkJCXN0YXR1c1NldmVyaXR5ID0gU3RhdHVzLk9LOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCX0KLQkJCVRocm93YWJsZSBlID0gaXN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJCXN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIsIG1lc3NhZ2UsIHN0YXR1c1NldmVyaXR5LCBlKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYW4gRW52aXJvbm1lbnQgPGNvZGU+U3RhdHVzPC9jb2RlPiB0byBhbiBFY2xpcHNlCi0JICogPGNvZGU+SVN0YXR1czwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGlzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBFbnZpcm9ubWVudCBzdGF0dXMgb2JqZWN0LgotCSAqIEByZXR1cm4gQW4gZXF1aXZhbGVudCBFY2xpcHNlIHN0YXR1cyBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNvbnZlcnRTdGF0dXNUb0lTdGF0dXMoU3RhdHVzIHN0YXR1cywgU3RyaW5nIHBsdWdpbklkKSB7Ci0JCUlTdGF0dXMgaXN0YXR1czsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQlUaHJvd2FibGUgdGhyb3dhYmxlID0gc3RhdHVzLmdldFRocm93YWJsZSgpOwotCQlpZiAoc3RhdHVzLmhhc0NoaWxkcmVuKCkpIHsKLQkJCVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlpbnQgbm9PZkNoaWxkcmVuID0gY2hpbGRyZW4ubGVuZ3RoOwotCQkJSVN0YXR1c1tdIGlzdGF0dXNDaGlsZHJlbiA9IG5ldyBJU3RhdHVzW25vT2ZDaGlsZHJlbl07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vT2ZDaGlsZHJlbjsgaSsrKSB7Ci0JCQkJaXN0YXR1c0NoaWxkcmVuW2ldID0gY29udmVydFN0YXR1c1RvSVN0YXR1cyhjaGlsZHJlbltpXSwKLQkJCQkJCXBsdWdpbklkKTsKLQkJCX0KLQotCQkJaXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhwbHVnaW5JZCwgMCwgaXN0YXR1c0NoaWxkcmVuLCBtZXNzYWdlLAotCQkJCQl0aHJvd2FibGUpOwotCQl9IGVsc2UgewotCQkJaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCQlpbnQgaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCWNhc2UgU3RhdHVzLkVSUk9SOgotCQkJCWlzdGF0dXNTZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFN0YXR1cy5XQVJOSU5HOgotCQkJCWlzdGF0dXNTZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgU3RhdHVzLklORk86Ci0JCQkJaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTdGF0dXMuT0s6Ci0JCQkJaXN0YXR1c1NldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQl9Ci0JCQlpc3RhdHVzID0gbmV3IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMoaXN0YXR1c1NldmVyaXR5LAotCQkJCQlwbHVnaW5JZCwgMCwgbWVzc2FnZSwgdGhyb3dhYmxlKTsKLQkJfQotCi0JCXJldHVybiBpc3RhdHVzOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29tbW9uL0ZpbGVSZXNvdXJjZU91dHB1dFN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tb24vRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjY4YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tb24vRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotCi0vKioKLSogVGhpcyBjbGFzcyBkZWZpbmVzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCB3cml0ZXMgdG8gYW4KLSoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfS4KLSovCi1wdWJsaWMgY2xhc3MgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtCi17Ci0KLSAgSVBhdGggICAgICAgICAgICAgICAgIGZGaWxlUGF0aDsKLSAgUmVzb3VyY2VDb250ZXh0ICAgICAgIGZSZXNvdXJjZUNvbnRleHQ7IAotICBQcm9ncmVzc01vbml0b3IgICAgICAgZk1vbml0b3I7ICAgCi0gIFN0YXR1c0hhbmRsZXIgICAgICAgICBmU3RhdHVzSGFuZGxlcjsKLSAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0gIGJvb2xlYW4gICAgICAgICAgICAgICBmT3BlbjsKLQotICAvKioKLSAgKiBDb25zdHJ1Y3RzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0byB0aGUKLSAgKiBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPi4gVGhlIHdvcmtzcGFjZSBpcyBuZWl0aGVyIGV4YW1pbmVkIG5vcgotICAqIGFsdGVyZWQgZHVyaW5nIGNvbnN0cnVjdGlvbi4gQWxsIHJlc291cmNlIGNyZWF0aW9uIGlzIGRlZmVycmVkCi0gICogdW50aWwgbGF0ZXIgaW4gdGhlIHN0cmVhbSdzIGxpZmVjeWNsZSwgc3VjaCBhcyBkdXJpbmcgd3JpdGluZwotICAqIG9yIGNsb3N1cmUuCi0gICogPGI+Tm90ZTo8L2I+IFRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBjcmVhdGluZyBhIHN0cmVhbSB0aGF0Ci0gICogd3JpdGVzIHRvIGFuIElGaWxlIGlzIHRvIGNhbGwgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZAotICAqIHtAbGluayBGaWxlUmVzb3VyY2VVdGlscyNuZXdGaWxlT3V0cHV0U3RyZWFtIEZpbGVSZXNvdXJjZVV0aWxzLm5ld0ZpbGVPdXRwdXRTdHJlYW0oKX0KLSAgKiBhbmQgd29yayB3aXRoIHRoZSByZXN1bHRpbmcgPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KLSAgKiBEaXJlY3QgY29uc3RydWN0aW9uIG9mIGEgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtIGlzIG5vdCByZWNvbW1lbmRlZC4KLSAgKiBAcGFyYW0gZmlsZSBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZSByZXNvdXJjZSB0byBjcmVhdGUuIFRoZSBwcm9qZWN0IGltcGxpZWQgYnkgdGhlCi0gICogcGF0aG5hbWUgb2YgdGhlIGZpbGUgbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAqLwotICBwdWJsaWMgRmlsZVJlc291cmNlT3V0cHV0U3RyZWFtICggCi0gIAkJCVJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsIAotICAJCQlJUGF0aCAgICAgICAgICAgZmlsZVBhdGgsIAotICAJCQlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLSAgCQkJU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIKLSAgCQkJKQotICB7Ci0gICAgZkZpbGVQYXRoID0gZmlsZVBhdGg7Ci0gICAgZlJlc291cmNlQ29udGV4dCA9IHJlc291cmNlQ29udGV4dDsKLSAgICBmTW9uaXRvciA9IG1vbml0b3I7Ci0gICAgZlN0YXR1c0hhbmRsZXIgPSBzdGF0dXNIYW5kbGVyOwotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgZk9wZW4gPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICogQ2xvc2VzIHRoZSBzdHJlYW0uCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY2xvc2luZyB0aGUgc3RyZWFtLgotICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UKLSAgKiBhbmQgYSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gd2lsbAotICAqIGJlIHRocm93biBlaXRoZXIgbm93IG9yIGR1cmluZyBhbiBlYXJsaWVyIHtAbGluayAjd3JpdGUgd3JpdGV9LgotICAqLwotICBwdWJsaWMgdm9pZCBjbG9zZSAoKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICghZk9wZW4pIHJldHVybjsKLSAgICBmT3BlbiA9IGZhbHNlOwotICAgIGZCeXRlQXJyYXlPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICBieXRlW10gYnVmZmVyID0gZkJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHRlbXBJbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLmNyZWF0ZUZpbGUoZlJlc291cmNlQ29udGV4dCwgZkZpbGVQYXRoLCB0ZW1wSW5wdXRTdHJlYW0sIGZNb25pdG9yLCBmU3RhdHVzSGFuZGxlcik7Ci0gICAgfQotCi0gICAgY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIGUgKQotICAgIAl7Ci0gICAgCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIAl9Ci0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogRmx1c2hlcyB0aGUgc3RyZWFtLiBUaGlzIGRvZXMgbm90IGltcGx5IHRoZSBGaWxlIHJlc291cmNlCi0gICogd2lsbCBiZSBjcmVhdGVkIG9yIGJlY29tZSB2aXNpYmxlIHdpdGhpbiB0aGUgd29ya2JlbmNoLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcwotICAqIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UgYW5kIGEgZmlsZSBvZiB0aGUKLSAgKiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBhdAotICAqIHRoaXMgcG9pbnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIGZsdXNoICgpCi0gIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS5mbHVzaCgpOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGFsbCBieXRlcyBmcm9tIHRoZSBnaXZlbiBhcnJheSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4gRm9yIGV4YW1wbGUsIGlmIHRoaXMKLSAgKiBzdHJlYW0gd2FzIGNvbnN0cnVjdGVkIHdpdGggb3ZlcndyaXRlRmlsZSA9IGZhbHNlIGFuZCBhIGZpbGUgb2YgdGhlCi0gICogc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGVuIGFuIElPRXhjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLSAgKiB0aGlzIHBvaW50LgotICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZSAoIGJ5dGVbXSBiICkKLSAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIpOwotICB9Ci0KLSAgLyoqCi0gICogV3JpdGVzIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGFycmF5IGJlZ2lubmluZyBhdCBzb21lIG9mZnNldAotICAqIGFuZCBjb250aW51aW5nIGZvciBzb21lIG51bWJlciBvZiBieXRlcyAobGVuKSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAgKiBAcGFyYW0gb2ZmIFRoZSBvZmZzZXQgaW50byB0aGUgYXJyYXkgdG8gYmVnaW4gd3JpdGluZy4KLSAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMuIEZvciBleGFtcGxlLCBpZiB0aGlzCi0gICogc3RyZWFtIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIG92ZXJ3cml0ZUZpbGUgPSBmYWxzZSBhbmQgYSBmaWxlIG9mIHRoZQotICAqIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlbiBhbiBJT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0Ci0gICogdGhpcyBwb2ludC4KLSAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUgKCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbiApCi0gIHsKLSAgICBmQnl0ZUFycmF5T3V0cHV0U3RyZWFtLndyaXRlKGIsb2ZmLGxlbik7Ci0gIH0KLQotICAvKioKLSAgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZSB0byB0aGUgc3RyZWFtLgotICAqIEBwYXJhbSBiIFRoZSBieXRlIHRvIHdyaXRlLgotICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLiBGb3IgZXhhbXBsZSwgaWYgdGhpcwotICAqIHN0cmVhbSB3YXMgY29uc3RydWN0ZWQgd2l0aCBvdmVyd3JpdGVGaWxlID0gZmFsc2UgYW5kIGEgZmlsZSBvZiB0aGUKLSAgKiBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZW4gYW4gSU9FeGNlcHRpb24gbWF5IGJlIHRocm93biBhdAotICAqIHRoaXMgcG9pbnQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlICggaW50IGIgKQotICB7Ci0gICAgZkJ5dGVBcnJheU91dHB1dFN0cmVhbS53cml0ZShiKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9GaWxlUmVzb3VyY2VVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tb24vRmlsZVJlc291cmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjZjhkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9GaWxlUmVzb3VyY2VVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbjsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkNob2ljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotCi0KLQotLyoqCi0qIFRoaXMgY2xhc3MgY29udGFpbnMgdXNlZnVsIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBFY2xpcHNlIHJlc291cmNlcy4KLSovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmlsZVJlc291cmNlVXRpbHMKLXsKLSAgLy8KLSAgLy8gS2VlcHMgdGhlIElXb3Jrc3BhY2UgaGFuZ2luZyBhcm91bmQuIFNlZSBnZXRXb3Jrc3BhY2UoKS4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgSVdvcmtzcGFjZSB3b3Jrc3BhY2VfID0gbnVsbDsKLSAgLy8KLSAgLy8gS2VlcHMgdGhlIElXb3Jrc3BhY2VSb290IGhhbmdpbmcgYXJvdW5kLiBTZWUgZ2V0V29ya3NwYWNlUm9vdCgpLgotICAvLwotICBwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCByb290XyA9IG51bGw7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlVXRpbHMgbXNnXyA9IG5ldyBNZXNzYWdlVXRpbHMoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uLmVudmlyb25tZW50IiwgbmV3IEZpbGVSZXNvdXJjZVV0aWxzKCkgKTsKLQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZVJvb3Qgb2JqZWN0LgotICAqIEByZXR1cm4gVGhlIElXb3Jrc3BhY2VSb290IG9iamVjdC4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290ICgpCi0gIHsKLSAgICBpZiAocm9vdF8gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotICAgIHJldHVybiByb290XzsKLSAgfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZSBvYmplY3QuCi0gICogQHJldHVybiBUaGUgSVdvcmtzcGFjZSBvYmplY3QuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UgKCkKLSAgewotICAgIGlmICh3b3Jrc3BhY2VfID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHJvb3RfID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJvb3RfID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgd29ya3NwYWNlXyA9IHJvb3RfLmdldFdvcmtzcGFjZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gd29ya3NwYWNlXzsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHJldHVybnMgYW4gYXJyYXkgb2YgdGhyZWUgY29tbW9uIGNob2ljZXMuIChpZS4gWWVzLCB5ZXMgYWxsLCBhbmQgY2FuY2VsICkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ2hvaWNlW10gZ2V0VGhyZWVTdGF0ZUZpbGVPcHRpb25zKCkgCi0gIHsKLSAgICBWZWN0b3IgY2hvaWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnWScsIG1zZ18uZ2V0TWVzc2FnZSgiTEFCRUxfWUVTIikpKTsKLSAgICBjaG9pY2VzLmFkZChuZXcgQ2hvaWNlKCAnQScsIG1zZ18uZ2V0TWVzc2FnZSgiTEFCRUxfWUVTX1RPX0FMTCIpKSk7Ci0gICAgY2hvaWNlcy5hZGQobmV3IENob2ljZSggJ0MnLCBtc2dfLmdldE1lc3NhZ2UoIkxBQkVMX0NBTkNFTCIpKSk7Ci0gICAgCi0gICAgcmV0dXJuIChDaG9pY2VbXSljaG9pY2VzLnRvQXJyYXkobmV3IENob2ljZVtjaG9pY2VzLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgKiBSZXR1cm5zIGFuCi0gICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBJUmVzb3VyY2V9Ci0gICogb2YgdGhlIGdpdmVuIGFic29sdXRlIHBhdGhuYW1lIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0gICogQHBhcmFtIGFic29sdXRlUGF0aG5hbWUgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlLgotICAqIEByZXR1cm4gVGhlIDxjb2RlPklSZXNvdXJjZTwvY29kZT4uCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGZpbmRSZXNvdXJjZSAoIFN0cmluZyBhYnNvbHV0ZVBhdGhuYW1lICkKLSAgewotICAgIGlmIChhYnNvbHV0ZVBhdGhuYW1lID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmaW5kUmVzb3VyY2UobmV3IFBhdGgoYWJzb2x1dGVQYXRobmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgSVJlc291cmNlfQotICAqIG9mIHRoZSBnaXZlbiBhYnNvbHV0ZSBwYXRoIG9yIG51bGwgaWYgbm8gc3VjaCByZXNvdXJjZSBleGlzdHMuCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgPGNvZGU+SVBhdGg8L2NvZGU+IG9mIHRoZSByZXNvdXJjZS4KLSAgKiBAcmV0dXJuIFRoZSA8Y29kZT5JUmVzb3VyY2U8L2NvZGU+LgotICAqLwotICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UgKCBJUGF0aCBhYnNvbHV0ZVBhdGggKQotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gRmlsZVJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmZpbmRNZW1iZXIoYWJzb2x1dGVQYXRoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvcGllcyBhIGZpbGUgZnJvbSBhIHBsdWdpbidzIGluc3RhbGxhdGlvbiBsb2NhdGlvbgotICAgKiB0byBhbiBFY2xpcHNlIGZvbGRlci4KLSAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHRvIGNvcHkuCi0gICAqIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEBwYXJhbSBzb3VyY2VQYXRoIFRoZSBwYXRoLCByZWxhdGl2ZSB0byB0aGUgPGNvZGU+cGx1Z2luPC9jb2RlPgotICAgKiBpbnN0YWxsIGxvY2F0aW9uLCBjb250YWluaW5nIHRoZSBmaWxlcyB0byBjb3B5LgotICAgKiBJZiBudWxsLCB0aGVuIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbiBpcyB0aGUgc291cmNlIHBhdGgKLSAgICogKGllLiBudWxsIGlzIGVxdWl2YWxlbnQgdG8gIi4iKS4KLSAgICogQHBhcmFtIHBhdGhuYW1lIFRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZSB0byBjb3B5LgotICAgKiBUaGUgcGF0aG5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIDxjb2RlPnBsdWdpbiBzb3VyY2VQYXRoPC9jb2RlPi4KLSAgICogTXVzdCBub3QgYmUgbnVsbC4KLSAgICogQHBhcmFtIHRhcmdldFBhdGggVGhlIGFic29sdXRlIEVjbGlwc2UgcGF0aCBvZiB0aGUgZm9sZGVyIHRvCi0gICAqIHdoaWNoIHRoZSBmaWxlIHdpbGwgYmUgY29waWVkLiBUaGUgcmVsYXRpdmUgcGF0aG5hbWUgb2YgdGhlCi0gICAqIGZpbGUgaXMgcHJlc2VydmVkLgotICAgKiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcGFyYW0gY3JlYXRlRm9sZGVycyBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotICAgKiB7QGxpbmsgI0NSRUFURSBDUkVBVEV9IG9yIHtAbGluayAjRE9OVF9DUkVBVEUgRE9OVF9DUkVBVEV9LgotICAgKiA8dWw+Ci0gICAqIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+IC0KLSAgICogSWYgYW55IGludGVybWVkaWF0ZSBmb2xkZXJzIGluIHRoZSBnaXZlbiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+Ci0gICAqIGRvIG5vdCBleGlzdCwgdGhleSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAqIDxsaT48Y29kZT5ET05UX0NSRUFURTwvY29kZT4gLQotICAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgICogZG8gbm90IGV4aXN0LCB0aGUgbWV0aG9kIHdpbGwgdGhyb3cgYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPi4KLSAgICogPC91bD4KLSAgICogQHBhcmFtIG92ZXJ3cml0ZUZpbGUgVGhlIHBvbGljeSBmb3IgZXhpc3RpbmcgZmlsZXMsIG9uZSBvZgotICAgKiB7QGxpbmsgI09WRVJXUklURSBPVkVSV1JJVEV9IG9yIHtAbGluayAjRE9OVF9PVkVSV1JJVEUgRE9OVF9PVkVSV1JJVEV9LgotICAgKiA8dWw+Ci0gICAqIDxsaT48Y29kZT5PVkVSV1JJVEU8L2NvZGU+IC0KLSAgICogSWYgYSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhIGZpbGUsCi0gICAqIGl0IHdpbGwgYmUgcmVwbGFjZWQuCi0gICAqIElmIHRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXQgaXMgbm90IGEgZmlsZSwKLSAgICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgICogYSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93bi4KLSAgICogPGxpPjxjb2RlPkRPTlRfT1ZFUldSSVRFPC9jb2RlPiAtCi0gICAqIElmIGFueSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzLAotICAgKiB0aGVuIG5vIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGFuZAotICAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAgKiA8L3VsPgotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIFRoZSBwcm9ncmVzcyBtb25pdG9yIGZvciB0aGUgb3BlcmF0aW9uLCBvciBudWxsLgotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAgKi8KLSAgIHN0YXRpYyBwdWJsaWMgdm9pZCBjb3B5RmlsZSggUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luIHBsdWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggc291cmNlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHRhcmdldFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c0hhbmRsZXIgc3RhdHVzTW9uaXRvciApCi0gICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICB7Ci0gICAgIHRyeQotICAgICB7Ci0gICAgICAgSVBhdGggdGFyZ2V0ID0gdGFyZ2V0UGF0aC5hcHBlbmQocGF0aG5hbWUpOwotICAgICAgIElQYXRoIHNvdXJjZSA9IHNvdXJjZVBhdGggPT0gbnVsbCA/IHBhdGhuYW1lIDogc291cmNlUGF0aC5hcHBlbmQocGF0aG5hbWUpOwotICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gcGx1Z2luLm9wZW5TdHJlYW0oc291cmNlKTsKLSAgICAgICBjcmVhdGVGaWxlKHJlc291cmNlQ29udGV4dCwgdGFyZ2V0LCBpbnB1dCwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNNb25pdG9yKTsKLSAgICAgfQotICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgewotICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4uZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTyIpLGUpKTsKLSAgICAgfQotICAgfQotICAgCi0gIC8qKgotICAgKiBEZWxldGVzIGEgZmlsZSB1bmRlciBhIGNvbnRhaW5lci4KLSAgICogVGhlIGNvbnRhaW5lciBtdXN0IGFscmVhZHkgZXhpc3QuCi0gICAqIEBwYXJhbSBmaWxlIC0gdGhlIElGaWxlIHRvIGJlIGRlbGV0ZWQKLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotICAgKiBAcGFyYW0gc3RhdHVzTW9uaXRvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaWYgaXQgZXhpc3RzIGFuZCBpcyBzdWNjZXNzZnVsbHkgZGVsZXRlZC4gRmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUZpbGUoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yKQotICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpKQotICAgICAgewotICAgICAgICBTaW1wbGVTdGF0dXMgc3RhdHVzIAotICAgICAgICAgID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX0ZJTEVfT1ZFUldSSVRFX0RJU0FCTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldE5hbWUoKX0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuV0FSTklORyApOwotICAgICAgICAKLSAgICAgICAgQ2hvaWNlIGNob2ljZSA9IHN0YXR1c01vbml0b3IucmVwb3J0KCBzdGF0dXMsIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggY2hvaWNlLmdldFNob3J0Y3V0KCkgPT0gJ0MnICkgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgaWYoIGNob2ljZS5nZXRTaG9ydGN1dCgpID09ICdBJyApIHJlc291cmNlQ29udGV4dC5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vV2UgaGF2ZSBwZXJtaXNzaW9uIHRvIG92ZXJ3cml0ZSBzbyBjaGVjayBpZiBmaWxlIGlzIHJlYWQtb25seQotICAgICAgaWYgKGZpbGUuaXNSZWFkT25seSgpKQotICAgICAgewotICAgICAgICBpZiAoIXJlc291cmNlQ29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTaW1wbGVTdGF0dXMgc3RhdHVzIAotICAgICAgICAgID0gbmV3IFNpbXBsZVN0YXR1cygiIiwgbXNnXy5nZXRNZXNzYWdlKCAiTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpfSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5XQVJOSU5HICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQ2hvaWNlIGNob2ljZSA9IHN0YXR1c01vbml0b3IucmVwb3J0KCBzdGF0dXMsIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIGNob2ljZS5nZXRTaG9ydGN1dCgpID09ICdDJyApIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAKLSAgICAgICAgICBpZiggY2hvaWNlLmdldFNob3J0Y3V0KCkgPT0gJ0EnICkgcmVzb3VyY2VDb250ZXh0LnNldENoZWNrb3V0RmlsZXNFbmFibGVkKHRydWUpOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLSAgICAgICAgZmlsZXNbMF0gPSBmaWxlOwotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcywgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiApCi0gICAgICAgIHsKLSAgICAgICAgICBTaW1wbGVTdGF0dXMgdmFsaWRhdGVTdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCAiIiwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgU2ltcGxlU3RhdHVzLkVSUk9SICk7Ci0gICAgICAgICAgc3RhdHVzTW9uaXRvci5yZXBvcnRFcnJvciggdmFsaWRhdGVTdGF0dXMgKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0gICAgfQotICAgIC8vQXQgdGhpcyBwb2ludCwgZWl0aGVyIHRoZSBmaWxlIGRpZCBub3QgZXhpc3Qgb3Igd2Ugc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQKLSAgICAvLyBpdC4gUmV0dXJuIHN1Y2Nlc3MuCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogRGVsZXRlcyBhIGZvbGRlciB1bmRlciBhIGNvbnRhaW5lci4KLSAgICogQHBhcmFtIGZvbGRlciAtIHRoZSBJRm9sZGVyIHRvIGJlIGRlbGV0ZWQKLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotICAgKiBAcGFyYW0gc3RhdHVzTW9uaXRvcgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZvbGRlciBkb2VzIG5vdCBleGlzdCBvciBpZiBpdCBleGlzdHMgYW5kIGlzIHN1Y2Nlc3NmdWxseSBkZWxldGVkIGFsb25nIHdpdGggaXRzIG1lbWJlcnMuIEZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRm9sZGVyKCBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciBmb2xkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzSGFuZGxlciBzdGF0dXNNb25pdG9yICkKLSAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgIHsKLSAgICAgaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHJldHVybiB0cnVlOwotCi0gICAgIGJvb2xlYW4gICAgIGRlbGV0ZWQgICA9IHRydWU7Ci0gICAgIElSZXNvdXJjZVtdIHJlc291cmNlcyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0gICAgIAotICAgICBmb3IgKGludCBpPTA7IGk8cmVzb3VyY2VzLmxlbmd0aDsgaSsrKQotICAgICB7Ci0gICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgIHsKLSAgICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGaWxlKHJlc291cmNlQ29udGV4dCwgKElGaWxlKXJlc291cmNlLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c01vbml0b3IpOwotICAgICAgIH0KLSAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKQotICAgICAgIHsKLSAgICAgICAgIGRlbGV0ZWQgPSBkZWxldGVGb2xkZXIoIHJlc291cmNlQ29udGV4dCwgKElGb2xkZXIpcmVzb3VyY2UsIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0gICAgICAgfQotCi0gICAgICAgaWYoICFkZWxldGVkICkgYnJlYWs7Ci0gICAgIH0KLSAgICAgCi0gICAgIGlmKCBkZWxldGVkICkKLSAgICAgewotICAgICAgIGZvbGRlci5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgcmV0dXJuIHRydWU7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotICAvKioKLSAgKiBDcmVhdGVzIGEgZmlsZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGFuZCByZXR1cm5zIGl0cyBoYW5kbGUgYXMgYW4gPGNvZGU+SUZpbGU8L2NvZGU+LgotICAqIElmIHRoZSBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLCBhCi0gICogPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gY29udGFpbmluZyBhbgotICAqIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdCBpcyB0aHJvd24uCi0gICogQHBhcmFtIGFic29sdXRlUGF0aCBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCi0gICogVGhlIHByb2plY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGF0aCBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICogQHJldHVybiBUaGUge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIElGaWxlfQotICAqIGhhbmRsZSBvZiB0aGUgZmlsZS4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAqLwotICBwdWJsaWMgc3RhdGljIElGaWxlIGNyZWF0ZUZpbGUgKAotICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCi0gICAgSVBhdGggICAgICAgICAgIGFic29sdXRlUGF0aCwKLSAgICBJbnB1dFN0cmVhbSAgICAgaW5wdXRTdHJlYW0sCi0gICAgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLSAgICBTdGF0dXNIYW5kbGVyICAgc3RhdHVzSGFuZGxlciApCi0KLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgeyAgICAKLSAgICBpZiAoIWFic29sdXRlUGF0aC5pc0Fic29sdXRlKCkpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAiUmVzb3VyY2VVdGlscyIsMCxtc2dfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QQVRIX05PVF9BQlNPTFVURSIsbmV3IE9iamVjdFtdIHthYnNvbHV0ZVBhdGgudG9TdHJpbmcoKX0pLG51bGwpKTsKLSAgICB9Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8IDEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJSZXNvdXJjZVV0aWxzIiwwLG1zZ18uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1BBVEhfRU1QVFkiLG5ldyBPYmplY3RbXSB7YWJzb2x1dGVQYXRoLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0gICAgfQotICAgIGlmIChhYnNvbHV0ZVBhdGguc2VnbWVudENvdW50KCkgPCAyKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwiUmVzb3VyY2VVdGlscyIsMCxtc2dfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9QQVRIX05PVF9GT0xERVIiLG5ldyBPYmplY3RbXSB7YWJzb2x1dGVQYXRoLnRvU3RyaW5nKCl9KSxudWxsKSk7Ci0gICAgfQotICAgIElDb250YWluZXIgcGFyZW50ICAgPSBtYWtlRm9sZGVyUGF0aChyZXNvdXJjZUNvbnRleHQsIGFic29sdXRlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSksIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzSGFuZGxlcik7Ci0gICAgU3RyaW5nICAgICBmaWxlTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotICAgIAotICAgIHJldHVybiBtYWtlRmlsZShyZXNvdXJjZUNvbnRleHQsIHBhcmVudCwgZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBwcm9ncmVzc01vbml0b3IsIHN0YXR1c0hhbmRsZXIpOwotICB9Ci0KLSAgLyoqCi0gICogQ3JlYXRlcyB1bmRlciB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4KLSAgKiBhIGZpbGUgb2YgdGhlIGdpdmVuIDxjb2RlPnJlbGF0aXZlUGF0aDwvY29kZT4KLSAgKiBhbmQgcmV0dXJucyBpdHMgaGFuZGxlIGFzIGFuIDxjb2RlPklGaWxlPC9jb2RlPi4KLSAgKiBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgYQotICAqIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IGNvbnRhaW5pbmcgYW4KLSAgKiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBvYmplY3QgaXMgdGhyb3duLgotICAqIEBwYXJhbSBhYnNvbHV0ZVBhdGggVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgotICAqIFRoZSBwcm9qZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhdGggbXVzdCBhbHJlYWR5IGV4aXN0LAotICAqIHRoYXQgaXMsIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBwcm9qZWN0cy4KLSAgKiBAcGFyYW0gY3JlYXRlRm9sZGVycyBUaGUgaW50ZXJtZWRpYXRlIGZvbGRlciBjcmVhdGlvbiBwb2xpY3ksIG9uZSBvZgotICAqIHtAbGluayAjQ1JFQVRFIENSRUFURX0gb3Ige0BsaW5rICNET05UX0NSRUFURSBET05UX0NSRUFURX0uCi0gICogPHVsPgotICAqIDxsaT48Y29kZT5DUkVBVEU8L2NvZGU+IC0KLSAgKiBJZiBhbnkgaW50ZXJtZWRpYXRlIGZvbGRlcnMgaW4gdGhlIGdpdmVuIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4KLSAgKiBkbyBub3QgZXhpc3QsIHRoZXkgd2lsbCBiZSBjcmVhdGVkLgotICAqIDxsaT48Y29kZT5ET05UX0NSRUFURTwvY29kZT4gLQotICAqIElmIGFueSBpbnRlcm1lZGlhdGUgZm9sZGVycyBpbiB0aGUgZ2l2ZW4gPGNvZGU+YWJzb2x1dGVQYXRoPC9jb2RlPgotICAqIGRvIG5vdCBleGlzdCwgdGhlIG1ldGhvZCB3aWxsIHRocm93IGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4uCi0gICogPC91bD4KLSAgKiBAcGFyYW0gb3ZlcndyaXRlRmlsZSBUaGUgcG9saWN5IGZvciBleGlzdGluZyBmaWxlcywgb25lIG9mCi0gICoge0BsaW5rICNPVkVSV1JJVEUgT1ZFUldSSVRFfSBvciB7QGxpbmsgI0RPTlRfT1ZFUldSSVRFIERPTlRfT1ZFUldSSVRFfS4KLSAgKiA8dWw+Ci0gICogPGxpPjxjb2RlPk9WRVJXUklURTwvY29kZT4gLQotICAqIElmIGEgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2l2ZW4KLSAgKiA8Y29kZT5hYnNvbHV0ZVBhdGg8L2NvZGU+IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBhIGZpbGUsCi0gICogaXQgd2lsbCBiZSByZXBsYWNlZC4KLSAgKiBJZiB0aGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZpbGUsCi0gICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAqIDxsaT48Y29kZT5ET05UX09WRVJXUklURTwvY29kZT4gLQotICAqIElmIGFueSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnaXZlbgotICAqIDxjb2RlPmFic29sdXRlUGF0aDwvY29kZT4gYWxyZWFkeSBleGlzdHMsCi0gICogdGhlbiBubyBmaWxlIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgKiBhIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLgotICAqIDwvdWw+Ci0gICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbiwgb3IgbnVsbC4KLSAgKiBAcmV0dXJuIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlLgotICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBBbiBleGNlcHRpb24gY29udGFpbmluZyBhbgotICAqIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICAqIHdpdGggYSBzZXZlcml0eSBvZiA8Y29kZT5JU3RhdHVzLkVSUk9SPC9jb2RlPiBhbmQgYQotICAqIGxvY2FsZS1zcGVjaWZpYyBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2UuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgSUZpbGUgY3JlYXRlRmlsZSAoCi0gICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICBJUHJvamVjdCAgICAgICAgcHJvamVjdCwKLSAgICBJUGF0aCAgICAgICAgICAgcmVsYXRpdmVQYXRoLAotICAgIElucHV0U3RyZWFtICAgICBpbnB1dFN0cmVhbSwKLSAgICBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotICAgIFN0YXR1c0hhbmRsZXIgICBzdGF0dXNNb25pdG9yICkKLSAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgewotICAgIElQYXRoIGFic29sdXRlUGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocmVsYXRpdmVQYXRoKTsKLSAgICByZXR1cm4gY3JlYXRlRmlsZShyZXNvdXJjZUNvbnRleHQsIGFic29sdXRlUGF0aCwgaW5wdXRTdHJlYW0sIHByb2dyZXNzTW9uaXRvciwgc3RhdHVzTW9uaXRvcik7Ci0gIH0KLQotICAvKioKLSAgKiBDcmVhdGVzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBjYW4gYmUgdXNlZCB0byB3cml0ZSB0byB0aGUKLSAgKiBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPi4gQWN0dWFsIGNoYW5nZXMgdG8gdGhlIHdvcmtzcGFjZQotICAqIG1heSBvY2N1ciBkdXJpbmcgY3JlYXRpb24gb2YgdGhlIHN0cmVhbSwgd2hpbGUgd3JpdGluZyB0bwotICAqIHRoZSBzdHJlYW0sIG9yIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCi0gICogQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBjb250YWluaW5nCi0gICogYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gd2lsbCBiZSB0aHJvd24KLSAgKiBhdCBzb21lIHBvaW50IGluIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN0cmVhbQotICAqIGlmIHRoZSBmaWxlIHJlc291cmNlIGNhbm5vdCBiZSBjcmVhdGVkLgotICAqIEBwYXJhbSBmaWxlIFRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUgSUZpbGV9Ci0gICogaGFuZGxlIG9mIHRoZSBmaWxlIHJlc291cmNlIHRvIGNyZWF0ZS4gVGhlIHByb2plY3QgaW1wbGllZCBieSB0aGUKLSAgKiBwYXRobmFtZSBvZiB0aGUgZmlsZSBtdXN0IGFscmVhZHkgZXhpc3QsCi0gICogdGhhdCBpcywgdGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHByb2plY3RzLgotICAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IgVGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBvcGVyYXRpb24sIG9yIG51bGwuCi0gICogQHJldHVybiBBbiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+IHRpZWQgdG8gdGhlIGZpbGUgcmVzb3VyY2UuCi0gICogQWN0dWFsIGNoZWNrcyBvZiBvciBjaGFuZ2VzIHRvIHRoZSB3b3Jrc3BhY2UgbWF5IG9jY3VyIGFzIGVhcmx5IGR1cmluZwotICAqIHN0cmVhbSBjcmVhdGlvbiwgY2xvc3VyZSwgb3IgYW55IHRpbWUgaW4gYmV0d2Vlbi4KLSAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gQW4gZXhjZXB0aW9uIGNvbnRhaW5pbmcgYW4KLSAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMgSVN0YXR1c30KLSAgKiB3aXRoIGEgc2V2ZXJpdHkgb2YgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gYW5kIGEKLSAgKiBsb2NhbGUtc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGNhdXNlLgotICAqIFJlYXNvbnMgaW5jbHVkZToKLSAgKiA8b2w+Ci0gICogPGxpPlRoZSBwcm9qZWN0IG9mIHRoZSBnaXZlbiBmaWxlJ3MgcGF0aCBkb2VzIG5vdCBleGlzdC4KLSAgKiA8bGk+QSBub24tZmlsZSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlCi0gICogYWxyZWFkeSBleGlzdHMuCi0gICogPGxpPkEgZmlsZSByZXNvdXJjZSBvZiB0aGUgc2FtZSBuYW1lIG9mIHRoZSBnaXZlbiBmaWxlCi0gICogYWxyZWFkeSBleGlzdHMsIGFuZCA8Y29kZT5vdmVyd3JpdGVGaWxlPC9jb2RlPiBpcyBmYWxzZS4KLSAgKiA8bGk+T25lIG9yIG1vcmUgaW50ZXJtZWRpYXRlIGZvbGRlcnMgdG8gdGhlIGdpdmVuIGZpbGUKLSAgKiBkbyBub3QgZXhpc3QsIGFuZCA8Y29kZT5jcmVhdGVGb2xkZXJzPC9jb2RlPiBpcyBmYWxzZS4KLSAgKiA8L29sPgotICAqLwotCi0gIHB1YmxpYyBzdGF0aWMgT3V0cHV0U3RyZWFtIG5ld0ZpbGVPdXRwdXRTdHJlYW0gKAotICAgICAgIFJlc291cmNlQ29udGV4dCBjb250ZXh0LAotICAgICAgIElQYXRoICAgICAgICAgICBmaWxlLAotICAgICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgICAgU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotIAotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VPdXRwdXRTdHJlYW0oY29udGV4dCwgZmlsZSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNIYW5kbGVyKTsKLSAgfQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBOYXVnaHR5IGJpdHMuLi4KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIHBhdGggb2YgZm9sZGVycy4KLSAgLy8gRG8gbm90IGNhbGwgd2l0aCBhbiBhYnNvbHV0ZVBhdGggb2YgbGVzcyB0aGFuIG9uZSBzZWdtZW50LgotICAvLwotICAvKioKLSAgICogQ3JlYXRlcyBhIHBhdGggb2YgZm9sZGVycy4KLSAgICogRG8gbm90IGNhbGwgd2l0aCBhbiBhYnNvbHV0ZVBhdGggb2YgbGVzcyB0aGFuIG9uZSBzZWdtZW50LgotICAgKiBAcGFyYW0gcmVzb3VyY2VDb250ZXh0IHRoZSByZXNvdXJjZSBjb250ZXh0IGZvciBtYWtpbmcgZm9sZGVycy4KLSAgICogQHBhcmFtIGFic29sdXRlUGF0aCB0aGUgcGF0aCBvZiBmb2xkZXJzIHRoYXQgd2lsbCBiZSBjcmVhdGVkLgotICAgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIGJlIHVzZWQuCi0gICAqIEBwYXJhbSBzdGF0dXNIYW5kbGVyIHRoZSBzdGF0dXMgaGFuZGxlci4KLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBJQ29udGFpbmVyIG9mIHRoZSBjcmVhdGVkIGZvbGRlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBtYWtlRm9sZGVyUGF0aCAoCi0gICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICBJUGF0aCBhYnNvbHV0ZVBhdGgsCi0gICAgUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwKLSAgICBTdGF0dXNIYW5kbGVyIHN0YXR1c0hhbmRsZXIgKQotICAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGFic29sdXRlUGF0aC5zZWdtZW50Q291bnQoKSA8PSAxKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChhYnNvbHV0ZVBhdGguc2VnbWVudCgwKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBJQ29udGFpbmVyIHBhcmVudCA9IG1ha2VGb2xkZXJQYXRoKHJlc291cmNlQ29udGV4dCwgYWJzb2x1dGVQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSwgcHJvZ3Jlc3NNb25pdG9yLCBzdGF0dXNIYW5kbGVyICk7Ci0gICAgICBTdHJpbmcgZm9sZGVyTmFtZSA9IGFic29sdXRlUGF0aC5sYXN0U2VnbWVudCgpOwotICAgICAgCi0gICAgICByZXR1cm4gbWFrZUZvbGRlcihyZXNvdXJjZUNvbnRleHQsIHBhcmVudCxmb2xkZXJOYW1lLCBwcm9ncmVzc01vbml0b3IgLCBzdGF0dXNIYW5kbGVyICk7Ci0gICAgfQotICB9Ci0gIC8vCi0gIC8vIENyZWF0ZXMgYSBmb2xkZXIgdW5kZXIgYSBjb250YWluZXIuCi0gIC8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotICAvLwotIHByaXZhdGUgc3RhdGljIElGb2xkZXIgbWFrZUZvbGRlciAoCi0gICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKLSAgICBJQ29udGFpbmVyICAgICAgcGFyZW50LAotICAgIFN0cmluZyAgICAgICAgICBmb2xkZXJOYW1lLAotICAgIFByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsCi0gICAgU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotICAKLSAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSBjaGlsZCAgPSBwYXJlbnQuZmluZE1lbWJlcihmb2xkZXJOYW1lKTsKLSAgICBDaG9pY2UgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiggY2hpbGQgPT0gbnVsbCApCi0gICAgewotICAgICAgaWYgKCFyZXNvdXJjZUNvbnRleHQuaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpKSAgCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN0YXR1c0hhbmRsZXIucmVwb3J0KAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJSZXNvdXJjZVV0aWxzIiwKLSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GT0xERVJfQ1JFQVRJT05fRElTQUJMRUQiLAotICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgcGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZm9sZGVyTmFtZX0gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuV0FSTklORywgbnVsbCApLCAKLSAgICAgICAgICAgICAgICBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSApOwotICAgICAgICAKLSAgICAgICAgaWYoIHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5nZXRTaG9ydGN1dCgpID09ICdDJyApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCByZXN1bHQuZ2V0U2hvcnRjdXQoKSA9PSAnQScgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldENyZWF0ZUZvbGRlcnNFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIElGb2xkZXIgZm9sZGVyID0gcGFyZW50LmdldEZvbGRlcihuZXcgUGF0aChmb2xkZXJOYW1lKSk7Ci0gICAgICBmb2xkZXIuY3JlYXRlKHRydWUsdHJ1ZSxudWxsKTsKLSAgICAgIHJldHVybiBmb2xkZXI7Ci0gICAgfQotICAgIGVsc2UgaWYoIGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICB7Ci0gICAgICByZXR1cm4gKElGb2xkZXIpY2hpbGQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLSAgICAgICAgbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgCi0gICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZVV0aWxzIiwKLSAgICAgICAgICAgICAgICAgICAgMCwgCi0JCQkJCW1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSIiwKLQkJCQkJICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IHBhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmb2xkZXJOYW1lKS50b1N0cmluZygpIH0pLAotCQkJbnVsbCApICk7Ci0gICAgfQotICB9Ci0KLSAgLy8KLSAgLy8gQ3JlYXRlcyBhIGZpbGUgdW5kZXIgYSBjb250YWluZXIuCi0gIC8vIFRoZSBjb250YWluZXIgbXVzdCBhbHJlYWR5IGV4aXN0LgotICAvLwotIHByaXZhdGUgc3RhdGljIElGaWxlIG1ha2VGaWxlICgKLSAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotICAgIElDb250YWluZXIgICAgICBwYXJlbnQsCi0gICAgU3RyaW5nICAgICAgICAgIGZpbGVOYW1lLAotICAgIElucHV0U3RyZWFtICAgICBpbnB1dFN0cmVhbSwKLSAgICBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLAotICAgIFN0YXR1c0hhbmRsZXIgICBzdGF0dXNIYW5kbGVyICkKLSAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIGNoaWxkICA9IHBhcmVudC5maW5kTWVtYmVyKGZpbGVOYW1lKTsKLSAgICBDaG9pY2UgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBpZiggY2hpbGQgIT0gbnVsbCApCi0gICAgewotICAgICAgaWYoIGNoaWxkLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSApCi0gICAgICB7Ci0gICAgICAgIGlmKCAhcmVzb3VyY2VDb250ZXh0LmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkgKSAgIAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gc3RhdHVzSGFuZGxlci5yZXBvcnQoIAotICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJSZXNvdXJjZVV0aWxzIiwKLSAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BhcmVudC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksZmlsZU5hbWV9KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuV0FSTklORyApLAotCQkJCQkgIAkJICAgIAotICAgICAgICAgICAgICAgIGdldFRocmVlU3RhdGVGaWxlT3B0aW9ucygpICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5nZXRTaG9ydGN1dCgpID09ICdDJyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYoIHJlc3VsdC5nZXRTaG9ydGN1dCgpID09ICdBJyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnNldE92ZXJ3cml0ZUZpbGVzRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0JCi0gICAgICAgIAotICAgICAgICAvL1dlIGhhdmUgcGVybWlzc2lvbiB0byBvdmVyd3JpdGUgc28gY2hlY2sgaWYgZmlsZSBpcyByZWFkLW9ubHkKLSAgICAgICAgaWYoIGNoaWxkLmdldFJlc291cmNlQXR0cmlidXRlcygpLmlzUmVhZE9ubHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiggIXJlc291cmNlQ29udGV4dC5pc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkgKSAKLSAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQgPSBzdGF0dXNIYW5kbGVyLnJlcG9ydCggCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZVN0YXR1cyggIlJlc291cmNlVXRpbHMiLAotICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9GSUxFX0NIRUNLT1VUX0RJU0FCTEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgcGFyZW50LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxmaWxlTmFtZX0gKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuV0FSTklORyApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUaHJlZVN0YXRlRmlsZU9wdGlvbnMoKSApOwotICAgICAgICAgICAgCi0JCSAgICBpZiggcmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmdldFNob3J0Y3V0KCkgPT0gJ0MnICkKLQkJICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JCSAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCByZXN1bHQuZ2V0U2hvcnRjdXQoKSA9PSAnQScgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQuc2V0Q2hlY2tvdXRGaWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVsxXTsKLSAgICAgICAgICBmaWxlc1swXSA9IChJRmlsZSljaGlsZDsKLSAgICAgICAgICAKLSAgICAgICAgICBJU3RhdHVzICAgICAgc3RhdHVzID0gZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KGZpbGVzLG51bGwpOwotICAgICAgICAgIFNpbXBsZVN0YXR1cyBzcyAgICAgPSBuZXcgU2ltcGxlU3RhdHVzKCBzdGF0dXMuZ2V0UGx1Z2luKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgCi0JCQkJCQkJCQkJCQkgIHN0YXR1cy5nZXRFeGNlcHRpb24oKSApOwotICAgICAgICAgIAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1c0hhbmRsZXIucmVwb3J0KCBzcyApOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCggU3RhdHVzRXhjZXB0aW9uIGV4YyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy9DaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBleGlzdGluZyBmaWxlLgotICAgICAgICBJRmlsZSBmaWxlID0gcGFyZW50LmdldEZpbGUoIG5ldyBQYXRoKGZpbGVOYW1lKSApOwotICAgICAgICBmaWxlLnNldENvbnRlbnRzKCBpbnB1dFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCApOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIAotICAgICAgICAgIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlVXRpbHMiLAotICAgICAgICAgICAgICAgICAgICAgIDAsIAotCQkJCSAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRklMRSIsCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3BhcmVudC5nZXRGdWxsUGF0aCgpLmFwcGVuZChmaWxlTmFtZSl9KSwKLQkJCQkJICBudWxsICkgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vQ3JlYXRlIGEgbmV3IGZpbGUuCi0gICAgICBJRmlsZSBmaWxlID0gcGFyZW50LmdldEZpbGUoIG5ldyBQYXRoKGZpbGVOYW1lKSApOwotICAgICAgZmlsZS5jcmVhdGUoIGlucHV0U3RyZWFtLCB0cnVlLCBudWxsKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9TdHJpbmdVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tb24vU3RyaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlNjcxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9TdHJpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICAqIFRoaXMgY2xhc3MgY29udGFpbnMgc29tZSB1c2VmdWwgc3RyaW5nIHV0aWxpdGllcyB0aGF0IGFyZSBub3QgcHJvdmlkZWQgYnkKLSAgKiBlaXRoZXIgU3RyaW5nIG9yIFN0cmluZ0J1ZmZlci4KLSAgKgotICAqIEBhdXRob3IgUGV0ZXIgTW9vZ2sKLSAgKiBAZGF0ZSAgIEp1bHkgMTMsIDIwMDAKLSoqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ1V0aWxzCi17Ci0gIC8qKgotICAqIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvci4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotICBwcml2YXRlIFN0cmluZ1V0aWxzKCl7fTsKLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHNwbGl0cyBhIHNpbmdsZSBsaW5lIG9mIHRleHQgaW50byBtdWx0aXBsZSBsaW5lcwotICAgICogYmFzZWQgb24gYSBtYXhpbXVtIGxpbmUgbGVuZ3RoLiAgVGhlIG1ldGhvZCB3aWxsIHRyeSB0byBmaXQgYXMKLSAgICAqIG1hbnkgd29yZHMgYXMgcG9zc2libGUgb250byBhIGxpbmUgd2l0aG91dCBleGNlZWRpbmcgdGhlIG1heGltdW0KLSAgICAqIGxpbmUgbGVuZ3RoLiAgTm90ZTogdGhlIG9ubHkgY2FzZSB3aGVyZSBhIGxpbmUgbWlnaHQgZXhjZWVkIHRoZQotICAgICogbWF4aW11bSBpcyBpZiBhIHNpbmdsZSB3b3JkIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtLgotICAgICogQHBhcmFtIHRleHQgYSBzaW5nbGUgbGluZSBhIHRleHQgdGhhdCBpcyB0byBiZSBzcGxpdC4KLSAgICAqIEBwYXJhbSBtYXhfbGVuZ3RoIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBlYWNoIHNwbGl0IGxpbmUuCi0gICAgKiBAcmV0dXJuIGEgc3RyaW5nIGFycmF5IG9mIHRoZSBzcGxpdCBsaW5lcy4KLSAgKiovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXR0ZXIoIFN0cmluZyB0ZXh0LCBpbnQgbWF4X2xlbmd0aCApCi0gIHsKLSAgICBWZWN0b3IgICAgICAgICAgcmV0dXJuX3RleHQgPSBuZXcgVmVjdG9yKDIwKTsKLSAgICBTdHJpbmdbXSAgICAgICAgcmV0dXJuX3N0cjsKLSAgICBpbnQgICAgICAgICAgICAgaW5kZXggPSAwOwotCi0gICAgd2hpbGUoIGluZGV4IDwgdGV4dC5sZW5ndGgoKSApCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHRleHQuc3Vic3RyaW5nKCBpbmRleCwgTWF0aC5taW4oIG1heF9sZW5ndGggKyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Lmxlbmd0aCgpICkgKTsKLSAgICAgIGludCBzcGFjZV9pbmRleCA9IHN0ci5sYXN0SW5kZXhPZiggIiAiICk7Ci0KLSAgICAgIGlmKCBpbmRleCArIHN0ci5sZW5ndGgoKSA8IHRleHQubGVuZ3RoKCkgJiYKLSAgICAgICAgICB0ZXh0LmNoYXJBdCggaW5kZXggKyBzdHIubGVuZ3RoKCkgLSAxICkgIT0gJyAnICYmCi0gICAgICAgICAgdGV4dC5jaGFyQXQoIGluZGV4ICsgc3RyLmxlbmd0aCgpICkgIT0gJyAnICYmCi0gICAgICAgICAgc3BhY2VfaW5kZXggIT0gLTEgKQotICAgICAgewotICAgICAgICByZXR1cm5fdGV4dC5hZGRFbGVtZW50KCBzdHIuc3Vic3RyaW5nKCAwLCBzcGFjZV9pbmRleCApICk7Ci0gICAgICAgIGluZGV4ICs9IHNwYWNlX2luZGV4ICsgMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuX3RleHQuYWRkRWxlbWVudCggc3RyLnRyaW0oKSApOwotICAgICAgICBpbmRleCArPSBzdHIubGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuX3N0ciA9IG5ldyBTdHJpbmdbcmV0dXJuX3RleHQuc2l6ZSgpXTsKLQotICAgIGZvciggaW5kZXggPSAwOyBpbmRleCA8IHJldHVybl90ZXh0LnNpemUoKTsgaW5kZXgrKyApCi0gICAgewotICAgICAgcmV0dXJuX3N0cltpbmRleF0gPSAoU3RyaW5nKShyZXR1cm5fdGV4dC5lbGVtZW50QXQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dXJuX3N0cjsKLSAgfQotCi0gIC8qKgotICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyB3aXRoIGEgcmVwZWF0ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuCi0gICAgKiBAcGFyYW0gdGhlX2NoYXIgdGhlIGNoYXJhY3RlciB0byBiZSByZXBlYXRlZC4KLSAgICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWUgdGhpcyBjaGFyYWN0ZXIgc2hvdWxkIGJlIHJlcGVhdGVkLgotICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvZiByZXBlYXRlZCBjaGFyYWN0ZXJzLgotICAqKi8KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgcmVwZWF0KCBjaGFyIHRoZV9jaGFyLCBpbnQgY291bnQgKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIGNvdW50ICk7Ci0KLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KysgKQotICAgIHsKLSAgICAgIGJ1Zi5hcHBlbmQoIHRoZV9jaGFyICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAgKiBUaGlzIG1ldGhvZCBmbGF0dGVucyBhbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gYSBzdHJpbmcuCi0gICAgKiBUaGUgbWV0aG9kIHJlc3BlY3RzIGVtYmVkZGVkIHdoaXRlc3BhY2UgYW5kIHF1b3Rlcy4KLSAgICAqIDx1bD4KLSAgICAqIDxsaT5BbnkgYXJndW1lbnQgd2l0aCBlbWJlZGRlZCB3aGl0ZXNwYWNlIHdpbGwgYmUgZmxhdHRlbmVkIG91dAotICAgICogd2l0aCBlbmNsb3NpbmcgcXVvdGVzLiBGb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSBhcmd1bWVudAotICAgICogPHU+SGVsbG8gV29ybGQ8L3U+Ci0gICAgKiB3aWxsIGJlIHJldHVybmVkIGFzCi0gICAgKiA8dT4iSGVsbG8gV29ybGQiPC91Pi4KLSAgICAqIDxsaT5BbnkgYXJndW1lbnQgd2l0aCBxdW90ZXMgd2lsbCBiZSBmbGF0dGVuZWQgb3V0IHdpdGggdGhlCi0gICAgKiBxdW90ZXMgZXNjYXBlZC4gRm9yIGV4YW1wbGUsIHRoZSBzaW5nbGUgYXJndW1lbnQKLSAgICAqIDx1PiJIYXBweSBkYXlzIjwvdT4KLSAgICAqIHdpbGwgYmUgcmV0dXJuZWQgYXMKLSAgICAqIDx1PlwiSGFwcHkgZGF5c1wiPC91Pi4KLSAgICAqIDwvdWw+Ci0gICAgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBhcnJheSBvZiBzdHJpbmdzIHRvIGZsYXR0ZW4uCi0gICAgKiBAcmV0dXJuIHRoZSBmbGF0dGVuZWQgc3RyaW5nLgotICAqLwotICBzdGF0aWMgcHVibGljIFN0cmluZyBmbGF0dGVuQXJndW1lbnRzICggU3RyaW5nW10gYXJndW1lbnRzICkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBmb3IgKGludCBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgYSBzZXBhcmF0b3IgKGV4Y2VwdCB0aGUgZmlyc3QgdGltZSkuCi0gICAgICAvLwotICAgICAgaWYgKGkgPiAwKSBidWYuYXBwZW5kKCcgJyk7Ci0KLSAgICAgIC8vCi0gICAgICAvLyBMb29rIGZvciB3aGl0ZXNwYWNlLgotICAgICAgLy8KLSAgICAgIGJvb2xlYW4gd2hpdGVzcGFjZSA9IGZhbHNlOwotICAgICAgY2hhcltdIGNoYXJzID0gYXJndW1lbnRzW2ldLnRvQ2hhckFycmF5KCk7Ci0gICAgICBmb3IgKGludCBqPTA7ICF3aGl0ZXNwYWNlICYmIGo8Y2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2pdKSkKLSAgICAgICAgewotICAgICAgICAgIHdoaXRlc3BhY2UgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vCi0gICAgICAvLyBBcHBlbmQgdGhlIGFyZ3VtZW50LCBxdW90ZWQgYXMgbmVjZXNzYXJ5LgotICAgICAgLy8KLSAgICAgIGlmICh3aGl0ZXNwYWNlKSBidWYuYXBwZW5kKCciJyk7Ci0gICAgICBmb3IgKGludCBqPTA7IGo8Y2hhcnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGFyc1tqXSA9PSAnIicpIGJ1Zi5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoY2hhcnNbal0pOwotICAgICAgfQotICAgICAgaWYgKHdoaXRlc3BhY2UpIGJ1Zi5hcHBlbmQoJyInKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICAqIFRoaXMgbWV0aG9kIHBhcnNlcyB3aGl0ZXNwYWNlLWRlbGltaXR0ZWQgZmlsZW5hbWVzIGZyb20KLSAgICAqIHRoZSBnaXZlbiA8Y29kZT5pbnB1dDwvY29kZT4gc3RyZWFtLiA8Yj5MaW1pdGF0aW9uOjwvYj4KLSAgICAqIFF1b3RlZCBmaWxlbmFtZXMgb3IgZmlsZW5hbWVzIHdpdGggZW1iZWRkZWQgd2hpdGVzcGFjZQotICAgICogYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgotICAgICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCBzdHJlYW0uCi0gICAgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIGZpbGVuYW1lcyBmcm9tIHRoZSBzdHJlYW0uCi0gICovCi0gIHN0YXRpYyBwdWJsaWMgRW51bWVyYXRpb24gcGFyc2VGaWxlbmFtZXNGcm9tU3RyZWFtICggSW5wdXRTdHJlYW0gaW5wdXQgKQotICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFZlY3RvciBmaWxlbmFtZXMgPSBuZXcgVmVjdG9yKDY0LDY0KTsKLSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLSAgICBieXRlIHN0YXRlID0gU1RBVEVfV1M7Ci0gICAgaW50IGljID0gaW5wdXQucmVhZCgpOwotICAgIHdoaWxlIChpYyA+PSAwKQotICAgIHsKLSAgICAgIGNoYXIgYyA9IChjaGFyKWljOwotICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBTVEFURV9XUzoKLSAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLSAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfTldTOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9OV1M6Ci0gICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoYyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBidWZmZXIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGZpbGVuYW1lcy5hZGQoZmlsZW5hbWUpOwotICAgICAgICAgICAgYnVmZmVyID0gbnVsbDsKLSAgICAgICAgICAgIHN0YXRlID0gU1RBVEVfV1M7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWMgPSBpbnB1dC5yZWFkKCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlbmFtZXMuZWxlbWVudHMoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1RBVEVfV1MgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFNUQVRFX05XUyA9IDE7Ci0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaXMgdGhlIHR5cGUgcGFzc2VkIGluIGlzIGEgcHJpbXRpdmUgamF2YSB0eXBlCi0gICogQHBhcmFtIGNsYXNzIG5hbWUgU3RyaW5nCi0gICogQHJldHVybiB0cnVlIGlzIHByaW1pdGl2ZSB0eXBlCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSAKLSAgewotCi0gICAgaWYgKHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImJvb2xlYW4iKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYnl0ZSIpIHx8Ci0gICAgICB0eXBlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJkb3VibGUiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZmxvYXQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW50IikgfHwKLSAgICAgIHR5cGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImxvbmciKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2hvcnQiKSB8fAotICAgICAgdHlwZU5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY2hhciIpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICAvKioKLSAgKiBUaGUgbWV0aG9kIHJlcGxhY2UgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsb3dlZCBpbiBVUklzCi0gICogYW5kIG5vdCBhbGxvd2VkIGluIEphdmEgY2xhc3MgbmFtZXMgdG8gYW4gdW5kZXJzY29yZSAoJ18nKQotICAqIEBwYXJhbSBVUkkgU3RyaW5nCi0gICogQHJldHVybiB2YWxpZCBKYXZhIGNsYXNzIG5hbWUgU3RyaW5nCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSSTJDbGFzc05hbWUoIFN0cmluZyB1cmkgKSB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IHVyaTsKLSAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBVUklfU1lNQk9MUy5sZW5ndGg7IGkrKyApIHsKLSAgICAJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UgKCBVUklfU1lNQk9MU1tpXSwgVU5ERVJTQ09SRSApOwotICAgIH0KLSAgICByZXR1cm4gY2xhc3NOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW5kIGFycmF5IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRyYWNlYmFjayBpbmZvcm1hdGlvbiBvZgotICAgKiBhIFRocm93YWJsZS4gIFRoaXMgaXMgdGhlIHNhbWUgdHJhY2ViYWNrIGRhdGEgdGhhdCBpcyBkaXNwbGF5ZWQgYnkgZXhjLnByaW50U3RhY2tUcmFjZSgpLgotICAgKiBAcGFyYW0gZXhjIHRoZSBleGNlcHRpb24KLSAgICogQHJldHVybiBhIHN0cmluZyBhcnJheSBvZiB0aGUgdHJhY2ViYWNrIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdGFja1RyYWNlKCBUaHJvd2FibGUgZXhjICkKLSAgewotICAgIFZlY3RvciAgICAgICBsaW5lcyAgICAgICAgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciAgcHJpbnRXcml0ZXIgID0gbmV3IFByaW50V3JpdGVyKCBzdHJpbmdXcml0ZXIgKTsKLSAgICAKLSAgICBleGMucHJpbnRTdGFja1RyYWNlKCBwcmludFdyaXRlciApOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIHByaW50V3JpdGVyLmNsb3NlKCk7Ci0gICAgICBzdHJpbmdXcml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2goIEV4Y2VwdGlvbiBuZXN0ZWRFeGMgKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlciggc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkgKTsKLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgICAgID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBzdHJpbmdSZWFkZXIgKTsKLSAgICBTdHJpbmcgICAgICAgICBsaW5lICAgICAgID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgCi0gICAgICB3aGlsZSggbGluZSAhPSBudWxsICkKLSAgICAgIHsKLSAgICAgICAgbGluZXMuYWRkKCBsaW5lLnRyaW0oKSApOwotICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gbmVzdGVkRXhjICkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIChTdHJpbmdbXSlsaW5lcy50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBVUklfU1lNQk9MUyA9IHsnLScsICd+JywgJyMnLCAnLycsICcuJ307Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVU5ERVJTQ09SRSA9ICdfJzsKLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVsaW1pdGVyKGNoYXIgY2hhcmFjdGVyKQotICB7Ci0gICAgcmV0dXJuICJcdTAwMkRcdTAwMkVcdTAwM0FcdTAwNUZcdTAwQjdcdTAzODdcdTA2RERcdTA2REUiLmluZGV4T2YoY2hhcmFjdGVyKSAhPSAtMTsKLSAgfQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9XYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tb24vV2FpdEZvckF1dG9CdWlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3MWE3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9XYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLQotcHVibGljIGNsYXNzIFdhaXRGb3JBdXRvQnVpbGRDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwdWJsaWMgU3RhdHVzIGV4ZWN1dGUoRW52aXJvbm1lbnQgZW52aXJvbm1lbnQpIAotICB7Ci0gIAlTaW1wbGVTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgCQotCXRyeSAKLQl7Ci0JICBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCX0gCi0JY2F0Y2goIEludGVycnVwdGVkRXhjZXB0aW9uIGV4YyApIAotCXsKLQkgIC8vIFVJU3luY2hyb25pemVyLnN5bmNFeGVjIHNlZW1zIHRvIGludGVycnVwdCB0aGUgVUkgdHJlYWQgd2hlbiB0aGUgYXV0b2J1aWxkZXIgaXMgZG9uZS4gIE5vdCBzdXJlLCB3aHkuCi0JICAvLyBJJ20gYXNzdW1pbmcgaGVyZSB0aGF0IHRoZSBhdXRvYnVpbGRlciBoYXMgYWN0dWFsbHkgY29tcGxldGVkIGl0cyBzdHVmZi4JCi0JfQotCQkKLQlyZXR1cm4gc3RhdHVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9jb21tb24vZW52aXJvbm1lbnQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxNjBiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbW1vbi9lbnZpcm9ubWVudC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBNZXNzYWdlcyBmb3IgRWNsaXBzZVNjaGVtZQotIwotTVNHX0lOVkFMSURfUExBVEZPUk1fVVJMPUludmFsaWQgVVJMOiB7MH0gZm9yIGFuIEVjbGlwc2UgcGxhdGZvcm0uCi0KLSMKLSMgTWVzc2FnZXMgZm9yIFJlc291Y2VVdGlscwotIwotTVNHX0VSUk9SX1BBVEhfTk9UX0FCU09MVVRFPUlXQUIwMDAzRSBQYXRoIHswfSBpcyBub3QgYWJzb2x1dGUgZm9yIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9QQVRIX0VNUFRZPUlXQUIwMDA0RSBQYXRoIHswfSBpcyBlbXB0eSB3aGlsZSBjcmVhdGluZyBhIGZpbGUuCi1NU0dfRVJST1JfUEFUSF9OT1RfRk9MREVSPUlXQUIwMDA1RSBQYXRoIHswfSBpcyBub3QgYSBmb2xkZXIgZm9yIGNyZWF0aW5nIGEgZmlsZS4KLU1TR19FUlJPUl9GT0xERVJfQ1JFQVRJT05fRElTQUJMRUQ9SVdBQjAwMDdFIEZvbGRlciBjcmVhdGlvbiBoYXMgYmVlbiBkaXNhYmxlZCBmb3IgcGFyZW50IGZvbGRlciB7MH0gYW5kIGNoaWxkIHsxfS4KLU1TR19FUlJPUl9SRVNPVVJDRV9OT1RfRk9MREVSPUlXQUIwMDA4RSBSZXNvdXJjZSB7MH0gaXMgbm90IGEgZm9sZGVyLgotTVNHX1dBUk5fRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9SVdBQjAwMDlXIENhbiBub3Qgb3ZlcndyaXRlIGZpbGUgezF9IGluIGZvbGRlciB7MH0uCi1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1JV0FCMDAxMEUgQ2FuIG5vdCBjaGVja291dCBmaWxlIHsxfSBpbiBmb2xkZXIgezB9LgotTVNHX0VSUk9SX1JFU09VUkNFX05PVF9GSUxFPUlXQUIwMDExRSBUaGUgZm9sbG93aW5nIHBhdGggaXMgbm90IGEgcmVzb3VyY2U6IHswfS4KLU1TR19FUlJPUl9GT0xERVJfSEFTX0NISUxEUkVOPUlXQUIwMDEyRSBDYW4gbm90IGNyZWF0ZSBmb2xkZXI6IHswfSB0aGF0IGFscmVhZHkgaGFzIGNoaWxkcmVuLgotTVNHX0VSUk9SX0lPPUlXQUIwMDA2RSBBbiBpbnB1dC9vdXRwdXQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UgInswfSIuCi1NU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9SVdBQjAxNjRFIENhbm5vdCBjcmVhdGUgdGhlIGZpbGUgInsxfSIgcmVsYXRpdmUgdG8gdGhlIHBhdGggInswfSIgYmVjYXVzZSBhdXRvbWF0aWMgZmlsZSBvdmVyd3JpdGluZyBoYXMgbm90IGJlZW4gZW5hYmxlZC4gRG8geW91IHdhbnQgdG8gZW5hYmxlIGl0IGZvciB0aGlzIGZpbGU/Ci1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1JV0FCMDA2MUUgQ2Fubm90IGNyZWF0ZSB0aGUgZmlsZSAiezF9IiByZWxhdGl2ZSB0byB0aGUgcGF0aCAiezB9IiBiZWNhdXNlIGF1dG9tYXRpYyBmaWxlIGNoZWNrIG91dCBoYXMgbm90IGJlZW4gZW5hYmxlZC4gRG8geW91IHdhbnQgdG8gZW5hYmxlIGl0IGZvciB0aGlzIGZpbGU/Ci0KLUxBQkVMX1lFUz1ZZXMKLUxBQkVMX1lFU19UT19BTEw9WWVzIEFsbAotTEFCRUxfQ0FOQ0VMPUNhbmNlbAotCi1USVRMRV9XQVJOSU5HPVdhcm5pbmc6Ci1USVRMRV9FUlJPUj1FcnJvcjoKLVRJVExFX0lORk89SW5mbzoKLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRhNGYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzLkFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5Ci17Ci0gIHByaXZhdGUgVmVjdG9yIHByZWZlcmVuY2VzXzsKLSAgCi0gIHByaXZhdGUgc3RhdGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkgcmVnaXN0cnlfOwotCi0gIHByaXZhdGUgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeSgpCi0gIHsKLSAgICBwcmVmZXJlbmNlc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgCi0gICAgbG9hZERpYWxvZ3NQcmVmZXJlbmNlcygpOyAgCi0gIH0KLSAgCi0gIHN0YXRpYyBwdWJsaWMgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiggcmVnaXN0cnlfID09IG51bGwgKQotICAgIHsKLSAgICAgIHJlZ2lzdHJ5XyA9IG5ldyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZWdpc3RyeV87Ci0gIH0KLSAgCi0gIC8vCi0gIHByaXZhdGUgdm9pZCBsb2FkRGlhbG9nc1ByZWZlcmVuY2VzICgpCi0gIHsKLSAgCUlFeHRlbnNpb25SZWdpc3RyeSByZWcgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZyA9IHJlZy5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoICJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSIpOwotICAgIAotICAgIGZvcihpbnQgaWR4PTA7IGlkeDxjb25maWcubGVuZ3RoOyBpZHgrKykgCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50ICAgICAgZWxlbSAgID0gY29uZmlnW2lkeF07ICAgICAKLSAgICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyA9IG5ldyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSgpOwotICAgICAgCi0gICAgICBkaWFsb2cuc2V0SWQoIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpICk7Ci0gICAgICBkaWFsb2cuc2V0TmFtZSggZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSApOwotICAgICAgZGlhbG9nLnNldEluZm9wb3AoIGVsZW0uZ2V0QXR0cmlidXRlKCJpbmZvcG9wIikgKTsKLSAgICAgIGRpYWxvZy5zZXRUb29sdGlwKCBlbGVtLmdldEF0dHJpYnV0ZSgidG9vbHRpcCIpICk7Ci0gICAgICBkaWFsb2cuc2V0Q2F0ZWdvcnkoIGVsZW0uZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpICk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBzaG93Q2hlY2tib3ggPSBlbGVtLmdldEF0dHJpYnV0ZSggInNob3djaGVja2JveCIgKTsKLSAgICAgIFN0cmluZyBhbHdheXNIaWRlICAgPSBlbGVtLmdldEF0dHJpYnV0ZSggImFsd2F5c2hpZGUiICk7Ci0gICAgICAKLSAgICAgIGRpYWxvZy5zZXRTaG93Q2hlY2tib3goIHNob3dDaGVja2JveCA9PSBudWxsID8gdHJ1ZSA6IHNob3dDaGVja2JveC5lcXVhbHMoICJ0cnVlIiApICk7Ci0gICAgICBkaWFsb2cuc2V0QWx3YXlzSGlkZSggYWx3YXlzSGlkZSA9PSBudWxsID8gZmFsc2UgOiBhbHdheXNIaWRlLmVxdWFscyggInRydWUiICkgKTsKLSAgICAgIAotICAgICAgcHJlZmVyZW5jZXNfLmFkZChkaWFsb2cpOyAgICAgICAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCA8Y29kZT5XZWJTZXJ2aWNlVHlwZTwvY29kZT4gb2JqZWN0cy4KLSAgKiBAcmV0dXJuIEFsbCByZWdpc3RlcmVkIDxjb2RlPldlYlNlcnZpY2VUeXBlPC9jb2RlPiBvYmplY3RzLgotICAqLwotICBwdWJsaWMgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBnZXRBY3Rpb25EaWFsb2dzUHJlZnJlbmNlcyAoKQotICB7Ci0gICAgcmV0dXJuIChBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVtdKXByZWZlcmVuY2VzXy50b0FycmF5KCBuZXcgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbMF0pOwotICB9Ci0gIAotICBwdWJsaWMgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgZ2V0QWN0aW9uRGlhbG9nc1ByZWZyZW5jZSggU3RyaW5nIGlkICkKLSAgewotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHByZWZlcmVuY2VzXy5zaXplKCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgcmVzdWx0ID0gbnVsbDsKLSAgICAKLSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkKLSAgICB7Ci0gICAgICBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBwcmVmZXJlbmNlID0gKEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlKXByZWZlcmVuY2VzXy5lbGVtZW50QXQoIGluZGV4ICk7Ci0gICAgICAKLSAgICAgIGlmKCBwcmVmZXJlbmNlLmdldElkKCkuZXF1YWxzKCBpZCApICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcHJlZmVyZW5jZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlMjY2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnBsdWdpbi5FbnZQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnByZWZlcmVuY2VzLkFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgZXh0ZW5kcyBQZXJzaXN0ZW50Q29udGV4dAotewotICBwcml2YXRlIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlUmVnaXN0cnkgcmVnaXN0cnk7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQgaW5zdGFuY2VfID0gbnVsbDsKLQotICBwcml2YXRlIFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCgpCi0gIHsKLSAgICBzdXBlcihFbnZQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0gIH0KLSAgCi0gIHN0YXRpYyBwdWJsaWMgUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmKCBpbnN0YW5jZV8gPT0gbnVsbCApCi0gICAgewotICAgICAgaW5zdGFuY2VfID0gbmV3IFBlcnNpc3RlbnRBY3Rpb25EaWFsb2dzQ29udGV4dCgpOwotICAgICAgaW5zdGFuY2VfLmxvYWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvYWQoKQotICB7Ci0gICAgcmVnaXN0cnkgPSBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBkaWFsb2dzID0gcmVnaXN0cnkuZ2V0QWN0aW9uRGlhbG9nc1ByZWZyZW5jZXMoKTsKLSAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHNldERlZmF1bHQoZGlhbG9nc1tpXS5nZXRJZCgpLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlW10gZ2V0RGlhbG9ncygpCi0gIHsKLSAgICByZXR1cm4gcmVnaXN0cnkuZ2V0QWN0aW9uRGlhbG9nc1ByZWZyZW5jZXMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGlvbkRpYWxvZ0VuYWJsZWQoU3RyaW5nIGlkLCBib29sZWFuIHZhbHVlKQotICB7Ci0gICAgc2V0VmFsdWUoaWQsIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQWN0aW9uRGlhbG9nRW5hYmxlZChTdHJpbmcgaWQpCi0gIHsKLSAgICBpZiAoaWQgPT0gbnVsbCkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKGlkKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZyggU3RyaW5nIGlkICkKLSAgewotICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyA9IHJlZ2lzdHJ5LmdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2UoIGlkICk7ICAgIAotICAgCi0gICAgcmV0dXJuIChkaWFsb2cuZ2V0U2hvd0NoZWNrYm94KCkgJiYgIWRpYWxvZy5nZXRBbHdheXNIaWRlKCkgJiYgIWlzQWN0aW9uRGlhbG9nRW5hYmxlZCggaWQgKSkgfHwKLSAgICAgICAgICAgICFkaWFsb2cuZ2V0U2hvd0NoZWNrYm94KCkgJiYgIWRpYWxvZy5nZXRBbHdheXNIaWRlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNob3dDaGVja2JveCggU3RyaW5nIGlkICkKLSAgewotICAgIEFjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlIGRpYWxvZyA9IHJlZ2lzdHJ5LmdldEFjdGlvbkRpYWxvZ3NQcmVmcmVuY2UoIGlkICk7ICAgIAotICAgIAotICAgIHJldHVybiBkaWFsb2cgPT0gbnVsbCA/IGZhbHNlIDogZGlhbG9nLmdldFNob3dDaGVja2JveCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvUGVyc2lzdGVudENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmYyZDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb250ZXh0LkNvbnRleHQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGFzIHRoZSBiYXNlIGNsYXNzIGZvciB0eXBlcyB0aGF0IHdoYXQgdG8gcGVyc2lzdCBwcmVmZXJlbmNlCi0gKiBkYXRhIGluIHRoZSBwbHVnaW4gcHJlZmVyZW5jZXMgYXJlYS4KLSAqCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBDb250ZXh0Ci17Ci0gcHJvdGVjdGVkIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzXzsKLSBwcm90ZWN0ZWQgUGx1Z2luIHBsdWdpbl87Ci0KLSBwdWJsaWMgUGVyc2lzdGVudENvbnRleHQgKCBQbHVnaW4gcGx1Z2luKQotIAl7Ci0gCQlwbHVnaW5fID0gcGx1Z2luOwotIAkgIAlwcmVmZXJlbmNlc18gPSBwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLSAJfQotCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgYSBib29sZWFuIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0RGVmYXVsdCAoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLSAJcHJlZmVyZW5jZXNfLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotIAl9Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0IChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0gCXByZWZlcmVuY2VzXy5zZXREZWZhdWx0KG5hbWUsdmFsdWUpOwotIAl9Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCBmb3IgYSBpbnQgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0IChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0gCXByZWZlcmVuY2VzXy5zZXREZWZhdWx0KG5hbWUsdmFsdWUpOwotIAl9Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0VmFsdWUgKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAJcHJlZmVyZW5jZXNfLnNldFZhbHVlKG5hbWUsdmFsdWUpOwotIAlwbHVnaW5fLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotIAl9Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgYm9vbGVhbiBwcmVmZXJlbmNlLgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotIHB1YmxpYyB2b2lkIHNldFZhbHVlIChTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotIAlwcmVmZXJlbmNlc18uc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotIAlwbHVnaW5fLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotIAl9Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgaW50IHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcGFyYW0gdmFsdWUgdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIHZvaWQgc2V0VmFsdWUgKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAJcHJlZmVyZW5jZXNfLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAJcGx1Z2luXy5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLSAvKioKLSAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBzdHJpbmcgcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nICggU3RyaW5nIG5hbWUpIHsKLSAJcmV0dXJuIHByZWZlcmVuY2VzXy5nZXRTdHJpbmcobmFtZSk7Ci0gCX0KLSAKLSAvKioKLSAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgYSBib29sZWFuIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZUFzQm9vbGVhbiAoIFN0cmluZyBuYW1lKSB7Ci0gCXJldHVybiBwcmVmZXJlbmNlc18uZ2V0Qm9vbGVhbihuYW1lKTsKLSAJfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlIHZhbHVlIGZvciBhIGludCBwcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlLgotICAgKi8KLSBwdWJsaWMgaW50IGdldFZhbHVlQXNJbnQoIFN0cmluZyBuYW1lKSB7Ci0gCQlyZXR1cm4gcHJlZmVyZW5jZXNfLmdldEludChuYW1lKTsKLSAJfQotIAotIC8qKgotICAqIEdldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgc3RyaW5nIHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKQotIHsKLSAJcmV0dXJuIHByZWZlcmVuY2VzXy5nZXREZWZhdWx0U3RyaW5nKG5hbWUpOwotIH0KLSAKLSAvKioKLSAgKiBHZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGJvb2xlYW4gcHJlZmVyZW5jZS4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZS4KLSAgKi8KLSBwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkKLSB7Ci0gCXJldHVybiBwcmVmZXJlbmNlc18uZ2V0RGVmYXVsdEJvb2xlYW4obmFtZSk7Ci0gfQotIAotIC8qKgotICAqIEdldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgaW50IHByZWZlcmVuY2UuCi0gICogQHBhcmFtIG5hbWUgdGhlIHByZWZlcmVuY2UgbmFtZS4KLSAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWUuCi0gICovCi0gcHVibGljIGludCBnZXREZWZhdWx0SW50KFN0cmluZyBuYW1lKQotIHsKLSAJcmV0dXJuIHByZWZlcmVuY2VzXy5nZXREZWZhdWx0SW50KG5hbWUpOwotIH0KLSAKLSAvKioKLSAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIHN0cmluZyBwcmVmZXJlbmNlIGlmIGEgZGVmYXVsdCB2YWx1ZSBoYXMKLSAgKiBub3QgYWxyZWFkeSBiZWVuIHNldC4KLSAgKiBAcGFyYW0gbmFtZSB0aGUgcHJlZmVyZW5jZSBuYW1lLgotICAqIEBwYXJhbSB2YWx1ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlCi0gICovCi0gcHVibGljIHZvaWQgc2V0RGVmYXVsdFN0cmluZ0lmTm9EZWZhdWx0KCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUgKQotIHsKLSAgIC8vIElmIHRoZSBrZXkgYWxyZWFkeSBoYXMgYSBkZWZhdWx0IHZhbHVlIHdlIGRvbid0IHdhbnQgdG8gb3ZlcnJpZGUgaXQuCi0gICBpZiggcHJlZmVyZW5jZXNfLmdldERlZmF1bHRTdHJpbmcoIGtleSApLmVxdWFscygiIikgKSAKLSAgIHsKLSAgICAgcHJlZmVyZW5jZXNfLnNldERlZmF1bHQoIGtleSwgdmFsdWUgKTsKLSAgIH0KLSB9Ci0gCi0gLyoqCi0gICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBib29sZWFuIHByZWZlcmVuY2UgaWYgYSBkZWZhdWx0IHZhbHVlIGhhcwotICAqIG5vdCBhbHJlYWR5IGJlZW4gc2V0LgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWUKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0Qm9vbGVhbklmTm9EZWZhdWx0KCBTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlICkKLSB7Ci0gICAvLyBJZiB0aGUga2V5IGFscmVhZHkgaGFzIGEgZGVmYXVsdCB2YWx1ZSB3ZSBkb24ndCB3YW50IHRvIG92ZXJyaWRlIGl0LgotICAgaWYoIHByZWZlcmVuY2VzXy5nZXREZWZhdWx0U3RyaW5nKCBrZXkgKS5lcXVhbHMoIiIpICkgCi0gICB7Ci0gICAgIHByZWZlcmVuY2VzXy5zZXREZWZhdWx0KCBrZXksIHZhbHVlICk7Ci0gICB9Ci0gfQotIAotIC8qKgotICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgaW50IHByZWZlcmVuY2UgaWYgYSBkZWZhdWx0IHZhbHVlIGhhcwotICAqIG5vdCBhbHJlYWR5IGJlZW4gc2V0LgotICAqIEBwYXJhbSBuYW1lIHRoZSBwcmVmZXJlbmNlIG5hbWUuCi0gICogQHBhcmFtIHZhbHVlIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWUKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXREZWZhdWx0SW50SWZOb0RlZmF1bHQoIFN0cmluZyBrZXksIGludCB2YWx1ZSApCi0gewotICAgLy8gSWYgdGhlIGtleSBhbHJlYWR5IGhhcyBhIGRlZmF1bHQgdmFsdWUgd2UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZSBpdC4KLSAgIGlmKCBwcmVmZXJlbmNlc18uZ2V0RGVmYXVsdFN0cmluZygga2V5ICkuZXF1YWxzKCIiKSApIAotICAgewotICAgICBwcmVmZXJlbmNlc18uc2V0RGVmYXVsdCgga2V5LCB2YWx1ZSApOwotICAgfQotIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2NvbnRleHQvUGVyc2lzdGVudFJlc291cmNlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBhMzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvY29udGV4dC9QZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnBsdWdpbi5FbnZQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZURlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuVHJhbnNpZW50UmVzb3VyY2VDb250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50UmVzb3VyY2VDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBSZXNvdXJjZUNvbnRleHQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCBjb250ZXh0XyA9IG51bGw7Ci0gIAotICBwdWJsaWMgc3RhdGljIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYoIGNvbnRleHRfID09IG51bGwgKQotICAgIHsKLSAgICAgIGNvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICAgIGNvbnRleHRfLmxvYWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGNvbnRleHRfOwotICB9Ci0gIAotICBwcml2YXRlIFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQoKQotICB7Ci0gICAgc3VwZXIoRW52UGx1Z2luLmdldEluc3RhbmNlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbG9hZCgpCi0gIHsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfT1ZFUldSSVRFLCBSZXNvdXJjZURlZmF1bHRzCi0gICAgICAgIC5nZXRPdmVyd3JpdGVGaWxlc0RlZmF1bHQoKSk7Ci0gICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NSRUFURV9GT0xERVJTLCBSZXNvdXJjZURlZmF1bHRzCi0gICAgICAgIC5nZXRDcmVhdGVGb2xkZXJzRGVmYXVsdCgpKTsKLSAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfQ0hFQ0tPVVQsIFJlc291cmNlRGVmYXVsdHMuZ2V0Q2hlY2tvdXRGaWxlc0RlZmF1bHQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQoYm9vbGVhbiBlbmFibGUpCi0gIHsKLSAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX09WRVJXUklURSwgZW5hYmxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX09WRVJXUklURSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDcmVhdGVGb2xkZXJzRW5hYmxlZChib29sZWFuIGVuYWJsZSkKLSAgewotICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1JFQVRFX0ZPTERFUlMsIGVuYWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NyZWF0ZUZvbGRlcnNFbmFibGVkKCkKLSAgewotICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0NSRUFURV9GT0xERVJTKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENoZWNrb3V0RmlsZXNFbmFibGVkKGJvb2xlYW4gZW5hYmxlKQotICB7Ci0gICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9DSEVDS09VVCwgZW5hYmxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQ0hFQ0tPVVQpOwotICB9Ci0KLSAgcHVibGljIFJlc291cmNlQ29udGV4dCBjb3B5KCkKLSAgewotICAgIFJlc291cmNlQ29udGV4dCBjYyA9IG5ldyBUcmFuc2llbnRSZXNvdXJjZUNvbnRleHQoKTsKLSAgICBjYy5zZXRPdmVyd3JpdGVGaWxlc0VuYWJsZWQoaXNPdmVyd3JpdGVGaWxlc0VuYWJsZWQoKSk7Ci0gICAgY2Muc2V0Q3JlYXRlRm9sZGVyc0VuYWJsZWQoaXNDcmVhdGVGb2xkZXJzRW5hYmxlZCgpKTsKLSAgICBjYy5zZXRDaGVja291dEZpbGVzRW5hYmxlZChpc0NoZWNrb3V0RmlsZXNFbmFibGVkKCkpOwotICAgIHJldHVybiBjYzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9lY2xpcHNlL0Jhc2VFY2xpcHNlRW52aXJvbm1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvZWNsaXBzZS9CYXNlRWNsaXBzZUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZTdmMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9lY2xpcHNlL0Jhc2VFY2xpcHNlRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhZGRzIHJlc291cmNlcyB0byB0aGUgYmFzZSBFbnZpcm9ubWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlRWNsaXBzZUVudmlyb25tZW50IGV4dGVuZHMgRW52aXJvbm1lbnQgCi17Ci0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIGEgUmVzb3VyY2VDb250ZXh0IG9iamVjdCBmb3IgdGhpcyBlbnZpcm9ubWVudC4KLSAgICovCQotICBwdWJsaWMgUmVzb3VyY2VDb250ZXh0IGdldFJlc291cmNlQ29udGV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvZWNsaXBzZS9Db25zb2xlRWNsaXBzZUVudmlyb25tZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ODgwYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9lY2xpcHNlL0NvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUudXJpLmZpbGUuRmlsZVNjaGVtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5Db21tYW5kTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uSmF2YUNvbXBpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk51bGxTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Qcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29udGV4dC5SZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlNpbXBsZVVSSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGluIGEgaGVhZGxlc3MgRWNsaXBzZSBlbnZpcm9ubWVudC4gIAotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZUVjbGlwc2VFbnZpcm9ubWVudCBpbXBsZW1lbnRzIEJhc2VFY2xpcHNlRW52aXJvbm1lbnQKLXsKLQlwcml2YXRlIENvbW1hbmRNYW5hZ2VyICAgY29tbWFuZE1hbmFnZXJfICA9IG51bGw7Ci0JcHJpdmF0ZSBTaW1wbGVVUklGYWN0b3J5IHVyaUZhY3RvcnlfICAgICAgPSBudWxsOwotCXByaXZhdGUgUmVzb3VyY2VDb250ZXh0ICByZXNvdXJjZUNvbnRleHRfID0gbnVsbDsKLQlwcml2YXRlIFByb2dyZXNzTW9uaXRvciAgbW9uaXRvcl8gICAgICAgICA9IG51bGw7Ci0JcHJpdmF0ZSBTdGF0dXNIYW5kbGVyICAgIHN0YXR1c0hhbmRsZXJfICAgPSBudWxsOwotCSAgCi0JcHVibGljIENvbnNvbGVFY2xpcHNlRW52aXJvbm1lbnQoIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQgKQotCXsKLQkgIHRoaXMoIG51bGwsIHJlc291cmNlQ29udGV4dCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbmV3IE51bGxTdGF0dXNIYW5kbGVyKCkgKTsJCi0JfQotCQotCXB1YmxpYyBDb25zb2xlRWNsaXBzZUVudmlyb25tZW50KCBDb21tYW5kTWFuYWdlciAgY29tbWFuZE1hbmFnZXIsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAotCQkJICAgIAkgICAgICAgICAgICAgICAgICBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJICAgICAgICAgICAgICAgICAgU3RhdHVzSGFuZGxlciAgIHN0YXR1c0hhbmRsZXIgKQotCXsKLQkgIGNvbW1hbmRNYW5hZ2VyXyAgPSBjb21tYW5kTWFuYWdlcjsKLQkgIHJlc291cmNlQ29udGV4dF8gPSByZXNvdXJjZUNvbnRleHQ7Ci0JICB1cmlGYWN0b3J5XyAgICAgID0gbmV3IFNpbXBsZVVSSUZhY3RvcnkoKTsKLQkgIG1vbml0b3JfICAgICAgICAgPSBtb25pdG9yOwotCSAgc3RhdHVzSGFuZGxlcl8gICA9IHN0YXR1c0hhbmRsZXI7Ci0JICAgIAotCSAgdXJpRmFjdG9yeV8ucmVnaXN0ZXJTY2hlbWUoICJwbGF0Zm9ybSIsIG5ldyBFY2xpcHNlU2NoZW1lKCB0aGlzICkgKTsKLQkgIHVyaUZhY3RvcnlfLnJlZ2lzdGVyU2NoZW1lKCAiZmlsZSIsIG5ldyBGaWxlU2NoZW1lKCkgKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5CYXNlRWNsaXBzZUVudmlyb25tZW50I2dldFJlc291cmNlQ29udGV4dCgpCi0JICovCi0JcHVibGljIFJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKSAKLQl7Ci0JCXJldHVybiByZXNvdXJjZUNvbnRleHRfOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0Q29tbWFuZE1hbmFnZXIoKQotCSAqLwotCXB1YmxpYyBDb21tYW5kTWFuYWdlciBnZXRDb21tYW5kTWFuYWdlcigpIAotCXsKLQkJcmV0dXJuIGNvbW1hbmRNYW5hZ2VyXzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50I2dldEphdmFDb21waWxlcigpCi0JICovCi0JcHVibGljIEphdmFDb21waWxlciBnZXRKYXZhQ29tcGlsZXIoKSAKLQl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQjZ2V0TG9nKCkKLQkgKi8KLQlwdWJsaWMgTG9nIGdldExvZygpIAotCXsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTG9nKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRQcm9ncmVzc01vbml0b3IoKQotCSAqLwotCXB1YmxpYyBQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgCi0JewotCQlyZXR1cm4gbW9uaXRvcl87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRTdGF0dXNIYW5kbGVyKCkKLQkgKi8KLQlwdWJsaWMgU3RhdHVzSGFuZGxlciBnZXRTdGF0dXNIYW5kbGVyKCkgCi0JewotCQlyZXR1cm4gc3RhdHVzSGFuZGxlcl87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudCNnZXRVUklGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgVVJJRmFjdG9yeSBnZXRVUklGYWN0b3J5KCkgCi0JewotCQlyZXR1cm4gdXJpRmFjdG9yeV87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9lY2xpcHNlL0VjbGlwc2VMb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvZWNsaXBzZS9FY2xpcHNlTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOGRmZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9lY2xpcHNlL0VjbGlwc2VMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wbHVnaW4uRW52UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMb2cgaW1wbGVtZW50cyBMb2cgCi17Ci0vLwlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JcHVibGljIEVjbGlwc2VMb2coKSB7Ci0JCS8qCi0JCWxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoIm9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiIpOwotCQkvLyBsb2dnZXIuc2V0TG9nRmlsZU5hbWUoImVudi5sb2ciKTsKLQkJbG9nZ2VyLnNldExldmVsKExldmVsLklORk8pOyAvLyBsb2cgYWxsIGxldmVscyBmb3Igbm93Ci0JCSovCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZyNpc0VuYWJsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIEVudlBsdWdpbi5nZXRJbnN0YW5jZSgpLmlzRGVidWdnaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZyNpc0VuYWJsZWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoU3RyaW5nIG9wdGlvbikgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3RyYWNlLyIKLQkJCQkrIG9wdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgT2JqZWN0IG9iamVjdCkgewotCQkKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlzd2l0Y2ggKHNldmVyaXR5KSB7Ci0JCQkJY2FzZSBMb2cuRVJST1IgOgotCQkJCQlpZiAoaXNFbmFibGVkKCJlcnJvciIpKQotLy8JCQkJCQlsb2dnZXIKLS8vCQkJCQkJCQkubG9nRXJyb3IoZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJFICIKLS8vCQkJCQkJCQkJCSsgY2FsbGVyICsgIjo6IiArIG1ldGhvZCArICI6IG9iamVjdD0iCi0vLwkJCQkJCQkJCQkrIG9iamVjdCk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJFICIKLQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IgotCQkJCQkJCSsgb2JqZWN0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMb2cuV0FSTklORyA6Ci0JCQkJCWlmIChpc0VuYWJsZWQoIndhcm5pbmciKSkKLS8vCQkJCQkJbG9nZ2VyCi0vLwkJCQkJCQkJLmxvZ1dhcm5pbmcoZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKQotLy8JCQkJCQkJCQkJKyAiVyAiICsgY2FsbGVyICsgIjo6IiArIG1ldGhvZAotLy8JCQkJCQkJCQkJKyAiOiBvYmplY3Q9IiArIG9iamVjdCk7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKQotCQkJCQkJCQkrICJXICIgKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kCi0JCQkJCQkJCSsgIjogb2JqZWN0PSIgKyBvYmplY3QpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExvZy5JTkZPIDoKLQkJCQkJaWYgKGlzRW5hYmxlZCgiaW5mbyIpKQotLy8JCQkJCQlsb2dnZXIKLS8vCQkJCQkJCQkubG9nSW5mbyhnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIgotLy8JCQkJCQkJCQkJKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIKLS8vCQkJCQkJCQkJCSsgb2JqZWN0KTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIkkgIgotCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QgKyAiOiBvYmplY3Q9IgotCQkJCQkJCQkrIG9iamVjdCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBtZXNzYWdlTnVtLCBPYmplY3QgY2FsbGVyLAotCQkJU3RyaW5nIG1ldGhvZCwgU3RhdHVzIHN0YXR1cykgewotCQlsb2coc2V2ZXJpdHksIG1lc3NhZ2VOdW0sIGNhbGxlciwgbWV0aG9kLCAoT2JqZWN0KXN0YXR1cyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZyNsb2coaW50LCBpbnQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5UaHJvd2FibGUpCi0JICovCi0JcHVibGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IG1lc3NhZ2VOdW0sIE9iamVjdCBjYWxsZXIsCi0JCQlTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyggc2V2ZXJpdHksIG1lc3NhZ2VOdW0sIGNhbGxlciwgbWV0aG9kLCAoT2JqZWN0KW51bGwgKTsKLQkJdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOwotCQkvKgotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCQljYXNlIExvZy5FUlJPUiA6Ci0JCQkJCWlmIChpc0VuYWJsZWQoImVycm9yIikpCi0JCQkJCQlsb2dnZXIubG9nRXJyb3IoZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJFICIKLQkJCQkJCQkJKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kKTsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKHRocm93YWJsZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTG9nLldBUk5JTkcgOgotCQkJCQlpZiAoaXNFbmFibGVkKCJ3YXJuaW5nIikpCi0JCQkJCQlsb2dnZXIubG9nV2FybmluZyhnZXRNZXNzYWdlTnVtU3RyaW5nKG1lc3NhZ2VOdW0pICsgIlcgIgotCQkJCQkJCQkrIGNhbGxlciArICI6OiIgKyBtZXRob2QpOwotCQkJCQlsb2dnZXIubG9nV2FybmluZyh0aHJvd2FibGUpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIExvZy5JTkZPIDoKLQkJCQkJaWYgKGlzRW5hYmxlZCgiaW5mbyIpKQotCQkJCQkJbG9nZ2VyLmxvZ0luZm8oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIKLQkJCQkJCQkJKyBjYWxsZXIgKyAiOjoiICsgbWV0aG9kKTsKLQkJCQkJbG9nZ2VyLmxvZ0luZm8odGhyb3dhYmxlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJKi8KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIE9iamVjdCBvYmplY3QpIHsKLQkJLyoKLQkJaWYgKGlzRW5hYmxlZChvcHRpb24pKQotCQkJbG9nZ2VyLmxvZ0luZm8oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgKyBjYWxsZXIKLQkJCQkJKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIgKyBvYmplY3QpOwotCQkqLwotCQlpZiAoaXNFbmFibGVkKG9wdGlvbikpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TWVzc2FnZU51bVN0cmluZyhtZXNzYWdlTnVtKSArICJJICIgKyBjYWxsZXIKLQkJCQkJKyAiOjoiICsgbWV0aG9kICsgIjogb2JqZWN0PSIgKyBvYmplY3QpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5Mb2cjbG9nKGludCwgamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuVGhyb3dhYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIFN0cmluZyBvcHRpb24sIGludCBtZXNzYWdlTnVtLAotCQkJT2JqZWN0IGNhbGxlciwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQkvKgotCQlpZiAoaXNFbmFibGVkKG9wdGlvbikpIHsKLQkJCWxvZ2dlci5sb2dJbmZvKGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiICsgY2FsbGVyCi0JCQkJCSsgIjo6IiArIG1ldGhvZCk7Ci0JCQlsb2dnZXIubG9nSW5mbyh0aHJvd2FibGUpOwotCQl9Ci0JCSovCi0JCWlmIChpc0VuYWJsZWQob3B0aW9uKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldE1lc3NhZ2VOdW1TdHJpbmcobWVzc2FnZU51bSkgKyAiSSAiICsgY2FsbGVyCi0JCQkJCSsgIjo6IiArIG1ldGhvZCk7Ci0JCQl0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTG9nI2xvZyhpbnQsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1cykKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBTdHJpbmcgb3B0aW9uLCBpbnQgbWVzc2FnZU51bSwKLQkJCU9iamVjdCBjYWxsZXIsIFN0cmluZyBtZXRob2QsIFN0YXR1cyBzdGF0dXMpIHsKLQkJbG9nKHNldmVyaXR5LCBvcHRpb24sIG1lc3NhZ2VOdW0sIGNhbGxlciwgbWV0aG9kLCAoT2JqZWN0KXN0YXR1cyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2VOdW1TdHJpbmcoaW50IG1lc3NhZ2VOdW0pIHsKLQkJU3RyaW5nIG1lc3NhZ2VOdW1TdHJpbmcgPSAiSVdBQiI7Ci0JCWlmIChtZXNzYWdlTnVtID4gOTk5OSB8fCBtZXNzYWdlTnVtIDwgMCkKLQkJCW1lc3NhZ2VOdW0gPSA5OTk5OyAvL2RlZmF1bHQgbWVzc2FnZSBudW1iZXIKLQkJbWVzc2FnZU51bVN0cmluZyArPSAobmV3IEludGVnZXIobWVzc2FnZU51bSkpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBtZXNzYWdlTnVtU3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2VjbGlwc2UvRWNsaXBzZVNjaGVtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjVmNzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvZWNsaXBzZS9FY2xpcHNlU2NoZW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlJlbGF0aXZlVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuVVJJU2NoZW1lOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlU2NoZW1lIGltcGxlbWVudHMgVVJJU2NoZW1lCi17Ci0gIHByaXZhdGUgQmFzZUVjbGlwc2VFbnZpcm9ubWVudCAgZW52aXJvbm1lbnRfOwotICBwcml2YXRlIE1lc3NhZ2VVdGlscyAgICAgICAgICAgIG1zZ187Ci0gIAotICBwdWJsaWMgRWNsaXBzZVNjaGVtZSggQmFzZUVjbGlwc2VFbnZpcm9ubWVudCBlbnZpcm9ubWVudCApCi0gIHsKLSAgICBlbnZpcm9ubWVudF8gPSBlbnZpcm9ubWVudDsKLSAgICBtc2dfICAgICAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5lbnZpcm9ubWVudCIsIHRoaXMgKTsKLSAgfQotICAKLSAgLyoqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0hpZXJhcmNoaWNhbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChVUkkgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIAotICAgIGlmKCB1cmkgPT0gbnVsbCApIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICovCi0gIHB1YmxpYyBVUkkgbmV3VVJJKFN0cmluZyB1cmkpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBuZXdVUkkgPSBudWxsOwotICAgIAotICAgIGlmKCB1cmkuc3RhcnRzV2l0aCggInBsYXRmb3JtOi9yZXNvdXJjZSIpICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gaGFzIGJlZW4gc3BlY2lmaWVkIHNvIGtlZXAgaXQgYXMgaXMuCi0gICAgICBuZXdVUkkgPSB1cmk7Ci0gICAgfQotICAgIGVsc2UgaWYoIHVyaS5pbmRleE9mKCAiOiIpICE9IC0xICkKLSAgICB7Ci0gICAgICAvLyBUaGUgcGxhdGZvcm0gdXJpIGlzIG5vdCBhbGxvd2VkIHRvIGNvbnRhaW4gc29tZSBvdGhlciBwcm90b2NvbC4gCi0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlU2NoZW1lIiwKLSAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCJNU0dfSU5WQUxJRF9QTEFURk9STV9VUkwiLCBuZXcgT2JqZWN0W117dXJpfSksCi0gICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApICk7Ci0gICAgIH0KLSAgICBlbHNlIGlmKCB1cmkuc3RhcnRzV2l0aCggIi8iKSApCi0gICAgewotICAgICAgLy8gVGhlIHBsYXRmb3JtIHNjaGVtZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkIHNvIHdlIHdpbGwgYWRkIGl0LgotICAgICAgbmV3VVJJID0gInBsYXRmb3JtOi9yZXNvdXJjZSIgKyB1cmk7Ci0gICAgfQotICAgIAotICAgIGlmKCBuZXdVUkkgPT0gbnVsbCApCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBSZWxhdGl2ZVVSSSggdXJpICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEVjbGlwc2VVUkkoIG5ld1VSSSwgZW52aXJvbm1lbnRfICk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShVUkkgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJKCB1cmkudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgVVJJIG5ld1VSSShVUkwgdXJsKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VVJJKCB1cmwudG9TdHJpbmcoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqLwotICBwdWJsaWMgU3RhdHVzIHZhbGlkYXRlKFVSSSB1cmkpCi0gIHsKLSAgICBTdGF0dXMgc3RhdHVzID0gbnVsbDsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmkudG9TdHJpbmcoKSApOwotICAgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyggIiIgKTsKLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIHN0YXR1cyA9IGV4Yy5nZXRTdGF0dXMoKTsgCi0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0dXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXRzIHRoZSAicGxhdGZvcm06L3Jlc291cmNlIiBJUGF0aCBnaXZlbiBhIHVybAotICAgKiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aEZyb21QbGF0Zm9ybVVSSShTdHJpbmcgdXJpKSB0aHJvd3MgVVJJRXhjZXB0aW9uIAotICB7Ci0gICAgU3RyaW5nIHJlc291cmNlRmlsZSA9IG51bGw7Ci0gICAgVVJMICAgIHVybCAgICAgICAgICA9IG51bGw7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgdXJsID0gbmV3IFVSTCggdXJpICk7IAotICAgIH0KLSAgICBjYXRjaCggTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4YyApCi0gICAgeyAKLSAgICB9Ci0gICAgCi0gICAgaWYoIHVybCA9PSBudWxsICkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlU2NoZW1lIiwKLSAgICAgICAgICAgICAgbXNnXy5nZXRNZXNzYWdlKCJNU0dfSU5WQUxJRF9QTEFURk9STV9VUkwiLCBuZXcgT2JqZWN0W117dXJpfSksCi0gICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApICk7Ci0gICAgfQotICAgIGlmKCB1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikgKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzb3VyY2VVUkwgPSB1cmwuZ2V0RmlsZSgpOwotICAgICAgCi0gICAgICBpZiAocmVzb3VyY2VVUkwuc3RhcnRzV2l0aCgiL3Jlc291cmNlIikpIAotICAgICAgewotICAgICAgICByZXNvdXJjZUZpbGUgPSByZXNvdXJjZVVSTC5zdWJzdHJpbmcoMTApOyAgIC8vIG9taXQgdGhlICIvcmVzb3VyY2UiIHBvcnRpb24KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlU2NoZW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dfLmdldE1lc3NhZ2UoIk1TR19JTlZBTElEX1BMQVRGT1JNX1VSTCIsIG5ldyBPYmplY3RbXXt1cmwuZ2V0RmlsZSgpfSksCi0JCQkJCQkJU3RhdHVzLkVSUk9SICkgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc291cmNlRmlsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gYWJzb2x1dGVQYXRoIGFuIGFic29sdXRlIElQYXRoCi0gICAqIEByZXR1cm4gcmV0dXJucyB0aGUgcGxhdGZvcm0gVVJJIGZvciB0aGlzIHBhdGguCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSTEZyb21QYXRoKCBJUGF0aCBhYnNvbHV0ZVBhdGggKQotICB7Ci0gICAgcmV0dXJuICJwbGF0Zm9ybTovcmVzb3VyY2UiICsgYWJzb2x1dGVQYXRoOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2VjbGlwc2UvRWNsaXBzZVVSSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9lY2xpcHNlL0VjbGlwc2VVUkkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2ZDg0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L2VjbGlwc2UvRWNsaXBzZVVSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRmlsZVJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLk1lc3NhZ2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlJlbGF0aXZlVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuVVJJRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5VUklTY2hlbWU7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VVUkkgZXh0ZW5kcyBSZWxhdGl2ZVVSSQotewotICBwcml2YXRlIEJhc2VFY2xpcHNlRW52aXJvbm1lbnQgZW52aXJvbm1lbnRfOwotICBwcml2YXRlIEVjbGlwc2VTY2hlbWUgICAgICAgICAgc2NoZW1lXzsKLSAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgICAgICAgICAgIG1zZ187Ci0gIHByaXZhdGUgRmlsZSAgICAgICAgICAgICAgICAgICBmaWxlXzsKLSAgCi0gIHB1YmxpYyBFY2xpcHNlVVJJKCBTdHJpbmcgdXJpLCBCYXNlRWNsaXBzZUVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotICAgIHN1cGVyKCB1cmkgKTsKLSAgICAKLSAgICBlbnZpcm9ubWVudF8gID0gZW52aXJvbm1lbnQ7Ci0gICAgc2NoZW1lXyAgICAgICA9IG5ldyBFY2xpcHNlU2NoZW1lKCBlbnZpcm9ubWVudCApOwotICAgIG1zZ18gICAgICAgICAgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbW1vbi5lbnZpcm9ubWVudCIsIHRoaXMgKTsKLSAgICBmaWxlXyAgICAgICAgID0gZ2V0RmlsZSgpOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2VyYXNlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5IAotICAgIHsKLSAgICAgIElSZXNvdXJjZSBmaWxlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICkgCi0gICAgICB7Ci0gICAgICAgIGlmKCBmaWxlIGluc3RhbmNlb2YgSUZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVJlc291cmNlVXRpbHMuZGVsZXRlRmlsZSggZW52aXJvbm1lbnRfLmdldFJlc291cmNlQ29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRmlsZSlmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRQcm9ncmVzc01vbml0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0U3RhdHVzSGFuZGxlcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggZmlsZSBpbnN0YW5jZW9mIElGb2xkZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZVJlc291cmNlVXRpbHMuZGVsZXRlRm9sZGVyKCBlbnZpcm9ubWVudF8uZ2V0UmVzb3VyY2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSUZvbGRlcilmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFByb2dyZXNzTW9uaXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOyAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgfQotICAgIGNhdGNoKCBFeGNlcHRpb24gZXhjICkgCi0gICAgeyAgICAgIAotICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbigKLSAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiRWNsaXBzZVVSSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLmdldE1lc3NhZ2UoKSwKLQkJICAgICAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IsCi0JCQkgICAgICAgICAgICAgICAgZXhjICksIAotICAgICAgICAgIHRoaXMgKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRJbnB1dFN0cmVhbSgpCi0gICAqLwotICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgCi0gICAgewotICAgICAgLy8gSWYgYSBjbGFzcyBjYXN0IGV4Y2VwdGlvbiBpcyB0aHJvdyBpdCB3aWxsIGJlIHByb3BvZ2F0ZWQgYXMKLSAgICAgIC8vIGEgVVJJRXhjZXB0aW9uLgotICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSlnZXRSZXNvdXJjZSgpOwotCi0gICAgICAvL2NhbGwgZ2V0Q29udGVudHMgb24gdGhlIGVjbGlwc2UgRmlsZSBvYmplY3QKLSAgICAgIGlmKCBmaWxlICE9IG51bGwgKSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZ2V0Q29udGVudHMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFRocm93YWJsZSBleGMgKSAKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlVVJJIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMuZ2V0TWVzc2FnZSgpLAotCQkJCQkJCVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlleGMgKSwKLSAgICAgICAgICB0aGlzICk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0T3V0cHV0U3RyZWFtKCkKLSAgICovCi0gIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBmb2xkZXIgZXhpc3RzLgotICAgIFVSSSBwYXJlbnQgPSBwYXJlbnQoKTsKLSAgICAKLSAgICBpZiggIXBhcmVudC5pc1ByZXNlbnQoKSApCi0gICAgewotICAgICAgcGFyZW50KCkudG91Y2hGb2xkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGdldE91dFN0cmVhbSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjZ2V0VVJJU2NoZW1lKCkKLSAgICovCi0gIHB1YmxpYyBVUklTY2hlbWUgZ2V0VVJJU2NoZW1lKCkKLSAgewotICAgIHJldHVybiBzY2hlbWVfOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNMZWFmKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGVhZigpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiAKLSAgICAgICAgICByZXNvdXJjZS5leGlzdHMoKSAmJiAKLSAgICAgICAgICByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgeyAgCi0gICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKCBVUklFeGNlcHRpb24gZXhjICkKLSAgICB7Ci0gICAgICAvLyBUaGlzIFVSSSBkb2VzIG5vdCBleGlzdC4KLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1ByZXNlbnQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAgIAotICAgICAgaWYoIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkgKQotICAgICAgIHsgIAotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCggVVJJRXhjZXB0aW9uIGV4YyApCi0gICAgewotICAgICAgLy8gVGhpcyBVUkkgZG9lcyBub3QgZXhpc3QuCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2lzUmVhZGFibGUoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgICAKLSAgICAgIGlmKCByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjaXNSZWxhdGl2ZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aXZlKCkKLSAgeyAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNpc1dyaXRhYmxlKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV3JpdGFibGUoKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgICAgCi0gICAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCAmJiAKLSAgICAgICAgICByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiAKLSAgICAgICAgICAhcmVzb3VyY2UuZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpICkKLSAgICAgICB7ICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2goIFVSSUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIFRoaXMgVVJJIGRvZXMgbm90IGV4aXN0LgotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNsaXN0KCkKLSAgICovCi0gIHB1YmxpYyBVUklbXSBsaXN0KCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlICAgID0gZ2V0UmVzb3VyY2UoKTsKLSAgICBVUklbXSAgICAgdXJpQ2hpbGRyZW4gPSBuZXcgVVJJWzBdOwotICAgIAotICAgIGlmKCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiApCi0gICAgewotICAgICAgSUZvbGRlciAgICAgZm9sZGVyICAgPSAoSUZvbGRlcilyZXNvdXJjZTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZVtdIGNoaWxkcmVuICAgID0gZm9sZGVyLm1lbWJlcnMoKTsgIAotICAKLSAgICAgICAgdXJpQ2hpbGRyZW4gPSBuZXcgVVJJW2NoaWxkcmVuLmxlbmd0aF07Ci0gICAgICAgIAotICAgICAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrICkKLSAgICAgICAgewotICAgICAgICAgIElQYXRoIHBhdGggPSBjaGlsZHJlbltpbmRleF0uZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICB1cmlDaGlsZHJlbltpbmRleF0gPSBuZXcgRWNsaXBzZVVSSSggc2NoZW1lXy5nZXRVUkxGcm9tUGF0aChwYXRoKSwgZW52aXJvbm1lbnRfICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB1cmlDaGlsZHJlbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi51cmkuVVJJI2xpc3Qob3JnLmVjbGlwc2UuZW52LnVyaS5VUklGaWx0ZXIpCi0gICAqLwotICBwdWJsaWMgVVJJW10gbGlzdChVUklGaWx0ZXIgdXJpRmlsdGVyKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsKLSAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotICAgIFVSSVtdICAgICByZXN1bHQgICA9IG5ldyBVUklbMF07Ci0gICAgCi0gICAgaWYoIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICkKLSAgICAgewotICAgICAgSUZvbGRlciAgICAgZm9sZGVyICAgPSAoSUZvbGRlcilyZXNvdXJjZTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElSZXNvdXJjZVtdIGNoaWxkcmVuICAgID0gZm9sZGVyLm1lbWJlcnMoKTsgICAgICAgCi0gICAgICAgIFZlY3RvciAgICAgIHVyaUNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKyApCi0gICAgICAgICB7Ci0gICAgICAgICAgSVBhdGggcGF0aCA9IGNoaWxkcmVuW2luZGV4XS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgIFVSSSAgIHVyaSAgPSBuZXcgRWNsaXBzZVVSSSggc2NoZW1lXy5nZXRVUkxGcm9tUGF0aChwYXRoKSwgZW52aXJvbm1lbnRfICk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYoIHVyaUZpbHRlci5hY2NlcHRzKCB1cmkgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgdXJpQ2hpbGRyZW4uYWRkKCB1cmkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IChVUklbXSl1cmlDaGlsZHJlbi50b0FycmF5KCBuZXcgVVJJWzBdICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LnVyaS5VUkkjcmVuYW1lKG9yZy5lY2xpcHNlLmVudi51cmkuVVJJKQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVuYW1lKFVSSSBuZXdVUkkgKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaEZvbGRlcigpCi0gICAqLwotICBwdWJsaWMgdm9pZCB0b3VjaEZvbGRlcigpIHRocm93cyBVUklFeGNlcHRpb24KLSAgewotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKCk7Ci0gICAgCi0gICAgaWYoIHJlc291cmNlICE9IG51bGwgKQotICAgIHsgCi0gICAgICBpZiggcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIgKQotICAgICAgewotICAgICAgICBJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKXJlc291cmNlOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiggZm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVVJJRXhjZXB0aW9uKCAKLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiRWNsaXBzZVVSSSIsCi0gICAgICAgICAgICAgICAgICAgIG1zZ18uZ2V0TWVzc2FnZSggIk1TR19FUlJPUl9GT0xERVJfSEFTX0NISUxEUkVOIiwgbmV3IE9iamVjdFtdeyBmb2xkZXIudG9TdHJpbmcoKSB9ICksCi0gICAgICAgICAgICAgICAgICAgIFN0YXR1cy5FUlJPUiApLAotICAgICAgICAgICAgICAgIHRoaXMgKTsKLQkJCQkJCQkJCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgICAgIHsgICAgICAgIAotICAgICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIAotICAgICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiRWNsaXBzZVVSSSIsCi0gICAgICAgICAgICAgICAgICBleGMuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgU3RhdHVzLkVSUk9SLAotCQkJCSAgZXhjICksCi0gICAgICAgICAgICAgIHRoaXMgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgLy8/Pz8gTm90IHN1cmUgd2hhdCB0byBkbyBpZiB0b3VjaGluZyBhIGZvbGRlciBhbmQgdGhlIFVSSSBleGlzdHMgYW5kIGl0IGlzIG5vdCBhIGZvbGRlci4KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIElQYXRoIG5ld1BhdGggPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKCB1cmlfICkgKS5tYWtlQWJzb2x1dGUoKTsKLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEZpbGVSZXNvdXJjZVV0aWxzLm1ha2VGb2xkZXJQYXRoKCBlbnZpcm9ubWVudF8uZ2V0UmVzb3VyY2VDb250ZXh0KCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0UHJvZ3Jlc3NNb25pdG9yKCksCi0JCQkgIAkgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfLmdldFN0YXR1c0hhbmRsZXIoKSApOwotICAgICAgfQotICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVSSUV4Y2VwdGlvbiggCi0gICAgICAgICAgICBuZXcgU2ltcGxlU3RhdHVzKCAiRWNsaXBzZVVSSSIsCi0gICAgICAgICAgICAgICAgZXhjLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IsCi0JCQkJCQkJCWV4YyApLAotICAgICAgICAgICAgdGhpcyApOwotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSN0b3VjaExlYWYoKQotICAgKi8KLSAgcHVibGljIHZvaWQgdG91Y2hMZWFmKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLSAgICAKLSAgICBpZiggcmVzb3VyY2UgIT0gbnVsbCApCi0gICAgewotICAgICAgLy8gVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIHNvIGRvIG5vdGhpbmcuCi0gICAgfSAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgZm9yIHRoaXMgbGVhZiBhbmQgY3JlYXRlIGl0IGlmIHJlcXVpcmVkLgotICAgICAgVVJJIHBhcmVudCA9IHBhcmVudCgpOwotICAgICAgCi0gICAgICBpZiggIXBhcmVudC5pc1ByZXNlbnQoKSApCi0gICAgICB7ICAKLSAgICAgICAgcGFyZW50KCkudG91Y2hGb2xkZXIoKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIEdldCBhbiBvdXRwdXQgc3RyZWFtIHRvIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgaW1tZWRpYXRlbHkgY2xvc2UgaXQuCi0gICAgICAgIC8vIFRoaXMgc2hvdWxkIGNyZWF0ZSBhIDAgYnl0ZSBmaWxlLgotICAgICAgICBnZXRPdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGV4YyApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVUklFeGNlcHRpb24oIG5ldyBTaW1wbGVTdGF0dXMoICJFY2xpcHNlVVJJIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy5nZXRNZXNzYWdlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQkJCSAgICAgIGV4YyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzICk7IAotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB0aHJvd3MgVVJJRXhjZXB0aW9uCi0gIHsgICAgCi0gICAgSVBhdGggIHBhdGggICAgICAgICAgICAgPSBuZXcgUGF0aCggc2NoZW1lXy5nZXRQYXRoRnJvbVBsYXRmb3JtVVJJKHVyaV8pICk7Ci0gICAgU3RyaW5nIGFic29sdXRlUGF0aG5hbWUgPSBwYXRoLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0gICAKLSAgICByZXR1cm4gRmlsZVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGFic29sdXRlUGF0aG5hbWUpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbnYudXJpLlVSSSNnZXRPdXRwdXRTdHJlYW0oKQotICAgKi8KLSAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZ2V0T3V0U3RyZWFtKCkgdGhyb3dzIFVSSUV4Y2VwdGlvbgotICB7Ci0gICAgSVBhdGggICAgICAgIGZpbGUgICA9IG5ldyBQYXRoKCBzY2hlbWVfLmdldFBhdGhGcm9tUGxhdGZvcm1VUkkoIHVyaV8gKSApLm1ha2VBYnNvbHV0ZSgpOwotICAgIE91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgIAotICAgIHN0cmVhbSA9IEZpbGVSZXNvdXJjZVV0aWxzLm5ld0ZpbGVPdXRwdXRTdHJlYW0gKCBlbnZpcm9ubWVudF8uZ2V0UmVzb3VyY2VDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF8uZ2V0UHJvZ3Jlc3NNb25pdG9yKCksCi0gCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Xy5nZXRTdGF0dXNIYW5kbGVyKCkgKTsgICAgCi0gICAgcmV0dXJuIHN0cmVhbTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBGaWxlIG9iamVjdCBmb3IgdGhlIHJlc291cmNlIHVuZGVyIHRoaXMgVVJJLgotICAgKiBUaGVyZSBhcmUgbWFueSBVUklzIGFuZCBVUklTY2hlbWVzIGZvciB3aGljaCB0aGlzIG1ldGhvZAotICAgKiB3aWxsIGZhaWwgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gSXQgc2hvdWxkIGJlIHVzZWQgb25seQotICAgKiBpbiBjYXNlcyB3aGVyZSBVUklzIGFyZSBrbm93biB0byBiZSBiYWNrZWQgYnkgcGh5c2ljYWwgZmlsZXMuCi0gICAqLwotICBwdWJsaWMgRmlsZSBhc0ZpbGUgKCkKLSAgewotICAJcmV0dXJuIGZpbGVfOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUudXJpLlVSSSNpc0F2YWlsYWJsZUFzRmlsZSgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZUFzRmlsZSgpIAotICB7Ci0gIAlyZXR1cm4gZmlsZV8gIT0gbnVsbDsKLSAgfQotICAKLSAgcHJpdmF0ZSBGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgU3RyaW5nIHBsYXRmb3JtUmVzID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gICAgRmlsZSAgIHJlc3VsdCAgICAgID0gbnVsbDsKLSAgICAKLSAgICBpZiAodXJpXy5zdGFydHNXaXRoKHBsYXRmb3JtUmVzKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgRmlsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQodXJpXy5zdWJzdHJpbmcocGxhdGZvcm1SZXMubGVuZ3RoKCksIHVyaV8ubGVuZ3RoKCkpKS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9wbHVnaW4vRW52UGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3BsdWdpbi9FbnZQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4ZjRhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi9zcmMvb3JnL2VjbGlwc2Uvd3N0L2NvbW1hbmQvaW50ZXJuYWwvZW52L3BsdWdpbi9FbnZQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEVudlBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRW52UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW52UGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYvc3JjL29yZy9lY2xpcHNlL3dzdC9jb21tYW5kL2ludGVybmFsL2Vudi9wcmVmZXJlbmNlcy9BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWE1NTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52L3NyYy9vcmcvZWNsaXBzZS93c3QvY29tbWFuZC9pbnRlcm5hbC9lbnYvcHJlZmVyZW5jZXMvQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVmaW5lIHByZWZlcmVuY2UgaWRzLiBJdCBjb3JyZXNwb25kcyB0byBpbmZvcm1hdGlvbgotICogc3BlY2lmaWVkIGJ5IGEgYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgZXh0ZW5zaW9uIHBvaW50LgotICogRWFjaCBhY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSBlbnRyeSB3aWxsIHJlc3VsdCBpbiBhbiBlbnRyeSBpbiB0aGUKLSAqIGFjdGlvbiBkaWFsb2dzIHByZWZlcmVuY2UgcGFnZSBpZiB0aGUgc2hvd2NoZWNrYm94IGZpZWxkIGlzIHRydWUuCi0gKiAgIAotICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiA8cHJlPgotICAqICAgJmx0O2V4dGVuc2lvbgotICogICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSImZ3Q7Ci0gKiAgICAgJmx0O2FjdGlvbkRpYWxvZ1ByZWZlcmVuY2VUeXBlCi0gKiAgICAgICAgICAgc2hvd2NoZWNrYm94PSJ0cnVlIgotICogICAgICAgICAgIG5hbWU9IiVDSEVDS0JPWF9TSE9XX0dFTkVSQVRFX0pBVkFfUFJPWFlfRElBTE9HIgotICogICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3NzLnBvcHVwLmNhdGVnb3J5IgotICogICAgICAgICAgIHRvb2x0aXA9IiVUT09MVElQX1BQQURfQ0hFQ0tCT1hfV1NETDJQUk9YWSIKLSAqICAgICAgICAgICBpbmZvcG9wPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuUFBBRDAwMDQiCi0gKiAgICAgICAgICAgYWx3YXlzaGlkZT0iZmFsc2UiCi0gKiAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCImZ3Q7Ci0gKiAgICAgJmx0Oy9hY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZSZndDsKLSAqIDwvcHJlPgotICoKLSAqIFRoaXMgYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgZXh0ZW5zaW9uIHBvaW50IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBPYmplY3RDb250cmlidXRpb24KLSAqIGV4dGVuc2lvbiBwb2ludC4gIEZvciBleGFtcGxlOiAKLSAqIAotICogICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gKiAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICogICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAqICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIj4KLSAqIDwhLS0gV1NETCBUbyBKYXZhIEJlYW4gUHJveHkgLS0+Ci0gKiAgICAgICAgPGFjdGlvbgotICogICAgICAgICAgICAgIGxhYmVsPSIlQUNUSU9OX0dFTkVSQVRFX0pBVkFfUFJPWFkiCi0gKiAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRzLnBvcHVwLkR5bmFtaWNQb3B1cFdpemFyZCIKLSAqICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanN0LndzLmF0ay51aS53ZWJzZXJ2aWNlLmNhdGVnb3J5LnBvcHVwTWVudS9wb3B1cEFjdGlvbnMiCi0gKiAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCI+Ci0gKiAgICAgICAgPC9hY3Rpb24+Ci0gKiAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gKgotICogVGhlIE9iamVjdENvbnRyaWJ1dGlvbiBlbnRyeSBpcyBsaW5rZWQgd2l0aCB0aGUgYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUgZW50cnkKLSAqIHZpYSB0aGUgaWQgYXR0cmlidXRlIG9mIHRoZSBPYmplY3RDb250aXJidXRpb24gYW5kIHRoZSBpZCBhdHRyaWJ1dGUgb2YgYWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGUuCi0gKiBOb3RlOiB0aGUgaWQgaW4gdGhlIGFjdGlvbiBlbnRyeSBpcyBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkeW5hbWljIHdpemFyZCB0aGF0Ci0gKiBzaG91bGQgYmUgcG9wdXBlZCB1cC4gIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSBPYmplY3Rpb25Db250cmlidXRpb24gaWQgYW5kIHRoZQotICogYWN0aW9uIGlkcyBhcmUgdGhlIHNhbWUsIGJ1dCB0aGlzIG5lZWQgbm90IGJlIHRoZSBjYXNlLiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZQotewotICBwcml2YXRlIFN0cmluZyAgaWRfOwotICBwcml2YXRlIFN0cmluZyAgbmFtZV87Ci0gIHByaXZhdGUgU3RyaW5nICBpbmZvcG9wXzsKLSAgcHJpdmF0ZSBTdHJpbmcgIHRvb2x0aXBfOwotICBwcml2YXRlIGJvb2xlYW4gc2hvd0NoZWNrYm94XzsKLSAgcHJpdmF0ZSBib29sZWFuIGFsd2F5c0hpZGVfOwotICBwcml2YXRlIFN0cmluZyAgY2F0ZWdvcnlfOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBpZCBmb3IgdGhpcyBwb3B1cCBhY3Rpb24uICBUaGlzIGlkIGxpbmsgdGhlIGFjdGlvbkRpYWxvZ1ByZWZlcmVuY2UKLSAgICogd2l0aCBhbiBPYmplY3RDb250cmlidXRpb24uCi0gICAqIEBwYXJhbSBpZCB0aGUgaWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpCi0gIHsKLSAgICBpZF8gPSBpZDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBpZCBmb3IgdGhpcyBwb3B1cCBhY3Rpb24uCi0gICAqIEByZXR1cm4gdGhlIGlkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gaWRfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUgZm9yIHRoaXMgcG9wdXAgYWN0aW9uLiAgVGhpcyBuYW1lIGlzIGRpc3BsYXllZCBvbiB0aGUKLSAgICogZGlhbG9nIHByZWZlcmVuY2VzIHBhZ2UgYW5kIG11c3QgYmUgdHJhbnNsYXRlZC4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHBvcHVwIGNoZWNrIGJveC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBuYW1lXyA9IG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgZGlzcGxheSB2YWx1ZSBmb3IgdGhpcyBwb3B1cCBjaGVjayBib3guCi0gICAqIE5vdGU6IHRoaXMgdmFsdWUgbWF5IGJlIG51bGwgaWYgdGhlIGdldFNob3dDaGVja0JveCBtZXRob2QgcmV0dXJucyBmYWxzZS4KLSAgICogQHJldHVybiB0aGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgaW5mbyBwb3AgdmFsdWUgZm9yIHRoaXMgcG9wdXAgY2hlY2sgYm94LgotICAgKiBAcGFyYW0gaW5mb3BvcAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5mb3BvcChTdHJpbmcgaW5mb3BvcCkKLSAgewotICAgIGluZm9wb3BfID0gaW5mb3BvcDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBpbmZvIHBvcCB2YWx1ZSBmb3IgdGhpcyBwb3B1cCBjaGVjayBib3guCi0gICAqIE5vdGU6IHRoaXMgdmFsdWUgbWF5IGJlIG51bGwgaWYgdGhlIGdldFNob3dDaGVja0JveCBtZXRob2QgcmV0dXJucyBmYWxzZS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGluZm9wb3AgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEluZm9wb3AoKQotICB7Ci0gICAgcmV0dXJuIGluZm9wb3BfOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHRvb2x0aXAgdmFsdWUgZm9yIHRoaXMgcG9wdXAgY2hlY2sgYm94LgotICAgKiBAcGFyYW0gdG9vbHRpcAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VG9vbHRpcChTdHJpbmcgdG9vbHRpcCkKLSAgewotICAgIHRvb2x0aXBfID0gdG9vbHRpcDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSB0b29sdGlwIHZhbHVlIGZvciB0aGlzIHBvcHVwIGNoZWNrIGJveC4KLSAgICogTm90ZTogdGhpcyB2YWx1ZSBtYXkgYmUgbnVsbCBpZiB0aGUgZ2V0U2hvd0NoZWNrQm94IG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgdG9vbHRpcCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbHRpcCgpCi0gIHsKLSAgICByZXR1cm4gdG9vbHRpcF87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzaG93IGNoZWNrIGJveCB2YWx1ZSBmb3IgdGhpcyBwb3B1cC4gIElmIHRoZSB2YWx1ZSBpcyB0cnVlIHRoZW4KLSAgICogdGhpcyBwb3B1cCB3aWxsIGFwcGVhciBvbiBhbiBhY3Rpb24gZGlhbG9ncyBwcmVmZXJlbmNlIHBhZ2UuICBBbHNvIGlmIHRoaXMKLSAgICogdmFsdWUgaXMgdHJ1ZSBhbmQgdGhlIGFsd2F5cyBoaWRlIHZhbHVlIGlzIGZhbHNlIHRoZW4gYSBjaGVjayBib3ggd2lsbCBiZSBkaXNwbGF5ZWQKLSAgICogb24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhpcyBwb3B1cCB3aGljaCBhc2tzIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0aGUgcG9wdXAKLSAgICogdG8gYmUgZGlzcGxheWVkIHRoZSBuZXh0IHRpbWUgYXJlIHRvIGp1c3QgZXhlY3V0ZSB0aGUgcG9wdXAgYWN0aW9uLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHNob3cgY2hlY2sgYm94IHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd0NoZWNrYm94KCBib29sZWFuIHZhbHVlICkKLSAgewotICAgIHNob3dDaGVja2JveF8gPSB2YWx1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlIHNob3cgY2hlY2sgYm94IHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSBzaG93IGNoZWNrIGJveCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dDaGVja2JveCgpCi0gIHsKLSAgICByZXR1cm4gc2hvd0NoZWNrYm94XzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIGFsd2F5cyBoaWRlIHZhbHVlLiAgVGhpcyB2YWx1ZSBzcGVjaWZpZXMgdGhhdCB0aGUgcG9wdXAgc2hvdWxkIGFsd2F5cwotICAgKiBiZSBleGVjdXRlZCB3aXRob3V0IGJyaW5naW5nIHVwIHRoZSBwb3B1cCB3aXphcmQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgYWx3YXlzIGhpZGUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBbHdheXNIaWRlKCBib29sZWFuIHZhbHVlICkKLSAgewotICAgIGFsd2F5c0hpZGVfID0gdmFsdWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQHJldHVybiByZXR1cm5zIHRoZSBhbHdheXMgaGlkZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEFsd2F5c0hpZGUoKQotICB7Ci0gICAgcmV0dXJuIGFsd2F5c0hpZGVfOyAKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldHMgdGhlIGNhdGVnb3J5IGlkIGZvciBwb3B1cCBhY3Rpb24uICBBbGwgcG9wdXAgYWN0aW9ucyB3aXRoIHRoZSBzYW1lCi0gICAqIGNhdGVnb3J5IGlkIHdpbGwgYmUgZ3JvdXBlZCB0b2dldGhlciBvbiB0aGUgc2FtZSBwb3B1cCBhY3Rpb24gcHJlZmVyZW5jZSBwYWdlLgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIGNhdGVnb3J5LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnkoIFN0cmluZyB2YWx1ZSApCi0gIHsKLSAgICBjYXRlZ29yeV8gPSB2YWx1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBjYXRlZ29yeSBpZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKQotICB7Ci0gICAgcmV0dXJuIGNhdGVnb3J5XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWYzOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id3NleHBsb3Jlci1zcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5N2E3NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi1idWlsZAotd2ViYXBwcwotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotKi5qYXIKLSoud2FyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyMTk5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNmY1YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI0ZyaSBKdW4gMDMgMDE6MDY6NTMgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDBmNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBKdW4gMDMgMDA6MzI6MDIgRURUIDIwMDUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhYTI4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogZXhwbG9yZXIuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLmZhdm9yaXRlcywKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmNvbnN0YW50cywKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmRhdGEsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lciwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbCwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc2Zvcm1lciwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudXRpbCwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnRyYW5zZm9ybWVyLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbHVnaW4sCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBvcHVwCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnRvbWNhdCwKLSBvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS54c2QsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aSwKLSBvcmcuZWNsaXBzZS53c3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlciwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbCwKLSBvcmcud3NkbDRqLAotIG9yZy5hcGFjaGUuYXhpczExLAotIG9yZy5hcGFjaGUud3NpbDRqLAotIG9yZy51ZGRpNGoKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9idWlsZC13YXItcGRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL2J1aWxkLXdhci1wZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MyMGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL2J1aWxkLXdhci1wZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciIgZGVmYXVsdD0iYnVpbGQud2FycyIgYmFzZWRpcj0iLiI+Ci0KLQk8cHJvcGVydHkgbmFtZT0id3NleHBsb3JlckRpciIgdmFsdWU9IiR7YnVpbGREaXJlY3Rvcnl9L29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImpzcGNvbXBpbGUiIHVubGVzcz0id3NleHBsb3Jlci53YXIiIGRlc2NyaXB0aW9uPSJQcmUtY29tcGlsZSB0aGUgSlNQcyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyIHBsdWdpbiI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5qYXNwZXIuSnNwQyIgZm9yaz0idHJ1ZSI+Ci0JCQk8YXJnIGxpbmU9Ii13ZWJ4bWwgJHt3c2V4cGxvcmVyRGlyfS9XRUItSU5GL3dlYi54bWwgLWQgJHt3c2V4cGxvcmVyRGlyfSAtd2ViYXBwICR7d3NleHBsb3JlckRpcn0iLz4KLQkJCTxjbGFzc3BhdGg+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VMb2NhdGlvbn0vcGx1Z2lucyI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9Im9yZy5lY2xpcHNlLnRvbWNhdCovKi5qYXIiIC8+Ci0JCQkJPC9maWxlc2V0PgotCQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlTG9jYXRpb259L3BsdWdpbnMiPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcuYXBhY2hlLmFudCovbGliLyouamFyIiAvPgotCQkJCTwvZmlsZXNldD4KLQkJCTwvY2xhc3NwYXRoPgotCQk8L2phdmE+Ci0JCTxqYXZhYyBkZXN0ZGlyPSIke3dzZXhwbG9yZXJEaXJ9L1dFQi1JTkYvY2xhc3NlcyIgaW5jbHVkZUFudFJ1bnRpbWU9ImZhbHNlIj4KLQkJCTxzcmMgcGF0aD0iJHt3c2V4cGxvcmVyRGlyfSIvPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ij4KLQkJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8+IAotCQkJCTwvZmlsZXNldD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7YmFzZUxvY2F0aW9ufS9wbHVnaW5zIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiIC8+IAotCQkJCTwvZmlsZXNldD4KLQkJCTwvY2xhc3NwYXRoPgotCQk8L2phdmFjPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ3c2V4cGxvcmVyLndhciIgdW5sZXNzPSJ3c2V4cGxvcmVyLndhciIgZGVzY3JpcHRpb249IkNyZWF0ZSB3YXI6IHdzZXhwbG9yZXIud2FyLiI+Ci0JCTx6aXAKLQkJCWJhc2VkaXI9IiR7d3NleHBsb3JlckRpcn0iCi0JCQlkZXN0ZmlsZT0iJHt3c2V4cGxvcmVyRGlyfS8uLi93c2V4cGxvcmVyLndhciIKLQkJCXdoZW5lbXB0eT0ic2tpcCIgdXBkYXRlPSJmYWxzZSIKLQkJCWV4Y2x1ZGVzPSIqKi8qLmphdmEgKiovKi5qc3AgKiovKi5pbmMiCi0JCS8+Ci0JPC90YXJnZXQ+CQotCQotCTx0YXJnZXQgbmFtZT0iYnVpbGQud2FycyIgZGVzY3JpcHRpb249IkJ1aWxkIGFsbCB0aGUgd2FycyBmb3IgdGhlIHBsdWctaW46IG9yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci4iPgotCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJ3c2V4cGxvcmVyLndhciIgZmlsZT0iJHt3c2V4cGxvcmVyRGlyfS8uLi93c2V4cGxvcmVyLndhciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImpzcGNvbXBpbGUiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ3c2V4cGxvcmVyLndhciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbi53YXJzIiBkZXNjcmlwdGlvbj0iQ2xlYW4gYWxsIHRoZSB3YXJzIGZvciB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyLiI+Ci0JCTxkZWxldGUgZmlsZT0id3NleHBsb3Jlci53YXIiLz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYnVpbGQtd2FyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL2J1aWxkLXdhci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMzI1ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYnVpbGQtd2FyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIiIGRlZmF1bHQ9ImJ1aWxkLndhcnMiIGJhc2VkaXI9Ii4iPgotCi0JPHByb3BlcnR5IG5hbWU9IndzZXhwbG9yZXJEaXIiIHZhbHVlPSIke2J1aWxkRGlyZWN0b3J5fS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImpzcGNvbXBpbGUiIHVubGVzcz0id3NleHBsb3Jlci53YXIiIGRlc2NyaXB0aW9uPSJQcmUtY29tcGlsZSB0aGUgSlNQcyBpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyIHBsdWdpbiI+Ci0JCTxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5qYXNwZXIuSnNwQyIgZm9yaz0idHJ1ZSI+Ci0JCQk8YXJnIGxpbmU9Ii13ZWJ4bWwgJHt3c2V4cGxvcmVyRGlyfS9XRUItSU5GL3dlYi54bWwgLWQgJHt3c2V4cGxvcmVyRGlyfSAtd2ViYXBwICR7d3NleHBsb3JlckRpcn0iLz4KLQkJCTxjbGFzc3BhdGg+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VMb2NhdGlvbn0vcGx1Z2lucyI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9Im9yZy5lY2xpcHNlLnRvbWNhdCovKi5qYXIiIC8+Ci0JCQkJPC9maWxlc2V0PgotCQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlTG9jYXRpb259L3BsdWdpbnMiPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcuYXBhY2hlLmFudCovbGliLyouamFyIiAvPgotCQkJCTwvZmlsZXNldD4KLQkJCTwvY2xhc3NwYXRoPgotCQk8L2phdmE+Ci0JCTxqYXZhYyBkZXN0ZGlyPSIke3dzZXhwbG9yZXJEaXJ9L1dFQi1JTkYvY2xhc3NlcyIgaW5jbHVkZUFudFJ1bnRpbWU9ImZhbHNlIiBmYWlsb25lcnJvcj0iZmFsc2UiPgotCQkJPHNyYyBwYXRoPSIke3dzZXhwbG9yZXJEaXJ9Ii8+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxmaWxlc2V0IGRpcj0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucyI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotCQkJCTwvZmlsZXNldD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L3BsdWdpbnMiPgotCQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KLQkJCQk8L2ZpbGVzZXQ+Ci0JCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VMb2NhdGlvbn0vcGx1Z2lucyI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9IioqLyouamFyIiAvPgotCQkJCTwvZmlsZXNldD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7YmFzZUxvY2F0aW9ufS9wbHVnaW5zIj4KLQkJCQkJPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0JCQkJPC9maWxlc2V0PgotCQkJPC9jbGFzc3BhdGg+Ci0JCTwvamF2YWM+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IndzZXhwbG9yZXIud2FyIiB1bmxlc3M9IndzZXhwbG9yZXIud2FyIiBkZXNjcmlwdGlvbj0iQ3JlYXRlIHdhcjogd3NleHBsb3Jlci53YXIuIj4KLQkJPHppcAotCQkJYmFzZWRpcj0iJHt3c2V4cGxvcmVyRGlyfSIKLQkJCWRlc3RmaWxlPSIke3dzZXhwbG9yZXJEaXJ9Ly4uL3dzZXhwbG9yZXIud2FyIgotCQkJd2hlbmVtcHR5PSJza2lwIiB1cGRhdGU9ImZhbHNlIgotCQkJZXhjbHVkZXM9IioqLyouamF2YSAqKi8qLmpzcCAqKi8qLmluYyAqKi8qLnR4dCIKLQkJLz4KLQk8L3RhcmdldD4JCi0JCi0JPHRhcmdldCBuYW1lPSJidWlsZC53YXJzIiBkZXNjcmlwdGlvbj0iQnVpbGQgYWxsIHRoZSB3YXJzIGZvciB0aGUgcGx1Zy1pbjogb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyLiI+Ci0JCTxhdmFpbGFibGUgcHJvcGVydHk9IndzZXhwbG9yZXIud2FyIiBmaWxlPSIke3dzZXhwbG9yZXJEaXJ9Ly4uL3dzZXhwbG9yZXIud2FyIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0ianNwY29tcGlsZSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9IndzZXhwbG9yZXIud2FyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuLndhcnMiIGRlc2NyaXB0aW9uPSJDbGVhbiBhbGwgdGhlIHdhcnMgZm9yIHRoZSBwbHVnLWluOiBvcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIuIj4KLQkJPGRlbGV0ZSBmaWxlPSJ3c2V4cGxvcmVyLndhciIvPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlZTk5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotc291cmNlLmV4cGxvcmVyLmphciA9IHNyYy8KLXNvdXJjZS53c2V4cGxvcmVyL1dFQi1JTkYvbGliL3dzZXhwbG9yZXIuamFyID0gd3NleHBsb3Jlci1zcmMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBleHBsb3Jlci5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgd3NleHBsb3Jlci9XRUItSU5GL2xpYi93c2V4cGxvcmVyLmphcgotb3V0cHV0LndzZXhwbG9yZXIvV0VCLUlORi9saWIvd3NleHBsb3Jlci5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIGV4cGxvcmVyLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0aWVzLyxcCi0gICAgICAgICAgICAgICB3ZWJhcHBzLyxcCi0gICAgICAgICAgICAgICB3c2V4cGxvcmVyLndhcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHByb3BlcnRpZXMvLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgd3NleHBsb3Jlci8sXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB3ZWJhcHBzLyxcCi0gICAgICAgICAgICAgICBleHBsb3Jlci5qYXIsXAotICAgICAgICAgICAgICAgd3NleHBsb3Jlci53YXIsXAotICAgICAgICAgICAgICAgd3NleHBsb3Jlci1zcmMvCi1jdXN0b20gPSBmYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjMDFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMKLSMgTWVzc2FnZXMgaW4gcGx1Z2luLnhtbC4KLSMKLVBMVUdJTl9OQU1FPVdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCi0KLSMKLSMgTWVzc2FnZXMgZm9yIHRoZSBjbGllbnQgdHlwZSBleHRlbnNpb24KLSMKLVdFQlNFUlZJQ0VDTElFTlRUWVBFX05BTUVfV1NFWFBMT1JFUj1TdHVibGVzcyAoV2ViIFNlcnZpY2VzIEV4cGxvcmVyKQotVEFTS19MQUJFTF9FWFBMT1JFX1dTRExfVVNJTkdfV1NFPUV4cGxvcmVyIFdTREwgdXNpbmcgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLgotCi0jCi0jIE1lc3NhZ2VzIGZvciB0aGUgV1NFeHBsb3JlciB0eXBlIGV4dGVuc2lvbgotIwotTVNHX0VSUk9SX0xBVU5DSF9XU0VYUExPUkVSPUlXQUIwMzY2RSBVbmFibGUgdG8gbGF1bmNoIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLU1TR19FUlJPUl9MT0FEX0xBVU5DSF9PUFRJT05TPUlXQUIwMzY3RSBVbmFibGUgdG8gbG9hZCBsYXVuY2ggb3B0aW9ucy4KLU1TR19CUk9LRU5fVk1fRE9FU19OT1RfU1VQUE9SVF9VVEYtOD1Ccm9rZW4gVk0gZG9lcyBub3Qgc3VwcG9ydCBVVEYtOC4KLQotIwotIyBNZXNzYWdlcyBmb3IgcG9wdXAgYWN0aW9uIChUZXN0IHdpdGggV2ViIFNlcnZpY2VzIEV4cGxvcmVyKQotIwotUE9QVVBfVEVTVF9XU0RMPVRlc3Qgd2l0aCBXZWIgU2VydmljZXMgRXhwbG9yZXIKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNmM1NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogRWNsaXBzZSBQb3B1cCBBY3Rpb24gKG9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMpIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uLldTRExGaWxlTWVudSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX1RFU1RfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucG9wdXAuUG9wdXBUZXN0V1NETCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXRrLnVpLndlYnNlcnZpY2UuY2F0ZWdvcnkucG9wdXBNZW51L3BvcHVwQWN0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucG9wdXAuUG9wdXBUZXN0V1NETCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbCIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5XU0RMRmlsZU1lbnUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9URVNUX1dTREwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBvcHVwLlBvcHVwVGVzdFdTREwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wb3B1cC5Qb3B1cFRlc3RXU0RMIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmFjdGlvbi5XU0RMRmlsZU1lbnUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVQT1BVUF9URVNUX1dTREwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBvcHVwLlBvcHVwVGVzdFdTREwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wb3B1cC5Qb3B1cFRlc3RXU0RMIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci08IS0tIFRPRE86IE1vdmUgdGhpcyBjb250cmlidXRpb24gdG8gb3JnLmVjbGlwc2UuanN0LndzLnVpCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkuYWN0aW9uLldTRExGaWxlTWVudSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVBPUFVQX1RFU1RfV1NETCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucG9wdXAuUG9wdXBUZXN0V1NETCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBvcHVwLlBvcHVwVGVzdFdTREwiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLS0tPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcHJvcGVydGllcy9mYXZvcml0ZXNfZGVmYXVsdC53c2lsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvcHJvcGVydGllcy9mYXZvcml0ZXNfZGVmYXVsdC53c2lsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY1OGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3Byb3BlcnRpZXMvZmF2b3JpdGVzX2RlZmF1bHQud3NpbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aW5zcGVjdGlvbiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMS8xMC9pbnNwZWN0aW9uLyIKLSAgeG1sbnM6d3NpbHdzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDEvMTAvaW5zcGVjdGlvbi93c2RsLyIKLSAgeG1sbnM6d3NpbHVkZGk9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDEvMTAvaW5zcGVjdGlvbi91ZGRpLyIKLSAgeG1sbnM6dWRkaT0idXJuOnVkZGktb3JnOmFwaSI+Ci0gIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPnY1XzBfMV8wPC9hYnN0cmFjdD4KLQotICA8bGluayByZWZlcmVuY2VkTmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpIj4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj4lUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTV9URVNUPC9hYnN0cmFjdD4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj5odHRwOi8vdWRkaS5pYm0uY29tL3Rlc3RyZWdpc3RyeS9pbnF1aXJ5YXBpPC9hYnN0cmFjdD4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj5odHRwczovL3VkZGkuaWJtLmNvbS90ZXN0cmVnaXN0cnkvcHVibGlzaGFwaTwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3VkZGkuaWJtLmNvbS90ZXN0cmVnaXN0cnkvcmVnaXN0cnkuaHRtbDwvYWJzdHJhY3Q+Ci0gIDwvbGluaz4KLQotICA8bGluayByZWZlcmVuY2VkTmFtZXNwYWNlPSJ1cm46dWRkaS1vcmc6YXBpIj4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj4lUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTTwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3VkZGkuaWJtLmNvbS91YnIvaW5xdWlyeWFwaTwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cHM6Ly91ZGRpLmlibS5jb20vdWJyL3B1Ymxpc2hhcGk8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHA6Ly91ZGRpLmlibS5jb20vdWJyL3JlZ2lzdHJ5Lmh0bWw8L2Fic3RyYWN0PgotICA8L2xpbms+Ci0KLSAgPGxpbmsgcmVmZXJlbmNlZE5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaSI+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+JVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlRfVEVTVDwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3Rlc3QudWRkaS5taWNyb3NvZnQuY29tL2lucXVpcmU8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHBzOi8vdGVzdC51ZGRpLm1pY3Jvc29mdC5jb20vcHVibGlzaDwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cHM6Ly90ZXN0LnVkZGkubWljcm9zb2Z0LmNvbS9yZWdpc3Rlci5hc3B4PC9hYnN0cmFjdD4KLSAgPC9saW5rPgotCi0gIDxsaW5rIHJlZmVyZW5jZWROYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGkiPgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTUlDUk9TT0ZUPC9hYnN0cmFjdD4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj5odHRwOi8vdWRkaS5taWNyb3NvZnQuY29tL2lucXVpcmU8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHBzOi8vdWRkaS5taWNyb3NvZnQuY29tL3B1Ymxpc2g8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHBzOi8vdWRkaS5taWNyb3NvZnQuY29tL3JlZ2lzdGVyLmFzcHg8L2Fic3RyYWN0PgotICA8L2xpbms+Ci0KLSAgPGxpbmsgcmVmZXJlbmNlZE5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaSI+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+JVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9TQVBfVEVTVDwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3VkZGl0ZXN0LnNhcC5jb20vVURESS9hcGkvaW5xdWlyeS88L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHBzOi8vdWRkaXRlc3Quc2FwLmNvbS9VRERJL2FwaS9wdWJsaXNoLzwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3VkZGl0ZXN0LnNhcC5jb20vPC9hYnN0cmFjdD4KLSAgPC9saW5rPgotCi0gIDxsaW5rIHJlZmVyZW5jZWROYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGkiPgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQPC9hYnN0cmFjdD4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj5odHRwOi8vdWRkaS5zYXAuY29tL1VEREkvYXBpL2lucXVpcnkvPC9hYnN0cmFjdD4KLSAgICA8YWJzdHJhY3QgeG1sOmxhbmc9ImVuLVVTIj5odHRwczovL3VkZGkuc2FwLmNvbS9VRERJL2FwaS9wdWJsaXNoLzwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3VkZGkuc2FwLmNvbS88L2Fic3RyYWN0PgotICA8L2xpbms+Ci0KLSAgPGxpbmsgcmVmZXJlbmNlZE5hbWVzcGFjZT0idXJuOnVkZGktb3JnOmFwaSI+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+JVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9YTUVUSE9EUzwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3VkZGkueG1ldGhvZHMubmV0L2lucXVpcmU8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHBzOi8vdWRkaS54bWV0aG9kcy5uZXQvcHVibGlzaDwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3d3dy54bWV0aG9kcy5uZXQvdmUyL1JlZ2lzdGVyLnBvP2V2ZW50PXJlZ2lzdGVyT3JnPC9hYnN0cmFjdD4KLSAgPC9saW5rPgotCi0gIDxsaW5rIHJlZmVyZW5jZWROYW1lc3BhY2U9InVybjp1ZGRpLW9yZzphcGkiPgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPiVQVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTlRUQ09NTTwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3d3dy51ZGRpLm5lLmpwL3JlZ2lzdHJ5L2lucXVpcnlhcGk8L2Fic3RyYWN0PgotICAgIDxhYnN0cmFjdCB4bWw6bGFuZz0iZW4tVVMiPmh0dHBzOi8vd3d3LnVkZGkubmUuanAvcmVnaXN0cnkvcHVibGlzaGFwaTwvYWJzdHJhY3Q+Ci0gICAgPGFic3RyYWN0IHhtbDpsYW5nPSJlbi1VUyI+aHR0cDovL3d3dy51ZGRpLm5lLmpwL3JlZ2lzdHJ5L3JlZ2lzdHJ5Lmh0bWw8L2Fic3RyYWN0PgotICA8L2xpbms+Ci0KLSAgPGxpbmsgcmVmZXJlbmNlZE5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMS8xMC9pbnNwZWN0aW9uLyIgbG9jYXRpb249Imh0dHA6Ly93d3cueG1ldGhvZHMuY29tL2luc3BlY3Rpb24ud3NpbCIvPgotPC9pbnNwZWN0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9DYXRhbGluYVJ1bm5hYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0NhdGFsaW5hUnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliYTFmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0NhdGFsaW5hUnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmFwcHNlcnZlci5BcHBzZXJ2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaGVscC5pbnRlcm5hbC5hcHBzZXJ2ZXIuV2ViYXBwTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENhdGFsaW5hUnVubmFibGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ2F0YWxpbmFSdW5uYWJsZSBjYXRhbGluYVJ1bm5hYmxlXzsKLQotCXByaXZhdGUgQ2F0YWxpbmFSdW5uYWJsZSgpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENhdGFsaW5hUnVubmFibGUgZ2V0Q2F0YWxpbmFSdW5uYWJsZSgpIHsKLQkJaWYgKGNhdGFsaW5hUnVubmFibGVfID09IG51bGwpIHsKLQkJCWNhdGFsaW5hUnVubmFibGVfID0gbmV3IENhdGFsaW5hUnVubmFibGUoKTsKLQkJCWNhdGFsaW5hUnVubmFibGVfLmluaXQoKTsKLQkJfQotCQlyZXR1cm4gY2F0YWxpbmFSdW5uYWJsZV87Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUb21jYXRTdGFydGVkKCkgewotCQl0cnkgewotCQkJcmV0dXJuIEFwcHNlcnZlclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QXBwU2VydmVyKCkuaXNSdW5uaW5nKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRvbWNhdFBvcnQoKSB7Ci0JCXJldHVybiBXZWJhcHBNYW5hZ2VyLmdldFBvcnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJV1NFeHBsb3JlciB3c0V4cGxvcmVyID0gV1NFeHBsb3Jlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmcgY3R4dCA9IHdzRXhwbG9yZXIuZ2V0Q29udGV4dE5hbWUoKTsKLQkJU3RyaW5nIHBsdWdpbklEID0gd3NFeHBsb3Jlci5nZXRQYXJlbnRQbHVnaW5JRCgpOwotCQlTdHJpbmcgd2FyTG9jYXRpb24gPSB3c0V4cGxvcmVyLmdldFdBUkxvY2F0aW9uKCk7Ci0JCVN0cmluZyB3ZWJhcHBMb2NhdGlvbiA9IHdzRXhwbG9yZXIuZ2V0V2ViQXBwTG9jYXRpb24oKTsKLQkJdHJ5IHsKLQkJCWlmICh3YXJMb2NhdGlvbiAhPSBudWxsKQotCQkJCVdlYmFwcE1hbmFnZXIuc3RhcnQoY3R4dCwgcGx1Z2luSUQsIG5ldyBQYXRoKHdhckxvY2F0aW9uKSk7Ci0JCQllbHNlCi0JCQkJV2ViYXBwTWFuYWdlci5zdGFydChjdHh0LCBwbHVnaW5JRCwgbmV3IFBhdGgod2ViYXBwTG9jYXRpb24pKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0xhdW5jaE9wdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9MYXVuY2hPcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2NmVkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0xhdW5jaE9wdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3JlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmVhbGV5QGNhLmlibS5jb20KLSAqIAotICogVGhpcyBzaW1wbGUgY2xhc3MgaXMgdXNlZCB0byBob2xkIGEgc2luZ2xlIFdlYiBTZXJ2aWNlcwotICogRXhwbG9yZXIgbGF1bmNoIG9wdGlvbiBwcm9wZXJ0eSBhbmQgaXRzIHZhbHVlLiBBbGxvd2VkCi0gKiBsYXVuY2ggb3B0aW9uIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgYnkKLSAqIDxjb2RlPntAbGluayBMYXVuY2hPcHRpb25zfTwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hPcHRpb24gewotCXByaXZhdGUgU3RyaW5nIGtleV87Ci0KLQlwcml2YXRlIFN0cmluZyBvcHRpb25fOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGxhdW5jaCBvcHRpb24gd2l0aCB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4gCi0JICovCi0JcHVibGljIExhdW5jaE9wdGlvbihTdHJpbmcga2V5LCBTdHJpbmcgb3B0aW9uKSB7Ci0JCWtleV8gPSBrZXk7Ci0JCW9wdGlvbl8gPSBvcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGlzIGxhdW5jaCBvcHRpb24uCi0JICogQHJldHVybiBUaGUgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIGtleV87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgdGhpcyBsYXVuY2ggb3B0aW9uLgotCSAqIEByZXR1cm4gVGhlIHByb3BlcnR5IHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3B0aW9uKCkgewotCQlyZXR1cm4gb3B0aW9uXzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0xhdW5jaE9wdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTJmMDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3JlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGNicmVhbGV5QGNhLmlibS5jb20KLSAqIAotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBwcm9wZXJ0eSBuYW1lcyB1bmRlcnN0b29kIGJ5IHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIKLSAqIGFuZCB1c2VkIHRvIGNvbmZpZ3VyZSBpdCdzIGluaXRpYWwgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3VyIGF0IHRoZSB0aW1lIGl0IGlzCi0gKiBsYXVuY2hlZC4KLSAqIEBzZWUgTGF1bmNoT3B0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXVuY2hPcHRpb25zIHsKLQkvLyBHZW5lcmFsIHB1cnBvc2UgcHJlbG9hZCBjb25zdGFudHMKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9MT0NBVElPTiA9ICJzdGF0ZUxvY2F0aW9uIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZBVk9SSVRFU19MT0NBVElPTiA9ICJkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24iOwotCQotCS8vIFdTREwgUGFnZSBwcmVsb2FkIGNvbnN0YW50cwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9VUkwgPSAid3NkbCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfU0VSVklDRV9FTkRQT0lOVCA9ICJ3ZWJTZXJ2aWNlRW5kcG9pbnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9RTkFNRV9TVFJJTkcgPSAic2VydmljZVFOYW1lU3RyaW5nIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfTkFNRV9TVFJJTkcgPSAiYmluZGluZ05hbWVTdHJpbmciOwotCi0JLy8gVURESSBQYWdlIHByZWxvYWQgY29uc3RhbnRzCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlFVSVJZX1VSTCA9ICJpbnF1aXJ5IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfVVJMID0gInB1Ymxpc2giOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FID0gInNlcnZpY2VOYW1lIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfS0VZID0gInNlcnZpY2VLZXkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUklFU19ESVJFQ1RPUlkgPSAiY2F0ZWdvcmllc0RpcmVjdG9yeSI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0xhdW5jaFdpemFyZFJ1bm5hYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0xhdW5jaFdpemFyZFJ1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNzVkNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9MYXVuY2hXaXphcmRSdW5uYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5EeW5hbWljV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoV2l6YXJkUnVubmFibGUgZXh0ZW5kcyBUaHJlYWQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0KLQlwcml2YXRlIFN0cmluZyB3c2RsVVJMOwotCi0JcHJpdmF0ZSBib29sZWFuIGZpbmlzaDsKLQotCXB1YmxpYyBMYXVuY2hXaXphcmRSdW5uYWJsZShTdHJpbmcgaWQsIFN0cmluZyB3c2RsVVJMKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy53c2RsVVJMID0gKHdzZGxVUkwgIT0gbnVsbCkgPyB3c2RsVVJMIDogIiI7Ci0JCWZpbmlzaCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCUR5bmFtaWNXaXphcmQgd2l6YXJkID0gbmV3IER5bmFtaWNXaXphcmQoKTsKLQkJCXdpemFyZC5zZXRJbml0aWFsRGF0YShpZCk7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih3c2RsVVJMKTsKLQkJCXdpemFyZC5pbml0KG51bGwsIHNlbCk7Ci0JCQlXaXphcmREaWFsb2cgd2QgPSBuZXcgV2l6YXJkRGlhbG9nKG5ldyBTaGVsbChEaXNwbGF5LmdldERlZmF1bHQoKSwKLQkJCQkJU1dULkFQUExJQ0FUSU9OX01PREFMKSwgd2l6YXJkKTsKLQkJCXdkLm9wZW4oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCWZpbmlzaCA9IHRydWU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL0xhdW5jaFdpemFyZFRhc2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoV2l6YXJkVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTMyOWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvTGF1bmNoV2l6YXJkVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hXaXphcmRUYXNrIHsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBMYXVuY2hXaXphcmRUYXNrIHRhc2tfOwotCi0JLy8gdGhlIHNoZWxsIGZvciB0aGUgd2l6YXJkIHRvIGJlIGxhdW5jaGVkCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbF87Ci0KLQkvLyB0aGUgTGF1bmNoV2l6YXJkUnVubmFibGUgdGhhdCBpcyBjdXJyZW50bHkgcnVubmluZwotCXByaXZhdGUgTGF1bmNoV2l6YXJkUnVubmFibGUgcnVubmFibGVfOwotCi0JcHJpdmF0ZSBMYXVuY2hXaXphcmRUYXNrKFNoZWxsIHNoZWxsKSB7Ci0JCXNoZWxsXyA9IHNoZWxsOwotCQlydW5uYWJsZV8gPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGF1bmNoV2l6YXJkVGFzayBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHRhc2tfID09IG51bGwpCi0JCQl0YXNrXyA9IG5ldyBMYXVuY2hXaXphcmRUYXNrKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkpOwotCQlyZXR1cm4gdGFza187Ci0JfQotCi0JcHVibGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB0aHJvd3MgU1dURXhjZXB0aW9uIHsKLQkJc2hlbGxfLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrQW5kQXN5bmNFeGVjKExhdW5jaFdpemFyZFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoIWdldElzRXhlY3V0aW5nKCkpIHsKLQkJCQlhc3luY0V4ZWMocnVubmFibGUpOwotCQkJCXJ1bm5hYmxlXyA9IHJ1bm5hYmxlOwotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNFeGVjdXRpbmcoKSB7Ci0JCWlmIChydW5uYWJsZV8gIT0gbnVsbCkgewotCQkJYm9vbGVhbiBpc0ZpbmlzaCA9IHJ1bm5hYmxlXy5pc0ZpbmlzaCgpOwotCQkJaWYgKGlzRmluaXNoKQotCQkJCXJ1bm5hYmxlXyA9IG51bGw7Ci0JCQlyZXR1cm4gIWlzRmluaXNoOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9XU0V4cGxvcmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL1dTRXhwbG9yZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2NzU0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL1dTRXhwbG9yZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3JlcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsdWdpbi5FeHBsb3JlclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFdTRXhwbG9yZXIgewotCXByaXZhdGUgc3RhdGljIFdTRXhwbG9yZXIgaW5zdGFuY2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgbGF1bmNoT3B0aW9uc0tleV8gPSAwOwotCi0JcHVibGljIFdTRXhwbG9yZXIoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXU0V4cGxvcmVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgV1NFeHBsb3JlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRleHROYW1lKCkgewotCQlyZXR1cm4gIndzZXhwbG9yZXIiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBFeHBsb3JlclBsdWdpbi5JRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdBUkxvY2F0aW9uKCkgewotCQlyZXR1cm4gIndzZXhwbG9yZXIud2FyIjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkFwcExvY2F0aW9uKCkgewotCQlyZXR1cm4gIndzZXhwbG9yZXIiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2VsY29tZVVSTCgpIHsKLQkJcmV0dXJuICJ3c2V4cGxvcmVyLmpzcCI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXVuY2hPcHRpb25SZWdpc3RyeVVSTCgpIHsKLQkJcmV0dXJuICJsYXVuY2hfb3B0aW9uc19yZWdpc3RyeS5qc3AiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSTCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoImh0dHA6Ly9sb2NhbGhvc3Q6Iik7Ci0JCXNiLmFwcGVuZChDYXRhbGluYVJ1bm5hYmxlLmdldENhdGFsaW5hUnVubmFibGUoKS5nZXRUb21jYXRQb3J0KCkpOwotCQlzYi5hcHBlbmQoIi8iKTsKLQkJc2IuYXBwZW5kKGdldENvbnRleHROYW1lKCkpOwotCQlzYi5hcHBlbmQoIi8iKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXRhZGF0YURpcmVjdG9yeSgpIHsKLQkJLy8gPHdvcmtzcGFjZT4vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci8gKG5vdGUKLQkJLy8gdGhlIHRyYWlsaW5nIHNlcGFyYXRvcikuCi0JCXJldHVybiBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblN0YXRlTG9jYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVdvcmtiZW5jaCB3YiwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsLAotCQlMYXVuY2hPcHRpb25bXSBvcHRpb25zLCBib29sZWFuIGZvcmNlTGF1bmNoT3V0c2lkZUlERSkgewotCQkvLyBsYXVuY2hPcHRpb25LZXkKLQkJaW50IGxhdW5jaE9wdGlvbktleSA9IGdldExhdW5jaE9wdGlvbnNLZXkoKTsKLQkJLy8gV2ViIFNlcnZpY2VzIEV4cGxvcmVyIFVSTAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZChnZXRCYXNlVVJMKCkpOwotCQlzYi5hcHBlbmQoZ2V0V2VsY29tZVVSTCgpKTsKLQkJc2IuYXBwZW5kKCI/Iik7Ci0JCWlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5sZW5ndGggPiAwKSB7Ci0JCQlTdHJpbmcgZW5jb2RlZElEID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZW5jb2RlZElEID0gVVJMRW5jb2Rlci5lbmNvZGUoRXhwbG9yZXJQbHVnaW4uSUQsCi0JCQkJCQlFeHBsb3JlclBsdWdpbi5DSEFSU0VUKTsKLQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUV4cGxvcmVyUGx1Z2luLklELAotCQkJCQkJMCwKLQkJCQkJCUV4cGxvcmVyUGx1Z2luCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCIlTVNHX0JST0tFTl9WTV9ET0VTX05PVF9TVVBQT1JUX1VURi04IiksCi0JCQkJCQllKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChlbmNvZGVkSUQpOwotCQkJc2IuYXBwZW5kKCI9Iik7Ci0JCQlzYi5hcHBlbmQobGF1bmNoT3B0aW9uS2V5KTsKLQkJfQotCQkvLyBsYXVuY2ggV2ViIFNlcnZpY2VzIEV4cGxvcmVyCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChzYi50b1N0cmluZygpKTsKLQkJCWlmIChmb3JjZUxhdW5jaE91dHNpZGVJREUpIHsKLQkJCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJ3aW4iKSA9PSAtMSkKLQkJCQkJUnVudGltZS5nZXRSdW50aW1lKCkKLQkJCQkJCQkuZXhlYygibW96aWxsYSAiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCWVsc2UKLQkJCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYygKLQkJCQkJCQkiY21kIC9DIHN0YXJ0IGlleHBsb3JlICIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGJyb3dzZXJJZAotCQkJCVN0cmluZ0J1ZmZlciBicm93c2VySWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnJvd3NlcklkLmFwcGVuZChFeHBsb3JlclBsdWdpbi5JRCk7Ci0JCQkJYnJvd3NlcklkLmFwcGVuZChnZXRDb250ZXh0TmFtZSgpKTsKLQkJCQkKLQkJCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBFeHBsb3JlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCQkJSVdlYkJyb3dzZXIgYnJvd3NlciA9IGJyb3dzZXJTdXBwb3J0LmNyZWF0ZUJyb3dzZXIoYnJvd3NlcklkLnRvU3RyaW5nKCkpOwotCQkJCWJyb3dzZXIub3BlblVSTCh1cmwpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRXhwbG9yZXJQbHVnaW4uSUQsIDAsCi0JCQkJCUV4cGxvcmVyUGx1Z2luLmdldE1lc3NhZ2UoIiVNU0dfRVJST1JfTEFVTkNIX1dTRVhQTE9SRVIiKSwKLQkJCQkJZSk7Ci0JCX0KLQkJLy8gcmVnaXN0ZXIgbGF1bmNoIG9wdGlvbnMKLQkJaWYgKG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmxlbmd0aCA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGxhdW5jaE9wdGlvbnNSZWdVUkwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJbGF1bmNoT3B0aW9uc1JlZ1VSTC5hcHBlbmQoZ2V0QmFzZVVSTCgpKTsKLQkJCQlsYXVuY2hPcHRpb25zUmVnVVJMLmFwcGVuZChnZXRMYXVuY2hPcHRpb25SZWdpc3RyeVVSTCgpKTsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTChsYXVuY2hPcHRpb25zUmVnVVJMLnRvU3RyaW5nKCkpOwotCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCWNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7Ci0JCQkJUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKGNvbm5lY3Rpb24uZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQkJCVN0cmluZ0J1ZmZlciBwYXJhbXMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJU3RyaW5nIGVuY29kZWRJRCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJZW5jb2RlZElEID0gVVJMRW5jb2Rlci5lbmNvZGUoRXhwbG9yZXJQbHVnaW4uSUQsCi0JCQkJCQkJRXhwbG9yZXJQbHVnaW4uQ0hBUlNFVCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJRXhwbG9yZXJQbHVnaW4uSUQsCi0JCQkJCQkJMCwKLQkJCQkJCQlFeHBsb3JlclBsdWdpbgotCQkJCQkJCQkJLmdldE1lc3NhZ2UoIiVNU0dfQlJPS0VOX1ZNX0RPRVNfTk9UX1NVUFBPUlRfVVRGLTgiKSwKLQkJCQkJCQllKTsKLQkJCQl9Ci0JCQkJcGFyYW1zLmFwcGVuZChlbmNvZGVkSUQpOwotCQkJCXBhcmFtcy5hcHBlbmQoIj0iKTsKLQkJCQlwYXJhbXMuYXBwZW5kKGxhdW5jaE9wdGlvbktleSk7Ci0JCQkJcGFyYW1zLmFwcGVuZCgiJiIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAob3B0aW9uc1tpXSAhPSBudWxsKSB7Ci0JCQkJCQlwYXJhbXMuYXBwZW5kKG9wdGlvbnNbaV0uZ2V0S2V5KCkpOwotCQkJCQkJcGFyYW1zLmFwcGVuZCgiPSIpOwotCQkJCQkJU3RyaW5nIG9wdGlvbiA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW9wdGlvbiA9IFVSTEVuY29kZXIuZW5jb2RlKG9wdGlvbnNbaV0uZ2V0T3B0aW9uKCksCi0JCQkJCQkJCQlFeHBsb3JlclBsdWdpbi5DSEFSU0VUKTsKLQkJCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUV4cGxvcmVyUGx1Z2luLklELAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCUV4cGxvcmVyUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXRNZXNzYWdlKCIlTVNHX0JST0tFTl9WTV9ET0VTX05PVF9TVVBQT1JUX1VURi04IiksCi0JCQkJCQkJCQllKTsKLQkJCQkJCX0KLQkJCQkJCXBhcmFtcy5hcHBlbmQob3B0aW9uKTsKLQkJCQkJCXBhcmFtcy5hcHBlbmQoIiYiKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlvdXQucHJpbnQocGFyYW1zLnRvU3RyaW5nKCkpOwotCQkJCW91dC5jbG9zZSgpOwotCQkJCW91dCA9IG51bGw7Ci0JCQkJSW5wdXRTdHJlYW0gaXMgPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJaXMuY2xvc2UoKTsKLQkJCQlpcyA9IG51bGw7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgRXhwbG9yZXJQbHVnaW4uSUQsIDAsCi0JCQkJCQlFeHBsb3JlclBsdWdpbgotCQkJCQkJCQkuZ2V0TWVzc2FnZSgiJU1TR19FUlJPUl9MT0FEX0xBVU5DSF9PUFRJT05TIiksCi0JCQkJCQllKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBFeHBsb3JlclBsdWdpbi5JRCwgMCwgIiIsIG51bGwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBnZXRMYXVuY2hPcHRpb25zS2V5KCkgewotCQlyZXR1cm4gbGF1bmNoT3B0aW9uc0tleV8rKzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBsYXVuY2goSVdvcmtiZW5jaCB3YiwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsLAotCQkJU3RyaW5nW10gaW5xdWlyeVVSTCwgU3RyaW5nW10gcHVibGlzaFVSTCwKLQkJCWJvb2xlYW4gZm9yY2VMYXVuY2hPdXRzaWRlSURFKSB7Ci0JCWludCBpbnF1aXJ5VVJMT3B0aW9uTGVuZ3RoID0gKGlucXVpcnlVUkwgIT0gbnVsbCkgPyBpbnF1aXJ5VVJMLmxlbmd0aAotCQkJCTogMDsKLQkJaW50IHB1Ymxpc2hVUkxPcHRpb25MZW5ndGggPSAocHVibGlzaFVSTCAhPSBudWxsKSA/IHB1Ymxpc2hVUkwubGVuZ3RoCi0JCQkJOiAwOwotCQlMYXVuY2hPcHRpb25bXSBvcHRpb25zID0gbmV3IExhdW5jaE9wdGlvbltpbnF1aXJ5VVJMT3B0aW9uTGVuZ3RoCi0JCQkJKyBwdWJsaXNoVVJMT3B0aW9uTGVuZ3RoXTsKLQkJaW50IGluZGV4ID0gMDsKLQkJaWYgKGlucXVpcnlVUkwgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnF1aXJ5VVJMLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb3B0aW9uc1tpbmRleF0gPSBuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuSU5RVUlSWV9VUkwsCi0JCQkJCQlpbnF1aXJ5VVJMW2ldKTsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCWlmIChwdWJsaXNoVVJMICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHVibGlzaFVSTC5sZW5ndGg7IGkrKykgewotCQkJCW9wdGlvbnNbaW5kZXhdID0gbmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlBVQkxJU0hfVVJMLAotCQkJCQkJcHVibGlzaFVSTFtpXSk7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGF1bmNoKHdiLCBzZWwsIG9wdGlvbnMsIGZvcmNlTGF1bmNoT3V0c2lkZUlERSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9XU0V4cGxvcmVyQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9XU0V4cGxvcmVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDhlZTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvV1NFeHBsb3JlckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NFeHBsb3JlckNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL1dTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2OTc1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL1dTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgY2JyZWFsZXlAY2EuaWJtLmNvbQotICogCi0gKiBUaGlzIDxjb2RlPkNvbW1hbmQ8L2NvZGU+LCB3aGVuIGV4ZWN1dGVkLCBsYXVuY2hlcyB0aGUKLSAqIFdlYiBTZXJ2aWNlcyBFeHBsb3Jlci4KLSAqLwotcHVibGljIGNsYXNzIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQgZXh0ZW5kcyBTaW1wbGVDb21tYW5kIHsKLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VMYXVuY2hPdXRzaWRlSURFOwotCi0JcHJpdmF0ZSBMYXVuY2hPcHRpb25bXSBsYXVuY2hPcHRpb25zOwotCi0JcHVibGljIFdTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQoKSB7Ci0JCXN1cGVyKCJXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kIiwgIldTRXhwbG9yZXJMYXVuY2hlckNvbW1hbmQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZUNhdGVnb3J5SW5mbyhTdHJpbmcgaW5xdWlyeVVSTCwgU3RyaW5nIGNhdGVnb3JpZXNEaXJlY3RvcnkpIHsKLQkJdHJ5IHsKLQkJCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwLnNldFByb3BlcnR5KExhdW5jaE9wdGlvbnMuQ0FURUdPUklFU19ESVJFQ1RPUlksCi0JCQkJCWNhdGVnb3JpZXNEaXJlY3RvcnkpOwotCQkJU3RyaW5nQnVmZmVyIHByb3BlcnRpZXNGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXByb3BlcnRpZXNGaWxlTmFtZS5hcHBlbmQoV1NFeHBsb3Jlci5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRNZXRhZGF0YURpcmVjdG9yeSgpKTsKLQkJCUZpbGUgbWV0YWRhdGFEaXJlY3RvcnlGaWxlID0gbmV3IEZpbGUocHJvcGVydGllc0ZpbGVOYW1lLnRvU3RyaW5nKCkpOwotCQkJaWYgKCFtZXRhZGF0YURpcmVjdG9yeUZpbGUuZXhpc3RzKCkpIHsKLQkJCQltZXRhZGF0YURpcmVjdG9yeUZpbGUubWtkaXJzKCk7Ci0JCQl9Ci0JCQlwcm9wZXJ0aWVzRmlsZU5hbWUuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGlucXVpcnlVUkwsIlVURi04IikpLmFwcGVuZCgKLQkJCQkJIi5wcm9wZXJ0aWVzIik7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZU5hbWUKLQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJcC5zdG9yZShmb3V0LCBudWxsKTsKLQkJCWZvdXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZSgpIHsKLQkJcmV0dXJuIFdTRXhwbG9yZXIuZ2V0SW5zdGFuY2UoKS5sYXVuY2gobnVsbCwgbnVsbCwgbGF1bmNoT3B0aW9ucywKLQkJCQlmb3JjZUxhdW5jaE91dHNpZGVJREUpOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQkJcmV0dXJuIEVudmlyb25tZW50VXRpbHMuY29udmVydElTdGF0dXNUb1N0YXR1cyhleGVjdXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmb3JjZUxhdW5jaE91dHNpZGVJREUKLQkgKiAgICAgICAgICAgIFRoZSBmb3JjZUxhdW5jaE91dHNpZGVJREUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcmNlTGF1bmNoT3V0c2lkZUlERShib29sZWFuIGZvcmNlTGF1bmNoT3V0c2lkZUlERSkgewotCQl0aGlzLmZvcmNlTGF1bmNoT3V0c2lkZUlERSA9IGZvcmNlTGF1bmNoT3V0c2lkZUlERTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGF1bmNoT3B0aW9ucwotCSAqICAgICAgICAgICAgVGhlIGxhdW5jaE9wdGlvbnMgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdW5jaE9wdGlvbnMoTGF1bmNoT3B0aW9uW10gbGF1bmNoT3B0aW9ucykgewotCQl0aGlzLmxhdW5jaE9wdGlvbnMgPSBsYXVuY2hPcHRpb25zOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL2Zhdm9yaXRlcy9GYXZvcml0ZXNSZWdpc3RyeVR5cGVEZWZhdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL2Zhdm9yaXRlcy9GYXZvcml0ZXNSZWdpc3RyeVR5cGVEZWZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODE2OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5mYXZvcml0ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLldTSUxEb2N1bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzLkZhdm9yaXRlc1JlZ2lzdHJ5VHlwZUFic3RyYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzLklGYXZvcml0ZXNVRERJUmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNSZWdpc3RyeVR5cGVEZWZhdWx0IGV4dGVuZHMgRmF2b3JpdGVzUmVnaXN0cnlUeXBlQWJzdHJhY3QgewotCXByaXZhdGUgc3RhdGljIFdTSUxEb2N1bWVudCB3c2lsRG9jXzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVk9SSVRFU19ERUZBVUxUID0gInByb3BlcnRpZXMvZmF2b3JpdGVzX2RlZmF1bHQud3NpbCI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc18gPSBudWxsOwotCi0JcHVibGljIEZhdm9yaXRlc1JlZ2lzdHJ5VHlwZURlZmF1bHQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXdzaWxEb2NfID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdChTdHJpbmcgZGVmYXVsdEZhdm9yaXRlcykgewotCQlzdXBlcigpOwotCQl3c2lsRG9jXyA9IG51bGw7Ci0JCWRlZmF1bHRGYXZvcml0ZXNfID0gZGVmYXVsdEZhdm9yaXRlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlYWRMb2NhdGlvbigpIHsKLQkJU3RyaW5nQnVmZmVyIHJlYWRMb2NhdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGRlZmF1bHRGYXZvcml0ZXNfID09IG51bGwpCi0JCXsKLQkJCXJlYWRMb2NhdGlvbi5hcHBlbmQoRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSk7Ci0JCQlyZWFkTG9jYXRpb24uYXBwZW5kKEZBVk9SSVRFU19ERUZBVUxUKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXJlYWRMb2NhdGlvbi5hcHBlbmQoZGVmYXVsdEZhdm9yaXRlc18pOwotCQl9Ci0JCXJldHVybiByZWFkTG9jYXRpb24udG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdyaXRlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBXU0lMRG9jdW1lbnQgZ2V0V1NJTERvY3VtZW50KCkgewotCQlpZiAod3NpbERvY18gPT0gbnVsbCkgewotCQkJd3NpbERvY18gPSBsb2FkV1NJTERvY3VtZW50KGdldFJlYWRMb2NhdGlvbigpLCB0cnVlKTsKLQkJCUlGYXZvcml0ZXNVRERJUmVnaXN0cnlbXSByZWdpc3RyaWVzID0gZ2V0RmF2b3JpdGVzVURESVJlZ2lzdHJpZXMoKTsKLQkJCS8qIFRPRE86IFB1YmxpYyByZWdpc3RyeSBzdHJpbmdzIHNob3VsZG4ndCBiZSBpbiBwcm9wZXJ0aWVzIC0gQWluJ3QgZXh0ZW5zaWJsZS4KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaXN0cmllcy5sZW5ndGg7IGkrKykgewotCQkJCXJlZ2lzdHJpZXNbaV0uc2V0TmFtZShXU1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhyZWdpc3RyaWVzW2ldLmdldE5hbWUoKSkpOwotCQkJfQotCQkJKi8KLQkJfQotCQlyZXR1cm4gd3NpbERvY187Ci0JfQotCi0JcHVibGljIFdTSUxEb2N1bWVudCBnZXRGYXZvcml0ZXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZ2V0V1NJTERvY3VtZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBXU0lMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9mYXZvcml0ZXMvRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL2Zhdm9yaXRlcy9GYXZvcml0ZXNSZWdpc3RyeVR5cGVXU0UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZmM4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL2Zhdm9yaXRlcy9GYXZvcml0ZXNSZWdpc3RyeVR5cGVXU0UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuZmF2b3JpdGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLldTSUxEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzLkZhdm9yaXRlc1JlZ2lzdHJ5VHlwZUFic3RyYWN0OwotCi0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNSZWdpc3RyeVR5cGVXU0UgZXh0ZW5kcyBGYXZvcml0ZXNSZWdpc3RyeVR5cGVBYnN0cmFjdAotewotICBwcml2YXRlIHN0YXRpYyBXU0lMRG9jdW1lbnQgd3NpbERvY187Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBVk9SSVRFU19XU0VYUExPUkVSID0gImZhdm9yaXRlcy53c2lsIjsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc18gPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBzdGF0ZUxvY2F0aW9uXyA9IG51bGw7Ci0gIAotICBwdWJsaWMgRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgd3NpbERvY18gPSBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFKFN0cmluZyBkZWZhdWx0RmF2b3JpdGVzLCBTdHJpbmcgc3RhdGVMb2NhdGlvbikgewotCXN1cGVyKCk7Ci0Jd3NpbERvY18gPSBudWxsOwotCWRlZmF1bHRGYXZvcml0ZXNfID0gZGVmYXVsdEZhdm9yaXRlczsKLQlzdGF0ZUxvY2F0aW9uXyA9IHN0YXRlTG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRMb2NhdGlvbigpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVhZExvY2F0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHJlYWRMb2NhdGlvbi5hcHBlbmQoc3RhdGVMb2NhdGlvbl8gPT0gbnVsbCA/IEV4cGxvcmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbigpIDogc3RhdGVMb2NhdGlvbl8pOwotICAgIHJlYWRMb2NhdGlvbi5hcHBlbmQoRkFWT1JJVEVTX1dTRVhQTE9SRVIpOwotICAgIHJldHVybiByZWFkTG9jYXRpb24udG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0UmVhZExvY2F0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgV1NJTERvY3VtZW50IGdldFdTSUxEb2N1bWVudCgpCi0gIHsKLSAgICBpZiAod3NpbERvY18gPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2lsRG9jXyA9IGxvYWRXU0lMRG9jdW1lbnQoZ2V0UmVhZExvY2F0aW9uKCksIGZhbHNlKTsKLSAgICAgIGlmICh3c2lsRG9jXyA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN0b3JlRmF2b3JpdGVzRGVmYXVsdCgpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHNhdmUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd3NpbERvY187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZXN0b3JlRmF2b3JpdGVzRGVmYXVsdCgpCi0gIHsKLSAgICB3c2lsRG9jXyA9IChuZXcgRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdChkZWZhdWx0RmF2b3JpdGVzXykpLmdldFdTSUxEb2N1bWVudCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsdWdpbi9FeHBsb3JlclBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbHVnaW4vRXhwbG9yZXJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkZGQ1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsdWdpbi9FeHBsb3JlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoV2l6YXJkVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuZmF2b3JpdGVzLkZhdm9yaXRlc1JlZ2lzdHJ5VHlwZURlZmF1bHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBsb3JlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLSAgLyoqCi0gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgcGx1Z2luIGluIHBsdWdpbi54bWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gIlVURi04IjsKLSAgLyoqCi0gICAqIFRoZSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIEV4cGxvcmVyUGx1Z2luIGluc3RhbmNlXzsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIHJ1bnRpbWUgcGx1Z2luIG9iamVjdCBmb3IgdGhpcyBwbHVnaW4uIFRoZSAicGx1Z2luIiBlbGVtZW50Ci0gICAqIGluIHBsdWdpbi54bWwgc2hvdWxkIGluY2x1ZGUgdGhlIGF0dHJpYnV0ZSBjbGFzcyA9Ci0gICAqICJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luIi4KLSAgICogCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAqICAgICAgICAgICAgVGhlIGRlc2NyaXB0b3Igb2YgdGhpcyBwbHVnaW4uCi0gICAqLwotICBwdWJsaWMgRXhwbG9yZXJQbHVnaW4oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBpbnN0YW5jZV8gPSB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4gRXF1aXZhbGVudCB0byBjYWxsaW5nCi0gICAqIChFeHBsb3JlclBsdWdpbilQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLndzdC53cy5leHBsb3JlciIpOwotICAgKiAKLSAgICogQHJldHVybiBUaGUgRXhwbG9yZXJQbHVnaW4gc2luZ2xldG9uLgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBFeHBsb3JlclBsdWdpbiBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2VfOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCBvbmNlIGJ5IHRoZSBwbGF0Zm9ybSB3aGVuIHRoaXMgcGx1Z2luIGlzIGZpcnN0IGxvYWRlZC4KLSAgICogCi0gICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgKiAgICAgICAgICAgICBJZiB0aGlzIHBsdWdpbiBmYWlscyB0byBzdGFydC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zdGFydChidW5kbGUpOwotICAgIC8vIGluaXQgdGhlIHNoZWxsIG9mIExhdW5jaFdpemFyZFRhc2sKLSAgICBMYXVuY2hXaXphcmRUYXNrLmdldEluc3RhbmNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgdW5sb2FkZWQuCi0gICAqIAotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICogICAgICAgICAgICAgSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc2h1dGRvd24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zdG9wKGJ1bmRsZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlCi0gICAqIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gICAqIAotICAgKiBAcGFyYW0ga2V5Ci0gICAqICAgICAgICAgICAgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuIFRoYXQgaXMsIHRoZQotICAgKiAgICAgICAgICAgIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIgd2hlcmUgdGhlCi0gICAqICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlIGZvcm06ICJLRVkgPQotICAgKiAgICAgICAgICAgIHZhbHVlIi4KLSAgICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoaW5zdGFuY2VfLmdldEJ1bmRsZSgpLCBrZXkpOyAKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUKLSAgICogcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4gU3Vic3RpdHV0aW9uIHNlcXVlbmNlcwotICAgKiBpbiB0aGUgbWVzc2FnZSBzdHJpbmcgYXJlIHJlcGxhY2VkIGJ5IHRoZSBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24KLSAgICogb2JqZWN0cyAod2hpY2ggYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ci0gICAqIGZvciBmdXJ0aGVyIGRldGFpbHMgb24gc3Vic3RpdHV0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGtleQotICAgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLiBUaGF0IGlzLCB0aGUKLSAgICogICAgICAgICAgICBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiIHdoZXJlIHRoZQotICAgKiAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgY29udGFpbnMgYSBsaW5lIG9mIHRoZSBmb3JtOiAiS0VZID0KLSAgICogICAgICAgICAgICB2YWx1ZSIuCi0gICAqIEBwYXJhbSBhcmdzCi0gICAqICAgICAgICAgICAgVGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlIGFzIHJlcXVpcmVkIGJ5IHRoZQotICAgKiAgICAgICAgICAgIG1lc3NhZ2UgaW4gcGx1Z2luLnByb3BlcnRpZXMgYW5kIGJ5IHRoZSBydWxlcyBvZiBjbGFzcwotICAgKiAgICAgICAgICAgIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgotICAgKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksIGFyZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlIGFzIHJlbGF0aXZlIHRvIHRoZQotICAgKiBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAgICogCi0gICAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCBpbnN0YWxsVVJMID0gaW5zdGFuY2VfLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0gICAgICBVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIG5hbWUpOwotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZWUgSVBsdWdpbkhlbHBlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1zZ0xvZ2dlckNvbmZpZyhIYXNodGFibGUgbXNnTG9nZ2VyQ29uZmlnKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogU2VlIElQbHVnaW5IZWxwZXIuCi0gICAqLwotICBwdWJsaWMgSGFzaHRhYmxlIGdldE1zZ0xvZ2dlckNvbmZpZyhQbHVnaW4gcGx1Z2luKQotICB7Ci0gICAgcmV0dXJuIG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZWUgSVBsdWdpbkhlbHBlci4KLSAgICovCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0TXNnTG9nZ2VyQ29uZmlnKCkKLSAgewotICAgIHJldHVybiBnZXRNc2dMb2dnZXJDb25maWcodGhpcyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIFBsYXRmb3JtLmdldFBsdWdpblN0YXRlTG9jYXRpb24odGhpcykuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS50b09TU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbigpCi0gIHsKLQlyZXR1cm4gZ2V0UGx1Z2luSW5zdGFsbExvY2F0aW9uKCkrRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdC5GQVZPUklURVNfREVGQVVMVDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoaW5zdGFuY2VfLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wb3B1cC9Qb3B1cFRlc3RXU0RMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BvcHVwL1BvcHVwVGVzdFdTREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2ODAzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BvcHVwL1BvcHVwVGVzdFdTREwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wb3B1cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuTGF1bmNoT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5MYXVuY2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5XU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbHVnaW4uRXhwbG9yZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vbml0b3IuR2V0TW9uaXRvckNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBQb3B1cFRlc3RXU0RMIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17Ci0gIHB1YmxpYyBQb3B1cFRlc3RXU0RMKCkKLSAgewotICAgIHN1cGVyKEV4cGxvcmVyUGx1Z2luLmdldE1lc3NhZ2UoIiVQT1BVUF9URVNUX1dTREwiKSk7Ci0gIH0KLQotICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFdvcmtiZW5jaFNlbGVjdGlvbigpCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgaWYgKHdpbmRvdyAhPSBudWxsKQotICAgIHsKLSAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgcmV0dXJuIChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotCVN0cmluZyBzdGF0ZUxvY2F0aW9uID0gRXhwbG9yZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCk7Ci0JU3RyaW5nIGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbiA9IEV4cGxvcmVyUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKCk7Ci0gIAlXU0V4cGxvcmVyTGF1bmNoZXJDb21tYW5kIGNvbW1hbmQgPSBuZXcgV1NFeHBsb3JlckxhdW5jaGVyQ29tbWFuZCgpOwotICAgIGNvbW1hbmQuc2V0Rm9yY2VMYXVuY2hPdXRzaWRlSURFKGZhbHNlKTsKLSAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRXb3JrYmVuY2hTZWxlY3Rpb24oKTsKLSAgICBWZWN0b3IgbGF1bmNoT3B0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgd3NkbFVSTCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlIHdzZGxGaWxlID0gKChJUmVzb3VyY2Upb2JqZWN0KS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdzZGxVUkwgPSB3c2RsRmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgd3NkbFVSTCA9IHdzZGxGaWxlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFRPRE86IE1vdmUgdGhpcyB1cCB0byBvcmcuZWNsaXBzZS5qc3Qud3MudWkuCi0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlSW1wbCkKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2VJbXBsIHNlcnZpY2VJbXBsID0gKFNlcnZpY2VJbXBsKW9iamVjdDsKLSAgICAgICAgICB3c2RsVVJMID0gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoc2VydmljZUltcGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlUmVmKQotICAgICAgICB7Ci0gICAgICAgICAgU2VydmljZVJlZiBzZXJ2aWNlSW1wbCA9IChTZXJ2aWNlUmVmKW9iamVjdDsKLSAgICAgICAgICB3c2RsVVJMID0gSjJFRUFjdGlvbkFkYXB0ZXJGYWN0b3J5LmdldFdTRExVUkkoc2VydmljZUltcGwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgV1NETFJlc291cmNlSW1wbCBXU0RMUkltcGwgPSAoV1NETFJlc291cmNlSW1wbClvYmplY3Q7Ci0gICAgICAgICAgd3NkbFVSTCA9IEoyRUVBY3Rpb25BZGFwdGVyRmFjdG9yeS5nZXRXU0RMVVJJKFdTRExSSW1wbCk7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgR2V0TW9uaXRvckNvbW1hbmQgZ2V0TW9uaXRvckNtZCA9IG5ldyBHZXRNb25pdG9yQ29tbWFuZCgpOwotICAgICAgICBnZXRNb25pdG9yQ21kLnNldE1vbml0b3JTZXJ2aWNlKHRydWUpOwotICAgICAgICBnZXRNb25pdG9yQ21kLnNldENyZWF0ZShmYWxzZSk7Ci0gICAgICAgIGdldE1vbml0b3JDbWQuc2V0V2ViU2VydmljZXNQYXJzZXIobmV3IFdlYlNlcnZpY2VzUGFyc2VyKCkpOwotICAgICAgICBnZXRNb25pdG9yQ21kLnNldFdzZGxVUkkod3NkbFVSTCk7Ci0gICAgICAgIGdldE1vbml0b3JDbWQuZXhlY3V0ZShudWxsKTsKLSAgICAgICAgTGlzdCBlbmRwb2ludHMgPSBnZXRNb25pdG9yQ21kLmdldEVuZHBvaW50cygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGVuZHBvaW50c0l0ID0gZW5kcG9pbnRzLml0ZXJhdG9yKCk7IGVuZHBvaW50c0l0Lmhhc05leHQoKTspCi0gICAgICAgICAgbGF1bmNoT3B0aW9ucy5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLldFQl9TRVJWSUNFX0VORFBPSU5ULCAoU3RyaW5nKWVuZHBvaW50c0l0Lm5leHQoKSkpOwotICAgICAgICBsYXVuY2hPcHRpb25zLmFkZChuZXcgTGF1bmNoT3B0aW9uKExhdW5jaE9wdGlvbnMuV1NETF9VUkwsIHdzZGxVUkwpKTsKLQkJbGF1bmNoT3B0aW9ucy5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLlNUQVRFX0xPQ0FUSU9OLHN0YXRlTG9jYXRpb24pKTsKLQkJbGF1bmNoT3B0aW9ucy5hZGQobmV3IExhdW5jaE9wdGlvbihMYXVuY2hPcHRpb25zLkRFRkFVTFRfRkFWT1JJVEVTX0xPQ0FUSU9OLGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbikpOwotICAgICAgfQotICAgIH0KLSAgICBjb21tYW5kLnNldExhdW5jaE9wdGlvbnMoKExhdW5jaE9wdGlvbltdKWxhdW5jaE9wdGlvbnMudG9BcnJheShuZXcgTGF1bmNoT3B0aW9uWzBdKSk7Ci0gICAgY29tbWFuZC5leGVjdXRlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICBydW4oKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZjhlMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuQ3VycmVudE5vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi0vLyBBYnN0cmFjdCBhY3Rpb24gY2xhc3MgdXNlZCBmb3IgYm90aCBMaW5rIGFuZCBGb3JtIGFjdGlvbnMuCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBDb250cm9sbGVyIGNvbnRyb2xsZXJfOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnR5VGFibGVfOwotICBwcm90ZWN0ZWQgVmVjdG9yIHJlbW92ZWRQcm9wZXJ0aWVzXzsKLQotICBwdWJsaWMgQWN0aW9uKCkKLSAgewotICAgIHRoaXMobnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKLSAgICBwcm9wZXJ0eVRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICByZW1vdmVkUHJvcGVydGllc18gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgQ29udHJvbGxlciBnZXRDb250cm9sbGVyKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXzsKLSAgfQotCi0gIC8qKgotICAqIFJlYWQgcHJvcGVydGllcyBmcm9tIGFuIEh0dHBTZXJ2bGV0UmVxdWVzdCBhbmQgYWRkIHRoZW0gdG8gdGhlIHByb3BlcnR5IHRhYmxlLgotICAqIEBwYXJhbSBIdHRwU2VydmxldFJlcXVlc3QgVGhlIEh0dHBTZXJ2bGV0UmVxdWVzdCBjb250YWluaW5nIHRoZSBlbWJlZGRlZCBwYXJhbWV0ZXJzLgotICAqIEByZXR1cm4gYm9vbGVhbiBXaGV0aGVyIG9yIG5vdCB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpOwotCi0gIC8qKgotICAqIEdldCB0aGUgcHJvcGVydHkgdGFibGUuCi0gICogQHJldHVybiBIYXNodGFibGUgQSBoYXNodGFibGUgY29udGFpbmluZyB0aGUgcHJvcGVydGllcyBmb3IgdGhpcyBhY3Rpb24uCi0gICovCi0gIHB1YmxpYyBmaW5hbCBIYXNodGFibGUgZ2V0UHJvcGVydHlUYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydHlUYWJsZV87Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHByb3BlcnR5IHRhYmxlLgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5VGFibGUoSGFzaHRhYmxlIHByb3BlcnR5VGFibGUpCi0gIHsKLSAgIHByb3BlcnR5VGFibGVfID0gcHJvcGVydHlUYWJsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIHByb3BlcnR5IHRvIHRoZSBwcm9wZXJ0eSB0YWJsZS4KLSAgICogQHBhcmFtIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFkZFByb3BlcnR5KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIHByb3BlcnR5VGFibGVfLnB1dChrZXksIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAqIFJlbW92ZSBhIHByb3BlcnR5IGZyb20gdGhlIHByb3BlcnR5IHRhYmxlLiBUcmFjayB0aGUgZGVsZXRpb25zLgotICAqIEBwYXJhbSBPYmplY3QgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgcmVtb3ZlZC4KLSAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlUHJvcGVydHkoT2JqZWN0IGtleSkKLSAgewotICAgIHByb3BlcnR5VGFibGVfLnJlbW92ZShrZXkpOwotICAgIHJlbW92ZWRQcm9wZXJ0aWVzXy5hZGRFbGVtZW50KGtleSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSBnZXRQcm9wZXJ0eUFzU3RyaW5nQXJyYXkoT2JqZWN0IGtleSkKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBwcm9wZXJ0eVRhYmxlXy5nZXQoa2V5KTsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nW10pCi0gICAgICByZXR1cm4gKFN0cmluZ1tdKW9iamVjdDsKLSAgICBlbHNlIGlmIChvYmplY3QgIT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge29iamVjdC50b1N0cmluZygpfTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4ZWN1dGUoKQotICB7Ci0gICAgcmV0dXJuIGV4ZWN1dGUodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBleGVjdXRlKGJvb2xlYW4gdXNlQWN0aW9uRW5naW5lKQotICB7Ci0gICAgaWYgKHVzZUFjdGlvbkVuZ2luZSkKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRBY3Rpb25FbmdpbmUoKS5leGVjdXRlQWN0aW9uKHRoaXMpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBydW4oKTsKLSAgfQotCi0gIC8vIEFic3RyYWN0IG1ldGhvZCBmb3IgcnVubmluZyB0aGlzIGFjdGlvbi4KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcnVuKCk7Ci0gIAotICAvKioKLSAgKiBSZXR1cm4gdGhlIHRyYW5zZm9ybWVycyB1c2VkIHRvIG5vcm1hbGl6ZSB0aGUgaW5wdXQvb3V0cHV0IHBhcmFtZXRlcnMgZm9yIHRoaXMgYWN0aW9uCi0gICogQHJldHVybiBJVHJhbnNmb3JtZXJbXQotICAqLwotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIHJldHVybiBuZXcgSVRyYW5zZm9ybWVyW10ge25ldyBDdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKX07Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24oUGVyc3BlY3RpdmUgcGVyc3BlY3RpdmUsTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSxTdHJpbmcgZXhjZXB0aW9uTmFtZSxUaHJvd2FibGUgdCkKLSAgewotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHBlcnNwZWN0aXZlLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShleGNlcHRpb25OYW1lKTsKLSAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh0LmdldE1lc3NhZ2UoKSk7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0NoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZmNlZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1wdWJsaWMgY2xhc3MgQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gImFjdGlvbnMvQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb25KU1AuanNwIjsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9DbGVhck5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQzZGI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsZWFyTm9kZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24KLXsKLSAgcHVibGljIENsZWFyTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLG5vZGVNYW5hZ2VyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaWYgKCFpc1N0YWxlTm9kZShub2RlSWQpKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJZCk7Ci0gICAgICBUcmVlRWxlbWVudCBlbGVtZW50ID0gbm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgICAvLyBEbyBub3QgYWRkIHRoaXMgdG8gdGhlIGhpc3RvcnkuCi0gICAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gY29udHJvbGxlcl8uZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfSU5GT19OT0RFX0NMRUFSRUQiLG5vZGUuZ2V0Tm9kZU5hbWUoKSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvLyBEZWxldGluZyBhIG5vZGUgZnJvbSB0aGUgdHJlZSByZXN1bHRzIGluIGNoYW5nZXMgdG8gdGhlIHRyZWV2aWV3IGFuZCBzdGF0dXMgY29udGVudHMuCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0NsZWFyVmlld0VsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0NsZWFyVmlld0VsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2MTRlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9DbGVhclZpZXdFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLS8vIEFic3RyYWN0IGFjdGlvbiBjbGFzcyB1c2VkIGZvciBib3RoIExpbmsgYW5kIEZvcm0gYWN0aW9ucy4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGVhclZpZXdFbGVtZW50QWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwcml2YXRlIFN0cmluZyBsaXN0TWFuYWdlclJlbF87Ci0gIHByaXZhdGUgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBwdWJsaWMgQ2xlYXJWaWV3RWxlbWVudEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsU3RyaW5nIGxpc3RNYW5hZ2VyUmVsKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgbm9kZU1hbmFnZXJfICA9IG5vZGVNYW5hZ2VyOwotICAgIGxpc3RNYW5hZ2VyUmVsXyA9IGxpc3RNYW5hZ2VyUmVsOwotICB9Ci0KLSAgLy8gLi4uanNwP3ZpZXdJZD0uLi4KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nIHZpZXdJZFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIC8vIFBlcmZvcm0gZGF0YSB2YWxpZGF0aW9uLgotICAgIHRyeQotICAgIHsKLSAgICAgIGludCB2aWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZpZXdJZFN0cmluZyk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBWYWxpZGF0aW9uIGZhaWxlZCEKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsdmlld0lkU3RyaW5nKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgdmlld0lkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVklFV0lEKSk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVmlld1Rvb2wgdmlld1Rvb2wgPSAoVmlld1Rvb2wpc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgaWYgKHZpZXdUb29sLmdldFRvb2xNYW5hZ2VyKHZpZXdJZCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBTdGFsZSB2aWV3LgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBUcmVlRWxlbWVudCBlbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgTGlzdE1hbmFnZXIgbGlzdE1hbmFnZXIgPSAoTGlzdE1hbmFnZXIpZWxlbWVudC5nZXRQcm9wZXJ0eUFzT2JqZWN0KGxpc3RNYW5hZ2VyUmVsXyk7Ci0gICAgbGlzdE1hbmFnZXIucmVtb3ZlRWxlbWVudFdpdGhWaWV3SWQodmlld0lkKTsKLSAgICB2aWV3VG9vbC5jbGVhclZpZXdUb29sTWFuYWdlcih2aWV3SWQpOwotICAgIHNlbGVjdGVkTm9kZS5zZXRWaWV3SWQoQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSAgICAvLyBEbyBub3QgYWRkIHRoaXMgdG8gdGhlIGhpc3RvcnkuCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0Zvcm1BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0Zvcm1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3OTY1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Gb3JtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9ybUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwdWJsaWMgRm9ybUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHBvcHVsYXRlUHJvcGVydHlUYWJsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlciA9IG5ldyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlcigpOwotICAgICAgcGFyc2VyLnBhcnNlUmVxdWVzdChyZXF1ZXN0LEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKTsKLSAgICAgIGdldFNlbGVjdGVkRm9ybVRvb2woKS5jbGVhckVycm9ycygpOwotICAgICAgYm9vbGVhbiByZXN1bHQgPSBwcm9jZXNzUGFyc2VkUmVzdWx0cyhwYXJzZXIpOwotICAgICAgcmVtb3ZlZFByb3BlcnRpZXNfLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBjYXRjaCAoTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlUYWJsZShIYXNodGFibGUgcHJvcGVydHlUYWJsZSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHByb2Nlc3NQYXJzZWRSZXN1bHRzKG5ldyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlcihwcm9wZXJ0eVRhYmxlKSk7Ci0gICAgfQotICAgIGNhdGNoIChNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiBtZmRlKQotICAgIHsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHByb3BlcnR5VGFibGUua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPYmplY3Qga2V5ID0gaXQubmV4dCgpOwotICAgICAgSGFzaHRhYmxlIHRoaXNQcm9wZXJ0eVRhYmxlID0gZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICAgaWYgKCF0aGlzUHJvcGVydHlUYWJsZS5jb250YWluc0tleShrZXkpKQotICAgICAgICBhZGRQcm9wZXJ0eShrZXksIHByb3BlcnR5VGFibGUuZ2V0KGtleSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFRvSGlzdG9yeShpbnQgcGVyc3BlY3RpdmVJZCxTdHJpbmcgdXJsKQotICB7Ci0gICAgY29udHJvbGxlcl8uYWRkVG9IaXN0b3J5KHBlcnNwZWN0aXZlSWQsdXJsKTsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Gb3JtSW5wdXRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0Zvcm1JbnB1dEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjk0YTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0Zvcm1JbnB1dEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi0vLyBBIGNsYXNzIGZvciByZXBvcnRpbmcgZm9ybSBpbnB1dCBleGNlcHRpb25zLgotcHVibGljIGNsYXNzIEZvcm1JbnB1dEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc4NDY2MDE2ODU5Mzg3NDJMOwotCi1wdWJsaWMgRm9ybUlucHV0RXhjZXB0aW9uKFN0cmluZyBtc2cpCi0gIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWZjMjExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwdWJsaWMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgLy8gb3MgaXMgdGhlIE91dHB1dFN0cmVhbSBvZiB0aGUgZmlsZSBpbiB0aGUgZmlsZSBzeXN0ZW0KLSAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gd3JpdGUoT3V0cHV0U3RyZWFtIG9zKTsKLQotICAvLyB0aGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgZmlsZQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRGaWxlTmFtZSgpOwotCi0gIHB1YmxpYyBib29sZWFuIHdyaXRlV1NETERlZmluaXRpb24oT3V0cHV0U3RyZWFtIG9zLCBEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBXU0RMRmFjdG9yeSB3c2RsRmFjdG9yeSA9IG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExXcml0ZXIoKTsKLSAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIG9zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHdyaXRlV1NJTERvY3VtZW50KE91dHB1dFN0cmVhbSBvcywgV1NJTERvY3VtZW50IHdzaWxEb2MpCi0gIHsKLSAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zKTsKLSAgICAgIHdzaWxEb2Mud3JpdGUob3N3KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChvc3cgIT0gbnVsbCkKLSAgICAgICAgICBvc3cuY2xvc2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElELCBTdHJpbmcganNwUGFnZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcihqc3BQYWdlKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPycpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgbm9kZUlEID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgU3RyaW5nIHRvb2xJRCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIFN0cmluZyB2aWV3SUQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICBTdHJpbmcgdmlld1Rvb2xJRCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRCk7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KHRvb2xJRCk7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KHZpZXdJRCk7Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KHZpZXdUb29sSUQpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIG5vZGVJRCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlRPT0xJRCwgdG9vbElEKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVklFV0lELCB2aWV3SUQpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXVE9PTElELCB2aWV3VG9vbElEKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNzY2MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c2lsLkFkZFdTRExUb1dTSUxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VFbnZpcm9ubWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGV4dGVuZHMgRm9ybUFjdGlvbiB7Ci0gIHByaXZhdGUgSVdvcmtzcGFjZVJvb3QgaVdvcmtzcGFjZVJvb3RfOwotICBwcml2YXRlIElQcm9qZWN0IGlQcm9qZWN0XzsKLSAgcHJpdmF0ZSBJUmVzb3VyY2UgdGFyZ2V0RmlsZVJlc291cmNlXzsKLQotICAgIHB1YmxpYyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgICAgIGlXb3Jrc3BhY2VSb290XyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24gewotICAgICAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICAgICAgTWVzc2FnZVF1ZXVlIG1zZ1F1ZXVlID0gY29udHJvbGxlcl8uZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgICAgICBTdHJpbmcgd29ya2JlbmNoUHJvamVjdE5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgaWYgKHdvcmtiZW5jaFByb2plY3ROYW1lID09IG51bGwgfHwgd29ya2JlbmNoUHJvamVjdE5hbWUubGVuZ3RoKCkgPD0gMCkgewotICAgICAgICAgICAgbXNnUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9XT1JLQkVOQ0hfUFJPSkVDVCIpKTsKLSAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpUHJvamVjdF8gPSBpV29ya3NwYWNlUm9vdF8uZ2V0UHJvamVjdCh3b3JrYmVuY2hQcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLldPUktCRU5DSF9QUk9KRUNUX05BTUUsIHdvcmtiZW5jaFByb2plY3ROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgaW1wb3J0RmlsZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLklNUE9SVF9GSUxFKTsKLSAgICAgICAgaWYgKGltcG9ydEZpbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5JTVBPUlRfRklMRSwgQWN0aW9uSW5wdXRzLklNUE9SVF9GSUxFKTsKLSAgICAgICAgICAgIFN0cmluZyBpbXBvcnRlZEZpbGVOYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FKTsKLSAgICAgICAgICAgIGlmIChpbXBvcnRlZEZpbGVOYW1lID09IG51bGwgfHwgaW1wb3J0ZWRGaWxlTmFtZS5sZW5ndGgoKSA8PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfRklMRV9OQU1FIikpOwotICAgICAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5JTVBPUlRFRF9GSUxFX05BTUUsIGltcG9ydGVkRmlsZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBpbXBvcnRUb1dTSUwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5JTVBPUlRfVE9fV1NJTCk7Ci0gICAgICAgIGlmIChpbXBvcnRUb1dTSUwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5JTVBPUlRfVE9fV1NJTCwgQWN0aW9uSW5wdXRzLklNUE9SVF9UT19XU0lMKTsKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuSU1QT1JURURfV1NETF9VUkwsIHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLklNUE9SVEVEX1dTRExfVVJMKSk7Ci0gICAgICAgICAgICBTdHJpbmcgd3NpbEZpbGVOYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuV1NJTF9GSUxFX05BTUUpOwotICAgICAgICAgICAgaWYgKHdzaWxGaWxlTmFtZSA9PSBudWxsIHx8IHdzaWxGaWxlTmFtZS5sZW5ndGgoKSA8PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9GSUxFX05BTUUiKSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLldTSUxfRklMRV9OQU1FLCB3c2lsRmlsZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbXBvcnRGaWxlID09IG51bGwgJiYgaW1wb3J0VG9XU0lMID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0lNUE9SVF9PUFRJT05fU0VMRUNURUQiKSk7Ci0gICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oU3RyaW5nIGRlZmF1bHRGaWxlTmFtZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGNvbnRyb2xsZXJfLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkgKyBkZWZhdWx0RmlsZU5hbWUpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICByZXR1cm4gZm9zOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpbXBvcnRUZW1wRmlsZVRvV2ViUHJvamVjdChTdHJpbmcgZGVmYXVsdEZpbGVOYW1lKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKHRhcmdldEZpbGVSZXNvdXJjZV8gIT0gbnVsbCAmJiB0YXJnZXRGaWxlUmVzb3VyY2VfLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgICAgdGFyZ2V0RmlsZVJlc291cmNlXy5kZWxldGUodHJ1ZSxuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotICAgICAgU3RyaW5nIGltcG9ydGVkRmlsZU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FKTsKLSAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGNvbnRyb2xsZXJfLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkrZGVmYXVsdEZpbGVOYW1lKTsKLSAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0KLSAgICAgIElGaWxlIGlGaWxlID0gaVByb2plY3RfLmdldEZpbGUoIi8iK2ltcG9ydGVkRmlsZU5hbWUpOwotICAgICAgaUZpbGUuY3JlYXRlKGJpcyx0cnVlLG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0gICAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlCi0gICAgICBmaWxlLmRlbGV0ZSgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmlsZUV4aXN0cygpCi0gICAgewotICAgICAgU3RyaW5nIGltcG9ydGVkRmlsZU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FKTsKLSAgICAgIGlmIChpbXBvcnRlZEZpbGVOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRhcmdldEZpbGVSZXNvdXJjZV8gPSBpUHJvamVjdF8uZmluZE1lbWJlcihpbXBvcnRlZEZpbGVOYW1lKTsKLSAgICAgICAgcmV0dXJuICh0YXJnZXRGaWxlUmVzb3VyY2VfICE9IG51bGwgJiYgdGFyZ2V0RmlsZVJlc291cmNlXy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUYXJnZXRGaWxlUmVzb3VyY2VSZWFkT25seSgpCi0gICAgewotICAgICAgcmV0dXJuIHRhcmdldEZpbGVSZXNvdXJjZV8uZ2V0UmVzb3VyY2VBdHRyaWJ1dGVzKCkuaXNSZWFkT25seSgpOwotICAgIH0KLQotICAgIC8vIFRPRE86IFJlc291cmNlQ29udGV4dCBuZWVkIHRvIG1vdmUgdG8gb3JnLmVjbGlwc2Uud3N0LndzLgotICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKQotICAgIHsKLSAgICAJcmV0dXJuIHRydWU7Ci0vLyAgICAgIHJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VDb250ZXh0KCkuaXNDaGVja291dEZpbGVzRW5hYmxlZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2ViU2VydmljZVBsdWdpbkZpbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlSWQpCi0gICAgewotICAgICAgU3RyaW5nIGltcG9ydGVkRmlsZU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FKTsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRNZXNzYWdlKG1lc3NhZ2VJZCxuZXcgU3RyaW5nW117aVByb2plY3RfLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSxpbXBvcnRlZEZpbGVOYW1lfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogUmVzb3VyY2VDb250ZXh0IG5lZWQgdG8gbW92ZSB0byBvcmcuZWNsaXBzZS53c3Qud3MuIAotICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkKLSAgICB7Ci0gICAgCXJldHVybiB0cnVlOwotLy8gICAgICByZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpLmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFZGl0KCkKLSAgICB7Ci0gICAgICBJRmlsZVtdIGZpbGVzID0gbmV3IElGaWxlWzFdOwotICAgICAgZmlsZXNbMF0gPSAoSUZpbGUpdGFyZ2V0RmlsZVJlc291cmNlXzsKLSAgICAgIElTdGF0dXMgc3RhdHVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChmaWxlcyxudWxsKTsKLSAgICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSBjb250cm9sbGVyXy5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotICAgICAgcmV0dXJuIHN0YXR1cy5pc09LKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcnVuKCkgewotICAgICAgICBNZXNzYWdlUXVldWUgbXNnUXVldWUgPSBjb250cm9sbGVyXy5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICAgICAgaWYgKHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSU1QT1JUX0ZJTEUpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ld0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbigpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdEZpbGVOYW1lID0gYWN0aW9uLmdldERlZmF1bHRGaWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICghYWN0aW9uLndyaXRlKGdldE91dHB1dFN0cmVhbShkZWZhdWx0RmlsZU5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XUklUSU5HX1RFTVBfRklMRV9UT19GUyIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbXBvcnRUZW1wRmlsZVRvV2ViUHJvamVjdChkZWZhdWx0RmlsZU5hbWUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRlZEZpbGVOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLklNUE9SVEVEX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgbXNnUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfSU5GT19JTVBPUlRfVE9fV09SS0JFTkNIX1NVQ0NFU1NGVUwiLCBpbXBvcnRlZEZpbGVOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKGZuZmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UoY2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSU1QT1JUX1RPX1dTSUwpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgICAgIFN0cmluZyBpbXBvcnRlZFdTSUxGaWxlTmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5XU0lMX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5JTVBPUlRFRF9XU0RMX1VSTCk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgd3NpbFBsYXRmb3JtVVJMID0gbmV3IFN0cmluZ0J1ZmZlcigicGxhdGZvcm06L3Jlc291cmNlLyIpOwotICAgICAgICAgICAgd3NpbFBsYXRmb3JtVVJMLmFwcGVuZChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICB3c2lsUGxhdGZvcm1VUkwuYXBwZW5kKCcvJyk7Ci0gICAgICAgICAgICB3c2lsUGxhdGZvcm1VUkwuYXBwZW5kKGltcG9ydGVkV1NJTEZpbGVOYW1lKTsKLSAgICAgICAgICAgIEFkZFdTRExUb1dTSUxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkV1NETFRvV1NJTENvbW1hbmQoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nWzVdOwotICAgICAgICAgICAgYXJnc1swXSA9IEFkZFdTRExUb1dTSUxDb21tYW5kLkFSR19XU0lMOwotICAgICAgICAgICAgYXJnc1sxXSA9IHdzaWxQbGF0Zm9ybVVSTC50b1N0cmluZygpOwotICAgICAgICAgICAgYXJnc1syXSA9IEFkZFdTRExUb1dTSUxDb21tYW5kLkFSR19XU0RMOwotICAgICAgICAgICAgYXJnc1szXSA9IHdzZGxVUkw7Ci0gICAgICAgICAgICBhcmdzWzRdID0gQWRkV1NETFRvV1NJTENvbW1hbmQuQVJHX1JFU09MVkVfV1NETDsKLSAgICAgICAgICAgIGNvbW1hbmQuc2V0QXJndW1lbnRzKGFyZ3MpOwotICAgICAgICAgICAgY29tbWFuZC5leGVjdXRlKG5ldyBFY2xpcHNlRW52aXJvbm1lbnQobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOwotICAgICAgICAgICAgbXNnUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfSU5GT19JTVBPUlRfU0VSVklDRV9SRUZfVE9fV1NJTF9TVUNDRVNTRlVMIiwgaW1wb3J0ZWRXU0lMRmlsZU5hbWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gICAgcHVibGljIGFic3RyYWN0IEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiBuZXdJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3MGRkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbiBleHRlbmRzIEZvcm1BY3Rpb24KLXsKLSAgcHVibGljIExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHdpemFyZElEID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuV0VCX1NFUlZJQ0VfV0laQVJEKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLldFQl9TRVJWSUNFX1dJWkFSRCwgd2l6YXJkSUQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbGF1bmNoV2l6YXJkKFN0cmluZyB3c2RsVVJMKQotICB7Ci0gICAgTGF1bmNoV2l6YXJkVGFzayB0YXNrID0gTGF1bmNoV2l6YXJkVGFzay5nZXRJbnN0YW5jZSgpOwotICAgIGlmICh0YXNrLmdldElzRXhlY3V0aW5nKCkpCi0gICAgewotICAgICAgY29udHJvbGxlcl8uZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfV0laQVJEX0FMUkVBRFlfUlVOTklORyIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaW50IHdpemFyZElEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuV0VCX1NFUlZJQ0VfV0laQVJEKSk7Ci0gICAgTGF1bmNoV2l6YXJkUnVubmFibGUgcnVubmFibGU7Ci0gICAgaWYgKHdpemFyZElEID09IEFjdGlvbklucHV0cy5XRUJfU0VSVklDRV9DTElFTlRfV0laQVJEKQotICAgICAgcnVubmFibGUgPSBuZXcgTGF1bmNoV2l6YXJkUnVubmFibGUoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCIsIHdzZGxVUkwpOwotICAgIGVsc2UgaWYgKHdpemFyZElEID09IEFjdGlvbklucHV0cy5XRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQpCi0gICAgICBydW5uYWJsZSA9IG5ldyBMYXVuY2hXaXphcmRSdW5uYWJsZSgib3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQiLCB3c2RsVVJMKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgdGFzay5jaGVja0FuZEFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvTGlua0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvTGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNiMTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL0xpbmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi0vLyBBYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGFjdGlvbiBvZiBjbGlja2luZyBhIGxpbmsuIFRoZXNlIGFjdGlvbnMKLS8vIG1heSBjaGFuZ2UgdGhlIGhpc3RvcnkgbGlzdC4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5rQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5XzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzU3RhbGVCcmVhZENydW1iXzsKLQotICBwdWJsaWMgTGlua0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBpc0FkZGVkVG9IaXN0b3J5XyA9IGZhbHNlOwotICAgIGlzU3RhbGVCcmVhZENydW1iXyA9IGZhbHNlOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGlzIGhpc3RvcnkgbGlzdC4KLSAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBydW4oKSBtZXRob2QuCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIGlzQWRkZWRUb0hpc3RvcnlfOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KTsKLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgaXNIaXN0b3J5U3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLklTSElTVE9SWSk7Ci0gICAgaWYgKGlzSGlzdG9yeVN0cmluZyAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5JU0hJU1RPUlksaXNIaXN0b3J5U3RyaW5nKTsKLSAgICByZXR1cm4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKHJlcXVlc3QpOwotICB9Ci0KLSAgLy8gQWRkIHRoZSBhY3Rpb24ncyBVUkwgdG8gdGhlIGNvbnRyb2xsZXIncyBoaXN0b3J5IGxpc3QuCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFRvSGlzdG9yeShpbnQgcGVyc3BlY3RpdmVJZCxTdHJpbmcgdXJsKQotICB7Ci0gICAgaWYgKCFpc0hpc3RvcnlBY3Rpb24oKSkKLSAgICAgIGlzQWRkZWRUb0hpc3RvcnlfID0gY29udHJvbGxlcl8uYWRkVG9IaXN0b3J5KHBlcnNwZWN0aXZlSWQsdXJsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSGlzdG9yeUFjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFN0YWxlQnJlYWRDcnVtYigpCi0gIHsKLSAgICBpZiAoaXNIaXN0b3J5QWN0aW9uKCkpCi0gICAgewotICAgICAgaXNTdGFsZUJyZWFkQ3J1bWJfID0gdHJ1ZTsKLSAgICAgIGNvbnRyb2xsZXJfLnByb2Nlc3NTdGFsZUJyZWFkQ3J1bWIoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N0YWxlQnJlYWRDcnVtYigpCi0gIHsKLSAgICByZXR1cm4gaXNTdGFsZUJyZWFkQ3J1bWJfOwotICB9Ci0KLSAgLy8gQ2FsbCB0aGlzIHdoZW4gYSBzdGFsZSBicmVhZGNydW1iIGlzIGVuY291bnRlcmVkIHdoaWxlIHRyYXZlcnNpbmcgaGlzdG9yeSBjaGFpbi4KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROZXh0SGlzdG9yeUFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuIFJldHJpZXZlSGlzdG9yeUFjdGlvbi5nZXRBY3Rpb25MaW5rKGNvbnRyb2xsZXJfLmdldEhpc3RvcnlEaXJlY3Rpb24oKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL05vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL05vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjMzNiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb2RlQWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwcm90ZWN0ZWQgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfOwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNOb2RlU2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzVmlld1NlbGVjdGlvbl87Ci0gIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlc1N0YXR1c1VwZGF0ZV87Ci0KLSAgcHVibGljIE5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyLE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgbm9kZU1hbmFnZXJfID0gbm9kZU1hbmFnZXI7Ci0gICAgcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfID0gZmFsc2U7Ci0gICAgcmVxdWlyZXNOb2RlU2VsZWN0aW9uXyA9IGZhbHNlOwotICAgIHJlcXVpcmVzVmlld1NlbGVjdGlvbl8gPSBmYWxzZTsKLSAgICByZXF1aXJlc1N0YXR1c1VwZGF0ZV8gPSBmYWxzZTsKLSAgfQotCi0gIC8vIC4uLmpzcD9ub2RlSWQ9Li4uPCZpc0hpc3Rvcnk9MT4KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nIG5vZGVJZFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIC8vIFBlcmZvcm0gZGF0YSB2YWxpZGF0aW9uLgotICAgIHRyeQotICAgIHsKLSAgICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KG5vZGVJZFN0cmluZyk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBWYWxpZGF0aW9uIGZhaWxlZCEKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsbm9kZUlkU3RyaW5nKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzU3RhbGVOb2RlKGludCBub2RlSWQpCi0gIHsKLSAgICByZXR1cm4gKG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJZCkgPT0gbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgKiBNYWtlIGEgbm9kZSB2aXNpYmxlLiBBIG5vZGUgaXMgdmlzaWJsZSB3aGVuIGFsbCBvZiBpdHMgYW5jZXN0b3JzIGFyZSBleHBhbmRlZC4KLSAgKiBAcGFyYW0gTm9kZSBUaGUgbm9kZSB0byBiZSBtYWRlIHZpc2libGUuCi0gICogQHJldHVybiBib29sZWFuIEluZGljYXRvciBmb3Igd2hldGhlciBvciBub3QgdGhlIHRyZWUgc3RydWN0dXJlIHdhcyBjaGFuZ2VkIChpLmUuIGV4cGFuZGVkIHRvIHNob3cgdGhlIG5vZGUgaW4gcXVlc3Rpb24pLgotICAqLwotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYWtlTm9kZVZpc2libGUoTm9kZSBub2RlKQotICB7Ci0gICAgcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfID0gbm9kZS5nZXROb2RlTWFuYWdlcigpLm1ha2VOb2RlVmlzaWJsZShub2RlKTsKLSAgICByZXR1cm4gcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfOwotICB9Ci0KLSAgLyoqCi0gICogU2VsZWN0IGEgbm9kZSB3aXRoIGlkIG5vZGVJZC4KLSAgKiBAcGFyYW0gaW50IFRoZSBpZCBvZiB0aGUgbm9kZSB0byBiZSBzZWxlY3RlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2VsZWN0ZWROb2RlSWQoaW50IG5vZGVJZCkKLSAgewotICAgIGlmIChub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlSWQoKSAhPSBub2RlSWQpCi0gICAgewotICAgICAgcmVxdWlyZXNOb2RlU2VsZWN0aW9uXyA9IHRydWU7Ci0gICAgICBub2RlTWFuYWdlcl8uc2V0U2VsZWN0ZWROb2RlSWQobm9kZUlkKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTZWxlY3RlZFZpZXdJZChpbnQgdmlld0lkKQotICB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSAhPSB2aWV3SWQpCi0gICAgewotICAgICAgcmVxdWlyZXNWaWV3U2VsZWN0aW9uXyA9IHRydWU7Ci0gICAgICBzZWxlY3RlZE5vZGUuc2V0Vmlld0lkKHZpZXdJZCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSB0cmVldmlldyByZXF1aXJlcyByZWxvYWRpbmcgYXMgYSByZXN1bHQgb2YgdGhpcyBhY3Rpb24uCi0gIC8vIFJlbG9hZGluZyBpcyByZXF1aXJlZCB3aGVuIGJyYW5jaGVzIGFyZSBhZGRlZC9yZW1vdmVkLgotICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc1RyZWVWaWV3UmVmcmVzaCgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgbmV3IG5vZGUgaGFzIGJlZW4gc2VsZWN0ZWQgYXMgYSByZXN1bHQgb2YgdGhlIGFjdGlvbi4KLSAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNOb2RlU2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiByZXF1aXJlc05vZGVTZWxlY3Rpb25fOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIGlmIGEgbmV3IHZpZXcgZWxlbWVudCBpcyBzZWxlY3RlZC4KLSAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNWaWV3U2VsZWN0aW9uKCkKLSAgewotICAgIHJldHVybiByZXF1aXJlc1ZpZXdTZWxlY3Rpb25fOwotICB9Ci0KLSAgLy8gRGV0ZXJtaW5lIGlmIGFueSBzdGF0dXMgbWVzc2FnZXMgYXJvc2UgZnJvbSB0aGlzIGFjdGlvbi4KLSAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNTdGF0dXNVcGRhdGUoKQotICB7Ci0gICAgcmV0dXJuIHJlcXVpcmVzU3RhdHVzVXBkYXRlXzsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL09wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL09wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxMzZlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9PcGVuQ2FsZW5kYXJCcm93c2VyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIE9wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHVibGljIE9wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24oKQotICB7Ci0gIH0KLQotICAvLyBjYWxlbmRhcl9icm93c2VyLmpzcD9zZXNzaW9uSWQ9Li4uJmNhbGVuZGFyVHlwZT0uLi4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhTdHJpbmcgc2Vzc2lvbklkLGludCBjYWxlbmRhclR5cGUpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImNhbGVuZGFyX2Jyb3dzZXIuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQoY2FsZW5kYXJUeXBlKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9yRGF0ZShTdHJpbmcgc2Vzc2lvbklkKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsoc2Vzc2lvbklkLEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0RBVEUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9yRGF0ZVRpbWUoU3RyaW5nIHNlc3Npb25JZCkKLSAgewotICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKHNlc3Npb25JZCxBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFVElNRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JHWWVhck1vbnRoKFN0cmluZyBzZXNzaW9uSWQpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR1lFQVJNT05USCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JHRGF5KFN0cmluZyBzZXNzaW9uSWQpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR0RBWSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JHTW9udGhEYXkoU3RyaW5nIHNlc3Npb25JZCkKLSAgewotICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKHNlc3Npb25JZCxBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9HTU9OVEhEQVkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL09wZW5XU0RMQnJvd3NlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvT3BlbldTRExCcm93c2VyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyOTk3NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvT3BlbldTRExCcm93c2VyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIE9wZW5XU0RMQnJvd3NlckFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwdWJsaWMgT3BlbldTRExCcm93c2VyQWN0aW9uKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhTdHJpbmcgc2Vzc2lvbklkLGludCB3c2RsVHlwZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NkbF9icm93c2VyLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuV1NETF9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQod3NkbFR5cGUpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9yU2VydmljZShTdHJpbmcgc2Vzc2lvbklkKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsoc2Vzc2lvbklkLEFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JTZXJ2aWNlSW50ZXJmYWNlKFN0cmluZyBzZXNzaW9uSWQpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsQWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUHJveHlMb2FkUGFnZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUHJveHlMb2FkUGFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWE1ZTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1Byb3h5TG9hZFBhZ2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1wdWJsaWMgY2xhc3MgUHJveHlMb2FkUGFnZUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICAvLyBHZXQgdGhlIGFjdGlvbiBnaXZlbiBhIHJlbGF0aXZlIHRhcmdldFBhZ2UgVVJMLiBlLmcuICJmb3Jtcy9Mb25nTG9hZGluZ0Zvcm0uanNwIgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKFN0cmluZyB0YXJnZXRQYWdlKQotICB7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsobnVsbCx0YXJnZXRQYWdlKTsKLSAgfQotICAKLSAgLy8gR2V0IHRoZSBhY3Rpb24gZ2l2ZW4gYSBzZXNzaW9uSWQgYW5kIGEgcmVsYXRpdmUgdGFyZ2V0UGFnZSBVUkwuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHNlc3Npb25JZCxTdHJpbmcgdGFyZ2V0UGFnZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiZm9ybXMvUHJveHlMb2FkUGFnZS5qc3A/Iik7Ci0gICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKQotICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCkuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRBUkdFVF9QQUdFKS5hcHBlbmQoJz0nKS5hcHBlbmQodGFyZ2V0UGFnZSk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUmVzaXplRnJhbWVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9SZXNpemVGcmFtZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkOTRjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9SZXNpemVGcmFtZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNpemVGcmFtZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgZnJhbWVOYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuRlJBTUVfTkFNRSk7Ci0gICAgaWYgKGZyYW1lTmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5GUkFNRV9OQU1FLGZyYW1lTmFtZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBwcm9jZXNzT3RoZXJzKHBhcnNlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci0gIAotICBwdWJsaWMgUmVzaXplRnJhbWVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyID0gbmV3IE11bHRpcGFydEZvcm1EYXRhUGFyc2VyKCk7Ci0gICAgICBwYXJzZXIucGFyc2VSZXF1ZXN0KHJlcXVlc3QsSFRNTFV0aWxzLlVURjhfRU5DT0RJTkcpOwotICAgICAgYm9vbGVhbiByZXN1bHQgPSBwcm9jZXNzUGFyc2VkUmVzdWx0cyhwYXJzZXIpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgY2F0Y2ggKE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1JldHJpZXZlSGlzdG9yeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUmV0cmlldmVIaXN0b3J5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZDFlMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvUmV0cmlldmVIaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIFJldHJpZXZlSGlzdG9yeUFjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24KLXsKLSAgcHJpdmF0ZSBCcmVhZENydW1iIGJyZWFkQ3J1bWJfOwotCi0gIHB1YmxpYyBSZXRyaWV2ZUhpc3RvcnlBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgYnJlYWRDcnVtYl8gPSBudWxsOwotICB9Ci0KLSAgLy8gYWN0aW9ucy9SZXRyaWV2ZUhpc3RvcnlBY3Rpb24uanNwP2p1bXA9MSAgLSBmb3J3YXJkICAoQWN0aW9uSW5wdXRzLkpVTVBfRk9SV0FSRCkKLSAgLy8gYWN0aW9ucy9SZXRyaWV2ZUhpc3RvcnlBY3Rpb24uanNwP2p1bXA9LTEgLSBiYWNrd2FyZCAoQWN0aW9uSW5wdXRzLkpVTVBfQkFDSykKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQganVtcCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiYWN0aW9ucy9SZXRyaWV2ZUhpc3RvcnlBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5KVU1QKS5hcHBlbmQoJz0nKS5hcHBlbmQoanVtcCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIFN0cmluZyBqdW1wU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkpVTVApOwotICAgIC8vIFBlcmZvcm0gZGF0YSB2YWxpZGF0aW9uLgotICAgIHRyeQotICAgIHsKLSAgICAgIGludCBqdW1wID0gSW50ZWdlci5wYXJzZUludChqdW1wU3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkIQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLkpVTVAsanVtcFN0cmluZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgaW50IGp1bXAgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5KVU1QKSk7Ci0gICAgc3dpdGNoIChqdW1wKQotICAgIHsKLSAgICAgIGNhc2UgQWN0aW9uSW5wdXRzLkpVTVBfRk9SV0FSRDoKLSAgICAgICAgYnJlYWRDcnVtYl8gPSBjb250cm9sbGVyXy5mb3J3YXJkKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBBY3Rpb25JbnB1dHMuSlVNUF9CQUNLOgotICAgICAgICBicmVhZENydW1iXyA9IGNvbnRyb2xsZXJfLmJhY2soKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBCcmVhZENydW1iIGdldEJyZWFkQ3J1bWIoKQotICB7Ci0gICAgcmV0dXJuIGJyZWFkQ3J1bWJfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDQ0NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvU2VsZWN0Tm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLk5vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdE5vZGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBOb2RlIHNlbGVjdGVkTm9kZV87Ci0KLSAgcHVibGljIFNlbGVjdE5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyLE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcixub2RlTWFuYWdlcik7Ci0gICAgc2VsZWN0ZWROb2RlXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBwZXJmb3JtQmFzZUFjdGlvbihpbnQgbm9kZUlkKQotICB7Ci0gICAgc2V0U2VsZWN0ZWROb2RlSWQobm9kZUlkKTsKLSAgICBzZWxlY3RlZE5vZGVfID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpZiAoIWlzU3RhbGVOb2RlKG5vZGVJZCkpCi0gICAgewotICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG5vZGUgaXMgdmlzaWJsZS4KLSAgICAgIG1ha2VOb2RlVmlzaWJsZShub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpKTsKLSAgICAgIHBlcmZvcm1CYXNlQWN0aW9uKG5vZGVJZCk7Ci0gICAgICBhZGRUb0hpc3RvcnkoZ2V0UGVyc3BlY3RpdmVJZCgpLGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHNldFN0YWxlQnJlYWRDcnVtYigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldFNlbGVjdGVkTm9kZSgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWROb2RlXzsKLSAgfQotICAKLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICByZXR1cm4gbmV3IElUcmFuc2Zvcm1lcltdIHtuZXcgTm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKX07Ci0gIH0KLQotICAvLyBTZWxlY3RpbmcgYSBub2RlIGNoYW5nZXMgdGhlIHRyZWV2aWV3IGNvbnRlbnQgYW5kIHRoZSBwcm9wZXJ0aWVzIGNvbnRhaW5lci4KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBlcnNwZWN0aXZlSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWJkYjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLkN1cnJlbnROb2RlU2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdE5vZGVUb29sQWN0aW9uIGV4dGVuZHMgU2VsZWN0Tm9kZUFjdGlvbgotewotICBwcm90ZWN0ZWQgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBwcm90ZWN0ZWQgVG9vbCBzZWxlY3RlZFRvb2xfOwotCi0gIHB1YmxpYyBTZWxlY3ROb2RlVG9vbEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLG5vZGVNYW5hZ2VyKTsKLSAgICBub2RlTWFuYWdlcl8gPSBub2RlTWFuYWdlcjsKLSAgICBzZWxlY3RlZFRvb2xfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlTWFuYWdlciBnZXROb2RlTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gbm9kZU1hbmFnZXJfOwotICB9Ci0KLSAgLy8gLi4uanNwP25vZGVJZD0uLi4mdG9vbElkPS4uLjwmdmlld0lkPS4uLiZ2aWV3VG9vbElkPS4uLj48JmlzSGlzdG9yeT0xPgotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHN1cGVyLnByb2Nlc3NMaW5rUGFyYW1ldGVycyhyZXF1ZXN0KTsKLSAgICBTdHJpbmcgdG9vbElkU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgU3RyaW5nIHZpZXdJZFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIFN0cmluZyB2aWV3VG9vbElkU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotCi0gICAgLy8gUGVyZm9ybSBkYXRhIHZhbGlkYXRpb24uCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IHRvb2xJZCA9IEludGVnZXIucGFyc2VJbnQodG9vbElkU3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkLgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlRPT0xJRCx0b29sSWRTdHJpbmcpOwotCi0gICAgLy8gT3B0aW9uYWwgcHJvcGVydGllcwotICAgIHRyeQotICAgIHsKLSAgICAgIGludCB2aWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZpZXdJZFN0cmluZyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdJRCx2aWV3SWRTdHJpbmcpOwotICAgICAgaWYgKHZpZXdJZCAhPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgICB7Ci0gICAgICAgIGludCB2aWV3VG9vbElkID0gSW50ZWdlci5wYXJzZUludCh2aWV3VG9vbElkU3RyaW5nKTsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXVE9PTElELHZpZXdUb29sSWRTdHJpbmcpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpZiAoIWlzU3RhbGVOb2RlKG5vZGVJZCkpCi0gICAgewotICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG5vZGUgaXMgdmlzaWJsZS4KLSAgICAgIG1ha2VOb2RlVmlzaWJsZShub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpKTsKLSAgICAgIHNldFNlbGVjdGVkTm9kZUlkKG5vZGVJZCk7Ci0gICAgICBzZWxlY3RlZE5vZGVfID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgaW50IHRvb2xJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlRPT0xJRCkpOwotICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGVfLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgICB0b29sTWFuYWdlci5zZXRTZWxlY3RlZFRvb2xJZCh0b29sSWQpOwotICAgICAgc2VsZWN0ZWRUb29sXyA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgU3RyaW5nIHZpZXdJZFN0cmluZyA9ICgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVklFV0lEKSk7Ci0gICAgICBpZiAodmlld0lkU3RyaW5nICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGludCB2aWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZpZXdJZFN0cmluZyk7Ci0gICAgICAgIHNldFNlbGVjdGVkVmlld0lkKHZpZXdJZCk7Ci0gICAgICAgIGlmICh2aWV3SWQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHZpZXdUb29sSWRTdHJpbmcgPSAoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpKTsKLSAgICAgICAgICBWaWV3VG9vbCB2aWV3VG9vbCA9IChWaWV3VG9vbClzZWxlY3RlZFRvb2xfOwotICAgICAgICAgIGlmICh2aWV3VG9vbElkU3RyaW5nICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IHZpZXdUb29sSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHZpZXdUb29sSWRTdHJpbmcpOwotICAgICAgICAgICAgVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlXy5nZXRWaWV3VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgICAgIGlmICh2aWV3VG9vbE1hbmFnZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFpc0hpc3RvcnlBY3Rpb24oKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZXdUb29sTWFuYWdlciA9IHZpZXdUb29sLmNyZWF0ZVRvb2xNYW5hZ2VyKHZpZXdJZCk7Ci0gICAgICAgICAgICAgICAgdmlld1Rvb2xJZCA9IHZpZXdUb29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2xJZCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNldFN0YWxlQnJlYWRDcnVtYigpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlld1Rvb2xNYW5hZ2VyLnNldFNlbGVjdGVkVG9vbElkKHZpZXdUb29sSWQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBzZXRTZWxlY3RlZFZpZXdJZChBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotICAgICAgYWRkVG9IaXN0b3J5KGdldFBlcnNwZWN0aXZlSWQoKSxnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBzZXRTdGFsZUJyZWFkQ3J1bWIoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIHJldHVybiBuZXcgSVRyYW5zZm9ybWVyW10ge25ldyBDdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKX07Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVG9vbCBnZXRTZWxlY3RlZFZpZXdUb29sKCkKLSAgewotICAgIGlmIChwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdJRCkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBzZWxlY3RlZE5vZGVfLmdldFZpZXdUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFRvb2wgZ2V0U2VsZWN0ZWRUb29sKCkKLSAgewotICAgIHJldHVybiBzZWxlY3RlZFRvb2xfOwotICB9Ci0KLSAgLy8gU2VsZWN0aW5nIGEgbm9kZSB0b29sIHVwZGF0ZXMgdGhlIHByb3BlcnRpZXMgY29udGVudC4gQWxzbywgaW4gdGhlIGV2ZW50Ci0gIC8vIG9mIGEgaGlzdG9yeSBzd2l0Y2gsIG5vZGVzIG1heSBuZWVkIHRvIGJlIHNlbGVjdGVkIHJlc3VsdGluZyBpbiBjaGFuZ2VzIHRvCi0gIC8vIGJvdGggdGhlIHRyZWV2aWV3IGNvbnRlbnQgYW5kIHRoZSBwcm9wZXJ0aWVzIGNvbnRhaW5lci4gVGhlc2UgcmVxdWlyZW1lbnRzIGFyZQotICAvLyBjb3ZlcmVkIHRocm91Z2ggdGhlIGJhc2UgY2xhc3MuCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGVudFBhZ2UoKTsKLSAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGFic3RyYWN0IGludCBnZXRQZXJzcGVjdGl2ZUlkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9TaG93UGVyc3BlY3RpdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1Nob3dQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWUxNDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1Nob3dQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIFNob3dQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24KLXsKLSAgcHVibGljIFNob3dQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIC8vIGFjdGlvbnMvc2hvd19wZXJzcGVjdGl2ZS5qc3A/cGVyc3BlY3RpdmU9MDwmaXNIaXN0b3J5PTE+IC0gVURESSAoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREkpCi0gIC8vIGFjdGlvbnMvc2hvd19wZXJzcGVjdGl2ZS5qc3A/cGVyc3BlY3RpdmU9MTwmaXNIaXN0b3J5PTE+IC0gV1NJTCAoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUwpCi0gIC8vIGFjdGlvbnMvc2hvd19wZXJzcGVjdGl2ZS5qc3A/cGVyc3BlY3RpdmU9MjwmaXNIaXN0b3J5PTE+IC0gV1NETCAoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwpCi0gIC8vIGFjdGlvbnMvc2hvd19wZXJzcGVjdGl2ZS5qc3A/cGVyc3BlY3RpdmU9MzwmaXNIaXN0b3J5PTE+IC0gRmF2b3JpdGVzIChBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfRkFWT1JJVEVTKQotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBuZXdQZXJzcGVjdGl2ZSxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImFjdGlvbnMvU2hvd1BlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkUpLmFwcGVuZCgnPScpLmFwcGVuZChuZXdQZXJzcGVjdGl2ZSk7Ci0gICAgaWYgKGZvckhpc3RvcnkpCi0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKS5hcHBlbmQoIj0xIik7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIFN0cmluZyBwZXJzcGVjdGl2ZVN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSk7Ci0gICAgLy8gUGVyZm9ybSBkYXRhIHZhbGlkYXRpb24uCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IHBlcnNwZWN0aXZlID0gSW50ZWdlci5wYXJzZUludChwZXJzcGVjdGl2ZVN0cmluZyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFLHBlcnNwZWN0aXZlU3RyaW5nKTsKLSAgICAgIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlciA9IG5ldyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlcigpOwotICAgICAgcGFyc2VyLnBhcnNlUmVxdWVzdChyZXF1ZXN0LEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKTsKLSAgICAgIHJlc3VsdCA9IHByb2Nlc3NQYXJzZWRSZXN1bHRzKHBhcnNlcik7Ci0gICAgICByZW1vdmVkUHJvcGVydGllc18ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkISAtIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCi0gICAgfQotICAgIGNhdGNoIChNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgcGVyc3BlY3RpdmUgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSkpOwotICAgIGNvbnRyb2xsZXJfLnNldEN1cnJlbnRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZSk7Ci0gICAgYWRkVG9IaXN0b3J5KHBlcnNwZWN0aXZlLGdldEFjdGlvbkxpbmsocGVyc3BlY3RpdmUsdHJ1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzVkOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvVG9nZ2xlTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLk5vZGVJZFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9nZ2xlTm9kZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE5vZGUgdG9nZ2xlZE5vZGVfOwotICBwdWJsaWMgVG9nZ2xlTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLG5vZGVNYW5hZ2VyKTsKLSAgICB0b2dnbGVkTm9kZV8gPSBudWxsOwotICB9Ci0KLSAgLy8gVG9nZ2xlIHRoZSBjdXJyZW50IG5vZGUgYW5kIHVwZGF0ZSB0aGUgc2VsZWN0aW9uIGlmZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gIC8vIGlzIGEgcmVsYXRlZCBkZXNjZW5kYW50IG9mIGEgY29sbGFwc2VkIG5vZGUuCi0gIC8qKgotICAqIFRvZ2dsZSB0aGUgY3VycmVudCBub2RlIGFuZCB1cGRhdGUgdGhlIHNlbGVjdGlvbiBpZmYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAqIG5vZGUgaXMgYSByZWxhdGVkIGRlc2NlbmRhbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdGhlIGN1cnJlbnQgbm9kZSBpcwotICAqIG5vdyBjb2xsYXBzZWQgYXMgYSByZXN1bHQgb2YgdGhpcyBhY3Rpb24uCi0gICoKLSAgKiBAcGFyYW0gaW50IFRoZSBub2RlIElEIG9mIHRoZSBub2RlIGZvciB3aGljaCB0aGlzIGFjdGlvbiBhcHBsaWVzIHRvLgotICAqIEByZXR1cm4gYm9vbGVhbiBJbmRpY2F0b3Igb2Ygd2hldGhlciBvciBub3QgYSBzZWxlY3Rpb24gY2hhbmdlIHdhcyBuZWNlc3NhcnkuCi0gICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHBlcmZvcm1CYXNlQWN0aW9uKGludCBub2RlSWQpCi0gIHsKLSAgICB0b2dnbGVkTm9kZV8gPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpOwotICAgIG5vZGVNYW5hZ2VyXy5zZXRGb2N1c2VkTm9kZUlkKG5vZGVJZCk7Ci0gICAgdG9nZ2xlZE5vZGVfLnNldFZpc2liaWxpdHlPZkNoaWxkcmVuKCF0b2dnbGVkTm9kZV8uaXNPcGVuKCkpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIXNlbGVjdGVkTm9kZS5pc1Zpc2libGUoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0U2VsZWN0ZWROb2RlSWQobm9kZUlkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaWYgKCFpc1N0YWxlTm9kZShub2RlSWQpKQotICAgIHsKLSAgICAgIGlmIChwZXJmb3JtQmFzZUFjdGlvbihub2RlSWQpKQotICAgICAgewotICAgICAgICAvLyBTYXZlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHRvZ2dsZSBsaW5rIGluIHRoZSBoaXN0b3J5LgotICAgICAgICBhZGRUb0hpc3RvcnkoZ2V0UGVyc3BlY3RpdmVJZCgpLGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkpOwotICAgICAgfQotICAgICAgLy8gRG8gbm90IHNhdmUgdGhlIHRvZ2dsZSBpbiBoaXN0b3J5LgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHNldFN0YWxlQnJlYWRDcnVtYigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldFRvZ2dsZWROb2RlKCkKLSAgewotICAgIHJldHVybiB0b2dnbGVkTm9kZV87Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIHJldHVybiBuZXcgSVRyYW5zZm9ybWVyW10ge25ldyBOb2RlSWRUcmFuc2Zvcm1lcihjb250cm9sbGVyXyl9OwotICB9Ci0KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFBlcnNwZWN0aXZlSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1ZhbGlkYXRlRWRpdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvVmFsaWRhdGVFZGl0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNzE4NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvVmFsaWRhdGVFZGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRlRWRpdEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiAiYWN0aW9ucy9WYWxpZGF0ZUVkaXRBY3Rpb25KU1AuanNwIjsKLSAgfQotICAgIAotICBwdWJsaWMgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9XU0RMRmlsZU5hbWVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1dTRExGaWxlTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDcxZWExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9hY3Rpb25zL1dTRExGaWxlTmFtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1wdWJsaWMgY2xhc3MgV1NETEZpbGVOYW1lSGVscGVyCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0XyA9ICJ0ZW1wLndzZGwiOwotICAKLSAgLyoqCi0gICogR2l2ZW4gYSB3c2RsIHBhdGggKGZpbGUsIFVSTCBldGMuKSwgZ3Vlc3MgYXQgdGhlIGZpbGUgbmFtZSBieSBsb29raW5nIGZvciB0aGUgLndzZGwgZXh0ZW5zaW9uIGF0IHRoZSBlbmQgb2YgdGhlCi0gICogcGF0aCBhbmQgdGhlIGZpbGUgdGhhdCBpdCBiZWxvbmdzIHRvLiBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgcmV0dXJuIHRoZSBkZWZhdWx0IGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KLSAgKiBAcGFyYW0gU3RyaW5nIFRoZSBwYXRoIChmaWxlLCBVUkwgZXRjLikgb2YgdGhpcyBXU0RMIGZpbGUuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIFdTREwgZmlsZSBuYW1lIGRldGVybWluZWQgYnkgdGhpcyByb3V0aW5lLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRXU0RMRmlsZU5hbWUoU3RyaW5nIHdzZGxQYXRobmFtZSkKLSAgewotICAgIGlmICh3c2RsUGF0aG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAod3NkbFBhdGhuYW1lLmVuZHNXaXRoKCIud3NkbCIpKQotICAgICAgewotICAgICAgICBpbnQgbGFzdFNlcGFyYXRvclBvcyA9IE1hdGgubWF4KHdzZGxQYXRobmFtZS5sYXN0SW5kZXhPZigiLyIpLHdzZGxQYXRobmFtZS5sYXN0SW5kZXhPZigiXFwiKSk7Ci0gICAgICAgIGlmIChsYXN0U2VwYXJhdG9yUG9zID4gMCkKLSAgICAgICAgICByZXR1cm4gd3NkbFBhdGhuYW1lLnN1YnN0cmluZyhsYXN0U2VwYXJhdG9yUG9zKzEsd3NkbFBhdGhuYW1lLmxlbmd0aCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRlZmF1bHRfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Xcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2FjdGlvbnMvV3JpdGVXU0RMVG9Xb3JrYmVuY2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjZjZhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vYWN0aW9ucy9Xcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBjbGFzcyBXcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiAiYWN0aW9ucy9Xcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AiOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIHBvcHVsYXRlUHJvcGVydHlUYWJsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9jb25zdGFudHMvQWN0aW9uSW5wdXRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vY29uc3RhbnRzL0FjdGlvbklucHV0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmZlYWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9jb25zdGFudHMvQWN0aW9uSW5wdXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uSW5wdXRzCi17Ci0gIC8vIFVSTCBwYXJtIGZvciBhbGwgYWN0aW9ucyB3aGljaCBhcmUgaW4gdGhlIGhpc3RvcnkgbGlzdC4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNISVNUT1JZID0gImlzSGlzdG9yeSI7Ci0KLSAgLy8gVXRpbGl0eSBjb25zdGFudCBmb3IgdHJlZSBub2RlIGlkZW50aWZpY2F0aW9uLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFSUQgPSAibm9kZUlkIjsKLQotICAvLyBVdGlsaXR5IGNvbnN0YW50IGZvciB0b29sIGlkZW50aWZpY2F0aW9uLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MSUQgPSAidG9vbElkIjsKLQotICAvLyBVdGlsaXR5IGNvbnN0YW50IGZvciB2aWV3IGlkZW50aWZpY2F0aW9uLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXSUQgPSAidmlld0lkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklFV0lEX0RFRkFVTFQgPSAtMTsKLQotICAvLyBVdGlsaXR5IGNvbnN0YW50IGZvciB2aWV3IHRvb2wgaWRlbnRpZmljYXRpb24uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdUT09MSUQgPSAidmlld1Rvb2xJZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJRVdUT09MSURfREVGQVVMVCA9IC0xOwotCi0gIC8vIFV0aWxpdHkgY29uc3RhbnRzIGZvciB0cmFuc3BvcnQgY2xhc3NlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfQ0xBU1NfTkFNRSA9ICJvcmcudWRkaTRqLlRyYW5zcG9ydENsYXNzTmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQVNQT1JUX0NMQVNTID0gIm9yZy51ZGRpNGoudHJhbnNwb3J0LkFwYWNoZUF4aXNUcmFuc3BvcnQiOwotICAvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFYSVNfVFJBTlNQT1JUX0NMQVNTID0gIm9yZy51ZGRpNGoudHJhbnNwb3J0LkFwYWNoZUF4aXNUcmFuc3BvcnQiOwotICAvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfVFJBTlNQT1JUX0NMQVNTID0gIm9yZy51ZGRpNGoudHJhbnNwb3J0LkFwYWNoZVNPQVBUcmFuc3BvcnQiOwotCi0gIC8vIFRvZ2dsZU5vZGVBY3Rpb24gYW5kIGl0cyBkZXJpdmF0aXZlcy4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTiA9ICJvcGVuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BFTl9OT0RFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xPU0VfTk9ERSA9IDA7Ci0KLSAgLy8gU2hvd1BlcnNwZWN0aXZlQWN0aW9uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNQRUNUSVZFID0gInBlcnNwZWN0aXZlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU1BFQ1RJVkVfVURESSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBFUlNQRUNUSVZFX1dTSUwgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVJTUEVDVElWRV9XU0RMID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSU1BFQ1RJVkVfRkFWT1JJVEVTID0gMzsKLQotICAvLyBSZXRyaWV2ZUhpc3RvcnlBY3Rpb24KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVNUCA9ICJqdW1wIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSlVNUF9GT1JXQVJEID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSlVNUF9CQUNLID0gLTE7Ci0KLSAgLy8gTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbgotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXRUJfU0VSVklDRV9XSVpBUkQgPSAid2ViU2VydmljZVdpemFyZCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFdFQl9TRVJWSUNFX0NMSUVOVF9XSVpBUkQgPSAwOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQgPSAxOwotCi0gIC8vIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdPUktCRU5DSF9QUk9KRUNUX05BTUUgPSAid29ya2JlbmNoUHJvamVjdE5hbWUiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTVBPUlRfRklMRSA9ICJpbXBvcnRXU0RMIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JURURfRklMRV9OQU1FID0gImltcG9ydGVkRmlsZU5hbWUiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTVBPUlRfVE9fV1NJTCA9ICJpbXBvcnRUb1dTSUwiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0lMX0ZJTEVfTkFNRSA9ICJXU0lMRmlsZU5hbWUiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTVBPUlRFRF9XU0RMX1VSTCA9ICJpbXBvcnRlZFdzZGxVcmwiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTVBPUlRfQUNUSU9OID0gImltcG9ydEFjdGlvbiI7Ci0KLSAgLy8gUHJveHlMb2FkQWN0aW9uCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBUkdFVF9QQUdFID0gInRhcmdldFBhZ2UiOwotCi0gIC8vIFNlc3Npb24gSUQgZm9yIHBvcCB1cHMgd2hvc2UgYnJvd3NlcnMgY2hvb3NlIHRvIGlnbm9yZSB0aGUgc2Vzc2lvbi4KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VTU0lPTklEID0gInNJZCI7Ci0KLSAgLy8gV1NETCBCcm93c2VyCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1QgPSAicHJvamVjdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfVFlQRSA9ICJ3c2RsVHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTRExfVFlQRV9TRVJWSUNFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCA9ICJ3ZWJQcm9qZWN0V1NETFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0ZBVk9SSVRFX1dTRExfVVJMID0gImZhdm9yaXRlV1NETFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1dTRExfVVJMID0gIndzZGxVUkwiOwotCi0gIC8vIENhbGVuZGFyIEJyb3dzZXIKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMRU5EQVJfVFlQRSA9ICJjYWxlbmRhclR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxFTkRBUl9UWVBFX0RBVEUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxFTkRBUl9UWVBFX0RBVEVUSU1FID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMRU5EQVJfVFlQRV9HWUVBUk1PTlRIID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMRU5EQVJfVFlQRV9HREFZID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMRU5EQVJfVFlQRV9HTU9OVEhEQVkgPSA0OwotCi0gIC8vIFJlc2l6ZUZyYW1lQWN0aW9uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FX05BTUUgPSAiZnJhbWVOYW1lIjsKLQotICAvLyBPdGhlciBBY3Rpb25zCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVE9PTF9NQU5BR0VSID0gImN1cnJlbnRUb29sTWFuYWdlciI7Ci0gIAotICAvLyBBY3Rpb24gRW5naW5lCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTkdJTkVfU0NFTkFSSU8gPSAiYWN0aW9uRW5naW5lU2NlbmFyaW8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5HSU5FX01PREUgPSAiYWN0aW9uRW5naW5lTW9kZSI7Ci0KLSAgLy8gTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElQQVJUX0ZPUk1fREFUQV9QQVJTRVIgPSAibXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9jb25zdGFudHMvRnJhbWVOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9GcmFtZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzFmNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9GcmFtZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBGcmFtZU5hbWVzCi17Ci0gIC8vIHdzZXhwbG9yZXIuanNwCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdJTkRPV19OQU1FX1dTRVhQTE9SRVJfSlNQID0gIndzZXhwbG9yZXIuanNwIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEVSU1BFQ1RJVkVfV09SS0FSRUEgPSAicGVyc3BlY3RpdmVfd29ya2FyZWEiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRVJTUEVDVElWRV9UT09MQkFSID0gInBlcnNwZWN0aXZlX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRVJTUEVDVElWRV9DT05URU5UID0gInBlcnNwZWN0aXZlX2NvbnRlbnQiOwotICAKLSAgLy8gV1NETCBCcm93c2VyCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfVE9PTEJBUiA9ICJ3c2RsX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX0NPTlRFTlQgPSAid3NkbF9jb250ZW50IjsKLSAgCi0gIC8vIENhbGVuZGFyIEJyb3dzZXIKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FMRU5EQVJfVE9PTEJBUiA9ICJjYWxlbmRhcl90b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FMRU5EQVJfQ09OVEVOVCA9ICJjYWxlbmRhcl9jb250ZW50IjsgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9Nb2RlbENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9Nb2RlbENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDU1NTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9jb25zdGFudHMvTW9kZWxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIE1vZGVsQ29uc3RhbnRzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9JRCA9ICJyZWxhdGlvbnNoaXBJZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9MT0NBTE5BTUVfU0VQQVJBVE9SID0gIiMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfT1dORVIgPSAib3duZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfQ0hJTERSRU4gPSAiY2hpbGRyZW4iOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9Ub29sVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9jb25zdGFudHMvVG9vbFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNzEzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2NvbnN0YW50cy9Ub29sVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgVG9vbFR5cGVzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGT1JNID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEFDVElPTiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBWSUVXID0gMjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9kYXRhbW9kZWwvTGlzdEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9kYXRhbW9kZWwvTGlzdEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyOWY3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZGF0YW1vZGVsL0xpc3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLQotcHVibGljIGNsYXNzIExpc3RFbGVtZW50Ci17Ci0gIHByaXZhdGUgaW50IHZpZXdJZF87Ci0gIHByaXZhdGUgT2JqZWN0IG9iamVjdF87Ci0gIC8vIEZvciBzZWFyY2ggcGFyYW1ldGVyczogaW5mbyBvbiB0aGUgTm9kZSBhbmQgVmlld1Rvb2wgaG9sZGluZyB0aGlzIGVsZW1lbnQuCi0gIHByaXZhdGUgaW50IHRhcmdldE5vZGVJZF87Ci0gIHByaXZhdGUgaW50IHRhcmdldFRvb2xJZF87Ci0gIHByaXZhdGUgaW50IHRhcmdldFZpZXdJZF87Ci0KLSAgcHVibGljIExpc3RFbGVtZW50KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBvYmplY3RfID0gb2JqZWN0OwotICAgIHZpZXdJZF8gPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQ7Ci0gICAgdGFyZ2V0Tm9kZUlkXyA9IC0xOwotICAgIHRhcmdldFRvb2xJZF8gPSAtMTsKLSAgICB0YXJnZXRWaWV3SWRfID0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIG9iamVjdF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWaWV3SWQoaW50IHZpZXdJZCkKLSAgewotICAgIHZpZXdJZF8gPSB2aWV3SWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFZpZXdJZCgpCi0gIHsKLSAgICByZXR1cm4gdmlld0lkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFRhcmdldFZpZXdUb29sSW5mbyhpbnQgbm9kZUlkLGludCB0b29sSWQsaW50IHZpZXdJZCkKLSAgewotICAgIHRhcmdldE5vZGVJZF8gPSBub2RlSWQ7Ci0gICAgdGFyZ2V0VG9vbElkXyA9IHRvb2xJZDsKLSAgICB0YXJnZXRWaWV3SWRfID0gdmlld0lkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRUYXJnZXROb2RlSWQoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldE5vZGVJZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFRhcmdldFRvb2xJZCgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0VG9vbElkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VGFyZ2V0Vmlld0lkKCkKLSAgewotICAgIHJldHVybiB0YXJnZXRWaWV3SWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gZ2V0T2JqZWN0KCkudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2RhdGFtb2RlbC9MaXN0TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2RhdGFtb2RlbC9MaXN0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWM0NGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9kYXRhbW9kZWwvTGlzdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgTGlzdE1hbmFnZXIKLXsKLSAgcHJpdmF0ZSBpbnQgbmV4dFZpZXdJZF87Ci0gIHByaXZhdGUgVmVjdG9yIGl0ZW1zTGlzdF87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGl0ZW1zVGFibGVfOwotCi0gIHB1YmxpYyBMaXN0TWFuYWdlcigpCi0gIHsKLSAgICBuZXh0Vmlld0lkXyA9IDA7Ci0gICAgaXRlbXNMaXN0XyA9IG5ldyBWZWN0b3IoKTsKLSAgICBpdGVtc1RhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCB1cGRhdGVNYW5hZ2VyKExpc3RFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpdGVtc1RhYmxlXy5wdXQoU3RyaW5nLnZhbHVlT2YobmV4dFZpZXdJZF8pLGVsZW1lbnQpOwotICAgIGVsZW1lbnQuc2V0Vmlld0lkKG5leHRWaWV3SWRfKTsKLSAgICBuZXh0Vmlld0lkXysrOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgYWRkKExpc3RFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpdGVtc0xpc3RfLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgdXBkYXRlTWFuYWdlcihlbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFkZFdpdGhDdXJyZW50Vmlld0lkKExpc3RFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpdGVtc0xpc3RfLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgaXRlbXNUYWJsZV8ucHV0KFN0cmluZy52YWx1ZU9mKGVsZW1lbnQuZ2V0Vmlld0lkKCkpLGVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIExpc3RFbGVtZW50IGVsZW1lbnRBdChpbnQgaW5kZXgpCi0gIHsKLSAgICByZXR1cm4gKExpc3RFbGVtZW50KWl0ZW1zTGlzdF8uZWxlbWVudEF0KGluZGV4KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBMaXN0RWxlbWVudCBnZXRFbGVtZW50V2l0aFZpZXdJZChpbnQgdmlld0lkKQotICB7Ci0gICAgcmV0dXJuIChMaXN0RWxlbWVudClpdGVtc1RhYmxlXy5nZXQoU3RyaW5nLnZhbHVlT2Yodmlld0lkKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVFbGVtZW50V2l0aFZpZXdJZChpbnQgdmlld0lkKQotICB7Ci0gICAgaXRlbXNUYWJsZV8ucmVtb3ZlKFN0cmluZy52YWx1ZU9mKHZpZXdJZCkpOwotICAgIGZvciAoaW50IGk9MDtpPGl0ZW1zTGlzdF8uc2l6ZSgpO2krKykKLSAgICB7Ci0gICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IGVsZW1lbnRBdChpKTsKLSAgICAgIGlmIChsaXN0RWxlbWVudC5nZXRWaWV3SWQoKSA9PSB2aWV3SWQpCi0gICAgICB7Ci0gICAgICAgIGl0ZW1zTGlzdF8ucmVtb3ZlRWxlbWVudEF0KGkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVFbGVtZW50QXQoaW50IGluZGV4KQotICB7Ci0gICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZWxlbWVudEF0KGluZGV4KTsKLSAgICBpdGVtc0xpc3RfLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0gICAgaXRlbXNUYWJsZV8ucmVtb3ZlKFN0cmluZy52YWx1ZU9mKGxpc3RFbGVtZW50LmdldFZpZXdJZCgpKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBpbnNlcnRFbGVtZW50QXQoTGlzdEVsZW1lbnQgZWxlbWVudCxpbnQgaW5kZXgpCi0gIHsKLSAgICBpdGVtc0xpc3RfLmluc2VydEVsZW1lbnRBdChlbGVtZW50LGluZGV4KTsKLSAgICB1cGRhdGVNYW5hZ2VyKGVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIEVudW1lcmF0aW9uIGdldExpc3RFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gaXRlbXNMaXN0Xy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXIoKQotICB7Ci0gICAgaXRlbXNMaXN0Xy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIGl0ZW1zVGFibGVfLmNsZWFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTGlzdE1hbmFnZXIgY29weShMaXN0TWFuYWdlciBuZXdMaXN0TWFuYWdlcikKLSAgewotICAgIG5ld0xpc3RNYW5hZ2VyLmNsZWFyKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8aXRlbXNMaXN0Xy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWVsZW1lbnRBdChpKTsKLSAgICAgIExpc3RFbGVtZW50IG5ld0xpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KGxpc3RFbGVtZW50LmdldE9iamVjdCgpKTsKLSAgICAgIG5ld0xpc3RFbGVtZW50LnNldFZpZXdJZChsaXN0RWxlbWVudC5nZXRWaWV3SWQoKSk7Ci0gICAgICBuZXdMaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8obGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCksbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0VG9vbElkKCksbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkpOwotICAgICAgbmV3TGlzdE1hbmFnZXIuYWRkV2l0aEN1cnJlbnRWaWV3SWQobmV3TGlzdEVsZW1lbnQpOwotICAgIH0KLSAgICBuZXdMaXN0TWFuYWdlci5zZXROZXh0Vmlld0lkKG5leHRWaWV3SWRfKTsKLSAgICByZXR1cm4gbmV3TGlzdE1hbmFnZXI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXROZXh0Vmlld0lkKGludCBuZXh0Vmlld0lkKQotICB7Ci0gICAgbmV4dFZpZXdJZF8gPSBuZXh0Vmlld0lkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXROZXh0Vmlld0lkKCkKLSAgewotICAgIHJldHVybiBuZXh0Vmlld0lkXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2RhdGFtb2RlbC9UcmVlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2RhdGFtb2RlbC9UcmVlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDJkYTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9kYXRhbW9kZWwvVHJlZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotCi1wdWJsaWMgY2xhc3MgVHJlZUVsZW1lbnQgZXh0ZW5kcyBCYXNpY0VsZW1lbnQKLXsKLSAgcHJpdmF0ZSBTdHJpbmcga2V5XzsKLQotICBwdWJsaWMgVHJlZUVsZW1lbnQoU3RyaW5nIG5hbWUsTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1vZGVsKTsKLSAgICBrZXlfID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICB7Ci0gICAga2V5XyA9IGtleTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgewotICAgIHJldHVybiBrZXlfOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFRyZWVFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoa2V5XyA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBrZXlfLmVxdWFscyhlbGVtZW50LmdldEtleSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9BY3Rpb25EYXRhUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL0FjdGlvbkRhdGFQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmY2U1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL0FjdGlvbkRhdGFQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmNvbnN0YW50cy5BY3Rpb25EYXRhQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuZGF0YS5BY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuZGF0YS5TY2VuYXJpb0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlRyYW5zYWN0aW9uRGVzY3JpcHRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGF0YVBhcnNlcgotewotICBwcml2YXRlIERvY3VtZW50IGRvYzsKLQotICBwdWJsaWMgU2NlbmFyaW9EZXNjcmlwdG9yIHBhcnNlU2NlbmFyaW8oRWxlbWVudCBlKQotICB7Ci0gICAgU2NlbmFyaW9EZXNjcmlwdG9yIHNjZW5hcmlvRGVzY3JpcHRvciA9IG5ldyBTY2VuYXJpb0Rlc2NyaXB0b3IoKTsKLSAgICBOb2RlTGlzdCB0cmFuc2FjdGlvbnMgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKEFjdGlvbkRhdGFDb25zdGFudHMuRUxFTUVOVF9UUkFOU0FDVElPTik7Ci0gICAgVHJhbnNhY3Rpb25EZXNjcmlwdG9yW10gdHJhbnNhY3Rpb25EZXNjcmlwdG9ycyA9IG5ldyBUcmFuc2FjdGlvbkRlc2NyaXB0b3JbdHJhbnNhY3Rpb25zLmdldExlbmd0aCgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0gICAgICB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzW2ldID0gcGFyc2VUcmFuc2FjdGlvbigoRWxlbWVudCkgdHJhbnNhY3Rpb25zLml0ZW0oaSkpOwotICAgIHNjZW5hcmlvRGVzY3JpcHRvci5zZXRUcmFuc2FjdGlvbkRlc2NyaXB0b3JzKHRyYW5zYWN0aW9uRGVzY3JpcHRvcnMpOwotICAgIHJldHVybiBzY2VuYXJpb0Rlc2NyaXB0b3I7Ci0gIH0KLQotICBwdWJsaWMgVHJhbnNhY3Rpb25EZXNjcmlwdG9yIHBhcnNlVHJhbnNhY3Rpb24oRWxlbWVudCBlKQotICB7Ci0gICAgVHJhbnNhY3Rpb25EZXNjcmlwdG9yIHRyYW5zYWN0aW9uRGVzY3JpcHRvciA9IG5ldyBUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKTsKLSAgICBOb2RlTGlzdCBhY3Rpb25zID0gZS5nZXRFbGVtZW50c0J5VGFnTmFtZShBY3Rpb25EYXRhQ29uc3RhbnRzLkVMRU1FTlRfQUNUSU9OKTsKLSAgICBBY3Rpb25EZXNjcmlwdG9yW10gYWN0aW9uRGVzY3JpcHRvcnMgPSBuZXcgQWN0aW9uRGVzY3JpcHRvclthY3Rpb25zLmdldExlbmd0aCgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotICAgICAgYWN0aW9uRGVzY3JpcHRvcnNbaV0gPSBwYXJzZUFjdGlvbigoRWxlbWVudCkgYWN0aW9ucy5pdGVtKGkpKTsKLSAgICB0cmFuc2FjdGlvbkRlc2NyaXB0b3Iuc2V0QWN0aW9uRGVzY3JpcHRvcnMoYWN0aW9uRGVzY3JpcHRvcnMpOwotICAgIHJldHVybiB0cmFuc2FjdGlvbkRlc2NyaXB0b3I7Ci0gIH0KLQotICBwdWJsaWMgQWN0aW9uRGVzY3JpcHRvciBwYXJzZUFjdGlvbihFbGVtZW50IGUpCi0gIHsKLSAgICBBY3Rpb25EZXNjcmlwdG9yIGFjdGlvbkRlc2NyaXB0b3IgPSBuZXcgQWN0aW9uRGVzY3JpcHRvcigpOwotICAgIGFjdGlvbkRlc2NyaXB0b3Iuc2V0SWQoZS5nZXRBdHRyaWJ1dGUoQWN0aW9uRGF0YUNvbnN0YW50cy5BVFRSX0lEKSk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYWN0aW9uRGVzY3JpcHRvci5zZXRBdHRlbXB0cyhJbnRlZ2VyLnBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKEFjdGlvbkRhdGFDb25zdGFudHMuQVRUUl9BVFRFTVBUUykpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIGFjdGlvbkRlc2NyaXB0b3Iuc2V0QXR0ZW1wdHMoMSk7Ci0gICAgfQotICAgIGFjdGlvbkRlc2NyaXB0b3Iuc2V0U3RhdHVzSWQoZS5nZXRBdHRyaWJ1dGUoQWN0aW9uRGF0YUNvbnN0YW50cy5BVFRSX1NUQVRVU19JRCkpOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0aWVzVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgTm9kZUxpc3QgcHJvcGVydGllcyA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoQWN0aW9uRGF0YUNvbnN0YW50cy5FTEVNRU5UX1BST1BFUlRZKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IHByb3BlcnR5ID0gKEVsZW1lbnQpIHByb3BlcnRpZXMuaXRlbShpKTsKLSAgICAgIFN0cmluZyBuYW1lID0gcHJvcGVydHkuZ2V0QXR0cmlidXRlKEFjdGlvbkRhdGFDb25zdGFudHMuQVRUUl9OQU1FKTsKLSAgICAgIE5vZGVMaXN0IHZhbHVlTGlzdCA9IHByb3BlcnR5LmdldEVsZW1lbnRzQnlUYWdOYW1lKEFjdGlvbkRhdGFDb25zdGFudHMuRUxFTUVOVF9WQUxVRSk7Ci0gICAgICBpZiAodmFsdWVMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZUxpc3QuZ2V0TGVuZ3RoKCldOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHZhbHVlcy5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgdmFsdWUgPSAoRWxlbWVudCkgdmFsdWVMaXN0Lml0ZW0oaik7Ci0gICAgICAgICAgTm9kZSB0ZXh0Tm9kZSA9IHZhbHVlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICB2YWx1ZXNbal0gPSAodGV4dE5vZGUgIT0gbnVsbCkgPyB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkgOiAiIjsKLSAgICAgICAgfQotICAgICAgICBwcm9wZXJ0aWVzVGFibGUucHV0KG5hbWUsIHZhbHVlcyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIE5vZGUgdGV4dE5vZGUgPSAoKEVsZW1lbnQpIHZhbHVlTGlzdC5pdGVtKDApKS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIHByb3BlcnRpZXNUYWJsZS5wdXQobmFtZSwgKHRleHROb2RlICE9IG51bGwpID8gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpIDogIiIpOwotICAgICAgfQotICAgIH0KLSAgICBhY3Rpb25EZXNjcmlwdG9yLnNldFByb3BlcnRpZXMocHJvcGVydGllc1RhYmxlKTsKLSAgICBOb2RlTGlzdCBzdGF0dXNMaXN0ID0gZS5nZXRFbGVtZW50c0J5VGFnTmFtZShBY3Rpb25EYXRhQ29uc3RhbnRzLkVMRU1FTlRfU1RBVFVTKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c0xpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IHN0YXR1cyA9IChFbGVtZW50KXN0YXR1c0xpc3QuaXRlbShpKTsKLSAgICAgIENEQVRBU2VjdGlvbiBjRGF0YSA9IChDREFUQVNlY3Rpb24pc3RhdHVzLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgIGFjdGlvbkRlc2NyaXB0b3IuYWRkU3RhdHVzKGNEYXRhLmdldERhdGEoKSk7Ci0gICAgfQotICAgIHJldHVybiBhY3Rpb25EZXNjcmlwdG9yOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgdG9FbGVtZW50KFNjZW5hcmlvRGVzY3JpcHRvciBzY2VuYXJpb0Rlc2NyaXB0b3IpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0gICAgICBFbGVtZW50IHNjZW5hcmlvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoQWN0aW9uRGF0YUNvbnN0YW50cy5FTEVNRU5UX1NDRU5BUklPKTsKLSAgICAgIFRyYW5zYWN0aW9uRGVzY3JpcHRvcltdIHRyYW5zYWN0aW9uRGVzY3JpcHRvcnMgPSBzY2VuYXJpb0Rlc2NyaXB0b3IuZ2V0VHJhbnNhY3Rpb25EZXNjcmlwdG9ycygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBFbGVtZW50IHRyYW5zYWN0aW9uRWxlbWVudCA9IHRvRWxlbWVudCh0cmFuc2FjdGlvbkRlc2NyaXB0b3JzW2ldKTsKLSAgICAgICAgaWYgKHRyYW5zYWN0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHNjZW5hcmlvRWxlbWVudC5hcHBlbmRDaGlsZCh0cmFuc2FjdGlvbkVsZW1lbnQpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNjZW5hcmlvRWxlbWVudDsKLSAgICB9Ci0gICAgY2F0Y2ggKERPTUV4Y2VwdGlvbiBkb21lKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IHRvRWxlbWVudChUcmFuc2FjdGlvbkRlc2NyaXB0b3IgdHJhbnNhY3Rpb25EZXNjcmlwdG9yKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotICAgICAgRWxlbWVudCB0cmFuc2FjdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEFjdGlvbkRhdGFDb25zdGFudHMuRUxFTUVOVF9UUkFOU0FDVElPTik7Ci0gICAgICBBY3Rpb25EZXNjcmlwdG9yW10gYWN0aW9uRGVzY3JpcHRvcnMgPSB0cmFuc2FjdGlvbkRlc2NyaXB0b3IuZ2V0QWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgYWN0aW9uRWxlbWVudCA9IHRvRWxlbWVudChhY3Rpb25EZXNjcmlwdG9yc1tpXSk7Ci0gICAgICAgIGlmIChhY3Rpb25FbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgdHJhbnNhY3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKGFjdGlvbkVsZW1lbnQpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uRWxlbWVudDsKLSAgICB9Ci0gICAgY2F0Y2ggKERPTUV4Y2VwdGlvbiBkb21lKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IHRvRWxlbWVudChBY3Rpb25EZXNjcmlwdG9yIGFjdGlvbkRlc2NyaXB0b3IpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGdldERvY3VtZW50KCk7Ci0gICAgICBFbGVtZW50IGFjdGlvbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KEFjdGlvbkRhdGFDb25zdGFudHMuRUxFTUVOVF9BQ1RJT04pOwotICAgICAgYWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoQWN0aW9uRGF0YUNvbnN0YW50cy5BVFRSX0lELCBhY3Rpb25EZXNjcmlwdG9yLmdldElkKCkpOwotICAgICAgYWN0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoQWN0aW9uRGF0YUNvbnN0YW50cy5BVFRSX0FUVEVNUFRTLCBTdHJpbmcudmFsdWVPZihhY3Rpb25EZXNjcmlwdG9yLmdldEF0dGVtcHRzKCkpKTsKLSAgICAgIFN0cmluZyBzdGF0dXNJZCA9IGFjdGlvbkRlc2NyaXB0b3IuZ2V0U3RhdHVzSWQoKTsKLSAgICAgIGlmIChzdGF0dXNJZCAhPSBudWxsKQotICAgICAgICBhY3Rpb25FbGVtZW50LnNldEF0dHJpYnV0ZShBY3Rpb25EYXRhQ29uc3RhbnRzLkFUVFJfU1RBVFVTX0lELCBzdGF0dXNJZCk7Ci0gICAgICBIYXNodGFibGUgcHJvcGVydGllcyA9IGFjdGlvbkRlc2NyaXB0b3IuZ2V0UHJvcGVydGllcygpOwotICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgT2JqZWN0IHZhbHVlID0gcHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICAgICAgICBPYmplY3RbXSB2YWx1ZXM7Ci0gICAgICAgICAgaWYgKHZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKQotICAgICAgICAgICAgdmFsdWVzID0gKE9iamVjdFtdKXZhbHVlOwotICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgICAgICAgIHZhbHVlcyA9ICgoTGlzdCl2YWx1ZSkudG9BcnJheSgpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbXSB7dmFsdWV9OwotICAgICAgICAgIGJvb2xlYW4gaXNBZGRlZCA9IGZhbHNlOwotICAgICAgICAgIEVsZW1lbnQgcHJvcGVydHlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChBY3Rpb25EYXRhQ29uc3RhbnRzLkVMRU1FTlRfUFJPUEVSVFkpOwotICAgICAgICAgIHByb3BlcnR5RWxlbWVudC5zZXRBdHRyaWJ1dGUoQWN0aW9uRGF0YUNvbnN0YW50cy5BVFRSX05BTUUsIGtleS50b1N0cmluZygpKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWVzW2ldIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFbGVtZW50IHZhbHVlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoQWN0aW9uRGF0YUNvbnN0YW50cy5FTEVNRU5UX1ZBTFVFKTsKLSAgICAgICAgICAgICAgdmFsdWVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlc1tpXS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgIHByb3BlcnR5RWxlbWVudC5hcHBlbmRDaGlsZCh2YWx1ZUVsZW1lbnQpOwotICAgICAgICAgICAgICBpc0FkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlzQWRkZWQpCi0gICAgICAgICAgICBhY3Rpb25FbGVtZW50LmFwcGVuZENoaWxkKHByb3BlcnR5RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIExpc3Qgc3RhdHVzID0gYWN0aW9uRGVzY3JpcHRvci5nZXRTdGF0dXMoKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHN0YXR1cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBzdGF0dXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChBY3Rpb25EYXRhQ29uc3RhbnRzLkVMRU1FTlRfU1RBVFVTKTsKLSAgICAgICAgICBDREFUQVNlY3Rpb24gY0RhdGEgPSBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oaXQubmV4dCgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIHN0YXR1c0VsZW1lbnQuYXBwZW5kQ2hpbGQoY0RhdGEpOwotICAgICAgICAgIGFjdGlvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoc3RhdHVzRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBhY3Rpb25FbGVtZW50OwotICAgIH0KLSAgICBjYXRjaCAoRE9NRXhjZXB0aW9uIGRvbWUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBEb2N1bWVudCBnZXREb2N1bWVudCgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgICBkb2MgPSBidWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZG9jOwotICAgIH0KLSAgICBjYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBmY2UpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL0FjdGlvbkVuZ2luZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9BY3Rpb25FbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzZTMyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL0FjdGlvbkVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlNob3dQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmNvbnN0YW50cy5BY3Rpb25EYXRhQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuZGF0YS5BY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuZGF0YS5TY2VuYXJpb0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlRyYW5zYWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIEFjdGlvbkVuZ2luZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9ESVNBQkxFRCA9IDB4MDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfU1RPUCA9IDB4MTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE1PREVfUkVDT1JEID0gMHgyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgTU9ERV9QTEFZID0gMHgzOwotCi0gIHByaXZhdGUgQ29udHJvbGxlciBjb250cm9sbGVyOwotICBwcml2YXRlIGJ5dGUgbW9kZTsKLSAgcHJpdmF0ZSBWZWN0b3IgYWN0aW9uRGVzY3JpcHRvcnM7Ci0KLSAgcHVibGljIEFjdGlvbkVuZ2luZShDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgIG1vZGUgPSBNT0RFX0RJU0FCTEVEOwotICAgIGFjdGlvbkRlc2NyaXB0b3JzID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZVNjZW5hcmlvKFNjZW5hcmlvRGVzY3JpcHRvciBzY2VuYXJpb0Rlc2NyaXB0b3IpCi0gIHsKLSAgICBUcmFuc2FjdGlvbkRlc2NyaXB0b3JbXSB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzID0gc2NlbmFyaW9EZXNjcmlwdG9yLmdldFRyYW5zYWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0gICAgICBleGVjdXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25EZXNjcmlwdG9yc1tpXSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlVHJhbnNhY3Rpb24oVHJhbnNhY3Rpb25EZXNjcmlwdG9yIHRyYW5zYWN0aW9uRGVzY3JpcHRvcikKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBBY3Rpb25EZXNjcmlwdG9yW10gYWN0aW9uRGVzY3JpcHRvcnMgPSB0cmFuc2FjdGlvbkRlc2NyaXB0b3IuZ2V0QWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHQpCi0gICAgICB7Ci0gICAgICAgIGlmICghZXhlY3V0ZUFjdGlvbihhY3Rpb25EZXNjcmlwdG9yc1tpXSkpCi0gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGFjdGlvbkRlc2NyaXB0b3JzW2ldLnNldFN0YXR1c0lkKEFjdGlvbkRhdGFDb25zdGFudHMuVkFMVUVfU1RBVFVTX0lEX1VOQVRURU1QVEVEKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVBY3Rpb24oQWN0aW9uRGVzY3JpcHRvciBhY3Rpb25EZXNjcmlwdG9yKQotICB7Ci0gICAgaW50IGF0dGVtcHRzID0gYWN0aW9uRGVzY3JpcHRvci5nZXRBdHRlbXB0cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ZW1wdHM7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgY2xhc3NBY3Rpb24gPSBDbGFzcy5mb3JOYW1lKGFjdGlvbkRlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChBY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGFzc0FjdGlvbikpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gKEFjdGlvbikgbmV3SW5zdGFuY2UoY2xhc3NBY3Rpb24pOwotICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBIYXNodGFibGUgcHJvcGVydGllcyA9IGFjdGlvbkRlc2NyaXB0b3IuZ2V0UHJvcGVydGllcygpOwotICAgICAgICAgICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gYWN0aW9uLmdldFRyYW5zZm9ybWVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0cmFuc2Zvcm1lcnMubGVuZ3RoOyBqKyspCi0gICAgICAgICAgICAgIHByb3BlcnRpZXMgPSB0cmFuc2Zvcm1lcnNbal0uZGVOb3JtYWxpemUocHJvcGVydGllcyk7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0UHJvcGVydHlUYWJsZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgLy8gVE9ETyBhY3Rpb25EZXNjcmlwdG9yLmFkZFN0YXR1cyhhY3Rpb24uZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgaWYgKGFjdGlvblJlc3VsdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYWN0aW9uRGVzY3JpcHRvci5zZXRTdGF0dXNJZChBY3Rpb25EYXRhQ29uc3RhbnRzLlZBTFVFX1NUQVRVU19JRF9QQVNTRUQpOwotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oYWN0aW9uRGVzY3JpcHRvci5nZXRJZCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkKLSAgICAgIHsKLSAgICAgICAgY25mZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICBjbmZlLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKLSAgICAgICAgYWN0aW9uRGVzY3JpcHRvci5hZGRTdGF0dXMoc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgdC5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN3KSk7Ci0gICAgICAgIGFjdGlvbkRlc2NyaXB0b3IuYWRkU3RhdHVzKHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgIH0KLSAgICBhY3Rpb25EZXNjcmlwdG9yLnNldFN0YXR1c0lkKEFjdGlvbkRhdGFDb25zdGFudHMuVkFMVUVfU1RBVFVTX0lEX0ZBSUxFRCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBTY2VuYXJpb0Rlc2NyaXB0b3IgbmV3U2NlbmFyaW9EZXNjcmlwdG9yKCkKLSAgewotICAgIHJldHVybiBuZXcgU2NlbmFyaW9EZXNjcmlwdG9yKCk7Ci0gIH0KLQotICBwcml2YXRlIFRyYW5zYWN0aW9uRGVzY3JpcHRvciBuZXdUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKTsKLSAgfQotCi0gIHByaXZhdGUgQWN0aW9uRGVzY3JpcHRvciBuZXdBY3Rpb25EZXNjcmlwdG9yKEFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICBBY3Rpb25EZXNjcmlwdG9yIGFjdGlvbkRlc2NyaXB0b3IgPSBuZXcgQWN0aW9uRGVzY3JpcHRvcigpOwotICAgIGFjdGlvbkRlc2NyaXB0b3Iuc2V0SWQoYWN0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICBIYXNodGFibGUgcHJvcGVydGllcyA9IG5ldyBIYXNodGFibGUoYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKSk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gYWN0aW9uLmdldFRyYW5zZm9ybWVycygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNmb3JtZXJzLmxlbmd0aDsgaSsrKQotICAgICAgcHJvcGVydGllcyA9IHRyYW5zZm9ybWVyc1tpXS5ub3JtYWxpemUocHJvcGVydGllcyk7Ci0gICAgYWN0aW9uRGVzY3JpcHRvci5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotICAgIHJldHVybiBhY3Rpb25EZXNjcmlwdG9yOwotICB9Ci0KLSAgcHJpdmF0ZSBPYmplY3QgbmV3SW5zdGFuY2UoQ2xhc3MgYykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGluc3RhbnRpYXRlcyB0aGUgYWN0aW9uIHVzaW5nIHRoZSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGluIGEKLSAgICAgIC8vIGNvbnRyb2xsZXIgb2JqZWN0Ci0gICAgICBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IGMuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW117Q29udHJvbGxlci5jbGFzc30pOwotICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtjb250cm9sbGVyfSk7Ci0gICAgfQotICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICB9Ci0gICAgT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBpbnN0YW50aWF0ZXMgdGhlIGFjdGlvbiB1c2luZyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBjLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1swXSk7Ci0gICAgICBpbnN0YW5jZSA9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbMF0pOwotICAgICAgTWV0aG9kIG1ldGhvZCA9IGMuZ2V0TWV0aG9kKCJzZXRDb250cm9sbGVyIiwgbmV3IENsYXNzW117Q29udHJvbGxlci5jbGFzc30pOwotICAgICAgbWV0aG9kLmludm9rZShpbnN0YW5jZSwgbmV3IE9iamVjdFtde2NvbnRyb2xsZXJ9KTsKLSAgICB9Ci0gICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAKLSAgcHVibGljIGJ5dGUgZ2V0TW9kZSgpCi0gIHsKLSAgICByZXR1cm4gbW9kZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TW9kZShieXRlIG1vZGUpCi0gIHsKLSAgICB0aGlzLm1vZGUgPSBtb2RlOwotICAgIGlmIChtb2RlID09IE1PREVfUkVDT1JEKQotICAgIHsKLSAgICAgIGFjdGlvbkRlc2NyaXB0b3JzID0gbmV3IFZlY3RvcigpOwotICAgICAgU2hvd1BlcnNwZWN0aXZlQWN0aW9uIHNob3dQZXJzcGVjdGl2ZUFjdGlvbiA9IG5ldyBTaG93UGVyc3BlY3RpdmVBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICBzaG93UGVyc3BlY3RpdmVBY3Rpb24uYWRkUHJvcGVydHkoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFLCBTdHJpbmcudmFsdWVPZihjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldFBlcnNwZWN0aXZlSWQoKSkpOwotICAgICAgYWN0aW9uRGVzY3JpcHRvcnMuYWRkKG5ld0FjdGlvbkRlc2NyaXB0b3Ioc2hvd1BlcnNwZWN0aXZlQWN0aW9uKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlQWN0aW9uKEFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICBpZiAobW9kZSA9PSBNT0RFX1JFQ09SRCkKLSAgICB7Ci0gICAgICBBY3Rpb25EZXNjcmlwdG9yIGFjdGlvbkRlc2NyaXB0b3IgPSBuZXdBY3Rpb25EZXNjcmlwdG9yKGFjdGlvbik7Ci0gICAgICBhY3Rpb25EZXNjcmlwdG9ycy5hZGQoYWN0aW9uRGVzY3JpcHRvcik7Ci0gICAgfQotICAgIHJldHVybiBhY3Rpb24ucnVuKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTY2VuYXJpb0Rlc2NyaXB0b3IgZ2V0U2NlbmFyaW8oKQotICB7Ci0gICAgU2NlbmFyaW9EZXNjcmlwdG9yIHNjZW5hcmlvRGVzY3JpcHRvciA9IG5ld1NjZW5hcmlvRGVzY3JpcHRvcigpOwotICAgIFRyYW5zYWN0aW9uRGVzY3JpcHRvciB0cmFuc2FjdGlvbkRlc2NyaXB0b3IgPSBuZXdUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKTsKLSAgICBBY3Rpb25EZXNjcmlwdG9yW10gYWN0aW9uRGVzY3JpcHRvckFycmF5ID0gKEFjdGlvbkRlc2NyaXB0b3JbXSlhY3Rpb25EZXNjcmlwdG9ycy50b0FycmF5KG5ldyBBY3Rpb25EZXNjcmlwdG9yWzBdKTsKLSAgICB0cmFuc2FjdGlvbkRlc2NyaXB0b3Iuc2V0QWN0aW9uRGVzY3JpcHRvcnMoYWN0aW9uRGVzY3JpcHRvckFycmF5KTsKLSAgICBzY2VuYXJpb0Rlc2NyaXB0b3Iuc2V0VHJhbnNhY3Rpb25EZXNjcmlwdG9ycyhuZXcgVHJhbnNhY3Rpb25EZXNjcmlwdG9yW10ge3RyYW5zYWN0aW9uRGVzY3JpcHRvcn0pOwotICAgIHJldHVybiBzY2VuYXJpb0Rlc2NyaXB0b3I7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2NvbnN0YW50cy9BY3Rpb25EYXRhQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2NvbnN0YW50cy9BY3Rpb25EYXRhQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNTNlZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9jb25zdGFudHMvQWN0aW9uRGF0YUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEFjdGlvbkRhdGFDb25zdGFudHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRSA9ICJuYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BVFRFTVBUUyA9ICJhdHRlbXB0cyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1RBVFVTX0lEID0gInN0YXR1c0lkIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfU0NFTkFSSU8gPSAic2NlbmFyaW8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RSQU5TQUNUSU9OID0gInRyYW5zYWN0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9BQ1RJT04gPSAiYWN0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVkFMVUUgPSAidmFsdWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1NUQVRVUyA9ICJzdGF0dXMiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1RBVFVTX0lEX1VOQVRURU1QVEVEID0gInVuYXR0ZW1wdGVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1RBVFVTX0lEX1BBU1NFRCA9ICJwYXNzZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9TVEFUVVNfSURfRkFJTEVEID0gImZhaWxlZCI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9kYXRhL0FjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvZGF0YS9BY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YmI1YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9kYXRhL0FjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQWN0aW9uRGVzY3JpcHRvcgotewotICBwcml2YXRlIFN0cmluZyBpZDsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcHJvcGVydGllczsKLSAgcHJpdmF0ZSBpbnQgYXR0ZW1wdHM7Ci0gIHByaXZhdGUgU3RyaW5nIHN0YXR1c0lkOwotICBwcml2YXRlIExpc3Qgc3RhdHVzTGlzdDsKLSAgCi0gIHB1YmxpYyBBY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIGF0dGVtcHRzID0gMTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuIGlkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpCi0gIHsKLSAgICB0aGlzLmlkID0gaWQ7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGdldFByb3BlcnRpZXMoKQotICB7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICB9Ci0gIAotICBwdWJsaWMgaW50IGdldEF0dGVtcHRzKCkKLSAgewotICAJcmV0dXJuIGF0dGVtcHRzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBdHRlbXB0cyhpbnQgYXR0ZW1wdHMpCi0gIHsKLSAgCXRoaXMuYXR0ZW1wdHMgPSBhdHRlbXB0czsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNJZCgpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzSWQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1c0lkKFN0cmluZyBzdGF0dXNJZCkKLSAgewotICAgIHRoaXMuc3RhdHVzSWQgPSBzdGF0dXNJZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkU3RhdHVzKE9iamVjdCBzdGF0dXMpCi0gIHsKLSAgICBpZiAoc3RhdHVzICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHN0YXR1c0xpc3QgPT0gbnVsbCkKLSAgICAgICAgc3RhdHVzTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHN0YXR1c0xpc3QuYWRkKHN0YXR1cyk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVTdGF0dXMoT2JqZWN0IHN0YXR1cykKLSAgewotICAgIGlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXNMaXN0ICE9IG51bGwpCi0gICAgICByZXR1cm4gc3RhdHVzTGlzdC5yZW1vdmUoc3RhdHVzKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldFN0YXR1cygpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzTGlzdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvZGF0YS9TY2VuYXJpb0Rlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvZGF0YS9TY2VuYXJpb0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhM2Y5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2RhdGEvU2NlbmFyaW9EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuZGF0YTsKLQotcHVibGljIGNsYXNzIFNjZW5hcmlvRGVzY3JpcHRvcgotewotICBwcml2YXRlIFRyYW5zYWN0aW9uRGVzY3JpcHRvcltdIHRyYW5zYWN0aW9uRGVzY3JpcHRvcnM7Ci0KLSAgcHVibGljIFRyYW5zYWN0aW9uRGVzY3JpcHRvcltdIGdldFRyYW5zYWN0aW9uRGVzY3JpcHRvcnMoKQotICB7Ci0gICAgcmV0dXJuIHRyYW5zYWN0aW9uRGVzY3JpcHRvcnM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uRGVzY3JpcHRvcnMoVHJhbnNhY3Rpb25EZXNjcmlwdG9yW10gdHJhbnNhY3Rpb25EZXNjcmlwdG9ycykKLSAgewotICAgIHRoaXMudHJhbnNhY3Rpb25EZXNjcmlwdG9ycyA9IHRyYW5zYWN0aW9uRGVzY3JpcHRvcnM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2RhdGEvVHJhbnNhY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL2RhdGEvVHJhbnNhY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZjY3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS9kYXRhL1RyYW5zYWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLmRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2FjdGlvbkRlc2NyaXB0b3IKLXsKLSAgcHJpdmF0ZSBBY3Rpb25EZXNjcmlwdG9yW10gYWN0aW9uRGVzY3JpcHRvcnM7Ci0KLSAgcHVibGljIEFjdGlvbkRlc2NyaXB0b3JbXSBnZXRBY3Rpb25EZXNjcmlwdG9ycygpCi0gIHsKLSAgICByZXR1cm4gYWN0aW9uRGVzY3JpcHRvcnM7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEFjdGlvbkRlc2NyaXB0b3JzKEFjdGlvbkRlc2NyaXB0b3JbXSBhY3Rpb25EZXNjcmlwdG9ycykKLSAgewotICAgIHRoaXMuYWN0aW9uRGVzY3JpcHRvcnMgPSBhY3Rpb25EZXNjcmlwdG9yczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvQ3VycmVudE5vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9DdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjMyOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9DdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgSVRyYW5zZm9ybWVyCi17Ci0gIHByb3RlY3RlZCBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2V5OwotCi0gIHB1YmxpYyBDdXJyZW50Tm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHRoaXMoY29udHJvbGxlciwgQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gIH0KLQotICBwdWJsaWMgQ3VycmVudE5vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lcihDb250cm9sbGVyIGNvbnRyb2xsZXIsIFN0cmluZyBrZXkpCi0gIHsKLSAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgIHRoaXMua2V5ID0ga2V5OwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBub3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotICAKLSAgcHVibGljIEhhc2h0YWJsZSBkZU5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIE5vZGUgY3Vyck5vZGUgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgaWYgKGN1cnJOb2RlICE9IG51bGwpCi0gICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIFN0cmluZy52YWx1ZU9mKGN1cnJOb2RlLmdldE5vZGVJZCgpKSk7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL0lUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9JVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1NWZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL0lUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGludGVyZmFjZSBJVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIEhhc2h0YWJsZSBub3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpOwotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL01hc3NOb2RlSWRUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9NYXNzTm9kZUlkVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhYzM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL01hc3NOb2RlSWRUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci0KLXB1YmxpYyBjbGFzcyBNYXNzTm9kZUlkVHJhbnNmb3JtZXIgZXh0ZW5kcyBOb2RlSWRUcmFuc2Zvcm1lcgotewotICBwcm90ZWN0ZWQgU3RyaW5nIG1hc3NOb2RlSWRLZXk7Ci0KLSAgcHVibGljIE1hc3NOb2RlSWRUcmFuc2Zvcm1lcihDb250cm9sbGVyIGNvbnRyb2xsZXIsIFN0cmluZyBtYXNzTm9kZUlkS2V5KQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgdGhpcy5tYXNzTm9kZUlkS2V5ID0gbWFzc05vZGVJZEtleTsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgbm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgaWYgKCFwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG1hc3NOb2RlSWRLZXkpKQotICAgICAgcmV0dXJuIHN1cGVyLm5vcm1hbGl6ZShwcm9wZXJ0aWVzKTsKLSAgICBPYmplY3Qgb3JpZ05vZGVJZCA9IHByb3BlcnRpZXMuZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIFN0cmluZ1tdIG1hc3NOb2RlSWRzID0gZ2V0VmFsdWVBc1N0cmluZ0FycmF5KHByb3BlcnRpZXMsIG1hc3NOb2RlSWRLZXkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzc05vZGVJZHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcHJvcGVydGllcy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgbWFzc05vZGVJZHNbaV0pOwotICAgICAgcHJvcGVydGllcyA9IHN1cGVyLm5vcm1hbGl6ZShwcm9wZXJ0aWVzKTsKLSAgICAgIFN0cmluZ1tdIHJlbHMgPSBnZXRWYWx1ZUFzU3RyaW5nQXJyYXkocHJvcGVydGllcywgTW9kZWxDb25zdGFudHMuUkVMX0lEKTsKLSAgICAgIGlmIChyZWxzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoTW9kZWxDb25zdGFudHMuUkVMX0lEKTsKLSAgICAgICAgc2IuYXBwZW5kKE1vZGVsQ29uc3RhbnRzLlJFTF9MT0NBTE5BTUVfU0VQQVJBVE9SKTsKLSAgICAgICAgc2IuYXBwZW5kKG1hc3NOb2RlSWRzW2ldKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoc2IudG9TdHJpbmcoKSwgcmVscyk7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0aWVzLnJlbW92ZShBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgIHByb3BlcnRpZXMucmVtb3ZlKE1vZGVsQ29uc3RhbnRzLlJFTF9JRCk7Ci0gICAgfQotICAgIGlmIChvcmlnTm9kZUlkICE9IG51bGwpCi0gICAgICBwcm9wZXJ0aWVzLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBvcmlnTm9kZUlkKTsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZGVOb3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICBpZiAoIXByb3BlcnRpZXMuY29udGFpbnNLZXkobWFzc05vZGVJZEtleSkpCi0gICAgICByZXR1cm4gc3VwZXIuZGVOb3JtYWxpemUocHJvcGVydGllcyk7Ci0gICAgVmVjdG9yIG1hc3NOb2RlSWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgT2JqZWN0IG9yaWdOb2RlSWQgPSBwcm9wZXJ0aWVzLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBwcm9wZXJ0aWVzLnJlbW92ZShBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBTdHJpbmdbXSBtYXNzTm9kZUlkcyA9IGdldFZhbHVlQXNTdHJpbmdBcnJheShwcm9wZXJ0aWVzLCBtYXNzTm9kZUlkS2V5KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hc3NOb2RlSWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoTW9kZWxDb25zdGFudHMuUkVMX0lEKTsKLSAgICAgIHNiLmFwcGVuZChNb2RlbENvbnN0YW50cy5SRUxfTE9DQUxOQU1FX1NFUEFSQVRPUik7Ci0gICAgICBzYi5hcHBlbmQobWFzc05vZGVJZHNbaV0pOwotICAgICAgT2JqZWN0IHJlbHMgPSBwcm9wZXJ0aWVzLmdldChzYi50b1N0cmluZygpKTsKLSAgICAgIGlmIChyZWxzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KE1vZGVsQ29uc3RhbnRzLlJFTF9JRCwgcmVscyk7Ci0gICAgICAgIHByb3BlcnRpZXMgPSBzdXBlci5kZU5vcm1hbGl6ZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgT2JqZWN0IG5vZGVJZCA9IHByb3BlcnRpZXMuZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgICBpZiAobm9kZUlkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXNzTm9kZUlkVmVjdG9yLmFkZChub2RlSWQpOwotICAgICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnRpZXMucmVtb3ZlKE1vZGVsQ29uc3RhbnRzLlJFTF9JRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChvcmlnTm9kZUlkICE9IG51bGwpCi0gICAgICBwcm9wZXJ0aWVzLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBvcmlnTm9kZUlkKTsKLSAgICBpbnQgc2l6ZSA9IG1hc3NOb2RlSWRWZWN0b3Iuc2l6ZSgpOwotICAgIGlmIChzaXplID09IDEpCi0gICAgICBwcm9wZXJ0aWVzLnB1dChtYXNzTm9kZUlkS2V5LCBtYXNzTm9kZUlkVmVjdG9yLmdldCgwKSk7Ci0gICAgZWxzZSBpZiAoc2l6ZSA+IDEpCi0gICAgICBwcm9wZXJ0aWVzLnB1dChtYXNzTm9kZUlkS2V5LCBtYXNzTm9kZUlkVmVjdG9yLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgIGVsc2UKLSAgICAgIHByb3BlcnRpZXMucmVtb3ZlKG1hc3NOb2RlSWRLZXkpOwotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRWYWx1ZUFzU3RyaW5nQXJyYXkoSGFzaHRhYmxlIHByb3BlcnRpZXMsIFN0cmluZyBrZXkpCi0gIHsKLSAgICBPYmplY3QgdmFsdWVzID0gcHJvcGVydGllcy5nZXQoa2V5KTsKLSAgICBpZiAodmFsdWVzID09IG51bGwpCi0gICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKLSAgICBlbHNlIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBTdHJpbmdbXSkKLSAgICAgIHJldHVybiAoU3RyaW5nW10pdmFsdWVzOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge3ZhbHVlcy50b1N0cmluZygpfTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9NdWx0aXBhcnRGb3JtRGF0YVBhcnNlclRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjBhMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9NdWx0aXBhcnRGb3JtRGF0YVBhcnNlclRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElUcmFuc2Zvcm1lcgotewotICBwcm90ZWN0ZWQgQ29udHJvbGxlciBjb250cm9sbGVyOwotCi0gIHB1YmxpYyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlclRyYW5zZm9ybWVyKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIG5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlciA9IChNdWx0aXBhcnRGb3JtRGF0YVBhcnNlcilwcm9wZXJ0aWVzLmdldChBY3Rpb25JbnB1dHMuTVVMVElQQVJUX0ZPUk1fREFUQV9QQVJTRVIpOwotICAgIFN0cmluZ1tdIGtleXM7Ci0gICAgdHJ5Ci0gICAgewotICAgICAga2V5cyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJOYW1lcygpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAga2V5cyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgbmV3S2V5ID0gbmV3IFN0cmluZ0J1ZmZlcihBY3Rpb25JbnB1dHMuTVVMVElQQVJUX0ZPUk1fREFUQV9QQVJTRVIpOwotICAgICAgbmV3S2V5LmFwcGVuZChrZXlzW2ldKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBwcm9wZXJ0aWVzLnB1dChuZXdLZXkudG9TdHJpbmcoKSwgcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhrZXlzW2ldKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0gIAotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IHByb3BlcnRpZXMua2V5cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIE9iamVjdCBrZXkgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICBpZiAoa2V5IGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgewotICAgICAgICBpZiAoKChTdHJpbmcpa2V5KS5zdGFydHNXaXRoKEFjdGlvbklucHV0cy5NVUxUSVBBUlRfRk9STV9EQVRBX1BBUlNFUikpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcmVhbEtleSA9ICgoU3RyaW5nKWtleSkuc3Vic3RyaW5nKEFjdGlvbklucHV0cy5NVUxUSVBBUlRfRk9STV9EQVRBX1BBUlNFUi5sZW5ndGgoKSk7Ci0gICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KHJlYWxLZXkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHByb3BlcnRpZXMucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChyZWFsS2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9Ob2RlSWRUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9Ob2RlSWRUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmFmOThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvTm9kZUlkVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLlJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTm9kZUlkVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBJVHJhbnNmb3JtZXIKLXsKLSAgcHJvdGVjdGVkIENvbnRyb2xsZXIgY29udHJvbGxlcjsKLQotICBwdWJsaWMgTm9kZUlkVHJhbnNmb3JtZXIoQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgbm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgVmVjdG9yIHJlbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0aWVzLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgIE5vZGUgcm9vdE5vZGUgPSBub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSWQpOwotICAgICAgaW50IGRlcHRoID0gMDsKLSAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgIGRlcHRoID0gbm9kZS5nZXROb2RlRGVwdGgoKTsKLSAgICAgIHdoaWxlIChyZWxzLnNpemUoKSA8IGRlcHRoICYmIG5vZGUgIT0gbnVsbCAmJiBub2RlICE9IHJvb3ROb2RlKQotICAgICAgewotICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBub2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgIFJlbCByZWwgPSBnZXRSZWwocGFyZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpLCBlbGVtZW50KTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlbFZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcihyZWwuZ2V0TmFtZSgpKTsKLSAgICAgICAgcmVsVmFsdWUuYXBwZW5kKE1vZGVsQ29uc3RhbnRzLlJFTF9MT0NBTE5BTUVfU0VQQVJBVE9SKTsKLSAgICAgICAgcmVsVmFsdWUuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgcmVscy5pbnNlcnRFbGVtZW50QXQocmVsVmFsdWUudG9TdHJpbmcoKSwgMCk7Ci0gICAgICAgIG5vZGUgPSBwYXJlbnROb2RlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICB7Ci0gICAgfQotICAgIGludCBudW1SZWxhdGlvbnNoaXBzID0gcmVscy5zaXplKCk7Ci0gICAgaWYgKG51bVJlbGF0aW9uc2hpcHMgPT0gMSkKLSAgICAgIHByb3BlcnRpZXMucHV0KE1vZGVsQ29uc3RhbnRzLlJFTF9JRCwgcmVscy5nZXQoMCkudG9TdHJpbmcoKSk7Ci0gICAgZWxzZSBpZiAobnVtUmVsYXRpb25zaGlwcyA+IDEpCi0gICAgICBwcm9wZXJ0aWVzLnB1dChNb2RlbENvbnN0YW50cy5SRUxfSUQsIChTdHJpbmdbXSlyZWxzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBSZWwgZ2V0UmVsKEVsZW1lbnQgc291cmNlRWxlbWVudCwgRWxlbWVudCB0YXJnZXRFbGVtZW50KQotICB7Ci0gICAgRW51bWVyYXRpb24gcmVscyA9IHNvdXJjZUVsZW1lbnQuZ2V0UmVscygpOwotICAgIHdoaWxlIChyZWxzLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFJlbCByZWwgPSAoUmVsKXJlbHMubmV4dEVsZW1lbnQoKTsKLSAgICAgIEVudW1lcmF0aW9uIHRhcmdldEVsZW1lbnRzID0gcmVsLmdldFRhcmdldEVsZW1lbnRzKCk7Ci0gICAgICB3aGlsZSAodGFyZ2V0RWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICh0YXJnZXRFbGVtZW50cy5uZXh0RWxlbWVudCgpID09IHRhcmdldEVsZW1lbnQpCi0gICAgICAgICAgcmV0dXJuIHJlbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgICBPYmplY3QgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldChNb2RlbENvbnN0YW50cy5SRUxfSUQpOwotICAgIFN0cmluZ1tdIHJlbGF0aW9uc2hpcHMgPSBudWxsOwotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1tdKQotICAgICAgcmVsYXRpb25zaGlwcyA9IChTdHJpbmdbXSl2YWx1ZTsKLSAgICBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKQotICAgICAgcmVsYXRpb25zaGlwcyA9IG5ldyBTdHJpbmdbXSB7dmFsdWUudG9TdHJpbmcoKX07Ci0gICAgaWYgKHJlbGF0aW9uc2hpcHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0aW9uc2hpcHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IHJlbGF0aW9uc2hpcHNbaV0uaW5kZXhPZihNb2RlbENvbnN0YW50cy5SRUxfTE9DQUxOQU1FX1NFUEFSQVRPUik7Ci0gICAgICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgICAgICByZXR1cm4gZGVOb3JtYWxpemVBc1NlbGVjdGVkTm9kZShwcm9wZXJ0aWVzKTsKLSAgICAgICAgU3RyaW5nIHJlbCA9IChpbmRleCAhPSAtMSkgPyByZWxhdGlvbnNoaXBzW2ldLnN1YnN0cmluZygwLCBpbmRleCkgOiByZWxhdGlvbnNoaXBzW2ldOwotICAgICAgICBTdHJpbmcgbG9jYWxuYW1lID0gKGluZGV4ICE9IC0xKSA/IHJlbGF0aW9uc2hpcHNbaV0uc3Vic3RyaW5nKGluZGV4ICsgMSwgcmVsYXRpb25zaGlwc1tpXS5sZW5ndGgoKSkgOiBudWxsOwotICAgICAgICBpZiAobG9jYWxuYW1lID09IG51bGwpCi0gICAgICAgICAgcmV0dXJuIGRlTm9ybWFsaXplQXNTZWxlY3RlZE5vZGUocHJvcGVydGllcyk7Ci0gICAgICAgIG5vZGUgPSBnZXROb2RlKG5vZGUsIHJlbCwgbG9jYWxuYW1lKTsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gZGVOb3JtYWxpemVBc1NlbGVjdGVkTm9kZShwcm9wZXJ0aWVzKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnRpZXMucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKG5vZGUuZ2V0Tm9kZUlkKCkpKTsKLSAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZGVOb3JtYWxpemVBc1NlbGVjdGVkTm9kZShwcm9wZXJ0aWVzKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBIYXNodGFibGUgZGVOb3JtYWxpemVBc1NlbGVjdGVkTm9kZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIHJldHVybiAobmV3IEN1cnJlbnROb2RlU2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcikpLmRlTm9ybWFsaXplKHByb3BlcnRpZXMpOwotICB9Ci0KLSAgcHJpdmF0ZSBOb2RlIGdldE5vZGUoTm9kZSBwYXJlbnQsIFN0cmluZyByZWwsIFN0cmluZyBsb2NhbG5hbWUpCi0gIHsKLSAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBwYXJlbnQuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gcGFyZW50RWxlbWVudC5nZXRFbGVtZW50cyhyZWwpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmIChsb2NhbG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLSAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRDaGlsZE5vZGUoKFRyZWVFbGVtZW50KWVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvTm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL05vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzVkYzAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9lbmdpbmUvdHJhbnNmb3JtZXIvTm9kZVNlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5SZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5Nb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIE5vZGVTZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElUcmFuc2Zvcm1lcgotewotICBwcm90ZWN0ZWQgQ29udHJvbGxlciBjb250cm9sbGVyOwotCi0gIHB1YmxpYyBOb2RlU2VsZWN0aW9uVHJhbnNmb3JtZXIoQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgbm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICBOb2RlIG5leHROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKSk7Ci0gICAgICBOb2RlIGN1cnJOb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICBpZiAoY3Vyck5vZGUgPT0gbnVsbCkKLSAgICAgICAgY3Vyck5vZGUgPSBub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgICAgVmVjdG9yIG5leHRSZWxzID0gbmV3IFZlY3RvcigpOwotICAgICAgVmVjdG9yIGN1cnJSZWxzID0gbmV3IFZlY3RvcigpOwotICAgICAgd2hpbGUgKG5leHROb2RlICE9IG51bGwgJiYgY3Vyck5vZGUgIT0gbnVsbCAmJiAoIWlzUm9vdEVsZW1lbnQobmV4dE5vZGUuZ2V0VHJlZUVsZW1lbnQoKSkgfHwgIWlzUm9vdEVsZW1lbnQoY3Vyck5vZGUuZ2V0VHJlZUVsZW1lbnQoKSkpICYmIG5leHROb2RlICE9IGN1cnJOb2RlKQotICAgICAgewotICAgICAgICBpZiAobmV4dE5vZGUuZ2V0Tm9kZURlcHRoKCkgPj0gY3Vyck5vZGUuZ2V0Tm9kZURlcHRoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIHBhcmVudE5vZGUgPSBuZXh0Tm9kZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICBFbGVtZW50IG5leHRFbGVtZW50ID0gbmV4dE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgICBSZWwgcmVsID0gZ2V0UmVsKHBhcmVudE5vZGUuZ2V0VHJlZUVsZW1lbnQoKSwgbmV4dEVsZW1lbnQpOwotICAgICAgICAgIFN0cmluZ0J1ZmZlciByZWxWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIocmVsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgcmVsVmFsdWUuYXBwZW5kKE1vZGVsQ29uc3RhbnRzLlJFTF9MT0NBTE5BTUVfU0VQQVJBVE9SKTsKLSAgICAgICAgICByZWxWYWx1ZS5hcHBlbmQobmV4dEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBuZXh0UmVscy5pbnNlcnRFbGVtZW50QXQocmVsVmFsdWUudG9TdHJpbmcoKSwgMCk7Ci0gICAgICAgICAgbmV4dE5vZGUgPSBwYXJlbnROb2RlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IGN1cnJOb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IHBhcmVudE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgICBSZWwgcmVsID0gZ2V0UmVsKGN1cnJOb2RlLmdldFRyZWVFbGVtZW50KCksIHBhcmVudEVsZW1lbnQpOwotICAgICAgICAgIFN0cmluZ0J1ZmZlciByZWxWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIocmVsLmdldE5hbWUoKSk7Ci0gICAgICAgICAgcmVsVmFsdWUuYXBwZW5kKE1vZGVsQ29uc3RhbnRzLlJFTF9MT0NBTE5BTUVfU0VQQVJBVE9SKTsKLSAgICAgICAgICByZWxWYWx1ZS5hcHBlbmQocGFyZW50RWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgICAgIGN1cnJSZWxzLmFkZChyZWxWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICBjdXJyTm9kZSA9IHBhcmVudE5vZGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGN1cnJSZWxzLmFkZEFsbChuZXh0UmVscyk7Ci0gICAgICBpbnQgbnVtUmVsYXRpb25zaGlwcyA9IGN1cnJSZWxzLnNpemUoKTsKLSAgICAgIGlmIChudW1SZWxhdGlvbnNoaXBzID09IDEpCi0gICAgICAgIHByb3BlcnRpZXMucHV0KE1vZGVsQ29uc3RhbnRzLlJFTF9JRCwgY3VyclJlbHMuZ2V0KDApLnRvU3RyaW5nKCkpOwotICAgICAgZWxzZSBpZiAobnVtUmVsYXRpb25zaGlwcyA+IDEpCi0gICAgICAgIHByb3BlcnRpZXMucHV0KE1vZGVsQ29uc3RhbnRzLlJFTF9JRCwgKFN0cmluZ1tdKSBjdXJyUmVscy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc1Jvb3RFbGVtZW50KEVsZW1lbnQgZSkKLSAgewotICAgIHJldHVybiBlLmdldE1vZGVsKCkuZ2V0Um9vdEVsZW1lbnQoKSA9PSBlOwotICB9Ci0KLSAgcHJpdmF0ZSBSZWwgZ2V0UmVsKEVsZW1lbnQgc291cmNlRWxlbWVudCwgRWxlbWVudCB0YXJnZXRFbGVtZW50KQotICB7Ci0gICAgRW51bWVyYXRpb24gcmVscyA9IHNvdXJjZUVsZW1lbnQuZ2V0UmVscygpOwotICAgIHdoaWxlIChyZWxzLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFJlbCByZWwgPSAoUmVsKSByZWxzLm5leHRFbGVtZW50KCk7Ci0gICAgICBFbnVtZXJhdGlvbiB0YXJnZXRFbGVtZW50cyA9IHJlbC5nZXRUYXJnZXRFbGVtZW50cygpOwotICAgICAgd2hpbGUgKHRhcmdldEVsZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBpZiAodGFyZ2V0RWxlbWVudHMubmV4dEVsZW1lbnQoKSA9PSB0YXJnZXRFbGVtZW50KQotICAgICAgICAgIHJldHVybiByZWw7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBkZU5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgcm9vdE5vZGUgPSBub2RlTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgIE5vZGUgY3Vyck5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoY3Vyck5vZGUgPT0gbnVsbCkKLSAgICAgIGN1cnJOb2RlID0gcm9vdE5vZGU7Ci0gICAgT2JqZWN0IHZhbHVlID0gcHJvcGVydGllcy5nZXQoTW9kZWxDb25zdGFudHMuUkVMX0lEKTsKLSAgICBTdHJpbmdbXSByZWxhdGlvbnNoaXBzID0gbnVsbDsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdbXSkKLSAgICAgIHJlbGF0aW9uc2hpcHMgPSAoU3RyaW5nW10pIHZhbHVlOwotICAgIGVsc2UgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICByZWxhdGlvbnNoaXBzID0gbmV3IFN0cmluZ1tde3ZhbHVlLnRvU3RyaW5nKCl9OwotICAgIGlmIChyZWxhdGlvbnNoaXBzICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjdXJyRWxlbWVudCA9IGN1cnJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0aW9uc2hpcHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGludCBpbmRleCA9IHJlbGF0aW9uc2hpcHNbaV0uaW5kZXhPZihNb2RlbENvbnN0YW50cy5SRUxfTE9DQUxOQU1FX1NFUEFSQVRPUik7Ci0gICAgICAgIFN0cmluZyByZWwgPSAoaW5kZXggIT0gLTEpID8gcmVsYXRpb25zaGlwc1tpXS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogcmVsYXRpb25zaGlwc1tpXTsKLSAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IChpbmRleCAhPSAtMSkgPyByZWxhdGlvbnNoaXBzW2ldLnN1YnN0cmluZyhpbmRleCArIDEsIHJlbGF0aW9uc2hpcHNbaV0ubGVuZ3RoKCkpIDogbnVsbDsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGN1cnJFbGVtZW50LmdldEVsZW1lbnRzKHJlbCk7Ci0gICAgICAgIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChsb2NhbG5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgZmlyc3RFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IG5leHRFbGVtZW50ID0gKEVsZW1lbnQpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgZmlyc3RFbGVtZW50ID0gbmV4dEVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAobG9jYWxuYW1lLmVxdWFscyhuZXh0RWxlbWVudC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0YXJnZXRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAodGFyZ2V0RWxlbWVudCA9PSBudWxsKQotICAgICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IGZpcnN0RWxlbWVudDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgICAgIHRhcmdldEVsZW1lbnQgPSAoRWxlbWVudCkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyRWxlbWVudCA9IChFbGVtZW50KSB0YXJnZXRFbGVtZW50OwotICAgICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IGN1cnJOb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpID09IGN1cnJFbGVtZW50KQotICAgICAgICAgICAgY3Vyck5vZGUgPSBwYXJlbnROb2RlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGN1cnJOb2RlID0gY3Vyck5vZGUuZ2V0Q2hpbGROb2RlKChUcmVlRWxlbWVudCkgY3VyckVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHByb3BlcnRpZXMucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKGN1cnJOb2RlLmdldE5vZGVJZCgpKSk7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL1ZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2VuZ2luZS90cmFuc2Zvcm1lci9WaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZiZDEzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZW5naW5lL3RyYW5zZm9ybWVyL1ZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuTGlzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElUcmFuc2Zvcm1lcgotewotICBwcm90ZWN0ZWQgQ29udHJvbGxlciBjb250cm9sbGVyOwotICBwcm90ZWN0ZWQgU3RyaW5nIGxpc3RNYW5hZ2VyS2V5OwotICBwcm90ZWN0ZWQgU3RyaW5nIHZpZXdLZXk7Ci0KLSAgcHVibGljIFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcihDb250cm9sbGVyIGNvbnRyb2xsZXIsIFN0cmluZyBsaXN0TWFuYWdlcktleSwgU3RyaW5nIHZpZXdLZXkpCi0gIHsKLSAgICB0aGlzLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgIHRoaXMubGlzdE1hbmFnZXJLZXkgPSBsaXN0TWFuYWdlcktleTsKLSAgICB0aGlzLnZpZXdLZXkgPSB2aWV3S2V5OwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBub3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICBWZWN0b3Igbm9ybWFsaXplZFZpZXdJZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBjdXJyTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IGN1cnJFbGVtZW50ID0gY3Vyck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBPYmplY3QgbGlzdE1hbmFnZXJPYmogPSBjdXJyRWxlbWVudC5nZXRQcm9wZXJ0eUFzT2JqZWN0KGxpc3RNYW5hZ2VyS2V5KTsKLSAgICBpZiAobGlzdE1hbmFnZXJPYmogaW5zdGFuY2VvZiBMaXN0TWFuYWdlcikKLSAgICB7Ci0gICAgICBMaXN0TWFuYWdlciBsaXN0TWFuYWdlciA9IChMaXN0TWFuYWdlcikgbGlzdE1hbmFnZXJPYmo7Ci0gICAgICBTdHJpbmdbXSB2aWV3SWRzID0gZ2V0Vmlld1ZhbHVlcyhwcm9wZXJ0aWVzKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlld0lkcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGxpc3RFbGVtZW50ID0gbGlzdE1hbmFnZXIuZ2V0RWxlbWVudFdpdGhWaWV3SWQoSW50ZWdlci5wYXJzZUludCh2aWV3SWRzW2ldKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBpZiAobGlzdEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICBpZiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgb2JqZWN0OwotICAgICAgICAgICAgbm9ybWFsaXplZFZpZXdJZHMuYWRkKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcHJvcGVydGllcy5wdXQodmlld0tleSwgbm9ybWFsaXplZFZpZXdJZHMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0gICAgcmV0dXJuIHByb3BlcnRpZXM7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIGRlTm9ybWFsaXplKEhhc2h0YWJsZSBwcm9wZXJ0aWVzKQotICB7Ci0gICAgVmVjdG9yIHZpZXdJZHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgTm9kZSBjdXJyTm9kZSA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoY3Vyck5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBUcmVlRWxlbWVudCBjdXJyRWxlbWVudCA9IGN1cnJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBPYmplY3QgbGlzdE1hbmFnZXJPYmogPSBjdXJyRWxlbWVudC5nZXRQcm9wZXJ0eUFzT2JqZWN0KGxpc3RNYW5hZ2VyS2V5KTsKLSAgICAgIGlmIChsaXN0TWFuYWdlck9iaiBpbnN0YW5jZW9mIExpc3RNYW5hZ2VyKQotICAgICAgewotICAgICAgICBMaXN0TWFuYWdlciBsaXN0TWFuYWdlciA9IChMaXN0TWFuYWdlcikgbGlzdE1hbmFnZXJPYmo7Ci0gICAgICAgIFN0cmluZ1tdIG5vcm1hbGl6ZWRWaWV3SWRzID0gZ2V0Vmlld1ZhbHVlcyhwcm9wZXJ0aWVzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub3JtYWxpemVkVmlld0lkcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBsaXN0TWFuYWdlci5nZXRMaXN0RWxlbWVudHMoKTsKLSAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBub3JtYWxpemVkVmlld0lkc1tpXS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2aWV3SWRzLmFkZChTdHJpbmcudmFsdWVPZihsaXN0RWxlbWVudC5nZXRWaWV3SWQoKSkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaW50IHNpemUgPSB2aWV3SWRzLnNpemUoKTsKLSAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgcHJvcGVydGllcy5wdXQodmlld0tleSwgdmlld0lkcy5nZXQoMCkpOwotICAgIGVsc2UgaWYgKHNpemUgPiAxKQotICAgICAgcHJvcGVydGllcy5wdXQodmlld0tleSwgdmlld0lkcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nW10gZ2V0Vmlld1ZhbHVlcyhIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIE9iamVjdCB2aWV3VmFsdWVPYmogPSBwcm9wZXJ0aWVzLmdldCh2aWV3S2V5KTsKLSAgICBTdHJpbmdbXSB2aWV3VmFsdWVzOwotICAgIGlmICh2aWV3VmFsdWVPYmogPT0gbnVsbCkKLSAgICAgIHZpZXdWYWx1ZXMgPSBuZXcgU3RyaW5nWzBdOwotICAgIGVsc2UgaWYgKHZpZXdWYWx1ZU9iai5nZXRDbGFzcygpLmlzQXJyYXkoKSkKLSAgICAgIHZpZXdWYWx1ZXMgPSAoU3RyaW5nW10pIHZpZXdWYWx1ZU9iajsKLSAgICBlbHNlCi0gICAgICB2aWV3VmFsdWVzID0gbmV3IFN0cmluZ1tdeyhTdHJpbmcpIHZpZXdWYWx1ZU9ian07Ci0gICAgcmV0dXJuIHZpZXdWYWx1ZXM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzMTJhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5VRERJUGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50OwotICAgIFN0cmluZyBidXNpbmVzc05hbWUgPSBidXNFbGVtZW50LmdldE5hbWUoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IGJ1c0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgIFN0cmluZyBidXNpbmVzc0tleSA9IGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICAvLyBjcmVhdGUgdGhlIHJlZ2lzdHJ5IGluIHRoZSBVRERJIHBlcnNwZWN0aXZlCi0gICAgaWYgKCFjcmVhdGVSZWdpc3RyeUluVURESVBlcnNwZWN0aXZlKGlucXVpcnlBUEksIG51bGwsIGlucXVpcnlBUEksIG51bGwsIHRydWUpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLCBidXNpbmVzc0tleSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLCBidXNpbmVzc05hbWUpOwotICAgIGlmICghYWN0aW9uLnJ1bigpKQotICAgIHsKLSAgICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UoZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0FERF9UT19VRERJX1BFUlNQRUNUSVZFIiwgYnVzaW5lc3NOYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4odHJ1ZSk7Ci0gICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMIiwgYnVzaW5lc3NOYW1lKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkUmVnaXN0cnlUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzRkZjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBBZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uIGV4dGVuZHMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLXsKLSAgcHVibGljIEFkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudDsKLSAgICBTdHJpbmcgcmVnaXN0cnlOYW1lID0gcmVnRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIGlucXVpcnlBUEkgPSByZWdFbGVtZW50LmdldElucXVpcnlVUkwoKTsKLSAgICBTdHJpbmcgcHVibGlzaEFQSSA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyByZWdpc3RyYXRpb25VUkwgPSByZWdFbGVtZW50LmdldFJlZ2lzdHJhdGlvblVSTCgpOwotICAgIGlmICghY3JlYXRlUmVnaXN0cnlJblVERElQZXJzcGVjdGl2ZShpbnF1aXJ5QVBJLCBwdWJsaXNoQVBJLCByZWdpc3RyeU5hbWUsIHJlZ2lzdHJhdGlvblVSTCwgZmFsc2UpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UoZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQUREX1RPX1VERElfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTCIsIHJlZ2lzdHJ5TmFtZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkU2VydmljZUludGVyZmFjZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkU2VydmljZUludGVyZmFjZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTIxYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFNlcnZpY2VJbnRlcmZhY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRTZXJ2aWNlSW50ZXJmYWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotewotICBwdWJsaWMgQWRkU2VydmljZUludGVyZmFjZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2VySW50RWxlbWVudCA9IChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudDsKLSAgICBTdHJpbmcgc2VySW50TmFtZSA9IHNlckludEVsZW1lbnQuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gc2VySW50RWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgU3RyaW5nIHNlckludEtleSA9IHNlckludEVsZW1lbnQuZ2V0U2VydmljZUludGVyZmFjZUtleSgpOwotICAgIC8vIGNyZWF0ZSB0aGUgcmVnaXN0cnkgaW4gdGhlIFVEREkgcGVyc3BlY3RpdmUKLSAgICBpZiAoIWNyZWF0ZVJlZ2lzdHJ5SW5VRERJUGVyc3BlY3RpdmUoaW5xdWlyeUFQSSwgbnVsbCwgaW5xdWlyeUFQSSwgbnVsbCwgdHJ1ZSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZLCBzZXJJbnRLZXkpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSwgc2VySW50TmFtZSk7Ci0gICAgaWYgKCFhY3Rpb24ucnVuKCkpCi0gICAgewotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiLCBzZXJJbnROYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4odHJ1ZSk7Ci0gICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMIiwgc2VySW50TmFtZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTY5ZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElQZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotewotICBwdWJsaWMgQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgc2VyRWxlbWVudCA9IChGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudDsKLSAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBzZXJFbGVtZW50LmdldE5hbWUoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IHNlckVsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgIFN0cmluZyBzZXJ2aWNlS2V5ID0gc2VyRWxlbWVudC5nZXRTZXJ2aWNlS2V5KCk7Ci0gICAgLy8gY3JlYXRlIHRoZSByZWdpc3RyeSBpbiB0aGUgVURESSBwZXJzcGVjdGl2ZQotICAgIGlmICghY3JlYXRlUmVnaXN0cnlJblVERElQZXJzcGVjdGl2ZShpbnF1aXJ5QVBJLCBudWxsLCBpbnF1aXJ5QVBJLCBudWxsLCB0cnVlKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSwgc2VydmljZUtleSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLCBzZXJ2aWNlTmFtZSk7Ci0gICAgaWYgKCFhY3Rpb24ucnVuKCkpCi0gICAgewotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiLCBzZXJ2aWNlTmFtZSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLnNldFZpc2liaWxpdHlPZkNoaWxkcmVuKHRydWUpOwotICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UoZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQUREX1RPX1VERElfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTCIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NmQ4OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc0ZvbGRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuT3BlblJlZ2lzdHJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5DYXRlZ29yeU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUmVnaXN0cnlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElNYWluTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5VUkxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIE11bHRpcGxlTGlua0FjdGlvbiB7Ci0gICAgcHVibGljIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElEKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwPyIpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKHRvb2xJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgICAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VBY3Rpb25MaW5rKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlUmVnaXN0cnlJblVERElQZXJzcGVjdGl2ZShTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIHB1Ymxpc2hBUEksIFN0cmluZyByZWdpc3RyeU5hbWUsIFN0cmluZyByZWdpc3RyYXRpb25VUkwsYm9vbGVhbiB1c2VFeGlzdGluZykgewotICAgICAgICBWZWN0b3IgcmVnaXN0cnlOb2RlcyA9IGdldFJlZ2lzdHJ5Tm9kZXNCeUlucXVpcnlVUkwoaW5xdWlyeUFQSSk7Ci0gICAgICAgIGlmIChyZWdpc3RyeU5vZGVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodXNlRXhpc3RpbmcpCi0gICAgICAgICAgewotICAgICAgICAgICAgTm9kZSByZWdpc3RyeU5vZGUgPSAoTm9kZSlyZWdpc3RyeU5vZGVzLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gcmVnaXN0cnlOb2RlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChyZWdpc3RyeU5vZGUuZ2V0Tm9kZUlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBvcGVuIHRoZSByZWdpc3RyeSBpZiBpdCBpcyBub3QgYWxyZWFkeSBvcGVuZWQgaW4gdGhlIFVEREkgcGVyc3BlY3RpdmUKLSAgICAgICAgT3BlblJlZ2lzdHJ5QWN0aW9uIG9wZW5SZWdBY3Rpb24gPSBuZXcgT3BlblJlZ2lzdHJ5QWN0aW9uKGNvbnRyb2xsZXJfKTsKLQotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgcHJvcGVydHkgdGFibGUKLSAgICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuUmVnQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgICAgaWYgKFZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhyZWdpc3RyeU5hbWUpKQotICAgICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5SRUdJU1RSWV9OQU1FLHJlZ2lzdHJ5TmFtZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKGlucXVpcnlBUEkpKQotICAgICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCxpbnF1aXJ5QVBJKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocHVibGlzaEFQSSkpCi0gICAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hfVVJMLHB1Ymxpc2hBUEkpOwotCi0gICAgICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocmVnaXN0cmF0aW9uVVJMKSkKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUkFUSU9OX1VSTCxyZWdpc3RyYXRpb25VUkwpOwotICAgICAgICAgICAgCi0gICAgICAgIC8vIElmIHVzZXItZGVmaW5lZCBjYXRlZ29yeSBtZXRhZGF0YSBleGlzdHMsIHNlYXJjaCBhbmQgbWFrZSB0aGUgYXNzb2NpYXRpb25zLgotICAgICAgICBTdHJpbmdCdWZmZXIgZGlyZWN0b3J5QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LmZvcm1DYXRlZ29yaWVzRGlyZWN0b3J5KGRpcmVjdG9yeUJ1ZmZlcixjb250cm9sbGVyXy5nZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpLHJlZ2lzdHJ5TmFtZSk7Ci0gICAgICAgIEZpbGUgY2F0ZWdvcmllc0RpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeUJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgICAgRmlsZVtdIGNhdGVnb3J5RmlsZXMgPSBudWxsOwotICAgICAgICBpZiAoY2F0ZWdvcmllc0RpcmVjdG9yeS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIGNhdGVnb3J5RmlsZXMgPSBjYXRlZ29yaWVzRGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotICAgICAgICAgIGlmIChjYXRlZ29yeUZpbGVzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLkNIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBydW4gdGhlIGFjdGlvbgotICAgICAgICBpZiAoIW9wZW5SZWdBY3Rpb24ucnVuKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2F0ZWdvcnlGaWxlcyAhPSBudWxsICYmIGNhdGVnb3J5RmlsZXMubGVuZ3RoID4gMCkKLSAgICAgICAgewotICAgICAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCkoY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRyZWVFbGVtZW50KCkpOwotICAgICAgICAgIHJlZ0VsZW1lbnQuc2V0Q2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXModHJ1ZSk7Ci0gICAgICAgICAgRW51bWVyYXRpb24gdXNlckRlZmluZWRDYXRlZ29yaWVzID0gcmVnRWxlbWVudC5nZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoKTsKLSAgICAgICAgICBsaW5rQ2F0ZWdvcnlNb2RlbHNXaXRoU2F2ZWREYXRhKHJlZ2lzdHJ5TmFtZSxyZWdFbGVtZW50LmdldFVzZXJEZWZpbmVkQ2F0ZWdvcmllcygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgbGlua0NhdGVnb3J5TW9kZWxzV2l0aFNhdmVkRGF0YShTdHJpbmcgcmVnaXN0cnlOYW1lLEVudW1lcmF0aW9uIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcykKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgZGlyZWN0b3J5QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudC5mb3JtQ2F0ZWdvcmllc0RpcmVjdG9yeShkaXJlY3RvcnlCdWZmZXIsY29udHJvbGxlcl8uZ2V0U2VydmxldEVuZ2luZVN0YXRlTG9jYXRpb24oKSxyZWdpc3RyeU5hbWUpOwotICAgICAgbGlua0NhdGVnb3J5TW9kZWxzV2l0aFNhdmVkRGF0YSh1c2VyRGVmaW5lZENhdGVnb3JpZXMsZGlyZWN0b3J5QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBsaW5rQ2F0ZWdvcnlNb2RlbHNXaXRoU2F2ZWREYXRhKEVudW1lcmF0aW9uIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyxTdHJpbmcgY2F0ZWdvcmllc0RpcmVjdG9yeSkKLSAgICB7Ci0gICAgICBGaWxlIGNhdGVnb3JpZXNEaXJlY3RvcnlGaWxlID0gbmV3IEZpbGUoY2F0ZWdvcmllc0RpcmVjdG9yeSk7Ci0gICAgICBGaWxlW10gY2F0ZWdvcnlGaWxlcyA9IG51bGw7Ci0gICAgICBpZiAoY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIGNhdGVnb3J5RmlsZXMgPSBjYXRlZ29yaWVzRGlyZWN0b3J5RmlsZS5saXN0RmlsZXMoKTsgCi0gICAgICAgIGlmICh1c2VyRGVmaW5lZENhdGVnb3JpZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHdoaWxlICh1c2VyRGVmaW5lZENhdGVnb3JpZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeU1vZGVsID0gKENhdGVnb3J5TW9kZWwpdXNlckRlZmluZWRDYXRlZ29yaWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnlLZXkgPSBjYXRlZ29yeU1vZGVsLmdldENhdGVnb3J5S2V5KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7aTxjYXRlZ29yeUZpbGVzLmxlbmd0aDtpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeVByb3BlcnRpZXNGaWxlTmFtZSA9IGNhdGVnb3J5RmlsZXNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBpbnQgbGFzdERvdFBvcyA9IGNhdGVnb3J5UHJvcGVydGllc0ZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgICAgICAgIFN0cmluZyBkZWNvZGVkQ2F0ZWdvcnlQcm9wZXJ0aWVzRmlsZU5hbWVCYXNlID0gVVJMVXRpbHMuZGVjb2RlKGNhdGVnb3J5UHJvcGVydGllc0ZpbGVOYW1lLnN1YnN0cmluZygwLGxhc3REb3RQb3MpKTsKLSAgICAgICAgICAgICAgaWYgKGxhc3REb3RQb3MgPiAwICYmIGNhdGVnb3J5UHJvcGVydGllc0ZpbGVOYW1lLmVuZHNXaXRoKCIucHJvcGVydGllcyIpICYmIGNhdGVnb3J5S2V5LmVxdWFscyhkZWNvZGVkQ2F0ZWdvcnlQcm9wZXJ0aWVzRmlsZU5hbWVCYXNlKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhdGVnb3J5TW9kZWwuc2V0RGVmYXVsdERhdGFGaWxlKGNhdGVnb3J5RmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIGNhdGVnb3J5TW9kZWwubG9hZEZyb21EZWxpbWl0ZXJGaWxlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGdldFJlZ2lzdHJ5Tm9kZXNCeUlucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gICAgewotICAgICAgVmVjdG9yIHJlZ2lzdHJ5Tm9kZXMgPSBudWxsOwotICAgICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKShuYXZpZ2F0b3JNYW5hZ2VyLmdldFJvb3ROb2RlKCkpOwotICAgICAgVmVjdG9yIGNoaWxkTm9kZXMgPSB1ZGRpTWFpbk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2hpbGROb2Rlcy5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBOb2RlIGNoaWxkTm9kZSA9IChOb2RlKWNoaWxkTm9kZXMuZWxlbWVudEF0KGkpOwotICAgICAgICBpZiAoY2hpbGROb2RlIGluc3RhbmNlb2YgUmVnaXN0cnlOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KWNoaWxkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZyBjdXJySW5xdWlyeVVSTCA9IHJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgICAgICAgIGlmIChjdXJySW5xdWlyeVVSTCAhPSBudWxsICYmIGN1cnJJbnF1aXJ5VVJMLmVxdWFscyhpbnF1aXJ5VVJMKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVnaXN0cnlOb2RlcyA9PSBudWxsKQotICAgICAgICAgICAgICByZWdpc3RyeU5vZGVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgcmVnaXN0cnlOb2Rlcy5hZGRFbGVtZW50KGNoaWxkTm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiByZWdpc3RyeU5vZGVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uIG5ld0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBmYXZvcml0ZXNGb2xkZXJFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkgewotICAgICAgICAgICAgZmF2b3JpdGVzRm9sZGVyRWxlbWVudCA9IChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNFbGVtZW50KSB7Ci0gICAgICAgICAgICBmYXZvcml0ZXNGb2xkZXJFbGVtZW50ID0gKChGYXZvcml0ZXNFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0UGFyZW50Rm9sZGVyRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mCi0gICAgICAgIC8vIGZhdm9yaXRlcyBmb2xkZXIgZWxlbWVudCBiZWluZyBzZWxlY3RlZC4KLSAgICAgICAgaWYgKGZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgICAgICBlbHNlIGlmIChmYXZvcml0ZXNGb2xkZXJFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLSAgICAgICAgZWxzZSBpZiAoZmF2b3JpdGVzRm9sZGVyRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgICAgICBlbHNlIGlmIChmYXZvcml0ZXNGb2xkZXJFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50KQotICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRTZXJ2aWNlSW50ZXJmYWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9BZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhMTAzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5PcGVuV1NJTEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbEFjdGlvbklucHV0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBNdWx0aXBsZUxpbmtBY3Rpb24KLXsKLSAgcHVibGljIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgaW50IHRvb2xJRCwgaW50IHZpZXdJRCwgaW50IHZpZXdUb29sSUQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImZhdm9yaXRlcy9hY3Rpb25zL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiAiZmF2b3JpdGVzL2FjdGlvbnMvQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzV1NJTEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoRmF2b3JpdGVzV1NJTEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudDsKLSAgICBTdHJpbmcgd3NpbFVSTCA9IHdzaWxFbGVtZW50LmdldFdzaWxVcmwoKTsKLSAgICBPcGVuV1NJTEFjdGlvbiBvcGVuV1NJTEFjdGlvbiA9IG5ldyBPcGVuV1NJTEFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuV1NJTEFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoV3NpbEFjdGlvbklucHV0cy5XU0lMX1VSTCwgd3NpbFVSTCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoV3NpbEFjdGlvbklucHV0cy5XU0lMX0lOU1BFQ1RJT05fVFlQRSwgU3RyaW5nLnZhbHVlT2YoV3NpbEFjdGlvbklucHV0cy5XU0lMX0RFVEFJTFMpKTsKLSAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IG9wZW5XU0lMQWN0aW9uLnJ1bigpOwotICAgIGlmIChhY3Rpb25SZXN1bHQpCi0gICAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTCIsIHdzaWxVUkwpKTsKLSAgICBlbHNlCi0gICAgICBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfV1NJTF9UT19XU0lMX1BFUlNQRUNUSVZFIiwgd3NpbFVSTCkpOwotICAgIHJldHVybiBhY3Rpb25SZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzM2UyMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuT3BlbldTRExBY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBNdWx0aXBsZUxpbmtBY3Rpb24KLXsKLSAgcHVibGljIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlQWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gImZhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gICAgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IHdzZGxFbGVtZW50ID0gKEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCkgc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHdzZGxVcmwgPSB3c2RsRWxlbWVudC5nZXRXc2RsVXJsKCk7Ci0gICAgT3BlbldTRExBY3Rpb24gb3BlbldTRExBY3Rpb24gPSBuZXcgT3BlbldTRExBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gb3BlbldTRExBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCwgd3NkbFVybCk7Ci0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBvcGVuV1NETEFjdGlvbi5ydW4oKTsKLSAgICBpZiAoYWN0aW9uUmVzdWx0KQotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUwiLCB3c2RsVXJsKSk7Ci0gICAgZWxzZQotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRSIsIHdzZGxVcmwpKTsKLSAgICByZXR1cm4gYWN0aW9uUmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZDEzYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXI7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gewotCi0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZl87Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZpbGVOYW1lXzsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxpbnQgdG9vbElkLGludCB2aWV3SWQsaW50IHZpZXdUb29sSWQpCi0gICAgewotICAgICAgcmV0dXJuIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCx0b29sSWQsdmlld0lkLHZpZXdUb29sSWQsImZhdm9yaXRlcy9hY3Rpb25zL0Zhdm9ydGllc0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZShPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICAgICAgaWYgKGRlZl8gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHdyaXRlV1NETERlZmluaXRpb24ob3MsIGRlZl8pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZU5hbWVfOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICAgICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotCi0gICAgICAgIC8vIHJldHVybiBmYWxzZSBpZiBub2RlSUQgPT0gMCwgdGhhdCBpcyB0aGUgbWFpbiBub2RlCi0gICAgICAgIGlmIChub2RlSUQgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgICAgIFN0cmluZyB3c2RsVVJMID0gKChGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRXc2RsVXJsKCk7Ci0gICAgICAgIHdzZGxGaWxlTmFtZV8gPSBXU0RMRmlsZU5hbWVIZWxwZXIuZ2V0V1NETEZpbGVOYW1lKHdzZGxVUkwpOwotICAgICAgICB0cnkgewotICAgICAgICAgIGRlZl8gPSAobmV3IFVkZGk0akhlbHBlcigpKS5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UodC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2ZDU2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbiB7Ci0gICAgcHVibGljIEZhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2b3JpdGVzUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICByZXR1cm4gKEZvcm1Ub29sKWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uIG5ld0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbigpIHsKLSAgICAgICAgRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBGYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICBIYXNodGFibGUgdGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotCi0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotCi0gICAgICAgIHRhYmxlLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBTdHJpbmcudmFsdWVPZihzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCkpKTsKLSAgICAgICAgdGFibGUucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsIFN0cmluZy52YWx1ZU9mKHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSkpOwotCi0gICAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhYWUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gZXh0ZW5kcyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIHsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gbmV3QWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICByZXR1cm4gbmV3IEZhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgcmV0dXJuIChGb3JtVG9vbClmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcnVuKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZvcml0ZXNQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpCi0gICAgICAgICAgICByZXR1cm4gbGF1bmNoV2l6YXJkKCgoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0V3NkbFVybCgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICAgIHsKLSAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwZTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgTGlua0FjdGlvbgotewotICBwdWJsaWMgRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElEKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJmYXZvcml0ZXMvYWN0aW9ucy9SZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0NvbmZpcm1KU1AuanNwIik7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBtYWluTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgbWFpbkVsZW1lbnQgPSAoRmF2b3JpdGVzTWFpbkVsZW1lbnQpbWFpbk5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IG1haW5FbGVtZW50LnJlc3RvcmVGYXZvcml0ZXNEZWZhdWx0KCk7Ci0gICAgaWYgKGFjdGlvblJlc3VsdCkKLSAgICB7Ci0gICAgICBWZWN0b3IgZm9sZGVyTm9kZXMgPSBtYWluTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZvbGRlck5vZGVzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlIGZvbGRlck5vZGUgPSAoTm9kZSlmb2xkZXJOb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHRyZWVFbGVtZW50ID0gZm9sZGVyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICBpZiAodHJlZUVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNGb2xkZXJFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBmb2xkZXJFbGVtZW50ID0gKEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQpdHJlZUVsZW1lbnQ7Ci0gICAgICAgICAgZm9sZGVyRWxlbWVudC5yZW1vdmVBbGxGYXZvcml0ZXMoY29udHJvbGxlcl8uZ2V0U2VydmxldEVuZ2luZVN0YXRlTG9jYXRpb24oKSk7Ci0gICAgICAgICAgZm9sZGVyRWxlbWVudC5pbml0KG1haW5FbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19GQVZPUklURVNfUkVTVE9SRURfVE9fREVGQVVMVCIpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfT1BFTl9GQVZPUklURVNfQkFDS1VQIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc1RvZ2dsZU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZDMzN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc1RvZ2dsZU5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1RvZ2dsZU5vZGVBY3Rpb24gZXh0ZW5kcyBUb2dnbGVOb2RlQWN0aW9uIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlciwgY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCwgYm9vbGVhbiBvcGVuKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSWQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuT1BFTik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGlmIChvcGVuKQotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk9QRU5fTk9ERSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5DTE9TRV9OT0RFKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkgewotICAgICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IHRvZ2dsZWROb2RlXy5nZXRUb29sTWFuYWdlcigpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpbnQgbm9kZUlkID0gdG9nZ2xlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgICAgICBpbnQgdG9vbElkID0gc2VsZWN0ZWRUb29sLmdldFRvb2xJZCgpOwotICAgICAgICBpbnQgdmlld0lkID0gdG9nZ2xlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgICAgICBpbnQgdmlld1Rvb2xJZCA9IHRvZ2dsZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZFRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKQotICAgICAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsIHRvb2xJZCwgdmlld0lkLCB2aWV3VG9vbElkLCB0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsIHRydWUpOwotICAgIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRUcmVlQ29udGVudFBhZ2UoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX0ZBVk9SSVRFUzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL011bHRpcGxlTGlua0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL011bHRpcGxlTGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWRiN2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9NdWx0aXBsZUxpbmtBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuTWFzc05vZGVJZFRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpcGxlTGlua0FjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24KLXsKLSAgcHVibGljIE11bHRpcGxlTGlua0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIFN0cmluZyBpc011bHRpcGxlTGlua0FjdGlvbiA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTik7Ci0gICAgaWYgKGlzTXVsdGlwbGVMaW5rQWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiwgaXNNdWx0aXBsZUxpbmtBY3Rpb24pOwotICAgICAgcmV0dXJuIHByb2Nlc3NNdWx0aXBsZUxpbmtBY3Rpb25QYXJhbWV0ZXJzKHJlcXVlc3QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucmVtb3ZlKEZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTik7Ci0gICAgICBTdHJpbmcgbm9kZUlEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICBTdHJpbmcgdG9vbElEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgICBTdHJpbmcgdmlld0lEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgICBTdHJpbmcgdmlld1Rvb2xJRFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICAgIGlmIChub2RlSURTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIG5vZGVJRFN0cmluZyk7Ci0gICAgICBpZiAodG9vbElEU3RyaW5nICE9IG51bGwpCi0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVE9PTElELCB0b29sSURTdHJpbmcpOwotICAgICAgaWYgKHZpZXdJRFN0cmluZyAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdJRCwgdmlld0lEU3RyaW5nKTsKLSAgICAgIGlmICh2aWV3VG9vbElEU3RyaW5nICE9IG51bGwpCi0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCwgdmlld1Rvb2xJRFN0cmluZyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTXVsdGlwbGVMaW5rQWN0aW9uUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIFN0cmluZ1tdIG1hc3NBY3Rpb25Ob2RlSURzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChGYXZvcml0ZXNBY3Rpb25JbnB1dHMuTUFTU19BQ1RJT05fTk9ERV9JRCwgbWFzc0FjdGlvbk5vZGVJRHMpOwotICAgIGlmIChtYXNzQWN0aW9uTm9kZUlEcy5sZW5ndGggPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBJVHJhbnNmb3JtZXJbXSB7bmV3IE1hc3NOb2RlSWRUcmFuc2Zvcm1lcihjb250cm9sbGVyXywgRmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQpfTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTXVsdGlwbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBwcm9wZXJ0eVRhYmxlXy5jb250YWluc0tleShGYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04pOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1hc3NBY3Rpb25Ob2RlSWRzKCkKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBwcm9wZXJ0eVRhYmxlXy5nZXQoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQpOwotICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIGVsc2UgaWYgKG9iamVjdC5nZXRDbGFzcygpLmlzQXJyYXkoKSkKLSAgICAgIHJldHVybiAoU3RyaW5nW10pb2JqZWN0OwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyhTdHJpbmcpb2JqZWN0fTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gKGlzTXVsdGlwbGVMaW5rQWN0aW9uKCkpID8gZXhlY3V0ZU11bHRpcGxlTGlua0FjdGlvbigpIDogZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVNdWx0aXBsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBTdHJpbmdbXSBtYXNzQWN0aW9uTm9kZUlEcyA9IGdldE1hc3NBY3Rpb25Ob2RlSWRzKCk7Ci0gICAgaWYgKG1hc3NBY3Rpb25Ob2RlSURzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXNzQWN0aW9uTm9kZUlEcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIG1hc3NBY3Rpb25Ob2RlSURzW2ldKTsKLSAgICAgICAgaWYgKGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkpCi0gICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnJlbW92ZShBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA3YzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFJlbW92ZUZhdm9yaXRlc0FjdGlvbiBleHRlbmRzIE11bHRpcGxlTGlua0FjdGlvbgotewotICBwdWJsaWMgUmVtb3ZlRmF2b3JpdGVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiZmF2b3JpdGVzL2FjdGlvbnMvUmVtb3ZlRmF2b3JpdGVzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHRvb2xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZUFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJmYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNBY3Rpb25KU1AuanNwIjsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgU3RyaW5nIG5vZGVJRFN0cmluZyA9IChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBpbnQgbm9kZUlEOwotICAgIHRyeQotICAgIHsKLSAgICAgIG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQobm9kZUlEU3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0gICAgewotICAgICAgbm9kZUlEID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlSWQoKTsKLSAgICB9Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSA9IGNvbnRyb2xsZXJfLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCk7Ci0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQ7Ci0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc0VsZW1lbnQpCi0gICAgICBhY3Rpb25SZXN1bHQgPSAoKEZhdm9yaXRlc0VsZW1lbnQpIHNlbGVjdGVkRWxlbWVudCkuZ2V0UGFyZW50Rm9sZGVyRWxlbWVudCgpLnJlbW92ZUZhdm9yaXRlQnlOb2RlSUQobm9kZUlELCBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0gICAgZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkKLSAgICAgIGFjdGlvblJlc3VsdCA9ICgoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50KS5yZW1vdmVBbGxGYXZvcml0ZXMocGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpOwotICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc01haW5FbGVtZW50KQotICAgIHsKLSAgICAgIEVudW1lcmF0aW9uIGU7Ci0gICAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBtYWluRWxlbWVudCA9IChGYXZvcml0ZXNNYWluRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50OwotICAgICAgZSA9IG1haW5FbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX0ZPTERFUl9OT0RFKTsKLSAgICAgIGFjdGlvblJlc3VsdCA9ICgoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkgZS5uZXh0RWxlbWVudCgpKS5yZW1vdmVBbGxGYXZvcml0ZXMocGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpOwotICAgICAgZSA9IG1haW5FbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfRk9MREVSX05PREUpOwotICAgICAgYWN0aW9uUmVzdWx0ID0gYWN0aW9uUmVzdWx0ICYmICgoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkgZS5uZXh0RWxlbWVudCgpKS5yZW1vdmVBbGxGYXZvcml0ZXMocGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpOwotICAgICAgZSA9IG1haW5FbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfRk9MREVSX05PREUpOwotICAgICAgYWN0aW9uUmVzdWx0ID0gYWN0aW9uUmVzdWx0ICYmICgoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkgZS5uZXh0RWxlbWVudCgpKS5yZW1vdmVBbGxGYXZvcml0ZXMocGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpOwotICAgICAgZSA9IG1haW5FbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX0ZPTERFUl9OT0RFKTsKLSAgICAgIGFjdGlvblJlc3VsdCA9IGFjdGlvblJlc3VsdCAmJiAoKEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQpIGUubmV4dEVsZW1lbnQoKSkucmVtb3ZlQWxsRmF2b3JpdGVzKHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KTsKLSAgICAgIGUgPSBtYWluRWxlbWVudC5nZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9GT0xERVJfTk9ERSk7Ci0gICAgICBhY3Rpb25SZXN1bHQgPSBhY3Rpb25SZXN1bHQgJiYgKChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KSBlLm5leHRFbGVtZW50KCkpLnJlbW92ZUFsbEZhdm9yaXRlcyhwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0gICAgICBlID0gbWFpbkVsZW1lbnQuZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfRk9MREVSX05PREUpOwotICAgICAgYWN0aW9uUmVzdWx0ID0gYWN0aW9uUmVzdWx0ICYmICgoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCkgZS5uZXh0RWxlbWVudCgpKS5yZW1vdmVBbGxGYXZvcml0ZXMocGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBhY3Rpb25SZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAoYWN0aW9uUmVzdWx0KQotICAgICAgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfSU5GT19OT0RFX0NMRUFSRUQiLCBzZWxlY3RlZE5vZGUuZ2V0Tm9kZU5hbWUoKSkpOwotICAgIHJldHVybiBhY3Rpb25SZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiAiZmF2TmF2aWdhdG9yQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gImZhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRlbnQuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpCi0gIHsKLSAgICByZXR1cm4gImZhdlByb3BlcnRpZXNDb250YWluZXIiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpCi0gIHsKLSAgICByZXR1cm4gImZhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250YWluZXIuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gImZhdlN0YXR1c0NvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gImZhdm9yaXRlcy9mYXZfc3RhdHVzX2NvbnRlbnQuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzNjMjA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9SZXNpemVGYXZvcml0ZXNGcmFtZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFJlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbiBleHRlbmRzIFJlc2l6ZUZyYW1lc0FjdGlvbgotewotICBwdWJsaWMgUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgIT0gbnVsbCAmJiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUixhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGZyYW1lc2V0IHNpemVzLgotICAgIFN0cmluZyBmcmFtZU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuRlJBTUVfTkFNRSk7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIG5ldyBmcmFtZXNldCBzaXplcy4KLSAgICBib29sZWFuIHNhdmVGcmFtZVNldHRpbmdzID0gZmFsc2U7Ci0gICAgaWYgKGZyYW1lTmFtZS5lcXVhbHMoRmF2b3JpdGVzRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhmYXZQZXJzcGVjdGl2ZS5nZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMTAwJSwwJSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChmcmFtZU5hbWUuZXF1YWxzKEZhdm9yaXRlc0ZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05UQUlORVIpKQotICAgIHsKLSAgICAgIGlmIChhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzLnN0YXJ0c1dpdGgoIjEwMCUiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmVzdG9yZS4KLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoZmF2UGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhmYXZQZXJzcGVjdGl2ZS5nZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygiMTAwJSwwJSIpOwotICAgICAgICBpZiAoIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChmcmFtZU5hbWUuZXF1YWxzKEZhdm9yaXRlc0ZyYW1lTmFtZXMuU1RBVFVTX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgaWYgKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmVzdG9yZS4KLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoZmF2UGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhmYXZQZXJzcGVjdGl2ZS5nZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgIGZhdlBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygiMCUsMTAwJSIpOwotICAgICAgICBpZiAoIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjBlMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2VsZWN0Tm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uIGV4dGVuZHMgU2VsZWN0Tm9kZUFjdGlvbgotewotICAgIHB1YmxpYyBTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGJvb2xlYW4ga2VlcEhpc3RvcnkpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImZhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICAgICAgaWYgKGtlZXBIaXN0b3J5KSB7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgiPTEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICAgIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgVG9vbCBzZWxlY3RlZFRvb2wgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkVG9vbCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbC5nZXRUb29sVHlwZSgpICE9IFRvb2xUeXBlcy5BQ1RJT04pCi0gICAgICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWRUb29sLmdldFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKSB7Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFRyZWVDb250ZW50UGFnZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gICAgewotICAgICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9GQVZPUklURVM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MDZiMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2VsZWN0Tm9kZVRvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVUb29sQWN0aW9uCi17Ci0gICAgcHVibGljIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlciwgY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgaW50IHRvb2xJRCwgaW50IHZpZXdJRCwgaW50IHZpZXdUb29sSUQsIGJvb2xlYW4ga2VlcEhpc3RvcnkpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImZhdm9yaXRlcy9hY3Rpb25zL1NlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb25KU1AuanNwPyIpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKHRvb2xJRCk7Ci0gICAgICAgIGlmICh2aWV3SUQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKSB7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGtlZXBIaXN0b3J5KSB7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgiPTEiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICAgIHsKLSAgICAgICAgaWYgKGdldFNlbGVjdGVkVG9vbCgpLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikgewotICAgICAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgZ2V0U2VsZWN0ZWRUb29sKCkuZ2V0VG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0VHJlZUNvbnRlbnRWYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0VHJlZUNvbnRlbnRQYWdlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGVudFZhcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXRQcm9wZXJ0aWVzQ29udGVudFBhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX0ZBVk9SSVRFUzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzBjNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbUZhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBTd2l0Y2hQZXJzcGVjdGl2ZUZyb21GYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBTaG93UGVyc3BlY3RpdmVBY3Rpb24KLXsKLSAgcHVibGljIFN3aXRjaFBlcnNwZWN0aXZlRnJvbUZhdm9yaXRlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gcGFyc2VyLmdldFBhcmFtZXRlcihGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyAhPSBudWxsICYmIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCxwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSLGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChGYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSKTsKLSAgICAKLSAgICAvLyBTYXZlIHRoZSBmcmFtZXNldCBzaXplcyBpZmYgbm8gZnJhbWUgaXMgbWF4aW1pemVkLgotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBpZiAoIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5zdGFydHNXaXRoKCIxMDAlIikgJiYgIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgZmF2UGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAKLSAgICBpZiAoIWFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3Muc3RhcnRzV2l0aCgiMTAwJSIpICYmICFhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICBmYXZQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgCi0gICAgcmV0dXJuIHN1cGVyLnJ1bigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb3JtQWN0aW9uTGluayhpbnQgdGFyZ2V0UGVyc3BlY3RpdmVJZCxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgZm9ybUxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgZm9ybUxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSkuYXBwZW5kKCc9JykuYXBwZW5kKHRhcmdldFBlcnNwZWN0aXZlSWQpOwotICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgZm9ybUxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpLmFwcGVuZCgiPTEiKTsgICAgCi0gICAgcmV0dXJuIGZvcm1MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvY29uc3RhbnRzL0Zhdm9yaXRlc0FjdGlvbklucHV0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9jb25zdGFudHMvRmF2b3JpdGVzQWN0aW9uSW5wdXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2E2NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9jb25zdGFudHMvRmF2b3JpdGVzQWN0aW9uSW5wdXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNBY3Rpb25JbnB1dHMKLXsKLSAgICAvLyBtYXNzIGFjdGlvbnMKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNVUxUSVBMRV9MSU5LX0FDVElPTiA9ICJtdWx0aXBsZUxpbmtBY3Rpb24iOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BU1NfQUNUSU9OX05PREVfSUQgPSAibWFzc0FjdGlvbk5vZGVJRCI7Ci0KLSAgICAvLyByZXNpemUgZmF2b3JpdGVzIGZyYW1lcyBhY3Rpb24KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQgPSAiZnJhbWVzZXRDb2xzUGVyc3BlY3RpdmVDb250ZW50IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSID0gImZyYW1lc2V0Um93c0FjdGlvbnNDb250YWluZXIiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9jb25zdGFudHMvRmF2b3JpdGVzRnJhbWVOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9jb25zdGFudHMvRmF2b3JpdGVzRnJhbWVOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTI2MjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvY29uc3RhbnRzL0Zhdm9yaXRlc0ZyYW1lTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0ZyYW1lTmFtZXMKLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFWSUdBVE9SX0NPTlRBSU5FUiA9ICJmYXZfbmF2aWdhdG9yX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BVklHQVRPUl9UT09MQkFSID0gImZhdl9uYXZpZ2F0b3JfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BVklHQVRPUl9DT05URU5UID0gImZhdl9uYXZpZ2F0b3JfY29udGVudCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTlNfQ09OVEFJTkVSID0gImZhdl9hY3Rpb25zX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfQ09OVEFJTkVSID0gImZhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfVE9PTEJBUiA9ICJmYXZfcHJvcGVydGllc190b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19DT05URU5UID0gImZhdl9wcm9wZXJ0aWVzX2NvbnRlbnQiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEFUVVNfQ09OVEFJTkVSID0gImZhdl9zdGF0dXNfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVFVTX1RPT0xCQVIgPSAiZmF2X3N0YXR1c190b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVFVTX0NPTlRFTlQgPSAiZmF2X3N0YXR1c19jb250ZW50IjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvY29uc3RhbnRzL0Zhdm9yaXRlc01vZGVsQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2NvbnN0YW50cy9GYXZvcml0ZXNNb2RlbENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjkzNWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvY29uc3RhbnRzL0Zhdm9yaXRlc01vZGVsQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNNb2RlbENvbnN0YW50cyB7Ci0gICAgLy8gUmVsYXRpb25zCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1dTSUxfRk9MREVSX05PREUgPSAicmVsV1NJTEZvbGRlck5vZGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9XU0RMX1NFUlZJQ0VfRk9MREVSX05PREUgPSAicmVsV1NETFNlcnZpY2VGb2xkZXJOb2RlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUxfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFID0gInJlbFVERElTZXJ2aWNlRm9sZGVyTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1VERElfQlVTSU5FU1NfRk9MREVSX05PREUgPSAicmVsVURESUJ1c2luZXNzRm9sZGVyTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfRk9MREVSX05PREUgPSAicmVsVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJOb2RlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUxfVURESV9SRUdJU1RSWV9GT0xERVJfTk9ERSA9ICJyZWxVRERJUmVnaXN0cnlGb2xlck5vZGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9XU0lMX05PREUgPSAicmVsV1NJTE5vZGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9XU0RMX1NFUlZJQ0VfTk9ERSA9ICJyZWxXU0RMU2VydmljZU5vZGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9VRERJX1NFUlZJQ0VfTk9ERSA9ICJyZWxVRERJU2VydmljZU5vZGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9VRERJX0JVU0lORVNTX05PREUgPSAicmVsVURESUJ1c2luZXNzTm9kZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTk9ERSA9ICJyZWxVRERJU2VydmljZUludGVyZmFjZU5vZGUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9VRERJX1JFR0lTVFJZX05PREUgPSAicmVsVURESVJlZ2lzdHJ5Tm9kZSI7Ci0KLSAgICAvLyBQcm9wZXJ0aWVzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9QTFVHSU5fTUVUQURBVEFfRElSRUNUT1JZID0gInBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1dTSUxfVVJMID0gIndzaWxVUkwiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfV1NETF9VUkwgPSAid3NkbFVSTCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1NFUlZJQ0VfTkFNRSA9ICJVRERJU2VydmljZU5hbWUiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfVURESV9TRVJWSUNFX0lOUVVJUllfQVBJID0gIlVERElTZXJ2aWNlSW5xdWlyeUFQSSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1NFUlZJQ0VfS0VZID0gIlVERElTZXJ2aWNlS2V5IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfQlVTSU5FU1NfTkFNRSA9ICJVRERJQnVzaW5lc3NOYW1lIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfQlVTSU5FU1NfSU5RVUlSWV9BUEkgPSAiVURESUJ1c2luZXNzSW5xdWlyeUFQSSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX0JVU0lORVNTX0tFWSA9ICJVRERJQnVzaW5lc3NLZXkiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FID0gIlVERElTZXJ2aWNlSW50ZXJmYWNlTmFtZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0lOUVVJUllfQVBJID0gIlVERElTZXJ2aWNlSW50ZXJmYWNlSW5xdWlyeUFQSSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSA9ICJVRERJU2VydmljZUludGVyZmFjZUtleSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1JFR0lTVFJZX05BTUUgPSAiVURESVJlZ2lzdHJ5TmFtZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUF9VRERJX1JFR0lTVFJZX0lOUVVJUllfQVBJID0gIlVERElSZWdpc3RyeUlucXVpcnlBUEkiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfVURESV9SRUdJU1RSWV9QVUJMSVNIX0FQSSA9ICJVRERJUmVnaXN0cnlQdWJsaXNoQVBJIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1VERElfUkVHSVNUUllfUkVHSVNUUkFUSU9OX1VSTCA9ICJVRERJUmVnaXN0cnlSZWdpc3RyYXRpb25VUkwiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BfVURESV9SRUdJU1RSWV9DQVRFR09SSUVTX0VOVU0gPSAiVURESVJlZ2lzdHJ5Q2F0ZWdvcmllc0VudW0iOwotCi0gICAgLy8gTGlzdCBNYW5hZ2VycyBmb3IgRmF2b3JpdGVzCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMgPSAid3NkbFNlcnZpY2VzIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUyA9ICJ1ZGRpU2VydmljZXMiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfTUFOQUdFUl9VRERJX0JVU0lORVNTID0gInVkZGlCdXNpbmVzcyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9NQU5BR0VSX1dTSUxfTElOS1MgPSAid3NpbExpbmtzIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMSVNUX01BTkFHRVJfVURESV9SRUdJU1RSWSA9ICJ1ZGRpUmVnaXN0cnkiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfTUFOQUdFUl9VRERJX1NFUlZJQ0VfSU5URVJGQUNFID0gInVkZGlTZXJ2aWNlSW50ZXJmYWNlIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4MzNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgZG9jdW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzRWxlbWVudCBleHRlbmRzIFRyZWVFbGVtZW50IHsKLQotICBwdWJsaWMgRmF2b3JpdGVzRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gIH0KLQotICBwdWJsaWMgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBnZXRQYXJlbnRGb2xkZXJFbGVtZW50KCkgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIGlmICghZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc0ZvbGRlckVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc0ZvbGRlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ZGNjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNGb2xkZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSogVGhlIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgCi0qIGEgV1NJTCBkb2N1bWVudAotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IGV4dGVuZHMgVHJlZUVsZW1lbnQKLXsKLSAgICBwcm90ZWN0ZWQgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICAgIAotICAgIHB1YmxpYyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgICAgICBub2RlTWFuYWdlcl8gPSBub2RlTWFuYWdlcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiAoRmF2b3JpdGVzTWFpbkVsZW1lbnQpbm9kZU1hbmFnZXJfLmdldFJvb3ROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0KEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50KTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHJlbW92ZUZhdm9yaXRlQnlOb2RlSUQoaW50IG5vZGVJRCxTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVtb3ZlQWxsRmF2b3JpdGVzKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSk7Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpOwotCi0gICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBFbnVtZXJhdGlvbiBnZXRBbGxGYXZvcml0ZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzTWFpbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc01haW5FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZTQ4YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzTWFpbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLmZhdm9yaXRlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgZG9jdW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZXh0ZW5kcyBUcmVlRWxlbWVudAotewotICBwcml2YXRlIENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIHByaXZhdGUgRmF2b3JpdGVzUmVnaXN0cnlUeXBlV1NFIGZhdlJlZ2lzdHJ5XzsKLQotICBwdWJsaWMgRmF2b3JpdGVzTWFpbkVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgIGZhdlJlZ2lzdHJ5XyA9IG5ldyBGYXZvcml0ZXNSZWdpc3RyeVR5cGVXU0UoCi0JCQljb250cm9sbGVyLmdldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbigpLAotCQkJY29udHJvbGxlci5nZXRTZXJ2bGV0RW5naW5lU3RhdGVMb2NhdGlvbigpCi0JKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlc3RvcmVGYXZvcml0ZXNEZWZhdWx0KCkKLSAgewotICAgIGZhdlJlZ2lzdHJ5Xy5yZXN0b3JlRmF2b3JpdGVzRGVmYXVsdCgpOwotICAgIHJldHVybiBzYXZlRmF2b3JpdGVzKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzYXZlRmF2b3JpdGVzKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGZhdlJlZ2lzdHJ5Xy5zYXZlKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2UoZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1NBVkVfRkFWT1JJVEVTX1dTSUwiLCBmYXZSZWdpc3RyeV8uZ2V0V3JpdGVMb2NhdGlvbigpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExpbmsgYWRkVURESVJlZ2lzdHJ5KFN0cmluZyByZWdpc3RyeU5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgcHVibGlzaEFQSSwgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8uYWRkVURESVJlZ2lzdHJ5KHJlZ2lzdHJ5TmFtZSwgaW5xdWlyeUFQSSwgcHVibGlzaEFQSSwgcmVnaXN0cmF0aW9uVVJMKTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rIGFkZFVERElCdXNpbmVzcyhTdHJpbmcgYnVzaW5lc3NOYW1lLCBTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIGJ1c2luZXNzS2V5KQotICB7Ci0gICAgcmV0dXJuIGZhdlJlZ2lzdHJ5Xy5hZGRVRERJQnVzaW5lc3MoYnVzaW5lc3NOYW1lLCBpbnF1aXJ5QVBJLCBidXNpbmVzc0tleSk7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBhZGRVRERJU2VydmljZShTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgc2VydmljZUtleSkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8uYWRkVURESVNlcnZpY2Uoc2VydmljZU5hbWUsIGlucXVpcnlBUEksIHNlcnZpY2VLZXkpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgYWRkVURESVNlcnZpY2VJbnRlcmZhY2UoU3RyaW5nIHNlckludE5hbWUsIFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgc2VySW50S2V5KQotICB7Ci0gICAgcmV0dXJuIGZhdlJlZ2lzdHJ5Xy5hZGRVRERJU2VydmljZUludGVyZmFjZShzZXJJbnROYW1lLCBpbnF1aXJ5QVBJLCBzZXJJbnRLZXkpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgYWRkV1NETFNlcnZpY2UoU3RyaW5nIHVybCkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8uYWRkV1NETFNlcnZpY2UodXJsKTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rIGFkZFdTSUxMaW5rKFN0cmluZyB1cmwpCi0gIHsKLSAgICByZXR1cm4gZmF2UmVnaXN0cnlfLmFkZFdTSUxMaW5rKHVybCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgIGZhdlJlZ2lzdHJ5Xy5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlTGluayhMaW5rIGxpbmspIHsKLSAgICBmYXZSZWdpc3RyeV8ucmVtb3ZlTGluayhsaW5rKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rW10gbG9hZFVERElSZWdpc3RyaWVzKCkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8ubG9hZFVERElSZWdpc3RyaWVzKCk7Ci0gIH0KLSAgICAKLSAgcHVibGljIExpbmtbXSBsb2FkVURESUJ1c2luZXNzZXMoKQotICB7Ci0gICAgcmV0dXJuIGZhdlJlZ2lzdHJ5Xy5sb2FkVURESUJ1c2luZXNzZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlW10gbG9hZFVERElTZXJ2aWNlcygpCi0gIHsKLSAgICByZXR1cm4gZmF2UmVnaXN0cnlfLmxvYWRVRERJU2VydmljZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlW10gbG9hZFVERElTZXJ2aWNlSW50ZXJmYWNlcygpCi0gIHsKLSAgICByZXR1cm4gZmF2UmVnaXN0cnlfLmxvYWRVRERJU2VydmljZUludGVyZmFjZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlW10gbG9hZFdTRExTZXJ2aWNlcygpCi0gIHsKLSAgICByZXR1cm4gZmF2UmVnaXN0cnlfLmxvYWRXU0RMU2VydmljZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBMaW5rW10gbG9hZFdTSUxzKCkKLSAgewotICAgIHJldHVybiBmYXZSZWdpc3RyeV8ubG9hZFdTSUxzKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50IGdldEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KShnZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9GT0xERVJfTk9ERSkubmV4dEVsZW1lbnQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5MWZiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXMuRmF2b3JpdGVzVURESUJ1c2luZXNzOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC4qOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCBleHRlbmRzIEZhdm9yaXRlc0VsZW1lbnQgewotCi0gIHByaXZhdGUgRmF2b3JpdGVzVURESUJ1c2luZXNzIHVkZGlCdXNpbmVzc187Ci0KLSAgcHVibGljIEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBMaW5rIGxpbmspIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgdWRkaUJ1c2luZXNzXyA9IG5ldyBGYXZvcml0ZXNVRERJQnVzaW5lc3MoKTsKLSAgICB1ZGRpQnVzaW5lc3NfLnNldExpbmsobGluayk7Ci0gIH0KLQotICBwdWJsaWMgTGluayBnZXRMaW5rKCkgewotICAgIHJldHVybiB1ZGRpQnVzaW5lc3NfLmdldExpbmsoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gdWRkaUJ1c2luZXNzXy5nZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgcmV0dXJuIHVkZGlCdXNpbmVzc18uZ2V0SW5xdWlyeVVSTCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRCdXNpbmVzc0tleSgpIHsKLSAgICByZXR1cm4gdWRkaUJ1c2luZXNzXy5nZXRCdXNpbmVzc0tleSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTUwYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgZG9jdW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudCBleHRlbmRzIEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQKLXsKLSAgcHVibGljIEZhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlckVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBOb2RlTWFuYWdlciBub2RlTWFuYWdlcikgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsLCBub2RlTWFuYWdlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50KSB7Ci0gICAgTGlua1tdIGxpbmtzID0gZmF2TWFpbkVsZW1lbnQubG9hZFVERElCdXNpbmVzc2VzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgewotICAgICAgTGluayBsaW5rID0gbGlua3NbaV07Ci0gICAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50IGZhdlVERElCdXNpbmVzc0VsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCgobGluay5nZXRBYnN0cmFjdHMoKSlbMF0uZ2V0VGV4dCgpLCBnZXRNb2RlbCgpLCBsaW5rKTsKLSAgICAgIGNvbm5lY3QoZmF2VURESUJ1c2luZXNzRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfQlVTSU5FU1NfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgYnVzaW5lc3NOYW1lID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX05BTUUpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX0lOUVVJUllfQVBJKTsKLSAgICBTdHJpbmcgYnVzaW5lc3NLZXkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfQlVTSU5FU1NfS0VZKTsKLSAgICBpZiAoYnVzaW5lc3NOYW1lID09IG51bGwgfHwgaW5xdWlyeUFQSSA9PSBudWxsIHx8IGJ1c2luZXNzS2V5ID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCBlID0gZ2V0RmF2b3JpdGUoaW5xdWlyeUFQSSwgYnVzaW5lc3NLZXkpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgICByZW1vdmVGYXZvcml0ZShlKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgTGluayBsaW5rID0gZmF2TWFpbkVsZW1lbnQuYWRkVURESUJ1c2luZXNzKGJ1c2luZXNzTmFtZSwgaW5xdWlyeUFQSSwgYnVzaW5lc3NLZXkpOwotICAgIGJvb2xlYW4gc2F2ZWQgPSBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gICAgaWYgKHNhdmVkKSB7Ci0gICAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50IGZhdlVERElCdXNpbmVzc0VsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudChidXNpbmVzc05hbWUsIGdldE1vZGVsKCksIGxpbmspOwotICAgICAgY29ubmVjdChmYXZVRERJQnVzaW5lc3NFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9CVVNJTkVTU19OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIH0KLSAgICByZXR1cm4gc2F2ZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cyhIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19JTlFVSVJZX0FQSSk7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX0tFWSk7Ci0gICAgaWYgKGlucXVpcnlBUEkgPT0gbnVsbCB8fCBidXNpbmVzc0tleSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAoZ2V0RmF2b3JpdGUoaW5xdWlyeUFQSSwgYnVzaW5lc3NLZXkpICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRmF2b3JpdGVCeU5vZGVJRChpbnQgbm9kZUlELFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQpCi0gICAgICByZXR1cm4gKHJlbW92ZUZhdm9yaXRlKChGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkgJiYgZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRmF2b3JpdGUoRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgTGluayBsaW5rID0gZWxlbWVudC5nZXRMaW5rKCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChmYXZNYWluRWxlbWVudC5yZW1vdmVMaW5rKGxpbmspKSB7Ci0gICAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGxGYXZvcml0ZXMoU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KSB7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50IGZhdlVERElCdXNpbmVzc0VsZW1lbnQgPSAoRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBMaW5rIGxpbmsgPSBmYXZVRERJQnVzaW5lc3NFbGVtZW50LmdldExpbmsoKTsKLSAgICAgIGZhdk1haW5FbGVtZW50LnJlbW92ZUxpbmsobGluayk7Ci0gICAgfQotICAgIGRpc2Nvbm5lY3RSZWwoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfQlVTSU5FU1NfTk9ERSk7Ci0gICAgcmV0dXJuIGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBbGxGYXZvcml0ZXMoKSB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX05PREUpOwotICB9Ci0KLSAgcHJpdmF0ZSBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50IGdldEZhdm9yaXRlKFN0cmluZyBpbnF1aXJ5QVBJLCBTdHJpbmcgYnVzaW5lc3NLZXkpIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmIChpbnF1aXJ5QVBJLmVxdWFscyhidXNFbGVtZW50LmdldElucXVpcnlVUkwoKSkgJiYKLSAgICAgICAgICBidXNpbmVzc0tleS5lcXVhbHMoYnVzRWxlbWVudC5nZXRCdXNpbmVzc0tleSgpKSkKLSAgICAgICAgcmV0dXJuIGJ1c0VsZW1lbnQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDQ5ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZmF2b3JpdGVzLkZhdm9yaXRlc1VERElSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlcy5JRmF2b3JpdGVzVURESVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC4qOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBleHRlbmRzIEZhdm9yaXRlc0VsZW1lbnQgewotCi0gIHByaXZhdGUgRmF2b3JpdGVzVURESVJlZ2lzdHJ5IHVkZGlSZWdfOwotCi0gIHB1YmxpYyBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTGluayBsaW5rKSB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHVkZGlSZWdfID0gbmV3IEZhdm9yaXRlc1VERElSZWdpc3RyeSgpOwotICAgIHVkZGlSZWdfLnNldExpbmsobGluayk7Ci0gIH0KLQotICBwdWJsaWMgTGluayBnZXRMaW5rKCkgewotICAgIHJldHVybiB1ZGRpUmVnXy5nZXRMaW5rKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgcmV0dXJuIHVkZGlSZWdfLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICByZXR1cm4gdWRkaVJlZ18uZ2V0SW5xdWlyeVVSTCgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkgewotICAgIHJldHVybiB1ZGRpUmVnXy5nZXRQdWJsaXNoVVJMKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpIHsKLSAgICByZXR1cm4gdWRkaVJlZ18uZ2V0UmVnaXN0cmF0aW9uVVJMKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBnZXROYW1lKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5IGdldElGYXZvcml0ZXNVRERJUmVnaXN0cnlJbnRlcmZhY2UoKQotICB7Ci0gICAgcmV0dXJuIHVkZGlSZWdfOwotICB9Ci19Ci0gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWUzZGIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkNhdGVnb3J5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVVJMVXRpbHM7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50Ci17Ci0gIHB1YmxpYyBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCwgbm9kZU1hbmFnZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCkgewotICAgIExpbmtbXSBsaW5rcyA9IGZhdk1haW5FbGVtZW50LmxvYWRVRERJUmVnaXN0cmllcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIExpbmsgbGluayA9IGxpbmtzW2ldOwotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZVRERJUmVnc2l0cnlFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQoKGxpbmsuZ2V0QWJzdHJhY3RzKCkpWzBdLmdldFRleHQoKSwgZ2V0TW9kZWwoKSwgbGluayk7Ci0gICAgICBjb25uZWN0KGZhdlVERElSZWdzaXRyeUVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgcmVnaXN0cnlOYW1lID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1JFR0lTVFJZX05BTUUpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1JFR0lTVFJZX0lOUVVJUllfQVBJKTsKLSAgICBTdHJpbmcgcHVibGlzaEFQSSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9QVUJMSVNIX0FQSSk7Ci0gICAgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9SRUdJU1RSQVRJT05fVVJMKTsKLSAgICBFbnVtZXJhdGlvbiB1c2VyRGVmaW5lZENhdGVnb3JpZXMgPSAoRW51bWVyYXRpb24pdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9DQVRFR09SSUVTX0VOVU0pOwotICAgIC8vIFNhdmUgdGhlIGNhdGVnb3J5IGRhdGEgZmlyc3QgYW5kIHVuZG8gaWYgbmVjZXNzYXJ5LgotICAgIGlmICh1c2VyRGVmaW5lZENhdGVnb3JpZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1BMVUdJTl9NRVRBREFUQV9ESVJFQ1RPUlkpOwotICAgICAgU3RyaW5nQnVmZmVyIGRpcmVjdG9yeUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGZvcm1DYXRlZ29yaWVzRGlyZWN0b3J5KGRpcmVjdG9yeUJ1ZmZlcixwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSxyZWdpc3RyeU5hbWUpOwotICAgICAgRmlsZSBjYXRlZ29yaWVzRGlyZWN0b3J5RmlsZSA9IG5ldyBGaWxlKGRpcmVjdG9yeUJ1ZmZlci50b1N0cmluZygpKTsKLSAgICAgIGNhdGVnb3JpZXNEaXJlY3RvcnlGaWxlLm1rZGlycygpOwotICAgICAgU3RyaW5nQnVmZmVyIGNhdGVnb3J5RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB3aGlsZSAodXNlckRlZmluZWRDYXRlZ29yaWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBDYXRlZ29yeU1vZGVsIGNhdGVnb3J5TW9kZWwgPSAoQ2F0ZWdvcnlNb2RlbCl1c2VyRGVmaW5lZENhdGVnb3JpZXMubmV4dEVsZW1lbnQoKTsgICAgICAgIAotICAgICAgICBjYXRlZ29yeUZpbGVOYW1lLnNldExlbmd0aCgwKTsKLSAgICAgICAgU3RyaW5nIGVuY29kZWRDYXRlZ29yeUtleSA9IFVSTFV0aWxzLmVuY29kZShjYXRlZ29yeU1vZGVsLmdldENhdGVnb3J5S2V5KCkpOwotICAgICAgICBjYXRlZ29yeUZpbGVOYW1lLmFwcGVuZChjYXRlZ29yaWVzRGlyZWN0b3J5RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKGVuY29kZWRDYXRlZ29yeUtleSkuYXBwZW5kKCIudHh0Iik7Ci0gICAgICAgIGJ5dGUgcmMgPSBjYXRlZ29yeU1vZGVsLnNhdmVEYXRhKGNhdGVnb3J5RmlsZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChyYyAhPSBDYXRlZ29yeU1vZGVsLk9QRVJBVElPTl9TVUNDRVNTRlVMKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRGVsZXRlIHRoZSBjYXRlZ29yeSBmaWxlIGlmIGl0IGV4aXN0cy4KLSAgICAgICAgICBGaWxlIGNhdGVnb3J5RmlsZSA9IG5ldyBGaWxlKGNhdGVnb3J5RmlsZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgaWYgKGNhdGVnb3J5RmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgIGNhdGVnb3J5RmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2xlYW51cENhdGVnb3J5RGlyZWN0b3JpZXMoY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUpOwotICAgIH0KLSAgICBpZiAocmVnaXN0cnlOYW1lID09IG51bGwgfHwgaW5xdWlyeUFQSSA9PSBudWxsIHx8IHB1Ymxpc2hBUEkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50IGUgPSBnZXRGYXZvcml0ZShyZWdpc3RyeU5hbWUpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgICByZW1vdmVGYXZvcml0ZShlKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgTGluayBsaW5rID0gZmF2TWFpbkVsZW1lbnQuYWRkVURESVJlZ2lzdHJ5KHJlZ2lzdHJ5TmFtZSwgaW5xdWlyeUFQSSwgcHVibGlzaEFQSSwgcmVnaXN0cmF0aW9uVVJMKTsKLSAgICBib29sZWFuIHNhdmVkID0gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICAgIGlmIChzYXZlZCkgewotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZVRERJUmVnc2l0cnlFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQocmVnaXN0cnlOYW1lLCBnZXRNb2RlbCgpLCBsaW5rKTsKLSAgICAgIGNvbm5lY3QoZmF2VURESVJlZ3NpdHJ5RWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNhdmVkOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgZm9ybUNhdGVnb3JpZXNEaXJlY3RvcnkoU3RyaW5nQnVmZmVyIGNhdGVnb3JpZXNEaXJlY3RvcnksU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5LFN0cmluZyByZWdpc3RyeU5hbWUpCi0gIHsKLSAgICAvLyA8bWV0YWRhdGE+L3VkZGkvPHJlZ2lzdHJ5SWQ+L2NhdGVnb3JpZXMKLQlTdHJpbmcgZW5jb2RlZFJlZ2lzdHJ5TmFtZSA9IFVSTFV0aWxzLmVuY29kZShyZWdpc3RyeU5hbWUpOwotICAgIGNhdGVnb3JpZXNEaXJlY3RvcnkuYXBwZW5kKHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KS5hcHBlbmQoInVkZGkiKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKS5hcHBlbmQoZW5jb2RlZFJlZ2lzdHJ5TmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKCJjYXRlZ29yaWVzIik7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHZvaWQgY2xlYXJSZWdpc3RyeU1ldGFkYXRhKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSxTdHJpbmcgcmVnaXN0cnlOYW1lKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGNhdGVnb3JpZXNEaXJlY3RvcnkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgZm9ybUNhdGVnb3JpZXNEaXJlY3RvcnkoY2F0ZWdvcmllc0RpcmVjdG9yeSxwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSxyZWdpc3RyeU5hbWUpOwotICAgIEZpbGUgY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUgPSBuZXcgRmlsZShjYXRlZ29yaWVzRGlyZWN0b3J5LnRvU3RyaW5nKCkpOwotICAgIEZpbGVbXSBjYXRlZ29yeUZpbGVzID0gY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUubGlzdEZpbGVzKCk7Ci0gICAgaWYgKGNhdGVnb3J5RmlsZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjYXRlZ29yeUZpbGVzLmxlbmd0aDtpKyspCi0gICAgICAgIGNhdGVnb3J5RmlsZXNbaV0uZGVsZXRlKCk7Ci0gICAgfQotICAgIGNsZWFudXBDYXRlZ29yeURpcmVjdG9yaWVzKGNhdGVnb3JpZXNEaXJlY3RvcnlGaWxlKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNsZWFudXBDYXRlZ29yeURpcmVjdG9yaWVzKEZpbGUgY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUpCi0gIHsKLSAgICAvLyBEZWxldGUgdGhlIGNhdGVnb3JpZXMgc3ViZGlyZWN0b3J5IGlmIGl0IGlzIGVtcHR5LgotICAgIFN0cmluZ1tdIGZpbGVMaXN0OwotICAgIGZpbGVMaXN0ID0gY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUubGlzdCgpOwotICAgIGlmIChmaWxlTGlzdCA9PSBudWxsIHx8IGZpbGVMaXN0Lmxlbmd0aCA9PSAwKQotICAgICAgY2F0ZWdvcmllc0RpcmVjdG9yeUZpbGUuZGVsZXRlKCk7Ci0gICAgLy8gRGVsZXRlIHRoZSA8cmVnaXN0cnlJZD4gc3ViZGlyZWN0b3J5IGlmIGl0IGlzIGVtcHR5LgotICAgIEZpbGUgcmVnaXN0cnlJZERpcmVjdG9yeUZpbGUgPSBjYXRlZ29yaWVzRGlyZWN0b3J5RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgZmlsZUxpc3QgPSByZWdpc3RyeUlkRGlyZWN0b3J5RmlsZS5saXN0KCk7Ci0gICAgaWYgKGZpbGVMaXN0ID09IG51bGwgfHwgZmlsZUxpc3QubGVuZ3RoID09IDApCi0gICAgICByZWdpc3RyeUlkRGlyZWN0b3J5RmlsZS5kZWxldGUoKTsKLSAgICAvLyBEZWxldGUgdGhlIHVkZGkgc3ViZGlyZWN0b3J5IGlmIGl0IGlzIGVtcHR5LgotICAgIEZpbGUgdWRkaURpcmVjdG9yeUZpbGUgPSByZWdpc3RyeUlkRGlyZWN0b3J5RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgZmlsZUxpc3QgPSB1ZGRpRGlyZWN0b3J5RmlsZS5saXN0KCk7Ci0gICAgaWYgKGZpbGVMaXN0ID09IG51bGwgfHwgZmlsZUxpc3QubGVuZ3RoID09IDApCi0gICAgICB1ZGRpRGlyZWN0b3J5RmlsZS5kZWxldGUoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKEhhc2h0YWJsZSB0YWJsZSkgewotICAgIFN0cmluZyByZWdpc3RyeU5hbWUgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfUkVHSVNUUllfTkFNRSk7Ci0gICAgaWYgKHJlZ2lzdHJ5TmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAoZ2V0RmF2b3JpdGUocmVnaXN0cnlOYW1lKSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUZhdm9yaXRlQnlOb2RlSUQoaW50IG5vZGVJRCxTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50KQotICAgIHsKLSAgICAgIGNsZWFyUmVnaXN0cnlNZXRhZGF0YShwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSxzZWxlY3RlZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIGJvb2xlYW4gcmMgPSByZW1vdmVGYXZvcml0ZSgoRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudClzZWxlY3RlZEVsZW1lbnQpOwotICAgICAgcmMgPSByYyAmJiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gICAgICByZXR1cm4gcmM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVGYXZvcml0ZShGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50IGVsZW1lbnQpIHsKLSAgICBMaW5rIGxpbmsgPSAoKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZWxlbWVudCkuZ2V0TGluaygpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBpZiAoZmF2TWFpbkVsZW1lbnQucmVtb3ZlTGluayhsaW5rKSkgewotICAgICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsRmF2b3JpdGVzKFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkgewotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgd2hpbGUoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZVRERJUmVnaXN0cnlFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgY2xlYXJSZWdpc3RyeU1ldGFkYXRhKHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5LGZhdlVERElSZWdpc3RyeUVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgIExpbmsgbGluayA9IGZhdlVERElSZWdpc3RyeUVsZW1lbnQuZ2V0TGluaygpOwotICAgICAgZmF2TWFpbkVsZW1lbnQucmVtb3ZlTGluayhsaW5rKTsKLSAgICB9Ci0gICAgZGlzY29ubmVjdFJlbChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9OT0RFKTsKLSAgICByZXR1cm4gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEZhdm9yaXRlcygpIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfUkVHSVNUUllfTk9ERSk7Ci0gIH0KLQotICBwcml2YXRlIEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQgZ2V0RmF2b3JpdGUoU3RyaW5nIHJlZ2lzdHJ5TmFtZSkgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKHJlZ2lzdHJ5TmFtZS5lcXVhbHMocmVnRWxlbWVudC5nZXROYW1lKCkpKQotICAgICAgICByZXR1cm4gcmVnRWxlbWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNGNlOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXMuRmF2b3JpdGVzVURESVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLio7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNFbGVtZW50IHsKLQotICBwcml2YXRlIEZhdm9yaXRlc1VERElTZXJ2aWNlIHVkZGlTZXJ2aWNlXzsKLQotICBwdWJsaWMgRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHVkZGlTZXJ2aWNlXyA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZSgpOwotICAgIHVkZGlTZXJ2aWNlXy5zZXRTZXJ2aWNlKHNlcnZpY2UpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLSAgICByZXR1cm4gdWRkaVNlcnZpY2VfLmdldFNlcnZpY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gdWRkaVNlcnZpY2VfLmdldE5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpIHsKLSAgICByZXR1cm4gdWRkaVNlcnZpY2VfLmdldElucXVpcnlVUkwoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUtleSgpIHsKLSAgICByZXR1cm4gdWRkaVNlcnZpY2VfLmdldFNlcnZpY2VLZXkoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJU2VydmljZUZvbGRlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0ODUxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJU2VydmljZUZvbGRlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLio7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudCBleHRlbmRzIEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQKLXsKLQotICBwdWJsaWMgRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCwgbm9kZU1hbmFnZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCkgewotICAgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IGZhdk1haW5FbGVtZW50LmxvYWRVRERJU2VydmljZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlc1tpXTsKLSAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCBmYXZVRERJU2VydmljZUVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50KChzZXJ2aWNlLmdldFNlcnZpY2VOYW1lcygpKVswXS5nZXRUZXh0KCksIGdldE1vZGVsKCksIHNlcnZpY2UpOwotICAgICAgY29ubmVjdChmYXZVRERJU2VydmljZUVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBhZGRGYXZvcml0ZShIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgc2VydmljZU5hbWUgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9OQU1FKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOUVVJUllfQVBJKTsKLSAgICBTdHJpbmcgc2VydmljZUtleSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0tFWSk7Ci0gICAgaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgaW5xdWlyeUFQSSA9PSBudWxsIHx8IHNlcnZpY2VLZXkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgZSA9IGdldEZhdm9yaXRlKGlucXVpcnlBUEksIHNlcnZpY2VLZXkpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgICByZW1vdmVGYXZvcml0ZShlKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gZmF2TWFpbkVsZW1lbnQuYWRkVURESVNlcnZpY2Uoc2VydmljZU5hbWUsIGlucXVpcnlBUEksIHNlcnZpY2VLZXkpOwotICAgIGJvb2xlYW4gc2F2ZWQgPSBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gICAgaWYgKHNhdmVkKSB7Ci0gICAgICBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgZmF2VURESVNlcnZpY2VFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudChzZXJ2aWNlTmFtZSwgZ2V0TW9kZWwoKSwgc2VydmljZSk7Ci0gICAgICBjb25uZWN0KGZhdlVERElTZXJ2aWNlRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIH0KLSAgICByZXR1cm4gc2F2ZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cyhIYXNodGFibGUgdGFibGUpIHsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOUVVJUllfQVBJKTsKLSAgICBTdHJpbmcgc2VydmljZUtleSA9IChTdHJpbmcpdGFibGUuZ2V0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0tFWSk7Ci0gICAgaWYgKGlucXVpcnlBUEkgPT0gbnVsbCB8fCBzZXJ2aWNlS2V5ID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIChnZXRGYXZvcml0ZShpbnF1aXJ5QVBJLCBzZXJ2aWNlS2V5KSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUZhdm9yaXRlQnlOb2RlSUQoaW50IG5vZGVJRCxTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQpCi0gICAgICByZXR1cm4gKHJlbW92ZUZhdm9yaXRlKChGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KSAmJiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVGYXZvcml0ZShGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgZWxlbWVudCkgewotICAgIFNlcnZpY2Ugc2VydmljZSA9ICgoRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50KWVsZW1lbnQpLmdldFNlcnZpY2UoKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgaWYgKGZhdk1haW5FbGVtZW50LnJlbW92ZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgIGVsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbEZhdm9yaXRlcyhTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCBmYXZVRERJU2VydmljZUVsZW1lbnQgPSAoRmF2b3JpdGVzVURESVNlcnZpY2VFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGZhdlVERElTZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlKCk7Ci0gICAgICBmYXZNYWluRWxlbWVudC5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLSAgICBkaXNjb25uZWN0UmVsKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfTk9ERSk7Ci0gICAgcmV0dXJuIGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBbGxGYXZvcml0ZXMoKSB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfTk9ERSk7Ci0gIH0KLQotICBwcml2YXRlIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCBnZXRGYXZvcml0ZShTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIHNlcnZpY2VLZXkpIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCBzZXJFbGVtZW50ID0gKEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBpZiAoaW5xdWlyeUFQSS5lcXVhbHMoc2VyRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCkpICYmCi0gICAgICAgICAgc2VydmljZUtleS5lcXVhbHMoc2VyRWxlbWVudC5nZXRTZXJ2aWNlS2V5KCkpKQotICAgICAgICByZXR1cm4gc2VyRWxlbWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZjg5MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5mYXZvcml0ZXMuRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLio7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNFbGVtZW50IHsKLQotICBwcml2YXRlIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlIHVkZGlTZXJJbnRfOwotCi0gIHB1YmxpYyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgdWRkaVNlckludF8gPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2UoKTsKLSAgICB1ZGRpU2VySW50Xy5zZXRTZXJ2aWNlKHNlcnZpY2UpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLSAgICByZXR1cm4gdWRkaVNlckludF8uZ2V0U2VydmljZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgIHJldHVybiB1ZGRpU2VySW50Xy5nZXROYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKSB7Ci0gICAgcmV0dXJuIHVkZGlTZXJJbnRfLmdldElucXVpcnlVUkwoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUludGVyZmFjZUtleSgpIHsKLSAgICByZXR1cm4gdWRkaVNlckludF8uZ2V0U2VydmljZUludGVyZmFjZUtleSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmRjOTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgZG9jdW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50IGV4dGVuZHMgRmF2b3JpdGVzRm9sZGVyRWxlbWVudAotewotCi0gIHB1YmxpYyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBOb2RlTWFuYWdlciBub2RlTWFuYWdlcikgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsLCBub2RlTWFuYWdlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50KSB7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VzID0gZmF2TWFpbkVsZW1lbnQubG9hZFVERElTZXJ2aWNlSW50ZXJmYWNlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzW2ldOwotICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IGZhdlVERElTZXJJbnRFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCgoc2VydmljZS5nZXRTZXJ2aWNlTmFtZXMoKSlbMF0uZ2V0VGV4dCgpLCBnZXRNb2RlbCgpLCBzZXJ2aWNlKTsKLSAgICAgIGNvbm5lY3QoZmF2VURESVNlckludEVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gYWRkRmF2b3JpdGUoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIHNlckludE5hbWUgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgU3RyaW5nIGlucXVpcnlBUEkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfSU5RVUlSWV9BUEkpOwotICAgIFN0cmluZyBzZXJJbnRLZXkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfS0VZKTsKLSAgICBpZiAoc2VySW50TmFtZSA9PSBudWxsIHx8IGlucXVpcnlBUEkgPT0gbnVsbCB8fCBzZXJJbnRLZXkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgZSA9IGdldEZhdm9yaXRlKGlucXVpcnlBUEksIHNlckludEtleSk7Ci0gICAgaWYgKGUgIT0gbnVsbCkKLSAgICAgIHJlbW92ZUZhdm9yaXRlKGUpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBmYXZNYWluRWxlbWVudC5hZGRVRERJU2VydmljZUludGVyZmFjZShzZXJJbnROYW1lLCBpbnF1aXJ5QVBJLCBzZXJJbnRLZXkpOwotICAgIGJvb2xlYW4gc2F2ZWQgPSBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gICAgaWYgKHNhdmVkKSB7Ci0gICAgICBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgZmF2VURESVNlckludEVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KHNlckludE5hbWUsIGdldE1vZGVsKCksIHNlcnZpY2UpOwotICAgICAgY29ubmVjdChmYXZVRERJU2VySW50RWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNhdmVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIGlucXVpcnlBUEkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfSU5RVUlSWV9BUEkpOwotICAgIFN0cmluZyBzZXJJbnRLZXkgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfS0VZKTsKLSAgICBpZiAoaW5xdWlyeUFQSSA9PSBudWxsIHx8IHNlckludEtleSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAoZ2V0RmF2b3JpdGUoaW5xdWlyeUFQSSwgc2VySW50S2V5KSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUZhdm9yaXRlQnlOb2RlSUQoaW50IG5vZGVJRCxTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpCi0gICAgICByZXR1cm4gKHJlbW92ZUZhdm9yaXRlKChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KSAmJiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVGYXZvcml0ZShGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgZWxlbWVudCkgewotICAgIFNlcnZpY2Ugc2VydmljZSA9ICgoRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KWVsZW1lbnQpLmdldFNlcnZpY2UoKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgaWYgKGZhdk1haW5FbGVtZW50LnJlbW92ZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgIGVsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbEZhdm9yaXRlcyhTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBmYXZVRERJU2VySW50RWxlbWVudCA9IChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgU2VydmljZSBzZXJ2aWNlID0gZmF2VURESVNlckludEVsZW1lbnQuZ2V0U2VydmljZSgpOwotICAgICAgZmF2TWFpbkVsZW1lbnQucmVtb3ZlU2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0gICAgZGlzY29ubmVjdFJlbChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9OT0RFKTsKLSAgICByZXR1cm4gZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEFsbEZhdm9yaXRlcygpIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTk9ERSk7Ci0gIH0KLQotICBwcml2YXRlIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBnZXRGYXZvcml0ZShTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIHNlckludEtleSkgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNlckludEVsZW1lbnQgPSAoRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmIChpbnF1aXJ5QVBJLmVxdWFscyhzZXJJbnRFbGVtZW50LmdldElucXVpcnlVUkwoKSkgJiYKLSAgICAgICAgICAgc2VySW50S2V5LmVxdWFscyhzZXJJbnRFbGVtZW50LmdldFNlcnZpY2VJbnRlcmZhY2VLZXkoKSkpCi0gICAgICAgIHJldHVybiBzZXJJbnRFbGVtZW50OwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5OTkzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlcy5GYXZvcml0ZXNXU0RMOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC4qOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IGV4dGVuZHMgRmF2b3JpdGVzRWxlbWVudCB7Ci0KLSAgcHJpdmF0ZSBGYXZvcml0ZXNXU0RMIHdzZGxfOwotCi0gIHB1YmxpYyBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQoU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsLCBTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgd3NkbF8gPSBuZXcgRmF2b3JpdGVzV1NETCgpOwotICAgIHdzZGxfLnNldFNlcnZpY2Uoc2VydmljZSk7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgewotICAgIHJldHVybiB3c2RsXy5nZXRTZXJ2aWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdzZGxVcmwoKSB7Ci0gICAgcmV0dXJuIHdzZGxfLmdldFdzZGxVcmwoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIGdldFdzZGxVcmwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzV1NETFNlcnZpY2VGb2xkZXJFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyNjAwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLio7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlckVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNGb2xkZXJFbGVtZW50Ci17Ci0KLSAgcHVibGljIEZhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKSB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwsIG5vZGVNYW5hZ2VyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQpIHsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSBmYXZNYWluRWxlbWVudC5sb2FkV1NETFNlcnZpY2VzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gc2VydmljZXNbaV07Ci0gICAgICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgZmF2V1NETFNlcnZpY2VFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCgoc2VydmljZS5nZXREZXNjcmlwdGlvbnMoKSlbMF0uZ2V0TG9jYXRpb24oKSwgZ2V0TW9kZWwoKSwgc2VydmljZSk7Ci0gICAgICBjb25uZWN0KGZhdldTRExTZXJ2aWNlRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGFkZEZhdm9yaXRlKEhhc2h0YWJsZSB0YWJsZSkgewotICAgIFN0cmluZyB3c2RsVVJMID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9XU0RMX1VSTCk7Ci0gICAgaWYgKHdzZGxVUkwgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgZSA9IGdldEZhdm9yaXRlKHdzZGxVUkwpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgICByZW1vdmVGYXZvcml0ZShlKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gZmF2TWFpbkVsZW1lbnQuYWRkV1NETFNlcnZpY2Uod3NkbFVSTCk7Ci0gICAgYm9vbGVhbiBzYXZlZCA9IGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKTsKLSAgICBpZiAoc2F2ZWQpIHsKLSAgICAgIEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCBmYXZXU0RMU2VydmljZUVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KHdzZGxVUkwsIGdldE1vZGVsKCksIHNlcnZpY2UpOwotICAgICAgY29ubmVjdChmYXZXU0RMU2VydmljZUVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNhdmVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1dTRExfVVJMKTsKLSAgICBpZiAod3NkbFVSTCA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiAoZ2V0RmF2b3JpdGUod3NkbFVSTCkgIT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVGYXZvcml0ZUJ5Tm9kZUlEKGludCBub2RlSUQsU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEZhdm9yaXRlc01haW5FbGVtZW50IGZhdk1haW5FbGVtZW50ID0gZ2V0RmF2b3JpdGVzTWFpbkVsZW1lbnQoKTsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KQotICAgICAgcmV0dXJuIChyZW1vdmVGYXZvcml0ZSgoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkgJiYgZmF2TWFpbkVsZW1lbnQuc2F2ZUZhdm9yaXRlcygpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVGYXZvcml0ZShGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgZWxlbWVudCkgewotICAgIFNlcnZpY2Ugc2VydmljZSA9ICgoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KWVsZW1lbnQpLmdldFNlcnZpY2UoKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgaWYgKGZhdk1haW5FbGVtZW50LnJlbW92ZVNlcnZpY2Uoc2VydmljZSkpIHsKLSAgICAgIGVsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbEZhdm9yaXRlcyhTdHJpbmcgcGx1Z2luTWV0YWRhdGFEaXJlY3RvcnkpIHsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IGdldEFsbEZhdm9yaXRlcygpOwotICAgIHdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCBmYXZXU0RMU2VydmljZUVsZW1lbnQgPSAoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IGZhdldTRExTZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlKCk7Ci0gICAgICBmYXZNYWluRWxlbWVudC5yZW1vdmVTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLSAgICBkaXNjb25uZWN0UmVsKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfTk9ERSk7Ci0gICAgcmV0dXJuIGZhdk1haW5FbGVtZW50LnNhdmVGYXZvcml0ZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBbGxGYXZvcml0ZXMoKSB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfTk9ERSk7Ci0gIH0KLQotICBwcml2YXRlIEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCBnZXRGYXZvcml0ZShTdHJpbmcgd3NkbFVybCkgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IHdzZGxFbGVtZW50ID0gKEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBpZiAod3NkbFVybC5lcXVhbHMod3NkbEVsZW1lbnQuZ2V0V3NkbFVybCgpKSkKLSAgICAgICAgcmV0dXJuIHdzZGxFbGVtZW50OwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzV1NJTEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1dTSUxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NGI2ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9kYXRhbW9kZWwvRmF2b3JpdGVzV1NJTEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlcy5GYXZvcml0ZXNXU0lMOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC4qOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzV1NJTEVsZW1lbnQgZXh0ZW5kcyBGYXZvcml0ZXNFbGVtZW50IHsKLQotICBwcml2YXRlIEZhdm9yaXRlc1dTSUwgd3NpbF87Ci0KLSAgcHVibGljIEZhdm9yaXRlc1dTSUxFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTGluayBsaW5rKSB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHdzaWxfID0gbmV3IEZhdm9yaXRlc1dTSUwoKTsKLSAgICB3c2lsXy5zZXRMaW5rKGxpbmspOwotICB9Ci0KLSAgcHVibGljIExpbmsgZ2V0TGluaygpIHsKLSAgICByZXR1cm4gd3NpbF8uZ2V0TGluaygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVXJsKCkgewotICAgIHJldHVybiB3c2lsXy5nZXRXc2lsVXJsKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBnZXRXc2lsVXJsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL2RhdGFtb2RlbC9GYXZvcml0ZXNXU0lMRm9sZGVyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2QxMGMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvZGF0YW1vZGVsL0Zhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50IGV4dGVuZHMgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCB7Ci0KLSAgcHVibGljIEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCwgbm9kZU1hbmFnZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCkgewotICAgIExpbmtbXSBsaW5rcyA9IGZhdk1haW5FbGVtZW50LmxvYWRXU0lMcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIExpbmsgbGluayA9IGxpbmtzW2ldOwotICAgICAgRmF2b3JpdGVzV1NJTEVsZW1lbnQgZmF2V1NJTEVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzV1NJTEVsZW1lbnQobGluay5nZXRMb2NhdGlvbigpLCBnZXRNb2RlbCgpLCBsaW5rKTsKLSAgICAgIGNvbm5lY3QoZmF2V1NJTEVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gYWRkRmF2b3JpdGUoSGFzaHRhYmxlIHRhYmxlKSB7Ci0gICAgU3RyaW5nIHdzaWxVUkwgPSAoU3RyaW5nKXRhYmxlLmdldChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1dTSUxfVVJMKTsKLSAgICBpZiAod3NpbFVSTCA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZhdm9yaXRlc1dTSUxFbGVtZW50IGUgPSBnZXRGYXZvcml0ZSh3c2lsVVJMKTsKLSAgICBpZiAoZSAhPSBudWxsKQotICAgICAgcmVtb3ZlRmF2b3JpdGUoZSk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIExpbmsgbGluayA9IGZhdk1haW5FbGVtZW50LmFkZFdTSUxMaW5rKHdzaWxVUkwpOwotICAgIGJvb2xlYW4gc2F2ZWQgPSBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gICAgaWYgKHNhdmVkKSB7Ci0gICAgICBGYXZvcml0ZXNXU0lMRWxlbWVudCBmYXZXU0lMRWxlbWVudCA9IG5ldyBGYXZvcml0ZXNXU0lMRWxlbWVudCh3c2lsVVJMLCBnZXRNb2RlbCgpLCBsaW5rKTsKLSAgICAgIGNvbm5lY3QoZmF2V1NJTEVsZW1lbnQsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICAgIHJldHVybiBzYXZlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKEhhc2h0YWJsZSB0YWJsZSkgewotICAgIFN0cmluZyB3c2lsVVJMID0gKFN0cmluZyl0YWJsZS5nZXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9XU0lMX1VSTCk7Ci0gICAgaWYgKHdzaWxVUkwgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gKGdldEZhdm9yaXRlKHdzaWxVUkwpICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRmF2b3JpdGVCeU5vZGVJRChpbnQgbm9kZUlELFN0cmluZyBwbHVnaW5NZXRhZGF0YURpcmVjdG9yeSkgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBGYXZvcml0ZXNNYWluRWxlbWVudCBmYXZNYWluRWxlbWVudCA9IGdldEZhdm9yaXRlc01haW5FbGVtZW50KCk7Ci0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1dTSUxFbGVtZW50KQotICAgICAgcmV0dXJuIChyZW1vdmVGYXZvcml0ZSgoRmF2b3JpdGVzV1NJTEVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KSAmJiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVGYXZvcml0ZShGYXZvcml0ZXNXU0lMRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgTGluayBsaW5rID0gZWxlbWVudC5nZXRMaW5rKCk7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIGlmIChmYXZNYWluRWxlbWVudC5yZW1vdmVMaW5rKGxpbmspKSB7Ci0gICAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGxGYXZvcml0ZXMoU3RyaW5nIHBsdWdpbk1ldGFkYXRhRGlyZWN0b3J5KSB7Ci0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSBnZXRGYXZvcml0ZXNNYWluRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZShlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBGYXZvcml0ZXNXU0lMRWxlbWVudCBmYXZXU0lMRWxlbWVudCA9IChGYXZvcml0ZXNXU0lMRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBMaW5rIGxpbmsgPSBmYXZXU0lMRWxlbWVudC5nZXRMaW5rKCk7Ci0gICAgICBmYXZNYWluRWxlbWVudC5yZW1vdmVMaW5rKGxpbmspOwotICAgIH0KLSAgICBkaXNjb25uZWN0UmVsKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX05PREUpOwotICAgIHJldHVybiBmYXZNYWluRWxlbWVudC5zYXZlRmF2b3JpdGVzKCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QWxsRmF2b3JpdGVzKCkgewotICAgIHJldHVybiBnZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NJTF9OT0RFKTsKLSAgfQotCi0gIHByaXZhdGUgRmF2b3JpdGVzV1NJTEVsZW1lbnQgZ2V0RmF2b3JpdGUoU3RyaW5nIHdzaWxVcmwpIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0QWxsRmF2b3JpdGVzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgIEZhdm9yaXRlc1dTSUxFbGVtZW50IHdzaWxFbGVtZW50ID0gKEZhdm9yaXRlc1dTSUxFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmICh3c2lsVXJsLmVxdWFscyh3c2lsRWxlbWVudC5nZXRXc2lsVXJsKCkpKQotICAgICAgICByZXR1cm4gd3NpbEVsZW1lbnQ7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0FkZFRvVURESVBlcnNwZWN0aXZlVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9BZGRUb1VERElQZXJzcGVjdGl2ZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyMzY2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0FkZFRvVURESVBlcnNwZWN0aXZlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQWRkVG9VRERJUGVyc3BlY3RpdmVUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0KLSAgICBwdWJsaWMgQWRkVG9VRERJUGVyc3BlY3RpdmVUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fdWRkaV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIsICJmYXZvcml0ZXMvaW1hZ2VzL2FkZF90b191ZGRpX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9BZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiMzVkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0KLSAgICBwdWJsaWMgQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImZhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3dzaWxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiLCAiZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fd3NpbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBBZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3YzJiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCBleHRlbmRzIEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCB7Ci0KLSAgcHVibGljIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0ltcG9ydFRvRmlsZVN5c3RlbVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTEwOTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkltcG9ydFRvRmlsZVN5c3RlbVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtVG9vbCBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbVRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc0ltcG9ydFRvRmlsZVN5c3RlbVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCJmYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1MzM0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuSW1wb3J0VG9Xb3JrYmVuY2hUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoVG9vbCBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoVG9vbCB7Ci0KLSAgICBwdWJsaWMgRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hGb3JtLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTU0NjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sIGV4dGVuZHMgTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc01haW5Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc01haW5Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYmIyNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNNYWluTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLk1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNNYWluTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNNYWluTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCAxLCAiaW1hZ2VzL3Jvb3RfbWFpbi5naWYiKTsKLQotICAgICAgICAvLyBDcmVhdGUgVURESSBSZWdpc3RyeSBGb2xkZXIgTm9kZQotICAgICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50IGZhdlVERElSZWdpc3RyeUZvbGRlckVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudChnZXRNZXNzYWdlKCJGQVZPUklURVNfVURESV9SRUdJU1RSSUVTX0ZPTERFUl9OT0RFIiksIHRyZWVFbGVtZW50LmdldE1vZGVsKCksIG5vZGVNYW5hZ2VyKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuY29ubmVjdChmYXZVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9GT0xERVJfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyTm9kZSBmYXZVRERJUmVnaXN0cnlGb2xkZXJOb2RlID0gbmV3IEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlck5vZGUoZmF2VURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgYWRkQ2hpbGQoZmF2VURESVJlZ2lzdHJ5Rm9sZGVyTm9kZSk7Ci0gICAgICAgIGZhdlVERElSZWdpc3RyeUZvbGRlck5vZGUuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICAgICAgICBmYXZVRERJUmVnaXN0cnlGb2xkZXJFbGVtZW50LmluaXQoKEZhdm9yaXRlc01haW5FbGVtZW50KXRyZWVFbGVtZW50KTsKLQotICAgICAgICAvLyBDcmVhdGUgVURESSBCdXNpbmVzcyBGb2xkZXIgTm9kZQotICAgICAgICBGYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50IGZhdlVERElCdXNpbmVzc0ZvbGRlckVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudChnZXRNZXNzYWdlKCJGQVZPUklURVNfVURESV9CVVNJTkVTU0VTX0ZPTERFUl9OT0RFIiksIHRyZWVFbGVtZW50LmdldE1vZGVsKCksIG5vZGVNYW5hZ2VyKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuY29ubmVjdChmYXZVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9CVVNJTkVTU19GT0xERVJfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyTm9kZSBmYXZVRERJQnVzaW5lc3NGb2xkZXJOb2RlID0gbmV3IEZhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlck5vZGUoZmF2VURESUJ1c2luZXNzRm9sZGVyRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgYWRkQ2hpbGQoZmF2VURESUJ1c2luZXNzRm9sZGVyTm9kZSk7Ci0gICAgICAgIGZhdlVERElCdXNpbmVzc0ZvbGRlck5vZGUuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICAgICAgICBmYXZVRERJQnVzaW5lc3NGb2xkZXJFbGVtZW50LmluaXQoKEZhdm9yaXRlc01haW5FbGVtZW50KXRyZWVFbGVtZW50KTsKLQotICAgICAgICAvLyBDcmVhdGUgVURESSBTZXJ2aWNlIEZvbGRlciBOb2RlCi0gICAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudCBmYXZVRERJU2VydmljZUZvbGRlckVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJFbGVtZW50KGdldE1lc3NhZ2UoIkZBVk9SSVRFU19VRERJX1NFUlZJQ0VfRk9MREVSX05PREUiKSwgdHJlZUVsZW1lbnQuZ2V0TW9kZWwoKSwgbm9kZU1hbmFnZXIpOwotICAgICAgICB0cmVlRWxlbWVudC5jb25uZWN0KGZhdlVERElTZXJ2aWNlRm9sZGVyRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9GT0xERVJfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJOb2RlIGZhdlVERElTZXJ2aWNlRm9sZGVyTm9kZSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUZvbGRlck5vZGUoZmF2VURESVNlcnZpY2VGb2xkZXJFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoXyArIDEpOwotICAgICAgICBhZGRDaGlsZChmYXZVRERJU2VydmljZUZvbGRlck5vZGUpOwotICAgICAgICBmYXZVRERJU2VydmljZUZvbGRlck5vZGUuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICAgICAgICBmYXZVRERJU2VydmljZUZvbGRlckVsZW1lbnQuaW5pdCgoRmF2b3JpdGVzTWFpbkVsZW1lbnQpdHJlZUVsZW1lbnQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBVRERJIFNlcnZpY2UgSW50ZXJmYWNlIEZvbGRlciBOb2RlCi0gICAgICAgIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyRWxlbWVudCBmYXZVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50KGdldE1lc3NhZ2UoIkZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERSIpLCB0cmVlRWxlbWVudC5nZXRNb2RlbCgpLCBub2RlTWFuYWdlcik7Ci0gICAgICAgIHRyZWVFbGVtZW50LmNvbm5lY3QoZmF2VURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9GT0xERVJfTk9ERSwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJOb2RlIGZhdlVERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyTm9kZSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUoZmF2VURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoXyArIDEpOwotICAgICAgICBhZGRDaGlsZChmYXZVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUpOwotICAgICAgICBmYXZVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUuc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICAgICAgICBmYXZVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQuaW5pdCgoRmF2b3JpdGVzTWFpbkVsZW1lbnQpdHJlZUVsZW1lbnQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBXU0lMIEZvbGRlciBOb2RlCi0gICAgICAgIEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50IGZhdldTSUxGb2xkZXJFbGVtZW50ID0gbmV3IEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50KGdldE1lc3NhZ2UoIkZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFIiksIHRyZWVFbGVtZW50LmdldE1vZGVsKCksIG5vZGVNYW5hZ2VyKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuY29ubmVjdChmYXZXU0lMRm9sZGVyRWxlbWVudCwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfRk9MREVSX05PREUsIE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgICAgIEZhdm9yaXRlc1dTSUxGb2xkZXJOb2RlIGZhdldTSUxGb2xkZXJOb2RlID0gbmV3IEZhdm9yaXRlc1dTSUxGb2xkZXJOb2RlKGZhdldTSUxGb2xkZXJFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoXyArIDEpOwotICAgICAgICBhZGRDaGlsZChmYXZXU0lMRm9sZGVyTm9kZSk7Ci0gICAgICAgIGZhdldTSUxGb2xkZXJOb2RlLnNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGZhbHNlKTsKLSAgICAgICAgZmF2V1NJTEZvbGRlckVsZW1lbnQuaW5pdCgoRmF2b3JpdGVzTWFpbkVsZW1lbnQpdHJlZUVsZW1lbnQpOwotCi0gICAgICAgIC8vIENyZWF0ZSBXU0RMIFNlcnZpY2UgRm9sZGVyIE5vZGUKLSAgICAgICAgRmF2b3JpdGVzV1NETFNlcnZpY2VGb2xkZXJFbGVtZW50IGZhdldTRExTZXJ2aWNlRm9sZGVyRWxlbWVudCA9IG5ldyBGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlckVsZW1lbnQoZ2V0TWVzc2FnZSgiRkFWT1JJVEVTX1dTRExfU0VSVklDRV9GT0xERVJfTk9ERSIpLCB0cmVlRWxlbWVudC5nZXRNb2RlbCgpLCBub2RlTWFuYWdlcik7Ci0gICAgICAgIHRyZWVFbGVtZW50LmNvbm5lY3QoZmF2V1NETFNlcnZpY2VGb2xkZXJFbGVtZW50LCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgICAgICBGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlck5vZGUgZmF2V1NETFNlcnZpY2VGb2xkZXJOb2RlID0gbmV3IEZhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyTm9kZShmYXZXU0RMU2VydmljZUZvbGRlckVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgIGFkZENoaWxkKGZhdldTRExTZXJ2aWNlRm9sZGVyTm9kZSk7Ci0gICAgICAgIGZhdldTRExTZXJ2aWNlRm9sZGVyTm9kZS5zZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbihmYWxzZSk7Ci0gICAgICAgIGZhdldTRExTZXJ2aWNlRm9sZGVyRWxlbWVudC5pbml0KChGYXZvcml0ZXNNYWluRWxlbWVudCl0cmVlRWxlbWVudCk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbXNnKSB7Ci0gICAgICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICByZXR1cm4gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZShtc2cpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNOYXZpZ2F0b3JGb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc05hdmlnYXRvckZvbGRlck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmOWQ3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc05hdmlnYXRvckZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9sZGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGYXZvcml0ZXNOYXZpZ2F0b3JGb2xkZXJOb2RlIGV4dGVuZHMgRm9sZGVyTm9kZSB7Ci0KLSAgICBwdWJsaWMgRmF2b3JpdGVzTmF2aWdhdG9yRm9sZGVyTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKSB7Ci0gICAgICAgIHJldHVybiBGYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxpc09wZW5fKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCkgewotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8sIGZhbHNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzTmF2aWdhdG9yTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNOYXZpZ2F0b3JOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzM2ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNOYXZpZ2F0b3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkZhdm9yaXRlc1RvZ2dsZU5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmF2b3JpdGVzTmF2aWdhdG9yTm9kZSBleHRlbmRzIE5vZGUgewotCi0gICAgcHVibGljIEZhdm9yaXRlc05hdmlnYXRvck5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoLCBTdHJpbmcgaW1hZ2VQYXRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCBpbWFnZVBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKSB7Ci0gICAgICAgIHJldHVybiBGYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxpc09wZW5fKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCkgewotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8sIGZhbHNlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzUGVyc3BlY3RpdmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmOGRiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc01haW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC4qOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZXh0ZW5kcyBQZXJzcGVjdGl2ZQotewotICAgIHByaXZhdGUgQmFzaWNNb2RlbCBtb2RlbF87Ci0gICAgcHJpdmF0ZSBOb2RlTWFuYWdlciBub2RlTWFuYWdlcl87Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgICBwcml2YXRlIFN0cmluZyBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNQZXJzcGVjdGl2ZShDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gICAgewotICAgICAgICBzdXBlcigiZmF2b3JpdGVzIixjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0UGVyc3BlY3RpdmUoU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gICAgewotICAgICAgICBtb2RlbF8gPSBuZXcgQmFzaWNNb2RlbCgiRmF2b3JpdGVzTW9kZWwiKTsKLSAgICAgICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2b3JpdGVzTWFpbkVsZW1lbnQgPSBuZXcgRmF2b3JpdGVzTWFpbkVsZW1lbnQoZ2V0TWVzc2FnZSgiRkFWT1JJVEVTX01BSU5fTk9ERSIpLCBtb2RlbF8sIGNvbnRyb2xsZXJfKTsKLSAgICAgICAgbW9kZWxfLnNldFJvb3RFbGVtZW50KGZhdm9yaXRlc01haW5FbGVtZW50KTsKLSAgICAgICAgbm9kZU1hbmFnZXJfID0gbmV3IE5vZGVNYW5hZ2VyKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgRmF2b3JpdGVzTWFpbk5vZGUgZmF2TWFpbk5vZGUgPSBuZXcgRmF2b3JpdGVzTWFpbk5vZGUoZmF2b3JpdGVzTWFpbkVsZW1lbnQsIG5vZGVNYW5hZ2VyXyk7Ci0gICAgICAgIG5vZGVNYW5hZ2VyXy5zZXRSb290Tm9kZShmYXZNYWluTm9kZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTdGFydGluZyBmcmFtZXNldCBzaXplcy4KLSAgICAgICAgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9ICIzMCUsKiI7Ci0gICAgICAgIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9IHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gICAgICAgIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gIjc1JSwqIjsKLSAgICAgICAgc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOyAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIE5vZGVNYW5hZ2VyIGdldE5vZGVNYW5hZ2VyKCkgewotICAgICAgICByZXR1cm4gbm9kZU1hbmFnZXJfOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGVyc3BlY3RpdmVDb250ZW50UGFnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy9mYXZfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX0ZBVk9SSVRFUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhbmVzRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuICJmYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NGcmFtZXNldHNGb3JtKCkKLSAgICB7Ci0gICAgICByZXR1cm4gImZhdm9yaXRlcy9mb3Jtcy9Qcm9jZXNzRmF2b3JpdGVzRnJhbWVzZXRzRm9ybS5qc3AiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZyYW1lc2V0c0ZpbGUoKQotICAgIHsKLSAgICAgIHJldHVybiAiZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzZnJhbWVzZXRzLmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpIHsKLSAgICAgICAgcmV0dXJuICJmYXZOYXZpZ2F0b3JDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkgewotICAgICAgICByZXR1cm4gImZhdlByb3BlcnRpZXNDb250YWluZXIiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpIHsKLSAgICAgICAgcmV0dXJuICJmYXZTdGF0dXNDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy9mYXZfc3RhdHVzX2NvbnRlbnQuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250ZW50VmFyKCkgewotICAgICAgICByZXR1cm4gImZhdlByb3BlcnRpZXNDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGVudC5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKFN0cmluZyBjb2xzKQotICAgIHsKLSAgICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhTdHJpbmcgY29scykKLSAgICB7Ci0gICAgICBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKQotICAgIHsKLSAgICAgIHJldHVybiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhTdHJpbmcgcm93cykKLSAgICB7Ci0gICAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IHJvd3M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKFN0cmluZyByb3dzKQotICAgIHsKLSAgICAgIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSByb3dzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN3aXRjaFBlcnNwZWN0aXZlRm9ybUFjdGlvbkxpbmsoaW50IHRhcmdldFBlcnNwZWN0aXZlSWQsYm9vbGVhbiBmb3JIaXN0b3J5KQotICAgIHsKLSAgICAgIHJldHVybiBTd2l0Y2hQZXJzcGVjdGl2ZUZyb21GYXZvcml0ZXNBY3Rpb24uZ2V0Rm9ybUFjdGlvbkxpbmsodGFyZ2V0UGVyc3BlY3RpdmVJZCxmb3JIaXN0b3J5KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwNDA4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIEZhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNTZXREZWZhdWx0Vmlld1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzU2V0RGVmYXVsdFZpZXdUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZmQ0MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNTZXREZWZhdWx0Vmlld1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNldERlZmF1bHRWaWV3VG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNTZXREZWZhdWx0Vmlld1Rvb2wgZXh0ZW5kcyBTZXREZWZhdWx0Vmlld1Rvb2wgewotICAgIHB1YmxpYyBGYXZvcml0ZXNTZXREZWZhdWx0Vmlld1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxULCBBY3Rpb25JbnB1dHMuVklFV1RPT0xJRF9ERUZBVUxULCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCwgQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCwgZmFsc2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESUJ1c2luZXNzRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESUJ1c2luZXNzRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5YTJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9kZXRhaWxzX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgICB7Ci0gICAgICByZXR1cm4gImZhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTRlYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJQnVzaW5lc3NGb2xkZXJOb2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yRm9sZGVyTm9kZSB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlck5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbC5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfQlVTSU5FU1NfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESUJ1c2luZXNzTm9kZSBmYXZvcml0ZXNVRERJQnVzaW5lc3NOb2RlID0gbmV3IEZhdm9yaXRlc1VERElCdXNpbmVzc05vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENoaWxkKGZhdm9yaXRlc1VERElCdXNpbmVzc05vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBMaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTUyIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElCdXNpbmVzc05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESUJ1c2luZXNzTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzZmNmIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESUJ1c2luZXNzTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJQnVzaW5lc3NOb2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yTm9kZSB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1VERElCdXNpbmVzc05vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCAiZmF2b3JpdGVzL2ltYWdlcy91ZGRpX2J1c2luZXNzX25vZGUuZ2lmIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IEZhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19VRERJX0JVU0lORVNTX0RFVEFJTFMiKSk7Ci0gICAgICAgIG5ldyBBZGRUb1VERElQZXJzcGVjdGl2ZVRvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJUmVnaXN0cnlEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJUmVnaXN0cnlEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTc5OTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICAgIHsKLSAgICAgIHJldHVybiAiZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmYzdiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvckZvbGRlck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNVRERJUmVnaXN0cnlGb2xkZXJOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCkgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCk7Ci0gICAgICAgIHRyZWVFbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWwuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVFbGVtZW50IHJlZ0VsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW1hZ2VQYXRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgY2F0ZWdvcmllc0RpcmVjdG9yeSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudC5mb3JtQ2F0ZWdvcmllc0RpcmVjdG9yeShjYXRlZ29yaWVzRGlyZWN0b3J5LG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0U2VydmxldEVuZ2luZVN0YXRlTG9jYXRpb24oKSxyZWdFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgY2F0ZWdvcnlEaXJlY3RvcnlGaWxlID0gbmV3IEZpbGUoY2F0ZWdvcmllc0RpcmVjdG9yeS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gY2F0ZWdvcnlGaWxlcyA9IGNhdGVnb3J5RGlyZWN0b3J5RmlsZS5saXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeUZpbGVzICE9IG51bGwgJiYgY2F0ZWdvcnlGaWxlcy5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUGF0aCA9ICJmYXZvcml0ZXMvaW1hZ2VzL3VkZGlfcmVnaXN0cnlfY2F0X25vZGUuZ2lmIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUGF0aCA9ICJmYXZvcml0ZXMvaW1hZ2VzL3VkZGlfcmVnaXN0cnlfbm9kZS5naWYiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlOb2RlIGZhdm9yaXRlc1VERElSZWdpc3RyeU5vZGUgPSBuZXcgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Tm9kZShyZWdFbGVtZW50LCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxLCBpbWFnZVBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDaGlsZChmYXZvcml0ZXNVRERJUmVnaXN0cnlOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0T3V0Qm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkTm9kZShjaGlsZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUlkiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJUmVnaXN0cnlOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElSZWdpc3RyeU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmZGQ3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElSZWdpc3RyeU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Tm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNVRERJUmVnaXN0cnlOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCxTdHJpbmcgaW1hZ2VQYXRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCBpbWFnZVBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBGYXZvcml0ZXNVRERJUmVnaXN0cnlEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfVURESV9SRUdJU1RSWV9ERVRBSUxTIikpOwotICAgICAgICBuZXcgQWRkVG9VRERJUGVyc3BlY3RpdmVUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9UT19VRERJX1BFUlNQRUNUSVZFIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGJmNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotCi0gICAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2I3MjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNVRERJU2VydmljZUZvbGRlck5vZGUgZXh0ZW5kcyBGYXZvcml0ZXNOYXZpZ2F0b3JGb2xkZXJOb2RlIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzVURESVNlcnZpY2VGb2xkZXJOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCkgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCk7Ci0gICAgICAgIHRyZWVFbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWwuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VOb2RlIGZhdm9yaXRlc1VERElTZXJ2aWNlTm9kZSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZU5vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENoaWxkKGZhdm9yaXRlc1VERElTZXJ2aWNlTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpIHsKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBMaXN0RmF2b3JpdGVVRERJU2VydmljZVRvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0UiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZURldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxOGRmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0KLSAgICBwdWJsaWMgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9kZXRhaWxzX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgICB7Ci0gICAgICByZXR1cm4gImZhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJU2VydmljZUludERldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VGb2xkZXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzAwMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRm9sZGVyTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvckZvbGRlck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlck5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbC5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VOb2RlIGZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlTm9kZSA9IG5ldyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZU5vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENoaWxkKGZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IExpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0UiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Nzk5MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VOb2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yTm9kZSB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgsICJmYXZvcml0ZXMvaW1hZ2VzL3VkZGlfc2VydmljZV9pbnRlcmZhY2Vfbm9kZS5naWYiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTIikpOwotICAgICAgICBuZXcgQWRkVG9VRERJUGVyc3BlY3RpdmVUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9UT19VRERJX1BFUlNQRUNUSVZFIikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1VERElTZXJ2aWNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQwMjQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzVURESVNlcnZpY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1VERElTZXJ2aWNlTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNVRERJU2VydmljZU5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCAiZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3NlcnZpY2Vfbm9kZS5naWYiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0RFVEFJTFMiKSk7Ci0gICAgICAgIG5ldyBBZGRUb1VERElQZXJzcGVjdGl2ZVRvb2wodG9vbE1hbmFnZXJfLCBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NETERldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDlmNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTRExEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNXU0RMRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NETERldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NETFNlcnZpY2VGb2xkZXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmI2NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvckZvbGRlck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNXU0RMU2VydmljZUZvbGRlck5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbC5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9OT0RFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXZvcml0ZXNXU0RMU2VydmljZU5vZGUgZmF2b3JpdGVzV1NETFNlcnZpY2VOb2RlID0gbmV3IEZhdm9yaXRlc1dTRExTZXJ2aWNlTm9kZSgoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpLCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2hpbGQoZmF2b3JpdGVzV1NETFNlcnZpY2VOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVlRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IExpc3RGYXZvcml0ZVdTRExTZXJ2aWNlVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX0ZBVk9SSVRFX1dTRExfU0VSVklDRSIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1dTRExTZXJ2aWNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0RMU2VydmljZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjM2MxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1dTRExTZXJ2aWNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0RMU2VydmljZU5vZGUgZXh0ZW5kcyBGYXZvcml0ZXNOYXZpZ2F0b3JOb2RlIHsKLSAgICBwdWJsaWMgRmF2b3JpdGVzV1NETFNlcnZpY2VOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCkgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCwgImZhdm9yaXRlcy9pbWFnZXMvd3NkbF9zZXJ2aWNlX25vZGUuZ2lmIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpOwotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IEZhdm9yaXRlc1dTRExEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfV1NETF9ERVRBSUxTIikpOwotICAgICAgICBuZXcgRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hUb29sKHRvb2xNYW5hZ2VyXywgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIikpOwotICAgICAgICBuZXcgRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtVG9vbCh0b29sTWFuYWdlcl8sIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1dTRExfSU1QT1JUX1RPX0ZTIikpOwotICAgICAgICBuZXcgRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wodG9vbE1hbmFnZXJfLCBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9MQVVOQ0hfV0VCX1NFUlZJQ0VfV0laQVJEIikpOwotICAgICAgICBuZXcgRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NJTERldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTVhYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTSUxEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICAgIHB1YmxpYyBGYXZvcml0ZXNXU0lMRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJmYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NJTERldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMRm9sZGVyTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMRm9sZGVyTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTM4YzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvRmF2b3JpdGVzV1NJTEZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhdm9yaXRlc1dTSUxGb2xkZXJOb2RlIGV4dGVuZHMgRmF2b3JpdGVzTmF2aWdhdG9yRm9sZGVyTm9kZSB7Ci0gICAgcHVibGljIEZhdm9yaXRlc1dTSUxGb2xkZXJOb2RlKFRyZWVFbGVtZW50IHRyZWVFbGVtZW50LCBOb2RlTWFuYWdlciBub2RlTWFuYWdlciwgaW50IG5vZGVEZXB0aCkgewotICAgICAgICBzdXBlcih0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXIsIG5vZGVEZXB0aCk7Ci0gICAgICAgIHRyZWVFbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWwuZXF1YWxzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX05PREUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhdm9yaXRlc1dTSUxOb2RlIGZhdm9yaXRlc1dTSUxOb2RlID0gbmV3IEZhdm9yaXRlc1dTSUxOb2RlKChUcmVlRWxlbWVudClldmVudC5nZXRQYXJlbnRFbGVtZW50KCksIG5vZGVNYW5hZ2VyXywgbm9kZURlcHRoXyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRDaGlsZChmYXZvcml0ZXNXU0lMTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfTk9ERSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdFRvb2xzKCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgbmV3IExpc3RGYXZvcml0ZVdTSUxUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfV1NJTCIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1dTSUxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0Zhdm9yaXRlc1dTSUxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTMyZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9GYXZvcml0ZXNXU0lMTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBGYXZvcml0ZXNXU0lMTm9kZSBleHRlbmRzIEZhdm9yaXRlc05hdmlnYXRvck5vZGUgewotICAgIHB1YmxpYyBGYXZvcml0ZXNXU0lMTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlRGVwdGgpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCBub2RlRGVwdGgsICJmYXZvcml0ZXMvaW1hZ2VzL3dzaWxfbm9kZS5naWYiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgRmF2b3JpdGVzV1NJTERldGFpbHNUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19XU0lMX0RFVEFJTFMiKSk7Ci0gICAgICAgIG5ldyBBZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVUb29sKHRvb2xNYW5hZ2VyXywgZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkUiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0xpc3RGYXZvcml0ZVVERElCdXNpbmVzc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxZmNlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0xpc3RGYXZvcml0ZVVERElCdXNpbmVzc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVVERElCdXNpbmVzc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIExpc3RGYXZvcml0ZVVERElCdXNpbmVzc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfZW5hYmxlZC5naWYiLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NWaWV3LmpzcCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0xpc3RGYXZvcml0ZVVERElSZWdpc3RyeVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjAxNmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLSAgICBwdWJsaWMgTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5VG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9yZWdpc3RyeV9lbmFibGVkLmdpZiIsICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElSZWdpc3RyeVZpZXcuanNwIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL0xpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDIzM2Y1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZVRvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIExpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2ludGVyZmFjZV9lbmFibGVkLmdpZiIsICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVmlldy5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVVRERJU2VydmljZVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzJiZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVVRERJU2VydmljZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVVERElTZXJ2aWNlVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLSAgICBwdWJsaWMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfZW5hYmxlZC5naWYiLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElTZXJ2aWNlVmlldy5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVXU0RMU2VydmljZVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlV1NETFNlcnZpY2VUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNWUyYzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVXU0RMU2VydmljZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVdTRExTZXJ2aWNlVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLSAgICBwdWJsaWMgTGlzdEZhdm9yaXRlV1NETFNlcnZpY2VUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfZW5hYmxlZC5naWYiLCAiZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAiZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVdTRExTZXJ2aWNlVmlldy5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVXU0lMVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9MaXN0RmF2b3JpdGVXU0lMVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGU4M2YxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9mYXZvcml0ZXMvcGVyc3BlY3RpdmUvTGlzdEZhdm9yaXRlV1NJTFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlNlbGVjdEZhdm9yaXRlc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIExpc3RGYXZvcml0ZVdTSUxUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotICAgIHB1YmxpYyBMaXN0RmF2b3JpdGVXU0lMVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2VuYWJsZWQuZ2lmIiwgImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gImZhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVXU0lMVmlldy5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL2Zhdm9yaXRlcy9wZXJzcGVjdGl2ZS9SZW1vdmVGYXZvcml0ZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL1JlbW92ZUZhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0YTZlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vZmF2b3JpdGVzL3BlcnNwZWN0aXZlL1JlbW92ZUZhdm9yaXRlc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLlJlbW92ZUZhdm9yaXRlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVGYXZvcml0ZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0KLSAgICBwdWJsaWMgUmVtb3ZlRmF2b3JpdGVzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIsICJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0FjdGlvblRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9BY3Rpb25Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMTIzMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0FjdGlvblRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25Ub29sIGV4dGVuZHMgVG9vbAotewotICBwdWJsaWMgQWN0aW9uVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgZW5hYmxlZEltYWdlTGluayxTdHJpbmcgaGlnaGxpZ2h0ZWRJbWFnZUxpbmssU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGVuYWJsZWRJbWFnZUxpbmssaGlnaGxpZ2h0ZWRJbWFnZUxpbmssYWx0LFRvb2xUeXBlcy5BQ1RJT04pOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0FkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjgyYTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9BZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sCi17Ci0gIHB1YmxpYyBBZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCJpbWFnZXMvYWRkX3RvX3dzZGxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiLCJpbWFnZXMvYWRkX3RvX3dzZGxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIixhbHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvQnJlYWRDcnVtYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0JyZWFkQ3J1bWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyMTFkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvQnJlYWRDcnVtYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotLy8gQSBjbGFzcyB1c2VkIHRvIHJlcHJlc2VudCBhIGJyb3dlciBicmVhZGNydW1iLiBFYWNoIGJyZWFkY3J1bWIgZW5jYXBzdWxhdGVzCi0vLyBhIG5hdmlnYXRlZCBVUkwuCi1wdWJsaWMgY2xhc3MgQnJlYWRDcnVtYgotewotICBwcml2YXRlIGludCBwZXJzcGVjdGl2ZUlkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgdXJsXzsKLQotICBwdWJsaWMgQnJlYWRDcnVtYihpbnQgcGVyc3BlY3RpdmVJZCxTdHJpbmcgdXJsKQotICB7Ci0gICAgcGVyc3BlY3RpdmVJZF8gPSBwZXJzcGVjdGl2ZUlkOwotICAgIHVybF8gPSB1cmw7Ci0gIH0KLQotICAvKioKLSAgKiBHZXQgdGhlIFVSTCBhc3NvY2lhdGVkIHdpdGggdGhpcyBicmVhZGNydW1iLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBVUkwuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkKLSAgewotICAgIHJldHVybiB1cmxfOwotICB9Ci0KLSAgLyoqCi0gICogR2V0IHRoZSBJRCBvZiB0aGUgcGVyc3BlY3RpdmUgd2hlcmUgdGhpcyBicmVhZGNydW1iIGJlbG9uZ3MuCi0gICogQHJldHVybiBpbnQgVGhlIHBlcnNwZWN0aXZlSUQgYXMgZGVmaW5lZCBpbiBBY3Rpb25JbnB1dHMuCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVJZF87Ci0gIH0KLQotICAvKioKLSAgKiBUZXN0IGVxdWFsaXR5IGJldHdlZW4gdGhpcyBicmVhZGNydW1iIGFuZCBhbm90aGVyLiBCb3RoIHRoZSBVUkxzIGFuZCBwZXJzcGVjdGl2ZQotICAqIElEcyBtdXN0IGJlIGVxdWFsIGZvciB0d28gYnJlYWRjcnVtYnMgdG8gYmUgZXF1YWwuCi0gICogQHBhcmFtIEJyZWFkQ3J1bWIgQSBicmVhZGNydW1iLgotICAqIEByZXR1cm4gYm9vbGVhbiBUaGUgcmVzdWx0IG9mIHRoZSBlcXVhbGl0eSB0ZXN0LgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoQnJlYWRDcnVtYiBiKQotICB7Ci0gICAgcmV0dXJuICgodXJsXy5lcXVhbHMoYi5nZXRVUkwoKSkpICYmIChwZXJzcGVjdGl2ZUlkXyA9PSBiLmdldFBlcnNwZWN0aXZlSWQoKSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvQ29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0NvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1YmNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25FbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC4qOwotCi1wdWJsaWMgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIE1lc3NhZ2VQcm92aWRlcgotewotICBwcml2YXRlIFN0cmluZyBzZXNzaW9uSWRfOwotICBwcml2YXRlIFN0cmluZyBzdGF0ZUxvY2F0aW9uXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dFBhdGhfOwotICBwcml2YXRlIGludCBoaXN0b3J5RGlyZWN0aW9uXzsKLSAgcHJpdmF0ZSBIaXN0b3J5IGhpc3RvcnlfOwotICBwcml2YXRlIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmVfOwotICBwcml2YXRlIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmVfOwotICBwcml2YXRlIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmVfOwotICBwcml2YXRlIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlXzsKLSAgcHJpdmF0ZSBQZXJzcGVjdGl2ZSBjdXJyZW50UGVyc3BlY3RpdmVfOwotICBwcml2YXRlIGJvb2xlYW4gaXNQZXJzcGVjdGl2ZUNvbnRlbnRCbGFua187Ci0gIHByaXZhdGUgQWN0aW9uRW5naW5lIGFjdGlvbkVuZ2luZTsKLSAgCi0gIC8vIFdTREwgQnJvd3NlcgotICBwcml2YXRlIGludCB3c2RsVHlwZV87Ci0KLSAgcHVibGljIENvbnRyb2xsZXIoKQotICB7Ci0gICAgc3VwZXIoImV4cGxvcmVyIik7Ci0gICAgY29udGV4dFBhdGhfID0gbnVsbDsKLQlzdGF0ZUxvY2F0aW9uXyA9IG51bGw7Ci0gICAgaGlzdG9yeV8gPSBuZXcgSGlzdG9yeSgpOwotICAgIHVkZGlQZXJzcGVjdGl2ZV8gPSBuZXcgVURESVBlcnNwZWN0aXZlKHRoaXMpOwotICAgIHdzaWxQZXJzcGVjdGl2ZV8gPSBuZXcgV1NJTFBlcnNwZWN0aXZlKHRoaXMpOwotICAgIHdzZGxQZXJzcGVjdGl2ZV8gPSBuZXcgV1NETFBlcnNwZWN0aXZlKHRoaXMpOwotICAgIGZhdm9yaXRlc1BlcnNwZWN0aXZlXyA9IG5ldyBGYXZvcml0ZXNQZXJzcGVjdGl2ZSh0aGlzKTsKLSAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcGVyc3BlY3RpdmUgdG8gVURESS4KLSAgICBjdXJyZW50UGVyc3BlY3RpdmVfID0gdWRkaVBlcnNwZWN0aXZlXzsKLSAgICBoaXN0b3J5RGlyZWN0aW9uXyA9IEFjdGlvbklucHV0cy5KVU1QX0JBQ0s7Ci0gICAgd3NkbFR5cGVfID0gQWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRTsKLSAgICBpc1BlcnNwZWN0aXZlQ29udGVudEJsYW5rXyA9IHRydWU7Ci0gICAgYWN0aW9uRW5naW5lID0gbmV3IEFjdGlvbkVuZ2luZSh0aGlzKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0U3RhdGVMb2NhdGlvbihTdHJpbmcgc3RhdGVMb2NhdGlvbikKLSAgewotCXN0YXRlTG9jYXRpb25fID0gc3RhdGVMb2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbihTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKQotICB7Ci0JICBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb25fID0gZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uOwotICB9Ci0gIAotICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBDb250cm9sbGVyIGJlYW4gaXMgaW5zdGFudGlhdGVkLgotICBwcml2YXRlIGZpbmFsIHZvaWQgc2V0Q29udGV4dFBhdGgoU3RyaW5nIGNvbnRleHRQYXRoKQotICB7Ci0gICAgaWYgKGNvbnRleHRQYXRoXyA9PSBudWxsKQotICAgICAgY29udGV4dFBhdGhfID0gY29udGV4dFBhdGg7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGF0aFdpdGhDb250ZXh0KFN0cmluZyByZWxhdGl2ZVBhdGgpCi0gIHsKLSAgICBpZiAocmVsYXRpdmVQYXRoID09IG51bGwpCi0gICAgICByZXR1cm4gcmVsYXRpdmVQYXRoOwotICAgIFN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcihyZWxhdGl2ZVBhdGgpOwotICAgIGlmIChjb250ZXh0UGF0aF8gIT0gbnVsbCkKLSAgICAgIHBhdGguaW5zZXJ0KDAsJy8nKS5pbnNlcnQoMCxjb250ZXh0UGF0aF8pOwotICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNlc3Npb25JZCgpCi0gIHsKLSAgICByZXR1cm4gc2Vzc2lvbklkXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb250ZXh0UGF0aCgpCi0gIHsKLSAgICByZXR1cm4gY29udGV4dFBhdGhfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkgewotCXJldHVybiBzdGF0ZUxvY2F0aW9uXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24gKCkgewotCXJldHVybiBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb25fOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBpbml0KFN0cmluZyBzZXNzaW9uSWQsU2VydmxldENvbnRleHQgYXBwbGljYXRpb24sU3RyaW5nIGNvbnRleHRQYXRoKQotICB7Ci0gICAgc2Vzc2lvbklkXyA9IHNlc3Npb25JZDsKLSAgICBzZXRDb250ZXh0UGF0aChjb250ZXh0UGF0aCk7Ci0gICAgdWRkaVBlcnNwZWN0aXZlXy5pbml0UGVyc3BlY3RpdmUoYXBwbGljYXRpb24pOwotICAgIHdzaWxQZXJzcGVjdGl2ZV8uaW5pdFBlcnNwZWN0aXZlKGFwcGxpY2F0aW9uKTsKLSAgICB3c2RsUGVyc3BlY3RpdmVfLmluaXRQZXJzcGVjdGl2ZShhcHBsaWNhdGlvbik7Ci0gICAgZmF2b3JpdGVzUGVyc3BlY3RpdmVfLmluaXRQZXJzcGVjdGl2ZShhcHBsaWNhdGlvbik7Ci0gIH0KLQotICAvLyBTZXR0ZXIgZm9yIHRoZSBjdXJyZW50IHBlcnNwZWN0aXZlLgotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDdXJyZW50UGVyc3BlY3RpdmUoaW50IHBlcnNwZWN0aXZlKQotICB7Ci0gICAgc3dpdGNoIChwZXJzcGVjdGl2ZSkKLSAgICB7Ci0gICAgICBjYXNlIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJOgotICAgICAgICBjdXJyZW50UGVyc3BlY3RpdmVfID0gdWRkaVBlcnNwZWN0aXZlXzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0lMOgotICAgICAgICBjdXJyZW50UGVyc3BlY3RpdmVfID0gd3NpbFBlcnNwZWN0aXZlXzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0RMOgotICAgICAgICBjdXJyZW50UGVyc3BlY3RpdmVfID0gd3NkbFBlcnNwZWN0aXZlXzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9GQVZPUklURVM6Ci0gICAgICAgIGN1cnJlbnRQZXJzcGVjdGl2ZV8gPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZV87Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIEdldHRlciBmb3IgdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUuCi0gIHB1YmxpYyBmaW5hbCBQZXJzcGVjdGl2ZSBnZXRDdXJyZW50UGVyc3BlY3RpdmUoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRQZXJzcGVjdGl2ZV87Ci0gIH0KLQotICAvLyBHZXR0ZXIgZm9yIHRoZSBVRERJIHBlcnNwZWN0aXZlLgotICBwdWJsaWMgZmluYWwgVURESVBlcnNwZWN0aXZlIGdldFVERElQZXJzcGVjdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gdWRkaVBlcnNwZWN0aXZlXzsKLSAgfQotCi0gIC8vIEdldHRlciBmb3IgdGhlIFdTSUwgcGVyc3BlY3RpdmUuCi0gIHB1YmxpYyBmaW5hbCBXU0lMUGVyc3BlY3RpdmUgZ2V0V1NJTFBlcnNwZWN0aXZlKCkKLSAgewotICAgIHJldHVybiB3c2lsUGVyc3BlY3RpdmVfOwotICB9Ci0gIAotICAvLyBHZXR0ZXIgZm9yIHRoZSBXU0RMIHBlcnNwZWN0aXZlLgotICBwdWJsaWMgZmluYWwgV1NETFBlcnNwZWN0aXZlIGdldFdTRExQZXJzcGVjdGl2ZSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFBlcnNwZWN0aXZlXzsKLSAgfQotCi0gIC8vIEdldHRlciBmb3IgdGhlIEZhdm9yaXRlcyBwZXJzcGVjdGl2ZS4KLSAgcHVibGljIGZpbmFsIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkgewotICAgIHJldHVybiBmYXZvcml0ZXNQZXJzcGVjdGl2ZV87Ci0gIH0KLSAgCi0gIC8vIEdldHRlciBmb3IgdGhlIGFjdGlvbiBlbmdpbmUKLSAgcHVibGljIGZpbmFsIEFjdGlvbkVuZ2luZSBnZXRBY3Rpb25FbmdpbmUoKSB7Ci0gICAgcmV0dXJuIGFjdGlvbkVuZ2luZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGFkZFRvSGlzdG9yeShpbnQgcGVyc3BlY3RpdmVJZCxTdHJpbmcgdXJsKQotICB7Ci0gICAgaWYgKHVybCAhPSBudWxsKQotICAgICAgcmV0dXJuIGhpc3RvcnlfLmFkZEJyZWFkQ3J1bWIobmV3IEJyZWFkQ3J1bWIocGVyc3BlY3RpdmVJZCx1cmwpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBXcmFwcGVyIGZvciBtb3ZpbmcgZm9yd2FyZCBpbiB0aGUgaGlzdG9yeSBsaXN0IGFuZCBvYnRhaW5pbmcgdGhlIGJyZWFkY3J1bWIuCi0gIHB1YmxpYyBmaW5hbCBCcmVhZENydW1iIGZvcndhcmQoKQotICB7Ci0gICAgaGlzdG9yeURpcmVjdGlvbl8gPSBBY3Rpb25JbnB1dHMuSlVNUF9GT1JXQVJEOwotICAgIHJldHVybiBoaXN0b3J5Xy5mb3J3YXJkKCk7Ci0gIH0KLQotICAvLyBXcmFwcGVyIGZvciBtb3ZpbmcgYmFjayBpbiB0aGUgaGlzdG9yeSBsaXN0IGFuZCBvYnRhaW5pbmcgdGhlIGJyZWFkY3J1bWIuCi0gIHB1YmxpYyBmaW5hbCBCcmVhZENydW1iIGJhY2soKQotICB7Ci0gICAgaGlzdG9yeURpcmVjdGlvbl8gPSBBY3Rpb25JbnB1dHMuSlVNUF9CQUNLOwotICAgIHJldHVybiBoaXN0b3J5Xy5iYWNrKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldEhpc3RvcnlEaXJlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGhpc3RvcnlEaXJlY3Rpb25fOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgcHJvY2Vzc1N0YWxlQnJlYWRDcnVtYigpCi0gIHsKLSAgICBoaXN0b3J5Xy5yZW1vdmVDdXJyZW50QnJlYWRDcnVtYigpOwotICB9Ci0gIAotICAvLyBXU0RMIEJyb3dzZXIKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0V1NETFR5cGUoaW50IHdzZGxUeXBlKQotICB7Ci0gICAgd3NkbFR5cGVfID0gd3NkbFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFdTRExUeXBlKCkKLSAgewotICAgIHJldHVybiB3c2RsVHlwZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUGVyc3BlY3RpdmVDb250ZW50QmxhbmsoKQotICB7Ci0gICAgcmV0dXJuIGlzUGVyc3BlY3RpdmVDb250ZW50QmxhbmtfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBlbmFibGVQZXJzcGVjdGl2ZUNvbnRlbnRCbGFuayhib29sZWFuIGlzUGVyc3BlY3RpdmVDb250ZW50QmxhbmspCi0gIHsKLSAgICBpc1BlcnNwZWN0aXZlQ29udGVudEJsYW5rXyA9IGlzUGVyc3BlY3RpdmVDb250ZW50Qmxhbms7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGR1bXBIaXN0b3J5KCkKLSAgewotICAgIGhpc3RvcnlfLmR1bXAoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0ZvbGRlck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb2xkZXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NWQwYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0ZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb2xkZXJOb2RlIGV4dGVuZHMgTm9kZQotewotICBwdWJsaWMgRm9sZGVyTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCwiaW1hZ2VzL2ZvbGRlcl9jbG9zZWQuZ2lmIik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE9wZW5JbWFnZVBhdGgoKQotICB7Ci0gICAgcmV0dXJuICJpbWFnZXMvZm9sZGVyX29wZW4uZ2lmIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0Zvcm1Ub29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvRm9ybVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc2NTMxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvRm9ybVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtVG9vbCBleHRlbmRzIFRvb2wgaW1wbGVtZW50cyBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UKLXsKLSAgcHJvdGVjdGVkIEZvcm1Ub29sUHJvcGVydGllcyBmb3JtVG9vbFByb3BlcnRpZXNfOwotCi0gIHB1YmxpYyBGb3JtVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgZW5hYmxlZEltYWdlTGluayxTdHJpbmcgaGlnaGxpZ2h0ZWRJbWFnZUxpbmssU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGVuYWJsZWRJbWFnZUxpbmssaGlnaGxpZ2h0ZWRJbWFnZUxpbmssYWx0LFRvb2xUeXBlcy5GT1JNKTsKLSAgICBmb3JtVG9vbFByb3BlcnRpZXNfID0gbmV3IEZvcm1Ub29sUHJvcGVydGllcygpOwotICAgIGluaXREZWZhdWx0UHJvcGVydGllcygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICB9Ci0KLSAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KQotICB7Ci0gICAgcmV0dXJuIGZvcm1Ub29sUHJvcGVydGllc18uZ2V0UHJvcGVydHkoa2V5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5KE9iamVjdCBrZXksT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgZm9ybVRvb2xQcm9wZXJ0aWVzXy5zZXRQcm9wZXJ0eShrZXksdmFsdWUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlUHJvcGVydHkoT2JqZWN0IGtleSkKLSAgewotICAgIGZvcm1Ub29sUHJvcGVydGllc18ucmVtb3ZlUHJvcGVydHkoa2V5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyUHJvcGVydHlUYWJsZSgpCi0gIHsKLSAgICBmb3JtVG9vbFByb3BlcnRpZXNfLmNsZWFyUHJvcGVydHlUYWJsZSgpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlUHJvcGVydHlUYWJsZShIYXNodGFibGUgbmV3UHJvcGVydHlUYWJsZSkKLSAgewotICAgIGZvcm1Ub29sUHJvcGVydGllc18udXBkYXRlUHJvcGVydHlUYWJsZShuZXdQcm9wZXJ0eVRhYmxlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5VGFibGUoSGFzaHRhYmxlIG5ld1Byb3BlcnR5VGFibGUpCi0gIHsKLSAgICBmb3JtVG9vbFByb3BlcnRpZXNfLnNldFByb3BlcnR5VGFibGUobmV3UHJvcGVydHlUYWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBmbGFnRXJyb3IoT2JqZWN0IGlucHV0S2V5KQotICB7Ci0gICAgZm9ybVRvb2xQcm9wZXJ0aWVzXy5mbGFnRXJyb3IoaW5wdXRLZXkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZmxhZ1Jvd0Vycm9yKE9iamVjdCBpbnB1dEtleSxpbnQgcm93TnVtYmVyKQotICB7Ci0gICAgZm9ybVRvb2xQcm9wZXJ0aWVzXy5mbGFnUm93RXJyb3IoaW5wdXRLZXkscm93TnVtYmVyKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgZmxhZ1Jvd0Vycm9yKE9iamVjdCBpbnB1dEtleSxPYmplY3Qgcm93SWQpCi0gIHsKLSAgICBmb3JtVG9vbFByb3BlcnRpZXNfLmZsYWdSb3dFcnJvcihpbnB1dEtleSxyb3dJZCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhckVycm9ycygpCi0gIHsKLSAgICBmb3JtVG9vbFByb3BlcnRpZXNfLmNsZWFyRXJyb3JzKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5KQotICB7Ci0gICAgcmV0dXJuIGZvcm1Ub29sUHJvcGVydGllc18uaXNJbnB1dFZhbGlkKGlucHV0S2V5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUm93SW5wdXRWYWxpZChPYmplY3QgaW5wdXRLZXksaW50IHJvd051bWJlcikKLSAgewotICAgIHJldHVybiBmb3JtVG9vbFByb3BlcnRpZXNfLmlzUm93SW5wdXRWYWxpZChpbnB1dEtleSxTdHJpbmcudmFsdWVPZihyb3dOdW1iZXIpKTsKLSAgfQotICAKLSAgLy8gVGhlIHJvdyBudW1iZXIgbWF5IGFsc28gYmUgcmVwcmVzZW50ZWQgYnkgYSB1bmlxdWUgb2JqZWN0IChlLmcuIFVVSUQpCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUm93SW5wdXRWYWxpZChPYmplY3QgaW5wdXRLZXksT2JqZWN0IHJvd0lkKQotICB7Ci0gICAgcmV0dXJuIGZvcm1Ub29sUHJvcGVydGllc18uaXNSb3dJbnB1dFZhbGlkKGlucHV0S2V5LHJvd0lkKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0Zvcm1Ub29sUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0Zvcm1Ub29sUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE0NDM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Gb3JtVG9vbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBGb3JtVG9vbFByb3BlcnRpZXMgaW1wbGVtZW50cyBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcHJvcGVydHlUYWJsZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGVycmFudFZhbHVlc187Ci0KLSAgcHVibGljIEZvcm1Ub29sUHJvcGVydGllcygpCi0gIHsKLSAgICBwcm9wZXJ0eVRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBlcnJhbnRWYWx1ZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KQotICB7Ci0gICAgcmV0dXJuIHByb3BlcnR5VGFibGVfLmdldChrZXkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IGtleSxPYmplY3QgdmFsdWUpCi0gIHsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoa2V5LHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZVByb3BlcnR5KE9iamVjdCBrZXkpCi0gIHsKLSAgICBwcm9wZXJ0eVRhYmxlXy5yZW1vdmUoa2V5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyUHJvcGVydHlUYWJsZSgpCi0gIHsKLSAgICBwcm9wZXJ0eVRhYmxlXy5jbGVhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgdXBkYXRlUHJvcGVydHlUYWJsZShIYXNodGFibGUgbmV3UHJvcGVydHlUYWJsZSkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBuZXdQcm9wZXJ0eVRhYmxlLmtleXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcga2V5ID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoa2V5LG5ld1Byb3BlcnR5VGFibGUuZ2V0KGtleSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5VGFibGUoSGFzaHRhYmxlIG5ld1Byb3BlcnR5VGFibGUpCi0gIHsKLSAgICBjbGVhclByb3BlcnR5VGFibGUoKTsKLSAgICB1cGRhdGVQcm9wZXJ0eVRhYmxlKG5ld1Byb3BlcnR5VGFibGUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZmxhZ0Vycm9yKE9iamVjdCBpbnB1dEtleSkKLSAgewotICAgIGlmIChpc0lucHV0VmFsaWQoaW5wdXRLZXkpKQotICAgICAgZXJyYW50VmFsdWVzXy5wdXQoaW5wdXRLZXksQm9vbGVhbi5UUlVFKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGZsYWdSb3dFcnJvcihPYmplY3QgaW5wdXRLZXksaW50IHJvd051bWJlcikKLSAgewotICAgIGZsYWdSb3dFcnJvcihpbnB1dEtleSxTdHJpbmcudmFsdWVPZihyb3dOdW1iZXIpKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgZmxhZ1Jvd0Vycm9yKE9iamVjdCBpbnB1dEtleSxPYmplY3Qgcm93SWQpCi0gIHsKLSAgICBPYmplY3QgZXJyb3JPYmplY3QgPSBlcnJhbnRWYWx1ZXNfLmdldChpbnB1dEtleSk7Ci0gICAgSGFzaHRhYmxlIHJvd0hhc2g7Ci0gICAgaWYgKGVycm9yT2JqZWN0IGluc3RhbmNlb2YgSGFzaHRhYmxlKQotICAgICAgcm93SGFzaCA9IChIYXNodGFibGUpZXJyb3JPYmplY3Q7Ci0gICAgZWxzZQotICAgICAgcm93SGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICByb3dIYXNoLnB1dChyb3dJZCxCb29sZWFuLlRSVUUpOwotICAgIGVycmFudFZhbHVlc18ucHV0KGlucHV0S2V5LHJvd0hhc2gpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhckVycm9ycygpCi0gIHsKLSAgICBlcnJhbnRWYWx1ZXNfLmNsZWFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5KQotICB7Ci0gICAgcmV0dXJuIChlcnJhbnRWYWx1ZXNfLmdldChpbnB1dEtleSkgPT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Jvd0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5LGludCByb3dOdW1iZXIpCi0gIHsKLSAgICByZXR1cm4gaXNSb3dJbnB1dFZhbGlkKGlucHV0S2V5LFN0cmluZy52YWx1ZU9mKHJvd051bWJlcikpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Jvd0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5LE9iamVjdCByb3dJZCkKLSAgewotICAgIEhhc2h0YWJsZSByb3dIYXNoID0gKEhhc2h0YWJsZSllcnJhbnRWYWx1ZXNfLmdldChpbnB1dEtleSk7Ci0gICAgaWYgKHJvd0hhc2ggPT0gbnVsbCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiAocm93SGFzaC5nZXQocm93SWQpID09IG51bGwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OTI2Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0Zvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZQotewotICAvLyBHZXR0ZXIgYW5kIFNldHRlciBmb3IgYSBwcm9wZXJ0eS4KLSAgcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KTsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHkoT2JqZWN0IGtleSxPYmplY3QgdmFsdWUpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZW1vdmVQcm9wZXJ0eShPYmplY3Qga2V5KTsKLQotICAvLyBQcm9wZXJ0eSB0YWJsZSBvcGVyYXRvcnMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyUHJvcGVydHlUYWJsZSgpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVQcm9wZXJ0eVRhYmxlKEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlKTsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UHJvcGVydHlUYWJsZShIYXNodGFibGUgcHJvcGVydHlUYWJsZSk7Ci0KLSAgLy8gRXJyb3IgaGFuZGxpbmcuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZsYWdFcnJvcihPYmplY3QgaW5wdXRLZXkpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbGFnUm93RXJyb3IoT2JqZWN0IGlucHV0S2V5LGludCByb3dOdW1iZXIpOwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbGFnUm93RXJyb3IoT2JqZWN0IGlucHV0S2V5LE9iamVjdCByb3dJZCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsZWFyRXJyb3JzKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSW5wdXRWYWxpZChPYmplY3QgaW5wdXRLZXkpOwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Jvd0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5LGludCByb3dOdW1iZXIpOwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1Jvd0lucHV0VmFsaWQoT2JqZWN0IGlucHV0S2V5LE9iamVjdCByb3dJZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvSGlzdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0hpc3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZlMjI1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvSGlzdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vLyBBIGNsYXNzIHJlcHJlc2VudGluZyBhIFZlY3RvciBvZiBicmVhZGNydW1icy4gQSBwb3NpdGlvbiBpbmRleCBpcyB1c2VkCi0vLyB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBkYXRhIHN0cnVjdHVyZS4KLXB1YmxpYyBjbGFzcyBIaXN0b3J5Ci17Ci0gIHByaXZhdGUgVmVjdG9yIGl0ZW1zXzsKLSAgcHJpdmF0ZSBpbnQgcG9zaXRpb25fOwotCi0gIHB1YmxpYyBIaXN0b3J5KCkKLSAgewotICAgIGl0ZW1zXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwb3NpdGlvbl8gPSAtMTsKLSAgfQotCi0gIC8vIEFkZCBhIG5ldyBicmVhZGNydW1iIHRvIHRoZSBoaXN0b3J5IGxpc3QuIFdoZW4gYWRkaW5nIGEgbmV3IGJyZWFkY3J1bWIKLSAgLy8gd2l0aGluIHRoZSBjdXJyZW50IGxpc3QsIGFsbCBicmVhZGNydW1icyBhZnRlciB0aGUgbmV3bHkgYWRkZWQgb25lIGFyZQotICAvLyByZW1vdmVkLgotICBwdWJsaWMgYm9vbGVhbiBhZGRCcmVhZENydW1iKEJyZWFkQ3J1bWIgYikKLSAgewotICAgIGludCBudW1iZXJPZkl0ZW1zID0gaXRlbXNfLnNpemUoKTsKLSAgICBpZiAobnVtYmVyT2ZJdGVtcyA9PSAwKQotICAgIHsKLSAgICAgIHBvc2l0aW9uXysrOwotICAgICAgaXRlbXNfLmFkZEVsZW1lbnQoYik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEJyZWFkQ3J1bWIgY3VycmVudEJyZWFkQ3J1bWIgPSAoQnJlYWRDcnVtYilpdGVtc18uZWxlbWVudEF0KHBvc2l0aW9uXyk7Ci0gICAgICBpZiAoIWN1cnJlbnRCcmVhZENydW1iLmVxdWFscyhiKSkKLSAgICAgIHsKLSAgICAgICAgcG9zaXRpb25fKys7Ci0gICAgICAgIGl0ZW1zXy5pbnNlcnRFbGVtZW50QXQoYixwb3NpdGlvbl8pOwotICAgICAgICBmb3IgKGludCBpPWl0ZW1zXy5zaXplKCktMTtpPnBvc2l0aW9uXztpLS0pCi0gICAgICAgICAgaXRlbXNfLnJlbW92ZUVsZW1lbnRBdChpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIE1vdmUgZm9yd2FyZCB3aXRoaW4gdGhlIGhpc3RvcnkgbGlzdCBhbmQgb2J0YWluIHRoZSBicmVhZGNydW1iLgotICBwdWJsaWMgQnJlYWRDcnVtYiBmb3J3YXJkKCkKLSAgewotICAgIGlmIChwb3NpdGlvbl8gPCBpdGVtc18uc2l6ZSgpLTEpCi0gICAgewotICAgICAgcG9zaXRpb25fKys7Ci0gICAgICBCcmVhZENydW1iIGIgPSAoQnJlYWRDcnVtYilpdGVtc18uZWxlbWVudEF0KHBvc2l0aW9uXyk7Ci0gICAgICByZXR1cm4gYjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvLyBNb3ZlIGJhY2sgd2l0aGluIHRoZSBoaXN0b3J5IGxpc3QgYW5kIG9idGFpbiB0aGUgYnJlYWRjcnVtYi4KLSAgcHVibGljIEJyZWFkQ3J1bWIgYmFjaygpCi0gIHsKLSAgICBpZiAocG9zaXRpb25fID4gMCkKLSAgICB7Ci0gICAgICBwb3NpdGlvbl8tLTsKLSAgICAgIEJyZWFkQ3J1bWIgYiA9IChCcmVhZENydW1iKWl0ZW1zXy5lbGVtZW50QXQocG9zaXRpb25fKTsKLSAgICAgIHJldHVybiBiOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUN1cnJlbnRCcmVhZENydW1iKCkKLSAgewotICAgIGl0ZW1zXy5yZW1vdmVFbGVtZW50QXQocG9zaXRpb25fKTsKLSAgICBpZiAocG9zaXRpb25fID4gaXRlbXNfLnNpemUoKS0xKQotICAgICAgcG9zaXRpb25fLS07Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGR1bXAoKQotICB7Ci0gICAgZm9yIChpbnQgaT0wO2k8aXRlbXNfLnNpemUoKTtpKyspCi0gICAgewotICAgICAgQnJlYWRDcnVtYiBiID0gKEJyZWFkQ3J1bWIpaXRlbXNfLmVsZW1lbnRBdChpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9JbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvSW1wb3J0VG9GaWxlU3lzdGVtVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjUzYzRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9JbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1wb3J0VG9GaWxlU3lzdGVtVG9vbCBleHRlbmRzIEFjdGlvblRvb2wgewotICAgIHB1YmxpYyBJbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2ltcG9ydF9mc19lbmFibGVkLmdpZiIsICJpbWFnZXMvaW1wb3J0X2ZzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvSW1wb3J0VG9Xb3JrYmVuY2hUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvSW1wb3J0VG9Xb3JrYmVuY2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzQwNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0ltcG9ydFRvV29ya2JlbmNoVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEltcG9ydFRvV29ya2JlbmNoVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLSAgICBwdWJsaWMgSW1wb3J0VG9Xb3JrYmVuY2hUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gImZvcm1zL0ltcG9ydFRvV29ya2JlbmNoRm9ybS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0xhdW5jaE9wdGlvbnNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTGF1bmNoT3B0aW9uc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYmY3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTGF1bmNoT3B0aW9uc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLkxhdW5jaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuVURESVBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZTsKLQotcHVibGljIGNsYXNzIExhdW5jaE9wdGlvbnNNYW5hZ2VyCi17Ci0gIHByaXZhdGUgc3RhdGljIExhdW5jaE9wdGlvbnNNYW5hZ2VyIGluc3RhbmNlXzsKLQotICBwcml2YXRlIEhhc2h0YWJsZSBvcHRpb25zVGFibGVfOwotCi0gIHByaXZhdGUgTGF1bmNoT3B0aW9uc01hbmFnZXIoKQotICB7Ci0gICAgb3B0aW9uc1RhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGF1bmNoT3B0aW9uc01hbmFnZXIgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlXyA9PSBudWxsKQotICAgICAgaW5zdGFuY2VfID0gbmV3IExhdW5jaE9wdGlvbnNNYW5hZ2VyKCk7Ci0gICAgcmV0dXJuIGluc3RhbmNlXzsKLSAgfQotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYW5hZ2UoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlLCBTZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbikKLSAgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgIG1hbmFnZVNlc3Npb24oa2V5LCAoU3RyaW5nKXZhbHVlLCBhcHBsaWNhdGlvbik7Ci0gICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBIYXNodGFibGUpCi0gICAgICBtYW5hZ2VPcHRpb25zKGtleSwgKEhhc2h0YWJsZSl2YWx1ZSwgYXBwbGljYXRpb24pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG1hbmFnZVNlc3Npb24oU3RyaW5nIGtleSwgU3RyaW5nIHNlc3Npb25JZCwgU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqID0gb3B0aW9uc1RhYmxlXy5yZW1vdmUoa2V5KTsKLSAgICBpZiAob2JqICE9IG51bGwgJiYgKG9iaiBpbnN0YW5jZW9mIEhhc2h0YWJsZSkpCi0gICAgICBsb2FkT3B0aW9ucyhzZXNzaW9uSWQsIChIYXNodGFibGUpb2JqLCBhcHBsaWNhdGlvbik7Ci0gICAgZWxzZQotICAgICAgb3B0aW9uc1RhYmxlXy5wdXQoa2V5LCBzZXNzaW9uSWQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG1hbmFnZU9wdGlvbnMoU3RyaW5nIGtleSwgSGFzaHRhYmxlIG9wdGlvbnMsIFNlcnZsZXRDb250ZXh0IGFwcGxpY2F0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iaiA9IG9wdGlvbnNUYWJsZV8ucmVtb3ZlKGtleSk7Ci0gICAgaWYgKG9iaiAhPSBudWxsICYmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcpKQotICAgICAgbG9hZE9wdGlvbnMoKFN0cmluZylvYmosIG9wdGlvbnMsIGFwcGxpY2F0aW9uKTsKLSAgICBlbHNlCi0gICAgICBvcHRpb25zVGFibGVfLnB1dChrZXksIG9wdGlvbnMpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGxvYWRPcHRpb25zKFN0cmluZyBzZXNzaW9uSWQsIEhhc2h0YWJsZSBvcHRpb25zLCBTZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbikKLSAgewotICAgIEh0dHBTZXNzaW9uIGh0dHBTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgIGlmIChodHRwU2Vzc2lvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWh0dHBTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotCSAgU3RyaW5nW10gc3RhdGVMb2NhdGlvbnMgPSAoU3RyaW5nW10pb3B0aW9ucy5nZXQoTGF1bmNoT3B0aW9ucy5TVEFURV9MT0NBVElPTik7Ci0JICBTdHJpbmdbXSBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb25zID0gKFN0cmluZ1tdKW9wdGlvbnMuZ2V0KExhdW5jaE9wdGlvbnMuREVGQVVMVF9GQVZPUklURVNfTE9DQVRJT04pOwotICAgICAgU3RyaW5nW10gaW5xdWlyeVVSTHMgPSAoU3RyaW5nW10pb3B0aW9ucy5nZXQoTGF1bmNoT3B0aW9ucy5JTlFVSVJZX1VSTCk7Ci0gICAgICBTdHJpbmdbXSBwdWJsaXNoVVJMcyA9IChTdHJpbmdbXSlvcHRpb25zLmdldChMYXVuY2hPcHRpb25zLlBVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZ1tdIHNlcnZpY2VOYW1lcyA9IChTdHJpbmdbXSlvcHRpb25zLmdldChMYXVuY2hPcHRpb25zLlNFUlZJQ0VfTkFNRSk7Ci0gICAgICBTdHJpbmdbXSBzZXJ2aWNlS2V5cyA9IChTdHJpbmdbXSlvcHRpb25zLmdldChMYXVuY2hPcHRpb25zLlNFUlZJQ0VfS0VZKTsKLSAgICAgIFN0cmluZ1tdIHdzZGxVUkxzID0gKFN0cmluZ1tdKW9wdGlvbnMuZ2V0KExhdW5jaE9wdGlvbnMuV1NETF9VUkwpOwotICAgICAgU3RyaW5nW10gZW5kcG9pbnRzID0gKFN0cmluZ1tdKW9wdGlvbnMuZ2V0KExhdW5jaE9wdGlvbnMuV0VCX1NFUlZJQ0VfRU5EUE9JTlQpOwotICAgICAgU3RyaW5nW10gc2VydmljZVFOYW1lU3RyaW5ncyA9IChTdHJpbmdbXSlvcHRpb25zLmdldChMYXVuY2hPcHRpb25zLlNFUlZJQ0VfUU5BTUVfU1RSSU5HKTsKLSAgICAgIFN0cmluZ1tdIGJpbmRpbmdOYW1lU3RyaW5ncyA9IChTdHJpbmdbXSlvcHRpb25zLmdldChMYXVuY2hPcHRpb25zLkJJTkRJTkdfTkFNRV9TVFJJTkcpOwotCSAgU3RyaW5nIHN0YXRlTG9jYXRpb24gPSAoc3RhdGVMb2NhdGlvbnMgPT0gbnVsbCB8fCBzdGF0ZUxvY2F0aW9ucy5sZW5ndGggPT0gMCkgPyBudWxsIDogc3RhdGVMb2NhdGlvbnNbMF07Ci0JICBjb250cm9sbGVyLnNldFN0YXRlTG9jYXRpb24oc3RhdGVMb2NhdGlvbik7Ci0JICBTdHJpbmcgZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uID0gKGRlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbnMgPT0gbnVsbCB8fCBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb25zLmxlbmd0aCA9PSAwKSA/IG51bGwgOiBkZWZhdWx0RmF2b3JpdGVzTG9jYXRpb25zWzBdOwotCSAgY29udHJvbGxlci5zZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24oZGVmYXVsdEZhdm9yaXRlc0xvY2F0aW9uKTsKLSAgICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgICAgdWRkaVBlcnNwZWN0aXZlLnByZWxvYWRVRERJUmVnaXN0cmllcyhpbnF1aXJ5VVJMcywgcHVibGlzaFVSTHMpOwotICAgICAgdWRkaVBlcnNwZWN0aXZlLnByZWxvYWRTZXJ2aWNlcyhpbnF1aXJ5VVJMcyxzZXJ2aWNlTmFtZXMsc2VydmljZUtleXMpOwotICAgICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgICB3c2RsUGVyc3BlY3RpdmUucHJlbG9hZFdTREwod3NkbFVSTHMpOwotICAgICAgd3NkbFBlcnNwZWN0aXZlLnByZWxvYWRFbmRwb2ludHMod3NkbFVSTHMsIGVuZHBvaW50cyk7Ci0gICAgICB3c2RsUGVyc3BlY3RpdmUucHJlc2VsZWN0U2VydmljZU9yQmluZGluZyh3c2RsVVJMcyxzZXJ2aWNlUU5hbWVTdHJpbmdzLGJpbmRpbmdOYW1lU3RyaW5ncyk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIzZWE4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLSAgICBwdWJsaWMgTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvbGF1bmNoX3dzd2l6YXJkX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9sYXVuY2hfd3N3aXphcmRfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gImZvcm1zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTWVzc2FnZUJ1bmRsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL01lc3NhZ2VCdW5kbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4YzhjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTWVzc2FnZUJ1bmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotLyoqCi0qIEFuIG1lc3NhZ2UgYnVuZGxlIGlzIGEgY29sbGVjdGlvbiBvZiBtZXNzYWdlcyBkcmF3biBmcm9tIHNvbWUKLSogc2V0IG9mIHByb3BlcnRpZXMuCi0qLwotcHVibGljIGNsYXNzIE1lc3NhZ2VCdW5kbGUKLXsKLSAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLSAgLyoqCi0gICogQ29uc3RydWN0cyBhIG5ldyBNZXNzYWdlQnVuZGxlIGZyb20gdGhlIGdpdmVuIFJlc291cmNlQnVuZGxlLgotICAqLwotICBwdWJsaWMgTWVzc2FnZUJ1bmRsZSAoIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlICkKLSAgewotICAgIGZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBpZGVudGlmaWVkIGJ5IG1lc3NhZ2VJZC4KLSAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBtZXNzYWdlIElELgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBtZXNzYWdlIHRleHQuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSAoIFN0cmluZyBtZXNzYWdlSWQgKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcobWVzc2FnZUlkKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBtZXNzYWdlSWQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBpZGVudGlmaWVkIGJ5IG1lc3NhZ2VJZC4KLSAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBtZXNzYWdlIElELgotICAqIEBwYXJhbSBzdWIgQSBzdWJzdGl0dXRpb24gdmFsdWUgZm9yICIlMSIgaW4gdGhlIG1lc3NhZ2UuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIG1lc3NhZ2UgdGV4dC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHN1YiApCi0gIHsKLSAgICBTdHJpbmdbXSBzID0ge3N1Yn07Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2UobWVzc2FnZUlkLHMpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbWVzc2FnZSBpZGVudGlmaWVkIGJ5IG1lc3NhZ2VJZC4KLSAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBtZXNzYWdlIElELgotICAqIEBwYXJhbSBzdWIgU3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgIiUxLi4lbiIgKHN1YlswXS4uc3ViW24tMV0pIGluCi0gICogdGhlIG1lc3NhZ2UuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIG1lc3NhZ2UgdGV4dC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlICggU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gc3ViICkKLSAgewotICAgIFN0cmluZyBtID0gZ2V0TWVzc2FnZShtZXNzYWdlSWQpOwotICAgIGludCBsZW4gPSBtLmxlbmd0aCgpOwotICAgIGludCBtYXggPSBzdWIubGVuZ3RoOwotICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGludCBwb3MgPSAwOwotICAgIHdoaWxlIChwb3MgPj0gMCkKLSAgICB7Ci0gICAgICBpbnQgcGN0ID0gbS5pbmRleE9mKCclJyxwb3MpOwotICAgICAgaWYgKHBjdCA+PSAwKQotICAgICAgewotICAgICAgICBiLmFwcGVuZChtLnN1YnN0cmluZyhwb3MscGN0KSk7Ci0gICAgICAgIHBvcyA9IHBjdCArIDE7Ci0gICAgICAgIGlmIChwb3MgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyIGQgPSBtLmNoYXJBdChwb3MpOwotICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdChkKSAmJiBkICE9ICcwJykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdiA9IEludGVnZXIucGFyc2VJbnQobmV3IENoYXJhY3RlcihkKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmICh2IDw9IG1heCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYi5hcHBlbmQoc3ViW3YtMV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBiLmFwcGVuZCgnPycpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiLmFwcGVuZCgnJScpOwotICAgICAgICAgICAgYi5hcHBlbmQoZCk7Ci0gICAgICAgICAgICBwb3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYi5hcHBlbmQoJyUnKTsKLSAgICAgICAgICBwb3MgPSAtMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiLmFwcGVuZChtLnN1YnN0cmluZyhwb3MpKTsKLSAgICAgICAgcG9zID0gLTE7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKQotICB7Ci0gICAgcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTWVzc2FnZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTWVzc2FnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzOTVhMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL01lc3NhZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vLyBBIENsYXNzIHdoaWNoIHByb3ZpZGVzIFN0cmluZyBtZXNzYWdlcy4KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VCdW5kbGUgbWVzc2FnZUJ1bmRsZV87Ci0gIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VQcm92aWRlck5hbWVfOwotCi0gIHB1YmxpYyBNZXNzYWdlUHJvdmlkZXIoU3RyaW5nIG1lc3NhZ2VCdW5kbGVGaWxlTmFtZSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIExvYWQgdGhlIG1lc3NhZ2UgYnVuZGxlIGZyb20gdGhlIFdFQi1JTkZcY2xhc3NlcyBzdWJkaXJlY3RvcnkuCi0gICAgICBtZXNzYWdlUHJvdmlkZXJOYW1lXyA9IG1lc3NhZ2VCdW5kbGVGaWxlTmFtZTsKLSAgICAgIG1lc3NhZ2VCdW5kbGVfID0gbmV3IE1lc3NhZ2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKG1lc3NhZ2VCdW5kbGVGaWxlTmFtZSkpOwotICAgIH0KLSAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAlTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBsb2FkICIrbWVzc2FnZUJ1bmRsZUZpbGVOYW1lKTsKLSAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlQnVuZGxlXy5nZXRNZXNzYWdlKG1lc3NhZ2VJZCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCxTdHJpbmcgc3ViKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VCdW5kbGVfLmdldE1lc3NhZ2UobWVzc2FnZUlkLHN1Yik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJZCxTdHJpbmdbXSBzdWIpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZUJ1bmRsZV8uZ2V0TWVzc2FnZShtZXNzYWdlSWQsc3ViKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlUHJvdmlkZXJOYW1lKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlUHJvdmlkZXJOYW1lXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL01lc3NhZ2VRdWV1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL01lc3NhZ2VRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2NmYzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9NZXNzYWdlUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlUXVldWUKLXsKLSAgcHJvdGVjdGVkIFZlY3RvciBtZXNzYWdlTGlzdF87Ci0KLSAgcHVibGljIE1lc3NhZ2VRdWV1ZSgpCi0gIHsKLSAgICBtZXNzYWdlTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgbWVzc2FnZUxpc3RfLmFkZEVsZW1lbnQobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VzRnJvbUxpc3QoKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgaWYgKG1lc3NhZ2VMaXN0Xy5zaXplKCk9PTApCi0gICAgICByZXR1cm4gIiI7Ci0KLSAgICBFbnVtZXJhdGlvbiBlID0gbWVzc2FnZUxpc3RfLmVsZW1lbnRzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHRoaXNNZXNzYWdlID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICBtZXNzYWdlcy5hcHBlbmQodGhpc01lc3NhZ2UpOwotICAgICAgbWVzc2FnZXMuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgfQotICAgIG1lc3NhZ2VMaXN0Xy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIHJldHVybiBtZXNzYWdlcy50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhMmNkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGUKLXsKLSAgcHJvdGVjdGVkIFRyZWVFbGVtZW50IGVsZW1lbnRfOwotICBwcm90ZWN0ZWQgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBwcm90ZWN0ZWQgaW50IG5vZGVJZF87Ci0gIHByb3RlY3RlZCBpbnQgbm9kZURlcHRoXzsKLSAgcHJvdGVjdGVkIFN0cmluZyBpbWFnZVBhdGhfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc09wZW5fOwotICBwcm90ZWN0ZWQgVmVjdG9yIGNoaWxkTm9kZXNfOwotICBwcm90ZWN0ZWQgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXJfOwotICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnRfOwotICBwcml2YXRlIFN0cmluZyBhbmNob3JOYW1lXzsKLSAgcHJpdmF0ZSBpbnQgdmlld0lkXzsKLQotICBwdWJsaWMgTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgsU3RyaW5nIGltYWdlUGF0aCkKLSAgewotICAgIGVsZW1lbnRfID0gZWxlbWVudDsKLSAgICBub2RlTWFuYWdlcl8gPSBub2RlTWFuYWdlcjsKLSAgICBub2RlSWRfID0gbm9kZU1hbmFnZXIuYWRkVG9Ob2RlVGFibGUodGhpcyk7Ci0gICAgbm9kZURlcHRoXyA9IG5vZGVEZXB0aDsKLSAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpOwotICAgIGlmIChpbWFnZVBhdGggPT0gbnVsbCkKLSAgICAgIGltYWdlUGF0aF8gPSBjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChOb2RlTWFuYWdlci5QQVRIX1NQQUNFKTsKLSAgICBlbHNlCi0gICAgICBpbWFnZVBhdGhfID0gaW1hZ2VQYXRoOwotICAgIGlzT3Blbl8gPSB0cnVlOwotICAgIGNoaWxkTm9kZXNfID0gbmV3IFZlY3RvcigpOwotICAgIHRvb2xNYW5hZ2VyXyA9IG5ldyBUb29sTWFuYWdlcih0aGlzKTsKLSAgICBpbml0VG9vbHMoKTsKLSAgICBhbmNob3JOYW1lXyA9IChuZXcgU3RyaW5nQnVmZmVyKCJhY3Rpb24iKSkuYXBwZW5kKG5vZGVJZF8pLnRvU3RyaW5nKCk7Ci0gICAgcGFyZW50XyA9IG51bGw7Ci0gICAgdmlld0lkXyA9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVDsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIFRyZWVFbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0gICogQHJldHVybiBUcmVlRWxlbWVudCBUaGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotICAqLwotICBwdWJsaWMgVHJlZUVsZW1lbnQgZ2V0VHJlZUVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgKiBAcmV0dXJuIFN0cmluZwotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50Xy5nZXROYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBOb2RlTWFuYWdlciBtYW5hZ2luZyB0aGlzIG5vZGUuCi0gICogQHJldHVybiBOb2RlTWFuYWdlcgotICAqLwotICBwdWJsaWMgTm9kZU1hbmFnZXIgZ2V0Tm9kZU1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVNYW5hZ2VyXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGlkIG9mIHRoaXMgbm9kZS4KLSAgKiBAcmV0dXJuIGludAotICAqLwotICBwdWJsaWMgaW50IGdldE5vZGVJZCgpCi0gIHsKLSAgICByZXR1cm4gbm9kZUlkXzsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIGRlcHRoIGluIHRoZSB0cmVlIG9mIHRoaXMgbm9kZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBub2RlCi0gICogQHJldHVybiBpbnQKLSAgKi8KLSAgcHVibGljIGludCBnZXROb2RlRGVwdGgoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVEZXB0aF87Ci0gIH0KLQotICAvKioKLSAgKiBTZXQgdGhlIHBhdGggb2YgdGhlIGltYWdlIHJlcHJlc2VudGluZyB0aGlzIGNsYXNzIG9mIE5vZGUuCi0gICogQHBhcmFtIFN0cmluZyBUaGUgcGF0aC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW1hZ2VQYXRoKFN0cmluZyBwYXRoKQotICB7Ci0gICAgaW1hZ2VQYXRoXyA9IHBhdGg7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSBhcmUgdmlzaWJsZS4gUmV0dXJucyBmYWxzZQotICAqIGlmIHRoZXkgYXJlIG5vdC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiBpc09wZW5fOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkKLSAgewotICAgIE5vZGUgcGFyZW50Tm9kZSA9IHBhcmVudF87Ci0gICAgd2hpbGUgKHBhcmVudE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIXBhcmVudE5vZGUuaXNPcGVuKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIHBhcmVudE5vZGUgPSBwYXJlbnROb2RlLmdldFBhcmVudCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhpcyBub2RlJ3MgY2hpbGRyZW4gdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgKiBVcGRhdGVzIHRoZSBOb2RlTWFuYWdlcidzIHJlY29yZCBvZiB0aGUgbWF4aW11bSBkZXB0aCB2aXNpYmxlIGluIHRoZSB0cmVlLgotICAqIEBwYXJhbSBib29sZWFuCi0gICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGJvb2xlYW4gb3BlbikKLSAgewotICAgIGlzT3Blbl8gPSBvcGVuOwotICAgIG5vZGVNYW5hZ2VyXy51cGRhdGVNYXhEZXB0aFZpc2libGUoKTsKLSAgfQotCi0gIC8qKgotICAqIEdldHMgdGhlIG1heGltdW0gZGVwdGggZGlzcGxheWVkIGluIHRoaXMgbm9kZSdzIGJyYW5jaCBvZiB0aGUgdHJlZQotICAqIFVzZWQgYnkgTm9kZU1hbmFnZXIgZm9yIGh0bWwgZGlzcGxheSBwdXJwb3Nlcy4KLSAgKiBAcmV0dXJuIGludAotICAqLwotICBwdWJsaWMgaW50IGdldE1heERlcHRoVmlzaWJsZSgpCi0gIHsKLSAgICBpZiAoIWlzT3Blbl8pCi0gICAgICByZXR1cm4gbm9kZURlcHRoXzsKLSAgICBlbHNlCi0gICAgewotICAgICAgaW50IGN1cnJlbnREZXB0aCA9IG5vZGVEZXB0aF87Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gY2hpbGROb2Rlc18uZWxlbWVudHMoKTsKLSAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBOb2RlIHRoaXNOb2RlID0gKE5vZGUpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICBpbnQgZGVwdGggPSB0aGlzTm9kZS5nZXRNYXhEZXB0aFZpc2libGUoKTsKLSAgICAgICAgaWYgKGRlcHRoPmN1cnJlbnREZXB0aCkKLSAgICAgICAgICBjdXJyZW50RGVwdGg9ZGVwdGg7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY3VycmVudERlcHRoOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFBhcmVudChOb2RlIG5vZGUpCi0gIHsKLSAgICBwYXJlbnRfID0gbm9kZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldFBhcmVudCgpCi0gIHsKLSAgICByZXR1cm4gcGFyZW50XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZpZXdJZChpbnQgdmlld0lkKQotICB7Ci0gICAgdmlld0lkXyA9IHZpZXdJZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Vmlld0lkKCkKLSAgewotICAgIHJldHVybiB2aWV3SWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRWaWV3VG9vbElkKCkKLSAgewotICAgIFRvb2xNYW5hZ2VyIHZpZXdUb29sTWFuYWdlciA9IGdldFZpZXdUb29sTWFuYWdlcigpOwotICAgIGlmICh2aWV3VG9vbE1hbmFnZXIgIT0gbnVsbCkKLSAgICAgIHJldHVybiB2aWV3VG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sSWQoKTsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVDsKLSAgfQotCi0gIC8qKgotICAqIEFkZHMgdGhlIHNwZWNpZmllZCBub2RlIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlLgotICAqIEBwYXJhbSBOb2RlIFRoZSBjaGlsZCBiZWluZyBhZGRlZC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gQWx3YXlzIHRydWUuCi0gICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGFkZENoaWxkKE5vZGUgY2hpbGROb2RlKQotICB7Ci0gICAgY2hpbGROb2RlLnNldFBhcmVudCh0aGlzKTsKLSAgICBjaGlsZE5vZGVzXy5hZGRFbGVtZW50KGNoaWxkTm9kZSk7Ci0gICAgbm9kZU1hbmFnZXJfLnVwZGF0ZU1heERlcHRoVmlzaWJsZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgY2hpbGQgbm9kZXMgb2YgdGhpcyBub2RlLiBJZiB0aGlzIG5vZGUgaGFzIG5vIGNoaWxkcmVuLCBhbgotICAqIGVtcHR5IHZlY3RvciBpcyByZXR1cm5lZC4KLSAgKiBAcmV0dXJuIFZlY3RvcgotICAqLwotICBwdWJsaWMgVmVjdG9yIGdldENoaWxkTm9kZXMoKQotICB7Ci0gICAgcmV0dXJuIGNoaWxkTm9kZXNfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE5vZGUgZ2V0Q2hpbGROb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBFbnVtZXJhdGlvbiBlID0gY2hpbGROb2Rlc18uZWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBOb2RlIHByZXNlbnROb2RlID0gKE5vZGUpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKHByZXNlbnROb2RlLmdldFRyZWVFbGVtZW50KCkgPT0gZWxlbWVudCkKLSAgICAgICAgcmV0dXJuIHByZXNlbnROb2RlOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUNoaWxkTm9kZXMoYm9vbGVhbiBpc0VudHJ5KQotICB7Ci0gICAgaW50IG51bWJlck9mQ2hpbGROb2RlcyA9IGNoaWxkTm9kZXNfLnNpemUoKTsKLSAgICBmb3IgKGludCBpPW51bWJlck9mQ2hpbGROb2Rlcy0xO2k+PTA7aS0tKQotICAgIHsKLSAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpY2hpbGROb2Rlc18uZWxlbWVudEF0KGkpOwotICAgICAgY2hpbGROb2RlLnJlbW92ZUNoaWxkTm9kZXMoZmFsc2UpOwotICAgICAgbm9kZU1hbmFnZXJfLnJlbW92ZUZyb21Ob2RlVGFibGUoY2hpbGROb2RlLmdldE5vZGVJZCgpKTsKLSAgICB9Ci0gICAgaWYgKG51bWJlck9mQ2hpbGROb2RlcyA+IDApCi0gICAgewotICAgICAgY2hpbGROb2Rlc18ucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgIGlmIChpc0VudHJ5KQotICAgICAgICBub2RlTWFuYWdlcl8udXBkYXRlTWF4RGVwdGhWaXNpYmxlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVtb3ZlQ2hpbGROb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOb2RlIGNoaWxkTm9kZSA9IGdldENoaWxkTm9kZShlbGVtZW50KTsKLSAgICBpZiAoY2hpbGROb2RlICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGNoaWxkTm9kZUlkID0gY2hpbGROb2RlLmdldE5vZGVJZCgpOwotICAgICAgaWYgKG5vZGVNYW5hZ2VyXy5nZXRTZWxlY3RlZE5vZGVJZCgpID09IGNoaWxkTm9kZUlkKQotICAgICAgICBub2RlTWFuYWdlcl8uc2V0U2VsZWN0ZWROb2RlSWQobm9kZUlkXyk7Ci0gICAgICBjaGlsZE5vZGVzXy5yZW1vdmVFbGVtZW50KGNoaWxkTm9kZSk7Ci0gICAgICBub2RlTWFuYWdlcl8ucmVtb3ZlRnJvbU5vZGVUYWJsZShjaGlsZE5vZGVJZCk7Ci0gICAgICBub2RlTWFuYWdlcl8udXBkYXRlTWF4RGVwdGhWaXNpYmxlKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICogR2V0IHRoZSBuYW1lIG9mIHRoZSBIVE1MIGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBhbmNob3IuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QW5jaG9yTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gYW5jaG9yTmFtZV87Ci0gIH0KLQotICBwdWJsaWMgVG9vbE1hbmFnZXIgZ2V0VG9vbE1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xNYW5hZ2VyXzsKLSAgfQotCi0gIHB1YmxpYyBUb29sTWFuYWdlciBnZXRWaWV3VG9vbE1hbmFnZXIoKQotICB7Ci0gICAgaWYgKHZpZXdJZF8gIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgIHsKLSAgICAgIFZpZXdUb29sIHZpZXdUb29sID0gKFZpZXdUb29sKXRvb2xNYW5hZ2VyXy5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgIHJldHVybiB2aWV3VG9vbC5nZXRUb29sTWFuYWdlcih2aWV3SWRfKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBUb29sTWFuYWdlciBnZXRDdXJyZW50VG9vbE1hbmFnZXIoKQotICB7Ci0gICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSBnZXRWaWV3VG9vbE1hbmFnZXIoKTsKLSAgICBpZiAodG9vbE1hbmFnZXIgPT0gbnVsbCkKLSAgICAgIHRvb2xNYW5hZ2VyID0gdG9vbE1hbmFnZXJfOwotICAgIHJldHVybiB0b29sTWFuYWdlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRUb29scygpOwotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25UYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIEZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUE7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRUb2dnbGUoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSxTdHJpbmdCdWZmZXIgdHJlZVZpZXcsYm9vbGVhbiBpc0xhc3RDaGlsZCkKLSAgewotICAgIGlmIChub2RlRGVwdGhfICE9IDEpCi0gICAgewotICAgICAgdHJlZVZpZXcuYXBwZW5kKCIgICAgPHRkIGFsaWduPVwibGVmdFwiIHdpZHRoPTE2IGhlaWdodD0xNiBub3dyYXA+Iik7Ci0gICAgICBTdHJpbmcgdG9nZ2xlSW1hZ2VUYWc7Ci0gICAgICBpZiAoY2hpbGROb2Rlc18uc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gPGEgaHJlZj0iLi4uIiB0YXJnZXQ9Ii4uLiI+dG9nZ2xlSW1hZ2VUYWc8L2E+Ci0gICAgICAgIFN0cmluZyBocmVmID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRQYXRoV2l0aENvbnRleHQoZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKSk7Ci0gICAgICAgIGlmIChpc09wZW5fKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRvZ2dsZUFsdCA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiQUxUX0NMT1NFIik7Ci0gICAgICAgICAgaWYgKGlzTGFzdENoaWxkKQotICAgICAgICAgICAgdG9nZ2xlSW1hZ2VUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KE5vZGVNYW5hZ2VyLlBBVEhfTUlOVVNfTEFTVCksdG9nZ2xlQWx0LCIxNiIsIjE2IixudWxsKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB0b2dnbGVJbWFnZVRhZyA9IEhUTUxVdGlscy5nZXRIVE1MSW1hZ2VUYWcocmVzcG9uc2Usbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRQYXRoV2l0aENvbnRleHQoTm9kZU1hbmFnZXIuUEFUSF9NSU5VU19OT1RMQVNUKSx0b2dnbGVBbHQsIjE2IiwiMTYiLG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0b2dnbGVBbHQgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIkFMVF9PUEVOIik7Ci0gICAgICAgICAgaWYgKGlzTGFzdENoaWxkKQotICAgICAgICAgICAgdG9nZ2xlSW1hZ2VUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KE5vZGVNYW5hZ2VyLlBBVEhfUExVU19MQVNUKSx0b2dnbGVBbHQsIjE2IiwiMTYiLG51bGwpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRvZ2dsZUltYWdlVGFnID0gSFRNTFV0aWxzLmdldEhUTUxJbWFnZVRhZyhyZXNwb25zZSxub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFBhdGhXaXRoQ29udGV4dChOb2RlTWFuYWdlci5QQVRIX1BMVVNfTk9UTEFTVCksdG9nZ2xlQWx0LCIxNiIsIjE2IixudWxsKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbGlua1RhZyA9IEhUTUxVdGlscy5nZXRIVE1MTGlua1RhZyhyZXNwb25zZSxocmVmLGdldFRvZ2dsZU5vZGVBY3Rpb25UYXJnZXQoKSxTdHJpbmcudmFsdWVPZihub2RlSWRfKSx0b2dnbGVJbWFnZVRhZyxudWxsKTsKLSAgICAgICAgdHJlZVZpZXcuYXBwZW5kKGxpbmtUYWcpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyA8aW1nLi4uPgotICAgICAgICBpZiAoaXNMYXN0Q2hpbGQpCi0gICAgICAgICAgdG9nZ2xlSW1hZ2VUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KE5vZGVNYW5hZ2VyLlBBVEhfTElORV9MQVNUKSwiIiwiMTYiLCIxNiIsbnVsbCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0b2dnbGVJbWFnZVRhZyA9IEhUTUxVdGlscy5nZXRIVE1MSW1hZ2VUYWcocmVzcG9uc2Usbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRQYXRoV2l0aENvbnRleHQoTm9kZU1hbmFnZXIuUEFUSF9MSU5FX05PVExBU1QpLCIiLCIxNiIsIjE2IixudWxsKTsKLSAgICAgICAgdHJlZVZpZXcuYXBwZW5kKHRvZ2dsZUltYWdlVGFnKTsKLSAgICAgIH0KLSAgICAgIHRyZWVWaWV3LmFwcGVuZCgiPC90ZD4iKS5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCk7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5rQWN0aW9uVGFyZ2V0KCkKLSAgewotICAgIHJldHVybiBGcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRPcGVuSW1hZ2VQYXRoKCkKLSAgewotICAgIHJldHVybiBpbWFnZVBhdGhfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDbG9zZWRJbWFnZVBhdGgoKQotICB7Ci0gICAgcmV0dXJuIGltYWdlUGF0aF87Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRIVE1MTGFiZWwoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSxTdHJpbmdCdWZmZXIgdHJlZVZpZXcsYm9vbGVhbiBpc0xhc3RDaGlsZCkKLSAgewotICAgIC8vIDxhIGhyZWY9Ii4uLiIgdGFyZ2V0PSIuLi4iIG9uQ2xpY2s9InNlbGVjdE5vZGUoJy4uLicpIj48aW1nLi4uPjwvYT4KLSAgICBIYXNodGFibGUgYWRkaXRpb25hbEF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgYWRkaXRpb25hbEF0dHJpYnV0ZXMucHV0KCJuYW1lIixhbmNob3JOYW1lXyk7Ci0gICAgU3RyaW5nIGltYWdlUGF0aCA9IChub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlSWQoKSA9PSBub2RlSWRfKT9nZXRPcGVuSW1hZ2VQYXRoKCk6Z2V0Q2xvc2VkSW1hZ2VQYXRoKCk7Ci0KLSAgICBTdHJpbmcgaW1hZ2VUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KGltYWdlUGF0aCksIiIsIjE2IiwiMTYiLGFkZGl0aW9uYWxBdHRyaWJ1dGVzKTsKLSAgICBTdHJpbmcgYmFzZUhyZWYgPSBnZXRMaW5rQWN0aW9uSHJlZigpOwotICAgIFN0cmluZyBocmVmID0gKChiYXNlSHJlZiA9PSBudWxsKT9iYXNlSHJlZjpub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFBhdGhXaXRoQ29udGV4dChiYXNlSHJlZikpOwotICAgIFN0cmluZyB0YXJnZXQgPSBnZXRMaW5rQWN0aW9uVGFyZ2V0KCk7Ci0gICAgYWRkaXRpb25hbEF0dHJpYnV0ZXMuY2xlYXIoKTsKLQotICAgIHRyZWVWaWV3LmFwcGVuZCgiICAgIDx0ZCBhbGlnbj1cImxlZnRcIiB3aWR0aD0xNiBoZWlnaHQ9MTYgbm93cmFwPiIpOwotICAgIGlmIChocmVmICE9IG51bGwpCi0gICAgICB0cmVlVmlldy5hcHBlbmQoSFRNTFV0aWxzLmdldEhUTUxMaW5rVGFnKHJlc3BvbnNlLGhyZWYsdGFyZ2V0LG51bGwsaW1hZ2VUYWcsYWRkaXRpb25hbEF0dHJpYnV0ZXMpKTsKLSAgICBlbHNlCi0gICAgICB0cmVlVmlldy5hcHBlbmQoaW1hZ2VUYWcpOwotICAgIHRyZWVWaWV3LmFwcGVuZCgiPC90ZD4iKS5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKTsKLSAgICB0cmVlVmlldy5hcHBlbmQoIiAgICA8dGQgYWxpZ249XCJsZWZ0XCIgd2lkdGg9MyBoZWlnaHQ9MTAgbm93cmFwPiIpLmFwcGVuZChIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KE5vZGVNYW5hZ2VyLlBBVEhfU1BBQ0UpLCIiLCIzIiwiMTAiLG51bGwpKS5hcHBlbmQoIjwvdGQ+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0KLSAgICAvLyA8YSBuYW1lPSIuLi4iIGhyZWY9Ii4uLiIgdGFyZ2V0PSIuLi4iPmxhYmVsPC9hPgotICAgIHRyZWVWaWV3LmFwcGVuZCgiICAgIDx0ZCBhbGlnbj1cImxlZnRcIiBub3dyYXA+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgdHJlZVZpZXcuYXBwZW5kKCIgICAgICAiKTsKLSAgICBpZiAoaHJlZiAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB0ZXh0QW5jaG9yQ2xhc3M7Ci0gICAgICBpZiAobm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZUlkKCkgPT0gbm9kZUlkXykKLSAgICAgICAgdGV4dEFuY2hvckNsYXNzPSJzZWxlY3RlZFRleHRBbmNob3IiOwotICAgICAgZWxzZQotICAgICAgICB0ZXh0QW5jaG9yQ2xhc3M9InVuc2VsZWN0ZWRUZXh0QW5jaG9yIjsKLSAgICAgIGFkZGl0aW9uYWxBdHRyaWJ1dGVzLnB1dCgiY2xhc3MiLHRleHRBbmNob3JDbGFzcyk7Ci0gICAgICB0cmVlVmlldy5hcHBlbmQoSFRNTFV0aWxzLmdldEhUTUxMaW5rVGFnKHJlc3BvbnNlLGhyZWYsdGFyZ2V0LGFuY2hvck5hbWVfLGdldE5vZGVOYW1lKCksYWRkaXRpb25hbEF0dHJpYnV0ZXMpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgdHJlZVZpZXcuYXBwZW5kKCI8c3Ryb25nPiIpLmFwcGVuZChnZXROb2RlTmFtZSgpKS5hcHBlbmQoIjwvc3Ryb25nPiIpOwotICAgIHRyZWVWaWV3LmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpLmFwcGVuZCgiICAgIDwvdGQ+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW5kZXJOb2RlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsU3RyaW5nQnVmZmVyIHRyZWVWaWV3LFN0cmluZyBwcmVmaXhDb2x1bW5zLGJvb2xlYW4gaXNMYXN0Q2hpbGQpCi0gIHsKLSAgICBTdHJpbmcgc3BhY2VfMTZ4MTYgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0UGF0aFdpdGhDb250ZXh0KE5vZGVNYW5hZ2VyLlBBVEhfU1BBQ0UpLCIiLCIxNiIsIjE2IixudWxsKTsKLSAgICBTdHJpbmcgbGluZV8xNngxNiA9IEhUTUxVdGlscy5nZXRIVE1MSW1hZ2VUYWcocmVzcG9uc2Usbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRQYXRoV2l0aENvbnRleHQoTm9kZU1hbmFnZXIuUEFUSF9MSU5FKSwiIiwiMTYiLCIxNiIsbnVsbCk7Ci0KLSAgICAvLyBVc2UgYm9yZGVyPTEgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy4KLSAgICB0cmVlVmlldy5hcHBlbmQoIjx0YWJsZSBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgdHJlZVZpZXcuYXBwZW5kKCIgIDx0cj4iKS5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKTsKLSAgICB0cmVlVmlldy5hcHBlbmQoIiAgICA8dGQgYWxpZ249XCJsZWZ0XCIgd2lkdGg9MTYgaGVpZ2h0PTE2IG5vd3JhcD4iKS5hcHBlbmQoc3BhY2VfMTZ4MTYpLmFwcGVuZCgiPC90ZD4iKS5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKTsKLSAgICBTdHJpbmdCdWZmZXIgbmV3UHJlZml4Q29sdW1ucyA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4Q29sdW1ucyk7Ci0gICAgaWYgKG5vZGVEZXB0aF8gPj0gMikKLSAgICB7Ci0gICAgICBpZiAocHJlZml4Q29sdW1ucy5sZW5ndGgoKSA+IDApCi0gICAgICAgIHRyZWVWaWV3LmFwcGVuZChwcmVmaXhDb2x1bW5zKS5hcHBlbmQoSFRNTFV0aWxzLkxJTkVfU0VQQVJBVE9SKTsKLSAgICAgIC8vIGdlbmVyYXRlIGEgbmV3IHByZWZpeCBjb2x1bW5zLgotICAgICAgbmV3UHJlZml4Q29sdW1ucy5hcHBlbmQoIiAgICA8dGQgYWxpZ249XCJsZWZ0XCIgd2lkdGg9MTYgaGVpZ2h0PTE2IG5vd3JhcD4iKTsKLSAgICAgIGlmIChpc0xhc3RDaGlsZCkKLSAgICAgICAgbmV3UHJlZml4Q29sdW1ucy5hcHBlbmQoc3BhY2VfMTZ4MTYpOwotICAgICAgZWxzZQotICAgICAgICBuZXdQcmVmaXhDb2x1bW5zLmFwcGVuZChsaW5lXzE2eDE2KTsKLSAgICAgIG5ld1ByZWZpeENvbHVtbnMuYXBwZW5kKCI8L3RkPiIpLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotICAgIH0KLSAgICBhZGRUb2dnbGUocmVzcG9uc2UsdHJlZVZpZXcsaXNMYXN0Q2hpbGQpOwotICAgIGFkZEhUTUxMYWJlbChyZXNwb25zZSx0cmVlVmlldyxpc0xhc3RDaGlsZCk7Ci0gICAgdHJlZVZpZXcuYXBwZW5kKCIgIDwvdHI+IikuYXBwZW5kKEhUTUxVdGlscy5MSU5FX1NFUEFSQVRPUik7Ci0gICAgdHJlZVZpZXcuYXBwZW5kKCI8L3RhYmxlPiIpLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotICAgIGludCBudW1iZXJPZkNoaWxkTm9kZXMgPSBjaGlsZE5vZGVzXy5zaXplKCk7Ci0gICAgaWYgKG51bWJlck9mQ2hpbGROb2RlcyA+IDApCi0gICAgewotICAgICAgaWYgKGlzT3Blbl8pCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPG51bWJlck9mQ2hpbGROb2Rlcy0xO2krKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpY2hpbGROb2Rlc18uZWxlbWVudEF0KGkpOwotICAgICAgICAgIGNoaWxkTm9kZS5yZW5kZXJOb2RlKHJlc3BvbnNlLHRyZWVWaWV3LG5ld1ByZWZpeENvbHVtbnMudG9TdHJpbmcoKSxmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZSBsYXN0Q2hpbGROb2RlID0gKE5vZGUpY2hpbGROb2Rlc18uZWxlbWVudEF0KG51bWJlck9mQ2hpbGROb2Rlcy0xKTsKLSAgICAgICAgbGFzdENoaWxkTm9kZS5yZW5kZXJOb2RlKHJlc3BvbnNlLHRyZWVWaWV3LG5ld1ByZWZpeENvbHVtbnMudG9TdHJpbmcoKSx0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBGb3Igc29ydGluZyBwdXJwb3Nlcy4gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBnZXROb2RlTmFtZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvTm9kZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Ob2RlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGJlNWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9Ob2RlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE5vZGVNYW5hZ2VyCi17Ci0gIC8vIHBhdGhzIHRvIGljb24gaW1hZ2VzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfUExVU19OT1RMQVNUID0gImltYWdlcy9wbHVzX25vdGxhc3QuZ2lmIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9QTFVTX0xBU1QgPSAiaW1hZ2VzL3BsdXNfbGFzdC5naWYiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX01JTlVTX05PVExBU1QgPSAiaW1hZ2VzL21pbnVzX25vdGxhc3QuZ2lmIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9NSU5VU19MQVNUID0gImltYWdlcy9taW51c19sYXN0LmdpZiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTElORSA9ICJpbWFnZXMvbGluZS5naWYiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xJTkVfTk9UTEFTVCA9ICJpbWFnZXMvbGluZV9ub3RsYXN0LmdpZiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTElORV9MQVNUID0gImltYWdlcy9saW5lX2xhc3QuZ2lmIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TUEFDRSA9ICJpbWFnZXMvc3BhY2UuZ2lmIjsKLQotICBwcml2YXRlIENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIHByaXZhdGUgTm9kZSByb290Tm9kZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIG5vZGVUYWJsZV87Ci0gIHByaXZhdGUgaW50IGZvY3VzZWROb2RlSWRfOwotICBwcml2YXRlIGludCBzZWxlY3RlZE5vZGVJZF87Ci0gIHByaXZhdGUgaW50IHByZXZpb3VzU2VsZWN0ZWROb2RlSWRfOwotICBwcml2YXRlIGludCBtYXhEZXB0aFZpc2libGVfOwotICBwcml2YXRlIGludCBuZXh0SWRfOwotCi0gIHB1YmxpYyBOb2RlTWFuYWdlcihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7Ci0gICAgcm9vdE5vZGVfID0gbnVsbDsKLSAgICBub2RlVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZvY3VzZWROb2RlSWRfID0gLTE7Ci0gICAgc2VsZWN0ZWROb2RlSWRfID0gLTE7Ci0gICAgcHJldmlvdXNTZWxlY3RlZE5vZGVJZF8gPSAtMTsKLSAgICBtYXhEZXB0aFZpc2libGVfID0gMTsKLSAgICBuZXh0SWRfID0gMDsKLSAgfQotCi0gIC8qKgotICAqIEhvb2sgZm9yIHRoZSBjb250cm9sbGVyLgotICAqIEByZXR1cm4gQ29udHJvbGxlciBUaGUgcGVyc3BlY3RpdmUgY29udHJvbGxlci4KLSAgKi8KLSAgcHVibGljIENvbnRyb2xsZXIgZ2V0Q29udHJvbGxlcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl87Ci0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSByb290IG5vZGUgb2YgdGhlIHRyZWUuCi0gICogQHBhcmFtIHJvb3ROb2RlIFRoZSBub2RlIGJlaW5nIGRlc2lnbmF0ZWQgYXMgdGhlIHJvb3Qgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Um9vdE5vZGUoTm9kZSByb290Tm9kZSkKLSAgewotICAgIHJvb3ROb2RlXyA9IHJvb3ROb2RlOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIG1hbmFnZWQgYnkgdGhpcyBOb2RlTWFuYWdlci4KLSAgKiBAcmV0dXJuIE5vZGUgVGhlIHJvb3Qgbm9kZS4KLSAgKi8KLSAgcHVibGljIE5vZGUgZ2V0Um9vdE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIHJvb3ROb2RlXzsKLSAgfQotCi0gIC8qKgotICAqIEBwYXJhbSBJbnRlZ2VyIFRoZSBpZCBvZiB0aGUgbm9kZSBiZWluZyBhZGRlZC4KLSAgKiBAcGFyYW0gTm9kZSBUaGUgbm9kZSBiZWluZyBhZGRlZC4KLSAgKiBAcmV0dXJuIFRoZSBub2RlSWQgYXNzaWduZWQgdG8gdGhpcyBub2RlLgotICAqLwotICBwdWJsaWMgaW50IGFkZFRvTm9kZVRhYmxlKE5vZGUgbm9kZSkKLSAgewotICAgIGludCBhc3NpZ25lZE5vZGVJZCA9IG5leHRJZF87Ci0gICAgbm9kZVRhYmxlXy5wdXQoU3RyaW5nLnZhbHVlT2YoYXNzaWduZWROb2RlSWQpLG5vZGUpOwotICAgIG5leHRJZF8rKzsKLSAgICByZXR1cm4gYXNzaWduZWROb2RlSWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGcm9tTm9kZVRhYmxlKGludCBub2RlSWQpCi0gIHsKLSAgICBWZWN0b3Igbm9kZXNUb1JlbW92ZSA9IG5ldyBWZWN0b3IoKTsKLSAgICBOb2RlIG5vZGUgPSBnZXROb2RlKG5vZGVJZCk7Ci0gICAgZ2F0aGVyTm9kZXNUb1JlbW92ZShub2Rlc1RvUmVtb3ZlLCBub2RlKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gbm9kZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICBub2RlVGFibGVfLnJlbW92ZShTdHJpbmcudmFsdWVPZigoKE5vZGUpaXQubmV4dCgpKS5nZXROb2RlSWQoKSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnYXRoZXJOb2Rlc1RvUmVtb3ZlKFZlY3RvciBub2Rlc1RvUmVtb3ZlLCBOb2RlIG5vZGUpIHsKLSAgICBpZiAobm9kZSAhPSBudWxsKSB7Ci0gICAgICBub2Rlc1RvUmVtb3ZlLmFkZChub2RlKTsKLSAgICAgIFZlY3RvciBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGROb2Rlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgIGdhdGhlck5vZGVzVG9SZW1vdmUobm9kZXNUb1JlbW92ZSwgKE5vZGUpaXQubmV4dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBkZXB0aCBvZiB0aGUgZGVlcGVzdCB2aXNpYmxlIG5vZGUgaW4gdGhlIHRyZWUuCi0gICogQHJldHVybiBpbnQKLSAgKi8KLSAgcHVibGljIGludCBnZXRNYXhEZXB0aFZpc2libGUoKQotICB7Ci0gICAgcmV0dXJuIG1heERlcHRoVmlzaWJsZV87Ci0gIH0KLQotICAvKioKLSAgKiBVcGRhdGVzIHRoZSBkZXB0aCBvZiB0aGUgZGVlcGVzdCB2aXNpYmxlIG5vZGUgaW4gdGhlIHRyZWUuIE5vZGVzCi0gICogbXVzdCBjYWxsIHRoaXMgd2hlbiB0aGUgdmlzaWJpbGl0eSBvZiB0aGVpciBjaGlsZHJlbiBjaGFuZ2VzLgotICAqIChlLmcuIGV4cGFuZC9jb2xsYXBzZSBvZiBhIHBhcmVudCBub2RlKS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdXBkYXRlTWF4RGVwdGhWaXNpYmxlKCkKLSAgewotICAgIGlmIChyb290Tm9kZV8gIT0gbnVsbCkKLSAgICAgIG1heERlcHRoVmlzaWJsZV8gPSByb290Tm9kZV8uZ2V0TWF4RGVwdGhWaXNpYmxlKCk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuZXh0IGF2YWlsYWJsZSBpZCBmb3IgYSBuZXdseSBjcmVhdGVkIG5vZGUuCi0gICogQHJldHVybiBpbnQKLSAgKi8KLSAgcHVibGljIGludCBnZXROZXh0Tm9kZUlkKCkKLSAgewotICAgIHJldHVybiBuZXh0SWRfOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBmb2N1c2VkIG5vZGUgaW4gdGhlIHRyZWUuIEEgbm9kZQotICAqIGJlY29tZXMgZm9jdXNlZCB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyBvY2N1cjoKLSAgKiAxKSBUaGUgbm9kZSdzIGljb24gb3IgaW1hZ2UgYXJlIHNlbGVjdGVkIGJ5IGEgdXNlci4KLSAgKiAyKSBUaGUgbm9kZSdzIGV4cGFuZC9jb2xsYXBzZSBpY29uIGlzIGNsaWNrZWQuCi0gICogMykgUHJvZ3JhbW1hdGljYWxseSBzZXQgYnkgdGhlIHByb2dyYW1tZXIuCi0gICogVGhlIHRyZWV2aWV3IHdpbGwgYWx3YXlzIHNjcm9sbCB0byB0aGUgY3VycmVudCBmb2N1c2VkIG5vZGUgd2hlbiBsb2FkZWQuCi0gICogQHJldHVybiBpbnQgVGhlIGlkLgotICAqLwotICBwdWJsaWMgaW50IGdldEZvY3VzZWROb2RlSWQoKQotICB7Ci0gICAgcmV0dXJuIGZvY3VzZWROb2RlSWRfOwotICB9Ci0KLSAgLyoqCi0gICogQWxsb3dzIG1vZGlmaWNhdGlvbiBvZiB0aGUgZm9jdXNlZCBub2RlLgotICAqIEBwYXJhbSBpbnQgVGhlIGlkIG9mIHRoZSBub2RlIHRoYXQgaXMgaW4gZm9jdXMuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEZvY3VzZWROb2RlSWQoaW50IG5vZGVJZCkKLSAgewotICAgIGZvY3VzZWROb2RlSWRfID0gbm9kZUlkOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Rm9jdXNlZE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGdldE5vZGUoZm9jdXNlZE5vZGVJZF8pOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBub2RlIGluIHRoZSB0cmVlLgotICAqIEByZXR1cm4gaW50IFRoZSBpZC4KLSAgKi8KLSAgcHVibGljIGludCBnZXRTZWxlY3RlZE5vZGVJZCgpCi0gIHsKLSAgICByZXR1cm4gc2VsZWN0ZWROb2RlSWRfOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0U2VsZWN0ZWROb2RlKCkKLSAgewotICAgIHJldHVybiBnZXROb2RlKHNlbGVjdGVkTm9kZUlkXyk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXRyaWV2ZSBhIHJlZmVyZW5jZSB0byBhIE5vZGUgaW4gdGhpcyBtYW5hZ2VyJ3Mgbm9kZSB0YWJsZS4KLSAgKiBAcmV0dXJuIE5vZGUgVGhlIG5vZGUuCi0gICovCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoaW50IG5vZGVJZCkKLSAgewotICAgIHJldHVybiAoTm9kZSlub2RlVGFibGVfLmdldChTdHJpbmcudmFsdWVPZihub2RlSWQpKTsKLSAgfQotCi0gIC8qKgotICAqIEFsbG93cyBtb2RpZmljYXRpb24gb2YgdGhlIHNlbGVjdGVkIE5vZGUuIE5vdGUgdGhhdCBzZXR0aW5nIGEgbm9kZSB0byBiZWNvbWUKLSAgKiBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5IG1ha2VzIGl0IHRoZSBmb2N1c2VkIG5vZGUuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBhIG9uZQotICAqIHdheSByZWxhdGlvbnNoaXAuCi0gICogQHBhcmFtIGludCBUaGUgaWQgb2YgdGhlIG5vZGUgdGhhdCBpcyBiZWluZyBzZWxlY3RlZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWROb2RlSWQoaW50IG5vZGVJZCkKLSAgewotICAgIHByZXZpb3VzU2VsZWN0ZWROb2RlSWRfID0gc2VsZWN0ZWROb2RlSWRfOwotICAgIHNlbGVjdGVkTm9kZUlkXyA9IG5vZGVJZDsKLSAgICBzZXRGb2N1c2VkTm9kZUlkKHNlbGVjdGVkTm9kZUlkXyk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFByZXZpb3VzU2VsZWN0ZWROb2RlSWQoKQotICB7Ci0gICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0ZWROb2RlSWRfOwotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0UHJldmlvdXNTZWxlY3RlZE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIChOb2RlKW5vZGVUYWJsZV8uZ2V0KFN0cmluZy52YWx1ZU9mKHByZXZpb3VzU2VsZWN0ZWROb2RlSWRfKSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZW5kZXIgdGhlIEhUTUwgdHJlZSB2aWV3IGZvciB0aGlzIG5vZGUuCi0gICogQHBhcmFtIEh0dHBTZXJ2bGV0UmVzcG9uc2UgRm9yIGVuY29kaW5nIFVSTHMuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIEhUTUwgcmVwcmVzZW50aW5nIHRoZSB0cmVlIHZpZXcuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgcmVuZGVyVHJlZVZpZXcoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciB0cmVlVmlldyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICByb290Tm9kZV8ucmVuZGVyTm9kZShyZXNwb25zZSx0cmVlVmlldywiIixmYWxzZSk7Ci0gICAgcmV0dXJuIHRyZWVWaWV3LnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAqIE1ha2UgdGhlIHByb3ZpZGVkIG5vZGUgaXMgdmlzaWJsZSBieSBlbnN1cmluZyB0aGF0IGl0cyBhbmNlc3RvcnMgYXJlIHZpc2libGUuCi0gICogQHBhcmFtIE5vZGUgVGhlIG5vZGUgdG8gYmUgbWFkZSB2aXNpYmxlLgotICAqIEByZXR1cm4gYm9vbGVhbiBJbmRpY2F0b3IgZm9yIHdoZXRoZXIgb3Igbm90IHRoZSB0cmVldmlldyBuZWVkcyByZWZyZXNoaW5nIChpLmUuIGFuIGFuY2VzdG9yIHdhcyBub3QgdmlzaWJsZSkuCi0gICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIG1ha2VOb2RlVmlzaWJsZShOb2RlIG5vZGUpCi0gIHsKLSAgICBib29sZWFuIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoID0gZmFsc2U7Ci0gICAgd2hpbGUgKChub2RlID0gbm9kZS5nZXRQYXJlbnQoKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoIW5vZGUuaXNPcGVuKCkpCi0gICAgICB7Ci0gICAgICAgIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgbm9kZS5zZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbih0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoOwotICB9Ci0gIAotICAvKioKLSAgKiBNYWtlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSB2aXNpYmxlIGJ5IGVuc3VyaW5nIHRoYXQgaXRzIGFuY2VzdG9ycyBhcmUgdmlzaWJsZS4KLSAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gbWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKQotICB7Ci0gICAgcmV0dXJuIG1ha2VOb2RlVmlzaWJsZShnZXRTZWxlY3RlZE5vZGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS9wZXJzcGVjdGl2ZS9QZXJzcGVjdGl2ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM0YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNwZWN0aXZlIGV4dGVuZHMgTWVzc2FnZVByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBDb250cm9sbGVyIGNvbnRyb2xsZXJfOwotICBwcm90ZWN0ZWQgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZV87Ci0KLSAgcHVibGljIFBlcnNwZWN0aXZlKFN0cmluZyBtZXNzYWdlQnVuZGxlRmlsZU5hbWUsQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIobWVzc2FnZUJ1bmRsZUZpbGVOYW1lKTsKLSAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7Ci0gICAgbWVzc2FnZVF1ZXVlXyA9IG5ldyBNZXNzYWdlUXVldWUoKTsKLSAgfQotCi0gIHB1YmxpYyBNZXNzYWdlUXVldWUgZ2V0TWVzc2FnZVF1ZXVlKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlUXVldWVfOwotICB9Ci0KLSAgcHVibGljIENvbnRyb2xsZXIgZ2V0Q29udHJvbGxlcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl87Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFBhbmVzRmlsZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZyYW1lc2V0c0ZpbGUoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9jZXNzRnJhbWVzZXRzRm9ybSgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN3aXRjaFBlcnNwZWN0aXZlRm9ybUFjdGlvbkxpbmsoaW50IHRhcmdldFBlcnNwZWN0aXZlSWQsYm9vbGVhbiBmb3JIaXN0b3J5KTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpOwotCi0gIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSBwZXJzcGVjdGl2ZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgaW5zdGFudGlhdGVkLgotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0UGVyc3BlY3RpdmUoU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pOwotICAKLSAgLy8gTm9kZSBtYW5hZ2VyIGZvciB0aGUgbmF2aWdhdG9yL3RyZWUgY29udGVudCBwYWdlCi0gIHB1YmxpYyBhYnN0cmFjdCBOb2RlTWFuYWdlciBnZXROb2RlTWFuYWdlcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1NlY3Rpb25IZWFkZXJJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvU2VjdGlvbkhlYWRlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1ZjM5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvU2VjdGlvbkhlYWRlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBTZWN0aW9uSGVhZGVySW5mbwotewotICBwcml2YXRlIFN0cmluZyBjb250YWluZXJJZF87Ci0gIHByaXZhdGUgYm9vbGVhbiBkeW5hbWljXzsKLSAgcHJpdmF0ZSBPYmplY3Qgb3RoZXJQcm9wZXJ0aWVzXzsKLQotICBwdWJsaWMgU2VjdGlvbkhlYWRlckluZm8oKQotICB7Ci0gICAgY2xlYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyKCkKLSAgewotICAgIGNvbnRhaW5lcklkXyA9ICIiOwotICAgIGR5bmFtaWNfID0gdHJ1ZTsKLSAgICBvdGhlclByb3BlcnRpZXNfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldENvbnRhaW5lcklkKFN0cmluZyBjb250YWluZXJJZCkKLSAgewotICAgIGNvbnRhaW5lcklkXyA9IGNvbnRhaW5lcklkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRDb250YWluZXJJZCgpCi0gIHsKLSAgICByZXR1cm4gY29udGFpbmVySWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZW5hYmxlRHluYW1pYyhib29sZWFuIGlzRW5hYmxlZCkKLSAgewotICAgIGR5bmFtaWNfID0gaXNFbmFibGVkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEeW5hbWljKCkKLSAgewotICAgIHJldHVybiBkeW5hbWljXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldE90aGVyUHJvcGVydGllcyhPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgb3RoZXJQcm9wZXJ0aWVzXyA9IG9iamVjdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBPYmplY3QgZ2V0T3RoZXJQcm9wZXJ0aWVzKCkKLSAgewotICAgIHJldHVybiBvdGhlclByb3BlcnRpZXNfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvU2V0RGVmYXVsdFZpZXdUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvU2V0RGVmYXVsdFZpZXdUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWYxZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1NldERlZmF1bHRWaWV3VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNldERlZmF1bHRWaWV3VG9vbCBleHRlbmRzIEFjdGlvblRvb2wKLXsKLSAgcHVibGljIFNldERlZmF1bHRWaWV3VG9vbChUb29sTWFuYWdlciB2aWV3VG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHZpZXdUb29sTWFuYWdlciwiaW1hZ2VzL3RvcF9lbmFibGVkLmdpZiIsImltYWdlcy90b3BfaGlnaGxpZ2h0ZWQuZ2lmIixhbHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkZDY3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8vIEEgY2xhc3MgZm9yIHJlcHJlc2VudGluZyB0b29sYmFyIHRvb2xzLgotcHVibGljIGFic3RyYWN0IGNsYXNzIFRvb2wKLXsKLSAgcHJvdGVjdGVkIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZW5hYmxlZEltYWdlTGlua187Ci0gIHByaXZhdGUgU3RyaW5nIGhpZ2hsaWdodGVkSW1hZ2VMaW5rXzsKLSAgcHJpdmF0ZSBTdHJpbmcgYWx0XzsKLSAgcHJvdGVjdGVkIGludCB0b29sSWRfOwotICBwcm90ZWN0ZWQgYnl0ZSB0b29sVHlwZV87Ci0KLSAgcHVibGljIFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGVuYWJsZWRJbWFnZUxpbmssU3RyaW5nIGhpZ2hsaWdodGVkSW1hZ2VMaW5rLFN0cmluZyBhbHQsYnl0ZSB0b29sVHlwZSkKLSAgewotICAgIHRvb2xNYW5hZ2VyXyA9IHRvb2xNYW5hZ2VyOwotICAgIGVuYWJsZWRJbWFnZUxpbmtfID0gZW5hYmxlZEltYWdlTGluazsKLSAgICBoaWdobGlnaHRlZEltYWdlTGlua18gPSBoaWdobGlnaHRlZEltYWdlTGluazsKLSAgICBhbHRfID0gYWx0OwotICAgIHRvb2xJZF8gPSB0b29sTWFuYWdlcl8uYWRkVG9vbCh0aGlzKTsKLSAgICB0b29sVHlwZV8gPSB0b29sVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KTsKLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25UYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIEZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUE7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgZ2VuZXJhdGVPbk1vdXNlVmFsdWUoU3RyaW5nQnVmZmVyIHZhbHVlLEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsU3RyaW5nIGZ1bGxJbWFnZUxpbmspCi0gIHsKLSAgICB2YWx1ZS5hcHBlbmQoInNyYz0nIikuYXBwZW5kKHJlc3BvbnNlLmVuY29kZVVSTChmdWxsSW1hZ2VMaW5rKSkuYXBwZW5kKCdcJycpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyByZW5kZXJUb29sKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgSGFzaHRhYmxlIGpzSW1hZ2VQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIFN0cmluZ0J1ZmZlciBwcm9wZXJ0eVZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZyBmdWxsRW5hYmxlZEltYWdlTGluayA9IGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGVuYWJsZWRJbWFnZUxpbmtfKTsKLSAgICBnZW5lcmF0ZU9uTW91c2VWYWx1ZShwcm9wZXJ0eVZhbHVlLHJlc3BvbnNlLGZ1bGxFbmFibGVkSW1hZ2VMaW5rKTsKLSAgICBpbnQgcHJvcGVydHlWYWx1ZUxlbmd0aCA9IHByb3BlcnR5VmFsdWUubGVuZ3RoKCk7Ci0gICAganNJbWFnZVByb3BlcnRpZXMucHV0KCJjbGFzcyIsIm5vcm1hbCIpOwotICAgIGpzSW1hZ2VQcm9wZXJ0aWVzLnB1dCgib25Nb3VzZU91dCIscHJvcGVydHlWYWx1ZS5hcHBlbmQoIjttb3VzZW91dCh0aGlzKSIpLnRvU3RyaW5nKCkpOwotICAgIHByb3BlcnR5VmFsdWUuZGVsZXRlKHByb3BlcnR5VmFsdWVMZW5ndGgscHJvcGVydHlWYWx1ZS5sZW5ndGgoKSk7Ci0gICAganNJbWFnZVByb3BlcnRpZXMucHV0KCJvbk1vdXNlVXAiLHByb3BlcnR5VmFsdWUuYXBwZW5kKCI7bW91c2V1cCh0aGlzKSIpLnRvU3RyaW5nKCkpOwotICAgIHByb3BlcnR5VmFsdWUuc2V0TGVuZ3RoKDApOwotICAgIGdlbmVyYXRlT25Nb3VzZVZhbHVlKHByb3BlcnR5VmFsdWUscmVzcG9uc2UsY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoaGlnaGxpZ2h0ZWRJbWFnZUxpbmtfKSk7Ci0gICAgcHJvcGVydHlWYWx1ZUxlbmd0aCA9IHByb3BlcnR5VmFsdWUubGVuZ3RoKCk7Ci0gICAganNJbWFnZVByb3BlcnRpZXMucHV0KCJvbk1vdXNlT3ZlciIscHJvcGVydHlWYWx1ZS5hcHBlbmQoIjttb3VzZW92ZXIodGhpcykiKS50b1N0cmluZygpKTsKLSAgICBwcm9wZXJ0eVZhbHVlLmRlbGV0ZShwcm9wZXJ0eVZhbHVlTGVuZ3RoLHByb3BlcnR5VmFsdWUubGVuZ3RoKCkpOwotICAgIGpzSW1hZ2VQcm9wZXJ0aWVzLnB1dCgib25Nb3VzZURPd24iLHByb3BlcnR5VmFsdWUuYXBwZW5kKCI7bW91c2Vkb3duKHRoaXMpIikudG9TdHJpbmcoKSk7Ci0KLSAgICBTdHJpbmcgaW1hZ2VUYWcgPSBIVE1MVXRpbHMuZ2V0SFRNTEltYWdlVGFnKHJlc3BvbnNlLGZ1bGxFbmFibGVkSW1hZ2VMaW5rLGFsdF8sIjE2IiwiMTYiLGpzSW1hZ2VQcm9wZXJ0aWVzKTsKLSAgICByZXR1cm4gSFRNTFV0aWxzLmdldEhUTUxMaW5rVGFnKHJlc3BvbnNlLGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGZhbHNlKSksZ2V0U2VsZWN0VG9vbEFjdGlvblRhcmdldCgpLG51bGwsaW1hZ2VUYWcsbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVG9vbE1hbmFnZXIgZ2V0VG9vbE1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xNYW5hZ2VyXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VG9vbElkKCkKLSAgewotICAgIHJldHVybiB0b29sSWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJ5dGUgZ2V0VG9vbFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xUeXBlXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRFbmFibGVkSW1hZ2VMaW5rKCkKLSAgewotICAgIHJldHVybiBlbmFibGVkSW1hZ2VMaW5rXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRIaWdobGlnaHRlZEltYWdlTGluaygpCi0gIHsKLSAgICByZXR1cm4gaGlnaGxpZ2h0ZWRJbWFnZUxpbmtfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFsdFRleHQoKQotICB7Ci0gICAgcmV0dXJuIGFsdF87Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEZvcm1MaW5rKCk7Ci0gIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QWN0aW9uTGluaygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1Rvb2xNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvVG9vbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwYjEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvVG9vbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBUb29sTWFuYWdlcgotewotICBwcml2YXRlIFZlY3RvciB0b29sc187Ci0gIHByaXZhdGUgaW50IHNlbGVjdGVkVG9vbElkXzsKLSAgcHJpdmF0ZSBOb2RlIG5vZGVfOwotCi0gIHB1YmxpYyBUb29sTWFuYWdlcihOb2RlIG5vZGUpCi0gIHsKLSAgICB0b29sc18gPSBuZXcgVmVjdG9yKCk7Ci0gICAgc2VsZWN0ZWRUb29sSWRfID0gMDsKLSAgICBub2RlXyA9IG5vZGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFNlbGVjdGVkVG9vbElkKCkKLSAgewotICAgIHJldHVybiBzZWxlY3RlZFRvb2xJZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IHNldFNlbGVjdGVkVG9vbElkKGludCB0b29sSWQpCi0gIHsKLSAgICBpZiAodG9vbElkID49IDAgJiYgdG9vbElkIDwgdG9vbHNfLnNpemUoKSkKLSAgICAgIHNlbGVjdGVkVG9vbElkXyA9IHRvb2xJZDsKLSAgICByZXR1cm4gc2VsZWN0ZWRUb29sSWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBhZGRUb29sKFRvb2wgdG9vbCkKLSAgewotICAgIHRvb2xzXy5hZGRFbGVtZW50KHRvb2wpOwotICAgIHJldHVybiB0b29sc18uc2l6ZSgpLTE7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVG9vbCBnZXRUb29sKGludCB0b29sSWQpCi0gIHsKLSAgICBpZiAodG9vbElkID49MCAmJiB0b29sSWQgPCBnZXROdW1iZXJPZlRvb2xzKCkpCi0gICAgICByZXR1cm4gKFRvb2wpdG9vbHNfLmVsZW1lbnRBdCh0b29sSWQpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgTGlzdCBnZXRUb29scygpCi0gIHsKLSAgICByZXR1cm4gdG9vbHNfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFRvb2wgZ2V0U2VsZWN0ZWRUb29sKCkKLSAgewotICAgIGlmIChzZWxlY3RlZFRvb2xJZF8gPj0wICYmIHNlbGVjdGVkVG9vbElkXyA8IGdldE51bWJlck9mVG9vbHMoKSkKLSAgICAgIHJldHVybiAoVG9vbCl0b29sc18uZWxlbWVudEF0KHNlbGVjdGVkVG9vbElkXyk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldE51bWJlck9mVG9vbHMoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xzXy5zaXplKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiBub2RlXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3BlcnNwZWN0aXZlL1ZpZXdUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvVmlld1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjMzk4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vcGVyc3BlY3RpdmUvVmlld1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdUb29sIGV4dGVuZHMgRm9ybVRvb2wKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgdmlld1Rvb2xNYW5hZ2Vyc187Ci0KLSAgcHVibGljIFZpZXdUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBlbmFibGVkSW1hZ2VMaW5rLFN0cmluZyBoaWdobGlnaHRlZEltYWdlTGluayxTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsZW5hYmxlZEltYWdlTGluayxoaWdobGlnaHRlZEltYWdlTGluayxhbHQpOwotICAgIHRvb2xUeXBlXyA9IFRvb2xUeXBlcy5WSUVXOwotICAgIHZpZXdUb29sTWFuYWdlcnNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkU2V0RGVmYXVsdFZpZXdUb29sKFRvb2xNYW5hZ2VyIHZpZXdUb29sTWFuYWdlcixpbnQgaW5kZXgpOwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRUb29scyhUb29sTWFuYWdlciB2aWV3VG9vbE1hbmFnZXIsaW50IGluZGV4KTsKLQotICBwdWJsaWMgZmluYWwgVG9vbE1hbmFnZXIgY3JlYXRlVG9vbE1hbmFnZXIoaW50IHZpZXdJZCkKLSAgewotICAgIFRvb2xNYW5hZ2VyIHZpZXdUb29sTWFuYWdlciA9IG5ldyBUb29sTWFuYWdlcih0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpKTsKLSAgICBhZGRUb29scyh2aWV3VG9vbE1hbmFnZXIsdmlld0lkKTsKLSAgICBhZGRTZXREZWZhdWx0Vmlld1Rvb2wodmlld1Rvb2xNYW5hZ2VyLHZpZXdJZCk7Ci0gICAgdmlld1Rvb2xNYW5hZ2Vyc18ucHV0KFN0cmluZy52YWx1ZU9mKHZpZXdJZCksdmlld1Rvb2xNYW5hZ2VyKTsKLSAgICByZXR1cm4gdmlld1Rvb2xNYW5hZ2VyOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFRvb2xNYW5hZ2VyIGdldFRvb2xNYW5hZ2VyKGludCB2aWV3SWQpCi0gIHsKLSAgICByZXR1cm4gKFRvb2xNYW5hZ2VyKSh2aWV3VG9vbE1hbmFnZXJzXy5nZXQoU3RyaW5nLnZhbHVlT2Yodmlld0lkKSkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgY2xlYXJWaWV3VG9vbE1hbmFnZXIoaW50IHZpZXdJZCkKLSAgewotICAgIHZpZXdUb29sTWFuYWdlcnNfLnJlbW92ZShTdHJpbmcudmFsdWVPZih2aWV3SWQpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNsZWFyVmlld1Rvb2xNYW5hZ2VycygpCi0gIHsKLSAgICB2aWV3VG9vbE1hbmFnZXJzXy5jbGVhcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0FkZEl0ZW1zVG9GYXZvcml0ZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQzYWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBBZGRJdGVtc1RvRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgVURESVByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRJdGVtc1RvRmF2b3JpdGVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nW10gc2VsZWN0ZWROb2RlSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICAvLyBUaGUgY2xpZW50IEphdmFzY3JpcHQgZW5mb3JjZXMgdGhlIHJ1bGUgdGhhdCBhdCBsZWFzdCBvbmUgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHRoZSBmb3JtIGNhbiBiZSBzdWJtaXR0ZWQuCi0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyxzZWxlY3RlZE5vZGVJZHMpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nW10gc2VsZWN0ZWROb2RlSWRzID0gKFN0cmluZ1tdKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlNFTEVDVEVEX05PREVJRFMpOwotICAgIEFkZFRvRmF2b3JpdGVzQWN0aW9uIGFjdGlvbiA9IG5ldyBBZGRUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIGZvciAoaW50IGk9MDtpPHNlbGVjdGVkTm9kZUlkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGUucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsc2VsZWN0ZWROb2RlSWRzW2ldKTsKLSAgICAgIGlmIChhY3Rpb24uZmF2b3JpdGVFeGlzdHMoKSkgewotICAgICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGUgbm9kZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KHNlbGVjdGVkTm9kZUlkc1tpXSkpOwotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRkFWT1JJVEVfQUxSRUFEWV9FWElTVFMiLG5vZGVOYW1lKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9BZGRQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZGNiNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9BZGRQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai4qOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC4qOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuKjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5hc3NlcnRpb24uKjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1wdWJsaWMgY2xhc3MgQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbiBleHRlbmRzIENvbW1vblB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24KLXsKLSAgcHVibGljIEFkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKHJlZ2lzdHJ5Tm9kZV8gPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotCi0gICAgLy8gaWRzIGZyb20gdWRkaU9iamVjdHNfdGFibGUuanNwCi0gICAgU3RyaW5nW10gc2VsZWN0ZWRCdXNJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lEKTsKLSAgICBpZiAoc2VsZWN0ZWRCdXNJZHMgPT0gbnVsbCB8fCBzZWxlY3RlZEJ1c0lkcy5sZW5ndGggPT0gMCkgewotICAgICAgLy8gU3luY2hyb25pemUgY2xpZW50IHZpZXcgYW5kIHNlcnZlciBtb2RlbCAodWRkaU9iamVjdF90YWJsZS5qc3ApCi0gICAgICBzeW5jaHJvbml6ZVVERElPYmplY3RUYWJsZSgpOwotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19TRUxFQ1RFRF9CVVNfSUQsIHNlbGVjdGVkQnVzSWRzKTsKLSAgICAgIC8vIFN5bmNocm9uaXplIGNsaWVudCB2aWV3IGFuZCBzZXJ2ZXIgbW9kZWwgKHVkZGlPYmplY3RfdGFibGUuanNwKQotICAgICAgc3luY2hyb25pemVVRERJT2JqZWN0VGFibGUoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmdbXSBhc3NlcnRpb25UeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19UWVBFKTsKLSAgICBpZiAoYXNzZXJ0aW9uVHlwZXMgIT0gbnVsbCAmJiBhc3NlcnRpb25UeXBlcy5sZW5ndGggPiAwKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfVFlQRSwgYXNzZXJ0aW9uVHlwZXMpOwotICAgIGVsc2UKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0KLSAgICBTdHJpbmdbXSBkaXJlY3Rpb25zID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX0RJUkVDVElPTik7Ci0gICAgaWYgKGRpcmVjdGlvbnMgIT0gbnVsbCAmJiBkaXJlY3Rpb25zLmxlbmd0aCA+IDApCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19ESVJFQ1RJT04sIGRpcmVjdGlvbnMpOwotICAgIGVsc2UKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0KLSAgICAvLyBpZiBub3QgeWV0IGxvZ2dlZCBpbiwgdmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGxvZyBpbgotICAgIGlmICghaXNMb2dnZWRJbl8pIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySUQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0KLSAgICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgfQotICAKLSAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHB1Ymxpc2hVUkwpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTCIpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHVzZXJJRCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklEKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklEKTsKLSAgICAgIH0KLSAgCi0gICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh1c2VySUQpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEIikpOwotICAgICAgfQotCi0gICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgaWYgKHJlZ2lzdHJ5Tm9kZV8gPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdpc3RyeUVsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICAvLyBpZiBub3QgeWV0IGxvZ2dlZCBpbiwgbG9nIGluIGZpcnN0Ci0gICAgaWYgKCFpc0xvZ2dlZEluXykgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySUQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgcmVnaXN0cnlFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLCB1c2VySUQsIHBhc3N3b3JkKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gdGUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGllLnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKG1lLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBVRERJUHJveHkgcHJveHkgPSByZWdpc3RyeUVsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICBTdHJpbmcgdXNlcklEID0gcmVnaXN0cnlFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBjcmVkID0gcmVnaXN0cnlFbGVtZW50LmdldENyZWQoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotCi0gICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIG93bmVkIGJ1c2luZXNzCi0gICAgLy8gaWYgbm90LCB0aGUgQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkCi0gICAgaWYgKCFpc0J1c2luZXNzT3duZWQoYnVzRWxlbWVudCkpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PVF9PV05FRF9CVVNJTkVTUyIpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBTdHJpbmdbXSBhc3NlcnRpb25UeXBlcyA9IChTdHJpbmdbXSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19UWVBFKTsKLSAgICAgIFN0cmluZ1tdIGRpcmVjdGlvbnMgPSAoU3RyaW5nW10pcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfRElSRUNUSU9OKTsKLSAgICAgIFN0cmluZyB0aGlzQnVzaW5lc3NLZXkgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKTsKLQotICAgICAgLy8gZ2V0IGFsbCBzZWxlY3RlZCBidXNpbmVzc2VzCi0gICAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXkpOwotICAgICAgVmVjdG9yIHNlbGVjdGVkQnVzaW5lc3NlcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OUyk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gc2VsZWN0ZWRCdXNpbmVzc2VzLmVsZW1lbnRzKCk7Ci0gICAgICBpZiAoIWUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAvLyBjcmVhdGUgYSB2ZWN0b3Igb2YgcHVibGlzaGVyIGFzc2VydGlvbnMgYmFzZWQgb24gYWxsIHRoZSBzZWxlY3RlZCBidXNpbmVzc2VzCi0gICAgICBWZWN0b3IgcHViQXNzZXJ0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgaW50IGkgPSAwOwotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoTGlzdEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICBCdXNpbmVzc0VudGl0eSBzcCA9IChCdXNpbmVzc0VudGl0eSlsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga2V5ZWRSZWYgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoYXNzZXJ0aW9uVHlwZXNbaV0sIGFzc2VydGlvblR5cGVzW2ldLCBUTW9kZWwuUkVMQVRJT05TSElQU19UTU9ERUxfS0VZKTsKLSAgICAgICAgaWYgKEludGVnZXIucGFyc2VJbnQoZGlyZWN0aW9uc1tpXSkgPT0gVURESUFjdGlvbklucHV0cy5ESVJFQ1RJT05fVE8pCi0gICAgICAgICAgcHViQXNzZXJ0aW9uVmVjdG9yLmFkZChuZXcgUHVibGlzaGVyQXNzZXJ0aW9uKHNwLmdldEJ1c2luZXNzS2V5KCksIHRoaXNCdXNpbmVzc0tleSwga2V5ZWRSZWYpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHB1YkFzc2VydGlvblZlY3Rvci5hZGQobmV3IFB1Ymxpc2hlckFzc2VydGlvbih0aGlzQnVzaW5lc3NLZXksIHNwLmdldEJ1c2luZXNzS2V5KCksIGtleWVkUmVmKSk7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLQotICAgICAgLy8gcHJveHkuYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMoLi4uKQotICAgICAgRGlzcG9zaXRpb25SZXBvcnQgcmVwb3J0ID0gcHJveHkuYWRkX3B1Ymxpc2hlckFzc2VydGlvbnMocmVnaXN0cnlFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIHB1YkFzc2VydGlvblZlY3Rvcik7Ci0KLSAgICAgIC8vIHJlZnJlc2ggcHVibGlzaGVyIGFzc2VydGlvbnMgaWZmIHByb3h5IHJlcG9ydHMgc3VjY2VzcwotICAgICAgaWYgKHJlcG9ydC5zdWNjZXNzKCkpIHsKLSAgICAgICAgc2VsZWN0ZWRCdXNpbmVzc2VzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICAgIFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIHNob3dQQUFjdGlvbiA9IG5ldyBTaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gc2hvd1BBQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgICAgT2JqZWN0IGlkcyA9IHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCk7Ci0gICAgICAgIGlmIChpZHMgIT0gbnVsbCkKLSAgICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCwgaWRzKTsKLSAgICAgICAgc2hvd1BBQWN0aW9uLnJ1bigpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVwb3J0LnN1Y2Nlc3MoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IHJlcG9ydCA9IHVkZGllLmdldERpc3Bvc2l0aW9uUmVwb3J0KCk7Ci0JICBWZWN0b3IgcmVwb3J0RXJySW5mbyA9IHJlcG9ydC5nZXRSZXN1bHRWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3J0RXJySW5mby5zaXplKCk7IGkrKykgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoKFJlc3VsdCkgcmVwb3J0RXJySW5mby5nZXQoaSkpLmdldEVyckluZm8oKS5nZXRUZXh0KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0FkZFRvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0FkZFRvRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzM3YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9BZGRUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQWRkVG9GYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBVRERJTm9kZUFjdGlvbgotewotICBwdWJsaWMgQWRkVG9GYXZvcml0ZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9DaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVnaXN0cnlFeGlzdHMoU3RyaW5nIHJlZ2lzdHJ5TmFtZSxOb2RlIHJlZ2lzdHJ5Tm9kZSkKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9OQU1FLHJlZ2lzdHJ5TmFtZSk7Ci0gICAgcmV0dXJuIGZhdm9yaXRlRXhpc3RzKHRhYmxlLEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGJ1c2luZXNzRXhpc3RzKFN0cmluZyBidXNpbmVzc05hbWUsTm9kZSBidXNpbmVzc05vZGUpCi0gIHsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpYnVzaW5lc3NOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpLmdldEJ1c2luZXNzS2V5KCk7Ci0gICAgU3RyaW5nIGlucXVpcnlVUkwgPSByZWdFbGVtZW50LmdldElucXVpcnlVUkwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19OQU1FLGJ1c2luZXNzTmFtZSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19JTlFVSVJZX0FQSSxpbnF1aXJ5VVJMKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX0tFWSwgYnVzaW5lc3NLZXkpOwotICAgIHJldHVybiBmYXZvcml0ZUV4aXN0cyh0YWJsZSxGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9CVVNJTkVTU19GT0xERVJfTk9ERSk7Ci0gIH0KLQotICAgcHVibGljIGZpbmFsIGJvb2xlYW4gc2VydmljZUV4aXN0cyhTdHJpbmcgc2VydmljZU5hbWUsTm9kZSBzZXJ2aWNlTm9kZSkKLSAgewotICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KXNlcnZpY2VOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKS5nZXRTZXJ2aWNlS2V5KCk7Ci0gICAgU3RyaW5nIGlucXVpcnlVUkwgPSByZWdFbGVtZW50LmdldElucXVpcnlVUkwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX05BTUUsc2VydmljZU5hbWUpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlFVSVJZX0FQSSxpbnF1aXJ5VVJMKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfS0VZLHNlcnZpY2VLZXkpOwotICAgIHJldHVybiBmYXZvcml0ZUV4aXN0cyh0YWJsZSxGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHNlcnZpY2VJbnRlcmZhY2VFeGlzdHMoU3RyaW5nIHNpTmFtZSxOb2RlIHNpTm9kZSkKLSAgewotICAgIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNpRWxlbWVudCA9IChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudClzaU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgdE1vZGVsS2V5ID0gc2lFbGVtZW50LmdldFRNb2RlbCgpLmdldFRNb2RlbEtleSgpOwotICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gcmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSxzaU5hbWUpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfSU5RVUlSWV9BUEksaW5xdWlyeVVSTCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9LRVksdE1vZGVsS2V5KTsKLSAgICByZXR1cm4gZmF2b3JpdGVFeGlzdHModGFibGUsRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfRk9MREVSX05PREUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gYWRkUmVnaXN0cnlUb0Zhdm9yaXRlcyhTdHJpbmcgcmVnaXN0cnlOYW1lLE5vZGUgcmVnaXN0cnlOb2RlKQotICB7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gcmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBpZiAocHVibGlzaFVSTCA9PSBudWxsKQotICAgICAgcHVibGlzaFVSTCA9ICIiOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1JFR0lTVFJZX1BVQkxJU0hfQVBJLHB1Ymxpc2hVUkwpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfUkVHSVNUUllfSU5RVUlSWV9BUEksaW5xdWlyeVVSTCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9SRUdJU1RSWV9OQU1FLHJlZ2lzdHJ5TmFtZSk7Ci0gICAgRW51bWVyYXRpb24gdXNlckRlZmluZWRDYXRlZ29yaWVzRW51bSA9IHJlZ0VsZW1lbnQuZ2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKCk7Ci0gICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0VudW0gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1JFR0lTVFJZX0NBVEVHT1JJRVNfRU5VTSx1c2VyRGVmaW5lZENhdGVnb3JpZXNFbnVtKTsKLSAgICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1BMVUdJTl9NRVRBREFUQV9ESVJFQ1RPUlksY29udHJvbGxlcl8uZ2V0U2VydmxldEVuZ2luZVN0YXRlTG9jYXRpb24oKSk7Ci0gICAgfQotICAgIHJldHVybiBhZGRUb0Zhdm9yaXRlcyh0YWJsZSxGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9GT0xERVJfTk9ERSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBhZGRCdXNpbmVzc1RvRmF2b3JpdGVzKFN0cmluZyBidXNpbmVzc05hbWUsTm9kZSBidXNpbmVzc05vZGUpCi0gIHsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpYnVzaW5lc3NOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpLmdldEJ1c2luZXNzS2V5KCk7Ci0gICAgU3RyaW5nIGlucXVpcnlVUkwgPSByZWdFbGVtZW50LmdldElucXVpcnlVUkwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19OQU1FLGJ1c2luZXNzTmFtZSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19JTlFVSVJZX0FQSSxpbnF1aXJ5VVJMKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX0JVU0lORVNTX0tFWSwgYnVzaW5lc3NLZXkpOwotICAgIHJldHVybiBhZGRUb0Zhdm9yaXRlcyh0YWJsZSxGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9CVVNJTkVTU19GT0xERVJfTk9ERSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGFkZFNlcnZpY2VUb0Zhdm9yaXRlcyhTdHJpbmcgc2VydmljZU5hbWUsTm9kZSBzZXJ2aWNlTm9kZSkKLSAgewotICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KXNlcnZpY2VOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKS5nZXRTZXJ2aWNlS2V5KCk7Ci0gICAgU3RyaW5nIGlucXVpcnlVUkwgPSByZWdFbGVtZW50LmdldElucXVpcnlVUkwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX05BTUUsc2VydmljZU5hbWUpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlFVSVJZX0FQSSxpbnF1aXJ5VVJMKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfS0VZLHNlcnZpY2VLZXkpOwotICAgIHJldHVybiBhZGRUb0Zhdm9yaXRlcyh0YWJsZSxGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gYWRkU2VydmljZUludGVyZmFjZVRvRmF2b3JpdGVzKFN0cmluZyBzaU5hbWUsTm9kZSBzaU5vZGUpCi0gIHsKLSAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBzaUVsZW1lbnQgPSAoU2VydmljZUludGVyZmFjZUVsZW1lbnQpc2lOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHRNb2RlbEtleSA9IHNpRWxlbWVudC5nZXRUTW9kZWwoKS5nZXRUTW9kZWxLZXkoKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IHJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUsc2lOYW1lKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0lOUVVJUllfQVBJLGlucXVpcnlVUkwpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfS0VZLHRNb2RlbEtleSk7Ci0gICAgcmV0dXJuIGFkZFRvRmF2b3JpdGVzKHRhYmxlLEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpOwotICAgIFN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFJlZ2lzdHJ5Tm9kZSkKLSAgICAgIHJldHVybiByZWdpc3RyeUV4aXN0cyhub2RlTmFtZSxub2RlKTsKLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQnVzaW5lc3NOb2RlKQotICAgICAgcmV0dXJuIGJ1c2luZXNzRXhpc3RzKG5vZGVOYW1lLG5vZGUpOwotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTZXJ2aWNlTm9kZSkKLSAgICAgIHJldHVybiBzZXJ2aWNlRXhpc3RzKG5vZGVOYW1lLG5vZGUpOwotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTZXJ2aWNlSW50ZXJmYWNlTm9kZSkKLSAgICAgIHJldHVybiBzZXJ2aWNlSW50ZXJmYWNlRXhpc3RzKG5vZGVOYW1lLG5vZGUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKTsKLSAgICBTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgYm9vbGVhbiBhZGRUb0Zhdm9yaXRlc1Jlc3VsdCA9IGZhbHNlOwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgUmVnaXN0cnlOb2RlKQotICAgIHsKLSAgICAgIGFkZFRvRmF2b3JpdGVzUmVzdWx0ID0gYWRkUmVnaXN0cnlUb0Zhdm9yaXRlcyhub2RlTmFtZSxub2RlKTsKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClub2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gcmVnRWxlbWVudC5nZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoKTsKLSAgICAgIGlmIChlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICB7Ci0gICAgICAgICAgQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeU1vZGVsID0gKENhdGVnb3J5TW9kZWwpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIFRocm93YWJsZSBlcnJvckV4Y2VwdGlvbiA9IGNhdGVnb3J5TW9kZWwuZ2V0RXJyb3JFeGNlcHRpb24oKTsKLSAgICAgICAgICBpZiAoZXJyb3JFeGNlcHRpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0ge2NhdGVnb3J5TW9kZWwuZ2V0RGlzcGxheU5hbWUoKSxlcnJvckV4Y2VwdGlvbi5nZXRNZXNzYWdlKCl9OwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TQVZJTkdfQ0FURUdPUllfREFUQSIsYXJncykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQnVzaW5lc3NOb2RlKQotICAgICAgYWRkVG9GYXZvcml0ZXNSZXN1bHQgPSBhZGRCdXNpbmVzc1RvRmF2b3JpdGVzKG5vZGVOYW1lLG5vZGUpOwotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTZXJ2aWNlTm9kZSkKLSAgICAgIGFkZFRvRmF2b3JpdGVzUmVzdWx0ID0gYWRkU2VydmljZVRvRmF2b3JpdGVzKG5vZGVOYW1lLG5vZGUpOwotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTZXJ2aWNlSW50ZXJmYWNlTm9kZSkKLSAgICAgIGFkZFRvRmF2b3JpdGVzUmVzdWx0ID0gYWRkU2VydmljZUludGVyZmFjZVRvRmF2b3JpdGVzKG5vZGVOYW1lLG5vZGUpOwotICAgIGlmIChhZGRUb0Zhdm9yaXRlc1Jlc3VsdCkKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19GQVZPUklURV9BRERFRCIsbm9kZU5hbWUpKTsKLSAgICBlbHNlCi0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZBVk9SSVRFX05PVF9BRERFRCIsbm9kZU5hbWUpKTsKLSAgICByZXR1cm4gYWRkVG9GYXZvcml0ZXNSZXN1bHQ7ICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGFkZFRvRmF2b3JpdGVzKEhhc2h0YWJsZSB0YWJsZSwgU3RyaW5nIHJlbCkKLSAgewotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBmYXZOb2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgVHJlZUVsZW1lbnQgZmF2Um9vdEVsZW1lbnQgPSBmYXZOb2RlTWFuYWdlci5nZXRSb290Tm9kZSgpLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IGZhdlJvb3RFbGVtZW50LmdldEVsZW1lbnRzKHJlbCk7Ci0gICAgaWYgKCFlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQgZmF2Rm9sZGVyRWxlbWVudCA9IChGYXZvcml0ZXNGb2xkZXJFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICByZXR1cm4gZmF2Rm9sZGVyRWxlbWVudC5hZGRGYXZvcml0ZSh0YWJsZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cyhIYXNodGFibGUgdGFibGUsIFN0cmluZyByZWwpCi0gIHsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgZmF2Tm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIFRyZWVFbGVtZW50IGZhdlJvb3RFbGVtZW50ID0gZmF2Tm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBmYXZSb290RWxlbWVudC5nZXRFbGVtZW50cyhyZWwpOwotICAgIGlmICghZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IGZhdkZvbGRlckVsZW1lbnQgPSAoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgcmV0dXJuIGZhdkZvbGRlckVsZW1lbnQuZmF2b3JpdGVFeGlzdHModGFibGUpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0J1c1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTYxMjQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci0KLXB1YmxpYyBjbGFzcyBCdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uIGV4dGVuZHMgUHVibGlzaEFjdGlvbgotewotICBwcml2YXRlIFJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24gcmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbl87Ci0gIHB1YmxpYyBCdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25fID0gbmV3IFJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8gPSByZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uXy5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBOb2RlIGJ1c2luZXNzTm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIEJ1c2luZXNzRWxlbWVudCBidXNpbmVzc0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KWJ1c2luZXNzTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEJ1c2luZXNzRW50aXR5IGJ1c2luZXNzRW50aXR5ID0gYnVzaW5lc3NFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCk7Ci0gICAgTGlzdEVsZW1lbnQgYnVzTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQoYnVzaW5lc3NFbnRpdHkpOwotICAgIFZlY3RvciBzZXJ2aWNlQnVzaW5lc3NDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkuYWRkRWxlbWVudChidXNMaXN0RWxlbWVudCk7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSxzZXJ2aWNlQnVzaW5lc3NDb3B5KTsKLSAgICBib29sZWFuIHJlc3VsdCA9IHJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25fLnByb2Nlc3NPdGhlcnMocGFyc2VyLGZvcm1Ub29sUEkpOwotICAgIGlmICghcHJvcGVydHlUYWJsZV8uY29udGFpbnNLZXkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIpKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSLGJ1c2luZXNzRW50aXR5KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiByZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uXy5ydW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9CdXNQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9CdXNQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTlkYTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotCi1wdWJsaWMgY2xhc3MgQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24gZXh0ZW5kcyBQdWJsaXNoQWN0aW9uCi17Ci0gIHByaXZhdGUgUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24gcmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25fOwotCi0gIHB1YmxpYyBCdXNQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICByZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbl8gPSBuZXcgUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8gPSByZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbl8uZ2V0UHJvcGVydHlUYWJsZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgTm9kZSBidXNpbmVzc05vZGUgPSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzaW5lc3NFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClidXNpbmVzc05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBCdXNpbmVzc0VudGl0eSBidXNpbmVzc0VudGl0eSA9IGJ1c2luZXNzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpOwotICAgIExpc3RFbGVtZW50IGJ1c0xpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KGJ1c2luZXNzRW50aXR5KTsKLSAgICBWZWN0b3Igc2VydmljZUJ1c2luZXNzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICBzZXJ2aWNlQnVzaW5lc3NDb3B5LmFkZEVsZW1lbnQoYnVzTGlzdEVsZW1lbnQpOwotICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTU19DT1BZLHNlcnZpY2VCdXNpbmVzc0NvcHkpOyAKLSAgICBib29sZWFuIHJlc3VsdCA9IHJlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uXy5wcm9jZXNzT3RoZXJzKHBhcnNlcixmb3JtVG9vbFBJKTsKLSAgICBpZiAoIXByb3BlcnR5VGFibGVfLmNvbnRhaW5zS2V5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUikpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSLGJ1c2luZXNzRW50aXR5KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiByZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbl8ucnVuKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQnVzaW5lc3NHZXRTZXJ2aWNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9CdXNpbmVzc0dldFNlcnZpY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMzA1ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9CdXNpbmVzc0dldFNlcnZpY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIEJ1c2luZXNzR2V0U2VydmljZXNBY3Rpb24gZXh0ZW5kcyBVRERJTm9kZUFjdGlvbgotewotICBwcml2YXRlIEJ1c2luZXNzTm9kZSBidXNOb2RlXzsKLSAgcHVibGljIEJ1c2luZXNzR2V0U2VydmljZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgYnVzTm9kZV8gPSBudWxsOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL0J1c2luZXNzR2V0U2VydmljZXNBY3Rpb25KU1AuanNwP25vZGVJZD0uLi4KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvQnVzaW5lc3NHZXRTZXJ2aWNlc0FjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHZhbGlkYXRlQnVzaW5lc3MoKQotICB7Ci0gICAgaW50IGJ1c05vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIGJ1c05vZGVfID0gKEJ1c2luZXNzTm9kZSlub2RlTWFuYWdlcl8uZ2V0Tm9kZShidXNOb2RlSWQpOwotICAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClidXNOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24gdmVyaWZ5QWN0aW9uID0gbmV3IFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gdmVyaWZ5QWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFLEJvb2xlYW4uVFJVRSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSxidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB2ZXJpZnlBY3Rpb24ucnVuKCk7Ci0gICAgaWYgKHJlc3VsdCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QscHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBCdXNpbmVzc0VudGl0eSBzcCA9IChCdXNpbmVzc0VudGl0eSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKTsKLQotICAgIFJlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTk9ERV9OQU1FX0JVU0lORVNTX1NFUlZJQ0VTIixidXNOb2RlXy5nZXROb2RlTmFtZSgpKSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIsc3ApOyAgICAKLSAgICAKLSAgICBMaXN0RWxlbWVudCBidXNpbmVzc0xpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHNwKTsKLSAgICBidXNpbmVzc0xpc3RFbGVtZW50LnNldFRhcmdldFZpZXdUb29sSW5mbyhidXNOb2RlXy5nZXROb2RlSWQoKSxidXNOb2RlXy5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksYnVzTm9kZV8uZ2V0Vmlld0lkKCkpOwotICAgIFZlY3RvciBidXNpbmVzc0xpc3RWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgYnVzaW5lc3NMaXN0VmVjdG9yLmFkZEVsZW1lbnQoYnVzaW5lc3NMaXN0RWxlbWVudCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTLGJ1c2luZXNzTGlzdFZlY3Rvcik7Ci0gICAgCi0gICAgCi0gICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvckZvbGRlck5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JGb2xkZXJOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNWRiODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvckZvbGRlck5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGNsYXNzIENsZWFyTmF2aWdhdG9yRm9sZGVyTm9kZUFjdGlvbiBleHRlbmRzIENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbgotewotICBwdWJsaWMgQ2xlYXJOYXZpZ2F0b3JGb2xkZXJOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yRm9sZGVyTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvckZvbGRlck5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIGlmICghaXNTdGFsZU5vZGUobm9kZUlkKSkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpOwotICAgICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGVsZW1lbnQuZGlzY29ubmVjdFJlbChlbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoTW9kZWxDb25zdGFudHMuUkVMX0NISUxEUkVOKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZTRiNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhck5hdmlnYXRvck5vZGVBY3Rpb24gZXh0ZW5kcyBDbGVhck5vZGVBY3Rpb24KLXsKLSAgcHVibGljIENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxTdHJpbmcudmFsdWVPZihjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGVJZCgpKSk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJuYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiAicHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiAic3RhdHVzQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9zdGF0dXNfY29udGVudC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY1MTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbiBleHRlbmRzIFVERElQcm9wZXJ0aWVzRm9ybUFjdGlvbgotewotICBwdWJsaWMgQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHNlbGVjdGVkTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZUlkcyAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyxzZWxlY3RlZE5vZGVJZHMpOwotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmdbXSBzZWxlY3RlZE5vZGVJZHMgPSAoU3RyaW5nW10pcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU0VMRUNURURfTk9ERUlEUyk7Ci0gICAgaWYgKHNlbGVjdGVkTm9kZUlkcyAhPSBudWxsKQotICAgIHsKLSAgICAgIENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHNlbGVjdGVkTm9kZUlkcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELHNlbGVjdGVkTm9kZUlkc1tpXSk7Ci0gICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvQ29tbW9uUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Db21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMTQ3MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Db21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQnVzaW5lc3NJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuUmVnaXN0ZXJlZEluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGV4dGVuZHMgVURESVByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0KLSAgcHJvdGVjdGVkIFJlZ2lzdHJ5Tm9kZSByZWdpc3RyeU5vZGVfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvZ2dlZEluXzsKLQotICBwdWJsaWMgQ29tbW9uUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLQotICAgIHJlZ2lzdHJ5Tm9kZV8gPSBnZXRSZWdpc3RyeU5vZGUoKTsKLSAgICBpZiAocmVnaXN0cnlOb2RlXyAhPSBudWxsKQotICAgICAgaXNMb2dnZWRJbl8gPSAoKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGVfLmdldFRyZWVFbGVtZW50KCkpLmlzTG9nZ2VkSW4oKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplVURESU9iamVjdFRhYmxlKCkgewotICAgIFN0cmluZ1tdIHNlbGVjdGVkQnVzSWRzID0gKFN0cmluZ1tdKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXkpOwotICAgIFZlY3RvciBidXNpbmVzc1ZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OUyk7Ci0gICAgTGlzdE1hbmFnZXIgYnVzaW5lc3NDb3B5ID0gKExpc3RNYW5hZ2VyKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRERfUFVCTElTSEVSX0FTU0VSVElPTlNfQ09QWSk7Ci0gICAgaWYgKHNlbGVjdGVkQnVzSWRzID09IG51bGwgfHwgc2VsZWN0ZWRCdXNJZHMubGVuZ3RoIDw9IDApIHsKLSAgICAgIGJ1c2luZXNzVmVjdG9yLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICBidXNpbmVzc0NvcHkuY2xlYXIoKTsKLSAgICB9Ci0gICAgRW51bWVyYXRpb24gZSA9IGJ1c2luZXNzQ29weS5nZXRMaXN0RWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgYm9vbGVhbiBpc0lkRm91bmQgPSBmYWxzZTsKLSAgICAgIExpc3RFbGVtZW50IGxlID0gKExpc3RFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGludCBsaXN0RWxlbWVudFZpZXdJZCA9IGxlLmdldFZpZXdJZCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZEJ1c0lkcy5sZW5ndGg7IGkrKykgewotICAgICAgICBpZiAobGlzdEVsZW1lbnRWaWV3SWQgPT0gSW50ZWdlci5wYXJzZUludChzZWxlY3RlZEJ1c0lkc1tpXSkpIHsKLSAgICAgICAgICBpc0lkRm91bmQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIWlzSWRGb3VuZCkKLSAgICAgICAgYnVzaW5lc3NWZWN0b3IucmVtb3ZlKGxlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1c2luZXNzT3duZWQoQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQpIHsKLSAgICBib29sZWFuIGlzQnVzaW5lc3NPd25lZCA9IGZhbHNlOwotICAgIFN0cmluZyBpc0J1c2luZXNzT3duZWRTdHJpbmcgPSBidXNFbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoVURESU1vZGVsQ29uc3RhbnRzLklTX0JVU0lORVNTX09XTkVEKTsKLSAgICBpZiAoaXNCdXNpbmVzc093bmVkU3RyaW5nICE9IG51bGwpIHsKLSAgICAgIGlzQnVzaW5lc3NPd25lZCA9IEJvb2xlYW4udmFsdWVPZihpc0J1c2luZXNzT3duZWRTdHJpbmcpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChpc0xvZ2dlZEluXykgewotICAgICAgdHJ5IHsKLSAgICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgICBSZWdpc3RlcmVkSW5mbyByaSA9IHByb3h5LmdldF9yZWdpc3RlcmVkSW5mbyhyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCkpOwotICAgICAgICBWZWN0b3IgYmVWZWN0b3IgPSByaS5nZXRCdXNpbmVzc0luZm9zKCkuZ2V0QnVzaW5lc3NJbmZvVmVjdG9yKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBiZVZlY3Rvci5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7IAotICAgICAgICAgIEJ1c2luZXNzSW5mbyBiaSA9IChCdXNpbmVzc0luZm8paXQubmV4dCgpOwotICAgICAgICAgIGlmIChiaS5nZXRCdXNpbmVzc0tleSgpLmVxdWFscyhidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKSkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBpc0J1c2luZXNzT3duZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1c0VsZW1lbnQuc2V0UHJvcGVydHlBc1N0cmluZyhVRERJTW9kZWxDb25zdGFudHMuSVNfQlVTSU5FU1NfT1dORUQsIFN0cmluZy52YWx1ZU9mKGlzQnVzaW5lc3NPd25lZCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgIH0KLSAgICByZXR1cm4gaXNCdXNpbmVzc093bmVkOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0NvbXBsZXRlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Db21wbGV0ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3M2I4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL0NvbXBsZXRlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLXB1YmxpYyBjbGFzcyBDb21wbGV0ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gZXh0ZW5kcyBDb21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uCi17Ci0gIHB1YmxpYyBDb21wbGV0ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKHJlZ2lzdHJ5Tm9kZV8gPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotCi0gICAgLy8gaWRzIGZyb20gdWRkaU9iamVjdHNfdGFibGUKLSAgICBTdHJpbmdbXSBzZWxlY3RlZEJ1c0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19TRUxFQ1RFRF9CVVNfSUQpOwotICAgIGlmIChzZWxlY3RlZEJ1c0lkcyAhPSBudWxsICYmIHNlbGVjdGVkQnVzSWRzLmxlbmd0aCA+IDApCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19TRUxFQ1RFRF9CVVNfSUQsIHNlbGVjdGVkQnVzSWRzKTsKLSAgICAvLyBTeW5jaHJvbml6ZSBjbGllbnQgdmlldyBhbmQgc2VydmVyIG1vZGVsICh1ZGRpT2JqZWN0X3RhYmxlLmpzcCkKLSAgICBzeW5jaHJvbml6ZVVERElPYmplY3RUYWJsZSgpOwotCi0gICAgLy8gaWYgbm90IHlldCBsb2dnZWQgaW4sIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCB0byBsb2cgaW4KLSAgICBpZiAoIWlzTG9nZ2VkSW5fKSB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcklEID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotCi0gICAgICBpZiAocHVibGlzaFVSTCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICAgIH0KLSAgCi0gICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhwdWJsaXNoVVJMKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfUFVCTElTSF9VUkwiKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh1c2VySUQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJRCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJRCk7Ci0gICAgICB9Ci0gIAotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcodXNlcklEKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VTRVJJRCIpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gaWRzIGZyb20gcHVibGlzaGVyIGFzc2VydGlvbiB0YWJsZQotICAgIFN0cmluZ1tdIHB1YkFzc2VydGlvbnNWaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1ZJRVdJRCk7Ci0gICAgaWYgKHB1YkFzc2VydGlvbnNWaWV3SWRzID09IG51bGwgfHwgcHViQXNzZXJ0aW9uc1ZpZXdJZHMubGVuZ3RoID09IDApCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIGVsc2UKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1ZJRVdJRCwgcHViQXNzZXJ0aW9uc1ZpZXdJZHMpOwotCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGlmIChyZWdpc3RyeU5vZGVfID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnaXN0cnlFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgLy8gaWYgbm90IHlldCBsb2dnZWQgaW4sIGxvZyBpbiBmaXJzdAotICAgIGlmICghaXNMb2dnZWRJbl8pIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcklEID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIHJlZ2lzdHJ5RWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCwgdXNlcklELCBwYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIHRlKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHRlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIHVkZGllKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpZS50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShtZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9ICAgICAgCi0gICAgfQotCi0gICAgVURESVByb3h5IHByb3h5ID0gcmVnaXN0cnlFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgU3RyaW5nIHVzZXJJRCA9IHJlZ2lzdHJ5RWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgY3JlZCA9IHJlZ2lzdHJ5RWxlbWVudC5nZXRDcmVkKCk7Ci0gICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICBMaXN0TWFuYWdlciBwdWJBc3NlcnRpb25zID0gYnVzRWxlbWVudC5nZXRQdWJsaXNoZXJBc3NlcnRpb25zKCk7Ci0KLSAgICAvLyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIGEgb3duZWQgYnVzaW5lc3MKLSAgICAvLyBpZiBub3QsIHRoZSBBZGRQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQKLSAgICBpZiAoIWlzQnVzaW5lc3NPd25lZChidXNFbGVtZW50KSkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PVF9PV05FRF9CVVNJTkVTUyIpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBTdHJpbmdbXSBwdWJBc3NlcnRpb25WaWV3SWRzID0gKFN0cmluZ1tdKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1ZJRVdJRCk7Ci0gICAgICBWZWN0b3IgcHViQXNzZXJ0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB1YkFzc2VydGlvblZpZXdJZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQocHViQXNzZXJ0aW9uVmlld0lkc1tpXSk7Ci0gICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gcHViQXNzZXJ0aW9ucy5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpOwotICAgICAgICBQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50IHB1YkFzc2VydGlvbkVsZW1lbnQgPSAoUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgaWYgKCEocHViQXNzZXJ0aW9uRWxlbWVudC5nZXRTdGF0dXMoKS5lcXVhbHMoQ29tcGxldGlvblN0YXR1cy5DT01QTEVURSkpKQotICAgICAgICAgIHB1YkFzc2VydGlvblZlY3Rvci5hZGQocHViQXNzZXJ0aW9uRWxlbWVudC5nZXRQdWJsaXNoZXJBc3NlcnRpb24oKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwdWJBc3NlcnRpb25WZWN0b3Iuc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19JTkNPTVBMRVRFX0FTU0VSVElPTl9TRUxFQ1RFRCIpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBEaXNwb3NpdGlvblJlcG9ydCByZXBvcnQgPSBwcm94eS5hZGRfcHVibGlzaGVyQXNzZXJ0aW9ucyhyZWdpc3RyeUVsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgcHViQXNzZXJ0aW9uVmVjdG9yKTsKLSAgICAgIC8vcmVwb3J0IHN0YXR1cwotCSAgVmVjdG9yIHJlcG9ydEVyckluZm8gPSByZXBvcnQuZ2V0UmVzdWx0VmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlcG9ydEVyckluZm8uc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoKChSZXN1bHQpIHJlcG9ydEVyckluZm8uZ2V0KGopKS5nZXRFcnJJbmZvKCkuZ2V0VGV4dCgpKTsKLSAgICAgIH0KLQotICAgICAgU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gc2hvd1BBQWN0aW9uID0gbmV3IFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gc2hvd1BBQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgIE9iamVjdCBpZHMgPSBwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19TRUxFQ1RFRF9CVVNfSUQpOwotICAgICAgaWYgKGlkcyAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCwgaWRzKTsKLSAgICAgIHNob3dQQUFjdGlvbi5ydW4oKTsKLQotICAgICAgcmV0dXJuIHJlcG9ydC5zdWNjZXNzKCk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIHVkZGllKSB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBEaXNwb3NpdGlvblJlcG9ydCByZXBvcnQgPSB1ZGRpZS5nZXREaXNwb3NpdGlvblJlcG9ydCgpOwotCSAgVmVjdG9yIHJlcG9ydEVyckluZm8gPSByZXBvcnQuZ2V0UmVzdWx0VmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlcG9ydEVyckluZm8uc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoKChSZXN1bHQpIHJlcG9ydEVyckluZm8uZ2V0KGopKS5nZXRFcnJJbmZvKCkuZ2V0VGV4dCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvRmluZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9GaW5kQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2IyMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9GaW5kQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbmRBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFF1ZXJ5RWxlbWVudCBxdWVyeUVsZW1lbnRfOwotICBwcm90ZWN0ZWQgU3RyaW5nIHN1YlF1ZXJ5S2V5XzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdWJRdWVyeUdldF87Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3U3ViUXVlcnlfOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld1N1YlF1ZXJ5SXRlbV87Ci0gIHByb3RlY3RlZCBib29sZWFuIHN1YlF1ZXJ5SW5pdGlhdGVkXzsKLSAgcHJvdGVjdGVkIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzUmVmcmVzaEFjdGlvbl87Ci0KLSAgcHVibGljIEZpbmRBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcXVlcnlFbGVtZW50XyA9IG51bGw7Ci0gICAgc3ViUXVlcnlLZXlfID0gbnVsbDsKLSAgICBpc1N1YlF1ZXJ5R2V0XyA9IGZhbHNlOwotICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IGZhbHNlOwotICAgIHJlZ05vZGVfID0gZ2V0UmVnaXN0cnlOb2RlKCk7Ci0gICAgaXNSZWZyZXNoQWN0aW9uXyA9IGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gU2V0dXAgZm9yIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyVHJhbnNmb3JtZXIKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk1VTFRJUEFSVF9GT1JNX0RBVEFfUEFSU0VSLCBwYXJzZXIpOwotCi0gICAgbmV3U3ViUXVlcnlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQpOwotICAgIFN0cmluZyBpc1N1YlF1ZXJ5R2V0U3RyaW5nID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCk7Ci0gICAgbmV3U3ViUXVlcnlJdGVtXyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSk7Ci0gICAgc3ViUXVlcnlLZXlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0gICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlfKTsKLSAgICBmb3JtVG9vbFBJLmNsZWFyRXJyb3JzKCk7Ci0KLSAgICBpZiAobmV3U3ViUXVlcnlfICE9IG51bGwgJiYgbmV3U3ViUXVlcnlfLmxlbmd0aCgpID4gMCkKLSAgICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgc3ViUXVlcnlJbml0aWF0ZWRfID0gZmFsc2U7Ci0gICAgICAKLSAgICBpZiAoaXNTdWJRdWVyeUdldFN0cmluZyAhPSBudWxsKQotICAgICAgaXNTdWJRdWVyeUdldF8gPSBCb29sZWFuLnZhbHVlT2YoaXNTdWJRdWVyeUdldFN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0KLSAgICBpZiAocXVlcnlOYW1lICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLHF1ZXJ5TmFtZSk7Ci0KLSAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhxdWVyeU5hbWUpICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfUVVFUllfTkFNRSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoIXByb2Nlc3NPdGhlcnMocGFyc2VyLGZvcm1Ub29sUEkpICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgCi0gICAgZm9yIChpbnQgaT0wO2k8cmVtb3ZlZFByb3BlcnRpZXNfLnNpemUoKTtpKyspCi0gICAgICBmb3JtVG9vbFBJLnJlbW92ZVByb3BlcnR5KHJlbW92ZWRQcm9wZXJ0aWVzXy5lbGVtZW50QXQoaSkpOwotICAgIGZvcm1Ub29sUEkudXBkYXRlUHJvcGVydHlUYWJsZShwcm9wZXJ0eVRhYmxlXyk7Ci0gICAgICAKLSAgICAvLyBQcm9jZXNzIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiBJZiB2YWxpZCwgdGhlc2Ugc2hvdWxkIGJlIHNldCBpbiB0aGUgZm9ybVRvb2wgKG5vdCB0aGUgZm9ybVRvb2xQSSkuCi0gICAgU3RyaW5nIG93bmVkQ2hlY2tlZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9PV05FRCk7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgIFN0cmluZyB1c2VySWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgYm9vbGVhbiB2YWxpZGF0ZUF1dGhlbnRpY2F0aW9uID0gKG93bmVkQ2hlY2tlZCAhPSBudWxsKSAmJiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKSAmJiAhb3ZlcnJpZGVBdXRoZW50aWNhdGlvblZhbGlkYXRpb24oKTsKLQotICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIH0gICAgICAKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmIHZhbGlkYXRlQXV0aGVudGljYXRpb24gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhwdWJsaXNoVVJMKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMIikpOwotICAgIH0KLQotICAgIGlmICh1c2VySWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgfQotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgdmFsaWRhdGVBdXRoZW50aWNhdGlvbiAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHVzZXJJZCkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEIikpOwotICAgIH0KLQotICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIH0gICAgICAgIAotICAgICAgCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcnJpZGVBdXRoZW50aWNhdGlvblZhbGlkYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlF1ZXJ5SW5pdGlhdGVkKCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUluaXRpYXRlZF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzU3ViUXVlcnlHZXQoKQotICB7Ci0gICAgcmV0dXJuIGlzU3ViUXVlcnlHZXRfOwotICB9ICAgIAotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3ViUXVlcnlLZXkoKQotICB7Ci0gICAgcmV0dXJuIHN1YlF1ZXJ5S2V5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ld1N1YlF1ZXJ5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnlJdGVtKCkKLSAgewotICAgIHJldHVybiBuZXdTdWJRdWVyeUl0ZW1fOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSZWZyZXNoQWN0aW9uKGJvb2xlYW4gaXNSZWZyZXNoQWN0aW9uKQotICB7Ci0gICAgaXNSZWZyZXNoQWN0aW9uXyA9IGlzUmVmcmVzaEFjdGlvbjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSZWZyZXNoQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBpc1JlZnJlc2hBY3Rpb25fOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUXVlcnlOb2RlKCkKLSAgewotICAgIC8vIElmIHRoZSBxdWVyeUVsZW1lbnQgYWxyZWFkeSBleGlzdHMsIHJlbW92ZSBpdCBmaXJzdC4KLSAgICBTdHJpbmcgcXVlcnlOYW1lID0gcXVlcnlFbGVtZW50Xy5nZXROYW1lKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgUXVlcnlQYXJlbnRFbGVtZW50IHF1ZXJ5UGFyZW50RWxlbWVudCA9IHJlZ0VsZW1lbnQuZ2V0UXVlcnlQYXJlbnRFbGVtZW50KCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IHF1ZXJ5UGFyZW50RWxlbWVudC5nZXRRdWVyaWVzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgUXVlcnlFbGVtZW50IHFlID0gKFF1ZXJ5RWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBpZiAocWUuZ2V0TmFtZSgpLmVxdWFscyhxdWVyeU5hbWUpKQotICAgICAgewotICAgICAgICBTdWJRdWVyeVRyYW5zZmVyVGFyZ2V0IHN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgPSAoU3ViUXVlcnlUcmFuc2ZlclRhcmdldClxZS5nZXRQcm9wZXJ0eUFzT2JqZWN0KFVERElNb2RlbENvbnN0YW50cy5TVUJRVUVSWV9UUkFOU0ZFUl9UQVJHRVQpOwotICAgICAgICBpZiAoc3ViUXVlcnlUcmFuc2ZlclRhcmdldCAhPSBudWxsICYmIChxZS5nZXRRdWVyeVR5cGUoKSA9PSBxdWVyeUVsZW1lbnRfLmdldFF1ZXJ5VHlwZSgpKSkKLSAgICAgICAgICBxdWVyeUVsZW1lbnRfLnNldFByb3BlcnR5QXNPYmplY3QoVURESU1vZGVsQ29uc3RhbnRzLlNVQlFVRVJZX1RSQU5TRkVSX1RBUkdFVCxzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0KTsKLSAgICAgICAgcWUuZGlzY29ubmVjdEFsbCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpc1JlZnJlc2hBY3Rpb25fKQotICAgIHsKLSAgICAgIC8vIFdlIGNhbiBtYWtlIHNhZmUgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIG5vZGUgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICBpZiAoc3ViUXVlcnlLZXlfICE9IG51bGwgJiYgc3ViUXVlcnlLZXlfLmxlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmVudFF1ZXJ5S2V5OwotICAgICAgICBpbnQgbGFzdFNlcGFyYXRvclBvcyA9IHN1YlF1ZXJ5S2V5Xy5sYXN0SW5kZXhPZignOicpOwotICAgICAgICBpZiAobGFzdFNlcGFyYXRvclBvcyA9PSAtMSkKLSAgICAgICAgICBwYXJlbnRRdWVyeUtleSA9ICIiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcGFyZW50UXVlcnlLZXkgPSBzdWJRdWVyeUtleV8uc3Vic3RyaW5nKDAsbGFzdFNlcGFyYXRvclBvcyk7Ci0gICAgICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBwYXJlbnRGb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlnZXRTZWxlY3RlZEZvcm1Ub29sKCkpLmdldEZvcm1Ub29sUHJvcGVydGllcyhwYXJlbnRRdWVyeUtleSk7Ci0gICAgICAgIE9iamVjdCBxdWVyeUl0ZW0gPSBwYXJlbnRGb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSk7Ci0gICAgICAgIE9iamVjdCBxdWVyeVN0eWxlQnVzID0gcGFyZW50Rm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMpOwotICAgICAgICBPYmplY3QgcXVlcnlTdHlsZVNlciA9IHBhcmVudEZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyk7Ci0gICAgICAgIE9iamVjdCBxdWVyeVN0eWxlU2VySW50ID0gcGFyZW50Rm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICAgICAgIEhhc2h0YWJsZSBwYXJlbnRRdWVyeURhdGEgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGlmIChxdWVyeUl0ZW0gIT0gbnVsbCkKLSAgICAgICAgICBwYXJlbnRRdWVyeURhdGEucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSwgcXVlcnlJdGVtKTsKLSAgICAgICAgaWYgKHF1ZXJ5U3R5bGVCdXMgIT0gbnVsbCkKLSAgICAgICAgICBwYXJlbnRRdWVyeURhdGEucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUywgcXVlcnlTdHlsZUJ1cyk7Ci0gICAgICAgIGlmIChxdWVyeVN0eWxlU2VyICE9IG51bGwpCi0gICAgICAgICAgcGFyZW50UXVlcnlEYXRhLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLCBxdWVyeVN0eWxlU2VyKTsKLSAgICAgICAgaWYgKHF1ZXJ5U3R5bGVTZXJJbnQgIT0gbnVsbCkKLSAgICAgICAgICBwYXJlbnRRdWVyeURhdGEucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTLCBxdWVyeVN0eWxlU2VySW50KTsKLSAgICAgICAgcXVlcnlFbGVtZW50Xy5zZXRQcm9wZXJ0eUFzT2JqZWN0KFVERElNb2RlbENvbnN0YW50cy5TVUJRVUVSWV9UUkFOU0ZFUl9UQVJHRVQsbmV3IFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQoZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCksc3ViUXVlcnlLZXlfLHBhcmVudFF1ZXJ5RGF0YSkpOwotICAgICAgfQotICAgIH0KLSAgICBxdWVyeVBhcmVudEVsZW1lbnQuY29ubmVjdChxdWVyeUVsZW1lbnRfLFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUklFUyxNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIFF1ZXJ5Tm9kZSBxdWVyeU5vZGUgPSAoUXVlcnlOb2RlKShyZWdOb2RlXy5nZXRDaGlsZE5vZGUocXVlcnlQYXJlbnRFbGVtZW50KS5nZXRDaGlsZE5vZGUocXVlcnlFbGVtZW50XykpOwotICAgIGludCBuZXdTZWxlY3RlZE5vZGVJZDsKLSAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IDEgcmVzdWx0LCBzZWxlY3QgdGhlIHJlc3VsdC4gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIHF1ZXJ5IG5vZGUgdG8gcHJlc2VudCBhIHN1bW1hcnkuCi0gICAgaWYgKHF1ZXJ5Tm9kZS5nZXRDaGlsZE5vZGVzKCkuc2l6ZSgpID09IDEgJiYgKHN1YlF1ZXJ5S2V5XyA9PSBudWxsIHx8IHN1YlF1ZXJ5S2V5Xy5sZW5ndGgoKSA9PSAwKSkKLSAgICAgIG5ld1NlbGVjdGVkTm9kZUlkID0gKChOb2RlKShxdWVyeU5vZGUuZ2V0Q2hpbGROb2RlcygpLmVsZW1lbnRBdCgwKSkpLmdldE5vZGVJZCgpOwotICAgIGVsc2UKLSAgICAgIG5ld1NlbGVjdGVkTm9kZUlkID0gcXVlcnlOb2RlLmdldE5vZGVJZCgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gcmVnTm9kZV8uZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChuZXdTZWxlY3RlZE5vZGVJZCk7Ci0gICAgcXVlcnlOb2RlLnNldEZpbmRUb29sUHJvcGVydGllcyh0aGlzKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgYWRkVG9IaXN0b3J5KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLHNlbGVjdGVkVG9vbC5nZXRTZWxlY3RUb29sQWN0aW9uSHJlZih0cnVlKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoICsgMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRUcmFuc2Zvcm1lcnMsIDAsIHRyYW5zZm9ybWVycywgMCwgcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCk7Ci0gICAgdHJhbnNmb3JtZXJzW3RyYW5zZm9ybWVycy5sZW5ndGggLSAxXSA9IG5ldyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlclRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDcwYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZXM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1wdWJsaWMgY2xhc3MgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uIGV4dGVuZHMgVURESVByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgc3ViUXVlcnlLZXlfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YlF1ZXJ5R2V0XzsKLSAgcHJvdGVjdGVkIFN0cmluZyBuZXdTdWJRdWVyeV87Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3U3ViUXVlcnlJdGVtXzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3ViUXVlcnlJbml0aWF0ZWRfOwotICBwcm90ZWN0ZWQgUmVnaXN0cnlOb2RlIHJlZ05vZGVfOwotCi0gIHB1YmxpYyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgc3ViUXVlcnlLZXlfID0gbnVsbDsKLSAgICBpc1N1YlF1ZXJ5R2V0XyA9IGZhbHNlOwotICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IGZhbHNlOwotICAgIHJlZ05vZGVfID0gZ2V0UmVnaXN0cnlOb2RlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgbmV3U3ViUXVlcnlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQpOwotICAgIFN0cmluZyBpc1N1YlF1ZXJ5R2V0U3RyaW5nID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCk7Ci0gICAgbmV3U3ViUXVlcnlJdGVtXyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSk7Ci0gICAgc3ViUXVlcnlLZXlfID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgU3RyaW5nW10gcmVmZXJlbmNlZFNlcnZpY2VzQ2hlY2tib3hlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5SRUZFUkVOQ0VEX1NFUlZJQ0VfU0VMRUNUX1NUQVRFKTsKLSAgICBTdHJpbmdbXSBzZXJ2aWNlTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5OT0RFSURfU0VSVklDRSk7Ci0gICAgU3RyaW5nIG9wZXJhdGlvbiA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19PUEVSQVRJT04pOwotICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0gICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlfKTsKLSAgICBmb3JtVG9vbFBJLmNsZWFyRXJyb3JzKCk7Ci0KLSAgICBpZiAobmV3U3ViUXVlcnlfICE9IG51bGwgJiYgbmV3U3ViUXVlcnlfLmxlbmd0aCgpID4gMCkKLSAgICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgc3ViUXVlcnlJbml0aWF0ZWRfID0gZmFsc2U7Ci0KLSAgICBpZiAoaXNTdWJRdWVyeUdldFN0cmluZyAhPSBudWxsKQotICAgICAgaXNTdWJRdWVyeUdldF8gPSBCb29sZWFuLnZhbHVlT2YoaXNTdWJRdWVyeUdldFN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19PUEVSQVRJT04sb3BlcmF0aW9uKTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLk1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTik7Ci0KLSAgICBpZiAocmVmZXJlbmNlZFNlcnZpY2VzQ2hlY2tib3hlcyAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUkVGRVJFTkNFRF9TRVJWSUNFX1NFTEVDVF9TVEFURSxyZWZlcmVuY2VkU2VydmljZXNDaGVja2JveGVzKTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlJFRkVSRU5DRURfU0VSVklDRV9TRUxFQ1RfU1RBVEUpOwotCi0gICAgaWYgKHNlcnZpY2VOb2RlSWRzICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIHNlcnZpY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0VSVklDRVMpOwotICAgICAgaWYgKHNlcnZpY2VzID09IG51bGwpCi0gICAgICAgIHNlcnZpY2VzID0gbmV3IFZlY3RvcigpOwotICAgICAgSGFzaHRhYmxlIHJlc3VsdEhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlTm9kZUlkcy5sZW5ndGg7aSsrKQotICAgICAgICByZXN1bHRIYXNoLnB1dChzZXJ2aWNlTm9kZUlkc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZXMuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZXMuZWxlbWVudEF0KGkpOwotICAgICAgICBpZiAocmVzdWx0SGFzaC5nZXQoU3RyaW5nLnZhbHVlT2YobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCkpKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VydmljZXMucmVtb3ZlRWxlbWVudEF0KGkpOwotICAgICAgICAgIGktLTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0VSVklDRVMsc2VydmljZXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NFUlZJQ0VTKTsKLQotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgewotICAgICAgaWYgKHB1Ymxpc2hVUkwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcocHVibGlzaFVSTCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMIikpOwotICAgICAgfQotCi0gICAgICBpZiAodXNlcklkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgICAgfQotCi0gICAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHVzZXJJZCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9VU0VSSUQiKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaW50IGk9MDtpPHJlbW92ZWRQcm9wZXJ0aWVzXy5zaXplKCk7aSsrKQotICAgICAgZm9ybVRvb2xQSS5yZW1vdmVQcm9wZXJ0eShyZW1vdmVkUHJvcGVydGllc18uZWxlbWVudEF0KGkpKTsKLSAgICBmb3JtVG9vbFBJLnVwZGF0ZVByb3BlcnR5VGFibGUocHJvcGVydHlUYWJsZV8pOwotCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIFN0cmluZyBvcGVyYXRpb25TdHJpbmcgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLk1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTik7Ci0gICAgaW50IG9wZXJhdGlvbiA9IEludGVnZXIucGFyc2VJbnQob3BlcmF0aW9uU3RyaW5nKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpKGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpLmdldFRyZWVFbGVtZW50KCkpOwotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5Xyk7Ci0gICAgVmVjdG9yIHJlZmVyZW5jZWRTZXJ2aWNlcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1JFRkVSRU5DRURfU0VSVklDRVMpOwotICAgIGJvb2xlYW4gb3BlcmF0aW9uUmVzdWx0ID0gdHJ1ZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgQnVzaW5lc3NFbnRpdHkgY3VycmVudFNQID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpOwotICAgICAgQnVzaW5lc3NFbnRpdHkgc3AgPSAoQnVzaW5lc3NFbnRpdHkpcHJveHkuZ2V0X2J1c2luZXNzRGV0YWlsKGN1cnJlbnRTUC5nZXRCdXNpbmVzc0tleSgpKS5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpLmdldCgwKTsKLSAgICAgIAotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgICAKLSAgICAgIEhhc2h0YWJsZSBzZXJ2aWNlc0hhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBWZWN0b3IgYmFja3VwQnVzU2VydmljZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHN3aXRjaCAob3BlcmF0aW9uKQotICAgICAgewotICAgICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OX0FERDoKLSAgICAgICAgICBWZWN0b3Igc2VydmljZXMgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NFUlZJQ0VTKTsgICAgICAgICAgCi0gICAgICAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZXMuc2l6ZSgpO2krKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0RWxlbWVudCBzZXJ2aWNlTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZXMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlzZXJ2aWNlTGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICBzZXJ2aWNlc0hhc2gucHV0KGJzLmdldFNlcnZpY2VLZXkoKSxicyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgbGlzdCBvZiBCdXNpbmVzc1NlcnZpY2VzIGZvciByb2xsYmFjayBvcGVyYXRpb25zLgotICAgICAgICAgIGJhY2t1cEFuZFVwZGF0ZUJ1c2luZXNzU2VydmljZXMoYmFja3VwQnVzU2VydmljZVZlY3RvcixzcCxzZXJ2aWNlc0hhc2gsdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZlY3RvciBiZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGJlVmVjdG9yLmFkZChzcCk7Ci0gICAgICAgICAgICBzcCA9IChCdXNpbmVzc0VudGl0eSlwcm94eS5zYXZlX2J1c2luZXNzKHJlZ0VsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgYmVWZWN0b3IpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCkuZ2V0KDApOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZXMuc2l6ZSgpO2krKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTGlzdEVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZXMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSAoQnVzaW5lc3NTZXJ2aWNlKXNlcnZpY2VFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgICBTdHJpbmcgYnNOYW1lID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFRCIsYnNOYW1lKSk7Ci0gICAgICAgICAgICAgIHNlcnZpY2VzLnJlbW92ZUVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gUm9sbCBiYWNrIGFuZCByZXN0b3JlIHRoZSBvbGQgbGlzdCBvZiBzZXJ2aWNlcy4KLSAgICAgICAgICAgIHJvbGxiYWNrQnVzaW5lc3NTZXJ2aWNlcyhzcCxiYWNrdXBCdXNTZXJ2aWNlVmVjdG9yLHNlcnZpY2VzLHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIk1TR19FUlJPUl9TRVJWSUNFX05PVF9SRUZFUkVOQ0VEIik7Ci0gICAgICAgICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBSb2xsIGJhY2sgYW5kIHJlc3RvcmUgdGhlIG9sZCBsaXN0IG9mIHNlcnZpY2VzLgotICAgICAgICAgICAgcm9sbGJhY2tCdXNpbmVzc1NlcnZpY2VzKHNwLGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3Isc2VydmljZXMsdWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX1JFRkVSRU5DRUQiKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIG9wZXJhdGlvblJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0VSVklDRVMsc2VydmljZXMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OX1JFTU9WRToKLSAgICAgICAgICBTdHJpbmdbXSByZWZlcmVuY2VkU2VydmljZXNDaGVja2JveGVzID0gKFN0cmluZ1tdKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlJFRkVSRU5DRURfU0VSVklDRV9TRUxFQ1RfU1RBVEUpOwotICAgICAgICAgIFZlY3RvciBzZWxlY3RlZFJlZmVyZW5jZWRTZXJ2aWNlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIGZvciAoaW50IGk9MDtpPHJlZmVyZW5jZWRTZXJ2aWNlc0NoZWNrYm94ZXMubGVuZ3RoO2krKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGlzQ2hlY2tlZCA9IEJvb2xlYW4udmFsdWVPZihyZWZlcmVuY2VkU2VydmljZXNDaGVja2JveGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIExpc3RFbGVtZW50IHJlZmVyZW5jZWRTZXJ2aWNlTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpcmVmZXJlbmNlZFNlcnZpY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlyZWZlcmVuY2VkU2VydmljZUxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgICAgICBzZXJ2aWNlc0hhc2gucHV0KGJzLmdldFNlcnZpY2VLZXkoKSxicyk7Ci0gICAgICAgICAgICAgIHNlbGVjdGVkUmVmZXJlbmNlZFNlcnZpY2VWZWN0b3IuYWRkRWxlbWVudChicyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgYnVzaW5lc3Mgc2VydmljZXMgZm9yIHJvbGxiYWNrIG9wZXJhdGlvbnMuCi0gICAgICAgICAgYmFja3VwQW5kVXBkYXRlQnVzaW5lc3NTZXJ2aWNlcyhiYWNrdXBCdXNTZXJ2aWNlVmVjdG9yLHNwLHNlcnZpY2VzSGFzaCxmYWxzZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgVmVjdG9yIGJlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgYmVWZWN0b3IuYWRkKHNwKTsKLSAgICAgICAgICAgIHNwID0gKEJ1c2luZXNzRW50aXR5KXByb3h5LnNhdmVfYnVzaW5lc3MocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBiZVZlY3RvcikuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7aTxzZWxlY3RlZFJlZmVyZW5jZWRTZXJ2aWNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2Upc2VsZWN0ZWRSZWZlcmVuY2VkU2VydmljZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgIFN0cmluZyBic05hbWUgPSBicy5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VfUkVNT1ZFRCIsYnNOYW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBSb2xsIGJhY2sgYW5kIHJlc3RvcmUgdGhlIG9sZCBsaXN0IG9mIHNlcnZpY2VzLgotICAgICAgICAgICAgcm9sbGJhY2tCdXNpbmVzc1NlcnZpY2VzKHNwLGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3Isc2VsZWN0ZWRSZWZlcmVuY2VkU2VydmljZVZlY3Rvcix1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJNU0dfRVJST1JfUkVGRVJFTkNFX05PVF9SRU1PVkVEIik7Ci0gICAgICAgICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBSb2xsIGJhY2sgYW5kIHJlc3RvcmUgdGhlIG9sZCBsaXN0IG9mIHNlcnZpY2VzLgotICAgICAgICAgICAgcm9sbGJhY2tCdXNpbmVzc1NlcnZpY2VzKHNwLGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3Isc2VsZWN0ZWRSZWZlcmVuY2VkU2VydmljZVZlY3Rvcix1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJNU0dfRVJST1JfUkVGRVJFTkNFX05PVF9SRU1PVkVEIik7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBvcGVyYXRpb25SZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVmZXJlbmNlZCBzZXJ2aWNlcyBhcmUgcmVmcmVzaGVkIHdoZW4gdGhlIGZvcm0gcmVsb2Fkcy4KLSAgICAgIGZvcm1Ub29sUEkucmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9SRUZFUkVOQ0VEX1NFUlZJQ0VTKTsKLSAgICAgIGJ1c0VsZW1lbnQuc2V0QnVzaW5lc3NFbnRpdHkoc3ApOwotICAgICAgcmV0dXJuIG9wZXJhdGlvblJlc3VsdDsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICAgIG9wZXJhdGlvblJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICAgIG9wZXJhdGlvblJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iLGUpOwotICAgICAgb3BlcmF0aW9uUmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBvcGVyYXRpb25SZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlF1ZXJ5SW5pdGlhdGVkKCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUluaXRpYXRlZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlF1ZXJ5R2V0KCkKLSAgewotICAgIHJldHVybiBpc1N1YlF1ZXJ5R2V0XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3ViUXVlcnlLZXkoKQotICB7Ci0gICAgcmV0dXJuIHN1YlF1ZXJ5S2V5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ld1N1YlF1ZXJ5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnlJdGVtKCkKLSAgewotICAgIHJldHVybiBuZXdTdWJRdWVyeUl0ZW1fOwotICB9Ci0gIAotICAvLyBCYWNrdXAgdGhlIGJ1c2luZXNzIHNlcnZpY2VzIGFuZCByZW1vdmUgdGhvc2UgaW4gc2VydmljZUhhc2ggZnJvbSB0aGUgY3VycmVudCBsaXN0LiBSZXR1cm4gdGhlIHVwZGF0ZWQgbGlzdCBvZiBidXNpbmVzcyBzZXJ2aWNlcwotICBwcml2YXRlIGZpbmFsIHZvaWQgYmFja3VwQW5kVXBkYXRlQnVzaW5lc3NTZXJ2aWNlcyhWZWN0b3IgYmFja3VwQnVzU2VydmljZVZlY3RvcixCdXNpbmVzc0VudGl0eSBiZSxIYXNodGFibGUgc2VydmljZXNIYXNoLGJvb2xlYW4gaXNBZGQpCi0gIHsKLSAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgYnVzaW5lc3Mgc2VydmljZXMgZm9yIHJvbGxiYWNrIG9wZXJhdGlvbnMuCi0gICAgQnVzaW5lc3NTZXJ2aWNlcyBjdXJyZW50QnVzU2VydmljZXMgPSBiZS5nZXRCdXNpbmVzc1NlcnZpY2VzKCk7Ci0gICAgaWYgKGN1cnJlbnRCdXNTZXJ2aWNlcyA9PSBudWxsKQotICAgICAgY3VycmVudEJ1c1NlcnZpY2VzID0gbmV3IEJ1c2luZXNzU2VydmljZXMoKTsKLSAgICBWZWN0b3IgY3VycmVudEJ1c1NlcnZpY2VWZWN0b3IgPSBjdXJyZW50QnVzU2VydmljZXMuZ2V0QnVzaW5lc3NTZXJ2aWNlVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8Y3VycmVudEJ1c1NlcnZpY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICB7Ci0gICAgICBCdXNpbmVzc1NlcnZpY2UgY3VycmVudEJ1c1NlcnZpY2UgPSAoQnVzaW5lc3NTZXJ2aWNlKWN1cnJlbnRCdXNTZXJ2aWNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgIGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3IuYWRkRWxlbWVudChjdXJyZW50QnVzU2VydmljZSk7Ci0gICAgICAvLyBJZiB0aGUgY3VycmVudCBidXNpbmVzcyBzZXJ2aWNlIGlzIGEgbWVtYmVyIG9mIHRoZSBsaXN0IHRvIGJlIHJlbW92ZWQvYWRkZWQsIHJlbW92ZSBpdCBub3cuCi0gICAgICBpZiAoc2VydmljZXNIYXNoLmdldChjdXJyZW50QnVzU2VydmljZS5nZXRTZXJ2aWNlS2V5KCkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRCdXNTZXJ2aWNlVmVjdG9yLnJlbW92ZUVsZW1lbnRBdChpKTsKLSAgICAgICAgaS0tOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoaXNBZGQpCi0gICAgewotICAgICAgRW51bWVyYXRpb24gZSA9IHNlcnZpY2VzSGFzaC5lbGVtZW50cygpOwotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIGN1cnJlbnRCdXNTZXJ2aWNlVmVjdG9yLmFkZEVsZW1lbnQoKEJ1c2luZXNzU2VydmljZSllLm5leHRFbGVtZW50KCkpOwotICAgIH0KLSAgICBiZS5zZXRCdXNpbmVzc1NlcnZpY2VzKGN1cnJlbnRCdXNTZXJ2aWNlcyk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgdm9pZCByb2xsYmFja0J1c2luZXNzU2VydmljZXMoQnVzaW5lc3NFbnRpdHkgYmUsVmVjdG9yIGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3IsVmVjdG9yIG9wZXJhdGVkU2VydmljZXMsUGVyc3BlY3RpdmUgcGVyc3BlY3RpdmUsTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSxTdHJpbmcgZXJyb3JNZXNzYWdlS2V5KQotICB7Ci0gICAgLy8gUm9sbCBiYWNrIGFuZCByZXN0b3JlIHRoZSBvbGQgbGlzdCBvZiBzZXJ2aWNlcy4KLSAgICBiZS5nZXRCdXNpbmVzc1NlcnZpY2VzKCkuc2V0QnVzaW5lc3NTZXJ2aWNlVmVjdG9yKGJhY2t1cEJ1c1NlcnZpY2VWZWN0b3IpOwotICAgIGZvciAoaW50IGk9MDtpPG9wZXJhdGVkU2VydmljZXMuc2l6ZSgpO2krKykKLSAgICB7Ci0gICAgICBMaXN0RWxlbWVudCBzZXJ2aWNlTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpb3BlcmF0ZWRTZXJ2aWNlcy5lbGVtZW50QXQoaSk7Ci0gICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSAoQnVzaW5lc3NTZXJ2aWNlKXNlcnZpY2VMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgIFN0cmluZyBic05hbWUgPSBicy5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UocGVyc3BlY3RpdmUuZ2V0TWVzc2FnZShlcnJvck1lc3NhZ2VLZXksYnNOYW1lKSk7Ci0gICAgfSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9PcGVuQ2F0ZWdvcnlCcm93c2VyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL09wZW5DYXRlZ29yeUJyb3dzZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NzNjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL09wZW5DYXRlZ29yeUJyb3dzZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIE9wZW5DYXRlZ29yeUJyb3dzZXJBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHVibGljIE9wZW5DYXRlZ29yeUJyb3dzZXJBY3Rpb24oKQotICB7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFkZFNlc3Npb25BbmRUTW9kZWxLZXkoU3RyaW5nQnVmZmVyIHJlc3VsdCxTdHJpbmcgc2Vzc2lvbklkLFN0cmluZyBjYXRlZ29yeVRNb2RlbEtleSkKLSAgewotICAgIHJlc3VsdC5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCkuYXBwZW5kKCcmJykuYXBwZW5kKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVE1PREVMX0tFWSkuYXBwZW5kKCc9JykuYXBwZW5kKGNhdGVnb3J5VE1vZGVsS2V5KTsKLSAgfQotICAKLSAgLy8gdWRkaS9jYXRlZ29yeV9icm93c2VyLmpzcD9zZXNzaW9uSWQ9Li4uJmNhdGVnb3J5VE1vZGVsS2V5PS4uLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKFN0cmluZyBzZXNzaW9uSWQsU3RyaW5nIGNhdGVnb3J5VE1vZGVsS2V5KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2NhdGVnb3J5X2Jyb3dzZXIuanNwPyIpOwotICAgIGFkZFNlc3Npb25BbmRUTW9kZWxLZXkoYWN0aW9uTGluayxzZXNzaW9uSWQsY2F0ZWdvcnlUTW9kZWxLZXkpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldENhdGVnb3J5Q29udGVudFBhZ2UoU3RyaW5nIHNlc3Npb25JZCxTdHJpbmcgY2F0ZWdvcnlUTW9kZWxLZXkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvY2F0ZWdvcnlfY29udGVudC5qc3A/Iik7Ci0gICAgYWRkU2Vzc2lvbkFuZFRNb2RlbEtleShhY3Rpb25MaW5rLHNlc3Npb25JZCxjYXRlZ29yeVRNb2RlbEtleSk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0V2lsZENhcmRBY3Rpb25MaW5rKFN0cmluZyBzZXNzaW9uSWQpCi0gIHsKLSAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsIiUiKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvT3BlblJlZ2lzdHJ5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL09wZW5SZWdpc3RyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDc4MjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvT3BlblJlZ2lzdHJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC4qOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0Lio7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC4qOwotaW1wb3J0IG9yZy51ZGRpNGouKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuUmVnaXN0cnlBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHVibGljIE9wZW5SZWdpc3RyeUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICAvLyBTZWxlY3QgVURESSBNYWluLgotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyByZWdpc3RyeU5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSk7Ci0gICAgU3RyaW5nIGlucXVpcnlVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuSU5RVUlSWV9VUkwpOwotICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hfVVJMKTsKLSAgICBTdHJpbmcgdXNlcm5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuVURESV9VU0VSTkFNRSk7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlVERElfUEFTU1dPUkQpOwotICAgIFN0cmluZyBjaGVja1VzZXJEZWZpbmVkQ2F0ZWdvcmllc0NoZWNrZWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuQ0hFQ0tfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMpOwotICAgIFN0cmluZyBjYXRlZ29yaWVzRGlyZWN0b3J5ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JJRVNfRElSRUNUT1JZKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotICAgIGlmIChyZWdpc3RyeU5hbWUgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUscmVnaXN0cnlOYW1lKTsKLQotICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHJlZ2lzdHJ5TmFtZSkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1JFR0lTVFJZX05BTUUiKSk7Ci0gICAgfQotCi0gICAgaWYgKGlucXVpcnlVUkwgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMLGlucXVpcnlVUkwpOwotICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlVVJMKGlucXVpcnlVUkwpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfSU5RVUlSWV9VUkwiKSk7Ci0gICAgfQotCi0gICAgaWYgKHB1Ymxpc2hVUkwgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hfVVJMLCBwdWJsaXNoVVJMKTsKLSAgICAKLSAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlVERElfVVNFUk5BTUUsIHVzZXJuYW1lKTsKLQotICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuVURESV9QQVNTV09SRCwgcGFzc3dvcmQpOwotCi0gICAgaWYgKGNoZWNrVXNlckRlZmluZWRDYXRlZ29yaWVzQ2hlY2tlZCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuQ0hFQ0tfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMsY2hlY2tVc2VyRGVmaW5lZENhdGVnb3JpZXNDaGVja2VkKTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLkNIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTKTsKLSAgICAgIAotICAgIGlmIChjYXRlZ29yaWVzRGlyZWN0b3J5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5DQVRFR09SSUVTX0RJUkVDVE9SWSxjYXRlZ29yaWVzRGlyZWN0b3J5KTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JJRVNfRElSRUNUT1JZKTsKLQotICAgIGZvcm1Ub29sLnVwZGF0ZVByb3BlcnR5VGFibGUocHJvcGVydHlUYWJsZV8pOwotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGdhdGhlcldTVXNlckRlZmluZWRDYXRlZ29yaWVzKFVERElQcm94eSBwcm94eSxIYXNodGFibGUgY2F0ZWdvcnlNb2RlbHMpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUJhZyBjYXRlZ29yeUJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgY2F0ZWdvcnlCYWcuYWRkKG5ldyBLZXllZFJlZmVyZW5jZSgiIiwiY2F0ZWdvcml6YXRpb24iLFRNb2RlbC5UWVBFU19UTU9ERUxfS0VZKSk7Ci0gICAgICBUTW9kZWxMaXN0IHRNb2RlbExpc3QgPSBwcm94eS5maW5kX3RNb2RlbCgiJSIsY2F0ZWdvcnlCYWcsbnVsbCxudWxsLDEwMCk7Ci0gICAgICBUTW9kZWxJbmZvcyB0TW9kZWxJbmZvcyA9IHRNb2RlbExpc3QuZ2V0VE1vZGVsSW5mb3MoKTsKLSAgICAgIFZlY3RvciB0TW9kZWxLZXlWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTx0TW9kZWxJbmZvcy5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBUTW9kZWxJbmZvIHRNb2RlbEluZm8gPSB0TW9kZWxJbmZvcy5nZXQoaSk7Ci0gICAgICAgIHRNb2RlbEtleVZlY3Rvci5hZGRFbGVtZW50KHRNb2RlbEluZm8uZ2V0VE1vZGVsS2V5KCkpOwotICAgICAgfQotICAgICAgVE1vZGVsRGV0YWlsIHRNb2RlbERldGFpbCA9IHByb3h5LmdldF90TW9kZWxEZXRhaWwodE1vZGVsS2V5VmVjdG9yKTsKLSAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSB0TW9kZWxEZXRhaWwuZ2V0VE1vZGVsVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTx0TW9kZWxWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgVE1vZGVsIHRNb2RlbCA9IChUTW9kZWwpdE1vZGVsVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBkaXNwbGF5TmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjYXRlZ29yeUtleSA9IG51bGw7Ci0gICAgICAgIGNhdGVnb3J5QmFnID0gdE1vZGVsLmdldENhdGVnb3J5QmFnKCk7Ci0gICAgICAgIGZvciAoaW50IGo9MDtqPGNhdGVnb3J5QmFnLnNpemUoKTtqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IGNhdGVnb3J5QmFnLmdldChqKTsKLSAgICAgICAgICBTdHJpbmcga3JUTW9kZWxLZXkgPSBrci5nZXRUTW9kZWxLZXkoKTsKLSAgICAgICAgICBpZiAoa3JUTW9kZWxLZXkuZXF1YWxzSWdub3JlQ2FzZShUTW9kZWwuR0VORVJBTF9LRVlXT1JEU19UTU9ERUxfS0VZKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcga3JLZXlOYW1lID0ga3IuZ2V0S2V5TmFtZSgpOwotICAgICAgICAgICAgaWYgKGtyS2V5TmFtZS5lcXVhbHMoInVybjp4LWlibTp1ZGRpOmN1c3RvbVRheG9ub215OmtleSIpKQotICAgICAgICAgICAgICBjYXRlZ29yeUtleSA9IGtyLmdldEtleVZhbHVlKCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChrcktleU5hbWUuZXF1YWxzKCJ1cm46eC1pYm06dWRkaTpjdXN0b21UYXhvbm9teTpkaXNwbGF5TmFtZSIpKQotICAgICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGtyLmdldEtleVZhbHVlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGtyVE1vZGVsS2V5LmVxdWFsc0lnbm9yZUNhc2UoVE1vZGVsLlRZUEVTX1RNT0RFTF9LRVkpKQotICAgICAgICAgICAgY2hlY2tlZCA9IGtyLmdldEtleVZhbHVlKCkuZXF1YWxzKCJjaGVja2VkIik7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhdGVnb3J5S2V5ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZGlzcGxheU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGRpc3BsYXlOYW1lID0gdE1vZGVsLmdldE5hbWVTdHJpbmcoKTsKLSAgICAgICAgICBDYXRlZ29yeU1vZGVsIGNhdGVnb3J5TW9kZWwgPSBuZXcgQ2F0ZWdvcnlNb2RlbCgpOwotICAgICAgICAgIGNhdGVnb3J5TW9kZWwuc2V0Q2F0ZWdvcnlLZXkoY2F0ZWdvcnlLZXkpOwotICAgICAgICAgIGNhdGVnb3J5TW9kZWwuZW5hYmxlQ2hlY2tlZChjaGVja2VkKTsKLSAgICAgICAgICBjYXRlZ29yeU1vZGVsLnNldERpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKLSAgICAgICAgICBTdHJpbmcgdE1vZGVsS2V5ID0gdE1vZGVsLmdldFRNb2RlbEtleSgpOwotICAgICAgICAgIGNhdGVnb3J5TW9kZWwuc2V0VE1vZGVsS2V5KHRNb2RlbEtleSk7Ci0gICAgICAgICAgY2F0ZWdvcnlNb2RlbHMucHV0KHRNb2RlbEtleSxjYXRlZ29yeU1vZGVsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVnaXN0cnlOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5SRUdJU1RSWV9OQU1FKTsKLSAgICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCk7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUkFUSU9OX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcm5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlVERElfVVNFUk5BTUUpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5VRERJX1BBU1NXT1JEKTsKLSAgICAgIGJvb2xlYW4gY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXNDaGVja2VkID0gKHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkNIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTKSAhPSBudWxsKTsKLSAgICAgIFN0cmluZyBjYXRlZ29yaWVzRGlyZWN0b3J5ID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5DQVRFR09SSUVTX0RJUkVDVE9SWSk7Ci0KLSAgICAgIFN0cmluZyByZWNvZ25pemVkUHVibGlzaFVSTCA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRLbm93blJlZ2lzdHJ5UHVibGlzaFVSTChpbnF1aXJ5VVJMKTsKLSAgICAgIFN0cmluZyByZWNvZ25pemVkUmVnaXN0cmF0aW9uVVJMID0gdWRkaVBlcnNwZWN0aXZlLmdldEtub3duUmVnaXN0cnlSZWdpc3RyYXRpb25VUkwoaW5xdWlyeVVSTCk7Ci0gICAgICAKLSAgICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICAgIHB1Ymxpc2hVUkwgPSByZWNvZ25pemVkUHVibGlzaFVSTDsKLSAgICAgIGlmIChyZWdpc3RyYXRpb25VUkwgPT0gbnVsbCkKLSAgICAgICAgcmVnaXN0cmF0aW9uVVJMID0gcmVjb2duaXplZFJlZ2lzdHJhdGlvblVSTDsKLSAgICAgICAgCi0gICAgICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSkoY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpLmdldFJvb3ROb2RlKCkpOwotICAgICAgVURESU1haW5FbGVtZW50IHVkZGlNYWluRWxlbWVudCA9IChVRERJTWFpbkVsZW1lbnQpdWRkaU1haW5Ob2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgIHByb3BzLnB1dChBY3Rpb25JbnB1dHMuVFJBTlNQT1JUX0NMQVNTX05BTUUsIEFjdGlvbklucHV0cy5UUkFTUE9SVF9DTEFTUyk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSBuZXcgVURESVByb3h5KHByb3BzKTsKLSAgICAgIHByb3h5LnNldElucXVpcnlVUkwobmV3IFVSTChpbnF1aXJ5VVJMKSk7Ci0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnaXN0cnlFbGVtZW50ID0gbmV3IFJlZ2lzdHJ5RWxlbWVudChwcm94eSxpbnF1aXJ5VVJMLHJlZ2lzdHJ5TmFtZSx1ZGRpTWFpbkVsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAvLyBTZXQgcmVnaXN0cnkgZWxlbWVudCdzIHB1Ymxpc2ggVVJMIGFuZCByZWdpc3RyYXRpb24gVVJMIHByb3ZpZGVkIGJ5IGV4dGVybmFsIGNhbGxlcnMgKGUuZy4gZmF2b3JpdGVzKS4KLSAgICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgICAgIHJlZ2lzdHJ5RWxlbWVudC5zZXRDYWNoZWRQdWJsaXNoVVJMKHB1Ymxpc2hVUkwpOwotICAgICAgaWYgKHJlZ2lzdHJhdGlvblVSTCAhPSBudWxsKQotICAgICAgICByZWdpc3RyeUVsZW1lbnQuc2V0UmVnaXN0cmF0aW9uVVJMKHJlZ2lzdHJhdGlvblVSTCk7Ci0gICAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCkKLSAgICAgIAlyZWdpc3RyeUVsZW1lbnQuc2V0VXNlcklkKHVzZXJuYW1lKTsKLSAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgICAgCXJlZ2lzdHJ5RWxlbWVudC5zZXRDcmVkKHBhc3N3b3JkKTsKLSAgICAgIHJlZ2lzdHJ5RWxlbWVudC5zZXRDaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllcyhjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllc0NoZWNrZWQpOwotICAgICAgaWYgKGNoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzQ2hlY2tlZCkKLSAgICAgIHsKLSAgICAgICAgSGFzaHRhYmxlIGNhdGVnb3J5TW9kZWxzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBnYXRoZXJXU1VzZXJEZWZpbmVkQ2F0ZWdvcmllcyhwcm94eSxjYXRlZ29yeU1vZGVscyk7Ci0gICAgICAgIGlmIChjYXRlZ29yeU1vZGVscy5zaXplKCkgPiAwKQotICAgICAgICAgIHJlZ2lzdHJ5RWxlbWVudC5zZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoY2F0ZWdvcnlNb2RlbHMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX05PX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTX0ZPVU5EIikpOwotICAgICAgfQotICAgICAgcmVnaXN0cnlFbGVtZW50LnNldENhdGVnb3JpZXNEaXJlY3RvcnkoY2F0ZWdvcmllc0RpcmVjdG9yeSk7Ci0gICAgICB1ZGRpTWFpbkVsZW1lbnQuY29ubmVjdChyZWdpc3RyeUVsZW1lbnQsVURESU1vZGVsQ29uc3RhbnRzLlJFTF9SRUdJU1RSSUVTLE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHVkZGlNYWluTm9kZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgaW50IG5ld1JlZ2lzdHJ5Tm9kZUlkID0gdWRkaU1haW5Ob2RlLmdldENoaWxkTm9kZShyZWdpc3RyeUVsZW1lbnQpLmdldE5vZGVJZCgpOwotICAgICAgLy8gU2VsZWN0IHRoZSBuZXcgcmVnaXN0cnkgbm9kZSBhbmQgYWRkIHRoZSBzZWxlY3QgYWN0aW9uIHRvIHRoZSBoaXN0b3J5LgotICAgICAgbm9kZU1hbmFnZXIuc2V0U2VsZWN0ZWROb2RlSWQobmV3UmVnaXN0cnlOb2RlSWQpOwotICAgICAgTm9kZSByZWdpc3RyeU5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gcmVnaXN0cnlOb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgICAgYWRkVG9IaXN0b3J5KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpLmdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKHRydWUpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19SRUdJU1RSWV9PUEVORUQiLG5ldyBTdHJpbmdbXXtyZWdpc3RyeU5hbWUsaW5xdWlyeVVSTH0pKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMKTsKLSAgICB9Ci0gICAgLyoKLSAgICBjYXRjaCAoRm9ybUlucHV0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9QdWJsaXNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1B1Ymxpc2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhMjIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1B1Ymxpc2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQdWJsaXNoQWN0aW9uIGV4dGVuZHMgVURESVByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgc3ViUXVlcnlLZXlfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzdWJRdWVyeUluaXRpYXRlZF87Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmV3U3ViUXVlcnlfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YlF1ZXJ5R2V0XzsKLSAgcHJvdGVjdGVkIFN0cmluZyBuZXdTdWJRdWVyeUl0ZW1fOwotICBwcm90ZWN0ZWQgUmVnaXN0cnlOb2RlIHJlZ05vZGVfOwotCi0gIHB1YmxpYyBQdWJsaXNoQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHN1YlF1ZXJ5S2V5XyA9IG51bGw7Ci0gICAgaXNTdWJRdWVyeUdldF8gPSBmYWxzZTsKLSAgICBzdWJRdWVyeUluaXRpYXRlZF8gPSBmYWxzZTsKLSAgICByZWdOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gU2V0dXAgZm9yIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyVHJhbnNmb3JtZXIKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk1VTFRJUEFSVF9GT1JNX0RBVEFfUEFSU0VSLCBwYXJzZXIpOwotIAotICAgIG5ld1N1YlF1ZXJ5XyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfSU5JVElBVEVEKTsKLSAgICBTdHJpbmcgaXNTdWJRdWVyeUdldFN0cmluZyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgIG5ld1N1YlF1ZXJ5SXRlbV8gPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0pOwotICAgIHN1YlF1ZXJ5S2V5XyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0gICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlfKTsKLSAgICBmb3JtVG9vbFBJLmNsZWFyRXJyb3JzKCk7Ci0KLSAgICBpZiAobmV3U3ViUXVlcnlfICE9IG51bGwgJiYgbmV3U3ViUXVlcnlfLmxlbmd0aCgpID4gMCkKLSAgICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IHRydWU7Ci0gICAgZWxzZQotICAgICAgc3ViUXVlcnlJbml0aWF0ZWRfID0gZmFsc2U7Ci0KLSAgICBpZiAoaXNTdWJRdWVyeUdldFN0cmluZyAhPSBudWxsKQotICAgICAgaXNTdWJRdWVyeUdldF8gPSBCb29sZWFuLnZhbHVlT2YoaXNTdWJRdWVyeUdldFN0cmluZykuYm9vbGVhblZhbHVlKCk7Ci0KLSAgICBpZiAoIXByb2Nlc3NPdGhlcnMocGFyc2VyLGZvcm1Ub29sUEkpICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotCi0gICAgZm9yIChpbnQgaT0wO2k8cmVtb3ZlZFByb3BlcnRpZXNfLnNpemUoKTtpKyspCi0gICAgICBmb3JtVG9vbFBJLnJlbW92ZVByb3BlcnR5KHJlbW92ZWRQcm9wZXJ0aWVzXy5lbGVtZW50QXQoaSkpOwotICAgIGZvcm1Ub29sUEkudXBkYXRlUHJvcGVydHlUYWJsZShwcm9wZXJ0eVRhYmxlXyk7Ci0KLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgU3RyaW5nIHVzZXJJZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICBib29sZWFuIHZhbGlkYXRlQXV0aGVudGljYXRpb24gPSAhcmVnRWxlbWVudC5pc0xvZ2dlZEluKCk7Ci0KLSAgICBpZiAocHVibGlzaFVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiB2YWxpZGF0ZUF1dGhlbnRpY2F0aW9uICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcocHVibGlzaFVSTCkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTCIpKTsKLSAgICB9Ci0KLSAgICBpZiAodXNlcklkICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIH0KLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmIHZhbGlkYXRlQXV0aGVudGljYXRpb24gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh1c2VySWQpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VTRVJJRCIpKTsKLSAgICB9Ci0KLSAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRQdWJsaXNoZWRJdGVtTm9kZShCdXNpbmVzc0VudGl0eSBiZSxSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCkKLSAgewotICAgIEJ1c2luZXNzRWxlbWVudCBiZUVsZW1lbnQgPSBuZXcgQnVzaW5lc3NFbGVtZW50KGJlLHJlZ0VsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgUHVibGlzaGVkSXRlbXNFbGVtZW50IHB1Ymxpc2hlZEJ1c2luZXNzZXNFbGVtZW50ID0gcmVnRWxlbWVudC5nZXRQdWJsaXNoZWRCdXNpbmVzc2VzRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBwdWJsaXNoZWRCdXNpbmVzc2VzRWxlbWVudC5nZXRJdGVtcygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIEJ1c2luZXNzRWxlbWVudCBlbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBCdXNpbmVzc0VudGl0eSBlbGVtZW50QkUgPSBlbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCk7Ci0gICAgICBpZiAoZWxlbWVudEJFLmdldEJ1c2luZXNzS2V5KCkuZXF1YWxzKGJlLmdldEJ1c2luZXNzS2V5KCkpKQotICAgICAgewotICAgICAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvbm5lY3RFbGVtZW50cyhwdWJsaXNoZWRCdXNpbmVzc2VzRWxlbWVudCxiZUVsZW1lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUHVibGlzaGVkSXRlbU5vZGUoQnVzaW5lc3NTZXJ2aWNlIGJzLFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU2VydmljZUVsZW1lbnQgc0VsZW1lbnQgPSBuZXcgU2VydmljZUVsZW1lbnQoYnMscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICBQdWJsaXNoZWRJdGVtc0VsZW1lbnQgcHVibGlzaGVkU2VydmljZXNFbGVtZW50ID0gcmVnRWxlbWVudC5nZXRQdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gcHVibGlzaGVkU2VydmljZXNFbGVtZW50LmdldEl0ZW1zKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU2VydmljZUVsZW1lbnQgZWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBCdXNpbmVzc1NlcnZpY2UgZWxlbWVudEJTID0gZWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICAgIGlmIChlbGVtZW50QlMuZ2V0U2VydmljZUtleSgpLmVxdWFscyhicy5nZXRTZXJ2aWNlS2V5KCkpKQotICAgICAgewotICAgICAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGNvbm5lY3RFbGVtZW50cyhwdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQsc0VsZW1lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUHVibGlzaGVkSXRlbU5vZGUoVE1vZGVsIHRNb2RlbCxSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCkKLSAgewotICAgIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNpRWxlbWVudCA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCh0TW9kZWwscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICBQdWJsaXNoZWRJdGVtc0VsZW1lbnQgcHVibGlzaGVkU2VydmljZUludGVyZmFjZXNFbGVtZW50ID0gcmVnRWxlbWVudC5nZXRQdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlc0VsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gcHVibGlzaGVkU2VydmljZUludGVyZmFjZXNFbGVtZW50LmdldEl0ZW1zKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgZWxlbWVudCA9IChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBUTW9kZWwgZWxlbWVudFRNb2RlbCA9IGVsZW1lbnQuZ2V0VE1vZGVsKCk7Ci0gICAgICBpZiAodE1vZGVsLmdldFRNb2RlbEtleSgpLmVxdWFscyhlbGVtZW50VE1vZGVsLmdldFRNb2RlbEtleSgpKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBjb25uZWN0RWxlbWVudHMocHVibGlzaGVkU2VydmljZUludGVyZmFjZXNFbGVtZW50LHNpRWxlbWVudCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgY29ubmVjdEVsZW1lbnRzKFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBwdWJsaXNoZWRJdGVtc0VsZW1lbnQsVHJlZUVsZW1lbnQgaXRlbUVsZW1lbnQpCi0gIHsKLSAgICBwdWJsaXNoZWRJdGVtc0VsZW1lbnQuY29ubmVjdChpdGVtRWxlbWVudCxVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9JVEVNUyxNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIGludCBuZXdOb2RlSWQgPSByZWdOb2RlXy5nZXRDaGlsZE5vZGUocHVibGlzaGVkSXRlbXNFbGVtZW50KS5nZXRDaGlsZE5vZGUoaXRlbUVsZW1lbnQpLmdldE5vZGVJZCgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gcmVnTm9kZV8uZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChuZXdOb2RlSWQpOwotICAgIE5vZGUgbmV3Tm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gbmV3Tm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgYWRkVG9IaXN0b3J5KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLHNlbGVjdGVkVG9vbC5nZXRTZWxlY3RUb29sQWN0aW9uSHJlZih0cnVlKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlF1ZXJ5SW5pdGlhdGVkKCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUluaXRpYXRlZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlF1ZXJ5R2V0KCkKLSAgewotICAgIHJldHVybiBpc1N1YlF1ZXJ5R2V0XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3ViUXVlcnlLZXkoKQotICB7Ci0gICAgcmV0dXJuIHN1YlF1ZXJ5S2V5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ld1N1YlF1ZXJ5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnlJdGVtKCkKLSAgewotICAgIHJldHVybiBuZXdTdWJRdWVyeUl0ZW1fOwotICB9Ci0gIAotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCArIDFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoIC0gMV0gPSBuZXcgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcihjb250cm9sbGVyXyk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODliYzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoVURESU5vZGVBY3Rpb24gZXh0ZW5kcyBVRERJTm9kZUFjdGlvbgotewotICBwcml2YXRlIFZlY3RvciBzdGFsZU5vZGVzXzsKLSAgcHVibGljIFJlZnJlc2hVRERJTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxTdHJpbmcudmFsdWVPZihjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGVJZCgpKSk7Ci0gICAgc3RhbGVOb2Rlc18gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2RlQWN0aW9uSlNQLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHZlcmlmeU5vZGVEYXRhKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpOwotICAgIGlmIChub2RlIGluc3RhbmNlb2YgQnVzaW5lc3NOb2RlKQotICAgICAgcmV0dXJuIHJlZnJlc2hCdXNpbmVzc0VsZW1lbnQoKEJ1c2luZXNzTm9kZSlub2RlKTsKLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2VydmljZU5vZGUpCi0gICAgICByZXR1cm4gcmVmcmVzaFNlcnZpY2VFbGVtZW50KChTZXJ2aWNlTm9kZSlub2RlKTsKLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2VydmljZUludGVyZmFjZU5vZGUpCi0gICAgICByZXR1cm4gcmVmcmVzaFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KChTZXJ2aWNlSW50ZXJmYWNlTm9kZSlub2RlKTsKLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgUXVlcnlOb2RlKQotICAgIHsKLSAgICAgIC8vIE5vdGhpbmcgdG8gdmVyaWZ5Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIFJlZ2lzdHJ5Tm9kZQotICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBSZWdpc3RyeU5vZGUpCi0gICAgICAgIHJlZnJlc2hSZWdpc3RyeUVsZW1lbnQoKFJlZ2lzdHJ5Tm9kZSlub2RlKTsKLSAgICAgICAgCi0gICAgICAvLyBGb2xkZXJOb2RlcwotICAgICAgVmVjdG9yIGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIFZlY3RvciByZWZyZXNoQWN0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGNoaWxkTm9kZXMuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBjaGlsZE5vZGUgPSAoTm9kZSljaGlsZE5vZGVzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgUmVmcmVzaFVERElOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWZyZXNoVURESU5vZGVBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICBhY3Rpb24uc2V0U3RhbGVOb2RlcyhzdGFsZU5vZGVzXyk7Ci0gICAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgICAgU3RyaW5nIGNoaWxkTm9kZUlkU3RyaW5nID0gU3RyaW5nLnZhbHVlT2YoY2hpbGROb2RlLmdldE5vZGVJZCgpKTsKLSAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxjaGlsZE5vZGVJZFN0cmluZyk7Ci0gICAgICAgIGlmICghYWN0aW9uLnZlcmlmeU5vZGVEYXRhKCkpCi0gICAgICAgICAgc3RhbGVOb2Rlc18uYWRkRWxlbWVudChjaGlsZE5vZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmVmcmVzaEFjdGlvbnMuYWRkRWxlbWVudChhY3Rpb24pOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxyZWZyZXNoQWN0aW9ucyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgdm9pZCByZWZyZXNoUmVnaXN0cnlFbGVtZW50KFJlZ2lzdHJ5Tm9kZSByZWdOb2RlKQotICB7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBIYXNodGFibGUgdXNlckRlZmluZWRDYXRlZ29yaWVzID0gbnVsbDsKLSAgICBpZiAocmVnRWxlbWVudC5nZXRDaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllcygpKQotICAgIHsKLSAgICAgIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIE9wZW5SZWdpc3RyeUFjdGlvbiBvcGVuUmVnQWN0aW9uID0gbmV3IE9wZW5SZWdpc3RyeUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICBvcGVuUmVnQWN0aW9uLmdhdGhlcldTVXNlckRlZmluZWRDYXRlZ29yaWVzKHJlZ0VsZW1lbnQuZ2V0UHJveHkoKSx1c2VyRGVmaW5lZENhdGVnb3JpZXMpOwotICAgICAgaWYgKCF1c2VyRGVmaW5lZENhdGVnb3JpZXMua2V5cygpLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICB1c2VyRGVmaW5lZENhdGVnb3JpZXMgPSBudWxsOwotICAgICAgICByZWdOb2RlLnNldEltYWdlUGF0aChSZWdpc3RyeU5vZGUuSU1BR0VfUEFUSF9TVEFOREFSRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjYXRlZ29yaWVzRGlyZWN0b3J5ID0gcmVnRWxlbWVudC5nZXRDYXRlZ29yaWVzRGlyZWN0b3J5KCk7Ci0gICAgICAgIEFkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gYWRkQWN0aW9uID0gbmV3IEFkZFJlZ2lzdHJ5VG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICBpZiAoY2F0ZWdvcmllc0RpcmVjdG9yeSAhPSBudWxsKQotICAgICAgICAgIGFkZEFjdGlvbi5saW5rQ2F0ZWdvcnlNb2RlbHNXaXRoU2F2ZWREYXRhKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcy5lbGVtZW50cygpLGNhdGVnb3JpZXNEaXJlY3RvcnkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYWRkQWN0aW9uLmxpbmtDYXRlZ29yeU1vZGVsc1dpdGhTYXZlZERhdGEocmVnRWxlbWVudC5nZXROYW1lKCksdXNlckRlZmluZWRDYXRlZ29yaWVzLmVsZW1lbnRzKCkpOwotICAgICAgICByZWdOb2RlLnNldEltYWdlUGF0aChSZWdpc3RyeU5vZGUuSU1BR0VfUEFUSF9XSVRIX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmVnRWxlbWVudC5zZXRVc2VyRGVmaW5lZENhdGVnb3JpZXModXNlckRlZmluZWRDYXRlZ29yaWVzKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZWZyZXNoQnVzaW5lc3NFbGVtZW50KEJ1c2luZXNzTm9kZSBidXNOb2RlKQotICB7Ci0gICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KWJ1c05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgdXVpZEtleSA9IGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKS5nZXRCdXNpbmVzc0tleSgpOwotICAgIFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24gdmVyaWZ5QWN0aW9uID0gbmV3IFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gdmVyaWZ5QWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLHV1aWRLZXkpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUkVGUkVTSF9OT0RFLGJ1c05vZGUpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUsQm9vbGVhbi5UUlVFKTsKLSAgICBib29sZWFuIHZlcmlmeVJlc3VsdCA9IHZlcmlmeUFjdGlvbi5ydW4oKTsKLSAgICBpZiAodmVyaWZ5UmVzdWx0KQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxuZXcgQnVzaW5lc3NFbGVtZW50KChCdXNpbmVzc0VudGl0eSlwcm9wZXJ0eVRhYmxlLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpLGJ1c0VsZW1lbnQuZ2V0TW9kZWwoKSkpOwotICAgIHJldHVybiB2ZXJpZnlSZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVmcmVzaFNlcnZpY2VFbGVtZW50KFNlcnZpY2VOb2RlIHNlcnZpY2VOb2RlKQotICB7Ci0gICAgU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoU2VydmljZUVsZW1lbnQpc2VydmljZU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgdXVpZEtleSA9IHNlcnZpY2VFbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpLmdldFNlcnZpY2VLZXkoKTsKLSAgICBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24gdmVyaWZ5QWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSB2ZXJpZnlBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSx1dWlkS2V5KTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFRlJFU0hfTk9ERSxzZXJ2aWNlTm9kZSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSxCb29sZWFuLlRSVUUpOwotICAgIGJvb2xlYW4gdmVyaWZ5UmVzdWx0ID0gdmVyaWZ5QWN0aW9uLnJ1bigpOwotICAgIGlmICh2ZXJpZnlSZXN1bHQpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNULG5ldyBTZXJ2aWNlRWxlbWVudCgoQnVzaW5lc3NTZXJ2aWNlKXByb3BlcnR5VGFibGUuZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCksc2VydmljZUVsZW1lbnQuZ2V0TW9kZWwoKSkpOwotICAgIHJldHVybiB2ZXJpZnlSZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVmcmVzaFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KFNlcnZpY2VJbnRlcmZhY2VOb2RlIHNpTm9kZSkKLSAgewotICAgIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNpRWxlbWVudCA9IChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudClzaU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgdXVpZEtleSA9IHNpRWxlbWVudC5nZXRUTW9kZWwoKS5nZXRUTW9kZWxLZXkoKTsKLSAgICBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24gdmVyaWZ5QWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSB2ZXJpZnlBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVksdXVpZEtleSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5SRUZSRVNIX05PREUsc2lOb2RlKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFLEJvb2xlYW4uVFJVRSk7Ci0gICAgYm9vbGVhbiB2ZXJpZnlSZXN1bHQgPSB2ZXJpZnlBY3Rpb24ucnVuKCk7Ci0gICAgaWYgKHZlcmlmeVJlc3VsdCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QsbmV3IFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KChUTW9kZWwpcHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKSxzaUVsZW1lbnQuZ2V0TW9kZWwoKSkpOwotICAgIHJldHVybiB2ZXJpZnlSZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBjb25uZWN0RWxlbWVudHMoTm9kZSBwYXJlbnROb2RlLFRyZWVFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBUcmVlRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gcGFyZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFN0cmluZyByZWwgPSBudWxsOwotICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgUHVibGlzaGVkSXRlbXNOb2RlKQotICAgICAgcmVsID0gVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVM7Ci0gICAgZWxzZSBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIFF1ZXJ5Tm9kZSkKLSAgICAgIHJlbCA9IFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUllfUkVTVUxUUzsKLSAgICBlbHNlIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgUXVlcnlQYXJlbnROb2RlKQotICAgICAgcmVsID0gVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTOwotICAgIHBhcmVudEVsZW1lbnQuY29ubmVjdChuZXdFbGVtZW50LHJlbCxNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIE5vZGUgbmV3Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKG5ld0VsZW1lbnQpOwotICAgIGludCBuZXdOb2RlSWQgPSBuZXdOb2RlLmdldE5vZGVJZCgpOwotICAgIG5vZGVNYW5hZ2VyXy5zZXRTZWxlY3RlZE5vZGVJZChuZXdOb2RlSWQpOwotICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gbmV3Tm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgYWRkVG9IaXN0b3J5KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLHNlbGVjdGVkVG9vbC5nZXRTZWxlY3RUb29sQWN0aW9uSHJlZih0cnVlKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpZiAoIWlzU3RhbGVOb2RlKG5vZGVJZCkpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKTsKLSAgICAgIE9iamVjdCBsYXRlc3RPYmplY3QgPSBwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKTsKLSAgICAgIGlmIChsYXRlc3RPYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGxhdGVzdE9iamVjdCBpbnN0YW5jZW9mIFZlY3RvcikKLSAgICAgICAgewotICAgICAgICAgIFZlY3RvciByZWZyZXNoQWN0aW9ucyA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCk7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wO2k8cmVmcmVzaEFjdGlvbnMuc2l6ZSgpO2krKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBSZWZyZXNoVURESU5vZGVBY3Rpb24gcmVmcmVzaEFjdGlvbiA9IChSZWZyZXNoVURESU5vZGVBY3Rpb24pcmVmcmVzaEFjdGlvbnMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgcmVmcmVzaEFjdGlvbi5ydW4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbm9kZU1hbmFnZXJfLnNldFNlbGVjdGVkTm9kZUlkKG5vZGVJZCk7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBUcmVlRWxlbWVudCBvbGRFbGVtZW50ID0gbm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgIG9sZEVsZW1lbnQuZGlzY29ubmVjdEFsbCgpOwotICAgICAgICAgIGNvbm5lY3RFbGVtZW50cyhub2RlLmdldFBhcmVudCgpLChUcmVlRWxlbWVudClwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gUXVlcnlOb2RlcwotICAgICAgICBRdWVyeU5vZGUgcXVlcnlOb2RlID0gKFF1ZXJ5Tm9kZSlub2RlOwotICAgICAgICBGaW5kQWN0aW9uIGZpbmRBY3Rpb24gPSBxdWVyeU5vZGUuZ2V0RmluZEFjdGlvbigpOwotICAgICAgICBmaW5kQWN0aW9uLnNldFJlZnJlc2hBY3Rpb24odHJ1ZSk7Ci0gICAgICAgIGlmICghZmluZEFjdGlvbi5ydW4oKSkKLSAgICAgICAgICBxdWVyeU5vZGUucmVtb3ZlQ2hpbGROb2Rlcyh0cnVlKTsKLSAgICAgICAgZmluZEFjdGlvbi5zZXRSZWZyZXNoQWN0aW9uKGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19OT0RFX1JFRlJFU0hFRCIsbm9kZS5nZXROb2RlTmFtZSgpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgVmVjdG9yIGdldFN0YWxlTm9kZXMoKQotICB7Ci0gICAgcmV0dXJuIHN0YWxlTm9kZXNfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTdGFsZU5vZGVzKFZlY3RvciBzdGFsZU5vZGVzKQotICB7Ci0gICAgc3RhbGVOb2Rlc18gPSBzdGFsZU5vZGVzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2Rlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNkMjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2Rlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoVURESU5vZGVzQWN0aW9uIGV4dGVuZHMgVURESVByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHByaXZhdGUgVmVjdG9yIHN0YWxlTm9kZXNfOwotCi0gIHB1YmxpYyBSZWZyZXNoVURESU5vZGVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHN0YWxlTm9kZXNfID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHNlbGVjdGVkTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgLy8gVGhlIGNsaWVudCBKYXZhc2NyaXB0IGVuZm9yY2VzIHRoZSBydWxlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSB0aGUgZm9ybSBjYW4gYmUgc3VibWl0dGVkLgotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlNFTEVDVEVEX05PREVJRFMsc2VsZWN0ZWROb2RlSWRzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBpbnQgY29sbGVjdG9yTm9kZUlkID0gZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkuZ2V0Tm9kZUlkKCk7Ci0gICAgU3RyaW5nW10gc2VsZWN0ZWROb2RlSWRzID0gKFN0cmluZ1tdKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlNFTEVDVEVEX05PREVJRFMpOwotICAgIFJlZnJlc2hVRERJTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVmcmVzaFVERElOb2RlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8c2VsZWN0ZWROb2RlSWRzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZS5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxzZWxlY3RlZE5vZGVJZHNbaV0pOwotICAgICAgaWYgKGFjdGlvbi52ZXJpZnlOb2RlRGF0YSgpKQotICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KHNlbGVjdGVkTm9kZUlkc1tpXSk7Ci0gICAgICAgIHN0YWxlTm9kZXNfLmFkZEVsZW1lbnQobmF2aWdhdG9yTWFuYWdlci5nZXROb2RlKG5vZGVJZCkpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PREVfREFUQV9WQUxJREFUSU9OX0ZBSUxFRCIsbmF2aWdhdG9yTWFuYWdlci5nZXROb2RlKG5vZGVJZCkuZ2V0Tm9kZU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICBuYXZpZ2F0b3JNYW5hZ2VyLnNldFNlbGVjdGVkTm9kZUlkKGNvbGxlY3Rvck5vZGVJZCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVmVjdG9yIGdldFN0YWxlTm9kZXMoKQotICB7Ci0gICAgcmV0dXJuIHN0YWxlTm9kZXNfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDIyM2Y1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uIGV4dGVuZHMgRmluZEFjdGlvbgotewotICBwdWJsaWMgUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1VVSUQpKTsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgdXVpZEtleSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0tFWSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICAKLSAgICBpZiAodXVpZEtleSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVksdXVpZEtleSk7Ci0gICAgICAKLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHV1aWRLZXkpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9VVUlEX0tFWSIpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJvb2xlYW4gc2hvdWxkQWRkUXVlcnlOb2RlID0gKHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFKSA9PSBudWxsKTsgICAgICAKLSAgICAgIFN0cmluZyB1dWlkS2V5ID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSk7Ci0gICAgICAKLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUgb3IgZXZlbiBVRERJTWFpbk5vZGUuCi0gICAgICBpZiAocmVnTm9kZV8gPT0gbnVsbCkKLSAgICAgICAgcmVnTm9kZV8gPSBnZXRSZWdpc3RyeU5vZGUoKE5vZGUpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUkVGUkVTSF9OT0RFKSk7Ci0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5W10gYmVMaXN0ID0gbmV3IEJ1c2luZXNzRW50aXR5WzFdOwotICAgICAgVmVjdG9yIGJlVmVjdG9yID0gcHJveHkuZ2V0X2J1c2luZXNzRGV0YWlsKHV1aWRLZXkpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCk7Ci0gICAgICBpZiAoYmVWZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgYmVWZWN0b3IudG9BcnJheShiZUxpc3QpOwotICAgICAgICBpZiAoc2hvdWxkQWRkUXVlcnlOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICAgICAgcXVlcnlFbGVtZW50XyA9IG5ldyBRdWVyeUVsZW1lbnQoYmVMaXN0LHF1ZXJ5TmFtZSxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgICAgICAgIGFkZFF1ZXJ5Tm9kZSgpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19CVVNJTkVTU0VTX0ZPVU5EIixTdHJpbmcudmFsdWVPZihiZUxpc3QubGVuZ3RoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QsYmVMaXN0WzBdKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBGb3JtSW5wdXRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19CVVNJTkVTU0VTX0ZPVU5EIikpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZvcm1JbnB1dEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY4ZmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuRm9ybUlucHV0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5CdXNpbmVzc0luZm9zOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEFjdGlvbiBleHRlbmRzIEZpbmRBY3Rpb24KLXsKLSAgcHVibGljIFJlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCkpOyAgICAKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfU0VBUkNIX1NFVCxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9TRUFSQ0hfU0VUKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1JFU1VMVFMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9NQVhfUkVTVUxUUykpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG93bmVkQ2hlY2tlZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9PV05FRCk7Ci0gICAgU3RyaW5nW10gbGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UpOwotICAgIFN0cmluZ1tdIG5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUpOwotICAgIFN0cmluZ1tdIGlkVHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9UWVBFKTsKLSAgICBTdHJpbmdbXSBpZEtleU5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGlkS2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX1ZBTFVFKTsKLSAgICBTdHJpbmdbXSBjYXRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSk7Ci0gICAgU3RyaW5nW10gc2lOb2RlSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgU3RyaW5nW10gZGlzY292ZXJ5VVJMVmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RJU0NPVkVSWVVSTCk7Ci0gICAgU3RyaW5nW10gZmluZFF1YWxpZmllclZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9GSU5EUVVBTElGSUVSKTsKLSAgICBTdHJpbmcgbWF4U2VhcmNoU2V0ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9TRUFSQ0hfU0VUKTsKLSAgICBTdHJpbmcgbWF4UmVzdWx0cyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfUkVTVUxUUyk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIE5vZGUgcmVnTm9kZSA9IGdldFJlZ2lzdHJ5Tm9kZSgpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgaWYgKG93bmVkQ2hlY2tlZCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfT1dORUQsb3duZWRDaGVja2VkKTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX09XTkVEKTsKLQotICAgIGlmIChsYW5ndWFnZXMgIT0gbnVsbCAmJiBuYW1lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBuYW1lVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8bmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgTmFtZSB1ZGRpNGpOYW1lOwotICAgICAgICBpZiAobGFuZ3VhZ2VzW2ldLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB1ZGRpNGpOYW1lID0gbmV3IE5hbWUobmFtZXNbaV0sbGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHVkZGk0ak5hbWUgPSBuZXcgTmFtZShuYW1lc1tpXSk7Ci0gICAgICAgIG5hbWVWZWN0b3IuYWRkRWxlbWVudCh1ZGRpNGpOYW1lKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTLG5hbWVWZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLQotICAgIGlmIChpZFR5cGVzICE9IG51bGwgJiYgaWRLZXlOYW1lcyAhPSBudWxsICYmIGlkS2V5VmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgSWRlbnRpZmllckJhZyBpZEJhZyA9IG5ldyBJZGVudGlmaWVyQmFnKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxpZEtleU5hbWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gbmV3IEtleWVkUmVmZXJlbmNlKGlkS2V5TmFtZXNbaV0saWRLZXlWYWx1ZXNbaV0saWRUeXBlc1tpXSk7Ci0gICAgICAgIGlkQmFnLmFkZChrcik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyxpZEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMpOwotCi0gICAgaWYgKGNhdFR5cGVzICE9IG51bGwgJiYgY2F0S2V5TmFtZXMgIT0gbnVsbCAmJiBjYXRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSBuZXcgQ2F0ZWdvcnlCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGNhdFR5cGVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gbmV3IEtleWVkUmVmZXJlbmNlKGNhdEtleU5hbWVzW2ldLGNhdEtleVZhbHVlc1tpXSxjYXRUeXBlc1tpXSk7Ci0gICAgICAgIGNhdEJhZy5hZGQoa3IpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyxjYXRCYWcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMpOwotCi0gICAgaWYgKHNpTm9kZUlkcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEFsdGhvdWdoIHdlIGFscmVhZHkgaGF2ZSB0aGUgInN1Ym1pdHRlZCIgZGF0YSwgZGVsZXRpb25zIG9jY3VyIG9uIHRoZSBjbGllbnQgc2lkZSBhbmQgdGh1cyB0aGUgbmVlZCB0byB0cmFjayB0aGlzIHVzaW5nIGhpZGRlbiBmb3JtIGVsZW1lbnRzLgotICAgICAgVmVjdG9yIGJ1c1NlcnZpY2VJbnRlcmZhY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgICAgIGlmIChidXNTZXJ2aWNlSW50ZXJmYWNlcyA9PSBudWxsKQotICAgICAgICBidXNTZXJ2aWNlSW50ZXJmYWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYnVzU2VydmljZUludGVyZmFjZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgIFZlY3RvciBidXNTZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSk7Ci0gICAgICBWZWN0b3IgdE1vZGVsS2V5U3RyaW5nVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgSGFzaHRhYmxlIHJlc3VsdEhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxzaU5vZGVJZHMubGVuZ3RoO2krKykKLSAgICAgICAgcmVzdWx0SGFzaC5wdXQoc2lOb2RlSWRzW2ldLEJvb2xlYW4uVFJVRSk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxidXNTZXJ2aWNlSW50ZXJmYWNlc0NvcHkuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpYnVzU2VydmljZUludGVyZmFjZXNDb3B5LmVsZW1lbnRBdChpKTsKLSAgICAgICAgaWYgKHJlc3VsdEhhc2guZ2V0KFN0cmluZy52YWx1ZU9mKGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJ1c1NlcnZpY2VJbnRlcmZhY2VzLmFkZEVsZW1lbnQobGlzdEVsZW1lbnQpOwotICAgICAgICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgIHRNb2RlbEtleVN0cmluZ1ZlY3Rvci5hZGRFbGVtZW50KHRNb2RlbC5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIFRNb2RlbEJhZyB0TW9kZWxCYWcgPSBuZXcgVE1vZGVsQmFnKHRNb2RlbEtleVN0cmluZ1ZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVMsYnVzU2VydmljZUludGVyZmFjZXMpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfVE1PREVMQkFHLHRNb2RlbEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1RNT0RFTEJBRyk7Ci0gICAgfQotCi0gICAgaWYgKGRpc2NvdmVyeVVSTFZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIERpc2NvdmVyeVVSTHMgZGlzY292ZXJ5VVJMcyA9IG5ldyBEaXNjb3ZlcnlVUkxzKCk7Ci0gICAgICBWZWN0b3IgZGlzY292ZXJ5VVJMVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8ZGlzY292ZXJ5VVJMVmFsdWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIERpc2NvdmVyeVVSTCBkaXNjb3ZlcnlVUkwgPSBuZXcgRGlzY292ZXJ5VVJMKGRpc2NvdmVyeVVSTFZhbHVlc1tpXSwiIik7Ci0gICAgICAgIGRpc2NvdmVyeVVSTFZlY3Rvci5hZGRFbGVtZW50KGRpc2NvdmVyeVVSTCk7Ci0gICAgICB9Ci0gICAgICBkaXNjb3ZlcnlVUkxzLnNldERpc2NvdmVyeVVSTFZlY3RvcihkaXNjb3ZlcnlVUkxWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyxkaXNjb3ZlcnlVUkxzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLQotICAgIGlmIChmaW5kUXVhbGlmaWVyVmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgRmluZFF1YWxpZmllcnMgZmluZFF1YWxpZmllcnMgPSBuZXcgRmluZFF1YWxpZmllcnMoKTsKLSAgICAgIFZlY3RvciBmaW5kUXVhbGlmaWVyVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8ZmluZFF1YWxpZmllclZhbHVlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBGaW5kUXVhbGlmaWVyIGZpbmRRdWFsaWZpZXIgPSBuZXcgRmluZFF1YWxpZmllcihmaW5kUXVhbGlmaWVyVmFsdWVzW2ldKTsKLSAgICAgICAgZmluZFF1YWxpZmllclZlY3Rvci5hZGRFbGVtZW50KGZpbmRRdWFsaWZpZXIpOwotICAgICAgfQotICAgICAgZmluZFF1YWxpZmllcnMuc2V0RmluZFF1YWxpZmllclZlY3RvcihmaW5kUXVhbGlmaWVyVmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0ZJTkRRVUFMSUZJRVJTLGZpbmRRdWFsaWZpZXJzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19GSU5EUVVBTElGSUVSUyk7Ci0KLSAgICBpZiAobWF4U2VhcmNoU2V0ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfU0VBUkNIX1NFVCxtYXhTZWFyY2hTZXQpOwotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVJbnRlZ2VyKG1heFNlYXJjaFNldCkpCi0gICAgewotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfU0VBUkNIX1NFVCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfTUFYX1NFQVJDSF9TRVQiKSk7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtYXhSZXN1bHRzICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfUkVTVUxUUyxtYXhSZXN1bHRzKTsKLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlSW50ZWdlcihtYXhSZXN1bHRzKSkKLSAgICB7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9SRVNVTFRTKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9NQVhfUkVTVUxUUyIpKTsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHByaXZhdGUgRGlzY292ZXJ5VVJMcyBkdXBEaXNjb3ZlcnlVUkxzKERpc2NvdmVyeVVSTHMgZGlzY292ZXJ5VVJMcywgU3RyaW5nIHVzZVR5cGUsIFN0cmluZyBkdXBVc2VUeXBlKSB7Ci0gICAgaWYgKGRpc2NvdmVyeVVSTHMgPT0gbnVsbCkKLSAgICAgIHJldHVybiBkaXNjb3ZlcnlVUkxzOwotICAgIFZlY3RvciBkaXNjb3ZlcnlVUkxWZWN0b3IgPSBkaXNjb3ZlcnlVUkxzLmdldERpc2NvdmVyeVVSTFZlY3RvcigpOwotICAgIGlmIChkaXNjb3ZlcnlVUkxWZWN0b3IgPT0gbnVsbCkKLSAgICAgIHJldHVybiBkaXNjb3ZlcnlVUkxzOwotICAgIFZlY3RvciBuZXdEaXNjb3ZlcnlVUkxWZWN0b3IgPSBuZXcgVmVjdG9yKGRpc2NvdmVyeVVSTFZlY3Rvcik7Ci0gICAgRW51bWVyYXRpb24gZSA9IGRpc2NvdmVyeVVSTFZlY3Rvci5lbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBEaXNjb3ZlcnlVUkwgZGlzY292ZXJ5VVJMID0gKERpc2NvdmVyeVVSTCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBpZiAoZGlzY292ZXJ5VVJMLmdldFVzZVR5cGUoKS5lcXVhbHModXNlVHlwZSkpIHsKLSAgICAgICAgbmV3RGlzY292ZXJ5VVJMVmVjdG9yLmFkZChuZXcgRGlzY292ZXJ5VVJMKGRpc2NvdmVyeVVSTC5nZXRUZXh0KCksIGR1cFVzZVR5cGUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgRGlzY292ZXJ5VVJMcyBuZXdEaXNjb3ZlcnlVUkxzID0gbmV3IERpc2NvdmVyeVVSTHMoKTsKLSAgICBuZXdEaXNjb3ZlcnlVUkxzLnNldERpc2NvdmVyeVVSTFZlY3RvcihuZXdEaXNjb3ZlcnlVUkxWZWN0b3IpOwotICAgIHJldHVybiBuZXdEaXNjb3ZlcnlVUkxzOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGJvb2xlYW4gc2hvdWxkQWRkUXVlcnlOb2RlID0gKHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFKSA9PSBudWxsKTsgICAgICAKLSAgICAgIEZpbmRRdWFsaWZpZXJzIGZpbmRRdWFsaWZpZXJzID0gKEZpbmRRdWFsaWZpZXJzKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0ZJTkRRVUFMSUZJRVJTKTsKLSAgICAgIFZlY3RvciBuYW1lVmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyk7Ci0gICAgICBEaXNjb3ZlcnlVUkxzIGRpc2NvdmVyeVVSTHMgPSAoRGlzY292ZXJ5VVJMcylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLSAgICAgIElkZW50aWZpZXJCYWcgaWRlbnRpZmllckJhZyA9IChJZGVudGlmaWVyQmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLSAgICAgIENhdGVnb3J5QmFnIGNhdGVnb3J5QmFnID0gKENhdGVnb3J5QmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMpOwotICAgICAgVE1vZGVsQmFnIHRNb2RlbEJhZyA9IChUTW9kZWxCYWcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfVE1PREVMQkFHKTsKLSAgICAgIGJvb2xlYW4gb3duZWQgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfT1dORUQpICE9IG51bGwpOwotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICAgIGludCBtYXhTZWFyY2hTZXQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1NFQVJDSF9TRVQpKTsKLSAgICAgIGludCBtYXhSZXN1bHRzID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9SRVNVTFRTKSk7Ci0KLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUuCi0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGlmIChvd25lZCAmJiAhcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICAgIHJlZ0VsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLQotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotCi0gICAgICBCdXNpbmVzc0luZm9zIGJ1c0luZm9zID0gbnVsbDsKLSAgICAgIGlmIChvd25lZCkKLSAgICAgICAgYnVzSW5mb3MgPSBwcm94eS5nZXRfcmVnaXN0ZXJlZEluZm8ocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpKS5nZXRCdXNpbmVzc0luZm9zKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGJ1c0luZm9zID0gcHJveHkuZmluZF9idXNpbmVzcyhuYW1lVmVjdG9yLCBkdXBEaXNjb3ZlcnlVUkxzKGRpc2NvdmVyeVVSTHMsIiIsVURESUFjdGlvbklucHV0cy5ESVNDT1ZFUllfVVJMX1RZUEUpLCBpZGVudGlmaWVyQmFnLCBjYXRlZ29yeUJhZywgdE1vZGVsQmFnLCBmaW5kUXVhbGlmaWVycywgbWF4U2VhcmNoU2V0KS5nZXRCdXNpbmVzc0luZm9zKCk7Ci0gICAgICAKLSAgICAgIGludCBmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllcyA9IE1hdGgubWluKG1heFJlc3VsdHMsIGJ1c0luZm9zLnNpemUoKSk7Ci0gICAgICBWZWN0b3IgYnVzaW5lc3NLZXlzID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllczsgaSsrKQotICAgICAgewotICAgICAgICBCdXNpbmVzc0luZm8gYnVzSW5mbyA9IChCdXNpbmVzc0luZm8pYnVzSW5mb3MuZ2V0KGkpOwotICAgICAgICBidXNpbmVzc0tleXMuYWRkRWxlbWVudChidXNJbmZvLmdldEJ1c2luZXNzS2V5KCkpOwotICAgICAgfQotCi0gICAgICBpZiAoZmluYWxOdW1iZXJPZkJ1c2luZXNzRW50aXRpZXMgPiAwKQotICAgICAgewotICAgICAgICBpZiAoc2hvdWxkQWRkUXVlcnlOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgVmVjdG9yIGJlVmVjdG9yID0gcHJveHkuZ2V0X2J1c2luZXNzRGV0YWlsKGJ1c2luZXNzS2V5cykuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLSAgICAgICAgICBCdXNpbmVzc0VudGl0eVtdIGJlTGlzdCA9IG5ldyBCdXNpbmVzc0VudGl0eVtiZVZlY3Rvci5zaXplKCldOwotICAgICAgICAgIGJlVmVjdG9yLnRvQXJyYXkoYmVMaXN0KTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnlOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FKTsKLSAgICAgICAgICBxdWVyeUVsZW1lbnRfID0gbmV3IFF1ZXJ5RWxlbWVudChiZUxpc3QscXVlcnlOYW1lLHJlZ0VsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgICAgYWRkUXVlcnlOb2RlKCk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0JVU0lORVNTRVNfRk9VTkQiLFN0cmluZy52YWx1ZU9mKGJlTGlzdC5sZW5ndGgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBGb3JtSW5wdXRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19CVVNJTkVTU0VTX0ZPVU5EIikpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZvcm1JbnB1dEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmMjg1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc2VzU2ltcGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQnVzaW5lc3NJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQnVzaW5lc3NJbmZvczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FLG5hbWUpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUaGlzIHNob3VsZG4ndCBvY2N1ci4KLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZEFkZFF1ZXJ5Tm9kZSA9IChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSkgPT0gbnVsbCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUpOwotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBuYW1lVmVjdG9yLmFkZEVsZW1lbnQobmV3IE5hbWUobmFtZSkpOwotCi0gICAgICAvLyBUaGUgYWN0aW9uIGNhbiBiZSBydW4gdW5kZXIgdGhlIGNvbnRleHQgb2YgZWl0aGVyIGEgcmVnaXN0cnkgb3IgYSBxdWVyeSBub2RlLgotICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKTsKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgCi0gICAgICBCdXNpbmVzc0luZm9zIGJ1c0luZm9zID0gcHJveHkuZmluZF9idXNpbmVzcyhuYW1lVmVjdG9yLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9TRUFSQ0hfU0VUKS5nZXRCdXNpbmVzc0luZm9zKCk7Ci0gICAgICBpbnQgZmluYWxOdW1iZXJPZkJ1c2luZXNzRW50aXRpZXMgPSBNYXRoLm1pbihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9SRVNVTFRTLCBidXNJbmZvcy5zaXplKCkpOwotICAgICAgVmVjdG9yIGJ1c2luZXNzS2V5cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxOdW1iZXJPZkJ1c2luZXNzRW50aXRpZXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQnVzaW5lc3NJbmZvIGJ1c0luZm8gPSBidXNJbmZvcy5nZXQoaSk7Ci0gICAgICAgIGJ1c2luZXNzS2V5cy5hZGRFbGVtZW50KGJ1c0luZm8uZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaW5hbE51bWJlck9mQnVzaW5lc3NFbnRpdGllcyA+IDApCi0gICAgICB7Ci0gICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBWZWN0b3IgYmVWZWN0b3IgPSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwoYnVzaW5lc3NLZXlzKS5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpOwotICAgICAgICAgIEJ1c2luZXNzRW50aXR5W10gYmVMaXN0ID0gbmV3IEJ1c2luZXNzRW50aXR5W2JlVmVjdG9yLnNpemUoKV07Ci0gICAgICAgICAgYmVWZWN0b3IudG9BcnJheShiZUxpc3QpOwotICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUpOwotICAgICAgICAgIHF1ZXJ5RWxlbWVudF8gPSBuZXcgUXVlcnlFbGVtZW50KGJlTGlzdCxxdWVyeU5hbWUscmVnRWxlbWVudC5nZXRNb2RlbCgpKTsKLSAgICAgICAgICBhZGRRdWVyeU5vZGUoKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORCIsU3RyaW5nLnZhbHVlT2YoYmVMaXN0Lmxlbmd0aCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IEZvcm1JbnB1dEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0JVU0lORVNTRVNfRk9VTkQiKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRm9ybUlucHV0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MzRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbiBleHRlbmRzIEZpbmRBY3Rpb24KLXsKLSAgcHVibGljIFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9VVUlEKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHV1aWRLZXkgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9LRVkpOwotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgaWYgKHV1aWRLZXkgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZLHV1aWRLZXkpOwotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh1dWlkS2V5KSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVVJRF9LRVkiKSk7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZEFkZFF1ZXJ5Tm9kZSA9IChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSkgPT0gbnVsbCk7ICAgICAgCi0gICAgICBTdHJpbmcgdXVpZEtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVkpOwotCi0gICAgICAvLyBUaGUgYWN0aW9uIGNhbiBiZSBydW4gdW5kZXIgdGhlIGNvbnRleHQgb2YgZWl0aGVyIGEgcmVnaXN0cnkgb3IgYSBxdWVyeSBub2RlIG9yIGV2ZW4gVURESU1haW5Ob2RlLgotICAgICAgaWYgKHJlZ05vZGVfID09IG51bGwpCi0gICAgICAgIHJlZ05vZGVfID0gZ2V0UmVnaXN0cnlOb2RlKChOb2RlKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlJFRlJFU0hfTk9ERSkpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBUTW9kZWxEZXRhaWwgdE1vZGVsRGV0YWlsID0gcHJveHkuZ2V0X3RNb2RlbERldGFpbCh1dWlkS2V5KTsKLSAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSB0TW9kZWxEZXRhaWwuZ2V0VE1vZGVsVmVjdG9yKCk7Ci0gICAgICBpZiAodE1vZGVsVmVjdG9yLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKXRNb2RlbFZlY3Rvci5lbGVtZW50QXQoMCk7Ci0gICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBUTW9kZWxbXSB0TW9kZWxBcnJheSA9IG5ldyBUTW9kZWxbMV07Ci0gICAgICAgICAgdE1vZGVsQXJyYXlbMF0gPSB0TW9kZWw7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICAgICAgcXVlcnlFbGVtZW50XyA9IG5ldyBRdWVyeUVsZW1lbnQodE1vZGVsQXJyYXkscXVlcnlOYW1lLHJlZ0VsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgICAgYWRkUXVlcnlOb2RlKCk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORCIsU3RyaW5nLnZhbHVlT2YodE1vZGVsQXJyYXkubGVuZ3RoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QsdE1vZGVsKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBGb3JtSW5wdXRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQiKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJUcmFuc3BvcnRFeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICBjYXRjaCAoRm9ybUlucHV0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmYWRkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy4qOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS4qOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuKjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1wdWJsaWMgY2xhc3MgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCkpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9TRUFSQ0hfU0VULFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1NFQVJDSF9TRVQpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9NQVhfUkVTVUxUUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9SRVNVTFRTKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgdXNlU2VydmljZUNoZWNrZWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfVVNFX1NFUlZJQ0UpOwotICAgIFN0cmluZ1tdIHNlcnZpY2VOb2RlSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFKTsKLSAgICBTdHJpbmcgb3duZWRDaGVja2VkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEKTsKLSAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICBTdHJpbmdbXSBpZFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfVFlQRSk7Ci0gICAgU3RyaW5nW10gaWRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBpZEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9WQUxVRSk7Ci0gICAgU3RyaW5nW10gY2F0VHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfVFlQRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGNhdEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfVkFMVUUpOwotICAgIFN0cmluZ1tdIGZpbmRRdWFsaWZpZXJWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRklORFFVQUxJRklFUik7Ci0gICAgU3RyaW5nIG1heFNlYXJjaFNldCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfU0VBUkNIX1NFVCk7Ci0gICAgU3RyaW5nIG1heFJlc3VsdHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1JFU1VMVFMpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICBpZiAodXNlU2VydmljZUNoZWNrZWQgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1VTRV9TRVJWSUNFLHVzZVNlcnZpY2VDaGVja2VkKTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1VTRV9TRVJWSUNFKTsKLSAgICAKLSAgICBpZiAoc2VydmljZU5vZGVJZHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBBbHRob3VnaCB3ZSBhbHJlYWR5IGhhdmUgdGhlICJzdWJtaXR0ZWQiIGRhdGEsIGRlbGV0aW9ucyBvY2N1ciBvbiB0aGUgY2xpZW50IHNpZGUgYW5kIHRodXMgdGhlIG5lZWQgdG8gdHJhY2sgdGhpcyB1c2luZyBoaWRkZW4gZm9ybSBlbGVtZW50cy4KLSAgICAgIFZlY3RvciBzaVNlcnZpY2UgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFKTsKLSAgICAgIGlmIChzaVNlcnZpY2UgPT0gbnVsbCkKLSAgICAgICAgc2lTZXJ2aWNlID0gbmV3IFZlY3RvcigpOwotICAgICAgZWxzZQotICAgICAgICBzaVNlcnZpY2UucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgIFZlY3RvciBzaVNlcnZpY2VDb3B5ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRV9DT1BZKTsKLSAgICAgIC8vIFRoZSBicm93c2VyIHdpbGwgZW5mb3JjZSB0aGUgcnVsZSBvZiBoYXZpbmcgb25seSBvbmUgc2VydmljZSBpbiB0aGlzIGxpc3QuCi0gICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzaVNlcnZpY2VDb3B5LmVsZW1lbnRBdCgwKTsKLSAgICAgIHNpU2VydmljZS5hZGRFbGVtZW50KGxpc3RFbGVtZW50KTsKLSAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFLHNpU2VydmljZSk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9CVVNJTkVTU19TRVJWSUNFLGJzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRSk7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0JVU0lORVNTX1NFUlZJQ0UpOwotICAgICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgdXNlU2VydmljZUNoZWNrZWQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1NFUlZJQ0UiKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChvd25lZENoZWNrZWQgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX09XTkVELG93bmVkQ2hlY2tlZCk7Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9PV05FRCk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSxuYW1lKTsKLQotICAgIGlmIChpZFR5cGVzICE9IG51bGwgJiYgaWRLZXlOYW1lcyAhPSBudWxsICYmIGlkS2V5VmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgSWRlbnRpZmllckJhZyBpZEJhZyA9IG5ldyBJZGVudGlmaWVyQmFnKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxpZEtleU5hbWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gbmV3IEtleWVkUmVmZXJlbmNlKGlkS2V5TmFtZXNbaV0saWRLZXlWYWx1ZXNbaV0saWRUeXBlc1tpXSk7Ci0gICAgICAgIGlkQmFnLmFkZChrcik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyxpZEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMpOwotCi0gICAgaWYgKGNhdFR5cGVzICE9IG51bGwgJiYgY2F0S2V5TmFtZXMgIT0gbnVsbCAmJiBjYXRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSBuZXcgQ2F0ZWdvcnlCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGNhdFR5cGVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gbmV3IEtleWVkUmVmZXJlbmNlKGNhdEtleU5hbWVzW2ldLGNhdEtleVZhbHVlc1tpXSxjYXRUeXBlc1tpXSk7Ci0gICAgICAgIGNhdEJhZy5hZGQoa3IpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyxjYXRCYWcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMpOwotCi0gICAgaWYgKGZpbmRRdWFsaWZpZXJWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBGaW5kUXVhbGlmaWVycyBmaW5kUXVhbGlmaWVycyA9IG5ldyBGaW5kUXVhbGlmaWVycygpOwotICAgICAgVmVjdG9yIGZpbmRRdWFsaWZpZXJWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxmaW5kUXVhbGlmaWVyVmFsdWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEZpbmRRdWFsaWZpZXIgZmluZFF1YWxpZmllciA9IG5ldyBGaW5kUXVhbGlmaWVyKGZpbmRRdWFsaWZpZXJWYWx1ZXNbaV0pOwotICAgICAgICBmaW5kUXVhbGlmaWVyVmVjdG9yLmFkZEVsZW1lbnQoZmluZFF1YWxpZmllcik7Ci0gICAgICB9Ci0gICAgICBmaW5kUXVhbGlmaWVycy5zZXRGaW5kUXVhbGlmaWVyVmVjdG9yKGZpbmRRdWFsaWZpZXJWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfRklORFFVQUxJRklFUlMsZmluZFF1YWxpZmllcnMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0ZJTkRRVUFMSUZJRVJTKTsKLQotICAgIGlmIChtYXhTZWFyY2hTZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfU0VBUkNIX1NFVCxtYXhTZWFyY2hTZXQpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1NFQVJDSF9TRVQsbWF4U2VhcmNoU2V0KTsKLSAgICB9Ci0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZUludGVnZXIobWF4U2VhcmNoU2V0KSkKLSAgICB7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9TRUFSQ0hfU0VUKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9NQVhfU0VBUkNIX1NFVCIpKTsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1heFJlc3VsdHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfUkVTVUxUUyxtYXhSZXN1bHRzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9SRVNVTFRTLG1heFJlc3VsdHMpOwotICAgIH0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlSW50ZWdlcihtYXhSZXN1bHRzKSkKLSAgICB7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9SRVNVTFRTKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9NQVhfUkVTVUxUUyIpKTsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gb3ZlcnJpZGVBdXRoZW50aWNhdGlvblZhbGlkYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9VU0VfU0VSVklDRSkgIT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOyAgICAgIAotICAgICAgYm9vbGVhbiB1c2VTZXJ2aWNlID0gKHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1VTRV9TRVJWSUNFKSAhPSBudWxsKTsKLSAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQlVTSU5FU1NfU0VSVklDRSk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICBGaW5kUXVhbGlmaWVycyBmaW5kUXVhbGlmaWVycyA9IChGaW5kUXVhbGlmaWVycylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9GSU5EUVVBTElGSUVSUyk7Ci0gICAgICBJZGVudGlmaWVyQmFnIGlkZW50aWZpZXJCYWcgPSAoSWRlbnRpZmllckJhZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0gICAgICBDYXRlZ29yeUJhZyBjYXRlZ29yeUJhZyA9IChDYXRlZ29yeUJhZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTKTsKLSAgICAgIGJvb2xlYW4gb3duZWQgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfT1dORUQpICE9IG51bGwpOwotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICAgIGludCBtYXhTZWFyY2hTZXQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1NFQVJDSF9TRVQpKTsKLSAgICAgIGludCBtYXhSZXN1bHRzID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9SRVNVTFRTKSk7Ci0KLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUuCi0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIFZlY3RvciB0TW9kZWxLZXlWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAKLSAgICAgIGlmIChvd25lZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgICByZWdFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLHVzZXJJZCxwYXNzd29yZCk7Ci0gICAgICAgIHRNb2RlbEtleVZlY3RvciA9IGZpbmRBbGxPd25lZFRNb2RlbHMocHJveHksIHJlZ0VsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgbWF4UmVzdWx0cyk7Ci0gICAgICB9Ci0gICAgICBpZiAodXNlU2VydmljZSkKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ1RlbXBsYXRlcyBiaW5kaW5nVGVtcGxhdGVzID0gYnMuZ2V0QmluZGluZ1RlbXBsYXRlcygpOwotICAgICAgICBib29sZWFuIGVuZFNlYXJjaCA9IGZhbHNlOwotICAgICAgICBpZiAoYmluZGluZ1RlbXBsYXRlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wO2k8YmluZGluZ1RlbXBsYXRlcy5zaXplKCk7aSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEJpbmRpbmdUZW1wbGF0ZSBidCA9IGJpbmRpbmdUZW1wbGF0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgVE1vZGVsSW5zdGFuY2VEZXRhaWxzIHRNb2RlbEluc3RhbmNlRGV0YWlscyA9IGJ0LmdldFRNb2RlbEluc3RhbmNlRGV0YWlscygpOwotICAgICAgICAgICAgZm9yIChpbnQgaj0wO2o8dE1vZGVsSW5zdGFuY2VEZXRhaWxzLnNpemUoKTtqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFRNb2RlbEluc3RhbmNlSW5mbyB0TW9kZWxJbnN0YW5jZUluZm8gPSB0TW9kZWxJbnN0YW5jZURldGFpbHMuZ2V0KGopOwotICAgICAgICAgICAgICBpZiAodE1vZGVsS2V5VmVjdG9yLnNpemUoKSA8IG1heFJlc3VsdHMpCi0gICAgICAgICAgICAgICAgdE1vZGVsS2V5VmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsSW5zdGFuY2VJbmZvLmdldFRNb2RlbEtleSgpKTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5kU2VhcmNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuZFNlYXJjaCkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAKLSAgICAgICAgVE1vZGVsTGlzdCB0TW9kZWxMaXN0ID0gcHJveHkuZmluZF90TW9kZWwobmFtZSxjYXRlZ29yeUJhZyxpZGVudGlmaWVyQmFnLGZpbmRRdWFsaWZpZXJzLG1heFNlYXJjaFNldCk7Ci0gICAgICAgIFRNb2RlbEluZm9zIHRNb2RlbEluZm9zID0gdE1vZGVsTGlzdC5nZXRUTW9kZWxJbmZvcygpOwotICAgICAgICBmb3IgKGludCBpPTA7aTx0TW9kZWxJbmZvcy5zaXplKCk7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgVE1vZGVsSW5mbyB0TW9kZWxJbmZvID0gdE1vZGVsSW5mb3MuZ2V0KGkpOwotICAgICAgICAgIGlmICh0TW9kZWxLZXlWZWN0b3Iuc2l6ZSgpIDwgbWF4UmVzdWx0cykKLSAgICAgICAgICAgIHRNb2RlbEtleVZlY3Rvci5hZGRFbGVtZW50KHRNb2RlbEluZm8uZ2V0VE1vZGVsS2V5KCkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGludCBmaW5hbE51bWJlck9mVE1vZGVsS2V5cyA9IHRNb2RlbEtleVZlY3Rvci5zaXplKCk7Ci0gICAgICBpZiAoZmluYWxOdW1iZXJPZlRNb2RlbEtleXMgPiAwKQotICAgICAgewotICAgICAgICBpZiAoc2hvdWxkQWRkUXVlcnlOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgVmVjdG9yIGZpbmFsVE1vZGVsVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIGludCBjdXJyZW50SW5kZXggPSAwOwotICAgICAgICAgIGludCB3aW5kb3dTaXplID0gZmluYWxOdW1iZXJPZlRNb2RlbEtleXM7Ci0gICAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IHRNb2RlbEtleVZlY3Rvci5zaXplKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IHN1Ykxpc3RUb0luZGV4ID0gTWF0aC5taW4oY3VycmVudEluZGV4K3dpbmRvd1NpemUsdE1vZGVsS2V5VmVjdG9yLnNpemUoKSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgVE1vZGVsRGV0YWlsIHRNb2RlbERldGFpbCA9IHByb3h5LmdldF90TW9kZWxEZXRhaWwobmV3IFZlY3Rvcih0TW9kZWxLZXlWZWN0b3Iuc3ViTGlzdChjdXJyZW50SW5kZXgsc3ViTGlzdFRvSW5kZXgpKSk7Ci0gICAgICAgICAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSB0TW9kZWxEZXRhaWwuZ2V0VE1vZGVsVmVjdG9yKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPHRNb2RlbFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgICAgICAgICAgIGZpbmFsVE1vZGVsVmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsVmVjdG9yLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgICAgICAgIGlmICh0TW9kZWxEZXRhaWwuZ2V0VHJ1bmNhdGVkQm9vbGVhbigpKQotICAgICAgICAgICAgICAgIHdpbmRvd1NpemUgPSB0TW9kZWxWZWN0b3Iuc2l6ZSgpOwotICAgICAgICAgICAgICBjdXJyZW50SW5kZXggKz0gd2luZG93U2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IGRyID0gZS5nZXREaXNwb3NpdGlvblJlcG9ydCgpOwotICAgICAgICAgICAgICBpZiAoKChSZXN1bHQpIGRyLmdldFJlc3VsdFZlY3RvcigpLmdldCgwKSkuZ2V0RXJySW5mbygpLmdldEVyckNvZGUoKSA9PSBEaXNwb3NpdGlvblJlcG9ydC5FX2ludmFsaWRLZXlQYXNzZWQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJySW5mb1RleHQgPSAoKFJlc3VsdCkgZHIuZ2V0UmVzdWx0VmVjdG9yKCkuZ2V0KDApKS5nZXRFcnJJbmZvKCkuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGk9Y3VycmVudEluZGV4O2k8c3ViTGlzdFRvSW5kZXg7aSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIFN0cmluZyB0TW9kZWxLZXkgPSAoU3RyaW5nKXRNb2RlbEtleVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICBpZiAoZXJySW5mb1RleHQuaW5kZXhPZih0TW9kZWxLZXkpICE9IC0xIHx8IGVyckluZm9UZXh0LmluZGV4T2YodE1vZGVsS2V5LnRvVXBwZXJDYXNlKCkpICE9IC0xIHx8IGVyckluZm9UZXh0LmluZGV4T2YodE1vZGVsS2V5LnRvTG93ZXJDYXNlKCkpICE9IC0xKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0TW9kZWxLZXlWZWN0b3IucmVtb3ZlRWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGludCBmaW5hbE51bWJlck9mVE1vZGVscyA9IGZpbmFsVE1vZGVsVmVjdG9yLnNpemUoKTsKLSAgICAgICAgICBpZiAoZmluYWxOdW1iZXJPZlRNb2RlbHMgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRNb2RlbFtdIHRNb2RlbEFycmF5ID0gbmV3IFRNb2RlbFtmaW5hbE51bWJlck9mVE1vZGVsc107Ci0gICAgICAgICAgICBmaW5hbFRNb2RlbFZlY3Rvci50b0FycmF5KHRNb2RlbEFycmF5KTsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUpOwotICAgICAgICAgICAgcXVlcnlFbGVtZW50XyA9IG5ldyBRdWVyeUVsZW1lbnQodE1vZGVsQXJyYXkscXVlcnlOYW1lLHJlZ0VsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgICAgICBhZGRRdWVyeU5vZGUoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQiLFN0cmluZy52YWx1ZU9mKHRNb2RlbEFycmF5Lmxlbmd0aCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1JbnB1dEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORCIpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IEZvcm1JbnB1dEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORCIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChGb3JtSW5wdXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLy8gQ29waWVkIGRpcmVjdGx5IGZyb20gVURESVdTRExQcm94eSdzIGZpbmRBbGxTZXJ2aWNlSW50ZXJmYWNlcygpIG1ldGhvZCB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMuIFRoZSBoYXJkY29kZWQgc3RyaW5ncyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0gIHByaXZhdGUgZmluYWwgVmVjdG9yIGZpbmRBbGxPd25lZFRNb2RlbHMoVURESVByb3h5IHByb3h5LCBTdHJpbmcgYXV0aEluZm9TdHJpbmcsIGludCBtYXhSZXN1bHRzKSB0aHJvd3MgVURESUV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uCi0gIHsKLSAgICBSZWdpc3RlcmVkSW5mbyByZWdpc3RlcmVkSW5mbyA9IG51bGw7Ci0KLSAgICAvLyBHZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygb3duZWQgKHJlZ2lzdGVyZWQpIGluZm8uCi0gICAgLy8gKEEgUmVnaXN0ZXJlZEluZm8gY29uc2lzdHMgb2YgQnVzaW5lc3NJbmZvcyBhbmQgVE1vZGVsSW5mb3MuCi0gICAgLy8gQnVzaW5lc3NJbmZvcyBhbHNvIGNvbnRhaW4gU2VydmljZUluZm9zLikKLSAgICByZWdpc3RlcmVkSW5mbyA9IHByb3h5LmdldF9yZWdpc3RlcmVkSW5mbyhhdXRoSW5mb1N0cmluZyk7Ci0KLSAgICAvL0NyZWF0ZSBhIFZlY3RvciB0byBhZGQgdGhlIFRNb2RlbEtleXMgZnJvbSB0aGUgcmVnaXN0ZXJlZEluZm8uCi0gICAgVmVjdG9yIHRNb2RlbEtleUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvL0dldCB0aGUgVE1vZGVsSW5mb3MgZnJvbSB0aGUgcmVnaXN0ZXJlZEluZm8uCi0gICAgVE1vZGVsSW5mb3MgdE1vZGVsSW5mb3MgPSByZWdpc3RlcmVkSW5mby5nZXRUTW9kZWxJbmZvcygpOwotCi0gICAgLy9HZXQgYWxsIHRoZSBUTW9kZWxLZXlzIGZyb20gd2l0aGluIHRoZSBUTW9kZWxJbmZvcwotICAgIGJvb2xlYW4gZW5kU2VhcmNoID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0TW9kZWxJbmZvcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBUTW9kZWxJbmZvIHRNb2RlbEluZm8gPSB0TW9kZWxJbmZvcy5nZXQoaSk7Ci0gICAgICBpZiAodE1vZGVsS2V5TGlzdC5zaXplKCkgPCBtYXhSZXN1bHRzKQotICAgICAgICB0TW9kZWxLZXlMaXN0LmFkZEVsZW1lbnQodE1vZGVsSW5mby5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGJyZWFrOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHRNb2RlbEtleUxpc3Q7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzNjMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uIGV4dGVuZHMgRmluZEFjdGlvbgotewotICBwdWJsaWMgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSxuYW1lKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIuCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOyAgICAgIAotICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUuCi0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIFRNb2RlbExpc3QgdE1vZGVsTGlzdCA9IHByb3h5LmZpbmRfdE1vZGVsKG5hbWUsbnVsbCxudWxsLG51bGwsVURESUFjdGlvbklucHV0cy5RVUVSWV9NQVhfU0VBUkNIX1NFVCk7Ci0gICAgICBUTW9kZWxJbmZvcyB0TW9kZWxJbmZvcyA9IHRNb2RlbExpc3QuZ2V0VE1vZGVsSW5mb3MoKTsKLSAgICAgIFZlY3RvciB0TW9kZWxLZXlWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAKLSAgICAgIGZvciAoaW50IGk9MDtpPHRNb2RlbEluZm9zLnNpemUoKTtpKyspCi0gICAgICB7Ci0gICAgICAgIFRNb2RlbEluZm8gdE1vZGVsSW5mbyA9IHRNb2RlbEluZm9zLmdldChpKTsKLSAgICAgICAgaWYgKHRNb2RlbEtleVZlY3Rvci5zaXplKCkgPCBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9SRVNVTFRTKQotICAgICAgICAgIHRNb2RlbEtleVZlY3Rvci5hZGRFbGVtZW50KHRNb2RlbEluZm8uZ2V0VE1vZGVsS2V5KCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICh0TW9kZWxLZXlWZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNob3VsZEFkZFF1ZXJ5Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgIFRNb2RlbERldGFpbCB0TW9kZWxEZXRhaWwgPSBwcm94eS5nZXRfdE1vZGVsRGV0YWlsKHRNb2RlbEtleVZlY3Rvcik7Ci0gICAgICAgICAgVmVjdG9yIHRNb2RlbFZlY3RvciA9IHRNb2RlbERldGFpbC5nZXRUTW9kZWxWZWN0b3IoKTsKLSAgICAgICAgICBUTW9kZWxbXSB0TW9kZWxBcnJheSA9IG5ldyBUTW9kZWxbdE1vZGVsVmVjdG9yLnNpemUoKV07Ci0gICAgICAgICAgdE1vZGVsVmVjdG9yLnRvQXJyYXkodE1vZGVsQXJyYXkpOwotICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUpOwotICAgICAgICAgIHF1ZXJ5RWxlbWVudF8gPSBuZXcgUXVlcnlFbGVtZW50KHRNb2RlbEFycmF5LHF1ZXJ5TmFtZSxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgICAgICAgIGFkZFF1ZXJ5Tm9kZSgpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQiLFN0cmluZy52YWx1ZU9mKHRNb2RlbEFycmF5Lmxlbmd0aCkpKTsgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgRm9ybUlucHV0RXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EIikpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZvcm1JbnB1dEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZVVVSURBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3ZTg2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uIGV4dGVuZHMgRmluZEFjdGlvbgotewotICBwdWJsaWMgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMsU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9VVUlEKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHV1aWRLZXkgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9LRVkpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0KLSAgICBpZiAodXVpZEtleSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSx1dWlkS2V5KTsKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcodXVpZEtleSkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVVJRF9LRVkiKSk7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZEFkZFF1ZXJ5Tm9kZSA9IChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSkgPT0gbnVsbCk7Ci0gICAgICBTdHJpbmcgdXVpZEtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSk7Ci0KLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUgb3IgZXZlbiBVRERJTWFpbk5vZGUuCi0gICAgICBpZiAocmVnTm9kZV8gPT0gbnVsbCkKLSAgICAgICAgcmVnTm9kZV8gPSBnZXRSZWdpc3RyeU5vZGUoKE5vZGUpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUkVGUkVTSF9OT0RFKSk7Ci0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIEJ1c2luZXNzU2VydmljZVtdIGJzQXJyYXkgPSBuZXcgQnVzaW5lc3NTZXJ2aWNlWzFdOwotICAgICAgU2VydmljZURldGFpbCBzZXJ2aWNlRGV0YWlsID0gcHJveHkuZ2V0X3NlcnZpY2VEZXRhaWwodXVpZEtleSk7Ci0gICAgICBWZWN0b3IgYnNWZWN0b3IgPSBzZXJ2aWNlRGV0YWlsLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpOwotICAgICAgaWYgKGJzVmVjdG9yLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGJzVmVjdG9yLnRvQXJyYXkoYnNBcnJheSk7Ci0gICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcXVlcnlOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FKTsKLSAgICAgICAgICBxdWVyeUVsZW1lbnRfID0gbmV3IFF1ZXJ5RWxlbWVudChic0FycmF5LHF1ZXJ5TmFtZSxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgICAgICAgIGFkZFF1ZXJ5Tm9kZSgpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFU19GT1VORCIsU3RyaW5nLnZhbHVlT2YoYnNBcnJheS5sZW5ndGgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxic0FycmF5WzBdKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBGb3JtSW5wdXRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19TRVJWSUNFU19GT1VORCIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChGb3JtSW5wdXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQwNjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuKjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuKjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1wdWJsaWMgY2xhc3MgUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24gZXh0ZW5kcyBGaW5kQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9TRUFSQ0hfU0VULFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1NFQVJDSF9TRVQpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9SRVNVTFRTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1JFU1VMVFMpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBvd25lZENoZWNrZWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfT1dORUQpOwotICAgIFN0cmluZ1tdIGJ1c05vZGVJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuTk9ERUlEX0JVU0lORVNTKTsKLSAgICBTdHJpbmdbXSBsYW5ndWFnZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSk7Ci0gICAgU3RyaW5nW10gbmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSk7Ci0gICAgU3RyaW5nW10gY2F0VHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfVFlQRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGNhdEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfVkFMVUUpOwotICAgIFN0cmluZ1tdIHNpTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5OT0RFSURfU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgIFN0cmluZ1tdIGZpbmRRdWFsaWZpZXJWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRklORFFVQUxJRklFUik7Ci0gICAgU3RyaW5nIG1heFNlYXJjaFNldCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfU0VBUkNIX1NFVCk7Ci0gICAgU3RyaW5nIG1heFJlc3VsdHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1JFU1VMVFMpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICBpZiAob3duZWRDaGVja2VkICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX09XTkVELG93bmVkQ2hlY2tlZCk7Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX09XTkVEKTsKLQotICAgIGlmIChidXNOb2RlSWRzICE9IG51bGwpCi0gICAgewotICAgICAgLy8gQWx0aG91Z2ggd2UgYWxyZWFkeSBoYXZlIHRoZSAic3VibWl0dGVkIiBkYXRhLCBkZWxldGlvbnMgb2NjdXIgb24gdGhlIGNsaWVudCBzaWRlIGFuZCB0aHVzIHRoZSBuZWVkIHRvIHRyYWNrIHRoaXMgdXNpbmcgaGlkZGVuIGZvcm0gZWxlbWVudHMuCi0gICAgICBWZWN0b3Igc2VydmljZUJ1c2luZXNzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICAgICBpZiAoc2VydmljZUJ1c2luZXNzID09IG51bGwpCi0gICAgICAgIHNlcnZpY2VCdXNpbmVzcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2VydmljZUJ1c2luZXNzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICBWZWN0b3Igc2VydmljZUJ1c2luZXNzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSk7Ci0gICAgICAvLyBUaGUgYnJvd3NlciB3aWxsIGVuZm9yY2UgdGhlIHJ1bGUgb2YgaGF2aW5nIG9ubHkgb25lIGJ1c2luZXNzIGluIHRoaXMgbGlzdC4KLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VCdXNpbmVzc0NvcHkuZWxlbWVudEF0KDApOwotICAgICAgc2VydmljZUJ1c2luZXNzLmFkZEVsZW1lbnQobGlzdEVsZW1lbnQpOwotICAgICAgQnVzaW5lc3NFbnRpdHkgc3AgPSAoQnVzaW5lc3NFbnRpdHkpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTLHNlcnZpY2VCdXNpbmVzcyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIsc3ApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTKTsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSKTsKLSAgICB9Ci0KLSAgICBpZiAobGFuZ3VhZ2VzICE9IG51bGwgJiYgbmFtZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgbmFtZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPG5hbWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIE5hbWUgdWRkaTRqTmFtZTsKLSAgICAgICAgaWYgKGxhbmd1YWdlc1tpXS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldLGxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB1ZGRpNGpOYW1lID0gbmV3IE5hbWUobmFtZXNbaV0pOwotICAgICAgICBuYW1lVmVjdG9yLmFkZEVsZW1lbnQodWRkaTRqTmFtZSk7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLG5hbWVWZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotCi0gICAgaWYgKGNhdFR5cGVzICE9IG51bGwgJiYgY2F0S2V5TmFtZXMgIT0gbnVsbCAmJiBjYXRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSBuZXcgQ2F0ZWdvcnlCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGNhdFR5cGVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gbmV3IEtleWVkUmVmZXJlbmNlKGNhdEtleU5hbWVzW2ldLGNhdEtleVZhbHVlc1tpXSxjYXRUeXBlc1tpXSk7Ci0gICAgICAgIGNhdEJhZy5hZGQoa3IpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTLGNhdEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLQotICAgIGlmIChzaU5vZGVJZHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBBbHRob3VnaCB3ZSBhbHJlYWR5IGhhdmUgdGhlICJzdWJtaXR0ZWQiIGRhdGEsIGRlbGV0aW9ucyBvY2N1ciBvbiB0aGUgY2xpZW50IHNpZGUgYW5kIHRodXMgdGhlIG5lZWQgdG8gdHJhY2sgdGhpcyB1c2luZyBoaWRkZW4gZm9ybSBlbGVtZW50cy4KLSAgICAgIFZlY3RvciBzZXJ2aWNlU2VydmljZUludGVyZmFjZXMgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICAgICBpZiAoc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzID09IG51bGwpCi0gICAgICAgIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICBWZWN0b3Igc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFkpOwotICAgICAgVmVjdG9yIHRNb2RlbEtleVN0cmluZ1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIEhhc2h0YWJsZSByZXN1bHRIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgZm9yIChpbnQgaT0wO2k8c2lOb2RlSWRzLmxlbmd0aDtpKyspCi0gICAgICAgIHJlc3VsdEhhc2gucHV0KHNpTm9kZUlkc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZVNlcnZpY2VJbnRlcmZhY2VzQ29weS5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzZXJ2aWNlU2VydmljZUludGVyZmFjZXNDb3B5LmVsZW1lbnRBdChpKTsKLSAgICAgICAgaWYgKHJlc3VsdEhhc2guZ2V0KFN0cmluZy52YWx1ZU9mKGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpKSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcy5hZGRFbGVtZW50KGxpc3RFbGVtZW50KTsKLSAgICAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICB0TW9kZWxLZXlTdHJpbmdWZWN0b3IuYWRkRWxlbWVudCh0TW9kZWwuZ2V0VE1vZGVsS2V5KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBUTW9kZWxCYWcgdE1vZGVsQmFnID0gbmV3IFRNb2RlbEJhZyh0TW9kZWxLZXlTdHJpbmdWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMsc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfVE1PREVMQkFHLHRNb2RlbEJhZyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9UTU9ERUxCQUcpOwotICAgIH0KLQotICAgIGlmIChmaW5kUXVhbGlmaWVyVmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgRmluZFF1YWxpZmllcnMgZmluZFF1YWxpZmllcnMgPSBuZXcgRmluZFF1YWxpZmllcnMoKTsKLSAgICAgIFZlY3RvciBmaW5kUXVhbGlmaWVyVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8ZmluZFF1YWxpZmllclZhbHVlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBGaW5kUXVhbGlmaWVyIGZpbmRRdWFsaWZpZXIgPSBuZXcgRmluZFF1YWxpZmllcihmaW5kUXVhbGlmaWVyVmFsdWVzW2ldKTsKLSAgICAgICAgZmluZFF1YWxpZmllclZlY3Rvci5hZGRFbGVtZW50KGZpbmRRdWFsaWZpZXIpOwotICAgICAgfQotICAgICAgZmluZFF1YWxpZmllcnMuc2V0RmluZFF1YWxpZmllclZlY3RvcihmaW5kUXVhbGlmaWVyVmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfRklORFFVQUxJRklFUlMsZmluZFF1YWxpZmllcnMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfRklORFFVQUxJRklFUlMpOwotCi0gICAgaWYgKG1heFNlYXJjaFNldCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9TRUFSQ0hfU0VULG1heFNlYXJjaFNldCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9TRUFSQ0hfU0VULG1heFNlYXJjaFNldCk7Ci0gICAgfQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVJbnRlZ2VyKG1heFNlYXJjaFNldCkpCi0gICAgewotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9TRUFSQ0hfU0VUKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9NQVhfU0VBUkNIX1NFVCIpKTsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1heFJlc3VsdHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfUkVTVUxUUyxtYXhSZXN1bHRzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTUFYX1JFU1VMVFMsbWF4UmVzdWx0cyk7Ci0gICAgfQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVJbnRlZ2VyKG1heFJlc3VsdHMpKQotICAgIHsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfUkVTVUxUUyk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfTUFYX1JFU1VMVFMiKSk7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYm9vbGVhbiBzaG91bGRBZGRRdWVyeU5vZGUgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUpID09IG51bGwpOyAgICAgIAotICAgICAgRmluZFF1YWxpZmllcnMgZmluZFF1YWxpZmllcnMgPSAoRmluZFF1YWxpZmllcnMpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9GSU5EUVVBTElGSUVSUyk7Ci0gICAgICBCdXNpbmVzc0VudGl0eSBzcCA9IChCdXNpbmVzc0VudGl0eSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIpOwotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgICAgQ2F0ZWdvcnlCYWcgY2F0ZWdvcnlCYWcgPSAoQ2F0ZWdvcnlCYWcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLSAgICAgIFRNb2RlbEJhZyB0TW9kZWxCYWcgPSAoVE1vZGVsQmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfVE1PREVMQkFHKTsKLSAgICAgIGJvb2xlYW4gb3duZWQgPSAocHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9PV05FRCkgIT0gbnVsbCk7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgaW50IG1heFNlYXJjaFNldCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9TRUFSQ0hfU0VUKSk7Ci0gICAgICBpbnQgbWF4UmVzdWx0cyA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9SRVNVTFRTKSk7Ci0KLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUuCi0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGlmIChvd25lZCAmJiAhcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICAgIHJlZ0VsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLSAgICAgICAgCi0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBTdHJpbmcgYnVzaW5lc3NLZXk7Ci0gICAgICBpZiAoc3AgIT0gbnVsbCkKLSAgICAgICAgYnVzaW5lc3NLZXkgPSBzcC5nZXRCdXNpbmVzc0tleSgpOwotICAgICAgZWxzZQotICAgICAgICBidXNpbmVzc0tleSA9ICIiOwotCi0gICAgICBpbnQgZmluYWxOdW1iZXJPZlNlcnZpY2VLZXlzOwotICAgICAgVmVjdG9yIHNlcnZpY2VLZXlWZWN0b3I7Ci0gICAgICBpZiAob3duZWQpCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2VLZXlWZWN0b3IgPSBmaW5kQWxsT3duZWRTZXJ2aWNlcyhwcm94eSxyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksYnVzaW5lc3NLZXksbWF4UmVzdWx0cyk7Ci0gICAgICAgIGZpbmFsTnVtYmVyT2ZTZXJ2aWNlS2V5cyA9IHNlcnZpY2VLZXlWZWN0b3Iuc2l6ZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTZXJ2aWNlTGlzdCBzZXJ2aWNlTGlzdCA9IHByb3h5LmZpbmRfc2VydmljZShidXNpbmVzc0tleSxuYW1lVmVjdG9yLGNhdGVnb3J5QmFnLHRNb2RlbEJhZyxmaW5kUXVhbGlmaWVycyxtYXhTZWFyY2hTZXQpOwotICAgICAgICBTZXJ2aWNlSW5mb3Mgc0luZm9zID0gc2VydmljZUxpc3QuZ2V0U2VydmljZUluZm9zKCk7Ci0gICAgICAgIGZpbmFsTnVtYmVyT2ZTZXJ2aWNlS2V5cyA9IE1hdGgubWluKG1heFJlc3VsdHMsc0luZm9zLnNpemUoKSk7Ci0gICAgICAgIHNlcnZpY2VLZXlWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGZpbmFsTnVtYmVyT2ZTZXJ2aWNlS2V5cztpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlSW5mbyBzSW5mbyA9IHNJbmZvcy5nZXQoaSk7Ci0gICAgICAgICAgc2VydmljZUtleVZlY3Rvci5hZGRFbGVtZW50KHNJbmZvLmdldFNlcnZpY2VLZXkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGZpbmFsTnVtYmVyT2ZTZXJ2aWNlS2V5cyA+IDApCi0gICAgICB7ICAgICAgCi0gICAgICAgIGlmIChzaG91bGRBZGRRdWVyeU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICBWZWN0b3IgZmluYWxCdXNTZXJ2aWNlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIGludCBjdXJyZW50SW5kZXggPSAwOwotICAgICAgICAgIGludCB3aW5kb3dTaXplID0gZmluYWxOdW1iZXJPZlNlcnZpY2VLZXlzOwotICAgICAgICAgIHdoaWxlIChjdXJyZW50SW5kZXggPCBzZXJ2aWNlS2V5VmVjdG9yLnNpemUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc3ViTGlzdFRvSW5kZXggPSBNYXRoLm1pbihjdXJyZW50SW5kZXgrd2luZG93U2l6ZSxzZXJ2aWNlS2V5VmVjdG9yLnNpemUoKSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU2VydmljZURldGFpbCBzZXJ2aWNlRGV0YWlsID0gcHJveHkuZ2V0X3NlcnZpY2VEZXRhaWwobmV3IFZlY3RvcihzZXJ2aWNlS2V5VmVjdG9yLnN1Ykxpc3QoY3VycmVudEluZGV4LHN1Ykxpc3RUb0luZGV4KSkpOwotICAgICAgICAgICAgICBWZWN0b3IgYnVzU2VydmljZVZlY3RvciA9IHNlcnZpY2VEZXRhaWwuZ2V0QnVzaW5lc3NTZXJ2aWNlVmVjdG9yKCk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPGJ1c1NlcnZpY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICAgICAgICAgICBmaW5hbEJ1c1NlcnZpY2VWZWN0b3IuYWRkRWxlbWVudChidXNTZXJ2aWNlVmVjdG9yLmVsZW1lbnRBdChpKSk7Ci0gICAgICAgICAgICAgIGlmIChzZXJ2aWNlRGV0YWlsLmdldFRydW5jYXRlZEJvb2xlYW4oKSkKLSAgICAgICAgICAgICAgICB3aW5kb3dTaXplID0gYnVzU2VydmljZVZlY3Rvci5zaXplKCk7Ci0gICAgICAgICAgICAgIGN1cnJlbnRJbmRleCArPSB3aW5kb3dTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRGlzcG9zaXRpb25SZXBvcnQgZHIgPSBlLmdldERpc3Bvc2l0aW9uUmVwb3J0KCk7Ci0gICAgICAgICAgICAgIGlmICgoKFJlc3VsdCkgZHIuZ2V0UmVzdWx0VmVjdG9yKCkuZ2V0KDApKS5nZXRFcnJJbmZvKCkuZ2V0RXJyQ29kZSgpID09IERpc3Bvc2l0aW9uUmVwb3J0LkVfaW52YWxpZEtleVBhc3NlZCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBlcnJJbmZvVGV4dCA9ICgoUmVzdWx0KSBkci5nZXRSZXN1bHRWZWN0b3IoKS5nZXQoMCkpLmdldEVyckluZm8oKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT1jdXJyZW50SW5kZXg7aTxzdWJMaXN0VG9JbmRleDtpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZpY2VLZXkgPSAoU3RyaW5nKXNlcnZpY2VLZXlWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgaWYgKGVyckluZm9UZXh0LmluZGV4T2Yoc2VydmljZUtleSkgIT0gLTEgfHwgZXJySW5mb1RleHQuaW5kZXhPZihzZXJ2aWNlS2V5LnRvVXBwZXJDYXNlKCkpICE9IC0xIHx8IGVyckluZm9UZXh0LmluZGV4T2Yoc2VydmljZUtleS50b0xvd2VyQ2FzZSgpKSAhPSAtMSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZUtleVZlY3Rvci5yZW1vdmVFbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaW50IGZpbmFsTnVtYmVyT2ZCdXNpbmVzc1NlcnZpY2VzID0gZmluYWxCdXNTZXJ2aWNlVmVjdG9yLnNpemUoKTsKLSAgICAgICAgICBpZiAoZmluYWxOdW1iZXJPZkJ1c2luZXNzU2VydmljZXMgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEJ1c2luZXNzU2VydmljZVtdIGJzQXJyYXkgPSBuZXcgQnVzaW5lc3NTZXJ2aWNlW2ZpbmFsTnVtYmVyT2ZCdXNpbmVzc1NlcnZpY2VzXTsKLSAgICAgICAgICAgIGZpbmFsQnVzU2VydmljZVZlY3Rvci50b0FycmF5KGJzQXJyYXkpOwotICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5TmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSk7Ci0gICAgICAgICAgICBxdWVyeUVsZW1lbnRfID0gbmV3IFF1ZXJ5RWxlbWVudChic0FycmF5LHF1ZXJ5TmFtZSxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgICAgICAgICAgYWRkUXVlcnlOb2RlKCk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRVNfRk9VTkQiLFN0cmluZy52YWx1ZU9mKGJzQXJyYXkubGVuZ3RoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgRm9ybUlucHV0RXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fU0VSVklDRVNfRk9VTkQiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBGb3JtSW5wdXRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19TRVJWSUNFU19GT1VORCIpKTsKLSAgICB9ICAgCi0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgfSAKLSAgICBjYXRjaCAoRm9ybUlucHV0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIC8vIENvcGllZCBkaXJlY3RseSBmcm9tIFVERElXU0RMUHJveHkncyBmaW5kQWxsT3duZWRTZXJ2aWNlcygpIG1ldGhvZCB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMuIFRoZSBoYXJkY29kZWQgc3RyaW5ncyBzaG91bGQgTk9UIGJlIHRyYW5zbGF0ZWQuCi0gIHByaXZhdGUgZmluYWwgVmVjdG9yIGZpbmRBbGxPd25lZFNlcnZpY2VzKFVERElQcm94eSBwcm94eSxTdHJpbmcgYXV0aEluZm9TdHJpbmcsU3RyaW5nIGJ1c2luZXNzS2V5LGludCBtYXhSZXN1bHRzKSB0aHJvd3MgVURESUV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uCi0gIHsKLSAgICBSZWdpc3RlcmVkSW5mbyByZWdpc3RlcmVkSW5mbyA9IG51bGw7Ci0KLSAgICAvLyBHZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygb3duZWQgKHJlZ2lzdGVyZWQpIGluZm8uCi0gICAgLy8gKEEgUmVnaXN0ZXJlZEluZm8gY29uc2lzdHMgb2YgQnVzaW5lc3NJbmZvcyBhbmQgVE1vZGVsSW5mb3MuCi0gICAgLy8gQnVzaW5lc3NJbmZvcyBhbHNvIGNvbnRhaW4gU2VydmljZUluZm9zLikKLSAgICByZWdpc3RlcmVkSW5mbyA9IHByb3h5LmdldF9yZWdpc3RlcmVkSW5mbyhhdXRoSW5mb1N0cmluZyk7Ci0KLSAgICAvL0NyZWF0ZSBhIHZlY3RvciB0byBhZGQgdGhlIHNlcnZpY2VLZXlzIGZyb20gdGhlIHJlZ2lzdGVyZWRJbmZvIHRvLgotICAgIFZlY3RvciBzZXJ2aWNlS2V5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vR2V0IHRoZSBidXNpbmVzc0luZm9zIGZyb20gdGhlIHJlZ2lzdGVyZWRJbmZvLgotICAgIEJ1c2luZXNzSW5mb3MgYnVzaW5lc3NJbmZvcyA9IHJlZ2lzdGVyZWRJbmZvLmdldEJ1c2luZXNzSW5mb3MoKTsKLQotICAgIC8vR2V0IGFsbCB0aGUgc2VydmljZUtleXMgZnJvbSB0aGUgc2VydmljZUluZm9zIHdpdGhpbiB0aGUgYnVzaW5lc3NJbmZvcywKLSAgICAvL2FuZCBhZGQgdGhlbSB0byB0aGUgc2VydmljZUtleUxpc3QuCi0gICAgYm9vbGVhbiBlbmRTZWFyY2ggPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1c2luZXNzSW5mb3Muc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgQnVzaW5lc3NJbmZvIGJ1c2luZXNzSW5mbyA9IGJ1c2luZXNzSW5mb3MuZ2V0KGkpOwotICAgICAgU3RyaW5nIGN1cnJlbnRCdXNpbmVzc0tleSA9IGJ1c2luZXNzSW5mby5nZXRCdXNpbmVzc0tleSgpOwotICAgICAgaWYgKGJ1c2luZXNzS2V5Lmxlbmd0aCgpID4gMCAmJiBjdXJyZW50QnVzaW5lc3NLZXkuZXF1YWxzKGJ1c2luZXNzS2V5KSkKLSAgICAgICAgZW5kU2VhcmNoID0gdHJ1ZTsKLSAgICAgIFNlcnZpY2VJbmZvcyBzZXJ2aWNlSW5mb3MgPSBidXNpbmVzc0luZm8uZ2V0U2VydmljZUluZm9zKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNlcnZpY2VJbmZvcy5zaXplKCk7IGorKykKLSAgICAgIHsKLSAgICAgICAgU2VydmljZUluZm8gc2VydmljZUluZm8gPSBzZXJ2aWNlSW5mb3MuZ2V0KGopOwotICAgICAgICBpZiAoc2VydmljZUluZm8uZ2V0QnVzaW5lc3NLZXkoKS5lcXVhbHMoY3VycmVudEJ1c2luZXNzS2V5KSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChzZXJ2aWNlS2V5TGlzdC5zaXplKCkgPCBtYXhSZXN1bHRzKQotICAgICAgICAgICAgc2VydmljZUtleUxpc3QuYWRkKHNlcnZpY2VJbmZvLmdldFNlcnZpY2VLZXkoKSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuZFNlYXJjaCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChlbmRTZWFyY2gpCi0gICAgICAgIGJyZWFrOwotICAgIH0gICAgCi0gICAgcmV0dXJuIHNlcnZpY2VLZXlMaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2MThlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFJlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbiBleHRlbmRzIEZpbmRBY3Rpb24KLXsKLSAgcHVibGljIFJlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FLG5hbWUpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUaGlzIHNob3VsZG4ndCBvY2N1ci4KLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBib29sZWFuIHNob3VsZEFkZFF1ZXJ5Tm9kZSA9IChwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSkgPT0gbnVsbCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICBWZWN0b3IgbmFtZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIG5hbWVWZWN0b3IuYWRkRWxlbWVudChuZXcgTmFtZShuYW1lKSk7Ci0KLSAgICAgIC8vIFRoZSBhY3Rpb24gY2FuIGJlIHJ1biB1bmRlciB0aGUgY29udGV4dCBvZiBlaXRoZXIgYSByZWdpc3RyeSBvciBhIHF1ZXJ5IG5vZGUuCi0gICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBTZXJ2aWNlTGlzdCBzZXJ2aWNlTGlzdCA9IHByb3h5LmZpbmRfc2VydmljZSgiIixuYW1lVmVjdG9yLG51bGwsbnVsbCxudWxsLFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1NFQVJDSF9TRVQpOwotICAgICAgCi0gICAgICBTZXJ2aWNlSW5mb3Mgc0luZm9zID0gc2VydmljZUxpc3QuZ2V0U2VydmljZUluZm9zKCk7Ci0gICAgICBpbnQgZmluYWxOdW1iZXJPZkJ1c2luZXNzU2VydmljZXMgPSBNYXRoLm1pbihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9SRVNVTFRTLHNJbmZvcy5zaXplKCkpOwotICAgICAgVmVjdG9yIHNlcnZpY2VLZXlWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxmaW5hbE51bWJlck9mQnVzaW5lc3NTZXJ2aWNlcztpKyspCi0gICAgICB7Ci0gICAgICAgIFNlcnZpY2VJbmZvIHNJbmZvID0gc0luZm9zLmdldChpKTsKLSAgICAgICAgc2VydmljZUtleVZlY3Rvci5hZGRFbGVtZW50KHNJbmZvLmdldFNlcnZpY2VLZXkoKSk7Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgaWYgKGZpbmFsTnVtYmVyT2ZCdXNpbmVzc1NlcnZpY2VzID4gMCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHNob3VsZEFkZFF1ZXJ5Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2VEZXRhaWwgc2VydmljZURldGFpbCA9IHByb3h5LmdldF9zZXJ2aWNlRGV0YWlsKHNlcnZpY2VLZXlWZWN0b3IpOwotICAgICAgICAgIFZlY3RvciBidXNpbmVzc1NlcnZpY2VWZWN0b3IgPSBzZXJ2aWNlRGV0YWlsLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpOwotICAgICAgICAgIFN0cmluZyBxdWVyeU5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUpOwotICAgICAgICAgIEJ1c2luZXNzU2VydmljZVtdIGJzQXJyYXkgPSBuZXcgQnVzaW5lc3NTZXJ2aWNlW2ZpbmFsTnVtYmVyT2ZCdXNpbmVzc1NlcnZpY2VzXTsKLSAgICAgICAgICBidXNpbmVzc1NlcnZpY2VWZWN0b3IudG9BcnJheShic0FycmF5KTsKLSAgICAgICAgICBxdWVyeUVsZW1lbnRfID0gbmV3IFF1ZXJ5RWxlbWVudChic0FycmF5LHF1ZXJ5TmFtZSxyZWdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgICAgICAgIGFkZFF1ZXJ5Tm9kZSgpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFU19GT1VORCIsU3RyaW5nLnZhbHVlT2YoYnNBcnJheS5sZW5ndGgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBGb3JtSW5wdXRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19TRVJWSUNFU19GT1VORCIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChGb3JtSW5wdXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDFmYmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5JZGVudGlmaWVyQmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRGlzY292ZXJ5VVJMczsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRGlzY292ZXJ5VVJMOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLXB1YmxpYyBjbGFzcyBSZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbiBleHRlbmRzIFB1Ymxpc2hBY3Rpb24KLXsKLSAgcHVibGljIFJlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQpKTsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdbXSBuYW1lTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UpOwotICAgIFN0cmluZ1tdIG5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04pOwotICAgIFN0cmluZ1tdIGlkVHlwZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9UWVBFKTsKLSAgICBTdHJpbmdbXSBpZEtleU5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX05BTUUpOwotICAgIFN0cmluZ1tdIGlkS2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX1ZBTFVFKTsKLSAgICBTdHJpbmdbXSBjYXRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSk7Ci0gICAgU3RyaW5nW10gZGlzY292ZXJ5VVJMVmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RJU0NPVkVSWVVSTCk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgZGF0YS4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLQotICAgIEhhc2h0YWJsZSBsYW5ndWFnZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgaWYgKG5hbWVMYW5ndWFnZXMgIT0gbnVsbCAmJiBuYW1lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBuYW1lVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgLy8gVURESSdzIHNhdmUgQVBJIChBcHBlbmRpeCBDIG9mIHRoZSBVRERJIFYyIFByb2dyYW1tZXJzIEFQSSBTcGVjaWZpY2F0aW9uKSByZXF1aXJlcyB0aGUgZm9sbG93aW5nOgotICAgICAgLy8gMSkgT25seSB0aGUgZmlyc3Qgcm93IGNhbiBoYXZlIGEgYmxhbmsgbGFuZ3VhZ2UuCi0gICAgICAvLyAyKSBPbmx5IDEgbmFtZSBwZXIgbGFuZ3VhZ2UuCi0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxuYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwYXJhbWV0ZXJzWzFdID0gU3RyaW5nLnZhbHVlT2YoaSsxKTsKLSAgICAgICAgTmFtZSB1ZGRpNGpOYW1lOwotICAgICAgICBpZiAobmFtZUxhbmd1YWdlc1tpXS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldLG5hbWVMYW5ndWFnZXNbaV0pOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpNGpOYW1lID0gbmV3IE5hbWUobmFtZXNbaV0pOwotICAgICAgICAgIGlmIChpICE9IDAgJiYgIXN1YlF1ZXJ5SW5pdGlhdGVkXykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyxpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYW5ndWFnZUhhc2guZ2V0KG5hbWVMYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGxhbmd1YWdlSGFzaC5wdXQobmFtZUxhbmd1YWdlc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgICBpZiAobmFtZXNbaV0udHJpbSgpLmxlbmd0aCgpIDwgMSkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBuYW1lVmVjdG9yLmFkZEVsZW1lbnQodWRkaTRqTmFtZSk7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyxuYW1lVmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMpOwotICAgICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX05BTUVTIikpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChkZXNjcmlwdGlvbkxhbmd1YWdlcyAhPSBudWxsICYmIGRlc2NyaXB0aW9ucyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcGFyYW1ldGVyc1swXSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIik7Ci0gICAgICBsYW5ndWFnZUhhc2guY2xlYXIoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGRlc2NyaXB0aW9ucy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwYXJhbWV0ZXJzWzFdID0gU3RyaW5nLnZhbHVlT2YoaSsxKTsKLSAgICAgICAgRGVzY3JpcHRpb24gdWRkaTRqRGVzY3JpcHRpb247Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgdWRkaTRqRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb24oZGVzY3JpcHRpb25zW2ldLGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaTRqRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb24oZGVzY3JpcHRpb25zW2ldKTsKLSAgICAgICAgICBpZiAoaSAhPSAwICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlSGFzaC5nZXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsYW5ndWFnZUhhc2gucHV0KGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbnNbaV0udHJpbSgpLmxlbmd0aCgpIDwgMSkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzY3JpcHRpb25WZWN0b3IuYWRkRWxlbWVudCh1ZGRpNGpEZXNjcmlwdGlvbik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMsZGVzY3JpcHRpb25WZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyk7Ci0KLSAgICBpZiAoaWRUeXBlcyAhPSBudWxsICYmIGlkS2V5TmFtZXMgIT0gbnVsbCAmJiBpZEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIElkZW50aWZpZXJCYWcgaWRCYWcgPSBuZXcgSWRlbnRpZmllckJhZygpOwotICAgICAgZm9yIChpbnQgaT0wO2k8aWRLZXlOYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShpZEtleU5hbWVzW2ldLGlkS2V5VmFsdWVzW2ldLGlkVHlwZXNbaV0pOwotICAgICAgICBpZEJhZy5hZGQoa3IpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMsaWRCYWcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLQotICAgIGlmIChjYXRUeXBlcyAhPSBudWxsICYmIGNhdEtleU5hbWVzICE9IG51bGwgJiYgY2F0S2V5VmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgQ2F0ZWdvcnlCYWcgY2F0QmFnID0gbmV3IENhdGVnb3J5QmFnKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjYXRUeXBlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShjYXRLZXlOYW1lc1tpXSxjYXRLZXlWYWx1ZXNbaV0sY2F0VHlwZXNbaV0pOwotICAgICAgICBjYXRCYWcuYWRkKGtyKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMsY2F0QmFnKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19DQVRFR09SSUVTKTsKLSAgICAgIAotICAgIGlmIChkaXNjb3ZlcnlVUkxWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEaXNjb3ZlcnlVUkxzIGRpc2NvdmVyeVVSTHMgPSBuZXcgRGlzY292ZXJ5VVJMcygpOwotICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICBwYXJhbWV0ZXJzWzBdID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRElTQ09WRVJZVVJMIik7Ci0gICAgICBmb3IgKGludCBpPTA7aTxkaXNjb3ZlcnlVUkxWYWx1ZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVVUkwoZGlzY292ZXJ5VVJMVmFsdWVzW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2NvdmVyeVVSTHMuYWRkKG5ldyBEaXNjb3ZlcnlVUkwoZGlzY292ZXJ5VVJMVmFsdWVzW2ldLCIiKSk7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTLGRpc2NvdmVyeVVSTHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMpOyAgICAgIAotCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0gICAgICBWZWN0b3IgbmFtZVZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMpOwotICAgICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpOwotICAgICAgSWRlbnRpZmllckJhZyBpZGVudGlmaWVyQmFnID0gKElkZW50aWZpZXJCYWcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMpOwotICAgICAgQ2F0ZWdvcnlCYWcgY2F0ZWdvcnlCYWcgPSAoQ2F0ZWdvcnlCYWcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7Ci0gICAgICBEaXNjb3ZlcnlVUkxzIGRpc2NvdmVyeVVSTHMgPSAoRGlzY292ZXJ5VVJMcylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLQotICAgICAgLy8gVGhlIGFjdGlvbiBjYW4gYmUgcnVuIHVuZGVyIHRoZSBjb250ZXh0IG9mIGVpdGhlciBhIHJlZ2lzdHJ5IG9yIGEgcXVlcnkgbm9kZS4KLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotCi0gICAgICBCdXNpbmVzc0VudGl0eSBiZSA9IG5ldyBCdXNpbmVzc0VudGl0eSgpOwotICAgICAgYmUuc2V0QnVzaW5lc3NLZXkoIiIpOwotICAgICAgYmUuc2V0TmFtZVZlY3RvcihuYW1lVmVjdG9yKTsKLSAgICAgIGJlLnNldERlc2NyaXB0aW9uVmVjdG9yKGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICAgIGJlLnNldElkZW50aWZpZXJCYWcoaWRlbnRpZmllckJhZyk7Ci0gICAgICBiZS5zZXRDYXRlZ29yeUJhZyhjYXRlZ29yeUJhZyk7Ci0gICAgICBiZS5zZXREaXNjb3ZlcnlVUkxzKGRpc2NvdmVyeVVSTHMpOwotICAgICAgVmVjdG9yIGJlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgYmVWZWN0b3IuYWRkKGJlKTsKLQotICAgICAgYmUgPSAoQnVzaW5lc3NFbnRpdHkpcHJveHkuc2F2ZV9idXNpbmVzcyhyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIGJlVmVjdG9yKS5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpLmdldCgwKTsKLSAgICAgIGFkZFB1Ymxpc2hlZEl0ZW1Ob2RlKGJlLHJlZ0VsZW1lbnQpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0JVU0lORVNTX1BVQkxJU0hFRCIsYmUuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJUcmFuc3BvcnRFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiTWFsZm9ybWVkVVJMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWU3ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotcHVibGljIGNsYXNzIFJlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUFjdGlvbiBleHRlbmRzIFB1Ymxpc2hBY3Rpb24KLXsKLSAgcHVibGljIFJlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSkpOyAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NPdGhlcnMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyLEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX0RFU0NSSVBUSU9OKTsKLQotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FLG5hbWUpOwotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhuYW1lKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfTkFNRSIpKTsKLSAgICB9Ci0KLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19ERVNDUklQVElPTixkZXNjcmlwdGlvbik7Ci0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfREVTQ1JJUFRJT04pOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICAgIHJlZ0VsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLQotICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSBuZXcgQnVzaW5lc3NFbnRpdHkoKTsKLSAgICAgIGJlLnNldEJ1c2luZXNzS2V5KCIiKTsKLSAgICAgIGJlLnNldERlZmF1bHROYW1lKG5ldyBOYW1lKG5hbWUpKTsKLSAgICAgIGJlLnNldERlZmF1bHREZXNjcmlwdGlvblN0cmluZyhkZXNjcmlwdGlvbik7Ci0gICAgICBWZWN0b3IgYmVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBiZVZlY3Rvci5hZGQoYmUpOwotCi0gICAgICBiZSA9IChCdXNpbmVzc0VudGl0eSlwcm94eS5zYXZlX2J1c2luZXNzKHJlZ0VsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgYmVWZWN0b3IpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCkuZ2V0KDApOwotICAgICAgYWRkUHVibGlzaGVkSXRlbU5vZGUoYmUscmVnRWxlbWVudCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQlVTSU5FU1NfUFVCTElTSEVEIixiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlRyYW5zcG9ydEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWEzY2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLio7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLXB1YmxpYyBjbGFzcyBSZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uIGV4dGVuZHMgUHVibGlzaEFjdGlvbgotewotICBwdWJsaWMgUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQpKTsgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgYnVzTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5OT0RFSURfQlVTSU5FU1MpOwotICAgIFN0cmluZ1tdIHNlckludElkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5OT0RFSURfU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgIFN0cmluZyB3c2RsVVJMID0gcGFyc2VyLmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwpOwotICAgIFN0cmluZ1tdIG5hbWVMYW5ndWFnZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSk7Ci0gICAgU3RyaW5nW10gbmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSk7ICAgIAotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04pOwotICAgIFN0cmluZ1tdIGNhdFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX1RZUEUpOwotICAgIFN0cmluZ1tdIGNhdEtleU5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX1ZBTFVFKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgaWYgKGJ1c05vZGVJZHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Igc2VydmljZUJ1c2luZXNzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICAgICBpZiAoc2VydmljZUJ1c2luZXNzID09IG51bGwpCi0gICAgICAgIHNlcnZpY2VCdXNpbmVzcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2VydmljZUJ1c2luZXNzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgICBWZWN0b3Igc2VydmljZUJ1c2luZXNzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSk7Ci0gICAgICAvLyBUaGUgYnJvd3NlciB3aWxsIGVuZm9yY2UgdGhlIHJ1bGUgb2YgaGF2aW5nIG9ubHkgb25lIGJ1c2luZXNzIGluIHRoaXMgbGlzdC4KLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VCdXNpbmVzc0NvcHkuZWxlbWVudEF0KDApOwotICAgICAgc2VydmljZUJ1c2luZXNzLmFkZEVsZW1lbnQobGlzdEVsZW1lbnQpOwotICAgICAgQnVzaW5lc3NFbnRpdHkgc3AgPSAoQnVzaW5lc3NFbnRpdHkpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTLHNlcnZpY2VCdXNpbmVzcyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIsc3ApOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVksc3AuZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1MpOwotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIpOwotICAgICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9CVVNJTkVTUyIpKTsKLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgaWYgKHNlckludElkcyAhPSBudWxsICYmIHNlckludElkcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIFZlY3RvciBzZXJ2aWNlSW50ZXJmYWNlcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgICAgIGlmIChzZXJ2aWNlSW50ZXJmYWNlcyA9PSBudWxsKQotICAgICAgICBzZXJ2aWNlSW50ZXJmYWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc2VydmljZUludGVyZmFjZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgIFZlY3RvciBzZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZKTsKLSAgICAgIFZlY3RvciB0bW9kZWxzID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VJbnRlcmZhY2VzQ29weS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClpdC5uZXh0KCk7Ci0gICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJJbnRJZHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0Tm9kZUlkID09IEludGVnZXIucGFyc2VJbnQoc2VySW50SWRzW2ldKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2VydmljZUludGVyZmFjZXMuYWRkKGxpc3RFbGVtZW50KTsKLSAgICAgICAgICAgICAgdG1vZGVscy5hZGQobGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMsIHNlcnZpY2VJbnRlcmZhY2VzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfVE1PREVMLCB0bW9kZWxzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1RNT0RFTCk7Ci0gICAgfQotICAgIAotICAgIGlmICh3c2RsVVJMICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCx3c2RsVVJMKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwsd3NkbFVSTCk7Ci0gICAgfQotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh3c2RsVVJMKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTCIpKTsKLSAgICB9Ci0KLSAgICBIYXNodGFibGUgbGFuZ3VhZ2VIYXNoID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChuYW1lTGFuZ3VhZ2VzICE9IG51bGwgJiYgbmFtZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgbmFtZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIC8vIFVEREkncyBzYXZlIEFQSSAoQXBwZW5kaXggQyBvZiB0aGUgVURESSBWMiBQcm9ncmFtbWVycyBBUEkgU3BlY2lmaWNhdGlvbikgcmVxdWlyZXMgdGhlIGZvbGxvd2luZzoKLSAgICAgIC8vIDEpIE9ubHkgdGhlIGZpcnN0IHJvdyBjYW4gaGF2ZSBhIGJsYW5rIGxhbmd1YWdlLgotICAgICAgLy8gMikgT25seSAxIG5hbWUgcGVyIGxhbmd1YWdlLgotICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICBwYXJhbWV0ZXJzWzBdID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpOwotICAgICAgZm9yIChpbnQgaT0wO2k8bmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIE5hbWUgdWRkaTRqTmFtZTsKLSAgICAgICAgaWYgKG5hbWVMYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0ak5hbWUgPSBuZXcgTmFtZShuYW1lc1tpXSxuYW1lTGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldKTsKLSAgICAgICAgICBpZiAoaSAhPSAwICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYW5ndWFnZUhhc2guZ2V0KG5hbWVMYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgbGFuZ3VhZ2VIYXNoLnB1dChuYW1lTGFuZ3VhZ2VzW2ldLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGlmIChuYW1lc1tpXS50cmltKCkubGVuZ3RoKCkgPCAxKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZVZlY3Rvci5hZGRFbGVtZW50KHVkZGk0ak5hbWUpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxuYW1lVmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyk7Ci0gICAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXykKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19OQU1FUyIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZGVzY3JpcHRpb25MYW5ndWFnZXMgIT0gbnVsbCAmJiBkZXNjcmlwdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgZGVzY3JpcHRpb25WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVNDUklQVElPTiIpOwotICAgICAgbGFuZ3VhZ2VIYXNoLmNsZWFyKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbnMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIERlc2NyaXB0aW9uIHVkZGk0akRlc2NyaXB0aW9uOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSxkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSk7Ci0gICAgICAgICAgaWYgKGkgIT0gMCAmJiAhc3ViUXVlcnlJbml0aWF0ZWRfKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlSGFzaC5nZXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGxhbmd1YWdlSGFzaC5wdXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uc1tpXS50cmltKCkubGVuZ3RoKCkgPCAxKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yLmFkZEVsZW1lbnQodWRkaTRqRGVzY3JpcHRpb24pOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsZGVzY3JpcHRpb25WZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TKTsKLQotICAgIGlmIChjYXRUeXBlcyAhPSBudWxsICYmIGNhdEtleU5hbWVzICE9IG51bGwgJiYgY2F0S2V5VmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgQ2F0ZWdvcnlCYWcgY2F0QmFnID0gbmV3IENhdGVnb3J5QmFnKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjYXRUeXBlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShjYXRLZXlOYW1lc1tpXSxjYXRLZXlWYWx1ZXNbaV0sY2F0VHlwZXNbaV0pOwotICAgICAgICBjYXRCYWcuYWRkKGtyKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyxjYXRCYWcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9QUk9WSURFUik7Ci0gICAgICBTdHJpbmcgYnVzaW5lc3NLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKTsKLSAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfVE1PREVMKTsKLSAgICAgIFN0cmluZyB3c2RsVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKTsKLSAgICAgIFZlY3RvciBuYW1lVmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpOwotICAgICAgQ2F0ZWdvcnlCYWcgY2F0ZWdvcnlCYWcgPSAoQ2F0ZWdvcnlCYWcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLQotICAgICAgLy8gVGhlIGFjdGlvbiBjYW4gYmUgcnVuIHVuZGVyIHRoZSBjb250ZXh0IG9mIGVpdGhlciBhIHJlZ2lzdHJ5IG9yIGEgcXVlcnkgbm9kZS4KLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotCi0gICAgICBVZGRpNGpIZWxwZXIgdWRkaTRqSGVscGVyID0gbmV3IFVkZGk0akhlbHBlcigpOwotICAgICAgRGVmaW5pdGlvbiBkZWYgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0KLSAgICAgIEJ1c2luZXNzU2VydmljZSBiczsKLSAgICAgIGlmICh0TW9kZWxWZWN0b3IgIT0gbnVsbCAmJiB0TW9kZWxWZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgICAgYnMgPSB1ZGRpNGpIZWxwZXIubmV3QnVzaW5lc3NTZXJ2aWNlKHdzZGxVUkwsIGRlZiwgKFRNb2RlbFtdKXRNb2RlbFZlY3Rvci50b0FycmF5KG5ldyBUTW9kZWxbMF0pKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24gcmVnUHVibGlzaFNJQWN0aW9uID0gbmV3IFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgaW50IGN1cnJlbnROb2RlSWQgPSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXROb2RlSWQoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSByZWdOb2RlXy5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBUTW9kZWxbXSB0TW9kZWxzID0gbnVsbDsKLSAgICAgICAgaWYgKHVkZGk0akhlbHBlci5pc01vbm9saXRoaWNXU0RMKGRlZikpCi0gICAgICAgIHsKLSAgICAgICAgICB0TW9kZWxzID0gbmV3IFRNb2RlbFsxXTsKLSAgICAgICAgICB0TW9kZWxzWzBdID0gdWRkaTRqSGVscGVyLm5ld1RNb2RlbCh3c2RsVVJMLCBkZWYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZ1tdIGltcG9ydHMgPSB1ZGRpNGpIZWxwZXIuZ2V0SW1wb3J0cyhkZWYsIHdzZGxVUkwpOwotICAgICAgICAgIHRNb2RlbHMgPSBuZXcgVE1vZGVsW2ltcG9ydHMubGVuZ3RoXTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRNb2RlbHMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB0TW9kZWxzW2ldID0gdWRkaTRqSGVscGVyLm5ld1RNb2RlbChpbXBvcnRzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBIYXNodGFibGUgdE1vZGVsc1RhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBpZiAodE1vZGVscyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaT0wO2k8dE1vZGVscy5sZW5ndGg7aSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSByZWdQdWJsaXNoU0lBY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHVkZGk0akhlbHBlci5nZXRXU0RMKHRNb2RlbHNbaV0pLCB0TW9kZWxzW2ldKTsKLSAgICAgICAgICAgIGlmIChpbnB1dHNWYWxpZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVnUHVibGlzaFNJQWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICBPYmplY3Qgc2F2ZWRUTW9kZWwgPSByZWdQdWJsaXNoU0lBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX09VVFBVVF9TQVZFRF9UTU9ERUwpOwotICAgICAgICAgICAgICBpZiAoc2F2ZWRUTW9kZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0TW9kZWxzVGFibGUucHV0KCgoVE1vZGVsKXNhdmVkVE1vZGVsKS5nZXROYW1lU3RyaW5nKCksIHNhdmVkVE1vZGVsKTsKLSAgICAgICAgICAgICAgLy8gUmVzZWxlY3QgdGhlIGN1cnJlbnQgbm9kZS4KLSAgICAgICAgICAgICAgbm9kZU1hbmFnZXIuc2V0U2VsZWN0ZWROb2RlSWQoY3VycmVudE5vZGVJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJzID0gdWRkaTRqSGVscGVyLm5ld0J1c2luZXNzU2VydmljZSh3c2RsVVJMLCBkZWYsIHRNb2RlbHNUYWJsZSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChiZSAhPSBudWxsKQotICAgICAgICBicy5zZXRCdXNpbmVzc0tleShiZS5nZXRCdXNpbmVzc0tleSgpKTsKLSAgICAgIGVsc2UgaWYgKGJ1c2luZXNzS2V5ICE9IG51bGwpCi0gICAgICAgIGJzLnNldEJ1c2luZXNzS2V5KGJ1c2luZXNzS2V5KTsKLSAgICAgIGJzLnNldE5hbWVWZWN0b3IobmFtZVZlY3Rvcik7Ci0gICAgICBicy5zZXREZXNjcmlwdGlvblZlY3RvcihkZXNjcmlwdGlvblZlY3Rvcik7Ci0gICAgICBicy5zZXRDYXRlZ29yeUJhZyhjYXRlZ29yeUJhZyk7Ci0gICAgICBWZWN0b3IgYnNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBic1ZlY3Rvci5hZGQoYnMpOwotICAgICAgcmVnRWxlbWVudC5oYW5kbGVQcmVJbnZvY2F0aW9uKGJzKTsKLSAgICAgIGJzID0gKEJ1c2luZXNzU2VydmljZSlwcm94eS5zYXZlX3NlcnZpY2UocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBic1ZlY3RvcikuZ2V0QnVzaW5lc3NTZXJ2aWNlVmVjdG9yKCkuZ2V0KDApOwotICAgICAgYWRkUHVibGlzaGVkSXRlbU5vZGUoYnMscmVnRWxlbWVudCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRV9QVUJMSVNIRUQiLGJzLmdldERlZmF1bHROYW1lU3RyaW5nKCkpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIldTRExFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlRyYW5zcG9ydEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjIxODUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLio7Ci0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotcHVibGljIGNsYXNzIFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRBY3Rpb24gZXh0ZW5kcyBQdWJsaXNoQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25MYW5ndWFnZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT05fTEFOR1VBR0UpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTik7Ci0gICAgU3RyaW5nW10gaWRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX1RZUEUpOwotICAgIFN0cmluZ1tdIGlkS2V5TmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gaWRLZXlWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfVkFMVUUpOwotICAgIFN0cmluZ1tdIGNhdFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX1RZUEUpOwotICAgIFN0cmluZ1tdIGNhdEtleU5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlWYWx1ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX1ZBTFVFKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhLgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgSGFzaHRhYmxlIGxhbmd1YWdlSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgIGlmICh3c2RsVVJMICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCx3c2RsVVJMKTsKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcod3NkbFVSTCkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLG5hbWUpOwotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhuYW1lKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9OQU1FIikpOwotICAgIH0KLQotICAgIGlmIChkZXNjcmlwdGlvbkxhbmd1YWdlcyAhPSBudWxsICYmIGRlc2NyaXB0aW9ucyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcGFyYW1ldGVyc1swXSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIik7Ci0gICAgICBsYW5ndWFnZUhhc2guY2xlYXIoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGRlc2NyaXB0aW9ucy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBwYXJhbWV0ZXJzWzFdID0gU3RyaW5nLnZhbHVlT2YoaSsxKTsKLSAgICAgICAgRGVzY3JpcHRpb24gdWRkaTRqRGVzY3JpcHRpb247Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgdWRkaTRqRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb24oZGVzY3JpcHRpb25zW2ldLGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaTRqRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRpb24oZGVzY3JpcHRpb25zW2ldKTsKLSAgICAgICAgICBpZiAoaSAhPSAwICYmICFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlSGFzaC5nZXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsYW5ndWFnZUhhc2gucHV0KGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbnNbaV0udHJpbSgpLmxlbmd0aCgpIDwgMSkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzY3JpcHRpb25WZWN0b3IuYWRkRWxlbWVudCh1ZGRpNGpEZXNjcmlwdGlvbik7Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMsZGVzY3JpcHRpb25WZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyk7Ci0KLSAgICBpZiAoaWRUeXBlcyAhPSBudWxsICYmIGlkS2V5TmFtZXMgIT0gbnVsbCAmJiBpZEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIElkZW50aWZpZXJCYWcgaWRCYWcgPSBuZXcgSWRlbnRpZmllckJhZygpOwotICAgICAgZm9yIChpbnQgaT0wO2k8aWRLZXlOYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShpZEtleU5hbWVzW2ldLGlkS2V5VmFsdWVzW2ldLGlkVHlwZXNbaV0pOwotICAgICAgICBpZEJhZy5hZGQoa3IpOwotICAgICAgfQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMsaWRCYWcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTKTsKLQotICAgIGlmIChjYXRUeXBlcyAhPSBudWxsICYmIGNhdEtleU5hbWVzICE9IG51bGwgJiYgY2F0S2V5VmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgQ2F0ZWdvcnlCYWcgY2F0QmFnID0gbmV3IENhdGVnb3J5QmFnKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjYXRUeXBlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShjYXRLZXlOYW1lc1tpXSxjYXRLZXlWYWx1ZXNbaV0sY2F0VHlwZXNbaV0pOwotICAgICAgICBjYXRCYWcuYWRkKGtyKTsKLSAgICAgIH0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMsY2F0QmFnKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTKTsKLQotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsKLSAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TKTsKLSAgICAgIElkZW50aWZpZXJCYWcgaWRlbnRpZmllckJhZyA9IChJZGVudGlmaWVyQmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTKTsKLSAgICAgIENhdGVnb3J5QmFnIGNhdGVnb3J5QmFnID0gKENhdGVnb3J5QmFnKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMpOwotCi0gICAgICAvLyBUaGUgYWN0aW9uIGNhbiBiZSBydW4gdW5kZXIgdGhlIGNvbnRleHQgb2YgZWl0aGVyIGEgcmVnaXN0cnkgb3IgYSBxdWVyeSBub2RlLgotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgICAgICByZWdFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLHVzZXJJZCxwYXNzd29yZCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0KLSAgICAgIFRNb2RlbCB0TW9kZWwgPSAobmV3IFVkZGk0akhlbHBlcigpKS5uZXdUTW9kZWwod3NkbFVSTCk7Ci0gICAgICB0TW9kZWwuc2V0TmFtZShuYW1lKTsKLSAgICAgIHRNb2RlbC5zZXREZXNjcmlwdGlvblZlY3RvcihkZXNjcmlwdGlvblZlY3Rvcik7Ci0gICAgICB0TW9kZWwuc2V0SWRlbnRpZmllckJhZyhpZGVudGlmaWVyQmFnKTsKLSAgICAgIAotICAgICAgLy8gVGhlIGNhdGVnb3J5IGJhZyBtYXkgY29udGFpbiB3c2RsU3BlYy4KLSAgICAgIENhdGVnb3J5QmFnIGRlZmF1bHRDYXRlZ29yeUJhZyA9IHRNb2RlbC5nZXRDYXRlZ29yeUJhZygpOwotICAgICAgVmVjdG9yIGRlZmF1bHRLZXllZFJlZmVyZW5jZVZlY3RvciA9IG51bGw7Ci0gICAgICBpZiAoZGVmYXVsdENhdGVnb3J5QmFnICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChjYXRlZ29yeUJhZyA9PSBudWxsKQotICAgICAgICAgIGNhdGVnb3J5QmFnID0gZGVmYXVsdENhdGVnb3J5QmFnOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZWZhdWx0S2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBkZWZhdWx0Q2F0ZWdvcnlCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7aTxkZWZhdWx0S2V5ZWRSZWZlcmVuY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlkZWZhdWx0S2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYgKGNhdGVnb3J5QmFnICE9IG51bGwpCi0gICAgICAgICAgICAgIGNhdGVnb3J5QmFnLmFkZChrcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0TW9kZWwuc2V0Q2F0ZWdvcnlCYWcoY2F0ZWdvcnlCYWcpOwotCi0gICAgICBWZWN0b3IgdE1vZGVsVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgdE1vZGVsVmVjdG9yLmFkZCh0TW9kZWwpOwotICAgICAgdE1vZGVsID0gKFRNb2RlbClwcm94eS5zYXZlX3RNb2RlbChyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIHRNb2RlbFZlY3RvcikuZ2V0VE1vZGVsVmVjdG9yKCkuZ2V0KDApOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfT1VUUFVUX1NBVkVEX1RNT0RFTCwgdE1vZGVsKTsKLSAgICAgIGFkZFB1Ymxpc2hlZEl0ZW1Ob2RlKHRNb2RlbCxyZWdFbGVtZW50KTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9QVUJMSVNIRUQiLHRNb2RlbC5nZXROYW1lU3RyaW5nKCkpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIldTRExFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlRyYW5zcG9ydEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9ICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFiYWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotcHVibGljIGNsYXNzIFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uIGV4dGVuZHMgUHVibGlzaEFjdGlvbgotewotICBwdWJsaWMgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT04pOwotCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0KLSAgICBpZiAod3NkbFVSTCAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMLHdzZGxVUkwpOwotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh3c2RsVVJMKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSxuYW1lKTsKLQotICAgIGlmICghc3ViUXVlcnlJbml0aWF0ZWRfICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcobmFtZSkpCi0gICAgewotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX05BTUUiKSk7Ci0gICAgfQotCi0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT04sZGVzY3JpcHRpb24pOwotCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoU3RyaW5nIHdzZGxVUkwsIFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBTdHJpbmcgbmFtZSA9IHRNb2RlbC5nZXROYW1lU3RyaW5nKCk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gdE1vZGVsLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotICAgIGlmICh3c2RsVVJMICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwsd3NkbFVSTCk7Ci0gICAgZWxzZQotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiAobmFtZSAhPSBudWxsKSAKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLG5hbWUpOwotICAgIGVsc2UKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgCi0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT04sZGVzY3JpcHRpb24pOwotICAgIGVsc2UKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTiwiIik7Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsKLSAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgICAgICByZWdFbGVtZW50LnBlcmZvcm1Mb2dpbihwdWJsaXNoVVJMLHVzZXJJZCxwYXNzd29yZCk7Ci0KLSAgICAgIFRNb2RlbCB0TW9kZWwgPSAobmV3IFVkZGk0akhlbHBlcigpKS5uZXdUTW9kZWwod3NkbFVSTCk7Ci0gICAgICB0TW9kZWwuc2V0TmFtZShuYW1lKTsKLSAgICAgIHRNb2RlbC5zZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoZGVzY3JpcHRpb24pOwotCi0gICAgICBWZWN0b3IgdE1vZGVsVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgdE1vZGVsVmVjdG9yLmFkZCh0TW9kZWwpOwotICAgICAgdE1vZGVsID0gKFRNb2RlbClwcm94eS5zYXZlX3RNb2RlbChyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIHRNb2RlbFZlY3RvcikuZ2V0VE1vZGVsVmVjdG9yKCkuZ2V0KDApOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfT1VUUFVUX1NBVkVEX1RNT0RFTCwgdE1vZGVsKTsKLSAgICAgIGFkZFB1Ymxpc2hlZEl0ZW1Ob2RlKHRNb2RlbCxyZWdFbGVtZW50KTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9QVUJMSVNIRUQiLHRNb2RlbC5nZXROYW1lU3RyaW5nKCkpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJXU0RMRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9ICAgIAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmUwY2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS4qOwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1wdWJsaWMgY2xhc3MgUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24gZXh0ZW5kcyBQdWJsaXNoQWN0aW9uCi17Ci0gIHB1YmxpYyBSZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUykpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFKSk7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7ICAgIAotICAgIFN0cmluZyBidXNOb2RlSWRzID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5PREVJRF9CVVNJTkVTUyk7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OKTsKLQotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgaWYgKGJ1c05vZGVJZHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Igc2VydmljZUJ1c2luZXNzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1MpOwotICAgICAgaWYgKHNlcnZpY2VCdXNpbmVzcyA9PSBudWxsKQotICAgICAgICBzZXJ2aWNlQnVzaW5lc3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNlcnZpY2VCdXNpbmVzcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgVmVjdG9yIHNlcnZpY2VCdXNpbmVzc0NvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTU19DT1BZKTsKLSAgICAgIC8vIFRoZSBicm93c2VyIHdpbGwgZW5mb3JjZSB0aGUgcnVsZSBvZiBoYXZpbmcgb25seSBvbmUgYnVzaW5lc3MgaW4gdGhpcyBsaXN0LgotICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZUJ1c2luZXNzQ29weS5lbGVtZW50QXQoMCk7Ci0gICAgICBzZXJ2aWNlQnVzaW5lc3MuYWRkRWxlbWVudChsaXN0RWxlbWVudCk7Ci0gICAgICBCdXNpbmVzc0VudGl0eSBiZSA9IChCdXNpbmVzc0VudGl0eSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTLHNlcnZpY2VCdXNpbmVzcyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSLGJlKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLGJlLmdldEJ1c2luZXNzS2V5KCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIpOwotICAgICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8pCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1MpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfQlVTSU5FU1MiKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHdzZGxVUkwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMLHdzZGxVUkwpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfV1NETF9VUkwsd3NkbFVSTCk7Ci0gICAgfQotCi0gICAgaWYgKCFzdWJRdWVyeUluaXRpYXRlZF8gJiYgIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyh3c2RsVVJMKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkwiKSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUsbmFtZSk7Ci0KLSAgICBpZiAoIXN1YlF1ZXJ5SW5pdGlhdGVkXyAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKG5hbWUpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX05BTUUiKSk7Ci0gICAgfQotCi0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9ERVNDUklQVElPTixkZXNjcmlwdGlvbik7Ci0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1NFUlZJQ0VfUFJPVklERVIpOwotICAgIFN0cmluZyBidXNpbmVzc0tleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpOwotICAgIFN0cmluZyB3c2RsVVJMID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfREVTQ1JJUFRJT04pOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICAgIHJlZ0VsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLSAgICAgIAotICAgICAgVWRkaTRqSGVscGVyIHVkZGk0akhlbHBlciA9IG5ldyBVZGRpNGpIZWxwZXIoKTsKLSAgICAgIERlZmluaXRpb24gZGVmID0gdWRkaTRqSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgICAgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24gcmVnUHVibGlzaFNJQWN0aW9uID0gbmV3IFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgIGludCBjdXJyZW50Tm9kZUlkID0gZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkuZ2V0Tm9kZUlkKCk7Ci0gICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHJlZ05vZGVfLmdldE5vZGVNYW5hZ2VyKCk7Ci0KLSAgICAgIEhhc2h0YWJsZSB0TW9kZWxzVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICBUTW9kZWxbXSB0TW9kZWxzID0gbnVsbDsKLSAgICAgIGlmICh1ZGRpNGpIZWxwZXIuaXNNb25vbGl0aGljV1NETChkZWYpKQotICAgICAgewotICAgICAgICB0TW9kZWxzID0gbmV3IFRNb2RlbFsxXTsKLSAgICAgICAgdE1vZGVsc1swXSA9IHVkZGk0akhlbHBlci5uZXdUTW9kZWwod3NkbFVSTCwgZGVmKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gaW1wb3J0cyA9IHVkZGk0akhlbHBlci5nZXRJbXBvcnRzKGRlZiwgd3NkbFVSTCk7Ci0gICAgICAgIHRNb2RlbHMgPSBuZXcgVE1vZGVsW2ltcG9ydHMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0TW9kZWxzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHRNb2RlbHNbaV0gPSB1ZGRpNGpIZWxwZXIubmV3VE1vZGVsKGltcG9ydHNbaV0pOwotICAgICAgfQotCi0gICAgICBpZiAodE1vZGVscyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpPTA7aTx0TW9kZWxzLmxlbmd0aDtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gcmVnUHVibGlzaFNJQWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZSh1ZGRpNGpIZWxwZXIuZ2V0V1NETCh0TW9kZWxzW2ldKSwgdE1vZGVsc1tpXSk7Ci0gICAgICAgICAgaWYgKGlucHV0c1ZhbGlkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlZ1B1Ymxpc2hTSUFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIE9iamVjdCBzYXZlZFRNb2RlbCA9IHJlZ1B1Ymxpc2hTSUFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkuZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfT1VUUFVUX1NBVkVEX1RNT0RFTCk7Ci0gICAgICAgICAgICBpZiAoc2F2ZWRUTW9kZWwgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdE1vZGVsc1RhYmxlLnB1dCgoKFRNb2RlbClzYXZlZFRNb2RlbCkuZ2V0TmFtZVN0cmluZygpLCBzYXZlZFRNb2RlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBSZXNlbGVjdCB0aGUgY3VycmVudCBub2RlLgotICAgICAgICAgICAgbm9kZU1hbmFnZXIuc2V0U2VsZWN0ZWROb2RlSWQoY3VycmVudE5vZGVJZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IHVkZGk0akhlbHBlci5uZXdCdXNpbmVzc1NlcnZpY2Uod3NkbFVSTCwgZGVmLCB0TW9kZWxzVGFibGUpOwotICAgICAgaWYgKGJlICE9IG51bGwpCi0gICAgICAgIGJzLnNldEJ1c2luZXNzS2V5KGJlLmdldEJ1c2luZXNzS2V5KCkpOwotICAgICAgZWxzZSBpZiAoYnVzaW5lc3NLZXkgIT0gbnVsbCkKLSAgICAgICAgYnMuc2V0QnVzaW5lc3NLZXkoYnVzaW5lc3NLZXkpOwotICAgICAgYnMuc2V0RGVmYXVsdE5hbWUobmV3IE5hbWUobmFtZSkpOwotICAgICAgYnMuc2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKGRlc2NyaXB0aW9uKTsKLSAgICAgIFZlY3RvciBic1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGJzVmVjdG9yLmFkZChicyk7Ci0gICAgICByZWdFbGVtZW50LmhhbmRsZVByZUludm9jYXRpb24oYnMpOwotICAgICAgYnMgPSAoQnVzaW5lc3NTZXJ2aWNlKXByb3h5LnNhdmVfc2VydmljZShyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIGJzVmVjdG9yKS5nZXRCdXNpbmVzc1NlcnZpY2VWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICBhZGRQdWJsaXNoZWRJdGVtTm9kZShicyxyZWdFbGVtZW50KTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX1BVQkxJU0hFRCIsYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiV1NETEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVHJhbnNwb3J0RXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1JlbW92ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVtb3ZlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2RjZTEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVtb3ZlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouKjsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5hc3NlcnRpb24uKjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotcHVibGljIGNsYXNzIFJlbW92ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gZXh0ZW5kcyBDb21tb25QdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uCi17Ci0gIHB1YmxpYyBSZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIGlmIChyZWdpc3RyeU5vZGVfID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLQotICAgIC8vIGlkcyBmcm9tIHVkZGlPYmplY3RzX3RhYmxlCi0gICAgU3RyaW5nW10gc2VsZWN0ZWRCdXNJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lEKTsKLSAgICBpZiAoc2VsZWN0ZWRCdXNJZHMgIT0gbnVsbCAmJiBzZWxlY3RlZEJ1c0lkcy5sZW5ndGggPiAwKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lELCBzZWxlY3RlZEJ1c0lkcyk7Ci0gICAgLy8gU3luY2hyb25pemUgY2xpZW50IHZpZXcgYW5kIHNlcnZlciBtb2RlbCAodWRkaU9iamVjdF90YWJsZS5qc3ApCi0gICAgc3luY2hyb25pemVVRERJT2JqZWN0VGFibGUoKTsKLQotICAgIC8vIGlmIG5vdCB5ZXQgbG9nZ2VkIGluLCB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVycyBuZWVkZWQgdG8gbG9nIGluCi0gICAgaWYgKCFpc0xvZ2dlZEluXykgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLQotICAgICAgaWYgKHB1Ymxpc2hVUkwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICB9Ci0gIAotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVVUkwocHVibGlzaFVSTCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMIikpOwotICAgICAgfQotCi0gICAgICBpZiAodXNlcklEIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJRCk7Ci0gICAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJRCk7Ci0gICAgICB9Ci0gIAotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcodXNlcklEKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VTRVJJRCIpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gaWRzIGZyb20gcHVibGlzaGVyIGFzc2VydGlvbiB0YWJsZQotICAgIFN0cmluZ1tdIHB1YkFzc2VydGlvbnNWaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1ZJRVdJRCk7Ci0gICAgaWYgKHB1YkFzc2VydGlvbnNWaWV3SWRzID09IG51bGwgfHwgcHViQXNzZXJ0aW9uc1ZpZXdJZHMubGVuZ3RoID09IDApCi0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgIGVsc2UKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1ZJRVdJRCwgcHViQXNzZXJ0aW9uc1ZpZXdJZHMpOwotCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGlmIChyZWdpc3RyeU5vZGVfID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnaXN0cnlFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotCi0gICAgaWYgKCEoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgQnVzaW5lc3NFbGVtZW50KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIGlmIG5vdCB5ZXQgbG9nZ2VkIGluLCBsb2cgaW4gZmlyc3QKLSAgICBpZiAoIWlzTG9nZ2VkSW5fKSB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJRCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotCi0gICAgICB0cnkgewotICAgICAgICByZWdpc3RyeUVsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsIHVzZXJJRCwgcGFzc3dvcmQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiB0ZSkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlRyYW5zcG9ydEV4Y2VwdGlvbiIpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh0ZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiB1ZGRpZSkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UobWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSAgICAgIAotICAgIH0KLQotICAgIFVERElQcm94eSBwcm94eSA9IHJlZ2lzdHJ5RWxlbWVudC5nZXRQcm94eSgpOwotICAgIFN0cmluZyB1c2VySUQgPSByZWdpc3RyeUVsZW1lbnQuZ2V0VXNlcklkKCk7Ci0gICAgU3RyaW5nIGNyZWQgPSByZWdpc3RyeUVsZW1lbnQuZ2V0Q3JlZCgpOwotICAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgTGlzdE1hbmFnZXIgcHViQXNzZXJ0aW9ucyA9IGJ1c0VsZW1lbnQuZ2V0UHVibGlzaGVyQXNzZXJ0aW9ucygpOwotCi0gICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIG93bmVkIGJ1c2luZXNzCi0gICAgLy8gaWYgbm90LCB0aGUgQWRkUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkCi0gICAgaWYgKCFpc0J1c2luZXNzT3duZWQoYnVzRWxlbWVudCkpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RfT1dORURfQlVTSU5FU1MiKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgU3RyaW5nW10gcHViQXNzZXJ0aW9uVmlld0lkcyA9IChTdHJpbmdbXSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19WSUVXSUQpOwotICAgICAgVmVjdG9yIHB1YkFzc2VydGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGJvb2xlYW4gcmVmcmVzaFJlcXVpcmVkID0gZmFsc2U7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHViQXNzZXJ0aW9uVmlld0lkcy5sZW5ndGg7IGkrKykgewotICAgICAgICBpbnQgdmlld0lEID0gSW50ZWdlci5wYXJzZUludChwdWJBc3NlcnRpb25WaWV3SWRzW2ldKTsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSBwdWJBc3NlcnRpb25zLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCk7Ci0gICAgICAgIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQgcHViQXNzZXJ0aW9uRWxlbWVudCA9IChQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICBQdWJsaXNoZXJBc3NlcnRpb24gcHViQXNzZXJ0aW9uID0gcHViQXNzZXJ0aW9uRWxlbWVudC5nZXRQdWJsaXNoZXJBc3NlcnRpb24oKTsKLSAgICAgICAgcHViQXNzZXJ0aW9uVmVjdG9yLmFkZChwdWJBc3NlcnRpb24pOwotICAgICAgICBpZiAocHViQXNzZXJ0aW9uRWxlbWVudC5nZXRTdGF0dXMoKS5lcXVhbHMoQ29tcGxldGlvblN0YXR1cy5DT01QTEVURSkpCi0gICAgICAgICAgcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgRGlzcG9zaXRpb25SZXBvcnQgcmVwb3J0ID0gcHJveHkuZGVsZXRlX3B1Ymxpc2hlckFzc2VydGlvbnMocmVnaXN0cnlFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIHB1YkFzc2VydGlvblZlY3Rvcik7Ci0gICAgICAvL3JlcG9ydCBzdGF0dXMKLQkgIFZlY3RvciByZXBvcnRFcnJJbmZvID0gcmVwb3J0LmdldFJlc3VsdFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvcnRFcnJJbmZvLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCgoUmVzdWx0KSByZXBvcnRFcnJJbmZvLmdldChpKSkuZ2V0RXJySW5mbygpLmdldFRleHQoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlZnJlc2ggaXMgcmVxdWlyZWQsIHJlZnJlc2ggdGhlIHdob2xlIHB1Ymxpc2hlciBhc3NlcnRpb24gdGFibGUKLSAgICAgIGlmIChyZWZyZXNoUmVxdWlyZWQpIHsKLSAgICAgICAgU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gc2hvd1BBQWN0aW9uID0gbmV3IFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBzaG93UEFBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICAgICBPYmplY3QgaWRzID0gcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lEKTsKLSAgICAgICAgaWYgKGlkcyAhPSBudWxsKQotICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lELCBpZHMpOwotICAgICAgICBzaG93UEFBY3Rpb24ucnVuKCk7Ci0gICAgICB9Ci0gICAgICAvLyByZWZyZXNoIGlzIG5vdCByZXF1aXJlZCwgZGVsZXRlIHRoZSBzZWxlY3RlZCBwdWJsaXNoZXIgYXNzZXJ0aW9uIGVsZW1lbnRzCi0gICAgICBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwdWJBc3NlcnRpb25WaWV3SWRzLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgcHViQXNzZXJ0aW9ucy5yZW1vdmVFbGVtZW50V2l0aFZpZXdJZChJbnRlZ2VyLnBhcnNlSW50KHB1YkFzc2VydGlvblZpZXdJZHNba10pKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gcmVwb3J0LnN1Y2Nlc3MoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IHJlcG9ydCA9IHVkZGllLmdldERpc3Bvc2l0aW9uUmVwb3J0KCk7Ci0JICBWZWN0b3IgcmVwb3J0RXJySW5mbyA9IHJlcG9ydC5nZXRSZXN1bHRWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3J0RXJySW5mby5zaXplKCk7IGkrKykgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoKFJlc3VsdCkgcmVwb3J0RXJySW5mby5nZXQoaSkpLmdldEVyckluZm8oKS5nZXRUZXh0KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIkV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZW1vdmVTdWJRdWVyeUl0ZW1BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjODI0ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZW1vdmVTdWJRdWVyeUl0ZW1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFJlbW92ZVN1YlF1ZXJ5SXRlbUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcml2YXRlIENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIAotICBwdWJsaWMgUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICB9Ci0gIAotICAvLyB1ZGRpL2FjdGlvbnMvUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uSlNQLmpzcD9zdWJRdWVyeUtleT0uLi4mc3ViUXVlcnlMaXN0S2V5PS4uLiZzdWJRdWVyeUxpc3RJdGVtSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHN1YlF1ZXJ5S2V5LFN0cmluZyBzdWJRdWVyeUxpc3RLZXksaW50IHN1YlF1ZXJ5TGlzdEl0ZW1JZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1JlbW92ZVN1YlF1ZXJ5SXRlbUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpLmFwcGVuZCgnPScpLmFwcGVuZChzdWJRdWVyeUtleSk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0tFWSkuYXBwZW5kKCc9JykuYXBwZW5kKHN1YlF1ZXJ5TGlzdEtleSk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0lURU1JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHN1YlF1ZXJ5TGlzdEl0ZW1JZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcG9wdWxhdGVQcm9wZXJ0eVRhYmxlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIFN0cmluZyBzdWJRdWVyeUxpc3RLZXkgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfS0VZKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlMaXN0SXRlbUlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0lURU1JRCk7Ci0gICAgCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksc3ViUXVlcnlLZXkpOwotICAgICAgCi0gICAgaWYgKHN1YlF1ZXJ5TGlzdEtleSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9LRVksc3ViUXVlcnlMaXN0S2V5KTsKLSAgICAgIAotICAgIGlmIChzdWJRdWVyeUxpc3RJdGVtSWQgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfSVRFTUlELHN1YlF1ZXJ5TGlzdEl0ZW1JZCk7Ci0gICAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlMaXN0S2V5ID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0tFWSk7Ci0gICAgaW50IHN1YlF1ZXJ5TGlzdEl0ZW1JZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0lURU1JRCkpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBOb2RlIGN1cnJlbnROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoY3VycmVudE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKSk7Ci0gICAgVmVjdG9yIGxpc3QgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0tFWSkpOwotICAgIGxpc3QucmVtb3ZlRWxlbWVudEF0KHN1YlF1ZXJ5TGlzdEl0ZW1JZCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvUmVzaXplVURESUZyYW1lc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZXNpemVVRERJRnJhbWVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDQxZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9SZXNpemVVRERJRnJhbWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBSZXNpemVVRERJRnJhbWVzQWN0aW9uIGV4dGVuZHMgUmVzaXplRnJhbWVzQWN0aW9uCi17Ci0gIHB1YmxpYyBSZXNpemVVRERJRnJhbWVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyAhPSBudWxsICYmIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIsYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgLy8gU2F2ZSB0aGUgY3VycmVudCBmcmFtZXNldCBzaXplcy4KLSAgICBTdHJpbmcgZnJhbWVOYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLkZSQU1FX05BTUUpOwotICAgIFN0cmluZyBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIG5ldyBmcmFtZXNldCBzaXplcy4KLSAgICBib29sZWFuIHNhdmVGcmFtZVNldHRpbmdzID0gZmFsc2U7Ci0gICAgaWYgKGZyYW1lTmFtZS5lcXVhbHMoVURESUZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHModWRkaVBlcnNwZWN0aXZlLmdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjEwMCUsMCUiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZnJhbWVOYW1lLmVxdWFscyhVRERJRnJhbWVOYW1lcy5QUk9QRVJUSUVTX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgaWYgKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3Muc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICAgewotICAgICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZXN0b3JlLgotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHModWRkaVBlcnNwZWN0aXZlLmdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkpOwotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKHVkZGlQZXJzcGVjdGl2ZS5nZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCIxMDAlLDAlIik7Ci0gICAgICAgIGlmICghcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZnJhbWVOYW1lLmVxdWFscyhVRERJRnJhbWVOYW1lcy5TVEFUVVNfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICBpZiAoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgewotICAgICAgICBpZiAocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZXN0b3JlLgotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHModWRkaVBlcnNwZWN0aXZlLmdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkpOwotICAgICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKHVkZGlQZXJzcGVjdGl2ZS5nZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgICAgdWRkaVBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gTWF4aW1pemUuCi0gICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCIwJSwxMDAlIik7Ci0gICAgICAgIGlmICghcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzLmVuZHNXaXRoKCIxMDAlIikpCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB1ZGRpUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCIwJSwxMDAlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlbGVjdENhdGVnb3J5Tm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmEzZDQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uIGV4dGVuZHMgU2VsZWN0Tm9kZUFjdGlvbgotewotICBwdWJsaWMgU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXRDYXRlZ29yeU1hbmFnZXIoKSk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uLmpzcD9zZXNzaW9uSWQ9Li4uJm5vZGVJZD0uLi4KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhTdHJpbmcgc2Vzc2lvbklkLGludCBub2RlSWQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9TZWxlY3RDYXRlZ29yeU5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgLy8gRG8gbm90IGFkZCB0aGlzIGFjdGlvbiB0byB0aGUgaGlzdG9yeS4KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBwZXJmb3JtQmFzZUFjdGlvbihub2RlSWQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gImNhdGVnb3J5QnJvd3NlcldpbmRvd0NvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICB7Ci0gICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlbGVjdEZpbmRUb29sQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlbGVjdEZpbmRUb29sQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZmQyNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RGaW5kVG9vbEFjdGlvbiBleHRlbmRzIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgc3ViUXVlcnlLZXlfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiB0b29sTGlua0NoYW5nZWRfOwotCi0gIHB1YmxpYyBTZWxlY3RGaW5kVG9vbEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBzdWJRdWVyeUtleV8gPSBudWxsOwotICAgIHRvb2xMaW5rQ2hhbmdlZF8gPSBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKHJlcXVlc3QpOwotICAgIHN1YlF1ZXJ5S2V5XyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8gL3VkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbi5qc3A/bm9kZUlkPS4uLiZ0b29sSWQ9Li4uPCZ2aWV3SWQ9Li4uJnZpZXdUb29sSWQ9Li4uPiZzdWJRdWVyeUtleT0uLi48JmlzSGlzdG9yeT0xPgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsaW50IHRvb2xJZCxpbnQgdmlld0lkLGludCB2aWV3VG9vbElkLFN0cmluZyBzdWJRdWVyeUtleSxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCkuYXBwZW5kKCc9JykuYXBwZW5kKHRvb2xJZCk7Ci0gICAgaWYgKHZpZXdJZCAhPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgewotICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCkuYXBwZW5kKCc9JykuYXBwZW5kKHZpZXdJZCk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCkuYXBwZW5kKCc9JykuYXBwZW5kKHZpZXdUb29sSWQpOwotICAgIH0KLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSkuYXBwZW5kKCc9JykuYXBwZW5kKHN1YlF1ZXJ5S2V5KTsKLQotICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSkuYXBwZW5kKCI9MSIpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgaWYgKCFzdXBlci5ydW4oKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlXy5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICAgU3RyaW5nIGN1cnJlbnRTdWJRdWVyeUtleSA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIGlmIChzdWJRdWVyeUtleV8gIT0gbnVsbCAmJiAhc3ViUXVlcnlLZXlfLmVxdWFscyhjdXJyZW50U3ViUXVlcnlLZXkpKQotICAgIHsKLSAgICAgIHRvb2xMaW5rQ2hhbmdlZF8gPSB0cnVlOwotICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksc3ViUXVlcnlLZXlfKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc1ZpZXdTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHRvb2xMaW5rQ2hhbmdlZF87Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgIGludCB0b29sSWQgPSBzZWxlY3RlZFRvb2xfLmdldFRvb2xJZCgpOwotICAgIGludCB2aWV3SWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgIGludCB2aWV3VG9vbElkID0gc2VsZWN0ZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCxzdWJRdWVyeUtleV8sdHJ1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzQ3MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVBY3Rpb24KLXsKLSAgcHVibGljIFNlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcixjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKSk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLjwmaXNIaXN0b3J5PTE+Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9TZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICBpZiAoZm9ySGlzdG9yeSkKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpLmFwcGVuZCgiPTEiKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgIGludCB0b29sSWQgPSBzZWxlY3RlZFRvb2wuZ2V0VG9vbElkKCk7Ci0gICAgaW50IHZpZXdJZCA9IHNlbGVjdGVkTm9kZV8uZ2V0Vmlld0lkKCk7Ci0gICAgaW50IHZpZXdUb29sSWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdUb29sSWQoKTsKLSAgICBpZiAoc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikKLSAgICAgIHJldHVybiBzZWxlY3RlZFRvb2wuZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYodHJ1ZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGdldEFjdGlvbkxpbmsobm9kZUlkLHRydWUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gIm5hdmlnYXRvckNvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuICJwcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4OTk1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGNsYXNzIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uIGV4dGVuZHMgU2VsZWN0Tm9kZVRvb2xBY3Rpb24KLXsKLSAgcHVibGljIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpKTsKLSAgfQotCi0gIC8vIC91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uanNwP25vZGVJZD0uLi4mdG9vbElkPS4uLjwmdmlld0lkPS4uLiZ2aWV3VG9vbElkPS4uLj48JmlzSGlzdG9yeT0xPgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsaW50IHRvb2xJZCxpbnQgdmlld0lkLGludCB2aWV3VG9vbElkLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuVE9PTElEKS5hcHBlbmQoJz0nKS5hcHBlbmQodG9vbElkKTsKLSAgICBpZiAodmlld0lkICE9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICB7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKS5hcHBlbmQoJz0nKS5hcHBlbmQodmlld0lkKTsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKS5hcHBlbmQoJz0nKS5hcHBlbmQodmlld1Rvb2xJZCk7Ci0gICAgfQotICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSkuYXBwZW5kKCI9MSIpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgIGludCB0b29sSWQgPSBzZWxlY3RlZFRvb2xfLmdldFRvb2xJZCgpOwotICAgIGludCB2aWV3SWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgIGludCB2aWV3VG9vbElkID0gc2VsZWN0ZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgcmV0dXJuIGdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCx0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJuYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiAicHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gInByb3BlcnRpZXNDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgewotICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDlmMmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24gZXh0ZW5kcyBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbgotewotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfOwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNWaWV3U2VsZWN0aW9uXzsKLSAgcHJpdmF0ZSBib29sZWFuIG5ld1VVSURRdWVyeUNyZWF0ZWRfOwotICBwcml2YXRlIFN0cmluZyBpdGVtTmFtZV87Ci0gIHB1YmxpYyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcmVxdWlyZXNUcmVlVmlld1JlZnJlc2hfID0gZmFsc2U7Ci0gICAgcmVxdWlyZXNWaWV3U2VsZWN0aW9uXyA9IGZhbHNlOwotICAgIG5ld1VVSURRdWVyeUNyZWF0ZWRfID0gZmFsc2U7Ci0gICAgaXRlbU5hbWVfID0gbnVsbDsKLSAgfQotCi0gIC8vIC91ZGRpL2FjdGlvbnMvU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmpzcD9ub2RlSWQ9Li4uJnRvb2xJZD0uLi48JnZpZXdJZD0uLi4+JnN1YlF1ZXJ5S2V5PS4uLiZzdWJRdWVyeUxpc3RLZXk9Li4uJnN1YlF1ZXJ5TGlzdEl0ZW1JZD0uLi4mcXVlcnlJdGVtPS4uLjwmaXNIaXN0b3J5PTE+Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxpbnQgdG9vbElkLGludCB2aWV3SWQsU3RyaW5nIHN1YlF1ZXJ5S2V5LFN0cmluZyBzdWJRdWVyeUxpc3RLZXksaW50IHN1YlF1ZXJ5TGlzdEl0ZW1JZCxpbnQgcXVlcnlJdGVtLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCkuYXBwZW5kKCc9JykuYXBwZW5kKHRvb2xJZCk7Ci0gICAgaWYgKHZpZXdJZCAhPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKS5hcHBlbmQoJz0nKS5hcHBlbmQodmlld0lkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSkuYXBwZW5kKCc9JykuYXBwZW5kKHN1YlF1ZXJ5S2V5KTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfS0VZKS5hcHBlbmQoJz0nKS5hcHBlbmQoc3ViUXVlcnlMaXN0S2V5KTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfSVRFTUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc3ViUXVlcnlMaXN0SXRlbUlkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0pLmFwcGVuZCgnPScpLmFwcGVuZChxdWVyeUl0ZW0pOwotCi0gICAgaWYgKGZvckhpc3RvcnkpCi0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKS5hcHBlbmQoIj0xIik7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucHJvY2Vzc0xpbmtQYXJhbWV0ZXJzKHJlcXVlc3QpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlMaXN0S2V5ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0tFWSk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5TGlzdEl0ZW1JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9JVEVNSUQpOwotICAgIFN0cmluZyBxdWVyeUl0ZW1TdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0pOwotCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksc3ViUXVlcnlLZXkpOwotCi0gICAgaWYgKHN1YlF1ZXJ5TGlzdEtleSAhPSBudWxsKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9LRVksc3ViUXVlcnlMaXN0S2V5KTsKLQotICAgIGlmIChzdWJRdWVyeUxpc3RJdGVtSWQgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0xJU1RfSVRFTUlELHN1YlF1ZXJ5TGlzdEl0ZW1JZCk7Ci0KLSAgICBpZiAocXVlcnlJdGVtU3RyaW5nICE9IG51bGwpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLHF1ZXJ5SXRlbVN0cmluZyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBmaW5kQnlVVUlEKCkKLSAgewotICAgIE5vZGUgY3VycmVudE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKGN1cnJlbnROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcygoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSkpOwotICAgIFZlY3RvciBsaXN0ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9LRVkpKTsKLSAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClsaXN0LmVsZW1lbnRBdChJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfTElTVF9JVEVNSUQpKSk7Ci0gICAgaW50IHF1ZXJ5SXRlbSA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNKSk7Ci0gICAgRmluZEFjdGlvbiBmaW5kQWN0aW9uID0gbnVsbDsKLSAgICBTdHJpbmcgdXVpZEtleSA9IG51bGw7Ci0gICAgU3RyaW5nIHV1aWRLZXlWYWx1ZSA9IG51bGw7Ci0gICAgc3dpdGNoIChxdWVyeUl0ZW0pCi0gICAgewotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgZmluZEFjdGlvbiA9IG5ldyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgICAgdXVpZEtleSA9IFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVk7Ci0gICAgICAgIEJ1c2luZXNzRW50aXR5IHNwID0gKEJ1c2luZXNzRW50aXR5KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICB1dWlkS2V5VmFsdWUgPSBzcC5nZXRCdXNpbmVzc0tleSgpOwotICAgICAgICBpdGVtTmFtZV8gPSBzcC5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTOgotICAgICAgICBmaW5kQWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIHV1aWRLZXkgPSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVk7Ci0gICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHV1aWRLZXlWYWx1ZSA9IGJzLmdldFNlcnZpY2VLZXkoKTsKLSAgICAgICAgaXRlbU5hbWVfID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBmaW5kQWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIHV1aWRLZXkgPSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZOwotICAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgdXVpZEtleVZhbHVlID0gdE1vZGVsLmdldFRNb2RlbEtleSgpOwotICAgICAgICBpdGVtTmFtZV8gPSB0TW9kZWwuZ2V0TmFtZVN0cmluZygpOwotICAgIH0KLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGZpbmRBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSx1dWlkS2V5VmFsdWUpOwotICAgIHByb3BlcnR5VGFibGUucHV0KHV1aWRLZXksdXVpZEtleVZhbHVlKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZpbmRBY3Rpb24ucnVuKCk7Ci0gICAgaWYgKHJlc3VsdCkKLSAgICB7Ci0gICAgICBOb2RlIGl0ZW1Ob2RlID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgaW50IG5vZGVJZCA9IGl0ZW1Ob2RlLmdldE5vZGVJZCgpOwotICAgICAgaW50IHRvb2xJZCA9IGl0ZW1Ob2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKTsKLSAgICAgIGludCB2aWV3SWQgPSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQ7Ci0gICAgICBpbnQgdmlld1Rvb2xJZCA9IEFjdGlvbklucHV0cy5WSUVXVE9PTElEX0RFRkFVTFQ7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxTdHJpbmcudmFsdWVPZihub2RlSWQpKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVE9PTElELFN0cmluZy52YWx1ZU9mKHRvb2xJZCkpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsU3RyaW5nLnZhbHVlT2Yodmlld0lkKSk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQsU3RyaW5nLnZhbHVlT2Yodmlld1Rvb2xJZCkpOwotICAgICAgc3VwZXIucnVuKCk7Ci0gICAgICByZXF1aXJlc1RyZWVWaWV3UmVmcmVzaF8gPSB0cnVlOwotICAgICAgcmVxdWlyZXNWaWV3U2VsZWN0aW9uXyA9IHRydWU7Ci0gICAgICBuZXdVVUlEUXVlcnlDcmVhdGVkXyA9IHRydWU7Ci0gICAgICBsaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8obm9kZUlkLHRvb2xJZCx2aWV3SWQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBUaGUgaXRlbSBpcyBubyBsb25nZXIgaW4gdGhlIHJlZ2lzdHJ5LgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0SXRlbU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGl0ZW1OYW1lXzsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIC8vIEdpdmVuIHRoZSBub2RlSWQsIHRvb2xJZCBhbmQgdmlld0lkLCBjaGVjayBpZiB0aGUgbm9kZSBvciB2aWV3IGlzIHN0YWxlLgotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpbnQgdG9vbElkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVE9PTElEKSk7Ci0gICAgaW50IHZpZXdJZCA9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICB2aWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgaW50IHZpZXdUb29sSWQgPSAwOwotICAgIGlmICghaXNTdGFsZU5vZGUobm9kZUlkKSkKLSAgICB7Ci0gICAgICAvLyBFbnVzcmUgdGhlIG5vZGUgaXMgdmlzaWJsZS4KLSAgICAgIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoXyA9IG1ha2VOb2RlVmlzaWJsZShub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWQpKTsKLQotICAgICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKTsKLSAgICAgIGlmICh2aWV3SWQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgewotICAgICAgICBWaWV3VG9vbCB2aWV3VG9vbCA9IChWaWV3VG9vbCkobm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFRvb2wodG9vbElkKSk7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIGVsZW1lbnRUb29sTWFuYWdlciA9IHZpZXdUb29sLmdldFRvb2xNYW5hZ2VyKHZpZXdJZCk7Ci0gICAgICAgIGlmIChlbGVtZW50VG9vbE1hbmFnZXIgIT0gbnVsbCkKLSAgICAgICAgICB2aWV3VG9vbElkID0gZWxlbWVudFRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbElkKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIFN0YWxlIHZpZXcKLSAgICAgICAgICByZXR1cm4gZmluZEJ5VVVJRCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQsU3RyaW5nLnZhbHVlT2Yodmlld1Rvb2xJZCkpOwotICAgICAgcmV0dXJuIHN1cGVyLnJ1bigpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3RhbGUgbm9kZQotICAgICAgcmV0dXJuIGZpbmRCeVVVSUQoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgIGludCB0b29sSWQgPSBzZWxlY3RlZFRvb2xfLmdldFRvb2xJZCgpOwotICAgIGludCB2aWV3SWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgIGludCB2aWV3VG9vbElkID0gc2VsZWN0ZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCx0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoKCkKLSAgewotICAgIHJldHVybiBzdXBlci5yZXF1aXJlc1RyZWVWaWV3UmVmcmVzaCgpfHJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzVmlld1NlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIucmVxdWlyZXNWaWV3U2VsZWN0aW9uKCl8cmVxdWlyZXNWaWV3U2VsZWN0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzU3RhdHVzVXBkYXRlKCkKLSAgewotICAgIHJldHVybiBuZXdVVUlEUXVlcnlDcmVhdGVkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gInN0YXR1c0NvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VydmljZUdldEJ1c2luZXNzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDk4N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uCi17Ci0gIHByaXZhdGUgU2VydmljZU5vZGUgc2VydmljZU5vZGVfOwotICBwdWJsaWMgU2VydmljZUdldEJ1c2luZXNzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkpOwotICAgIHNlcnZpY2VOb2RlXyA9IG51bGw7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvU2VydmljZUdldEJ1c2luZXNzQWN0aW9uSlNQLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlcnZpY2VHZXRCdXNpbmVzc0FjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHZhbGlkYXRlU2VydmljZSgpCi0gIHsKLSAgICBpbnQgc2VydmljZU5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIHNlcnZpY2VOb2RlXyA9IChTZXJ2aWNlTm9kZSlub2RlTWFuYWdlcl8uZ2V0Tm9kZShzZXJ2aWNlTm9kZUlkKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudClzZXJ2aWNlTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24gdmVyaWZ5QWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSB2ZXJpZnlBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUsQm9vbGVhbi5UUlVFKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVksc2VydmljZUVsZW1lbnQuZ2V0QnVzaW5lc3NTZXJ2aWNlKCkuZ2V0U2VydmljZUtleSgpKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IHZlcmlmeUFjdGlvbi5ydW4oKTsKLSAgICBpZiAocmVzdWx0KQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxwcm9wZXJ0eVRhYmxlLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKTsKLQotICAgIFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk5PREVfTkFNRV9TRVJWSUNFX0JVU0lORVNTIixzZXJ2aWNlTm9kZV8uZ2V0Tm9kZU5hbWUoKSkpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVksYnMuZ2V0QnVzaW5lc3NLZXkoKSk7Ci0KLSAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0U2VydmljZUludGVyZmFjZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjZWQ0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1NlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uIGV4dGVuZHMgVURESU5vZGVBY3Rpb24KLXsKLSAgcHJpdmF0ZSBTZXJ2aWNlTm9kZSBzZXJ2aWNlTm9kZV87Ci0gIHB1YmxpYyBTZXJ2aWNlR2V0U2VydmljZUludGVyZmFjZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgc2VydmljZU5vZGVfID0gbnVsbDsKLSAgfQotCi0gIC8vIHVkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0U2VydmljZUludGVyZmFjZXNBY3Rpb25KU1AuanNwP25vZGVJZD0uLi4KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlKCkKLSAgewotICAgIGludCBzZXJ2aWNlTm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgc2VydmljZU5vZGVfID0gKFNlcnZpY2VOb2RlKW5vZGVNYW5hZ2VyXy5nZXROb2RlKHNlcnZpY2VOb2RlSWQpOwotICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KXNlcnZpY2VOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbiB2ZXJpZnlBY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IHZlcmlmeUFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSxCb29sZWFuLlRSVUUpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSxzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKS5nZXRTZXJ2aWNlS2V5KCkpOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gdmVyaWZ5QWN0aW9uLnJ1bigpOwotICAgIGlmIChyZXN1bHQpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNULHByb3BlcnR5VGFibGUuZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNUKTsKLSAgICBSZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk5PREVfTkFNRV9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyIsc2VydmljZU5vZGVfLmdldE5vZGVOYW1lKCkpKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1VTRV9TRVJWSUNFLEJvb2xlYW4uVFJVRSk7Ci0gICAgTGlzdEVsZW1lbnQgc2VydmljZUxpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KGJzKTsKLSAgICBzZXJ2aWNlTGlzdEVsZW1lbnQuc2V0VGFyZ2V0Vmlld1Rvb2xJbmZvKHNlcnZpY2VOb2RlXy5nZXROb2RlSWQoKSxzZXJ2aWNlTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLHNlcnZpY2VOb2RlXy5nZXRWaWV3SWQoKSk7Ci0gICAgVmVjdG9yIHNlcnZpY2VMaXN0VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIHNlcnZpY2VMaXN0VmVjdG9yLmFkZEVsZW1lbnQoc2VydmljZUxpc3RFbGVtZW50KTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0Usc2VydmljZUxpc3RWZWN0b3IpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQlVTSU5FU1NfU0VSVklDRSxicyk7Ci0gICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNlR2V0QnVzaW5lc3Nlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNlR2V0QnVzaW5lc3Nlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTg3Mjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuKjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb24gZXh0ZW5kcyBVRERJTm9kZUFjdGlvbgotewotICBwcml2YXRlIFNlcnZpY2VJbnRlcmZhY2VOb2RlIHNpTm9kZV87Ci0gIHB1YmxpYyBTZXJ2aWNlSW50ZXJmYWNlR2V0QnVzaW5lc3Nlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBzaU5vZGVfID0gbnVsbDsKLSAgfQotCi0gIC8vIHVkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNHZXRCdXNpbmVzc2VzQWN0aW9uSlNQLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRCdXNpbmVzc2VzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlSW50ZXJmYWNlKCkKLSAgewotICAgIGludCBzaU5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIHNpTm9kZV8gPSAoU2VydmljZUludGVyZmFjZU5vZGUpbm9kZU1hbmFnZXJfLmdldE5vZGUoc2lOb2RlSWQpOwotICAgIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IHNpRWxlbWVudCA9IChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudClzaU5vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uIHZlcmlmeUFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gdmVyaWZ5QWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX09WRVJSSURFX0FERF9RVUVSWV9OT0RFLEJvb2xlYW4uVFJVRSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSxzaUVsZW1lbnQuZ2V0VE1vZGVsKCkuZ2V0VE1vZGVsS2V5KCkpOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gdmVyaWZ5QWN0aW9uLnJ1bigpOwotICAgIGlmIChyZXN1bHQpCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5MQVRFU1RfT0JKRUNULHByb3BlcnR5VGFibGUuZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgVE1vZGVsIHRNb2RlbCA9IChUTW9kZWwpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCk7Ci0KLSAgICBSZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJOT0RFX05BTUVfU0lfQlVTSU5FU1NFUyIsc2lOb2RlXy5nZXROb2RlTmFtZSgpKSk7Ci0gICAgCi0gICAgTGlzdEVsZW1lbnQgc2lMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudCh0TW9kZWwpOwotICAgIHNpTGlzdEVsZW1lbnQuc2V0VGFyZ2V0Vmlld1Rvb2xJbmZvKHNpTm9kZV8uZ2V0Tm9kZUlkKCksc2lOb2RlXy5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksc2lOb2RlXy5nZXRWaWV3SWQoKSk7Ci0gICAgVmVjdG9yIHNpTGlzdFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBzaUxpc3RWZWN0b3IuYWRkRWxlbWVudChzaUxpc3RFbGVtZW50KTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFUyxzaUxpc3RWZWN0b3IpOwotICAgIAotICAgIFZlY3RvciB0TW9kZWxLZXlTdHJpbmdWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgdE1vZGVsS2V5U3RyaW5nVmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsLmdldFRNb2RlbEtleSgpKTsKLSAgICBUTW9kZWxCYWcgdE1vZGVsQmFnID0gbmV3IFRNb2RlbEJhZyh0TW9kZWxLZXlTdHJpbmdWZWN0b3IpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfVE1PREVMQkFHLHRNb2RlbEJhZyk7Ci0gICAgCi0gICAgcmV0dXJuIGFjdGlvbi5ydW4oKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNlR2V0U2VydmljZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyY2JlZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNlR2V0U2VydmljZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuKjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uIGV4dGVuZHMgVURESU5vZGVBY3Rpb24KLXsKLSAgcHJpdmF0ZSBTZXJ2aWNlSW50ZXJmYWNlTm9kZSBzaU5vZGVfOwotICBwdWJsaWMgU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIHNpTm9kZV8gPSBudWxsOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY0dldFNlcnZpY2VzQWN0aW9uSlNQLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRTZXJ2aWNlc0FjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHZhbGlkYXRlU2VydmljZUludGVyZmFjZSgpCi0gIHsKLSAgICBpbnQgc2lOb2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBzaU5vZGVfID0gKFNlcnZpY2VJbnRlcmZhY2VOb2RlKW5vZGVNYW5hZ2VyXy5nZXROb2RlKHNpTm9kZUlkKTsKLSAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBzaUVsZW1lbnQgPSAoU2VydmljZUludGVyZmFjZUVsZW1lbnQpc2lOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbiB2ZXJpZnlBY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IHZlcmlmeUFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9PVkVSUklERV9BRERfUVVFUllfTk9ERSxCb29sZWFuLlRSVUUpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVksc2lFbGVtZW50LmdldFRNb2RlbCgpLmdldFRNb2RlbEtleSgpKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IHZlcmlmeUFjdGlvbi5ydW4oKTsKLSAgICBpZiAocmVzdWx0KQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxwcm9wZXJ0eVRhYmxlLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QpOwotCi0gICAgUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJOT0RFX05BTUVfU0lfU0VSVklDRVMiLHNpTm9kZV8uZ2V0Tm9kZU5hbWUoKSkpOwotICAgIAotICAgIExpc3RFbGVtZW50IHNpTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQodE1vZGVsKTsKLSAgICBzaUxpc3RFbGVtZW50LnNldFRhcmdldFZpZXdUb29sSW5mbyhzaU5vZGVfLmdldE5vZGVJZCgpLHNpTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLHNpTm9kZV8uZ2V0Vmlld0lkKCkpOwotICAgIFZlY3RvciBzaUxpc3RWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc2lMaXN0VmVjdG9yLmFkZEVsZW1lbnQoc2lMaXN0RWxlbWVudCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyxzaUxpc3RWZWN0b3IpOwotICAgIAotICAgIFZlY3RvciB0TW9kZWxLZXlTdHJpbmdWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgdE1vZGVsS2V5U3RyaW5nVmVjdG9yLmFkZEVsZW1lbnQodE1vZGVsLmdldFRNb2RlbEtleSgpKTsKLSAgICBUTW9kZWxCYWcgdE1vZGVsQmFnID0gbmV3IFRNb2RlbEJhZyh0TW9kZWxLZXlTdHJpbmdWZWN0b3IpOwotICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9UTU9ERUxCQUcsdE1vZGVsQmFnKTsKLSAgICAKLSAgICByZXR1cm4gYWN0aW9uLnJ1bigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1Nob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1Nob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NmJjOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9TaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS4qOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotcHVibGljIGNsYXNzIFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGV4dGVuZHMgQ29tbW9uUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbgotewotCi0gIHByb3RlY3RlZCBTdHJpbmcgc3ViUXVlcnlLZXlfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YlF1ZXJ5R2V0XzsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3ViUXVlcnlJbml0aWF0ZWRfOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld1N1YlF1ZXJ5XzsKLSAgcHJvdGVjdGVkIFN0cmluZyBuZXdTdWJRdWVyeUl0ZW1fOwotCi0gIHB1YmxpYyBTaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLQotICAgIHN1YlF1ZXJ5S2V5XyA9IG51bGw7Ci0gICAgaXNTdWJRdWVyeUdldF8gPSBmYWxzZTsKLSAgICBzdWJRdWVyeUluaXRpYXRlZF8gPSBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAocmVnaXN0cnlOb2RlXyA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gaWRzIGZyb20gdWRkaU9iamVjdHNfdGFibGUKLSAgICBTdHJpbmdbXSBzZWxlY3RlZEJ1c0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19TRUxFQ1RFRF9CVVNfSUQpOwotICAgIGlmIChzZWxlY3RlZEJ1c0lkcyAhPSBudWxsICYmIHNlbGVjdGVkQnVzSWRzLmxlbmd0aCA+IDApCi0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19TRUxFQ1RFRF9CVVNfSUQsIHNlbGVjdGVkQnVzSWRzKTsKLQotICAgIG5ld1N1YlF1ZXJ5XyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfSU5JVElBVEVEKTsKLSAgICBTdHJpbmcgaXNTdWJRdWVyeUdldFN0cmluZyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgIG5ld1N1YlF1ZXJ5SXRlbV8gPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0pOwotICAgIHN1YlF1ZXJ5S2V5XyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotCi0gICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEuCi0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5Xyk7Ci0gICAgZm9ybVRvb2xQSS5jbGVhckVycm9ycygpOwotCi0gICAgaWYgKG5ld1N1YlF1ZXJ5XyAhPSBudWxsICYmIG5ld1N1YlF1ZXJ5Xy5sZW5ndGgoKSA+IDApCi0gICAgICBzdWJRdWVyeUluaXRpYXRlZF8gPSB0cnVlOwotICAgIGVsc2UKLSAgICAgIHN1YlF1ZXJ5SW5pdGlhdGVkXyA9IGZhbHNlOwotCi0gICAgaWYgKGlzU3ViUXVlcnlHZXRTdHJpbmcgIT0gbnVsbCkKLSAgICAgIGlzU3ViUXVlcnlHZXRfID0gQm9vbGVhbi52YWx1ZU9mKGlzU3ViUXVlcnlHZXRTdHJpbmcpLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgLy8gaWYgbm90IHlldCBsb2dnZWQgaW4sIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzIG5lZWRlZCB0byBsb2cgaW4KLSAgICAvLyBOT1RFOiBUaGlzIGFjdGlvbiBkb2VzIE5PVCByZXF1aXJlIHRoZSB1c2VyIHRvIGJlIGxvZ2dlZCBpbi4KLSAgICBpZiAoIWlzTG9nZ2VkSW5fKSB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBTdHJpbmcgdXNlcklEID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotCi0gICAgICBpZiAocHVibGlzaFVSTCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHVzZXJJRCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklEKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklEKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgICAgZm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlF1ZXJ5SW5pdGlhdGVkKCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUluaXRpYXRlZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1N1YlF1ZXJ5R2V0KCkKLSAgewotICAgIHJldHVybiBpc1N1YlF1ZXJ5R2V0XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3ViUXVlcnlLZXkoKQotICB7Ci0gICAgcmV0dXJuIHN1YlF1ZXJ5S2V5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ld1N1YlF1ZXJ5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmV3U3ViUXVlcnlJdGVtKCkKLSAgewotICAgIHJldHVybiBuZXdTdWJRdWVyeUl0ZW1fOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIC8vIFN5bmNocm9uaXplIGNsaWVudCB2aWV3IGFuZCBzZXJ2ZXIgbW9kZWwgKHVkZGlPYmplY3RfdGFibGUuanNwKQotICAgIHN5bmNocm9uaXplVURESU9iamVjdFRhYmxlKCk7Ci0KLSAgICBpZiAocmVnaXN0cnlOb2RlXyA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ2lzdHJ5RWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLQotICAgIGlmICghKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEJ1c2luZXNzRWxlbWVudCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBpZiBub3QgeWV0IGxvZ2dlZCBpbiwgbG9nIGluIGZpcnN0Ci0gICAgaWYgKCFpc0xvZ2dlZEluXykgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgIFN0cmluZyB1c2VySUQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLQotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKFZhbGlkYXRvci52YWxpZGF0ZVVSTChwdWJsaXNoVVJMKSAmJgotICAgICAgICAgICAgVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHVzZXJJRCkgJiYKLSAgICAgICAgICAgIHBhc3N3b3JkICE9IG51bGwpIHsKLSAgICAgICAgICByZWdpc3RyeUVsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsIHVzZXJJRCwgcGFzc3dvcmQpOwotICAgICAgICAgIGlzTG9nZ2VkSW5fID0gcmVnaXN0cnlFbGVtZW50LmlzTG9nZ2VkSW4oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiB0ZSkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlRyYW5zcG9ydEV4Y2VwdGlvbiIpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh0ZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiB1ZGRpZSkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UobWUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSAgICAgIAotICAgIH0KLQotICAgIC8vIHNob3cgYWxsIGFzc2VydGlvbiBpZmYgaXMgbG9nZ2VkIGluIGFuZCBidXNpbmVzcyBpcyBvd25lZAotICAgIC8vIGVsc2Ugc2hvdyBvbmx5IGNvbXBsZXRlZCBvbmVzCi0gICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICBpZiAoaXNMb2dnZWRJbl8gJiYgaXNCdXNpbmVzc093bmVkKGJ1c0VsZW1lbnQpKQotICAgICAgcmV0dXJuIHNob3dQdWJsaXNoZXJBc3NlcnRpb25zRm9yT3duZWRCdXMoYnVzRWxlbWVudCk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHNob3dQdWJsaXNoZXJBc3NlcnRpb25zRm9yTm9uT3duZWRCdXMoYnVzRWxlbWVudCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gc2hvd1B1Ymxpc2hlckFzc2VydGlvbnNGb3JPd25lZEJ1cyhCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCkgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgLy8gdHJ5IHRvIGdldCBhIGxpc3Qgb2YgYWxsIHB1Ymxpc2hlciBhc3NlcnRpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVnaXN0cnkncyBhdXRoVG9rZW4KLSAgICBMaXN0TWFuYWdlciBsaXN0TWFuYWdlciA9IG5ldyBMaXN0TWFuYWdlcigpOwotICAgIEZvcm1Ub29sIGZvcm1Ub29sID0gZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5Xyk7Ci0gICAgZm9ybVRvb2xQSS5yZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0VYSVNUSU5HX1BVQkxJU0hFUl9BU1NFUlRJT05TKTsKLSAgICBWZWN0b3IgcXVlcnlJbnB1dFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnaXN0cnlFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHVzZXJJRCA9IHJlZ2lzdHJ5RWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgY3JlZCA9IHJlZ2lzdHJ5RWxlbWVudC5nZXRDcmVkKCk7Ci0KLSAgICAvLyBzaG93IGFsbCBwdWJsaXNoZXIgYXNzZXJ0aW9ucwotICAgIFVERElQcm94eSBwcm94eSA9ICgoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZV8uZ2V0VHJlZUVsZW1lbnQoKSkuZ2V0UHJveHkoKTsKLSAgICBBc3NlcnRpb25TdGF0dXNSZXBvcnQgYXNzZXJ0aW9uUmVwb3J0OwotICAgIHRyeSB7Ci0gICAgICBhc3NlcnRpb25SZXBvcnQgPSBwcm94eS5nZXRfYXNzZXJ0aW9uU3RhdHVzUmVwb3J0KHJlZ2lzdHJ5RWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCAoQ29tcGxldGlvblN0YXR1cyludWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIERpc3Bvc2l0aW9uUmVwb3J0IHJlcG9ydCA9IHVkZGllLmdldERpc3Bvc2l0aW9uUmVwb3J0KCk7Ci0JICBWZWN0b3IgcmVwb3J0RXJySW5mbyA9IHJlcG9ydC5nZXRSZXN1bHRWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3J0RXJySW5mby5zaXplKCk7IGkrKykgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoKFJlc3VsdCkgcmVwb3J0RXJySW5mby5nZXQoaSkpLmdldEVyckluZm8oKS5nZXRUZXh0KCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGNvbnRyb2xsZXJfLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIkV4Y2VwdGlvbiIpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBWZWN0b3IgYXNzZXJ0aW9uVmVjdG9yID0gYXNzZXJ0aW9uUmVwb3J0LmdldEFzc2VydGlvblN0YXR1c0l0ZW1WZWN0b3IoKTsKLSAgICBWZWN0b3Igb3RoZXJCdXNpbmVzc0tleXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgVmVjdG9yIHB1YkFzc2VydGlvbkVsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhc3NlcnRpb25WZWN0b3Iuc2l6ZSgpOyBpKyspIHsKLSAgICAgIEFzc2VydGlvblN0YXR1c0l0ZW0gYXNzZXJ0aW9uSXRlbSA9IChBc3NlcnRpb25TdGF0dXNJdGVtKWFzc2VydGlvblZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAvLyBkZXRlcm1pbmUgdGhlIGZyb20vdG8gYnVzaW5lc3Mga2V5cwotICAgICAgU3RyaW5nIGZyb21LZXkgPSBhc3NlcnRpb25JdGVtLmdldEZyb21LZXkoKS5nZXRUZXh0KCk7Ci0gICAgICBTdHJpbmcgdG9LZXkgPSBhc3NlcnRpb25JdGVtLmdldFRvS2V5KCkuZ2V0VGV4dCgpOwotICAgICAgU3RyaW5nIG93bmluZ0J1c2luZXNzS2V5ID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpLmdldEJ1c2luZXNzS2V5KCk7Ci0gICAgICAvLyBpZ25vcmUgdGhpcyBhc3NlcnRpb24gaWYgbmVpdGhlciB0aGUgZnJvbSBrZXkgbm9yIHRoZSB0byBrZXkgZXF1YWxzIHRvIHRoaXMgYnVzaW5lc3MncyBrZXkKLSAgICAgIGlmICghb3duaW5nQnVzaW5lc3NLZXkuZXF1YWxzKGZyb21LZXkpICYmICFvd25pbmdCdXNpbmVzc0tleS5lcXVhbHModG9LZXkpKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIFN0cmluZyBvdGhlckJ1c2luZXNzS2V5ID0gKChvd25pbmdCdXNpbmVzc0tleS5lcXVhbHMoZnJvbUtleSkpID8gdG9LZXkgOiBmcm9tS2V5KTsKLSAgICAgIC8vIHJldHJpZXZlIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgIm90aGVyIGJ1c2luZXNzIgotICAgICAgb3RoZXJCdXNpbmVzc0tleXMuYWRkKG90aGVyQnVzaW5lc3NLZXkpOwotCi0gICAgICAvLyByZXRyaWV2ZSB0aGUgc3RhdHVzIG9mIHRoZSBwdWJsaXNoZXIgYXNzZXJ0aW9uCi0gICAgICBTdHJpbmcgc3RhdHVzID0gYXNzZXJ0aW9uSXRlbS5nZXRDb21wbGV0aW9uU3RhdHVzKCkuZ2V0VGV4dCgpOwotICAgICAgS2V5ZWRSZWZlcmVuY2Uga2V5ZWRSZWYgPSBhc3NlcnRpb25JdGVtLmdldEtleWVkUmVmZXJlbmNlKCk7Ci0gICAgICBQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50IHB1YkFzc2VydGlvbkVsZW1lbnQgPSBuZXcgUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmluZ0J1c2luZXNzS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZWRSZWYpOwotICAgICAgcHViQXNzZXJ0aW9uRWxlbWVudHMuYWRkKHB1YkFzc2VydGlvbkVsZW1lbnQpOwotICAgIH0KLSAgICBpZiAob3RoZXJCdXNpbmVzc0tleXMuc2l6ZSgpID4gMCkgewotICAgICAgVmVjdG9yIGJ1c0VudGl0aWVzOwotICAgICAgdHJ5IHsKLSAgICAgICAgYnVzRW50aXRpZXMgPSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwob3RoZXJCdXNpbmVzc0tleXMpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIGJ1c0VudGl0aWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBpZiAob3RoZXJCdXNpbmVzc0tleXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgb3RoZXJCdXNpbmVzc0tleXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIGJ1c0VudGl0aWVzLmFkZChwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwoKFN0cmluZylvdGhlckJ1c2luZXNzS2V5cy5nZXQoaikpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCkuZ2V0KDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnRzLnJlbW92ZShqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnRzLnJlbW92ZSgwKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYnVzRW50aXRpZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpYnVzRW50aXRpZXMuZ2V0KGopOwotICAgICAgICBQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50IHB1YkFzc2VydGlvbkVsZW1lbnQgPSAoUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudClwdWJBc3NlcnRpb25FbGVtZW50cy5nZXQoaik7Ci0gICAgICAgIExpc3RFbGVtZW50IGxlID0gbmV3IExpc3RFbGVtZW50KGJlKTsKLSAgICAgICAgcXVlcnlJbnB1dFZlY3Rvci5hZGQobGUpOwotICAgICAgICBpbnQgc3ViUXVlcnlJdGVtSWQgPSBxdWVyeUlucHV0VmVjdG9yLmluZGV4T2YobGUpOwotICAgICAgICBwdWJBc3NlcnRpb25FbGVtZW50LnNldFNlcnZpY2VQcm92aWRlcihsZSk7Ci0gICAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnQuc2V0U3ViUXVlcnlJdGVtSWQoc3ViUXVlcnlJdGVtSWQpOwotICAgICAgICBsaXN0TWFuYWdlci5hZGQobmV3IExpc3RFbGVtZW50KHB1YkFzc2VydGlvbkVsZW1lbnQpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnVzRWxlbWVudC5zZXRQdWJsaXNoZXJBc3NlcnRpb25zKGxpc3RNYW5hZ2VyKTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfRVhJU1RJTkdfUFVCTElTSEVSX0FTU0VSVElPTlMsIHF1ZXJ5SW5wdXRWZWN0b3IpOwotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19QVUJMSVNIRVJfQVNTRVJUSU9OU19SRUZSRVNIRUQiKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gc2hvd1B1Ymxpc2hlckFzc2VydGlvbnNGb3JOb25Pd25lZEJ1cyhCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCkgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotCi0gICAgLy8gdHJ5IHRvIGdldCBhIGxpc3Qgb2YgcHVibGlzaGVyIGFzc2VydGlvbnMgYmFzZWQgb24gdGhlIGJ1c2luZXNzIGtleQotICAgIExpc3RNYW5hZ2VyIGxpc3RNYW5hZ2VyID0gbmV3IExpc3RNYW5hZ2VyKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0gICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlfKTsKLSAgICBmb3JtVG9vbFBJLnJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfRVhJU1RJTkdfUFVCTElTSEVSX0FTU0VSVElPTlMpOwotICAgIFZlY3RvciBxdWVyeUlucHV0VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIFVERElQcm94eSBwcm94eSA9ICgoUmVnaXN0cnlFbGVtZW50KXJlZ2lzdHJ5Tm9kZV8uZ2V0VHJlZUVsZW1lbnQoKSkuZ2V0UHJveHkoKTsKLSAgICBSZWxhdGVkQnVzaW5lc3Nlc0xpc3QgcmVsYXRlZEJ1c0xpc3Q7Ci0gICAgdHJ5IHsKLSAgICAgIHJlbGF0ZWRCdXNMaXN0ID0gcHJveHkuZmluZF9yZWxhdGVkQnVzaW5lc3NlcyhidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChLZXllZFJlZmVyZW5jZSludWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZpbmRRdWFsaWZpZXJzKW51bGwpOwotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiB1ZGRpZSkgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiVURESUV4Y2VwdGlvbiIpOwotICAgICAgRGlzcG9zaXRpb25SZXBvcnQgcmVwb3J0ID0gdWRkaWUuZ2V0RGlzcG9zaXRpb25SZXBvcnQoKTsKLQkgIFZlY3RvciByZXBvcnRFcnJJbmZvID0gcmVwb3J0LmdldFJlc3VsdFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvcnRFcnJJbmZvLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCgoUmVzdWx0KSByZXBvcnRFcnJJbmZvLmdldChpKSkuZ2V0RXJySW5mbygpLmdldFRleHQoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1VORVhQRUNURUQiKSk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgiRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFZlY3RvciByZWxhdGVkQnVzVmVjdG9yID0gcmVsYXRlZEJ1c0xpc3QuZ2V0UmVsYXRlZEJ1c2luZXNzSW5mb3MoKS5nZXRSZWxhdGVkQnVzaW5lc3NJbmZvVmVjdG9yKCk7Ci0gICAgVmVjdG9yIG90aGVyQnVzaW5lc3NLZXlzID0gbmV3IFZlY3RvcigpOwotICAgIFZlY3RvciBwdWJBc3NlcnRpb25FbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpICA9IDA7IGkgPCByZWxhdGVkQnVzVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICBSZWxhdGVkQnVzaW5lc3NJbmZvIHJlbGF0ZWRCdXNJbmZvID0gKFJlbGF0ZWRCdXNpbmVzc0luZm8pcmVsYXRlZEJ1c1ZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAvLyBkZXRlcm1pbmUgdGhlIGZyb20vdG8gYnVzaW5lc3Mga2V5cwotICAgICAgU3RyaW5nIGZyb21LZXk7Ci0gICAgICBTdHJpbmcgdG9LZXk7Ci0gICAgICBTdHJpbmcgb3duaW5nQnVzaW5lc3NLZXk7Ci0gICAgICBMaXN0RWxlbWVudCBzcDsKLSAgICAgIGlmIChyZWxhdGVkQnVzSW5mby5nZXREZWZhdWx0U2hhcmVkUmVsYXRpb25zaGlwcygpLmdldERpcmVjdGlvbigpLmVxdWFscyhTaGFyZWRSZWxhdGlvbnNoaXBzLkRJUkVDVElPTl9GUk9NS0VZKSkgewotICAgICAgICBmcm9tS2V5ID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpLmdldEJ1c2luZXNzS2V5KCk7Ci0gICAgICAgIHRvS2V5ID0gcmVsYXRlZEJ1c0luZm8uZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICAgICAgb3duaW5nQnVzaW5lc3NLZXkgPSBmcm9tS2V5OwotICAgICAgICBvdGhlckJ1c2luZXNzS2V5cy5hZGQodG9LZXkpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGZyb21LZXkgPSByZWxhdGVkQnVzSW5mby5nZXRCdXNpbmVzc0tleSgpOwotICAgICAgICB0b0tleSA9IGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKS5nZXRCdXNpbmVzc0tleSgpOwotICAgICAgICBvd25pbmdCdXNpbmVzc0tleSA9IHRvS2V5OwotICAgICAgICBvdGhlckJ1c2luZXNzS2V5cy5hZGQoZnJvbUtleSk7Ci0gICAgICB9Ci0KLSAgICAgIFZlY3RvciBrZXllZFJlZlZlY3RvciA9IHJlbGF0ZWRCdXNJbmZvLmdldERlZmF1bHRTaGFyZWRSZWxhdGlvbnNoaXBzKCkuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnRbXSBwdWJBc3NlcnRpb25FbGVtZW50QXJyYXkgPSBuZXcgUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudFtrZXllZFJlZlZlY3Rvci5zaXplKCldOwotICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBrZXllZFJlZlZlY3Rvci5zaXplKCk7IGsrKykgewotICAgICAgICAvLyByZXRyaWV2ZSB0aGUgc3RhdHVzIG9mIHRoZSBwdWJsaXNoZXIgYXNzZXJ0aW9uCi0gICAgICAgIFN0cmluZyBzdGF0dXMgPSBDb21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFOwotICAgICAgICBLZXllZFJlZmVyZW5jZSBrZXllZFJlZiA9IChLZXllZFJlZmVyZW5jZSlrZXllZFJlZlZlY3Rvci5lbGVtZW50QXQoayk7Ci0gICAgICAgIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQgcHViQXNzZXJ0aW9uRWxlbWVudCA9IG5ldyBQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duaW5nQnVzaW5lc3NLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWVkUmVmKTsKLSAgICAgICAgcHViQXNzZXJ0aW9uRWxlbWVudEFycmF5W2tdID0gcHViQXNzZXJ0aW9uRWxlbWVudDsKLSAgICAgIH0KLSAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnRzLmFkZChwdWJBc3NlcnRpb25FbGVtZW50QXJyYXkpOwotICAgIH0KLSAgICBpZiAob3RoZXJCdXNpbmVzc0tleXMuc2l6ZSgpID4gMCkgewotICAgICAgVmVjdG9yIGJ1c0VudGl0aWVzOwotICAgICAgdHJ5IHsKLSAgICAgICAgYnVzRW50aXRpZXMgPSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwob3RoZXJCdXNpbmVzc0tleXMpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgIGJ1c0VudGl0aWVzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBpZiAob3RoZXJCdXNpbmVzc0tleXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgb3RoZXJCdXNpbmVzc0tleXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIGJ1c0VudGl0aWVzLmFkZChwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwoKFN0cmluZylvdGhlckJ1c2luZXNzS2V5cy5nZXQoaikpLmdldEJ1c2luZXNzRW50aXR5VmVjdG9yKCkuZ2V0KDApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnRzLnJlbW92ZShqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHB1YkFzc2VydGlvbkVsZW1lbnRzLnJlbW92ZSgwKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGogID0gMDsgaiA8IGJ1c0VudGl0aWVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KWJ1c0VudGl0aWVzLmdldChqKTsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSBuZXcgTGlzdEVsZW1lbnQoYmUpOwotICAgICAgICBxdWVyeUlucHV0VmVjdG9yLmFkZChsZSk7Ci0gICAgICAgIGludCBzdWJRdWVyeUl0ZW1JZCA9IHF1ZXJ5SW5wdXRWZWN0b3IuaW5kZXhPZihsZSk7Ci0gICAgICAgIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnRbXSBwdWJBc3NlcnRpb25FbGVtZW50QXJyYXkgPSAoUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudFtdKXB1YkFzc2VydGlvbkVsZW1lbnRzLmdldChqKTsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwdWJBc3NlcnRpb25FbGVtZW50QXJyYXkubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICBwdWJBc3NlcnRpb25FbGVtZW50QXJyYXlba10uc2V0U2VydmljZVByb3ZpZGVyKGxlKTsKLSAgICAgICAgICBwdWJBc3NlcnRpb25FbGVtZW50QXJyYXlba10uc2V0U3ViUXVlcnlJdGVtSWQoc3ViUXVlcnlJdGVtSWQpOwotICAgICAgICAgIGxpc3RNYW5hZ2VyLmFkZChuZXcgTGlzdEVsZW1lbnQocHViQXNzZXJ0aW9uRWxlbWVudEFycmF5W2tdKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYnVzRWxlbWVudC5zZXRQdWJsaXNoZXJBc3NlcnRpb25zKGxpc3RNYW5hZ2VyKTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfRVhJU1RJTkdfUFVCTElTSEVSX0FTU0VSVElPTlMsIHF1ZXJ5SW5wdXRWZWN0b3IpOwotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19QVUJMSVNIRVJfQVNTRVJUSU9OU19SRUZSRVNIRUQiKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tVURESUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21VRERJQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMTQyYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21VRERJQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb24gZXh0ZW5kcyBTaG93UGVyc3BlY3RpdmVBY3Rpb24KLXsKLSAgcHVibGljIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyAhPSBudWxsICYmIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIsYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgCi0gICAgLy8gU2F2ZSB0aGUgZnJhbWVzZXQgc2l6ZXMgaWZmIG5vIGZyYW1lIGlzIG1heGltaXplZC4KLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuc3RhcnRzV2l0aCgiMTAwJSIpICYmICFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIAotICAgIGlmICghYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5zdGFydHNXaXRoKCIxMDAlIikgJiYgIWFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgCi0gICAgcmV0dXJuIHN1cGVyLnJ1bigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb3JtQWN0aW9uTGluayhpbnQgdGFyZ2V0UGVyc3BlY3RpdmVJZCxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgZm9ybUxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tVURESUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgZm9ybUxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSkuYXBwZW5kKCc9JykuYXBwZW5kKHRhcmdldFBlcnNwZWN0aXZlSWQpOwotICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgZm9ybUxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpLmFwcGVuZCgiPTEiKTsKLSAgICByZXR1cm4gZm9ybUxpbmsudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Ub2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMjcyZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Ub2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGNsYXNzIFRvZ2dsZUNhdGVnb3J5Tm9kZUFjdGlvbiBleHRlbmRzIFRvZ2dsZU5vZGVBY3Rpb24KLXsKLSAgcHVibGljIFRvZ2dsZUNhdGVnb3J5Tm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0Q2F0ZWdvcnlNYW5hZ2VyKCkpOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1RvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24uanNwP3NJZD0uLi4mbm9kZUlkPS4uLiZvcGVuPS4uLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKFN0cmluZyBzZXNzaW9uSWQsaW50IG5vZGVJZCxib29sZWFuIG9wZW4pCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9Ub2dnbGVDYXRlZ29yeU5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5PUEVOKS5hcHBlbmQoJz0nKS5hcHBlbmQob3Blbj9BY3Rpb25JbnB1dHMuT1BFTl9OT0RFOkFjdGlvbklucHV0cy5DTE9TRV9OT0RFKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBwZXJmb3JtQmFzZUFjdGlvbihub2RlSWQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJjYXRlZ29yeUJyb3dzZXJXaW5kb3dDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICByZXR1cm4gT3BlbkNhdGVnb3J5QnJvd3NlckFjdGlvbi5nZXRDYXRlZ29yeUNvbnRlbnRQYWdlKGNvbnRyb2xsZXJfLmdldFNlc3Npb25JZCgpLHVkZGlQZXJzcGVjdGl2ZS5nZXRDYXRlZ29yeVRNb2RlbEtleSgpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIHJldHVybiBPcGVuQ2F0ZWdvcnlCcm93c2VyQWN0aW9uLmdldEFjdGlvbkxpbmsoY29udHJvbGxlcl8uZ2V0U2Vzc2lvbklkKCksdWRkaVBlcnNwZWN0aXZlLmdldENhdGVnb3J5VE1vZGVsS2V5KCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgewotICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9Ub2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1RvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmY2NhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1RvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBUb2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uIGV4dGVuZHMgVG9nZ2xlTm9kZUFjdGlvbgotewotICBwdWJsaWMgVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpKTsKLSAgfQotCi0gIC8vIHVkZGkvYWN0aW9ucy9Ub2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uLmpzcD9ub2RlSWQ9Li4uJm9wZW49Li4uCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxib29sZWFuIG9wZW4pCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9Ub2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuT1BFTikuYXBwZW5kKCc9JykuYXBwZW5kKG9wZW4/QWN0aW9uSW5wdXRzLk9QRU5fTk9ERTpBY3Rpb25JbnB1dHMuQ0xPU0VfTk9ERSk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHRvIHNlbGVjdCB0aGUgdG9nZ2xlZCBub2RlIHdoZW4sIGF0IHRoZSB0aW1lIG9mCi0gIC8vIHRoZSBjb2xsYXBzZSBldmVudCwgYSBkZXNjZW5kYW50IG5vZGUgd2FzIHNlbGVjdGVkLgotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgewotICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gdG9nZ2xlZE5vZGVfLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgVG9vbCBzZWxlY3RlZFRvb2wgPSB0b29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICBpbnQgbm9kZUlkID0gdG9nZ2xlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgIGludCB0b29sSWQgPSBzZWxlY3RlZFRvb2wuZ2V0VG9vbElkKCk7Ci0gICAgaW50IHZpZXdJZCA9IHRvZ2dsZWROb2RlXy5nZXRWaWV3SWQoKTsKLSAgICBpbnQgdmlld1Rvb2xJZCA9IHRvZ2dsZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgaWYgKHNlbGVjdGVkVG9vbC5nZXRUb29sVHlwZSgpICE9IFRvb2xUeXBlcy5BQ1RJT04pCi0gICAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLHRydWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBTZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLHRydWUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gIm5hdmlnYXRvckNvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuICJwcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiMzEzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1RyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJpdmF0ZSBOb2RlIHRhcmdldE5vZGVfOwotICBwdWJsaWMgVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgdGFyZ2V0Tm9kZV8gPSBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHNlbGVjdGVkTm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgLy8gVGhlIGNsaWVudCBKYXZhc2NyaXB0IGVuZm9yY2VzIHRoZSBydWxlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gd2FzIHNlbGVjdGVkIGJlZm9yZSB0aGUgZm9ybSBjYW4gYmUgc3VibWl0dGVkLgotICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlNFTEVDVEVEX05PREVJRFMsc2VsZWN0ZWROb2RlSWRzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JSZXR1cm4oKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ1ZGRpL2FjdGlvbnMvVHJhbnNmZXJTdWJRdWVyeVJlc3VsdHNBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKFVERElBY3Rpb25JbnB1dHMuU0hPV19SRVNVTFRTX1RBUkdFVCkuYXBwZW5kKCI9MSIpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBlbmFibGVTaG93UmVzdWx0c1RhcmdldCgpCi0gIHsKLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIHRhcmdldCBsaW5rIG9uIHRoZSBxdWVyeSByZXN1bHRzIHBhZ2UuIEluc2VydCBhIHplcm8gZWxlbWVudAotICAgIC8vIGFycmF5IHNvIHRoYXQgbm8gcmVzdWx0cyBhcmUgdHJhbnNmZXJyZWQgYnV0IHRoZSBqdW1wIGJhY2sgdG8gdGhlIGNvcnJlY3QgcXVlcnkgYW5kIGl0cyBpbmZvIG9jY3Vycy4KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5TRUxFQ1RFRF9OT0RFSURTLG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIC8vIFRyYW5zZmVyIHRoZSByZXN1bHRzIGluIHRoaXMgUXVlcnkgbm9kZSBpbnRvIHRoZSBwcm9wZXJ0eSBleHBlY3RlZCBieSB0aGUgb3JpZ2luYXRpbmcgbm9kZS4KLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLQotICAgIFN0cmluZ1tdIHNlbGVjdGVkTm9kZUlkcyA9IChTdHJpbmdbXSlwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5TRUxFQ1RFRF9OT0RFSURTKTsKLSAgICBOb2RlIGN1cnJlbnROb2RlID0gZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgY3VycmVudEVsZW1lbnQgPSBjdXJyZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgdGFyZ2V0ID0gKFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQpKGN1cnJlbnRFbGVtZW50LmdldFByb3BlcnR5QXNPYmplY3QoVURESU1vZGVsQ29uc3RhbnRzLlNVQlFVRVJZX1RSQU5TRkVSX1RBUkdFVCkpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IHRhcmdldC5nZXRTdWJRdWVyeUtleSgpOwotICAgIFN0cmluZyB0YXJnZXRRdWVyeUtleTsKLQotICAgIGludCBsYXN0U2VwYXJhdG9yUG9zID0gc3ViUXVlcnlLZXkubGFzdEluZGV4T2YoJzonKTsKLSAgICBpZiAobGFzdFNlcGFyYXRvclBvcyA9PSAtMSkKLSAgICAgIHRhcmdldFF1ZXJ5S2V5ID0gIiI7Ci0gICAgZWxzZQotICAgICAgdGFyZ2V0UXVlcnlLZXkgPSBzdWJRdWVyeUtleS5zdWJzdHJpbmcoMCxsYXN0U2VwYXJhdG9yUG9zKTsKLQotICAgIFN0cmluZyB0YXJnZXRQcm9wZXJ0eSA9IHN1YlF1ZXJ5S2V5LnN1YnN0cmluZyhsYXN0U2VwYXJhdG9yUG9zKzEsc3ViUXVlcnlLZXkubGVuZ3RoKCkpOwotICAgIEZvcm1Ub29sIHRhcmdldEZvcm1Ub29sID0gdGFyZ2V0LmdldFRhcmdldEZvcm1Ub29sKCk7Ci0gICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHN1YlF1ZXJ5Rm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpdGFyZ2V0Rm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleSk7Ci0gICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHRhcmdldFF1ZXJ5Rm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpdGFyZ2V0Rm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyh0YXJnZXRRdWVyeUtleSk7Ci0gICAgVmVjdG9yIHRhcmdldExpc3QgPSAoVmVjdG9yKXRhcmdldFF1ZXJ5Rm9ybVRvb2xQSS5nZXRQcm9wZXJ0eSh0YXJnZXRQcm9wZXJ0eSk7Ci0gICAgaWYgKHRhcmdldExpc3QgPT0gbnVsbCkKLSAgICAgIHRhcmdldExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGN1cnJlbnROb2RlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8c2VsZWN0ZWROb2RlSWRzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaW50IHNlbGVjdGVkTm9kZUlkID0gSW50ZWdlci5wYXJzZUludChzZWxlY3RlZE5vZGVJZHNbaV0pOwotICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKHNlbGVjdGVkTm9kZUlkKTsKLSAgICAgIFRyZWVFbGVtZW50IHRyZWVFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBPYmplY3Qgb2JqZWN0OwotICAgICAgaWYgKHRyZWVFbGVtZW50IGluc3RhbmNlb2YgQnVzaW5lc3NFbGVtZW50KQotICAgICAgICBvYmplY3QgPSAoKEJ1c2luZXNzRWxlbWVudCl0cmVlRWxlbWVudCkuZ2V0QnVzaW5lc3NFbnRpdHkoKTsKLSAgICAgIGVsc2UgaWYgKHRyZWVFbGVtZW50IGluc3RhbmNlb2YgU2VydmljZUVsZW1lbnQpCi0gICAgICAgIG9iamVjdCA9ICgoU2VydmljZUVsZW1lbnQpdHJlZUVsZW1lbnQpLmdldEJ1c2luZXNzU2VydmljZSgpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTZXJ2aWNlIGludGVyZmFjZQotICAgICAgICBvYmplY3QgPSAoKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KXRyZWVFbGVtZW50KS5nZXRUTW9kZWwoKTsKLSAgICAgIH0KLSAgICAgIExpc3RFbGVtZW50IHRhcmdldExpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KG9iamVjdCk7Ci0gICAgICB0YXJnZXRMaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8oc2VsZWN0ZWROb2RlSWQsc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSxzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCkpOwotICAgICAgaWYgKHRhcmdldFByb3BlcnR5LmVxdWFscyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTKSB8fCB0YXJnZXRQcm9wZXJ0eS5lcXVhbHMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTKSB8fCB0YXJnZXRQcm9wZXJ0eS5lcXVhbHMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFKSkKLSAgICAgIHsKLSAgICAgICAgLy8gQ2xlYXIgdGhlIG1hbmFnZXIgc28gYSByZXBsYWNlbWVudCBvY2N1cnMuCi0gICAgICAgIHRhcmdldExpc3QucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIHRhcmdldExpc3QuYWRkRWxlbWVudCh0YXJnZXRMaXN0RWxlbWVudCk7Ci0gICAgfQotICAgIHRhcmdldFF1ZXJ5Rm9ybVRvb2xQSS5zZXRQcm9wZXJ0eSh0YXJnZXRQcm9wZXJ0eSx0YXJnZXRMaXN0KTsKLSAgICBIYXNodGFibGUgc2F2ZWRQYXJlbnRRdWVyeVByb3BlcnRpZXMgPSB0YXJnZXQuZ2V0UGFyZW50UXVlcnlEYXRhKCk7Ci0gICAgRW51bWVyYXRpb24gZSA9IHNhdmVkUGFyZW50UXVlcnlQcm9wZXJ0aWVzLmtleXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcga2V5ID0gKFN0cmluZyllLm5leHRFbGVtZW50KCk7Ci0gICAgICB0YXJnZXRRdWVyeUZvcm1Ub29sUEkuc2V0UHJvcGVydHkoa2V5LHNhdmVkUGFyZW50UXVlcnlQcm9wZXJ0aWVzLmdldChrZXkpKTsKLSAgICB9Ci0KLSAgICAvLyBTZWxlY3QgdGhlIG5vZGUgYW5kIHRoZSBkYXRhc3RydWN0dXJlIHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIHN1YnF1ZXJ5LgotICAgIGludCB0YXJnZXROb2RlSWQgPSB0YXJnZXQuZ2V0Tm9kZUlkKCk7Ci0gICAgaW50IHRhcmdldFRvb2xJZCA9IHRhcmdldC5nZXRUb29sSWQoKTsKLSAgICBpbnQgdGFyZ2V0Vmlld0lkID0gdGFyZ2V0LmdldFZpZXdJZCgpOwotICAgIGludCB0YXJnZXRWaWV3VG9vbElkID0gdGFyZ2V0LmdldFZpZXdUb29sSWQoKTsKLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZCh0YXJnZXROb2RlSWQpOwotICAgIHRhcmdldE5vZGVfID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgdGFyZ2V0Tm9kZV8uZ2V0VG9vbE1hbmFnZXIoKS5zZXRTZWxlY3RlZFRvb2xJZCh0YXJnZXRUb29sSWQpOwotICAgIHRhcmdldE5vZGVfLnNldFZpZXdJZCh0YXJnZXRWaWV3SWQpOwotICAgIGlmICh0YXJnZXRWaWV3SWQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgdGFyZ2V0Tm9kZV8uZ2V0Vmlld1Rvb2xNYW5hZ2VyKCkuc2V0U2VsZWN0ZWRUb29sSWQodGFyZ2V0Vmlld1Rvb2xJZCk7Ci0gICAgdGFyZ2V0Rm9ybVRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksdGFyZ2V0UXVlcnlLZXkpOwotICAgIGFkZFRvSGlzdG9yeShBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESSxTZWxlY3RGaW5kVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHRhcmdldE5vZGVJZCx0YXJnZXRUb29sSWQsdGFyZ2V0Vmlld0lkLHRhcmdldFZpZXdUb29sSWQsdGFyZ2V0UXVlcnlLZXksdHJ1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE5vZGUgZ2V0VGFyZ2V0Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0Tm9kZV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVHJhbnNmZXJUb0FkZENhdGVnb3J5RGF0YUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9UcmFuc2ZlclRvQWRkQ2F0ZWdvcnlEYXRhQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NmIwYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9UcmFuc2ZlclRvQWRkQ2F0ZWdvcnlEYXRhQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2ZlclRvQWRkQ2F0ZWdvcnlEYXRhQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHB1YmxpYyBUcmFuc2ZlclRvQWRkQ2F0ZWdvcnlEYXRhQWN0aW9uKCkKLSAgewotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1RyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb25KU1AuanNwP3Nlc3Npb25JZD0uLi4mY2F0ZWdvcnlUTW9kZWxLZXk9Li4uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHNlc3Npb25JZCxTdHJpbmcgY2F0ZWdvcnlUTW9kZWxLZXkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9UcmFuc2ZlclRvQWRkQ2F0ZWdvcnlEYXRhQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKS5hcHBlbmQoJyYnKS5hcHBlbmQoVURESUFjdGlvbklucHV0cy5DQVRFR09SWV9UTU9ERUxfS0VZKS5hcHBlbmQoJz0nKS5hcHBlbmQoY2F0ZWdvcnlUTW9kZWxLZXkpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHBvcHVsYXRlUHJvcGVydHlUYWJsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlNjQ3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGNsYXNzIFVERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24KLXsKLSAgcHVibGljIFVERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxpbnQgdG9vbElkLGludCB2aWV3SWQsaW50IHZpZXdUb29sSWQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvYWN0aW9ucy9VRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lkKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSWQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgbm9kZUlkU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgLy8gUGVyZm9ybSBkYXRhIHZhbGlkYXRpb24uCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQobm9kZUlkU3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFZhbGlkYXRpb24gZmFpbGVkIQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCxub2RlSWRTdHJpbmcpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSWQpOwotICAgIFRyZWVFbGVtZW50IGVsZW1lbnQgPSBub2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlRWxlbWVudCkKLSAgICB7Ci0gICAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudCllbGVtZW50OwotICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gc2VydmljZUVsZW1lbnQuZ2V0QnVzaW5lc3NTZXJ2aWNlKCk7Ci0gICAgICBVZGRpNGpIZWxwZXIgdWRkaTRqSGVscGVyID0gbmV3IFVkZGk0akhlbHBlcigpOwotICAgICAgU3RyaW5nIHdzZGxVUkwgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETChicywgc2VydmljZUVsZW1lbnQuZ2V0UmVnaXN0cnlFbGVtZW50KCkuZ2V0UHJveHkoKSk7Ci0gICAgICBpZiAod3NkbFVSTCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIERlZmluaXRpb24gZGVmID0gdWRkaTRqSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkwpOwotICAgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wIiwiLndzZGwiKTsKLSAgICAgICAgICBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiBhY3Rpb24gPSBuZXcgVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICAgIGFjdGlvbi53cml0ZVdTRExEZWZpbml0aW9uKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKSxkZWYpOwotICAgICAgICAgIHdzZGxVUkwgPSB0ZW1wRmlsZS50b1VSTCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHdzZGxVUkwgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHdzZGxVUkwgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbFVSTCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBpZiAod3NkbFVSTCAhPSBudWxsKQotICAgICAgewotICAgICAgICBPcGVuV1NETEFjdGlvbiBvcGVuV1NETEFjdGlvbiA9IG5ldyBPcGVuV1NETEFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gb3BlbldTRExBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwsd3NkbFVSTCk7Ci0gICAgICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gb3BlbldTRExBY3Rpb24ucnVuKCk7Ci0gICAgICAgIGlmIChhY3Rpb25SZXN1bHQpIHsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fV1NETF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFIix3c2RsVVJMKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0RMX05PVF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFIikpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGIyODFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotcHVibGljIGNsYXNzIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGV4dGVuZHMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uCi17Ci0gIHByaXZhdGUgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICBwcml2YXRlIERlZmluaXRpb24gZGVmXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFdTRExGaWxlTmFtZV87Ci0KLSAgcHVibGljIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIG5vZGVNYW5hZ2VyXyA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgIGRlZl8gPSBudWxsOwotICAgIGRlZmF1bHRXU0RMRmlsZU5hbWVfID0gInRlbXAud3NkbCI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsaW50IHRvb2xJZCxpbnQgdmlld0lkLGludCB2aWV3VG9vbElkKQotICB7Ci0gICAgcmV0dXJuIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCx0b29sSWQsdmlld0lkLHZpZXdUb29sSWQsInVkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AiKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHdyaXRlKE91dHB1dFN0cmVhbSBvcykKLSAgewotICAgIHJldHVybiB3cml0ZVdTRExEZWZpbml0aW9uKG9zLGRlZl8pOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGRlZmF1bHRXU0RMRmlsZU5hbWVfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlkKTsKLSAgICBVZGRpNGpIZWxwZXIgdWRkaTRqSGVscGVyID0gbmV3IFVkZGk0akhlbHBlcigpOwotICAgIFN0cmluZyB3c2RsVXJsID0gbnVsbDsKLSAgICBpZiAobm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFRyZWVFbGVtZW50IGVsZW1lbnQgPSBub2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VFbGVtZW50KQotICAgICAgewotICAgICAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudCllbGVtZW50OwotICAgICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICAgICAgd3NkbFVybCA9IHVkZGk0akhlbHBlci5nZXRXU0RMKGJzLCBzZXJ2aWNlRWxlbWVudC5nZXRSZWdpc3RyeUVsZW1lbnQoKS5nZXRQcm94eSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgVE1vZGVsIHRNb2RlbCA9ICgoU2VydmljZUludGVyZmFjZUVsZW1lbnQpZWxlbWVudCkuZ2V0VE1vZGVsKCk7Ci0gICAgICAgIHdzZGxVcmwgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETCh0TW9kZWwpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAod3NkbFVybCAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWZfID0gdWRkaTRqSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVcmwpOwotICAgICAgICBpZiAoZGVmXyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHdzZGxQYXRobmFtZTsKLSAgICAgICAgICBpbnQgaW5kZXggPSB3c2RsVXJsLmluZGV4T2YoJy8nKTsKLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgICB3c2RsUGF0aG5hbWUgPSB3c2RsVXJsLnN1YnN0cmluZyhpbmRleCsxLCB3c2RsVXJsLmxlbmd0aCgpKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB3c2RsUGF0aG5hbWUgPSB3c2RsVXJsOwotICAgICAgICAgIGRlZmF1bHRXU0RMRmlsZU5hbWVfID0gV1NETEZpbGVOYW1lSGVscGVyLmdldFdTRExGaWxlTmFtZSh3c2RsUGF0aG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyXy5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUkVUUklFVklOR19XU0RMX0RPQyIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXRTdGF0dXNDb250ZW50UGFnZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODM0MzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGNsYXNzIFVERElJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbgotewotICBwdWJsaWMgVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICByZXR1cm4gKEZvcm1Ub29sKXVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gIH0KLQotICAgIHB1YmxpYyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gbmV3SW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKCkgewotICAgICAgICBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiBhY3Rpb24gPSBuZXcgVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICBIYXNodGFibGUgdGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotCi0gICAgICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotCi0gICAgICAgIHRhYmxlLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBTdHJpbmcudmFsdWVPZihzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCkpKTsKLQotICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5MDc3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXI7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbiBleHRlbmRzIExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24KLXsKLSAgcHVibGljIFVERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIHJldHVybiAoRm9ybVRvb2wpdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBVZGRpNGpIZWxwZXIgdWRkaTRqSGVscGVyID0gbmV3IFVkZGk0akhlbHBlcigpOwotICAgIFN0cmluZyB3c2RsVXJsID0gbnVsbDsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VFbGVtZW50KQotICAgIHsKLSAgICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICAgIHdzZGxVcmwgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETChicywgc2VydmljZUVsZW1lbnQuZ2V0UmVnaXN0cnlFbGVtZW50KCkuZ2V0UHJveHkoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCkKLSAgICB7Ci0gICAgICBUTW9kZWwgdE1vZGVsID0gKChTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCllbGVtZW50KS5nZXRUTW9kZWwoKTsKLSAgICAgIHdzZGxVcmwgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETCh0TW9kZWwpOwotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh3c2RsVXJsICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmID0gdWRkaTRqSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHdzZGxVcmwpOwotICAgICAgICBGaWxlIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidGVtcCIsIi53c2RsIik7Ci0gICAgICAgIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIGFjdGlvbi53cml0ZVdTRExEZWZpbml0aW9uKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKSxkZWYpOwotICAgICAgICB3c2RsVXJsID0gdGVtcEZpbGUudG9VUkwoKS50b1N0cmluZygpOwotICAgICAgICByZXR1cm4gbGF1bmNoV2l6YXJkKHdzZGxVcmwpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlcl8uZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NETF9ET0MiKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VRERJTm9kZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjFlNTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESU5vZGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVURESU5vZGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBSZWdpc3RyeU5vZGUgcmVnTm9kZV87Ci0gIHB1YmxpYyBVRERJTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TmF2aWdhdG9yTWFuYWdlcigpKTsKLSAgICByZWdOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE5vZGUgZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkKLSAgewotICAgIE5vZGUgc2VsZWN0ZWROYXZpZ2F0b3JOb2RlID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIHJldHVybiBzZWxlY3RlZE5hdmlnYXRvck5vZGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgUmVnaXN0cnlOb2RlIGdldFJlZ2lzdHJ5Tm9kZSgpCi0gIHsKLSAgICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSlub2RlTWFuYWdlcl8uZ2V0Um9vdE5vZGUoKTsKLSAgICByZXR1cm4gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESVByb3BlcnRpZXNGb3JtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VERElQcm9wZXJ0aWVzRm9ybUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGQxOWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVURESVByb3BlcnRpZXNGb3JtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFVERElQcm9wZXJ0aWVzRm9ybUFjdGlvbiBleHRlbmRzIEZvcm1BY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXJfOwotICBwdWJsaWMgVURESVByb3BlcnRpZXNGb3JtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgIG5hdmlnYXRvck1hbmFnZXJfID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTm9kZSBnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKQotICB7Ci0gICAgcmV0dXJuIG5hdmlnYXRvck1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKQotICB7Ci0gICAgcmV0dXJuIChGb3JtVG9vbCkoZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFJlZ2lzdHJ5Tm9kZSBnZXRSZWdpc3RyeU5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGdldFJlZ2lzdHJ5Tm9kZShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgUmVnaXN0cnlOb2RlIGdldFJlZ2lzdHJ5Tm9kZShOb2RlIHJlZ2lzdHJ5Q2hpbGROb2RlKQotICB7Ci0gICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlcl8uZ2V0Um9vdE5vZGUoKTsKLSAgICByZXR1cm4gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShyZWdpc3RyeUNoaWxkTm9kZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVW5wdWJsaXNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VucHVibGlzaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2NjYTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVW5wdWJsaXNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuKjsKLWltcG9ydCBvcmcudWRkaTRqLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotcHVibGljIGNsYXNzIFVucHVibGlzaEFjdGlvbiBleHRlbmRzIFVERElQcm9wZXJ0aWVzRm9ybUFjdGlvbgotewotICBwcm90ZWN0ZWQgUmVnaXN0cnlOb2RlIHJlZ2lzdHJ5Tm9kZV87Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzTG9nZ2VkSW5fOwotCi0gIHB1YmxpYyBVbnB1Ymxpc2hBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgcmVnaXN0cnlOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdpc3RyeU5vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgRm9ybVRvb2wgZm9ybVRvb2wgPSBnZXRTZWxlY3RlZEZvcm1Ub29sKCk7Ci0KLSAgICAvLyBpZiBub3QgeWV0IGxvZ2dlZCBpbiwgdmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGxvZyBpbgotICAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgewotICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgU3RyaW5nIHBhc3N3b3JkID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLQotICAgICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgICBpZiAocHVibGlzaFVSTCAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCwgcHVibGlzaFVSTCk7Ci0gICAgICAgIAotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVVUkwocHVibGlzaFVSTCkpCi0gICAgICB7Ci0gICAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMIikpOwotICAgICAgfQotCi0gICAgICBpZiAodXNlcklkICE9IG51bGwpCi0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgICAgICAKLSAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHVzZXJJZCkpCi0gICAgICB7Ci0gICAgICAgIGZvcm1Ub29sLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9VU0VSSUQiKSk7Ci0gICAgICB9Ci0KLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELCBwYXNzd29yZCk7Ci0gICAgICAKLSAgICAgIGZvcm1Ub29sLnVwZGF0ZVByb3BlcnR5VGFibGUocHJvcGVydHlUYWJsZV8pOwotCi0gICAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ2lzdHJ5RWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghcmVnaXN0cnlFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgbm90IHlldCBsb2dnZWQgaW4sIGxvZyBpbiBmaXJzdAotICAgICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSAgICAgICAgCi0gICAgICAgIHJlZ2lzdHJ5RWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgc2VsZWN0ZWRFbGVtZW50S2V5ID0gc2VsZWN0ZWRFbGVtZW50LmdldEtleSgpOwotICAgICAgU3RyaW5nIHVucHVibGlzaFR5cGVNZXNzYWdlS2V5ID0gbnVsbDsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ2lzdHJ5RWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgU3RyaW5nIGF1dGhJbmZvID0gcmVnaXN0cnlFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCk7Ci0gICAgICBEaXNwb3NpdGlvblJlcG9ydCBkciA9IG51bGw7Ci0gICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgQnVzaW5lc3NFbGVtZW50KQotICAgICAgewotICAgICAgICB1bnB1Ymxpc2hUeXBlTWVzc2FnZUtleSA9ICJNU0dfSU5GT19CVVNJTkVTU19VTlBVQkxJU0hFRCI7Ci0gICAgICAgIGRyID0gcHJveHkuZGVsZXRlX2J1c2luZXNzKGF1dGhJbmZvLHNlbGVjdGVkRWxlbWVudEtleSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgdW5wdWJsaXNoVHlwZU1lc3NhZ2VLZXkgPSAiTVNHX0lORk9fU0VSVklDRV9VTlBVQkxJU0hFRCI7Ci0gICAgICAgIGRyID0gcHJveHkuZGVsZXRlX3NlcnZpY2UoYXV0aEluZm8sc2VsZWN0ZWRFbGVtZW50S2V5KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KQotICAgICAgewotICAgICAgICB1bnB1Ymxpc2hUeXBlTWVzc2FnZUtleSA9ICJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9VTlBVQkxJU0hFRCI7Ci0gICAgICAgIGRyID0gcHJveHkuZGVsZXRlX3RNb2RlbChhdXRoSW5mbyxzZWxlY3RlZEVsZW1lbnRLZXkpOwotICAgICAgfQotICAgICAgaWYgKCFkci5zdWNjZXNzKCkpCi0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZHIudG9TdHJpbmcoKSk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGVkRWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHVucHVibGlzaFR5cGVNZXNzYWdlS2V5LHNlbGVjdGVkRWxlbWVudC5nZXROYW1lKCkpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlRyYW5zcG9ydEV4Y2VwdGlvbiIsZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKCJVRERJRXhjZXB0aW9uIik7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShlLnRvU3RyaW5nKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJNYWxmb3JtZWRVUkxFeGNlcHRpb24iLGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsIG1lc3NhZ2VRdWV1ZSwgIkV4Y2VwdGlvbiIsIGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VcGRhdGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmJiOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VcGRhdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVcGRhdGVBY3Rpb24gZXh0ZW5kcyBVRERJUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlXzsKLSAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzQXV0aGVudGljYXRpb25fOwotICBwdWJsaWMgVXBkYXRlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcixib29sZWFuIHJlcXVpcmVzQXV0aGVudGljYXRpb24pCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICByZWdOb2RlXyA9IGdldFJlZ2lzdHJ5Tm9kZSgpOwotICAgIHJlcXVpcmVzQXV0aGVudGljYXRpb25fID0gcmVxdWlyZXNBdXRoZW50aWNhdGlvbjsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLSAgCi0gIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTZXR1cCBmb3IgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcgotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTVVMVElQQVJUX0ZPUk1fREFUQV9QQVJTRVIsIHBhcnNlcik7Ci0KLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9IGZvcm1Ub29sOwotICAgIGZvcm1Ub29sUEkuY2xlYXJFcnJvcnMoKTsKLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gcHJvY2Vzc090aGVycyhwYXJzZXIsZm9ybVRvb2xQSSk7Ci0gICAgZm9yIChpbnQgaT0wO2k8cmVtb3ZlZFByb3BlcnRpZXNfLnNpemUoKTtpKyspCi0gICAgICBmb3JtVG9vbFBJLnJlbW92ZVByb3BlcnR5KHJlbW92ZWRQcm9wZXJ0aWVzXy5lbGVtZW50QXQoaSkpOwotICAgIGZvcm1Ub29sUEkudXBkYXRlUHJvcGVydHlUYWJsZShwcm9wZXJ0eVRhYmxlXyk7Ci0gICAgCi0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgIFN0cmluZyB1c2VySWQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIAotICAgIGJvb2xlYW4gdmFsaWRhdGVBdXRoZW50aWNhdGlvbiA9ICFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSAmIHJlcXVpcmVzQXV0aGVudGljYXRpb25fOwotICAgIAotICAgIGlmIChwdWJsaXNoVVJMICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwscHVibGlzaFVSTCk7Ci0gICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIH0KLSAgICAKLSAgICBpZiAodmFsaWRhdGVBdXRoZW50aWNhdGlvbiAmJiAhVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHB1Ymxpc2hVUkwpKQotICAgIHsKLSAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfUFVCTElTSF9VUkwiKSk7Ci0gICAgfQotICAgIAotICAgIGlmICh1c2VySWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQsdXNlcklkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgfQotICAgIAotICAgIGlmICh2YWxpZGF0ZUF1dGhlbnRpY2F0aW9uICYmICFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcodXNlcklkKSkKLSAgICB7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9VU0VSSUQiKSk7Ci0gICAgfQotICAgIAotICAgIGlmIChwYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JELHBhc3N3b3JkKTsKLSAgICAgIGZvcm1Ub29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZWZyZXNoRnJvbVJlZ2lzdHJ5KCk7Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWZyZXNoTm9kZShCdXNpbmVzc0VudGl0eSBiZSkKLSAgewotICAgIE5vZGUgbm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgbmV3QnVzaW5lc3NFbGVtZW50ID0gbmV3IEJ1c2luZXNzRWxlbWVudChiZSxyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpLmdldE1vZGVsKCkpOwotICAgIGNvbm5lY3RFbGVtZW50cyhwYXJlbnROb2RlLG5ld0J1c2luZXNzRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZnJlc2hOb2RlKEJ1c2luZXNzU2VydmljZSBicykKLSAgewotICAgIE5vZGUgbm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBuZXdTZXJ2aWNlRWxlbWVudCA9IG5ldyBTZXJ2aWNlRWxlbWVudChicyxyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpLmdldE1vZGVsKCkpOwotICAgIGNvbm5lY3RFbGVtZW50cyhwYXJlbnROb2RlLG5ld1NlcnZpY2VFbGVtZW50KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVmcmVzaE5vZGUoVE1vZGVsIHRNb2RlbCkKLSAgewotICAgIE5vZGUgbm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgVHJlZUVsZW1lbnQgZWxlbWVudCA9IG5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBlbGVtZW50LmRpc2Nvbm5lY3RBbGwoKTsKLSAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBuZXdTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCh0TW9kZWwscmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKS5nZXRNb2RlbCgpKTsKLSAgICBjb25uZWN0RWxlbWVudHMocGFyZW50Tm9kZSxuZXdTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjb25uZWN0RWxlbWVudHMoTm9kZSBwYXJlbnROb2RlLFRyZWVFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBUcmVlRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gcGFyZW50Tm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFN0cmluZyByZWwgPSBudWxsOwotICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgUHVibGlzaGVkSXRlbXNOb2RlKQotICAgICAgcmVsID0gVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFF1ZXJ5Tm9kZQotICAgICAgcmVsID0gVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSWV9SRVNVTFRTOwotICAgIH0KLSAgICBwYXJlbnRFbGVtZW50LmNvbm5lY3QobmV3RWxlbWVudCxyZWwsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICBOb2RlIG5ld05vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShuZXdFbGVtZW50KTsKLSAgICBpbnQgbmV3Tm9kZUlkID0gbmV3Tm9kZS5nZXROb2RlSWQoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHBhcmVudE5vZGUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChuZXdOb2RlSWQpOwotICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gbmV3Tm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gdG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgYWRkVG9IaXN0b3J5KEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLHNlbGVjdGVkVG9vbC5nZXRTZWxlY3RUb29sQWN0aW9uSHJlZih0cnVlKSk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKFZlY3RvciB2KQotICB7Ci0gICAgZm9yIChpbnQgaT0wO2k8di5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXYuZWxlbWVudEF0KGkpOwotICAgICAgbGlzdEVsZW1lbnQuc2V0Vmlld0lkKGkpOwotICAgICAgLy8gdGFyZ2V0Vmlld0lkIGRldGVybWluZXMgd2hldGhlciBvciBub3QgYSBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkIGxpc3QgZWxlbWVudCByZW1haW5zIGluIGVkaXQgc3RhdGUuCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCArIDFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoIC0gMV0gPSBuZXcgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXJUcmFuc2Zvcm1lcihjb250cm9sbGVyXyk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlQnVzaW5lc3NBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlQnVzaW5lc3NBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkYjZkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VwZGF0ZUJ1c2luZXNzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQnVzaW5lc3NBY3Rpb24gZXh0ZW5kcyBVcGRhdGVBY3Rpb24KLXsKLSAgcHJpdmF0ZSBib29sZWFuIGlzVXBkYXRlXzsKLSAgcHVibGljIFVwZGF0ZUJ1c2luZXNzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsdHJ1ZSk7Ci0gICAgaXNVcGRhdGVfID0gdHJ1ZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIsRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHV1aWRLZXkgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpOwotICAgIFN0cmluZ1tdIGRpc2NvdmVyeVVSTE1vZGlmaWVkU3RhdGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkRJU0NPVkVSWVVSTF9NT0RJRklFRCk7Ci0gICAgU3RyaW5nW10gZGlzY292ZXJ5VVJMVmlld0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5ESVNDT1ZFUllVUkxfVklFV0lEKTsKLSAgICBTdHJpbmdbXSBkaXNjb3ZlcnlVUkxzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RJU0NPVkVSWVVSTCk7Ci0gICAgU3RyaW5nW10gbmFtZU1vZGlmaWVkU3RhdGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5BTUVfTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIG5hbWVWaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLk5BTUVfVklFV0lEKTsKLSAgICBTdHJpbmdbXSBuYW1lTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UpOwotICAgIFN0cmluZ1tdIG5hbWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uVmlld0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5ERVNDUklQVElPTl9WSUVXSUQpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04pOwotICAgIFN0cmluZ1tdIGlkTW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuSURFTlRJRklFUl9NT0RJRklFRCk7Ci0gICAgU3RyaW5nW10gaWRWaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLklERU5USUZJRVJfVklFV0lEKTsKLSAgICBTdHJpbmdbXSBpZFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfVFlQRSk7Ci0gICAgU3RyaW5nW10gaWRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBpZEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9WQUxVRSk7Ci0gICAgU3RyaW5nW10gY2F0TW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIGNhdFZpZXdJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVklFV0lEKTsKLSAgICBTdHJpbmdbXSBjYXRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSk7Ci0gICAgCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgCi0gICAgaWYgKHV1aWRLZXkgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLHV1aWRLZXkpOwotICAgIAotICAgIAotICAgIGlmIChkaXNjb3ZlcnlVUkxNb2RpZmllZFN0YXRlcyAhPSBudWxsICYmIGRpc2NvdmVyeVVSTFZpZXdJZHMgIT0gbnVsbCAmJiBkaXNjb3ZlcnlVUkxzICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG9sZERpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyk7Ci0gICAgICBWZWN0b3IgbmV3RGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ESVNDT1ZFUllVUkwiKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGRpc2NvdmVyeVVSTHMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIERpc2NvdmVyeVVSTCBkaXNjb3ZlcnlVUkwgPSBuZXcgRGlzY292ZXJ5VVJMKGRpc2NvdmVyeVVSTHNbaV0sIiIpOwotICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVVSTChkaXNjb3ZlcnlVUkxzW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZGlzY292ZXJ5VVJMVmlld0lkID0gSW50ZWdlci5wYXJzZUludChkaXNjb3ZlcnlVUkxWaWV3SWRzW2ldKTsKLSAgICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKGRpc2NvdmVyeVVSTE1vZGlmaWVkU3RhdGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkaXNjb3ZlcnlVUkxWaWV3SWQgPT0gLTEgfHwgaXNNb2RpZmllZCkKLSAgICAgICAgICBuZXdEaXNjb3ZlcnlVUkxMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudChkaXNjb3ZlcnlVUkwpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld0Rpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQob2xkRGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGRpc2NvdmVyeVVSTFZpZXdJZCkpOyAgICAgCi0gICAgICB9Ci0gICAgICByZWluZGV4TGlzdEVsZW1lbnRWZWN0b3IobmV3RGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyxuZXdEaXNjb3ZlcnlVUkxMaXN0RWxlbWVudFZlY3Rvcik7ICAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMpOwotICAgIAotICAgIEhhc2h0YWJsZSBsYW5ndWFnZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgaWYgKG5hbWVNb2RpZmllZFN0YXRlcyAhPSBudWxsICYmIG5hbWVWaWV3SWRzICE9IG51bGwgJiYgbmFtZUxhbmd1YWdlcyAhPSBudWxsICYmIG5hbWVzICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG9sZE5hbWVMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgICAgIFZlY3RvciBuZXdOYW1lTGlzdEVsZW1lbnRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAvLyBVRERJJ3Mgc2F2ZSBBUEkgKEFwcGVuZGl4IEMgb2YgdGhlIFVEREkgVjIgUHJvZ3JhbW1lcnMgQVBJIFNwZWNpZmljYXRpb24pIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAvLyAxKSBPbmx5IHRoZSBmaXJzdCByb3cgY2FuIGhhdmUgYSBibGFuayBsYW5ndWFnZS4KLSAgICAgIC8vIDIpIE9ubHkgMSBuYW1lIHBlciBsYW5ndWFnZS4KLSAgICAgIFN0cmluZ1tdIHBhcmFtZXRlcnMgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgcGFyYW1ldGVyc1swXSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPG5hbWVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIHBhcmFtZXRlcnNbMV0gPSBTdHJpbmcudmFsdWVPZihpKzEpOwotICAgICAgICBOYW1lIHVkZGk0ak5hbWU7Ci0gICAgICAgIGlmIChuYW1lTGFuZ3VhZ2VzW2ldLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB1ZGRpNGpOYW1lID0gbmV3IE5hbWUobmFtZXNbaV0sbmFtZUxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVkZGk0ak5hbWUgPSBuZXcgTmFtZShuYW1lc1tpXSk7Ci0gICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyxpKTsKLSAgICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChsYW5ndWFnZUhhc2guZ2V0KG5hbWVMYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGxhbmd1YWdlSGFzaC5wdXQobmFtZUxhbmd1YWdlc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhuYW1lc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBuYW1lVmlld0lkID0gSW50ZWdlci5wYXJzZUludChuYW1lVmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihuYW1lTW9kaWZpZWRTdGF0ZXNbaV0pLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgCi0gICAgICAgIGlmIChuYW1lVmlld0lkID09IC0xIHx8IGlzTW9kaWZpZWQpCi0gICAgICAgICAgbmV3TmFtZUxpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQobmV3IExpc3RFbGVtZW50KHVkZGk0ak5hbWUpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld05hbWVMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG9sZE5hbWVMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQobmFtZVZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld05hbWVMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyxuZXdOYW1lTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyk7Ci0gICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX05BTUVTIikpOwotICAgIH0KLSAgICAKLSAgICBpZiAoZGVzY3JpcHRpb25Nb2RpZmllZFN0YXRlcyAhPSBudWxsICYmIGRlc2NyaXB0aW9uVmlld0lkcyAhPSBudWxsICYmIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzICE9IG51bGwgJiYgZGVzY3JpcHRpb25zICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG9sZERlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpOwotICAgICAgVmVjdG9yIG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJzID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHBhcmFtZXRlcnNbMF0gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVNDUklQVElPTiIpOwotICAgICAgbGFuZ3VhZ2VIYXNoLmNsZWFyKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbnMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIERlc2NyaXB0aW9uIHVkZGk0akRlc2NyaXB0aW9uOwotICAgICAgICBpZiAoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSxkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVkZGk0akRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uc1tpXSk7Ci0gICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZ3VhZ2VIYXNoLmdldChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGxhbmd1YWdlSGFzaC5wdXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0sQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmcoZGVzY3JpcHRpb25zW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludCBkZXNjcmlwdGlvblZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQoZGVzY3JpcHRpb25WaWV3SWRzW2ldKTsKLSAgICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKGRlc2NyaXB0aW9uTW9kaWZpZWRTdGF0ZXNbaV0pLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgCi0gICAgICAgIGlmIChkZXNjcmlwdGlvblZpZXdJZCA9PSAtMSB8fCBpc01vZGlmaWVkKQotICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQodWRkaTRqRGVzY3JpcHRpb24pKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGREZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChkZXNjcmlwdGlvblZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLG5ld0Rlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IpOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyk7Ci0gICAgICAKLSAgICBpZiAoaWRNb2RpZmllZFN0YXRlcyAhPSBudWxsICYmIGlkVmlld0lkcyAhPSBudWxsICYmIGlkVHlwZXMgIT0gbnVsbCAmJiBpZEtleU5hbWVzICE9IG51bGwgJiYgaWRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Igb2xkSWRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLSAgICAgIFZlY3RvciBuZXdJZExpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8aWRLZXlOYW1lcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShpZEtleU5hbWVzW2ldLGlkS2V5VmFsdWVzW2ldLGlkVHlwZXNbaV0pOwotICAgICAgICBpbnQgaWRWaWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGlkVmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihpZE1vZGlmaWVkU3RhdGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgaWYgKGlkVmlld0lkID09IC0xIHx8IGlzTW9kaWZpZWQpCi0gICAgICAgICAgbmV3SWRMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudChrcikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3SWRMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG9sZElkTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGlkVmlld0lkKSk7Ci0gICAgICB9Ci0gICAgICByZWluZGV4TGlzdEVsZW1lbnRWZWN0b3IobmV3SWRMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyxuZXdJZExpc3RFbGVtZW50VmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyk7Ci0gICAgICAKLSAgICBpZiAoY2F0TW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBjYXRWaWV3SWRzICE9IG51bGwgJiYgY2F0VHlwZXMgIT0gbnVsbCAmJiBjYXRLZXlOYW1lcyAhPSBudWxsICYmIGNhdEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBvbGRDYXRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMpOwotICAgICAgVmVjdG9yIG5ld0NhdExpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0VHlwZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoY2F0S2V5TmFtZXNbaV0sY2F0S2V5VmFsdWVzW2ldLGNhdFR5cGVzW2ldKTsKLSAgICAgICAgaW50IGNhdFZpZXdJZCA9IEludGVnZXIucGFyc2VJbnQoY2F0Vmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihjYXRNb2RpZmllZFN0YXRlc1tpXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChjYXRWaWV3SWQgPT0gLTEgfHwgaXNNb2RpZmllZCkKLSAgICAgICAgICBuZXdDYXRMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudChrcikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGRDYXRMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoY2F0Vmlld0lkKSk7Ci0gICAgICB9Ci0gICAgICByZWluZGV4TGlzdEVsZW1lbnRWZWN0b3IobmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyxuZXdDYXRMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7ICAgICAgICAgICAgCi0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVmcmVzaEZyb21SZWdpc3RyeSgpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXVpZEtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBWZWN0b3IgYmVWZWN0b3IgPSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwodXVpZEtleSkuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJlOwotICAgICAgaWYgKGJlVmVjdG9yLnNpemUoKSA+IDApCi0gICAgICAgIGJlID0gKEJ1c2luZXNzRW50aXR5KWJlVmVjdG9yLmdldCgwKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmUgPSBudWxsOwotICAgICAgaWYgKGJlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9PQkpFQ1QsYmUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIEZlZWRiYWNrIHZpYSBKYXZhc2NyaXB0IHBvcHVwcy4KLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBGZWVkYmFjayB2aWEgSmF2YXNjcmlwdCBwb3B1cHMuCi0gICAgfQotICAgIGlzVXBkYXRlXyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAgIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCk7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgVmVjdG9yIGRpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLSAgICAgIFZlY3RvciBuYW1lTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMpOwotICAgICAgVmVjdG9yIGlkTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLSAgICAgIFZlY3RvciBjYXRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7Ci0gICAgICAKLSAgICAgIFZlY3RvciBkaXNjb3ZlcnlVUkxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBpZiAoZGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8ZGlzY292ZXJ5VVJMTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICAgewotICAgICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWRpc2NvdmVyeVVSTExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBEaXNjb3ZlcnlVUkwgZGlzY292ZXJ5VVJMID0gKERpc2NvdmVyeVVSTClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICBkaXNjb3ZlcnlVUkxWZWN0b3IuYWRkRWxlbWVudChkaXNjb3ZlcnlVUkwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIAotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxuYW1lTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpbmFtZUxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIG5hbWVWZWN0b3IuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gbnVsbDsKLSAgICAgIGlmIChkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICBkZXNjcmlwdGlvblZlY3Rvci5hZGRFbGVtZW50KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gbnVsbDsKLSAgICAgIGlmIChpZExpc3RFbGVtZW50VmVjdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlkQmFnID0gbmV3IElkZW50aWZpZXJCYWcoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8aWRMaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpaWRMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgaWRCYWcuYWRkKGtyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSBudWxsOwotICAgICAgaWYgKGNhdExpc3RFbGVtZW50VmVjdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxjYXRMaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpY2F0TGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgIGNhdEJhZy5hZGQoa3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkaXNjb3ZlcnlVUkxWZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgICAgYmUuc2V0RGlzY292ZXJ5VVJMcyhuZXcgRGlzY292ZXJ5VVJMcyhkaXNjb3ZlcnlVUkxWZWN0b3IpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmUuc2V0RGlzY292ZXJ5VVJMcyhudWxsKTsKLSAgICAgIGJlLnNldE5hbWVWZWN0b3IobmFtZVZlY3Rvcik7Ci0gICAgICBiZS5zZXREZXNjcmlwdGlvblZlY3RvcihkZXNjcmlwdGlvblZlY3Rvcik7Ci0gICAgICBiZS5zZXRJZGVudGlmaWVyQmFnKGlkQmFnKTsKLSAgICAgIGJlLnNldENhdGVnb3J5QmFnKGNhdEJhZyk7Ci0gICAgICAKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgICAgICAgcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgVmVjdG9yIGJlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgYmVWZWN0b3IuYWRkKGJlKTsKLSAgICAgIGJlID0gKEJ1c2luZXNzRW50aXR5KXByb3h5LnNhdmVfYnVzaW5lc3MocmVnRWxlbWVudC5nZXRBdXRoSW5mb1N0cmluZygpLCBiZVZlY3RvcikuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICByZWZyZXNoTm9kZShiZSk7Ci0gICAgICBpZiAoaXNVcGRhdGVfKSAgICAgIAotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQlVTSU5FU1NfVVBEQVRFRCIsYmUuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSkpOwotICAgICAgZWxzZQotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQlVTSU5FU1NfUFVCTElTSEVEIixiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIsZSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjOWExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9hY3Rpb25zL1VwZGF0ZVJlZ2lzdHJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlUmVnaXN0cnlBY3Rpb24gZXh0ZW5kcyBVcGRhdGVBY3Rpb24KLXsKLSAgcHVibGljIFVwZGF0ZVJlZ2lzdHJ5QWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsZmFsc2UpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgbmFtZU1vZGlmaWVkU3RhdGUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuTkFNRV9NT0RJRklFRCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUkVHSVNUUllfTkFNRSk7Ci0gICAgU3RyaW5nW10gdXNlckRlZmluZWRDYXRlZ29yeVRNb2RlbEtleXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVE1PREVMX0tFWSk7Ci0gICAgU3RyaW5nW10gdXNlckRlZmluZWRDYXRlZ29yeURhdGEgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfRklMRU5BTUUpOwotICAgIAotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIAotICAgIGlmIChuYW1lTW9kaWZpZWRTdGF0ZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YobmFtZU1vZGlmaWVkU3RhdGUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgU3RyaW5nIG5ld05hbWU7Ci0gICAgICBpZiAoaXNNb2RpZmllZCkKLSAgICAgICAgbmV3TmFtZSA9IG5hbWU7Ci0gICAgICBlbHNlCi0gICAgICAgIG5ld05hbWUgPSAoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9SRUdJU1RSWV9OQU1FKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1JFR0lTVFJZX05BTUUsbmV3TmFtZSk7Ci0gICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZm9ybVRvb2xQSS5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9SRUdJU1RSWV9OQU1FKTsKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX05BTUUiKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUkVHSVNUUllfTkFNRSk7Ci0gICAgCi0gICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcnlUTW9kZWxLZXlzICE9IG51bGwgJiYgdXNlckRlZmluZWRDYXRlZ29yeURhdGEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPHVzZXJEZWZpbmVkQ2F0ZWdvcnlUTW9kZWxLZXlzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIENhdGVnb3J5TW9kZWwgdXNlckRlZmluZWRDYXRlZ29yeSA9IHJlZ0VsZW1lbnQuZ2V0VXNlckRlZmluZWRDYXRlZ29yeSh1c2VyRGVmaW5lZENhdGVnb3J5VE1vZGVsS2V5c1tpXSk7Ci0vLyAgICAgIFRPRE86IE1vdmUgVURESVByZWZlcmVuY2VDb250ZXh0IGRvd24gdG8gb3JnLmVjbGlwc2Uud3N0LndzIAotLy8gICAgICBVRERJUHJlZmVyZW5jZUNvbnRleHQgY29udGV4dCA9IFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRVRERJUHJlZmVyZW5jZUNvbnRleHQoKTsgICAgICAgIAotLy8gICAgICB1c2VyRGVmaW5lZENhdGVnb3J5LnNldENvbHVtbkRlbGltaXRlcihjb250ZXh0LmdldFVkZGlDYXREYXRhQ29sdW1uRGVsaW1pdGVyKCkpOwotLy8gICAgICB1c2VyRGVmaW5lZENhdGVnb3J5LnNldFN0cmluZ0RlbGltaXRlcihjb250ZXh0LmdldFVkZGlDYXREYXRhU3RyaW5nRGVsaW1pdGVyKCkpOwotICAgICAgICB1c2VyRGVmaW5lZENhdGVnb3J5LnNldENvbHVtbkRlbGltaXRlcigiIyIpOwotICAgICAgICB1c2VyRGVmaW5lZENhdGVnb3J5LnNldFN0cmluZ0RlbGltaXRlcigiXCIiKTsKLSAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lID0gdXNlckRlZmluZWRDYXRlZ29yeS5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgICBpZiAodXNlckRlZmluZWRDYXRlZ29yeURhdGFbaV0gPT0gbnVsbCB8fCB1c2VyRGVmaW5lZENhdGVnb3J5RGF0YVtpXS5sZW5ndGgoKSA8IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFIixkaXNwbGF5TmFtZSkpOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMsdXNlckRlZmluZWRDYXRlZ29yeVRNb2RlbEtleXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJ5dGUgcmMgPSB1c2VyRGVmaW5lZENhdGVnb3J5LmxvYWREYXRhKG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHVzZXJEZWZpbmVkQ2F0ZWdvcnlEYXRhW2ldKSkpOwotICAgICAgICAgIHN3aXRjaCAocmMpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBDYXRlZ29yeU1vZGVsLk9QRVJBVElPTl9TVUNDRVNTRlVMOgotICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfTE9BREVEIixkaXNwbGF5TmFtZSkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ2F0ZWdvcnlNb2RlbC5FUlJPUl9GSUxFOgotICAgICAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgICBQYXJzZUV4Y2VwdGlvbiBwZSA9IChQYXJzZUV4Y2VwdGlvbil1c2VyRGVmaW5lZENhdGVnb3J5LmdldEVycm9yRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MxID0ge1N0cmluZy52YWx1ZU9mKHBlLmdldEVycm9yT2Zmc2V0KCkpLGRpc3BsYXlOYW1lLHBlLmdldE1lc3NhZ2UoKSx1c2VyRGVmaW5lZENhdGVnb3J5LmdldENhdGVnb3J5S2V5KCl9OwotICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRV9GT1JNQVQiLGFyZ3MxKSk7Ci0gICAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMsdXNlckRlZmluZWRDYXRlZ29yeVRNb2RlbEtleXNbaV0pOwotICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBDYXRlZ29yeU1vZGVsLkVSUk9SX0NBVEVHT1JZX0tFWToKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MyID0ge2Rpc3BsYXlOYW1lLHVzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2V0RXJyb3JFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCksdXNlckRlZmluZWRDYXRlZ29yeS5nZXRDYXRlZ29yeUtleSgpfTsKLSAgICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfS0VZIixhcmdzMikpOwotICAgICAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlVTRVJfREVGSU5FRF9DQVRFR09SSUVTLHVzZXJEZWZpbmVkQ2F0ZWdvcnlUTW9kZWxLZXlzW2ldKTsgICAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5wdXRzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiByZWZyZXNoRnJvbVJlZ2lzdHJ5KCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1JFR0lTVFJZX05BTUUpOwotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgIHJlZ0VsZW1lbnQuc2V0TmFtZShuYW1lKTsKLSAgICByZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpLnNldE5hbWUobmFtZSk7Ci0gICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1JFR0lTVFJZX1VQREFURUQiLG5hbWUpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlU2VydmljZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWIxOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy5CdXNpbmVzc0VudGl0eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuKjsKLWltcG9ydCBvcmcudWRkaTRqLnRyYW5zcG9ydC5UcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai5VRERJRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2VydmljZUFjdGlvbiBleHRlbmRzIFVwZGF0ZUFjdGlvbgotewotICBwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGVfOwotICBwdWJsaWMgVXBkYXRlU2VydmljZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLHRydWUpOwotICAgIGlzVXBkYXRlXyA9IHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgdXVpZEJ1c2luZXNzS2V5ID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKTsKLSAgICBTdHJpbmcgdXVpZFNlcnZpY2VLZXkgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSk7Ci0gICAgU3RyaW5nIHdzZGxVUkxNb2RpZmllZFN0YXRlID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLldTRExfVVJMX01PRElGSUVEKTsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKTsKLSAgICBTdHJpbmdbXSBuYW1lTW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuTkFNRV9NT0RJRklFRCk7Ci0gICAgU3RyaW5nW10gbmFtZVZpZXdJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuTkFNRV9WSUVXSUQpOwotICAgIFN0cmluZ1tdIG5hbWVMYW5ndWFnZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSk7Ci0gICAgU3RyaW5nW10gbmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25Nb2RpZmllZFN0YXRlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5ERVNDUklQVElPTl9NT0RJRklFRCk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25WaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLkRFU0NSSVBUSU9OX1ZJRVdJRCk7Ci0gICAgU3RyaW5nW10gZGVzY3JpcHRpb25MYW5ndWFnZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT05fTEFOR1VBR0UpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTik7Ci0gICAgU3RyaW5nW10gY2F0TW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIGNhdFZpZXdJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVklFV0lEKTsKLSAgICBTdHJpbmdbXSBjYXRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSk7Ci0KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLQotICAgIGlmICh1dWlkQnVzaW5lc3NLZXkgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLHV1aWRCdXNpbmVzc0tleSk7Ci0KLSAgICBpZiAodXVpZFNlcnZpY2VLZXkgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVksdXVpZFNlcnZpY2VLZXkpOwotCi0gICAgaWYgKHdzZGxVUkxNb2RpZmllZFN0YXRlICE9IG51bGwgJiYgd3NkbFVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IHdzZGxVUkxMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2Yod3NkbFVSTE1vZGlmaWVkU3RhdGUpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgaWYgKGlzTW9kaWZpZWQpCi0gICAgICAgIHdzZGxVUkxMaXN0RWxlbWVudCA9IG5ldyBMaXN0RWxlbWVudCh3c2RsVVJMKTsKLSAgICAgIGVsc2UKLSAgICAgICAgd3NkbFVSTCA9IChTdHJpbmcpd3NkbFVSTExpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCx3c2RsVVJMTGlzdEVsZW1lbnQpOwotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVVUkwod3NkbFVSTCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTCIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKTsKLQotICAgIEhhc2h0YWJsZSBsYW5ndWFnZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgaWYgKG5hbWVNb2RpZmllZFN0YXRlcyAhPSBudWxsICYmIG5hbWVWaWV3SWRzICE9IG51bGwgJiYgbmFtZUxhbmd1YWdlcyAhPSBudWxsICYmIG5hbWVzICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG9sZE5hbWVMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgICAgVmVjdG9yIG5ld05hbWVMaXN0RWxlbWVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIC8vIFVEREkncyBzYXZlIEFQSSAoQXBwZW5kaXggQyBvZiB0aGUgVURESSBWMiBQcm9ncmFtbWVycyBBUEkgU3BlY2lmaWNhdGlvbikgcmVxdWlyZXMgdGhlIGZvbGxvd2luZzoKLSAgICAgIC8vIDEpIE9ubHkgdGhlIGZpcnN0IHJvdyBjYW4gaGF2ZSBhIGJsYW5rIGxhbmd1YWdlLgotICAgICAgLy8gMikgT25seSAxIG5hbWUgcGVyIGxhbmd1YWdlLgotICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICBwYXJhbWV0ZXJzWzBdID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpOwotICAgICAgZm9yIChpbnQgaT0wO2k8bmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgcGFyYW1ldGVyc1sxXSA9IFN0cmluZy52YWx1ZU9mKGkrMSk7Ci0gICAgICAgIE5hbWUgdWRkaTRqTmFtZTsKLSAgICAgICAgaWYgKG5hbWVMYW5ndWFnZXNbaV0ubGVuZ3RoKCkgPiAwKQotICAgICAgICAgIHVkZGk0ak5hbWUgPSBuZXcgTmFtZShuYW1lc1tpXSxuYW1lTGFuZ3VhZ2VzW2ldKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdWRkaTRqTmFtZSA9IG5ldyBOYW1lKG5hbWVzW2ldKTsKLSAgICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMsaSk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZ3VhZ2VIYXNoLmdldChuYW1lTGFuZ3VhZ2VzW2ldKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMsaSk7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFIixwYXJhbWV0ZXJzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGxhbmd1YWdlSGFzaC5wdXQobmFtZUxhbmd1YWdlc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhuYW1lc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBuYW1lVmlld0lkID0gSW50ZWdlci5wYXJzZUludChuYW1lVmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihuYW1lTW9kaWZpZWRTdGF0ZXNbaV0pLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgICAgIGlmIChuYW1lVmlld0lkID09IC0xIHx8IGlzTW9kaWZpZWQpCi0gICAgICAgICAgbmV3TmFtZUxpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQobmV3IExpc3RFbGVtZW50KHVkZGk0ak5hbWUpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld05hbWVMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG9sZE5hbWVMaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQobmFtZVZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld05hbWVMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLG5ld05hbWVMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyk7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX05BTUVTIikpOwotICAgIH0KLQotICAgIGlmIChkZXNjcmlwdGlvbk1vZGlmaWVkU3RhdGVzICE9IG51bGwgJiYgZGVzY3JpcHRpb25WaWV3SWRzICE9IG51bGwgJiYgZGVzY3JpcHRpb25MYW5ndWFnZXMgIT0gbnVsbCAmJiBkZXNjcmlwdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Igb2xkRGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TKTsKLSAgICAgIFZlY3RvciBuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICBwYXJhbWV0ZXJzWzBdID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKTsKLSAgICAgIGxhbmd1YWdlSGFzaC5jbGVhcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25zLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIHBhcmFtZXRlcnNbMV0gPSBTdHJpbmcudmFsdWVPZihpKzEpOwotICAgICAgICBEZXNjcmlwdGlvbiB1ZGRpNGpEZXNjcmlwdGlvbjsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB1ZGRpNGpEZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbihkZXNjcmlwdGlvbnNbaV0sZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpNGpEZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbihkZXNjcmlwdGlvbnNbaV0pOwotICAgICAgICAgIGlmIChpICE9IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZ3VhZ2VIYXNoLmdldChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgZm9ybVRvb2xQSS5mbGFnUm93RXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgbGFuZ3VhZ2VIYXNoLnB1dChkZXNjcmlwdGlvbkxhbmd1YWdlc1tpXSxCb29sZWFuLlRSVUUpOwotICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZyhkZXNjcmlwdGlvbnNbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBmb3JtVG9vbFBJLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGRlc2NyaXB0aW9uVmlld0lkID0gSW50ZWdlci5wYXJzZUludChkZXNjcmlwdGlvblZpZXdJZHNbaV0pOwotICAgICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YoZGVzY3JpcHRpb25Nb2RpZmllZFN0YXRlc1tpXSkuYm9vbGVhblZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uVmlld0lkID09IC0xIHx8IGlzTW9kaWZpZWQpCi0gICAgICAgICAgbmV3RGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG5ldyBMaXN0RWxlbWVudCh1ZGRpNGpEZXNjcmlwdGlvbikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3RGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG9sZERlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGRlc2NyaXB0aW9uVmlld0lkKSk7Ci0gICAgICB9Ci0gICAgICByZWluZGV4TGlzdEVsZW1lbnRWZWN0b3IobmV3RGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyxuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0KLSAgICBpZiAoY2F0TW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBjYXRWaWV3SWRzICE9IG51bGwgJiYgY2F0VHlwZXMgIT0gbnVsbCAmJiBjYXRLZXlOYW1lcyAhPSBudWxsICYmIGNhdEtleVZhbHVlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBvbGRDYXRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0gICAgICBWZWN0b3IgbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxjYXRUeXBlcy5sZW5ndGg7aSsrKQotICAgICAgewotICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IG5ldyBLZXllZFJlZmVyZW5jZShjYXRLZXlOYW1lc1tpXSxjYXRLZXlWYWx1ZXNbaV0sY2F0VHlwZXNbaV0pOwotICAgICAgICBpbnQgY2F0Vmlld0lkID0gSW50ZWdlci5wYXJzZUludChjYXRWaWV3SWRzW2ldKTsKLSAgICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKGNhdE1vZGlmaWVkU3RhdGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgaWYgKGNhdFZpZXdJZCA9PSAtMSB8fCBpc01vZGlmaWVkKQotICAgICAgICAgIG5ld0NhdExpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQobmV3IExpc3RFbGVtZW50KGtyKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuZXdDYXRMaXN0RWxlbWVudFZlY3Rvci5hZGRFbGVtZW50KG9sZENhdExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChjYXRWaWV3SWQpKTsKLSAgICAgIH0KLSAgICAgIHJlaW5kZXhMaXN0RWxlbWVudFZlY3RvcihuZXdDYXRMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMsbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0gICAgcmV0dXJuIGlucHV0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVmcmVzaEJ1c2luZXNzRnJvbVJlZ2lzdHJ5KCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyB1dWlkQnVzaW5lc3NLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKTsKLSAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlXy5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotICAgICAgVmVjdG9yIGJlVmVjdG9yID0gcHJveHkuZ2V0X2J1c2luZXNzRGV0YWlsKHV1aWRCdXNpbmVzc0tleSkuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJlOwotICAgICAgaWYgKGJlVmVjdG9yLnNpemUoKSA+IDApCi0gICAgICAgIGJlID0gKEJ1c2luZXNzRW50aXR5KWJlVmVjdG9yLmdldCgwKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmUgPSBudWxsOwotICAgICAgaWYgKGJlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9CVVNJTkVTUyxiZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gRmVlZGJhY2sgdmlhIEphdmFzY3JpcHQgcG9wdXBzLgotICAgIH0KLSAgICBjYXRjaCAoVURESUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIEZlZWRiYWNrIHZpYSBKYXZhc2NyaXB0IHBvcHVwcy4KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiByZWZyZXNoRnJvbVJlZ2lzdHJ5KCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXVpZFNlcnZpY2VLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVkpOwotICAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBVRERJUHJveHkgcHJveHkgPSByZWdFbGVtZW50LmdldFByb3h5KCk7Ci0gICAgICBTZXJ2aWNlRGV0YWlsIHNlcnZpY2VEZXRhaWwgPSBwcm94eS5nZXRfc2VydmljZURldGFpbCh1dWlkU2VydmljZUtleSk7Ci0gICAgICBWZWN0b3IgYnVzaW5lc3NTZXJ2aWNlVmVjdG9yID0gc2VydmljZURldGFpbC5nZXRCdXNpbmVzc1NlcnZpY2VWZWN0b3IoKTsKLSAgICAgIGlmIChidXNpbmVzc1NlcnZpY2VWZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCxidXNpbmVzc1NlcnZpY2VWZWN0b3IuZWxlbWVudEF0KDApKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gRmVlZGJhY2sgdmlhIEphdmFzY3JpcHQgcG9wdXBzLgotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gRmVlZGJhY2sgdmlhIEphdmFzY3JpcHQgcG9wdXBzLgotICAgIH0KLSAgICBpc1VwZGF0ZV8gPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBSZWdQdWJsaXNoVG9vbCBzZXR1cFJlZ1B1Ymxpc2hUb29sKCkKLSAgewotICAgIC8vIFByZXBhcmUgZm9yIHJlLXB1Ymxpc2hpbmcgYSBub3ctc3RhbGUgc2VydmljZSB3aG9zZSBidXNpbmVzcyBoYXMgYWxzbyBiZWVuIGVsaW1pbmF0ZWQuCi0gICAgUmVnUHVibGlzaFRvb2wgcmVnUHVibGlzaFRvb2wgPSByZWdOb2RlXy5nZXRSZWdQdWJsaXNoVG9vbCgpOwotICAgIHJlZ1B1Ymxpc2hUb29sLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZLCIiKTsKLSAgICByZWdQdWJsaXNoVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSk7Ci0gICAgcmVnUHVibGlzaFRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEKSk7Ci0gICAgCi0gICAgcmVnUHVibGlzaFRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMLHByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpKTsKLSAgICAKLSAgICBWZWN0b3IgbmFtZUxpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKTsKLSAgICBWZWN0b3IgZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpOwotICAgIFZlY3RvciBjYXRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLSAgICAKLSAgICBWZWN0b3IgbmFtZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpPTA7aTxuYW1lTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICB7Ci0gICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCluYW1lTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgTmFtZSBuYW1lID0gKE5hbWUpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICBuYW1lVmVjdG9yLmFkZEVsZW1lbnQobmFtZSk7Ci0gICAgfQotICAgIAotICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IG51bGw7Ci0gICAgaWYgKGRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZXNjcmlwdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICBkZXNjcmlwdGlvblZlY3Rvci5hZGRFbGVtZW50KGRlc2NyaXB0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVnUHVibGlzaFRvb2wucmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyk7Ci0gICAgCi0gICAgQ2F0ZWdvcnlCYWcgY2F0QmFnID0gbnVsbDsKLSAgICBpZiAoY2F0TGlzdEVsZW1lbnRWZWN0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjYXRCYWcgPSBuZXcgQ2F0ZWdvcnlCYWcoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGNhdExpc3RFbGVtZW50VmVjdG9yLnNpemUoKTtpKyspCi0gICAgICB7Ci0gICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWNhdExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGNhdEJhZy5hZGQoa3IpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICByZWdQdWJsaXNoVG9vbC5yZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0gICAgCi0gICAgcmVnUHVibGlzaFRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLG5hbWVWZWN0b3IpOwotICAgIGlmIChkZXNjcmlwdGlvblZlY3RvciAhPSBudWxsKQotICAgICAgcmVnUHVibGlzaFRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyxkZXNjcmlwdGlvblZlY3Rvcik7Ci0gICAgaWYgKGNhdEJhZyAhPSBudWxsKQotICAgICAgcmVnUHVibGlzaFRvb2wuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMsY2F0QmFnKTsKLSAgICByZXR1cm4gcmVnUHVibGlzaFRvb2w7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGVfLmdldFRyZWVFbGVtZW50KCk7ICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLkxBVEVTVF9CVVNJTkVTUyk7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgU3RyaW5nIHV1aWRTZXJ2aWNlS2V5ID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZKTsKLSAgICAgIExpc3RFbGVtZW50IHdzZGxVUkxMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKTsKLSAgICAgIFZlY3RvciBuYW1lTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgICAgVmVjdG9yIGRlc2NyaXB0aW9uTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TKTsKLSAgICAgIFZlY3RvciBjYXRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLQotICAgICAgU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKXdzZGxVUkxMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgIAotICAgICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpPTA7aTxuYW1lTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpbmFtZUxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgTmFtZSBuYW1lID0gKE5hbWUpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIG5hbWVWZWN0b3IuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgIH0KLQotICAgICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gbnVsbDsKLSAgICAgIGlmIChkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICBkZXNjcmlwdGlvblZlY3Rvci5hZGRFbGVtZW50KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBDYXRlZ29yeUJhZyBjYXRCYWcgPSBudWxsOwotICAgICAgaWYgKGNhdExpc3RFbGVtZW50VmVjdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNhdEJhZyA9IG5ldyBDYXRlZ29yeUJhZygpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxjYXRMaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpY2F0TGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgIGNhdEJhZy5hZGQoa3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICAJcmVnRWxlbWVudC5wZXJmb3JtTG9naW4ocHVibGlzaFVSTCx1c2VySWQscGFzc3dvcmQpOwotICAgICAgVURESVByb3h5IHByb3h5ID0gcmVnRWxlbWVudC5nZXRQcm94eSgpOwotCi0gICAgICAvLyBOb3RlOiBUaGUgSlNQIHdpbGwgcHJldmVudCB0aGlzIHJvdXRpbmUgZnJvbSBleGVjdXRpbmcgaWYgYmUgaXMgbnVsbC4KLSAgICAgIFVkZGk0akhlbHBlciB1ZGRpNGpIZWxwZXIgPSBuZXcgVWRkaTRqSGVscGVyKCk7Ci0gICAgICBEZWZpbml0aW9uIGRlZiA9IHVkZGk0akhlbHBlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgIAotICAgICAgLy8gUHVibGlzaC91cGRhdGUgdGhlIHNlcnZpY2UgaW50ZXJmYWNlcyBmaXJzdC4KLSAgICAgIFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uIHJlZ1B1Ymxpc2hTSUFjdGlvbiA9IG5ldyBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICBpbnQgY3VycmVudE5vZGVJZCA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpLmdldE5vZGVJZCgpOwotICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSByZWdOb2RlXy5nZXROb2RlTWFuYWdlcigpOwotCi0gICAgICBIYXNodGFibGUgdE1vZGVsc1RhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgVE1vZGVsW10gdE1vZGVscyA9IG51bGw7Ci0gICAgICBpZiAodWRkaTRqSGVscGVyLmlzTW9ub2xpdGhpY1dTREwoZGVmKSkKLSAgICAgIHsKLSAgICAgIAl0TW9kZWxzID0gbmV3IFRNb2RlbFsxXTsKLSAgICAgIAl0TW9kZWxzWzBdID0gdWRkaTRqSGVscGVyLm5ld1RNb2RlbCh3c2RsVVJMLCBkZWYpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCVN0cmluZ1tdIGltcG9ydHMgPSB1ZGRpNGpIZWxwZXIuZ2V0SW1wb3J0cyhkZWYsIHdzZGxVUkwpOwotICAgICAgCXRNb2RlbHMgPSBuZXcgVE1vZGVsW2ltcG9ydHMubGVuZ3RoXTsKLSAgICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHRNb2RlbHMubGVuZ3RoOyBpKyspCi0gICAgICAJICB0TW9kZWxzW2ldID0gdWRkaTRqSGVscGVyLm5ld1RNb2RlbChpbXBvcnRzW2ldKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHRNb2RlbHMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgIAlmb3IgKGludCBpPTA7aTx0TW9kZWxzLmxlbmd0aDtpKyspCi0gICAgICAJewotICAgICAgCSAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHJlZ1B1Ymxpc2hTSUFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUodWRkaTRqSGVscGVyLmdldFdTREwodE1vZGVsc1tpXSksIHRNb2RlbHNbaV0pOwotICAgICAgCSAgaWYgKGlucHV0c1ZhbGlkKQotICAgICAgCSAgewotICAgICAgCSAgICByZWdQdWJsaXNoU0lBY3Rpb24ucnVuKCk7Ci0gICAgICAJICAgIE9iamVjdCBzYXZlZFRNb2RlbCA9IHJlZ1B1Ymxpc2hTSUFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkuZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfT1VUUFVUX1NBVkVEX1RNT0RFTCk7Ci0gICAgICAJICAgIGlmIChzYXZlZFRNb2RlbCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgCSAgICAgIHRNb2RlbHNUYWJsZS5wdXQoKChUTW9kZWwpc2F2ZWRUTW9kZWwpLmdldE5hbWVTdHJpbmcoKSwgc2F2ZWRUTW9kZWwpOwotICAgICAgCSAgICB9Ci0gICAgICAgICAgICAvLyBSZXNlbGVjdCB0aGUgY3VycmVudCBub2RlLgotICAgICAgCSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChjdXJyZW50Tm9kZUlkKTsKLSAgICAgICAgICB9Ci0gICAgICAJfQotICAgICAgfQotICAgICAgCi0gICAgICBCdXNpbmVzc1NlcnZpY2UgYnVzU2VydmljZSA9IHVkZGk0akhlbHBlci5uZXdCdXNpbmVzc1NlcnZpY2Uod3NkbFVSTCwgZGVmLCB0TW9kZWxzVGFibGUpOwotICAgICAgaWYgKGlzVXBkYXRlXykKLSAgICAgICAgYnVzU2VydmljZS5zZXRTZXJ2aWNlS2V5KHV1aWRTZXJ2aWNlS2V5KTsKLSAgICAgIGJ1c1NlcnZpY2Uuc2V0QnVzaW5lc3NLZXkoYmUuZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgICBidXNTZXJ2aWNlLnNldE5hbWVWZWN0b3IobmFtZVZlY3Rvcik7Ci0gICAgICBidXNTZXJ2aWNlLnNldERlc2NyaXB0aW9uVmVjdG9yKGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICAgIGJ1c1NlcnZpY2Uuc2V0Q2F0ZWdvcnlCYWcoY2F0QmFnKTsKLSAgICAgIHJlZ0VsZW1lbnQuaGFuZGxlUHJlSW52b2NhdGlvbihidXNTZXJ2aWNlKTsgICAgICAKLSAgICAgIFZlY3RvciBic1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGJzVmVjdG9yLmFkZChidXNTZXJ2aWNlKTsKLSAgICAgIGJ1c1NlcnZpY2UgPSAoQnVzaW5lc3NTZXJ2aWNlKXByb3h5LnNhdmVfc2VydmljZShyZWdFbGVtZW50LmdldEF1dGhJbmZvU3RyaW5nKCksIGJzVmVjdG9yKS5nZXRCdXNpbmVzc1NlcnZpY2VWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICByZWZyZXNoTm9kZShidXNTZXJ2aWNlKTsKLSAgICAgIGlmIChpc1VwZGF0ZV8pCi0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX1VQREFURUQiLGJ1c1NlcnZpY2UuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSkpOwotICAgICAgZWxzZQotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRV9QVUJMSVNIRUQiLGJ1c1NlcnZpY2UuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJXU0RMRXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIsZSk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2FjdGlvbnMvVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlSW50ZXJmYWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDQwMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlSW50ZXJmYWNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLio7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuKjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuKjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb24gZXh0ZW5kcyBVcGRhdGVBY3Rpb24KLXsKLSAgcHJpdmF0ZSBib29sZWFuIGlzVXBkYXRlXzsKLSAgcHVibGljIFVwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcix0cnVlKTsKLSAgICBpc1VwZGF0ZV8gPSB0cnVlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzT3RoZXJzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcixGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSkgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgdXVpZEtleSA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSk7Ci0gICAgU3RyaW5nIHdzZGxVUkxNb2RpZmllZFN0YXRlID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLldTRExfVVJMX01PRElGSUVEKTsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICAgU3RyaW5nIG5hbWVNb2RpZmllZFN0YXRlID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLk5BTUVfTU9ESUZJRUQpOwotICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uVmlld0lkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5ERVNDUklQVElPTl9WSUVXSUQpOwotICAgIFN0cmluZ1tdIGRlc2NyaXB0aW9uTGFuZ3VhZ2VzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFKTsKLSAgICBTdHJpbmdbXSBkZXNjcmlwdGlvbnMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04pOwotICAgIFN0cmluZ1tdIGlkTW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuSURFTlRJRklFUl9NT0RJRklFRCk7Ci0gICAgU3RyaW5nW10gaWRWaWV3SWRzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLklERU5USUZJRVJfVklFV0lEKTsKLSAgICBTdHJpbmdbXSBpZFR5cGVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfVFlQRSk7Ci0gICAgU3RyaW5nW10gaWRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9OQU1FKTsKLSAgICBTdHJpbmdbXSBpZEtleVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9WQUxVRSk7Ci0gICAgU3RyaW5nW10gY2F0TW9kaWZpZWRTdGF0ZXMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfTU9ESUZJRUQpOwotICAgIFN0cmluZ1tdIGNhdFZpZXdJZHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVklFV0lEKTsKLSAgICBTdHJpbmdbXSBjYXRUeXBlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9UWVBFKTsKLSAgICBTdHJpbmdbXSBjYXRLZXlOYW1lcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSk7Ci0gICAgU3RyaW5nW10gY2F0S2V5VmFsdWVzID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSk7Ci0gICAgCi0gICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgCi0gICAgaWYgKHV1aWRLZXkgIT0gbnVsbCkKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZLHV1aWRLZXkpOwotICAgIAotICAgIGlmICh3c2RsVVJMTW9kaWZpZWRTdGF0ZSAhPSBudWxsICYmIHdzZGxVUkwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0RWxlbWVudCB3c2RsVVJMTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsgICAgICAKLSAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZih3c2RsVVJMTW9kaWZpZWRTdGF0ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICBpZiAoaXNNb2RpZmllZCkKLSAgICAgICAgd3NkbFVSTExpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHdzZGxVUkwpOwotICAgICAgZWxzZQotICAgICAgICB3c2RsVVJMID0gKFN0cmluZyl3c2RsVVJMTGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCx3c2RsVVJMTGlzdEVsZW1lbnQpOwotICAgICAgaWYgKCFWYWxpZGF0b3IudmFsaWRhdGVVUkwod3NkbFVSTCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGZvcm1Ub29sUEkuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkwiKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwpOwotICAgIAotICAgIGlmIChuYW1lTW9kaWZpZWRTdGF0ZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0RWxlbWVudCBuYW1lTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgICAgYm9vbGVhbiBpc01vZGlmaWVkID0gQm9vbGVhbi52YWx1ZU9mKG5hbWVNb2RpZmllZFN0YXRlKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIGlmIChpc01vZGlmaWVkKQotICAgICAgICBuYW1lTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQobmFtZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIG5hbWUgPSAoU3RyaW5nKW5hbWVMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUsbmFtZUxpc3RFbGVtZW50KTsKLSAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKG5hbWUpKQotICAgICAgewotICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICBmb3JtVG9vbFBJLmZsYWdFcnJvcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpOwotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfTkFNRSIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgIAotICAgIEhhc2h0YWJsZSBsYW5ndWFnZUhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgaWYgKGRlc2NyaXB0aW9uTW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBkZXNjcmlwdGlvblZpZXdJZHMgIT0gbnVsbCAmJiBkZXNjcmlwdGlvbkxhbmd1YWdlcyAhPSBudWxsICYmIGRlc2NyaXB0aW9ucyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBvbGREZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TKTsKLSAgICAgIFZlY3RvciBuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgU3RyaW5nW10gcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICBwYXJhbWV0ZXJzWzBdID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKTsKLSAgICAgIGxhbmd1YWdlSGFzaC5jbGVhcigpOwotICAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25zLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIHBhcmFtZXRlcnNbMV0gPSBTdHJpbmcudmFsdWVPZihpKzEpOwotICAgICAgICBEZXNjcmlwdGlvbiB1ZGRpNGpEZXNjcmlwdGlvbjsKLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICB1ZGRpNGpEZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbihkZXNjcmlwdGlvbnNbaV0sZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpNGpEZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbihkZXNjcmlwdGlvbnNbaV0pOwotICAgICAgICAgIGlmIChpICE9IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0UiLHBhcmFtZXRlcnMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlSGFzaC5nZXQoZGVzY3JpcHRpb25MYW5ndWFnZXNbaV0pICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRSIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBsYW5ndWFnZUhhc2gucHV0KGRlc2NyaXB0aW9uTGFuZ3VhZ2VzW2ldLEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKGRlc2NyaXB0aW9uc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGZvcm1Ub29sUEkuZmxhZ1Jvd0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGkpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVCIscGFyYW1ldGVycykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZGVzY3JpcHRpb25WaWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGRlc2NyaXB0aW9uVmlld0lkc1tpXSk7Ci0gICAgICAgIGJvb2xlYW4gaXNNb2RpZmllZCA9IEJvb2xlYW4udmFsdWVPZihkZXNjcmlwdGlvbk1vZGlmaWVkU3RhdGVzW2ldKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIAotICAgICAgICBpZiAoZGVzY3JpcHRpb25WaWV3SWQgPT0gLTEgfHwgaXNNb2RpZmllZCkKLSAgICAgICAgICBuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQobmV3IExpc3RFbGVtZW50KHVkZGk0akRlc2NyaXB0aW9uKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQob2xkRGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoZGVzY3JpcHRpb25WaWV3SWQpKTsKLSAgICAgIH0KLSAgICAgIHJlaW5kZXhMaXN0RWxlbWVudFZlY3RvcihuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyxuZXdEZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yKTsgICAgICAKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVtb3ZlUHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMpOwotICAgICAgCi0gICAgaWYgKGlkTW9kaWZpZWRTdGF0ZXMgIT0gbnVsbCAmJiBpZFZpZXdJZHMgIT0gbnVsbCAmJiBpZFR5cGVzICE9IG51bGwgJiYgaWRLZXlOYW1lcyAhPSBudWxsICYmIGlkS2V5VmFsdWVzICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIG9sZElkTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0gICAgICBWZWN0b3IgbmV3SWRMaXN0RWxlbWVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGlkS2V5TmFtZXMubGVuZ3RoO2krKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoaWRLZXlOYW1lc1tpXSxpZEtleVZhbHVlc1tpXSxpZFR5cGVzW2ldKTsKLSAgICAgICAgaW50IGlkVmlld0lkID0gSW50ZWdlci5wYXJzZUludChpZFZpZXdJZHNbaV0pOwotICAgICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YoaWRNb2RpZmllZFN0YXRlc1tpXSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChpZFZpZXdJZCA9PSAtMSB8fCBpc01vZGlmaWVkKQotICAgICAgICAgIG5ld0lkTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQoa3IpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld0lkTGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChvbGRJZExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpZFZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld0lkTGlzdEVsZW1lbnRWZWN0b3IpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMsbmV3SWRMaXN0RWxlbWVudFZlY3Rvcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlbW92ZVByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMpOwotICAgICAgCi0gICAgaWYgKGNhdE1vZGlmaWVkU3RhdGVzICE9IG51bGwgJiYgY2F0Vmlld0lkcyAhPSBudWxsICYmIGNhdFR5cGVzICE9IG51bGwgJiYgY2F0S2V5TmFtZXMgIT0gbnVsbCAmJiBjYXRLZXlWYWx1ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Igb2xkQ2F0TGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTKTsKLSAgICAgIFZlY3RvciBuZXdDYXRMaXN0RWxlbWVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGk9MDtpPGNhdFR5cGVzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gbmV3IEtleWVkUmVmZXJlbmNlKGNhdEtleU5hbWVzW2ldLGNhdEtleVZhbHVlc1tpXSxjYXRUeXBlc1tpXSk7Ci0gICAgICAgIGludCBjYXRWaWV3SWQgPSBJbnRlZ2VyLnBhcnNlSW50KGNhdFZpZXdJZHNbaV0pOwotICAgICAgICBib29sZWFuIGlzTW9kaWZpZWQgPSBCb29sZWFuLnZhbHVlT2YoY2F0TW9kaWZpZWRTdGF0ZXNbaV0pLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICBpZiAoY2F0Vmlld0lkID09IC0xIHx8IGlzTW9kaWZpZWQpCi0gICAgICAgICAgbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IuYWRkRWxlbWVudChuZXcgTGlzdEVsZW1lbnQoa3IpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld0NhdExpc3RFbGVtZW50VmVjdG9yLmFkZEVsZW1lbnQob2xkQ2F0TGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGNhdFZpZXdJZCkpOwotICAgICAgfQotICAgICAgcmVpbmRleExpc3RFbGVtZW50VmVjdG9yKG5ld0NhdExpc3RFbGVtZW50VmVjdG9yKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMsbmV3Q2F0TGlzdEVsZW1lbnRWZWN0b3IpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZW1vdmVQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMpOyAgICAgICAgICAgIAotICAgIHJldHVybiBpbnB1dHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJlZnJlc2hGcm9tUmVnaXN0cnkoKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyB1dWlkS2V5ID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSk7Ci0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIFRNb2RlbERldGFpbCB0TW9kZWxEZXRhaWwgPSBwcm94eS5nZXRfdE1vZGVsRGV0YWlsKHV1aWRLZXkpOwotICAgICAgVmVjdG9yIHRNb2RlbFZlY3RvciA9IHRNb2RlbERldGFpbC5nZXRUTW9kZWxWZWN0b3IoKTsKLSAgICAgIGlmICh0TW9kZWxWZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFVERElBY3Rpb25JbnB1dHMuTEFURVNUX09CSkVDVCx0TW9kZWxWZWN0b3IuZWxlbWVudEF0KDApKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChVRERJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gRmVlZGJhY2sgdmlhIEphdmFzY3JpcHQgcG9wdXBzLgotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gRmVlZGJhY2sgdmlhIEphdmFzY3JpcHQgcG9wdXBzLgotICAgIH0KLSAgICBpc1VwZGF0ZV8gPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyB1dWlkS2V5ID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSk7ICAgICAgCi0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotICAgICAgTGlzdEVsZW1lbnQgd3NkbFVSTExpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsKLSAgICAgIExpc3RFbGVtZW50IG5hbWVMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvbkxpc3RFbGVtZW50VmVjdG9yID0gKFZlY3Rvcilwcm9wZXJ0eVRhYmxlXy5nZXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMpOwotICAgICAgVmVjdG9yIGlkTGlzdEVsZW1lbnRWZWN0b3IgPSAoVmVjdG9yKXByb3BlcnR5VGFibGVfLmdldChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTKTsKLSAgICAgIFZlY3RvciBjYXRMaXN0RWxlbWVudFZlY3RvciA9IChWZWN0b3IpcHJvcGVydHlUYWJsZV8uZ2V0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyk7Ci0gICAgICAKLSAgICAgIFN0cmluZyB3c2RsVVJMID0gKFN0cmluZyl3c2RsVVJMTGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZyluYW1lTGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAKLSAgICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IG51bGw7Ci0gICAgICBpZiAoZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3RvciAhPSBudWxsKQotICAgICAgewotICAgICAgICBkZXNjcmlwdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvci5zaXplKCk7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZGVzY3JpcHRpb25MaXN0RWxlbWVudFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgZGVzY3JpcHRpb25WZWN0b3IuYWRkRWxlbWVudChkZXNjcmlwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgSWRlbnRpZmllckJhZyBpZEJhZyA9IG51bGw7Ci0gICAgICBpZiAoaWRMaXN0RWxlbWVudFZlY3RvciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZEJhZyA9IG5ldyBJZGVudGlmaWVyQmFnKCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGlkTGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICAgewotICAgICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWlkTGlzdEVsZW1lbnRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgICAgIGlkQmFnLmFkZChrcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgQ2F0ZWdvcnlCYWcgY2F0QmFnID0gbnVsbDsKLSAgICAgIGlmIChjYXRMaXN0RWxlbWVudFZlY3RvciAhPSBudWxsKQotICAgICAgewotICAgICAgICBjYXRCYWcgPSBuZXcgQ2F0ZWdvcnlCYWcoKTsKLSAgICAgICAgZm9yIChpbnQgaT0wO2k8Y2F0TGlzdEVsZW1lbnRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgICAgewotICAgICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWNhdExpc3RFbGVtZW50VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICAgICBjYXRCYWcuYWRkKGtyKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBUTW9kZWwgdE1vZGVsID0gKG5ldyBVZGRpNGpIZWxwZXIoKSkubmV3VE1vZGVsKHdzZGxVUkwpOwotICAgICAgaWYgKGlzVXBkYXRlXykKLSAgICAgICAgdE1vZGVsLnNldFRNb2RlbEtleSh1dWlkS2V5KTsKLSAgICAgIHRNb2RlbC5zZXROYW1lKG5hbWUpOyAgICAgIAotICAgICAgdE1vZGVsLnNldERlc2NyaXB0aW9uVmVjdG9yKGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICAgIHRNb2RlbC5zZXRJZGVudGlmaWVyQmFnKGlkQmFnKTsKLSAgICAgIHRNb2RlbC5zZXRDYXRlZ29yeUJhZyhjYXRCYWcpOwotICAgICAgCi0gICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZV8uZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICAgICAgIHJlZ0VsZW1lbnQucGVyZm9ybUxvZ2luKHB1Ymxpc2hVUkwsdXNlcklkLHBhc3N3b3JkKTsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IHJlZ0VsZW1lbnQuZ2V0UHJveHkoKTsKLSAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICB0TW9kZWxWZWN0b3IuYWRkKHRNb2RlbCk7Ci0gICAgICB0TW9kZWwgPSAoVE1vZGVsKXByb3h5LnNhdmVfdE1vZGVsKHJlZ0VsZW1lbnQuZ2V0QXV0aEluZm9TdHJpbmcoKSwgdE1vZGVsVmVjdG9yKS5nZXRUTW9kZWxWZWN0b3IoKS5nZXQoMCk7Ci0gICAgICByZWZyZXNoTm9kZSh0TW9kZWwpOwotICAgICAgaWYgKGlzVXBkYXRlXykgICAgICAKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VQREFURUQiLHRNb2RlbC5nZXROYW1lU3RyaW5nKCkpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1BVQkxJU0hFRCIsdE1vZGVsLmdldE5hbWVTdHJpbmcoKSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih1ZGRpUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJXU0RMRXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24odWRkaVBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVHJhbnNwb3J0RXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVERElFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0Q29udHJvbGxlcigpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoIlVERElFeGNlcHRpb24iKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHVkZGlQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvY29uc3RhbnRzL1VERElBY3Rpb25JbnB1dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2NvbnN0YW50cy9VRERJQWN0aW9uSW5wdXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTZkZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvY29uc3RhbnRzL1VERElBY3Rpb25JbnB1dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFVERElBY3Rpb25JbnB1dHMKLXsKLSAgLy8gT3BlblJlZ2lzdHJ5QWN0aW9uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0lTVFJZX05BTUUgPSAicmVnaXN0cnlOYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5RVUlSWV9VUkwgPSAiaW5xdWlyeVVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfVVJMID0gInB1Ymxpc2hVUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdJU1RSQVRJT05fVVJMID0gInJlZ2lzdHJhdGlvblVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTID0gImNoZWNrVXNlckRlZmluZWRDYXRlZ29yaWVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVURESV9VU0VSTkFNRSA9ICJ1ZGRpVXNlcm5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVRERJX1BBU1NXT1JEID0gInVkZGlQYXNzd29yZCI7Ci0KLSAgLy8gRml4ZWQgYW5kIHVzZXItZGVmaW5lZCBjYXRlZ29yaWVzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JJRVNfRElSRUNUT1JZID0gImNhdGVnb3JpZXNEaXJlY3RvcnkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9UTU9ERUxfS0VZID0gImNhdGVnb3J5VE1vZGVsS2V5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfRklMRU5BTUUgPSAiY2F0ZWdvcnlGaWxlTmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfREVGSU5FRF9DQVRFR09SSUVTID0gInVzZXJEZWZpbmVkQ2F0ZWdvcmllcyI7Ci0KLSAgLy8gRGlzY292ZXJ5IFVSTCB1c2UgdHlwZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDT1ZFUllfVVJMX1RZUEUgPSAiYnVzaW5lc3NFbnRpdHkiOwotCi0gIC8vIFJlc3VsdHMgKE5PREVJRCkKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERUlEX1NFUlZJQ0VfSU5URVJGQUNFID0gIm5vZGVJZF9TZXJ2aWNlSW50ZXJmYWNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERUlEX1NFUlZJQ0UgPSAibm9kZUlkX1NlcnZpY2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFSURfQlVTSU5FU1MgPSAibm9kZUlkX0J1c2luZXNzIjsKLQotICAvLyBSZWdGaW5kLi5BY3Rpb25zL1JlZ1B1Ymxpc2guLkFjdGlvbnMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfT1ZFUlJJREVfQUREX1FVRVJZX05PREUgPSAib3ZlcnJpZGVBZGRRdWVyeU5vZGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gInF1ZXJ5TmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lURU0gPSAicXVlcnlJdGVtIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFUllfSVRFTV9RVUVSSUVTID0gLTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVJZX0lURU1fQlVTSU5FU1NFUyA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVJZX0lURU1fU0VSVklDRVMgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVJZX1NUWUxFX1NJTVBMRSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVRVJZX1NUWUxFX0FEVkFOQ0VEID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFUllfU1RZTEVfVVVJRCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEID0gImFkdmFuY2VkT3duZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCA9ICJhZHZhbmNlZFB1Ymxpc2hVUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQgPSAiYWR2YW5jZWRVc2VySWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCA9ICJhZHZhbmNlZFBhc3N3b3JkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSA9ICJhZHZhbmNlZE5hbWVMYW5ndWFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUgPSAiYWR2YW5jZWROYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9UWVBFID0gImFkdmFuY2VkSWRlbnRpZmllclR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9OQU1FID0gImFkdmFuY2VkSWRlbnRpZmllcktleU5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9WQUxVRSA9ICJhZHZhbmNlZElkZW50aWZpZXJLZXlWYWx1ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX1RZUEUgPSAiYWR2YW5jZWRDYXRlZ29yeVR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSA9ICJhZHZhbmNlZENhdGVnb3J5S2V5TmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX0tFWV9WQUxVRSA9ICJhZHZhbmNlZENhdGVnb3J5S2V5VmFsdWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9ESVNDT1ZFUllVUkwgPSAiYWR2YW5jZWREaXNjb3ZlcnlVUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9GSU5EUVVBTElGSUVSID0gImFkdmFuY2VkRmluZFF1YWxpZmllciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NPUlRfQllfTkFNRSA9ICJhZHZhbmNlZFNvcnRCeU5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TT1JUX0JZX0RBVEUgPSAiYWR2YW5jZWRTb3J0QnlEYXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1NFQVJDSF9TRVQgPSAiYWR2YW5jZWRNYXhTZWFyY2hTZXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVSWV9NQVhfU0VBUkNIX1NFVCA9IDEwMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1JFU1VMVFMgPSAiYWR2YW5jZWRNYXhSZXN1bHRzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFUllfTUFYX1JFU1VMVFMgPSAxMDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9TVFlMRV9CVVNJTkVTU0VTID0gInF1ZXJ5U3R5bGVCdXNpbmVzc2VzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUgPSAic2ltcGxlQnVzaW5lc3NOYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfT1dORUQgPSAiYWR2YW5jZWRCdXNpbmVzc093bmVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMgPSAiYWR2YW5jZWRCdXNpbmVzc05hbWVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMgPSAiYWR2YW5jZWRCdXNpbmVzc0lkZW50aWZpZXJzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyA9ICJhZHZhbmNlZEJ1c2luZXNzQ2F0ZWdvcmllcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMgPSAiYWR2YW5jZWRCdXNpbmVzc0Rpc2NvdmVyeVVSTHMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVMgPSAiYWR2YW5jZWRCdXNpbmVzc1NlcnZpY2VJbnRlcmZhY2VzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFkgPSAiYWR2YW5jZWRCdXNpbmVzc1NlcnZpY2VJbnRlcmZhY2VzQ29weSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1RNT0RFTEJBRyA9ICJhZHZhbmNlZEJ1c2luZXNzVE1vZGVsQmFnIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRklORFFVQUxJRklFUlMgPSAiYWR2YW5jZWRCdXNpbmVzc0ZpbmRRdWFsaWZpZXJzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1NFQVJDSF9TRVQgPSAiYWR2YW5jZWRCdXNpbmVzc01heFNlYXJjaFNldCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX01BWF9SRVNVTFRTID0gImFkdmFuY2VkQnVzaW5lc3NNYXhSZXN1bHRzIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9TVFlMRV9TRVJWSUNFUyA9ICJxdWVyeVN0eWxlU2VydmljZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FID0gInNpbXBsZVNlcnZpY2VOYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9PV05FRCA9ICJhZHZhbmNlZFNlcnZpY2VPd25lZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1MgPSAiYWR2YW5jZWRTZXJ2aWNlQnVzaW5lc3MiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTX0NPUFkgPSAiYWR2YW5jZWRTZXJ2aWNlQnVzaW5lc3NDb3B5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSID0gImFkdmFuY2VkU2VydmljZVNlcnZpY2VQcm92aWRlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMgPSAiYWR2YW5jZWRTZXJ2aWNlTmFtZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMgPSAiYWR2YW5jZWRTZXJ2aWNlQ2F0ZWdvcmllcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTID0gImFkdmFuY2VkU2VydmljZVNlcnZpY2VJbnRlcmZhY2VzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSA9ICJhZHZhbmNlZFNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1RNT0RFTCA9ICJhZHZhbmNlZFNlcnZpY2VUTW9kZWwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1RNT0RFTEJBRyA9ICJhZHZhbmNlZFNlcnZpY2VUTW9kZWxCYWciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0ZJTkRRVUFMSUZJRVJTID0gImFkdmFuY2VkU2VydmljZUZpbmRRdWFsaWZpZXJzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfU0VBUkNIX1NFVCA9ICJhZHZhbmNlZFNlcnZpY2VNYXhTZWFyY2hTZXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9SRVNVTFRTID0gImFkdmFuY2VkU2VydmljZU1heFJlc3VsdHMiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyA9ICJxdWVyeVN0eWxlU2VydmljZUludGVyZmFjZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSA9ICJzaW1wbGVTZXJ2aWNlSW50ZXJmYWNlTmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1VTRV9TRVJWSUNFID0gImFkdmFuY2VkVXNlU2VydmljZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0UgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlU2VydmljZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0VfQ09QWSA9ICJhZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VTZXJ2aWNlQ29weSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0JVU0lORVNTX1NFUlZJQ0UgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlQnVzaW5lc3NTZXJ2aWNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfT1dORUQgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlT3duZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZU5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyA9ICJhZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VJZGVudGlmaWVycyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlQ2F0ZWdvcmllcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0ZJTkRRVUFMSUZJRVJTID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZUZpbmRRdWFsaWZpZXJzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1NFQVJDSF9TRVQgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlTWF4U2VhcmNoU2V0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1JFU1VMVFMgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlTWF4UmVzdWx0cyI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9SRUdJU1RSWV9OQU1FID0gImFkdmFuY2VkUmVnaXN0cnlOYW1lIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9VVUlEX0tFWSA9ICJ1dWlkS2V5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkgPSAidXVpZEJ1c2luZXNzS2V5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSA9ICJ1dWlkU2VydmljZUtleSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9JTlRFUkZBQ0VfS0VZID0gInV1aWRTZXJ2aWNlSW50ZXJmYWNlS2V5IjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX09VVFBVVF9TQVZFRF9UTU9ERUwgPSAic2F2ZWRUTW9kZWwiOwotCi0gIC8vIFN1YiBRdWVyaWVzOgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJRVUVSSUVTX1BST1BFUlRJRVMgPSAic3ViUXVlcmllc1Byb3BlcnRpZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJRVUVSWV9LRVkgPSAic3ViUXVlcnlLZXkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfU1VCUVVFUllfSU5JVElBVEVEID0gIm5ld1N1YlF1ZXJ5SW5pdGlhdGVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0gPSAibmV3U3ViUXVlcnlRdWVyeUl0ZW0iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RFRF9OT0RFSURTID0gInNlbGVjdGVkTm9kZUlkcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlFVRVJZX0xJU1RfS0VZID0gInN1YlF1ZXJ5TGlzdEtleSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlFVRVJZX0xJU1RfSVRFTUlEID0gInN1YlF1ZXJ5TGlzdEl0ZW1JZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfUkVTVUxUU19UQVJHRVQgPSAic2hvd1Jlc3VsdHNUYXJnZXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJRVUVSWV9HRVQgPSAic3ViUXVlcnlHZXQiOwotCi0gIC8vIFJlZ1B1Ymxpc2guLkFjdGlvbnMgKHNvbWUgY29uc3RhbnRzIGZyb20gdGhlIFJlZ0ZpbmQuLi5BY3Rpb25zIHdpbGwgYmUgcmV1c2VkLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfREVTQ1JJUFRJT04gPSAic2ltcGxlQnVzaW5lc3NEZXNjcmlwdGlvbiI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT05fTEFOR1VBR0UgPSAiYWR2YW5jZWREZXNjcmlwdGlvbkxhbmd1YWdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04gPSAiYWR2YW5jZWREZXNjcmlwdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyA9ICJhZHZhbmNlZEJ1c2luZXNzRGVzY3JpcHRpb25zIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9XU0RMX1VSTCA9ICJ3c2RsVVJMIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMID0gInNpbXBsZVNlcnZpY2VJbnRlcmZhY2VXU0RMVVJMIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OID0gInNpbXBsZVNlcnZpY2VJbnRlcmZhY2VEZXNjcmlwdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMID0gImFkdmFuY2VkU2VydmljZUludGVyZmFjZVdTRExVUkwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMgPSAiYWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlRGVzY3JpcHRpb25zIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUyA9ICJzaW1wbGVTZXJ2aWNlQnVzaW5lc3MiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTU19DT1BZID0gInNpbXBsZVNlcnZpY2VCdXNpbmVzc0NvcHkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9TRVJWSUNFX1BST1ZJREVSID0gInNpbXBsZVNlcnZpY2VTZXJ2aWNlUHJvdmlkZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9XU0RMX1VSTCA9ICJzaW1wbGVTZXJ2aWNlV1NETFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OID0gInNpbXBsZVNlcnZpY2VEZXNjcmlwdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwgPSAiYWR2YW5jZWRTZXJ2aWNlV1NETFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TID0gImFkdmFuY2VkU2VydmljZURlc2NyaXB0aW9ucyI7Ci0KLSAgLy8gV1NETCBCcm93c2VyCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1QgPSAicHJvamVjdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfVFlQRSA9ICJ3c2RsVHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdTRExfVFlQRV9TRVJWSUNFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCA9ICJ3ZWJQcm9qZWN0V1NETFVSTCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX0ZBVk9SSVRFX1dTRExfVVJMID0gImZhdm9yaXRlV1NETFVSTCI7Ci0KLSAgLy8gRGV0YWlscwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVRFU1RfT0JKRUNUID0gImxhdGVzdE9iamVjdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NPVkVSWVVSTF9NT0RJRklFRCA9ICJkaXNjb3ZlcnlVUkxNb2RpZmllZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NPVkVSWVVSTF9WSUVXSUQgPSAiZGlzY292ZXJ5VVJMVmlld0lkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9NT0RJRklFRCA9ICJuYW1lTW9kaWZpZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1ZJRVdJRCA9ICJidXNpbmVzc1ZpZXdJZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX01PRElGSUVEID0gImRlc2NyaXB0aW9uTW9kaWZpZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9WSUVXSUQgPSAiZGVzY3JpcHRpb25WaWV3SWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElGSUVSX01PRElGSUVEID0gImlkZW50aWZpZXJNb2RpZmllZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USUZJRVJfVklFV0lEID0gImlkZW50aWZpZXJWaWV3SWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9NT0RJRklFRCA9ICJjYXRlZ29yeU1vZGlmaWVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfVklFV0lEID0gImNhdGVnb3J5Vmlld0lkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9VUkxfTU9ESUZJRUQgPSAid3NkbFVSTE1vZGlmaWVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9BQ1RJT04gPSAicHVibGlzaEFjdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBVEVTVF9CVVNJTkVTUyA9ICJsYXRlc3RCdXNpbmVzcyI7Ci0KLSAgLy8gUmVmcmVzaCBhY3Rpb24KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGUkVTSF9OT0RFID0gInJlZnJlc2hOb2RlIjsKLQotICAvLyBNYW5hZ2UgUHVibGlzaGVyQXNzZXJ0aW9ucwotICAvLyAiVG8iIG1lYW5zIGZyb20gYW5vdGhlciBidXNpbmVzcyB0byBteSBvd25pbmcgYnVzaW5lc3MKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX1RPID0gMDsKLSAgLy8gIkZyb20iIG1lYW5zIGZyb20gbXkgb3duaW5nIGJ1c2luZXNzIHRvIGFub3RoZXIgYnVzaW5lc3MKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElSRUNUSU9OX0ZST00gPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVJfQVNTRVJUSU9OU19WSUVXSUQgPSAicHVibGlzaGVyQXNzZXJ0aW9uc1ZpZXdJZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUl9BU1NFUlRJT05TX1NFTEVDVEVEX0JVU19JRCA9ICJwdWJsaXNoZXJBc3NlcnRpb25zU2VsZWN0ZWRCdXNJRCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUl9BU1NFUlRJT05TX0RJUkVDVElPTiA9ICJwdWJsaXNoZXJBc3NlcnRpb25zRGlyZWN0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TID0gInF1ZXJ5SW5wdXRBZGRQdWJsaXNoZXJBc3NlcnRpb25zIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TX0NPUFkgPSAicXVlcnlJbnB1dEFkZFB1Ymxpc2hlckFzc2VydGlvbnNDb3B5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSU5QVVRfRVhJU1RJTkdfUFVCTElTSEVSX0FTU0VSVElPTlMgPSAicXVlcnlJbnB1dEV4aXN0aW5nUHVibGlzaGVyQXNzZXJ0aW9ucyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hFUl9BU1NFUlRJT05TX1RZUEUgPSAicHVibGlzaGVyQXNzZXJ0aW9uc1R5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVJfQVNTRVJUSU9OU19UWVBFX1BBUkVOVF9DSElMRCA9ICJwYXJlbnQtY2hpbGQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVJfQVNTRVJUSU9OU19UWVBFX1BFRVJfVE9fUEVFUiA9ICJwZWVyLXBlZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIRVJfQVNTRVJUSU9OU19UWVBFX0lERU5USVRZID0gImlkZW50aXR5IjsKLQotICAvLyBNYW5hZ2UgUmVmZXJlbmNlZCBTZXJ2aWNlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9JTlBVVF9SRUZFUkVOQ0VEX1NFUlZJQ0VTID0gInJlZmVyZW5jZWRTZXJ2aWNlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0lOUFVUX1NFUlZJQ0VTID0gInNlcnZpY2VzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OID0gIm1hbmFnZWRSZWZlcmVuY2VkU2VydmljZXNPcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19PUEVSQVRJT05fQUREID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OX1JFTU9WRSA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfU0VSVklDRV9TRUxFQ1RfU1RBVEUgPSAicmVmZXJlbmNlZFNlcnZpY2VTZWxlY3RTdGF0ZSI7Ci0gIAotICAvLyBSZXNpemVVRERJRnJhbWVBY3Rpb24KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UID0gImZyYW1lc2V0Q29sc1BlcnNwZWN0aXZlQ29udGVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIgPSAiZnJhbWVzZXRSb3dzQWN0aW9uc0NvbnRhaW5lciI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9jb25zdGFudHMvVURESUZyYW1lTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2NvbnN0YW50cy9VRERJRnJhbWVOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBmZmY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2NvbnN0YW50cy9VRERJRnJhbWVOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFVERElGcmFtZU5hbWVzCi17Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BVklHQVRPUl9DT05UQUlORVIgPSAidWRkaV9uYXZpZ2F0b3JfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFWSUdBVE9SX1RPT0xCQVIgPSAidWRkaV9uYXZpZ2F0b3JfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BVklHQVRPUl9DT05URU5UID0gInVkZGlfbmF2aWdhdG9yX2NvbnRlbnQiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05TX0NPTlRBSU5FUiA9ICJ1ZGRpX2FjdGlvbnNfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19DT05UQUlORVIgPSAidWRkaV9wcm9wZXJ0aWVzX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfVE9PTEJBUiA9ICJ1ZGRpX3Byb3BlcnRpZXNfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVNfQ09OVEVOVCA9ICJ1ZGRpX3Byb3BlcnRpZXNfY29udGVudCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRVU19DT05UQUlORVIgPSAidWRkaV9zdGF0dXNfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVFVTX1RPT0xCQVIgPSAidWRkaV9zdGF0dXNfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRVU19DT05URU5UID0gInVkZGlfc3RhdHVzX2NvbnRlbnQiOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JJRVNfV09SS0FSRUEgPSAiY2F0ZWdvcmllc193b3JrYXJlYSI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JJRVNfVE9PTEJBUiA9ICJjYXRlZ29yaWVzX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SSUVTX0NPTlRFTlQgPSAiY2F0ZWdvcmllc19jb250ZW50IjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2NvbnN0YW50cy9VRERJTW9kZWxDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2NvbnN0YW50cy9VRERJTW9kZWxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0NGZlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9jb25zdGFudHMvVURESU1vZGVsQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgVURESU1vZGVsQ29uc3RhbnRzCi17Ci0gIC8vIFJlZ2lzdHJpZXMgdW5kZXIgVURESU1haW4uCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9SRUdJU1RSSUVTID0gInJlZ2lzdHJpZXMiOwotCi0gIC8vIEV4ZWN1dGVkIFF1ZXJpZXMgZm9sZGVyIHVuZGVyIGEgcmVnaXN0cnkuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9RVUVSSUVTX1BBUkVOVCA9ICJxdWVyaWVzUGFyZW50IjsKLQotICAvLyBQdWJsaXNoZWQgQnVzaW5lc3NlcyBmb2xkZXIgdW5kZXIgYSByZWdpc3RyeS4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX1BVQkxJU0hFRF9CVVNJTkVTU0VTX1BBUkVOVCA9ICJwdWJsaXNoZWRCdXNpbmVzc2VzUGFyZW50IjsKLQotICAvLyBQdWJsaXNoZWQgU2VydmljZXMgZm9sZGVyIHVuZGVyIGEgcmVnaXN0cnkuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9QVUJMSVNIRURfU0VSVklDRVNfUEFSRU5UID0gInB1Ymxpc2hlZFNlcnZpY2VzUGFyZW50IjsKLQotICAvLyBQdWJsaXNoZWQgU2VydmljZSBpbnRlcmZhY2VzIGZvbGRlciB1bmRlciBhIHJlZ2lzdHJ5LgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUFVCTElTSEVEX1NFUlZJQ0VfSU5URVJGQUNFU19QQVJFTlQgPSAicHVibGlzaGVkU2VydmljZUludGVyZmFjZXNQYXJlbnQiOwotCi0gIC8vIFF1ZXJpZXMgdW5kZXIgdGhlIFF1ZXJpZXMgZm9sZGVyLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUVVFUklFUyA9ICJxdWVyaWVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTF9SRVNVTFRTID0gImluaXRpYWxSZXN1bHRzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfVFlQRSA9ICJxdWVyeVR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJRVUVSWV9UUkFOU0ZFUl9UQVJHRVQgPSAic3ViUXVlcnlUcmFuc2ZlclRhcmdldCI7Ci0KLSAgLy8gT2JqZWN0cyB1bmRlciBhIFF1ZXJ5IG5vZGUuCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTF9RVUVSWV9SRVNVTFRTID0gInF1ZXJ5UmVzdWx0cyI7Ci0KLSAgLy8gQ2F0ZWdvcmllcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfU1VCQ0FURUdPUklFUyA9ICJzdWJDYXRlZ29yaWVzIjsKLQotICAvLyBQdWJsaXNoZWQgaXRlbXMgaW5zaWRlIHRoZSBQdWJsaXNoZWQgaXRlbXMgZm9sZGVyLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfUFVCTElTSEVEX0lURU1TID0gInB1Ymxpc2hlZEl0ZW1zIjsKLQotICAvLyBCdXNpbmVzc2VzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0JVU0lORVNTX09XTkVEID0gImlzQnVzaW5lc3NPd25lZCI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQWJzdHJhY3RVRERJRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0Fic3RyYWN0VURESUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1NjJmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQWJzdHJhY3RVRERJRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VURESUVsZW1lbnQgZXh0ZW5kcyBUcmVlRWxlbWVudAotewotICBwdWJsaWMgQWJzdHJhY3RVRERJRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVHJlZUVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0UGFyZW50RWxlbWVudCh0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBUcmVlRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KFRyZWVFbGVtZW50IGNoaWxkKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGNoaWxkLmdldEVsZW1lbnRzKE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICByZXR1cm4gKFRyZWVFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBSZWdpc3RyeUVsZW1lbnQgZ2V0UmVnaXN0cnlFbGVtZW50KCkKLSAgewotICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUmVnaXN0cnlFbGVtZW50KQotICAgICAgcmV0dXJuIChSZWdpc3RyeUVsZW1lbnQpdGhpczsKLSAgICBlbHNlCi0gICAgewotICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gdGhpczsKLSAgICAgIFRyZWVFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBnZXRQYXJlbnRFbGVtZW50KGNoaWxkRWxlbWVudCk7Ci0gICAgICB3aGlsZSAocGFyZW50RWxlbWVudCAhPSBudWxsICYmIHBhcmVudEVsZW1lbnQgIT0gY2hpbGRFbGVtZW50KQotICAgICAgewotICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlZ2lzdHJ5RWxlbWVudCkKLSAgICAgICAgICByZXR1cm4gKFJlZ2lzdHJ5RWxlbWVudClwYXJlbnRFbGVtZW50OwotICAgICAgICBjaGlsZEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50OwotICAgICAgICBwYXJlbnRFbGVtZW50ID0gZ2V0UGFyZW50RWxlbWVudChjaGlsZEVsZW1lbnQpOwotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0J1c2luZXNzRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0J1c2luZXNzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ0ZWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9CdXNpbmVzc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci0KLXB1YmxpYyBjbGFzcyBCdXNpbmVzc0VsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFVERElFbGVtZW50Ci17Ci0gIHByaXZhdGUgQnVzaW5lc3NFbnRpdHkgYmVfOwotICBwcml2YXRlIExpc3RNYW5hZ2VyIHB1Ymxpc2hlckFzc2VydGlvbnNfOwotICAKLSAgcHVibGljIEJ1c2luZXNzRWxlbWVudChCdXNpbmVzc0VudGl0eSBiZSxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKGJlLmdldERlZmF1bHROYW1lU3RyaW5nKCksbW9kZWwpOwotICAgIGJlXyA9IGJlOwotICAgIHNldEtleShiZV8uZ2V0QnVzaW5lc3NLZXkoKSk7Ci0gICAgcHVibGlzaGVyQXNzZXJ0aW9uc18gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIEJ1c2luZXNzRW50aXR5IGdldEJ1c2luZXNzRW50aXR5KCkKLSAgewotICAgIHJldHVybiBiZV87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldEJ1c2luZXNzRW50aXR5KEJ1c2luZXNzRW50aXR5IGJlKQotICB7Ci0gICAgYmVfID0gYmU7Ci0gICAgc2V0S2V5KGJlXy5nZXRCdXNpbmVzc0tleSgpKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0TWFuYWdlciBnZXRQdWJsaXNoZXJBc3NlcnRpb25zKCkKLSAgewotICAgIHJldHVybiBwdWJsaXNoZXJBc3NlcnRpb25zXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlckFzc2VydGlvbnMoTGlzdE1hbmFnZXIgbGlzdE1hbmFnZXIpCi0gIHsKLSAgICBwdWJsaXNoZXJBc3NlcnRpb25zXyA9IGxpc3RNYW5hZ2VyOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0NhdGVnb3J5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0NhdGVnb3J5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzhjODdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9DYXRlZ29yeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFVERElFbGVtZW50Ci17Ci0gIHByaXZhdGUgS2V5ZWRSZWZlcmVuY2UgY2F0ZWdvcnlfOwotCi0gIHB1YmxpYyBDYXRlZ29yeUVsZW1lbnQoU3RyaW5nIG5hbWUsS2V5ZWRSZWZlcmVuY2UgY2F0ZWdvcnksTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1vZGVsKTsKLSAgICBjYXRlZ29yeV8gPSBjYXRlZ29yeTsKLSAgICBzYXZlQ2F0ZWdvcnlQcm9wZXJ0aWVzKCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgc2F2ZUNhdGVnb3J5UHJvcGVydGllcygpCi0gIHsKLSAgICBpZiAoY2F0ZWdvcnlfICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGtleU5hbWUgPSBjYXRlZ29yeV8uZ2V0S2V5TmFtZSgpOwotICAgICAgaWYgKGtleU5hbWUgIT0gbnVsbCkKLSAgICAgICAgc2V0TmFtZShrZXlOYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgS2V5ZWRSZWZlcmVuY2UgZ2V0Q2F0ZWdvcnkoKQotICB7Ci0gICAgcmV0dXJuIGNhdGVnb3J5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZUZvclRyZWUoKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIG5hbWVGb3JUcmVlID0gbmV3IFN0cmluZ0J1ZmZlcigiWyIpOwotICAgIG5hbWVGb3JUcmVlLmFwcGVuZChjYXRlZ29yeV8uZ2V0S2V5VmFsdWUoKSkuYXBwZW5kKCJdICIpLmFwcGVuZChjYXRlZ29yeV8uZ2V0S2V5TmFtZSgpKTsKLSAgICByZXR1cm4gbmFtZUZvclRyZWUudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHVwZGF0ZUNhdGVnb3J5KFN0cmluZyBrZXlOYW1lLFN0cmluZyBrZXlWYWx1ZSxTdHJpbmcgdE1vZGVsS2V5KQotICB7Ci0gICAgY2F0ZWdvcnlfLnNldEtleU5hbWUoa2V5TmFtZSk7Ci0gICAgY2F0ZWdvcnlfLnNldEtleVZhbHVlKGtleVZhbHVlKTsKLSAgICBjYXRlZ29yeV8uc2V0VE1vZGVsS2V5KHRNb2RlbEtleSk7Ci0gICAgc2F2ZUNhdGVnb3J5UHJvcGVydGllcygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQ2F0ZWdvcnlNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL0NhdGVnb3J5TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhMWJhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvQ2F0ZWdvcnlNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlNb2RlbCBleHRlbmRzIEJhc2ljTW9kZWwKLXsKLSAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBhcHBsaWNhdGlvbl87Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHREYXRhRmlsZV87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGNhdGVnb3J5RWxlbWVudHNfOwotICBwcml2YXRlIFN0cmluZyBjb2x1bW5EZWxpbWl0ZXJfOwotICBwcml2YXRlIFN0cmluZyBzdHJpbmdEZWxpbWl0ZXJfOwotICBwcml2YXRlIFN0cmluZyBjYXRlZ29yeUtleV87Ci0gIHByaXZhdGUgYm9vbGVhbiBjaGVja2VkXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWVfOwotICBwcml2YXRlIFN0cmluZyB0TW9kZWxLZXlfOwotICBwcml2YXRlIFRocm93YWJsZSBlcnJvckV4Y2VwdGlvbl87Ci0gIAotICAvLyBSZXR1cm4gY29kZXMgZm9yIGxvYWRpbmcgYW5kIHNhdmluZyBjYXRlZ29yeSBkYXRhLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgT1BFUkFUSU9OX1NVQ0NFU1NGVUwgPSAweDAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgRVJST1JfRklMRSA9IDB4MDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFUlJPUl9TRUNVUklUWSA9IDB4MDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFUlJPUl9FTkNPRElORyA9IDB4MDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFUlJPUl9JTyA9IDB4MDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFUlJPUl9DQVRFR09SWV9LRVkgPSAweDA1OwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVmYXVsdENvbHVtbkRlbGltaXRlcl8gPSAiIyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRTdHJpbmdEZWxpbWl0ZXJfID0gIlwiIjsKLSAgCi0gIHB1YmxpYyBDYXRlZ29yeU1vZGVsKCkKLSAgewotICAgIHN1cGVyKCJjYXRlZ29yaWVzIik7Ci0gICAgYXBwbGljYXRpb25fID0gbnVsbDsKLQlkZWZhdWx0RGF0YUZpbGVfID0gbnVsbDsKLSAgICBjb2x1bW5EZWxpbWl0ZXJfID0gZGVmYXVsdENvbHVtbkRlbGltaXRlcl87Ci0gICAgc3RyaW5nRGVsaW1pdGVyXyA9IGRlZmF1bHRTdHJpbmdEZWxpbWl0ZXJfOwotICAgIGNhdGVnb3J5RWxlbWVudHNfID0gbnVsbDsKLSAgICBjYXRlZ29yeUtleV8gPSBudWxsOwotICAgIGNoZWNrZWRfID0gdHJ1ZTsKLSAgICBkaXNwbGF5TmFtZV8gPSBudWxsOwotICAgIHRNb2RlbEtleV8gPSBudWxsOwotICAgIGVycm9yRXhjZXB0aW9uXyA9IG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYXRlZ29yeU1vZGVscyBsb2FkIHRoZWlyIGRhdGEgZnJvbSB0aGUgZmlsZSBuYW1lZCB2aWEgdGhlCi0gICAqIHtAbGluayAjc2V0RGVmYXVsdERhdGFGaWxlKFN0cmluZyl9IG1ldGhvZC4gVGhlIGRhdGEgZmlsZQotICAgKiBuYW1lIGlzIGludGVycHJldHRlZCBhcyBlaXRoZXIgYSBwaHlzaWNhbCBwYXRobmFtZSBvciBhCi0gICAqIGNvbnRleHQtcm9vdCByZWxhdGl2ZSBwYXRobmFtZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKLSAgICogc2VydmxldCBjb250ZXh0IG9yICJhcHBsaWNhdGlvbiIgaXMgbnVsbCAoZGVmYXVsdCkgb3Igbm90LgotICAgKiBAcGFyYW0gYXBwbGljYXRpb24gVGhlIGFwcGxpY2F0aW9uIGNvbnRleHQsIG51bGwgYnkgZGVmYXVsdC4KLSAgICogVmFsdWUgY2FuIGJlIHRoZSBTZXJ2bGV0Q29udGV4dCBvZiB0aGUgV1NFeHBsb3JlciBvciBudWxsLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2VydmxldENvbnRleHQoU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gIHsKLQlhcHBsaWNhdGlvbl8gPSBhcHBsaWNhdGlvbjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVmYXVsdERhdGFGaWxlKFN0cmluZyBkZWZhdWx0RGF0YUZpbGUpCi0gIHsKLSAgICBkZWZhdWx0RGF0YUZpbGVfID0gZGVmYXVsdERhdGFGaWxlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2F0ZWdvcnlLZXkoU3RyaW5nIGNhdGVnb3J5S2V5KQotICB7Ci0gICAgY2F0ZWdvcnlLZXlfID0gY2F0ZWdvcnlLZXk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q2F0ZWdvcnlLZXkoKQotICB7Ci0gICAgcmV0dXJuIGNhdGVnb3J5S2V5XzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q29sdW1uRGVsaW1pdGVyKFN0cmluZyBjb2x1bW5EZWxpbWl0ZXIpCi0gIHsKLSAgICBjb2x1bW5EZWxpbWl0ZXJfID0gY29sdW1uRGVsaW1pdGVyOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldENvbHVtbkRlbGltaXRlcigpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uRGVsaW1pdGVyXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0U3RyaW5nRGVsaW1pdGVyKFN0cmluZyBzdHJpbmdEZWxpbWl0ZXIpCi0gIHsKLSAgICBzdHJpbmdEZWxpbWl0ZXJfID0gc3RyaW5nRGVsaW1pdGVyOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0cmluZ0RlbGltaXRlcigpCi0gIHsKLSAgICByZXR1cm4gc3RyaW5nRGVsaW1pdGVyXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgZW5hYmxlQ2hlY2tlZChib29sZWFuIGlzQ2hlY2tlZCkKLSAgewotICAgIGNoZWNrZWRfID0gaXNDaGVja2VkOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NoZWNrZWQoKQotICB7Ci0gICAgcmV0dXJuIGNoZWNrZWRfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpCi0gIHsKLSAgICBkaXNwbGF5TmFtZV8gPSBkaXNwbGF5TmFtZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZGlzcGxheU5hbWVfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRUTW9kZWxLZXkoU3RyaW5nIHRNb2RlbEtleSkKLSAgewotICAgIHRNb2RlbEtleV8gPSB0TW9kZWxLZXk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VE1vZGVsS2V5KCkKLSAgewotICAgIHJldHVybiB0TW9kZWxLZXlfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RhdGFMb2FkZWQoKQotICB7Ci0gICAgcmV0dXJuIChjYXRlZ29yeUVsZW1lbnRzXyAhPSBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFRocm93YWJsZSBnZXRFcnJvckV4Y2VwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JFeGNlcHRpb25fOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbmNsb3NlZEluUXVvdGVzKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gc3RyaW5nLnN0YXJ0c1dpdGgoIlwiIikgJiYgc3RyaW5nLmVuZHNXaXRoKCJcIiIpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJ5dGUgbG9hZEZyb21EZWZhdWx0RGF0YUZpbGUoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGRlZmF1bHREYXRhRmlsZV8gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigpOwotCSAgQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCSAgaWYgKGFwcGxpY2F0aW9uXyA9PSBudWxsKQotCQliciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZWZhdWx0RGF0YUZpbGVfKSxIVE1MVXRpbHMuVVRGOF9FTkNPRElORykpOwotCSAgZWxzZQotCSAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYXBwbGljYXRpb25fLmdldFJlc291cmNlQXNTdHJlYW0oZGVmYXVsdERhdGFGaWxlXyksSFRNTFV0aWxzLlVURjhfRU5DT0RJTkcpKTsKLSAgICAgIHJldHVybiBsb2FkRGF0YShicik7Ci0gICAgfQotICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuIEVSUk9SX0ZJTEU7Ci0gICAgfQotICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGVycm9yRXhjZXB0aW9uXyA9IGU7Ci0gICAgICByZXR1cm4gRVJST1JfU0VDVVJJVFk7Ci0gICAgfQotICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZXJyb3JFeGNlcHRpb25fID0gZTsKLSAgICAgIHJldHVybiBFUlJPUl9FTkNPRElORzsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBieXRlIGxvYWRGcm9tRGVsaW1pdGVyRmlsZSgpCi0gIHsKLSAgICAvLyBHZXQgdGhlIGFzc29jaWF0ZWQgLnByb3BlcnRpZXMgZmlsZSBhbmQgc2V0IHRoZSBkZWxpbWl0ZXJzLiBUaGUgZGVmYXVsdERhdGFGaWxlXyBpcyBzZXQgdG8gdGhlIGRlbGltaXRlciBmaWxlIGluIHRoaXMgY2FzZS4KLSAgICAvLyBUaGUgcHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcga2V5czoKLSAgICAvLyB3c2FkLmRhdGFGaWxlIC0gbG9jYXRpb24gb2YgdGhlIGNhdGVnb3J5IGRhdGEgZmlsZS4KLSAgICAvLyB3c2FkLmNoZWNrZWQgLSB3aGV0aGVyIG9yIG5vdCB0aGUgY2F0ZWdvcnkgaXMgY2hlY2tlZC4KLSAgICAvLyB3c2FkLm5hbWUgLSB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjYXRlZ29yeS4KLSAgICAvLyBjb2x1bW4uZGVsaW1pdGVyIC0gdGhlIGRlbGltaXRlciBjaGFyYWN0ZXIgdXNlZCBmb3Igc2VwYXJhdGluZyBjb2x1bW5zLgotICAgIC8vIHN0cmluZy5kZWxpbWl0ZXIgLSB0aGUgZGVsaW1pdGVyIGNoYXJhY3RlciB1c2VkIHRvIGVuY2Fwc3VsYXRlIGRhdGEgc3VjaCB0aGF0IGNvbHVtbiBkZWxpbWl0ZXIgY2hhcmFjdGVycyBhcmUgdHJlYXRlZCBhcyBkYXRhLgotICAgIHRyeQotICAgIHsKLSAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICBJbnB1dFN0cmVhbSBmaW4gPSBudWxsOwotCSAgaWYgKGFwcGxpY2F0aW9uXyA9PSBudWxsKQotCSAgICBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGRlZmF1bHREYXRhRmlsZV8pOwotCSAgZWxzZQotCQlmaW4gPSBhcHBsaWNhdGlvbl8uZ2V0UmVzb3VyY2VBc1N0cmVhbShkZWZhdWx0RGF0YUZpbGVfKTsKLSAgICAgIHAubG9hZChmaW4pOwotICAgICAgZmluLmNsb3NlKCk7Ci0gICAgICBjb2x1bW5EZWxpbWl0ZXJfID0gcC5nZXRQcm9wZXJ0eSgiY29sdW1uLmRlbGltaXRlciIpOwotICAgICAgc3RyaW5nRGVsaW1pdGVyXyA9IHAuZ2V0UHJvcGVydHkoInN0cmluZy5kZWxpbWl0ZXIiKTsKLSAgICAgIGRlZmF1bHREYXRhRmlsZV8gPSBwLmdldFByb3BlcnR5KCJ3c2FkLmRhdGFGaWxlIik7Ci0gICAgICByZXR1cm4gbG9hZEZyb21EZWZhdWx0RGF0YUZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGVycm9yRXhjZXB0aW9uXyA9IGU7Ci0gICAgICByZXR1cm4gRVJST1JfRklMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZXJyb3JFeGNlcHRpb25fID0gZTsKLSAgICAgIHJldHVybiBFUlJPUl9TRUNVUklUWTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZXJyb3JFeGNlcHRpb25fID0gZTsKLSAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9ICAgICAgICAKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJ5dGUgbG9hZERhdGEoQnVmZmVyZWRSZWFkZXIgYnIpCi0gIHsKLSAgICBlcnJvckV4Y2VwdGlvbl8gPSBudWxsOwotICAgIENhdGVnb3J5RWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0gICAgY2F0ZWdvcnlFbGVtZW50c18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgYnl0ZSByZXR1cm5Db2RlID0gT1BFUkFUSU9OX1NVQ0NFU1NGVUw7Ci0gICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgIGludCBsaW5lTnVtYmVyID0gMDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBjaGFyIGNvbHVtbkRlbGltaXRlckNoYXIgPSBjb2x1bW5EZWxpbWl0ZXJfLmNoYXJBdCgwKTsKLSAgICAgIGNoYXIgc3RyaW5nRGVsaW1pdGVyQ2hhciA9IHN0cmluZ0RlbGltaXRlcl8uY2hhckF0KDApOwotICAgICAgVmVjdG9yIHZhbHVlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIHdoaWxlKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGluZU51bWJlcisrOwotICAgICAgICAvLyBJZ25vcmUgYmxhbmsgbGluZXMuCi0gICAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgdG9rZW5Db3VudCA9IDA7Ci0gICAgICAgIGludCBsZW5ndGggPSBsaW5lLmxlbmd0aCgpOwotICAgICAgICBib29sZWFuIGluU3RyaW5nRGVsaW1pdGVycyA9IGZhbHNlOwotICAgICAgICB2YWx1ZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGN1cnJlbnRUb2tlbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciBjdXJyZW50Q2hhciA9IGxpbmUuY2hhckF0KGluZGV4KTsKLSAgICAgICAgICBpZiAoaW5TdHJpbmdEZWxpbWl0ZXJzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEluIHF1b3RlIHNvIGlnbm9yaW5nIGRlbGltaXRlcnMKLSAgICAgICAgICAgIGlmIChjdXJyZW50Q2hhciA9PSBzdHJpbmdEZWxpbWl0ZXJDaGFyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggLSAxKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY3VycmVudENoYXIgY291bGQgYmUgYSBjbG9zaW5nIHN0cmluZyBkZWxpbWl0ZXIgb3IgZXNjYXBlCi0gICAgICAgICAgICAgICAgLy8gTmVlZCB0byBsb29rIGFoZWFkIHRvIGJlIHN1cmUuLi4KLSAgICAgICAgICAgICAgICBjaGFyIGZvbGxvd2luZ0NoYXIgPSBsaW5lLmNoYXJBdChpbmRleCArIDEpOwotICAgICAgICAgICAgICAgIGlmIChmb2xsb3dpbmdDaGFyID09IHN0cmluZ0RlbGltaXRlckNoYXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgYW4gZXNjYXBlZCBxdW90ZQotICAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLmFwcGVuZChzdHJpbmdEZWxpbWl0ZXJDaGFyKTsKLSAgICAgICAgICAgICAgICAgIC8vIGp1bXAgZm9yd2FyZCB0d28gY2hhcmFjdGVycy4KLSAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBUaGVyZSB3YXMgYSBjbG9zaW5nIHN0cmluZyBkZWxpbWl0ZXIuLi5qdW1wIGZvcndhcmQgdG8gdGhlIG5leHQgZGVsaW1pdGVyCi0gICAgICAgICAgICAgICAgICBpblN0cmluZ0RlbGltaXRlcnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIC8vbG9vayBmb3IgdGhlIG5leHQgY29sdW1uIGRlbGltaXRlciBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAgIGludCBuZXh0RGVsaW1pdGVyID0gbGluZS5pbmRleE9mKGNvbHVtbkRlbGltaXRlckNoYXIsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgIGlmIChuZXh0RGVsaW1pdGVyID09IC0xKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSB3ZXJlIG5vIG1vcmUgZGVsaW1pdGVycyBzbyBicmVhayBvdXQgb2YgdGhlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGRFbGVtZW50KGN1cnJlbnRUb2tlbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgLy92YWx1ZXNbdG9rZW5Db3VudCsrXSA9IGN1cnJlbnRUb2tlbi50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgICAgICBpblN0cmluZ0RlbGltaXRlcnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBuZXh0RGVsaW1pdGVyICsgMTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgYW5kIGl0J3MgYSBjbG9zaW5nIHN0cmluZyBkZWxpbWl0ZXIuCi0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBpblN0cmluZ0RlbGltaXRlcnMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjdXJyZW50VG9rZW4uYXBwZW5kKGN1cnJlbnRDaGFyKTsKLSAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY3VycmVudENoYXIgPT0gY29sdW1uRGVsaW1pdGVyQ2hhcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGVyZSB3YXMgYSBkZWxpbWl0ZXIgb3V0c2lkZSBvZiBxdW90ZXMKLSAgICAgICAgICAgIHZhbHVlcy5hZGRFbGVtZW50KGN1cnJlbnRUb2tlbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIC8vdmFsdWVzW3Rva2VuQ291bnQrK10gPSBjdXJyZW50VG9rZW4udG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChjdXJyZW50Q2hhciA9PSBzdHJpbmdEZWxpbWl0ZXJDaGFyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEEgcXVvdGUgYXBwZWFyaW5nIG91dHNpZGUgb2YgcXVvdGVzIG11c3QgYmUgYSBvcGVuaW5nIHF1b3RlCi0gICAgICAgICAgICBpblN0cmluZ0RlbGltaXRlcnMgPSB0cnVlOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgbm9ybWFsIGNoYXIgb3V0c2lkZSBvZiBxdW90ZXMKLSAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5hcHBlbmQoY3VycmVudENoYXIpOwotICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRXhwZWN0IHRva2VuIGNvdW50IHRvIGJlIHZhbHVlcy5sZW5ndGggLSAxIGF0IHRoaXMgcG9pbnQgaWYgZXZlcnl0aGluZyBpcyBvawotICAgICAgICBpZiAoaW5TdHJpbmdEZWxpbWl0ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24obGluZSxsaW5lTnVtYmVyKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWRkIHRoZSBmaW5hbCB0b2tlbi4KLSAgICAgICAgdmFsdWVzLmFkZEVsZW1lbnQoY3VycmVudFRva2VuLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIC8vIDMgY29sdW1ucyBmb3JtYXQuIEZyb20gbGVmdCB0byByaWdodCwgdGhlc2UgYXJlOgotICAgICAgICAvLyAxKSBjYXRlZ29yeSdzIGtleSB2YWx1ZQotICAgICAgICAvLyAyKSBjYXRlZ29yeSdzIGtleSBuYW1lCi0gICAgICAgIC8vIDMpIGNhdGVnb3J5J3MgcGFyZW50IGtleSB2YWx1ZQotICAgICAgICAvLyBDb252ZXJ0IHRvIDQgY29sdW1ucyBmb3JtYXQuCi0gICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID09IDMpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2F0ZWdvcnlLZXlfICE9IG51bGwpCi0gICAgICAgICAgICB2YWx1ZXMuaW5zZXJ0RWxlbWVudEF0KGNhdGVnb3J5S2V5XywgMCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFsdWVzLmluc2VydEVsZW1lbnRBdCh0TW9kZWxLZXlfLCAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDQgY29sdW1ucyBmb3JtYXQuIEZyb20gbGVmdCB0byByaWdodCwgdGhlc2UgYXJlOgotICAgICAgICAvLyAxKSB0eXBlIG9mIGNhdGVnb3J5IChjYXRlZ29yeUtleSkKLSAgICAgICAgLy8gMikgY2F0ZWdvcnkncyBrZXkgdmFsdWUKLSAgICAgICAgLy8gMykgY2F0ZWdvcnkncyBrZXkgbmFtZQotICAgICAgICAvLyA0KSBjYXRlZ29yeSdzIHBhcmVudCBrZXkgdmFsdWUKLSAgICAgICAgaWYgKHZhbHVlcy5zaXplKCkgPT0gNCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjYXRlZ29yeUtleSA9IChTdHJpbmcpdmFsdWVzLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgICBpZiAoY2F0ZWdvcnlLZXlfID09IG51bGwpCi0gICAgICAgICAgICBjYXRlZ29yeUtleV8gPSBjYXRlZ29yeUtleTsKLSAgICAgICAgICBlbHNlIGlmICghY2F0ZWdvcnlLZXlfLmVxdWFscyhjYXRlZ29yeUtleSkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGNhdGVnb3J5S2V5KTsKLSAgICAgICAgICBTdHJpbmcga2V5VmFsdWUgPSAoU3RyaW5nKXZhbHVlcy5lbGVtZW50QXQoMSk7Ci0gICAgICAgICAgU3RyaW5nIGtleU5hbWUgPSAoU3RyaW5nKXZhbHVlcy5lbGVtZW50QXQoMik7Ci0gICAgICAgICAgU3RyaW5nIHBhcmVudEtleVZhbHVlID0gKFN0cmluZyl2YWx1ZXMuZWxlbWVudEF0KDMpOwotICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJvb3RFbGVtZW50ID0gbmV3IENhdGVnb3J5RWxlbWVudChkaXNwbGF5TmFtZV8sbnVsbCx0aGlzKTsKLSAgICAgICAgICAgIHNldFJvb3RFbGVtZW50KHJvb3RFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlzRW5jbG9zZWRJblF1b3RlcyhrZXlOYW1lKSkKLSAgICAgICAgICAgIGtleU5hbWUgPSBrZXlOYW1lLnN1YnN0cmluZygxLGtleU5hbWUubGVuZ3RoKCktMSk7Ci0gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIENhdGVnb3J5RWxlbWVudCBhbHJlYWR5IGV4aXN0cy4gSWYgaXQgZG9lcywgcmVmcmVzaCB0aGUgQ2F0ZWdvcnkuCi0gICAgICAgICAgQ2F0ZWdvcnlFbGVtZW50IGNhdGVnb3J5RWxlbWVudCA9IChDYXRlZ29yeUVsZW1lbnQpY2F0ZWdvcnlFbGVtZW50c18uZ2V0KGtleVZhbHVlKTsKLSAgICAgICAgICBpZiAoY2F0ZWdvcnlFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICBjYXRlZ29yeUVsZW1lbnQudXBkYXRlQ2F0ZWdvcnkoa2V5TmFtZSxrZXlWYWx1ZSx0TW9kZWxLZXlfKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjYXRlZ29yeUVsZW1lbnQgPSBuZXcgQ2F0ZWdvcnlFbGVtZW50KGtleU5hbWUsbmV3IEtleWVkUmVmZXJlbmNlKGtleU5hbWUsa2V5VmFsdWUsdE1vZGVsS2V5XyksdGhpcyk7Ci0gICAgICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50OwotICAgICAgICAgIGlmIChwYXJlbnRLZXlWYWx1ZS5lcXVhbHMoa2V5VmFsdWUpKQotICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IHJvb3RFbGVtZW50OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCljYXRlZ29yeUVsZW1lbnRzXy5nZXQocGFyZW50S2V5VmFsdWUpOwotICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFyZW50RWxlbWVudCA9IG5ldyBDYXRlZ29yeUVsZW1lbnQoInRlbXAiLG5ldyBLZXllZFJlZmVyZW5jZSgiIixwYXJlbnRLZXlWYWx1ZSx0TW9kZWxLZXlfKSx0aGlzKTsKLSAgICAgICAgICAgIGNhdGVnb3J5RWxlbWVudHNfLnB1dChwYXJlbnRLZXlWYWx1ZSxwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jb25uZWN0KGNhdGVnb3J5RWxlbWVudCxVRERJTW9kZWxDb25zdGFudHMuUkVMX1NVQkNBVEVHT1JJRVMsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgICBjYXRlZ29yeUVsZW1lbnRzXy5wdXQoa2V5VmFsdWUsY2F0ZWdvcnlFbGVtZW50KTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24obGluZSxsaW5lTnVtYmVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnIuY2xvc2UoKTsKLSAgICAgIHJldHVybiByZXR1cm5Db2RlOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuQ29kZSA9IEVSUk9SX0lPOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuQ29kZSA9IEVSUk9SX0ZJTEU7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgcmV0dXJuQ29kZSA9IEVSUk9SX0NBVEVHT1JZX0tFWTsKLSAgICB9Ci0gICAgY2F0ZWdvcnlFbGVtZW50c18gPSBudWxsOwotICAgIHJldHVybiByZXR1cm5Db2RlOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHZvaWQgc2F2ZURhdGEoUHJpbnRXcml0ZXIgcHcsQ2F0ZWdvcnlFbGVtZW50IGNhdGVnb3J5RWxlbWVudCxDYXRlZ29yeUVsZW1lbnQgcGFyZW50RWxlbWVudCxib29sZWFuIGlzRmlyc3QpCi0gIHsKLSAgICAvLyBGaWxlIGZvcm1hdDoKLSAgICAvLyA8Y2F0ZWdvcnlLZXk+IzxrZXlWYWx1ZT4jPGtleU5hbWU+IzxwYXJlbnRLZXlWYWx1ZT4KLSAgICBLZXllZFJlZmVyZW5jZSBrciA9IGNhdGVnb3J5RWxlbWVudC5nZXRDYXRlZ29yeSgpOwotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgbm90IHRoZSByb290IGVsZW1lbnQuCi0gICAgaWYgKGtyICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGtleU5hbWUgPSBrci5nZXRLZXlOYW1lKCk7Ci0gICAgICBTdHJpbmcga2V5VmFsdWUgPSBrci5nZXRLZXlWYWx1ZSgpOwotICAgICAgU3RyaW5nIHBhcmVudEtleVZhbHVlOwotICAgICAgaWYgKHBhcmVudEVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgcGFyZW50S2V5VmFsdWUgPSBrZXlWYWx1ZTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2UgcGFyZW50S3IgPSBwYXJlbnRFbGVtZW50LmdldENhdGVnb3J5KCk7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgaXMgdGhlIHJvb3QgZWxlbWVudC4KLSAgICAgICAgaWYgKHBhcmVudEtyID09IG51bGwpCi0gICAgICAgICAgcGFyZW50S2V5VmFsdWUgPSBrZXlWYWx1ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBhcmVudEtleVZhbHVlID0gcGFyZW50S3IuZ2V0S2V5VmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGlmICghaXNGaXJzdCkKLSAgICAgICAgcHcucHJpbnRsbigpOwotICAgICAgZWxzZQotICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7Ci0gICAgICBwdy5wcmludChtYW5nbGUoY2F0ZWdvcnlLZXlfKSk7Ci0gICAgICBwdy5wcmludChjb2x1bW5EZWxpbWl0ZXJfKTsKLSAgICAgIHB3LnByaW50KG1hbmdsZShrZXlWYWx1ZSkpOwotICAgICAgcHcucHJpbnQoY29sdW1uRGVsaW1pdGVyXyk7Ci0gICAgICBwdy5wcmludChtYW5nbGUoa2V5TmFtZSkpOwotICAgICAgcHcucHJpbnQoY29sdW1uRGVsaW1pdGVyXyk7Ci0gICAgICBwdy5wcmludChtYW5nbGUocGFyZW50S2V5VmFsdWUpKTsKLSAgICB9Ci0gICAgRW51bWVyYXRpb24gZSA9IGNhdGVnb3J5RWxlbWVudC5nZXRFbGVtZW50cyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1NVQkNBVEVHT1JJRVMpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgewotICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHNhdmVEYXRhKHB3LChDYXRlZ29yeUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpLGNhdGVnb3J5RWxlbWVudCxpc0ZpcnN0KTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8vIE1hbmdsZSBhbiBpbnB1dCBzdHJpbmcgaWYgaXQgY29udGFpbnMgZGVmYXVsdCBjb2x1bW4gZGVsaW1pdGVyIGNoYXJhY3RlcnMgYnkgc3Vycm91bmRpbmcgaXQgd2l0aCB0aGUgc3RyaW5nIGRlbGltaXRlcnMuCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIG1hbmdsZShTdHJpbmcgaW5wdXQpCi0gIHsKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5pbmRleE9mKGNvbHVtbkRlbGltaXRlcl8pICE9IC0xKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcihpbnB1dCk7Ci0gICAgICBzLmluc2VydCgwLHN0cmluZ0RlbGltaXRlcl8pLmFwcGVuZChzdHJpbmdEZWxpbWl0ZXJfKTsKLSAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dDsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJ5dGUgc2F2ZURhdGEoU3RyaW5nIGZpbGVOYW1lKQotICB7Ci0gICAgLy8gVGhlIGZpbGVOYW1lIHNob3VsZCBhbHJlYWR5IGJlIFVSTEVuY29kZWQuCi0gICAgYnl0ZSByZXR1cm5Db2RlID0gT1BFUkFUSU9OX1NVQ0NFU1NGVUw7Ci0gICAgZXJyb3JFeGNlcHRpb25fID0gbnVsbDsKLSAgICBpZiAoaXNEYXRhTG9hZGVkKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpLEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKSx0cnVlKTsKLSAgICAgICAgQ2F0ZWdvcnlFbGVtZW50IHJvb3RFbGVtZW50ID0gKENhdGVnb3J5RWxlbWVudClnZXRSb290RWxlbWVudCgpOwotICAgICAgICBzYXZlRGF0YShwdyxyb290RWxlbWVudCxudWxsLHRydWUpOwotICAgICAgICBwdy5mbHVzaCgpOwotICAgICAgICBwdy5jbG9zZSgpOwotICAgICAgICAvLyBTYXZlIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0gICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHAuc2V0UHJvcGVydHkoIndzYWQuZGF0YUZpbGUiLGZpbGVOYW1lKTsKLSAgICAgICAgcC5zZXRQcm9wZXJ0eSgid3NhZC5jaGVja2VkIixTdHJpbmcudmFsdWVPZihjaGVja2VkXykpOwotICAgICAgICBwLnNldFByb3BlcnR5KCJ3c2FkLm5hbWUiLGRpc3BsYXlOYW1lXyk7Ci0gICAgICAgIHAuc2V0UHJvcGVydHkoImNvbHVtbi5kZWxpbWl0ZXIiLGNvbHVtbkRlbGltaXRlcl8pOwotICAgICAgICBwLnNldFByb3BlcnR5KCJzdHJpbmcuZGVsaW1pdGVyIixzdHJpbmdEZWxpbWl0ZXJfKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHByb3BlcnRpZXNGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZU5hbWUuc3Vic3RyaW5nKDAsZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSkpOwotICAgICAgICBwcm9wZXJ0aWVzRmlsZU5hbWUuYXBwZW5kKCIucHJvcGVydGllcyIpOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIHAuc3RvcmUoZm91dCxudWxsKTsKLSAgICAgICAgZm91dC5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgICByZXR1cm5Db2RlID0gRVJST1JfRklMRTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgICByZXR1cm5Db2RlID0gRVJST1JfU0VDVVJJVFk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBlcnJvckV4Y2VwdGlvbl8gPSBlOwotICAgICAgICByZXR1cm5Db2RlID0gRVJST1JfRU5DT0RJTkc7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZXJyb3JFeGNlcHRpb25fID0gZTsKLSAgICAgICAgcmV0dXJuQ29kZSA9IEVSUk9SX0lPOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuQ29kZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gZGlzcGxheU5hbWVfOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1B1Ymxpc2hlZEl0ZW1zRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1B1Ymxpc2hlZEl0ZW1zRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDk0MzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9QdWJsaXNoZWRJdGVtc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVkSXRlbXNFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RVRERJRWxlbWVudAotewotICBwdWJsaWMgUHVibGlzaGVkSXRlbXNFbGVtZW50KGludCB0eXBlLFN0cmluZyBuYW1lLE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIobmFtZSxtb2RlbCk7Ci0gICAgc2V0UHJvcGVydHlBc1N0cmluZyhNb2RlbENvbnN0YW50cy5SRUxfQ0hJTERSRU4sVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVMpOwotICAgIHNldFByb3BlcnR5QXNTdHJpbmcoVURESU1vZGVsQ29uc3RhbnRzLlFVRVJZX1RZUEUsU3RyaW5nLnZhbHVlT2YodHlwZSkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGdldFByb3BlcnR5QXNTdHJpbmcoVURESU1vZGVsQ29uc3RhbnRzLlFVRVJZX1RZUEUpKTsKLSAgfQotCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRJdGVtcygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1B1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU4MGRkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUHVibGlzaGVyQXNzZXJ0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmFzc2VydGlvbi5QdWJsaXNoZXJBc3NlcnRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudDsKLQotcHVibGljIGNsYXNzIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQgewotCi0gIC8vIG93bmluZ0J1c2luZXNzS2V5XyBpcyB0aGUga2V5IG9mIHRoZSBidXNpbmVzcyBlbGVtZW50IHRoYXQgb3ducyB0aGlzCi0gIC8vIHB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQKLSAgcHJpdmF0ZSBTdHJpbmcgZnJvbUtleV87Ci0gIHByaXZhdGUgU3RyaW5nIHRvS2V5XzsKLSAgcHJpdmF0ZSBTdHJpbmcgb3duaW5nQnVzaW5lc3NLZXlfOwotCi0gIC8vIHRoZSBvdGhlciBidXNpbmVzcyB0aGF0IHRoZSBjb250YWluaW5nIGJ1c2luZXNzIGlzIGFzc2VydGVkIGZyb20gb3IgdG8KLSAgcHJpdmF0ZSBMaXN0RWxlbWVudCBzcF87Ci0gIHByaXZhdGUgaW50IHN1YlF1ZXJ5SXRlbUlkXzsKLQotICAvLyBzdGF0dXMgb2YgdGhpcyBwdWJsaXNoZXJBc3NlcnRpb24KLSAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzXzsKLSAgcHJpdmF0ZSBLZXllZFJlZmVyZW5jZSBrZXllZFJlZmVyZW5jZV87Ci0KLSAgcHVibGljIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQoU3RyaW5nIGZyb21LZXksIFN0cmluZyB0b0tleSwgU3RyaW5nIG93bmluZ0J1c2luZXNzS2V5LCBMaXN0RWxlbWVudCBzcCwgaW50IHN1YlF1ZXJ5SXRlbUlkLCBTdHJpbmcgc3RhdHVzLCBLZXllZFJlZmVyZW5jZSBrZXllZFJlZikgewotICAgIGZyb21LZXlfID0gZnJvbUtleTsKLSAgICB0b0tleV8gPSB0b0tleTsKLSAgICBvd25pbmdCdXNpbmVzc0tleV8gPSBvd25pbmdCdXNpbmVzc0tleTsKLSAgICBzcF8gPSBzcDsKLSAgICBzdWJRdWVyeUl0ZW1JZF8gPSBzdWJRdWVyeUl0ZW1JZDsKLSAgICBzdGF0dXNfID0gc3RhdHVzOwotICAgIGtleWVkUmVmZXJlbmNlXyA9IGtleWVkUmVmOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RnJvbUtleShTdHJpbmcgZnJvbUtleSkgewotICAgIGZyb21LZXlfID0gZnJvbUtleTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RnJvbUtleSgpIHsKLSAgICByZXR1cm4gZnJvbUtleV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUb0tleShTdHJpbmcgdG9LZXkpIHsKLSAgICB0b0tleV8gPSB0b0tleTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VG9LZXkoKSB7Ci0gICAgcmV0dXJuIHRvS2V5XzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE93bmluZ0J1c2luZXNzS2V5KFN0cmluZyBrZXkpIHsKLSAgICBvd25pbmdCdXNpbmVzc0tleV8gPSBrZXk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE93bmluZ0J1c2luZXNzS2V5KCkgewotICAgIHJldHVybiBvd25pbmdCdXNpbmVzc0tleV87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUHJvdmlkZXIoTGlzdEVsZW1lbnQgc3ApIHsKLSAgICBzcF8gPSBzcDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0RWxlbWVudCBnZXRTZXJ2aWNlUHJvdmlkZXIoKSB7Ci0gICAgcmV0dXJuIHNwXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFN1YlF1ZXJ5SXRlbUlkKGludCBpZCkgewotICAgIHN1YlF1ZXJ5SXRlbUlkXyA9IGlkOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRTdWJRdWVyeUl0ZW1JZCgpIHsKLSAgICByZXR1cm4gc3ViUXVlcnlJdGVtSWRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdGF0dXMpIHsKLSAgICBzdGF0dXNfID0gc3RhdHVzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7Ci0gICAgcmV0dXJuIHN0YXR1c187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRLZXllZFJlZihLZXllZFJlZmVyZW5jZSBrZXllZFJlZikgewotICAgIGtleWVkUmVmZXJlbmNlXyA9IGtleWVkUmVmOwotICB9Ci0KLSAgcHVibGljIEtleWVkUmVmZXJlbmNlIGdldEtleWVkUmVmKCkgewotICAgIHJldHVybiBrZXllZFJlZmVyZW5jZV87Ci0gIH0KLQotICBwdWJsaWMgUHVibGlzaGVyQXNzZXJ0aW9uIGdldFB1Ymxpc2hlckFzc2VydGlvbigpIHsKLSAgICBpZiAoZnJvbUtleV8gPT0gbnVsbCB8fAotICAgICAgICB0b0tleV8gPT0gbnVsbCB8fAotICAgICAgICBrZXllZFJlZmVyZW5jZV8gPT0gbnVsbCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgUHVibGlzaGVyQXNzZXJ0aW9uIHB1YkFzc2VydGlvbiA9IG5ldyBQdWJsaXNoZXJBc3NlcnRpb24oZnJvbUtleV8sIHRvS2V5Xywga2V5ZWRSZWZlcmVuY2VfKTsKLSAgICByZXR1cm4gcHViQXNzZXJ0aW9uOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9RdWVyeUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9RdWVyeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmODI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUXVlcnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RVRERJRWxlbWVudAotewotICBwcml2YXRlIGZpbmFsIHZvaWQgaW5pdFF1ZXJ5UHJvcGVydGllcyhpbnQgaXRlbVR5cGUsT2JqZWN0W10gcmVzdWx0cykKLSAgewotICAgIFZlY3RvciByZXN1bHRzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDtpPHJlc3VsdHMubGVuZ3RoO2krKykKLSAgICAgIHJlc3VsdHNWZWN0b3IuYWRkRWxlbWVudChyZXN1bHRzW2ldKTsKLSAgICBzZXRQcm9wZXJ0eUFzU3RyaW5nKE1vZGVsQ29uc3RhbnRzLlJFTF9DSElMRFJFTixVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJZX1JFU1VMVFMpOwotICAgIHNldFByb3BlcnR5QXNPYmplY3QoVURESU1vZGVsQ29uc3RhbnRzLklOSVRJQUxfUkVTVUxUUyxyZXN1bHRzVmVjdG9yKTsKLSAgICBzZXRQcm9wZXJ0eUFzU3RyaW5nKFVERElNb2RlbENvbnN0YW50cy5RVUVSWV9UWVBFLFN0cmluZy52YWx1ZU9mKGl0ZW1UeXBlKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBRdWVyeUVsZW1lbnQoQnVzaW5lc3NFbnRpdHlbXSBzcExpc3QsU3RyaW5nIG5hbWUsTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1vZGVsKTsKLSAgICBpbml0UXVlcnlQcm9wZXJ0aWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTLHNwTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgUXVlcnlFbGVtZW50KEJ1c2luZXNzU2VydmljZVtdIGJzTGlzdCxTdHJpbmcgbmFtZSxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIGluaXRRdWVyeVByb3BlcnRpZXMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTLGJzTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgUXVlcnlFbGVtZW50KFRNb2RlbFtdIHRNb2RlbExpc3QsU3RyaW5nIG5hbWUsTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1vZGVsKTsKLSAgICBpbml0UXVlcnlQcm9wZXJ0aWVzKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMsdE1vZGVsTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFF1ZXJ5VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChnZXRQcm9wZXJ0eUFzU3RyaW5nKFVERElNb2RlbENvbnN0YW50cy5RVUVSWV9UWVBFKSk7Ci0gIH0KLQotICBwdWJsaWMgUXVlcnlQYXJlbnRFbGVtZW50IGdldFF1ZXJ5UGFyZW50RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gKFF1ZXJ5UGFyZW50RWxlbWVudClnZXRQYXJlbnRFbGVtZW50KCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUXVlcnlQYXJlbnRFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUXVlcnlQYXJlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MTQ4NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1F1ZXJ5UGFyZW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeVBhcmVudEVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFVERElFbGVtZW50Ci17Ci0gIHB1YmxpYyBRdWVyeVBhcmVudEVsZW1lbnQoU3RyaW5nIG5hbWUsTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLG1vZGVsKTsKLSAgICBzZXRQcm9wZXJ0eUFzU3RyaW5nKE1vZGVsQ29uc3RhbnRzLlJFTF9DSElMRFJFTixVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJJRVMpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFF1ZXJpZXMoKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnRzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUklFUyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9SZWdpc3RyeUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9SZWdpc3RyeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk0OTc2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvUmVnaXN0cnlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuKjsKLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQXV0aFRva2VuOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuKjsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotcHVibGljIGNsYXNzIFJlZ2lzdHJ5RWxlbWVudCBleHRlbmRzIEFic3RyYWN0VURESUVsZW1lbnQKLXsKLSAgcHJpdmF0ZSBmaW5hbCBsb25nIEFVVEhfSU5GT19USU1FT1VUID0gMzAwMDAwMDsKLSAgcHJpdmF0ZSBVRERJUHJveHkgcHJveHlfOwotICBwcml2YXRlIGxvbmcgYXV0aFRva2VuVGltZXN0YW1wXzsKLSAgcHJpdmF0ZSBBdXRoVG9rZW4gYXV0aFRva2VuXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaWRfOwotICBwcml2YXRlIFN0cmluZyBwYXNzd29yZF87Ci0gIHByaXZhdGUgU3RyaW5nIGlucXVpcnlVUkxfOwotICBwcml2YXRlIFN0cmluZyBwdWJsaXNoVVJMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgY2FjaGVkUHVibGlzaFVSTF87Ci0gIHByaXZhdGUgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTF87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHVzZXJEZWZpbmVkQ2F0ZWdvcmllc187Ci0gIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllc187Ci0gIHByaXZhdGUgU3RyaW5nIGNhdGVnb3JpZXNEaXJlY3RvcnlfOwotCi0gIHB1YmxpYyBSZWdpc3RyeUVsZW1lbnQoVURESVByb3h5IHByb3h5LCBTdHJpbmcgaW5xdWlyeVVSTCwgU3RyaW5nIG5hbWUsIE1vZGVsIG1vZGVsKQotICB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHByb3h5XyA9IHByb3h5OwotICAgIGlucXVpcnlVUkxfID0gaW5xdWlyeVVSTDsKLSAgICBwdWJsaXNoVVJMXyA9IG51bGw7Ci0gICAgYXV0aFRva2VuVGltZXN0YW1wXyA9IC0xOwotICAgIGF1dGhUb2tlbl8gPSBudWxsOwotICAgIGlkXyA9IG51bGw7Ci0gICAgcGFzc3dvcmRfID0gbnVsbDsKLSAgICBjYWNoZWRQdWJsaXNoVVJMXyA9IG51bGw7Ci0gICAgcmVnaXN0cmF0aW9uVVJMXyA9IG51bGw7Ci0gICAgdXNlckRlZmluZWRDYXRlZ29yaWVzXyA9IG51bGw7Ci0gICAgY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXNfID0gZmFsc2U7Ci0gICAgY2F0ZWdvcmllc0RpcmVjdG9yeV8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFVERElQcm94eSBnZXRQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHlfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRJbnF1aXJ5VVJMKCkKLSAgewotICAgIHJldHVybiBpbnF1aXJ5VVJMXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBRdWVyeVBhcmVudEVsZW1lbnQgZ2V0UXVlcnlQYXJlbnRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiAoUXVlcnlQYXJlbnRFbGVtZW50KSAoZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTX1BBUkVOVCkubmV4dEVsZW1lbnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgUHVibGlzaGVkSXRlbXNFbGVtZW50IGdldFB1Ymxpc2hlZEJ1c2luZXNzZXNFbGVtZW50KCkKLSAgewotICAgIHJldHVybiAoUHVibGlzaGVkSXRlbXNFbGVtZW50KSAoZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfQlVTSU5FU1NFU19QQVJFTlQpLm5leHRFbGVtZW50KCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBnZXRQdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChQdWJsaXNoZWRJdGVtc0VsZW1lbnQpIChnZXRFbGVtZW50cyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9TRVJWSUNFU19QQVJFTlQpLm5leHRFbGVtZW50KCkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBnZXRQdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlc0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIChQdWJsaXNoZWRJdGVtc0VsZW1lbnQpIChnZXRFbGVtZW50cyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9TRVJWSUNFX0lOVEVSRkFDRVNfUEFSRU5UKS5uZXh0RWxlbWVudCgpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1Mb2dpbihTdHJpbmcgcHVibGlzaFVSTCwgU3RyaW5nIHVzZXJJZCwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uLCBVRERJRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgewotICAgIHB1Ymxpc2hVUkxfID0gcHVibGlzaFVSTDsKLSAgICBwcm94eV8uc2V0UHVibGlzaFVSTChOZXRVdGlscy5jcmVhdGVVUkwocHVibGlzaFVSTCkpOwotICAgIGF1dGhUb2tlbl8gPSBwcm94eV8uZ2V0X2F1dGhUb2tlbih1c2VySWQsIHBhc3N3b3JkKTsKLSAgICBhdXRoVG9rZW5UaW1lc3RhbXBfID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgaWRfID0gdXNlcklkOwotICAgIHBhc3N3b3JkXyA9IHBhc3N3b3JkOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBdXRoSW5mb1N0cmluZygpCi0gIHsKLSAgICBpZiAoIWlzTG9nZ2VkSW4oKSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIGlmICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBhdXRoVG9rZW5UaW1lc3RhbXBfKSA+IEFVVEhfSU5GT19USU1FT1VUKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBhdXRoVG9rZW5fID0gcHJveHlfLmdldF9hdXRoVG9rZW4oaWRfLCBwYXNzd29yZF8pOwotICAgICAgICBhdXRoVG9rZW5UaW1lc3RhbXBfID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhdXRoVG9rZW5fLmdldEF1dGhJbmZvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0xvZ2dlZEluKCkKLSAgewotICAgIHJldHVybiBhdXRoVG9rZW5fICE9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDYWNoZWRQdWJsaXNoVVJMKFN0cmluZyBwdWJsaXNoVVJMKQotICB7Ci0gICAgY2FjaGVkUHVibGlzaFVSTF8gPSBwdWJsaXNoVVJMOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQdWJsaXNoVVJMKCkKLSAgewotICAgIGlmIChpc0xvZ2dlZEluKCkgJiYgcHVibGlzaFVSTF8gIT0gbnVsbCkKLSAgICAgIHJldHVybiBwdWJsaXNoVVJMXzsKLSAgICByZXR1cm4gY2FjaGVkUHVibGlzaFVSTF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRSZWdpc3RyYXRpb25VUkwoU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCkKLSAgewotICAgIHJlZ2lzdHJhdGlvblVSTF8gPSByZWdpc3RyYXRpb25VUkw7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFJlZ2lzdHJhdGlvblVSTCgpCi0gIHsKLSAgICByZXR1cm4gcmVnaXN0cmF0aW9uVVJMXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VXNlcklkKCkKLSAgewotICAgIHJldHVybiBpZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRVc2VySWQoU3RyaW5nIHVzZXJJZCkKLSAgewotICAgIGlkXyA9IHVzZXJJZDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q3JlZCgpCi0gIHsKLSAgICByZXR1cm4gcGFzc3dvcmRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q3JlZChTdHJpbmcgY3JlZCkKLSAgewotICAgIHBhc3N3b3JkXyA9IGNyZWQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoSGFzaHRhYmxlIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcykKLSAgewotICAgIHVzZXJEZWZpbmVkQ2F0ZWdvcmllc18gPSB1c2VyRGVmaW5lZENhdGVnb3JpZXM7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgRW51bWVyYXRpb24gZ2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKCkKLSAgewotICAgIGlmICh1c2VyRGVmaW5lZENhdGVnb3JpZXNfICE9IG51bGwpCi0gICAgICByZXR1cm4gdXNlckRlZmluZWRDYXRlZ29yaWVzXy5lbGVtZW50cygpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIENhdGVnb3J5TW9kZWwgZ2V0VXNlckRlZmluZWRDYXRlZ29yeShTdHJpbmcgdE1vZGVsS2V5KQotICB7Ci0gICAgcmV0dXJuIChDYXRlZ29yeU1vZGVsKSB1c2VyRGVmaW5lZENhdGVnb3JpZXNfLmdldCh0TW9kZWxLZXkpOwotICB9Ci0KLSAgLy8gU3BlY2lhbCBoYW5kbGVyIHRvIGJlIGludm9rZWQgYmVmb3JlIHNlbmRpbmcgYSBtZXNzYWdlIHRvIHRoZSByZWdpc3RyeS4KLSAgcHVibGljIGZpbmFsIHZvaWQgaGFuZGxlUHJlSW52b2NhdGlvbihCdXNpbmVzc1NlcnZpY2UgYnVzU2VydmljZSkKLSAgewotICAgIC8vIEZvciBYTWV0aG9kcywgYnVzaW5lc3Mgc2VydmljZXMgbXVzdCBjb250YWluIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm06Ci0gICAgLy8gSU1QTEVNRU5UQVRJT046IGlibXdzCi0gICAgaWYgKGdldElucXVpcnlVUkwoKS5lcXVhbHMoImh0dHA6Ly91ZGRpLnhtZXRob2RzLm5ldC9pbnF1aXJlIikpCi0gICAgewotICAgICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gYnVzU2VydmljZS5nZXREZXNjcmlwdGlvblZlY3RvcigpOwotICAgICAgaWYgKGRlc2NyaXB0aW9uVmVjdG9yID09IG51bGwpCi0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgYm9vbGVhbiBjb250YWluc0ltcGxlbWVudGF0aW9uRGVzY3JpcHRpb24gPSBmYWxzZTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRpb25WZWN0b3Iuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKSBkZXNjcmlwdGlvblZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgIGlmIChkZXNjcmlwdGlvbi5nZXRUZXh0KCkuc3RhcnRzV2l0aCgiSU1QTEVNRU5UQVRJT046ICIpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGFpbnNJbXBsZW1lbnRhdGlvbkRlc2NyaXB0aW9uID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFjb250YWluc0ltcGxlbWVudGF0aW9uRGVzY3JpcHRpb24pCi0gICAgICB7Ci0gICAgICAgIGRlc2NyaXB0aW9uVmVjdG9yLmFkZEVsZW1lbnQobmV3IERlc2NyaXB0aW9uKCJJTVBMRU1FTlRBVElPTjogaWJtd3MiKSk7Ci0gICAgICAgIGJ1c1NlcnZpY2Uuc2V0RGVzY3JpcHRpb25WZWN0b3IoZGVzY3JpcHRpb25WZWN0b3IpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldENoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzKGJvb2xlYW4gY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXMpCi0gIHsKLSAgICBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllc18gPSBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllczsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldENoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzKCkKLSAgewotICAgIHJldHVybiBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllc187Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXRlZ29yaWVzRGlyZWN0b3J5KFN0cmluZyBkaXJlY3RvcnkpCi0gIHsKLSAgICBjYXRlZ29yaWVzRGlyZWN0b3J5XyA9IGRpcmVjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q2F0ZWdvcmllc0RpcmVjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gY2F0ZWdvcmllc0RpcmVjdG9yeV87Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvU2VydmljZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9TZXJ2aWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmY1NTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9TZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuQnVzaW5lc3NTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFVERElFbGVtZW50Ci17Ci0gIHByaXZhdGUgQnVzaW5lc3NTZXJ2aWNlIGJzXzsKLSAgCi0gIHB1YmxpYyBTZXJ2aWNlRWxlbWVudChCdXNpbmVzc1NlcnZpY2UgYnMsTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihicy5nZXREZWZhdWx0TmFtZVN0cmluZygpLG1vZGVsKTsKLSAgICBzZXRLZXkoYnMuZ2V0U2VydmljZUtleSgpKTsKLSAgICBic18gPSBiczsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIEJ1c2luZXNzU2VydmljZSBnZXRCdXNpbmVzc1NlcnZpY2UoKQotICB7Ci0gICAgcmV0dXJuIGJzXzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9TZXJ2aWNlSW50ZXJmYWNlRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1NlcnZpY2VJbnRlcmZhY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjlhY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvZGF0YW1vZGVsL1NlcnZpY2VJbnRlcmZhY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RVRERJRWxlbWVudAotewotICBwcml2YXRlIFRNb2RlbCB0TW9kZWxfOwotICAgIAotICBwdWJsaWMgU2VydmljZUludGVyZmFjZUVsZW1lbnQoVE1vZGVsIHRNb2RlbCxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKHRNb2RlbC5nZXROYW1lU3RyaW5nKCksbW9kZWwpOwotICAgIHRNb2RlbF8gPSB0TW9kZWw7Ci0gICAgc2V0S2V5KHRNb2RlbC5nZXRUTW9kZWxLZXkoKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgVE1vZGVsIGdldFRNb2RlbCgpCi0gIHsKLSAgICByZXR1cm4gdE1vZGVsXzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9VRERJTWFpbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL2RhdGFtb2RlbC9VRERJTWFpbkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhNzkzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9kYXRhbW9kZWwvVURESU1haW5FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgVURESU1haW5FbGVtZW50IGV4dGVuZHMgVHJlZUVsZW1lbnQKLXsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcmVnaXN0cnlOYW1lc187Ci0KLSAgcHVibGljIFVERElNYWluRWxlbWVudChTdHJpbmcgbmFtZSxNb2RlbCBtb2RlbCkKLSAgewotICAgIHN1cGVyKG5hbWUsbW9kZWwpOwotICAgIHJlZ2lzdHJ5TmFtZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnNSZWdpc3RyeU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gKHJlZ2lzdHJ5TmFtZXNfLmdldChuYW1lKSAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFkZFJlZ2lzdHJ5TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJlZ2lzdHJ5TmFtZXNfLnB1dChuYW1lLEJvb2xlYW4uVFJVRSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVSZWdpc3RyeU5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICByZWdpc3RyeU5hbWVzXy5yZW1vdmUobmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhclJlZ2lzdHJ5TmFtZXMoKQotICB7Ci0gICAgcmVnaXN0cnlOYW1lc18uY2xlYXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvQWRkVG9GYXZvcml0ZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9BZGRUb0Zhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0MjIyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9BZGRUb0Zhdm9yaXRlc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBBZGRUb0Zhdm9yaXRlc1Rvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgQWRkVG9GYXZvcml0ZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2Zhdm9yaXRlc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZmF2b3JpdGVzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9CdXNQdWJsaXNoU2VydmljZVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0J1c1B1Ymxpc2hTZXJ2aWNlVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDVhZGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0J1c1B1Ymxpc2hTZXJ2aWNlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQnVzUHVibGlzaFNlcnZpY2VUb29sIGV4dGVuZHMgRm9ybVRvb2wgaW1wbGVtZW50cyBNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZQotewotICBwcml2YXRlIFJlZ0ZpbmRUb29sIHJlZ0ZpbmRUb29sXzsKLQotICBwdWJsaWMgQnVzUHVibGlzaFNlcnZpY2VUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwidWRkaS9pbWFnZXMvcHVibGlzaF9zZXJ2aWNlX2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvcHVibGlzaF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiIsYWx0KTsKLSAgICByZWdGaW5kVG9vbF8gPSBuZXcgUmVnRmluZFRvb2wobmV3IFRvb2xNYW5hZ2VyKHRvb2xNYW5hZ2VyLmdldE5vZGUoKSksICIiKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLQotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZLCIiKTsKLQotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMpKTsKLSAgICBTdHJpbmcgc2ltcGxlU3R5bGVTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0KLSAgICAvLyBSZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbiBpbnB1dHMKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1dTRExfVVJMLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUsIiIpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfREVTQ1JJUFRJT04sIiIpOwotCi0gICAgLy8gUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbiBpbnB1dHMKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwsIiIpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcmVnRWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSByZWdFbGVtZW50LmdldENyZWQoKTsKLQotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgaWYgKHVzZXJJZCA9PSBudWxsKQotICAgICAgdXNlcklkID0gIiI7Ci0gICAgaWYgKHBhc3N3b3JkID09IG51bGwpCi0gICAgICBwYXNzd29yZCA9ICIiOwotCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIHJlZ0ZpbmRUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGdldEZvcm1Ub29sUHJvcGVydGllcyhPYmplY3Qgc3ViUXVlcnlLZXlPYmplY3QpCi0gIHsKLSAgICAvLyBFbXB0eS9Ob24tZXhpc3RlbnQgc3VicXVlcnlrZXkgaW1wbGllcyBwdWJsaXNoIGZvcm0uIEFsbCBlbHNlIGltcGxpZXMgcXVlcnkgZm9ybS4KLSAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKXN1YlF1ZXJ5S2V5T2JqZWN0OwotICAgIGlmIChzdWJRdWVyeUtleSA9PSBudWxsIHx8IHN1YlF1ZXJ5S2V5Lmxlbmd0aCgpIDwgMSkKLSAgICAgIHJldHVybiB0aGlzOwotICAgIGVsc2UKLSAgICAgIHJldHVybiByZWdGaW5kVG9vbF8uZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5T2JqZWN0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKWdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICByZXR1cm4gU2VsZWN0RmluZFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxzdWJRdWVyeUtleSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgT2JqZWN0IHN1YlF1ZXJ5S2V5T2JqZWN0ID0gZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IG51bGw7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5T2JqZWN0ICE9IG51bGwpCi0gICAgewotICAgICAgSGFzaHRhYmxlIHN1YlF1ZXJpZXNQcm9wZXJ0aWVzID0gKEhhc2h0YWJsZSlnZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJJRVNfUFJPUEVSVElFUyk7Ci0gICAgICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2Ugc3ViUXVlcnlQcm9wZXJ0aWVzID0gZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5T2JqZWN0KTsKLSAgICAgIE9iamVjdCBzdWJRdWVyeUdldE9iamVjdCA9IHN1YlF1ZXJ5UHJvcGVydGllcy5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCk7Ci0gICAgICBpZiAoc3ViUXVlcnlHZXRPYmplY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBpc1N1YlF1ZXJ5R2V0ID0gKChCb29sZWFuKXN1YlF1ZXJ5R2V0T2JqZWN0KS5ib29sZWFuVmFsdWUoKTsKLSAgICAgICAgaWYgKGlzU3ViUXVlcnlHZXQpCi0gICAgICAgICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL0dldEZvcm0uanNwIjsKLSAgICAgIH0KLSAgICAgIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylzdWJRdWVyeUtleU9iamVjdDsKLSAgICB9Ci0gICAgICAKLSAgICBpZiAoc3ViUXVlcnlLZXkgPT0gbnVsbCB8fCBzdWJRdWVyeUtleS5sZW5ndGgoKSA8IDEpCi0gICAgICByZXR1cm4gInVkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VGb3JtLmpzcCI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHJlZ0ZpbmRUb29sXy5nZXRGb3JtTGluaygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9CdXNpbmVzc0RldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9CdXNpbmVzc0RldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZWQxMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIEJ1c2luZXNzRGV0YWlsc1Rvb2wgZXh0ZW5kcyBEZXRhaWxzVG9vbAotewotICBwdWJsaWMgQnVzaW5lc3NEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0LFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygidWRkaS9mb3Jtcy9CdXNpbmVzc0RldGFpbHNGb3JtLmpzcCIpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgICBjbGVhclByb3BlcnR5VGFibGUoKTsKLSAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpKHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgQnVzaW5lc3NFbnRpdHkgYmUgPSBidXNFbGVtZW50LmdldEJ1c2luZXNzRW50aXR5KCk7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLGJlLmdldEJ1c2luZXNzS2V5KCkpOwotCi0gICAgVmVjdG9yIG5hbWVWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgY29weUluZGV4VmVjdG9yKGJlLmdldE5hbWVWZWN0b3IoKSxuYW1lVmVjdG9yKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTLG5hbWVWZWN0b3IpOwotCi0gICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIGNvcHlJbmRleFZlY3RvcihiZS5nZXREZXNjcmlwdGlvblZlY3RvcigpLGRlc2NyaXB0aW9uVmVjdG9yKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyxkZXNjcmlwdGlvblZlY3Rvcik7Ci0KLSAgICBJZGVudGlmaWVyQmFnIGlkQmFnID0gYmUuZ2V0SWRlbnRpZmllckJhZygpOwotICAgIGlmIChpZEJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBpZFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGNvcHlJbmRleFZlY3RvcihpZEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpLGlkVmVjdG9yKTsKLSAgICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMsaWRWZWN0b3IpOwotICAgIH0KLQotICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IGJlLmdldENhdGVnb3J5QmFnKCk7Ci0gICAgaWYgKGNhdEJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBjYXRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBjb3B5SW5kZXhWZWN0b3IoY2F0QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCksY2F0VmVjdG9yKTsKLSAgICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyxjYXRWZWN0b3IpOwotICAgIH0KLQotICAgIERpc2NvdmVyeVVSTHMgZGlzY292ZXJ5VVJMcyA9IGJlLmdldERpc2NvdmVyeVVSTHMoKTsKLSAgICBpZiAoZGlzY292ZXJ5VVJMcyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBkaXNjb3ZlcnlVUkxWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBjb3B5SW5kZXhWZWN0b3IoZGlzY292ZXJ5VVJMcy5nZXREaXNjb3ZlcnlVUkxWZWN0b3IoKSxkaXNjb3ZlcnlVUkxWZWN0b3IpOwotICAgICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTLGRpc2NvdmVyeVVSTFZlY3Rvcik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9CdXNpbmVzc05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0J1c2luZXNzTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDdmZmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0J1c2luZXNzTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotcHVibGljIGNsYXNzIEJ1c2luZXNzTm9kZSBleHRlbmRzIFVERElOYXZpZ2F0b3JOb2RlCi17Ci0gIHByaXZhdGUgRGV0YWlsc1Rvb2wgZGV0YWlsc1Rvb2xfOwotICBwcml2YXRlIEJ1c1B1Ymxpc2hTZXJ2aWNlVG9vbCBwdWJsaXNoU2VydmljZVRvb2xfOwotICBwcml2YXRlIE1hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnNUb29sIG1hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnNUb29sXzsKLSAgcHJpdmF0ZSBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sIG1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2xfOwotICBwcml2YXRlIFVucHVibGlzaFRvb2wgdW5wdWJsaXNoVG9vbF87Ci0KLSAgcHVibGljIEJ1c2luZXNzTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCwidWRkaS9pbWFnZXMvYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBkZXRhaWxzVG9vbF8gPSBuZXcgQnVzaW5lc3NEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9CVVNJTkVTU19ERVRBSUxTIikpOwotICAgIG5ldyBHZXRTZXJ2aWNlc1Rvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfR0VUX1NFUlZJQ0VTIiksQnVzaW5lc3NHZXRTZXJ2aWNlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8pKTsgICAgCi0gICAgcHVibGlzaFNlcnZpY2VUb29sXyA9IG5ldyBCdXNQdWJsaXNoU2VydmljZVRvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfUFVCTElTSF9TRVJWSUNFIikpOwotICAgIG1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2xfID0gbmV3IE1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVMiKSk7Ci0gICAgbWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc1Rvb2xfID0gbmV3IE1hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUyIpKTsKLSAgICBuZXcgQWRkVG9GYXZvcml0ZXNUb29sKHRvb2xNYW5hZ2VyXywgdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfVE9fRkFWT1JJVEVTIikpOwotICAgIHVucHVibGlzaFRvb2xfID0gbmV3IFVucHVibGlzaFRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy91bnB1Ymxpc2hfYnVzX2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvdW5wdWJsaXNoX2J1c19oaWdobGlnaHRlZC5naWYiLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfVU5QVUJMSVNIX0JVU0lORVNTIikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgZGV0YWlsc1Rvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgICBwdWJsaXNoU2VydmljZVRvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgICBtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gICAgbWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc1Rvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgICB1bnB1Ymxpc2hUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0NhdGVnb3J5Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvQ2F0ZWdvcnlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTBkZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvQ2F0ZWdvcnlOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeU5vZGUgZXh0ZW5kcyBOb2RlCi17Ci0gIHB1YmxpYyBDYXRlZ29yeU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsInVkZGkvaW1hZ2VzL2NhdGVnb3J5LmdpZiIpOwotICAgIHNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUNoaWxkcmVuKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGNoaWxkcmVuID0gZWxlbWVudF8uZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9TVUJDQVRFR09SSUVTKTsKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIENhdGVnb3J5RWxlbWVudCBjYXRlZ29yeUVsZW1lbnQgPSAoQ2F0ZWdvcnlFbGVtZW50KWNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIENhdGVnb3J5Tm9kZSBjYXRlZ29yeU5vZGUgPSBuZXcgQ2F0ZWdvcnlOb2RlKGNhdGVnb3J5RWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxKTsKLSAgICAgICAgYWRkQ2hpbGQoY2F0ZWdvcnlOb2RlKTsKLSAgICAgICAgY2F0ZWdvcnlOb2RlLmNyZWF0ZUNoaWxkcmVuKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICBDYXRlZ29yeUVsZW1lbnQgY2F0ZWdvcnlFbGVtZW50ID0gKENhdGVnb3J5RWxlbWVudCllbGVtZW50XzsKLSAgICByZXR1cm4gY2F0ZWdvcnlFbGVtZW50LmdldE5hbWVGb3JUcmVlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25IcmVmKCkKLSAgewotICAgIHJldHVybiBUb2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhnZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRTZXNzaW9uSWQoKSxub2RlSWRfLGlzT3Blbl8pOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMaW5rQWN0aW9uSHJlZigpCi0gIHsKLSAgICByZXR1cm4gU2VsZWN0Q2F0ZWdvcnlOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0U2Vzc2lvbklkKCksbm9kZUlkXyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25UYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIFVERElGcmFtZU5hbWVzLkNBVEVHT1JJRVNfV09SS0FSRUE7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldExpbmtBY3Rpb25UYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIFVERElGcmFtZU5hbWVzLkNBVEVHT1JJRVNfV09SS0FSRUE7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0RldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9EZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjhjZmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0RldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sCi17Ci0gIHByaXZhdGUgU3RyaW5nIGZvcm1MaW5rXzsKLQotICBwdWJsaWMgRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCxTdHJpbmcgZm9ybUxpbmspCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gICAgZm9ybUxpbmtfID0gZm9ybUxpbms7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIHJldHVybiBmb3JtTGlua187Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBjb3B5SW5kZXhWZWN0b3IoVmVjdG9yIHNvdXJjZSxWZWN0b3IgZGVzdGluYXRpb24pCi0gIHsKLSAgICBkZXN0aW5hdGlvbi5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIGZvciAoaW50IGk9MDtpPHNvdXJjZS5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHNvdXJjZS5lbGVtZW50QXQoaSkpOwotICAgICAgbGlzdEVsZW1lbnQuc2V0Vmlld0lkKGkpOwotICAgICAgLy8gVGhlIG5leHQgaXRlbSBpbmRpY2F0ZXMgdGhhdCB0aGlzIGVsZW1lbnQgaXMgdG8gYmUgaW4gbm9uLWVkaXQgc3RhdGUuCi0gICAgICBsaXN0RWxlbWVudC5zZXRUYXJnZXRWaWV3VG9vbEluZm8oLTEsLTEsaSk7Ci0gICAgICBkZXN0aW5hdGlvbi5hZGRFbGVtZW50KGxpc3RFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldEJ1c2luZXNzZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9HZXRCdXNpbmVzc2VzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjRmM2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldEJ1c2luZXNzZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBHZXRCdXNpbmVzc2VzVG9vbCBleHRlbmRzIEFjdGlvblRvb2wKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uTGlua187Ci0gIHB1YmxpYyBHZXRCdXNpbmVzc2VzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgZW5hYmxlZEltYWdlUGF0aCxTdHJpbmcgaGlnaGxpZ2h0ZWRJbWFnZVBhdGgsU3RyaW5nIGFsdCxTdHJpbmcgYWN0aW9uTGluaykKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGVuYWJsZWRJbWFnZVBhdGgsaGlnaGxpZ2h0ZWRJbWFnZVBhdGgsYWx0KTsKLSAgICBhY3Rpb25MaW5rXyA9IGFjdGlvbkxpbms7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmtfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9HZXRTZXJ2aWNlSW50ZXJmYWNlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldFNlcnZpY2VJbnRlcmZhY2VzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE1YWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldFNlcnZpY2VJbnRlcmZhY2VzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgR2V0U2VydmljZUludGVyZmFjZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbAotewotICBwcml2YXRlIFN0cmluZyBhY3Rpb25MaW5rXzsKLSAgcHVibGljIEdldFNlcnZpY2VJbnRlcmZhY2VzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0LFN0cmluZyBhY3Rpb25MaW5rKQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsInVkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19jbG9zZWRfZW5hYmxlZC5naWYiLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlX2ludGVyZmFjZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiIsYWx0KTsKLSAgICBhY3Rpb25MaW5rXyA9IGFjdGlvbkxpbms7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmtfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9HZXRTZXJ2aWNlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldFNlcnZpY2VzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmYwMzRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0dldFNlcnZpY2VzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgR2V0U2VydmljZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbAotewotICBwcml2YXRlIFN0cmluZyBhY3Rpb25MaW5rXzsKLSAgcHVibGljIEdldFNlcnZpY2VzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0LFN0cmluZyBhY3Rpb25MaW5rKQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsInVkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gICAgYWN0aW9uTGlua18gPSBhY3Rpb25MaW5rOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiBhY3Rpb25MaW5rXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvSXRlbXNTdW1tYXJ5VG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvSXRlbXNTdW1tYXJ5VG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGVmM2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL0l0ZW1zU3VtbWFyeVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlByb3h5TG9hZFBhZ2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgSXRlbXNTdW1tYXJ5VG9vbCBleHRlbmRzIEZvcm1Ub29sCi17Ci0gIHByaXZhdGUgU3RyaW5nIGZvcm1MaW5rXzsKLQotICBwdWJsaWMgSXRlbXNTdW1tYXJ5VG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgZW5hYmxlZEltYWdlLFN0cmluZyBoaWdobGlnaHRlZEltYWdlLFN0cmluZyBhbHQsaW50IHF1ZXJ5SXRlbSkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGVuYWJsZWRJbWFnZSxoaWdobGlnaHRlZEltYWdlLGFsdCk7Ci0gICAgU3RyaW5nQnVmZmVyIGZvcm1MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigidWRkaS9mb3Jtcy9JdGVtc1N1bW1hcnlGb3JtLmpzcD8iKTsKLSAgICBmb3JtTGluay5hcHBlbmQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNKS5hcHBlbmQoJz0nKS5hcHBlbmQocXVlcnlJdGVtKTsKLQlTdHJpbmcgZW5jb2RlZEZvcm1MaW5rID0gVVJMVXRpbHMuZW5jb2RlKGZvcm1MaW5rLnRvU3RyaW5nKCkpOwotICAgIGZvcm1MaW5rXyA9IFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluayhlbmNvZGVkRm9ybUxpbmspOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpCi0gIHsKLSAgICByZXR1cm4gZm9ybUxpbmtfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9NYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkYzI3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9NYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zVG9vbCBleHRlbmRzIEZvcm1Ub29sIGltcGxlbWVudHMgTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UKLXsKLSAgVG9vbE1hbmFnZXIgaW52aXNpYmxlVG9vbE1hbmFnZXJfOwotICBwcml2YXRlIFJlZ0ZpbmRUb29sIHJlZ0ZpbmRUb29sXzsKLQotICBwdWJsaWMgTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwgInVkZGkvaW1hZ2VzL3B1Ymxpc2hlcl9hc3NlcnRpb25zX2VuYWJsZWQuZ2lmIiwgInVkZGkvaW1hZ2VzL3B1Ymxpc2hlcl9hc3NlcnRpb25zX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgaW52aXNpYmxlVG9vbE1hbmFnZXJfID0gbmV3IFRvb2xNYW5hZ2VyKHRvb2xNYW5hZ2VyLmdldE5vZGUoKSk7Ci0gICAgcmVnRmluZFRvb2xfID0gbmV3IFJlZ0ZpbmRUb29sKGludmlzaWJsZVRvb2xNYW5hZ2VyXywiIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKQotICB7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksIiIpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUykpOwotICAgIFN0cmluZyBzaW1wbGVTdHlsZVN0cmluZyA9IFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMsc2ltcGxlU3R5bGVTdHJpbmcpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMsc2ltcGxlU3R5bGVTdHJpbmcpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTLHNpbXBsZVN0eWxlU3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKE9iamVjdCBzdWJRdWVyeUtleU9iamVjdCkKLSAgewotICAgIC8vIEVtcHR5L05vbi1leGlzdGVudCBzdWJxdWVyeWtleSBpbXBsaWVzIHB1Ymxpc2ggZm9ybS4gQWxsIGVsc2UgaW1wbGllcyBxdWVyeSBmb3JtLgotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHJlZ0ZpbmRUb29sXy5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlPYmplY3QpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIHJldHVybiBTZWxlY3RGaW5kVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLHN1YlF1ZXJ5S2V5LGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcmVnRWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSByZWdFbGVtZW50LmdldENyZWQoKTsKLQotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgaWYgKHVzZXJJZCA9PSBudWxsKQotICAgICAgdXNlcklkID0gIiI7Ci0gICAgaWYgKHBhc3N3b3JkID09IG51bGwpCi0gICAgICBwYXNzd29yZCA9ICIiOwotCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIHJlZ0ZpbmRUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIE9iamVjdCBzdWJRdWVyeUtleU9iamVjdCA9IGdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSBudWxsOwotICAgIGlmIChzdWJRdWVyeUtleU9iamVjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIEhhc2h0YWJsZSBzdWJRdWVyaWVzUHJvcGVydGllcyA9IChIYXNodGFibGUpZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSSUVTX1BST1BFUlRJRVMpOwotICAgICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHN1YlF1ZXJ5UHJvcGVydGllcyA9IGdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleU9iamVjdCk7Ci0gICAgICBPYmplY3Qgc3ViUXVlcnlHZXRPYmplY3QgPSBzdWJRdWVyeVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgICAgaWYgKHN1YlF1ZXJ5R2V0T2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNTdWJRdWVyeUdldCA9ICgoQm9vbGVhbilzdWJRdWVyeUdldE9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChpc1N1YlF1ZXJ5R2V0KQotICAgICAgICAgIHJldHVybiAidWRkaS9mb3Jtcy9HZXRGb3JtLmpzcCI7Ci0gICAgICB9Ci0gICAgICBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgfQotCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuIFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygidWRkaS9mb3Jtcy9NYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zRm9ybS5qc3AiKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gcmVnRmluZFRvb2xfLmdldEZvcm1MaW5rKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhYTkyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sIGV4dGVuZHMgRm9ybVRvb2wgaW1wbGVtZW50cyBNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZQotewotICBUb29sTWFuYWdlciBpbnZpc2libGVUb29sTWFuYWdlcl87Ci0gIHByaXZhdGUgUmVnRmluZFRvb2wgcmVnRmluZFRvb2xfOwotCi0gIHB1YmxpYyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsICJ1ZGRpL2ltYWdlcy9yZWZlcmVuY2VkX3NlcnZpY2VzX2VuYWJsZWQuZ2lmIiwgInVkZGkvaW1hZ2VzL3JlZmVyZW5jZWRfc2VydmljZXNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICBpbnZpc2libGVUb29sTWFuYWdlcl8gPSBuZXcgVG9vbE1hbmFnZXIodG9vbE1hbmFnZXIuZ2V0Tm9kZSgpKTsKLSAgICByZWdGaW5kVG9vbF8gPSBuZXcgUmVnRmluZFRvb2woaW52aXNpYmxlVG9vbE1hbmFnZXJfLCIiKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSwiIik7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUykpOwotICAgIFN0cmluZyBzaW1wbGVTdHlsZVN0cmluZyA9IFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMsc2ltcGxlU3R5bGVTdHJpbmcpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMsc2ltcGxlU3R5bGVTdHJpbmcpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTLHNpbXBsZVN0eWxlU3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKE9iamVjdCBzdWJRdWVyeUtleU9iamVjdCkKLSAgewotICAgIC8vIEVtcHR5L05vbi1leGlzdGVudCBzdWJxdWVyeWtleSBpbXBsaWVzIHB1Ymxpc2ggZm9ybS4gQWxsIGVsc2UgaW1wbGllcyBxdWVyeSBmb3JtLgotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHJlZ0ZpbmRUb29sXy5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlPYmplY3QpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIHJldHVybiBTZWxlY3RGaW5kVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLHN1YlF1ZXJ5S2V5LGZvckhpc3RvcnkpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotICAgIAotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgaWYgKHVzZXJJZCA9PSBudWxsKQotICAgICAgdXNlcklkID0gIiI7Ci0gICAgaWYgKHBhc3N3b3JkID09IG51bGwpCi0gICAgICBwYXNzd29yZCA9ICIiOwotICAgICAgCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICAgIHJlZ0ZpbmRUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIE9iamVjdCBzdWJRdWVyeUtleU9iamVjdCA9IGdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSBudWxsOwotICAgIGlmIChzdWJRdWVyeUtleU9iamVjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIEhhc2h0YWJsZSBzdWJRdWVyaWVzUHJvcGVydGllcyA9IChIYXNodGFibGUpZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSSUVTX1BST1BFUlRJRVMpOwotICAgICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHN1YlF1ZXJ5UHJvcGVydGllcyA9IGdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleU9iamVjdCk7Ci0gICAgICBPYmplY3Qgc3ViUXVlcnlHZXRPYmplY3QgPSBzdWJRdWVyeVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQpOwotICAgICAgaWYgKHN1YlF1ZXJ5R2V0T2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNTdWJRdWVyeUdldCA9ICgoQm9vbGVhbilzdWJRdWVyeUdldE9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIGlmIChpc1N1YlF1ZXJ5R2V0KQotICAgICAgICAgIHJldHVybiAidWRkaS9mb3Jtcy9HZXRGb3JtLmpzcCI7Ci0gICAgICB9Ci0gICAgICBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgfQotCi0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0Zvcm0uanNwIjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gcmVnRmluZFRvb2xfLmdldEZvcm1MaW5rKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL011bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9NdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzUwN2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL011bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZQotewotICBwdWJsaWMgYWJzdHJhY3QgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGdldEZvcm1Ub29sUHJvcGVydGllcyhPYmplY3Qga2V5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL09wZW5SZWdpc3RyeVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL09wZW5SZWdpc3RyeVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzODg1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9PcGVuUmVnaXN0cnlUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuUmVnaXN0cnlUb29sIGV4dGVuZHMgRm9ybVRvb2wKLXsKLSAgcHJpdmF0ZSBDb250cm9sbGVyIGNvbnRyb2xsZXJfOwotICAKLSAgcHVibGljIE9wZW5SZWdpc3RyeVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCJ1ZGRpL2ltYWdlcy9vcGVuX3JlZ2lzdHJ5X2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKQotICB7Ci0gICAgY29udHJvbGxlcl8gPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkRFRkFVTFRfUkVHSVNUUllfTkFNRSIpKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMLHVkZGlQZXJzcGVjdGl2ZS5nZXRJQk1QdWJsaWNVRERJVGVzdFJlZ2lzdHJ5KCkuZ2V0SW5xdWlyeVVSTCgpKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL09wZW5SZWdpc3RyeUZvcm0uanNwIjsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIEVudW1lcmF0aW9uIGdldEZhdm9yaXRlUmVnaXN0cnlFbGVtZW50cygpCi0gIHsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgZmF2b3JpdGVzTm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIFRyZWVFbGVtZW50IGZhdm9yaXRlc01haW5FbGVtZW50ID0gZmF2b3JpdGVzTm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFRyZWVFbGVtZW50IGZhdm9yaXRlUmVnaXN0cmllc0VsZW1lbnQgPSAoVHJlZUVsZW1lbnQpKGZhdm9yaXRlc01haW5FbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX1JFR0lTVFJZX0ZPTERFUl9OT0RFKS5uZXh0RWxlbWVudCgpKTsKLSAgICByZXR1cm4gZmF2b3JpdGVSZWdpc3RyaWVzRWxlbWVudC5nZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9SRUdJU1RSWV9OT0RFKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUHVibGlzaGVkSXRlbXNOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9QdWJsaXNoZWRJdGVtc05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzMTQ2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9QdWJsaXNoZWRJdGVtc05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVkSXRlbXNOb2RlIGV4dGVuZHMgVURESU5hdmlnYXRvckZvbGRlck5vZGUKLXsKLSAgcHVibGljIFB1Ymxpc2hlZEl0ZW1zTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCk7Ci0gICAgZWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgIGlmIChyZWwuZXF1YWxzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUFVCTElTSEVEX0lURU1TKSkKLSAgICAgICAgewotICAgICAgICAgIFRyZWVFbGVtZW50IHRyZWVFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICBjcmVhdGVDaGlsZE5vZGUodHJlZUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IHRyZWVFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUFVCTElTSEVEX0lURU1TKSkKLSAgICAgICAgICB0cmVlRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICBlbHNlIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfSVRFTVMpKQotICAgICAgICAgIHRyZWVFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotCi0gICAgICAgIGlmICh0cmVlRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIHJlbW92ZUNoaWxkTm9kZSh0cmVlRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlQ2hpbGROb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBQdWJsaXNoZWRJdGVtc0VsZW1lbnQgcHVibGlzaGVkSXRlbXNFbGVtZW50ID0gKFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIGNoaWxkTm9kZSA9IG51bGw7Ci0gICAgc3dpdGNoIChwdWJsaXNoZWRJdGVtc0VsZW1lbnQuZ2V0VHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVM6Ci0gICAgICAgIGNoaWxkTm9kZSA9IG5ldyBCdXNpbmVzc05vZGUoZWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICAgY2hpbGROb2RlID0gbmV3IFNlcnZpY2VOb2RlKGVsZW1lbnQsbm9kZU1hbmFnZXJfLG5vZGVEZXB0aF8rMSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICAgICBjaGlsZE5vZGUgPSBuZXcgU2VydmljZUludGVyZmFjZU5vZGUoZWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxKTsKLSAgICB9Ci0gICAgaWYgKGNoaWxkTm9kZSAhPSBudWxsKQotICAgICAgYWRkQ2hpbGQoY2hpbGROb2RlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBwdWJsaXNoZWRJdGVtc0VsZW1lbnQgPSAoUHVibGlzaGVkSXRlbXNFbGVtZW50KWVsZW1lbnRfOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIGludCBwdWJsaXNoZWRJdGVtc1R5cGUgPSBwdWJsaXNoZWRJdGVtc0VsZW1lbnQuZ2V0VHlwZSgpOwotICAgIHN3aXRjaCAocHVibGlzaGVkSXRlbXNUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVM6Ci0gICAgICAgIG5ldyBJdGVtc1N1bW1hcnlUb29sKHRvb2xNYW5hZ2VyXywidWRkaS9pbWFnZXMvYnVzaW5lc3Nlc19jbG9zZWRfZW5hYmxlZC5naWYiLCJ1ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1VNTUFSWV9CVVNJTkVTU0VTIikscHVibGlzaGVkSXRlbXNUeXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlc19jbG9zZWRfZW5hYmxlZC5naWYiLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NVTU1BUllfU0VSVklDRVMiKSxwdWJsaXNoZWRJdGVtc1R5cGUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUzoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIG5ldyBJdGVtc1N1bW1hcnlUb29sKHRvb2xNYW5hZ2VyXywidWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NVTU1BUllfU0VSVklDRV9JTlRFUkZBQ0VTIikscHVibGlzaGVkSXRlbXNUeXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3BlbkltYWdlUGF0aCgpCi0gIHsKLSAgICBQdWJsaXNoZWRJdGVtc0VsZW1lbnQgcHVibGlzaGVkSXRlbXNFbGVtZW50ID0gKFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCllbGVtZW50XzsKLSAgICBpbnQgcHVibGlzaGVkSXRlbXNUeXBlID0gcHVibGlzaGVkSXRlbXNFbGVtZW50LmdldFR5cGUoKTsKLSAgICBzd2l0Y2ggKHB1Ymxpc2hlZEl0ZW1zVHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTOgotICAgICAgICByZXR1cm4gInVkZGkvaW1hZ2VzL2J1c2luZXNzZXNfb3Blbl9oaWdobGlnaHRlZC5naWYiOwotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgIHJldHVybiAidWRkaS9pbWFnZXMvc2VydmljZXNfb3Blbl9oaWdobGlnaHRlZC5naWYiOwotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICAgICByZXR1cm4gInVkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19vcGVuX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXRPcGVuSW1hZ2VQYXRoKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2xvc2VkSW1hZ2VQYXRoKCkKLSAgewotICAgIFB1Ymxpc2hlZEl0ZW1zRWxlbWVudCBwdWJsaXNoZWRJdGVtc0VsZW1lbnQgPSAoUHVibGlzaGVkSXRlbXNFbGVtZW50KWVsZW1lbnRfOwotICAgIGludCBwdWJsaXNoZWRJdGVtc1R5cGUgPSBwdWJsaXNoZWRJdGVtc0VsZW1lbnQuZ2V0VHlwZSgpOwotICAgIHN3aXRjaCAocHVibGlzaGVkSXRlbXNUeXBlKQotICAgIHsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVM6Ci0gICAgICAgIHJldHVybiAidWRkaS9pbWFnZXMvYnVzaW5lc3Nlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTOgotICAgICAgICByZXR1cm4gInVkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiOwotICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICAgICByZXR1cm4gInVkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmdldENsb3NlZEltYWdlUGF0aCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9RdWVyeU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1F1ZXJ5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzUwNDZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1F1ZXJ5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuQnVzaW5lc3NFbnRpdHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFF1ZXJ5Tm9kZSBleHRlbmRzIFVERElOYXZpZ2F0b3JOb2RlCi17Ci0gIHByaXZhdGUgRm9ybVRvb2wgcmVnRmluZFRvb2xfOwotICBwcml2YXRlIEZpbmRBY3Rpb24gZmluZEFjdGlvbl87Ci0gIHB1YmxpYyBRdWVyeU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsInVkZGkvaW1hZ2VzL3F1ZXJ5LmdpZiIpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJZX1JFU1VMVFMpKQotICAgICAgICB7Ci0gICAgICAgICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICAgIGNyZWF0ZUNoaWxkTm9kZSh0cmVlRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSWV9SRVNVTFRTKSkKLSAgICAgICAgICB0cmVlRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICBlbHNlIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSWV9SRVNVTFRTKSkKLSAgICAgICAgICB0cmVlRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAodHJlZUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICByZW1vdmVDaGlsZE5vZGUodHJlZUVsZW1lbnQpOwotICAgICAgfQotICAgIH0pOwotICAgIGNyZWF0ZUNoaWxkcmVuKCk7Ci0gICAgc2V0VmlzaWJpbGl0eU9mQ2hpbGRyZW4oZmFsc2UpOwotICAgIGZpbmRBY3Rpb25fID0gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVDaGlsZHJlbigpCi0gIHsKLSAgICBWZWN0b3IgaW5pdGlhbFJlc3VsdHMgPSAoVmVjdG9yKWVsZW1lbnRfLmdldFByb3BlcnR5QXNPYmplY3QoVURESU1vZGVsQ29uc3RhbnRzLklOSVRJQUxfUkVTVUxUUyk7Ci0gICAgZm9yIChpbnQgaT0wO2k8aW5pdGlhbFJlc3VsdHMuc2l6ZSgpO2krKykKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaW5pdGlhbFJlc3VsdHMuZWxlbWVudEF0KGkpOwotICAgICAgVHJlZUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCdXNpbmVzc0VudGl0eSkKLSAgICAgICAgY2hpbGRFbGVtZW50ID0gbmV3IEJ1c2luZXNzRWxlbWVudCgoQnVzaW5lc3NFbnRpdHkpb2JqZWN0LGVsZW1lbnRfLmdldE1vZGVsKCkpOwotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQnVzaW5lc3NTZXJ2aWNlKQotICAgICAgICBjaGlsZEVsZW1lbnQgPSBuZXcgU2VydmljZUVsZW1lbnQoKEJ1c2luZXNzU2VydmljZSlvYmplY3QsZWxlbWVudF8uZ2V0TW9kZWwoKSk7Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUTW9kZWwpCi0gICAgICAgIGNoaWxkRWxlbWVudCA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCgoVE1vZGVsKW9iamVjdCxlbGVtZW50Xy5nZXRNb2RlbCgpKTsKLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgZWxlbWVudF8uY29ubmVjdChjaGlsZEVsZW1lbnQsVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSWV9SRVNVTFRTLE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGNyZWF0ZUNoaWxkTm9kZShUcmVlRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTm9kZSBjaGlsZE5vZGUgPSBudWxsOwotICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQnVzaW5lc3NFbGVtZW50KQotICAgICAgY2hpbGROb2RlID0gbmV3IEJ1c2luZXNzTm9kZShlbGVtZW50LG5vZGVNYW5hZ2VyXyxub2RlRGVwdGhfKzEpOwotICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlRWxlbWVudCkKLSAgICAgIGNoaWxkTm9kZSA9IG5ldyBTZXJ2aWNlTm9kZShlbGVtZW50LG5vZGVNYW5hZ2VyXyxub2RlRGVwdGhfKzEpOwotICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCkKLSAgICAgIGNoaWxkTm9kZSA9IG5ldyBTZXJ2aWNlSW50ZXJmYWNlTm9kZShlbGVtZW50LG5vZGVNYW5hZ2VyXyxub2RlRGVwdGhfKzEpOwotICAgIGlmIChjaGlsZE5vZGUgIT0gbnVsbCkKLSAgICAgIGFkZENoaWxkKGNoaWxkTm9kZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBuZXcgUmVzdWx0c1Rvb2wodG9vbE1hbmFnZXJfLGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1JFU1VMVFMiKSk7Ci0gICAgcmVnRmluZFRvb2xfID0gbmV3IFJlZ0ZpbmRUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZJTkQiKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRGaW5kVG9vbFByb3BlcnRpZXMoRmluZEFjdGlvbiBmaW5kQWN0aW9uKQotICB7Ci0gICAgZmluZEFjdGlvbl8gPSBmaW5kQWN0aW9uOwotICAgIHJlZ0ZpbmRUb29sXy51cGRhdGVQcm9wZXJ0eVRhYmxlKGZpbmRBY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCkKLSAgewotICAgICgoUmVnRmluZFRvb2wpcmVnRmluZFRvb2xfKS5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMocmVnRWxlbWVudCk7Ci0gICAgVmVjdG9yIGNoaWxkTm9kZXMgPSBnZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8Y2hpbGROb2Rlcy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIFVERElOYXZpZ2F0b3JOb2RlIG5hdmlnYXRvck5vZGUgPSAoVURESU5hdmlnYXRvck5vZGUpY2hpbGROb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgICBuYXZpZ2F0b3JOb2RlLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgRmluZEFjdGlvbiBnZXRGaW5kQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBmaW5kQWN0aW9uXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUXVlcnlQYXJlbnROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9RdWVyeVBhcmVudE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc3MTg5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9RdWVyeVBhcmVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeVBhcmVudE5vZGUgZXh0ZW5kcyBVRERJTmF2aWdhdG9yRm9sZGVyTm9kZQotewotICBwdWJsaWMgUXVlcnlQYXJlbnROb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsaW50IG5vZGVEZXB0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoKTsKLSAgICBlbGVtZW50LmFkZExpc3RlbmVyKG5ldyBFbGVtZW50QWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZWwgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgaWYgKHJlbC5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTKSkKLSAgICAgICAgewotICAgICAgICAgIFF1ZXJ5RWxlbWVudCBxdWVyeUVsZW1lbnQgPSAoUXVlcnlFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICBjcmVhdGVDaGlsZE5vZGUocXVlcnlFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBRdWVyeUVsZW1lbnQgcXVlcnlFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUVVFUklFUykpCi0gICAgICAgICAgcXVlcnlFbGVtZW50ID0gKFF1ZXJ5RWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICBlbHNlIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTKSkKLSAgICAgICAgICBxdWVyeUVsZW1lbnQgPSAoUXVlcnlFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotCi0gICAgICAgIGlmIChxdWVyeUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICByZW1vdmVDaGlsZE5vZGUocXVlcnlFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVDaGlsZE5vZGUoUXVlcnlFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBRdWVyeU5vZGUgcXVlcnlOb2RlID0gbmV3IFF1ZXJ5Tm9kZShlbGVtZW50LG5vZGVNYW5hZ2VyXyxub2RlRGVwdGhfKzEpOwotICAgIC8vIEFkZCByZWdpc3RyeSBhdXRoZW50aWNhdGlvbiBwcm9wZXJ0aWVzLgotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCkoZ2V0UGFyZW50KCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgcXVlcnlOb2RlLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgICBhZGRDaGlsZChxdWVyeU5vZGUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9xdWVyaWVzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVU1NQVJZX1FVRVJJRVMiKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fUVVFUklFUyk7Ci0gICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL2J1c2luZXNzZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVU1NQVJZX0JVU0lORVNTRVMiKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyk7Ci0gICAgbmV3IEl0ZW1zU3VtbWFyeVRvb2wodG9vbE1hbmFnZXJfLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlc19jbG9zZWRfZW5hYmxlZC5naWYiLCJ1ZGRpL2ltYWdlcy9zZXJ2aWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NVTU1BUllfU0VSVklDRVMiKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMpOwotICAgIG5ldyBJdGVtc1N1bW1hcnlUb29sKHRvb2xNYW5hZ2VyXywidWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NVTU1BUllfU0VSVklDRV9JTlRFUkZBQ0VTIiksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3BlbkltYWdlUGF0aCgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvaW1hZ2VzL3F1ZXJpZXNfb3Blbl9oaWdobGlnaHRlZC5naWYiOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsb3NlZEltYWdlUGF0aCgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZnJlc2hUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWZyZXNoVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRiMTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZnJlc2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoVG9vbCBleHRlbmRzIEFjdGlvblRvb2wKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uTGlua187Ci0KLSAgcHVibGljIFJlZnJlc2hUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiLCJpbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuIFJlZnJlc2hVRERJTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZUlkKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWdGaW5kVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUmVnRmluZFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiODljNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZWdGaW5kVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUmVnRmluZFRvb2wgZXh0ZW5kcyBGb3JtVG9vbCBpbXBsZW1lbnRzIE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlCi17Ci0gIHB1YmxpYyBSZWdGaW5kVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsInVkZGkvaW1hZ2VzL2ZpbmRfZW5hYmxlZC5naWYiLCJ1ZGRpL2ltYWdlcy9maW5kX2hpZ2hsaWdodGVkLmdpZiIsYWx0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgICBpbml0RGVmYXVsdFByb3BlcnRpZXModGhpcyk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVksIiIpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUklFU19QUk9QRVJUSUVTLG5ldyBIYXNodGFibGUoKSk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJERUZBVUxUX1FVRVJZX05BTUUiKSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0KLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUykpOwotICAgIFN0cmluZyBzaW1wbGVTdHlsZVN0cmluZyA9IFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFKTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLHNpbXBsZVN0eWxlU3RyaW5nKTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTLHNpbXBsZVN0eWxlU3RyaW5nKTsKLQotICAgIFN0cmluZyBtYXhTZWFyY2hTZXQgPSBTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX01BWF9TRUFSQ0hfU0VUKTsKLSAgICBTdHJpbmcgbWF4UmVzdWx0cyA9IFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTUFYX1JFU1VMVFMpOwotCi0gICAgLy8gUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb24gaW5wdXRzCi0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FLCIiKTsKLQotICAgIC8vIFJlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb24gaW5wdXRzCi0gICAgLy8gVGhlIGF1dGhlbnRpY2F0aW9uIGlucHV0cyBtdXN0IGJlIGFkZGVkIGxhdGVyIGFzIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgd2UgY2FuIGdldCBhIHZhbGlkIGhhbmRsZQotICAgIC8vIHRvIHRoZSBSZWdpc3RyeUVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBxdWVyeSBub2RlLgotICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfU0VBUkNIX1NFVCxtYXhTZWFyY2hTZXQpOwotICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfUkVTVUxUUyxtYXhSZXN1bHRzKTsKLQotICAgIC8vIFJlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbiBpbnB1dHMKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSwiIik7Ci0KLSAgICAvLyBSZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbiBpbnB1dHMKLSAgICAvLyBUaGUgYXV0aGVudGljYXRpb24gaW5wdXRzIG11c3QgYmUgYWRkZWQgbGF0ZXIgYXMgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSB3ZSBjYW4gZ2V0IGEgdmFsaWQgaGFuZGxlCi0gICAgLy8gdG8gdGhlIFJlZ2lzdHJ5RWxlbWVudCBpbiB0aGUgY2FzZSBvZiBhIHF1ZXJ5IG5vZGUuCi0gICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTUFYX1NFQVJDSF9TRVQsbWF4U2VhcmNoU2V0KTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9NQVhfUkVTVUxUUyxtYXhSZXN1bHRzKTsKLQotICAgIC8vIFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZUFjdGlvbiBpbnB1dHMKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUsIiIpOwotCi0gICAgLy8gUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24gaW5wdXRzCi0gICAgLy8gVGhlIGF1dGhlbnRpY2F0aW9uIGlucHV0cyBtdXN0IGJlIGFkZGVkIGxhdGVyIGFzIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgd2UgY2FuIGdldCBhIHZhbGlkIGhhbmRsZQotICAgIC8vIHRvIHRoZSBSZWdpc3RyeUVsZW1lbnQgaW4gdGhlIGNhc2Ugb2YgYSBxdWVyeSBub2RlLgotICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLCIiKTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1NFQVJDSF9TRVQsbWF4U2VhcmNoU2V0KTsKLSAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1JFU1VMVFMsbWF4UmVzdWx0cyk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGdldEZvcm1Ub29sUHJvcGVydGllcyhPYmplY3Qgc3ViUXVlcnlLZXlPYmplY3QpCi0gIHsKLSAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKXN1YlF1ZXJ5S2V5T2JqZWN0OwotICAgIGlmIChzdWJRdWVyeUtleSA9PSBudWxsIHx8IHN1YlF1ZXJ5S2V5Lmxlbmd0aCgpIDwgMSkKLSAgICAgIHJldHVybiB0aGlzOwotICAgIEhhc2h0YWJsZSBzdWJRdWVyaWVzUHJvcGVydGllcyA9IChIYXNodGFibGUpZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSSUVTX1BST1BFUlRJRVMpOwotICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBzdWJRdWVyeVByb3BlcnRpZXMgPSAoRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKXN1YlF1ZXJpZXNQcm9wZXJ0aWVzLmdldChzdWJRdWVyeUtleSk7Ci0gICAgaWYgKHN1YlF1ZXJ5UHJvcGVydGllcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHN1YlF1ZXJ5UHJvcGVydGllcyA9IG5ldyBGb3JtVG9vbFByb3BlcnRpZXMoKTsKLSAgICAgIGluaXREZWZhdWx0UHJvcGVydGllcyhzdWJRdWVyeVByb3BlcnRpZXMpOwotICAgICAgc3ViUXVlcmllc1Byb3BlcnRpZXMucHV0KHN1YlF1ZXJ5S2V5LHN1YlF1ZXJ5UHJvcGVydGllcyk7Ci0gICAgfQotICAgIHJldHVybiBzdWJRdWVyeVByb3BlcnRpZXM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylnZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgcmV0dXJuIFNlbGVjdEZpbmRUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksc3ViUXVlcnlLZXksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIE9iamVjdCBzdWJRdWVyeUtleU9iamVjdCA9IGdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICBpZiAoc3ViUXVlcnlLZXlPYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBIYXNodGFibGUgc3ViUXVlcmllc1Byb3BlcnRpZXMgPSAoSGFzaHRhYmxlKWdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUklFU19QUk9QRVJUSUVTKTsKLSAgICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBzdWJRdWVyeVByb3BlcnRpZXMgPSBnZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlPYmplY3QpOwotICAgICAgT2JqZWN0IHN1YlF1ZXJ5R2V0T2JqZWN0ID0gc3ViUXVlcnlQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VUKTsKLSAgICAgIGlmIChzdWJRdWVyeUdldE9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzU3ViUXVlcnlHZXQgPSAoKEJvb2xlYW4pc3ViUXVlcnlHZXRPYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICBpZiAoaXNTdWJRdWVyeUdldCkKLSAgICAgICAgICByZXR1cm4gInVkZGkvZm9ybXMvR2V0Rm9ybS5qc3AiOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gInVkZGkvZm9ybXMvUmVnRmluZEZvcm0uanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUmVnUHVibGlzaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ1B1Ymxpc2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YmFiZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUmVnUHVibGlzaFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFJlZ1B1Ymxpc2hUb29sIGV4dGVuZHMgRm9ybVRvb2wgaW1wbGVtZW50cyBNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZQotewotICBUb29sTWFuYWdlciBpbnZpc2libGVUb29sTWFuYWdlcl87Ci0gIHByaXZhdGUgUmVnRmluZFRvb2wgcmVnRmluZFRvb2xfOwotICBwdWJsaWMgUmVnUHVibGlzaFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCJ1ZGRpL2ltYWdlcy9wdWJsaXNoX2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvcHVibGlzaF9oaWdobGlnaHRlZC5naWYiLGFsdCk7Ci0gICAgaW52aXNpYmxlVG9vbE1hbmFnZXJfID0gbmV3IFRvb2xNYW5hZ2VyKHRvb2xNYW5hZ2VyLmdldE5vZGUoKSk7Ci0gICAgcmVnRmluZFRvb2xfID0gbmV3IFJlZ0ZpbmRUb29sKGludmlzaWJsZVRvb2xNYW5hZ2VyXywiIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKQotICB7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSwiIik7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0sU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpKTsKLSAgICBTdHJpbmcgc2ltcGxlU3R5bGVTdHJpbmcgPSBTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTLHNpbXBsZVN0eWxlU3RyaW5nKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLHNpbXBsZVN0eWxlU3RyaW5nKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyxzaW1wbGVTdHlsZVN0cmluZyk7Ci0KLSAgICAvLyBSZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVBY3Rpb24gaW5wdXRzCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSwiIik7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfREVTQ1JJUFRJT04sIiIpOwotCi0gICAgLy8gUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24gaW5wdXRzCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9XU0RMX1VSTCwiIik7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OLCIiKTsKLQotICAgIC8vIFJlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb24gaW5wdXRzCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMLCIiKTsKLQotICAgIC8vIFJlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uIGlucHV0cwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FLCIiKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTiwiIik7Ci0KLSAgICAvLyBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQWN0aW9uIGlucHV0cwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfV1NETF9VUkwsIiIpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSwiIik7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gICAgcmVnRmluZFRvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKE9iamVjdCBzdWJRdWVyeUtleU9iamVjdCkKLSAgewotICAgIC8vIEVtcHR5L05vbi1leGlzdGVudCBzdWJxdWVyeWtleSBpbXBsaWVzIHB1Ymxpc2ggZm9ybS4gQWxsIGVsc2UgaW1wbGllcyBxdWVyeSBmb3JtLgotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpc3ViUXVlcnlLZXlPYmplY3Q7Ci0gICAgaWYgKHN1YlF1ZXJ5S2V5ID09IG51bGwgfHwgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPCAxKQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHJlZ0ZpbmRUb29sXy5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlPYmplY3QpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgIHJldHVybiBTZWxlY3RGaW5kVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLHN1YlF1ZXJ5S2V5LGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpCi0gIHsKLSAgICBPYmplY3Qgc3ViUXVlcnlLZXlPYmplY3QgPSBnZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gbnVsbDsKLSAgICBpZiAoc3ViUXVlcnlLZXlPYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBIYXNodGFibGUgc3ViUXVlcmllc1Byb3BlcnRpZXMgPSAoSGFzaHRhYmxlKWdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUklFU19QUk9QRVJUSUVTKTsKLSAgICAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBzdWJRdWVyeVByb3BlcnRpZXMgPSBnZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlPYmplY3QpOwotICAgICAgT2JqZWN0IHN1YlF1ZXJ5R2V0T2JqZWN0ID0gc3ViUXVlcnlQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VUKTsKLSAgICAgIGlmIChzdWJRdWVyeUdldE9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBib29sZWFuIGlzU3ViUXVlcnlHZXQgPSAoKEJvb2xlYW4pc3ViUXVlcnlHZXRPYmplY3QpLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICBpZiAoaXNTdWJRdWVyeUdldCkKLSAgICAgICAgICByZXR1cm4gInVkZGkvZm9ybXMvR2V0Rm9ybS5qc3AiOwotICAgICAgfQotICAgICAgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKXN1YlF1ZXJ5S2V5T2JqZWN0OwotICAgIH0KLSAgICAgIAotICAgIGlmIChzdWJRdWVyeUtleSA9PSBudWxsIHx8IHN1YlF1ZXJ5S2V5Lmxlbmd0aCgpIDwgMSkKLSAgICAgIHJldHVybiAidWRkaS9mb3Jtcy9SZWdQdWJsaXNoRm9ybS5qc3AiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiByZWdGaW5kVG9vbF8uZ2V0Rm9ybUxpbmsoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUmVnaXN0cnlEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUmVnaXN0cnlEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2MzNWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ2lzdHJ5RGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeURldGFpbHNUb29sIGV4dGVuZHMgRGV0YWlsc1Rvb2wKLXsKLSAgcHVibGljIFJlZ2lzdHJ5RGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLGFsdCxQcm94eUxvYWRQYWdlQWN0aW9uLmdldEFjdGlvbkxpbmsoInVkZGkvZm9ybXMvUmVnRGV0YWlsc0Zvcm0uanNwIikpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkKLSAgewotICAgIGNsZWFyUHJvcGVydHlUYWJsZSgpOwotICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCk7Ci0gICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KSh0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldFRyZWVFbGVtZW50KCkpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUkVHSVNUUllfTkFNRSxyZWdFbGVtZW50LmdldE5hbWUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1JlZ2lzdHJ5Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUmVnaXN0cnlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YmZmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUmVnaXN0cnlOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFJlZ2lzdHJ5Tm9kZSBleHRlbmRzIFVERElOYXZpZ2F0b3JOb2RlCi17Ci0gIHByaXZhdGUgUmVnaXN0cnlEZXRhaWxzVG9vbCByZWdEZXRhaWxzVG9vbF87Ci0gIHByaXZhdGUgUmVnUHVibGlzaFRvb2wgcmVnUHVibGlzaFRvb2xfOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfUEFUSF9TVEFOREFSRCA9ICJ1ZGRpL2ltYWdlcy9yZWdpc3RyeS5naWYiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUFHRV9QQVRIX1dJVEhfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMgPSAidWRkaS9pbWFnZXMvcmVnc3RyeWNhdF9vYmouZ2lmIjsKLSAgCi0gIHB1YmxpYyBSZWdpc3RyeU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoLFN0cmluZyBpbWFnZVBhdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCxpbWFnZVBhdGgpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJJRVNfUEFSRU5UKSkKLSAgICAgICAgewotICAgICAgICAgIFF1ZXJ5UGFyZW50RWxlbWVudCBxdWVyeVBhcmVudEVsZW1lbnQgPSAoUXVlcnlQYXJlbnRFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICBjcmVhdGVDaGlsZE5vZGUocXVlcnlQYXJlbnRFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpc1B1Ymxpc2hlZEl0ZW1zUmVsKHJlbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQdWJsaXNoZWRJdGVtc0VsZW1lbnQgcHVibGlzaGVkSXRlbXNFbGVtZW50ID0gKFB1Ymxpc2hlZEl0ZW1zRWxlbWVudClldmVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgICAgY3JlYXRlQ2hpbGROb2RlKHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBpbkJvdW5kUmVsTmFtZSA9IGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBvdXRCb3VuZFJlbE5hbWUgPSBldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKTsKLSAgICAgICAgaWYgKGluQm91bmRSZWxOYW1lLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJJRVNfUEFSRU5UKSB8fCBpc1B1Ymxpc2hlZEl0ZW1zUmVsKGluQm91bmRSZWxOYW1lKSkKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgZWxzZSBpZiAob3V0Qm91bmRSZWxOYW1lLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1FVRVJJRVNfUEFSRU5UKSB8fCBpc1B1Ymxpc2hlZEl0ZW1zUmVsKG91dEJvdW5kUmVsTmFtZSkpCi0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotCi0gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKS5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBlbGVtZW50LmNvbm5lY3QobmV3IFF1ZXJ5UGFyZW50RWxlbWVudCh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTk9ERV9OQU1FX1FVRVJJRVNfRk9MREVSIiksZWxlbWVudF8uZ2V0TW9kZWwoKSksVURESU1vZGVsQ29uc3RhbnRzLlJFTF9RVUVSSUVTX1BBUkVOVCxNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIGVsZW1lbnQuY29ubmVjdChuZXcgUHVibGlzaGVkSXRlbXNFbGVtZW50KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJOT0RFX05BTUVfUFVCTElTSEVEX0JVU0lORVNTRVNfRk9MREVSIiksZWxlbWVudF8uZ2V0TW9kZWwoKSksVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfQlVTSU5FU1NFU19QQVJFTlQsTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICBlbGVtZW50LmNvbm5lY3QobmV3IFB1Ymxpc2hlZEl0ZW1zRWxlbWVudChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk5PREVfTkFNRV9QVUJMSVNIRURfU0VSVklDRVNfRk9MREVSIiksZWxlbWVudF8uZ2V0TW9kZWwoKSksVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfU0VSVklDRVNfUEFSRU5ULE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgZWxlbWVudC5jb25uZWN0KG5ldyBQdWJsaXNoZWRJdGVtc0VsZW1lbnQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFX0lOVEVSRkFDRVNfRk9MREVSIiksZWxlbWVudF8uZ2V0TW9kZWwoKSksVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfU0VSVklDRV9JTlRFUkZBQ0VTX1BBUkVOVCxNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgIHNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hlZEl0ZW1zUmVsKFN0cmluZyByZWwpCi0gIHsKLSAgICByZXR1cm4gcmVsLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9CVVNJTkVTU0VTX1BBUkVOVCkgfHwgcmVsLmVxdWFscyhVRERJTW9kZWxDb25zdGFudHMuUkVMX1BVQkxJU0hFRF9TRVJWSUNFU19QQVJFTlQpIHx8IHJlbC5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9QVUJMSVNIRURfU0VSVklDRV9JTlRFUkZBQ0VTX1BBUkVOVCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgY3JlYXRlQ2hpbGROb2RlKFF1ZXJ5UGFyZW50RWxlbWVudCBxdWVyeVBhcmVudEVsZW1lbnQpCi0gIHsKLSAgICBRdWVyeVBhcmVudE5vZGUgcXVlcnlQYXJlbnROb2RlID0gbmV3IFF1ZXJ5UGFyZW50Tm9kZShxdWVyeVBhcmVudEVsZW1lbnQsbm9kZU1hbmFnZXJfLG5vZGVEZXB0aF8rMSk7Ci0gICAgYWRkQ2hpbGQocXVlcnlQYXJlbnROb2RlKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVDaGlsZE5vZGUoUHVibGlzaGVkSXRlbXNFbGVtZW50IHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCkKLSAgewotICAgIFB1Ymxpc2hlZEl0ZW1zTm9kZSBwdWJsaXNoZWRJdGVtc05vZGUgPSBuZXcgUHVibGlzaGVkSXRlbXNOb2RlKHB1Ymxpc2hlZEl0ZW1zRWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxKTsKLSAgICBhZGRDaGlsZChwdWJsaXNoZWRJdGVtc05vZGUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCkuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgcmVnRGV0YWlsc1Rvb2xfID0gbmV3IFJlZ2lzdHJ5RGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfICx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1JFR0lTVFJZX0RFVEFJTFMiKSk7Ci0gICAgUmVnRmluZFRvb2wgcmVnRmluZFRvb2wgPSBuZXcgUmVnRmluZFRvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfRklORCIpKTsKLSAgICByZWdQdWJsaXNoVG9vbF8gPSBuZXcgUmVnUHVibGlzaFRvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfUFVCTElTSCIpKTsKLSAgICBuZXcgQWRkVG9GYXZvcml0ZXNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9UT19GQVZPUklURVMiKSk7Ci0gICAgcmVnRmluZFRvb2wuYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF8pOwotICAgIHJlZ1B1Ymxpc2hUb29sXy5hZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50Xyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBSZWdpc3RyeURldGFpbHNUb29sIGdldFJlZ0RldGFpbHNUb29sKCkKLSAgewotICAgIHJldHVybiByZWdEZXRhaWxzVG9vbF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgUmVnUHVibGlzaFRvb2wgZ2V0UmVnUHVibGlzaFRvb2woKQotICB7Ci0gICAgcmV0dXJuIHJlZ1B1Ymxpc2hUb29sXzsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBhZGREaXNjb3ZlcmVkTm9kZXMoVmVjdG9yIGFsbE5vZGVzLE5vZGUgcXVlcnlQYXJlbnROb2RlLGludCBxdWVyeVR5cGUpCi0gIHsKLSAgICBWZWN0b3IgcXVlcnlOb2RlcyA9IHF1ZXJ5UGFyZW50Tm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8cXVlcnlOb2Rlcy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIFF1ZXJ5Tm9kZSBxdWVyeU5vZGUgPSAoUXVlcnlOb2RlKXF1ZXJ5Tm9kZXMuZWxlbWVudEF0KGkpOwotICAgICAgUXVlcnlFbGVtZW50IHF1ZXJ5RWxlbWVudCA9IChRdWVyeUVsZW1lbnQpcXVlcnlOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBpZiAocXVlcnlUeXBlID09IFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9RVUVSSUVTKQotICAgICAgICBhbGxOb2Rlcy5hZGRFbGVtZW50KHF1ZXJ5Tm9kZSk7Ci0gICAgICBlbHNlIGlmIChxdWVyeUVsZW1lbnQuZ2V0UXVlcnlUeXBlKCkgPT0gcXVlcnlUeXBlKQotICAgICAgewotICAgICAgICBWZWN0b3IgZGlzY292ZXJlZE5vZGVzID0gcXVlcnlOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaj0wO2o8ZGlzY292ZXJlZE5vZGVzLnNpemUoKTtqKyspCi0gICAgICAgICAgYWxsTm9kZXMuYWRkRWxlbWVudChkaXNjb3ZlcmVkTm9kZXMuZWxlbWVudEF0KGopKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgYWRkUHVibGlzaGVkTm9kZXMoVmVjdG9yIGFsbE5vZGVzLE5vZGUgcHVibGlzaGVkSXRlbXNOb2RlKQotICB7Ci0gICAgVmVjdG9yIGl0ZW1Ob2RlcyA9IHB1Ymxpc2hlZEl0ZW1zTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8aXRlbU5vZGVzLnNpemUoKTtpKyspCi0gICAgICBhbGxOb2Rlcy5hZGRFbGVtZW50KGl0ZW1Ob2Rlcy5lbGVtZW50QXQoaSkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZ2V0QWxsQnVzaW5lc3NOb2RlcyhWZWN0b3IgYWxsQnVzaW5lc3NOb2RlcykKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHF1ZXJ5UGFyZW50Tm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFF1ZXJ5UGFyZW50RWxlbWVudCgpKTsKLSAgICBOb2RlIHB1Ymxpc2hlZEJ1c2luZXNzZXNOb2RlID0gZ2V0Q2hpbGROb2RlKHJlZ0VsZW1lbnQuZ2V0UHVibGlzaGVkQnVzaW5lc3Nlc0VsZW1lbnQoKSk7Ci0gICAgYWRkRGlzY292ZXJlZE5vZGVzKGFsbEJ1c2luZXNzTm9kZXMscXVlcnlQYXJlbnROb2RlLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKTsKLSAgICBhZGRQdWJsaXNoZWROb2RlcyhhbGxCdXNpbmVzc05vZGVzLHB1Ymxpc2hlZEJ1c2luZXNzZXNOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGdldEFsbFNlcnZpY2VOb2RlcyhWZWN0b3IgYWxsU2VydmljZXNOb2RlcykKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHF1ZXJ5UGFyZW50Tm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFF1ZXJ5UGFyZW50RWxlbWVudCgpKTsKLSAgICBOb2RlIHB1Ymxpc2hlZFNlcnZpY2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VzRWxlbWVudCgpKTsKLSAgICBhZGREaXNjb3ZlcmVkTm9kZXMoYWxsU2VydmljZXNOb2RlcyxxdWVyeVBhcmVudE5vZGUsVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKTsKLSAgICBhZGRQdWJsaXNoZWROb2RlcyhhbGxTZXJ2aWNlc05vZGVzLHB1Ymxpc2hlZFNlcnZpY2VzTm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBnZXRBbGxTZXJ2aWNlSW50ZXJmYWNlTm9kZXMoVmVjdG9yIGFsbFNlcnZpY2VJbnRlcmZhY2VOb2RlcykKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHF1ZXJ5UGFyZW50Tm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFF1ZXJ5UGFyZW50RWxlbWVudCgpKTsKLSAgICBOb2RlIHB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzRWxlbWVudCgpKTsKLSAgICBhZGREaXNjb3ZlcmVkTm9kZXMoYWxsU2VydmljZUludGVyZmFjZU5vZGVzLHF1ZXJ5UGFyZW50Tm9kZSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgICBhZGRQdWJsaXNoZWROb2RlcyhhbGxTZXJ2aWNlSW50ZXJmYWNlTm9kZXMscHVibGlzaGVkU2VydmljZUludGVyZmFjZXNOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGdldFB1Ymxpc2hlZEJ1c2luZXNzTm9kZXMoVmVjdG9yIHB1Ymxpc2hlZEJ1c2luZXNzTm9kZXMpCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF87Ci0gICAgTm9kZSBwdWJsaXNoZWRCdXNpbmVzc2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZEJ1c2luZXNzZXNFbGVtZW50KCkpOwotICAgIGFkZFB1Ymxpc2hlZE5vZGVzKHB1Ymxpc2hlZEJ1c2luZXNzTm9kZXMscHVibGlzaGVkQnVzaW5lc3Nlc05vZGUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgZ2V0UHVibGlzaGVkU2VydmljZU5vZGVzKFZlY3RvciBwdWJsaXNoZWRTZXJ2aWNlTm9kZXMpCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF87Ci0gICAgTm9kZSBwdWJsaXNoZWRTZXJ2aWNlc05vZGUgPSBnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRQdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQoKSk7Ci0gICAgYWRkUHVibGlzaGVkTm9kZXMocHVibGlzaGVkU2VydmljZU5vZGVzLHB1Ymxpc2hlZFNlcnZpY2VzTm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBnZXRQdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlTm9kZXMoVmVjdG9yIHB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VOb2RlcykKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzRWxlbWVudCgpKTsKLSAgICBhZGRQdWJsaXNoZWROb2RlcyhwdWJsaXNoZWRTZXJ2aWNlSW50ZXJmYWNlTm9kZXMscHVibGlzaGVkU2VydmljZUludGVyZmFjZXNOb2RlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGdldERpc2NvdmVyZWROb2RlcyhWZWN0b3IgZGlzY292ZXJlZE5vZGVzLGludCBxdWVyeUl0ZW0pCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF87Ci0gICAgTm9kZSBxdWVyeVBhcmVudE5vZGUgPSBnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRRdWVyeVBhcmVudEVsZW1lbnQoKSk7Ci0gICAgYWRkRGlzY292ZXJlZE5vZGVzKGRpc2NvdmVyZWROb2RlcyxxdWVyeVBhcmVudE5vZGUscXVlcnlJdGVtKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNRdWVyeVJlc3VsdHMoTm9kZSBxdWVyeVBhcmVudE5vZGUsaW50IHF1ZXJ5VHlwZSkKLSAgewotICAgIFZlY3RvciBxdWVyaWVzID0gcXVlcnlQYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpPTA7aTxxdWVyaWVzLnNpemUoKTtpKyspCi0gICAgewotICAgICAgUXVlcnlOb2RlIHF1ZXJ5Tm9kZSA9IChRdWVyeU5vZGUpcXVlcmllcy5lbGVtZW50QXQoaSk7Ci0gICAgICBpZiAocXVlcnlOb2RlLmdldENoaWxkTm9kZXMoKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBRdWVyeUVsZW1lbnQgcXVlcnlFbGVtZW50ID0gKFF1ZXJ5RWxlbWVudClxdWVyeU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHF1ZXJ5RWxlbWVudC5nZXRRdWVyeVR5cGUoKSA9PSBxdWVyeVR5cGUpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0J1c2luZXNzKCkKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHB1Ymxpc2hlZEJ1c2luZXNzZXNOb2RlID0gZ2V0Q2hpbGROb2RlKHJlZ0VsZW1lbnQuZ2V0UHVibGlzaGVkQnVzaW5lc3Nlc0VsZW1lbnQoKSk7Ci0gICAgaWYgKHB1Ymxpc2hlZEJ1c2luZXNzZXNOb2RlLmdldENoaWxkTm9kZXMoKS5zaXplKCkgPiAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGhhc1F1ZXJ5UmVzdWx0cyhnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRRdWVyeVBhcmVudEVsZW1lbnQoKSksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzU2VydmljZSgpCi0gIHsKLSAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpZWxlbWVudF87Ci0gICAgTm9kZSBwdWJsaXNoZWRTZXJ2aWNlc05vZGUgPSBnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRQdWJsaXNoZWRTZXJ2aWNlc0VsZW1lbnQoKSk7Ci0gICAgaWYgKHB1Ymxpc2hlZFNlcnZpY2VzTm9kZS5nZXRDaGlsZE5vZGVzKCkuc2l6ZSgpID4gMCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBoYXNRdWVyeVJlc3VsdHMoZ2V0Q2hpbGROb2RlKHJlZ0VsZW1lbnQuZ2V0UXVlcnlQYXJlbnRFbGVtZW50KCkpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNTZXJ2aWNlSW50ZXJmYWNlKCkKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50XzsKLSAgICBOb2RlIHB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzTm9kZSA9IGdldENoaWxkTm9kZShyZWdFbGVtZW50LmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VzRWxlbWVudCgpKTsKLSAgICBpZiAocHVibGlzaGVkU2VydmljZUludGVyZmFjZXNOb2RlLmdldENoaWxkTm9kZXMoKS5zaXplKCkgPiAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGhhc1F1ZXJ5UmVzdWx0cyhnZXRDaGlsZE5vZGUocmVnRWxlbWVudC5nZXRRdWVyeVBhcmVudEVsZW1lbnQoKSksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1Jlc3VsdHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9SZXN1bHRzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjM0MGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1Jlc3VsdHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFJlc3VsdHNUb29sIGV4dGVuZHMgRm9ybVRvb2wKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZm9ybUxpbmtfOwotCi0gIHB1YmxpYyBSZXN1bHRzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsImltYWdlcy9kZXRhaWxzX2VuYWJsZWQuZ2lmIiwiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIixhbHQpOwotICAgIGZvcm1MaW5rXyA9IFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygidWRkaS9mb3Jtcy9SZXN1bHRzRm9ybS5qc3AiKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuIGZvcm1MaW5rXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUm9vdENhdGVnb3J5Tm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvUm9vdENhdGVnb3J5Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzI2ZWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1Jvb3RDYXRlZ29yeU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgUm9vdENhdGVnb3J5Tm9kZSBleHRlbmRzIE5vZGUKLXsKLSAgcHVibGljIFJvb3RDYXRlZ29yeU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcikKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsMSwiaW1hZ2VzL3Jvb3RfbWFpbi5naWYiKTsKLSAgICBzZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbih0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNyZWF0ZUNoaWxkcmVuKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGNoaWxkcmVuID0gZWxlbWVudF8uZ2V0RWxlbWVudHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9TVUJDQVRFR09SSUVTKTsKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICB3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIENhdGVnb3J5RWxlbWVudCBjYXRlZ29yeUVsZW1lbnQgPSAoQ2F0ZWdvcnlFbGVtZW50KWNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIENhdGVnb3J5Tm9kZSBjYXRlZ29yeU5vZGUgPSBuZXcgQ2F0ZWdvcnlOb2RlKGNhdGVnb3J5RWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxKTsKLSAgICAgICAgYWRkQ2hpbGQoY2F0ZWdvcnlOb2RlKTsKLSAgICAgICAgY2F0ZWdvcnlOb2RlLmNyZWF0ZUNoaWxkcmVuKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gUm9vdCBub2RlOiBubyBuZWVkIGZvciB0b2dnbGUgYWN0aW9uLgotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFRvZ2dsZU5vZGVBY3Rpb25IcmVmKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvLyBUZXh0IG9ubHkgbm9kZS4KLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRMaW5rQWN0aW9uSHJlZigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TZXJ2aWNlRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzE0YWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS4qOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlRGV0YWlsc1Rvb2wgZXh0ZW5kcyBEZXRhaWxzVG9vbAotewotICBwdWJsaWMgU2VydmljZURldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQsUHJveHlMb2FkUGFnZUFjdGlvbi5nZXRBY3Rpb25MaW5rKCJ1ZGRpL2Zvcm1zL1NlcnZpY2VEZXRhaWxzRm9ybS5qc3AiKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKQotICB7Ci0gICAgY2xlYXJQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKTsKLSAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudCkodG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKTsKLSAgICBCdXNpbmVzc1NlcnZpY2UgYnVzU2VydmljZSA9IHNlcnZpY2VFbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpOwotCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZLGJ1c1NlcnZpY2UuZ2V0U2VydmljZUtleSgpKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLGJ1c1NlcnZpY2UuZ2V0QnVzaW5lc3NLZXkoKSk7Ci0KLSAgICBWZWN0b3IgbmFtZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBjb3B5SW5kZXhWZWN0b3IoYnVzU2VydmljZS5nZXROYW1lVmVjdG9yKCksbmFtZVZlY3Rvcik7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLG5hbWVWZWN0b3IpOwotCi0gICAgVmVjdG9yIGRlc2NyaXB0aW9uVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIGNvcHlJbmRleFZlY3RvcihidXNTZXJ2aWNlLmdldERlc2NyaXB0aW9uVmVjdG9yKCksZGVzY3JpcHRpb25WZWN0b3IpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMsZGVzY3JpcHRpb25WZWN0b3IpOwotCi0gICAgQ2F0ZWdvcnlCYWcgY2F0QmFnID0gYnVzU2VydmljZS5nZXRDYXRlZ29yeUJhZygpOwotICAgIGlmIChjYXRCYWcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgY2F0VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgY29weUluZGV4VmVjdG9yKGNhdEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpLGNhdFZlY3Rvcik7Ci0gICAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyxjYXRWZWN0b3IpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgICBTdHJpbmcgdXNlcklkID0gcmVnRWxlbWVudC5nZXRVc2VySWQoKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSByZWdFbGVtZW50LmdldENyZWQoKTsKLQotICAgIGlmIChwdWJsaXNoVVJMID09IG51bGwpCi0gICAgICBwdWJsaXNoVVJMID0gIiI7Ci0gICAgaWYgKHVzZXJJZCA9PSBudWxsKQotICAgICAgdXNlcklkID0gIiI7Ci0gICAgaWYgKHBhc3N3b3JkID09IG51bGwpCi0gICAgICBwYXNzd29yZCA9ICIiOwotCi0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCxwdWJsaXNoVVJMKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCx1c2VySWQpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQscGFzc3dvcmQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VJbnRlcmZhY2VEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDRmMWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VJbnRlcmZhY2VEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC4qOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1Rvb2wgZXh0ZW5kcyBEZXRhaWxzVG9vbAotewotICBwdWJsaWMgU2VydmljZUludGVyZmFjZURldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQsUHJveHlMb2FkUGFnZUFjdGlvbi5nZXRBY3Rpb25MaW5rKCJ1ZGRpL2Zvcm1zL1NlcnZpY2VJbnRlcmZhY2VEZXRhaWxzRm9ybS5qc3AiKSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKQotICB7Ci0gICAgY2xlYXJQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKTsKLSAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBzaUVsZW1lbnQgPSAoU2VydmljZUludGVyZmFjZUVsZW1lbnQpKHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgVE1vZGVsIHRNb2RlbCA9IHNpRWxlbWVudC5nZXRUTW9kZWwoKTsKLQotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVksdE1vZGVsLmdldFRNb2RlbEtleSgpKTsKLSAgICBMaXN0RWxlbWVudCBuYW1lTGlzdEVsZW1lbnQgPSBuZXcgTGlzdEVsZW1lbnQodE1vZGVsLmdldE5hbWVTdHJpbmcoKSk7Ci0gICAgbmFtZUxpc3RFbGVtZW50LnNldFRhcmdldFZpZXdUb29sSW5mbygtMSwtMSwwKTsKLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUsbmFtZUxpc3RFbGVtZW50KTsKLQotICAgIFZlY3RvciBkZXNjcmlwdGlvblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBjb3B5SW5kZXhWZWN0b3IodE1vZGVsLmdldERlc2NyaXB0aW9uVmVjdG9yKCksZGVzY3JpcHRpb25WZWN0b3IpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGRlc2NyaXB0aW9uVmVjdG9yKTsKLQotICAgIElkZW50aWZpZXJCYWcgaWRCYWcgPSB0TW9kZWwuZ2V0SWRlbnRpZmllckJhZygpOwotICAgIGlmIChpZEJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciBpZFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGNvcHlJbmRleFZlY3RvcihpZEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpLGlkVmVjdG9yKTsKLSAgICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfSURFTlRJRklFUlMsaWRWZWN0b3IpOwotICAgIH0KLQotICAgIENhdGVnb3J5QmFnIGNhdEJhZyA9IHRNb2RlbC5nZXRDYXRlZ29yeUJhZygpOwotICAgIGlmIChjYXRCYWcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgY2F0VmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgY29weUluZGV4VmVjdG9yKGNhdEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpLGNhdFZlY3Rvcik7Ci0gICAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMsY2F0VmVjdG9yKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU2VydmljZUludGVyZmFjZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VJbnRlcmZhY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGNhZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU2VydmljZUludGVyZmFjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW50ZXJmYWNlTm9kZSBleHRlbmRzIFVERElOYXZpZ2F0b3JOb2RlCi17Ci0gIHByaXZhdGUgRGV0YWlsc1Rvb2wgZGV0YWlsc1Rvb2xfOwotICBwcml2YXRlIFVucHVibGlzaFRvb2wgdW5wdWJsaXNoVG9vbF87Ci0gIHB1YmxpYyBTZXJ2aWNlSW50ZXJmYWNlTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCwidWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBkZXRhaWxzVG9vbF8gPSBuZXcgU2VydmljZUludGVyZmFjZURldGFpbHNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFMiKSk7Ci0gICAgbmV3IEdldFNlcnZpY2VzVG9vbCh0b29sTWFuYWdlcl8sdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9HRVRfU0VSVklDRVMiKSxTZXJ2aWNlSW50ZXJmYWNlR2V0U2VydmljZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWRfKSk7Ci0gICAgbmV3IEdldEJ1c2luZXNzZXNUb29sKHRvb2xNYW5hZ2VyXywidWRkaS9pbWFnZXMvYnVzaW5lc3Nlc19jbG9zZWRfZW5hYmxlZC5naWYiLCJ1ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYiLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfR0VUX0JVU0lORVNTRVMiKSxTZXJ2aWNlSW50ZXJmYWNlR2V0QnVzaW5lc3Nlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8pKTsKLSAgICBuZXcgVURESUltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wodG9vbE1hbmFnZXJfLGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0lNUE9SVF9XU0RMX1RPX1dPUktCRU5DSCIpKTsKLSAgICBuZXcgVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sKHRvb2xNYW5hZ2VyXyxjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0lNUE9SVF9UT19GUyIpKTsKLSAgICBuZXcgVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sKHRvb2xNYW5hZ2VyXyxjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9MQVVOQ0hfV0VCX1NFUlZJQ0VfV0laQVJEIikpOwotICAgIG5ldyBBZGRUb0Zhdm9yaXRlc1Rvb2wodG9vbE1hbmFnZXJfLCB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9UT19GQVZPUklURVMiKSk7Ci0gICAgdW5wdWJsaXNoVG9vbF8gPSBuZXcgVW5wdWJsaXNoVG9vbCh0b29sTWFuYWdlcl8sInVkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9lbmFibGVkLmdpZiIsInVkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9oaWdobGlnaHRlZC5naWYiLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfVU5QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFIikpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBkZXRhaWxzVG9vbF8uYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKHJlZ0VsZW1lbnQpOwotICAgIHVucHVibGlzaFRvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXU0RMVVJMRnJvbURldGFpbHNUb29sKCkKLSAgewotICAgIExpc3RFbGVtZW50IHdzZGxVUkxMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClkZXRhaWxzVG9vbF8uZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICAgaWYgKHdzZGxVUkxMaXN0RWxlbWVudCAhPSBudWxsKQotICAgICAgcmV0dXJuIChTdHJpbmcpd3NkbFVSTExpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAidGVtcC53c2RsIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU2VydmljZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1NlcnZpY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzJiMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU2VydmljZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLio7Ci0KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlTm9kZSBleHRlbmRzIFVERElOYXZpZ2F0b3JOb2RlCi17Ci0gIHByaXZhdGUgRGV0YWlsc1Rvb2wgZGV0YWlsc1Rvb2xfOwotICBwcml2YXRlIFVucHVibGlzaFRvb2wgdW5wdWJsaXNoVG9vbF87Ci0gIHB1YmxpYyBTZXJ2aWNlTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCwidWRkaS9pbWFnZXMvc2VydmljZV9oaWdobGlnaHRlZC5naWYiKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRUb29scygpCi0gIHsKLSAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpOwotICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgIGRldGFpbHNUb29sXyA9IG5ldyBTZXJ2aWNlRGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU0VSVklDRV9ERVRBSUxTIikpOwotICAgIG5ldyBHZXRCdXNpbmVzc2VzVG9vbCh0b29sTWFuYWdlcl8sInVkZGkvaW1hZ2VzL2J1c2luZXNzX2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0dFVF9CVVNJTkVTUyIpLFNlcnZpY2VHZXRCdXNpbmVzc0FjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8pKTsKLSAgICBuZXcgR2V0U2VydmljZUludGVyZmFjZXNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0dFVF9TRVJWSUNFX0lOVEVSRkFDRVMiKSxTZXJ2aWNlR2V0U2VydmljZUludGVyZmFjZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWRfKSk7Ci0gICAgbmV3IFVERElJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sKHRvb2xNYW5hZ2VyXyxjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9JTVBPUlRfV1NETF9UT19XT1JLQkVOQ0giKSk7Ci0gICAgbmV3IFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbCh0b29sTWFuYWdlcl8sY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfV1NETF9JTVBPUlRfVE9fRlMiKSk7Ci0gICAgbmV3IFVERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbCh0b29sTWFuYWdlcl8sY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTEFVTkNIX1dFQl9TRVJWSUNFX1dJWkFSRCIpKTsKLSAgICBuZXcgVURESUFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCh0b29sTWFuYWdlcl8sdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfVE9fV1NETF9QRVJTUEVDVElWRSIpKTsKLSAgICBuZXcgQWRkVG9GYXZvcml0ZXNUb29sKHRvb2xNYW5hZ2VyXyx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9UT19GQVZPUklURVMiKSk7Ci0gICAgdW5wdWJsaXNoVG9vbF8gPSBuZXcgVW5wdWJsaXNoVG9vbCh0b29sTWFuYWdlcl8sInVkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2VuYWJsZWQuZ2lmIiwidWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIix1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1VOUFVCTElTSF9TRVJWSUNFIikpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBkZXRhaWxzVG9vbF8uYWRkQXV0aGVudGljYXRpb25Qcm9wZXJ0aWVzKHJlZ0VsZW1lbnQpOwotICAgIHVucHVibGlzaFRvb2xfLmFkZEF1dGhlbnRpY2F0aW9uUHJvcGVydGllcyhyZWdFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFVSTEZyb21EZXRhaWxzVG9vbCgpCi0gIHsKLSAgICBMaXN0RWxlbWVudCB3c2RsVVJMTGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZGV0YWlsc1Rvb2xfLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICAgaWYgKHdzZGxVUkxMaXN0RWxlbWVudCAhPSBudWxsKQotICAgICAgcmV0dXJuIChTdHJpbmcpd3NkbFVSTExpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAidGVtcC53c2RsIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU3ViUXVlcnlLZXlQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvU3ViUXVlcnlLZXlQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzExNTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1N1YlF1ZXJ5S2V5UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotcHVibGljIGNsYXNzIFN1YlF1ZXJ5S2V5UHJvcGVydHkKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgc3ViUXVlcnlLZXlfOwotCi0gIHB1YmxpYyBTdWJRdWVyeUtleVByb3BlcnR5KCkKLSAgewotICAgIHN1YlF1ZXJ5S2V5XyA9ICIiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0U3ViUXVlcnlLZXkoU3RyaW5nIHN1YlF1ZXJ5S2V5KQotICB7Ci0gICAgc3ViUXVlcnlLZXlfID0gc3ViUXVlcnlLZXk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN1YlF1ZXJ5S2V5KCkKLSAgewotICAgIHJldHVybiBzdWJRdWVyeUtleV87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1N1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1N1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhOGZhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9TdWJRdWVyeVRyYW5zZmVyVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQKLXsKLSAgcHJpdmF0ZSBpbnQgbm9kZUlkXzsKLSAgcHJpdmF0ZSBpbnQgdG9vbElkXzsKLSAgcHJpdmF0ZSBpbnQgdmlld0lkXzsKLSAgcHJpdmF0ZSBpbnQgdmlld1Rvb2xJZF87Ci0gIHByaXZhdGUgU3RyaW5nIHN1YlF1ZXJ5S2V5XzsKLSAgcHJpdmF0ZSBOb2RlTWFuYWdlciBub2RlTWFuYWdlcl87Ci0gIEhhc2h0YWJsZSBwYXJlbnRRdWVyeURhdGFfOwotCi0gIHB1YmxpYyBTdWJRdWVyeVRyYW5zZmVyVGFyZ2V0KE5vZGUgbm9kZSxTdHJpbmcgc3ViUXVlcnlLZXksSGFzaHRhYmxlIHBhcmVudFF1ZXJ5RGF0YSkKLSAgewotICAgIG5vZGVJZF8gPSBub2RlLmdldE5vZGVJZCgpOwotICAgIHRvb2xJZF8gPSBub2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKTsKLSAgICB2aWV3SWRfID0gbm9kZS5nZXRWaWV3SWQoKTsKLSAgICB2aWV3VG9vbElkXyA9IG5vZGUuZ2V0Vmlld1Rvb2xJZCgpOwotICAgIHN1YlF1ZXJ5S2V5XyA9IHN1YlF1ZXJ5S2V5OwotICAgIG5vZGVNYW5hZ2VyXyA9IG5vZGUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBwYXJlbnRRdWVyeURhdGFfID0gcGFyZW50UXVlcnlEYXRhOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXROb2RlSWQoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVJZF87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFRvb2xJZCgpCi0gIHsKLSAgICByZXR1cm4gdG9vbElkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Vmlld0lkKCkKLSAgewotICAgIHJldHVybiB2aWV3SWRfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRWaWV3VG9vbElkKCkKLSAgewotICAgIHJldHVybiB2aWV3VG9vbElkXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3ViUXVlcnlLZXkoKQotICB7Ci0gICAgcmV0dXJuIHN1YlF1ZXJ5S2V5XzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBGb3JtVG9vbCBnZXRUYXJnZXRGb3JtVG9vbCgpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSWRfKTsKLSAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBUb29sIHRvb2wgPSBub2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0VG9vbCh0b29sSWRfKTsKLQotICAgIGlmICh2aWV3SWRfICE9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICB7Ci0gICAgICBWaWV3VG9vbCB2aWV3VG9vbCA9IChWaWV3VG9vbCl0b29sOwotICAgICAgVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyID0gdmlld1Rvb2wuZ2V0VG9vbE1hbmFnZXIodmlld0lkXyk7Ci0gICAgICBpZiAodmlld1Rvb2xNYW5hZ2VyICE9IG51bGwpCi0gICAgICAgIHRvb2wgPSB2aWV3VG9vbE1hbmFnZXIuZ2V0VG9vbCh2aWV3VG9vbElkXyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHRvb2wgPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gKEZvcm1Ub29sKXRvb2w7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBIYXNodGFibGUgZ2V0UGFyZW50UXVlcnlEYXRhKCkKLSAgewotICAgIHJldHVybiBwYXJlbnRRdWVyeURhdGFfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjFmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgVURESUFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCBleHRlbmRzIEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCB7Ci0gIHB1YmxpYyBVRERJQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFVERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1Ub29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU5ZjdmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbCBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbVRvb2wKLXsKLSAgcHVibGljIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluaygpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTJhZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFVERElJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sIGV4dGVuZHMgSW1wb3J0VG9Xb3JrYmVuY2hUb29sCi17Ci0gIHB1YmxpYyBVRERJSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KQotICB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL1VERElJbXBvcnRXU0RMVG9Xb3JrYmVuY2hGb3JtLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOTlkMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBVRERJTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wgZXh0ZW5kcyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbAotewotICBwdWJsaWMgVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGUuZ2V0Tm9kZUlkKCksdG9vbElkXyxub2RlLmdldFZpZXdJZCgpLG5vZGUuZ2V0Vmlld1Rvb2xJZCgpLGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvZm9ybXMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElNYWluTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESU1haW5Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzczZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESU1haW5Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vLyBSb290IG5vZGUgZm9yIHRoZSBVRERJIE5hdmlnYXRvciBUcmVlIFZpZXcKLXB1YmxpYyBjbGFzcyBVRERJTWFpbk5vZGUgZXh0ZW5kcyBVRERJTmF2aWdhdG9yTm9kZQotewotICBwdWJsaWMgVURESU1haW5Ob2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLDEsImltYWdlcy9yb290X21haW4uZ2lmIik7Ci0gICAgZWxlbWVudC5hZGRMaXN0ZW5lcihuZXcgRWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJlbEFkZGVkKFJlbEFkZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgIGlmIChyZWwuZXF1YWxzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUkVHSVNUUklFUykpCi0gICAgICAgIHsKLSAgICAgICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnaXN0cnlFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClldmVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgICAgICAgVURESU1haW5FbGVtZW50IHVkZGlNYWluRWxlbWVudCA9IChVRERJTWFpbkVsZW1lbnQpZWxlbWVudF87Ci0gICAgICAgICAgdWRkaU1haW5FbGVtZW50LmFkZFJlZ2lzdHJ5TmFtZShyZWdpc3RyeUVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBjcmVhdGVDaGlsZE5vZGUocmVnaXN0cnlFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBSZWdpc3RyeUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKFVERElNb2RlbENvbnN0YW50cy5SRUxfUkVHSVNUUklFUykpCi0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClldmVudC5nZXRJbmJvdW5kRWxlbWVudCgpOwotICAgICAgICBlbHNlIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoVURESU1vZGVsQ29uc3RhbnRzLlJFTF9SRUdJU1RSSUVTKSkKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotCi0gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFVERElNYWluRWxlbWVudCB1ZGRpTWFpbkVsZW1lbnQgPSAoVURESU1haW5FbGVtZW50KWVsZW1lbnRfOwotICAgICAgICAgIHVkZGlNYWluRWxlbWVudC5yZW1vdmVSZWdpc3RyeU5hbWUoY2hpbGRFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgcmVtb3ZlQ2hpbGROb2RlKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjcmVhdGVDaGlsZE5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCllbGVtZW50OwotICAgIEVudW1lcmF0aW9uIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IHJlZ0VsZW1lbnQuZ2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKCk7Ci0gICAgU3RyaW5nIGltYWdlUGF0aDsKLSAgICBpZiAodXNlckRlZmluZWRDYXRlZ29yaWVzICE9IG51bGwgJiYgdXNlckRlZmluZWRDYXRlZ29yaWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgaW1hZ2VQYXRoID0gUmVnaXN0cnlOb2RlLklNQUdFX1BBVEhfV0lUSF9VU0VSX0RFRklORURfQ0FURUdPUklFUzsKLSAgICBlbHNlCi0gICAgICBpbWFnZVBhdGggPSBSZWdpc3RyeU5vZGUuSU1BR0VfUEFUSF9TVEFOREFSRDsKLSAgICAKLSAgICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IG5ldyBSZWdpc3RyeU5vZGUoZWxlbWVudCxub2RlTWFuYWdlcl8sbm9kZURlcHRoXysxLGltYWdlUGF0aCk7Ci0gICAgYWRkQ2hpbGQocmVnTm9kZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgICBuZXcgT3BlblJlZ2lzdHJ5VG9vbCh0b29sTWFuYWdlcl8sdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9PUEVOX1JFR0lTVFJZIikpOwotICB9Ci0gIAotICAvLyBHaXZlbiBhIG5vZGUgdW5kZXIgYSBwYXJ0aWN1bGFyIHJlZ2lzdHJ5IG5vZGUsIG9idGFpbiB0aGUgcmVnaXN0cnkgbm9kZS4KLSAgcHVibGljIGZpbmFsIFJlZ2lzdHJ5Tm9kZSBnZXRSZWdpc3RyeU5vZGUoTm9kZSBjdXJyZW50Tm9kZSkKLSAgewotICAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gbnVsbDsKLSAgICBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBSZWdpc3RyeU5vZGUpCi0gICAgewotICAgICAgcmVnTm9kZSA9IChSZWdpc3RyeU5vZGUpY3VycmVudE5vZGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgUXVlcnlOb2RlKQotICAgIHsKLSAgICAgIC8vIFF1ZXJ5IC0+IFF1ZXJ5IGZvbGRlciAtPiBSZWdpc3RyeQotICAgICAgcmVnTm9kZSA9IChSZWdpc3RyeU5vZGUpKGN1cnJlbnROb2RlLmdldFBhcmVudCgpLmdldFBhcmVudCgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBRdWVyeVBhcmVudE5vZGUgfHwgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBQdWJsaXNoZWRJdGVtc05vZGUpCi0gICAgewotICAgICAgLy8gUXVlcnkgZm9sZGVyIC0+IFJlZ2lzdHJ5Ci0gICAgICByZWdOb2RlID0gKFJlZ2lzdHJ5Tm9kZSkoY3VycmVudE5vZGUuZ2V0UGFyZW50KCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEJ1c2luZXNzTm9kZSB8fCBjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VOb2RlIHx8IGN1cnJlbnROb2RlIGluc3RhbmNlb2YgU2VydmljZUludGVyZmFjZU5vZGUpCi0gICAgewotICAgICAgLy8gaXRlbU5vZGUgLT4gUHVibGlzaGVkIEl0ZW1zIGZvbGRlciAtPiBSZWdpc3RyeQotICAgICAgLy8gT1I6Ci0gICAgICAvLyBpdGVtTm9kZSAtPiBRdWVyeU5vZGUgLT4gUXVlcnkgZm9sZGVyIC0+IFJlZ2lzdHJ5Ci0gICAgICBOb2RlIHBhcmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXRQYXJlbnQoKTsKLSAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgUXVlcnlOb2RlKQotICAgICAgICByZWdOb2RlID0gKFJlZ2lzdHJ5Tm9kZSkocGFyZW50Tm9kZS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlZ05vZGUgPSAoUmVnaXN0cnlOb2RlKXBhcmVudE5vZGUuZ2V0UGFyZW50KCk7Ci0gICAgfQotICAgIHJldHVybiByZWdOb2RlOyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESU5hdmlnYXRvckZvbGRlck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3BlcnNwZWN0aXZlL1VERElOYXZpZ2F0b3JGb2xkZXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjZhMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESU5hdmlnYXRvckZvbGRlck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVRERJTmF2aWdhdG9yRm9sZGVyTm9kZSBleHRlbmRzIEZvbGRlck5vZGUKLXsKLSAgcHVibGljIFVERElOYXZpZ2F0b3JGb2xkZXJOb2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsaW50IG5vZGVEZXB0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoKTsKLSAgfQotCi0gIC8vIHVkZGkvYWN0aW9ucy9Ub2dnbGVOYXZpZ2F0b3JOb2RlQWN0aW9uLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKQotICB7Ci0gICAgcmV0dXJuIFRvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWRfLGlzT3Blbl8pOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1NlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb24uanNwP25vZGVJZD0uLi4KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRMaW5rQWN0aW9uSHJlZigpCi0gIHsKLSAgICByZXR1cm4gU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8sZmFsc2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJTmF2aWdhdG9yTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESU5hdmlnYXRvck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5MDI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJTmF2aWdhdG9yTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFVERElOYXZpZ2F0b3JOb2RlIGV4dGVuZHMgTm9kZQotewotICBwdWJsaWMgVURESU5hdmlnYXRvck5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoLFN0cmluZyBpbWFnZVBhdGgpCi0gIHsKLSAgICBzdXBlcihlbGVtZW50LG5vZGVNYW5hZ2VyLG5vZGVEZXB0aCxpbWFnZVBhdGgpOwotICB9Ci0KLSAgLy8gdWRkaS9hY3Rpb25zL1RvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24uanNwP25vZGVJZD0uLi4KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUb2dnbGVOb2RlQWN0aW9uSHJlZigpCi0gIHsKLSAgICByZXR1cm4gVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8saXNPcGVuXyk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLgotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldExpbmtBY3Rpb25IcmVmKCkKLSAgewotICAgIHJldHVybiBTZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVURESVBlcnNwZWN0aXZlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyMTg5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VRERJUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLkJhc2ljTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIuZmF2b3JpdGVzLkZhdm9yaXRlc1JlZ2lzdHJ5VHlwZURlZmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5UcmVlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuQWRkUmVnaXN0cnlUb1VERElQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNNYWluRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC5GYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5QZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLk9wZW5SZWdpc3RyeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlN3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLlVERElBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLkNhdGVnb3J5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuVURESU1haW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmZhdm9yaXRlcy5JRmF2b3JpdGVzVURESVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLQotcHVibGljIGNsYXNzIFVERElQZXJzcGVjdGl2ZSBleHRlbmRzIFBlcnNwZWN0aXZlCi17Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGtub3duUmVnaXN0cmllc187Ci0gIHByaXZhdGUgSUZhdm9yaXRlc1VERElSZWdpc3RyeSBpYm1QdWJsaWNVRERJVGVzdFJlZ2lzdHJ5XzsKLSAgcHJpdmF0ZSBNb2RlbCBuYXZpZ2F0b3JNb2RlbF87Ci0gIHByaXZhdGUgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlcl87Ci0gIHByaXZhdGUgaW50IHdzZGxUeXBlXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgY2F0ZWdvcnlNYW5hZ2Vyc187Ci0gIFN0cmluZyBjYXRlZ29yeVRNb2RlbEtleV87Ci0gIAotICAvLyBXaW5kb3cgc2l6ZXMKLSAgcHJpdmF0ZSBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICBwcml2YXRlIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJQk1fVEVTVF9SRUdfSU5RVUlSWV9VUkwgPSAiaHR0cDovL3VkZGkuaWJtLmNvbS90ZXN0cmVnaXN0cnkvaW5xdWlyeWFwaSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIElCTV9URVNUX1JFR19QVUJMSVNIX1VSTCA9ICJodHRwczovL3VkZGkuaWJtLmNvbS90ZXN0cmVnaXN0cnkvcHVibGlzaGFwaSI7Ci0KLSAgcHVibGljIFVERElQZXJzcGVjdGl2ZShDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcigidWRkaSIsY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBpbml0UGVyc3BlY3RpdmUoU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gIHsKLSAgICBTdHJpbmcgZGVmYXVsdEZhdm9yaXRlcyA9IGNvbnRyb2xsZXJfLmdldERlZmF1bHRGYXZvcml0ZXNMb2NhdGlvbigpOwotCUZhdm9yaXRlc1JlZ2lzdHJ5VHlwZURlZmF1bHQgZmF2UmVnVHlwZURlZmF1bHQgPSBuZXcgRmF2b3JpdGVzUmVnaXN0cnlUeXBlRGVmYXVsdChkZWZhdWx0RmF2b3JpdGVzKTsKLSAgICBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5W10gZmF2UmVnaXN0cmllc0RlZmF1bHQgPSBmYXZSZWdUeXBlRGVmYXVsdC5nZXRGYXZvcml0ZXNVRERJUmVnaXN0cmllcygpOwotICAgIGtub3duUmVnaXN0cmllc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZm9yIChpbnQgaT0wO2k8ZmF2UmVnaXN0cmllc0RlZmF1bHQubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAoZmF2UmVnaXN0cmllc0RlZmF1bHRbaV0uZ2V0SW5xdWlyeVVSTCgpLmVxdWFscyhJQk1fVEVTVF9SRUdfSU5RVUlSWV9VUkwpICYmIGZhdlJlZ2lzdHJpZXNEZWZhdWx0W2ldLmdldFB1Ymxpc2hVUkwoKS5lcXVhbHMoSUJNX1RFU1RfUkVHX1BVQkxJU0hfVVJMKSkKLSAgICAgICAgaWJtUHVibGljVURESVRlc3RSZWdpc3RyeV8gPSBmYXZSZWdpc3RyaWVzRGVmYXVsdFtpXTsKLSAgICAgIGtub3duUmVnaXN0cmllc18ucHV0KGZhdlJlZ2lzdHJpZXNEZWZhdWx0W2ldLmdldElucXVpcnlVUkwoKSxmYXZSZWdpc3RyaWVzRGVmYXVsdFtpXSk7Ci0gICAgfQotICAgIGlmIChpYm1QdWJsaWNVRERJVGVzdFJlZ2lzdHJ5XyA9PSBudWxsICYmIGZhdlJlZ2lzdHJpZXNEZWZhdWx0Lmxlbmd0aCA+IDApCi0gICAgICBpYm1QdWJsaWNVRERJVGVzdFJlZ2lzdHJ5XyA9IGZhdlJlZ2lzdHJpZXNEZWZhdWx0WzBdOwotICAgIAotICAgIG5hdmlnYXRvck1vZGVsXyA9IG5ldyBCYXNpY01vZGVsKCJ1ZGRpTW9kZWwiKTsKLSAgICBVRERJTWFpbkVsZW1lbnQgdWRkaU1haW5FbGVtZW50ID0gbmV3IFVERElNYWluRWxlbWVudChnZXRNZXNzYWdlKCJOT0RFX05BTUVfVURESV9NQUlOIiksbmF2aWdhdG9yTW9kZWxfKTsKLSAgICBuYXZpZ2F0b3JNb2RlbF8uc2V0Um9vdEVsZW1lbnQodWRkaU1haW5FbGVtZW50KTsKLSAgICBuYXZpZ2F0b3JNYW5hZ2VyXyA9IG5ldyBOb2RlTWFuYWdlcihjb250cm9sbGVyXyk7Ci0gICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IG5ldyBVRERJTWFpbk5vZGUodWRkaU1haW5FbGVtZW50LG5hdmlnYXRvck1hbmFnZXJfKTsKLSAgICBuYXZpZ2F0b3JNYW5hZ2VyXy5zZXRSb290Tm9kZSh1ZGRpTWFpbk5vZGUpOwotCi0gICAgd3NkbFR5cGVfID0gVURESUFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0U7Ci0gICAgY2F0ZWdvcnlNYW5hZ2Vyc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBjYXRlZ29yeSBtb2RlbHMuCi0gICAgaWYgKGFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZSgiY29tbW9uQ2F0ZWdvcnlNb2RlbHMiKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN5bmNocm9uaXplZCAoYXBwbGljYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoImNvbW1vbkNhdGVnb3J5TW9kZWxzIikgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEhhc2h0YWJsZSBjb21tb25DYXRlZ29yeU1vZGVscyA9IG5ldyBIYXNodGFibGUoKTsKLQkJICAKLSAgICAgICAgICBDYXRlZ29yeU1vZGVsIG5haWNzTW9kZWwgPSBuZXcgQ2F0ZWdvcnlNb2RlbCgpOwotICAgICAgICAgIG5haWNzTW9kZWwuc2V0U2VydmxldENvbnRleHQoYXBwbGljYXRpb24pOwotICAgICAgICAgIG5haWNzTW9kZWwuc2V0RGVmYXVsdERhdGFGaWxlKCIvdWRkaS9kYXRhL25haWNzLWRhdGEudHh0Iik7Ci0gICAgICAgICAgbmFpY3NNb2RlbC5zZXREaXNwbGF5TmFtZShnZXRNZXNzYWdlKCJGT1JNX09QVElPTl9DQVRFR09SWV9OQUlDUyIpKTsKLSAgICAgICAgICBuYWljc01vZGVsLnNldFRNb2RlbEtleShUTW9kZWwuTkFJQ1NfVE1PREVMX0tFWSk7Ci0gICAgICAgICAgY29tbW9uQ2F0ZWdvcnlNb2RlbHMucHV0KFRNb2RlbC5OQUlDU19UTU9ERUxfS0VZLG5haWNzTW9kZWwpOwotICAgICAgICAgIAotICAgICAgICAgIENhdGVnb3J5TW9kZWwgdW5zcHNjTW9kZWwgPSBuZXcgQ2F0ZWdvcnlNb2RlbCgpOwotCQkgIHVuc3BzY01vZGVsLnNldFNlcnZsZXRDb250ZXh0KGFwcGxpY2F0aW9uKTsKLSAgICAgICAgICB1bnNwc2NNb2RlbC5zZXREZWZhdWx0RGF0YUZpbGUoIi91ZGRpL2RhdGEvdW5zcHNjLWRhdGEudHh0Iik7Ci0gICAgICAgICAgdW5zcHNjTW9kZWwuc2V0RGlzcGxheU5hbWUoZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQ0FURUdPUllfVU5TUFNDXzczIikpOwotICAgICAgICAgIHVuc3BzY01vZGVsLnNldFRNb2RlbEtleShUTW9kZWwuVU5TUFNDXzczX1RNT0RFTF9LRVkpOwotICAgICAgICAgIGNvbW1vbkNhdGVnb3J5TW9kZWxzLnB1dChUTW9kZWwuVU5TUFNDXzczX1RNT0RFTF9LRVksdW5zcHNjTW9kZWwpOwotICAgICAgICAgIAotICAgICAgICAgIENhdGVnb3J5TW9kZWwgZ2VvTW9kZWwgPSBuZXcgQ2F0ZWdvcnlNb2RlbCgpOwotCQkgIGdlb01vZGVsLnNldFNlcnZsZXRDb250ZXh0KGFwcGxpY2F0aW9uKTsKLSAgICAgICAgICBnZW9Nb2RlbC5zZXREZWZhdWx0RGF0YUZpbGUoIi91ZGRpL2RhdGEvZ2VvLWRhdGEudHh0Iik7Ci0gICAgICAgICAgZ2VvTW9kZWwuc2V0RGlzcGxheU5hbWUoZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQ0FURUdPUllfR0VPIikpOwotICAgICAgICAgIGdlb01vZGVsLnNldFRNb2RlbEtleShUTW9kZWwuSVNPX0NIX1RNT0RFTF9LRVkpOwotICAgICAgICAgIGNvbW1vbkNhdGVnb3J5TW9kZWxzLnB1dChUTW9kZWwuSVNPX0NIX1RNT0RFTF9LRVksZ2VvTW9kZWwpOwotICAgICAgICAgIAotICAgICAgICAgIENhdGVnb3J5TW9kZWwgZFdDb21tdW5pdHlNb2RlbCA9IG5ldyBDYXRlZ29yeU1vZGVsKCk7Ci0gICAgICAgICAgZFdDb21tdW5pdHlNb2RlbC5zZXRTZXJ2bGV0Q29udGV4dChhcHBsaWNhdGlvbik7Ci0gICAgICAgICAgZFdDb21tdW5pdHlNb2RlbC5zZXREZWZhdWx0RGF0YUZpbGUoIi91ZGRpL2RhdGEvZFdDb21tdW5pdHktZGF0YS50eHQiKTsKLSAgICAgICAgICBkV0NvbW11bml0eU1vZGVsLnNldERpc3BsYXlOYW1lKGdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0NBVEVHT1JZX0RXQ09NTVVOSVRZIikpOwotICAgICAgICAgIGRXQ29tbXVuaXR5TW9kZWwuc2V0VE1vZGVsS2V5KCJVVUlEOjhGNDk3QzUwLUVCMDUtMTFENi1CNjE4LTAwMDYyOURDMEE1MyIpOwotICAgICAgICAgIGNvbW1vbkNhdGVnb3J5TW9kZWxzLnB1dCgiVVVJRDo4RjQ5N0M1MC1FQjA1LTExRDYtQjYxOC0wMDA2MjlEQzBBNTMiLGRXQ29tbXVuaXR5TW9kZWwpOwotICAgICAgICAgIAotICAgICAgICAgIGFwcGxpY2F0aW9uLnNldEF0dHJpYnV0ZSgiY29tbW9uQ2F0ZWdvcnlNb2RlbHMiLGNvbW1vbkNhdGVnb3J5TW9kZWxzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRlZ29yeVRNb2RlbEtleV8gPSBudWxsOwotICAgIAotICAgIC8vIFN0YXJ0aW5nIGZyYW1lc2V0IHNpemVzLgotICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSAiMzAlLCoiOwotICAgIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9IHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gICAgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSAiNzUlLCoiOwotICAgIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIEhhc2h0YWJsZSBnZXRLbm93blJlZ2lzdHJpZXMoKQotICB7Ci0gICAgLy8gV2UgbXVzdCBhbHdheXMgcXVlcnkgdGhlIGZhdm9yaXRlcyB0byBzZWUgaWYgYWRkaXRpb25hbCByZWdpc3RyaWVzIHdlcmUgYWRkZWQgb3ZlciB0aW1lLiBUaGlzIHByb3BlcnR5IGNhbm5vdCBiZSBjYWNoZWQuCi0gICAgRmF2b3JpdGVzTWFpbkVsZW1lbnQgZmF2TWFpbkVsZW1lbnQgPSAoRmF2b3JpdGVzTWFpbkVsZW1lbnQpKGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRSb290Tm9kZSgpLmdldFRyZWVFbGVtZW50KCkpOwotICAgIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQgZmF2UmVnRm9sZGVyRWxlbWVudCA9IGZhdk1haW5FbGVtZW50LmdldEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZmF2UmVnRm9sZGVyRWxlbWVudC5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50IGZhdlJlZ0VsZW1lbnQgPSAoRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IGZhdlJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpOwotICAgICAgaWYgKGtub3duUmVnaXN0cmllc18uZ2V0KGlucXVpcnlVUkwpID09IG51bGwpCi0gICAgICAgIGtub3duUmVnaXN0cmllc18ucHV0KGlucXVpcnlVUkwsZmF2UmVnRWxlbWVudC5nZXRJRmF2b3JpdGVzVURESVJlZ2lzdHJ5SW50ZXJmYWNlKCkpOwotICAgIH0KLSAgICByZXR1cm4ga25vd25SZWdpc3RyaWVzXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0S25vd25SZWdpc3RyeVB1Ymxpc2hVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgICBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5IGtub3duUmVnaXN0cnkgPSAoSUZhdm9yaXRlc1VERElSZWdpc3RyeSlnZXRLbm93blJlZ2lzdHJpZXMoKS5nZXQoaW5xdWlyeVVSTCk7Ci0gICAgaWYgKGtub3duUmVnaXN0cnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHVibGlzaFVSTCA9IGtub3duUmVnaXN0cnkuZ2V0UHVibGlzaFVSTCgpOwotICAgICAgaWYgKFZhbGlkYXRvci52YWxpZGF0ZVVSTChwdWJsaXNoVVJMKSkKLSAgICAgICAgcmV0dXJuIHB1Ymxpc2hVUkw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRLbm93blJlZ2lzdHJ5UmVnaXN0cmF0aW9uVVJMKFN0cmluZyBpbnF1aXJ5VVJMKQotICB7Ci0gICAgSUZhdm9yaXRlc1VERElSZWdpc3RyeSBrbm93blJlZ2lzdHJ5ID0gKElGYXZvcml0ZXNVRERJUmVnaXN0cnkpZ2V0S25vd25SZWdpc3RyaWVzKCkuZ2V0KGlucXVpcnlVUkwpOwotICAgIGlmIChrbm93blJlZ2lzdHJ5ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHJlZ2lzdHJhdGlvblVSTCA9IGtub3duUmVnaXN0cnkuZ2V0UmVnaXN0cmF0aW9uVVJMKCk7Ci0gICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHJlZ2lzdHJhdGlvblVSTCkpCi0gICAgICAgIHJldHVybiByZWdpc3RyYXRpb25VUkw7Ci0gICAgfQotICAgIHJldHVybiBudWxsOyAgICAKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBJRmF2b3JpdGVzVURESVJlZ2lzdHJ5IGdldElCTVB1YmxpY1VERElUZXN0UmVnaXN0cnkoKQotICB7Ci0gICAgcmV0dXJuIGlibVB1YmxpY1VERElUZXN0UmVnaXN0cnlfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBwcmVsb2FkVURESVJlZ2lzdHJpZXMoU3RyaW5nW10gaW5xdWlyeVVSTHMsIFN0cmluZ1tdIHB1Ymxpc2hVUkxzKQotICB7Ci0gICAgaWYgKGlucXVpcnlVUkxzICE9IG51bGwpCi0gICAgewotICAgICAgSGFzaHRhYmxlIGtub3duUmVnaXN0cmllcyA9IGdldEtub3duUmVnaXN0cmllcygpOwotICAgICAgU3RyaW5nQnVmZmVyIGRpcmVjdG9yeUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5xdWlyeVVSTHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0JCVN0cmluZyBpbnF1aXJ5VVJMID0gVVJMVXRpbHMuZGVjb2RlKGlucXVpcnlVUkxzW2ldKTsKLSAgICAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSBudWxsOwotICAgICAgICBTdHJpbmcgcmVnTmFtZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyByZWdpc3RyYXRpb25VUkwgPSBudWxsOwotICAgICAgICAvLyBjb250aW51ZSB0byB0aGUgbmV4dCByZWdpc3RyeSBpZiBpbnF1aXJ5VVJMIGRvZXMgbm90IGV4aXN0Ci0gICAgICAgIGlmICghVmFsaWRhdG9yLnZhbGlkYXRlVVJMKGlucXVpcnlVUkwpKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAvLyBwb3B1bGF0ZSBhbmQgcnVuIGFuIE9wZW5SZWdpc3RyeUFjdGlvbgotICAgICAgICBPcGVuUmVnaXN0cnlBY3Rpb24gYWN0aW9uID0gbmV3IE9wZW5SZWdpc3RyeUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgICAgSUZhdm9yaXRlc1VERElSZWdpc3RyeSBrbm93blJlZ2lzdHJ5ID0gKElGYXZvcml0ZXNVRERJUmVnaXN0cnkpa25vd25SZWdpc3RyaWVzLmdldChpbnF1aXJ5VVJMKTsKLSAgICAgICAgYm9vbGVhbiBjaGVja0ZvclVzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IGZhbHNlOwotICAgICAgICBGaWxlIGRpcmVjdG9yeUZpbGUgPSBudWxsOwotICAgICAgICBpZiAoa25vd25SZWdpc3RyeSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGlzaFVSTCA9IGtub3duUmVnaXN0cnkuZ2V0UHVibGlzaFVSTCgpOwotICAgICAgICAgIHJlZ05hbWUgPSBrbm93blJlZ2lzdHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICByZWdpc3RyYXRpb25VUkwgPSBrbm93blJlZ2lzdHJ5LmdldFJlZ2lzdHJhdGlvblVSTCgpOwotICAgICAgICAgIGRpcmVjdG9yeUJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudC5mb3JtQ2F0ZWdvcmllc0RpcmVjdG9yeShkaXJlY3RvcnlCdWZmZXIsY29udHJvbGxlcl8uZ2V0U2VydmxldEVuZ2luZVN0YXRlTG9jYXRpb24oKSxyZWdOYW1lKTsKLSAgICAgICAgICBkaXJlY3RvcnlGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGlmIChkaXJlY3RvcnlGaWxlLmV4aXN0cygpICYmIGRpcmVjdG9yeUZpbGUubGlzdEZpbGVzKCkubGVuZ3RoID4gMCkKLSAgICAgICAgICAgIGNoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVnTmFtZSA9PSBudWxsKQotICAgICAgICAgIHJlZ05hbWUgPSBpbnF1aXJ5VVJMOwotICAgICAgICBpZiAocHVibGlzaFVSTCA9PSBudWxsICYmIHB1Ymxpc2hVUkxzICE9IG51bGwgJiYgaSA8IHB1Ymxpc2hVUkxzLmxlbmd0aCAmJiBwdWJsaXNoVVJMc1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgcHVibGlzaFVSTCA9IFVSTFV0aWxzLmRlY29kZShwdWJsaXNoVVJMc1tpXSk7Ci0gICAgICAgIH0gIAotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgYWN0aW9uCi0gICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuSU5RVUlSWV9VUkwsIGlucXVpcnlVUkwpOwotICAgICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUsIHJlZ05hbWUpOwotICAgICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHB1Ymxpc2hVUkwpKQotICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUFVCTElTSF9VUkwsIHB1Ymxpc2hVUkwpOwotICAgICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKHJlZ2lzdHJhdGlvblVSTCkpCi0gICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5SRUdJU1RSQVRJT05fVVJMLCByZWdpc3RyYXRpb25VUkwpOwotICAgICAgICAgIAotICAgICAgICAvLyBDaGVjayBpZiBwcml2YXRlIHJlZ2lzdHJ5IGNhdGVnb3J5IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgdGhpcyByZWdpc3RyeS4KLSAgICAgICAgZGlyZWN0b3J5QnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgU3RyaW5nIGVuY29kZWRJbnF1aXJ5VVJMID0gVVJMVXRpbHMuZW5jb2RlKGlucXVpcnlVUkwpOwotICAgICAgICBkaXJlY3RvcnlCdWZmZXIuYXBwZW5kKGNvbnRyb2xsZXJfLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkpLmFwcGVuZChlbmNvZGVkSW5xdWlyeVVSTCkuYXBwZW5kKCIucHJvcGVydGllcyIpOwotICAgICAgICBkaXJlY3RvcnlGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICBpZiAoZGlyZWN0b3J5RmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShkaXJlY3RvcnlGaWxlKTsKLSAgICAgICAgICAgIHAubG9hZChmaW4pOwotICAgICAgICAgICAgZmluLmNsb3NlKCk7Ci0gICAgICAgICAgICBkaXJlY3RvcnlGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgU3RyaW5nIGRhdGFEaXJlY3RvcnkgPSBwLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuQ0FURUdPUklFU19ESVJFQ1RPUlkpOwotICAgICAgICAgICAgaWYgKGRhdGFEaXJlY3RvcnkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5DQVRFR09SSUVTX0RJUkVDVE9SWSxkYXRhRGlyZWN0b3J5KTsKLSAgICAgICAgICAgIGNoZWNrRm9yVXNlckRlZmluZWRDYXRlZ29yaWVzID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXMgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hlY2tGb3JVc2VyRGVmaW5lZENhdGVnb3JpZXMpCi0gICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUyxCb29sZWFuLlRSVUUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcHJvcGVydHlUYWJsZS5yZW1vdmUoVURESUFjdGlvbklucHV0cy5DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUyk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgIC8vIHJ1biB0aGUgYWN0aW9uCi0gICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgCi0gICAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCkobmF2aWdhdG9yTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgICAgIEVudW1lcmF0aW9uIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IHJlZ0VsZW1lbnQuZ2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKCk7Ci0gICAgICAgIGlmICh1c2VyRGVmaW5lZENhdGVnb3JpZXMgIT0gbnVsbCAmJiB1c2VyRGVmaW5lZENhdGVnb3JpZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBBZGRSZWdpc3RyeVRvVURESVBlcnNwZWN0aXZlQWN0aW9uIGFjdGlvbjIgPSBuZXcgQWRkUmVnaXN0cnlUb1VERElQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGVnb3JpZXNEaXJlY3RvcnkgPSByZWdFbGVtZW50LmdldENhdGVnb3JpZXNEaXJlY3RvcnkoKTsKLSAgICAgICAgICBpZiAoY2F0ZWdvcmllc0RpcmVjdG9yeSAhPSBudWxsKQotICAgICAgICAgICAgYWN0aW9uMi5saW5rQ2F0ZWdvcnlNb2RlbHNXaXRoU2F2ZWREYXRhKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyxjYXRlZ29yaWVzRGlyZWN0b3J5KTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhY3Rpb24yLmxpbmtDYXRlZ29yeU1vZGVsc1dpdGhTYXZlZERhdGEocmVnRWxlbWVudC5nZXROYW1lKCksdXNlckRlZmluZWRDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGlucXVpcnlVUkxzLmxlbmd0aCA+IDApCi0gICAgICAgIGNvbnRyb2xsZXJfLnNldEN1cnJlbnRQZXJzcGVjdGl2ZShBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfVURESSk7Ci0gICAgfQotICB9Ci0gIAotICAvLyBQcmVjb25kaXRpb25zOiAKLSAgLy8gc2VydmljZU5hbWVzIGFuZCBzZXJ2aWNlS2V5cyBoYXZlIGxlbmd0aCA+PSAxLgotICAvLyByZWdOb2RlICE9IG51bGwKLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHByZWxvYWRTZXJ2aWNlc0ZvclJlZ2lzdHJ5KFJlZ2lzdHJ5Tm9kZSByZWdOb2RlLFN0cmluZ1tdIHNlcnZpY2VOYW1lcyxTdHJpbmdbXSBzZXJ2aWNlS2V5cykKLSAgewotICAgIGludCByZWdOb2RlSWQgPSByZWdOb2RlLmdldE5vZGVJZCgpOwotICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VLZXlzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgbmF2aWdhdG9yTWFuYWdlcl8uc2V0U2VsZWN0ZWROb2RlSWQocmVnTm9kZUlkKTsKLSAgICAgIFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgIHByb3BlcnR5VGFibGUucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSxzZXJ2aWNlTmFtZXNbaV0pOwotICAgICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZLHNlcnZpY2VLZXlzW2ldKTsKLSAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgIG5hdmlnYXRvck1hbmFnZXJfLm1ha2VTZWxlY3RlZE5vZGVWaXNpYmxlKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBwcmVsb2FkU2VydmljZXMoU3RyaW5nW10gaW5xdWlyeVVSTHMsU3RyaW5nW10gc2VydmljZU5hbWVzLFN0cmluZ1tdIHNlcnZpY2VLZXlzKQotICB7Ci0gICAgLy8gVGhlIGFsZ29yaXRobSB3aWxsIHNlYXJjaCBmb3IgZWFjaCBzZXJ2aWNlIGtleSBpbiBlYWNoIGlucXVpcnkgVVJMLgotICAgIGlmIChzZXJ2aWNlS2V5cyAhPSBudWxsICYmIHNlcnZpY2VOYW1lcyAhPSBudWxsICYmIHNlcnZpY2VOYW1lcy5sZW5ndGggPT0gc2VydmljZUtleXMubGVuZ3RoKQotICAgIHsKLSAgICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VLZXlzLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChpbnF1aXJ5VVJMcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRWxpbWluYXRlIGR1cGxpY2F0ZSBpbnF1aXJ5IFVSTHMuCi0gICAgICAgICAgSGFzaHRhYmxlIGlucXVpcnlVUkxzSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICBmb3IgKGludCBqPTA7ajxpbnF1aXJ5VVJMcy5sZW5ndGg7aisrKQotICAgICAgICAgICAgaW5xdWlyeVVSTHNIYXNoLnB1dChpbnF1aXJ5VVJMc1tqXSxCb29sZWFuLlRSVUUpOwotICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIGF2YWlsYWJsZSByZWdpc3RyaWVzIGFuZCB1c2UgdGhlbSBpZiBwb3NzaWJsZS4KLSAgICAgICAgICBOb2RlIHVkZGlNYWluTm9kZSA9IG5hdmlnYXRvck1hbmFnZXJfLmdldFJvb3ROb2RlKCk7Ci0gICAgICAgICAgVmVjdG9yIHJlZ2lzdHJ5Tm9kZXMgPSB1ZGRpTWFpbk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgIGZvciAoaW50IGs9MDtrPHJlZ2lzdHJ5Tm9kZXMuc2l6ZSgpO2srKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IChSZWdpc3RyeU5vZGUpcmVnaXN0cnlOb2Rlcy5lbGVtZW50QXQoayk7Ci0gICAgICAgICAgICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIGV4aXN0aW5nUmVnaXN0cnlJbnF1aXJ5VVJMID0gcmVnRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCk7Ci0gICAgICAgICAgICBpZiAoaW5xdWlyeVVSTHNIYXNoLmdldChleGlzdGluZ1JlZ2lzdHJ5SW5xdWlyeVVSTCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHJlbG9hZFNlcnZpY2VzRm9yUmVnaXN0cnkocmVnTm9kZSxzZXJ2aWNlTmFtZXMsc2VydmljZUtleXMpOwotICAgICAgICAgICAgICBpbnF1aXJ5VVJMc0hhc2gucmVtb3ZlKGV4aXN0aW5nUmVnaXN0cnlJbnF1aXJ5VVJMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgRW51bWVyYXRpb24gaW5xdWlyeVVSTHNFbnVtID0gaW5xdWlyeVVSTHNIYXNoLmtleXMoKTsKLSAgICAgICAgICB3aGlsZSAoaW5xdWlyeVVSTHNFbnVtLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBpbnF1aXJ5VVJMID0gKFN0cmluZylpbnF1aXJ5VVJMc0VudW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHByZWxvYWRVRERJUmVnaXN0cmllcyhuZXcgU3RyaW5nW10ge2lucXVpcnlVUkx9LG51bGwpOwotICAgICAgICAgICAgUmVnaXN0cnlOb2RlIHJlZ05vZGUgPSAoUmVnaXN0cnlOb2RlKW5hdmlnYXRvck1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICAgICAgcHJlbG9hZFNlcnZpY2VzRm9yUmVnaXN0cnkocmVnTm9kZSxzZXJ2aWNlTmFtZXMsc2VydmljZUtleXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldENhdGVnb3J5VE1vZGVsS2V5KFN0cmluZyBjYXRlZ29yeVRNb2RlbEtleSkKLSAgewotICAgIGNhdGVnb3J5VE1vZGVsS2V5XyA9IGNhdGVnb3J5VE1vZGVsS2V5OwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldENhdGVnb3J5VE1vZGVsS2V5KCkKLSAgewotICAgIHJldHVybiBjYXRlZ29yeVRNb2RlbEtleV87Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgdm9pZCBpbml0Q2F0ZWdvcnlCcm93c2VyKENhdGVnb3J5TW9kZWwgY2F0ZWdvcnlNb2RlbCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcikKLSAgewotICAgIFRyZWVFbGVtZW50IGNhdGVnb3J5Um9vdEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpY2F0ZWdvcnlNb2RlbC5nZXRSb290RWxlbWVudCgpOwotICAgIFJvb3RDYXRlZ29yeU5vZGUgcm9vdENhdGVnb3J5Tm9kZSA9IG5ldyBSb290Q2F0ZWdvcnlOb2RlKGNhdGVnb3J5Um9vdEVsZW1lbnQsbm9kZU1hbmFnZXIpOwotICAgIG5vZGVNYW5hZ2VyLnNldFJvb3ROb2RlKHJvb3RDYXRlZ29yeU5vZGUpOwotICAgIHJvb3RDYXRlZ29yeU5vZGUuY3JlYXRlQ2hpbGRyZW4oKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIE5vZGVNYW5hZ2VyIGdldENhdGVnb3J5TWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gKE5vZGVNYW5hZ2VyKWNhdGVnb3J5TWFuYWdlcnNfLmdldChjYXRlZ29yeVRNb2RlbEtleV8pOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgTm9kZU1hbmFnZXIgZ2V0Q2F0ZWdvcnlNYW5hZ2VyKENhdGVnb3J5TW9kZWwgY2F0ZWdvcnlNb2RlbCkKLSAgewotICAgIFN0cmluZyB0TW9kZWxLZXkgPSBjYXRlZ29yeU1vZGVsLmdldFRNb2RlbEtleSgpOwotICAgIE5vZGVNYW5hZ2VyIGNhdGVnb3J5TWFuYWdlciA9IChOb2RlTWFuYWdlciljYXRlZ29yeU1hbmFnZXJzXy5nZXQodE1vZGVsS2V5KTsKLSAgICBpZiAoY2F0ZWdvcnlNYW5hZ2VyID09IG51bGwpCi0gICAgewotICAgICAgY2F0ZWdvcnlNYW5hZ2VyID0gbmV3IE5vZGVNYW5hZ2VyKGNvbnRyb2xsZXJfKTsKLSAgICAgIGluaXRDYXRlZ29yeUJyb3dzZXIoY2F0ZWdvcnlNb2RlbCxjYXRlZ29yeU1hbmFnZXIpOwotICAgICAgY2F0ZWdvcnlNYW5hZ2Vyc18ucHV0KHRNb2RlbEtleSxjYXRlZ29yeU1hbmFnZXIpOyAgICAgIAotICAgIH0KLSAgICByZXR1cm4gY2F0ZWdvcnlNYW5hZ2VyOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIE5vZGVNYW5hZ2VyIGdldE5hdmlnYXRvck1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIG5hdmlnYXRvck1hbmFnZXJfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgTm9kZU1hbmFnZXIgZ2V0Tm9kZU1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIGdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFdTRExUeXBlKGludCB3c2RsVHlwZSkKLSAgewotICAgIHdzZGxUeXBlXyA9IHdzZGxUeXBlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGludCBnZXRXU0RMVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFR5cGVfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS91ZGRpX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RnJhbWVzZXRzRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gInVkZGkvc2NyaXB0cy91ZGRpZnJhbWVzZXRzLmpzcCI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvY2Vzc0ZyYW1lc2V0c0Zvcm0oKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL2Zvcm1zL1Byb2Nlc3NVRERJRnJhbWVzZXRzRm9ybS5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYW5lc0ZpbGUoKQotICB7Ci0gICAgcmV0dXJuICJ1ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCI7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJuYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiAicHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50VmFyKCkKLSAgewotICAgIHJldHVybiAic3RhdHVzQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAidWRkaS9zdGF0dXNfY29udGVudC5qc3AiOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNhdmVQZXJzcGVjdGl2ZUFjdGlvbkxpbmsoKQotICB7Ci0gICAgLy9yZXR1cm4gU2F2ZVVERElQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKCk7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKFN0cmluZyBjb2xzKQotICB7Ci0gICAgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9IGNvbHM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKFN0cmluZyBjb2xzKQotICB7Ci0gICAgc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfID0gY29sczsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpCi0gIHsKLSAgICByZXR1cm4gc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKQotICB7Ci0gICAgcmV0dXJuIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKFN0cmluZyByb3dzKQotICB7Ci0gICAgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSByb3dzOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoU3RyaW5nIHJvd3MpCi0gIHsKLSAgICBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gcm93czsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKQotICB7Ci0gICAgcmV0dXJuIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3dpdGNoUGVyc3BlY3RpdmVGb3JtQWN0aW9uTGluayhpbnQgdGFyZ2V0UGVyc3BlY3RpdmVJZCxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICByZXR1cm4gU3dpdGNoUGVyc3BlY3RpdmVGcm9tVURESUFjdGlvbi5nZXRGb3JtQWN0aW9uTGluayh0YXJnZXRQZXJzcGVjdGl2ZUlkLGZvckhpc3RvcnkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VbnB1Ymxpc2hUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS9wZXJzcGVjdGl2ZS9VbnB1Ymxpc2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGQ2YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3VkZGkvcGVyc3BlY3RpdmUvVW5wdWJsaXNoVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qOwotCi1wdWJsaWMgY2xhc3MgVW5wdWJsaXNoVG9vbCBleHRlbmRzIEZvcm1Ub29sCi17Ci0gIHB1YmxpYyBVbnB1Ymxpc2hUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgZW5hYmxlSW1hZ2UsIFN0cmluZyBoaWdobGlnaHRJbWFnZSwgU3RyaW5nIGFsdCkKLSAgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBlbmFibGVJbWFnZSwgaGlnaGxpZ2h0SW1hZ2UsIGFsdCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIE5vZGUgbm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRBdXRoZW50aWNhdGlvblByb3BlcnRpZXMoUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgcHVibGlzaFVSTCA9IHJlZ0VsZW1lbnQuZ2V0UHVibGlzaFVSTCgpOwotICAgIFN0cmluZyB1c2VySWQgPSByZWdFbGVtZW50LmdldFVzZXJJZCgpOwotICAgIFN0cmluZyBwYXNzd29yZCA9IHJlZ0VsZW1lbnQuZ2V0Q3JlZCgpOwotCi0gICAgaWYgKHB1Ymxpc2hVUkwgPT0gbnVsbCkKLSAgICAgIHB1Ymxpc2hVUkwgPSAiIjsKLSAgICBpZiAodXNlcklkID09IG51bGwpCi0gICAgICB1c2VySWQgPSAiIjsKLSAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgIHBhc3N3b3JkID0gIiI7Ci0KLSAgICBzZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMLHB1Ymxpc2hVUkwpOwotICAgIHNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklELHVzZXJJZCk7Ci0gICAgc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCxwYXNzd29yZCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgewotICAgIHJldHVybiAidWRkaS9mb3Jtcy9VbnB1Ymxpc2hGb3JtLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3V0aWwvVWRkaTRqSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdWRkaS91dGlsL1VkZGk0akhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGZjYTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91ZGRpL3V0aWwvVWRkaTRqSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy51ZGRpNGouVURESUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkFjY2Vzc1BvaW50OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5CaW5kaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkJpbmRpbmdUZW1wbGF0ZXM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkluc3RhbmNlRGV0YWlsczsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJpbmRpbmcuVE1vZGVsSW5zdGFuY2VEZXRhaWxzOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5UTW9kZWxJbnN0YW5jZUluZm87Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLkJ1c2luZXNzU2VydmljZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5PdmVydmlld0RvYzsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLk92ZXJ2aWV3VVJMOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci5kaXNjb3ZlcnkuV2ViU2VydmljZXNQYXJzZXJFeHQ7Ci0KLXB1YmxpYyBjbGFzcyBVZGRpNGpIZWxwZXIKLXsKLSAgcHVibGljIGZpbmFsIEtleWVkUmVmZXJlbmNlIGdldFdTRExLZXllZFJlZmVyZW5jZSgpCi0gIHsKLSAgICBLZXllZFJlZmVyZW5jZSBrZXlSZWYgPSBuZXcgS2V5ZWRSZWZlcmVuY2UoInR5cGVzIiwgIndzZGxTcGVjIik7Ci0gICAga2V5UmVmLnNldFRNb2RlbEtleSgiVVVJRDpDMUFDRjI2RC05NjcyLTQ0MDQtOUQ3MC0zOUI3NTZFNjJBQjQiKTsKLSAgICByZXR1cm4ga2V5UmVmOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFRNb2RlbCBuZXdUTW9kZWwoU3RyaW5nIHdzZGxVcmwpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3VE1vZGVsKHdzZGxVcmwsIGdldFdTRExEZWZpbml0aW9uKHdzZGxVcmwpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBUTW9kZWwgbmV3VE1vZGVsKFN0cmluZyB3c2RsVXJsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFRNb2RlbCB0TW9kZWwgPSBuZXcgVE1vZGVsKCk7Ci0gICAgdE1vZGVsLnNldFRNb2RlbEtleSgiIik7Ci0gICAgdE1vZGVsLnNldE5hbWUoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICB0TW9kZWwuc2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCIiKTsKLSAgICBPdmVydmlld0RvYyBvdmVydmlld0RvYyA9IG5ldyBPdmVydmlld0RvYygpOwotICAgIG92ZXJ2aWV3RG9jLnNldE92ZXJ2aWV3VVJMKHdzZGxVcmwpOwotICAgIHRNb2RlbC5zZXRPdmVydmlld0RvYyhvdmVydmlld0RvYyk7Ci0gICAgQ2F0ZWdvcnlCYWcgY2F0QmFnID0gbmV3IENhdGVnb3J5QmFnKCk7Ci0gICAgVmVjdG9yIGtleVJlZlZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBrZXlSZWZWZWN0b3IuYWRkKGdldFdTRExLZXllZFJlZmVyZW5jZSgpKTsKLSAgICBjYXRCYWcuc2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3Ioa2V5UmVmVmVjdG9yKTsKLSAgICB0TW9kZWwuc2V0Q2F0ZWdvcnlCYWcoY2F0QmFnKTsKLSAgICByZXR1cm4gdE1vZGVsOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIEJ1c2luZXNzU2VydmljZSBuZXdCdXNpbmVzc1NlcnZpY2UoU3RyaW5nIHdzZGxVcmwsIEhhc2h0YWJsZSB0TW9kZWxzVGFibGUpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gbmV3QnVzaW5lc3NTZXJ2aWNlKHdzZGxVcmwsIGdldFdTRExEZWZpbml0aW9uKHdzZGxVcmwpLCB0TW9kZWxzVGFibGUpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIEJ1c2luZXNzU2VydmljZSBuZXdCdXNpbmVzc1NlcnZpY2UoU3RyaW5nIHdzZGxVcmwsIERlZmluaXRpb24gZGVmLCBIYXNodGFibGUgdE1vZGVsc1RhYmxlKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gbmV3IEJ1c2luZXNzU2VydmljZSgpOwotICAgIGJzLnNldFNlcnZpY2VLZXkoIiIpOwotICAgIEJpbmRpbmdUZW1wbGF0ZXMgYmluZGluZ1RlbXBsYXRlcyA9IG5ldyBCaW5kaW5nVGVtcGxhdGVzKCk7Ci0gICAgVmVjdG9yIGJpbmRpbmdUZW1wbGF0ZVZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBTZXJ2aWNlW10gc2VydmljZXMgPSAoU2VydmljZVtdKWRlZi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLnRvQXJyYXkobmV3IFNlcnZpY2VbMF0pOwotICAgIGlmIChzZXJ2aWNlcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIFBvcnRbXSBwb3J0cyA9IChQb3J0W10pc2VydmljZXNbMF0uZ2V0UG9ydHMoKS52YWx1ZXMoKS50b0FycmF5KG5ldyBQb3J0WzBdKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFRNb2RlbEluc3RhbmNlRGV0YWlscyB0TW9kZWxEZXRhaWxzID0gbmV3IFRNb2RlbEluc3RhbmNlRGV0YWlscygpOwotICAgICAgICBWZWN0b3IgdE1vZGVsSW5mb1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgVE1vZGVsIHRNb2RlbCA9IChUTW9kZWwpdE1vZGVsc1RhYmxlLmdldChwb3J0c1tpXS5nZXRCaW5kaW5nKCkuZ2V0UG9ydFR5cGUoKS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgdE1vZGVsSW5mb1ZlY3Rvci5hZGQoY3JlYXRlVE1vZGVsSW5zdGFuY2VJbmZvKHdzZGxVcmwsIHBvcnRzW2ldLCB0TW9kZWwuZ2V0VE1vZGVsS2V5KCkpKTsKLSAgICAgICAgdE1vZGVsRGV0YWlscy5zZXRUTW9kZWxJbnN0YW5jZUluZm9WZWN0b3IodE1vZGVsSW5mb1ZlY3Rvcik7Ci0gICAgICAgIEJpbmRpbmdUZW1wbGF0ZSBiaW5kaW5nVGVtcGxhdGUgPSBuZXcgQmluZGluZ1RlbXBsYXRlKCk7Ci0gICAgICAgIGJpbmRpbmdUZW1wbGF0ZS5zZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoY3JlYXRlRGVzY3JpcHRpb24ocG9ydHNbaV0pKTsKLSAgICAgICAgYmluZGluZ1RlbXBsYXRlLnNldEFjY2Vzc1BvaW50KGNyZWF0ZUFjY2Vzc1BvaW50KHBvcnRzW2ldKSk7Ci0gICAgICAgIGJpbmRpbmdUZW1wbGF0ZS5zZXRUTW9kZWxJbnN0YW5jZURldGFpbHModE1vZGVsRGV0YWlscyk7Ci0gICAgICAgIGJpbmRpbmdUZW1wbGF0ZS5zZXRCaW5kaW5nS2V5KCIiKTsKLSAgICAgICAgYmluZGluZ1RlbXBsYXRlVmVjdG9yLmFkZChiaW5kaW5nVGVtcGxhdGUpOwotICAgICAgfQotICAgIH0KLSAgICBiaW5kaW5nVGVtcGxhdGVzLnNldEJpbmRpbmdUZW1wbGF0ZVZlY3RvcihiaW5kaW5nVGVtcGxhdGVWZWN0b3IpOwotICAgIGJzLnNldEJpbmRpbmdUZW1wbGF0ZXMoYmluZGluZ1RlbXBsYXRlcyk7Ci0gICAgcmV0dXJuIGJzOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgQnVzaW5lc3NTZXJ2aWNlIG5ld0J1c2luZXNzU2VydmljZShTdHJpbmcgd3NkbFVybCwgRGVmaW5pdGlvbiBkZWYsIFRNb2RlbFtdIHRNb2RlbHMpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSBuZXcgQnVzaW5lc3NTZXJ2aWNlKCk7Ci0gICAgYnMuc2V0U2VydmljZUtleSgiIik7Ci0gICAgQmluZGluZ1RlbXBsYXRlcyBiaW5kaW5nVGVtcGxhdGVzID0gbmV3IEJpbmRpbmdUZW1wbGF0ZXMoKTsKLSAgICBWZWN0b3IgYmluZGluZ1RlbXBsYXRlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIFNlcnZpY2VbXSBzZXJ2aWNlcyA9IChTZXJ2aWNlW10pZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkudG9BcnJheShuZXcgU2VydmljZVswXSk7Ci0gICAgaWYgKHNlcnZpY2VzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgUG9ydFtdIHBvcnRzID0gKFBvcnRbXSlzZXJ2aWNlc1swXS5nZXRQb3J0cygpLnZhbHVlcygpLnRvQXJyYXkobmV3IFBvcnRbMF0pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0TW9kZWxzLmxlbmd0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgVE1vZGVsSW5zdGFuY2VEZXRhaWxzIHRNb2RlbERldGFpbHMgPSBuZXcgVE1vZGVsSW5zdGFuY2VEZXRhaWxzKCk7Ci0gICAgICAgICAgVmVjdG9yIHRNb2RlbEluZm9WZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgdE1vZGVsSW5mb1ZlY3Rvci5hZGQoY3JlYXRlVE1vZGVsSW5zdGFuY2VJbmZvKHdzZGxVcmwsIHBvcnRzW2ldLCB0TW9kZWxzW2pdLmdldFRNb2RlbEtleSgpKSk7Ci0gICAgICAgICAgdE1vZGVsRGV0YWlscy5zZXRUTW9kZWxJbnN0YW5jZUluZm9WZWN0b3IodE1vZGVsSW5mb1ZlY3Rvcik7Ci0gICAgICAgICAgQmluZGluZ1RlbXBsYXRlIGJpbmRpbmdUZW1wbGF0ZSA9IG5ldyBCaW5kaW5nVGVtcGxhdGUoKTsKLSAgICAgICAgICBiaW5kaW5nVGVtcGxhdGUuc2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKGNyZWF0ZURlc2NyaXB0aW9uKHBvcnRzW2ldKSk7Ci0gICAgICAgICAgYmluZGluZ1RlbXBsYXRlLnNldEFjY2Vzc1BvaW50KGNyZWF0ZUFjY2Vzc1BvaW50KHBvcnRzW2ldKSk7Ci0gICAgICAgICAgYmluZGluZ1RlbXBsYXRlLnNldFRNb2RlbEluc3RhbmNlRGV0YWlscyh0TW9kZWxEZXRhaWxzKTsKLSAgICAgICAgICBiaW5kaW5nVGVtcGxhdGUuc2V0QmluZGluZ0tleSgiIik7Ci0gICAgICAgICAgYmluZGluZ1RlbXBsYXRlVmVjdG9yLmFkZChiaW5kaW5nVGVtcGxhdGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGJpbmRpbmdUZW1wbGF0ZXMuc2V0QmluZGluZ1RlbXBsYXRlVmVjdG9yKGJpbmRpbmdUZW1wbGF0ZVZlY3Rvcik7Ci0gICAgYnMuc2V0QmluZGluZ1RlbXBsYXRlcyhiaW5kaW5nVGVtcGxhdGVzKTsKLSAgICByZXR1cm4gYnM7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXRXU0RMRGVmaW5pdGlvbihTdHJpbmcgd3NkbFVybCkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VzUGFyc2VyRXh0IHBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCgpOwotICAgICAgU3RyaW5nIHByb3h5U2V0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5U2V0Iik7Ci0gICAgICBpZiAocHJveHlTZXQgIT0gbnVsbCAmJiBwcm94eVNldC5lcXVhbHMoInRydWUiKSkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAucHJveHlVc2VyTmFtZSIpKTsKLSAgICAgICAgcGFyc2VyLnNldEhUVFBCYXNpY0F1dGhQYXNzd29yZChTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAucHJveHlQYXNzd29yZCIpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwYXJzZXIuZ2V0V1NETERlZmluaXRpb25WZXJib3NlKHdzZGxVcmwpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5QQVJTRVJfRVJST1IsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBjcmVhdGVEZXNjcmlwdGlvbihQb3J0IHBvcnQpCi0gIHsKLSAgICBTdHJpbmcgZGVzYyA9IG51bGw7Ci0gICAgRWxlbWVudCBlID0gcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgIGlmIChlICE9IG51bGwpCi0gICAgewotICAgICAgTm9kZSBub2RlID0gZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICB3aGlsZSAobm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREU6Ci0gICAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLSAgICAgICAgICAgIHNiLmFwcGVuZCgoKENoYXJhY3RlckRhdGEpbm9kZSkuZ2V0RGF0YSgpKTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkZXNjID0gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlc2M7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgVE1vZGVsSW5zdGFuY2VJbmZvIGNyZWF0ZVRNb2RlbEluc3RhbmNlSW5mbyhTdHJpbmcgd3NkbFVybCwgUG9ydCBwb3J0LCBTdHJpbmcgdE1vZGVsS2V5KQotICB7Ci0gICAgSW5zdGFuY2VEZXRhaWxzIGRldGFpbHMgPSBuZXcgSW5zdGFuY2VEZXRhaWxzKCk7Ci0gICAgT3ZlcnZpZXdEb2Mgb3ZlcnZpZXdEb2MgPSBuZXcgT3ZlcnZpZXdEb2MoKTsKLSAgICBUTW9kZWxJbnN0YW5jZUluZm8gdE1vZGVsSW5mbyA9IG5ldyBUTW9kZWxJbnN0YW5jZUluZm8oKTsKLSAgICBTdHJpbmdCdWZmZXIgb3ZlcnZpZXdVUkxTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKHdzZGxVcmwpOwotICAgIFN0cmluZyBwb3J0TmFtZSA9IHBvcnQuZ2V0TmFtZSgpOwotICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgb3ZlcnZpZXdVUkxTdHJpbmcuYXBwZW5kKCIjIik7Ci0gICAgICBvdmVydmlld1VSTFN0cmluZy5hcHBlbmQocG9ydE5hbWUpOwotICAgIH0KLSAgICBvdmVydmlld0RvYy5zZXRPdmVydmlld1VSTChuZXcgT3ZlcnZpZXdVUkwob3ZlcnZpZXdVUkxTdHJpbmcudG9TdHJpbmcoKSkpOwotICAgIGRldGFpbHMuc2V0T3ZlcnZpZXdEb2Mob3ZlcnZpZXdEb2MpOwotICAgIHRNb2RlbEluZm8uc2V0SW5zdGFuY2VEZXRhaWxzKGRldGFpbHMpOwotICAgIGlmICh0TW9kZWxLZXkgIT0gbnVsbCkKLSAgICAgIHRNb2RlbEluZm8uc2V0VE1vZGVsS2V5KHRNb2RlbEtleSk7Ci0gICAgcmV0dXJuIHRNb2RlbEluZm87Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgQWNjZXNzUG9pbnQgY3JlYXRlQWNjZXNzUG9pbnQoUG9ydCBwb3J0KQotICB7Ci0gICAgQWNjZXNzUG9pbnQgYWNjZXNzUG9pbnQgPSBudWxsOwotICAgIExpc3QgbGlzdCA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0LnNpemUoKTsgaisrKQotICAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWxpc3QuZ2V0KGopOwotICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICB7ICAKLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uVVJJID0gKChTT0FQQWRkcmVzcylleHRFbGVtZW50KS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICBhY2Nlc3NQb2ludCA9IG5ldyBBY2Nlc3NQb2ludChsb2NhdGlvblVSSSwgZ2V0VVJMVHlwZShsb2NhdGlvblVSSSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykKLSAgICAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9ICgoSFRUUEFkZHJlc3MpZXh0RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgYWNjZXNzUG9pbnQgPSBuZXcgQWNjZXNzUG9pbnQobG9jYXRpb25VUkksIGdldFVSTFR5cGUobG9jYXRpb25VUkkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhY2Nlc3NQb2ludDsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVVJMX1RZUEVfT1RIRVIgPSAib3RoZXIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBVUkxfVFlQRVMgPSAiaHR0cCBodHRwcyBtYWlsIGZ0cCBmYXggcGhvbmUgb3RoZXIiOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ2V0VVJMVHlwZShTdHJpbmcgdXJsKQotICB7Ci0gICAgaW50IGkgPSB1cmwuaW5kZXhPZigiOiIpOwotICAgIFN0cmluZyB0eXBlOwotICAgIGlmIChpID09IC0xKQotICAgICAgdHlwZSA9IFVSTF9UWVBFX09USEVSOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0eXBlID0gdXJsLnN1YnN0cmluZygwLCBpKTsKLSAgICAgIGlmICh0eXBlLmVxdWFscygiIikgfHwgVVJMX1RZUEVTLmluZGV4T2YodHlwZSkgPT0gLTEpCi0gICAgICAgIHR5cGUgPSBVUkxfVFlQRV9PVEhFUjsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzTW9ub2xpdGhpY1dTREwoRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICByZXR1cm4gaGFzTWVzc2FnZShkZWYpICYmIGhhc1BvcnRUeXBlKGRlZikgJiYgaGFzQmluZGluZyhkZWYpICYmIGhhc1NlcnZpY2UoZGVmKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlSW1wbGVtZW50KERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgcmV0dXJuIGhhc0ltcG9ydChkZWYpICYmIGhhc1NlcnZpY2UoZGVmKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlSW50ZXJmYWNlKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgcmV0dXJuIGhhc01lc3NhZ2UoZGVmKSAmJiBoYXNQb3J0VHlwZShkZWYpICYmIGhhc0JpbmRpbmcoZGVmKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlSW50ZXJmYWNlV2l0aEJpbmRpbmdzT25seShEZWZpbml0aW9uIGRlZikKLSAgewotICAgIHJldHVybiAhaGFzU2VydmljZShkZWYpICYmIGhhc0JpbmRpbmcoZGVmKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNNZXNzYWdlKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgZm9yKEl0ZXJhdG9yIGl0ID0gZGVmLmdldE1lc3NhZ2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIGlmICghKChNZXNzYWdlKWl0Lm5leHQoKSkuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaGFzUG9ydFR5cGUoRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBmb3IoSXRlcmF0b3IgaXQgPSBkZWYuZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIGlmICghKChQb3J0VHlwZSlpdC5uZXh0KCkpLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGhhc0JpbmRpbmcoRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBmb3IoSXRlcmF0b3IgaXQgPSBkZWYuZ2V0QmluZGluZ3MoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgaWYgKCEoKEJpbmRpbmcpaXQubmV4dCgpKS5pc1VuZGVmaW5lZCgpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNTZXJ2aWNlKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgcmV0dXJuICFkZWYuZ2V0U2VydmljZXMoKS5pc0VtcHR5KCk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaGFzSW1wb3J0KERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgcmV0dXJuICFkZWYuZ2V0SW1wb3J0cygpLmlzRW1wdHkoKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEltcG9ydHMoRGVmaW5pdGlvbiBkZWYsIFN0cmluZyB3c2RsVXJsKQotICB7Ci0gICAgSW1wb3J0W10gaW1wb3J0cyA9IChJbXBvcnQgW10pZGVmLmdldEltcG9ydHMoKS52YWx1ZXMoKS50b0FycmF5KG5ldyBJbXBvcnRbMF0pOwotICAgIFN0cmluZ1tdIGltcG9ydFN0cmluZ3MgPSBuZXcgU3RyaW5nW2ltcG9ydHMubGVuZ3RoXTsKLSAgICBTdHJpbmcgczsKLSAgICBpZiAod3NkbFVybCAhPSBudWxsICYmIHdzZGxVcmwuaW5kZXhPZignLycpICE9IC0xKQotICAgICAgcyA9IHdzZGxVcmwuc3Vic3RyaW5nKDAsIHdzZGxVcmwubGFzdEluZGV4T2YoJy8nKSsxKTsKLSAgICBlbHNlCi0gICAgICBzID0gIiI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRTdHJpbmdzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IGltcG9ydHNbaV0uZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgIGlmIChsb2NhdGlvblVSSS5pbmRleE9mKCc6JykgIT0gLTEpCi0gICAgICAgIHNiLmFwcGVuZChsb2NhdGlvblVSSSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNiLmFwcGVuZChzKS5hcHBlbmQobG9jYXRpb25VUkkpOwotICAgICAgaW1wb3J0U3RyaW5nc1tpXSA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBpbXBvcnRTdHJpbmdzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMKEJ1c2luZXNzU2VydmljZSBicywgVURESVByb3h5IHByb3h5KQotICB7Ci0gICAgVmVjdG9yIGJpbmRpbmdUZW1wbGF0ZVZlY3RvciA9IGJzLmdldEJpbmRpbmdUZW1wbGF0ZXMoKS5nZXRCaW5kaW5nVGVtcGxhdGVWZWN0b3IoKTsKLSAgICBpZiAoYmluZGluZ1RlbXBsYXRlVmVjdG9yLnNpemUoKSA+IDApCi0gICAgewotICAgICAgQmluZGluZ1RlbXBsYXRlIGJ0ID0gKEJpbmRpbmdUZW1wbGF0ZSliaW5kaW5nVGVtcGxhdGVWZWN0b3IuZ2V0KDApOwotICAgICAgVE1vZGVsSW5zdGFuY2VEZXRhaWxzIHRNb2RlbERldGFpbHMgPSBidC5nZXRUTW9kZWxJbnN0YW5jZURldGFpbHMoKTsKLSAgICAgIGlmICh0TW9kZWxEZXRhaWxzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFZlY3RvciB0TW9kZWxJbmZvVmVjdG9yID0gdE1vZGVsRGV0YWlscy5nZXRUTW9kZWxJbnN0YW5jZUluZm9WZWN0b3IoKTsKLSAgICAgICAgaWYgKHRNb2RlbEluZm9WZWN0b3Iuc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIFRNb2RlbEluc3RhbmNlSW5mbyB0TW9kZWxJbmZvID0gKFRNb2RlbEluc3RhbmNlSW5mbyl0TW9kZWxJbmZvVmVjdG9yLmdldCgwKTsKLSAgICAgICAgICBJbnN0YW5jZURldGFpbHMgZGV0YWlscyA9IHRNb2RlbEluZm8uZ2V0SW5zdGFuY2VEZXRhaWxzKCk7Ci0gICAgICAgICAgaWYgKGRldGFpbHMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPdmVydmlld0RvYyBvdmVydmlld0RvYyA9IGRldGFpbHMuZ2V0T3ZlcnZpZXdEb2MoKTsKLSAgICAgICAgICAgIGlmIChvdmVydmlld0RvYyAhPSBudWxsKQotICAgICAgICAgICAgICByZXR1cm4gcGFyc2Uob3ZlcnZpZXdEb2MuZ2V0T3ZlcnZpZXdVUkxTdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHByb3h5ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgIAlTdHJpbmcgdE1vZGVsS2V5ID0gdE1vZGVsSW5mby5nZXRUTW9kZWxLZXkoKTsKLSAgICAgICAgICAJaWYgKHRNb2RlbEtleSAhPSBudWxsKQotICAgICAgICAgIAl7Ci0gICAgICAgICAgCSAgdHJ5Ci0JCQkgIHsKLSAgICAgICAgICAJICAgIFRNb2RlbERldGFpbCB0ID0gcHJveHkuZ2V0X3RNb2RlbERldGFpbCh0TW9kZWxLZXkpOwotICAgICAgICAgIAkgICAgaWYgKHQgIT0gbnVsbCkKLSAgICAgICAgICAJICAgIHsKLSAgICAgICAgICAgICAgICAgIFZlY3RvciB0TW9kZWxWZWN0b3IgPSB0LmdldFRNb2RlbFZlY3RvcigpOwotICAgICAgICAgICAgICAgICAgaWYgKHRNb2RlbFZlY3RvciAhPSBudWxsICYmIHRNb2RlbFZlY3Rvci5zaXplKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V1NETCgoVE1vZGVsKXRNb2RlbFZlY3Rvci5nZXQoMCkpOwotICAgICAgICAgIAkgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgCSAgY2F0Y2ggKFVERElFeGNlcHRpb24gdWRkaWUpCi0JCQkgIHsKLSAgICAgICAgICAJICB9Ci0gICAgICAgICAgCSAgY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiB0ZSkKLQkJCSAgewotICAgICAgICAgIAkgIH0KLSAgICAgICAgICAJfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRXU0RMKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBPdmVydmlld0RvYyBvdmVydmlld0RvYyA9IHRNb2RlbC5nZXRPdmVydmlld0RvYygpOwotICAgIGlmIChvdmVydmlld0RvYyAhPSBudWxsKQotICAgICAgcmV0dXJuIHBhcnNlKG92ZXJ2aWV3RG9jLmdldE92ZXJ2aWV3VVJMU3RyaW5nKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBwYXJzZShTdHJpbmcgcykKLSAgewotICAgIGlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcy5pbmRleE9mKCcjJyk7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHJldHVybiBzLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgfQotICAgIHJldHVybiBzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvQ2hhckFycmF5V3JhcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvQ2hhckFycmF5V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjc0ZjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL0NoYXJBcnJheVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgQ2hhckFycmF5V3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyCi17Ci0JcHJpdmF0ZSBDaGFyQXJyYXlXcml0ZXIgY2hhckFycmF5V3JpdGVyXzsKLQkKLQlwdWJsaWMgQ2hhckFycmF5V3JhcHBlcihIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotCXsKLQkJc3VwZXIocmVzcG9uc2UpOwotCSAgY2hhckFycmF5V3JpdGVyXyA9IG5ldyBDaGFyQXJyYXlXcml0ZXIoKTsKLQl9Ci0JCi0JcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpCi0JewotCQlyZXR1cm4gbmV3IFByaW50V3JpdGVyKGNoYXJBcnJheVdyaXRlcl8pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBjaGFyQXJyYXlXcml0ZXJfLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvSFRNTFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9IVE1MVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhZjA2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9IVE1MVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWw7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEhUTUxVdGlscwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVEY4X0VOQ09ESU5HID0gIlVURi04IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9CUkVBSyA9ICI8YnI+IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0gIC8qKgotICAqIEdldCB0aGUgSFRNTCB0YWcgZm9yIGFuIGltYWdlLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBIVE1MIHRhZyBmb3IgdGhpcyBpbWFnZS4KLSAgKiBAcGFyYW0gSHR0cFNlcnZsZXRSZXNwb25zZSBUbyBlbmNvZGUgdGhlIHNyYyBhdHRyaWJ1dGUuCi0gICogQHBhcmFtIFN0cmluZyBzcmMgYXR0cmlidXRlIGRlZmluaW5nIHRoZSBwYXRoIHRvIHRoZSBpbWFnZSBmaWxlLiBUaGlzIG11c3QgaW5jbHVkZSB0aGUgY29udGV4dCBwYXRoLgotICAqIEBwYXJhbSBTdHJpbmcgT3B0aW9uYWwgYWx0IHRleHQgdG8gYmUgZGlzcGxheWVkIHdpdGggdGhlIGltYWdlLiBTZXQgdGhpcyB0byBudWxsIHRvIGRpc2FibGUgdGhlIGF0dHJpYnV0ZS4KLSAgKiBAcGFyYW0gU3RyaW5nIE9wdGlvbmFsIHdpZHRoIG9mIHRoZSByZW5kZXJlZCBpbWFnZS4gU2V0IHRoaXMgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBhdHRyaWJ1dGUuCi0gICogQHBhcmFtIFN0cmluZyBPcHRpb25hbCBoZWlnaHQgb2YgdGhlIHJlbmRlcmVkIGltYWcuIFNldCB0aGlzIHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgYXR0cmlidXRlLgotICAqIEBwYXJhbSBIYXNodGFibGUgT3B0aW9uYWwga2V5LXZhbHVlIHBhaXJzIG9mIGFkZGl0aW9uYWwgc3RyaW5ncyB0byBiZSBhZGRlZCBhcy1pcyB0byB0aGUgdGFnLiBTZXQgdGhpcyB0byBudWxsIHRvIGRpc2FibGUuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGltYWdlIHRhZy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SFRNTEltYWdlVGFnKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsU3RyaW5nIHNyYyxTdHJpbmcgYWx0LFN0cmluZyB3aWR0aCxTdHJpbmcgaGVpZ2h0LEhhc2h0YWJsZSBhZGRpdGlvbmFsQXR0cmlidXRlcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciB0YWcgPSBuZXcgU3RyaW5nQnVmZmVyKCI8aW1nIHNyYz1cIiIpOwotICAgIHRhZy5hcHBlbmQocmVzcG9uc2UuZW5jb2RlVVJMKHNyYykpLmFwcGVuZCgnXCInKTsKLSAgICBpZiAoYWx0ICE9IG51bGwpCi0gICAgICB0YWcuYXBwZW5kKCIgYWx0PVwiIikuYXBwZW5kKGFsdCkuYXBwZW5kKCdcIicpOwotICAgIGlmICh3aWR0aCAhPSBudWxsKQotICAgICAgdGFnLmFwcGVuZCgiIHdpZHRoPSIpLmFwcGVuZCh3aWR0aCk7Ci0gICAgaWYgKGhlaWdodCAhPSBudWxsKQotICAgICAgdGFnLmFwcGVuZCgiIGhlaWdodD0iKS5hcHBlbmQoaGVpZ2h0KTsKLSAgICB0YWcuYXBwZW5kKCIgYm9yZGVyPTAiKTsKLSAgICBpZiAoYWRkaXRpb25hbEF0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiBrZXlzID0gYWRkaXRpb25hbEF0dHJpYnV0ZXMua2V5cygpOwotICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgdGFnLmFwcGVuZCgnICcpLmFwcGVuZChrZXkpLmFwcGVuZCgiPVwiIikuYXBwZW5kKChTdHJpbmcpYWRkaXRpb25hbEF0dHJpYnV0ZXMuZ2V0KGtleSkpLmFwcGVuZCgnXCInKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGFnLmFwcGVuZCgnPicpOwotICAgIHJldHVybiB0YWcudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAqIEdldCB0aGUgSFRNTCB0YWcgZm9yIHRoaXMgbGluay4gVGhlIGNvbXBsZXRlIHRhZyBjb25zaXN0cyBvZiB0aGUgb3BlbiB0YWcgPGE+IGZvbGxvd2VkIGJ5IGEgc3ViZWxlbWVudCBhbmQsIGZpbmFsbHksIGJ5IGFuIGVuZCB0YWcgPC9hPi4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgSFRNTCB0YWcgb2YgdGhlIGxpbmsuCi0gICogQHBhcmFtIEh0dHBTZXJ2bGV0UmVzcG9uc2UgVG8gZW5jb2RlIHRoZSBocmVmIGF0dHJpYnV0ZS4KLSAgKiBAcGFyYW0gU3RyaW5nIFRoZSBocmVmIGF0dHJpYnV0ZSBvZiB0aGUgbGluay4gVGhpcyBtdXN0IGluY2x1ZGUgdGhlIGNvbnRleHQgcGF0aC4KLSAgKiBAcGFyYW0gU3RyaW5nIHRhcmdldCBPcHRpb25hbCB0YXJnZXQgYXR0cmlidXRlIGZvciB0aGUgbGluay4gU2V0IHRoaXMgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBhdHRyaWJ1dGUuCi0gICogQHBhcmFtIFN0cmluZyBPcHRpb25hbCBuYW1lIGZvciB0aGUgbGluay4gU2V0IHRoaXMgdG8gbnVsbCB0byBkaXNhYmxlIHRoZSBhdHRyaWJ1dGUuCi0gICogQHBhcmFtIFN0cmluZyBUaGUgbGFiZWwgd2hpY2ggYWN0cyBhcyB0aGUgc3ViZWxlbWVudC4gaS5lLiA8YT5sYWJlbDwvYT4uCi0gICogQHBhcmFtIEhhc2h0YWJsZSBPcHRpb25hbCBrZXktdmFsdWUgcGFpcnMgb2YgYWRkaXRpb25hbCBzdHJpbmcgYXR0cmlidXRlcyB0byBiZSBhZGRlZCBhcy1pcyB0byB0aGUgb3BlbiB0YWcuIFNldCB0aGlzIHRvIG51bGwgdG8gZGlzYWJsZS4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SFRNTExpbmtUYWcoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSxTdHJpbmcgaHJlZixTdHJpbmcgdGFyZ2V0LFN0cmluZyBuYW1lLFN0cmluZyBsYWJlbCxIYXNodGFibGUgYWRkaXRpb25hbEF0dHJpYnV0ZXMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgdGFnID0gbmV3IFN0cmluZ0J1ZmZlcigiPGEgaHJlZj1cIiIpOwotICAgIHRhZy5hcHBlbmQocmVzcG9uc2UuZW5jb2RlVVJMKGhyZWYpKS5hcHBlbmQoJ1wiJyk7Ci0gICAgaWYgKHRhcmdldCAhPSBudWxsKQotICAgICAgdGFnLmFwcGVuZCgiIHRhcmdldD1cIiIpLmFwcGVuZCh0YXJnZXQpLmFwcGVuZCgnXCInKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgdGFnLmFwcGVuZCgiIG5hbWU9XCIiKS5hcHBlbmQobmFtZSkuYXBwZW5kKCdcIicpOwotICAgIGlmIChhZGRpdGlvbmFsQXR0cmlidXRlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBhZGRpdGlvbmFsQXR0cmlidXRlcy5rZXlzKCk7Ci0gICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICB0YWcuYXBwZW5kKCcgJykuYXBwZW5kKGtleSkuYXBwZW5kKCI9XCIiKS5hcHBlbmQoKFN0cmluZylhZGRpdGlvbmFsQXR0cmlidXRlcy5nZXQoa2V5KSkuYXBwZW5kKCdcIicpOwotICAgICAgfQotICAgIH0KLSAgICB0YWcuYXBwZW5kKCc+Jyk7Ci0gICAgdGFnLmFwcGVuZChsYWJlbCk7Ci0gICAgdGFnLmFwcGVuZCgiPC9hPiIpOwotICAgIHJldHVybiB0YWcudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAqIEdldCB0aGUgSFRNTCB0YWcgZm9yIGEgcmVkIGFzdGVyaXN0LgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBIVE1MIHRhZyBmb3IgdGhlIHJlZCBhc3Rlcmlzay4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVkQXN0ZXJpc2soKQotICB7Ci0gICAgcmV0dXJuICI8Zm9udCBjb2xvcj1cIiNmZjAwMDBcIj4qPC9mb250PiI7Ci0gIH0KLQotICAvKioKLSAgKiBHZXQgdGhlIEphdmFzY3JpcHQgbWFuZ2xlZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gaW5wdXQgU3RyaW5nLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBKYXZhc2NyaXB0IG1hbmdsZWQgU3RyaW5nLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU01hbmdsZShTdHJpbmcgaW5wdXQpCi0gIHsKLSAgICBpZiAoaW5wdXQgPT0gbnVsbCkKLSAgICAgIHJldHVybiAiIjsKLQotICAgIFN0cmluZ0J1ZmZlciBtYW5nbGVkT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGk9MDtpPGlucHV0Lmxlbmd0aCgpO2krKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSBpbnB1dC5jaGFyQXQoaSk7Ci0gICAgICBzd2l0Y2ggKGMpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBtYW5nbGVkT3V0cHV0LmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICBtYW5nbGVkT3V0cHV0LmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgY2FzZSAnXCInOgotICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgbWFuZ2xlZE91dHB1dC5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgbWFuZ2xlZE91dHB1dC5hcHBlbmQoYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYW5nbGVkT3V0cHV0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOID0gIjwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOX0hUTUxfRU5USVRZID0gIiZsdDsiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFQVRFUl9USEFOID0gIj4iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFQVRFUl9USEFOX0hUTUxfRU5USVRZID0gIiZndDsiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9IVE1MX0VOVElUWSA9ICImbmJzcDsiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QRVJTQU5EID0gIiYiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU1QRVJTQU5EX0hUTUxfRU5USVRZID0gIiZhbXA7IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVT1RBVElPTiA9ICJcIiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UQVRJT05fSFRNTF9FTlRJVFkgPSAiJnF1b3Q7IjsKLQotICAvKioKLSAgKiBSZXBsYWNlIHNwZWNpYWwgY2hhcmFjdGVycyB3aXRoIEhUTUwgZW50aXRpZXMgcmVwcmVzZW50aW5nIHRoZXNlIGNoYXJhY3RlcnMuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIGNvbnZlcnRlZCBTdHJpbmcuIE5vdGU6IE9yZGVyIGlzIGltcG9ydGFudCBzbyB0aGF0IGNvcnJlY3RlZCBlbnRpdHkgcmVmZXJlbmNlcyBhcmUgbm90IHJlLW1hbmdsZWQuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhTdHJpbmcgcykgewotICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIEFNUEVSU0FORCwgQU1QRVJTQU5EX0hUTUxfRU5USVRZKTsKLSAgICBzID0gc3RyaW5nUmVwbGFjZShzLCBMRVNTX1RIQU4sIExFU1NfVEhBTl9IVE1MX0VOVElUWSk7Ci0gICAgcyA9IHN0cmluZ1JlcGxhY2UocywgR1JFQVRFUl9USEFOLCBHUkVBVEVSX1RIQU5fSFRNTF9FTlRJVFkpOwotICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIFNQQUNFLCBTUEFDRV9IVE1MX0VOVElUWSk7Ci0gICAgcyA9IHN0cmluZ1JlcGxhY2UocywgUVVPVEFUSU9OLCBRVU9UQVRJT05fSFRNTF9FTlRJVFkpOwotICAgIHJldHVybiBzOwotICB9Ci0KLSAgLyoqCi0gICogUmVwbGFjZSBIVE1MIGNoYXJhY3RlciBlbnRpdGllcyB3aXRoIHRoZWlyIGFzc29jaWF0ZWQgY2hhcmFjdGVycy4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgY29udmVydGVkIFN0cmluZy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgaHRtbEVudGl0aWVzVG9DaGFyYWN0ZXJzKFN0cmluZyBzKSB7Ci0gICAgcyA9IHN0cmluZ1JlcGxhY2UocywgTEVTU19USEFOX0hUTUxfRU5USVRZLCBMRVNTX1RIQU4pOwotICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIEdSRUFURVJfVEhBTl9IVE1MX0VOVElUWSwgR1JFQVRFUl9USEFOKTsKLSAgICBzID0gc3RyaW5nUmVwbGFjZShzLCBTUEFDRV9IVE1MX0VOVElUWSwgU1BBQ0UpOwotICAgIHMgPSBzdHJpbmdSZXBsYWNlKHMsIEFNUEVSU0FORF9IVE1MX0VOVElUWSwgQU1QRVJTQU5EKTsKLSAgICBzID0gc3RyaW5nUmVwbGFjZShzLCBRVU9UQVRJT05fSFRNTF9FTlRJVFksIFFVT1RBVElPTik7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RyaW5nUmVwbGFjZShTdHJpbmcgcywgU3RyaW5nIG9sZFN0cmluZywgU3RyaW5nIG5ld1N0cmluZykgewotICAgIFN0cmluZyBzQ29weSA9IHM7Ci0gICAgaW50IGZyb21JbmRleCA9IDA7Ci0gICAgaW50IG9sZFN0cmluZ0luZGV4ID0gc0NvcHkuaW5kZXhPZihvbGRTdHJpbmcsIGZyb21JbmRleCk7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHdoaWxlIChvbGRTdHJpbmdJbmRleCAhPSAtMSkgewotICAgICAgc2Iuc2V0TGVuZ3RoKDApOwotICAgICAgc2IuYXBwZW5kKHNDb3B5LnN1YnN0cmluZygwLCBvbGRTdHJpbmdJbmRleCkpOwotICAgICAgc2IuYXBwZW5kKG5ld1N0cmluZyk7Ci0gICAgICBzYi5hcHBlbmQoc0NvcHkuc3Vic3RyaW5nKG9sZFN0cmluZ0luZGV4ICsgb2xkU3RyaW5nLmxlbmd0aCgpLCBzQ29weS5sZW5ndGgoKSkpOwotICAgICAgc0NvcHkgPSBzYi50b1N0cmluZygpOwotICAgICAgZnJvbUluZGV4ID0gb2xkU3RyaW5nSW5kZXggKyBuZXdTdHJpbmcubGVuZ3RoKCk7Ci0gICAgICBvbGRTdHJpbmdJbmRleCA9IHNDb3B5LmluZGV4T2Yob2xkU3RyaW5nLCBmcm9tSW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gc0NvcHk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL011bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTAwOGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL011bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWw7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiBleHRlbmRzIFRocm93YWJsZQotewotICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc4NDU0NzIyMjcxMTA5NjFMOwotCi1wdWJsaWMgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL011bHRpcGFydEZvcm1EYXRhUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDIyMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aXBhcnRGb3JtRGF0YVBhcnNlcgotewotICBwcml2YXRlIEhhc2h0YWJsZSBwYXJhbVRhYmxlXzsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfVFlQRSAgICAgICAgPSAiQ29udGVudC1UeXBlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9NVUxUSVBBUlQgICAgICAgICAgID0gIm11bHRpcGFydCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQk9VTkRBUlkgICAgICAgICAgICA9ICJib3VuZGFyeT0iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfRElTUE9TSVRJT04gPSAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9OQU1FICAgICAgICAgICAgICAgID0gIm5hbWU9XCIiOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUEFSU0VSX1NUQVRFX0lOSVRJQUwgICAgICAgICA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUEFSU0VSX1NUQVRFX0JPVU5EQVJZICAgICAgICA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUEFSU0VSX1NUQVRFX1BBUkFNRVRFUiAgICAgICA9IDI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUEFSU0VSX1NUQVRFX0JMQU5LICAgICAgICAgICA9IDM7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgUEFSU0VSX1NUQVRFX0RBVEEgICAgICAgICAgICA9IDQ7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhcnNlclN0YXRlc1tdID0geyJpbml0aWFsIiwiYm91bmRhcnkiLCJwYXJhbWV0ZXIgbmFtZSIsImJsYW5rIGxpbmUiLCJkYXRhIn07Ci0KLSAgcHVibGljIE11bHRpcGFydEZvcm1EYXRhUGFyc2VyKCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIoSGFzaHRhYmxlIHBhcmFtZXRlcnMpCi0gIHsKLSAgICBwYXJhbVRhYmxlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyYW1ldGVycy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0gICAgICBPYmplY3QgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldChrZXkpOwotICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpdmFsdWU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQyID0gbGlzdC5pdGVyYXRvcigpOyBpdDIuaGFzTmV4dCgpOykKLSAgICAgICAgICBzYXZlRGF0YShrZXkudG9TdHJpbmcoKSwgaXQyLm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKQotICAgICAgewotICAgICAgICBPYmplY3RbXSBhcnJheSA9IChPYmplY3RbXSl2YWx1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykKLSAgICAgICAgICBzYXZlRGF0YShrZXkudG9TdHJpbmcoKSwgYXJyYXlbaV0udG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNhdmVEYXRhKGtleS50b1N0cmluZygpLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBtdWx0aXBhcnQvZm9ybS1kYXRhIGVuY29kZWQgcG9zdCByZXF1ZXN0IHdpdGggYSBnaXZlbiBlbmNvZGluZy4KLSAgICogSWYgdGhlIGVuY29kaW5nIGlzIG51bGwsIHVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcuIHV0Zi04IGlzIG5vdCBhCi0gICAqIGJhZCBjaG9pY2UgZm9yIHRoZSBlbmNvZGluZy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHBhcnNlUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCxTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ29udGVudC1UeXBlIGhlYWRlciBzaG91bGQgaGF2ZSB0aGUgZm9ybToKLSAgICAvLyBtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0uLi4KLSAgICAvLwotICAgIC8vIFJGQzIwNDYgNS4xLjEgcGFnZSAxOSwgcGFyYWdyYXBoIDI6Ci0gICAgLy8gVGhlIENvbnRlbnQtVHlwZSBmaWVsZCBmb3IgbXVsdGlwYXJ0IGVudGl0aWVzIHJlcXVpcmVzIG9uZSBwYXJhbWV0ZXIsICJib3VuZGFyeSIgKG5vIHF1b3RlcykKLSAgICBTdHJpbmcgY29udGVudFR5cGUgPSByZXF1ZXN0LmdldEhlYWRlcihIRUFERVJfQ09OVEVOVF9UWVBFKTsKLSAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCAhY29udGVudFR5cGUuc3RhcnRzV2l0aChIRUFERVJfTVVMVElQQVJUKSB8fCBjb250ZW50VHlwZS5pbmRleE9mKEhFQURFUl9CT1VOREFSWSkgPT0gLTEpCi0gICAgICB0aHJvdyBuZXcgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24oIkNvbnRlbnQtVHlwZSBpcyBub3QgbXVsdGlwYXJ0L2Zvcm0tZGF0YSIpOwotCi0gICAgLy8gUkZDMjA0NiA1LjEuMSBwYWdlIDE5LCBwYXJhZ3JhcGggNDoKLSAgICAvLyBUaGUgYm91bmRhcnkgdmFsdWUgbWF5IGJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMuIFN0cmlwIHRoZXNlIGlmIHRoZXkgYXJlIHByZXNlbnQuCi0gICAgU3RyaW5nIGJvdW5kYXJ5ID0gY29udGVudFR5cGUuc3Vic3RyaW5nKGNvbnRlbnRUeXBlLmluZGV4T2YoSEVBREVSX0JPVU5EQVJZKStIRUFERVJfQk9VTkRBUlkubGVuZ3RoKCksY29udGVudFR5cGUubGVuZ3RoKCkpOwotICAgIGlmIChib3VuZGFyeS5jaGFyQXQoMCkgPT0gJ1wiJyAmJiBib3VuZGFyeS5jaGFyQXQoYm91bmRhcnkubGVuZ3RoKCktMSkgPT0gJ1wiJykKLSAgICAgIGJvdW5kYXJ5ID0gYm91bmRhcnkuc3Vic3RyaW5nKDEsYm91bmRhcnkubGVuZ3RoKCktMSk7Ci0KLSAgICAvLyBSRkMyMDQ2IDUuMS4xIHBhZ2UgMTksIHBhcmFncmFwaCAyOgotICAgIC8vIFRoZSBib3VuZGFyeSBkZWxpbWl0ZXIgbGluZSBpcyB0aGVuIGRlZmluZWQgYXMgYSBsaW5lIGNvbnNpc3RpbmcgZW50aXJlbHkKLSAgICAvLyBvZiB0d28gaHlwaGVuIGNoYXJhY3RlcnMuCi0gICAgU3RyaW5nIGRlbGltaXRlciA9ICItLSIrYm91bmRhcnk7Ci0KLSAgICBpZiAocGFyYW1UYWJsZV8gPT0gbnVsbCkKLSAgICAgIHBhcmFtVGFibGVfID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGVsc2UKLSAgICAgIHBhcmFtVGFibGVfLmNsZWFyKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpLGVuY29kaW5nKSk7Ci0gICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IG51bGw7Ci0gICAgICBTdHJpbmdCdWZmZXIgcGFyYW1ldGVyVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBieXRlIGN1cnJlbnRQYXJzZXJTdGF0ZSA9IFBBUlNFUl9TVEFURV9JTklUSUFMOwotICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gTGluZXMgYXBwZWFyIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UuCi0gICAgICAgIC8vIDEpIGJvdW5kYXJ5IGluZGljYXRpbmcgdGhlIHN0YXJ0IG9mIGEgbmV3IHBhcmFtZXRlciBhbmQgZW5kIG9mIGEgZGF0YSBzZWdtZW50LgotICAgICAgICAvLyAyKSBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9Ii4uLiIgLSB0aGUgbmFtZSBvZiBhIG5ldyBwYXJhbWV0ZXIuCi0gICAgICAgIC8vIDMpIGEgYmxhbmsgbGluZQotICAgICAgICAvLyA0KSBkYXRhCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEZvciBlYWNoIHBhcmFtZXRlciwgdGhlIHNlcXVlbmNlIGlzIHJlcGVhdGVkLgotICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKGRlbGltaXRlcikpCi0gICAgICAgIHsKLSAgICAgICAgICBieXRlW10gZXhwZWN0ZWRQYXJzZXJTdGF0ZXMgPSB7UEFSU0VSX1NUQVRFX0lOSVRJQUwsUEFSU0VSX1NUQVRFX0RBVEF9OwotICAgICAgICAgIGlmIChpc1ZhbGlkUGFyc2VyU3RhdGUoY3VycmVudFBhcnNlclN0YXRlLGV4cGVjdGVkUGFyc2VyU3RhdGVzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTYXZlIGFueSBjdXJyZW50IGRhdGEgYW5kIHByZXBhcmUgZm9yIGEgbmV3IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc2F2ZURhdGEocGFyYW1ldGVyTmFtZSxwYXJhbWV0ZXJWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlLnNldExlbmd0aCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnRQYXJzZXJTdGF0ZSA9IFBBUlNFUl9TVEFURV9CT1VOREFSWTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uKGdldFBhcnNlckV4Y2VwdGlvbk1lc3NhZ2UoY3VycmVudFBhcnNlclN0YXRlLGV4cGVjdGVkUGFyc2VyU3RhdGVzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKEhFQURFUl9DT05URU5UX0RJU1BPU0lUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIGJ5dGVbXSBleHBlY3RlZFBhcnNlclN0YXRlcyA9IHtQQVJTRVJfU1RBVEVfQk9VTkRBUll9OwotICAgICAgICAgIGlmIChpc1ZhbGlkUGFyc2VyU3RhdGUoY3VycmVudFBhcnNlclN0YXRlLGV4cGVjdGVkUGFyc2VyU3RhdGVzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBPYnRhaW4gdGhlIHBhcmFtZXRlciBuYW1lIHdpdGhvdXQgdGhlIHN1cnJvdW5kaW5nIGRvdWJsZSBxdW90ZXMuIEFjY291bnRzIGZvciBSRkMgMTg2NyB0b28uCi0gICAgICAgICAgICBpbnQgcGFyYW1ldGVyTmFtZVN0YXJ0aW5nUG9zaXRpb24gPSBsaW5lLmluZGV4T2YoSEVBREVSX05BTUUpK0hFQURFUl9OQU1FLmxlbmd0aCgpOwotICAgICAgICAgICAgcGFyYW1ldGVyTmFtZSA9IGxpbmUuc3Vic3RyaW5nKHBhcmFtZXRlck5hbWVTdGFydGluZ1Bvc2l0aW9uLCtwYXJhbWV0ZXJOYW1lU3RhcnRpbmdQb3NpdGlvbitsaW5lLnN1YnN0cmluZyhwYXJhbWV0ZXJOYW1lU3RhcnRpbmdQb3NpdGlvbikuaW5kZXhPZignXCInKSk7Ci0gICAgICAgICAgICBjdXJyZW50UGFyc2VyU3RhdGUgPSBQQVJTRVJfU1RBVEVfUEFSQU1FVEVSOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJyZW50UGFyc2VyU3RhdGUgPT0gUEFSU0VSX1NUQVRFX1BBUkFNRVRFUikKLSAgICAgICAgewotICAgICAgICAgIC8vIEEgYmxhbmsgbGluZSBzaG91bGQgZm9sbG93IHRoZSBQQVJBTUVURVIuIERpc2NhcmQgdGhlIGxpbmUgYW5kIG1vdmUgb24uCi0gICAgICAgICAgY3VycmVudFBhcnNlclN0YXRlID0gUEFSU0VSX1NUQVRFX0JMQU5LOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIEV4cGVjdCB0aGUgbGluZSB0byBjb250YWluIGRhdGEuCi0gICAgICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICBwYXJhbWV0ZXJWYWx1ZS5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgY3VycmVudFBhcnNlclN0YXRlID0gUEFSU0VSX1NUQVRFX0RBVEE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIC8vZHVtcFBhcmFtVGFibGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHJlcXVlc3QgcGFyYW1ldGVyIGFzIGEgU3RyaW5nLCBvciBudWxsIGlmIHRoZSBwYXJhbWV0ZXIgZG9lcyBub3QgZXhpc3QuCi0gICAqIElmIHRoZSBwYXJhbWV0ZXIgaGFzIG11bHRpcGxlIHZhbHVlcywgb25seSB0aGUgZmlyc3QgdmFsdWUgaXMgcmV0dXJuZWQuIFVzZSBnZXRQYXJhbWV0ZXJWYWx1ZXMoKQotICAgKiBmb3IgcGFyYW1ldGVycyB3aXRoIG11bHRpcGxlIHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBwYXJhbWV0ZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKHBhcmFtVGFibGVfID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24oIlBhcnNlciBjb250YWlucyBubyBwYXJzZWQgZGF0YSIpOwotICAgIFZlY3RvciB2YWx1ZXMgPSAoVmVjdG9yKXBhcmFtVGFibGVfLmdldChwYXJhbWV0ZXIpOwotICAgIHJldHVybiAoKHZhbHVlcyAhPSBudWxsKT8oKFN0cmluZyl2YWx1ZXMuZWxlbWVudEF0KDApKTpudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtZXRlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAocGFyYW1UYWJsZV8gPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbigiUGFyc2VyIGNvbnRhaW5zIG5vIHBhcnNlZCBkYXRhIik7Ci0gICAgVmVjdG9yIHZhbHVlc1ZlY3RvciA9IChWZWN0b3IpcGFyYW1UYWJsZV8uZ2V0KHBhcmFtZXRlcik7Ci0gICAgaWYgKHZhbHVlc1ZlY3RvciA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgU3RyaW5nW10gdmFsdWVzQXJyYXkgPSBuZXcgU3RyaW5nW3ZhbHVlc1ZlY3Rvci5zaXplKCldOwotICAgIGZvciAoaW50IGk9MDtpPHZhbHVlc0FycmF5Lmxlbmd0aDtpKyspCi0gICAgICB2YWx1ZXNBcnJheVtpXSA9IChTdHJpbmcpdmFsdWVzVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICByZXR1cm4gdmFsdWVzQXJyYXk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nW10gZ2V0UGFyYW1ldGVyTmFtZXMoKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIGlmIChwYXJhbVRhYmxlXyA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uKCJQYXJzZXIgY29udGFpbnMgbm8gcGFyc2VkIGRhdGEiKTsKLQotICAgIGludCBzaXplID0gcGFyYW1UYWJsZV8uc2l6ZSgpOwotICAgIGlmIChzaXplID09IDApCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0gICAgRW51bWVyYXRpb24ga2V5cyA9IHBhcmFtVGFibGVfLmtleXMoKTsKLSAgICBmb3IgKGludCBpPTA7aTxzaXplO2krKykKLSAgICAgIG5hbWVzW2ldID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNhdmVEYXRhKFN0cmluZyBwYXJhbWV0ZXJOYW1lLFN0cmluZyBwYXJhbWV0ZXJWYWx1ZSkKLSAgewotICAgIFZlY3RvciB2YWx1ZXMgPSAoVmVjdG9yKXBhcmFtVGFibGVfLmdldChwYXJhbWV0ZXJOYW1lKTsKLSAgICBpZiAodmFsdWVzID09IG51bGwpCi0gICAgICB2YWx1ZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgdmFsdWVzLmFkZEVsZW1lbnQocGFyYW1ldGVyVmFsdWUpOwotICAgIHBhcmFtVGFibGVfLnB1dChwYXJhbWV0ZXJOYW1lLHZhbHVlcyk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNWYWxpZFBhcnNlclN0YXRlKGJ5dGUgY3VycmVudFN0YXRlLGJ5dGVbXSBleHBlY3RlZFN0YXRlcykKLSAgewotICAgIGJvb2xlYW4gdmFsaWRpdHkgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpPTA7aTxleHBlY3RlZFN0YXRlcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50U3RhdGUgPT0gZXhwZWN0ZWRTdGF0ZXNbaV0pCi0gICAgICB7Ci0gICAgICAgIHZhbGlkaXR5ID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWxpZGl0eTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGdldFBhcnNlckV4Y2VwdGlvbk1lc3NhZ2UoYnl0ZSBjdXJyZW50U3RhdGUsYnl0ZVtdIGV4cGVjdGVkU3RhdGVzKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlBhcnNlciBzdGF0ZSBpbmNvbnNpc3RlbmN5ISIpOwotICAgIG1zZy5hcHBlbmQoJ1xuJyk7Ci0gICAgbXNnLmFwcGVuZCgiQ3VycmVudCBzdGF0ZSAgICA6ICIpLmFwcGVuZChwYXJzZXJTdGF0ZXNbY3VycmVudFN0YXRlXSkuYXBwZW5kKCdcbicpOwotICAgIG1zZy5hcHBlbmQoIkV4cGVjdGVkIHN0YXRlKHMpOiAiKTsKLSAgICBmb3IgKGludCBpPTA7aTxleHBlY3RlZFN0YXRlcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIG1zZy5hcHBlbmQocGFyc2VyU3RhdGVzW2V4cGVjdGVkU3RhdGVzW2ldXSk7Ci0gICAgICBpZiAoaSAhPSBleHBlY3RlZFN0YXRlcy5sZW5ndGgtMSkKLSAgICAgICAgbXNnLmFwcGVuZCgiLCAiKTsKLSAgICB9Ci0gICAgbXNnLmFwcGVuZCgnXG4nKTsKLSAgICByZXR1cm4gbXNnLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1F1aWNrU29ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvUXVpY2tTb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTE1MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvUXVpY2tTb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuKjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgUXVpY2tTb3J0Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzb3J0KE9iamVjdFtdIGEsaW50IGxvLGludCBoaSkKLSAgewotICAgIE9iamVjdCB0bXA7Ci0gICAgaW50IGkgPSBsbzsKLSAgICBpbnQgaiA9IGhpOwotICAgIE9iamVjdCB4ID0gYVsobG8raGkpLzJdOwotICAgIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotICAgIGRvCi0gICAgewotICAgICAgd2hpbGUgKGNvbGxhdG9yLmNvbXBhcmUoYVtpXS50b1N0cmluZygpLHgudG9TdHJpbmcoKSkgPCAwKSBpKys7Ci0gICAgICB3aGlsZSAoY29sbGF0b3IuY29tcGFyZShhW2pdLnRvU3RyaW5nKCkseC50b1N0cmluZygpKSA+IDApIGotLTsKLSAgICAgIGlmIChpIDw9IGopCi0gICAgICB7Ci0gICAgICAgIHRtcCA9IGFbaV07Ci0gICAgICAgIGFbaV0gPSBhW2pdOwotICAgICAgICBhW2pdID0gdG1wOwotICAgICAgICBpKys7Ci0gICAgICAgIGotLTsKLSAgICAgIH0KLSAgICB9IHdoaWxlIChpIDw9IGopOwotCi0gICAgaWYgKGxvIDwgaikKLSAgICAgIHNvcnQoYSxsbyxqKTsKLSAgICBpZiAoaSA8IGhpKQotICAgICAgc29ydChhLGksaGkpOwotICB9Ci0KLSAgLyoKLSAgKiBUaGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgc2FtZSBhbGdvcml0aG0gYXMgYWJvdmUKLSAgKiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBhbnkgbnVsbHMgd2lsbCBiZSBhdHRhY2hlZAotICAqIGF0IHRoZSBlbmQKLSAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNvcnQoVmVjdG9yIHYpCi0gIHsKLSAgICAvLyBkbyBub3Qgc29ydCBpZiB2ZWN0b3IgY29udGFpbnMgbGVzcyB0aGFuIDIgZWxlbWVudHMKLSAgICBpZiAodi5zaXplKCkgPCAyKQotICAgICAgICByZXR1cm47Ci0gIAotICAgIC8vIHB1bGxzIG91dCB0aGUgbnVsbHMKLSAgICBWZWN0b3IgbnVsbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKSB7Ci0gICAgICBPYmplY3Qgb2JqID0gdi5lbGVtZW50QXQoaSk7Ci0gICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqLnRvU3RyaW5nKCkgPT0gbnVsbCkgewotICAgICAgICBudWxscy5hZGQob2JqKTsKLSAgICAgICAgdi5yZW1vdmUoaSk7Ci0gICAgICAgIGktLTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBzb3J0IHRoZSBub3QgbnVsbCBvYmplY3RzCi0gICAgT2JqZWN0W10gb2JqcyA9IHYudG9BcnJheSgpOwotICAgIC8vIGRvIG5vdCBzb3J0IGlmIGFycmF5IGNvbnRhaW5zIGxlc3MgdGhhbiAyIG9iamVjdHMKLSAgICBpZiAob2Jqcy5sZW5ndGggPj0gMikKLSAgICAgICAgc29ydChvYmpzLCAwLCBvYmpzLmxlbmd0aC0xKTsKLQotICAgIC8vIHJlLWNvbnN0cnVjdCB0aGUgdmVjdG9yIGZyb20gdGhlIHNvcnRlZCBvYmplY3RzLCB0aGVuIHRoZSBudWxscwotICAgIHYuY2xlYXIoKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IG9ianMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgdi5hZGQob2Jqc1tqXSk7Ci0gICAgfQotICAgIHYuYWRkQWxsKG51bGxzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvVHJpbUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvVHJpbUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjNmYzAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1RyaW1GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGNsYXNzIFRyaW1GaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YXguc2VydmxldC5GaWx0ZXIjaW5pdChqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGFyZzApIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZheC5zZXJ2bGV0LkZpbHRlciNkb0ZpbHRlcihqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0LCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZSwgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcSwgU2VydmxldFJlc3BvbnNlIHJlc3AsIEZpbHRlckNoYWluIGZjKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24KLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICBDaGFyQXJyYXlXcmFwcGVyIHJlc3BvbnNlV3JhcHBlciA9IG5ldyBDaGFyQXJyYXlXcmFwcGVyKChIdHRwU2VydmxldFJlc3BvbnNlKXJlc3ApOwotICAgIC8vIEhhY2sgZm9yIFRvbWNhdCBwZXJmb3JtYW5jZSBwcm9ibGVtIHdpdGggZmlsdGVycy4KLSAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihyZXNwLmdldE91dHB1dFN0cmVhbSgpLEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKTsKLSAgICBmYy5kb0ZpbHRlcihyZXEscmVzcG9uc2VXcmFwcGVyKTsKLSAgICBTdHJpbmcgcmVzcG9uc2VTdHJpbmcgPSByZXNwb25zZVdyYXBwZXIudG9TdHJpbmcoKTsKLSAgICBvc3cud3JpdGUocmVzcG9uc2VTdHJpbmcudHJpbSgpKTsKLSAgICBvc3cuY2xvc2UoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqYXZheC5zZXJ2bGV0LkZpbHRlciNkZXN0cm95KCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlc3Ryb3koKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvVVJMVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1VSTFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDcwYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvVVJMVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHV0aWxpdHkgbWV0aG9kcyBmb3IgbWFuYWdpbmcgVVJMcwotICogYXMgdXNlZCBieSB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyIFdlYiBhcHBsaWNhdGlvbi4KLSAqIEBhdXRob3IgY2JyZWFsZXlAY2EuaWJtLmNvbQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVVJMVXRpbHMKLXsKLQkvKioKLQkgKiBPYmplY3RzIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSBjb25zdHJ1Y3RlZC4KLQkgKi8KLQlwcml2YXRlIFVSTFV0aWxzICgpCi0JewotCX0KLQotCS8qKgotCSAqIFVURi04Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGOCA9ICJVVEYtOCI7Ci0KLQkvKioKLQkgKiBFcXVpdmFsZW50IHRvIHtAbGluayAjZW5jb2RlKFN0cmluZyxTdHJpbmcpfQotCSAqIHdpdGggc2Vjb25kIHBhcmFtZXRlciBzZXQgdG8gdGhlICJVVEYtOCIgZW5jb2RpbmcuCi0JICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBlbmNvZGUuCi0JICogQHJldHVybiBUaGUgZW5jb2RlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKQotCXsKLQkJcmV0dXJuIGVuY29kZShzLFVURjgpOwotCX0KLQkKLQkvKioKLQkgKiBFcXVpdmFsZW50IHRvIHtAbGluayBVUkxFbmNvZGVyI2VuY29kZShTdHJpbmcsU3RyaW5nKX0sCi0JICogb25seSB0aHJvd3MgYW4gdW5jaGVja2VkIHtAbGluayBSdW50aW1lRXhjZXB0aW9ufSB3cmFwcGVkCi0JICogYXJvdW5kIGFuIHtAbGluayBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9ufSBpbnN0ZWFkIG9mCi0JICogYW4ge0BsaW5rIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb259LgotCSAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZW5jb2RlLgotCSAqIEBwYXJhbSBlbmMgVGhlIGVuY29kaW5nIHRvIHVzZS4KLQkgKiBAcmV0dXJuIFRoZSBlbmNvZGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpCi0JewotCQl0cnkKLQkJewotCQkJcmV0dXJuIFVSTEVuY29kZXIuZW5jb2RlKHMsZW5jKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBUT0RPOiBNU0dfQlJPS0VOX1ZNX0RPRVNfTk9UX1NVUFBPUlRfVVRGLTgKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIlTVNHX0JST0tFTl9WTV9ET0VTX05PVF9TVVBQT1JUX1VURi04IixlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFcXVpdmFsZW50IHRvIHtAbGluayAjZGVjb2RlKFN0cmluZyxTdHJpbmcpfQotCSAqIHdpdGggc2Vjb25kIHBhcmFtZXRlciBzZXQgdG8gdGhlICJVVEYtOCIgZW5jb2RpbmcuCi0JICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBkZWNvZGUuCi0JICogQHJldHVybiBUaGUgZGVjb2RlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKQotCXsKLQkJcmV0dXJuIGRlY29kZShzLFVURjgpOwotCX0KLQkKLQkvKioKLQkgKiBFcXVpdmFsZW50IHRvIHtAbGluayBVUkxFbmNvZGVyI2RlY29kZShTdHJpbmcsU3RyaW5nKX0sCi0JICogb25seSB0aHJvd3MgYW4gdW5jaGVja2VkIHtAbGluayBSdW50aW1lRXhjZXB0aW9ufSB3cmFwcGVkCi0JICogYXJvdW5kIGFuIHtAbGluayBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9ufSBpbnN0ZWFkIG9mCi0JICogYW4ge0BsaW5rIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb259LgotCSAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gZGVjb2RlLgotCSAqIEBwYXJhbSBlbmMgVGhlIGVuY29kaW5nIHRvIHVzZS4KLQkgKiBAcmV0dXJuIFRoZSBkZWNvZGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpCi0JewotCQl0cnkKLQkJewotCQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHMsZW5jKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBUT0RPOiBNU0dfQlJPS0VOX1ZNX0RPRVNfTk9UX1NVUFBPUlRfVVRGLTgKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCIlTVNHX0JST0tFTl9WTV9ET0VTX05PVF9TVVBQT1JUX1VURi04IixlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNmRlMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3V0aWwvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3IKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHZhbGlkYXRlU3RyaW5nKFN0cmluZyBpbnB1dCkKLSAgewotICAgIHJldHVybiAoKGlucHV0ICE9IG51bGwpICYmIChpbnB1dC50cmltKCkubGVuZ3RoKCkgPiAwKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdmFsaWRhdGVVUkwoU3RyaW5nIGlucHV0KQotICB7Ci0gICAgcmV0dXJuICgoaW5wdXQgIT0gbnVsbCkgJiYgKGlucHV0LmluZGV4T2YoIjovLyIpICE9IC0xKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB2YWxpZGF0ZUludGVnZXIoU3RyaW5nIGlucHV0KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSW50ZWdlci5wYXJzZUludChpbnB1dCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1hNTFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vdXRpbC9YTUxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2JlNGQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS91dGlsL1hNTFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFhNTFV0aWxzCi17Ci0gIC8qKgotICAgKiBTZXJpYWxpemUgYW4gWE1MIEVsZW1lbnQgaW50byBhIFN0cmluZy4KLSAgICogQHBhcmFtIGUgRWxlbWVudCB0byBiZSBzZXJpYWxpemVkLgotICAgKiBAcGFyYW0gb21pdFhNTERlY2xhcmF0aW9uIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRvIG9taXQgdGhlIFhNTCBkZWNsYXJhdGlvbi4KLSAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFhNTCBkb2N1bWVudCBmcmFnbWVudC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcmlhbGl6ZShFbGVtZW50IGUsYm9vbGVhbiBvbWl0WE1MRGVjbGFyYXRpb24pCi0gIHsKLSAgICBpZiAoZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotCQlET01Tb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShlKTsKLQkJVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgKChvbWl0WE1MRGVjbGFyYXRpb24pID8gInllcyIgOiAibm8iKSk7Ci0JCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBIVE1MVXRpbHMuVVRGOF9FTkNPRElORyk7Ci0JCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3CVN0cmVhbVJlc3VsdChiYW9zKSk7Ci0JCWJhb3MuY2xvc2UoKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCBIVE1MVXRpbHMuVVRGOF9FTkNPRElORyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gICAgCi0gIC8qKgotICAgKiBTZXJpYWxpemUgYW4gWE1MIEVsZW1lbnQgaW50byBhIFN0cmluZy4KLSAgICogQHBhcmFtIGRmIERvY3VtZW50RnJhZ21lbnQgdG8gYmUgc2VyaWFsaXplZC4KLSAgICogQHBhcmFtIG9taXRYTUxEZWNsYXJhdGlvbiBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0byBvbWl0IHRoZSBYTUwgZGVjbGFyYXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBYTUwgZG9jdW1lbnQgZnJhZ21lbnQuCi0gICAqLyAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcmlhbGl6ZShEb2N1bWVudEZyYWdtZW50IGRmLGJvb2xlYW4gb21pdFhNTERlY2xhcmF0aW9uKQotICB7Ci0gICAgaWYgKGRmICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0JCURPTVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRmKTsKLQkJVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0JCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgKChvbWl0WE1MRGVjbGFyYXRpb24pID8gInllcyIgOiAibm8iKSk7Ci0JCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQkJc2VyaWFsaXplci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBIVE1MVXRpbHMuVVRGOF9FTkNPRElORyk7Ci0JCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3CVN0cmVhbVJlc3VsdChiYW9zKSk7Ci0JCWJhb3MuY2xvc2UoKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCBIVE1MVXRpbHMuVVRGOF9FTkNPRElORyk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFhNTCBEb2N1bWVudC4KLSAgICogQHBhcmFtIGRvY0J1aWxkZXIgRG9jdW1lbnRCdWlsZGVyLiBTZXR0aW5nIHRoaXMgdG8gbnVsbCB3aWxsIGNyZWF0ZSBhIG5ldyBEb2N1bWVudEJ1aWxkZXIuCi0gICAqIEByZXR1cm4gRG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRG9jdW1lbnQgY3JlYXRlTmV3RG9jdW1lbnQoRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZG9jQnVpbGRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUoZmFsc2UpOwotICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgIGRvY0J1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIH0KLSAgICBEb2N1bWVudCBkb2MgPSBkb2NCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgcmV0dXJuIGRvYzsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0IHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gRWxlbWVudCBpbnRvIGFuIEVsZW1lbnQKLSAgICogQHBhcmFtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBFbGVtZW50LgotICAgKiBAcmV0dXJuIEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBzdHJpbmdUb0VsZW1lbnQoU3RyaW5nIHMpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gc3RyaW5nVG9FbGVtZW50KHMsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0IHRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gRWxlbWVudCBpbnRvIGFuIEVsZW1lbnQKLSAgICogQHBhcmFtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBFbGVtZW50LgotICAgKiBAcGFyYW0gYm9vbGVhbiBzZXQgd2hldGhlciB0aGUgcmV0dXJuIEVsZW1lbnQgc2hvdWxkIGJlIG5hbWVzcGFjZSBhd2FyZS4KLSAgICogQHJldHVybiBFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgc3RyaW5nVG9FbGVtZW50KFN0cmluZyBzLCBib29sZWFuIG5hbWVzcGFjZUF3YXJlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIGJ5dGVBcnJheVRvRWxlbWVudChzLmdldEJ5dGVzKEhUTUxVdGlscy5VVEY4X0VOQ09ESU5HKSwgbmFtZXNwYWNlQXdhcmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgdGhlIGJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgYW4gRWxlbWVudCBpbnRvIGFuIEVsZW1lbnQKLSAgICogQHBhcmFtIGJ5dGVbXSByZXByZXNlbnRhdGlvbiBvZiBhbiBFbGVtZW50LgotICAgKiBAcGFyYW0gYm9vbGVhbiBzZXQgd2hldGhlciB0aGUgcmV0dXJuIEVsZW1lbnQgc2hvdWxkIGJlIG5hbWVzcGFjZSBhd2FyZS4KLSAgICogQHJldHVybiBFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgYnl0ZUFycmF5VG9FbGVtZW50KGJ5dGVbXSBiLCBib29sZWFuIG5hbWVzcGFjZUF3YXJlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2NCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBkb2NCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShuYW1lc3BhY2VBd2FyZSk7Ci0gICAgZG9jQnVpbGRlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgRG9jdW1lbnRCdWlsZGVyIGRvY0J1aWxkZXIgPSBkb2NCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICBEb2N1bWVudCBkb2MgPSBkb2NCdWlsZGVyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiKSk7Ci0gICAgcmV0dXJuIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9DbGVhcldTRExBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvQ2xlYXJXU0RMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTY3ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9DbGVhcldTRExBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkNsZWFyTm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETE1haW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExOb2RlOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhcldTRExBY3Rpb24gZXh0ZW5kcyBDbGVhck5vZGVBY3Rpb24gewotCi0gIHB1YmxpYyBDbGVhcldTRExBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoY29udHJvbGxlciwgY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCkgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NkbC9hY3Rpb25zL0NsZWFyV1NETEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICBTdHJpbmcgbm9kZUlEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgaW50IG5vZGVJRDsKLSAgICB0cnkgewotICAgICAgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludChub2RlSURTdHJpbmcpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgbm9kZUlEID0gbm9kZU1hbmFnZXJfLmdldFNlbGVjdGVkTm9kZUlkKCk7Ci0gICAgfQotICAgIGJvb2xlYW4gcGFyYW1WYWxpZCA9IGZhbHNlOwotICAgIE5vZGUgbm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBXU0RMTWFpbk5vZGUpCi0gICAgICBwYXJhbVZhbGlkID0gdHJ1ZTsKLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgV1NETE5vZGUpCi0gICAgICBwYXJhbVZhbGlkID0gdHJ1ZTsKLSAgICBlbHNlIHsKLSAgICAgIHdoaWxlIChub2RlICE9IG51bGwgJiYgIShub2RlIGluc3RhbmNlb2YgV1NETE1haW5Ob2RlKSkgewotICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBXU0RMTm9kZSkgewotICAgICAgICAgIG5vZGVJRCA9IG5vZGUuZ2V0Tm9kZUlkKCk7Ci0gICAgICAgICAgcGFyYW1WYWxpZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKG5vZGVJRCkpOwotICAgIHJldHVybiBwYXJhbVZhbGlkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkgewotICAgIGlmIChzdXBlci5ydW4oKSkgewotICAgICAgbm9kZU1hbmFnZXJfLnNldFNlbGVjdGVkTm9kZUlkKG5vZGVNYW5hZ2VyXy5nZXRSb290Tm9kZSgpLmdldE5vZGVJZCgpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRyZWVDb250ZW50VmFyKCkgewotICAgIHJldHVybiAid3NkbE5hdmlnYXRvckNvbnRlbnQiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKSB7Ci0gICAgcmV0dXJuICJ3c2RsL3dzZGxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpIHsKLSAgICByZXR1cm4gIndzZGxQcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSB7Ci0gICAgcmV0dXJuICJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250YWluZXIuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpIHsKLSAgICByZXR1cm4gIndzZGxTdGF0dXNDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSB7Ci0gICAgcmV0dXJuICJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9DcmVhdGVJbnN0YW5jZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9DcmVhdGVJbnN0YW5jZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmNhODFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvQ3JlYXRlSW5zdGFuY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETE9wZXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RNYXBGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5JbnZva2VXU0RMT3BlcmF0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSW5zdGFuY2VBY3Rpb24gZXh0ZW5kcyBXU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24KLXsKLSAgcHVibGljIENyZWF0ZUluc3RhbmNlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc1BhcnNlZFJlc3VsdHMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnByb2Nlc3NQYXJzZWRSZXN1bHRzKHBhcnNlcik7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBJbnZva2VXU0RMT3BlcmF0aW9uVG9vbCBpbnZva2VXU0RMT3BlcmF0aW9uVG9vbCA9IChJbnZva2VXU0RMT3BlcmF0aW9uVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgIGJvb2xlYW4gcmVzdWx0c1ZhbGlkID0gdHJ1ZTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWl0Lm5leHQoKTsKLSAgICAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICBpZiAoIWZyYWcucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpKQotICAgICAgICByZXN1bHRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgU3RyaW5nIGZyYWdtZW50SUQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX0lEKTsKLSAgICBpZiAoZnJhZ21lbnRJRCAhPSBudWxsICYmIGZyYWdtZW50SUQubGVuZ3RoKCkgPiAwKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX0lELCBmcmFnbWVudElEKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucmVtb3ZlKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX0lEKTsKLSAgICAgIHJlc3VsdHNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICBTdHJpbmcgbmFtZUFuY2hvcklEID0gcGFyc2VyLmdldFBhcmFtZXRlcihGcmFnbWVudENvbnN0YW50cy5OQU1FX0FOQ0hPUl9JRCk7Ci0gICAgaW52b2tlV1NETE9wZXJhdGlvblRvb2wuc2V0RnJhZ21lbnROYW1lQW5jaG9ySUQobmFtZUFuY2hvcklEKTsKLSAgICByZXR1cm4gcmVzdWx0c1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKQotICB7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIHJldHVybiAoRm9ybVRvb2wpd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgZnJhZ21lbnRJRCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX0lEKTsKLSAgICBpZiAoZnJhZ21lbnRJRCAhPSBudWxsICYmIGZyYWdtZW50SUQubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICBJWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnbWVudElEKTsKLSAgICAgIGlmICgoZnJhZyBpbnN0YW5jZW9mIElYU0RNYXBGcmFnbWVudCkgJiYgKChJWFNETWFwRnJhZ21lbnQpZnJhZykuY3JlYXRlSW5zdGFuY2UoKSAhPSBudWxsKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cEdldE9wZXJhdGlvbkZvcm1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2OWU0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5OZXRVdGlsczsKLQotcHVibGljIGNsYXNzIEludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbiBleHRlbmRzIEludm9rZVdTRExIdHRwT3BlcmF0aW9uRm9ybUFjdGlvbgotewotICBwdWJsaWMgSW52b2tlV1NETEh0dHBHZXRPcGVyYXRpb25Gb3JtQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBTdHJpbmdCdWZmZXIgZW5kUG9pbnQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEVuZFBvaW50KCkpOwotICAgIGVuZFBvaW50LmFwcGVuZCgnPycpOwotICAgIGFkZFBhcmFtZXRlcnMoZW5kUG9pbnQpOwotICAgIFN0cmluZyBlbmRQb2ludFN0cmluZyA9IGVuZFBvaW50LnRvU3RyaW5nKCk7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSBOZXRVdGlscy5nZXRVUkxDb25uZWN0aW9uKGVuZFBvaW50U3RyaW5nKTsKLSAgICAgIGlmIChjb25uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlY29yZEh0dHBSZXNwb25zZShjb25uLG1lc3NhZ2VRdWV1ZSk7Ci0gICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRPcGVyYXRpb25Ob2RlKGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpKTsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX0NPTk5FQ1QiLGVuZFBvaW50U3RyaW5nKSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiSU9FeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwT3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cE9wZXJhdGlvbkZvcm1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1ODMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwT3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKjsKLQotaW1wb3J0IGphdmF4LndzZGwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW52b2tlV1NETEh0dHBPcGVyYXRpb25Gb3JtQWN0aW9uIGV4dGVuZHMgV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfQ0hBUlNFVEVRID0gImNoYXJzZXQ9IjsKLSAgCi0gIHB1YmxpYyBJbnZva2VXU0RMSHR0cE9wZXJhdGlvbkZvcm1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5wcm9jZXNzUGFyc2VkUmVzdWx0cyhwYXJzZXIpOwotICAgIFN0cmluZyBlbmRQb2ludCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCk7Ci0gICAgSW52b2tlV1NETE9wZXJhdGlvblRvb2wgaW52b2tlV1NETE9wZXJhdGlvblRvb2wgPSAoSW52b2tlV1NETE9wZXJhdGlvblRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICAgaW52b2tlV1NETE9wZXJhdGlvblRvb2wuc2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KShzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KFdTRExBY3Rpb25JbnB1dHMuT1BFUkFUSU9OX0VMRU1FTlQsb3BlckVsZW1lbnQpOwotICAgIEl0ZXJhdG9yIGl0ID0gb3BlckVsZW1lbnQuZ2V0T3JkZXJlZEJvZHlQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgYm9vbGVhbiByZXN1bHRzVmFsaWQgPSB0cnVlOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWl0Lm5leHQoKTsKLSAgICAgIElGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICBpZiAoIWZyYWcucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpKQotICAgICAgICByZXN1bHRzVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdHNWYWxpZDsKLSAgfSAgCi0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEVuZFBvaW50KCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBlbmRQb2ludCA9IG5ldyBTdHJpbmdCdWZmZXIoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQpKTsKLSAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5PUEVSQVRJT05fRUxFTUVOVCk7Ci0gICAgaWYgKGVuZFBvaW50LmNoYXJBdChlbmRQb2ludC5sZW5ndGgoKS0xKSAhPSAnLycpCi0gICAgICBlbmRQb2ludC5hcHBlbmQoJy8nKTsKLSAgICBlbmRQb2ludC5hcHBlbmQob3BlckVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gZW5kUG9pbnQudG9TdHJpbmcoKTsgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGFkZFBhcmFtZXRlcnMoU3RyaW5nQnVmZmVyIGJ1ZmZlcikKLSAgewotICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXByb3BlcnR5VGFibGVfLmdldChXU0RMQWN0aW9uSW5wdXRzLk9QRVJBVElPTl9FTEVNRU5UKTsKLSAgICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXQubmV4dCgpOwotICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudChwYXJ0KTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoSFRUUFV0aWwuZ2VuVVJMRW5jb2RlZFBhcmFtZXRlcnMoZnJhZykpOwotICAgICAgaWYgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgnJicpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVjb3JkSHR0cFJlc3BvbnNlKFVSTENvbm5lY3Rpb24gY29ubixNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbVJlYWRlciBpbiA9IG51bGw7Ci0gICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBjb25uLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICBpZiAoY29udGVudFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW50IGNoYXJzZXRFcVBvcyA9IGNvbnRlbnRUeXBlLmluZGV4T2YoQ09OVEVOVF9UWVBFX0NIQVJTRVRFUSk7Ci0gICAgICAgIGlmIChjaGFyc2V0RXFQb3MgIT0gLTEpCi0gICAgICAgICAgaW4gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29ubi5nZXRJbnB1dFN0cmVhbSgpLGNvbnRlbnRUeXBlLnN1YnN0cmluZyhjaGFyc2V0RXFQb3MrQ09OVEVOVF9UWVBFX0NIQVJTRVRFUS5sZW5ndGgoKSkpOwotICAgICAgfQotICAgICAgaWYgKGluID09IG51bGwpCi0gICAgICAgIGluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbm4uZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbik7Ci0gICAgICBTdHJpbmcgczsKLSAgICAgIHdoaWxlICgocyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHMpOwotICAgICAgYnIuY2xvc2UoKTsKLSAgICAgIGJyID0gbnVsbDsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaWYgKGJyICE9IG51bGwpCi0gICAgICAgIGJyLmNsb3NlKCk7Ci0gICAgICB0aHJvdyBlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cFBvc3RPcGVyYXRpb25Gb3JtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwUG9zdE9wZXJhdGlvbkZvcm1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxYzQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwUG9zdE9wZXJhdGlvbkZvcm1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTWVzc2FnZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5OZXRVdGlsczsKLQotcHVibGljIGNsYXNzIEludm9rZVdTRExIdHRwUG9zdE9wZXJhdGlvbkZvcm1BY3Rpb24gZXh0ZW5kcyBJbnZva2VXU0RMSHR0cE9wZXJhdGlvbkZvcm1BY3Rpb24KLXsKLQotICBwdWJsaWMgSW52b2tlV1NETEh0dHBQb3N0T3BlcmF0aW9uRm9ybUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIFN0cmluZyBlbmRQb2ludFN0cmluZyA9IGdldEVuZFBvaW50KCk7Ci0gICAgVVJMQ29ubmVjdGlvbiBjb25uID0gTmV0VXRpbHMuZ2V0VVJMQ29ubmVjdGlvbihlbmRQb2ludFN0cmluZyk7Ci0gICAgaWYgKGNvbm4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcGFyYW1ldGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGFkZFBhcmFtZXRlcnMocGFyYW1ldGVycyk7Ci0gICAgICBjb25uLnNldERvT3V0cHV0KHRydWUpOwotICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoY29ubi5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgIG91dC5wcmludChwYXJhbWV0ZXJzKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIG91dCA9IG51bGw7Ci0gICAgICAgIHJlY29yZEh0dHBSZXNwb25zZShjb25uLG1lc3NhZ2VRdWV1ZSk7Ci0gICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRPcGVyYXRpb25Ob2RlKGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpKTsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIklPRXhjZXB0aW9uIixlKTsKLSAgICAgIH0KLSAgICAgIGZpbmFsbHkKLSAgICAgIHsKLSAgICAgICAgaWYgKG91dCAhPSBudWxsKQotICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIkV4Y2VwdGlvbiIsbmV3IElPRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX0NPTk5FQ1QiLGVuZFBvaW50U3RyaW5nKSkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvSW52b2tlV1NETFNPQVBPcGVyYXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvSW52b2tlV1NETFNPQVBPcGVyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkzOTdlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudHJhbnNwb3J0LkhUVFBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudHJhbnNwb3J0LkhUVFBUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIuZGlzY292ZXJ5Lio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmF4aXMuQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgud3NkbC4qOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEludm9rZVdTRExTT0FQT3BlcmF0aW9uQWN0aW9uIGV4dGVuZHMgV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHB1YmxpYyBJbnZva2VXU0RMU09BUE9wZXJhdGlvbkFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5wcm9jZXNzUGFyc2VkUmVzdWx0cyhwYXJzZXIpOwotICAgIFN0cmluZyBlbmRQb2ludCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQpOwotICAgIEludm9rZVdTRExPcGVyYXRpb25Ub29sIGludm9rZVdTRExPcGVyYXRpb25Ub29sID0gKEludm9rZVdTRExPcGVyYXRpb25Ub29sKShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICAgaW52b2tlV1NETE9wZXJhdGlvblRvb2wuc2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkUlBDV3JhcHBlcihWZWN0b3IgYm9keUVudHJpZXMsV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQsV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQsSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgLy8gTXVzdCBiZSBSUEMgc3R5bGUuCi0gICAgU3RyaW5nIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gbnVsbDsKLSAgICAvKgotICAgICAqIFdTLUk6IEluIGEgcnBjLWxpdGVyYWwgU09BUCBiaW5kaW5nLCB0aGUgc2VyaWFsaXplZCBjaGlsZCBlbGVtZW50IG9mIHRoZSAKLSAgICAgKiBzb2FwOkJvZHkgZWxlbWVudCBjb25zaXN0cyBvZiBhIHdyYXBwZXIgZWxlbWVudCwgd2hvc2UgbmFtZXNwYWNlIGlzIHRoZSB2YWx1ZSAKLSAgICAgKiBvZiB0aGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBvZiB0aGUgc29hcGJpbmQ6Ym9keSBlbGVtZW50IGFuZCB3aG9zZSBsb2NhbCBuYW1lIGlzIAotICAgICAqIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uIG9yIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gc3VmZml4ZWQgCi0gICAgICogd2l0aCAiUmVzcG9uc2UiLiBUaGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgYXMgb3Bwb3NlZCB0byBiZWluZyAKLSAgICAgKiBvcHRpb25hbCwgdG8gZW5zdXJlIHRoYXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBzb2FwOkJvZHkgZWxlbWVudCBhcmUgbmFtZXNwYWNlLQotICAgICAqIHF1YWxpZmllZC4KLSAgICAgKi8KLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBvcGVyRWxlbWVudC5nZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgIGlmIChiaW5kaW5nSW5wdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0Lm5leHQoKTsKLSAgICAgICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gKChTT0FQQm9keSlleHRFbGVtZW50KS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBJZiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQgaXMgbm90IHNldCwgZ2V0IGl0IGZyb20gdGhlIG9wZXJhdGlvbiBlbGVtZW50Ci0gICAgaWYgKGVuY29kaW5nTmFtZXNwYWNlVVJJID09IG51bGwpCi0gICAgICBlbmNvZGluZ05hbWVzcGFjZVVSSSA9IG9wZXJFbGVtZW50LmdldEVuY29kaW5nTmFtZXNwYWNlKCk7Ci0gICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBvZiB0aGUgb3BlcmF0aW9uIGVsZW1lbnQgaXMgbm90IHNldCwgZ2V0IGl0IGZyb20gdGhlIGRlZmluaXRpb24gZWxlbWVudAotICAgIGlmIChlbmNvZGluZ05hbWVzcGFjZVVSSSA9PSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxFbGVtZW50LmdldERlZmluaXRpb24oKTsKLSAgICAgIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9Ci0gICAgLy8gR2VuZXJhdGUgYW4gUlBDIHN0eWxlIHdyYXBwZXIgZWxlbWVudC4KLSAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKTsKLSAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZSA9IChvcGVyRWxlbWVudC5pc1VzZUxpdGVyYWwoKSA/IG51bGwgOiBvcGVyRWxlbWVudC5nZXRFbmNvZGluZ1N0eWxlKCkpOwotICAgIEVsZW1lbnQgd3JhcHBlckVsZW1lbnQgPSBTb2FwSGVscGVyLmNyZWF0ZVJQQ1dyYXBwZXJFbGVtZW50KGRvYyxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxlbmNvZGluZ05hbWVzcGFjZVVSSSxvcGVyRWxlbWVudC5nZXRPcGVyYXRpb24oKS5nZXROYW1lKCksZW5jb2RpbmdTdHlsZSk7Ci0gICAgZm9yIChpbnQgaT0wO2k8Ym9keUVudHJpZXMuc2l6ZSgpO2krKykKLSAgICAgIHdyYXBwZXJFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKChFbGVtZW50KWJvZHlFbnRyaWVzLmVsZW1lbnRBdChpKSx0cnVlKSk7Ci0gICAgYm9keUVudHJpZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBib2R5RW50cmllcy5hZGRFbGVtZW50KHdyYXBwZXJFbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBhIFZlY3RvciBvZiB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSBTb2FwIEJvZHkuCi0gICAqIEBwYXJhbSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSAtIEhhc2h0YWJsZSBjb250YWluaW5nIGEgbWFwIG9mIHRoZSBuYW1lc3BhY2UgVVJJcyB0byBwcmVmaXhlcy4KLSAgICogQHBhcmFtIG9wZXJFbGVtZW50IC0gV1NETE9wZXJhdGlvbkVsZW1lbnQgZW5jYXBzdWxhdGluZyB0aGUgV1NETCBvcGVyYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGdldEJvZHlFbnRyaWVzKEhhc2h0YWJsZSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCxXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsV1NETFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50KSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbixFeGNlcHRpb24KLSAgewotICAgIFZlY3RvciBib2R5RW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBib29sZWFuIGlzVXNlTGl0ZXJhbCA9IG9wZXJFbGVtZW50LmlzVXNlTGl0ZXJhbCgpOwotICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlID0gb3BlckVsZW1lbnQuZ2V0RW5jb2RpbmdTdHlsZSgpOwotICAgIGJvb2xlYW4gYWRkRW5jb2RpbmdTdHlsZSA9ICghaXNVc2VMaXRlcmFsICYmICFDb25zdGFudHMuVVJJX1NPQVAxMV9FTkMuZXF1YWxzKGVuY29kaW5nU3R5bGUpKTsKLSAgICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXQubmV4dCgpOwotICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSAoSVhTREZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gZnJhZy5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoIWlzVXNlTGl0ZXJhbCxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSwgWE1MVXRpbHMuY3JlYXRlTmV3RG9jdW1lbnQobnVsbCkpOwotICAgICAgZm9yIChpbnQgaj0wO2o8aW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoO2orKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzW2pdID09IG51bGwpCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChhZGRFbmNvZGluZ1N0eWxlKQotICAgICAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2pdLnNldEF0dHJpYnV0ZSgic29hcGVudjplbmNvZGluZ1N0eWxlIixlbmNvZGluZ1N0eWxlKTsKLSAgICAgICAgYm9keUVudHJpZXMuYWRkRWxlbWVudChpbnN0YW5jZURvY3VtZW50c1tqXSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFvcGVyRWxlbWVudC5pc0RvY3VtZW50U3R5bGUoKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYWRkUlBDV3JhcHBlcihib2R5RW50cmllcywoV1NETEVsZW1lbnQpc2VydmljZUVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpLG9wZXJFbGVtZW50LHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBib2R5RW50cmllczsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldFNPQVBFbnZlbG9wZShIYXNodGFibGUgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUsIFZlY3RvciBib2R5RW50cmllcykgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIERvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLmNyZWF0ZU5ld0RvY3VtZW50KGRvY0J1aWxkZXIpOwotICAgIEVsZW1lbnQgc29hcEVudmVsb3BlRWxlbWVudCA9IFNvYXBIZWxwZXIuY3JlYXRlU29hcEVudmVsb3BlRWxlbWVudChkb2Msc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUpOwotICAgIEVsZW1lbnQgc29hcEJvZHlFbGVtZW50ID0gU29hcEhlbHBlci5jcmVhdGVTb2FwQm9keUVsZW1lbnQoZG9jKTsKLSAgICBmb3IgKGludCBpPTA7aTxib2R5RW50cmllcy5zaXplKCk7aSsrKQotICAgICAgc29hcEJvZHlFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKChFbGVtZW50KWJvZHlFbnRyaWVzLmVsZW1lbnRBdChpKSx0cnVlKSk7Ci0gICAgc29hcEVudmVsb3BlRWxlbWVudC5hcHBlbmRDaGlsZChzb2FwQm9keUVsZW1lbnQpOwotICAgIHJldHVybiBzb2FwRW52ZWxvcGVFbGVtZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHJlY29yZFNvYXBSZXF1ZXN0KFNPQVBNZXNzYWdlUXVldWUgc29hcFJlcXVlc3RRdWV1ZSxIYXNodGFibGUgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUsRWxlbWVudCBzb2FwRW52ZWxvcGUpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLElPRXhjZXB0aW9uCi0gIHsKLSAgICBzb2FwUmVxdWVzdFF1ZXVlLmNsZWFyKCk7Ci0gICAgc29hcFJlcXVlc3RRdWV1ZS5hZGRNZXNzYWdlKFhNTFV0aWxzLnNlcmlhbGl6ZShzb2FwRW52ZWxvcGUsZmFsc2UpKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCByZWNvcmRTT0FQUmVzcG9uc2UoU09BUE1lc3NhZ2VRdWV1ZSBzb2FwUmVzcG9uc2VRdWV1ZSxCdWZmZXJlZFJlYWRlciByZXNwb25zZVJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBzb2FwUmVzcG9uc2VRdWV1ZS5jbGVhcigpOwotICAgIGlmIChyZXNwb25zZVJlYWRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKLSAgICAgIHdoaWxlICgobGluZSA9IHJlc3BvbnNlUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCi0gICAgICAgIHNvYXBSZXNwb25zZVF1ZXVlLmFkZE1lc3NhZ2UobGluZSk7Ci0gICAgICByZXNwb25zZVJlYWRlci5jbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmcgc29hcEFkZHJlc3NMb2NhdGlvbiA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IChXU0RMQmluZGluZ0VsZW1lbnQpb3BlckVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpYmluZGluZ0VsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNPYmplY3QoV1NETEFjdGlvbklucHV0cy5TT0FQX1JFU1BPTlNFX0NBQ0hFRCwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZW5lcmF0ZSB0aGUgU09BUCBlbnZlbG9wZSBhbmQgaXRzIGNoaWxkcmVuLiBXZSBuZWVkIHRvIGNyZWF0ZSBhIERPTSBlbGVtZW50IHZlcnNpb24gdG8gZGlzcGxheSBhbmQgdGhlIG9iamVjdCB2ZXJzaW9uIHRvIGV4ZWN1dGUuCi0gICAgICAvLyA8U09BUC1FTlY6RW52ZWxvcGUKLSAgICAgIC8vICAgIHhtbG5zOlNPQVAtRU5WPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgIC8vICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAvLyAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIC8vIC4uLgotICAgICAgSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgU29hcEhlbHBlci5hZGREZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlcyhzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSk7Ci0gICAgICBWZWN0b3IgYm9keUVudHJpZXMgPSBnZXRCb2R5RW50cmllcyhzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxvcGVyRWxlbWVudCxiaW5kaW5nRWxlbWVudCxzZXJ2aWNlRWxlbWVudCk7Ci0gICAgICBFbGVtZW50IHNvYXBFbnZlbG9wZSA9IGdldFNPQVBFbnZlbG9wZShzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSwgYm9keUVudHJpZXMpOwotICAgICAgcmVjb3JkU29hcFJlcXVlc3Qod3NkbFBlcnNwZWN0aXZlLmdldFNPQVBSZXF1ZXN0UXVldWUoKSxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxzb2FwRW52ZWxvcGUpOwotCi0gICAgICAvLyBFeGVjdXRlIHRoZSBTT0FQIG9wZXJhdGlvbi4KLSAgICAgIGlmIChzb2FwQWRkcmVzc0xvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgYW5kIHJlY29yZCB0aGUgU09BUCBSZXNwb25zZSBFbnZlbG9wZS4KLSAgICAgICAgSFRUUFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBjcmVhdGVUcmFuc3BvcnQoYmluZGluZ0VsZW1lbnQsIHNvYXBBZGRyZXNzTG9jYXRpb24pOwotICAgICAgICB0cmFuc3BvcnQuc2VuZChOZXRVdGlscy5jcmVhdGVVUkwoc29hcEFkZHJlc3NMb2NhdGlvbiksb3BlckVsZW1lbnQuZ2V0U29hcEFjdGlvbigpLFhNTFV0aWxzLnNlcmlhbGl6ZShzb2FwRW52ZWxvcGUsIHRydWUpKTsKLSAgICAgICAgcmVjb3JkU09BUFJlc3BvbnNlKHdzZGxQZXJzcGVjdGl2ZS5nZXRTT0FQUmVzcG9uc2VRdWV1ZSgpLHRyYW5zcG9ydC5yZWNlaXZlKCkpOwotICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0T3BlcmF0aW9uTm9kZShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5BQkxFX1RPX0NPTk5FQ1QiLHNvYXBBZGRyZXNzTG9jYXRpb24pKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIklPRXhjZXB0aW9uIixlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEhUVFBFeGNlcHRpb24gaHR0cGUpCi0gICAgewotICAgICAgdGhyb3dIVFRQRXhjZXB0aW9uKGJpbmRpbmdFbGVtZW50LCBzb2FwQWRkcmVzc0xvY2F0aW9uLCBodHRwZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIkV4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHRocm93SFRUUEV4Y2VwdGlvbihXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsIFN0cmluZyBlbmRwb2ludFN0cmluZywgSFRUUEV4Y2VwdGlvbiBodHRwRXhjZXB0aW9uKSB0aHJvd3MgSFRUUEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGh0dHBFeGNlcHRpb24uZ2V0U3RhdHVzQ29kZSgpID09IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKQotICAgIHsKLSAgICAgIEVuZHBvaW50IGVuZHBvaW50ID0gYmluZGluZ0VsZW1lbnQuZ2V0RW5kcG9pbnQoZW5kcG9pbnRTdHJpbmcpOwotICAgICAgaWYgKGVuZHBvaW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVuZHBvaW50LnNldFJlcXVpcmVIVFRQQmFzaWNBdXRoKHRydWUpOwotICAgICAgICBlbmRwb2ludC5zZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUobnVsbCk7Ci0gICAgICAgIGVuZHBvaW50LnNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgaHR0cEV4Y2VwdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBIVFRQVHJhbnNwb3J0IGNyZWF0ZVRyYW5zcG9ydChXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsIFN0cmluZyBlbmRwb2ludFN0cmluZykKLSAgewotICAgIEhUVFBUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbmV3IEhUVFBUcmFuc3BvcnQoKTsKLSAgICBFbmRwb2ludCBlbmRwb2ludCA9IGJpbmRpbmdFbGVtZW50LmdldEVuZHBvaW50KGVuZHBvaW50U3RyaW5nKTsKLSAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZW5kcG9pbnQuaXNSZXF1aXJlSFRUUEJhc2ljQXV0aCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gZW5kcG9pbnQuZ2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKCk7Ci0gICAgICAgIFN0cmluZyBodHRwQmFzaWNBdXRoUGFzc3dvcmQgPSBlbmRwb2ludC5nZXRIdHRwQmFzaWNBdXRoUGFzc3dvcmQoKTsKLSAgICAgICAgaWYgKGh0dHBCYXNpY0F1dGhVc2VybmFtZSA9PSBudWxsIHx8IGh0dHBCYXNpY0F1dGhQYXNzd29yZCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5IVFRQX0JBU0lDX0FVVEhfVVNFUk5BTUUpOwotICAgICAgICAgIGh0dHBCYXNpY0F1dGhQYXNzd29yZCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdTRExBY3Rpb25JbnB1dHMuSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEKTsKLSAgICAgICAgICBlbmRwb2ludC5zZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUoaHR0cEJhc2ljQXV0aFVzZXJuYW1lKTsKLSAgICAgICAgICBlbmRwb2ludC5zZXRIdHRwQmFzaWNBdXRoUGFzc3dvcmQoaHR0cEJhc2ljQXV0aFBhc3N3b3JkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHR0cEJhc2ljQXV0aFVzZXJuYW1lICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aFBhc3N3b3JkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cmFuc3BvcnQuc2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKGh0dHBCYXNpY0F1dGhVc2VybmFtZSk7Ci0gICAgICAgICAgdHJhbnNwb3J0LnNldEh0dHBCYXNpY0F1dGhQYXNzd29yZChodHRwQmFzaWNBdXRoUGFzc3dvcmQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cmFuc3BvcnQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvbkZvcm1BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3NjUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudHJhbnNmb3JtZXIuRnJhZ21lbnRUcmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmF4LndzZGwuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIEludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbiBleHRlbmRzIEludm9rZVdTRExTT0FQT3BlcmF0aW9uQWN0aW9uCi17Ci0gIHB1YmxpYyBJbnZva2VXU0RMU09BUE9wZXJhdGlvbkZvcm1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiByZXN1bHRzVmFsaWQgPSB0cnVlOwotICAgIHN1cGVyLnByb2Nlc3NQYXJzZWRSZXN1bHRzKHBhcnNlcik7Ci0gICAgU3RyaW5nIHNvdXJjZUNvbnRlbnQgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKEZyYWdtZW50Q29uc3RhbnRzLlNPVVJDRV9DT05URU5UKTsKLSAgICBpZiAoc291cmNlQ29udGVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudCkgZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb3BlckVsZW1lbnQuZ2V0T3JkZXJlZEJvZHlQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgaXQubmV4dCgpOwotICAgICAgICBJRnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgICBpZiAoIWZyYWcucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2Uod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9WQUxJREFUSU5HX1BBUkFNRVRFUiIsIHBhcnQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgcmVzdWx0c1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdHNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoICsgMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRUcmFuc2Zvcm1lcnMsIDAsIHRyYW5zZm9ybWVycywgMCwgcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCk7Ci0gICAgdHJhbnNmb3JtZXJzW3RyYW5zZm9ybWVycy5sZW5ndGggLSAxXSA9IG5ldyBGcmFnbWVudFRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvblNvdXJjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvblNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmE2ZDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvSW52b2tlV1NETFNPQVBPcGVyYXRpb25Tb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC51dGlsLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmF4LndzZGwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGNsYXNzIEludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uIGV4dGVuZHMgSW52b2tlV1NETFNPQVBPcGVyYXRpb25BY3Rpb24KLXsKLSAgcHJpdmF0ZSBib29sZWFuIG5ld0ZpbGVTZWxlY3RlZF87Ci0gIHByaXZhdGUgYm9vbGVhbiBzYXZlQXNTZWxlY3RlZF87Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9XUkFQUEVSX1NUQVJUX1RBRyA9ICI8ZHVtbXlXcmFwcGVyPiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1NWV9XUkFQUEVSX0VORF9UQUcgPSAiPC9kdW1teVdyYXBwZXI+IjsKLSAgCi0gIHB1YmxpYyBJbnZva2VXU0RMU09BUE9wZXJhdGlvblNvdXJjZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBuZXdGaWxlU2VsZWN0ZWRfID0gZmFsc2U7Ci0gICAgc2F2ZUFzU2VsZWN0ZWRfID0gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgZnJhZ21lbnRpemUoU3RyaW5nQnVmZmVyIGZpbGVDb250ZW50cykgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sU0FYRXhjZXB0aW9uLFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sSU9FeGNlcHRpb24KLSAgewotICAgIGZpbGVDb250ZW50cy5pbnNlcnQoMCxEVU1NWV9XUkFQUEVSX1NUQVJUX1RBRykuYXBwZW5kKERVTU1ZX1dSQVBQRVJfRU5EX1RBRyk7Ci0gICAgRWxlbWVudCBkdW1teVdyYXBwZXJFbGVtZW50ID0gWE1MVXRpbHMuc3RyaW5nVG9FbGVtZW50KGZpbGVDb250ZW50cy50b1N0cmluZygpKTsgICAgICAgICAgCi0gICAgVmVjdG9yIHBhcnRFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBOb2RlTGlzdCBwYXJ0Tm9kZXMgPSBkdW1teVdyYXBwZXJFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpPTA7aTxwYXJ0Tm9kZXMuZ2V0TGVuZ3RoKCk7aSsrKQotICAgIHsKLSAgICAgIG9yZy53M2MuZG9tLk5vZGUgcGFydE5vZGUgPSBwYXJ0Tm9kZXMuaXRlbShpKTsKLSAgICAgIGlmIChwYXJ0Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHBhcnRFbGVtZW50cy5hZGRFbGVtZW50KHBhcnROb2RlKTsKLSAgICB9Ci0gICAgRWxlbWVudFtdIGVsZW1lbnRBcnJheSA9IG5ldyBFbGVtZW50W3BhcnRFbGVtZW50cy5zaXplKCldOwotICAgIHBhcnRFbGVtZW50cy5jb3B5SW50byhlbGVtZW50QXJyYXkpOwotICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKTsKLSAgICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXQubmV4dCgpOwotICAgICAgSVhTREZyYWdtZW50IGZyYWdtZW50ID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICBmcmFnbWVudC5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoZWxlbWVudEFycmF5KTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5wcm9jZXNzUGFyc2VkUmVzdWx0cyhwYXJzZXIpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgbmV3RmlsZVNlbGVjdGVkXyA9IGZhbHNlOwotICAgIHNhdmVBc1NlbGVjdGVkXyA9IGZhbHNlOwotICAgIC8qICB0cnkgYW5kIGNhdGNoIGlzIG5lZWRlZCBpZiB3ZSBhcmUgZG9pbmcgZnJhZ21lbnRpemF0aW9uLgotICAgIHRyeQotICAgIHsKLSAgICAqLwotICAgICAgU3RyaW5nIHN1Ym1pc3Npb25BY3Rpb24gPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuU1VCTUlTU0lPTl9BQ1RJT04pOwotICAgICAgU3RyaW5nIHNvdXJjZUNvbnRlbnRzID0gcGFyc2VyLmdldFBhcmFtZXRlcihGcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVCk7Ci0gICAgICBpZiAoc291cmNlQ29udGVudHMgIT0gbnVsbCkKLSAgICAgICAgb3BlckVsZW1lbnQuc2V0UHJvcGVydHlBc1N0cmluZyhXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9TT1VSQ0VfQ09OVEVOVCxzb3VyY2VDb250ZW50cyk7Ci0gICAgICBpZiAoV1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTl9CUk9XU0VfRklMRS5lcXVhbHMoc3VibWlzc2lvbkFjdGlvbikpCi0gICAgICB7Ci0gICAgICAgIG5ld0ZpbGVTZWxlY3RlZF8gPSB0cnVlOwotICAgICAgICBTdHJpbmcgZmlsZUNvbnRlbnRzID0gcGFyc2VyLmdldFBhcmFtZXRlcihXU0RMQWN0aW9uSW5wdXRzLlNFTEVDVEVEX0ZJTEUpOwotICAgICAgICBpZiAoZmlsZUNvbnRlbnRzICE9IG51bGwpCi0gICAgICAgICAgb3BlckVsZW1lbnQuc2V0UHJvcGVydHlBc1N0cmluZyhXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9TT1VSQ0VfQ09OVEVOVCxmaWxlQ29udGVudHMpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoV1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTl9TQVZFX0FTLmVxdWFscyhzdWJtaXNzaW9uQWN0aW9uKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFNhdmUgQXMuLi4gYWN0aW9uCi0gICAgICAgICAgc2F2ZUFzU2VsZWN0ZWRfID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBGcmFnbWVudGl6ZSBvbiBHbyBhY3Rpb24uCi0gICAgICAgICAgLy8gZnJhZ21lbnRpemUobmV3IFN0cmluZ0J1ZmZlcihzb3VyY2VDb250ZW50cykpOwotICAgICAgICAgIFN0cmluZ1tdIG5zRGVjbGFyYXRpb25zID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhGcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVF9OQU1FU1BBQ0UpOwotICAgICAgICAgIGlmIChuc0RlY2xhcmF0aW9ucyAhPSBudWxsKQotICAgICAgICAgICAgb3BlckVsZW1lbnQuc2V0UHJvcGVydHlBc09iamVjdChXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9TT1VSQ0VfQ09OVEVOVF9OQU1FU1BBQ0UsbnNEZWNsYXJhdGlvbnMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAvKgotICAgIH0gICAgICAgCi0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBoYW5kbGVVbmV4cGVjdGVkRXhjZXB0aW9uKHdzZGxQZXJzcGVjdGl2ZSxtZXNzYWdlUXVldWUsIlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaGFuZGxlVW5leHBlY3RlZEV4Y2VwdGlvbih3c2RsUGVyc3BlY3RpdmUsbWVzc2FnZVF1ZXVlLCJTQVhFeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiIsZSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiSU9FeGNlcHRpb24iLGUpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgKi8KLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBhIFZlY3RvciBvZiB0aGUgZWxlbWVudHMgaW5zaWRlIHRoZSBTb2FwIEJvZHkuCi0gICAqIEBwYXJhbSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSAtIEhhc2h0YWJsZSBjb250YWluaW5nIGEgbWFwIG9mIHRoZSBuYW1lc3BhY2UgVVJJcyB0byBwcmVmaXhlcy4KLSAgICogQHBhcmFtIG9wZXJFbGVtZW50IC0gV1NETE9wZXJhdGlvbkVsZW1lbnQgZW5jYXBzdWxhdGluZyB0aGUgV1NETCBvcGVyYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGdldEJvZHlFbnRyaWVzKEhhc2h0YWJsZSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCxXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsV1NETFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50KSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbixFeGNlcHRpb24KLSAgewotICAgIFZlY3RvciBib2R5RW50cmllcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBTdHJpbmdbXSBuc0RlY2xhcmF0aW9ucyA9IChTdHJpbmdbXSlvcGVyRWxlbWVudC5nZXRQcm9wZXJ0eUFzT2JqZWN0KFdTRExNb2RlbENvbnN0YW50cy5QUk9QX1NPVVJDRV9DT05URU5UX05BTUVTUEFDRSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuc0RlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBwcmVmaXhfbnMgPSBTb2FwSGVscGVyLmRlY29kZU5hbWVzcGFjZURlY2xhcmF0aW9uKG5zRGVjbGFyYXRpb25zW2ldKTsKLSAgICAgIGlmICghc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUuY29udGFpbnMocHJlZml4X25zWzFdKSkKLSAgICAgICAgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KHByZWZpeF9uc1sxXSwgcHJlZml4X25zWzBdKTsKLSAgICB9Ci0gICAgU3RyaW5nQnVmZmVyIHNvdXJjZUNvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKG9wZXJFbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlQpKTsKLSAgICBzb3VyY2VDb250ZW50Lmluc2VydCgwLERVTU1ZX1dSQVBQRVJfU1RBUlRfVEFHKS5hcHBlbmQoRFVNTVlfV1JBUFBFUl9FTkRfVEFHKTsKLSAgICBFbGVtZW50IGR1bW15V3JhcHBlckVsZW1lbnQgPSBYTUxVdGlscy5zdHJpbmdUb0VsZW1lbnQoc291cmNlQ29udGVudC50b1N0cmluZygpKTsgICAgICAgICAgCi0gICAgTm9kZUxpc3QgbmwgPSBkdW1teVdyYXBwZXJFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgaWYgKG5sLml0ZW0oaSkgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICBib2R5RW50cmllcy5hZGQobmwuaXRlbShpKSk7Ci0gICAgfQotICAgIGlmICghb3BlckVsZW1lbnQuaXNEb2N1bWVudFN0eWxlKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGFkZFJQQ1dyYXBwZXIoYm9keUVudHJpZXMsKFdTRExFbGVtZW50KXNlcnZpY2VFbGVtZW50LmdldFBhcmVudEVsZW1lbnQoKSxvcGVyRWxlbWVudCxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICB0aHJvdyBlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYm9keUVudHJpZXM7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNOZXdGaWxlU2VsZWN0ZWQoKQotICB7Ci0gICAgcmV0dXJuIG5ld0ZpbGVTZWxlY3RlZF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHdhc1NhdmVBc1NlbGVjdGVkKCkKLSAgewotICAgIHJldHVybiBzYXZlQXNTZWxlY3RlZF87Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdFNhdmVBc0ZpbGVOYW1lKCkKLSAgewotICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKTsKLSAgICByZXR1cm4gKG5ldyBTdHJpbmdCdWZmZXIob3BlckVsZW1lbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0TmFtZSgpKSkuYXBwZW5kKCIudHh0IikudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVTb3VyY2VDb250ZW50KE91dHB1dFN0cmVhbSBvcykKLSAgewotICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRUcmVlRWxlbWVudCgpKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihvcyk7IAotICAgIHB3LnByaW50bG4ob3BlckVsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9TT1VSQ0VfQ09OVEVOVCkpOwotICAgIHB3LmNsb3NlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvT3BlbldTRExBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvT3BlbldTRExBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3N2EyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL09wZW5XU0RMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgT3BlbldTRExBY3Rpb24gZXh0ZW5kcyBXU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24gewotCi0gIHB1YmxpYyBPcGVuV1NETEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgd3NkbFVybCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMLCB3c2RsVXJsKTsKLSAgICBmb3JtVG9vbC51cGRhdGVQcm9wZXJ0eVRhYmxlKHByb3BlcnR5VGFibGVfKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICBTdHJpbmcgd3NkbFVybCA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHJvb3ROb2RlID0gbm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCByb290RWxlbWVudCA9IHJvb3ROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0KLSAgICAvLyBjcmVhdGUgYSBXU0RMRWxlbWVudCByZXByZXNlbnRpbmcgdGhlIFdTREwKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IG5ldyBXU0RMRWxlbWVudCh3c2RsVXJsLCByb290RWxlbWVudC5nZXRNb2RlbCgpLCB3c2RsVXJsKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBvcGVuIFdTREwKLSAgICAgIFZlY3RvciBlcnJvck1lc3NhZ2VzID0gd3NkbEVsZW1lbnQubG9hZFdTREwoKTsKLSAgICAgIGlmIChlcnJvck1lc3NhZ2VzLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfWFNEX1ZBTElEQVRJT04iKSk7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGVycm9yTWVzc2FnZXMuc2l6ZSgpO2krKykKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSgoU3RyaW5nKWVycm9yTWVzc2FnZXMuZWxlbWVudEF0KGkpKTsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX09QRU5fV1NETCIsd3NkbFVybCkpOyAgICAgICAgICAKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiV1NETEV4Y2VwdGlvbiIsZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJvb3RFbGVtZW50LmNvbm5lY3Qod3NkbEVsZW1lbnQsV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMLCBNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotCi0gICAgLy8gYnVpbGQgdGhlIGRhdGFtb2RlbCBmb3IgdGhpcyBXU0RMRWxlbWVudAotICAgIHdzZGxFbGVtZW50LmJ1aWxkTW9kZWwoKTsKLQotICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgdGhhbiAxIHNlcnZpY2Ugbm9kZSwgc2VsZWN0IHRoZSBXU0RMIG5vZGUuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiAxIGJpbmRpbmcgbm9kZSwgc2VsZWN0IHRoZSBzZXJ2aWNlIG5vZGUuCi0gICAgLy8gSWYgdGhlcmUgaXMganVzdCB0aGUgb25lIHNlcnZpY2UgYW5kIGJpbmRpbmcgbm9kZSwgc2VsZWN0IHRoZSBiaW5kaW5nIG5vZGUuCi0gICAgLy8gc2VsZWN0IHRoZSBuZXcgV1NETCBub2RlCi0gICAgTm9kZSB3c2RsTm9kZSA9IHJvb3ROb2RlLmdldENoaWxkTm9kZSh3c2RsRWxlbWVudCk7Ci0gICAgVmVjdG9yIHNlcnZpY2VOb2RlcyA9IHdzZGxOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbmV3U2VsZWN0ZWROb2RlSWQgPSB3c2RsTm9kZS5nZXROb2RlSWQoKTsKLSAgICBpZiAoc2VydmljZU5vZGVzLnNpemUoKSA9PSAxKQotICAgIHsKLSAgICAgIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KDApOwotICAgICAgVmVjdG9yIGJpbmRpbmdOb2RlcyA9IHNlcnZpY2VOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChiaW5kaW5nTm9kZXMuc2l6ZSgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgYmluZGluZ05vZGUgPSAoTm9kZSliaW5kaW5nTm9kZXMuZWxlbWVudEF0KDApOwotICAgICAgICBuZXdTZWxlY3RlZE5vZGVJZCA9IGJpbmRpbmdOb2RlLmdldE5vZGVJZCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBuZXdTZWxlY3RlZE5vZGVJZCA9IHNlcnZpY2VOb2RlLmdldE5vZGVJZCgpOwotICAgIH0KLSAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChuZXdTZWxlY3RlZE5vZGVJZCk7Ci0gICAgbm9kZU1hbmFnZXIubWFrZU5vZGVWaXNpYmxlKG5vZGVNYW5hZ2VyLmdldE5vZGUobmV3U2VsZWN0ZWROb2RlSWQpKTsKLSAgICBhZGRUb0hpc3RvcnkoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwsU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobmV3U2VsZWN0ZWROb2RlSWQsIDAsIEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCwgQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCwgdHJ1ZSkpOwotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19PUEVOX1dTRExfU1VDQ0VTU0ZVTCIsIHdzZGxVcmwpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9PcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9PcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTJjZmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvT3BlblhTREluZm9EaWFsb2dBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHB1YmxpYyBPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoU3RyaW5nIHNlc3Npb25JZCxpbnQgbm9kZUlkLFN0cmluZyBmcmFnSWQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGwvZnJhZ21lbnQvWFNESW5mb0RpYWxvZy5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJZCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoV1NETEFjdGlvbklucHV0cy5GUkFHTUVOVF9JRCkuYXBwZW5kKCc9JykuYXBwZW5kKGZyYWdJZCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHBvcHVsYXRlUHJvcGVydHlUYWJsZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1JlZnJlc2hXU0RMQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1JlZnJlc2hXU0RMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYjkwNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9SZWZyZXNoV1NETEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoV1NETEFjdGlvbiBleHRlbmRzIExpbmtBY3Rpb24gewotCi0gIHB1YmxpYyBSZWZyZXNoV1NETEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgaW50IHRvb2xJRCwgaW50IHZpZXdJRCwgaW50IHZpZXdUb29sSUQpIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGwvYWN0aW9ucy9XU0RMUmVmcmVzaEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBTdHJpbmcgbm9kZUlEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgaW50IG5vZGVJRDsKLSAgICB0cnkgewotICAgICAgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludChub2RlSURTdHJpbmcpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgbm9kZUlEID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlSWQoKTsKLSAgICB9Ci0gICAgTm9kZSBub2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShub2RlSUQpOwotICAgIHdoaWxlIChub2RlICE9IG51bGwgJiYgIShub2RlIGluc3RhbmNlb2YgV1NETE1haW5Ob2RlKSkgewotICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBXU0RMTm9kZSkgewotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgU3RyaW5nLnZhbHVlT2Yobm9kZS5nZXROb2RlSWQoKSkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudCgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKSB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSB3c2RsTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCl3c2RsTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbkNvcHkgPSB3c2RsRWxlbWVudC5nZXREZWZpbml0aW9uKCk7Ci0gICAgVmVjdG9yIHNjaGVtYUxpc3RDb3B5ID0gd3NkbEVsZW1lbnQuZ2V0U2NoZW1hTGlzdCgpOwotICAgIHdzZGxFbGVtZW50LnNldERlZmluaXRpb24obnVsbCk7Ci0gICAgd3NkbEVsZW1lbnQuc2V0U2NoZW1hTGlzdChuZXcgVmVjdG9yKCkpOwotICAgIGludCBzZWxlY3RlZE5vZGVJRCA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpLmdldE5vZGVJZCgpOwotCi0gICAgdHJ5IHsKLSAgICAgIC8vIG9wZW4gV1NETAotICAgICAgVmVjdG9yIGVycm9yTWVzc2FnZXMgPSB3c2RsRWxlbWVudC5sb2FkV1NETCgpOwotICAgICAgaWYgKGVycm9yTWVzc2FnZXMuc2l6ZSgpID4gMCkgewotICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX1hTRF9WQUxJREFUSU9OIikpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxlcnJvck1lc3NhZ2VzLnNpemUoKTtpKyspCi0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoKFN0cmluZyllcnJvck1lc3NhZ2VzLmVsZW1lbnRBdChpKSk7Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2Uod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9PUEVOX1dTREwiLHdzZGxFbGVtZW50LmdldFdzZGxVcmwoKSkpOyAgICAgICAgICAKLSAgICAgIGhhbmRsZVVuZXhwZWN0ZWRFeGNlcHRpb24od3NkbFBlcnNwZWN0aXZlLG1lc3NhZ2VRdWV1ZSwiV1NETEV4Y2VwdGlvbiIsZSk7Ci0gICAgICB3c2RsRWxlbWVudC5zZXREZWZpbml0aW9uKGRlZmluaXRpb25Db3B5KTsKLSAgICAgIHdzZGxFbGVtZW50LnNldFNjaGVtYUxpc3Qoc2NoZW1hTGlzdENvcHkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIGJ1aWxkIHRoZSBkYXRhbW9kZWwgZm9yIHRoaXMgV1NETEVsZW1lbnQKLSAgICB3c2RsRWxlbWVudC5idWlsZE1vZGVsKCk7Ci0KLSAgICAvLyBTZWxlY3QgYSBuZXcgbm9kZSBpZiB0aGUgcHJldmlvdXMgc2VsZWN0ZWQgbm9kZSBubyBsb25nZXIgZXhpc3RzCi0gICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIDEgc2VydmljZSBub2RlLCBzZWxlY3QgdGhlIFdTREwgbm9kZS4gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIDEgYmluZGluZyBub2RlLCBzZWxlY3QgdGhlIHNlcnZpY2Ugbm9kZS4KLSAgICAvLyBJZiB0aGVyZSBpcyBqdXN0IHRoZSBvbmUgc2VydmljZSBhbmQgYmluZGluZyBub2RlLCBzZWxlY3QgdGhlIGJpbmRpbmcgbm9kZS4KLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKHNlbGVjdGVkTm9kZUlEKTsKLSAgICBpZiAobm9kZSA9PSBudWxsKSB7Ci0gICAgICBzZWxlY3RlZE5vZGVJRCA9IHdzZGxOb2RlLmdldE5vZGVJZCgpOwotICAgICAgVmVjdG9yIHNlcnZpY2VOb2RlcyA9IHdzZGxOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChzZXJ2aWNlTm9kZXMuc2l6ZSgpID09IDEpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KDApOwotICAgICAgICBWZWN0b3IgYmluZGluZ05vZGVzID0gc2VydmljZU5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBpZiAoYmluZGluZ05vZGVzLnNpemUoKSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBiaW5kaW5nTm9kZSA9IChOb2RlKWJpbmRpbmdOb2Rlcy5lbGVtZW50QXQoMCk7Ci0gICAgICAgICAgc2VsZWN0ZWROb2RlSUQgPSBiaW5kaW5nTm9kZS5nZXROb2RlSWQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgc2VsZWN0ZWROb2RlSUQgPSBzZXJ2aWNlTm9kZS5nZXROb2RlSWQoKTsKLSAgICAgIH0KLSAgICAgIG5vZGVNYW5hZ2VyLnNldFNlbGVjdGVkTm9kZUlkKHNlbGVjdGVkTm9kZUlEKTsKLSAgICAgIG5vZGVNYW5hZ2VyLm1ha2VOb2RlVmlzaWJsZShub2RlTWFuYWdlci5nZXROb2RlKHNlbGVjdGVkTm9kZUlEKSk7Ci0gICAgfQotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19SRUZSRVNIX1dTRExfU1VDQ0VTU0ZVTCIsIHdzZGxFbGVtZW50LmdldFdzZGxVcmwoKSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1Jlc2l6ZVdTRExGcmFtZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvUmVzaXplV1NETEZyYW1lc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjY3YWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvUmVzaXplV1NETEZyYW1lc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgUmVzaXplV1NETEZyYW1lc0FjdGlvbiBleHRlbmRzIFJlc2l6ZUZyYW1lc0FjdGlvbgotewotICBwdWJsaWMgUmVzaXplV1NETEZyYW1lc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gcGFyc2VyLmdldFBhcmFtZXRlcihXU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgIT0gbnVsbCAmJiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5ULHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSLGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgZnJhbWVzZXQgc2l6ZXMuCi0gICAgU3RyaW5nIGZyYW1lTmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5GUkFNRV9OQU1FKTsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBuZXcgZnJhbWVzZXQgc2l6ZXMuCi0gICAgYm9vbGVhbiBzYXZlRnJhbWVTZXR0aW5ncyA9IGZhbHNlOwotICAgIGlmIChmcmFtZU5hbWUuZXF1YWxzKFdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMod3NkbFBlcnNwZWN0aXZlLmdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjEwMCUsMCUiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZnJhbWVOYW1lLmVxdWFscyhXU0RMRnJhbWVOYW1lcy5XU0RMX1BST1BFUlRJRVNfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICBpZiAoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyh3c2RsUGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3Mod3NkbFBlcnNwZWN0aXZlLmdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoIjEwMCUsMCUiKTsKLSAgICAgICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChmcmFtZU5hbWUuZXF1YWxzKFdTRExGcmFtZU5hbWVzLldTRExfU1RBVFVTX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgaWYgKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmVzdG9yZS4KLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHdzZGxQZXJzcGVjdGl2ZS5nZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpKTsKLSAgICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyh3c2RsUGVyc3BlY3RpdmUuZ2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIE1heGltaXplLgotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMCUsMTAwJSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIE1heGltaXplLgotICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICB3c2RsUGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygiMCUsMTAwJSIpOwotICAgICAgICBpZiAoIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgICAgd3NkbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMCUsMTAwJSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1NlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1NlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YWYyMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9TZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TZWxlY3ROb2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGNsYXNzIFNlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uIGV4dGVuZHMgU2VsZWN0Tm9kZUFjdGlvbgotewotCi0gICAgcHVibGljIFNlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NkbC9hY3Rpb25zL1NlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCkuYXBwZW5kKCc9JykuYXBwZW5kKG5vZGVJRCk7Ci0gICAgICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKS5hcHBlbmQoQWN0aW9uSW5wdXRzLklTSElTVE9SWSkuYXBwZW5kKCI9MSIpOwotICAgICAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICAgIHsKLSAgICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlXy5nZXRUb29sTWFuYWdlcigpOwotICAgICAgVG9vbCBzZWxlY3RlZFRvb2wgPSB0b29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgICAgaW50IHRvb2xJZCA9IHNlbGVjdGVkVG9vbC5nZXRUb29sSWQoKTsKLSAgICAgIGludCB2aWV3SWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgICAgaW50IHZpZXdUb29sSWQgPSBzZWxlY3RlZE5vZGVfLmdldFZpZXdUb29sSWQoKTsKLSAgICAgIGlmIChzZWxlY3RlZFRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKQotICAgICAgICByZXR1cm4gc2VsZWN0ZWRUb29sLmdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKHRydWUpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhub2RlSWQsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpIHsKLSAgICAgICAgcmV0dXJuICJ3c2RsTmF2aWdhdG9yQ29udGVudCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkgewotICAgICAgICByZXR1cm4gIndzZGxQcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkgewotICAgICAgICByZXR1cm4gIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICAgIHsKLSAgICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1NlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkNTNjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1NlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2VsZWN0Tm9kZVRvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uIGV4dGVuZHMgU2VsZWN0Tm9kZVRvb2xBY3Rpb24KLXsKLQotICAgIHB1YmxpYyBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlciwgY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElELCBib29sZWFuIGtlZXBIaXN0b3J5KQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsL2FjdGlvbnMvU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uSlNQLmpzcD8iKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgICAgICBpZiAodmlld0lEICE9IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkgewotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdJRCk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChrZWVwSGlzdG9yeSkgewotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpOwotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoIj0xIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkKLSAgICB7Ci0gICAgICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgICAgICBpbnQgdG9vbElkID0gc2VsZWN0ZWRUb29sXy5nZXRUb29sSWQoKTsKLSAgICAgICAgaW50IHZpZXdJZCA9IHNlbGVjdGVkTm9kZV8uZ2V0Vmlld0lkKCk7Ci0gICAgICAgIGludCB2aWV3VG9vbElkID0gc2VsZWN0ZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKG5vZGVJZCx0b29sSWQsdmlld0lkLHZpZXdUb29sSWQsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpIHsKLSAgICAgICAgcmV0dXJuICJ3c2RsTmF2aWdhdG9yQ29udGVudCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkgewotICAgICAgICByZXR1cm4gIndzZGxQcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkgewotICAgICAgICByZXR1cm4gIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRlbnRWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NkbFByb3BlcnRpZXNDb250ZW50IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gICAgewotICAgICAgcmV0dXJuIEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0RMOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0RMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMGM1NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0RMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb24gZXh0ZW5kcyBTaG93UGVyc3BlY3RpdmVBY3Rpb24KLXsKLSAgcHVibGljIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihXU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyAhPSBudWxsICYmIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV1NETEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChXU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIsYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdTRExBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgCi0gICAgLy8gU2F2ZSB0aGUgZnJhbWVzZXQgc2l6ZXMgaWZmIG5vIGZyYW1lIGlzIG1heGltaXplZC4KLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuc3RhcnRzV2l0aCgiMTAwJSIpICYmICFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIAotICAgIGlmICghYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5zdGFydHNXaXRoKCIxMDAlIikgJiYgIWFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHdzZGxQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgCi0gICAgcmV0dXJuIHN1cGVyLnJ1bigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb3JtQWN0aW9uTGluayhpbnQgdGFyZ2V0UGVyc3BlY3RpdmVJZCxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgZm9ybUxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgZm9ybUxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSkuYXBwZW5kKCc9JykuYXBwZW5kKHRhcmdldFBlcnNwZWN0aXZlSWQpOwotICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgZm9ybUxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpLmFwcGVuZCgiPTEiKTsgICAgCi0gICAgcmV0dXJuIGZvcm1MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1N5bmNocm9uaXplRnJhZ21lbnRWaWV3c0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ1NzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZheC53c2RsLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uIGV4dGVuZHMgV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uCi17Ci0gIHB1YmxpYyBTeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIucHJvY2Vzc1BhcnNlZFJlc3VsdHMocGFyc2VyKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpOwotICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEl0ZXJhdG9yIGl0ID0gb3BlckVsZW1lbnQuZ2V0T3JkZXJlZEJvZHlQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgSW52b2tlV1NETE9wZXJhdGlvblRvb2wgaW52b2tlV1NETE9wZXJhdGlvblRvb2wgPSAoSW52b2tlV1NETE9wZXJhdGlvblRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICAgU3RyaW5nIHZpZXdJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19JRCk7Ci0gICAgcHJvcGVydHlUYWJsZV8ucHV0KEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfSUQsIHZpZXdJRCk7Ci0gICAgaWYgKHZpZXdJRC5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfRk9STV9UT19TT1VSQ0UpKQotICAgIHsKLSAgICAgIGludm9rZVdTRExPcGVyYXRpb25Ub29sLnNldEZyYWdtZW50Vmlld0lEKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX0ZPUk1fVE9fU09VUkNFKTsKLSAgICAgIHJldHVybiBwcm9jZXNzRm9ybVZpZXdQYXJzZWRSZXN1bHRzKHBhcnNlciwgb3BlckVsZW1lbnQsIGl0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGludm9rZVdTRExPcGVyYXRpb25Ub29sLnNldEZyYWdtZW50Vmlld0lEKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNKTsKLSAgICAgIHJldHVybiBwcm9jZXNzU291cmNlVmlld1BhcnNlZFJlc3VsdHMocGFyc2VyLCBvcGVyRWxlbWVudCwgaXQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRm9ybVZpZXdQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlciwgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQsIEl0ZXJhdG9yIGl0KSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNPYmplY3QoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlQsIG51bGwpOwotICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNPYmplY3QoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlRfTkFNRVNQQUNFLCBudWxsKTsKLSAgICBib29sZWFuIHJlc3VsdHNWYWxpZCA9IHRydWU7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdC5uZXh0KCk7Ci0gICAgICBJWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgaWYgKCFmcmFnLnByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMocGFyc2VyKSkKLSAgICAgICAgcmVzdWx0c1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChyZXN1bHRzVmFsaWQpCi0gICAgICBvcGVyRWxlbWVudC5zZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX1NPVVJDRV9DT05URU5ULG51bGwpOwotICAgIHJldHVybiByZXN1bHRzVmFsaWQ7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NvdXJjZVZpZXdQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlciwgV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQsIEl0ZXJhdG9yIGl0KSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBzb3VyY2VDb250ZW50ID0gcGFyc2VyLmdldFBhcmFtZXRlcihGcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVCk7Ci0gICAgaWYgKHNvdXJjZUNvbnRlbnQgIT0gbnVsbCkKLSAgICAgIG9wZXJFbGVtZW50LnNldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlQsIHNvdXJjZUNvbnRlbnQpOwotICAgIFN0cmluZ1tdIG5zRGVjbGFyYXRpb25zID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhGcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVF9OQU1FU1BBQ0UpOwotICAgIGlmIChuc0RlY2xhcmF0aW9ucyAhPSBudWxsKQotICAgICAgb3BlckVsZW1lbnQuc2V0UHJvcGVydHlBc09iamVjdChXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9TT1VSQ0VfQ09OVEVOVF9OQU1FU1BBQ0UsbnNEZWNsYXJhdGlvbnMpOwotICAgIHNvdXJjZUNvbnRlbnQgPSBhZGRSb290RWxlbWVudChzb3VyY2VDb250ZW50KTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBFbGVtZW50IHNvdXJjZUVsZW1lbnRzID0gWE1MVXRpbHMuc3RyaW5nVG9FbGVtZW50KHNvdXJjZUNvbnRlbnQpOwotICAgICAgTm9kZUxpc3QgbmwgPSBzb3VyY2VFbGVtZW50cy5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBWZWN0b3IgZWxlbWVudHNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG9yZy53M2MuZG9tLk5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgZWxlbWVudHNWZWN0b3IuYWRkKG5vZGUpOwotICAgICAgfQotICAgICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbZWxlbWVudHNWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgIGVsZW1lbnRzVmVjdG9yLmNvcHlJbnRvKGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgICAgIGJvb2xlYW4gc291cmNlRWxlbWVudHNWYWxpZCA9IHRydWU7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdC5uZXh0KCk7Ci0gICAgICAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICAgIGlmICghZnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoaW5zdGFuY2VEb2N1bWVudHMpKQotICAgICAgICAgIHNvdXJjZUVsZW1lbnRzVmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzb3VyY2VFbGVtZW50c1ZhbGlkOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFkZFJvb3RFbGVtZW50KFN0cmluZyBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHNiLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5ST09UX0VMRU1FTlRfU1RBUlRfVEFHKTsKLSAgICBzYi5hcHBlbmQoZWxlbWVudCk7Ci0gICAgc2IuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlJPT1RfRUxFTUVOVF9FTkRfVEFHKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhNmU0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1RvZ2dsZVdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24gZXh0ZW5kcyBUb2dnbGVOb2RlQWN0aW9uCi17Ci0gIHB1YmxpYyBUb2dnbGVXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyLGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKSk7Ci0gIH0KLQotICAvLyB1ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbi5qc3A/bm9kZUlkPS4uLiZvcGVuPS4uLgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsYm9vbGVhbiBvcGVuKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5PUEVOKS5hcHBlbmQoJz0nKS5hcHBlbmQob3Blbj9BY3Rpb25JbnB1dHMuT1BFTl9OT0RFOkFjdGlvbklucHV0cy5DTE9TRV9OT0RFKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgdG8gc2VsZWN0IHRoZSB0b2dnbGVkIG5vZGUgd2hlbiwgYXQgdGhlIHRpbWUgb2YKLSAgLy8gdGhlIGNvbGxhcHNlIGV2ZW50LCBhIGRlc2NlbmRhbnQgbm9kZSB3YXMgc2VsZWN0ZWQuCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGlua0Zvckhpc3RvcnkoKQotICB7Ci0gICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSB0b2dnbGVkTm9kZV8uZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIGludCBub2RlSWQgPSB0b2dnbGVkTm9kZV8uZ2V0Tm9kZUlkKCk7Ci0gICAgaW50IHRvb2xJZCA9IHNlbGVjdGVkVG9vbC5nZXRUb29sSWQoKTsKLSAgICBpbnQgdmlld0lkID0gdG9nZ2xlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgIGludCB2aWV3VG9vbElkID0gdG9nZ2xlZE5vZGVfLmdldFZpZXdUb29sSWQoKTsKLSAgICBpZiAoc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikKLSAgICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLHRydWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBTZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCx0cnVlKTsKLSAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gICAgewotICAgICAgcmV0dXJuICJ3c2RsTmF2aWdhdG9yQ29udGVudCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiAid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIndzZGxQcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgaW50IGdldFBlcnNwZWN0aXZlSWQoKQotICAgIHsKLSAgICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1VwZGF0ZVdTRExCaW5kaW5nQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1VwZGF0ZVdTRExCaW5kaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjZiZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9VcGRhdGVXU0RMQmluZGluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExBY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExCaW5kaW5nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5JbnZva2VXU0RMT3BlcmF0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMQmluZGluZ05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVXU0RMQmluZGluZ0FjdGlvbiBleHRlbmRzIFdTRExQcm9wZXJ0aWVzRm9ybUFjdGlvbgotewotICBwdWJsaWMgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzUGFyc2VkUmVzdWx0cyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nW10gbm9kZUlkcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgaWYgKG5vZGVJZHMgPT0gbnVsbCkKLSAgICAgIG5vZGVJZHMgPSBuZXcgU3RyaW5nWzBdOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBub2RlSWRzKTsKLSAgICBTdHJpbmdbXSBlbmRwb2ludHMgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKFdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UKTsKLSAgICBpZiAoZW5kcG9pbnRzID09IG51bGwpCi0gICAgICBlbmRwb2ludHMgPSBuZXcgU3RyaW5nWzBdOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChXU0RMQWN0aW9uSW5wdXRzLkVORF9QT0lOVCwgZW5kcG9pbnRzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICBTdHJpbmdbXSBub2RlSWRzID0gZ2V0UHJvcGVydHlBc1N0cmluZ0FycmF5KEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIFN0cmluZ1tdIGVuZHBvaW50cyA9IGdldFByb3BlcnR5QXNTdHJpbmdBcnJheShXU0RMQWN0aW9uSW5wdXRzLkVORF9QT0lOVCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlSWRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBOb2RlIGJpbmRpbmdOb2RlID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJZHNbaV0pKTsKLSAgICAgICAgaWYgKGJpbmRpbmdOb2RlIGluc3RhbmNlb2YgV1NETEJpbmRpbmdOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgV1NETEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50ID0gKFdTRExCaW5kaW5nRWxlbWVudCliaW5kaW5nTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZ1tdIGVuZHBvaW50c0NvcHkgPSBlbmRwb2ludHM7Ci0gICAgICAgICAgYmluZGluZ0VsZW1lbnQuc2V0RW5kUG9pbnRzKGVuZHBvaW50c0NvcHkpOwotICAgICAgICAgIGlmIChlbmRwb2ludHNDb3B5Lmxlbmd0aCA8PSAwKQotICAgICAgICAgICAgZW5kcG9pbnRzQ29weSA9IGJpbmRpbmdFbGVtZW50LmdldEVuZFBvaW50cygpOwotICAgICAgICAgIGlmIChlbmRwb2ludHNDb3B5Lmxlbmd0aCA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgVmVjdG9yIG9wZXJhdGlvbk5vZGVzID0gYmluZGluZ05vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG9wZXJhdGlvbk5vZGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE5vZGUgb3BlcmF0aW9uTm9kZSA9IChOb2RlKWl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgTGlzdCB0b29scyA9IG9wZXJhdGlvbk5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0VG9vbHMoKTsKLSAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciB0b29sc0l0ZXJhdG9yID0gdG9vbHMuaXRlcmF0b3IoKTsgdG9vbHNJdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVG9vbCB0b29sID0gKFRvb2wpdG9vbHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRvb2wgaW5zdGFuY2VvZiBJbnZva2VXU0RMT3BlcmF0aW9uVG9vbCkKLSAgICAgICAgICAgICAgICAgICgoSW52b2tlV1NETE9wZXJhdGlvblRvb2wpdG9vbCkuc2V0RW5kUG9pbnQoZW5kcG9pbnRzQ29weVswXSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19VUERBVEVfV1NETF9CSU5ESU5HX1NVQ0NFU1NGVUwiKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1dTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwMGFiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1dTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5MaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc01vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLkZhdm9yaXRlc0ZvbGRlckVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBMaW5rQWN0aW9uIHsKLSAgcHVibGljIFdTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NMaW5rUGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotICAgIFN0cmluZyBub2RlSUQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICB0cnkgewotICAgICAgSW50ZWdlci5wYXJzZUludChub2RlSUQpOwotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIG5vZGVJRCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlEKSB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsL2FjdGlvbnMvV1NETENoZWNrRmF2b3JpdGVFeGlzdHNBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoKSB7Ci0gICAgU3RyaW5nIHdzZGxVcmwgPSBnZXRXc2RsVXJsKCk7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1dTRExfVVJMLCB3c2RsVXJsKTsKLSAgICBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IGZhdkZvbGRlckVsZW1lbnQgPSBnZXRGYXZXU0RMRm9sZGVyRWxlbWVudCgpOwotICAgIHJldHVybiBmYXZGb2xkZXJFbGVtZW50LmZhdm9yaXRlRXhpc3RzKHRhYmxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgU3RyaW5nIHdzZGxVcmwgPSBnZXRXc2RsVXJsKCk7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1dTRExfVVJMLCB3c2RsVXJsKTsKLSAgICBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IGZhdkZvbGRlckVsZW1lbnQgPSBnZXRGYXZXU0RMRm9sZGVyRWxlbWVudCgpOwotICAgIGlmIChmYXZGb2xkZXJFbGVtZW50LmFkZEZhdm9yaXRlKHRhYmxlKSkgewotICAgICAgd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTCIsIHdzZGxVcmwpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUyIsIHdzZGxVcmwpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRXc2RsVXJsKCkgewotICAgIFN0cmluZyBub2RlSUQgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgd3NkbE5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgV1NETEVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gKFdTRExFbGVtZW50KXdzZGxOb2RlTWFuYWdlci5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlEKSkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50LmdldFdzZGxVcmwoKTsKLSAgfQotCi0gIHByaXZhdGUgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBnZXRGYXZXU0RMRm9sZGVyRWxlbWVudCgpIHsKLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgZmF2Tm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIFRyZWVFbGVtZW50IGZhdlJvb3RFbGVtZW50ID0gZmF2Tm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEVudW1lcmF0aW9uIGUgPSBmYXZSb290RWxlbWVudC5nZXRFbGVtZW50cyhGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFKTsKLSAgICByZXR1cm4gKEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1dTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9hY3Rpb25zL1dTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTMxNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuV1NETEZpbGVOYW1lSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbl87Ci0gIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRXU0RMRmlsZU5hbWVfOwotCi0gIHB1YmxpYyBXU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBkZWZpbml0aW9uXyA9IG51bGw7Ci0gICAgZGVmYXVsdFdTRExGaWxlTmFtZV8gPSAidGVtcC53c2RsIjsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJZCxpbnQgdG9vbElkLGludCB2aWV3SWQsaW50IHZpZXdUb29sSWQpIHsKLSAgICByZXR1cm4gSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLHRvb2xJZCx2aWV3SWQsdmlld1Rvb2xJZCwid3NkbC9hY3Rpb25zL1dTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcCIpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gd3JpdGUoT3V0cHV0U3RyZWFtIG9zKSB7Ci0gICAgcmV0dXJuIHdyaXRlV1NETERlZmluaXRpb24ob3MsIGRlZmluaXRpb25fKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVOYW1lKCkgewotICAgIHJldHVybiBkZWZhdWx0V1NETEZpbGVOYW1lXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpIHsKLSAgICBpbnQgbm9kZUlEOwotICAgIHRyeSB7Ci0gICAgICBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpbm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIGRlZmluaXRpb25fID0gd3NkbEVsZW1lbnQuZ2V0RGVmaW5pdGlvbigpOwotICAgIGRlZmF1bHRXU0RMRmlsZU5hbWVfID0gV1NETEZpbGVOYW1lSGVscGVyLmdldFdTRExGaWxlTmFtZSh3c2RsRWxlbWVudC5nZXRXc2RsVXJsKCkpOwotICAgIHJldHVybiAoZGVmaW5pdGlvbl8gIT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKSB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOWM1NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGNsYXNzIFdTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24gZXh0ZW5kcyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbiB7Ci0gIHB1YmxpYyBXU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKSB7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIHJldHVybiAoRm9ybVRvb2wpd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gIH0KLQotICBwdWJsaWMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uIG5ld0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbigpIHsKLSAgICBXU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiBhY3Rpb24gPSBuZXcgV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICB0YWJsZS5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgU3RyaW5nLnZhbHVlT2Yoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKSk7Ci0gICAgcmV0dXJuIGFjdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODFiOTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlOwotCi1wdWJsaWMgY2xhc3MgV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gZXh0ZW5kcyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIHsKLQotICBwdWJsaWMgV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpIHsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgcmV0dXJuIChGb3JtVG9vbCl3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpIHsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIG5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBXU0RMRWxlbWVudCBlbGVtZW50ID0gKFdTRExFbGVtZW50KW5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICByZXR1cm4gbGF1bmNoV2l6YXJkKGVsZW1lbnQuZ2V0V3NkbFVybCgpKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2FjdGlvbnMvV1NETFByb3BlcnRpZXNGb3JtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNjY4NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvYWN0aW9ucy9XU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXU0RMUHJvcGVydGllc0Zvcm1BY3Rpb24gZXh0ZW5kcyBGb3JtQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyXzsKLSAgcHVibGljIFdTRExQcm9wZXJ0aWVzRm9ybUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBuYXZpZ2F0b3JNYW5hZ2VyXyA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdbXSBrZXlzID0gcGFyc2VyLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoa2V5c1tpXSk7Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDEpCi0gICAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KGtleXNbaV0sIHZhbHVlc1swXSk7Ci0gICAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPiAxKQotICAgICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChrZXlzW2ldLCB2YWx1ZXMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldFNlbGVjdGVkTmF2aWdhdG9yTm9kZSgpCi0gIHsKLSAgICByZXR1cm4gbmF2aWdhdG9yTWFuYWdlcl8uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gIH0KLQotICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpCi0gIHsKLSAgICByZXR1cm4gKEZvcm1Ub29sKShnZXRTZWxlY3RlZE5hdmlnYXRvck5vZGUoKS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9CaW5kaW5nVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9CaW5kaW5nVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4YWY1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvQmluZGluZ1R5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1R5cGVzCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEID0gLTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPQVAgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0dFVCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUE9TVCA9IDI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1ZFUkJfR0VUID0gIkdFVCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVkVSQl9QT1NUID0gIlBPU1QiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL0ZyYWdtZW50Q29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvRnJhZ21lbnRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1ZDlkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvRnJhZ21lbnRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgRnJhZ21lbnRDb25zdGFudHMKLXsKLSAgLy8gWFNEIG1pbk9jY3VycyBhbmQgbWF4T2NjdXJzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUlOX09DQ1VSUyA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX09DQ1VSUyA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQk9VTkRFRCA9IC0xOwotCi0gIC8vIFdTREwgc3R5bGUKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfRE9DVU1FTlQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFlMRV9SUEMgPSAxOwotCi0gIC8vIFdTREwgRW5jb2Rpbmcgc3R5bGVzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQ09ESU5HX0xJVEVSQUwgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkNPRElOR19TT0FQID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RJTkdfVVJMID0gMjsgLy8gSFRUUCBHZXQvUG9zdAotCi0gIC8vIElEcyB1c2VkIGJ5IHRoZSBmcmFnbWVudCBtb2RlbAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TRVBFUkFUT1IgPSAiOjoiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9JRCA9ICI6OmlucHV0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0lEID0gIjo6b3V0cHV0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfSUQgPSAiOjp0YWJsZUlEIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRfSUQgPSAiOjpmcmFnbWVudElEIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BTkNIT1JfSUQgPSAiOjpuYW1lQW5jaG9ySUQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9WSUVXX0lEID0gIjo6ZnJhZ21lbnRWaWV3SUQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfQVRPTUlDX0VOVU1fSUQgPSAiOjp4c2RBdG9taWNFbnVtSUQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfQUxMX0dST1VQX0lEID0gIjo6eHNkQWxsR3JvdXBJRCI7Ci0KLSAgLy8gRnJhZ21lbnQgdmlldyBJRHMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRfVklFV19TV0lUQ0hfRk9STV9UT19TT1VSQ0UgPSAiOjpmcmFnbWVudFZpZXdTd2l0Y2hGb3JtVG9Tb3VyY2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9WSUVXX1NXSVRDSF9TT1VSQ0VfVE9fRk9STSA9ICI6OmZyYWdtZW50Vmlld1N3aXRjaFNvdXJjZVRvRm9ybSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9DT05URU5UID0gIjo6c291cmNlQ29udGVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9DT05URU5UX05BTUVTUEFDRSA9ICI6OnNvdXJjZUNvbnRlbnROUyI7Ci0KLSAgLy8gQWN0aW9uIGlucHV0IGNvbnN0YW50cwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FOQ0hPUiA9ICJuYW1lQW5jaG9yIjsKLQotICAvLyBOYW1lc3BhY2VzIGNvbnRhbnRzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfU09BUCA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9TT0FQX0VOViA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9XU0RMID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX1hTSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRU5DX0FSUkFZX1RZUEUgPSAiYXJyYXlUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNJX1RZUEUgPSAidHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFOQU1FX1BSRUZJWCA9ICJxIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUU5BTUVfTE9DQUxfTkFNRV9BUlJBWV9UWVBFID0gImFycmF5VHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFOQU1FX0xPQ0FMX05BTUVfQVJSQVkgPSAiQXJyYXkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPTiA9ICI6IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUU5BTUVfTE9DQUxfTkFNRV9CT0RZID0gIkJvZHkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRTkFNRV9MT0NBTF9OQU1FX0ZBVUxUID0gIkZhdWx0IjsKLQotICAvLyBMaXN0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfU0VQRVJBVE9SID0gIiAiOwotCi0gIC8vIFNPQVAtRU5DOkFycmF5Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFRlRfU1FVQVJFX0JSQUNLRVQgPSAiWyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJJR0hUX1NRVUFSRV9CUkFDS0VUID0gIl0iOwotCi0gIC8vIFhTRERlZmF1bHRGcmFnbWVudAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0VMRU1FTlRfU1RBUlRfVEFHID0gIjxyb290PiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRUxFTUVOVF9FTkRfVEFHID0gIjwvcm9vdD4iOwotCi0gIC8vIE5hbWVzcGFjZSBVUklzLgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfWE1MTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfU09BUF9FTlYgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfU09BUF9FTkMgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfMTk5OV9TQ0hFTUFfWFNJID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hLWluc3RhbmNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJXzE5OTlfU0NIRU1BX1hTRCA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV8yMDAwX1NDSEVNQV9YU0kgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEtaW5zdGFuY2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfMjAwMF9TQ0hFTUFfWFNEID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvWE1MU2NoZW1hIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJXzIwMDFfU0NIRU1BX1hTSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV8yMDAxX1NDSEVNQV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfQ1VSUkVOVF9TQ0hFTUFfWFNJID0gTlNfVVJJXzIwMDFfU0NIRU1BX1hTSTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX0NVUlJFTlRfU0NIRU1BX1hTRCA9IE5TX1VSSV8yMDAxX1NDSEVNQV9YU0Q7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9YTUxfU09BUCA9ICJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfWE1MX1NPQVBfREVQTE9ZTUVOVCA9ICJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAvZGVwbG95bWVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9MSVRFUkFMX1hNTCA9ICJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAvbGl0ZXJhbHhtbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9YTUlfRU5DID0gImh0dHA6Ly93d3cuaWJtLmNvbS9uYW1lc3BhY2VzL3htaSI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL1dTRExBY3Rpb25JbnB1dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9XU0RMQWN0aW9uSW5wdXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWRlOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL1dTRExBY3Rpb25JbnB1dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV1NETEFjdGlvbklucHV0cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQgPSAiZnJhbWVzZXRDb2xzUGVyc3BlY3RpdmVDb250ZW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUiA9ICJmcmFtZXNldFJvd3NBY3Rpb25zQ29udGFpbmVyIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0lEID0gInNlc3Npb25JRCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UX0lEID0gImZyYWdtZW50SUQiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRU5WRUxPUEVfVFlQRSA9ICJzb2FwRW52ZWxvcGVUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09BUF9FTlZFTE9QRV9UWVBFX1JFUVVFU1QgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT0FQX0VOVkVMT1BFX1RZUEVfUkVTUE9OU0UgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1JFU1BPTlNFX0NBQ0hFRCA9ICJzb2FwUmVzcG9uc2VDYWNoZWQiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQk1JU1NJT05fQUNUSU9OID0gInN1Ym1pc3Npb25BY3Rpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNSVNTSU9OX0FDVElPTl9GT1JNID0gInN1Ym1pc3Npb25BY3Rpb25Gb3JtIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCTUlTU0lPTl9BQ1RJT05fQlJPV1NFX0ZJTEUgPSAic3VibWlzc2lvbkFjdGlvbkJyb3dzZUZpbGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNSVNTSU9OX0FDVElPTl9TQVZFX0FTID0gInN1Ym1pc3Npb25BY3Rpb25TYXZlQXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RFRF9GSUxFID0gInNlbGVjdGVkRmlsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9FTEVNRU5UID0gIm9wZXJhdGlvbkVsZW1lbnQiOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9QT0lOVCA9ICI6OmVuZFBvaW50IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FID0gImh0dHBCYXNpY0F1dGhVc2VybmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQkFTSUNfQVVUSF9QQVNTV09SRCA9ICJodHRwQmFzaWNBdXRoUGFzc3dvcmQiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL1dTRExGcmFtZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvV1NETEZyYW1lTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmNzEzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9jb25zdGFudHMvV1NETEZyYW1lTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRnJhbWVOYW1lcwotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX05BVklHQVRPUl9DT05UQUlORVIgPSAid3NkbF9uYXZpZ2F0b3JfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETF9OQVZJR0FUT1JfVE9PTEJBUiA9ICJ3c2RsX25hdmlnYXRvcl90b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETF9OQVZJR0FUT1JfQ09OVEVOVCA9ICJ3c2RsX25hdmlnYXRvcl9jb250ZW50IjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETF9BQ1RJT05TX0NPTlRBSU5FUiA9ICJ3c2RsX2FjdGlvbnNfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETF9QUk9QRVJUSUVTX0NPTlRBSU5FUiA9ICJ3c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETF9QUk9QRVJUSUVTX1RPT0xCQVIgPSAid3NkbF9wcm9wZXJ0aWVzX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX1BST1BFUlRJRVNfQ09OVEVOVCA9ICJ3c2RsX3Byb3BlcnRpZXNfY29udGVudCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfU1RBVFVTX0NPTlRBSU5FUiA9ICJ3c2RsX3N0YXR1c19jb250YWluZXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX1NUQVRVU19UT09MQkFSID0gIndzZGxfc3RhdHVzX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0RMX1NUQVRVU19DT05URU5UID0gIndzZGxfc3RhdHVzX2NvbnRlbnQiOwotCi0gIC8vIFhTRCBJbmZvIERpYWxvZwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYU0RfSU5GT19UT09MQkFSID0gInhzZF9pbmZvX3Rvb2xiYXIiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYU0RfSU5GT19DT05URU5UID0gInhzZF9pbmZvX2NvbnRlbnQiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL1dTRExNb2RlbENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvY29uc3RhbnRzL1dTRExNb2RlbENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2IxOWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2NvbnN0YW50cy9XU0RMTW9kZWxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTW9kZWxDb25zdGFudHMKLXsKLSAgICAvLyBSZWxhdGlvbgotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9XU0RMID0gInJlbFdTREwiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9XU0RMX1NFUlZJQ0UgPSAicmVsV1NETFNlcnZpY2UiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9XU0RMX0JJTkRJTkcgPSAicmVsV1NETEJpbmRpbmciOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTF9XU0RMX09QRVJBVElPTiA9ICJyZWxXU0RMT3BlcmF0aW9uIjsKLQotICAgIC8vIERvY3VtZW50YXRpb24KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX0RPQ1VNRU5UQVRJT04gPSAicHJvcERvY3VtZW50YXRpb24iOwotCi0gICAgLy8gU291cmNlIENvbnRlbnQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1NPVVJDRV9DT05URU5UID0gInByb3BTb3VyY2VDb250ZW50IjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQUk9QX1NPVVJDRV9DT05URU5UX05BTUVTUEFDRSA9ICJwcm9wU291cmNlQ29udGVudE5TIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9FbmRwb2ludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL0VuZHBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhM2M5MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL0VuZHBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbDsKLQotcHVibGljIGNsYXNzIEVuZHBvaW50Ci17Ci0gIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50OwotICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZUhUVFBCYXNpY0F1dGg7Ci0gIHByaXZhdGUgU3RyaW5nIGh0dHBCYXNpY0F1dGhVc2VybmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotICAKLSAgcHVibGljIEVuZHBvaW50KCkKLSAgewotICAgIGVuZHBvaW50ID0gbnVsbDsKLSAgICByZXF1aXJlSFRUUEJhc2ljQXV0aCA9IGZhbHNlOwotICAgIGh0dHBCYXNpY0F1dGhVc2VybmFtZSA9IG51bGw7Ci0gICAgaHR0cEJhc2ljQXV0aFBhc3N3b3JkID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kcG9pbnQoKQotICB7Ci0gICAgcmV0dXJuIGVuZHBvaW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChTdHJpbmcgZW5kcG9pbnQpCi0gIHsKLSAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZUhUVFBCYXNpY0F1dGgoKQotICB7Ci0gICAgcmV0dXJuIHJlcXVpcmVIVFRQQmFzaWNBdXRoOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlSFRUUEJhc2ljQXV0aChib29sZWFuIHJlcXVpcmVIVFRQQmFzaWNBdXRoKQotICB7Ci0gICAgdGhpcy5yZXF1aXJlSFRUUEJhc2ljQXV0aCA9IHJlcXVpcmVIVFRQQmFzaWNBdXRoOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhVc2VybmFtZSgpCi0gIHsKLSAgICByZXR1cm4gaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUoU3RyaW5nIGh0dHBCYXNpY0F1dGhVc2VybmFtZSkKLSAgewotICAgIHRoaXMuaHR0cEJhc2ljQXV0aFVzZXJuYW1lID0gaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEh0dHBCYXNpY0F1dGhQYXNzd29yZCgpCi0gIHsKLSAgICByZXR1cm4gaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRIdHRwQmFzaWNBdXRoUGFzc3dvcmQoU3RyaW5nIGh0dHBCYXNpY0F1dGhQYXNzd29yZCkKLSAgewotICAgIHRoaXMuaHR0cEJhc2ljQXV0aFBhc3N3b3JkID0gaHR0cEJhc2ljQXV0aFBhc3N3b3JkOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL1dTRExCaW5kaW5nRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL1dTRExCaW5kaW5nRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWJkY2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMQmluZGluZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLio7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLio7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuKjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuKjsKLWltcG9ydCBqYXZheC53c2RsLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFdTRExCaW5kaW5nRWxlbWVudCBleHRlbmRzIFdTRExDb21tb25FbGVtZW50Ci17Ci0gIHByaXZhdGUgaW50IGJpbmRpbmdUeXBlXzsKLSAgcHJpdmF0ZSBCaW5kaW5nIGJpbmRpbmdfOwotICBwcml2YXRlIEV4dGVuc2liaWxpdHlFbGVtZW50IGJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudF87Ci0gIHByaXZhdGUgVmVjdG9yIGVuZFBvaW50c187Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHNldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICBiaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnRfID0gbnVsbDsKLSAgICBiaW5kaW5nVHlwZV8gPSBCaW5kaW5nVHlwZXMuVU5TVVBQT1JURUQ7Ci0gICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSBiaW5kaW5nXy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpLm5leHQoKTsKLSAgICAgIGlmIChlIGluc3RhbmNlb2YgSFRUUEJpbmRpbmcpCi0gICAgICB7Ci0gICAgICAgIEhUVFBCaW5kaW5nIGJpbmRpbmcgPSAoSFRUUEJpbmRpbmcpZTsKLSAgICAgICAgU3RyaW5nIHZlcmIgPSBiaW5kaW5nLmdldFZlcmIoKTsKLSAgICAgICAgaWYgKEJpbmRpbmdUeXBlcy5IVFRQX1ZFUkJfR0VULmVxdWFscyh2ZXJiKSkKLSAgICAgICAgICBiaW5kaW5nVHlwZV8gPSBCaW5kaW5nVHlwZXMuSFRUUF9HRVQ7Ci0gICAgICAgIGVsc2UgaWYgKEJpbmRpbmdUeXBlcy5IVFRQX1ZFUkJfUE9TVC5lcXVhbHModmVyYikpCi0gICAgICAgICAgYmluZGluZ1R5cGVfID0gQmluZGluZ1R5cGVzLkhUVFBfUE9TVDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBTT0FQQmluZGluZykKLSAgICAgICAgYmluZGluZ1R5cGVfID0gQmluZGluZ1R5cGVzLlNPQVA7Ci0gICAgICBpZiAoYmluZGluZ1R5cGVfICE9IEJpbmRpbmdUeXBlcy5VTlNVUFBPUlRFRCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50XyA9IGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExCaW5kaW5nRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgICBzZXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIGVuZFBvaW50c18gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgewotICAgIGJpbmRpbmdfID0gYmluZGluZzsKLSAgICBzZXREb2N1bWVudGF0aW9uKGJpbmRpbmcuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgc2V0QmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZyBnZXRCaW5kaW5nKCkgewotICAgIHJldHVybiBiaW5kaW5nXzsKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGdldEJpbmRpbmdFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50XzsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRCaW5kaW5nVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ1R5cGVfOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlc2V0RW5kUG9pbnRzKCkKLSAgewotICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpZ2V0UGFyZW50RWxlbWVudCgpOwotICAgIFN0cmluZyBmaXhlZEVuZHBvaW50U3RyaW5nID0gc2VydmljZUVsZW1lbnQuZ2V0QWRkcmVzc0xvY2F0aW9uKGJpbmRpbmdfKTsKLSAgICBFbmRwb2ludCBmaXhlZEVuZHBvaW50ID0gZ2V0RW5kcG9pbnQoZml4ZWRFbmRwb2ludFN0cmluZyk7Ci0gICAgaWYgKGZpeGVkRW5kcG9pbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmaXhlZEVuZHBvaW50ID0gbmV3IEVuZHBvaW50KCk7Ci0gICAgICBmaXhlZEVuZHBvaW50LnNldEVuZHBvaW50KGZpeGVkRW5kcG9pbnRTdHJpbmcpOwotICAgIH0KLSAgICBlbmRQb2ludHNfLmNsZWFyKCk7Ci0gICAgZW5kUG9pbnRzXy5hZGQoZml4ZWRFbmRwb2ludCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RW5kUG9pbnRzKCkKLSAgewotICAgIFN0cmluZ1tdIGVuZFBvaW50cyA9IG5ldyBTdHJpbmdbZW5kUG9pbnRzXy5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5kUG9pbnRzLmxlbmd0aDsgaSsrKQotICAgICAgZW5kUG9pbnRzW2ldID0gKChFbmRwb2ludCllbmRQb2ludHNfLmdldChpKSkuZ2V0RW5kcG9pbnQoKTsKLSAgICByZXR1cm4gZW5kUG9pbnRzOwotICB9Ci0gIAotICBwdWJsaWMgRW5kcG9pbnQgZ2V0RW5kcG9pbnQoU3RyaW5nIGVuZHBvaW50U3RyaW5nKQotICB7Ci0gICAgaWYgKGVuZHBvaW50U3RyaW5nICE9IG51bGwgJiYgZW5kcG9pbnRTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBlbmRQb2ludHNfLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEVuZHBvaW50IGVuZHBvaW50ID0gKEVuZHBvaW50KWl0Lm5leHQoKTsKLSAgICAgICAgaWYgKGVuZHBvaW50U3RyaW5nLmVxdWFscyhlbmRwb2ludC5nZXRFbmRwb2ludCgpKSkKLSAgICAgICAgICByZXR1cm4gZW5kcG9pbnQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW5kUG9pbnRzKFN0cmluZ1tdIGVuZHBvaW50cykKLSAgewotICAgIFZlY3RvciBlbmRwb2ludFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZHBvaW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBFbmRwb2ludCBlbmRwb2ludCA9IGdldEVuZHBvaW50KGVuZHBvaW50c1tpXSk7Ci0gICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZW5kcG9pbnQgPSBuZXcgRW5kcG9pbnQoKTsKLSAgICAgICAgZW5kcG9pbnQuc2V0RW5kcG9pbnQoZW5kcG9pbnRzW2ldKTsKLSAgICAgIH0KLSAgICAgIGVuZHBvaW50VmVjdG9yLmFkZChlbmRwb2ludCk7Ci0gICAgfQotICAgIHJlc2V0RW5kUG9pbnRzKCk7Ci0gICAgZW5kUG9pbnRzXy5hZGRBbGwoZW5kcG9pbnRWZWN0b3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRW5kUG9pbnQoU3RyaW5nIGVuZHBvaW50U3RyaW5nKQotICB7Ci0gICAgaWYgKGVuZHBvaW50U3RyaW5nICE9IG51bGwgJiYgZW5kcG9pbnRTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIEVuZHBvaW50IGVuZHBvaW50ID0gbmV3IEVuZHBvaW50KCk7Ci0gICAgICBlbmRwb2ludC5zZXRFbmRwb2ludChlbmRwb2ludFN0cmluZyk7Ci0gICAgICBlbmRQb2ludHNfLmFkZChlbmRwb2ludCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRW5kUG9pbnQoU3RyaW5nIGVuZHBvaW50U3RyaW5nKQotICB7Ci0gICAgaWYgKGVuZHBvaW50U3RyaW5nICE9IG51bGwgJiYgZW5kcG9pbnRTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgU3RyaW5nIGZpeGVkRW5kcG9pbnRTdHJpbmcgPSBzZXJ2aWNlRWxlbWVudC5nZXRBZGRyZXNzTG9jYXRpb24oYmluZGluZ18pOwotICAgICAgaWYgKGZpeGVkRW5kcG9pbnRTdHJpbmcgPT0gbnVsbCB8fCAhZml4ZWRFbmRwb2ludFN0cmluZy5lcXVhbHMoZW5kcG9pbnRTdHJpbmcpKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZFBvaW50c18uc2l6ZSgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZW5kcG9pbnRTdHJpbmcuZXF1YWxzKCgoRW5kcG9pbnQpZW5kUG9pbnRzXy5nZXQoaSkpLmdldEVuZHBvaW50KCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuZFBvaW50c18ucmVtb3ZlKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYnVpbGRNb2RlbCgpIHsKLSAgICByZXNldEVuZFBvaW50cygpOwotICAgIGlmIChiaW5kaW5nXyAhPSBudWxsKSB7Ci0gICAgICBQb3J0VHlwZSBwdCA9IGJpbmRpbmdfLmdldFBvcnRUeXBlKCk7Ci0gICAgICBpZiAocHQgIT0gbnVsbCkgewotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwdC5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIEhhc2hNYXAgb3BlcmF0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykgewotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKWl0Lm5leHQoKTsKLSAgICAgICAgICBvcGVyYXRpb25zTWFwLnB1dChjcmVhdGVPcGVyYXRpb25VbmlxdWVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETE9wZXJhdGlvbkVsZW1lbnRbXSB3c2RsT3BlcmF0aW9uRWxlbWVudHMgPSBuZXcgV1NETE9wZXJhdGlvbkVsZW1lbnRbZ2V0TnVtYmVyT2ZFbGVtZW50cyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfT1BFUkFUSU9OKV07Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfT1BFUkFUSU9OKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsT3BlcmF0aW9uRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICB3c2RsT3BlcmF0aW9uRWxlbWVudHNbaV0gPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgd3NkbE9wZXJhdGlvbkVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBjcmVhdGVPcGVyYXRpb25VbmlxdWVOYW1lKHdzZGxPcGVyYXRpb25FbGVtZW50c1tqXS5nZXRPcGVyYXRpb24oKSk7Ci0gICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pb3BlcmF0aW9uc01hcC5nZXQob3BlcmF0aW9uTmFtZSk7Ci0gICAgICAgICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvcGVyYXRpb25zTWFwLnJlbW92ZShvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgICAgIHdzZGxPcGVyYXRpb25FbGVtZW50c1tqXS5zZXRPcGVyYXRpb24odGhpcywgb3BlcmF0aW9uKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZGlzY29ubmVjdCh3c2RsT3BlcmF0aW9uRWxlbWVudHNbal0sIFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9PUEVSQVRJT04pOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBvcGVyYXRpb25zTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykgewotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyID0gKE9wZXJhdGlvbilpdC5uZXh0KCk7Ci0gICAgICAgICAgV1NETE9wZXJhdGlvbkVsZW1lbnQgd3NkbE9wZXJhdGlvbkVsZW1lbnQgPSBuZXcgV1NETE9wZXJhdGlvbkVsZW1lbnQob3Blci5nZXROYW1lKCksIHRoaXMsIG9wZXIpOwotICAgICAgICAgIGNvbm5lY3Qod3NkbE9wZXJhdGlvbkVsZW1lbnQsV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX09QRVJBVElPTixNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlT3BlcmF0aW9uVW5pcXVlTmFtZShPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIG5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgbmFtZS5hcHBlbmQob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgSW5wdXQgaW5wdXRNc2cgPSBvcGVyYXRpb24uZ2V0SW5wdXQoKTsKLSAgICBpZiAoaW5wdXRNc2cgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBRTmFtZSBxbmFtZSA9IGlucHV0TXNnLmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpOwotICAgICAgbmFtZS5hcHBlbmQocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgbmFtZS5hcHBlbmQoIjoiKTsKLSAgICAgIG5hbWUuYXBwZW5kKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gICAgT3V0cHV0IG91dHB1dE1zZyA9IG9wZXJhdGlvbi5nZXRPdXRwdXQoKTsKLSAgICBpZiAob3V0cHV0TXNnICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgcW5hbWUgPSBvdXRwdXRNc2cuZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCk7Ci0gICAgICBuYW1lLmFwcGVuZChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBuYW1lLmFwcGVuZCgiOiIpOwotICAgICAgbmFtZS5hcHBlbmQocW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETENvbW1vbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMQ29tbW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDE2NDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMQ29tbW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQ29tbW9uRWxlbWVudCBleHRlbmRzIFRyZWVFbGVtZW50Ci17Ci0KLSAgcHVibGljIFdTRExDb21tb25FbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCkgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBUcmVlRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KCkgewotICAgICAgcmV0dXJuIChUcmVlRWxlbWVudClnZXRFbGVtZW50cyhNb2RlbENvbnN0YW50cy5SRUxfT1dORVIpLm5leHRFbGVtZW50KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldERvY3VtZW50YXRpb24oTm9kZSBkb2N1bWVudGF0aW9uRWxlbWVudCkKLSAgewotICAgIFN0cmluZyBkb2N1bWVudGF0aW9uID0gIiI7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLmNyZWF0ZU5ld0RvY3VtZW50KG51bGwpOwotICAgICAgICBEb2N1bWVudEZyYWdtZW50IGRmID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLSAgICAgICAgTm9kZUxpc3QgZG9jdW1lbnRhdGlvbk5vZGVzID0gZG9jdW1lbnRhdGlvbkVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpPTA7aTxkb2N1bWVudGF0aW9uTm9kZXMuZ2V0TGVuZ3RoKCk7aSsrKQotICAgICAgICAgIGRmLmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKGRvY3VtZW50YXRpb25Ob2Rlcy5pdGVtKGkpLHRydWUpKTsKLSAgICAgICAgZG9jdW1lbnRhdGlvbiA9IFhNTFV0aWxzLnNlcmlhbGl6ZShkZix0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHNldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfRE9DVU1FTlRBVElPTixkb2N1bWVudGF0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL1dTRExFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3ZGRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy4qOwotaW1wb3J0IGphdmF4LndzZGwuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRWxlbWVudCBleHRlbmRzIFdTRExDb21tb25FbGVtZW50Ci17Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbFVybF87Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uXzsKLSAgcHJpdmF0ZSBWZWN0b3Igc2NoZW1hTGlzdF87Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIHczU2NoZW1hUU5hbWVMaXN0XzsKLSAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGNvbnN0YW50U2NoZW1hTGlzdF87Ci0KLSAgc3RhdGljCi0gIHsKLSAgICAvLyB3MyBzY2hlbWEgVVJJIGxpc3Q6Ci0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYQotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnLzE5OTkvWE1MU2NoZW1hCi0gICAgdzNTY2hlbWFRTmFtZUxpc3RfID0gbmV3IFZlY3RvcigpOwotICAgIHczU2NoZW1hUU5hbWVMaXN0Xy5hZGRFbGVtZW50KG5ldyBRTmFtZShGcmFnbWVudENvbnN0YW50cy5OU19VUklfQ1VSUkVOVF9TQ0hFTUFfWFNELCJzY2hlbWEiKSk7Ci0gICAgdzNTY2hlbWFRTmFtZUxpc3RfLmFkZEVsZW1lbnQobmV3IFFOYW1lKEZyYWdtZW50Q29uc3RhbnRzLk5TX1VSSV8yMDAwX1NDSEVNQV9YU0QsInNjaGVtYSIpKTsKLSAgICB3M1NjaGVtYVFOYW1lTGlzdF8uYWRkRWxlbWVudChuZXcgUU5hbWUoRnJhZ21lbnRDb25zdGFudHMuTlNfVVJJXzE5OTlfU0NIRU1BX1hTRCwic2NoZW1hIikpOwotCi0gICAgLy8gQ29uc3RhbnQgc2NoZW1hIFVSSSBsaXN0OgotICAgIC8vIGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hCi0gICAgLy8gaHR0cDovL3d3dy53My5vcmcvMjAwMC8xMC9YTUxTY2hlbWEKLSAgICAvLyBodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYQotICAgIC8vIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvCi0gICAgLy8gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8KLSAgICBjb25zdGFudFNjaGVtYUxpc3RfID0gbmV3IFZlY3RvcigpOwotICAgIGNvbnN0YW50U2NoZW1hTGlzdF8uYWRkRWxlbWVudChYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShGcmFnbWVudENvbnN0YW50cy5OU19VUklfQ1VSUkVOVF9TQ0hFTUFfWFNEKSk7Ci0gICAgY29uc3RhbnRTY2hlbWFMaXN0Xy5hZGRFbGVtZW50KFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKEZyYWdtZW50Q29uc3RhbnRzLk5TX1VSSV8yMDAwX1NDSEVNQV9YU0QpKTsKLSAgICBjb25zdGFudFNjaGVtYUxpc3RfLmFkZEVsZW1lbnQoWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoRnJhZ21lbnRDb25zdGFudHMuTlNfVVJJXzE5OTlfU0NIRU1BX1hTRCkpOwotICAgIGNvbnN0YW50U2NoZW1hTGlzdF8uYWRkRWxlbWVudChYU0RTY2hlbWFJbXBsLmdldFNjaGVtYUZvclNjaGVtYShGcmFnbWVudENvbnN0YW50cy5OU19VUklfU09BUF9FTkMpKTsKLSAgICBjb25zdGFudFNjaGVtYUxpc3RfLmFkZEVsZW1lbnQoWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoRnJhZ21lbnRDb25zdGFudHMuVVJJX1dTREwpKTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFN0cmluZyB3c2RsVXJsKQotICB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIHdzZGxVcmxfID0gd3NkbFVybDsKLSAgICBkZWZpbml0aW9uXyA9IG51bGw7Ci0gICAgc2NoZW1hTGlzdF8gPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXc2RsVXJsKFN0cmluZyB3c2RsVXJsKSB7Ci0gICAgd3NkbFVybF8gPSB3c2RsVXJsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXc2RsVXJsKCkgewotICAgIHJldHVybiB3c2RsVXJsXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYUxpc3QoVmVjdG9yIHNjaGVtYUxpc3QpCi0gIHsKLSAgICBzY2hlbWFMaXN0XyA9IHNjaGVtYUxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgVmVjdG9yIGdldFNjaGVtYUxpc3QoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYUxpc3RfOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIERlZmluaXRpb24gbG9hZFdTREwoU3RyaW5nIHdzZGxVUkwpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBXZWJTZXJ2aWNlc1BhcnNlciBwYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXJFeHQoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFyc2VyLmdldFdTRExEZWZpbml0aW9uVmVyYm9zZSh3c2RsVVJMKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gd3NkbGUpCi0gICAgewotICAgICAgdGhyb3cgd3NkbGU7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SICwgdC5nZXRNZXNzYWdlKCksIHQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBWZWN0b3IgbG9hZFdTREwoKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgVmVjdG9yIGVycm9yTWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZGVmaW5pdGlvbl8gPSBsb2FkV1NETCh3c2RsVXJsXyk7Ci0gICAgaWYgKGRlZmluaXRpb25fICE9IG51bGwpCi0gICAgewotICAgICAgc2V0RG9jdW1lbnRhdGlvbihkZWZpbml0aW9uXy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgIGdhdGhlclNjaGVtYXMoZGVmaW5pdGlvbl8sIHdzZGxVcmxfKTsKLSAgICAgIC8vIFZhbGlkYXRlIHRoZSBzY2hlbWFzLgotICAgICAgZm9yIChpbnQgaT0wO2k8c2NoZW1hTGlzdF8uc2l6ZSgpO2krKykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpc2NoZW1hTGlzdF8uZWxlbWVudEF0KGkpOwotICAgICAgICB4c2RTY2hlbWEudmFsaWRhdGUoKTsKLSAgICAgICAgRUxpc3QgZXJyb3JzID0geHNkU2NoZW1hLmdldEFsbERpYWdub3N0aWNzKCk7Ci0gICAgICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoTGlzdEl0ZXJhdG9yIGxpID0gZXJyb3JzLmxpc3RJdGVyYXRvcigpO2xpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNERGlhZ25vc3RpYyB4ZCA9IChYU0REaWFnbm9zdGljKWxpLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSB4ZC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAvLyBkbyBub3QgcmVwb3J0IGxvdyBzZXZlcml0eSBkaWFnbm9zdGljcyBvciBlcnJvbmVvdXMgYXJyYXkgcmVmZXJlbmNlIGVycm9ycy4KLSAgICAgICAgICAgIGlmICh4ZC5nZXRTZXZlcml0eSgpLmdldFZhbHVlKCkgPT0gWFNERGlhZ25vc3RpY1NldmVyaXR5LkZBVEFMX0xJVEVSQUwuZ2V0VmFsdWUoKSB8fCAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCAmJiBtc2cudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIjYXJyYXkiKSAhPSAtMSkpCi0gICAgICAgICAgICAgIGxpLnJlbW92ZSgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2VzLmFkZEVsZW1lbnQoeGQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaT0wO2k8Y29uc3RhbnRTY2hlbWFMaXN0Xy5zaXplKCk7aSsrKQotICAgICAgICBzY2hlbWFMaXN0Xy5hZGRFbGVtZW50KGNvbnN0YW50U2NoZW1hTGlzdF8uZWxlbWVudEF0KGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yTWVzc2FnZXM7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgZ2F0aGVyU2NoZW1hcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBkZWZpbml0aW9uVVJMKQotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSBkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBleHRUeXBlcyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgaWYgKGV4dFR5cGVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPGV4dFR5cGVzLnNpemUoKTtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gZXh0VHlwZXMuZ2V0KGkpOwotICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KW9iajsKLSAgICAgICAgICAgIGlmIChpc1czU2NoZW1hRWxlbWVudFR5cGUoc2NoZW1hRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuY3JlYXRlU2NoZW1hKHNjaGVtYUVsZW1lbnQuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgc2NoZW1hTGlzdF8uYWRkRWxlbWVudCh4c2RTY2hlbWEpOwotICAgICAgICAgICAgICBnYXRoZXJTY2hlbWFEaXJlY3RpdmUoeHNkU2NoZW1hLCBkZWZpbml0aW9uVVJMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBzY2hlbWFFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbClvYmo7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoc2NoZW1hRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgc2NoZW1hTGlzdF8uYWRkRWxlbWVudCh4c2RTY2hlbWEpOwotICAgICAgICAgICAgZ2F0aGVyU2NoZW1hRGlyZWN0aXZlKHhzZFNjaGVtYSwgZGVmaW5pdGlvblVSTCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIE1hcCBpbXBvcnRzID0gZGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7Ci0gICAgaWYgKGltcG9ydHMgIT0gbnVsbCkKLSAgICAgIGdhdGhlckltcG9ydGVkU2NoZW1hcyhkZWZpbml0aW9uLGltcG9ydHMpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGdhdGhlclNjaGVtYURpcmVjdGl2ZShYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgeHNkU2NoZW1hVVJMKQotICB7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIEVMaXN0IHhzZFNjaGVtYUNvbnRlbnRzID0geHNkU2NoZW1hLmdldENvbnRlbnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0geHNkU2NoZW1hQ29udGVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGNvbnRlbnQgPSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hRGlyZWN0aXZlKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRGlyZWN0aXZlIHhzZFNjaGVtYURpcmVjdGl2ZSA9IChYU0RTY2hlbWFEaXJlY3RpdmUpY29udGVudDsKLSAgICAgICAgICBTdHJpbmdCdWZmZXIgeHNkU2NoZW1hRGlyZWN0aXZlVVJMID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgIFN0cmluZyB4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbiA9IHhzZFNjaGVtYURpcmVjdGl2ZS5nZXRTY2hlbWFMb2NhdGlvbigpOwotICAgICAgICAgIGlmICh4c2RTY2hlbWFEaXJlY3RpdmVMb2NhdGlvbiAhPSBudWxsICYmIHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uLmluZGV4T2YoJzonKSA9PSAtMSAmJiB4c2RTY2hlbWFVUkwgIT0gbnVsbCAmJiB4c2RTY2hlbWFVUkwuaW5kZXhPZignOicpICE9IC0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHJlbGF0aXZlIFVSTAotICAgICAgICAgICAgaW50IGluZGV4ID0geHNkU2NoZW1hVVJMLmxhc3RJbmRleE9mKCcvJyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgICAgIHhzZFNjaGVtYURpcmVjdGl2ZVVSTC5hcHBlbmQoeHNkU2NoZW1hVVJMLnN1YnN0cmluZygwLCBpbmRleCsxKSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzZFNjaGVtYURpcmVjdGl2ZVVSTC5hcHBlbmQoeHNkU2NoZW1hVVJMKTsKLSAgICAgICAgICAgICAgeHNkU2NoZW1hRGlyZWN0aXZlVVJMLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB4c2RTY2hlbWFEaXJlY3RpdmVVUkwuYXBwZW5kKHhzZFNjaGVtYURpcmVjdGl2ZUxvY2F0aW9uKTsKLSAgICAgICAgICAvLyByZXNvbHZlIHNjaGVtYSBkaXJlY3RpdmUKLSAgICAgICAgICBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSB4c2RTY2hlbWFEaXJlY3RpdmUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLSAgICAgICAgICBpZiAocmVzb2x2ZWRTY2hlbWEgPT0gbnVsbCAmJiB4c2RTY2hlbWFEaXJlY3RpdmVVUkwubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgcmVzb2x2ZWRTY2hlbWEgPSBnZXRTY2hlbWEoeHNkU2NoZW1hRGlyZWN0aXZlVVJMLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGlmIChyZXNvbHZlZFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNjaGVtYUxpc3RfLmFkZEVsZW1lbnQocmVzb2x2ZWRTY2hlbWEpOwotICAgICAgICAgICAgZ2F0aGVyU2NoZW1hRGlyZWN0aXZlKHJlc29sdmVkU2NoZW1hLCB4c2RTY2hlbWFEaXJlY3RpdmVVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzVzNTY2hlbWFFbGVtZW50VHlwZShRTmFtZSBxbmFtZSkKLSAgewotICAgIGZvciAoaW50IGk9MDtpPHczU2NoZW1hUU5hbWVMaXN0Xy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIFFOYW1lIHczU2NoZW1hUU5hbWUgPSAoUU5hbWUpdzNTY2hlbWFRTmFtZUxpc3RfLmVsZW1lbnRBdChpKTsKLSAgICAgIGlmICh3M1NjaGVtYVFOYW1lLmVxdWFscyhxbmFtZSkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIHZvaWQgZ2F0aGVySW1wb3J0ZWRTY2hlbWFzKERlZmluaXRpb24gZGVmaW5pdGlvbixNYXAgaW1wb3J0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpbXBvcnRzLmtleVNldCgpLml0ZXJhdG9yKCk7aXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBMaXN0IGltcG9ydExpc3QgPSAoTGlzdClpbXBvcnRzLmdldChpdGVyYXRvci5uZXh0KCkpOwotICAgICAgZm9yIChpbnQgaT0wO2k8aW1wb3J0TGlzdC5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICBJbXBvcnQgaW1wID0gKEltcG9ydClpbXBvcnRMaXN0LmdldChpKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGxvY1VSSSA9IG5ldyBTdHJpbmdCdWZmZXIoaW1wLmdldExvY2F0aW9uVVJJKCkpOwotICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVVSTChsb2NVUkkudG9TdHJpbmcoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYmFzZSA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgICAgICAgbG9jVVJJLmluc2VydCgwLGJhc2Uuc3Vic3RyaW5nKDAsYmFzZS5sYXN0SW5kZXhPZignLycpKzEpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0RGVmID0gbG9hZFdTREwobG9jVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGdhdGhlclNjaGVtYXMoaW1wb3J0RGVmLCBsb2NVUkkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIE1heSBiZSBhbiBYU0QgZmlsZS4KLSAgICAgICAgICBnYXRoZXJTY2hlbWEobG9jVVJJLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIGdhdGhlclNjaGVtYShTdHJpbmcgbG9jVVJJKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IGdldFNjaGVtYShsb2NVUkkpOwotICAgIGlmICh4c2RTY2hlbWEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzY2hlbWFMaXN0Xy5hZGRFbGVtZW50KHhzZFNjaGVtYSk7Ci0gICAgICBnYXRoZXJTY2hlbWFEaXJlY3RpdmUoeHNkU2NoZW1hLCBsb2NVUkkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgZmluYWwgWFNEU2NoZW1hIGdldFNjaGVtYShTdHJpbmcgbG9jVVJJKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKGxvY1VSSSk7Ci0gICAgaWYgKHhzZFNjaGVtYSA9PSBudWxsKQotICAgIHsKLSAgICAgIFhTRFBhcnNlciBwID0gbmV3IFhTRFBhcnNlcigpOwotICAgICAgSW5wdXRTdHJlYW0gaXMgPSBOZXRVdGlscy5nZXRVUkxJbnB1dFN0cmVhbShsb2NVUkkpOwotICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHAucGFyc2UoaXMpOwotICAgICAgICB4c2RTY2hlbWEgPSBwLmdldFNjaGVtYSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4geHNkU2NoZW1hOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBkZWZpbml0aW9uXyA9IGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJ1aWxkTW9kZWwoKSB7Ci0gICAgaWYgKGRlZmluaXRpb25fICE9IG51bGwpIHsKLSAgICAgIE1hcCBzZXJ2aWNlcyA9IG5ldyBIYXNoTWFwKGRlZmluaXRpb25fLmdldFNlcnZpY2VzKCkpOwotICAgICAgV1NETFNlcnZpY2VFbGVtZW50W10gd3NkbFNlcnZpY2VFbGVtZW50cyA9IG5ldyBXU0RMU2VydmljZUVsZW1lbnRbZ2V0TnVtYmVyT2ZFbGVtZW50cyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRSldOwotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbFNlcnZpY2VFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICB3c2RsU2VydmljZUVsZW1lbnRzW2ldID0gKFdTRExTZXJ2aWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzZGxTZXJ2aWNlRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSB3c2RsU2VydmljZUVsZW1lbnRzW2pdLmdldFNlcnZpY2UoKS5nZXRRTmFtZSgpOwotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlzZXJ2aWNlcy5nZXQocW5hbWUpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgc2VydmljZXMucmVtb3ZlKHFuYW1lKTsKLSAgICAgICAgICB3c2RsU2VydmljZUVsZW1lbnRzW2pdLnNldFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgICAgd3NkbFNlcnZpY2VFbGVtZW50c1tqXS5idWlsZE1vZGVsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpc2Nvbm5lY3Qod3NkbFNlcnZpY2VFbGVtZW50c1tqXSwgV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0UpOwotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykgewotICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSlpdC5uZXh0KCk7Ci0gICAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCB3c2RsU2VydmljZUVsZW1lbnQgPSBuZXcgV1NETFNlcnZpY2VFbGVtZW50KHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgZ2V0TW9kZWwoKSwgc2VydmljZSk7Ci0gICAgICAgIGNvbm5lY3Qod3NkbFNlcnZpY2VFbGVtZW50LFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFLE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgICAgIHdzZGxTZXJ2aWNlRWxlbWVudC5idWlsZE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETE9wZXJhdGlvbkVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMT3BlcmF0aW9uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWExMDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2RhdGFtb2RlbC9XU0RMT3BlcmF0aW9uRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuKjsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLio7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLio7Ci1pbXBvcnQgamF2YXgud3NkbC4qOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMT3BlcmF0aW9uRWxlbWVudCBleHRlbmRzIFdTRExDb21tb25FbGVtZW50Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9UWVBFX1NPQVAgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUEVSQVRJT05fVFlQRV9IVFRQX0dFVCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTl9UWVBFX0hUVFBfUE9TVCA9IDI7Ci0KLSAgcHJpdmF0ZSBpbnQgb3BlcmF0aW9uVHlwZV87Ci0gIHByaXZhdGUgT3BlcmF0aW9uIG9wZXJhdGlvbl87Ci0gIHByaXZhdGUgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIHdzZGxQYXJ0c1RvWHNkVHlwZU1hcHBlcl87Ci0gIHByaXZhdGUgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgZnJhZ0NvbnRyb2xsZXJfOwotICBwcml2YXRlIGJvb2xlYW4gaXNEb2N1bWVudFN0eWxlXzsKLSAgcHJpdmF0ZSBib29sZWFuIGlzVXNlTGl0ZXJhbF87Ci0gIHByaXZhdGUgU3RyaW5nIHNvYXBBY3Rpb25fOwotICBwcml2YXRlIFN0cmluZyBlbmNvZGluZ1N0eWxlXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RpbmdOYW1lc3BhY2VfOwotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBnYXRoZXJTb2FwSW5mb3JtYXRpb24oV1NETEJpbmRpbmdFbGVtZW50IGJpbmRpbmdFbGVtZW50LFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nKQotICB7Ci0gICAgLy8gSW5pdGlhbGl6ZSBkZWZhdWx0cy4KLSAgICBpc0RvY3VtZW50U3R5bGVfID0gdHJ1ZTsKLSAgICBzb2FwQWN0aW9uXyA9ICIiOwotICAgIGlzVXNlTGl0ZXJhbF8gPSB0cnVlOwotICAgIGVuY29kaW5nU3R5bGVfID0gbnVsbDsKLSAgICBlbmNvZGluZ05hbWVzcGFjZV8gPSBudWxsOwotCi0gICAgQmluZGluZyBiaW5kaW5nID0gYmluZGluZ0VsZW1lbnQuZ2V0QmluZGluZygpOwotICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKQotICAgICAgaXNEb2N1bWVudFN0eWxlXyA9ICJkb2N1bWVudCIuZXF1YWxzKHNvYXBCaW5kaW5nLmdldFN0eWxlKCkpOwotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ0VsZW1lbnQpOwotICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IG51bGw7Ci0gICAgU3RyaW5nIHNvYXBBY3Rpb24gPSAiIjsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7aS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaS5uZXh0KCk7Ci0gICAgICBpZiAoZSBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIHNvYXBPcGVyYXRpb24gPSAoU09BUE9wZXJhdGlvbillOwotICAgICAgICBzb2FwQWN0aW9uXyA9IHNvYXBPcGVyYXRpb24uZ2V0U29hcEFjdGlvblVSSSgpOwotICAgICAgICBTdHJpbmcgc3R5bGUgPSBzb2FwT3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsKQotICAgICAgICAgIGlzRG9jdW1lbnRTdHlsZV8gPSBzdHlsZS5lcXVhbHMoImRvY3VtZW50Iik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBiaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTtpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClpLm5leHQoKTsKLSAgICAgIGlmIChlIGluc3RhbmNlb2YgU09BUEJvZHkpCi0gICAgICB7Ci0gICAgICAgIHNvYXBCb2R5ID0gKFNPQVBCb2R5KWU7Ci0gICAgICAgIGlzVXNlTGl0ZXJhbF8gPSAibGl0ZXJhbCIuZXF1YWxzKHNvYXBCb2R5LmdldFVzZSgpKTsKLSAgICAgICAgaWYgKCFpc1VzZUxpdGVyYWxfKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRW5jb2RlZC4KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzb2FwQm9keS5nZXRFbmNvZGluZ1N0eWxlcygpLml0ZXJhdG9yKCk7ai5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kaW5nU3R5bGVfID0gKFN0cmluZylqLm5leHQoKTsKLSAgICAgICAgICAgIGVuY29kaW5nTmFtZXNwYWNlXyA9IHNvYXBCb2R5LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBXU0RMT3BlcmF0aW9uRWxlbWVudChTdHJpbmcgbmFtZSxXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQsT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIHN1cGVyKG5hbWUsIGJpbmRpbmdFbGVtZW50LmdldE1vZGVsKCkpOwotICAgIC8vIFNldCB0aGUgZGVmYXVsdCBvcGVyYXRpb24gdHlwZSB0byBiZSBTT0FQLgotICAgIHNldE9wZXJhdGlvbihiaW5kaW5nRWxlbWVudCxvcGVyYXRpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3BlcmF0aW9uKFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCxPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0gICAgb3BlcmF0aW9uXyA9IG9wZXJhdGlvbjsKLSAgICBzZXREb2N1bWVudGF0aW9uKG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBmcmFnQ29udHJvbGxlcl8gPSBudWxsOwotICAgIHdzZGxQYXJ0c1RvWHNkVHlwZU1hcHBlcl8gPSBudWxsOwotICAgIG9wZXJhdGlvblR5cGVfID0gYmluZGluZ0VsZW1lbnQuZ2V0QmluZGluZ1R5cGUoKTsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBiaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBiaW5kaW5nRWxlbWVudC5nZXRCaW5kaW5nRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICBzd2l0Y2ggKG9wZXJhdGlvblR5cGVfKQotICAgIHsKLSAgICAgIGNhc2UgQmluZGluZ1R5cGVzLlNPQVA6Ci0gICAgICAgIGdhdGhlclNvYXBJbmZvcm1hdGlvbihiaW5kaW5nRWxlbWVudCwoU09BUEJpbmRpbmcpYmluZGluZ0V4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgIGNhc2UgQmluZGluZ1R5cGVzLkhUVFBfR0VUOgotICAgICAgY2FzZSBCaW5kaW5nVHlwZXMuSFRUUF9QT1NUOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbl87Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRCaW5kaW5nT3BlcmF0aW9uKChXU0RMQmluZGluZ0VsZW1lbnQpZ2V0UGFyZW50RWxlbWVudCgpKTsKLSAgfQotCi0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCkKLSAgewotICAgIEJpbmRpbmcgYmluZGluZyA9IGJpbmRpbmdFbGVtZW50LmdldEJpbmRpbmcoKTsKLSAgICBTdHJpbmcgb3BlcmF0aW9uSW5wdXROYW1lID0gbnVsbDsKLSAgICBTdHJpbmcgb3BlcmF0aW9uT3V0cHV0TmFtZSA9IG51bGw7Ci0gICAgSW5wdXQgb3BlcmF0aW9uSW5wdXQgPSBvcGVyYXRpb25fLmdldElucHV0KCk7Ci0gICAgT3V0cHV0IG9wZXJhdGlvbk91dHB1dCA9IG9wZXJhdGlvbl8uZ2V0T3V0cHV0KCk7Ci0gICAgaWYgKG9wZXJhdGlvbklucHV0ICE9IG51bGwpCi0gICAgICBvcGVyYXRpb25JbnB1dE5hbWUgPSBvcGVyYXRpb25JbnB1dC5nZXROYW1lKCk7Ci0gICAgaWYgKG9wZXJhdGlvbk91dHB1dCAhPSBudWxsKQotICAgICAgb3BlcmF0aW9uT3V0cHV0TmFtZSA9IG9wZXJhdGlvbk91dHB1dC5nZXROYW1lKCk7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbl8uZ2V0TmFtZSgpLG9wZXJhdGlvbklucHV0TmFtZSxvcGVyYXRpb25PdXRwdXROYW1lKTsKLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgYmluZGluZ09wZXJhdGlvbiA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbihvcGVyYXRpb25fLmdldE5hbWUoKSxudWxsLG51bGwpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0T3JkZXJlZEJvZHlQYXJ0cygpCi0gIHsKLSAgICBMaXN0IHBhcnRzID0gbmV3IFZlY3RvcihvcGVyYXRpb25fLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpLmdldE9yZGVyZWRQYXJ0cyhvcGVyYXRpb25fLmdldFBhcmFtZXRlck9yZGVyaW5nKCkpKTsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBnZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXQubmV4dCgpOwotICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgIHsKLSAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSAoU09BUEJvZHkpZTsKLSAgICAgICAgTGlzdCBib2R5UGFydHMgPSBzb2FwQm9keS5nZXRQYXJ0cygpOwotICAgICAgICBpZiAoYm9keVBhcnRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KXBhcnRzLmdldChpKTsKLSAgICAgICAgICAgIGlmICghYm9keVBhcnRzLmNvbnRhaW5zKHBhcnQpICYmICFib2R5UGFydHMuY29udGFpbnMocGFydC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXJ0cy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwYXJ0czsKLSAgfQotCi0gIHByaXZhdGUgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgZ2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKSB7Ci0gICAgaWYgKGZyYWdDb250cm9sbGVyXyA9PSBudWxsKSB7Ci0gICAgICBmcmFnQ29udHJvbGxlcl8gPSBuZXcgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKTsKLSAgICAgIGZyYWdDb250cm9sbGVyXy5zZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIod3NkbFBhcnRzVG9Yc2RUeXBlTWFwcGVyXyk7Ci0gICAgfQotICAgIHJldHVybiBmcmFnQ29udHJvbGxlcl87Ci0gIH0KLQotICBwcml2YXRlIFhTRE5hbWVkQ29tcG9uZW50IGdldFNjaGVtYShQYXJ0IHBhcnQsIFN0cmluZyBpZCkgewotICAgIGlmICh3c2RsUGFydHNUb1hzZFR5cGVNYXBwZXJfID09IG51bGwpIHsKLSAgICAgIHdzZGxQYXJ0c1RvWHNkVHlwZU1hcHBlcl8gPSBuZXcgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCk7Ci0gICAgICBXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSAoV1NETEJpbmRpbmdFbGVtZW50KWdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpYmluZGluZ0VsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpc2VydmljZUVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgd3NkbFBhcnRzVG9Yc2RUeXBlTWFwcGVyXy5hZGRTY2hlbWFzKHdzZGxFbGVtZW50LmdldFNjaGVtYUxpc3QoKSk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsUGFydHNUb1hzZFR5cGVNYXBwZXJfLmdldFhTRFR5cGUocGFydCwgaWQpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChQYXJ0IHBhcnQpIHsKLSAgICByZXR1cm4gZ2V0RnJhZ21lbnQocGFydCwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldEZyYWdtZW50KFBhcnQgcGFydCwgYm9vbGVhbiBpc0lucHV0KSB7Ci0gICAgU3RyaW5nQnVmZmVyIGlkID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChpc0lucHV0KQotICAgICAgaWQuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLklOUFVUX0lEKTsKLSAgICBlbHNlCi0gICAgICBpZC5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuT1VUUFVUX0lEKTsKLSAgICBTdHJpbmcgcGFydE5hbWUgPSBwYXJ0LmdldE5hbWUoKTsKLSAgICBpZC5hcHBlbmQocGFydE5hbWUpOwotICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIGNvbmZpZy5zZXRJc1dTRExQYXJ0KHRydWUpOwotICAgIGNvbmZpZy5zZXRXU0RMUGFydE5hbWUocGFydE5hbWUpOwotICAgIGNvbmZpZy5zZXRYU0RDb21wb25lbnQoZ2V0U2NoZW1hKHBhcnQsIGlkLnRvU3RyaW5nKCkpKTsKLSAgICBpZiAoaXNEb2N1bWVudFN0eWxlKCkpCi0gICAgICBjb25maWcuc2V0U3R5bGUoRnJhZ21lbnRDb25zdGFudHMuU1RZTEVfRE9DVU1FTlQpOwotICAgIGVsc2UKLSAgICAgIGNvbmZpZy5zZXRTdHlsZShGcmFnbWVudENvbnN0YW50cy5TVFlMRV9SUEMpOwotICAgIGlmIChvcGVyYXRpb25UeXBlXyA9PSBCaW5kaW5nVHlwZXMuU09BUCkKLSAgICB7Ci0gICAgICBpZiAoIWlzVXNlTGl0ZXJhbF8pCi0gICAgICAgIGNvbmZpZy5zZXRQYXJ0RW5jb2RpbmcoRnJhZ21lbnRDb25zdGFudHMuRU5DT0RJTkdfU09BUCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGNvbmZpZy5zZXRQYXJ0RW5jb2RpbmcoRnJhZ21lbnRDb25zdGFudHMuRU5DT0RJTkdfVVJMKTsKLSAgICBJWFNERnJhZ21lbnQgZnJhZ21lbnQgPSBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldEZyYWdtZW50KGNvbmZpZywgaWQudG9TdHJpbmcoKSwgcGFydC5nZXROYW1lKCkpOwotICAgIHJldHVybiBmcmFnbWVudDsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnQgZ2V0RnJhZ21lbnRCeUlEKFN0cmluZyBpZCkgewotICAgIHJldHVybiBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldENhY2hlZEZyYWdtZW50KGlkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUFsbEZyYWdtZW50KCkgewotICAgIGdldFhTRFRvRnJhZ21lbnRDb250cm9sbGVyKCkuZW1wdHlDYWNoZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudFN0eWxlKCkKLSAgewotICAgIHJldHVybiBpc0RvY3VtZW50U3R5bGVfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTb2FwQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBzb2FwQWN0aW9uXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVXNlTGl0ZXJhbCgpCi0gIHsKLSAgICByZXR1cm4gaXNVc2VMaXRlcmFsXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdTdHlsZSgpCi0gIHsKLSAgICByZXR1cm4gZW5jb2RpbmdTdHlsZV87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nTmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiBlbmNvZGluZ05hbWVzcGFjZV87Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE9wZXJhdGlvblR5cGUoKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblR5cGVfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETFNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9kYXRhbW9kZWwvV1NETFNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzA0NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZGF0YW1vZGVsL1dTRExTZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuKjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC4qOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy4qOwotaW1wb3J0IGphdmF4LndzZGwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VFbGVtZW50IGV4dGVuZHMgV1NETENvbW1vbkVsZW1lbnQKLXsKLQotICBwcml2YXRlIFNlcnZpY2Ugc2VydmljZV87Ci0KLSAgcHVibGljIFdTRExTZXJ2aWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsKTsKLSAgICBzZXRTZXJ2aWNlKHNlcnZpY2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgIHNlcnZpY2VfID0gc2VydmljZTsKLSAgICBzZXREb2N1bWVudGF0aW9uKHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgewotICAgIHJldHVybiBzZXJ2aWNlXzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRBZGRyZXNzTG9jYXRpb24oQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgTWFwIHBvcnRzID0gc2VydmljZV8uZ2V0UG9ydHMoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwb3J0cy52YWx1ZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydClpLm5leHQoKTsKLSAgICAgIGlmIChwb3J0LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmVxdWFscyhiaW5kaW5nLmdldFFOYW1lKCkpKQotICAgICAgewotICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGV4dGVuc2liaWxpdHlFbGVtZW50cy5pdGVyYXRvcigpO2ouaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpai5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcyA9IChTT0FQQWRkcmVzcyllbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIHNvYXBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVFRQQWRkcmVzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBIVFRQQWRkcmVzcyBodHRwQWRkcmVzcyA9IChIVFRQQWRkcmVzcyllbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIGh0dHBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYnVpbGRNb2RlbCgpIHsKLSAgICBpZiAoc2VydmljZV8gIT0gbnVsbCkgewotICAgICAgTWFwIHBvcnRzID0gc2VydmljZV8uZ2V0UG9ydHMoKTsKLSAgICAgIE1hcCBiaW5kaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTtpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KWl0Lm5leHQoKTsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nLmdldFBvcnRUeXBlKCkgPT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGJpbmRpbmdzLnB1dChiaW5kaW5nLmdldFFOYW1lKCksIGJpbmRpbmcpOwotICAgICAgfQotICAgICAgV1NETEJpbmRpbmdFbGVtZW50W10gd3NkbEJpbmRpbmdFbGVtZW50cyA9IG5ldyBXU0RMQmluZGluZ0VsZW1lbnRbZ2V0TnVtYmVyT2ZFbGVtZW50cyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfQklORElORyldOwotICAgICAgRW51bWVyYXRpb24gZSA9IGdldEVsZW1lbnRzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9CSU5ESU5HKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbEJpbmRpbmdFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICB3c2RsQmluZGluZ0VsZW1lbnRzW2ldID0gKFdTRExCaW5kaW5nRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdzZGxCaW5kaW5nRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSB3c2RsQmluZGluZ0VsZW1lbnRzW2pdLmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZyliaW5kaW5ncy5nZXQocW5hbWUpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgYmluZGluZ3MucmVtb3ZlKHFuYW1lKTsKLSAgICAgICAgICB3c2RsQmluZGluZ0VsZW1lbnRzW2pdLnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgICAgICAgd3NkbEJpbmRpbmdFbGVtZW50c1tqXS5idWlsZE1vZGVsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpc2Nvbm5lY3Qod3NkbEJpbmRpbmdFbGVtZW50c1tqXSwgV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX0JJTkRJTkcpOwotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IGJpbmRpbmdzLnZhbHVlcygpLml0ZXJhdG9yKCk7aXQuaGFzTmV4dCgpOykgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylpdC5uZXh0KCk7Ci0gICAgICAgIFdTRExCaW5kaW5nRWxlbWVudCB3c2RsQmluZGluZ0VsZW1lbnQgPSBuZXcgV1NETEJpbmRpbmdFbGVtZW50KGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgZ2V0TW9kZWwoKSwgYmluZGluZyk7Ci0gICAgICAgIGNvbm5lY3Qod3NkbEJpbmRpbmdFbGVtZW50LFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9CSU5ESU5HLE1vZGVsQ29uc3RhbnRzLlJFTF9PV05FUik7Ci0gICAgICAgIHdzZGxCaW5kaW5nRWxlbWVudC5idWlsZE1vZGVsKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRlMTNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGludGVyZmFjZSBJRnJhZ21lbnQgewotICBwdWJsaWMgdm9pZCBzZXRJRChTdHJpbmcgaWQpOwotICBwdWJsaWMgU3RyaW5nIGdldElEKCk7Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSwgU3RyaW5nW10gcGFyYW1zKTsKLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5LCBWZWN0b3IgcGFyYW1zKTsKLSAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpOwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclZhbHVlKFN0cmluZyBwYXJhbUtleSwgaW50IHBhcmFtSW5kZXgpOwotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCk7Ci0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSk7Ci0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVyVmFsdWUoU3RyaW5nIHBhcmFtS2V5LCBpbnQgcGFyYW1JbmRleCk7Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpOwotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVNPQVBFbmNBcnJheUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JU09BUEVuY0FycmF5RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwZGJkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JU09BUEVuY0FycmF5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNPQVBFbmNBcnJheUZyYWdtZW50IGV4dGVuZHMgSVhTREdyb3VwU2VxRnJhZ21lbnQgewotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVNPQVBFbmNBcnJheUluc3RhbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDEzZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudCBleHRlbmRzIElYU0REZWxlZ2F0aW9uRnJhZ21lbnQKLXsKLSAgcHVibGljIHZvaWQgc2V0VVJJUmVmZXJlbmNlcyhIYXNodGFibGUgdXJpUmVmZXJlbmNlcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEQ29tcGxleEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEQ29tcGxleEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTZkYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRENvbXBsZXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJWFNEQ29tcGxleEZyYWdtZW50IGV4dGVuZHMgSVhTRE1hcEZyYWdtZW50IHsKLSAgcHVibGljIFN0cmluZyBjcmVhdGVDb21wbGV4SW5zdGFuY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0REZWxlZ2F0aW9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0REZWxlZ2F0aW9uRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0M2JlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNERGVsZWdhdGlvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0REZWxlZ2F0aW9uRnJhZ21lbnQgZXh0ZW5kcyBJWFNERnJhZ21lbnQgewotICBwdWJsaWMgdm9pZCBzZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoSVhTREZyYWdtZW50IHhzZEZyYWdtZW50KTsKLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RFbGVtZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RFbGVtZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliODcyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNERWxlbWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RFbGVtZW50RnJhZ21lbnQgZXh0ZW5kcyBJWFNERGVsZWdhdGlvbkZyYWdtZW50IHsKLSAgcHVibGljIGludCBnZXRNaW5PY2N1cnMoKTsKLSAgcHVibGljIGludCBnZXRNYXhPY2N1cnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWFlNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGludGVyZmFjZSBJWFNERnJhZ21lbnQgZXh0ZW5kcyBJRnJhZ21lbnQgewotICBwdWJsaWMgdm9pZCBzZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbihYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpOwotICBwdWJsaWMgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLQotICBwdWJsaWMgdm9pZCBzZXRYU0RUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmKTsKLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyk7Ci0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBEb2N1bWVudCBkb2MpOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuSUQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RHcm91cEFsbEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBBbGxGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ1NGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RHcm91cEFsbEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RHcm91cEFsbEZyYWdtZW50IGV4dGVuZHMgSVhTREdyb3VwRnJhZ21lbnQgewotICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwQWxsSW5zdGFuY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RHcm91cENob2ljZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBDaG9pY2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjQ4MzdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RHcm91cENob2ljZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RHcm91cENob2ljZUZyYWdtZW50IGV4dGVuZHMgSVhTREdyb3VwRnJhZ21lbnQgewotICBwdWJsaWMgWFNEUGFydGljbGVbXSBnZXRDaG9pY2VzKCk7Ci0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBDaG9pY2VJbnN0YW5jZShpbnQgY2hvaWNlSW5kZXgpOwotICBwdWJsaWMgaW50IGdldENob2ljZUluZGV4KFN0cmluZyBncm91cElEKTsKLSAgcHVibGljIHZvaWQgc2V0Q2hvaWNlSW5kZXgoU3RyaW5nIGdyb3VwSUQsIGludCBjaG9pY2VJbmRleCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREdyb3VwRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhODc1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RHcm91cEZyYWdtZW50IGV4dGVuZHMgSVhTRE1hcEZyYWdtZW50IHsKLSAgcHVibGljIHZvaWQgc2V0WFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApOwotICBwdWJsaWMgWFNETW9kZWxHcm91cCBnZXRYU0RNb2RlbEdyb3VwKCk7Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEdyb3VwSURzKCk7Ci0gIHB1YmxpYyBTdHJpbmdbXSBnZXRHcm91cE1lbWJlcklEcyhTdHJpbmcgZ3JvdXBJRCk7Ci0gIHB1YmxpYyBJWFNERnJhZ21lbnRbXSBnZXRHcm91cE1lbWJlckZyYWdtZW50cyhTdHJpbmcgZ3JvdXBJRCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBTZXFGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTREdyb3VwU2VxRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NDMzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNER3JvdXBTZXFGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJWFNER3JvdXBTZXFGcmFnbWVudCBleHRlbmRzIElYU0RHcm91cEZyYWdtZW50IHsKLSAgcHVibGljIFN0cmluZyBjcmVhdGVHcm91cFNlcUluc3RhbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNETWFwRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RNYXBGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTlmZDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RNYXBGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotcHVibGljIGludGVyZmFjZSBJWFNETWFwRnJhZ21lbnQgZXh0ZW5kcyBJWFNERnJhZ21lbnQgewotICBwdWJsaWMgdm9pZCBzZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcihYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKTsKLSAgcHVibGljIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGdldFhTRFRvRnJhZ21lbnRDb250cm9sbGVyKCk7Ci0KLSAgcHVibGljIFN0cmluZyBjcmVhdGVJbnN0YW5jZSgpOwotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRGcmFnbWVudHNPcmRlcigpOwotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldEZyYWdtZW50KFN0cmluZyBpZCk7Ci0gIHB1YmxpYyBJWFNERnJhZ21lbnRbXSBnZXRGcmFnbWVudHMoU3RyaW5nW10gaWRzKTsKLSAgcHVibGljIElYU0RGcmFnbWVudFtdIGdldEFsbEZyYWdtZW50cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmOTdkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50IGV4dGVuZHMgSVhTREZyYWdtZW50IHsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RTaW1wbGVMaXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RTaW1wbGVMaXN0RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5MjVhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9JWFNEU2ltcGxlTGlzdEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElYU0RTaW1wbGVMaXN0RnJhZ21lbnQgZXh0ZW5kcyBJWFNETWFwRnJhZ21lbnQgewotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUxpc3RJbnN0YW5jZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L0lYU0RTaW1wbGVVbmlvbkZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODZhMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQgZXh0ZW5kcyBJWFNETWFwRnJhZ21lbnQgewotICBwdWJsaWMgWFNEU2ltcGxlVHlwZURlZmluaXRpb25bXSBnZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgcHVibGljIFN0cmluZyBjcmVhdGVVbmlvbkluc3RhbmNlKGludCBtZW1iZXJUeXBlSW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFR5cGVUb0ZyYWdtZW50TWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0MjcyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC5YU0RUeXBlRGVmaW5pdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwueHNkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEQ29tcGxleFR5cGVUb0ZyYWdtZW50TWFwcGVyIGV4dGVuZHMgWFNEVG9GcmFnbWVudE1hcHBlciB7Ci0gIHB1YmxpYyBYU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIoWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIHdzZGxUb1hTRE1hcHBlcikgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsIHdzZGxUb1hTRE1hcHBlcik7Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldEZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmIChjb21wbGV4VHlwZSAhPSBudWxsICYmIGNvbXBsZXhUeXBlLmlzTWl4ZWQoKSkKLSAgICAgIHJldHVybiBnZXRYU0REZWZhdWx0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhUeXBlQ29udGVudCA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5nZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoY29tcGxleFR5cGUpOwotICAgIGlmIChjb21wbGV4VHlwZUNvbnRlbnQgIT0gbnVsbCkKLSAgICAgIHJldHVybiBnZXRYU0RDb21wbGV4RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGdldFhTREVtcHR5RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIElYU0RGcmFnbWVudCBnZXRYU0RDb21wbGV4RnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgaW50IG1pbk9jY3VycyA9IGNvbmZpZy5nZXRNaW5PY2N1cnMoKTsKLSAgICBpbnQgbWF4T2NjdXJzID0gY29uZmlnLmdldE1heE9jY3VycygpOwotICAgIElYU0RDb21wbGV4RnJhZ21lbnQgZnJhZzsKLSAgICBpZiAobWluT2NjdXJzID09IG1heE9jY3VycykKLSAgICAgIHJldHVybiBuZXcgWFNEQ29tcGxleEZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBYU0RDb21wbGV4UmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RFbGVtZW50RGVjbGFyYXRpb25Ub0ZyYWdtZW50TWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RFbGVtZW50RGVjbGFyYXRpb25Ub0ZyYWdtZW50TWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTIwNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNERWxlbWVudERlY2xhcmF0aW9uVG9GcmFnbWVudE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwueHNkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYU0RFbGVtZW50RGVjbGFyYXRpb25Ub0ZyYWdtZW50TWFwcGVyIGV4dGVuZHMgWFNEVG9GcmFnbWVudE1hcHBlciB7Ci0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb25Ub0ZyYWdtZW50TWFwcGVyKFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyLCB3c2RsVG9YU0RNYXBwZXIpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXNvbHZlZEVsZW1lbnQgPSByZXNvbHZlWFNERWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZURlZiA9IGdldFhTRFR5cGVEZWZpbml0aW9uKHJlc29sdmVkRWxlbWVudCk7Ci0gICAgICBpZiAodHlwZURlZiAhPSBudWxsKSB7Ci0gICAgICAgIGludCBtaW5PY2N1cnMgPSBGcmFnbWVudENvbnN0YW50cy5ERUZBVUxUX01JTl9PQ0NVUlM7Ci0gICAgICAgIGludCBtYXhPY2N1cnMgPSBGcmFnbWVudENvbnN0YW50cy5ERUZBVUxUX01BWF9PQ0NVUlM7Ci0gICAgICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0gZWxlbWVudC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNvbmNyZXRlQ29tcG9uZW50ICE9IG51bGwgJiYgY29uY3JldGVDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkgewotICAgICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKWNvbmNyZXRlQ29tcG9uZW50OwotICAgICAgICAgIGlmIChwYXJ0aWNsZS5pc1NldE1pbk9jY3VycygpKQotICAgICAgICAgICAgbWluT2NjdXJzID0gcGFydGljbGUuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgaWYgKHBhcnRpY2xlLmlzU2V0TWF4T2NjdXJzKCkpCi0gICAgICAgICAgICBtYXhPY2N1cnMgPSBwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKTsKLSAgICAgICAgfQotICAgICAgICBjb25maWcuc2V0TWluT2NjdXJzKG1pbk9jY3Vycyk7Ci0gICAgICAgIGNvbmZpZy5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsKLSAgICAgICAgSVhTREVsZW1lbnRGcmFnbWVudCBlbGVtZW50RnJhZyA9IG5ldyBYU0RFbGVtZW50RnJhZ21lbnQoaWQsIHJlc29sdmVkRWxlbWVudC5nZXROYW1lKCksIGNvbmZpZyk7Ci0gICAgICAgIGVsZW1lbnRGcmFnLnNldFhTRFR5cGVEZWZpbml0aW9uKHR5cGVEZWYpOwotICAgICAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBlbGVtZW50VHlwZUNvbmZpZyA9IG5ldyBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgICAgICBlbGVtZW50VHlwZUNvbmZpZy5zZXRYU0RDb21wb25lbnQodHlwZURlZik7Ci0gICAgICAgIGVsZW1lbnRUeXBlQ29uZmlnLnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOwotICAgICAgICBlbGVtZW50VHlwZUNvbmZpZy5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsKLSAgICAgICAgZWxlbWVudFR5cGVDb25maWcuc2V0U3R5bGUoY29uZmlnLmdldFN0eWxlKCkpOwotICAgICAgICBlbGVtZW50VHlwZUNvbmZpZy5zZXRQYXJ0RW5jb2RpbmcoY29uZmlnLmdldFBhcnRFbmNvZGluZygpKTsKLSAgICAgICAgZWxlbWVudFR5cGVDb25maWcuc2V0V1NETFBhcnROYW1lKGNvbmZpZy5nZXRXU0RMUGFydE5hbWUoKSk7Ci0gICAgICAgIElYU0RGcmFnbWVudCB4c2RGcmFnbWVudCA9IGdldENvbnRyb2xsZXIoKS5nZXRGcmFnbWVudChlbGVtZW50VHlwZUNvbmZpZywgZWxlbWVudEZyYWcuZ2VuSUQoKSwgcmVzb2x2ZWRFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgIGVsZW1lbnRGcmFnLnNldFhTRERlbGVnYXRpb25GcmFnbWVudCh4c2RGcmFnbWVudCk7Ci0gICAgICAgIHJldHVybiBlbGVtZW50RnJhZzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpIHsKLSAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgIGlmIChlbGVtZW50LmdldFJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzb2x2ZWRFbGVtZW50ID0gZWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgaWYgKCFpc0NvbXBvbmVudFJlc29sdmFibGUocmVzb2x2ZWRFbGVtZW50KSkKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcG9uZW50IHJlc29sdmVkQ29tcG9uZW50ID0gZ2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkucmVzb2x2ZVhTRE5hbWVkQ29tcG9uZW50KHJlc29sdmVkRWxlbWVudCk7Ci0gICAgICAgIGlmIChyZXNvbHZlZENvbXBvbmVudCAhPSBudWxsICYmIChyZXNvbHZlZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikpCi0gICAgICAgICAgcmVzb2x2ZWRFbGVtZW50ID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilyZXNvbHZlZENvbXBvbmVudDsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXNvbHZlZEVsZW1lbnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlRGVmaW5pdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkgewotICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgaWYgKGVsZW1lbnQuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgIGVsc2UgaWYgKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRExpdGVyYWxYTUxFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRExpdGVyYWxYTUxFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVlNDQwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RMaXRlcmFsWE1MRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwueHNkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotCi1wdWJsaWMgY2xhc3MgWFNETGl0ZXJhbFhNTEVuY29kaW5nVG9GcmFnbWVudE1hcHBlciBleHRlbmRzIFhTRFRvRnJhZ21lbnRNYXBwZXIgewotICBwcml2YXRlIFhTRFNpbXBsZVR5cGVUb0ZyYWdtZW50TWFwcGVyIHhzZFNpbXBsZU1hcHBlcl87Ci0gIHByaXZhdGUgWFNEQ29tcGxleFR5cGVUb0ZyYWdtZW50TWFwcGVyIHhzZENvbXBsZXhNYXBwZXJfOwotICBwcml2YXRlIFhTREVsZW1lbnREZWNsYXJhdGlvblRvRnJhZ21lbnRNYXBwZXIgeHNkRWxlbWVudE1hcHBlcl87Ci0gIHByaXZhdGUgWFNEUGFydGljbGVUb0ZyYWdtZW50TWFwcGVyIHhzZFBhcnRpY2xlTWFwcGVyXzsKLQotICBwdWJsaWMgWFNETGl0ZXJhbFhNTEVuY29kaW5nVG9GcmFnbWVudE1hcHBlcihYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIgd3NkbFRvWFNETWFwcGVyKSB7Ci0gICAgc3VwZXIoY29udHJvbGxlciwgd3NkbFRvWFNETWFwcGVyKTsKLSAgICB4c2RTaW1wbGVNYXBwZXJfID0gbnVsbDsKLSAgICB4c2RDb21wbGV4TWFwcGVyXyA9IG51bGw7Ci0gICAgeHNkRWxlbWVudE1hcHBlcl8gPSBudWxsOwotICAgIHhzZFBhcnRpY2xlTWFwcGVyXz0gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgWFNEU2ltcGxlVHlwZVRvRnJhZ21lbnRNYXBwZXIgZ2V0WFNEU2ltcGxlTWFwcGVyKCkgewotICAgIGlmICh4c2RTaW1wbGVNYXBwZXJfID09IG51bGwpCi0gICAgICB4c2RTaW1wbGVNYXBwZXJfID0gbmV3IFhTRFNpbXBsZVR5cGVUb0ZyYWdtZW50TWFwcGVyKGdldENvbnRyb2xsZXIoKSwgZ2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkpOwotICAgIHJldHVybiB4c2RTaW1wbGVNYXBwZXJfOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIgZ2V0WFNEQ29tcGxleE1hcHBlcigpIHsKLSAgICBpZiAoeHNkQ29tcGxleE1hcHBlcl8gPT0gbnVsbCkKLSAgICAgIHhzZENvbXBsZXhNYXBwZXJfID0gbmV3IFhTRENvbXBsZXhUeXBlVG9GcmFnbWVudE1hcHBlcihnZXRDb250cm9sbGVyKCksIGdldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcigpKTsKLSAgICByZXR1cm4geHNkQ29tcGxleE1hcHBlcl87Ci0gIH0KLQotICBwcml2YXRlIFhTREVsZW1lbnREZWNsYXJhdGlvblRvRnJhZ21lbnRNYXBwZXIgZ2V0WFNERWxlbWVudE1hcHBlcigpIHsKLSAgICBpZiAoeHNkRWxlbWVudE1hcHBlcl8gPT0gbnVsbCkKLSAgICAgIHhzZEVsZW1lbnRNYXBwZXJfID0gbmV3IFhTREVsZW1lbnREZWNsYXJhdGlvblRvRnJhZ21lbnRNYXBwZXIoZ2V0Q29udHJvbGxlcigpLCBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKSk7Ci0gICAgcmV0dXJuIHhzZEVsZW1lbnRNYXBwZXJfOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RQYXJ0aWNsZVRvRnJhZ21lbnRNYXBwZXIgZ2V0WFNEUGFydGljbGVNYXBwZXIoKSB7Ci0gICAgaWYgKHhzZFBhcnRpY2xlTWFwcGVyXyA9PSBudWxsKQotICAgICAgeHNkUGFydGljbGVNYXBwZXJfID0gbmV3IFhTRFBhcnRpY2xlVG9GcmFnbWVudE1hcHBlcihnZXRDb250cm9sbGVyKCksIGdldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcigpKTsKLSAgICByZXR1cm4geHNkUGFydGljbGVNYXBwZXJfOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBjb25maWcgPSByZXNvbHZlWFNEQ29tcG9uZW50KGNvbmZpZyk7Ci0gICAgWFNEQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBpZiAoIWlzQ29tcG9uZW50UmVzb2x2YWJsZShjb21wb25lbnQpKQotICAgICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICByZXR1cm4gZ2V0WFNERWxlbWVudE1hcHBlcigpLmdldEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKQotICAgICAgcmV0dXJuIGdldFhTRFNpbXBsZU1hcHBlcigpLmdldEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHJldHVybiBnZXRYU0RDb21wbGV4TWFwcGVyKCkuZ2V0RnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICByZXR1cm4gZ2V0WFNEUGFydGljbGVNYXBwZXIoKS5nZXRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUNvbnRlbnQpCi0gICAgICByZXR1cm4gZ2V0WFNEUGFydGljbGVNYXBwZXIoKS5nZXRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RQYXJ0aWNsZVRvRnJhZ21lbnRNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFBhcnRpY2xlVG9GcmFnbWVudE1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzk1NmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFBhcnRpY2xlVG9GcmFnbWVudE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnhzZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9zaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci0KLQotcHVibGljIGNsYXNzIFhTRFBhcnRpY2xlVG9GcmFnbWVudE1hcHBlciBleHRlbmRzIFhTRFRvRnJhZ21lbnRNYXBwZXIgewotICBwdWJsaWMgWFNEUGFydGljbGVUb0ZyYWdtZW50TWFwcGVyKFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyLCB3c2RsVG9YU0RNYXBwZXIpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBYU0RDb21wb25lbnQgY29tcG9uZW50ID0gY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIFhTRFBhcnRpY2xlQ29udGVudCB4c2RQYXJ0aWNsZUNvbnRlbnQ7Ci0gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgeHNkUGFydGljbGVDb250ZW50ID0gKChYU0RQYXJ0aWNsZSljb21wb25lbnQpLmdldENvbnRlbnQoKTsKLSAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZUNvbnRlbnQpCi0gICAgICB4c2RQYXJ0aWNsZUNvbnRlbnQgPSAoWFNEUGFydGljbGVDb250ZW50KWNvbXBvbmVudDsKLSAgICBlbHNlCi0gICAgICB4c2RQYXJ0aWNsZUNvbnRlbnQgPSBudWxsOwotICAgIGlmICh4c2RQYXJ0aWNsZUNvbnRlbnQgIT0gbnVsbCkgewotICAgICAgaWYgKHhzZFBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICByZXR1cm4gZ2V0WFNETW9kZWxHcm91cERlZkZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUsIChYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbil4c2RQYXJ0aWNsZUNvbnRlbnQpOwotICAgICAgZWxzZSBpZiAoeHNkUGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cCkKLSAgICAgICAgcmV0dXJuIGdldFhTRE1vZGVsR3JvdXBGcmFnbWVudChjb25maWcsIGlkLCBuYW1lLCAoWFNETW9kZWxHcm91cCl4c2RQYXJ0aWNsZUNvbnRlbnQpOwotICAgICAgZWxzZSBpZiAoeHNkUGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNEV2lsZGNhcmQpCi0gICAgICAgIHJldHVybiBnZXRYU0RXaWxkY2FyZEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUsIChYU0RXaWxkY2FyZCl4c2RQYXJ0aWNsZUNvbnRlbnQpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBJWFNERnJhZ21lbnQgZ2V0WFNETW9kZWxHcm91cERlZkZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNETW9kZWxHcm91cERlZmluaXRpb24geHNkTW9kZWxHcm91cERlZikgewotICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHJlc29sdmVkWFNETW9kZWxHcm91cERlZiA9IHhzZE1vZGVsR3JvdXBEZWY7Ci0gICAgaWYgKHhzZE1vZGVsR3JvdXBEZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgICAgcmVzb2x2ZWRYU0RNb2RlbEdyb3VwRGVmID0geHNkTW9kZWxHcm91cERlZi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwID0gcmVzb2x2ZWRYU0RNb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKTsKLSAgICBpZiAoeHNkTW9kZWxHcm91cCA9PSBudWxsKQotICAgICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZ2V0WFNETW9kZWxHcm91cEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUsIHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHJpdmF0ZSBJWFNERnJhZ21lbnQgZ2V0WFNETW9kZWxHcm91cEZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgaW50IG1pbk9jY3VycyA9IEZyYWdtZW50Q29uc3RhbnRzLkRFRkFVTFRfTUlOX09DQ1VSUzsKLSAgICBpbnQgbWF4T2NjdXJzID0gRnJhZ21lbnRDb25zdGFudHMuREVGQVVMVF9NQVhfT0NDVVJTOwotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbmNyZXRlQ29tcG9uZW50ID0geHNkTW9kZWxHcm91cC5nZXRDb250YWluZXIoKTsKLSAgICBpZiAoY29uY3JldGVDb21wb25lbnQgIT0gbnVsbCAmJiBjb25jcmV0ZUNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKSB7Ci0gICAgICBYU0RQYXJ0aWNsZSBwYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSljb25jcmV0ZUNvbXBvbmVudDsKLSAgICAgIGlmIChwYXJ0aWNsZS5pc1NldE1pbk9jY3VycygpKQotICAgICAgICBtaW5PY2N1cnMgPSBwYXJ0aWNsZS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgIGlmIChwYXJ0aWNsZS5pc1NldE1heE9jY3VycygpKQotICAgICAgICBtYXhPY2N1cnMgPSBwYXJ0aWNsZS5nZXRNYXhPY2N1cnMoKTsKLSAgICB9Ci0gICAgY29uZmlnLnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOwotICAgIGNvbmZpZy5zZXRNYXhPY2N1cnMobWF4T2NjdXJzKTsKLSAgICBJWFNER3JvdXBGcmFnbWVudCBncm91cEZyYWdtZW50ID0gbnVsbDsKLSAgICBzd2l0Y2ggKHhzZE1vZGVsR3JvdXAuZ2V0Q29tcG9zaXRvcigpLmdldFZhbHVlKCkpIHsKLSAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5TRVFVRU5DRTogCi0gICAgICAgIGlmIChtaW5PY2N1cnMgPT0gbWF4T2NjdXJzKQotICAgICAgICAgIHJldHVybiBuZXcgWFNER3JvdXBTZXFGaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCksIHhzZE1vZGVsR3JvdXApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RHcm91cFNlcVJhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgZ2V0Q29udHJvbGxlcigpLCB4c2RNb2RlbEdyb3VwKTsKLSAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5DSE9JQ0U6Ci0gICAgICAgIGlmIChtaW5PY2N1cnMgPT0gbWF4T2NjdXJzKQotICAgICAgICAgIHJldHVybiBuZXcgWFNER3JvdXBDaG9pY2VGaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCksIHhzZE1vZGVsR3JvdXApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RHcm91cENob2ljZVJhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgZ2V0Q29udHJvbGxlcigpLCB4c2RNb2RlbEdyb3VwKTsKLSAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5BTEw6Ci0gICAgICAgIHJldHVybiBuZXcgWFNER3JvdXBBbGxGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCksIHhzZE1vZGVsR3JvdXApOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIElYU0RGcmFnbWVudCBnZXRYU0RXaWxkY2FyZEZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEV2lsZGNhcmQgeHNkUGFydGljbGVDb250ZW50KSB7Ci0gICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEU09BUEVuY29kaW5nVG9GcmFnbWVudE1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEU09BUEVuY29kaW5nVG9GcmFnbWVudE1hcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDNjOGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFNPQVBFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsLlhTRFR5cGVEZWZpbml0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgWFNEU09BUEVuY29kaW5nVG9GcmFnbWVudE1hcHBlciBleHRlbmRzIFhTRFRvRnJhZ21lbnRNYXBwZXIgewotICBwcml2YXRlIFhTRExpdGVyYWxYTUxFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIgeHNkTGl0ZXJhbE1hcHBlcl87Ci0gIHByaXZhdGUgWFNEQ29tcGxleFR5cGVUb0ZyYWdtZW50TWFwcGVyIHhzZENvbXBsZXhNYXBwZXJfOwotCi0gIHB1YmxpYyBYU0RTT0FQRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyKFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXIpIHsKLSAgICBzdXBlcihjb250cm9sbGVyLCB3c2RsVG9YU0RNYXBwZXIpOwotICAgIHhzZExpdGVyYWxNYXBwZXJfID0gbnVsbDsKLSAgICB4c2RDb21wbGV4TWFwcGVyXyA9IG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFhTRExpdGVyYWxYTUxFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIgZ2V0WFNETGl0ZXJhbE1hcHBlcigpIHsKLSAgICBpZiAoeHNkTGl0ZXJhbE1hcHBlcl8gPT0gbnVsbCkKLSAgICAgIHhzZExpdGVyYWxNYXBwZXJfID0gbmV3IFhTRExpdGVyYWxYTUxFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIoZ2V0Q29udHJvbGxlcigpLCBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKSk7Ci0gICAgcmV0dXJuIHhzZExpdGVyYWxNYXBwZXJfOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RDb21wbGV4VHlwZVRvRnJhZ21lbnRNYXBwZXIgZ2V0WFNEQ29tcGxleE1hcHBlcigpIHsKLSAgICBpZiAoeHNkQ29tcGxleE1hcHBlcl8gPT0gbnVsbCkKLSAgICAgIHhzZENvbXBsZXhNYXBwZXJfID0gbmV3IFhTRENvbXBsZXhUeXBlVG9GcmFnbWVudE1hcHBlcihnZXRDb250cm9sbGVyKCksIGdldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcigpKTsKLSAgICAgcmV0dXJuIHhzZENvbXBsZXhNYXBwZXJfOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBpZiAoY29uZmlnLmdldElzV1NETFBhcnQoKSkgewotICAgICAgSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudCB3cmFwcGVyRnJhZ21lbnQgPSBuZXcgU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50KGlkLCBuYW1lLCBudWxsKTsKLSAgICAgIFN0cmluZyBkZWxlZ2F0aW9uRnJhZ0lkID0gd3JhcHBlckZyYWdtZW50LmdlbklEKCk7Ci0gICAgICBJWFNERnJhZ21lbnQgZGVsZWdhdGlvbkZyYWdtZW50ID0gZ2V0RnJhZ21lbnREZWxlZ2F0ZShjb25maWcsIGRlbGVnYXRpb25GcmFnSWQsIG5hbWUpOwotICAgICAgd3JhcHBlckZyYWdtZW50LnNldFhTRERlbGVnYXRpb25GcmFnbWVudChkZWxlZ2F0aW9uRnJhZ21lbnQpOwotICAgICAgZ2V0Q29udHJvbGxlcigpLmFkZFRvQ2FjaGUoZGVsZWdhdGlvbkZyYWdJZCwgZGVsZWdhdGlvbkZyYWdtZW50KTsKLSAgICAgIHJldHVybiB3cmFwcGVyRnJhZ21lbnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBnZXRGcmFnbWVudERlbGVnYXRlKGNvbmZpZywgaWQsIG5hbWUpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudERlbGVnYXRlKFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIGNvbmZpZyA9IHJlc29sdmVYU0RDb21wb25lbnQoY29uZmlnKTsKLSAgICBYU0RDb21wb25lbnQgY29tcG9uZW50ID0gY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmICghaXNDb21wb25lbnRSZXNvbHZhYmxlKGNvbXBvbmVudCkpCi0gICAgICByZXR1cm4gZ2V0WFNERGVmYXVsdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotICAgICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiljb21wb25lbnQ7Ci0gICAgICBpZiAoWFNEVHlwZURlZmluaXRpb25VdGlsLmlzU29hcEVuY0FycmF5KGNvbXBsZXhUeXBlKSkKLSAgICAgICAgcmV0dXJuIGdldFNPQVBFbmNBcnJheUZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUsIGNvbXBsZXhUeXBlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGdldFhTRENvbXBsZXhNYXBwZXIoKS5nZXRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGdldFhTRExpdGVyYWxNYXBwZXIoKS5nZXRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgSVhTREZyYWdtZW50IGdldFNPQVBFbmNBcnJheUZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKSB7Ci0gICAgRUxpc3QgeHNkQXR0ckNvbnRlbnRzID0gY29tcGxleFR5cGUuZ2V0QXR0cmlidXRlQ29udGVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHhzZEF0dHJDb250ZW50cy5zaXplKCk7IGkrKykgewotICAgICAgU3RyaW5nIHNvYXBFbmNBcnJheVR5cGVOYW1lc3BhY2VVUkkgPSBudWxsOwotICAgICAgU3RyaW5nIHNvYXBFbmNBcnJheVR5cGVMb2NhbE5hbWUgPSBudWxsOwotICAgICAgaW50IHNvYXBFbmNBcnJheURpbWVuc2lvbiA9IDA7Ci0gICAgICBYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQgeHNkQXR0ckNvbnRlbnQgPSAoWFNEQXR0cmlidXRlR3JvdXBDb250ZW50KXhzZEF0dHJDb250ZW50cy5nZXQoaSk7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSB4c2RBdHRyQ29udGVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBTdHJpbmcgYXJyYXlUeXBlQXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTlMoRnJhZ21lbnRDb25zdGFudHMuVVJJX1dTREwsIEZyYWdtZW50Q29uc3RhbnRzLlFOQU1FX0xPQ0FMX05BTUVfQVJSQVlfVFlQRSk7Ci0gICAgICBpZiAoYXJyYXlUeXBlQXR0ciAhPSBudWxsICYmIGFycmF5VHlwZUF0dHIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIGludCBjb2xvbiA9IGFycmF5VHlwZUF0dHIuaW5kZXhPZihGcmFnbWVudENvbnN0YW50cy5DT0xPTik7Ci0gICAgICAgIFN0cmluZyBuc1ByZWZpeCA9IChjb2xvbiA+IDApID8gYXJyYXlUeXBlQXR0ci5zdWJzdHJpbmcoMCwgY29sb24pIDogbnVsbDsKLSAgICAgICAgc29hcEVuY0FycmF5VHlwZU5hbWVzcGFjZVVSSSA9IChTdHJpbmcpeHNkQXR0ckNvbnRlbnQuZ2V0U2NoZW1hKCkuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpLmdldChuc1ByZWZpeCk7Ci0gICAgICAgIGludCBkaW1lbnNpb25JbmRleCA9IGFycmF5VHlwZUF0dHIuaW5kZXhPZihGcmFnbWVudENvbnN0YW50cy5MRUZUX1NRVUFSRV9CUkFDS0VUKTsKLSAgICAgICAgc29hcEVuY0FycmF5VHlwZUxvY2FsTmFtZSA9IGFycmF5VHlwZUF0dHIuc3Vic3RyaW5nKGNvbG9uICsgMSwgZGltZW5zaW9uSW5kZXgpOwotICAgICAgICBTdHJpbmcgZGltZW5zaW9uU3RyaW5nID0gYXJyYXlUeXBlQXR0ci5zdWJzdHJpbmcoZGltZW5zaW9uSW5kZXgsIGFycmF5VHlwZUF0dHIubGVuZ3RoKCkpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRpbWVuc2lvblN0cmluZy5sZW5ndGgoKSAtIDE7IGorKykgewotICAgICAgICAgIGlmIChkaW1lbnNpb25TdHJpbmcuY2hhckF0KGopID09IEZyYWdtZW50Q29uc3RhbnRzLkxFRlRfU1FVQVJFX0JSQUNLRVQuY2hhckF0KDApICYmIGRpbWVuc2lvblN0cmluZy5jaGFyQXQoaiArIDEpID09IEZyYWdtZW50Q29uc3RhbnRzLlJJR0hUX1NRVUFSRV9CUkFDS0VULmNoYXJBdCgwKSkgewotICAgICAgICAgICAgc29hcEVuY0FycmF5RGltZW5zaW9uKys7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgc29hcEVuY0FycmF5RGltZW5zaW9uID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHNvYXBFbmNBcnJheVR5cGVOYW1lc3BhY2VVUkkgIT0gbnVsbCAmJiBzb2FwRW5jQXJyYXlUeXBlTG9jYWxOYW1lICE9IG51bGwgJiYgc29hcEVuY0FycmF5RGltZW5zaW9uID09IDEpIHsKLSAgICAgICAgWFNEQ29tcG9uZW50IHNvYXBFbmNBcnJheVR5cGUgPSBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKS5nZXRYU0RUeXBlRnJvbVNjaGVtYShzb2FwRW5jQXJyYXlUeXBlTmFtZXNwYWNlVVJJLCBzb2FwRW5jQXJyYXlUeXBlTG9jYWxOYW1lLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzb2FwRW5jQXJyYXlUeXBlICE9IG51bGwgJiYgc29hcEVuY0FycmF5VHlwZSBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgWFNETW9kZWxHcm91cCBzZXF1ZW5jZSA9IG51bGw7Ci0gICAgICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhUeXBlQ29udGVudCA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5nZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoY29tcGxleFR5cGUpOwotICAgICAgICAgIGlmIChjb21wbGV4VHlwZUNvbnRlbnQgIT0gbnVsbCAmJiAoY29tcGxleFR5cGVDb250ZW50IGluc3RhbmNlb2YgWFNEUGFydGljbGUpKSB7Ci0gICAgICAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgeHNkUGFydGljbGVDb250ZW50ID0gKChYU0RQYXJ0aWNsZSljb21wbGV4VHlwZUNvbnRlbnQpLmdldENvbnRlbnQoKTsKLSAgICAgICAgICAgIGlmICh4c2RQYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgICAgICAgICAgICBzZXF1ZW5jZSA9IChYU0RNb2RlbEdyb3VwKXhzZFBhcnRpY2xlQ29udGVudDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgSVNPQVBFbmNBcnJheUZyYWdtZW50IGZyYWc7Ci0gICAgICAgICAgaWYgKGNvbmZpZy5nZXRNaW5PY2N1cnMoKSA9PSBjb25maWcuZ2V0TWF4T2NjdXJzKCkpCi0gICAgICAgICAgICBmcmFnID0gbmV3IFNPQVBFbmNBcnJheUZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSwgc2VxdWVuY2UpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZyYWcgPSBuZXcgU09BUEVuY0FycmF5UmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCksIHNlcXVlbmNlKTsKLSAgICAgICAgICBmcmFnLnNldFhTRFR5cGVEZWZpbml0aW9uKChYU0RUeXBlRGVmaW5pdGlvbilzb2FwRW5jQXJyYXlUeXBlKTsKLSAgICAgICAgICByZXR1cm4gZnJhZzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZ2V0WFNEQ29tcGxleE1hcHBlcigpLmdldEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVUeXBlVG9GcmFnbWVudE1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVHlwZVRvRnJhZ21lbnRNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5ZWQwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVUeXBlVG9GcmFnbWVudE1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwueHNkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLio7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVUeXBlVG9GcmFnbWVudE1hcHBlciBleHRlbmRzIFhTRFRvRnJhZ21lbnRNYXBwZXIgewotICBwdWJsaWMgWFNEU2ltcGxlVHlwZVRvRnJhZ21lbnRNYXBwZXIoWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIHdzZGxUb1hTRE1hcHBlcikgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsIHdzZGxUb1hTRE1hcHBlcik7Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldEZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmIChzaW1wbGVUeXBlICE9IG51bGwgJiYgc2ltcGxlVHlwZS5nZXRWYXJpZXR5KCkgIT0gbnVsbCkgewotICAgICAgc3dpdGNoIChzaW1wbGVUeXBlLmdldFZhcmlldHkoKS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgIGNhc2UgWFNEVmFyaWV0eS5BVE9NSUM6Ci0gICAgICAgICAgcmV0dXJuIGdldFhTRFNpbXBsZUF0b21pY0ZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgICAgICBjYXNlIFhTRFZhcmlldHkuTElTVDoKLSAgICAgICAgICByZXR1cm4gZ2V0WFNEU2ltcGxlTGlzdEZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgICAgICBjYXNlIFhTRFZhcmlldHkuVU5JT046Ci0gICAgICAgICAgcmV0dXJuIGdldFhTRFNpbXBsZVVuaW9uRnJhZ21lbnQoY29uZmlnLCBpZCwgbmFtZSk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGdldFhTRERlZmF1bHRGcmFnbWVudChjb25maWcsIGlkLCBuYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgSVhTREZyYWdtZW50IGdldFhTRFNpbXBsZUF0b21pY0ZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIGJvb2xlYW4gaXNGaXhlZCA9ICgoY29uZmlnLmdldE1pbk9jY3VycygpID09IGNvbmZpZy5nZXRNYXhPY2N1cnMoKSkgJiYgY29uZmlnLmdldE1heE9jY3VycygpICE9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCk7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkU2ltcGxlVHlwZURlZiA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiljb25maWcuZ2V0WFNEQ29tcG9uZW50KCk7Ci0gICAgWFNEU2ltcGxlVHlwZURlZmluaXRpb24geHNkQmFzZVNpbXBsZVR5cGVEZWYgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbih4c2RTaW1wbGVUeXBlRGVmKTsKLSAgICBTdHJpbmcgYmFzZVNpbXBsZVR5cGVEZWZOUyA9IG51bGw7Ci0gICAgU3RyaW5nIGJhc2VTaW1wbGVUeXBlRGVmTmFtZSA9IG51bGw7Ci0gICAgaWYgKHhzZEJhc2VTaW1wbGVUeXBlRGVmICE9IG51bGwpCi0gICAgewotICAgICAgYmFzZVNpbXBsZVR5cGVEZWZOUyA9IHhzZEJhc2VTaW1wbGVUeXBlRGVmLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgYmFzZVNpbXBsZVR5cGVEZWZOYW1lID0geHNkQmFzZVNpbXBsZVR5cGVEZWYuZ2V0TmFtZSgpOwotICAgIH0KLSAgICBib29sZWFuIGlzRW51bSA9IGlzU2ltcGxlVHlwZUVudW1lcmF0aW9uKHhzZFNpbXBsZVR5cGVEZWYpOwotICAgIGlmIChGcmFnbWVudENvbnN0YW50cy5VUklfWFNELmVxdWFscyhiYXNlU2ltcGxlVHlwZURlZk5TKSkKLSAgICB7Ci0gICAgICBpZiAoYmFzZVNpbXBsZVR5cGVEZWZOYW1lLmVxdWFscygiZGF0ZSIpKQotICAgICAgICByZXR1cm4gZ2V0WFNEU2ltcGxlRGF0ZVRpbWVGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFLHhzZFNpbXBsZVR5cGVEZWYsaXNFbnVtLGlzRml4ZWQpOwotICAgICAgZWxzZSBpZiAoYmFzZVNpbXBsZVR5cGVEZWZOYW1lLmVxdWFscygiZGF0ZVRpbWUiKSkKLSAgICAgICAgcmV0dXJuIGdldFhTRFNpbXBsZURhdGVUaW1lRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURVRJTUUseHNkU2ltcGxlVHlwZURlZixpc0VudW0saXNGaXhlZCk7Ci0gICAgICBlbHNlIGlmIChiYXNlU2ltcGxlVHlwZURlZk5hbWUuZXF1YWxzKCJnWWVhck1vbnRoIikpCi0gICAgICAgIHJldHVybiBnZXRYU0RTaW1wbGVEYXRlVGltZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dZRUFSTU9OVEgseHNkU2ltcGxlVHlwZURlZixpc0VudW0saXNGaXhlZCk7Ci0gICAgICBlbHNlIGlmIChiYXNlU2ltcGxlVHlwZURlZk5hbWUuZXF1YWxzKCJnTW9udGhEYXkiKSkKLSAgICAgICAgcmV0dXJuIGdldFhTRFNpbXBsZURhdGVUaW1lRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR01PTlRIREFZLHhzZFNpbXBsZVR5cGVEZWYsaXNFbnVtLGlzRml4ZWQpOwotICAgICAgZWxzZSBpZiAoYmFzZVNpbXBsZVR5cGVEZWZOYW1lLmVxdWFscygiZ0RheSIpKQotICAgICAgICByZXR1cm4gZ2V0WFNEU2ltcGxlR0RheUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIHhzZFNpbXBsZVR5cGVEZWYsaXNFbnVtLGlzRml4ZWQpOyAgICAgICAgCi0gICAgICBlbHNlIGlmIChiYXNlU2ltcGxlVHlwZURlZk5hbWUuZXF1YWxzKCJib29sZWFuIikpCi0gICAgICAgIHJldHVybiBnZXRYU0RTaW1wbGVCb29sZWFuRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgeHNkU2ltcGxlVHlwZURlZixpc0VudW0saXNGaXhlZCk7Ci0gICAgfQotCi0gICAgaWYgKGlzRW51bSkKLSAgICB7Ci0gICAgICBpZiAoaXNGaXhlZCkKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVBdG9taWNFbnVtRml4RnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgeHNkU2ltcGxlVHlwZURlZi5nZXRFbnVtZXJhdGlvbkZhY2V0cygpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCB4c2RTaW1wbGVUeXBlRGVmLmdldEVudW1lcmF0aW9uRmFjZXRzKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzRml4ZWQpCi0gICAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRml4RnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljUmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFhTRFNpbXBsZUF0b21pY0ZyYWdtZW50IGdldFhTRFNpbXBsZURhdGVUaW1lRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgY2FsZW5kYXJUeXBlLFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZERhdGVUaW1lVHlwZSxib29sZWFuIGlzRW51bSxib29sZWFuIGlzRml4ZWQpCi0gIHsKLSAgICBpZiAoaXNFbnVtKQotICAgIHsKLSAgICAgIGlmIChpc0ZpeGVkKQotICAgICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCB4c2REYXRlVGltZVR5cGUuZ2V0RW51bWVyYXRpb25GYWNldHMoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgeHNkRGF0ZVRpbWVUeXBlLmdldEVudW1lcmF0aW9uRmFjZXRzKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGlzRml4ZWQpCi0gICAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVGaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBjYWxlbmRhclR5cGUpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUF0b21pY0RhdGVUaW1lUmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBjYWxlbmRhclR5cGUpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBYU0RTaW1wbGVBdG9taWNGcmFnbWVudCBnZXRYU0RTaW1wbGVHRGF5RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2REYXRlVGltZVR5cGUsYm9vbGVhbiBpc0VudW0sYm9vbGVhbiBpc0ZpeGVkKQotICB7Ci0gICAgaWYgKGlzRW51bSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIE9wdGlvblZlY3RvciBvcHRpb25WZWN0b3IgPSBuZXcgT3B0aW9uVmVjdG9yKCk7Ci0gICAgU3RyaW5nQnVmZmVyIHZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGk9MTtpPD0zMTtpKyspCi0gICAgewotICAgICAgdmFsdWUuc2V0TGVuZ3RoKDApOwotICAgICAgdmFsdWUuYXBwZW5kKCItLS0iKTsKLSAgICAgIGlmIChpPDEwKQotICAgICAgICB2YWx1ZS5hcHBlbmQoMCk7Ci0gICAgICB2YWx1ZS5hcHBlbmQoaSk7Ci0gICAgICBvcHRpb25WZWN0b3IuYWRkT3B0aW9uKFN0cmluZy52YWx1ZU9mKGkpLHZhbHVlLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgICBpZiAoaXNGaXhlZCkKLSAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRW51bUZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIG9wdGlvblZlY3Rvcik7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBvcHRpb25WZWN0b3IpOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RTaW1wbGVBdG9taWNGcmFnbWVudCBnZXRYU0RTaW1wbGVCb29sZWFuRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RCb29sZWFuVHlwZSxib29sZWFuIGlzRW51bSxib29sZWFuIGlzRml4ZWQpCi0gIHsKLSAgICBpZiAoaXNFbnVtKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgT3B0aW9uVmVjdG9yIG9wdGlvblZlY3RvciA9IG5ldyBPcHRpb25WZWN0b3IoKTsKLSAgICBvcHRpb25WZWN0b3IuYWRkT3B0aW9uKCJ0cnVlIiwidHJ1ZSIpOwotICAgIG9wdGlvblZlY3Rvci5hZGRPcHRpb24oImZhbHNlIiwiZmFsc2UiKTsKLSAgICBpZiAoaXNGaXhlZCkKLSAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlQXRvbWljRW51bUZpeEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIG9wdGlvblZlY3Rvcik7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBvcHRpb25WZWN0b3IpOwotICB9Ci0KLSAgcHJpdmF0ZSBJWFNERnJhZ21lbnQgZ2V0WFNEU2ltcGxlTGlzdEZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIElYU0RTaW1wbGVMaXN0RnJhZ21lbnQgZnJhZzsKLSAgICBib29sZWFuIGlzRml4ZWQgPSAoKGNvbmZpZy5nZXRNaW5PY2N1cnMoKSA9PSBjb25maWcuZ2V0TWF4T2NjdXJzKCkpICYmIGNvbmZpZy5nZXRNYXhPY2N1cnMoKSAhPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQpOwotICAgIGlmIChpc0ZpeGVkKQotICAgICAgcmV0dXJuIG5ldyBYU0RTaW1wbGVMaXN0Rml4RnJhZ21lbnQoaWQsIG5hbWUsIGNvbmZpZywgZ2V0Q29udHJvbGxlcigpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IFhTRFNpbXBsZUxpc3RSYW5nZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSk7Ci0gIH0KLQotICBwcml2YXRlIElYU0RGcmFnbWVudCBnZXRYU0RTaW1wbGVVbmlvbkZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIElYU0RTaW1wbGVVbmlvbkZyYWdtZW50IGZyYWc7Ci0gICAgYm9vbGVhbiBpc0ZpeGVkID0gKChjb25maWcuZ2V0TWluT2NjdXJzKCkgPT0gY29uZmlnLmdldE1heE9jY3VycygpKSAmJiBjb25maWcuZ2V0TWF4T2NjdXJzKCkgIT0gRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEKTsKLSAgICBpZiAoaXNGaXhlZCkKLSAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlVW5pb25GaXhGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnLCBnZXRDb250cm9sbGVyKCkpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgWFNEU2ltcGxlVW5pb25SYW5nZUZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcsIGdldENvbnRyb2xsZXIoKSk7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNTaW1wbGVUeXBlRW51bWVyYXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSkgewotICAgIEVMaXN0IGUgPSBzaW1wbGVUeXBlLmdldEVudW1lcmF0aW9uRmFjZXRzKCk7Ci0gICAgcmV0dXJuIChlICE9IG51bGwgJiYgZS5zaXplKCkgPiAwKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MzdkYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHsKLSAgcHJpdmF0ZSBYU0RDb21wb25lbnQgY29tcG9uZW50XzsKLSAgcHJpdmF0ZSBpbnQgbWluT2NjdXJzXzsKLSAgcHJpdmF0ZSBpbnQgbWF4T2NjdXJzXzsKLSAgcHJpdmF0ZSBpbnQgc3R5bGVfOwotICBwcml2YXRlIGludCBwYXJ0RW5jb2RpbmdfOwotICBwcml2YXRlIGJvb2xlYW4gaXNXU0RMUGFydF87Ci0gIHByaXZhdGUgU3RyaW5nIHdzZGxQYXJ0TmFtZV87Ci0KLSAgcHVibGljIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCkgewotICAgIGNvbXBvbmVudF8gPSBudWxsOwotICAgIG1pbk9jY3Vyc18gPSBGcmFnbWVudENvbnN0YW50cy5ERUZBVUxUX01JTl9PQ0NVUlM7Ci0gICAgbWF4T2NjdXJzXyA9IEZyYWdtZW50Q29uc3RhbnRzLkRFRkFVTFRfTUFYX09DQ1VSUzsKLSAgICBzdHlsZV8gPSBGcmFnbWVudENvbnN0YW50cy5TVFlMRV9ET0NVTUVOVDsKLSAgICBwYXJ0RW5jb2RpbmdfID0gRnJhZ21lbnRDb25zdGFudHMuRU5DT0RJTkdfTElURVJBTDsKLSAgICBpc1dTRExQYXJ0XyA9IGZhbHNlOwotICAgIHdzZGxQYXJ0TmFtZV8gPSBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNEQ29tcG9uZW50KFhTRENvbXBvbmVudCBjb21wb25lbnQpIHsKLSAgICBjb21wb25lbnRfID0gY29tcG9uZW50OwotICB9Ci0KLSAgcHVibGljIFhTRENvbXBvbmVudCBnZXRYU0RDb21wb25lbnQoKSB7Ci0gICAgcmV0dXJuIGNvbXBvbmVudF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoaW50IG1pbk9jY3VycykgewotICAgIG1pbk9jY3Vyc18gPSBtaW5PY2N1cnM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpIHsKLSAgICByZXR1cm4gbWluT2NjdXJzXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhpbnQgbWF4T2NjdXJzKSB7Ci0gICAgbWF4T2NjdXJzXyA9IG1heE9jY3VyczsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkgewotICAgIHJldHVybiBtYXhPY2N1cnNfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTdHlsZShpbnQgc3R5bGUpIHsKLSAgICBzdHlsZV8gPSBzdHlsZTsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRTdHlsZSgpIHsKLSAgICByZXR1cm4gc3R5bGVfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFydEVuY29kaW5nKGludCBwYXJ0RW5jb2RpbmcpIHsKLSAgICBwYXJ0RW5jb2RpbmdfID0gcGFydEVuY29kaW5nOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRQYXJ0RW5jb2RpbmcoKSB7Ci0gICAgcmV0dXJuIHBhcnRFbmNvZGluZ187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc1dTRExQYXJ0KGJvb2xlYW4gaXNXU0RMUGFydCkgewotICAgIGlzV1NETFBhcnRfID0gaXNXU0RMUGFydDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldElzV1NETFBhcnQoKSB7Ci0gICAgcmV0dXJuIGlzV1NETFBhcnRfOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRXU0RMUGFydE5hbWUoU3RyaW5nIHdzZGxQYXJ0TmFtZSkgewotICAgIHdzZGxQYXJ0TmFtZV8gPSB3c2RsUGFydE5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFBhcnROYW1lKCkgewotICAgIHJldHVybiB3c2RsUGFydE5hbWVfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RUb0ZyYWdtZW50Q29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvWFNEVG9GcmFnbWVudENvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmOTM0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RUb0ZyYWdtZW50Q29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuKjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciB7Ci0gIHByaXZhdGUgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIHdzZGxUb1hTRE1hcHBlcl87Ci0gIHByaXZhdGUgWFNETGl0ZXJhbFhNTEVuY29kaW5nVG9GcmFnbWVudE1hcHBlciB4c2RMaXRlcmFsTWFwcGVyXzsKLSAgcHJpdmF0ZSBYU0RTT0FQRW5jb2RpbmdUb0ZyYWdtZW50TWFwcGVyIHhzZFNvYXBNYXBwZXJfOwotICBwcml2YXRlIEhhc2h0YWJsZSB4c2RUb0ZyYWdtZW50Q2FjaGVfOwotCi0gIHB1YmxpYyBYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpIHsKLSAgICB3c2RsVG9YU0RNYXBwZXJfID0gbnVsbDsKLSAgICB4c2RMaXRlcmFsTWFwcGVyXyA9IG51bGw7Ci0gICAgeHNkU29hcE1hcHBlcl8gPSBudWxsOwotICAgIHhzZFRvRnJhZ21lbnRDYWNoZV8gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIHdzZGxUb1hTRE1hcHBlcikgewotICAgIHdzZGxUb1hTRE1hcHBlcl8gPSB3c2RsVG9YU0RNYXBwZXI7Ci0gIH0KLQotICBwdWJsaWMgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyIGdldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcigpIHsKLSAgICByZXR1cm4gd3NkbFRvWFNETWFwcGVyXzsKLSAgfQotCi0gIHByaXZhdGUgWFNETGl0ZXJhbFhNTEVuY29kaW5nVG9GcmFnbWVudE1hcHBlciBnZXRYU0RMaXRlcmFsTWFwcGVyKCkgewotICAgIGlmICh4c2RMaXRlcmFsTWFwcGVyXyA9PSBudWxsKQotICAgICAgeHNkTGl0ZXJhbE1hcHBlcl8gPSBuZXcgWFNETGl0ZXJhbFhNTEVuY29kaW5nVG9GcmFnbWVudE1hcHBlcih0aGlzLCB3c2RsVG9YU0RNYXBwZXJfKTsKLSAgICByZXR1cm4geHNkTGl0ZXJhbE1hcHBlcl87Ci0gIH0KLQotICBwcml2YXRlIFhTRFNPQVBFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIgZ2V0WFNEU09BUE1hcHBlcigpIHsKLSAgICBpZiAoeHNkU29hcE1hcHBlcl8gPT0gbnVsbCkKLSAgICAgIHhzZFNvYXBNYXBwZXJfID0gbmV3IFhTRFNPQVBFbmNvZGluZ1RvRnJhZ21lbnRNYXBwZXIodGhpcywgd3NkbFRvWFNETWFwcGVyXyk7Ci0gICAgcmV0dXJuIHhzZFNvYXBNYXBwZXJfOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBJWFNERnJhZ21lbnQgZnJhZyA9IGdldENhY2hlZEZyYWdtZW50KGlkKTsKLSAgICBpZiAoZnJhZyAhPSBudWxsKQotICAgICAgcmV0dXJuIGZyYWc7Ci0gICAgZnJhZyA9IGdldE5ld0ZyYWdtZW50KGNvbmZpZywgaWQsIG5hbWUpOwotICAgIGlmIChmcmFnICE9IG51bGwpCi0gICAgICBhZGRUb0NhY2hlKGlkLCBmcmFnKTsKLSAgICByZXR1cm4gZnJhZzsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnQgZ2V0Q2FjaGVkRnJhZ21lbnQoU3RyaW5nIGlkKSB7Ci0gICAgcmV0dXJuIChJWFNERnJhZ21lbnQpeHNkVG9GcmFnbWVudENhY2hlXy5nZXQoaWQpOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXROZXdGcmFnbWVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICBzd2l0Y2ggKGNvbmZpZy5nZXRQYXJ0RW5jb2RpbmcoKSkKLSAgICB7Ci0gICAgICBjYXNlIEZyYWdtZW50Q29uc3RhbnRzLkVOQ09ESU5HX1NPQVA6Ci0gICAgICAgIHJldHVybiBnZXRYU0RTT0FQTWFwcGVyKCkuZ2V0RnJhZ21lbnQoY29uZmlnLGlkLG5hbWUpOyAgICAgIAotICAgICAgY2FzZSBGcmFnbWVudENvbnN0YW50cy5FTkNPRElOR19MSVRFUkFMOgotICAgICAgY2FzZSBGcmFnbWVudENvbnN0YW50cy5FTkNPRElOR19VUkw6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZ2V0WFNETGl0ZXJhbE1hcHBlcigpLmdldEZyYWdtZW50KGNvbmZpZyxpZCxuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRUb0NhY2hlKFN0cmluZyBpZCwgSVhTREZyYWdtZW50IGZyYWcpIHsKLSAgICB4c2RUb0ZyYWdtZW50Q2FjaGVfLnB1dChpZCwgZnJhZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVGcm9tQ2FjaGUoU3RyaW5nIGlkKSB7Ci0gICAgeHNkVG9GcmFnbWVudENhY2hlXy5yZW1vdmUoaWQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZW1wdHlDYWNoZSgpIHsKLSAgICB4c2RUb0ZyYWdtZW50Q2FjaGVfLmNsZWFyKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFRvRnJhZ21lbnRNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L1hTRFRvRnJhZ21lbnRNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhMWIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9YU0RUb0ZyYWdtZW50TWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnhzZC5XU0RMUGFydHNUb1hTRFR5cGVNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTRFRvRnJhZ21lbnRNYXBwZXIgewotICBwcml2YXRlIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXJfOwotICBwcml2YXRlIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXJfOwotCi0gIHB1YmxpYyBYU0RUb0ZyYWdtZW50TWFwcGVyKFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlciB3c2RsVG9YU0RNYXBwZXIpIHsKLSAgICBjb250cm9sbGVyXyA9IGNvbnRyb2xsZXI7Ci0gICAgd3NkbFRvWFNETWFwcGVyXyA9IHdzZGxUb1hTRE1hcHBlcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvbnRyb2xsZXIoWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKLSAgfQotCi0gIHB1YmxpYyBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBnZXRDb250cm9sbGVyKCkgewotICAgIHJldHVybiBjb250cm9sbGVyXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcihXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIgd3NkbFRvWFNETWFwcGVyKSB7Ci0gICAgd3NkbFRvWFNETWFwcGVyXyA9IHdzZGxUb1hTRE1hcHBlcjsKLSAgfQotCi0gIHB1YmxpYyBXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIgZ2V0V1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkgewotICAgIHJldHVybiB3c2RsVG9YU0RNYXBwZXJfOwotICB9Ci0KLSAgcHJvdGVjdGVkIElYU0RGcmFnbWVudCBnZXRYU0REZWZhdWx0RnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgWFNEQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IGNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IG5hbWU7Ci0gICAgaWYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KSB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50TmFtZUNvcHkgPSAoKFhTRE5hbWVkQ29tcG9uZW50KXhzZENvbXBvbmVudCkuZ2V0TmFtZSgpOwotICAgICAgaWYgKGNvbXBvbmVudE5hbWVDb3B5ICE9IG51bGwgJiYgY29tcG9uZW50TmFtZUNvcHkubGVuZ3RoKCkgPiAwKQotICAgICAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZUNvcHk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgWFNERGVmYXVsdEZyYWdtZW50KGlkLCBuYW1lLCBjb25maWcpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElYU0RGcmFnbWVudCBnZXRYU0RFbXB0eUZyYWdtZW50KFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBuZXcgWFNERW1wdHlGcmFnbWVudChpZCwgbmFtZSwgY29uZmlnKTsKLSAgfQotCi0gIHB1YmxpYyBhYnN0cmFjdCBJWFNERnJhZ21lbnQgZ2V0RnJhZ21lbnQoWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKTsKLQotICBwcm90ZWN0ZWQgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gcmVzb2x2ZVhTRENvbXBvbmVudChYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpCi0gIHsKLSAgICBYU0RDb21wb25lbnQgY29tcG9uZW50ID0gY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIGlmICghaXNDb21wb25lbnRSZXNvbHZhYmxlKGNvbXBvbmVudCkgJiYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KSkKLSAgICB7Ci0gICAgICBYU0RDb21wb25lbnQgcmVzb2x2ZWRDb21wb25lbnQgPSBnZXRXU0RMUGFydHNUb1hTRFR5cGVNYXBwZXIoKS5yZXNvbHZlWFNETmFtZWRDb21wb25lbnQoKFhTRE5hbWVkQ29tcG9uZW50KWNvbXBvbmVudCk7Ci0gICAgICBpZiAocmVzb2x2ZWRDb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgY29uZmlnLnNldFhTRENvbXBvbmVudChyZXNvbHZlZENvbXBvbmVudCk7Ci0gICAgfQotICAgIHJldHVybiBjb25maWc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbXBvbmVudFJlc29sdmFibGUoWFNEQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gY29tcG9uZW50LmdldFNjaGVtYSgpOwotICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxNzAwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL0ZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSUZyYWdtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZyYWdtZW50IGltcGxlbWVudHMgSUZyYWdtZW50IHsKLSAgcHJpdmF0ZSBTdHJpbmcgaWRfOwotICBwcml2YXRlIFN0cmluZyBuYW1lXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgcGFyYW1zXzsKLQotICBwdWJsaWMgRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIGlkXyA9IGlkOwotICAgIG5hbWVfID0gbmFtZTsKLSAgICBwYXJhbXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGlkKSB7Ci0gICAgaWRfID0gaWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElEKCkgewotICAgIHJldHVybiBpZF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24gewotICAgIFN0cmluZ1tdIHBhcmFtcyA9IHBhcnNlci5nZXRQYXJhbWV0ZXJWYWx1ZXMoZ2V0SUQoKSk7Ci0gICAgc2V0UGFyYW1ldGVyVmFsdWVzKGdldElEKCksIHBhcmFtcyk7Ci0gICAgcmV0dXJuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5LCBTdHJpbmdbXSBwYXJhbXMpIHsKLSAgICBpZiAocGFyYW1zID09IG51bGwpCi0gICAgICBwYXJhbXNfLnJlbW92ZShwYXJhbUtleSk7Ci0gICAgZWxzZQotICAgICAgcGFyYW1zXy5wdXQocGFyYW1LZXksIHBhcmFtcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5LCBWZWN0b3IgcGFyYW1zKSB7Ci0gICAgaWYgKHBhcmFtcyA9PSBudWxsKQotICAgICAgcGFyYW1zXy5yZW1vdmUocGFyYW1LZXkpOwotICAgIGVsc2UgewotICAgICAgU3RyaW5nW10gcGFyYW1zQXJyYXkgPSBuZXcgU3RyaW5nW3BhcmFtcy5zaXplKCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXNBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICBwYXJhbXNBcnJheVtpXSA9IHBhcmFtcy5nZXQoaSkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHNldFBhcmFtZXRlclZhbHVlcyhwYXJhbUtleSwgcGFyYW1zQXJyYXkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KSB7Ci0gICAgcmV0dXJuIChTdHJpbmdbXSlwYXJhbXNfLmdldChwYXJhbUtleSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclZhbHVlKFN0cmluZyBwYXJhbUtleSwgaW50IHBhcmFtSW5kZXgpIHsKLSAgICBTdHJpbmdbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXkpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCAmJiBwYXJhbUluZGV4IDwgcGFyYW1zLmxlbmd0aCkKLSAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1JbmRleF07Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpIHsKLSAgICBFbnVtZXJhdGlvbiBwYXJhbUtleXMgPSBwYXJhbXNfLmtleXMoKTsKLSAgICB3aGlsZSAocGFyYW1LZXlzICE9IG51bGwgJiYgcGFyYW1LZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICBpZiAoIXZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKChTdHJpbmcpcGFyYW1LZXlzLm5leHRFbGVtZW50KCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KSB7Ci0gICAgU3RyaW5nW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtS2V5KTsKLSAgICBmb3IgKGludCBpID0gMDsgcGFyYW1zICE9IG51bGwgJiYgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKCF2YWxpZGF0ZVBhcmFtZXRlclZhbHVlKHBhcmFtS2V5LCBpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1NPQVBFbmNBcnJheUZpeEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1NPQVBFbmNBcnJheUZpeEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NDU5ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9TT0FQRW5jQXJyYXlGaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRW5jQXJyYXlGaXhGcmFnbWVudCBleHRlbmRzIFNPQVBFbmNBcnJheUZyYWdtZW50IHsKLSAgcHVibGljIFNPQVBFbmNBcnJheUZpeEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlciwgeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheVJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvU09BUEVuY0FycmF5Rml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY0FycmF5RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY0FycmF5RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzYzllMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1NPQVBFbmNBcnJheUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklTT0FQRW5jQXJyYXlGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNPQVBFbmNBcnJheUZyYWdtZW50IGV4dGVuZHMgWFNER3JvdXBTZXFGcmFnbWVudCBpbXBsZW1lbnRzIElTT0FQRW5jQXJyYXlGcmFnbWVudAotewotICBwdWJsaWMgU09BUEVuY0FycmF5RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApCi0gIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyLCB4c2RNb2RlbEdyb3VwKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpCi0gIHsKLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gZ2V0SW5zdGFuY2VEb2N1bWVudHNCeVRhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHMsIGdldE5hbWUoKSk7Ci0gICAgcmVtb3ZlR3JvdXBJRHMoKTsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gaW50ZXJuYWxFcXVhbHMoaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBpbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSVhTREZyYWdtZW50IHNvYXBFbmNBcnJheVR5cGVGcmFnID0gKGdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGNyZWF0ZVNPQVBFbmNBcnJheUluc3RhbmNlKCkpKVswXTsKLSAgICAgIFZlY3RvciBpbnN0YW5jZXNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBOb2RlTGlzdCBubCA9IGluc3RhbmNlRG9jdW1lbnRzQ29weVtpXS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5sLmdldExlbmd0aCgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaik7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICBpbnN0YW5jZXNWZWN0b3IuYWRkKG5vZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIEVsZW1lbnRbXSBjaGlsZEluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbaW5zdGFuY2VzVmVjdG9yLnNpemUoKV07Ci0gICAgICBpbnN0YW5jZXNWZWN0b3IuY29weUludG8oY2hpbGRJbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgICBpZiAoIXNvYXBFbmNBcnJheVR5cGVGcmFnLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhzZXRFbGVtZW50c1RhZ05hbWUoY2hpbGRJbnN0YW5jZURvY3VtZW50cywgc29hcEVuY0FycmF5VHlwZUZyYWcuZ2V0TmFtZSgpKSkpCi0gICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBTdHJpbmdbXSBncm91cElEcyA9IGdldEdyb3VwSURzKCk7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnQgPSBuZXcgRWxlbWVudFtncm91cElEcy5sZW5ndGhdOwotICAgIFN0cmluZ0J1ZmZlciBhdHRyTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmdCdWZmZXIgYXR0clZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIFN0cmluZ0J1ZmZlciBhdHRyQXJyYXlUeXBlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmdCdWZmZXIgYXR0ckFycmF5VHlwZVZhbHVlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgbnVtSW5zdGFuY2VzID0gMDsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRbaV0gPSBkb2MuY3JlYXRlRWxlbWVudChnZXRJbnN0YW5jZURvY3VtZW50VGFnTmFtZShuYW1lc3BhY2VUYWJsZSkpOwotICAgICAgSVhTREZyYWdtZW50IGZyYWdtZW50ID0gKGdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGdyb3VwSURzW2ldKSlbMF07Ci0gICAgICBFbGVtZW50W10gZnJhZ21lbnRJbnN0YW5jZURvY3VtZW50cyA9IGZyYWdtZW50Lmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgZG9jKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZnJhZ21lbnRJbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGZyYWdtZW50SW5zdGFuY2VEb2N1bWVudHNbal0gIT0gbnVsbCkKLSAgICAgICAgICBpbnN0YW5jZURvY3VtZW50W2ldLmFwcGVuZENoaWxkKGZyYWdtZW50SW5zdGFuY2VEb2N1bWVudHNbal0pOwotICAgICAgICBudW1JbnN0YW5jZXMrKzsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBzb2FwVVJJID0gRnJhZ21lbnRDb25zdGFudHMuVVJJX1NPQVA7Ci0gICAgICBTdHJpbmcgc29hcFByZWZpeCA9IGdldFByZWZpeEZyb21OYW1lc3BhY2VVUkkoc29hcFVSSSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgU3RyaW5nIHNvYXBFbmNBcnJheVR5cGVVUkkgPSBnZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgU3RyaW5nIHNvYXBFbmNBcnJheVR5cGVQcmVmaXggPSBnZXRQcmVmaXhGcm9tTmFtZXNwYWNlVVJJKHNvYXBFbmNBcnJheVR5cGVVUkksIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIC8vIFNldCB0aGUgYXJyYXlUeXBlIGF0dHJpYnV0ZQotICAgICAgYXR0ck5hbWUuc2V0TGVuZ3RoKDApOwotICAgICAgYXR0ck5hbWUuc2V0TGVuZ3RoKDApOwotICAgICAgYXR0ck5hbWUuYXBwZW5kKHNvYXBQcmVmaXgpOwotICAgICAgYXR0ck5hbWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICAgIGF0dHJOYW1lLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5TT0FQX0VOQ19BUlJBWV9UWVBFKTsKLSAgICAgIGF0dHJWYWx1ZS5zZXRMZW5ndGgoMCk7Ci0gICAgICBhdHRyVmFsdWUuYXBwZW5kKHNvYXBFbmNBcnJheVR5cGVQcmVmaXgpOwotICAgICAgYXR0clZhbHVlLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5DT0xPTik7Ci0gICAgICBhdHRyVmFsdWUuYXBwZW5kKGdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0TmFtZSgpKTsKLSAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuTEVGVF9TUVVBUkVfQlJBQ0tFVCk7Ci0gICAgICBhdHRyVmFsdWUuYXBwZW5kKG51bUluc3RhbmNlcyk7Ci0gICAgICBhdHRyVmFsdWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlJJR0hUX1NRVUFSRV9CUkFDS0VUKTsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRbaV0uc2V0QXR0cmlidXRlKGF0dHJOYW1lLnRvU3RyaW5nKCksIGF0dHJWYWx1ZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKGdlblhTSVR5cGUpCi0gICAgewotLy8JICBUT0RPOiBVc2VkIHRvIGNhbGwgdGhlIHBsdWdpbidzIGlnbm9yZVNjaGVtYUZvclNPQVBBcnJheXMoKW1ldGhvZC4KLQkgIGJvb2xlYW4gaWdub3JlU2NoZW1hRm9yU09BUEFycmF5cyA9IHRydWU7Ci0gICAgICBpZiAoaWdub3JlU2NoZW1hRm9yU09BUEFycmF5cykKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHhzaVVSSSA9IEZyYWdtZW50Q29uc3RhbnRzLlVSSV9YU0k7Ci0gICAgICAgICAgU3RyaW5nIHhzaVByZWZpeCA9IGdldFByZWZpeEZyb21OYW1lc3BhY2VVUkkoeHNpVVJJLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgICAgU3RyaW5nIHhzaVR5cGVVUkkgPSBGcmFnbWVudENvbnN0YW50cy5VUklfU09BUDsKLSAgICAgICAgICBTdHJpbmcgeHNpVHlwZVByZWZpeCA9IGdldFByZWZpeEZyb21OYW1lc3BhY2VVUkkoeHNpVHlwZVVSSSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgICAgIGF0dHJOYW1lLnNldExlbmd0aCgwKTsKLSAgICAgICAgICBhdHRyTmFtZS5hcHBlbmQoeHNpUHJlZml4KS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuQ09MT04pLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5YU0lfVFlQRSk7Ci0gICAgICAgICAgYXR0clZhbHVlLnNldExlbmd0aCgwKTsKLSAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKHhzaVR5cGVQcmVmaXgpLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5DT0xPTik7Ci0gICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5RTkFNRV9MT0NBTF9OQU1FX0FSUkFZKTsKLSAgICAgICAgICBpbnN0YW5jZURvY3VtZW50W2ldLnNldEF0dHJpYnV0ZShhdHRyTmFtZS50b1N0cmluZygpLCBhdHRyVmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGFkZFhTSVR5cGUoaW5zdGFuY2VEb2N1bWVudCwgbmFtZXNwYWNlVGFibGUpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2VEb2N1bWVudDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlU09BUEVuY0FycmF5SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGdldFhTRFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZ3JvdXBJRCA9IGdlbklEKCk7Ci0gICAgICBTdHJpbmdbXSBncm91cE1lbWJlcklEID0ge2dlbklEKCl9OwotICAgICAgaW50IG1pbk9jY3VycyA9IDA7Ci0gICAgICBpbnQgbWF4T2NjdXJzID0gRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEOwotICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbnVsbDsKLSAgICAgIGlmIChnZXRYU0RNb2RlbEdyb3VwKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgWFNEUGFydGljbGUgZ3JvdXBPd25lciA9IChYU0RQYXJ0aWNsZSlnZXRYU0RNb2RlbEdyb3VwKCkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGludCBncm91cE1pbiA9IGdyb3VwT3duZXIuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgIGludCBncm91cE1heCA9IGdyb3VwT3duZXIuZ2V0TWF4T2NjdXJzKCk7Ci0gICAgICAgIGludCBlbGVtZW50TWluID0gMDsKLSAgICAgICAgaW50IGVsZW1lbnRNYXggPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQ7Ci0gICAgICAgIEVMaXN0IHhzZFBhcnRpY2xlcyA9IGdldFhTRE1vZGVsR3JvdXAoKS5nZXRQYXJ0aWNsZXMoKTsKLSAgICAgICAgaWYgKHhzZFBhcnRpY2xlcy5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUGFydGljbGVDb250ZW50IHhzZFBhcnRpY2xlQ29udGVudCA9ICgoWFNEUGFydGljbGUpeHNkUGFydGljbGVzLmdldCgwKSkuZ2V0Q29udGVudCgpOwotICAgICAgICAgIGlmICh4c2RQYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgZWxlbWVudERlY2wgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKXhzZFBhcnRpY2xlQ29udGVudDsKLSAgICAgICAgICAgIFhTRFBhcnRpY2xlIGVsZW1lbnRPd25lciA9IChYU0RQYXJ0aWNsZSllbGVtZW50RGVjbC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgICAgIGVsZW1lbnRNaW4gPSBlbGVtZW50T3duZXIuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICAgICAgICBlbGVtZW50TWF4ID0gZWxlbWVudE93bmVyLmdldE1heE9jY3VycygpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZ3JvdXBNaW4gPj0gMCAmJiBlbGVtZW50TWluID49IDApCi0gICAgICAgICAgbWluT2NjdXJzID0gZ3JvdXBNaW4gKiBlbGVtZW50TWluOwotICAgICAgICBpZiAoZ3JvdXBNYXggPj0gMCAmJiBncm91cE1heCAhPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQgJiYgZWxlbWVudE1heCA+PSAwICYmIGVsZW1lbnRNYXggIT0gRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEKQotICAgICAgICAgIG1heE9jY3VycyA9IGdyb3VwTWF4ICogZWxlbWVudE1heDsKLSAgICAgIH0KLSAgICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHRoaXNDb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICB4c2RDb25maWcuc2V0WFNEQ29tcG9uZW50KGdldFhTRFR5cGVEZWZpbml0aW9uKCkpOwotICAgICAgeHNkQ29uZmlnLnNldE1pbk9jY3VycyhtaW5PY2N1cnMpOwotICAgICAgeHNkQ29uZmlnLnNldE1heE9jY3VycyhtYXhPY2N1cnMpOwotICAgICAgeHNkQ29uZmlnLnNldFN0eWxlKHRoaXNDb25maWcuZ2V0U3R5bGUoKSk7Ci0gICAgICB4c2RDb25maWcuc2V0UGFydEVuY29kaW5nKHRoaXNDb25maWcuZ2V0UGFydEVuY29kaW5nKCkpOwotICAgICAgeHNkQ29uZmlnLnNldFdTRExQYXJ0TmFtZSh0aGlzQ29uZmlnLmdldFdTRExQYXJ0TmFtZSgpKTsKLSAgICAgIFN0cmluZyBuYW1lID0gKGVsZW1lbnREZWNsICE9IG51bGwpID8gZWxlbWVudERlY2wuZ2V0TmFtZSgpIDogZ2V0WFNEVHlwZURlZmluaXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICBJWFNERnJhZ21lbnQgZnJhZyA9IGdldFhTRFRvRnJhZ21lbnRDb250cm9sbGVyKCkuZ2V0RnJhZ21lbnQoeHNkQ29uZmlnLCBncm91cE1lbWJlcklEWzBdLCBuYW1lKTsKLSAgICAgIGFkZEZyYWdtZW50KGdyb3VwTWVtYmVySURbMF0sIGZyYWcpOwotICAgICAgc2V0R3JvdXBNZW1iZXJJRHMoZ3JvdXBJRCwgZ3JvdXBNZW1iZXJJRCk7Ci0gICAgICByZXR1cm4gZ3JvdXBJRDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUdyb3VwU2VxSW5zdGFuY2UoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZVNPQVBFbmNBcnJheUluc3RhbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVTT0FQRW5jQXJyYXlJbnN0YW5jZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1NPQVBFbmNBcnJheVJhbmdlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY0FycmF5UmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc3ZWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY0FycmF5UmFuZ2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRW5jQXJyYXlSYW5nZUZyYWdtZW50IGV4dGVuZHMgU09BUEVuY0FycmF5RnJhZ21lbnQgewotICBwdWJsaWMgU09BUEVuY0FycmF5UmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIsIHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9TT0FQRW5jQXJyYXlSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheVJhbmdlV0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1NPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmQyMGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGNsYXNzIFNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudCBleHRlbmRzIFhTRERlbGVnYXRpb25GcmFnbWVudCBpbXBsZW1lbnRzIElTT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImlkIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhSRUYgPSAiaHJlZiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1VORCA9ICIjIjsKLQotICBwcml2YXRlIEhhc2h0YWJsZSB1cmlSZWZlcmVuY2VUYWJsZV87Ci0KLSAgcHVibGljIFNPQVBFbmNvZGluZ1dyYXBwZXJGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpCi0gIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgbnVsbCk7Ci0gICAgdXJpUmVmZXJlbmNlVGFibGVfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykKLSAgewotICAgIGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLnNldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0gIH0KLQotICBwdWJsaWMgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmKQotICB7Ci0gICAgZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCkuc2V0WFNEVHlwZURlZmluaXRpb24odHlwZURlZik7Ci0gIH0KLQotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZURlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLmdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2ldID0gcmVzb2x2ZVVSSVJlZmVyZW5jZXModXJpUmVmZXJlbmNlVGFibGVfLCBpbnN0YW5jZURvY3VtZW50c1tpXSk7Ci0gICAgcmV0dXJuIGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhpbnN0YW5jZURvY3VtZW50cyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVUklSZWZlcmVuY2VzKEhhc2h0YWJsZSB1cmlSZWZlcmVuY2VzKQotICB7Ci0gICAgdXJpUmVmZXJlbmNlVGFibGVfID0gdXJpUmVmZXJlbmNlczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIHBhcnNlVVJJUmVmZXJlbmNlcyhFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlcykKLSAgewotICAgIEhhc2h0YWJsZSB1cmlSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHBhcnNlVVJJUmVmZXJlbmNlcyh1cmlSZWZlcmVuY2VzLCBlbGVtZW50LCBvdmVyd3JpdGVzKTsKLSAgICByZXR1cm4gdXJpUmVmZXJlbmNlczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGFyc2VVUklSZWZlcmVuY2VzKEhhc2h0YWJsZSB1cmlSZWZlcmVuY2VzLCBFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gb3ZlcndyaXRlcykKLSAgewotICAgIGJvb2xlYW4gcmVzb2x2ZWQgPSB0cnVlOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgVVJJUmVmZXJlbmNlIHJlZiA9IG51bGw7Ci0gICAgICBTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShJRCk7Ci0gICAgICByZXNvbHZlZCA9ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShIUkVGKTsKLSAgICAgIGlmIChpZCAhPSBudWxsICYmIGlkLmxlbmd0aCgpID4gMCAmJiAob3ZlcndyaXRlcyB8fCAhdXJpUmVmZXJlbmNlcy5jb250YWlucyhpZCkpKQotICAgICAgewotICAgICAgICByZWYgPSBuZXcgVVJJUmVmZXJlbmNlKGVsZW1lbnQsIHRydWUpOwotICAgICAgICB1cmlSZWZlcmVuY2VzLnB1dChpZCwgcmVmKTsKLSAgICAgIH0KLSAgICAgIE5vZGVMaXN0IG5sID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICByZXNvbHZlZCA9IHBhcnNlVVJJUmVmZXJlbmNlcyh1cmlSZWZlcmVuY2VzLCAoRWxlbWVudClub2RlLCBvdmVyd3JpdGVzKSAmJiByZXNvbHZlZDsKLSAgICAgIH0KLSAgICAgIGlmIChyZWYgIT0gbnVsbCkKLSAgICAgICAgcmVmLnNldFJlc29sdmVkKHJlc29sdmVkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc29sdmVkOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBFbGVtZW50IHJlc29sdmVVUklSZWZlcmVuY2VzKEhhc2h0YWJsZSB1cmlSZWZlcmVuY2VzLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAodXJpUmVmZXJlbmNlcyAhPSBudWxsICYmICF1cmlSZWZlcmVuY2VzLmlzRW1wdHkoKSkKLSAgICAgIHJldHVybiByZXNvbHZlVVJJUmVmZXJlbmNlcyh1cmlSZWZlcmVuY2VzLCBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgZWxlbWVudCwgbmV3IFZlY3RvcigpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEVsZW1lbnQgcmVzb2x2ZVVSSVJlZmVyZW5jZXMoSGFzaHRhYmxlIHVyaVJlZmVyZW5jZXMsIERvY3VtZW50IGRvYywgRWxlbWVudCBlbGVtZW50LCBWZWN0b3IgdXNlZElkcykKLSAgewotICAgIFN0cmluZyBocmVmID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSFJFRik7Ci0gICAgRWxlbWVudCByZXNvbHZlZEVsZW1lbnQgPSBlbGVtZW50OwotICAgIGJvb2xlYW4gcmVzb2x2ZWQgPSBmYWxzZTsKLSAgICBpZiAoaHJlZiAhPSBudWxsICYmIGhyZWYubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIFVSSVJlZmVyZW5jZSByZWYgPSBudWxsOwotICAgICAgaWYgKGhyZWYuaW5kZXhPZihQT1VORCkgIT0gLTEpCi0gICAgICAgIGhyZWYgPSBocmVmLnN1YnN0cmluZygxLCBocmVmLmxlbmd0aCgpKTsKLSAgICAgIGlmICghdXNlZElkcy5jb250YWlucyhocmVmKSkKLSAgICAgIHsKLSAgICAgICAgcmVmID0gKFVSSVJlZmVyZW5jZSl1cmlSZWZlcmVuY2VzLmdldChocmVmKTsKLSAgICAgICAgaWYgKHJlZiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdXNlZElkcy5hZGQoaHJlZik7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50UmVmID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLSAgICAgICAgICByZXNvbHZlZCA9IHJlZi5nZXRSZXNvbHZlZCgpOwotICAgICAgICAgIHJlc29sdmVkRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KGVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLSAgICAgICAgICBOb2RlTGlzdCBubCA9IGVsZW1lbnRSZWYuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBubC5pdGVtKGkpOwotICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgcmVzb2x2ZWRFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKG5vZGUsIHRydWUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFyZXNvbHZlZCkKLSAgICB7Ci0gICAgICBOb2RlTGlzdCBubCA9IHJlc29sdmVkRWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgY2hpbGQgPSByZXNvbHZlVVJJUmVmZXJlbmNlcyh1cmlSZWZlcmVuY2VzLCByZXNvbHZlZEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCAoRWxlbWVudClub2RlLCB1c2VkSWRzKTsKLQkJICBpZiAoY2hpbGQgIT0gbm9kZSkKLSAgICAgICAgICAgIHJlc29sdmVkRWxlbWVudC5yZXBsYWNlQ2hpbGQoY2hpbGQsIG5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChocmVmICE9IG51bGwpCi0gICAgICB1c2VkSWRzLnJlbW92ZShocmVmKTsKLSAgICByZXR1cm4gcmVzb2x2ZWRFbGVtZW50OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVVJJUmVmZXJlbmNlCi0gIHsKLSAgICBwcml2YXRlIEVsZW1lbnQgcmVmXzsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZWRfOwotCi0gICAgcHVibGljIFVSSVJlZmVyZW5jZShFbGVtZW50IHJlZiwgYm9vbGVhbiByZXNvbHZlZCkKLSAgICB7Ci0gICAgICByZWZfID0gcmVmOwotICAgICAgcmVzb2x2ZWRfID0gcmVzb2x2ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0UmVmRWxlbWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIHJlZl87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVmRWxlbWVudChFbGVtZW50IHJlZikKLSAgICB7Ci0gICAgICByZWZfID0gcmVmOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldFJlc29sdmVkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcmVzb2x2ZWRfOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc29sdmVkKGJvb2xlYW4gcmVzb2x2ZWQpCi0gICAgewotICAgICAgcmVzb2x2ZWRfID0gcmVzb2x2ZWQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRENvbXBsZXhGaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RDb21wbGV4Rml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzZmQwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRENvbXBsZXhGaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RDb21wbGV4Rml4RnJhZ21lbnQgZXh0ZW5kcyBYU0RDb21wbGV4RnJhZ21lbnQgewotICBwdWJsaWMgWFNEQ29tcGxleEZpeEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4UkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4Rml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRENvbXBsZXhGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDEyZjgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTRENvbXBsZXhGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC5YU0RUeXBlRGVmaW5pdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0ROYW1lZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhGaW5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTRENvbXBsZXhGcmFnbWVudCBleHRlbmRzIFhTRE1hcEZyYWdtZW50IGltcGxlbWVudHMgSVhTRENvbXBsZXhGcmFnbWVudAotewotICBwdWJsaWMgWFNEQ29tcGxleEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykKLSAgewotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBnZXRJbnN0YW5jZURvY3VtZW50c0J5VGFnTmFtZShpbnN0YW5jZURvY3VtZW50cywgZ2V0TmFtZSgpKTsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gaW50ZXJuYWxFcXVhbHMoaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBpbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbilnZXRYU0RUeXBlRGVmaW5pdGlvbigpOwotICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4VHlwZUNvbnRlbnQgPSBYU0RUeXBlRGVmaW5pdGlvblV0aWwuZ2V0WFNEQ29tcGxleFR5cGVDb250ZW50KGNvbXBsZXhUeXBlKTsKLSAgICBpZiAoY29tcGxleFR5cGVDb250ZW50IGluc3RhbmNlb2YgWFNEVHlwZURlZmluaXRpb24pCi0gICAgICByZXR1cm4gc2V0UGFyYW1zRm9yWFNEVHlwZURlZihpbnN0YW5jZURvY3VtZW50c0NvcHkpICYmIHBhcmFtc1ZhbGlkOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBzZXRQYXJhbXNGb3JYU0RQYXJ0aWNsZShpbnN0YW5jZURvY3VtZW50c0NvcHkpICYmIHBhcmFtc1ZhbGlkOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHNldFBhcmFtc0ZvclhTRFR5cGVEZWYoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKQotICB7Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IHRydWU7Ci0gICAgcmVtb3ZlQWxsRnJhZ21lbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJWFNERnJhZ21lbnQgY2hpbGRGcmFnID0gZ2V0RnJhZ21lbnQoY3JlYXRlSW5zdGFuY2UoKSk7Ci0gICAgICBFbGVtZW50W10gY2hpbGRJbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50WzFdOwotICAgICAgY2hpbGRJbnN0YW5jZURvY3VtZW50c1swXSA9IGluc3RhbmNlRG9jdW1lbnRzW2ldOwotICAgICAgaWYgKCFjaGlsZEZyYWcuc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKHNldEVsZW1lbnRzVGFnTmFtZShjaGlsZEluc3RhbmNlRG9jdW1lbnRzLCBjaGlsZEZyYWcuZ2V0TmFtZSgpKSkpCi0gICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBzZXRQYXJhbXNGb3JYU0RQYXJ0aWNsZShFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpCi0gIHsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gdHJ1ZTsKLSAgICByZW1vdmVBbGxGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElYU0RGcmFnbWVudCBjaGlsZEZyYWcgPSBnZXRGcmFnbWVudChjcmVhdGVJbnN0YW5jZSgpKTsKLSAgICAgIFZlY3RvciBpbnN0YW5jZXNWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBOb2RlTGlzdCBubCA9IGluc3RhbmNlRG9jdW1lbnRzW2ldLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbmwuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbmwuaXRlbShqKTsKLSAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIGluc3RhbmNlc1ZlY3Rvci5hZGQobm9kZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgfQotICAgICAgRWxlbWVudFtdIGNoaWxkSW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFtpbnN0YW5jZXNWZWN0b3Iuc2l6ZSgpXTsKLSAgICAgIGluc3RhbmNlc1ZlY3Rvci5jb3B5SW50byhjaGlsZEluc3RhbmNlRG9jdW1lbnRzKTsKLSAgICAgIGlmICghY2hpbGRGcmFnLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhjaGlsZEluc3RhbmNlRG9jdW1lbnRzKSkKLSAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmFtc1ZhbGlkOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnRbXSBnZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIERvY3VtZW50IGRvYykKLSAgewotICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSA9IChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleFR5cGVDb250ZW50ID0gWFNEVHlwZURlZmluaXRpb25VdGlsLmdldFhTRENvbXBsZXhUeXBlQ29udGVudChjb21wbGV4VHlwZSk7Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzOwotICAgIFN0cmluZyB0YWdOYW1lID0gZ2V0SW5zdGFuY2VEb2N1bWVudFRhZ05hbWUobmFtZXNwYWNlVGFibGUpOwotICAgIGlmIChjb21wbGV4VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzID0gZ2VuSW5zdGFuY2VzRm9yWFNEVHlwZURlZihnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgdGFnTmFtZSwgZG9jKTsKLSAgICBlbHNlCi0gICAgICBpbnN0YW5jZURvY3VtZW50cyA9IGdlbkluc3RhbmNlc0ZvclhTRFBhcnRpY2xlKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCB0YWdOYW1lLCBkb2MpOwotICAgIHJldHVybiAoZ2VuWFNJVHlwZSA/IGFkZFhTSVR5cGUoaW5zdGFuY2VEb2N1bWVudHMsIG5hbWVzcGFjZVRhYmxlKSA6IGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudFtdIGdlbkluc3RhbmNlc0ZvclhTRFR5cGVEZWYoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIFN0cmluZyB0YWdOYW1lLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBJWFNERnJhZ21lbnRbXSBmcmFnbWVudHMgPSBnZXRBbGxGcmFnbWVudHMoKTsKLSAgICBWZWN0b3IgaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnRbXSBmcmFnbWVudEluc3RhbmNlcyA9IGZyYWdtZW50c1tpXS5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsIGRvYyk7Ci0gICAgICBpZiAoZnJhZ21lbnRJbnN0YW5jZXMubGVuZ3RoID4gMCkKLSAgICAgICAgaW5zdGFuY2VEb2N1bWVudHNDb3B5LmFkZChmcmFnbWVudEluc3RhbmNlc1swXSk7Ci0gICAgfQotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2luc3RhbmNlRG9jdW1lbnRzQ29weS5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSAoRWxlbWVudClpbnN0YW5jZURvY3VtZW50c0NvcHkuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RWxlbWVudHNUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCB0YWdOYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudFtdIGdlbkluc3RhbmNlc0ZvclhTRFBhcnRpY2xlKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBTdHJpbmcgdGFnTmFtZSwgRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGdldEFsbEZyYWdtZW50cygpOwotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2NoaWxkRnJhZ3MubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnRbXSBjaGlsZEluc3RhbmNlcyA9IGNoaWxkRnJhZ3NbaV0uZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCBkb2MpOwotICAgICAgRWxlbWVudCBpbnN0YW5jZURvY3VtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkSW5zdGFuY2VzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBpZiAoY2hpbGRJbnN0YW5jZXNbal0gIT0gbnVsbCkKLSAgICAgICAgICBpbnN0YW5jZURvY3VtZW50LmFwcGVuZENoaWxkKGNoaWxkSW5zdGFuY2VzW2pdKTsKLSAgICAgIH0KLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2ldID0gaW5zdGFuY2VEb2N1bWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHJpdmF0ZSBYU0RNb2RlbEdyb3VwIGdldFhTRE1vZGVsR3JvdXAoWFNEUGFydGljbGUgeHNkUGFydGljbGUpCi0gIHsKLSAgICBpZiAoeHNkUGFydGljbGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgeHNkUGFydGljbGVDb250ZW50ID0geHNkUGFydGljbGUuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKHhzZFBhcnRpY2xlQ29udGVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoeHNkUGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmID0gKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKXhzZFBhcnRpY2xlQ29udGVudDsKLSAgICAgICAgICBpZiAoeHNkTW9kZWxHcm91cERlZi5pc01vZGVsR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgICAgICB4c2RNb2RlbEdyb3VwRGVmID0geHNkTW9kZWxHcm91cERlZi5nZXRSZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIHhzZE1vZGVsR3JvdXBEZWYuZ2V0TW9kZWxHcm91cCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHhzZFBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXApCi0gICAgICAgICAgcmV0dXJuIChYU0RNb2RlbEdyb3VwKXhzZFBhcnRpY2xlQ29udGVudDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0SW5oZXJpdGVkUGFydGljbGVzKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZSkKLSAgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChjb21wbGV4VHlwZS5nZXREZXJpdmF0aW9uTWV0aG9kKCkuZ2V0VmFsdWUoKSA9PSBYU0RDb21wbGV4RmluYWwuRVhURU5TSU9OKQotICAgIHsKLSAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGV4dFR5cGUgPSBjb21wbGV4VHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgaWYgKGV4dFR5cGUgIT0gbnVsbCAmJiAhKGV4dFR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZXh0VHlwZS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSA9IGV4dFR5cGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbG9jYWxuYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0ROYW1lZENvbXBvbmVudCB4c2ROYW1lZENvbXAgPSBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldFdTRExQYXJ0c1RvWFNEVHlwZU1hcHBlcigpLmdldFhTRFR5cGVGcm9tU2NoZW1hKG5hbWVzcGFjZSwgbG9jYWxuYW1lLCBmYWxzZSk7Ci0gICAgICAgICAgaWYgKHhzZE5hbWVkQ29tcCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBleHRUeXBlID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil4c2ROYW1lZENvbXA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZXh0VHlwZSAhPSBudWxsICYmIGV4dFR5cGUgIT0gY29tcGxleFR5cGUgJiYgZXh0VHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGV4dFR5cGVDb250ZW50ID0gWFNEVHlwZURlZmluaXRpb25VdGlsLmdldFhTRENvbXBsZXhUeXBlQ29udGVudCgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWV4dFR5cGUpOwotICAgICAgICBpZiAoZXh0VHlwZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgICAgewotICAgICAgICAgIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCA9IGdldFhTRE1vZGVsR3JvdXAoKFhTRFBhcnRpY2xlKWV4dFR5cGVDb250ZW50KTsKLSAgICAgICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHYuYWRkQWxsKGdldEluaGVyaXRlZFBhcnRpY2xlcygoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWV4dFR5cGUpKTsKLSAgICAgICAgICAgIHYuYWRkQWxsKHhzZE1vZGVsR3JvdXAuZ2V0UGFydGljbGVzKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdjsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnYXRoZXJJbmhlcml0ZWRQYXJ0aWNsZXMoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgaWYgKGNvbXBsZXhUeXBlLmdldERlcml2YXRpb25NZXRob2QoKS5nZXRWYWx1ZSgpID09IFhTRENvbXBsZXhGaW5hbC5FWFRFTlNJT04pCi0gICAgewotICAgICAgWFNEQ29tcGxleFR5cGVDb250ZW50IGNvbXBsZXhUeXBlQ29udGVudCA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5nZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoY29tcGxleFR5cGUpOwotICAgICAgaWYgKGNvbXBsZXhUeXBlQ29udGVudCBpbnN0YW5jZW9mIFhTRFBhcnRpY2xlKQotICAgICAgewotICAgICAgICBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXAgPSBnZXRYU0RNb2RlbEdyb3VwKChYU0RQYXJ0aWNsZSljb21wbGV4VHlwZUNvbnRlbnQpOwotICAgICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBpbmhlcml0ZWRQYXJ0aWNsZXMgPSBnZXRJbmhlcml0ZWRQYXJ0aWNsZXMoY29tcGxleFR5cGUpOwotICAgICAgICAgIExpc3QgcGFydGljbGVzID0geHNkTW9kZWxHcm91cC5nZXRQYXJ0aWNsZXMoKTsKLSAgICAgICAgICBwYXJ0aWNsZXMuYWRkQWxsKDAsIGluaGVyaXRlZFBhcnRpY2xlcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbXBsZXhJbnN0YW5jZSgpCi0gIHsKLSAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGUgPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgZ2F0aGVySW5oZXJpdGVkUGFydGljbGVzKGNvbXBsZXhUeXBlKTsKLSAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleFR5cGVDb250ZW50ID0gWFNEVHlwZURlZmluaXRpb25VdGlsLmdldFhTRENvbXBsZXhUeXBlQ29udGVudChjb21wbGV4VHlwZSk7Ci0gICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gdGhpc0NvbmZpZyA9IGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgeHNkQ29uZmlnLnNldFhTRENvbXBvbmVudChjb21wbGV4VHlwZUNvbnRlbnQpOwotICAgIHhzZENvbmZpZy5zZXRTdHlsZSh0aGlzQ29uZmlnLmdldFN0eWxlKCkpOwotICAgIHhzZENvbmZpZy5zZXRQYXJ0RW5jb2RpbmcodGhpc0NvbmZpZy5nZXRQYXJ0RW5jb2RpbmcoKSk7Ci0gICAgeHNkQ29uZmlnLnNldFdTRExQYXJ0TmFtZSh0aGlzQ29uZmlnLmdldFdTRExQYXJ0TmFtZSgpKTsKLSAgICBTdHJpbmcgbmV3SUQgPSBnZW5JRCgpOwotICAgIGFkZEZyYWdtZW50KG5ld0lELCBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldEZyYWdtZW50KHhzZENvbmZpZywgbmV3SUQsIG5ld0lEKSk7Ci0gICAgcmV0dXJuIG5ld0lEOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBjcmVhdGVJbnN0YW5jZSgpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlQ29tcGxleEluc3RhbmNlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleFJhbmdlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEQ29tcGxleFJhbmdlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0NTNjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRENvbXBsZXhSYW5nZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIFhTRENvbXBsZXhSYW5nZUZyYWdtZW50IGV4dGVuZHMgWFNEQ29tcGxleEZyYWdtZW50IHsKLSAgcHVibGljIFhTRENvbXBsZXhSYW5nZUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4UkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4UmFuZ2VXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0REZWZhdWx0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERGVmYXVsdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MWFjYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0REZWZhdWx0RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgWFNERGVmYXVsdEZyYWdtZW50IGV4dGVuZHMgWFNERnJhZ21lbnQgewotICBwdWJsaWMgWFNERGVmYXVsdEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nW10gcGFyYW0gPSBuZXcgU3RyaW5nWzFdOwotICAgIHBhcmFtWzBdID0gcGFyc2VyLmdldFBhcmFtZXRlcihnZXRJRCgpKTsKLSAgICBzZXRQYXJhbWV0ZXJWYWx1ZXMoZ2V0SUQoKSwgcGFyYW0pOwotICAgIHJldHVybiBpc0VsZW1lbnQoYWRkUm9vdEVsZW1lbnQocGFyYW1bMF0pKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFkZFJvb3RFbGVtZW50KFN0cmluZyBlbGVtZW50KSB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHNiLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5ST09UX0VMRU1FTlRfU1RBUlRfVEFHKTsKLSAgICBzYi5hcHBlbmQoZWxlbWVudCk7Ci0gICAgc2IuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLlJPT1RfRUxFTUVOVF9FTkRfVEFHKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnQoU3RyaW5nIGVsZW1lbnRTdHJpbmcpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIChYTUxVdGlscy5zdHJpbmdUb0VsZW1lbnQoZWxlbWVudFN0cmluZykgIT0gbnVsbCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkgewotICAgIFN0cmluZyBwYXJhbSA9IGdldFBhcmFtZXRlclZhbHVlKGdldElEKCksIDApOwotICAgIHJldHVybiAocGFyYW0gPT0gbnVsbCB8fCBpc0VsZW1lbnQoYWRkUm9vdEVsZW1lbnQocGFyYW0pKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpIHsKLSAgICBTdHJpbmcgcGFyYW0gPSBnZXRQYXJhbWV0ZXJWYWx1ZShnZXRJRCgpLCAwKTsKLSAgICByZXR1cm4gKHBhcmFtID09IG51bGwgfHwgaXNFbGVtZW50KGFkZFJvb3RFbGVtZW50KHBhcmFtKSkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgcGFyYW1LZXksIGludCBwYXJhbUluZGV4KSB7Ci0gICAgU3RyaW5nIHBhcmFtID0gZ2V0UGFyYW1ldGVyVmFsdWUoZ2V0SUQoKSwgMCk7Ci0gICAgcmV0dXJuIChwYXJhbSA9PSBudWxsIHx8IGlzRWxlbWVudChhZGRSb290RWxlbWVudChwYXJhbSkpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpIHsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgYm9vbGVhbiBwYXJhbVZhbGlkID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBTdHJpbmcgaW5zdGFuY2VTdHJpbmcgPSBYTUxVdGlscy5zZXJpYWxpemUoaW5zdGFuY2VEb2N1bWVudHNbaV0sIHRydWUpOwotICAgICAgaWYgKGluc3RhbmNlU3RyaW5nICE9IG51bGwgJiYgaW5zdGFuY2VTdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgICAgICBzYi5hcHBlbmQoaW5zdGFuY2VTdHJpbmcpOwotICAgICAgZWxzZQotICAgICAgICBwYXJhbVZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIFN0cmluZ1tdIHBhcmFtID0ge3NiLnRvU3RyaW5nKCl9OwotICAgIHNldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpLCBwYXJhbSk7Ci0gICAgcmV0dXJuIHBhcmFtVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgRG9jdW1lbnQgZG9jKSB7Ci0gICAgU3RyaW5nIHBhcmFtID0gZ2V0UGFyYW1ldGVyVmFsdWUoZ2V0SUQoKSwgMCk7Ci0gICAgaWYgKHBhcmFtID09IG51bGwpCi0gICAgICByZXR1cm4gbmV3IEVsZW1lbnRbMF07Ci0gICAgRWxlbWVudCByb290OwotICAgIHRyeSB7Ci0gICAgICByb290ID0gKEVsZW1lbnQpZG9jLmltcG9ydE5vZGUoWE1MVXRpbHMuc3RyaW5nVG9FbGVtZW50KGFkZFJvb3RFbGVtZW50KHBhcmFtKSksIHRydWUpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgIHJldHVybiBuZXcgRWxlbWVudFswXTsKLSAgICB9Ci0gICAgTm9kZUxpc3QgbmwgPSByb290LmdldENoaWxkTm9kZXMoKTsKLSAgICBWZWN0b3IgaW5zdGFuY2VEb2N1bWVudFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIGluc3RhbmNlRG9jdW1lbnRWZWN0b3IuYWRkKG5vZGUpOwotICAgIH0KLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFtpbnN0YW5jZURvY3VtZW50VmVjdG9yLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSAoRWxlbWVudClpbnN0YW5jZURvY3VtZW50VmVjdG9yLmdldChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0UkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERGVsZWdhdGlvbkZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRERlbGVnYXRpb25GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzAzYzI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERGVsZWdhdGlvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTRERlbGVnYXRpb25GcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0REZWxlZ2F0aW9uRnJhZ21lbnQgZXh0ZW5kcyBYU0RGcmFnbWVudCBpbXBsZW1lbnRzIElYU0REZWxlZ2F0aW9uRnJhZ21lbnQKLXsKLSAgcHJpdmF0ZSBJWFNERnJhZ21lbnQgeHNkRnJhZ21lbnRfOwotCi0gIHB1YmxpYyBYU0REZWxlZ2F0aW9uRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgeHNkRnJhZ21lbnRfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICBzdXBlci5zZXROYW1lKG5hbWUpOwotICAgIGlmICh4c2RGcmFnbWVudF8gIT0gbnVsbCkKLSAgICAgIHhzZEZyYWdtZW50Xy5zZXROYW1lKG5hbWUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHhzZEZyYWdtZW50Xy5wcm9jZXNzUGFyYW1ldGVyVmFsdWVzKHBhcnNlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5LCBTdHJpbmdbXSBwYXJhbXMpCi0gIHsKLSAgICB4c2RGcmFnbWVudF8uc2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtS2V5LCBwYXJhbXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSwgVmVjdG9yIHBhcmFtcykKLSAgewotICAgIHhzZEZyYWdtZW50Xy5zZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXksIHBhcmFtcyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSkKLSAgewotICAgIHJldHVybiB4c2RGcmFnbWVudF8uZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtS2V5KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyVmFsdWUoU3RyaW5nIHBhcmFtS2V5LCBpbnQgcGFyYW1JbmRleCkKLSAgewotICAgIHJldHVybiB4c2RGcmFnbWVudF8uZ2V0UGFyYW1ldGVyVmFsdWUocGFyYW1LZXksIHBhcmFtSW5kZXgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKQotICB7Ci0gICAgcmV0dXJuIHhzZEZyYWdtZW50Xy52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5KQotICB7Ci0gICAgcmV0dXJuIHhzZEZyYWdtZW50Xy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhwYXJhbUtleSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlKFN0cmluZyBwYXJhbUtleSwgaW50IHBhcmFtSW5kZXgpCi0gIHsKLSAgICByZXR1cm4geHNkRnJhZ21lbnRfLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWUocGFyYW1LZXksIHBhcmFtSW5kZXgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykKLSAgewotICAgIHJldHVybiB4c2RGcmFnbWVudF8uc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICByZXR1cm4geHNkRnJhZ21lbnRfLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgZG9jKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpCi0gIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvblJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkKLSAgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvbldGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KElYU0RGcmFnbWVudCB4c2RGcmFnbWVudCkKLSAgewotICAgIHhzZEZyYWdtZW50XyA9IHhzZEZyYWdtZW50OwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudCBnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKQotICB7Ci0gICAgcmV0dXJuIHhzZEZyYWdtZW50XzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RFbGVtZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERWxlbWVudEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYWFmZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RFbGVtZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREVsZW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgWFNERWxlbWVudEZyYWdtZW50IGV4dGVuZHMgWFNERGVsZWdhdGlvbkZyYWdtZW50IGltcGxlbWVudHMgSVhTREVsZW1lbnRGcmFnbWVudAotewotICBwcml2YXRlIGludCBtaW5PY2N1cnNfOwotICBwcml2YXRlIGludCBtYXhPY2N1cnNfOwotCi0gIHB1YmxpYyBYU0RFbGVtZW50RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgaWYgKGNvbmZpZyAhPSBudWxsKQotICAgIHsKLSAgICAgIG1pbk9jY3Vyc18gPSBjb25maWcuZ2V0TWluT2NjdXJzKCk7Ci0gICAgICBtYXhPY2N1cnNfID0gY29uZmlnLmdldE1heE9jY3VycygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWluT2NjdXJzXyA9IEZyYWdtZW50Q29uc3RhbnRzLkRFRkFVTFRfTUlOX09DQ1VSUzsKLSAgICAgIG1heE9jY3Vyc18gPSBGcmFnbWVudENvbnN0YW50cy5ERUZBVUxUX01BWF9PQ0NVUlM7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgSVhTREZyYWdtZW50IGVsZW1lbnRUeXBlRnJhZ21lbnQgPSBnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKTsKLSAgICBpZiAoIWVsZW1lbnRUeXBlRnJhZ21lbnQucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IGdldFBhcmFtZXRlclZhbHVlcyhlbGVtZW50VHlwZUZyYWdtZW50LmdldElEKCkpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCAmJiAhd2l0aGluUmFuZ2UocGFyYW1zLmxlbmd0aCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpCi0gIHsKLSAgICBJWFNERnJhZ21lbnQgZWxlbWVudFR5cGVGcmFnbWVudCA9IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IGdldFBhcmFtZXRlclZhbHVlcyhlbGVtZW50VHlwZUZyYWdtZW50LmdldElEKCkpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCAmJiAhd2l0aGluUmFuZ2UocGFyYW1zLmxlbmd0aCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFlbGVtZW50VHlwZUZyYWdtZW50LnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpCi0gIHsKLSAgICBTdHJpbmdbXSBwYXJhbXMgPSBnZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXkpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCAmJiAhd2l0aGluUmFuZ2UocGFyYW1zLmxlbmd0aCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKS52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhwYXJhbUtleSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlKFN0cmluZyBwYXJhbUtleSwgaW50IHBhcmFtSW5kZXgpCi0gIHsKLSAgICBpZiAoIXdpdGhpblJhbmdlKHBhcmFtSW5kZXggKyAxKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKTsKLSAgICBTdHJpbmcgcGFyYW0gPSBnZXRQYXJhbWV0ZXJWYWx1ZShwYXJhbUtleSwgcGFyYW1JbmRleCk7Ci0gICAgaWYgKHBhcmFtICE9IG51bGwgJiYgcGFyYW0ubGVuZ3RoKCkgPD0gMCAmJiAheHNkRWxlbWVudC5pc05pbGxhYmxlKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFnZXRYU0REZWxlZ2F0aW9uRnJhZ21lbnQoKS52YWxpZGF0ZVBhcmFtZXRlclZhbHVlKHBhcmFtS2V5LCBwYXJhbUluZGV4KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykKLSAgewotICAgIHN1cGVyLnNldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0gICAgbWluT2NjdXJzXyA9IGNvbmZpZy5nZXRNaW5PY2N1cnMoKTsKLSAgICBtYXhPY2N1cnNfID0gY29uZmlnLmdldE1heE9jY3VycygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykKLSAgewotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBpbnN0YW5jZURvY3VtZW50czsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIFN0cmluZyB3c2RsUGFydE5hbWUgPSBjb25maWcuZ2V0V1NETFBhcnROYW1lKCk7Ci0gICAgaWYgKGNvbmZpZy5nZXRJc1dTRExQYXJ0KCkgJiYgY29uZmlnLmdldFN0eWxlKCkgPT0gRnJhZ21lbnRDb25zdGFudHMuU1RZTEVfUlBDICYmIHdzZGxQYXJ0TmFtZSAhPSBudWxsICYmIHdzZGxQYXJ0TmFtZS5sZW5ndGgoKSA+IDAgJiYgaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aCA9PSAxICYmIHdzZGxQYXJ0TmFtZS5lcXVhbHMoaW5zdGFuY2VEb2N1bWVudHNDb3B5WzBdLmdldFRhZ05hbWUoKSkpCi0gICAgewotICAgICAgTm9kZUxpc3QgbmwgPSBpbnN0YW5jZURvY3VtZW50c0NvcHlbMF0uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgVmVjdG9yIGNoaWxkRWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5sLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5sLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgY2hpbGRFbGVtZW50cy5hZGQobm9kZSk7Ci0gICAgICB9Ci0gICAgICBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSAoRWxlbWVudFtdKWNoaWxkRWxlbWVudHMudG9BcnJheShuZXcgRWxlbWVudFswXSk7Ci0gICAgfQotICAgIElYU0RGcmFnbWVudCBlbGVtZW50VHlwZUZyYWdtZW50ID0gZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCk7Ci0gICAgaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gZ2V0SW5zdGFuY2VEb2N1bWVudHNCeVRhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBnZXROYW1lKCkpOwotICAgIHJldHVybiBlbGVtZW50VHlwZUZyYWdtZW50LnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhzZXRFbGVtZW50c1RhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBlbGVtZW50VHlwZUZyYWdtZW50LmdldE5hbWUoKSkpOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnRbXSBnZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIERvY3VtZW50IGRvYykKLSAgewotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IGdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgZG9jKTsKLSAgICBpbnN0YW5jZURvY3VtZW50cyA9IHNldEVsZW1lbnRzVGFnTmFtZShpbnN0YW5jZURvY3VtZW50cywgZ2V0SW5zdGFuY2VEb2N1bWVudFRhZ05hbWUobmFtZXNwYWNlVGFibGUpKTsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIFN0cmluZyB3c2RsUGFydE5hbWUgPSBjb25maWcuZ2V0V1NETFBhcnROYW1lKCk7Ci0gICAgaWYgKGNvbmZpZy5nZXRJc1dTRExQYXJ0KCkgJiYgY29uZmlnLmdldFN0eWxlKCkgPT0gRnJhZ21lbnRDb25zdGFudHMuU1RZTEVfUlBDICYmIHdzZGxQYXJ0TmFtZSAhPSBudWxsICYmIHdzZGxQYXJ0TmFtZS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IGluc3RhbmNlRG9jdW1lbnRzOwotICAgICAgaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFsxXTsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnRzWzBdID0gZG9jLmNyZWF0ZUVsZW1lbnQod3NkbFBhcnROYW1lKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHNDb3B5Lmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBpZiAoaW5zdGFuY2VEb2N1bWVudHNDb3B5W2ldICE9IG51bGwpCi0gICAgICAgICAgaW5zdGFuY2VEb2N1bWVudHNbMF0uYXBwZW5kQ2hpbGQoaW5zdGFuY2VEb2N1bWVudHNDb3B5W2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnN0YW5jZU5hbWVzcGFjZVF1YWxpZmllZCgpCi0gIHsKLSAgICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIGlmIChjb25maWcuZ2V0UGFydEVuY29kaW5nKCkgPT0gRnJhZ21lbnRDb25zdGFudHMuRU5DT0RJTkdfTElURVJBTCkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgICAgaWYgKHhzZEVsZW1lbnQuaXNHbG9iYWwoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh4c2RFbGVtZW50LmlzU2V0Rm9ybSgpKQotICAgICAgICAgIHJldHVybiAoeHNkRWxlbWVudC5nZXRGb3JtKCkuZ2V0VmFsdWUoKSA9PSBYU0RGb3JtLlFVQUxJRklFRCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gKHhzZEVsZW1lbnQuZ2V0U2NoZW1hKCkuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0VmFsdWUoKSA9PSBYU0RGb3JtLlFVQUxJRklFRCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zdGFuY2VEb2N1bWVudFRhZ05hbWUoSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgIFN0cmluZ0J1ZmZlciB0YWdOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGlmIChpc0luc3RhbmNlTmFtZXNwYWNlUXVhbGlmaWVkKCkpCi0gICAgewotICAgICAgU3RyaW5nIG5zVVJJID0gbnVsbDsKLSAgICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgICBpZiAoeHNkRWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpICE9IG51bGwpCi0gICAgICAgIG5zVVJJID0geHNkRWxlbWVudC5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgZWxzZQotICAgICAgICBuc1VSSSA9IHhzZEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBpZiAobnNVUkkgIT0gbnVsbCAmJiBuc1VSSS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXhGcm9tTmFtZXNwYWNlVVJJKG5zVVJJLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgIHRhZ05hbWUuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIHRhZ05hbWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nIHhzZEVsZW1lbnROYW1lID0geHNkRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgaWYgKHhzZEVsZW1lbnROYW1lID09IG51bGwgfHwgeHNkRWxlbWVudE5hbWUubGVuZ3RoKCkgPD0gMCkKLSAgICB7Ci0gICAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgICAgaWYgKHhzZEVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSAhPSBudWxsKQotICAgICAgICB4c2RFbGVtZW50TmFtZSA9IHhzZEVsZW1lbnQuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHhzZEVsZW1lbnROYW1lID0gZ2V0TmFtZSgpOwotICAgIH0KLSAgICB0YWdOYW1lLmFwcGVuZCh4c2RFbGVtZW50TmFtZSk7Ci0gICAgcmV0dXJuIHRhZ05hbWUudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiB3aXRoaW5SYW5nZShpbnQgc2l6ZSkKLSAgewotICAgIGlmIChzaXplIDwgbWluT2NjdXJzXykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAobWF4T2NjdXJzXyAhPSBGcmFnbWVudENvbnN0YW50cy5VTkJPVU5ERUQgJiYgc2l6ZSA+IG1heE9jY3Vyc18pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNaW5PY2N1cnMoaW50IG1pbk9jY3VycykKLSAgewotICAgIG1pbk9jY3Vyc18gPSBtaW5PY2N1cnM7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE1pbk9jY3VycygpCi0gIHsKLSAgICByZXR1cm4gbWluT2NjdXJzXzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE1heE9jY3VycyhpbnQgbWF4T2NjdXJzKQotICB7Ci0gICAgbWF4T2NjdXJzXyA9IG1heE9jY3VyczsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXJzKCkKLSAgewotICAgIHJldHVybiBtYXhPY2N1cnNfOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREVtcHR5RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERW1wdHlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE2NDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERW1wdHlGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNERW1wdHlGcmFnbWVudCBleHRlbmRzIFhTREZyYWdtZW50IHsKLSAgcHJpdmF0ZSBpbnQgb2NjdXJhbmNlXzsKLQotICBwdWJsaWMgWFNERW1wdHlGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnKTsKLSAgICBvY2N1cmFuY2VfID0gMDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMoTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyKSB0aHJvd3MgTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb24gewotICAgIFN0cmluZyBvY2N1cmFuY2UgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKGdldElEKCkpOwotICAgIHRyeSB7Ci0gICAgICBvY2N1cmFuY2VfID0gSW50ZWdlci5wYXJzZUludChvY2N1cmFuY2UpOwotICAgICAgcmV0dXJuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkgewotICAgICAgb2NjdXJhbmNlXyA9IC0xOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXksIFN0cmluZ1tdIHBhcmFtcykgewotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSwgVmVjdG9yIHBhcmFtcykgewotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpIHsKLSAgICBpZiAob2NjdXJhbmNlXyA8IDApCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBlbHNlIHsKLSAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbb2NjdXJhbmNlX107Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgICBwYXJhbXNbaV0gPSAiIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwYXJhbXM7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgcGFyYW1LZXksIGludCBwYXJhbUluZGV4KSB7Ci0gICAgaWYgKHBhcmFtSW5kZXggPj0gMCAmJiBwYXJhbUluZGV4IDwgb2NjdXJhbmNlXykKLSAgICAgIHJldHVybiAiIjsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkgewotICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgaW50IG1pbiA9IHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKTsKLSAgICBpbnQgbWF4ID0geHNkQ29uZmlnLmdldE1heE9jY3VycygpOwotICAgIHJldHVybiAob2NjdXJhbmNlXyA+PSAwICYmIG9jY3VyYW5jZV8gPj0gbWluICYmIChtYXggPT0gRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEIHx8IG9jY3VyYW5jZV8gPD0gbWF4KSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcGFyYW1LZXkpIHsKLSAgICByZXR1cm4gdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVyVmFsdWUoU3RyaW5nIHBhcmFtS2V5LCBpbnQgcGFyYW1JbmRleCkgewotICAgIHJldHVybiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykgewotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBnZXRJbnN0YW5jZURvY3VtZW50c0J5VGFnTmFtZShpbnN0YW5jZURvY3VtZW50cywgZ2V0TmFtZSgpKTsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzQ29weS5sZW5ndGg7IGkrKykgewotICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBpbnN0YW5jZURvY3VtZW50c0NvcHlbaV0uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpICE9IDApIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSB8fCAhaXNXaGl0ZXNwYWNlKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpKQotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIG9jY3VyYW5jZV8gPSBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoOwotICAgIHJldHVybiBwYXJhbXNWYWxpZCAmJiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzV2hpdGVzcGFjZShTdHJpbmcgcykgewotICAgIGNoYXJbXSBjaGFycyA9IHMudG9DaGFyQXJyYXkoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhcnNbaV0pIHx8ICFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoY2hhcnNbaV0pKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERW1wdHlXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERW1wdHlSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTEwYWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNERnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGb3JtOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IGltcGxlbWVudHMgSVhTREZyYWdtZW50Ci17Ci0gIHByaXZhdGUgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnXzsKLSAgcHJpdmF0ZSBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmXzsKLSAgcHJpdmF0ZSBpbnQgc2VlZF87Ci0KLSAgcHVibGljIFhTREZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykKLSAgewotICAgIHN1cGVyKGlkLCBuYW1lKTsKLSAgICBjb25maWdfID0gY29uZmlnOwotICAgIGlmIChjb25maWdfICE9IG51bGwpCi0gICAgewotICAgICAgWFNEQ29tcG9uZW50IGNvbXBvbmVudCA9IGNvbmZpZy5nZXRYU0RDb21wb25lbnQoKTsKLSAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgdHlwZURlZl8gPSAoWFNEVHlwZURlZmluaXRpb24pY29tcG9uZW50OwotICAgICAgZWxzZQotICAgICAgICB0eXBlRGVmXyA9IG51bGw7Ci0gICAgfQotICAgIHNlZWRfID0gMDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykKLSAgewotICAgIGNvbmZpZ18gPSBjb25maWc7Ci0gICAgaWYgKGNvbmZpZ18gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb21wb25lbnQgY29tcG9uZW50ID0gY29uZmlnLmdldFhTRENvbXBvbmVudCgpOwotICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgICBzZXRYU0RUeXBlRGVmaW5pdGlvbigoWFNEVHlwZURlZmluaXRpb24pY29tcG9uZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGNvbmZpZ187Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRYU0RUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmKQotICB7Ci0gICAgdHlwZURlZl8gPSB0eXBlRGVmOwotICB9Ci0KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiB0eXBlRGVmXzsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpCi0gIHsKLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gZ2V0SW5zdGFuY2VEb2N1bWVudHNCeVRhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHMsIGdldE5hbWUoKSk7Ci0gICAgU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1tpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoXTsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gaW50ZXJuYWxFcXVhbHMoaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBpbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcGFyYW1zW2ldID0gIiI7Ci0gICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGluc3RhbmNlRG9jdW1lbnRzQ29weVtpXS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKDApOwotICAgICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKQotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0gICAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBhcmFtc1tpXSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHNldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpLCBwYXJhbXMpOwotICAgIHJldHVybiBwYXJhbXNWYWxpZCAmJiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnRbXSBnZXRJbnN0YW5jZURvY3VtZW50c0J5VGFnTmFtZShFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMsIFN0cmluZyB0YWdOYW1lKQotICB7Ci0gICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzID09IG51bGwpCi0gICAgICByZXR1cm4gbmV3IEVsZW1lbnRbMF07Ci0gICAgVmVjdG9yIGluc3RhbmNlc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaW5zdGFuY2VEb2N1bWVudHNbaV0gPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBTdHJpbmcgaW5zdGFuY2VUYWdOYW1lID0gdHJpbVByZWZpeChpbnN0YW5jZURvY3VtZW50c1tpXS5nZXRUYWdOYW1lKCkpOwotICAgICAgaWYgKGluc3RhbmNlVGFnTmFtZS5lcXVhbHModGFnTmFtZSkpCi0gICAgICAgIGluc3RhbmNlc0NvcHkuYWRkKGluc3RhbmNlRG9jdW1lbnRzW2ldKTsKLSAgICB9Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlcyA9IG5ldyBFbGVtZW50W2luc3RhbmNlc0NvcHkuc2l6ZSgpXTsKLSAgICBpbnN0YW5jZXNDb3B5LmNvcHlJbnRvKGluc3RhbmNlcyk7Ci0gICAgcmV0dXJuIGluc3RhbmNlczsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgdHJpbVByZWZpeChTdHJpbmcgcykKLSAgewotICAgIFN0cmluZyBzQ29weSA9IG5ldyBTdHJpbmcocyk7Ci0gICAgaW50IGNvbG9uSW5kZXggPSBzQ29weS5pbmRleE9mKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICBpZiAoY29sb25JbmRleCAhPSAtMSAmJiBjb2xvbkluZGV4ICsgMSA8IHNDb3B5Lmxlbmd0aCgpICYmICEoKFN0cmluZy52YWx1ZU9mKHNDb3B5LmNoYXJBdChjb2xvbkluZGV4ICsgMSkpKS5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuQ09MT04pKSkKLSAgICAgIHNDb3B5ID0gc0NvcHkuc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxLCBzQ29weS5sZW5ndGgoKSk7Ci0gICAgcmV0dXJuIHNDb3B5OwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnRbXSBnZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIERvY3VtZW50IGRvYykKLSAgewotICAgIFN0cmluZ1tdIHBhcmFtcyA9IGdldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpKTsKLSAgICBpZiAocGFyYW1zID09IG51bGwpCi0gICAgICByZXR1cm4gbmV3IEVsZW1lbnRbMF07Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbcGFyYW1zLmxlbmd0aF07Ci0gICAgU3RyaW5nIHRhZ05hbWUgPSBnZXRJbnN0YW5jZURvY3VtZW50VGFnTmFtZShuYW1lc3BhY2VUYWJsZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IGluc3RhbmNlRG9jdW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLSAgICAgIE5vZGUgdGV4dE5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUocGFyYW1zW2ldKTsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSBpbnN0YW5jZURvY3VtZW50OwotICAgIH0KLSAgICByZXR1cm4gKGdlblhTSVR5cGUgPyBhZGRYU0lUeXBlKGluc3RhbmNlRG9jdW1lbnRzLCBuYW1lc3BhY2VUYWJsZSkgOiBpbnN0YW5jZURvY3VtZW50cyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdlbklEKCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBuZXdJRCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBuZXdJRC5hcHBlbmQoZ2V0SUQoKSk7Ci0gICAgbmV3SUQuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLklEX1NFUEVSQVRPUik7Ci0gICAgbmV3SUQuYXBwZW5kKHNlZWRfKyspOwotICAgIHJldHVybiBuZXdJRC50b1N0cmluZygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnN0YW5jZU5hbWVzcGFjZVF1YWxpZmllZCgpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gY29uZmlnXy5nZXRYU0RDb21wb25lbnQoKS5nZXRTY2hlbWEoKTsKLSAgICByZXR1cm4gKCFjb25maWdfLmdldElzV1NETFBhcnQoKSAmJiBjb25maWdfLmdldFBhcnRFbmNvZGluZygpID09IEZyYWdtZW50Q29uc3RhbnRzLkVOQ09ESU5HX0xJVEVSQUwgJiYgeHNkU2NoZW1hLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpLmdldFZhbHVlKCkgPT0gWFNERm9ybS5RVUFMSUZJRUQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRJbnN0YW5jZURvY3VtZW50VGFnTmFtZShIYXNodGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgdGFnTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAoaXNJbnN0YW5jZU5hbWVzcGFjZVF1YWxpZmllZCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBuc1VSSSA9IGNvbmZpZ18uZ2V0WFNEQ29tcG9uZW50KCkuZ2V0U2NoZW1hKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4RnJvbU5hbWVzcGFjZVVSSShuc1VSSSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgdGFnTmFtZS5hcHBlbmQocHJlZml4KTsKLSAgICAgIHRhZ05hbWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICB9Ci0gICAgdGFnTmFtZS5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gdGFnTmFtZS50b1N0cmluZygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnRbXSBhZGRYU0lUeXBlKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cywgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgWFNEQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IGNvbmZpZ18uZ2V0WFNEQ29tcG9uZW50KCk7Ci0gICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzICE9IG51bGwgJiYgKHhzZENvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE5hbWVkQ29tcG9uZW50KSkKLSAgICB7Ci0gICAgICBTdHJpbmcgeHNkQ29tcG9uZW50TmFtZSA9ICgoWFNETmFtZWRDb21wb25lbnQpeHNkQ29tcG9uZW50KS5nZXROYW1lKCk7Ci0gICAgICBpZiAoeHNkQ29tcG9uZW50TmFtZSAhPSBudWxsICYmIHhzZENvbXBvbmVudE5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzW2ldID09IG51bGwpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBTdHJpbmcgeHNpVVJJID0gRnJhZ21lbnRDb25zdGFudHMuVVJJX1hTSTsKLSAgICAgICAgICBTdHJpbmcgeHNpUHJlZml4ID0gZ2V0UHJlZml4RnJvbU5hbWVzcGFjZVVSSSh4c2lVUkksIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgICAgICBTdHJpbmcgeHNpVHlwZVVSSSA9IHhzZENvbXBvbmVudC5nZXRTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICBTdHJpbmcgeHNpVHlwZVByZWZpeCA9IGdldFByZWZpeEZyb21OYW1lc3BhY2VVUkkoeHNpVHlwZVVSSSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgICAgIDsKLSAgICAgICAgICBTdHJpbmdCdWZmZXIgYXR0ck5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgYXR0ck5hbWUuYXBwZW5kKHhzaVByZWZpeCk7Ci0gICAgICAgICAgYXR0ck5hbWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICAgICAgICBhdHRyTmFtZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuWFNJX1RZUEUpOwotICAgICAgICAgIFN0cmluZ0J1ZmZlciBhdHRyVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgYXR0clZhbHVlLmFwcGVuZCh4c2lUeXBlUHJlZml4KTsKLSAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKEZyYWdtZW50Q29uc3RhbnRzLkNPTE9OKTsKLSAgICAgICAgICBhdHRyVmFsdWUuYXBwZW5kKHhzZENvbXBvbmVudE5hbWUpOwotICAgICAgICAgIGluc3RhbmNlRG9jdW1lbnRzW2ldLnNldEF0dHJpYnV0ZShhdHRyTmFtZS50b1N0cmluZygpLCBhdHRyVmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKQotICB7Ci0gICAgaWYgKCFzdXBlci52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZ1tdIHBhcmFtcyA9IGdldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpKTsKLSAgICBpbnQgbGVuZ3RoID0gKHBhcmFtcyAhPSBudWxsKSA/IHBhcmFtcy5sZW5ndGggOiAwOwotICAgIGludCBtaW4gPSBjb25maWdfLmdldE1pbk9jY3VycygpOwotICAgIGludCBtYXggPSBjb25maWdfLmdldE1heE9jY3VycygpOwotICAgIHJldHVybiAobGVuZ3RoID49IG1pbiAmJiAobWF4ID09IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCB8fCBsZW5ndGggPD0gbWF4KSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZpeEZyb21OYW1lc3BhY2VVUkkoU3RyaW5nIG5zVVJJLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUpCi0gIHsKLSAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZyluYW1lc3BhY2VUYWJsZS5nZXQobnNVUkkpOwotICAgIGludCBpID0gMDsKLSAgICB3aGlsZSAocHJlZml4ID09IG51bGwgfHwgcHJlZml4Lmxlbmd0aCgpIDw9IDApCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHByZWZpeENvcHkgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBwcmVmaXhDb3B5LmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5RTkFNRV9QUkVGSVgpOwotICAgICAgcHJlZml4Q29weS5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoaSkpOwotICAgICAgaSsrOwotICAgICAgaWYgKCFuYW1lc3BhY2VUYWJsZS5jb250YWlucyhwcmVmaXhDb3B5LnRvU3RyaW5nKCkpKQotICAgICAgewotICAgICAgICBuYW1lc3BhY2VUYWJsZS5wdXQobnNVUkksIHByZWZpeENvcHkudG9TdHJpbmcoKSk7Ci0gICAgICAgIHByZWZpeCA9IHByZWZpeENvcHkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudCByZW1vdmVEdXBOU0Zyb21DaGlsZHJlbihFbGVtZW50IGVsZW1lbnQsIFN0cmluZ1tdIG5zTmFtZXMsIFN0cmluZ1tdIG5zVmFsdWVzKQotICB7Ci0gICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5zTmFtZXMubGVuZ3RoOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgY2hpbGROU1ZhbHVlID0gKChFbGVtZW50KWNoaWxkKS5nZXRBdHRyaWJ1dGUobnNOYW1lc1tqXSk7Ci0gICAgICAgICAgaWYgKGNoaWxkTlNWYWx1ZSAhPSBudWxsICYmIGNoaWxkTlNWYWx1ZS5lcXVhbHMobnNWYWx1ZXNbal0pKQotICAgICAgICAgICAgKChFbGVtZW50KWNoaWxkKS5yZW1vdmVBdHRyaWJ1dGUobnNOYW1lc1tqXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBzZXRFbGVtZW50VGFnTmFtZShFbGVtZW50IGUsIFN0cmluZyB0YWdOYW1lKQotICB7Ci0gICAgaWYgKCFlLmdldFRhZ05hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbiA9IGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBFbGVtZW50IGVDb3B5ID0gZG9jLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgIGlmIChjaGlsZCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVDb3B5LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgIC8vIFdoZW4geW91IGFwcGVuZCBhIG5vZGUgZnJvbSBvbmUgZWxlbWVudCB0byBhbm90aGVyLAotICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIGVsZW1lbnQgd2lsbCBsb3NlIGl0cyByZWZlcmVuY2UgdG8gdGhpcyBub2RlLAotICAgICAgICAgICAgLy8gdGhlcmVmb3JlLCB0aGUgc2l6ZSBvZiB0aGUgbm9kZSBsaXN0IHdpbGwgZGVjcmVhc2UgYnkgMS4KLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIGF0dHIgPSBhdHRyaWJ1dGVzLml0ZW0oaik7Ci0gICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCAmJiAoYXR0ciBpbnN0YW5jZW9mIEF0dHIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEF0dHIgYXR0cmlidXRlID0gKEF0dHIpYXR0cjsKLSAgICAgICAgICAgIGVDb3B5LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlQ29weTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZTsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50W10gc2V0RWxlbWVudHNUYWdOYW1lKEVsZW1lbnRbXSBlLCBTdHJpbmcgdGFnTmFtZSkKLSAgewotICAgIEVsZW1lbnRbXSBlQ29weSA9IG5ldyBFbGVtZW50W2UubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVDb3B5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGVDb3B5W2ldID0gc2V0RWxlbWVudFRhZ05hbWUoZVtpXSwgdGFnTmFtZSk7Ci0gICAgfQotICAgIHJldHVybiBlQ29weTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGludGVybmFsRXF1YWxzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50c0NvcHksIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykKLSAgewotICAgIGlmICghY29uZmlnXy5nZXRJc1dTRExQYXJ0KCkpCi0gICAgewotICAgICAgaW50IGxlbmd0aCA9IChpbnN0YW5jZURvY3VtZW50cyAhPSBudWxsKSA/IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aCA6IDA7Ci0gICAgICBpbnQgbGVuZ3RoQ29weSA9IChpbnN0YW5jZURvY3VtZW50c0NvcHkgIT0gbnVsbCkgPyBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoIDogMDsKLSAgICAgIHJldHVybiAobGVuZ3RoID09IGxlbmd0aENvcHkpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cEFsbEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQWxsRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0ZTNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQWxsRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5NdWx0aXBhcnRGb3JtRGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREdyb3VwQWxsRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RHcm91cEFsbEZyYWdtZW50IGV4dGVuZHMgWFNER3JvdXBGcmFnbWVudCBpbXBsZW1lbnRzIElYU0RHcm91cEFsbEZyYWdtZW50IHsKLSAgcHJpdmF0ZSBTdHJpbmcgZ3JvdXBJRF87Ci0KLSAgcHVibGljIFhTREdyb3VwQWxsRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyLCB4c2RNb2RlbEdyb3VwKTsKLSAgICBncm91cElEXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUGFyYW1ldGVyVmFsdWVzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgZ3JvdXBJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoZ2V0SUQoKSk7Ci0gICAgaWYgKGdyb3VwSURfICE9IG51bGwgJiYgZ3JvdXBJRCAhPSBudWxsICYmIGdyb3VwSURfLmVxdWFscyhncm91cElEKSkgewotICAgICAgc2V0R3JvdXBNZW1iZXJJRHNPcmRlcmluZyhwYXJzZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKGdyb3VwSURfKSk7Ci0gICAgICBib29sZWFuIHZhbHVlc1ZhbGlkID0gdHJ1ZTsKLSAgICAgIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRF8pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICBpZiAoZ3JvdXBNZW1iZXJGcmFnbWVudHNbaV0gIT0gbnVsbCAmJiAhZ3JvdXBNZW1iZXJGcmFnbWVudHNbaV0ucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpKQotICAgICAgICAgIHZhbHVlc1ZhbGlkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdmFsdWVzVmFsaWQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZ3JvdXBJRF8gPSBudWxsOwotICAgICAgcmVtb3ZlR3JvdXBJRHMoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpIHsKLSAgICByZW1vdmVHcm91cElEcygpOwotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSB0cnVlOwotICAgIGlmIChpbnN0YW5jZURvY3VtZW50cyAhPSBudWxsICYmIGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aCA+IDApIHsKLSAgICAgIGdyb3VwSURfID0gY3JlYXRlSW5zdGFuY2UoKTsKLSAgICAgIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ3MgPSBnZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEXyk7Ci0gICAgICBTdHJpbmdbXSBncm91cE1lbWJlcklEc09yZGVyID0gbmV3IFN0cmluZ1tncm91cE1lbWJlckZyYWdzLmxlbmd0aF07Ci0gICAgICBpbnQgb3JkZXJJbmRleCA9IDA7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGJvb2xlYW4gcGFyYW1zQXNzaWduZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBncm91cE1lbWJlckZyYWdzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgaWYgKGdyb3VwTWVtYmVyRnJhZ3Nbal0gIT0gbnVsbCAmJiBncm91cE1lbWJlckZyYWdzW2pdLmdldE5hbWUoKS5lcXVhbHModHJpbVByZWZpeChpbnN0YW5jZURvY3VtZW50c1tpXS5nZXRUYWdOYW1lKCkpKSkgewotICAgICAgICAgICAgRWxlbWVudFtdIGNoaWxkSW5zdGFuY2UgPSB7aW5zdGFuY2VEb2N1bWVudHNbaV19OwotICAgICAgICAgICAgaWYgKCFncm91cE1lbWJlckZyYWdzW2pdLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhjaGlsZEluc3RhbmNlKSkKLSAgICAgICAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGdyb3VwTWVtYmVySURzT3JkZXJbb3JkZXJJbmRleF0gPSBncm91cE1lbWJlckZyYWdzW2pdLmdldElEKCk7Ci0gICAgICAgICAgICBvcmRlckluZGV4Kys7Ci0gICAgICAgICAgICBwYXJhbXNBc3NpZ25lZCA9IHRydWU7Ci0gICAgICAgICAgICBncm91cE1lbWJlckZyYWdzW2pdID0gbnVsbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXBhcmFtc0Fzc2lnbmVkKQotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBrID0gMDsgayA8IGdyb3VwTWVtYmVyRnJhZ3MubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgaWYgKGdyb3VwTWVtYmVyRnJhZ3Nba10gIT0gbnVsbCkgewotICAgICAgICAgIGdyb3VwTWVtYmVySURzT3JkZXJbb3JkZXJJbmRleF0gPSBncm91cE1lbWJlckZyYWdzW2tdLmdldElEKCk7Ci0gICAgICAgICAgb3JkZXJJbmRleCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZXRHcm91cE1lbWJlcklEc09yZGVyaW5nKGdyb3VwTWVtYmVySURzT3JkZXIpOwotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEdyb3VwQWxsSW5zdGFuY2UoKSB7Ci0gICAgaWYgKGdyb3VwSURfID09IG51bGwpCi0gICAgICBncm91cElEXyA9IGNyZWF0ZUdyb3VwSW5zdGFuY2UoKTsKLSAgICByZXR1cm4gZ3JvdXBJRF87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkgewotICAgIHJldHVybiBnZXRHcm91cEFsbEluc3RhbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRHcm91cE1lbWJlcklEc09yZGVyaW5nKFN0cmluZ1tdIGdyb3VwTWVtYmVySURzKSB7Ci0gICAgaWYgKGdyb3VwTWVtYmVySURzID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgU3RyaW5nW10gZXhpc3RpbmdHcm91cE1lbWJlcklEcyA9IGdldEdyb3VwTWVtYmVySURzKGdyb3VwSURfKTsKLSAgICBpZiAoZXhpc3RpbmdHcm91cE1lbWJlcklEcy5sZW5ndGggIT0gZ3JvdXBNZW1iZXJJRHMubGVuZ3RoKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFZlY3RvciBleGlzdGluZ0dyb3VwTWVtYmVySURzVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhpc3RpbmdHcm91cE1lbWJlcklEcy5sZW5ndGg7IGkrKykgewotICAgICAgZXhpc3RpbmdHcm91cE1lbWJlcklEc1ZlY3Rvci5hZGQoZXhpc3RpbmdHcm91cE1lbWJlcklEc1tpXSk7Ci0gICAgfQotICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3JvdXBNZW1iZXJJRHMubGVuZ3RoOyBqKyspIHsKLSAgICAgIGlmICghZXhpc3RpbmdHcm91cE1lbWJlcklEc1ZlY3Rvci5yZW1vdmUoZ3JvdXBNZW1iZXJJRHNbal0pKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChzZXRGcmFnbWVudHNPcmRlcihncm91cE1lbWJlcklEcykpIHsKLSAgICAgIHNldEdyb3VwTWVtYmVySURzKGdyb3VwSURfLCBncm91cE1lbWJlcklEcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbW92ZVVwR3JvdXBNZW1iZXJJRChTdHJpbmcgZ3JvdXBNZW1iZXJJRCkgewotICAgIFN0cmluZ1tdIGdyb3VwTWVtYmVySURzID0gZ2V0R3JvdXBNZW1iZXJJRHMoZ3JvdXBJRF8pOwotICAgIGlmIChncm91cE1lbWJlcklELmVxdWFscyhncm91cE1lbWJlcklEc1swXSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBncm91cE1lbWJlcklEcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKGdyb3VwTWVtYmVySUQuZXF1YWxzKGdyb3VwTWVtYmVySURzW2ldKSkgewotICAgICAgICBncm91cE1lbWJlcklEc1tpXSA9IGdyb3VwTWVtYmVySURzW2kgLSAxXTsKLSAgICAgICAgZ3JvdXBNZW1iZXJJRHNbaSAtIDFdID0gZ3JvdXBNZW1iZXJJRDsKLSAgICAgICAgaWYgKHNldEZyYWdtZW50c09yZGVyKGdyb3VwTWVtYmVySURzKSkgewotICAgICAgICAgIHNldEdyb3VwTWVtYmVySURzKGdyb3VwSURfLCBncm91cE1lbWJlcklEcyk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbW92ZURvd25Hcm91cE1lbWJlcklEKFN0cmluZyBncm91cE1lbWJlcklEKSB7Ci0gICAgU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMgPSBnZXRHcm91cE1lbWJlcklEcyhncm91cElEXyk7Ci0gICAgaWYgKGdyb3VwTWVtYmVySUQuZXF1YWxzKGdyb3VwTWVtYmVySURzW2dyb3VwTWVtYmVySURzLmxlbmd0aCAtIDFdKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTWVtYmVySURzLmxlbmd0aCAtIDE7IGkrKykgewotICAgICAgaWYgKGdyb3VwTWVtYmVySUQuZXF1YWxzKGdyb3VwTWVtYmVySURzW2ldKSkgewotICAgICAgICBncm91cE1lbWJlcklEc1tpXSA9IGdyb3VwTWVtYmVySURzW2kgKyAxXTsKLSAgICAgICAgZ3JvdXBNZW1iZXJJRHNbaSArIDFdID0gZ3JvdXBNZW1iZXJJRDsKLSAgICAgICAgaWYgKHNldEZyYWdtZW50c09yZGVyKGdyb3VwTWVtYmVySURzKSkgewotICAgICAgICAgIHNldEdyb3VwTWVtYmVySURzKGdyb3VwSURfLCBncm91cE1lbWJlcklEcyk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RHcm91cFJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBBbGxXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cENob2ljZUZpeEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlRml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2ZDcyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlRml4RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwOwotCi1wdWJsaWMgY2xhc3MgWFNER3JvdXBDaG9pY2VGaXhGcmFnbWVudCBleHRlbmRzIFhTREdyb3VwQ2hvaWNlRnJhZ21lbnQgewotICBwdWJsaWMgWFNER3JvdXBDaG9pY2VGaXhGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIsIHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBDaG9pY2VGaXhXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cENob2ljZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1NWNmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNER3JvdXBDaG9pY2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTREdyb3VwQ2hvaWNlRnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cEZyYWdtZW50IGltcGxlbWVudHMgSVhTREdyb3VwQ2hvaWNlRnJhZ21lbnQgewotICBwcml2YXRlIFhTRFBhcnRpY2xlW10gY2hvaWNlc187Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGNob2ljZUluZGV4ZXNfOwotCi0gIHB1YmxpYyBYU0RHcm91cENob2ljZUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlciwgeHNkTW9kZWxHcm91cCk7Ci0gICAgY2hvaWNlc18gPSBudWxsOwotICAgIGNob2ljZUluZGV4ZXNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiB7Ci0gICAgc3VwZXIucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpOwotICAgIFN0cmluZ1tdIGdyb3VwSURzID0gZ2V0R3JvdXBJRHMoKTsKLSAgICBjaG9pY2VJbmRleGVzXy5jbGVhcigpOwotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJRHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIFN0cmluZyBzZWxlY3RlZENob2ljZUZyYWdJRCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoZ3JvdXBJRHNbaV0pOwotICAgICAgaW50IGNob2ljZUluZGV4ID0gMDsKLSAgICAgIElYU0RGcmFnbWVudFtdIGNob2ljZUZyYWdzID0gZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbaV0pOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaG9pY2VGcmFncy5sZW5ndGg7IGorKykgewotICAgICAgICBpZiAoY2hvaWNlRnJhZ3Nbal0uZ2V0SUQoKS5lcXVhbHMoc2VsZWN0ZWRDaG9pY2VGcmFnSUQpKSB7Ci0gICAgICAgICAgY2hvaWNlSW5kZXggPSBqOwotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gKHBhcmFtc1ZhbGlkICYmIGNob2ljZUZyYWdzW2pdLnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZXRDaG9pY2VJbmRleChncm91cElEc1tpXSwgY2hvaWNlSW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzKSB7Ci0gICAgcmVtb3ZlR3JvdXBJRHMoKTsKLSAgICBjaG9pY2VJbmRleGVzXy5jbGVhcigpOwotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSB0cnVlOwotICAgIGlmIChpbnN0YW5jZURvY3VtZW50cyAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIFN0cmluZyBncm91cElEID0gY3JlYXRlR3JvdXBDaG9pY2VJbnN0YW5jZSgwKTsKLSAgICAgICAgSVhTREZyYWdtZW50W10gY2hvaWNlRnJhZ3MgPSBnZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaG9pY2VGcmFncy5sZW5ndGg7IGorKykgewotICAgICAgICAgIGlmIChjaG9pY2VGcmFnc1tqXS5nZXROYW1lKCkuZXF1YWxzKHRyaW1QcmVmaXgoaW5zdGFuY2VEb2N1bWVudHNbaV0uZ2V0VGFnTmFtZSgpKSkpIHsKLSAgICAgICAgICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGNob2ljZUZyYWdzW2pdLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICAgICAgICBFbGVtZW50W10gY2hpbGRJbnN0YW5jZXMgPSBnZXRJbnN0YW5jZURvY3VtZW50UGFydGl0aW9uKGluc3RhbmNlRG9jdW1lbnRzLCBpLCB4c2RDb25maWcuZ2V0TWluT2NjdXJzKCksIHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgICBpZiAoIWNob2ljZUZyYWdzW2pdLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhjaGlsZEluc3RhbmNlcykpCi0gICAgICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBzZXRDaG9pY2VJbmRleChncm91cElELCBqKTsKLSAgICAgICAgICAgIGlmIChjaGlsZEluc3RhbmNlcy5sZW5ndGggPiAwKQotICAgICAgICAgICAgICBpID0gaSArIGNoaWxkSW5zdGFuY2VzLmxlbmd0aCAtIDE7IC8vIG1pbnVzIDEgYmVjYXVzZSB0aGVyZSdzIGFuIGkrKyBpbiB0aGUgb3V0ZXIgZm9yIGxvb3AKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwcml2YXRlIEVsZW1lbnRbXSBnZXRJbnN0YW5jZURvY3VtZW50UGFydGl0aW9uKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cywgaW50IHN0YXJ0LCBpbnQgbWluU2l6ZSwgaW50IG1heFNpemUpIHsKLSAgICBTdHJpbmcgdGFnTmFtZSA9IGluc3RhbmNlRG9jdW1lbnRzW3N0YXJ0XS5nZXRUYWdOYW1lKCk7Ci0gICAgaW50IHNpemUgPSAxOwotICAgIGZvciAoaW50IGkgPSBzdGFydCArIDE7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKGluc3RhbmNlRG9jdW1lbnRzW2ldLmdldFRhZ05hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0gICAgICAgIHNpemUrKzsKLSAgICAgIGVsc2UKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChtYXhTaXplICE9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCAmJiBzaXplID4gbWF4U2l6ZSkgewotICAgICAgc2l6ZSA9IHNpemUgLSBtaW5TaXplOwotICAgICAgaWYgKHNpemUgPiBtYXhTaXplKQotICAgICAgICBzaXplID0gbWF4U2l6ZTsKLSAgICB9Ci0gICAgRWxlbWVudFtdIHN1YnNldCA9IG5ldyBFbGVtZW50W3NpemVdOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3Vic2V0Lmxlbmd0aDsgaisrKSB7Ci0gICAgICBzdWJzZXRbal0gPSBpbnN0YW5jZURvY3VtZW50c1tzdGFydCArIGpdOwotICAgIH0KLSAgICByZXR1cm4gc3Vic2V0OwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnRbXSBnZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIERvY3VtZW50IGRvYykgewotICAgIFZlY3RvciBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgU3RyaW5nW10gZ3JvdXBJRHMgPSBnZXRHcm91cElEcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJRHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIElYU0RGcmFnbWVudFtdIGNob2ljZUZyYWdzID0gZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbaV0pOwotICAgICAgaW50IGNob2ljZUluZGV4ID0gZ2V0Q2hvaWNlSW5kZXgoZ3JvdXBJRHNbaV0pOwotICAgICAgRWxlbWVudFtdIGNob2ljZUZyYWdJbnN0YW5jZXMgPSBjaG9pY2VGcmFnc1tjaG9pY2VJbmRleF0uZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGdlblhTSVR5cGUsIG5hbWVzcGFjZVRhYmxlLCBkb2MpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaG9pY2VGcmFnSW5zdGFuY2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weS5hZGQoY2hvaWNlRnJhZ0luc3RhbmNlc1tqXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2luc3RhbmNlRG9jdW1lbnRzQ29weS5zaXplKCldOwotICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weS5jb3B5SW50byhpbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgcmV0dXJuIGluc3RhbmNlRG9jdW1lbnRzOwotICB9Ci0KLSAgcHVibGljIFhTRFBhcnRpY2xlW10gZ2V0Q2hvaWNlcygpIHsKLSAgICBpZiAoY2hvaWNlc18gPT0gbnVsbCkgewotICAgICAgRUxpc3QgcGFydGljbGVzID0gZ2V0WFNETW9kZWxHcm91cCgpLmdldFBhcnRpY2xlcygpOwotICAgICAgY2hvaWNlc18gPSBuZXcgWFNEUGFydGljbGVbcGFydGljbGVzLnNpemUoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNob2ljZXNfLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGNob2ljZXNfW2ldID0gKFhTRFBhcnRpY2xlKXBhcnRpY2xlcy5nZXQoaSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaG9pY2VzXzsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBDaG9pY2VJbnN0YW5jZShpbnQgY2hvaWNlSW5kZXgpIHsKLSAgICBnZXRDaG9pY2VzKCk7Ci0gICAgaWYgKGNob2ljZUluZGV4IDwgMCB8fCBjaG9pY2VJbmRleCA+IGNob2ljZXNfLmxlbmd0aCAtIDEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBTdHJpbmcgZ3JvdXBJRCA9IGNyZWF0ZUdyb3VwSW5zdGFuY2UoKTsKLSAgICBzZXRDaG9pY2VJbmRleChncm91cElELCBjaG9pY2VJbmRleCk7Ci0gICAgcmV0dXJuIGdyb3VwSUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkgewotICAgIHJldHVybiBjcmVhdGVHcm91cENob2ljZUluc3RhbmNlKDApOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRDaG9pY2VJbmRleChTdHJpbmcgZ3JvdXBJRCkgewotICAgIEludGVnZXIgaW5kZXggPSAoSW50ZWdlciljaG9pY2VJbmRleGVzXy5nZXQoZ3JvdXBJRCk7Ci0gICAgaWYgKGluZGV4ICE9IG51bGwpCi0gICAgICByZXR1cm4gaW5kZXguaW50VmFsdWUoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENob2ljZUluZGV4KFN0cmluZyBncm91cElELCBpbnQgY2hvaWNlSW5kZXgpIHsKLSAgICBjaG9pY2VJbmRleGVzXy5wdXQoZ3JvdXBJRCwgbmV3IEludGVnZXIoY2hvaWNlSW5kZXgpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCkKLSAgewotICAgIFN0cmluZ1tdIGdyb3VwSURzID0gZ2V0R3JvdXBJRHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwSURzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IGdldENob2ljZUluZGV4KGdyb3VwSURzW2ldKTsKLSAgICAgIGlmICghZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbaV0pW3NlbGVjdGlvbkluZGV4XS52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlUmFuZ2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cENob2ljZVJhbmdlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzYmZmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwQ2hvaWNlUmFuZ2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLXB1YmxpYyBjbGFzcyBYU0RHcm91cENob2ljZVJhbmdlRnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cENob2ljZUZyYWdtZW50IHsKLSAgcHVibGljIFhTREdyb3VwQ2hvaWNlUmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIsIHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBDaG9pY2VSYW5nZVdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODU3MTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5GcmFnbWVudENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREdyb3VwRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTREdyb3VwRnJhZ21lbnQgZXh0ZW5kcyBYU0RNYXBGcmFnbWVudCBpbXBsZW1lbnRzIElYU0RHcm91cEZyYWdtZW50IHsKLSAgcHJpdmF0ZSBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXBfOwotICBwcml2YXRlIFZlY3RvciBncm91cElEc09yZGVyXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgZ3JvdXBJRHNfOwotICAKLSAgcHVibGljIFhTREdyb3VwRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyKTsKLSAgICB4c2RNb2RlbEdyb3VwXyA9IHhzZE1vZGVsR3JvdXA7Ci0gICAgZ3JvdXBJRHNPcmRlcl8gPSBuZXcgVmVjdG9yKCk7Ci0gICAgZ3JvdXBJRHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiB7Ci0gICAgYm9vbGVhbiB2YWx1ZXNWYWxpZCA9IHRydWU7Ci0gICAgU3RyaW5nW10gcGFyYW1zID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpKTsKLSAgICBWZWN0b3IgZnJhZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgVmVjdG9yIGdyb3VwSURzT3JkZXJDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgIEhhc2h0YWJsZSBncm91cElEc0NvcHkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IHBhcmFtcyAhPSBudWxsICYmIGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChwYXJhbXNbaV0gIT0gbnVsbCkgewotICAgICAgICBncm91cElEc09yZGVyQ29weS5hZGQocGFyYW1zW2ldKTsKLSAgICAgICAgZ3JvdXBJRHNDb3B5LnB1dChwYXJhbXNbaV0sIGdldEdyb3VwTWVtYmVySURzKHBhcmFtc1tpXSkpOwotICAgICAgICBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdtZW50cyA9IGdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKHBhcmFtc1tpXSk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3JvdXBNZW1iZXJGcmFnbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXJGcmFnbWVudHNbal0gIT0gbnVsbCkgewotICAgICAgICAgICAgZnJhZ3MuYWRkKGdyb3VwTWVtYmVyRnJhZ21lbnRzW2pdKTsKLSAgICAgICAgICAgIGlmICghZ3JvdXBNZW1iZXJGcmFnbWVudHNbal0ucHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhwYXJzZXIpKQotICAgICAgICAgICAgICB2YWx1ZXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBncm91cElEc09yZGVyXyA9IGdyb3VwSURzT3JkZXJDb3B5OwotICAgIGdyb3VwSURzXyA9IGdyb3VwSURzQ29weTsKLSAgICByZW1vdmVBbGxGcmFnbWVudHMoKTsKLSAgICBhZGRGcmFnbWVudHMoZnJhZ3MpOwotICAgIHJldHVybiB2YWx1ZXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpIHsKLSAgICByZW1vdmVHcm91cElEcygpOwotICAgIGJvb2xlYW4gcGFyYW1zVmFsaWQgPSB0cnVlOwotICAgIFN0cmluZyBwcmV2R3JvdXBJRCA9IG51bGw7Ci0gICAgU3RyaW5nIGN1cnJHcm91cElEID0gbnVsbDsKLSAgICBpbnQgZ3JvdXBNZW1iZXJJbmRleCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7ICkgewotICAgICAgaWYgKGN1cnJHcm91cElEID09IG51bGwpIHsKLSAgICAgICAgU3RyaW5nIG5ld0dyb3VwSUQgPSBjcmVhdGVJbnN0YW5jZSgpOwotICAgICAgICBwcmV2R3JvdXBJRCA9IGN1cnJHcm91cElEOwotICAgICAgICBjdXJyR3JvdXBJRCA9IG5ld0dyb3VwSUQ7Ci0gICAgICB9Ci0gICAgICBFbGVtZW50W10gaW5zdGFuY2VQYXJ0aXRpb24gPSBudWxsOwotICAgICAgaW50IGogPSBncm91cE1lbWJlckluZGV4OwotICAgICAgYm9vbGVhbiBwYXJhbXNBc3NpZ25lZCA9IGZhbHNlOwotICAgICAgaW50IHdpbGRjYXJkRnJhZ0luZGV4ID0gLTE7Ci0gICAgICBkbyB7Ci0gICAgICAgIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ3MgPSBnZXRHcm91cE1lbWJlckZyYWdtZW50cyhjdXJyR3JvdXBJRCk7Ci0gICAgICAgIFhTRENvbXBvbmVudCB4c2RDb21wb25lbnQgPSBncm91cE1lbWJlckZyYWdzW2pdLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCkuZ2V0WFNEQ29tcG9uZW50KCk7Ci0gICAgICAgIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkgewotICAgICAgICAgIGlmICh3aWxkY2FyZEZyYWdJbmRleCA8IDApCi0gICAgICAgICAgICB3aWxkY2FyZEZyYWdJbmRleCA9IGo7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZ3JvdXBNZW1iZXJGcmFnc1tqXS5nZXROYW1lKCkuZXF1YWxzKHRyaW1QcmVmaXgoaW5zdGFuY2VEb2N1bWVudHNbaV0uZ2V0VGFnTmFtZSgpKSkpIHsKLSAgICAgICAgICBpbnN0YW5jZVBhcnRpdGlvbiA9IGdldEluc3RhbmNlRG9jdW1lbnRQYXJ0aXRpb24oaW5zdGFuY2VEb2N1bWVudHMsIGksIGdyb3VwTWVtYmVyRnJhZ3Nbal0uZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRNYXhPY2N1cnMoKSk7Ci0gICAgICAgICAgaWYgKCFncm91cE1lbWJlckZyYWdzW2pdLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhpbnN0YW5jZVBhcnRpdGlvbikpCi0gICAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHBhcmFtc0Fzc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaiA9PSBncm91cE1lbWJlckZyYWdzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICBqID0gMDsKLSAgICAgICAgICBTdHJpbmcgbmV3R3JvdXBJRDsKLSAgICAgICAgICBpZiAoIXBhcmFtc0Fzc2lnbmVkKQotICAgICAgICAgICAgbmV3R3JvdXBJRCA9IGNyZWF0ZUluc3RhbmNlKCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbmV3R3JvdXBJRCA9IG51bGw7Ci0gICAgICAgICAgcHJldkdyb3VwSUQgPSBjdXJyR3JvdXBJRDsKLSAgICAgICAgICBjdXJyR3JvdXBJRCA9IG5ld0dyb3VwSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGorKzsKLSAgICAgIH0gd2hpbGUgKCFwYXJhbXNBc3NpZ25lZCAmJiBqICE9IGdyb3VwTWVtYmVySW5kZXgpOwotICAgICAgZ3JvdXBNZW1iZXJJbmRleCA9IGo7Ci0gICAgICBpZiAoIXBhcmFtc0Fzc2lnbmVkKSB7Ci0gICAgICAgIGluc3RhbmNlUGFydGl0aW9uID0gZ2V0SW5zdGFuY2VEb2N1bWVudFBhcnRpdGlvbihpbnN0YW5jZURvY3VtZW50cywgaSwgRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEKTsKLSAgICAgICAgaWYgKHdpbGRjYXJkRnJhZ0luZGV4ID49IDApIHsKLSAgICAgICAgICBpZiAod2lsZGNhcmRGcmFnSW5kZXggPj0gZ3JvdXBNZW1iZXJJbmRleCkgewotICAgICAgICAgICAgcmVtb3ZlR3JvdXBJRChjdXJyR3JvdXBJRCk7Ci0gICAgICAgICAgICBjdXJyR3JvdXBJRCA9IHByZXZHcm91cElEOwotICAgICAgICAgIH0KLSAgICAgICAgICBncm91cE1lbWJlckluZGV4ID0gd2lsZGNhcmRGcmFnSW5kZXg7Ci0gICAgICAgICAgSVhTREZyYWdtZW50W10gZ3JvdXBNZW1iZXJGcmFncyA9IGdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGN1cnJHcm91cElEKTsKLSAgICAgICAgICBpZiAoIWdyb3VwTWVtYmVyRnJhZ3Nbd2lsZGNhcmRGcmFnSW5kZXhdLnNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhpbnN0YW5jZVBhcnRpdGlvbikpCi0gICAgICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHBhcmFtc0Fzc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJyR3JvdXBJRCAhPSBudWxsICYmIChwcmV2R3JvdXBJRCA9PSBudWxsIHx8ICFjdXJyR3JvdXBJRC5lcXVhbHMocHJldkdyb3VwSUQpKSkgewotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgcmVtb3ZlR3JvdXBJRChjdXJyR3JvdXBJRCk7Ci0gICAgICAgICAgY3Vyckdyb3VwSUQgPSBwcmV2R3JvdXBJRDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaSA9IGkgKyBpbnN0YW5jZVBhcnRpdGlvbi5sZW5ndGg7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudFtdIGdldEluc3RhbmNlRG9jdW1lbnRQYXJ0aXRpb24oRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzLCBpbnQgc3RhcnQsIGludCBtYXhTaXplKSB7Ci0gICAgU3RyaW5nIHRhZ05hbWUgPSBpbnN0YW5jZURvY3VtZW50c1tzdGFydF0uZ2V0VGFnTmFtZSgpOwotICAgIGludCBzaXplID0gMTsKLSAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmIChtYXhTaXplICE9IEZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCAmJiBzaXplID49IG1heFNpemUpCi0gICAgICAgIGJyZWFrOwotICAgICAgZWxzZSBpZiAoaW5zdGFuY2VEb2N1bWVudHNbaV0uZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWdOYW1lKSkKLSAgICAgICAgc2l6ZSsrOwotICAgICAgZWxzZQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgRWxlbWVudFtdIHN1YnNldCA9IG5ldyBFbGVtZW50W3NpemVdOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3Vic2V0Lmxlbmd0aDsgaisrKSB7Ci0gICAgICBzdWJzZXRbal0gPSBpbnN0YW5jZURvY3VtZW50c1tzdGFydCArIGpdOwotICAgIH0KLSAgICByZXR1cm4gc3Vic2V0OwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnRbXSBnZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoYm9vbGVhbiBnZW5YU0lUeXBlLCBIYXNodGFibGUgbmFtZXNwYWNlVGFibGUsIERvY3VtZW50IGRvYykgewotICAgIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gICAgVmVjdG9yIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBFbGVtZW50W10gZnJhZ21lbnRJbnN0YW5jZXMgPSBncm91cE1lbWJlckZyYWdtZW50c1tpXS5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoZ2VuWFNJVHlwZSwgbmFtZXNwYWNlVGFibGUsIGRvYyk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZyYWdtZW50SW5zdGFuY2VzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgIGluc3RhbmNlRG9jdW1lbnRzQ29weS5hZGQoZnJhZ21lbnRJbnN0YW5jZXNbal0pOwotICAgICAgfQotICAgIH0KLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFtpbnN0YW5jZURvY3VtZW50c0NvcHkuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBrID0gMDsgayA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaysrKSB7Ci0gICAgICBpbnN0YW5jZURvY3VtZW50c1trXSA9IChFbGVtZW50KWluc3RhbmNlRG9jdW1lbnRzQ29weS5nZXQoayk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZURvY3VtZW50czsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgeHNkTW9kZWxHcm91cF8gPSB4c2RNb2RlbEdyb3VwOwotICB9Ci0KLSAgcHVibGljIFhTRE1vZGVsR3JvdXAgZ2V0WFNETW9kZWxHcm91cCgpIHsKLSAgICByZXR1cm4geHNkTW9kZWxHcm91cF87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0R3JvdXBJRHMoKSB7Ci0gICAgU3RyaW5nW10gZ3JvdXBJRHMgPSBuZXcgU3RyaW5nW2dyb3VwSURzT3JkZXJfLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cElEcy5sZW5ndGg7IGkrKykgewotICAgICAgZ3JvdXBJRHNbaV0gPSAoU3RyaW5nKWdyb3VwSURzT3JkZXJfLmdldChpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdyb3VwSURzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlR3JvdXBJRHMoKSB7Ci0gICAgcmVtb3ZlQWxsRnJhZ21lbnRzKCk7Ci0gICAgZ3JvdXBJRHNPcmRlcl8uY2xlYXIoKTsKLSAgICBncm91cElEc18uY2xlYXIoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUdyb3VwSUQoU3RyaW5nIGdyb3VwSUQpIHsKLSAgICBTdHJpbmdbXSBtZW1iZXJGcmFnSURzID0gZ2V0R3JvdXBNZW1iZXJJRHMoZ3JvdXBJRCk7Ci0gICAgcmVtb3ZlRnJhZ21lbnRzKG1lbWJlckZyYWdJRHMpOwotICAgIGdyb3VwSURzT3JkZXJfLnJlbW92ZShncm91cElEKTsKLSAgICBncm91cElEc18ucmVtb3ZlKGdyb3VwSUQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0R3JvdXBNZW1iZXJJRHMoU3RyaW5nIGdyb3VwSUQsIFN0cmluZ1tdIGdyb3VwTWVtYmVySURzKSB7Ci0gICAgaWYgKGdyb3VwSUQgIT0gbnVsbCkgewotICAgICAgaWYgKCFncm91cElEc09yZGVyXy5jb250YWlucyhncm91cElEKSkKLSAgICAgICAgZ3JvdXBJRHNPcmRlcl8uYWRkKGdyb3VwSUQpOwotICAgICAgaWYgKGdyb3VwTWVtYmVySURzICE9IG51bGwpCi0gICAgICAgIGdyb3VwSURzXy5wdXQoZ3JvdXBJRCwgZ3JvdXBNZW1iZXJJRHMpOwotICAgICAgZWxzZQotICAgICAgICBncm91cElEc18ucHV0KGdyb3VwSUQsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldEdyb3VwTWVtYmVyRnJhZ21lbnRzKFN0cmluZyBncm91cElELCBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdtZW50cykgewotICAgIGFkZEZyYWdtZW50cyhncm91cE1lbWJlckZyYWdtZW50cyk7Ci0gICAgU3RyaW5nW10gaWRzID0gbmV3IFN0cmluZ1tncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZHNbaV0gPSBncm91cE1lbWJlckZyYWdtZW50c1tpXS5nZXRJRCgpOwotICAgIH0KLSAgICBzZXRHcm91cE1lbWJlcklEcyhncm91cElELCBpZHMpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGdldEdyb3VwTWVtYmVySURzKFN0cmluZyBncm91cElEKSB7Ci0gICAgaWYgKGdyb3VwSUQgIT0gbnVsbCkgewotICAgICAgU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMgPSAoU3RyaW5nW10pZ3JvdXBJRHNfLmdldChncm91cElEKTsKLSAgICAgIGlmIChncm91cE1lbWJlcklEcyAhPSBudWxsKQotICAgICAgICByZXR1cm4gZ3JvdXBNZW1iZXJJRHM7Ci0gICAgfQotICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudFtdIGdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKFN0cmluZyBncm91cElEKSB7Ci0gICAgU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMgPSBnZXRHcm91cE1lbWJlcklEcyhncm91cElEKTsKLSAgICBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdtZW50cyA9IG5ldyBJWFNERnJhZ21lbnRbZ3JvdXBNZW1iZXJJRHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBncm91cE1lbWJlckZyYWdtZW50c1tpXSA9IGdldEZyYWdtZW50KGdyb3VwTWVtYmVySURzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdyb3VwTWVtYmVyRnJhZ21lbnRzOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVHcm91cEluc3RhbmNlKCkgewotICAgIFN0cmluZyBncm91cElEID0gZ2VuSUQoKTsKLSAgICBFTGlzdCBwYXJ0aWNsZXMgPSBnZXRYU0RNb2RlbEdyb3VwKCkuZ2V0UGFydGljbGVzKCk7Ci0gICAgU3RyaW5nW10gZ3JvdXBNZW1iZXJJRHMgPSBuZXcgU3RyaW5nW3BhcnRpY2xlcy5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGljbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBYU0RQYXJ0aWNsZSB4c2RQYXJ0aWNsZSA9IChYU0RQYXJ0aWNsZSlwYXJ0aWNsZXMuZ2V0KGkpOwotICAgICAgWFNEUGFydGljbGVDb250ZW50IHhzZFBhcnRpY2xlQ29udGVudCA9IHhzZFBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHRoaXNDb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgICBpZiAoeHNkUGFydGljbGVDb250ZW50IGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgICB4c2RDb25maWcuc2V0WFNEQ29tcG9uZW50KChYU0RDb21wb25lbnQpeHNkUGFydGljbGVDb250ZW50KTsKLSAgICAgIGVsc2UKLSAgICAgICAgeHNkQ29uZmlnLnNldFhTRENvbXBvbmVudChudWxsKTsKLSAgICAgIHhzZENvbmZpZy5zZXRTdHlsZSh0aGlzQ29uZmlnLmdldFN0eWxlKCkpOwotICAgICAgeHNkQ29uZmlnLnNldFBhcnRFbmNvZGluZyh0aGlzQ29uZmlnLmdldFBhcnRFbmNvZGluZygpKTsKLSAgICAgIHhzZENvbmZpZy5zZXRXU0RMUGFydE5hbWUodGhpc0NvbmZpZy5nZXRXU0RMUGFydE5hbWUoKSk7Ci0gICAgICBncm91cE1lbWJlcklEc1tpXSA9IGdlbklEKCk7Ci0gICAgICBhZGRGcmFnbWVudChncm91cE1lbWJlcklEc1tpXSwgZ2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKS5nZXRGcmFnbWVudCh4c2RDb25maWcsIGdyb3VwTWVtYmVySURzW2ldLCBncm91cE1lbWJlcklEc1tpXSkpOwotICAgIH0KLSAgICBzZXRHcm91cE1lbWJlcklEcyhncm91cElELCBncm91cE1lbWJlcklEcyk7Ci0gICAgcmV0dXJuIGdyb3VwSUQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBTZXFGaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cFNlcUZpeEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTFhMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cFNlcUZpeEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGNsYXNzIFhTREdyb3VwU2VxRml4RnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cFNlcUZyYWdtZW50IHsKLSAgcHVibGljIFhTREdyb3VwU2VxRml4RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyLCBYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyLCB4c2RNb2RlbEdyb3VwKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBSRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREdyb3VwU2VxRml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBTZXFGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cFNlcUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDgxMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RHcm91cFNlcUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNER3JvdXBTZXFGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhTREdyb3VwU2VxRnJhZ21lbnQgZXh0ZW5kcyBYU0RHcm91cEZyYWdtZW50IGltcGxlbWVudHMgSVhTREdyb3VwU2VxRnJhZ21lbnQgewotICBwdWJsaWMgWFNER3JvdXBTZXFGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIsIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIsIHhzZE1vZGVsR3JvdXApOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBjcmVhdGVHcm91cFNlcUluc3RhbmNlKCkgewotICAgIHJldHVybiBjcmVhdGVHcm91cEluc3RhbmNlKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkgewotICAgIHJldHVybiBjcmVhdGVHcm91cFNlcUluc3RhbmNlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBTZXFSYW5nZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTREdyb3VwU2VxUmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI2YTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNER3JvdXBTZXFSYW5nZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLQotcHVibGljIGNsYXNzIFhTREdyb3VwU2VxUmFuZ2VGcmFnbWVudCBleHRlbmRzIFhTREdyb3VwU2VxRnJhZ21lbnQgewotICBwdWJsaWMgWFNER3JvdXBTZXFSYW5nZUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlciwgWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgY29udHJvbGxlciwgeHNkTW9kZWxHcm91cCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTREdyb3VwUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RHcm91cFNlcVJhbmdlV0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNETWFwRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNETWFwRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMzMwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRE1hcEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RNYXBGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNETWFwRnJhZ21lbnQgZXh0ZW5kcyBYU0RGcmFnbWVudCBpbXBsZW1lbnRzIElYU0RNYXBGcmFnbWVudCB7Ci0gIHByaXZhdGUgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcl87Ci0gIHByaXZhdGUgVmVjdG9yIGZyYWdtZW50c09yZGVyXzsKLSAgcHJpdmF0ZSBIYXNodGFibGUgZnJhZ21lbnRzXzsKLQotICBwdWJsaWMgWFNETWFwRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgIGZyYWdtZW50c09yZGVyXyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmcmFnbWVudHNfID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BhcmFtZXRlclZhbHVlcyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbiB7Ci0gICAgYm9vbGVhbiB2YWx1ZXNWYWxpZCA9IHRydWU7Ci0gICAgU3RyaW5nW10gcGFyYW1zID0gcGFyc2VyLmdldFBhcmFtZXRlclZhbHVlcyhnZXRJRCgpKTsKLSAgICBWZWN0b3IgZnJhZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgewotICAgICAgICBpZiAocGFyYW1zW2ldICE9IG51bGwpIHsKLSAgICAgICAgICBJWFNERnJhZ21lbnQgZnJhZyA9IGdldEZyYWdtZW50KHBhcmFtc1tpXSk7Ci0gICAgICAgICAgaWYgKGZyYWcgIT0gbnVsbCkgewotICAgICAgICAgICAgZnJhZ3MuYWRkKGZyYWcpOwotICAgICAgICAgICAgaWYgKCFmcmFnLnByb2Nlc3NQYXJhbWV0ZXJWYWx1ZXMocGFyc2VyKSkKLSAgICAgICAgICAgICAgdmFsdWVzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmVtb3ZlQWxsRnJhZ21lbnRzKCk7Ci0gICAgYWRkRnJhZ21lbnRzKGZyYWdzKTsKLSAgICByZXR1cm4gdmFsdWVzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIHBhcmFtS2V5LCBTdHJpbmdbXSBwYXJhbXMpIHsKLSAgICBJWFNERnJhZ21lbnQgZnJhZyA9IGdldEZyYWdtZW50KHBhcmFtS2V5KTsKLSAgICBpZiAoZnJhZyAhPSBudWxsKQotICAgICAgZnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXksIHBhcmFtcyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSkgewotICAgIElYU0RGcmFnbWVudCBmcmFnID0gZ2V0RnJhZ21lbnQocGFyYW1LZXkpOwotICAgIHJldHVybiAoZnJhZyAhPSBudWxsKSA/IGZyYWcuZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtS2V5KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpIHsKLSAgICBJWFNERnJhZ21lbnRbXSBmcmFnbWVudHMgPSBnZXRBbGxGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKCFmcmFnbWVudHNbaV0udmFsaWRhdGVBbGxQYXJhbWV0ZXJWYWx1ZXMoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKFN0cmluZyBwYXJhbUtleSkgewotICAgIElYU0RGcmFnbWVudCBmcmFnID0gZ2V0RnJhZ21lbnQocGFyYW1LZXkpOwotICAgIHJldHVybiAoZnJhZyAhPSBudWxsKSA/IGZyYWcudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMocGFyYW1LZXkpIDogdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVyVmFsdWUoU3RyaW5nIHBhcmFtS2V5LCBpbnQgcGFyYW1JbmRleCkgewotICAgIElYU0RGcmFnbWVudCBmcmFnID0gZ2V0RnJhZ21lbnQocGFyYW1LZXkpOwotICAgIHJldHVybiAoZnJhZyAhPSBudWxsKSA/IGZyYWcudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShwYXJhbUtleSwgcGFyYW1JbmRleCkgOiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIGNvbnRyb2xsZXJfID0gY29udHJvbGxlcjsKLSAgfQotCi0gIHB1YmxpYyBYU0RUb0ZyYWdtZW50Q29udHJvbGxlciBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl87Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRGcmFnbWVudChTdHJpbmcgaWQsIElYU0RGcmFnbWVudCBmcmFnKSB7Ci0gICAgYWRkRnJhZ21lbnQoaWQsIGZyYWcsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRnJhZ21lbnRzKFN0cmluZ1tdIGlkLCBJWFNERnJhZ21lbnRbXSBmcmFncykgewotICAgIGFkZEZyYWdtZW50cyhpZCwgZnJhZ3MsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRnJhZ21lbnQoSVhTREZyYWdtZW50IGZyYWcpIHsKLSAgICBhZGRGcmFnbWVudChmcmFnLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEZyYWdtZW50cyhJWFNERnJhZ21lbnRbXSBmcmFncykgewotICAgIGFkZEZyYWdtZW50cyhmcmFncywgdHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRGcmFnbWVudHMoVmVjdG9yIGZyYWdzKSB7Ci0gICAgYWRkRnJhZ21lbnRzKGZyYWdzLCB0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEZyYWdtZW50KFN0cmluZyBpZCwgSVhTREZyYWdtZW50IGZyYWcsIGJvb2xlYW4gYWRkVG9Db250cm9sbGVyKSB7Ci0gICAgZnJhZ21lbnRzT3JkZXJfLmFkZChpZCk7Ci0gICAgZnJhZ21lbnRzXy5wdXQoaWQsIGZyYWcpOwotICAgIGNvbnRyb2xsZXJfLmFkZFRvQ2FjaGUoaWQsIGZyYWcpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRnJhZ21lbnRzKFN0cmluZ1tdIGlkLCBJWFNERnJhZ21lbnRbXSBmcmFncywgYm9vbGVhbiBhZGRUb0NvbnRyb2xsZXIpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlkLmxlbmd0aCAmJiBpIDwgZnJhZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIGFkZEZyYWdtZW50KGlkW2ldLCBmcmFnc1tpXSwgYWRkVG9Db250cm9sbGVyKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRGcmFnbWVudChJWFNERnJhZ21lbnQgZnJhZywgYm9vbGVhbiBhZGRUb0NvbnRyb2xsZXIpIHsKLSAgICBhZGRGcmFnbWVudChmcmFnLmdldElEKCksIGZyYWcsIGFkZFRvQ29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRGcmFnbWVudHMoSVhTREZyYWdtZW50W10gZnJhZ3MsIGJvb2xlYW4gYWRkVG9Db250cm9sbGVyKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFncy5sZW5ndGg7IGkrKykgewotICAgICAgYWRkRnJhZ21lbnQoZnJhZ3NbaV0uZ2V0SUQoKSwgZnJhZ3NbaV0sIGFkZFRvQ29udHJvbGxlcik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRnJhZ21lbnRzKFZlY3RvciBmcmFncywgYm9vbGVhbiBhZGRUb0NvbnRyb2xsZXIpIHsKLSAgICBJdGVyYXRvciBpdCA9IGZyYWdzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJWFNERnJhZ21lbnQpIHsKLSAgICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSAoSVhTREZyYWdtZW50KW9iajsKLSAgICAgICAgYWRkRnJhZ21lbnQoZnJhZy5nZXRJRCgpLCBmcmFnLCBhZGRUb0NvbnRyb2xsZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRGcmFnbWVudHNPcmRlcigpIHsKLSAgICBTdHJpbmdbXSBmcmFnbWVudHNPcmRlciA9IG5ldyBTdHJpbmdbZnJhZ21lbnRzT3JkZXJfLnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHNPcmRlci5sZW5ndGg7IGkrKykgewotICAgICAgZnJhZ21lbnRzT3JkZXJbaV0gPSAoU3RyaW5nKWZyYWdtZW50c09yZGVyXy5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBmcmFnbWVudHNPcmRlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHNldEZyYWdtZW50c09yZGVyKFN0cmluZ1tdIGZyYWdtZW50c09yZGVyKSB7Ci0gICAgaWYgKGZyYWdtZW50c09yZGVyLmxlbmd0aCAhPSBmcmFnbWVudHNPcmRlcl8uc2l6ZSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFZlY3RvciBmcmFnbWVudHNPcmRlckNvcHkgPSBuZXcgVmVjdG9yKGZyYWdtZW50c09yZGVyXyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHNPcmRlci5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKCFmcmFnbWVudHNPcmRlckNvcHkucmVtb3ZlKGZyYWdtZW50c09yZGVyW2ldKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmcmFnbWVudHNPcmRlcl8uY2xlYXIoKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGZyYWdtZW50c09yZGVyLmxlbmd0aDsgaisrKSB7Ci0gICAgICBmcmFnbWVudHNPcmRlcl8uYWRkKGZyYWdtZW50c09yZGVyW2pdKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgSVhTREZyYWdtZW50IGdldEZyYWdtZW50KFN0cmluZyBpZCkgewotICAgIHJldHVybiAoSVhTREZyYWdtZW50KWZyYWdtZW50c18uZ2V0KGlkKTsKLSAgfQotCi0gIHB1YmxpYyBJWFNERnJhZ21lbnRbXSBnZXRGcmFnbWVudHMoU3RyaW5nW10gaWRzKSB7Ci0gICAgSVhTREZyYWdtZW50W10gZnJhZ3MgPSBuZXcgSVhTREZyYWdtZW50W2lkcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIGZyYWdzW2ldID0gZ2V0RnJhZ21lbnQoaWRzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZyYWdzOwotICB9Ci0KLSAgcHVibGljIElYU0RGcmFnbWVudFtdIGdldEFsbEZyYWdtZW50cygpIHsKLSAgICBJWFNERnJhZ21lbnRbXSBmcmFnbWVudHMgPSBuZXcgSVhTREZyYWdtZW50W2ZyYWdtZW50c09yZGVyXy5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzT3JkZXJfLnNpemUoKTsgaSsrKSB7Ci0gICAgICBmcmFnbWVudHNbaV0gPSBnZXRGcmFnbWVudCgoU3RyaW5nKWZyYWdtZW50c09yZGVyXy5nZXQoaSkpOwotICAgIH0KLSAgICByZXR1cm4gZnJhZ21lbnRzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJhZ21lbnQoU3RyaW5nIGlkKSB7Ci0gICAgcmVtb3ZlRnJhZ21lbnQoaWQsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJhZ21lbnRzKFN0cmluZ1tdIGlkcykgewotICAgIHJlbW92ZUZyYWdtZW50cyhpZHMsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsRnJhZ21lbnRzKCkgewotICAgIHJlbW92ZUFsbEZyYWdtZW50cyh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZyYWdtZW50KFN0cmluZyBpZCwgYm9vbGVhbiByZW1vdmVGcm9tQ29udHJvbGxlcikgewotICAgIGZyYWdtZW50c09yZGVyXy5yZW1vdmUoaWQpOwotICAgIGZyYWdtZW50c18ucmVtb3ZlKGlkKTsKLSAgICBpZiAocmVtb3ZlRnJvbUNvbnRyb2xsZXIpCi0gICAgICBjb250cm9sbGVyXy5yZW1vdmVGcm9tQ2FjaGUoaWQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJhZ21lbnRzKFN0cmluZ1tdIGlkcywgYm9vbGVhbiByZW1vdmVGcm9tQ29udHJvbGxlcikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICByZW1vdmVGcmFnbWVudChpZHNbaV0sIHJlbW92ZUZyb21Db250cm9sbGVyKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxGcmFnbWVudHMoYm9vbGVhbiByZW1vdmVGcm9tQ29udHJvbGxlcikgewotICAgIGlmIChyZW1vdmVGcm9tQ29udHJvbGxlcikKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiBpZHMgPSBmcmFnbWVudHNfLmtleXMoKTsKLSAgICAgIHdoaWxlIChpZHMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpZCA9IChTdHJpbmcpaWRzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGNvbnRyb2xsZXJfLnJlbW92ZUZyb21DYWNoZShpZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZyYWdtZW50c09yZGVyXy5jbGVhcigpOwotICAgIGZyYWdtZW50c18uY2xlYXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNEYXRlVGltZUZpeEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmNmJhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4RnJhZ21lbnQgZXh0ZW5kcyBYU0RTaW1wbGVBdG9taWNGaXhGcmFnbWVudCB7Ci0gIHByaXZhdGUgaW50IGNhbGVuZGFyVHlwZV87Ci0gIHB1YmxpYyBYU0RTaW1wbGVBdG9taWNEYXRlVGltZUZpeEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IGNhbGVuZGFyVHlwZSkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcpOwotICAgIGNhbGVuZGFyVHlwZV8gPSBjYWxlbmRhclR5cGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICBTdHJpbmdCdWZmZXIgZnJhZ21lbnRMaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVGaXhXRnJhZ21lbnRKU1AuanNwPyIpOwotICAgIGZyYWdtZW50TGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEUpLmFwcGVuZCgnPScpLmFwcGVuZChjYWxlbmRhclR5cGVfKTsKLSAgICByZXR1cm4gZnJhZ21lbnRMaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVSYW5nZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lUmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGQyNmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVSYW5nZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVBdG9taWNEYXRlVGltZVJhbmdlRnJhZ21lbnQgZXh0ZW5kcyBYU0RTaW1wbGVBdG9taWNSYW5nZUZyYWdtZW50IHsKLSAgcHJpdmF0ZSBpbnQgY2FsZW5kYXJUeXBlXzsKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY0RhdGVUaW1lUmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIGludCBjYWxlbmRhclR5cGUpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnKTsKLSAgICBjYWxlbmRhclR5cGVfID0gY2FsZW5kYXJUeXBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIFN0cmluZ0J1ZmZlciBmcmFnbWVudExpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNEYXRlVGltZVJhbmdlV0ZyYWdtZW50SlNQLmpzcD8iKTsKLSAgICBmcmFnbWVudExpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQoY2FsZW5kYXJUeXBlXyk7Ci0gICAgcmV0dXJuIGZyYWdtZW50TGluay50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNFbnVtRml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwMTU1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudCB7Ci0gIHB1YmxpYyBYU0RTaW1wbGVBdG9taWNFbnVtRml4RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBFTGlzdCBlbGlzdCkgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGVsaXN0KTsKLSAgfQotICAKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY0VudW1GaXhGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIE9wdGlvblZlY3RvciB2KQotICB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgdik7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNFbnVtRml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTljZDRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50IGV4dGVuZHMgWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQgewotICBwcml2YXRlIE9wdGlvblZlY3RvciBvcHRpb25WZWN0b3JfOwotICBwdWJsaWMgWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgRUxpc3QgZWxpc3QpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnKTsKLSAgICBvcHRpb25WZWN0b3JfID0gbmV3IE9wdGlvblZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDtpPGVsaXN0LnNpemUoKTtpKyspCi0gICAgewotICAgICAgU3RyaW5nIGVudW1WYWx1ZSA9ICgoWFNERW51bWVyYXRpb25GYWNldCllbGlzdC5nZXQoaSkpLmdldExleGljYWxWYWx1ZSgpOwotICAgICAgb3B0aW9uVmVjdG9yXy5hZGRPcHRpb24oZW51bVZhbHVlLGVudW1WYWx1ZSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgT3B0aW9uVmVjdG9yIHYpCi0gIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnKTsKLSAgICBvcHRpb25WZWN0b3JfID0gbmV3IE9wdGlvblZlY3RvcigpOwotICAgIGZvciAoaW50IGk9MDtpPHYuc2l6ZSgpO2krKykKLSAgICAgIG9wdGlvblZlY3Rvcl8uYWRkT3B0aW9uKHYuZ2V0RGlzcGxheVZhbHVlKGkpLHYuZ2V0VmFsdWUoaSkpOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgT3B0aW9uVmVjdG9yIGdldE9wdGlvblZlY3RvcigpCi0gIHsKLSAgICByZXR1cm4gb3B0aW9uVmVjdG9yXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTc0YmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudCB7Ci0gIHB1YmxpYyBYU0RTaW1wbGVBdG9taWNFbnVtUmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIEVMaXN0IGVsaXN0KSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZywgZWxpc3QpOwotICB9Ci0gIAotICBwdWJsaWMgWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnLCBPcHRpb25WZWN0b3IgdikKLSAgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIHYpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljSW5mb0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFJlYWRGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY1JGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlV0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRml4RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4ZGRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY0ZpeEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZUF0b21pY0ZpeEZyYWdtZW50IGV4dGVuZHMgWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQgewotICBwdWJsaWMgWFNEU2ltcGxlQXRvbWljRml4RnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNGaXhXRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJhMWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RTaW1wbGVBdG9taWNGcmFnbWVudCBleHRlbmRzIFhTREZyYWdtZW50IGltcGxlbWVudHMgSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50IHsKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY0ZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZykgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZShTdHJpbmcgcGFyYW1LZXksIGludCBwYXJhbUluZGV4KSB7Ci0gICAgU3RyaW5nIHBhcmFtID0gZ2V0UGFyYW1ldGVyVmFsdWUocGFyYW1LZXksIHBhcmFtSW5kZXgpOwotICAgIGlmIChwYXJhbSAhPSBudWxsICYmICEoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCkpLmlzVmFsaWRMaXRlcmFsKHBhcmFtKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVBdG9taWNSYW5nZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY1JhbmdlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiYmQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUF0b21pY1JhbmdlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlQXRvbWljUmFuZ2VGcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZUF0b21pY0ZyYWdtZW50IHsKLSAgcHVibGljIFhTRFNpbXBsZUF0b21pY1JhbmdlRnJhZ21lbnQoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgc3VwZXIoaWQsIG5hbWUsIGNvbmZpZyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNSYW5nZVdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUxpc3RGaXhGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0Rml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2NWJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUxpc3RGaXhGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVMaXN0Rml4RnJhZ21lbnQgZXh0ZW5kcyBYU0RTaW1wbGVMaXN0RnJhZ21lbnQgewotICBwdWJsaWMgWFNEU2ltcGxlTGlzdEZpeEZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVMaXN0UkZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdyaXRlRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVMaXN0Rml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlTGlzdEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNDYyMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RTaW1wbGVMaXN0RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RMZW5ndGhGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETWluTGVuZ3RoRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1heExlbmd0aEZhY2V0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYU0RTaW1wbGVMaXN0RnJhZ21lbnQgZXh0ZW5kcyBYU0RNYXBGcmFnbWVudCBpbXBsZW1lbnRzIElYU0RTaW1wbGVMaXN0RnJhZ21lbnQKLXsKLSAgcHVibGljIFhTRFNpbXBsZUxpc3RGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlci5zZXROYW1lKG5hbWUpOwotICAgIElYU0RGcmFnbWVudFtdIGZyYWdtZW50cyA9IGdldEFsbEZyYWdtZW50cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGZyYWdtZW50c1tpXS5zZXROYW1lKG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNldFBhcmFtZXRlclZhbHVlc0Zyb21JbnN0YW5jZURvY3VtZW50cyhFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMpCi0gIHsKLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHNDb3B5ID0gZ2V0SW5zdGFuY2VEb2N1bWVudHNCeVRhZ05hbWUoaW5zdGFuY2VEb2N1bWVudHMsIGdldE5hbWUoKSk7Ci0gICAgU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1tpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoXTsKLSAgICBib29sZWFuIHBhcmFtc1ZhbGlkID0gaW50ZXJuYWxFcXVhbHMoaW5zdGFuY2VEb2N1bWVudHNDb3B5LCBpbnN0YW5jZURvY3VtZW50cyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgcGFyYW1zW2ldID0gIiI7Ci0gICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGluc3RhbmNlRG9jdW1lbnRzQ29weVtpXS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKDApOwotICAgICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKQotICAgICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0gICAgICAgICAgcGFyYW1zVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHBhcmFtc1tpXSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHBhcmFtc1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHJlbW92ZUFsbEZyYWdtZW50cygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElYU0RGcmFnbWVudCBjaGlsZEZyYWcgPSBnZXRGcmFnbWVudChjcmVhdGVMaXN0SW5zdGFuY2UoKSk7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhcmFtc1tpXS50cmltKCkpOwotICAgICAgU3RyaW5nW10gY2hpbGRQYXJhbXMgPSBuZXcgU3RyaW5nW3N0LmNvdW50VG9rZW5zKCldOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZFBhcmFtcy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgY2hpbGRQYXJhbXNbal0gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIH0KLSAgICAgIGNoaWxkRnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXMoY2hpbGRGcmFnLmdldElEKCksIGNoaWxkUGFyYW1zKTsKLSAgICAgIHBhcmFtc1ZhbGlkID0gcGFyYW1zVmFsaWQgJiYgY2hpbGRGcmFnLnZhbGlkYXRlQWxsUGFyYW1ldGVyVmFsdWVzKCk7Ci0gICAgfQotICAgIHJldHVybiBwYXJhbXNWYWxpZDsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50W10gZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKGJvb2xlYW4gZ2VuWFNJVHlwZSwgSGFzaHRhYmxlIG5hbWVzcGFjZVRhYmxlLCBEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBJWFNERnJhZ21lbnRbXSBmcmFnbWVudHMgPSBnZXRBbGxGcmFnbWVudHMoKTsKLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFtmcmFnbWVudHMubGVuZ3RoXTsKLSAgICBTdHJpbmcgdGFnTmFtZSA9IGdldEluc3RhbmNlRG9jdW1lbnRUYWdOYW1lKG5hbWVzcGFjZVRhYmxlKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IGluc3RhbmNlRG9jdW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLSAgICAgIFN0cmluZ0J1ZmZlciBsaXN0VmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbXMgPSBmcmFnbWVudHNbaV0uZ2V0UGFyYW1ldGVyVmFsdWVzKGZyYWdtZW50c1tpXS5nZXRJRCgpKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBwYXJhbXMgIT0gbnVsbCAmJiBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBpZiAoaiAhPSAwKQotICAgICAgICAgIGxpc3RWYWx1ZS5hcHBlbmQoRnJhZ21lbnRDb25zdGFudHMuTElTVF9TRVBFUkFUT1IpOwotICAgICAgICBsaXN0VmFsdWUuYXBwZW5kKHBhcmFtc1tqXSk7Ci0gICAgICB9Ci0gICAgICBOb2RlIHRleHROb2RlID0gZG9jLmNyZWF0ZVRleHROb2RlKGxpc3RWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgIGluc3RhbmNlRG9jdW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSBpbnN0YW5jZURvY3VtZW50OwotICAgIH0KLSAgICByZXR1cm4gKGdlblhTSVR5cGUgPyBhZGRYU0lUeXBlKGluc3RhbmNlRG9jdW1lbnRzLCBuYW1lc3BhY2VUYWJsZSkgOiBpbnN0YW5jZURvY3VtZW50cyk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUxpc3RJbnN0YW5jZSgpCi0gIHsKLSAgICBTdHJpbmcgbmV3SUQgPSBnZW5JRCgpOwotICAgIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgICBpbnQgbWluID0gMDsKLSAgICBpbnQgbWF4ID0gRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEOwotICAgIFhTRExlbmd0aEZhY2V0IHhzZExlbmd0aEZhY2V0ID0gc2ltcGxlVHlwZS5nZXRMZW5ndGhGYWNldCgpOwotICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgaWYgKHhzZExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgewotICAgICAgbWluID0geHNkTGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgIG1heCA9IHhzZExlbmd0aEZhY2V0LmdldFZhbHVlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBYU0RNaW5MZW5ndGhGYWNldCB4c2RNaW5MZW5ndGhGYWNldCA9IHNpbXBsZVR5cGUuZ2V0TWluTGVuZ3RoRmFjZXQoKTsKLSAgICAgIFhTRE1heExlbmd0aEZhY2V0IHhzZE1heExlbmd0aEZhY2V0ID0gc2ltcGxlVHlwZS5nZXRNYXhMZW5ndGhGYWNldCgpOwotICAgICAgLy8gcG9ydCB0byBvcmcuZWNsaXBzZS54c2QKLSAgICAgIGlmICh4c2RNaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgICBtaW4gPSB4c2RNaW5MZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICAgICAgaWYgKHhzZE1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICAgIG1heCA9IHhzZE1heExlbmd0aEZhY2V0LmdldFZhbHVlKCk7Ci0gICAgfQotICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHRoaXNDb25maWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IG5ldyBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotICAgIHhzZENvbmZpZy5zZXRYU0RDb21wb25lbnQoc2ltcGxlVHlwZS5nZXRJdGVtVHlwZURlZmluaXRpb24oKSk7Ci0gICAgeHNkQ29uZmlnLnNldFN0eWxlKHRoaXNDb25maWcuZ2V0U3R5bGUoKSk7Ci0gICAgeHNkQ29uZmlnLnNldFBhcnRFbmNvZGluZyh0aGlzQ29uZmlnLmdldFBhcnRFbmNvZGluZygpKTsKLSAgICB4c2RDb25maWcuc2V0V1NETFBhcnROYW1lKHRoaXNDb25maWcuZ2V0V1NETFBhcnROYW1lKCkpOwotICAgIHhzZENvbmZpZy5zZXRNaW5PY2N1cnMobWluKTsKLSAgICB4c2RDb25maWcuc2V0TWF4T2NjdXJzKG1heCk7Ci0gICAgSVhTREZyYWdtZW50IGZyYWcgPSBnZXRYU0RUb0ZyYWdtZW50Q29udHJvbGxlcigpLmdldEZyYWdtZW50KHhzZENvbmZpZywgbmV3SUQsIGdldE5hbWUoKSk7Ci0gICAgZnJhZy5zZXRJRChuZXdJRCk7Ci0gICAgZnJhZy5zZXROYW1lKGdldE5hbWUoKSk7Ci0gICAgYWRkRnJhZ21lbnQobmV3SUQsIGZyYWcpOwotICAgIHJldHVybiBuZXdJRDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgY3JlYXRlSW5zdGFuY2UoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUxpc3RJbnN0YW5jZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUxpc3RSYW5nZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZUxpc3RSYW5nZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjk1MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVMaXN0UmFuZ2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuWFNEVG9GcmFnbWVudENvbnRyb2xsZXI7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTaW1wbGVMaXN0UmFuZ2VGcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZUxpc3RGcmFnbWVudCB7Ci0gIHB1YmxpYyBYU0RTaW1wbGVMaXN0UmFuZ2VGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdFJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdFJhbmdlV0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVVbmlvbkZpeEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZVVuaW9uRml4RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjMjI0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZVVuaW9uRml4RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2ltcGxlVW5pb25GaXhGcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZVVuaW9uRnJhZ21lbnQgewotICBwdWJsaWMgWFNEU2ltcGxlVW5pb25GaXhGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiBjb25maWcsIFhTRFRvRnJhZ21lbnRDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICBzdXBlcihpZCwgbmFtZSwgY29uZmlnLCBjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb25GcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVhZEZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVW5pb25SRnJhZ21lbnRKU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVGcmFnbWVudCgpIHsKLSAgICByZXR1cm4gIi93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uRml4V0ZyYWdtZW50SlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlVW5pb25GcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVVbmlvbkZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTA2YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvaW1wbC9YU0RTaW1wbGVVbmlvbkZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RTaW1wbGVVbmlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LlhTRFRvRnJhZ21lbnRDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWFNEU2ltcGxlVW5pb25GcmFnbWVudCBleHRlbmRzIFhTRE1hcEZyYWdtZW50IGltcGxlbWVudHMgSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQgewotICBwcml2YXRlIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uW10gbWVtYmVyVHlwZXNfOwotCi0gIHB1YmxpYyBYU0RTaW1wbGVVbmlvbkZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIpOwotICAgIG1lbWJlclR5cGVzXyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgc3VwZXIuc2V0TmFtZShuYW1lKTsKLSAgICBJWFNERnJhZ21lbnRbXSBmcmFnbWVudHMgPSBnZXRBbGxGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgZnJhZ21lbnRzW2ldLnNldE5hbWUobmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cykgewotICAgIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50c0NvcHkgPSBnZXRJbnN0YW5jZURvY3VtZW50c0J5VGFnTmFtZShpbnN0YW5jZURvY3VtZW50cywgZ2V0TmFtZSgpKTsKLSAgICBpbnQgbnVtVHlwZXMgPSBnZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKS5sZW5ndGg7Ci0gICAgYm9vbGVhbiBwYXJhbXNWYWxpZCA9IGludGVybmFsRXF1YWxzKGluc3RhbmNlRG9jdW1lbnRzQ29weSwgaW5zdGFuY2VEb2N1bWVudHMpOwotICAgIFZlY3RvciBtZW1iZXJGcmFnbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50c0NvcHkubGVuZ3RoOyBpKyspIHsKLSAgICAgIElYU0RGcmFnbWVudCBjb21wYXRpYmxlRnJhZyA9IG51bGw7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG51bVR5cGVzOyBqKyspIHsKLSAgICAgICAgSVhTREZyYWdtZW50IG1lbWJlckZyYWcgPSBnZXRGcmFnbWVudChjcmVhdGVVbmlvbkluc3RhbmNlKGopKTsKLSAgICAgICAgRWxlbWVudFtdIG1lbWJlckluc3RhbmNlRG9jdW1lbnQgPSBuZXcgRWxlbWVudFsxXTsKLSAgICAgICAgbWVtYmVySW5zdGFuY2VEb2N1bWVudFswXSA9IHNldEVsZW1lbnRUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzQ29weVtpXSwgbWVtYmVyRnJhZy5nZXROYW1lKCkpOwotICAgICAgICBpZiAobWVtYmVyRnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMobWVtYmVySW5zdGFuY2VEb2N1bWVudCkpIHsKLSAgICAgICAgICBpZiAobWVtYmVyRnJhZy52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpKSB7Ci0gICAgICAgICAgICBjb21wYXRpYmxlRnJhZyA9IG1lbWJlckZyYWc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoY29tcGF0aWJsZUZyYWcgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbXBhdGlibGVGcmFnID0gbWVtYmVyRnJhZzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGNvbXBhdGlibGVGcmFnICE9IG51bGwpCi0gICAgICAgIG1lbWJlckZyYWdtZW50cy5hZGQoY29tcGF0aWJsZUZyYWcpOwotICAgICAgZWxzZQotICAgICAgICBwYXJhbXNWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICByZW1vdmVBbGxGcmFnbWVudHMoKTsKLSAgICBhZGRGcmFnbWVudHMobWVtYmVyRnJhZ21lbnRzKTsKLSAgICByZXR1cm4gcGFyYW1zVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudFtdIGdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhib29sZWFuIGdlblhTSVR5cGUsIEhhc2h0YWJsZSBuYW1lc3BhY2VUYWJsZSwgRG9jdW1lbnQgZG9jKSB7Ci0gICAgSVhTREZyYWdtZW50W10gZnJhZ21lbnRzID0gZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gICAgVmVjdG9yIGluc3RhbmNlRG9jdW1lbnRzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgRWxlbWVudFtdIGZyYWdtZW50SW5zdGFuY2VzID0gZnJhZ21lbnRzW2ldLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyhnZW5YU0lUeXBlLCBuYW1lc3BhY2VUYWJsZSwgZG9jKTsKLSAgICAgIGlmIChmcmFnbWVudEluc3RhbmNlcy5sZW5ndGggPiAwKQotICAgICAgICBpbnN0YW5jZURvY3VtZW50c0NvcHkuYWRkKGZyYWdtZW50SW5zdGFuY2VzWzBdKTsKLSAgICB9Ci0gICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbaW5zdGFuY2VEb2N1bWVudHNDb3B5LnNpemUoKV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgaW5zdGFuY2VEb2N1bWVudHNbaV0gPSAoRWxlbWVudClpbnN0YW5jZURvY3VtZW50c0NvcHkuZ2V0KGkpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RWxlbWVudHNUYWdOYW1lKGluc3RhbmNlRG9jdW1lbnRzLCBnZXRJbnN0YW5jZURvY3VtZW50VGFnTmFtZShuYW1lc3BhY2VUYWJsZSkpOwotICB9Ci0KLSAgcHVibGljIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uW10gZ2V0TWVtYmVyVHlwZURlZmluaXRpb25zKCkgewotICAgIGlmIChtZW1iZXJUeXBlc18gPT0gbnVsbCkgewotICAgICAgRUxpc3QgbWVtYmVyVHlwZXMgPSAoKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWdldFhTRFR5cGVEZWZpbml0aW9uKCkpLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpOwotICAgICAgbWVtYmVyVHlwZXNfID0gbmV3IFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uW21lbWJlclR5cGVzLnNpemUoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlclR5cGVzXy5sZW5ndGg7IGkrKykgewotICAgICAgICBtZW1iZXJUeXBlc19baV0gPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pbWVtYmVyVHlwZXMuZ2V0KGkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWVtYmVyVHlwZXNfOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBjcmVhdGVVbmlvbkluc3RhbmNlKGludCBtZW1iZXJUeXBlSW5kZXgpIHsKLSAgICBnZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgICBpZiAobWVtYmVyVHlwZUluZGV4IDwgMCB8fCBtZW1iZXJUeXBlSW5kZXggPiBtZW1iZXJUeXBlc18ubGVuZ3RoIC0gMSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIFN0cmluZyBuZXdJRCA9IGdlbklEKCk7Ci0gICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24gdGhpc0NvbmZpZyA9IGdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gbmV3IFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICAgeHNkQ29uZmlnLnNldFhTRENvbXBvbmVudChtZW1iZXJUeXBlc19bbWVtYmVyVHlwZUluZGV4XSk7Ci0gICAgeHNkQ29uZmlnLnNldFN0eWxlKHRoaXNDb25maWcuZ2V0U3R5bGUoKSk7Ci0gICAgeHNkQ29uZmlnLnNldFBhcnRFbmNvZGluZyh0aGlzQ29uZmlnLmdldFBhcnRFbmNvZGluZygpKTsKLSAgICB4c2RDb25maWcuc2V0V1NETFBhcnROYW1lKHRoaXNDb25maWcuZ2V0V1NETFBhcnROYW1lKCkpOwotICAgIElYU0RGcmFnbWVudCBmcmFnID0gZ2V0WFNEVG9GcmFnbWVudENvbnRyb2xsZXIoKS5nZXRGcmFnbWVudCh4c2RDb25maWcsIG5ld0lELCBnZXROYW1lKCkpOwotICAgIGZyYWcuc2V0SUQobmV3SUQpOwotICAgIGZyYWcuc2V0TmFtZShnZXROYW1lKCkpOwotICAgIGFkZEZyYWdtZW50KG5ld0lELCBmcmFnKTsKLSAgICByZXR1cm4gbmV3SUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUluc3RhbmNlKCkgewotICAgIHJldHVybiBjcmVhdGVVbmlvbkluc3RhbmNlKDApOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlVW5pb25SYW5nZUZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC9pbXBsL1hTRFNpbXBsZVVuaW9uUmFuZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJiYjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L2ltcGwvWFNEU2ltcGxlVW5pb25SYW5nZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5YU0RUb0ZyYWdtZW50Q29udHJvbGxlcjsKLQotcHVibGljIGNsYXNzIFhTRFNpbXBsZVVuaW9uUmFuZ2VGcmFnbWVudCBleHRlbmRzIFhTRFNpbXBsZVVuaW9uRnJhZ21lbnQgewotICBwdWJsaWMgWFNEU2ltcGxlVW5pb25SYW5nZUZyYWdtZW50KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIGNvbmZpZywgWFNEVG9GcmFnbWVudENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgIHN1cGVyKGlkLCBuYW1lLCBjb25maWcsIGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbkZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdEluZm9GcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRSZWFkRnJhZ21lbnQoKSB7Ci0gICAgcmV0dXJuICIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvblJGcmFnbWVudEpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRXcml0ZUZyYWdtZW50KCkgewotICAgIHJldHVybiAiL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVW5pb25SYW5nZVdGcmFnbWVudEpTUC5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC91dGlsL0hUVFBVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC91dGlsL0hUVFBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTllNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvdXRpbC9IVFRQVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5heGlzLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5VUkxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuSVhTREZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LklYU0RTaW1wbGVBdG9taWNGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNEU2ltcGxlTGlzdEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQVXRpbAotewotICBwcml2YXRlIEhUVFBVdGlsKCkKLSAgewotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuVVJMRW5jb2RlZFBhcmFtZXRlcnMoSVhTREZyYWdtZW50IGZyYWdtZW50KQotICB7Ci0gICAgaWYgKGZyYWdtZW50IGluc3RhbmNlb2YgSVhTRFNpbXBsZUxpc3RGcmFnbWVudCkKLSAgICAgIHJldHVybiBnZW5VUkxFbmNvZGVkUGFyYW1zRnJvbUxpc3RGcmFnbWVudCgoSVhTRFNpbXBsZUxpc3RGcmFnbWVudClmcmFnbWVudCk7Ci0gICAgZWxzZSBpZiAoZnJhZ21lbnQgaW5zdGFuY2VvZiBJWFNEU2ltcGxlQXRvbWljRnJhZ21lbnQpCi0gICAgICByZXR1cm4gZ2VuVVJMRW5jb2RlZFBhcmFtc0Zyb21BdG9taWNGcmFnbWVudCgoSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50KWZyYWdtZW50KTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZ2VuVVJMRW5jb2RlZFhNTFBhcmFtZXRlcnMoZnJhZ21lbnQpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdlblVSTEVuY29kZWRQYXJhbXNGcm9tQXRvbWljRnJhZ21lbnQoSVhTRFNpbXBsZUF0b21pY0ZyYWdtZW50IGZyYWdtZW50KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHVybEVuY29kZWRQYXJhbSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmdbXSBwYXJhbXMgPSBmcmFnbWVudC5nZXRQYXJhbWV0ZXJWYWx1ZXMoZnJhZ21lbnQuZ2V0SUQoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZChVUkxVdGlscy5lbmNvZGUoZnJhZ21lbnQuZ2V0TmFtZSgpKSk7Ci0gICAgICB1cmxFbmNvZGVkUGFyYW0uYXBwZW5kKCI9Iik7Ci0gICAgICB1cmxFbmNvZGVkUGFyYW0uYXBwZW5kKFVSTFV0aWxzLmVuY29kZShwYXJhbXNbaV0pKTsKLSAgICAgIGlmIChpIDwgcGFyYW1zLmxlbmd0aCAtIDEpCi0gICAgICAgIHVybEVuY29kZWRQYXJhbS5hcHBlbmQoIiYiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVybEVuY29kZWRQYXJhbS50b1N0cmluZygpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdlblVSTEVuY29kZWRQYXJhbXNGcm9tTGlzdEZyYWdtZW50KElYU0RTaW1wbGVMaXN0RnJhZ21lbnQgZnJhZ21lbnQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgdXJsRW5jb2RlZFBhcmFtID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIElYU0RGcmFnbWVudFtdIGNoaWxkRnJhZ3MgPSBmcmFnbWVudC5nZXRBbGxGcmFnbWVudHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRnJhZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZChVUkxVdGlscy5lbmNvZGUoZnJhZ21lbnQuZ2V0TmFtZSgpKSk7Ci0gICAgICB1cmxFbmNvZGVkUGFyYW0uYXBwZW5kKCI9Iik7Ci0gICAgICBTdHJpbmdbXSBwYXJhbXMgPSBjaGlsZEZyYWdzW2ldLmdldFBhcmFtZXRlclZhbHVlcyhjaGlsZEZyYWdzW2ldLmdldElEKCkpOwotICAgICAgU3RyaW5nQnVmZmVyIHBhcmFtQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXJhbXMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIHBhcmFtQnVmZmVyLmFwcGVuZChwYXJhbXNbal0pOwotICAgICAgICBpZiAoaiA8IHBhcmFtcy5sZW5ndGggLSAxKQotICAgICAgICAgIHBhcmFtQnVmZmVyLmFwcGVuZChGcmFnbWVudENvbnN0YW50cy5MSVNUX1NFUEVSQVRPUik7Ci0gICAgICB9Ci0gICAgICB1cmxFbmNvZGVkUGFyYW0uYXBwZW5kKFVSTFV0aWxzLmVuY29kZShwYXJhbUJ1ZmZlci50b1N0cmluZygpKSk7Ci0gICAgICBpZiAoaSA8IGNoaWxkRnJhZ3MubGVuZ3RoIC0gMSkKLSAgICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZCgiJiIpOwotICAgIH0KLSAgICByZXR1cm4gdXJsRW5jb2RlZFBhcmFtLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2VuVVJMRW5jb2RlZFhNTFBhcmFtZXRlcnMoSVhTREZyYWdtZW50IGZyYWdtZW50KQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHVybEVuY29kZWRQYXJhbSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBIYXNodGFibGUgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KENvbnN0YW50cy5VUklfU09BUDExX0VOViwgQ29uc3RhbnRzLk5TX1BSRUZJWF9TT0FQX0VOVik7Ci0gICAgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KENvbnN0YW50cy5VUklfMjAwMV9TQ0hFTUFfWFNJLCBDb25zdGFudHMuTlNfUFJFRklYX1NDSEVNQV9YU0kpOwotICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTRCwgQ29uc3RhbnRzLk5TX1BSRUZJWF9TQ0hFTUFfWFNEKTsKLSAgICBFbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBuZXcgRWxlbWVudFswXTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbnN0YW5jZURvY3VtZW50cyA9IGZyYWdtZW50Lmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyh0cnVlLCBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSwgWE1MVXRpbHMuY3JlYXRlTmV3RG9jdW1lbnQobnVsbCkpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpCi0gICAgewotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHVybEVuY29kZWRQYXJhbS5hcHBlbmQoVVJMVXRpbHMuZW5jb2RlKGZyYWdtZW50LmdldE5hbWUoKSkpOwotICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZCgiPSIpOwotICAgICAgdXJsRW5jb2RlZFBhcmFtLmFwcGVuZChVUkxVdGlscy5lbmNvZGUoWE1MVXRpbHMuc2VyaWFsaXplKGluc3RhbmNlRG9jdW1lbnRzW2ldLCB0cnVlKSkpOwotICAgICAgaWYgKGkgPCBpbnN0YW5jZURvY3VtZW50cy5sZW5ndGggLSAxKQotICAgICAgICB1cmxFbmNvZGVkUGFyYW0uYXBwZW5kKCImIik7Ci0gICAgfQotICAgIHJldHVybiB1cmxFbmNvZGVkUGFyYW0udG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvdXRpbC9PcHRpb25WZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvT3B0aW9uVmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTY1YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvZnJhZ21lbnQvdXRpbC9PcHRpb25WZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgT3B0aW9uVmVjdG9yCi17Ci0gIHByaXZhdGUgVmVjdG9yIG9wdGlvbnNfOwotICAKLSAgcHVibGljIE9wdGlvblZlY3RvcigpCi0gIHsKLSAgICBvcHRpb25zXyA9IG5ldyBWZWN0b3IoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkT3B0aW9uKFN0cmluZyBkaXNwbGF5VmFsdWUsU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgb3B0aW9uc18uYWRkRWxlbWVudChuZXcgT3B0aW9uKGRpc3BsYXlWYWx1ZSx2YWx1ZSkpOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShpbnQgcG9zaXRpb24pCi0gIHsKLSAgICBPcHRpb24gb3B0aW9uID0gKE9wdGlvbilvcHRpb25zXy5lbGVtZW50QXQocG9zaXRpb24pOwotICAgIHJldHVybiBvcHRpb24uZ2V0RGlzcGxheVZhbHVlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IHBvc2l0aW9uKQotICB7Ci0gICAgT3B0aW9uIG9wdGlvbiA9IChPcHRpb24pb3B0aW9uc18uZWxlbWVudEF0KHBvc2l0aW9uKTsKLSAgICByZXR1cm4gb3B0aW9uLmdldFZhbHVlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBpbnQgc2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gb3B0aW9uc18uc2l6ZSgpOwotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIGNsYXNzIE9wdGlvbgotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheVZhbHVlXzsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZV87Ci0gICAgcHVibGljIE9wdGlvbihTdHJpbmcgZGlzcGxheVZhbHVlLFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBkaXNwbGF5VmFsdWVfID0gZGlzcGxheVZhbHVlOwotICAgICAgdmFsdWVfID0gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZGlzcGxheVZhbHVlXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYWx1ZSgpCi0gICAgewotICAgICAgcmV0dXJuIHZhbHVlXzsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvWFNEVHlwZURlZmluaXRpb25VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9mcmFnbWVudC91dGlsL1hTRFR5cGVEZWZpbml0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDk2MjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL2ZyYWdtZW50L3V0aWwvWFNEVHlwZURlZmluaXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBYU0RUeXBlRGVmaW5pdGlvblV0aWwgewotICBwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uVXRpbCgpIHsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmcgbnMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIHJldHVybiAobnMgIT0gbnVsbCAmJiBucy5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuVVJJX1hTRCkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb290VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkgewotICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiBiYXNlVHlwZSA9IHR5cGUuZ2V0QmFzZVR5cGUoKTsKLSAgICBpZiAoYmFzZVR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIFN0cmluZyB0eXBlTlMgPSB0eXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIFN0cmluZyBiYXNlVHlwZU5TID0gYmFzZVR5cGUuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgU3RyaW5nIHR5cGVOYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIGJhc2VUeXBlTmFtZSA9IGJhc2VUeXBlLmdldE5hbWUoKTsKLSAgICBib29sZWFuIHNhbWVOUzsKLSAgICBib29sZWFuIHNhbWVOYW1lOwotICAgIGlmICh0eXBlTlMgPT0gbnVsbCAmJiBiYXNlVHlwZU5TID09IG51bGwpCi0gICAgICBzYW1lTlMgPSB0cnVlOwotICAgIGVsc2UgaWYgKHR5cGVOUyAhPSBudWxsICYmIGJhc2VUeXBlTlMgIT0gbnVsbCAmJiB0eXBlTlMuZXF1YWxzKGJhc2VUeXBlTlMpKQotICAgICAgc2FtZU5TID0gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICBzYW1lTlMgPSBmYWxzZTsKLSAgICBpZiAodHlwZU5hbWUgPT0gbnVsbCAmJiBiYXNlVHlwZU5hbWUgPT0gbnVsbCkKLSAgICAgIHNhbWVOYW1lID0gdHJ1ZTsKLSAgICBlbHNlIGlmICh0eXBlTmFtZSAhPSBudWxsICYmIGJhc2VUeXBlTmFtZSAhPSBudWxsICYmIHR5cGVOYW1lLmVxdWFscyhiYXNlVHlwZU5hbWUpKQotICAgICAgc2FtZU5hbWUgPSB0cnVlOwotICAgIGVsc2UKLSAgICAgIHNhbWVOYW1lID0gZmFsc2U7Ci0gICAgcmV0dXJuIChzYW1lTlMgJiYgc2FtZU5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgaWYgKHR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIFhTRFR5cGVEZWZpbml0aW9uIGN1cnJUeXBlID0gdHlwZTsKLSAgICB3aGlsZSAoIWlzWFNEQnVpbHRJblR5cGVEZWZpbml0aW9uKGN1cnJUeXBlKSkgewotICAgICAgaWYgKGlzUm9vdFR5cGVEZWZpbml0aW9uKGN1cnJUeXBlKSkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICBjdXJyVHlwZSA9IGN1cnJUeXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgfQotICAgIHJldHVybiBjdXJyVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NvYXBFbmNBcnJheShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKSB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gY3VyclR5cGUgPSB0eXBlOwotICAgIGlmIChjdXJyVHlwZSAhPSBudWxsKQotICAgIHdoaWxlKGN1cnJUeXBlICE9IG51bGwpIHsKLSAgICAgIFN0cmluZyBucyA9IGN1cnJUeXBlLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgU3RyaW5nIG5hbWUgPSBjdXJyVHlwZS5nZXROYW1lKCk7Ci0gICAgICBpZiAoRnJhZ21lbnRDb25zdGFudHMuVVJJX1NPQVAuZXF1YWxzKG5zKSAmJiBGcmFnbWVudENvbnN0YW50cy5RTkFNRV9MT0NBTF9OQU1FX0FSUkFZLmVxdWFscyhuYW1lKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlIGlmIChpc1Jvb3RUeXBlRGVmaW5pdGlvbihjdXJyVHlwZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgY3VyclR5cGUgPSBjdXJyVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcGxleCB0eXBlIGNvbnRlbnQgZ2l2ZW4gYSBjb21wbGV4IHR5cGUuCi0gICAqIElmIGNvbXBsZXhUeXBlIGlzIGEgdXNlciBkZWZpbmVkIHR5cGU6Ci0gICAqICAgVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHVzZXIgZGVmaW5lZCBjb21wbGV4IGNvbnRlbnQgb2YgdGhpcyB0eXBlIG9yIHRoZSBjb250ZW50IG9mIHRoZSBleHRlbmRlZAotICAgKiAgIG9yIGRlcml2ZWQgdHlwZSBpZmYgdGhlIGV4dGVuZGVkIG9yIGRlcml2ZWQgdHlwZSBpcyBub3QgYSBidWlsdC1pbiBYU0QgdHlwZSAoZm9yIGV4YW1wbGUsIHhzZDphbnlUeXBlKS4KLSAgICogSWYgY29tcGxleFR5cGUgaXMgYSBidWlsdC1pbiBYU0QgdHlwZToKLSAgICogICBJdCB3aWxsIHJldHVybiB0aGUgY29tcGxleCBjb250ZW50IG9mIHRoaXMgYnVpbHQtaW4gWFNEIGNvbXBsZXggdHlwZS4gIEl0IHdpbGwgbm90IHJldHVybiB0aGUKLSAgICogICBjb21wbGV4IGNvbnRlbnQgb2YgaXRzIGV4dGVuZGVkIG9yIGRlcml2ZWQgdHlwZS4KLSAgICogQHBhcmFtIGNvbXBsZXhUeXBlIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4IHR5cGUuCi0gICAqIEByZXR1cm4gWFNEQ29tcGxleFR5cGVDb250ZW50IFhTRENvbXBsZXhUeXBlQ29udGVudCB0aGUgcmVzb2x2ZWQgY29tcGxleCB0eXBlIGNvbnRlbnQuCi0gICoqLwotICBwdWJsaWMgc3RhdGljIFhTRENvbXBsZXhUeXBlQ29udGVudCBnZXRYU0RDb21wbGV4VHlwZUNvbnRlbnQoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbXBsZXhUeXBlKQotICB7Ci0gICAgaWYgKCFpc1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihjb21wbGV4VHlwZSkpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IGNvbXBsZXhUeXBlOwotICAgICAgd2hpbGUgKCFpc1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbih0eXBlKSAmJiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikpCi0gICAgICB7Ci0gICAgICAgIFhTRENvbXBsZXhUeXBlQ29udGVudCBjb21wbGV4VHlwZUNvbnRlbnQgPSAoKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKS5nZXRDb250ZW50KCk7Ci0gICAgICAgIGlmIChjb21wbGV4VHlwZUNvbnRlbnQgIT0gbnVsbCkKLSAgICAgICAgICByZXR1cm4gY29tcGxleFR5cGVDb250ZW50OwotICAgICAgICBpZiAoaXNSb290VHlwZURlZmluaXRpb24odHlwZSkpCi0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHR5cGUgPSB0eXBlLmdldEJhc2VUeXBlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGNvbXBsZXhUeXBlLmdldENvbnRlbnQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL0RldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MGNhMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXRhaWxzVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICBwdWJsaWMgU3RyaW5nIGZvcm1MaW5rXzsKLQotICBwdWJsaWMgRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQsIFN0cmluZyBmb3JtTGluaykgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICBmb3JtTGlua18gPSBmb3JtTGluazsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgIHJldHVybiBmb3JtTGlua187Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL0ludm9rZVdTRExPcGVyYXRpb25Ub29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9JbnZva2VXU0RMT3BlcmF0aW9uVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M4ZWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL0ludm9rZVdTRExPcGVyYXRpb25Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLio7Ci0KLXB1YmxpYyBjbGFzcyBJbnZva2VXU0RMT3BlcmF0aW9uVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICBwcml2YXRlIFN0cmluZyBmcmFnbWVudFZpZXdJRF87Ci0gIHByaXZhdGUgU3RyaW5nIGZyYWdtZW50TmFtZUFuY2hvcklEXzsKLSAgcHJpdmF0ZSBTdHJpbmcgZW5kUG9pbnRfOwotCi0gIHB1YmxpYyBJbnZva2VXU0RMT3BlcmF0aW9uVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAid3NkbC9pbWFnZXMvaW52b2tlX3dzZGxfb3BlcmF0aW9uX2VuYWJsZWQuZ2lmIiwgIndzZGwvaW1hZ2VzL2ludm9rZV93c2RsX29wZXJhdGlvbl9oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIGZyYWdtZW50Vmlld0lEXyA9IEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNOwotICAgIGZyYWdtZW50TmFtZUFuY2hvcklEXyA9IG51bGw7Ci0gICAgZW5kUG9pbnRfID0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluaXREZWZhdWx0UHJvcGVydGllcygpIHsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgIFN0cmluZ0J1ZmZlciBmb3JtTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBmb3JtTGluay5hcHBlbmQoIndzZGwvZm9ybXMvSW52b2tlV1NETE9wZXJhdGlvbkZvcm0uanNwIik7Ci0gICAgU3RyaW5nIG5hbWVBbmNob3JJRCA9IGdldEZyYWdtZW50TmFtZUFuY2hvcklEKCk7Ci0gICAgaWYgKG5hbWVBbmNob3JJRCAhPSBudWxsICYmIG5hbWVBbmNob3JJRC5sZW5ndGgoKSA+IDApIHsKLSAgICAgIGZvcm1MaW5rLmFwcGVuZCgiIyIpOwotICAgICAgZm9ybUxpbmsuYXBwZW5kKG5hbWVBbmNob3JJRCk7Ci0gICAgICBzZXRGcmFnbWVudE5hbWVBbmNob3JJRChudWxsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZvcm1BY3Rpb25MaW5rKGludCBvcGVyYXRpb25UeXBlLFN0cmluZyBmcmFnbWVudFZpZXdJRCkKLSAgewotICAgIHN3aXRjaCAob3BlcmF0aW9uVHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExPcGVyYXRpb25FbGVtZW50Lk9QRVJBVElPTl9UWVBFX1NPQVA6Ci0gICAgICAgIGlmIChmcmFnbWVudFZpZXdJRC5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfRk9STV9UT19TT1VSQ0UpKQotICAgICAgICAgIHJldHVybiAid3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uSlNQLmpzcCI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gIndzZGwvYWN0aW9ucy9JbnZva2VXU0RMU09BUE9wZXJhdGlvbkZvcm1BY3Rpb25KU1AuanNwIjsKLSAgICAgIGNhc2UgV1NETE9wZXJhdGlvbkVsZW1lbnQuT1BFUkFUSU9OX1RZUEVfSFRUUF9HRVQ6Ci0gICAgICAgIHJldHVybiAid3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AiOwotICAgICAgY2FzZSBXU0RMT3BlcmF0aW9uRWxlbWVudC5PUEVSQVRJT05fVFlQRV9IVFRQX1BPU1Q6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gIndzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cFBvc3RPcGVyYXRpb25Gb3JtQWN0aW9uSlNQLmpzcCI7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGcmFnbWVudFZpZXdJRCgpIHsKLSAgICByZXR1cm4gZnJhZ21lbnRWaWV3SURfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RnJhZ21lbnRWaWV3SUQoU3RyaW5nIGZyYWdtZW50Vmlld0lEKSB7Ci0gICAgZnJhZ21lbnRWaWV3SURfID0gZnJhZ21lbnRWaWV3SUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEZyYWdtZW50TmFtZUFuY2hvcklEKCkgewotICAgIHJldHVybiBmcmFnbWVudE5hbWVBbmNob3JJRF87Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGcmFnbWVudE5hbWVBbmNob3JJRChTdHJpbmcgZnJhZ21lbnROYW1lQW5jaG9ySUQpIHsKLSAgICBmcmFnbWVudE5hbWVBbmNob3JJRF8gPSBmcmFnbWVudE5hbWVBbmNob3JJRDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kUG9pbnQoKQotICB7Ci0gICAgcmV0dXJuIGVuZFBvaW50XzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEVuZFBvaW50KFN0cmluZyBlbmRQb2ludCkKLSAgewotICAgIGVuZFBvaW50XyA9IGVuZFBvaW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9PcGVuV1NETFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL09wZW5XU0RMVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzUyMTA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL09wZW5XU0RMVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLlNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIE9wZW5XU0RMVG9vbCBleHRlbmRzIEZvcm1Ub29sIHsKLQotICAgIHB1YmxpYyBPcGVuV1NETFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJ3c2RsL2ltYWdlcy9vcGVuX3dzZGxfZW5hYmxlZC5naWYiLCAid3NkbC9pbWFnZXMvb3Blbl93c2RsX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzZGwvZm9ybXMvT3BlbldTRExGb3JtLmpzcCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9TT0FQTWVzc2FnZVF1ZXVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9TT0FQTWVzc2FnZVF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MGJhYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvU09BUE1lc3NhZ2VRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFNPQVBNZXNzYWdlUXVldWUgZXh0ZW5kcyBNZXNzYWdlUXVldWUKLXsKLSAgcHJpdmF0ZSBWZWN0b3IgY2FjaGVkTWVzc2FnZUxpc3RfOwotCi0gIHB1YmxpYyBTT0FQTWVzc2FnZVF1ZXVlKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgY2FjaGVkTWVzc2FnZUxpc3RfID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXIoKQotICB7Ci0gICAgY2FjaGVkTWVzc2FnZUxpc3RfLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgbWVzc2FnZUxpc3RfLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VzRnJvbUxpc3QoKQotICB7Ci0gICAgaWYgKG1lc3NhZ2VMaXN0Xy5zaXplKCkgPT0gMCkKLSAgICAgIGNvcHlNZXNzYWdlcyhjYWNoZWRNZXNzYWdlTGlzdF8sbWVzc2FnZUxpc3RfKTsKLSAgICBlbHNlCi0gICAgICBjb3B5TWVzc2FnZXMobWVzc2FnZUxpc3RfLGNhY2hlZE1lc3NhZ2VMaXN0Xyk7Ci0gICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2VzRnJvbUxpc3QoKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgdm9pZCBjb3B5TWVzc2FnZXMoVmVjdG9yIHNvdXJjZUxpc3QsVmVjdG9yIGRlc3RMaXN0KQotICB7Ci0gICAgZm9yIChpbnQgaT0wO2k8c291cmNlTGlzdC5zaXplKCk7aSsrKQotICAgICAgZGVzdExpc3QuYWRkRWxlbWVudChzb3VyY2VMaXN0LmVsZW1lbnRBdChpKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExBZGRUb0Zhdm9yaXRlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExBZGRUb0Zhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxZDY3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMQWRkVG9GYXZvcml0ZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5XU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQWRkVG9GYXZvcml0ZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gIHB1YmxpYyBXU0RMQWRkVG9GYXZvcml0ZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZmF2b3JpdGVzX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9mYXZvcml0ZXNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBXU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMQmluZGluZ0RldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMQmluZGluZ0RldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTBkODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEJpbmRpbmdEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV1NETEJpbmRpbmdEZXRhaWxzVG9vbCBleHRlbmRzIERldGFpbHNUb29sIHsKLQotICBwdWJsaWMgV1NETEJpbmRpbmdEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQsICJ3c2RsL2Zvcm1zL1dTRExCaW5kaW5nRGV0YWlsc0Zvcm0uanNwIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExCaW5kaW5nTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEJpbmRpbmdOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzE1MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETEJpbmRpbmdOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qOwotCi0vLyBXU0RMIGJpbmRpbmcgbm9kZSBmb3IgdGhlIFdTREwgTmF2aWdhdG9yIFRyZWUgVmlldwotcHVibGljIGNsYXNzIFdTRExCaW5kaW5nTm9kZSBleHRlbmRzIFdTRExOYXZpZ2F0b3JOb2RlCi17Ci0gIHB1YmxpYyBXU0RMQmluZGluZ05vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsIndzZGwvaW1hZ2VzL3dzZGxfYmluZGluZ19ub2RlLmdpZiIpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfT1BFUkFUSU9OKSkgewotICAgICAgICAgIFdTRExPcGVyYXRpb25Ob2RlIHdzZGxPcGVyYXRpb25Ob2RlID0gbmV3IFdTRExPcGVyYXRpb25Ob2RlKChUcmVlRWxlbWVudClldmVudC5nZXRQYXJlbnRFbGVtZW50KCksIG5vZGVNYW5hZ2VyXywgbm9kZURlcHRoXyArIDEpOwotICAgICAgICAgIGFkZENoaWxkKHdzZGxPcGVyYXRpb25Ob2RlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkKFJlbFJlbW92ZUV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICBUcmVlRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICBpZiAoZXZlbnQuZ2V0SW5Cb3VuZFJlbE5hbWUoKS5lcXVhbHMoV1NETE1vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX09QRVJBVElPTikpIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9PUEVSQVRJT04pKSB7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZUNoaWxkTm9kZShjaGlsZEVsZW1lbnQpOwotICAgICAgfQotICAgIH0pOwotICAgIHNldFZpc2liaWxpdHlPZkNoaWxkcmVuKGZhbHNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRUb29scygpCi0gIHsKLSAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIG5ldyBXU0RMQmluZGluZ0RldGFpbHNUb29sKHRvb2xNYW5hZ2VyXywgd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0JJTkRJTkdfREVUQUlMUyIpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzllYWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV1NETERldGFpbHNUb29sIGV4dGVuZHMgRGV0YWlsc1Rvb2wgewotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1fVklFV19JRCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVVJDRV9WSUVXX0lEID0gMTsKLQotICBwcml2YXRlIGludCB2aWV3SWRfOwotCi0gIHB1YmxpYyBXU0RMRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwgYWx0LCAid3NkbC9mb3Jtcy9XU0RMRGV0YWlsc0Zvcm0uanNwIik7Ci0gICAgdmlld0lkXyA9IEZPUk1fVklFV19JRDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Vmlld0lkKCkgewotICAgIHJldHVybiB2aWV3SWRfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Vmlld0lkKGludCB2aWV3SWQpIHsKLSAgICBpZiAodmlld0lkID09IEZPUk1fVklFV19JRCB8fCB2aWV3SWQgPT0gU09VUkNFX1ZJRVdfSUQpCi0gICAgICB2aWV3SWRfID0gdmlld0lkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdG9nZ2xlVmlld0lkKCkgewotICAgIGlmICh2aWV3SWRfID09IEZPUk1fVklFV19JRCkKLSAgICAgIHZpZXdJZF8gPSBTT1VSQ0VfVklFV19JRDsKLSAgICBlbHNlCi0gICAgICB2aWV3SWRfID0gRk9STV9WSUVXX0lEOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE5MWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkltcG9ydFRvRmlsZVN5c3RlbVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wgZXh0ZW5kcyBJbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sIHsKLSAgcHVibGljIFdTRExJbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlcixTdHJpbmcgYWx0KSB7Ci0gICAgc3VwZXIodG9vbE1hbmFnZXIsYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZS5nZXROb2RlSWQoKSx0b29sSWRfLG5vZGUuZ2V0Vmlld0lkKCksbm9kZS5nZXRWaWV3VG9vbElkKCksZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgTm9kZSBub2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNjYzk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuSW1wb3J0VG9Xb3JrYmVuY2hUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLlNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFdTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sIGV4dGVuZHMgSW1wb3J0VG9Xb3JrYmVuY2hUb29sIHsKLSAgcHVibGljIFdTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgcmV0dXJuICJ3c2RsL2Zvcm1zL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hGb3JtLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Zjk3ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sIGV4dGVuZHMgTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wgewotICBwdWJsaWMgV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLFN0cmluZyBhbHQpIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICBOb2RlIG5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlLmdldE5vZGVJZCgpLHRvb2xJZF8sbm9kZS5nZXRWaWV3SWQoKSxub2RlLmdldFZpZXdUb29sSWQoKSxmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgcmV0dXJuICJ3c2RsL2Zvcm1zL1dTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMTWFpbk5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExNYWluTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFmN2U3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExNYWluTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKjsKLQotLy8gUm9vdCBub2RlIGZvciB0aGUgV1NETCBOYXZpZ2F0b3IgVHJlZSBWaWV3Ci1wdWJsaWMgY2xhc3MgV1NETE1haW5Ob2RlIGV4dGVuZHMgV1NETE5hdmlnYXRvck5vZGUKLXsKLSAgcHVibGljIFdTRExNYWluTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlciwxLCJpbWFnZXMvcm9vdF9tYWluLmdpZiIpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTREwpKSB7Ci0gICAgICAgICAgV1NETE5vZGUgd3NkbE5vZGUgPSBuZXcgV1NETE5vZGUoKFRyZWVFbGVtZW50KWV2ZW50LmdldFBhcmVudEVsZW1lbnQoKSwgbm9kZU1hbmFnZXJfLCBub2RlRGVwdGhfICsgMSk7Ci0gICAgICAgICAgYWRkQ2hpbGQod3NkbE5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTREwpKSB7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTREwpKSB7Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldE91dEJvdW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIHJlbW92ZUNoaWxkTm9kZShjaGlsZEVsZW1lbnQpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgaW5pdFRvb2xzKCkKLSAgewotICAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IG5vZGVNYW5hZ2VyXy5nZXRDb250cm9sbGVyKCk7Ci0gICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgbmV3IE9wZW5XU0RMVG9vbCh0b29sTWFuYWdlcl8sIHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfT1BFTl9XU0RMIikpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExOYXZpZ2F0b3JOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMTmF2aWdhdG9yTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWRiODliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExOYXZpZ2F0b3JOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETE5hdmlnYXRvck5vZGUgZXh0ZW5kcyBOb2RlCi17Ci0gIHB1YmxpYyBXU0RMTmF2aWdhdG9yTm9kZShUcmVlRWxlbWVudCBlbGVtZW50LE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLGludCBub2RlRGVwdGgsU3RyaW5nIGltYWdlUGF0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoLGltYWdlUGF0aCk7Ci0gIH0KLQotICAvLyB3c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24uanNwP25vZGVJZD0uLi4KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRUb2dnbGVOb2RlQWN0aW9uSHJlZigpCi0gIHsKLSAgICByZXR1cm4gVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWRfLGlzT3Blbl8pOwotICB9Ci0KLSAgLy8gd3NkbC9hY3Rpb25zL1NlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmpzcD9ub2RlSWQ9Li4uCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TGlua0FjdGlvbkhyZWYoKQotICB7Ci0gICAgcmV0dXJuIFNlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXyxmYWxzZSk7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmZmI3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKjsKLQotLy8gV1NETCBub2RlIGZvciB0aGUgV1NETCBOYXZpZ2F0b3IgVHJlZSBWaWV3Ci1wdWJsaWMgY2xhc3MgV1NETE5vZGUgZXh0ZW5kcyBXU0RMTmF2aWdhdG9yTm9kZQotewotICBwdWJsaWMgV1NETE5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsImltYWdlcy93c2RsLmdpZiIpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRSkpIHsKLSAgICAgICAgICBXU0RMU2VydmljZU5vZGUgd3NkbFNlcnZpY2VOb2RlID0gbmV3IFdTRExTZXJ2aWNlTm9kZSgoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpLCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgICBhZGRDaGlsZCh3c2RsU2VydmljZU5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRSkpIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9TRVJWSUNFKSkgewotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBzZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbihmYWxzZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBuZXcgV1NETERldGFpbHNUb29sKHRvb2xNYW5hZ2VyXywgd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0RFVEFJTFMiKSk7Ci0gICAgbmV3IFdTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sKHRvb2xNYW5hZ2VyXywgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIikpOwotICAgIG5ldyBXU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wodG9vbE1hbmFnZXJfLCBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0lNUE9SVF9UT19GUyIpKTsKLSAgICBuZXcgV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sKHRvb2xNYW5hZ2VyXywgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTEFVTkNIX1dFQl9TRVJWSUNFX1dJWkFSRCIpKTsKLSAgICBuZXcgV1NETEFkZFRvRmF2b3JpdGVzVG9vbCh0b29sTWFuYWdlcl8sIHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQUREX1dTRExfVE9fRkFWT1JJVEVTIikpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMT3BlcmF0aW9uTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETE9wZXJhdGlvbk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExYzk2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMT3BlcmF0aW9uTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLQotLy8gV1NETCBvcGVyYXRpb24gbm9kZSBmb3IgdGhlIFdTREwgTmF2aWdhdG9yIFRyZWUgVmlldwotcHVibGljIGNsYXNzIFdTRExPcGVyYXRpb25Ob2RlIGV4dGVuZHMgV1NETE5hdmlnYXRvck5vZGUKLXsKLSAgcHVibGljIFdTRExPcGVyYXRpb25Ob2RlKFRyZWVFbGVtZW50IGVsZW1lbnQsTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsaW50IG5vZGVEZXB0aCkKLSAgewotICAgIHN1cGVyKGVsZW1lbnQsbm9kZU1hbmFnZXIsbm9kZURlcHRoLCJ3c2RsL2ltYWdlcy93c2RsX29wZXJhdGlvbl9ub2RlLmdpZiIpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRUb29scygpCi0gIHsKLSAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpOwotICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgIG5ldyBJbnZva2VXU0RMT3BlcmF0aW9uVG9vbCh0b29sTWFuYWdlcl8sIHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfSU5WT0tFX1dTRExfT1BFUkFUSU9OIikpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExQZXJzcGVjdGl2ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFBlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNzgyZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFBlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVVJMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5PcGVuV1NETEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLlN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5VcGRhdGVXU0RMQmluZGluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuQmluZGluZ1R5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMQmluZGluZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgV1NETFBlcnNwZWN0aXZlIGV4dGVuZHMgUGVyc3BlY3RpdmUKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPTlRFTlRfREVGQVVMVCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DT05URU5UX1JFU1VMVF9GT1JNID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPTlRFTlRfUkVTVUxUX1NPVVJDRSA9IDI7Ci0KLSAgcHJpdmF0ZSBCYXNpY01vZGVsIG1vZGVsXzsKLSAgcHJpdmF0ZSBOb2RlTWFuYWdlciBub2RlTWFuYWdlcl87Ci0gIHByaXZhdGUgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gIHByaXZhdGUgU3RyaW5nIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0gIHByaXZhdGUgU3RyaW5nIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0gIHByaXZhdGUgaW50IHN0YXR1c0NvbnRlbnRUeXBlXzsKLQotICBwcml2YXRlIFNPQVBNZXNzYWdlUXVldWUgc29hcFJlcXVlc3RRdWV1ZV87Ci0gIHByaXZhdGUgU09BUE1lc3NhZ2VRdWV1ZSBzb2FwUmVzcG9uc2VRdWV1ZV87Ci0gIHByaXZhdGUgTm9kZSBvcGVyYXRpb25Ob2RlXzsKLQotICBzdGF0aWMKLSAgewotICAgIC8vIEluaXRpYWxpemUgdGhlIFhTRCBzdWJzeXN0ZW0uCi0gICAgKG5ldyBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeUltcGwoKSkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgLy8gSW5pdC5pbml0KCk7Ci0gICAgRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0gICAgWFNEUGFja2FnZUltcGwuaW5pdCgpOwotICB9Ci0KLSAgcHVibGljIFdTRExQZXJzcGVjdGl2ZShDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcigid3NkbCIsY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBpbml0UGVyc3BlY3RpdmUoU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gIHsKLSAgICBtb2RlbF8gPSBuZXcgQmFzaWNNb2RlbCgid3NkbE1vZGVsIik7Ci0gICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSBuZXcgVHJlZUVsZW1lbnQoZ2V0TWVzc2FnZSgiTk9ERV9OQU1FX1dTRExfTUFJTiIpLCBtb2RlbF8pOwotICAgIG1vZGVsXy5zZXRSb290RWxlbWVudCh0cmVlRWxlbWVudCk7Ci0gICAgbm9kZU1hbmFnZXJfID0gbmV3IE5vZGVNYW5hZ2VyKGNvbnRyb2xsZXJfKTsKLSAgICBXU0RMTWFpbk5vZGUgd3NkbE1haW5Ob2RlID0gbmV3IFdTRExNYWluTm9kZSh0cmVlRWxlbWVudCwgbm9kZU1hbmFnZXJfKTsKLSAgICBub2RlTWFuYWdlcl8uc2V0Um9vdE5vZGUod3NkbE1haW5Ob2RlKTsKLQotICAgIC8vIFN0YXJ0aW5nIGZyYW1lc2V0IHNpemVzLgotICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSAiMzAlLCoiOwotICAgIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9IHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gICAgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSAiNzUlLCoiOwotICAgIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLQotICAgIC8vIE1lc3NhZ2Ugc3RhdHVzIHBhbmUKLSAgICBzdGF0dXNDb250ZW50VHlwZV8gPSBTVEFUVVNfQ09OVEVOVF9ERUZBVUxUOwotICAgIHNvYXBSZXF1ZXN0UXVldWVfID0gbmV3IFNPQVBNZXNzYWdlUXVldWUoKTsKLSAgICBzb2FwUmVzcG9uc2VRdWV1ZV8gPSBuZXcgU09BUE1lc3NhZ2VRdWV1ZSgpOwotICAgIG9wZXJhdGlvbk5vZGVfID0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHByZWxvYWRXU0RMKFN0cmluZ1tdIHdzZGxVUkxzKSB7Ci0gICAgaWYgKHdzZGxVUkxzICE9IG51bGwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbFVSTHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgT3BlbldTRExBY3Rpb24gb3BlbldTRExBY3Rpb24gPSBuZXcgT3BlbldTRExBY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IG9wZW5XU0RMQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICAgICAgU3RyaW5nIGRlY29kZWRXU0RMVVJMID0gVVJMVXRpbHMuZGVjb2RlKHdzZGxVUkxzW2ldKTsKLSAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMLCBkZWNvZGVkV1NETFVSTCk7Ci0gICAgICAgIG9wZW5XU0RMQWN0aW9uLnJ1bigpOwotICAgICAgfQotICAgICAgaWYgKHdzZGxVUkxzLmxlbmd0aCA+IDApCi0gICAgICAgIGNvbnRyb2xsZXJfLnNldEN1cnJlbnRQZXJzcGVjdGl2ZShBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBwcmVsb2FkRW5kcG9pbnRzKFN0cmluZ1tdIHdzZGxVUkxzLCBTdHJpbmdbXSBlbmRwb2ludHMpCi0gIHsKLSAgICBpZiAod3NkbFVSTHMgIT0gbnVsbCAmJiB3c2RsVVJMcy5sZW5ndGggPiAwICYmIGVuZHBvaW50cyAhPSBudWxsICYmIGVuZHBvaW50cy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIFN0cmluZyB3c2RsVVJMID0gd3NkbFVSTHNbMF07Ci0gICAgICBWZWN0b3Igd3NkbE5vZGVzID0gbm9kZU1hbmFnZXJfLmdldFJvb3ROb2RlKCkuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChJdGVyYXRvciB3c2RsTm9kZXNJdGVyYXRvciA9IHdzZGxOb2Rlcy5pdGVyYXRvcigpOyB3c2RsTm9kZXNJdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBOb2RlIHdzZGxOb2RlID0gKE5vZGUpd3NkbE5vZGVzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAod3NkbE5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMod3NkbFVSTCkpCi0gICAgICAgIHsKLSAgICAgICAgICBWZWN0b3Igc2VydmljZU5vZGVzID0gd3NkbE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3Igc2VydmljZU5vZGVzSXRlcmF0b3IgPSBzZXJ2aWNlTm9kZXMuaXRlcmF0b3IoKTsgc2VydmljZU5vZGVzSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBOb2RlIHNlcnZpY2VOb2RlID0gKE5vZGUpc2VydmljZU5vZGVzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgVmVjdG9yIGJpbmRpbmdOb2RlcyA9IHNlcnZpY2VOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIG5vZGVJZHMgPSBuZXcgU3RyaW5nW2JpbmRpbmdOb2Rlcy5zaXplKCldOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlSWRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICBub2RlSWRzW2ldID0gU3RyaW5nLnZhbHVlT2YoKChOb2RlKWJpbmRpbmdOb2Rlcy5nZXQoaSkpLmdldE5vZGVJZCgpKTsKLSAgICAgICAgICAgIFVwZGF0ZVdTRExCaW5kaW5nQWN0aW9uIGFjdGlvbiA9IG5ldyBVcGRhdGVXU0RMQmluZGluZ0FjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgICAgICAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgIHByb3BlcnR5VGFibGUucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIG5vZGVJZHMpOwotICAgICAgICAgICAgcHJvcGVydHlUYWJsZS5wdXQoV1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQsIGVuZHBvaW50cyk7Ci0gICAgICAgICAgICBhY3Rpb24uc2V0UHJvcGVydHlUYWJsZShwcm9wZXJ0eVRhYmxlKTsKLSAgICAgICAgICAgIGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgdm9pZCBwcmVzZWxlY3RTZXJ2aWNlT3JCaW5kaW5nKFN0cmluZ1tdIHdzZGxVUkxzLFN0cmluZ1tdIHNlcnZpY2VRTmFtZVN0cmluZ3MsU3RyaW5nW10gYmluZGluZ05hbWVTdHJpbmdzKQotICB7Ci0gICAgaWYgKHdzZGxVUkxzICE9IG51bGwgJiYgd3NkbFVSTHMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmcgd3NkbFVSTCA9IHdzZGxVUkxzWzBdOwotICAgICAgVmVjdG9yIHdzZGxOb2RlcyA9IG5vZGVNYW5hZ2VyXy5nZXRSb290Tm9kZSgpLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGlmIChzZXJ2aWNlUU5hbWVTdHJpbmdzICE9IG51bGwgJiYgc2VydmljZVFOYW1lU3RyaW5ncy5sZW5ndGggPiAwKQotICAgICAgICBwcmVzZWxlY3RTZXJ2aWNlKHdzZGxVUkwsc2VydmljZVFOYW1lU3RyaW5nc1swXSk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChiaW5kaW5nTmFtZVN0cmluZ3MgIT0gbnVsbCAmJiBiaW5kaW5nTmFtZVN0cmluZ3MubGVuZ3RoID4gMCkKLSAgICAgICAgICBwcmVzZWxlY3RCaW5kaW5nKHdzZGxVUkwsYmluZGluZ05hbWVTdHJpbmdzWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgdm9pZCBwcmVzZWxlY3RTZXJ2aWNlKFN0cmluZyB3c2RsVVJMLFN0cmluZyBzZXJ2aWNlUU5hbWVTdHJpbmcpCi0gIHsKLSAgICBWZWN0b3Igd3NkbE5vZGVzID0gbm9kZU1hbmFnZXJfLmdldFJvb3ROb2RlKCkuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGk9MDtpPHdzZGxOb2Rlcy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIE5vZGUgd3NkbE5vZGUgPSAoTm9kZSl3c2RsTm9kZXMuZWxlbWVudEF0KGkpOwotICAgICAgaWYgKHdzZGxOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKHdzZGxVUkwpKQotICAgICAgewotICAgICAgICBWZWN0b3Igc2VydmljZU5vZGVzID0gd3NkbE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBqPTA7ajxzZXJ2aWNlTm9kZXMuc2l6ZSgpO2orKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KGopOwotICAgICAgICAgIFdTRExTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChXU0RMU2VydmljZUVsZW1lbnQpc2VydmljZU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlKCk7Ci0gICAgICAgICAgaWYgKHNlcnZpY2UuZ2V0UU5hbWUoKS50b1N0cmluZygpLmVxdWFscyhzZXJ2aWNlUU5hbWVTdHJpbmcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGVNYW5hZ2VyXy5zZXRTZWxlY3RlZE5vZGVJZChzZXJ2aWNlTm9kZS5nZXROb2RlSWQoKSk7Ci0gICAgICAgICAgICBub2RlTWFuYWdlcl8ubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLSAgICAgICAgICAgIGNvbnRyb2xsZXJfLnNldEN1cnJlbnRQZXJzcGVjdGl2ZShBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGZpbmFsIHZvaWQgcHJlc2VsZWN0QmluZGluZyhTdHJpbmcgd3NkbFVSTCxTdHJpbmcgYmluZGluZ05hbWVTdHJpbmcpCi0gIHsKLSAgICBWZWN0b3Igd3NkbE5vZGVzID0gbm9kZU1hbmFnZXJfLmdldFJvb3ROb2RlKCkuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGk9MDtpPHdzZGxOb2Rlcy5zaXplKCk7aSsrKQotICAgIHsKLSAgICAgIE5vZGUgd3NkbE5vZGUgPSAoTm9kZSl3c2RsTm9kZXMuZWxlbWVudEF0KGkpOwotICAgICAgaWYgKHdzZGxOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzKHdzZGxVUkwpKQotICAgICAgewotICAgICAgICBWZWN0b3Igc2VydmljZU5vZGVzID0gd3NkbE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBqPTA7ajxzZXJ2aWNlTm9kZXMuc2l6ZSgpO2orKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KGopOwotICAgICAgICAgIFZlY3RvciBiaW5kaW5nTm9kZXMgPSBzZXJ2aWNlTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgZm9yIChpbnQgaz0wO2s8YmluZGluZ05vZGVzLnNpemUoKTtrKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgTm9kZSBiaW5kaW5nTm9kZSA9IChOb2RlKWJpbmRpbmdOb2Rlcy5lbGVtZW50QXQoayk7Ci0gICAgICAgICAgICBXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSAoV1NETEJpbmRpbmdFbGVtZW50KWJpbmRpbmdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoYmluZGluZ0VsZW1lbnQuZ2V0QmluZGluZygpLmdldFFOYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoYmluZGluZ05hbWVTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBub2RlTWFuYWdlcl8uc2V0U2VsZWN0ZWROb2RlSWQoYmluZGluZ05vZGUuZ2V0Tm9kZUlkKCkpOwotICAgICAgICAgICAgICBub2RlTWFuYWdlcl8ubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLSAgICAgICAgICAgICAgY29udHJvbGxlcl8uc2V0Q3VycmVudFBlcnNwZWN0aXZlKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0RMKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgICAKLSAgICAgIH0KLSAgICB9ICAgIAotICB9Ci0KLSAgcHVibGljIE5vZGVNYW5hZ2VyIGdldE5vZGVNYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBub2RlTWFuYWdlcl87Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFBlcnNwZWN0aXZlQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuICJ3c2RsL3dzZGxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgewotICAgIHJldHVybiBBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFuZXNGaWxlKCkKLSAgewotICAgIHJldHVybiAid3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGcmFtZXNldHNGaWxlKCkKLSAgewotICAgIHJldHVybiAid3NkbC9zY3JpcHRzL3dzZGxmcmFtZXNldHMuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvY2Vzc0ZyYW1lc2V0c0Zvcm0oKQotICB7Ci0gICAgcmV0dXJuICJ3c2RsL2Zvcm1zL1Byb2Nlc3NXU0RMRnJhbWVzZXRzRm9ybS5qc3AiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gIndzZGxOYXZpZ2F0b3JDb250ZW50IjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAid3NkbC93c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuICJ3c2RsUHJvcGVydGllc0NvbnRhaW5lciI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkKLSAgewotICAgIHJldHVybiAid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJ3c2RsU3RhdHVzQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgewotICAgIHJldHVybiAid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhTdHJpbmcgY29scykKLSAgewotICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoU3RyaW5nIGNvbHMpCi0gIHsKLSAgICBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpCi0gIHsKLSAgICByZXR1cm4gc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkKLSAgewotICAgIHJldHVybiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoU3RyaW5nIHJvd3MpCi0gIHsKLSAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IHJvd3M7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoU3RyaW5nIHJvd3MpCi0gIHsKLSAgICBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gcm93czsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkKLSAgewotICAgIHJldHVybiBzYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTd2l0Y2hQZXJzcGVjdGl2ZUZvcm1BY3Rpb25MaW5rKGludCB0YXJnZXRQZXJzcGVjdGl2ZUlkLGJvb2xlYW4gZm9ySGlzdG9yeSkKLSAgewotICAgIHJldHVybiBTd2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0RMQWN0aW9uLmdldEZvcm1BY3Rpb25MaW5rKHRhcmdldFBlcnNwZWN0aXZlSWQsZm9ySGlzdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgaW50IGdldFN0YXR1c0NvbnRlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBzdGF0dXNDb250ZW50VHlwZV87Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTdGF0dXNDb250ZW50VHlwZShpbnQgc3RhdHVzQ29udGVudFR5cGUpCi0gIHsKLSAgICBzdGF0dXNDb250ZW50VHlwZV8gPSBzdGF0dXNDb250ZW50VHlwZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTT0FQTWVzc2FnZVF1ZXVlIGdldFNPQVBSZXF1ZXN0UXVldWUoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBSZXF1ZXN0UXVldWVfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFNPQVBNZXNzYWdlUXVldWUgZ2V0U09BUFJlc3BvbnNlUXVldWUoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBSZXNwb25zZVF1ZXVlXzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBOb2RlIGdldE9wZXJhdGlvbk5vZGUoKQotICB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbk5vZGVfOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIHZvaWQgc2V0T3BlcmF0aW9uTm9kZShOb2RlIG9wZXJhdGlvbk5vZGUpCi0gIHsKLSAgICBvcGVyYXRpb25Ob2RlXyA9IG9wZXJhdGlvbk5vZGU7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNPQVBFbnZlbG9wZVhNTExpbmsoaW50IHNvYXBFbnZlbG9wZVR5cGUpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgbGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzZGwvc29hcF9lbnZlbG9wZV94bWwuanNwPyIpOwotICAgIGxpbmsuYXBwZW5kKFdTRExBY3Rpb25JbnB1dHMuU09BUF9FTlZFTE9QRV9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQoc29hcEVudmVsb3BlVHlwZSk7Ci0gICAgcmV0dXJuIGxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QmluZGluZ1R5cGVTdHJpbmcoaW50IGJpbmRpbmdUeXBlKQotICB7Ci0gICAgc3dpdGNoIChiaW5kaW5nVHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIEJpbmRpbmdUeXBlcy5TT0FQOgotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfU09BUCIpOwotICAgICAgY2FzZSBCaW5kaW5nVHlwZXMuSFRUUF9HRVQ6Ci0gICAgICAgIHJldHVybiBnZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX0dFVCIpOwotICAgICAgY2FzZSBCaW5kaW5nVHlwZXMuSFRUUF9QT1NUOgotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9QT1NUIik7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfVU5TVVBQT1JURUQiKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMU2VydmljZURldGFpbHNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC9wZXJzcGVjdGl2ZS9XU0RMU2VydmljZURldGFpbHNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1N2ZlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFNlcnZpY2VEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV1NETFNlcnZpY2VEZXRhaWxzVG9vbCBleHRlbmRzIERldGFpbHNUb29sIHsKLQotICBwdWJsaWMgV1NETFNlcnZpY2VEZXRhaWxzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQsICJ3c2RsL2Zvcm1zL1dTRExTZXJ2aWNlRGV0YWlsc0Zvcm0uanNwIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3BlcnNwZWN0aXZlL1dTRExTZXJ2aWNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFNlcnZpY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MzczNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvcGVyc3BlY3RpdmUvV1NETFNlcnZpY2VOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qOwotCi0vLyBXU0RMIHNlcnZpY2Ugbm9kZSBmb3IgdGhlIFdTREwgTmF2aWdhdG9yIFRyZWUgVmlldwotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlTm9kZSBleHRlbmRzIFdTRExOYXZpZ2F0b3JOb2RlCi17Ci0gIHB1YmxpYyBXU0RMU2VydmljZU5vZGUoVHJlZUVsZW1lbnQgZWxlbWVudCxOb2RlTWFuYWdlciBub2RlTWFuYWdlcixpbnQgbm9kZURlcHRoKQotICB7Ci0gICAgc3VwZXIoZWxlbWVudCxub2RlTWFuYWdlcixub2RlRGVwdGgsIndzZGwvaW1hZ2VzL3dzZGxfc2VydmljZV9ub2RlLmdpZiIpOwotICAgIGVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCByZWxBZGRlZChSZWxBZGRFdmVudCBldmVudCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbCA9IGV2ZW50LmdldE91dEJvdW5kUmVsTmFtZSgpOwotICAgICAgICBpZiAocmVsLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfQklORElORykpIHsKLSAgICAgICAgICBXU0RMQmluZGluZ05vZGUgd3NkbEJpbmRpbmdOb2RlID0gbmV3IFdTRExCaW5kaW5nTm9kZSgoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpLCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgICBhZGRDaGlsZCh3c2RsQmluZGluZ05vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHJlbFJlbW92ZWQoUmVsUmVtb3ZlRXZlbnQgZXZlbnQpCi0gICAgICB7Ci0gICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChldmVudC5nZXRJbkJvdW5kUmVsTmFtZSgpLmVxdWFscyhXU0RMTW9kZWxDb25zdGFudHMuUkVMX1dTRExfQklORElORykpIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0SW5ib3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCkuZXF1YWxzKFdTRExNb2RlbENvbnN0YW50cy5SRUxfV1NETF9CSU5ESU5HKSkgewotICAgICAgICAgIGNoaWxkRWxlbWVudCA9IChUcmVlRWxlbWVudClldmVudC5nZXRPdXRCb3VuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdmVDaGlsZE5vZGUoY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBzZXRWaXNpYmlsaXR5T2ZDaGlsZHJlbihmYWxzZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBpbml0VG9vbHMoKQotICB7Ci0gICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgICBuZXcgV1NETFNlcnZpY2VEZXRhaWxzVG9vbCh0b29sTWFuYWdlcl8sIHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NETF9TRVJWSUNFX0RFVEFJTFMiKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNmb3JtZXIvRnJhZ21lbnRUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNmb3JtZXIvRnJhZ21lbnRUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjg1MjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zZm9ybWVyL0ZyYWdtZW50VHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwudHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC5XU0RMT3BlcmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5JWFNERnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgRnJhZ21lbnRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIElUcmFuc2Zvcm1lcgotewotICBwcm90ZWN0ZWQgQ29udHJvbGxlciBjb250cm9sbGVyOwotCi0gIHB1YmxpYyBGcmFnbWVudFRyYW5zZm9ybWVyKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIG5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBzYi5hcHBlbmQoIjxyb290PiIpOwotICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KWNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUcmVlRWxlbWVudCgpOwotICAgIEl0ZXJhdG9yIGl0ID0gb3BlckVsZW1lbnQuZ2V0T3JkZXJlZEJvZHlQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdC5uZXh0KCk7Ci0gICAgICBJWFNERnJhZ21lbnQgZnJhZyA9IChJWFNERnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICBFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgRWxlbWVudFswXTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBlbGVtZW50cyA9IGZyYWcuZ2VuSW5zdGFuY2VEb2N1bWVudHNGcm9tUGFyYW1ldGVyVmFsdWVzKCFvcGVyRWxlbWVudC5pc1VzZUxpdGVyYWwoKSwgbmV3IEhhc2h0YWJsZSgpLCBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgICBzYi5hcHBlbmQoWE1MVXRpbHMuc2VyaWFsaXplKGVsZW1lbnRzW2ldLCB0cnVlKSk7Ci0gICAgfQotICAgIHNiLmFwcGVuZCgiPC9yb290PiIpOwotICAgIHByb3BlcnRpZXMucHV0KEZyYWdtZW50Q29uc3RhbnRzLlNPVVJDRV9DT05URU5ULCBzYi50b1N0cmluZygpKTsKLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZGVOb3JtYWxpemUoSGFzaHRhYmxlIHByb3BlcnRpZXMpCi0gIHsKLSAgICBTdHJpbmcgc291cmNlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoRnJhZ21lbnRDb25zdGFudHMuU09VUkNFX0NPTlRFTlQpOwotICAgIGlmIChzb3VyY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCByb290ID0gWE1MVXRpbHMuc3RyaW5nVG9FbGVtZW50KHNvdXJjZSk7Ci0gICAgICAgIGlmIChyb290ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgVmVjdG9yIGNoaWxkcmVuVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgICAgICBjaGlsZHJlblZlY3Rvci5hZGQoY2hpbGQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBFbGVtZW50W10gY2hpbGRyZW4gPSAoRWxlbWVudFtdKWNoaWxkcmVuVmVjdG9yLnRvQXJyYXkobmV3IEVsZW1lbnRbMF0pOwotICAgICAgICAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgICBJdGVyYXRvciBpdCA9IG9wZXJFbGVtZW50LmdldE9yZGVyZWRCb2R5UGFydHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXQubmV4dCgpOwotICAgICAgICAgICAgSVhTREZyYWdtZW50IGZyYWcgPSAoSVhTREZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICAgICAgICAgICAgZnJhZy5zZXRQYXJhbWV0ZXJWYWx1ZXNGcm9tSW5zdGFuY2VEb2N1bWVudHMoY2hpbGRyZW4pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9DaHVua2VkSW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9DaHVua2VkSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY2MTAzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvQ2h1bmtlZElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQ2h1bmtlZElucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0KLXsKLSAgcHJvdGVjdGVkIGxvbmcgY2h1bmtTaXplID0gMGw7Ci0gIHByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbWF4Q2hhckxvbmcgPSAoTG9uZy50b0hleFN0cmluZyhMb25nLk1BWF9WQUxVRSkpLnRvU3RyaW5nKCkubGVuZ3RoKCk7Ci0KLSAgcHJpdmF0ZSBDaHVua2VkSW5wdXRTdHJlYW0oKQotICB7Ci0gICAgc3VwZXIobnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgQ2h1bmtlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlzKQotICB7Ci0gICAgc3VwZXIoaXMpOwotICB9Ci0KLSAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBieXRlW10gZCA9IG5ldyBieXRlWzFdOwotICAgIGludCByYyA9IHJlYWQoZCwgMCwgMSk7Ci0gICAgcmV0dXJuIHJjID4gMCA/IChkWzBdICYgMHhGRikgOiByYzsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZChiLCAwLCBiLmxlbmd0aCk7Ci0gIH0KLQotICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChjbG9zZWQpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgaW50IGNzID0gKGludCkgTWF0aC5taW4oSW50ZWdlci5NQVhfVkFMVUUsIGNodW5rU2l6ZSk7Ci0gICAgaW50IHRvdGFscmVhZCA9IDA7Ci0gICAgaW50IGJ5dGVzcmVhZCA9IDA7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgaWYgKGNodW5rU2l6ZSA8IDFMKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKDBsID09IGdldENodW5rZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG90YWxyZWFkID09IDApCi0gICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcmV0dXJuIHRvdGFscmVhZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZXNyZWFkID0gaW4ucmVhZChiLCBvZmYgKyB0b3RhbHJlYWQsIE1hdGgubWluKGxlbiAtIHRvdGFscmVhZCwgKGludCkgTWF0aC5taW4oY2h1bmtTaXplLCBJbnRlZ2VyLk1BWF9WQUxVRSkpKTsKLSAgICAgICAgaWYgKGJ5dGVzcmVhZCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICB0b3RhbHJlYWQgKz0gYnl0ZXNyZWFkOwotICAgICAgICAgIGNodW5rU2l6ZSAtPSBieXRlc3JlYWQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdoaWxlIChsZW4gLSB0b3RhbHJlYWQgPiAwICYmIGJ5dGVzcmVhZCA+IC0xKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgY2xvc2VkID0gdHJ1ZTsKLSAgICAgIHRocm93IGU7Ci0gICAgfQotICAgIHJldHVybiB0b3RhbHJlYWQ7Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBza2lwKGZpbmFsIGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoY2xvc2VkKQotICAgICAgcmV0dXJuIDA7Ci0gICAgbG9uZyBza2lwcGVkID0gMGw7Ci0gICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICBpbnQgYnJlYWQgPSAtMTsKLSAgICBkbwotICAgIHsKLSAgICAgIGJyZWFkID0gcmVhZChiLCAwLCBiLmxlbmd0aCk7Ci0gICAgICBpZiAoYnJlYWQgPiAwKQotICAgICAgICBza2lwcGVkICs9IGJyZWFkOwotICAgIH0KLSAgICB3aGlsZSAoYnJlYWQgIT0gLTEgJiYgc2tpcHBlZCA8IG4pOwotICAgIHJldHVybiBza2lwcGVkOwotICB9Ci0KLSAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChjbG9zZWQpCi0gICAgICByZXR1cm4gMDsKLSAgICBpbnQgcmMgPSAoaW50KSBNYXRoLm1pbihjaHVua1NpemUsIEludGVnZXIuTUFYX1ZBTFVFKTsKLSAgICByZXR1cm4gTWF0aC5taW4ocmMsIGluLmF2YWlsYWJsZSgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBsb25nIGdldENodW5rZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigxMDI0KTsKLSAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbWF4Q2hhckxvbmcgKyAyXTsKLSAgICBpbnQgYnVmc3ogPSAwOwotICAgIGNodW5rU2l6ZSA9IC0xTDsKLSAgICBpbnQgYyA9IC0xOwotICAgIGRvCi0gICAgewotICAgICAgYyA9IGluLnJlYWQoKTsKLSAgICAgIGlmIChjID4gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmIChjICE9ICdccicgJiYgYyAhPSAnXG4nICYmIGMgIT0gJyAnICYmIGMgIT0gJ1x0JykKLSAgICAgICAgewotICAgICAgICAgIGJ1ZltidWZzeisrXSA9ICgoYnl0ZSkgYyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgd2hpbGUgKGMgPiAtMSAmJiAoYyAhPSAnXG4nIHx8IGJ1ZnN6ID09IDApICYmIGJ1ZnN6IDwgYnVmLmxlbmd0aCk7Ci0gICAgaWYgKGMgPCAwKQotICAgIHsKLSAgICAgIGNsb3NlZCA9IHRydWU7Ci0gICAgfQotICAgIFN0cmluZyBzYnVmID0gbmV3IFN0cmluZyhidWYsIDAsIGJ1ZnN6KTsKLSAgICBpZiAoYnVmc3ogPiBtYXhDaGFyTG9uZykKLSAgICB7Ci0gICAgICBjbG9zZWQgPSB0cnVlOwotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDaHVua2VkIGlucHV0IHN0cmVhbSBmYWlsZWQgdG8gcmVjZWl2ZSB2YWxpZCBjaHVuayBzaXplOiIgKyBzYnVmKTsKLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY2h1bmtTaXplID0gTG9uZy5wYXJzZUxvbmcoc2J1ZiwgMTYpOwotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5lKQotICAgIHsKLSAgICAgIGNsb3NlZCA9IHRydWU7Ci0gICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIiciICsgc2J1ZiArICInICIgKyBuZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBpZiAoY2h1bmtTaXplIDwgMUwpCi0gICAgICBjbG9zZWQgPSB0cnVlOwotICAgIGlmIChjaHVua1NpemUgIT0gMEwgJiYgYyA8IDApCi0gICAgewotICAgICAgLy9JZiBjaHVuayBzaXplIGlzIHplcm8gdHJ5IGFuZCBiZSB0b2xlcmFudCB0aGF0IHRoZXJlIG1heWJlIG5vIGNyIG9yIGxmCi0gICAgICAvLyBhdCB0aGUgZW5kLgotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJIVFRQIENodW5rZWQgc3RyZWFtIGNsb3NlZCBpbiBtaWRkbGUgb2YgY2h1bmsuIik7Ci0gICAgfQotICAgIGlmIChjaHVua1NpemUgPCAwTCkKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSFRUUCBDaHVuayBzaXplIHJlY2VpdmVkICIgKyBjaHVua1NpemUgKyAiIGlzIGxlc3MgdGhhbiB6ZXJvLiIpOwotICAgIHJldHVybiBjaHVua1NpemU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgc3luY2hyb25pemVkICh0aGlzKQotICAgIHsKLSAgICAgIGlmIChjbG9zZWQpCi0gICAgICAgIHJldHVybjsKLSAgICAgIGNsb3NlZCA9IHRydWU7Ci0gICAgfQotICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgaW50IGJyZWFkID0gLTE7Ci0gICAgZG8KLSAgICB7Ci0gICAgICBicmVhZCA9IHJlYWQoYiwgMCwgYi5sZW5ndGgpOwotICAgIH0KLSAgICB3aGlsZSAoYnJlYWQgIT0gLTEpOwotICB9Ci0KLSAgLyoKLSAgICogcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KQotICAgKiB7Ci0gICAqIH0KLSAgICovCi0KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRG9uJ3Qgc3VwcG9ydCBtYXJrZWQgc3RyZWFtcyIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvSFRUUEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU4ODMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBIVFRQRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotICAvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY0MzgxMDU5MDAxMzQ5NjFMOwotcHJpdmF0ZSBpbnQgc3RhdHVzQ29kZTsKLSAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzTWVzc2FnZTsKLSAgcHJpdmF0ZSBNYXAgaGVhZGVyczsKLSAgCi0gIHB1YmxpYyBIVFRQRXhjZXB0aW9uKGludCBzdGF0dXNDb2RlLCBTdHJpbmcgc3RhdHVzTWVzc2FnZSwgTWFwIGhlYWRlcnMpCi0gIHsKLSAgICBzdXBlcihzdGF0dXNNZXNzYWdlKTsKLSAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlOwotICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHN0YXR1c01lc3NhZ2U7Ci0gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKLSAgfQotICAKLSAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkKLSAgewotICAgIHJldHVybiBzdGF0dXNDb2RlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c01lc3NhZ2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBNYXAgZ2V0SGVhZGVycygpCi0gIHsKLSAgICByZXR1cm4gaGVhZGVyczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRIZWFkZXIoU3RyaW5nIGtleSkKLSAgewotICAgIE9iamVjdCB2YWx1ZSA9IGhlYWRlcnMuZ2V0KGtleSk7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQUmVzcG9uc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViNjFhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvSFRUUFJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEhUVFBSZXNwb25zZQotewotICBwcml2YXRlIGJvb2xlYW4gc3RhdHVzU2V0OwotICBwcml2YXRlIGludCBzdGF0dXNDb2RlOwotICBwcml2YXRlIFN0cmluZyBzdGF0dXNNZXNzYWdlOwotICBwcml2YXRlIEhhc2h0YWJsZSBoZWFkZXJzOwotICBwcml2YXRlIGJ5dGVbXSBwYXlsb2FkOwotCi0gIHB1YmxpYyBIVFRQUmVzcG9uc2UoKQotICB7Ci0gICAgcmVzZXQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgewotICAgIHN0YXR1c1NldCA9IGZhbHNlOwotICAgIHN0YXR1c0NvZGUgPSAtMTsKLSAgICBzdGF0dXNNZXNzYWdlID0gbnVsbDsKLSAgICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgICAgaGVhZGVycy5jbGVhcigpOwotICAgIGVsc2UKLSAgICAgIGhlYWRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcGF5bG9hZCA9IG5ldyBieXRlWzBdOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNTdGF0dXNTZXQoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c1NldDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpCi0gIHsKLSAgICByZXR1cm4gc3RhdHVzQ29kZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFN0YXR1c0NvZGUoaW50IHN0YXR1c0NvZGUpCi0gIHsKLSAgICBzdGF0dXNTZXQgPSB0cnVlOwotICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHN0YXR1c01lc3NhZ2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNNZXNzYWdlKFN0cmluZyBzdGF0dXNNZXNzYWdlKQotICB7Ci0gICAgdGhpcy5zdGF0dXNNZXNzYWdlID0gc3RhdHVzTWVzc2FnZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBoZWFkZXJzLnB1dChrZXksIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgaGVhZGVycy5nZXQoa2V5KTsKLSAgfQotCi0gIHB1YmxpYyBNYXAgZ2V0SGVhZGVycygpCi0gIHsKLSAgICByZXR1cm4gaGVhZGVyczsKLSAgfQotCi0gIHB1YmxpYyBieXRlW10gZ2V0UGF5bG9hZCgpCi0gIHsKLSAgICByZXR1cm4gcGF5bG9hZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBheWxvYWQoYnl0ZVtdIHBheWxvYWQpCi0gIHsKLSAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNwb3J0L0hUVFBUcmFuc3BvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9IVFRQVHJhbnNwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNDhlM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNwb3J0L0hUVFBUcmFuc3BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlhNTFV0aWxzOwotCi1pbXBvcnQgc3VuLm1pc2MuQkFTRTY0RW5jb2RlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSFRUUFRyYW5zcG9ydAotewotICBwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNfUFJPUF9IVFRQU19QUk9YWV9IT1NUID0gImh0dHBzLnByb3h5SG9zdCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFNZU19QUk9QX0hUVFBTX1BST1hZX1BPUlQgPSAiaHR0cHMucHJveHlQb3J0IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUF9QUk9YWV9IT1NUID0gImh0dHAucHJveHlIb3N0IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUF9QUk9YWV9QT1JUID0gImh0dHAucHJveHlQb3J0IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUF9QUk9YWV9VU0VSX05BTUUgPSAiaHR0cC5wcm94eVVzZXJOYW1lIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU1lTX1BST1BfSFRUUF9QUk9YWV9QQVNTV09SRCA9ICJodHRwLnByb3h5UGFzc3dvcmQiOwotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfTUVUSE9EID0gIlBPU1QiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1ZFUlNJT04gPSAiSFRUUC8xLjEiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9TT0FQX0FDVElPTiA9ICJTT0FQQWN0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfQVVUSCA9ICJBdXRob3JpemF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfV1dXX0FVVEggPSAiV1dXLUF1dGhlbnRpY2F0ZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX1BST1hZX0FVVEggPSAiUHJveHktYXV0aG9yaXphdGlvbiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX0NPT0tJRSA9ICJDb29raWUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9DT09LSUUyID0gIkNvb2tpZTIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9IT1NUID0gIkhvc3QiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9DT05URU5UX1RZUEUgPSAiQ29udGVudC1UeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfQ09OVEVOVF9MRU5HVEggPSAiQ29udGVudC1MZW5ndGgiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX0hFQURFUl9BQ0NFUFQgPSAiQWNjZXB0IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfVVNFUl9BR0VOVCA9ICJVc2VyLUFnZW50IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfQ0FDSEVfQ09OVFJPTCA9ICJDYWNoZS1Db250cm9sIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9IRUFERVJfUFJBR01BID0gIlByYWdtYSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX1RSQU5TRkVSX0VOQ09ERUlORyA9ICJUcmFuc2Zlci1FbmNvZGluZyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBfSEVBREVSX0NPTk5FQ1RJT04gPSAiQ29ubmVjdGlvbiI7Ci0gIAotICBwcml2YXRlIGZpbmFsIGludCBIVFRQX0NPREVfQ09OVElOVUUgPSAxMDA7Ci0gIHByaXZhdGUgZmluYWwgaW50IEhUVFBfQ09ERV9PSyA9IDIwMDsKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgSFRUUF9DT0RFX0VYQ0VQVElPTiA9IDMwMDsKLQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJQk1fV0VCX1NFUlZJQ0VTX0VYUExPUkVSID0gIklCTSBXZWIgU2VydmljZXMgRXhwbG9yZXIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBURVhUX1hNTCA9ICJ0ZXh0L3htbCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9WQUxVRSA9ICJ0ZXh0L3htbDsgY2hhcnNldD11dGYtOCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEFDQ0VQVF9WQUxVRSA9ICJhcHBsaWNhdGlvbi9zb2FwK3htbCwgYXBwbGljYXRpb24vZGltZSwgbXVsdGlwYXJ0L3JlbGF0ZWQsIHRleHQvKiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDID0gIkJhc2ljIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTk9fQ0FDSEUgPSAibm8tY2FjaGUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBDSFVOS0VEID0gImNodW5rZWQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBDTE9TRSA9ICJjbG9zZSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEhUVFBTID0gImh0dHBzIjsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIFFVT1RFID0gJ1wiJzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENPTE9OID0gJzonOwotICBwcml2YXRlIGZpbmFsIGNoYXIgU1BBQ0UgPSAnICc7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBUQUIgPSAnXHQnOwotICBwcml2YXRlIGZpbmFsIGNoYXIgUiA9ICdccic7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBOID0gJ1xuJzsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyIFJPT1QgPSAnLyc7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIE5FV19MSU5FID0gIlxyXG4iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKLQotICBwcml2YXRlIGZpbmFsIGludCBERUZBVUxUX0hUVFBfUE9SVCA9IDgwOwotICBwcml2YXRlIGZpbmFsIGludCBERUZBVUxUX0hUVFBTX1BPUlQgPSA0NDM7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfU09BUF9FTkNPRElORyA9ICJVVEYtOCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfSFRUUF9IRUFERVJfRU5DT0RJTkcgPSAiaXNvLTg4NTktMSI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cEJhc2ljQXV0aFVzZXJuYW1lOwotICBwcml2YXRlIFN0cmluZyBodHRwQmFzaWNBdXRoUGFzc3dvcmQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBtYWludGFpblNlc3Npb24gPSBmYWxzZTsKLSAgcHJpdmF0ZSBTdHJpbmcgY29va2llOwotICBwcml2YXRlIFN0cmluZyBjb29raWUyOwotICBwcml2YXRlIGJvb2xlYW4gdXNlQ2h1bmtlZCA9IGZhbHNlOwotICBwcml2YXRlIEhUVFBSZXNwb25zZSBodHRwUmVzcG9uc2U7Ci0KLSAgcHVibGljIFN0cmluZyBnZXRIdHRwQmFzaWNBdXRoVXNlcm5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGh0dHBCYXNpY0F1dGhVc2VybmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SHR0cEJhc2ljQXV0aFVzZXJuYW1lKFN0cmluZyBodHRwQmFzaWNBdXRoVXNlcm5hbWUpCi0gIHsKLSAgICB0aGlzLmh0dHBCYXNpY0F1dGhVc2VybmFtZSA9IGh0dHBCYXNpY0F1dGhVc2VybmFtZTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRIdHRwQmFzaWNBdXRoUGFzc3dvcmQoKQotICB7Ci0gICAgcmV0dXJuIGh0dHBCYXNpY0F1dGhQYXNzd29yZDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SHR0cEJhc2ljQXV0aFBhc3N3b3JkKFN0cmluZyBodHRwQmFzaWNBdXRoUGFzc3dvcmQpCi0gIHsKLSAgICB0aGlzLmh0dHBCYXNpY0F1dGhQYXNzd29yZCA9IGh0dHBCYXNpY0F1dGhQYXNzd29yZDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldE1ldGhvZChVUkwgdXJsKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihIVFRQX01FVEhPRCk7Ci0gICAgc2IuYXBwZW5kKFNQQUNFKTsKLSAgICBTdHJpbmcgaHR0cFByb3h5SG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9IVFRQX1BST1hZX0hPU1QpOwotICAgIFN0cmluZyBodHRwc1Byb3h5SG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9IVFRQU19QUk9YWV9IT1NUKTsKLSAgICBpZiAoaHR0cFByb3h5SG9zdCAhPSBudWxsICYmIGh0dHBQcm94eUhvc3QubGVuZ3RoKCkgPiAwICYmIGh0dHBzUHJveHlIb3N0ICE9IG51bGwgJiYgaHR0cHNQcm94eUhvc3QubGVuZ3RoKCkgPiAwKQotICAgICAgc2IuYXBwZW5kKHVybC50b1N0cmluZygpKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIGZpbGUgPSB1cmwuZ2V0RmlsZSgpOwotICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgc2IuYXBwZW5kKGZpbGUpOwotICAgICAgZWxzZQotICAgICAgICBzYi5hcHBlbmQoUk9PVCk7Ci0gICAgfQotICAgIHNiLmFwcGVuZChTUEFDRSk7Ci0gICAgc2IuYXBwZW5kKEhUVFBfVkVSU0lPTik7Ci0gICAgc2IuYXBwZW5kKE5FV19MSU5FKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldEhvc3QoVVJMIHVybCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoSFRUUF9IRUFERVJfSE9TVCk7Ci0gICAgc2IuYXBwZW5kKENPTE9OKTsKLSAgICBzYi5hcHBlbmQoU1BBQ0UpOwotICAgIHNiLmFwcGVuZCh1cmwuZ2V0SG9zdCgpKTsKLSAgICBzYi5hcHBlbmQoQ09MT04pOwotICAgIGludCBwb3J0ID0gdXJsLmdldFBvcnQoKTsKLSAgICBpZiAocG9ydCA+IDApCi0gICAgICBzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YocG9ydCkpOwotICAgIGVsc2UgaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFsc0lnbm9yZUNhc2UoSFRUUFMpKQotICAgICAgc2IuYXBwZW5kKERFRkFVTFRfSFRUUFNfUE9SVCk7Ci0gICAgZWxzZQotICAgICAgc2IuYXBwZW5kKERFRkFVTFRfSFRUUF9QT1JUKTsKLSAgICBzYi5hcHBlbmQoTkVXX0xJTkUpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DT05URU5UX1RZUEUsIENPTlRFTlRfVFlQRV9WQUxVRSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENvbnRlbnRMZW5ndGgoU3RyaW5nIHBheWxvYWQpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DT05URU5UX0xFTkdUSCwgU3RyaW5nLnZhbHVlT2YocGF5bG9hZC5sZW5ndGgoKSkpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0U09BUEFjdGlvbihTdHJpbmcgc29hcEFjdGlvbikKLSAgewotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoSFRUUF9IRUFERVJfU09BUF9BQ1RJT04pOwotICAgIHNiLmFwcGVuZChDT0xPTik7Ci0gICAgc2IuYXBwZW5kKFNQQUNFKTsKLSAgICBzYi5hcHBlbmQoUVVPVEUpOwotICAgIGlmIChzb2FwQWN0aW9uICE9IG51bGwpCi0gICAgICBzYi5hcHBlbmQoc29hcEFjdGlvbik7Ci0gICAgc2IuYXBwZW5kKFFVT1RFKTsKLSAgICBzYi5hcHBlbmQoTkVXX0xJTkUpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb29raWUoKQotICB7Ci0gICAgaWYgKG1haW50YWluU2Vzc2lvbikKLSAgICAgIHJldHVybiBnZXRIVFRQSGVhZGVyKEhUVFBfSEVBREVSX0NPT0tJRSwgY29va2llKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gRU1QVFlfU1RSSU5HOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb29raWUyKCkKLSAgewotICAgIGlmIChtYWludGFpblNlc3Npb24pCi0gICAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DT09LSUUyLCBjb29raWUyKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gRU1QVFlfU1RSSU5HOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRXV1dBdXRoZW50aWNhdGlvbigpCi0gIHsKLSAgICBpZiAoaHR0cEJhc2ljQXV0aFVzZXJuYW1lICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aFBhc3N3b3JkICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihodHRwQmFzaWNBdXRoVXNlcm5hbWUpOwotICAgICAgc2IuYXBwZW5kKENPTE9OKTsKLSAgICAgIHNiLmFwcGVuZChodHRwQmFzaWNBdXRoUGFzc3dvcmQpOwotICAgICAgQkFTRTY0RW5jb2RlciBlbmNvZGVyID0gbmV3IEJBU0U2NEVuY29kZXIoKTsKLSAgICAgIFN0cmluZyBlbmNvZGVkVXNlck5hbWVQYXNzd29yZCA9IGVuY29kZXIuZW5jb2RlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7Ci0gICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgICBzYi5hcHBlbmQoSFRUUF9IRUFERVJfQVVUSCk7Ci0gICAgICBzYi5hcHBlbmQoQ09MT04pOwotICAgICAgc2IuYXBwZW5kKFNQQUNFKTsKLSAgICAgIHNiLmFwcGVuZChCQVNJQyk7Ci0gICAgICBzYi5hcHBlbmQoU1BBQ0UpOwotICAgICAgc2IuYXBwZW5kKGVuY29kZWRVc2VyTmFtZVBhc3N3b3JkKTsKLSAgICAgIHNiLmFwcGVuZChORVdfTElORSk7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIEVNUFRZX1NUUklORzsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJveHlBdXRoZW50aWNhdGlvbigpCi0gIHsKLSAgICBTdHJpbmcgcHJveHlVc2VyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9IVFRQX1BST1hZX1VTRVJfTkFNRSk7Ci0gICAgU3RyaW5nIHByb3h5UGFzc3dvcmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUF9QUk9YWV9QQVNTV09SRCk7Ci0gICAgaWYgKHByb3h5VXNlck5hbWUgIT0gbnVsbCAmJiBwcm94eVBhc3N3b3JkICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihwcm94eVVzZXJOYW1lKTsKLSAgICAgIHNiLmFwcGVuZChDT0xPTik7Ci0gICAgICBzYi5hcHBlbmQocHJveHlQYXNzd29yZCk7Ci0gICAgICBCQVNFNjRFbmNvZGVyIGVuY29kZXIgPSBuZXcgQkFTRTY0RW5jb2RlcigpOwotICAgICAgU3RyaW5nIGVuY29kZWRVc2VyTmFtZVBhc3N3b3JkID0gZW5jb2Rlci5lbmNvZGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLSAgICAgIHNiLnNldExlbmd0aCgwKTsKLSAgICAgIHNiLmFwcGVuZChIVFRQX0hFQURFUl9QUk9YWV9BVVRIKTsKLSAgICAgIHNiLmFwcGVuZChDT0xPTik7Ci0gICAgICBzYi5hcHBlbmQoU1BBQ0UpOwotICAgICAgc2IuYXBwZW5kKEJBU0lDKTsKLSAgICAgIHNiLmFwcGVuZChTUEFDRSk7Ci0gICAgICBzYi5hcHBlbmQoZW5jb2RlZFVzZXJOYW1lUGFzc3dvcmQpOwotICAgICAgc2IuYXBwZW5kKE5FV19MSU5FKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gRU1QVFlfU1RSSU5HOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRBY2NlcHQoKQotICB7Ci0gICAgcmV0dXJuIGdldEhUVFBIZWFkZXIoSFRUUF9IRUFERVJfQUNDRVBULCBBQ0NFUFRfVkFMVUUpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRVc2VyQWdlbnQoKQotICB7Ci0gICAgcmV0dXJuIGdldEhUVFBIZWFkZXIoSFRUUF9IRUFERVJfVVNFUl9BR0VOVCwgSUJNX1dFQl9TRVJWSUNFU19FWFBMT1JFUik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldENhY2hlQ29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DQUNIRV9DT05UUk9MLCBOT19DQUNIRSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFByYWdtYSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9QUkFHTUEsIE5PX0NBQ0hFKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29ubmVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0SFRUUEhlYWRlcihIVFRQX0hFQURFUl9DT05ORUNUSU9OLCBDTE9TRSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldEhUVFBIZWFkZXIoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihrZXkpOwotICAgICAgc2IuYXBwZW5kKENPTE9OKTsKLSAgICAgIHNiLmFwcGVuZChTUEFDRSk7Ci0gICAgICBzYi5hcHBlbmQodmFsdWUpOwotICAgICAgc2IuYXBwZW5kKE5FV19MSU5FKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gRU1QVFlfU1RSSU5HOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VuZChVUkwgdXJsLCBTdHJpbmcgc29hcEFjdGlvbiwgU3RyaW5nIHBheWxvYWQpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZ0J1ZmZlciBodHRwSGVhZGVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldE1ldGhvZCh1cmwpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRIb3N0KHVybCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldENvbnRlbnRUeXBlKCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldENvbnRlbnRMZW5ndGgocGF5bG9hZCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldEFjY2VwdCgpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRVc2VyQWdlbnQoKSk7Ci0gICAgaHR0cEhlYWRlci5hcHBlbmQoZ2V0Q2FjaGVDb250cm9sKCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldFByYWdtYSgpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRTT0FQQWN0aW9uKHNvYXBBY3Rpb24pKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRXV1dBdXRoZW50aWNhdGlvbigpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRQcm94eUF1dGhlbnRpY2F0aW9uKCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldENvb2tpZSgpKTsKLSAgICBodHRwSGVhZGVyLmFwcGVuZChnZXRDb29raWUyKCkpOwotICAgIGh0dHBIZWFkZXIuYXBwZW5kKGdldENvbm5lY3Rpb24oKSk7Ci0gICAgaHR0cEhlYWRlci5hcHBlbmQoTkVXX0xJTkUpOyAvLyBuZXcgbGluZSBiZXR3ZWVuIHRoZSBIVFRQIGhlYWRlciBhbmQgdGhlIHBheWxvYWQKLSAgICBTb2NrZXQgc29ja2V0ID0gYnVpbGRTb2NrZXQodXJsKTsKLSAgICBJbnB1dFN0cmVhbSBpcyA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotICAgIE91dHB1dFN0cmVhbSBvcyA9IHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICBvcy53cml0ZShodHRwSGVhZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoREVGQVVMVF9IVFRQX0hFQURFUl9FTkNPRElORykpOwotICAgIG9zLndyaXRlKHBheWxvYWQuZ2V0Qnl0ZXMoREVGQVVMVF9TT0FQX0VOQ09ESU5HKSk7Ci0gICAgb3MuZmx1c2goKTsKLSAgICBodHRwUmVzcG9uc2UgPSBuZXcgSFRUUFJlc3BvbnNlKCk7Ci0gICAgcmVhZEhUVFBSZXNwb25zZUhlYWRlcihpcywgaHR0cFJlc3BvbnNlKTsKLSAgICBpbnQgY29kZSA9IGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCk7Ci0gICAgaWYgKGNvZGUgPT0gSFRUUF9DT0RFX0NPTlRJTlVFKQotICAgIHsKLSAgICAgIGh0dHBSZXNwb25zZS5yZXNldCgpOwotICAgICAgcmVhZEhUVFBSZXNwb25zZUhlYWRlcihpcywgaHR0cFJlc3BvbnNlKTsKLSAgICB9Ci0gICAgcmVhZEhUVFBSZXNwb25zZVBheWxvYWQoaXMsIGh0dHBSZXNwb25zZSk7Ci0gICAgb3MuY2xvc2UoKTsKLSAgICBpcy5jbG9zZSgpOwotICAgIHNvY2tldC5jbG9zZSgpOwotICAgIGNvZGUgPSBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpOwotICAgIFN0cmluZyBjb250ZW50VHlwZSA9IGh0dHBSZXNwb25zZS5nZXRIZWFkZXIoSFRUUF9IRUFERVJfQ09OVEVOVF9UWVBFLnRvTG93ZXJDYXNlKCkpOwotICAgIGlmIChjb2RlID49IEhUVFBfQ09ERV9FWENFUFRJT04gJiYgKGNvbnRlbnRUeXBlID09IG51bGwgfHwgY29udGVudFR5cGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFRFWFRfWE1MLnRvTG93ZXJDYXNlKCkpID09IC0xKSkKLSAgICAgIHRocm93IG5ldyBIVFRQRXhjZXB0aW9uKGNvZGUsIGh0dHBSZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCksIGh0dHBSZXNwb25zZS5nZXRIZWFkZXJzKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlYWRIVFRQUmVzcG9uc2VIZWFkZXIoSW5wdXRTdHJlYW0gaXMsIEhUVFBSZXNwb25zZSByZXNwKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGJ5dGUgYiA9IDA7Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgaW50IGNvbG9uSW5kZXggPSAtMTsKLSAgICBTdHJpbmcga2V5OwotICAgIFN0cmluZyB2YWx1ZTsKLSAgICBib29sZWFuIHJlYWRUb29NdWNoID0gZmFsc2U7Ci0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3M7Ci0gICAgZm9yIChiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSg0MDk2KTs7KQotICAgIHsKLSAgICAgIGlmICghcmVhZFRvb011Y2gpCi0gICAgICAgIGIgPSAoYnl0ZSlpcy5yZWFkKCk7Ci0gICAgICBpZiAoYiA9PSAtMSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICByZWFkVG9vTXVjaCA9IGZhbHNlOwotICAgICAgaWYgKChiICE9IFIpICYmIChiICE9IE4pKQotICAgICAgewotICAgICAgICBpZiAoKGIgPT0gQ09MT04pICYmIChjb2xvbkluZGV4ID09IC0xKSkKLSAgICAgICAgICBjb2xvbkluZGV4ID0gbGVuOwotICAgICAgICBsZW4rKzsKLSAgICAgICAgYmFvcy53cml0ZShiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGIgPT0gUikKLSAgICAgICAgY29udGludWU7Ci0gICAgICBlbHNlIC8vIGIgPT0gTgotICAgICAgewotICAgICAgICBpZiAobGVuID09IDApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGIgPSAoYnl0ZSlpcy5yZWFkKCk7Ci0gICAgICAgIHJlYWRUb29NdWNoID0gdHJ1ZTsKLSAgICAgICAgLy8gQSBzcGFjZSBvciB0YWIgYXQgdGhlIGJlZ2luaW5nIG9mIGEgbGluZSBtZWFucyB0aGUgaGVhZGVyIGNvbnRpbnVlcy4KLSAgICAgICAgaWYgKChiID09IFNQQUNFKSB8fCAoYiA9PSBUQUIpKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBiYW9zLmNsb3NlKCk7Ci0gICAgICAgIGJ5dGVbXSBiQXJyYXkgPSBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIGJhb3MucmVzZXQoKTsKLSAgICAgICAgaWYgKGNvbG9uSW5kZXggIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBrZXkgPSBuZXcgU3RyaW5nKGJBcnJheSwgMCwgY29sb25JbmRleCwgREVGQVVMVF9IVFRQX0hFQURFUl9FTkNPRElORyk7Ci0gICAgICAgICAgdmFsdWUgPSBuZXcgU3RyaW5nKGJBcnJheSwgY29sb25JbmRleCArIDEsIGxlbiAtIDEgLSBjb2xvbkluZGV4LCBERUZBVUxUX0hUVFBfSEVBREVSX0VOQ09ESU5HKTsKLSAgICAgICAgICBjb2xvbkluZGV4ID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAga2V5ID0gbmV3IFN0cmluZyhiQXJyYXksIDAsIGxlbiwgREVGQVVMVF9IVFRQX0hFQURFUl9FTkNPRElORyk7Ci0gICAgICAgICAgdmFsdWUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZXNwLmlzU3RhdHVzU2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZWFkZXIgc3RhdHVzIGNvZGUKLSAgICAgICAgICBpbnQgc3RhcnQgPSBrZXkuaW5kZXhPZihTUEFDRSkgKyAxOwotICAgICAgICAgIFN0cmluZyBzID0ga2V5LnN1YnN0cmluZyhzdGFydCkudHJpbSgpOwotICAgICAgICAgIGludCBlbmQgPSBzLmluZGV4T2YoU1BBQ0UpOwotICAgICAgICAgIGlmIChlbmQgIT0gLTEpCi0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgZW5kKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNwLnNldFN0YXR1c0NvZGUoSW50ZWdlci5wYXJzZUludChzKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3Auc2V0U3RhdHVzQ29kZSgtMSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3Auc2V0U3RhdHVzTWVzc2FnZShrZXkuc3Vic3RyaW5nKHN0YXJ0ICsgZW5kICsgMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXNwLmFkZEhlYWRlcihrZXkudG9Mb3dlckNhc2UoKS50cmltKCksIHZhbHVlLnRyaW0oKSk7Ci0gICAgICAgIGxlbiA9IDA7Ci0gICAgICB9Ci0gICAgfQotICAgIGJhb3MuY2xvc2UoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZWFkSFRUUFJlc3BvbnNlUGF5bG9hZChJbnB1dFN0cmVhbSBpcywgSFRUUFJlc3BvbnNlIHJlc3ApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYnl0ZSBiID0gKGJ5dGUpaXMucmVhZCgpOwotICAgICAgd2hpbGUgKGIgIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGJhb3Mud3JpdGUoYik7Ci0gICAgICAgIGIgPSAoYnl0ZSlpcy5yZWFkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHN0ZSkKLSAgICB7Ci0gICAgfQotICAgIGJhb3MuY2xvc2UoKTsKLSAgICByZXNwLnNldFBheWxvYWQoYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgfQotCi0gIHB1YmxpYyBCdWZmZXJlZFJlYWRlciByZWNlaXZlKCkKLSAgewotICAgIGlmIChodHRwUmVzcG9uc2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgYnl0ZVtdIHBheWxvYWQgPSBodHRwUmVzcG9uc2UuZ2V0UGF5bG9hZCgpOwotICAgICAgICBFbGVtZW50IHNvYXBFbnZlbG9wZSA9IG51bGw7Ci0gICAgICAgIGlmIChDSFVOS0VELmVxdWFsc0lnbm9yZUNhc2UoaHR0cFJlc3BvbnNlLmdldEhlYWRlcihIVFRQX0hFQURFUl9UUkFOU0ZFUl9FTkNPREVJTkcudG9Mb3dlckNhc2UoKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwYXlsb2FkKTsKLSAgICAgICAgICBDaHVua2VkSW5wdXRTdHJlYW0gY2lzID0gbmV3IENodW5rZWRJbnB1dFN0cmVhbShiYWlzKTsKLSAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICBieXRlIGI7Ci0gICAgICAgICAgd2hpbGUgKChiID0gKGJ5dGUpY2lzLnJlYWQoKSkgIT0gLTEpCi0gICAgICAgICAgICBiYW9zLndyaXRlKGIpOwotICAgICAgICAgIGJhb3MuY2xvc2UoKTsKLSAgICAgICAgICBjaXMuY2xvc2UoKTsKLSAgICAgICAgICBiYWlzLmNsb3NlKCk7Ci0gICAgICAgICAgc29hcEVudmVsb3BlID0gWE1MVXRpbHMuYnl0ZUFycmF5VG9FbGVtZW50KGJhb3MudG9CeXRlQXJyYXkoKSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHNvYXBFbnZlbG9wZSA9IFhNTFV0aWxzLmJ5dGVBcnJheVRvRWxlbWVudChwYXlsb2FkLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmVtb3ZlIFhNTCBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLSAgICAgICAgaWYgKHNvYXBFbnZlbG9wZSAhPSBudWxsKQotICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShYTUxVdGlscy5zZXJpYWxpemUoc29hcEVudmVsb3BlLCB0cnVlKS5nZXRCeXRlcyhERUZBVUxUX1NPQVBfRU5DT0RJTkcpKSkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBIYXNodGFibGUgZ2V0SGVhZGVycygpCi0gIHsKLSAgICBIYXNodGFibGUgaGVhZGVycyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBpZiAoaHR0cFJlc3BvbnNlICE9IG51bGwpCi0gICAgICBoZWFkZXJzLnB1dEFsbChodHRwUmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKLSAgICByZXR1cm4gaGVhZGVyczsKLSAgfQotCi0gIHByaXZhdGUgU29ja2V0IGJ1aWxkU29ja2V0KFVSTCB1cmwpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFNvY2tldCBzID0gbnVsbDsKLSAgICBTdHJpbmcgaG9zdCA9IHVybC5nZXRIb3N0KCk7Ci0gICAgaW50IHBvcnQgPSB1cmwuZ2V0UG9ydCgpOwotICAgIFN0cmluZyBwcm94eUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUF9QUk9YWV9IT1NUKTsKLSAgICBpbnQgcHJveHlQb3J0ID0gSW50ZWdlci5nZXRJbnRlZ2VyKFNZU19QUk9QX0hUVFBfUFJPWFlfUE9SVCwgREVGQVVMVF9IVFRQX1BPUlQpLmludFZhbHVlKCk7Ci0gICAgU3RyaW5nIHByb3h5VXNlck5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUF9QUk9YWV9VU0VSX05BTUUpOwotICAgIFN0cmluZyBwcm94eVBhc3N3b3JkID0gU3lzdGVtLmdldFByb3BlcnR5KFNZU19QUk9QX0hUVFBfUFJPWFlfUEFTU1dPUkQpOwotICAgIGlmICh1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHNJZ25vcmVDYXNlKEhUVFBTKSkKLSAgICB7Ci0gICAgICBwcm94eUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfSFRUUFNfUFJPWFlfSE9TVCk7Ci0gICAgICBwcm94eVBvcnQgPSBJbnRlZ2VyLmdldEludGVnZXIoU1lTX1BST1BfSFRUUFNfUFJPWFlfUE9SVCwgREVGQVVMVF9IVFRQU19QT1JUKS5pbnRWYWx1ZSgpOwotICAgICAgaWYgKHByb3h5SG9zdCAhPSBudWxsICYmIHByb3h5SG9zdC5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE86Ci0gICAgICAgIC8vIFNTTCB3aXRoIHByb3h5IHNlcnZlcgotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBzID0gU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCkuY3JlYXRlU29ja2V0KGhvc3QsIChwb3J0ID4gMCA/IHBvcnQgOiBERUZBVUxUX0hUVFBTX1BPUlQpKTsKLSAgICAgIC8vIFJlbW92aW5nIGRlcGVuZGVuY3kgb24gc29hcC5qYXIKLSAgICAgIC8vICBzID0gU1NMVXRpbHMuYnVpbGRTU0xTb2NrZXQoaG9zdCwgKHBvcnQgPiAwID8gcG9ydCA6IERFRkFVTFRfSFRUUFNfUE9SVCksIHByb3h5SG9zdCwgcHJveHlQb3J0KTsKLSAgICAgIC8vIFRPRE86Ci0gICAgICAvLyBCdWlsZCBhbiBTU0wgc29ja2V0IHRoYXQgc3VwcG9ydHMgcHJveHlVc2VyIGFuZCBwcm94eVBhc3N3b3JkLAotICAgICAgLy8gYXMgZGVtb25zdHJhdGVkIGluIHRoZSBmb2xsb3dpbmcgKG9yaWdpbmFsKSBsaW5lIG9mIGNvZGU6Ci0gICAgICAvLyAgcyA9IFNTTFV0aWxzLmJ1aWxkU1NMU29ja2V0KGhvc3QsIChwb3J0ID4gMCA/IHBvcnQgOiBERUZBVUxUX0hUVFBTX1BPUlQpLCBwcm94eUhvc3QsIHByb3h5UG9ydCwgcHJveHlVc2VyTmFtZSwgcHJveHlQYXNzd29yZCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3h5SG9zdCAhPSBudWxsICYmIHByb3h5SG9zdC5sZW5ndGgoKSA+IDApCi0gICAgICBzID0gbmV3IFNvY2tldChwcm94eUhvc3QsIHByb3h5UG9ydCk7Ci0gICAgZWxzZQotICAgICAgcyA9IG5ldyBTb2NrZXQoaG9zdCwgKHBvcnQgPiAwID8gcG9ydCA6IERFRkFVTFRfSFRUUF9QT1JUKSk7Ci0gICAgcmV0dXJuIHM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC91dGlsL1NvYXBIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3V0aWwvU29hcEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjI1OWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3V0aWwvU29hcEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVVJMVXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYXhpcy5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFNvYXBIZWxwZXIKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzXyA9IG51bGw7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGluaXREZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlcygpCi0gIHsKLSAgICBkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlc18gPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZXNfLnB1dChDb25zdGFudHMuVVJJX1NPQVAxMV9FTlYsQ29uc3RhbnRzLk5TX1BSRUZJWF9TT0FQX0VOVik7Ci0gICAgZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZXNfLnB1dChDb25zdGFudHMuVVJJXzIwMDFfU0NIRU1BX1hTSSxDb25zdGFudHMuTlNfUFJFRklYX1NDSEVNQV9YU0kpOwotICAgIGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzXy5wdXQoQ29uc3RhbnRzLlVSSV8yMDAxX1NDSEVNQV9YU0QsQ29uc3RhbnRzLk5TX1BSRUZJWF9TQ0hFTUFfWFNEKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGFkZERlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzKEhhc2h0YWJsZSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VzKQotICB7Ci0gICAgaWYgKGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzXyA9PSBudWxsKQotICAgICAgaW5pdERlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzKCk7Ci0gICAgRW51bWVyYXRpb24gZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSXMgPSBkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlc18ua2V5cygpOwotICAgIHdoaWxlIChkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlVVJJcy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSA9IChTdHJpbmcpZGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSXMubmV4dEVsZW1lbnQoKTsKLSAgICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZXMucHV0KGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkksKFN0cmluZylkZWZhdWx0U29hcEVudmVsb3BlTmFtZXNwYWNlc18uZ2V0KGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VVUkkpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZVVSSSxTdHJpbmcgbmFtZXNwYWNlUHJlZml4KQotICB7Ci0gICAgaWYgKGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzXyA9PSBudWxsKQotICAgICAgaW5pdERlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzKCk7Ci0gICAgaWYgKGRlZmF1bHRTb2FwRW52ZWxvcGVOYW1lc3BhY2VzXy5nZXQobmFtZXNwYWNlVVJJKSAhPSBudWxsKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRWxlbWVudCBjcmVhdGVTb2FwRW52ZWxvcGVFbGVtZW50KERvY3VtZW50IGRvYyxIYXNodGFibGUgc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUpCi0gIHsKLSAgICBFbGVtZW50IHNvYXBFbnZlbG9wZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgic29hcGVudjpFbnZlbG9wZSIpOwotICAgIEVudW1lcmF0aW9uIGUgPSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5rZXlzKCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgU3RyaW5nQnVmZmVyIHNvYXBFbnZlbG9wZU5hbWVzcGFjZUF0dHIgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4bWxuczoiKTsKLSAgICAgIHNvYXBFbnZlbG9wZU5hbWVzcGFjZUF0dHIuYXBwZW5kKChTdHJpbmcpc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUuZ2V0KHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSkpOwotICAgICAgc29hcEVudmVsb3BlRWxlbWVudC5zZXRBdHRyaWJ1dGUoc29hcEVudmVsb3BlTmFtZXNwYWNlQXR0ci50b1N0cmluZygpLHNvYXBFbnZlbG9wZU5hbWVzcGFjZVVSSSk7ICAgICAgCi0gICAgfSAgICAKLSAgICByZXR1cm4gc29hcEVudmVsb3BlRWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50IGNyZWF0ZVNvYXBCb2R5RWxlbWVudChEb2N1bWVudCBkb2MpCi0gIHsKLSAgICByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQoInNvYXBlbnY6Qm9keSIpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVsZW1lbnQgY3JlYXRlUlBDV3JhcHBlckVsZW1lbnQoRG9jdW1lbnQgZG9jLEhhc2h0YWJsZSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxTdHJpbmcgZW5jb2RpbmdOYW1lc3BhY2VVUkksU3RyaW5nIG9wZXJhdGlvbk5hbWUsIFN0cmluZyBlbmNvZGluZ1N0eWxlKQotICB7Ci0gICAgaW50IG5zSWQgPSAwOwotICAgIFN0cmluZ0J1ZmZlciB3cmFwcGVyRWxlbWVudE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgU3RyaW5nIGVuY29kaW5nTmFtZXNwYWNlUHJlZml4ID0gKFN0cmluZylzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5nZXQoZW5jb2RpbmdOYW1lc3BhY2VVUkkpOwotICAgIGlmIChlbmNvZGluZ05hbWVzcGFjZVByZWZpeCAhPSBudWxsKQotICAgICAgd3JhcHBlckVsZW1lbnROYW1lLmFwcGVuZChlbmNvZGluZ05hbWVzcGFjZVByZWZpeCk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIExvb3AgdW50aWwgd2UgZ2VuZXJhdGUgYSB1bmlxdWUgcHJlZml4LgotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgd3JhcHBlckVsZW1lbnROYW1lLnNldExlbmd0aCgwKTsKLSAgICAgICAgd3JhcHBlckVsZW1lbnROYW1lLmFwcGVuZCgibnMiKS5hcHBlbmQobnNJZCk7Ci0gICAgICAgIGlmICghc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUuY29udGFpbnNWYWx1ZSh3cmFwcGVyRWxlbWVudE5hbWUudG9TdHJpbmcoKSkpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG5zSWQrKzsKLSAgICAgIH0gd2hpbGUgKHRydWUpOwotICAgIH0gICAgCi0gICAgU3RyaW5nIHdyYXBwZXJFbGVtZW50TmFtZVByZWZpeCA9IHdyYXBwZXJFbGVtZW50TmFtZS50b1N0cmluZygpOwotICAgIHdyYXBwZXJFbGVtZW50TmFtZS5hcHBlbmQoJzonKS5hcHBlbmQob3BlcmF0aW9uTmFtZSk7Ci0gICAgRWxlbWVudCB3cmFwcGVyRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KHdyYXBwZXJFbGVtZW50TmFtZS50b1N0cmluZygpKTsKLSAgICBTdHJpbmdCdWZmZXIgbmFtZXNwYWNlQXR0ck5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4bWxuczoiKTsKLSAgICBuYW1lc3BhY2VBdHRyTmFtZS5hcHBlbmQod3JhcHBlckVsZW1lbnROYW1lUHJlZml4KTsKLSAgICB3cmFwcGVyRWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZXNwYWNlQXR0ck5hbWUudG9TdHJpbmcoKSxlbmNvZGluZ05hbWVzcGFjZVVSSSk7Ci0gICAgaWYgKGVuY29kaW5nU3R5bGUgIT0gbnVsbCkKLSAgICAgIHdyYXBwZXJFbGVtZW50LnNldEF0dHJpYnV0ZSgic29hcGVudjplbmNvZGluZ1N0eWxlIixlbmNvZGluZ1N0eWxlKTsKLSAgICByZXR1cm4gd3JhcHBlckVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlbmNvZGVOYW1lc3BhY2VEZWNsYXJhdGlvbihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHNiLmFwcGVuZChwcmVmaXgpOwotICAgIHNiLmFwcGVuZCgiICIpOwotICAgIHNiLmFwcGVuZCh1cmkpOwotICAgIFN0cmluZyByZXN1bHQgPSBVUkxVdGlscy5lbmNvZGUoc2IudG9TdHJpbmcoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gZGVjb2RlTmFtZXNwYWNlRGVjbGFyYXRpb24oU3RyaW5nIHMpCi0gIHsKLSAgICBTdHJpbmcgc0NvcHkgPSBVUkxVdGlscy5kZWNvZGUocyk7Ci0gICAgaW50IGluZGV4ID0gc0NvcHkuaW5kZXhPZigiICIpOwotICAgIFN0cmluZ1tdIG5zRGVjbCA9IG5ldyBTdHJpbmdbMl07Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIG5zRGVjbFswXSA9IHNDb3B5LnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICBuc0RlY2xbMV0gPSBzQ29weS5zdWJzdHJpbmcoaW5kZXgrMSwgc0NvcHkubGVuZ3RoKCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbnNEZWNsWzBdID0gbnVsbDsKLSAgICAgIG5zRGVjbFsxXSA9IHNDb3B5OwotICAgIH0KLSAgICByZXR1cm4gbnNEZWNsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC94c2QvV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC94c2QvV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjQ1MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwveHNkL1dTRExQYXJ0c1RvWFNEVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLio7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LndzZGwuKjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyCi17Ci0gIHByaXZhdGUgZmluYWwgY2hhciBQT1VORCA9ICcjJzsKLSAgcHJpdmF0ZSBWZWN0b3IgeHNkU2NoZW1hTGlzdF87Ci0gIHByaXZhdGUgSGFzaHRhYmxlIHBhcnRUb1hTRENhY2hlXzsKLQotICBwdWJsaWMgV1NETFBhcnRzVG9YU0RUeXBlTWFwcGVyKCkgewotICAgIHhzZFNjaGVtYUxpc3RfID0gbmV3IFZlY3RvcigpOwotICAgIHBhcnRUb1hTRENhY2hlXyA9IG5ldyBIYXNodGFibGUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYXMoVmVjdG9yIHNjaGVtYUxpc3QpIHsKLSAgICBmb3IgKGludCBpPTA7aTxzY2hlbWFMaXN0LnNpemUoKTtpKyspIHsKLSAgICAgIE9iamVjdCBzY2hlbWEgPSBzY2hlbWFMaXN0LmVsZW1lbnRBdChpKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgeHNkU2NoZW1hTGlzdF8uYWRkRWxlbWVudChzY2hlbWEpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBYU0ROYW1lZENvbXBvbmVudCBnZXRYU0RUeXBlKFBhcnQgcGFydCwgU3RyaW5nIGlkKSB7Ci0gICAgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50ID0gZ2V0WFNEVHlwZUZyb21DYWNoZShpZCk7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgcmV0dXJuIGNvbXBvbmVudDsKLSAgICBjb21wb25lbnQgPSBnZXRYU0RUeXBlRnJvbVNjaGVtYShwYXJ0KTsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICBhZGRUb0NhY2hlKGlkLCBjb21wb25lbnQpOwotICAgIHJldHVybiBjb21wb25lbnQ7Ci0gIH0KLQotICBwdWJsaWMgWFNETmFtZWRDb21wb25lbnQgZ2V0WFNEVHlwZUZyb21DYWNoZShTdHJpbmcgaWQpIHsKLSAgICByZXR1cm4gKFhTRE5hbWVkQ29tcG9uZW50KXBhcnRUb1hTRENhY2hlXy5nZXQoaWQpOwotICB9Ci0KLSAgcHVibGljIFhTRE5hbWVkQ29tcG9uZW50IGdldFhTRFR5cGVGcm9tU2NoZW1hKFBhcnQgcGFydCkgewotICAgIGJvb2xlYW4gaXNFbGVtZW50RGVjbGFyYXRpb24gPSAocGFydC5nZXRUeXBlTmFtZSgpID09IG51bGwpOwotICAgIFFOYW1lIHFOYW1lID0gaXNFbGVtZW50RGVjbGFyYXRpb24gPyBwYXJ0LmdldEVsZW1lbnROYW1lKCkgOiBwYXJ0LmdldFR5cGVOYW1lKCk7Ci0gICAgcmV0dXJuIGdldFhTRFR5cGVGcm9tU2NoZW1hKHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxTmFtZS5nZXRMb2NhbFBhcnQoKSwgaXNFbGVtZW50RGVjbGFyYXRpb24pOwotICB9Ci0KLSAgcHVibGljIFhTRE5hbWVkQ29tcG9uZW50IGdldFhTRFR5cGVGcm9tU2NoZW1hKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gaXNFbGVtZW50RGVjbGFyYXRpb24pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHhzZFNjaGVtYUxpc3RfLnNpemUoKTsgaSsrKSB7Ci0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSl4c2RTY2hlbWFMaXN0Xy5lbGVtZW50QXQoaSk7Ci0gICAgICBWZWN0b3IgY29tcG9uZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGlmIChpc0VsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgICAgY29tcG9uZW50cy5hZGRBbGwoeHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGNvbXBvbmVudHMuYWRkQWxsKHhzZFNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICBYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQgID0gKFhTRE5hbWVkQ29tcG9uZW50KWl0Lm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGNvbXBOU1VSSSA9IGNvbXBvbmVudC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIGNvbXBMb2NhbG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoY29tcE5TVVJJICE9IG51bGwgJiYgY29tcExvY2FsbmFtZSAhPSBudWxsICYmIGNvbXBOU1VSSS5lcXVhbHMobmFtZXNwYWNlVVJJKSAmJiBjb21wTG9jYWxuYW1lLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFhTRE5hbWVkQ29tcG9uZW50IHJlc29sdmVYU0ROYW1lZENvbXBvbmVudChYU0ROYW1lZENvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHVyaSA9IGNvbXBvbmVudC5nZXRVUkkoKTsKLSAgICAgIFN0cmluZyBxbmFtZSA9IGNvbXBvbmVudC5nZXRRTmFtZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RTY2hlbWFMaXN0Xy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9IChYU0RTY2hlbWEpeHNkU2NoZW1hTGlzdF8uZWxlbWVudEF0KGkpOwotICAgICAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdGFyZ2V0TlMgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgaWYgKHRhcmdldE5TICE9IG51bGwgJiYgdGFyZ2V0TlMuZXF1YWxzKHRyaW1RTmFtZSh1cmksIHFuYW1lKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNETmFtZWRDb21wb25lbnQgcmVzb2x2ZWRDb21wb25lbnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgICAgICByZXNvbHZlZENvbXBvbmVudCA9IHhzZFNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24ocW5hbWUpOwotICAgICAgICAgICAgZWxzZSBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgICAgICAgICByZXNvbHZlZENvbXBvbmVudCA9IHhzZFNjaGVtYS5yZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKHFuYW1lKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgICAgICAgICAgICByZXNvbHZlZENvbXBvbmVudCA9IHhzZFNjaGVtYS5yZXNvbHZlTW9kZWxHcm91cERlZmluaXRpb24ocW5hbWUpOwotICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50UmVzb2x2YWJsZShyZXNvbHZlZENvbXBvbmVudCkpCi0gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZENvbXBvbmVudDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyB0cmltUU5hbWUoU3RyaW5nIHVyaSwgU3RyaW5nIHFuYW1lKQotICB7Ci0gICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YocW5hbWUpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnMgPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgIGlmIChucy5jaGFyQXQoaW5kZXgtMSkgPT0gUE9VTkQpCi0gICAgICAgIHJldHVybiBucy5zdWJzdHJpbmcoMCwgaW5kZXgtMSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuczsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHVyaTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRUb0NhY2hlKFN0cmluZyBpZCwgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50KSB7Ci0gICAgcGFydFRvWFNEQ2FjaGVfLnB1dChpZCxjb21wb25lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21wb25lbnRSZXNvbHZhYmxlKFhTRENvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpZiAoY29tcG9uZW50ID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IGNvbXBvbmVudC5nZXRTY2hlbWEoKTsKLSAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZEJ1c2luZXNzVG9GYXZvcml0ZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDI5NjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc01vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC50cmFuc2Zvcm1lci5XU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGNsYXNzIEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBBZGRUb0Zhdm9yaXRlc0FjdGlvbgotewotICBwdWJsaWMgQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFdzaWxFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChXc2lsRWxlbWVudCkgc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgT2JqZWN0IG9iaiA9IHNlbGVjdGVkRWxlbWVudC5nZXRBbGxVRERJTGlua3MoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpLmdldE9iamVjdCgpOwotICAgIFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50ID0gKFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50KSBvYmo7Ci0gICAgU3RyaW5nIGJ1c2luZXNzTmFtZSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldE5hbWUoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldFVERElMaW5rSW5xdWlyeUFQSSgpOwotICAgIFN0cmluZyBidXNpbmVzc0tleSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldFVERElMaW5rQnVzaW5lc3NLZXkoKTsKLSAgICBpZiAoYnVzaW5lc3NOYW1lID09IG51bGwpCi0gICAgICBidXNpbmVzc05hbWUgPSBidXNpbmVzc0tleTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19OQU1FLCBidXNpbmVzc05hbWUpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfQlVTSU5FU1NfSU5RVUlSWV9BUEksIGlucXVpcnlBUEkpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfQlVTSU5FU1NfS0VZLCBidXNpbmVzc0tleSk7Ci0gICAgcmV0dXJuIGZhdm9yaXRlRXhpc3RzKHRhYmxlLCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9CVVNJTkVTU19GT0xERVJfTk9ERSk7Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCsxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyYW5zZm9ybWVycywgMCwgdHJhbnNmb3JtZXJzLCAwLCBwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKTsKLSAgICB0cmFuc2Zvcm1lcnNbdHJhbnNmb3JtZXJzLmxlbmd0aC0xXSA9IG5ldyBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfLCBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfTElOS1MsIEFjdGlvbklucHV0cy5WSUVXSUQsIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuVURESV9CVVNJTkVTUyk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFdzaWxFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChXc2lsRWxlbWVudCkgc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgT2JqZWN0IG9iaiA9IHNlbGVjdGVkRWxlbWVudC5nZXRBbGxVRERJTGlua3MoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpLmdldE9iamVjdCgpOwotICAgIFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50ID0gKFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50KSBvYmo7Ci0gICAgU3RyaW5nIGJ1c2luZXNzTmFtZSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldE5hbWUoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldFVERElMaW5rSW5xdWlyeUFQSSgpOwotICAgIFN0cmluZyBidXNpbmVzc0tleSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldFVERElMaW5rQnVzaW5lc3NLZXkoKTsKLSAgICBpZiAoYnVzaW5lc3NOYW1lID09IG51bGwpCi0gICAgICBidXNpbmVzc05hbWUgPSBidXNpbmVzc0tleTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9CVVNJTkVTU19OQU1FLCBidXNpbmVzc05hbWUpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfQlVTSU5FU1NfSU5RVUlSWV9BUEksIGlucXVpcnlBUEkpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfQlVTSU5FU1NfS0VZLCBidXNpbmVzc0tleSk7Ci0gICAgaWYgKGlzTXVsdGlwbGVMaW5rQWN0aW9uKCkgJiYgZmF2b3JpdGVFeGlzdHModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX0ZPTERFUl9OT0RFKSkKLSAgICB7Ci0gICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUyIsIGJ1c2luZXNzTmFtZSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoYWRkVG9GYXZvcml0ZXModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9VRERJX0JVU0lORVNTX0ZPTERFUl9OT0RFKSkKLSAgICB7Ci0gICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMIiwgYnVzaW5lc3NOYW1lKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUyIsIGJ1c2luZXNzTmFtZSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiMzRiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy5SZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC50cmFuc2Zvcm1lci5XU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGNsYXNzIEFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotewotICBwdWJsaWMgQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKzFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoLTFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8sIFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUywgQWN0aW9uSW5wdXRzLlZJRVdJRCwgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5VRERJX0JVU0lORVNTKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBpbnQgdmlld0lEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdJRCkpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IG51bGw7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gbnVsbDsKLSAgICBTdHJpbmcgYnVzaW5lc3NOYW1lID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpCi0gICAgewotICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFVERElMaW5rcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCk7Ci0gICAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCB3c2lsVWRkaUJ1c2luZXNzRWxlbWVudCA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCkgbGUuZ2V0T2JqZWN0KCk7Ci0gICAgICBpbnF1aXJ5VVJMID0gd3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0VURESUxpbmtJbnF1aXJ5QVBJKCk7Ci0gICAgICBidXNpbmVzc0tleSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldFVERElMaW5rQnVzaW5lc3NLZXkoKTsKLSAgICAgIGJ1c2luZXNzTmFtZSA9IHdzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmdldE5hbWUoKTsKLSAgICAgIGlmIChidXNpbmVzc05hbWUgPT0gbnVsbCkKLSAgICAgICAgYnVzaW5lc3NOYW1lID0gYnVzaW5lc3NLZXk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICAvLyByZXR1cm4gZmFsc2UgaWYgdW5hYmxlIHRvIGZpbmQgb3IgY3JlYXRlIGEgcmVnaXN0cnkgbm9kZS9lbGVtZW50IGluIHRoZQotICAgIC8vIFVEREkgcGVyc3BlY3RpdmUKLSAgICBpZiAoIWNyZWF0ZVJlZ2lzdHJ5SW5VRERJUGVyc3BlY3RpdmUoaW5xdWlyeVVSTCwgbnVsbCwgaW5xdWlyeVVSTCkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRSIsIGJ1c2luZXNzTmFtZSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBwcmVwYXJlIHRoZSBhY3Rpb24KLSAgICBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uKGNvbnRyb2xsZXJfKTsKLSAgICAvLyBwb3B1bGF0ZSBwcm9wZXJ0eSB0YWJsZQotICAgIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLCBidXNpbmVzc0tleSk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FLCBidXNpbmVzc05hbWUpOwotICAgIC8vIHJ1biB0aGUgYWN0aW9uCi0gICAgaWYgKCFhY3Rpb24ucnVuKCkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQiLCBidXNpbmVzc05hbWUpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMIiwgYnVzaW5lc3NOYW1lKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmE3NTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnRyYW5zZm9ybWVyLldTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgQWRkVG9GYXZvcml0ZXNBY3Rpb24KLXsKLSAgcHVibGljIEFkZFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGZhdm9yaXRlRXhpc3RzKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFdzaWxFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChXc2lsRWxlbWVudCkgc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgT2JqZWN0IG9iaiA9IHNlbGVjdGVkRWxlbWVudC5nZXRBbGxVRERJU2VydmljZXMoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpLmdldE9iamVjdCgpOwotICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgd3NpbFVkZGlTZXJ2aWNlRWxlbWVudCA9IChXc2lsVWRkaVNlcnZpY2VFbGVtZW50KSBvYmo7Ci0gICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gd3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgU3RyaW5nIGlucXVpcnlBUEkgPSB3c2lsVWRkaVNlcnZpY2VFbGVtZW50LmdldFVERElTZXJ2aWNlSW5xdWlyeUFQSSgpOwotICAgIFN0cmluZyBzZXJ2aWNlS2V5ID0gd3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5nZXRVRERJU2VydmljZUtleSgpOwotICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKQotICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlS2V5OwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfTkFNRSwgc2VydmljZU5hbWUpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9JTlFVSVJZX0FQSSwgaW5xdWlyeUFQSSk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX0tFWSwgc2VydmljZUtleSk7Ci0gICAgcmV0dXJuIGZhdm9yaXRlRXhpc3RzKHRhYmxlLCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKzFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoLTFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8sIFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUywgQWN0aW9uSW5wdXRzLlZJRVdJRCwgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5VRERJX1NFUlZJQ0UpOwotICAgIHJldHVybiB0cmFuc2Zvcm1lcnM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIGludCB2aWV3SUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVklFV0lEKSk7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlEKTsKLSAgICBXc2lsRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpIHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIE9iamVjdCBvYmogPSBzZWxlY3RlZEVsZW1lbnQuZ2V0QWxsVURESVNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKS5nZXRPYmplY3QoKTsKLSAgICBXc2lsVWRkaVNlcnZpY2VFbGVtZW50IHdzaWxVZGRpU2VydmljZUVsZW1lbnQgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCkgb2JqOwotICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IHdzaWxVZGRpU2VydmljZUVsZW1lbnQuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gd3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5nZXRVRERJU2VydmljZUlucXVpcnlBUEkoKTsKLSAgICBTdHJpbmcgc2VydmljZUtleSA9IHdzaWxVZGRpU2VydmljZUVsZW1lbnQuZ2V0VURESVNlcnZpY2VLZXkoKTsKLSAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkKLSAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZUtleTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfVURESV9TRVJWSUNFX05BTUUsIHNlcnZpY2VOYW1lKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9VRERJX1NFUlZJQ0VfSU5RVUlSWV9BUEksIGlucXVpcnlBUEkpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1VERElfU0VSVklDRV9LRVksIHNlcnZpY2VLZXkpOwotICAgIGlmIChpc011bHRpcGxlTGlua0FjdGlvbigpICYmIGZhdm9yaXRlRXhpc3RzKHRhYmxlLCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFKSkKLSAgICB7Ci0gICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUyIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChhZGRUb0Zhdm9yaXRlcyh0YWJsZSwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1VERElfU0VSVklDRV9GT0xERVJfTk9ERSkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTCIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUyIsIHNlcnZpY2VOYW1lKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxZjczZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuVURESUFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotewotICBwdWJsaWMgQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICBJVHJhbnNmb3JtZXJbXSBwYXJlbnRUcmFuc2Zvcm1lcnMgPSBzdXBlci5nZXRUcmFuc2Zvcm1lcnMoKTsKLSAgICBJVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMgPSBuZXcgSVRyYW5zZm9ybWVyW3BhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgrMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRUcmFuc2Zvcm1lcnMsIDAsIHRyYW5zZm9ybWVycywgMCwgcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCk7Ci0gICAgdHJhbnNmb3JtZXJzW3RyYW5zZm9ybWVycy5sZW5ndGgtMV0gPSBuZXcgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcihjb250cm9sbGVyXywgV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX1NFUlZJQ0VTLCBBY3Rpb25JbnB1dHMuVklFV0lELCBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLlVERElfU0VSVklDRSk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgU3RyaW5nIGlucXVpcnlVUkwgPSBudWxsOwotICAgIFN0cmluZyBzZXJ2aWNlS2V5ID0gbnVsbDsKLSAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkKLSAgICB7Ci0gICAgICBMaXN0RWxlbWVudCBsZSA9ICgoV3NpbEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsVURESVNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgd3NpbFVkZGlTZXJ2aWNlRWxlbWVudCA9IChXc2lsVWRkaVNlcnZpY2VFbGVtZW50KSBsZS5nZXRPYmplY3QoKTsKLSAgICAgIGlucXVpcnlVUkwgPSB3c2lsVWRkaVNlcnZpY2VFbGVtZW50LmdldFVERElTZXJ2aWNlSW5xdWlyeUFQSSgpOwotICAgICAgc2VydmljZUtleSA9IHdzaWxVZGRpU2VydmljZUVsZW1lbnQuZ2V0VURESVNlcnZpY2VLZXkoKTsKLSAgICAgIHNlcnZpY2VOYW1lID0gd3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICBpZiAoc2VydmljZU5hbWUgPT0gbnVsbCkKLSAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlS2V5OwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8gcmV0dXJuIGZhbHNlIGlmIHVuYWJsZSB0byBmaW5kIG9yIGNyZWF0ZSBhIHJlZ2lzdHJ5IG5vZGUvZWxlbWVudCBpbiB0aGUKLSAgICAvLyBVRERJIHBlcnNwZWN0aXZlCi0gICAgaWYgKCFjcmVhdGVSZWdpc3RyeUluVURESVBlcnNwZWN0aXZlKGlucXVpcnlVUkwsIG51bGwsIGlucXVpcnlVUkwpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkUiLCBzZXJ2aWNlTmFtZSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBwcmVwYXJlIHRoZSBhY3Rpb24KLSAgICBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgLy8gcG9wdWxhdGUgcHJvcGVydHkgdGFibGUKLSAgICBIYXNodGFibGUgcHJvcGVydHlUYWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZLCBzZXJ2aWNlS2V5KTsKLSAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUsIHNlcnZpY2VOYW1lKTsKLSAgICAvLyBydW4gdGhlIGFjdGlvbgotICAgIGlmICghYWN0aW9uLnJ1bigpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0VSVklDRV9OT1RfRk9VTkQiLCBzZXJ2aWNlTmFtZSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUwiLCBzZXJ2aWNlTmFtZSkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFRvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFRvRmF2b3JpdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDhjM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuRmF2b3JpdGVzRm9sZGVyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFRvRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgTXVsdGlwbGVMaW5rQWN0aW9uIHsKLSAgICBwcm90ZWN0ZWQgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotCi0gICAgcHVibGljIEFkZFRvRmF2b3JpdGVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICAgICAgICBub2RlTWFuYWdlcl8gPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NpbC9hY3Rpb25zL1dzaWxDaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcD8iKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlQWN0aW9uTGluaygpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL2FjdGlvbnMvV3NpbENoZWNrRmF2b3JpdGVFeGlzdHNBY3Rpb25KU1AuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEFkZFRvRmF2b3JpdGVzQWN0aW9uIG5ld0FjdGlvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICBTdHJpbmcgbm9kZUlEID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgIFRvb2wgc2VsZWN0ZWRUb29sID0gbm9kZU1hbmFnZXIuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRCkpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICBpZiAoc2VsZWN0ZWRUb29sIGluc3RhbmNlb2YgTGlzdFdTRExTZXJ2aWNlc1Rvb2wpCi0gICAgICAgIHJldHVybiBuZXcgQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJU2VydmljZXNUb29sKQotICAgICAgICByZXR1cm4gbmV3IEFkZFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJQnVzaW5lc3NUb29sKQotICAgICAgICByZXR1cm4gbmV3IEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBuZXcgQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFkZFRvRmF2b3JpdGVzKEhhc2h0YWJsZSB0YWJsZSwgU3RyaW5nIHJlbCkgewotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIGZhdk5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgVHJlZUVsZW1lbnQgZmF2Um9vdEVsZW1lbnQgPSBmYXZOb2RlTWFuYWdlci5nZXRSb290Tm9kZSgpLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBmYXZSb290RWxlbWVudC5nZXRFbGVtZW50cyhyZWwpOwotICAgICAgICBpZiAoIWUuaGFzTW9yZUVsZW1lbnRzKCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgRmF2b3JpdGVzRm9sZGVyRWxlbWVudCBmYXZGb2xkZXJFbGVtZW50ID0gKEZhdm9yaXRlc0ZvbGRlckVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICByZXR1cm4gZmF2Rm9sZGVyRWxlbWVudC5hZGRGYXZvcml0ZSh0YWJsZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoSGFzaHRhYmxlIHRhYmxlLCBTdHJpbmcgcmVsKSB7Ci0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgZmF2Tm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBUcmVlRWxlbWVudCBmYXZSb290RWxlbWVudCA9IGZhdk5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGZhdlJvb3RFbGVtZW50LmdldEVsZW1lbnRzKHJlbCk7Ci0gICAgICAgIGlmICghZS5oYXNNb3JlRWxlbWVudHMoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBGYXZvcml0ZXNGb2xkZXJFbGVtZW50IGZhdkZvbGRlckVsZW1lbnQgPSAoRmF2b3JpdGVzRm9sZGVyRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIHJldHVybiBmYXZGb2xkZXJFbGVtZW50LmZhdm9yaXRlRXhpc3RzKHRhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU3MjI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuT3BlblJlZ2lzdHJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy5VRERJQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC5SZWdpc3RyeUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuUmVnaXN0cnlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlVERElNYWluTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiBleHRlbmRzIE11bHRpcGxlTGlua0FjdGlvbgotewotICBwdWJsaWMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGludCB0b29sSUQsIGludCB2aWV3SUQsIGludCB2aWV3VG9vbElEKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2lsL2FjdGlvbnMvV3NpbEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcD8iKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHRvb2xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmFzZUFjdGlvbkxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsL2FjdGlvbnMvV3NpbEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEFjdGlvbiBuZXdBY3Rpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIFN0cmluZyBub2RlSUQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBUb29sIHNlbGVjdGVkVG9vbCA9IG5vZGVNYW5hZ2VyLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQpKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkKLSAgICAgIHJldHVybiBuZXcgQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJQnVzaW5lc3NUb29sKQotICAgICAgcmV0dXJuIG5ldyBBZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgTnVsbEFjdGlvbigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY3JlYXRlUmVnaXN0cnlJblVERElQZXJzcGVjdGl2ZShTdHJpbmcgaW5xdWlyeUFQSSwgU3RyaW5nIHB1Ymxpc2hBUEksIFN0cmluZyByZWdpc3RyeU5hbWUpCi0gIHsKLSAgICBWZWN0b3IgcmVnaXN0cnlOb2RlcyA9IGdldFJlZ2lzdHJ5Tm9kZXNCeUlucXVpcnlVUkwoaW5xdWlyeUFQSSk7Ci0gICAgaWYgKHJlZ2lzdHJ5Tm9kZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBBbHdheXMgYXR0ZW1wdCB0byB1c2UgYW4gZXhpc3RpbmcgcmVnaXN0cnkuCi0gICAgICBOb2RlIHJlZ2lzdHJ5Tm9kZSA9IChOb2RlKSByZWdpc3RyeU5vZGVzLmVsZW1lbnRBdCgwKTsKLSAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gcmVnaXN0cnlOb2RlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICBub2RlTWFuYWdlci5zZXRTZWxlY3RlZE5vZGVJZChyZWdpc3RyeU5vZGUuZ2V0Tm9kZUlkKCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIC8vIG9wZW4gdGhlIHJlZ2lzdHJ5IGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9wZW5lZCBpbiB0aGUgVURESSBwZXJzcGVjdGl2ZQotICAgIE9wZW5SZWdpc3RyeUFjdGlvbiBvcGVuUmVnQWN0aW9uID0gbmV3IE9wZW5SZWdpc3RyeUFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgLy8gcG9wdWxhdGUgdGhlIHByb3BlcnR5IHRhYmxlCi0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuUmVnQWN0aW9uLmdldFByb3BlcnR5VGFibGUoKTsKLSAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nKHJlZ2lzdHJ5TmFtZSkpCi0gICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUsIHJlZ2lzdHJ5TmFtZSk7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwoaW5xdWlyeUFQSSkpCi0gICAgICBwcm9wZXJ0eVRhYmxlLnB1dChVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMLCBpbnF1aXJ5QVBJKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8gcnVuIHRoZSBhY3Rpb24KLSAgICBpZiAoIW9wZW5SZWdBY3Rpb24ucnVuKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgVmVjdG9yIGdldFJlZ2lzdHJ5Tm9kZXNCeUlucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgICBWZWN0b3IgcmVnaXN0cnlOb2RlcyA9IG51bGw7Ci0gICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IGNvbnRyb2xsZXJfLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSkgKG5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKSk7Ci0gICAgVmVjdG9yIGNoaWxkTm9kZXMgPSB1ZGRpTWFpbk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIGNoaWxkTm9kZSA9IChOb2RlKSBjaGlsZE5vZGVzLmVsZW1lbnRBdChpKTsKLSAgICAgIGlmIChjaGlsZE5vZGUgaW5zdGFuY2VvZiBSZWdpc3RyeU5vZGUpCi0gICAgICB7Ci0gICAgICAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudCkgY2hpbGROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgIGlmIChyZWdFbGVtZW50LmdldElucXVpcnlVUkwoKS5lcXVhbHMoaW5xdWlyeVVSTCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocmVnaXN0cnlOb2RlcyA9PSBudWxsKQotICAgICAgICAgICAgcmVnaXN0cnlOb2RlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICByZWdpc3RyeU5vZGVzLmFkZEVsZW1lbnQoY2hpbGROb2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVnaXN0cnlOb2RlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9BZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhMGEwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy5GYXZvcml0ZXNNb2RlbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uIGV4dGVuZHMgQWRkVG9GYXZvcml0ZXNBY3Rpb24KLXsKLSAgcHVibGljIEFkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBmYXZvcml0ZUV4aXN0cygpCi0gIHsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IGdldFdzZGxVcmwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfV1NETF9VUkwsIHdzZGxVUkwpOwotICAgIHJldHVybiBmYXZvcml0ZUV4aXN0cyh0YWJsZSwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTRExfU0VSVklDRV9GT0xERVJfTk9ERSk7Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCsxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyYW5zZm9ybWVycywgMCwgdHJhbnNmb3JtZXJzLCAwLCBwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKTsKLSAgICB0cmFuc2Zvcm1lcnNbdHJhbnNmb3JtZXJzLmxlbmd0aC0xXSA9IG5ldyBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfLCBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMsIEFjdGlvbklucHV0cy5WSUVXSUQsIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuV1NETF9TRVJWSUNFKTsKLSAgICByZXR1cm4gdHJhbnNmb3JtZXJzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIFN0cmluZyB3c2RsVVJMID0gZ2V0V3NkbFVybCgpOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICB0YWJsZS5wdXQoRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUFJPUF9XU0RMX1VSTCwgd3NkbFVSTCk7Ci0gICAgaWYgKGlzTXVsdGlwbGVMaW5rQWN0aW9uKCkgJiYgZmF2b3JpdGVFeGlzdHModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTIiwgd3NkbFVSTCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoYWRkVG9GYXZvcml0ZXModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUwiLCB3c2RsVVJMKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUyIsIHdzZGxVUkwpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRXc2RsVXJsKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV3NpbEVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gKFdzaWxFbGVtZW50KSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBXc2lsV3NkbFNlcnZpY2VFbGVtZW50IHdzaWxXc2RsU2VydmljZUVsZW1lbnQ7Ci0gICAgT2JqZWN0IG9iaiA9IHNlbGVjdGVkRWxlbWVudC5nZXRBbGxXU0RMU2VydmljZXMoKS5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpLmdldE9iamVjdCgpOwotICAgIHdzaWxXc2RsU2VydmljZUVsZW1lbnQgPSAoV3NpbFdzZGxTZXJ2aWNlRWxlbWVudCkgb2JqOwotICAgIHJldHVybiB3c2lsV3NkbFNlcnZpY2VFbGVtZW50LmdldFdTRExTZXJ2aWNlVVJMKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0FkZFdTSUxUb0Zhdm9yaXRlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjYyMmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuRmF2b3JpdGVzTW9kZWxDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRXU0lMVG9GYXZvcml0ZXNBY3Rpb24gZXh0ZW5kcyBBZGRUb0Zhdm9yaXRlc0FjdGlvbgotewotICBwdWJsaWMgQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZmF2b3JpdGVFeGlzdHMoKQotICB7Ci0gICAgU3RyaW5nIHdzaWxVUkwgPSBnZXRXc2lsVXJsKCk7Ci0gICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHRhYmxlLnB1dChGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5QUk9QX1dTSUxfVVJMLCB3c2lsVVJMKTsKLSAgICByZXR1cm4gZmF2b3JpdGVFeGlzdHModGFibGUsIEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0lMX0ZPTERFUl9OT0RFKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBTdHJpbmcgd3NpbFVSTCA9IGdldFdzaWxVcmwoKTsKLSAgICBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgdGFibGUucHV0KEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlBST1BfV1NJTF9VUkwsIHdzaWxVUkwpOwotICAgIGlmIChpc011bHRpcGxlTGlua0FjdGlvbigpICYmIGZhdm9yaXRlRXhpc3RzKHRhYmxlLCBGYXZvcml0ZXNNb2RlbENvbnN0YW50cy5SRUxfV1NJTF9GT0xERVJfTk9ERSkpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFMiLCB3c2lsVVJMKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChhZGRUb0Zhdm9yaXRlcyh0YWJsZSwgRmF2b3JpdGVzTW9kZWxDb25zdGFudHMuUkVMX1dTSUxfRk9MREVSX05PREUpKQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUwiLCB3c2lsVVJMKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUyIsIHdzaWxVUkwpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRXc2lsVXJsKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFdzaWxFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChXc2lsRWxlbWVudCkgc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudC5nZXRXc2lsVXJsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL0NsZWFyV1NJTEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjE1MDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5DbGVhck5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgQ2xlYXJXU0lMQWN0aW9uIGV4dGVuZHMgQ2xlYXJOb2RlQWN0aW9uIHsKLQotICAgIHB1YmxpYyBDbGVhcldTSUxBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlciwgY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5OT0RFSUQsIFN0cmluZy52YWx1ZU9mKGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGVJZCgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlEKQotICAgIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGFjdGlvbkxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uSlNQLmpzcD8iKTsKLSAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKG5vZGVJRCk7Ci0gICAgICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUcmVlQ29udGVudFZhcigpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsTmF2aWdhdG9yQ29udGVudCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUcmVlQ29udGVudFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC93c2lsX25hdmlnYXRvcl9jb250ZW50LmpzcCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkgewotICAgICAgICByZXR1cm4gIndzaWxQcm9wZXJ0aWVzQ29udGFpbmVyIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkgewotICAgICAgICByZXR1cm4gIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsU3RhdHVzQ29udGVudCI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTYzYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotCi1wdWJsaWMgY2xhc3MgSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmXzsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NkbEZpbGVOYW1lXzsKLSAgcHJpdmF0ZSBOb2RlTWFuYWdlciBub2RlTWFuYWdlcl87Ci0KLSAgcHVibGljIEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgbm9kZU1hbmFnZXJfID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlkLCBpbnQgdG9vbElkLCBpbnQgdmlld0lkLCBpbnQgdmlld1Rvb2xJZCkKLSAgewotICAgIHJldHVybiBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsIHRvb2xJZCwgdmlld0lkLCB2aWV3VG9vbElkLCAid3NpbC9hY3Rpb25zL0ltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB3cml0ZShPdXRwdXRTdHJlYW0gb3MpCi0gIHsKLSAgICBpZiAoZGVmXyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB3cml0ZVdTRExEZWZpbml0aW9uKG9zLCBkZWZfKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRGaWxlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbEZpbGVOYW1lXzsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBnZXRXU0RMRnJvbVVSTCgpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLlZJRVdJRCkpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXJfLmdldE5vZGUobm9kZUlEKTsKLSAgICBXc2lsRWxlbWVudCB3c2lsRWxlbWVudCA9IChXc2lsRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBMaXN0TWFuYWdlciB3c2lsU2VydmljZXMgPSB3c2lsRWxlbWVudC5nZXRBbGxXU0RMU2VydmljZXMoKTsKLSAgICBMaXN0RWxlbWVudCBsZSA9IHdzaWxTZXJ2aWNlcy5nZXRFbGVtZW50V2l0aFZpZXdJZCh2aWV3SUQpOwotICAgIFdzaWxXc2RsU2VydmljZUVsZW1lbnQgc2VydmljZSA9IChXc2lsV3NkbFNlcnZpY2VFbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgIFN0cmluZyB3c2RsVVJMID0gc2VydmljZS5nZXRXU0RMU2VydmljZVVSTCgpOwotICAgIHdzZGxGaWxlTmFtZV8gPSBXU0RMRmlsZU5hbWVIZWxwZXIuZ2V0V1NETEZpbGVOYW1lKHdzZGxVUkwpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZl8gPSAobmV3IFVkZGk0akhlbHBlcigpKS5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZ2V0V1NETEZyb21VRERJUmVnaXN0cnkoKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIGludCB2aWV3SUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgTGlzdE1hbmFnZXIgd3NpbFNlcnZpY2VzID0gd3NpbEVsZW1lbnQuZ2V0QWxsVURESVNlcnZpY2VzKCk7Ci0gICAgTGlzdEVsZW1lbnQgbGUgPSB3c2lsU2VydmljZXMuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICBXc2lsVWRkaVNlcnZpY2VFbGVtZW50IHNlcnZpY2UgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgd3NkbEZpbGVOYW1lXyA9IHNlcnZpY2UuZ2V0TmFtZSgpICsgIi53c2RsIjsKLSAgICBVZGRpNGpIZWxwZXIgdWRkaTRqSGVscGVyID0gbmV3IFVkZGk0akhlbHBlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVERElQcm94eSBwcm94eSA9IG51bGw7Ci0gICAgICBTdHJpbmcgaW5xdWlyeVVSTCA9IHNlcnZpY2UuZ2V0VURESVNlcnZpY2VJbnF1aXJ5QVBJKCk7Ci0gICAgICBpZiAoaW5xdWlyeVVSTCAhPSBudWxsKQotICAgICAgewotICAgICAgICBwcm94eSA9IG5ldyBVRERJUHJveHkoKTsKLSAgICAgICAgcHJveHkuc2V0SW5xdWlyeVVSTChpbnF1aXJ5VVJMKTsKLSAgICAgIH0KLSAgICAgIGRlZl8gPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24odWRkaTRqSGVscGVyLmdldFdTREwoc2VydmljZS5nZXRTZXJ2aWNlRGVmaW5pdGlvbigpLCBwcm94eSkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gdGhlIHdzZGwgcmVwcmVzZW50aW5nIHRoaXMgc2VydmljZSBpcyB1bnJlYWNoYWJsZSB0aHJvdWdoIHRoZSBVRERJCi0gICAgICAvLyByZWdpc3RyeS4gV2Ugd2lsbCB0cnkgdXNpbmcgdGhlIGRpc2NvdmVyeSBVUkwgaW5zdGVhZC4KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWZfID0gdWRkaTRqSGVscGVyLmdldFdTRExEZWZpbml0aW9uKHNlcnZpY2UuZ2V0VURESVNlcnZpY2VEaXNjb3ZlcnlVUkwoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMikKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIC8vIGlmIHRoZSBkaXNjb3ZlcnlVUkwgYWxzbyBmYWlscywgcmV0dXJuIGFuIGVycm9yCi0gICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZShlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVG9vbCBzZWxlY3RlZFRvb2wgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICBpZiAoc2VsZWN0ZWRUb29sIGluc3RhbmNlb2YgTGlzdFdTRExTZXJ2aWNlc1Rvb2wpCi0gICAgICByZXR1cm4gZ2V0V1NETEZyb21VUkwoKTsKLSAgICBlbHNlIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkKLSAgICAgIHJldHVybiBnZXRXU0RMRnJvbVVERElSZWdpc3RyeSgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvSW1wb3J0V1NJTFRvRmlsZVN5c3RlbUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWQwYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgSW1wb3J0V1NJTFRvRmlsZVN5c3RlbUFjdGlvbiBleHRlbmRzIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBXU0lMRG9jdW1lbnQgd3NpbERvY187Ci0gICAgcHJpdmF0ZSBXc2lsRWxlbWVudCB3c2lsRWxlbWVudF87Ci0gICAgcHJpdmF0ZSBOb2RlTWFuYWdlciBub2RlTWFuYWdlcl87Ci0KLSAgICBwdWJsaWMgSW1wb3J0V1NJTFRvRmlsZVN5c3RlbUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgICAgIG5vZGVNYW5hZ2VyXyA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsaW50IHRvb2xJZCxpbnQgdmlld0lkLGludCB2aWV3VG9vbElkKQotICAgIHsKLSAgICAgIHJldHVybiBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLCJ3c2lsL2FjdGlvbnMvSW1wb3J0V1NJTFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZShPdXRwdXRTdHJlYW0gb3MpIHsKLSAgICAgICAgaWYgKHdzaWxEb2NfICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB3cml0ZVdTSUxEb2N1bWVudChvcywgd3NpbERvY18pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyB3c2lsRmlsZU5hbWUgPSB3c2lsRWxlbWVudF8uZ2V0V3NpbFVybCgpOwotICAgICAgICByZXR1cm4gd3NpbEZpbGVOYW1lLnN1YnN0cmluZyh3c2lsRmlsZU5hbWUubGFzdEluZGV4T2YoJy8nKSArIDEsIHdzaWxGaWxlTmFtZS5sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcnVuKCkgewotICAgICAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0KLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgICAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KSB7Ci0gICAgICAgICAgICB3c2lsRWxlbWVudF8gPSAoV3NpbEVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgICAgICAgICAgd3NpbERvY18gPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0V1NJTERvY3VtZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRQYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFBhZ2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL011bHRpcGxlTGlua0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9NdWx0aXBsZUxpbmtBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiODljNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL011bHRpcGxlTGlua0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aXBsZUxpbmtBY3Rpb24gZXh0ZW5kcyBMaW5rQWN0aW9uCi17Ci0gIHB1YmxpYyBNdWx0aXBsZUxpbmtBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzTGlua1BhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgaXNNdWx0aXBsZUxpbmtBY3Rpb24gPSByZXF1ZXN0LmdldFBhcmFtZXRlcihXc2lsQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OKTsKLSAgICBpZiAoaXNNdWx0aXBsZUxpbmtBY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV3NpbEFjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiwgaXNNdWx0aXBsZUxpbmtBY3Rpb24pOwotICAgICAgcmV0dXJuIHByb2Nlc3NNdWx0aXBsZUxpbmtBY3Rpb25QYXJhbWV0ZXJzKHJlcXVlc3QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucmVtb3ZlKFdzaWxBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04pOwotICAgICAgU3RyaW5nIG5vZGVJRFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgU3RyaW5nIHRvb2xJRFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgICAgU3RyaW5nIHZpZXdJRFN0cmluZyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgICAgU3RyaW5nIHZpZXdUb29sSURTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuVklFV1RPT0xJRCk7Ci0gICAgICBpZiAobm9kZUlEU3RyaW5nICE9IG51bGwpCi0gICAgICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBub2RlSURTdHJpbmcpOwotICAgICAgaWYgKHRvb2xJRFN0cmluZyAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlRPT0xJRCwgdG9vbElEU3RyaW5nKTsKLSAgICAgIGlmICh2aWV3SURTdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsIHZpZXdJRFN0cmluZyk7Ci0gICAgICBpZiAodmlld1Rvb2xJRFN0cmluZyAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQsIHZpZXdUb29sSURTdHJpbmcpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc011bHRpcGxlTGlua0FjdGlvblBhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICBTdHJpbmcgbm9kZUlEID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgU3RyaW5nW10gdmlld0lEcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBub2RlSUQpOwotICAgIHByb3BlcnR5VGFibGVfLnB1dChBY3Rpb25JbnB1dHMuVklFV0lELCB2aWV3SURzKTsKLSAgICBpZiAodmlld0lEcy5sZW5ndGggPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNdWx0aXBsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIHByb3BlcnR5VGFibGVfLmNvbnRhaW5zS2V5KFdzaWxBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Vmlld0lkcygpCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgIGVsc2UgaWYgKG9iamVjdC5nZXRDbGFzcygpLmlzQXJyYXkoKSkKLSAgICAgIHJldHVybiAoU3RyaW5nW10pb2JqZWN0OwotICAgIGVsc2UKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyhTdHJpbmcpb2JqZWN0fTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gKGlzTXVsdGlwbGVMaW5rQWN0aW9uKCkpID8gZXhlY3V0ZU11bHRpcGxlTGlua0FjdGlvbigpIDogZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVNdWx0aXBsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBTdHJpbmdbXSB2aWV3SWRzID0gZ2V0Vmlld0lkcygpOwotICAgIGlmICh2aWV3SWRzICE9IG51bGwgJiYgdmlld0lkcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlld0lkcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KEFjdGlvbklucHV0cy5WSUVXSUQsIHZpZXdJZHNbaV0pOwotICAgICAgICBpZiAoZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKSkKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoQWN0aW9uSW5wdXRzLlZJRVdJRCwgdmlld0lkcyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL051bGxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvTnVsbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTQ3MTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvTnVsbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5BY3Rpb247Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGNsYXNzIE51bGxBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHVibGljIE51bGxBY3Rpb24oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBwb3B1bGF0ZVByb3BlcnR5VGFibGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9PcGVuV1NJTEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9PcGVuV1NJTEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2UyNjU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvT3BlbldTSUxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkZvcm1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLldzaWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLmRpc2NvdmVyeS5XZWJTZXJ2aWNlc1BhcnNlckV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIE9wZW5XU0lMQWN0aW9uIGV4dGVuZHMgRm9ybUFjdGlvbgotewotCi0gIHB1YmxpYyBPcGVuV1NJTEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgd3NpbFVSTCA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV3NpbEFjdGlvbklucHV0cy5XU0lMX1VSTCk7Ci0gICAgU3RyaW5nIGluc3BlY3Rpb25UeXBlID0gcGFyc2VyLmdldFBhcmFtZXRlcihXc2lsQWN0aW9uSW5wdXRzLldTSUxfSU5TUEVDVElPTl9UWVBFKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICBGb3JtVG9vbCBmb3JtVG9vbCA9IGdldFNlbGVjdGVkRm9ybVRvb2woKTsKLSAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV3NpbEFjdGlvbklucHV0cy5XU0lMX1VSTCwgd3NpbFVSTCk7Ci0gICAgaWYgKGluc3BlY3Rpb25UeXBlICE9IG51bGwgJiYgaW5zcGVjdGlvblR5cGUubGVuZ3RoKCkgPiAwKQotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9JTlNQRUNUSU9OX1RZUEUsIGluc3BlY3Rpb25UeXBlKTsKLSAgICBmb3JtVG9vbC51cGRhdGVQcm9wZXJ0eVRhYmxlKHByb3BlcnR5VGFibGVfKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBGb3JtVG9vbCBnZXRTZWxlY3RlZEZvcm1Ub29sKCkKLSAgewotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICByZXR1cm4gKEZvcm1Ub29sKXdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nIHdzaWxVUkwgPSAoU3RyaW5nKXByb3BlcnR5VGFibGVfLmdldChXc2lsQWN0aW9uSW5wdXRzLldTSUxfVVJMKTsKLSAgICBpbnQgaW5zcGVjdGlvblR5cGUgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9JTlNQRUNUSU9OX1RZUEUpKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1zZ1F1ZXVlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSByb290Tm9kZSA9IG5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgcm9vdCA9IHJvb3ROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSBnZXRPcGVuZWRXU0lMKHJvb3QsIHdzaWxVUkwpOwotICAgIGlmICh3c2lsRWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIFdlYlNlcnZpY2VzUGFyc2VyRXh0IHBhcnNlciA9IG5ldyBXZWJTZXJ2aWNlc1BhcnNlckV4dCh3c2lsVVJMKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBwYXJzZXIucGFyc2UoV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfTk9ORSk7Ci0gICAgICAgIFdlYlNlcnZpY2VFbnRpdHkgd3NFbnRpdHkgPSBwYXJzZXIuZ2V0V2ViU2VydmljZUVudGl0eUJ5VVJJKHdzaWxVUkwpOwotICAgICAgICBpbnQgdHlwZSA9IHdzRW50aXR5LmdldFR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUgPT0gV2ViU2VydmljZUVudGl0eS5UWVBFX0hUTUwpCi0gICAgICAgICAgcmV0dXJuIG9wZW5IVE1MKHdzRW50aXR5LmdldENoaWxkcmVuKCksIGluc3BlY3Rpb25UeXBlKTsKLSAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBXZWJTZXJ2aWNlRW50aXR5LlRZUEVfV1NJTCkKLSAgICAgICAgICByZXR1cm4gb3BlbldTSUwod3NpbFVSTCwgcGFyc2VyLmdldFdTSUxEb2N1bWVudCh3c2lsVVJMKSwgaW5zcGVjdGlvblR5cGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbXNnUXVldWUuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9VUkwiLCB3c2lsVVJMKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UodC5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJlc2VsZWN0V1NJTE5vZGUobm9kZU1hbmFnZXIsIHJvb3ROb2RlLmdldENoaWxkTm9kZSh3c2lsRWxlbWVudCkuZ2V0Tm9kZUlkKCksIGluc3BlY3Rpb25UeXBlKTsKLSAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEIiwgd3NpbFVSTCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIG9wZW5IVE1MKExpc3Qgd3NpbHMsIGludCBpbnNwZWN0aW9uVHlwZSkKLSAgewotICAgIGludCBub2RlSWQgPSAtMTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1zZ1F1ZXVlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSByb290Tm9kZSA9IG5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgcm9vdCA9IHJvb3ROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHdzaWxzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgV2ViU2VydmljZUVudGl0eSB3c2lsRW50aXR5ID0gKFdlYlNlcnZpY2VFbnRpdHkpaXQubmV4dCgpOwotICAgICAgU3RyaW5nIHdzaWxVUkwgPSB3c2lsRW50aXR5LmdldFVSSSgpOwotICAgICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSBnZXRPcGVuZWRXU0lMKHJvb3QsIHdzaWxVUkwpOwotICAgICAgaWYgKHdzaWxFbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgV1NJTERvY3VtZW50IHdzaWxEb2MgPSBXU0lMRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICB3c2lsRG9jLnJlYWQod3NpbFVSTCk7Ci0gICAgICAgICAgd3NpbEVsZW1lbnQgPSBuZXcgV3NpbEVsZW1lbnQod3NpbFVSTCwgcm9vdC5nZXRNb2RlbCgpLCB3c2lsRG9jLCB3c2lsVVJMKTsKLSAgICAgICAgICByb290LmNvbm5lY3Qod3NpbEVsZW1lbnQsIFdzaWxNb2RlbENvbnN0YW50cy5SRUxfV1NJTCwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICAgICAgICBub2RlSWQgPSByb290Tm9kZS5nZXRDaGlsZE5vZGUod3NpbEVsZW1lbnQpLmdldE5vZGVJZCgpOwotICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX09QRU5fV1NJTF9TVUNDRVNTRlVMIiwgd3NpbFVSTCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2UodC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1zZ1F1ZXVlLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEIiwgd3NpbFVSTCkpOwotICAgICAgICBub2RlSWQgPSByb290Tm9kZS5nZXRDaGlsZE5vZGUod3NpbEVsZW1lbnQpLmdldE5vZGVJZCgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobm9kZUlkICE9IC0xKQotICAgIHsKLSAgICAgIHByZXNlbGVjdFdTSUxOb2RlKG5vZGVNYW5hZ2VyLCBub2RlSWQsIGluc3BlY3Rpb25UeXBlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gb3BlbldTSUwoU3RyaW5nIHdzaWxVUkwsIFdTSUxEb2N1bWVudCB3c2lsRG9jLCBpbnQgaW5zcGVjdGlvblR5cGUpCi0gIHsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTWVzc2FnZVF1ZXVlIG1zZ1F1ZXVlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSByb290Tm9kZSA9IG5vZGVNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgcm9vdCA9IHJvb3ROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSBuZXcgV3NpbEVsZW1lbnQod3NpbFVSTCwgcm9vdC5nZXRNb2RlbCgpLCB3c2lsRG9jLCB3c2lsVVJMKTsKLSAgICByb290LmNvbm5lY3Qod3NpbEVsZW1lbnQsIFdzaWxNb2RlbENvbnN0YW50cy5SRUxfV1NJTCwgTW9kZWxDb25zdGFudHMuUkVMX09XTkVSKTsKLSAgICBpbnQgbm9kZUlkID0gcm9vdE5vZGUuZ2V0Q2hpbGROb2RlKHdzaWxFbGVtZW50KS5nZXROb2RlSWQoKTsKLSAgICBtc2dRdWV1ZS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19PUEVOX1dTSUxfU1VDQ0VTU0ZVTCIsIHdzaWxVUkwpKTsKLSAgICBwcmVzZWxlY3RXU0lMTm9kZShub2RlTWFuYWdlciwgbm9kZUlkLCBpbnNwZWN0aW9uVHlwZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJlc2VsZWN0V1NJTE5vZGUoTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIsIGludCBub2RlSWQsIGludCBpbnNwZWN0aW9uVHlwZSkKLSAgewotICAgIG5vZGVNYW5hZ2VyLnNldFNlbGVjdGVkTm9kZUlkKG5vZGVJZCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJZCk7Ci0gICAgc2VsZWN0ZWROb2RlLnNldFZpZXdJZChBY3Rpb25JbnB1dHMuVklFV1RPT0xJRF9ERUZBVUxUKTsKLSAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgIHRvb2xNYW5hZ2VyLnNldFNlbGVjdGVkVG9vbElkKGluc3BlY3Rpb25UeXBlKTsKLSAgICBhZGRUb0hpc3RvcnkoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUwsIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLCBpbnNwZWN0aW9uVHlwZSwgQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxULCBBY3Rpb25JbnB1dHMuVklFV1RPT0xJRF9ERUZBVUxULCB0cnVlKSk7ICAgICAgICAKLSAgfQotCi0gIHByaXZhdGUgV3NpbEVsZW1lbnQgZ2V0T3BlbmVkV1NJTChUcmVlRWxlbWVudCByb290LCBTdHJpbmcgd3NpbFVSTCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSByb290LmdldEVsZW1lbnRzKFdzaWxNb2RlbENvbnN0YW50cy5SRUxfV1NJTCk7Ci0gICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgaWYgKHdzaWxFbGVtZW50LmdldFdzaWxVcmwoKS5lcXVhbHMod3NpbFVSTCkpCi0gICAgICAgIHJldHVybiB3c2lsRWxlbWVudDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvT3BlbldTSUxMaW5rQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL09wZW5XU0lMTGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzlmZTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvT3BlbldTSUxMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC50cmFuc2Zvcm1lci5XU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGNsYXNzIE9wZW5XU0lMTGlua0FjdGlvbiBleHRlbmRzIE11bHRpcGxlTGlua0FjdGlvbgotewotICBwdWJsaWMgT3BlbldTSUxMaW5rQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NpbC9hY3Rpb25zL09wZW5XU0lMTGlua0FjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlZJRVdUT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld1Rvb2xJRCk7Ci0gICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhc2VBY3Rpb25MaW5rKCkKLSAgewotICAgIHJldHVybiAid3NpbC9hY3Rpb25zL09wZW5XU0lMTGlua0FjdGlvbkpTUC5qc3AiOwotICB9Ci0KLSAgcHVibGljIElUcmFuc2Zvcm1lcltdIGdldFRyYW5zZm9ybWVycygpCi0gIHsKLSAgICBJVHJhbnNmb3JtZXJbXSBwYXJlbnRUcmFuc2Zvcm1lcnMgPSBzdXBlci5nZXRUcmFuc2Zvcm1lcnMoKTsKLSAgICBJVHJhbnNmb3JtZXJbXSB0cmFuc2Zvcm1lcnMgPSBuZXcgSVRyYW5zZm9ybWVyW3BhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgrMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShwYXJlbnRUcmFuc2Zvcm1lcnMsIDAsIHRyYW5zZm9ybWVycywgMCwgcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCk7Ci0gICAgdHJhbnNmb3JtZXJzW3RyYW5zZm9ybWVycy5sZW5ndGgtMV0gPSBuZXcgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcihjb250cm9sbGVyXywgV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9XU0lMX0xJTktTLCBBY3Rpb25JbnB1dHMuVklFV0lELCBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLldTSUxfTElOSyk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5WSUVXSUQpKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldE5vZGUobm9kZUlEKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBpZiAoIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFdTSUxMaW5rcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCk7Ci0gICAgV3NpbFdzaWxMaW5rRWxlbWVudCBsaW5rID0gKFdzaWxXc2lsTGlua0VsZW1lbnQpIGxlLmdldE9iamVjdCgpOwotICAgIFN0cmluZyB3c2lsVVJMID0gbGluay5nZXRXU0lMTGlua0xvY2F0aW9uKCk7Ci0gICAgLy8gcG9wdWxhdGUgYW5kIHJ1biB0aGUgT3BlbldTSUxBY3Rpb24KLSAgICBPcGVuV1NJTEFjdGlvbiBhY3Rpb24gPSBuZXcgT3BlbldTSUxBY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgdGFibGUucHV0KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9VUkwsIHdzaWxVUkwpOwotICAgIHRhYmxlLnB1dChXc2lsQWN0aW9uSW5wdXRzLldTSUxfSU5TUEVDVElPTl9UWVBFLCBTdHJpbmcudmFsdWVPZihXc2lsQWN0aW9uSW5wdXRzLldTSUxfREVUQUlMUykpOwotICAgIHJldHVybiBhY3Rpb24ucnVuKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvUmVmcmVzaEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmVlMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZnJlc2hBY3Rpb24gZXh0ZW5kcyBNdWx0aXBsZUxpbmtBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyXzsKLQotICBwdWJsaWMgUmVmcmVzaEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICBub2RlTWFuYWdlcl8gPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEFjdGlvbiBuZXdBY3Rpb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpOwotICAgIFN0cmluZyBub2RlSURTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgICBTdHJpbmcgdmlld0lEU3RyaW5nID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlZJRVdJRCk7Ci0gICAgaW50IG5vZGVJRDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRFN0cmluZyk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgIHsKLSAgICAgIG5vZGVJRCA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZUlkKCk7Ci0gICAgfQotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUobm9kZUlEKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlID09IG51bGwgfHwgIShzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBXc2lsTm9kZSkpCi0gICAgICByZXR1cm4gbmV3IE51bGxBY3Rpb24oKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgVG9vbCBzZWxlY3RlZFRvb2wgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgIFJlZnJlc2hBY3Rpb24gYWN0aW9uOwotICAgICAgaWYgKHZpZXdJRFN0cmluZyA9PSBudWxsKQotICAgICAgICBhY3Rpb24gPSBuZXcgUmVmcmVzaFdTSUxBY3Rpb24oY29udHJvbGxlcik7Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkKLSAgICAgICAgYWN0aW9uID0gbmV3IFJlZnJlc2hVRERJU2VydmljZUFjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJQnVzaW5lc3NUb29sKQotICAgICAgICBhY3Rpb24gPSBuZXcgUmVmcmVzaFVERElCdXNpbmVzc0FjdGlvbihjb250cm9sbGVyKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBOdWxsQWN0aW9uKCk7Ci0gICAgICBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpLnB1dChBY3Rpb25JbnB1dHMuTk9ERUlELCBTdHJpbmcudmFsdWVPZihub2RlSUQpKTsKLSAgICAgIHJldHVybiBhY3Rpb247Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uTGluayhpbnQgbm9kZUlELCBpbnQgdG9vbElELCBpbnQgdmlld0lELCBpbnQgdmlld1Rvb2xJRCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBhY3Rpb25MaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigid3NpbC9hY3Rpb25zL1JlZnJlc2hBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlQWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gIndzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uSlNQLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvUmVmcmVzaFVERElCdXNpbmVzc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoVURESUJ1c2luZXNzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTZjYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoVURESUJ1c2luZXNzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuSVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFVERElCdXNpbmVzc0FjdGlvbiBleHRlbmRzIFJlZnJlc2hBY3Rpb24KLXsKLSAgcHVibGljIFJlZnJlc2hVRERJQnVzaW5lc3NBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCsxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcmVudFRyYW5zZm9ybWVycywgMCwgdHJhbnNmb3JtZXJzLCAwLCBwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKTsKLSAgICB0cmFuc2Zvcm1lcnNbdHJhbnNmb3JtZXJzLmxlbmd0aC0xXSA9IG5ldyBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKGNvbnRyb2xsZXJfLCBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfTElOS1MsIEFjdGlvbklucHV0cy5WSUVXSUQsIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuVURESV9CVVNJTkVTUyk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJ1bigpCi0gIHsKLSAgICByZXR1cm4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVNdWx0aXBsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE1lc3NhZ2VRdWV1ZSBtZXNzYWdlUXVldWUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCk7Ci0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KQotICAgIHsKLSAgICAgIFdzaWxFbGVtZW50IHdzaWxFbGVtZW50ID0gKFdzaWxFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgICBMaXN0TWFuYWdlciBsbSA9IHdzaWxFbGVtZW50LmdldEFsbFVERElMaW5rcygpOwotICAgICAgVmVjdG9yIHVkZGlCdXNpbmVzc0VsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgU3RyaW5nW10gdmlld0lEcyA9IGdldFZpZXdJZHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlld0lEcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQodmlld0lEc1tpXSk7Ci0gICAgICAgIFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50IHVkZGlCdXNpbmVzc0VsZW1lbnQgPSAoV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQpIGxtLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCkuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHVkZGlCdXNpbmVzc0VsZW1lbnRzLmFkZCh1ZGRpQnVzaW5lc3NFbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIHdzaWxFbGVtZW50LnJlZnJlc2hTZXJ2aWNlUHJvdmlkZXJzRnJvbVJlZ2lzdHJ5KHVkZGlCdXNpbmVzc0VsZW1lbnRzKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB1ZGRpQnVzaW5lc3NFbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCB1ZGRpQnVzaW5lc3NFbGVtZW50ID0gKFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gdWRkaUJ1c2luZXNzRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA8PSAwKQotICAgICAgICAgIG5hbWUgPSB1ZGRpQnVzaW5lc3NFbGVtZW50LmdldFVERElMaW5rQnVzaW5lc3NLZXkoKTsKLSAgICAgICAgaWYgKHVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0U2VydmljZVByb3ZpZGVyKCkgIT0gbnVsbCkKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fUkVGUkVTSF9TVUNDRVNTRlVMIiwgbmFtZSkpOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORCIsIG5hbWUpKTsKLSAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hVRERJU2VydmljZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoVURESVNlcnZpY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3YjhlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hVRERJU2VydmljZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZW5naW5lLnRyYW5zZm9ybWVyLklUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlJlZnJlc2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnRyYW5zZm9ybWVyLldTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFJlZnJlc2hVRERJU2VydmljZUFjdGlvbiBleHRlbmRzIFJlZnJlc2hBY3Rpb24KLXsKLSAgcHVibGljIFJlZnJlc2hVRERJU2VydmljZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKzFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoLTFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8sIFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUywgQWN0aW9uSW5wdXRzLlZJRVdJRCwgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5VRERJX1NFUlZJQ0UpOwotICAgIHJldHVybiB0cmFuc2Zvcm1lcnM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgcmV0dXJuIGV4ZWN1dGVTaW5nbGVMaW5rQWN0aW9uKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlTXVsdGlwbGVMaW5rQWN0aW9uKCkKLSAgewotICAgIHJldHVybiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIGludCBub2RlSUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlcl8uZ2V0Tm9kZShub2RlSUQpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkKLSAgICB7Ci0gICAgICBXc2lsRWxlbWVudCB3c2lsRWxlbWVudCA9IChXc2lsRWxlbWVudCkgc2VsZWN0ZWRFbGVtZW50OwotICAgICAgTGlzdE1hbmFnZXIgbG0gPSB3c2lsRWxlbWVudC5nZXRBbGxVRERJU2VydmljZXMoKTsKLSAgICAgIFZlY3RvciB1ZGRpU2VydmljZUVsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgU3RyaW5nW10gdmlld0lEcyA9IGdldFZpZXdJZHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlld0lEcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaW50IHZpZXdJRCA9IEludGVnZXIucGFyc2VJbnQodmlld0lEc1tpXSk7Ci0gICAgICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgdWRkaVNlcnZpY2VFbGVtZW50ID0gKFdzaWxVZGRpU2VydmljZUVsZW1lbnQpIGxtLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCkuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIHVkZGlTZXJ2aWNlRWxlbWVudHMuYWRkKHVkZGlTZXJ2aWNlRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgICB3c2lsRWxlbWVudC5yZWZyZXNoU2VydmljZURlZmluaXRpb25zRnJvbVJlZ2lzdHJ5KHVkZGlTZXJ2aWNlRWxlbWVudHMpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHVkZGlTZXJ2aWNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCB1ZGRpU2VydmljZUVsZW1lbnQgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9IHVkZGlTZXJ2aWNlRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA8PSAwKQotICAgICAgICAgIG5hbWUgPSB1ZGRpU2VydmljZUVsZW1lbnQuZ2V0VURESVNlcnZpY2VLZXkoKTsKLSAgICAgICAgaWYgKHVkZGlTZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlRGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19JTkZPX1JFRlJFU0hfU1VDQ0VTU0ZVTCIsIG5hbWUpKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORCIsIG5hbWUpKTsKLSAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hXU0lMQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1JlZnJlc2hXU0lMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2M2MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9SZWZyZXNoV1NJTEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5SZWZyZXNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci0KLXB1YmxpYyBjbGFzcyBSZWZyZXNoV1NJTEFjdGlvbiBleHRlbmRzIFJlZnJlc2hBY3Rpb24KLXsKLSAgcHVibGljIFJlZnJlc2hXU0lMQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNpbmdsZUxpbmtBY3Rpb24oKQotICB7Ci0gICAgaW50IG5vZGVJRCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyXy5nZXROb2RlKG5vZGVJRCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgd3NpbFVSTCA9ICgoV3NpbEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudCkuZ2V0V3NpbFVybCgpOwotICAgICAgaWYgKCgoV3NpbEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudCkucmVmcmVzaCgpKQotICAgICAgewotICAgICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fUkVGUkVTSF9TVUNDRVNTRlVMIiwgd3NpbFVSTCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmFkZE1lc3NhZ2Uod3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0lMX05PVF9GT1VORCIsIHdzaWxVUkwpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1Jlc2l6ZVdTSUxGcmFtZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvUmVzaXplV1NJTEZyYW1lc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I0Mzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvUmVzaXplV1NJTEZyYW1lc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgUmVzaXplV1NJTEZyYW1lc0FjdGlvbiBleHRlbmRzIFJlc2l6ZUZyYW1lc0FjdGlvbgotewotICBwdWJsaWMgUmVzaXplV1NJTEZyYW1lc0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc090aGVycyhNdWx0aXBhcnRGb3JtRGF0YVBhcnNlciBwYXJzZXIpIHRocm93cyBNdWx0aXBhcnRGb3JtRGF0YUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gcGFyc2VyLmdldFBhcmFtZXRlcihXc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIpOwotICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMgIT0gbnVsbCAmJiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlUYWJsZV8ucHV0KFdzaWxBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5ULHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSLGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gcnVuKCkKLSAgewotICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgZnJhbWVzZXQgc2l6ZXMuCi0gICAgU3RyaW5nIGZyYW1lTmFtZSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KEFjdGlvbklucHV0cy5GUkFNRV9OQU1FKTsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQpOwotICAgIFN0cmluZyBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzID0gKFN0cmluZylwcm9wZXJ0eVRhYmxlXy5nZXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9ST1dTX0FDVElPTlNfQ09OVEFJTkVSKTsKLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBuZXcgZnJhbWVzZXQgc2l6ZXMuCi0gICAgYm9vbGVhbiBzYXZlRnJhbWVTZXR0aW5ncyA9IGZhbHNlOwotICAgIGlmIChmcmFtZU5hbWUuZXF1YWxzKFdzaWxGcmFtZU5hbWVzLldTSUxfTkFWSUdBVE9SX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMod3NpbFBlcnNwZWN0aXZlLmdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjEwMCUsMCUiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZnJhbWVOYW1lLmVxdWFscyhXc2lsRnJhbWVOYW1lcy5XU0lMX1BST1BFUlRJRVNfQ09OVEFJTkVSKSkKLSAgICB7Ci0gICAgICBpZiAoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgICB7Ci0gICAgICAgIGlmIChwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFJlc3RvcmUuCi0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyh3c2lsUGVyc3BlY3RpdmUuZ2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSk7Ci0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3Mod3NpbFBlcnNwZWN0aXZlLmdldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0U2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBNYXhpbWl6ZS4KLSAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKTsKLSAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoIjEwMCUsMCUiKTsKLSAgICAgICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICAgewotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoIjAlLDEwMCUiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChmcmFtZU5hbWUuZXF1YWxzKFdzaWxGcmFtZU5hbWVzLldTSUxfU1RBVFVTX0NPTlRBSU5FUikpCi0gICAgewotICAgICAgaWYgKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmVzdG9yZS4KLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHdzaWxQZXJzcGVjdGl2ZS5nZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpKTsKLSAgICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyh3c2lsUGVyc3BlY3RpdmUuZ2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIE1heGltaXplLgotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMpOwotICAgICAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRTYXZlZEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMCUsMTAwJSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIE1heGltaXplLgotICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgICB3c2lsUGVyc3BlY3RpdmUuc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygiMCUsMTAwJSIpOwotICAgICAgICBpZiAoIXBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scy5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgICB7Ci0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyk7Ci0gICAgICAgICAgd3NpbFBlcnNwZWN0aXZlLnNldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygiMCUsMTAwJSIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxOb2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjRkNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9TZWxlY3RXU0lMTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuU2VsZWN0Tm9kZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3RXU0lMTm9kZUFjdGlvbiBleHRlbmRzIFNlbGVjdE5vZGVBY3Rpb24KLXsKLSAgICBwdWJsaWMgU2VsZWN0V1NJTE5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICAgIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlciwgY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSUQsIGJvb2xlYW4ga2VlcEhpc3RvcnkpCi0gICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzaWwvYWN0aW9ucy9TZWxlY3RXU0lMTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgICAgICBpZiAoa2VlcEhpc3RvcnkpIHsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKTsKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCI9MSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gICAgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IGdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikKLSAgICAgICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWRUb29sLmdldFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIHRydWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbE5hdmlnYXRvckNvbnRlbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gIndzaWwvd3NpbF9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsUHJvcGVydGllc0NvbnRhaW5lciI7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIGludCBnZXRQZXJzcGVjdGl2ZUlkKCkKLSAgICB7Ci0gICAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9TZWxlY3RXU0lMVG9vbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9TZWxlY3RXU0lMVG9vbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDU0YjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTFRvb2xBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TZWxlY3ROb2RlVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotcHVibGljIGNsYXNzIFNlbGVjdFdTSUxUb29sQWN0aW9uIGV4dGVuZHMgU2VsZWN0Tm9kZVRvb2xBY3Rpb24KLXsKLSAgcHVibGljIFNlbGVjdFdTSUxUb29sQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKSk7Ci0gIH0KLQotICBwdWJsaWMgSVRyYW5zZm9ybWVyW10gZ2V0VHJhbnNmb3JtZXJzKCkKLSAgewotICAgIElUcmFuc2Zvcm1lcltdIHBhcmVudFRyYW5zZm9ybWVycyA9IHN1cGVyLmdldFRyYW5zZm9ybWVycygpOwotICAgIElUcmFuc2Zvcm1lcltdIHRyYW5zZm9ybWVycyA9IG5ldyBJVHJhbnNmb3JtZXJbcGFyZW50VHJhbnNmb3JtZXJzLmxlbmd0aCArIDFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoIC0gMV0gPSBuZXcgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcihjb250cm9sbGVyXyk7Ci0gICAgcmV0dXJuIHRyYW5zZm9ybWVyczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgaW50IHRvb2xJRCwgaW50IHZpZXdJRCwgaW50IHZpZXdUb29sSUQsIGJvb2xlYW4ga2VlcEhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzaWwvYWN0aW9ucy9TZWxlY3RXU0lMVG9vbEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk5PREVJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlRPT0xJRCk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQoJz0nKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCh0b29sSUQpOwotICAgIGlmICh2aWV3SUQgIT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgIHsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVklFV0lEKTsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3SUQpOwotICAgICAgYWN0aW9uTGluay5hcHBlbmQoJyYnKTsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZCh2aWV3VG9vbElEKTsKLSAgICB9Ci0gICAgaWYgKGtlZXBIaXN0b3J5KQotICAgIHsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCcmJyk7Ci0gICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuSVNISVNUT1JZKTsKLSAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCI9MSIpOwotICAgIH0KLSAgICByZXR1cm4gYWN0aW9uTGluay50b1N0cmluZygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRBY3Rpb25MaW5rRm9ySGlzdG9yeSgpCi0gIHsKLSAgICBib29sZWFuIGtlZXBIaXN0b3J5ID0gZmFsc2U7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUb29sIHNlbGVjdGVkVG9vbCA9IGdldFNlbGVjdGVkVG9vbCgpOwotICAgIGludCB0b29sVHlwZSA9IGdldFNlbGVjdGVkVG9vbCgpLmdldFRvb2xUeXBlKCk7Ci0gICAgaWYgKHRvb2xUeXBlID09IFRvb2xUeXBlcy5GT1JNKQotICAgICAga2VlcEhpc3RvcnkgPSB0cnVlOwotICAgIGVsc2UgaWYgKHRvb2xUeXBlID09IFRvb2xUeXBlcy5WSUVXKQotICAgIHsKLSAgICAgIGludCB2aWV3SUQgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCk7Ci0gICAgICBpZiAodmlld0lEID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICAgICAga2VlcEhpc3RvcnkgPSB0cnVlOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoKChWaWV3VG9vbCkgc2VsZWN0ZWRUb29sKS5nZXRUb29sTWFuYWdlcih2aWV3SUQpLmdldFRvb2woc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSkuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKQotICAgICAgICAgIGtlZXBIaXN0b3J5ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGtlZXBIaXN0b3J5KQotICAgIHsKLSAgICAgIHJldHVybiBnZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWRUb29sLmdldFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIHRydWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsTmF2aWdhdG9yQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gIndzaWwvd3NpbF9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCkKLSAgewotICAgIHJldHVybiAid3NpbFByb3BlcnRpZXNDb250YWluZXIiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpCi0gIHsKLSAgICByZXR1cm4gIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiOwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gIndzaWxQcm9wZXJ0aWVzQ29udGVudCI7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0lMQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Y2ZjOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0lMQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKjsKLQotcHVibGljIGZpbmFsIGNsYXNzIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTSUxBY3Rpb24gZXh0ZW5kcyBTaG93UGVyc3BlY3RpdmVBY3Rpb24KLXsKLSAgcHVibGljIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTSUxBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlcik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NQYXJzZWRSZXN1bHRzKE11bHRpcGFydEZvcm1EYXRhUGFyc2VyIHBhcnNlcikgdGhyb3dzIE11bHRpcGFydEZvcm1EYXRhRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzID0gcGFyc2VyLmdldFBhcmFtZXRlcihXc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCk7Ci0gICAgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgPSBwYXJzZXIuZ2V0UGFyYW1ldGVyKFdzaWxBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgaWYgKHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyAhPSBudWxsICYmIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVRhYmxlXy5wdXQoV3NpbEFjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQscGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIHByb3BlcnR5VGFibGVfLnB1dChXc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIsYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBydW4oKQotICB7Ci0gICAgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdzaWxBY3Rpb25JbnB1dHMuRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UKTsKLSAgICBTdHJpbmcgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyA9IChTdHJpbmcpcHJvcGVydHlUYWJsZV8uZ2V0KFdzaWxBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUik7Ci0gICAgCi0gICAgLy8gU2F2ZSB0aGUgZnJhbWVzZXQgc2l6ZXMgaWZmIG5vIGZyYW1lIGlzIG1heGltaXplZC4KLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgaWYgKCFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuc3RhcnRzV2l0aCgiMTAwJSIpICYmICFwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMocGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKTsKLSAgICAgIAotICAgIGlmICghYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cy5zdGFydHNXaXRoKCIxMDAlIikgJiYgIWFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5zZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MpOwotICAgICAgCi0gICAgcmV0dXJuIHN1cGVyLnJ1bigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb3JtQWN0aW9uTGluayhpbnQgdGFyZ2V0UGVyc3BlY3RpdmVJZCxib29sZWFuIGZvckhpc3RvcnkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgZm9ybUxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2lsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgZm9ybUxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRSkuYXBwZW5kKCc9JykuYXBwZW5kKHRhcmdldFBlcnNwZWN0aXZlSWQpOwotICAgIGlmIChmb3JIaXN0b3J5KQotICAgICAgZm9ybUxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5JU0hJU1RPUlkpLmFwcGVuZCgiPTEiKTsKLSAgICByZXR1cm4gZm9ybUxpbmsudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9XU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3NDM1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkltcG9ydFRvV29ya2JlbmNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbiBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi17Ci0gIHB1YmxpYyBXU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHN1cGVyKGNvbnRyb2xsZXIpOwotICB9Ci0KLSAgcHVibGljIEZvcm1Ub29sIGdldFNlbGVjdGVkRm9ybVRvb2woKQotICB7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIHJldHVybiAoRm9ybVRvb2wpd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgfQotCi0gIHB1YmxpYyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24gbmV3SW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKCkKLSAgewotICAgIEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb24gYWN0aW9uID0gbmV3IEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb24oY29udHJvbGxlcl8pOwotICAgIEhhc2h0YWJsZSB0YWJsZSA9IGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICB0YWJsZS5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgU3RyaW5nLnZhbHVlT2Yoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKSk7Ci0gICAgcmV0dXJuIGFjdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0U3RhdHVzQ29udGVudFZhcigpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gIH0gICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4Mzg2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS50cmFuc2Zvcm1lci5JVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5PcGVuV1NETEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbE1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbFdzZGxTZXJ2aWNlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwudHJhbnNmb3JtZXIuV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBXc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24gZXh0ZW5kcyBNdWx0aXBsZUxpbmtBY3Rpb24KLXsKLSAgcHVibGljIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpCi0gIHsKLSAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoaW50IG5vZGVJRCwgaW50IHRvb2xJRCwgaW50IHZpZXdJRCwgaW50IHZpZXdUb29sSUQpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzaWwvYWN0aW9ucy9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwPyIpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQobm9kZUlEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5UT09MSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodG9vbElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXSUQpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgYWN0aW9uTGluay5hcHBlbmQodmlld0lEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5WSUVXVE9PTElEKTsKLSAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgIGFjdGlvbkxpbmsuYXBwZW5kKHZpZXdUb29sSUQpOwotICAgIHJldHVybiBhY3Rpb25MaW5rLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlQWN0aW9uTGluaygpCi0gIHsKLSAgICByZXR1cm4gIndzaWwvYWN0aW9ucy9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwIjsKLSAgfQotCi0gIHB1YmxpYyBJVHJhbnNmb3JtZXJbXSBnZXRUcmFuc2Zvcm1lcnMoKQotICB7Ci0gICAgSVRyYW5zZm9ybWVyW10gcGFyZW50VHJhbnNmb3JtZXJzID0gc3VwZXIuZ2V0VHJhbnNmb3JtZXJzKCk7Ci0gICAgSVRyYW5zZm9ybWVyW10gdHJhbnNmb3JtZXJzID0gbmV3IElUcmFuc2Zvcm1lcltwYXJlbnRUcmFuc2Zvcm1lcnMubGVuZ3RoKzFdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFyZW50VHJhbnNmb3JtZXJzLCAwLCB0cmFuc2Zvcm1lcnMsIDAsIHBhcmVudFRyYW5zZm9ybWVycy5sZW5ndGgpOwotICAgIHRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcnMubGVuZ3RoLTFdID0gbmV3IFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIoY29udHJvbGxlcl8sIFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NETF9TRVJWSUNFUywgQWN0aW9uSW5wdXRzLlZJRVdJRCwgV1NJTFZpZXdTZWxlY3Rpb25UcmFuc2Zvcm1lci5XU0RMX1NFUlZJQ0UpOwotICAgIHJldHVybiB0cmFuc2Zvcm1lcnM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlU2luZ2xlTGlua0FjdGlvbigpCi0gIHsKLSAgICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0eVRhYmxlXy5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpOwotICAgIGludCB2aWV3SUQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHByb3BlcnR5VGFibGVfLmdldChBY3Rpb25JbnB1dHMuVklFV0lEKSk7Ci0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShub2RlSUQpOwotICAgIFdzaWxFbGVtZW50IHdzaWxFbGVtZW50ID0gKFdzaWxFbGVtZW50KSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBXc2lsV3NkbFNlcnZpY2VFbGVtZW50IHdzaWxXc2RsU2VydmljZUVsZW1lbnQgPSAoV3NpbFdzZGxTZXJ2aWNlRWxlbWVudCkgd3NpbEVsZW1lbnQuZ2V0QWxsV1NETFNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKS5nZXRPYmplY3QoKTsKLSAgICBTdHJpbmcgd3NkbFVybCA9IHdzaWxXc2RsU2VydmljZUVsZW1lbnQuZ2V0V1NETFNlcnZpY2VVUkwoKTsKLSAgICBPcGVuV1NETEFjdGlvbiBvcGVuV1NETEFjdGlvbiA9IG5ldyBPcGVuV1NETEFjdGlvbihjb250cm9sbGVyXyk7Ci0gICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBvcGVuV1NETEFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCk7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMLCB3c2RsVXJsKTsKLSAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IG9wZW5XU0RMQWN0aW9uLnJ1bigpOwotICAgIGlmIChhY3Rpb25SZXN1bHQpCi0gICAgICB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuYWRkTWVzc2FnZSh3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMIiwgd3NkbFVybCkpOwotICAgIGVsc2UKLSAgICAgIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5hZGRNZXNzYWdlKHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRSIsIHdzZGxVcmwpKTsKLSAgICByZXR1cm4gYWN0aW9uUmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWRhNTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBXc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uIGV4dGVuZHMgSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24gewotICAgIHB1YmxpYyBXc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uKENvbnRyb2xsZXIgY29udHJvbGxlcikgewotICAgICAgICBzdXBlcihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpIHsKLSAgICAgICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgICAgICByZXR1cm4gKEZvcm1Ub29sKXdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiBuZXdJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24oKSB7Ci0gICAgICAgIEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24gYWN0aW9uID0gbmV3IEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24oY29udHJvbGxlcl8pOwotICAgICAgICBIYXNodGFibGUgdGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotCi0gICAgICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyXy5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLQotICAgICAgICB0YWJsZS5wdXQoQWN0aW9uSW5wdXRzLk5PREVJRCwgU3RyaW5nLnZhbHVlT2Yoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKSk7Ci0gICAgICAgIHRhYmxlLnB1dChBY3Rpb25JbnB1dHMuVE9PTElELCBTdHJpbmcudmFsdWVPZihzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpKSk7Ci0gICAgICAgIHRhYmxlLnB1dChBY3Rpb25JbnB1dHMuVklFV0lELCBTdHJpbmcudmFsdWVPZihzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCkpKTsKLQotICAgICAgICByZXR1cm4gYWN0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkMjY0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLkxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLio7Ci0KLXB1YmxpYyBjbGFzcyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbiBleHRlbmRzIExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gewotICAgIHB1YmxpYyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgc3VwZXIoY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIG5ld0FjdGlvbihDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9ybVRvb2wgZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpIHsKLSAgICAgICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgICAgICByZXR1cm4gKEZvcm1Ub29sKXdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcnVuKCkgewotICAgICAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpbnQgdmlld0lEID0gc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpOwotCi0gICAgICAgIExpc3RFbGVtZW50IGxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHVybCA9IG51bGw7Ci0gICAgICAgIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0V1NETFNlcnZpY2VzVG9vbCkgewotICAgICAgICAgICAgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsV1NETFNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgICAgIHVybCA9ICgoV3NpbFdzZGxTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKSkuZ2V0V1NETFNlcnZpY2VVUkwoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZWxlY3RlZFRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkgewotICAgICAgICAgICAgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsVURESVNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgICAgIHVybCA9ICgoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKSkuZ2V0V3NkbFVybCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGxhdW5jaFdpemFyZCh1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFZhcigpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdGF0dXNDb250ZW50UGFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFN0YXR1c0NvbnRlbnRQYWdlKCk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbFRvZ2dsZU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2FjdGlvbnMvV3NpbFRvZ2dsZU5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliNGYwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9hY3Rpb25zL1dzaWxUb2dnbGVOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qOwotCi1wdWJsaWMgY2xhc3MgV3NpbFRvZ2dsZU5vZGVBY3Rpb24gZXh0ZW5kcyBUb2dnbGVOb2RlQWN0aW9uIHsKLSAgICBwdWJsaWMgV3NpbFRvZ2dsZU5vZGVBY3Rpb24oQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKGludCBub2RlSWQsIGJvb2xlYW4gb3BlbikgewotICAgICAgICBTdHJpbmdCdWZmZXIgYWN0aW9uTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoIndzaWwvYWN0aW9ucy9Xc2lsVG9nZ2xlTm9kZUFjdGlvbkpTUC5qc3A/Iik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnPScpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChub2RlSWQpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZCgnJicpOwotICAgICAgICBhY3Rpb25MaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuT1BFTik7Ci0gICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKCc9Jyk7Ci0gICAgICAgIGlmIChvcGVuKQotICAgICAgICAgICAgYWN0aW9uTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLk9QRU5fTk9ERSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFjdGlvbkxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5DTE9TRV9OT0RFKTsKLSAgICAgICAgcmV0dXJuIGFjdGlvbkxpbmsudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbkxpbmtGb3JIaXN0b3J5KCkgewotICAgICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IHRvZ2dsZWROb2RlXy5nZXRUb29sTWFuYWdlcigpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpbnQgbm9kZUlkID0gdG9nZ2xlZE5vZGVfLmdldE5vZGVJZCgpOwotICAgICAgICBpbnQgdG9vbElkID0gc2VsZWN0ZWRUb29sLmdldFRvb2xJZCgpOwotICAgICAgICBpbnQgdmlld0lkID0gdG9nZ2xlZE5vZGVfLmdldFZpZXdJZCgpOwotICAgICAgICBpbnQgdmlld1Rvb2xJZCA9IHRvZ2dsZWROb2RlXy5nZXRWaWV3VG9vbElkKCk7Ci0gICAgICAgIGlmIChzZWxlY3RlZFRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKQotICAgICAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkLCB0b29sSWQsIHZpZXdJZCwgdmlld1Rvb2xJZCwgdHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBTZWxlY3RXU0lMTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCwgdHJ1ZSk7Ci0gICAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRyZWVDb250ZW50UGFnZSgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbGxlcl8uZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0VHJlZUNvbnRlbnRQYWdlKCk7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFByb3BlcnRpZXNDb250YWluZXJWYXIoKTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXJfLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gIHsKLSAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsQWN0aW9uSW5wdXRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9jb25zdGFudHMvV3NpbEFjdGlvbklucHV0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWIzYzU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsQWN0aW9uSW5wdXRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV3NpbEFjdGlvbklucHV0cwotewotICAgIC8vIG9wZW4gV1NJTCBmb3JtCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9VUkwgPSAid3NpbFVSTCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9JTlNQRUNUSU9OX1RZUEUgPSAid3NpbEluc3BlY3Rpb25UeXBlIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXU0lMX0RFVEFJTFMgPSAwOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFdTRExfU0VSVklDRVMgPSAxOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVERElfU0VSVklDRVMgPSAyOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVERElfQlVTSU5FU1NFUyA9IDM7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV1NJTF9MSU5LUyA9IDQ7Ci0KLSAgICAvLyBtYXNzIGFjdGlvbgotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1VTFRJUExFX0xJTktfQUNUSU9OID0gIm11bHRpcGxlTGlua0FjdGlvbiI7Ci0KLSAgICAvLyByZXNpemUgV1NJTCBmcmFtZXMgYWN0aW9uCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVTRVRfQ09MU19QRVJTUEVDVElWRV9DT05URU5UID0gImZyYW1lc2V0Q29sc1BlcnNwZWN0aXZlQ29udGVudCI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUiA9ICJmcmFtZXNldFJvd3NBY3Rpb25zQ29udGFpbmVyIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsRnJhbWVOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvY29uc3RhbnRzL1dzaWxGcmFtZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmQyNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvY29uc3RhbnRzL1dzaWxGcmFtZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV3NpbEZyYW1lTmFtZXMKLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9OQVZJR0FUT1JfQ09OVEFJTkVSID0gIndzaWxfbmF2aWdhdG9yX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfTkFWSUdBVE9SX1RPT0xCQVIgPSAid3NpbF9uYXZpZ2F0b3JfdG9vbGJhciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfTkFWSUdBVE9SX0NPTlRFTlQgPSAid3NpbF9uYXZpZ2F0b3JfY29udGVudCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfQUNUSU9OU19DT05UQUlORVIgPSAid3NpbF9hY3Rpb25zX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfUFJPUEVSVElFU19DT05UQUlORVIgPSAid3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lciI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTSUxfUFJPUEVSVElFU19UT09MQkFSID0gIndzaWxfcHJvcGVydGllc190b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9QUk9QRVJUSUVTX0NPTlRFTlQgPSAid3NpbF9wcm9wZXJ0aWVzX2NvbnRlbnQiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBXU0lMX1NUQVRVU19DT05UQUlORVIgPSAid3NpbF9zdGF0dXNfY29udGFpbmVyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9TVEFUVVNfVE9PTEJBUiA9ICJ3c2lsX3N0YXR1c190b29sYmFyIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NJTF9TVEFUVVNfQ09OVEVOVCA9ICJ3c2lsX3N0YXR1c19jb250ZW50IjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsTW9kZWxDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2NvbnN0YW50cy9Xc2lsTW9kZWxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiNjk0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9jb25zdGFudHMvV3NpbE1vZGVsQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV3NpbE1vZGVsQ29uc3RhbnRzCi17Ci0gICAgLy8gUmVsYXRpb24KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRUxfV1NJTCA9ICJyZWxXU0lMIjsKLQotICAgIC8vIExpc3QgTWFuYWdlcnMgZm9yIFdzaWxFbGVtZW50Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMgPSAid3NkbFNlcnZpY2VzIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBMSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUyA9ICJ1ZGRpU2VydmljZXMiOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfTUFOQUdFUl9VRERJX0xJTktTID0gInVkZGlMaW5rcyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9NQU5BR0VSX1dTSUxfTElOS1MgPSAid3NpbExpbmtzIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsQ29tbW9uRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxDb21tb25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDI4ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxDb21tb25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuQmFzaWNFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBXc2lsQ29tbW9uRWxlbWVudCBleHRlbmRzIEJhc2ljRWxlbWVudAotewotICBwcml2YXRlIFN0cmluZyBiYXNlV3NpbFVSTDsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVsYXRpdmVVUklCYXNlOwotCi0gIHB1YmxpYyBXc2lsQ29tbW9uRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwpCi0gIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVdzaWxVUkwoKQotICB7Ci0gICAgcmV0dXJuIGJhc2VXc2lsVVJMOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRCYXNlV3NpbFVSTChTdHJpbmcgYmFzZVdzaWxVUkwpCi0gIHsKLSAgICB0aGlzLmJhc2VXc2lsVVJMID0gYmFzZVdzaWxVUkw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgY2hhciBGV0RfU0xBU0ggPSAnLyc7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBCV0RfU0xBU0ggPSAnXFwnOwotICBwcml2YXRlIGZpbmFsIGNoYXIgUFJPVE9DT0xfSU5ESUNBVE9SID0gJzonOwotICAKLSAgcHVibGljIFN0cmluZyBtYWtlQWJzb2x1dGUoU3RyaW5nIHVyaSkKLSAgewotICAgIGlmIChiYXNlV3NpbFVSTCAhPSBudWxsICYmIHVyaSAhPSBudWxsICYmIHVyaS5pbmRleE9mKFBST1RPQ09MX0lORElDQVRPUikgPT0gLTEpCi0gICAgewotICAgICAgaWYgKHJlbGF0aXZlVVJJQmFzZSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZWxhdGl2ZVVSSUJhc2UgPSBiYXNlV3NpbFVSTC5yZXBsYWNlKEJXRF9TTEFTSCwgRldEX1NMQVNIKTsKLSAgICAgICAgaW50IGluZGV4ID0gcmVsYXRpdmVVUklCYXNlLmxhc3RJbmRleE9mKEZXRF9TTEFTSCk7Ci0gICAgICAgIHJlbGF0aXZlVVJJQmFzZSA9IGJhc2VXc2lsVVJMLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotICAgICAgfQotICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihyZWxhdGl2ZVVSSUJhc2UpOwotICAgICAgc2IuYXBwZW5kKHVyaSk7Ci0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDEwOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC4qOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci0KLS8qKgotICogVGhlIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBXU0lMIGRvY3VtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBXc2lsRWxlbWVudCBleHRlbmRzIFRyZWVFbGVtZW50Ci17Ci0gIHByaXZhdGUgV1NJTERvY3VtZW50IHdzaWxEb2NfOwotICBwcml2YXRlIFN0cmluZyB0aGlzV3NpbFVybF87Ci0gIC8qKiAqKioqKioqKioqKioqKioqKiogTmFtZXNwYWNlICoqKioqKioqKiogKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9XU0RMID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VRERJX1YxID0gInVybjp1ZGRpLW9yZzphcGkiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VERElfVjIgPSAidXJuOnVkZGktb3JnOmFwaV92MiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVURESV9CSU5ESU5HID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDEvMTAvaW5zcGVjdGlvbi91ZGRpLyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfV1NJTF9JTlNQRUNUSU9OID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDEvMTAvaW5zcGVjdGlvbi8iOwotICAvKiogKioqKioqKioqKioqKioqKioqIFJlbHMgKioqKioqKioqKioqKioqKiAqLwotICAvLyBSZWxhdGlvbiBmb3IgYSBXU0lMIGRvdWNtZW50IGFuZCBpdHMgbGluayBub2RlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxfV1NJTF9MSU5LID0gIndzaWwgbGluayBub2RlcyI7Ci0KLSAgcHVibGljIFdzaWxFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgV1NJTERvY3VtZW50IHdzaWxEb2N1bWVudCwgU3RyaW5nIHdzaWxVUkwpCi0gIHsKLSAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgd3NpbERvY18gPSB3c2lsRG9jdW1lbnQ7Ci0gICAgdGhpc1dzaWxVcmxfID0gd3NpbFVSTDsKLSAgICBMaXN0TWFuYWdlciB3c2RsU2VydmljZXNfID0gbnVsbDsKLSAgICBMaXN0TWFuYWdlciB1ZGRpU2VydmljZXNfID0gbnVsbDsKLSAgICBMaXN0TWFuYWdlciB3c2lsTGlua3NfID0gbnVsbDsKLSAgICBMaXN0TWFuYWdlciB1ZGRpTGlua3NfID0gbnVsbDsKLSAgICBzZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NETF9TRVJWSUNFUywgd3NkbFNlcnZpY2VzXyk7Ci0gICAgc2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfU0VSVklDRVMsIHVkZGlTZXJ2aWNlc18pOwotICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX0xJTktTLCB3c2lsTGlua3NfKTsKLSAgICBzZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NJTF9MSU5LUywgdWRkaUxpbmtzXyk7Ci0gIH0KLQotICAvKgotICAgKiBSZWZyZXNoIHRoZSBXU0lMIGRvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiByZWZyZXNoKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFdTSUxEb2N1bWVudCBuZXdXU0lMRG9jID0gV1NJTERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBuZXdXU0lMRG9jLnJlYWQoZ2V0V3NpbFVybCgpKTsKLSAgICAgIHdzaWxEb2NfID0gbmV3V1NJTERvYzsKLSAgICAgIExpc3RNYW5hZ2VyIHdzZGxTZXJ2aWNlc18gPSBudWxsOwotICAgICAgTGlzdE1hbmFnZXIgdWRkaVNlcnZpY2VzXyA9IG51bGw7Ci0gICAgICBMaXN0TWFuYWdlciB3c2lsTGlua3NfID0gbnVsbDsKLSAgICAgIExpc3RNYW5hZ2VyIHVkZGlMaW5rc18gPSBudWxsOwotICAgICAgc2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVMsIHdzZGxTZXJ2aWNlc18pOwotICAgICAgc2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfU0VSVklDRVMsIHVkZGlTZXJ2aWNlc18pOwotICAgICAgc2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfTElOS1MsIHdzaWxMaW5rc18pOwotICAgICAgc2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTSUxfTElOS1MsIHVkZGlMaW5rc18pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyB0aGUgV1NJTCdzIFVSTAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXc2lsVXJsKCkKLSAgewotICAgIHJldHVybiB0aGlzV3NpbFVybF87Ci0gIH0KLQotICAvKgotICAgKiBSZXR1cm5zIHRoZSBXU0lMIGRvY3VtZW50Ci0gICAqLwotICBwdWJsaWMgV1NJTERvY3VtZW50IGdldFdTSUxEb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gd3NpbERvY187Ci0gIH0KLQotICAvKgotICAgKiBSZXR1cm5zIGFsbCBhYnN0cmFjdCBsYW5ndWFnZXMKLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0V1NJTEFic3RyYWN0TGFuZ3MoKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSB3c2lsRG9jXy5nZXRJbnNwZWN0aW9uKCkuZ2V0QWJzdHJhY3RzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhYnN0cmFjdHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdi5hZGQoYWJzdHJhY3RzW2ldLmdldExhbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyBhbGwgYWJzdHJhY3RzCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFdTSUxBYnN0cmFjdHMoKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSB3c2lsRG9jXy5nZXRJbnNwZWN0aW9uKCkuZ2V0QWJzdHJhY3RzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhYnN0cmFjdHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdi5hZGQoYWJzdHJhY3RzW2ldLmdldFRleHQoKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLSAgcHVibGljIExpc3RNYW5hZ2VyIGdldEFsbFdTRExTZXJ2aWNlcygpCi0gIHsKLSAgICBMaXN0TWFuYWdlciB3c2RsU2VydmljZXNfID0gKExpc3RNYW5hZ2VyKSBnZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NETF9TRVJWSUNFUyk7Ci0gICAgaWYgKHdzZGxTZXJ2aWNlc18gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbml0QWxsV1NETFNlcnZpY2VzKCk7Ci0gICAgICB3c2RsU2VydmljZXNfID0gKExpc3RNYW5hZ2VyKSBnZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NETF9TRVJWSUNFUyk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsU2VydmljZXNfOwotICB9Ci0KLSAgcHVibGljIExpc3RNYW5hZ2VyIGdldEFsbFVERElTZXJ2aWNlcygpCi0gIHsKLSAgICBMaXN0TWFuYWdlciB1ZGRpU2VydmljZXNfID0gKExpc3RNYW5hZ2VyKSBnZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUyk7Ci0gICAgaWYgKHVkZGlTZXJ2aWNlc18gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbml0QWxsVURESVNlcnZpY2VzKCk7Ci0gICAgICB1ZGRpU2VydmljZXNfID0gKExpc3RNYW5hZ2VyKSBnZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9TRVJWSUNFUyk7Ci0gICAgfQotICAgIHJldHVybiB1ZGRpU2VydmljZXNfOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXRBbGxXU0RMU2VydmljZXMoKQotICB7Ci0gICAgTGlzdE1hbmFnZXIgd3NkbFNlcnZpY2VzXyA9IG5ldyBMaXN0TWFuYWdlcigpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2NfLmdldEluc3BlY3Rpb24oKTsKLSAgICBTZXJ2aWNlW10gc2VydmljZUxpc3QgPSBpbnNwZWN0aW9uLmdldFNlcnZpY2VzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlTGlzdC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAvLyBza2lwIGFueSBzZXJ2aWNlIHdpdGhvdXQgYSB3c2RsIG5hbWVzcGFjZQotICAgICAgLy8gYW5kIGludmFsaWQgZGVzY3JpcHRpb25zCi0gICAgICBEZXNjcmlwdGlvbltdIGRlc2NMaXN0ID0gc2VydmljZUxpc3RbaV0uZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgICBpZiAoZGVzY0xpc3QubGVuZ3RoIDwgMSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZGVzY0xpc3RbMF0uZ2V0UmVmZXJlbmNlZE5hbWVzcGFjZSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGVsc2UgaWYgKG5hbWVzcGFjZS5lcXVhbHMoTkFNRVNQQUNFX1dTREwpKQotICAgICAgewotICAgICAgICBXc2lsV3NkbFNlcnZpY2VFbGVtZW50IHdzZGxTZXJ2aWNlRWxlbWVudCA9IG5ldyBXc2lsV3NkbFNlcnZpY2VFbGVtZW50KG5hbWVzcGFjZSwgZ2V0TW9kZWwoKSwgc2VydmljZUxpc3RbaV0pOwotICAgICAgICB3c2RsU2VydmljZUVsZW1lbnQuc2V0QmFzZVdzaWxVUkwoZ2V0V3NpbFVybCgpKTsKLSAgICAgICAgaWYgKHdzZGxTZXJ2aWNlRWxlbWVudC52YWxpZGF0ZVdTRExTZXJ2aWNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsU2VydmljZUVsZW1lbnQuc2V0TmFtZSh3c2RsU2VydmljZUVsZW1lbnQuZ2V0V1NETFNlcnZpY2VVUkwoKSk7Ci0gICAgICAgICAgd3NkbFNlcnZpY2VzXy5hZGQobmV3IExpc3RFbGVtZW50KHdzZGxTZXJ2aWNlRWxlbWVudCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9XU0RMX1NFUlZJQ0VTLCB3c2RsU2VydmljZXNfKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0QWxsVURESVNlcnZpY2VzKCkKLSAgewotICAgIExpc3RNYW5hZ2VyIHVkZGlTZXJ2aWNlc18gPSBuZXcgTGlzdE1hbmFnZXIoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jXy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgU2VydmljZVtdIHNlcnZpY2VMaXN0ID0gaW5zcGVjdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgIFZlY3RvciB1ZGRpU2VydmljZUVsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZUxpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8gc2tpcCBhbnkgc2VydmljZSB3aXRob3V0IGEgd3NkbCBuYW1lc3BhY2UKLSAgICAgIC8vIGFuZCBpbnZhbGlkIGRlc2NyaXB0aW9ucwotICAgICAgRGVzY3JpcHRpb25bXSBkZXNjTGlzdCA9IHNlcnZpY2VMaXN0W2ldLmdldERlc2NyaXB0aW9ucygpOwotICAgICAgaWYgKGRlc2NMaXN0Lmxlbmd0aCA8IDEpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlc2NMaXN0WzBdLmdldFJlZmVyZW5jZWROYW1lc3BhY2UoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBlbHNlIGlmICgobmFtZXNwYWNlLmVxdWFscyhOQU1FU1BBQ0VfVURESV9WMSkgfHwgbmFtZXNwYWNlLmVxdWFscyhOQU1FU1BBQ0VfVURESV9WMikpKQotICAgICAgewotICAgICAgICBXc2lsVWRkaVNlcnZpY2VFbGVtZW50IHVkZGlTZXJ2aWNlRWxlbWVudCA9IG5ldyBXc2lsVWRkaVNlcnZpY2VFbGVtZW50KG5hbWVzcGFjZSwgZ2V0TW9kZWwoKSwgc2VydmljZUxpc3RbaV0pOwotICAgICAgICB1ZGRpU2VydmljZUVsZW1lbnQuc2V0QmFzZVdzaWxVUkwoZ2V0V3NpbFVybCgpKTsKLSAgICAgICAgaWYgKHVkZGlTZXJ2aWNlRWxlbWVudC52YWxpZGF0ZVVERElTZXJ2aWNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpU2VydmljZUVsZW1lbnQuc2V0TmFtZSh1ZGRpU2VydmljZUVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICB1ZGRpU2VydmljZUVsZW1lbnRzLmFkZCh1ZGRpU2VydmljZUVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJlZnJlc2hTZXJ2aWNlRGVmaW5pdGlvbnNGcm9tUmVnaXN0cnkodWRkaVNlcnZpY2VFbGVtZW50cyk7Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHVkZGlTZXJ2aWNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB1ZGRpU2VydmljZXNfLmFkZChuZXcgTGlzdEVsZW1lbnQoaXQubmV4dCgpKSk7Ci0gICAgfQotICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX1NFUlZJQ0VTLCB1ZGRpU2VydmljZXNfKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hTZXJ2aWNlRGVmaW5pdGlvbnNGcm9tUmVnaXN0cnkoVmVjdG9yIHVkZGlTZXJ2aWNlRWxlbWVudHMpCi0gIHsKLSAgICBIYXNoTWFwIGlucXVpcnlBUElUb1NlcnZpY2VzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHVkZGlTZXJ2aWNlRWxlbWVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCB1ZGRpU2VydmljZUVsZW1lbnQgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCkgdWRkaVNlcnZpY2VFbGVtZW50cy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IHVkZGlTZXJ2aWNlRWxlbWVudC5nZXRVRERJU2VydmljZUlucXVpcnlBUEkoKTsKLSAgICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwoaW5xdWlyeUFQSSkpCi0gICAgICB7Ci0gICAgICAgIFZlY3RvciBzZXJ2aWNlcyA9IChWZWN0b3IpIGlucXVpcnlBUElUb1NlcnZpY2VzLmdldChpbnF1aXJ5QVBJKTsKLSAgICAgICAgaWYgKHNlcnZpY2VzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXJ2aWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICBpbnF1aXJ5QVBJVG9TZXJ2aWNlcy5wdXQoaW5xdWlyeUFQSSwgc2VydmljZXMpOwotICAgICAgICB9Ci0gICAgICAgIHNlcnZpY2VzLmFkZCh1ZGRpU2VydmljZUVsZW1lbnQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB1ZGRpU2VydmljZUVsZW1lbnQuc2V0U2VydmljZURlZmluaXRpb24obnVsbCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBpbnF1aXJ5QVBJVG9TZXJ2aWNlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBpbnF1aXJ5QVBJID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgVmVjdG9yIHNlcnZpY2VzID0gKFZlY3RvcikgaW5xdWlyeUFQSVRvU2VydmljZXMuZ2V0KGlucXVpcnlBUEkpOwotICAgICAgVURESVByb3h5IHByb3h5OwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5wdXQoQWN0aW9uSW5wdXRzLlRSQU5TUE9SVF9DTEFTU19OQU1FLCBBY3Rpb25JbnB1dHMuVFJBU1BPUlRfQ0xBU1MpOwotICAgICAgICBwcm94eSA9IG5ldyBVRERJUHJveHkocHJvcHMpOwotICAgICAgICBwcm94eS5zZXRJbnF1aXJ5VVJMKG5ldyBVUkwoaW5xdWlyeUFQSSkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNlcnZpY2VzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCB1ZGRpU2VydmljZUVsZW1lbnQgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudCkgc2VydmljZXMuZ2V0KGopOwotICAgICAgICAgIHVkZGlTZXJ2aWNlRWxlbWVudC5zZXRTZXJ2aWNlRGVmaW5pdGlvbihudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIFZlY3RvciBzZXJ2aWNlS2V5cyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2VydmljZXMuc2l6ZSgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2VLZXlzLmFkZCgoKFdzaWxVZGRpU2VydmljZUVsZW1lbnQpIHNlcnZpY2VzLmdldChqKSkuZ2V0VURESVNlcnZpY2VLZXkoKSk7Ci0gICAgICB9Ci0gICAgICBWZWN0b3IgYnVzaW5lc3NTZXJ2aWNlczsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBidXNpbmVzc1NlcnZpY2VzID0gcHJveHkuZ2V0X3NlcnZpY2VEZXRhaWwoc2VydmljZUtleXMpLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLSAgICAgIHsKLSAgICAgICAgYnVzaW5lc3NTZXJ2aWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgaWYgKHNlcnZpY2VLZXlzLnNpemUoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHNlcnZpY2VLZXlzLnNpemUoKTsgaysrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBidXNpbmVzc1NlcnZpY2VzLmFkZCgoQnVzaW5lc3NTZXJ2aWNlKSBwcm94eS5nZXRfc2VydmljZURldGFpbCgoU3RyaW5nKSBzZXJ2aWNlS2V5cy5nZXQoaykpLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpLmdldCgwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnVzaW5lc3NTZXJ2aWNlcy5hZGQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBidXNpbmVzc1NlcnZpY2VzLmFkZChudWxsKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgc2VydmljZXMuc2l6ZSgpOyBrKyspCi0gICAgICB7Ci0gICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpIGJ1c2luZXNzU2VydmljZXMuZ2V0KGspOwotICAgICAgICBXc2lsVWRkaVNlcnZpY2VFbGVtZW50IHVkZGlTZXJ2aWNlRWxlbWVudCA9IChXc2lsVWRkaVNlcnZpY2VFbGVtZW50KSBzZXJ2aWNlcy5nZXQoayk7Ci0gICAgICAgIHVkZGlTZXJ2aWNlRWxlbWVudC5zZXRTZXJ2aWNlRGVmaW5pdGlvbihicyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExpc3RNYW5hZ2VyIGdldEFsbFdTSUxMaW5rcygpCi0gIHsKLSAgICBMaXN0TWFuYWdlciB3c2lsTGlua3NfID0gKExpc3RNYW5hZ2VyKSBnZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NJTF9MSU5LUyk7Ci0gICAgaWYgKHdzaWxMaW5rc18gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbml0QWxsV1NJTExpbmtzKCk7Ci0gICAgICB3c2lsTGlua3NfID0gKExpc3RNYW5hZ2VyKSBnZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfV1NJTF9MSU5LUyk7Ci0gICAgfQotICAgIHJldHVybiB3c2lsTGlua3NfOwotICB9Ci0KLSAgcHVibGljIExpc3RNYW5hZ2VyIGdldEFsbFVERElMaW5rcygpCi0gIHsKLSAgICBMaXN0TWFuYWdlciB1ZGRpTGlua3NfID0gKExpc3RNYW5hZ2VyKSBnZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUyk7Ci0gICAgaWYgKHVkZGlMaW5rc18gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbml0QWxsVURESUxpbmtzKCk7Ci0gICAgICB1ZGRpTGlua3NfID0gKExpc3RNYW5hZ2VyKSBnZXRQcm9wZXJ0eUFzT2JqZWN0KFdzaWxNb2RlbENvbnN0YW50cy5MSVNUX01BTkFHRVJfVURESV9MSU5LUyk7Ci0gICAgfQotICAgIHJldHVybiB1ZGRpTGlua3NfOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXRBbGxVRERJTGlua3MoKQotICB7Ci0gICAgTGlzdE1hbmFnZXIgdWRkaUxpbmtzXyA9IG5ldyBMaXN0TWFuYWdlcigpOwotICAgIEluc3BlY3Rpb24gaW5zcGVjdGlvbiA9IHdzaWxEb2NfLmdldEluc3BlY3Rpb24oKTsKLSAgICBMaW5rW10gbGlua0xpc3QgPSBpbnNwZWN0aW9uLmdldExpbmtzKCk7Ci0gICAgVmVjdG9yIHVkZGlCdXNpbmVzc0VsZW1lbnRzID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua0xpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8gcHJvY2VzcyBhbnkgbGlua3Mgd2l0aCBVRERJIG5hbWVzcGFjZQotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGxpbmtMaXN0W2ldLmdldFJlZmVyZW5jZWROYW1lc3BhY2UoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBlbHNlIGlmICgobmFtZXNwYWNlLmVxdWFscyhOQU1FU1BBQ0VfVURESV9WMSkgfHwgbmFtZXNwYWNlLmVxdWFscyhOQU1FU1BBQ0VfVURESV9WMikpKQotICAgICAgewotICAgICAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCB1ZGRpQnVzaW5lc3NFbGVtZW50ID0gbmV3IFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50KG5hbWVzcGFjZSwgZ2V0TW9kZWwoKSwgbGlua0xpc3RbaV0pOwotICAgICAgICB1ZGRpQnVzaW5lc3NFbGVtZW50LnNldEJhc2VXc2lsVVJMKGdldFdzaWxVcmwoKSk7Ci0gICAgICAgIGlmICh1ZGRpQnVzaW5lc3NFbGVtZW50LnZhbGlkYXRlVURESUxpbmsoKSkKLSAgICAgICAgewotICAgICAgICAgIHVkZGlCdXNpbmVzc0VsZW1lbnQuc2V0TmFtZSh1ZGRpQnVzaW5lc3NFbGVtZW50LmdldE5hbWUoKSk7Ci0gICAgICAgICAgdWRkaUJ1c2luZXNzRWxlbWVudHMuYWRkKHVkZGlCdXNpbmVzc0VsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJlZnJlc2hTZXJ2aWNlUHJvdmlkZXJzRnJvbVJlZ2lzdHJ5KHVkZGlCdXNpbmVzc0VsZW1lbnRzKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gdWRkaUJ1c2luZXNzRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB1ZGRpTGlua3NfLmFkZChuZXcgTGlzdEVsZW1lbnQoaXQubmV4dCgpKSk7Ci0gICAgfQotICAgIHNldFByb3BlcnR5QXNPYmplY3QoV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX0xJTktTLCB1ZGRpTGlua3NfKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hTZXJ2aWNlUHJvdmlkZXJzRnJvbVJlZ2lzdHJ5KFZlY3RvciB1ZGRpQnVzaW5lc3NFbGVtZW50cykKLSAgewotICAgIEhhc2hNYXAgaW5xdWlyeUFQSVRvQnVzaW5lc3NlcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1ZGRpQnVzaW5lc3NFbGVtZW50cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCB1ZGRpQnVzaW5lc3NFbGVtZW50ID0gKFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50KSB1ZGRpQnVzaW5lc3NFbGVtZW50cy5nZXQoaSk7Ci0gICAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IHVkZGlCdXNpbmVzc0VsZW1lbnQuZ2V0VURESUxpbmtJbnF1aXJ5QVBJKCk7Ci0gICAgICBpZiAoVmFsaWRhdG9yLnZhbGlkYXRlVVJMKGlucXVpcnlBUEkpKQotICAgICAgewotICAgICAgICBWZWN0b3IgYnVzaW5lc3NlcyA9IChWZWN0b3IpIGlucXVpcnlBUElUb0J1c2luZXNzZXMuZ2V0KGlucXVpcnlBUEkpOwotICAgICAgICBpZiAoYnVzaW5lc3NlcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnVzaW5lc3NlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICBpbnF1aXJ5QVBJVG9CdXNpbmVzc2VzLnB1dChpbnF1aXJ5QVBJLCBidXNpbmVzc2VzKTsKLSAgICAgICAgfQotICAgICAgICBidXNpbmVzc2VzLmFkZCh1ZGRpQnVzaW5lc3NFbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgdWRkaUJ1c2luZXNzRWxlbWVudC5zZXRTZXJ2aWNlUHJvdmlkZXIobnVsbCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXQgPSBpbnF1aXJ5QVBJVG9CdXNpbmVzc2VzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgewotICAgICAgU3RyaW5nIGlucXVpcnlBUEkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICBWZWN0b3IgYnVzaW5lc3NlcyA9IChWZWN0b3IpIGlucXVpcnlBUElUb0J1c2luZXNzZXMuZ2V0KGlucXVpcnlBUEkpOwotICAgICAgVURESVByb3h5IHByb3h5OwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5wdXQoQWN0aW9uSW5wdXRzLlRSQU5TUE9SVF9DTEFTU19OQU1FLCBBY3Rpb25JbnB1dHMuVFJBU1BPUlRfQ0xBU1MpOwotICAgICAgICBwcm94eSA9IG5ldyBVRERJUHJveHkocHJvcHMpOwotICAgICAgICBwcm94eS5zZXRJbnF1aXJ5VVJMKG5ldyBVUkwoaW5xdWlyeUFQSSkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ1c2luZXNzZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCB1ZGRpQnVzaW5lc3NFbGVtZW50ID0gKFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50KSBidXNpbmVzc2VzLmdldChqKTsKLSAgICAgICAgICB1ZGRpQnVzaW5lc3NFbGVtZW50LnNldFNlcnZpY2VQcm92aWRlcihudWxsKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIFZlY3RvciBidXNpbmVzc0tleXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ1c2luZXNzZXMuc2l6ZSgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIGJ1c2luZXNzS2V5cy5hZGQoKChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCkgYnVzaW5lc3Nlcy5nZXQoaikpLmdldFVERElMaW5rQnVzaW5lc3NLZXkoKSk7Ci0gICAgICB9Ci0gICAgICBWZWN0b3IgYnVzaW5lc3NFbnRpdGllczsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBidXNpbmVzc0VudGl0aWVzID0gcHJveHkuZ2V0X2J1c2luZXNzRGV0YWlsKGJ1c2luZXNzS2V5cykuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCi0gICAgICB7Ci0gICAgICAgIGJ1c2luZXNzRW50aXRpZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIGlmIChidXNpbmVzc0tleXMuc2l6ZSgpID4gMSkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYnVzaW5lc3NLZXlzLnNpemUoKTsgaysrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBidXNpbmVzc0VudGl0aWVzLmFkZCgoQnVzaW5lc3NFbnRpdHkpIHByb3h5LmdldF9idXNpbmVzc0RldGFpbCgoU3RyaW5nKSBidXNpbmVzc0tleXMuZ2V0KGspKS5nZXRCdXNpbmVzc0VudGl0eVZlY3RvcigpLmdldCgwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnVzaW5lc3NFbnRpdGllcy5hZGQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBidXNpbmVzc0VudGl0aWVzLmFkZChudWxsKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgYnVzaW5lc3Nlcy5zaXplKCk7IGsrKykKLSAgICAgIHsKLSAgICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpIGJ1c2luZXNzRW50aXRpZXMuZ2V0KGspOwotICAgICAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCB1ZGRpQnVzaW5lc3NFbGVtZW50ID0gKFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50KSBidXNpbmVzc2VzLmdldChrKTsKLSAgICAgICAgdWRkaUJ1c2luZXNzRWxlbWVudC5zZXRTZXJ2aWNlUHJvdmlkZXIoYmUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0QWxsV1NJTExpbmtzKCkKLSAgewotICAgIExpc3RNYW5hZ2VyIHdzaWxMaW5rc18gPSBuZXcgTGlzdE1hbmFnZXIoKTsKLSAgICBJbnNwZWN0aW9uIGluc3BlY3Rpb24gPSB3c2lsRG9jXy5nZXRJbnNwZWN0aW9uKCk7Ci0gICAgTGlua1tdIGxpbmtMaXN0ID0gaW5zcGVjdGlvbi5nZXRMaW5rcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlua0xpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgLy8gcHJvY2VzcyBhbnkgbGlua3Mgd2l0aCBVRERJIG5hbWVzcGFjZQotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGxpbmtMaXN0W2ldLmdldFJlZmVyZW5jZWROYW1lc3BhY2UoKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBlbHNlIGlmIChuYW1lc3BhY2UuZXF1YWxzKE5BTUVTUEFDRV9XU0lMX0lOU1BFQ1RJT04pKQotICAgICAgewotICAgICAgICBXc2lsV3NpbExpbmtFbGVtZW50IHdzaWxMaW5rRWxlbWVudCA9IG5ldyBXc2lsV3NpbExpbmtFbGVtZW50KG5hbWVzcGFjZSwgZ2V0TW9kZWwoKSwgbGlua0xpc3RbaV0pOwotICAgICAgICB3c2lsTGlua0VsZW1lbnQuc2V0QmFzZVdzaWxVUkwoZ2V0V3NpbFVybCgpKTsKLSAgICAgICAgaWYgKHdzaWxMaW5rRWxlbWVudC52YWxpZGF0ZVdTSUxMaW5rKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2lsTGlua0VsZW1lbnQuc2V0TmFtZSh3c2lsTGlua0VsZW1lbnQuZ2V0V1NJTExpbmtMb2NhdGlvbigpKTsKLSAgICAgICAgICB3c2lsTGlua3NfLmFkZChuZXcgTGlzdEVsZW1lbnQod3NpbExpbmtFbGVtZW50KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgc2V0UHJvcGVydHlBc09iamVjdChXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTSUxfTElOS1MsIHdzaWxMaW5rc18pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbExpbmtFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbExpbmtFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTM1YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxMaW5rRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgTGluawotKi8KLXB1YmxpYyBjbGFzcyBXc2lsTGlua0VsZW1lbnQgZXh0ZW5kcyBXc2lsQ29tbW9uRWxlbWVudAotewotICBwcm90ZWN0ZWQgTGluayBsaW5rXzsKLQotICBwdWJsaWMgV3NpbExpbmtFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgTGluayBsaW5rKQotICB7Ci0gICAgc3VwZXIobmFtZSwgbW9kZWwpOwotICAgIGxpbmtfID0gbGluazsKLSAgfQotCi0gIHB1YmxpYyBWZWN0b3IgZ2V0TGlua0Fic3RyYWN0TGFuZ3MoKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBsaW5rXy5nZXRBYnN0cmFjdHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFic3RyYWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChhYnN0cmFjdHNbaV0uZ2V0TGFuZygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLQotICBwdWJsaWMgVmVjdG9yIGdldExpbmtBYnN0cmFjdHMoKQotICB7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgQWJzdHJhY3RbXSBhYnN0cmFjdHMgPSBsaW5rXy5nZXRBYnN0cmFjdHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFic3RyYWN0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChhYnN0cmFjdHNbaV0uZ2V0VGV4dCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFNlcnZpY2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTg4OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxTZXJ2aWNlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLk1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgU2VydmljZQotKi8KLXB1YmxpYyBjbGFzcyBXc2lsU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBXc2lsQ29tbW9uRWxlbWVudAotewotICAgIHByb3RlY3RlZCBTZXJ2aWNlIHNlcnZpY2VfOwotCi0gICAgcHVibGljIFdzaWxTZXJ2aWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihuYW1lLCBtb2RlbCk7Ci0gICAgICAgIHNlcnZpY2VfID0gc2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldFNlcnZpY2VOYW1lTGFuZ3MoKSB7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBTZXJ2aWNlTmFtZVtdIHNlcnZpY2VOYW1lcyA9IHNlcnZpY2VfLmdldFNlcnZpY2VOYW1lcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdi5hZGQoc2VydmljZU5hbWVzW2ldLmdldExhbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotCi0gICAgcHVibGljIFZlY3RvciBnZXRTZXJ2aWNlTmFtZXMoKSB7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBTZXJ2aWNlTmFtZVtdIHNlcnZpY2VOYW1lcyA9IHNlcnZpY2VfLmdldFNlcnZpY2VOYW1lcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VOYW1lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdi5hZGQoc2VydmljZU5hbWVzW2ldLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotCi0gICAgcHVibGljIFZlY3RvciBnZXRTZXJ2aWNlQWJzdHJhY3RMYW5ncygpIHsKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIEFic3RyYWN0W10gYWJzdHJhY3RzID0gc2VydmljZV8uZ2V0QWJzdHJhY3RzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWJzdHJhY3RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2LmFkZChhYnN0cmFjdHNbaV0uZ2V0TGFuZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldFNlcnZpY2VBYnN0cmFjdHMoKSB7Ci0gICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBBYnN0cmFjdFtdIGFic3RyYWN0cyA9IHNlcnZpY2VfLmdldEFic3RyYWN0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFic3RyYWN0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgdi5hZGQoYWJzdHJhY3RzW2ldLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvZGF0YW1vZGVsL1dzaWxVZGRpQnVzaW5lc3NFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2MzBkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFVkZGlCdXNpbmVzc0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi4qOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS4qOwotCi1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkRpc2NvdmVyeVVSTDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotCi0vKioKLSogVGhlIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgCi0qIGEgVURESSBzZXJ2aWNlIGluIGEgV1NJTCBkb2N1bWVudAotKi8KLXB1YmxpYyBjbGFzcyBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCBleHRlbmRzIFdzaWxMaW5rRWxlbWVudAotewotICAgIHByaXZhdGUgQnVzaW5lc3NFbnRpdHkgYnVzRW50aXR5XzsKLQotICAgIHB1YmxpYyBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIExpbmsgbGluaykgewotICAgICAgICBzdXBlcihuYW1lLCBtb2RlbCwgbGluayk7Ci0gICAgICAgIGJ1c0VudGl0eV8gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VQcm92aWRlcihCdXNpbmVzc0VudGl0eSBiZSkgewotICAgICAgYnVzRW50aXR5XyA9IGJlOwotICAgIH0KLQotICAgIHB1YmxpYyBCdXNpbmVzc0VudGl0eSBnZXRTZXJ2aWNlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBidXNFbnRpdHlfOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChidXNFbnRpdHlfICA9PSBudWxsKSA/IG51bGwgOiBidXNFbnRpdHlfLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChidXNFbnRpdHlfID09IG51bGwpID8gbnVsbCA6IGJ1c0VudGl0eV8uZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVRERJTGlua0lucXVpcnlBUEkoKSB7Ci0gICAgICAgIEJ1c2luZXNzRGVzY3JpcHRpb24gYmQgPSBnZXRWYWxpZFVERElCdXNpbmVzc0Rlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoYmQgPT0gbnVsbCkgPyBudWxsIDogYmQuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVERElMaW5rQnVzaW5lc3NLZXkoKSB7Ci0gICAgICAgIEJ1c2luZXNzRGVzY3JpcHRpb24gYmQgPSBnZXRWYWxpZFVERElCdXNpbmVzc0Rlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoYmQgPT0gbnVsbCkgPyBudWxsIDogYmQuZ2V0QnVzaW5lc3NLZXkoKS5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRVRERJTGlua0Rpc2NvdmVyeVVSTCgpIHsKLSAgICAgICAgQnVzaW5lc3NEZXNjcmlwdGlvbiBiZCA9IGdldFZhbGlkVURESUJ1c2luZXNzRGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKGJkID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBEaXNjb3ZlcnlVUkwgZGlzY292ZXJ5VVJMID0gYmQuZ2V0RGlzY292ZXJ5VVJMKCk7Ci0gICAgICAgICAgICByZXR1cm4gKGRpc2NvdmVyeVVSTCA9PSBudWxsKSA/IG51bGwgOiBkaXNjb3ZlcnlVUkwuZ2V0VGV4dCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVRERJTGluaygpIHsKLSAgICAgICAgQnVzaW5lc3NEZXNjcmlwdGlvbiBiZCA9IGdldFZhbGlkVURESUJ1c2luZXNzRGVzY3JpcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIChiZCAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJ1c2luZXNzRGVzY3JpcHRpb24gZ2V0VmFsaWRVRERJQnVzaW5lc3NEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgRXh0ZW5zaW9uRWxlbWVudCBleHRFbGVtZW50ID0gbGlua18uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgICAgICAvLyBUaGUgZXh0ZW5zaW9uIGVsZW1lbnQgb2YgYSBVRERJIGxpbmsKLSAgICAgICAgLy8gbXVzdCBiZSBhIEJ1c2luZXNzRGVzY3JpcHRpb24gZWxlbWVudAotICAgICAgICBpZiAoIShleHRFbGVtZW50IGluc3RhbmNlb2YgQnVzaW5lc3NEZXNjcmlwdGlvbikpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgLy8gQSB2YWxpZCBCdXNpbmVzc0Rlc2NyaXB0aW9uIG11c3QgaGF2ZSBhbiBpbnF1aXJ5IEFQSQotICAgICAgICBTdHJpbmcgaW5xdWlyeUFQSSA9ICgoQnVzaW5lc3NEZXNjcmlwdGlvbilleHRFbGVtZW50KS5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVVSTChpbnF1aXJ5QVBJKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAvLyBBIHZhbGlkIEJ1c2luZXNzRGVzY3JpcHRpb24gbXVzdCBoYXZlIGEgYnVzaW5lc3Mga2V5Ci0gICAgICAgIFN0cmluZyBidXNpbmVzc0tleSA9ICgoQnVzaW5lc3NEZXNjcmlwdGlvbilleHRFbGVtZW50KS5nZXRCdXNpbmVzc0tleSgpLmdldFRleHQoKTsKLSAgICAgICAgaWYgKGJ1c2luZXNzS2V5ID09IG51bGwgfHwgYnVzaW5lc3NLZXkubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICByZXR1cm4gKEJ1c2luZXNzRGVzY3JpcHRpb24pZXh0RWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsVWRkaVNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFVkZGlTZXJ2aWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDBmNzZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsVWRkaVNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5WYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLio7Ci0KLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRGlzY292ZXJ5VVJMOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBVRERJIHNlcnZpY2UgaW4gYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBXc2lsU2VydmljZUVsZW1lbnQKLXsKLSAgICBwcml2YXRlIEJ1c2luZXNzU2VydmljZSBidXNTZXJ2aWNlXzsKLQotICAgIHB1YmxpYyBXc2lsVWRkaVNlcnZpY2VFbGVtZW50KFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCwgU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIG1vZGVsLCBzZXJ2aWNlKTsKLSAgICAgICAgYnVzU2VydmljZV8gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VEZWZpbml0aW9uKEJ1c2luZXNzU2VydmljZSBidXNTZXJ2aWNlKSB7Ci0gICAgICAgIGJ1c1NlcnZpY2VfID0gYnVzU2VydmljZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVzaW5lc3NTZXJ2aWNlIGdldFNlcnZpY2VEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gYnVzU2VydmljZV87Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gKGJ1c1NlcnZpY2VfID09IG51bGwpID8gbnVsbCA6IGJ1c1NlcnZpY2VfLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChidXNTZXJ2aWNlXyA9PSBudWxsKSA/IG51bGwgOiBidXNTZXJ2aWNlXy5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVERElTZXJ2aWNlSW5xdWlyeUFQSSgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gZ2V0VmFsaWRVRERJU2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoc2QgPT0gbnVsbCkgPyBudWxsIDogc2QuZ2V0TG9jYXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVERElTZXJ2aWNlS2V5KCkgewotICAgICAgICBTZXJ2aWNlRGVzY3JpcHRpb24gc2QgPSBnZXRWYWxpZFVERElTZXJ2aWNlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgcmV0dXJuIChzZCA9PSBudWxsKSA/IG51bGwgOiBzZC5nZXRTZXJ2aWNlS2V5KCkuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VURESVNlcnZpY2VEaXNjb3ZlcnlVUkwoKSB7Ci0gICAgICAgIFNlcnZpY2VEZXNjcmlwdGlvbiBzZCA9IGdldFZhbGlkVURESVNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBpZiAoc2QgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERpc2NvdmVyeVVSTCBkaXNjb3ZlcnlVUkwgPSBzZC5nZXREaXNjb3ZlcnlVUkwoKTsKLSAgICAgICAgICAgIHJldHVybiAoZGlzY292ZXJ5VVJMID09IG51bGwpID8gbnVsbCA6IGRpc2NvdmVyeVVSTC5nZXRUZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdGlvbiBnZXRWYWxpZFVERElTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uW10gZGVzY0xpc3QgPSBzZXJ2aWNlXy5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjTGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRXh0ZW5zaW9uRWxlbWVudCBleHRFbGVtZW50ID0gZGVzY0xpc3RbaV0uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgICAgICAgICAgLy8gVGhlIGV4dGVuc2lvbiBlbGVtZW50IG9mIGEgVURESSBzZXJ2aWNlIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAvLyBtdXN0IGJlIGEgU2VydmljZURlc2NyaXB0aW9uIGVsZW1lbnQKLSAgICAgICAgICAgIGlmICghKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2aWNlRGVzY3JpcHRpb24pKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgLy8gQSB2YWxpZCBTZXJ2aWNlRGVzY3JpcHRpb24gbXVzdCBoYXZlIGFuIGlucXVpcnkgQVBJCi0gICAgICAgICAgICBpZiAoIVZhbGlkYXRvci52YWxpZGF0ZVVSTCgoKFNlcnZpY2VEZXNjcmlwdGlvbilleHRFbGVtZW50KS5nZXRMb2NhdGlvbigpKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIC8vIEEgdmFsaWQgU2VydmljZURlc2NyaXB0aW9uIG11c3QgaGF2ZSBhIHNlcnZpY2Uga2V5Ci0gICAgICAgICAgICBTdHJpbmcgc2VydmljZUtleSA9ICgoU2VydmljZURlc2NyaXB0aW9uKWV4dEVsZW1lbnQpLmdldFNlcnZpY2VLZXkoKS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZUtleSA9PSBudWxsIHx8IHNlcnZpY2VLZXkubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHJldHVybiAoU2VydmljZURlc2NyaXB0aW9uKWV4dEVsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVRERJU2VydmljZSgpIHsKLSAgICAgICAgU2VydmljZURlc2NyaXB0aW9uIHNkID0gZ2V0VmFsaWRVRERJU2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoc2QgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXc2RsVXJsKCkgewotICAgICAgICByZXR1cm4gKG5ldyBVZGRpNGpIZWxwZXIoKSkuZ2V0V1NETChnZXRTZXJ2aWNlRGVmaW5pdGlvbigpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsV3NkbFNlcnZpY2VFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFdzZGxTZXJ2aWNlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQxNWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsV3NkbFNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLio7Ci0KLS8qKgotKiBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyAKLSogYSBXU0RMIHNlcnZpY2UgaW4gYSBXU0lMIGRvY3VtZW50Ci0qLwotcHVibGljIGNsYXNzIFdzaWxXc2RsU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBXc2lsU2VydmljZUVsZW1lbnQKLXsKLSAgICBwdWJsaWMgV3NpbFdzZGxTZXJ2aWNlRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBzdXBlcihuYW1lLCBtb2RlbCwgc2VydmljZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRXU0RMU2VydmljZVVSTCgpIHsKLSAgICAgICAgRGVzY3JpcHRpb24gZGVzYyA9IGdldFZhbGlkV1NETERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHJldHVybiAoZGVzYyA9PSBudWxsKSA/IG51bGwgOiBtYWtlQWJzb2x1dGUoZGVzYy5nZXRMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldFdTRExCaW5kaW5nKCkgewotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgRGVzY3JpcHRpb25bXSBkZXNjTGlzdCA9IHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBFeHRlbnNpb25FbGVtZW50IGV4dEVsZW1lbnQgPSBkZXNjTGlzdFtpXS5nZXRFeHRlbnNpb25FbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZXh0RWxlbWVudCAhPSBudWxsICYmIGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHsKLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VkU2VydmljZSByZWZTZXJ2aWNlID0gKChSZWZlcmVuY2UpZXh0RWxlbWVudCkuZ2V0UmVmZXJlbmNlZFNlcnZpY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVmU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkKHJlZlNlcnZpY2UuZ2V0UmVmZXJlbmNlZFNlcnZpY2VOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbXBsZW1lbnRlZEJpbmRpbmdbXSBpbXBsQmluZGluZ0xpc3QgPSAoKFJlZmVyZW5jZSlleHRFbGVtZW50KS5nZXRJbXBsZW1lbnRlZEJpbmRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbXBsQmluZGluZ0xpc3QubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdi5hZGQoaW1wbEJpbmRpbmdMaXN0W2pdLmdldEJpbmRpbmdOYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBEZXNjcmlwdGlvbiBnZXRWYWxpZFdTRExEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgRGVzY3JpcHRpb25bXSBkZXNjTGlzdCA9IHNlcnZpY2VfLmdldERlc2NyaXB0aW9ucygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBza2lwIHRoaXMgZGVzY3JpcHRpb24gaWYgdGhlIGxvY2F0aW9pbiBhdHRyaWJ1dGUgaXMgYSBtYWxmb3JtZWQgVVJMCi0gICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBkZXNjTGlzdFtpXS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24ubGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIC8vIHNraXAgdGhpcyBkZXNjcmlwdGlvbiBpZiB0aGUgZXh0ZW5zaW9uIGVsZW1lbnQgaW5kaWNhdGVzCi0gICAgICAgICAgICAvLyB0aGF0IHRoZSBkZXNjcmlwdGlvbidzIGxvY2F0aW9uIGNvbnRhaW5zIG9ubHkgdGhlIHdzZGwgYmluZGluZwotICAgICAgICAgICAgRXh0ZW5zaW9uRWxlbWVudCBleHRFbGVtZW50ID0gZGVzY0xpc3RbaV0uZ2V0RXh0ZW5zaW9uRWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGV4dEVsZW1lbnQgIT0gbnVsbCAmJiBleHRFbGVtZW50IGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBlbmRwb2ludFByZXNlbnQgPSAoKFJlZmVyZW5jZSlleHRFbGVtZW50KS5nZXRFbmRwb2ludFByZXNlbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRQcmVzZW50ICE9IG51bGwgJiYgZW5kcG9pbnRQcmVzZW50LmJvb2xlYW5WYWx1ZSgpID09IGZhbHNlKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGEgdmFsaWQgZGVzY3JpcHRpb24gaXMgZm91bmQKLSAgICAgICAgICAgIHJldHVybiBkZXNjTGlzdFtpXTsKLSAgICAgICAgfQotICAgICAgICAvLyBubyB2YWxpZCBkZXNjcmlwdGlvbiBpcyBmb3VuZCBmb3IgdGhpcyBzZXJ2aWNlCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIHZhbGlkYXRlV1NETFNlcnZpY2UoKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uIGRlc2MgPSBnZXRWYWxpZFdTRExEZXNjcmlwdGlvbigpOwotICAgICAgICByZXR1cm4gKGRlc2MgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFdTRExTZXJ2aWNlVVJMKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsV3NpbExpbmtFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9kYXRhbW9kZWwvV3NpbFdzaWxMaW5rRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFlOTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL2RhdGFtb2RlbC9Xc2lsV3NpbExpbmtFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuKjsKLQotLyoqCi0qIFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIAotKiBhIFdTSUwgbGluayBpbiBhIFdTSUwgZG9jdW1lbnQKLSovCi1wdWJsaWMgY2xhc3MgV3NpbFdzaWxMaW5rRWxlbWVudCBleHRlbmRzIFdzaWxMaW5rRWxlbWVudAotewotICBwdWJsaWMgV3NpbFdzaWxMaW5rRWxlbWVudChTdHJpbmcgbmFtZSwgTW9kZWwgbW9kZWwsIExpbmsgbGluaykKLSAgewotICAgIHN1cGVyKG5hbWUsIG1vZGVsLCBsaW5rKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NJTExpbmtMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbWFrZUFic29sdXRlKGxpbmtfLmdldExvY2F0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXU0lMTGluaygpCi0gIHsKLSAgICByZXR1cm4gKGxpbmtfLmdldExvY2F0aW9uKCkgIT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRXU0lMTGlua0xvY2F0aW9uKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRCdXNpbmVzc1RvRmF2b3JpdGVzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyNDIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRCdXNpbmVzc1RvRmF2b3JpdGVzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2Zhdm9yaXRlc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZmF2b3JpdGVzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXywgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5NDUxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRCdXNpbmVzc1RvVURESVBlcnNwZWN0aXZlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZVRvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJ3c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZFNlcnZpY2VUb0Zhdm9yaXRlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZFNlcnZpY2VUb0Zhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4YzJjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRTZXJ2aWNlVG9GYXZvcml0ZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5BZGRUb0Zhdm9yaXRlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkU2VydmljZVRvRmF2b3JpdGVzVG9vbCBleHRlbmRzIEFjdGlvblRvb2wgewotICAgIHB1YmxpYyBBZGRTZXJ2aWNlVG9GYXZvcml0ZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2Zhdm9yaXRlc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZmF2b3JpdGVzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXywgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOTIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5BZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFNlcnZpY2VUb1VERElQZXJzcGVjdGl2ZVRvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgIndzaWwvaW1hZ2VzL2FkZF90b19VRERJX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIiwgIndzaWwvaW1hZ2VzL2FkZF90b19VRERJX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXywgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwMzE2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIEFkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2Zhdm9yaXRlc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZmF2b3JpdGVzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXywgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZFdTSUxUb0Zhdm9yaXRlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0FkZFdTSUxUb0Zhdm9yaXRlc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzY2I0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9BZGRXU0lMVG9GYXZvcml0ZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5BZGRUb0Zhdm9yaXRlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQWRkV1NJTFRvRmF2b3JpdGVzVG9vbCBleHRlbmRzIEFjdGlvblRvb2wgewotICAgIHB1YmxpYyBBZGRXU0lMVG9GYXZvcml0ZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2Zhdm9yaXRlc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZmF2b3JpdGVzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxULCBBY3Rpb25JbnB1dHMuVklFV1RPT0xJRF9ERUZBVUxUKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0NsZWFyV1NJTFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0NsZWFyV1NJTFRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjYzVmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9DbGVhcldTSUxUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5DbGVhcldTSUxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIENsZWFyV1NJTFRvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgQ2xlYXJXU0lMVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIsICJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIHJldHVybiBDbGVhcldTSUxBY3Rpb24uZ2V0QWN0aW9uTGluayh0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVJZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9JbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3MTA1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9JbXBvcnRXU0RMVG9GaWxlU3lzdGVtVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkltcG9ydFRvRmlsZVN5c3RlbVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wgZXh0ZW5kcyBJbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sIHsKLSAgICBwdWJsaWMgSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXywgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvSW1wb3J0V1NJTFRvRmlsZVN5c3RlbVRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0ltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1Ub29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMDBjMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvSW1wb3J0V1NJTFRvRmlsZVN5c3RlbVRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuQWN0aW9uSW5wdXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5JbXBvcnRUb0ZpbGVTeXN0ZW1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1Ub29sIGV4dGVuZHMgSW1wb3J0VG9GaWxlU3lzdGVtVG9vbCB7Ci0gICAgcHVibGljIEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1Ub29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgcmV0dXJuIEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVJZCgpLCB0b29sSWRfLCBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQsIEFjdGlvbklucHV0cy5WSUVXVE9PTElEX0RFRkFVTFQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFVERElCdXNpbmVzc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0xpc3RVRERJQnVzaW5lc3NUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTg2NjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFVERElCdXNpbmVzc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5WaWV3VG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgTGlzdFVERElCdXNpbmVzc1Rvb2wgZXh0ZW5kcyBWaWV3VG9vbCB7Ci0gICAgcHVibGljIExpc3RVRERJQnVzaW5lc3NUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAid3NpbC9pbWFnZXMvbGlzdF9idXNpbmVzc19lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9saXN0X2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkU2V0RGVmYXVsdFZpZXdUb29sKFRvb2xNYW5hZ2VyIHZpZXdUb29sTWFuYWdlciwgaW50IGluZGV4KSB7Ci0gICAgICAgIG5ldyBXc2lsU2V0RGVmYXVsdFZpZXdUb29sKHZpZXdUb29sTWFuYWdlciwgIHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0TWVzc2FnZSgiQUxUX0JBQ0tfVE9fVE9QIikpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvb2xzKFRvb2xNYW5hZ2VyIHZpZXdUb29sTWFuYWdlciwgaW50IGluZGV4KSB7Ci0gICAgICAgIG5ldyBVZGRpQnVzaW5lc3NEZXRhaWxzVG9vbCh2aWV3VG9vbE1hbmFnZXIsIHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRDb250cm9sbGVyKCkuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiQUxUX1VERElfTElOS19ERVRBSUxTIikpOwotICAgICAgICBuZXcgQWRkQnVzaW5lc3NUb1VERElQZXJzcGVjdGl2ZVRvb2wodmlld1Rvb2xNYW5hZ2VyLCB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIkFMVF9BRERfQlVTSU5FU1NfVE9fVURESV9QRVJTUEVDVElWRSIpKTsKLSAgICAgICAgbmV3IEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNUb29sKHZpZXdUb29sTWFuYWdlciwgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlKCJBTFRfQUREX1VERElfQlVTSU5FU1NfVE9fRkFWT1JJVEVTIikpOwotICAgICAgICBuZXcgUmVmcmVzaFVERElCdXNpbmVzc1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIkFMVF9SRUZSRVNIX1VERElfQlVTSU5FU1MiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpIHsKLSAgICAgICAgcmV0dXJuIFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygid3NpbC92aWV3cy9VZGRpQnVzaW5lc3NWaWV3LmpzcCIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0xpc3RVRERJU2VydmljZXNUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9MaXN0VURESVNlcnZpY2VzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjViYzE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0xpc3RVRERJU2VydmljZXNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVmlld1Rvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5Xc2lsU2V0RGVmYXVsdFZpZXdUb29sOwotCi1wdWJsaWMgY2xhc3MgTGlzdFVERElTZXJ2aWNlc1Rvb2wgZXh0ZW5kcyBWaWV3VG9vbCB7Ci0gICAgcHVibGljIExpc3RVRERJU2VydmljZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAid3NpbC9pbWFnZXMvbGlzdF9VRERJX3NlcnZpY2VfZW5hYmxlZC5naWYiLCAid3NpbC9pbWFnZXMvbGlzdF9VRERJX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZXREZWZhdWx0Vmlld1Rvb2woVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgbmV3IFdzaWxTZXREZWZhdWx0Vmlld1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCAgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJBTFRfQkFDS19UT19UT1AiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9vbHMoVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBVZGRpU2VydmljZURldGFpbHNUb29sKHZpZXdUb29sTWFuYWdlciwgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0lMX1NFUlZJQ0VfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IFdzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sKHZpZXdUb29sTWFuYWdlciwgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIikpOwotICAgICAgICBuZXcgSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wodmlld1Rvb2xNYW5hZ2VyLCBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0lNUE9SVF9UT19GUyIpKTsKLSAgICAgICAgbmV3IFdzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbCh2aWV3VG9vbE1hbmFnZXIsIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQiKSk7Ci0gICAgICAgIG5ldyBBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVUb29sKHZpZXdUb29sTWFuYWdlciwgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfU0VSVklDRV9UT19VRERJX1BFUlNQRUNUSVZFIikpOwotICAgICAgICBuZXcgQWRkU2VydmljZVRvRmF2b3JpdGVzVG9vbCh2aWV3VG9vbE1hbmFnZXIsIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQUREX1NFUlZJQ0VfVE9fRkFWT1JJVEVTIikpOwotICAgICAgICBuZXcgUmVmcmVzaFVERElTZXJ2aWNlVG9vbCh2aWV3VG9vbE1hbmFnZXIsIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfUkVGUkVTSF9VRERJX1NFUlZJQ0UiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpIHsKLSAgICAgICAgcmV0dXJuIFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluaygid3NpbC92aWV3cy9VZGRpU2VydmljZXNWaWV3LmpzcCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFdTRExTZXJ2aWNlc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0xpc3RXU0RMU2VydmljZXNUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNTFmMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFdTRExTZXJ2aWNlc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVmlld1Rvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5Xc2lsU2V0RGVmYXVsdFZpZXdUb29sOwotCi1wdWJsaWMgY2xhc3MgTGlzdFdTRExTZXJ2aWNlc1Rvb2wgZXh0ZW5kcyBWaWV3VG9vbCB7Ci0gICAgcHVibGljIExpc3RXU0RMU2VydmljZXNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAid3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfZW5hYmxlZC5naWYiLCAid3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZXREZWZhdWx0Vmlld1Rvb2woVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgbmV3IFdzaWxTZXREZWZhdWx0Vmlld1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCAgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJBTFRfQkFDS19UT19UT1AiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9vbHMoVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBXc2RsU2VydmljZURldGFpbHNUb29sKHZpZXdUb29sTWFuYWdlciwgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0lMX1NFUlZJQ0VfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IFdzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sKHZpZXdUb29sTWFuYWdlciwgY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIikpOwotICAgICAgICBuZXcgSW1wb3J0V1NETFRvRmlsZVN5c3RlbVRvb2wodmlld1Rvb2xNYW5hZ2VyLCBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0lNUE9SVF9UT19GUyIpKTsKLSAgICAgICAgbmV3IFdzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbCh2aWV3VG9vbE1hbmFnZXIsIGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQiKSk7Ci0gICAgICAgIG5ldyBXc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sKHZpZXdUb29sTWFuYWdlciwgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFIikpOwotICAgICAgICBuZXcgQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9XU0RMX1NFUlZJQ0VfVE9fRkFWT1JJVEVTIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC92aWV3cy9Xc2RsU2VydmljZXNWaWV3LmpzcCI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFdTSUxMaW5rc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL0xpc3RXU0lMTGlua3NUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZTUyZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvTGlzdFdTSUxMaW5rc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVmlld1Rvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIExpc3RXU0lMTGlua3NUb29sIGV4dGVuZHMgVmlld1Rvb2wgewotICAgIHB1YmxpYyBMaXN0V1NJTExpbmtzVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgIndzaWwvaW1hZ2VzL2xpc3RfV1NJTF9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9saXN0X1dTSUxfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTZXREZWZhdWx0Vmlld1Rvb2woVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgbmV3IFdzaWxTZXREZWZhdWx0Vmlld1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCAgdG9vbE1hbmFnZXJfLmdldE5vZGUoKS5nZXROb2RlTWFuYWdlcigpLmdldENvbnRyb2xsZXIoKS5nZXRNZXNzYWdlKCJBTFRfQkFDS19UT19UT1AiKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9vbHMoVG9vbE1hbmFnZXIgdmlld1Rvb2xNYW5hZ2VyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgbmV3IFdzaWxMaW5rRGV0YWlsc1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIkFMVF9XU0lMX0xJTktfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IE9wZW5XU0lMTGlua1Rvb2wodmlld1Rvb2xNYW5hZ2VyLCB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Q29udHJvbGxlcigpLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIkFMVF9PUEVOX1dTSUxfTElOSyIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzaWwvdmlld3MvV3NpbExpbmtzVmlldy5qc3AiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL09wZW5XU0lMTGlua1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL09wZW5XU0lMTGlua1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjNjFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9PcGVuV1NJTExpbmtUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5PcGVuV1NJTExpbmtBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIE9wZW5XU0lMTGlua1Rvb2wgZXh0ZW5kcyBBY3Rpb25Ub29sIHsKLSAgICBwdWJsaWMgT3BlbldTSUxMaW5rVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgIndzaWwvaW1hZ2VzL29wZW5fd3NpbF9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9vcGVuX3dzaWxfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIE9wZW5XU0lMTGlua0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL09wZW5XU0lMVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvT3BlbldTSUxUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDUwMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvT3BlbldTSUxUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBPcGVuV1NJTFRvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIE9wZW5XU0lMVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgIndzaWwvaW1hZ2VzL29wZW5fd3NpbF9lbmFibGVkLmdpZiIsICJ3c2lsL2ltYWdlcy9vcGVuX3dzaWxfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0RGVmYXVsdFByb3BlcnRpZXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGb3JtTGluaygpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL2Zvcm1zL09wZW5XU0lMRm9ybS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvUmVmcmVzaFVERElCdXNpbmVzc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1JlZnJlc2hVRERJQnVzaW5lc3NUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjJhODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvUmVmcmVzaFVERElCdXNpbmVzc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5BY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlJlZnJlc2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFJlZnJlc2hVRERJQnVzaW5lc3NUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIFJlZnJlc2hVRERJQnVzaW5lc3NUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFJlZnJlc2hBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9SZWZyZXNoVURESVNlcnZpY2VUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9SZWZyZXNoVURESVNlcnZpY2VUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTg3OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvUmVmcmVzaFVERElTZXJ2aWNlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFVERElTZXJ2aWNlVG9vbCBleHRlbmRzIEFjdGlvblRvb2wgewotICAgIHB1YmxpYyBSZWZyZXNoVURESVNlcnZpY2VUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkxpbmsoKSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFJlZnJlc2hBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9SZWZyZXNoV1NJTFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1JlZnJlc2hXU0lMVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzYzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1JlZnJlc2hXU0lMVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkFjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVmcmVzaFdTSUxUb29sIGV4dGVuZHMgQWN0aW9uVG9vbCB7Ci0gICAgcHVibGljIFJlZnJlc2hXU0lMVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIiwgImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sSWQoKSwgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgICAgICByZXR1cm4gUmVmcmVzaEFjdGlvbi5nZXRBY3Rpb25MaW5rKHRvb2xNYW5hZ2VyXy5nZXROb2RlKCkuZ2V0Tm9kZUlkKCksIHRvb2xJZF8sIEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCwgQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9VZGRpQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvVWRkaUJ1c2luZXNzRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkYjE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9VZGRpQnVzaW5lc3NEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgVWRkaUJ1c2luZXNzRGV0YWlsc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIFVkZGlCdXNpbmVzc0RldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzaWwvZm9ybXMvVWRkaUJ1c2luZXNzRGV0YWlsc1BhZ2UuanNwIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1VkZGlTZXJ2aWNlRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1VkZGlTZXJ2aWNlRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzZjVjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9VZGRpU2VydmljZURldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBVZGRpU2VydmljZURldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotICAgIHB1YmxpYyBVZGRpU2VydmljZURldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzaWwvZm9ybXMvVWRkaVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjhlYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaFRvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5JbXBvcnRUb1dvcmtiZW5jaFRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoVG9vbCBleHRlbmRzIEltcG9ydFRvV29ya2JlbmNoVG9vbAotewotICBwdWJsaWMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpCi0gIHsKLSAgICBzdXBlcih0b29sTWFuYWdlciwgYWx0KTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KQotICB7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgdG9vbElkXywgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpLCBmb3JIaXN0b3J5KTsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9ybUxpbmsoKQotICB7Ci0gICAgcmV0dXJuICJ3c2lsL2Zvcm1zL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hGb3JtLmpzcCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dTSUxQZXJzcGVjdGl2ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV1NJTFBlcnNwZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTI2ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV1NJTFBlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbC5CYXNpY01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC4qOwotCi1wdWJsaWMgY2xhc3MgV1NJTFBlcnNwZWN0aXZlIGV4dGVuZHMgUGVyc3BlY3RpdmUKLXsKLSAgICBwcml2YXRlIEJhc2ljTW9kZWwgbW9kZWxfOwotICAgIHByaXZhdGUgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXJfOwotICAgIHByaXZhdGUgU3RyaW5nIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICAgIHByaXZhdGUgU3RyaW5nIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICAgIHByaXZhdGUgU3RyaW5nIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c187Ci0KLSAgICBwdWJsaWMgV1NJTFBlcnNwZWN0aXZlKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHN1cGVyKCJ3c2lsIixjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBpbml0UGVyc3BlY3RpdmUoU2VydmxldENvbnRleHQgYXBwbGljYXRpb24pCi0gICAgewotICAgICAgICBtb2RlbF8gPSBuZXcgQmFzaWNNb2RlbCgiV3NpbE1vZGVsIik7Ci0gICAgICAgIFRyZWVFbGVtZW50IHRyZWVFbGVtZW50ID0gbmV3IFRyZWVFbGVtZW50KGdldE1lc3NhZ2UoIldTSUxfTUFJTl9OT0RFIiksIG1vZGVsXyk7Ci0gICAgICAgIG1vZGVsXy5zZXRSb290RWxlbWVudCh0cmVlRWxlbWVudCk7Ci0gICAgICAgIG5vZGVNYW5hZ2VyXyA9IG5ldyBOb2RlTWFuYWdlcihjb250cm9sbGVyXyk7Ci0gICAgICAgIFdzaWxNYWluTm9kZSB3c2lsTWFpbk5vZGUgPSBuZXcgV3NpbE1haW5Ob2RlKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlcl8pOwotICAgICAgICBub2RlTWFuYWdlcl8uc2V0Um9vdE5vZGUod3NpbE1haW5Ob2RlKTsKLQotICAgICAgICAvLyBTdGFydGluZyBmcmFtZXNldCBzaXplcy4KLSAgICAgICAgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9ICIzMCUsKiI7Ci0gICAgICAgIHNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXyA9IHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc187Ci0gICAgICAgIGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfID0gIjc1JSwqIjsKLSAgICAgICAgc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IGFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3NfOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlTWFuYWdlciBnZXROb2RlTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIG5vZGVNYW5hZ2VyXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBlcnNwZWN0aXZlQ29udGVudFBhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL3dzaWxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UGVyc3BlY3RpdmVJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYW5lc0ZpbGUoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZyYW1lc2V0c0ZpbGUoKQotICAgIHsKLSAgICAgIHJldHVybiAid3NpbC9zY3JpcHRzL3dzaWxmcmFtZXNldHMuanNwIjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9jZXNzRnJhbWVzZXRzRm9ybSgpCi0gICAgewotICAgICAgcmV0dXJuICJ3c2lsL2Zvcm1zL1Byb2Nlc3NXU0lMRnJhbWVzZXRzRm9ybS5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbE5hdmlnYXRvckNvbnRlbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHJlZUNvbnRlbnRQYWdlKCkgewotICAgICAgICByZXR1cm4gIndzaWwvd3NpbF9uYXZpZ2F0b3JfY29udGVudC5qc3AiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsUHJvcGVydGllc0NvbnRhaW5lciI7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpIHsKLSAgICAgICAgcmV0dXJuICJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXR1c0NvbnRlbnRWYXIoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbFN0YXR1c0NvbnRlbnQiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKFN0cmluZyBjb2xzKQotICAgIHsKLSAgICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFNhdmVkUGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2F2ZWRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHNfOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scyhTdHJpbmcgY29scykKLSAgICB7Ci0gICAgICBzYXZlZFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29sc18gPSBjb2xzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKQotICAgIHsKLSAgICAgIHJldHVybiBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cyhTdHJpbmcgcm93cykKLSAgICB7Ci0gICAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXyA9IHJvd3M7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzXzsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U2F2ZWRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKFN0cmluZyByb3dzKQotICAgIHsKLSAgICAgIHNhdmVkQWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93c18gPSByb3dzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFN3aXRjaFBlcnNwZWN0aXZlRm9ybUFjdGlvbkxpbmsoaW50IHRhcmdldFBlcnNwZWN0aXZlSWQsYm9vbGVhbiBmb3JIaXN0b3J5KQotICAgIHsKLSAgICAgIHJldHVybiBTd2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0lMQWN0aW9uLmdldEZvcm1BY3Rpb25MaW5rKHRhcmdldFBlcnNwZWN0aXZlSWQsZm9ySGlzdG9yeSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NkbFNlcnZpY2VEZXRhaWxzVG9vbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NkbFNlcnZpY2VEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZkZmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzZGxTZXJ2aWNlRGV0YWlsc1Rvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFdzZGxTZXJ2aWNlRGV0YWlsc1Rvb2wgZXh0ZW5kcyBGb3JtVG9vbCB7Ci0gICAgcHVibGljIFdzZGxTZXJ2aWNlRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC9mb3Jtcy9Xc2RsU2VydmljZURldGFpbHNQYWdlLmpzcCI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YmNhYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCBleHRlbmRzIEFkZFRvV1NETFBlcnNwZWN0aXZlVG9vbCB7Ci0KLSAgcHVibGljIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZVRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICBzdXBlcih0b29sTWFuYWdlcixhbHQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8sIGZvckhpc3RvcnkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25MaW5rKCkgewotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICByZXR1cm4gV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHRvb2xJZF8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxEZXRhaWxzVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWVjYjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxEZXRhaWxzVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgV3NpbERldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotICAgIHB1YmxpYyBXc2lsRGV0YWlsc1Rvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsICJpbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiIsICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCB0b29sSWRfLCBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbElkKCksIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybUxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAid3NpbC9mb3Jtcy9Xc2lsRGV0YWlsc1BhZ2UuanNwIjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzcxMjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuSW1wb3J0VG9Xb3JrYmVuY2hUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaFRvb2wgZXh0ZW5kcyBJbXBvcnRUb1dvcmtiZW5jaFRvb2wgewotICAgIHB1YmxpYyBXc2lsSW1wb3J0V1NETFRvV29ya2JlbmNoVG9vbChUb29sTWFuYWdlciB0b29sTWFuYWdlciwgU3RyaW5nIGFsdCkgewotICAgICAgICBzdXBlcih0b29sTWFuYWdlciwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldEZvcm1MaW5rKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIndzaWwvZm9ybXMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDMxMTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkxhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRUb29sIGV4dGVuZHMgTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2wgewotICAgIHB1YmxpYyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZFRvb2woVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIsIFN0cmluZyBhbHQpIHsKLSAgICAgICAgc3VwZXIodG9vbE1hbmFnZXIsIGFsdCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RUb29sQWN0aW9uSHJlZihib29sZWFuIGZvckhpc3RvcnkpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSwgdG9vbElkXywgZm9ySGlzdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRGb3JtTGluaygpCi0gICAgewotICAgICAgcmV0dXJuICJ3c2lsL2Zvcm1zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxMaW5rRGV0YWlsc1Rvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxMaW5rRGV0YWlsc1Rvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2NTQwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsTGlua0RldGFpbHNUb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuRm9ybVRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlRvb2xNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBXc2lsTGlua0RldGFpbHNUb29sIGV4dGVuZHMgRm9ybVRvb2wgewotICAgIHB1YmxpYyBXc2lsTGlua0RldGFpbHNUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCAiaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYiLCAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIiwgYWx0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdFRvb2xBY3Rpb25IcmVmKGJvb2xlYW4gZm9ySGlzdG9yeSkgewotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IHRvb2xNYW5hZ2VyXy5nZXROb2RlKCk7Ci0gICAgICAgIHJldHVybiBTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpLCB0b29sSWRfLCBmb3JIaXN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1MaW5rKCkgewotICAgICAgICByZXR1cm4gIndzaWwvZm9ybXMvV3NpbExpbmtEZXRhaWxzUGFnZS5qc3AiOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbE1haW5Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsTWFpbk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4OTI5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsTWFpbk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbE1vZGVsQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgV3NpbE1haW5Ob2RlIGV4dGVuZHMgV3NpbE5hdmlnYXRvck5vZGUgewotCi0gICAgcHVibGljIFdzaWxNYWluTm9kZShUcmVlRWxlbWVudCB0cmVlRWxlbWVudCwgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIpIHsKLSAgICAgICAgc3VwZXIodHJlZUVsZW1lbnQsIG5vZGVNYW5hZ2VyLCAxLCAiaW1hZ2VzL3Jvb3RfbWFpbi5naWYiKTsKLSAgICAgICAgdHJlZUVsZW1lbnQuYWRkTGlzdGVuZXIobmV3IEVsZW1lbnRBZGFwdGVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsQWRkZWQoUmVsQWRkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVsID0gZXZlbnQuZ2V0T3V0Qm91bmRSZWxOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbC5lcXVhbHMoV3NpbE1vZGVsQ29uc3RhbnRzLlJFTF9XU0lMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXc2lsTm9kZSB3c2lsTm9kZSA9IG5ldyBXc2lsTm9kZSgoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0UGFyZW50RWxlbWVudCgpLCBub2RlTWFuYWdlcl8sIG5vZGVEZXB0aF8gKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2hpbGQod3NpbE5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZChSZWxSZW1vdmVFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEluQm91bmRSZWxOYW1lKCkuZXF1YWxzKFdzaWxNb2RlbENvbnN0YW50cy5SRUxfV1NJTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRFbGVtZW50ID0gKFRyZWVFbGVtZW50KWV2ZW50LmdldEluYm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5nZXRPdXRCb3VuZFJlbE5hbWUoKS5lcXVhbHMoV3NpbE1vZGVsQ29uc3RhbnRzLlJFTF9XU0lMKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSAoVHJlZUVsZW1lbnQpZXZlbnQuZ2V0T3V0Qm91bmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkTm9kZShjaGlsZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0VG9vbHMoKSB7Ci0gICAgICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBub2RlTWFuYWdlcl8uZ2V0Q29udHJvbGxlcigpLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgICAgICBuZXcgT3BlbldTSUxUb29sKHRvb2xNYW5hZ2VyXywgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9PUEVOX1dTSUwiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbE5hdmlnYXRvck5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxOYXZpZ2F0b3JOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMjI5NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbE5hdmlnYXRvck5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTE5vZGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5Xc2lsVG9nZ2xlTm9kZUFjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdzaWxOYXZpZ2F0b3JOb2RlIGV4dGVuZHMgTm9kZSB7Ci0KLSAgICBwdWJsaWMgV3NpbE5hdmlnYXRvck5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoLCBTdHJpbmcgaW1hZ2VQYXRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCBpbWFnZVBhdGgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VG9nZ2xlTm9kZUFjdGlvbkhyZWYoKSB7Ci0gICAgICAgIHJldHVybiBXc2lsVG9nZ2xlTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZF8saXNPcGVuXyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaW5rQWN0aW9uSHJlZigpIHsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkXywgZmFsc2UpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3BlcnNwZWN0aXZlL1dzaWxOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODY5ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGVNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgV3NpbE5vZGUgZXh0ZW5kcyBXc2lsTmF2aWdhdG9yTm9kZSB7Ci0KLSAgICBwdWJsaWMgV3NpbE5vZGUoVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQsIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyLCBpbnQgbm9kZURlcHRoKSB7Ci0gICAgICAgIHN1cGVyKHRyZWVFbGVtZW50LCBub2RlTWFuYWdlciwgbm9kZURlcHRoLCAid3NpbC9pbWFnZXMvd3NpbF9ub2RlLmdpZiIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGluaXRUb29scygpIHsKLSAgICAgICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbm9kZU1hbmFnZXJfLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgIG5ldyBXc2lsRGV0YWlsc1Rvb2wodG9vbE1hbmFnZXJfLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1dTSUxfREVUQUlMUyIpKTsKLSAgICAgICAgbmV3IExpc3RXU0RMU2VydmljZXNUb29sKHRvb2xNYW5hZ2VyXywgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX1dTRExfU0VSVklDRVMiKSk7Ci0gICAgICAgIG5ldyBMaXN0VURESVNlcnZpY2VzVG9vbCh0b29sTWFuYWdlcl8sIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9VRERJX1NFUlZJQ0VTIikpOwotICAgICAgICBuZXcgTGlzdFVERElCdXNpbmVzc1Rvb2wodG9vbE1hbmFnZXJfLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfVURESV9MSU5LUyIpKTsKLSAgICAgICAgbmV3IExpc3RXU0lMTGlua3NUb29sKHRvb2xNYW5hZ2VyXywgd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX1dTSUxfTElOS1MiKSk7Ci0gICAgICAgIG5ldyBXU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoVG9vbCh0b29sTWFuYWdlcl8sIHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBVExfSU1QT1JUX1dTSUxfVE9fV09SS0JFTkNIIikpOwotICAgICAgICBuZXcgSW1wb3J0V1NJTFRvRmlsZVN5c3RlbVRvb2wodG9vbE1hbmFnZXJfLCBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9XU0lMX0lNUE9SVF9UT19GUyIpKTsKLSAgICAgICAgbmV3IEFkZFdTSUxUb0Zhdm9yaXRlc1Rvb2wodG9vbE1hbmFnZXJfLCB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0FERF9XU0lMX1RPX0ZBVk9SSVRFUyIpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsU2V0RGVmYXVsdFZpZXdUb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC9wZXJzcGVjdGl2ZS9Xc2lsU2V0RGVmYXVsdFZpZXdUb29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjYzMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci1zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzaWwvcGVyc3BlY3RpdmUvV3NpbFNldERlZmF1bHRWaWV3VG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNldERlZmF1bHRWaWV3VG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuVG9vbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIFdzaWxTZXREZWZhdWx0Vmlld1Rvb2wgZXh0ZW5kcyBTZXREZWZhdWx0Vmlld1Rvb2wgewotICAgIHB1YmxpYyBXc2lsU2V0RGVmYXVsdFZpZXdUb29sKFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyLCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIHN1cGVyKHRvb2xNYW5hZ2VyLCBhbHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoYm9vbGVhbiBmb3JIaXN0b3J5KSB7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gdG9vbE1hbmFnZXJfLmdldE5vZGUoKTsKLSAgICAgICAgcmV0dXJuIFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQsIEFjdGlvbklucHV0cy5WSUVXVE9PTElEX0RFRkFVTFQsIGZvckhpc3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uTGluaygpIHsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB0b29sTWFuYWdlcl8uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCwgQWN0aW9uSW5wdXRzLlZJRVdUT09MSURfREVGQVVMVCwgZmFsc2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3RyYW5zZm9ybWVyL1dTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXItc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2lsL3RyYW5zZm9ybWVyL1dTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NWQyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyLXNyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NpbC90cmFuc2Zvcm1lci9XU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC50cmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUudHJhbnNmb3JtZXIuVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ub29sTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbE1vZGVsQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC5Xc2lsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0VURESUJ1c2luZXNzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0VURESVNlcnZpY2VzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0V1NETFNlcnZpY2VzVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5MaXN0V1NJTExpbmtzVG9vbDsKLQotcHVibGljIGNsYXNzIFdTSUxWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIgZXh0ZW5kcyBWaWV3U2VsZWN0aW9uVHJhbnNmb3JtZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIE5PTkUgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgV1NETF9TRVJWSUNFID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFVERElfU0VSVklDRSA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBVRERJX0JVU0lORVNTID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFdTSUxfTElOSyA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBGUk9NX1RPT0xJRCA9IDU7Ci0gIHByaXZhdGUgYnl0ZSB0eXBlOwotCi0gIHB1YmxpYyBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKENvbnRyb2xsZXIgY29udHJvbGxlcikKLSAgewotICAgIHRoaXMoY29udHJvbGxlciwgIiIsIEFjdGlvbklucHV0cy5WSUVXSUQsIEZST01fVE9PTElEKTsKLSAgfQotCi0gIHB1YmxpYyBXU0lMVmlld1NlbGVjdGlvblRyYW5zZm9ybWVyKENvbnRyb2xsZXIgY29udHJvbGxlciwgU3RyaW5nIGxpc3RNYW5hZ2VyS2V5LCBTdHJpbmcgdmlld0tleSwgYnl0ZSB0eXBlKQotICB7Ci0gICAgc3VwZXIoY29udHJvbGxlciwgbGlzdE1hbmFnZXJLZXksIHZpZXdLZXkpOwotICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgSGFzaHRhYmxlIG5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIGlmICh0eXBlID09IEZST01fVE9PTElEKQotICAgIHsKLSAgICAgIE5vZGUgY3Vyck5vZGUgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICBpZiAoY3Vyck5vZGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgdG9vbElkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChBY3Rpb25JbnB1dHMuVE9PTElEKSk7Ci0gICAgICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXIgPSBjdXJyTm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgICAgICAgIFRvb2wgdG9vbCA9IHRvb2xNYW5hZ2VyLmdldFRvb2wodG9vbElkKTsKLSAgICAgICAgICBpZiAodG9vbCBpbnN0YW5jZW9mIExpc3RXU0RMU2VydmljZXNUb29sKQotICAgICAgICAgICAgbGlzdE1hbmFnZXJLZXkgPSBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTRExfU0VSVklDRVM7Ci0gICAgICAgICAgZWxzZSBpZiAodG9vbCBpbnN0YW5jZW9mIExpc3RVRERJU2VydmljZXNUb29sKQotICAgICAgICAgICAgbGlzdE1hbmFnZXJLZXkgPSBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfU0VSVklDRVM7Ci0gICAgICAgICAgZWxzZSBpZiAodG9vbCBpbnN0YW5jZW9mIExpc3RVRERJQnVzaW5lc3NUb29sKQotICAgICAgICAgICAgbGlzdE1hbmFnZXJLZXkgPSBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1VERElfTElOS1M7Ci0gICAgICAgICAgZWxzZSBpZiAodG9vbCBpbnN0YW5jZW9mIExpc3RXU0lMTGlua3NUb29sKQotICAgICAgICAgICAgbGlzdE1hbmFnZXJLZXkgPSBXc2lsTW9kZWxDb25zdGFudHMuTElTVF9NQU5BR0VSX1dTSUxfTElOS1M7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VwZXIubm9ybWFsaXplKHByb3BlcnRpZXMpOwotICB9Ci0KLSAgcHVibGljIEhhc2h0YWJsZSBkZU5vcm1hbGl6ZShIYXNodGFibGUgcHJvcGVydGllcykKLSAgewotICAgIE5vZGUgY3Vyck5vZGUgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgaWYgKGN1cnJOb2RlICE9IG51bGwpCi0gICAgewotICAgICAgVHJlZUVsZW1lbnQgY3VyckVsZW1lbnQgPSBjdXJyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgaWYgKGN1cnJFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIFdzaWxFbGVtZW50IHdzaWxFbGVtZW50ID0gKFdzaWxFbGVtZW50KSBjdXJyRWxlbWVudDsKLSAgICAgICAgc3dpdGNoICh0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBXU0RMX1NFUlZJQ0UgOgotICAgICAgICAgICAgd3NpbEVsZW1lbnQuZ2V0QWxsV1NETFNlcnZpY2VzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFVERElfU0VSVklDRSA6Ci0gICAgICAgICAgICB3c2lsRWxlbWVudC5nZXRBbGxVRERJU2VydmljZXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVURESV9CVVNJTkVTUyA6Ci0gICAgICAgICAgICB3c2lsRWxlbWVudC5nZXRBbGxVRERJTGlua3MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgV1NJTF9MSU5LIDoKLSAgICAgICAgICAgIHdzaWxFbGVtZW50LmdldEFsbFdTSUxMaW5rcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBGUk9NX1RPT0xJRCA6Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW50IHRvb2xJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgcHJvcGVydGllcy5nZXQoQWN0aW9uSW5wdXRzLlRPT0xJRCkpOwotICAgICAgICAgICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlciA9IGN1cnJOb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgIFRvb2wgdG9vbCA9IHRvb2xNYW5hZ2VyLmdldFRvb2wodG9vbElkKTsKLSAgICAgICAgICAgICAgaWYgKHRvb2wgaW5zdGFuY2VvZiBMaXN0V1NETFNlcnZpY2VzVG9vbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RNYW5hZ2VyS2V5ID0gV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9XU0RMX1NFUlZJQ0VTOwotICAgICAgICAgICAgICAgIHdzaWxFbGVtZW50LmdldEFsbFdTRExTZXJ2aWNlcygpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKHRvb2wgaW5zdGFuY2VvZiBMaXN0VURESVNlcnZpY2VzVG9vbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RNYW5hZ2VyS2V5ID0gV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX1NFUlZJQ0VTOwotICAgICAgICAgICAgICAgIHdzaWxFbGVtZW50LmdldEFsbFVERElTZXJ2aWNlcygpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKHRvb2wgaW5zdGFuY2VvZiBMaXN0VURESUJ1c2luZXNzVG9vbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RNYW5hZ2VyS2V5ID0gV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9VRERJX0xJTktTOwotICAgICAgICAgICAgICAgIHdzaWxFbGVtZW50LmdldEFsbFVERElMaW5rcygpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKHRvb2wgaW5zdGFuY2VvZiBMaXN0V1NJTExpbmtzVG9vbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxpc3RNYW5hZ2VyS2V5ID0gV3NpbE1vZGVsQ29uc3RhbnRzLkxJU1RfTUFOQUdFUl9XU0lMX0xJTktTOwotICAgICAgICAgICAgICAgIHdzaWxFbGVtZW50LmdldEFsbFdTSUxMaW5rcygpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLmRlTm9ybWFsaXplKHByb3BlcnRpZXMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXIucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2V4cGxvcmVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YTExM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1USVRMRV9XU0VYUExPUkVSPVdlYiBTZXJ2aWNlcyBFeHBsb3JlcgotCi0jIFRyZWUgTm9kZXMKLUFMVF9PUEVOPU9wZW4KLUFMVF9DTE9TRT1DbG9zZQotCi0jIFBlcnNwZWN0aXZlIFRvb2xiYXIKLUFMVF9CQUNLPUJhY2sKLUFMVF9GT1JXQVJEPUZvcndhcmQKLUFMVF9BQ1RJT05fRU5HSU5FPUFjdGlvbiBSZWNvcmRlcgotQUxUX1VERElfUEVSU1BFQ1RJVkU9VURESSBQYWdlCi1BTFRfV1NJTF9QRVJTUEVDVElWRT1XU0lMIFBhZ2UKLUFMVF9XU0RMX1BFUlNQRUNUSVZFPVdTREwgUGFnZQotQUxUX0ZBVk9SSVRFU19QRVJTUEVDVElWRT1GYXZvcml0ZXMKLQotIyBUb29sYmFycwotQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRT1Eb3VibGUgQ2xpY2sgdG8gTWF4aW1pemUKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRT1Eb3VibGUgQ2xpY2sgdG8gUmVzdG9yZQotCi0jIFNldERlZmF1bHRWaWV3VG9vbAotQUxUX0JBQ0tfVE9fVE9QPUJhY2sgdG8gdG9wCi0KLSMgQ29tbW9uIEFjdGlvbnMKLUFMVF9SRUZSRVNIPVJlZnJlc2gKLUFMVF9DTEVBUj1DbGVhcgotQUxUX1JFU1VMVFM9UmVzdWx0cwotCi0jIENvbW1vbiBMYWJlbHMKLUFMVF9OQVZJR0FUT1I9TmF2aWdhdG9yCi1BTFRfQUNUSU9OUz1BY3Rpb25zCi1BTFRfU1RBVFVTPVN0YXR1cwotQUxUX09USEVSX0FDVElPTlM9T3RoZXIgQWN0aW9ucwotRk9STV9CVVRUT05fR089Jm5ic3A7Jm5ic3A7R28mbmJzcDsmbmJzcDsKLUZPUk1fQlVUVE9OX1JFU0VUPVJlc2V0Ci1GT1JNX0JVVFRPTl9DQU5DRUw9Q2FuY2VsCi1GT1JNX0xBQkVMX0FDVElPTlM9QWN0aW9ucwotRk9STV9MQUJFTF9BQ1RJT05TX05PTkU9Tm9uZQotCi0jIFBsYWNlaG9sZGVyIGZvciBibGFuayB0YWJsZSBlbnRyaWVzCi1UQUJMRV9CTEFOS19QTEFDRUhPTERFUj0tLQotCi0jIENvbW1vbiBGb3JtIENvbnRyb2wgVGl0bGVzCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1g9U2VsZWN0IGFsbAotRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YPVNlbGVjdCByb3cKLQotIyBDb21tb24gTWVzc2FnZXMKLU1TR19FUlJPUl9VTkVYUEVDVEVEPUlXQUIwMTM1RSBBbiB1bmV4cGVjdGVkIGVycm9yIGhhcyBvY2N1cnJlZC4KLU1TR19FUlJPUl9OT19BQ1RJT05fU0VMRUNURUQ9SVdBQjAxMjRFIFNlbGVjdCBhbiBhY3Rpb24uCi1NU0dfRVJST1JfTk9fTk9ERV9TRUxFQ1RFRD1JV0FCMDEyNUUgU2VsZWN0IGEgbm9kZS4KLU1TR19TVUJNSVRfSU5fUFJPR1JFU1M9UGxlYXNlIHdhaXQuIFRoZSBvcGVyYXRpb24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3MuCi1NU0dfTE9BRF9JTl9QUk9HUkVTUz1QbGVhc2Ugd2FpdCB3aGlsZSB0aGUgZm9ybSBsb2Fkcy4uLgotCi0jTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbgotQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQ9TGF1bmNoIFdlYiBTZXJ2aWNlIFdpemFyZAotRk9STV9MQUJFTF9DSE9PU0VfV0laQVJEPVNlbGVjdCBhIHdpemFyZCB0byBsYXVuY2g6Ci1GT1JNX1JBRElPX1dFQl9TRVJWSUNFX0NMSUVOVF9XSVpBUkQ9V2ViIFNlcnZpY2UgQ2xpZW50Ci1GT1JNX1JBRElPX1dFQl9TRVJWSUNFX1NLRUxFVE9OX1dJWkFSRD1XZWIgU2VydmljZSBTa2VsZXRvbgotTVNHX0VSUk9SX1dJWkFSRF9BTFJFQURZX1JVTk5JTkc9SVdBQjAxMjZFIEEgV2ViIHNlcnZpY2Ugd2l6YXJkIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuICBGaW5pc2ggd2l0aCB0aGUgZXhpc3Rpbmcgd2l6YXJkIGJlZm9yZSBsYXVuY2hpbmcgYSBuZXcgb25lLgotTVNHX0VSUk9SX1dTRExfVVJMX0lTX1VOUkVBQ0hBQkxFPUlXQUIwMTI3RSBUaGUgV1NETCBkb2N1bWVudCBpcyB1bnJlYWNoYWJsZS4KLQotIyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLUFMVF9XU0lMX0lNUE9SVF9UT19GUz1JbXBvcnQgV1NJTCBUbyBGaWxlIFN5c3RlbQotQUxUX1dTRExfSU1QT1JUX1RPX0ZTPUltcG9ydCBXU0RMIFRvIEZpbGUgU3lzdGVtCi1NU0dfRVJST1JfUkVUUklFVklOR19XU0RMX0RPQz1JV0FCMDEyOEUgVW5hYmxlIHRvIHJldHJpZXZlIFdTREwgZG9jdW1lbnQuCi1NU0dfRVJST1JfUkVUUklFVklOR19XU0lMX0RPQz1JV0FCMDEyOUUgVW5hYmxlIHRvIHJldHJpZXZlIFdTSUwgZG9jdW1lbnQuCi1NU0dfSU1QT1JUX1dTRExfU1VDQ0VTU0ZVTD1XU0RMIGRvY3VtZW50IHN1Y2Nlc3NmdWxseSBpbXBvcnRlZC4KLU1TR19JTVBPUlRfV1NJTF9TVUNDRVNTRlVMPVdTSUwgZG9jdW1lbnQgc3VjY2Vzc2Z1bGx5IGltcG9ydGVkLgotCi0jIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi1BTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIPUltcG9ydCBXU0RMIFRvIHdvcmtiZW5jaAotRk9STV9MQUJFTF9JTVBPUlRfVE9fV09SS0JFTkNIX0RFU0M9U2VsZWN0IGEgd29ya2JlbmNoIHByb2plY3QgdG8gc2F2ZSB0aGUgV1NETCBmaWxlIGludG8uIFlvdSBtYXkgYWxzbyBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIFdTREwgZmlsZS4KLVdFQl9QUk9KRUNUX05BTUU9V2ViIHByb2plY3Q6Ci1XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FPVdvcmtiZW5jaCBwcm9qZWN0OgotTEFCRUxfSU1QT1JUX1dTREw9SW1wb3J0IFdTREwgZG9jdW1lbnQKLUxBQkVMX0lNUE9SVF9UT19XU0lMPUltcG9ydCBhcyBhIHNlcnZpY2UgcmVmZXJlbmNlIHRvIGEgV1NJTCBkb2N1bWVudAotSU1QT1JURURfV1NETF9GSUxFX05BTUU9V1NETCBmaWxlIG5hbWU6Ci1XU0lMX0ZJTEVfTkFNRT1XU0lMIGZpbGUgbmFtZToKLU1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1DYW5ub3QgY3JlYXRlIHRoZSBmaWxlICIlMiIgcmVsYXRpdmUgdG8gdGhlIHBhdGggIiUxIiBiZWNhdXNlIGF1dG9tYXRpYyBmaWxlIG92ZXJ3cml0aW5nIGhhcyBub3QgYmVlbiBlbmFibGVkLiBEbyB5b3Ugd2FudCB0byBlbmFibGUgaXQgZm9yIHRoaXMgZmlsZT8KLU1TR19FUlJPUl9JTlZBTElEX1dPUktCRU5DSF9QUk9KRUNUPUlXQUIwMTMwRSBTZWxlY3QgYSB3b3JrYmVuY2ggcHJvamVjdC4KLU1TR19FUlJPUl9JTlZBTElEX1dTRExfRklMRV9OQU1FPUlXQUIwMTMxRSBJbnZhbGlkIGZpbGUgbmFtZS4KLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfRklMRV9OQU1FPUlXQUIwNDcwRSBJbnZhbGlkIFdTSUwgZmlsZSBuYW1lLgotTVNHX0VSUk9SX05PX0lNUE9SVF9PUFRJT05fU0VMRUNURUQ9SVdBQjA0NzFFIE5vIGltcG9ydCBvcHRpb24gaXMgc2VsZWN0ZWQuICBQbGVhc2UgY2hvb3NlIGF0IGxlYXN0IG9uZSBpbXBvcnQgb3B0aW9uLgotTVNHX0VSUk9SX1dSSVRJTkdfVEVNUF9GSUxFX1RPX0ZTPUlXQUIwMTMyRSBVbmFibGUgdG8gd3JpdGUgdGVtcG9yYXJ5IGZpbGUuCi1NU0dfSU5GT19JTVBPUlRfVE9fV09SS0JFTkNIX1NVQ0NFU1NGVUw9SVdBQjAzMTRJICUxIHdhcyBzdWNjZXNzZnVsbHkgaW1wb3J0ZWQgdG8gdGhlIHdvcmtiZW5jaC4KLU1TR19JTkZPX0lNUE9SVF9TRVJWSUNFX1JFRl9UT19XU0lMX1NVQ0NFU1NGVUw9SVdBQjA0NzJJIFNlcnZpY2UgcmVmZXJlbmNlIHdhcyBzdWNjZXNzZnVsbHkgaW1wb3J0ZWQgdG8gJTEuCi0KLSMgQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb24KLU1TR19FUlJPUl9GSUxFX0NIRUNLT1VUX0RJU0FCTEVEPUNhbm5vdCBjcmVhdGUgdGhlIGZpbGUgIiUyIiByZWxhdGl2ZSB0byB0aGUgcGF0aCAiJTEiIGJlY2F1c2UgYXV0b21hdGljIGZpbGUgY2hlY2sgb3V0IGhhcyBub3QgYmVlbiBlbmFibGVkLiBEbyB5b3Ugd2FudCB0byBlbmFibGUgaXQgZm9yIHRoaXMgZmlsZT8KLQotIyBDbGVhck5vZGVBY3Rpb24KLU1TR19JTkZPX05PREVfQ0xFQVJFRD1JV0FCMDEzM0kgJTEgY2xlYXJlZC4KLQotIyBUYWJsZSB0d2lzdGVlcwotQUxUX1RXSVNUX09QRU5FRD1IaWRlCi1BTFRfVFdJU1RfQ0xPU0VEPUV4cGFuZAotCi0jIFdTREwgQnJvd3NlcgotRk9STV9MSU5LX0JST1dTRT1Ccm93c2UuLi4KLVRJVExFX1dTRExfQlJPV1NFUj1XU0RMIEJyb3dzZXIgLSAlMQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRT1TZWxlY3QgYSBXU0RMIHNvdXJjZToKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9V2ViIFByb2plY3RzCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFX0ZBVk9SSVRFUz1GYXZvcml0ZXMKLUZPUk1fTEFCRUxfV0VCX1BST0pFQ1Q9V2ViIFByb2plY3QKLUZPUk1fTEFCRUxfV1NETF9VUkw9V1NETCBVUkwKLUZPUk1fQlVUVE9OX1JFRlJFU0g9UmVmcmVzaAotQUxUX1dTRExfQlJPV1NFUj1XU0RMIEJyb3dzZXIKLVdTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRVM9U2VydmljZSBJbnRlcmZhY2VzCi1XU0RMX1RZUEVfU0VSVklDRVM9U2VydmljZXMKLQotIyBDYWxlbmRhciBCcm93c2VyCi1USVRMRV9DQUxFTkRBUl9CUk9XU0VSPUNhbGVuZGFyIEJyb3dzZXIKLSMgMiBjaGFyYWN0ZXIgYWJicmV2aWF0aW9ucyBmb3IgZGF5cyBvZiB0aGUgd2Vlay4KLUZPUk1fTEFCRUxfU0hfU1VOREFZPVN1Ci1GT1JNX0xBQkVMX1NIX01PTkRBWT1NbwotRk9STV9MQUJFTF9TSF9UVUVTREFZPVR1Ci1GT1JNX0xBQkVMX1NIX1dFRE5FU0RBWT1XZQotRk9STV9MQUJFTF9TSF9USFVSU0RBWT1UaAotRk9STV9MQUJFTF9TSF9GUklEQVk9RnIKLUZPUk1fTEFCRUxfU0hfU0FUVVJEQVk9U2EKLSMgTW9udGhzIG9mIHRoZSB5ZWFyCi1GT1JNX0xBQkVMX01PTlRIPU1vbnRoOgotRk9STV9MQUJFTF9KQU5VQVJZPUphbnVhcnkKLUZPUk1fTEFCRUxfRkVCUlVBUlk9RmVicnVhcnkKLUZPUk1fTEFCRUxfTUFSQ0g9TWFyY2gKLUZPUk1fTEFCRUxfQVBSSUw9QXByaWwKLUZPUk1fTEFCRUxfTUFZPU1heQotRk9STV9MQUJFTF9KVU5FPUp1bmUKLUZPUk1fTEFCRUxfSlVMWT1KdWx5Ci1GT1JNX0xBQkVMX0FVR1VTVD1BdWd1c3QKLUZPUk1fTEFCRUxfU0VQVEVNQkVSPVNlcHRlbWJlcgotRk9STV9MQUJFTF9PQ1RPQkVSPU9jdG9iZXIKLUZPUk1fTEFCRUxfTk9WRU1CRVI9Tm92ZW1iZXIKLUZPUk1fTEFCRUxfREVDRU1CRVI9RGVjZW1iZXIKLUZPUk1fTEFCRUxfWUVBUj1ZZWFyOgotRk9STV9MQUJFTF9USU1FPVRpbWU6Ci1GT1JNX0xJTktfVE9EQVk9VG9kYXkKLUZPUk1fTElOS19QUkVWSU9VU19ZRUFSPTw8Ci1GT1JNX0xJTktfUFJFVklPVVNfTU9OVEg9PAotRk9STV9MSU5LX05FWFRfTU9OVEg9PgotRk9STV9MSU5LX05FWFRfWUVBUj0+PgotQUxUX1BSRVZJT1VTX1lFQVI9UHJldmlvdXMgWWVhcgotQUxUX1BSRVZJT1VTX01PTlRIPVByZXZpb3VzIE1vbnRoCi1BTFRfTkVYVF9NT05USD1OZXh0IE1vbnRoCi1BTFRfTkVYVF9ZRUFSPU5leHQgWWVhcgotQUxUX1RPREFZPVRvZGF5Ci1BTFRfQ0FMRU5EQVJfQlJPV1NFUj1DYWxlbmRhciBCcm93c2VyCi1NU0dfRVJST1JfSU5WQUxJRF9USU1FX0ZPUk1BVD1JV0FCMDM2OEUgVGltZSB3YXMgbm90IGZvcm1hdHRlZCBhcyBISDpNTTpTU1suU1NTXS4gRG8geW91IHdpc2ggdG8gdXNlIHRoZSBjdXJyZW50IHRpbWUgaW5zdGVhZD8KLQotIyBBY3Rpb24gZW5naW5lCi1USVRMRV9BQ1RJT05fUkVDT1JERVI9QWN0aW9uIFJlY29yZGVyCi1GT1JNX0xBQkVMX01PREU9TW9kZToKLUZPUk1fTEFCRUxfTU9ERV9QTEFZPVBsYXkKLUZPUk1fTEFCRUxfTU9ERV9TVE9QPVN0b3AKLUZPUk1fTEFCRUxfTU9ERV9SRUNPUkQ9UmVjb3JkCi1GT1JNX0xBQkVMX1NBVkU9U2F2ZQotRk9STV9MQUJFTF9QTEFZX0ZJTEU9UGxheSBmaWxlOgotTVNHX0VSUk9SX0lOVkFMSURfUExBWV9GSUxFPUlXQUIwMzYyRSBFbnRlciBhIHBsYXkgZmlsZS4KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1dPUktBUkVBPVdlYiBTZXJ2aWNlcyBFeHBsb3JlciBJbnRlcm5hbCBXb3JrIEFyZWEKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1RPT0xCQVI9V2ViIFNlcnZpY2VzIEV4cGxvcmVyIFRvb2xiYXIKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX0NPTlRFTlQ9V2ViIFNlcnZpY2VzIEV4cGxvcmVyIFBhZ2UgQ29udGVudAotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPVdTREwgQnJvd3NlciBUb29sYmFyCi1GUkFNRV9USVRMRV9XU0RMX0NPTlRFTlQ9V1NETCBCcm93c2VyIENvbnRlbnQKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9QQUdFX0xPQURFUj1QYWdlIExvYWRlcgotRk9STV9USVRMRV9QQUdFX0NPTlRFTlQ9TG9hZGVkIFBhZ2UgQ29udGVudAotRk9STV9USVRMRV9MQVVOQ0hfV0VCU0VSVklDRV9XSVpBUkQ9TGF1bmNoIFdlYiBTZXJ2aWNlIFdpemFyZCBGb3JtCi1GT1JNX1RJVExFX0lNUE9SVF9UT19XT1JLQkVOQ0g9SW1wb3J0IHRvIFdvcmtiZW5jaCBGb3JtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9kZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyY2VkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dTRVhQTE9SRVI9V2ViLVNlcnZpY2UtRXhwbG9yZXIKLQotIyBUcmVlIE5vZGVzCi1BTFRfT1BFTj1cdTAwZDZmZm5lbgotQUxUX0NMT1NFPVNjaGxpZVx1MDBkZmVuCi0KLSMgUGVyc3BlY3RpdmUgVG9vbGJhcgotQUxUX0JBQ0s9WnVyXHUwMGZjY2sKLUFMVF9GT1JXQVJEPVdlaXRlcgotQUxUX0FDVElPTl9FTkdJTkU9QWt0aW9uc3JlY29yZGVyCi1BTFRfVURESV9QRVJTUEVDVElWRT1VRERJLVNlaXRlCi1BTFRfV1NJTF9QRVJTUEVDVElWRT1XU0lMLVNlaXRlCi1BTFRfV1NETF9QRVJTUEVDVElWRT1XU0RMLVNlaXRlCi1BTFRfRkFWT1JJVEVTX1BFUlNQRUNUSVZFPUZhdm9yaXRlbgotCi0jIFRvb2xiYXJzCi1BTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFPVp1bSBNYXhpbWllcmVuIGRvcHBlbHQgYW5rbGlja2VuCi1BTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkU9WnVtIFdpZWRlcmhlcnN0ZWxsZW4gZG9wcGVsdCBhbmtsaWNrZW4KLQotIyBTZXREZWZhdWx0Vmlld1Rvb2wKLUFMVF9CQUNLX1RPX1RPUD1TZWl0ZW5hbmZhbmcKLQotIyBDb21tb24gQWN0aW9ucwotQUxUX1JFRlJFU0g9QWt0dWFsaXNpZXJlbgotQUxUX0NMRUFSPUluaGFsdCBsXHUwMGY2c2NoZW4KLUFMVF9SRVNVTFRTPUVyZ2Vibmlzc2UKLQotIyBDb21tb24gTGFiZWxzCi1BTFRfTkFWSUdBVE9SPU5hdmlnYXRvcgotQUxUX0FDVElPTlM9QWt0aW9uZW4KLUFMVF9TVEFUVVM9U3RhdHVzCi1BTFRfT1RIRVJfQUNUSU9OUz1BbmRlcmUgQWt0aW9uZW4KLUZPUk1fQlVUVE9OX0dPPSZuYnNwOyZuYnNwO0xvcyZuYnNwOyZuYnNwOwotRk9STV9CVVRUT05fUkVTRVQ9WnVyXHUwMGZjY2tzZXR6ZW4KLUZPUk1fQlVUVE9OX0NBTkNFTD1BYmJyZWNoZW4KLUZPUk1fTEFCRUxfQUNUSU9OUz1Ba3Rpb25lbgotRk9STV9MQUJFTF9BQ1RJT05TX05PTkU9S2VpbmUKLQotIyBQbGFjZWhvbGRlciBmb3IgYmxhbmsgdGFibGUgZW50cmllcwotVEFCTEVfQkxBTktfUExBQ0VIT0xERVI9LS0KLQotIyBDb21tb24gRm9ybSBDb250cm9sIFRpdGxlcwotRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YPUFsbGVzIGF1c3dcdTAwZTRobGVuCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1g9WmVpbGUgYXVzd1x1MDBlNGhsZW4KLQotIyBDb21tb24gTWVzc2FnZXMKLU1TR19FUlJPUl9VTkVYUEVDVEVEPUlXQUIwMTM1RSBFcyBpc3QgZWluIHVuZXJ3YXJ0ZXRlciBGZWhsZXIgYXVmZ2V0cmV0ZW4uCi1NU0dfRVJST1JfTk9fQUNUSU9OX1NFTEVDVEVEPUlXQUIwMTI0RSBXXHUwMGU0aGxlbiBTaWUgZWluZSBBa3Rpb24gYXVzLgotTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQ9SVdBQjAxMjVFIFdcdTAwZTRobGVuIFNpZSBlaW5lbiBLbm90ZW4gYXVzLgotTVNHX1NVQk1JVF9JTl9QUk9HUkVTUz1CaXR0ZSB3YXJ0ZW4uIERpZSBPcGVyYXRpb24gaXN0IG5vY2ggbmljaHQgYWJnZXNjaGxvc3Nlbi4KLU1TR19MT0FEX0lOX1BST0dSRVNTPUJpdHRlIHdhcnRlbiBTaWUsIGRhcyBGb3JtdWxhciB3aXJkIGdlbGFkZW4uLi4KLQotI0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24KLUFMVF9MQVVOQ0hfV0VCX1NFUlZJQ0VfV0laQVJEPVdlYi1TZXJ2aWNlLUFzc2lzdGVudCBzdGFydGVuCi1GT1JNX0xBQkVMX0NIT09TRV9XSVpBUkQ9V1x1MDBlNGhsZW4gU2llIGVpbmVuIEFzc2lzdGVudGVuIGF1cywgZGVyIGdlc3RhcnRldCB3ZXJkZW4gc29sbDoKLUZPUk1fUkFESU9fV0VCX1NFUlZJQ0VfQ0xJRU5UX1dJWkFSRD1XZWItU2VydmljZS1DbGllbnQKLUZPUk1fUkFESU9fV0VCX1NFUlZJQ0VfU0tFTEVUT05fV0laQVJEPVdlYi1TZXJ2aWNlLUdlclx1MDBmY3N0Ci1NU0dfRVJST1JfV0laQVJEX0FMUkVBRFlfUlVOTklORz1JV0FCMDEyNkUgRWluIFdlYi1TZXJ2aWNlLUFzc2lzdGVudCBsXHUwMGU0dWZ0IGJlcmVpdHMuICBCZWVuZGVuIFNpZSBkaWVzZW4gQXNzaXN0ZW50ZW4sIGJldm9yIFNpZSBlaW5lbiBuZXVlbiBzdGFydGVuLgotTVNHX0VSUk9SX1dTRExfVVJMX0lTX1VOUkVBQ0hBQkxFPUlXQUIwMTI3RSBEYXMgV1NETC1Eb2t1bWVudCBpc3QgbmljaHQgZXJyZWljaGJhci4KLQotIyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLUFMVF9XU0lMX0lNUE9SVF9UT19GUz1XU0lMIGluIERhdGVpc3lzdGVtIGltcG9ydGllcmVuCi1BTFRfV1NETF9JTVBPUlRfVE9fRlM9V1NETCBpbiBEYXRlaXN5c3RlbSBpbXBvcnRpZXJlbgotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NETF9ET0M9SVdBQjAxMjhFIFdTREwtRG9rdW1lbnQga2FubiBuaWNodCBhYmdlcnVmZW4gd2VyZGVuLgotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NJTF9ET0M9SVdBQjAxMjlFIFdTSUwtRG9rdW1lbnQga2FubiBuaWNodCBhYmdlcnVmZW4gd2VyZGVuLgotTVNHX0lNUE9SVF9XU0RMX1NVQ0NFU1NGVUw9V1NETC1Eb2t1bWVudCB3dXJkZSBlcmZvbGdyZWljaCBpbXBvcnRpZXJ0LgotTVNHX0lNUE9SVF9XU0lMX1NVQ0NFU1NGVUw9V1NJTC1Eb2t1bWVudCB3dXJkZSBlcmZvbGdyZWljaCBpbXBvcnRpZXJ0LgotCi0jIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi1BTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIPVdTREwgaW4gV29ya2JlbmNoIGltcG9ydGllcmVuCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XT1JLQkVOQ0hfREVTQz1XXHUwMGU0aGxlbiBTaWUgZWluIFdvcmtiZW5jaC1Qcm9qZWt0IGF1cywgaW4gZGVtIGRpZSBXU0RMLURhdGVpIGdlc3BlaWNoZXJ0IHdlcmRlbiBzb2xsLiBTaWUga1x1MDBmNm5uZW4gYXVjaCBkZW4gTmFtZW4gZGVyIFdTREwtRGF0ZWkgXHUwMGU0bmRlcm4uCi1XRUJfUFJPSkVDVF9OQU1FPVdlYnByb2pla3Q6Ci1XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FPVdvcmtiZW5jaC1Qcm9qZWt0OgotTEFCRUxfSU1QT1JUX1dTREw9V1NETC1Eb2t1bWVudCBpbXBvcnRpZXJlbgotTEFCRUxfSU1QT1JUX1RPX1dTSUw9QWxzIGVpbmVuIFNlcnZpY2V2ZXJ3ZWlzIGF1ZiBlaW4gV1NJTC1Eb2t1bWVudCBpbXBvcnRpZXJlbgotSU1QT1JURURfV1NETF9GSUxFX05BTUU9V1NETC1EYXRlaW5hbWU6Ci1XU0lMX0ZJTEVfTkFNRT1XU0lMLURhdGVpbmFtZToKLU1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1EaWUgRGF0ZWkgIiUyIiBrYW5uIG5pY2h0IGF1ZiBkZW4gUGZhZCAiJTEiIGJlem9nZW4gZXJzdGVsbHQgd2VyZGVuLCB3ZWlsIGRhcyBhdXRvbWF0aXNjaGUgXHUwMGRjYmVyc2NocmVpYmVuIHZvbiBEYXRlaWVuIG5pY2h0IGFrdGl2aWVydCB3dXJkZS4gU29sbCBkaWVzZSBGdW5rdGlvbiBmXHUwMGZjciBkaWVzZSBEYXRlaSBha3RpdmllcnQgd2VyZGVuPwotTVNHX0VSUk9SX0lOVkFMSURfV09SS0JFTkNIX1BST0pFQ1Q9SVdBQjAxMzBFIFdcdTAwZTRobGVuIFNpZSBlaW4gV29ya2JlbmNoLVByb2pla3QgYXVzLgotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9GSUxFX05BTUU9SVdBQjAxMzFFIFVuZ1x1MDBmY2x0aWdlciBEYXRlaW5hbWUuCi1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX0ZJTEVfTkFNRT1JV0FCMDQ3MEUgVW5nXHUwMGZjbHRpZ2VyIFdTSUwtRGF0ZWluYW1lLgotTVNHX0VSUk9SX05PX0lNUE9SVF9PUFRJT05fU0VMRUNURUQ9SVdBQjA0NzFFIEVzIHd1cmRlIGtlaW5lIEltcG9ydG9wdGlvbiBhdXNnZXdcdTAwZTRobHQuICBXXHUwMGU0aGxlbiBTaWUgYml0dGUgbWluZGVzdGVucyBlaW5lIEltcG9ydG9wdGlvbiBhdXMuCi1NU0dfRVJST1JfV1JJVElOR19URU1QX0ZJTEVfVE9fRlM9SVdBQjAxMzJFIFRlbXBvclx1MDBlNHJlIERhdGVpIGthbm4gbmljaHQgZ2VzY2hyaWViZW4gd2VyZGVuLgotTVNHX0lORk9fSU1QT1JUX1RPX1dPUktCRU5DSF9TVUNDRVNTRlVMPUlXQUIwMzE0SSAlMSB3dXJkZSBlcmZvbGdyZWljaCBpbiBkaWUgV29ya2JlbmNoIGltcG9ydGllcnQuCi1NU0dfSU5GT19JTVBPUlRfU0VSVklDRV9SRUZfVE9fV1NJTF9TVUNDRVNTRlVMPUlXQUIwNDcySSBTZXJ2aWNldmVyd2VpcyB3dXJkZSBlcmZvbGdyZWljaCBpbiAlMSBpbXBvcnRpZXJ0LgotCi0jIENoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uCi1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1EaWUgRGF0ZWkgIiUyIiBrYW5uIG5pY2h0IGF1ZiBkZW4gUGZhZCAiJTEiIGJlem9nZW4gZXJzdGVsbHQgd2VyZGVuLCB3ZWlsIGRlciBhdXRvbWF0aXNjaGUgRGF0ZWktQ2hlY2stb3V0IG5pY2h0IGFrdGl2aWVydCB3dXJkZS4gU29sbCBkaWVzZSBGdW5rdGlvbiBmXHUwMGZjciBkaWVzZSBEYXRlaSBha3RpdmllcnQgd2VyZGVuPwotCi0jIENsZWFyTm9kZUFjdGlvbgotTVNHX0lORk9fTk9ERV9DTEVBUkVEPUlXQUIwMTMzSSAlMSBnZWxcdTAwZjZzY2h0LgotCi0jIFRhYmxlIHR3aXN0ZWVzCi1BTFRfVFdJU1RfT1BFTkVEPUF1c2JsZW5kZW4KLUFMVF9UV0lTVF9DTE9TRUQ9RWluYmxlbmRlbgotCi0jIFdTREwgQnJvd3NlcgotRk9STV9MSU5LX0JST1dTRT1EdXJjaHN1Y2hlbi4uLgotVElUTEVfV1NETF9CUk9XU0VSPVdTREwtQnJvd3NlciAtICUxCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFPVdcdTAwZTRobGVuIFNpZSBlaW5lIFdTREwtUXVlbGxlIGF1czoKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9V2VicHJvamVrdGUKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfRkFWT1JJVEVTPUZhdm9yaXRlbgotRk9STV9MQUJFTF9XRUJfUFJPSkVDVD1XZWJwcm9qZWt0Ci1GT1JNX0xBQkVMX1dTRExfVVJMPVdTREwtVVJMCi1GT1JNX0JVVFRPTl9SRUZSRVNIPUFrdHVhbGlzaWVyZW4KLUFMVF9XU0RMX0JST1dTRVI9V1NETC1Ccm93c2VyCi1XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0VTPVNlcnZpY2VzY2huaXR0c3RlbGxlbgotV1NETF9UWVBFX1NFUlZJQ0VTPVNlcnZpY2VzCi0KLSMgQ2FsZW5kYXIgQnJvd3NlcgotVElUTEVfQ0FMRU5EQVJfQlJPV1NFUj1LYWxlbmRlcmJyb3dzZXIKLSMgMiBjaGFyYWN0ZXIgYWJicmV2aWF0aW9ucyBmb3IgZGF5cyBvZiB0aGUgd2Vlay4KLUZPUk1fTEFCRUxfU0hfU1VOREFZPVNvCi1GT1JNX0xBQkVMX1NIX01PTkRBWT1NbwotRk9STV9MQUJFTF9TSF9UVUVTREFZPURpCi1GT1JNX0xBQkVMX1NIX1dFRE5FU0RBWT1NaQotRk9STV9MQUJFTF9TSF9USFVSU0RBWT1EbwotRk9STV9MQUJFTF9TSF9GUklEQVk9RnIKLUZPUk1fTEFCRUxfU0hfU0FUVVJEQVk9U2EKLSMgTW9udGhzIG9mIHRoZSB5ZWFyCi1GT1JNX0xBQkVMX01PTlRIPU1vbmF0OgotRk9STV9MQUJFTF9KQU5VQVJZPUphbnVhcgotRk9STV9MQUJFTF9GRUJSVUFSWT1GZWJydWFyCi1GT1JNX0xBQkVMX01BUkNIPU1cdTAwZTRyegotRk9STV9MQUJFTF9BUFJJTD1BcHJpbAotRk9STV9MQUJFTF9NQVk9TWFpCi1GT1JNX0xBQkVMX0pVTkU9SnVuaQotRk9STV9MQUJFTF9KVUxZPUp1bGkKLUZPUk1fTEFCRUxfQVVHVVNUPUF1Z3VzdAotRk9STV9MQUJFTF9TRVBURU1CRVI9U2VwdGVtYmVyCi1GT1JNX0xBQkVMX09DVE9CRVI9T2t0b2JlcgotRk9STV9MQUJFTF9OT1ZFTUJFUj1Ob3ZlbWJlcgotRk9STV9MQUJFTF9ERUNFTUJFUj1EZXplbWJlcgotRk9STV9MQUJFTF9ZRUFSPUphaHI6Ci1GT1JNX0xBQkVMX1RJTUU9WmVpdDoKLUZPUk1fTElOS19UT0RBWT1IZXV0ZQotRk9STV9MSU5LX1BSRVZJT1VTX1lFQVI9PDwKLUZPUk1fTElOS19QUkVWSU9VU19NT05USD08Ci1GT1JNX0xJTktfTkVYVF9NT05USD0+Ci1GT1JNX0xJTktfTkVYVF9ZRUFSPT4+Ci1BTFRfUFJFVklPVVNfWUVBUj1MZXR6dGVzIEphaHIKLUFMVF9QUkVWSU9VU19NT05USD1MZXR6dGVyIE1vbmF0Ci1BTFRfTkVYVF9NT05USD1OXHUwMGU0Y2hzdGVyIE1vbmF0Ci1BTFRfTkVYVF9ZRUFSPU5cdTAwZTRjaHN0ZXMgSmFocgotQUxUX1RPREFZPUhldXRlCi1BTFRfQ0FMRU5EQVJfQlJPV1NFUj1LYWxlbmRlcmJyb3dzZXIKLU1TR19FUlJPUl9JTlZBTElEX1RJTUVfRk9STUFUPUlXQUIwMzY4RSBEaWUgWmVpdCB3dXJkZSBuaWNodCBpbSBGb3JtYXQgSEg6TU06U1NbLlNTU10gYW5nZWdlYmVuLiBTb2xsIHN0YXR0ZGVzc2VuIGRpZSBha3R1ZWxsZSBaZWl0IHZlcndlbmRldCB3ZXJkZW4/Ci0KLSMgQWN0aW9uIGVuZ2luZQotVElUTEVfQUNUSU9OX1JFQ09SREVSPUFrdGlvbnNyZWNvcmRlcgotRk9STV9MQUJFTF9NT0RFPU1vZHVzOgotRk9STV9MQUJFTF9NT0RFX1BMQVk9V2llZGVyZ2FiZQotRk9STV9MQUJFTF9NT0RFX1NUT1A9U3RvcHAKLUZPUk1fTEFCRUxfTU9ERV9SRUNPUkQ9QXVmemVpY2huZW4KLUZPUk1fTEFCRUxfU0FWRT1TcGVpY2hlcm4KLUZPUk1fTEFCRUxfUExBWV9GSUxFPVdpZWRlcmdhYmVkYXRlaToKLU1TR19FUlJPUl9JTlZBTElEX1BMQVlfRklMRT1JV0FCMDM2MkUgR2ViZW4gU2llIGVpbmUgV2llZGVyZ2FiZWRhdGVpIGVpbi4KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1dPUktBUkVBPVdlYi1TZXJ2aWNlLUV4cGxvcmVyIC0gSW50ZXJuZXIgQXJiZWl0c2JlcmVpY2gKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1RPT0xCQVI9V2ViLVNlcnZpY2UtRXhwbG9yZXIgLSBTeW1ib2xsZWlzdGUKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX0NPTlRFTlQ9V2ViLVNlcnZpY2UtRXhwbG9yZXIgLSBTZWl0ZW5pbmhhbHQKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1XU0RMLUJyb3dzZXIgLSBTeW1ib2xsZWlzdGUKLUZSQU1FX1RJVExFX1dTRExfQ09OVEVOVD1XU0RMLUJyb3dzZXIgLSBJbmhhbHQKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9QQUdFX0xPQURFUj1TZWl0ZW5sYWRlcHJvZ3JhbW0KLUZPUk1fVElUTEVfUEFHRV9DT05URU5UPUdlbGFkZW5lciBTZWl0ZW5pbmhhbHQKLUZPUk1fVElUTEVfTEFVTkNIX1dFQlNFUlZJQ0VfV0laQVJEPVdlYi1TZXJ2aWNlLUFzc2lzdGVudGVuZm9ybXVsYXIgc3RhcnRlbgotRk9STV9USVRMRV9JTVBPUlRfVE9fV09SS0JFTkNIPUluIFdvcmtiZW5jaC1Gb3JtdWxhciBpbXBvcnRpZXJlbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2V4cGxvcmVyX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDFlMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1USVRMRV9XU0VYUExPUkVSPUV4cGxvcmFkb3IgZGUgc2VydmljaW9zIFdlYgotCi0jIFRyZWUgTm9kZXMKLUFMVF9PUEVOPUFicmlyCi1BTFRfQ0xPU0U9Q2VycmFyCi0KLSMgUGVyc3BlY3RpdmUgVG9vbGJhcgotQUxUX0JBQ0s9QW50ZXJpb3IKLUFMVF9GT1JXQVJEPVNpZ3VpZW50ZQotQUxUX0FDVElPTl9FTkdJTkU9R3JhYmFkb3IgZGUgYWNjaW9uZXMKLUFMVF9VRERJX1BFUlNQRUNUSVZFPVBcdTAwZTFnaW5hIFVEREkKLUFMVF9XU0lMX1BFUlNQRUNUSVZFPVBcdTAwZTFnaW5hIFdTSUwKLUFMVF9XU0RMX1BFUlNQRUNUSVZFPVBcdTAwZTFnaW5hIFdTREwKLUFMVF9GQVZPUklURVNfUEVSU1BFQ1RJVkU9RmF2b3JpdG9zCi0KLSMgVG9vbGJhcnMKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkU9RG9ibGUgcHVsc2FjaVx1MDBmM24gcGFyYSBtYXhpbWl6YXIKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRT1Eb2JsZSBwdWxzYWNpXHUwMGYzbiBwYXJhIHJlc3RhdXJhcgotCi0jIFNldERlZmF1bHRWaWV3VG9vbAotQUxUX0JBQ0tfVE9fVE9QPVZvbHZlciBhbCBpbmljaW8KLQotIyBDb21tb24gQWN0aW9ucwotQUxUX1JFRlJFU0g9UmVub3ZhcgotQUxUX0NMRUFSPUJvcnJhcgotQUxUX1JFU1VMVFM9UmVzdWx0YWRvcwotCi0jIENvbW1vbiBMYWJlbHMKLUFMVF9OQVZJR0FUT1I9TmF2ZWdhZG9yCi1BTFRfQUNUSU9OUz1BY2Npb25lcwotQUxUX1NUQVRVUz1Fc3RhZG8KLUFMVF9PVEhFUl9BQ1RJT05TPU90cmFzIGFjY2lvbmVzCi1GT1JNX0JVVFRPTl9HTz0mbmJzcDsmbmJzcDtJciZuYnNwOyZuYnNwOwotRk9STV9CVVRUT05fUkVTRVQ9UmVzdGFibGVjZXIKLUZPUk1fQlVUVE9OX0NBTkNFTD1DYW5jZWxhcgotRk9STV9MQUJFTF9BQ1RJT05TPUFjY2lvbmVzCi1GT1JNX0xBQkVMX0FDVElPTlNfTk9ORT1OaW5ndW5hCi0KLSMgUGxhY2Vob2xkZXIgZm9yIGJsYW5rIHRhYmxlIGVudHJpZXMKLVRBQkxFX0JMQU5LX1BMQUNFSE9MREVSPS0tCi0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWD1TZWxlY2Npb25hciB0b2RvCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1g9U2VsZWNjaW9uYXIgZmlsYQotCi0jIENvbW1vbiBNZXNzYWdlcwotTVNHX0VSUk9SX1VORVhQRUNURUQ9SVdBQjAxMzVFIFNlIGhhIHByb2R1Y2lkbyB1biBlcnJvciBpbmVzcGVyYWRvLgotTVNHX0VSUk9SX05PX0FDVElPTl9TRUxFQ1RFRD1JV0FCMDEyNEUgU2VsZWNjaW9uZSB1bmEgYWNjaVx1MDBmM24uCi1NU0dfRVJST1JfTk9fTk9ERV9TRUxFQ1RFRD1JV0FCMDEyNUUgU2VsZWNjaW9uZSB1biBub2RvLgotTVNHX1NVQk1JVF9JTl9QUk9HUkVTUz1Qb3IgZmF2b3IsIGVzcGVyZS4gTGEgb3BlcmFjaVx1MDBmM24gZXN0XHUwMGUxIHRvZGF2XHUwMGVkYSBlbiBwcm9jZXNvLgotTVNHX0xPQURfSU5fUFJPR1JFU1M9RXNwZXJlIG1pZW50cmFzIHNlIGNhcmdhIGVsIGZvcm11bGFyaW8uLi4KLQotI0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24KLUFMVF9MQVVOQ0hfV0VCX1NFUlZJQ0VfV0laQVJEPUxhbnphciBhc2lzdGVudGUgZGUgc2VydmljaW8gV2ViCi1GT1JNX0xBQkVMX0NIT09TRV9XSVpBUkQ9U2VsZWNjaW9uZSB1biBhc2lzdGVudGUgYSBsYW56YXI6Ci1GT1JNX1JBRElPX1dFQl9TRVJWSUNFX0NMSUVOVF9XSVpBUkQ9Q2xpZW50ZSBkZSBzZXJ2aWNpbyBXZWIKLUZPUk1fUkFESU9fV0VCX1NFUlZJQ0VfU0tFTEVUT05fV0laQVJEPUVzcXVlbGV0byBkZSBzZXJ2aWNpbyBXZWIKLU1TR19FUlJPUl9XSVpBUkRfQUxSRUFEWV9SVU5OSU5HPUlXQUIwMTI2RSBZYSBoYXkgdW4gYXNpc3RlbnRlIGRlIHNlcnZpY2lvIFdlYiBlbiBwcm9jZXNvLiAgVGVybWluZSBjb24gZWwgYXNpc3RlbnRlIGV4aXN0ZW50ZSBhbnRlcyBkZSBsYW56YXIgdW5vIG51ZXZvLgotTVNHX0VSUk9SX1dTRExfVVJMX0lTX1VOUkVBQ0hBQkxFPUlXQUIwMTI3RSBFbCBkb2N1bWVudG8gV1NETCBubyBlcyBhbGNhbnphYmxlLgotCi0jIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotQUxUX1dTSUxfSU1QT1JUX1RPX0ZTPUltcG9ydGFyIFdTSUwgYWwgc2lzdGVtYSBkZSBhcmNoaXZvcwotQUxUX1dTRExfSU1QT1JUX1RPX0ZTPUltcG9ydGFyIFdTREwgYWwgc2lzdGVtYSBkZSBhcmNoaXZvcwotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NETF9ET0M9SVdBQjAxMjhFIE5vIHNlIHB1ZWRlIHJlY3VwZXJhciBlbCBkb2N1bWVudG8gV1NETC4KLU1TR19FUlJPUl9SRVRSSUVWSU5HX1dTSUxfRE9DPUlXQUIwMTI5RSBObyBzZSBwdWVkZSByZWN1cGVyYXIgZWwgZG9jdW1lbnRvIFdTSUwuCi1NU0dfSU1QT1JUX1dTRExfU1VDQ0VTU0ZVTD1FbCBkb2N1bWVudG8gV1NETCBzZSBoYSBpbXBvcnRhZG8gc2F0aXNmYWN0b3JpYW1lbnRlLgotTVNHX0lNUE9SVF9XU0lMX1NVQ0NFU1NGVUw9RWwgZG9jdW1lbnRvIFdTSUwgc2UgaGEgaW1wb3J0YWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4KLQotIyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbgotQUxUX0lNUE9SVF9XU0RMX1RPX1dPUktCRU5DSD1JbXBvcnRhciBXU0RMIGEgZW50b3JubyBkZSB0cmFiYWpvCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XT1JLQkVOQ0hfREVTQz1TZWxlY2Npb25lIHVuIHByb3llY3RvIGVuIGVsIHF1ZSBndWFyZGFyIGVsIGFyY2hpdm8gV1NETC4gVGFtYmlcdTAwZTluIHB1ZWRlIGNhbWJpYXIgZWwgbm9tYnJlIGRlbCBhcmNoaXZvIFdTREwuCi1XRUJfUFJPSkVDVF9OQU1FPVByb3llY3RvIFdlYjoKLVdPUktCRU5DSF9QUk9KRUNUX05BTUU9UHJveWVjdG8gZGUgZW50b3JubyBkZSB0cmFiYWpvOgotTEFCRUxfSU1QT1JUX1dTREw9SW1wb3J0YXIgZG9jdW1lbnRvIFdTREwKLUxBQkVMX0lNUE9SVF9UT19XU0lMPUltcG9ydGFyIGNvbW8gcmVmZXJlbmNpYSBkZSBzZXJ2aWNpbyBhIHVuIGRvY3VtZW50byBXU0lMCi1JTVBPUlRFRF9XU0RMX0ZJTEVfTkFNRT1Ob21icmUgZGUgYXJjaGl2byBXU0RMOgotV1NJTF9GSUxFX05BTUU9Tm9tYnJlIGRlIGFyY2hpdm8gV1NJTDoKLU1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1JV0FCMDE2NEUgTm8gc2UgcHVlZGUgY3JlYXIgZWwgYXJjaGl2byAlMiByZWxhdGl2byBhIGxhIHZcdTAwZWRhIGRlIGFjY2VzbyAlMSBkZWJpZG8gYSBxdWUgbGEgc29icmVzY3JpdHVyYSBhdXRvbVx1MDBlMXRpY2EgZGUgYXJjaGl2b3Mgbm8gc2UgaGEgaGFiaWxpdGFkby4gXHUwMGJmRGVzZWEgaGFiaWxpdGFybGEgcGFyYSBlc3RlIGFyY2hpdm8/Ci1NU0dfRVJST1JfSU5WQUxJRF9XT1JLQkVOQ0hfUFJPSkVDVD1JV0FCMDEzMEUgU2VsZWNjaW9uZSB1biBwcm95ZWN0byBkZSBlbnRvcm5vIGRlIHRyYWJham8uCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfTkFNRT1JV0FCMDEzMUUgTm9tYnJlIGRlIGFyY2hpdm8gbm8gdlx1MDBlMWxpZG8uCi1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX0ZJTEVfTkFNRT1JV0FCMDQ3MEUgTm9tYnJlIGRlIGFyY2hpdm8gV1NJTCBubyB2XHUwMGUxbGlkby4KLU1TR19FUlJPUl9OT19JTVBPUlRfT1BUSU9OX1NFTEVDVEVEPUlXQUIwNDcxRSBObyBzZSBoYSBzZWxlY2Npb25hZG8gbmluZ3VuYSBvcGNpXHUwMGYzbiBkZSBpbXBvcnRhY2lcdTAwZjNuLiAgRWxpamEgdW5hIG9wY2lcdTAwZjNuIGRlIGltcG9ydGFjaVx1MDBmM24gY29tbyBtXHUwMGVkbmltby4KLU1TR19FUlJPUl9XUklUSU5HX1RFTVBfRklMRV9UT19GUz1JV0FCMDEzMkUgTm8gc2UgcHVlZGUgZXNjcmliaXIgZW4gZWwgYXJjaGl2byB0ZW1wb3JhbC4KLU1TR19JTkZPX0lNUE9SVF9UT19XT1JLQkVOQ0hfU1VDQ0VTU0ZVTD1JV0FCMDMxNEkgJTEgc2UgaGEgaW1wb3J0YWRvIHNhdGlzZmFjdG9yaWFtZW50ZSBlbiBlbCBlbnRvcm5vIGRlIHRyYWJham8uCi1NU0dfSU5GT19JTVBPUlRfU0VSVklDRV9SRUZfVE9fV1NJTF9TVUNDRVNTRlVMPUlXQUIwNDcySSBMYSByZWZlcmVuY2lhIGRlIHNlcnZpY2lvIHNlIGhhIGltcG9ydGFkbyBzYXRpc2ZhY3RvcmlhbWVudGUgYSAlMS4KLQotIyBDaGVja1dvcmtiZW5jaEZpbGVSZWFkT25seUFjdGlvbgotTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQ9SVdBQjAxNjRFIE5vIHNlIHB1ZWRlIGNyZWFyIGVsIGFyY2hpdm8gJTIgcmVsYXRpdm8gYSBsYSB2XHUwMGVkYSBkZSBhY2Nlc28gJTEgZGViaWRvIGEgcXVlIGxhIHJlc2VydmEgYXV0b21cdTAwZTF0aWNhIGRlIGFyY2hpdm9zIG5vIHNlIGhhIGhhYmlsaXRhZG8uIFx1MDBiZkRlc2VhIGhhYmlsaXRhcmxhIHBhcmEgZXN0ZSBhcmNoaXZvPwotCi0jIENsZWFyTm9kZUFjdGlvbgotTVNHX0lORk9fTk9ERV9DTEVBUkVEPUlXQUIwMTMzSSAlMSBib3JyYWRvLgotCi0jIFRhYmxlIHR3aXN0ZWVzCi1BTFRfVFdJU1RfT1BFTkVEPU9jdWx0YXIKLUFMVF9UV0lTVF9DTE9TRUQ9RXhwYW5kaXIKLQotIyBXU0RMIEJyb3dzZXIKLUZPUk1fTElOS19CUk9XU0U9RXhhbWluYXIuLi4KLVRJVExFX1dTRExfQlJPV1NFUj1OYXZlZ2Fkb3IgV1NETCAtICUxCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFPVNlbGVjY2lvbmUgdW4gb3JpZ2VuIFdTREw6Ci1GT1JNX0xBQkVMX1dTRExfU09VUkNFX1dFQlBST0pFQ1RTPVByb3llY3RvcyBXZWIKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfRkFWT1JJVEVTPUZhdm9yaXRvcwotRk9STV9MQUJFTF9XRUJfUFJPSkVDVD1Qcm95ZWN0byBXZWIKLUZPUk1fTEFCRUxfV1NETF9VUkw9VVJMIFdTREwKLUZPUk1fQlVUVE9OX1JFRlJFU0g9UmVub3ZhcgotQUxUX1dTRExfQlJPV1NFUj1OYXZlZ2Fkb3IgV1NETAotV1NETF9UWVBFX1NFUlZJQ0VfSU5URVJGQUNFUz1JbnRlcmZhY2VzIGRlIHNlcnZpY2lvCi1XU0RMX1RZUEVfU0VSVklDRVM9U2VydmljaW9zCi0KLSMgQ2FsZW5kYXIgQnJvd3NlcgotVElUTEVfQ0FMRU5EQVJfQlJPV1NFUj1OYXZlZ2Fkb3IgZGUgY2FsZW5kYXJpbwotIyAyIGNoYXJhY3RlciBhYmJyZXZpYXRpb25zIGZvciBkYXlzIG9mIHRoZSB3ZWVrLgotRk9STV9MQUJFTF9TSF9TVU5EQVk9RG8KLUZPUk1fTEFCRUxfU0hfTU9OREFZPUx1Ci1GT1JNX0xBQkVMX1NIX1RVRVNEQVk9TWEKLUZPUk1fTEFCRUxfU0hfV0VETkVTREFZPU1pCi1GT1JNX0xBQkVMX1NIX1RIVVJTREFZPUp1Ci1GT1JNX0xBQkVMX1NIX0ZSSURBWT1WaQotRk9STV9MQUJFTF9TSF9TQVRVUkRBWT1TXHUwMGUxCi0jIE1vbnRocyBvZiB0aGUgeWVhcgotRk9STV9MQUJFTF9NT05USD1NZXM6Ci1GT1JNX0xBQkVMX0pBTlVBUlk9RW5lcm8KLUZPUk1fTEFCRUxfRkVCUlVBUlk9RmVicmVybwotRk9STV9MQUJFTF9NQVJDSD1NYXJ6bwotRk9STV9MQUJFTF9BUFJJTD1BYnJpbAotRk9STV9MQUJFTF9NQVk9TWF5bwotRk9STV9MQUJFTF9KVU5FPUp1bmlvCi1GT1JNX0xBQkVMX0pVTFk9SnVsaW8KLUZPUk1fTEFCRUxfQVVHVVNUPUFnb3N0bwotRk9STV9MQUJFTF9TRVBURU1CRVI9U2VwdGllbWJyZQotRk9STV9MQUJFTF9PQ1RPQkVSPU9jdHVicmUKLUZPUk1fTEFCRUxfTk9WRU1CRVI9Tm92aWVtYnJlCi1GT1JNX0xBQkVMX0RFQ0VNQkVSPURpY2llbWJyZQotRk9STV9MQUJFTF9ZRUFSPUFcdTAwZjFvOgotRk9STV9MQUJFTF9USU1FPUhvcmE6Ci1GT1JNX0xJTktfVE9EQVk9SG95Ci1GT1JNX0xJTktfUFJFVklPVVNfWUVBUj08PAotRk9STV9MSU5LX1BSRVZJT1VTX01PTlRIPTwKLUZPUk1fTElOS19ORVhUX01PTlRIPT4KLUZPUk1fTElOS19ORVhUX1lFQVI9Pj4KLUFMVF9QUkVWSU9VU19ZRUFSPUFcdTAwZjFvIGFudGVyaW9yCi1BTFRfUFJFVklPVVNfTU9OVEg9TWVzIGFudGVyaW9yCi1BTFRfTkVYVF9NT05USD1NZXMgc2lndWllbnRlCi1BTFRfTkVYVF9ZRUFSPUFcdTAwZjFvIHNpZ3VpZW50ZQotQUxUX1RPREFZPUhveQotQUxUX0NBTEVOREFSX0JST1dTRVI9TmF2ZWdhZG9yIGRlIGNhbGVuZGFyaW8KLU1TR19FUlJPUl9JTlZBTElEX1RJTUVfRk9STUFUPUlXQUIwMzY4RSBFbCBmb3JtYXRvIGRlIGxhIGhvcmEgbm8gZXMgSEg6TU06U1NbLlNTU10uIFx1MDBiZkRlc2VhIHV0aWxpemFyIGxhIGhvcmEgYWN0dWFsIGVuIHN1IGx1Z2FyPwotCi0jIEFjdGlvbiBlbmdpbmUKLVRJVExFX0FDVElPTl9SRUNPUkRFUj1HcmFiYWRvciBkZSBhY2Npb25lcwotRk9STV9MQUJFTF9NT0RFPU1vZGFsaWRhZDoKLUZPUk1fTEFCRUxfTU9ERV9QTEFZPVJlcHJvZHVjaXIKLUZPUk1fTEFCRUxfTU9ERV9TVE9QPURldGVuZXIKLUZPUk1fTEFCRUxfTU9ERV9SRUNPUkQ9R3JhYmFyCi1GT1JNX0xBQkVMX1NBVkU9R3VhcmRhcgotRk9STV9MQUJFTF9QTEFZX0ZJTEU9QXJjaGl2byBkZSByZXByb2R1Y2NpXHUwMGYzbjoKLU1TR19FUlJPUl9JTlZBTElEX1BMQVlfRklMRT1JV0FCMDM2MkUgRXNwZWNpZmlxdWUgdW4gYXJjaGl2byBkZSByZXByb2R1Y2NpXHUwMGYzbi4KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1dPUktBUkVBPVx1MDBjMXJlYSBkZSB0cmFiYWpvIGludGVybm8gZGVsIGV4cGxvcmFkb3IgZGUgc2VydmljaW9zIFdlYgotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfVE9PTEJBUj1CYXJyYSBkZSBoZXJyYW1pZW50YXMgZGVsIGV4cGxvcmFkb3IgZGUgc2VydmljaW9zIFdlYgotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfQ09OVEVOVD1Db250ZW5pZG8gZGUgbGEgcFx1MDBlMWdpbmEgZGVsIGV4cGxvcmFkb3IgZGUgc2VydmljaW9zIFdlYgotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPUJhcnJhIGRlIGhlcnJhbWllbnRhcyBkZWwgbmF2ZWdhZG9yIFdTREwKLUZSQU1FX1RJVExFX1dTRExfQ09OVEVOVD1Db250ZW5pZG8gZGVsIG5hdmVnYWRvciBXU0RMCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfUEFHRV9MT0FERVI9Q2FyZ2Fkb3IgZGUgcFx1MDBlMWdpbmFzCi1GT1JNX1RJVExFX1BBR0VfQ09OVEVOVD1Db250ZW5pZG8gZGUgcFx1MDBlMWdpbmEgY2FyZ2FkYQotRk9STV9USVRMRV9MQVVOQ0hfV0VCU0VSVklDRV9XSVpBUkQ9TGFuemFyIGZvcm11bGFyaW8gZGVsIGFzaXN0ZW50ZSBkZSBzZXJ2aWNpbyBXZWIKLUZPUk1fVElUTEVfSU1QT1JUX1RPX1dPUktCRU5DSD1JbXBvcnRhciBhIGZvcm11bGFyaW8gZGUgZW50b3JubyBkZSB0cmFiYWpvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9mci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMjBhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dTRVhQTE9SRVI9RXhwbG9yYXRldXIgZGUgc2VydmljZXMgV2ViCi0KLSMgVHJlZSBOb2RlcwotQUxUX09QRU49T3V2cmlyCi1BTFRfQ0xPU0U9RmVybWVyCi0KLSMgUGVyc3BlY3RpdmUgVG9vbGJhcgotQUxUX0JBQ0s9UHJcdTAwZTljXHUwMGU5ZGVudAotQUxUX0ZPUldBUkQ9U3VpdmFudAotQUxUX0FDVElPTl9FTkdJTkU9TW90ZXVyIGQnZW5yZWdpc3RyZW1lbnQgZGVzIGFjdGlvbnMKLUFMVF9VRERJX1BFUlNQRUNUSVZFPVBhZ2UgVURESQotQUxUX1dTSUxfUEVSU1BFQ1RJVkU9UGFnZSBXU0lMCi1BTFRfV1NETF9QRVJTUEVDVElWRT1QYWdlIFdTREwKLUFMVF9GQVZPUklURVNfUEVSU1BFQ1RJVkU9RmF2b3JpcwotCi0jIFRvb2xiYXJzCi1BTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFPUNsaXF1ZXogZGV1eCBmb2lzIHBvdXIgYWdyYW5kaXIKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRT1DbGlxdWV6IGRldXggZm9pcyBwb3VyIHJlc3RhdXJlcgotCi0jIFNldERlZmF1bHRWaWV3VG9vbAotQUxUX0JBQ0tfVE9fVE9QPVJldG91ciBlbiBoYXV0IGRlIGxhIHBhZ2UKLQotIyBDb21tb24gQWN0aW9ucwotQUxUX1JFRlJFU0g9Ulx1MDBlOWdcdTAwZTluXHUwMGU5cmVyCi1BTFRfQ0xFQVI9RWZmYWNlcgotQUxUX1JFU1VMVFM9Ulx1MDBlOXN1bHRhdHMKLQotIyBDb21tb24gTGFiZWxzCi1BTFRfTkFWSUdBVE9SPU5hdmlnYXRldXIKLUFMVF9BQ1RJT05TPUFjdGlvbnMKLUFMVF9TVEFUVVM9RXRhdAotQUxUX09USEVSX0FDVElPTlM9QXV0cmVzIGFjdGlvbnMKLUZPUk1fQlVUVE9OX0dPPSZuYnNwOyZuYnNwO09LJm5ic3A7Jm5ic3A7Ci1GT1JNX0JVVFRPTl9SRVNFVD1SZXN0YXVyZXIKLUZPUk1fQlVUVE9OX0NBTkNFTD1Bbm51bGVyCi1GT1JNX0xBQkVMX0FDVElPTlM9QWN0aW9ucwotRk9STV9MQUJFTF9BQ1RJT05TX05PTkU9QXVjdW5lCi0KLSMgUGxhY2Vob2xkZXIgZm9yIGJsYW5rIHRhYmxlIGVudHJpZXMKLVRBQkxFX0JMQU5LX1BMQUNFSE9MREVSPS0tCi0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWD1TXHUwMGU5bGVjdGlvbm5lciB0b3V0Ci1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1g9U1x1MDBlOWxlY3Rpb25uZXIgbGEgbGlnbmUKLQotIyBDb21tb24gTWVzc2FnZXMKLU1TR19FUlJPUl9VTkVYUEVDVEVEPUlXQUIwMTM1RSBVbmUgZXJyZXVyIGluYXR0ZW5kdWUgcydlc3QgcHJvZHVpdGUuCi1NU0dfRVJST1JfTk9fQUNUSU9OX1NFTEVDVEVEPUlXQUIwMTI0RSBTXHUwMGU5bGVjdGlvbm5leiB1bmUgYWN0aW9uLgotTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQ9SVdBQjAxMjVFIFNcdTAwZTlsZWN0aW9ubmV6IHVuIG5vZXVkLgotTVNHX1NVQk1JVF9JTl9QUk9HUkVTUz1WZXVpbGxleiBwYXRpZW50ZXIuIEwnb3BcdTAwZTlyYXRpb24gZXN0IGVuY29yZSBlbiBjb3VycyBkJ2V4XHUwMGU5Y3V0aW9uLgotTVNHX0xPQURfSU5fUFJPR1JFU1M9VmV1aWxsZXogcGF0aWVudGVyLiBDaGFyZ2VtZW50IGR1IGZvcm11bGFpcmUgZW4gY291cnMuLi4KLQotI0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24KLUFMVF9MQVVOQ0hfV0VCX1NFUlZJQ0VfV0laQVJEPUxhbmNlciBsJ2Fzc2lzdGFudCBkZSBzZXJ2aWNlcyBXZWIKLUZPUk1fTEFCRUxfQ0hPT1NFX1dJWkFSRD1TXHUwMGU5bGVjdGlvbm5leiB1biBhc3Npc3RhbnQgXHUwMGUwIGxhbmNlciA6Ci1GT1JNX1JBRElPX1dFQl9TRVJWSUNFX0NMSUVOVF9XSVpBUkQ9Q2xpZW50IGR1IHNlcnZpY2UgV2ViCi1GT1JNX1JBRElPX1dFQl9TRVJWSUNFX1NLRUxFVE9OX1dJWkFSRD1TcXVlbGV0dGUgZHUgc2VydmljZSBXZWIKLU1TR19FUlJPUl9XSVpBUkRfQUxSRUFEWV9SVU5OSU5HPUlXQUIwMTI2RSBVbiBhc3Npc3RhbnQgZGUgc2VydmljZSBXZWIgZXN0IGRcdTAwZTlqXHUwMGUwIGVuIGNvdXJzIGQnZXhcdTAwZTljdXRpb24uICBDb21tZW5jZXogcGFyIGZlcm1lciBsJ2Fzc2lzdGFudCBxdWUgdm91cyB1dGlsaXNleiBhdmFudCBkZSBsYW5jZXIgdW4gYXV0cmUgYXNzaXN0YW50LgotTVNHX0VSUk9SX1dTRExfVVJMX0lTX1VOUkVBQ0hBQkxFPUlXQUIwMTI3RSBMZSBkb2N1bWVudCBXU0RMIGVzdCBpbmFjY2Vzc2libGUuCi0KLSMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uCi1BTFRfV1NJTF9JTVBPUlRfVE9fRlM9SW1wb3J0ZXIgdW4gZG9jdW1lbnQgV1NJTCBkYW5zIGxlIHN5c3RcdTAwZThtZSBkZSBmaWNoaWVycwotQUxUX1dTRExfSU1QT1JUX1RPX0ZTPUltcG9ydGVyIHVuIGRvY3VtZW50IFdTREwgZGFucyBsZSBzeXN0XHUwMGU4bWUgZGUgZmljaGllcnMKLU1TR19FUlJPUl9SRVRSSUVWSU5HX1dTRExfRE9DPUlXQUIwMTI4RSBJbXBvc3NpYmxlIGQnZXh0cmFpcmUgbGUgZG9jdW1lbnQgV1NETC4KLU1TR19FUlJPUl9SRVRSSUVWSU5HX1dTSUxfRE9DPUlXQUIwMTI5RSBJbXBvc3NpYmxlIGQnZXh0cmFpcmUgbGUgZG9jdW1lbnQgV1NJTC4KLU1TR19JTVBPUlRfV1NETF9TVUNDRVNTRlVMPUxlIGRvY3VtZW50IFdTREwgYSBcdTAwZTl0XHUwMGU5IGltcG9ydFx1MDBlOS4KLU1TR19JTVBPUlRfV1NJTF9TVUNDRVNTRlVMPUxlIGRvY3VtZW50IFdTSUwgYSBcdTAwZTl0XHUwMGU5IGltcG9ydFx1MDBlOS4KLQotIyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbgotQUxUX0lNUE9SVF9XU0RMX1RPX1dPUktCRU5DSD1JbXBvcnRlciB1biBkb2N1bWVudCBXU0RMIGRhbnMgbGUgcGxhbiBkZSB0cmF2YWlsCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XT1JLQkVOQ0hfREVTQz1TXHUwMGU5bGVjdGlvbm5leiB1biBwcm9qZXQgZGUgcGxhbiBkZSB0cmF2YWlsIHBvdXIgeSBzYXV2ZWdhcmRlciBsZSBmaWNoaWVyIFdTREwuIFZvdXMgcG91dmV6IGF1c3NpIGNoYW5nZXIgbGUgbm9tIGR1IGZpY2hpZXIgV1NETC4KLVdFQl9QUk9KRUNUX05BTUU9UHJvamV0IFdlYiA6Ci1XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FPVByb2pldCBkZSBwbGFuIGRlIHRyYXZhaWwgOgotTEFCRUxfSU1QT1JUX1dTREw9SW1wb3J0ZXIgbGUgZG9jdW1lbnQgV1NETAotTEFCRUxfSU1QT1JUX1RPX1dTSUw9SW1wb3J0ZXIgY29tbWUgclx1MDBlOWZcdTAwZTlyZW5jZSBkZSBzZXJ2aWNlIGRhbnMgdW4gZG9jdW1lbnQgV1NJTAotSU1QT1JURURfV1NETF9GSUxFX05BTUU9Tm9tIGR1IGZpY2hpZXIgV1NETCA6Ci1XU0lMX0ZJTEVfTkFNRT1Ob20gZHUgZmljaGllciBXU0lMIDoKLU1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1JbXBvc3NpYmxlIGRlIGNyXHUwMGU5ZXIgbGUgZmljaGllciAiJTIiIHJlbGF0aXZlbWVudCBhdSBjaGVtaW4gIiUxIiBjYXIgbGUgcmVtcGxhY2VtZW50IGF1dG9tYXRpcXVlIGRlcyBmaWNoaWVycyBuJ2EgcGFzIFx1MDBlOXRcdTAwZTkgYWN0aXZcdTAwZTkuIFZvdWxlei12b3VzIGwnYWN0aXZlciBwb3VyIGNlIGZpY2hpZXIgPwotTVNHX0VSUk9SX0lOVkFMSURfV09SS0JFTkNIX1BST0pFQ1Q9SVdBQjAxMzBFIFNcdTAwZTlsZWN0aW9ubmV6IHVuIHByb2pldCBkZSBwbGFuIGRlIHRyYXZhaWwuCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfTkFNRT1JV0FCMDEzMUUgTm9tIGRlIGZpY2hpZXIgbm9uIHZhbGlkZS4KLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfRklMRV9OQU1FPUlXQUIwNDcwRSBOb20gZGUgZmljaGllciBXU0lMIG5vbiB2YWxpZGUuCi1NU0dfRVJST1JfTk9fSU1QT1JUX09QVElPTl9TRUxFQ1RFRD1JV0FCMDQ3MUUgQXVjdW5lIG9wdGlvbiBkJ2ltcG9ydGF0aW9uIG4nZXN0IHNcdTAwZTlsZWN0aW9ublx1MDBlOWUuICBDaG9pc2lzc2V6IGF1IG1vaW5zIHVuZSBvcHRpb24gZCdpbXBvcnRhdGlvbi4KLU1TR19FUlJPUl9XUklUSU5HX1RFTVBfRklMRV9UT19GUz1JV0FCMDEzMkUgSW1wb3NzaWJsZSBkJ2VucmVnaXN0cmVyIGxlIGZpY2hpZXIgdGVtcG9yYWlyZS4KLU1TR19JTkZPX0lNUE9SVF9UT19XT1JLQkVOQ0hfU1VDQ0VTU0ZVTD1JV0FCMDMxNEkgJTEgYSBcdTAwZTl0XHUwMGU5IGltcG9ydFx1MDBlOSBkYW5zIGxlIHBsYW4gZGUgdHJhdmFpbC4KLU1TR19JTkZPX0lNUE9SVF9TRVJWSUNFX1JFRl9UT19XU0lMX1NVQ0NFU1NGVUw9SVdBQjA0NzJJIExhIHJcdTAwZTlmXHUwMGU5cmVuY2UgZGUgc2VydmljZSBhIFx1MDBlOXRcdTAwZTkgaW1wb3J0XHUwMGU5ZSBkYW5zICUxLgotCi0jIENoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uCi1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1JbXBvc3NpYmxlIGRlIGNyXHUwMGU5ZXIgbGUgZmljaGllciAiJTIiIHJlbGF0aXZlbWVudCBhdSBjaGVtaW4gIiUxIiBjYXIgbGEgclx1MDBlOXNlcnZhdGlvbiBhdXRvbWF0aXF1ZSBkZXMgZmljaGllcnMgbidhIHBhcyBcdTAwZTl0XHUwMGU5IGFjdGl2XHUwMGU5LiBWb3VsZXotdm91cyBsJ2FjdGl2ZXIgcG91ciBjZSBmaWNoaWVyID8KLQotIyBDbGVhck5vZGVBY3Rpb24KLU1TR19JTkZPX05PREVfQ0xFQVJFRD1JV0FCMDEzM0kgJTEgZWZmYWNcdTAwZTkuCi0KLSMgVGFibGUgdHdpc3RlZXMKLUFMVF9UV0lTVF9PUEVORUQ9TWFzcXVlcgotQUxUX1RXSVNUX0NMT1NFRD1EXHUwMGU5dmVsb3BwZXIKLQotIyBXU0RMIEJyb3dzZXIKLUZPUk1fTElOS19CUk9XU0U9UGFyY291cmlyLi4uCi1USVRMRV9XU0RMX0JST1dTRVI9TmF2aWdhdGV1ciBkZSBXU0RMIC0gJTEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0U9U1x1MDBlOWxlY3Rpb25uZXogbGEgc291cmNlIFdTREwgOgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9XRUJQUk9KRUNUUz1Qcm9qZXRzIFdlYgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9RmF2b3JpcwotRk9STV9MQUJFTF9XRUJfUFJPSkVDVD1Qcm9qZXQgV2ViCi1GT1JNX0xBQkVMX1dTRExfVVJMPVVSTCBXU0RMCi1GT1JNX0JVVFRPTl9SRUZSRVNIPVJcdTAwZTlnXHUwMGU5blx1MDBlOXJlcgotQUxUX1dTRExfQlJPV1NFUj1OYXZpZ2F0ZXVyIFdTREwKLVdTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRVM9SW50ZXJmYWNlcyBkZSBzZXJ2aWNlCi1XU0RMX1RZUEVfU0VSVklDRVM9U2VydmljZXMKLQotIyBDYWxlbmRhciBCcm93c2VyCi1USVRMRV9DQUxFTkRBUl9CUk9XU0VSPU5hdmlnYXRldXIgZGUgY2FsZW5kcmllcgotIyAyIGNoYXJhY3RlciBhYmJyZXZpYXRpb25zIGZvciBkYXlzIG9mIHRoZSB3ZWVrLgotRk9STV9MQUJFTF9TSF9TVU5EQVk9RGkKLUZPUk1fTEFCRUxfU0hfTU9OREFZPUx1Ci1GT1JNX0xBQkVMX1NIX1RVRVNEQVk9TWEKLUZPUk1fTEFCRUxfU0hfV0VETkVTREFZPU1lCi1GT1JNX0xBQkVMX1NIX1RIVVJTREFZPUplCi1GT1JNX0xBQkVMX1NIX0ZSSURBWT1WZQotRk9STV9MQUJFTF9TSF9TQVRVUkRBWT1TYQotIyBNb250aHMgb2YgdGhlIHllYXIKLUZPUk1fTEFCRUxfTU9OVEg9TW9pcyA6Ci1GT1JNX0xBQkVMX0pBTlVBUlk9SmFudmllcgotRk9STV9MQUJFTF9GRUJSVUFSWT1GXHUwMGU5dnJpZXIKLUZPUk1fTEFCRUxfTUFSQ0g9TWFycwotRk9STV9MQUJFTF9BUFJJTD1BdnJpbAotRk9STV9MQUJFTF9NQVk9TWFpCi1GT1JNX0xBQkVMX0pVTkU9SnVpbgotRk9STV9MQUJFTF9KVUxZPUp1aWxsZXQKLUZPUk1fTEFCRUxfQVVHVVNUPUFvXHUwMGZidAotRk9STV9MQUJFTF9TRVBURU1CRVI9U2VwdGVtYnJlCi1GT1JNX0xBQkVMX09DVE9CRVI9T2N0b2JyZQotRk9STV9MQUJFTF9OT1ZFTUJFUj1Ob3ZlbWJyZQotRk9STV9MQUJFTF9ERUNFTUJFUj1EXHUwMGU5Y2VtYnJlCi1GT1JNX0xBQkVMX1lFQVI9QW5uXHUwMGU5ZSA6Ci1GT1JNX0xBQkVMX1RJTUU9SGV1cmUgOgotRk9STV9MSU5LX1RPREFZPUF1am91cmQnaHVpCi1GT1JNX0xJTktfUFJFVklPVVNfWUVBUj08PAotRk9STV9MSU5LX1BSRVZJT1VTX01PTlRIPTwKLUZPUk1fTElOS19ORVhUX01PTlRIPT4KLUZPUk1fTElOS19ORVhUX1lFQVI9Pj4KLUFMVF9QUkVWSU9VU19ZRUFSPUFublx1MDBlOWUgcHJcdTAwZTljXHUwMGU5ZGVudGUKLUFMVF9QUkVWSU9VU19NT05USD1Nb2lzIHByXHUwMGU5Y1x1MDBlOWRlbnQKLUFMVF9ORVhUX01PTlRIPU1vaXMgc3VpdmFudAotQUxUX05FWFRfWUVBUj1Bbm5cdTAwZTllIHN1aXZhbnRlCi1BTFRfVE9EQVk9QXVqb3VyZCdodWkKLUFMVF9DQUxFTkRBUl9CUk9XU0VSPU5hdmlnYXRldXIgZGUgY2FsZW5kcmllcgotTVNHX0VSUk9SX0lOVkFMSURfVElNRV9GT1JNQVQ9SVdBQjAzNjhFIEwnaGV1cmUgbidhIHBhcyBcdTAwZTl0XHUwMGU5IGluZGlxdVx1MDBlOWUgYXUgZm9ybWF0IEhIOk1NOlNTWy5TU1NdLiBWb3VsZXotdm91cyB1dGlsaXNlciBsZSBmb3JtYXQgZW4gY291cnMgPwotCi0jIEFjdGlvbiBlbmdpbmUKLVRJVExFX0FDVElPTl9SRUNPUkRFUj1Nb3RldXIgZCdlbnJlZ2lzdHJlbWVudCBkZXMgYWN0aW9ucwotRk9STV9MQUJFTF9NT0RFPU1vZGUgOgotRk9STV9MQUJFTF9NT0RFX1BMQVk9TGVjdHVyZQotRk9STV9MQUJFTF9NT0RFX1NUT1A9QXJyXHUwMGVhdAotRk9STV9MQUJFTF9NT0RFX1JFQ09SRD1FbnJlZ2lzdHJlbWVudAotRk9STV9MQUJFTF9TQVZFPVNhdXZlZ2FyZGVyCi1GT1JNX0xBQkVMX1BMQVlfRklMRT1MaXJlIGxlIGZpY2hpZXIgOgotTVNHX0VSUk9SX0lOVkFMSURfUExBWV9GSUxFPUlXQUIwMzYyRSBFbnRyZXogdW4gZmljaGllciBcdTAwZTAgbGlyZS4KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1dPUktBUkVBPUV4cGxvcmF0ZXVyIGRlIHNlcnZpY2VzIFdlYiAtIFpvbmUgZGUgdHJhdmFpbAotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfVE9PTEJBUj1FeHBsb3JhdGV1ciBkZSBzZXJ2aWNlcyBXZWIgLSBCYXJyZSBkJ291dGlscwotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfQ09OVEVOVD1FeHBsb3JhdGV1ciBkZSBzZXJ2aWNlcyBXZWIgLSBDb250ZW51IGRlIGxhIHBhZ2UKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1OYXZpZ2F0ZXVyIFdTREwgLSBCYXJyZSBkJ291dGlscwotRlJBTUVfVElUTEVfV1NETF9DT05URU5UPU5hdmlnYXRldXIgV1NETCAtIENvbnRlbnUKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9QQUdFX0xPQURFUj1DaGFyZ2V1ciBkZSBwYWdlcwotRk9STV9USVRMRV9QQUdFX0NPTlRFTlQ9Q29udGVudSBkZSBsYSBwYWdlIGNoYXJnXHUwMGU5ZQotRk9STV9USVRMRV9MQVVOQ0hfV0VCU0VSVklDRV9XSVpBUkQ9Rm9ybXVsYWlyZSBBc3Npc3RhbnQgZGUgbGFuY2VtZW50IGQndW4gc2VydmljZSBXZWIKLUZPUk1fVElUTEVfSU1QT1JUX1RPX1dPUktCRU5DSD1Gb3JtdWxhaXJlIEltcG9ydGF0aW9uIGRhbnMgbGUgcGxhbiBkZSB0cmF2YWlsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9pdC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4ZTJjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dTRVhQTE9SRVI9RXNwbG9yYSBzZXJ2aXppIFdlYgotCi0jIFRyZWUgTm9kZXMKLUFMVF9PUEVOPUFwcmkKLUFMVF9DTE9TRT1DaGl1ZGkKLQotIyBQZXJzcGVjdGl2ZSBUb29sYmFyCi1BTFRfQkFDSz1JbmRpZXRybwotQUxUX0ZPUldBUkQ9QXZhbnRpCi1BTFRfQUNUSU9OX0VOR0lORT1SZWdpc3RyYXRvcmUgYXppb25pCi1BTFRfVURESV9QRVJTUEVDVElWRT1QYWdpbmEgVURESQotQUxUX1dTSUxfUEVSU1BFQ1RJVkU9UGFnaW5hIFdTSUwKLUFMVF9XU0RMX1BFUlNQRUNUSVZFPVBhZ2luYSBXU0RMCi1BTFRfRkFWT1JJVEVTX1BFUlNQRUNUSVZFPVByZWZlcml0aQotCi0jIFRvb2xiYXJzCi1BTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFPUZhcmUgZG9wcGlvIGNsaWMgcGVyIGluZ3JhbmRpcmUKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRT1GYXJlIGRvcHBpbyBjbGljIHBlciByaXByaXN0aW5hcmUKLQotIyBTZXREZWZhdWx0Vmlld1Rvb2wKLUFMVF9CQUNLX1RPX1RPUD1Ub3JuYSBhbGwnaW5pemlvCi0KLSMgQ29tbW9uIEFjdGlvbnMKLUFMVF9SRUZSRVNIPUFnZ2lvcm5hCi1BTFRfQ0xFQVI9Q2FuY2VsbGEKLUFMVF9SRVNVTFRTPVJpc3VsdGF0aQotCi0jIENvbW1vbiBMYWJlbHMKLUFMVF9OQVZJR0FUT1I9U2VsZXppb25lCi1BTFRfQUNUSU9OUz1BemlvbmkKLUFMVF9TVEFUVVM9U3RhdG8KLUFMVF9PVEhFUl9BQ1RJT05TPUFsdHJlIGF6aW9uaQotRk9STV9CVVRUT05fR089Jm5ic3A7Jm5ic3A7VmFpJm5ic3A7Jm5ic3A7Ci1GT1JNX0JVVFRPTl9SRVNFVD1SZWltcG9zdGEKLUZPUk1fQlVUVE9OX0NBTkNFTD1Bbm51bGxhCi1GT1JNX0xBQkVMX0FDVElPTlM9QXppb25pCi1GT1JNX0xBQkVMX0FDVElPTlNfTk9ORT1OZXNzdW5hCi0KLSMgUGxhY2Vob2xkZXIgZm9yIGJsYW5rIHRhYmxlIGVudHJpZXMKLVRBQkxFX0JMQU5LX1BMQUNFSE9MREVSPS0tCi0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWD1TZWxlemlvbmEgdHV0dG8KLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWD1TZWxlemlvbmEgcmlnYQotCi0jIENvbW1vbiBNZXNzYWdlcwotTVNHX0VSUk9SX1VORVhQRUNURUQ9SVdBQjAxMzVFIFNpIFx1MDBlOCB2ZXJpZmljYXRvIHVuIGVycm9yZSBpbXByZXZpc3RvLgotTVNHX0VSUk9SX05PX0FDVElPTl9TRUxFQ1RFRD1JV0FCMDEyNEUgU2VsZXppb25hcmUgdW4nYXppb25lLgotTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQ9SVdBQjAxMjVFIFNlbGV6aW9uYXJlIHVuIG5vZG8uCi1NU0dfU1VCTUlUX0lOX1BST0dSRVNTPUF0dGVuZGVyZS4gTCdvcGVyYXppb25lIFx1MDBlOCBhbmNvcmEgaW4gY29yc28uCi1NU0dfTE9BRF9JTl9QUk9HUkVTUz1BdHRlbmRlcmUgaWwgY2FyaWNhbWVudG8gZGVsIG1vZHVsby4uLgotCi0jTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbgotQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQ9QXZ2aW8gcHJvY2VkdXJhIGd1aWRhdGEgc2Vydml6aSBXZWIKLUZPUk1fTEFCRUxfQ0hPT1NFX1dJWkFSRD1TZWxlemlvbmFyZSB1bmEgcHJvY2VkdXJhIGd1aWRhdGEgZGEgYXZ2aWFyZToKLUZPUk1fUkFESU9fV0VCX1NFUlZJQ0VfQ0xJRU5UX1dJWkFSRD1DbGllbnQgZGkgc2Vydml6aSBXZWIKLUZPUk1fUkFESU9fV0VCX1NFUlZJQ0VfU0tFTEVUT05fV0laQVJEPVN0cnV0dHVyYSBkZWwgc2Vydml6aW8gV2ViCi1NU0dfRVJST1JfV0laQVJEX0FMUkVBRFlfUlVOTklORz1JV0FCMDEyNkUgVW5hIHByb2NlZHVyYSBndWlkYXRhIGRlaSBzZXJ2aXppIFdlYiBcdTAwZTggZ2lcdTAwZTAgaW4gZXNlY3V6aW9uZS4gIENvbXBsZXRhcmUgbGEgcHJvY2VkdXJhIGd1aWRhdGEgZXNpc3RlbnRlIHByaW1hIGRpIGF2dmlhcmUgdW5hIG51b3ZhIHByb2NlZHVyYS4KLU1TR19FUlJPUl9XU0RMX1VSTF9JU19VTlJFQUNIQUJMRT1JV0FCMDEyN0UgSWwgZG9jdW1lbnRvIFdTREwgbm9uIFx1MDBlOCByYWdnaXVuZ2liaWxlLgotCi0jIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotQUxUX1dTSUxfSU1QT1JUX1RPX0ZTPUltcG9ydGEgV1NJTCBuZWwgZmlsZXN5c3RlbQotQUxUX1dTRExfSU1QT1JUX1RPX0ZTPUltcG9ydGEgV1NETCBuZWwgZmlsZXN5c3RlbQotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NETF9ET0M9SVdBQjAxMjhFIEltcG9zc2liaWxlIHJpY2hpYW1hcmUgaWwgZG9jdW1lbnRvIFdTREwuCi1NU0dfRVJST1JfUkVUUklFVklOR19XU0lMX0RPQz1JV0FCMDEyOUUgSW1wb3NzaWJpbGUgcmljaGlhbWFyZSBpbCBkb2N1bWVudG8gV1NJTC4KLU1TR19JTVBPUlRfV1NETF9TVUNDRVNTRlVMPURvY3VtZW50byBXU0RMIGltcG9ydGF0byBjb3JyZXR0YW1lbnRlLgotTVNHX0lNUE9SVF9XU0lMX1NVQ0NFU1NGVUw9RG9jdW1lbnRvIFdTSUwgaW1wb3J0YXRvIGNvcnJldHRhbWVudGUuCi0KLSMgSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24KLUFMVF9JTVBPUlRfV1NETF9UT19XT1JLQkVOQ0g9SW1wb3J0YSBXU0RMIG5lbCB3b3JrYmVuY2gKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1dPUktCRU5DSF9ERVNDPVNlbGV6aW9uYXJlIHVuIHByb2dldHRvIGRlbCB3b3JrYmVuY2ggaW4gY3VpIHNhbHZhcmUgaWwgZmlsZSBXU0RMLiBcdTAwYzggcG9zc2liaWxlIGFuY2hlIG1vZGlmaWNhcmUgaWwgbm9tZSBkZWwgZmlsZSBXU0RMLgotV0VCX1BST0pFQ1RfTkFNRT1Qcm9nZXR0byBXZWI6Ci1XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FPVByb2dldHRvIHdvcmtiZW5jaDoKLUxBQkVMX0lNUE9SVF9XU0RMPUltcG9ydGEgZG9jdW1lbnRvIFdTREwKLUxBQkVMX0lNUE9SVF9UT19XU0lMPUltcG9ydGEgY29tZSB1biByaWZlcmltZW50byBkaSBzZXJ2aXppbyBpbiB1biBkb2N1bWVudG8gV1NJTAotSU1QT1JURURfV1NETF9GSUxFX05BTUU9Tm9tZSBmaWxlIFdTREw6Ci1XU0lMX0ZJTEVfTkFNRT1Ob21lIGZpbGUgV1NJTDoKLU1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1JbXBvc3NpYmlsZSBjcmVhcmUgaWwgZmlsZSAiJTIiIHJlbGF0aXZvIGFsIHBlcmNvcnNvICIlMSIuIE5vbiBcdTAwZTggc3RhdGEgYWJpbGl0YXRhIGxhIHNvdnJhc2NyaXR0dXJhIGF1dG9tYXRpY2EgZGVpIGZpbGUuIFNpIGRlc2lkZXJhIGF0dGl2YXJsYSBwZXIgcXVlc3RvIGZpbGU/Ci1NU0dfRVJST1JfSU5WQUxJRF9XT1JLQkVOQ0hfUFJPSkVDVD1JV0FCMDEzMEUgU2VsZXppb25hcmUgdW4gcHJvZ2V0dG8gZGVsIHdvcmtiZW5jaC4KLU1TR19FUlJPUl9JTlZBTElEX1dTRExfRklMRV9OQU1FPUlXQUIwMTMxRSBOb21lIGZpbGUgbm9uIHZhbGlkby4KLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfRklMRV9OQU1FPUlXQUIwNDcwRSBOb21lIGZpbGUgV1NJTCBub24gdmFsaWRvLgotTVNHX0VSUk9SX05PX0lNUE9SVF9PUFRJT05fU0VMRUNURUQ9SVdBQjA0NzFFIE5lc3N1bmEgb3B6aW9uZSBkaSBpbXBvcnRhemlvbmUgc2VsZXppb25hdGEuICBTY2VnbGllcmUgYWxtZW5vIHVuJ29wemlvbmUgZGkgaW1wb3J0YXppb25lLgotTVNHX0VSUk9SX1dSSVRJTkdfVEVNUF9GSUxFX1RPX0ZTPUlXQUIwMTMyRSBJbXBvc3NpYmlsZSBzY3JpdmVyZSBpbCBmaWxlIHRlbXBvcmFuZW8uCi1NU0dfSU5GT19JTVBPUlRfVE9fV09SS0JFTkNIX1NVQ0NFU1NGVUw9SVdBQjAzMTRJICUxIFx1MDBlOCBzdGF0byBpbXBvcnRhdG8gY29ycmV0dGFtZW50ZSBuZWwgd29ya2JlbmNoLgotTVNHX0lORk9fSU1QT1JUX1NFUlZJQ0VfUkVGX1RPX1dTSUxfU1VDQ0VTU0ZVTD1JV0FCMDQ3MkkgSWwgcmlmZXJpbWVudG8gZGkgc2Vydml6aW8gXHUwMGU4IHN0YXRvIGltcG9ydGF0byBjb3JyZXR0YW1lbnRlIGluICUxLgotCi0jIENoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uCi1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1JbXBvc3NpYmlsZSBjcmVhcmUgaWwgZmlsZSAiJTIiIHJlbGF0aXZvIGFsIHBlcmNvcnNvICIlMSIuIE5vbiBcdTAwZTggc3RhdGEgYWJpbGl0YXRhIGwnZXN0cmF6aW9uZSBhdXRvbWF0aWNhIGRlaSBmaWxlLiBTaSBkZXNpZGVyYSBhdHRpdmFybGEgcGVyIHF1ZXN0byBmaWxlPwotCi0jIENsZWFyTm9kZUFjdGlvbgotTVNHX0lORk9fTk9ERV9DTEVBUkVEPUlXQUIwMTMzSSAlMSBjYW5jZWxsYXRvLgotCi0jIFRhYmxlIHR3aXN0ZWVzCi1BTFRfVFdJU1RfT1BFTkVEPU5hc2NvbmRpCi1BTFRfVFdJU1RfQ0xPU0VEPUVzcGFuZGkKLQotIyBXU0RMIEJyb3dzZXIKLUZPUk1fTElOS19CUk9XU0U9U2ZvZ2xpYS4uLgotVElUTEVfV1NETF9CUk9XU0VSPUJyb3dzZXIgV1NETCAtICUxCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFPVNlbGV6aW9uYXJlIHVuJ29yaWdpbmUgV1NETDoKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9UHJvZ2V0dGkgV2ViCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFX0ZBVk9SSVRFUz1QcmVmZXJpdGkKLUZPUk1fTEFCRUxfV0VCX1BST0pFQ1Q9UHJvZ2V0dG8gV2ViCi1GT1JNX0xBQkVMX1dTRExfVVJMPVVSTCBXU0RMCi1GT1JNX0JVVFRPTl9SRUZSRVNIPUFnZ2lvcm5hCi1BTFRfV1NETF9CUk9XU0VSPUJyb3dzZXIgV1NETAotV1NETF9UWVBFX1NFUlZJQ0VfSU5URVJGQUNFUz1JbnRlcmZhY2NlIGRpIHNlcnZpemlvCi1XU0RMX1RZUEVfU0VSVklDRVM9U2Vydml6aQotCi0jIENhbGVuZGFyIEJyb3dzZXIKLVRJVExFX0NBTEVOREFSX0JST1dTRVI9QnJvd3NlciBjYWxlbmRhcmlvCi0jIDIgY2hhcmFjdGVyIGFiYnJldmlhdGlvbnMgZm9yIGRheXMgb2YgdGhlIHdlZWsuCi1GT1JNX0xBQkVMX1NIX1NVTkRBWT1EbwotRk9STV9MQUJFTF9TSF9NT05EQVk9THUKLUZPUk1fTEFCRUxfU0hfVFVFU0RBWT1NYQotRk9STV9MQUJFTF9TSF9XRURORVNEQVk9TWUKLUZPUk1fTEFCRUxfU0hfVEhVUlNEQVk9R2kKLUZPUk1fTEFCRUxfU0hfRlJJREFZPVZlCi1GT1JNX0xBQkVMX1NIX1NBVFVSREFZPVNhCi0jIE1vbnRocyBvZiB0aGUgeWVhcgotRk9STV9MQUJFTF9NT05USD1NZXNlOgotRk9STV9MQUJFTF9KQU5VQVJZPUdlbm5haW8KLUZPUk1fTEFCRUxfRkVCUlVBUlk9RmViYnJhaW8KLUZPUk1fTEFCRUxfTUFSQ0g9TWFyem8KLUZPUk1fTEFCRUxfQVBSSUw9QXByaWxlCi1GT1JNX0xBQkVMX01BWT1NYWdnaW8KLUZPUk1fTEFCRUxfSlVORT1HaXVnbm8KLUZPUk1fTEFCRUxfSlVMWT1MdWdsaW8KLUZPUk1fTEFCRUxfQVVHVVNUPUFnb3N0bwotRk9STV9MQUJFTF9TRVBURU1CRVI9U2V0dGVtYnJlCi1GT1JNX0xBQkVMX09DVE9CRVI9T3R0b2JyZQotRk9STV9MQUJFTF9OT1ZFTUJFUj1Ob3ZlbWJyZQotRk9STV9MQUJFTF9ERUNFTUJFUj1EaWNlbWJyZQotRk9STV9MQUJFTF9ZRUFSPUFubm86Ci1GT1JNX0xBQkVMX1RJTUU9T3JhOgotRk9STV9MSU5LX1RPREFZPU9nZ2kKLUZPUk1fTElOS19QUkVWSU9VU19ZRUFSPTw8Ci1GT1JNX0xJTktfUFJFVklPVVNfTU9OVEg9PAotRk9STV9MSU5LX05FWFRfTU9OVEg9PgotRk9STV9MSU5LX05FWFRfWUVBUj0+PgotQUxUX1BSRVZJT1VTX1lFQVI9QW5ubyBwcmVjZWRlbnRlCi1BTFRfUFJFVklPVVNfTU9OVEg9TWVzZSBwcmVjZWRlbnRlCi1BTFRfTkVYVF9NT05USD1NZXNlIHN1Y2Nlc3Npdm8KLUFMVF9ORVhUX1lFQVI9QW5ubyBzdWNjZXNzaXZvCi1BTFRfVE9EQVk9T2dnaQotQUxUX0NBTEVOREFSX0JST1dTRVI9QnJvd3NlciBjYWxlbmRhcmlvCi1NU0dfRVJST1JfSU5WQUxJRF9USU1FX0ZPUk1BVD1JV0FCMDM2OEUgTCdvcmFyaW8gbm9uIFx1MDBlOCBmb3JtYXR0YXRvIGNvbWUgSEg6TU06U1NbLlNTU10uIFV0aWxpenphcmUgbCdvcmFyaW8gY29ycmVudGU/Ci0KLSMgQWN0aW9uIGVuZ2luZQotVElUTEVfQUNUSU9OX1JFQ09SREVSPVJlZ2lzdHJhdG9yZSBhemlvbmkKLUZPUk1fTEFCRUxfTU9ERT1Nb2RhbGl0XHUwMGUwOgotRk9STV9MQUJFTF9NT0RFX1BMQVk9Umlwcm9kdWNpCi1GT1JNX0xBQkVMX01PREVfU1RPUD1UZXJtaW5hCi1GT1JNX0xBQkVMX01PREVfUkVDT1JEPVJlZ2lzdHJhCi1GT1JNX0xBQkVMX1NBVkU9U2FsdmEKLUZPUk1fTEFCRUxfUExBWV9GSUxFPVJpcHJvZHVjaSBmaWxlOgotTVNHX0VSUk9SX0lOVkFMSURfUExBWV9GSUxFPUlXQUIwMzYyRSBTcGVjaWZpY2FyZSB1biBmaWxlIGRhIHJpcHJvZHVycmUuCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9QRVJTUEVDVElWRV9XT1JLQVJFQT1BcmVhIGRpIGxhdm9ybyBpbnRlcm5hIEVzcGxvcmEgU2Vydml6aSBXZWIKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIEVzcGxvcmEgU2Vydml6aSBXZWIKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX0NPTlRFTlQ9Q29udGVudXRvIGRlbGxhIHBhZ2luYSBFc3Bsb3JhIFNlcnZpemkgV2ViCi1GUkFNRV9USVRMRV9XU0RMX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIGRlbCBicm93c2VyIFdTREwKLUZSQU1FX1RJVExFX1dTRExfQ09OVEVOVD1Db250ZW51dG8gZGVsIGJyb3dzZXIgV1NETAotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX1BBR0VfTE9BREVSPUNhcmljYXRvcmUgcGFnaW5hCi1GT1JNX1RJVExFX1BBR0VfQ09OVEVOVD1Db250ZW51dG8gcGFnaW5hIGNhcmljYXRhCi1GT1JNX1RJVExFX0xBVU5DSF9XRUJTRVJWSUNFX1dJWkFSRD1BdnZpbyBtb2R1bG8gcHJvY2VkdXJhIGd1aWRhdGEgc2Vydml6aSBXZWIKLUZPUk1fVElUTEVfSU1QT1JUX1RPX1dPUktCRU5DSD1JbXBvcnRhemlvbmUgbmVsIG1vZHVsbyBkZWwgd29ya2JlbmNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9qYS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNzU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9qYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dTRVhQTE9SRVI9V2ViIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkN1x1MzBlZFx1MzBmY1x1MzBlOVx1MzBmYwotCi0jIFRyZWUgTm9kZXMKLUFMVF9PUEVOPVx1OTU4Ylx1MzA0ZgotQUxUX0NMT1NFPVx1OTU4OVx1MzA1OFx1MzA4YgotCi0jIFBlcnNwZWN0aXZlIFRvb2xiYXIKLUFMVF9CQUNLPVx1NjIzYlx1MzA4YgotQUxUX0ZPUldBUkQ9XHU5MDMyXHUzMDgwCi1BTFRfQUNUSU9OX0VOR0lORT1cdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZmJcdTMwZWNcdTMwYjNcdTMwZmNcdTMwYzBcdTMwZmMKLUFMVF9VRERJX1BFUlNQRUNUSVZFPVVEREkgXHUzMGRhXHUzMGZjXHUzMGI4Ci1BTFRfV1NJTF9QRVJTUEVDVElWRT1XU0lMIFx1MzBkYVx1MzBmY1x1MzBiOAotQUxUX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdTMwZGFcdTMwZmNcdTMwYjgKLUFMVF9GQVZPUklURVNfUEVSU1BFQ1RJVkU9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhCi0KLSMgVG9vbGJhcnMKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkU9XHUzMGMwXHUzMGQ2XHUzMGViXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU2NzAwXHU1OTI3XHU1MzE2XHUzMDU5XHUzMDhiCi1BTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkU9XHUzMGMwXHUzMGQ2XHUzMGViXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU1ZmE5XHU1MTQzXHUzMDU5XHUzMDhiCi0KLSMgU2V0RGVmYXVsdFZpZXdUb29sCi1BTFRfQkFDS19UT19UT1A9XHUzMGM4XHUzMGMzXHUzMGQ3XHUzMDZiXHU2MjNiXHUzMDhiCi0KLSMgQ29tbW9uIEFjdGlvbnMKLUFMVF9SRUZSRVNIPVx1NjZmNFx1NjViMAotQUxUX0NMRUFSPVx1MzBhZlx1MzBlYVx1MzBhMgotQUxUX1JFU1VMVFM9XHU3ZDUwXHU2NzljCi0KLSMgQ29tbW9uIExhYmVscwotQUxUX05BVklHQVRPUj1cdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmMKLUFMVF9BQ1RJT05TPVx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmMwotQUxUX1NUQVRVUz1cdTcyYjZcdTZjYzEKLUFMVF9PVEhFUl9BQ1RJT05TPVx1MzA1ZFx1MzA2ZVx1NGVkNlx1MzA2ZVx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmMwotRk9STV9CVVRUT05fR089Jm5ic3A7Jm5ic3A7XHU1YjlmXHU4ODRjJm5ic3A7Jm5ic3A7Ci1GT1JNX0JVVFRPTl9SRVNFVD1cdTMwZWFcdTMwYmJcdTMwYzNcdTMwYzgKLUZPUk1fQlVUVE9OX0NBTkNFTD1cdTMwYWRcdTMwZTNcdTMwZjNcdTMwYmJcdTMwZWIKLUZPUk1fTEFCRUxfQUNUSU9OUz1cdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjMKLUZPUk1fTEFCRUxfQUNUSU9OU19OT05FPVx1MzA2YVx1MzA1NwotCi0jIFBsYWNlaG9sZGVyIGZvciBibGFuayB0YWJsZSBlbnRyaWVzCi1UQUJMRV9CTEFOS19QTEFDRUhPTERFUj0tLQotCi0jIENvbW1vbiBGb3JtIENvbnRyb2wgVGl0bGVzCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1g9XHUzMDU5XHUzMDc5XHUzMDY2XHU5MDc4XHU2MjllCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1g9XHU4ODRjXHUzMDZlXHU5MDc4XHU2MjllCi0KLSMgQ29tbW9uIE1lc3NhZ2VzCi1NU0dfRVJST1JfVU5FWFBFQ1RFRD1JV0FCMDEzNUUgXHU0ZTg4XHU2NzFmXHUzMDU3XHUzMDZhXHUzMDQ0XHUzMGE4XHUzMGU5XHUzMGZjXHUzMDRjXHU3NjdhXHU3NTFmXHUzMDU3XHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfRVJST1JfTk9fQUNUSU9OX1NFTEVDVEVEPUlXQUIwMTI0RSBcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLU1TR19FUlJPUl9OT19OT0RFX1NFTEVDVEVEPUlXQUIwMTI1RSBcdTMwY2VcdTMwZmNcdTMwYzlcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLU1TR19TVUJNSVRfSU5fUFJPR1JFU1M9XHUzMDRhXHU1Zjg1XHUzMDYxXHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIFx1NjRjZFx1NGY1Y1x1MzA0Y1x1N2Q0Mlx1NGU4Nlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgotTVNHX0xPQURfSU5fUFJPR1JFU1M9XHU2NmY4XHU1ZjBmXHUzMDZlXHUzMGVkXHUzMGZjXHUzMGM5XHUzMDRjXHU1YjhjXHU0ZTg2XHUzMDU5XHUzMDhiXHUzMDdlXHUzMDY3XHUzMDRhXHU1Zjg1XHUzMDYxXHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0Li4uCi0KLSNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uCi1BTFRfTEFVTkNIX1dFQl9TRVJWSUNFX1dJWkFSRD1cdTMwMGNXZWIgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHU4ZDc3XHU1MmQ1XHUzMDBkXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5Ci1GT1JNX0xBQkVMX0NIT09TRV9XSVpBUkQ9XHU4ZDc3XHU1MmQ1XHUzMDU5XHUzMDhiXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5XHUzMDZlXHU5MDc4XHU2MjllOgotRk9STV9SQURJT19XRUJfU0VSVklDRV9DTElFTlRfV0laQVJEPVdlYiBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYWZcdTMwZTlcdTMwYTRcdTMwYTJcdTMwZjNcdTMwYzgKLUZPUk1fUkFESU9fV0VCX1NFUlZJQ0VfU0tFTEVUT05fV0laQVJEPVdlYiBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYjlcdTMwYjFcdTMwZWJcdTMwYzhcdTMwZjMKLU1TR19FUlJPUl9XSVpBUkRfQUxSRUFEWV9SVU5OSU5HPUlXQUIwMTI2RSBXZWIgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE2XHUzMGEzXHUzMGI2XHUzMGZjXHUzMGM5XHUzMDZmXHUzMDU5XHUzMDY3XHUzMDZiXHU4ZDc3XHU1MmQ1XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyICBcdTY1ZTJcdTViNThcdTMwNmVcdTMwYTZcdTMwYTNcdTMwYjZcdTMwZmNcdTMwYzlcdTMwOTJcdTdkNDJcdTRlODZcdTMwNTdcdTMwNjZcdTMwNGJcdTMwODlcdTMwMDFcdTY1YjBcdTg5OGZcdTMwYTZcdTMwYTNcdTMwYjZcdTMwZmNcdTMwYzlcdTMwOTJcdThkNzdcdTUyZDVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLU1TR19FUlJPUl9XU0RMX1VSTF9JU19VTlJFQUNIQUJMRT1JV0FCMDEyN0UgV1NETCBcdTY1ODdcdTY2ZjhcdTMwNmJcdTMwYTJcdTMwYWZcdTMwYmJcdTMwYjlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKLQotIyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLUFMVF9XU0lMX0lNUE9SVF9UT19GUz1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwZmJcdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTBcdTMwNzhcdTMwNmUgV1NJTCBcdTMwNmVcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzgKLUFMVF9XU0RMX0lNUE9SVF9UT19GUz1cdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwZmJcdTMwYjdcdTMwYjlcdTMwYzZcdTMwZTBcdTMwNzhcdTMwNmUgV1NETCBcdTMwNmVcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzgKLU1TR19FUlJPUl9SRVRSSUVWSU5HX1dTRExfRE9DPUlXQUIwMTI4RSBXU0RMIFx1NjU4N1x1NjZmOFx1MzA5Mlx1NjkxY1x1N2QyMlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NJTF9ET0M9SVdBQjAxMjlFIFdTSUwgXHU2NTg3XHU2NmY4XHUzMDkyXHU2OTFjXHU3ZDIyXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCi1NU0dfSU1QT1JUX1dTRExfU1VDQ0VTU0ZVTD1XU0RMIFx1NjU4N1x1NjZmOFx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotTVNHX0lNUE9SVF9XU0lMX1NVQ0NFU1NGVUw9V1NJTCBcdTY1ODdcdTY2ZjhcdTMwNGNcdTZiNjNcdTVlMzhcdTMwNmJcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLQotIyBJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbgotQUxUX0lNUE9SVF9XU0RMX1RPX1dPUktCRU5DSD1cdTMwZWZcdTMwZmNcdTMwYWZcdTMwZDlcdTMwZjNcdTMwYzFcdTMwNzhcdTMwNmUgV1NETCBcdTMwNmVcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzgKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1dPUktCRU5DSF9ERVNDPVdTREwgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU0ZmRkXHU3YmExXHUzMDU5XHUzMDhiXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ5XHUzMGYzXHUzMGMxXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFdTREwgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU1OTA5XHU2NmY0XHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDgyXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyCi1XRUJfUFJPSkVDVF9OQU1FPVdlYiBcdTMwZDdcdTMwZWRcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzg6Ci1XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBkOVx1MzBmM1x1MzBjMVx1MzBmYlx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjODoKLUxBQkVMX0lNUE9SVF9XU0RMPVdTREwgXHU2NTg3XHU2NmY4XHUzMDZlXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4Ci1MQUJFTF9JTVBPUlRfVE9fV1NJTD1XU0lMIFx1NjU4N1x1NjZmOFx1MzA3OFx1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1NTNjMlx1NzE2N1x1MzA2OFx1MzA1N1x1MzA2Nlx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOAotSU1QT1JURURfV1NETF9GSUxFX05BTUU9V1NETCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTU0MGQ6Ci1XU0lMX0ZJTEVfTkFNRT1XU0lMIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1NTQwZDoKLU1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1cdTgxZWFcdTUyZDVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTRlMGFcdTY2ZjhcdTMwNGRcdTMwNGNcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwNmFcdTMwNDRcdTMwNWZcdTMwODFcdTMwMDFcdTMwZDFcdTMwYjkgIiUxIiBcdTMwOTJcdTU3ZmFcdTZlOTZcdTMwNjhcdTMwNTlcdTMwOGJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIgIiUyIiBcdTMwOTJcdTRmNWNcdTYyMTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTMwNTNcdTMwNmVcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNjdcdTMwNTNcdTMwOGNcdTMwOTJcdTRmN2ZcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/Ci1NU0dfRVJST1JfSU5WQUxJRF9XT1JLQkVOQ0hfUFJPSkVDVD1JV0FCMDEzMEUgXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ5XHUzMGYzXHUzMGMxXHUzMGZiXHUzMGQ3XHUzMGVkXHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfTkFNRT1JV0FCMDEzMUUgXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1NDBkXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX0ZJTEVfTkFNRT1JV0FCMDQ3MEUgV1NJTCBcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTU0MGRcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDIKLU1TR19FUlJPUl9OT19JTVBPUlRfT1BUSU9OX1NFTEVDVEVEPUlXQUIwNDcxRSBcdTMwYTRcdTMwZjNcdTMwZGRcdTMwZmNcdTMwYzhcdTMwZmJcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNGNcdTkwNzhcdTYyOWVcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgIFx1NWMxMVx1MzA2YVx1MzA0Zlx1MzA2Nlx1MzA4MiAxIFx1MzA2NFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOFx1MzBmYlx1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX1dSSVRJTkdfVEVNUF9GSUxFX1RPX0ZTPUlXQUIwMTMyRSBcdTRlMDBcdTY2NDJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmJcdTY2ZjhcdTMwNGRcdThmYmNcdTMwODBcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKLU1TR19JTkZPX0lNUE9SVF9UT19XT1JLQkVOQ0hfU1VDQ0VTU0ZVTD1JV0FCMDMxNEkgJTEgXHUzMDRjXHUzMGVmXHUzMGZjXHUzMGFmXHUzMGQ5XHUzMGYzXHUzMGMxXHUzMDZiXHU2YjYzXHU1ZTM4XHUzMDZiXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfSU5GT19JTVBPUlRfU0VSVklDRV9SRUZfVE9fV1NJTF9TVUNDRVNTRlVMPUlXQUIwNDcySSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTUzYzJcdTcxNjdcdTMwNGMgJTEgXHUzMDZiXHU2YjYzXHU1ZTM4XHUzMDZiXHUzMGE0XHUzMGYzXHUzMGRkXHUzMGZjXHUzMGM4XHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi0KLSMgQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb24KLU1TR19FUlJPUl9GSUxFX0NIRUNLT1VUX0RJU0FCTEVEPVx1ODFlYVx1NTJkNVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBmYlx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZlx1MzBhMlx1MzBhNlx1MzBjOFx1MzA0Y1x1NGY3Zlx1NzUyOFx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0NFx1MzA1Zlx1MzA4MVx1MzAwMVx1MzBkMVx1MzBiOSAiJTEiIFx1MzA5Mlx1NTdmYVx1NmU5Nlx1MzA2OFx1MzA1OVx1MzA4Ylx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYiAiJTIiIFx1MzA5Mlx1NGY1Y1x1NjIxMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1MzA1M1x1MzA2ZVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2N1x1MzA1M1x1MzA4Y1x1MzA5Mlx1NGY3Zlx1NzUyOFx1NTNlZlx1ODBmZFx1MzA2Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8KLQotIyBDbGVhck5vZGVBY3Rpb24KLU1TR19JTkZPX05PREVfQ0xFQVJFRD1JV0FCMDEzM0kgJTEgXHUzMDRjXHUzMGFmXHUzMGVhXHUzMGEyXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi0KLSMgVGFibGUgdHdpc3RlZXMKLUFMVF9UV0lTVF9PUEVORUQ9XHU5NzVlXHU4ODY4XHU3OTNhCi1BTFRfVFdJU1RfQ0xPU0VEPVx1NWM1NVx1OTU4YgotCi0jIFdTREwgQnJvd3NlcgotRk9STV9MSU5LX0JST1dTRT1cdTUzYzJcdTcxNjcuLi4KLVRJVExFX1dTRExfQlJPV1NFUj1XU0RMIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmYyAtICUxCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFPVdTREwgXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZlXHU5MDc4XHU2MjllOgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9XRUJQUk9KRUNUUz1XZWIgXHUzMGQ3XHUzMGVkXHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4Ci1GT1JNX0xBQkVMX1dTRExfU09VUkNFX0ZBVk9SSVRFUz1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGEKLUZPUk1fTEFCRUxfV0VCX1BST0pFQ1Q9V2ViIFx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOAotRk9STV9MQUJFTF9XU0RMX1VSTD1XU0RMIFVSTAotRk9STV9CVVRUT05fUkVGUkVTSD1cdTY2ZjRcdTY1YjAKLUFMVF9XU0RMX0JST1dTRVI9V1NETCBcdTMwZDZcdTMwZTlcdTMwYTZcdTMwYjZcdTMwZmMKLVdTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRVM9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5Ci1XU0RMX1RZUEVfU0VSVklDRVM9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5Ci0KLSMgQ2FsZW5kYXIgQnJvd3NlcgotVElUTEVfQ0FMRU5EQVJfQlJPV1NFUj1cdTMwYWJcdTMwZWNcdTMwZjNcdTMwYzBcdTMwZmNcdTMwZmJcdTMwZDZcdTMwZTlcdTMwYTZcdTMwYjZcdTMwZmMKLSMgMiBjaGFyYWN0ZXIgYWJicmV2aWF0aW9ucyBmb3IgZGF5cyBvZiB0aGUgd2Vlay4KLUZPUk1fTEFCRUxfU0hfU1VOREFZPVx1NjVlNQotRk9STV9MQUJFTF9TSF9NT05EQVk9XHU2NzA4Ci1GT1JNX0xBQkVMX1NIX1RVRVNEQVk9XHU3MDZiCi1GT1JNX0xBQkVMX1NIX1dFRE5FU0RBWT1cdTZjMzQKLUZPUk1fTEFCRUxfU0hfVEhVUlNEQVk9XHU2NzI4Ci1GT1JNX0xBQkVMX1NIX0ZSSURBWT1cdTkxZDEKLUZPUk1fTEFCRUxfU0hfU0FUVVJEQVk9XHU1NzFmCi0jIE1vbnRocyBvZiB0aGUgeWVhcgotRk9STV9MQUJFTF9NT05USD1cdTY3MDg6Ci1GT1JNX0xBQkVMX0pBTlVBUlk9MSBcdTY3MDgKLUZPUk1fTEFCRUxfRkVCUlVBUlk9MiBcdTY3MDgKLUZPUk1fTEFCRUxfTUFSQ0g9MyBcdTY3MDgKLUZPUk1fTEFCRUxfQVBSSUw9NCBcdTY3MDgKLUZPUk1fTEFCRUxfTUFZPTUgXHU2NzA4Ci1GT1JNX0xBQkVMX0pVTkU9NiBcdTY3MDgKLUZPUk1fTEFCRUxfSlVMWT03IFx1NjcwOAotRk9STV9MQUJFTF9BVUdVU1Q9OCBcdTY3MDgKLUZPUk1fTEFCRUxfU0VQVEVNQkVSPTkgXHU2NzA4Ci1GT1JNX0xBQkVMX09DVE9CRVI9MTAgXHU2NzA4Ci1GT1JNX0xBQkVMX05PVkVNQkVSPTExIFx1NjcwOAotRk9STV9MQUJFTF9ERUNFTUJFUj0xMiBcdTY3MDgKLUZPUk1fTEFCRUxfWUVBUj1cdTVlNzQ6Ci1GT1JNX0xBQkVMX1RJTUU9XHU2NjQyXHU1MjNiOgotRk9STV9MSU5LX1RPREFZPVx1NGVjYVx1NjVlNQotRk9STV9MSU5LX1BSRVZJT1VTX1lFQVI9PDwKLUZPUk1fTElOS19QUkVWSU9VU19NT05USD08Ci1GT1JNX0xJTktfTkVYVF9NT05USD0+Ci1GT1JNX0xJTktfTkVYVF9ZRUFSPT4+Ci1BTFRfUFJFVklPVVNfWUVBUj1cdTUyNGRcdTVlNzQKLUFMVF9QUkVWSU9VU19NT05USD1cdTUyNGRcdTY3MDgKLUFMVF9ORVhUX01PTlRIPVx1N2ZjY1x1NjcwOAotQUxUX05FWFRfWUVBUj1cdTdmY2NcdTVlNzQKLUFMVF9UT0RBWT1cdTRlY2FcdTY1ZTUKLUFMVF9DQUxFTkRBUl9CUk9XU0VSPVx1MzBhYlx1MzBlY1x1MzBmM1x1MzBjMFx1MzBmY1x1MzBmYlx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmYwotTVNHX0VSUk9SX0lOVkFMSURfVElNRV9GT1JNQVQ9SVdBQjAzNjhFIFx1NjY0Mlx1NTIzYlx1MzA0YyBISDpNTTpTU1suU1NTXSBcdTMwNmVcdTVmNjJcdTVmMGZcdTMwNmJcdThhMmRcdTViOWFcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIgXHU0ZWUzXHUzMDhmXHUzMDhhXHUzMDZiXHU3M2ZlXHU1NzI4XHU2NjQyXHU1MjNiXHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPwotCi0jIEFjdGlvbiBlbmdpbmUKLVRJVExFX0FDVElPTl9SRUNPUkRFUj1cdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZmJcdTMwZWNcdTMwYjNcdTMwZmNcdTMwYzBcdTMwZmMKLUZPUk1fTEFCRUxfTU9ERT1cdTMwZTJcdTMwZmNcdTMwYzk6Ci1GT1JNX0xBQkVMX01PREVfUExBWT1cdTUxOGRcdTc1MWYKLUZPUk1fTEFCRUxfTU9ERV9TVE9QPVx1NTA1Y1x1NmI2MgotRk9STV9MQUJFTF9NT0RFX1JFQ09SRD1cdThhMThcdTkzMzIKLUZPUk1fTEFCRUxfU0FWRT1cdTRmZGRcdTdiYTEKLUZPUk1fTEFCRUxfUExBWV9GSUxFPVx1NTE4ZFx1NzUxZlx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYjoKLU1TR19FUlJPUl9JTlZBTElEX1BMQVlfRklMRT1JV0FCMDM2MkUgXHU1MThkXHU3NTFmXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9QRVJTUEVDVElWRV9XT1JLQVJFQT1XZWIgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE4XHUzMGFmXHUzMGI5XHUzMGQ3XHUzMGVkXHUzMGZjXHUzMGU5XHUzMGZjXHU0ZjVjXHU2OTZkXHUzMGE4XHUzMGVhXHUzMGEyCi1GUkFNRV9USVRMRV9QRVJTUEVDVElWRV9UT09MQkFSPVdlYiBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYThcdTMwYWZcdTMwYjlcdTMwZDdcdTMwZWRcdTMwZmNcdTMwZTlcdTMwZmNcdTMwZmJcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZDBcdTMwZmMKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX0NPTlRFTlQ9V2ViIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhOFx1MzBhZlx1MzBiOVx1MzBkN1x1MzBlZFx1MzBmY1x1MzBlOVx1MzBmY1x1MzBmYlx1MzBkYVx1MzBmY1x1MzBiOFx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNAotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPVdTREwgXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMGZjXHUzMGZiXHUzMGM0XHUzMGZjXHUzMGViXHUzMGQwXHUzMGZjCi1GUkFNRV9USVRMRV9XU0RMX0NPTlRFTlQ9V1NETCBcdTMwZDZcdTMwZTlcdTMwYTZcdTMwYjZcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9QQUdFX0xPQURFUj1cdTMwZGFcdTMwZmNcdTMwYjhcdTMwZmJcdTMwZWRcdTMwZmNcdTMwYzBcdTMwZmMKLUZPUk1fVElUTEVfUEFHRV9DT05URU5UPVx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBkYVx1MzBmY1x1MzBiOFx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNAotRk9STV9USVRMRV9MQVVOQ0hfV0VCU0VSVklDRV9XSVpBUkQ9V2ViIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1OGQ3N1x1NTJkNVx1MzBhNlx1MzBhM1x1MzBiNlx1MzBmY1x1MzBjOVx1MzA2ZVx1NjZmOFx1NWYwZgotRk9STV9USVRMRV9JTVBPUlRfVE9fV09SS0JFTkNIPVx1MzBlZlx1MzBmY1x1MzBhZlx1MzBkOVx1MzBmM1x1MzBjMVx1NjZmOFx1NWYwZlx1MzA3OFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfa28ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2V4cGxvcmVyX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmMxODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1USVRMRV9XU0VYUExPUkVSPVx1YzZmOSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVkMGQwXHVjMGM5XHVhZTMwCi0KLSMgVHJlZSBOb2RlcwotQUxUX09QRU49XHVjNWY0XHVhZTMwCi1BTFRfQ0xPU0U9XHViMmViXHVhZTMwCi0KLSMgUGVyc3BlY3RpdmUgVG9vbGJhcgotQUxUX0JBQ0s9XHVjNzc0XHVjODA0Ci1BTFRfRk9SV0FSRD1cdWIyZTRcdWM3NGMKLUFMVF9BQ1RJT05fRU5HSU5FPVx1Yzg3MFx1Y2U1OCBcdWI4MDhcdWNmNTRcdWIzNTQKLUFMVF9VRERJX1BFUlNQRUNUSVZFPVVEREkgXHVkMzk4XHVjNzc0XHVjOWMwCi1BTFRfV1NJTF9QRVJTUEVDVElWRT1XU0lMIFx1ZDM5OFx1Yzc3NFx1YzljMAotQUxUX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdWQzOThcdWM3NzRcdWM5YzAKLUFMVF9GQVZPUklURVNfUEVSU1BFQ1RJVkU9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwCi0KLSMgVG9vbGJhcnMKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkU9XHVjZDVjXHViMzAwXHVkNjU0XHVkNTU4XHViODI0XHViYTc0IFx1YjM1NFx1YmUxNCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi1BTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkU9XHViY2Y1XHVjNmQwXHVkNTU4XHViODI0XHViYTc0IFx1YjM1NFx1YmUxNCBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi0KLSMgU2V0RGVmYXVsdFZpZXdUb29sCi1BTFRfQkFDS19UT19UT1A9XHViMmU0XHVjMmRjIFx1YjllOCBcdWM3MDRcdWI4NWMKLQotIyBDb21tb24gQWN0aW9ucwotQUxUX1JFRlJFU0g9XHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMAotQUxUX0NMRUFSPVx1YzljMFx1YzZiMFx1YWUzMAotQUxUX1JFU1VMVFM9XHVhY2IwXHVhY2ZjCi0KLSMgQ29tbW9uIExhYmVscwotQUxUX05BVklHQVRPUj1cdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzAKLUFMVF9BQ1RJT05TPVx1Yzg3MFx1Y2U1OAotQUxUX1NUQVRVUz1cdWMwYzFcdWQwZGMKLUFMVF9PVEhFUl9BQ1RJT05TPVx1YWUzMFx1ZDBjMCBcdWM4NzBcdWNlNTgKLUZPUk1fQlVUVE9OX0dPPSZuYnNwOyZuYnNwO1x1Yzc3NFx1YjNkOSZuYnNwOyZuYnNwOwotRk9STV9CVVRUT05fUkVTRVQ9XHVjN2FjXHVjMTI0XHVjODE1Ci1GT1JNX0JVVFRPTl9DQU5DRUw9XHVjZGU4XHVjMThjCi1GT1JNX0xBQkVMX0FDVElPTlM9XHVjODcwXHVjZTU4Ci1GT1JNX0xBQkVMX0FDVElPTlNfTk9ORT1cdWM1YzZcdWM3NGMKLQotIyBQbGFjZWhvbGRlciBmb3IgYmxhbmsgdGFibGUgZW50cmllcwotVEFCTEVfQkxBTktfUExBQ0VIT0xERVI9LS0KLQotIyBDb21tb24gRm9ybSBDb250cm9sIFRpdGxlcwotRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YPVx1YmFhOFx1YjQ1MCBcdWMxMjBcdWQwZGQKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWD1cdWQ1ODkgXHVjMTIwXHVkMGRkCi0KLSMgQ29tbW9uIE1lc3NhZ2VzCi1NU0dfRVJST1JfVU5FWFBFQ1RFRD1JV0FCMDEzNUUgXHVjNjA4XHVhZTMwXHVjZTU4IFx1YzU0YVx1Yzc0MCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX05PX0FDVElPTl9TRUxFQ1RFRD1JV0FCMDEyNEUgXHVjODcwXHVjZTU4XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLU1TR19FUlJPUl9OT19OT0RFX1NFTEVDVEVEPUlXQUIwMTI1RSBcdWIxNzhcdWI0ZGNcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX1NVQk1JVF9JTl9QUk9HUkVTUz1cdWFlMzBcdWIyZTRcdWI5YWNcdWMyZWRcdWMyZGNcdWM2MjQuIFx1Yzg3MFx1Yzc5MVx1Yzc3NCBcdWM5YzRcdWQ1ODkgXHVjOTExXHVjNzg1XHViMmM4XHViMmU0LgotTVNHX0xPQURfSU5fUFJPR1JFU1M9XHVjNTkxXHVjMmRkXHVjNzQ0IFx1Yjg1Y1x1YjRkY1x1ZDU1OFx1YjI5NCBcdWIzZDlcdWM1NDggXHVhZTMwXHViMmU0XHViOWFjXHVjMmVkXHVjMmRjXHVjNjI0Li4uCi0KLSNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uCi1BTFRfTEFVTkNIX1dFQl9TRVJWSUNFX1dJWkFSRD1cdWM2ZjkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YjljOFx1YmM5NVx1YzBhYyBcdWMyZTRcdWQ1ODkKLUZPUk1fTEFCRUxfQ0hPT1NFX1dJWkFSRD1cdWMyZTRcdWQ1ODlcdWQ1NjAgXHViOWM4XHViYzk1XHVjMGFjIFx1YzEyMFx1ZDBkZDoKLUZPUk1fUkFESU9fV0VCX1NFUlZJQ0VfQ0xJRU5UX1dJWkFSRD1cdWM2ZjkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1ZDA3NFx1Yjc3Y1x1Yzc3NFx1YzViOFx1ZDJiOAotRk9STV9SQURJT19XRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQ9XHVjNmY5IFx1YzExY1x1YmU0NFx1YzJhNCBcdWMyYTRcdWNmMDhcdWI4MDhcdWQxYTQKLU1TR19FUlJPUl9XSVpBUkRfQUxSRUFEWV9SVU5OSU5HPUlXQUIwMTI2RSBcdWM2ZjkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YjljOFx1YmM5NVx1YzBhY1x1Yjk3YyBcdWM3NzRcdWJiZjggXHVjOWM0XHVkNTg5IFx1YzkxMVx1Yzc4NVx1YjJjOFx1YjJlNC4gIFx1YzBjOCBcdWI5YzhcdWJjOTVcdWMwYWNcdWI5N2MgXHVjMmU0XHVkNTg5XHVkNTU4XHVhZTMwXHVjODA0XHVjNWQwIFx1YWUzMFx1Yzg3NCBcdWI5YzhcdWJjOTVcdWMwYWNcdWI5N2MgXHVjNjQ0XHViOGNjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX1dTRExfVVJMX0lTX1VOUkVBQ0hBQkxFPUlXQUIwMTI3RSBXU0RMIFx1YmIzOFx1YzExY1x1YzVkMCBcdWIzYzRcdWIyZWNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLQotIyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLUFMVF9XU0lMX0lNUE9SVF9UT19GUz1XU0lMXHVjNzQ0IFx1ZDMwY1x1Yzc3YyBcdWMyZGNcdWMyYTRcdWQxNWNcdWM3M2NcdWI4NWMgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwCi1BTFRfV1NETF9JTVBPUlRfVE9fRlM9V1NETFx1Yzc0NCBcdWQzMGNcdWM3N2MgXHVjMmRjXHVjMmE0XHVkMTVjXHVjNzNjXHViODVjIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMAotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NETF9ET0M9SVdBQjAxMjhFIFdTREwgXHViYjM4XHVjMTFjXHViOTdjIFx1YWM4MFx1YzBjOVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX1JFVFJJRVZJTkdfV1NJTF9ET0M9SVdBQjAxMjlFIFdTSUwgXHViYjM4XHVjMTFjXHViOTdjIFx1YWM4MFx1YzBjOVx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lNUE9SVF9XU0RMX1NVQ0NFU1NGVUw9V1NETCBcdWJiMzhcdWMxMWNcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjU0XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lNUE9SVF9XU0lMX1NVQ0NFU1NGVUw9V1NJTCBcdWJiMzhcdWMxMWNcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjU0XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi1BTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIPVdTRExcdWM3NDQgV29ya2JlbmNoXHViODVjIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMAotRk9STV9MQUJFTF9JTVBPUlRfVE9fV09SS0JFTkNIX0RFU0M9V1NETCBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjODAwXHVjN2E1XHVkNTU4XHViODI0XHViYTc0IFdvcmtiZW5jaCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjhcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBXU0RMIFx1ZDMwY1x1Yzc3Y1x1Yzc1OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHViY2MwXHVhY2JkXHVkNTYwIFx1YzIxOFx1YjNjNCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuCi1XRUJfUFJPSkVDVF9OQU1FPVx1YzZmOSBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjg6Ci1XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FPVdvcmtiZW5jaCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjg6Ci1MQUJFTF9JTVBPUlRfV1NETD1XU0RMIFx1YmIzOFx1YzExYyBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAKLUxBQkVMX0lNUE9SVF9UT19XU0lMPVdTSUwgXHViYjM4XHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjYzM4XHVjODcwXHViODVjIFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMAotSU1QT1JURURfV1NETF9GSUxFX05BTUU9V1NETCBcdWQzMGNcdWM3N2MgXHVjNzc0XHViOTg0OgotV1NJTF9GSUxFX05BTUU9V1NJTCBcdWQzMGNcdWM3N2MgXHVjNzc0XHViOTg0OgotTVNHX0VSUk9SX0ZJTEVfT1ZFUldSSVRFX0RJU0FCTEVEPVx1Yzc5MFx1YjNkOSBcdWQzMGNcdWM3N2MgXHVhY2I5XHVjY2QwXHVjNGYwXHVhZTMwXHVhYzAwIFx1YzBhY1x1YzZhOSBcdWFjMDBcdWIyYTVcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNTQ0XHVjMTFjICIlMSIgXHVhY2JkXHViODVjXHVjNWQwIFx1YzBjMVx1YjMwMFx1YzgwMVx1Yzc3OCAiJTIiIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM3OTFcdWMxMzFcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1ZDMwY1x1Yzc3Y1x1YzVkMCBcdWIzMDBcdWQ1NzQgXHVjNzkwXHViM2Q5IFx1ZDMwY1x1Yzc3YyBcdWFjYjlcdWNjZDBcdWM0ZjBcdWFlMzBcdWI5N2MgXHVjMGFjXHVjNmE5XHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPwotTVNHX0VSUk9SX0lOVkFMSURfV09SS0JFTkNIX1BST0pFQ1Q9SVdBQjAxMzBFIFdvcmtiZW5jaCBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjhcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9GSUxFX05BTUU9SVdBQjAxMzFFIFx1YzcyMFx1ZDZhOFx1ZDU1OFx1YzljMCBcdWM1NGFcdWM3NDAgXHVkMzBjXHVjNzdjIFx1Yzc3NFx1Yjk4NC4KLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfRklMRV9OQU1FPUlXQUIwNDcwRSBcdWM3MjBcdWQ2YThcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNzQwIFdTSUwgXHVkMzBjXHVjNzdjIFx1Yzc3NFx1Yjk4NC4KLU1TR19FUlJPUl9OT19JTVBPUlRfT1BUSU9OX1NFTEVDVEVEPUlXQUIwNDcxRSBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAgXHVjNjM1XHVjMTU4XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzljMCBcdWM1NGFcdWM1NThcdWMyYjVcdWIyYzhcdWIyZTQuICBcdWNkNWNcdWMxOGNcdWQ1NWMgXHVkNTU4XHViMDk4XHVjNzU4IFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMCBcdWM2MzVcdWMxNThcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX1dSSVRJTkdfVEVNUF9GSUxFX1RPX0ZTPUlXQUIwMTMyRSBcdWM3ODRcdWMyZGMgXHVkMzBjXHVjNzdjXHVjNWQwIFx1YzRmOCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fSU1QT1JUX1RPX1dPUktCRU5DSF9TVUNDRVNTRlVMPUlXQUIwMzE0SSAlMVx1Yzc0NChcdWI5N2MpIFdvcmtiZW5jaFx1Yjg1YyBcdWFjMDBcdWM4MzhcdWM2NTRcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfSU5GT19JTVBPUlRfU0VSVklDRV9SRUZfVE9fV1NJTF9TVUNDRVNTRlVMPUlXQUIwNDcySSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjYzM4XHVjODcwXHViOTdjICUxKFx1YzczYylcdWI4NWMgXHVhYzAwXHVjODM4XHVjNjU0XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIENoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uCi1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1cdWM3OTBcdWIzZDkgXHVkMzBjXHVjNzdjIFx1Y2NiNFx1ZDA2Y1x1YzU0NFx1YzZjM1x1Yzc3NCBcdWMwYWNcdWM2YTkgXHVhYzAwXHViMmE1XHVkNTU4XHVjOWMwIFx1YzU0YVx1YzU0NFx1YzExYyAiJTEiIFx1YWNiZFx1Yjg1Y1x1YzVkMCBcdWMwYzFcdWIzMDBcdWM4MDFcdWM3NzggIiUyIiBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3NCBcdWQzMGNcdWM3N2NcdWM1ZDAgXHViMzAwXHVkNTc0IFx1Yzc5MFx1YjNkOSBcdWQzMGNcdWM3N2MgXHVjY2I0XHVkMDZjXHVjNTQ0XHVjNmMzXHVjNzQ0IFx1YzBhY1x1YzZhOVx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8KLQotIyBDbGVhck5vZGVBY3Rpb24KLU1TR19JTkZPX05PREVfQ0xFQVJFRD1JV0FCMDEzM0kgJTFcdWM3NzQoXHVhYzAwKSBcdWM5YzBcdWM2Y2NcdWM4NGNcdWMyYjVcdWIyYzhcdWIyZTQuCi0KLSMgVGFibGUgdHdpc3RlZXMKLUFMVF9UV0lTVF9PUEVORUQ9XHVjMjI4XHVhZTMwXHVhZTMwCi1BTFRfVFdJU1RfQ0xPU0VEPVx1ZDNiY1x1Y2U1OFx1YWUzMAotCi0jIFdTREwgQnJvd3NlcgotRk9STV9MSU5LX0JST1dTRT1cdWNjM2VcdWM1NDRcdWJjZjRcdWFlMzAuLi4KLVRJVExFX1dTRExfQlJPV1NFUj1XU0RMIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMCAtICUxCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFPVdTREwgXHVjMThjXHVjMmE0IFx1YzEyMFx1ZDBkZDoKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9XHVjNmY5IFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOAotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwCi1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVx1YzZmOSBcdWQ1MDRcdWI4NWNcdWM4MWRcdWQyYjgKLUZPUk1fTEFCRUxfV1NETF9VUkw9V1NETCBVUkwKLUZPUk1fQlVUVE9OX1JFRlJFU0g9XHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMAotQUxUX1dTRExfQlJPV1NFUj1XU0RMIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMAotV1NETF9UWVBFX1NFUlZJQ0VfSU5URVJGQUNFUz1cdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0Ci1XU0RMX1RZUEVfU0VSVklDRVM9XHVjMTFjXHViZTQ0XHVjMmE0Ci0KLSMgQ2FsZW5kYXIgQnJvd3NlcgotVElUTEVfQ0FMRU5EQVJfQlJPV1NFUj1cdWIyZWNcdWI4MjUgXHViZTBjXHViNzdjXHVjNmIwXHVjODAwCi0jIDIgY2hhcmFjdGVyIGFiYnJldmlhdGlvbnMgZm9yIGRheXMgb2YgdGhlIHdlZWsuCi1GT1JNX0xBQkVMX1NIX1NVTkRBWT1cdWM3N2MKLUZPUk1fTEFCRUxfU0hfTU9OREFZPVx1YzZkNAotRk9STV9MQUJFTF9TSF9UVUVTREFZPVx1ZDY1NAotRk9STV9MQUJFTF9TSF9XRURORVNEQVk9XHVjMjE4Ci1GT1JNX0xBQkVMX1NIX1RIVVJTREFZPVx1YmFhOQotRk9STV9MQUJFTF9TSF9GUklEQVk9XHVhZTA4Ci1GT1JNX0xBQkVMX1NIX1NBVFVSREFZPVx1ZDFhMAotIyBNb250aHMgb2YgdGhlIHllYXIKLUZPUk1fTEFCRUxfTU9OVEg9XHVjNmQ0OgotRk9STV9MQUJFTF9KQU5VQVJZPTFcdWM2ZDQKLUZPUk1fTEFCRUxfRkVCUlVBUlk9Mlx1YzZkNAotRk9STV9MQUJFTF9NQVJDSD0zXHVjNmQ0Ci1GT1JNX0xBQkVMX0FQUklMPTRcdWM2ZDQKLUZPUk1fTEFCRUxfTUFZPTVcdWM2ZDQKLUZPUk1fTEFCRUxfSlVORT02XHVjNmQ0Ci1GT1JNX0xBQkVMX0pVTFk9N1x1YzZkNAotRk9STV9MQUJFTF9BVUdVU1Q9OFx1YzZkNAotRk9STV9MQUJFTF9TRVBURU1CRVI9OVx1YzZkNAotRk9STV9MQUJFTF9PQ1RPQkVSPTEwXHVjNmQ0Ci1GT1JNX0xBQkVMX05PVkVNQkVSPTExXHVjNmQ0Ci1GT1JNX0xBQkVMX0RFQ0VNQkVSPTEyXHVjNmQ0Ci1GT1JNX0xBQkVMX1lFQVI9XHVjNWYwXHViM2M0OgotRk9STV9MQUJFTF9USU1FPVx1YzJkY1x1YWMwNDoKLUZPUk1fTElOS19UT0RBWT1cdWM2MjRcdWIyOTgKLUZPUk1fTElOS19QUkVWSU9VU19ZRUFSPTw8Ci1GT1JNX0xJTktfUFJFVklPVVNfTU9OVEg9PAotRk9STV9MSU5LX05FWFRfTU9OVEg9PgotRk9STV9MSU5LX05FWFRfWUVBUj0+PgotQUxUX1BSRVZJT1VTX1lFQVI9XHVjNzc0XHVjODA0IFx1YzVmMFx1YjNjNAotQUxUX1BSRVZJT1VTX01PTlRIPVx1Yzc3NFx1YzgwNCBcdWM2ZDQKLUFMVF9ORVhUX01PTlRIPVx1YjJlNFx1Yzc0YyBcdWM2ZDQKLUFMVF9ORVhUX1lFQVI9XHViMmU0XHVjNzRjIFx1YzVmMFx1YjNjNAotQUxUX1RPREFZPVx1YzYyNFx1YjI5OAotQUxUX0NBTEVOREFSX0JST1dTRVI9XHViMmVjXHViODI1IFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMAotTVNHX0VSUk9SX0lOVkFMSURfVElNRV9GT1JNQVQ9SVdBQjAzNjhFIFx1YzJkY1x1YWMwNFx1Yzc3NCBISDpNTTpTU1suU1NTXVx1YzczY1x1Yjg1YyBcdWQ2MTVcdWMyZGRcdWQ2NTRcdWI0MThcdWM5YzAgXHVjNTRhXHVjMmI1XHViMmM4XHViMmU0LiBcdWIzMDBcdWMyZTAgXHVkNjA0XHVjN2FjIFx1YzJkY1x1YWMwNFx1Yzc0NCBcdWMwYWNcdWM2YTlcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLQotIyBBY3Rpb24gZW5naW5lCi1USVRMRV9BQ1RJT05fUkVDT1JERVI9XHVjODcwXHVjZTU4IFx1YjgwOFx1Y2Y1NFx1YjM1NAotRk9STV9MQUJFTF9NT0RFPVx1YmFhOFx1YjRkYzoKLUZPUk1fTEFCRUxfTU9ERV9QTEFZPVx1YzdhY1x1YzBkZAotRk9STV9MQUJFTF9NT0RFX1NUT1A9XHVjOTExXHVjOWMwCi1GT1JNX0xBQkVMX01PREVfUkVDT1JEPVx1YjgwOFx1Y2Y1NFx1YjRkYwotRk9STV9MQUJFTF9TQVZFPVx1YzgwMFx1YzdhNQotRk9STV9MQUJFTF9QTEFZX0ZJTEU9XHVjN2FjXHVjMGRkIFx1ZDMwY1x1Yzc3YzoKLU1TR19FUlJPUl9JTlZBTElEX1BMQVlfRklMRT1JV0FCMDM2MkUgXHVjN2FjXHVjMGRkIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9QRVJTUEVDVElWRV9XT1JLQVJFQT1cdWM2ZjkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1ZDBkMFx1YzBjOVx1YWUzMCBcdWIwYjRcdWJkODAgXHVjNzkxXHVjNWM1IFx1YzYwMVx1YzVlZAotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfVE9PTEJBUj1cdWM2ZjlcdWMxMWNcdWJlNDRcdWMyYTQgXHVkMGQwXHVjMGM5XHVhZTMwIFx1YjNjNFx1YWQ2YyBcdWJhYThcdWM3NGMKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX0NPTlRFTlQ9XHVjNmY5IFx1YzExY1x1YmU0NFx1YzJhNCBcdWQwZDBcdWMwYzlcdWFlMzAgXHVkMzk4XHVjNzc0XHVjOWMwIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPVdTREwgXHViZTBjXHViNzdjXHVjNmIwXHVjODAwIFx1YjNjNFx1YWQ2YyBcdWJhYThcdWM3NGMKLUZSQU1FX1RJVExFX1dTRExfQ09OVEVOVD1XU0RMIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMCBcdWNlZThcdWQxNTBcdWNlMjAKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9QQUdFX0xPQURFUj1cdWQzOThcdWM3NzRcdWM5YzAgXHViODVjXHViMzU0Ci1GT1JNX1RJVExFX1BBR0VfQ09OVEVOVD1cdWI4NWNcdWI0ZGNcdWI0MWMgXHVkMzk4XHVjNzc0XHVjOWMwIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRk9STV9USVRMRV9MQVVOQ0hfV0VCU0VSVklDRV9XSVpBUkQ9XHVjNmY5IFx1YzExY1x1YmU0NFx1YzJhNCBcdWI5YzhcdWJjOTVcdWMwYWMgXHVjNTkxXHVjMmRkIFx1YzJlNFx1ZDU4OQotRk9STV9USVRMRV9JTVBPUlRfVE9fV09SS0JFTkNIPVdvcmtiZW5jaCBcdWM1OTFcdWMyZGRcdWM3M2NcdWI4NWMgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9wdF9CUi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllMDBkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dTRVhQTE9SRVI9RXhwbG9yYWRvciBkZSBTZXJ2aVx1MDBlN29zIGRhIFdlYgotCi0jIFRyZWUgTm9kZXMKLUFMVF9PUEVOPUFicmlyCi1BTFRfQ0xPU0U9QW50ZXJpb3IKLQotIyBQZXJzcGVjdGl2ZSBUb29sYmFyCi1BTFRfQkFDSz0gICAgICAgIFZvbHRhcgotQUxUX0ZPUldBUkQ9QXZhblx1MDBlN2FyCi1BTFRfQUNUSU9OX0VOR0lORT1HcmF2YWRvciBkZSBBXHUwMGU3XHUwMGUzbwotQUxUX1VERElfUEVSU1BFQ1RJVkU9UFx1MDBlMWdpbmEgZG8gVURESQotQUxUX1dTSUxfUEVSU1BFQ1RJVkU9UFx1MDBlMWdpbmEgZG8gV1NJTAotQUxUX1dTRExfUEVSU1BFQ1RJVkU9UFx1MDBlMWdpbmEgZG8gV1NETAotQUxUX0ZBVk9SSVRFU19QRVJTUEVDVElWRT1GYXZvcml0b3MKLQotIyBUb29sYmFycwotQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRT1DbGlxdWUgRHVwbG8gcGFyYSBNYXhpbWl6YXIKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRT1DbGlxdWUgRHVwbG8gcGFyYSBSZXN0YXVyYXIKLQotIyBTZXREZWZhdWx0Vmlld1Rvb2wKLUFMVF9CQUNLX1RPX1RPUD1Wb2x0YXIgYW8gaW5cdTAwZWRjaW8gZGEgcFx1MDBlMWdpbmEKLQotIyBDb21tb24gQWN0aW9ucwotQUxUX1JFRlJFU0g9QXR1YWxpemFyCi1BTFRfQ0xFQVI9TGltcGFyCi1BTFRfUkVTVUxUUz1SZXN1bHRhZG9zCi0KLSMgQ29tbW9uIExhYmVscwotQUxUX05BVklHQVRPUj1OYXZlZ2Fkb3IKLUFMVF9BQ1RJT05TPUFcdTAwZTdcdTAwZjVlcwotQUxUX1NUQVRVUz1TdGF0dXMKLUFMVF9PVEhFUl9BQ1RJT05TPU91dHJhcyBBXHUwMGU3XHUwMGY1ZXMKLUZPUk1fQlVUVE9OX0dPPSZuYnNwOyZuYnNwO0lyJm5ic3A7Jm5ic3A7Ci1GT1JNX0JVVFRPTl9SRVNFVD1SZWRlZmluaXIKLUZPUk1fQlVUVE9OX0NBTkNFTD1DYW5jZWxhcgotRk9STV9MQUJFTF9BQ1RJT05TPUFcdTAwZTdcdTAwZjVlcwotRk9STV9MQUJFTF9BQ1RJT05TX05PTkU9TmVuaHVtKGEpCi0KLSMgUGxhY2Vob2xkZXIgZm9yIGJsYW5rIHRhYmxlIGVudHJpZXMKLVRBQkxFX0JMQU5LX1BMQUNFSE9MREVSPS0tCi0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWD1TZWxlY2lvbmFyIFR1ZG8KLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWD1TZWxlY2lvbmFyIGxpbmhhCi0KLSMgQ29tbW9uIE1lc3NhZ2VzCi1NU0dfRVJST1JfVU5FWFBFQ1RFRD1JV0FCMDEzNUUgT2NvcnJldSB1bSBlcnJvIGluZXNwZXJhZG8uCi1NU0dfRVJST1JfTk9fQUNUSU9OX1NFTEVDVEVEPUlXQUIwMTI0RSBTZWxlY2lvbmUgdW1hIGFcdTAwZTdcdTAwZTNvLgotTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQ9SVdBQjAxMjVFIFNlbGVjaW9uZSB1bSBuXHUwMGYzLgotTVNHX1NVQk1JVF9JTl9QUk9HUkVTUz1BZ3VhcmRlLiBBIG9wZXJhXHUwMGU3XHUwMGUzbyBhaW5kYSBlc3RcdTAwZTEgZW0gcHJvZ3Jlc3NvLgotTVNHX0xPQURfSU5fUFJPR1JFU1M9QWd1YXJkZSBlbnF1YW50byBvIGZvcm11bFx1MDBlMXJpbyBcdTAwZTkgY2FycmVnYWRvLi4uCi0KLSNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uCi1BTFRfTEFVTkNIX1dFQl9TRVJWSUNFX1dJWkFSRD1BdGl2YXIgQXNzaXN0ZW50ZSBwYXJhIFNlcnZpXHUwMGU3b3MgZGEgV2ViCi1GT1JNX0xBQkVMX0NIT09TRV9XSVpBUkQ9U2VsZWNpb25hciB1bSBhc3Npc3RlbnRlIHBhcmEgYXRpdmFcdTAwZTdcdTAwZTNvOgotRk9STV9SQURJT19XRUJfU0VSVklDRV9DTElFTlRfV0laQVJEPUNsaWVudGUgZGUgU2VydmlcdTAwZTdvIGRhIFdlYgotRk9STV9SQURJT19XRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQ9RXNxdWVsZXRvIGRlIFNlcnZpXHUwMGU3byBkYSBXZWIKLU1TR19FUlJPUl9XSVpBUkRfQUxSRUFEWV9SVU5OSU5HPUlXQUIwMTI2RSBVbSBhc3Npc3RlbnRlIHBhcmEgc2VydmlcdTAwZTdvIGRhIFdlYiBqXHUwMGUxIGVzdFx1MDBlMSBlbSBwcm9ncmVzc28uICBGaW5hbGl6YXIgY29tIG8gYXNzaXN0ZW50ZSBleGlzdGVudGUgYW50ZXMgZGUgYXRpdmFyIHVtIG5vdm8uCi1NU0dfRVJST1JfV1NETF9VUkxfSVNfVU5SRUFDSEFCTEU9SVdBQjAxMjdFIE8gZG9jdW1lbnRvIFdTREwgblx1MDBlM28gXHUwMGU5IGFsY2FuXHUwMGU3XHUwMGUxdmVsLgotCi0jIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotQUxUX1dTSUxfSU1QT1JUX1RPX0ZTPUltcG9ydGFyIFdTSUwgUGFyYSBvIFNpc3RlbWEgZGUgQXJxdWl2b3MKLUFMVF9XU0RMX0lNUE9SVF9UT19GUz1JbXBvcnRhciBXU0RMIHBhcmEgbyBTaXN0ZW1hIGRlIEFycXVpdm9zCi1NU0dfRVJST1JfUkVUUklFVklOR19XU0RMX0RPQz1JV0FCMDEyOEUgSW1wb3NzXHUwMGVkdmVsIHJlY3VwZXJhciBkb2N1bWVudG8gV1NETC4KLU1TR19FUlJPUl9SRVRSSUVWSU5HX1dTSUxfRE9DPUlXQUIwMTI5RSBJbXBvc3NcdTAwZWR2ZWwgcmVjdXBlcmFyIGRvY3VtZW50byBXU0lMLgotTVNHX0lNUE9SVF9XU0RMX1NVQ0NFU1NGVUw9RG9jdW1lbnRvIFdTREwgaW1wb3J0YWRvIGNvbSBcdTAwZWF4aXRvLgotTVNHX0lNUE9SVF9XU0lMX1NVQ0NFU1NGVUw9RG9jdW1lbnRvIFdTSUwgaW1wb3J0YWRvIGNvbSBcdTAwZWF4aXRvLgotCi0jIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi1BTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIPUltcG9ydGFyIFdTREwgUGFyYSBXb3JrYmVuY2gKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1dPUktCRU5DSF9ERVNDPVNlbGVjaW9uZSB1bSBwcm9qZXRvIGRvIHdvcmtiZW5jaCBubyBxdWFsIGlyXHUwMGUxIHNhbHZhciBvIGFycXVpdm8gV1NETC4gVm9jXHUwMGVhIHRhbWJcdTAwZTltIHBvZGVyXHUwMGUxIGFsdGVyYXIgbyBub21lIGRvIGFycXVpdm8gV1NETC4KLVdFQl9QUk9KRUNUX05BTUU9UHJvamV0byBXZWI6Ci1XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FPVByb2pldG8gZG8gV29ya2JlbmNoOgotTEFCRUxfSU1QT1JUX1dTREw9SW1wb3J0YXIgZG9jdW1lbnRvIFdTREwKLUxBQkVMX0lNUE9SVF9UT19XU0lMPUltcG9ydGFyIGNvbW8gdW1hIHJlZmVyXHUwMGVhbmNpYSBkZSBzZXJ2aVx1MDBlN28gcGFyYSB1bSBkb2N1bWVudG8gV1NJTAotSU1QT1JURURfV1NETF9GSUxFX05BTUU9Tm9tZSBkbyBhcnF1aXZvIFdTREw6Ci1XU0lMX0ZJTEVfTkFNRT1Ob21lIGRvIGFycXVpdm8gV1NJTDoKLU1TR19FUlJPUl9GSUxFX09WRVJXUklURV9ESVNBQkxFRD1JbXBvc3NcdTAwZWR2ZWwgY3JpYXIgbyBhcnF1aXZvICIlMiIgcmVsYXRpdm8gYW8gY2FtaW5obyAiJTEiIHBvcnF1ZSBzb2JyZXNjcmV2ZXIgYXJxdWl2byBhdXRvbWF0aWNhbWVudGUgblx1MDBlM28gZm9pIGF0aXZhZG8uIERlc2VqYSBhdGl2XHUwMGUxLWxvIHBhcmEgZXN0ZSBhcnF1aXZvPwotTVNHX0VSUk9SX0lOVkFMSURfV09SS0JFTkNIX1BST0pFQ1Q9SVdBQjAxMzBFIFNlbGVjaW9uZSB1bSBwcm9qZXRvIGRvIHdvcmtiZW5jaC4KLU1TR19FUlJPUl9JTlZBTElEX1dTRExfRklMRV9OQU1FPUlXQUIwMTMxRSBOb21lIGRlIGFycXVpdm8gaW52XHUwMGUxbGlkby4KLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfRklMRV9OQU1FPUlXQUIwNDcwRSBOb21lIGRlIGFycXVpdm8gV1NJTCBpbnZcdTAwZTFsaWRvLgotTVNHX0VSUk9SX05PX0lNUE9SVF9PUFRJT05fU0VMRUNURUQ9SVdBQjA0NzFFIE5lbmh1bWEgb3BcdTAwZTdcdTAwZTNvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvIGVzdFx1MDBlMSBzZWxlY2lvbmFkYS4gIEVzY29saGEgcGVsbyBtZW5vcyB1bWEgb3BcdTAwZTdcdTAwZTNvIGRlIGltcG9ydGFcdTAwZTdcdTAwZTNvLgotTVNHX0VSUk9SX1dSSVRJTkdfVEVNUF9GSUxFX1RPX0ZTPUlXQUIwMTMyRSBJbXBvc3NcdTAwZWR2ZWwgZ3JhdmFyIG5vIGFycXVpdm8gdGVtcG9yXHUwMGUxcmlvLgotTVNHX0lORk9fSU1QT1JUX1RPX1dPUktCRU5DSF9TVUNDRVNTRlVMPUlXQUIwMzE0SSAlMSBmb2kgaW1wb3J0YWRvIGNvbSBcdTAwZWF4aXRvIHBhcmEgbyB3b3JrYmVuY2guCi1NU0dfSU5GT19JTVBPUlRfU0VSVklDRV9SRUZfVE9fV1NJTF9TVUNDRVNTRlVMPUlXQUIwNDcySSBBIHJlZmVyXHUwMGVhbmNpYSBkZSBzZXJ2aVx1MDBlN28gZm9pIGltcG9ydGFkYSBjb20gXHUwMGVheGl0byBwYXJhICUxLgotCi0jIENoZWNrV29ya2JlbmNoRmlsZVJlYWRPbmx5QWN0aW9uCi1NU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRD1JbXBvc3NcdTAwZWR2ZWwgY3JpYXIgbyBhcnF1aXZvICIlMiIgcmVsYXRpdm8gYW8gY2FtaW5obyAiJTEiIHBvcnF1ZSByZWdpc3RybyBkZSBzYVx1MDBlZGRhIGRlIGFycXVpdm8gYXV0b21cdTAwZTF0aWNvIG5cdTAwZTNvIGZvaSBhdGl2YWRvLiBEZXNlamEgYXRpdlx1MDBlMS1sbyBwYXJhIGVzdGUgYXJxdWl2bz8KLQotIyBDbGVhck5vZGVBY3Rpb24KLU1TR19JTkZPX05PREVfQ0xFQVJFRD1JV0FCMDEzM0kgJTEgbGltcG8uCi0KLSMgVGFibGUgdHdpc3RlZXMKLUFMVF9UV0lTVF9PUEVORUQ9T2N1bHRhcgotQUxUX1RXSVNUX0NMT1NFRD1FeHBhbmRpcgotCi0jIFdTREwgQnJvd3NlcgotRk9STV9MSU5LX0JST1dTRT1Qcm9jdXJhci4uCi1USVRMRV9XU0RMX0JST1dTRVI9TmF2ZWdhZG9yIGRvIFdTREwgLSAlMQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRT1TZWxlY2lvbmUgdW1hIG9yaWdlbSBkbyBXU0RMOgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9XRUJQUk9KRUNUUz1Qcm9qZXRvcyBkYSBXZWIKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfRkFWT1JJVEVTPUZhdm9yaXRvcwotRk9STV9MQUJFTF9XRUJfUFJPSkVDVD1Qcm9qZXRvIGRhIFdlYgotRk9STV9MQUJFTF9XU0RMX1VSTD1VUkwgZG8gV1NETAotRk9STV9CVVRUT05fUkVGUkVTSD1BdHVhbGl6YXIKLUFMVF9XU0RMX0JST1dTRVI9TmF2ZWdhZG9yIGRvIFdTREwKLVdTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRVM9SW50ZXJmYWNlcyBkZSBTZXJ2aVx1MDBlN28KLVdTRExfVFlQRV9TRVJWSUNFUz1TZXJ2aVx1MDBlN29zCi0KLSMgQ2FsZW5kYXIgQnJvd3NlcgotVElUTEVfQ0FMRU5EQVJfQlJPV1NFUj1OYXZlZ2Fkb3IgZG8gQ2FsZW5kXHUwMGUxcmlvCi0jIDIgY2hhcmFjdGVyIGFiYnJldmlhdGlvbnMgZm9yIGRheXMgb2YgdGhlIHdlZWsuCi1GT1JNX0xBQkVMX1NIX1NVTkRBWT1Eb20KLUZPUk1fTEFCRUxfU0hfTU9OREFZPVNlZwotRk9STV9MQUJFTF9TSF9UVUVTREFZPVRlcgotRk9STV9MQUJFTF9TSF9XRURORVNEQVk9UXVhCi1GT1JNX0xBQkVMX1NIX1RIVVJTREFZPVF1aQotRk9STV9MQUJFTF9TSF9GUklEQVk9U2V4Ci1GT1JNX0xBQkVMX1NIX1NBVFVSREFZPVNcdTAwZTFiCi0jIE1vbnRocyBvZiB0aGUgeWVhcgotRk9STV9MQUJFTF9NT05USD1NXHUwMGVhczoKLUZPUk1fTEFCRUxfSkFOVUFSWT1KYW5laXJvCi1GT1JNX0xBQkVMX0ZFQlJVQVJZPUZldmVyZWlybwotRk9STV9MQUJFTF9NQVJDSD1NYXJcdTAwZTdvCi1GT1JNX0xBQkVMX0FQUklMPUFicmkKLUZPUk1fTEFCRUxfTUFZPU1haW8KLUZPUk1fTEFCRUxfSlVORT1KdW5obwotRk9STV9MQUJFTF9KVUxZPUp1bGhvCi1GT1JNX0xBQkVMX0FVR1VTVD1BZ29zdG8KLUZPUk1fTEFCRUxfU0VQVEVNQkVSPVNldGVtYnJvCi1GT1JNX0xBQkVMX09DVE9CRVI9T3V0dWJybwotRk9STV9MQUJFTF9OT1ZFTUJFUj1Ob3ZlbWJybwotRk9STV9MQUJFTF9ERUNFTUJFUj1EZXplbWJybwotRk9STV9MQUJFTF9ZRUFSPUFubzoKLUZPUk1fTEFCRUxfVElNRT1Ib3JhOgotRk9STV9MSU5LX1RPREFZPUhvamUKLUZPUk1fTElOS19QUkVWSU9VU19ZRUFSPTw8Ci1GT1JNX0xJTktfUFJFVklPVVNfTU9OVEg9PAotRk9STV9MSU5LX05FWFRfTU9OVEg9PgotRk9STV9MSU5LX05FWFRfWUVBUj0+PgotQUxUX1BSRVZJT1VTX1lFQVI9QW5vIEFudGVyaW9yCi1BTFRfUFJFVklPVVNfTU9OVEg9TVx1MDBlYXMgQW50ZXJpb3IKLUFMVF9ORVhUX01PTlRIPVByXHUwMGYzeGltbyBNXHUwMGVhcwotQUxUX05FWFRfWUVBUj1Qclx1MDBmM3hpbW8gQW5vCi1BTFRfVE9EQVk9SG9qZQotQUxUX0NBTEVOREFSX0JST1dTRVI9TmF2ZWdhZG9yIGRvIENhbGVuZFx1MDBlMXJpbwotTVNHX0VSUk9SX0lOVkFMSURfVElNRV9GT1JNQVQ9SVdBQjAzNjhFIEEgaG9yYSBuXHUwMGUzbyBmb2kgZm9ybWF0YWRhIGNvbW8gSEg6TU06U1NbLlNTU10uIERlc2VqYSB1dGlsaXphciBhIGhvcmEgYXR1YWw/Ci0KLSMgQWN0aW9uIGVuZ2luZQotVElUTEVfQUNUSU9OX1JFQ09SREVSPUdyYXZhZG9yIGRlIEFcdTAwZTdcdTAwZTNvCi1GT1JNX0xBQkVMX01PREU9TW9kbzoKLUZPUk1fTEFCRUxfTU9ERV9QTEFZPVJlcHJvZHV6aXIKLUZPUk1fTEFCRUxfTU9ERV9TVE9QPVBhcmFyCi1GT1JNX0xBQkVMX01PREVfUkVDT1JEPVJlZ2lzdHJvCi1GT1JNX0xBQkVMX1NBVkU9U2FsdmFyCi1GT1JNX0xBQkVMX1BMQVlfRklMRT1BcnF1aXZvIHBsYXk6Ci1NU0dfRVJST1JfSU5WQUxJRF9QTEFZX0ZJTEU9SVdBQjAzNjJFIEluc2VyaXIgdW0gYXJxdWl2byBwbGF5LgotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfV09SS0FSRUE9XHUwMGMxcmVhIGRlIFRyYWJhbGhvIEludGVybmEgZG8gRXhwbG9yYWRvciBkZSBTZXJ2aVx1MDBlN29zIGRhIFdlYgotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfVE9PTEJBUj1CYXJyYSBkZSBGZXJyYW1lbnRhcyBkbyBFeHBsb3JhZG9yIGRlIFNlcnZpXHUwMGU3b3MgZGEgV2ViCi1GUkFNRV9USVRMRV9QRVJTUEVDVElWRV9DT05URU5UPUNvbnRlXHUwMGZhZG8gZGEgUFx1MDBlMWdpbmEgZG8gRXhwbG9yYWRvciBkZSBTZXJ2aVx1MDBlN29zIGRhIFdlYgotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPUJhcnJhcyBkZSBGZXJyYW1lbnRhcyBkbyBOYXZlZ2Fkb3IgZG8gV1NETAotRlJBTUVfVElUTEVfV1NETF9DT05URU5UPUNvbnRlXHUwMGZhZG8gZG8gTmF2ZWdhZG9yIGRvIFdTREwKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9QQUdFX0xPQURFUj1DYXJyZWdhZG9yIGRlIFBcdTAwZTFnaW5hCi1GT1JNX1RJVExFX1BBR0VfQ09OVEVOVD1Db250ZVx1MDBmYWRvIGRhIFBcdTAwZTFnaW5hIENhcnJlZ2FkYQotRk9STV9USVRMRV9MQVVOQ0hfV0VCU0VSVklDRV9XSVpBUkQ9QXRpdmFyIEZvcm11bFx1MDBlMXJpbyBkbyBBc3Npc3RlbnRlIHBhcmEgU2VydmlcdTAwZTdvcyBkYSBXZWIKLUZPUk1fVElUTEVfSU1QT1JUX1RPX1dPUktCRU5DSD1JbXBvcnRhciBGb3JtdWxcdTAwZTFyaW8gZG8gV29ya2JlbmNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl96aF9DTi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjMWI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dTRVhQTE9SRVI9V2ViIFNlcnZpY2UgXHU4ZDQ0XHU2ZTkwXHU3YmExXHU3NDA2XHU1NjY4Ci0KLSMgVHJlZSBOb2RlcwotQUxUX09QRU49XHU2MjUzXHU1ZjAwCi1BTFRfQ0xPU0U9XHU1MTczXHU5NWVkCi0KLSMgUGVyc3BlY3RpdmUgVG9vbGJhcgotQUxUX0JBQ0s9XHU1NDExXHU1NDBlCi1BTFRfRk9SV0FSRD1cdTU0MTFcdTUyNGQKLUFMVF9BQ1RJT05fRU5HSU5FPVx1NjRjZFx1NGY1Y1x1OGJiMFx1NWY1NVx1NTY2OAotQUxUX1VERElfUEVSU1BFQ1RJVkU9VURESSBcdTk4NzVcdTk3NjIKLUFMVF9XU0lMX1BFUlNQRUNUSVZFPVdTSUwgXHU5ODc1XHU5NzYyCi1BTFRfV1NETF9QRVJTUEVDVElWRT1XU0RMIFx1OTg3NVx1OTc2MgotQUxUX0ZBVk9SSVRFU19QRVJTUEVDVElWRT1cdTY1MzZcdTg1Y2ZcdTU5MzkKLQotIyBUb29sYmFycwotQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRT1cdTUzY2NcdTUxZmJcdTRlZTVcdTY3MDBcdTU5MjdcdTUzMTYKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRT1cdTUzY2NcdTUxZmJcdTRlZTVcdThmZDhcdTUzOWYKLQotIyBTZXREZWZhdWx0Vmlld1Rvb2wKLUFMVF9CQUNLX1RPX1RPUD1cdThmZDRcdTU2ZGVcdTk4NzZcdTkwZTgKLQotIyBDb21tb24gQWN0aW9ucwotQUxUX1JFRlJFU0g9XHU1MjM3XHU2NWIwCi1BTFRfQ0xFQVI9XHU2ZTA1XHU5NjY0Ci1BTFRfUkVTVUxUUz1cdTdlZDNcdTY3OWMKLQotIyBDb21tb24gTGFiZWxzCi1BTFRfTkFWSUdBVE9SPVx1NWJmY1x1ODIyYVx1NTY2OAotQUxUX0FDVElPTlM9XHU2NGNkXHU0ZjVjCi1BTFRfU1RBVFVTPVx1NzJiNlx1NjAwMQotQUxUX09USEVSX0FDVElPTlM9XHU1MTc2XHU1YjgzXHU2NGNkXHU0ZjVjCi1GT1JNX0JVVFRPTl9HTz0mbmJzcDsmbmJzcDtcdTYyNjdcdTg4NGMmbmJzcDsmbmJzcDsKLUZPUk1fQlVUVE9OX1JFU0VUPVx1NTkwZFx1NGY0ZAotRk9STV9CVVRUT05fQ0FOQ0VMPVx1NTNkNlx1NmQ4OAotRk9STV9MQUJFTF9BQ1RJT05TPVx1NjRjZFx1NGY1YwotRk9STV9MQUJFTF9BQ1RJT05TX05PTkU9XHU2NWUwCi0KLSMgUGxhY2Vob2xkZXIgZm9yIGJsYW5rIHRhYmxlIGVudHJpZXMKLVRBQkxFX0JMQU5LX1BMQUNFSE9MREVSPS0tCi0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWD1cdTUxNjhcdTkwZThcdTkwMDlcdTRlMmQKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWD1cdTkwMDlcdTYyZTlcdTg4NGMKLQotIyBDb21tb24gTWVzc2FnZXMKLU1TR19FUlJPUl9VTkVYUEVDVEVEPUlXQUIwMTM1RSBcdTUzZDFcdTc1MWZcdTRlODZcdTYxMGZcdTU5MTZcdTk1MTlcdThiZWZcdTMwMDIKLU1TR19FUlJPUl9OT19BQ1RJT05fU0VMRUNURUQ9SVdBQjAxMjRFIFx1OTAwOVx1NjJlOVx1NjRjZFx1NGY1Y1x1MzAwMgotTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQ9SVdBQjAxMjVFIFx1OTAwOVx1NjJlOVx1ODI4Mlx1NzBiOVx1MzAwMgotTVNHX1NVQk1JVF9JTl9QUk9HUkVTUz1cdThiZjdcdTdhMGRcdTUwMTlcdTMwMDJcdTY0Y2RcdTRmNWNcdTRlY2RcdTU3MjhcdThmZGJcdTg4NGNcdTRlMmRcdTMwMDIKLU1TR19MT0FEX0lOX1BST0dSRVNTPVx1OGJmN1x1N2I0OVx1NWY4NVx1ODg2OFx1NTM1NVx1ODhjNVx1NTE2NS4uLgotCi0jTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbgotQUxUX0xBVU5DSF9XRUJfU0VSVklDRV9XSVpBUkQ9XHU1NDJmXHU1MmE4IFdlYiBTZXJ2aWNlIFx1NTQxMVx1NWJmYwotRk9STV9MQUJFTF9DSE9PU0VfV0laQVJEPVx1OTAwOVx1NjJlOVx1NTQxMVx1NWJmY1x1NGVlNVx1NTQyZlx1NTJhOFx1ZmYxYQotRk9STV9SQURJT19XRUJfU0VSVklDRV9DTElFTlRfV0laQVJEPVdlYiBTZXJ2aWNlIFx1NWJhMlx1NjIzN1x1NjczYQotRk9STV9SQURJT19XRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQ9V2ViIFNlcnZpY2UgXHU2ODQ2XHU2N2I2Ci1NU0dfRVJST1JfV0laQVJEX0FMUkVBRFlfUlVOTklORz1JV0FCMDEyNkUgV2ViIFNlcnZpY2UgXHU1NDExXHU1YmZjXHU1ZGYyXHU1NzI4XHU4ZmQwXHU4ODRjXHU0ZTJkXHUzMDAyXHU1NzI4XHU1NDJmXHU1MmE4XHU2NWIwXHU1NDExXHU1YmZjXHU0ZTRiXHU1MjRkXHU1MTQ4XHU1YjhjXHU2MjEwXHU3M2IwXHU2NzA5XHU1NDExXHU1YmZjXHUzMDAyCi1NU0dfRVJST1JfV1NETF9VUkxfSVNfVU5SRUFDSEFCTEU9SVdBQjAxMjdFIFdTREwgXHU2NTg3XHU2ODYzXHU0ZTBkXHU1M2VmXHU4YmJmXHU5NWVlXHUzMDAyCi0KLSMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uCi1BTFRfV1NJTF9JTVBPUlRfVE9fRlM9XHU1YzA2IFdTSUwgXHU1YmZjXHU1MTY1XHU4MWYzXHU2NTg3XHU0ZWY2XHU3Y2ZiXHU3ZWRmCi1BTFRfV1NETF9JTVBPUlRfVE9fRlM9XHU1YzA2IFdTREwgXHU1YmZjXHU1MTY1XHU4MWYzXHU2NTg3XHU0ZWY2XHU3Y2ZiXHU3ZWRmCi1NU0dfRVJST1JfUkVUUklFVklOR19XU0RMX0RPQz1JV0FCMDEyOEUgXHU2NWUwXHU2Y2Q1XHU2OGMwXHU3ZDIyIFdTREwgXHU2NTg3XHU2ODYzXHUzMDAyCi1NU0dfRVJST1JfUkVUUklFVklOR19XU0lMX0RPQz1JV0FCMDEyOUUgXHU2NWUwXHU2Y2Q1XHU2OGMwXHU3ZDIyIFdTSUwgXHU2NTg3XHU2ODYzXHUzMDAyCi1NU0dfSU1QT1JUX1dTRExfU1VDQ0VTU0ZVTD1cdTYyMTBcdTUyOWZcdTViZmNcdTUxNjVcdTRlODYgV1NETCBcdTY1ODdcdTY4NjNcdTMwMDIKLU1TR19JTVBPUlRfV1NJTF9TVUNDRVNTRlVMPVx1NjIxMFx1NTI5Zlx1NWJmY1x1NTE2NVx1NGU4NiBXU0lMIFx1NjU4N1x1Njg2M1x1MzAwMgotCi0jIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi1BTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIPVx1NWMwNiBXU0RMIFx1NWJmY1x1NTE2NVx1ODFmM1x1NWRlNVx1NGY1Y1x1NTNmMAotRk9STV9MQUJFTF9JTVBPUlRfVE9fV09SS0JFTkNIX0RFU0M9XHU5MDA5XHU2MmU5XHU4OTgxXHU1YzA2IFdTREwgXHU2NTg3XHU0ZWY2XHU0ZmRkXHU1YjU4XHU4MWYzXHU1MTc2XHU0ZTJkXHU3Njg0XHU1ZGU1XHU0ZjVjXHU1M2YwXHU5ODc5XHU3NmVlXHUzMDAyXHU4ZmQ4XHU1M2VmXHU0ZWU1XHU2NmY0XHU2NTM5IFdTREwgXHU2NTg3XHU0ZWY2XHU3Njg0XHU1NDBkXHU3OWYwXHUzMDAyCi1XRUJfUFJPSkVDVF9OQU1FPVdlYiBcdTk4NzlcdTc2ZWVcdWZmMWEKLVdPUktCRU5DSF9QUk9KRUNUX05BTUU9XHU1ZGU1XHU0ZjVjXHU1M2YwXHU5ODc5XHU3NmVlXHVmZjFhCi1MQUJFTF9JTVBPUlRfV1NETD1cdTViZmNcdTUxNjUgV1NETCBcdTY1ODdcdTY4NjMKLUxBQkVMX0lNUE9SVF9UT19XU0lMPVx1NGY1Y1x1NGUzYVx1NjcwZFx1NTJhMVx1NWYxNVx1NzUyOFx1NWJmY1x1NTE2NVx1ODFmMyBXU0lMIFx1NjU4N1x1Njg2MwotSU1QT1JURURfV1NETF9GSUxFX05BTUU9V1NETCBcdTY1ODdcdTRlZjZcdTU0MGRcdWZmMWEKLVdTSUxfRklMRV9OQU1FPVdTSUwgXHU2NTg3XHU0ZWY2XHU1NDBkXHVmZjFhCi1NU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9XHU1NmUwXHU0ZTNhXHU2NzJhXHU1NDJmXHU3NTI4XHUyMDFjXHU4MWVhXHU1MmE4XHU4OTg2XHU3NmQ2XHU2NTg3XHU0ZWY2XHUyMDFkXHVmZjBjXHU2MjQwXHU0ZWU1XHU0ZTBkXHU4MGZkXHU1MjFiXHU1ZWZhXHU3NmY4XHU1YmY5XHU0ZThlXHU4ZGVmXHU1Zjg0XHUyMDFjJTFcdTIwMWRcdTc2ODRcdTY1ODdcdTRlZjZcdTIwMWMlMlx1MjAxZFx1MzAwMlx1NjBmM1x1ODk4MVx1NGUzYVx1NmI2NFx1NjU4N1x1NGVmNlx1NTQyZlx1NzUyOFx1NWI4M1x1NTQxN1x1ZmYxZgotTVNHX0VSUk9SX0lOVkFMSURfV09SS0JFTkNIX1BST0pFQ1Q9SVdBQjAxMzBFIFx1OTAwOVx1NjJlOVx1NWRlNVx1NGY1Y1x1NTNmMFx1OTg3OVx1NzZlZVx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9GSUxFX05BTUU9SVdBQjAxMzFFIFx1NjU4N1x1NGVmNlx1NTQwZFx1NjVlMFx1NjU0OFx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9GSUxFX05BTUU9SVdBQjA0NzBFIFdTSUwgXHU2NTg3XHU0ZWY2XHU1NDBkXHU2NWUwXHU2NTQ4XHUzMDAyCi1NU0dfRVJST1JfTk9fSU1QT1JUX09QVElPTl9TRUxFQ1RFRD1JV0FCMDQ3MUUgXHU2NzJhXHU5MDA5XHU2MmU5XHU0ZWZiXHU0ZjU1XHU1YmZjXHU1MTY1XHU5MDA5XHU5ODc5XHUzMDAyXHU4YmY3XHU4MWYzXHU1YzExXHU5MDA5XHU2MmU5XHU0ZTAwXHU0ZTJhXHU1YmZjXHU1MTY1XHU5MDA5XHU5ODc5XHUzMDAyCi1NU0dfRVJST1JfV1JJVElOR19URU1QX0ZJTEVfVE9fRlM9SVdBQjAxMzJFIFx1NjVlMFx1NmNkNVx1NTE5OVx1NGUzNFx1NjVmNlx1NjU4N1x1NGVmNlx1MzAwMgotTVNHX0lORk9fSU1QT1JUX1RPX1dPUktCRU5DSF9TVUNDRVNTRlVMPUlXQUIwMzE0SSBcdTVkZjJcdTdlY2ZcdTYyMTBcdTUyOWZcdTU3MzBcdTVjMDYgJTEgXHU1YmZjXHU1MTY1XHU4MWYzXHU1ZGU1XHU0ZjVjXHU1M2YwXHUzMDAyCi1NU0dfSU5GT19JTVBPUlRfU0VSVklDRV9SRUZfVE9fV1NJTF9TVUNDRVNTRlVMPUlXQUIwNDcySSBcdTVkZjJcdTdlY2ZcdTYyMTBcdTUyOWZcdTU3MzBcdTVjMDZcdTY3MGRcdTUyYTFcdTVmMTVcdTc1MjhcdTViZmNcdTUxNjVcdTgxZjMgJTFcdTMwMDIKLQotIyBDaGVja1dvcmtiZW5jaEZpbGVSZWFkT25seUFjdGlvbgotTVNHX0VSUk9SX0ZJTEVfQ0hFQ0tPVVRfRElTQUJMRUQ9XHU1NmUwXHU0ZTNhXHU2NzJhXHU1NDJmXHU3NTI4XHUyMDFjXHU4MWVhXHU1MmE4XHU2OGMwXHU1MWZhXHU2NTg3XHU0ZWY2XHUyMDFkXHVmZjBjXHU2MjQwXHU0ZWU1XHU0ZTBkXHU4MGZkXHU1MjFiXHU1ZWZhXHU3NmY4XHU1YmY5XHU0ZThlXHU4ZGVmXHU1Zjg0XHUyMDFjJTFcdTIwMWRcdTc2ODRcdTY1ODdcdTRlZjZcdTIwMWMlMlx1MjAxZFx1MzAwMlx1NjBmM1x1ODk4MVx1NGUzYVx1NmI2NFx1NjU4N1x1NGVmNlx1NTQyZlx1NzUyOFx1NWI4M1x1NTQxN1x1ZmYxZgotCi0jIENsZWFyTm9kZUFjdGlvbgotTVNHX0lORk9fTk9ERV9DTEVBUkVEPUlXQUIwMTMzSSBcdTVkZjJcdTZlMDVcdTk2NjQgJTFcdTMwMDIKLQotIyBUYWJsZSB0d2lzdGVlcwotQUxUX1RXSVNUX09QRU5FRD1cdTk2OTBcdTg1Y2YKLUFMVF9UV0lTVF9DTE9TRUQ9XHU1YzU1XHU1ZjAwCi0KLSMgV1NETCBCcm93c2VyCi1GT1JNX0xJTktfQlJPV1NFPVx1NmQ0Zlx1ODljOC4uLgotVElUTEVfV1NETF9CUk9XU0VSPVdTREwgXHU2ZDRmXHU4OWM4XHU1NjY4IFx1ZmYwZCAlMQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRT1cdTkwMDlcdTYyZTkgV1NETCBcdTZlOTBcdWZmMWEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9V2ViIFx1OTg3OVx1NzZlZQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9XHU2NTM2XHU4NWNmXHU1OTM5Ci1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVdlYiBcdTk4NzlcdTc2ZWUKLUZPUk1fTEFCRUxfV1NETF9VUkw9V1NETCBVUkwKLUZPUk1fQlVUVE9OX1JFRlJFU0g9XHU1MjM3XHU2NWIwCi1BTFRfV1NETF9CUk9XU0VSPVdTREwgXHU2ZDRmXHU4OWM4XHU1NjY4Ci1XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0VTPVx1NjcwZFx1NTJhMVx1NjNhNVx1NTNlMwotV1NETF9UWVBFX1NFUlZJQ0VTPVx1NjcwZFx1NTJhMQotCi0jIENhbGVuZGFyIEJyb3dzZXIKLVRJVExFX0NBTEVOREFSX0JST1dTRVI9XHU2NWU1XHU1Mzg2XHU2ZDRmXHU4OWM4XHU1NjY4Ci0jIDIgY2hhcmFjdGVyIGFiYnJldmlhdGlvbnMgZm9yIGRheXMgb2YgdGhlIHdlZWsuCi1GT1JNX0xBQkVMX1NIX1NVTkRBWT1cdTY2MWZcdTY3MWZcdTU5MjkKLUZPUk1fTEFCRUxfU0hfTU9OREFZPVx1NjYxZlx1NjcxZlx1NGUwMAotRk9STV9MQUJFTF9TSF9UVUVTREFZPVx1NjYxZlx1NjcxZlx1NGU4YwotRk9STV9MQUJFTF9TSF9XRURORVNEQVk9XHU2NjFmXHU2NzFmXHU0ZTA5Ci1GT1JNX0xBQkVMX1NIX1RIVVJTREFZPVx1NjYxZlx1NjcxZlx1NTZkYgotRk9STV9MQUJFTF9TSF9GUklEQVk9XHU2NjFmXHU2NzFmXHU0ZTk0Ci1GT1JNX0xBQkVMX1NIX1NBVFVSREFZPVx1NjYxZlx1NjcxZlx1NTE2ZAotIyBNb250aHMgb2YgdGhlIHllYXIKLUZPUk1fTEFCRUxfTU9OVEg9XHU2NzA4XHVmZjFhCi1GT1JNX0xBQkVMX0pBTlVBUlk9XHU0ZTAwXHU2NzA4Ci1GT1JNX0xBQkVMX0ZFQlJVQVJZPVx1NGU4Y1x1NjcwOAotRk9STV9MQUJFTF9NQVJDSD1cdTRlMDlcdTY3MDgKLUZPUk1fTEFCRUxfQVBSSUw9XHU1NmRiXHU2NzA4Ci1GT1JNX0xBQkVMX01BWT1cdTRlOTRcdTY3MDgKLUZPUk1fTEFCRUxfSlVORT1cdTUxNmRcdTY3MDgKLUZPUk1fTEFCRUxfSlVMWT1cdTRlMDNcdTY3MDgKLUZPUk1fTEFCRUxfQVVHVVNUPVx1NTE2Ylx1NjcwOAotRk9STV9MQUJFTF9TRVBURU1CRVI9XHU0ZTVkXHU2NzA4Ci1GT1JNX0xBQkVMX09DVE9CRVI9XHU1MzQxXHU2NzA4Ci1GT1JNX0xBQkVMX05PVkVNQkVSPVx1NTM0MVx1NGUwMFx1NjcwOAotRk9STV9MQUJFTF9ERUNFTUJFUj1cdTUzNDFcdTRlOGNcdTY3MDgKLUZPUk1fTEFCRUxfWUVBUj1cdTVlNzRcdWZmMWEKLUZPUk1fTEFCRUxfVElNRT1cdTY1ZjZcdTk1ZjRcdWZmMWEKLUZPUk1fTElOS19UT0RBWT1cdTRlY2FcdTU5MjkKLUZPUk1fTElOS19QUkVWSU9VU19ZRUFSPTw8Ci1GT1JNX0xJTktfUFJFVklPVVNfTU9OVEg9PAotRk9STV9MSU5LX05FWFRfTU9OVEg9PgotRk9STV9MSU5LX05FWFRfWUVBUj0+PgotQUxUX1BSRVZJT1VTX1lFQVI9XHU0ZTBhXHU0ZTAwXHU1ZTc0Ci1BTFRfUFJFVklPVVNfTU9OVEg9XHU0ZTBhXHU0ZTJhXHU2NzA4Ci1BTFRfTkVYVF9NT05USD1cdTRlMGJcdTRlMmFcdTY3MDgKLUFMVF9ORVhUX1lFQVI9XHU0ZTBiXHU0ZTAwXHU1ZTc0Ci1BTFRfVE9EQVk9XHU0ZWNhXHU1OTI5Ci1BTFRfQ0FMRU5EQVJfQlJPV1NFUj1cdTY1ZTVcdTUzODZcdTZkNGZcdTg5YzhcdTU2NjgKLU1TR19FUlJPUl9JTlZBTElEX1RJTUVfRk9STUFUPUlXQUIwMzY4RSBcdTY3MmFcdTVjMDZcdTY1ZjZcdTk1ZjRcdTY4M2NcdTVmMGZcdThiYmVcdTdmNmVcdTRlM2EgSEg6TU06U1NbLlNTU11cdTMwMDJcdTYwZjNcdTg5ODFcdTY1MzlcdTRlM2FcdTRmN2ZcdTc1MjhcdTVmNTNcdTUyNGRcdTY1ZjZcdTk1ZjRcdTU0MTdcdWZmMWYKLQotIyBBY3Rpb24gZW5naW5lCi1USVRMRV9BQ1RJT05fUkVDT1JERVI9XHU2NGNkXHU0ZjVjXHU4YmIwXHU1ZjU1XHU1NjY4Ci1GT1JNX0xBQkVMX01PREU9XHU2NWI5XHU1ZjBmXHVmZjFhCi1GT1JNX0xBQkVMX01PREVfUExBWT1cdTY0YWRcdTY1M2UKLUZPUk1fTEFCRUxfTU9ERV9TVE9QPVx1NTA1Y1x1NmI2MgotRk9STV9MQUJFTF9NT0RFX1JFQ09SRD1cdThiYjBcdTVmNTUKLUZPUk1fTEFCRUxfU0FWRT1cdTRmZGRcdTViNTgKLUZPUk1fTEFCRUxfUExBWV9GSUxFPVx1NjRhZFx1NjUzZVx1NjU4N1x1NGVmNlx1ZmYxYQotTVNHX0VSUk9SX0lOVkFMSURfUExBWV9GSUxFPUlXQUIwMzYyRSBcdThmOTNcdTUxNjVcdTY0YWRcdTY1M2VcdTY1ODdcdTRlZjZcdTMwMDIKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1dPUktBUkVBPVdlYiBTZXJ2aWNlIFx1OGQ0NFx1NmU5MFx1N2JhMVx1NzQwNlx1NTY2OFx1NTE4NVx1OTBlOFx1NWRlNVx1NGY1Y1x1NTMzYQotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfVE9PTEJBUj1XZWIgU2VydmljZSBcdThkNDRcdTZlOTBcdTdiYTFcdTc0MDZcdTU2NjhcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX0NPTlRFTlQ9V2ViIFNlcnZpY2UgXHU4ZDQ0XHU2ZTkwXHU3YmExXHU3NDA2XHU1NjY4XHU5ODc1XHU5NzYyXHU1MTg1XHU1YmI5Ci1GUkFNRV9USVRMRV9XU0RMX1RPT0xCQVI9V1NETCBcdTZkNGZcdTg5YzhcdTU2NjhcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX1dTRExfQ09OVEVOVD1XU0RMIFx1NmQ0Zlx1ODljOFx1NTY2OFx1NTE4NVx1NWJiOQotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX1BBR0VfTE9BREVSPVx1OTg3NVx1OTc2Mlx1ODhjNVx1NTE2NVx1N2EwYlx1NWU4ZgotRk9STV9USVRMRV9QQUdFX0NPTlRFTlQ9XHU4OGM1XHU1MTY1XHU3Njg0XHU5ODc1XHU5NzYyXHU1MTg1XHU1YmI5Ci1GT1JNX1RJVExFX0xBVU5DSF9XRUJTRVJWSUNFX1dJWkFSRD1cdTU0MmZcdTUyYTggV2ViIFNlcnZpY2UgXHU1NDExXHU1YmZjXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX0lNUE9SVF9UT19XT1JLQkVOQ0g9XHU1YmZjXHU1MTY1XHU4MWYzXHU1ZGU1XHU0ZjVjXHU1M2YwXHU4ODY4XHU1MzU1CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl96aF9UVy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZXhwbG9yZXJfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkNzA5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9leHBsb3Jlcl96aF9UVy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRJVExFX1dTRVhQTE9SRVI9V2ViIFx1NjcwZFx1NTJkOVx1NzAwZlx1ODliZFx1NTY2OAotCi0jIFRyZWUgTm9kZXMKLUFMVF9PUEVOPVx1OTU4Ylx1NTU1ZgotQUxUX0NMT1NFPVx1OTVkY1x1OTU4OQotCi0jIFBlcnNwZWN0aXZlIFRvb2xiYXIKLUFMVF9CQUNLPVx1NGUwYVx1NGUwMFx1OTgwMQotQUxUX0ZPUldBUkQ9XHU0ZTBiXHU0ZTAwXHU5ODAxCi1BTFRfQUNUSU9OX0VOR0lORT1cdTUyZDVcdTRmNWNcdThhMThcdTkzMDRcdTU2NjgKLUFMVF9VRERJX1BFUlNQRUNUSVZFPVVEREkgXHU5ODAxXHU5NzYyCi1BTFRfV1NJTF9QRVJTUEVDVElWRT1XU0lMIFx1OTgwMVx1OTc2MgotQUxUX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdTk4MDFcdTk3NjIKLUFMVF9GQVZPUklURVNfUEVSU1BFQ1RJVkU9XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiCi0KLSMgVG9vbGJhcnMKLUFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkU9XHU2MzA5XHU1MTY5XHU0ZTBiXHU2NzAwXHU1OTI3XHU1MzE2Ci1BTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkU9XHU2MzA5XHU1MTY5XHU0ZTBiXHU5MDg0XHU1MzlmCi0KLSMgU2V0RGVmYXVsdFZpZXdUb29sCi1BTFRfQkFDS19UT19UT1A9XHU4ZmQ0XHU1NmRlXHU5ODAyXHU3YWVmCi0KLSMgQ29tbW9uIEFjdGlvbnMKLUFMVF9SRUZSRVNIPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNgotQUxUX0NMRUFSPVx1NmUwNVx1OTY2NAotQUxUX1JFU1VMVFM9XHU3ZDUwXHU2NzljCi0KLSMgQ29tbW9uIExhYmVscwotQUxUX05BVklHQVRPUj1cdTVjMGVcdTg5YmRcdTU2NjgKLUFMVF9BQ1RJT05TPVx1NTJkNVx1NGY1YwotQUxUX1NUQVRVUz1cdTcyYzBcdTYxNGIKLUFMVF9PVEhFUl9BQ1RJT05TPVx1NTE3Nlx1NGVkNlx1NTJkNVx1NGY1YwotRk9STV9CVVRUT05fR089Jm5ic3A7Jm5ic3A7XHU1N2Y3XHU4ODRjJm5ic3A7Jm5ic3A7Ci1GT1JNX0JVVFRPTl9SRVNFVD1cdTkxY2RcdThhMmQKLUZPUk1fQlVUVE9OX0NBTkNFTD1cdTUzZDZcdTZkODgKLUZPUk1fTEFCRUxfQUNUSU9OUz1cdTUyZDVcdTRmNWMKLUZPUk1fTEFCRUxfQUNUSU9OU19OT05FPVx1NzEyMQotCi0jIFBsYWNlaG9sZGVyIGZvciBibGFuayB0YWJsZSBlbnRyaWVzCi1UQUJMRV9CTEFOS19QTEFDRUhPTERFUj0tLQotCi0jIENvbW1vbiBGb3JtIENvbnRyb2wgVGl0bGVzCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1g9XHU1MTY4XHU5MDc4Ci1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1g9XHU5MDc4XHU1M2Q2XHU1MjE3Ci0KLSMgQ29tbW9uIE1lc3NhZ2VzCi1NU0dfRVJST1JfVU5FWFBFQ1RFRD1JV0FCMDEzNUUgXHU3NjdjXHU3NTFmXHU5NzVlXHU5ODEwXHU2NzFmXHU3Njg0XHU5MzJmXHU4YWE0XHUzMDAyCi1NU0dfRVJST1JfTk9fQUNUSU9OX1NFTEVDVEVEPUlXQUIwMTI0RSBcdTkwNzhcdTUzZDZcdTUyZDVcdTRmNWNcdTMwMDIKLU1TR19FUlJPUl9OT19OT0RFX1NFTEVDVEVEPUlXQUIwMTI1RSBcdTkwNzhcdTUzZDZcdTdiYzBcdTllZGVcdTMwMDIKLU1TR19TVUJNSVRfSU5fUFJPR1JFU1M9XHU4YWNiXHU3YTBkXHU1MDE5XHUzMDAyXHU0ZjVjXHU2OTZkXHU0ZWNkXHU1NzI4XHU5MDMyXHU4ODRjXHU0ZTJkXHUzMDAyCi1NU0dfTE9BRF9JTl9QUk9HUkVTUz1cdTc1NzZcdTg4NjhcdTU1YWVcdThmMDlcdTUxNjVcdTY2NDJcdWZmMGNcdThhY2JcdTdiNDlcdTVmODUuLi4KLQotI0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24KLUFMVF9MQVVOQ0hfV0VCX1NFUlZJQ0VfV0laQVJEPVx1NTU1Zlx1NTJkNSBXZWIgXHU2NzBkXHU1MmQ5XHU3Y2JlXHU5NzQ4Ci1GT1JNX0xBQkVMX0NIT09TRV9XSVpBUkQ9XHU4YWNiXHU5MDc4XHU1M2Q2XHU4OTgxXHU1NTVmXHU1MmQ1XHU3Njg0XHU3Y2JlXHU5NzQ4XHVmZjFhCi1GT1JNX1JBRElPX1dFQl9TRVJWSUNFX0NMSUVOVF9XSVpBUkQ9V2ViIFx1NjcwZFx1NTJkOVx1NzUyOFx1NjIzNlx1N2FlZgotRk9STV9SQURJT19XRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQ9V2ViIFx1NjcwZFx1NTJkOSBTa2VsZXRvbgotTVNHX0VSUk9SX1dJWkFSRF9BTFJFQURZX1JVTk5JTkc9SVdBQjAxMjZFIFdlYiBcdTY3MGRcdTUyZDlcdTdjYmVcdTk3NDhcdTVkZjJcdTU3MjhcdTkwMzJcdTg4NGNcdTRlMmRcdTMwMDJcdThhY2JcdTUxNDhcdTdkNTBcdTY3NWZcdTczZmVcdTY3MDlcdTc2ODRcdTdjYmVcdTk3NDhcdWZmMGNcdTUxOGRcdTU1NWZcdTUyZDVcdTY1YjBcdTc2ODRcdTdjYmVcdTk3NDhcdTMwMDIKLU1TR19FUlJPUl9XU0RMX1VSTF9JU19VTlJFQUNIQUJMRT1JV0FCMDEyN0UgXHU3MTIxXHU2Y2Q1XHU1NDdjXHU1M2ViXHU1MjMwIFdTREwgXHU2NTg3XHU0ZWY2XHUzMDAyCi0KLSMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uCi1BTFRfV1NJTF9JTVBPUlRfVE9fRlM9XHU1YzA3IFdTSUwgXHU1MzJmXHU1MTY1XHU2YTk0XHU2ODQ4XHU3Y2ZiXHU3ZDcxXHU0ZTJkCi1BTFRfV1NETF9JTVBPUlRfVE9fRlM9XHU1YzA3IFdTREwgXHU1MzJmXHU1MTY1XHU2YTk0XHU2ODQ4XHU3Y2ZiXHU3ZDcxXHU0ZTJkCi1NU0dfRVJST1JfUkVUUklFVklOR19XU0RMX0RPQz1JV0FCMDEyOEUgXHU3MTIxXHU2Y2Q1XHU2NGY3XHU1M2Q2IFdTREwgXHU2NTg3XHU0ZWY2XHUzMDAyCi1NU0dfRVJST1JfUkVUUklFVklOR19XU0lMX0RPQz1JV0FCMDEyOUUgXHU3MTIxXHU2Y2Q1XHU2NGY3XHU1M2Q2IFdTSUwgXHU2NTg3XHU0ZWY2XHUzMDAyCi1NU0dfSU1QT1JUX1dTRExfU1VDQ0VTU0ZVTD1cdTVkZjJcdTk4MDZcdTUyMjlcdTUzMmZcdTUxNjUgV1NETCBcdTY1ODdcdTRlZjZcdTMwMDIKLU1TR19JTVBPUlRfV1NJTF9TVUNDRVNTRlVMPVx1NWRmMlx1OTgwNlx1NTIyOVx1NTMyZlx1NTE2NSBXU0lMIFx1NjU4N1x1NGVmNgotCi0jIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uCi1BTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIPVx1NWMwNyBXU0RMIFx1NTMyZlx1NTE2NVx1NWRlNVx1NGY1Y1x1NTNmMAotRk9STV9MQUJFTF9JTVBPUlRfVE9fV09SS0JFTkNIX0RFU0M9XHU4YWNiXHU5MDc4XHU1M2Q2XHU3NTI4XHU0Zjg2XHU1MTMyXHU1YjU4IFdTREwgXHU2YTk0XHU3Njg0XHU1ZGU1XHU0ZjVjXHU1M2YwXHU1YzA4XHU2ODQ4XHUzMDAyXHU2MGE4XHU0ZTVmXHU1M2VmXHU4MGZkXHU4YjhhXHU2NmY0IFdTREwgXHU2YTk0XHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyCi1XRUJfUFJPSkVDVF9OQU1FPVdlYiBcdTVjMDhcdTY4NDhcdWZmMWEKLVdPUktCRU5DSF9QUk9KRUNUX05BTUU9XHU1ZGU1XHU0ZjVjXHU1M2YwXHU1YzA4XHU2ODQ4XHVmZjFhCi1MQUJFTF9JTVBPUlRfV1NETD1cdTUzMmZcdTUxNjUgV1NETCBcdTY1ODdcdTRlZjYKLUxBQkVMX0lNUE9SVF9UT19XU0lMPVx1NTMyZlx1NTE2NVx1NzBiYVx1NjMwN1x1NTQxMSBXU0lMIFx1NjU4N1x1NGVmNlx1NzY4NFx1NjcwZFx1NTJkOVx1NTNjM1x1NzE2NwotSU1QT1JURURfV1NETF9GSUxFX05BTUU9V1NETCBcdTZhOTRcdTU0MGRcdTdhMzFcdWZmMWEKLVdTSUxfRklMRV9OQU1FPVdTSUwgXHU2YTk0XHU1NDBkXHU3YTMxXHVmZjFhCi1NU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQ9XHU3MTIxXHU2Y2Q1XHU1ZWZhXHU3YWNiXHU3NmY4XHU1YzBkXHU2NWJjICIlMSIgXHU4ZGVmXHU1ZjkxXHU3Njg0ICIlMiIgXHU2YTk0XHVmZjBjXHU1NmUwXHU3MGJhXHU2YzkyXHU2NzA5XHU1NTVmXHU3NTI4XHU4MWVhXHU1MmQ1XHU2NTM5XHU1YmViXHU2YTk0XHU2ODQ4XHUzMDAyXHU4OTgxXHU3MGJhXHU5MDE5XHU1MDBiXHU2YTk0XHU2ODQ4XHU1NTVmXHU3NTI4XHU1YjgzXHU1NWNlXHVmZjFmCi1NU0dfRVJST1JfSU5WQUxJRF9XT1JLQkVOQ0hfUFJPSkVDVD1JV0FCMDEzMEUgXHU4YWNiXHU5MDc4XHU1M2Q2XHU0ZTAwXHU1MDBiXHU1ZGU1XHU0ZjVjXHU1M2YwXHU1YzA4XHU2ODQ4XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX0ZJTEVfTkFNRT1JV0FCMDEzMUUgXHU2YTk0XHU1NDBkXHU3MTIxXHU2NTQ4XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX0ZJTEVfTkFNRT1JV0FCMDQ3MEUgV1NJTCBcdTZhOTRcdTU0MGRcdTdhMzFcdTcxMjFcdTY1NDhcdTMwMDIKLU1TR19FUlJPUl9OT19JTVBPUlRfT1BUSU9OX1NFTEVDVEVEPUlXQUIwNDcxRSBcdTZjOTJcdTY3MDlcdTkwNzhcdTUzZDZcdTUzMmZcdTUxNjVcdTkwNzhcdTk4MDVcdTMwMDJcdThhY2JcdTkwNzhcdTY0YzdcdTgxZjNcdTVjMTFcdTRlMDBcdTUwMGJcdTUzMmZcdTUxNjVcdTkwNzhcdTk4MDVcdTMwMDIKLU1TR19FUlJPUl9XUklUSU5HX1RFTVBfRklMRV9UT19GUz1JV0FCMDEzMkUgXHU3MTIxXHU2Y2Q1XHU1YmViXHU1MTY1XHU2NmFiXHU1YjU4XHU2YTk0XHUzMDAyCi1NU0dfSU5GT19JTVBPUlRfVE9fV09SS0JFTkNIX1NVQ0NFU1NGVUw9SVdBQjAzMTRJICUxIFx1NWRmMlx1OTgwNlx1NTIyOVx1NTMyZlx1NTE2NVx1NWRlNVx1NGY1Y1x1NTNmMFx1MzAwMgotTVNHX0lORk9fSU1QT1JUX1NFUlZJQ0VfUkVGX1RPX1dTSUxfU1VDQ0VTU0ZVTD1JV0FCMDQ3MkkgXHU2NzBkXHU1MmQ5XHU1M2MzXHU3MTY3XHU1ZGYyXHU5ODA2XHU1MjI5XHU1MzJmXHU1MTY1ICUxXHUzMDAyCi0KLSMgQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb24KLU1TR19FUlJPUl9GSUxFX0NIRUNLT1VUX0RJU0FCTEVEPVx1NzEyMVx1NmNkNVx1NWVmYVx1N2FjYlx1NzZmOFx1NWMwZFx1NjViYyAiJTEiIFx1OGRlZlx1NWY5MVx1NzY4NCAiJTIiIFx1NmE5NFx1ZmYwY1x1NTZlMFx1NzBiYVx1NmM5Mlx1NjcwOVx1NTU1Zlx1NzUyOFx1ODFlYVx1NTJkNVx1NzlmYlx1NTFmYVx1NmE5NFx1Njg0OFx1MzAwMlx1ODk4MVx1NzBiYVx1OTAxOVx1NTAwYlx1NmE5NFx1Njg0OFx1NTU1Zlx1NzUyOFx1NWI4M1x1NTVjZVx1ZmYxZgotCi0jIENsZWFyTm9kZUFjdGlvbgotTVNHX0lORk9fTk9ERV9DTEVBUkVEPUlXQUIwMTMzSSBcdTVkZjJcdTZlMDVcdTk2NjQgJTFcdTMwMDIKLQotIyBUYWJsZSB0d2lzdGVlcwotQUxUX1RXSVNUX09QRU5FRD1cdTk2YjFcdTg1Y2YKLUFMVF9UV0lTVF9DTE9TRUQ9XHU1YzU1XHU5NThiCi0KLSMgV1NETCBCcm93c2VyCi1GT1JNX0xJTktfQlJPV1NFPVx1NzAwZlx1ODliZC4uLgotVElUTEVfV1NETF9CUk9XU0VSPVdTREwgXHU3MDBmXHU4OWJkXHU1NjY4IC0gJTEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0U9XHU4YWNiXHU5MDc4XHU1M2Q2XHU0ZTAwXHU1MDBiIFdTREwgXHU0Zjg2XHU2ZTkwXHVmZjFhCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFX1dFQlBST0pFQ1RTPVdlYiBcdTVjMDhcdTY4NDgKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfRkFWT1JJVEVTPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYgotRk9STV9MQUJFTF9XRUJfUFJPSkVDVD1XZWIgXHU1YzA4XHU2ODQ4Ci1GT1JNX0xBQkVMX1dTRExfVVJMPVdTREwgVVJMCi1GT1JNX0JVVFRPTl9SRUZSRVNIPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNgotQUxUX1dTRExfQlJPV1NFUj1XU0RMIFx1NzAwZlx1ODliZFx1NTY2OAotV1NETF9UWVBFX1NFUlZJQ0VfSU5URVJGQUNFUz1cdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjIKLVdTRExfVFlQRV9TRVJWSUNFUz1cdTY3MGRcdTUyZDkKLQotIyBDYWxlbmRhciBCcm93c2VyCi1USVRMRV9DQUxFTkRBUl9CUk9XU0VSPVx1ODg0Y1x1NGU4Ylx1NjZjNlx1NzAwZlx1ODliZFx1NTY2OAotIyAyIGNoYXJhY3RlciBhYmJyZXZpYXRpb25zIGZvciBkYXlzIG9mIHRoZSB3ZWVrLgotRk9STV9MQUJFTF9TSF9TVU5EQVk9U3UKLUZPUk1fTEFCRUxfU0hfTU9OREFZPU1vCi1GT1JNX0xBQkVMX1NIX1RVRVNEQVk9VHUKLUZPUk1fTEFCRUxfU0hfV0VETkVTREFZPVdlCi1GT1JNX0xBQkVMX1NIX1RIVVJTREFZPVRoCi1GT1JNX0xBQkVMX1NIX0ZSSURBWT1GcgotRk9STV9MQUJFTF9TSF9TQVRVUkRBWT1TYQotIyBNb250aHMgb2YgdGhlIHllYXIKLUZPUk1fTEFCRUxfTU9OVEg9XHU2NzA4XHU0ZWZkXHVmZjFhCi1GT1JNX0xBQkVMX0pBTlVBUlk9MSBcdTY3MDgKLUZPUk1fTEFCRUxfRkVCUlVBUlk9MiBcdTY3MDgKLUZPUk1fTEFCRUxfTUFSQ0g9MyBcdTY3MDgKLUZPUk1fTEFCRUxfQVBSSUw9NCBcdTY3MDgKLUZPUk1fTEFCRUxfTUFZPTUgXHU2NzA4Ci1GT1JNX0xBQkVMX0pVTkU9NiBcdTY3MDgKLUZPUk1fTEFCRUxfSlVMWT03IFx1NjcwOAotRk9STV9MQUJFTF9BVUdVU1Q9OCBcdTY3MDgKLUZPUk1fTEFCRUxfU0VQVEVNQkVSPTkgXHU2NzA4Ci1GT1JNX0xBQkVMX09DVE9CRVI9MTAgXHU2NzA4Ci1GT1JNX0xBQkVMX05PVkVNQkVSPTExIFx1NjcwOAotRk9STV9MQUJFTF9ERUNFTUJFUj0xMiBcdTY3MDgKLUZPUk1fTEFCRUxfWUVBUj1cdTVlNzRcdTRlZmRcdWZmMWEKLUZPUk1fTEFCRUxfVElNRT1cdTY2NDJcdTk1OTNcdWZmMWEKLUZPUk1fTElOS19UT0RBWT1cdTRlY2FcdTY1ZTUKLUZPUk1fTElOS19QUkVWSU9VU19ZRUFSPTw8Ci1GT1JNX0xJTktfUFJFVklPVVNfTU9OVEg9PAotRk9STV9MSU5LX05FWFRfTU9OVEg9PgotRk9STV9MSU5LX05FWFRfWUVBUj0+PgotQUxUX1BSRVZJT1VTX1lFQVI9XHU0ZTBhXHU0ZTAwXHU1ZTc0Ci1BTFRfUFJFVklPVVNfTU9OVEg9XHU0ZTBhXHU0ZTAwXHU2NzA4Ci1BTFRfTkVYVF9NT05USD1cdTRlMGJcdTRlMDBcdTY3MDgKLUFMVF9ORVhUX1lFQVI9XHU0ZTBiXHU0ZTAwXHU1ZTc0Ci1BTFRfVE9EQVk9XHU0ZWNhXHU2NWU1Ci1BTFRfQ0FMRU5EQVJfQlJPV1NFUj1cdTg4NGNcdTRlOGJcdTY2YzZcdTcwMGZcdTg5YmRcdTU2NjgKLU1TR19FUlJPUl9JTlZBTElEX1RJTUVfRk9STUFUPUlXQUIwMzY4RSBcdTY2NDJcdTk1OTNcdTY3MmFcdTY4M2NcdTVmMGZcdTUzMTZcdTcwYmEgSEg6TU06U1NbLlNTU11cdTMwMDJcdTYwYThcdTg5ODFcdTY1MzlcdTc1MjhcdTczZmVcdTg4NGNcdTY2NDJcdTk1OTNcdTU1Y2VcdWZmMWYKLQotIyBBY3Rpb24gZW5naW5lCi1USVRMRV9BQ1RJT05fUkVDT1JERVI9XHU1MmQ1XHU0ZjVjXHU4YTE4XHU5MzA0XHU1NjY4Ci1GT1JNX0xBQkVMX01PREU9XHU2YTIxXHU1ZjBmXHVmZjFhCi1GT1JNX0xBQkVMX01PREVfUExBWT1cdTU3ZjdcdTg4NGMKLUZPUk1fTEFCRUxfTU9ERV9TVE9QPVx1NTA1Y1x1NmI2MgotRk9STV9MQUJFTF9NT0RFX1JFQ09SRD1cdThhMThcdTkzMDQKLUZPUk1fTEFCRUxfU0FWRT1cdTUxMzJcdTViNTgKLUZPUk1fTEFCRUxfUExBWV9GSUxFPVx1NjRhZFx1NjUzZVx1NmE5NFx1ZmYxYQotTVNHX0VSUk9SX0lOVkFMSURfUExBWV9GSUxFPUlXQUIwMzYyRSBcdThmMzhcdTUxNjVcdTY0YWRcdTY1M2VcdTZhOTRcdTMwMDIKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1dPUktBUkVBPVdlYiBcdTY3MGRcdTUyZDlcdTcwMGZcdTg5YmRcdTU2NjhcdTUxNjdcdTkwZThcdTVkZTVcdTRmNWNcdTUzNDAKLUZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1RPT0xCQVI9V2ViIFx1NjcwZFx1NTJkOVx1NzAwZlx1ODliZFx1NTY2OFx1NWRlNVx1NTE3N1x1NTIxNwotRlJBTUVfVElUTEVfUEVSU1BFQ1RJVkVfQ09OVEVOVD1XZWIgXHU2NzBkXHU1MmQ5XHU3MDBmXHU4OWJkXHU1NjY4XHU5ODAxXHU5NzYyXHU1MTY3XHU1YmI5Ci1GUkFNRV9USVRMRV9XU0RMX1RPT0xCQVI9V1NETCBcdTcwMGZcdTg5YmRcdTU2NjhcdTVkZTVcdTUxNzdcdTUyMTcKLUZSQU1FX1RJVExFX1dTRExfQ09OVEVOVD1XU0RMIFx1NzAwZlx1ODliZFx1NTY2OFx1NTE2N1x1NWJiOQotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX1BBR0VfTE9BREVSPVx1OTgwMVx1OTc2Mlx1OGYwOVx1NTE2NVx1NTY2OAotRk9STV9USVRMRV9QQUdFX0NPTlRFTlQ9XHU4ZjA5XHU1MTY1XHU3Njg0XHU5ODAxXHU5NzYyXHU1MTY3XHU1YmI5Ci1GT1JNX1RJVExFX0xBVU5DSF9XRUJTRVJWSUNFX1dJWkFSRD1cdTU1NWZcdTUyZDUgV2ViIFx1NjcwZFx1NTJkOVx1N2NiZVx1OTc0OFx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9JTVBPUlRfVE9fV09SS0JFTkNIPVx1NTMyZlx1NTE2NVx1NWRlNVx1NGY1Y1x1NTNmMFx1ODg2OFx1NTVhZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkZTg2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1GYXZvcml0ZXMKLQotIyBOYXZpZ2F0b3IKLUZBVk9SSVRFU19NQUlOX05PREU9RmF2b3JpdGVzIE1haW4KLUZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFPUZhdm9yaXRlIFdTSUxzCi1GQVZPUklURVNfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFPUZhdm9yaXRlIFdTREwgU2VydmljZXMKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfRk9MREVSX05PREU9RmF2b3JpdGUgVURESSBTZXJ2aWNlcwotRkFWT1JJVEVTX1VERElfQlVTSU5FU1NFU19GT0xERVJfTk9ERT1GYXZvcml0ZSBVRERJIEJ1c2luZXNzZXMKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERT1GYXZvcml0ZSBVRERJIFNlcnZpY2UgSW50ZXJmYWNlcwotRkFWT1JJVEVTX1VERElfUkVHSVNUUklFU19GT0xERVJfTk9ERT1GYXZvcml0ZSBVRERJIFJlZ2lzdHJpZXMKLQotIyBGb3JtCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1dTSUw9RmF2b3JpdGUgV1NJTHMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NETD1GYXZvcml0ZSBXU0RMcwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1JFR0lTVFJZPUZhdm9yaXRlIFVEREkgUmVnaXN0cmllcwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0U9RmF2b3JpdGUgVURESSBTZXJ2aWNlcwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX0JVU0lORVNTPUZhdm9yaXRlIFVEREkgQnVzaW5lc3MgRW50aXRpZXMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1GYXZvcml0ZSBVRERJIFNlcnZpY2UgSW50ZXJmYWNlcwotRk9STV9MQUJFTF9SRU1PVkU9UmVtb3ZlCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFPUFkZCBUbyBXU0lMIFBhZ2UKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkU9QWRkIFRvIFVEREkgUGFnZQotRk9STV9MQUJFTF9JTVBPUlRfVE9fV1NETF9QRVJTUEVDVElWRT1BZGQgVG8gV1NETCBQYWdlCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9SXRlbSAjCi1GT1JNX0xBQkVMX05BTUU9TmFtZQotRk9STV9MQUJFTF9JTlFVSVJZX1VSTD1JbnF1aXJ5IFVSTAotRk9STV9MQUJFTF9QVUJMSVNIX1VSTD1QdWJsaXNoIFVSTAotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPVJlZ2lzdHJ5IE5hbWUKLUZPUk1fTEFCRUxfQlVTSU5FU1NfTkFNRT1CdXNpbmVzcyBOYW1lCi1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1CdXNpbmVzcyBLZXkKLUZPUk1fTEFCRUxfU0VSVklDRV9OQU1FPVNlcnZpY2UgTmFtZQotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1TZXJ2aWNlIEtleQotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FPVNlcnZpY2UgSW50ZXJmYWNlIE5hbWUKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfS0VZPVNlcnZpY2UgSW50ZXJmYWNlIEtleQotRk9STV9MQUJFTF9SRUdJU1RSWV9VUkw9PGEgaHJlZj0iJTEiIHRhcmdldD0iX2JsYW5rIj5DbGljayBoZXJlPC9hPiB0byBvYnRhaW4gYSB1c2VyIElEIGFuZCBwYXNzd29yZCBmb3IgdGhpcyByZWdpc3RyeS4KLUZPUk1fTEFCRUxfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRVM9RGF0YSBmaWxlcyBmb3IgVXNlciBEZWZpbmVkIENhdGVnb3JpZXMKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzE1RSBTZWxlY3QgYXQgbGVhc3Qgb25lIGl0ZW0uCi0KLSMgTGlzdEZhdm9yaXRlV1NJTEFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NJTD1MaXN0IEZhdm9yaXRlIFdTSUxzCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfV1NJTF9ERVNDPVNlbGVjdCBhIHNldCBvZiBmYXZvcml0ZSBXU0lMIGxpbmtzIGFuZCBwcmVzcyA8c3Ryb25nPkFkZCB0byBXU0lMIFBhZ2U8L3N0cm9uZz4gdG8gb3BlbiB0aGVtIGluIHRoZSBXU0lMIG5hdmlnYXRvci4gUHJlc3MgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gdG8gcmVtb3ZlIHRoZSBzZWxlY3Rpb25zLgotCi0jIExpc3RGYXZvcml0ZVdTRExTZXJ2aWNlQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0U9TGlzdCBGYXZvcml0ZSBXU0RMIFNlcnZpY2VzCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFX0RFU0M9U2VsZWN0IGEgc2V0IG9mIGZhdm9yaXRlIFdTREwgc2VydmljZXMgYW5kIHByZXNzIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IHRvIHJlbW92ZSB0aGVtLgotCi0jIExpc3RGYXZvcml0ZVVERElTZXJ2aWNlQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0U9TGlzdCBGYXZvcml0ZSBVRERJIFNlcnZpY2VzCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0RFU0M9U2VsZWN0IGEgc2V0IG9mIGZhdm9yaXRlIFVEREkgc2VydmljZXMgYW5kIHByZXNzIDxzdHJvbmc+QWRkIHRvIFVEREkgUGFnZTwvc3Ryb25nPiB0byBvcGVuIHRoZW0gaW4gdGhlIFVEREkgbmF2aWdhdG9yLiBQcmVzcyA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiB0byByZW1vdmUgdGhlIHNlbGVjdGlvbnMuCi0KLSMgTGlzdEZhdm9yaXRlVURESUJ1c2luZXNzQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX0JVU0lORVNTPUxpc3QgRmF2b3JpdGUgVURESSBCdXNpbmVzc2VzCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTU19ERVNDPVNlbGVjdCBhIHNldCBvZiBmYXZvcml0ZSBVRERJIGJ1c2luZXNzZXMgYW5kIHByZXNzIDxzdHJvbmc+QWRkIHRvIFVEREkgUGFnZTwvc3Ryb25nPiB0byBvcGVuIHRoZW0gaW4gdGhlIFVEREkgbmF2aWdhdG9yLiBQcmVzcyA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiB0byByZW1vdmUgdGhlIHNlbGVjdGlvbnMuCi0KLSMgTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5QWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX1JFR0lTVFJZPUxpc3QgRmF2b3JpdGUgVURESSBSZWdpc3RyaWVzCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWV9ERVNDPVNlbGVjdCBhIHNldCBvZiBmYXZvcml0ZSBVRERJIHJlZ2lzdHJpZXMgYW5kIHByZXNzIDxzdHJvbmc+QWRkIHRvIFVEREkgUGFnZTwvc3Ryb25nPiB0byBvcGVuIHRoZW0gaW4gdGhlIFVEREkgbmF2aWdhdG9yLiBQcmVzcyA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiB0byByZW1vdmUgdGhlIHNlbGVjdGlvbnMuCi0KLSMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0U9TGlzdCBGYXZvcml0ZSBVRERJIFNlcnZpY2UgSW50ZXJmYWNlcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVTQz1TZWxlY3QgYSBzZXQgb2YgZmF2b3JpdGUgVURESSBzZXJ2aWNlIGludGVyZmFjZXMgYW5kIHByZXNzIDxzdHJvbmc+QWRkIHRvIFVEREkgUGFnZTwvc3Ryb25nPiB0byBvcGVuIHRoZW0gaW4gdGhlIFVEREkgbmF2aWdhdG9yLiBQcmVzcyA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiB0byByZW1vdmUgdGhlIHNlbGVjdGlvbnMuCi0KLSMgRmF2b3JpdGVzV1NJTERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NJTF9ERVRBSUxTPUZhdm9yaXRlIFdTSUwgRGV0YWlscwotCi0jIEZhdm9yaXRlc1dTRExEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1dTRExfREVUQUlMUz1GYXZvcml0ZSBXU0RMIERldGFpbHMKLQotIyBGYXZvcml0ZXNVRERJUmVnaXN0cnlEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfUkVHSVNUUllfREVUQUlMUz1GYXZvcml0ZSBVRERJIFJlZ2lzdHJ5IERldGFpbHMKLQotIyBGYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfQlVTSU5FU1NfREVUQUlMUz1GYXZvcml0ZSBVRERJIEJ1c2luZXNzIERldGFpbHMKLQotIyBGYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0RFVEFJTFM9RmF2b3JpdGUgVURESSBTZXJ2aWNlIERldGFpbHMKLQotIyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPUZhdm9yaXRlIFVEREkgU2VydmljZSBJbnRlcmZhY2UgRGV0YWlscwotCi0jIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9QWRkIHRvIFdTSUwgUGFnZQotTVNHX0VSUk9SX1dTSUxfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMTZFICUxIGlzIGFscmVhZHkgb3BlbmVkIGluIFdTSUwgUGFnZS4KLU1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMxN0kgJTEgaXMgYWRkZWQgdG8gV1NJTCBQYWdlLgotTVNHX0VSUk9SX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9SVdBQjAzMThFIFdTSUwgJTEgY291bGQgbm90IGJlIGxvYWRlZC4KLQotIyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUFkZCB0byBVRERJIFBhZ2UKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMyMEUgJTEgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4KLU1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMjFJICUxIGlzIGFkZGVkIHRvIFVEREkgUGFnZS4KLQotIyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9QWRkIHRvIFdTREwgUGFnZQotTVNHX0lORk9fQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzY5SSAlMSBpcyBhZGRlZCB0byBXU0RMIFBhZ2UuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3MEUgV1NETCAlMSBjb3VsZCBub3QgYmUgbG9hZGVkLgotCi0jIFJlbW92ZUZhdm9yaXRlQWN0aW9uCi1BTFRfUkVNT1ZFX0ZBVk9SSVRFPVJlbW92ZSBGYXZvcml0ZQotTVNHX0NPTkZJUk1fUkVNT1ZFX05PREU9JTEgaXMgbm8gbG9uZ2VyIHJlc29sdmFibGUuICBEbyB5b3Ugd2lzaCB0byBjbGVhciBpdD8KLQotIyBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbgotQUxUX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9UmVzdG9yZSBEZWZhdWx0IEZhdm9yaXRlcwotTVNHX0NPTkZJUk1fUkVTVE9SRV9ERUZBVUxUX0ZBVk9SSVRFUz1UaGlzIG9wZXJhdGlvbiB3aWxsIG92ZXJ3cml0ZSB0aGUgY3VycmVudCBmYXZvcml0ZXMuICBEbyB5b3Ugd2lzaCB0byBjb250aW51ZT8KLU1TR19FUlJPUl9PUEVOX0ZBVk9SSVRFU19CQUNLVVA9SVdBQjAxMzRFIFVuYWJsZSB0byBsb2FkIHRoZSBkZWZhdWx0IGZhdm9yaXRlcy4KLU1TR19JTkZPX0ZBVk9SSVRFU19SRVNUT1JFRF9UT19ERUZBVUxUPUlXQUIwMzIySSBEZWZhdWx0IEZhdm9yaXRlcyBhcmUgcmVzdG9yZWQuCi1NU0dfRVJST1JfU0FWRV9GQVZPUklURVNfV1NJTD1JV0FCMDE4NkUgVW5hYmxlIHRvIHNhdmUgZmF2b3JpdGVzIHRvICUxLgotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1OYXZpZ2F0b3IgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1OYXZpZ2F0b3IgVG9vbGJhcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9TmF2aWdhdG9yIENvbnRlbnQKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPUFjdGlvbnMgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Qcm9wZXJ0aWVzIENvbnRhaW5lcgotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPVByb3BlcnRpZXMgQ29udGVudAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPVByb3BlcnRpZXMgVG9vbGJhcgotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1TdGF0dXMgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1TdGF0dXMgQ29udGVudAotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9U3RhdHVzIFRvb2xiYXIKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9VRERJX0JVU0lORVNTX0RFVEFJTFM9VURESSBCdXNpbmVzcyBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfVURESV9SRUdJU1RSWV9ERVRBSUxTPVVEREkgUmVnaXN0cnkgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTPVVEREkgU2VydmljZSBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPVVEREkgU2VydmljZSBJbnRlcmZhY2UgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1dTRExfREVUQUlMUz1XU0RMIERldGFpbHMgRm9ybQotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9V1NJTCBEZXRhaWxzIEZvcm0KLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTX0xJU1Q9VURESSBCdXNpbmVzc2VzIExpc3QgVmlldwotVklFV19USVRMRV9VRERJX1JFR0lTVFJZX0xJU1Q9VURESSBSZWdpc3RyaWVzIExpc3QgVmlldwotVklFV19USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0xJU1Q9VURESSBTZXJ2aWNlIEludGVyZmFjZXMgTGlzdCBWaWV3Ci1WSUVXX1RJVExFX1VERElfU0VSVklDRV9MSVNUPVVEREkgU2VydmljZXMgTGlzdCBWaWV3Ci1WSUVXX1RJVExFX1dTRExfU0VSVklDRV9MSVNUPVdTREwgU2VydmljZXMgTGlzdCBWaWV3Ci1WSUVXX1RJVExFX1dTSUxfTElTVD1XU0lMIExpbmtzIExpc3QgVmlldwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX2RlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2YTdkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1GYXZvcml0ZW4KLQotIyBOYXZpZ2F0b3IKLUZBVk9SSVRFU19NQUlOX05PREU9RmF2b3JpdGVuIC0gSGF1cHQKLUZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFPUJldm9yenVndGUgV1NJTHMKLUZBVk9SSVRFU19XU0RMX1NFUlZJQ0VfRk9MREVSX05PREU9QmV2b3J6dWd0ZSBXU0RMLVNlcnZpY2VzCi1GQVZPUklURVNfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFPUJldm9yenVndGUgVURESS1TZXJ2aWNlcwotRkFWT1JJVEVTX1VERElfQlVTSU5FU1NFU19GT0xERVJfTk9ERT1CZXZvcnp1Z3RlIFVEREktR2VzY2hcdTAwZTRmdGUKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERT1CZXZvcnp1Z3RlIFVEREktU2VydmljZXNjaG5pdHRzdGVsbGVuCi1GQVZPUklURVNfVURESV9SRUdJU1RSSUVTX0ZPTERFUl9OT0RFPUJldm9yenVndGUgVURESS1SZWdpc3RyaWVydW5nZW4KLQotIyBGb3JtCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1dTSUw9QmV2b3J6dWd0ZSBXU0lMcwotRk9STV9MQUJFTF9GQVZPUklURV9XU0RMPUJldm9yenVndGUgV1NETHMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9SRUdJU1RSWT1CZXZvcnp1Z3RlIFVEREktUmVnaXN0cmllcnVuZ2VuCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRT1CZXZvcnp1Z3RlIFVEREktU2VydmljZXMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9CVVNJTkVTUz1CZXZvcnp1Z3RlIFVEREktR2VzY2hcdTAwZTRmdHNvYmpla3RlCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0U9QmV2b3J6dWd0ZSBVRERJLVNlcnZpY2VzY2huaXR0c3RlbGxlbgotRk9STV9MQUJFTF9SRU1PVkU9RW50ZmVybmVuCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFPVp1IFdTSUwtU2VpdGUgaGluenVmXHUwMGZjZ2VuCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19VRERJX1BFUlNQRUNUSVZFPVp1IFVEREktU2VpdGUgaGluenVmXHUwMGZjZ2VuCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0RMX1BFUlNQRUNUSVZFPVp1IFdTREwtU2VpdGUgaGluenVmXHUwMGZjZ2VuCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9RWludHJhZyAjCi1GT1JNX0xBQkVMX05BTUU9TmFtZQotRk9STV9MQUJFTF9JTlFVSVJZX1VSTD1BYmZyYWdlLVVSTAotRk9STV9MQUJFTF9QVUJMSVNIX1VSTD1QdWJsaXppZXJ1bmdzLVVSTAotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPVJlZ2lzdHJpZXJ1bmdzbmFtZQotRk9STV9MQUJFTF9CVVNJTkVTU19OQU1FPUdlc2NoXHUwMGU0ZnRzbmFtZQotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9R2VzY2hcdTAwZTRmdHNzY2hsXHUwMGZjc3NlbAotRk9STV9MQUJFTF9TRVJWSUNFX05BTUU9U2VydmljZW5hbWUKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9U2VydmljZXNjaGxcdTAwZmNzc2VsCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX05BTUU9U2VydmljZXNjaG5pdHRzdGVsbGVubmFtZQotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVk9U2VydmljZXNjaG5pdHRzdGVsbGVuc2NobFx1MDBmY3NzZWwKLUZPUk1fTEFCRUxfUkVHSVNUUllfVVJMPTxhIGhyZWY9IiUxIiB0YXJnZXQ9Il9ibGFuayI+SGllciBrbGlja2VuPC9hPiwgdW0gZWluZSBCZW51dHplci1JRCB1bmQgZWluIEtlbm53b3J0IGZcdTAwZmNyIGRpZXNlIFJlZ2lzdHJpZXJ1bmcgenUgZXJoYWx0ZW4uCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVTPURhdGVuZGF0ZWllbiBmXHUwMGZjciBiZW51dHplcmRlZmluaWVydGUgS2F0ZWdvcmllbgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMTVFIFdcdTAwZTRobGVuIFNpZSBtaW5kZXN0ZW5zIGVpbmVuIEVpbnRyYWcgYXVzLgotCi0jIExpc3RGYXZvcml0ZVdTSUxBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1dTSUw9QmV2b3J6dWd0ZSBXU0lMcyBhdWZsaXN0ZW4KLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0lMX0RFU0M9V1x1MDBlNGhsZW4gU2llIGVpbmUgR3J1cHBlIHZvbiBiZXZvcnp1Z3RlbiBXU0lMLUxpbmtzIGF1cywgdW5kIGtsaWNrZW4gU2llIDxzdHJvbmc+WnUgV1NJTC1TZWl0ZSBoaW56dWZcdTAwZmNnZW48L3N0cm9uZz4gYW4sIHVtIHNpZSBpbSBXU0lMLU5hdmlnYXRvciB6dSBcdTAwZjZmZm5lbi4gS2xpY2tlbiBTaWUgPHN0cm9uZz5FbnRmZXJuZW48L3N0cm9uZz4gYW4sIHVtIGRpZSBBdXN3YWhsIHp1IGVudGZlcm5lbi4KLQotIyBMaXN0RmF2b3JpdGVXU0RMU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFPUJldm9yenVndGUgV1NETC1TZXJ2aWNlcyBhdWZsaXN0ZW4KLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0VfREVTQz1XXHUwMGU0aGxlbiBTaWUgZWluZSBHcnVwcGUgdm9uIGJldm9yenVndGVuIFdTREwtU2VydmljZXMgYXVzLCB1bmQga2xpY2tlbiBTaWUgPHN0cm9uZz5FbnRmZXJuZW48L3N0cm9uZz4gYW4sIHVtIHNpZSB6dSBlbnRmZXJuZW4uCi0KLSMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRT1CZXZvcnp1Z3RlIFVEREktU2VydmljZXMgYXVmbGlzdGVuCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0RFU0M9V1x1MDBlNGhsZW4gU2llIGVpbmUgR3J1cHBlIHZvbiBiZXZvcnp1Z3RlbiBVRERJLVNlcnZpY2VzIGF1cywgdW5kIGtsaWNrZW4gU2llIDxzdHJvbmc+WnUgVURESS1TZWl0ZSBoaW56dWZcdTAwZmNnZW48L3N0cm9uZz4gYW4sIHVtIHNpZSBpbSBVRERJLU5hdmlnYXRvciB6dSBcdTAwZjZmZm5lbi4gS2xpY2tlbiBTaWUgPHN0cm9uZz5FbnRmZXJuZW48L3N0cm9uZz4gYW4sIHVtIGRpZSBBdXN3YWhsIHp1IGVudGZlcm5lbi4KLQotIyBMaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1M9QmV2b3J6dWd0ZSBVRERJLUdlc2NoXHUwMGU0ZnRlIGF1Zmxpc3RlbgotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1NfREVTQz1XXHUwMGU0aGxlbiBTaWUgZWluZSBHcnVwcGUgdm9uIGJldm9yenVndGVuIFVEREktR2VzY2hcdTAwZTRmdGVuIGF1cywgdW5kIGtsaWNrZW4gU2llIDxzdHJvbmc+WnUgVURESS1TZWl0ZSBoaW56dWZcdTAwZmNnZW48L3N0cm9uZz4gYW4sIHVtIHNpZSBpbSBVRERJLU5hdmlnYXRvciB6dSBcdTAwZjZmZm5lbi4gS2xpY2tlbiBTaWUgPHN0cm9uZz5FbnRmZXJuZW48L3N0cm9uZz4gYW4sIHVtIGRpZSBBdXN3YWhsIHp1IGVudGZlcm5lbi4KLQotIyBMaXN0RmF2b3JpdGVVRERJUmVnaXN0cnlBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUlk9QmV2b3J6dWd0ZSBVRERJLVJlZ2lzdHJpZXJ1bmdlbiBhdWZsaXN0ZW4KLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1JFR0lTVFJZX0RFU0M9V1x1MDBlNGhsZW4gU2llIGVpbmUgR3J1cHBlIHZvbiBiZXZvcnp1Z3RlbiBVRERJLVJlZ2lzdHJpZXJ1bmdlbiBhdXMsIHVuZCBrbGlja2VuIFNpZSA8c3Ryb25nPlp1IFVEREktU2VpdGUgaGluenVmXHUwMGZjZ2VuPC9zdHJvbmc+IGFuLCB1bSBzaWUgaW0gVURESS1OYXZpZ2F0b3IgenUgXHUwMGY2ZmZuZW4uIEtsaWNrZW4gU2llIDxzdHJvbmc+RW50ZmVybmVuPC9zdHJvbmc+IGFuLCB1bSBkaWUgQXVzd2FobCB6dSBlbnRmZXJuZW4uCi0KLSMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0U9QmV2b3J6dWd0ZSBVRERJLVNlcnZpY2VzY2huaXR0c3RlbGxlbiBhdWZsaXN0ZW4KLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0M9V1x1MDBlNGhsZW4gU2llIGVpbmUgR3J1cHBlIHZvbiBiZXZvcnp1Z3RlbiBVRERJLVNlcnZpY2VzY2huaXR0c3RlbGxlbiBhdXMsIHVuZCBrbGlja2VuIFNpZSA8c3Ryb25nPlp1IFVEREktU2VpdGUgaGluenVmXHUwMGZjZ2VuPC9zdHJvbmc+IGFuLCB1bSBzaWUgaW0gVURESS1OYXZpZ2F0b3IgenUgXHUwMGY2ZmZuZW4uIEtsaWNrZW4gU2llIDxzdHJvbmc+RW50ZmVybmVuPC9zdHJvbmc+IGFuLCB1bSBkaWUgQXVzd2FobCB6dSBlbnRmZXJuZW4uCi0KLSMgRmF2b3JpdGVzV1NJTERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NJTF9ERVRBSUxTPUJldm9yenVndGUgV1NJTCAtIERldGFpbHMKLQotIyBGYXZvcml0ZXNXU0RMRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19XU0RMX0RFVEFJTFM9QmV2b3J6dWd0ZSBXU0RMIC0gRGV0YWlscwotCi0jIEZhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9SRUdJU1RSWV9ERVRBSUxTPUJldm9yenVndGUgVURESS1SZWdpc3RyaWVydW5nIC0gRGV0YWlscwotCi0jIEZhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9CVVNJTkVTU19ERVRBSUxTPUJldm9yenVndGVzIFVEREktR2VzY2hcdTAwZTRmdCAtIERldGFpbHMKLQotIyBGYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0RFVEFJTFM9QmV2b3J6dWd0ZXIgVURESS1TZXJ2aWNlIC0gRGV0YWlscwotCi0jIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9QmV2b3J6dWd0ZSBVRERJLVNlcnZpY2VzY2huaXR0c3RlbGxlIC0gRGV0YWlscwotCi0jIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9WnUgV1NJTC1TZWl0ZSBoaW56dWZcdTAwZmNnZW4KLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzE2RSAlMSBpc3QgYmVyZWl0cyBpbiBXU0lMLVNlaXRlIGdlXHUwMGY2ZmZuZXQKLU1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMxN0kgJTEgd3VyZGUgenUgV1NJTC1TZWl0ZSBoaW56dWdlZlx1MDBmY2d0LgotTVNHX0VSUk9SX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9SVdBQjAzMThFIFdTSUwgJTEga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLgotCi0jIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9WnUgVURESS1TZWl0ZSBoaW56dWZcdTAwZmNnZW4KLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMyMEUgJTEga29ubnRlIGluIGRlciBSZWdpc3RyaWVydW5nIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi4KLU1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMjFJICUxIHd1cmRlIHp1IFVEREktU2VpdGUgaGluenVnZWZcdTAwZmNndC4KLQotIyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9WnUgV1NETC1TZWl0ZSBoaW56dWZcdTAwZmNnZW4KLU1TR19JTkZPX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDM2OUkgJTEgd3VyZGUgenUgV1NETC1TZWl0ZSBoaW56dWdlZlx1MDBmY2d0LgotTVNHX0VSUk9SX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzBFIFdTREwgJTEga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLgotCi0jIFJlbW92ZUZhdm9yaXRlQWN0aW9uCi1BTFRfUkVNT1ZFX0ZBVk9SSVRFPUZhdm9yaXQgZW50ZmVybmVuCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSBrYW5uIG5pY2h0IG1laHIgYXVmZ2VsXHUwMGY2c3Qgd2VyZGVuLiAgU29sbCBkZXIgS25vdGVuIGdlbFx1MDBmNnNjaHQgd2VyZGVuPwotCi0jIEZhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uCi1BTFRfUkVTVE9SRV9ERUZBVUxUX0ZBVk9SSVRFUz1TdGFuZGFyZGZhdm9yaXRlbiB3aWVkZXJoZXJzdGVsbGVuCi1NU0dfQ09ORklSTV9SRVNUT1JFX0RFRkFVTFRfRkFWT1JJVEVTPUR1cmNoIGRpZXNlIE9wZXJhdGlvbiB3ZXJkZW4gZGllIGFrdHVlbGxlbiBGYXZvcml0ZW4gXHUwMGZjYmVyc2NocmllYmVuLiAgTVx1MDBmNmNodGVuIFNpZSBmb3J0ZmFocmVuPwotTVNHX0VSUk9SX09QRU5fRkFWT1JJVEVTX0JBQ0tVUD1JV0FCMDEzNEUgRGllIFN0YW5kYXJkZmF2b3JpdGVuIGtcdTAwZjZubmVuIG5pY2h0IGdlbGFkZW4gd2VyZGVuLgotTVNHX0lORk9fRkFWT1JJVEVTX1JFU1RPUkVEX1RPX0RFRkFVTFQ9SVdBQjAzMjJJIERpZSBTdGFuZGFyZGZhdm9yaXRlbiB3ZXJkZW4gd2llZGVyaGVyZ2VzdGVsbHQuCi1NU0dfRVJST1JfU0FWRV9GQVZPUklURVNfV1NJTD1JV0FCMDE4NkUgRGllIEZhdm9yaXRlbiBrXHUwMGY2bm5lbiBuaWNodCBpbiAlMSBnZXNwZWljaGVydCB3ZXJkZW4uCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPU5hdmlnYXRvciAtIENvbnRhaW5lcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9TmF2aWdhdG9yIC0gU3ltYm9sbGVpc3RlCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1OYXZpZ2F0b3IgLSBJbmhhbHQKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPUFrdGlvbmVuIC0gQ29udGFpbmVyCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1FaWdlbnNjaGFmdGVuIC0gQ29udGFpbmVyCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9RWlnZW5zY2hhZnRlbiAtIEluaGFsdAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPUVpZ2Vuc2NoYWZ0ZW4gLSBTeW1ib2xsZWlzdGUKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9U3RhdHVzIC0gQ29udGFpbmVyCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1TdGF0dXMgLSBJbmhhbHQKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVN0YXR1cyAtIFN5bWJvbGxlaXN0ZQotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX1VERElfQlVTSU5FU1NfREVUQUlMUz1Gb3JtdWxhciBmXHUwMGZjciBVRERJLUdlc2NoXHUwMGU0ZnRzZGV0YWlscwotRk9STV9USVRMRV9VRERJX1JFR0lTVFJZX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgVURESS1SZWdpc3RyaWVydW5nc2RldGFpbHMKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgVURESS1TZXJ2aWNlZGV0YWlscwotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgVURESS1TZXJ2aWNlc2Nobml0dHN0ZWxsZW5kZXRhaWxzCi1GT1JNX1RJVExFX1dTRExfREVUQUlMUz1Gb3JtdWxhciBmXHUwMGZjciBXU0RMLURldGFpbHMKLUZPUk1fVElUTEVfV1NJTF9ERVRBSUxTPUZvcm11bGFyIGZcdTAwZmNyIFdTSUwtRGV0YWlscwotCi0jIFZpZXcgdGl0bGVzCi1WSUVXX1RJVExFX1VERElfQlVTSU5FU1NfTElTVD1VRERJLUdlc2NoXHUwMGU0ZnRlIC0gTGlzdGVuc2ljaHQKLVZJRVdfVElUTEVfVURESV9SRUdJU1RSWV9MSVNUPVVEREktUmVnaXN0cmllcnVuZ2VuIC0gTGlzdGVuc2ljaHQKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9MSVNUPVVEREktU2VydmljZXNjaG5pdHRzdGVsbGVuIC0gTGlzdGVuc2ljaHQKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0xJU1Q9VURESS1TZXJ2aWNlcyAtIExpc3RlbnNpY2h0Ci1WSUVXX1RJVExFX1dTRExfU0VSVklDRV9MSVNUPVdTREwtU2VydmljZXMgLSBMaXN0ZW5zaWNodAotVklFV19USVRMRV9XU0lMX0xJU1Q9V1NJTC1MaW5rcyAtIExpc3RlbnNpY2h0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlc19lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTc5NWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlc19lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPUZhdm9yaXRvcwotCi0jIE5hdmlnYXRvcgotRkFWT1JJVEVTX01BSU5fTk9ERT1GYXZvcml0b3MgLSBQcmluY2lwYWwKLUZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFPVdTSUwgZmF2b3JpdG9zCi1GQVZPUklURVNfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFPVNlcnZpY2lvcyBXU0RMIGZhdm9yaXRvcwotRkFWT1JJVEVTX1VERElfU0VSVklDRV9GT0xERVJfTk9ERT1TZXJ2aWNpb3MgVURESSBmYXZvcml0b3MKLUZBVk9SSVRFU19VRERJX0JVU0lORVNTRVNfRk9MREVSX05PREU9RW1wcmVzYXMgVURESSBmYXZvcml0YXMKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERT1JbnRlcmZhY2VzIGRlIHNlcnZpY2lvIFVEREkgZmF2b3JpdG9zCi1GQVZPUklURVNfVURESV9SRUdJU1RSSUVTX0ZPTERFUl9OT0RFPVJlZ2lzdHJvcyBVRERJIGZhdm9yaXRvcwotCi0jIEZvcm0KLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NJTD1XU0lMIGZhdm9yaXRvcwotRk9STV9MQUJFTF9GQVZPUklURV9XU0RMPVdTREwgZmF2b3JpdG9zCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfUkVHSVNUUlk9UmVnaXN0cm9zIFVEREkgZmF2b3JpdG9zCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRT1TZXJ2aWNpb3MgVURESSBmYXZvcml0b3MKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9CVVNJTkVTUz1FbnRpZGFkZXMgZGUgZW1wcmVzYSBVRERJIGZhdm9yaXRhcwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFPUludGVyZmFjZXMgZGUgc2VydmljaW8gVURESSBmYXZvcml0b3MKLUZPUk1fTEFCRUxfUkVNT1ZFPUVsaW1pbmFyCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFPUFcdTAwZjFhZGlyIGEgcFx1MDBlMWdpbmEgV1NJTAotRk9STV9MQUJFTF9JTVBPUlRfVE9fVURESV9QRVJTUEVDVElWRT1BXHUwMGYxYWRpciBhIHBcdTAwZTFnaW5hIFVEREkKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1dTRExfUEVSU1BFQ1RJVkU9QVx1MDBmMWFkaXIgYSBwXHUwMGUxZ2luYSBXU0RMCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9RWxlbWVudG8gIwotRk9STV9MQUJFTF9OQU1FPU5vbWJyZQotRk9STV9MQUJFTF9JTlFVSVJZX1VSTD1VUkwgZGUgY29uc3VsdGEKLUZPUk1fTEFCRUxfUFVCTElTSF9VUkw9VVJMIGRlIHB1YmxpY2FjaVx1MDBmM24KLUZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRT1Ob21icmUgZGUgcmVnaXN0cm8KLUZPUk1fTEFCRUxfQlVTSU5FU1NfTkFNRT1Ob21icmUgZGUgZW1wcmVzYQotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9Q2xhdmUgZGUgZW1wcmVzYQotRk9STV9MQUJFTF9TRVJWSUNFX05BTUU9Tm9tYnJlIGRlIHNlcnZpY2lvCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPUNsYXZlIGRlIHNlcnZpY2lvCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX05BTUU9Tm9tYnJlIGRlIGludGVyZmF6IGRlIHNlcnZpY2lvCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX0tFWT1DbGF2ZSBkZSBpbnRlcmZheiBkZSBzZXJ2aWNpbwotRk9STV9MQUJFTF9SRUdJU1RSWV9VUkw9PGEgaHJlZj0iJTEiIHRhcmdldD0iX2JsYW5rIj5QdWxzZSBhcXVcdTAwZWQ8L2E+IHBhcmEgb2J0ZW5lciB1biBJRCBkZSB1c3VhcmlvIHkgdW5hIGNvbnRyYXNlXHUwMGYxYSBwYXJhIGVzdGUgcmVnaXN0cm8uCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVTPUFyY2hpdm9zIGRlIGRhdG9zIHBhcmEgbGFzIGNhdGVnb3JcdTAwZWRhcyBkZWZpbmlkYXMgcG9yIGVsIHVzdWFyaW8KLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzE1RSBTZWxlY2Npb25lIGNvbW8gbVx1MDBlZG5pbW8gdW4gZWxlbWVudG8uCi0KLSMgTGlzdEZhdm9yaXRlV1NJTEFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NJTD1MaXN0YXIgV1NJTCBmYXZvcml0b3MKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0lMX0RFU0M9U2VsZWNjaW9uZSB1biBjb25qdW50byBkZSBlbmxhY2VzIFdTSUwgZmF2b3JpdG9zIHkgcHVsc2UgPHN0cm9uZz5BXHUwMGYxYWRpciBhIHBcdTAwZTFnaW5hIFdTSUw8L3N0cm9uZz4gcGFyYSBhYnJpcmxvcyBlbiBlbCBuYXZlZ2Fkb3IgV1NJTC4gUHVsc2UgPHN0cm9uZz5FbGltaW5hcjwvc3Ryb25nPiBwYXJhIGVsaW1pbmFyIGxhcyBzZWxlY2Npb25lcy4KLQotIyBMaXN0RmF2b3JpdGVXU0RMU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFPUxpc3RhciBzZXJ2aWNpb3MgV1NETCBmYXZvcml0b3MKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0VfREVTQz1TZWxlY2Npb25lIHVuIGNvbmp1bnRvIGRlIHNlcnZpY2lvcyBXU0RMIGZhdm9yaXRvcyB5IHB1bHNlIDxzdHJvbmc+RWxpbWluYXI8L3N0cm9uZz4gcGFyYSBlbGltaW5hcmxvcy4KLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFPUxpc3RhciBzZXJ2aWNpb3MgVURESSBmYXZvcml0b3MKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfREVTQz1TZWxlY2Npb25lIHVuIGNvbmp1bnRvIGRlIHNlcnZpY2lvcyBVRERJIGZhdm9yaXRvcyB5IHB1bHNlIDxzdHJvbmc+QVx1MDBmMWFkaXIgYSBwXHUwMGUxZ2luYSBVRERJPC9zdHJvbmc+IHBhcmEgYWJyaXJsb3MgZW4gZWwgbmF2ZWdhZG9yIFVEREkuIFB1bHNlIDxzdHJvbmc+RWxpbWluYXI8L3N0cm9uZz4gcGFyYSBlbGltaW5hciBsYXMgc2VsZWNjaW9uZXMuCi0KLSMgTGlzdEZhdm9yaXRlVURESUJ1c2luZXNzQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX0JVU0lORVNTPUxpc3RhciBlbXByZXNhcyBVRERJIGZhdm9yaXRhcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1NfREVTQz1TZWxlY2Npb25lIHVuIGNvbmp1bnRvIGRlIGVtcHJlc2FzIFVEREkgZmF2b3JpdGFzIHkgcHVsc2UgPHN0cm9uZz5BXHUwMGYxYWRpciBhIHBcdTAwZTFnaW5hIFVEREk8L3N0cm9uZz4gcGFyYSBhYnJpcmxhcyBlbiBlbCBuYXZlZ2Fkb3IgVURESS4gUHVsc2UgPHN0cm9uZz5FbGltaW5hcjwvc3Ryb25nPiBwYXJhIGVsaW1pbmFyIGxhcyBzZWxlY2Npb25lcy4KLQotIyBMaXN0RmF2b3JpdGVVRERJUmVnaXN0cnlBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUlk9TGlzdGFyIHJlZ2lzdHJvcyBVRERJIGZhdm9yaXRvcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUllfREVTQz1TZWxlY2Npb25lIHVuIGNvbmp1bnRvIGRlIHJlZ2lzdHJvcyBVRERJIGZhdm9yaXRvcyB5IHB1bHNlIDxzdHJvbmc+QVx1MDBmMWFkaXIgYSBwXHUwMGUxZ2luYSBVRERJPC9zdHJvbmc+IHBhcmEgYWJyaXJsb3MgZW4gZWwgbmF2ZWdhZG9yIFVEREkuIFB1bHNlIDxzdHJvbmc+RWxpbWluYXI8L3N0cm9uZz4gcGFyYSBlbGltaW5hciBsYXMgc2VsZWNjaW9uZXMuCi0KLSMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0U9TGlzdGFyIGludGVyZmFjZXMgZGUgc2VydmljaW8gVURESSBmYXZvcml0YXMKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0M9U2VsZWNjaW9uZSB1biBjb25qdW50byBkZSBpbnRlcmZhY2VzIGRlIHNlcnZpY2lvIFVEREkgZmF2b3JpdGFzIHkgcHVsc2UgPHN0cm9uZz5BXHUwMGYxYWRpciBhIHBcdTAwZTFnaW5hIFVEREk8L3N0cm9uZz4gcGFyYSBhYnJpcmxhcyBlbiBlbCBuYXZlZ2Fkb3IgVURESS4gUHVsc2UgPHN0cm9uZz5FbGltaW5hcjwvc3Ryb25nPiBwYXJhIGVsaW1pbmFyIGxhcyBzZWxlY2Npb25lcy4KLQotIyBGYXZvcml0ZXNXU0lMRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19XU0lMX0RFVEFJTFM9RGV0YWxsZXMgZGUgV1NJTCBmYXZvcml0bwotCi0jIEZhdm9yaXRlc1dTRExEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1dTRExfREVUQUlMUz1EZXRhbGxlcyBkZSBXU0RMIGZhdm9yaXRvCi0KLSMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1JFR0lTVFJZX0RFVEFJTFM9RGV0YWxsZXMgZGUgcmVnaXN0cm8gVURESSBmYXZvcml0bwotCi0jIEZhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9CVVNJTkVTU19ERVRBSUxTPURldGFsbGVzIGRlIGVtcHJlc2EgVURESSBmYXZvcml0YQotCi0jIEZhdm9yaXRlc1VERElTZXJ2aWNlRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfREVUQUlMUz1EZXRhbGxlcyBkZSBzZXJ2aWNpbyBVRERJIGZhdm9yaXRvCi0KLSMgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1EZXRhbGxlcyBkZSBpbnRlcmZheiBkZSBzZXJ2aWNpbyBVRERJIGZhdm9yaXRvCi0KLSMgQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRT1BXHUwMGYxYWRpciBhIHBcdTAwZTFnaW5hIFdTSUwKLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzE2RSAlMSB5YSBlc3RcdTAwZTEgYWJpZXJ0byBlbiBsYSBwXHUwMGUxZ2luYSBXU0lMLgotTVNHX0lORk9fQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzE3SSAlMSBzZSBoYSBhXHUwMGYxYWRpZG8gYSBsYSBwXHUwMGUxZ2luYSBXU0lMLgotTVNHX0VSUk9SX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9SVdBQjAzMThFIE5vIHNlIGhhIHBvZGlkbyBjYXJnYXIgV1NJTCAlMS4KLQotIyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUFcdTAwZjFhZGlyIGEgcFx1MDBlMWdpbmEgVURESQotTVNHX0VSUk9SX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUlXQUIwMzIwRSAlMSBubyBzZSBoYSBlbmNvbnRyYWRvIGVuIGVsIHJlZ2lzdHJvLgotTVNHX0lORk9fQUREX1RPX1VERElfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMyMUkgJTEgc2UgaGEgYVx1MDBmMWFkaWRvIGEgbGEgcFx1MDBlMWdpbmEgVURESS4KLQotIyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9QVx1MDBmMWFkaXIgYSBwXHUwMGUxZ2luYSBXU0RMCi1NU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzNjlJICUxIHNlIGhhIGFcdTAwZjFhZGlkbyBhIGxhIHBcdTAwZTFnaW5hIFdTREwuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3MEUgV1NETCAlMSBubyBzZSBoYSBwb2RpZG8gY2FyZ2FyLgotCi0jIFJlbW92ZUZhdm9yaXRlQWN0aW9uCi1BTFRfUkVNT1ZFX0ZBVk9SSVRFPUVsaW1pbmFyIGZhdm9yaXRvCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSB5YSBubyBwdWVkZSByZXNvbHZlcnNlLiAgXHUwMGJmRGVzZWEgYm9ycmFybG8/Ci0KLSMgRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24KLUFMVF9SRVNUT1JFX0RFRkFVTFRfRkFWT1JJVEVTPVJlc3RhdXJhciBmYXZvcml0b3MgcG9yIG9taXNpXHUwMGYzbgotTVNHX0NPTkZJUk1fUkVTVE9SRV9ERUZBVUxUX0ZBVk9SSVRFUz1Fc3RhIG9wZXJhY2lcdTAwZjNuIHNvYnJlc2NyaWJpclx1MDBlMSBsb3MgZmF2b3JpdG9zIGFjdHVhbGVzLiAgXHUwMGJmRGVzZWEgY29udGludWFyPwotTVNHX0VSUk9SX09QRU5fRkFWT1JJVEVTX0JBQ0tVUD1JV0FCMDEzNEUgTm8gc2UgcHVlZGVuIGNhcmdhciBsb3MgZmF2b3JpdG9zIHBvciBvbWlzaVx1MDBmM24uCi1NU0dfSU5GT19GQVZPUklURVNfUkVTVE9SRURfVE9fREVGQVVMVD1JV0FCMDMyMkkgU2UgaGFuIHJlc3RhdXJhZG8gbG9zIGZhdm9yaXRvcyBwb3Igb21pc2lcdTAwZjNuLgotTVNHX0VSUk9SX1NBVkVfRkFWT1JJVEVTX1dTSUw9SVdBQjAxODZFIE5vIHNlIHB1ZWRlbiBndWFyZGFyIGxvcyBmYXZvcml0b3MgZW4gJTEuCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPUNvbnRlbmVkb3IgZGVsIG5hdmVnYWRvcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9QmFycmEgZGUgaGVycmFtaWVudGFzIGRlbCBuYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPUNvbnRlbmlkbyBkZWwgbmF2ZWdhZG9yCi1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1Db250ZW5lZG9yIGRlIGFjY2lvbmVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Db250ZW5lZG9yIGRlIHByb3BpZWRhZGVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9Q29udGVuaWRvIGRlIHByb3BpZWRhZGVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9QmFycmEgZGUgaGVycmFtaWVudGFzIGRlIHByb3BpZWRhZGVzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPUNvbnRlbmVkb3IgZGUgZXN0YWRvCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZW5pZG8gZGUgZXN0YWRvCi1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1CYXJyYSBkZSBoZXJyYW1pZW50YXMgZGUgZXN0YWRvCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPUZvcm11bGFyaW8gZGUgZGV0YWxsZXMgZGUgZW1wcmVzYSBVRERJCi1GT1JNX1RJVExFX1VERElfUkVHSVNUUllfREVUQUlMUz1Gb3JtdWxhcmlvIGRlIGRldGFsbGVzIGRlIHJlZ2lzdHJvIFVEREkKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9Rm9ybXVsYXJpbyBkZSBkZXRhbGxlcyBkZSBzZXJ2aWNpbyBVRERJCi1GT1JNX1RJVExFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1Gb3JtdWxhcmlvIGRlIGRldGFsbGVzIGRlIGludGVyZmF6IGRlIHNlcnZpY2lvIFVEREkKLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPUZvcm11bGFyaW8gZGUgZGV0YWxsZXMgZGUgV1NETAotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9Rm9ybXVsYXJpbyBkZSBkZXRhbGxlcyBkZSBXU0lMCi0KLSMgVmlldyB0aXRsZXMKLVZJRVdfVElUTEVfVURESV9CVVNJTkVTU19MSVNUPVZpc3RhIExpc3RhIGRlIGVtcHJlc2FzIFVEREkKLVZJRVdfVElUTEVfVURESV9SRUdJU1RSWV9MSVNUPVZpc3RhIExpc3RhIGRlIHJlZ2lzdHJvcyBVRERJCi1WSUVXX1RJVExFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTElTVD1WaXN0YSBMaXN0YSBkZSBpbnRlcmZhY2VzIGRlIHNlcnZpY2lvIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0xJU1Q9VmlzdGEgTGlzdGEgZGUgc2VydmljaW9zIFVEREkKLVZJRVdfVElUTEVfV1NETF9TRVJWSUNFX0xJU1Q9VmlzdGEgTGlzdGEgZGUgc2VydmljaW9zIFdTREwKLVZJRVdfVElUTEVfV1NJTF9MSVNUPVZpc3RhIExpc3RhIGRlIGVubGFjZXMgV1NJTApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX2ZyLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlOWU3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1GYXZvcmlzCi0KLSMgTmF2aWdhdG9yCi1GQVZPUklURVNfTUFJTl9OT0RFPUZhdm9yaXMgLSBQYWdlIHByaW5jaXBhbGUKLUZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFPVdTSUwgZmF2b3JpcwotRkFWT1JJVEVTX1dTRExfU0VSVklDRV9GT0xERVJfTk9ERT1TZXJ2aWNlcyBXU0RMIGZhdm9yaXMKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfRk9MREVSX05PREU9U2VydmljZXMgVURESSBmYXZvcmlzCi1GQVZPUklURVNfVURESV9CVVNJTkVTU0VTX0ZPTERFUl9OT0RFPU1cdTAwZTl0aWVycyBVRERJIGZhdm9yaXMKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERT1JbnRlcmZhY2VzIGRlIHNlcnZpY2UgVURESSBmYXZvcml0ZXMKLUZBVk9SSVRFU19VRERJX1JFR0lTVFJJRVNfRk9MREVSX05PREU9UmVnaXN0cmVzIFVEREkgZmF2b3JpcwotCi0jIEZvcm0KLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NJTD1XU0lMIGZhdm9yaXMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NETD1XU0RMIGZhdm9yaXMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9SRUdJU1RSWT1SZWdpc3RyZXMgVURESSBmYXZvcmlzCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRT1TZXJ2aWNlcyBVRERJIGZhdm9yaXMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9CVVNJTkVTUz1FbnRpdFx1MDBlOXMgbVx1MDBlOXRpZXIgVURESSBmYXZvcml0ZXMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1JbnRlcmZhY2VzIGRlIHNlcnZpY2UgVURESSBmYXZvcml0ZXMKLUZPUk1fTEFCRUxfUkVNT1ZFPVN1cHByaW1lcgotRk9STV9MQUJFTF9JTVBPUlRfVE9fV1NJTF9QRVJTUEVDVElWRT1Bam91dGVyIFx1MDBlMCBsYSBwYWdlIFdTSUwKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkU9QWpvdXRlciBcdTAwZTAgbGEgcGFnZSBVRERJCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0RMX1BFUlNQRUNUSVZFPUFqb3V0ZXIgXHUwMGUwIGxhIHBhZ2UgV1NETAotRk9STV9MQUJFTF9VUkw9VVJMCi1GT1JNX0xBQkVMX0lURU1fTlVNQkVSPU5cdTAwYjAgZGUgbCdcdTAwZTlsXHUwMGU5bWVudAotRk9STV9MQUJFTF9OQU1FPU5vbQotRk9STV9MQUJFTF9JTlFVSVJZX1VSTD1VUkwgZCdpbnRlcnJvZ2F0aW9uCi1GT1JNX0xBQkVMX1BVQkxJU0hfVVJMPVVSTCBkZSBwdWJsaWNhdGlvbgotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPU5vbSBkdSByZWdpc3RyZQotRk9STV9MQUJFTF9CVVNJTkVTU19OQU1FPU5vbSBkdSBtXHUwMGU5dGllcgotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9Q2xcdTAwZTkgZHUgbVx1MDBlOXRpZXIKLUZPUk1fTEFCRUxfU0VSVklDRV9OQU1FPU5vbSBkdSBzZXJ2aWNlCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPUNsXHUwMGU5IGR1IHNlcnZpY2UKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRT1Ob20gZGUgbCdpbnRlcmZhY2UgZGUgc2VydmljZQotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVk9Q2xcdTAwZTkgZCdpbnRlcmZhY2UgZGUgc2VydmljZQotRk9STV9MQUJFTF9SRUdJU1RSWV9VUkw9PGEgaHJlZj0iJTEiIHRhcmdldD0iX2JsYW5rIj5DbGlxdWV6IGljaTwvYT4gcG91ciBvYnRlbmlyIHVuIElEIHV0aWxpc2F0ZXVyIGV0IHVuIG1vdCBkZSBwYXNzZSBwb3VyIGNlIHJlZ2lzdHJlLgotRk9STV9MQUJFTF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFUz1GaWNoaWVycyBkZSBkb25uXHUwMGU5ZXMgZGVzIGNhdFx1MDBlOWdvcmllcyBkXHUwMGU5ZmluaWVzIHBhciBsJ3V0aWxpc2F0ZXVyCi1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDMxNUUgU1x1MDBlOWxlY3Rpb25uZXogYXUgbW9pbnMgdW4gXHUwMGU5bFx1MDBlOW1lbnQuCi0KLSMgTGlzdEZhdm9yaXRlV1NJTEFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NJTD1SXHUwMGU5cGVydG9yaWVyIGxlcyBXU0lMIGZhdm9yaXMKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0lMX0RFU0M9U1x1MDBlOWxlY3Rpb25uZXogdW4gZ3JvdXBlIGRlIGxpZW5zIFdTSUwgZmF2b3JpcyBldCBjbGlxdWV6IHN1ciA8c3Ryb25nPkFqb3V0ZXIgXHUwMGUwIGxhIHBhZ2UgV1NJTDwvc3Ryb25nPiBwb3VyIG91dnJpciBjZXMgbGllbnMgZGFucyBsZSBuYXZpZ2F0ZXVyIFdTSUwuIENsaXF1ZXogc3VyIDxzdHJvbmc+U3VwcHJpbWVyPC9zdHJvbmc+IHBvdXIgc3VwcHJpbWVyIGxlcyBzXHUwMGU5bGVjdGlvbnMuCi0KLSMgTGlzdEZhdm9yaXRlV1NETFNlcnZpY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1dTRExfU0VSVklDRT1SXHUwMGU5cGVydG9yaWVyIGxlcyBzZXJ2aWNlcyBXU0RMIGZhdm9yaXMKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0VfREVTQz1TXHUwMGU5bGVjdGlvbm5leiB1biBncm91cGUgZGUgc2VydmljZXMgV1NETCBmYXZvcmlzIGV0IGNsaXF1ZXogc3VyIDxzdHJvbmc+U3VwcHJpbWVyPC9zdHJvbmc+IHBvdXIgbGVzIHN1cHByaW1lci4KLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFPVJcdTAwZTlwZXJ0b3JpZXIgbGVzIHNlcnZpY2VzIFVEREkgZmF2b3JpcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9ERVNDPVNcdTAwZTlsZWN0aW9ubmV6IHVuIGdyb3VwZSBkZSBzZXJ2aWNlcyBVRERJIGZhdm9yaXMgZXQgY2xpcXVleiBzdXIgPHN0cm9uZz5Bam91dGVyIFx1MDBlMCBsYSBwYWdlIFVEREk8L3N0cm9uZz4gcG91ciBvdXZyaXIgY2VzIHNlcnZpY2VzIGRhbnMgbGUgbmF2aWdhdGV1ciBVRERJLiBDbGlxdWV6IHN1ciA8c3Ryb25nPlN1cHByaW1lcjwvc3Ryb25nPiBwb3VyIHN1cHByaW1lciBsZXMgc1x1MDBlOWxlY3Rpb25zLgotCi0jIExpc3RGYXZvcml0ZVVERElCdXNpbmVzc0FjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTUz1SXHUwMGU5cGVydG9yaWVyIGxlcyBtXHUwMGU5dGllcnMgVURESSBmYXZvcmlzCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTU19ERVNDPVNcdTAwZTlsZWN0aW9ubmV6IHVuIGdyb3VwZSBkZSBtXHUwMGU5dGllcnMgVURESSBmYXZvcmlzIGV0IGNsaXF1ZXogc3VyIDxzdHJvbmc+QWpvdXRlciBcdTAwZTAgbGEgcGFnZSBVRERJPC9zdHJvbmc+IHBvdXIgb3V2cmlyIGNlcyBtXHUwMGU5dGllcnMgZGFucyBsZSBuYXZpZ2F0ZXVyIFVEREkuIENsaXF1ZXogc3VyIDxzdHJvbmc+U3VwcHJpbWVyPC9zdHJvbmc+IHBvdXIgc3VwcHJpbWVyIGxlcyBzXHUwMGU5bGVjdGlvbnMuCi0KLSMgTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5QWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX1JFR0lTVFJZPVJcdTAwZTlwZXJ0b3JpZXIgbGVzIHJlZ2lzdHJlcyBVRERJIGZhdm9yaXMKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1JFR0lTVFJZX0RFU0M9U1x1MDBlOWxlY3Rpb25uZXogdW4gZ3JvdXBlIGRlIHJlZ2lzdHJlcyBVRERJIGZhdm9yaXMgZXQgY2xpcXVleiBzdXIgPHN0cm9uZz5Bam91dGVyIFx1MDBlMCBsYSBwYWdlIFVEREk8L3N0cm9uZz4gcG91ciBvdXZyaXIgY2VzIHJlZ2lzdHJlcyBkYW5zIGxlIG5hdmlnYXRldXIgVURESS4gQ2xpcXVleiBzdXIgPHN0cm9uZz5TdXBwcmltZXI8L3N0cm9uZz4gcG91ciBzdXBwcmltZXIgbGVzIHNcdTAwZTlsZWN0aW9ucy4KLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1SXHUwMGU5cGVydG9yaWVyIGxlcyBpbnRlcmZhY2VzIGRlIHNlcnZpY2UgVURESSBmYXZvcml0ZXMKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0M9U1x1MDBlOWxlY3Rpb25uZXogdW4gZ3JvdXBlIGQnaW50ZXJmYWNlcyBkZSBzZXJ2aWNlIFVEREkgZmF2b3JpdGVzIGV0IGNsaXF1ZXogc3VyIDxzdHJvbmc+QWpvdXRlciBcdTAwZTAgbGEgcGFnZSBVRERJPC9zdHJvbmc+IHBvdXIgb3V2cmlyIGNlcyBpbnRlcmZhY2VzIGRlIHNlcnZpY2UgZGFucyBsZSBuYXZpZ2F0ZXVyIFVEREkuIENsaXF1ZXogc3VyIDxzdHJvbmc+U3VwcHJpbWVyPC9zdHJvbmc+IHBvdXIgc3VwcHJpbWVyIGxlcyBzXHUwMGU5bGVjdGlvbnMuCi0KLSMgRmF2b3JpdGVzV1NJTERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NJTF9ERVRBSUxTPUNhcmFjdFx1MDBlOXJpc3RpcXVlcyBkZXMgV1NJTCBmYXZvcmlzCi0KLSMgRmF2b3JpdGVzV1NETERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NETF9ERVRBSUxTPUNhcmFjdFx1MDBlOXJpc3RpcXVlcyBkZXMgV1NETCBmYXZvcmlzCi0KLSMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1JFR0lTVFJZX0RFVEFJTFM9Q2FyYWN0XHUwMGU5cmlzdGlxdWVzIGRlcyByZWdpc3RyZXMgVURESSBmYXZvcmlzCi0KLSMgRmF2b3JpdGVzVURESUJ1c2luZXNzRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX0JVU0lORVNTX0RFVEFJTFM9Q2FyYWN0XHUwMGU5cmlzdGlxdWVzIGRlcyBtXHUwMGU5dGllcnMgVURESSBmYXZvcmlzCi0KLSMgRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfU0VSVklDRV9ERVRBSUxTPUNhcmFjdFx1MDBlOXJpc3RpcXVlcyBkZXMgc2VydmljZXMgVURESSBmYXZvcmlzCi0KLSMgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1DYXJhY3RcdTAwZTlyaXN0aXF1ZXMgZGVzIGludGVyZmFjZXMgZGUgc2VydmljZSBVRERJIGZhdm9yaXRlcwotCi0jIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9QWpvdXRlciBcdTAwZTAgbGEgcGFnZSBXU0lMCi1NU0dfRVJST1JfV1NJTF9BTFJFQURZX09QRU5FRD1JV0FCMDMxNkUgJTEgZXN0IGRcdTAwZTlqXHUwMGUwIG91dmVydCBkYW5zIGxhIHBhZ2UgV1NJTC4KLU1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMxN0kgJTEgZXN0IGFqb3V0XHUwMGU5IFx1MDBlMCBsYSBwYWdlIFdTSUwuCi1NU0dfRVJST1JfQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRT1JV0FCMDMxOEUgTGUgV1NJTCAlMSBuJ2EgcGFzIHB1IFx1MDBlYXRyZSBjaGFyZ1x1MDBlOS4KLQotIyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUFqb3V0ZXIgXHUwMGUwIGxhIHBhZ2UgVURESQotTVNHX0VSUk9SX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUlXQUIwMzIwRSAlMSBlc3QgaW50cm91dmFibGUgZGFucyBsZSByZWdpc3RyZS4KLU1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMjFJICUxIGVzdCBham91dFx1MDBlOSBcdTAwZTAgbGEgcGFnZSBVRERJLgotCi0jIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1Bam91dGVyIFx1MDBlMCBsYSBwYWdlIFdTREwKLU1TR19JTkZPX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDM2OUkgJTEgZXN0IGFqb3V0XHUwMGU5IFx1MDBlMCBsYSBwYWdlIFdTREwuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3MEUgTGUgV1NETCAlMSBuJ2EgcGFzIHB1IFx1MDBlYXRyZSBjaGFyZ1x1MDBlOS4KLQotIyBSZW1vdmVGYXZvcml0ZUFjdGlvbgotQUxUX1JFTU9WRV9GQVZPUklURT1TdXBwcmltZXIgdW4gZmF2b3JpCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSBuZSBwZXV0IHBsdXMgXHUwMGVhdHJlIHJcdTAwZTlzb2x1LiAgVm91bGV6LXZvdXMgbCdlZmZhY2VyID8KLQotIyBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbgotQUxUX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9UmVzdGF1cmVyIGxlcyBmYXZvcmlzIHBhciBkXHUwMGU5ZmF1dAotTVNHX0NPTkZJUk1fUkVTVE9SRV9ERUZBVUxUX0ZBVk9SSVRFUz1DZXR0ZSBvcFx1MDBlOXJhdGlvbiB2YSByZW1wbGFjZXIgbGVzIGZhdm9yaXMgZW4gY291cnMuICBWb3VsZXotdm91cyBjb250aW51ZXIgPwotTVNHX0VSUk9SX09QRU5fRkFWT1JJVEVTX0JBQ0tVUD1JV0FCMDEzNEUgSW1wb3NzaWJsZSBkZSBjaGFyZ2VyIGxlcyBmYXZvcmlzIHBhciBkXHUwMGU5ZmF1dC4KLU1TR19JTkZPX0ZBVk9SSVRFU19SRVNUT1JFRF9UT19ERUZBVUxUPUlXQUIwMzIySSBMZXMgZmF2b3JpcyBwYXIgZFx1MDBlOWZhdXQgc29udCByZXN0YXVyXHUwMGU5cy4KLU1TR19FUlJPUl9TQVZFX0ZBVk9SSVRFU19XU0lMPUlXQUIwMTg2RSBJbXBvc3NpYmxlIGRlIHNhdXZlZ2FyZGVyIGxlcyBmYXZvcmlzIGRhbnMgJTEuCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPU5hdmlnYXRldXIgLSBDb250ZW5ldXIKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPU5hdmlnYXRldXIgLSBCYXJyZSBkJ291dGlscwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9TmF2aWdhdGV1ciAtIENvbnRlbnUKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPUNvbnRlbmV1ciBkJ2FjdGlvbnMKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPUNvbnRlbmV1ciBkZSBwcm9wcmlcdTAwZTl0XHUwMGU5cwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPUNvbnRlbnUgZGVzIHByb3ByaVx1MDBlOXRcdTAwZTlzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9QmFycmUgZCdvdXRpbHMgZGVzIHByb3ByaVx1MDBlOXRcdTAwZTlzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPUNvbnRlbmV1ciBkZSBzdGF0dXRzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZW51IGRlcyBzdGF0dXRzCi1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1CYXJyZSBkJ291dGlscyBkZXMgc3RhdHV0cwotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX1VERElfQlVTSU5FU1NfREVUQUlMUz1Gb3JtdWxhaXJlIEluZm9ybWF0aW9ucyBzdXIgbGUgbVx1MDBlOXRpZXIgVURESQotRk9STV9USVRMRV9VRERJX1JFR0lTVFJZX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIHJlZ2lzdHJlIFVEREkKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIHNlcnZpY2UgVURESQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGwnaW50ZXJmYWNlIGRlIHNlcnZpY2UgVURESQotRk9STV9USVRMRV9XU0RMX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIGZpY2hpZXIgV1NETAotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIGZpY2hpZXIgV1NJTAotCi0jIFZpZXcgdGl0bGVzCi1WSUVXX1RJVExFX1VERElfQlVTSU5FU1NfTElTVD1WdWUgTGlzdGUgZGVzIG1cdTAwZTl0aWVycyBVRERJCi1WSUVXX1RJVExFX1VERElfUkVHSVNUUllfTElTVD1WdWUgTGlzdGUgZGVzIHJlZ2lzdHJlcyBVRERJCi1WSUVXX1RJVExFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTElTVD1WdWUgTGlzdGUgZGVzIGludGVyZmFjZXMgZGUgc2VydmljZSBVRERJCi1WSUVXX1RJVExFX1VERElfU0VSVklDRV9MSVNUPVZ1ZSBMaXN0ZSBkZXMgc2VydmljZXMgVURESQotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VfTElTVD1WdWUgTGlzdGUgZGVzIHNlcnZpY2VzIFdTREwKLVZJRVdfVElUTEVfV1NJTF9MSVNUPVZ1ZSBMaXN0ZSBkZXMgbGllbnMgV1NJTApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX2l0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjNWViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1QcmVmZXJpdGkKLQotIyBOYXZpZ2F0b3IKLUZBVk9SSVRFU19NQUlOX05PREU9UHJlZmVyaXRpIHByaW5jaXBhbGkKLUZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFPVdTSUwgcHJlZmVyaXRpCi1GQVZPUklURVNfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFPVNlcnZpemkgV1NETCBwcmVmZXJpdGkKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfRk9MREVSX05PREU9U2Vydml6aSBVRERJIHByZWZlcml0aQotRkFWT1JJVEVTX1VERElfQlVTSU5FU1NFU19GT0xERVJfTk9ERT1CdXNpbmVzcyBVRERJIHByZWZlcml0aQotRkFWT1JJVEVTX1VERElfU0VSVklDRV9JTlRFUkZBQ0VTX0ZPTERFUl9OT0RFPUludGVyZmFjY2UgZGkgc2Vydml6aW8gVURESSBwcmVmZXJpdGUKLUZBVk9SSVRFU19VRERJX1JFR0lTVFJJRVNfRk9MREVSX05PREU9UmVnaXN0cmkgVURESSBwcmVmZXJpdGkKLQotIyBGb3JtCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1dTSUw9V1NJTCBwcmVmZXJpdGkKLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NETD1XU0RMIHByZWZlcml0aQotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1JFR0lTVFJZPVJlZ2lzdHJpIFVEREkgcHJlZmVyaXRpCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRT1TZXJ2aXppIFVEREkgcHJlZmVyaXRpCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfQlVTSU5FU1M9RW50aXRcdTAwZTAgYnVzaW5lc3MgVURESSBwcmVmZXJpdGUKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1JbnRlcmZhY2NlIGRpIHNlcnZpemlvIFVEREkgcHJlZmVyaXRlCi1GT1JNX0xBQkVMX1JFTU9WRT1SaW11b3ZpCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFPUFnZ2l1bmdpIGFsbGEgcGFnaW5hIFdTSUwKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkU9QWdnaXVuZ2kgYWxsYSBwYWdpbmEgVURESQotRk9STV9MQUJFTF9JTVBPUlRfVE9fV1NETF9QRVJTUEVDVElWRT1BZ2dpdW5naSBhbGxhIHBhZ2luYSBXU0RMCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9RWxlbWVudG8gbi4KLUZPUk1fTEFCRUxfTkFNRT1Ob21lCi1GT1JNX0xBQkVMX0lOUVVJUllfVVJMPVVSTCBkaSByaWNoaWVzdGEKLUZPUk1fTEFCRUxfUFVCTElTSF9VUkw9VVJMIGRpIHB1YmJsaWNhemlvbmUKLUZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRT1Ob21lIHJlZ2lzdHJvCi1GT1JNX0xBQkVMX0JVU0lORVNTX05BTUU9Tm9tZSBidXNpbmVzcwotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9Q2hpYXZlIGJ1c2luZXNzCi1GT1JNX0xBQkVMX1NFUlZJQ0VfTkFNRT1Ob21lIHNlcnZpemlvCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPUNoaWF2ZSBzZXJ2aXppbwotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FPU5vbWUgaW50ZXJmYWNjaWEgZGkgc2Vydml6aW8KLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfS0VZPUNoaWF2ZSBpbnRlcmZhY2NpYSBkaSBzZXJ2aXppbwotRk9STV9MQUJFTF9SRUdJU1RSWV9VUkw9PGEgaHJlZj0iJTEiIHRhcmdldD0iX2JsYW5rIj5GYXJlIGNsaWMgcXVpPC9hPiBwZXIgdmlzdWFsaXp6YXJlIHVuIElEIHV0ZW50ZSBlIHVuYSBwYXNzd29yZCBwZXIgcXVlc3RvIHJlZ2lzdHJvLgotRk9STV9MQUJFTF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFUz1GaWxlIGRpIGRhdGkgcGVyIGxlIGNhdGVnb3JpZSBkZWZpbml0ZSBkYWxsJ3V0ZW50ZQotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMTVFIFNlbGV6aW9uYXJlIGFsbWVubyB1biBlbGVtZW50by4KLQotIyBMaXN0RmF2b3JpdGVXU0lMQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9XU0lMPVZpc3VhbGl6emEgV1NJTCBwcmVmZXJpdGkKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0lMX0RFU0M9U2VsZXppb25hcmUgdW4gaW5zaWVtZSBkaSBjb2xsZWdhbWVudGkgV1NJTCBwcmVmZXJpdGkgZSBwcmVtZXJlIDxzdHJvbmc+QWdnaXVuZ2kgYWxsYSBwYWdpbmEgV1NJTDwvc3Ryb25nPiBwZXIgYXByaXJlIGkgY29sbGVnYW1lbnRpIG5lbCBwYW5uZWxsbyBkaSBzZWxlemlvbmUgV1NJTC4gUHJlbWVyZSA8c3Ryb25nPlJpbXVvdmk8L3N0cm9uZz4gcGVyIHJpbXVvdmVyZSBsZSBzZWxlemlvbmkuCi0KLSMgTGlzdEZhdm9yaXRlV1NETFNlcnZpY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1dTRExfU0VSVklDRT1WaXN1YWxpenphIHNlcnZpemkgV1NETCBwcmVmZXJpdGkKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0VfREVTQz1TZWxlemlvbmFyZSB1biBpbnNpZW1lIGRpIHNlcnZpemkgV1NETCBwcmVmZXJpdGkgZSBwcmVtZXJlIDxzdHJvbmc+UmltdW92aTwvc3Ryb25nPiBwZXIgcmltdW92ZXJlIGkgc2Vydml6aS4KLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFPVZpc3VhbGl6emEgc2Vydml6aSBVRERJIHByZWZlcml0aQotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9ERVNDPVNlbGV6aW9uYXJlIHVuIGluc2llbWUgZGkgc2Vydml6aSBVRERJIHByZWZlcml0aSBlIHByZW1lcmUgPHN0cm9uZz5BZ2dpdW5naSBhbGxhIHBhZ2luYSBVRERJPC9zdHJvbmc+IHBlciBhcHJpcmUgaSBzZXJ2aXppIG5lbCBwYW5uZWxsbyBkaSBzZWxlemlvbmUgVURESS4gUHJlbWVyZSA8c3Ryb25nPlJpbXVvdmk8L3N0cm9uZz4gcGVyIHJpbXVvdmVyZSBsZSBzZWxlemlvbmkuCi0KLSMgTGlzdEZhdm9yaXRlVURESUJ1c2luZXNzQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX0JVU0lORVNTPVZpc3VhbGl6emEgYnVzaW5lc3MgVURESSBwcmVmZXJpdGkKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX0JVU0lORVNTX0RFU0M9U2VsZXppb25hcmUgdW4gaW5zaWVtZSBkaSBidXNpbmVzcyBVRERJIHByZWZlcml0aSBlIHByZW1lcmUgPHN0cm9uZz5BZ2dpdW5naSBhbGxhIHBhZ2luYSBVRERJPC9zdHJvbmc+IHBlciBhcHJpcmUgaSBidXNpbmVzcyBuZWwgcGFubmVsbG8gZGkgc2VsZXppb25lIFVEREkuIFByZW1lcmUgPHN0cm9uZz5SaW11b3ZpPC9zdHJvbmc+IHBlciByaW11b3ZlcmUgbGUgc2VsZXppb25pLgotCi0jIExpc3RGYXZvcml0ZVVERElSZWdpc3RyeUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWT1WaXN1YWxpenphIHJlZ2lzdHJpIFVEREkgcHJlZmVyaXRpCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWV9ERVNDPVNlbGV6aW9uYXJlIHVuIGluc2llbWUgZGkgcmVnaXN0cmkgVURESSBwcmVmZXJpdGkgZSBwcmVtZXJlIDxzdHJvbmc+QWdnaXVuZ2kgYWxsYSBwYWdpbmEgVURESTwvc3Ryb25nPiBwZXIgYXByaXJlIGkgcmVnaXN0cmkgbmVsIHBhbm5lbGxvIGRpIHNlbGV6aW9uZSBVRERJLiBQcmVtZXJlIDxzdHJvbmc+UmltdW92aTwvc3Ryb25nPiBwZXIgcmltdW92ZXJlIGxlIHNlbGV6aW9uaS4KLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1WaXN1YWxpenphIGludGVyZmFjY2UgZGkgc2Vydml6aW8gVURESSBwcmVmZXJpdGUKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0M9U2VsZXppb25hcmUgdW4gaW5zaWVtZSBkaSBpbnRlcmZhY2NlIGRpIHNlcnZpemlvIFVEREkgcHJlZmVyaXRlIGUgcHJlbWVyZSA8c3Ryb25nPkFnZ2l1bmdpIGFsbGEgcGFnaW5hIFVEREk8L3N0cm9uZz4gcGVyIGFwcmlyZSBsZSBpbnRlcmZhY2NlIG5lbCBwYW5uZWxsbyBkaSBzZWxlemlvbmUgVURESS4gUHJlbWVyZSA8c3Ryb25nPlJpbXVvdmk8L3N0cm9uZz4gcGVyIHJpbXVvdmVyZSBsZSBzZWxlemlvbmkuCi0KLSMgRmF2b3JpdGVzV1NJTERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NJTF9ERVRBSUxTPURldHRhZ2xpIFdTSUwgcHJlZmVyaXRpCi0KLSMgRmF2b3JpdGVzV1NETERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NETF9ERVRBSUxTPURldHRhZ2xpIFdTREwgcHJlZmVyaXRpCi0KLSMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1JFR0lTVFJZX0RFVEFJTFM9RGV0dGFnbGkgcmVnaXN0cmkgVURESSBwcmVmZXJpdGkKLQotIyBGYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfQlVTSU5FU1NfREVUQUlMUz1EZXR0YWdsaSBidXNpbmVzcyBVRERJIHByZWZlcml0aQotCi0jIEZhdm9yaXRlc1VERElTZXJ2aWNlRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfREVUQUlMUz1EZXR0YWdsaSBzZXJ2aXppIFVEREkgcHJlZmVyaXRpCi0KLSMgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1EZXR0YWdsaSBpbnRlcmZhY2NlIGRpIHNlcnZpemlvIFVEREkgcHJlZmVyaXRlCi0KLSMgQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRT1BZ2dpdW5naSBhbGxhIHBhZ2luYSBXU0lMCi1NU0dfRVJST1JfV1NJTF9BTFJFQURZX09QRU5FRD1JV0FCMDMxNkUgJTEgXHUwMGU4IGdpXHUwMGUwIGFwZXJ0byBuZWxsYSBwYWdpbmEgV1NJTC4KLU1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMxN0kgJTEgdmllbmUgYWdnaXVudG8gYWxsYSBwYWdpbmEgV1NJTC4KLU1TR19FUlJPUl9BRERfV1NJTF9UT19XU0lMX1BFUlNQRUNUSVZFPUlXQUIwMzE4RSBcdTAwYzggcG9zc2liaWxlIGNoZSBXU0lMICUxIG5vbiBzaWEgc3RhdG8gY2FyaWNhdG8uCi0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1BZ2dpdW5naSBhbGxhIHBhZ2luYSBVRERJCi1NU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9SVdBQjAzMjBFIFx1MDBjOCBwb3NzaWJpbGUgY2hlICUxIG5vbiBzaWEgc3RhdG8gdHJvdmF0byBuZWwgcmVnaXN0cm8uCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzIxSSAlMSB2aWVuZSBhZ2dpdW50byBhbGxhIHBhZ2luYSBVRERJLgotCi0jIEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1BZ2dpdW5naSBhbGxhIHBhZ2luYSBXU0RMCi1NU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzNjlJICUxIHZpZW5lIGFnZ2l1bnRvIGFsbGEgcGFnaW5hIFdTREwuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3MEUgXHUwMGM4IHBvc3NpYmlsZSBjaGUgV1NETCAlMSBub24gc2lhIHN0YXRvIGNhcmljYXRvLgotCi0jIFJlbW92ZUZhdm9yaXRlQWN0aW9uCi1BTFRfUkVNT1ZFX0ZBVk9SSVRFPVJpbXVvdmkgcHJlZmVyaXRpCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSBub24gXHUwMGU4IHBpXHUwMGY5IHJpc29sdmliaWxlLiAgQ2FuY2VsbGFybG8/Ci0KLSMgRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24KLUFMVF9SRVNUT1JFX0RFRkFVTFRfRkFWT1JJVEVTPVJpcHJpc3RpbmEgcHJlZmVyaXRpIHByZWRlZmluaXRpCi1NU0dfQ09ORklSTV9SRVNUT1JFX0RFRkFVTFRfRkFWT1JJVEVTPVF1ZXN0YSBvcGVyYXppb25lIHNvdnJhc2NyaXZlclx1MDBlMCBpIHByZWZlcml0aSBjb3JyZW50aS4gIENvbnRpbnVhcmU/Ci1NU0dfRVJST1JfT1BFTl9GQVZPUklURVNfQkFDS1VQPUlXQUIwMTM0RSBJbXBvc3NpYmlsZSBjYXJpY2FyZSBpIHByZWZlcml0aSBwcmVkZWZpbml0aS4KLU1TR19JTkZPX0ZBVk9SSVRFU19SRVNUT1JFRF9UT19ERUZBVUxUPUlXQUIwMzIySSBJIHByZWZlcml0aSBwcmVkZWZpbml0aSB2ZW5nb25vIHJpcHJpc3RpbmF0aS4KLU1TR19FUlJPUl9TQVZFX0ZBVk9SSVRFU19XU0lMPUlXQUIwMTg2RSBJbXBvc3NpYmlsZSBzYWx2YXJlIGkgcHJlZmVyaXRpIHN1ICUxLgotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1Db250ZW5pdG9yZSBTZWxlemlvbmUKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPUJhcnJhIGRlZ2xpIHN0cnVtZW50aSBTZWxlemlvbmUKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPUNvbnRlbnV0byBTZWxlemlvbmUKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPUNvbnRlbml0b3JlIGF6aW9uaQotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9Q29udGVuaXRvcmUgcHJvcHJpZXRcdTAwZTAKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1Db250ZW51dG8gcHJvcHJpZXRcdTAwZTAKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1CYXJyYSBkZWdsaSBzdHJ1bWVudGkgcHJvcHJpZXRcdTAwZTAKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9Q29udGVuaXRvcmUgc3RhdG8KLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPUNvbnRlbnV0byBzdGF0bwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIHN0YXRvCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPU1vZHVsbyBkZXR0YWdsaSBidXNpbmVzcyBVRERJCi1GT1JNX1RJVExFX1VERElfUkVHSVNUUllfREVUQUlMUz1Nb2R1bG8gZGV0dGFnbGkgcmVnaXN0cm8gVURESQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfREVUQUlMUz1Nb2R1bG8gZGV0dGFnbGkgc2Vydml6aW8gVURESQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9TW9kdWxvIGRldHRhZ2xpIGludGVyZmFjY2lhIGRpIHNlcnZpemlvIFVEREkKLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPU1vZHVsbyBkZXR0YWdsaSBXU0RMCi1GT1JNX1RJVExFX1dTSUxfREVUQUlMUz1Nb2R1bG8gZGV0dGFnbGkgV1NJTAotCi0jIFZpZXcgdGl0bGVzCi1WSUVXX1RJVExFX1VERElfQlVTSU5FU1NfTElTVD1WaXN0YSBFbGVuY28gYnVzaW5lc3MgVURESQotVklFV19USVRMRV9VRERJX1JFR0lTVFJZX0xJU1Q9VmlzdGEgRWxlbmNvIHJlZ2lzdHJpIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9MSVNUPVZpc3RhIEVsZW5jbyBpbnRlcmZhY2NlIGRpIHNlcnZpemlvIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0xJU1Q9VmlzdGEgRWxlbmNvIHNlcnZpemkgVURESQotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VfTElTVD1WaXN0YSBFbGVuY28gc2Vydml6aSBXU0RMCi1WSUVXX1RJVExFX1dTSUxfTElTVD1WaXN0YSBFbGVuY28gY29sbGVnYW1lbnRpIFdTSUwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlc19qYS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX2phLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OGViNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhCi0KLSMgTmF2aWdhdG9yCi1GQVZPUklURVNfTUFJTl9OT0RFPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZVx1MzBlMVx1MzBhNFx1MzBmMwotRkFWT1JJVEVTX1dTSUxfRk9MREVSX05PREU9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFdTSUwKLUZBVk9SSVRFU19XU0RMX1NFUlZJQ0VfRk9MREVSX05PREU9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFdTREwgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5Ci1GQVZPUklURVNfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOQotRkFWT1JJVEVTX1VERElfQlVTSU5FU1NFU19GT0xERVJfTk9ERT1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmUgVURESSBcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjkKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERT1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmUgVURESSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjkKLUZBVk9SSVRFU19VRERJX1JFR0lTVFJJRVNfRk9MREVSX05PREU9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFVEREkgXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjCi0KLSMgRm9ybQotRk9STV9MQUJFTF9GQVZPUklURV9XU0lMPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBXU0lMCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1dTREw9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFdTREwKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9SRUdJU1RSWT1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmUgVURESSBcdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmMKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9TRVJWSUNFPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOQotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX0JVU0lORVNTPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzBmYlx1MzBhOFx1MzBmM1x1MzBjNlx1MzBhM1x1MzBjNlx1MzBhM1x1MzBmYwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOQotRk9STV9MQUJFTF9SRU1PVkU9XHU5NjY0XHU1M2JiCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFPVdTSUwgXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU4ZmZkXHU1MmEwCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19VRERJX1BFUlNQRUNUSVZFPVVEREkgXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU4ZmZkXHU1MmEwCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0RMX1BFUlNQRUNUSVZFPVdTREwgXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU4ZmZkXHU1MmEwCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9XHU5ODA1XHU3NmVlXHU3NTZhXHU1M2Y3Ci1GT1JNX0xBQkVMX05BTUU9XHU1NDBkXHU1MjRkCi1GT1JNX0xBQkVMX0lOUVVJUllfVVJMPVx1NzE2N1x1NGYxYSBVUkwKLUZPUk1fTEFCRUxfUFVCTElTSF9VUkw9XHU1MTZjXHU5NThiIFVSTAotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPVx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1NTQwZAotRk9STV9MQUJFTF9CVVNJTkVTU19OQU1FPVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1NTQwZAotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMGZiXHUzMGFkXHUzMGZjCi1GT1JNX0xBQkVMX1NFUlZJQ0VfTkFNRT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTU0MGQKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGFkXHUzMGZjCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX05BTUU9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHU1NDBkCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX0tFWT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjlcdTMwZmJcdTMwYWRcdTMwZmMKLUZPUk1fTEFCRUxfUkVHSVNUUllfVVJMPTxhIGhyZWY9IiUxIiB0YXJnZXQ9Il9ibGFuayI+XHUzMDUzXHUzMDUzXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDAxPC9hPlx1MzA1M1x1MzA2ZVx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBmYyBJRCBcdTMwNGFcdTMwODhcdTMwNzNcdTMwZDFcdTMwYjlcdTMwZWZcdTMwZmNcdTMwYzlcdTMwOTJcdTUzZDZcdTVmOTdcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRVM9XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjXHU1YjlhXHU3ZmE5XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDZlXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViCi1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDMxNUUgXHU1YzExXHUzMDZhXHUzMDRmXHUzMDY4XHUzMDgyIDEgXHUzMDY0XHUzMDZlXHU5ODA1XHU3NmVlXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi0KLSMgTGlzdEZhdm9yaXRlV1NJTEFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NJTD1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmUgV1NJTCBcdTMwOTJcdTMwZWFcdTMwYjlcdTMwYzgKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0lMX0RFU0M9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFdTSUwgXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDZlXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDAxXHUzMDBjPHN0cm9uZz5XU0lMIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1OGZmZFx1NTJhMDwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1NjJiY1x1MzA1N1x1MzA2NiBXU0lMIFx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzA2N1x1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGM8c3Ryb25nPlx1OTY2NFx1NTNiYjwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1NjJiY1x1MzA1N1x1MzA2Nlx1OTA3OFx1NjI5ZVx1MzA5Mlx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotCi0jIExpc3RGYXZvcml0ZVdTRExTZXJ2aWNlQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0U9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFdTREwgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDkyXHUzMGVhXHUzMGI5XHUzMGM4Ci1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFX0RFU0M9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFdTREwgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDAxXHUzMDBjPHN0cm9uZz5cdTk2NjRcdTUzYmI8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjZcdTMwNWRcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA5Mlx1MzBlYVx1MzBiOVx1MzBjOAotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9ERVNDPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1MzBiYlx1MzBjM1x1MzBjOFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzAwMVx1MzAwYzxzdHJvbmc+VURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTA8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjYgVURESSBcdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwNjdcdTk1OGJcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjPHN0cm9uZz5cdTk2NjRcdTUzYmI8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjZcdTkwNzhcdTYyOWVcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1M9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFVEREkgXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDkyXHUzMGVhXHUzMGI5XHUzMGM4Ci1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTU19ERVNDPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA2ZVx1MzBiYlx1MzBjM1x1MzBjOFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzAwMVx1MzAwYzxzdHJvbmc+VURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTA8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjYgVURESSBcdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwNjdcdTk1OGJcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjPHN0cm9uZz5cdTk2NjRcdTUzYmI8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjZcdTkwNzhcdTYyOWVcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVVRERJUmVnaXN0cnlBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUlk9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFVEREkgXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHUzMGVhXHUzMGI5XHUzMGM4Ci1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWV9ERVNDPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBiYlx1MzBjM1x1MzBjOFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzAwMVx1MzAwYzxzdHJvbmc+VURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTA8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjYgVURESSBcdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwNjdcdTk1OGJcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjPHN0cm9uZz5cdTk2NjRcdTUzYmI8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjZcdTkwNzhcdTYyOWVcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmUgVURESSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjlcdTMwOTJcdTMwZWFcdTMwYjlcdTMwYzgKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0M9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFVEREkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHUzMDZlXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDAxXHUzMDBjPHN0cm9uZz5VRERJIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1OGZmZFx1NTJhMDwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1NjJiY1x1MzA1N1x1MzA2NiBVRERJIFx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzA2N1x1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGM8c3Ryb25nPlx1OTY2NFx1NTNiYjwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1NjJiY1x1MzA1N1x1MzA2Nlx1OTA3OFx1NjI5ZVx1MzA5Mlx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotCi0jIEZhdm9yaXRlc1dTSUxEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1dTSUxfREVUQUlMUz1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmUgV1NJTCBcdTMwNmVcdThhNzNcdTdkMzAKLQotIyBGYXZvcml0ZXNXU0RMRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19XU0RMX0RFVEFJTFM9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFdTREwgXHUzMDZlXHU4YTczXHU3ZDMwCi0KLSMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1JFR0lTVFJZX0RFVEFJTFM9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFVEREkgXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDZlXHU4YTczXHU3ZDMwCi0KLSMgRmF2b3JpdGVzVURESUJ1c2luZXNzRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX0JVU0lORVNTX0RFVEFJTFM9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFVEREkgXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHU4YTczXHU3ZDMwCi0KLSMgRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfU0VSVklDRV9ERVRBSUxTPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZSBVRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1OGE3M1x1N2QzMAotCi0jIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlIFVEREkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHUzMDZlXHU4YTczXHU3ZDMwCi0KLSMgQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRT1XU0lMIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1OGZmZFx1NTJhMAotTVNHX0VSUk9SX1dTSUxfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMTZFICUxIFx1MzA2ZiBXU0lMIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2N1x1MzA1OVx1MzA2N1x1MzA2Ylx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMgotTVNHX0lORk9fQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzE3SSAlMSBcdTMwNGMgV1NJTCBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19FUlJPUl9BRERfV1NJTF9UT19XU0lMX1BFUlNQRUNUSVZFPUlXQUIwMzE4RSBXU0lMICUxIFx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMgotCi0jIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9VURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTAKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMyMEUgJTEgXHUzMDRjXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDY3XHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzIxSSAlMSBcdTMwNGMgVURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIKLQotIyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTAKLU1TR19JTkZPX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDM2OUkgJTEgXHUzMDRjIFdTREwgXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3MEUgV1NETCAlMSBcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIKLQotIyBSZW1vdmVGYXZvcml0ZUFjdGlvbgotQUxUX1JFTU9WRV9GQVZPUklURT1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmVcdTk2NjRcdTUzYmIKLU1TR19DT05GSVJNX1JFTU9WRV9OT0RFPSUxIFx1MzA2Zlx1ODllM1x1NmM3YVx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0Zlx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiAgXHUzMGFmXHUzMGVhXHUzMGEyXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPwotCi0jIEZhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uCi1BTFRfUkVTVE9SRV9ERUZBVUxUX0ZBVk9SSVRFUz1cdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmVcdTVmYTlcdTUxNDMKLU1TR19DT05GSVJNX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9XHUzMDUzXHUzMDZlXHU2NGNkXHU0ZjVjXHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHU3M2ZlXHU1NzI4XHUzMDZlXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDRjXHU0ZTBhXHU2NmY4XHUzMDRkXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyICBcdTdkOWFcdTMwNTFcdTMwN2VcdTMwNTlcdTMwNGI/Ci1NU0dfRVJST1JfT1BFTl9GQVZPUklURVNfQkFDS1VQPUlXQUIwMTM0RSBcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKLU1TR19JTkZPX0ZBVk9SSVRFU19SRVNUT1JFRF9UT19ERUZBVUxUPUlXQUIwMzIySSBcdTMwYzdcdTMwZDVcdTMwYTlcdTMwZWJcdTMwYzhcdTMwNmVcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNGNcdTVmYTlcdTUxNDNcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19FUlJPUl9TQVZFX0ZBVk9SSVRFU19XU0lMPUlXQUIwMTg2RSAlMSBcdTMwNmJcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwOTJcdTRmZGRcdTdiYTFcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9XHUzMGNhXHUzMGQzXHUzMGIyXHUzMGZjXHUzMGJmXHUzMGZjXHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMGZjCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1cdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwZmJcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZDBcdTMwZmMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPVx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNAotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9XHUzMGEyXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMGZjCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1cdTMwZDdcdTMwZWRcdTMwZDFcdTMwYzZcdTMwYTNcdTMwZmNcdTMwZmJcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZDBcdTMwZmMKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9XHU3MmI2XHU2Y2MxXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMGZjCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1cdTcyYjZcdTZjYzFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVx1NzJiNlx1NmNjMVx1MzBjNFx1MzBmY1x1MzBlYlx1MzBkMFx1MzBmYwotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX1VERElfQlVTSU5FU1NfREVUQUlMUz1VRERJIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1OGE3M1x1N2QzMFx1MzBkNVx1MzBhOVx1MzBmY1x1MzBlMAotRk9STV9USVRMRV9VRERJX1JFR0lTVFJZX0RFVEFJTFM9VURESSBcdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdThhNzNcdTdkMzBcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTAKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9VURESSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdThhNzNcdTdkMzBcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTAKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPVVEREkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHU4YTczXHU3ZDMwXHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGUwCi1GT1JNX1RJVExFX1dTRExfREVUQUlMUz1XU0RMIFx1OGE3M1x1N2QzMFx1MzBkNVx1MzBhOVx1MzBmY1x1MzBlMAotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9V1NJTCBcdThhNzNcdTdkMzBcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZTAKLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTX0xJU1Q9VURESSBcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwZmJcdTMwZWFcdTMwYjlcdTMwYzhcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmMKLVZJRVdfVElUTEVfVURESV9SRUdJU1RSWV9MSVNUPVVEREkgXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGVhXHUzMGI5XHUzMGM4XHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjCi1WSUVXX1RJVExFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTElTVD1VRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOVx1MzBmYlx1MzBlYVx1MzBiOVx1MzBjOFx1MzBmYlx1MzBkM1x1MzBlNVx1MzBmYwotVklFV19USVRMRV9VRERJX1NFUlZJQ0VfTElTVD1VRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBlYVx1MzBiOVx1MzBjOFx1MzBmYlx1MzBkM1x1MzBlNVx1MzBmYwotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VfTElTVD1XU0RMIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBlYVx1MzBiOVx1MzBjOFx1MzBmYlx1MzBkM1x1MzBlNVx1MzBmYwotVklFV19USVRMRV9XU0lMX0xJU1Q9V1NJTCBcdTMwZWFcdTMwZjNcdTMwYWZcdTMwZmJcdTMwZWFcdTMwYjlcdTMwYzhcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlc19rby5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODAxZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwCi0KLSMgTmF2aWdhdG9yCi1GQVZPUklURVNfTUFJTl9OT0RFPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBcdWFlMzBcdWJjZjgKLUZBVk9SSVRFU19XU0lMX0ZPTERFUl9OT0RFPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBXU0lMCi1GQVZPUklURVNfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBXU0RMIFx1YzExY1x1YmU0NFx1YzJhNAotRkFWT1JJVEVTX1VERElfU0VSVklDRV9GT0xERVJfTk9ERT1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgVURESSBcdWMxMWNcdWJlNDRcdWMyYTQKLUZBVk9SSVRFU19VRERJX0JVU0lORVNTRVNfRk9MREVSX05PREU9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0Ci1GQVZPUklURVNfVURESV9TRVJWSUNFX0lOVEVSRkFDRVNfRk9MREVSX05PREU9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFVEREkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNAotRkFWT1JJVEVTX1VERElfUkVHSVNUUklFU19GT0xERVJfTk9ERT1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgVURESSBcdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWMKLQotIyBGb3JtCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1dTSUw9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFdTSUwKLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NETD1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgV1NETAotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1JFR0lTVFJZPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBVRERJIFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhYwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0U9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFVEREkgXHVjMTFjXHViZTQ0XHVjMmE0Ci1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfQlVTSU5FU1M9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YzVkNFx1ZDJmMFx1ZDJmMAotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBVRERJIFx1YzExY1x1YmU0NFx1YzJhNCBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTQKLUZPUk1fTEFCRUxfUkVNT1ZFPVx1YzgxY1x1YWM3MAotRk9STV9MQUJFTF9JTVBPUlRfVE9fV1NJTF9QRVJTUEVDVElWRT1XU0lMIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDAKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkU9VURESSBcdWQzOThcdWM3NzRcdWM5YzBcdWM1ZDAgXHVjZDk0XHVhYzAwCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0RMX1BFUlNQRUNUSVZFPVdTREwgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMAotRk9STV9MQUJFTF9VUkw9VVJMCi1GT1JNX0xBQkVMX0lURU1fTlVNQkVSPVx1ZDU2ZFx1YmFhOSAjCi1GT1JNX0xBQkVMX05BTUU9XHVjNzc0XHViOTg0Ci1GT1JNX0xBQkVMX0lOUVVJUllfVVJMPVx1Yzg3MFx1ZDY4YyBVUkwKLUZPUk1fTEFCRUxfUFVCTElTSF9VUkw9XHVhY2Y1XHVhYzFjIFVSTAotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPVx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhYyBcdWM3NzRcdWI5ODQKLUZPUk1fTEFCRUxfQlVTSU5FU1NfTkFNRT1cdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHVjNzc0XHViOTg0Ci1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1cdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHVkMGE0Ci1GT1JNX0xBQkVMX1NFUlZJQ0VfTkFNRT1cdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc0XHViOTg0Ci1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPVx1YzExY1x1YmU0NFx1YzJhNCBcdWQwYTQKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRT1cdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0IFx1Yzc3NFx1Yjk4NAotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVk9XHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNCBcdWQwYTQKLUZPUk1fTEFCRUxfUkVHSVNUUllfVVJMPVx1Yzc3NCBcdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWNcdWM3NTggXHVjMGFjXHVjNmE5XHVjNzkwIElEIFx1YmMwZiBcdWM1NTRcdWQ2MzhcdWI5N2MgXHVjNWJiXHVjNzNjXHViODI0XHViYTc0IDxhIGhyZWY9IiUxIiB0YXJnZXQ9Il9ibGFuayI+XHVjNWVjXHVhZTMwXHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNDwvYT4uCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVTPVx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVjNzU4IFx1YjM3MFx1Yzc3NFx1ZDEzMCBcdWQzMGNcdWM3N2MKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzE1RSBcdWNkNWNcdWMxOGNcdWQ1NWMgXHVkNTU4XHViMDk4XHVjNzU4IFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi0KLSMgTGlzdEZhdm9yaXRlV1NJTEFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NJTD1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgV1NJTCBcdWIwOThcdWM1ZjQKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0lMX0RFU0M9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFdTSUwgXHViOWMxXHVkMDZjIFx1YzEzOFx1ZDJiOFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgPHN0cm9uZz5XU0lMIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDA8L3N0cm9uZz5cdWI5N2MgXHViMjBjXHViN2VjIFdTSUwgXHViMTI0XHViZTQ0XHVhYzhjXHVjNzc0XHVkMTMwXHVjNWQwXHVjMTFjIFx1YzVlY1x1YzJlZFx1YzJkY1x1YzYyNC4gXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YzgxY1x1YWM3MFx1ZDU1OFx1YjgyNFx1YmE3NCA8c3Ryb25nPlx1YzgxY1x1YWM3MDwvc3Ryb25nPlx1Yjk3YyBcdWIyMDRcdWI5NzRcdWMyZWRcdWMyZGNcdWM2MjQuCi0KLSMgTGlzdEZhdm9yaXRlV1NETFNlcnZpY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1dTRExfU0VSVklDRT1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgV1NETCBcdWMxMWNcdWJlNDRcdWMyYTQgXHViMDk4XHVjNWY0Ci1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFX0RFU0M9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFdTREwgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YzEzOFx1ZDJiOFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgPHN0cm9uZz5cdWM4MWNcdWFjNzA8L3N0cm9uZz5cdWI5N2MgXHViMjBjXHViN2VjIFx1YzgxY1x1YWM3MFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBVRERJIFx1YzExY1x1YmU0NFx1YzJhNCBcdWIwOThcdWM1ZjQKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfREVTQz1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgVURESSBcdWI5YzFcdWQwNmMgXHVjMTM4XHVkMmI4XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCA8c3Ryb25nPlVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMDwvc3Ryb25nPlx1Yjk3YyBcdWIyMGNcdWI3ZWMgVURESSBcdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzBcdWM1ZDBcdWMxMWMgXHVjNWVjXHVjMmVkXHVjMmRjXHVjNjI0LiBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmRcdWM3NDQgXHVjODFjXHVhYzcwXHVkNTU4XHViODI0XHViYTc0IDxzdHJvbmc+XHVjODFjXHVhYzcwPC9zdHJvbmc+XHViOTdjIFx1YjIwNFx1Yjk3NFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBMaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1M9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YjA5OFx1YzVmNAotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1NfREVTQz1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgVURESSBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHVjMTM4XHVkMmI4XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCA8c3Ryb25nPlVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMDwvc3Ryb25nPlx1Yjk3YyBcdWIyMGNcdWI3ZWMgVURESSBcdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzBcdWM1ZDBcdWMxMWMgXHVjNWVjXHVjMmVkXHVjMmRjXHVjNjI0LiBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmRcdWM3NDQgXHVjODFjXHVhYzcwXHVkNTU4XHViODI0XHViYTc0IDxzdHJvbmc+XHVjODFjXHVhYzcwPC9zdHJvbmc+XHViOTdjIFx1YjIwNFx1Yjk3NFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBMaXN0RmF2b3JpdGVVRERJUmVnaXN0cnlBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUlk9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFVEREkgXHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjIFx1YjA5OFx1YzVmNAotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUllfREVTQz1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgVURESSBcdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWMgXHVjMTM4XHVkMmI4XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCA8c3Ryb25nPlVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMDwvc3Ryb25nPlx1Yjk3YyBcdWIyMGNcdWI3ZWMgVURESSBcdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzBcdWM1ZDBcdWMxMWMgXHVjNWVjXHVjMmVkXHVjMmRjXHVjNjI0LiBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmRcdWM3NDQgXHVjODFjXHVhYzcwXHVkNTU4XHViODI0XHViYTc0IDxzdHJvbmc+XHVjODFjXHVhYzcwPC9zdHJvbmc+XHViOTdjIFx1YjIwNFx1Yjk3NFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgVURESSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0IFx1YjA5OFx1YzVmNAotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVTQz1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgVURESSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjMTM4XHVkMmI4XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCA8c3Ryb25nPlVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMDwvc3Ryb25nPlx1Yjk3YyBcdWIyMGNcdWI3ZWMgVURESSBcdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzBcdWM1ZDBcdWMxMWMgXHVjNWVjXHVjMmVkXHVjMmRjXHVjNjI0LiBcdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmRcdWM3NDQgXHVjODFjXHVhYzcwXHVkNTU4XHViODI0XHViYTc0IDxzdHJvbmc+XHVjODFjXHVhYzcwPC9zdHJvbmc+XHViOTdjIFx1YjIwNFx1Yjk3NFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBGYXZvcml0ZXNXU0lMRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19XU0lMX0RFVEFJTFM9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwIFdTSUwgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi0KLSMgRmF2b3JpdGVzV1NETERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NETF9ERVRBSUxTPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBXU0RMIFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZAotCi0jIEZhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9SRUdJU1RSWV9ERVRBSUxTPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBVRERJIFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhYyBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQKLQotIyBGYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfQlVTSU5FU1NfREVUQUlMUz1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgVURESSBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi0KLSMgRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfU0VSVklDRV9ERVRBSUxTPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBVRERJIFx1YzExY1x1YmU0NFx1YzJhNCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQKLQotIyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBVRERJIFx1YzExY1x1YmU0NFx1YzJhNCBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi0KLSMgQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRT1XU0lMIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDAKLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzE2RSAlMVx1Yzc3NChcdWFjMDApIFdTSUwgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Yzc3NFx1YmJmOCBcdWM1ZjRcdWI4MjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzE3SSAlMVx1Yzc3NChcdWFjMDApIFdTSUwgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9BRERfV1NJTF9UT19XU0lMX1BFUlNQRUNUSVZFPUlXQUIwMzE4RSBXU0lMICUxXHVjNzQ0KFx1Yjk3YykgXHViODVjXHViNGRjXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1VRERJIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDAKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMyMEUgJTFcdWM3NDQoXHViOTdjKSBcdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWNcdWM1ZDBcdWMxMWMgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzIxSSAlMVx1Yzc3NChcdWFjMDApIFVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLQotIyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdWQzOThcdWM3NzRcdWM5YzBcdWM1ZDAgXHVjZDk0XHVhYzAwCi1NU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzNjlJICUxXHVjNzc0KFx1YWMwMCkgV1NETCBcdWQzOThcdWM3NzRcdWM5YzBcdWM1ZDAgXHVjZDk0XHVhYzAwXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzBFIFdTREwgJTFcdWM3NDQoXHViOTdjKSBcdWI4NWNcdWI0ZGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLQotIyBSZW1vdmVGYXZvcml0ZUFjdGlvbgotQUxUX1JFTU9WRV9GQVZPUklURT1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgXHVjODFjXHVhYzcwCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMVx1Yzc0NChcdWI5N2MpIFx1YjM1NCBcdWM3NzRcdWMwYzEgXHVkNTc0XHVjMTFkXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzBhZFx1YzgxY1x1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8KLQotIyBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbgotQUxUX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9XHVhZTMwXHViY2Y4IFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBcdWJjZjVcdWM2ZDAKLU1TR19DT05GSVJNX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9XHVjNzc0IFx1Yzg3MFx1Yzc5MVx1Yzc0MCBcdWQ2MDRcdWM3YWMgXHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHViOTdjIFx1YWNiOVx1Y2NkMFx1YzUwMVx1YjJjOFx1YjJlNC4gXHVhY2M0XHVjMThkXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPwotTVNHX0VSUk9SX09QRU5fRkFWT1JJVEVTX0JBQ0tVUD1JV0FCMDEzNEUgXHVhZTMwXHViY2Y4IFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMFx1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19JTkZPX0ZBVk9SSVRFU19SRVNUT1JFRF9UT19ERUZBVUxUPUlXQUIwMzIySSBcdWFlMzBcdWJjZjggXHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVhYzAwIFx1YmNmNVx1YzZkMFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9TQVZFX0ZBVk9SSVRFU19XU0lMPUlXQUIwMTg2RSBcdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWI5N2MgJTFcdWM1ZDAgXHVjODAwXHVjN2E1XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPVx1YjEyNFx1YmU0NFx1YWM4Y1x1Yzc3NFx1ZDEzMCBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPVx1YjEyNFx1YmU0NFx1YWM4Y1x1Yzc3NFx1ZDEzMCBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1cdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzAgXHVjZWU4XHVkMTUwXHVjZTIwCi1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1cdWM4NzBcdWNlNTggXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1cdWQyYjlcdWMxMzEgXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9XHVkMmI5XHVjMTMxIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPVx1ZDJiOVx1YzEzMSBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPVx1YzBjMVx1ZDBkYyBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVx1YzBjMVx1ZDBkYyBcdWNlZThcdWQxNTBcdWNlMjAKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVx1YzBjMVx1ZDBkYyBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPVVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfVURESV9SRUdJU1RSWV9ERVRBSUxTPVVEREkgXHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjIFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9VURESSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YzU5MVx1YzJkZAotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9VURESSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPVdTREwgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YzU5MVx1YzJkZAotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9V1NJTCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHVjNTkxXHVjMmRkCi0KLSMgVmlldyB0aXRsZXMKLVZJRVdfVElUTEVfVURESV9CVVNJTkVTU19MSVNUPVVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YmFhOVx1Yjg1ZCBcdWJjZjRcdWFlMzAKLVZJRVdfVElUTEVfVURESV9SRUdJU1RSWV9MSVNUPVVEREkgXHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjIFx1YmFhOVx1Yjg1ZCBcdWJjZjRcdWFlMzAKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9MSVNUPVVEREkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNCBcdWJhYTlcdWI4NWQgXHViY2Y0XHVhZTMwCi1WSUVXX1RJVExFX1VERElfU0VSVklDRV9MSVNUPVVEREkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YmFhOVx1Yjg1ZCBcdWJjZjRcdWFlMzAKLVZJRVdfVElUTEVfV1NETF9TRVJWSUNFX0xJU1Q9V1NETCBcdWMxMWNcdWJlNDRcdWMyYTQgXHViYWE5XHViODVkIFx1YmNmNFx1YWUzMAotVklFV19USVRMRV9XU0lMX0xJU1Q9V1NJTCBcdWI5YzFcdWQwNmMgXHViYWE5XHViODVkIFx1YmNmNFx1YWUzMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX3B0X0JSLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfcHRfQlIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ0NGNjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1GYXZvcml0b3MKLQotIyBOYXZpZ2F0b3IKLUZBVk9SSVRFU19NQUlOX05PREU9UHJpbmNpcGFsIGRlIEZhdm9yaXRvcwotRkFWT1JJVEVTX1dTSUxfRk9MREVSX05PREU9V1NJTHMgRmF2b3JpdG9zCi1GQVZPUklURVNfV1NETF9TRVJWSUNFX0ZPTERFUl9OT0RFPVNlcnZpXHUwMGU3b3MgV1NETCBGYXZvcml0b3MKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfRk9MREVSX05PREU9U2VydmlcdTAwZTdvcyBVRERJIEZhdm9yaXRvcwotRkFWT1JJVEVTX1VERElfQlVTSU5FU1NFU19GT0xERVJfTk9ERT1OZWdcdTAwZjNjaW9zIFVEREkgRmF2b3JpdG9zCi1GQVZPUklURVNfVURESV9TRVJWSUNFX0lOVEVSRkFDRVNfRk9MREVSX05PREU9SW50ZXJmYWNlcyBkZSBTZXJ2aVx1MDBlN29zIFVEREkgRmF2b3JpdG9zCi1GQVZPUklURVNfVURESV9SRUdJU1RSSUVTX0ZPTERFUl9OT0RFPVJlZ2lzdHJvcyBVRERJIEZhdm9yaXRvcwotCi0jIEZvcm0KLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NJTD1XU0lMcyBGYXZvcml0b3MKLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NETD1XU0RMcyBGYXZvcml0b3MKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9SRUdJU1RSWT1SZWdpc3Ryb3MgVURESSBGYXZvcml0b3MKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9TRVJWSUNFPVNlcnZpXHUwMGU3b3MgVURESSBGYXZvcml0b3MKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9CVVNJTkVTUz1FbnRpZGFkZXMgZGUgTmVnXHUwMGYzY2lvcyBVRERJIEZhdm9yaXRvcwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFPUludGVyZmFjZXMgZGUgU2VydmlcdTAwZTdvcyBVRERJIEZhdm9yaXRvcwotRk9STV9MQUJFTF9SRU1PVkU9UmVtb3ZlcgotRk9STV9MQUJFTF9JTVBPUlRfVE9fV1NJTF9QRVJTUEVDVElWRT1JbmNsdWlyIG5hIFBcdTAwZTFnaW5hIGRvIFdTSUwKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkU9SW5jbHVpciBuYSBQXHUwMGUxZ2luYSBkbyBVRERJCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0RMX1BFUlNQRUNUSVZFPUluY2x1aXIgbmEgUFx1MDBlMWdpbmEgZG8gV1NETAotRk9STV9MQUJFTF9VUkw9VVJMCi1GT1JNX0xBQkVMX0lURU1fTlVNQkVSPU5cdTAwYmEgZG8gSXRlbQotRk9STV9MQUJFTF9OQU1FPSBOb21lCi1GT1JNX0xBQkVMX0lOUVVJUllfVVJMPVVSTCBkZSBDb25zdWx0YQotRk9STV9MQUJFTF9QVUJMSVNIX1VSTD1VUkwgZGUgUHVibGljYVx1MDBlN1x1MDBlM28KLUZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRT1Ob21lIGRlIFJlZ2lzdHJvCi1GT1JNX0xBQkVMX0JVU0lORVNTX05BTUU9Tm9tZSBkbyBOZWdcdTAwZjNjaW8KLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPUNoYXZlIGRlIE5lZ1x1MDBmM2Npb3MKLUZPUk1fTEFCRUxfU0VSVklDRV9OQU1FPU5vbWUgZG8gU2VydmlcdTAwZTdvCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPUNoYXZlIGRlIFNlcnZpXHUwMGU3bwotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FPU5vbWUgZGEgSW50ZXJmYWNlIGRlIFNlcnZpXHUwMGU3bwotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVk9Q2hhdmUgZGEgSW50ZXJmYWNlIGRlIFNlcnZpXHUwMGU3bwotRk9STV9MQUJFTF9SRUdJU1RSWV9VUkw9PGEgaHJlZj0iJTEiIHRhcmdldD0iX2JsYW5rIj5DbGlxdWUgYXF1aTwvYT4gcGFyYSBvYnRlciB1bSBJRCBkbyB1c3VcdTAwZTFyaW8gZSBzZW5oYSBwYXJhIGVzdGUgcmVnaXN0cm8uCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVTPUFycXVpdm9zIGRlIERhZG9zIHBhcmEgQ2F0ZWdvcmlhcyBEZWZpbmlkYXMgcGVsbyBVc3VcdTAwZTFyaW8KLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzE1RSBTZWxlY2lvbmUgcGVsbyBtZW5vcyB1bSBpdGVtLgotCi0jIExpc3RGYXZvcml0ZVdTSUxBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1dTSUw9TGlzdGFyIFdTSUxzIEZhdm9yaXRvcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1dTSUxfREVTQz1TZWxlY2lvbmUgdW0gY29uanVudG8gZGUgbGlua3MgV1NJTCBmYXZvcml0b3MgZSBwcmVzc2lvbmUgPHN0cm9uZz5JbmNsdWlyIG5hIFBcdTAwZTFnaW5hIGRvIFdTSUw8L3N0cm9uZz4gcGFyYSBhYnJpLWxvcyBubyBuYXZlZ2Fkb3IgZG8gV1NJTC4gUHJlc3Npb25lIDxzdHJvbmc+UmVtb3Zlcjwvc3Ryb25nPiBwYXJhIHJlbW92ZXIgYXMgc2VsZVx1MDBlN1x1MDBmNWVzLgotCi0jIExpc3RGYXZvcml0ZVdTRExTZXJ2aWNlQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0U9TGlzdGFyIFNlcnZpXHUwMGU3b3MgV1NETCBGYXZvcml0b3MKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0VfREVTQz1TZWxlY2lvbmUgdW0gY29uanVudG8gZGUgc2VydmlcdTAwZTdvcyBXU0RMIGZhdm9yaXRvcyBlIHByZXNzaW9uZSA8c3Ryb25nPlJlbW92ZXI8L3N0cm9uZz4gcGFyYSByZW1vdlx1MDBlYS1sb3MuCi0KLSMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRT1MaXN0YXIgU2VydmlcdTAwZTdvcyBVRERJIEZhdm9yaXRvcwotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9ERVNDPVNlbGVjaW9uZSB1bSBjb25qdW50byBkZSBzZXJ2aVx1MDBlN29zIFVEREkgZmF2b3JpdG9zIGUgcHJlc3Npb25lIDxzdHJvbmc+SW5jbHVpciBuYSBQXHUwMGUxZ2luYSBkbyBVRERJPC9zdHJvbmc+IHBhcmEgYWJyaS1sb3Mgbm8gbmF2ZWdhZG9yIGRvIFVEREkuIFByZXNzaW9uZSA8c3Ryb25nPlJlbW92ZXI8L3N0cm9uZz4gcGFyYSByZW1vdmVyIGFzIHNlbGVcdTAwZTdcdTAwZjVlcy4KLQotIyBMaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1M9TGlzdGFyIE5lZ1x1MDBmM2Npb3MgVURESSBGYXZvcml0b3MKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX0JVU0lORVNTX0RFU0M9U2VsZWNpb25lIHVtIGNvbmp1bnRvIGRlIG5lZ1x1MDBmM2Npb3MgVURESSBmYXZvcml0b3MgZSBwcmVzc2lvbmUgPHN0cm9uZz5JbmNsdWlyIG5hIFBcdTAwZTFnaW5hIGRvIFVEREk8L3N0cm9uZz4gcGFyYSBhYnJpLWxvcyBubyBuYXZlZ2Fkb3IgZG8gVURESS4gUHJlc3Npb25lIDxzdHJvbmc+UmVtb3Zlcjwvc3Ryb25nPiBwYXJhIHJlbW92ZXIgYXMgc2VsZVx1MDBlN1x1MDBmNWVzLgotCi0jIExpc3RGYXZvcml0ZVVERElSZWdpc3RyeUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWT1MaXN0YXIgUmVnaXN0cm9zIFVEREkgRmF2b3JpdG9zCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWV9ERVNDPVNlbGVjaW9uZSB1bSBjb25qdW50byBkZSByZWdpc3Ryb3MgVURESSBmYXZvcml0b3MgZSBwcmVzc2lvbmUgPHN0cm9uZz5JbmNsdWlyIG5hIFBcdTAwZTFnaW5hIGRvIFVEREk8L3N0cm9uZz4gcGFyYSBhYnJpLWxvcyBubyBuYXZlZ2Fkb3IgZG8gVURESS4gUHJlc3Npb25lIDxzdHJvbmc+UmVtb3Zlcjwvc3Ryb25nPiBwYXJhIHJlbW92ZXIgYXMgc2VsZVx1MDBlN1x1MDBmNWVzLgotCi0jIExpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFPUxpc3RhciBJbnRlcmZhY2VzIGRlIFNlcnZpXHUwMGU3b3MgVURESSBGYXZvcml0b3MKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0M9U2VsZWNpb25lIHVtIGNvbmp1bnRvIGRlIGludGVyZmFjZXMgZGUgc2VydmlcdTAwZTdvcyBVRERJIGZhdm9yaXRvcyBlIHByZXNzaW9uZSA8c3Ryb25nPkluY2x1aXIgbmEgUFx1MDBlMWdpbmEgZG8gVURESTwvc3Ryb25nPiBwYXJhIGFicmktbG9zIG5vIG5hdmVnYWRvciBkbyBVRERJLiBQcmVzc2lvbmUgPHN0cm9uZz5SZW1vdmVyPC9zdHJvbmc+IHBhcmEgcmVtb3ZlciBhcyBzZWxlXHUwMGU3XHUwMGY1ZXMuCi0KLSMgRmF2b3JpdGVzV1NJTERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NJTF9ERVRBSUxTPURldGFsaGVzIGRvIFdTSUwgRmF2b3JpdG8KLQotIyBGYXZvcml0ZXNXU0RMRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19XU0RMX0RFVEFJTFM9RGV0YWxoZXMgZG8gV1NETCBGYXZvcml0bwotCi0jIEZhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9SRUdJU1RSWV9ERVRBSUxTPURldGFsaGVzIGRvIFJlZ2lzdHJvIFVEREkgRmF2b3JpdG8KLQotIyBGYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfQlVTSU5FU1NfREVUQUlMUz1EZXRhbGhlcyBkbyBOZWdcdTAwZjNjaW8gVURESSBGYXZvcml0bwotCi0jIEZhdm9yaXRlc1VERElTZXJ2aWNlRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfREVUQUlMUz1EZXRhbGhlcyBkbyBTZXJ2aVx1MDBlN28gVURESSBGYXZvcml0bwotCi0jIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9RGV0YWxoZXMgZGEgSW50ZXJmYWNlIGRlIFNlcnZpXHUwMGU3byBVRERJIEZhdm9yaXRhCi0KLSMgQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRT1JbmNsdWlyIG5hIFBcdTAwZTFnaW5hIGRvIFdTSUwKLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzE2RSAlMSBqXHUwMGUxIGVzdFx1MDBlMSBhYmVydG8gbmEgUFx1MDBlMWdpbmEgZG8gV1NJTC4KLU1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMxN0kgJTEgZm9pIGluY2x1XHUwMGVkZG8gbmEgUFx1MDBlMWdpbmEgZG8gV1NJTC4KLU1TR19FUlJPUl9BRERfV1NJTF9UT19XU0lMX1BFUlNQRUNUSVZFPUlXQUIwMzE4RSBXU0lMICUxIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgY2FycmVnYWRvCi0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JbmNsdWlyIG5hIFBcdTAwZTFnaW5hIGRvIFVEREkKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMyMEUgJTEgblx1MDBlM28gcFx1MDBmNGRlIHNlciBsb2NhbGl6YWRvIG5vIHJlZ2lzdHJvLgotTVNHX0lORk9fQUREX1RPX1VERElfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMyMUkgJTEgZm9pIGluY2x1XHUwMGVkZG8gbmEgUFx1MDBlMWdpbmEgZG8gVURESS4KLQotIyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9SW5jbHVpciBuYSBQXHUwMGUxZ2luYSBkbyBXU0RMCi1NU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzNjlJICUxIGZvaSBpbmNsdVx1MDBlZGRvIG5hIFBcdTAwZTFnaW5hIGRvIFdTREwuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3MEUgV1NETCAlMSBuXHUwMGUzbyBwXHUwMGY0ZGUgc2VyIGNhcnJlZ2FkbwotCi0jIFJlbW92ZUZhdm9yaXRlQWN0aW9uCi1BTFRfUkVNT1ZFX0ZBVk9SSVRFPVJlbW92ZXIgRmF2b3JpdG8KLU1TR19DT05GSVJNX1JFTU9WRV9OT0RFPSUxIG5cdTAwZTNvIHRlbSBtYWlzIHNvbHVcdTAwZTdcdTAwZTNvLiAgRGVzZWphIGxpbXBcdTAwZTEtbG8/Ci0KLSMgRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24KLUFMVF9SRVNUT1JFX0RFRkFVTFRfRkFWT1JJVEVTPVJlc3RhdXJhciBGYXZvcml0b3MgUGFkclx1MDBlM28KLU1TR19DT05GSVJNX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9RXN0YSBvcGVyYVx1MDBlN1x1MDBlM28gc29icmVzY3JldmVyXHUwMGUxIG9zIGZhdm9yaXRvcyBhdHVhaXMuICBEZXNlamEgY29udGludWFyPwotTVNHX0VSUk9SX09QRU5fRkFWT1JJVEVTX0JBQ0tVUD1JV0FCMDEzNEUgSW1wb3NzXHUwMGVkdmVsIGNhcnJlZ2FyIG9zIGZhdm9yaXRvcyBwYWRyXHUwMGUzby4KLU1TR19JTkZPX0ZBVk9SSVRFU19SRVNUT1JFRF9UT19ERUZBVUxUPUlXQUIwMzIySSBGYXZvcml0b3MgUGFkclx1MDBlM28gZm9yYW0gcmVzdGF1cmFkb3MuCi1NU0dfRVJST1JfU0FWRV9GQVZPUklURVNfV1NJTD1JV0FCMDE4NkUgSW1wb3NzXHUwMGVkdmVsIHNhbHZhciBmYXZvcml0b3Mgbm8gJTEuCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPUNvbnRcdTAwZWFpbmVyIGRvIE5hdmVnYWRvcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9QmFycmEgZGUgRmVycmFtZW50YXMgZG8gTmF2ZWdhZG9yCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1Db250ZVx1MDBmYWRvIGRvIE5hdmVnYWRvcgotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9Q29udFx1MDBlYWluZXIgZGUgQVx1MDBlN1x1MDBmNWVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Db250XHUwMGVhaW5lciBkZSBQcm9wcmllZGFkZXMKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1Db250ZVx1MDBmYWRvIGRhcyBQcm9wcmllZGFkZXMKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1CYXJyYSBkZSBGZXJyYW1lbnRhcyBkZSBQcm9wcmllZGFkZXMKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9Q29udFx1MDBlYWluZXIgZGUgU3RhdHVzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZVx1MDBmYWRvIGRvIFN0YXR1cwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9QmFycmEgZGUgRmVycmFtZW50YXMgZGUgU3RhdHVzCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPUZvcm11bFx1MDBlMXJpbyBkZSBEZXRhbGhlcyBkbyBOZWdcdTAwZjNjaW8gVURESQotRk9STV9USVRMRV9VRERJX1JFR0lTVFJZX0RFVEFJTFM9Rm9ybXVsXHUwMGUxcmlvIGRlIERldGFsaGVzIGRvIFJlZ2lzdHJvIFVEREkKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9Rm9ybXVsXHUwMGUxcmlvIGRlIERldGFsaGVzIGRvIFNlcnZpXHUwMGU3byBVRERJCi1GT1JNX1RJVExFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1Gb3JtdWxcdTAwZTFyaW8gZGUgRGV0YWxoZXMgZGEgSW50ZXJmYWNlIGRvIFNlcnZpXHUwMGU3byBVRERJCi1GT1JNX1RJVExFX1dTRExfREVUQUlMUz1Gb3JtdWxcdTAwZTFyaW8gZGUgRGV0YWxoZXMgZG8gV1NETAotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9Rm9ybXVsXHUwMGUxcmlvIGRlIERldGFsaGVzIGRvIFdTSUwKLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTX0xJU1Q9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkYSBMaXN0YSBkZSBOZWdcdTAwZjNjaW9zIFVEREkKLVZJRVdfVElUTEVfVURESV9SRUdJU1RSWV9MSVNUPVZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGEgTGlzdGEgZGUgUmVnaXN0cm9zIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9MSVNUPVZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGEgTGlzdGEgZGUgSW50ZXJmYWNlcyBkZSBTZXJ2aVx1MDBlN29zIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0xJU1Q9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkYSBMaXN0YSBkZSBTZXJ2aVx1MDBlN29zIFVEREkKLVZJRVdfVElUTEVfV1NETF9TRVJWSUNFX0xJU1Q9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkYSBMaXN0YSBkZSBTZXJ2aVx1MDBlN29zIFdTREwKLVZJRVdfVElUTEVfV1NJTF9MSVNUPVZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGEgTGlzdGEgZGUgTGlua3MgV1NJTApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX3poX0NOLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliNGU0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy9mYXZvcml0ZXNfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1cdTY1MzZcdTg1Y2ZcdTU5MzkKLQotIyBOYXZpZ2F0b3IKLUZBVk9SSVRFU19NQUlOX05PREU9XHU2NTM2XHU4NWNmXHU1OTM5XHU0ZTNiXHU4OTgxCi1GQVZPUklURVNfV1NJTF9GT0xERVJfTk9ERT1cdTY1MzZcdTg1Y2ZcdTU5MzkgV1NJTAotRkFWT1JJVEVTX1dTRExfU0VSVklDRV9GT0xERVJfTk9ERT1cdTY1MzZcdTg1Y2ZcdTU5MzkgV1NETCBcdTY3MGRcdTUyYTEKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfRk9MREVSX05PREU9XHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU2NzBkXHU1MmExCi1GQVZPUklURVNfVURESV9CVVNJTkVTU0VTX0ZPTERFUl9OT0RFPVx1NjUzNlx1ODVjZlx1NTkzOSBVRERJIFx1NGUxYVx1NTJhMQotRkFWT1JJVEVTX1VERElfU0VSVklDRV9JTlRFUkZBQ0VTX0ZPTERFUl9OT0RFPVx1NjUzNlx1ODVjZlx1NTkzOSBVRERJIFx1NjcwZFx1NTJhMVx1NjNhNVx1NTNlMwotRkFWT1JJVEVTX1VERElfUkVHSVNUUklFU19GT0xERVJfTk9ERT1cdTY1MzZcdTg1Y2ZcdTU5MzkgVURESSBcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzMKLQotIyBGb3JtCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1dTSUw9XHU2NTM2XHU4NWNmXHU1OTM5IFdTSUwKLUZPUk1fTEFCRUxfRkFWT1JJVEVfV1NETD1cdTY1MzZcdTg1Y2ZcdTU5MzkgV1NETAotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1JFR0lTVFJZPVx1NjUzNlx1ODVjZlx1NTkzOSBVRERJIFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjMwotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0U9XHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU2NzBkXHU1MmExCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfQlVTSU5FU1M9XHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU0ZTFhXHU1MmExXHU1YjllXHU0ZjUzCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0U9XHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzCi1GT1JNX0xBQkVMX1JFTU9WRT1cdTk2NjRcdTUzYmIKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1dTSUxfUEVSU1BFQ1RJVkU9XHU2ZGZiXHU1MmEwXHU4MWYzIFdTSUwgXHU5ODc1XHU5NzYyCi1GT1JNX0xBQkVMX0lNUE9SVF9UT19VRERJX1BFUlNQRUNUSVZFPVx1NmRmYlx1NTJhMFx1NTIzMCBVRERJIFx1OTg3NVx1OTc2MgotRk9STV9MQUJFTF9JTVBPUlRfVE9fV1NETF9QRVJTUEVDVElWRT1cdTZkZmJcdTUyYTBcdTUyMzAgV1NETCBcdTk4NzVcdTk3NjIKLUZPUk1fTEFCRUxfVVJMPVVSTAotRk9STV9MQUJFTF9JVEVNX05VTUJFUj1cdTdmMTZcdTUzZjcKLUZPUk1fTEFCRUxfTkFNRT1cdTU0MGRcdTc5ZjAKLUZPUk1fTEFCRUxfSU5RVUlSWV9VUkw9XHU2N2U1XHU4YmUyIFVSTAotRk9STV9MQUJFTF9QVUJMSVNIX1VSTD1cdTUzZDFcdTVlMDMgVVJMCi1GT1JNX0xBQkVMX1JFR0lTVFJZX05BTUU9XHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU1NDBkXHU3OWYwCi1GT1JNX0xBQkVMX0JVU0lORVNTX05BTUU9XHU0ZTFhXHU1MmExXHU1NDBkXHU3OWYwCi1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1cdTRlMWFcdTUyYTFcdTViYzZcdTk0YTUKLUZPUk1fTEFCRUxfU0VSVklDRV9OQU1FPVx1NjcwZFx1NTJhMVx1NTQwZFx1NzlmMAotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1cdTY3MGRcdTUyYTFcdTViYzZcdTk0YTUKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRT1cdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTNcdTU0MGQKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfS0VZPVx1NjcwZFx1NTJhMVx1NjNhNVx1NTNlM1x1NWJjNlx1OTRhNQotRk9STV9MQUJFTF9SRUdJU1RSWV9VUkw9PGEgaHJlZj0iJTEiIHRhcmdldD0iX2JsYW5rIj5cdTUzNTVcdTUxZmJcdTZiNjRcdTU5MDQ8L2E+XHU0ZWU1XHU4M2I3XHU1M2Q2XHU2YjY0XHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU3Njg0XHU3NTI4XHU2MjM3XHU2ODA3XHU4YmM2XHU1NDhjXHU1YmM2XHU3ODAxXHUzMDAyCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVTPVx1NzUyOFx1NjIzN1x1NWI5YVx1NGU0OVx1NzY4NFx1N2M3Ylx1NTIyYlx1NzY4NFx1NjU3MFx1NjM2ZVx1NjU4N1x1NGVmNgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMTVFIFx1ODFmM1x1NWMxMVx1OTAwOVx1NjJlOVx1NGUwMFx1OTg3OVx1MzAwMgotCi0jIExpc3RGYXZvcml0ZVdTSUxBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1dTSUw9XHU1MjE3XHU3OTNhXHU2NTM2XHU4NWNmXHU1OTM5IFdTSUwKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9XU0lMX0RFU0M9XHU5MDA5XHU2MmU5XHU0ZTAwXHU3ZWM0XHU2NTM2XHU4NWNmXHU1OTM5IFdTSUwgXHU5NGZlXHU2M2E1XHU1ZTc2XHU2MzA5PHN0cm9uZz5cdTZkZmJcdTUyYTBcdTgxZjMgV1NJTCBcdTk4NzVcdTk3NjI8L3N0cm9uZz5cdTRlZTVcdTU3MjggV1NJTCBcdTViZmNcdTgyMmFcdTU2NjhcdTRlMmRcdTYyNTNcdTVmMDBcdTViODNcdTRlZWNcdTMwMDJcdTYzMDk8c3Ryb25nPlx1OTY2NFx1NTNiYjwvc3Ryb25nPlx1NGVlNVx1OTY2NFx1NTNiYlx1NjI0MFx1OTAwOVx1NTE4NVx1NWJiOVx1MzAwMgotCi0jIExpc3RGYXZvcml0ZVdTRExTZXJ2aWNlQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9XU0RMX1NFUlZJQ0U9XHU1MjE3XHU3OTNhXHU2NTM2XHU4NWNmXHU1OTM5IFdTREwgXHU2NzBkXHU1MmExCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFX0RFU0M9XHU5MDA5XHU2MmU5XHU0ZTAwXHU3ZWM0XHU2NTM2XHU4NWNmXHU1OTM5IFdTREwgXHU2NzBkXHU1MmExXHU1ZTc2XHU2MzA5PHN0cm9uZz5cdTk2NjRcdTUzYmI8L3N0cm9uZz5cdTRlZTVcdTk2NjRcdTUzYmJcdTViODNcdTRlZWNcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFPVx1NTIxN1x1NzkzYVx1NjUzNlx1ODVjZlx1NTkzOSBVRERJIFx1NjcwZFx1NTJhMQotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9ERVNDPVx1OTAwOVx1NjJlOVx1NGUwMFx1N2VjNFx1NjUzNlx1ODVjZlx1NTkzOSBVRERJIFx1NjcwZFx1NTJhMVx1NWU3Nlx1NjMwOTxzdHJvbmc+XHU2ZGZiXHU1MmEwXHU1MjMwIFVEREkgXHU5ODc1XHU5NzYyPC9zdHJvbmc+XHU0ZWU1XHU1NzI4IFVEREkgXHU1YmZjXHU4MjJhXHU1NjY4XHU0ZTJkXHU2MjUzXHU1ZjAwXHU1YjgzXHU0ZWVjXHUzMDAyXHU2MzA5PHN0cm9uZz5cdTk2NjRcdTUzYmI8L3N0cm9uZz5cdTRlZTVcdTk2NjRcdTUzYmJcdTYyNDBcdTkwMDlcdTUxODVcdTViYjlcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVVRERJQnVzaW5lc3NBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1M9XHU1MjE3XHU3OTNhXHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU0ZTFhXHU1MmExCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9CVVNJTkVTU19ERVNDPVx1OTAwOVx1NjJlOVx1NGUwMFx1N2VjNFx1NjUzNlx1ODVjZlx1NTkzOSBVRERJIFx1NGUxYVx1NTJhMVx1NWU3Nlx1NjMwOTxzdHJvbmc+XHU2ZGZiXHU1MmEwXHU1MjMwIFVEREkgXHU5ODc1XHU5NzYyPC9zdHJvbmc+XHU0ZWU1XHU1NzI4IFVEREkgXHU1YmZjXHU4MjJhXHU1NjY4XHU0ZTJkXHU2MjUzXHU1ZjAwXHU1YjgzXHU0ZWVjXHUzMDAyXHU2MzA5PHN0cm9uZz5cdTk2NjRcdTUzYmI8L3N0cm9uZz5cdTRlZTVcdTk2NjRcdTUzYmJcdTYyNDBcdTkwMDlcdTUxODVcdTViYjlcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVVRERJUmVnaXN0cnlBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUlk9XHU1MjE3XHU3OTNhXHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9SRUdJU1RSWV9ERVNDPVx1OTAwOVx1NjJlOVx1NGUwMFx1N2VjNFx1NjUzNlx1ODVjZlx1NTkzOSBVRERJIFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NWU3Nlx1NjMwOTxzdHJvbmc+XHU2ZGZiXHU1MmEwXHU1MjMwIFVEREkgXHU5ODc1XHU5NzYyPC9zdHJvbmc+XHU0ZWU1XHU1NzI4IFVEREkgXHU1YmZjXHU4MjJhXHU1NjY4XHU0ZTJkXHU2MjUzXHU1ZjAwXHU1YjgzXHU0ZWVjXHUzMDAyXHU2MzA5PHN0cm9uZz5cdTk2NjRcdTUzYmI8L3N0cm9uZz5cdTRlZTVcdTk2NjRcdTUzYmJcdTYyNDBcdTkwMDlcdTUxODVcdTViYjlcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRT1cdTUyMTdcdTc5M2FcdTY1MzZcdTg1Y2ZcdTU5MzkgVURESSBcdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTMKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0M9XHU5MDA5XHU2MmU5XHU0ZTAwXHU3ZWM0XHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzXHU1ZTc2XHU2MzA5PHN0cm9uZz5cdTZkZmJcdTUyYTBcdTUyMzAgVURESSBcdTk4NzVcdTk3NjI8L3N0cm9uZz5cdTRlZTVcdTU3MjggVURESSBcdTViZmNcdTgyMmFcdTU2NjhcdTRlMmRcdTYyNTNcdTVmMDBcdTViODNcdTRlZWNcdTMwMDJcdTYzMDk8c3Ryb25nPlx1OTY2NFx1NTNiYjwvc3Ryb25nPlx1NGVlNVx1OTY2NFx1NTNiYlx1NjI0MFx1OTAwOVx1NTE4NVx1NWJiOVx1MzAwMgotCi0jIEZhdm9yaXRlc1dTSUxEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1dTSUxfREVUQUlMUz1cdTY1MzZcdTg1Y2ZcdTU5MzkgV1NJTCBcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmYKLQotIyBGYXZvcml0ZXNXU0RMRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19XU0RMX0RFVEFJTFM9XHU2NTM2XHU4NWNmXHU1OTM5IFdTREwgXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi0KLSMgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1JFR0lTVFJZX0RFVEFJTFM9XHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi0KLSMgRmF2b3JpdGVzVURESUJ1c2luZXNzRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX0JVU0lORVNTX0RFVEFJTFM9XHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU0ZTFhXHU1MmExXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi0KLSMgRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfRkFWT1JJVEVTX1VERElfU0VSVklDRV9ERVRBSUxTPVx1NjUzNlx1ODVjZlx1NTkzOSBVRERJIFx1NjcwZFx1NTJhMVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2ZgotCi0jIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9XHU2NTM2XHU4NWNmXHU1OTM5IFVEREkgXHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi0KLSMgQWRkV1NJTFRvV1NJTFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTSUxfVE9fV1NJTF9QRVJTUEVDVElWRT1cdTZkZmJcdTUyYTBcdTgxZjMgV1NJTCBcdTk4NzVcdTk3NjIKLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzE2RSBcdTVkZjJcdTdlY2ZcdTU3MjggV1NJTCBcdTk4NzVcdTk3NjJcdTRlMmRcdTYyNTNcdTVmMDBcdTRlODYgJTFcdTMwMDIKLU1TR19JTkZPX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMxN0kgXHU1ZGYyXHU3ZWNmXHU1YzA2ICUxIFx1NmRmYlx1NTJhMFx1ODFmMyBXU0lMIFx1OTg3NVx1OTc2Mlx1MzAwMgotTVNHX0VSUk9SX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9SVdBQjAzMThFIFx1NjcyYVx1ODBmZFx1ODhjNVx1NTE2NSBXU0lMICUxXHUzMDAyCi0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1cdTZkZmJcdTUyYTBcdTUyMzAgVURESSBcdTk4NzVcdTk3NjIKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMyMEUgXHU1NzI4XHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwICUxXHUzMDAyCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzIxSSBcdTVkZjJcdTdlY2ZcdTVjMDYgJTEgXHU2ZGZiXHU1MmEwXHU1MjMwIFVEREkgXHU5ODc1XHU5NzYyXHUzMDAyCi0KLSMgRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFPVx1NmRmYlx1NTJhMFx1NTIzMCBXU0RMIFx1OTg3NVx1OTc2MgotTVNHX0lORk9fQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzY5SSBcdTVkZjJcdTdlY2ZcdTVjMDYgJTEgXHU2ZGZiXHU1MmEwXHU1MjMwIFdTREwgXHU5ODc1XHU5NzYyXHUzMDAyCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3MEUgXHU2NWUwXHU2Y2Q1XHU4OGM1XHU1MTY1IFdTREwgJTFcdTMwMDIKLQotIyBSZW1vdmVGYXZvcml0ZUFjdGlvbgotQUxUX1JFTU9WRV9GQVZPUklURT1cdTk2NjRcdTUzYmJcdTY1MzZcdTg1Y2ZcdTk4NzkKLU1TR19DT05GSVJNX1JFTU9WRV9OT0RFPSUxIFx1NGUwZFx1NTE4ZFx1NTNlZlx1ODllM1x1Njc5MFx1MzAwMlx1NjBmM1x1ODk4MVx1NmUwNVx1OTY2NFx1NWI4M1x1NTQxN1x1ZmYxZgotCi0jIEZhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uCi1BTFRfUkVTVE9SRV9ERUZBVUxUX0ZBVk9SSVRFUz1cdTYwNjJcdTU5MGRcdTdmM2FcdTc3MDFcdTY1MzZcdTg1Y2ZcdTU5MzkKLU1TR19DT05GSVJNX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9XHU2YjY0XHU2NGNkXHU0ZjVjXHU1YzA2XHU4OTg2XHU3NmQ2XHU1ZjUzXHU1MjRkXHU2NTM2XHU4NWNmXHU1OTM5XHUzMDAyXHU2MGYzXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmCi1NU0dfRVJST1JfT1BFTl9GQVZPUklURVNfQkFDS1VQPUlXQUIwMTM0RSBcdTY1ZTBcdTZjZDVcdTg4YzVcdTUxNjVcdTdmM2FcdTc3MDFcdTY1MzZcdTg1Y2ZcdTU5MzlcdTMwMDIKLU1TR19JTkZPX0ZBVk9SSVRFU19SRVNUT1JFRF9UT19ERUZBVUxUPUlXQUIwMzIySSBcdTYwNjJcdTU5MGRcdTRlODZcdTdmM2FcdTc3MDFcdTY1MzZcdTg1Y2ZcdTU5MzlcdTMwMDIKLU1TR19FUlJPUl9TQVZFX0ZBVk9SSVRFU19XU0lMPUlXQUIwMTg2RSBcdTY1ZTBcdTZjZDVcdTVjMDZcdTY1MzZcdTg1Y2ZcdTU5MzlcdTRmZGRcdTViNThcdTgxZjMgJTFcdTMwMDIKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9XHU1YmZjXHU4MjJhXHU1NjY4XHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1cdTViZmNcdTgyMmFcdTU2NjhcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPVx1NWJmY1x1ODIyYVx1NTY2OFx1NTE4NVx1NWJiOQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9XHU2NGNkXHU0ZjVjXHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1cdTVjNWVcdTYwMjdcdTViYjlcdTU2NjgKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1cdTVjNWVcdTYwMjdcdTUxODVcdTViYjkKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1cdTVjNWVcdTYwMjdcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9XHU3MmI2XHU2MDAxXHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1cdTcyYjZcdTYwMDFcdTUxODVcdTViYjkKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVx1NzJiNlx1NjAwMVx1NWRlNVx1NTE3N1x1NjgwZgotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX1VERElfQlVTSU5FU1NfREVUQUlMUz1VRERJIFx1NGUxYVx1NTJhMVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9VRERJX1JFR0lTVFJZX0RFVEFJTFM9VURESSBcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTg4NjhcdTUzNTUKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0RFVEFJTFM9VURESSBcdTY3MGRcdTUyYTFcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTg4NjhcdTUzNTUKLUZPUk1fVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPVVEREkgXHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX1dTRExfREVUQUlMUz1XU0RMIFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9V1NJTCBcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTg4NjhcdTUzNTUKLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTX0xJU1Q9VURESSBcdTRlMWFcdTUyYTFcdTUyMTdcdTg4NjhcdTg5YzZcdTU2ZmUKLVZJRVdfVElUTEVfVURESV9SRUdJU1RSWV9MSVNUPVVEREkgXHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU1MjE3XHU4ODY4XHU4OWM2XHU1NmZlCi1WSUVXX1RJVExFX1VERElfU0VSVklDRV9JTlRFUkZBQ0VfTElTVD1VRERJIFx1NjcwZFx1NTJhMVx1NjNhNVx1NTNlM1x1NTIxN1x1ODg2OFx1ODljNlx1NTZmZQotVklFV19USVRMRV9VRERJX1NFUlZJQ0VfTElTVD1VRERJIFx1NjcwZFx1NTJhMVx1NTIxN1x1ODg2OFx1ODljNlx1NTZmZQotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VfTElTVD1XU0RMIFx1NjcwZFx1NTJhMVx1NTIxN1x1ODg2OFx1ODljNlx1NTZmZQotVklFV19USVRMRV9XU0lMX0xJU1Q9V1NJTCBcdTk0ZmVcdTYzYTVcdTUyMTdcdTg4NjhcdTg5YzZcdTU2ZmUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL2Zhdm9yaXRlc196aF9UVy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX3poX1RXLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDE5NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvZmF2b3JpdGVzX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiCi0KLSMgTmF2aWdhdG9yCi1GQVZPUklURVNfTUFJTl9OT0RFPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYlx1NGUzYlx1NzU2Ylx1OTc2MgotRkFWT1JJVEVTX1dTSUxfRk9MREVSX05PREU9XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiIFdTSUwKLUZBVk9SSVRFU19XU0RMX1NFUlZJQ0VfRk9MREVSX05PREU9XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiIFdTREwgXHU2NzBkXHU1MmQ5Ci1GQVZPUklURVNfVURESV9TRVJWSUNFX0ZPTERFUl9OT0RFPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NjcwZFx1NTJkOQotRkFWT1JJVEVTX1VERElfQlVTSU5FU1NFU19GT0xERVJfTk9ERT1cdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIgVURESSBcdTU1NDZcdTY5NmQKLUZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVJfTk9ERT1cdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIgVURESSBcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjIKLUZBVk9SSVRFU19VRERJX1JFR0lTVFJJRVNfRk9MREVSX05PREU9XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiIFVEREkgXHU3NjdiXHU5MzA0Ci0KLSMgRm9ybQotRk9STV9MQUJFTF9GQVZPUklURV9XU0lMPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBXU0lMCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1dTREw9XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiIFdTREwKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9SRUdJU1RSWT1cdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIgVURESSBcdTc2N2JcdTkzMDQKLUZPUk1fTEFCRUxfRkFWT1JJVEVfVURESV9TRVJWSUNFPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NjcwZFx1NTJkOQotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX0JVU0lORVNTPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NTU0Nlx1Njk2ZFx1NWJlNlx1OWFkNAotRk9STV9MQUJFTF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2MgotRk9STV9MQUJFTF9SRU1PVkU9XHU3OWZiXHU5NjY0Ci1GT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFPVx1NTJhMFx1NTIzMCBXU0lMIFx1OTgwMVx1OTc2MgotRk9STV9MQUJFTF9JTVBPUlRfVE9fVURESV9QRVJTUEVDVElWRT1cdTUyYTBcdTUyMzAgVURESSBcdTk4MDFcdTk3NjIKLUZPUk1fTEFCRUxfSU1QT1JUX1RPX1dTRExfUEVSU1BFQ1RJVkU9XHU1MmEwXHU1MjMwIFdTREwgXHU5ODAxXHU5NzYyCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9XHU5ODA1XHU3NmVlICMKLUZPUk1fTEFCRUxfTkFNRT1cdTU0MGRcdTdhMzEKLUZPUk1fTEFCRUxfSU5RVUlSWV9VUkw9XHU2N2U1XHU4YTYyIFVSTAotRk9STV9MQUJFTF9QVUJMSVNIX1VSTD1cdTc2N2NcdTRmNDggVVJMCi1GT1JNX0xBQkVMX1JFR0lTVFJZX05BTUU9XHU3NjdiXHU5MzA0XHU1NDBkXHU3YTMxCi1GT1JNX0xBQkVMX0JVU0lORVNTX05BTUU9XHU1NTQ2XHU2OTZkXHU1NDBkXHU3YTMxCi1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1cdTU1NDZcdTY5NmRcdTkxZDFcdTk0NzAKLUZPUk1fTEFCRUxfU0VSVklDRV9OQU1FPVx1NjcwZFx1NTJkOVx1NTQwZFx1N2EzMQotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1cdTY3MGRcdTUyZDlcdTkxZDFcdTk0NzAKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRT1cdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjJcdTU0MGRcdTdhMzEKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfS0VZPVx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2Mlx1N2QyMlx1NWYxNVx1OTM3NQotRk9STV9MQUJFTF9SRUdJU1RSWV9VUkw9XHU4YWNiPGEgaHJlZj0iJTEiIHRhcmdldD0iX2JsYW5rIj5cdTYzMDlcdTRlMDBcdTRlMGJcdTkwMTlcdTg4ZTE8L2E+XHU0Zjg2XHU1M2Q2XHU1Zjk3XHU5MDE5XHU1MDBiXHU3NjdiXHU5MzA0XHU3Njg0XHU0ZjdmXHU3NTI4XHU4MDA1IElEIFx1NTQ4Y1x1NWJjNlx1NzhiY1x1MzAwMgotRk9STV9MQUJFTF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFUz1cdTRmN2ZcdTc1MjhcdTgwMDVcdTViOWFcdTdmYTlcdTc2ODRcdTdhMmVcdTk4NWVcdTRlNGJcdThjYzdcdTY1OTlcdTZhOTQKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzE1RSBcdThhY2JcdTkwNzhcdTUzZDZcdTgxZjNcdTVjMTFcdTRlMDBcdTUwMGJcdTk4MDVcdTc2ZWVcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVXU0lMQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9XU0lMPVx1NTIxN1x1NTFmYVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBXU0lMCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfV1NJTF9ERVNDPVx1OGFjYlx1OTA3OFx1NTNkNlx1NGUwMFx1N2Q0NFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBXU0lMIFx1OTNjOFx1N2Q1MFx1ZmYwY1x1NTE4ZFx1NjMwOTxzdHJvbmc+XHU1MmEwXHU1MjMwIFdTSUwgXHU5ODAxXHU5NzYyPC9zdHJvbmc+XHVmZjBjXHU1YzA3XHU1YjgzXHU1MDExXHU5NThiXHU1NzI4IFdTSUwgXHU1YzBlXHU4OWJkXHU1NjY4XHU0ZTJkXHUzMDAyXHU4YWNiXHU2MzA5PHN0cm9uZz5cdTc5ZmJcdTk2NjQ8L3N0cm9uZz5cdTRmODZcdTc5ZmJcdTk2NjRcdTkwNzhcdTk4MDVcdTMwMDIKLQotIyBMaXN0RmF2b3JpdGVXU0RMU2VydmljZUFjdGlvbgotQUxUX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFPVx1NTIxN1x1NTFmYVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBXU0RMIFx1NjcwZFx1NTJkOQotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1dTRExfU0VSVklDRV9ERVNDPVx1OGFjYlx1OTA3OFx1NTNkNlx1NGUwMFx1N2Q0NFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBXU0RMIFx1NjcwZFx1NTJkOVx1ZmYwY1x1NTE4ZFx1NjMwOTxzdHJvbmc+XHU3OWZiXHU5NjY0PC9zdHJvbmc+XHU0Zjg2XHU3OWZiXHU5NjY0XHU1YjgzXHU1MDExXHUzMDAyCi0KLSMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRT1cdTUyMTdcdTUxZmFcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIgVURESSBcdTY3MGRcdTUyZDkKLUZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfREVTQz1cdThhY2JcdTkwNzhcdTUzZDZcdTRlMDBcdTdkNDRcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIgVURESSBcdTY3MGRcdTUyZDlcdWZmMGNcdTUxOGRcdTYzMDk8c3Ryb25nPlx1NTJhMFx1NTIzMCBVRERJIFx1OTgwMVx1OTc2Mjwvc3Ryb25nPlx1ZmYwY1x1NWMwN1x1NWI4M1x1NTAxMVx1OTU4Ylx1NTcyOCBVRERJIFx1NWMwZVx1ODliZFx1NTY2OFx1NGUyZFx1MzAwMlx1OGFjYlx1NjMwOTxzdHJvbmc+XHU3OWZiXHU5NjY0PC9zdHJvbmc+XHU0Zjg2XHU3OWZiXHU5NjY0XHU5MDc4XHU5ODA1XHUzMDAyCi0KLSMgTGlzdEZhdm9yaXRlVURESUJ1c2luZXNzQWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX0JVU0lORVNTPVx1NTIxN1x1NTFmYVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NTU0Nlx1Njk2ZAotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1NfREVTQz1cdThhY2JcdTkwNzhcdTUzZDZcdTRlMDBcdTdkNDRcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIgVURESSBcdTU1NDZcdTY5NmRcdWZmMGNcdTUxOGRcdTYzMDk8c3Ryb25nPlx1NTJhMFx1NTIzMCBVRERJIFx1OTgwMVx1OTc2Mjwvc3Ryb25nPlx1ZmYwY1x1NWMwN1x1NWI4M1x1NTAxMVx1OTU4Ylx1NTcyOCBVRERJIFx1NWMwZVx1ODliZFx1NTY2OFx1NGUyZFx1MzAwMlx1OGFjYlx1NjMwOTxzdHJvbmc+XHU3OWZiXHU5NjY0PC9zdHJvbmc+XHU0Zjg2XHU3OWZiXHU5NjY0XHU5MDc4XHU5ODA1XHUzMDAyCi0KLSMgTGlzdEZhdm9yaXRlVURESVJlZ2lzdHJ5QWN0aW9uCi1BTFRfTElTVF9GQVZPUklURV9VRERJX1JFR0lTVFJZPVx1NTIxN1x1NTFmYVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NzY3Ylx1OTMwNAotRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUllfREVTQz1cdThhY2JcdTkwNzhcdTUzZDZcdTRlMDBcdTdkNDRcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIgVURESSBcdTc2N2JcdTkzMDRcdWZmMGNcdTUxOGRcdTYzMDk8c3Ryb25nPlx1NTJhMFx1NTIzMCBVRERJIFx1OTgwMVx1OTc2Mjwvc3Ryb25nPlx1ZmYwY1x1NWMwN1x1NWI4M1x1NTAxMVx1OTU4Ylx1NTcyOCBVRERJIFx1NWMwZVx1ODliZFx1NTY2OFx1NGUyZFx1MzAwMlx1OGFjYlx1NjMwOTxzdHJvbmc+XHU3OWZiXHU5NjY0PC9zdHJvbmc+XHU0Zjg2XHU3OWZiXHU5NjY0XHU5MDc4XHU5ODA1XHUzMDAyCi0KLSMgTGlzdEZhdm9yaXRlVURESVNlcnZpY2VJbnRlcmZhY2VBY3Rpb24KLUFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0U9XHU1MjE3XHU1MWZhXHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiIFVEREkgXHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyCi1GT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDPVx1OGFjYlx1OTA3OFx1NTNkNlx1NGUwMFx1N2Q0NFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2Mlx1ZmYwY1x1NTE4ZFx1NjMwOTxzdHJvbmc+XHU1MmEwXHU1MjMwIFVEREkgXHU5ODAxXHU5NzYyPC9zdHJvbmc+XHVmZjBjXHU1YzA3XHU1YjgzXHU1MDExXHU5NThiXHU1NzI4IFVEREkgXHU1YzBlXHU4OWJkXHU1NjY4XHU0ZTJkXHUzMDAyXHU4YWNiXHU2MzA5PHN0cm9uZz5cdTc5ZmJcdTk2NjQ8L3N0cm9uZz5cdTRmODZcdTc5ZmJcdTk2NjRcdTkwNzhcdTk4MDVcdTMwMDIKLQotIyBGYXZvcml0ZXNXU0lMRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19XU0lMX0RFVEFJTFM9XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiIFdTSUwgXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5Ci0KLSMgRmF2b3JpdGVzV1NETERldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfV1NETF9ERVRBSUxTPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBXU0RMIFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQotCi0jIEZhdm9yaXRlc1VERElSZWdpc3RyeURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9SRUdJU1RSWV9ERVRBSUxTPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NzY3Ylx1OTMwNFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQotCi0jIEZhdm9yaXRlc1VERElCdXNpbmVzc0RldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9CVVNJTkVTU19ERVRBSUxTPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NTU0Nlx1Njk2ZFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQotCi0jIEZhdm9yaXRlc1VERElTZXJ2aWNlRGV0YWlsc0FjdGlvbgotQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfREVUQUlMUz1cdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIgVURESSBcdTY3MGRcdTUyZDlcdThhNzNcdTdkMzBcdThjYzdcdTY1OTkKLQotIyBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZURldGFpbHNBY3Rpb24KLUFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYiBVRERJIFx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2Mlx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQotCi0jIEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9XHU1MmEwXHU1MjMwIFdTSUwgXHU5ODAxXHU5NzYyCi1NU0dfRVJST1JfV1NJTF9BTFJFQURZX09QRU5FRD1JV0FCMDMxNkUgJTEgXHU1ZGYyXHU5NThiXHU1NzI4IFdTSUwgXHU5ODAxXHU5NzYyXHU0ZTJkXHUzMDAyCi1NU0dfSU5GT19BRERfV1NJTF9UT19XU0lMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMTdJICUxIFx1NWRmMlx1NTJhMFx1NTIzMCBXU0lMIFx1OTgwMVx1OTc2Mlx1NGUyZFx1MzAwMgotTVNHX0VSUk9SX0FERF9XU0lMX1RPX1dTSUxfUEVSU1BFQ1RJVkU9SVdBQjAzMThFIFdTSUwgJTEgXHU3MTIxXHU2Y2Q1XHU4ZjA5XHU1MTY1XHUzMDAyCi0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1cdTUyYTBcdTUyMzAgVURESSBcdTk4MDFcdTk3NjIKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMyMEUgXHU1NzI4XHU3NjdiXHU5MzA0XHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwICUxXHUzMDAyCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzIxSSAlMSBcdTVkZjJcdTUyYTBcdTUyMzAgVURESSBcdTk4MDFcdTk3NjJcdTRlMmRcdTMwMDIKLQotIyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9XHU1MmEwXHU1MjMwIFdTREwgXHU5ODAxXHU5NzYyCi1NU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzNjlJICUxIFx1NWRmMlx1NTJhMFx1NTIzMCBXU0RMIFx1OTgwMVx1OTc2Mlx1NGUyZFx1MzAwMgotTVNHX0VSUk9SX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzBFIFdTREwgJTEgXHU3MTIxXHU2Y2Q1XHU4ZjA5XHU1MTY1XHUzMDAyCi0KLSMgUmVtb3ZlRmF2b3JpdGVBY3Rpb24KLUFMVF9SRU1PVkVfRkFWT1JJVEU9XHU3OWZiXHU5NjY0XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSBcdTVkZjJcdTcxMjFcdTZjZDVcdTg5ZTNcdTY3OTBcdTMwMDJcdTYwYThcdTg5ODFcdTZlMDVcdTk2NjRcdTViODNcdTU1Y2VcdWZmMWYKLQotIyBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbgotQUxUX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVM9XHU5MDg0XHU1MzlmXHU5ODEwXHU4YTJkXHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiCi1NU0dfQ09ORklSTV9SRVNUT1JFX0RFRkFVTFRfRkFWT1JJVEVTPVx1OTAxOVx1OTgwNVx1NGY1Y1x1Njk2ZFx1NWMwN1x1NjUzOVx1NWJlYlx1NzNmZVx1ODg0Y1x1NjIxMVx1NzY4NFx1NjcwMFx1NjExYlx1MzAwMlx1NjBhOFx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZgotTVNHX0VSUk9SX09QRU5fRkFWT1JJVEVTX0JBQ0tVUD1JV0FCMDEzNEUgXHU3MTIxXHU2Y2Q1XHU4ZjA5XHU1MTY1XHU5ODEwXHU4YTJkXHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiXHUzMDAyCi1NU0dfSU5GT19GQVZPUklURVNfUkVTVE9SRURfVE9fREVGQVVMVD1JV0FCMDMyMkkgXHU5MDg0XHU1MzlmXHU5ODEwXHU4YTJkXHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiXHUzMDAyCi1NU0dfRVJST1JfU0FWRV9GQVZPUklURVNfV1NJTD1JV0FCMDE4NkUgXHU3MTIxXHU2Y2Q1XHU1YzA3XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiXHU1MTMyXHU1YjU4XHU1MjMwICUxIFx1NGUyZFx1MzAwMgotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1cdTVjMGVcdTg5YmRcdTU2NjhcdTUxMzJcdTViNThcdTU2NjgKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPVx1NWMwZVx1ODliZFx1NTY2OFx1NWRlNVx1NTE3N1x1NTIxNwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9XHU1YzBlXHU4OWJkXHU1NjY4XHU1MTY3XHU1YmI5Ci1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1cdTUyZDVcdTRmNWNcdTUxMzJcdTViNThcdTU2NjgKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPVx1NTE2N1x1NWJiOVx1NTEzMlx1NWI1OFx1NTY2OAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPVx1NTE2N1x1NWJiOVx1NTE2N1x1NjU4NwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPVx1NTE2N1x1NWJiOVx1NWRlNVx1NTE3N1x1NTIxNwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1cdTcyYzBcdTYxNGJcdTUxMzJcdTViNThcdTU2NjgKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVx1NzJjMFx1NjE0Ylx1NTE2N1x1NWJiOQotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9XHU3MmMwXHU2MTRiXHU1ZGU1XHU1MTc3XHU1MjE3Ci0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPVVEREkgXHU1NTQ2XHU2OTZkXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHU4ODY4XHU1NWFlCi1GT1JNX1RJVExFX1VERElfUkVHSVNUUllfREVUQUlMUz1VRERJIFx1NzY3Ylx1OTMwNFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfREVUQUlMUz1VRERJIFx1NjcwZFx1NTJkOVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9VURESSBcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjJcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPVdTREwgXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5XHU4ODY4XHU1NWFlCi1GT1JNX1RJVExFX1dTSUxfREVUQUlMUz1XU0lMIFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotCi0jIFZpZXcgdGl0bGVzCi1WSUVXX1RJVExFX1VERElfQlVTSU5FU1NfTElTVD1VRERJIFx1NTU0Nlx1Njk2ZFx1NmUwNVx1NTVhZVx1ODk5Nlx1NTcxNgotVklFV19USVRMRV9VRERJX1JFR0lTVFJZX0xJU1Q9VURESSBcdTc2N2JcdTkzMDRcdTZlMDVcdTU1YWVcdTg5OTZcdTU3MTYKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9MSVNUPVVEREkgXHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyXHU2ZTA1XHU1NWFlXHU4OTk2XHU1NzE2Ci1WSUVXX1RJVExFX1VERElfU0VSVklDRV9MSVNUPVVEREkgXHU2NzBkXHU1MmQ5XHU2ZTA1XHU1NWFlXHU4OTk2XHU1NzE2Ci1WSUVXX1RJVExFX1dTRExfU0VSVklDRV9MSVNUPVdTREwgXHU2NzBkXHU1MmQ5XHU2ZTA1XHU1NWFlXHU4OTk2XHU1NzE2Ci1WSUVXX1RJVExFX1dTSUxfTElTVD1XU0lMIFx1OTNjOFx1N2Q1MFx1NmUwNVx1NTVhZVx1ODk5Nlx1NTcxNgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTcyYjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1VRERJCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9VRERJX01BSU49VURESSBNYWluCi1OT0RFX05BTUVfUVVFUklFU19GT0xERVI9RXhlY3V0ZWQgUXVlcmllcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9CVVNJTkVTU0VTX0ZPTERFUj1QdWJsaXNoZWQgQnVzaW5lc3NlcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFU19GT0xERVI9UHVibGlzaGVkIFNlcnZpY2VzCi1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVI9UHVibGlzaGVkIFNlcnZpY2UgSW50ZXJmYWNlcwotCi0jIE9wZW5SZWdpc3RyeUFjdGlvbgotQUxUX09QRU5fUkVHSVNUUlk9T3BlbiBSZWdpc3RyeQotRk9STV9MQUJFTF9PUEVOX1JFR0lTVFJZX0RFU0M9U3BlY2lmeSB0aGUgbmFtZSBhbmQgaW5xdWlyeSBVUkwgb2YgdGhlIHJlZ2lzdHJ5IHRvIGJlIG9wZW5lZC4gU2VsZWN0aW5nIGEgZmF2b3JpdGUgcmVnaXN0cnkgd2lsbCBhdXRvbWF0aWNhbGx5IGZpbGwgaW4gdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIG9wZW4gdGhlIHJlZ2lzdHJ5LgotRk9STV9MQUJFTF9GQVZPUklURV9SRUdJU1RSWT1GYXZvcml0ZSBSZWdpc3RyeQotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPVJlZ2lzdHJ5IE5hbWUKLUZPUk1fTEFCRUxfSU5RVUlSWV9VUkw9SW5xdWlyeSBVUkwKLUZPUk1fTEFCRUxfQ0hFQ0tfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVM9Q2hlY2sgZm9yIHVzZXItZGVmaW5lZCBjYXRlZ29yaWVzCi1ERUZBVUxUX1JFR0lTVFJZX05BTUU9SUJNIFVEREkgVGVzdCBSZWdpc3RyeQotTVNHX0VSUk9SX0lOVkFMSURfUkVHSVNUUllfTkFNRT1JV0FCMDEzNkUgRW50ZXIgYSB2YWxpZCByZWdpc3RyeSBuYW1lLgotTVNHX0VSUk9SX0lOVkFMSURfSU5RVUlSWV9VUkw9SVdBQjAxMzhFIEVudGVyIGEgdmFsaWQgaW5xdWlyeSBVUkwuCi1NU0dfSU5GT19SRUdJU1RSWV9PUEVORUQ9SVdBQjAxMzlJIFRoZSByZWdpc3RyeSBuYW1lZCAlMSBsb2NhdGVkIGF0ICUyIHdhcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5LgotRk9STV9MQUJFTF9JU19XRUJTUEhFUkVfVURESV9SRUdJU1RSWT1JcyBXZWJTcGhlcmUgVURESSByZWdpc3RyeT8KLURFRkFVTFRfUkVHSVNUUllfTkFNRV9XRUJTUEhFUkU9SUJNIFdlYlNwaGVyZSBQcml2YXRlIFVEREkgUmVnaXN0cnkKLUZPUk1fTEFCRUxfUkVHSVNUUllfSE9TVD1Ib3N0Ci1GT1JNX0xBQkVMX1JFR0lTVFJZX1BPUlQ9UG9ydAotCi0jIFVzZXItZGVmaW5lZCBDYXRlZ29yaWVzCi1GT1JNX0xBQkVMX0FERF9DQVRFR09SWV9EQVRBPTxhIGhyZWY9IiUxIj5DbGljayBoZXJlPC9hPiB0byBsb2FkIHRoaXMgY2F0ZWdvcnkncyBkYXRhLgotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0ZJTEU9Q2F0ZWdvcnkgZGF0YSBmaWxlIG5hbWUKLU1TR19JTkZPX05PX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTX0ZPVU5EPUlXQUIwMzcxSSBObyB1c2VyIGRlZmluZWQgY2F0ZWdvcmllcyBkZXRlY3RlZC4KLU1TR19JTkZPX05PX0NBVEVHT1JZX0RBVEE9SVdBQjAzNzJJIENhdGVnb3J5IGRhdGEgZm9yICUxIGlzIG5vdCBhdmFpbGFibGUgb3IgaXMgaW52YWxpZC4KLU1TR19JTkZPX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0xPQURFRD1JV0FCMDM3M0kgRGF0YSBmb3IgdXNlciBkZWZpbmVkIGNhdGVnb3J5ICUxIHdhcyBzdWNjZXNzZnVsbHkgbG9hZGVkLgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRV9LRVk9SVdBQjAzNzRFIEludmFsaWQgZGF0YSBmaWxlIGZvciB1c2VyIGRlZmluZWQgY2F0ZWdvcnkgJTEuIEEgY2F0ZWdvcnkga2V5ICclMicgd2FzIGZvdW5kIGJ1dCAnJTMnIHdhcyBleHBlY3RlZC4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfRk9STUFUPUlXQUIwNDczRSBVbmtub3duIGZvcm1hdCBpbiBsaW5lOiAlMSBvZiB0aGUgZGF0YSBmaWxlIGZvciB1c2VyIGRlZmluZWQgY2F0ZWdvcnkgJTIuIFRoZSBsaW5lIGlzOiAiJTMiCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFPUlXQUIwMzc1RSBJbnZhbGlkIGRhdGEgZmlsZSBmb3IgdXNlciBkZWZpbmVkIGNhdGVnb3J5ICUxLgotTVNHX0VSUk9SX1NBVklOR19DQVRFR09SWV9EQVRBPUlXQUIwNDc0RSBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNhdmluZyBkYXRhIGZvciBjYXRlZ29yeSAlMS4gRXhjZXB0aW9uIHRleHQ6ICUyCi0KLSMgVURESSBDYXRlZ29yeSBCcm93c2VyCi1USVRMRV9DQVRFR09SWV9CUk9XU0VSPUNhdGVnb3J5IEJyb3dzZXIKLUFMVF9DQVRFR09SSUVTPUNhdGVnb3JpZXMKLQotIyBEZXRhaWxzCi1BTFRfUkVHSVNUUllfREVUQUlMUz1SZWdpc3RyeSBEZXRhaWxzCi1BTFRfQlVTSU5FU1NfREVUQUlMUz1CdXNpbmVzcyBEZXRhaWxzCi1BTFRfU0VSVklDRV9ERVRBSUxTPVNlcnZpY2UgRGV0YWlscwotQUxUX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9U2VydmljZSBJbnRlcmZhY2UgRGV0YWlscwotRk9STV9MQUJFTF9ERVRBSUxTX0VESVRBQkxFPURldGFpbHMgZm9yIDxzdHJvbmc+JTE8L3N0cm9uZz4gYXJlIHNob3duIGJlbG93LiBTb21lIGl0ZW1zIG1heSBiZSBhZGRlZCwgcmVtb3ZlZCwgb3IgY2hhbmdlZC4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkIGZvciBjaGFuZ2VzLiBPdGhlciBhY3Rpb25zIGFyZSBsaXN0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIHBhZ2UuCi0KLSMgR2V0Ci1BTFRfR0VUPUdldAotCi0jIENvbW1vbiBGb3JtIENvbnRyb2wgVGl0bGUKLUZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUU9TmFtZSB2YWx1ZQotRk9STV9DT05UUk9MX1RJVExFX0RFU0NSSVBUSU9OX1RFWFRfVkFMVUU9RGVzY3JpcHRpb24gdmFsdWUKLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfTkFNRT1DYXRlZ29yeSBrZXkgbmFtZQotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRT1DYXRlZ29yeSBrZXkgdmFsdWUKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FPUlkZW50aWZpZXIga2V5IG5hbWUKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9WQUxVRT1JZGVudGlmaWVyIGtleSB2YWx1ZQotRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkw9RGlzY292ZXJ5IFVSTAotCi0jIEZpbmQgYWN0aW9ucwotQUxUX0ZJTkQ9RmluZAotQUxUX1NVQlFVRVJZPUZpbmQgJTEgU3VicXVlcnkKLUZPUk1fTEFCRUxfUVVFUllfTkFNRT1OYW1lIG9mIHRoaXMgcXVlcnkKLURFRkFVTFRfUVVFUllfTkFNRT1xdWVyeSByZXN1bHRzCi1ERUZBVUxUX1NVQlFVRVJZX05BTUU9JTEgLSAlMiBzdWJxdWVyeQotRk9STV9MQUJFTF9TRUFSQ0hfRk9SPVNlYXJjaCBmb3IKLUZPUk1fT1BUSU9OX0JVU0lORVNTRVM9QnVzaW5lc3NlcwotRk9STV9PUFRJT05fU0VSVklDRVM9U2VydmljZXMKLUZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUz1TZXJ2aWNlIEludGVyZmFjZXMKLUZPUk1fTEFCRUxfU0VBUkNIX1RZUEU9VHlwZSBvZiBzZWFyY2gKLUZPUk1fUkFESU9fU0lNUExFPVNpbXBsZQotRk9STV9SQURJT19BRFZBTkNFRD1BZHZhbmNlZAotRk9STV9SQURJT19VVUlEPVVVSUQKLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU0VTX1NJTVBMRV9ERVNDPUVudGVyIHRoZSBwYXJ0aWFsIG9yIGNvbXBsZXRlIG5hbWUgb2YgYSBidXNpbmVzcyB0byBzZWFyY2ggZm9yLiBUaGUgJyUnIHN5bWJvbCBjYW4gYmUgdXNlZCBhcyBhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIGV4ZWN1dGUgdGhlIHNlYXJjaC4KLUZPUk1fTEFCRUxfRklORF9BRFZBTkNFRF9ERVNDPUVudGVyIHZhbHVlcyBmb3Igb25lIG9yIG1vcmUgb2YgdGhlIHBhcmFtZXRlcnMgbGlzdGVkIGJlbG93LiBUaGUgJyUnIHN5bWJvbCBjYW4gYmUgdXNlZCBhcyBhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluIHRoZSBOYW1lIGZpZWxkIG9mIHRoZSBOYW1lcyB0YWJsZS4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIGV4ZWN1dGUgdGhlIHNlYXJjaC4KLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU19VVUlEX0RFU0M9RW50ZXIgdGhlIFVVSUQgb2YgdGhlIGJ1c2luZXNzIHRvIHNlYXJjaCBmb3IuIFByZXNzIDxzdHJvbmc+R288L3N0cm9uZz4gdG8gZXhlY3V0ZSB0aGUgc2VhcmNoLgotRk9STV9MQUJFTF9OQU1FUz1OYW1lcwotRk9STV9MSU5LX0FERD1BZGQKLUZPUk1fTElOS19HRVQ9R2V0Ci1GT1JNX0xJTktfRklORD1GaW5kCi1GT1JNX0xJTktfUkVNT1ZFPVJlbW92ZQotRk9STV9MQUJFTF9PV05FRD1Pd25lZAotRk9STV9MQUJFTF9QVUJMSVNIX1VSTD1QdWJsaXNoIFVSTAotRk9STV9MQUJFTF9VU0VSSUQ9VXNlciBJRAotRk9STV9MQUJFTF9QQVNTV09SRD1QYXNzd29yZAotRk9STV9MQUJFTF9MQU5HVUFHRT1MYW5ndWFnZQotRk9STV9MQUJFTF9OQU1FPU5hbWUKLUZPUk1fTEFCRUxfREVTQ1JJUFRJT049RGVzY3JpcHRpb24KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VOPUVuZ2xpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FBPUFmYXIKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FCPUFia2hhemlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQUY9QWZyaWthYW5zCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BTT1BbWhhcmljCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BUj1BcmFiaWMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FTPUFzc2FtZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BWT1BeW1hcmEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FaPUF6ZXJiYWlqYW5pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CQT1CYXNoa2lyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CRT1CeWVsb3J1c3NpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JHPUJ1bGdhcmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQkg9QmloYXJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CST1CaXNsYW1hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CTj1CZW5nYWxpOyBCYW5nbGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JPPVRpYmV0YW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JSPUJyZXRvbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQ0E9Q2F0YWxhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQ089Q29yc2ljYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NaPUN6ZWNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DWT1XZWxzaAotRk9STV9PUFRJT05fTEFOR1VBR0VfREE9RGFuaXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ERT1HZXJtYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RaPUJodXRhbmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VMPUdyZWVrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTz1Fc3BlcmFudG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VTPVNwYW5pc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VUPUVzdG9uaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FVT1CYXNxdWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZBPVBlcnNpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZJPUZpbm5pc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZKPUZpamkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZPPUZhZXJvZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GUj1GcmVuY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZZPUZyaXNpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dBPUlyaXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HRD1TY290cyBHYWVsaWMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dMPUdhbGljaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HTj1HdWFyYW5pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HVT1HdWphcmF0aQotRk9STV9PUFRJT05fTEFOR1VBR0VfSEE9SGF1c2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hJPUhpbmRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IUj1Dcm9hdGlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfSFU9SHVuZ2FyaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IWT1Bcm1lbmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfSUE9SW50ZXJsaW5ndWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lFPUludGVybGluZ3VlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JSz1JbnVwaWFrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JTj1JbmRvbmVzaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JUz1JY2VsYW5kaWMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lUPUl0YWxpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lXPUhlYnJldwotRk9STV9PUFRJT05fTEFOR1VBR0VfSkE9SmFwYW5lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pJPVlpZGRpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pXPUphdmFuZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LQT1HZW9yZ2lhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfS0s9S2F6YWtoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTD1HcmVlbmxhbmRpYwotRk9STV9PUFRJT05fTEFOR1VBR0VfS009Q2FtYm9kaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTj1LYW5uYWRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTz1Lb3JlYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tTPUthc2htaXJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LVT1LdXJkaXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LWT1LaXJnaGl6Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9MQT1MYXRpbgotRk9STV9PUFRJT05fTEFOR1VBR0VfTE49TGluZ2FsYQotRk9STV9PUFRJT05fTEFOR1VBR0VfTE89TGFvdGhpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xUPUxpdGh1YW5pYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xWPUxhdHZpYW4sIExldHRpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01HPU1hbGFnYXN5Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9NST1NYW9yaQotRk9STV9PUFRJT05fTEFOR1VBR0VfTUs9TWFjZWRvbmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfTUw9TWFsYXlhbGFtCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTj1Nb25nb2xpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01PPU1vbGRhdmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfTVI9TWFyYXRoaQotRk9STV9PUFRJT05fTEFOR1VBR0VfTVM9TWFsYXkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01UPU1hbHRlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01ZPUJ1cm1lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05BPU5hdXJ1Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9ORT1OZXBhbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05MPUR1dGNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9OTz1Ob3J3ZWdpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09DPU9jY2l0YW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09NPShBZmFuKSBPcm9tbwotRk9STV9PUFRJT05fTEFOR1VBR0VfT1I9T3JpeWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BBPVB1bmphYmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BMPVBvbGlzaAotRk9STV9PUFRJT05fTEFOR1VBR0VfUFM9UGFzaHRvLCBQdXNodG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BUPVBvcnR1Z3Vlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1FVPVF1ZWNodWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JNPVJoYWV0by1Sb21hbmNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STj1LaXJ1bmRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STz1Sb21hbmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfUlU9UnVzc2lhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfUlc9S2lueWFyd2FuZGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NBPVNhbnNrcml0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TRD1TaW5kaGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NHPVNhbmdybwotRk9STV9PUFRJT05fTEFOR1VBR0VfU0g9U2VyYm8tQ3JvYXRpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NJPVNpbmdoYWxlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NLPVNsb3ZhawotRk9STV9PUFRJT05fTEFOR1VBR0VfU0w9U2xvdmVuaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTT1TYW1vYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NOPVNob25hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTz1Tb21hbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NRPUFsYmFuaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUj1TZXJiaWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUz1TaXN3YXRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVD1TZXNvdGhvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVT1TdW5kYW5lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NWPVN3ZWRpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NXPVN3YWhpbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RBPVRhbWlsCi1GT1JNX09QVElPTl9MQU5HVUFHRV9URT1UZWd1bHUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RHPVRhamlrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9USD1UaGFpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UST1UaWdyaW55YQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEs9VHVya21lbgotRk9STV9PUFRJT05fTEFOR1VBR0VfVEw9VGFnYWxvZwotRk9STV9PUFRJT05fTEFOR1VBR0VfVE49U2V0c3dhbmEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RPPVRvbmdhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UUj1UdXJraXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UUz1Uc29uZ2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RUPVRhdGFyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVz1Ud2kKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VLPVVrcmFpbmlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfVVI9VXJkdQotRk9STV9PUFRJT05fTEFOR1VBR0VfVVo9VXpiZWsKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ZJPVZpZXRuYW1lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ZPPVZvbGFwdWsKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1dPPVdvbG9mCi1GT1JNX09QVElPTl9MQU5HVUFHRV9YSD1YaG9zYQotRk9STV9PUFRJT05fTEFOR1VBR0VfWU89WW9ydWJhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aSD1DaGluZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aVT1adWx1Ci1GT1JNX0xBQkVMX0VYQUNUX05BTUVfTUFUQ0g9RXhhY3QgbWF0Y2gKLUZPUk1fTEFCRUxfQ0FTRV9TRU5TSVRJVkVfTUFUQ0g9Q2FzZSBzZW5zaXRpdmUKLUZPUk1fTEFCRUxfU09VTkRFWD1Tb3VuZCBhbGlrZQotRk9STV9MQUJFTF9JREVOVElGSUVSUz1JZGVudGlmaWVycwotRk9STV9MQUJFTF9JREVOVElGSUVSX1RZUEU9VHlwZQotCi0jIERvIG5vdCB0cmFuc2xhdGUgdGhlIHR3byBpdGVtcyBiZWxvdy4KLUZPUk1fT1BUSU9OX0lERU5USUZJRVJfRFVOUz1ELVUtTi1TCi1GT1JNX09QVElPTl9JREVOVElGSUVSX1RIT01BU19SRUdJU1RSWT1UaG9tYXMgUmVnaXN0cnkKLQotRk9STV9MQUJFTF9LRVlfTkFNRT1LZXkgbmFtZQotRk9STV9MQUJFTF9LRVlfVkFMVUU9S2V5IHZhbHVlCi1GT1JNX0xBQkVMX0NBVEVHT1JJRVM9Q2F0ZWdvcmllcwotRk9STV9MQUJFTF9DQVRFR09SWV9UWVBFPVR5cGUKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX05BSUNTPU5BSUNTCi1GT1JNX09QVElPTl9DQVRFR09SWV9VTlNQU0NfNzM9VU5TUFNDIDcuMwotRk9STV9PUFRJT05fQ0FURUdPUllfR0VPPUdFTwotRk9STV9PUFRJT05fQ0FURUdPUllfRFdDT01NVU5JVFk9ZFcgQ29tbXVuaXR5Ci1GT1JNX0xBQkVMX0JVU0lORVNTX0NBVEVHT1JJRVM9Q29tcGFyZSB3aXRoOgotRk9STV9PUFRJT05fQlVTSU5FU1NFU19PTkxZPUJ1c2luZXNzZXMgb25seQotRk9STV9PUFRJT05fU0VSVklDRVNfT05MWT1TZXJ2aWNlcyBvbmx5Ci1GT1JNX09QVElPTl9CT1RIPUJ1c2luZXNzZXMgYW5kIFNlcnZpY2VzCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTFM9RGlzY292ZXJ5IFVSTHMKLUZPUk1fTEFCRUxfRElTQ09WRVJZVVJMPURpc2NvdmVyeSBVUkwKLUZPUk1fTEFCRUxfRklORFFVQUxJRklFUlM9RmluZCBRdWFsaWZpZXJzCi1GT1JNX0xBQkVMX0NPTUJJTkVfS0VZUz1Db21iaW5lIGtleXM6Ci1GT1JNX09QVElPTl9BTkRBTExLRVlTPUFuZAotRk9STV9PUFRJT05fT1JBTExLRVlTPU9yCi1GT1JNX09QVElPTl9PUkxJS0VLRVlTPU9yIExpa2UKLUZPUk1fTEFCRUxfU09SVF9CWV9OQU1FPVNvcnQgYnkgbmFtZToKLUZPUk1fUkFESU9fU09SVF9BU0M9QXNjZW5kaW5nCi1GT1JNX1JBRElPX1NPUlRfREVTQz1EZXNjZW5kaW5nCi1GT1JNX0xBQkVMX1NPUlRfQllfREFURT1Tb3J0IGJ5IGRhdGU6Ci1GT1JNX0xBQkVMX01BWF9TRUFSQ0hfU0VUPU1heGltdW0gc2l6ZSBvZiBzZWFyY2ggc2V0OgotRk9STV9MQUJFTF9NQVhfUkVTVUxUUz1NYXhpbXVtIG51bWJlciBvZiByZXN1bHRzOgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VTX1NJTVBMRV9ERVNDPUVudGVyIHRoZSBwYXJ0aWFsIG9yIGNvbXBsZXRlIG5hbWUgb2YgYSBzZXJ2aWNlIHRvIHNlYXJjaCBmb3IuIFRoZSAnJScgc3ltYm9sIGNhbiBiZSB1c2VkIGFzIGEgd2lsZGNhcmQgdGhhdCBtYXRjaGVzIGFueSBjaGFyYWN0ZXIuIFByZXNzIDxzdHJvbmc+R288L3N0cm9uZz4gdG8gZXhlY3V0ZSB0aGUgc2VhcmNoLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfVVVJRF9ERVNDPUVudGVyIHRoZSBVVUlEIG9mIHRoZSBzZXJ2aWNlIHRvIHNlYXJjaCBmb3IuIFByZXNzIDxzdHJvbmc+R288L3N0cm9uZz4gdG8gZXhlY3V0ZSB0aGUgc2VhcmNoLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFU19TSU1QTEVfREVTQz1FbnRlciB0aGUgcGFydGlhbCBvciBjb21wbGV0ZSBuYW1lIG9mIGEgc2VydmljZSBpbnRlcmZhY2UgdG8gc2VhcmNoIGZvci4gVGhlICclJyBzeW1ib2wgY2FuIGJlIHVzZWQgYXMgYSB3aWxkY2FyZCB0aGF0IG1hdGNoZXMgYW55IGNoYXJhY3Rlci4gUHJlc3MgPHN0cm9uZz5Hbzwvc3Ryb25nPiB0byBleGVjdXRlIHRoZSBzZWFyY2guCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRV9JTlRFUkZBQ0VfVVVJRF9ERVNDPUVudGVyIHRoZSBVVUlEIG9mIHRoZSBzZXJ2aWNlIGludGVyZmFjZSB0byBzZWFyY2ggZm9yLiBQcmVzcyA8c3Ryb25nPkdvPC9zdHJvbmc+IHRvIGV4ZWN1dGUgdGhlIHNlYXJjaC4KLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VTPVNlcnZpY2UgSW50ZXJmYWNlcwotRk9STV9MQUJFTF9VVUlEX0tFWT1VVUlEIEtleToKLUZPUk1fTEFCRUxfVVNFX1NFUlZJQ0U9VXNlIHNlcnZpY2UKLUZPUk1fTEFCRUxfU0VSVklDRT1TZXJ2aWNlCi1GT1JNX0xBQkVMX0JVU0lORVNTPUJ1c2luZXNzCi1GT1JNX0xBQkVMX1BVQkxJU0hfQVNTRVJUSU9OUz1QdWJsaXNoZXIgQXNzZXJ0aW9ucwotRk9STV9MQUJFTF9ESVJFQ1RJT049RGlyZWN0aW9uCi1GT1JNX0xBQkVMX0ZST01fS0VZPUZyb20gS2V5Ci1GT1JNX0xBQkVMX1RPX0tFWT1UbyBLZXkKLUZPUk1fTEFCRUxfU1RBVFVTPVN0YXR1cwotRk9STV9MQUJFTF9BU1NFUlRJT05fVFlQRT1Bc3NlcnRpb24gVHlwZQotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEFSRU5UX0NISUxEPVBhcmVudC1DaGlsZAotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEVFUl9UT19QRUVSPVBlZXItUGVlcgotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfSURFTlRJVFk9SWRlbnRpdHkKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX0RJUkVUSU9OX0RFU0M9RGlyZWN0aW9uIDxzdHJvbmc+RnJvbTwvc3Ryb25nPiB3aWxsIGNyZWF0ZSBhIHB1Ymxpc2hlciBhc3NlcnRpb24gZnJvbSB0aGlzIGJ1c2luZXNzIHRvIHRoZSBidXNpbmVzc2VzIGFib3ZlLiAgRGlyZWN0aW9uIDxzdHJvbmc+VG88L3N0cm9uZz4gd2lsbCBjcmVhdGUgYSBwdWJsaXNoZXIgYXNzZXJ0aW9uIGZyb20gdGhlIGFib3ZlIGJ1c2luZXNzZXMgdG8gdGhpcyBidXNpbmVzcy4KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9ESVJFQ1RJT05fRlJPTT0tLS0+Ci1GT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX1RPPTwtLS0KLUZPUk1fTEFCRUxfVEhJU19CVVNJTkVTUz1UaGlzCi1NU0dfRVJST1JfSU5WQUxJRF9RVUVSWV9OQU1FPUlXQUIwMTQwRSBFbnRlciBhIHZhbGlkIG5hbWUgZm9yIHRoZSBxdWVyeS4KLU1TR19FUlJPUl9JTlZBTElEX05BTUVTPUlXQUIwMTQxRSBFbnRlciBhIHNlcmllcyBvZiB2YWxpZCBuYW1lcy4KLU1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMPUlXQUIwMTQyRSBFbnRlciBhIHZhbGlkIHB1Ymxpc2ggVVJMLgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEPUlXQUIwMTQzRSBFbnRlciBhIHZhbGlkIHVzZXIgSUQuCi1NU0dfRVJST1JfSU5WQUxJRF9NQVhfU0VBUkNIX1NFVD1JV0FCMDE0NUUgRW50ZXIgYSB2YWxpZCBzaXplIGZvciB0aGUgbWF4aW11bSBzZWFyY2ggc2V0LgotTVNHX0VSUk9SX0lOVkFMSURfTUFYX1JFU1VMVFM9SVdBQjAxNDZFIEVudGVyIGEgdmFsaWQgc2l6ZSBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMuCi1NU0dfSU5GT19CVVNJTkVTU0VTX0ZPVU5EPUlXQUIwMTQ3SSBOdW1iZXIgb2YgYnVzaW5lc3NlcyBmb3VuZDogJTEKLU1TR19FUlJPUl9OT19CVVNJTkVTU0VTX0ZPVU5EPUlXQUIwMTQ4RSBObyBidXNpbmVzc2VzIGZvdW5kLgotTVNHX0lORk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNDlJIE51bWJlciBvZiBzZXJ2aWNlcyBmb3VuZDogJTEKLU1TR19FUlJPUl9OT19TRVJWSUNFU19GT1VORD1JV0FCMDE1MEUgTm8gc2VydmljZXMgZm91bmQuCi1NU0dfRVJST1JfU0lOR0xFX0lURU09SVdBQjAxNTFFIFNlbGVjdCBqdXN0IG9uZSBpdGVtLgotTVNHX1FVRVNUSU9OX0lURU1fUkVQTEFDRU1FTlQ9VGhlIHNlbGVjdGlvbiB3aWxsIHJlcGxhY2UgYW4gaXRlbSBhbHJlYWR5IGluIHRoZSB0YXJnZXQuIERvIHlvdSB3aXNoIHRvIHByb2NlZWQ/Ci1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQ9SVdBQjAxNTJJIE51bWJlciBvZiBzZXJ2aWNlIGludGVyZmFjZXMgZm91bmQ6ICUxCi1NU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUzRSBObyBzZXJ2aWNlIGludGVyZmFjZXMgZm91bmQuCi1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDE1NEUgU2VsZWN0IGF0IGxlYXN0IG9uZSBpdGVtLgotTVNHX0VSUk9SX0lOVkFMSURfVVVJRF9LRVk9SVdBQjAxNTVFIEVudGVyIGEgdmFsaWQgVVVJRCBrZXkuCi1NU0dfRVJST1JfUVVFUllfTkFNRV9DT05GTElDVD1JV0FCMDE1NkUgVGhlIHN1YnF1ZXJ5J3MgcXVlcnkgbmFtZSBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmF0b3IuCi1NU0dfRVJST1JfTk9fSVRFTVNfVE9fR0VUPUlXQUIwMTU3RSBObyBpdGVtcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaGF2ZSBiZWVuIHB1Ymxpc2hlZCBvciBkaXNjb3ZlcmVkIHlldC4KLQotIyBSZXN1bHRzCi1BTFRfUVVFUllfUkVTVUxUUz1RdWVyeSBSZXN1bHRzCi1GT1JNX0xBQkVMX1NVQlFVRVJZPVRoZSByZXN1bHRzIG1heSBiZSB1c2VkIGFzIGlucHV0cyBvZiBhbm90aGVyIG9wZXJhdGlvbi4gQ2xpY2sgdGhlIDxzdHJvbmc+dGFyZ2V0PC9zdHJvbmc+IGxpbmsgYXQgdGhlIHRvcCB0byBzZWUgdGhlIG9wZXJhdGlvbi4gU2VsZWN0ZWQgcmVzdWx0cyBjYW4gYmUgdXNlZCBpbiB0aGUgb3BlcmF0aW9uIGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPlRyYW5zZmVyPC9zdHJvbmc+IGJ1dHRvbi4KLUZPUk1fTEFCRUxfUVVFUlk9U2VsZWN0IGEgcmVzdWx0IHRvIHNlZSBtb3JlIGRldGFpbHMgb3Igc2VsZWN0IGEgc2V0IG9mIHJlc3VsdHMgYW5kIGNsaWNrIGEgYnV0dG9uIHRvIHBlcmZvcm0gYW4gb3BlcmF0aW9uLgotRk9STV9MSU5LX1RBUkdFVD10YXJnZXQKLUZPUk1fQlVUVE9OX1RSQU5TRkVSPVRyYW5zZmVyCi1GT1JNX0JVVFRPTl9SRUZSRVNIPVJlZnJlc2gKLUZPUk1fQlVUVE9OX0FERF9UT19GQVZPUklURVM9QWRkIHRvIGZhdm9yaXRlcwotRk9STV9CVVRUT05fVU5QVUJMSVNIPVVucHVibGlzaAotRk9STV9CVVRUT05fQ0xFQVI9Q2xlYXIKLQotIyBQdWJsaXNoIGFjdGlvbnMKLUFMVF9QVUJMSVNIPVB1Ymxpc2gKLUZPUk1fTEFCRUxfUFVCTElTSD1QdWJsaXNoOgotRk9STV9PUFRJT05fQlVTSU5FU1M9QnVzaW5lc3MKLUZPUk1fT1BUSU9OX1NFUlZJQ0U9U2VydmljZQotRk9STV9PUFRJT05fU0VSVklDRV9JTlRFUkZBQ0U9U2VydmljZSBJbnRlcmZhY2UKLUZPUk1fTEFCRUxfUFVCTElTSF9CVVNJTkVTU19TSU1QTEVfREVTQz1FbnRlciBhIG5hbWUgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgYnVzaW5lc3MgdG8gYmUgcHVibGlzaGVkLiBBdXRoZW50aWNhdGlvbiBtYXkgYmUgcmVxdWlyZWQuCi1GT1JNX0xBQkVMX1BVQkxJU0hfQlVTSU5FU1NfQURWQU5DRURfREVTQz1Qcm92aWRlIGEgbmFtZSBmb3IgdGhlIGJ1c2luZXNzIHRvIGJlIHB1Ymxpc2hlZC4gT3RoZXIgcGFyYW1ldGVycyBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZC4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX1NJTVBMRV9ERVNDPUdldCBvciBmaW5kIGEgYnVzaW5lc3MgYW5kIHRoZW4gcHJvdmlkZSB0aGUgV1NETCBVUkwsIG5hbWUgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgc2VydmljZSB0byBiZSBwdWJsaXNoZWQuIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZC4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0M9R2V0IG9yIGZpbmQgYSBidXNpbmVzcyBhbmQgdGhlbiBwcm92aWRlIHRoZSBXU0RMIFVSTCBhbmQgYSBuYW1lIGZvciB0aGUgc2VydmljZSB0byBiZSBwdWJsaXNoZWQuIE90aGVyIHBhcmFtZXRlcnMgbWF5IGFsc28gYmUgc3BlY2lmaWVkLiBBdXRoZW50aWNhdGlvbiBtYXkgYmUgcmVxdWlyZWQuCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQz1Qcm92aWRlIHRoZSBXU0RMIFVSTCwgbmFtZSBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBzZXJ2aWNlIHRvIGJlIHB1Ymxpc2hlZC4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkLgotRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQz1Qcm92aWRlIHRoZSBXU0RMIFVSTCBhbmQgYSBuYW1lIGZvciB0aGUgc2VydmljZSB0byBiZSBwdWJsaXNoZWQuIE90aGVyIHBhcmFtZXRlcnMgbWF5IGFsc28gYmUgc3BlY2lmaWVkLiBBdXRoZW50aWNhdGlvbiBtYXkgYmUgcmVxdWlyZWQuCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0VfU0lNUExFX0RFU0M9RW50ZXIgYSBXU0RMIFVSTCwgbmFtZSBhbmQgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBzZXJ2aWNlIGludGVyZmFjZSB0byBiZSBwdWJsaXNoZWQuIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZC4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9BRFZBTkNFRF9ERVNDPVByb3ZpZGUgdGhlIFdTREwgVVJMIGFuZCBuYW1lIGZvciB0aGUgc2VydmljZSBpbnRlcmZhY2UgdG8gYmUgcHVibGlzaGVkLiBPdGhlciBwYXJhbWV0ZXJzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkLgotRk9STV9MQUJFTF9QVUJMSVNIX0ZPUk09UHVibGljYXRpb24gZm9ybWF0Ci1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPURlc2NyaXB0aW9uCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OUz1EZXNjcmlwdGlvbnMKLU1TR19JTkZPX0JVU0lORVNTX1BVQkxJU0hFRD1JV0FCMDE1OEkgQnVzaW5lc3MgJTEgd2FzIHN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQuCi1NU0dfSU5GT19TRVJWSUNFX1BVQkxJU0hFRD1JV0FCMDE1OUkgU2VydmljZSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZC4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1BVQkxJU0hFRD1JV0FCMDE2MEkgU2VydmljZSBpbnRlcmZhY2UgJTEgd2FzIHN1Y2Nlc3NmdWxseSBwdWJsaXNoZWQuCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FPUlXQUIwMTYxRSBFbnRlciBhIHZhbGlkIG5hbWUuCi1NU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFPUlXQUIwMjUwRSBTZWxlY3QgYSBub24tYmxhbmsgbGFuZ3VhZ2UgZm9yIHRoZSAlMSBpbiByb3cgJTIuIE9ubHkgdGhlIGZpcnN0IHJvdyBjYW4gaGF2ZSBhIGJsYW5rIGxhbmd1YWdlLgotTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0U9SVdBQjAyNTFFIENoYW5nZSB0aGUgbGFuZ3VhZ2UgZm9yIHRoZSAlMSBpbiByb3cgJTIuIFRoZSBjdXJyZW50IG9uZSBpcyBhbHJlYWR5IGluIHVzZS4KLU1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUPUlXQUIwMjUyRSBFbnRlciBhIHZhbGlkICUxIGluIHJvdyAlMgotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkw9SVdBQjAyNTNFIEVudGVyIGEgdmFsaWQgV1NETCBVUkwuCi1NU0dfRVJST1JfTk9fTkFNRVM9SVdBQjAyNTRFIEFkZCBhdCBsZWFzdCBvbmUgbmFtZS4KLU1TR19FUlJPUl9JTlZBTElEX1NFUlZJQ0U9SVdBQjAyNTVFIFByb3ZpZGUgYSB2YWxpZCBzZXJ2aWNlLgotTVNHX0VSUk9SX0lOVkFMSURfQlVTSU5FU1M9SVdBQjAyNTZFIFByb3ZpZGUgYSB2YWxpZCBidXNpbmVzcy4KLQotIyBCdXNpbmVzcyBQdWJsaXNoIFNlcnZpY2UgYWN0aW9uCi1BTFRfUFVCTElTSF9TRVJWSUNFPVB1Ymxpc2ggU2VydmljZQotCi0jIFdTREwgQnJvd3NlcgotVElUTEVfV1NETF9CUk9XU0VSPVdTREwgQnJvd3NlciAtICUxCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFPVNlbGVjdCBhIFdTREwgc291cmNlOgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9XRUJQUk9KRUNUUz1XZWIgUHJvamVjdHMKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfRkFWT1JJVEVTPUZhdm9yaXRlcwotRk9STV9MQUJFTF9XRUJfUFJPSkVDVD1XZWIgUHJvamVjdAotRk9STV9MQUJFTF9XU0RMX1VSTD1XU0RMIFVSTAotQUxUX1dTRExfQlJPV1NFUj1XU0RMIEJyb3dzZXIKLQotIyBEZXRhaWxzCi1GT1JNX0xJTktfRURJVD1FZGl0Ci1GT1JNX0xJTktfQ0FOQ0VMPUNhbmNlbAotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9QnVzaW5lc3MgS2V5Ci1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPVNlcnZpY2UgS2V5Ci1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX0tFWT1UTW9kZWwgS2V5Ci1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPVVzZXIgRGVmaW5lZCBDYXRlZ29yaWVzCi1GT1JNX0xBQkVMX0NIRUNLRUQ9Q2hlY2tlZAotRk9STV9MQUJFTF9GSUxFPUZpbGUKLU1TR19RVUVTVElPTl9QVUJMSVNIX0lURU09VGhlIGl0ZW0gY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4gRG8geW91IHdpc2ggdG8gcHVibGlzaCBpdD8KLU1TR19RVUVTVElPTl9TRVJWSUNFX1BVQkxJU0hfQlVTSU5FU1M9VGhlIHNlcnZpY2UgYW5kIGl0cyBidXNpbmVzcyBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBQcm9jZWVkIHRvIHB1Ymxpc2g/Ci1NU0dfSU5GT19CVVNJTkVTU19VUERBVEVEPUlXQUIwMjU3SSBCdXNpbmVzcyAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuCi1NU0dfSU5GT19TRVJWSUNFX1VQREFURUQ9SVdBQjAyNThJIFNlcnZpY2UgJTEgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfVVBEQVRFRD1JV0FCMDI1OUkgU2VydmljZSBJbnRlcmZhY2UgJTEgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLgotTVNHX0lORk9fUkVHSVNUUllfVVBEQVRFRD1JV0FCMDMyM0kgUmVnaXN0cnkgJTEgd2FzIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLgotCi0jIFVucHVibGlzaEFjdGlvbgotQUxUX1VOUFVCTElTSF9CVVNJTkVTUz1VbnB1Ymxpc2ggQnVzaW5lc3MKLUFMVF9VTlBVQkxJU0hfU0VSVklDRT1VbnB1Ymxpc2ggU2VydmljZQotQUxUX1VOUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRT1VbnB1Ymxpc2ggU2VydmljZSBJbnRlcmZhY2UKLUZPUk1fTEFCRUxfVU5QVUJMSVNIX0RFU0M9UHJlc3MgPHN0cm9uZz5Hbzwvc3Ryb25nPiB0byB1bnB1Ymxpc2ggdGhpcyBvYmplY3QuIEF1dGhlbnRpY2F0aW9uIG1heSBiZSByZXF1aXJlZC4KLU1TR19JTkZPX0JVU0lORVNTX1VOUFVCTElTSEVEPUlXQUIwMjYwSSBCdXNpbmVzcyAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHVucHVibGlzaGVkLgotTVNHX0lORk9fU0VSVklDRV9VTlBVQkxJU0hFRD1JV0FCMDI2MUkgU2VydmljZSAlMSB3YXMgc3VjY2Vzc2Z1bGx5IHVucHVibGlzaGVkLgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfVU5QVUJMSVNIRUQ9SVdBQjAyNjJJIFNlcnZpY2UgSW50ZXJmYWNlICUxIHdhcyBzdWNjZXNzZnVsbHkgdW5wdWJsaXNoZWQuCi0KLSMgQWRkIHRvIFdTREwgUGVyc3BlY3RpdmUKLUFMVF9BRERfVE9fV1NETF9QRVJTUEVDVElWRT1BZGQgVG8gV1NETCBQYWdlCi1NU0dfSU5GT19XU0RMX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzZJICUxIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQgdG8gV1NETCBwYWdlLgotTVNHX0VSUk9SX1dTRExfTk9UX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzdFICUxIGNvdWxkIG5vdCBiZSBhZGRlZCB0byBXU0RMIHBhZ2UuCi0KLSMgQWRkIHRvIEZhdm9yaXRlcwotQUxUX0FERF9UT19GQVZPUklURVM9QWRkIFRvIEZhdm9yaXRlcwotTVNHX0lORk9fRkFWT1JJVEVfQURERUQ9SVdBQjAyNjNJICUxIHdhcyBzdWNjZXNzZnVsbHkgYWRkZWQgdG8gZmF2b3JpdGVzLgotTVNHX0VSUk9SX0ZBVk9SSVRFX05PVF9BRERFRD1JV0FCMDI2NEUgJTEgY291bGQgbm90IGJlIGFkZGVkIHRvIGZhdm9yaXRlcy4KLU1TR19FUlJPUl9GQVZPUklURV9BTFJFQURZX0VYSVNUUz1JV0FCMDMyNEUgJTEgYWxyZWFkeSBleGlzdHMgaW4gZmF2b3J0aWVzLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9RmF2b3JpdGUgYWxyZWFkeSBleGlzdHMuICBEbyB5b3Ugd2lzaCB0byBvdmVyd3JpdGU/Ci0KLSMgUmVmcmVzaAotTVNHX0lORk9fTk9ERV9SRUZSRVNIRUQ9SVdBQjAyNjVJICUxIHJlZnJlc2hlZC4KLU1TR19RVUVTVElPTl9SRU1PVkVfTk9ERT0lMSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBEbyB5b3Ugd2lzaCB0byBjbGVhciBpdD8KLQotIyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXMKLUFMVF9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFUz1NYW5hZ2UgUmVmZXJlbmNlZCBTZXJ2aWNlcwotRk9STV9MQUJFTF9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19ERVNDPUFkZCBkaXNjb3ZlcmVkIG9yIHB1Ymxpc2hlZCBzZXJ2aWNlcyB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VkIHNlcnZpY2VzIGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZCBTZXJ2aWNlczwvc3Ryb25nPiBidXR0b24uIFJlbW92ZSBzZWxlY3RlZCByZWZlcmVuY2VzIGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPlJlbW92ZSBSZWZlcmVuY2VzPC9zdHJvbmc+IGJ1dHRvbi4gQXV0aGVudGljYXRpb24gbWF5IGJlIHJlcXVpcmVkIGZvciBjaGFuZ2VzLgotRk9STV9MQUJFTF9SRUZFUkVOQ0VEX1NFUlZJQ0VTPVJlZmVyZW5jZWQgU2VydmljZXMKLUZPUk1fQlVUVE9OX0FERF9TRVJWSUNFUz1BZGQgU2VydmljZXMKLUZPUk1fQlVUVE9OX1JFTU9WRV9SRUZFUkVOQ0VTPVJlbW92ZSBSZWZlcmVuY2VzCi1NU0dfRVJST1JfTk9fUkVGRVJFTkNFX1NFTEVDVEVEPUlXQUIwMjY2RSBTZWxlY3QgYXQgbGVhc3Qgb25lIHJlZmVyZW5jZWQgc2VydmljZSBiZWZvcmUgcHJvY2VlZGluZy4KLU1TR19FUlJPUl9OT19TRVJWSUNFUz1JV0FCMDI2N0UgR2V0IG9yIGZpbmQgYXQgbGVhc3Qgb25lIHNlcnZpY2UgYmVmb3JlIHByb2NlZWRpbmcuCi1NU0dfRVJST1JfU0VSVklDRV9OT1RfUkVGRVJFTkNFRD1JV0FCMDI2OEUgU2VydmljZSAlMSBjb3VsZCBub3QgYmUgcmVmZXJlbmNlZC4KLU1TR19FUlJPUl9SRUZFUkVOQ0VfTk9UX1JFTU9WRUQ9SVdBQjAyNjlFIFNlcnZpY2UgcmVmZXJlbmNlICUxIGNvdWxkIG5vdCBiZSByZW1vdmVkLgotTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VEPUlXQUIwMjcwSSBTZXJ2aWNlICUxIHdhcyBzdWNjZXNzZnVsbHkgcmVmZXJlbmNlZC4KLU1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFX1JFTU9WRUQ9SVdBQjAyNzFJIFNlcnZpY2UgcmVmZXJlbmNlICUxIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KLQotIyBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zCi1BTFRfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPU1hbmFnZSBQdWJsaXNoZXIgQXNzZXJ0aW9ucwotRk9STV9MQUJFTF9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlNfREVTQz1BZGQgZGlzY292ZXJlZCBvciBwdWJsaXNoZWQgYnVzaW5lc3NlcyB0byB0aGUgbGlzdCBvZiBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBieSBjbGlja2luZyA8c3Ryb25nPkFkZCBBc3NlcnRpb25zPC9zdHJvbmc+LiBSZW1vdmUgc2VsZWN0ZWQgYXNzZXJ0aW9ucyBieSBjbGlja2luZyA8c3Ryb25nPlJlbW92ZSBBc3NlcnRpb25zPC9zdHJvbmc+LiBDb21wbGV0ZSBzZWxlY3RlZCBhc3NlcnRpb25zIGJ5IGNsaWNraW5nIDxzdHJvbmc+Q29tcGxldGUgQXNzZXJ0aW9uczwvc3Ryb25nPi4gQ2xpY2sgPHN0cm9uZz5SZWZyZXNoIEFzc2VydGlvbnM8L3N0cm9uZz4gdG8gcmVmcmVzaCB0aGUgbGlzdCBvZiBhc3NlcnRpb25zLgotRk9STV9MQUJFTF9JTkNPTVBMRVRFX0FTU0VSVElPTlNfVklTSUJJTElUWV9ERVNDPVBsZWFzZSBub3RlIHRoYXQgaW5jb21wbGV0ZSBwdWJsaXNoZXIgYXNzZXJ0aW9ucyBhcmUgdmlzaWJsZSBvbmx5IHRvIHRoZSBvd25lciBvZiB0aGUgYnVzaW5lc3MuCi1GT1JNX0xBQkVMX0JVU0lORVNTRVM9QnVzaW5lc3NlcwotRk9STV9CVVRUT05fU0hPV19BTExfUFVCTElTSEVSX0FTU0VSVElPTlM9UmVmcmVzaCBBc3NlcnRpb25zCi1GT1JNX0JVVFRPTl9DT01QTEVURV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1Db21wbGV0ZSBBc3NlcnRpb25zCi1GT1JNX0JVVFRPTl9BRERfUFVCTElTSEVSX0FTU0VSVElPTlM9QWRkIEFzc2VydGlvbnMKLUZPUk1fQlVUVE9OX1JFTU9WRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1SZW1vdmUgQXNzZXJ0aW9ucwotTVNHX0lORk9fUFVCTElTSEVSX0FTU0VSVElPTlNfUkVGUkVTSEVEPUlXQUIwMzI1SSBQdWJsaXNoZXIgQXNzZXJ0aW9ucyBhcmUgcmVmcmVzaGVkLgotTVNHX0VSUk9SX05PX0lOQ09NUExFVEVfQVNTRVJUSU9OX1NFTEVDVEVEPUlXQUIwMzI2RSBTZWxlY3QgYXQgbGVhc3Qgb25lIGluY29tcGxldGUgcHVibGlzaGVyIGFzc2VydGlvbi4KLU1TR19FUlJPUl9OT1RfT1dORURfQlVTSU5FU1M9SVdBQjAzMjdFIFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gYSBidXNpbmVzcyBvd25lZCBieSBhbm90aGVyIHBhcnR5LgotCi0jIEdldEJ1c2luZXNzZXMKLUFMVF9HRVRfQlVTSU5FU1M9R2V0IEJ1c2luZXNzCi1BTFRfR0VUX0JVU0lORVNTRVM9R2V0IEJ1c2luZXNzZXMKLU5PREVfTkFNRV9TRVJWSUNFX0JVU0lORVNTPUJ1c2luZXNzIGZvciBzZXJ2aWNlICUxCi1OT0RFX05BTUVfU0lfQlVTSU5FU1NFUz1CdXNpbmVzc2VzIGZvciBzZXJ2aWNlIGludGVyZmFjZSAlMQotTVNHX1FVRVNUSU9OX1JFTU9WRV9TRVJWSUNFX05PREU9VGhlIHNlcnZpY2UgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4gRG8geW91IHdpc2ggdG8gcmVtb3ZlIHRoaXMgbm9kZT8KLQotIyBHZXRTZXJ2aWNlSW50ZXJmYWNlcwotQUxUX0dFVF9TRVJWSUNFX0lOVEVSRkFDRVM9R2V0IFNlcnZpY2UgSW50ZXJmYWNlcwotTk9ERV9OQU1FX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTPVNlcnZpY2UgaW50ZXJmYWNlcyBmb3Igc2VydmljZSAlMQotTVNHX1FVRVNUSU9OX0dFVF9TSV9SRU1PVkVfU0VSVklDRV9OT0RFPVRoZSBzZXJ2aWNlIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIERvIHlvdSB3aXNoIHRvIHJlbW92ZSB0aGlzIG5vZGU/Ci0KLSMgR2V0U2VydmljZXMKLUFMVF9HRVRfU0VSVklDRVM9R2V0IFNlcnZpY2VzCi1OT0RFX05BTUVfU0lfU0VSVklDRVM9U2VydmljZXMgZm9yIHNlcnZpY2UgaW50ZXJmYWNlICUxCi1OT0RFX05BTUVfQlVTSU5FU1NfU0VSVklDRVM9U2VydmljZXMgZm9yIGJ1c2luZXNzICUxCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1NJX05PREU9VGhlIHNlcnZpY2UgaW50ZXJmYWNlIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIERvIHlvdSB3aXNoIHRvIHJlbW92ZSB0aGlzIG5vZGU/Ci1NU0dfUVVFU1RJT05fUkVNT1ZFX0JVU0lORVNTX05PREU9VGhlIGJ1c2luZXNzIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuIERvIHlvdSB3aXNoIHRvIHJlbW92ZSB0aGlzIG5vZGU/Ci0KLSMgUmVmcmVzaFVERElOb2Rlc0FjdGlvbgotTVNHX0VSUk9SX05PREVfREFUQV9WQUxJREFUSU9OX0ZBSUxFRD1JV0FCMDI3MkUgJTEgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4KLQotIyBTdW1tYXJpZXMKLUFMVF9TVU1NQVJZX1FVRVJJRVM9U3VtbWFyeSBvZiBRdWVyaWVzCi1BTFRfU1VNTUFSWV9CVVNJTkVTU0VTPVN1bW1hcnkgb2YgQnVzaW5lc3NlcwotQUxUX1NVTU1BUllfU0VSVklDRVM9U3VtbWFyeSBvZiBTZXJ2aWNlcwotQUxUX1NVTU1BUllfU0VSVklDRV9JTlRFUkZBQ0VTPVN1bW1hcnkgb2YgU2VydmljZSBJbnRlcmZhY2VzCi1GT1JNX0xBQkVMX1FVRVJJRVM9UXVlcmllcwotCi0jIFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbgotTVNHX1FVRVNUSU9OX0lURU1fVkFMSURBVElPTl9GQUlMRUQ9JTEgY291bGQgbm90IGJlIGZvdW5kIGluIHRoZSByZWdpc3RyeS4gRG8geW91IHdpc2ggdG8gcmVtb3ZlIGl0PwotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1OYXZpZ2F0b3IgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1OYXZpZ2F0b3IgVG9vbGJhcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9TmF2aWdhdG9yIENvbnRlbnQKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPUFjdGlvbnMgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Qcm9wZXJ0aWVzIENvbnRhaW5lcgotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPVByb3BlcnRpZXMgVG9vbGJhcgotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPVByb3BlcnRpZXMgQ29udGVudAotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1TdGF0dXMgQ29udGFpbmVyCi1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1TdGF0dXMgVG9vbGJhcgotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9U3RhdHVzIENvbnRlbnQKLUZSQU1FX1RJVExFX1VERElfUEVSU1BFQ1RJVkVfQ09OVEVOVD1VRERJIFBhZ2UgQ29udGVudAotRlJBTUVfVElUTEVfQ0FURUdPUklFU19XT1JLQVJFQT1DYXRlZ29yaWVzIFdvcmsgQXJlYQotRlJBTUVfVElUTEVfQ0FURUdPUklFU19UT09MQkFSPUNhdGVnb3JpZXMgVG9vbGJhcgotRlJBTUVfVElUTEVfQ0FURUdPUklFU19DT05URU5UPUNhdGVnb3JpZXMgQ29udGVudAotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPVdTREwgQnJvd3NlciBUb29sYmFyCi1GUkFNRV9USVRMRV9XU0RMX0NPTlRFTlQ9V1NETCBCcm93c2VyIENvbnRlbnQKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9CVVNJTkVTU19ERVRBSUxTPUJ1c2luZXNzIERldGFpbHMgRm9ybQotRk9STV9USVRMRV9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0U9QnVzaW5lc3MgUHVibGlzaCBTZXJ2aWNlIEZvcm0KLUZPUk1fVElUTEVfR0VUX0ZPUk09U2VsZWN0IGZyb20gRGlzY292ZXJlZCBhbmQgUHVibGlzaGVkIE9iamVjdHMgRm9ybQotRk9STV9USVRMRV9JVEVNU19TVU1NQVJZPVN1bW1hcnkgb2YgSXRlbXMgRm9ybQotRk9STV9USVRMRV9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlM9TWFuYWdlIFB1Ymxpc2hlciBBc3NlcnRpb25zIEZvcm0KLUZPUk1fVElUTEVfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVM9TWFuYWdlIFJlZmVyZW5jZWQgU2VydmljZXMgRm9ybQotRk9STV9USVRMRV9PUEVOX1JFR0lTVFJZPU9wZW4gUmVnaXN0cnkgRm9ybQotRk9STV9USVRMRV9SRUdJU1RSWV9ERVRBSUxTPVJlZ2lzdHJ5IERldGFpbHMgRm9ybQotRk9STV9USVRMRV9SRUdJU1RSWV9QVUJMSVNIPVJlZ2lzdHJ5IFB1Ymxpc2ggRm9ybQotRk9STV9USVRMRV9SRUdJU1RSWV9GSU5EPVJlZ2lzdHJ5IEZpbmQgRm9ybQotRk9STV9USVRMRV9SRVNVTFRTPVJlc3VsdHMgRm9ybQotRk9STV9USVRMRV9TRVJWSUNFX0RFVEFJTFM9U2VydmljZSBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1TZXJ2aWNlIEludGVyZmFjZSBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfVU5QVUJMSVNIPVVucHVibGlzaCBGb3JtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX2RlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OWJlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaV9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVVEREkKLQotIyBOb2RlcwotTk9ERV9OQU1FX1VERElfTUFJTj1VRERJIC0gSGF1cHQKLU5PREVfTkFNRV9RVUVSSUVTX0ZPTERFUj1BdXNnZWZcdTAwZmNocnRlIEFiZnJhZ2VuCi1OT0RFX05BTUVfUFVCTElTSEVEX0JVU0lORVNTRVNfRk9MREVSPVB1YmxpemllcnRlIEdlc2NoXHUwMGU0ZnRlCi1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VTX0ZPTERFUj1QdWJsaXppZXJ0ZSBTZXJ2aWNlcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFX0lOVEVSRkFDRVNfRk9MREVSPVB1YmxpemllcnRlIFNlcnZpY2VzY2huaXR0c3RlbGxlbgotCi0jIE9wZW5SZWdpc3RyeUFjdGlvbgotQUxUX09QRU5fUkVHSVNUUlk9UmVnaXN0cmllcnVuZyBcdTAwZjZmZm5lbgotRk9STV9MQUJFTF9PUEVOX1JFR0lTVFJZX0RFU0M9R2ViZW4gU2llIGRlbiBOYW1lbiB1bmQgZGllIEFiZnJhZ2UtVVJMIGRlciB6dSBcdTAwZjZmZm5lbmRlbiBSZWdpc3RyaWVydW5nIGFuLiBCZWkgQXVzd2FobCBlaW5lciBiZXZvcnp1Z3RlbiBSZWdpc3RyaWVydW5nIHdlcmRlbiBkaWUgZXJmb3JkZXJsaWNoZW4gSW5mb3JtYXRpb25lbiBhdXRvbWF0aXNjaCBhdXNnZWZcdTAwZmNsbHQuIEtsaWNrZW4gU2llIDxzdHJvbmc+TG9zPC9zdHJvbmc+IGFuLCB1bSBkaWUgUmVnaXN0cmllcnVuZyB6dSBcdTAwZjZmZm5lbi4KLUZPUk1fTEFCRUxfRkFWT1JJVEVfUkVHSVNUUlk9QmV2b3J6dWd0ZSBSZWdpc3RyaWVydW5nCi1GT1JNX0xBQkVMX1JFR0lTVFJZX05BTUU9UmVnaXN0cmllcnVuZ3NuYW1lCi1GT1JNX0xBQkVMX0lOUVVJUllfVVJMPUFiZnJhZ2UtVVJMCi1GT1JNX0xBQkVMX0NIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPUJlbnV0emVyZGVmaW5pZXJ0ZSBLYXRlZ29yaWVuIFx1MDBmY2JlcnByXHUwMGZjZmVuCi1ERUZBVUxUX1JFR0lTVFJZX05BTUU9SUJNIFVEREktVGVzdHJlZ2lzdHJpZXJ1bmcKLU1TR19FUlJPUl9JTlZBTElEX1JFR0lTVFJZX05BTUU9SVdBQjAxMzZFIEdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIFJlZ2lzdHJpZXJ1bmdzbmFtZW4gZWluLgotTVNHX0VSUk9SX0lOVkFMSURfSU5RVUlSWV9VUkw9SVdBQjAxMzhFIEdlYmVuIFNpZSBlaW5lIGdcdTAwZmNsdGlnZSBBYmZyYWdlLVVSTCBlaW4uCi1NU0dfSU5GT19SRUdJU1RSWV9PUEVORUQ9SVdBQjAxMzlJIERpZSBSZWdpc3RyaWVydW5nIG1pdCBkZW0gTmFtZW4gJTEsIGRpZSBzaWNoIHVudGVyICUyIGJlZmluZGV0LCB3dXJkZSBlcmZvbGdyZWljaCBnZVx1MDBmNmZmbmV0LgotRk9STV9MQUJFTF9JU19XRUJTUEhFUkVfVURESV9SRUdJU1RSWT1Jc3QgV2ViU3BoZXJlIGRpZSBVRERJLVJlZ2lzdHJpZXJ1bmc/Ci1ERUZBVUxUX1JFR0lTVFJZX05BTUVfV0VCU1BIRVJFPVByaXZhdGUgVURESS1SZWdpc3RyaWVydW5nIHZvbiBJQk0gV2ViU3BoZXJlCi1GT1JNX0xBQkVMX1JFR0lTVFJZX0hPU1Q9SG9zdAotRk9STV9MQUJFTF9SRUdJU1RSWV9QT1JUPVBvcnQKLQotIyBVc2VyLWRlZmluZWQgQ2F0ZWdvcmllcwotRk9STV9MQUJFTF9BRERfQ0FURUdPUllfREFUQT08YSBocmVmPSIlMSI+SGllciBrbGlja2VuPC9hPiwgdW0gZGllIERhdGVuIGRpZXNlciBLYXRlZ29yaWUgenUgbGFkZW4uCi1GT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfRklMRT1OYW1lIGRlciBLYXRlZ29yaWVkYXRlbmRhdGVpCi1NU0dfSU5GT19OT19VU0VSX0RFRklORURfQ0FURUdPUklFU19GT1VORD1JV0FCMDM3MUkgRXMgd3VyZGVuIGtlaW5lIGJlbnV0emVyZGVmaW5pZXJ0ZW4gS2F0ZWdvcmllbiBnZWZ1bmRlbi4KLU1TR19JTkZPX05PX0NBVEVHT1JZX0RBVEE9SVdBQjAzNzJJIERpZSBLYXRlZ29yaWVkYXRlbiBmXHUwMGZjciAlMSBzaW5kIG5pY2h0IHZlcmZcdTAwZmNnYmFyIG9kZXIgdW5nXHUwMGZjbHRpZy4KLU1TR19JTkZPX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0xPQURFRD1JV0FCMDM3M0kgRGllIERhdGVuIGZcdTAwZmNyIGRpZSBiZW51dHplcmRlZmluaWVydGUgS2F0ZWdvcmllICUxIHd1cmRlbiBlcmZvbGdyZWljaCBnZWxhZGVuLgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRV9LRVk9SVdBQjAzNzRFIFVuZ1x1MDBmY2x0aWdlIERhdGVuZGF0ZWkgZlx1MDBmY3IgYmVudXR6ZXJkZWZpbmllcnRlIEthdGVnb3JpZSAlMS4gRXMgd3VyZGUgZWluIEthdGVnb3JpZXNjaGxcdTAwZmNzc2VsICclMicgZ2VmdW5kZW4sIGVzIHd1cmRlIGplZG9jaCAnJTMnIGVyd2FydGV0LgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRV9GT1JNQVQ9SVdBQjA0NzNFIFVuYmVrYW5udGVzIEZvcm1hdCBpbiBaZWlsZSAlMSBkZXIgRGF0ZW5kYXRlaSBmXHUwMGZjciBiZW51dHplcmRlZmluaWVydGUgS2F0ZWdvcmllICUyLiBEaWUgWmVpbGUgbGF1dGV0OiAiJTMiCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFPUlXQUIwMzc1RSBVbmdcdTAwZmNsdGlnZSBEYXRlbmRhdGVpIGZcdTAwZmNyIGJlbnV0emVyZGVmaW5pZXJ0ZSBLYXRlZ29yaWUgJTEuCi1NU0dfRVJST1JfU0FWSU5HX0NBVEVHT1JZX0RBVEE9SVdBQjA0NzRFIEJlaW0gU3BlaWNoZXJuIGRlciBEYXRlbiBmXHUwMGZjciBLYXRlZ29yaWUgJTEgaXN0IGVpbiBGZWhsZXIgYXVmZ2V0cmV0ZW4uIFRleHQgZGVyIEF1c25haG1lYmVkaW5ndW5nOiAlMgotCi0jIFVEREkgQ2F0ZWdvcnkgQnJvd3NlcgotVElUTEVfQ0FURUdPUllfQlJPV1NFUj1LYXRlZ29yaWVicm93c2VyCi1BTFRfQ0FURUdPUklFUz1LYXRlZ29yaWVuCi0KLSMgRGV0YWlscwotQUxUX1JFR0lTVFJZX0RFVEFJTFM9UmVnaXN0cmllcnVuZyAtIERldGFpbHMKLUFMVF9CVVNJTkVTU19ERVRBSUxTPUdlc2NoXHUwMGU0ZnQgLSBEZXRhaWxzCi1BTFRfU0VSVklDRV9ERVRBSUxTPVNlcnZpY2UgLSBEZXRhaWxzCi1BTFRfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1TZXJ2aWNlc2Nobml0dHN0ZWxsZSAtIERldGFpbHMKLUZPUk1fTEFCRUxfREVUQUlMU19FRElUQUJMRT1EaWUgRGV0YWlscyBmXHUwMGZjciA8c3Ryb25nPiUxPC9zdHJvbmc+IHdlcmRlbiB1bnRlbiBhbmdlemVpZ3QuIEVzIGtcdTAwZjZubmVuIGVpbmlnZSBFaW50clx1MDBlNGdlIGhpbnp1Z2VmXHUwMGZjZ3QsIGVudGZlcm50IG9kZXIgZ2VcdTAwZTRuZGVydCB3b3JkZW4gc2Vpbi4gRlx1MDBmY3IgXHUwMGM0bmRlcnVuZ2VuIGlzdCBtXHUwMGY2Z2xpY2hlcndlaXNlIGVpbmUgQXV0aGVudGlmaXppZXJ1bmcgZXJmb3JkZXJsaWNoLiBXZWl0ZXJlIEFrdGlvbmVuIHNpbmQgYW0gdW50ZXJlbiBFbmRlIGRpZXNlciBTZWl0ZSBhdWZnZWZcdTAwZmNocnQuCi0KLSMgR2V0Ci1BTFRfR0VUPUVtcGZhbmdlbgotCi0jIENvbW1vbiBGb3JtIENvbnRyb2wgVGl0bGUKLUZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUU9TmFtZS9XZXJ0Ci1GT1JNX0NPTlRST0xfVElUTEVfREVTQ1JJUFRJT05fVEVYVF9WQUxVRT1CZXNjaHJlaWJ1bmdzd2VydAotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FPUthdGVnb3JpZXNjaGxcdTAwZmNzc2VsbmFtZQotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRT1LYXRlZ29yaWVzY2hsXHUwMGZjc3NlbHdlcnQKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FPUtlbm51bmdzc2NobFx1MDBmY3NzZWxuYW1lCi1GT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfVkFMVUU9S2VubnVuZ3NzY2hsXHUwMGZjc3NlbHdlcnQKLUZPUk1fQ09OVFJPTF9USVRMRV9ESVNDT1ZFUllfVVJMPUVya2VubnVuZ3MtVVJMCi0KLSMgRmluZCBhY3Rpb25zCi1BTFRfRklORD1TdWNoZW4KLUFMVF9TVUJRVUVSWT0lMSBVbnRlcmFiZnJhZ2Ugc3VjaGVuCi1GT1JNX0xBQkVMX1FVRVJZX05BTUU9TmFtZSBkaWVzZXIgQWJmcmFnZQotREVGQVVMVF9RVUVSWV9OQU1FPUFiZnJhZ2VlcmdlYm5pc3NlCi1ERUZBVUxUX1NVQlFVRVJZX05BTUU9JTEgLSAlMiBVbnRlcmFiZnJhZ2UKLUZPUk1fTEFCRUxfU0VBUkNIX0ZPUj1TdWNoZW4gbmFjaAotRk9STV9PUFRJT05fQlVTSU5FU1NFUz1HZXNjaFx1MDBlNGZ0ZQotRk9STV9PUFRJT05fU0VSVklDRVM9U2VydmljZXMKLUZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUz1TZXJ2aWNlc2Nobml0dHN0ZWxsZW4KLUZPUk1fTEFCRUxfU0VBUkNIX1RZUEU9U3VjaHR5cAotRk9STV9SQURJT19TSU1QTEU9RWluZmFjaAotRk9STV9SQURJT19BRFZBTkNFRD1FcndlaXRlcnQKLUZPUk1fUkFESU9fVVVJRD1VVUlECi1GT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NFU19TSU1QTEVfREVTQz1HZWJlbiBTaWUgZWluZW4gVGVpbCBvZGVyIGRlbiB2b2xsc3RcdTAwZTRuZGlnZW4gTmFtZW4gZWluZXMgR2VzY2hcdTAwZTRmdHMgZWluLCBuYWNoIGRlbSBnZXN1Y2h0IHdlcmRlbiBzb2xsLiBEYXMgU3ltYm9sICclJyBrYW5uIGFscyBQbGF0emhhbHRlcnplaWNoZW4gZlx1MDBmY3IgZWluIGJlbGllYmlnZXMgWmVpY2hlbiB2ZXJ3ZW5kZXQgd2VyZGVuLiBLbGlja2VuIFNpZSA8c3Ryb25nPkxvczwvc3Ryb25nPiBhbiwgdW0gZGllIFN1Y2hlIHp1IHN0YXJ0ZW4uCi1GT1JNX0xBQkVMX0ZJTkRfQURWQU5DRURfREVTQz1HZWJlbiBTaWUgV2VydGUgZlx1MDBmY3IgZWluZW4gb2RlciBtZWhyZXJlIGRlciBuYWNoc3RlaGVuZCBhdWZnZWxpc3RldGVuIFBhcmFtZXRlciBlaW4uIEltIE5hbWVuc2ZlbGQgZGVyIE5hbWVuc3RhYmVsbGUga2FubiBkYXMgU3ltYm9sICclJyBhbHMgUGxhdHpoYWx0ZXJ6ZWljaGVuIGZcdTAwZmNyIGVpbiBiZWxpZWJpZ2VzIFplaWNoZW4gdmVyd2VuZGV0IHdlcmRlbi4gTVx1MDBmNmdsaWNoZXJ3ZWlzZSBpc3QgZWluZSBBdXRoZW50aWZpemllcnVuZyBlcmZvcmRlcmxpY2guIEtsaWNrZW4gU2llIDxzdHJvbmc+TG9zPC9zdHJvbmc+IGFuLCB1bSBkaWUgU3VjaGUgenUgc3RhcnRlbi4KLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU19VVUlEX0RFU0M9R2ViZW4gU2llIGRpZSBVVUlEIGRlcyBHZXNjaFx1MDBlNGZ0cyBlaW4sIG5hY2ggZGVyIGdlc3VjaHQgd2VyZGVuIHNvbGwuIEtsaWNrZW4gU2llIDxzdHJvbmc+TG9zPC9zdHJvbmc+IGFuLCB1bSBkaWUgU3VjaGUgenUgc3RhcnRlbi4KLUZPUk1fTEFCRUxfTkFNRVM9TmFtZW4KLUZPUk1fTElOS19BREQ9SGluenVmXHUwMGZjZ2VuCi1GT1JNX0xJTktfR0VUPUVtcGZhbmdlbgotRk9STV9MSU5LX0ZJTkQ9U3VjaGVuCi1GT1JNX0xJTktfUkVNT1ZFPUVudGZlcm5lbgotRk9STV9MQUJFTF9PV05FRD1NaXQgRWlnbmVyCi1GT1JNX0xBQkVMX1BVQkxJU0hfVVJMPVB1YmxpemllcnVuZ3MtVVJMCi1GT1JNX0xBQkVMX1VTRVJJRD1CZW51dHplci1JRAotRk9STV9MQUJFTF9QQVNTV09SRD1LZW5ud29ydAotRk9STV9MQUJFTF9MQU5HVUFHRT1TcHJhY2hlCi1GT1JNX0xBQkVMX05BTUU9TmFtZQotRk9STV9MQUJFTF9ERVNDUklQVElPTj1CZXNjaHJlaWJ1bmcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VOPUVuZ2xpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BQT1BZmFyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BQj1BYmNoYXNpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BRj1BZnJpa2FhbnMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FNPUFtaGFyaWMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FSPUFyYWJpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BUz1Bc3NhbWVzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQVk9QXltYXJhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BWj1Bc2VyYmFpZHNjaGFuaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfQkE9QmFjaGtpcgotRk9STV9PUFRJT05fTEFOR1VBR0VfQkU9V2VpXHUwMGRmcnVzc2lzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JHPUJ1bGdhcmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JIPUJpaGFyaQotRk9STV9PUFRJT05fTEFOR1VBR0VfQkk9QmlzbGFtYQotRk9STV9PUFRJT05fTEFOR1VBR0VfQk49QmVuZ2FsaTsgQmFuZ2xhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CTz1UaWJldGlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JSPUJyZXRvbmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NBPUthdGFsYW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DTz1Lb3JzaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfQ1o9VHNjaGVjaGlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NZPVdhbGlzaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfREE9RFx1MDBlNG5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ERT1EZXV0c2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9EWj1CaHV0YW5pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTD1HcmllY2hpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTz1Fc3BlcmFudG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VTPVNwYW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FVD1Fc3RvbmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VVPUJhc2tpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GQT1QZXJzaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfRkk9RmlubmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZKPUZpZHNjaGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZPPUZcdTAwZTRyXHUwMGY2aXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfRlI9RnJhbnpcdTAwZjZzaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfRlk9RnJpZXNpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HQT1JcmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dEPVNjaG90dGlzY2hlcyBHXHUwMGU0bGlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dMPUdhbGl6aXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfR049R3VhcmFuaQotRk9STV9PUFRJT05fTEFOR1VBR0VfR1U9R3VqYXJhdGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hBPUhhdXNzYQotRk9STV9PUFRJT05fTEFOR1VBR0VfSEk9SGluZGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hSPUtyb2F0aXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfSFU9VW5nYXJpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IWT1Bcm1lbmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lBPUludGVybGluZ3VhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JRT1JbnRlcmxpbmd1ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSUs9SW51cGlhcQotRk9STV9PUFRJT05fTEFOR1VBR0VfSU49SW5kb25lc2lzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lTPUlzbFx1MDBlNG5kaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfSVQ9SXRhbGllbmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lXPUhlYnJcdTAwZTRpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KQT1KYXBhbmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pJPUppZGRpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KVz1KYXZhbmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tBPUdlb3JnaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfS0s9S2FzYWNoaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfS0w9R3JcdTAwZjZubFx1MDBlNG5kaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfS009S2FtYm9kc2NoYW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTj1LYW5uYWRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTz1Lb3JlYW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LUz1LYXNjaG1pcmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tVPUt1cmRpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LWT1LaXJnaXNpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MQT1MYXRlaW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xOPUxpbmdhbGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xPPUxhb3Rpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MVD1MaXRhdWlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xWPUxldHRpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NRz1NYWxhZ2Fzc2kKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01JPU1hb3JpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NSz1NYXplZG9uaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfTUw9TWFsYXlhbGFtCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTj1Nb25nb2xpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTz1Nb2xkYXZpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NUj1NYXJhdGhpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NUz1NYWxhaWlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01UPU1hbHRlc2lzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01ZPUJ1cm1lc2lzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05BPU5hdXJ1YW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ORT1OZXBhbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05MPU5pZWRlcmxcdTAwZTRuZGlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05PPU5vcndlZ2lzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09DPU9reml0YW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9PTT0oQWZhbikgT3JvbW8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09SPU9yaXlhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QQT1QdW5qYWJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QTD1Qb2xuaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfUFM9UGFzY2h0dQotRk9STV9PUFRJT05fTEFOR1VBR0VfUFQ9UG9ydHVnaWVzaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfUVU9UXVlY2h1YQotRk9STV9PUFRJT05fTEFOR1VBR0VfUk09Ulx1MDBlNHRvcm9tYW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STj1LaXJ1bmRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STz1SdW1cdTAwZTRuaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfUlU9UnVzc2lzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JXPUtpbnlhcndhbmRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TQT1TYW5za3JpdAotRk9STV9PUFRJT05fTEFOR1VBR0VfU0Q9U2luZGhpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TRz1TYW5ncm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NIPVNlcmJva3JvYXRpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TST1TaW5naGFsZXNpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TSz1TbG93YWtpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTD1TbG93ZW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTT1TYW1vYW5pc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTj1TaG9uYQotRk9STV9PUFRJT05fTEFOR1VBR0VfU089U29tYWxpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUT1BbGJhbmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NSPVNlcmJpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUz1TaXN3YXRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVD1TZXNvdGhvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVT1TdW5kYW5lc2lzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NWPVNjaHdlZGlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NXPVN1YWhlbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RBPVRhbWlsCi1GT1JNX09QVElPTl9MQU5HVUFHRV9URT1UZWd1bHUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RHPVRhamlrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9USD1UaGFpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UST1UaWdyaW5qYQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEs9VHVya21lbmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RMPVRhZ2Fsb2cKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ROPVNldHN3YW5hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTz1Ub25nYQotRk9STV9PUFRJT05fTEFOR1VBR0VfVFI9VFx1MDBmY3JraXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfVFM9VHNvbmdhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVD1UYXRhcmlzY2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RXPVR3aQotRk9STV9PUFRJT05fTEFOR1VBR0VfVUs9VWtyYWluaXNjaAotRk9STV9PUFRJT05fTEFOR1VBR0VfVVI9VXJkdQotRk9STV9PUFRJT05fTEFOR1VBR0VfVVo9VXNiZWtpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9WST1WaWV0bmFtZXNpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9WTz1Wb2xhcFx1MDBmY2sKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1dPPVdvbG9mCi1GT1JNX09QVElPTl9MQU5HVUFHRV9YSD1YaG9zYQotRk9STV9PUFRJT05fTEFOR1VBR0VfWU89WW9ydWJhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aSD1DaGluZXNpc2NoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aVT1adWx1Ci1GT1JNX0xBQkVMX0VYQUNUX05BTUVfTUFUQ0g9RXhha3RlIFx1MDBkY2JlcmVpbnN0aW1tdW5nCi1GT1JNX0xBQkVMX0NBU0VfU0VOU0lUSVZFX01BVENIPUdyb1x1MDBkZi0vS2xlaW5zY2hyZWlidW5nCi1GT1JNX0xBQkVMX1NPVU5ERVg9S2xpbmd0IHdpZQotRk9STV9MQUJFTF9JREVOVElGSUVSUz1LZW5udW5nZW4KLUZPUk1fTEFCRUxfSURFTlRJRklFUl9UWVBFPVR5cAotCi0jIERvIG5vdCB0cmFuc2xhdGUgdGhlIHR3byBpdGVtcyBiZWxvdy4KLUZPUk1fT1BUSU9OX0lERU5USUZJRVJfRFVOUz1ELVUtTi1TCi1GT1JNX09QVElPTl9JREVOVElGSUVSX1RIT01BU19SRUdJU1RSWT1UaG9tYXMgUmVnaXN0cnkKLQotRk9STV9MQUJFTF9LRVlfTkFNRT1TY2hsXHUwMGZjc3NlbG5hbWUKLUZPUk1fTEFCRUxfS0VZX1ZBTFVFPVNjaGxcdTAwZmNzc2Vsd2VydAotRk9STV9MQUJFTF9DQVRFR09SSUVTPUthdGVnb3JpZW4KLUZPUk1fTEFCRUxfQ0FURUdPUllfVFlQRT1UeXAKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX05BSUNTPU5BSUNTCi1GT1JNX09QVElPTl9DQVRFR09SWV9VTlNQU0NfNzM9VU5TUFNDIDcuMwotRk9STV9PUFRJT05fQ0FURUdPUllfR0VPPUdFTwotRk9STV9PUFRJT05fQ0FURUdPUllfRFdDT01NVU5JVFk9ZFcgQ29tbXVuaXR5Ci1GT1JNX0xBQkVMX0JVU0lORVNTX0NBVEVHT1JJRVM9VmVyZ2xlaWNoZW4gbWl0OgotRk9STV9PUFRJT05fQlVTSU5FU1NFU19PTkxZPU51ciBHZXNjaFx1MDBlNGZ0ZQotRk9STV9PUFRJT05fU0VSVklDRVNfT05MWT1OdXIgU2VydmljZXMKLUZPUk1fT1BUSU9OX0JPVEg9R2VzY2hcdTAwZTRmdGUgdW5kIFNlcnZpY2VzCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTFM9RXJrZW5udW5ncy1VUkxzCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTD1Fcmtlbm51bmdzLVVSTAotRk9STV9MQUJFTF9GSU5EUVVBTElGSUVSUz1RdWFsaWZpa2F0aW9uc21lcmttYWxlIHN1Y2hlbgotRk9STV9MQUJFTF9DT01CSU5FX0tFWVM9U2NobFx1MDBmY3NzZWwga29tYmluaWVyZW46Ci1GT1JNX09QVElPTl9BTkRBTExLRVlTPVVuZAotRk9STV9PUFRJT05fT1JBTExLRVlTPU9kZXIKLUZPUk1fT1BUSU9OX09STElLRUtFWVM9T2RlciBcdTAwZTRobmxpY2gKLUZPUk1fTEFCRUxfU09SVF9CWV9OQU1FPVNvcnRpZXJlbiBuYWNoIE5hbWVuOgotRk9STV9SQURJT19TT1JUX0FTQz1BdWZzdGVpZ2VuZAotRk9STV9SQURJT19TT1JUX0RFU0M9QWJzdGVpZ2VuZAotRk9STV9MQUJFTF9TT1JUX0JZX0RBVEU9U29ydGllcmVuIG5hY2ggRGF0dW06Ci1GT1JNX0xBQkVMX01BWF9TRUFSQ0hfU0VUPU1heGltYWxlIEdyXHUwMGY2XHUwMGRmZSBkZXIgU3VjaGdydXBwZToKLUZPUk1fTEFCRUxfTUFYX1JFU1VMVFM9TWF4aW1hbGUgQW56YWhsIFN1Y2hlcmdlYm5pc3NlOgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VTX1NJTVBMRV9ERVNDPUdlYmVuIFNpZSBlaW5lbiBUZWlsIG9kZXIgZGVuIHZvbGxzdFx1MDBlNG5kaWdlbiBOYW1lbiBlaW5lcyBTZXJ2aWNlcyBlaW4sIG5hY2ggZGVtIGdlc3VjaHQgd2VyZGVuIHNvbGwuIERhcyBTeW1ib2wgJyUnIGthbm4gYWxzIFBsYXR6aGFsdGVyemVpY2hlbiBmXHUwMGZjciBlaW4gYmVsaWViaWdlcyBaZWljaGVuIHZlcndlbmRldCB3ZXJkZW4uIEtsaWNrZW4gU2llIDxzdHJvbmc+TG9zPC9zdHJvbmc+IGFuLCB1bSBkaWUgU3VjaGUgenUgc3RhcnRlbi4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX1VVSURfREVTQz1HZWJlbiBTaWUgZGllIFVVSUQgZGVzIFNlcnZpY2VzIGVpbiwgbmFjaCBkZXIgZ2VzdWNodCB3ZXJkZW4gc29sbC4gS2xpY2tlbiBTaWUgPHN0cm9uZz5Mb3M8L3N0cm9uZz4gYW4sIHVtIGRpZSBTdWNoZSB6dSBzdGFydGVuLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFU19TSU1QTEVfREVTQz1HZWJlbiBTaWUgZWluZW4gVGVpbCBvZGVyIGRlbiB2b2xsc3RcdTAwZTRuZGlnZW4gTmFtZW4gZWluZXIgU2VydmljZXNjaG5pdHRzdGVsbGUgZWluLCBuYWNoIGRlciBnZXN1Y2h0IHdlcmRlbiBzb2xsLiBEYXMgU3ltYm9sICclJyBrYW5uIGFscyBQbGF0emhhbHRlcnplaWNoZW4gZlx1MDBmY3IgZWluIGJlbGllYmlnZXMgWmVpY2hlbiB2ZXJ3ZW5kZXQgd2VyZGVuLiBLbGlja2VuIFNpZSA8c3Ryb25nPkxvczwvc3Ryb25nPiBhbiwgdW0gZGllIFN1Y2hlIHp1IHN0YXJ0ZW4uCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRV9JTlRFUkZBQ0VfVVVJRF9ERVNDPUdlYmVuIFNpZSBkaWUgVVVJRCBkZXIgU2VydmljZXNjaG5pdHRzdGVsbGUgZWluLCBuYWNoIGRlciBnZXN1Y2h0IHdlcmRlbiBzb2xsLiBLbGlja2VuIFNpZSA8c3Ryb25nPkxvczwvc3Ryb25nPiBhbiwgdW0gZGllIFN1Y2hlIHp1IHN0YXJ0ZW4uCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFUz1TZXJ2aWNlc2Nobml0dHN0ZWxsZW4KLUZPUk1fTEFCRUxfVVVJRF9LRVk9VVVJRC1TY2hsXHUwMGZjc3NlbDoKLUZPUk1fTEFCRUxfVVNFX1NFUlZJQ0U9U2VydmljZSB2ZXJ3ZW5kZW4KLUZPUk1fTEFCRUxfU0VSVklDRT1TZXJ2aWNlCi1GT1JNX0xBQkVMX0JVU0lORVNTPUdlc2NoXHUwMGU0ZnQKLUZPUk1fTEFCRUxfUFVCTElTSF9BU1NFUlRJT05TPUdlc2NoXHUwMGU0ZnRzYmV6aWVodW5nZW4KLUZPUk1fTEFCRUxfRElSRUNUSU9OPVJpY2h0dW5nCi1GT1JNX0xBQkVMX0ZST01fS0VZPVZvbiBTY2hsXHUwMGZjc3NlbAotRk9STV9MQUJFTF9UT19LRVk9WnUgU2NobFx1MDBmY3NzZWwKLUZPUk1fTEFCRUxfU1RBVFVTPVN0YXR1cwotRk9STV9MQUJFTF9BU1NFUlRJT05fVFlQRT1CZXppZWh1bmdzdHlwCi1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QQVJFTlRfQ0hJTEQ9RWx0ZXItS2luZAotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEVFUl9UT19QRUVSPVBlZXItUGVlcgotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfSURFTlRJVFk9SWRlbnRpdFx1MDBlNHQKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX0RJUkVUSU9OX0RFU0M9QmVpIFZlcndlbmR1bmcgdm9uIFJpY2h0dW5nIDxzdHJvbmc+Vm9uPC9zdHJvbmc+IHdpcmQgZWluZSBHZXNjaFx1MDBlNGZ0c2JlemllaHVuZyAoUHVibGlzaGVyIEFzc2VydGlvbikgdm9uIGRpZXNlbSBHZXNjaFx1MDBlNGZ0IHp1bSBvYmlnZW4gR2VzY2hcdTAwZTRmdCBlcnN0ZWxsdC4gIEJlaSBWZXJ3ZW5kdW5nIHZvbiBSaWNodHVuZyA8c3Ryb25nPlp1PC9zdHJvbmc+IHdpcmQgZWluZSBHZXNjaFx1MDBlNGZ0c2JlemllaHVuZyB2b20gb2JpZ2VuIEdlc2NoXHUwMGU0ZnQgenUgZGllc2VtIEdlc2NoXHUwMGU0ZnQgZXJzdGVsbHQuCi1GT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX0ZST009LS0tPgotRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9UTz08LS0tCi1GT1JNX0xBQkVMX1RISVNfQlVTSU5FU1M9RGllc2VzCi1NU0dfRVJST1JfSU5WQUxJRF9RVUVSWV9OQU1FPUlXQUIwMTQwRSBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBOYW1lbiBmXHUwMGZjciBkaWUgQWJmcmFnZSBlaW4uCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FUz1JV0FCMDE0MUUgR2ViZW4gU2llIGVpbmUgUmVpaGUgZ1x1MDBmY2x0aWdlciBOYW1lbiBlaW4uCi1NU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTD1JV0FCMDE0MkUgR2ViZW4gU2llIGVpbmUgZ1x1MDBmY2x0aWdlIFB1YmxpemllcnVuZ3MtVVJMIGVpbi4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJJRD1JV0FCMDE0M0UgR2ViZW4gU2llIGVpbmUgZ1x1MDBmY2x0aWdlIEJlbnV0emVyLUlEIGVpbi4KLU1TR19FUlJPUl9JTlZBTElEX01BWF9TRUFSQ0hfU0VUPUlXQUIwMTQ1RSBHZWJlbiBTaWUgZWluZSBnXHUwMGZjbHRpZ2UgbWF4aW1hbGUgR3JcdTAwZjZcdTAwZGZlIGZcdTAwZmNyIGRpZSBTdWNoZ3J1cHBlIGVpbi4KLU1TR19FUlJPUl9JTlZBTElEX01BWF9SRVNVTFRTPUlXQUIwMTQ2RSBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBXZXJ0IGZcdTAwZmNyIGRpZSBtYXhpbWFsZSBBbnphaGwgU3VjaGVyZ2Vibmlzc2UgZWluLgotTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0N0kgQW56YWhsIGdlZnVuZGVuZXIgR2VzY2hcdTAwZTRmdGU6ICUxCi1NU0dfRVJST1JfTk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0OEUgS2VpbmUgR2VzY2hcdTAwZTRmdGUgZ2VmdW5kZW4uCi1NU0dfSU5GT19TRVJWSUNFU19GT1VORD1JV0FCMDE0OUkgQW56YWhsIGdlZnVuZGVuZXIgU2VydmljZXM6ICUxCi1NU0dfRVJST1JfTk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNTBFIEtlaW5lIFNlcnZpY2VzIGdlZnVuZGVuLgotTVNHX0VSUk9SX1NJTkdMRV9JVEVNPUlXQUIwMTUxRSBXXHUwMGU0aGxlbiBTaWUgbnVyIGVpbmVuIEVpbnRyYWcgYXVzLgotTVNHX1FVRVNUSU9OX0lURU1fUkVQTEFDRU1FTlQ9RGllIEF1c3dhaGwgZXJzZXR6dCBlaW4gRWxlbWVudCwgZGFzIHNpY2ggYmVyZWl0cyBpbSBaaWVsIGJlZmluZGV0LiBNXHUwMGY2Y2h0ZW4gU2llIGZvcnRmYWhyZW4/Ci1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQ9SVdBQjAxNTJJIEFuemFobCBnZWZ1bmRlbmVyIFNlcnZpY2VzY2huaXR0c3RlbGxlbjogJTEKLU1TR19FUlJPUl9OT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQ9SVdBQjAxNTNFIEtlaW5lIFNlcnZpY2VzY2huaXR0c3RlbGxlbiBnZWZ1bmRlbi4KLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMTU0RSBXXHUwMGU0aGxlbiBTaWUgbWluZGVzdGVucyBlaW5lbiBFaW50cmFnIGF1cy4KLU1TR19FUlJPUl9JTlZBTElEX1VVSURfS0VZPUlXQUIwMTU1RSBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBVVUlELVNjaGxcdTAwZmNzc2VsIGVpbi4KLU1TR19FUlJPUl9RVUVSWV9OQU1FX0NPTkZMSUNUPUlXQUIwMTU2RSBEZXIgQWJmcmFnZW5hbWUgZGVyIFVudGVyYWJmcmFnZSBkYXJmIG5pY2h0IG1pdCBkZW0gQWJzZW5kZXIgaWRlbnRpc2NoIHNlaW4uCi1NU0dfRVJST1JfTk9fSVRFTVNfVE9fR0VUPUlXQUIwMTU3RSBFcyB3dXJkZW4gbm9jaCBrZWluZSBFbGVtZW50ZSBkZXMgYW5nZWdlYmVuZW4gVHlwcyBwdWJsaXppZXJ0IG9kZXIgYXVmZ2VzcFx1MDBmY3J0LgotCi0jIFJlc3VsdHMKLUFMVF9RVUVSWV9SRVNVTFRTPUFiZnJhZ2VlcmdlYm5pc3NlCi1GT1JNX0xBQkVMX1NVQlFVRVJZPURpZSBFcmdlYm5pc3NlIGtcdTAwZjZubmVuIGFscyBFaW5nYWJlIGZcdTAwZmNyIGVpbmUgYW5kZXJlIE9wZXJhdGlvbiB2ZXJ3ZW5kZXQgd2VyZGVuLiBLbGlja2VuIFNpZSBkZW4gTGluayA8c3Ryb25nPlppZWw8L3N0cm9uZz4gb2JlbiBhbiwgdW0gZGllIE9wZXJhdGlvbiBhbnp1emVpZ2VuLiBBdXNnZXdcdTAwZTRobHRlIEVyZ2Vibmlzc2Uga1x1MDBmNm5uZW4gaW4gZGVyIE9wZXJhdGlvbiB2ZXJ3ZW5kZXQgd2VyZGVuLCBpbmRlbSBTaWUgZGVuIEtub3BmIDxzdHJvbmc+XHUwMGRjYmVydHJhZ2VuPC9zdHJvbmc+IGFua2xpY2tlbi4KLUZPUk1fTEFCRUxfUVVFUlk9V1x1MDBlNGhsZW4gU2llIGVpbiBFcmdlYm5pcyBhdXMsIHVtIHdlaXRlcmUgRGV0YWlscyBhbnp1emVpZ2VuLCBvZGVyIHdcdTAwZTRobGVuIFNpZSBlaW5lIEVyZ2VibmlzbWVuZ2UgYXVzLCB1bmQga2xpY2tlbiBTaWUgZWluZW4gS25vcGYgYW4sIHVtIGVpbmUgT3BlcmF0aW9uIGF1c3p1Zlx1MDBmY2hyZW4uCi1GT1JNX0xJTktfVEFSR0VUPVppZWwKLUZPUk1fQlVUVE9OX1RSQU5TRkVSPVx1MDBkY2JlcnRyYWdlbgotRk9STV9CVVRUT05fUkVGUkVTSD1Ba3R1YWxpc2llcmVuCi1GT1JNX0JVVFRPTl9BRERfVE9fRkFWT1JJVEVTPVp1IEZhdm9yaXRlbiBoaW56dWZcdTAwZmNnZW4KLUZPUk1fQlVUVE9OX1VOUFVCTElTSD1QdWJsaXppZXJ1bmcgenVyXHUwMGZjY2tuZWhtZW4KLUZPUk1fQlVUVE9OX0NMRUFSPUluaGFsdCBsXHUwMGY2c2NoZW4KLQotIyBQdWJsaXNoIGFjdGlvbnMKLUFMVF9QVUJMSVNIPVB1YmxpemllcmVuCi1GT1JNX0xBQkVMX1BVQkxJU0g9UHVibGl6aWVyZW46Ci1GT1JNX09QVElPTl9CVVNJTkVTUz1HZXNjaFx1MDBlNGZ0Ci1GT1JNX09QVElPTl9TRVJWSUNFPVNlcnZpY2UKLUZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFPVNlcnZpY2VzY2huaXR0c3RlbGxlCi1GT1JNX0xBQkVMX1BVQkxJU0hfQlVTSU5FU1NfU0lNUExFX0RFU0M9R2ViZW4gU2llIGVpbmVuIE5hbWVuIHVuZCBlaW5lIG9wdGlvbmFsZSBCZXNjaHJlaWJ1bmcgZlx1MDBmY3IgZGFzIHp1IHB1YmxpemllcmVuZGUgR2VzY2hcdTAwZTRmdCBlaW4uIE1cdTAwZjZnbGljaGVyd2Vpc2UgaXN0IGVpbmUgQXV0aGVudGlmaXppZXJ1bmcgZXJmb3JkZXJsaWNoLgotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX0FEVkFOQ0VEX0RFU0M9R2ViZW4gU2llIGVpbmVuIE5hbWVuIGZcdTAwZmNyIGRhcyB6dSBwdWJsaXppZXJlbmRlIEdlc2NoXHUwMGU0ZnQgZWluLiBFcyBrXHUwMGY2bm5lbiBhdWNoIHdlaXRlcmUgUGFyYW1ldGVyIGFuZ2VnZWJlbiB3ZXJkZW4uIE1cdTAwZjZnbGljaGVyd2Vpc2UgaXN0IGVpbmUgQXV0aGVudGlmaXppZXJ1bmcgZXJmb3JkZXJsaWNoLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0M9UnVmZW4gU2llIGVpbiBHZXNjaFx1MDBlNGZ0IGFiIG9kZXIgc3VjaGVuIFNpZSBlaW5lcywgdW5kIGdlYmVuIFNpZSBkaWUgV1NETC1VUkwsIGRlbiBOYW1lbiB1bmQgZWluZSBvcHRpb25hbGUgQmVzY2hyZWlidW5nIGZcdTAwZmNyIGRlbiB6dSBwdWJsaXppZXJlbmRlbiBTZXJ2aWNlIGVpbi4gTVx1MDBmNmdsaWNoZXJ3ZWlzZSBpc3QgZWluZSBBdXRoZW50aWZpemllcnVuZyBlcmZvcmRlcmxpY2guCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9BRFZBTkNFRF9ERVNDPVJ1ZmVuIFNpZSBlaW4gR2VzY2hcdTAwZTRmdCBhYiBvZGVyIHN1Y2hlbiBTaWUgZWluZXMsIHVuZCBnZWJlbiBTaWUgZGllIFdTREwtVVJMIHVuZCBlaW5lbiBOYW1lbiBmXHUwMGZjciBkZW4genUgcHVibGl6aWVyZW5kZW4gU2VydmljZSBlaW4uIEVzIGtcdTAwZjZubmVuIGF1Y2ggd2VpdGVyZSBQYXJhbWV0ZXIgYW5nZWdlYmVuIHdlcmRlbi4gTVx1MDBmNmdsaWNoZXJ3ZWlzZSBpc3QgZWluZSBBdXRoZW50aWZpemllcnVuZyBlcmZvcmRlcmxpY2guCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQz1HZWJlbiBTaWUgZGllIFdTREwtVVJMLCBkZW4gTmFtZW4gdW5kIGVpbmUgb3B0aW9uYWxlIEJlc2NocmVpYnVuZyBmXHUwMGZjciBkZW4genUgcHVibGl6aWVyZW5kZW4gU2VydmljZSBlaW4uIE1cdTAwZjZnbGljaGVyd2Vpc2UgaXN0IGVpbmUgQXV0aGVudGlmaXppZXJ1bmcgZXJmb3JkZXJsaWNoLgotRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQz1HZWJlbiBTaWUgZGllIFdTREwtVVJMIHVuZCBlaW5lbiBOYW1lbiBmXHUwMGZjciBkZW4genUgcHVibGl6aWVyZW5kZW4gU2VydmljZSBlaW4uIEVzIGtcdTAwZjZubmVuIGF1Y2ggd2VpdGVyZSBQYXJhbWV0ZXIgYW5nZWdlYmVuIHdlcmRlbi4gTVx1MDBmNmdsaWNoZXJ3ZWlzZSBpc3QgZWluZSBBdXRoZW50aWZpemllcnVuZyBlcmZvcmRlcmxpY2guCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0VfU0lNUExFX0RFU0M9R2ViZW4gU2llIGVpbmUgV1NETC1VUkwsIGVpbmVuIE5hbWVuIHVuZCBlaW5lIG9wdGlvbmFsZSBCZXNjaHJlaWJ1bmcgZlx1MDBmY3IgZGllIHp1IHB1YmxpemllcmVuZGUgU2VydmljZXNjaG5pdHRzdGVsbGUgZWluLiBNXHUwMGY2Z2xpY2hlcndlaXNlIGlzdCBlaW5lIEF1dGhlbnRpZml6aWVydW5nIGVyZm9yZGVybGljaC4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9BRFZBTkNFRF9ERVNDPUdlYmVuIFNpZSBkaWUgV1NETC1VUkwgdW5kIGVpbmVuIE5hbWVuIGZcdTAwZmNyIGRpZSB6dSBwdWJsaXppZXJlbmRlIFNlcnZpY2VzY2huaXR0c3RlbGxlIGVpbi4gRXMga1x1MDBmNm5uZW4gYXVjaCB3ZWl0ZXJlIFBhcmFtZXRlciBhbmdlZ2ViZW4gd2VyZGVuLiBNXHUwMGY2Z2xpY2hlcndlaXNlIGlzdCBlaW5lIEF1dGhlbnRpZml6aWVydW5nIGVyZm9yZGVybGljaC4KLUZPUk1fTEFCRUxfUFVCTElTSF9GT1JNPVB1Ymxpa2F0aW9uc2Zvcm1hdAotRk9STV9MQUJFTF9ERVNDUklQVElPTj1CZXNjaHJlaWJ1bmcKLUZPUk1fTEFCRUxfREVTQ1JJUFRJT05TPUJlc2NocmVpYnVuZ2VuCi1NU0dfSU5GT19CVVNJTkVTU19QVUJMSVNIRUQ9SVdBQjAxNThJIEdlc2NoXHUwMGU0ZnQgJTEgd3VyZGUgZXJmb2xncmVpY2ggcHVibGl6aWVydC4KLU1TR19JTkZPX1NFUlZJQ0VfUFVCTElTSEVEPUlXQUIwMTU5SSBTZXJ2aWNlICUxIHd1cmRlIGVyZm9sZ3JlaWNoIHB1YmxpemllcnQuCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9QVUJMSVNIRUQ9SVdBQjAxNjBJIFNlcnZpY2VzY2huaXR0c3RlbGxlICUxIHd1cmRlIGVyZm9sZ3JlaWNoIHB1YmxpemllcnQuCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FPUlXQUIwMTYxRSBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiBOYW1lbiBlaW4uCi1NU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFPUlXQUIwMjUwRSBXXHUwMGU0aGxlbiBTaWUgZWluZSBiZWxlZ3RlIFNwcmFjaGUgZlx1MDBmY3IgJTEgaW4gWmVpbGUgJTIgYXVzLiBOaWNodCBiZWxlZ3RlIFNwcmFjaGVuIGRcdTAwZmNyZmVuIG51ciB2b24gZGVyIGVyc3RlbiBaZWlsZSB2ZXJ3ZW5kZXQgd2VyZGVuLgotTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0U9SVdBQjAyNTFFIFx1MDBjNG5kZXJuIFNpZSBkaWUgU3ByYWNoZSBmXHUwMGZjciAlMSBpbiBaZWlsZSAlMi4gRGllIGFrdHVlbGxlIFNwcmFjaGUgd2lyZCBiZXJlaXRzIHZlcndlbmRldC4KLU1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUPUlXQUIwMjUyRSBHZWJlbiBTaWUgZWluZW4gZ1x1MDBmY2x0aWdlbiAlMSBpbiBaZWlsZSAlMiBlaW4uCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTD1JV0FCMDI1M0UgR2ViZW4gU2llIGVpbmUgZ1x1MDBmY2x0aWdlIFdTREwtVVJMIGVpbi4KLU1TR19FUlJPUl9OT19OQU1FUz1JV0FCMDI1NEUgRlx1MDBmY2dlbiBTaWUgbWluZGVzdGVucyBlaW5lbiBOYW1lbiBoaW56dS4KLU1TR19FUlJPUl9JTlZBTElEX1NFUlZJQ0U9SVdBQjAyNTVFIEdlYmVuIFNpZSBlaW5lbiBnXHUwMGZjbHRpZ2VuIFNlcnZpY2UgYW4uCi1NU0dfRVJST1JfSU5WQUxJRF9CVVNJTkVTUz1JV0FCMDI1NkUgR2ViZW4gU2llIGVpbiBnXHUwMGZjbHRpZ2VzIEdlc2NoXHUwMGU0ZnQgYW4uCi0KLSMgQnVzaW5lc3MgUHVibGlzaCBTZXJ2aWNlIGFjdGlvbgotQUxUX1BVQkxJU0hfU0VSVklDRT1TZXJ2aWNlIHB1YmxpemllcmVuCi0KLSMgV1NETCBCcm93c2VyCi1USVRMRV9XU0RMX0JST1dTRVI9V1NETC1Ccm93c2VyIC0gJTEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0U9V1x1MDBlNGhsZW4gU2llIGVpbmUgV1NETC1RdWVsbGUgYXVzOgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9XRUJQUk9KRUNUUz1XZWJwcm9qZWt0ZQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9RmF2b3JpdGVuCi1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVdlYnByb2pla3QKLUZPUk1fTEFCRUxfV1NETF9VUkw9V1NETC1VUkwKLUFMVF9XU0RMX0JST1dTRVI9V1NETC1Ccm93c2VyCi0KLSMgRGV0YWlscwotRk9STV9MSU5LX0VESVQ9QmVhcmJlaXRlbgotRk9STV9MSU5LX0NBTkNFTD1BYmJyZWNoZW4KLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPUdlc2NoXHUwMGU0ZnRzc2NobFx1MDBmY3NzZWwKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9U2VydmljZXNjaGxcdTAwZmNzc2VsCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX0tFWT1UTW9kZWwtU2NobFx1MDBmY3NzZWwKLUZPUk1fTEFCRUxfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVM9QmVudXR6ZXJkZWZpbmllcnRlIEthdGVnb3JpZW4KLUZPUk1fTEFCRUxfQ0hFQ0tFRD1cdTAwZGNiZXJwclx1MDBmY2Z0Ci1GT1JNX0xBQkVMX0ZJTEU9RGF0ZWkKLU1TR19RVUVTVElPTl9QVUJMSVNIX0lURU09RGVyIEVpbnRyYWcga29ubnRlIGluIGRlciBSZWdpc3RyaWVydW5nIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi4gU29sbCBlciBwdWJsaXppZXJ0IHdlcmRlbj8KLU1TR19RVUVTVElPTl9TRVJWSUNFX1BVQkxJU0hfQlVTSU5FU1M9RGVyIFNlcnZpY2UgdW5kIHNlaW4gR2VzY2hcdTAwZTRmdCBrb25udGVuIGluIGRlciBSZWdpc3RyaWVydW5nIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi4gUHVibGl6aWVydW5nIGZvcnRzZXR6ZW4/Ci1NU0dfSU5GT19CVVNJTkVTU19VUERBVEVEPUlXQUIwMjU3SSBHZXNjaFx1MDBlNGZ0ICUxIHd1cmRlIGVyZm9sZ3JlaWNoIGFrdHVhbGlzaWVydC4KLU1TR19JTkZPX1NFUlZJQ0VfVVBEQVRFRD1JV0FCMDI1OEkgU2VydmljZSAlMSB3dXJkZSBlcmZvbGdyZWljaCBha3R1YWxpc2llcnQuCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9VUERBVEVEPUlXQUIwMjU5SSBTZXJ2aWNlc2Nobml0dHN0ZWxsZSAlMSB3dXJkZSBlcmZvbGdyZWljaCBha3R1YWxpc2llcnQuCi1NU0dfSU5GT19SRUdJU1RSWV9VUERBVEVEPUlXQUIwMzIzSSBSZWdpc3RyaWVydW5nICUxIHd1cmRlIGVyZm9sZ3JlaWNoIGFrdHVhbGlzaWVydC4KLQotIyBVbnB1Ymxpc2hBY3Rpb24KLUFMVF9VTlBVQkxJU0hfQlVTSU5FU1M9UHVibGl6aWVydW5nIGRlcyBHZXNjaFx1MDBlNGZ0cyB6dXJcdTAwZmNja25laG1lbgotQUxUX1VOUFVCTElTSF9TRVJWSUNFPVB1YmxpemllcnVuZyBkZXMgU2VydmljZXMgenVyXHUwMGZjY2tuZWhtZW4KLUFMVF9VTlBVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0U9UHVibGl6aWVydW5nIGRlciBTZXJ2aWNlc2Nobml0dHN0ZWxsZSB6dXJcdTAwZmNja25laG1lbgotRk9STV9MQUJFTF9VTlBVQkxJU0hfREVTQz1LbGlja2VuIFNpZSA8c3Ryb25nPkxvczwvc3Ryb25nPiBhbiwgdW0gZGllIFB1YmxpemllcnVuZyBkaWVzZXMgT2JqZWt0cyB6dXJcdTAwZmNja3p1bmVobWVuLiBNXHUwMGY2Z2xpY2hlcndlaXNlIGlzdCBlaW5lIEF1dGhlbnRpZml6aWVydW5nIGVyZm9yZGVybGljaC4KLU1TR19JTkZPX0JVU0lORVNTX1VOUFVCTElTSEVEPUlXQUIwMjYwSSBEaWUgUHVibGl6aWVydW5nIHZvbiBHZXNjaFx1MDBlNGZ0ICUxIHd1cmRlIGVyZm9sZ3JlaWNoIHp1clx1MDBmY2NrZ2Vub21tZW4uCi1NU0dfSU5GT19TRVJWSUNFX1VOUFVCTElTSEVEPUlXQUIwMjYxSSBEaWUgUHVibGl6aWVydW5nIHZvbiBTZXJ2aWNlICUxIHd1cmRlIGVyZm9sZ3JlaWNoIHp1clx1MDBmY2NrZ2Vub21tZW4uCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9VTlBVQkxJU0hFRD1JV0FCMDI2MkkgRGllIFB1YmxpemllcnVuZyB2b24gU2VydmljZXNjaG5pdHRzdGVsbGUgJTEgd3VyZGUgZXJmb2xncmVpY2ggenVyXHUwMGZjY2tnZW5vbW1lbi4KLQotIyBBZGQgdG8gV1NETCBQZXJzcGVjdGl2ZQotQUxUX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFPVp1IFdTREwtU2VpdGUgaGluenVmXHUwMGZjZ2VuCi1NU0dfSU5GT19XU0RMX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzZJICUxIHd1cmRlIGVyZm9sZ3JlaWNoIHp1IFdTREwtU2VpdGUgaGluenVnZWZcdTAwZmNndC4KLU1TR19FUlJPUl9XU0RMX05PVF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzc3RSAlMSBrb25udGUgbmljaHQgenUgV1NETC1TZWl0ZSBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbi4KLQotIyBBZGQgdG8gRmF2b3JpdGVzCi1BTFRfQUREX1RPX0ZBVk9SSVRFUz1adSBGYXZvcml0ZW4gaGluenVmXHUwMGZjZ2VuCi1NU0dfSU5GT19GQVZPUklURV9BRERFRD1JV0FCMDI2M0kgJTEgd3VyZGUgZXJmb2xncmVpY2ggenUgZGVuIEZhdm9yaXRlbiBoaW56dWdlZlx1MDBmY2d0LgotTVNHX0VSUk9SX0ZBVk9SSVRFX05PVF9BRERFRD1JV0FCMDI2NEUgJTEga29ubnRlIG5pY2h0IHp1IGRlbiBGYXZvcml0ZW4gaGluenVnZWZcdTAwZmNndCB3ZXJkZW4uCi1NU0dfRVJST1JfRkFWT1JJVEVfQUxSRUFEWV9FWElTVFM9SVdBQjAzMjRFICUxIGlzdCBiZXJlaXRzIGluIGRlbiBGYXZvcml0ZW4gdm9yaGFuZGVuLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9RmF2b3JpdCBiZXJlaXRzIHZvcmhhbmRlbi4gIFx1MDBkY2JlcnNjaHJlaWJlbj8KLQotIyBSZWZyZXNoCi1NU0dfSU5GT19OT0RFX1JFRlJFU0hFRD1JV0FCMDI2NUkgJTEgd3VyZGUgYWt0dWFsaXNpZXJ0LgotTVNHX1FVRVNUSU9OX1JFTU9WRV9OT0RFPSUxIGtvbm50ZSBpbiBkZXIgUmVnaXN0cmllcnVuZyBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4uIFNvbGwgZGVyIEtub3RlbiBnZWxcdTAwZjZzY2h0IHdlcmRlbj8KLQotIyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXMKLUFMVF9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFUz1TZXJ2aWNlcyB2ZXJ3YWx0ZW4sIGF1ZiBkaWUgVmVyd2Vpc2UgYmVzdGVoZW4KLUZPUk1fTEFCRUxfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfREVTQz1GXHUwMGZjZ2VuIFNpZSBhdWZnZXNwXHUwMGZjcnRlIG9kZXIgcHVibGl6aWVydGUgU2VydmljZXMgenVyIExpc3RlIGRlciBTZXJ2aWNlcyBtaXQgVmVyd2Vpc2VuIGhpbnp1LCBpbmRlbSBTaWUgPHN0cm9uZz5TZXJ2aWNlcyBoaW56dWZcdTAwZmNnZW48L3N0cm9uZz4gYW5rbGlja2VuLiBFbnRmZXJuZW4gU2llIGF1c2dld1x1MDBlNGhsdGUgVmVyd2Vpc2UsIGluZGVtIFNpZSBkZW4gS25vcGYgPHN0cm9uZz5WZXJ3ZWlzZSBlbnRmZXJuZW48L3N0cm9uZz4gYW5rbGlja2VuLiBGXHUwMGZjciBcdTAwYzRuZGVydW5nZW4gaXN0IG1cdTAwZjZnbGljaGVyd2Vpc2UgZWluZSBBdXRoZW50aWZpemllcnVuZyBlcmZvcmRlcmxpY2guCi1GT1JNX0xBQkVMX1JFRkVSRU5DRURfU0VSVklDRVM9U2VydmljZXMsIGF1ZiBkaWUgVmVyd2Vpc2UgYmVzdGVoZW4KLUZPUk1fQlVUVE9OX0FERF9TRVJWSUNFUz1TZXJ2aWNlcyBoaW56dWZcdTAwZmNnZW4KLUZPUk1fQlVUVE9OX1JFTU9WRV9SRUZFUkVOQ0VTPVZlcndlaXNlIGVudGZlcm5lbgotTVNHX0VSUk9SX05PX1JFRkVSRU5DRV9TRUxFQ1RFRD1JV0FCMDI2NkUgQmV2b3IgU2llIGZvcnRmYWhyZW4sIG1cdTAwZmNzc2VuIFNpZSBtaW5kZXN0ZW5zIGVpbmVuIFNlcnZpY2UgYXVzd1x1MDBlNGhsZW4sIGF1ZiBkZW4gVmVyd2Vpc2UgYmVzdGVoZW4uCi1NU0dfRVJST1JfTk9fU0VSVklDRVM9SVdBQjAyNjdFIEJldm9yIFNpZSBmb3J0ZmFocmVuLCBtXHUwMGZjc3NlbiBTaWUgbWluZGVzdGVucyBlaW5lbiBTZXJ2aWNlIGFicnVmZW4gb2RlciBzdWNoZW4uCi1NU0dfRVJST1JfU0VSVklDRV9OT1RfUkVGRVJFTkNFRD1JV0FCMDI2OEUgVmVyd2VpcyBhdWYgU2VydmljZSAlMSBuaWNodCBtXHUwMGY2Z2xpY2guCi1NU0dfRVJST1JfUkVGRVJFTkNFX05PVF9SRU1PVkVEPUlXQUIwMjY5RSBTZXJ2aWNldmVyd2VpcyAlMSBrb25udGUgbmljaHQgZW50ZmVybnQgd2VyZGVuLgotTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VEPUlXQUIwMjcwSSBWZXJ3ZWlzIGF1ZiBTZXJ2aWNlICUxIGVyZm9sZ3JlaWNoLgotTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VfUkVNT1ZFRD1JV0FCMDI3MUkgU2VydmljZXZlcndlaXMgJTEgZXJmb2xncmVpY2ggZW50ZmVybnQuCi0KLSMgTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9ucwotQUxUX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1HZXNjaFx1MDBlNGZ0c2JlemllaHVuZ2VuIHZlcndhbHRlbgotRk9STV9MQUJFTF9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlNfREVTQz1GXHUwMGZjZ2VuIFNpZSBhdWZnZXNwXHUwMGZjcnRlIG9kZXIgcHVibGl6aWVydGUgR2VzY2hcdTAwZTRmdGUgenVyIExpc3RlIGRlciBHZXNjaFx1MDBlNGZ0c2JlemllaHVuZ2VuIGhpbnp1LCBpbmRlbSBTaWUgPHN0cm9uZz4gQmV6aWVodW5nZW4gaGluenVmXHUwMGZjZ2VuPC9zdHJvbmc+IGFua2xpY2tlbi4gRW50ZmVybmVuIFNpZSBhdXNnZXdcdTAwZTRobHRlIEJlemllaHVuZ2VuLCBpbmRlbSBTaWUgPHN0cm9uZz5CZXppZWh1bmdlbiBlbnRmZXJuZW48L3N0cm9uZz4gYW5rbGlja2VuLiBWZXJ2b2xsc3RcdTAwZTRuZGlnZW4gU2llIGF1c2dld1x1MDBlNGhsdGUgQmV6aWVodW5nZW4sIGluZGVtIFNpZSA8c3Ryb25nPkJlemllaHVuZ2VuIHZlcnZvbGxzdFx1MDBlNG5kaWdlbjwvc3Ryb25nPiBhbmtsaWNrZW4uIEtsaWNrZW4gU2llIDxzdHJvbmc+QmV6aWVodW5nZW4gYWt0dWFsaXNpZXJlbjwvc3Ryb25nPiBhbiwgdW0gZGllIExpc3RlIGRlciBCZXppZWh1bmdlbiB6dSBha3R1YWxpc2llcmVuLgotRk9STV9MQUJFTF9JTkNPTVBMRVRFX0FTU0VSVElPTlNfVklTSUJJTElUWV9ERVNDPUJlYWNodGVuIFNpZSwgZGFzcyB1bnZvbGxzdFx1MDBlNG5kaWdlIEdlc2NoXHUwMGU0ZnRzYmV6aWVodW5nZW4gbnVyIHZvbSBFaWduZXIgZGVzIEdlc2NoXHUwMGU0ZnRzIGFuZ2V6ZWlndCB3ZXJkZW4ga1x1MDBmNm5uZW4uCi1GT1JNX0xBQkVMX0JVU0lORVNTRVM9R2VzY2hcdTAwZTRmdGUKLUZPUk1fQlVUVE9OX1NIT1dfQUxMX1BVQkxJU0hFUl9BU1NFUlRJT05TPUJlemllaHVuZ2VuIGFrdHVhbGlzaWVyZW4KLUZPUk1fQlVUVE9OX0NPTVBMRVRFX1BVQkxJU0hFUl9BU1NFUlRJT05TPUJlemllaHVuZ2VuIHZlcnZvbGxzdFx1MDBlNG5kaWdlbgotRk9STV9CVVRUT05fQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TPUJlemllaHVuZ2VuIGhpbnp1Zlx1MDBmY2dlbgotRk9STV9CVVRUT05fUkVNT1ZFX1BVQkxJU0hFUl9BU1NFUlRJT05TPUJlemllaHVuZ2VuIGVudGZlcm5lbgotTVNHX0lORk9fUFVCTElTSEVSX0FTU0VSVElPTlNfUkVGUkVTSEVEPUlXQUIwMzI1SSBHZXNjaFx1MDBlNGZ0c2JlemllaHVuZ2VuIHdlcmRlbiBha3R1YWxpc2llcnQuCi1NU0dfRVJST1JfTk9fSU5DT01QTEVURV9BU1NFUlRJT05fU0VMRUNURUQ9SVdBQjAzMjZFIFdcdTAwZTRobGVuIFNpZSBtaW5kZXN0ZW5zIGVpbmUgdW52b2xsc3RcdTAwZTRuZGlnZSBHZXNjaFx1MDBlNGZ0c2JlemllaHVuZyBhdXMuCi1NU0dfRVJST1JfTk9UX09XTkVEX0JVU0lORVNTPUlXQUIwMzI3RSBEaWVzZSBPcGVyYXRpb24ga2FubiBuaWNodCBmXHUwMGZjciBlaW4gR2VzY2hcdTAwZTRmdCBhdXNnZWZcdTAwZmNocnQgd2VyZGVuLCBkYXMgZWluZXIgYW5kZXJlbiBQYXJ0ZWkgZ2VoXHUwMGY2cnQuCi0KLSMgR2V0QnVzaW5lc3NlcwotQUxUX0dFVF9CVVNJTkVTUz1HZXNjaFx1MDBlNGZ0IGFicnVmZW4KLUFMVF9HRVRfQlVTSU5FU1NFUz1HZXNjaFx1MDBlNGZ0ZSBhYnJ1ZmVuCi1OT0RFX05BTUVfU0VSVklDRV9CVVNJTkVTUz1HZXNjaFx1MDBlNGZ0IGZcdTAwZmNyIFNlcnZpY2UgJTEKLU5PREVfTkFNRV9TSV9CVVNJTkVTU0VTPUdlc2NoXHUwMGU0ZnRlIGZcdTAwZmNyIFNlcnZpY2VzY2huaXR0c3RlbGxlICUxCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1NFUlZJQ0VfTk9ERT1EZXIgU2VydmljZSBrb25udGUgaW4gZGVyIFJlZ2lzdHJpZXJ1bmcgbmljaHQgZ2VmdW5kZW4gd2VyZGVuLiBTb2xsIGRpZXNlciBLbm90ZW4gZ2VsXHUwMGY2c2NodCB3ZXJkZW4/Ci0KLSMgR2V0U2VydmljZUludGVyZmFjZXMKLUFMVF9HRVRfU0VSVklDRV9JTlRFUkZBQ0VTPVNlcnZpY2VzY2huaXR0c3RlbGxlbiBhYnJ1ZmVuCi1OT0RFX05BTUVfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVM9U2VydmljZXNjaG5pdHRzdGVsbGUgZlx1MDBmY3IgU2VydmljZSAlMQotTVNHX1FVRVNUSU9OX0dFVF9TSV9SRU1PVkVfU0VSVklDRV9OT0RFPURlciBTZXJ2aWNlIGtvbm50ZSBpbiBkZXIgUmVnaXN0cmllcnVuZyBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4uIFNvbGwgZGllc2VyIEtub3RlbiBnZWxcdTAwZjZzY2h0IHdlcmRlbj8KLQotIyBHZXRTZXJ2aWNlcwotQUxUX0dFVF9TRVJWSUNFUz1TZXJ2aWNlcyBhYnJ1ZmVuCi1OT0RFX05BTUVfU0lfU0VSVklDRVM9U2VydmljZXMgZlx1MDBmY3IgU2VydmljZXNjaG5pdHRzdGVsbGUgJTEKLU5PREVfTkFNRV9CVVNJTkVTU19TRVJWSUNFUz1TZXJ2aWNlcyBmXHUwMGZjciBHZXNjaFx1MDBlNGZ0ICUxCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1NJX05PREU9RGllIFNlcnZpY2VzY2huaXR0c3RlbGxlIGtvbm50ZSBpbiBkZXIgUmVnaXN0cmllcnVuZyBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4uIFNvbGwgZGllc2VyIEtub3RlbiBnZWxcdTAwZjZzY2h0IHdlcmRlbj8KLU1TR19RVUVTVElPTl9SRU1PVkVfQlVTSU5FU1NfTk9ERT1EYXMgR2VzY2hcdTAwZTRmdCBrb25udGUgaW4gZGVyIFJlZ2lzdHJpZXJ1bmcgbmljaHQgZ2VmdW5kZW4gd2VyZGVuLiBTb2xsIGRpZXNlciBLbm90ZW4gZ2VsXHUwMGY2c2NodCB3ZXJkZW4/Ci0KLSMgUmVmcmVzaFVERElOb2Rlc0FjdGlvbgotTVNHX0VSUk9SX05PREVfREFUQV9WQUxJREFUSU9OX0ZBSUxFRD1JV0FCMDI3MkUgJTEga29ubnRlIGluIGRlciBSZWdpc3RyaWVydW5nIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi4KLQotIyBTdW1tYXJpZXMKLUFMVF9TVU1NQVJZX1FVRVJJRVM9WnVzYW1tZW5mYXNzdW5nIGRlciBBYmZyYWdlbgotQUxUX1NVTU1BUllfQlVTSU5FU1NFUz1adXNhbW1lbmZhc3N1bmcgZGVyIEFiZnJhZ2VuCi1BTFRfU1VNTUFSWV9TRVJWSUNFUz1adXNhbW1lbmZhc3N1bmcgZGVyIFNlcnZpY2VzCi1BTFRfU1VNTUFSWV9TRVJWSUNFX0lOVEVSRkFDRVM9WnVzYW1tZW5mYXNzdW5nIGRlciBTZXJ2aWNlc2Nobml0dHN0ZWxsZW4KLUZPUk1fTEFCRUxfUVVFUklFUz1BYmZyYWdlbgotCi0jIFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbgotTVNHX1FVRVNUSU9OX0lURU1fVkFMSURBVElPTl9GQUlMRUQ9JTEga29ubnRlIGluIGRlciBSZWdpc3RyaWVydW5nIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi4gU29sbCBlcyBnZWxcdTAwZjZzY2h0IHdlcmRlbj8KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9TmF2aWdhdG9yIC0gQ29udGFpbmVyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1OYXZpZ2F0b3IgLSBTeW1ib2xsZWlzdGUKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPU5hdmlnYXRvciAtIEluaGFsdAotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9QWt0aW9uZW4gLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPUVpZ2Vuc2NoYWZ0ZW4gLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1FaWdlbnNjaGFmdGVuIC0gU3ltYm9sbGVpc3RlCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9RWlnZW5zY2hhZnRlbiAtIEluaGFsdAotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1TdGF0dXMgLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVN0YXR1cyAtIFN5bWJvbGxlaXN0ZQotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9U3RhdHVzIC0gSW5oYWx0Ci1GUkFNRV9USVRMRV9VRERJX1BFUlNQRUNUSVZFX0NPTlRFTlQ9VURESS1TZWl0ZSAtIEluaGFsdAotRlJBTUVfVElUTEVfQ0FURUdPUklFU19XT1JLQVJFQT1LYXRlZ29yaWVuIC0gQXJiZWl0c2JlcmVpY2gKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfVE9PTEJBUj1LYXRlZ29yaWVuIC0gU3ltYm9sbGVpc3RlCi1GUkFNRV9USVRMRV9DQVRFR09SSUVTX0NPTlRFTlQ9S2F0ZWdvcmllbiAtIEluaGFsdAotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPVdTREwtQnJvd3NlciAtIFN5bWJvbGxlaXN0ZQotRlJBTUVfVElUTEVfV1NETF9DT05URU5UPVdTREwtQnJvd3NlciAtIEluaGFsdAotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX0JVU0lORVNTX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgR2VzY2hcdTAwZTRmdHNkZXRhaWxzCi1GT1JNX1RJVExFX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRT1Gb3JtdWxhciB6dXIgUHVibGl6aWVydW5nIGVpbmVzIEdlc2NoXHUwMGU0ZnRzc2VydmljZXMKLUZPUk1fVElUTEVfR0VUX0ZPUk09Rm9ybXVsYXIgenVtIFRyZWZmZW4gZWluZXIgQXVzd2FobCBhdXMgYXVmZ2VzcFx1MDBmY3J0ZW4gdW5kIHB1YmxpemllcnRlbiBPYmpla3RlbgotRk9STV9USVRMRV9JVEVNU19TVU1NQVJZPUZvcm11bGFyIGZcdTAwZmNyIFp1c2FtbWVuZmFzc3VuZyB2b24gRWludHJcdTAwZTRnZW4KLUZPUk1fVElUTEVfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPUZvcm11bGFyIHp1bSBWZXJ3YWx0ZW4gdm9uIEdlc2NoXHUwMGU0ZnRzYmV6aWVodW5nZW4KLUZPUk1fVElUTEVfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVM9Rm9ybXVsYXIgenVtIFZlcndhbHRlbiB2b24gU2VydmljZXMsIGF1ZiBkaWUgVmVyd2Vpc2UgYmVzdGVoZW4KLUZPUk1fVElUTEVfT1BFTl9SRUdJU1RSWT1SZWdpc3RyaWVydW5nc2Zvcm11bGFyIFx1MDBmNmZmbmVuCi1GT1JNX1RJVExFX1JFR0lTVFJZX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgUmVnaXN0cmllcnVuZ3NkZXRhaWxzCi1GT1JNX1RJVExFX1JFR0lTVFJZX1BVQkxJU0g9Rm9ybXVsYXIgenVyIFB1YmxpemllcnVuZyBlaW5lciBSZWdpc3RyaWVydW5nCi1GT1JNX1RJVExFX1JFR0lTVFJZX0ZJTkQ9Rm9ybXVsYXIgenVtIFN1Y2hlbiBuYWNoIGVpbmVyIFJlZ2lzdHJpZXJ1bmcKLUZPUk1fVElUTEVfUkVTVUxUUz1Gb3JtdWxhciBmXHUwMGZjciBFcmdlYm5pc3NlCi1GT1JNX1RJVExFX1NFUlZJQ0VfREVUQUlMUz1Gb3JtdWxhciBmXHUwMGZjciBTZXJ2aWNlZGV0YWlscwotRk9STV9USVRMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPUZvcm11bGFyIGZcdTAwZmNyIFNlcnZpY2VzY2huaXR0c3RlbGxlbmRldGFpbHMKLUZPUk1fVElUTEVfVU5QVUJMSVNIPUZvcm11bGFyIHp1bSBadXJcdTAwZmNja25laG1lbiBlaW5lciBQdWJsaXppZXJ1bmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGlfZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGlfZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2ODk2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9VURESQotCi0jIE5vZGVzCi1OT0RFX05BTUVfVURESV9NQUlOPVVEREkgLSBQcmluY2lwYWwKLU5PREVfTkFNRV9RVUVSSUVTX0ZPTERFUj1Db25zdWx0YXMgZWplY3V0YWRhcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9CVVNJTkVTU0VTX0ZPTERFUj1FbXByZXNhcyBwdWJsaWNhZGFzCi1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VTX0ZPTERFUj1TZXJ2aWNpb3MgcHVibGljYWRvcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFX0lOVEVSRkFDRVNfRk9MREVSPUludGVyZmFjZXMgZGUgc2VydmljaW8gcHVibGljYWRhcwotCi0jIE9wZW5SZWdpc3RyeUFjdGlvbgotQUxUX09QRU5fUkVHSVNUUlk9QWJyaXIgcmVnaXN0cm8KLUZPUk1fTEFCRUxfT1BFTl9SRUdJU1RSWV9ERVNDPUVzcGVjaWZpcXVlIGxlIG5vbWJyZSB5IGVsIFVSTCBkZSBjb25zdWx0YSBkZWwgcmVnaXN0cm8gcXVlIGRlc2VhIGFicmlyLiBTaSBzZWxlY2Npb25hIHVuIHJlZ2lzdHJvIGRlIGZhdm9yaXRvcyBzZSBjdW1wbGltZW50YXJcdTAwZTEgYXV0b21cdTAwZTF0aWNhbWVudGUgbGEgaW5mb3JtYWNpXHUwMGYzbiBuZWNlc2FyaWEuIFB1bHNlIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSBhYnJpciBlbCByZWdpc3Ryby4KLUZPUk1fTEFCRUxfRkFWT1JJVEVfUkVHSVNUUlk9UmVnaXN0cm8gZGUgZmF2b3JpdG9zCi1GT1JNX0xBQkVMX1JFR0lTVFJZX05BTUU9Tm9tYnJlIGRlIHJlZ2lzdHJvCi1GT1JNX0xBQkVMX0lOUVVJUllfVVJMPVVSTCBkZSBjb25zdWx0YQotRk9STV9MQUJFTF9DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUz1Db21wcm9iYXIgY2F0ZWdvclx1MDBlZGFzIGRlZmluaWRhcyBwb3IgZWwgdXN1YXJpbwotREVGQVVMVF9SRUdJU1RSWV9OQU1FPVJlZ2lzdHJvIGRlIHBydWViYSBVRERJIGRlIElCTQotTVNHX0VSUk9SX0lOVkFMSURfUkVHSVNUUllfTkFNRT1JV0FCMDEzNkUgRW50cmUgdW4gbm9tYnJlIGRlIHJlZ2lzdHJvIHZcdTAwZTFsaWRvLgotTVNHX0VSUk9SX0lOVkFMSURfSU5RVUlSWV9VUkw9SVdBQjAxMzhFIEVudHJlIHVuIFVSTCBkZSBjb25zdWx0YSB2XHUwMGUxbGlkby4KLU1TR19JTkZPX1JFR0lTVFJZX09QRU5FRD1JV0FCMDEzOUkgRWwgcmVnaXN0cm8gbGxhbWFkbyAlMSB5IHViaWNhZG8gZW4gJTIgc2UgaGEgYWJpZXJ0byBzYXRpc2ZhY3RvcmlhbWVudGUuCi1GT1JNX0xBQkVMX0lTX1dFQlNQSEVSRV9VRERJX1JFR0lTVFJZPVx1MDBiZkVzIHVuIHJlZ2lzdHJvIFVEREkgZGUgV2ViU3BoZXJlPwotREVGQVVMVF9SRUdJU1RSWV9OQU1FX1dFQlNQSEVSRT1SZWdpc3RybyBVRERJIHByaXZhZG8gZGUgSUJNIFdlYlNwaGVyZQotRk9STV9MQUJFTF9SRUdJU1RSWV9IT1NUPVNpc3RlbWEgcHJpbmNpcGFsCi1GT1JNX0xBQkVMX1JFR0lTVFJZX1BPUlQ9UHVlcnRvCi0KLSMgVXNlci1kZWZpbmVkIENhdGVnb3JpZXMKLUZPUk1fTEFCRUxfQUREX0NBVEVHT1JZX0RBVEE9PGEgaHJlZj0iJTEiPlB1bHNlIGFxdVx1MDBlZDwvYT4gcGFyYSBjYXJnYXIgbG9zIGRhdG9zIGRlIGVzdGEgY2F0ZWdvclx1MDBlZGEuCi1GT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfRklMRT1Ob21icmUgZGUgYXJjaGl2byBkZSBkYXRvcyBkZSBjYXRlZ29yXHUwMGVkYQotTVNHX0lORk9fTk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVNfRk9VTkQ9SVdBQjAzNzFJIE5vIHNlIGhhbiBkZXRlY3RhZG8gY2F0ZWdvclx1MDBlZGFzIGRlZmluaWRhcyBwb3IgZWwgdXN1YXJpby4KLU1TR19JTkZPX05PX0NBVEVHT1JZX0RBVEE9SVdBQjAzNzJJIExvcyBkYXRvcyBkZSBjYXRlZ29yXHUwMGVkYSBwYXJhICUxIG5vIGVzdFx1MDBlMW4gZGlzcG9uaWJsZXMgbyBubyBzb24gdlx1MDBlMWxpZG9zLgotTVNHX0lORk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfTE9BREVEPUlXQUIwMzczSSBMb3MgZGF0b3MgcGFyYSBsYSBjYXRlZ29yXHUwMGVkYSAlMSBkZWZpbmlkYSBwb3IgZWwgdXN1YXJpbyBzZSBoYW4gY2FyZ2FkbyBzYXRpc2ZhY3RvcmlhbWVudGUuCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0tFWT1JV0FCMDM3NEUgQXJjaGl2byBkZSBkYXRvcyBubyB2XHUwMGUxbGlkbyBwYXJhIGxhIGNhdGVnb3JcdTAwZWRhICUxIGRlZmluaWRhIHBvciBlbCB1c3VhcmlvLiBTZSBoYSBlbmNvbnRyYWRvIHVuYSBjbGF2ZSBkZSBjYXRlZ29yXHUwMGVkYSAnJTInIHBlcm8gc2UgZXNwZXJhYmEgJyUzJy4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfRk9STUFUPUlXQUIwNDczRSBGb3JtYXRvIGRlc2Nvbm9jaWRvIGVuIGxcdTAwZWRuZWE6ICUxIGRlbCBhcmNoaXZvIGRlIGRhdG9zIHBhcmEgbGEgY2F0ZWdvclx1MDBlZGEgJTIgZGVmaW5pZGEgcG9yIGVsIHVzdWFyaW8uIExhIGxcdTAwZWRuZWEgZXM6ICIlMyIKLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEU9SVdBQjAzNzVFIEFyY2hpdm8gZGUgZGF0b3Mgbm8gdlx1MDBlMWxpZG8gcGFyYSBsYSBjYXRlZ29yXHUwMGVkYSAlMSBkZWZpbmlkYSBwb3IgZWwgdXN1YXJpby4KLU1TR19FUlJPUl9TQVZJTkdfQ0FURUdPUllfREFUQT1JV0FCMDQ3NEUgU2UgaGEgcHJvZHVjaWRvIHVuIGVycm9yIGFsIGd1YXJkYXIgZGF0b3MgcGFyYSBsYSBjYXRlZ29yXHUwMGVkYSAlMS4gVGV4dG8gZGUgZXhjZXBjaVx1MDBmM246ICUyCi0KLSMgVURESSBDYXRlZ29yeSBCcm93c2VyCi1USVRMRV9DQVRFR09SWV9CUk9XU0VSPU5hdmVnYWRvciBkZSBjYXRlZ29yXHUwMGVkYXMKLUFMVF9DQVRFR09SSUVTPUNhdGVnb3JcdTAwZWRhcwotCi0jIERldGFpbHMKLUFMVF9SRUdJU1RSWV9ERVRBSUxTPURldGFsbGVzIGRlIHJlZ2lzdHJvCi1BTFRfQlVTSU5FU1NfREVUQUlMUz1EZXRhbGxlcyBkZSBlbXByZXNhCi1BTFRfU0VSVklDRV9ERVRBSUxTPURldGFsbGVzIGRlIHNlcnZpY2lvCi1BTFRfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1EZXRhbGxlcyBkZSBpbnRlcmZheiBkZSBzZXJ2aWNpbwotRk9STV9MQUJFTF9ERVRBSUxTX0VESVRBQkxFPUxvcyBkZXRhbGxlcyBkZSA8c3Ryb25nPiUxPC9zdHJvbmc+IHNlIG11ZXN0cmFuIG1cdTAwZTFzIGFiYWpvLiBBbGd1bm9zIGVsZW1lbnRvcyBwdWVkZW4gYVx1MDBmMWFkaXJzZSwgZWxpbWluYXJzZSBvIGNhbWJpYXJzZS4gUHVlZGUgc2VyIG5lY2VzYXJpYSBsYSBhdXRlbnRpY2FjaVx1MDBmM24gcGFyYSBsb3MgY2FtYmlvcy4gRW4gbGEgcGFydGUgaW5mZXJpb3IgZGUgZXN0YSBwXHUwMGUxZ2luYSBzZSBpbmRpY2FuIG90cmFzIGFjY2lvbmVzLgotCi0jIEdldAotQUxUX0dFVD1PYnRlbmVyCi0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZQotRk9STV9DT05UUk9MX1RJVExFX05BTUVfVEVYVF9WQUxVRT1Ob21icmUgZGUgdmFsb3IKLUZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFPVZhbG9yIGRlIGRlc2NyaXBjaVx1MDBmM24KLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfTkFNRT1Ob21icmUgZGUgY2xhdmUgZGUgY2F0ZWdvclx1MDBlZGEKLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfVkFMVUU9VmFsb3IgZGUgY2xhdmUgZGUgY2F0ZWdvclx1MDBlZGEKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FPU5vbWJyZSBkZSBjbGF2ZSBkZSBpZGVudGlmaWNhZG9yCi1GT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfVkFMVUU9VmFsb3IgZGUgY2xhdmUgZGUgaWRlbnRpZmljYWRvcgotRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkw9VVJMIGRlIGRlc2N1YnJpbWllbnRvCi0KLSMgRmluZCBhY3Rpb25zCi1BTFRfRklORD1CdXNjYXIKLUFMVF9TVUJRVUVSWT1TdWJjb25zdWx0YSBkZSBiXHUwMGZhc3F1ZWRhIGRlICUxCi1GT1JNX0xBQkVMX1FVRVJZX05BTUU9Tm9tYnJlIGRlIGVzdGEgY29uc3VsdGEKLURFRkFVTFRfUVVFUllfTkFNRT1yZXN1bHRhZG9zIGRlIGxhIGNvbnN1bHRhCi1ERUZBVUxUX1NVQlFVRVJZX05BTUU9JTEgLSBzdWJjb25zdWx0YSBkZSAlMgotRk9STV9MQUJFTF9TRUFSQ0hfRk9SPUJ1c2NhcgotRk9STV9PUFRJT05fQlVTSU5FU1NFUz1FbXByZXNhcwotRk9STV9PUFRJT05fU0VSVklDRVM9U2VydmljaW9zCi1GT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVM9SW50ZXJmYWNlcyBkZSBzZXJ2aWNpbwotRk9STV9MQUJFTF9TRUFSQ0hfVFlQRT1UaXBvIGRlIGJcdTAwZmFzcXVlZGEKLUZPUk1fUkFESU9fU0lNUExFPVNpbXBsZQotRk9STV9SQURJT19BRFZBTkNFRD1BdmFuemFkYQotRk9STV9SQURJT19VVUlEPVVVSUQKLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU0VTX1NJTVBMRV9ERVNDPUVudHJlIGVsIG5vbWJyZSBwYXJjaWFsIG8gY29tcGxldG8gZGUgdW5hIGVtcHJlc2EgcXVlIGRlc2VlIGJ1c2Nhci4gU2UgcHVlZGUgdXRpbGl6YXIgZWwgc1x1MDBlZG1ib2xvICclJyBhIG1vZG8gZGUgY29tb2RcdTAwZWRuIHBhcmEgcXVlIGhhZ2EgbGFzIHZlY2VzIGRlIGN1YWxxdWllciBjYXJcdTAwZTFjdGVyLiBQdWxzZSA8c3Ryb25nPklyPC9zdHJvbmc+IHBhcmEgZWplY3V0YXIgbGEgYlx1MDBmYXNxdWVkYS4KLUZPUk1fTEFCRUxfRklORF9BRFZBTkNFRF9ERVNDPUVudHJlIHZhbG9yZXMgcGFyYSB1bm8gbyB2YXJpb3MgZGUgbG9zIHBhclx1MDBlMW1ldHJvcyBxdWUgZmlndXJhbiBhIGNvbnRpbnVhY2lcdTAwZjNuLiBTZSBwdWVkZSB1dGlsaXphciBlbCBzXHUwMGVkbWJvbG8gJyUnIGEgbW9kbyBkZSBjb21vZFx1MDBlZG4gcGFyYSBxdWUgaGFnYSBsYXMgdmVjZXMgZGUgY3VhbHF1aWVyIGNhclx1MDBlMWN0ZXIgZW4gZWwgY2FtcG8gTm9tYnJlIGRlIGxhIHRhYmxhIGRlIG5vbWJyZXMuIFB1ZWRlIHNlciBuZWNlc2FyaWEgbGEgYXV0ZW50aWNhY2lcdTAwZjNuLiBQdWxzZSA8c3Ryb25nPklyPC9zdHJvbmc+IHBhcmEgZWplY3V0YXIgbGEgYlx1MDBmYXNxdWVkYS4KLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU19VVUlEX0RFU0M9RW50cmUgZWwgVVVJRCBkZSBsYSBlbXByZXNhIHF1ZSBkZXNlYSBidXNjYXIuIFB1bHNlIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSBlamVjdXRhciBsYSBiXHUwMGZhc3F1ZWRhLgotRk9STV9MQUJFTF9OQU1FUz1Ob21icmVzCi1GT1JNX0xJTktfQUREPUFcdTAwZjFhZGlyCi1GT1JNX0xJTktfR0VUPU9idGVuZXIKLUZPUk1fTElOS19GSU5EPUJ1c2NhcgotRk9STV9MSU5LX1JFTU9WRT1FbGltaW5hcgotRk9STV9MQUJFTF9PV05FRD1Db24gcHJvcGlldGFyaW8KLUZPUk1fTEFCRUxfUFVCTElTSF9VUkw9VVJMIGRlIHB1YmxpY2FjaVx1MDBmM24KLUZPUk1fTEFCRUxfVVNFUklEPUlEIGRlIHVzdWFyaW86Ci1GT1JNX0xBQkVMX1BBU1NXT1JEPUNvbnRyYXNlXHUwMGYxYToKLUZPUk1fTEFCRUxfTEFOR1VBR0U9SWRpb21hCi1GT1JNX0xBQkVMX05BTUU9Tm9tYnJlCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPURlc2NyaXBjaVx1MDBmM24KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VOPUluZ2xcdTAwZTlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BQT1BZmFyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BQj1BYmtoYXppYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BRj1BZnJpa2FhbnMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FNPUFtXHUwMGUxcmljbwotRk9STV9PUFRJT05fTEFOR1VBR0VfQVI9XHUwMGMxcmFiZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQVM9QXNhbVx1MDBlOXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FZPUF5bWFyYQotRk9STV9PUFRJT05fTEFOR1VBR0VfQVo9QXplclx1MDBlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfQkE9QmFzaGtpcgotRk9STV9PUFRJT05fTEFOR1VBR0VfQkU9QmllbG9ycnVzbwotRk9STV9PUFRJT05fTEFOR1VBR0VfQkc9Qlx1MDBmYWxnYXJvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CSD1CaWhhcmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JJPUJpc2xhbWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JOPUJlbmdhbFx1MDBlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfQk89VGliZXRhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JSPUJyZXRcdTAwZjNuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DQT1DYXRhbFx1MDBlMW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NPPUNvcnNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DWj1DaGVjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfQ1k9R2FsXHUwMGU5cwotRk9STV9PUFRJT05fTEFOR1VBR0VfREE9RGFuXHUwMGU5cwotRk9STV9PUFRJT05fTEFOR1VBR0VfREU9QWxlbVx1MDBlMW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RaPUJodXRhblx1MDBlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfRUw9R3JpZWdvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTz1Fc3BlcmFudG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VTPUVzcGFcdTAwZjFvbAotRk9STV9PUFRJT05fTEFOR1VBR0VfRVQ9RXN0b25pbwotRk9STV9PUFRJT05fTEFOR1VBR0VfRVU9VmFzY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZBPUZhcnNpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GST1GaW5sYW5kXHUwMGU5cwotRk9STV9PUFRJT05fTEFOR1VBR0VfRko9RmlkamkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZPPUZlcm9cdTAwZTlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GUj1GcmFuY1x1MDBlOXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZZPUZyaXNcdTAwZjNuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HQT1JcmxhbmRcdTAwZTlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HRD1HYVx1MDBlOWxpY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dMPUdhbGxlZ28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dOPUd1YXJhblx1MDBlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfR1U9R3VqYXJhdGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hBPUhhdXNhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IST1IaW5kaQotRk9STV9PUFRJT05fTEFOR1VBR0VfSFI9Q3JvYXRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IVT1IXHUwMGZhbmdhcm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hZPUFybWVuaW8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lBPUludGVybGluZ3VhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JRT1JbnRlcmxpbmd1ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSUs9SW51cGlhawotRk9STV9PUFRJT05fTEFOR1VBR0VfSU49SW5kb25lc2lvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JUz1Jc2xhbmRcdTAwZTlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JVD1JdGFsaWFubwotRk9STV9PUFRJT05fTEFOR1VBR0VfSVc9SGVicmVvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KQT1KYXBvblx1MDBlOXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pJPVlpZGRpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pXPUphdmFuXHUwMGU5cwotRk9STV9PUFRJT05fTEFOR1VBR0VfS0E9R2VvcmdpYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LSz1LYXphagotRk9STV9PUFRJT05fTEFOR1VBR0VfS0w9R3JvZW5sYW5kXHUwMGU5cwotRk9STV9PUFRJT05fTEFOR1VBR0VfS009Q2FtYm95YW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTj1LYW5uYWRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTz1Lb3JlYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LUz1DYWNoZW1pcgotRk9STV9PUFRJT05fTEFOR1VBR0VfS1U9S3VyZG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tZPUtpcmdoaXoKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xBPUxhdFx1MDBlZG4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xOPUxpbmdhbGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xPPUxhb3NpYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MVD1MaXR1YW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MVj1MZXRcdTAwZjNuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NRz1NYWxnYWNoZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTUk9TWFvcmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01LPU1hY2Vkb25pbwotRk9STV9PUFRJT05fTEFOR1VBR0VfTUw9TWFsYXlhbGFtCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTj1Nb25nb2wKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01PPU1vbGRhdm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01SPU1hcmF0aGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01TPU1hbGF5bwotRk9STV9PUFRJT05fTEFOR1VBR0VfTVQ9TWFsdFx1MDBlOXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01ZPUJpcm1hbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05BPU5hdXJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ORT1OZXBhbFx1MDBlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfTkw9SG9sYW5kXHUwMGU5cwotRk9STV9PUFRJT05fTEFOR1VBR0VfTk89Tm9ydWVnbwotRk9STV9PUFRJT05fTEFOR1VBR0VfT0M9T2NjaXRhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09NPShBZmFuKSBPcm9tbwotRk9STV9PUFRJT05fTEFOR1VBR0VfT1I9T3JpeWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BBPVBhbmphYlx1MDBlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfUEw9UG9sYWNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QUz1QYXN0XHUwMGZhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfUFQ9UG9ydHVndVx1MDBlOXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1FVPVF1ZWNodWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JNPVJldG8tcm9tYW5jZQotRk9STV9PUFRJT05fTEFOR1VBR0VfUk49S2lydW5kaQotRk9STV9PUFRJT05fTEFOR1VBR0VfUk89UnVtYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9SVT1SdXNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9SVz1LaW55YXJ3YW5kYQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0E9U1x1MDBlMW5zY3JpdG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NEPVNpbmRoaQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0c9U2FuZ3JvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TSD1TZXJib2Nyb2F0YQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0k9Q2luZ2FsXHUwMGU5cwotRk9STV9PUFRJT05fTEFOR1VBR0VfU0s9RXNsb3ZhY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NMPUVzbG92ZW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTT1TYW1vYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTj1TaG9uYQotRk9STV9PUFRJT05fTEFOR1VBR0VfU089U29tYWxcdTAwZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NRPUFsYmFuXHUwMGU5cwotRk9STV9PUFRJT05fTEFOR1VBR0VfU1I9U2VyYmlvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUz1TaXN3YXRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVD1TZXNvdGhvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVT1TdWRhblx1MDBlOXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NWPVN1ZWNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVz1Td2FoaWxpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UQT1UYW1pbAotRk9STV9PUFRJT05fTEFOR1VBR0VfVEU9VGVndWx1Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9URz1UYXlpY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RIPVRhaWxhbmRcdTAwZTlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UST1UaWdyaW55YQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEs9VHVyY29tYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTD1UYWdhbG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ROPVNldHN3YW5hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTz1Ub25nYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UUj1UdXJjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfVFM9VHNvbmdhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVD1UYXRhcgotRk9STV9PUFRJT05fTEFOR1VBR0VfVFc9VHdpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9VSz1VY3Jhbmlhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VSPVVyZHUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VaPVV6YmVjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfVkk9VmlldG5hbWl0YQotRk9STV9PUFRJT05fTEFOR1VBR0VfVk89Vm9sYXB1awotRk9STV9PUFRJT05fTEFOR1VBR0VfV089VW9sb2YKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1hIPVhob3NhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ZTz1Zb3J1YmEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1pIPUNoaW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aVT1adWxcdTAwZmEKLUZPUk1fTEFCRUxfRVhBQ1RfTkFNRV9NQVRDSD1Db2luY2lkZW5jaWEgZXhhY3RhCi1GT1JNX0xBQkVMX0NBU0VfU0VOU0lUSVZFX01BVENIPVNlbnNpYmxlIGEgbGFzIG1heVx1MDBmYXNjdWxhcy9taW5cdTAwZmFzY3VsYXMKLUZPUk1fTEFCRUxfU09VTkRFWD1TdWVuYSBwYXJlY2lkbwotRk9STV9MQUJFTF9JREVOVElGSUVSUz1JZGVudGlmaWNhZG9yZXMKLUZPUk1fTEFCRUxfSURFTlRJRklFUl9UWVBFPVRpcG8KLQotIyBEbyBub3QgdHJhbnNsYXRlIHRoZSB0d28gaXRlbXMgYmVsb3cuCi1GT1JNX09QVElPTl9JREVOVElGSUVSX0RVTlM9RC1VLU4tUwotRk9STV9PUFRJT05fSURFTlRJRklFUl9USE9NQVNfUkVHSVNUUlk9VGhvbWFzIFJlZ2lzdHJ5Ci0KLUZPUk1fTEFCRUxfS0VZX05BTUU9Tm9tYnJlIGRlIGNsYXZlCi1GT1JNX0xBQkVMX0tFWV9WQUxVRT1WYWxvciBkZSBjbGF2ZQotRk9STV9MQUJFTF9DQVRFR09SSUVTPUNhdGVnb3JcdTAwZWRhcwotRk9STV9MQUJFTF9DQVRFR09SWV9UWVBFPVRpcG8KLUZPUk1fT1BUSU9OX0NBVEVHT1JZX05BSUNTPU5BSUNTCi1GT1JNX09QVElPTl9DQVRFR09SWV9VTlNQU0NfNzM9VU5TUFNDIDcuMwotRk9STV9PUFRJT05fQ0FURUdPUllfR0VPPUdFTwotRk9STV9PUFRJT05fQ0FURUdPUllfRFdDT01NVU5JVFk9ZFcgQ29tbXVuaXR5Ci1GT1JNX0xBQkVMX0JVU0lORVNTX0NBVEVHT1JJRVM9Q29tcGFyYXIgY29uOgotRk9STV9PUFRJT05fQlVTSU5FU1NFU19PTkxZPVNvbG8gZW1wcmVzYXMKLUZPUk1fT1BUSU9OX1NFUlZJQ0VTX09OTFk9U29sbyBzZXJ2aWNpb3MKLUZPUk1fT1BUSU9OX0JPVEg9RW1wcmVzYXMgeSBzZXJ2aWNpb3MKLUZPUk1fTEFCRUxfRElTQ09WRVJZVVJMUz1VUkwgZGUgZGVzY3VicmltaWVudG8KLUZPUk1fTEFCRUxfRElTQ09WRVJZVVJMPVVSTCBkZSBkZXNjdWJyaW1pZW50bwotRk9STV9MQUJFTF9GSU5EUVVBTElGSUVSUz1CdXNjYXIgY2FsaWZpY2Fkb3JlcwotRk9STV9MQUJFTF9DT01CSU5FX0tFWVM9Q29tYmluYXIgY2xhdmVzOgotRk9STV9PUFRJT05fQU5EQUxMS0VZUz1BbmQKLUZPUk1fT1BUSU9OX09SQUxMS0VZUz1PcgotRk9STV9PUFRJT05fT1JMSUtFS0VZUz1PciBMaWtlCi1GT1JNX0xBQkVMX1NPUlRfQllfTkFNRT1PcmRlbmFyIHBvciBub21icmU6Ci1GT1JNX1JBRElPX1NPUlRfQVNDPUFzY2VuZGVudGUKLUZPUk1fUkFESU9fU09SVF9ERVNDPURlc2NlbmRlbnRlCi1GT1JNX0xBQkVMX1NPUlRfQllfREFURT1PcmRlbmFyIHBvciBmZWNoYToKLUZPUk1fTEFCRUxfTUFYX1NFQVJDSF9TRVQ9VGFtYVx1MDBmMW8gbVx1MDBlMXhpbW8gZGVsIGNvbmp1bnRvIGRlIGJcdTAwZmFzcXVlZGE6Ci1GT1JNX0xBQkVMX01BWF9SRVNVTFRTPU5cdTAwZmFtZXJvIG1cdTAwZTF4aW1vIGRlIHJlc3VsdGFkb3M6Ci1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRVNfU0lNUExFX0RFU0M9RW50cmUgZWwgbm9tYnJlIHBhcmNpYWwgbyBjb21wbGV0byBkZSB1biBzZXJ2aWNpbyBxdWUgZGVzZWUgYnVzY2FyLiBTZSBwdWVkZSB1dGlsaXphciBlbCBzXHUwMGVkbWJvbG8gJyUnIGEgbW9kbyBkZSBjb21vZFx1MDBlZG4gcGFyYSBxdWUgaGFnYSBsYXMgdmVjZXMgZGUgY3VhbHF1aWVyIGNhclx1MDBlMWN0ZXIuIFB1bHNlIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSBlamVjdXRhciBsYSBiXHUwMGZhc3F1ZWRhLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfVVVJRF9ERVNDPUVudHJlIGVsIFVVSUQgZGVsIHNlcnZpY2lvIHF1ZSBkZXNlYSBidXNjYXIuIFB1bHNlIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSBlamVjdXRhciBsYSBiXHUwMGZhc3F1ZWRhLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFU19TSU1QTEVfREVTQz1FbnRyZSBlbCBub21icmUgcGFyY2lhbCBvIGNvbXBsZXRvIGRlIHVuYSBpbnRlcmZheiBkZSBzZXJ2aWNpbyBxdWUgZGVzZWUgYnVzY2FyLiBTZSBwdWVkZSB1dGlsaXphciBlbCBzXHUwMGVkbWJvbG8gJyUnIGEgbW9kbyBkZSBjb21vZFx1MDBlZG4gcGFyYSBxdWUgaGFnYSBsYXMgdmVjZXMgZGUgY3VhbHF1aWVyIGNhclx1MDBlMWN0ZXIuIFB1bHNlIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSBlamVjdXRhciBsYSBiXHUwMGZhc3F1ZWRhLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFX1VVSURfREVTQz1FbnRyZSBlbCBVVUlEIGRlIGxhIGludGVyZmF6IHNlcnZpY2lvIHF1ZSBkZXNlYSBidXNjYXIuIFB1bHNlIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSBlamVjdXRhciBsYSBiXHUwMGZhc3F1ZWRhLgotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVM9SW50ZXJmYWNlcyBkZSBzZXJ2aWNpbwotRk9STV9MQUJFTF9VVUlEX0tFWT1DbGF2ZSBkZSBVVUlEOgotRk9STV9MQUJFTF9VU0VfU0VSVklDRT1VdGlsaXphciBzZXJ2aWNpbwotRk9STV9MQUJFTF9TRVJWSUNFPVNlcnZpY2lvCi1GT1JNX0xBQkVMX0JVU0lORVNTPUVtcHJlc2EKLUZPUk1fTEFCRUxfUFVCTElTSF9BU1NFUlRJT05TPUFzZXJjaW9uZXMgZGUgcHVibGljYWRvcgotRk9STV9MQUJFTF9ESVJFQ1RJT049RGlyZWNjaVx1MDBmM24KLUZPUk1fTEFCRUxfRlJPTV9LRVk9RGVzZGUgY2xhdmUKLUZPUk1fTEFCRUxfVE9fS0VZPUEgY2xhdmUKLUZPUk1fTEFCRUxfU1RBVFVTPUVzdGFkbwotRk9STV9MQUJFTF9BU1NFUlRJT05fVFlQRT1UaXBvIGRlIGFzZXJjaVx1MDBmM24KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX1BBUkVOVF9DSElMRD1QYWRyZS1IaWpvCi1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QRUVSX1RPX1BFRVI9U2ltaWxhci1TaW1pbGFyCi1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9JREVOVElUWT1JZGVudGlkYWQKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX0RJUkVUSU9OX0RFU0M9TGEgZGlyZWNjaVx1MDBmM24gPHN0cm9uZz5EZXNkZTwvc3Ryb25nPiBjcmVhclx1MDBlMSB1bmEgYXNlcmNpXHUwMGYzbiBkZSBwdWJsaWNhZG9yIGRlc2RlIGVzdGEgZW1wcmVzYSBhIGxhcyBlbXByZXNhcyBhbnRlcmlvcmVzLiAgTGEgZGlyZWNjaVx1MDBmM24gPHN0cm9uZz5BPC9zdHJvbmc+IGNyZWFyXHUwMGUxIHVuYSBhc2VyY2lcdTAwZjNuIGRlc2RlIGxhcyBlbXByZXNhcyBhbnRlcmlvcmVzIGEgZXN0YSBlbXByZXNhLgotRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9GUk9NPS0tLT4KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9ESVJFQ1RJT05fVE89PC0tLQotRk9STV9MQUJFTF9USElTX0JVU0lORVNTPUVzdGEKLU1TR19FUlJPUl9JTlZBTElEX1FVRVJZX05BTUU9SVdBQjAxNDBFIEVudHJlIHVuIG5vbWJyZSB2XHUwMGUxbGlkbyBwYXJhIGxhIGNvbnN1bHRhLgotTVNHX0VSUk9SX0lOVkFMSURfTkFNRVM9SVdBQjAxNDFFIEVudHJlIHVuYSBzZXJpZSBkZSBub21icmVzIHZcdTAwZTFsaWRvcy4KLU1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMPUlXQUIwMTQyRSBFbnRyZSB1biBVUkwgZGUgcHVibGljYWNpXHUwMGYzbiB2XHUwMGUxbGlkby4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJJRD1JV0FCMDE0M0UgRW50cmUgdW4gSUQgZGUgdXN1YXJpbyB2XHUwMGUxbGlkby4KLU1TR19FUlJPUl9JTlZBTElEX01BWF9TRUFSQ0hfU0VUPUlXQUIwMTQ1RSBFbnRyZSB1biB0YW1hXHUwMGYxbyB2XHUwMGUxbGlkbyBwYXJhIGVsIGNvbmp1bnRvIGRlIGJcdTAwZmFzcXVlZGEgbVx1MDBlMXhpbW8uCi1NU0dfRVJST1JfSU5WQUxJRF9NQVhfUkVTVUxUUz1JV0FCMDE0NkUgRW50cmUgdW4gdGFtYVx1MDBmMW8gdlx1MDBlMWxpZG8gcGFyYSBlbCBuXHUwMGZhbWVybyBtXHUwMGUxeGltbyBkZSByZXN1bHRhZG9zLgotTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0N0kgTlx1MDBmYW1lcm8gZGUgZW1wcmVzYXMgZW5jb250cmFkYXM6ICUxCi1NU0dfRVJST1JfTk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0OEUgTm8gc2UgaGEgZW5jb250cmFkbyBuaW5ndW5hIGVtcHJlc2EuCi1NU0dfSU5GT19TRVJWSUNFU19GT1VORD1JV0FCMDE0OUkgTlx1MDBmYW1lcm8gZGUgc2VydmljaW9zIGVuY29udHJhZG9zOiAlMQotTVNHX0VSUk9SX05PX1NFUlZJQ0VTX0ZPVU5EPUlXQUIwMTUwRSBObyBzZSBoYSBlbmNvbnRyYWRvIG5pbmdcdTAwZmFuIHNlcnZpY2lvLgotTVNHX0VSUk9SX1NJTkdMRV9JVEVNPUlXQUIwMTUxRSBTZWxlY2Npb25lIHRhbiBzb2xvIHVuIGVsZW1lbnRvLgotTVNHX1FVRVNUSU9OX0lURU1fUkVQTEFDRU1FTlQ9TGEgc2VsZWNjaVx1MDBmM24gc3VzdGl0dWlyXHUwMGUxIGEgdW4gZWxlbWVudG8gcXVlIHlhIGVzdFx1MDBlMSBlbiBlbCBkZXN0aW5vLiBcdTAwYmZEZXNlYSBjb250aW51YXI/Ci1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQ9SVdBQjAxNTJJIE5cdTAwZmFtZXJvIGRlIGludGVyZmFjZXMgZGUgc2VydmljaW8gZW5jb250cmFkYXM6ICUxCi1NU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUzRSBObyBzZSBoYSBlbmNvbnRyYWRvIG5pbmd1bmEgaW50ZXJmYXogZGUgc2VydmljaW8uCi1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDE1NEUgU2VsZWNjaW9uZSBjb21vIG1cdTAwZWRuaW1vIHVuIGVsZW1lbnRvLgotTVNHX0VSUk9SX0lOVkFMSURfVVVJRF9LRVk9SVdBQjAxNTVFIEVudHJlIHVuYSBjbGF2ZSBVVUlEIHZcdTAwZTFsaWRhLgotTVNHX0VSUk9SX1FVRVJZX05BTUVfQ09ORkxJQ1Q9SVdBQjAxNTZFIEVsIG5vbWJyZSBkZSBjb25zdWx0YSBkZSBsYSBzdWJjb25zdWx0YSBubyBwdWVkZSBzZXIgaWd1YWwgcXVlIGVsIG9yaWdpbmFkb3IuCi1NU0dfRVJST1JfTk9fSVRFTVNfVE9fR0VUPUlXQUIwMTU3RSBUb2Rhdlx1MDBlZGEgbm8gc2UgaGEgcHVibGljYWRvIG5pIGRlc2N1YmllcnRvIG5pbmdcdTAwZmFuIGVsZW1lbnRvIGRlbCB0aXBvIGVzcGVjaWZpY2Fkby4KLQotIyBSZXN1bHRzCi1BTFRfUVVFUllfUkVTVUxUUz1SZXN1bHRhZG9zIGRlIGxhIGNvbnN1bHRhCi1GT1JNX0xBQkVMX1NVQlFVRVJZPUxvcyByZXN1bHRhZG9zIHB1ZWRlbiB1dGlsaXphcnNlIGNvbW8gZW50cmFkYXMgZGUgb3RyYSBvcGVyYWNpXHUwMGYzbi4gUGFyYSB2ZXIgbGEgb3BlcmFjaVx1MDBmM24gcHVsc2UgZWwgZW5sYWNlIDxzdHJvbmc+ZGVzdGlubzwvc3Ryb25nPiBzaXR1YWRvIGVuIGxhIHBhcnRlIHN1cGVyaW9yLiBMb3MgcmVzdWx0YWRvcyBzZWxlY2Npb25hZG9zIHB1ZWRlbiB1dGlsaXphcnNlIGVuIGxhIG9wZXJhY2lcdTAwZjNuIHB1bHNhbmRvIGVsIGJvdFx1MDBmM24gPHN0cm9uZz5UcmFuc2ZlcmlyPC9zdHJvbmc+LgotRk9STV9MQUJFTF9RVUVSWT1TZWxlY2Npb25lIHVuIHJlc3VsdGFkbyBwYXJhIHZlciBtXHUwMGUxcyBkZXRhbGxlcyBvIHNlbGVjY2lvbmUgdW4gY29uanVudG8gZGUgcmVzdWx0YWRvcyB5IHB1bHNlIHVuIGJvdFx1MDBmM24gcGFyYSByZWFsaXphciB1bmEgb3BlcmFjaVx1MDBmM24uCi1GT1JNX0xJTktfVEFSR0VUPWRlc3Rpbm8KLUZPUk1fQlVUVE9OX1RSQU5TRkVSPVRyYW5zZmVyaXIKLUZPUk1fQlVUVE9OX1JFRlJFU0g9UmVub3ZhcgotRk9STV9CVVRUT05fQUREX1RPX0ZBVk9SSVRFUz1BXHUwMGYxYWRpciBhIGZhdm9yaXRvcwotRk9STV9CVVRUT05fVU5QVUJMSVNIPURlc3B1YmxpY2FyCi1GT1JNX0JVVFRPTl9DTEVBUj1Cb3JyYXIKLQotIyBQdWJsaXNoIGFjdGlvbnMKLUFMVF9QVUJMSVNIPVB1YmxpY2FyCi1GT1JNX0xBQkVMX1BVQkxJU0g9UHVibGljYXI6Ci1GT1JNX09QVElPTl9CVVNJTkVTUz1FbXByZXNhCi1GT1JNX09QVElPTl9TRVJWSUNFPVNlcnZpY2lvCi1GT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRT1JbnRlcmZheiBkZSBzZXJ2aWNpbwotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX1NJTVBMRV9ERVNDPUVzcGVjaWZpcXVlIHVuIG5vbWJyZSB5LCBvcGNpb25hbG1lbnRlLCB1bmEgZGVzY3JpcGNpXHUwMGYzbiBwYXJhIGxhIGVtcHJlc2EgcXVlIGRlYmUgcHVibGljYXJzZS4gUHVlZGUgc2VyIG5lY2VzYXJpYSBsYSBhdXRlbnRpY2FjaVx1MDBmM24uCi1GT1JNX0xBQkVMX1BVQkxJU0hfQlVTSU5FU1NfQURWQU5DRURfREVTQz1Qcm9wb3JjaW9uZSB1biBub21icmUgcGFyYSBsYSBlbXByZXNhIHF1ZSBkZWJlIHB1YmxpY2Fyc2UuIFRhbWJpXHUwMGU5biBwdWVkZW4gZXNwZWNpZmljYXJzZSBvdHJvcyBwYXJcdTAwZTFtZXRyb3MuIFB1ZWRlIHNlciBuZWNlc2FyaWEgbGEgYXV0ZW50aWNhY2lcdTAwZjNuLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0M9T2J0ZW5nYSBvIGxvY2FsaWNlIHVuYSBlbXByZXNhIHkgZGVzcHVcdTAwZTlzIHByb3BvcmNpb25lIGVsIFVSTCBXU0RMLCBlbCBub21icmUgeSwgb3BjaW9uYWxtZW50ZSwgdW5hIGRlc2NyaXBjaVx1MDBmM24gcGFyYSBlbCBzZXJ2aWNpbyBxdWUgZGViZSBwdWJsaWNhcnNlLiBQdWVkZSBzZXIgbmVjZXNhcmlhIGxhIGF1dGVudGljYWNpXHUwMGYzbi4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0M9T2J0ZW5nYSBvIGxvY2FsaWNlIHVuYSBlbXByZXNhIHkgZGVzcHVcdTAwZTlzIHByb3BvcmNpb25lIGVsIFVSTCBXU0RMIHkgdW4gbm9tYnJlIHBhcmEgZWwgc2VydmljaW8gcXVlIGRlYmUgcHVibGljYXJzZS4gVGFtYmlcdTAwZTluIHB1ZWRlbiBlc3BlY2lmaWNhcnNlIG90cm9zIHBhclx1MDBlMW1ldHJvcy4gUHVlZGUgc2VyIG5lY2VzYXJpYSBsYSBhdXRlbnRpY2FjaVx1MDBmM24uCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQz1Qcm9wb3JjaW9uZSBlbCBVUkwgV1NETCwgZWwgbm9tYnJlIHksIG9wY2lvbmFsbWVudGUsIHVuYSBkZXNjcmlwY2lcdTAwZjNuIHBhcmEgZWwgc2VydmljaW8gcXVlIGRlYmUgcHVibGljYXJzZS4gUHVlZGUgc2VyIG5lY2VzYXJpYSBsYSBhdXRlbnRpY2FjaVx1MDBmM24uCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9BRFZBTkNFRF9ERVNDPVByb3BvcmNpb25lIGVsIFVSTCBXU0RMIHkgdW4gbm9tYnJlIHBhcmEgZWwgc2VydmljaW8gcXVlIGRlYmUgcHVibGljYXJzZS4gVGFtYmlcdTAwZTluIHB1ZWRlbiBlc3BlY2lmaWNhcnNlIG90cm9zIHBhclx1MDBlMW1ldHJvcy4gUHVlZGUgc2VyIG5lY2VzYXJpYSBsYSBhdXRlbnRpY2FjaVx1MDBmM24uCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0VfU0lNUExFX0RFU0M9RW50cmUgdW4gVVJMIFdTREwsIGVsIG5vbWJyZSB5LCBvcGNpb25hbG1lbnRlLCB1bmEgZGVzY3JpcGNpXHUwMGYzbiBwYXJhIGxhIGludGVyZmF6IGRlIHNlcnZpY2lvIHF1ZSBkZWJlIHB1YmxpY2Fyc2UuIFB1ZWRlIHNlciBuZWNlc2FyaWEgbGEgYXV0ZW50aWNhY2lcdTAwZjNuLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFX0FEVkFOQ0VEX0RFU0M9UHJvcG9yY2lvbmUgZWwgVVJMIFdTREwgeSBlbCBub21icmUgcGFyYSBsYSBpbnRlcmZheiBkZSBzZXJ2aWNpbyBxdWUgZGViZSBwdWJsaWNhcnNlLiBUYW1iaVx1MDBlOW4gcHVlZGVuIGVzcGVjaWZpY2Fyc2Ugb3Ryb3MgcGFyXHUwMGUxbWV0cm9zLiBQdWVkZSBzZXIgbmVjZXNhcmlhIGxhIGF1dGVudGljYWNpXHUwMGYzbi4KLUZPUk1fTEFCRUxfUFVCTElTSF9GT1JNPUZvcm1hdG8gZGUgcHVibGljYWNpXHUwMGYzbgotRk9STV9MQUJFTF9ERVNDUklQVElPTj1EZXNjcmlwY2lcdTAwZjNuCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OUz1EZXNjcmlwY2lvbmVzCi1NU0dfSU5GT19CVVNJTkVTU19QVUJMSVNIRUQ9SVdBQjAxNThJIExhIGVtcHJlc2EgJTEgc2UgaGEgcHVibGljYWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4KLU1TR19JTkZPX1NFUlZJQ0VfUFVCTElTSEVEPUlXQUIwMTU5SSBFbCBzZXJ2aWNpbyAlMSBzZSBoYSBwdWJsaWNhZG8gc2F0aXNmYWN0b3JpYW1lbnRlLgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfUFVCTElTSEVEPUlXQUIwMTYwSSBMYSBpbnRlcmZheiBkZSBzZXJ2aWNpbyAlMSBzZSBoYSBwdWJsaWNhZG8gc2F0aXNmYWN0b3JpYW1lbnRlLgotTVNHX0VSUk9SX0lOVkFMSURfTkFNRT1JV0FCMDE2MUUgRW50cmUgdW4gbm9tYnJlIHZcdTAwZTFsaWRvLgotTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRT1JV0FCMDI1MEUgU2VsZWNjaW9uZSB1biBpZGlvbWEgcXVlIG5vIGVzdFx1MDBlOSBlbiBibGFuY28gcGFyYSAlMSBkZSBsYSBmaWxhICUyLiBTb2xvIGxhIHByaW1lcmEgZmlsYSBwdWVkZSB0ZW5lciB1biBpZGlvbWEgZW4gYmxhbmNvLgotTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0U9SVdBQjAyNTFFIENhbWJpZSBlbCBpZGlvbWEgcGFyYSAlMSBlbiBsYSBmaWxhICUyLiBFbCBhY3R1YWwgeWEgc2UgZXN0XHUwMGUxIHV0aWxpemFuZG8uCi1NU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVD1JV0FCMDI1MkUgRW50cmUgdW4gJTEgZW4gbGEgZmlsYSAlMgotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkw9SVdBQjAyNTNFIEVudHJlIHVuIFVSTCBXU0RMIHZcdTAwZTFsaWRvLgotTVNHX0VSUk9SX05PX05BTUVTPUlXQUIwMjU0RSBBXHUwMGYxYWRhIGNvbW8gbVx1MDBlZG5pbW8gdW4gbm9tYnJlLgotTVNHX0VSUk9SX0lOVkFMSURfU0VSVklDRT1JV0FCMDI1NUUgUHJvcG9yY2lvbmUgdW4gc2VydmljaW8gdlx1MDBlMWxpZG8uCi1NU0dfRVJST1JfSU5WQUxJRF9CVVNJTkVTUz1JV0FCMDI1NkUgUHJvcG9yY2lvbmUgdW5hIGVtcHJlc2Egdlx1MDBlMWxpZGEuCi0KLSMgQnVzaW5lc3MgUHVibGlzaCBTZXJ2aWNlIGFjdGlvbgotQUxUX1BVQkxJU0hfU0VSVklDRT1QdWJsaWNhciBzZXJ2aWNpbwotCi0jIFdTREwgQnJvd3NlcgotVElUTEVfV1NETF9CUk9XU0VSPU5hdmVnYWRvciBXU0RMIC0gJTEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0U9U2VsZWNjaW9uZSB1biBvcmlnZW4gV1NETDoKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9UHJveWVjdG9zIFdlYgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9RmF2b3JpdG9zCi1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVByb3llY3RvIFdlYgotRk9STV9MQUJFTF9XU0RMX1VSTD1VUkwgV1NETAotQUxUX1dTRExfQlJPV1NFUj1OYXZlZ2Fkb3IgV1NETAotCi0jIERldGFpbHMKLUZPUk1fTElOS19FRElUPUVkaXRhcgotRk9STV9MSU5LX0NBTkNFTD1DYW5jZWxhcgotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9Q2xhdmUgZGUgZW1wcmVzYQotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1DbGF2ZSBkZSBzZXJ2aWNpbwotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVk9Q2xhdmUgZGUgVE1vZGVsCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPUNhdGVnb3JcdTAwZWRhcyBkZWZpbmlkYXMgcG9yIHVzdWFyaW8KLUZPUk1fTEFCRUxfQ0hFQ0tFRD1NYXJjYWRvCi1GT1JNX0xBQkVMX0ZJTEU9QXJjaGl2bwotTVNHX1FVRVNUSU9OX1BVQkxJU0hfSVRFTT1ObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGVsIGVsZW1lbnRvIGVuIGVsIHJlZ2lzdHJvLiBcdTAwYmZEZXNlYSBwdWJsaWNhcmxvPwotTVNHX1FVRVNUSU9OX1NFUlZJQ0VfUFVCTElTSF9CVVNJTkVTUz1ObyBzZSBoYW4gcG9kaWRvIGVuY29udHJhciBlbCBzZXJ2aWNpbyB5IHN1IGVtcHJlc2EgZW4gZWwgcmVnaXN0cm8uIFx1MDBiZkRlc2VhIHB1YmxpY2FybG9zPwotTVNHX0lORk9fQlVTSU5FU1NfVVBEQVRFRD1JV0FCMDI1N0kgTGEgZW1wcmVzYSAlMSBzZSBoYSBhY3R1YWxpemFkbyBzYXRpc2ZhY3RvcmlhbWVudGUuCi1NU0dfSU5GT19TRVJWSUNFX1VQREFURUQ9SVdBQjAyNThJIEVsIHNlcnZpY2lvICUxIHNlIGhhIGFjdHVhbGl6YWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VQREFURUQ9SVdBQjAyNTlJIExhIGludGVyZmF6IGRlIHNlcnZpY2lvICUxIHNlIGhhIGFjdHVhbGl6YWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4KLU1TR19JTkZPX1JFR0lTVFJZX1VQREFURUQ9SVdBQjAzMjNJIEVsIHJlZ2lzdHJvICUxIHNlIGhhIGFjdHVhbGl6YWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4KLQotIyBVbnB1Ymxpc2hBY3Rpb24KLUFMVF9VTlBVQkxJU0hfQlVTSU5FU1M9RGVzcHVibGljYXIgZW1wcmVzYQotQUxUX1VOUFVCTElTSF9TRVJWSUNFPURlc3B1YmxpY2FyIHNlcnZpY2lvCi1BTFRfVU5QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFPURlc3B1YmxpY2FyIGludGVyZmF6IGRlIHNlcnZpY2lvCi1GT1JNX0xBQkVMX1VOUFVCTElTSF9ERVNDPVB1bHNlIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSBkZXNwdWJsaWNhciBlc3RlIG9iamV0by4gUHVlZGUgc2VyIG5lY2VzYXJpYSBsYSBhdXRlbnRpY2FjaVx1MDBmM24uCi1NU0dfSU5GT19CVVNJTkVTU19VTlBVQkxJU0hFRD1JV0FCMDI2MEkgTGEgZW1wcmVzYSAlMSBzZSBoYSBkZXNwdWJsaWNhZG8gc2F0aXNmYWN0b3JpYW1lbnRlLgotTVNHX0lORk9fU0VSVklDRV9VTlBVQkxJU0hFRD1JV0FCMDI2MUkgRWwgc2VydmljaW8gJTEgc2UgaGEgZGVzcHVibGljYWRvIHNhdGlzZmFjdG9yaWFtZW50ZS4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VOUFVCTElTSEVEPUlXQUIwMjYySSBMYSBpbnRlcmZheiBkZSBzZXJ2aWNpbyAlMSBzZSBoYSBkZXNwdWJsaWNhZG8gc2F0aXNmYWN0b3JpYW1lbnRlLgotCi0jIEFkZCB0byBXU0RMIFBlcnNwZWN0aXZlCi1BTFRfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkU9QVx1MDBmMWFkaXIgYSBwXHUwMGUxZ2luYSBXU0RMCi1NU0dfSU5GT19XU0RMX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzZJICUxIHNlIGhhIGFcdTAwZjFhZGlkbyBzYXRpc2ZhY3RvcmlhbWVudGUgYSBsYSBwXHUwMGUxZ2luYSBXU0RMLgotTVNHX0VSUk9SX1dTRExfTk9UX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzdFICUxIG5vIHNlIGhhIHBvZGlkbyBhXHUwMGYxYWRpciBhIGxhIHBcdTAwZTFnaW5hIFdTREwuCi0KLSMgQWRkIHRvIEZhdm9yaXRlcwotQUxUX0FERF9UT19GQVZPUklURVM9QVx1MDBmMWFkaXIgYSBmYXZvcml0b3MKLU1TR19JTkZPX0ZBVk9SSVRFX0FEREVEPUlXQUIwMjYzSSAlMSBzZSBoYSBhXHUwMGYxYWRpZG8gc2F0aXNmYWN0b3JpYW1lbnRlIGEgbG9zIGZhdm9yaXRvcy4KLU1TR19FUlJPUl9GQVZPUklURV9OT1RfQURERUQ9SVdBQjAyNjRFICUxIG5vIHNlIGhhIHBvZGlkbyBhXHUwMGYxYWRpciBhIGxvcyBmYXZvcml0b3MuCi1NU0dfRVJST1JfRkFWT1JJVEVfQUxSRUFEWV9FWElTVFM9SVdBQjAzMjRFICUxIHlhIGV4aXN0ZSBlbiBsb3MgZmF2b3JpdG9zLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9RWwgZmF2b3JpdG8geWEgZXhpc3RlLiAgXHUwMGJmRGVzZWEgc29icmVzY3JpYmlybG8/Ci0KLSMgUmVmcmVzaAotTVNHX0lORk9fTk9ERV9SRUZSRVNIRUQ9SVdBQjAyNjVJICUxIHNlIGhhIHJlbm92YWRvLgotTVNHX1FVRVNUSU9OX1JFTU9WRV9OT0RFPSUxIG5vIHNlIGhhIHBvZGlkbyBlbmNvbnRyYXIgZW4gZWwgcmVnaXN0cm8uIFx1MDBiZkRlc2VhIGJvcnJhcmxvPwotCi0jIE1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlcwotQUxUX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTPUdlc3Rpb25hciBzZXJ2aWNpb3MgcmVmZXJpZG9zCi1GT1JNX0xBQkVMX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX0RFU0M9QVx1MDBmMWFkYSBzZXJ2aWNpb3MgZGVzY3ViaWVydG9zIG8gcHVibGljYWRvcyBhIGxhIGxpc3RhIGRlIHNlcnZpY2lvcyBhIGxvcyBxdWUgc2UgaGFjZSByZWZlcmVuY2lhIHB1bHNhbmRvIGVsIGJvdFx1MDBmM24gPHN0cm9uZz5BXHUwMGYxYWRpciBzZXJ2aWNpb3M8L3N0cm9uZz4uIEVsaW1pbmUgbGFzIHJlZmVyZW5jaWFzIHNlbGVjY2lvbmFkYXMgcHVsc2FuZG8gZWwgYm90XHUwMGYzbiA8c3Ryb25nPkVsaW1pbmFyIHJlZmVyZW5jaWFzPC9zdHJvbmc+LiBQdWVkZSBzZXIgbmVjZXNhcmlhIGxhIGF1dGVudGljYWNpXHUwMGYzbiBwYXJhIGxvcyBjYW1iaW9zLgotRk9STV9MQUJFTF9SRUZFUkVOQ0VEX1NFUlZJQ0VTPVNlcnZpY2lvcyBhIGxvcyBxdWUgc2UgaGFjZSByZWZlcmVuY2lhCi1GT1JNX0JVVFRPTl9BRERfU0VSVklDRVM9QVx1MDBmMWFkaXIgc2VydmljaW9zCi1GT1JNX0JVVFRPTl9SRU1PVkVfUkVGRVJFTkNFUz1FbGltaW5hciByZWZlcmVuY2lhcwotTVNHX0VSUk9SX05PX1JFRkVSRU5DRV9TRUxFQ1RFRD1JV0FCMDI2NkUgQW50ZXMgZGUgY29udGludWFyLCBzZWxlY2Npb25lIGNvbW8gbVx1MDBlZG5pbW8gdW4gc2VydmljaW8gYWwgcXVlIHNlIGhhZ2EgcmVmZXJlbmNpYS4KLU1TR19FUlJPUl9OT19TRVJWSUNFUz1JV0FCMDI2N0UgQW50ZXMgZGUgY29udGludWFyLCBvYnRlbmdhIG8gbG9jYWxpY2UgY29tbyBtXHUwMGVkbmltbyB1biBzZXJ2aWNpbwotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX1JFRkVSRU5DRUQ9SVdBQjAyNjhFIE5vIHNlIGhhIHBvZGlkbyBoYWNlciByZWZlcmVuY2lhIGFsIHNlcnZpY2lvICUxLgotTVNHX0VSUk9SX1JFRkVSRU5DRV9OT1RfUkVNT1ZFRD1JV0FCMDI2OUUgTm8gc2UgaGEgcG9kaWRvIGVsaW1pbmFyIGxhIHJlZmVyZW5jaWEgYWwgc2VydmljaW8gJTEuCi1NU0dfSU5GT19TRVJWSUNFX1JFRkVSRU5DRUQ9SVdBQjAyNzBJIFNlIGhhIHJlYWxpemFkbyBzYXRpc2ZhY3RvcmlhbWVudGUgdW5hIHJlZmVyZW5jaWEgYWwgc2VydmljaW8gJTEuCi1NU0dfSU5GT19TRVJWSUNFX1JFRkVSRU5DRV9SRU1PVkVEPUlXQUIwMjcxSSBMYSByZWZlcmVuY2lhIGFsIHNlcnZpY2lvICUxIHNlIGhhIGVsaW1pbmFkbyBzYXRpc2ZhY3RvcmlhbWVudGUuCi0KLSMgTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9ucwotQUxUX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1HZXN0aW9uYXIgYXNlcmNpb25lcyBkZSBwdWJsaWNhZG9yCi1GT1JNX0xBQkVMX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OU19ERVNDPUFcdTAwZjFhZGEgZW1wcmVzYXMgZGVzY3ViaWVydGFzIG8gcHVibGljYWRhcyBhIGxhIGxpc3RhIGRlIGFzZXJjaW9uZXMgZGUgcHVibGljYWRvciBwdWxzYW5kbyA8c3Ryb25nPkFcdTAwZjFhZGlyIGFzZXJjaW9uZXM8L3N0cm9uZz4uIEVsaW1pbmUgbGFzIGFzZXJjaW9uZXMgc2VsZWNjaW9uYWRhcyBwdWxzYW5kbyA8c3Ryb25nPkVsaW1pbmFyIGFzZXJjaW9uZXM8L3N0cm9uZz4uIENvbXBsZXRlIGxhcyBhc2VyY2lvbmVzIHNlbGVjY2lvbmFkYXMgcHVsc2FuZG8gPHN0cm9uZz5Db21wbGV0YXIgYXNlcmNpb25lczwvc3Ryb25nPi4gUHVsc2UgPHN0cm9uZz5SZW5vdmFyIGFzZXJjaW9uZXM8L3N0cm9uZz4gcGFyYSByZW5vdmFyIGxhIGxpc3RhIGRlIGFzZXJjaW9uZXMuCi1GT1JNX0xBQkVMX0lOQ09NUExFVEVfQVNTRVJUSU9OU19WSVNJQklMSVRZX0RFU0M9VGVuZ2EgZW4gY3VlbnRhIHF1ZSBsYXMgYXNlcmNpb25lcyBkZSBwdWJsaWNhZG9yIGluY29tcGxldGFzIHNvbG8gc29uIHZpc2libGVzIHBhcmEgZWwgcHJvcGlldGFyaW8gZGUgbGEgZW1wcmVzYS4KLUZPUk1fTEFCRUxfQlVTSU5FU1NFUz1FbXByZXNhcwotRk9STV9CVVRUT05fU0hPV19BTExfUFVCTElTSEVSX0FTU0VSVElPTlM9UmVub3ZhciBhc2VyY2lvbmVzCi1GT1JNX0JVVFRPTl9DT01QTEVURV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1Db21wbGV0YXIgYXNlcmNpb25lcwotRk9STV9CVVRUT05fQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TPUFcdTAwZjFhZGlyIGFzZXJjaW9uZXMKLUZPUk1fQlVUVE9OX1JFTU9WRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1FbGltaW5hciBhc2VyY2lvbmVzCi1NU0dfSU5GT19QVUJMSVNIRVJfQVNTRVJUSU9OU19SRUZSRVNIRUQ9SVdBQjAzMjVJIExhcyBhc2VyY2lvbmVzIGRlbCBwdWJsaWNhZG9yIHNlIGhhbiByZW5vdmFkby4KLU1TR19FUlJPUl9OT19JTkNPTVBMRVRFX0FTU0VSVElPTl9TRUxFQ1RFRD1JV0FCMDMyNkUgU2VsZWNjaW9uZSBjb21vIG1cdTAwZWRuaW1vIHVuYSBhc2VyY2lcdTAwZjNuIGRlIHB1YmxpY2Fkb3IgaW5jb21wbGV0YS4KLU1TR19FUlJPUl9OT1RfT1dORURfQlVTSU5FU1M9SVdBQjAzMjdFIEVzdGEgb3BlcmFjaVx1MDBmM24gbm8gcHVlZGUgcmVhbGl6YXJzZSBlbiB1bmEgZW1wcmVzYSBwcm9waWVkYWQgZGUgdW4gdGVyY2Vyby4KLQotIyBHZXRCdXNpbmVzc2VzCi1BTFRfR0VUX0JVU0lORVNTPU9idGVuZXIgZW1wcmVzYQotQUxUX0dFVF9CVVNJTkVTU0VTPU9idGVuZXIgZW1wcmVzYXMKLU5PREVfTkFNRV9TRVJWSUNFX0JVU0lORVNTPUVtcHJlc2EgcGFyYSBzZXJ2aWNpbyAlMQotTk9ERV9OQU1FX1NJX0JVU0lORVNTRVM9RW1wcmVzYXMgcGFyYSBpbnRlcmZheiBkZSBzZXJ2aWNpbyAlMQotTVNHX1FVRVNUSU9OX1JFTU9WRV9TRVJWSUNFX05PREU9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbCBzZXJ2aWNpbyBlbiBlbCByZWdpc3Ryby4gXHUwMGJmRGVzZWEgZWxpbWluYXIgZXN0ZSBub2RvPwotCi0jIEdldFNlcnZpY2VJbnRlcmZhY2VzCi1BTFRfR0VUX1NFUlZJQ0VfSU5URVJGQUNFUz1PYnRlbmVyIGludGVyZmFjZXMgZGUgc2VydmljaW8KLU5PREVfTkFNRV9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUz1JbnRlcmZhY2VzIGRlIHNlcnZpY2lvIHBhcmEgZWwgc2VydmljaW8gJTEKLU1TR19RVUVTVElPTl9HRVRfU0lfUkVNT1ZFX1NFUlZJQ0VfTk9ERT1ObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGVsIHNlcnZpY2lvIGVuIGVsIHJlZ2lzdHJvLiBcdTAwYmZEZXNlYSBlbGltaW5hciBlc3RlIG5vZG8/Ci0KLSMgR2V0U2VydmljZXMKLUFMVF9HRVRfU0VSVklDRVM9T2J0ZW5lciBzZXJ2aWNpb3MKLU5PREVfTkFNRV9TSV9TRVJWSUNFUz1TZXJ2aWNpb3MgcGFyYSBpbnRlcmZheiBkZSBzZXJ2aWNpbyAlMQotTk9ERV9OQU1FX0JVU0lORVNTX1NFUlZJQ0VTPVNlcnZpY2lvcyBwYXJhIGxhIGVtcHJlc2EgJTEKLU1TR19RVUVTVElPTl9SRU1PVkVfU0lfTk9ERT1ObyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGxhIGludGVyZmF6IGRlIHNlcnZpY2lvIGVuIGVsIHJlZ2lzdHJvLiBcdTAwYmZEZXNlYSBlbGltaW5hciBlc3RlIG5vZG8/Ci1NU0dfUVVFU1RJT05fUkVNT1ZFX0JVU0lORVNTX05PREU9Tm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBsYSBlbXByZXNhIGVuIGVsIHJlZ2lzdHJvLiBcdTAwYmZEZXNlYSBlbGltaW5hciBlc3RlIG5vZG8/Ci0KLSMgUmVmcmVzaFVERElOb2Rlc0FjdGlvbgotTVNHX0VSUk9SX05PREVfREFUQV9WQUxJREFUSU9OX0ZBSUxFRD1JV0FCMDI3MkUgJTEgbm8gc2UgaGEgZW5jb250cmFkbyBlbiBlbCByZWdpc3Ryby4KLQotIyBTdW1tYXJpZXMKLUFMVF9TVU1NQVJZX1FVRVJJRVM9UmVzdW1lbiBkZSBjb25zdWx0YXMKLUFMVF9TVU1NQVJZX0JVU0lORVNTRVM9UmVzdW1lbiBkZSBlbXByZXNhcwotQUxUX1NVTU1BUllfU0VSVklDRVM9UmVzdW1lbiBkZSBzZXJ2aWNpb3MKLUFMVF9TVU1NQVJZX1NFUlZJQ0VfSU5URVJGQUNFUz1SZXN1bWVuIGRlIGludGVyZmFjZXMgZGUgc2VydmljaW8KLUZPUk1fTEFCRUxfUVVFUklFUz1Db25zdWx0YXMKLQotIyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24KLU1TR19RVUVTVElPTl9JVEVNX1ZBTElEQVRJT05fRkFJTEVEPSUxIG5vIHNlIGhhIHBvZGlkbyBlbmNvbnRyYXIgZW4gZWwgcmVnaXN0cm8uIFx1MDBiZkRlc2VhIGVsaW1pbmFybG8/Ci0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPUNvbnRlbmVkb3IgZGVsIG5hdmVnYWRvcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9QmFycmEgZGUgaGVycmFtaWVudGFzIGRlbCBuYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPUNvbnRlbmlkbyBkZWwgbmF2ZWdhZG9yCi1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1Db250ZW5lZG9yIGRlIGFjY2lvbmVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Db250ZW5lZG9yIGRlIHByb3BpZWRhZGVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9QmFycmEgZGUgaGVycmFtaWVudGFzIGRlIHByb3BpZWRhZGVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9Q29udGVuaWRvIGRlIHByb3BpZWRhZGVzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPUNvbnRlbmVkb3IgZGUgZXN0YWRvCi1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1CYXJyYSBkZSBoZXJyYW1pZW50YXMgZGUgZXN0YWRvCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZW5pZG8gZGUgZXN0YWRvCi1GUkFNRV9USVRMRV9VRERJX1BFUlNQRUNUSVZFX0NPTlRFTlQ9Q29udGVuaWRvIGRlIHBcdTAwZTFnaW5hIFVEREkKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfV09SS0FSRUE9XHUwMGMxcmVhIGRlIHRyYWJham8gZGUgY2F0ZWdvclx1MDBlZGFzCi1GUkFNRV9USVRMRV9DQVRFR09SSUVTX1RPT0xCQVI9QmFycmEgZGUgaGVycmFtaWVudGFzIGRlIGNhdGVnb3JcdTAwZWRhcwotRlJBTUVfVElUTEVfQ0FURUdPUklFU19DT05URU5UPUNvbnRlbmlkbyBkZSBjYXRlZ29yXHUwMGVkYXMKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1CYXJyYSBkZSBoZXJyYW1pZW50YXMgZGVsIG5hdmVnYWRvciBXU0RMCi1GUkFNRV9USVRMRV9XU0RMX0NPTlRFTlQ9Q29udGVuaWRvIGRlbCBuYXZlZ2Fkb3IgV1NETAotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX0JVU0lORVNTX0RFVEFJTFM9Rm9ybXVsYXJpbyBEZXRhbGxlcyBkZSBlbXByZXNhCi1GT1JNX1RJVExFX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRT1Gb3JtdWxhcmlvIFNlcnZpY2lvIGRlIHB1YmxpY2FjaVx1MDBmM24gZGUgZW1wcmVzYQotRk9STV9USVRMRV9HRVRfRk9STT1Gb3JtdWxhcmlvIFNlbGVjY2lvbmFyIGRlIGVudHJlIGxvcyBvYmpldG9zIGRlc2N1YmllcnRvcyB5IHB1YmxpY2Fkb3MKLUZPUk1fVElUTEVfSVRFTVNfU1VNTUFSWT1Gb3JtdWxhcmlvIFJlc3VtZW4gZGUgZWxlbWVudG9zCi1GT1JNX1RJVExFX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1Gb3JtdWxhcmlvIEdlc3Rpb25hciBhc2VyY2lvbmVzIGRlIHB1YmxpY2Fkb3IKLUZPUk1fVElUTEVfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVM9Rm9ybXVsYXJpbyBHZXN0aW9uYXIgc2VydmljaW9zIHJlZmVyaWRvcwotRk9STV9USVRMRV9PUEVOX1JFR0lTVFJZPUZvcm11bGFyaW8gQWJyaXIgcmVnaXN0cm8KLUZPUk1fVElUTEVfUkVHSVNUUllfREVUQUlMUz1Gb3JtdWxhcmlvIERldGFsbGVzIGRlIHJlZ2lzdHJvCi1GT1JNX1RJVExFX1JFR0lTVFJZX1BVQkxJU0g9Rm9ybXVsYXJpbyBQdWJsaWNhciByZWdpc3RybwotRk9STV9USVRMRV9SRUdJU1RSWV9GSU5EPUZvcm11bGFyaW8gQnVzY2FyIHJlZ2lzdHJvCi1GT1JNX1RJVExFX1JFU1VMVFM9Rm9ybXVsYXJpbyBSZXN1bHRhZG9zCi1GT1JNX1RJVExFX1NFUlZJQ0VfREVUQUlMUz1Gb3JtdWxhcmlvIERldGFsbGVzIGRlIHNlcnZpY2lvCi1GT1JNX1RJVExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9Rm9ybXVsYXJpbyBEZXRhbGxlcyBkZSBpbnRlcmZheiBkZSBzZXJ2aWNpbwotRk9STV9USVRMRV9VTlBVQkxJU0g9Rm9ybXVsYXJpbyBEZXNwdWJsaWNhcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaV9mci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaV9mci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWJiODM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGlfZnIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1VRERJCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9VRERJX01BSU49VURESSAtIFBhZ2UgcHJpbmNpcGFsZQotTk9ERV9OQU1FX1FVRVJJRVNfRk9MREVSPVJlcXVcdTAwZWF0ZXMgZXhcdTAwZTljdXRcdTAwZTllcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9CVVNJTkVTU0VTX0ZPTERFUj1NXHUwMGU5dGllcnMgcHVibGlcdTAwZTlzCi1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VTX0ZPTERFUj1TZXJ2aWNlcyBwdWJsaVx1MDBlOXMKLU5PREVfTkFNRV9QVUJMSVNIRURfU0VSVklDRV9JTlRFUkZBQ0VTX0ZPTERFUj1JbnRlcmZhY2VzIGRlIHNlcnZpY2UgcHVibGlcdTAwZTllcwotCi0jIE9wZW5SZWdpc3RyeUFjdGlvbgotQUxUX09QRU5fUkVHSVNUUlk9T3V2cmlyIHVuIHJlZ2lzdHJlCi1GT1JNX0xBQkVMX09QRU5fUkVHSVNUUllfREVTQz1JbmRpcXVleiBsZSBub20gZXQgbCdVUkwgZCdpbnRlcnJvZ2F0aW9uIGR1IHJlZ2lzdHJlIFx1MDBlMCBvdXZyaXIuIFNpIHZvdXMgc1x1MDBlOWxlY3Rpb25uZXogdW4gcmVnaXN0cmUgZmF2b3JpLCBsZXMgaW5mb3JtYXRpb25zIHJlcXVpc2VzIHNlcm9udCBpbmRpcXVcdTAwZTllcyBhdXRvbWF0aXF1ZW1lbnQuIFBvdXIgb3V2cmlyIGxlIHJlZ2lzdHJlLCBjbGlxdWV6IHN1ciA8c3Ryb25nPk9LPC9zdHJvbmc+LgotRk9STV9MQUJFTF9GQVZPUklURV9SRUdJU1RSWT1SZWdpc3RyZSBmYXZvcmkKLUZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRT1Ob20gZHUgcmVnaXN0cmUKLUZPUk1fTEFCRUxfSU5RVUlSWV9VUkw9VVJMIGQnaW50ZXJyb2dhdGlvbgotRk9STV9MQUJFTF9DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUz1SZWNoZXJjaGVyIGxlcyBjYXRcdTAwZTlnb3JpZXMgZFx1MDBlOWZpbmllcyBwYXIgbCd1dGlsaXNhdGV1cgotREVGQVVMVF9SRUdJU1RSWV9OQU1FPVJlZ2lzdHJlIFVEREkgZGUgdGVzdCBJQk0KLU1TR19FUlJPUl9JTlZBTElEX1JFR0lTVFJZX05BTUU9SVdBQjAxMzZFIEluZGlxdWV6IHVuIG5vbSBkZSByZWdpc3RyZSB2YWxpZGUuCi1NU0dfRVJST1JfSU5WQUxJRF9JTlFVSVJZX1VSTD1JV0FCMDEzOEUgSW5kaXF1ZXogdW4gVVJMIGQnaW50ZXJyb2dhdGlvbiB2YWxpZGUuCi1NU0dfSU5GT19SRUdJU1RSWV9PUEVORUQ9SVdBQjAxMzlJIExlIHJlZ2lzdHJlIG5vbW1cdTAwZTkgJTEgZmlndXJhbnQgZGFucyAlMiBhIFx1MDBlOXRcdTAwZTkgb3V2ZXJ0LgotRk9STV9MQUJFTF9JU19XRUJTUEhFUkVfVURESV9SRUdJU1RSWT1Fc3QgdW4gcmVnaXN0cmUgVURESSBXZWJTcGhlcmUKLURFRkFVTFRfUkVHSVNUUllfTkFNRV9XRUJTUEhFUkU9UmVnaXN0cmUgVURESSBwcml2XHUwMGU5IElCTSBXZWJTcGhlcmUKLUZPUk1fTEFCRUxfUkVHSVNUUllfSE9TVD1IXHUwMGY0dGUKLUZPUk1fTEFCRUxfUkVHSVNUUllfUE9SVD1Qb3J0Ci0KLSMgVXNlci1kZWZpbmVkIENhdGVnb3JpZXMKLUZPUk1fTEFCRUxfQUREX0NBVEVHT1JZX0RBVEE9PGEgaHJlZj0iJTEiPkNsaXF1ZXogaWNpPC9hPiBwb3VyIGNoYXJnZXIgbGVzIGRvbm5cdTAwZTllcyBkZSBjZXR0ZSBjYXRcdTAwZTlnb3JpZS4KLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9GSUxFPU5vbSBkdSBmaWNoaWVyIGRlIGRvbm5cdTAwZTllcyBkZSBjYXRcdTAwZTlnb3JpZXMKLU1TR19JTkZPX05PX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTX0ZPVU5EPUlXQUIwMzcxSSBBdWN1bmUgY2F0XHUwMGU5Z29yaWUgZFx1MDBlOWZpbmllIHBhciBsJ3V0aWxpc2F0ZXVyIG4nYSBcdTAwZTl0XHUwMGU5IGRcdTAwZTl0ZWN0XHUwMGU5ZS4KLU1TR19JTkZPX05PX0NBVEVHT1JZX0RBVEE9SVdBQjAzNzJJIExlcyBkb25uXHUwMGU5ZXMgZGUgY2F0XHUwMGU5Z29yaWUgcG91ciAlMSBuZSBzb250IHBhcyBkaXNwb25pYmxlcyBvdSBuZSBzb250IHBhcyB2YWxpZGVzLgotTVNHX0lORk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfTE9BREVEPUlXQUIwMzczSSBMZXMgZG9ublx1MDBlOWVzIHBvdXIgbGEgY2F0XHUwMGU5Z29yaWUgZFx1MDBlOWZpbmllIHBhciBsJ3V0aWxpc2F0ZXVyICUxIG9udCBcdTAwZTl0XHUwMGU5IGNoYXJnXHUwMGU5ZXMuCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0tFWT1JV0FCMDM3NEUgRmljaGllciBkZSBkb25uXHUwMGU5ZXMgbm9uIHZhbGlkZSBwb3VyIGxhIGNhdFx1MDBlOWdvcmllIGRcdTAwZTlmaW5pZSBwYXIgbCd1dGlsaXNhdGV1ciAlMS4gVW5lIGNsXHUwMGU5IGRlIGNhdFx1MDBlOWdvcmllICclMicgYSBcdTAwZTl0XHUwMGU5IHRyb3V2XHUwMGU5ZSBhbG9ycyBxdWUgJyUzJyBlc3QgYXR0ZW5kdWUuCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0ZPUk1BVD1JV0FCMDQ3M0UgRm9ybWF0IGluY29ubnUgXHUwMGUwIGxhIGxpZ25lICUxIGR1IGZpY2hpZXIgZGUgZG9ublx1MDBlOWVzIHBvdXIgbGEgY2F0XHUwMGU5Z29yaWUgZFx1MDBlOWZpbmllIHBhciBsJ3V0aWxpc2F0ZXVyICUyLiBMYSBsaWduZSBlc3QgOiAiJTMiCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFPUlXQUIwMzc1RSBGaWNoaWVyIGRlIGRvbm5cdTAwZTllcyBub24gdmFsaWRlIHBvdXIgbGEgY2F0XHUwMGU5Z29yaWUgZFx1MDBlOWZpbmllIHBhciBsJ3V0aWxpc2F0ZXVyICUxLgotTVNHX0VSUk9SX1NBVklOR19DQVRFR09SWV9EQVRBPUlXQUIwNDc0RSBVbmUgZXJyZXVyIHMnZXN0IHByb2R1aXRlIGxvcnMgZGUgbGEgc2F1dmVnYXJkZSBkZXMgZG9ublx1MDBlOWVzIHBvdXIgbGEgY2F0XHUwMGU5Z29yaWUgJTEuIFRleHRlIGRlIGwnZXhjZXB0aW9uIDogJTIKLQotIyBVRERJIENhdGVnb3J5IEJyb3dzZXIKLVRJVExFX0NBVEVHT1JZX0JST1dTRVI9TmF2aWdhdGV1ciBwYXIgY2F0XHUwMGU5Z29yaWVzCi1BTFRfQ0FURUdPUklFUz1DYXRcdTAwZTlnb3JpZXMKLQotIyBEZXRhaWxzCi1BTFRfUkVHSVNUUllfREVUQUlMUz1EXHUwMGU5dGFpbHMgZHUgcmVnaXN0cmUKLUFMVF9CVVNJTkVTU19ERVRBSUxTPURcdTAwZTl0YWlscyBkdSBtXHUwMGU5dGllcgotQUxUX1NFUlZJQ0VfREVUQUlMUz1EXHUwMGU5dGFpbHMgZHUgc2VydmljZQotQUxUX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9RFx1MDBlOXRhaWxzIGRlIGwnaW50ZXJmYWNlIGRlIHNlcnZpY2UKLUZPUk1fTEFCRUxfREVUQUlMU19FRElUQUJMRT1MZXMgZFx1MDBlOXRhaWxzIGRlIDxzdHJvbmc+JTE8L3N0cm9uZz4gc29udCBpbmRpcXVcdTAwZTlzIGNpLWRlc3NvdXMuIFZvdXMgcG91dmV6IGFqb3V0ZXIsIHN1cHByaW1lciBvdSBtb2RpZmllciBkZXMgXHUwMGU5bFx1MDBlOW1lbnRzLiBVbmUgYXV0aGVudGlmaWNhdGlvbiBwZXV0IFx1MDBlYXRyZSByZXF1aXNlIHBvdXIgbGVzIG1vZGlmaWNhdGlvbnMuIEQnYXV0cmVzIGFjdGlvbnMgc29udCByXHUwMGU5cGVydG9yaVx1MDBlOWVzIGF1IGJhcyBkZSBjZXR0ZSBwYWdlLgotCi0jIEdldAotQUxUX0dFVD1HZXQKLQotIyBDb21tb24gRm9ybSBDb250cm9sIFRpdGxlCi1GT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFPVZhbGV1ciBkdSBub20KLUZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFPVZhbGV1ciBkZSBsYSBkZXNjcmlwdGlvbgotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FPU5vbSBkZSBsYSBjbFx1MDBlOSBkZSBjYXRcdTAwZTlnb3JpZQotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRT1WYWxldXIgZGUgbGEgY2xcdTAwZTkgZGUgY2F0XHUwMGU5Z29yaWUKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FPU5vbSBkZSBjbFx1MDBlOSBwb3VyIGwnaWRlbnRpZmljYXRldXIKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9WQUxVRT1WYWxldXIgZGUgY2xcdTAwZTkgcG91ciBsJ2lkZW50aWZpY2F0ZXVyCi1GT1JNX0NPTlRST0xfVElUTEVfRElTQ09WRVJZX1VSTD1VUkwgZGUgcmVjaGVyY2hlCi0KLSMgRmluZCBhY3Rpb25zCi1BTFRfRklORD1SZWNoZXJjaGVyCi1BTFRfU1VCUVVFUlk9UmVjaGVyY2hlciBsYSBzb3VzLXJlcXVcdTAwZWF0ZSAlMQotRk9STV9MQUJFTF9RVUVSWV9OQU1FPU5vbSBkZSBjZXR0ZSByZXF1XHUwMGVhdGUKLURFRkFVTFRfUVVFUllfTkFNRT1SXHUwMGU5c3VsdGF0cyBkZSBsYSByZXF1XHUwMGVhdGUKLURFRkFVTFRfU1VCUVVFUllfTkFNRT1Tb3VzLXJlcXVcdTAwZWF0ZSAlMSAtICUyCi1GT1JNX0xBQkVMX1NFQVJDSF9GT1I9UmVjaGVyY2hlcgotRk9STV9PUFRJT05fQlVTSU5FU1NFUz1NXHUwMGU5dGllcnMKLUZPUk1fT1BUSU9OX1NFUlZJQ0VTPVNlcnZpY2VzCi1GT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVM9SW50ZXJmYWNlcyBkZSBzZXJ2aWNlCi1GT1JNX0xBQkVMX1NFQVJDSF9UWVBFPVR5cGUgZGUgcmVjaGVyY2hlCi1GT1JNX1JBRElPX1NJTVBMRT1TaW1wbGUKLUZPUk1fUkFESU9fQURWQU5DRUQ9QXZhbmNcdTAwZTllCi1GT1JNX1JBRElPX1VVSUQ9VVVJRAotRk9STV9MQUJFTF9GSU5EX0JVU0lORVNTRVNfU0lNUExFX0RFU0M9SW5kaXF1ZXogbGUgbm9tIHBhcnRpZWwgb3UgY29tcGxldCBkJ3VuIG1cdTAwZTl0aWVyIFx1MDBlMCByZWNoZXJjaGVyLiBWb3VzIHBvdXZleiB1dGlsaXNlciBsZSBzeW1ib2xlICclJyBjb21tZSBjYXJhY3RcdTAwZThyZSBnXHUwMGU5blx1MDBlOXJpcXVlIHBvdXIgcmVtcGxhY2VyIHVuIGNhcmFjdFx1MDBlOHJlLiBQb3VyIGxhbmNlciBsYSByZWNoZXJjaGUsIGNsaXF1ZXogc3VyIDxzdHJvbmc+T0s8L3N0cm9uZz4uCi1GT1JNX0xBQkVMX0ZJTkRfQURWQU5DRURfREVTQz1JbmRpcXVleiBkZXMgdmFsZXVycyBwb3VyIHVuIG91IHBsdXNpZXVycyBwYXJhbVx1MDBlOHRyZXMgclx1MDBlOXBlcnRvcmlcdTAwZTlzIGNpLWRlc3NvdXMuIFZvdXMgcG91dmV6IHV0aWxpc2VyIGxlIHN5bWJvbGUgJyUnIGNvbW1lIGNhcmFjdFx1MDBlOHJlIGdcdTAwZTluXHUwMGU5cmlxdWUgcG91ciByZW1wbGFjZXIgdW4gY2FyYWN0XHUwMGU4cmUgZGFucyBsYSB6b25lIE5vbSBkdSB0YWJsZWF1IE5vbXMuIFZvdXMgZGV2cmV6IHBldXQtXHUwMGVhdHJlIHZvdXMgYXV0aGVudGlmaWVyLiBQb3VyIGxhbmNlciBsYSByZWNoZXJjaGUsIGNsaXF1ZXogc3VyIDxzdHJvbmc+T0s8L3N0cm9uZz4uCi1GT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NfVVVJRF9ERVNDPUluZGlxdWV6IGwnVVVJRCBkdSBtXHUwMGU5dGllciBcdTAwZTAgcmVjaGVyY2hlci4gUG91ciBsYW5jZXIgbGEgcmVjaGVyY2hlLCBjbGlxdWV6IHN1ciA8c3Ryb25nPk9LPC9zdHJvbmc+LgotRk9STV9MQUJFTF9OQU1FUz1Ob21zCi1GT1JNX0xJTktfQUREPUFqb3V0ZXIKLUZPUk1fTElOS19HRVQ9RXh0cmFpcmUKLUZPUk1fTElOS19GSU5EPVJlY2hlcmNoZXIKLUZPUk1fTElOS19SRU1PVkU9U3VwcHJpbWVyCi1GT1JNX0xBQkVMX09XTkVEPVByb3ByaVx1MDBlOXRhaXJlCi1GT1JNX0xBQkVMX1BVQkxJU0hfVVJMPVVSTCBkZSBwdWJsaWNhdGlvbgotRk9STV9MQUJFTF9VU0VSSUQ9SUQgdXRpbGlzYXRldXIKLUZPUk1fTEFCRUxfUEFTU1dPUkQ9TW90IGRlIHBhc3NlCi1GT1JNX0xBQkVMX0xBTkdVQUdFPUxhbmd1ZQotRk9STV9MQUJFTF9OQU1FPU5vbQotRk9STV9MQUJFTF9ERVNDUklQVElPTj1EZXNjcmlwdGlvbgotRk9STV9PUFRJT05fTEFOR1VBR0VfRU49QW5nbGFpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfQUE9QWZhcgotRk9STV9PUFRJT05fTEFOR1VBR0VfQUI9QWJraGF6aWVuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BRj1BZnJpa2FhbnMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FNPUFtaGFyaXF1ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQVI9QXJhYmUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FTPUFzc2FtYWlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BWT1BeW1hcmEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FaPUF6ZXJiYVx1MDBlZmRqYW5haXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JBPUJhc2hraXIKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JFPUJpXHUwMGU5bG9ydXNzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQkc9QnVsZ2FyZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQkg9QmloYXJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CST1CaWNobGFtYXIKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JOPUJlbmdhbGk7IEJhbmdsYQotRk9STV9PUFRJT05fTEFOR1VBR0VfQk89VGliXHUwMGU5dGFpbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQlI9QnJldG9uCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DQT1DYXRhbGFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DTz1Db3JzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQ1o9VGNoXHUwMGU4cXVlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DWT1HYWxsb2lzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9EQT1EYW5vaXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RFPUFsbGVtYW5kCi1GT1JNX09QVElPTl9MQU5HVUFHRV9EWj1CaHV0YW5pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTD1HcmVjCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTz1Fc3BcdTAwZTlyYW50bwotRk9STV9PUFRJT05fTEFOR1VBR0VfRVM9RXNwYWdub2wKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VUPUVzdG9uaWVuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FVT1CYXNxdWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZBPVBlcnNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GST1GaW5ub2lzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GSj1GaWRqaQotRk9STV9PUFRJT05fTEFOR1VBR0VfRk89Rlx1MDBlOXJvaWVuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GUj1GcmFuXHUwMGU3YWlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GWT1GcmlzaWVuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HQT1JcmxhbmRhaXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dEPUdhXHUwMGU5bGlxdWUgXHUwMGU5Y29zc2FpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfR0w9R2FsaWNpZW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dOPUd1YXJhbmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dVPUdvdWpyYXRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IQT1IYW91c3NhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IST1IaW5kaQotRk9STV9PUFRJT05fTEFOR1VBR0VfSFI9Q3JvYXRlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IVT1Ib25ncm9pcwotRk9STV9PUFRJT05fTEFOR1VBR0VfSFk9QXJtXHUwMGU5bmllbgotRk9STV9PUFRJT05fTEFOR1VBR0VfSUE9SW50ZXJsaW5ndWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lFPUludGVybGluZ3VlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JSz1JbnVwaWFrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JTj1JbmRvblx1MDBlOXNpZW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lTPUlzbGFuZGFpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfSVQ9SXRhbGllbgotRk9STV9PUFRJT05fTEFOR1VBR0VfSVc9SFx1MDBlOWJyZXUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pBPUphcG9uYWlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KST1ZaWRkaXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KVz1KYXZhbmFpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfS0E9R1x1MDBlOW9yZ2llbgotRk9STV9PUFRJT05fTEFOR1VBR0VfS0s9S2F6YWtoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTD1Hcm9lbmxhbmRhaXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tNPUNhbWJvZGdpZW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tOPUthbm5hZGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tPPUNvclx1MDBlOWVuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LUz1LYXNobWlyaQotRk9STV9PUFRJT05fTEFOR1VBR0VfS1U9S3VyZGUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tZPUtpcmdoaXoKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xBPUxhdGluCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MTj1MaW5nYWxhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MTz1MYW90aWVuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MVD1MaXR1YW5pZW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xWPUxldHRvbiwgbGV0dG9uaWVuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NRz1NYWxnYWNoZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTUk9TWFvcmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01LPU1hY1x1MDBlOWRvbmllbgotRk9STV9PUFRJT05fTEFOR1VBR0VfTUw9TWFsYXlhbGFtCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTj1Nb25nb2wKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01PPU1vbGRhdmUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01SPU1hcmF0aGUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01TPU1hbGFpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfTVQ9TWFsdGFpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfTVk9QmlybWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9OQT1OYXVyaQotRk9STV9PUFRJT05fTEFOR1VBR0VfTkU9Tlx1MDBlOXBhbGFpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfTkw9Tlx1MDBlOWVybGFuZGFpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfTk89Tm9ydlx1MDBlOWdpZW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09DPU9jY2l0YW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09NPShBZmFuKSBvcm9tbwotRk9STV9PUFRJT05fTEFOR1VBR0VfT1I9T3JpeWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BBPVBlbmRqYWJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QTD1Qb2xvbmFpcwotRk9STV9PUFRJT05fTEFOR1VBR0VfUFM9UGFzaHRvLCBQYXNodG91Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9QVD1Qb3J0dWdhaXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1FVPVF1aWNodWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JNPVJoXHUwMGU5dG8tcm9tYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JOPUtpcm91bmRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STz1Sb3VtYWluCi1GT1JNX09QVElPTl9MQU5HVUFHRV9SVT1SdXNzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfUlc9S2lueWFyd2FuZGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NBPVNhbnNjcml0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TRD1TaW5kaGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NHPVNhbmdvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TSD1TZXJiby1jcm9hdGUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NJPVNpbmdoYWxhaXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NLPVNsb3ZhcXVlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTD1TbG92XHUwMGU4bmUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NNPVNhbW9hbgotRk9STV9PUFRJT05fTEFOR1VBR0VfU049U2hvbmEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NPPVNvbWFsaQotRk9STV9PUFRJT05fTEFOR1VBR0VfU1E9QWxiYW5haXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NSPVNlcmJlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUz1TaXN3YXRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVD1TZXNvdGhvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVT1Tb3VuZGFuYWlzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVj1TdVx1MDBlOWRvaXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NXPVN3YWhpbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RBPVRhbW91bAotRk9STV9PUFRJT05fTEFOR1VBR0VfVEU9VFx1MDBlOWdvdWxvdQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEc9VGFkamlrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9USD1UaGFcdTAwZWYKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RJPVRpZ3JpbnlhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9USz1UdXJrbVx1MDBlOG5lCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTD1UYWdhbAotRk9STV9PUFRJT05fTEFOR1VBR0VfVE49U2V0Y2h3YW5hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTz1Ub25nYQotRk9STV9PUFRJT05fTEFOR1VBR0VfVFI9VHVyYwotRk9STV9PUFRJT05fTEFOR1VBR0VfVFM9VHNvbmdhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVD1UYXRhcgotRk9STV9PUFRJT05fTEFOR1VBR0VfVFc9VGNoaQotRk9STV9PUFRJT05fTEFOR1VBR0VfVUs9VWtyYWluaWVuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9VUj1PdXJkb3UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VaPU91emJlawotRk9STV9PUFRJT05fTEFOR1VBR0VfVkk9VmlldG5hbWllbgotRk9STV9PUFRJT05fTEFOR1VBR0VfVk89Vm9sYXBcdTAwZmNrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9XTz1PdW9sb2YKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1hIPVhob3NhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ZTz1Zb3JvdWJhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aSD1DaGlub2lzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aVT1ab3Vsb3UKLUZPUk1fTEFCRUxfRVhBQ1RfTkFNRV9NQVRDSD1PY2N1cnJlbmNlIGV4YWN0ZQotRk9STV9MQUJFTF9DQVNFX1NFTlNJVElWRV9NQVRDSD1EaXN0aW5jdGlvbiBtYWovbWluCi1GT1JNX0xBQkVMX1NPVU5ERVg9SW1pdGF0aW9uIGR1IHNvbgotRk9STV9MQUJFTF9JREVOVElGSUVSUz1JZGVudGlmaWNhdGV1cnMKLUZPUk1fTEFCRUxfSURFTlRJRklFUl9UWVBFPVR5cGUKLQotIyBEbyBub3QgdHJhbnNsYXRlIHRoZSB0d28gaXRlbXMgYmVsb3cuCi1GT1JNX09QVElPTl9JREVOVElGSUVSX0RVTlM9RC1VLU4tUwotRk9STV9PUFRJT05fSURFTlRJRklFUl9USE9NQVNfUkVHSVNUUlk9UmVnaXN0cmUgVGhvbWFzCi0KLUZPUk1fTEFCRUxfS0VZX05BTUU9Tm9tIGRlIGNsXHUwMGU5Ci1GT1JNX0xBQkVMX0tFWV9WQUxVRT1WYWxldXIgZGUgY2xcdTAwZTkKLUZPUk1fTEFCRUxfQ0FURUdPUklFUz1DYXRcdTAwZTlnb3JpZXMKLUZPUk1fTEFCRUxfQ0FURUdPUllfVFlQRT1UeXBlCi1GT1JNX09QVElPTl9DQVRFR09SWV9OQUlDUz1OQUlDUwotRk9STV9PUFRJT05fQ0FURUdPUllfVU5TUFNDXzczPVVOU1BTQyA3LjMKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX0dFTz1HRU8KLUZPUk1fT1BUSU9OX0NBVEVHT1JZX0RXQ09NTVVOSVRZPUNvbW11bmF1dFx1MDBlOSBkVwotRk9STV9MQUJFTF9CVVNJTkVTU19DQVRFR09SSUVTPUNvbXBhcmVyIGF2ZWMgOgotRk9STV9PUFRJT05fQlVTSU5FU1NFU19PTkxZPU1cdTAwZTl0aWVycyB1bmlxdWVtZW50Ci1GT1JNX09QVElPTl9TRVJWSUNFU19PTkxZPVNlcnZpY2VzIHVuaXF1ZW1lbnQKLUZPUk1fT1BUSU9OX0JPVEg9TVx1MDBlOXRpZXJzIGV0IHNlcnZpY2VzCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTFM9VVJMIGRlIHJlY2hlcmNoZQotRk9STV9MQUJFTF9ESVNDT1ZFUllVUkw9VVJMIGRlIHJlY2hlcmNoZQotRk9STV9MQUJFTF9GSU5EUVVBTElGSUVSUz1SZWNoZXJjaGVyIGxlcyBxdWFsaWZpY2F0aWZzCi1GT1JNX0xBQkVMX0NPTUJJTkVfS0VZUz1Db21iaW5lciBsZXMgY2xcdTAwZTlzIDoKLUZPUk1fT1BUSU9OX0FOREFMTEtFWVM9RXQKLUZPUk1fT1BUSU9OX09SQUxMS0VZUz1PdQotRk9STV9PUFRJT05fT1JMSUtFS0VZUz1PdSBjb21tZQotRk9STV9MQUJFTF9TT1JUX0JZX05BTUU9VHJpZXIgcGFyIG5vbSA6Ci1GT1JNX1JBRElPX1NPUlRfQVNDPU9yZHJlIGNyb2lzc2FudAotRk9STV9SQURJT19TT1JUX0RFU0M9T3JkcmUgZFx1MDBlOWNyb2lzc2FudAotRk9STV9MQUJFTF9TT1JUX0JZX0RBVEU9VHJpZXIgcGFyIGRhdGUgOgotRk9STV9MQUJFTF9NQVhfU0VBUkNIX1NFVD1UYWlsbGUgbWF4aW1hbGUgZGUgbCdlbnNlbWJsZSByZWNoZXJjaFx1MDBlOSA6Ci1GT1JNX0xBQkVMX01BWF9SRVNVTFRTPU5vbWJyZSBtYXhpbWFsIGRlIHJcdTAwZTlzdWx0YXRzIDoKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFU19TSU1QTEVfREVTQz1JbmRpcXVleiBsZSBub20gcGFydGllbCBvdSBjb21wbGV0IGQndW4gc2VydmljZSBcdTAwZTAgcmVjaGVyY2hlci4gVm91cyBwb3V2ZXogdXRpbGlzZXIgbGUgc3ltYm9sZSAnJScgY29tbWUgY2FyYWN0XHUwMGU4cmUgZ1x1MDBlOW5cdTAwZTlyaXF1ZSBwb3VyIHJlbXBsYWNlciB1biBjYXJhY3RcdTAwZThyZS4gUG91ciBsYW5jZXIgbGEgcmVjaGVyY2hlLCBjbGlxdWV6IHN1ciA8c3Ryb25nPk9LPC9zdHJvbmc+LgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfVVVJRF9ERVNDPUluZGlxdWV6IGwnVVVJRCBkdSBzZXJ2aWNlIFx1MDBlMCByZWNoZXJjaGVyLiBQb3VyIGxhbmNlciBsYSByZWNoZXJjaGUsIGNsaXF1ZXogc3VyIDxzdHJvbmc+T0s8L3N0cm9uZz4uCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRV9JTlRFUkZBQ0VTX1NJTVBMRV9ERVNDPUluZGlxdWV6IGxlIG5vbSBwYXJ0aWVsIG91IGNvbXBsZXQgZCd1bmUgaW50ZXJmYWNlIGRlIHNlcnZpY2UgXHUwMGUwIHJlY2hlcmNoZXIuIFZvdXMgcG91dmV6IHV0aWxpc2VyIGxlIHN5bWJvbGUgJyUnIGNvbW1lIGNhcmFjdFx1MDBlOHJlIGdcdTAwZTluXHUwMGU5cmlxdWUgcG91ciByZW1wbGFjZXIgdW4gY2FyYWN0XHUwMGU4cmUuIFBvdXIgbGFuY2VyIGxhIHJlY2hlcmNoZSwgY2xpcXVleiBzdXIgPHN0cm9uZz5PSzwvc3Ryb25nPi4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRV9VVUlEX0RFU0M9SW5kaXF1ZXogbCdVVUlEIGRlIGwnaW50ZXJmYWNlIGRlIHNlcnZpY2UgXHUwMGUwIHJlY2hlcmNoZXIuIFBvdXIgbGFuY2VyIGxhIHJlY2hlcmNoZSwgY2xpcXVleiBzdXIgPHN0cm9uZz5PSzwvc3Ryb25nPi4KLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VTPUludGVyZmFjZXMgZGUgc2VydmljZQotRk9STV9MQUJFTF9VVUlEX0tFWT1DbFx1MDBlOSBkZSBsJ1VVSUQgOgotRk9STV9MQUJFTF9VU0VfU0VSVklDRT1VdGlsaXNlciBsZSBzZXJ2aWNlCi1GT1JNX0xBQkVMX1NFUlZJQ0U9U2VydmljZQotRk9STV9MQUJFTF9CVVNJTkVTUz1NXHUwMGU5dGllcgotRk9STV9MQUJFTF9QVUJMSVNIX0FTU0VSVElPTlM9UmVsYXRpb25zIGNvbW1lcmNpYWxlcwotRk9STV9MQUJFTF9ESVJFQ1RJT049U2VucwotRk9STV9MQUJFTF9GUk9NX0tFWT1BIHBhcnRpciBkZSBsYSBjbFx1MDBlOQotRk9STV9MQUJFTF9UT19LRVk9VmVycyBsYSBjbFx1MDBlOQotRk9STV9MQUJFTF9TVEFUVVM9U3RhdHV0Ci1GT1JNX0xBQkVMX0FTU0VSVElPTl9UWVBFPVR5cGUgZGUgcmVsYXRpb24KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX1BBUkVOVF9DSElMRD1QYXJlbnQtZW5mYW50Ci1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QRUVSX1RPX1BFRVI9RWdhbC1cdTAwZTlnYWwKLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX0lERU5USVRZPUlkZW50aXRcdTAwZTkKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX0RJUkVUSU9OX0RFU0M9TGUgc2VucyA8c3Ryb25nPkEgcGFydGlyIGRlPC9zdHJvbmc+IGNyXHUwMGU5ZXJhIHVuZSByZWxhdGlvbiBjb21tZXJjaWFsZSBcdTAwZTAgcGFydGlyIGRlIGNlIG1cdTAwZTl0aWVyIHZlcnMgbGVzIG1cdTAwZTl0aWVycyBzaXR1XHUwMGU5cyBhdS1kZXNzdXMuIExlIHNlbnMgPHN0cm9uZz5WZXJzPC9zdHJvbmc+IGNyXHUwMGU5ZXJhIHVuZSByZWxhdGlvbiBjb21tZXJjaWFsZSBcdTAwZTAgcGFydGlyIGRlcyBtXHUwMGU5dGllcnMgYXUtZGVzc3VzIHZlcnMgY2UgbVx1MDBlOXRpZXIuCi1GT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX0ZST009LS0tPgotRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9UTz08LS0tCi1GT1JNX0xBQkVMX1RISVNfQlVTSU5FU1M9Q2UgbVx1MDBlOXRpZXIKLU1TR19FUlJPUl9JTlZBTElEX1FVRVJZX05BTUU9SVdBQjAxNDBFIEluZGlxdWV6IHVuIG5vbSB2YWxpZGUgcG91ciBsYSByZXF1XHUwMGVhdGUuCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FUz1JV0FCMDE0MUUgSW5kaXF1ZXogdW5lIHNcdTAwZTlyaWUgZGUgbm9tcyB2YWxpZGVzLgotTVNHX0VSUk9SX0lOVkFMSURfUFVCTElTSF9VUkw9SVdBQjAxNDJFIEluZGlxdWV6IHVuZSBVUkwgZGUgcHVibGljYXRpb24gdmFsaWRlLgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEPUlXQUIwMTQzRSBJbmRpcXVleiB1biBJRCB1dGlsaXNhdGV1ciB2YWxpZGUuCi1NU0dfRVJST1JfSU5WQUxJRF9NQVhfU0VBUkNIX1NFVD1JV0FCMDE0NUUgSW5kaXF1ZXogdW5lIHRhaWxsZSB2YWxpZGUgcG91ciBsYSB0YWlsbGUgbWF4aW1hbGUgZGUgbCdlbnNlbWJsZSByZWNoZXJjaFx1MDBlOS4KLU1TR19FUlJPUl9JTlZBTElEX01BWF9SRVNVTFRTPUlXQUIwMTQ2RSBJbmRpcXVleiB1bmUgdGFpbGxlIHZhbGlkZSBwb3VyIGxlIG5vbWJyZSBtYXhpbWFsIGRlIHJcdTAwZTlzdWx0YXRzLgotTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0N0kgTm9tYnJlIGRlIG1cdTAwZTl0aWVycyB0cm91dlx1MDBlOXMgOiAlMQotTVNHX0VSUk9SX05PX0JVU0lORVNTRVNfRk9VTkQ9SVdBQjAxNDhFIEF1Y3VuIG1cdTAwZTl0aWVyIG4nYSBcdTAwZTl0XHUwMGU5IHRyb3V2XHUwMGU5LgotTVNHX0lORk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNDlJIE5vbWJyZSBkZSBzZXJ2aWNlcyB0cm91dlx1MDBlOXMgOiAlMQotTVNHX0VSUk9SX05PX1NFUlZJQ0VTX0ZPVU5EPUlXQUIwMTUwRSBBdWN1biBzZXJ2aWNlIG4nYSBcdTAwZTl0XHUwMGU5IHRyb3V2XHUwMGU5LgotTVNHX0VSUk9SX1NJTkdMRV9JVEVNPUlXQUIwMTUxRSBTXHUwMGU5bGVjdGlvbm5leiB1biBzZXVsIFx1MDBlOWxcdTAwZTltZW50LgotTVNHX1FVRVNUSU9OX0lURU1fUkVQTEFDRU1FTlQ9TGEgc1x1MDBlOWxlY3Rpb24gcmVtcGxhY2VyYSB1biBcdTAwZTlsXHUwMGU5bWVudCBmaWd1cmFudCBkXHUwMGU5alx1MDBlMCBkYW5zIGxhIGNpYmxlLiBWb3VsZXotdm91cyBjb250aW51ZXIgPwotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUySSBOb21icmUgZCdpbnRlcmZhY2VzIGRlIHNlcnZpY2UgdHJvdXZcdTAwZTllcyA6ICUxCi1NU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUzRSBBdWN1bmUgaW50ZXJmYWNlIGRlIHNlcnZpY2UgbidhIFx1MDBlOXRcdTAwZTkgdHJvdXZcdTAwZTllLgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAxNTRFIFNcdTAwZTlsZWN0aW9ubmV6IGF1IG1vaW5zIHVuIFx1MDBlOWxcdTAwZTltZW50LgotTVNHX0VSUk9SX0lOVkFMSURfVVVJRF9LRVk9SVdBQjAxNTVFIEluZGlxdWV6IHVuZSBjbFx1MDBlOSBkJ1VVSUQgdmFsaWRlLgotTVNHX0VSUk9SX1FVRVJZX05BTUVfQ09ORkxJQ1Q9SVdBQjAxNTZFIExlIG5vbSBkZSByZXF1XHUwMGVhdGUgZGUgbGEgc291cy1yZXF1XHUwMGVhdGUgbmUgcGV1dCBwYXMgXHUwMGVhdHJlIGlkZW50aXF1ZSBcdTAwZTAgY2VsdWkgZGUgc29uIGF1dGV1ci4KLU1TR19FUlJPUl9OT19JVEVNU19UT19HRVQ9SVdBQjAxNTdFIEF1Y3VuIFx1MDBlOWxcdTAwZTltZW50IGR1IHR5cGUgaW5kaXF1XHUwMGU5IG4nYSBlbmNvcmUgXHUwMGU5dFx1MDBlOSBwdWJsaVx1MDBlOSBvdWhlJ3MgYSByZWNoZXJjaFx1MDBlOS4KLQotIyBSZXN1bHRzCi1BTFRfUVVFUllfUkVTVUxUUz1SXHUwMGU5c3VsdGF0cyBkZSBsYSByZXF1XHUwMGVhdGUKLUZPUk1fTEFCRUxfU1VCUVVFUlk9TGVzIHJcdTAwZTlzdWx0YXRzIHBldXZlbnQgXHUwMGVhdHJlIHV0aWxpc1x1MDBlOXMgY29tbWUgZW50clx1MDBlOWVzIHBvdXIgdW5lIGF1dHJlIG9wXHUwMGU5cmF0aW9uLiBQb3VyIGFmZmljaGVyIGwnb3BcdTAwZTlyYXRpb24sIGNsaXF1ZXogc3VyIGxlIGxpZW4gPHN0cm9uZz5jaWJsZTwvc3Ryb25nPiBlbiBoYXV0LiBMZXMgclx1MDBlOXN1bHRhdHMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5cyBwZXV2ZW50IFx1MDBlYXRyZSB1dGlsaXNcdTAwZTlzIGRhbnMgbCdvcFx1MDBlOXJhdGlvbiBlbiBjbGlxdWFudCBzdXIgbGUgYm91dG9uIDxzdHJvbmc+VHJhbnNmXHUwMGU5cmVyPC9zdHJvbmc+LgotRk9STV9MQUJFTF9RVUVSWT1TXHUwMGU5bGVjdGlvbm5leiB1biByXHUwMGU5c3VsdGF0IHBvdXIgYWZmaWNoZXIgc2VzIGRcdTAwZTl0YWlscyBvdSBzXHUwMGU5bGVjdGlvbm5leiB1biBlbnNlbWJsZSBkZSByXHUwMGU5c3VsdGF0cyBldCBjbGlxdWV6IHN1ciB1biBib3V0b24gcG91ciBlZmZlY3R1ZXIgdW5lIG9wXHUwMGU5cmF0aW9uLgotRk9STV9MSU5LX1RBUkdFVD1jaWJsZQotRk9STV9CVVRUT05fVFJBTlNGRVI9VHJhbnNmXHUwMGU5cmVyCi1GT1JNX0JVVFRPTl9SRUZSRVNIPVJcdTAwZTlnXHUwMGU5blx1MDBlOXJhdGlvbgotRk9STV9CVVRUT05fQUREX1RPX0ZBVk9SSVRFUz1Bam91dGVyIGF1eCBmYXZvcmlzCi1GT1JNX0JVVFRPTl9VTlBVQkxJU0g9QW5udWxlciBsYSBwdWJsaWNhdGlvbgotRk9STV9CVVRUT05fQ0xFQVI9RWZmYWNlcgotCi0jIFB1Ymxpc2ggYWN0aW9ucwotQUxUX1BVQkxJU0g9UHVibGllcgotRk9STV9MQUJFTF9QVUJMSVNIPVB1YmxpZXIgOgotRk9STV9PUFRJT05fQlVTSU5FU1M9TVx1MDBlOXRpZXIKLUZPUk1fT1BUSU9OX1NFUlZJQ0U9U2VydmljZQotRk9STV9PUFRJT05fU0VSVklDRV9JTlRFUkZBQ0U9SW50ZXJmYWNlIGRlIHNlcnZpY2UKLUZPUk1fTEFCRUxfUFVCTElTSF9CVVNJTkVTU19TSU1QTEVfREVTQz1JbmRpcXVleiB1biBub20gZXQgdW5lIGRlc2NyaXB0aW9uIFx1MDBlOXZlbnR1ZWxsZSBwb3VyIGxlIG1cdTAwZTl0aWVyIFx1MDBlMCBwdWJsaWVyLiBWb3VzIGRldnJleiBwZXV0LVx1MDBlYXRyZSB2b3VzIGF1dGhlbnRpZmllci4KLUZPUk1fTEFCRUxfUFVCTElTSF9CVVNJTkVTU19BRFZBTkNFRF9ERVNDPUluZGlxdWV6IHVuIG5vbSBwb3VyIGxlIG1cdTAwZTl0aWVyIFx1MDBlMCBwdWJsaWVyLiBWb3VzIHBvdXZleiBhdXNzaSBpbmRpcXVlciBkJ2F1dHJlcyBwYXJhbVx1MDBlOHRyZXMuIFZvdXMgZGV2cmV6IHBldXQtXHUwMGVhdHJlIHZvdXMgYXV0aGVudGlmaWVyLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0M9RXh0cmF5ZXogb3UgcmVjaGVyY2hleiB1biBtXHUwMGU5dGllciBwdWlzIGluZGlxdWV6IGwnVVJMIFdTREwsIHVuIG5vbSBldCB1bmUgZGVzY3JpcHRpb24gXHUwMGU5dmVudHVlbGxlIHBvdXIgbGUgc2VydmljZSBcdTAwZTAgcHVibGllci4gVm91cyBkZXZyZXogcGV1dC1cdTAwZWF0cmUgdm91cyBhdXRoZW50aWZpZXIuCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9BRFZBTkNFRF9ERVNDPUV4dHJheWV6IG91IHJlY2hlcmNoZXogdW4gbVx1MDBlOXRpZXIgcHVpcyBpbmRpcXVleiBsJ1VSTCBXU0RMIGV0IHVuIG5vbSBwb3VyIGxlIHNlcnZpY2UgXHUwMGUwIHB1YmxpZXIuIFZvdXMgcG91dmV6IGF1c3NpIGluZGlxdWVyIGQnYXV0cmVzIHBhcmFtXHUwMGU4dHJlcy4gVm91cyBkZXZyZXogcGV1dC1cdTAwZWF0cmUgdm91cyBhdXRoZW50aWZpZXIuCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQz1FeHRyYXlleiBvdSByZWNoZXJjaGV6IHVuIG1cdTAwZTl0aWVyIHB1aXMgaW5kaXF1ZXogbCdVUkwgV1NETCwgdW4gbm9tIGV0IHVuZSBkZXNjcmlwdGlvbiBcdTAwZTl2ZW50dWVsbGUgcG91ciBsZSBzZXJ2aWNlIFx1MDBlMCBwdWJsaWVyLiBWb3VzIGRldnJleiBwZXV0LVx1MDBlYXRyZSB2b3VzIGF1dGhlbnRpZmllci4KLUZPUk1fTEFCRUxfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0M9SW5kaXF1ZXogbCdVUkwgV1NETCBldCBsZSBub20gZHUgc2VydmljZSBcdTAwZTAgcHVibGllci4gVm91cyBwb3V2ZXogYXVzc2kgaW5kaXF1ZXIgZCdhdXRyZXMgcGFyYW1cdTAwZTh0cmVzLiBWb3VzIGRldnJleiBwZXV0LVx1MDBlYXRyZSB2b3VzIGF1dGhlbnRpZmllci4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9TSU1QTEVfREVTQz1JbmRpcXVleiBsJ1VSTCBXU0RMLCBsZSBub20gZXQgbGEgZGVzY3JpcHRpb24gXHUwMGU5dmVudHVlbGxlIGRlIGwnaW50ZXJmYWNlIGRlIHNlcnZpY2UgXHUwMGUwIHB1YmxpZXIuIFZvdXMgZGV2cmV6IHBldXQtXHUwMGVhdHJlIHZvdXMgYXV0aGVudGlmaWVyLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFX0FEVkFOQ0VEX0RFU0M9SW5kaXF1ZXogbCdVUkwgV1NETCBldCBsZSBub20gZGUgbCdpbnRlcmZhY2UgZGUgc2VydmljZSBcdTAwZTAgcHVibGllci4gVm91cyBwb3V2ZXogYXVzc2kgaW5kaXF1ZXIgZCdhdXRyZXMgcGFyYW1cdTAwZTh0cmVzLiBWb3VzIGRldnJleiBwZXV0LVx1MDBlYXRyZSB2b3VzIGF1dGhlbnRpZmllci4KLUZPUk1fTEFCRUxfUFVCTElTSF9GT1JNPUZvcm1hdCBkZSBwdWJsaWNhdGlvbgotRk9STV9MQUJFTF9ERVNDUklQVElPTj1EZXNjcmlwdGlvbgotRk9STV9MQUJFTF9ERVNDUklQVElPTlM9RGVzY3JpcHRpb25zCi1NU0dfSU5GT19CVVNJTkVTU19QVUJMSVNIRUQ9SVdBQjAxNThJIExlIG1cdTAwZTl0aWVyICUxIGEgXHUwMGU5dFx1MDBlOSBwdWJsaVx1MDBlOS4KLU1TR19JTkZPX1NFUlZJQ0VfUFVCTElTSEVEPUlXQUIwMTU5SSBMZSBzZXJ2aWNlICUxIGEgXHUwMGU5dFx1MDBlOSBwdWJsaVx1MDBlOS4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1BVQkxJU0hFRD1JV0FCMDE2MEkgTCdpbnRlcmZhY2UgZGUgc2VydmljZSAlMSBhIFx1MDBlOXRcdTAwZTkgcHVibGlcdTAwZTllLgotTVNHX0VSUk9SX0lOVkFMSURfTkFNRT1JV0FCMDE2MUUgSW5kaXF1ZXogdW4gbm9tIHZhbGlkZS4KLU1TR19FUlJPUl9ST1dfQkxBTktfTEFOR1VBR0U9SVdBQjAyNTBFIFNcdTAwZTlsZWN0aW9ubmV6IHVuZSBsYW5ndWUgc291cyBsYSBmb3JtZSBkJ2F1dHJlcyBjYXJhY3RcdTAwZThyZXMgcXVlIGRlcyBjYXJhY3RcdTAwZThyZXMgYmxhbmNzIHBvdXIgbGUgJTEgZGUgbGEgbGlnbmUgJTIuIFNldWxlIGxhIHByZW1pXHUwMGU4cmUgbGlnbmUgcGV1dCBjb250ZW5pciB1bmUgbGFuZ3VlIHNvdXMgbGEgZm9ybWUgZGUgY2FyYWN0XHUwMGU4cmVzIGJsYW5jcy4KLU1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFPUlXQUIwMjUxRSBDaGFuZ2V6IGxhIGxhbmd1ZSBwb3VyIGxlICUxIGRlIGxhIGxpZ25lICUyLiBDZWxsZS1jaSBlc3QgZFx1MDBlOWpcdTAwZTAgdXRpbGlzXHUwMGU5ZS4KLU1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUPUlXQUIwMjUyRSBJbmRpcXVleiB1biAlMSB2YWxpZGUgXHUwMGUwIGxhIGxpZ25lICUyCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTD1JV0FCMDI1M0UgSW5kaXF1ZXogdW5lIFVSTCBXU0RMIHZhbGlkZS4KLU1TR19FUlJPUl9OT19OQU1FUz1JV0FCMDI1NEUgQWpvdXRleiBhdSBtb2lucyB1biBub20uCi1NU0dfRVJST1JfSU5WQUxJRF9TRVJWSUNFPUlXQUIwMjU1RSBJbmRpcXVleiB1biBzZXJ2aWNlIHZhbGlkZS4KLU1TR19FUlJPUl9JTlZBTElEX0JVU0lORVNTPUlXQUIwMjU2RSBJbmRpcXVleiB1biBtXHUwMGU5dGllciB2YWxpZGUuCi0KLSMgQnVzaW5lc3MgUHVibGlzaCBTZXJ2aWNlIGFjdGlvbgotQUxUX1BVQkxJU0hfU0VSVklDRT1QdWJsaWVyIHVuIHNlcnZpY2UKLQotIyBXU0RMIEJyb3dzZXIKLVRJVExFX1dTRExfQlJPV1NFUj1OYXZpZ2F0ZXVyIGRlIFdTREwgLSAlMQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRT1TXHUwMGU5bGVjdGlvbm5leiBsYSBzb3VyY2UgV1NETCA6Ci1GT1JNX0xBQkVMX1dTRExfU09VUkNFX1dFQlBST0pFQ1RTPVByb2pldHMgV2ViCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFX0ZBVk9SSVRFUz1GYXZvcmlzCi1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVByb2pldCBXZWIKLUZPUk1fTEFCRUxfV1NETF9VUkw9VVJMIFdTREwKLUFMVF9XU0RMX0JST1dTRVI9TmF2aWdhdGV1ciBXU0RMCi0KLSMgRGV0YWlscwotRk9STV9MSU5LX0VESVQ9RWRpdGVyCi1GT1JNX0xJTktfQ0FOQ0VMPUFubnVsZXIKLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPUNsXHUwMGU5IGR1IG1cdTAwZTl0aWVyCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPUNsXHUwMGU5IGR1IHNlcnZpY2UKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfS0VZPUNsXHUwMGU5IFRNb2RlbAotRk9STV9MQUJFTF9VU0VSX0RFRklORURfQ0FURUdPUklFUz1DYXRcdTAwZTlnb3JpZXMgZFx1MDBlOWZpbmllcyBwYXIgbCd1dGlsaXNhdGV1cgotRk9STV9MQUJFTF9DSEVDS0VEPUNvbnRyXHUwMGY0bFx1MDBlOWUKLUZPUk1fTEFCRUxfRklMRT1GaWNoaWVyCi1NU0dfUVVFU1RJT05fUFVCTElTSF9JVEVNPUwnXHUwMGU5bFx1MDBlOW1lbnQgZXN0IGludHJvdXZhYmxlIGRhbnMgbGUgcmVnaXN0cmUuIFZvdWxlei12b3VzIGxlIHB1YmxpZXIgPwotTVNHX1FVRVNUSU9OX1NFUlZJQ0VfUFVCTElTSF9CVVNJTkVTUz1MZSBzZXJ2aWNlIGV0IHNvbiBtXHUwMGU5dGllciBzb250IGludHJvdXZhYmxlcyBkYW5zIGxlIHJlZ2lzdHJlLiBWb3VsZXotdm91cyBjb250aW51ZXIgcG91ciBwdWJsaWVyID8KLU1TR19JTkZPX0JVU0lORVNTX1VQREFURUQ9SVdBQjAyNTdJIExlIG1cdTAwZTl0aWVyICUxIGEgXHUwMGU5dFx1MDBlOSBtaXMgXHUwMGUwIGpvdXIuCi1NU0dfSU5GT19TRVJWSUNFX1VQREFURUQ9SVdBQjAyNThJIExlIHNlcnZpY2UgJTEgYSBcdTAwZTl0XHUwMGU5IG1pcyBcdTAwZTAgam91ci4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VQREFURUQ9SVdBQjAyNTlJIEwnaW50ZXJmYWNlIGRlIHNlcnZpY2UgJTEgYSBcdTAwZTl0XHUwMGU5IG1pc2UgXHUwMGUwIGpvdXIuCi1NU0dfSU5GT19SRUdJU1RSWV9VUERBVEVEPUlXQUIwMzIzSSBMZSByZWdpc3RyZSAlMSBhIFx1MDBlOXRcdTAwZTkgbWlzIFx1MDBlMCBqb3VyLgotCi0jIFVucHVibGlzaEFjdGlvbgotQUxUX1VOUFVCTElTSF9CVVNJTkVTUz1Bbm51bGVyIGxhIHB1YmxpY2F0aW9uIGR1IG1cdTAwZTl0aWVyCi1BTFRfVU5QVUJMSVNIX1NFUlZJQ0U9QW5udWxlciBsYSBwdWJsaWNhdGlvbiBkdSBzZXJ2aWNlCi1BTFRfVU5QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFPUFubnVsZXIgbGEgcHVibGljYXRpb24gZGUgbCdpbnRlcmZhY2UgZGUgc2VydmljZQotRk9STV9MQUJFTF9VTlBVQkxJU0hfREVTQz1Qb3VyIGFubnVsZXIgbGEgcHVibGljYXRpb24gZGUgY2V0IG9iamV0LCBjbGlxdWV6IHN1ciA8c3Ryb25nPk9LPC9zdHJvbmc+LiBWb3VzIGRldnJleiBwZXV0LVx1MDBlYXRyZSB2b3VzIGF1dGhlbnRpZmllci4KLU1TR19JTkZPX0JVU0lORVNTX1VOUFVCTElTSEVEPUlXQUIwMjYwSSBMYSBwdWJsaWNhdGlvbiBkdSBtXHUwMGU5dGllciAlMSBhIFx1MDBlOXRcdTAwZTkgYW5udWxcdTAwZTllLgotTVNHX0lORk9fU0VSVklDRV9VTlBVQkxJU0hFRD1JV0FCMDI2MUkgTGEgcHVibGljYXRpb24gZHUgc2VydmljZSAlMSAgYSBcdTAwZTl0XHUwMGU5IGFubnVsXHUwMGU5ZS4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VOUFVCTElTSEVEPUlXQUIwMjYySSBMYSBwdWJsaWNhdGlvbiBkZSBsJ2ludGVyZmFjZSBkZSBzZXJ2aWNlICUxIGEgXHUwMGU5dFx1MDBlOSBhbm51bFx1MDBlOWUuCi0KLSMgQWRkIHRvIFdTREwgUGVyc3BlY3RpdmUKLUFMVF9BRERfVE9fV1NETF9QRVJTUEVDVElWRT1Bam91dGVyIFx1MDBlMCBsYSBwYWdlIFdTREwKLU1TR19JTkZPX1dTRExfQURERURfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3NkkgJTEgYSBcdTAwZTl0XHUwMGU5IGFqb3V0XHUwMGU5IFx1MDBlMCBsYSBwYWdlIFdTREwuCi1NU0dfRVJST1JfV1NETF9OT1RfQURERURfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3N0UgJTEgbidhIHBhcyBwdSBcdTAwZWF0cmUgYWpvdXRcdTAwZTkgXHUwMGUwIGxhIHBhZ2UgV1NETC4KLQotIyBBZGQgdG8gRmF2b3JpdGVzCi1BTFRfQUREX1RPX0ZBVk9SSVRFUz1Bam91dGVyIGF1eCBmYXZvcmlzCi1NU0dfSU5GT19GQVZPUklURV9BRERFRD1JV0FCMDI2M0kgJTEgYSBcdTAwZTl0XHUwMGU5IGFqb3V0XHUwMGU5IGF1eCBmYXZvcmlzLgotTVNHX0VSUk9SX0ZBVk9SSVRFX05PVF9BRERFRD1JV0FCMDI2NEUgJTEgbidhIHBhcyBwdSBcdTAwZWF0cmUgYWpvdXRcdTAwZTkgYXV4IGZhdm9yaXMuCi1NU0dfRVJST1JfRkFWT1JJVEVfQUxSRUFEWV9FWElTVFM9SVdBQjAzMjRFICUxIGZpZ3VyZSBkXHUwMGU5alx1MDBlMCBkYW5zIGxlcyBmYXZvcmlzLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9TGUgZmF2b3JpIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4gIFZvdWxlei12b3VzIGxlIHJlbXBsYWNlciA/Ci0KLSMgUmVmcmVzaAotTVNHX0lORk9fTk9ERV9SRUZSRVNIRUQ9SVdBQjAyNjVJICUxIGFjdHVhbGlzXHUwMGU5LgotTVNHX1FVRVNUSU9OX1JFTU9WRV9OT0RFPSUxIGVzdCBpbnRyb3V2YWJsZSBkYW5zIGxlIHJlZ2lzdHJlLiBWb3VsZXotdm91cyBsJ2VmZmFjZXIgPwotCi0jIE1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlcwotQUxUX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTPUdcdTAwZTlyZXIgbGVzIHNlcnZpY2VzIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOXMKLUZPUk1fTEFCRUxfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfREVTQz1Bam91dGV6IGRlcyBzZXJ2aWNlcyByZWNoZXJjaFx1MDBlOXMgb3UgcHVibGlcdTAwZTlzIFx1MDBlMCBsYSBsaXN0ZSBkZXMgc2VydmljZXMgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5cyBlbiBjbGlxdWFudCBzdXIgbGUgYm91dG9uIDxzdHJvbmc+QWpvdXRlciBkZXMgc2VydmljZXM8L3N0cm9uZz4uIFN1cHByaW1leiBsZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZXMgZW4gY2xpcXVhbnQgc3VyIGxlIGJvdXRvbiA8c3Ryb25nPlN1cHByaW1lciBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXM8L3N0cm9uZz4uIFVuZSBhdXRoZW50aWZpY2F0aW9uIHBldXQgXHUwMGVhdHJlIHJlcXVpc2UgcG91ciBsZXMgbW9kaWZpY2F0aW9ucy4KLUZPUk1fTEFCRUxfUkVGRVJFTkNFRF9TRVJWSUNFUz1TZXJ2aWNlcyByXHUwMGU5Zlx1MDBlOXJlbmNcdTAwZTlzCi1GT1JNX0JVVFRPTl9BRERfU0VSVklDRVM9QWpvdXRlciBkZXMgc2VydmljZXMKLUZPUk1fQlVUVE9OX1JFTU9WRV9SRUZFUkVOQ0VTPVN1cHByaW1lciBkZXMgclx1MDBlOWZcdTAwZTlyZW5jZXMKLU1TR19FUlJPUl9OT19SRUZFUkVOQ0VfU0VMRUNURUQ9SVdBQjAyNjZFIFNcdTAwZTlsZWN0aW9ubmV6IGF1IG1vaW5zIHVuIHNlcnZpY2Ugclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5IGF2YW50IGRlIGNvbnRpbnVlci4KLU1TR19FUlJPUl9OT19TRVJWSUNFUz1JV0FCMDI2N0UgRXh0cmF5ZXogb3UgcmVjaGVyY2hleiBhdSBtb2lucyB1biBzZXJ2aWNlIGF2YW50IGRlIGNvbnRpbnVlci4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9SRUZFUkVOQ0VEPUlXQUIwMjY4RSBMZSBzZXJ2aWNlICUxIG4nYSBwYXMgcHUgXHUwMGVhdHJlIHJcdTAwZTlmXHUwMGU5cmVuY1x1MDBlOS4KLU1TR19FUlJPUl9SRUZFUkVOQ0VfTk9UX1JFTU9WRUQ9SVdBQjAyNjlFIExhIHJcdTAwZTlmXHUwMGU5cmVuY2UgZGUgc2VydmljZSAlMSBuJ2EgcGFzIHB1IFx1MDBlYXRyZSBzdXBwcmltXHUwMGU5ZS4KLU1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFRD1JV0FCMDI3MEkgTGUgc2VydmljZSAlMSBhIFx1MDBlOXRcdTAwZTkgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5LgotTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VfUkVNT1ZFRD1JV0FCMDI3MUkgTGEgclx1MDBlOWZcdTAwZTlyZW5jZSBkZSBzZXJ2aWNlICUxIGEgXHUwMGU5dFx1MDBlOSBzdXBwcmltXHUwMGU5ZS4KLQotIyBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zCi1BTFRfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPUdcdTAwZTlyZXIgbGVzIHJlbGF0aW9ucyBjb21tZXJjaWFsZXMKLUZPUk1fTEFCRUxfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TX0RFU0M9QWpvdXRleiBkZXMgbVx1MDBlOXRpZXJzIHJlY2hlcmNoXHUwMGU5cyBvdSBwdWJsaVx1MDBlOXMgXHUwMGUwIGxhIGxpc3RlIGRlcyByZWxhdGlvbnMgY29tbWVyY2lhbGVzIGVuIGNsaXF1YW50IHN1ciA8c3Ryb25nPkFqb3V0ZXIgZGVzIHJlbGF0aW9uczwvc3Ryb25nPi4gU3VwcHJpbWV6IGxlcyByZWxhdGlvbnMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZXMgZW4gY2xpcXVhbnQgc3VyIDxzdHJvbmc+U3VwcHJpbWVyIGRlcyByZWxhdGlvbnM8L3N0cm9uZz4uIENvbXBsXHUwMGU5dGV6IGxlcyByZWxhdGlvbnMgc1x1MDBlOWxlY3Rpb25uXHUwMGU5ZXMgZW4gY2xpcXVhbnQgc3VyIDxzdHJvbmc+Q29tcGxcdTAwZTl0ZXIgZGVzIHJlbGF0aW9uczwvc3Ryb25nPi4gQ2xpcXVleiBzdXIgPHN0cm9uZz5BY3R1YWxpc2VyIGxlcyByZWxhdGlvbnM8L3N0cm9uZz4gcG91ciByXHUwMGU5Z1x1MDBlOW5cdTAwZTlyZXIgbGEgbGlzdGUgZGVzIHJlbGF0aW9ucy4KLUZPUk1fTEFCRUxfSU5DT01QTEVURV9BU1NFUlRJT05TX1ZJU0lCSUxJVFlfREVTQz1MZXMgcmVsYXRpb25zIGNvbW1lcmNpYWxlcyBpbmNvbXBsXHUwMGU4dGVzIG5lIHNvbnQgdmlzaWJsZXMgcXVlIHBhciBsZSBwcm9wcmlcdTAwZTl0YWlyZSBkdSBtXHUwMGU5dGllci4KLUZPUk1fTEFCRUxfQlVTSU5FU1NFUz1NXHUwMGU5dGllcnMKLUZPUk1fQlVUVE9OX1NIT1dfQUxMX1BVQkxJU0hFUl9BU1NFUlRJT05TPUFjdHVhbGlzZXIgbGVzIHJlbGF0aW9ucwotRk9STV9CVVRUT05fQ09NUExFVEVfUFVCTElTSEVSX0FTU0VSVElPTlM9Q29tcGxcdTAwZTl0ZXIgbGVzIHJlbGF0aW9ucwotRk9STV9CVVRUT05fQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TPUFqb3V0ZXIgZGVzIHJlbGF0aW9ucwotRk9STV9CVVRUT05fUkVNT1ZFX1BVQkxJU0hFUl9BU1NFUlRJT05TPVN1cHByaW1lciBkZXMgcmVsYXRpb25zCi1NU0dfSU5GT19QVUJMSVNIRVJfQVNTRVJUSU9OU19SRUZSRVNIRUQ9SVdBQjAzMjVJIExlcyByZWxhdGlvbnMgY29tbWVyY2lhbGVzIG9udCBcdTAwZTl0XHUwMGU5IGFjdHVhbGlzXHUwMGU5ZXMuCi1NU0dfRVJST1JfTk9fSU5DT01QTEVURV9BU1NFUlRJT05fU0VMRUNURUQ9SVdBQjAzMjZFIFNcdTAwZTlsZWN0aW9ubmV6IGF1IG1vaW5zIHVuZSByZWxhdGlvbiBjb21tZXJjaWFsZSBpbmNvbXBsXHUwMGU4dGUuCi1NU0dfRVJST1JfTk9UX09XTkVEX0JVU0lORVNTPUlXQUIwMzI3RSBDZXR0ZSBvcFx1MDBlOXJhdGlvbiBuZSBwZXV0IHBhcyBcdTAwZWF0cmUgZWZmZWN0dVx1MDBlOWUgc3VyIHVuIG1cdTAwZTl0aWVyIGFwcGFydGVuYW50IFx1MDBlMCB1bmUgYXV0cmUgcGFydGllLgotCi0jIEdldEJ1c2luZXNzZXMKLUFMVF9HRVRfQlVTSU5FU1M9RXh0cmFpcmUgdW4gbVx1MDBlOXRpZXIKLUFMVF9HRVRfQlVTSU5FU1NFUz1FeHRyYWlyZSBkZXMgbVx1MDBlOXRpZXJzCi1OT0RFX05BTUVfU0VSVklDRV9CVVNJTkVTUz1NXHUwMGU5dGllciBwb3VyIGxlIHNlcnZpY2UgJTEKLU5PREVfTkFNRV9TSV9CVVNJTkVTU0VTPU1cdTAwZTl0aWVycyBwb3VyIGwnaW50ZXJmYWNlIGRlIHNlcnZpY2UgJTEKLU1TR19RVUVTVElPTl9SRU1PVkVfU0VSVklDRV9OT0RFPUxlIHNlcnZpY2UgZXN0IGludHJvdXZhYmxlIGRhbnMgbGUgcmVnaXN0cmUuIFZvdWxlei12b3VzIHN1cHByaW1lciBjZSBub2V1ZCA/Ci0KLSMgR2V0U2VydmljZUludGVyZmFjZXMKLUFMVF9HRVRfU0VSVklDRV9JTlRFUkZBQ0VTPUV4dHJhaXJlIGRlcyBpbnRlcmZhY2VzIGRlIHNlcnZpY2UKLU5PREVfTkFNRV9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUz1JbnRlcmZhY2VzIGRlIHNlcnZpY2UgcG91ciBsZSBzZXJ2aWNlICUxCi1NU0dfUVVFU1RJT05fR0VUX1NJX1JFTU9WRV9TRVJWSUNFX05PREU9TGUgc2VydmljZSBlc3QgaW50cm91dmFibGUgZGFucyBsZSByZWdpc3RyZS4gVm91bGV6LXZvdXMgc3VwcHJpbWVyIGNlIG5vZXVkID8KLQotIyBHZXRTZXJ2aWNlcwotQUxUX0dFVF9TRVJWSUNFUz1FeHRyYWlyZSBkZXMgc2VydmljZXMKLU5PREVfTkFNRV9TSV9TRVJWSUNFUz1TZXJ2aWNlcyBwb3VyIGwnaW50ZXJmYWNlIGRlIHNlcnZpY2UgJTEKLU5PREVfTkFNRV9CVVNJTkVTU19TRVJWSUNFUz1TZXJ2aWNlcyBwb3VyIGxlIG1cdTAwZTl0aWVyICUxCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1NJX05PREU9TCdpbnRlcmZhY2UgZGUgc2VydmljZSBlc3QgaW50cm91dmFibGUgZGFucyBsZSByZWdpc3RyZS4gVm91bGV6LXZvdXMgc3VwcHJpbWVyIGNlIG5vZXVkID8KLU1TR19RVUVTVElPTl9SRU1PVkVfQlVTSU5FU1NfTk9ERT1MZSBtXHUwMGU5dGllciBlc3QgaW50cm91dmFibGUgZGFucyBsZSByZWdpc3RyZS4gVm91bGV6LXZvdXMgc3VwcHJpbWVyIGNlIG5vZXVkID8KLQotIyBSZWZyZXNoVURESU5vZGVzQWN0aW9uCi1NU0dfRVJST1JfTk9ERV9EQVRBX1ZBTElEQVRJT05fRkFJTEVEPUlXQUIwMjcyRSAlMSBlc3QgaW50cm91dmFibGUgZGFucyBsZSByZWdpc3RyZS4KLQotIyBTdW1tYXJpZXMKLUFMVF9TVU1NQVJZX1FVRVJJRVM9Ulx1MDBlOWNhcGl0dWxhdGlmIGRlcyByZXF1XHUwMGVhdGVzCi1BTFRfU1VNTUFSWV9CVVNJTkVTU0VTPVJcdTAwZTljYXBpdHVsYXRpZiBkZXMgbVx1MDBlOXRpZXJzCi1BTFRfU1VNTUFSWV9TRVJWSUNFUz1SXHUwMGU5Y2FwaXR1bGF0aWYgZGVzIHNlcnZpY2VzCi1BTFRfU1VNTUFSWV9TRVJWSUNFX0lOVEVSRkFDRVM9Ulx1MDBlOWNhcGl0dWxhdGlmIGRlcyBpbnRlcmZhY2VzIGRlIHNlcnZpY2UKLUZPUk1fTEFCRUxfUVVFUklFUz1SZXF1XHUwMGVhdGVzCi0KLSMgU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uCi1NU0dfUVVFU1RJT05fSVRFTV9WQUxJREFUSU9OX0ZBSUxFRD0lMSBlc3QgaW50cm91dmFibGUgZGFucyBsZSByZWdpc3RyZS4gVm91bGV6LXZvdXMgbGUgc3VwcHJpbWVyID8KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9TmF2aWdhdGV1ciAtIENvbnRlbmV1cgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9TmF2aWdhdGV1ciAtIEJhcnJlIGQnb3V0aWxzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1OYXZpZ2F0ZXVyIC0gQ29udGVudQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9Q29udGVuZXVyIGQnYWN0aW9ucwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9Q29udGVuZXVyIGRlIHByb3ByaVx1MDBlOXRcdTAwZTlzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9QmFycmUgZCdvdXRpbHMgZGVzIHByb3ByaVx1MDBlOXRcdTAwZTlzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9Q29udGVudSBkZXMgcHJvcHJpXHUwMGU5dFx1MDBlOXMKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9Q29udGVuZXVyIGRlIHN0YXR1dHMKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPUJhcnJlIGQnb3V0aWxzIGRlcyBzdGF0dXRzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZW51IGRlcyBzdGF0dXRzCi1GUkFNRV9USVRMRV9VRERJX1BFUlNQRUNUSVZFX0NPTlRFTlQ9Q29udGVudSBkZXMgcGFnZXMgVURESQotRlJBTUVfVElUTEVfQ0FURUdPUklFU19XT1JLQVJFQT1DYXRcdTAwZTlnb3JpZXMgLSBab25lIGRlIHRyYXZhaWwKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfVE9PTEJBUj1DYXRcdTAwZTlnb3JpZXMgLSBCYXJyZSBkJ291dGlscwotRlJBTUVfVElUTEVfQ0FURUdPUklFU19DT05URU5UPUNhdFx1MDBlOWdvcmllcyAtIENvbnRlbnUKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1CYXJyZSBkJ291dGlscyBkdSBuYXZpZ2F0ZXVyIFdTREwKLUZSQU1FX1RJVExFX1dTRExfQ09OVEVOVD1Db250ZW51IGR1IG5hdmlnYXRldXIgV1NETAotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX0JVU0lORVNTX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIG1cdTAwZTl0aWVyCi1GT1JNX1RJVExFX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRT1Gb3JtdWxhaXJlIFNlcnZpY2UgZGUgcHVibGljYXRpb24gZHUgbVx1MDBlOXRpZXIKLUZPUk1fVElUTEVfR0VUX0ZPUk09RWZmZWN0dWV6IHZvdHJlIHNcdTAwZTlsZWN0aW9uIGRhbnMgbGVzIG9iamV0cyByZWNoZXJjaFx1MDBlOXMgZXQgcHVibGlcdTAwZTlzCi1GT1JNX1RJVExFX0lURU1TX1NVTU1BUlk9Rm9ybXVsYWlyZSBSXHUwMGU5Y2FwaXR1bGF0aWYgZGVzIFx1MDBlOWxcdTAwZTltZW50cwotRk9STV9USVRMRV9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlM9Rm9ybXVsYWlyZSBHZXN0aW9uIGRlcyByZWxhdGlvbnMgY29tbWVyY2lhbGVzCi1GT1JNX1RJVExFX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTPUZvcm11bGFpcmUgR2VzdGlvbiBkZXMgc2VydmljZXMgclx1MDBlOWZcdTAwZTlyZW5jXHUwMGU5cwotRk9STV9USVRMRV9PUEVOX1JFR0lTVFJZPUZvcm11bGFpcmUgT3V2ZXJ0dXJlIGR1IHJlZ2lzdHJlCi1GT1JNX1RJVExFX1JFR0lTVFJZX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIHJlZ2lzdHJlCi1GT1JNX1RJVExFX1JFR0lTVFJZX1BVQkxJU0g9Rm9ybXVsYWlyZSBQdWJsaWNhdGlvbiBkdSByZWdpc3RyZQotRk9STV9USVRMRV9SRUdJU1RSWV9GSU5EPUZvcm11bGFpcmUgUmVjaGVyY2hlIGR1IHJlZ2lzdHJlCi1GT1JNX1RJVExFX1JFU1VMVFM9Rm9ybXVsYWlyZSBSXHUwMGU5c3VsdGF0cwotRk9STV9USVRMRV9TRVJWSUNFX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIHNlcnZpY2UKLUZPUk1fVElUTEVfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1Gb3JtdWxhaXJlIEluZm9ybWF0aW9ucyBzdXIgbCdpbnRlcmZhY2UgZGUgc2VydmljZQotRk9STV9USVRMRV9VTlBVQkxJU0g9Rm9ybXVsYWlyZSBBbm51bGF0aW9uIGRlIGxhIHB1YmxpY2F0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX2l0LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX2l0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzM5N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaV9pdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVVEREkKLQotIyBOb2RlcwotTk9ERV9OQU1FX1VERElfTUFJTj1VRERJIHByaW5jaXBhbGUKLU5PREVfTkFNRV9RVUVSSUVTX0ZPTERFUj1RdWVyeSBlc2VndWl0ZQotTk9ERV9OQU1FX1BVQkxJU0hFRF9CVVNJTkVTU0VTX0ZPTERFUj1CdXNpbmVzcyBwdWJibGljYXRpCi1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VTX0ZPTERFUj1TZXJ2aXppIHB1YmJsaWNhdGkKLU5PREVfTkFNRV9QVUJMSVNIRURfU0VSVklDRV9JTlRFUkZBQ0VTX0ZPTERFUj1JbnRlcmZhY2NlIGRpIHNlcnZpemlvIHB1YmJsaWNhdGUKLQotIyBPcGVuUmVnaXN0cnlBY3Rpb24KLUFMVF9PUEVOX1JFR0lTVFJZPUFwcmkgcmVnaXN0cm8KLUZPUk1fTEFCRUxfT1BFTl9SRUdJU1RSWV9ERVNDPVNwZWNpZmljYXJlIGlsIG5vbWUgZSBsJ1VSTCBkaSByaWNoaWVzdGEgZGVsIHJlZ2lzdHJvIGRhIGFwcmlyZS4gTGEgc2VsZXppb25lIGRpIHVuIHJlZ2lzdHJvIHByZWZlcml0byBjb25zZW50aXJcdTAwZTAgZGkgaW5zZXJpcmUgYXV0b21hdGljYW1lbnRlIGxlIGluZm9ybWF6aW9uaSByaWNoaWVzdGUuIFByZW1lcmUgPHN0cm9uZz5WYWk8L3N0cm9uZz4gcGVyIGFwcmlyZSBpbCByZWdpc3Ryby4KLUZPUk1fTEFCRUxfRkFWT1JJVEVfUkVHSVNUUlk9UmVnaXN0cm8gcHJlZmVyaXRvCi1GT1JNX0xBQkVMX1JFR0lTVFJZX05BTUU9Tm9tZSByZWdpc3RybwotRk9STV9MQUJFTF9JTlFVSVJZX1VSTD1VUkwgZGkgcmljaGllc3RhCi1GT1JNX0xBQkVMX0NIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPVJpY2VyY2EgY2F0ZWdvcmllIGRlZmluaXRlIGRhbGwndXRlbnRlCi1ERUZBVUxUX1JFR0lTVFJZX05BTUU9UmVnaXN0cm8gZGkgcHJvdmEgVURESSBJQk0KLU1TR19FUlJPUl9JTlZBTElEX1JFR0lTVFJZX05BTUU9SVdBQjAxMzZFIEltbWV0dGVyZSB1biBub21lIHJlZ2lzdHJvIHZhbGlkby4KLU1TR19FUlJPUl9JTlZBTElEX0lOUVVJUllfVVJMPUlXQUIwMTM4RSBJbW1ldHRlcmUgdW4gVVJMIGRpIHJpY2hpZXN0YSB2YWxpZG8uCi1NU0dfSU5GT19SRUdJU1RSWV9PUEVORUQ9SVdBQjAxMzlJIElsIHJlZ2lzdHJvIGRlbm9taW5hdG8gJTEgc2l0dWF0byBzdSAlMiBcdTAwZTggc3RhdG8gYXBlcnRvIGNvcnJldHRhbWVudGUuCi1GT1JNX0xBQkVMX0lTX1dFQlNQSEVSRV9VRERJX1JFR0lTVFJZPVNpIHRyYXR0YSBkZWwgcmVnaXN0cm8gVURESSBXZWJTcGhlcmU/Ci1ERUZBVUxUX1JFR0lTVFJZX05BTUVfV0VCU1BIRVJFPVJlZ2lzdHJvIFVEREkgcHJpdmF0byBJQk0gV2ViU3BoZXJlCi1GT1JNX0xBQkVMX1JFR0lTVFJZX0hPU1Q9SG9zdAotRk9STV9MQUJFTF9SRUdJU1RSWV9QT1JUPVBvcnRhCi0KLSMgVXNlci1kZWZpbmVkIENhdGVnb3JpZXMKLUZPUk1fTEFCRUxfQUREX0NBVEVHT1JZX0RBVEE9PGEgaHJlZj0iJTEiPkZhcmUgY2xpYyBxdWk8L2E+IHBlciBjYXJpY2FyZSBpIGRhdGkgZGkgcXVlc3RhIGNhdGVnb3JpYS4KLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9GSUxFPU5vbWUgZmlsZSBkYXRpIGNhdGVnb3JpYQotTVNHX0lORk9fTk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVNfRk9VTkQ9SVdBQjAzNzFJIE5vbiBcdTAwZTggc3RhdGEgcmlsZXZhdGEgYWxjdW5hIGNhdGVnb3JpYSBkZWZpbml0YSBkYWxsJ3V0ZW50ZS4KLU1TR19JTkZPX05PX0NBVEVHT1JZX0RBVEE9SVdBQjAzNzJJIEkgZGF0aSBkZWxsYSBjYXRlZ29yaWEgcGVyICUxIG5vbiBzb25vIGRpc3BvbmliaWxpIG8gbm9uIHNvbm8gdmFsaWRpLgotTVNHX0lORk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfTE9BREVEPUlXQUIwMzczSSBJIGRhdGkgcGVyIGxhIGNhdGVnb3JpYSAlMSBkZWZpbml0YSBkYWxsJ3V0ZW50ZSBzb25vIHN0YXRpIGNhcmljYXRpIGNvcnJldHRhbWVudGUuCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0tFWT1JV0FCMDM3NEUgRmlsZSBkaSBkYXRpIG5vbiB2YWxpZG8gcGVyIGxhIGNhdGVnb3JpYSAlMSBkZWZpbml0YSBkYWxsJ3V0ZW50ZS4gXHUwMGM4IHN0YXRhIHJpbGV2YXRhIHVuYSBjaGlhdmUgZGkgY2F0ZWdvcmlhICclMicgbWEgZXJhIHByZXZpc3RhICclMycuCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0ZPUk1BVD1JV0FCMDQ3M0UgRm9ybWF0byBzY29ub3NjaXV0byBhbGxhIHJpZ2E6ICUxIGRlbCBmaWxlIGRpIGRhdGkgcGVyIGxhIGNhdGVnb3JpYSAlMiBkZWZpbml0YSBkYWxsJ3V0ZW50ZS4gTGEgcmlnYSBcdTAwZTg6ICIlMyIKLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEU9SVdBQjAzNzVFIEZpbGUgZGkgZGF0aSBub24gdmFsaWRvIHBlciBsYSBjYXRlZ29yaWEgJTEgZGVmaW5pdGEgZGFsbCd1dGVudGUuCi1NU0dfRVJST1JfU0FWSU5HX0NBVEVHT1JZX0RBVEE9SVdBQjA0NzRFIFNpIFx1MDBlOCB2ZXJpZmljYXRvIHVuIGVycm9yZSBkdXJhbnRlIGlsIHNhbHZhdGFnZ2lvIGRlaSBkYXRpIHBlciBsYSBjYXRlZ29yaWEgJTEuIFRlc3RvIGVjY2V6aW9uZTogJTIKLQotIyBVRERJIENhdGVnb3J5IEJyb3dzZXIKLVRJVExFX0NBVEVHT1JZX0JST1dTRVI9QnJvd3NlciBjYXRlZ29yaWEKLUFMVF9DQVRFR09SSUVTPUNhdGVnb3JpZQotCi0jIERldGFpbHMKLUFMVF9SRUdJU1RSWV9ERVRBSUxTPURldHRhZ2xpIHJlZ2lzdHJvCi1BTFRfQlVTSU5FU1NfREVUQUlMUz1EZXR0YWdsaSBidXNpbmVzcwotQUxUX1NFUlZJQ0VfREVUQUlMUz1EZXR0YWdsaSBzZXJ2aXppbwotQUxUX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9RGV0dGFnbGkgaW50ZXJmYWNjaWEgZGkgc2Vydml6aW8KLUZPUk1fTEFCRUxfREVUQUlMU19FRElUQUJMRT1JIGRldHRhZ2xpIHBlciA8c3Ryb25nPiUxPC9zdHJvbmc+IHNvbm8gdmlzdWFsaXp6YXRpIGluIGJhc3NvLiBBbGN1bmkgZWxlbWVudGkgcG9zc29ubyBlc3NlcmUgYWdnaXVudGksIHJpbW9zc2kgbyBtb2RpZmljYXRpLiBQZXIgbGUgbW9kaWZpY2hlLCBwb3RyZWJiZSBlc3NlcmUgcmljaGllc3RhIGwnYXV0ZW50aWNhemlvbmUuIExlIGFsdHJlIGF6aW9uaSB2ZW5nb25vIHZpc3VhbGl6emF0ZSBuZWxsYSBwYXJ0ZSBpbmZlcmlvcmUgZGkgcXVlc3RhIHBhZ2luYS4KLQotIyBHZXQKLUFMVF9HRVQ9UmljaGlhbWEKLQotIyBDb21tb24gRm9ybSBDb250cm9sIFRpdGxlCi1GT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFPU5vbWUgdmFsb3JlCi1GT1JNX0NPTlRST0xfVElUTEVfREVTQ1JJUFRJT05fVEVYVF9WQUxVRT1WYWxvcmUgZGVzY3JpemlvbmUKLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfTkFNRT1Ob21lIGNoaWF2ZSBjYXRlZ29yaWEKLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfVkFMVUU9VmFsb3JlIGNoaWF2ZSBjYXRlZ29yaWEKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FPU5vbWUgY2hpYXZlIGlkZW50aWZpY2F0aXZvCi1GT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfVkFMVUU9VmFsb3JlIGNoaWF2ZSBpZGVudGlmaWNhdGl2bwotRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkw9VVJMIGRpIHJpbGV2YW1lbnRvCi0KLSMgRmluZCBhY3Rpb25zCi1BTFRfRklORD1Ucm92YQotQUxUX1NVQlFVRVJZPVRyb3ZhIHF1ZXJ5IHNlY29uZGFyaWEgJTEKLUZPUk1fTEFCRUxfUVVFUllfTkFNRT1Ob21lIGRpIHF1ZXN0YSBxdWVyeQotREVGQVVMVF9RVUVSWV9OQU1FPXJpc3VsdGF0aSBkZWxsYSBxdWVyeQotREVGQVVMVF9TVUJRVUVSWV9OQU1FPSUxIC0gJTIgcXVlcnkgc2Vjb25kYXJpYQotRk9STV9MQUJFTF9TRUFSQ0hfRk9SPUNlcmNhCi1GT1JNX09QVElPTl9CVVNJTkVTU0VTPUJ1c2luZXNzCi1GT1JNX09QVElPTl9TRVJWSUNFUz1TZXJ2aXppCi1GT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVM9SW50ZXJmYWNjZSBkaSBzZXJ2aXppbwotRk9STV9MQUJFTF9TRUFSQ0hfVFlQRT1UaXBvIGRpIHJpY2VyY2EKLUZPUk1fUkFESU9fU0lNUExFPVNlbXBsaWNlCi1GT1JNX1JBRElPX0FEVkFOQ0VEPUF2YW56YXRhCi1GT1JNX1JBRElPX1VVSUQ9VVVJRAotRk9STV9MQUJFTF9GSU5EX0JVU0lORVNTRVNfU0lNUExFX0RFU0M9SW1tZXR0ZXJlIGlsIG5vbWUgcGFyemlhbGUgbyBjb21wbGV0byBkaSB1biBidXNpbmVzcyBkYSByaWNlcmNhcmUuIElsIHNpbWJvbG8gJyUnIHB1XHUwMGYyIGVzc2VyZSB1dGlsaXp6YXRvIGNvbWUgdW4gY2FyYXR0ZXJlIGpvbGx5IGNoZSBjb3JyaXNwb25kZSBhIHF1YWxzaWFzaSBjYXJhdHRlcmUuIFByZW1lcmUgPHN0cm9uZz5WYWk8L3N0cm9uZz4gcGVyIGVzZWd1aXJlIGxhIHJpY2VyY2EuCi1GT1JNX0xBQkVMX0ZJTkRfQURWQU5DRURfREVTQz1JbW1ldHRlcmUgaSB2YWxvcmkgcGVyIHVubyBvIHBpXHUwMGY5IHBhcmFtZXRyaSBlbGVuY2F0aSBpbiBiYXNzby4gSWwgc2ltYm9sbyAnJScgcHVcdTAwZjIgZXNzZXJlIHV0aWxpenphdG8gY29tZSB1biBjYXJhdHRlcmUgam9sbHkgY2hlIGNvcnJpc3BvbmRlIGEgcXVhbHNpYXNpIGNhcmF0dGVyZSBkZWwgY2FtcG8gTm9tZSBvIGRlbGxhIHRhYmVsbGEgTm9taS4gUG90cmViYmUgZXNzZXJlIHJpY2hpZXN0YSBsJ2F1dGVudGljYXppb25lLiBQcmVtZXJlIDxzdHJvbmc+VmFpPC9zdHJvbmc+IHBlciBlc2VndWlyZSBsYSByaWNlcmNhLgotRk9STV9MQUJFTF9GSU5EX0JVU0lORVNTX1VVSURfREVTQz1JbW1ldHRlcmUgbCdVVUlEIGRlbCBidXNpbmVzcyBkYSByaWNlcmNhcmUuIFByZW1lcmUgPHN0cm9uZz5WYWk8L3N0cm9uZz4gcGVyIGVzZWd1aXJlIGxhIHJpY2VyY2EuCi1GT1JNX0xBQkVMX05BTUVTPU5vbWkKLUZPUk1fTElOS19BREQ9QWdnaXVuZ2kKLUZPUk1fTElOS19HRVQ9UmljaGlhbWEKLUZPUk1fTElOS19GSU5EPVRyb3ZhCi1GT1JNX0xJTktfUkVNT1ZFPVJpbXVvdmkKLUZPUk1fTEFCRUxfT1dORUQ9UHJvcHJpZXRhcmlvCi1GT1JNX0xBQkVMX1BVQkxJU0hfVVJMPVVSTCBkaSBwdWJibGljYXppb25lCi1GT1JNX0xBQkVMX1VTRVJJRD1JRCB1dGVudGUKLUZPUk1fTEFCRUxfUEFTU1dPUkQ9UGFzc3dvcmQKLUZPUk1fTEFCRUxfTEFOR1VBR0U9TGluZ3VhCi1GT1JNX0xBQkVMX05BTUU9Tm9tZQotRk9STV9MQUJFTF9ERVNDUklQVElPTj1EZXNjcml6aW9uZQotRk9STV9PUFRJT05fTEFOR1VBR0VfRU49SW5nbGVzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQUE9QWZhcgotRk9STV9PUFRJT05fTEFOR1VBR0VfQUI9QWJraGF6aWFuCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BRj1BZnJpa2FhbnMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FNPUFtYXJpY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FSPUFyYWJvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BUz1Bc3NhbWVzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQVk9QXltYXJhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BWj1BemVyYmFpamFuaQotRk9STV9PUFRJT05fTEFOR1VBR0VfQkE9QmFzaGtpcgotRk9STV9PUFRJT05fTEFOR1VBR0VfQkU9QmllbG9ydXNzbwotRk9STV9PUFRJT05fTEFOR1VBR0VfQkc9QnVsZ2FybwotRk9STV9PUFRJT05fTEFOR1VBR0VfQkg9QmloYXJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CST1CaXNsYW1hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CTj1CZW5nYWxpOyBCYW5nbGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JPPVRpYmV0YW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CUj1CcmV0b25lCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DQT1DYXRhbGFubwotRk9STV9PUFRJT05fTEFOR1VBR0VfQ089Q29yc2ljYQotRk9STV9PUFRJT05fTEFOR1VBR0VfQ1o9Q2VjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfQ1k9R2FsbGVzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfREE9RGFuZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ERT1UZWRlc2NvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9EWj1CaHV0YW5pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTD1HcmVjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfRU89RXNwZXJhbnRvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FUz1TcGFnbm9sbwotRk9STV9PUFRJT05fTEFOR1VBR0VfRVQ9RXN0b25lCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FVT1CYXNjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfRkE9UGVyc2lhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZJPUZpbmxhbmRlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZKPUZpamkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZPPUZhZXJvZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GUj1GcmFuY2VzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfRlk9RnJpc29uZQotRk9STV9PUFRJT05fTEFOR1VBR0VfR0E9SXJsYW5kZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HRD1TY296emVzZSBnYWVsaWNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HTD1HYWxpemlhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dOPUd1YXJhbmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dVPUd1amFyYXRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IQT1IYXVzYQotRk9STV9PUFRJT05fTEFOR1VBR0VfSEk9SGluZGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hSPUNyb2F0bwotRk9STV9PUFRJT05fTEFOR1VBR0VfSFU9VW5naGVyZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IWT1Bcm1lbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lBPUludGVybGluZ3VhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JRT1JbnRlcmxpbmd1ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSUs9SW51cGlhawotRk9STV9PUFRJT05fTEFOR1VBR0VfSU49SW5kb25lc2lhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lTPUlzbGFuZGVzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSVQ9SXRhbGlhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lXPUVicmVvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KQT1HaWFwcG9uZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KST1ZaWRkaXNoCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KVz1HaWF2YW5lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tBPUdlb3JnaWFubwotRk9STV9PUFRJT05fTEFOR1VBR0VfS0s9S2F6YWtvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTD1Hcm9lbmxhbmRlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tNPUNhbWJvZ2lhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tOPUthbm5hZGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tPPUNvcmVhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tTPUthc2htaXJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LVT1DdXJkbwotRk9STV9PUFRJT05fTEFOR1VBR0VfS1k9S2lyZ2hpegotRk9STV9PUFRJT05fTEFOR1VBR0VfTEE9TGF0aW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MTj1MaW5nYWxhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MTz1MYW90aWFubwotRk9STV9PUFRJT05fTEFOR1VBR0VfTFQ9TGl0dWFubwotRk9STV9PUFRJT05fTEFOR1VBR0VfTFY9TGV0dG9uZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTUc9TWFsYWdhc3kKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01JPU1hb3JpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NSz1NYWNlZG9uZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTUw9TWFsYXlhbGFtCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTj1Nb25nb2xvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTz1Nb2xkYXZvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NUj1NYXJhdGhpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NUz1NYWxlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01UPU1hbHRlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01ZPUJ1cm1lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05BPU5hdXJ1Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9ORT1OZXBhbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05MPU9sYW5kZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9OTz1Ob3J2ZWdlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09DPU9jY2l0YW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9PTT0oQWZhbikgT3JvbW8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09SPU9yaXlhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QQT1QdW5qYWJpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QTD1Qb2xhY2NvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QUz1QYXNodG8sIFB1c2h0bwotRk9STV9PUFRJT05fTEFOR1VBR0VfUFQ9UG9ydG9naGVzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfUVU9UXVlY2h1YQotRk9STV9PUFRJT05fTEFOR1VBR0VfUk09UmhhZXRvLVJvbWFuY2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JOPUtpcnVuZGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JPPVJ1bWVubwotRk9STV9PUFRJT05fTEFOR1VBR0VfUlU9UnVzc28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JXPUtpbnlhcndhbmRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TQT1TYW5zY3JpdG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NEPVNpbmRoaQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0c9U2FuZ3JvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TSD1TZXJiby1Dcm9hdG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NJPVNpbmdhbGVzZQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0s9U2xvdmFjY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NMPVNsb3Zlbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NNPVNhbW9hbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NOPVNob25hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTz1Tb21hbG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NRPUFsYmFuZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUj1TZXJibwotRk9STV9PUFRJT05fTEFOR1VBR0VfU1M9U2lzd2F0aQotRk9STV9PUFRJT05fTEFOR1VBR0VfU1Q9U2Vzb3RobwotRk9STV9PUFRJT05fTEFOR1VBR0VfU1U9U3VuZGFuZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVj1TdmVkZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVz1Td2FoaWxpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UQT1UYW1pbAotRk9STV9PUFRJT05fTEFOR1VBR0VfVEU9VGVndWx1Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9URz1UYWppawotRk9STV9PUFRJT05fTEFOR1VBR0VfVEg9VGhhaQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEk9VGlncmlueWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RLPVR1cmttZW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTD1UYWdhbG9nCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTj1TZXRzd2FuYQotRk9STV9PUFRJT05fTEFOR1VBR0VfVE89VG9uZ2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RSPVR1cmNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UUz1Uc29uZ2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RUPVRhdGFyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVz1Ud2kKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VLPVVjcmFpbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VSPVVyZHUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VaPVV6YmVrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9WST1WaWV0bmFtaXRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9WTz1Wb2xhcHVrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9XTz1Xb2xvZgotRk9STV9PUFRJT05fTEFOR1VBR0VfWEg9WGhvc2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1lPPVlvcnViYQotRk9STV9PUFRJT05fTEFOR1VBR0VfWkg9Q2luZXNlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aVT1adWx1Ci1GT1JNX0xBQkVMX0VYQUNUX05BTUVfTUFUQ0g9Q29ycmlzcG9uZGVuemEgZXNhdHRhCi1GT1JNX0xBQkVMX0NBU0VfU0VOU0lUSVZFX01BVENIPVNlbnNpYmlsZSBhbCBtYWl1c2NvbG8vbWludXNjb2xvCi1GT1JNX0xBQkVMX1NPVU5ERVg9U3VvbmEgY29tZQotRk9STV9MQUJFTF9JREVOVElGSUVSUz1JZGVudGlmaWNhdGl2aQotRk9STV9MQUJFTF9JREVOVElGSUVSX1RZUEU9VGlwbwotCi0jIERvIG5vdCB0cmFuc2xhdGUgdGhlIHR3byBpdGVtcyBiZWxvdy4KLUZPUk1fT1BUSU9OX0lERU5USUZJRVJfRFVOUz1ELVUtTi1TCi1GT1JNX09QVElPTl9JREVOVElGSUVSX1RIT01BU19SRUdJU1RSWT1SZWdpc3RybyBUaG9tYXMKLQotRk9STV9MQUJFTF9LRVlfTkFNRT1Ob21lIGNoaWF2ZQotRk9STV9MQUJFTF9LRVlfVkFMVUU9VmFsb3JlIGNoaWF2ZQotRk9STV9MQUJFTF9DQVRFR09SSUVTPUNhdGVnb3JpZQotRk9STV9MQUJFTF9DQVRFR09SWV9UWVBFPVRpcG8KLUZPUk1fT1BUSU9OX0NBVEVHT1JZX05BSUNTPU5BSUNTCi1GT1JNX09QVElPTl9DQVRFR09SWV9VTlNQU0NfNzM9VU5TUFNDIDcuMwotRk9STV9PUFRJT05fQ0FURUdPUllfR0VPPUdFTwotRk9STV9PUFRJT05fQ0FURUdPUllfRFdDT01NVU5JVFk9Q29tdW5pdFx1MDBlMCBkVwotRk9STV9MQUJFTF9CVVNJTkVTU19DQVRFR09SSUVTPUNvbmZyb250YSBjb246Ci1GT1JNX09QVElPTl9CVVNJTkVTU0VTX09OTFk9U29sbyBidXNpbmVzcwotRk9STV9PUFRJT05fU0VSVklDRVNfT05MWT1Tb2xvIHNlcnZpemkKLUZPUk1fT1BUSU9OX0JPVEg9QnVzaW5lc3MgZSBzZXJ2aXppCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTFM9VVJMIGRpIHJpbGV2YW1lbnRvCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTD1VUkwgZGkgcmlsZXZhbWVudG8KLUZPUk1fTEFCRUxfRklORFFVQUxJRklFUlM9VHJvdmEgcXVhbGlmaWNhdG9yaQotRk9STV9MQUJFTF9DT01CSU5FX0tFWVM9VW5pc2NpIGNoaWF2aToKLUZPUk1fT1BUSU9OX0FOREFMTEtFWVM9QW5kCi1GT1JNX09QVElPTl9PUkFMTEtFWVM9T3IKLUZPUk1fT1BUSU9OX09STElLRUtFWVM9T3IgTGlrZQotRk9STV9MQUJFTF9TT1JUX0JZX05BTUU9T3JkaW5hIHBlciBub21lOgotRk9STV9SQURJT19TT1JUX0FTQz1Bc2NlbmRlbnRlCi1GT1JNX1JBRElPX1NPUlRfREVTQz1EaXNjZW5kZW50ZQotRk9STV9MQUJFTF9TT1JUX0JZX0RBVEU9T3JkaW5hIHBlciBkYXRhOgotRk9STV9MQUJFTF9NQVhfU0VBUkNIX1NFVD1EaW1lbnNpb25lIG1hc3NpbWEgZGVsbCdpbnNpZW1lIGRpIHJpY2VyY2E6Ci1GT1JNX0xBQkVMX01BWF9SRVNVTFRTPU51bWVybyBtYXNzaW1vIGRpIHJpc3VsdGF0aToKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFU19TSU1QTEVfREVTQz1JbW1ldHRlcmUgaWwgbm9tZSBwYXJ6aWFsZSBvIGNvbXBsZXRvIGRpIHVuIHNlcnZpY2UgZGEgcmljZXJjYXJlLiBJbCBzaW1ib2xvICclJyBwdVx1MDBmMiBlc3NlcmUgdXRpbGl6emF0byBjb21lIHVuIGNhcmF0dGVyZSBqb2xseSBjaGUgY29ycmlzcG9uZGUgYSBxdWFsc2lhc2kgY2FyYXR0ZXJlLiBQcmVtZXJlIDxzdHJvbmc+VmFpPC9zdHJvbmc+IHBlciBlc2VndWlyZSBsYSByaWNlcmNhLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfVVVJRF9ERVNDPUltbWV0dGVyZSBsJ1VVSUQgZGVsIHNlcnZpemlvIGRhIHJpY2VyY2FyZS4gUHJlbWVyZSA8c3Ryb25nPlZhaTwvc3Ryb25nPiBwZXIgZXNlZ3VpcmUgbGEgcmljZXJjYS4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRVNfU0lNUExFX0RFU0M9SW1tZXR0ZXJlIGlsIG5vbWUgcGFyemlhbGUgbyBjb21wbGV0byBkaSB1bidpbnRlcmZhY2NpYSBkaSBzZXJ2aXppbyBkYSByaWNlcmNhcmUuIElsIHNpbWJvbG8gJyUnIHB1XHUwMGYyIGVzc2VyZSB1dGlsaXp6YXRvIGNvbWUgdW4gY2FyYXR0ZXJlIGpvbGx5IGNoZSBjb3JyaXNwb25kZSBhIHF1YWxzaWFzaSBjYXJhdHRlcmUuIFByZW1lcmUgPHN0cm9uZz5WYWk8L3N0cm9uZz4gcGVyIGVzZWd1aXJlIGxhIHJpY2VyY2EuCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRV9JTlRFUkZBQ0VfVVVJRF9ERVNDPUltbWV0dGVyZSBsJ1VVSUQgZGVsbCdpbnRlcmZhY2NpYSBkaSBzZXJ2aXppbyBkYSByaWNlcmNhcmUuIFByZW1lcmUgPHN0cm9uZz5WYWk8L3N0cm9uZz4gcGVyIGVzZWd1aXJlIGxhIHJpY2VyY2EuCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFUz1JbnRlcmZhY2NlIGRpIHNlcnZpemlvCi1GT1JNX0xBQkVMX1VVSURfS0VZPUNoaWF2ZSBVVUlEOgotRk9STV9MQUJFTF9VU0VfU0VSVklDRT1VdGlsaXp6YSBzZXJ2aXppbwotRk9STV9MQUJFTF9TRVJWSUNFPVNlcnZpemlvCi1GT1JNX0xBQkVMX0JVU0lORVNTPUJ1c2luZXNzCi1GT1JNX0xBQkVMX1BVQkxJU0hfQVNTRVJUSU9OUz1SZWxhemlvbmkgY29tbWVyY2lhbGkKLUZPUk1fTEFCRUxfRElSRUNUSU9OPURpcmV6aW9uZQotRk9STV9MQUJFTF9GUk9NX0tFWT1EYSBjaGlhdmUKLUZPUk1fTEFCRUxfVE9fS0VZPUEgY2hpYXZlCi1GT1JNX0xBQkVMX1NUQVRVUz1TdGF0bwotRk9STV9MQUJFTF9BU1NFUlRJT05fVFlQRT1UaXBvIGRpIHJlbGF6aW9uZQotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEFSRU5UX0NISUxEPVByaW5jaXBhbGUtU2Vjb25kYXJpbwotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEVFUl9UT19QRUVSPVBlZXItUGVlcgotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfSURFTlRJVFk9SWRlbnRpdFx1MDBlMAotRk9STV9MQUJFTF9BU1NFUlRJT05fRElSRVRJT05fREVTQz1MYSBkaXJlemlvbmUgPHN0cm9uZz5EYTwvc3Ryb25nPiBjcmVhIHVuYSByZWxhemlvbmUgY29tbWVyY2lhbGUgZGEgcXVlc3RvIGJ1c2luZXNzIGFpIGJ1c2luZXNzIHN1cGVyaW9yaS4gIExhIGRpcmV6aW9uZSA8c3Ryb25nPkE8L3N0cm9uZz4gY3JlYSB1bmEgcmVsYXppb25lIGNvbW1lcmNpYWxlIGRhaSBidXNpbmVzcyBzdXBlcmlvcmkgYSBxdWVzdG8gYnVzaW5lc3MuCi1GT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX0ZST009LS0tPgotRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9UTz08LS0tCi1GT1JNX0xBQkVMX1RISVNfQlVTSU5FU1M9UXVlc3RvCi1NU0dfRVJST1JfSU5WQUxJRF9RVUVSWV9OQU1FPUlXQUIwMTQwRSBJbW1ldHRlcmUgdW4gbm9tZSB2YWxpZG8gcGVyIGxhIHF1ZXJ5LgotTVNHX0VSUk9SX0lOVkFMSURfTkFNRVM9SVdBQjAxNDFFIEltbWV0dGVyZSB1bmEgc2VyaWUgZGkgbm9taSB2YWxpZGkuCi1NU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTD1JV0FCMDE0MkUgSW1tZXR0ZXJlIHVuIFVSTCBkaSBwdWJibGljYXppb25lIHZhbGlkby4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJJRD1JV0FCMDE0M0UgSW1tZXR0ZXJlIHVuIElEIHV0ZW50ZSB2YWxpZG8uCi1NU0dfRVJST1JfSU5WQUxJRF9NQVhfU0VBUkNIX1NFVD1JV0FCMDE0NUUgSW1tZXR0ZXJlIHVuYSBkaW1lbnNpb25lIHZhbGlkYSBwZXIgbCdpbnNpZW1lIGRpIHJpY2VyY2EgbWFzc2ltby4KLU1TR19FUlJPUl9JTlZBTElEX01BWF9SRVNVTFRTPUlXQUIwMTQ2RSBJbW1ldHRlcmUgdW5hIGRpbWVuc2lvbmUgdmFsaWRhIHBlciBpbCBudW1lcm8gbWFzc2ltbyBkaSByaXN1bHRhdGkuCi1NU0dfSU5GT19CVVNJTkVTU0VTX0ZPVU5EPUlXQUIwMTQ3SSBOdW1lcm8gZGkgYnVzaW5lc3MgcmlsZXZhdGk6ICUxCi1NU0dfRVJST1JfTk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0OEUgTmVzc3VuIGJ1c2luZXNzIHJpbGV2YXRvLgotTVNHX0lORk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNDlJIE51bWVybyBkaSBzZXJ2aXppIHJpbGV2YXRpOiAlMQotTVNHX0VSUk9SX05PX1NFUlZJQ0VTX0ZPVU5EPUlXQUIwMTUwRSBOZXNzdW4gc2Vydml6aW8gcmlsZXZhdG8uCi1NU0dfRVJST1JfU0lOR0xFX0lURU09SVdBQjAxNTFFIFNlbGV6aW9uYXJlIHNvbG8gdW4gZWxlbWVudG8uCi1NU0dfUVVFU1RJT05fSVRFTV9SRVBMQUNFTUVOVD1sYSBzZWxlemlvbmUgc29zdGl0dWlyXHUwMGUwIHVuIGVsZW1lbnRvIGdpXHUwMGUwIHByZXNlbnRlIG5lbGxhIGRlc3RpbmF6aW9uZS4gQ29udGludWFyZT8KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORD1JV0FCMDE1MkkgTnVtZXJvIGRpIGludGVyZmFjY2UgZGkgc2Vydml6aW8gcmlsZXZhdGU6ICUxCi1NU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUzRSBOZXNzdW5hIGludGVyZmFjY2lhIGRpIHNlcnZpemlvIHJpbGV2YXRhLgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAxNTRFIFNlbGV6aW9uYXJlIGFsbWVubyB1biBlbGVtZW50by4KLU1TR19FUlJPUl9JTlZBTElEX1VVSURfS0VZPUlXQUIwMTU1RSBJbW1ldHRlcmUgdW5hIGNoaWF2ZSBVVUlEIHZhbGlkYS4KLU1TR19FUlJPUl9RVUVSWV9OQU1FX0NPTkZMSUNUPUlXQUIwMTU2RSBJbCBub21lIHF1ZXJ5IGRlbGxhIHF1ZXJ5IHNlY29uZGFyaWEgbm9uIHB1XHUwMGYyIGVzc2VyZSB1Z3VhbGUgYWwgbm9tZSBkZWwgY3JlYXRvcmUuCi1NU0dfRVJST1JfTk9fSVRFTVNfVE9fR0VUPUlXQUIwMTU3RSBOZXNzdW4gZWxlbWVudG8gZGVsIHRpcG8gc3BlY2lmaWNhdG8gXHUwMGU4IHN0YXRvIHB1YmJsaWNhdG8gbyByaWxldmF0by4KLQotIyBSZXN1bHRzCi1BTFRfUVVFUllfUkVTVUxUUz1SaXN1bHRhdGkgZGVsbGEgcXVlcnkKLUZPUk1fTEFCRUxfU1VCUVVFUlk9SSByaXN1bHRhdGkgcG9zc29ubyBlc3NlcmUgdXRpbGl6emF0aSBjb21lIGlucHV0IGRpIHVuJ2FsdHJhIG9wZXJhemlvbmUuIEZhcmUgY2xpYyBzdWwgY29sbGVnYW1lbnRvIDxzdHJvbmc+ZGVzdGluYXppb25lPC9zdHJvbmc+IGluIGFsdG8gcGVyIHZpc3VhbGl6emFyZSBsJ29wZXJhemlvbmUuIEkgcmlzdWx0YXRpIHNlbGV6aW9uYXRpIHBvc3Nvbm8gZXNzZXJlIHV0aWxpenphdGkgbmVsbCdvcGVyYXppb25lIGZhY2VuZG8gY2xpYyBzdWwgcHVsc2FudGUgPHN0cm9uZz5UcmFzZmVyaXNjaTwvc3Ryb25nPi4KLUZPUk1fTEFCRUxfUVVFUlk9U2VsZXppb25hcmUgdW4gcmlzdWx0YXRvIHBlciB2aXN1YWxpenphcmUgdWx0ZXJpb3JpIGRldHRhZ2xpIG8gc2VsZXppb25hcmUgdW4gaW5zaWVtZSBkaSByaXN1bHRhdGkgZSBmYXJlIGNsaWMgc3UgdW4gcHVsc2FudGUgcGVyIGVzZWd1aXJlIHVuJ29wZXJhemlvbmUuCi1GT1JNX0xJTktfVEFSR0VUPWRlc3RpbmF6aW9uZQotRk9STV9CVVRUT05fVFJBTlNGRVI9VHJhc2ZlcmlzY2kKLUZPUk1fQlVUVE9OX1JFRlJFU0g9QWdnaW9ybmEKLUZPUk1fQlVUVE9OX0FERF9UT19GQVZPUklURVM9QWdnaXVuZ2kgYSBwcmVmZXJpdGkKLUZPUk1fQlVUVE9OX1VOUFVCTElTSD1Bbm51bGxhIHB1YmJsaWNhemlvbmUKLUZPUk1fQlVUVE9OX0NMRUFSPUNhbmNlbGxhCi0KLSMgUHVibGlzaCBhY3Rpb25zCi1BTFRfUFVCTElTSD1QdWJibGljYQotRk9STV9MQUJFTF9QVUJMSVNIPVB1YmJsaWNhOgotRk9STV9PUFRJT05fQlVTSU5FU1M9QnVzaW5lc3MKLUZPUk1fT1BUSU9OX1NFUlZJQ0U9U2Vydml6aW8KLUZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFPUludGVyZmFjY2lhIGRpIHNlcnZpemlvCi1GT1JNX0xBQkVMX1BVQkxJU0hfQlVTSU5FU1NfU0lNUExFX0RFU0M9SW1tZXR0ZXJlIHVuIG5vbWUgZSB1bmEgZGVzY3JpemlvbmUgZmFjb2x0YXRpdmEgcGVyIGlsIGJ1c2luZXNzIGRhIHB1YmJsaWNhcmUuIFBvdHJlYmJlIGVzc2VyZSByaWNoaWVzdGEgbCdhdXRlbnRpY2F6aW9uZS4KLUZPUk1fTEFCRUxfUFVCTElTSF9CVVNJTkVTU19BRFZBTkNFRF9ERVNDPUZvcm5pcmUgdW4gbm9tZSBwZXIgaWwgYnVzaW5lc3MgZGEgcHViYmxpY2FyZS4gXHUwMGM4IHBvc3NpYmlsZSBzcGVjaWZpY2FyZSBhbmNoZSBhbHRyaSBwYXJhbWV0cmkuIFBvdHJlYmJlIGVzc2VyZSByaWNoaWVzdGEgbCdhdXRlbnRpY2F6aW9uZS4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX1NJTVBMRV9ERVNDPVJpY2hpYW1hcmUgbyBpbmRpdmlkdWFyZSB1biBidXNpbmVzcywgcXVpbmRpIGZvcm5pcmUgIGwnVVJMIFdTREwsIGlsIG5vbWUgZSB1bmEgZGVzY3JpemlvbmUgZmFjb2x0YXRpdmEgcGVyIGlsIHNlcnZpemlvIGRhIHB1YmJsaWNhcmUuIFBvdHJlYmJlIGVzc2VyZSByaWNoaWVzdGEgbCdhdXRlbnRpY2F6aW9uZS4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0M9UmljaGlhbWFyZSBvIGluZGl2aWR1YXJlIHVuIGJ1c2luZXNzLCBxdWluZGkgZm9ybmlyZSBsJ1VSTCBXU0RMIGUgdW4gbm9tZSBwZXIgaWwgc2Vydml6aW8gZGEgcHViYmxpY2FyZS4gXHUwMGM4IHBvc3NpYmlsZSBzcGVjaWZpY2FyZSBhbmNoZSBhbHRyaSBwYXJhbWV0cmkuIFBvdHJlYmJlIGVzc2VyZSByaWNoaWVzdGEgbCdhdXRlbnRpY2F6aW9uZS4KLUZPUk1fTEFCRUxfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFX1NJTVBMRV9ERVNDPUZvcm5pcmUgbCdVUkwgV1NETCwgaWwgbm9tZSBlIHVuYSBkZXNjcml6aW9uZSBmYWNvbHRhdGl2YSBwZXIgaWwgc2Vydml6aW8gZGEgcHViYmxpY2FyZS4gUG90cmViYmUgZXNzZXJlIHJpY2hpZXN0YSBsJ2F1dGVudGljYXppb25lLgotRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQz1Gb3JuaXJlIGwnVVJMIFdTREwgZSB1biBub21lICBwZXIgaWwgc2Vydml6aW8gZGEgcHViYmxpY2FyZS4gXHUwMGM4IHBvc3NpYmlsZSBzcGVjaWZpY2FyZSBhbmNoZSBhbHRyaSBwYXJhbWV0cmkuIFBvdHJlYmJlIGVzc2VyZSByaWNoaWVzdGEgbCdhdXRlbnRpY2F6aW9uZS4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9TSU1QTEVfREVTQz1JbW1ldHRlcmUgdW4gVVJMIFdTREwsIGlsIG5vbWUgZSB1bmEgZGVzY3JpemlvbmUgZmFjb2x0YXRpdmEgcGVyIGwnaW50ZXJmYWNjaWEgZGkgc2Vydml6aW8gZGEgcHViYmxpY2FyZS4gUG90cmViYmUgZXNzZXJlIHJpY2hpZXN0YSBsJ2F1dGVudGljYXppb25lLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFX0FEVkFOQ0VEX0RFU0M9Rm9ybmlyZSBsJ1VSTCBXU0RMIGUgdW4gbm9tZSBwZXIgbCdpbnRlcmZhY2NpYSBkaSBzZXJ2aXppbyBkYSBwdWJibGljYXJlLiBcdTAwYzggcG9zc2liaWxlIHNwZWNpZmljYXJlIGFuY2hlIGFsdHJpIHBhcmFtZXRyaS4gUG90cmViYmUgZXNzZXJlIHJpY2hpZXN0YSBsJ2F1dGVudGljYXppb25lLgotRk9STV9MQUJFTF9QVUJMSVNIX0ZPUk09Rm9ybWF0byBwdWJibGljYXppb25lCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPURlc2NyaXppb25lCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OUz1EZXNjcml6aW9uaQotTVNHX0lORk9fQlVTSU5FU1NfUFVCTElTSEVEPUlXQUIwMTU4SSBJbCBidXNpbmVzcyAlMSBcdTAwZTggc3RhdG8gcHViYmxpY2F0byBjb3JyZXR0YW1lbnRlLgotTVNHX0lORk9fU0VSVklDRV9QVUJMSVNIRUQ9SVdBQjAxNTlJIElsIHNlcnZpemlvICUxIFx1MDBlOCBzdGF0byBwdWJibGljYXRvIGNvcnJldHRhbWVudGUuCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9QVUJMSVNIRUQ9SVdBQjAxNjBJIEwnaW50ZXJmYWNjaWEgZGkgc2Vydml6aW8gJTEgbm9uIFx1MDBlOCBzdGF0YSBwdWJibGljYXRhIGNvcnJldHRhbWVudGUuCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FPUlXQUIwMTYxRSBJbW1ldHRlcmUgdW4gbm9tZSB2YWxpZG8uCi1NU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFPUlXQUIwMjUwRSBTZWxlemlvbmFyZSB1bmEgbGluZ3VhIG5vbiB2dW90YSBwZXIgJTEgYWxsYSByaWdhICUyLiBTb2xvIG5lbGxhIHByaW1hIHJpZ2EgcHVcdTAwZjIgZXNzZXJjaSB1bmEgbGluZ3VhIHZ1b3RhLgotTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0U9SVdBQjAyNTFFIE1vZGlmaWNhcmUgbGEgbGluZ3VhIHBlciAlMSBhbGxhIHJpZ2EgJTIuIExhIGxpbmd1YSBjb3JyZW50ZSBcdTAwZTggZ2lcdTAwZTAgaW4gdXNvLgotTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQ9SVdBQjAyNTJFIEltbWV0dGVyZSB1biAlMSB2YWxpZG8gYWxsYSByaWdhICUyCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTD1JV0FCMDI1M0UgSW1tZXR0ZXJlIHVuIFVSTCBXU0RMIHZhbGlkby4KLU1TR19FUlJPUl9OT19OQU1FUz1JV0FCMDI1NEUgQWdnaXVuZ2VyZSBhbG1lbm8gdW4gbm9tZS4KLU1TR19FUlJPUl9JTlZBTElEX1NFUlZJQ0U9SVdBQjAyNTVFIEZvcm5pcmUgdW4gc2Vydml6aW8gdmFsaWRvLgotTVNHX0VSUk9SX0lOVkFMSURfQlVTSU5FU1M9SVdBQjAyNTZFIEZvcm5pcmUgdW4gYnVzaW5lc3MgdmFsaWRvLgotCi0jIEJ1c2luZXNzIFB1Ymxpc2ggU2VydmljZSBhY3Rpb24KLUFMVF9QVUJMSVNIX1NFUlZJQ0U9UHViYmxpY2Egc2Vydml6aW8KLQotIyBXU0RMIEJyb3dzZXIKLVRJVExFX1dTRExfQlJPV1NFUj1Ccm93c2VyIFdTREwgLSAlMQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRT1TZWxlemlvbmFyZSB1bidvcmlnaW5lIFdTREw6Ci1GT1JNX0xBQkVMX1dTRExfU09VUkNFX1dFQlBST0pFQ1RTPVByb2dldHRpIFdlYgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9UHJlZmVyaXRpCi1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVByb2dldHRvIFdlYgotRk9STV9MQUJFTF9XU0RMX1VSTD1VUkwgV1NETAotQUxUX1dTRExfQlJPV1NFUj1Ccm93c2VyIFdTREwKLQotIyBEZXRhaWxzCi1GT1JNX0xJTktfRURJVD1Nb2RpZmljYQotRk9STV9MSU5LX0NBTkNFTD1Bbm51bGxhCi1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1DaGlhdmUgYnVzaW5lc3MKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9Q2hpYXZlIHNlcnZpemlvCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX0tFWT1DaGlhdmUgVE1vZGVsCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPUNhdGVnb3JpZSBkZWZpbml0ZSBkYWxsJ3V0ZW50ZQotRk9STV9MQUJFTF9DSEVDS0VEPVNlbGV6aW9uYXRvCi1GT1JNX0xBQkVMX0ZJTEU9RmlsZQotTVNHX1FVRVNUSU9OX1BVQkxJU0hfSVRFTT1cdTAwYzggcG9zc2liaWxlIGNoZSBsJ2VsZW1lbnRvIG5vbiBzaWEgc3RhdG8gdHJvdmF0byBuZWwgcmVnaXN0cm8uIFB1YmJsaWNhcmxvPwotTVNHX1FVRVNUSU9OX1NFUlZJQ0VfUFVCTElTSF9CVVNJTkVTUz1cdTAwYzggcG9zc2liaWxlIGNoZSBpbCBzZXJ2aXppbyBvIGlsIHJlbGF0aXZvIGJ1c2luZXNzIG5vbiBzaWEgc3RhdG8gdHJvdmF0byBuZWwgcmVnaXN0cm8uIFB1YmJsaWNhcmxvPwotTVNHX0lORk9fQlVTSU5FU1NfVVBEQVRFRD1JV0FCMDI1N0kgSWwgYnVzaW5lc3MgJTEgXHUwMGU4IHN0YXRvIGFnZ2lvcm5hdG8gY29ycmV0dGFtZW50ZS4KLU1TR19JTkZPX1NFUlZJQ0VfVVBEQVRFRD1JV0FCMDI1OEkgSWwgc2Vydml6aW8gJTEgXHUwMGU4IHN0YXRvIGFnZ2lvcm5hdG8gY29ycmV0dGFtZW50ZS4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VQREFURUQ9SVdBQjAyNTlJIEwnaW50ZXJmYWNjaWEgZGkgc2Vydml6aW8gJTEgXHUwMGU4IHN0YXRhIGFnZ2lvcm5hdGEgY29ycmV0dGFtZW50ZS4KLU1TR19JTkZPX1JFR0lTVFJZX1VQREFURUQ9SVdBQjAzMjNJIElsIHJlZ2lzdHJvICUxIFx1MDBlOCBzdGF0byBhZ2dpb3JuYXRvIGNvcnJldHRhbWVudGUuCi0KLSMgVW5wdWJsaXNoQWN0aW9uCi1BTFRfVU5QVUJMSVNIX0JVU0lORVNTPUFubnVsbGEgcHViYmxpY2F6aW9uZSBidXNpbmVzcwotQUxUX1VOUFVCTElTSF9TRVJWSUNFPUFubnVsbGEgcHViYmxpY2F6aW9uZSBzZXJ2aXppbwotQUxUX1VOUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRT1Bbm51bGxhIHB1YmJsaWNhemlvbmUgaW50ZXJmYWNjaWEgZGkgc2Vydml6aW8KLUZPUk1fTEFCRUxfVU5QVUJMSVNIX0RFU0M9UHJlbWVyZSA8c3Ryb25nPlZhaTwvc3Ryb25nPiBwZXIgYW5udWxsYXJlIGxhIHB1YmJsaWNhemlvbmUgZGkgcXVlc3RvIG9nZ2V0dG8uIFBvdHJlYmJlIGVzc2VyZSByaWNoaWVzdGEgbCdhdXRlbnRpY2F6aW9uZS4KLU1TR19JTkZPX0JVU0lORVNTX1VOUFVCTElTSEVEPUlXQUIwMjYwSSBMYSBwdWJibGljYXppb25lIGRlbCBidXNpbmVzcyAlMSBcdTAwZTggc3RhdGEgYW5udWxsYXRhIGNvcnJldHRhbWVudGUuCi1NU0dfSU5GT19TRVJWSUNFX1VOUFVCTElTSEVEPUlXQUIwMjYxSSBMYSBwdWJibGljYXppb25lIGRlbCBzZXJ2aXppbyAlMSBcdTAwZTggc3RhdGEgYW5udWxsYXRhIGNvcnJldHRhbWVudGUuCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9VTlBVQkxJU0hFRD1JV0FCMDI2MkkgTGEgcHViYmxpY2F6aW9uZSBkZWxsJ2ludGVyZmFjY2lhIGRpIHNlcnZpemlvICUxIFx1MDBlOCBzdGF0YSBhbm51bGxhdGEgY29ycmV0dGFtZW50ZS4KLQotIyBBZGQgdG8gV1NETCBQZXJzcGVjdGl2ZQotQUxUX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFPUFnZ2l1bmdpIGFsbGEgcGFnaW5hIFdTREwKLU1TR19JTkZPX1dTRExfQURERURfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3NkkgJTEgXHUwMGU4IHN0YXRvIGFnZ2l1bnRvIGNvcnJldHRhbWVudGUgYWxsYSBwYWdpbmEgV1NETC4KLU1TR19FUlJPUl9XU0RMX05PVF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzc3RSAlMSBub24gXHUwMGU4IHN0YXRvIGFnZ2l1bnRvIGFsbGEgcGFnaW5hIFdTREwuCi0KLSMgQWRkIHRvIEZhdm9yaXRlcwotQUxUX0FERF9UT19GQVZPUklURVM9QWdnaXVuZ2kgYWxsYSBwYWdpbmEgUHJlZmVyaXRpCi1NU0dfSU5GT19GQVZPUklURV9BRERFRD1JV0FCMDI2M0kgJTEgXHUwMGU4IHN0YXRvIGFnZ2l1bnRvIGFpIHByZWZlcml0aS4KLU1TR19FUlJPUl9GQVZPUklURV9OT1RfQURERUQ9SVdBQjAyNjRFICUxIG5vbiBcdTAwZTggc3RhdG8gYWdnaXVudG8gYWkgcHJlZmVyaXRpLgotTVNHX0VSUk9SX0ZBVk9SSVRFX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzI0RSAlMSBlc2lzdGUgZ2lcdTAwZTAgbmVpIHByZWZlcml0aS4KLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPUkgcHJlZmVyaXRpIGVzaXN0b25vIGdpXHUwMGUwLiAgU292cmFzY3JpdmVybGk/Ci0KLSMgUmVmcmVzaAotTVNHX0lORk9fTk9ERV9SRUZSRVNIRUQ9SVdBQjAyNjVJICUxIGFnZ2lvcm5hdG8uCi1NU0dfUVVFU1RJT05fUkVNT1ZFX05PREU9XHUwMGM4IHBvc3NpYmlsZSBjaGUgJTEgbm9uIHNpYSBzdGF0byB0cm92YXRvIG5lbCByZWdpc3Ryby4gQ2FuY2VsbGFybG8/Ci0KLSMgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzCi1BTFRfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVM9R2VzdGlzY2kgc2Vydml6aSBkaSByaWZlcmltZW50bwotRk9STV9MQUJFTF9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19ERVNDPUFnZ2l1bmdlcmUgaSBzZXJ2aXppIHJpbGV2YXRpIG8gcHViYmxpY2F0aSBhbGwnZWxlbmNvIGRlaSBzZXJ2aXppIGRpIHJpZmVyaW1lbnRvIGZhY2VuZG8gY2xpYyBzdWwgcHVsc2FudGUgPHN0cm9uZz5BZ2dpdW5naSBzZXJ2aXppPC9zdHJvbmc+LiBSaW11b3ZlcmUgaSByaWZlcmltZW50aSBzZWxlemlvbmF0aSBmYWNlbmRvIGNsaWMgc3VsIHB1bHNhbnRlIDxzdHJvbmc+UmltdW92aSByaWZlcmltZW50aTwvc3Ryb25nPi4gUGVyIGxlIG1vZGlmaWNoZSwgcG90cmViYmUgZXNzZXJlIHJpY2hpZXN0YSBsJ2F1dGVudGljYXppb25lLgotRk9STV9MQUJFTF9SRUZFUkVOQ0VEX1NFUlZJQ0VTPVNlcnZpemkgZGkgcmlmZXJpbWVudG8KLUZPUk1fQlVUVE9OX0FERF9TRVJWSUNFUz1BZ2dpdW5naSBzZXJ2aXppCi1GT1JNX0JVVFRPTl9SRU1PVkVfUkVGRVJFTkNFUz1SaW11b3ZpIHJpZmVyaW1lbnRpCi1NU0dfRVJST1JfTk9fUkVGRVJFTkNFX1NFTEVDVEVEPUlXQUIwMjY2RSBQcmltYSBkaSBwcm9jZWRlcmUsIHNlbGV6aW9uYXJlIGFsbWVubyB1biBzZXJ2aXppbyBkaSByaWZlcmltZW50by4KLU1TR19FUlJPUl9OT19TRVJWSUNFUz1JV0FCMDI2N0UgUHJpbWEgZGkgY29udGludWFyZSwgcmljaGlhbWFyZSBvIGluZGl2aWR1YXJlIGFsbWVubyB1biBzZXJ2aXppby4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9SRUZFUkVOQ0VEPUlXQUIwMjY4RSBOb24gXHUwMGU4IHN0YXRvIHBvc3NpYmlsZSB1dGlsaXp6YXJlIGlsIHNlcnZpemlvICUxIGNvbWUgcmlmZXJpbWVudG8uCi1NU0dfRVJST1JfUkVGRVJFTkNFX05PVF9SRU1PVkVEPUlXQUIwMjY5RSBOb24gXHUwMGU4IHN0YXRvIHBvc3NpYmlsZSByaW11b3ZlcmUgaWwgcmlmZXJpbWVudG8gZGVsIHNlcnZpemlvICUxLgotTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VEPUlXQUIwMjcwSSBcdTAwYzggc3RhdG8gZWZmZXR0dWF0byB1biByaWZlcmltZW50byBjb3JyZXR0byBhbCBzZXJ2aXppbyAlMS4KLU1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFX1JFTU9WRUQ9SVdBQjAyNzFJIElsIHJpZmVyaW1lbnRvIGFsIHNlcnZpemlvICUxIFx1MDBlOCBzdGF0byByaW1vc3NvIGNvcnJldHRhbWVudGUuCi0KLSMgTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9ucwotQUxUX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1HZXN0aXNjaSByZWxhemlvbmkgY29tbWVyY2lhbGkKLUZPUk1fTEFCRUxfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TX0RFU0M9QWdnaXVuZ2VyZSBpIGJ1c2luZXNzIHJpbGV2YXRpIG8gcHViYmxpY2F0aSBhbGwnZWxlbmNvIGRlbGxlIHJlbGF6aW9uaSBjb21tZXJjaWFsaSBmYWNlbmRvIGNsaWMgc3UgPHN0cm9uZz5BZ2dpdW5naSByZWxhemlvbmk8L3N0cm9uZz4uIFJpbXVvdmVyZSBsZSByZWxhemlvbmkgc2VsZXppb25hdGUgZmFjZW5kbyBjbGljIHN1bCBwdWxzYW50ZSA8c3Ryb25nPlJpbXVvdmkgcmVsYXppb25pPC9zdHJvbmc+LiBDb21wbGV0YXJlIGxlIHJlbGF6aW9uaSBzZWxlemlvbmF0ZSBmYWNlbmRvIGNsaWMgc3UgPHN0cm9uZz5Db21wbGV0YSByZWxhemlvbmk8L3N0cm9uZz4uIEZhcmUgY2xpYyBzdSA8c3Ryb25nPkFnZ2lvcm5hIHJlbGF6aW9uaTwvc3Ryb25nPiBwZXIgYWdnaW9ybmFyZSBsJ2VsZW5jbyBkaSByZWxhemlvbmkuCi1GT1JNX0xBQkVMX0lOQ09NUExFVEVfQVNTRVJUSU9OU19WSVNJQklMSVRZX0RFU0M9UmVsYXppb25pIGNvbW1lcmNpYWxpIGluY29tcGxldGUgc29ubyB2aXNpYmlsaSBzb2xvIGFsIHByb3ByaWV0YXJpbyBkZWwgYnVzaW5lc3MuCi1GT1JNX0xBQkVMX0JVU0lORVNTRVM9QnVzaW5lc3MKLUZPUk1fQlVUVE9OX1NIT1dfQUxMX1BVQkxJU0hFUl9BU1NFUlRJT05TPUFnZ2lvcm5hIHJlbGF6aW9uaQotRk9STV9CVVRUT05fQ09NUExFVEVfUFVCTElTSEVSX0FTU0VSVElPTlM9Q29tcGxldGEgcmVsYXppb25pCi1GT1JNX0JVVFRPTl9BRERfUFVCTElTSEVSX0FTU0VSVElPTlM9QWdnaXVuZ2kgcmVsYXppb25pCi1GT1JNX0JVVFRPTl9SRU1PVkVfUFVCTElTSEVSX0FTU0VSVElPTlM9UmltdW92aSByZWxhemlvbmkKLU1TR19JTkZPX1BVQkxJU0hFUl9BU1NFUlRJT05TX1JFRlJFU0hFRD1JV0FCMDMyNUkgTGUgcmVsYXppb25pIGNvbW1lcmNpYWxpIHZlbmdvbm8gYWdnaW9ybmF0ZS4KLU1TR19FUlJPUl9OT19JTkNPTVBMRVRFX0FTU0VSVElPTl9TRUxFQ1RFRD1JV0FCMDMyNkUgU2VsZXppb25hcmUgYWxtZW5vIHVuYSByZWxhemlvbmUgY29tbWVyY2lhbGUgY29tcGxldGEuCi1NU0dfRVJST1JfTk9UX09XTkVEX0JVU0lORVNTPUlXQUIwMzI3RSBRdWVzdGEgb3BlcmF6aW9uZSBub24gcHVcdTAwZjIgZXNzZXJlIGVzZWd1aXRhIHN1IHVuIGJ1c2luZXNzIGRpIHByb3ByaWV0XHUwMGUwIGRpIHVuIGFsdHJvIGZvcm5pdG9yZS4KLQotIyBHZXRCdXNpbmVzc2VzCi1BTFRfR0VUX0JVU0lORVNTPVJpY2hpYW1hIGJ1c2luZXNzCi1BTFRfR0VUX0JVU0lORVNTRVM9UmljaGlhbWEgYnVzaW5lc3MKLU5PREVfTkFNRV9TRVJWSUNFX0JVU0lORVNTPUJ1c2luZXNzIHBlciBpbCBzZXJ2aXppbyAlMQotTk9ERV9OQU1FX1NJX0JVU0lORVNTRVM9QnVzaW5lc3MgcGVyIGwnaW50ZXJmYWNjaWEgZGkgc2Vydml6aW8gJTEKLU1TR19RVUVTVElPTl9SRU1PVkVfU0VSVklDRV9OT0RFPVx1MDBjOCBwb3NzaWJpbGUgY2hlIGlsIHNlcnZpemlvIG5vbiBzaWEgc3RhdG8gdHJvdmF0byBuZWwgcmVnaXN0cm8uIFJpbXVvdmVyZSBxdWVzdG8gbm9kbz8KLQotIyBHZXRTZXJ2aWNlSW50ZXJmYWNlcwotQUxUX0dFVF9TRVJWSUNFX0lOVEVSRkFDRVM9UmljaGlhbWEgaW50ZXJmYWNjZSBkaSBzZXJ2aXppbwotTk9ERV9OQU1FX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTPUludGVyZmFjY2UgZGkgc2Vydml6aW8gcGVyIGlsIHNlcnZpemlvICUxCi1NU0dfUVVFU1RJT05fR0VUX1NJX1JFTU9WRV9TRVJWSUNFX05PREU9XHUwMGM4IHBvc3NpYmlsZSBjaGUgaWwgc2Vydml6aW8gbm9uIHNpYSBzdGF0byB0cm92YXRvIG5lbCByZWdpc3Ryby4gUmltdW92ZXJlIHF1ZXN0byBub2RvPwotCi0jIEdldFNlcnZpY2VzCi1BTFRfR0VUX1NFUlZJQ0VTPVJpY2hpYW1hIHNlcnZpemkKLU5PREVfTkFNRV9TSV9TRVJWSUNFUz1TZXJ2aXppIHBlciBsJ2ludGVyZmFjY2lhIGRpIHNlcnZpemlvICUxCi1OT0RFX05BTUVfQlVTSU5FU1NfU0VSVklDRVM9U2Vydml6aSBwZXIgaWwgYnVzaW5lc3MgJTEKLU1TR19RVUVTVElPTl9SRU1PVkVfU0lfTk9ERT1cdTAwYzggcG9zc2liaWxlIGNoZSBsJ2ludGVyZmFjY2lhIGRpIHNlcnZpemlvIG5vbiBzaWEgc3RhdGEgdHJvdmF0YSBuZWwgcmVnaXN0cm8uIFJpbXVvdmVyZSBxdWVzdG8gbm9kbz8KLU1TR19RVUVTVElPTl9SRU1PVkVfQlVTSU5FU1NfTk9ERT1cdTAwYzggcG9zc2liaWxlIGNoZSBpbCBidXNpbmVzcyBub24gc2lhIHN0YXRvIHRyb3ZhdG8gbmVsIHJlZ2lzdHJvLiBSaW11b3ZlcmUgcXVlc3RvIG5vZG8/Ci0KLSMgUmVmcmVzaFVERElOb2Rlc0FjdGlvbgotTVNHX0VSUk9SX05PREVfREFUQV9WQUxJREFUSU9OX0ZBSUxFRD1JV0FCMDI3MkUgXHUwMGM4IHBvc3NpYmlsZSBjaGUgJTEgbm9uIHNpYSBzdGF0byB0cm92YXRvIG5lbCByZWdpc3Ryby4KLQotIyBTdW1tYXJpZXMKLUFMVF9TVU1NQVJZX1FVRVJJRVM9UmllcGlsb2dvIGRlbGxlIHF1ZXJ5Ci1BTFRfU1VNTUFSWV9CVVNJTkVTU0VTPVJpZXBpbG9nbyBkZWkgYnVzaW5lc3MKLUFMVF9TVU1NQVJZX1NFUlZJQ0VTPVJpZXBpbG9nbyBkZWkgc2Vydml6aQotQUxUX1NVTU1BUllfU0VSVklDRV9JTlRFUkZBQ0VTPVJpZXBpbG9nbyBkZWxsZSBpbnRlcmZhY2NlIGRpIHNlcnZpemlvCi1GT1JNX0xBQkVMX1FVRVJJRVM9UXVlcnkKLQotIyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24KLU1TR19RVUVTVElPTl9JVEVNX1ZBTElEQVRJT05fRkFJTEVEPVx1MDBjOCBwb3NzaWJpbGUgY2hlICUxIG5vbiBzaWEgc3RhdG8gdHJvdmF0byBuZWwgcmVnaXN0cm8uIFJpbXVvdmVybG8/Ci0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPUNvbnRlbml0b3JlIFNlbGV6aW9uZQotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIFNlbGV6aW9uZQotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9Q29udGVudXRvIFNlbGV6aW9uZQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9Q29udGVuaXRvcmUgYXppb25pCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Db250ZW5pdG9yZSBwcm9wcmlldFx1MDBlMAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPUJhcnJhIGRlZ2xpIHN0cnVtZW50aSBwcm9wcmlldFx1MDBlMAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPUNvbnRlbnV0byBwcm9wcmlldFx1MDBlMAotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1Db250ZW5pdG9yZSBzdGF0bwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIHN0YXRvCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZW51dG8gc3RhdG8KLUZSQU1FX1RJVExFX1VERElfUEVSU1BFQ1RJVkVfQ09OVEVOVD1Db250ZW51dG8gcGFnaW5hIFVEREkKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfV09SS0FSRUE9QXJlYSBkaSBsYXZvcm8gY2F0ZWdvcmllCi1GUkFNRV9USVRMRV9DQVRFR09SSUVTX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIGNhdGVnb3JpZQotRlJBTUVfVElUTEVfQ0FURUdPUklFU19DT05URU5UPUNvbnRlbnV0byBjYXRlZ29yaWUKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1CYXJyYSBkZWdsaSBzdHJ1bWVudGkgZGVsIGJyb3dzZXIgV1NETAotRlJBTUVfVElUTEVfV1NETF9DT05URU5UPUNvbnRlbnV0byBkZWwgYnJvd3NlciBXU0RMCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfQlVTSU5FU1NfREVUQUlMUz1Nb2R1bG8gZGV0dGFnbGkgYnVzaW5lc3MKLUZPUk1fVElUTEVfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFPU1vZHVsbyBzZXJ2aXppbyBkaSBwdWJibGljYXppb25lIGJ1c2luZXNzCi1GT1JNX1RJVExFX0dFVF9GT1JNPVNlbGV6aW9uYXJlIGRhbCBtb2R1bG8gZGVnbGkgb2dnZXR0aSByaWxldmF0aSBlIHB1YmJsaWNhdGkKLUZPUk1fVElUTEVfSVRFTVNfU1VNTUFSWT1SaWVwaWxvZ28gZGVsIG1vZHVsbyBkZWdsaSBlbGVtZW50aQotRk9STV9USVRMRV9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlM9R2VzdGlzY2kgbW9kdWxvIHJlbGF6aW9uaSBjb21tZXJjaWFsaQotRk9STV9USVRMRV9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFUz1HZXN0aXNjaSBtb2R1bG8gc2Vydml6aSBkaSByaWZlcmltZW50bwotRk9STV9USVRMRV9PUEVOX1JFR0lTVFJZPUFwcmkgbW9kdWxvIGRpIHJlZ2lzdHJvCi1GT1JNX1RJVExFX1JFR0lTVFJZX0RFVEFJTFM9TW9kdWxvIGRldHRhZ2xpIHJlZ2lzdHJvCi1GT1JNX1RJVExFX1JFR0lTVFJZX1BVQkxJU0g9TW9kdWxvIHB1YmJsaWNhemlvbmUgcmVnaXN0cm8KLUZPUk1fVElUTEVfUkVHSVNUUllfRklORD1Nb2R1bG8gZGkgcmljZXJjYSByZWdpc3RybwotRk9STV9USVRMRV9SRVNVTFRTPU1vZHVsbyByaXN1bHRhdGkKLUZPUk1fVElUTEVfU0VSVklDRV9ERVRBSUxTPU1vZHVsbyBkZXR0YWdsaSBzZXJ2aXppbwotRk9STV9USVRMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPU1vZHVsbyBkZXR0YWdsaSBpbnRlcmZhY2NpYSBkaSBzZXJ2aXppbwotRk9STV9USVRMRV9VTlBVQkxJU0g9QW5udWxsYSBwdWJibGljYXppb25lIG1vZHVsbwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaV9qYS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaV9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU3MDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGlfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1VRERJCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9VRERJX01BSU49VURESSBcdTMwZTFcdTMwYTRcdTMwZjMKLU5PREVfTkFNRV9RVUVSSUVTX0ZPTERFUj1cdTViOWZcdTg4NGNcdTZlMDhcdTMwN2ZcdTcxNjdcdTRmMWEKLU5PREVfTkFNRV9QVUJMSVNIRURfQlVTSU5FU1NFU19GT0xERVI9XHU1MTZjXHU5NThiXHU2ZTA4XHUzMDdmXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5Ci1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VTX0ZPTERFUj1cdTUxNmNcdTk1OGJcdTZlMDhcdTMwN2ZcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKLU5PREVfTkFNRV9QVUJMSVNIRURfU0VSVklDRV9JTlRFUkZBQ0VTX0ZPTERFUj1cdTUxNmNcdTk1OGJcdTZlMDhcdTMwN2ZcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjkKLQotIyBPcGVuUmVnaXN0cnlBY3Rpb24KLUFMVF9PUEVOX1JFR0lTVFJZPVx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA5Mlx1OTU4Ylx1MzA0ZgotRk9STV9MQUJFTF9PUEVOX1JFR0lTVFJZX0RFU0M9XHU5NThiXHUzMDRmXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDZlXHU1NDBkXHU1MjRkXHUzMDRhXHUzMDg4XHUzMDczXHU3MTY3XHU0ZjFhIFVSTCBcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU5XHUzMDhiXHUzMDY4XHUzMDAxXHU1ZmM1XHU4OTgxXHUzMDZhXHU2MGM1XHU1ODMxXHUzMDRjXHU4MWVhXHU1MmQ1XHU3Njg0XHUzMDZiXHU1MTY1XHU1MjliXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyIFx1MzAwYzxzdHJvbmc+XHU1YjlmXHU4ODRjPC9zdHJvbmc+XHUzMDBkXHUzMDkyXHU2MmJjXHUzMDU3XHUzMDY2XHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDkyXHU5NThiXHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1JFR0lTVFJZPVx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZVx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmYwotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPVx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1NTQwZAotRk9STV9MQUJFTF9JTlFVSVJZX1VSTD1cdTcxNjdcdTRmMWEgVVJMCi1GT1JNX0xBQkVMX0NIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPVx1MzBlNlx1MzBmY1x1MzBiNlx1MzBmY1x1NWI5YVx1N2ZhOVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBjMVx1MzBhN1x1MzBjM1x1MzBhZgotREVGQVVMVF9SRUdJU1RSWV9OQU1FPUlCTSBVRERJIFx1MzBjNlx1MzBiOVx1MzBjOFx1MzBmYlx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmYwotTVNHX0VSUk9SX0lOVkFMSURfUkVHSVNUUllfTkFNRT1JV0FCMDEzNkUgXHU2NzA5XHU1MmI5XHUzMDZhXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHU1NDBkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9JTlFVSVJZX1VSTD1JV0FCMDEzOEUgXHU2NzA5XHU1MmI5XHUzMDZhXHU3MTY3XHU0ZjFhIFVSTCBcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLU1TR19JTkZPX1JFR0lTVFJZX09QRU5FRD1JV0FCMDEzOUkgJTIgXHUzMDZiXHUzMDQyXHUzMDhiICUxIFx1MzA2OFx1MzA0NFx1MzA0Nlx1NTQwZFx1NTI0ZFx1MzA2ZVx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotRk9STV9MQUJFTF9JU19XRUJTUEhFUkVfVURESV9SRUdJU1RSWT1XZWJTcGhlcmUgXHUzMDZmIFVEREkgXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDY3XHUzMDU5XHUzMDRiPwotREVGQVVMVF9SRUdJU1RSWV9OQU1FX1dFQlNQSEVSRT1JQk0gV2ViU3BoZXJlIFx1MzBkN1x1MzBlOVx1MzBhNFx1MzBkOVx1MzBmY1x1MzBjOCBVRERJIFx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmYwotRk9STV9MQUJFTF9SRUdJU1RSWV9IT1NUPVx1MzBkYlx1MzBiOVx1MzBjOAotRk9STV9MQUJFTF9SRUdJU1RSWV9QT1JUPVx1MzBkZFx1MzBmY1x1MzBjODoKLQotIyBVc2VyLWRlZmluZWQgQ2F0ZWdvcmllcwotRk9STV9MQUJFTF9BRERfQ0FURUdPUllfREFUQT08YSBocmVmPSIlMSI+XHUzMDUzXHUzMDUzXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2PC9hPlx1MzA1M1x1MzA2ZVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzA2ZVx1MzBjN1x1MzBmY1x1MzBiZlx1MzA5Mlx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0ZJTEU9XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHU1NDBkCi1NU0dfSU5GT19OT19VU0VSX0RFRklORURfQ0FURUdPUklFU19GT1VORD1JV0FCMDM3MUkgXHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjXHU1YjlhXHU3ZmE5XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMDRjXHU2OTFjXHU1MWZhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfSU5GT19OT19DQVRFR09SWV9EQVRBPUlXQUIwMzcySSAlMSBcdTMwNmVcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYzdcdTMwZmNcdTMwYmZcdTMwNGNcdTRmN2ZcdTc1MjhcdTUzZWZcdTgwZmRcdTMwNjdcdTMwNmFcdTMwNDRcdTMwNGJcdTMwMDFcdTMwN2VcdTMwNWZcdTMwNmZcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDIKLU1TR19JTkZPX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0xPQURFRD1JV0FCMDM3M0kgXHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjXHU1YjlhXHU3ZmE5XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjICUxIFx1MzA2ZVx1MzBjN1x1MzBmY1x1MzBiZlx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1MzBlZFx1MzBmY1x1MzBjOVx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRV9LRVk9SVdBQjAzNzRFIFx1MzBlNlx1MzBmY1x1MzBiNlx1MzBmY1x1NWI5YVx1N2ZhOVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYyAlMSBcdTMwNmVcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNGNcdTcxMjFcdTUyYjlcdTMwNjdcdTMwNTlcdTMwMDIgXHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjXHUzMGZiXHUzMGFkXHUzMGZjICclMicgXHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDRjXHUzMDAxJyUzJyBcdTMwNGNcdTRlODhcdTYwZjNcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfRk9STUFUPUlXQUIwNDczRSBcdTg4NGNcdTMwNmJcdTRlMGRcdTY2MGVcdTMwNmFcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZGVcdTMwYzNcdTMwYzhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTk6IFx1MzBlNlx1MzBmY1x1MzBiNlx1MzBmY1x1NWI5YVx1N2ZhOVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYyAlMiBcdTMwNmVcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWJcdTMwNmUgJTFcdTMwMDIgXHU4ODRjOiAiJTMiCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFPUlXQUIwMzc1RSBcdTMwZTZcdTMwZmNcdTMwYjZcdTMwZmNcdTViOWFcdTdmYTlcdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmMgJTEgXHUzMDZlXHUzMGM3XHUzMGZjXHUzMGJmXHUzMGZiXHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViXHUzMDRjXHU3MTIxXHU1MmI5XHUzMDY3XHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfU0FWSU5HX0NBVEVHT1JZX0RBVEE9SVdBQjA0NzRFIFx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYyAlMSBcdTMwNmVcdTMwYzdcdTMwZmNcdTMwYmZcdTMwOTJcdTRmZGRcdTdiYTFcdTRlMmRcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgXHU0ZjhiXHU1OTE2XHUzMGM2XHUzMGFkXHUzMGI5XHUzMGM4OiAlMgotCi0jIFVEREkgQ2F0ZWdvcnkgQnJvd3NlcgotVElUTEVfQ0FURUdPUllfQlJPV1NFUj1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwZmJcdTMwZDZcdTMwZTlcdTMwYTZcdTMwYjZcdTMwZmMKLUFMVF9DQVRFR09SSUVTPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYwotCi0jIERldGFpbHMKLUFMVF9SRUdJU1RSWV9ERVRBSUxTPVx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1OGE3M1x1N2QzMAotQUxUX0JVU0lORVNTX0RFVEFJTFM9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHU4YTczXHU3ZDMwCi1BTFRfU0VSVklDRV9ERVRBSUxTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1OGE3M1x1N2QzMAotQUxUX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHU4YTczXHU3ZDMwCi1GT1JNX0xBQkVMX0RFVEFJTFNfRURJVEFCTEU9PHN0cm9uZz4lMTwvc3Ryb25nPiBcdTMwNmVcdThhNzNcdTdkMzBcdTMwNmZcdTRlZTVcdTRlMGJcdTMwNmVcdTMwNjhcdTMwNGFcdTMwOGFcdTMwNjdcdTMwNTlcdTMwMDIgXHU0ZTAwXHU5MGU4XHUzMDZlXHU5ODA1XHU3NmVlXHUzMDkyXHU4ZmZkXHU1MmEwXHUzMDAxXHU5NjY0XHU1M2JiXHUzMDAxXHUzMDdlXHUzMDVmXHUzMDZmXHU1OTA5XHU2NmY0XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyIFx1NTkwOVx1NjZmNFx1MzA2Ylx1MzA2Zlx1OGE4ZFx1OGEzY1x1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2YVx1NTgzNFx1NTQwOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwNWRcdTMwNmVcdTRlZDZcdTMwNmVcdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmZcdTMwMDFcdTMwNTNcdTMwNmVcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmVcdTRlMGJcdTMwNmJcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIKLQotIyBHZXQKLUFMVF9HRVQ9XHU1M2Q2XHU1Zjk3Ci0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZQotRk9STV9DT05UUk9MX1RJVExFX05BTUVfVEVYVF9WQUxVRT1cdTU0MGRcdTUyNGRcdTUwMjQKLUZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFPVx1OGExOFx1OGZmMFx1NTAyNAotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmY1x1MzBmYlx1MzBhZFx1MzBmY1x1NTQwZAotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRT1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYWRcdTMwZmNcdTUwMjQKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FPUlEIFx1MzBhZFx1MzBmY1x1NTQwZAotRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX1ZBTFVFPUlEIFx1MzBhZFx1MzBmY1x1NTAyNAotRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkw9XHUzMGM3XHUzMGEzXHUzMGI5XHUzMGFiXHUzMGQwXHUzMGVhXHUzMGZjIFVSTAotCi0jIEZpbmQgYWN0aW9ucwotQUxUX0ZJTkQ9XHU2OTFjXHU3ZDIyCi1BTFRfU1VCUVVFUlk9JTEgXHU1MjZmXHU3MTY3XHU0ZjFhXHUzMDZlXHU2OTFjXHU3ZDIyCi1GT1JNX0xBQkVMX1FVRVJZX05BTUU9XHUzMDUzXHUzMDZlXHU3MTY3XHU0ZjFhXHUzMDZlXHU1NDBkXHU1MjRkCi1ERUZBVUxUX1FVRVJZX05BTUU9XHU3MTY3XHU0ZjFhXHU3ZDUwXHU2NzljCi1ERUZBVUxUX1NVQlFVRVJZX05BTUU9JTEgLSAlMiBcdTUyNmZcdTcxNjdcdTRmMWEKLUZPUk1fTEFCRUxfU0VBUkNIX0ZPUj1cdTY5MWNcdTdkMjIKLUZPUk1fT1BUSU9OX0JVU0lORVNTRVM9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5Ci1GT1JNX09QVElPTl9TRVJWSUNFUz1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKLUZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUz1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjkKLUZPUk1fTEFCRUxfU0VBUkNIX1RZUEU9XHU2OTFjXHU3ZDIyXHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3Ci1GT1JNX1JBRElPX1NJTVBMRT1cdTMwYjdcdTMwZjNcdTMwZDdcdTMwZWIKLUZPUk1fUkFESU9fQURWQU5DRUQ9XHU2MmUxXHU1ZjM1Ci1GT1JNX1JBRElPX1VVSUQ9VVVJRAotRk9STV9MQUJFTF9GSU5EX0JVU0lORVNTRVNfU0lNUExFX0RFU0M9XHU2OTFjXHU3ZDIyXHUzMDU5XHUzMDhiXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDZlXHU0ZTAwXHU5MGU4XHUzMDdlXHUzMDVmXHUzMDZmXHU1MTY4XHU5MGU4XHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1NGVmYlx1NjEwZlx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA2OFx1NGUwMFx1ODFmNFx1MzA1OVx1MzA4Ylx1MzBlZlx1MzBhNFx1MzBlYlx1MzBjOVx1MzBhYlx1MzBmY1x1MzBjOVx1MzA2OFx1MzA1N1x1MzA2NiAnJScgXHU4YTE4XHU1M2Y3XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyIFx1MzAwYzxzdHJvbmc+XHU1YjlmXHU4ODRjPC9zdHJvbmc+XHUzMDBkXHUzMDkyXHU2MmJjXHUzMDU3XHUzMDY2XHU2OTFjXHU3ZDIyXHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyCi1GT1JNX0xBQkVMX0ZJTkRfQURWQU5DRURfREVTQz1cdTRlZTVcdTRlMGJcdTMwNmJcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNTVcdTMwOGNcdTMwNWZcdTMwZDFcdTMwZTlcdTMwZTFcdTMwZmNcdTMwYmZcdTMwZmNcdTMwNmVcdTUwMjRcdTMwOTIgMSBcdTMwNjRcdTRlZTVcdTRlMGFcdTUxNjVcdTUyOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHU1NDBkXHU1MjRkXHUzMGM2XHUzMGZjXHUzMGQ2XHUzMGViXHUzMDZlXHU1NDBkXHU1MjRkXHUzMGQ1XHUzMGEzXHUzMGZjXHUzMGViXHUzMGM5XHU1MTg1XHUzMDZiXHUzMDQyXHUzMDhiXHU0ZWZiXHU2MTBmXHUzMDZlXHU2NTg3XHU1YjU3XHUzMDY4XHU0ZTAwXHU4MWY0XHUzMDU5XHUzMDhiXHUzMGVmXHUzMGE0XHUzMGViXHUzMGM5XHUzMGFiXHUzMGZjXHUzMGM5XHUzMDY4XHUzMDU3XHUzMDY2ICclJyBcdThhMThcdTUzZjdcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDIgXHU4YThkXHU4YTNjXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDZhXHU1ODM0XHU1NDA4XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyIFx1MzAwYzxzdHJvbmc+XHU1YjlmXHU4ODRjPC9zdHJvbmc+XHUzMDBkXHUzMDkyXHU2MmJjXHUzMDU3XHUzMDY2XHU2OTFjXHU3ZDIyXHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyCi1GT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NfVVVJRF9ERVNDPVx1NjkxY1x1N2QyMlx1MzA1OVx1MzA4Ylx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA2ZSBVVUlEIFx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGM8c3Ryb25nPlx1NWI5Zlx1ODg0Yzwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1NjJiY1x1MzA1N1x1MzA2Nlx1NjkxY1x1N2QyMlx1MzA5Mlx1NWI5Zlx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotRk9STV9MQUJFTF9OQU1FUz1cdTU0MGRcdTUyNGQKLUZPUk1fTElOS19BREQ9XHU4ZmZkXHU1MmEwCi1GT1JNX0xJTktfR0VUPVx1NTNkNlx1NWY5NwotRk9STV9MSU5LX0ZJTkQ9XHU2OTFjXHU3ZDIyCi1GT1JNX0xJTktfUkVNT1ZFPVx1OTY2NFx1NTNiYgotRk9STV9MQUJFTF9PV05FRD1cdTYyNDBcdTY3MDkKLUZPUk1fTEFCRUxfUFVCTElTSF9VUkw9XHU1MTZjXHU5NThiIFVSTAotRk9STV9MQUJFTF9VU0VSSUQ9XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjIElECi1GT1JNX0xBQkVMX1BBU1NXT1JEPVx1MzBkMVx1MzBiOVx1MzBlZlx1MzBmY1x1MzBjOQotRk9STV9MQUJFTF9MQU5HVUFHRT1cdThhMDBcdThhOWUKLUZPUk1fTEFCRUxfTkFNRT1cdTU0MGRcdTUyNGQKLUZPUk1fTEFCRUxfREVTQ1JJUFRJT049XHU4YWFjXHU2NjBlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTj1cdTgyZjFcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FBPVx1MzBhMlx1MzBkNVx1MzBhMVx1MzBmY1x1MzBlYlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQUI9XHUzMGEyXHUzMGQ2XHUzMGNmXHUzMGJhXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BRj1cdTMwYTJcdTMwZDVcdTMwZWFcdTMwYWJcdTMwZmNcdTMwZjNcdTMwYjlcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FNPVx1MzBhMlx1MzBlMFx1MzBjZlx1MzBlOVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQVI9XHUzMGEyXHUzMGU5XHUzMGQzXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BUz1cdTMwYTJcdTMwYzNcdTMwYjVcdTMwZTBcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FZPVx1MzBhMlx1MzBhNFx1MzBkZVx1MzBlOVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQVo9XHUzMGEyXHUzMGJjXHUzMGViXHUzMGQwXHUzMGE0XHUzMGI4XHUzMGUzXHUzMGYzXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CQT1cdTMwZDBcdTMwYjdcdTMwYWRcdTMwZmNcdTMwZWJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JFPVx1MzBkOVx1MzBlZFx1MzBlYlx1MzBiN1x1MzBhMlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQkc9XHUzMGQ2XHUzMGViXHUzMGFjXHUzMGVhXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CSD1cdTMwZDNcdTMwY2ZcdTMwZmNcdTMwZWJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JJPVx1MzBkM1x1MzBiOVx1MzBlOVx1MzBkZVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQk49XHUzMGQ5XHUzMGYzXHUzMGFjXHUzMGViXHU4YTllXHUzMDAxXHUzMGQwXHUzMGYzXHUzMGIwXHUzMGU5XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CTz1cdTMwYzFcdTMwZDlcdTMwYzNcdTMwYzhcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JSPVx1MzBkNlx1MzBlYlx1MzBjOFx1MzBmM1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQ0E9XHUzMGFiXHUzMGJmXHUzMGVkXHUzMGNiXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DTz1cdTMwYjNcdTMwZWJcdTMwYjdcdTMwYWJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NaPVx1MzBjMVx1MzBhN1x1MzBiM1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfQ1k9XHUzMGE2XHUzMGE3XHUzMGZjXHUzMGViXHUzMGJhXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9EQT1cdTMwYzdcdTMwZjNcdTMwZGVcdTMwZmNcdTMwYWZcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RFPVx1MzBjOVx1MzBhNFx1MzBjNFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfRFo9XHUzMGQ2XHUzMGZjXHUzMGJmXHUzMGYzXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTD1cdTMwYWVcdTMwZWFcdTMwYjdcdTMwZTNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VPPVx1MzBhOFx1MzBiOVx1MzBkYVx1MzBlOVx1MzBmM1x1MzBjOFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfRVM9XHUzMGI5XHUzMGRhXHUzMGE0XHUzMGYzXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FVD1cdTMwYThcdTMwYjlcdTMwYzhcdTMwY2JcdTMwYTJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VVPVx1MzBkMFx1MzBiOVx1MzBhZlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfRkE9XHUzMGRhXHUzMGViXHUzMGI3XHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GST1cdTMwZDVcdTMwYTNcdTMwZjNcdTMwZTlcdTMwZjNcdTMwYzlcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZKPVx1MzBkNVx1MzBhM1x1MzBiOFx1MzBmY1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfRk89XHUzMGQ1XHUzMGE3XHUzMGVkXHUzMGZjXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GUj1cdTMwZDVcdTMwZTlcdTMwZjNcdTMwYjlcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZZPVx1MzBkNVx1MzBlYVx1MzBmY1x1MzBiOVx1MzBlOVx1MzBmM1x1MzBjOVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfR0E9XHUzMGEyXHUzMGE0XHUzMGViXHUzMGU5XHUzMGYzXHUzMGM5XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HRD1cdTMwYjlcdTMwYjNcdTMwYzNcdTMwYzFcdTMwZmJcdTMwYjJcdTMwZmNcdTMwZWJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dMPVx1MzBhY1x1MzBlYVx1MzBiN1x1MzBhMlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfR049XHUzMGIwXHUzMGVmXHUzMGU5XHUzMGNiXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HVT1cdTMwYjBcdTMwYjhcdTMwZTNcdTMwZTlcdTMwZmNcdTMwYzhcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hBPVx1MzBjZlx1MzBhNlx1MzBiNVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSEk9XHUzMGQyXHUzMGYzXHUzMGM3XHUzMGEzXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IUj1cdTMwYWZcdTMwZWRcdTMwYTJcdTMwYzFcdTMwYTJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hVPVx1MzBjZlx1MzBmM1x1MzBhY1x1MzBlYVx1MzBmY1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSFk9XHUzMGEyXHUzMGViXHUzMGUxXHUzMGNiXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JQT1cdTMwYTRcdTMwZjNcdTMwYzZcdTMwZWJcdTMwZWFcdTMwZjNcdTMwYjBcdTMwYTJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lFPVx1MzBhNFx1MzBmM1x1MzBjNlx1MzBlYlx1MzBlYVx1MzBmM1x1MzBiMFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSUs9XHUzMGE0XHUzMGNjXHUzMGQ0XHUzMGEyXHUzMGMzXHUzMGFmXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JTj1cdTMwYTRcdTMwZjNcdTMwYzlcdTMwY2RcdTMwYjdcdTMwYTJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lTPVx1MzBhMlx1MzBhNFx1MzBiOVx1MzBlOVx1MzBmM1x1MzBjOVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSVQ9XHUzMGE0XHUzMGJmXHUzMGVhXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JVz1cdTMwZDhcdTMwZDZcdTMwZTlcdTMwYTRcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pBPVx1NjVlNVx1NjcyY1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSkk9XHUzMGE0XHUzMGM3XHUzMGEzXHUzMGMzXHUzMGI3XHUzMGU1XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KVz1cdTMwYjhcdTMwZTNcdTMwZWZcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tBPVx1MzBiMFx1MzBlYlx1MzBiOFx1MzBhMlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfS0s9XHUzMGFiXHUzMGI2XHUzMGQ1XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTD1cdTMwYjBcdTMwZWFcdTMwZmNcdTMwZjNcdTMwZTlcdTMwZjNcdTMwYzlcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tNPVx1MzBhYlx1MzBmM1x1MzBkY1x1MzBiOFx1MzBhMlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfS049XHUzMGFiXHUzMGYzXHUzMGNhXHUzMGMwXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTz1cdTk3ZDNcdTU2ZmRcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tTPVx1MzBhYlx1MzBiN1x1MzBkZlx1MzBmY1x1MzBlYlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfS1U9XHUzMGFmXHUzMGViXHUzMGM5XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LWT1cdTMwYWRcdTMwZWJcdTMwYWVcdTMwYjlcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xBPVx1MzBlOVx1MzBjNlx1MzBmM1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTE49XHUzMGVhXHUzMGYzXHUzMGFjXHUzMGU5XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MTz1cdTMwZTlcdTMwYWFcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xUPVx1MzBlYVx1MzBjOFx1MzBhMlx1MzBjYlx1MzBhMlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTFY9XHUzMGU5XHUzMGM4XHUzMGQzXHUzMGEyXHU4YTllXHUzMDAxXHUzMGVjXHUzMGMzXHUzMGM4XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NRz1cdTMwZGVcdTMwZTlcdTMwYWNcdTMwYjdcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01JPVx1MzBkZVx1MzBhYVx1MzBlYVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTUs9XHUzMGRlXHUzMGIxXHUzMGM5XHUzMGNiXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTD1cdTMwZGVcdTMwZTlcdTMwZTRcdTMwZmNcdTMwZTlcdTMwZTBcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01OPVx1MzBlMlx1MzBmM1x1MzBiNFx1MzBlYlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTU89XHUzMGUyXHUzMGViXHUzMGMwXHUzMGQzXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NUj1cdTMwZGVcdTMwZTlcdTMwZmNcdTMwYzZcdTMwYTNcdTMwZmNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01TPVx1MzBkZVx1MzBlY1x1MzBmY1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTVQ9XHUzMGRlXHUzMGViXHUzMGJmXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NWT1cdTMwZDNcdTMwZWJcdTMwZGVcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05BPVx1MzBjYVx1MzBhNlx1MzBlYlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfTkU9XHUzMGNkXHUzMGQxXHUzMGZjXHUzMGViXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9OTD1cdTMwYWFcdTMwZTlcdTMwZjNcdTMwYzBcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05PPVx1MzBjZVx1MzBlYlx1MzBhNlx1MzBhN1x1MzBmY1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfT0M9XHUzMGFhXHUzMGFkXHUzMGI3XHUzMGJmXHUzMGYzXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9PTT1cdTMwYWFcdTMwZWRcdTMwZTJcdThhOWUgKEFmYW4pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9PUj1cdTMwYWFcdTMwZWFcdTMwZTRcdTMwZmNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BBPVx1MzBkMVx1MzBmM1x1MzBiOFx1MzBlM1x1MzBkNlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfUEw9XHUzMGRkXHUzMGZjXHUzMGU5XHUzMGYzXHUzMGM5XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QUz1cdTMwZDFcdTMwYjdcdTMwZTVcdTMwYzhcdTMwZmNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BUPVx1MzBkZFx1MzBlYlx1MzBjOFx1MzBhY1x1MzBlYlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfUVU9XHUzMGIxXHUzMGMxXHUzMGU1XHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STT1cdTMwZWNcdTMwYzhcdTMwZmJcdTMwZWRcdTMwZGVcdTMwZmNcdTMwY2JcdTMwYzNcdTMwYjdcdTMwZTVcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JOPVx1MzBhZFx1MzBlYlx1MzBmM1x1MzBjN1x1MzBhM1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfUk89XHUzMGViXHUzMGZjXHUzMGRlXHUzMGNiXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9SVT1cdTMwZWRcdTMwYjdcdTMwYTJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JXPVx1MzBhZFx1MzBjYlx1MzBlNFx1MzBlYlx1MzBlZlx1MzBmM1x1MzBjMFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0E9XHUzMGI1XHUzMGYzXHUzMGI5XHUzMGFmXHUzMGVhXHUzMGMzXHUzMGM4XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TRD1cdTMwYjdcdTMwZjNcdTMwYzdcdTMwYTNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NHPVx1MzBiNVx1MzBmM1x1MzBiMFx1MzBlZFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0g9XHUzMGJiXHUzMGViXHUzMGRjXHUzMGZiXHUzMGFmXHUzMGVkXHUzMGEyXHUzMGMxXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TST1cdTMwYjdcdTMwZjNcdTMwY2ZcdTMwZTlcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NLPVx1MzBiOVx1MzBlZFx1MzBkMFx1MzBhZFx1MzBhMlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0w9XHUzMGI5XHUzMGVkXHUzMGQ5XHUzMGNiXHUzMGEyXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTT1cdTMwYjVcdTMwZTJcdTMwYTJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NOPVx1MzBiN1x1MzBlN1x1MzBjYVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfU089XHUzMGJkXHUzMGRlXHUzMGVhXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUT1cdTMwYTJcdTMwZWJcdTMwZDBcdTMwY2JcdTMwYTJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NSPVx1MzBiYlx1MzBlYlx1MzBkM1x1MzBhMlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfU1M9XHUzMGI3XHUzMGI5XHUzMGVmXHUzMGM2XHUzMGEzXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVD1cdTMwYmJcdTMwYmRcdTMwYzhcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NVPVx1MzBiOVx1MzBmM1x1MzBjMFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfU1Y9XHUzMGI5XHUzMGE2XHUzMGE3XHUzMGZjXHUzMGM3XHUzMGYzXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVz1cdTMwYjlcdTMwZWZcdTMwZDJcdTMwZWFcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RBPVx1MzBiZlx1MzBkZlx1MzBmY1x1MzBlYlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEU9XHUzMGM2XHUzMGIwXHUzMGViXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9URz1cdTMwYmZcdTMwYjhcdTMwYWZcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RIPVx1MzBiZlx1MzBhNFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEk9XHUzMGM2XHUzMGEzXHUzMGIwXHUzMGVhXHUzMGNiXHUzMGUzXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9USz1cdTMwYzhcdTMwZWJcdTMwYWZcdTMwZTFcdTMwZjNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RMPVx1MzBiZlx1MzBhY1x1MzBlZFx1MzBiMFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfVE49XHUzMGJiXHUzMGM0XHUzMGVmXHUzMGNhXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTz1cdTMwYzhcdTMwZjNcdTMwYWNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RSPVx1MzBjOFx1MzBlYlx1MzBiM1x1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfVFM9XHUzMGM0XHUzMGE5XHUzMGYzXHUzMGFjXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVD1cdTMwYmZcdTMwYmZcdTMwZmNcdTMwZWJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RXPVx1MzBjOFx1MzBhNVx1MzBhNFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfVUs9XHUzMGE2XHUzMGFmXHUzMGU5XHUzMGE0XHUzMGNhXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9VUj1cdTMwYTZcdTMwZWJcdTMwYzlcdTMwYTVcdTMwZmNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VaPVx1MzBhNlx1MzBiYVx1MzBkOVx1MzBhZlx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfVkk9XHUzMGQ5XHUzMGM4XHUzMGNhXHUzMGUwXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9WTz1cdTMwZGNcdTMwZTlcdTMwZDRcdTMwZTVcdTMwZmNcdTMwYWZcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1dPPVx1MzBhNlx1MzBhOVx1MzBlZFx1MzBkNVx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfWEg9XHUzMGIzXHUzMGZjXHUzMGI1XHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ZTz1cdTMwZThcdTMwZWJcdTMwZDBcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1pIPVx1NGUyZFx1NTZmZFx1OGE5ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfWlU9XHUzMGJhXHUzMGZjXHUzMGViXHUzMGZjXHU4YTllCi1GT1JNX0xBQkVMX0VYQUNUX05BTUVfTUFUQ0g9XHU1YjhjXHU1MTY4XHU0ZTAwXHU4MWY0Ci1GT1JNX0xBQkVMX0NBU0VfU0VOU0lUSVZFX01BVENIPVx1NTkyNy9cdTVjMGZcdTY1ODdcdTViNTdcdTMwNmVcdTUzM2FcdTUyMjUKLUZPUk1fTEFCRUxfU09VTkRFWD1cdTk4NWVcdTRmM2MKLUZPUk1fTEFCRUxfSURFTlRJRklFUlM9SUQKLUZPUk1fTEFCRUxfSURFTlRJRklFUl9UWVBFPVx1MzBiZlx1MzBhNFx1MzBkNwotCi0jIERvIG5vdCB0cmFuc2xhdGUgdGhlIHR3byBpdGVtcyBiZWxvdy4KLUZPUk1fT1BUSU9OX0lERU5USUZJRVJfRFVOUz1ELVUtTi1TCi1GT1JNX09QVElPTl9JREVOVElGSUVSX1RIT01BU19SRUdJU1RSWT1UaG9tYXMgUmVnaXN0cnkKLQotRk9STV9MQUJFTF9LRVlfTkFNRT1cdTMwYWRcdTMwZmNcdTU0MGQKLUZPUk1fTEFCRUxfS0VZX1ZBTFVFPVx1MzBhZFx1MzBmY1x1NTAyNAotRk9STV9MQUJFTF9DQVRFR09SSUVTPVx1MzBhYlx1MzBjNlx1MzBiNFx1MzBlYVx1MzBmYwotRk9STV9MQUJFTF9DQVRFR09SWV9UWVBFPVx1MzBiZlx1MzBhNFx1MzBkNwotRk9STV9PUFRJT05fQ0FURUdPUllfTkFJQ1M9TkFJQ1MKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX1VOU1BTQ183Mz1VTlNQU0MgNy4zCi1GT1JNX09QVElPTl9DQVRFR09SWV9HRU89R0VPCi1GT1JNX09QVElPTl9DQVRFR09SWV9EV0NPTU1VTklUWT1kVyBcdTMwYjNcdTMwZGZcdTMwZTVcdTMwY2JcdTMwYzZcdTMwYTNcdTMwZmMKLUZPUk1fTEFCRUxfQlVTSU5FU1NfQ0FURUdPUklFUz1cdTZiMjFcdTMwNjhcdTZiZDRcdThmMDM6Ci1GT1JNX09QVElPTl9CVVNJTkVTU0VTX09OTFk9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHUzMDdmCi1GT1JNX09QVElPTl9TRVJWSUNFU19PTkxZPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1MzA3ZgotRk9STV9PUFRJT05fQk9USD1cdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwNGFcdTMwODhcdTMwNzNcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKLUZPUk1fTEFCRUxfRElTQ09WRVJZVVJMUz1cdTMwYzdcdTMwYTNcdTMwYjlcdTMwYWJcdTMwZDBcdTMwZWFcdTMwZmMgVVJMCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTD1cdTMwYzdcdTMwYTNcdTMwYjlcdTMwYWJcdTMwZDBcdTMwZWFcdTMwZmMgVVJMCi1GT1JNX0xBQkVMX0ZJTkRRVUFMSUZJRVJTPVx1NGZlZVx1OThmZVx1NWI1MFx1MzA2ZVx1NjkxY1x1N2QyMgotRk9STV9MQUJFTF9DT01CSU5FX0tFWVM9XHU3ZDUwXHU1NDA4XHUzMGFkXHUzMGZjOgotRk9STV9PUFRJT05fQU5EQUxMS0VZUz1BTkQKLUZPUk1fT1BUSU9OX09SQUxMS0VZUz1PUgotRk9STV9PUFRJT05fT1JMSUtFS0VZUz1cdTMwN2VcdTMwNWZcdTMwNmYgTElLRQotRk9STV9MQUJFTF9TT1JUX0JZX05BTUU9XHU1NDBkXHU1MjRkXHUzMDY3XHUzMGJkXHUzMGZjXHUzMGM4OgotRk9STV9SQURJT19TT1JUX0FTQz1cdTY2MDdcdTk4MDYKLUZPUk1fUkFESU9fU09SVF9ERVNDPVx1OTY0ZFx1OTgwNgotRk9STV9MQUJFTF9TT1JUX0JZX0RBVEU9XHU2NWU1XHU0ZWQ4XHUzMDY3XHUzMGJkXHUzMGZjXHUzMGM4OgotRk9STV9MQUJFTF9NQVhfU0VBUkNIX1NFVD1cdTY5MWNcdTdkMjJcdTMwYmJcdTMwYzNcdTMwYzhcdTMwNmVcdTY3MDBcdTU5MjdcdTMwYjVcdTMwYTRcdTMwYmE6Ci1GT1JNX0xBQkVMX01BWF9SRVNVTFRTPVx1N2Q1MFx1Njc5Y1x1MzA2ZVx1NjcwMFx1NTkyN1x1NjU3MDoKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFU19TSU1QTEVfREVTQz1cdTY5MWNcdTdkMjJcdTMwNTlcdTMwOGJcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNmVcdTRlMDBcdTkwZThcdTMwN2VcdTMwNWZcdTMwNmZcdTUxNjhcdTkwZThcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHU0ZWZiXHU2MTBmXHUzMDZlXHU2NTg3XHU1YjU3XHUzMDY4XHU0ZTAwXHU4MWY0XHUzMDU5XHUzMDhiXHUzMGVmXHUzMGE0XHUzMGViXHUzMGM5XHUzMGFiXHUzMGZjXHUzMGM5XHUzMDY4XHUzMDU3XHUzMDY2ICclJyBcdThhMThcdTUzZjdcdTMwOTJcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjPHN0cm9uZz5cdTViOWZcdTg4NGM8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjZcdTY5MWNcdTdkMjJcdTMwOTJcdTViOWZcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX1VVSURfREVTQz1cdTY5MWNcdTdkMjJcdTMwNTlcdTMwOGJcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmUgVVVJRCBcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjPHN0cm9uZz5cdTViOWZcdTg4NGM8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTYyYmNcdTMwNTdcdTMwNjZcdTY5MWNcdTdkMjJcdTMwOTJcdTViOWZcdTg4NGNcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRVNfU0lNUExFX0RFU0M9XHU2OTFjXHU3ZDIyXHUzMDU5XHUzMDhiXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDZlXHU0ZTAwXHU5MGU4XHUzMDdlXHUzMDVmXHUzMDZmXHU1MTY4XHU5MGU4XHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1NGVmYlx1NjEwZlx1MzA2ZVx1NjU4N1x1NWI1N1x1MzA2OFx1NGUwMFx1ODFmNFx1MzA1OVx1MzA4Ylx1MzBlZlx1MzBhNFx1MzBlYlx1MzBjOVx1MzBhYlx1MzBmY1x1MzBjOVx1MzA2OFx1MzA1N1x1MzA2NiAnJScgXHU4YTE4XHU1M2Y3XHUzMDkyXHU0ZjdmXHU3NTI4XHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyIFx1MzAwYzxzdHJvbmc+XHU1YjlmXHU4ODRjPC9zdHJvbmc+XHUzMDBkXHUzMDkyXHU2MmJjXHUzMDU3XHUzMDY2XHU2OTFjXHU3ZDIyXHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRV9JTlRFUkZBQ0VfVVVJRF9ERVNDPVx1NjkxY1x1N2QyMlx1MzA1OVx1MzA4Ylx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOVx1MzA2ZSBVVUlEIFx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGM8c3Ryb25nPlx1NWI5Zlx1ODg0Yzwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1NjJiY1x1MzA1N1x1MzA2Nlx1NjkxY1x1N2QyMlx1MzA5Mlx1NWI5Zlx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVM9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5Ci1GT1JNX0xBQkVMX1VVSURfS0VZPVVVSUQgXHUzMGFkXHUzMGZjOgotRk9STV9MQUJFTF9VU0VfU0VSVklDRT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTRmN2ZcdTc1MjgKLUZPUk1fTEFCRUxfU0VSVklDRT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKLUZPUk1fTEFCRUxfQlVTSU5FU1M9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5Ci1GT1JNX0xBQkVMX1BVQkxJU0hfQVNTRVJUSU9OUz1cdTMwZDFcdTMwZDZcdTMwZWFcdTMwYzNcdTMwYjdcdTMwZTNcdTMwZmNcdTg4NjhcdTY2MGUKLUZPUk1fTEFCRUxfRElSRUNUSU9OPVx1NjViOVx1NTQxMQotRk9STV9MQUJFTF9GUk9NX0tFWT1cdTUxNDNcdTMwYWRcdTMwZmMKLUZPUk1fTEFCRUxfVE9fS0VZPVx1MzBhZFx1MzBmY1x1MzA3OAotRk9STV9MQUJFTF9TVEFUVVM9XHU3MmI2XHU2Y2MxCi1GT1JNX0xBQkVMX0FTU0VSVElPTl9UWVBFPVx1ODg2OFx1NjYwZVx1MzA2ZVx1MzBiZlx1MzBhNFx1MzBkNwotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEFSRU5UX0NISUxEPVx1ODlhYSAtIFx1NWI1MAotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEVFUl9UT19QRUVSPVx1MzBkNFx1MzBhMiAtIFx1MzBkNFx1MzBhMgotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfSURFTlRJVFk9XHU4YjU4XHU1MjI1Ci1GT1JNX0xBQkVMX0FTU0VSVElPTl9ESVJFVElPTl9ERVNDPVx1NjViOVx1NTQxMVx1MzAwYzxzdHJvbmc+LS0+PC9zdHJvbmc+XHUzMDBkXHUzMDY3XHUzMDUzXHUzMDZlXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDRiXHUzMDg5XHU0ZTBhXHU4YTE4XHUzMDZlXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZiXHUzMGQxXHUzMGQ2XHUzMGVhXHUzMGMzXHUzMGI3XHUzMGUzXHUzMGZjXHU4ODY4XHU2NjBlXHUzMDRjXHU0ZjVjXHU2MjEwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyICBcdTY1YjlcdTU0MTFcdTMwMGM8c3Ryb25nPjwtLTwvc3Ryb25nPlx1MzAwZFx1MzA2N1x1NGUwYVx1OGExOFx1MzA2ZVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA0Ylx1MzA4OVx1MzA1M1x1MzA2ZVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA2Ylx1MzBkMVx1MzBkNlx1MzBlYVx1MzBjM1x1MzBiN1x1MzBlM1x1MzBmY1x1ODg2OFx1NjYwZVx1MzA0Y1x1NGY1Y1x1NjIxMFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMgotRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9GUk9NPS0tLT4KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9ESVJFQ1RJT05fVE89PC0tLQotRk9STV9MQUJFTF9USElTX0JVU0lORVNTPVx1MzA1M1x1MzA4YwotTVNHX0VSUk9SX0lOVkFMSURfUVVFUllfTkFNRT1JV0FCMDE0MEUgXHU3MTY3XHU0ZjFhXHUzMDZlXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FUz1JV0FCMDE0MUUgXHU0ZTAwXHU5MDIzXHUzMDZlXHU2NzA5XHU1MmI5XHUzMDZhXHU1NDBkXHU1MjRkXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTD1JV0FCMDE0MkUgXHU2NzA5XHU1MmI5XHUzMDZhXHU1MTZjXHU5NThiIFVSTCBcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1VTRVJJRD1JV0FCMDE0M0UgXHU2NzA5XHU1MmI5XHUzMDZhXHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjIElEIFx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfTUFYX1NFQVJDSF9TRVQ9SVdBQjAxNDVFIFx1NjcwMFx1NTkyN1x1NjkxY1x1N2QyMlx1OGEyZFx1NWI5YVx1MzA2ZVx1NjcwOVx1NTJiOVx1MzA2YVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfTUFYX1JFU1VMVFM9SVdBQjAxNDZFIFx1N2Q1MFx1Njc5Y1x1MzA2ZVx1NjcwMFx1NTkyN1x1NjU3MFx1MzA2ZVx1NjcwOVx1NTJiOVx1MzBiNVx1MzBhNFx1MzBiYVx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0N0kgXHU4OThiXHUzMDY0XHUzMDRiXHUzMDYzXHUzMDVmXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHU2NTcwOiAlMQotTVNHX0VSUk9SX05PX0JVU0lORVNTRVNfRk9VTkQ9SVdBQjAxNDhFIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA0Y1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMgotTVNHX0lORk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNDlJIFx1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA2M1x1MzA1Zlx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1NjU3MDogJTEKLU1TR19FUlJPUl9OT19TRVJWSUNFU19GT1VORD1JV0FCMDE1MEUgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDRjXHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfRVJST1JfU0lOR0xFX0lURU09SVdBQjAxNTFFIDEgXHUzMDY0XHUzMDZlXHU5ODA1XHU3NmVlXHUzMDYwXHUzMDUxXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi1NU0dfUVVFU1RJT05fSVRFTV9SRVBMQUNFTUVOVD1cdTMwNTNcdTMwNmVcdTkwNzhcdTYyOWVcdTMwNmJcdTMwODhcdTMwNjNcdTMwNjZcdTMwMDFcdTMwNTlcdTMwNjdcdTMwNmJcdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzhcdTUxODVcdTMwNmJcdTMwNDJcdTMwOGJcdTk4MDVcdTc2ZWVcdTMwNGNcdTdmNmVcdTYzZGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIgXHU3ZDlhXHUzMDUxXHUzMDdlXHUzMDU5XHUzMDRiPwotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUySSBcdTg5OGJcdTMwNjRcdTMwNGJcdTMwNjNcdTMwNWZcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjlcdTMwNmVcdTY1NzA6ICUxCi1NU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUzRSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjlcdTMwNGNcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMTU0RSBcdTVjMTFcdTMwNmFcdTMwNGZcdTMwNjhcdTMwODIgMSBcdTMwNjRcdTMwNmVcdTk4MDVcdTc2ZWVcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1VVSURfS0VZPUlXQUIwMTU1RSBcdTY3MDlcdTUyYjlcdTMwNmEgVVVJRCBcdTMwYWRcdTMwZmNcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLU1TR19FUlJPUl9RVUVSWV9OQU1FX0NPTkZMSUNUPUlXQUIwMTU2RSBcdTUyNmZcdTcxNjdcdTRmMWFcdTMwNmVcdTcxNjdcdTRmMWFcdTU0MGRcdTMwOTJcdTc2N2FcdTRmZTFcdTUxNDNcdTMwNjhcdTU0MGNcdTRlMDBcdTMwNmJcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDIKLU1TR19FUlJPUl9OT19JVEVNU19UT19HRVQ9SVdBQjAxNTdFIFx1NjMwN1x1NWI5YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1NTc4Ylx1MzA2ZVx1OTgwNVx1NzZlZVx1MzA0Y1x1NTE2Y1x1OTU4Ylx1MzA4Mlx1NzY3YVx1ODk4Ylx1MzA4Mlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgotCi0jIFJlc3VsdHMKLUFMVF9RVUVSWV9SRVNVTFRTPVx1NzE2N1x1NGYxYVx1N2Q1MFx1Njc5YwotRk9STV9MQUJFTF9TVUJRVUVSWT1cdTdkNTBcdTY3OWNcdTMwNmZcdTUyMjVcdTMwNmVcdTY0Y2RcdTRmNWNcdTMwNmVcdTUxNjVcdTUyOWJcdTMwNjhcdTMwNTdcdTMwNjZcdTRmN2ZcdTc1MjhcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNGNcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDIgXHU2NzAwXHU0ZTBhXHU5MGU4XHUzMDZiXHUzMDQyXHUzMDhiXHUzMDBjPHN0cm9uZz5cdTMwYmZcdTMwZmNcdTMwYjJcdTMwYzNcdTMwYzg8L3N0cm9uZz5cdTMwMGRcdTMwZWFcdTMwZjNcdTMwYWZcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTY0Y2RcdTRmNWNcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDVmXHU3ZDUwXHU2NzljXHUzMDZmXHUzMDBjPHN0cm9uZz5cdThlZTJcdTkwMDE8L3N0cm9uZz5cdTMwMGRcdTMwZGNcdTMwYmZcdTMwZjNcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTlcdTMwOGJcdTMwNTNcdTMwNjhcdTMwNmJcdTMwODhcdTMwNjNcdTMwNjZcdTY0Y2RcdTRmNWNcdTMwNmJcdTRmN2ZcdTc1MjhcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfUVVFUlk9XHU3ZDUwXHU2NzljXHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHU4YTczXHU3ZDMwXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU5XHUzMDhiXHUzMDRiXHUzMDAxXHUzMDdlXHUzMDVmXHUzMDZmXHU3ZDUwXHU2NzljXHUzMDZlXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDAxXHUzMGRjXHUzMGJmXHUzMGYzXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU2NGNkXHU0ZjVjXHUzMDkyXHU1YjlmXHU4ODRjXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyCi1GT1JNX0xJTktfVEFSR0VUPVx1MzBiZlx1MzBmY1x1MzBiMlx1MzBjM1x1MzBjOAotRk9STV9CVVRUT05fVFJBTlNGRVI9XHU4ZWUyXHU5MDAxCi1GT1JNX0JVVFRPTl9SRUZSRVNIPVx1NjZmNFx1NjViMAotRk9STV9CVVRUT05fQUREX1RPX0ZBVk9SSVRFUz1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmJcdThmZmRcdTUyYTAKLUZPUk1fQlVUVE9OX1VOUFVCTElTSD1cdTk3NWVcdTUxNmNcdTk1OGIKLUZPUk1fQlVUVE9OX0NMRUFSPVx1MzBhZlx1MzBlYVx1MzBhMgotCi0jIFB1Ymxpc2ggYWN0aW9ucwotQUxUX1BVQkxJU0g9XHU1MTZjXHU5NThiCi1GT1JNX0xBQkVMX1BVQkxJU0g9XHU1MTZjXHU5NThiOgotRk9STV9PUFRJT05fQlVTSU5FU1M9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5Ci1GT1JNX09QVElPTl9TRVJWSUNFPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOQotRk9STV9PUFRJT05fU0VSVklDRV9JTlRFUkZBQ0U9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5Ci1GT1JNX0xBQkVMX1BVQkxJU0hfQlVTSU5FU1NfU0lNUExFX0RFU0M9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDRhXHUzMDg4XHUzMDczXHUzMGFhXHUzMGQ3XHUzMGI3XHUzMGU3XHUzMGYzXHUzMDZlXHU4YWFjXHU2NjBlXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1OGE4ZFx1OGEzY1x1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2YVx1NTgzNFx1NTQwOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMgotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX0FEVkFOQ0VEX0RFU0M9XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1NGVkNlx1MzA2ZVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBmY1x1MzBiZlx1MzBmY1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA4Mlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMiBcdThhOGRcdThhM2NcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX1NJTVBMRV9ERVNDPVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA5Mlx1NTNkNlx1NWY5N1x1MzA3ZVx1MzA1Zlx1MzA2Zlx1NjkxY1x1NTFmYVx1MzA1N1x1MzAwMVdTREwgVVJMIFx1MzA2OFx1MzAwMVx1NTE2Y1x1OTU4Ylx1MzA1OVx1MzA4Ylx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA0YVx1MzA4OFx1MzA3M1x1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1OGFhY1x1NjYwZVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdThhOGRcdThhM2NcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0M9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDkyXHU1M2Q2XHU1Zjk3XHUzMDdlXHUzMDVmXHUzMDZmXHU2OTFjXHU1MWZhXHUzMDU3XHUzMDAxV1NETCBVUkwgXHUzMDY4XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1NGVkNlx1MzA2ZVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBmY1x1MzBiZlx1MzBmY1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA4Mlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMiBcdThhOGRcdThhM2NcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFX1NJTVBMRV9ERVNDPVdTREwgVVJMIFx1MzA2OFx1MzAwMVx1NTE2Y1x1OTU4Ylx1MzA1OVx1MzA4Ylx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA0YVx1MzA4OFx1MzA3M1x1MzBhYVx1MzBkN1x1MzBiN1x1MzBlN1x1MzBmM1x1MzA2ZVx1OGFhY1x1NjYwZVx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdThhOGRcdThhM2NcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0M9V1NETCBVUkwgXHUzMDY4XHU1MTZjXHU5NThiXHUzMDU5XHUzMDhiXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZlXHU1NDBkXHU1MjRkXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1NGVkNlx1MzA2ZVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBmY1x1MzBiZlx1MzBmY1x1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA4Mlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMiBcdThhOGRcdThhM2NcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9TSU1QTEVfREVTQz1XU0RMIFVSTCBcdTMwNjhcdTMwMDFcdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjlcdTMwNmVcdTU0MGRcdTUyNGRcdTMwNGFcdTMwODhcdTMwNzNcdTMwYWFcdTMwZDdcdTMwYjdcdTMwZTdcdTMwZjNcdTMwNmVcdThhYWNcdTY2MGVcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHU4YThkXHU4YTNjXHUzMDRjXHU1ZmM1XHU4OTgxXHUzMDZhXHU1ODM0XHU1NDA4XHUzMDRjXHUzMDQyXHUzMDhhXHUzMDdlXHUzMDU5XHUzMDAyCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0VfQURWQU5DRURfREVTQz1XU0RMIFVSTCBcdTMwNjhcdTUxNmNcdTk1OGJcdTMwNTlcdTMwOGJcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjlcdTMwNmVcdTU0MGRcdTUyNGRcdTMwOTJcdTYzMDdcdTViOWFcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHU0ZWQ2XHUzMDZlXHUzMGQxXHUzMGU5XHUzMGUxXHUzMGZjXHUzMGJmXHUzMGZjXHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDgyXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDU5XHUzMDAyIFx1OGE4ZFx1OGEzY1x1MzA0Y1x1NWZjNVx1ODk4MVx1MzA2YVx1NTgzNFx1NTQwOFx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1OVx1MzAwMgotRk9STV9MQUJFTF9QVUJMSVNIX0ZPUk09XHU1MTZjXHU5NThiXHUzMGQ1XHUzMGE5XHUzMGZjXHUzMGRlXHUzMGMzXHUzMGM4Ci1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPVx1OGFhY1x1NjYwZQotRk9STV9MQUJFTF9ERVNDUklQVElPTlM9XHU4YWFjXHU2NjBlCi1NU0dfSU5GT19CVVNJTkVTU19QVUJMSVNIRUQ9SVdBQjAxNThJIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOSAlMSBcdTMwNmZcdTZiNjNcdTVlMzhcdTMwNmJcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19JTkZPX1NFUlZJQ0VfUFVCTElTSEVEPUlXQUIwMTU5SSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkgJTEgXHUzMDZmXHU2YjYzXHU1ZTM4XHUzMDZiXHU1MTZjXHU5NThiXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9QVUJMSVNIRUQ9SVdBQjAxNjBJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOSAlMSBcdTMwNmZcdTZiNjNcdTVlMzhcdTMwNmJcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX05BTUU9SVdBQjAxNjFFIFx1NjcwOVx1NTJiOVx1MzA2YVx1NTQwZFx1NTI0ZFx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRT1JV0FCMDI1MEUgXHU4ODRjICUyIFx1MzA2ZSAlMSBcdTMwNmVcdTk3NWVcdTMwZDZcdTMwZTlcdTMwZjNcdTMwYWZcdThhMDBcdThhOWVcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIgXHUzMGQ2XHUzMGU5XHUzMGYzXHUzMGFmXHU4YTAwXHU4YTllXHUzMDRjXHU1NDJiXHUzMDgwXHUzMDUzXHUzMDY4XHUzMDRjXHUzMDY3XHUzMDRkXHUzMDhiXHUzMDZlXHUzMDZmXHU2NzAwXHU1MjFkXHUzMDZlXHU4ODRjXHUzMDYwXHUzMDUxXHUzMDY3XHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfUk9XX0RVUExJQ0FURV9MQU5HVUFHRT1JV0FCMDI1MUUgXHU4ODRjICUyIFx1MzA2ZSAlMSBcdTMwNmVcdThhMDBcdThhOWVcdTMwOTJcdTU5MDlcdTY2ZjRcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIgXHU3M2ZlXHU1NzI4XHUzMDZlXHU4YTAwXHU4YTllXHUzMDZmXHUzMDU5XHUzMDY3XHUzMDZiXHU0ZjdmXHU3NTI4XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVD1JV0FCMDI1MkUgXHU4ODRjICUyIFx1MzA2Ylx1NjcwOVx1NTJiOVx1MzA2YSAlMSBcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMPUlXQUIwMjUzRSBcdTY3MDlcdTUyYjlcdTMwNmEgV1NETCBVUkwgXHUzMDkyXHU1MTY1XHU1MjliXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi1NU0dfRVJST1JfTk9fTkFNRVM9SVdBQjAyNTRFIFx1NWMxMVx1MzA2YVx1MzA0Zlx1MzA2OFx1MzA4MiAxIFx1MzA2NFx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA5Mlx1OGZmZFx1NTJhMFx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfU0VSVklDRT1JV0FCMDI1NUUgXHU2NzA5XHU1MmI5XHUzMDZhXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9CVVNJTkVTUz1JV0FCMDI1NkUgXHU2NzA5XHU1MmI5XHUzMDZhXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDkyXHU2MzA3XHU1YjlhXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi0KLSMgQnVzaW5lc3MgUHVibGlzaCBTZXJ2aWNlIGFjdGlvbgotQUxUX1BVQkxJU0hfU0VSVklDRT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTUxNmNcdTk1OGIKLQotIyBXU0RMIEJyb3dzZXIKLVRJVExFX1dTRExfQlJPV1NFUj1XU0RMIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmYyAtICUxCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFPVdTREwgXHUzMGJkXHUzMGZjXHUzMGI5XHUzMDZlXHU5MDc4XHU2MjllOgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9XRUJQUk9KRUNUUz1XZWIgXHUzMGQ3XHUzMGVkXHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4Ci1GT1JNX0xBQkVMX1dTRExfU09VUkNFX0ZBVk9SSVRFUz1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGEKLUZPUk1fTEFCRUxfV0VCX1BST0pFQ1Q9V2ViIFx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOAotRk9STV9MQUJFTF9XU0RMX1VSTD1XU0RMIFVSTAotQUxUX1dTRExfQlJPV1NFUj1XU0RMIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmYwotCi0jIERldGFpbHMKLUZPUk1fTElOS19FRElUPVx1N2RlOFx1OTZjNgotRk9STV9MSU5LX0NBTkNFTD1cdTMwYWRcdTMwZTNcdTMwZjNcdTMwYmJcdTMwZWIKLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzBmYlx1MzBhZFx1MzBmYwotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYWRcdTMwZmMKLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfS0VZPVRNb2RlbCBcdTMwYWRcdTMwZmMKLUZPUk1fTEFCRUxfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVM9XHUzMGU2XHUzMGZjXHUzMGI2XHUzMGZjXHU1YjlhXHU3ZmE5XHUzMGFiXHUzMGM2XHUzMGI0XHUzMGVhXHUzMGZjCi1GT1JNX0xBQkVMX0NIRUNLRUQ9XHU2OTFjXHU2N2ZiXHU2ZTA4XHUzMDdmCi1GT1JNX0xBQkVMX0ZJTEU9XHUzMGQ1XHUzMGExXHUzMGE0XHUzMGViCi1NU0dfUVVFU1RJT05fUFVCTElTSF9JVEVNPVx1OTgwNVx1NzZlZVx1MzA0Y1x1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2N1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTUxNmNcdTk1OGJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/Ci1NU0dfUVVFU1RJT05fU0VSVklDRV9QVUJMSVNIX0JVU0lORVNTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2OFx1MzA1ZFx1MzA2ZVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA0Y1x1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2N1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTdkOWFcdTg4NGNcdTMwNTdcdTMwNjZcdTUxNmNcdTk1OGJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/Ci1NU0dfSU5GT19CVVNJTkVTU19VUERBVEVEPUlXQUIwMjU3SSBcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjkgJTEgXHUzMDRjXHU2YjYzXHU1ZTM4XHUzMDZiXHU2NmY0XHU2NWIwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX1VQREFURUQ9SVdBQjAyNThJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOSAlMSBcdTMwNGNcdTZiNjNcdTVlMzhcdTMwNmJcdTY2ZjRcdTY1YjBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VQREFURUQ9SVdBQjAyNTlJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOSAlMSBcdTMwNGNcdTZiNjNcdTVlMzhcdTMwNmJcdTY2ZjRcdTY1YjBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19JTkZPX1JFR0lTVFJZX1VQREFURUQ9SVdBQjAzMjNJIFx1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmYyAlMSBcdTMwNGNcdTZiNjNcdTVlMzhcdTMwNmJcdTY2ZjRcdTY1YjBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLQotIyBVbnB1Ymxpc2hBY3Rpb24KLUFMVF9VTlBVQkxJU0hfQlVTSU5FU1M9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHU5NzVlXHU1MTZjXHU5NThiCi1BTFRfVU5QVUJMSVNIX1NFUlZJQ0U9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZlXHU5NzVlXHU1MTZjXHU5NThiCi1BTFRfVU5QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOVx1MzA2ZVx1OTc1ZVx1NTE2Y1x1OTU4YgotRk9STV9MQUJFTF9VTlBVQkxJU0hfREVTQz1cdTMwMGM8c3Ryb25nPlx1NWI5Zlx1ODg0Yzwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1NjJiY1x1MzA1N1x1MzA2Nlx1MzA1M1x1MzA2ZVx1MzBhYVx1MzBkNlx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzA5Mlx1OTc1ZVx1NTE2Y1x1OTU4Ylx1MzA2Ylx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdThhOGRcdThhM2NcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19JTkZPX0JVU0lORVNTX1VOUFVCTElTSEVEPUlXQUIwMjYwSSBcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjkgJTEgXHUzMDRjXHU2YjYzXHU1ZTM4XHUzMDZiXHU5NzVlXHU1MTZjXHU5NThiXHUzMDZiXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX1VOUFVCTElTSEVEPUlXQUIwMjYxSSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkgJTEgXHUzMDRjXHU2YjYzXHU1ZTM4XHUzMDZiXHU5NzVlXHU1MTZjXHU5NThiXHUzMDZiXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9VTlBVQkxJU0hFRD1JV0FCMDI2MkkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5ICUxIFx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1OTc1ZVx1NTE2Y1x1OTU4Ylx1MzA2Ylx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotCi0jIEFkZCB0byBXU0RMIFBlcnNwZWN0aXZlCi1BTFRfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTAKLU1TR19JTkZPX1dTRExfQURERURfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3NkkgJTEgXHUzMDRjIFdTREwgXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU2YjYzXHU1ZTM4XHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfRVJST1JfV1NETF9OT1RfQURERURfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3N0UgJTEgXHUzMDkyIFdTREwgXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyCi0KLSMgQWRkIHRvIEZhdm9yaXRlcwotQUxUX0FERF9UT19GQVZPUklURVM9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU4ZmZkXHU1MmEwCi1NU0dfSU5GT19GQVZPUklURV9BRERFRD1JV0FCMDI2M0kgJTEgXHUzMDRjXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU2YjYzXHU1ZTM4XHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU3XHUzMDVmXHUzMDAyCi1NU0dfRVJST1JfRkFWT1JJVEVfTk9UX0FEREVEPUlXQUIwMjY0RSAlMSBcdTMwOTJcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmJcdThmZmRcdTUyYTBcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19FUlJPUl9GQVZPUklURV9BTFJFQURZX0VYSVNUUz1JV0FCMDMyNEUgJTEgXHUzMDZmXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHUzMDU5XHUzMDY3XHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmZcdTMwNTlcdTMwNjdcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgIFx1NGUwYVx1NjZmOFx1MzA0ZFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8KLQotIyBSZWZyZXNoCi1NU0dfSU5GT19OT0RFX1JFRlJFU0hFRD1JV0FCMDI2NUkgJTEgXHUzMDRjXHU2NzAwXHU2NWIwXHU4ODY4XHU3OTNhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfUVVFU1RJT05fUkVNT1ZFX05PREU9JTEgXHUzMDRjXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDY3XHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyIFx1MzBhZlx1MzBlYVx1MzBhMlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8KLQotIyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXMKLUFMVF9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFUz1cdTUzYzJcdTcxNjdcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTdiYTFcdTc0MDYKLUZPUk1fTEFCRUxfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfREVTQz1cdTMwMGM8c3Ryb25nPlx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1OGZmZFx1NTJhMDwvc3Ryb25nPlx1MzAwZFx1MzBkY1x1MzBiZlx1MzBmM1x1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1MzAwMVx1NzY3YVx1ODk4Ylx1MzA3ZVx1MzA1Zlx1MzA2Zlx1NTE2Y1x1OTU4Ylx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA5Mlx1NTNjMlx1NzE2N1x1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjOFx1MzA2Ylx1OGZmZFx1NTJhMFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGM8c3Ryb25nPlx1NTNjMlx1NzE2N1x1MzA2ZVx1OTY2NFx1NTNiYjwvc3Ryb25nPlx1MzAwZFx1MzBkY1x1MzBiZlx1MzBmM1x1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Ylx1MzA4OFx1MzA4YVx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1NTNjMlx1NzE2N1x1MzA5Mlx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTU5MDlcdTY2ZjRcdTMwNmJcdTMwNmZcdThhOGRcdThhM2NcdTMwNGNcdTVmYzVcdTg5ODFcdTMwNmFcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIKLUZPUk1fTEFCRUxfUkVGRVJFTkNFRF9TRVJWSUNFUz1cdTUzYzJcdTcxNjdcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKLUZPUk1fQlVUVE9OX0FERF9TRVJWSUNFUz1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdThmZmRcdTUyYTAKLUZPUk1fQlVUVE9OX1JFTU9WRV9SRUZFUkVOQ0VTPVx1NTNjMlx1NzE2N1x1MzA2ZVx1OTY2NFx1NTNiYgotTVNHX0VSUk9SX05PX1JFRkVSRU5DRV9TRUxFQ1RFRD1JV0FCMDI2NkUgXHU3ZDlhXHU4ODRjXHUzMDU5XHUzMDhiXHU1MjRkXHUzMDZiXHU1YzExXHUzMDZhXHUzMDRmXHUzMDY4XHUzMDgyIDEgXHUzMDY0XHUzMDZlXHU1M2MyXHU3MTY3XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDY2XHUzMDRmXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyCi1NU0dfRVJST1JfTk9fU0VSVklDRVM9SVdBQjAyNjdFIFx1N2Q5YVx1ODg0Y1x1MzA1OVx1MzA4Ylx1NTI0ZFx1MzA2Ylx1NWMxMVx1MzA2YVx1MzA0Zlx1MzA2OFx1MzA4MiAxIFx1MzA2NFx1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA5Mlx1NTNkNlx1NWY5N1x1MzA3ZVx1MzA1Zlx1MzA2Zlx1NjkxY1x1NTFmYVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX1JFRkVSRU5DRUQ9SVdBQjAyNjhFIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOSAlMSBcdTMwOTJcdTUzYzJcdTcxNjdcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19FUlJPUl9SRUZFUkVOQ0VfTk9UX1JFTU9WRUQ9SVdBQjAyNjlFIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1NTNjMlx1NzE2NyAlMSBcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFRD1JV0FCMDI3MEkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5ICUxIFx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1NTNjMlx1NzE2N1x1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VfUkVNT1ZFRD1JV0FCMDI3MUkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHU1M2MyXHU3MTY3ICUxIFx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1OTY2NFx1NTNiYlx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotCi0jIE1hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnMKLUFMVF9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlM9XHUzMGQxXHUzMGQ2XHUzMGVhXHUzMGMzXHUzMGI3XHUzMGUzXHUzMGZjXHU4ODY4XHU2NjBlXHUzMDZlXHU3YmExXHU3NDA2Ci1GT1JNX0xBQkVMX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OU19ERVNDPVx1MzAwYzxzdHJvbmc+XHU4ODY4XHU2NjBlXHUzMDZlXHU4ZmZkXHU1MmEwPC9zdHJvbmc+XHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU5XHUzMDhiXHUzMDUzXHUzMDY4XHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHUzMDAxXHU3NjdhXHU4OThiXHUzMDdlXHUzMDVmXHUzMDZmXHU1MTZjXHU5NThiXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDkyXHUzMGQxXHUzMGQ2XHUzMGVhXHUzMGMzXHUzMGI3XHUzMGUzXHUzMGZjXHU4ODY4XHU2NjBlXHUzMDZlXHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzAwYzxzdHJvbmc+XHU4ODY4XHU2NjBlXHUzMDZlXHU5NjY0XHU1M2JiIDwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODg2OFx1NjYwZVx1MzA5Mlx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGM8c3Ryb25nPlx1ODg2OFx1NjYwZVx1MzA2ZVx1NWI4Y1x1NGU4Njwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA2Ylx1MzA4OFx1MzA2M1x1MzA2Nlx1MzAwMVx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1ODg2OFx1NjYwZVx1MzA5Mlx1NWI4Y1x1NGU4Nlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGM8c3Ryb25nPlx1ODg2OFx1NjYwZVx1MzA2ZVx1NjZmNFx1NjViMDwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1ODg2OFx1NjYwZVx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjOFx1MzA5Mlx1NjZmNFx1NjViMFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotRk9STV9MQUJFTF9JTkNPTVBMRVRFX0FTU0VSVElPTlNfVklTSUJJTElUWV9ERVNDPVx1NmNlOFx1NGUwZFx1NWI4Y1x1NTE2OFx1MzA2YVx1MzBkMVx1MzBkNlx1MzBlYVx1MzBjM1x1MzBiN1x1MzBlM1x1MzBmY1x1ODg2OFx1NjYwZVx1MzA2Zlx1MzA1ZFx1MzA2ZVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA2ZVx1NjI0MFx1NjcwOVx1ODAwNVx1MzA2Ylx1MzA1N1x1MzA0Ylx1ODg2OFx1NzkzYVx1MzA1NVx1MzA4Y1x1MzA2YVx1MzA0NFx1MzA1M1x1MzA2OFx1MzA2Ylx1NmNlOFx1NjEwZlx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotRk9STV9MQUJFTF9CVVNJTkVTU0VTPVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOQotRk9STV9CVVRUT05fU0hPV19BTExfUFVCTElTSEVSX0FTU0VSVElPTlM9XHU4ODY4XHU2NjBlXHUzMDZlXHU2NmY0XHU2NWIwCi1GT1JNX0JVVFRPTl9DT01QTEVURV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1cdTg4NjhcdTY2MGVcdTMwNmVcdTViOGNcdTRlODYKLUZPUk1fQlVUVE9OX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OUz1cdTg4NjhcdTY2MGVcdTMwNmVcdThmZmRcdTUyYTAKLUZPUk1fQlVUVE9OX1JFTU9WRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1cdTg4NjhcdTY2MGVcdTMwNmVcdTk2NjRcdTUzYmIKLU1TR19JTkZPX1BVQkxJU0hFUl9BU1NFUlRJT05TX1JFRlJFU0hFRD1JV0FCMDMyNUkgXHUzMGQxXHUzMGQ2XHUzMGVhXHUzMGMzXHUzMGI3XHUzMGUzXHUzMGZjXHU4ODY4XHU2NjBlXHUzMDRjXHU2NzAwXHU2NWIwXHU4ODY4XHU3OTNhXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfTk9fSU5DT01QTEVURV9BU1NFUlRJT05fU0VMRUNURUQ9SVdBQjAzMjZFIFx1NWMxMVx1MzA2YVx1MzA0Zlx1MzA2OFx1MzA4MiAxIFx1MzA2NFx1MzA2ZVx1NGUwZFx1NWI4Y1x1NTE2OFx1MzA2YVx1MzBkMVx1MzBkNlx1MzBlYVx1MzBjM1x1MzBiN1x1MzBlM1x1MzBmY1x1ODg2OFx1NjYwZVx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX05PVF9PV05FRF9CVVNJTkVTUz1JV0FCMDMyN0UgXHUzMDUzXHUzMDZlXHU2NGNkXHU0ZjVjXHUzMDZmXHUzMDAxXHU1MjI1XHUzMDZlXHU5NWEyXHU0ZmMyXHU4MDA1XHUzMDZiXHUzMDg4XHUzMDYzXHUzMDY2XHU2MjQwXHU2NzA5XHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDhiXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZiXHU1YmZlXHUzMDU3XHUzMDY2XHUzMDZmXHU1YjlmXHU4ODRjXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCi0KLSMgR2V0QnVzaW5lc3NlcwotQUxUX0dFVF9CVVNJTkVTUz1cdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwNmVcdTUzZDZcdTVmOTcKLUFMVF9HRVRfQlVTSU5FU1NFUz1cdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwNmVcdTUzZDZcdTVmOTcKLU5PREVfTkFNRV9TRVJWSUNFX0JVU0lORVNTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOSAlMSBcdTMwNmVcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjkKLU5PREVfTkFNRV9TSV9CVVNJTkVTU0VTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOSAlMSBcdTMwNmVcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjkKLU1TR19RVUVTVElPTl9SRU1PVkVfU0VSVklDRV9OT0RFPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA0Y1x1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2N1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTMwNTNcdTMwNmVcdTMwY2VcdTMwZmNcdTMwYzlcdTMwOTJcdTk2NjRcdTUzYmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/Ci0KLSMgR2V0U2VydmljZUludGVyZmFjZXMKLUFMVF9HRVRfU0VSVklDRV9JTlRFUkZBQ0VTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOVx1MzA2ZVx1NTNkNlx1NWY5NwotTk9ERV9OQU1FX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOSAlMSBcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjkKLU1TR19RVUVTVElPTl9HRVRfU0lfUkVNT1ZFX1NFUlZJQ0VfTk9ERT1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNGNcdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNjdcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIgXHUzMDUzXHUzMDZlXHUzMGNlXHUzMGZjXHUzMGM5XHUzMDkyXHU5NjY0XHU1M2JiXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPwotCi0jIEdldFNlcnZpY2VzCi1BTFRfR0VUX1NFUlZJQ0VTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA2ZVx1NTNkNlx1NWY5NwotTk9ERV9OQU1FX1NJX1NFUlZJQ0VTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOSAlMSBcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKLU5PREVfTkFNRV9CVVNJTkVTU19TRVJWSUNFUz1cdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjkgJTEgXHUzMDZlXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5Ci1NU0dfUVVFU1RJT05fUkVNT1ZFX1NJX05PREU9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGE0XHUzMGYzXHUzMGJmXHUzMGZjXHUzMGQ1XHUzMGE3XHUzMGZjXHUzMGI5XHUzMDRjXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDY3XHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyIFx1MzA1M1x1MzA2ZVx1MzBjZVx1MzBmY1x1MzBjOVx1MzA5Mlx1OTY2NFx1NTNiYlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8KLU1TR19RVUVTVElPTl9SRU1PVkVfQlVTSU5FU1NfTk9ERT1cdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwNGNcdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNjdcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIgXHUzMDUzXHUzMDZlXHUzMGNlXHUzMGZjXHUzMGM5XHUzMDkyXHU5NjY0XHU1M2JiXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPwotCi0jIFJlZnJlc2hVRERJTm9kZXNBY3Rpb24KLU1TR19FUlJPUl9OT0RFX0RBVEFfVkFMSURBVElPTl9GQUlMRUQ9SVdBQjAyNzJFICUxIFx1MzA0Y1x1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2N1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMgotCi0jIFN1bW1hcmllcwotQUxUX1NVTU1BUllfUVVFUklFUz1cdTcxNjdcdTRmMWFcdTMwNmVcdTg5ODFcdTdkMDQKLUFMVF9TVU1NQVJZX0JVU0lORVNTRVM9XHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHU4OTgxXHU3ZDA0Ci1BTFRfU1VNTUFSWV9TRVJWSUNFUz1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTg5ODFcdTdkMDQKLUFMVF9TVU1NQVJZX1NFUlZJQ0VfSU5URVJGQUNFUz1cdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwZmJcdTMwYTRcdTMwZjNcdTMwYmZcdTMwZmNcdTMwZDVcdTMwYTdcdTMwZmNcdTMwYjlcdTMwNmVcdTg5ODFcdTdkMDQKLUZPUk1fTEFCRUxfUVVFUklFUz1cdTcxNjdcdTRmMWEKLQotIyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24KLU1TR19RVUVTVElPTl9JVEVNX1ZBTElEQVRJT05fRkFJTEVEPSUxIFx1MzA0Y1x1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2N1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMiBcdTk2NjRcdTUzYmJcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/Ci0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPVx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9XHUzMGNhXHUzMGQzXHUzMGIyXHUzMGZjXHUzMGJmXHUzMGZjXHUzMGZiXHUzMGM0XHUzMGZjXHUzMGViXHUzMGQwXHUzMGZjCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1cdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPVx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMGZjCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGM0XHUzMGZjXHUzMGViXHUzMGQwXHUzMGZjCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0Ci1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPVx1NzJiNlx1NmNjMVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9XHU3MmI2XHU2Y2MxXHUzMGM0XHUzMGZjXHUzMGViXHUzMGQwXHUzMGZjCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1cdTcyYjZcdTZjYzFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLUZSQU1FX1RJVExFX1VERElfUEVSU1BFQ1RJVkVfQ09OVEVOVD1VRERJIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNAotRlJBTUVfVElUTEVfQ0FURUdPUklFU19XT1JLQVJFQT1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTRmNWNcdTY5NmRcdTMwYThcdTMwZWFcdTMwYTIKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfVE9PTEJBUj1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYzRcdTMwZmNcdTMwZWJcdTMwZDBcdTMwZmMKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfQ09OVEVOVD1cdTMwYWJcdTMwYzZcdTMwYjRcdTMwZWFcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1XU0RMIFx1MzBkNlx1MzBlOVx1MzBhNlx1MzBiNlx1MzBmY1x1MzBmYlx1MzBjNFx1MzBmY1x1MzBlYlx1MzBkMFx1MzBmYwotRlJBTUVfVElUTEVfV1NETF9DT05URU5UPVdTREwgXHUzMGQ2XHUzMGU5XHUzMGE2XHUzMGI2XHUzMGZjXHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0Ci0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfQlVTSU5FU1NfREVUQUlMUz1cdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdThhNzNcdTdkMzBcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFPVx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1NTE2Y1x1OTU4Ylx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1NjZmOFx1NWYwZgotRk9STV9USVRMRV9HRVRfRk9STT1cdTc2N2FcdTg5OGJcdTMwN2VcdTMwNWZcdTMwNmZcdTUxNmNcdTk1OGJcdTMwNTVcdTMwOGNcdTMwNWZcdTMwYWFcdTMwZDZcdTMwYjhcdTMwYTdcdTMwYWZcdTMwYzhcdTY2ZjhcdTVmMGZcdTMwNGJcdTMwODlcdTkwNzhcdTYyOWUKLUZPUk1fVElUTEVfSVRFTVNfU1VNTUFSWT1cdTk4MDVcdTc2ZWVcdTY2ZjhcdTVmMGZcdTMwNmVcdTg5ODFcdTdkMDQKLUZPUk1fVElUTEVfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPVx1MzBkMVx1MzBkNlx1MzBlYVx1MzBjM1x1MzBiN1x1MzBlM1x1MzBmY1x1ODg2OFx1NjYwZVx1NjZmOFx1NWYwZlx1MzA2ZVx1N2JhMVx1NzQwNgotRk9STV9USVRMRV9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFUz1cdTUzYzJcdTcxNjdcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTY2ZjhcdTVmMGZcdTMwNmVcdTdiYTFcdTc0MDYKLUZPUk1fVElUTEVfT1BFTl9SRUdJU1RSWT1cdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTY2ZjhcdTVmMGZcdTMwOTJcdTk1OGJcdTMwNGYKLUZPUk1fVElUTEVfUkVHSVNUUllfREVUQUlMUz1cdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdThhNzNcdTdkMzBcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfUkVHSVNUUllfUFVCTElTSD1cdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTUxNmNcdTk1OGJcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfUkVHSVNUUllfRklORD1cdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTY5MWNcdTdkMjJcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfUkVTVUxUUz1cdTdkNTBcdTY3OWNcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfU0VSVklDRV9ERVRBSUxTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1OGE3M1x1N2QzMFx1NjZmOFx1NWYwZgotRk9STV9USVRMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBhNFx1MzBmM1x1MzBiZlx1MzBmY1x1MzBkNVx1MzBhN1x1MzBmY1x1MzBiOVx1OGE3M1x1N2QzMFx1NjZmOFx1NWYwZgotRk9STV9USVRMRV9VTlBVQkxJU0g9XHU5NzVlXHU1MTZjXHU5NThiXHU2NmY4XHU1ZjBmCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX2tvLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX2tvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmQ4NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaV9rby5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVVEREkKLQotIyBOb2RlcwotTk9ERV9OQU1FX1VERElfTUFJTj1VRERJIFx1YWUzMFx1YmNmOAotTk9ERV9OQU1FX1FVRVJJRVNfRk9MREVSPVx1YzJlNFx1ZDU4OVx1YjQxYyBcdWM4NzBcdWQ2OGMKLU5PREVfTkFNRV9QVUJMSVNIRURfQlVTSU5FU1NFU19GT0xERVI9XHVhY2Y1XHVhYzFjXHViNDFjIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNAotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFU19GT0xERVI9XHVhY2Y1XHVhYzFjXHViNDFjIFx1YzExY1x1YmU0NFx1YzJhNAotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFX0lOVEVSRkFDRVNfRk9MREVSPVx1YWNmNVx1YWMxY1x1YjQxYyBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0Ci0KLSMgT3BlblJlZ2lzdHJ5QWN0aW9uCi1BTFRfT1BFTl9SRUdJU1RSWT1cdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWMgXHVjNWY0XHVhZTMwCi1GT1JNX0xBQkVMX09QRU5fUkVHSVNUUllfREVTQz1cdWM1ZjRcdWI5YWNcdWIyOTQgXHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjXHVjNzU4IFx1Yzc3NFx1Yjk4NCBcdWJjMGYgXHVjODcwXHVkNjhjIFVSTFx1Yzc0NCBcdWM5YzBcdWM4MTVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBcdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWNcdWI5N2MgXHVjMTIwXHVkMGRkXHVkNTU4XHViYTc0IFx1Yzc5MFx1YjNkOVx1YzczY1x1Yjg1YyBcdWQ1NDRcdWMyMTggXHVjODE1XHViY2Y0XHVhYzAwIFx1Y2M0NFx1YzZjY1x1YzlkMVx1YjJjOFx1YjJlNC4gXHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjXHViOTdjIFx1YzVmNFx1YjgyNFx1YmE3NCA8c3Ryb25nPlx1Yzc3NFx1YjNkOTwvc3Ryb25nPlx1Yzc0NCBcdWIyMDRcdWI5NzRcdWMyZWRcdWMyZGNcdWM2MjQuCi1GT1JNX0xBQkVMX0ZBVk9SSVRFX1JFR0lTVFJZPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBcdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWMKLUZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRT1cdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWMgXHVjNzc0XHViOTg0Ci1GT1JNX0xBQkVMX0lOUVVJUllfVVJMPVx1Yzg3MFx1ZDY4YyBVUkwKLUZPUk1fTEFCRUxfQ0hFQ0tfVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVM9XHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVkNjU1XHVjNzc4Ci1ERUZBVUxUX1JFR0lTVFJZX05BTUU9SUJNIFVEREkgXHVkMTRjXHVjMmE0XHVkMmI4IFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhYwotTVNHX0VSUk9SX0lOVkFMSURfUkVHSVNUUllfTkFNRT1JV0FCMDEzNkUgXHVjNjJjXHViYzE0XHViOTc4IFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhYyBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX0lOVkFMSURfSU5RVUlSWV9VUkw9SVdBQjAxMzhFIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM4NzBcdWQ2OGMgVVJMXHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLU1TR19JTkZPX1JFR0lTVFJZX09QRU5FRD1JV0FCMDEzOUkgJTJcdWM1ZDAgXHVjNzA0XHVjZTU4XHVkNTVjICUxIFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhY1x1YWMwMCBcdWM1ZjRcdWI4MzhcdWMyYjVcdWIyYzhcdWIyZTQuCi1GT1JNX0xBQkVMX0lTX1dFQlNQSEVSRV9VRERJX1JFR0lTVFJZPVdlYlNwaGVyZSBVRERJIFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhY1x1Yzc4NVx1YjJjOFx1YWU0Yz8KLURFRkFVTFRfUkVHSVNUUllfTkFNRV9XRUJTUEhFUkU9SUJNIFdlYlNwaGVyZSBcdWMwYWNcdWMxMjQgVURESSBcdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWMKLUZPUk1fTEFCRUxfUkVHSVNUUllfSE9TVD1cdWQ2MzhcdWMyYTRcdWQyYjgKLUZPUk1fTEFCRUxfUkVHSVNUUllfUE9SVD1cdWQzZWNcdWQyYjgKLQotIyBVc2VyLWRlZmluZWQgQ2F0ZWdvcmllcwotRk9STV9MQUJFTF9BRERfQ0FURUdPUllfREFUQT1cdWM3NzQgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1YjM3MFx1Yzc3NFx1ZDEzMFx1Yjk3YyBcdWI4NWNcdWI0ZGNcdWQ1NThcdWI4MjRcdWJhNzQgPGEgaHJlZj0iJTEiPlx1YzVlY1x1YWUzMFx1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQ8L2E+LgotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0ZJTEU9XHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1YjM3MFx1Yzc3NFx1ZDEzMCBcdWQzMGNcdWM3N2MgXHVjNzc0XHViOTg0Ci1NU0dfSU5GT19OT19VU0VSX0RFRklORURfQ0FURUdPUklFU19GT1VORD1JV0FCMDM3MUkgXHViYzFjXHVhY2FjXHViNDFjIFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjXHVhYzAwIFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19JTkZPX05PX0NBVEVHT1JZX0RBVEE9SVdBQjAzNzJJICUxXHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWIzNzBcdWM3NzRcdWQxMzBcdWI5N2MgXHVjMGFjXHVjNmE5XHVkNTYwIFx1YzIxOCBcdWM1YzZcdWFjNzBcdWIwOTggXHVjNzIwXHVkNmE4XHVkNTU4XHVjOWMwIFx1YzU0YVx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19JTkZPX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0xPQURFRD1JV0FCMDM3M0kgXHVjMGFjXHVjNmE5XHVjNzkwIFx1YzgxNVx1Yzc1OCBcdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgJTFcdWM3NTggXHViMzcwXHVjNzc0XHVkMTMwXHVhYzAwIFx1Yjg1Y1x1YjRkY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfS0VZPUlXQUIwMzc0RSBcdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyAlMVx1Yzc1OCBcdWM3MjBcdWQ2YThcdWQ1NThcdWM5YzAgXHVjNTRhXHVjNzQwIFx1YjM3MFx1Yzc3NFx1ZDEzMCBcdWQzMGNcdWM3N2MuIFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWQwYTQgJyUyJ1x1Yzc0NChcdWI5N2MpIFx1Y2MzZVx1YzU1OFx1YzczY1x1YjA5OCAnJTMnXHVjNzQ0KFx1Yjk3YykgXHVjNjA4XHVjMGMxXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRV9GT1JNQVQ9SVdBQjA0NzNFIFx1ZDU4OVx1YzVkMCBcdWM1NGMgXHVjMjE4IFx1YzVjNlx1YjI5NCBcdWQ2MTVcdWMyZGQ6IFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjICUyXHVjNzU4IFx1YjM3MFx1Yzc3NFx1ZDEzMCBcdWQzMGNcdWM3N2MgXHVjOTExICUxLiBcdWQ1ODlcdWM3NDAgIiUzIlx1Yzc4NVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEU9SVdBQjAzNzVFIFx1YzBhY1x1YzZhOVx1Yzc5MCBcdWM4MTVcdWM3NTggXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjICUxXHVjNzU4IFx1YzcyMFx1ZDZhOFx1ZDU1OFx1YzljMCBcdWM1NGFcdWM3NDAgXHViMzcwXHVjNzc0XHVkMTMwIFx1ZDMwY1x1Yzc3Yy4KLU1TR19FUlJPUl9TQVZJTkdfQ0FURUdPUllfREFUQT1JV0FCMDQ3NEUgXHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjICUxXHVjNzU4IFx1YjM3MFx1Yzc3NFx1ZDEzMFx1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHViM2Q5XHVjNTQ4IFx1YzYyNFx1Yjk1OFx1YWMwMCBcdWJjMWNcdWMwZGRcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzYwOFx1YzY3OCBcdWQxNGRcdWMyYTRcdWQyYjg6ICUyCi0KLSMgVURESSBDYXRlZ29yeSBCcm93c2VyCi1USVRMRV9DQVRFR09SWV9CUk9XU0VSPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWJlMGNcdWI3N2NcdWM2YjBcdWM4MDAKLUFMVF9DQVRFR09SSUVTPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYwotCi0jIERldGFpbHMKLUFMVF9SRUdJU1RSWV9ERVRBSUxTPVx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhYyBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQKLUFMVF9CVVNJTkVTU19ERVRBSUxTPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQKLUFMVF9TRVJWSUNFX0RFVEFJTFM9XHVjMTFjXHViZTQ0XHVjMmE0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZAotQUxUX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9XHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQKLUZPUk1fTEFCRUxfREVUQUlMU19FRElUQUJMRT08c3Ryb25nPiUxPC9zdHJvbmc+XHVjNzU4IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZFx1Yzc3NCBcdWM1NDRcdWI3OTggXHVkNDVjXHVjMmRjXHViNDI5XHViMmM4XHViMmU0LiBcdWM3N2NcdWJkODAgXHVkNTZkXHViYWE5XHVjNzQwIFx1Y2Q5NFx1YWMwMCwgXHVjODFjXHVhYzcwIFx1YjYxMFx1YjI5NCBcdWJjYzBcdWFjYmRcdWI0MjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHViY2MwXHVhY2JkXHVkNTU4XHViODI0XHViYTc0IFx1Yzc3OFx1Yzk5ZFx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhZTMwXHVkMGMwIFx1Yzg3MFx1Y2U1OFx1YjI5NCBcdWM3NzQgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNzU4IFx1YjllOCBcdWM1NDRcdWI3OThcdWM1ZDAgXHViMDk4XHVjNWY0XHViNDI5XHViMmM4XHViMmU0LgotCi0jIEdldAotQUxUX0dFVD1cdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAKLQotIyBDb21tb24gRm9ybSBDb250cm9sIFRpdGxlCi1GT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFPVx1Yzc3NFx1Yjk4NCBcdWFjMTIKLUZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFPVx1YzEyNFx1YmE4NSBcdWFjMTIKLUZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfTkFNRT1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVkMGE0IFx1Yzc3NFx1Yjk4NAotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRT1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVkMGE0IFx1YWMxMgotRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX05BTUU9SUQgXHVkMGE0IFx1Yzc3NFx1Yjk4NAotRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX1ZBTFVFPUlEIFx1ZDBhNCBcdWFjMTIKLUZPUk1fQ09OVFJPTF9USVRMRV9ESVNDT1ZFUllfVVJMPVx1YmMxY1x1YWNhYyBVUkwKLQotIyBGaW5kIGFjdGlvbnMKLUFMVF9GSU5EPVx1Y2MzZVx1YWUzMAotQUxUX1NVQlFVRVJZPSUxIFx1YmQ4MFx1YzE4ZCBcdWM4NzBcdWQ2OGMgXHVjYzNlXHVhZTMwCi1GT1JNX0xBQkVMX1FVRVJZX05BTUU9XHVjNzc0IFx1Yzg3MFx1ZDY4Y1x1Yzc1OCBcdWM3NzRcdWI5ODQKLURFRkFVTFRfUVVFUllfTkFNRT1cdWM4NzBcdWQ2OGMgXHVhY2IwXHVhY2ZjCi1ERUZBVUxUX1NVQlFVRVJZX05BTUU9JTEgLSAlMiBcdWJkODBcdWMxOGQgXHVjODcwXHVkNjhjCi1GT1JNX0xBQkVMX1NFQVJDSF9GT1I9XHVhYzgwXHVjMGM5Ci1GT1JNX09QVElPTl9CVVNJTkVTU0VTPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNAotRk9STV9PUFRJT05fU0VSVklDRVM9XHVjMTFjXHViZTQ0XHVjMmE0Ci1GT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVM9XHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNAotRk9STV9MQUJFTF9TRUFSQ0hfVFlQRT1cdWFjODBcdWMwYzkgXHVjNzIwXHVkNjE1Ci1GT1JNX1JBRElPX1NJTVBMRT1cdWIyZThcdWMyMWMKLUZPUk1fUkFESU9fQURWQU5DRUQ9XHVhY2UwXHVhZTA5Ci1GT1JNX1JBRElPX1VVSUQ9VVVJRAotRk9STV9MQUJFTF9GSU5EX0JVU0lORVNTRVNfU0lNUExFX0RFU0M9XHVhYzgwXHVjMGM5XHVkNTYwIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNFx1Yzc1OCBcdWJkODBcdWJkODQgXHViNjEwXHViMjk0IFx1YzY0NFx1YzgwNFx1ZDU1YyBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiAnJScgXHVhZTMwXHVkNjM4XHVhYzAwIFx1Yzc4NFx1Yzc1OCBcdWJiMzhcdWM3OTBcdWM2NDAgXHVjNzdjXHVjZTU4XHVkNTU4XHViMjk0IFx1YzY0MFx1Yzc3Y1x1YjRkY1x1Y2U3NFx1YjRkY1x1Yjg1YyBcdWMwYWNcdWM2YTlcdWI0MjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhYzgwXHVjMGM5XHVjNzQ0IFx1YzJlNFx1ZDU4OVx1ZDU1OFx1YjgyNFx1YmE3NCA8c3Ryb25nPlx1Yzc3NFx1YjNkOTwvc3Ryb25nPlx1Yzc0NCBcdWIyMDRcdWI5NzRcdWMyZWRcdWMyZGNcdWM2MjQuCi1GT1JNX0xBQkVMX0ZJTkRfQURWQU5DRURfREVTQz1cdWM1NDRcdWI3OTggXHViMDk4XHVjNWY0XHViNDFjIFx1ZDU1OFx1YjA5OCBcdWM3NzRcdWMwYzFcdWM3NTggXHViOWU0XHVhYzFjXHViY2MwXHVjMjE4IFx1YWMxMlx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuICclJyBcdWFlMzBcdWQ2MzhcdWFjMDAgXHVjNzc0XHViOTg0IFx1ZDE0Y1x1Yzc3NFx1YmUxNFx1Yzc1OCBcdWM3NzRcdWI5ODQgXHVkNTQ0XHViNGRjXHVjNWQwIFx1Yzc4OFx1YjI5NCBcdWM3ODRcdWM3NTggXHViYjM4XHVjNzkwXHVjNjQwIFx1Yzc3Y1x1Y2U1OFx1ZDU1OFx1YjI5NCBcdWM2NDBcdWM3N2NcdWI0ZGNcdWNlNzRcdWI0ZGNcdWI4NWMgXHVjMGFjXHVjNmE5XHViNDIwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3OFx1Yzk5ZFx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhYzgwXHVjMGM5XHVjNzQ0IFx1YzJlNFx1ZDU4OVx1ZDU1OFx1YjgyNFx1YmE3NCA8c3Ryb25nPlx1Yzc3NFx1YjNkOTwvc3Ryb25nPlx1Yzc0NCBcdWIyMDRcdWI5NzRcdWMyZWRcdWMyZGNcdWM2MjQuCi1GT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NfVVVJRF9ERVNDPVx1YWM4MFx1YzBjOVx1ZDU2MCBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWM3NTggVVVJRFx1Yjk3YyBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1YWM4MFx1YzBjOVx1Yzc0NCBcdWMyZTRcdWQ1ODlcdWQ1NThcdWI4MjRcdWJhNzQgPHN0cm9uZz5cdWM3NzRcdWIzZDk8L3N0cm9uZz5cdWM3NDQgXHViMjA0XHViOTc0XHVjMmVkXHVjMmRjXHVjNjI0LgotRk9STV9MQUJFTF9OQU1FUz1cdWM3NzRcdWI5ODQKLUZPUk1fTElOS19BREQ9XHVjZDk0XHVhYzAwCi1GT1JNX0xJTktfR0VUPVx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMAotRk9STV9MSU5LX0ZJTkQ9XHVjYzNlXHVhZTMwCi1GT1JNX0xJTktfUkVNT1ZFPVx1YzgxY1x1YWM3MAotRk9STV9MQUJFTF9PV05FRD1cdWMxOGNcdWM3MjAKLUZPUk1fTEFCRUxfUFVCTElTSF9VUkw9XHVhY2Y1XHVhYzFjIFVSTAotRk9STV9MQUJFTF9VU0VSSUQ9XHVjMGFjXHVjNmE5XHVjNzkwIElECi1GT1JNX0xBQkVMX1BBU1NXT1JEPVx1YzU1NFx1ZDYzOAotRk9STV9MQUJFTF9MQU5HVUFHRT1cdWM1YjhcdWM1YjQKLUZPUk1fTEFCRUxfTkFNRT1cdWM3NzRcdWI5ODQKLUZPUk1fTEFCRUxfREVTQ1JJUFRJT049XHVjMTI0XHViYTg1Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9FTj1cdWM2MDFcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FBPUFmYXIKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FCPUFia2hhemlhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfQUY9XHVhY2Y1XHVjNmE5IFx1YjEyNFx1YjM1Y1x1Yjc4MFx1YjRkY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfQU09XHVjNTQ0XHVkNTY4XHViNzdjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9BUj1cdWM1NDRcdWI3OGRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FTPVx1YzU0NFx1YzBiY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfQVk9XHVjNTQ0XHVjNzc0XHViOWM4XHViNzdjXHVjODcxXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9BWj1BemVyYmFpamFuaQotRk9STV9PUFRJT05fTEFOR1VBR0VfQkE9QmFzaGtpcgotRk9STV9PUFRJT05fTEFOR1VBR0VfQkU9XHViY2E4XHViODVjXHViOGU4XHVjMmRjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9CRz1cdWJkODhcdWFjMDBcdWI5YWNcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JIPUJpaGFyaQotRk9STV9PUFRJT05fTEFOR1VBR0VfQkk9QmlzbGFtYQotRk9STV9PUFRJT05fTEFOR1VBR0VfQk49XHViY2I1XHVhY2U4XHVjNWI0OyBCYW5nbGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JPPVx1ZDJmMFx1YmNhMFx1ZDJiOFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfQlI9XHViZTBjXHViOTc0XHVkMGMwXHViMjc0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9DQT1cdWNlNzRcdWQwYzhcdWI4NWNcdWIyYzhcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NPPVx1Y2Y1NFx1Yjk3NFx1YzJkY1x1Y2U3NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfQ1o9XHVjY2I0XHVjZjU0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9DWT1XZWxzaAotRk9STV9PUFRJT05fTEFOR1VBR0VfREE9XHViMzc0XHViOWM4XHVkMDZjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9ERT1cdWIzYzVcdWM3N2NcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RaPUJodXRhbmkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VMPVx1YWRmOFx1YjlhY1x1YzJhNFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfRU89XHVjNWQwXHVjMmE0XHVkMzk4XHViNzgwXHVkMWEwXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9FUz1cdWMyYTRcdWQzOThcdWM3NzhcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VUPVx1YzVkMFx1YzJhNFx1ZDFhMFx1YjJjOFx1YzU0NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfRVU9XHViYzE0XHVjMmE0XHVkMDZjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9GQT1cdWQzOThcdWI5NzRcdWMyZGNcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZJPVx1ZDU0MFx1Yjc4MFx1YjRkY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfRko9XHVkNTNjXHVjOWMwCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GTz1cdWQzOThcdWI4NWNcdWMyYTRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZSPVx1ZDUwNFx1Yjc5MVx1YzJhNFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfRlk9XHVkNTA0XHViOWFjXHVjMmFjXHViNzgwXHViNGRjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9HQT1cdWM1NDRcdWM3N2NcdWI3OWNcdWI0ZGNcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dEPVx1YzJhNFx1Y2Y1NFx1ZDA3NFx1Yjc5Y1x1YjRkYyBcdWFjZTBcdWM5YzBcdWM3NTggXHVhYzhjXHVjNzdjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9HTD1cdWFjMDhcdWI5YWNcdWMyZGNcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dOPVx1YWNmY1x1Yjc3Y1x1YjJjOFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfR1U9R3VqYXJhdGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hBPUhhdXNhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IST1cdWQ3OGNcdWI1MTRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hSPVx1ZDA2Y1x1Yjg1Y1x1YzU0NFx1ZDJmMFx1YzU0NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfSFU9XHVkNWRkXHVhYzAwXHViOWFjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9IWT1cdWM1NDRcdWI5NzRcdWJhNTRcdWIyYzhcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lBPVx1YWQ2ZFx1YzgxY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfSUU9SW50ZXJsaW5ndWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lLPUludXBpYWsKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lOPVx1Yzc3OFx1YjNjNFx1YjEyNFx1YzJkY1x1YzU0NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfSVM9XHVjNTQ0XHVjNzc0XHVjMmFjXHViNzgwXHViNGRjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9JVD1cdWM3NzRcdWQwYzhcdWI5YWNcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lXPVx1ZDc4OFx1YmUwY1x1YjlhY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfSkE9XHVjNzdjXHViY2Y4XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9KST1cdWM3NzRcdWI1MTRcdWMyZGNcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pXPVx1Yzc5MFx1YmMxNFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfS0E9XHVhZGY4XHViOGU4XHVjOWMwXHVjNTdjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9LSz1cdWNlNzRcdWM3OTBcdWQ3NTBcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tMPVx1YWRmOFx1YjliMFx1Yjc4MFx1YjRkY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfS009XHVkMDZjXHViYTU0XHViOTc0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9LTj1LYW5uYWRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTz1cdWQ1NWNcdWFkNmRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tTPVx1Y2U3NFx1YzI4OFx1YmJmOFx1Yjk3NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfS1U9S3VyZGlzaAotRk9STV9PUFRJT05fTEFOR1VBR0VfS1k9XHVkMGE0XHViOTc0XHVhZTMwXHVjMmE0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9MQT1cdWI3N2NcdWQyZjRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xOPUxpbmdhbGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xPPVx1Yjc3Y1x1YzYyNFx1YzJhNFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfTFQ9XHViOWFjXHVkMjJjXHVjNTQ0XHViMmM4XHVjNTQ0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9MVj1cdWI3N2NcdWQyYjhcdWJlNDRcdWM1NDRcdWM1YjQsIExldHRpc2gKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01HPVx1YjljOFx1YjJlNFx1Y2U3NFx1YzJhNFx1Y2U3NFx1Yjk3NAotRk9STV9PUFRJT05fTEFOR1VBR0VfTUk9XHViOWM4XHVjNjI0XHViOWFjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9NSz1cdWI5YzhcdWNmMDBcdWIzYzRcdWIyYzhcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01MPU1hbGF5YWxhbQotRk9STV9PUFRJT05fTEFOR1VBR0VfTU49XHViYWJkXHVhY2U4XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9NTz1Nb2xkYXZpYW4KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01SPU1hcmF0aGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01TPVx1YjlkMFx1YjgwOFx1Yzc3NFx1YzJkY1x1YzU0NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfTVQ9XHViYWIwXHVkMGMwXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9NWT1cdWJjODRcdWI5YzhcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05BPVx1YjA5OFx1YzZiMFx1YjhlOFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfTkU9XHViMTI0XHVkMzE0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9OTD1cdWIxMjRcdWIzNWNcdWI3ODBcdWI0ZGNcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05PPVx1YjE3OFx1Yjk3NFx1YzZlOFx1Yzc3NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfT0M9T2NjaXRhbgotRk9STV9PUFRJT05fTEFOR1VBR0VfT009KEFmYW4pIFx1YzYyNFx1Yjg1Y1x1YmFhOFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfT1I9T3JpeWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BBPVx1ZDM4MFx1Yzc5MFx1YmUwY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfUEw9XHVkM2Y0XHViNzgwXHViNGRjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9QUz1cdWQzMGNcdWMyODhcdWQxYTBcdWM1YjQsIFB1c2h0bwotRk9STV9PUFRJT05fTEFOR1VBR0VfUFQ9XHVkM2VjXHViOTc0XHVkMjJjXHVhYzA4XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9RVT1cdWNmMDBcdWNkOTRcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JNPVx1YjgwOFx1ZDFhMFx1Yjg1Y1x1YjljY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfUk49S2lydW5kaQotRk9STV9PUFRJT05fTEFOR1VBR0VfUk89XHViOGU4XHViOWM4XHViMmM4XHVjNTQ0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9SVT1cdWI3ZWNcdWMyZGNcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JXPUtpbnlhcndhbmRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TQT1cdWMwYjBcdWMyYTRcdWQwNmNcdWI5YWNcdWQyYjhcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NEPVx1YzJlMFx1YjRkY1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfU0c9U2FuZ3JvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TSD1cdWMxMzhcdWI5NzRcdWJjZjRcdWQwNmNcdWI4NWNcdWM1NDRcdWQyZjBcdWM1NDQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NJPVNpbmdoYWxlc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NLPVx1YzJhY1x1Yjg1Y1x1YmMxNFx1ZDBhNFx1YzU0NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfU0w9XHVjMmFjXHViODVjXHViY2EwXHViMmM4XHVjNTQ0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TTT1cdWMwYWNcdWJhYThcdWM1NDRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NOPVNob25hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTz1cdWMxOGNcdWI5ZDBcdWI5YWNcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NRPVx1YzU0Y1x1YmMxNFx1YjJjOFx1YzU0NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfU1I9XHVjMTM4XHViOTc0XHViZTQ0XHVjNTQ0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TUz1TaXN3YXRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVD1TZXNvdGhvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVT1TdW5kYW5lc2UKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NWPVx1YzJhNFx1YzZlOFx1YjM3NFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfU1c9XHVjMmE0XHVjNjQwXHVkNzkwXHViOWFjXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9UQT1cdWQwYzBcdWJjMDBcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RFPVRlZ3VsdQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEc9XHVkMGMwXHVjOWMwXHVkMGE0XHVjMmE0XHVkMGM0XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9USD1cdWQwZGNcdWFkNmRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RJPVx1ZDJmMFx1YWRmOFx1YjlhY1x1YjBkMFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfVEs9XHVkMjJjXHViOTc0XHVkMDZjXHViYTU4XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9UTD1cdWQwYzBcdWFjMDhcdWI4NWNcdWFkZjhcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ROPVNldHN3YW5hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTz1cdWQxYjVcdWFjMDBcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RSPVx1ZDEzMFx1ZDBhNFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfVFM9VHNvbmdhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVD1cdWQwYzBcdWQwYzBcdWI5NzRcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RXPVR3aQotRk9STV9PUFRJT05fTEFOR1VBR0VfVUs9XHVjNmIwXHVkMDZjXHViNzdjXHVjNzc0XHViMDk4XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9VUj1cdWM2YjBcdWI5NzRcdWI0NTBcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VaPVx1YzZiMFx1Yzk4OFx1YmNhMFx1ZDA2Y1x1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfVkk9XHViY2EwXHVkMmI4XHViMGE4XHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9WTz1cdWJjZmNcdWI3N2NcdWQ0Y2NcdWQwNmNcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1dPPVdvbG9mCi1GT1JNX09QVElPTl9MQU5HVUFHRV9YSD1cdWNmNTRcdWMwYWNcdWM1YjQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1lPPVx1YzY5NFx1YjhlOFx1YmMxNFx1YzViNAotRk9STV9PUFRJT05fTEFOR1VBR0VfWkg9XHVjOTExXHVhZDZkXHVjNWI0Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9aVT1cdWM5MDRcdWI4ZThcdWM1YjQKLUZPUk1fTEFCRUxfRVhBQ1RfTkFNRV9NQVRDSD1cdWM4MTVcdWQ2NTVcdWQ1NThcdWFjOGMgXHVjNzdjXHVjZTU4Ci1GT1JNX0xBQkVMX0NBU0VfU0VOU0lUSVZFX01BVENIPVx1YjMwMFx1YzE4Y1x1YmIzOFx1Yzc5MCBcdWFkNmNcdWJkODQKLUZPUk1fTEFCRUxfU09VTkRFWD1cdWMwYWNcdWM2YjRcdWI0ZGMgXHVjNzIwXHVjMGFjCi1GT1JNX0xBQkVMX0lERU5USUZJRVJTPUlECi1GT1JNX0xBQkVMX0lERU5USUZJRVJfVFlQRT1cdWM3MjBcdWQ2MTUKLQotIyBEbyBub3QgdHJhbnNsYXRlIHRoZSB0d28gaXRlbXMgYmVsb3cuCi1GT1JNX09QVElPTl9JREVOVElGSUVSX0RVTlM9RC1VLU4tUwotRk9STV9PUFRJT05fSURFTlRJRklFUl9USE9NQVNfUkVHSVNUUlk9VGhvbWFzIFJlZ2lzdHJ5Ci0KLUZPUk1fTEFCRUxfS0VZX05BTUU9XHVkMGE0IFx1Yzc3NFx1Yjk4NAotRk9STV9MQUJFTF9LRVlfVkFMVUU9XHVkMGE0IFx1YWMxMgotRk9STV9MQUJFTF9DQVRFR09SSUVTPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYwotRk9STV9MQUJFTF9DQVRFR09SWV9UWVBFPVx1YzcyMFx1ZDYxNQotRk9STV9PUFRJT05fQ0FURUdPUllfTkFJQ1M9TkFJQ1MKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX1VOU1BTQ183Mz1VTlNQU0MgNy4zCi1GT1JNX09QVElPTl9DQVRFR09SWV9HRU89R0VPCi1GT1JNX09QVElPTl9DQVRFR09SWV9EV0NPTU1VTklUWT1kVyBDb21tdW5pdHkKLUZPUk1fTEFCRUxfQlVTSU5FU1NfQ0FURUdPUklFUz1cdWJlNDRcdWFkNTA6Ci1GT1JNX09QVElPTl9CVVNJTkVTU0VTX09OTFk9XHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0XHViOWNjCi1GT1JNX09QVElPTl9TRVJWSUNFU19PTkxZPVx1YzExY1x1YmU0NFx1YzJhNFx1YjljYwotRk9STV9PUFRJT05fQk9USD1cdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHViYzBmIFx1YzExY1x1YmU0NFx1YzJhNAotRk9STV9MQUJFTF9ESVNDT1ZFUllVUkxTPVx1YmMxY1x1YWNhYyBVUkwKLUZPUk1fTEFCRUxfRElTQ09WRVJZVVJMPVx1YmMxY1x1YWNhYyBVUkwKLUZPUk1fTEFCRUxfRklORFFVQUxJRklFUlM9XHVhZGRjXHVjODE1XHVjNzkwIFx1Y2MzZVx1YWUzMAotRk9STV9MQUJFTF9DT01CSU5FX0tFWVM9XHVhY2IwXHVkNTY5IFx1ZDBhNDoKLUZPUk1fT1BUSU9OX0FOREFMTEtFWVM9XHViYzBmCi1GT1JNX09QVElPTl9PUkFMTEtFWVM9XHViNjEwXHViMjk0Ci1GT1JNX09QVElPTl9PUkxJS0VLRVlTPVx1YjYxMFx1YjI5NCBMaWtlCi1GT1JNX0xBQkVMX1NPUlRfQllfTkFNRT1cdWM3NzRcdWI5ODRcdWJjYzQgXHVjODE1XHViODJjOgotRk9STV9SQURJT19TT1JUX0FTQz1cdWM2MjRcdWI5ODRcdWNjMjhcdWMyMWMKLUZPUk1fUkFESU9fU09SVF9ERVNDPVx1YjBiNFx1YjliY1x1Y2MyOFx1YzIxYwotRk9STV9MQUJFTF9TT1JUX0JZX0RBVEU9XHViMGEwXHVjOWRjXHViY2M0IFx1YzgxNVx1YjgyYzoKLUZPUk1fTEFCRUxfTUFYX1NFQVJDSF9TRVQ9XHVhYzgwXHVjMGM5IFx1YzEzOFx1ZDJiOFx1Yzc1OCBcdWNkNWNcdWIzMDAgXHVkMDZjXHVhZTMwOgotRk9STV9MQUJFTF9NQVhfUkVTVUxUUz1cdWNkNWNcdWIzMDAgXHVhY2IwXHVhY2ZjIFx1YzIxODoKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFU19TSU1QTEVfREVTQz1cdWFjODBcdWMwYzlcdWQ1NjAgXHVjMTFjXHViZTQ0XHVjMmE0XHVjNzU4IFx1YmQ4MFx1YmQ4NCBcdWI2MTBcdWIyOTQgXHVjNjQ0XHVjODA0XHVkNTVjIFx1Yzc3NFx1Yjk4NFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuICclJyBcdWFlMzBcdWQ2MzhcdWFjMDAgXHVjNzg0XHVjNzU4IFx1YmIzOFx1Yzc5MFx1YzY0MCBcdWM3N2NcdWNlNThcdWQ1NThcdWIyOTQgXHVjNjQwXHVjNzdjXHViNGRjXHVjZTc0XHViNGRjXHViODVjIFx1YzBhY1x1YzZhOVx1YjQyMCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWFjODBcdWMwYzlcdWM3NDQgXHVjMmU0XHVkNTg5XHVkNTU4XHViODI0XHViYTc0IDxzdHJvbmc+XHVjNzc0XHViM2Q5PC9zdHJvbmc+XHVjNzQ0IFx1YjIwNFx1Yjk3NFx1YzJlZFx1YzJkY1x1YzYyNC4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX1VVSURfREVTQz1cdWFjODBcdWMwYzlcdWQ1NjAgXHVjMTFjXHViZTQ0XHVjMmE0XHVjNzU4IFVVSURcdWI5N2MgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWFjODBcdWMwYzlcdWM3NDQgXHVjMmU0XHVkNTg5XHVkNTU4XHViODI0XHViYTc0IDxzdHJvbmc+XHVjNzc0XHViM2Q5PC9zdHJvbmc+XHVjNzQ0IFx1YjIwNFx1Yjk3NFx1YzJlZFx1YzJkY1x1YzYyNC4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRVNfU0lNUExFX0RFU0M9XHVhYzgwXHVjMGM5XHVkNTYwIFx1YzExY1x1YmU0NFx1YzJhNCBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTRcdWM3NTggXHViZDgwXHViZDg0IFx1YjYxMFx1YjI5NCBcdWM2NDRcdWM4MDRcdWQ1NWMgXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gJyUnIFx1YWUzMFx1ZDYzOFx1YWMwMCBcdWM3ODRcdWM3NTggXHViYjM4XHVjNzkwXHVjNjQwIFx1Yzc3Y1x1Y2U1OFx1ZDU1OFx1YjI5NCBcdWM2NDBcdWM3N2NcdWI0ZGNcdWNlNzRcdWI0ZGNcdWI4NWMgXHVjMGFjXHVjNmE5XHViNDIwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YWM4MFx1YzBjOVx1Yzc0NCBcdWMyZTRcdWQ1ODlcdWQ1NThcdWI4MjRcdWJhNzQgPHN0cm9uZz5cdWM3NzRcdWIzZDk8L3N0cm9uZz5cdWM3NDQgXHViMjA0XHViOTc0XHVjMmVkXHVjMmRjXHVjNjI0LgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFX1VVSURfREVTQz1cdWFjODBcdWMwYzlcdWQ1NjAgXHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNFx1Yzc1OCBVVUlEXHViOTdjIFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVhYzgwXHVjMGM5XHVjNzQ0IFx1YzJlNFx1ZDU4OVx1ZDU1OFx1YjgyNFx1YmE3NCA8c3Ryb25nPlx1Yzc3NFx1YjNkOTwvc3Ryb25nPlx1Yzc0NCBcdWIyMDRcdWI5NzRcdWMyZWRcdWMyZGNcdWM2MjQuCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFUz1cdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0Ci1GT1JNX0xBQkVMX1VVSURfS0VZPVVVSUQgXHVkMGE0OgotRk9STV9MQUJFTF9VU0VfU0VSVklDRT1cdWMwYWNcdWM2YTkgXHVjMTFjXHViZTQ0XHVjMmE0Ci1GT1JNX0xBQkVMX1NFUlZJQ0U9XHVjMTFjXHViZTQ0XHVjMmE0Ci1GT1JNX0xBQkVMX0JVU0lORVNTPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNAotRk9STV9MQUJFTF9QVUJMSVNIX0FTU0VSVElPTlM9XHVhY2Y1XHVhYzFjXHVjNzkwIFx1YzEyMFx1YzViOFx1YmIzOAotRk9STV9MQUJFTF9ESVJFQ1RJT049XHVjOWMwXHVjMmRjXHViYjM4Ci1GT1JNX0xBQkVMX0ZST01fS0VZPUZyb20gXHVkMGE0Ci1GT1JNX0xBQkVMX1RPX0tFWT1UbyBcdWQwYTQKLUZPUk1fTEFCRUxfU1RBVFVTPVx1YzBjMVx1ZDBkYwotRk9STV9MQUJFTF9BU1NFUlRJT05fVFlQRT1cdWMxMjBcdWM1YjhcdWJiMzggXHVjNzIwXHVkNjE1Ci1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QQVJFTlRfQ0hJTEQ9XHVjMGMxXHVjNzA0LVx1ZDU1OFx1YzcwNAotRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEVFUl9UT19QRUVSPVx1ZDUzY1x1YzViNC1cdWQ1M2NcdWM1YjQKLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX0lERU5USVRZPVx1YzJkZFx1YmNjNAotRk9STV9MQUJFTF9BU1NFUlRJT05fRElSRVRJT05fREVTQz1cdWM5YzBcdWMyZGNcdWJiMzggPHN0cm9uZz5Gcm9tPC9zdHJvbmc+XHVjNzQwIFx1Yzc3NCBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWM1ZDBcdWMxMWMgXHVjNzA0XHVjNzU4IFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNFx1Yjg1YyBcdWFjZjVcdWFjMWNcdWM3OTAgXHVjMTIwXHVjNWI4XHViYjM4KFB1Ymxpc2hlciBBc3NlcnRpb24pXHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU2OVx1YjJjOFx1YjJlNC4gXHVjOWMwXHVjMmRjXHViYjM4IDxzdHJvbmc+VG88L3N0cm9uZz5cdWIyOTQgXHVjNzA0XHVjNzU4IFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNFx1YzVkMFx1YzExYyBcdWM3NzQgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0XHViODVjIFx1YWNmNVx1YWMxY1x1Yzc5MCBcdWMxMjBcdWM1YjhcdWJiMzhcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTY5XHViMmM4XHViMmU0LgotRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9GUk9NPS0tLT4KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9ESVJFQ1RJT05fVE89PC0tLQotRk9STV9MQUJFTF9USElTX0JVU0lORVNTPVx1Yzc3NFx1YWM4MwotTVNHX0VSUk9SX0lOVkFMSURfUVVFUllfTkFNRT1JV0FCMDE0MEUgXHVjODcwXHVkNjhjXHVjNzU4IFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX0lOVkFMSURfTkFNRVM9SVdBQjAxNDFFIFx1Yzc3Y1x1YjgyOFx1Yzc1OCBcdWM2MmNcdWJjMTRcdWI5NzggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLU1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMPUlXQUIwMTQyRSBcdWM2MmNcdWJjMTRcdWI5NzggXHVhY2Y1XHVhYzFjIFVSTFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSSUQ9SVdBQjAxNDNFIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWMwYWNcdWM2YTlcdWM3OTAgSURcdWI5N2MgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX0lOVkFMSURfTUFYX1NFQVJDSF9TRVQ9SVdBQjAxNDVFIFx1Y2Q1Y1x1YjMwMCBcdWFjODBcdWMwYzkgXHVjMTM4XHVkMmI4XHVjNzU4IFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWQwNmNcdWFlMzBcdWI5N2MgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX0lOVkFMSURfTUFYX1JFU1VMVFM9SVdBQjAxNDZFIFx1Y2Q1Y1x1YjMwMCBcdWFjYjBcdWFjZmMgXHVjMjE4XHVjNzU4IFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWQwNmNcdWFlMzBcdWI5N2MgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0N0kgXHVjYzNlXHVjNzQwIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCBcdWMyMTg6ICUxCi1NU0dfRVJST1JfTk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0OEUgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0XHViOTdjIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNDlJIFx1Y2MzZVx1Yzc0MCBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjMjE4OiAlMQotTVNHX0VSUk9SX05PX1NFUlZJQ0VTX0ZPVU5EPUlXQUIwMTUwRSBcdWMxMWNcdWJlNDRcdWMyYTRcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfRVJST1JfU0lOR0xFX0lURU09SVdBQjAxNTFFIFx1YzYyNFx1YzljMSBcdWQ1NThcdWIwOThcdWM3NTggXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLU1TR19RVUVTVElPTl9JVEVNX1JFUExBQ0VNRU5UPVx1YzEyMFx1ZDBkZFx1ZDU1OFx1YmE3NCBcdWIzMDBcdWMwYzFcdWM1ZDAgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YjI5NCBcdWQ1NmRcdWJhYTlcdWM3NDQgXHViYzE0XHVhZmM5XHViMmM4XHViMmU0LiBcdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/Ci1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQ9SVdBQjAxNTJJIFx1Y2MzZVx1Yzc0MCBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0IFx1YzIxODogJTEKLU1TR19FUlJPUl9OT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQ9SVdBQjAxNTNFIFx1YzExY1x1YmU0NFx1YzJhNCBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTRcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDE1NEUgXHVjZDVjXHVjMThjXHVkNTVjIFx1ZDU1OFx1YjA5OFx1Yzc1OCBcdWQ1NmRcdWJhYTlcdWM3NDQgXHVjMTIwXHVkMGRkXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX0lOVkFMSURfVVVJRF9LRVk9SVdBQjAxNTVFIFx1YzYyY1x1YmMxNFx1Yjk3OCBVVUlEIFx1ZDBhNFx1Yjk3YyBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi1NU0dfRVJST1JfUVVFUllfTkFNRV9DT05GTElDVD1JV0FCMDE1NkUgXHViZDgwXHVjMThkIFx1Yzg3MFx1ZDY4Y1x1Yzc1OCBcdWM4NzBcdWQ2OGMgXHVjNzc0XHViOTg0XHVjNzc0IFx1YmMxY1x1YzJlMFx1YzZkMFx1YWNmYyBcdWFjMTlcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9OT19JVEVNU19UT19HRVQ9SVdBQjAxNTdFIFx1YzljMFx1YzgxNVx1YjQxYyBcdWM3MjBcdWQ2MTVcdWM3NTggXHVkNTZkXHViYWE5XHVjNzc0IFx1YzU0NFx1YzljMSBcdWFjZjVcdWFjMWNcdWI0MThcdWFjNzBcdWIwOTggXHViYzFjXHVhY2FjXHViNDE4XHVjOWMwIFx1YzU0YVx1YzU1OFx1YzJiNVx1YjJjOFx1YjJlNC4KLQotIyBSZXN1bHRzCi1BTFRfUVVFUllfUkVTVUxUUz1cdWM4NzBcdWQ2OGMgXHVhY2IwXHVhY2ZjCi1GT1JNX0xBQkVMX1NVQlFVRVJZPVx1YjJlNFx1Yjk3OCBcdWM4NzBcdWM3OTFcdWM3NTggXHVjNzg1XHViODI1XHVjNzNjXHViODVjIFx1YWNiMFx1YWNmY1x1Yjk3YyBcdWMwYWNcdWM2YTlcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjODcwXHVjNzkxXHVjNzQ0IFx1YmNmNFx1YjgyNFx1YmE3NCBcdWI5ZTggXHVjNzA0XHVjNWQwXHVjMTFjIDxzdHJvbmc+XHViMzAwXHVjMGMxPC9zdHJvbmc+IFx1YjljMVx1ZDA2Y1x1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIDxzdHJvbmc+XHVjODA0XHVjMWExPC9zdHJvbmc+IFx1YjJlOFx1Y2Q5NFx1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHVjODcwXHVjNzkxXHVjNWQwXHVjMTFjIFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWFjYjBcdWFjZmNcdWI5N2MgXHVjMGFjXHVjNmE5XHVkNTYwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuCi1GT1JNX0xBQkVMX1FVRVJZPVx1YWNiMFx1YWNmY1x1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWM1ZWMgXHViMzU0IFx1Yzc5MFx1YzEzOFx1ZDU1YyBcdWIwYjRcdWM2YTlcdWM3NDQgXHViY2Y0XHVhYzcwXHViMDk4LCBcdWFjYjBcdWFjZmMgXHVjMTM4XHVkMmI4XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCBcdWM4NzBcdWM3OTFcdWM3NDQgXHVjMjE4XHVkNTg5XHVkNTYwIFx1YjJlOFx1Y2Q5NFx1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi1GT1JNX0xJTktfVEFSR0VUPVx1YjMwMFx1YzBjMQotRk9STV9CVVRUT05fVFJBTlNGRVI9XHVjODA0XHVjMWExCi1GT1JNX0JVVFRPTl9SRUZSRVNIPVx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzAKLUZPUk1fQlVUVE9OX0FERF9UT19GQVZPUklURVM9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVjNWQwIFx1Y2Q5NFx1YWMwMAotRk9STV9CVVRUT05fVU5QVUJMSVNIPVx1YWNmNVx1YWMxYyBcdWNkZThcdWMxOGMKLUZPUk1fQlVUVE9OX0NMRUFSPVx1YzljMFx1YzZiMFx1YWUzMAotCi0jIFB1Ymxpc2ggYWN0aW9ucwotQUxUX1BVQkxJU0g9XHVhY2Y1XHVhYzFjCi1GT1JNX0xBQkVMX1BVQkxJU0g9XHVhY2Y1XHVhYzFjOgotRk9STV9PUFRJT05fQlVTSU5FU1M9XHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0Ci1GT1JNX09QVElPTl9TRVJWSUNFPVx1YzExY1x1YmU0NFx1YzJhNAotRk9STV9PUFRJT05fU0VSVklDRV9JTlRFUkZBQ0U9XHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNAotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX1NJTVBMRV9ERVNDPVx1YWNmNVx1YWMxY1x1YjQyMCBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWM3NTggXHVjMTIwXHVkMGRkXHVjODAxIFx1YzEyNFx1YmE4NSBcdWJjMGYgXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVjNzc4XHVjOTlkXHVjNzc0IFx1ZDU0NFx1YzY5NFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX0FEVkFOQ0VEX0RFU0M9XHVhY2Y1XHVhYzFjXHViNDIwIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNFx1Yzc1OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWFlMzBcdWQwYzAgXHViOWU0XHVhYzFjXHViY2MwXHVjMjE4XHViM2M0IFx1YzljMFx1YzgxNVx1YjQyMCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzhcdWM5OWRcdWM3NzQgXHVkNTQ0XHVjNjk0XHVkNTYwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQz1cdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjI0XHVhYzcwXHViMDk4IFx1Y2MzZVx1Yzc0MCBcdWQ2YzQgXHVhY2Y1XHVhYzFjXHViNDIwIFx1YzExY1x1YmU0NFx1YzJhNFx1Yzc1OCBXU0RMIFVSTCwgXHVjNzc0XHViOTg0IFx1YmMwZiBcdWMxMjBcdWQwZGRcdWM4MDEgXHVjMTI0XHViYTg1XHVjNzQ0IFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVjNzc4XHVjOTlkXHVjNzc0IFx1ZDU0NFx1YzY5NFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQz1cdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjI0XHVhYzcwXHViMDk4IFx1Y2MzZVx1Yzc0MCBcdWQ2YzQgXHVhY2Y1XHVhYzFjXHViNDIwIFx1YzExY1x1YmU0NFx1YzJhNFx1Yzc1OCBXU0RMIFVSTCBcdWJjMGYgXHVjNzc0XHViOTg0XHVjNzQ0IFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVhZTMwXHVkMGMwIFx1YjllNFx1YWMxY1x1YmNjMFx1YzIxOFx1YjNjNCBcdWM5YzBcdWM4MTVcdWI0MjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc4XHVjOTlkXHVjNzc0IFx1ZDU0NFx1YzY5NFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0M9XHVhY2Y1XHVhYzFjXHViNDIwIFx1YzExY1x1YmU0NFx1YzJhNFx1Yzc1OCBXU0RMIFVSTCwgXHVjNzc0XHViOTg0IFx1YmMwZiBcdWMxMjBcdWQwZGRcdWM4MDEgXHVjMTI0XHViYTg1XHVjNzQ0IFx1YzgxY1x1YWNmNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVjNzc4XHVjOTlkXHVjNzc0IFx1ZDU0NFx1YzY5NFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQz1cdWFjZjVcdWFjMWNcdWI0MjAgXHVjMTFjXHViZTQ0XHVjMmE0XHVjNzU4IFdTREwgVVJMIFx1YmMwZiBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWFlMzBcdWQwYzAgXHViOWU0XHVhYzFjXHViY2MwXHVjMjE4XHViM2M0IFx1YzljMFx1YzgxNVx1YjQyMCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzhcdWM5OWRcdWM3NzQgXHVkNTQ0XHVjNjk0XHVkNTYwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0VfU0lNUExFX0RFU0M9XHVhY2Y1XHVhYzFjXHViNDIwIFx1YzExY1x1YmU0NFx1YzJhNCBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTRcdWM3NTggV1NETCBVUkwsIFx1Yzc3NFx1Yjk4NCBcdWJjMGYgXHVjMTIwXHVkMGRkXHVjODAxIFx1YzEyNFx1YmE4NVx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1Yzc3OFx1Yzk5ZFx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4KLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9BRFZBTkNFRF9ERVNDPVx1YWNmNVx1YWMxY1x1YjQyMCBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0XHVjNzU4IFdTREwgVVJMIFx1YmMwZiBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWFlMzBcdWQwYzAgXHViOWU0XHVhYzFjXHViY2MwXHVjMjE4XHViM2M0IFx1YzljMFx1YzgxNVx1YjQyMCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzhcdWM5OWRcdWM3NzQgXHVkNTQ0XHVjNjk0XHVkNTYwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuCi1GT1JNX0xBQkVMX1BVQkxJU0hfRk9STT1cdWFjZjVcdWFjMWMgXHVkNjE1XHVjMmRkCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPVx1YzEyNFx1YmE4NQotRk9STV9MQUJFTF9ERVNDUklQVElPTlM9XHVjMTI0XHViYTg1Ci1NU0dfSU5GT19CVVNJTkVTU19QVUJMSVNIRUQ9SVdBQjAxNThJICUxIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNFx1YWMwMCBcdWFjZjVcdWFjMWNcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfSU5GT19TRVJWSUNFX1BVQkxJU0hFRD1JV0FCMDE1OUkgJTEgXHVjMTFjXHViZTQ0XHVjMmE0XHVhYzAwIFx1YWNmNVx1YWMxY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1BVQkxJU0hFRD1JV0FCMDE2MEkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNCAlMVx1Yzc3NChcdWFjMDApIFx1YWNmNVx1YWMxY1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9JTlZBTElEX05BTUU9SVdBQjAxNjFFIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRT1JV0FCMDI1MEUgJTIgXHVkNTg5XHVjNWQwXHVjMTFjICUxXHVjNzU4IFx1YWNmNVx1YmMzMVx1Yzc3NCBcdWM1NDRcdWIyY2MgXHVjNWI4XHVjNWI0XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVjY2FiIFx1YmM4OFx1YzlmOCBcdWQ1ODlcdWI5Y2NcdWM3NzQgXHVhY2Y1XHViYzMxIFx1YzViOFx1YzViNFx1Yjk3YyBcdWFjMDBcdWM5YzggXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFPUlXQUIwMjUxRSAlMiBcdWQ1ODlcdWM1ZDBcdWMxMWMgJTFcdWM3NTggXHVjNWI4XHVjNWI0XHViOTdjIFx1YmNjMFx1YWNiZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVkNjA0XHVjN2FjIFx1YzViOFx1YzViNFx1Yjk3YyBcdWM3NzRcdWJiZjggXHVjMGFjXHVjNmE5IFx1YzkxMVx1Yzc4NVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUPUlXQUIwMjUyRSAlMiBcdWQ1ODlcdWM1ZDBcdWMxMWMgXHVjNjJjXHViYzE0XHViOTc4ICUxXHVjNzQ0KFx1Yjk3YykgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkw9SVdBQjAyNTNFIFx1YzYyY1x1YmMxNFx1Yjk3OCBXU0RMIFVSTFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi1NU0dfRVJST1JfTk9fTkFNRVM9SVdBQjAyNTRFIFx1Y2Q1Y1x1YzE4Y1x1ZDU1YyBcdWQ1NThcdWIwOThcdWM3NTggXHVjNzc0XHViOTg0XHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLU1TR19FUlJPUl9JTlZBTElEX1NFUlZJQ0U9SVdBQjAyNTVFIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWMxMWNcdWJlNDRcdWMyYTRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX0lOVkFMSURfQlVTSU5FU1M9SVdBQjAyNTZFIFx1YzYyY1x1YmMxNFx1Yjk3OCBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWI5N2MgXHVjODFjXHVhY2Y1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotCi0jIEJ1c2luZXNzIFB1Ymxpc2ggU2VydmljZSBhY3Rpb24KLUFMVF9QVUJMSVNIX1NFUlZJQ0U9XHVhY2Y1XHVhYzFjIFx1YzExY1x1YmU0NFx1YzJhNAotCi0jIFdTREwgQnJvd3NlcgotVElUTEVfV1NETF9CUk9XU0VSPVdTREwgXHViZTBjXHViNzdjXHVjNmIwXHVjODAwIC0gJTEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0U9V1NETCBcdWMxOGNcdWMyYTQgXHVjMTIwXHVkMGRkOgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9XRUJQUk9KRUNUUz1cdWM2ZjkgXHVkNTA0XHViODVjXHVjODFkXHVkMmI4Ci1GT1JNX0xBQkVMX1dTRExfU09VUkNFX0ZBVk9SSVRFUz1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAKLUZPUk1fTEFCRUxfV0VCX1BST0pFQ1Q9XHVjNmY5IFx1ZDUwNFx1Yjg1Y1x1YzgxZFx1ZDJiOAotRk9STV9MQUJFTF9XU0RMX1VSTD1XU0RMIFVSTAotQUxUX1dTRExfQlJPV1NFUj1XU0RMIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMAotCi0jIERldGFpbHMKLUZPUk1fTElOS19FRElUPVx1ZDNiOFx1YzlkMQotRk9STV9MSU5LX0NBTkNFTD1cdWNkZThcdWMxOGMKLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCBcdWQwYTQKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9XHVjMTFjXHViZTQ0XHVjMmE0IFx1ZDBhNAotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVk9VE1vZGVsIFx1ZDBhNAotRk9STV9MQUJFTF9VU0VSX0RFRklORURfQ0FURUdPUklFUz1cdWMwYWNcdWM2YTlcdWM3OTAgXHVjODE1XHVjNzU4IFx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYwotRk9STV9MQUJFTF9DSEVDS0VEPVx1ZDY1NVx1Yzc3OFx1YjQyOAotRk9STV9MQUJFTF9GSUxFPVx1ZDMwY1x1Yzc3YwotTVNHX1FVRVNUSU9OX1BVQkxJU0hfSVRFTT1cdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWNcdWM1ZDBcdWMxMWMgXHVkNTZkXHViYWE5XHVjNzQ0IFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWFjZjVcdWFjMWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/Ci1NU0dfUVVFU1RJT05fU0VSVklDRV9QVUJMSVNIX0JVU0lORVNTPVx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhY1x1YzVkMFx1YzExYyBcdWMxMWNcdWJlNDRcdWMyYTQgXHViYzBmIFx1ZDU3NFx1YjJmOSBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YWNmNVx1YWMxY1x1Yjk3YyBcdWFjYzRcdWMxOGRcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/Ci1NU0dfSU5GT19CVVNJTkVTU19VUERBVEVEPUlXQUIwMjU3SSAlMSBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWFjMDAgXHVhYzMxXHVjMmUwXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fU0VSVklDRV9VUERBVEVEPUlXQUIwMjU4SSAlMSBcdWMxMWNcdWJlNDRcdWMyYTRcdWFjMDAgXHVhYzMxXHVjMmUwXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfVVBEQVRFRD1JV0FCMDI1OUkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNCAlMVx1Yzc3NChcdWFjMDApIFx1YWMzMVx1YzJlMFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19JTkZPX1JFR0lTVFJZX1VQREFURUQ9SVdBQjAzMjNJICUxIFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhY1x1YWMwMCBcdWFjMzFcdWMyZTBcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuCi0KLSMgVW5wdWJsaXNoQWN0aW9uCi1BTFRfVU5QVUJMSVNIX0JVU0lORVNTPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCBcdWFjZjVcdWFjMWMgXHVjZGU4XHVjMThjCi1BTFRfVU5QVUJMSVNIX1NFUlZJQ0U9XHVjMTFjXHViZTQ0XHVjMmE0IFx1YWNmNVx1YWMxYyBcdWNkZThcdWMxOGMKLUFMVF9VTlBVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0U9XHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNCBcdWFjZjVcdWFjMWMgXHVjZGU4XHVjMThjCi1GT1JNX0xBQkVMX1VOUFVCTElTSF9ERVNDPVx1Yzc3NCBcdWM2MjRcdWJlMGNcdWM4MWRcdWQyYjhcdWI5N2MgXHVhY2Y1XHVhYzFjIFx1Y2RlOFx1YzE4Y1x1ZDU1OFx1YjgyNFx1YmE3NCA8c3Ryb25nPlx1Yzc3NFx1YjNkOTwvc3Ryb25nPlx1Yzc0NCBcdWIyMDRcdWI5NzRcdWMyZWRcdWMyZGNcdWM2MjQuIFx1Yzc3OFx1Yzk5ZFx1Yzc3NCBcdWQ1NDRcdWM2OTRcdWQ1NjAgXHVjMjE4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19JTkZPX0JVU0lORVNTX1VOUFVCTElTSEVEPUlXQUIwMjYwSSAlMSBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTRcdWFjMDAgXHVhY2Y1XHVhYzFjIFx1Y2RlOFx1YzE4Y1x1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19JTkZPX1NFUlZJQ0VfVU5QVUJMSVNIRUQ9SVdBQjAyNjFJICUxIFx1YzExY1x1YmU0NFx1YzJhNFx1YWMwMCBcdWFjZjVcdWFjMWMgXHVjZGU4XHVjMThjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfVU5QVUJMSVNIRUQ9SVdBQjAyNjJJIFx1YzExY1x1YmU0NFx1YzJhNCBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTQgJTFcdWM3NzQoXHVhYzAwKSBcdWFjZjVcdWFjMWMgXHVjZGU4XHVjMThjXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIEFkZCB0byBXU0RMIFBlcnNwZWN0aXZlCi1BTFRfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdWQzOThcdWM3NzRcdWM5YzBcdWM1ZDAgXHVjZDk0XHVhYzAwCi1NU0dfSU5GT19XU0RMX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzZJICUxXHVjNzc0KFx1YWMwMCkgV1NETCBcdWQzOThcdWM3NzRcdWM5YzBcdWM1ZDAgXHVjZDk0XHVhYzAwXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX1dTRExfTk9UX0FEREVEX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzNzdFICUxXHVjNzQ0KFx1Yjk3YykgV1NETCBcdWQzOThcdWM3NzRcdWM5YzBcdWM1ZDAgXHVjZDk0XHVhYzAwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi0KLSMgQWRkIHRvIEZhdm9yaXRlcwotQUxUX0FERF9UT19GQVZPUklURVM9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVjNWQwIFx1Y2Q5NFx1YWMwMAotTVNHX0lORk9fRkFWT1JJVEVfQURERUQ9SVdBQjAyNjNJICUxXHVjNzc0KFx1YWMwMCkgXHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9GQVZPUklURV9OT1RfQURERUQ9SVdBQjAyNjRFICUxXHVjNzQ0KFx1Yjk3YykgXHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU2MCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX0ZBVk9SSVRFX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzI0RSAlMVx1Yzc3NChcdWFjMDApIFx1Yzc3NFx1YmJmOCBcdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWM1ZDAgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVhYzAwIFx1Yzc3NFx1YmJmOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YWNiOVx1Y2NkMFx1YzRmMFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8KLQotIyBSZWZyZXNoCi1NU0dfSU5GT19OT0RFX1JFRlJFU0hFRD1JV0FCMDI2NUkgJTFcdWM3NzQoXHVhYzAwKSBcdWMwYzhcdWI4NWMgXHVhY2UwXHVjY2QwXHVjODRjXHVjMmI1XHViMmM4XHViMmU0LgotTVNHX1FVRVNUSU9OX1JFTU9WRV9OT0RFPVx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhY1x1YzVkMFx1YzExYyAlMVx1Yzc0NChcdWI5N2MpIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWMwYWRcdWM4MWNcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/Ci0KLSMgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzCi1BTFRfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVM9XHVjYzM4XHVjODcwIFx1YzExY1x1YmU0NFx1YzJhNCBcdWFkMDBcdWI5YWMKLUZPUk1fTEFCRUxfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfREVTQz08c3Ryb25nPlx1YzExY1x1YmU0NFx1YzJhNCBcdWNkOTRcdWFjMDA8L3N0cm9uZz4gXHViMmU4XHVjZDk0XHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzVlYyBcdWNjMzhcdWM4NzBcdWI0MWMgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YmFhOVx1Yjg1ZFx1YzVkMCBcdWJjMWNcdWFjYWNcdWI0MThcdWFjNzBcdWIwOTggXHVhY2Y1XHVhYzFjXHViNDFjIFx1YzExY1x1YmU0NFx1YzJhNFx1Yjk3YyBcdWNkOTRcdWFjMDBcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIDxzdHJvbmc+XHVjYzM4XHVjODcwIFx1YzgxY1x1YWM3MDwvc3Ryb25nPiBcdWIyZThcdWNkOTRcdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1YzEyMFx1ZDBkZFx1YjQxYyBcdWNjMzhcdWM4NzBcdWI5N2MgXHVjODFjXHVhYzcwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiBcdWJjYzBcdWFjYmRcdWQ1NThcdWI4MjRcdWJhNzQgXHVjNzc4XHVjOTlkXHVjNzc0IFx1ZDU0NFx1YzY5NFx1ZDU2MCBcdWMyMTggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotRk9STV9MQUJFTF9SRUZFUkVOQ0VEX1NFUlZJQ0VTPVx1Y2MzOFx1Yzg3MCBcdWMxMWNcdWJlNDRcdWMyYTQKLUZPUk1fQlVUVE9OX0FERF9TRVJWSUNFUz1cdWMxMWNcdWJlNDRcdWMyYTQgXHVjZDk0XHVhYzAwCi1GT1JNX0JVVFRPTl9SRU1PVkVfUkVGRVJFTkNFUz1cdWNjMzhcdWM4NzAgXHVjODFjXHVhYzcwCi1NU0dfRVJST1JfTk9fUkVGRVJFTkNFX1NFTEVDVEVEPUlXQUIwMjY2RSBcdWFjYzRcdWMxOGRcdWQ1NThcdWFlMzAgXHVjODA0XHVjNWQwIFx1Y2Q1Y1x1YzE4Y1x1ZDU1YyBcdWQ1NThcdWIwOThcdWM3NTggXHVjYzM4XHVjODcwIFx1YzExY1x1YmU0NFx1YzJhNFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi1NU0dfRVJST1JfTk9fU0VSVklDRVM9SVdBQjAyNjdFIFx1YWNjNFx1YzE4ZFx1ZDU1OFx1YWUzMCBcdWM4MDRcdWM1ZDAgXHVjZDVjXHVjMThjXHVkNTVjIFx1ZDU1OFx1YjA5OFx1Yzc1OCBcdWMxMWNcdWJlNDRcdWMyYTRcdWI5N2MgXHVhYzAwXHVjODM4XHVjNjI0XHVhYzcwXHViMDk4IFx1Y2MzZVx1YzczY1x1YzJlZFx1YzJkY1x1YzYyNC4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9SRUZFUkVOQ0VEPUlXQUIwMjY4RSAlMSBcdWMxMWNcdWJlNDRcdWMyYTRcdWI5N2MgXHVjYzM4XHVjODcwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfRVJST1JfUkVGRVJFTkNFX05PVF9SRU1PVkVEPUlXQUIwMjY5RSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjYzM4XHVjODcwICUxXHVjNzQ0KFx1Yjk3YykgXHVjODFjXHVhYzcwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfSU5GT19TRVJWSUNFX1JFRkVSRU5DRUQ9SVdBQjAyNzBJICUxIFx1YzExY1x1YmU0NFx1YzJhNFx1Yjk3YyBcdWNjMzhcdWM4NzBcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfSU5GT19TRVJWSUNFX1JFRkVSRU5DRV9SRU1PVkVEPUlXQUIwMjcxSSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjYzM4XHVjODcwICUxXHVjNzQ0KFx1Yjk3YykgXHVjODFjXHVhYzcwXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIE1hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnMKLUFMVF9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlM9XHVhY2Y1XHVhYzFjXHVjNzkwIFx1YzEyMFx1YzViOFx1YmIzOCBcdWFkMDBcdWI5YWMKLUZPUk1fTEFCRUxfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TX0RFU0M9PHN0cm9uZz5cdWMxMjBcdWM1YjhcdWJiMzggXHVjZDk0XHVhYzAwPC9zdHJvbmc+XHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzVlYyBcdWFjZjVcdWFjMWNcdWM3OTAgXHVjMTIwXHVjNWI4XHViYjM4IFx1YmFhOVx1Yjg1ZFx1YzVkMCBcdWJjMWNcdWFjYWNcdWI0MThcdWFjNzBcdWIwOTggXHVhY2Y1XHVhYzFjXHViNDFjIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNFx1Yjk3YyBcdWNkOTRcdWFjMDBcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIDxzdHJvbmc+XHVjMTIwXHVjNWI4XHViYjM4IFx1YzgxY1x1YWM3MDwvc3Ryb25nPlx1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHVjMTIwXHVkMGRkXHViNDFjIFx1YzEyMFx1YzViOFx1YmIzOFx1Yzc0NCBcdWM4MWNcdWFjNzBcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIDxzdHJvbmc+XHVjMTIwXHVjNWI4XHViYjM4IFx1YzY0NFx1YjhjYzwvc3Ryb25nPlx1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHVjMTIwXHVkMGRkXHViNDFjIFx1YzEyMFx1YzViOFx1YmIzOFx1Yzc0NCBcdWM2NDRcdWI4Y2NcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuIFx1YzEyMFx1YzViOFx1YmIzOCBcdWJhYTlcdWI4NWRcdWM3NDQgXHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YjgyNFx1YmE3NCA8c3Ryb25nPlx1YzEyMFx1YzViOFx1YmIzOCBcdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwPC9zdHJvbmc+XHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLUZPUk1fTEFCRUxfSU5DT01QTEVURV9BU1NFUlRJT05TX1ZJU0lCSUxJVFlfREVTQz1cdWJkODhcdWM2NDRcdWM4MDRcdWQ1NWMgXHVhY2Y1XHVhYzFjXHVjNzkwIFx1YzEyMFx1YzViOFx1YmIzOFx1Yzc0MCBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHVjMThjXHVjNzIwXHVjNzkwXHViOWNjIFx1YmNmYyBcdWMyMTggXHVjNzg4XHVjNzRjXHVjNzQ0IFx1Y2MzOFx1YWNlMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLUZPUk1fTEFCRUxfQlVTSU5FU1NFUz1cdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQKLUZPUk1fQlVUVE9OX1NIT1dfQUxMX1BVQkxJU0hFUl9BU1NFUlRJT05TPVx1YzEyMFx1YzViOFx1YmIzOCBcdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwCi1GT1JNX0JVVFRPTl9DT01QTEVURV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1cdWMxMjBcdWM1YjhcdWJiMzggXHVjNjQ0XHViOGNjCi1GT1JNX0JVVFRPTl9BRERfUFVCTElTSEVSX0FTU0VSVElPTlM9XHVjMTIwXHVjNWI4XHViYjM4IFx1Y2Q5NFx1YWMwMAotRk9STV9CVVRUT05fUkVNT1ZFX1BVQkxJU0hFUl9BU1NFUlRJT05TPVx1YzEyMFx1YzViOFx1YmIzOCBcdWM4MWNcdWFjNzAKLU1TR19JTkZPX1BVQkxJU0hFUl9BU1NFUlRJT05TX1JFRlJFU0hFRD1JV0FCMDMyNUkgXHVhY2Y1XHVhYzFjXHVjNzkwIFx1YzEyMFx1YzViOFx1YmIzOFx1Yzc0NCBcdWMwYzhcdWI4NWMgXHVhY2UwXHVjY2U0XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX05PX0lOQ09NUExFVEVfQVNTRVJUSU9OX1NFTEVDVEVEPUlXQUIwMzI2RSBcdWNkNWNcdWMxOGNcdWQ1NWMgXHVkNTU4XHViMDk4XHVjNzU4IFx1YmQ4OFx1YzY0NFx1YzgwNFx1ZDU1YyBcdWFjZjVcdWFjMWNcdWM3OTAgXHVjMTIwXHVjNWI4XHViYjM4XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLU1TR19FUlJPUl9OT1RfT1dORURfQlVTSU5FU1M9SVdBQjAzMjdFIFx1Yzc3NCBcdWM4NzBcdWM3OTFcdWM3NDAgXHViMmU0XHViOTc4IFx1YWQwMFx1YWNjNFx1Yzc5MFx1YWMwMCBcdWMxOGNcdWM3MjBcdWQ1NWMgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0XHVjNWQwXHVjMTFjIFx1YzIxOFx1ZDU4OVx1YjQyMCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIEdldEJ1c2luZXNzZXMKLUFMVF9HRVRfQlVTSU5FU1M9XHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YWMwMFx1YzgzOFx1YzYyNFx1YWUzMAotQUxUX0dFVF9CVVNJTkVTU0VTPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAKLU5PREVfTkFNRV9TRVJWSUNFX0JVU0lORVNTPVx1YzExY1x1YmU0NFx1YzJhNCAlMVx1Yzc1OCBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQKLU5PREVfTkFNRV9TSV9CVVNJTkVTU0VTPVx1YzExY1x1YmU0NFx1YzJhNCBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTQgJTFcdWM3NTggXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0Ci1NU0dfUVVFU1RJT05fUkVNT1ZFX1NFUlZJQ0VfTk9ERT1cdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWNcdWM1ZDBcdWMxMWMgXHVjMTFjXHViZTQ0XHVjMmE0XHViOTdjIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBcdWM3NzQgXHViMTc4XHViNGRjXHViOTdjIFx1YzgxY1x1YWM3MFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8KLQotIyBHZXRTZXJ2aWNlSW50ZXJmYWNlcwotQUxUX0dFVF9TRVJWSUNFX0lOVEVSRkFDRVM9XHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNCBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAKLU5PREVfTkFNRV9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUz1cdWMxMWNcdWJlNDRcdWMyYTQgJTFcdWM3NTggXHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNAotTVNHX1FVRVNUSU9OX0dFVF9TSV9SRU1PVkVfU0VSVklDRV9OT0RFPVx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhY1x1YzVkMFx1YzExYyBcdWMxMWNcdWJlNDRcdWMyYTRcdWI5N2MgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Yzc3NCBcdWIxNzhcdWI0ZGNcdWI5N2MgXHVjODFjXHVhYzcwXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPwotCi0jIEdldFNlcnZpY2VzCi1BTFRfR0VUX1NFUlZJQ0VTPVx1YzExY1x1YmU0NFx1YzJhNCBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAKLU5PREVfTkFNRV9TSV9TRVJWSUNFUz1cdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0ICUxXHVjNzU4IFx1YzExY1x1YmU0NFx1YzJhNAotTk9ERV9OQU1FX0JVU0lORVNTX1NFUlZJQ0VTPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCAlMVx1Yzc1OCBcdWMxMWNcdWJlNDRcdWMyYTQKLU1TR19RVUVTVElPTl9SRU1PVkVfU0lfTk9ERT1cdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWNcdWM1ZDBcdWMxMWMgXHVjMTFjXHViZTQ0XHVjMmE0IFx1Yzc3OFx1ZDEzMFx1ZDM5OFx1Yzc3NFx1YzJhNFx1Yjk3YyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1YjE3OFx1YjRkY1x1Yjk3YyBcdWM4MWNcdWFjNzBcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/Ci1NU0dfUVVFU1RJT05fUkVNT1ZFX0JVU0lORVNTX05PREU9XHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjXHVjNWQwXHVjMTFjIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNFx1Yjk3YyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjNzc0IFx1YjE3OFx1YjRkY1x1Yjk3YyBcdWM4MWNcdWFjNzBcdWQ1NThcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/Ci0KLSMgUmVmcmVzaFVERElOb2Rlc0FjdGlvbgotTVNHX0VSUk9SX05PREVfREFUQV9WQUxJREFUSU9OX0ZBSUxFRD1JV0FCMDI3MkUgJTFcdWM3NDQoXHViOTdjKSBcdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWNcdWM1ZDBcdWMxMWMgXHVjYzNlXHVjNzQ0IFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi0KLSMgU3VtbWFyaWVzCi1BTFRfU1VNTUFSWV9RVUVSSUVTPVx1Yzg3MFx1ZDY4Y1x1Yzc1OCBcdWM2OTRcdWM1N2QKLUFMVF9TVU1NQVJZX0JVU0lORVNTRVM9XHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0XHVjNzU4IFx1YzY5NFx1YzU3ZAotQUxUX1NVTU1BUllfU0VSVklDRVM9XHVjMTFjXHViZTQ0XHVjMmE0XHVjNzU4IFx1YzY5NFx1YzU3ZAotQUxUX1NVTU1BUllfU0VSVklDRV9JTlRFUkZBQ0VTPVx1YzExY1x1YmU0NFx1YzJhNCBcdWM3NzhcdWQxMzBcdWQzOThcdWM3NzRcdWMyYTRcdWM3NTggXHVjNjk0XHVjNTdkCi1GT1JNX0xBQkVMX1FVRVJJRVM9XHVjODcwXHVkNjhjCi0KLSMgU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uCi1NU0dfUVVFU1RJT05fSVRFTV9WQUxJREFUSU9OX0ZBSUxFRD1cdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWNcdWM1ZDBcdWMxMWMgJTFcdWM3NDQoXHViOTdjKSBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4gXHVjODFjXHVhYzcwXHVkNTU4XHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPwotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1cdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzAgXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4Ci1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1cdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzAgXHViM2M0XHVhZDZjIFx1YmFhOFx1Yzc0YwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9XHViMTI0XHViZTQ0XHVhYzhjXHVjNzc0XHVkMTMwIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9XHVjODcwXHVjZTU4IFx1Y2VlOFx1ZDE0Y1x1Yzc3NFx1YjEwOAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9XHVkMmI5XHVjMTMxIFx1Y2VlOFx1ZDE0Y1x1Yzc3NFx1YjEwOAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPVx1ZDJiOVx1YzEzMSBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9XHVkMmI5XHVjMTMxIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1cdWMwYzFcdWQwZGMgXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4Ci1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1cdWMwYzFcdWQwZGMgXHViM2M0XHVhZDZjIFx1YmFhOFx1Yzc0YwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9XHVjMGMxXHVkMGRjIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRlJBTUVfVElUTEVfVURESV9QRVJTUEVDVElWRV9DT05URU5UPVVEREkgXHVkMzk4XHVjNzc0XHVjOWMwIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRlJBTUVfVElUTEVfQ0FURUdPUklFU19XT1JLQVJFQT1cdWNlNzRcdWQxNGNcdWFjZTBcdWI5YWMgXHVjNzkxXHVjNWM1IFx1YzYwMVx1YzVlZAotRlJBTUVfVElUTEVfQ0FURUdPUklFU19UT09MQkFSPVx1Y2U3NFx1ZDE0Y1x1YWNlMFx1YjlhYyBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi1GUkFNRV9USVRMRV9DQVRFR09SSUVTX0NPTlRFTlQ9XHVjZTc0XHVkMTRjXHVhY2UwXHViOWFjIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPVdTREwgXHViZTBjXHViNzdjXHVjNmIwXHVjODAwIFx1YjNjNFx1YWQ2YyBcdWJhYThcdWM3NGMKLUZSQU1FX1RJVExFX1dTRExfQ09OVEVOVD1XU0RMIFx1YmUwY1x1Yjc3Y1x1YzZiMFx1YzgwMCBcdWNlZThcdWQxNTBcdWNlMjAKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9CVVNJTkVTU19ERVRBSUxTPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHVjNTkxXHVjMmRkCi1GT1JNX1RJVExFX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRT1cdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHVhY2Y1XHVhYzFjIFx1YzExY1x1YmU0NFx1YzJhNCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfR0VUX0ZPUk09XHViYzFjXHVhY2FjIFx1YmMwZiBcdWFjZjVcdWFjMWNcdWI0MWMgXHVjNjI0XHViZTBjXHVjODFkXHVkMmI4IFx1YzU5MVx1YzJkZFx1YzVkMFx1YzExYyBcdWMxMjBcdWQwZGQKLUZPUk1fVElUTEVfSVRFTVNfU1VNTUFSWT1cdWQ1NmRcdWJhYTkgXHVjNTkxXHVjMmRkXHVjNzU4IFx1YzY5NFx1YzU3ZAotRk9STV9USVRMRV9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlM9XHVhY2Y1XHVhYzFjXHVjNzkwIFx1YzEyMFx1YzViOFx1YmIzOCBcdWM1OTFcdWMyZGQgXHVhZDAwXHViOWFjCi1GT1JNX1RJVExFX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTPVx1Y2MzOFx1Yzg3MCBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjNTkxXHVjMmRkIFx1YWQwMFx1YjlhYwotRk9STV9USVRMRV9PUEVOX1JFR0lTVFJZPVx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhYyBcdWM1OTFcdWMyZGQgXHVjNWY0XHVhZTMwCi1GT1JNX1RJVExFX1JFR0lTVFJZX0RFVEFJTFM9XHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjIFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfUkVHSVNUUllfUFVCTElTSD1cdWI4MDhcdWM5YzBcdWMyYTRcdWQyYjhcdWI5YWMgXHVhY2Y1XHVhYzFjIFx1YzU5MVx1YzJkZAotRk9STV9USVRMRV9SRUdJU1RSWV9GSU5EPVx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhYyBcdWNjM2VcdWFlMzAgXHVjNTkxXHVjMmRkCi1GT1JNX1RJVExFX1JFU1VMVFM9XHVhY2IwXHVhY2ZjIFx1YzU5MVx1YzJkZAotRk9STV9USVRMRV9TRVJWSUNFX0RFVEFJTFM9XHVjMTFjXHViZTQ0XHVjMmE0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1cdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc4XHVkMTMwXHVkMzk4XHVjNzc0XHVjMmE0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfVU5QVUJMSVNIPVx1YWNmNVx1YWMxYyBcdWNkZThcdWMxOGMgXHVjNTkxXHVjMmRkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX3B0X0JSLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX3B0X0JSLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNzc5NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvdWRkaV9wdF9CUi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVVEREkKLQotIyBOb2RlcwotTk9ERV9OQU1FX1VERElfTUFJTj1QcmluY2lwYWwgZG8gVURESQotTk9ERV9OQU1FX1FVRVJJRVNfRk9MREVSPUNvbnN1bHRhcyBFeGVjdXRhZGFzCi1OT0RFX05BTUVfUFVCTElTSEVEX0JVU0lORVNTRVNfRk9MREVSPU5lZ1x1MDBmM2Npb3MgUHVibGljYWRvcwotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFU19GT0xERVI9U2VydmlcdTAwZTdvcyBQdWJsaWNhZG9zCi1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVI9SW50ZXJmYWNlcyBkZSBTZXJ2aVx1MDBlN29zIFB1YmxpY2Fkb3MKLQotIyBPcGVuUmVnaXN0cnlBY3Rpb24KLUFMVF9PUEVOX1JFR0lTVFJZPUFicmlyIFJlZ2lzdHJvCi1GT1JNX0xBQkVMX09QRU5fUkVHSVNUUllfREVTQz1Fc3BlY2lmaXF1ZSBvIG5vbWUgZSBvIFVSTCBkZSBjb25zdWx0YSBkbyByZWdpc3RybyBhIHNlciBhYmVydG8uIEEgc2VsZVx1MDBlN1x1MDBlM28gZGUgdW0gcmVnaXN0cm8gZmF2b3JpdG8gcHJlZW5jaGVyXHUwMGUxIGF1dG9tYXRpY2FtZW50ZSBhcyBpbmZvcm1hXHUwMGU3XHUwMGY1ZXMgcmVxdWVyaWRhcy4gUHJlc3Npb25lIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSBhYnJpciBvIHJlZ2lzdHJvLgotRk9STV9MQUJFTF9GQVZPUklURV9SRUdJU1RSWT1SZWdpc3RybyBGYXZvcml0bwotRk9STV9MQUJFTF9SRUdJU1RSWV9OQU1FPU5vbWUgZGUgUmVnaXN0cm8KLUZPUk1fTEFCRUxfSU5RVUlSWV9VUkw9VVJMIGRlIENvbnN1bHRhCi1GT1JNX0xBQkVMX0NIRUNLX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPVZlcmlmaWNhciBjYXRlZ29yaWFzIGRlZmluaWRhcyBwZWxvIHVzdVx1MDBlMXJpbwotREVGQVVMVF9SRUdJU1RSWV9OQU1FPVJlZ2lzdHJvIGRlIFRlc3RlIGRvIFVEREkgSUJNCi1NU0dfRVJST1JfSU5WQUxJRF9SRUdJU1RSWV9OQU1FPUlXQUIwMTM2RSBEaWdpdGUgdW0gbm9tZSBkZSByZWdpc3RybyB2XHUwMGUxbGlkby4KLU1TR19FUlJPUl9JTlZBTElEX0lOUVVJUllfVVJMPUlXQUIwMTM4RSBEaWdpdGUgdW0gVVJMIGRlIGNvbnN1bHRhIHZcdTAwZTFsaWRvLgotTVNHX0lORk9fUkVHSVNUUllfT1BFTkVEPUlXQUIwMTM5SSBPIHJlZ2lzdHJvIG5vbWVhZG8gJTEgbG9jYWxpemFkbyBlbSAlMiBmb2kgYWJlcnRvIGNvbSBcdTAwZWF4aXRvLgotRk9STV9MQUJFTF9JU19XRUJTUEhFUkVfVURESV9SRUdJU1RSWT1PIHJlZ2lzdHJvIFx1MDBlOSBvIFdlYlNwaGVyZSBVRERJPwotREVGQVVMVF9SRUdJU1RSWV9OQU1FX1dFQlNQSEVSRT1JQk0gV2ViU3BoZXJlIFByaXZhdGUgVURESSBSZWdpc3RyeQotRk9STV9MQUJFTF9SRUdJU1RSWV9IT1NUPUhvc3QKLUZPUk1fTEFCRUxfUkVHSVNUUllfUE9SVD1Qb3J0YQotCi0jIFVzZXItZGVmaW5lZCBDYXRlZ29yaWVzCi1GT1JNX0xBQkVMX0FERF9DQVRFR09SWV9EQVRBPTxhIGhyZWY9IiUxIj5DbGlxdWUgYXF1aTwvYT4gcGFyYSBjYXJyZWdhciBvcyBkYWRvcyBkZXNzYSBjYXRlZ29yaWEuCi1GT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfRklMRT1Ob21lIGRvIGFycXVpdm8gZGUgZGFkb3MgZGEgY2F0ZWdvcmlhCi1NU0dfSU5GT19OT19VU0VSX0RFRklORURfQ0FURUdPUklFU19GT1VORD1JV0FCMDM3MUkgTmVuaHVtYSBjYXRlZ29yaWEgZGVmaW5pZGEgcGVsbyB1c3VcdTAwZTFyaW8gZGV0ZWN0YWRhLgotTVNHX0lORk9fTk9fQ0FURUdPUllfREFUQT1JV0FCMDM3MkkgT3MgZGFkb3MgZGUgY2F0ZWdvcmlhIHBhcmEgJTEgblx1MDBlM28gZXN0XHUwMGUzbyBkaXNwb25cdTAwZWR2ZWlzIG91IHNcdTAwZTNvIGludlx1MDBlMWxpZG9zLgotTVNHX0lORk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfTE9BREVEPUlXQUIwMzczSSBPcyBkYWRvcyBwYXJhIGEgY2F0ZWdvcmlhIGRlZmluaWRhIHBlbG8gdXN1XHUwMGUxcmlvICUxIGZvcmFtIGNhcnJlZ2Fkb3MgY29tIFx1MDBlYXhpdG8uCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0tFWT1JV0FCMDM3NEUgQXJxdWl2byBkZSBkYWRvcyBpbnZcdTAwZTFsaWRvIHBhcmEgY2F0ZWdvcmlhIGRlZmluaWRhIHBlbG8gdXN1XHUwMGUxcmlvICUxLiBVbWEgY2hhdmUgZGUgY2F0ZWdvcmlhICclMicgZm9pIGxvY2FsaXphZGEsIG1hcyBlc3BlcmF2YS1zZSAnJTMnLgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfRklMRV9GT1JNQVQ9SVdBQjA0NzNFIEZvcm1hdG8gZGVzY29uaGVjaWRvIGVtIGxpbmhhOiAlMSBkbyBhcnF1aXZvIGRlIGRhZG9zIHBhcmEgYSBjYXRlZ29yaWEgZGVmaW5pZGEgcGVsbyB1c3VcdTAwZTFyaW8gJTIuIEEgbGluaGEgXHUwMGU5OiAiJTMiCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFPUlXQUIwMzc1RSBBcnF1aXZvIGRlIGRhZG9zIGludlx1MDBlMWxpZG8gcGFyYSBjYXRlZ29yaWEgZGVmaW5pZGEgcGVsbyB1c3VcdTAwZTFyaW8gJTEuCi1NU0dfRVJST1JfU0FWSU5HX0NBVEVHT1JZX0RBVEE9SVdBQjA0NzRFIE9jb3JyZXUgdW0gZXJybyBhbyBzYWx2YXIgZGFkb3MgcGFyYSBhIGNhdGVnb3JpYSAlMS4gVGV4dG8gZGUgZXhjZVx1MDBlN1x1MDBlM286ICUyCi0KLSMgVURESSBDYXRlZ29yeSBCcm93c2VyCi1USVRMRV9DQVRFR09SWV9CUk9XU0VSPU5hdmVnYWRvciBkYSBDYXRlZ29yaWEKLUFMVF9DQVRFR09SSUVTPUNhdGVnb3JpYXMKLQotIyBEZXRhaWxzCi1BTFRfUkVHSVNUUllfREVUQUlMUz1EZXRhbGhlcyBkbyBSZWdpc3RybwotQUxUX0JVU0lORVNTX0RFVEFJTFM9RGV0YWxoZXMgZG8gTmVnXHUwMGYzY2lvCi1BTFRfU0VSVklDRV9ERVRBSUxTPURldGFsaGVzIGRvIFNlcnZpXHUwMGU3bwotQUxUX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9RGV0YWxoZXMgZGEgSW50ZXJmYWNlIGRlIFNlcnZpXHUwMGU3bwotRk9STV9MQUJFTF9ERVRBSUxTX0VESVRBQkxFPU9zIGRldGFsaGVzIHBhcmEgPHN0cm9uZz4lMTwvc3Ryb25nPiBzXHUwMGUzbyBtb3N0cmFkb3MgYSBzZWd1aXIuIEFsZ3VucyBpdGVucyBwb2RlbSBzZXIgaW5jbHVcdTAwZWRkb3MsIHJlbW92aWRvcyBvdSBhbHRlcmFkb3MuIEEgYXV0ZW50aWNhXHUwMGU3XHUwMGUzbyBwb2RlIHNlciBuZWNlc3NcdTAwZTFyaWEgcGFyYSBhbHRlcmFcdTAwZTdcdTAwZjVlcy4gT3V0cmFzIGFcdTAwZTdcdTAwZjVlcyBlc3RcdTAwZTNvIGxpc3RhZGFzIG5hIHBhcnRlIGluZmVyaW9yIGRlc3RhIHBcdTAwZTFnaW5hLgotCi0jIEdldAotQUxUX0dFVD1PYnRlcgotCi0jIENvbW1vbiBGb3JtIENvbnRyb2wgVGl0bGUKLUZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUU9VmFsb3IgZG8gbm9tZQotRk9STV9DT05UUk9MX1RJVExFX0RFU0NSSVBUSU9OX1RFWFRfVkFMVUU9VmFsb3IgZGEgZGVzY3JpXHUwMGU3XHUwMGUzbwotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FPU5vbWUgZGEgY2hhdmUgZGUgY2F0ZWdvcmlhCi1GT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfS0VZX1ZBTFVFPVZhbG9yIGRhIGNoYXZlIGRlIGNhdGVnb3JpYQotRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX05BTUU9Tm9tZSBkYSBjaGF2ZSBkbyBpZGVudGlmaWNhZG9yCi1GT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfVkFMVUU9VmFsb3IgZGEgY2hhdmUgZG8gaWRlbnRpZmljYWRvcgotRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkw9VVJMIGRvIERpc2NvdmVyeQotCi0jIEZpbmQgYWN0aW9ucwotQUxUX0ZJTkQ9TG9jYWxpemFyCi1BTFRfU1VCUVVFUlk9TG9jYWxpemFyIFN1YmNvbnN1bHRhICUxCi1GT1JNX0xBQkVMX1FVRVJZX05BTUU9Tm9tZSBkZXNzYSBjb25zdWx0YQotREVGQVVMVF9RVUVSWV9OQU1FPXJlc3VsdGFkb3MgZGEgY29uc3VsdGEKLURFRkFVTFRfU1VCUVVFUllfTkFNRT0lMSAtIHN1YmNvbnN1bHRhICUyCi1GT1JNX0xBQkVMX1NFQVJDSF9GT1I9UGVzcXVpc2FyCi1GT1JNX09QVElPTl9CVVNJTkVTU0VTPU5lZ1x1MDBmM2Npb3MKLUZPUk1fT1BUSU9OX1NFUlZJQ0VTPVNlcnZpXHUwMGU3b3MKLUZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUz1JbnRlcmZhY2VzIGRlIFNlcnZpXHUwMGU3bwotRk9STV9MQUJFTF9TRUFSQ0hfVFlQRT1UaXBvIGRlIHBlc3F1aXNhCi1GT1JNX1JBRElPX1NJTVBMRT1TaW1wbGVzCi1GT1JNX1JBRElPX0FEVkFOQ0VEPUF2YW5cdTAwZTdhZG8KLUZPUk1fUkFESU9fVVVJRD1VVUlECi1GT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NFU19TSU1QTEVfREVTQz1EaWdpdGUgbyBub21lIHBhcmNpYWwgb3UgY29tcGxldG8gZGUgdW0gbmVnXHUwMGYzY2lvIHBhcmEgcHJvY3VyYS4gTyBzXHUwMGVkbWJvbG8gJyUnIHBvZGUgc2VyIHV0aWxpemFkbyBjb21vIGNhcmFjdGVyZSBjdXJpbmdhIHF1ZSBjb3JyZXNwb25kYSBhIHF1YWxxdWVyIGNhcmFjdGVyZS4gUHJlc3Npb25lIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSByZWFsaXphciBhIHBlc3F1aXNhLgotRk9STV9MQUJFTF9GSU5EX0FEVkFOQ0VEX0RFU0M9RGlnaXRlIHZhbG9yZXMgcGFyYSB1bSBvdSBtYWlzIGRvcyBwYXJcdTAwZTJtZXRyb3MgbGlzdGFkb3MgYSBzZWd1aXIuIE8gc1x1MDBlZG1ib2xvICclJyBwb2RlIHNlciB1dGlsaXphZG8gY29tbyB1bSBjYXJhY3RlcmUgY3VyaW5nYSBxdWUgY29ycmVzcG9uZGEgYSBxdWFscXVlciBjYXJhY3RlcmUgbm8gY2FtcG8gTm9tZSBkYSB0YWJlbGEgTm9tZXMuIEF1dGVudGljYVx1MDBlN1x1MDBlM28gcG9kZSBzZXIgbmVjZXNzXHUwMGUxcmlhLiBQcmVzc2lvbmUgPHN0cm9uZz5Jcjwvc3Ryb25nPiBwYXJhIHJlYWxpemFyIGEgcGVzcXVpc2EuCi1GT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NfVVVJRF9ERVNDPURpZ2l0ZSBvIFVVSUQgZG8gbmVnXHUwMGYzY2lvIGEgc2VyIHByb2N1cmFkby4gUHJlc3Npb25lIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSByZWFsaXphciBhIHBlc3F1aXNhLgotRk9STV9MQUJFTF9OQU1FUz1Ob21lcwotRk9STV9MSU5LX0FERD1JbmNsdWlyCi1GT1JNX0xJTktfR0VUPU9idGVyCi1GT1JNX0xJTktfRklORD1Mb2NhbGl6YXIKLUZPUk1fTElOS19SRU1PVkU9UmVtb3ZlcgotRk9STV9MQUJFTF9PV05FRD1Qb3NzdVx1MDBlZGRvCi1GT1JNX0xBQkVMX1BVQkxJU0hfVVJMPVVSTCBkZSBQdWJsaWNhXHUwMGU3XHUwMGUzbwotRk9STV9MQUJFTF9VU0VSSUQ9SUQgZG8gVXN1XHUwMGUxcmlvCi1GT1JNX0xBQkVMX1BBU1NXT1JEPVNlbmhhCi1GT1JNX0xBQkVMX0xBTkdVQUdFPUlkaW9tYQotRk9STV9MQUJFTF9OQU1FPSBOb21lCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPURlc2NyaVx1MDBlN1x1MDBlM28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VOPWluZ2xcdTAwZWFzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BQT1hZmFyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BQj1hYmNhemlhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FGPWFmcmljXHUwMGUybmVyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BTT1hbVx1MDBlMXJpY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FSPVx1MDBlMXJhYmUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FTPWFzc2FtXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfQVk9YWltYXJcdTAwZTEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FaPWF6ZXJiYWlqYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CQT1iYXNoa2lyCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CRT1iaWVsby1ydXNzbwotRk9STV9PUFRJT05fTEFOR1VBR0VfQkc9Ylx1MDBmYWxnYXJvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CSD1iaWFyaQotRk9STV9PUFRJT05fTEFOR1VBR0VfQkk9YmlzbGFtYQotRk9STV9PUFRJT05fTEFOR1VBR0VfQk49YmVuZ2FsaTsgYmFuZ2xhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CTz10aWJldGFubwotRk9STV9PUFRJT05fTEFOR1VBR0VfQlI9YnJldFx1MDBlM28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NBPWNhdGFsXHUwMGUzbwotRk9STV9PUFRJT05fTEFOR1VBR0VfQ089Y1x1MDBmM3JzZWdvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DWj10Y2hlY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NZPWdhbFx1MDBlYXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RBPWRpbmFtYXJxdVx1MDBlYXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RFPWFsZW1cdTAwZTNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9EWj16b25jXHUwMGUxCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTD1ncmVnbwotRk9STV9PUFRJT05fTEFOR1VBR0VfRU89ZXNwZXJhbnRvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FUz1lc3BhbmhvbAotRk9STV9PUFRJT05fTEFOR1VBR0VfRVQ9ZXN0b25pYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FVT1iYXNjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfRkE9cGVyc2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZJPWZpbmxhbmRcdTAwZWFzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GSj1maWppYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GTz1mYXJvXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfRlI9ZnJhbmNcdTAwZWFzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GWT1mcmlzXHUwMGUzbwotRk9STV9PUFRJT05fTEFOR1VBR0VfR0E9aXJsYW5kXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfR0Q9Z2FcdTAwZTlsaWNvIGVzY29jXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfR0w9Z2FsXHUwMGVkY2lvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HTj1ndWFyYW5pCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HVT1ndWphcmF0aQotRk9STV9PUFRJT05fTEFOR1VBR0VfSEE9aGF1c3NhYQotRk9STV9PUFRJT05fTEFOR1VBR0VfSEk9aGluZGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hSPWNyb2F0YQotRk9STV9PUFRJT05fTEFOR1VBR0VfSFU9aFx1MDBmYW5nYXJvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IWT1hcm1cdTAwZWFuaW8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lBPUludGVybFx1MDBlZG5ndWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lFPUludGVybFx1MDBlZG5nXHUwMGZjZQotRk9STV9PUFRJT05fTEFOR1VBR0VfSUs9aW51cGlhawotRk9STV9PUFRJT05fTEFOR1VBR0VfSU49YmFoYXNhIGluZG9uXHUwMGU5c2lvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JUz1pc2xhbmRcdTAwZWFzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JVD1pdGFsaWFubwotRk9STV9PUFRJT05fTEFOR1VBR0VfSVc9aGVicmFpY28KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pBPWphcG9uXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfSkk9aVx1MDBlZGRpY2hlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KVz1qYXZhblx1MDBlYXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tBPWdlb3JnaWFubwotRk9STV9PUFRJT05fTEFOR1VBR0VfS0s9Y2F6YXF1ZQotRk9STV9PUFRJT05fTEFOR1VBR0VfS0w9Z3JvZW5sYW5kXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfS009a2htZXIKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tOPWthbm5hZGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tPPWNvcmVhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tTPWNhY2hlbWlyaQotRk9STV9PUFRJT05fTEFOR1VBR0VfS1U9Y3VyZG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tZPXF1aXJndWl6Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9MQT1sYXRpbQotRk9STV9PUFRJT05fTEFOR1VBR0VfTE49bGluZ2FsYQotRk9STV9PUFRJT05fTEFOR1VBR0VfTE89bGFvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MVD1saXR1YW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MVj1sZXRcdTAwZTNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NRz1tYWxnYXhlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NST1tYW9yaQotRk9STV9PUFRJT05fTEFOR1VBR0VfTUs9bWFjZWRcdTAwZjRuaW8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01MPW1hbGFpYWxhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTj1tb25nb2wKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01PPW1vbGRcdTAwZTF2aW8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01SPW1hcmF0YQotRk9STV9PUFRJT05fTEFOR1VBR0VfTVM9bWFsYWlvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NVD1tYWx0XHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfTVk9YmlybWFuXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfTkE9bmF1cnVhbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05FPW5lcGFsXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfTkw9aG9sYW5kXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfTk89bm9ydWVndVx1MDBlYXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09DPW9jY2l0XHUwMGUybmljbwotRk9STV9PUFRJT05fTEFOR1VBR0VfT009KGFmYW4pIG9yb21vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9PUj1vcml5YQotRk9STV9PUFRJT05fTEFOR1VBR0VfUEE9cHVuamFiaQotRk9STV9PUFRJT05fTEFOR1VBR0VfUEw9cG9sb25cdTAwZWFzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QUz1wYXNodHUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BUPXBvcnR1Z3VcdTAwZWFzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9RVT1xdVx1MDBlZGNodWEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JNPXJldG8tcm9tYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STj1raXJ1bmRpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9STz1yb21lbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JVPXJ1c3NvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9SVz1raW5heWFyd2FuZGEKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NBPXNcdTAwZTJuc2NyaXRvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TRD1zaW5kaQotRk9STV9PUFRJT05fTEFOR1VBR0VfU0c9c2FuZ1x1MDBmNAotRk9STV9PUFRJT05fTEFOR1VBR0VfU0g9c1x1MDBlOXJ2aW8tY3JvYXRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TST1jaW5nYWxcdTAwZWFzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TSz1lc2xvdmFjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfU0w9ZXNsb3ZcdTAwZWFuaW8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NNPXNhbW9hbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NOPXNob25hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTz1zb21hbGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NRPWFsYmFuXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfU1I9c1x1MDBlOXJ2aW8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NTPXNpc3dhdGkKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NUPXNlc290aG8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NVPXN1bmRhblx1MDBlYXMKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NWPXN1ZWNvCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVz1zdWFcdTAwZWRsaQotRk9STV9PUFRJT05fTEFOR1VBR0VfVEE9dFx1MDBlMm1pbAotRk9STV9PUFRJT05fTEFOR1VBR0VfVEU9dGVsdWd1Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9URz10YWppawotRk9STV9PUFRJT05fTEFOR1VBR0VfVEg9dGFpCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UST10aWdyXHUwMGVkbmlhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9USz10dXJjb21hbm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RMPXRhZ2Fsb2cKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ROPXNldHN3YW5hCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTz10b25nYW5cdTAwZWFzCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UUj10dXJjbwotRk9STV9PUFRJT05fTEFOR1VBR0VfVFM9dHNvbmdhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVD10XHUwMGUxcnRhcm8KLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RXPXR3aQotRk9STV9PUFRJT05fTEFOR1VBR0VfVUs9dWNyYW5pYW5vCi1GT1JNX09QVElPTl9MQU5HVUFHRV9VUj11cmR1Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9VWj11emJlcXVlCi1GT1JNX09QVElPTl9MQU5HVUFHRV9WST12aWV0bmFtaXRhCi1GT1JNX09QVElPTl9MQU5HVUFHRV9WTz12b2xhcHVrCi1GT1JNX09QVElPTl9MQU5HVUFHRV9XTz13b2xvZgotRk9STV9PUFRJT05fTEFOR1VBR0VfWEg9eGhvc2EKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1lPPXlvcnViXHUwMGUxCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aSD1jaGluXHUwMGVhcwotRk9STV9PUFRJT05fTEFOR1VBR0VfWlU9enVsdQotRk9STV9MQUJFTF9FWEFDVF9OQU1FX01BVENIPUNvcnJlc3BvbmRcdTAwZWFuY2lhIGV4YXRhCi1GT1JNX0xBQkVMX0NBU0VfU0VOU0lUSVZFX01BVENIPURpc3Rpblx1MDBlN1x1MDBlM28gZW50cmUgbWFpXHUwMGZhc2N1bGFzIGUgbWluXHUwMGZhc2N1bGFzCi1GT1JNX0xBQkVMX1NPVU5ERVg9U29hIGNvbW8KLUZPUk1fTEFCRUxfSURFTlRJRklFUlM9SWRlbnRpZmljYWRvcmVzCi1GT1JNX0xBQkVMX0lERU5USUZJRVJfVFlQRT1UaXBvCi0KLSMgRG8gbm90IHRyYW5zbGF0ZSB0aGUgdHdvIGl0ZW1zIGJlbG93LgotRk9STV9PUFRJT05fSURFTlRJRklFUl9EVU5TPUQtVS1OLVMKLUZPUk1fT1BUSU9OX0lERU5USUZJRVJfVEhPTUFTX1JFR0lTVFJZPVJlZ2lzdHJvIGRlIFRob21hcwotCi1GT1JNX0xBQkVMX0tFWV9OQU1FPU5vbWUgcHJpbmNpcGFsCi1GT1JNX0xBQkVMX0tFWV9WQUxVRT1WYWxvciBkZSBjaGF2ZQotRk9STV9MQUJFTF9DQVRFR09SSUVTPUNhdGVnb3JpYXMKLUZPUk1fTEFCRUxfQ0FURUdPUllfVFlQRT1UaXBvCi1GT1JNX09QVElPTl9DQVRFR09SWV9OQUlDUz1OQUlDUwotRk9STV9PUFRJT05fQ0FURUdPUllfVU5TUFNDXzczPVVOU1BTQyA3LjMKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX0dFTz1HRU8KLUZPUk1fT1BUSU9OX0NBVEVHT1JZX0RXQ09NTVVOSVRZPUNvbXVuaWRhZGUgZFcKLUZPUk1fTEFCRUxfQlVTSU5FU1NfQ0FURUdPUklFUz1Db21wYXJhciBjb206Ci1GT1JNX09QVElPTl9CVVNJTkVTU0VTX09OTFk9QXBlbmFzIG5lZ1x1MDBmM2Npb3MKLUZPUk1fT1BUSU9OX1NFUlZJQ0VTX09OTFk9QXBlbmFzIHNlcnZpXHUwMGU3b3MKLUZPUk1fT1BUSU9OX0JPVEg9TmVnXHUwMGYzY2lvcyBlIFNlcnZpXHUwMGU3b3MKLUZPUk1fTEFCRUxfRElTQ09WRVJZVVJMUz1VUkxzIGRvIERpc2NvdmVyeQotRk9STV9MQUJFTF9ESVNDT1ZFUllVUkw9VVJMIGRvIERpc2NvdmVyeQotRk9STV9MQUJFTF9GSU5EUVVBTElGSUVSUz1Mb2NhbGl6YXIgUXVhbGlmaWNhZG9yZXMKLUZPUk1fTEFCRUxfQ09NQklORV9LRVlTPUNvbWJpbmFyIGNoYXZlczoKLUZPUk1fT1BUSU9OX0FOREFMTEtFWVM9QW5kCi1GT1JNX09QVElPTl9PUkFMTEtFWVM9T3IKLUZPUk1fT1BUSU9OX09STElLRUtFWVM9T3IgTGlrZQotRk9STV9MQUJFTF9TT1JUX0JZX05BTUU9Q2xhc3NpZmljYXIgcG9yIG5vbWU6Ci1GT1JNX1JBRElPX1NPUlRfQVNDPUNyZXNjZW50ZQotRk9STV9SQURJT19TT1JUX0RFU0M9RGVjcmVzY2VudGUKLUZPUk1fTEFCRUxfU09SVF9CWV9EQVRFPUNsYXNzaWZpY2FyIHBvciBkYXRhOgotRk9STV9MQUJFTF9NQVhfU0VBUkNIX1NFVD1UYW1hbmhvIG1cdTAwZTF4aW1vIGRvIGNvbmp1bnRvIGRlIHByb2N1cmE6Ci1GT1JNX0xBQkVMX01BWF9SRVNVTFRTPU5cdTAwZmFtZXJvIG1cdTAwZTF4aW1vIGRlIHJlc3VsdGFkb3M6Ci1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRVNfU0lNUExFX0RFU0M9RGlnaXRlIG8gbm9tZSBwYXJjaWFsIG91IGNvbXBsZXRvIGRlIHVtIHNlcnZpXHUwMGU3byBwYXJhIHByb2N1cmEuIE8gc1x1MDBlZG1ib2xvICclJyBwb2RlIHNlciB1dGlsaXphZG8gY29tbyBjYXJhY3RlcmUgY3VyaW5nYSBxdWUgY29ycmVzcG9uZGEgYSBxdWFscXVlciBjYXJhY3RlcmUuIFByZXNzaW9uZSA8c3Ryb25nPklyPC9zdHJvbmc+IHBhcmEgcmVhbGl6YXIgYSBwZXNxdWlzYS4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX1VVSURfREVTQz1EaWdpdGUgbyBVVUlEIGRvIHNlcnZpXHUwMGU3byBhIHNlciBwcm9jdXJhZG8uIFByZXNzaW9uZSA8c3Ryb25nPklyPC9zdHJvbmc+IHBhcmEgcmVhbGl6YXIgYSBwZXNxdWlzYS4KLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRVNfU0lNUExFX0RFU0M9RGlnaXRlIG8gbm9tZSBwYXJjaWFsIG91IGNvbXBsZXRvIGRlIHVtYSBpbnRlcmZhY2UgZGUgc2VydmlcdTAwZTdvIHBhcmEgcHJvY3VyYS4gTyBzXHUwMGVkbWJvbG8gJyUnIHBvZGUgc2VyIHV0aWxpemFkbyBjb21vIGNhcmFjdGVyZSBjdXJpbmdhIHF1ZSBjb3JyZXNwb25kYSBhIHF1YWxxdWVyIGNhcmFjdGVyZS4gUHJlc3Npb25lIDxzdHJvbmc+SXI8L3N0cm9uZz4gcGFyYSByZWFsaXphciBhIHBlc3F1aXNhLgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFX1VVSURfREVTQz1EaWdpdGUgbyBVVUlEIGRhIGludGVyZmFjZSBzZXJ2aVx1MDBlN28gYSBzZXIgcHJvY3VyYWRvLiBQcmVzc2lvbmUgPHN0cm9uZz5Jcjwvc3Ryb25nPiBwYXJhIHJlYWxpemFyIGEgcGVzcXVpc2EuCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFUz1JbnRlcmZhY2VzIGRlIFNlcnZpXHUwMGU3bwotRk9STV9MQUJFTF9VVUlEX0tFWT1DaGF2ZSBkbyBVVUlEOgotRk9STV9MQUJFTF9VU0VfU0VSVklDRT1VdGlsaXphciBzZXJ2aVx1MDBlN28KLUZPUk1fTEFCRUxfU0VSVklDRT1TZXJ2aVx1MDBlN28KLUZPUk1fTEFCRUxfQlVTSU5FU1M9TmVnXHUwMGYzY2lvCi1GT1JNX0xBQkVMX1BVQkxJU0hfQVNTRVJUSU9OUz1BZmlybWF0aXZhcyBkbyBQdWJsaWNhZG9yCi1GT1JNX0xBQkVMX0RJUkVDVElPTj1EaXJlXHUwMGU3XHUwMGUzbwotRk9STV9MQUJFTF9GUk9NX0tFWT1EYSBDaGF2ZQotRk9STV9MQUJFTF9UT19LRVk9UGFyYSBhIENoYXZlCi1GT1JNX0xBQkVMX1NUQVRVUz1TdGF0dXMKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX1RZUEU9VGlwbyBkZSBBZmlybWF0aXZhCi1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QQVJFTlRfQ0hJTEQ9UGFpLUZpbGhvCi1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QRUVSX1RPX1BFRVI9UG9udG8tUG9udG8KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX0lERU5USVRZPUlkZW50aWRhZGUKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX0RJUkVUSU9OX0RFU0M9QSBkaXJlXHUwMGU3XHUwMGUzbyA8c3Ryb25nPkRlPC9zdHJvbmc+IGNyaWFyXHUwMGUxIHVtYSBhZmlybWF0aXZhIGRvIHB1YmxpY2Fkb3IgYSBwYXJ0aXIgZGVzdGUgbmVnXHUwMGYzY2lvIHBhcmEgb3MgbmVnXHUwMGYzY2lvcyBhY2ltYS4gIEEgZGlyZVx1MDBlN1x1MDBlM28gPHN0cm9uZz5QYXJhPC9zdHJvbmc+IGNyaWFyXHUwMGUxIHVtYSBhZmlybWF0aXZhIGRvIHB1YmxpY2Fkb3IgYSBwYXJ0aXIgZG9zIG5lZ1x1MDBmM2Npb3MgYWNpbWEgcGFyYSBlc3RlIG5lZ1x1MDBmM2Npby4KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9ESVJFQ1RJT05fRlJPTT0tLS0+Ci1GT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX1RPPTwtLS0KLUZPUk1fTEFCRUxfVEhJU19CVVNJTkVTUz1Jc3RvCi1NU0dfRVJST1JfSU5WQUxJRF9RVUVSWV9OQU1FPUlXQUIwMTQwRSBEaWdpdGUgdW0gbm9tZSB2XHUwMGUxbGlkbyBwYXJhIGEgY29uc3VsdGEuCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FUz1JV0FCMDE0MUUgRGlnaXRlIHVtYSBzXHUwMGU5cmllIGRlIG5vbWVzIHZcdTAwZTFsaWRvcy4KLU1TR19FUlJPUl9JTlZBTElEX1BVQkxJU0hfVVJMPUlXQUIwMTQyRSBEaWdpdGUgdW0gVVJMIGRlIHB1YmxpY2FcdTAwZTdcdTAwZTNvIHZcdTAwZTFsaWRvLgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEPUlXQUIwMTQzRSBEaWdpdGUgdW0gSUQgZG8gdXN1XHUwMGUxcmlvIHZcdTAwZTFsaWRvLgotTVNHX0VSUk9SX0lOVkFMSURfTUFYX1NFQVJDSF9TRVQ9SVdBQjAxNDVFIERpZ2l0ZSB1bSB0YW1hbmhvIHZcdTAwZTFsaWRvIHBhcmEgbyBjb25qdW50byBkZSBwcm9jdXJhIG1cdTAwZTF4aW1vLgotTVNHX0VSUk9SX0lOVkFMSURfTUFYX1JFU1VMVFM9SVdBQjAxNDZFIERpZ2l0ZSB1bSB0YW1hbmhvIHZcdTAwZTFsaWRvIHBhcmEgbyBuXHUwMGZhbWVybyBtXHUwMGUxeGltbyBkZSByZXN1bHRhZG9zLgotTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0N0kgTlx1MDBmYW1lcm8gZGUgbmVnXHUwMGYzY2lvcyBsb2NhbGl6YWRvczogJTEKLU1TR19FUlJPUl9OT19CVVNJTkVTU0VTX0ZPVU5EPUlXQUIwMTQ4RSBOZW5odW0gbmVnXHUwMGYzY2lvIGxvY2FsaXphZG8uCi1NU0dfSU5GT19TRVJWSUNFU19GT1VORD1JV0FCMDE0OUkgTlx1MDBmYW1lcm8gZGUgc2VydmlcdTAwZTdvcyBsb2NhbGl6YWRvczogJTEKLU1TR19FUlJPUl9OT19TRVJWSUNFU19GT1VORD1JV0FCMDE1MEUgTmVuaHVtIHNlcnZpXHUwMGU3byBsb2NhbGl6YWRvLgotTVNHX0VSUk9SX1NJTkdMRV9JVEVNPUlXQUIwMTUxRSBTZWxlY2lvbmUgYXBlbmFzIHVtIGl0ZW0uCi1NU0dfUVVFU1RJT05fSVRFTV9SRVBMQUNFTUVOVD1BIHNlbGVcdTAwZTdcdTAwZTNvIHN1YnN0aXR1aXJcdTAwZTEgdW0gaXRlbSBxdWUgalx1MDBlMSBlc3RcdTAwZTEgbm8gZGVzdGluby4gRGVzZWphIGNvbnRpbnVhcj8KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORD1JV0FCMDE1MkkgTlx1MDBmYW1lcm8gZGUgaW50ZXJmYWNlcyBkZSBzZXJ2aVx1MDBlN28gbG9jYWxpemFkYXM6ICUxCi1NU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUzRSBOZW5odW1hIGludGVyZmFjZSBkZSBzZXJ2aVx1MDBlN28gbG9jYWxpemFkYS4KLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMTU0RSBTZWxlY2lvbmUgcGVsbyBtZW5vcyB1bSBpdGVtLgotTVNHX0VSUk9SX0lOVkFMSURfVVVJRF9LRVk9SVdBQjAxNTVFIERpZ2l0ZSB1bWEgY2hhdmUgVVVJRCB2XHUwMGUxbGlkYS4KLU1TR19FUlJPUl9RVUVSWV9OQU1FX0NPTkZMSUNUPUlXQUIwMTU2RSBPIG5vbWUgZGEgY29uc3VsdGEgZGEgc3ViY29uc3VsdGEgblx1MDBlM28gcG9kZSBzZXIgaWd1YWwgYW8gZG8gb3JpZ2luYWRvci4KLU1TR19FUlJPUl9OT19JVEVNU19UT19HRVQ9SVdBQjAxNTdFIE5lbmh1bSBpdGVtIGRvIHRpcG8gZXNwZWNpZmljYWRvIGZvaSBwdWJsaWNhZG8gb3UgZGVzY29iZXJ0by4KLQotIyBSZXN1bHRzCi1BTFRfUVVFUllfUkVTVUxUUz1SZXN1bHRhZG9zIGRhIENvbnN1bHRhCi1GT1JNX0xBQkVMX1NVQlFVRVJZPU9zIHJlc3VsdGFkb3MgcG9kZXJcdTAwZTNvIHNlciB1dGlsaXphZG9zIGNvbW8gZW50cmFkYXMgZGUgb3V0cmEgb3BlcmFcdTAwZTdcdTAwZTNvLiBDbGlxdWUgbm8gbGluayA8c3Ryb25nPmRlc3Rpbm88L3N0cm9uZz4gbmEgcGFydGUgc3VwZXJpb3IgcGFyYSB2ZXIgYSBvcGVyYVx1MDBlN1x1MDBlM28uIE9zIHJlc3VsdGFkb3Mgc2VsZWNpb25hZG9zIHBvZGVtIHNlciB1dGlsaXphZG9zIG5hIG9wZXJhXHUwMGU3XHUwMGUzbywgY2xpY2FuZG8gbm8gYm90XHUwMGUzbyA8c3Ryb25nPlRyYW5zZmVyaXI8L3N0cm9uZz4uCi1GT1JNX0xBQkVMX1FVRVJZPVNlbGVjaW9uZSB1bSByZXN1bHRhZG8gcGFyYSB2ZXIgZGV0YWxoZXMgYWRpY2lvbmFpcyBvdSBzZWxlY2lvbmUgdW0gY29uanVudG8gZGUgcmVzdWx0YWRvcyBlIGNsaXF1ZSBlbSB1bSBib3RcdTAwZTNvIHBhcmEgZXhlY3V0YXIgdW1hIG9wZXJhXHUwMGU3XHUwMGUzby4KLUZPUk1fTElOS19UQVJHRVQ9ZGVzdGlubwotRk9STV9CVVRUT05fVFJBTlNGRVI9VHJhbnNmZXJpcgotRk9STV9CVVRUT05fUkVGUkVTSD1BdHVhbGl6YXIKLUZPUk1fQlVUVE9OX0FERF9UT19GQVZPUklURVM9SW5jbHVpciBlbSBGYXZvcml0b3MKLUZPUk1fQlVUVE9OX1VOUFVCTElTSD1DYW5jZWxhciBQdWJsaWNhXHUwMGU3XHUwMGUzbwotRk9STV9CVVRUT05fQ0xFQVI9TGltcGFyCi0KLSMgUHVibGlzaCBhY3Rpb25zCi1BTFRfUFVCTElTSD1QdWJsaWNhcgotRk9STV9MQUJFTF9QVUJMSVNIPVB1YmxpY2FyOgotRk9STV9PUFRJT05fQlVTSU5FU1M9TmVnXHUwMGYzY2lvCi1GT1JNX09QVElPTl9TRVJWSUNFPVNlcnZpXHUwMGU3bwotRk9STV9PUFRJT05fU0VSVklDRV9JTlRFUkZBQ0U9SW50ZXJmYWNlIGRlIFNlcnZpXHUwMGU3bwotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX1NJTVBMRV9ERVNDPURpZ2l0ZSB1bSBub21lIGUgdW1hIGRlc2NyaVx1MDBlN1x1MDBlM28gb3BjaW9uYWwgcGFyYSBvIG5lZ1x1MDBmM2NpbyBhIHNlciBwdWJsaWNhZG8uIEF1dGVudGljYVx1MDBlN1x1MDBlM28gcG9kZSBzZXIgbmVjZXNzXHUwMGUxcmlhLgotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX0FEVkFOQ0VEX0RFU0M9Rm9ybmVcdTAwZTdhIHVtIG5vbWUgcGFyYSBvIG5lZ1x1MDBmM2NpbyBhIHNlciBwdWJsaWNhZG8uIE91dHJvcyBwYXJcdTAwZTJtZXRyb3MgdGFtYlx1MDBlOW0gcG9kZW0gc2VyIGVzcGVjaWZpY2Fkb3MuIEF1dGVudGljYVx1MDBlN1x1MDBlM28gcG9kZSBzZXIgbmVjZXNzXHUwMGUxcmlhLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0M9T2J0ZW5oYSBvdSBsb2NhbGl6ZSB1bSBuZWdcdTAwZjNjaW8gZSwgZW0gc2VndWlkYSwgZm9ybmVcdTAwZTdhIG8gVVJMLCBvIG5vbWUgZSBhIGRlc2NyaVx1MDBlN1x1MDBlM28gb3BjaW9uYWwgZG8gV1NETCBwYXJhIG8gc2VydmlcdTAwZTdvIGEgc2VyIHB1YmxpY2Fkby4gQXV0ZW50aWNhXHUwMGU3XHUwMGUzbyBwb2RlIHNlciBuZWNlc3NcdTAwZTFyaWEuCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9BRFZBTkNFRF9ERVNDPU9idGVuaGEgb3UgbG9jYWxpemUgdW0gbmVnXHUwMGYzY2lvIGUsIGVtIHNlZ3VpZGEsIGZvcm5lXHUwMGU3YSBvIFVSTCBlIHVtIG5vbWUgZG8gZG8gV1NETCBwYXJhIG8gc2VydmlcdTAwZTdvIGEgc2VyIHB1YmxpY2Fkby4gT3V0cm9zIHBhclx1MDBlMm1ldHJvcyB0YW1iXHUwMGU5bSBwb2RlbSBzZXIgZXNwZWNpZmljYWRvcy4gQXV0ZW50aWNhXHUwMGU3XHUwMGUzbyBwb2RlIHNlciBuZWNlc3NcdTAwZTFyaWEuCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQz1Gb3JuZVx1MDBlN2EgbyBVUkwsIG8gbm9tZSBlIHVtYSBkZXNjcmlcdTAwZTdcdTAwZTNvIG9wY2lvbmFsIGRvIFdTREwgcGFyYSBvIHNlcnZpXHUwMGU3byBhIHNlciBwdWJsaWNhZG8uIEF1dGVudGljYVx1MDBlN1x1MDBlM28gcG9kZSBzZXIgbmVjZXNzXHUwMGUxcmlhLgotRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQz1Gb3JuZVx1MDBlN2EgbyBVUkwgZSB1bSBub21lIGRvIFdTREwgcGFyYSBvIHNlcnZpXHUwMGU3byBhIHNlciBwdWJsaWNhZG8uIE91dHJvcyBwYXJcdTAwZTJtZXRyb3MgdGFtYlx1MDBlOW0gcG9kZW0gc2VyIGVzcGVjaWZpY2Fkb3MuIEF1dGVudGljYVx1MDBlN1x1MDBlM28gcG9kZSBzZXIgbmVjZXNzXHUwMGUxcmlhLgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFX1NJTVBMRV9ERVNDPURpZ2l0ZSB1bSBVUkwsICBub21lIGUgZGVzY3JpXHUwMGU3XHUwMGUzbyBvcGNpb25hbCBkbyBXU0RMIHBhcmEgYSBpbnRlcmZhY2UgZGUgc2VydmlcdTAwZTdvIGEgc2VyIHB1YmxpY2FkYS4gQXV0ZW50aWNhXHUwMGU3XHUwMGUzbyBwb2RlIHNlciBuZWNlc3NcdTAwZTFyaWEuCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0VfQURWQU5DRURfREVTQz1Gb3JuZVx1MDBlN2EgbyBVUkwgZSBvIG5vbWUgZG8gV1NETCBwYXJhIGEgaW50ZXJmYWNlIGRlIHNlcnZpXHUwMGU3byBhIHNlciBwdWJsaWNhZGEuIE91dHJvcyBwYXJcdTAwZTJtZXRyb3MgdGFtYlx1MDBlOW0gcG9kZW0gc2VyIGVzcGVjaWZpY2Fkb3MuIEF1dGVudGljYVx1MDBlN1x1MDBlM28gcG9kZSBzZXIgbmVjZXNzXHUwMGUxcmlhLgotRk9STV9MQUJFTF9QVUJMSVNIX0ZPUk09Rm9ybWF0byBkYSBwdWJsaWNhXHUwMGU3XHUwMGUzbwotRk9STV9MQUJFTF9ERVNDUklQVElPTj1EZXNjcmlcdTAwZTdcdTAwZTNvCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OUz1EZXNjcmlcdTAwZTdcdTAwZjVlcwotTVNHX0lORk9fQlVTSU5FU1NfUFVCTElTSEVEPUlXQUIwMTU4SSBPIG5lZ1x1MDBmM2NpbyAlMSBmb2kgcHVibGljYWRvIGNvbSBcdTAwZWF4aXRvLgotTVNHX0lORk9fU0VSVklDRV9QVUJMSVNIRUQ9SVdBQjAxNTlJIE8gc2VydmlcdTAwZTdvICUxIGZvaSBwdWJsaWNhZG8gY29tIFx1MDBlYXhpdG8uCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9QVUJMSVNIRUQ9SVdBQjAxNjBJIEEgaW50ZXJmYWNlIGRlIHNlcnZpXHUwMGU3byAlMSBmb2kgcHVibGljYWRhIGNvbSBcdTAwZWF4aXRvLgotTVNHX0VSUk9SX0lOVkFMSURfTkFNRT1JV0FCMDE2MUUgRGlnaXRlIHVtIG5vbWUgdlx1MDBlMWxpZG8uCi1NU0dfRVJST1JfUk9XX0JMQU5LX0xBTkdVQUdFPUlXQUIwMjUwRSBTZWxlY2lvbmUgdW0gaWRpb21hIHF1ZSBuXHUwMGUzbyBlc3RlamEgZW0gYnJhbmNvICUxIG5hIGxpbmhhICUyLiBBcGVuYXMgYSBwcmltZWlyYSBsaW5oYSBwb2RlIHRlciB1bSBpZGlvbWEgZW0gYnJhbmNvLgotTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0U9SVdBQjAyNTFFIEFsdGVyZSBvIGlkaW9tYSBwYXJhICUxIG5hIGxpbmhhICUyLiBPIGF0dWFsIGpcdTAwZTEgZXN0XHUwMGUxIGVtIHVzby4KLU1TR19FUlJPUl9ST1dfSU5WQUxJRF9URVhUPUlXQUIwMjUyRSBEaWdpdGUgdW0gJTEgdlx1MDBlMWxpZG8gbmEgbGluaGEgJTIKLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMPUlXQUIwMjUzRSBEaWdpdGUgdW0gVVJMIGRvIFdTREwgdlx1MDBlMWxpZG8uCi1NU0dfRVJST1JfTk9fTkFNRVM9SVdBQjAyNTRFIEluY2x1YSBwZWxvIG1lbm9zIHVtIG5vbWUuCi1NU0dfRVJST1JfSU5WQUxJRF9TRVJWSUNFPUlXQUIwMjU1RSBGb3JuZVx1MDBlN2EgdW0gc2VydmlcdTAwZTdvIHZcdTAwZTFsaWRvLgotTVNHX0VSUk9SX0lOVkFMSURfQlVTSU5FU1M9SVdBQjAyNTZFIEZvcm5lXHUwMGU3YSB1bSBuZWdcdTAwZjNjaW8gdlx1MDBlMWxpZG8uCi0KLSMgQnVzaW5lc3MgUHVibGlzaCBTZXJ2aWNlIGFjdGlvbgotQUxUX1BVQkxJU0hfU0VSVklDRT1TZXJ2aVx1MDBlN28gZGUgUHVibGljYVx1MDBlN1x1MDBlM28KLQotIyBXU0RMIEJyb3dzZXIKLVRJVExFX1dTRExfQlJPV1NFUj1OYXZlZ2Fkb3IgZG8gV1NETCAtICUxCi1GT1JNX0xBQkVMX1dTRExfU09VUkNFPVNlbGVjaW9uYXIgdW1hIG9yaWdlbSBkbyBXU0RMOgotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9XRUJQUk9KRUNUUz1Qcm9qZXRvcyBkYSBXZWIKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfRkFWT1JJVEVTPUZhdm9yaXRvcwotRk9STV9MQUJFTF9XRUJfUFJPSkVDVD1Qcm9qZXRvIGRhIFdlYgotRk9STV9MQUJFTF9XU0RMX1VSTD1VUkwgZG8gV1NETAotQUxUX1dTRExfQlJPV1NFUj1OYXZlZ2Fkb3IgZG8gV1NETAotCi0jIERldGFpbHMKLUZPUk1fTElOS19FRElUPUVkaXRhcgotRk9STV9MSU5LX0NBTkNFTD1DYW5jZWxhcgotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9Q2hhdmUgZGUgTmVnXHUwMGYzY2lvcwotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1DaGF2ZSBkZSBTZXJ2aVx1MDBlN28KLUZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VfS0VZPUNoYXZlIFRNb2RlbAotRk9STV9MQUJFTF9VU0VSX0RFRklORURfQ0FURUdPUklFUz1DYXRlZ29yaWFzIERlZmluaWRhcyBwZWxvIFVzdVx1MDBlMXJpbwotRk9STV9MQUJFTF9DSEVDS0VEPVZlcmlmaWNhZG8KLUZPUk1fTEFCRUxfRklMRT1BcnF1aXZvCi1NU0dfUVVFU1RJT05fUFVCTElTSF9JVEVNPU8gaXRlbSBuXHUwMGUzbyBwXHUwMGY0ZGUgc2VyIGxvY2FsaXphZG8gbm8gcmVnaXN0cm8uRGVzZWphIHB1YmxpY1x1MDBlMS1sbz8KLU1TR19RVUVTVElPTl9TRVJWSUNFX1BVQkxJU0hfQlVTSU5FU1M9TyBzZXJ2aVx1MDBlN28gZSBzZXUgbmVnXHUwMGYzY2lvIG5cdTAwZTNvIHB1ZGVyYW0gc2VyIGxvY2FsaXphZG9zIG5vIHJlZ2lzdHJvLiBDb250aW51YXIgYSBwdWJsaWNhXHUwMGU3XHUwMGUzbz8KLU1TR19JTkZPX0JVU0lORVNTX1VQREFURUQ9SVdBQjAyNTdJIE8gbmVnXHUwMGYzY2lvICUxIGZvaSBhdHVhbGl6YWRvIGNvbSBcdTAwZWF4aXRvLgotTVNHX0lORk9fU0VSVklDRV9VUERBVEVEPUlXQUIwMjU4SSBPIHNlcnZpXHUwMGU3byAlMSBmb2kgYXR1YWxpemFkbyBjb20gXHUwMGVheGl0by4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VQREFURUQ9SVdBQjAyNTlJIEEgSW50ZXJmYWNlIGRlIFNlcnZpXHUwMGU3byAlMSBmb2kgYXR1YWxpemFkYSBjb20gXHUwMGVheGl0by4KLU1TR19JTkZPX1JFR0lTVFJZX1VQREFURUQ9SVdBQjAzMjNJIE8gcmVnaXN0cm8gJTEgZm9pIGF0dWFsaXphZG8gY29tIFx1MDBlYXhpdG8uCi0KLSMgVW5wdWJsaXNoQWN0aW9uCi1BTFRfVU5QVUJMSVNIX0JVU0lORVNTPUNhbmNlbGFyIFB1YmxpY2FcdTAwZTdcdTAwZTNvIGRvIE5lZ1x1MDBmM2NpbwotQUxUX1VOUFVCTElTSF9TRVJWSUNFPUNhbmNlbGFyIFB1YmxpY2FcdTAwZTdcdTAwZTNvIGRvIFNlcnZpXHUwMGU3bwotQUxUX1VOUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRT1DYW5jZWxhciBQdWJsaWNhXHUwMGU3XHUwMGUzbyBkYSBJbnRlcmZhY2UgZGUgU2VydmlcdTAwZTdvCi1GT1JNX0xBQkVMX1VOUFVCTElTSF9ERVNDPVByZXNzaW9uZSA8c3Ryb25nPklyPC9zdHJvbmc+IHBhcmEgY2FuY2VsYXIgYSBwdWJsaWNhXHUwMGU3XHUwMGUzbyBkZXNzZSBwcm9qZXRvLiBBdXRlbnRpY2FcdTAwZTdcdTAwZTNvIHBvZGUgc2VyIG5lY2Vzc1x1MDBlMXJpYS4KLU1TR19JTkZPX0JVU0lORVNTX1VOUFVCTElTSEVEPUlXQUIwMjYwSSBPIGNhbmNlbGFtZW50byBkYSBwdWJsaWNhXHUwMGU3XHUwMGUzbyAgZG8gbmVnXHUwMGYzY2lvICUxIG9jb3JyZXUgY29tIFx1MDBlYXhpdG8uCi1NU0dfSU5GT19TRVJWSUNFX1VOUFVCTElTSEVEPUlXQUIwMjYxSSBPIGNhbmNlbGFtZW50byBkYSBwdWJsaWNhXHUwMGU3XHUwMGUzbyBkbyBzZXJ2aVx1MDBlN28gJTEgb2NvcnJldSBjb20gXHUwMGVheGl0by4KLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VOUFVCTElTSEVEPUlXQUIwMjYySSBPIGNhbmNlbGFtZW50byBkYSBwdWJsaWNhXHUwMGU3XHUwMGUzbyBkYSBpbnRlcmZhY2UgZGUgc2VydmlcdTAwZTdvICUxIG9jb3JyZXUgY29tIFx1MDBlYXhpdG8uCi0KLSMgQWRkIHRvIFdTREwgUGVyc3BlY3RpdmUKLUFMVF9BRERfVE9fV1NETF9QRVJTUEVDVElWRT1JbmNsdWlyIG5hIFBcdTAwZTFnaW5hIGRvIFdTREwKLU1TR19JTkZPX1dTRExfQURERURfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3NkkgJTEgZm9pIGluY2x1XHUwMGVkZG8gY29tIFx1MDBlYXhpdG8gbmEgcFx1MDBlMWdpbmEgZG8gV1NETC4KLU1TR19FUlJPUl9XU0RMX05PVF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzc3RSAlMSBuXHUwMGUzbyBwXHUwMGY0ZGUgc2VyIGluY2x1XHUwMGVkZG8gbmEgcFx1MDBlMWdpbmEgZG8gV1NETC4KLQotIyBBZGQgdG8gRmF2b3JpdGVzCi1BTFRfQUREX1RPX0ZBVk9SSVRFUz1JbmNsdWlyIGVtIEZhdm9yaXRvcwotTVNHX0lORk9fRkFWT1JJVEVfQURERUQ9SVdBQjAyNjNJICUxIGZvaSBpbmNsdVx1MDBlZGRvIGNvbSBcdTAwZWF4aXRvIGVtIGZhdm9yaXRvcy4KLU1TR19FUlJPUl9GQVZPUklURV9OT1RfQURERUQ9SVdBQjAyNjRFICUxIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgaW5jbHVcdTAwZWRkbyBlbSBmYXZvcml0b3MuCi1NU0dfRVJST1JfRkFWT1JJVEVfQUxSRUFEWV9FWElTVFM9SVdBQjAzMjRFICUxIGpcdTAwZTEgZXhpc3RlIGVtIGZhdm9yaXRvcy4KLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPUVzc2UgZmF2b3JpdG8galx1MDBlMSBleGlzdGUuICBEZXNlamEgc3Vic3RpdHVpcj8KLQotIyBSZWZyZXNoCi1NU0dfSU5GT19OT0RFX1JFRlJFU0hFRD1JV0FCMDI2NUkgJTEgYXR1YWxpemFkby4KLU1TR19RVUVTVElPTl9SRU1PVkVfTk9ERT0lMSBuXHUwMGUzbyBwXHUwMGY0ZGUgc2VyIGxvY2FsaXphZG8gbm8gcmVnaXN0cm8uIERlc2VqYSBsaW1wXHUwMGUxLWxvPwotCi0jIE1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlcwotQUxUX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTPUdlcmVuY2lhciBTZXJ2aVx1MDBlN29zIFJlZmVyaWRvcwotRk9STV9MQUJFTF9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFU19ERVNDPUluY2x1YSBzZXJ2aVx1MDBlN29zIGRlc2NvYmVydG9zIG91IHB1YmxpY2Fkb3MgbmEgbGlzdGEgZGUgc2VydmlcdTAwZTdvcyByZWZlcmlkb3MsIGNsaWNhbmRvIG5vIGJvdFx1MDBlM28gPHN0cm9uZz5JbmNsdWlyIFNlcnZpXHUwMGU3b3M8L3N0cm9uZz4uIFJlbW92YSBhcyByZWZlclx1MDBlYW5jaWFzIHNlbGVjaW9uYWRhcywgY2xpY2FuZG8gbm8gYm90XHUwMGUzbyA8c3Ryb25nPlJlbW92ZXIgUmVmZXJcdTAwZWFuY2lhczwvc3Ryb25nPi4gQSBhdXRlbnRpY2FcdTAwZTdcdTAwZTNvIHBvZGUgc2VyIG5lY2Vzc1x1MDBlMXJpYSBwYXJhIGFsdGVyYVx1MDBlN1x1MDBmNWVzLgotRk9STV9MQUJFTF9SRUZFUkVOQ0VEX1NFUlZJQ0VTPVNlcnZpXHUwMGU3b3MgUmVmZXJpZG9zCi1GT1JNX0JVVFRPTl9BRERfU0VSVklDRVM9SW5jbHVpciBTZXJ2aVx1MDBlN29zCi1GT1JNX0JVVFRPTl9SRU1PVkVfUkVGRVJFTkNFUz1SZW1vdmVyIFJlZmVyXHUwMGVhbmNpYXMKLU1TR19FUlJPUl9OT19SRUZFUkVOQ0VfU0VMRUNURUQ9SVdBQjAyNjZFIFNlbGVjaW9uZSBwZWxvIG1lbm9zIHVtIHNlcnZpXHUwMGU3byByZWZlcmlkbyBhbnRlcyBkZSBjb250aW51YXIuCi1NU0dfRVJST1JfTk9fU0VSVklDRVM9SVdBQjAyNjdFIE9idGVuaGEgb3UgbG9jYWxpemUgcGVsbyBtZW5vcyB1bSBzZXJ2aVx1MDBlN28gYW50ZXMgZGUgY29udGludWFyLgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX1JFRkVSRU5DRUQ9SVdBQjAyNjhFIE8gc2VydmlcdTAwZTdvICUxIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgcmVmZXJpZG8uCi1NU0dfRVJST1JfUkVGRVJFTkNFX05PVF9SRU1PVkVEPUlXQUIwMjY5RSBBIHJlZmVyXHUwMGVhbmNpYSBkZSBzZXJ2aVx1MDBlN28gJTEgblx1MDBlM28gcFx1MDBmNGRlIHNlciByZW1vdmlkYS4KLU1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFRD1JV0FCMDI3MEkgTyBzZXJ2aVx1MDBlN28gJTEgZm9pIHJlZmVyaWRvIGNvbSBcdTAwZWF4aXRvLgotTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VfUkVNT1ZFRD1JV0FCMDI3MUkgYSByZWZlclx1MDBlYW5jaWEgZGUgc2VydmlcdTAwZTdvICUxIGZvaSByZW1vdmlkYSBjb20gXHUwMGVheGl0by4KLQotIyBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zCi1BTFRfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPUdlcmVuY2lhciBBZmlybWF0aXZhcyBkbyBQdWJsaWNhZG9yCi1GT1JNX0xBQkVMX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OU19ERVNDPUluY2x1aXIgbmVnXHUwMGYzY2lvcyBkZXNjb2JlcnRvcyBvdSBwdWJsaWNhZG9zIG5hIGxpc3RhIGRlIGFmaXJtYXRpdmFzIGRvIHB1YmxpY2Fkb3IsIGNsaWNhbmRvIGVtIDxzdHJvbmc+SW5jbHVpciBBZmlybWF0aXZhczwvc3Ryb25nPi4gUmVtb3ZhIGFzIGFmaXJtYXRpdmFzIHNlbGVjaW9uYWRhcywgY2xpY2FuZG8gbm8gYm90XHUwMGUzbyA8c3Ryb25nPlJlbW92ZXIgQWZpcm1hdGl2YXM8L3N0cm9uZz4uIENvbXBsZXRlIGFzIGFmaXJtYXRpdmFzIHNlbGVjaW9uYWRhcywgY2xpY2FuZG8gZW0gPHN0cm9uZz5Db21wbGV0YXIgQWZpcm1hdGl2YXM8L3N0cm9uZz4uIENsaXF1ZSBlbSA8c3Ryb25nPkF0dWFsaXphciBBZmlybWF0aXZhczwvc3Ryb25nPiBwYXJhIGF0dWFsaXphciBhIGxpc3RhIGRlIGFmaXJtYXRpdmFzLgotRk9STV9MQUJFTF9JTkNPTVBMRVRFX0FTU0VSVElPTlNfVklTSUJJTElUWV9ERVNDPU9ic2VydmUgcXVlIGFmaXJtYXRpdmFzIGluY29tcGxldGFzIGRvIHNlcnZpZG9yIGVzdFx1MDBlM28gdmlzXHUwMGVkdmVpcyBhcGVuYXMgcGFyYSBvIHByb3ByaWV0XHUwMGUxcmlvIGRvIG5lZ1x1MDBmM2Npby4KLUZPUk1fTEFCRUxfQlVTSU5FU1NFUz1OZWdcdTAwZjNjaW9zCi1GT1JNX0JVVFRPTl9TSE9XX0FMTF9QVUJMSVNIRVJfQVNTRVJUSU9OUz1BdHVhbGl6YXIgQWZpcm1hdGl2YXMKLUZPUk1fQlVUVE9OX0NPTVBMRVRFX1BVQkxJU0hFUl9BU1NFUlRJT05TPUNvbXBsZXRhciBBZmlybWF0aXZhcwotRk9STV9CVVRUT05fQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TPUluY2x1aXIgQWZpcm1hdGl2YXMKLUZPUk1fQlVUVE9OX1JFTU9WRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1SZW1vdmVyIEFmaXJtYXRpdmFzCi1NU0dfSU5GT19QVUJMSVNIRVJfQVNTRVJUSU9OU19SRUZSRVNIRUQ9SVdBQjAzMjVJIEFzIEFmaXJtYXRpdmFzIGRvIFB1YmxpY2Fkb3IgZm9yYW0gYXR1YWxpemFkYXMuCi1NU0dfRVJST1JfTk9fSU5DT01QTEVURV9BU1NFUlRJT05fU0VMRUNURUQ9SVdBQjAzMjZFIFNlbGVjaW9uZSBwZWxvIG1lbm9zIHVtYSBhZmlybWF0aXZhIGRvIHB1YmxpY2Fkb3IgaW5jb21wbGV0YS4KLU1TR19FUlJPUl9OT1RfT1dORURfQlVTSU5FU1M9SVdBQjAzMjdFIEVzdGEgb3BlcmFcdTAwZTdcdTAwZTNvIG5cdTAwZTNvIHBvZGUgc2VyIGV4ZWN1dGFkYSBlbSB1bSBuZWdcdTAwZjNjaW8gcGVydGVuY2VudGUgYSBvdXRyYSBwZXNzb2EuCi0KLSMgR2V0QnVzaW5lc3NlcwotQUxUX0dFVF9CVVNJTkVTUz1PYnRlciBOZWdcdTAwZjNjaW8KLUFMVF9HRVRfQlVTSU5FU1NFUz1PYnRlciBOZWdcdTAwZjNjaW9zCi1OT0RFX05BTUVfU0VSVklDRV9CVVNJTkVTUz1OZWdcdTAwZjNjaW8gcGFyYSBvIHNlcnZpXHUwMGU3byAlMQotTk9ERV9OQU1FX1NJX0JVU0lORVNTRVM9TmVnXHUwMGYzY2lvcyBwYXJhIGEgaW50ZXJmYWNlIGRlIHNlcnZpXHUwMGU3byAlMQotTVNHX1FVRVNUSU9OX1JFTU9WRV9TRVJWSUNFX05PREU9TyBzZXJ2aVx1MDBlN28gblx1MDBlM28gcFx1MDBmNGRlIHNlciBsb2NhbGl6YWRvIG5vIHJlZ2lzdHJvLiBEZXNlamEgcmVtb3ZlciBlc3RlIG5cdTAwZjM/Ci0KLSMgR2V0U2VydmljZUludGVyZmFjZXMKLUFMVF9HRVRfU0VSVklDRV9JTlRFUkZBQ0VTPU9idGVyIEludGVyZmFjZXMgZGUgU2VydmlcdTAwZTdvCi1OT0RFX05BTUVfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVM9SW50ZXJmYWNlcyBkZSBzZXJ2aVx1MDBlN28gcGFyYSBvIHNlcnZpXHUwMGU3byAlMQotTVNHX1FVRVNUSU9OX0dFVF9TSV9SRU1PVkVfU0VSVklDRV9OT0RFPU8gc2VydmlcdTAwZTdvIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgbG9jYWxpemFkbyBubyByZWdpc3Ryby4gRGVzZWphIHJlbW92ZXIgZXN0ZSBuXHUwMGYzPwotCi0jIEdldFNlcnZpY2VzCi1BTFRfR0VUX1NFUlZJQ0VTPU9idGVyIFNlcnZpXHUwMGU3b3MKLU5PREVfTkFNRV9TSV9TRVJWSUNFUz1TZXJ2aVx1MDBlN29zIHBhcmEgYSBpbnRlcmZhY2UgZGUgc2VydmlcdTAwZTdvICUxCi1OT0RFX05BTUVfQlVTSU5FU1NfU0VSVklDRVM9U2VydmlcdTAwZTdvcyBwYXJhIG8gbmVnXHUwMGYzY2lvICUxCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1NJX05PREU9QSBpbnRlcmZhY2UgZGUgc2VydmlcdTAwZTdvIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgbG9jYWxpemFkYSBubyByZWdpc3Ryby4gRGVzZWphIHJlbW92ZXIgZXN0ZSBuXHUwMGYzPwotTVNHX1FVRVNUSU9OX1JFTU9WRV9CVVNJTkVTU19OT0RFPU8gbmVnXHUwMGYzY2lvIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgbG9jYWxpemFkbyBubyByZWdpc3Ryby4gRGVzZWphIHJlbW92ZXIgZXN0ZSBuXHUwMGYzPwotCi0jIFJlZnJlc2hVRERJTm9kZXNBY3Rpb24KLU1TR19FUlJPUl9OT0RFX0RBVEFfVkFMSURBVElPTl9GQUlMRUQ9SVdBQjAyNzJFICUxIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgbG9jYWxpemFkbyBubyByZWdpc3Ryby4KLQotIyBTdW1tYXJpZXMKLUFMVF9TVU1NQVJZX1FVRVJJRVM9UmVzdW1vIGRlIENvbnN1bHRhcwotQUxUX1NVTU1BUllfQlVTSU5FU1NFUz1SZXN1bW8gZGUgTmVnXHUwMGYzY2lvcwotQUxUX1NVTU1BUllfU0VSVklDRVM9UmVzdW1vIGRlIFNlcnZpXHUwMGU3b3MKLUFMVF9TVU1NQVJZX1NFUlZJQ0VfSU5URVJGQUNFUz1SZXN1bW8gZGUgSW50ZXJmYWNlcyBkZSBTZXJ2aVx1MDBlN28KLUZPUk1fTEFCRUxfUVVFUklFUz1Db25zdWx0YXMKLQotIyBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24KLU1TR19RVUVTVElPTl9JVEVNX1ZBTElEQVRJT05fRkFJTEVEPSUxIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgbG9jYWxpemFkbyBubyByZWdpc3Ryby4gRGVzZWphIHJlbW92XHUwMGVhLWxvPwotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1Db250XHUwMGVhaW5lciBkbyBOYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPUJhcnJhIGRlIEZlcnJhbWVudGFzIGRvIE5hdmVnYWRvcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9Q29udGVcdTAwZmFkbyBkbyBOYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPUNvbnRcdTAwZWFpbmVyIGRlIEFcdTAwZTdcdTAwZjVlcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9Q29udFx1MDBlYWluZXIgZGUgUHJvcHJpZWRhZGVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9QmFycmEgZGUgRmVycmFtZW50YXMgZGUgUHJvcHJpZWRhZGVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9Q29udGVcdTAwZmFkbyBkYXMgUHJvcHJpZWRhZGVzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPUNvbnRcdTAwZWFpbmVyIGRlIFN0YXR1cwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9QmFycmEgZGUgRmVycmFtZW50YXMgZGUgU3RhdHVzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZVx1MDBmYWRvIGRvIFN0YXR1cwotRlJBTUVfVElUTEVfVURESV9QRVJTUEVDVElWRV9DT05URU5UPUNvbnRlXHUwMGZhZG8gZGEgUFx1MDBlMWdpbmEgZG8gVURESQotRlJBTUVfVElUTEVfQ0FURUdPUklFU19XT1JLQVJFQT1cdTAwYzFyZWEgZGUgVHJhYmFsaG8gZGEgQ2F0ZWdvcmlhCi1GUkFNRV9USVRMRV9DQVRFR09SSUVTX1RPT0xCQVI9QmFycmEgZGUgRmVycmFtZW50YXMgZGFzIENhdGVnb3JpYXMKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfQ09OVEVOVD1Db250ZVx1MDBmYWRvIGRhcyBDYXRlZ29yaWFzCi1GUkFNRV9USVRMRV9XU0RMX1RPT0xCQVI9QmFycmFzIGRlIEZlcnJhbWVudGFzIGRvIE5hdmVnYWRvciBkbyBXU0RMCi1GUkFNRV9USVRMRV9XU0RMX0NPTlRFTlQ9Q29udGVcdTAwZmFkbyBkbyBOYXZlZ2Fkb3IgZG8gV1NETAotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX0JVU0lORVNTX0RFVEFJTFM9Rm9ybXVsXHUwMGUxcmlvIGRlIERldGFsaGVzIGRvIE5lZ1x1MDBmM2NpbwotRk9STV9USVRMRV9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0U9Rm9ybXVsXHUwMGUxcmlvIGRvIFNlcnZpXHUwMGU3byBkZSBQdWJsaWNhXHUwMGU3XHUwMGUzbyBkbyBOZWdcdTAwZjNjaW8KLUZPUk1fVElUTEVfR0VUX0ZPUk09U2VsZWNpb25hciBubyBGb3JtdWxcdTAwZTFyaW8gZGUgT2JqZXRvcyBEZXNjb2JlcnRvcyBlIFB1YmxpY2Fkb3MKLUZPUk1fVElUTEVfSVRFTVNfU1VNTUFSWT1SZXN1bW8gZG8gRm9ybXVsXHUwMGUxcmlvIGRlIEl0ZW5zCi1GT1JNX1RJVExFX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1HZXJlbmNpYXIgRm9ybXVsXHUwMGUxcmlvIGRlIEFmaXJtYXRpdmFzIGRvIFB1YmxpY2Fkb3IKLUZPUk1fVElUTEVfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVM9R2VyZW5jaWFyIEZvcm11bFx1MDBlMXJpbyBkZSBTZXJ2aVx1MDBlN29zIFJlZmVyaWRvcwotRk9STV9USVRMRV9PUEVOX1JFR0lTVFJZPUFicmlyIEZvcm11bFx1MDBlMXJpbyBkZSBSZWdpc3RybwotRk9STV9USVRMRV9SRUdJU1RSWV9ERVRBSUxTPUZvcm11bFx1MDBlMXJpbyBkZSBEZXRhbGhlcyBkbyBSZWdpc3RybwotRk9STV9USVRMRV9SRUdJU1RSWV9QVUJMSVNIPUZvcm11bFx1MDBlMXJpbyBkZSBQdWJsaWNhXHUwMGU3XHUwMGUzbyBkbyBSZWdpc3RybwotRk9STV9USVRMRV9SRUdJU1RSWV9GSU5EPUZvcm11bFx1MDBlMXJpbyBkZSBMb2NhbGl6YVx1MDBlN1x1MDBlM28gZG8gUmVnaXN0cm8KLUZPUk1fVElUTEVfUkVTVUxUUz1Gb3JtdWxcdTAwZTFyaW8gZGUgUmVzdWx0YWRvcwotRk9STV9USVRMRV9TRVJWSUNFX0RFVEFJTFM9Rm9ybXVsXHUwMGUxcmlvIGRlIERldGFsaGVzIGRvIFNlcnZpXHUwMGU3bwotRk9STV9USVRMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPUZvcm11bFx1MDBlMXJpbyBkZSBEZXRhbGhlcyBkYSBJbnRlcmZhY2UgZGUgU2VydmlcdTAwZTdvCi1GT1JNX1RJVExFX1VOUFVCTElTSD1DYW5jZWxhciBQdWJsaWNhXHUwMGU3XHUwMGUzbyBkbyBGb3JtdWxcdTAwZTFyaW8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGlfemhfQ04ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGlfemhfQ04ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhMGQ1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX3poX0NOLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9VURESQotCi0jIE5vZGVzCi1OT0RFX05BTUVfVURESV9NQUlOPVVEREkgXHU0ZTNiXHU4OTgxCi1OT0RFX05BTUVfUVVFUklFU19GT0xERVI9XHU2MjY3XHU4ODRjXHU3Njg0XHU2N2U1XHU4YmUyCi1OT0RFX05BTUVfUFVCTElTSEVEX0JVU0lORVNTRVNfRk9MREVSPVx1NTNkMVx1NWUwM1x1NzY4NFx1NGUxYVx1NTJhMQotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFU19GT0xERVI9XHU1M2QxXHU1ZTAzXHU3Njg0XHU2NzBkXHU1MmExCi1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVI9XHU1M2QxXHU1ZTAzXHU3Njg0XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzCi0KLSMgT3BlblJlZ2lzdHJ5QWN0aW9uCi1BTFRfT1BFTl9SRUdJU1RSWT1cdTYyNTNcdTVmMDBcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzMKLUZPUk1fTEFCRUxfT1BFTl9SRUdJU1RSWV9ERVNDPVx1NjMwN1x1NWI5YVx1ODk4MVx1NjI1M1x1NWYwMFx1NzY4NFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NzY4NFx1NTQwZFx1NzlmMFx1NTQ4Y1x1NjdlNVx1OGJlMiBVUkxcdTMwMDJcdTkwMDlcdTYyZTlcdTY1MzZcdTg1Y2ZcdTU5MzlcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdTVjMDZcdTgxZWFcdTUyYThcdTU4NmJcdTUxNDVcdTVmYzVcdTk3MDBcdTc2ODRcdTRmZTFcdTYwNmZcdTMwMDJcdTYzMDk8c3Ryb25nPlx1NjI2N1x1ODg0Yzwvc3Ryb25nPlx1NGVlNVx1NjI1M1x1NWYwMFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1MzAwMgotRk9STV9MQUJFTF9GQVZPUklURV9SRUdJU1RSWT1cdTY1MzZcdTg1Y2ZcdTU5MzlcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzMKLUZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRT1cdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdTU0MGRcdTc5ZjAKLUZPUk1fTEFCRUxfSU5RVUlSWV9VUkw9XHU2N2U1XHU4YmUyIFVSTAotRk9STV9MQUJFTF9DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUz1cdTY4YzBcdTY3ZTVcdTc1MjhcdTYyMzdcdTViOWFcdTRlNDlcdTc2ODRcdTdjN2JcdTUyMmIKLURFRkFVTFRfUkVHSVNUUllfTkFNRT1JQk0gVURESSBcdTZkNGJcdThiZDVcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzMKLU1TR19FUlJPUl9JTlZBTElEX1JFR0lTVFJZX05BTUU9SVdBQjAxMzZFIFx1OGY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NTQwZFx1NzlmMFx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfSU5RVUlSWV9VUkw9SVdBQjAxMzhFIFx1OGY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NjdlNVx1OGJlMiBVUkxcdTMwMDIKLU1TR19JTkZPX1JFR0lTVFJZX09QRU5FRD1JV0FCMDEzOUkgXHU1ZGYyXHU2MjEwXHU1MjlmXHU2MjUzXHU1ZjAwXHU0ZjRkXHU0ZThlICUyIFx1NzY4NFx1NTQwZFx1NGUzYSAlMSBcdTc2ODRcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdTMwMDIKLUZPUk1fTEFCRUxfSVNfV0VCU1BIRVJFX1VERElfUkVHSVNUUlk9XHU2NjJmIFdlYlNwaGVyZSBVRERJIFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NTQxN1x1ZmYxZgotREVGQVVMVF9SRUdJU1RSWV9OQU1FX1dFQlNQSEVSRT1JQk0gV2ViU3BoZXJlIFx1NGUxM1x1NzUyOCBVRERJIFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjMwotRk9STV9MQUJFTF9SRUdJU1RSWV9IT1NUPVx1NGUzYlx1NjczYQotRk9STV9MQUJFTF9SRUdJU1RSWV9QT1JUPVx1N2FlZlx1NTNlMwotCi0jIFVzZXItZGVmaW5lZCBDYXRlZ29yaWVzCi1GT1JNX0xBQkVMX0FERF9DQVRFR09SWV9EQVRBPTxhIGhyZWY9IiUxIj5cdTUzNTVcdTUxZmJcdTZiNjRcdTU5MDQ8L2E+XHU0ZWU1XHU4OGM1XHU1MTY1XHU2YjY0XHU3YzdiXHU1MjJiXHU3Njg0XHU2NTcwXHU2MzZlXHUzMDAyCi1GT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfRklMRT1cdTdjN2JcdTUyMmJcdTY1NzBcdTYzNmVcdTY1ODdcdTRlZjZcdTU0MGQKLU1TR19JTkZPX05PX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTX0ZPVU5EPUlXQUIwMzcxSSBcdTY3MmFcdTY4YzBcdTZkNGJcdTUyMzBcdTc1MjhcdTYyMzdcdTViOWFcdTRlNDlcdTc2ODRcdTdjN2JcdTUyMmJcdTMwMDIKLU1TR19JTkZPX05PX0NBVEVHT1JZX0RBVEE9SVdBQjAzNzJJICUxIFx1NzY4NFx1N2M3Ylx1NTIyYlx1NjU3MFx1NjM2ZVx1NGUwZFx1NTNlZlx1NzUyOFx1NjIxNlx1NjVlMFx1NjU0OFx1MzAwMgotTVNHX0lORk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfTE9BREVEPUlXQUIwMzczSSBcdTVkZjJcdTYyMTBcdTUyOWZcdTg4YzVcdTUxNjVcdTc1MjhcdTYyMzdcdTViOWFcdTRlNDlcdTc2ODRcdTdjN2JcdTUyMmIgJTEgXHU3Njg0XHU2NTcwXHU2MzZlXHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0tFWT1JV0FCMDM3NEUgXHU3NTI4XHU2MjM3XHU1YjlhXHU0ZTQ5XHU3Njg0XHU3YzdiXHU1MjJiICUxIFx1NzY4NFx1NjU3MFx1NjM2ZVx1NjU4N1x1NGVmNlx1NjVlMFx1NjU0OFx1MzAwMlx1NTNkMVx1NzNiMFx1N2M3Ylx1NTIyYlx1OTUyZVx1MjAxYyUyXHUyMDFkXHVmZjBjXHU0ZjQ2XHU3YzdiXHU1MjJiXHU5NTJlXHU1ZTk0XHU4YmU1XHU0ZTNhXHUyMDFjJTNcdTIwMWRcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfRk9STUFUPUlXQUIwNDczRSBcdTc1MjhcdTYyMzdcdTViOWFcdTRlNDlcdTc2ODRcdTdjN2JcdTUyMmIgJTIgXHU3Njg0XHU2NTcwXHU2MzZlXHU2NTg3XHU0ZWY2XHU3Njg0XHU3YjJjICUxIFx1ODg0Y1x1NjgzY1x1NWYwZlx1NjcyYVx1NzdlNVx1MzAwMlx1OGJlNVx1ODg0Y1x1NjYyZlx1ZmYxYVx1MjAxYyUzXHUyMDFkCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFPUlXQUIwMzc1RSBcdTc1MjhcdTYyMzdcdTViOWFcdTRlNDlcdTc2ODRcdTdjN2JcdTUyMmIgJTEgXHU3Njg0XHU2NTcwXHU2MzZlXHU2NTg3XHU0ZWY2XHU2NWUwXHU2NTQ4XHUzMDAyCi1NU0dfRVJST1JfU0FWSU5HX0NBVEVHT1JZX0RBVEE9SVdBQjA0NzRFIFx1NGZkZFx1NWI1OFx1N2M3Ylx1NTIyYiAlMSBcdTc2ODRcdTY1NzBcdTYzNmVcdTY1ZjZcdTUzZDFcdTc1MWZcdTk1MTlcdThiZWZcdTMwMDJcdTVmMDJcdTVlMzhcdTY1ODdcdTY3MmNcdWZmMWElMgotCi0jIFVEREkgQ2F0ZWdvcnkgQnJvd3NlcgotVElUTEVfQ0FURUdPUllfQlJPV1NFUj1cdTdjN2JcdTUyMmJcdTZkNGZcdTg5YzhcdTU2NjgKLUFMVF9DQVRFR09SSUVTPVx1N2M3Ylx1NTIyYgotCi0jIERldGFpbHMKLUFMVF9SRUdJU1RSWV9ERVRBSUxTPVx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2ZgotQUxUX0JVU0lORVNTX0RFVEFJTFM9XHU0ZTFhXHU1MmExXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi1BTFRfU0VSVklDRV9ERVRBSUxTPVx1NjcwZFx1NTJhMVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2ZgotQUxUX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi1GT1JNX0xBQkVMX0RFVEFJTFNfRURJVEFCTEU9PHN0cm9uZz4lMTwvc3Ryb25nPiBcdTc2ODRcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTY2M2VcdTc5M2FcdTU5ODJcdTRlMGJcdTMwMDJcdTUzZWZcdTZkZmJcdTUyYTBcdTMwMDFcdTk2NjRcdTUzYmJcdTYyMTZcdTY2ZjRcdTY1MzlcdTY3ZDBcdTRlOWJcdTk4NzlcdTMwMDJcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdThiYTRcdThiYzFcdTYyNGRcdTgwZmRcdThmZGJcdTg4NGNcdTY2ZjRcdTY1MzlcdTMwMDJcdTUxNzZcdTViODNcdTY0Y2RcdTRmNWNcdTUyMTdcdTc5M2FcdTU3MjhcdTZiNjRcdTk4NzVcdTk3NjJcdTc2ODRcdTVlOTVcdTkwZThcdTMwMDIKLQotIyBHZXQKLUFMVF9HRVQ9XHU4M2I3XHU1M2Q2Ci0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZQotRk9STV9DT05UUk9MX1RJVExFX05BTUVfVEVYVF9WQUxVRT1cdTU0MGRcdTc5ZjBcdTUwM2MKLUZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFPVx1NjNjZlx1OGZmMFx1NTAzYwotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FPVx1N2M3Ylx1NTIyYlx1OTUyZVx1NTQwZFx1NzlmMAotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRT1cdTdjN2JcdTUyMmJcdTk1MmVcdTUwM2MKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FPVx1NjgwN1x1OGJjNlx1OTUyZVx1NTQwZFx1NzlmMAotRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX1ZBTFVFPVx1NjgwN1x1OGJjNlx1OTUyZVx1NTAzYwotRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkw9XHU1M2QxXHU3M2IwIFVSTAotCi0jIEZpbmQgYWN0aW9ucwotQUxUX0ZJTkQ9XHU2N2U1XHU2MjdlCi1BTFRfU1VCUVVFUlk9XHU2N2U1XHU2MjdlICUxIFx1NWI1MFx1NjdlNVx1OGJlMgotRk9STV9MQUJFTF9RVUVSWV9OQU1FPVx1NmI2NFx1NjdlNVx1OGJlMlx1NzY4NFx1NTQwZFx1NzlmMAotREVGQVVMVF9RVUVSWV9OQU1FPVx1NjdlNVx1OGJlMlx1N2VkM1x1Njc5YwotREVGQVVMVF9TVUJRVUVSWV9OQU1FPSUxIC0gJTIgXHU1YjUwXHU2N2U1XHU4YmUyCi1GT1JNX0xBQkVMX1NFQVJDSF9GT1I9XHU2NDFjXHU3ZDIyCi1GT1JNX09QVElPTl9CVVNJTkVTU0VTPVx1NGUxYVx1NTJhMQotRk9STV9PUFRJT05fU0VSVklDRVM9XHU2NzBkXHU1MmExCi1GT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVM9XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzCi1GT1JNX0xBQkVMX1NFQVJDSF9UWVBFPVx1NjQxY1x1N2QyMlx1N2M3Ylx1NTc4YgotRk9STV9SQURJT19TSU1QTEU9XHU3YjgwXHU1MzU1Ci1GT1JNX1JBRElPX0FEVkFOQ0VEPVx1OWFkOFx1N2VhNwotRk9STV9SQURJT19VVUlEPVVVSUQKLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU0VTX1NJTVBMRV9ERVNDPVx1OGY5M1x1NTE2NVx1ODk4MVx1NjQxY1x1N2QyMlx1NzY4NFx1NGUxYVx1NTJhMVx1NzY4NFx1OTBlOFx1NTIwNlx1NjIxNlx1NWI4Y1x1NjU3NFx1NTQwZFx1NzlmMFx1MzAwMlx1NTNlZlx1NGY3Zlx1NzUyOFx1MjAxYyVcdTIwMWRcdTdiMjZcdTUzZjdcdTRmNWNcdTRlM2FcdTUzMzlcdTkxNGRcdTRlZmJcdTRmNTVcdTViNTdcdTdiMjZcdTc2ODRcdTkwMWFcdTkxNGRcdTdiMjZcdTMwMDJcdTYzMDk8c3Ryb25nPlx1NjI2N1x1ODg0Yzwvc3Ryb25nPlx1NGVlNVx1NjI2N1x1ODg0Y1x1NjQxY1x1N2QyMlx1MzAwMgotRk9STV9MQUJFTF9GSU5EX0FEVkFOQ0VEX0RFU0M9XHU4ZjkzXHU1MTY1XHU0ZWU1XHU0ZTBiXHU1MjE3XHU3OTNhXHU3Njg0XHU0ZTAwXHU0ZTJhXHU2MjE2XHU1OTFhXHU0ZTJhXHU1M2MyXHU2NTcwXHU3Njg0XHU1MDNjXHUzMDAyXHU1NzI4XHUyMDFjXHU1NDBkXHU3OWYwXHUyMDFkXHU4ODY4XHU3Njg0XHUyMDFjXHU1NDBkXHU3OWYwXHUyMDFkXHU1YjU3XHU2YmI1XHU0ZTJkXHU1M2VmXHU0ZjdmXHU3NTI4XHUyMDFjJVx1MjAxZFx1N2IyNlx1NTNmN1x1NGY1Y1x1NGUzYVx1NTMzOVx1OTE0ZFx1NGVmYlx1NGY1NVx1NWI1N1x1N2IyNlx1NzY4NFx1OTAxYVx1OTE0ZFx1N2IyNlx1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OGJhNFx1OGJjMVx1MzAwMlx1NjMwOTxzdHJvbmc+XHU2MjY3XHU4ODRjPC9zdHJvbmc+XHU0ZWU1XHU2MjY3XHU4ODRjXHU2NDFjXHU3ZDIyXHUzMDAyCi1GT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NfVVVJRF9ERVNDPVx1OGY5M1x1NTE2NVx1ODk4MVx1NjQxY1x1N2QyMlx1NzY4NFx1NGUxYVx1NTJhMVx1NzY4NCBVVUlEXHUzMDAyXHU2MzA5PHN0cm9uZz5cdTYyNjdcdTg4NGM8L3N0cm9uZz5cdTRlZTVcdTYyNjdcdTg4NGNcdTY0MWNcdTdkMjJcdTMwMDIKLUZPUk1fTEFCRUxfTkFNRVM9XHU1NDBkXHU3OWYwCi1GT1JNX0xJTktfQUREPVx1NmRmYlx1NTJhMAotRk9STV9MSU5LX0dFVD1cdTgzYjdcdTUzZDYKLUZPUk1fTElOS19GSU5EPVx1NjdlNVx1NjI3ZQotRk9STV9MSU5LX1JFTU9WRT1cdTk2NjRcdTUzYmIKLUZPUk1fTEFCRUxfT1dORUQ9XHU2MmU1XHU2NzA5XHU3Njg0Ci1GT1JNX0xBQkVMX1BVQkxJU0hfVVJMPVx1NTNkMVx1NWUwMyBVUkwKLUZPUk1fTEFCRUxfVVNFUklEPVx1NzUyOFx1NjIzN1x1NjgwN1x1OGJjNgotRk9STV9MQUJFTF9QQVNTV09SRD1cdTViYzZcdTc4MDEKLUZPUk1fTEFCRUxfTEFOR1VBR0U9XHU4YmVkXHU4YTAwCi1GT1JNX0xBQkVMX05BTUU9XHU1NDBkXHU3OWYwCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPVx1NjNjZlx1OGZmMAotRk9STV9PUFRJT05fTEFOR1VBR0VfRU49XHU4MmYxXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BQT1cdTk2M2ZcdTZjZDVcdTVjMTRcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FCPVx1OTYzZlx1NWUwM1x1NTRjOFx1NTE3OVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfQUY9XHU5NjNmXHU5NzVlXHU1MjI5XHU1ODJhXHU2NWFmXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BTT1cdTk2M2ZcdTU5YzZcdTU0YzhcdTYyYzlcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FSPVx1OTYzZlx1NjJjOVx1NGYyZlx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfQVM9XHU5NjNmXHU4NDI4XHU1OWM2XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9BWT1cdTgyN2VcdTlhNmNcdTYyYzlcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FaPVx1OTYzZlx1NTg1ZVx1NjJkY1x1NzU4Nlx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfQkE9XHU1ZGY0XHU0ZWMwXHU1N2ZhXHU1YzE0XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CRT1cdTc2N2RcdTRmYzRcdTdmNTdcdTY1YWZcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JHPVx1NGZkZFx1NTJhMFx1NTIyOVx1NGU5YVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfQkg9XHU2YmQ0XHU1NGM4XHU1YzE0XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CST1cdTZiZDRcdTY1YWZcdTYyYzlcdTczOWJcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JOPVx1NWI1Zlx1NTJhMFx1NjJjOVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfQk89XHU4NWNmXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9CUj1cdTVlMDNcdTUyMTdcdTU4NTRcdTVjM2NcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NBPVx1NTJhMFx1NmNmMFx1OTY4Nlx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfQ089XHU3OWQxXHU4OTdmXHU1NjA5XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9DWj1cdTYzNzdcdTUxNGJcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NZPVx1NWEwMVx1NWMxNFx1NThlYlx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfREE9XHU0ZTM5XHU5ZWE2XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9ERT1cdTVmYjdcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RaPVx1NGUwZFx1NGUzOVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfRUw9XHU1ZTBjXHU4MTRhXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FTz1cdTRlMTZcdTc1NGNcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VTPVx1ODk3Zlx1NzNlZFx1NzI1OVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfRVQ9XHU3MjMxXHU2Yzk5XHU1YzNjXHU0ZTlhXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9FVT1cdTVkZjRcdTY1YWZcdTUxNGJcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZBPVx1NmNlMlx1NjVhZlx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfRkk9XHU4MmFjXHU1MTcwXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GSj1cdTY1OTBcdTZkNGVcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZPPVx1NmNkNVx1N2Y1N1x1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfRlI9XHU2Y2Q1XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9GWT1cdTVmMTdcdTkxY2NcdTg5N2ZcdTRlOWFcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dBPVx1NzIzMVx1NWMxNFx1NTE3MFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfR0Q9XHU4MmNmXHU2ODNjXHU1MTcwXHU3NmQ2XHU1YzE0XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9HTD1cdTUyYTBcdTUyMjlcdTg5N2ZcdTRlOWFcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dOPVx1NzRkY1x1NjJjOVx1NWMzY1x1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfR1U9XHU1M2U0XHU1NDA5XHU2MmM5XHU3Mjc5XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IQT1cdThjNmFcdTg0MjhcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hJPVx1NTM3MFx1NTczMFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfSFI9XHU1MTRiXHU3ZjU3XHU1NzMwXHU0ZTlhXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9IVT1cdTUzMDhcdTcyNTlcdTUyMjlcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hZPVx1NGU5YVx1N2Y4ZVx1NWMzY1x1NGU5YVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfSUE9XHU1NmZkXHU5NjQ1XHU4YmVkQQotRk9STV9PUFRJT05fTEFOR1VBR0VfSUU9XHU1NmZkXHU5NjQ1XHU4YmVkRQotRk9STV9PUFRJT05fTEFOR1VBR0VfSUs9XHU0ZjBhXHU1MmFhXHU3NmFlXHU1MTRiXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JTj1cdTUzNzBcdTVjM2NcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lTPVx1NTFiMFx1NWM5Ylx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfSVQ9XHU2MTBmXHU1OTI3XHU1MjI5XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JVz1cdTVlMGNcdTRmMmZcdTgzYjFcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pBPVx1NjVlNVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfSkk9XHU0ZjlkXHU1NzMwXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9KVz1cdTcyMmFcdTU0YzdcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tBPVx1NjgzY1x1OWM4MVx1NTQwOVx1NGU5YVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfS0s9XHU1NGM4XHU4NDI4XHU1MTRiXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTD1cdTY4M2NcdTk2NzVcdTUxNzBcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tNPVx1NjdlY1x1NTdkNFx1NWJlOFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfS049XHU1NzRlXHU3ZWIzXHU4ZmJlXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LTz1cdTk3ZTlcdTU2ZmRcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tTPVx1NTE0Ylx1NGVjMFx1N2M3M1x1NWMxNFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfS1U9XHU1ZTkzXHU1YzE0XHU1ZmI3XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9LWT1cdTU0MDlcdTVjMTRcdTU0MDlcdTY1YWZcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xBPVx1NjJjOVx1NGUwMVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfTE49XHU2Nzk3XHU1MmEwXHU2MmM5XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9MTz1cdTgwMDFcdTYzMWRcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xUPVx1N2FjYlx1OTY3Nlx1NWI5Ylx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfTFY9XHU2MmM5XHU4MTMxXHU3ZWY0XHU0ZTlhXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NRz1cdTlhNmNcdThmYmVcdTUyYTBcdTY1YWZcdTUyYTBcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01JPVx1NmJkYlx1NTIyOVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfTUs9XHU5YTZjXHU1MTc2XHU5ODdmXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NTD1cdTlhNmNcdTYyYzlcdTRlOWFcdTYyYzlcdTU5YzZcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01OPVx1ODQ5OVx1NTNlNFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfTU89XHU2NDY5XHU1YzE0XHU4ZmJlXHU3ZWY0XHU0ZTlhXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NUj1cdTlhNmNcdTYyYzlcdTYzZDBcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01TPVx1OWE2Y1x1Njc2NVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfTVQ9XHU5YTZjXHU4MDMzXHU0ZWQ2XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9NWT1cdTdmMDVcdTc1MzhcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05BPVx1NzQ1OVx1OWM4MVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfTkU9XHU1YzNjXHU2Y2NhXHU1YzE0XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9OTD1cdTgzNzdcdTUxNzBcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05PPVx1NjMyYVx1NWEwMVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfT0M9XHU1OTY1XHU1MTRiXHU4OTdmXHU1NTEwXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9PTT1cdTU5NjVcdTZkMWJcdTgzYWJcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09SPVx1NTk2NVx1NTIyOVx1NGU5YVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfUEE9XHU2NWMxXHU5MDZlXHU2NjZlXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9QTD1cdTZjZTJcdTUxNzBcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BTPVx1NWUxNVx1NjViZFx1NTZmZVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfUFQ9XHU4NDYxXHU4NDA0XHU3MjU5XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9RVT1cdTU5NDdcdTY5NWFcdTRlOWFcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JNPVx1NTIyOVx1NjI1OC1cdTdmNTdcdTY2ZmNcdThiZjhcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JOPVx1NTdmYVx1OTY4Nlx1OGZlYVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfUk89XHU3ZjU3XHU5YTZjXHU1YzNjXHU0ZTlhXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9SVT1cdTRmYzRcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JXPVx1NTdmYVx1NWMzY1x1NGU5YVx1NTM2Mlx1NjVmYVx1OGZiZVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfU0E9XHU2OGI1XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TRD1cdTRmZTFcdTVmYjdcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NHPVx1Njg1MVx1NjIwOFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfU0g9XHU1ODVlXHU1YzE0XHU3ZWY0XHU0ZTlhLVx1NTE0Ylx1N2Y1N1x1NTczMFx1NGU5YVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfU0k9XHU1MGU3XHU0ZjNkXHU3ZjU3XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TSz1cdTY1YWZcdTZkMWJcdTRmMTBcdTUxNGJcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NMPVx1NjVhZlx1NmQxYlx1NjU4N1x1NWMzY1x1NGU5YVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfU009XHU4NDI4XHU2NDY5XHU0ZTlhXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TTj1cdTRmZWVcdTdlYjNcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NPPVx1N2QyMlx1OWE2Y1x1OTFjY1x1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfU1E9XHU5NjNmXHU1YzE0XHU1ZGY0XHU1YzNjXHU0ZTlhXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TUj1cdTU4NWVcdTVjMTRcdTdlZjRcdTRlOWFcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NTPVx1ODk3Zlx1NjVhZlx1NzRlNlx1NjNkMFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfU1Q9XHU1ODVlXHU3ZDIyXHU2MjU4XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9TVT1cdTgyY2ZcdTRlMzlcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NWPVx1NzQ1ZVx1NTE3OFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfU1c9XHU2NWFmXHU3NGU2XHU1ZTBjXHU5MWNjXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UQT1cdTZjZjBcdTdjNzNcdTVjMTRcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RFPVx1NmNmMFx1NTM2Mlx1NTZmYVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfVEc9XHU1ODU0XHU1NDA5XHU1MTRiXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9USD1cdTZjZjBcdTU2ZmRcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RJPVx1NjNkMFx1NjgzY1x1OTFjY1x1NWMzY1x1NGU5YVx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfVEs9XHU1NzFmXHU1ZTkzXHU2NmZjXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UTD1cdTRlZDZcdTUyYTBcdTc5ODRcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ROPVx1NTg1ZVx1ODMyOFx1NzRlNlx1N2ViM1x1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfVE89XHU2YzY0XHU1MmEwXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UUj1cdTU3MWZcdTgwMzNcdTUxNzZcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RTPVx1NWI5N1x1NTJhMFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfVFQ9XHU1ODU0XHU1ODU0XHU1YzE0XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9UVz1cdTcyNzlcdTVhMDFcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VLPVx1NGU0Y1x1NTE0Ylx1NTE3MFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfVVI9XHU0ZTRjXHU1YzE0XHU5MGZkXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9VWj1cdTRlNGNcdTUxNzlcdTUyMmJcdTUxNGJcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ZJPVx1OGQ4YVx1NTM1N1x1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfVk89XHU2YzgzXHU2MmM5XHU2NjZlXHU1MTRiXHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9XTz1cdTZjODNcdTZkMWJcdTU5MmJcdThiZWQKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1hIPVx1NzlkMVx1ODQyOFx1OGJlZAotRk9STV9PUFRJT05fTEFOR1VBR0VfWU89XHU3ZWE2XHU5YzgxXHU1ZGY0XHU4YmVkCi1GT1JNX09QVElPTl9MQU5HVUFHRV9aSD1cdTRlMmRcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1pVPVx1Nzk1Nlx1OWM4MVx1OGJlZAotRk9STV9MQUJFTF9FWEFDVF9OQU1FX01BVENIPVx1NWI4Y1x1NTE2OFx1NTMzOVx1OTE0ZAotRk9STV9MQUJFTF9DQVNFX1NFTlNJVElWRV9NQVRDSD1cdTUzM2FcdTUyMDZcdTU5MjdcdTVjMGZcdTUxOTkKLUZPUk1fTEFCRUxfU09VTkRFWD1cdTUzZDFcdTk3ZjNcdTc2ZjhcdTRmM2MKLUZPUk1fTEFCRUxfSURFTlRJRklFUlM9XHU2ODA3XHU4YmM2Ci1GT1JNX0xBQkVMX0lERU5USUZJRVJfVFlQRT1cdTdjN2JcdTU3OGIKLQotIyBEbyBub3QgdHJhbnNsYXRlIHRoZSB0d28gaXRlbXMgYmVsb3cuCi1GT1JNX09QVElPTl9JREVOVElGSUVSX0RVTlM9RC1VLU4tUwotRk9STV9PUFRJT05fSURFTlRJRklFUl9USE9NQVNfUkVHSVNUUlk9VGhvbWFzIFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjMwotCi1GT1JNX0xBQkVMX0tFWV9OQU1FPVx1OTUyZVx1NTQwZFx1NzlmMAotRk9STV9MQUJFTF9LRVlfVkFMVUU9XHU5NTJlXHU1MDNjCi1GT1JNX0xBQkVMX0NBVEVHT1JJRVM9XHU3YzdiXHU1MjJiCi1GT1JNX0xBQkVMX0NBVEVHT1JZX1RZUEU9XHU3YzdiXHU1NzhiCi1GT1JNX09QVElPTl9DQVRFR09SWV9OQUlDUz1OQUlDUwotRk9STV9PUFRJT05fQ0FURUdPUllfVU5TUFNDXzczPVVOU1BTQyA3LjMKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX0dFTz1HRU8KLUZPUk1fT1BUSU9OX0NBVEVHT1JZX0RXQ09NTVVOSVRZPWRXIFx1NTZlMlx1NGY1MwotRk9STV9MQUJFTF9CVVNJTkVTU19DQVRFR09SSUVTPVx1NmJkNFx1OGY4M1x1ZmYxYQotRk9STV9PUFRJT05fQlVTSU5FU1NFU19PTkxZPVx1NGVjNVx1OTAwMlx1NzUyOFx1NGU4ZVx1NGUxYVx1NTJhMQotRk9STV9PUFRJT05fU0VSVklDRVNfT05MWT1cdTRlYzVcdTkwMDJcdTc1MjhcdTRlOGVcdTY3MGRcdTUyYTEKLUZPUk1fT1BUSU9OX0JPVEg9XHU0ZTFhXHU1MmExXHU1NDhjXHU2NzBkXHU1MmExCi1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTFM9XHU1M2QxXHU3M2IwIFVSTAotRk9STV9MQUJFTF9ESVNDT1ZFUllVUkw9XHU1M2QxXHU3M2IwIFVSTAotRk9STV9MQUJFTF9GSU5EUVVBTElGSUVSUz1cdTY3ZTVcdTYyN2VcdTk2NTBcdTViOWFcdTdiMjYKLUZPUk1fTEFCRUxfQ09NQklORV9LRVlTPVx1N2VjNFx1NTQwOFx1NTE3M1x1OTUyZVx1NWI1N1x1ZmYxYQotRk9STV9PUFRJT05fQU5EQUxMS0VZUz1cdTU0OGMKLUZPUk1fT1BUSU9OX09SQUxMS0VZUz1cdTYyMTYKLUZPUk1fT1BUSU9OX09STElLRUtFWVM9XHU2MjE2XHU3YzdiXHU0ZjNjXHU0ZThlCi1GT1JNX0xBQkVMX1NPUlRfQllfTkFNRT1cdTYzMDlcdTU0MGRcdTc5ZjBcdTYzOTJcdTVlOGZcdWZmMWEKLUZPUk1fUkFESU9fU09SVF9BU0M9XHU1MzQ3XHU1ZThmCi1GT1JNX1JBRElPX1NPUlRfREVTQz1cdTk2NGRcdTVlOGYKLUZPUk1fTEFCRUxfU09SVF9CWV9EQVRFPVx1NjMwOVx1NjVlNVx1NjcxZlx1NjM5Mlx1NWU4Zlx1ZmYxYQotRk9STV9MQUJFTF9NQVhfU0VBUkNIX1NFVD1cdTY0MWNcdTdkMjJcdTk2YzZcdTU0MDhcdTc2ODRcdTY3MDBcdTU5MjdcdTU5MjdcdTVjMGZcdWZmMWEKLUZPUk1fTEFCRUxfTUFYX1JFU1VMVFM9XHU2NzAwXHU1OTI3XHU3ZWQzXHU2NzljXHU2NTcwXHVmZjFhCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRVNfU0lNUExFX0RFU0M9XHU4ZjkzXHU1MTY1XHU4OTgxXHU2NDFjXHU3ZDIyXHU3Njg0XHU2NzBkXHU1MmExXHU3Njg0XHU5MGU4XHU1MjA2XHU2MjE2XHU1YjhjXHU2NTc0XHU1NDBkXHU3OWYwXHUzMDAyXHU1M2VmXHU0ZjdmXHU3NTI4XHUyMDFjJVx1MjAxZFx1N2IyNlx1NTNmN1x1NGY1Y1x1NGUzYVx1NTMzOVx1OTE0ZFx1NGVmYlx1NGY1NVx1NWI1N1x1N2IyNlx1NzY4NFx1OTAxYVx1OTE0ZFx1N2IyNlx1MzAwMlx1NjMwOTxzdHJvbmc+XHU2MjY3XHU4ODRjPC9zdHJvbmc+XHU0ZWU1XHU2MjY3XHU4ODRjXHU2NDFjXHU3ZDIyXHUzMDAyCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRV9VVUlEX0RFU0M9XHU4ZjkzXHU1MTY1XHU4OTgxXHU2NDFjXHU3ZDIyXHU3Njg0XHU2NzBkXHU1MmExXHU3Njg0IFVVSURcdTMwMDJcdTYzMDk8c3Ryb25nPlx1NjI2N1x1ODg0Yzwvc3Ryb25nPlx1NGVlNVx1NjI2N1x1ODg0Y1x1NjQxY1x1N2QyMlx1MzAwMgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFU19TSU1QTEVfREVTQz1cdThmOTNcdTUxNjVcdTg5ODFcdTY0MWNcdTdkMjJcdTc2ODRcdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTNcdTc2ODRcdTkwZThcdTUyMDZcdTYyMTZcdTViOGNcdTY1NzRcdTU0MGRcdTc5ZjBcdTMwMDJcdTUzZWZcdTRmN2ZcdTc1MjhcdTIwMWMlXHUyMDFkXHU3YjI2XHU1M2Y3XHU0ZjVjXHU0ZTNhXHU1MzM5XHU5MTRkXHU0ZWZiXHU0ZjU1XHU1YjU3XHU3YjI2XHU3Njg0XHU5MDFhXHU5MTRkXHU3YjI2XHUzMDAyXHU2MzA5PHN0cm9uZz5cdTYyNjdcdTg4NGM8L3N0cm9uZz5cdTRlZTVcdTYyNjdcdTg4NGNcdTY0MWNcdTdkMjJcdTMwMDIKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRV9VVUlEX0RFU0M9XHU4ZjkzXHU1MTY1XHU4OTgxXHU2NDFjXHU3ZDIyXHU3Njg0XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzXHU3Njg0IFVVSURcdTMwMDJcdTYzMDk8c3Ryb25nPlx1NjI2N1x1ODg0Yzwvc3Ryb25nPlx1NGVlNVx1NjI2N1x1ODg0Y1x1NjQxY1x1N2QyMlx1MzAwMgotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVM9XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzCi1GT1JNX0xBQkVMX1VVSURfS0VZPVVVSUQgXHU1YmM2XHU5NGE1XHVmZjFhCi1GT1JNX0xBQkVMX1VTRV9TRVJWSUNFPVx1NGY3Zlx1NzUyOFx1NjcwZFx1NTJhMQotRk9STV9MQUJFTF9TRVJWSUNFPVx1NjcwZFx1NTJhMQotRk9STV9MQUJFTF9CVVNJTkVTUz1cdTRlMWFcdTUyYTEKLUZPUk1fTEFCRUxfUFVCTElTSF9BU1NFUlRJT05TPVx1NTNkMVx1NWUwM1x1NTY2OFx1NjVhZFx1OGEwMAotRk9STV9MQUJFTF9ESVJFQ1RJT049XHU2NWI5XHU1NDExCi1GT1JNX0xBQkVMX0ZST01fS0VZPVx1NmU5MFx1OTUyZQotRk9STV9MQUJFTF9UT19LRVk9XHU3NmVlXHU2ODA3XHU5NTJlCi1GT1JNX0xBQkVMX1NUQVRVUz1cdTcyYjZcdTYwMDEKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX1RZUEU9XHU2NWFkXHU4YTAwXHU3YzdiXHU1NzhiCi1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QQVJFTlRfQ0hJTEQ9XHU3MjM2XHU1YjUwCi1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QRUVSX1RPX1BFRVI9XHU1NDBjXHU3YjQ5Ci1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9JREVOVElUWT1cdTY4MDdcdThiYzYKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX0RJUkVUSU9OX0RFU0M9XHU2NWI5XHU1NDExPHN0cm9uZz5cdTZlOTA8L3N0cm9uZz5cdTVjMDZcdTUyMWJcdTVlZmFcdTc1MzFcdTZiNjRcdTRlMWFcdTUyYTFcdTgxZjNcdTUxNzZcdTRlMGFcdTRlMWFcdTUyYTFcdTc2ODRcdTUzZDFcdTVlMDNcdTU2NjhcdTY1YWRcdThhMDBcdTMwMDJcdTY1YjlcdTU0MTE8c3Ryb25nPlx1NzZlZVx1NjgwNzwvc3Ryb25nPlx1NWMwNlx1NTIxYlx1NWVmYVx1NzUzMVx1NTE3Nlx1NGUwYVx1NGUxYVx1NTJhMVx1ODFmM1x1NmI2NFx1NGUxYVx1NTJhMVx1NzY4NFx1NTNkMVx1NWUwM1x1NTY2OFx1NjVhZFx1OGEwMFx1MzAwMgotRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9GUk9NPS0tLT4KLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9ESVJFQ1RJT05fVE89PC0tLQotRk9STV9MQUJFTF9USElTX0JVU0lORVNTPVx1NmI2NAotTVNHX0VSUk9SX0lOVkFMSURfUVVFUllfTkFNRT1JV0FCMDE0MEUgXHU4ZjkzXHU1MTY1XHU2N2U1XHU4YmUyXHU3Njg0XHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9OQU1FUz1JV0FCMDE0MUUgXHU4ZjkzXHU1MTY1XHU0ZTAwXHU3Y2ZiXHU1MjE3XHU2NzA5XHU2NTQ4XHU1NDBkXHU3OWYwXHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9QVUJMSVNIX1VSTD1JV0FCMDE0MkUgXHU4ZjkzXHU1MTY1XHU2NzA5XHU2NTQ4XHU3Njg0XHU1M2QxXHU1ZTAzIFVSTFx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfVVNFUklEPUlXQUIwMTQzRSBcdThmOTNcdTUxNjVcdTY3MDlcdTY1NDhcdTc2ODRcdTc1MjhcdTYyMzdcdTY4MDdcdThiYzZcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX01BWF9TRUFSQ0hfU0VUPUlXQUIwMTQ1RSBcdThmOTNcdTUxNjVcdTY3MDBcdTU5MjdcdTY0MWNcdTdkMjJcdTk2YzZcdTU0MDhcdTc2ODRcdTY3MDlcdTY1NDhcdTU5MjdcdTVjMGZcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX01BWF9SRVNVTFRTPUlXQUIwMTQ2RSBcdThmOTNcdTUxNjVcdTY3MDBcdTU5MjdcdTdlZDNcdTY3OWNcdTY1NzBcdTc2ODRcdTY3MDlcdTY1NDhcdTU5MjdcdTVjMGZcdTMwMDIKLU1TR19JTkZPX0JVU0lORVNTRVNfRk9VTkQ9SVdBQjAxNDdJIFx1NjI3ZVx1NTIzMFx1NzY4NFx1NGUxYVx1NTJhMVx1NjU3MFx1ZmYxYSUxCi1NU0dfRVJST1JfTk9fQlVTSU5FU1NFU19GT1VORD1JV0FCMDE0OEUgXHU2NzJhXHU2MjdlXHU1MjMwXHU0ZWZiXHU0ZjU1XHU0ZTFhXHU1MmExXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFU19GT1VORD1JV0FCMDE0OUkgXHU2MjdlXHU1MjMwXHU3Njg0XHU2NzBkXHU1MmExXHU2NTcwXHVmZjFhJTEKLU1TR19FUlJPUl9OT19TRVJWSUNFU19GT1VORD1JV0FCMDE1MEUgXHU2NzJhXHU2MjdlXHU1MjMwXHU0ZWZiXHU0ZjU1XHU2NzBkXHU1MmExXHUzMDAyCi1NU0dfRVJST1JfU0lOR0xFX0lURU09SVdBQjAxNTFFIFx1NGVjNVx1OTAwOVx1NjJlOVx1NGUwMFx1OTg3OVx1MzAwMgotTVNHX1FVRVNUSU9OX0lURU1fUkVQTEFDRU1FTlQ9XHU5MDA5XHU2MmU5XHU3Njg0XHU5ODc5XHU1YzA2XHU2NmZmXHU2MzYyXHU1ZGYyXHU1NzI4XHU3NmVlXHU2ODA3XHU0ZTJkXHU3Njg0XHU5ODc5XHUzMDAyXHU2MGYzXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1NDE3XHVmZjFmCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQ9SVdBQjAxNTJJIFx1NjI3ZVx1NTIzMFx1NzY4NFx1NjcwZFx1NTJhMVx1NjNhNVx1NTNlM1x1NjU3MFx1ZmYxYSUxCi1NU0dfRVJST1JfTk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUzRSBcdTY3MmFcdTYyN2VcdTUyMzBcdTRlZmJcdTRmNTVcdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTNcdTMwMDIKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMTU0RSBcdTgxZjNcdTVjMTFcdTkwMDlcdTYyZTlcdTRlMDBcdTk4NzlcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1VVSURfS0VZPUlXQUIwMTU1RSBcdThmOTNcdTUxNjVcdTY3MDlcdTY1NDhcdTc2ODQgVVVJRCBcdTViYzZcdTk0YTVcdTMwMDIKLU1TR19FUlJPUl9RVUVSWV9OQU1FX0NPTkZMSUNUPUlXQUIwMTU2RSBcdTViNTBcdTY3ZTVcdThiZTJcdTc2ODRcdTY3ZTVcdThiZTJcdTU0MGRcdTc5ZjBcdTRlMGRcdTgwZmRcdTRlMGVcdTUzZDFcdThkNzdcdTY1YjlcdTc2ZjhcdTU0MGNcdTMwMDIKLU1TR19FUlJPUl9OT19JVEVNU19UT19HRVQ9SVdBQjAxNTdFIFx1NWMxYVx1NjcyYVx1NTNkMVx1NWUwM1x1NjIxNlx1NTNkMVx1NzNiMFx1NjMwN1x1NWI5YVx1N2M3Ylx1NTc4Ylx1NzY4NFx1OTg3OVx1MzAwMgotCi0jIFJlc3VsdHMKLUFMVF9RVUVSWV9SRVNVTFRTPVx1NjdlNVx1OGJlMlx1N2VkM1x1Njc5YwotRk9STV9MQUJFTF9TVUJRVUVSWT1cdTdlZDNcdTY3OWNcdTUzZWZcdTc1MjhcdTRmNWNcdTUzZTZcdTRlMDBcdTY0Y2RcdTRmNWNcdTc2ODRcdThmOTNcdTUxNjVcdTMwMDJcdTUzNTVcdTUxZmJcdTk4NzZcdTkwZThcdTc2ODQ8c3Ryb25nPlx1NzZlZVx1NjgwNzwvc3Ryb25nPlx1OTRmZVx1NjNhNVx1NGVlNVx1NjdlNVx1NzcwYlx1OGJlNVx1NjRjZFx1NGY1Y1x1MzAwMlx1NTNlZlx1OTAxYVx1OGZjN1x1NTM1NVx1NTFmYjxzdHJvbmc+XHU0ZjIwXHU5MDAxPC9zdHJvbmc+XHU2MzA5XHU5NGFlXHU1NzI4XHU4YmU1XHU2NGNkXHU0ZjVjXHU0ZTJkXHU0ZjdmXHU3NTI4XHU5MDA5XHU2MmU5XHU3Njg0XHU3ZWQzXHU2NzljXHUzMDAyCi1GT1JNX0xBQkVMX1FVRVJZPVx1OTAwOVx1NjJlOVx1N2VkM1x1Njc5Y1x1NGVlNVx1NjdlNVx1NzcwYlx1NjZmNFx1NTkxYVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1NjIxNlx1OTAwOVx1NjJlOVx1NGUwMFx1N2VjNFx1N2VkM1x1Njc5Y1x1NWU3Nlx1NTM1NVx1NTFmYlx1NjMwOVx1OTRhZVx1NGVlNVx1NjI2N1x1ODg0Y1x1NjRjZFx1NGY1Y1x1MzAwMgotRk9STV9MSU5LX1RBUkdFVD1cdTc2ZWVcdTY4MDcKLUZPUk1fQlVUVE9OX1RSQU5TRkVSPVx1NGYyMFx1OTAwMQotRk9STV9CVVRUT05fUkVGUkVTSD1cdTUyMzdcdTY1YjAKLUZPUk1fQlVUVE9OX0FERF9UT19GQVZPUklURVM9XHU2ZGZiXHU1MmEwXHU1MjMwXHU2NTM2XHU4NWNmXHU1OTM5Ci1GT1JNX0JVVFRPTl9VTlBVQkxJU0g9XHU1M2Q2XHU2ZDg4XHU1M2QxXHU1ZTAzCi1GT1JNX0JVVFRPTl9DTEVBUj1cdTZlMDVcdTk2NjQKLQotIyBQdWJsaXNoIGFjdGlvbnMKLUFMVF9QVUJMSVNIPVx1NTNkMVx1NWUwMwotRk9STV9MQUJFTF9QVUJMSVNIPVx1NTNkMVx1NWUwM1x1ZmYxYQotRk9STV9PUFRJT05fQlVTSU5FU1M9XHU0ZTFhXHU1MmExCi1GT1JNX09QVElPTl9TRVJWSUNFPVx1NjcwZFx1NTJhMQotRk9STV9PUFRJT05fU0VSVklDRV9JTlRFUkZBQ0U9XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzCi1GT1JNX0xBQkVMX1BVQkxJU0hfQlVTSU5FU1NfU0lNUExFX0RFU0M9XHU4ZjkzXHU1MTY1XHU4OTgxXHU1M2QxXHU1ZTAzXHU3Njg0XHU0ZTFhXHU1MmExXHU3Njg0XHU1NDBkXHU3OWYwXHU1NDhjXHU2M2NmXHU4ZmYwXHVmZjA4XHU1M2VmXHU5MDA5XHVmZjA5XHUzMDAyXHU1M2VmXHU4MGZkXHU5NzAwXHU4OTgxXHU4YmE0XHU4YmMxXHUzMDAyCi1GT1JNX0xBQkVMX1BVQkxJU0hfQlVTSU5FU1NfQURWQU5DRURfREVTQz1cdTYzZDBcdTRmOWJcdTg5ODFcdTUzZDFcdTVlMDNcdTc2ODRcdTRlMWFcdTUyYTFcdTc2ODRcdTU0MGRcdTc5ZjBcdTMwMDJcdThmZDhcdTUzZWZcdTYzMDdcdTViOWFcdTUxNzZcdTViODNcdTUzYzJcdTY1NzBcdTMwMDJcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdThiYTRcdThiYzFcdTMwMDIKLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX1NJTVBMRV9ERVNDPVx1ODNiN1x1NTNkNlx1NjIxNlx1NjdlNVx1NjI3ZVx1NjdkMFx1NGUyYVx1NGUxYVx1NTJhMVx1NzEzNlx1NTQwZVx1NjNkMFx1NGY5Ylx1ODk4MVx1NTNkMVx1NWUwM1x1NzY4NFx1NjcwZFx1NTJhMVx1NzY4NCBXU0RMIFVSTFx1MzAwMVx1NTQwZFx1NzlmMFx1NTQ4Y1x1NjNjZlx1OGZmMFx1ZmYwOFx1NTNlZlx1OTAwOVx1ZmYwOVx1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OGJhNFx1OGJjMVx1MzAwMgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfQURWQU5DRURfREVTQz1cdTgzYjdcdTUzZDZcdTYyMTZcdTY3ZTVcdTYyN2VcdTY3ZDBcdTRlMmFcdTRlMWFcdTUyYTFcdTcxMzZcdTU0MGVcdTYzZDBcdTRmOWJcdTg5ODFcdTUzZDFcdTVlMDNcdTc2ODRcdTY3MGRcdTUyYTFcdTc2ODQgV1NETCBVUkwgXHU1NDhjXHU1NDBkXHU3OWYwXHUzMDAyXHU4ZmQ4XHU1M2VmXHU2MzA3XHU1YjlhXHU1MTc2XHU1YjgzXHU1M2MyXHU2NTcwXHUzMDAyXHU1M2VmXHU4MGZkXHU5NzAwXHU4OTgxXHU4YmE0XHU4YmMxXHUzMDAyCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQz1cdTYzZDBcdTRmOWJcdTg5ODFcdTUzZDFcdTVlMDNcdTc2ODRcdTY3MGRcdTUyYTFcdTc2ODQgV1NETCBVUkxcdTMwMDFcdTU0MGRcdTc5ZjBcdTU0OGNcdTYzY2ZcdThmZjBcdWZmMDhcdTUzZWZcdTkwMDlcdWZmMDlcdTMwMDJcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdThiYTRcdThiYzFcdTMwMDIKLUZPUk1fTEFCRUxfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0M9XHU2M2QwXHU0ZjliXHU4OTgxXHU1M2QxXHU1ZTAzXHU3Njg0XHU2NzBkXHU1MmExXHU3Njg0IFdTREwgVVJMIFx1NTQ4Y1x1NTQwZFx1NzlmMFx1MzAwMlx1OGZkOFx1NTNlZlx1NjMwN1x1NWI5YVx1NTE3Nlx1NWI4M1x1NTNjMlx1NjU3MFx1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OGJhNFx1OGJjMVx1MzAwMgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFX1NJTVBMRV9ERVNDPVx1OGY5M1x1NTE2NVx1ODk4MVx1NTNkMVx1NWUwM1x1NzY4NFx1NjcwZFx1NTJhMVx1NjNhNVx1NTNlM1x1NzY4NCBXU0RMIFVSTFx1MzAwMVx1NTQwZFx1NzlmMFx1NTQ4Y1x1NjNjZlx1OGZmMFx1ZmYwOFx1NTNlZlx1OTAwOVx1ZmYwOVx1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OGJhNFx1OGJjMVx1MzAwMgotRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfSU5URVJGQUNFX0FEVkFOQ0VEX0RFU0M9XHU2M2QwXHU0ZjliXHU4OTgxXHU1M2QxXHU1ZTAzXHU3Njg0XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzXHU3Njg0IFdTREwgVVJMIFx1NTQ4Y1x1NTQwZFx1NzlmMFx1MzAwMlx1OGZkOFx1NTNlZlx1NjMwN1x1NWI5YVx1NTE3Nlx1NWI4M1x1NTNjMlx1NjU3MFx1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OGJhNFx1OGJjMVx1MzAwMgotRk9STV9MQUJFTF9QVUJMSVNIX0ZPUk09XHU1M2QxXHU1ZTAzXHU2ODNjXHU1ZjBmCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPVx1NjNjZlx1OGZmMAotRk9STV9MQUJFTF9ERVNDUklQVElPTlM9XHU2M2NmXHU4ZmYwCi1NU0dfSU5GT19CVVNJTkVTU19QVUJMSVNIRUQ9SVdBQjAxNThJIFx1NWRmMlx1NjIxMFx1NTI5Zlx1NTNkMVx1NWUwM1x1NGUxYVx1NTJhMSAlMVx1MzAwMgotTVNHX0lORk9fU0VSVklDRV9QVUJMSVNIRUQ9SVdBQjAxNTlJIFx1NWRmMlx1NjIxMFx1NTI5Zlx1NTNkMVx1NWUwM1x1NjcwZFx1NTJhMSAlMVx1MzAwMgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfUFVCTElTSEVEPUlXQUIwMTYwSSBcdTVkZjJcdTYyMTBcdTUyOWZcdTUzZDFcdTVlMDNcdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTMgJTFcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX05BTUU9SVdBQjAxNjFFIFx1OGY5M1x1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NTQwZFx1NzlmMFx1MzAwMgotTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRT1JV0FCMDI1MEUgXHU0ZTNhXHU3YjJjICUyIFx1ODg0Y1x1NGUyZFx1NzY4NCAlMSBcdTkwMDlcdTYyZTlcdTk3NWVcdTdhN2FcdTc2N2RcdThiZWRcdThhMDBcdTMwMDJcdTUzZWFcdTY3MDlcdTdiMmNcdTRlMDBcdTg4NGNcdTUzZWZcdTRlZTVcdTUxNzdcdTY3MDlcdTdhN2FcdTc2N2RcdThiZWRcdThhMDBcdTMwMDIKLU1TR19FUlJPUl9ST1dfRFVQTElDQVRFX0xBTkdVQUdFPUlXQUIwMjUxRSBcdTY2ZjRcdTY1MzlcdTdiMmMgJTIgXHU4ODRjXHU0ZTJkXHU3Njg0ICUxIFx1NzY4NFx1OGJlZFx1OGEwMFx1MzAwMlx1NWY1M1x1NTI0ZFx1OGJlZFx1OGEwMFx1NWRmMlx1NTcyOFx1NGY3Zlx1NzUyOFx1NGUyZFx1MzAwMgotTVNHX0VSUk9SX1JPV19JTlZBTElEX1RFWFQ9SVdBQjAyNTJFIFx1NTcyOFx1N2IyYyAlMiBcdTg4NGNcdThmOTNcdTUxNjVcdTY3MDlcdTY1NDhcdTc2ODQgJTEKLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMPUlXQUIwMjUzRSBcdThmOTNcdTUxNjVcdTY3MDlcdTY1NDhcdTc2ODQgV1NETCBVUkxcdTMwMDIKLU1TR19FUlJPUl9OT19OQU1FUz1JV0FCMDI1NEUgXHU2ZGZiXHU1MmEwXHU4MWYzXHU1YzExXHU0ZTAwXHU0ZTJhXHU1NDBkXHU3OWYwXHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9TRVJWSUNFPUlXQUIwMjU1RSBcdTYzZDBcdTRmOWJcdTY3MDlcdTY1NDhcdTc2ODRcdTY3MGRcdTUyYTFcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX0JVU0lORVNTPUlXQUIwMjU2RSBcdTYzZDBcdTRmOWJcdTY3MDlcdTY1NDhcdTc2ODRcdTRlMWFcdTUyYTFcdTMwMDIKLQotIyBCdXNpbmVzcyBQdWJsaXNoIFNlcnZpY2UgYWN0aW9uCi1BTFRfUFVCTElTSF9TRVJWSUNFPVx1NTNkMVx1NWUwM1x1NjcwZFx1NTJhMQotCi0jIFdTREwgQnJvd3NlcgotVElUTEVfV1NETF9CUk9XU0VSPVdTREwgXHU2ZDRmXHU4OWM4XHU1NjY4IFx1ZmYwZCAlMQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRT1cdTkwMDlcdTYyZTkgV1NETCBcdTZlOTBcdWZmMWEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9V2ViIFx1OTg3OVx1NzZlZQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9XHU2NTM2XHU4NWNmXHU1OTM5Ci1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVdlYiBcdTk4NzlcdTc2ZWUKLUZPUk1fTEFCRUxfV1NETF9VUkw9V1NETCBVUkwKLUFMVF9XU0RMX0JST1dTRVI9V1NETCBcdTZkNGZcdTg5YzhcdTU2NjgKLQotIyBEZXRhaWxzCi1GT1JNX0xJTktfRURJVD1cdTdmMTZcdThmOTEKLUZPUk1fTElOS19DQU5DRUw9XHU1M2Q2XHU2ZDg4Ci1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1cdTRlMWFcdTUyYTFcdTViYzZcdTk0YTUKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9XHU2NzBkXHU1MmExXHU1YmM2XHU5NGE1Ci1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX0tFWT1UTW9kZWwgXHU1YmM2XHU5NGE1Ci1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPVx1NzUyOFx1NjIzN1x1NWI5YVx1NGU0OVx1NzY4NFx1N2M3Ylx1NTIyYgotRk9STV9MQUJFTF9DSEVDS0VEPVx1NWRmMlx1OTAwOVx1NjJlOQotRk9STV9MQUJFTF9GSUxFPVx1NjU4N1x1NGVmNgotTVNHX1FVRVNUSU9OX1BVQkxJU0hfSVRFTT1cdTU3MjhcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzBcdThiZTVcdTk4NzlcdTMwMDJcdTYwZjNcdTg5ODFcdTUzZDFcdTVlMDNcdTViODNcdTU0MTdcdWZmMWYKLU1TR19RVUVTVElPTl9TRVJWSUNFX1BVQkxJU0hfQlVTSU5FU1M9XHU1NzI4XHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU4YmU1XHU2NzBkXHU1MmExXHU1M2NhXHU1MTc2XHU0ZTFhXHU1MmExXHUzMDAyXHU4OTgxXHU3ZWU3XHU3ZWVkXHU1M2QxXHU1ZTAzXHU1NDE3XHVmZjFmCi1NU0dfSU5GT19CVVNJTkVTU19VUERBVEVEPUlXQUIwMjU3SSBcdTVkZjJcdTYyMTBcdTUyOWZcdTY2ZjRcdTY1YjBcdTRlMWFcdTUyYTEgJTFcdTMwMDIKLU1TR19JTkZPX1NFUlZJQ0VfVVBEQVRFRD1JV0FCMDI1OEkgXHU1ZGYyXHU2MjEwXHU1MjlmXHU2NmY0XHU2NWIwXHU2NzBkXHU1MmExICUxXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRV9VUERBVEVEPUlXQUIwMjU5SSBcdTVkZjJcdTYyMTBcdTUyOWZcdTY2ZjRcdTY1YjBcdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTMgJTFcdTMwMDIKLU1TR19JTkZPX1JFR0lTVFJZX1VQREFURUQ9SVdBQjAzMjNJIFx1NWRmMlx1NjIxMFx1NTI5Zlx1NjZmNFx1NjViMFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjMyAlMVx1MzAwMgotCi0jIFVucHVibGlzaEFjdGlvbgotQUxUX1VOUFVCTElTSF9CVVNJTkVTUz1cdTUzZDZcdTZkODhcdTUzZDFcdTVlMDNcdTRlMWFcdTUyYTEKLUFMVF9VTlBVQkxJU0hfU0VSVklDRT1cdTUzZDZcdTZkODhcdTUzZDFcdTVlMDNcdTY3MGRcdTUyYTEKLUFMVF9VTlBVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0U9XHU1M2Q2XHU2ZDg4XHU1M2QxXHU1ZTAzXHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzCi1GT1JNX0xBQkVMX1VOUFVCTElTSF9ERVNDPVx1NjMwOTxzdHJvbmc+XHU2MjY3XHU4ODRjPC9zdHJvbmc+XHU0ZWU1XHU1M2Q2XHU2ZDg4XHU1M2QxXHU1ZTAzXHU2YjY0XHU1YmY5XHU4YzYxXHUzMDAyXHU1M2VmXHU4MGZkXHU5NzAwXHU4OTgxXHU4YmE0XHU4YmMxXHUzMDAyCi1NU0dfSU5GT19CVVNJTkVTU19VTlBVQkxJU0hFRD1JV0FCMDI2MEkgXHU1ZGYyXHU2MjEwXHU1MjlmXHU1M2Q2XHU2ZDg4XHU1M2QxXHU1ZTAzXHU0ZTFhXHU1MmExICUxXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX1VOUFVCTElTSEVEPUlXQUIwMjYxSSBcdTVkZjJcdTYyMTBcdTUyOWZcdTUzZDZcdTZkODhcdTUzZDFcdTVlMDNcdTY3MGRcdTUyYTEgJTFcdTMwMDIKLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VOUFVCTElTSEVEPUlXQUIwMjYySSBcdTVkZjJcdTYyMTBcdTUyOWZcdTUzZDZcdTZkODhcdTUzZDFcdTVlMDNcdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTMgJTFcdTMwMDIKLQotIyBBZGQgdG8gV1NETCBQZXJzcGVjdGl2ZQotQUxUX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFPVx1NmRmYlx1NTJhMFx1NTIzMCBXU0RMIFx1OTg3NVx1OTc2MgotTVNHX0lORk9fV1NETF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzc2SSBcdTVkZjJcdTVjMDYgJTEgXHU2MjEwXHU1MjlmXHU2ZGZiXHU1MmEwXHU1MjMwIFdTREwgXHU5ODc1XHU5NzYyXHUzMDAyCi1NU0dfRVJST1JfV1NETF9OT1RfQURERURfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM3N0UgXHU2NzJhXHU4MGZkXHU1YzA2ICUxIFx1NmRmYlx1NTJhMFx1NTIzMCBXU0RMIFx1OTg3NVx1OTc2Mlx1MzAwMgotCi0jIEFkZCB0byBGYXZvcml0ZXMKLUFMVF9BRERfVE9fRkFWT1JJVEVTPVx1NmRmYlx1NTJhMFx1NTIzMFx1NjUzNlx1ODVjZlx1NTkzOQotTVNHX0lORk9fRkFWT1JJVEVfQURERUQ9SVdBQjAyNjNJIFx1NWRmMlx1NWMwNiAlMSBcdTYyMTBcdTUyOWZcdTZkZmJcdTUyYTBcdTUyMzBcdTY1MzZcdTg1Y2ZcdTU5MzlcdTMwMDIKLU1TR19FUlJPUl9GQVZPUklURV9OT1RfQURERUQ9SVdBQjAyNjRFIFx1NjcyYVx1ODBmZFx1NWMwNiAlMSBcdTZkZmJcdTUyYTBcdTUyMzBcdTY1MzZcdTg1Y2ZcdTU5MzlcdTMwMDIKLU1TR19FUlJPUl9GQVZPUklURV9BTFJFQURZX0VYSVNUUz1JV0FCMDMyNEUgXHU2NTM2XHU4NWNmXHU1OTM5XHU0ZTJkXHU1ZGYyXHU1YjU4XHU1NzI4ICUxXHUzMDAyCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1cdTY1MzZcdTg1Y2ZcdTk4NzlcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdTYwZjNcdTg5ODFcdTg5ODZcdTc2ZDZcdTU0MTdcdWZmMWYKLQotIyBSZWZyZXNoCi1NU0dfSU5GT19OT0RFX1JFRlJFU0hFRD1JV0FCMDI2NUkgXHU1ZGYyXHU1MjM3XHU2NWIwICUxXHUzMDAyCi1NU0dfUVVFU1RJT05fUkVNT1ZFX05PREU9XHU1NzI4XHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwICUxXHUzMDAyXHU2MGYzXHU4OTgxXHU2ZTA1XHU5NjY0XHU1YjgzXHU1NDE3XHVmZjFmCi0KLSMgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzCi1BTFRfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVM9XHU3YmExXHU3NDA2XHU1ZjE1XHU3NTI4XHU3Njg0XHU2NzBkXHU1MmExCi1GT1JNX0xBQkVMX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX0RFU0M9XHU5MDFhXHU4ZmM3XHU1MzU1XHU1MWZiPHN0cm9uZz5cdTZkZmJcdTUyYTBcdTY3MGRcdTUyYTE8L3N0cm9uZz5cdTYzMDlcdTk0YWVcdTVjMDZcdTUzZDFcdTczYjBcdTYyMTZcdTUzZDFcdTVlMDNcdTc2ODRcdTY3MGRcdTUyYTFcdTZkZmJcdTUyYTBcdTUyMzBcdTVmMTVcdTc1MjhcdTc2ODRcdTY3MGRcdTUyYTFcdTc2ODRcdTUyMTdcdTg4NjhcdTMwMDJcdTkwMWFcdThmYzdcdTUzNTVcdTUxZmI8c3Ryb25nPlx1OTY2NFx1NTNiYlx1NWYxNVx1NzUyODwvc3Ryb25nPlx1NjMwOVx1OTRhZVx1OTY2NFx1NTNiYlx1OTAwOVx1NjJlOVx1NzY4NFx1NWYxNVx1NzUyOFx1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OGJhNFx1OGJjMVx1NjI0ZFx1ODBmZFx1OGZkYlx1ODg0Y1x1NjZmNFx1NjUzOVx1MzAwMgotRk9STV9MQUJFTF9SRUZFUkVOQ0VEX1NFUlZJQ0VTPVx1NWYxNVx1NzUyOFx1NzY4NFx1NjcwZFx1NTJhMQotRk9STV9CVVRUT05fQUREX1NFUlZJQ0VTPVx1NmRmYlx1NTJhMFx1NjcwZFx1NTJhMQotRk9STV9CVVRUT05fUkVNT1ZFX1JFRkVSRU5DRVM9XHU5NjY0XHU1M2JiXHU1ZjE1XHU3NTI4Ci1NU0dfRVJST1JfTk9fUkVGRVJFTkNFX1NFTEVDVEVEPUlXQUIwMjY2RSBcdTdlZTdcdTdlZWRcdTRlNGJcdTUyNGRcdTgxZjNcdTVjMTFcdTkwMDlcdTYyZTlcdTRlMDBcdTRlMmFcdTVmMTVcdTc1MjhcdTY3MGRcdTUyYTFcdTMwMDIKLU1TR19FUlJPUl9OT19TRVJWSUNFUz1JV0FCMDI2N0UgXHU3ZWU3XHU3ZWVkXHU0ZTRiXHU1MjRkXHU4M2I3XHU1M2Q2XHU2MjE2XHU2N2U1XHU2MjdlXHU4MWYzXHU1YzExXHU0ZTAwXHU0ZTJhXHU2NzBkXHU1MmExXHUzMDAyCi1NU0dfRVJST1JfU0VSVklDRV9OT1RfUkVGRVJFTkNFRD1JV0FCMDI2OEUgXHU2NzJhXHU4MGZkXHU1ZjE1XHU3NTI4XHU2NzBkXHU1MmExICUxXHUzMDAyCi1NU0dfRVJST1JfUkVGRVJFTkNFX05PVF9SRU1PVkVEPUlXQUIwMjY5RSBcdTY3MmFcdTgwZmRcdTk2NjRcdTUzYmJcdTY3MGRcdTUyYTFcdTVmMTVcdTc1MjggJTFcdTMwMDIKLU1TR19JTkZPX1NFUlZJQ0VfUkVGRVJFTkNFRD1JV0FCMDI3MEkgXHU1ZGYyXHU2MjEwXHU1MjlmXHU1ZjE1XHU3NTI4XHU2NzBkXHU1MmExICUxXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX1JFRkVSRU5DRV9SRU1PVkVEPUlXQUIwMjcxSSBcdTVkZjJcdTYyMTBcdTUyOWZcdTk2NjRcdTUzYmJcdTY3MGRcdTUyYTFcdTVmMTVcdTc1MjggJTFcdTMwMDIKLQotIyBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zCi1BTFRfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPVx1N2JhMVx1NzQwNlx1NTNkMVx1NWUwM1x1NTY2OFx1NjVhZFx1OGEwMAotRk9STV9MQUJFTF9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlNfREVTQz1cdTkwMWFcdThmYzdcdTUzNTVcdTUxZmI8c3Ryb25nPlx1NmRmYlx1NTJhMFx1NjVhZFx1OGEwMDwvc3Ryb25nPlx1NWMwNlx1NTNkMVx1NzNiMFx1NjIxNlx1NTNkMVx1NWUwM1x1NzY4NFx1NGUxYVx1NTJhMVx1NmRmYlx1NTJhMFx1NTIzMFx1NTNkMVx1NWUwM1x1NTY2OFx1NjVhZFx1OGEwMFx1NTIxN1x1ODg2OFx1NGUyZFx1MzAwMlx1OTAxYVx1OGZjN1x1NTM1NVx1NTFmYjxzdHJvbmc+XHU5NjY0XHU1M2JiXHU2NWFkXHU4YTAwPC9zdHJvbmc+XHU5NjY0XHU1M2JiXHU5MDA5XHU2MmU5XHU3Njg0XHU2NWFkXHU4YTAwXHUzMDAyXHU5MDFhXHU4ZmM3XHU1MzU1XHU1MWZiPHN0cm9uZz5cdTViOGNcdTYyMTBcdTY1YWRcdThhMDA8L3N0cm9uZz5cdTViOGNcdTYyMTBcdTkwMDlcdTYyZTlcdTc2ODRcdTY1YWRcdThhMDBcdTMwMDJcdTUzNTVcdTUxZmI8c3Ryb25nPlx1NTIzN1x1NjViMFx1NjVhZFx1OGEwMDwvc3Ryb25nPlx1NGVlNVx1NTIzN1x1NjViMFx1NjVhZFx1OGEwMFx1NTIxN1x1ODg2OFx1MzAwMgotRk9STV9MQUJFTF9JTkNPTVBMRVRFX0FTU0VSVElPTlNfVklTSUJJTElUWV9ERVNDPVx1OGJmN1x1NmNlOFx1NjEwZlx1ZmYwY1x1NTNlYVx1NjcwOVx1NGUxYVx1NTJhMVx1NzY4NFx1NjI0MFx1NjcwOVx1ODAwNVx1NjI0ZFx1ODBmZFx1NzcwYlx1NTIzMFx1NGUwZFx1NWI4Y1x1NjU3NFx1NzY4NFx1NTNkMVx1NWUwM1x1NTY2OFx1NjVhZFx1OGEwMFx1MzAwMgotRk9STV9MQUJFTF9CVVNJTkVTU0VTPVx1NGUxYVx1NTJhMQotRk9STV9CVVRUT05fU0hPV19BTExfUFVCTElTSEVSX0FTU0VSVElPTlM9XHU1MjM3XHU2NWIwXHU2NWFkXHU4YTAwCi1GT1JNX0JVVFRPTl9DT01QTEVURV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1cdTViOGNcdTYyMTBcdTY1YWRcdThhMDAKLUZPUk1fQlVUVE9OX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OUz1cdTZkZmJcdTUyYTBcdTY1YWRcdThhMDAKLUZPUk1fQlVUVE9OX1JFTU9WRV9QVUJMSVNIRVJfQVNTRVJUSU9OUz1cdTk2NjRcdTUzYmJcdTY1YWRcdThhMDAKLU1TR19JTkZPX1BVQkxJU0hFUl9BU1NFUlRJT05TX1JFRlJFU0hFRD1JV0FCMDMyNUkgXHU1ZGYyXHU1MjM3XHU2NWIwXHU1M2QxXHU1ZTAzXHU1NjY4XHU2NWFkXHU4YTAwXHUzMDAyCi1NU0dfRVJST1JfTk9fSU5DT01QTEVURV9BU1NFUlRJT05fU0VMRUNURUQ9SVdBQjAzMjZFIFx1ODFmM1x1NWMxMVx1OTAwOVx1NjJlOVx1NGUwMFx1NGUyYVx1NGUwZFx1NWI4Y1x1NjU3NFx1NzY4NFx1NTNkMVx1NWUwM1x1NTY2OFx1NjVhZFx1OGEwMFx1MzAwMgotTVNHX0VSUk9SX05PVF9PV05FRF9CVVNJTkVTUz1JV0FCMDMyN0UgXHU0ZTBkXHU4MGZkXHU1YmY5XHU1M2U2XHU0ZTAwXHU2NWI5XHU2MjQwXHU2MmU1XHU2NzA5XHU3Njg0XHU0ZTFhXHU1MmExXHU2MjY3XHU4ODRjXHU2YjY0XHU2NGNkXHU0ZjVjXHUzMDAyCi0KLSMgR2V0QnVzaW5lc3NlcwotQUxUX0dFVF9CVVNJTkVTUz1cdTgzYjdcdTUzZDZcdTRlMWFcdTUyYTEKLUFMVF9HRVRfQlVTSU5FU1NFUz1cdTgzYjdcdTUzZDZcdTU5MWFcdTRlMmFcdTRlMWFcdTUyYTEKLU5PREVfTkFNRV9TRVJWSUNFX0JVU0lORVNTPVx1NjcwZFx1NTJhMSAlMSBcdTc2ODRcdTRlMWFcdTUyYTEKLU5PREVfTkFNRV9TSV9CVVNJTkVTU0VTPVx1NjcwZFx1NTJhMVx1NjNhNVx1NTNlMyAlMSBcdTc2ODRcdTRlMWFcdTUyYTEKLU1TR19RVUVTVElPTl9SRU1PVkVfU0VSVklDRV9OT0RFPVx1NTcyOFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1OGJlNVx1NjcwZFx1NTJhMVx1MzAwMlx1NjBmM1x1ODk4MVx1OTY2NFx1NTNiYlx1NmI2NFx1ODI4Mlx1NzBiOVx1NTQxN1x1ZmYxZgotCi0jIEdldFNlcnZpY2VJbnRlcmZhY2VzCi1BTFRfR0VUX1NFUlZJQ0VfSU5URVJGQUNFUz1cdTgzYjdcdTUzZDZcdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTMKLU5PREVfTkFNRV9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUz1cdTY3MGRcdTUyYTEgJTEgXHU3Njg0XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzCi1NU0dfUVVFU1RJT05fR0VUX1NJX1JFTU9WRV9TRVJWSUNFX05PREU9XHU1NzI4XHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU4YmU1XHU2NzBkXHU1MmExXHUzMDAyXHU2MGYzXHU4OTgxXHU5NjY0XHU1M2JiXHU2YjY0XHU4MjgyXHU3MGI5XHU1NDE3XHVmZjFmCi0KLSMgR2V0U2VydmljZXMKLUFMVF9HRVRfU0VSVklDRVM9XHU4M2I3XHU1M2Q2XHU2NzBkXHU1MmExCi1OT0RFX05BTUVfU0lfU0VSVklDRVM9XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzICUxIFx1NzY4NFx1NjcwZFx1NTJhMQotTk9ERV9OQU1FX0JVU0lORVNTX1NFUlZJQ0VTPVx1NGUxYVx1NTJhMSAlMSBcdTc2ODRcdTY3MGRcdTUyYTEKLU1TR19RVUVTVElPTl9SRU1PVkVfU0lfTk9ERT1cdTU3MjhcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzBcdThiZTVcdTY3MGRcdTUyYTFcdTYzYTVcdTUzZTNcdTMwMDJcdTYwZjNcdTg5ODFcdTk2NjRcdTUzYmJcdTZiNjRcdTgyODJcdTcwYjlcdTU0MTdcdWZmMWYKLU1TR19RVUVTVElPTl9SRU1PVkVfQlVTSU5FU1NfTk9ERT1cdTU3MjhcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzBcdThiZTVcdTRlMWFcdTUyYTFcdTMwMDJcdTYwZjNcdTg5ODFcdTk2NjRcdTUzYmJcdTZiNjRcdTgyODJcdTcwYjlcdTU0MTdcdWZmMWYKLQotIyBSZWZyZXNoVURESU5vZGVzQWN0aW9uCi1NU0dfRVJST1JfTk9ERV9EQVRBX1ZBTElEQVRJT05fRkFJTEVEPUlXQUIwMjcyRSBcdTU3MjhcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzAgJTFcdTMwMDIKLQotIyBTdW1tYXJpZXMKLUFMVF9TVU1NQVJZX1FVRVJJRVM9XHU2N2U1XHU4YmUyXHU2NDU4XHU4OTgxCi1BTFRfU1VNTUFSWV9CVVNJTkVTU0VTPVx1NGUxYVx1NTJhMVx1NjQ1OFx1ODk4MQotQUxUX1NVTU1BUllfU0VSVklDRVM9XHU2NzBkXHU1MmExXHU2NDU4XHU4OTgxCi1BTFRfU1VNTUFSWV9TRVJWSUNFX0lOVEVSRkFDRVM9XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzXHU2NDU4XHU4OTgxCi1GT1JNX0xBQkVMX1FVRVJJRVM9XHU2N2U1XHU4YmUyCi0KLSMgU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uCi1NU0dfUVVFU1RJT05fSVRFTV9WQUxJREFUSU9OX0ZBSUxFRD1cdTU3MjhcdTZjZThcdTUxOGNcdTRlMmRcdTVmYzNcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzAgJTFcdTMwMDJcdTYwZjNcdTg5ODFcdTk2NjRcdTUzYmJcdTViODNcdTU0MTdcdWZmMWYKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9XHU1YmZjXHU4MjJhXHU1NjY4XHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1cdTViZmNcdTgyMmFcdTU2NjhcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPVx1NWJmY1x1ODIyYVx1NTY2OFx1NTE4NVx1NWJiOQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9XHU2NGNkXHU0ZjVjXHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1cdTVjNWVcdTYwMjdcdTViYjlcdTU2NjgKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1cdTVjNWVcdTYwMjdcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1cdTVjNWVcdTYwMjdcdTUxODVcdTViYjkKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9XHU3MmI2XHU2MDAxXHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1cdTcyYjZcdTYwMDFcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVx1NzJiNlx1NjAwMVx1NTE4NVx1NWJiOQotRlJBTUVfVElUTEVfVURESV9QRVJTUEVDVElWRV9DT05URU5UPVVEREkgXHU5ODc1XHU5NzYyXHU1MTg1XHU1YmI5Ci1GUkFNRV9USVRMRV9DQVRFR09SSUVTX1dPUktBUkVBPVx1N2M3Ylx1NTIyYlx1NWRlNVx1NGY1Y1x1NTMzYQotRlJBTUVfVElUTEVfQ0FURUdPUklFU19UT09MQkFSPVx1N2M3Ylx1NTIyYlx1NWRlNVx1NTE3N1x1NjgwZgotRlJBTUVfVElUTEVfQ0FURUdPUklFU19DT05URU5UPVx1N2M3Ylx1NTIyYlx1NTE4NVx1NWJiOQotRlJBTUVfVElUTEVfV1NETF9UT09MQkFSPVdTREwgXHU2ZDRmXHU4OWM4XHU1NjY4XHU1ZGU1XHU1MTc3XHU2ODBmCi1GUkFNRV9USVRMRV9XU0RMX0NPTlRFTlQ9V1NETCBcdTZkNGZcdTg5YzhcdTU2NjhcdTUxODVcdTViYjkKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9CVVNJTkVTU19ERVRBSUxTPVx1NGUxYVx1NTJhMVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0U9XHU0ZTFhXHU1MmExXHU1M2QxXHU1ZTAzXHU2NzBkXHU1MmExXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX0dFVF9GT1JNPVx1NGVjZVx1NTNkMVx1NzNiMFx1NjIxNlx1NTNkMVx1NWUwM1x1NzY4NFx1NWJmOVx1OGM2MVx1NGUyZFx1OGZkYlx1ODg0Y1x1OTAwOVx1NjJlOVx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9JVEVNU19TVU1NQVJZPVx1OTg3OVx1NjQ1OFx1ODk4MVx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlM9XHU3YmExXHU3NDA2XHU1M2QxXHU1ZTAzXHU1NjY4XHU2NWFkXHU4YTAwXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTPVx1N2JhMVx1NzQwNlx1NWYxNVx1NzUyOFx1NzY4NFx1NjcwZFx1NTJhMVx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9PUEVOX1JFR0lTVFJZPVx1NjI1M1x1NWYwMFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1ODg2OFx1NTM1NQotRk9STV9USVRMRV9SRUdJU1RSWV9ERVRBSUxTPVx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9SRUdJU1RSWV9QVUJMSVNIPVx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NTNkMVx1NWUwM1x1ODg2OFx1NTM1NQotRk9STV9USVRMRV9SRUdJU1RSWV9GSU5EPVx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NjdlNVx1NjI3ZVx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9SRVNVTFRTPVx1N2VkM1x1Njc5Y1x1ODg2OFx1NTM1NQotRk9STV9USVRMRV9TRVJWSUNFX0RFVEFJTFM9XHU2NzBkXHU1MmExXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFM9XHU2NzBkXHU1MmExXHU2M2E1XHU1M2UzXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX1VOUFVCTElTSD1cdTUzZDZcdTZkODhcdTUzZDFcdTVlMDNcdTg4NjhcdTUzNTUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGlfemhfVFcucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3VkZGlfemhfVFcucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmMWJjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy91ZGRpX3poX1RXLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9VURESQotCi0jIE5vZGVzCi1OT0RFX05BTUVfVURESV9NQUlOPVVEREkgXHU0ZTNiXHU4OTgxCi1OT0RFX05BTUVfUVVFUklFU19GT0xERVI9XHU1ZGYyXHU1N2Y3XHU4ODRjXHU3Njg0XHU2N2U1XHU4YTYyCi1OT0RFX05BTUVfUFVCTElTSEVEX0JVU0lORVNTRVNfRk9MREVSPVx1NWRmMlx1NzY3Y1x1NGY0OFx1NzY4NFx1NTU0Nlx1Njk2ZAotTk9ERV9OQU1FX1BVQkxJU0hFRF9TRVJWSUNFU19GT0xERVI9XHU1ZGYyXHU3NjdjXHU0ZjQ4XHU3Njg0XHU2NzBkXHU1MmQ5Ci1OT0RFX05BTUVfUFVCTElTSEVEX1NFUlZJQ0VfSU5URVJGQUNFU19GT0xERVI9XHU1ZGYyXHU3NjdjXHU0ZjQ4XHU3Njg0XHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyCi0KLSMgT3BlblJlZ2lzdHJ5QWN0aW9uCi1BTFRfT1BFTl9SRUdJU1RSWT1cdTk1OGJcdTU1NWZcdTc2N2JcdTkzMDQKLUZPUk1fTEFCRUxfT1BFTl9SRUdJU1RSWV9ERVNDPVx1OGFjYlx1NjMwN1x1NWI5YVx1ODk4MVx1OTU4Ylx1NTU1Zlx1NzY4NFx1NzY3Ylx1OTMwNFx1NzY4NFx1NTQwZFx1N2EzMVx1NTQ4Y1x1NjdlNVx1OGE2MiBVUkxcdTMwMDJcdTkwNzhcdTUzZDZcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWJcdTc2N2JcdTkzMDRcdTVjMDdcdTY3MDNcdTgxZWFcdTUyZDVcdTU4NmJcdTUxNjVcdTVmYzVcdTg5ODFcdTc2ODRcdThjYzdcdThhMGFcdTMwMDJcdThhY2JcdTYzMDk8c3Ryb25nPlx1NTdmN1x1ODg0Yzwvc3Ryb25nPlx1NGY4Nlx1OTU4Ylx1NTU1Zlx1NzY3Ylx1OTMwNFx1MzAwMgotRk9STV9MQUJFTF9GQVZPUklURV9SRUdJU1RSWT1cdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWJcdTc2N2JcdTkzMDQKLUZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRT1cdTc2N2JcdTkzMDRcdTU0MGRcdTdhMzEKLUZPUk1fTEFCRUxfSU5RVUlSWV9VUkw9XHU2N2U1XHU4YTYyIFVSTAotRk9STV9MQUJFTF9DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUz1cdThhY2JcdTZhYTJcdTY3ZTVcdTRmN2ZcdTc1MjhcdTgwMDVcdTViOWFcdTdmYTlcdTc2ODRcdTdhMmVcdTk4NWUKLURFRkFVTFRfUkVHSVNUUllfTkFNRT1JQk0gVURESSBcdTZlMmNcdThhNjZcdTc2N2JcdTkzMDQKLU1TR19FUlJPUl9JTlZBTElEX1JFR0lTVFJZX05BTUU9SVdBQjAxMzZFIFx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NzY3Ylx1OTMwNFx1NTQwZFx1N2EzMVx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfSU5RVUlSWV9VUkw9SVdBQjAxMzhFIFx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NjdlNVx1OGE2MiBVUkxcdTMwMDIKLU1TR19JTkZPX1JFR0lTVFJZX09QRU5FRD1JV0FCMDEzOUkgXHU1ZGYyXHU5ODA2XHU1MjI5XHU5NThiXHU1NTVmXHU1NzI4ICUyIFx1NGUxNFx1NTQwZFx1N2EzMVx1NjYyZiAlMSBcdTc2ODRcdTc2N2JcdTkzMDRcdTMwMDIKLUZPUk1fTEFCRUxfSVNfV0VCU1BIRVJFX1VERElfUkVHSVNUUlk9XHU2NjJmIFdlYlNwaGVyZSBVRERJIFx1NzY3Ylx1OTMwNFx1NTVjZVx1ZmYxZgotREVGQVVMVF9SRUdJU1RSWV9OQU1FX1dFQlNQSEVSRT1JQk0gV2ViU3BoZXJlIFx1NzljMVx1NWJjNiBVRERJIFx1NzY3Ylx1OTMwNAotRk9STV9MQUJFTF9SRUdJU1RSWV9IT1NUPVx1NGUzYlx1NmE1ZgotRk9STV9MQUJFTF9SRUdJU1RSWV9QT1JUPVx1NTdlMAotCi0jIFVzZXItZGVmaW5lZCBDYXRlZ29yaWVzCi1GT1JNX0xBQkVMX0FERF9DQVRFR09SWV9EQVRBPTxhIGhyZWY9IiUxIj5cdThhY2JcdTYzMDlcdTRlMDBcdTRlMGJcdTkwMTlcdTg4ZTE8L2E+XHVmZjBjXHU0ZWU1XHU4ZjA5XHU1MTY1XHU5MDE5XHU1MDBiXHU3YTJlXHU5ODVlXHU3Njg0XHU4Y2M3XHU2NTk5XHUzMDAyCi1GT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfRklMRT1cdTdhMmVcdTk4NWVcdThjYzdcdTY1OTlcdTZhOTRcdTU0MGRcdTdhMzEKLU1TR19JTkZPX05PX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTX0ZPVU5EPUlXQUIwMzcxSSBcdTY3MmFcdTUwNzVcdTZlMmNcdTUyMzBcdTRlZmJcdTRmNTVcdTRmN2ZcdTc1MjhcdTgwMDVcdTViOWFcdTdmYTlcdTc2ODRcdTdhMmVcdTk4NWVcdTMwMDIKLU1TR19JTkZPX05PX0NBVEVHT1JZX0RBVEE9SVdBQjAzNzJJICUxIFx1NzY4NFx1N2EyZVx1OTg1ZVx1OGNjN1x1NjU5OVx1NzEyMVx1NmNkNVx1NGY3Zlx1NzUyOFx1NjIxNlx1NzEyMVx1NjU0OFx1MzAwMgotTVNHX0lORk9fVVNFUl9ERUZJTkVEX0NBVEVHT1JZX0RBVEFfTE9BREVEPUlXQUIwMzczSSBcdTVkZjJcdTk4MDZcdTUyMjlcdThmMDlcdTUxNjVcdTRmN2ZcdTc1MjhcdTgwMDVcdTViOWFcdTdmYTlcdTc2ODQgJTEgXHU3YTJlXHU5ODVlXHU3Njg0XHU4Y2M3XHU2NTk5XHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9VU0VSX0RFRklORURfQ0FURUdPUllfREFUQV9GSUxFX0tFWT1JV0FCMDM3NEUgXHU0ZjdmXHU3NTI4XHU4MDA1XHU1YjlhXHU3ZmE5XHU3Njg0ICUxIFx1N2EyZVx1OTg1ZVx1NzY4NFx1OGNjN1x1NjU5OVx1NmE5NFx1NzEyMVx1NjU0OFx1MzAwMlx1NjI3ZVx1NTIzMFx1N2EyZVx1OTg1ZVx1N2QyMlx1NWYxNVx1OTM3NSAnJTInXHVmZjBjXHU0ZjQ2XHU1MzlmXHU5ODEwXHU2NzFmXHU2NjJmICclMydcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVfRk9STUFUPUlXQUIwNDczRSBcdTRmN2ZcdTc1MjhcdTgwMDVcdTViOWFcdTdmYTlcdTc2ODQgJTIgXHU3YTJlXHU5ODVlXHU0ZTRiXHU4Y2M3XHU2NTk5XHU2YTk0XHU3Njg0XHU3YjJjICUxIFx1ODg0Y1x1NjgzY1x1NWYwZlx1NGUwZFx1NjYwZVx1MzAwMlx1OTAxOVx1NGUwMFx1ODg0Y1x1NjYyZlx1ZmYxYSIlMyIKLU1TR19FUlJPUl9JTlZBTElEX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEU9SVdBQjAzNzVFIFx1NGY3Zlx1NzUyOFx1ODAwNVx1NWI5YVx1N2ZhOVx1NzY4NCAlMSBcdTdhMmVcdTk4NWVcdTc2ODRcdThjYzdcdTY1OTlcdTZhOTRcdTcxMjFcdTY1NDhcdTMwMDIKLU1TR19FUlJPUl9TQVZJTkdfQ0FURUdPUllfREFUQT1JV0FCMDQ3NEUgXHU1MTMyXHU1YjU4ICUxIFx1N2EyZVx1OTg1ZVx1NzY4NFx1OGNjN1x1NjU5OVx1NjY0Mlx1ZmYwY1x1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMlx1NzU3MFx1NWUzOFx1NzJjMFx1NmNjMVx1NjcyY1x1NjU4N1x1ZmYxYSUyCi0KLSMgVURESSBDYXRlZ29yeSBCcm93c2VyCi1USVRMRV9DQVRFR09SWV9CUk9XU0VSPVx1N2EyZVx1OTg1ZVx1NzAwZlx1ODliZFx1NTY2OAotQUxUX0NBVEVHT1JJRVM9XHU3YTJlXHU5ODVlCi0KLSMgRGV0YWlscwotQUxUX1JFR0lTVFJZX0RFVEFJTFM9XHU3NjdiXHU5MzA0XHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5Ci1BTFRfQlVTSU5FU1NfREVUQUlMUz1cdTU1NDZcdTY5NmRcdThhNzNcdTdkMzBcdThjYzdcdTY1OTkKLUFMVF9TRVJWSUNFX0RFVEFJTFM9XHU2NzBkXHU1MmQ5XHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5Ci1BTFRfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUz1cdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjJcdThhNzNcdTdkMzBcdThjYzdcdTY1OTkKLUZPUk1fTEFCRUxfREVUQUlMU19FRElUQUJMRT1cdTRlZTVcdTRlMGJcdTk4NmZcdTc5M2EgPHN0cm9uZz4lMTwvc3Ryb25nPiBcdTc2ODRcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTMwMDJcdTUzZWZcdTRlZTVcdTY1YjBcdTU4OWVcdTMwMDFcdTc5ZmJcdTk2NjRcdTYyMTZcdThiOGFcdTY2ZjRcdTkwZThcdTUyMDZcdTk4MDVcdTc2ZWVcdTMwMDJcdThiOGFcdTY2ZjRcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdTk0NTFcdTUyMjVcdTMwMDJcdTkwMTlcdTUwMGJcdTk4MDFcdTk3NjJcdTVlOTVcdTdhZWZcdTUyMTdcdTUxZmFcdTUxNzZcdTRlZDZcdTUyZDVcdTRmNWNcdTMwMDIKLQotIyBHZXQKLUFMVF9HRVQ9XHU1M2Q2XHU1Zjk3Ci0KLSMgQ29tbW9uIEZvcm0gQ29udHJvbCBUaXRsZQotRk9STV9DT05UUk9MX1RJVExFX05BTUVfVEVYVF9WQUxVRT1cdTU0MGRcdTdhMzFcdTUwM2MKLUZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFPVx1OGFhYVx1NjYwZVx1NTAzYwotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9OQU1FPVx1N2EyZVx1OTg1ZVx1N2QyMlx1NWYxNVx1OTM3NVx1NTQwZFx1N2EzMQotRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRT1cdTdhMmVcdTk4NWVcdTdkMjJcdTVmMTVcdTkzNzVcdTUwM2MKLUZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FPUlEIFx1N2QyMlx1NWYxNVx1OTM3NVx1NTQwZFx1N2EzMQotRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX1ZBTFVFPUlEIFx1N2QyMlx1NWYxNVx1OTM3NVx1NTAzYwotRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkw9XHU2M2EyXHU3ZDIyIFVSTAotCi0jIEZpbmQgYWN0aW9ucwotQUxUX0ZJTkQ9XHU1YzBiXHU2MjdlCi1BTFRfU1VCUVVFUlk9XHU1YzBiXHU2MjdlICUxIFx1NWI1MFx1NjdlNVx1OGE2MgotRk9STV9MQUJFTF9RVUVSWV9OQU1FPVx1OTAxOVx1OTgwNVx1NjdlNVx1OGE2Mlx1NzY4NFx1NTQwZFx1N2EzMQotREVGQVVMVF9RVUVSWV9OQU1FPVx1NjdlNVx1OGE2Mlx1N2Q1MFx1Njc5YwotREVGQVVMVF9TVUJRVUVSWV9OQU1FPSUxIC0gJTIgXHU1YjUwXHU2N2U1XHU4YTYyCi1GT1JNX0xBQkVMX1NFQVJDSF9GT1I9XHU2NDFjXHU1YzBiXHU3NmVlXHU2YTE5Ci1GT1JNX09QVElPTl9CVVNJTkVTU0VTPVx1NTU0Nlx1Njk2ZAotRk9STV9PUFRJT05fU0VSVklDRVM9XHU2NzBkXHU1MmQ5Ci1GT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVM9XHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyCi1GT1JNX0xBQkVMX1NFQVJDSF9UWVBFPVx1NjQxY1x1NWMwYlx1OTg1ZVx1NTc4YgotRk9STV9SQURJT19TSU1QTEU9XHU3YzIxXHU1ZjBmCi1GT1JNX1JBRElPX0FEVkFOQ0VEPVx1OTAzMlx1OTY4ZQotRk9STV9SQURJT19VVUlEPVVVSUQKLUZPUk1fTEFCRUxfRklORF9CVVNJTkVTU0VTX1NJTVBMRV9ERVNDPVx1OGFjYlx1OGYzOFx1NTE2NVx1ODk4MVx1NjQxY1x1NWMwYlx1NzY4NFx1NTU0Nlx1Njk2ZFx1NzY4NFx1NWM0MFx1OTBlOFx1NjIxNlx1NWI4Y1x1NjU3NFx1NTQwZFx1N2EzMVx1MzAwMiclJyBcdTdiMjZcdTg2NWZcdTUzZWZcdTc1MjhcdTRmODZcdTRmNWNcdTcwYmFcdTdiMjZcdTU0MDhcdTRlZmJcdTRmNTVcdTViNTdcdTUxNDNcdTc2ODRcdTg0MmNcdTc1MjhcdTViNTdcdTUxNDNcdTMwMDJcdThhY2JcdTYzMDk8c3Ryb25nPlx1NTdmN1x1ODg0Yzwvc3Ryb25nPlx1NGY4Nlx1NTdmN1x1ODg0Y1x1NjQxY1x1NWMwYlx1MzAwMgotRk9STV9MQUJFTF9GSU5EX0FEVkFOQ0VEX0RFU0M9XHU4YWNiXHU4ZjM4XHU1MTY1XHU0ZTBiXHU5NzYyXHU1MjE3XHU1MWZhXHU3Njg0XHU0ZTAwXHU2MjE2XHU1OTFhXHU1MDBiXHU1M2MzXHU2NTc4XHU3Njg0XHU1MDNjXHUzMDAyXHU1NzI4XHUzMDBjXHU1NDBkXHU3YTMxXHUzMDBkXHU4ODY4XHU2ODNjXHU3Njg0XHUzMDBjXHU1NDBkXHU3YTMxXHUzMDBkXHU2YjA0XHU0ZjRkXHU0ZTJkXHVmZjBjJyUnIFx1N2IyNlx1ODY1Zlx1NTNlZlx1NzUyOFx1NGY4Nlx1NGY1Y1x1NzBiYVx1N2IyNlx1NTQwOFx1NGVmYlx1NGY1NVx1NWI1N1x1NTE0M1x1NzY4NFx1ODQyY1x1NzUyOFx1NWI1N1x1NTE0M1x1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OTQ1MVx1NTIyNVx1MzAwMlx1OGFjYlx1NjMwOTxzdHJvbmc+XHU1N2Y3XHU4ODRjPC9zdHJvbmc+XHU0Zjg2XHU1N2Y3XHU4ODRjXHU2NDFjXHU1YzBiXHUzMDAyCi1GT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NfVVVJRF9ERVNDPVx1OGFjYlx1OGYzOFx1NTE2NVx1ODk4MVx1NjQxY1x1NWMwYlx1NzY4NFx1NTU0Nlx1Njk2ZFx1NzY4NCBVVUlEXHUzMDAyXHU4YWNiXHU2MzA5PHN0cm9uZz5cdTU3ZjdcdTg4NGM8L3N0cm9uZz5cdTRmODZcdTU3ZjdcdTg4NGNcdTY0MWNcdTVjMGJcdTMwMDIKLUZPUk1fTEFCRUxfTkFNRVM9XHU1NDBkXHU3YTMxCi1GT1JNX0xJTktfQUREPVx1NjViMFx1NTg5ZQotRk9STV9MSU5LX0dFVD1cdTUzZDZcdTVmOTcKLUZPUk1fTElOS19GSU5EPVx1NWMwYlx1NjI3ZQotRk9STV9MSU5LX1JFTU9WRT1cdTc5ZmJcdTk2NjQKLUZPUk1fTEFCRUxfT1dORUQ9XHU2NGMxXHU2NzA5XHU3Njg0Ci1GT1JNX0xBQkVMX1BVQkxJU0hfVVJMPVx1NzY3Y1x1NGY0OCBVUkwKLUZPUk1fTEFCRUxfVVNFUklEPVx1NGY3Zlx1NzUyOFx1ODAwNSBJRAotRk9STV9MQUJFTF9QQVNTV09SRD1cdTViYzZcdTc4YmMKLUZPUk1fTEFCRUxfTEFOR1VBR0U9XHU4YTllXHU4YTAwCi1GT1JNX0xBQkVMX05BTUU9XHU1NDBkXHU3YTMxCi1GT1JNX0xBQkVMX0RFU0NSSVBUSU9OPVx1OGFhYVx1NjYwZQotRk9STV9PUFRJT05fTEFOR1VBR0VfRU49XHU4MmYxXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9BQT1cdTk2M2ZcdTZjZDVcdTcyM2VcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FCPVx1OTYzZlx1NWUwM1x1NTRjOFx1ODk3Zlx1NGU5ZVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfQUY9XHU1MzU3XHU5NzVlXHU4Mzc3XHU4NjJkXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9BTT1cdTk2M2ZcdTU5YzZcdTU0YzhcdTdhY2JcdTUxNGJcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FSPVx1OTYzZlx1NjJjOVx1NGYyZlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfQVM9XHU5NjNmXHU4NWE5XHU1OWM2XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9BWT1cdTYxMWJcdTRmOWRcdTc0NmFcdTYyYzlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0FaPVx1NGU5ZVx1NTg1ZVx1NjJkY1x1NzEzNlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfQkE9XHU1ZGY0XHU0ZWMwXHU1N2ZhXHU3MjNlXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9CRT1cdTc2N2RcdTRmYzRcdTdmODVcdTY1YWZcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JHPVx1NGZkZFx1NTJhMFx1NTIyOVx1NGU5ZVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfQkg9XHU2YmQ0XHU1NGM4XHU3MjNlXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9CST1cdTc4YTdcdTY1YWZcdTYyYzlcdTc0NmFcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0JOPVx1NWI1Zlx1NTJhMFx1NjJjOVx1NjU4NyAoQmVuZ2FsaTsgQmFuZ2xhKQotRk9STV9PUFRJT05fTEFOR1VBR0VfQk89XHU4NWNmXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9CUj1cdTVlMDNcdTUyMTdcdTU4NTRcdTVjM2NcdTRlOWVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NBPVx1NTJhMFx1NmNmMFx1ODYyZFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfQ089XHU3OWQxXHU4OTdmXHU1NjA5XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9DWj1cdTYzNzdcdTUxNGJcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0NZPVx1NWEwMVx1NzIzZVx1NjVhZlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfREE9XHU0ZTM5XHU5ZWE1XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9ERT1cdTVmYjdcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0RaPVx1NGUwZFx1NGUzOVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfRUw9XHU1ZTBjXHU4MWQ4XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9FTz1cdTRlMTZcdTc1NGNcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0VTPVx1ODk3Zlx1NzNlZFx1NzI1OVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfRVQ9XHU2MTFiXHU2Yzk5XHU1YzNjXHU0ZTllXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9FVT1cdTVkZjRcdTY1YWZcdTUxNGJcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZBPVx1NmNlMlx1NjVhZlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfRkk9XHU4MmFjXHU4NjJkXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9GSj1cdTY1OTBcdTZmZGZcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZPPVx1NjU5MFx1N2Y4NVx1N2ZhNFx1NWNmNlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfRlI9XHU2Y2Q1XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9GWT1cdTVmMTdcdTkxY2NcdTg5N2ZcdTRlOWVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dBPVx1NjExYlx1NzIzZVx1ODYyZFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfR0Q9XHU4NjA3XHU2ODNjXHU4NjJkXHU4NGNiXHU3MjNlXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9HTD1cdTUyYTBcdTkxY2NcdTg5N2ZcdTRlOWVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0dOPVx1NzRkY1x1NjJjOVx1NWMzY1x1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfR1U9XHU1M2U0XHU1NDA5XHU2MmM5XHU3Mjc5XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9IQT1cdThjNmFcdTg1YTlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hJPVx1NTMxN1x1NTM3MFx1NWVhNlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfSFI9XHU1MTRiXHU3Zjg1XHU1N2MzXHU4OTdmXHU0ZTllXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9IVT1cdTUzMDhcdTcyNTlcdTUyMjlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0hZPVx1NGU5ZVx1N2Y4ZVx1NWMzY1x1NGU5ZVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfSUE9XHU0ZWJhXHU1ZGU1XHU1NzBiXHU5NjliXHU4YTllCi1GT1JNX09QVElPTl9MQU5HVUFHRV9JRT1cdTU3MGJcdTk2OWJcdThhOWUKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lLPVx1NGYwYVx1NTJhYVx1NzZhZVx1NTE0Ylx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfSU49XHU1MzcwXHU1YzNjXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9JUz1cdTUxYjBcdTVjZjZcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0lUPVx1N2ZhOVx1NTkyN1x1NTIyOVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfSVc9XHU1ZTBjXHU0ZjJmXHU0Zjg2XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9KQT1cdTY1ZTVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0pJPVx1NjEwZlx1N2IyY1x1N2RkMlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfSlc9XHU3MjJhXHU1NGM3XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9LQT1cdTU1YWNcdTZjYmJcdTRlOWVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tLPVx1NTRjOFx1ODVhOVx1NTE0Ylx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfS0w9XHU2ODNjXHU2Nzk3XHU4NjJkXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9LTT1cdTY3ZWNcdTU3ZDRcdTU4NWVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tOPVx1NTc0ZVx1OTBhM1x1OTA1NFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfS089XHU5N2QzXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9LUz1cdTU1ODBcdTRlYzBcdTdjNzNcdTcyM2VcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0tVPVx1NWVhYlx1NzIzZVx1NWZiN1x1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfS1k9XHU1NDA5XHU3MjNlXHU1NDA5XHU2NWFmXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9MQT1cdTYyYzlcdTRlMDFcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xOPVx1Njc5N1x1NjgzY1x1NjJjOVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfTE89XHU1YmVlXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9MVD1cdTdhY2JcdTk2NzZcdTViOWJcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX0xWPVx1NjJjOVx1ODEyYlx1N2RhZFx1NGU5ZVx1NjU4N1x1MzAwMVx1NTIxN1x1NzI3OVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfTUc9XHU5OWFjXHU2MmM5XHU1MmEwXHU4OTdmXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9NST1cdTZiZGJcdTUyMjlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01LPVx1OTlhY1x1NTE3Nlx1OTgxM1x1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfTUw9XHU5OWFjXHU0Zjg2XHU0ZTllXHU2MmM5XHU1OWM2XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9NTj1cdTg0OTlcdTUzZTRcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01PPVx1NjQ2OVx1NzIzZVx1OTA1NFx1N2RhZFx1NGU5ZVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfTVI9XHU5OWFjXHU2MmM5XHU1NzMwXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9NUz1cdTk5YWNcdTRmODZcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX01UPVx1OTlhY1x1NzIzZVx1NGVkNlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfTVk9XHU3ZGVjXHU3NTM4XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9OQT1cdThhZmVcdTliNmZcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX05FPVx1NWMzY1x1NmNjYVx1NzIzZVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfTkw9XHU4Mzc3XHU4NjJkXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9OTz1cdTYzMmFcdTVhMDFcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX09DPVx1NmI1MFx1NTE0Ylx1NWUwY1x1NTc2Nlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfT009KEFmYW4pIFx1NTk2N1x1OTFjY1x1NGU5ZVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfT1I9XHU1OTY3XHU5MWNjXHU0ZTllXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9QQT1cdTY1YzFcdTkwNmVcdTY2NmVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1BMPVx1NmNlMlx1ODYyZFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfUFM9XHU1ZTE1XHU2NWJkXHU1NzE2XHU2NTg3XHUzMDAxXHU2NjZlXHU0ZWMwXHU1NzE2XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9QVD1cdTg0NjFcdTg0MDRcdTcyNTlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1FVPVx1ODRjYlx1Njk1YVx1NzRlNlx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfUk09XHU5MWNjXHU2MjU4XHU3Zjg1XHU2NmZjXHU2NWFmXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9STj1cdTUxNGJcdTUwMmJcdTU3MzBcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1JPPVx1N2Y4NVx1OTlhY1x1NWMzY1x1NGU5ZVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfUlU9XHU0ZmM0XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9SVz1cdTkxZDFcdTRlOWVcdTc2ZTdcdTViODlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NBPVx1NjhiNVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfU0Q9XHU0ZmUxXHU1ZmI3XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TRz1cdTY4NTFcdTY4M2NcdTliNmZcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NIPVx1NTg1ZVx1NzIzZVx1N2RhZFx1NGU5ZS1cdTUxNGJcdTdmODVcdTU3MzBcdTRlOWVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NJPVx1OTMyYlx1ODYyZFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfU0s9XHU2NWFmXHU2ZDFiXHU0ZjEwXHU1MTRiXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TTD1cdTY1YWZcdTZkMWJcdTdkYWRcdTVjM2NcdTRlOWVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NNPVx1ODVhOVx1NjQ2OVx1NzI1OVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfU049XHU3ZDM5XHU3ZDBkXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TTz1cdTdkMjJcdTk5YWNcdTUyMjlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NRPVx1OTYzZlx1NzIzZVx1NWRmNFx1NWMzY1x1NGU5ZVx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfU1I9XHU1ODVlXHU3MjNlXHU3ZGFkXHU0ZTllXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TUz1cdTUzZjJcdTc0ZTZcdTZmZGZcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NUPVx1NWUyZFx1N2QyMlx1NjI1OFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfU1U9XHU1ZGZkXHU0ZWQ2XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9TVj1cdTc0NWVcdTUxNzhcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1NXPVx1NjVhZlx1ODNlZlx1ODk3Zlx1OTFjY1x1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfVEE9XHU2Y2YwXHU3YzczXHU3MjNlXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9URT1cdTZjZjBcdTUzZTRcdTYyYzlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RHPVx1NTg1NFx1NTQwOVx1NTE0Ylx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfVEg9XHU2Y2YwXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9UST1cdTYzZDBcdTY4M2NcdTUyMjlcdTVjM2NcdTRlOWVcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RLPVx1NTcxZlx1NWVhYlx1NjZmY1x1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfVEw9XHU1ODU0XHU1MmEwXHU2ZDFiXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9UTj1cdTgyNzJcdTc0ZTZcdTdkMGRcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RPPVx1Njc3MVx1NTJhMFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfVFI9XHU1NzFmXHU4MDMzXHU1MTc2XHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9UUz1cdTViOGJcdTUyYTBcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1RUPVx1OTdjM1x1OTc3Y1x1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfVFc9XHU1OTUxXHU3ZGFkXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9VSz1cdTcwY2ZcdTUxNGJcdTg2MmRcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1VSPVx1NzBjZlx1OTBmZFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfVVo9XHU3MGNmXHU4MzMyXHU1MjI1XHU1MTRiXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9WST1cdThkOGFcdTUzNTdcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1ZPPVx1NmM4M1x1NjJjOVx1NjY2ZVx1NTE0Ylx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfV089XHU3MGNmXHU2ZDFiXHU1OTJiXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9YSD1cdTc5ZDFcdTg1YTlcdTY1ODcKLUZPUk1fT1BUSU9OX0xBTkdVQUdFX1lPPVx1NTEyYVx1OWI2Zlx1NWRmNFx1NjU4NwotRk9STV9PUFRJT05fTEFOR1VBR0VfWkg9XHU0ZTJkXHU2NTg3Ci1GT1JNX09QVElPTl9MQU5HVUFHRV9aVT1cdTc5NTZcdTliNmZcdTY1ODcKLUZPUk1fTEFCRUxfRVhBQ1RfTkFNRV9NQVRDSD1cdTViOGNcdTUxNjhcdTc2ZjhcdTdiMjYKLUZPUk1fTEFCRUxfQ0FTRV9TRU5TSVRJVkVfTUFUQ0g9XHU1MzQwXHU1MjA2XHU1OTI3XHU1YzBmXHU1YmViCi1GT1JNX0xBQkVMX1NPVU5ERVg9XHU0ZjNjXHU0ZTRlXHU1MGNmCi1GT1JNX0xBQkVMX0lERU5USUZJRVJTPUlECi1GT1JNX0xBQkVMX0lERU5USUZJRVJfVFlQRT1cdTk4NWVcdTU3OGIKLQotIyBEbyBub3QgdHJhbnNsYXRlIHRoZSB0d28gaXRlbXMgYmVsb3cuCi1GT1JNX09QVElPTl9JREVOVElGSUVSX0RVTlM9RC1VLU4tUwotRk9STV9PUFRJT05fSURFTlRJRklFUl9USE9NQVNfUkVHSVNUUlk9VGhvbWFzIFx1NzY3Ylx1OTMwNAotCi1GT1JNX0xBQkVMX0tFWV9OQU1FPVx1N2QyMlx1NWYxNVx1OTM3NVx1NTQwZFx1N2EzMQotRk9STV9MQUJFTF9LRVlfVkFMVUU9XHU5Mzc1XHU1MDNjCi1GT1JNX0xBQkVMX0NBVEVHT1JJRVM9XHU3YTJlXHU5ODVlCi1GT1JNX0xBQkVMX0NBVEVHT1JZX1RZUEU9XHU5ODVlXHU1NzhiCi1GT1JNX09QVElPTl9DQVRFR09SWV9OQUlDUz1OQUlDUwotRk9STV9PUFRJT05fQ0FURUdPUllfVU5TUFNDXzczPVVOU1BTQyA3LjMKLUZPUk1fT1BUSU9OX0NBVEVHT1JZX0dFTz1HRU8KLUZPUk1fT1BUSU9OX0NBVEVHT1JZX0RXQ09NTVVOSVRZPWRXIFx1NzkzZVx1N2ZhNAotRk9STV9MQUJFTF9CVVNJTkVTU19DQVRFR09SSUVTPVx1NzZmOFx1NGU5Mlx1NmJkNFx1OGYwM1x1ZmYxYQotRk9STV9PUFRJT05fQlVTSU5FU1NFU19PTkxZPVx1NTNlYVx1NjcwOVx1NTU0Nlx1Njk2ZAotRk9STV9PUFRJT05fU0VSVklDRVNfT05MWT1cdTUzZWFcdTY3MDlcdTY3MGRcdTUyZDkKLUZPUk1fT1BUSU9OX0JPVEg9XHU1NTQ2XHU2OTZkXHU1NDhjXHU2NzBkXHU1MmQ5Ci1GT1JNX0xBQkVMX0RJU0NPVkVSWVVSTFM9XHU2M2EyXHU3ZDIyIFVSTAotRk9STV9MQUJFTF9ESVNDT1ZFUllVUkw9XHU2M2EyXHU3ZDIyIFVSTAotRk9STV9MQUJFTF9GSU5EUVVBTElGSUVSUz1cdTVjMGJcdTYyN2VcdTk2NTBcdTViOWFcdTUxNDMKLUZPUk1fTEFCRUxfQ09NQklORV9LRVlTPVx1N2Q0NFx1NTQwOFx1N2QyMlx1NWYxNVx1OTM3NQotRk9STV9PUFRJT05fQU5EQUxMS0VZUz1cdTRlMTQKLUZPUk1fT1BUSU9OX09SQUxMS0VZUz1cdTYyMTYKLUZPUk1fT1BUSU9OX09STElLRUtFWVM9XHU2MjE2XHU3NmY4XHU0ZjNjCi1GT1JNX0xBQkVMX1NPUlRfQllfTkFNRT1cdTRmOWRcdTU0MGRcdTdhMzFcdTYzOTJcdTVlOGZcdWZmMWEKLUZPUk1fUkFESU9fU09SVF9BU0M9XHU1MzQ3XHU1MWFhCi1GT1JNX1JBRElPX1NPUlRfREVTQz1cdTk2NGRcdTUxYWEKLUZPUk1fTEFCRUxfU09SVF9CWV9EQVRFPVx1NGY5ZFx1NjVlNVx1NjcxZlx1NjM5Mlx1NWU4Zlx1ZmYxYQotRk9STV9MQUJFTF9NQVhfU0VBUkNIX1NFVD1cdTY0MWNcdTVjMGJcdTk2YzZcdTU5MjdcdTVjMGZcdTRlMGFcdTk2NTBcdWZmMWEKLUZPUk1fTEFCRUxfTUFYX1JFU1VMVFM9XHU3ZDUwXHU2NzljXHU2NTc4XHU3NmVlXHU0ZTBhXHU5NjUwXHVmZjFhCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRVNfU0lNUExFX0RFU0M9XHU4YWNiXHU4ZjM4XHU1MTY1XHU4OTgxXHU2NDFjXHU1YzBiXHU3Njg0XHU2NzBkXHU1MmQ5XHU3Njg0XHU1YzQwXHU5MGU4XHU2MjE2XHU1YjhjXHU2NTc0XHU1NDBkXHU3YTMxXHUzMDAyJyUnIFx1N2IyNlx1ODY1Zlx1NTNlZlx1NzUyOFx1NGY4Nlx1NGY1Y1x1NzBiYVx1N2IyNlx1NTQwOFx1NGVmYlx1NGY1NVx1NWI1N1x1NTE0M1x1NzY4NFx1ODQyY1x1NzUyOFx1NWI1N1x1NTE0M1x1MzAwMlx1OGFjYlx1NjMwOTxzdHJvbmc+XHU1N2Y3XHU4ODRjPC9zdHJvbmc+XHU0Zjg2XHU1N2Y3XHU4ODRjXHU2NDFjXHU1YzBiXHUzMDAyCi1GT1JNX0xBQkVMX0ZJTkRfU0VSVklDRV9VVUlEX0RFU0M9XHU4YWNiXHU4ZjM4XHU1MTY1XHU4OTgxXHU2NDFjXHU1YzBiXHU3Njg0XHU2NzBkXHU1MmQ5XHU3Njg0IFVVSURcdTMwMDJcdThhY2JcdTYzMDk8c3Ryb25nPlx1NTdmN1x1ODg0Yzwvc3Ryb25nPlx1NGY4Nlx1NTdmN1x1ODg0Y1x1NjQxY1x1NWMwYlx1MzAwMgotRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFU19TSU1QTEVfREVTQz1cdThhY2JcdThmMzhcdTUxNjVcdTg5ODFcdTY0MWNcdTVjMGJcdTc2ODRcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjJcdTc2ODRcdTVjNDBcdTkwZThcdTYyMTZcdTViOGNcdTY1NzRcdTU0MGRcdTdhMzFcdTMwMDInJScgXHU3YjI2XHU4NjVmXHU1M2VmXHU3NTI4XHU0Zjg2XHU0ZjVjXHU3MGJhXHU3YjI2XHU1NDA4XHU0ZWZiXHU0ZjU1XHU1YjU3XHU1MTQzXHU3Njg0XHU4NDJjXHU3NTI4XHU1YjU3XHU1MTQzXHUzMDAyXHU4YWNiXHU2MzA5PHN0cm9uZz5cdTU3ZjdcdTg4NGM8L3N0cm9uZz5cdTRmODZcdTU3ZjdcdTg4NGNcdTY0MWNcdTVjMGJcdTMwMDIKLUZPUk1fTEFCRUxfRklORF9TRVJWSUNFX0lOVEVSRkFDRV9VVUlEX0RFU0M9XHU4YWNiXHU4ZjM4XHU1MTY1XHU4OTgxXHU2NDFjXHU1YzBiXHU3Njg0XHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyXHU3Njg0IFVVSURcdTMwMDJcdThhY2JcdTYzMDk8c3Ryb25nPlx1NTdmN1x1ODg0Yzwvc3Ryb25nPlx1NGY4Nlx1NTdmN1x1ODg0Y1x1NjQxY1x1NWMwYlx1MzAwMgotRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVM9XHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyCi1GT1JNX0xBQkVMX1VVSURfS0VZPVVVSUQgXHU3ZDIyXHU1ZjE1XHU5Mzc1XHVmZjFhCi1GT1JNX0xBQkVMX1VTRV9TRVJWSUNFPVx1NGY3Zlx1NzUyOFx1NjcwZFx1NTJkOQotRk9STV9MQUJFTF9TRVJWSUNFPVx1NjcwZFx1NTJkOQotRk9STV9MQUJFTF9CVVNJTkVTUz1cdTU1NDZcdTY5NmQKLUZPUk1fTEFCRUxfUFVCTElTSF9BU1NFUlRJT05TPVx1NzY3Y1x1NGY0OFx1ODAwNVx1NzhiYVx1OGE4ZAotRk9STV9MQUJFTF9ESVJFQ1RJT049XHU2NWI5XHU1NDExCi1GT1JNX0xBQkVMX0ZST01fS0VZPVx1NGY4Nlx1NmU5MFx1N2QyMlx1NWYxNVx1OTM3NQotRk9STV9MQUJFTF9UT19LRVk9XHU3NmVlXHU2YTE5XHU3ZDIyXHU1ZjE1XHU5Mzc1Ci1GT1JNX0xBQkVMX1NUQVRVUz1cdTcyYzBcdTYxNGIKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX1RZUEU9XHU3OGJhXHU4YThkXHU5ODVlXHU1NzhiCi1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QQVJFTlRfQ0hJTEQ9XHU0ZTBhXHU0ZTBiXHU1YzY0Ci1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QRUVSX1RPX1BFRVI9XHU1NDBjXHU1YzY0Ci1GT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9JREVOVElUWT1cdThlYWJcdTUyMDYKLUZPUk1fTEFCRUxfQVNTRVJUSU9OX0RJUkVUSU9OX0RFU0M9PHN0cm9uZz5cdTRmODZcdTZlOTA8L3N0cm9uZz5cdTY1YjlcdTU0MTFcdTY3MDNcdTVlZmFcdTdhY2JcdTVmOWVcdTkwMTlcdTUwMGJcdTU1NDZcdTY5NmRcdTUyMzBcdTRlMGFcdTk3NjJcdTc2ODRcdTU1NDZcdTY5NmRcdTc2ODRcdTc2N2NcdTRmNDhcdTgwMDVcdTc4YmFcdThhOGRcdTMwMDIgPHN0cm9uZz5cdTc2ZWVcdTZhMTk8L3N0cm9uZz5cdTY1YjlcdTU0MTFcdTY3MDNcdTVlZmFcdTdhY2JcdTVmOWVcdTRlMGFcdTk3NjJcdTc2ODRcdTU1NDZcdTY5NmRcdTUyMzBcdTkwMTlcdTUwMGJcdTU1NDZcdTY5NmRcdTc2ODRcdTc2N2NcdTRmNDhcdTgwMDVcdTc4YmFcdThhOGRcdTMwMDIKLUZPUk1fT1BUSU9OX0FTU0VSVElPTl9ESVJFQ1RJT05fRlJPTT0tLS0+Ci1GT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX1RPPTwtLS0KLUZPUk1fTEFCRUxfVEhJU19CVVNJTkVTUz1cdTkwMTlcdTUwMGIKLU1TR19FUlJPUl9JTlZBTElEX1FVRVJZX05BTUU9SVdBQjAxNDBFIFx1OGFjYlx1OGYzOFx1NTE2NVx1NjdlNVx1OGE2Mlx1NzY4NFx1NjcwOVx1NjU0OFx1NTQwZFx1N2EzMVx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfTkFNRVM9SVdBQjAxNDFFIFx1OGFjYlx1OGYzOFx1NTE2NVx1NGUwMFx1N2NmYlx1NTIxN1x1NjcwOVx1NjU0OFx1NzY4NFx1NTQwZFx1N2EzMVx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfUFVCTElTSF9VUkw9SVdBQjAxNDJFIFx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NFx1NzY3Y1x1NGY0OCBVUkxcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1VTRVJJRD1JV0FCMDE0M0UgXHU4YWNiXHU4ZjM4XHU1MTY1XHU2NzA5XHU2NTQ4XHU3Njg0XHU0ZjdmXHU3NTI4XHU4MDA1IElEXHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9NQVhfU0VBUkNIX1NFVD1JV0FCMDE0NUUgXHU4YWNiXHU4ZjM4XHU1MTY1XHU2NzAwXHU1OTI3XHU2NDFjXHU1YzBiXHU5NmM2XHU3Njg0XHU2NzA5XHU2NTQ4XHU1OTI3XHU1YzBmXHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9NQVhfUkVTVUxUUz1JV0FCMDE0NkUgXHU4YWNiXHU4ZjM4XHU1MTY1XHU3ZDUwXHU2NzljXHU2NTc4XHU3NmVlXHU0ZTBhXHU5NjUwXHU3Njg0XHU2NzA5XHU2NTQ4XHU1OTI3XHU1YzBmXHUzMDAyCi1NU0dfSU5GT19CVVNJTkVTU0VTX0ZPVU5EPUlXQUIwMTQ3SSBcdTYyN2VcdTUyMzBcdTc2ODRcdTU1NDZcdTY5NmRcdTY1NzhcdTc2ZWVcdWZmMWElMQotTVNHX0VSUk9SX05PX0JVU0lORVNTRVNfRk9VTkQ9SVdBQjAxNDhFIFx1NjI3ZVx1NGUwZFx1NTIzMFx1NTU0Nlx1Njk2ZFx1MzAwMgotTVNHX0lORk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNDlJIFx1NjI3ZVx1NTIzMFx1NzY4NFx1NjcwZFx1NTJkOVx1NjU3OFx1NzZlZVx1ZmYxYSUxCi1NU0dfRVJST1JfTk9fU0VSVklDRVNfRk9VTkQ9SVdBQjAxNTBFIFx1NjI3ZVx1NGUwZFx1NTIzMFx1NjcwZFx1NTJkOVx1MzAwMgotTVNHX0VSUk9SX1NJTkdMRV9JVEVNPUlXQUIwMTUxRSBcdThhY2JcdTUzZWFcdTkwNzhcdTUzZDZcdTRlMDBcdTUwMGJcdTk4MDVcdTc2ZWVcdTMwMDIKLU1TR19RVUVTVElPTl9JVEVNX1JFUExBQ0VNRU5UPVx1OTA3OFx1OTgwNVx1NjcwM1x1NTNkNlx1NGVlM1x1NWRmMlx1NTcyOFx1NzZlZVx1NmExOVx1NGUyZFx1NzY4NFx1OTgwNVx1NzZlZVx1MzAwMlx1NjBhOFx1ODk4MVx1N2U3Y1x1N2U4Y1x1NTVjZVx1ZmYxZgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VTX0ZPVU5EPUlXQUIwMTUySSBcdTYyN2VcdTUyMzBcdTc2ODRcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjJcdTY1NzhcdWZmMWElMQotTVNHX0VSUk9SX05PX1NFUlZJQ0VfSU5URVJGQUNFU19GT1VORD1JV0FCMDE1M0UgXHU2MjdlXHU0ZTBkXHU1MjMwXHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyXHUzMDAyCi1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDE1NEUgXHU4YWNiXHU5MDc4XHU1M2Q2XHU4MWYzXHU1YzExXHU0ZTAwXHU1MDBiXHU5ODA1XHU3NmVlXHUzMDAyCi1NU0dfRVJST1JfSU5WQUxJRF9VVUlEX0tFWT1JV0FCMDE1NUUgXHU4YWNiXHU4ZjM4XHU1MTY1XHU0ZTAwXHU1MDBiXHU2NzA5XHU2NTQ4XHU3Njg0IFVVSUQgXHU5Mzc1XHUzMDAyCi1NU0dfRVJST1JfUVVFUllfTkFNRV9DT05GTElDVD1JV0FCMDE1NkUgXHU1YjUwXHU2N2U1XHU4YTYyXHU3Njg0XHU2N2U1XHU4YTYyXHU1NDBkXHU3YTMxXHU0ZTBkXHU4MGZkXHU4MjA3XHU4ZDc3XHU2ZTkwXHU3NmY4XHU1NDBjXHUzMDAyCi1NU0dfRVJST1JfTk9fSVRFTVNfVE9fR0VUPUlXQUIwMTU3RSBcdTY3MmFcdTc2N2NcdTRmNDhcdTYyMTZcdTYzYTJcdTdkMjJcdTUyMzBcdTYzMDdcdTViOWFcdTk4NWVcdTU3OGJcdTc2ODRcdTk4MDVcdTc2ZWVcdTMwMDIKLQotIyBSZXN1bHRzCi1BTFRfUVVFUllfUkVTVUxUUz1cdTY3ZTVcdThhNjJcdTdkNTBcdTY3OWMKLUZPUk1fTEFCRUxfU1VCUVVFUlk9XHU3ZDUwXHU2NzljXHU1M2VmXHU3NTI4XHU0Zjg2XHU0ZjVjXHU3MGJhXHU1M2U2XHU0ZTAwXHU5ODA1XHU0ZjVjXHU2OTZkXHU3Njg0XHU4ZjM4XHU1MTY1XHUzMDAyXHU4YWNiXHU0ZTAwXHU0ZTBiXHU5ODAyXHU3YWVmXHU3Njg0PHN0cm9uZz5cdTc2ZWVcdTZhMTk8L3N0cm9uZz5cdTkzYzhcdTdkNTBcdTRmODZcdTY3ZTVcdTc3MGJcdTRmNWNcdTY5NmRcdTMwMDJcdTYwYThcdTUzZWZcdTRlZTVcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1OGY0OVx1OTAwMTwvc3Ryb25nPlx1NjMwOVx1OTIxNVx1ZmYwY1x1NTcyOFx1NGY1Y1x1Njk2ZFx1NGUyZFx1NGY3Zlx1NzUyOFx1OTA3OFx1NTNkNlx1NzY4NFx1N2Q1MFx1Njc5Y1x1MzAwMgotRk9STV9MQUJFTF9RVUVSWT1cdThhY2JcdTkwNzhcdTUzZDZcdTRlMDBcdTUwMGJcdTdkNTBcdTY3OWNcdTRmODZcdTY3ZTVcdTc3MGJcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdWZmMGNcdTYyMTZcdTkwNzhcdTUzZDZcdTRlMDBcdTdkNDRcdTdkNTBcdTY3OWNcdWZmMGNcdTUxOGRcdTYzMDlcdTY3ZDBcdTUwMGJcdTYzMDlcdTkyMTVcdTRmODZcdTU3ZjdcdTg4NGNcdTRmNWNcdTY5NmRcdTMwMDIKLUZPUk1fTElOS19UQVJHRVQ9XHU3NmVlXHU2YTE5Ci1GT1JNX0JVVFRPTl9UUkFOU0ZFUj1cdThmNDlcdTkwMDEKLUZPUk1fQlVUVE9OX1JFRlJFU0g9XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2Ci1GT1JNX0JVVFRPTl9BRERfVE9fRkFWT1JJVEVTPVx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYgotRk9STV9CVVRUT05fVU5QVUJMSVNIPVx1NTNkNlx1NmQ4OFx1NzY3Y1x1NGY0OAotRk9STV9CVVRUT05fQ0xFQVI9XHU2ZTA1XHU5NjY0Ci0KLSMgUHVibGlzaCBhY3Rpb25zCi1BTFRfUFVCTElTSD1cdTc2N2NcdTRmNDgKLUZPUk1fTEFCRUxfUFVCTElTSD1cdTc2N2NcdTRmNDhcdWZmMWEKLUZPUk1fT1BUSU9OX0JVU0lORVNTPVx1NTU0Nlx1Njk2ZAotRk9STV9PUFRJT05fU0VSVklDRT1cdTY3MGRcdTUyZDkKLUZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFPVx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2MgotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX1NJTVBMRV9ERVNDPVx1OGFjYlx1OGYzOFx1NTE2NVx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1NTU0Nlx1Njk2ZFx1NzY4NFx1NTQwZFx1N2EzMVx1NTQ4Y1x1OTA3OFx1NzUyOFx1OGFhYVx1NjYwZVx1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OTQ1MVx1NTIyNVx1MzAwMgotRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX0FEVkFOQ0VEX0RFU0M9XHU4YWNiXHU2M2QwXHU0ZjliXHU4OTgxXHU3NjdjXHU0ZjQ4XHU3Njg0XHU1NTQ2XHU2OTZkXHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyXHU0ZTVmXHU1M2VmXHU0ZWU1XHU2MzA3XHU1YjlhXHU1MTc2XHU0ZWQ2XHU1M2MzXHU2NTc4XHUzMDAyXHU1M2VmXHU4MGZkXHU5NzAwXHU4OTgxXHU5NDUxXHU1MjI1XHUzMDAyCi1GT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQz1cdThhY2JcdTUzZDZcdTVmOTdcdTYyMTZcdTVjMGJcdTYyN2VcdTRlMDBcdTk4MDVcdTU1NDZcdTY5NmRcdWZmMGNcdTUxOGRcdTYzZDBcdTRmOWJcdTg5ODFcdTc2N2NcdTRmNDhcdTc2ODRcdTY3MGRcdTUyZDlcdTc2ODQgV1NETCBVUkxcdTMwMDFcdTU0MGRcdTdhMzFcdTU0OGNcdTkwNzhcdTc1MjhcdThhYWFcdTY2MGVcdTMwMDJcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdTk0NTFcdTUyMjVcdTMwMDIKLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0M9XHU4YWNiXHU1M2Q2XHU1Zjk3XHU2MjE2XHU1YzBiXHU2MjdlXHU0ZTAwXHU5ODA1XHU1NTQ2XHU2OTZkXHVmZjBjXHU1MThkXHU2M2QwXHU0ZjliXHU4OTgxXHU3NjdjXHU0ZjQ4XHU3Njg0XHU2NzBkXHU1MmQ5XHU3Njg0IFdTREwgVVJMIFx1NTQ4Y1x1NTQwZFx1N2EzMVx1MzAwMlx1NGU1Zlx1NTNlZlx1NGVlNVx1NjMwN1x1NWI5YVx1NTE3Nlx1NGVkNlx1NTNjM1x1NjU3OFx1MzAwMlx1NTNlZlx1ODBmZFx1OTcwMFx1ODk4MVx1OTQ1MVx1NTIyNVx1MzAwMgotRk9STV9MQUJFTF9CVVNJTkVTU19QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0M9XHU4YWNiXHU2M2QwXHU0ZjliXHU4OTgxXHU3NjdjXHU0ZjQ4XHU3Njg0XHU2NzBkXHU1MmQ5XHU3Njg0IFdTREwgVVJMXHUzMDAxXHU1NDBkXHU3YTMxXHU1NDhjXHU5MDc4XHU3NTI4XHU4YWFhXHU2NjBlXHUzMDAyXHU1M2VmXHU4MGZkXHU5NzAwXHU4OTgxXHU5NDUxXHU1MjI1XHUzMDAyCi1GT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9BRFZBTkNFRF9ERVNDPVx1OGFjYlx1NjNkMFx1NGY5Ylx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1NjcwZFx1NTJkOVx1NzY4NCBXU0RMIFVSTCBcdTU0OGNcdTU0MGRcdTdhMzFcdTMwMDJcdTRlNWZcdTUzZWZcdTRlZTVcdTYzMDdcdTViOWFcdTUxNzZcdTRlZDZcdTUzYzNcdTY1NzhcdTMwMDJcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdTk0NTFcdTUyMjVcdTMwMDIKLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9TSU1QTEVfREVTQz1cdThhY2JcdThmMzhcdTUxNjVcdTg5ODFcdTc2N2NcdTRmNDhcdTc2ODRcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjJcdTc2ODQgV1NETCBVUkxcdTMwMDFcdTU0MGRcdTdhMzFcdTU0OGNcdTkwNzhcdTc1MjhcdThhYWFcdTY2MGVcdTMwMDJcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdTk0NTFcdTUyMjVcdTMwMDIKLUZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9BRFZBTkNFRF9ERVNDPVx1OGFjYlx1NjNkMFx1NGY5Ylx1ODk4MVx1NzY3Y1x1NGY0OFx1NzY4NFx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2Mlx1NzY4NCBXU0RMIFVSTCBcdTU0OGNcdTU0MGRcdTdhMzFcdTMwMDJcdTRlNWZcdTUzZWZcdTRlZTVcdTYzMDdcdTViOWFcdTUxNzZcdTRlZDZcdTUzYzNcdTY1NzhcdTMwMDJcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdTk0NTFcdTUyMjVcdTMwMDIKLUZPUk1fTEFCRUxfUFVCTElTSF9GT1JNPVx1NzY3Y1x1NGY0OFx1NjgzY1x1NWYwZgotRk9STV9MQUJFTF9ERVNDUklQVElPTj1cdThhYWFcdTY2MGUKLUZPUk1fTEFCRUxfREVTQ1JJUFRJT05TPVx1OGFhYVx1NjYwZQotTVNHX0lORk9fQlVTSU5FU1NfUFVCTElTSEVEPUlXQUIwMTU4SSBcdTVkZjJcdTk4MDZcdTUyMjlcdTc2N2NcdTRmNDggJTEgXHU1NTQ2XHU2OTZkXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX1BVQkxJU0hFRD1JV0FCMDE1OUkgXHU1ZGYyXHU5ODA2XHU1MjI5XHU3NjdjXHU0ZjQ4ICUxIFx1NjcwZFx1NTJkOVx1MzAwMgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfUFVCTElTSEVEPUlXQUIwMTYwSSBcdTVkZjJcdTk4MDZcdTUyMjlcdTc2N2NcdTRmNDhcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjIgJTFcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX05BTUU9SVdBQjAxNjFFIFx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NTQwZFx1N2EzMVx1MzAwMgotTVNHX0VSUk9SX1JPV19CTEFOS19MQU5HVUFHRT1JV0FCMDI1MEUgXHU4YWNiXHU5MDc4XHU1M2Q2XHU5NzVlXHU3YTdhXHU3NjdkXHU3Njg0XHU4YTllXHU4YTAwXHU3ZDY2XHU3YjJjICUyIFx1NTIxN1x1NGUyZFx1NzY4NCAlMVx1MzAwMlx1NTNlYVx1NjcwOVx1N2IyY1x1NGUwMFx1NTIxN1x1NTNlZlx1NGVlNVx1NjcwOVx1N2E3YVx1NzY3ZFx1OGE5ZVx1OGEwMFx1MzAwMgotTVNHX0VSUk9SX1JPV19EVVBMSUNBVEVfTEFOR1VBR0U9SVdBQjAyNTFFIFx1OGFjYlx1OGI4YVx1NjZmNFx1N2IyYyAlMiBcdTUyMTdcdTRlMmRcdTc2ODQgJTEgXHU3Njg0XHU4YTllXHU4YTAwXHUzMDAyXHU3M2ZlXHU4ODRjXHU4YTllXHU4YTAwXHU1ZGYyXHU1NzI4XHU0ZjdmXHU3NTI4XHU0ZTJkXHUzMDAyCi1NU0dfRVJST1JfUk9XX0lOVkFMSURfVEVYVD1JV0FCMDI1MkUgXHU4YWNiXHU1NzI4XHU3YjJjICUyIFx1NTIxN1x1NGUyZFx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NCAlMVx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkw9SVdBQjAyNTNFIFx1OGFjYlx1OGYzOFx1NTE2NVx1NjcwOVx1NjU0OFx1NzY4NCBXU0RMIFVSTFx1MzAwMgotTVNHX0VSUk9SX05PX05BTUVTPUlXQUIwMjU0RSBcdThhY2JcdTY1YjBcdTU4OWVcdTgxZjNcdTVjMTFcdTRlMDBcdTUwMGJcdTU0MGRcdTdhMzFcdTMwMDIKLU1TR19FUlJPUl9JTlZBTElEX1NFUlZJQ0U9SVdBQjAyNTVFIFx1OGFjYlx1NjNkMFx1NGY5Ylx1NjcwOVx1NjU0OFx1NzY4NFx1NjcwZFx1NTJkOVx1MzAwMgotTVNHX0VSUk9SX0lOVkFMSURfQlVTSU5FU1M9SVdBQjAyNTZFIFx1OGFjYlx1NjNkMFx1NGY5Ylx1NjcwOVx1NjU0OFx1NzY4NFx1NTU0Nlx1Njk2ZFx1MzAwMgotCi0jIEJ1c2luZXNzIFB1Ymxpc2ggU2VydmljZSBhY3Rpb24KLUFMVF9QVUJMSVNIX1NFUlZJQ0U9XHU3NjdjXHU0ZjQ4XHU2NzBkXHU1MmQ5Ci0KLSMgV1NETCBCcm93c2VyCi1USVRMRV9XU0RMX0JST1dTRVI9V1NETCBcdTcwMGZcdTg5YmRcdTU2NjggLSAlMQotRk9STV9MQUJFTF9XU0RMX1NPVVJDRT1cdThhY2JcdTkwNzhcdTUzZDZcdTRlMDBcdTUwMGIgV1NETCBcdTRmODZcdTZlOTBcdWZmMWEKLUZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFM9V2ViIFx1NWMwOFx1Njg0OAotRk9STV9MQUJFTF9XU0RMX1NPVVJDRV9GQVZPUklURVM9XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiCi1GT1JNX0xBQkVMX1dFQl9QUk9KRUNUPVdlYiBcdTVjMDhcdTY4NDgKLUZPUk1fTEFCRUxfV1NETF9VUkw9V1NETCBVUkwKLUFMVF9XU0RMX0JST1dTRVI9V1NETCBcdTcwMGZcdTg5YmRcdTU2NjgKLQotIyBEZXRhaWxzCi1GT1JNX0xJTktfRURJVD1cdTdkZThcdThmMmYKLUZPUk1fTElOS19DQU5DRUw9XHU1M2Q2XHU2ZDg4Ci1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1cdTU1NDZcdTY5NmRcdTkxZDFcdTk0NzAKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9XHU2NzBkXHU1MmQ5XHU5MWQxXHU5NDcwCi1GT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX0tFWT1UTW9kZWwgXHU5MWQxXHU5NDcwCi1GT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SSUVTPVx1NGY3Zlx1NzUyOFx1ODAwNVx1NWI5YVx1N2ZhOVx1NzY4NFx1N2EyZVx1OTg1ZQotRk9STV9MQUJFTF9DSEVDS0VEPVx1NTJmZVx1OTA3OAotRk9STV9MQUJFTF9GSUxFPVx1NmE5NFx1Njg0OAotTVNHX1FVRVNUSU9OX1BVQkxJU0hfSVRFTT1cdTU3MjhcdTc2N2JcdTkzMDRcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzBcdTk4MDVcdTc2ZWVcdTMwMDJcdTYwYThcdTg5ODFcdTc2N2NcdTRmNDhcdTViODNcdTU1Y2VcdWZmMWYKLU1TR19RVUVTVElPTl9TRVJWSUNFX1BVQkxJU0hfQlVTSU5FU1M9XHU1NzI4XHU3NjdiXHU5MzA0XHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU2NzBkXHU1MmQ5XHU1M2NhXHU1MTc2XHU1NTQ2XHU2OTZkXHUzMDAyXHU4OTgxXHU3ZTdjXHU3ZThjXHU3NjdjXHU0ZjQ4XHU1NWNlXHVmZjFmCi1NU0dfSU5GT19CVVNJTkVTU19VUERBVEVEPUlXQUIwMjU3SSBcdTVkZjJcdTk4MDZcdTUyMjlcdTY2ZjRcdTY1YjAgJTEgXHU1NTQ2XHU2OTZkXHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX1VQREFURUQ9SVdBQjAyNThJIFx1NWRmMlx1OTgwNlx1NTIyOVx1NjZmNFx1NjViMCAlMSBcdTY3MGRcdTUyZDlcdTMwMDIKLU1TR19JTkZPX1NFUlZJQ0VfSU5URVJGQUNFX1VQREFURUQ9SVdBQjAyNTlJIFx1NWRmMlx1OTgwNlx1NTIyOVx1NjZmNFx1NjViMFx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2MiAlMVx1MzAwMgotTVNHX0lORk9fUkVHSVNUUllfVVBEQVRFRD1JV0FCMDMyM0kgXHU1ZGYyXHU5ODA2XHU1MjI5XHU2NmY0XHU2NWIwICUxIFx1NzY3Ylx1OTMwNFx1MzAwMgotCi0jIFVucHVibGlzaEFjdGlvbgotQUxUX1VOUFVCTElTSF9CVVNJTkVTUz1cdTUzZDZcdTZkODhcdTc2N2NcdTRmNDhcdTU1NDZcdTY5NmQKLUFMVF9VTlBVQkxJU0hfU0VSVklDRT1cdTUzZDZcdTZkODhcdTc2N2NcdTRmNDhcdTY3MGRcdTUyZDkKLUFMVF9VTlBVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0U9XHU1M2Q2XHU2ZDg4XHU3NjdjXHU0ZjQ4XHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyCi1GT1JNX0xBQkVMX1VOUFVCTElTSF9ERVNDPVx1OGFjYlx1NjMwOTxzdHJvbmc+XHU1N2Y3XHU4ODRjPC9zdHJvbmc+XHU0Zjg2XHU1M2Q2XHU2ZDg4XHU3NjdjXHU0ZjQ4XHU5MDE5XHU1MDBiXHU3MjY5XHU0ZWY2XHUzMDAyXHU1M2VmXHU4MGZkXHU5NzAwXHU4OTgxXHU5NDUxXHU1MjI1XHUzMDAyCi1NU0dfSU5GT19CVVNJTkVTU19VTlBVQkxJU0hFRD1JV0FCMDI2MEkgXHU1ZGYyXHU5ODA2XHU1MjI5XHU1M2Q2XHU2ZDg4XHU3NjdjXHU0ZjQ4ICUxIFx1NTU0Nlx1Njk2ZFx1MzAwMgotTVNHX0lORk9fU0VSVklDRV9VTlBVQkxJU0hFRD1JV0FCMDI2MUkgXHU1ZGYyXHU5ODA2XHU1MjI5XHU1M2Q2XHU2ZDg4XHU3NjdjXHU0ZjQ4ICUxIFx1NjcwZFx1NTJkOVx1MzAwMgotTVNHX0lORk9fU0VSVklDRV9JTlRFUkZBQ0VfVU5QVUJMSVNIRUQ9SVdBQjAyNjJJIFx1NWRmMlx1OTgwNlx1NTIyOVx1NTNkNlx1NmQ4OFx1NzY3Y1x1NGY0OCAlMSBcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjJcdTMwMDIKLQotIyBBZGQgdG8gV1NETCBQZXJzcGVjdGl2ZQotQUxUX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFPVx1NTJhMFx1NTIzMCBXU0RMIFx1OTgwMVx1OTc2MgotTVNHX0lORk9fV1NETF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzc2SSAlMSBcdTVkZjJcdTk4MDZcdTUyMjlcdTUyYTBcdTUyMzAgV1NETCBcdTk4MDFcdTk3NjJcdTRlMmRcdTMwMDIKLU1TR19FUlJPUl9XU0RMX05PVF9BRERFRF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzc3RSAlMSBcdTcxMjFcdTZjZDVcdTUyYTBcdTUyMzAgV1NETCBcdTk4MDFcdTk3NjJcdTRlMmRcdTMwMDIKLQotIyBBZGQgdG8gRmF2b3JpdGVzCi1BTFRfQUREX1RPX0ZBVk9SSVRFUz1cdTUyYTBcdTUyMzBcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIKLU1TR19JTkZPX0ZBVk9SSVRFX0FEREVEPUlXQUIwMjYzSSAlMSBcdTVkZjJcdTk4MDZcdTUyMjlcdTUyYTBcdTUyMzBcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWJcdTMwMDIKLU1TR19FUlJPUl9GQVZPUklURV9OT1RfQURERUQ9SVdBQjAyNjRFICUxIFx1NzEyMVx1NmNkNVx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYlx1MzAwMgotTVNHX0VSUk9SX0ZBVk9SSVRFX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzI0RSAlMSBcdTVkZjJcdTU3MjhcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWJcdTRlMmRcdTMwMDIKLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYlx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1NjBhOFx1ODk4MVx1NjUzOVx1NWJlYlx1NTVjZVx1ZmYxZgotCi0jIFJlZnJlc2gKLU1TR19JTkZPX05PREVfUkVGUkVTSEVEPUlXQUIwMjY1SSBcdTVkZjJcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDYgJTFcdTMwMDIKLU1TR19RVUVTVElPTl9SRU1PVkVfTk9ERT1cdTU3MjhcdTc2N2JcdTkzMDRcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzAgJTFcdTMwMDJcdTYwYThcdTg5ODFcdTZlMDVcdTk2NjRcdTViODNcdTU1Y2VcdWZmMWYKLQotIyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXMKLUFMVF9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFUz1cdTdiYTFcdTc0MDZcdTUzYzNcdTcxNjdcdTc2ODRcdTY3MGRcdTUyZDkKLUZPUk1fTEFCRUxfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfREVTQz1cdThhY2JcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1NjViMFx1NTg5ZVx1NjcwZFx1NTJkOTwvc3Ryb25nPlx1NjMwOVx1OTIxNVx1ZmYwY1x1NGY4Nlx1NWMwN1x1NWRmMlx1NjNhMlx1N2QyMlx1NzY4NFx1NjIxNlx1NWRmMlx1NzY3Y1x1NGY0OFx1NzY4NFx1NjcwZFx1NTJkOVx1NjViMFx1NTg5ZVx1ODFmM1x1NjI0MFx1NTNjM1x1NzE2N1x1NzY4NFx1NjcwZFx1NTJkOVx1NmUwNVx1NTVhZVx1NGUyZFx1MzAwMiBcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1NzlmYlx1OTY2NFx1NTNjM1x1NzE2Nzwvc3Ryb25nPlx1NjMwOVx1OTIxNVx1NGY4Nlx1NzlmYlx1OTY2NFx1NjI0MFx1OTA3OFx1NzY4NFx1NTNjM1x1NzE2N1x1MzAwMiBcdThiOGFcdTY2ZjRcdTUzZWZcdTgwZmRcdTk3MDBcdTg5ODFcdTk0NTFcdTUyMjVcdTMwMDIKLUZPUk1fTEFCRUxfUkVGRVJFTkNFRF9TRVJWSUNFUz1cdTUzYzNcdTcxNjdcdTc2ODRcdTY3MGRcdTUyZDkKLUZPUk1fQlVUVE9OX0FERF9TRVJWSUNFUz1cdTY1YjBcdTU4OWVcdTY3MGRcdTUyZDkKLUZPUk1fQlVUVE9OX1JFTU9WRV9SRUZFUkVOQ0VTPVx1NzlmYlx1OTY2NFx1NTNjM1x1NzE2NwotTVNHX0VSUk9SX05PX1JFRkVSRU5DRV9TRUxFQ1RFRD1JV0FCMDI2NkUgXHU4YWNiXHU5MDc4XHU1M2Q2XHU4MWYzXHU1YzExXHU0ZTAwXHU1MDBiXHU1M2MzXHU3MTY3XHU3Njg0XHU2NzBkXHU1MmQ5XHVmZjBjXHU1MThkXHU3ZTdjXHU3ZThjXHU0ZjVjXHU2OTZkXHUzMDAyCi1NU0dfRVJST1JfTk9fU0VSVklDRVM9SVdBQjAyNjdFIFx1OGFjYlx1NTNkNlx1NWY5N1x1NjIxNlx1NWMwYlx1NjI3ZVx1ODFmM1x1NWMxMVx1NGUwMFx1OTgwNVx1NjcwZFx1NTJkOVx1ZmYwY1x1NTE4ZFx1N2U3Y1x1N2U4Y1x1NGY1Y1x1Njk2ZFx1MzAwMgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX1JFRkVSRU5DRUQ9SVdBQjAyNjhFIFx1NzEyMVx1NmNkNVx1NTNjM1x1NzE2NyAlMSBcdTY3MGRcdTUyZDlcdTMwMDIKLU1TR19FUlJPUl9SRUZFUkVOQ0VfTk9UX1JFTU9WRUQ9SVdBQjAyNjlFIFx1NzEyMVx1NmNkNVx1NzlmYlx1OTY2NFx1NjcwZFx1NTJkOVx1NTNjM1x1NzE2NyAlMVx1MzAwMgotTVNHX0lORk9fU0VSVklDRV9SRUZFUkVOQ0VEPUlXQUIwMjcwSSBcdTVkZjJcdTk4MDZcdTUyMjlcdTUzYzNcdTcxNjcgJTEgXHU2NzBkXHU1MmQ5XHUzMDAyCi1NU0dfSU5GT19TRVJWSUNFX1JFRkVSRU5DRV9SRU1PVkVEPUlXQUIwMjcxSSBcdTVkZjJcdTk4MDZcdTUyMjlcdTc5ZmJcdTk2NjRcdTY3MGRcdTUyZDlcdTUzYzNcdTcxNjcgJTFcdTMwMDIKLQotIyBNYW5hZ2VQdWJsaXNoZXJBc3NlcnRpb25zCi1BTFRfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPVx1N2JhMVx1NzQwNlx1NzY3Y1x1NGY0OFx1ODAwNVx1NzhiYVx1OGE4ZAotRk9STV9MQUJFTF9NQU5BR0VfUFVCTElTSEVSX0FTU0VSVElPTlNfREVTQz1cdThhY2JcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1NjViMFx1NTg5ZVx1NzhiYVx1OGE4ZDwvc3Ryb25nPlx1NGY4Nlx1NWMwN1x1NWRmMlx1NjNhMlx1N2QyMlx1NzY4NFx1NjIxNlx1NWRmMlx1NzY3Y1x1NGY0OFx1NzY4NFx1NTU0Nlx1Njk2ZFx1NjViMFx1NTg5ZVx1ODFmM1x1NzY3Y1x1NGY0OFx1ODAwNVx1NzhiYVx1OGE4ZFx1NmUwNVx1NTVhZVx1NGUyZFx1MzAwMiBcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1NzlmYlx1OTY2NFx1NzhiYVx1OGE4ZDwvc3Ryb25nPlx1NGY4Nlx1NzlmYlx1OTY2NFx1NjI0MFx1OTA3OFx1NzY4NFx1NzhiYVx1OGE4ZFx1MzAwMlx1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYjxzdHJvbmc+XHU1YjhjXHU2MjEwXHU3OGJhXHU4YThkPC9zdHJvbmc+XHU0Zjg2XHU1YjhjXHU2MjEwXHU2MjQwXHU5MDc4XHU3Njg0XHU3OGJhXHU4YThkXHUzMDAyXHU4YWNiXHU2MzA5XHU0ZTAwXHU0ZTBiPHN0cm9uZz5cdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTc4YmFcdThhOGQ8L3N0cm9uZz5cdTRmODZcdTkxY2RcdTY1YjBcdTY1NzRcdTc0MDZcdTc4YmFcdThhOGRcdTZlMDVcdTU1YWVcdTMwMDIKLUZPUk1fTEFCRUxfSU5DT01QTEVURV9BU1NFUlRJT05TX1ZJU0lCSUxJVFlfREVTQz1cdThhY2JcdTZjZThcdTYxMGZcdWZmMGNcdTUzZWFcdTY3MDlcdTU1NDZcdTY5NmRcdTc2ODRcdTY0YzFcdTY3MDlcdTgwMDVcdTgwZmRcdTU5MjBcdTg5OGJcdTUyMzBcdTY3MmFcdTViOGNcdTYyMTBcdTc2ODRcdTc2N2NcdTRmNDhcdTgwMDVcdTc4YmFcdThhOGRcdTMwMDIKLUZPUk1fTEFCRUxfQlVTSU5FU1NFUz1cdTU1NDZcdTY5NmQKLUZPUk1fQlVUVE9OX1NIT1dfQUxMX1BVQkxJU0hFUl9BU1NFUlRJT05TPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNlx1NzhiYVx1OGE4ZAotRk9STV9CVVRUT05fQ09NUExFVEVfUFVCTElTSEVSX0FTU0VSVElPTlM9XHU1YjhjXHU2MjEwXHU3OGJhXHU4YThkCi1GT1JNX0JVVFRPTl9BRERfUFVCTElTSEVSX0FTU0VSVElPTlM9XHU2NWIwXHU1ODllXHU3OGJhXHU4YThkCi1GT1JNX0JVVFRPTl9SRU1PVkVfUFVCTElTSEVSX0FTU0VSVElPTlM9XHU3OWZiXHU5NjY0XHU3OGJhXHU4YThkCi1NU0dfSU5GT19QVUJMSVNIRVJfQVNTRVJUSU9OU19SRUZSRVNIRUQ9SVdBQjAzMjVJIFx1NWRmMlx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNlx1NzY3Y1x1NGY0OFx1ODAwNVx1NzhiYVx1OGE4ZFx1MzAwMgotTVNHX0VSUk9SX05PX0lOQ09NUExFVEVfQVNTRVJUSU9OX1NFTEVDVEVEPUlXQUIwMzI2RSBcdThhY2JcdTkwNzhcdTUzZDZcdTgxZjNcdTVjMTFcdTRlMDBcdTUwMGJcdTY3MmFcdTViOGNcdTYyMTBcdTc2ODRcdTc2N2NcdTRmNDhcdTgwMDVcdTc4YmFcdThhOGRcdTMwMDIKLU1TR19FUlJPUl9OT1RfT1dORURfQlVTSU5FU1M9SVdBQjAzMjdFIFx1NzEyMVx1NmNkNVx1NTcyOFx1NTNlNlx1NGUwMFx1NjViOVx1NjI0MFx1NjRjMVx1NjcwOVx1NzY4NFx1NTU0Nlx1Njk2ZFx1NGUwYVx1NTdmN1x1ODg0Y1x1OTAxOVx1OTgwNVx1NGY1Y1x1Njk2ZFx1MzAwMgotCi0jIEdldEJ1c2luZXNzZXMKLUFMVF9HRVRfQlVTSU5FU1M9XHU1M2Q2XHU1Zjk3XHU1NTQ2XHU2OTZkCi1BTFRfR0VUX0JVU0lORVNTRVM9XHU1M2Q2XHU1Zjk3XHU1NTQ2XHU2OTZkCi1OT0RFX05BTUVfU0VSVklDRV9CVVNJTkVTUz0lMSBcdTY3MGRcdTUyZDlcdTc2ODRcdTU1NDZcdTY5NmQKLU5PREVfTkFNRV9TSV9CVVNJTkVTU0VTPVx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2MiAlMSBcdTc2ODRcdTU1NDZcdTY5NmQKLU1TR19RVUVTVElPTl9SRU1PVkVfU0VSVklDRV9OT0RFPVx1NTcyOFx1NzY3Ylx1OTMwNFx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1NjcwZFx1NTJkOVx1MzAwMlx1NjBhOFx1ODk4MVx1NzlmYlx1OTY2NFx1OTAxOVx1NTAwYlx1N2JjMFx1OWVkZVx1NTVjZVx1ZmYxZgotCi0jIEdldFNlcnZpY2VJbnRlcmZhY2VzCi1BTFRfR0VUX1NFUlZJQ0VfSU5URVJGQUNFUz1cdTUzZDZcdTVmOTdcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjIKLU5PREVfTkFNRV9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUz0lMSBcdTY3MGRcdTUyZDlcdTc2ODRcdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjIKLU1TR19RVUVTVElPTl9HRVRfU0lfUkVNT1ZFX1NFUlZJQ0VfTk9ERT1cdTU3MjhcdTc2N2JcdTkzMDRcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzBcdTY3MGRcdTUyZDlcdTMwMDJcdTYwYThcdTg5ODFcdTc5ZmJcdTk2NjRcdTkwMTlcdTUwMGJcdTdiYzBcdTllZGVcdTU1Y2VcdWZmMWYKLQotIyBHZXRTZXJ2aWNlcwotQUxUX0dFVF9TRVJWSUNFUz1cdTUzZDZcdTVmOTdcdTY3MGRcdTUyZDkKLU5PREVfTkFNRV9TSV9TRVJWSUNFUz1cdTY3MGRcdTUyZDlcdTRlY2JcdTk3NjIgJTEgXHU3Njg0XHU2NzBkXHU1MmQ5Ci1OT0RFX05BTUVfQlVTSU5FU1NfU0VSVklDRVM9JTEgXHU1NTQ2XHU2OTZkXHU3Njg0XHU2NzBkXHU1MmQ5Ci1NU0dfUVVFU1RJT05fUkVNT1ZFX1NJX05PREU9XHU1NzI4XHU3NjdiXHU5MzA0XHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU2NzBkXHU1MmQ5XHU0ZWNiXHU5NzYyXHUzMDAyXHU2MGE4XHU4OTgxXHU3OWZiXHU5NjY0XHU5MDE5XHU1MDBiXHU3YmMwXHU5ZWRlXHU1NWNlXHVmZjFmCi1NU0dfUVVFU1RJT05fUkVNT1ZFX0JVU0lORVNTX05PREU9XHU1NzI4XHU3NjdiXHU5MzA0XHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU1NTQ2XHU2OTZkXHUzMDAyXHU2MGE4XHU4OTgxXHU3OWZiXHU5NjY0XHU5MDE5XHU1MDBiXHU3YmMwXHU5ZWRlXHU1NWNlXHVmZjFmCi0KLSMgUmVmcmVzaFVERElOb2Rlc0FjdGlvbgotTVNHX0VSUk9SX05PREVfREFUQV9WQUxJREFUSU9OX0ZBSUxFRD1JV0FCMDI3MkUgXHU1NzI4XHU3NjdiXHU5MzA0XHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwICUxXHUzMDAyCi0KLSMgU3VtbWFyaWVzCi1BTFRfU1VNTUFSWV9RVUVSSUVTPVx1NjdlNVx1OGE2Mlx1NjQ1OFx1ODk4MQotQUxUX1NVTU1BUllfQlVTSU5FU1NFUz1cdTU1NDZcdTY5NmRcdTY0NThcdTg5ODEKLUFMVF9TVU1NQVJZX1NFUlZJQ0VTPVx1NjcwZFx1NTJkOVx1NjQ1OFx1ODk4MQotQUxUX1NVTU1BUllfU0VSVklDRV9JTlRFUkZBQ0VTPVx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2Mlx1NjQ1OFx1ODk4MQotRk9STV9MQUJFTF9RVUVSSUVTPVx1NjdlNVx1OGE2MgotCi0jIFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbgotTVNHX1FVRVNUSU9OX0lURU1fVkFMSURBVElPTl9GQUlMRUQ9XHU1NzI4XHU3NjdiXHU5MzA0XHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwICUxXHUzMDAyXHU2MGE4XHU4OTgxXHU3OWZiXHU5NjY0XHU1YjgzXHU1NWNlXHVmZjFmCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPVx1NWMwZVx1ODliZFx1NTY2OFx1NTEzMlx1NWI1OFx1NTY2OAotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9XHU1YzBlXHU4OWJkXHU1NjY4XHU1ZGU1XHU1MTc3XHU1MjE3Ci1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1cdTVjMGVcdTg5YmRcdTU2NjhcdTUxNjdcdTViYjkKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPVx1NTJkNVx1NGY1Y1x1NTEzMlx1NWI1OFx1NTY2OAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9XHU1MTY3XHU1YmI5XHU1MTMyXHU1YjU4XHU1NjY4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9XHU1MTY3XHU1YmI5XHU1ZGU1XHU1MTc3XHU1MjE3Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9XHU1MTY3XHU1YmI5XHU1MTY3XHU2NTg3Ci1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPVx1NzJjMFx1NjE0Ylx1NTEzMlx1NWI1OFx1NTY2OAotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9XHU3MmMwXHU2MTRiXHU1ZGU1XHU1MTc3XHU1MjE3Ci1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1cdTcyYzBcdTYxNGJcdTUxNjdcdTViYjkKLUZSQU1FX1RJVExFX1VERElfUEVSU1BFQ1RJVkVfQ09OVEVOVD1VRERJIFx1OTgwMVx1OTc2Mlx1NTE2N1x1NWJiOQotRlJBTUVfVElUTEVfQ0FURUdPUklFU19XT1JLQVJFQT1cdTdhMmVcdTk4NWVcdTVkZTVcdTRmNWNcdTUzNDAKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfVE9PTEJBUj1cdTdhMmVcdTk4NWVcdTVkZTVcdTUxNzdcdTUyMTcKLUZSQU1FX1RJVExFX0NBVEVHT1JJRVNfQ09OVEVOVD1cdTdhMmVcdTk4NWVcdTUxNjdcdTViYjkKLUZSQU1FX1RJVExFX1dTRExfVE9PTEJBUj1XU0RMIFx1NzAwZlx1ODliZFx1NTY2OFx1NWRlNVx1NTE3N1x1NTIxNwotRlJBTUVfVElUTEVfV1NETF9DT05URU5UPVdTREwgXHU3MDBmXHU4OWJkXHU1NjY4XHU1MTY3XHU1YmI5Ci0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfQlVTSU5FU1NfREVUQUlMUz1cdTU1NDZcdTY5NmRcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFPVx1NTU0Nlx1Njk2ZFx1NzY3Y1x1NGY0OFx1NjcwZFx1NTJkOVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9HRVRfRk9STT1cdTVmOWVcdTYzYTJcdTdkMjJcdTU0OGNcdTc2N2NcdTRmNDhcdTc2ODRcdTcyNjlcdTRlZjZcdTg4NjhcdTU1YWVcdTRlMmRcdTkwNzhcdTUzZDYKLUZPUk1fVElUTEVfSVRFTVNfU1VNTUFSWT1cdTk4MDVcdTc2ZWVcdTg4NjhcdTU1YWVcdTY0NThcdTg5ODEKLUZPUk1fVElUTEVfTUFOQUdFX1BVQkxJU0hFUl9BU1NFUlRJT05TPVx1N2JhMVx1NzQwNlx1NzY3Y1x1NGY0OFx1ODAwNVx1NzhiYVx1OGE4ZFx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9NQU5BR0VfUkVGRVJFTkNFRF9TRVJWSUNFUz1cdTdiYTFcdTc0MDZcdTUzYzNcdTcxNjdcdTc2ODRcdTY3MGRcdTUyZDlcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfT1BFTl9SRUdJU1RSWT1cdTk1OGJcdTU1NWZcdTc2N2JcdTkzMDRcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfUkVHSVNUUllfREVUQUlMUz1cdTc2N2JcdTkzMDRcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfUkVHSVNUUllfUFVCTElTSD1cdTc2N2JcdTkzMDRcdTc2N2NcdTRmNDhcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfUkVHSVNUUllfRklORD1cdTc2N2JcdTkzMDRcdTVjMGJcdTYyN2VcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfUkVTVUxUUz1cdTdkNTBcdTY3OWNcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfU0VSVklDRV9ERVRBSUxTPVx1NjcwZFx1NTJkOVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9TRVJWSUNFX0lOVEVSRkFDRV9ERVRBSUxTPVx1NjcwZFx1NTJkOVx1NGVjYlx1OTc2Mlx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9VTlBVQkxJU0g9XHU1M2Q2XHU2ZDg4XHU3NjdjXHU0ZjQ4XHU4ODY4XHU1NWFlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1M2ZmZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVdTREwKLQotIyBOb2RlcwotTk9ERV9OQU1FX1dTRExfTUFJTj1XU0RMIE1haW4KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9TmF2aWdhdG9yIENvbnRhaW5lcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9TmF2aWdhdG9yIFRvb2xiYXIKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPU5hdmlnYXRvciBDb250ZW50Ci1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1BY3Rpb25zIENvbnRhaW5lcgotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9UHJvcGVydGllcyBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1Qcm9wZXJ0aWVzIFRvb2xiYXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1Qcm9wZXJ0aWVzIENvbnRlbnQKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9U3RhdHVzIENvbnRhaW5lcgotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9U3RhdHVzIFRvb2xiYXIKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVN0YXR1cyBDb250ZW50Ci1GUkFNRV9USVRMRV9XU0RMX1BFUlNQRUNUSVZFX0NPTlRFTlQ9V1NETCBQYWdlIENvbnRlbnQKLUZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9UT09MQkFSPVhTRCBJbmZvcm1hdGlvbiBEaWFsb2cgVG9vbGJhcgotRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX0NPTlRFTlQ9WFNEIEluZm9ybWF0aW9uIERpYWxvZyBDb250ZW50Ci0KLSMgT3BlbldTRExBY3Rpb24KLUFMVF9PUEVOX1dTREw9T3BlbiBXU0RMCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTD1JV0FCMDM3OEUgRW50ZXIgYSB2YWxpZCBXU0RMIFVSTC4KLU1TR19FUlJPUl9PUEVOX1dTREw9SVdBQjAzNzlFIFVuYWJsZSB0byBvcGVuICUxLgotTVNHX0VSUk9SX1hTRF9WQUxJREFUSU9OPUlXQUIwMzgwRSBFcnJvcnMgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZSB2YWxpZGF0aW5nIFhNTCBzY2hlbWFzLgotTVNHX0lORk9fT1BFTl9XU0RMX1NVQ0NFU1NGVUw9SVdBQjAzODFJICUxIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkLgotCi0jIFdTREwgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9ERVRBSUxTPVdTREwgRGV0YWlscwotRk9STV9MQUJFTF9XU0RMX0RFVEFJTFNfREVTQz1TaG93biBiZWxvdyBhcmUgdGhlIGRldGFpbHMgZm9yIHRoaXMgV1NETCBkb2N1bWVudC4gQ2xpY2sgb24gYSBzZXJ2aWNlIG9yIGJpbmRpbmcgdG8gc2VlIGl0cyBkZXRhaWxzLgotCi0jIFdTREwgU2VydmljZSBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFNlcnZpY2UgRGV0YWlscwotRk9STV9MQUJFTF9TRVJWSUNFX0RFVEFJTFNfREVTQz1TaG93biBiZWxvdyBhcmUgdGhlIGRldGFpbHMgZm9yIHRoaXMgJmx0O3NlcnZpY2UmZ3Q7IGVsZW1lbnQuIENsaWNrIG9uIGEgYmluZGluZyB0byBzZWUgaXRzIG9wZXJhdGlvbnMuCi0KLSMgV1NETCBCaW5kaW5nIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfQklORElOR19ERVRBSUxTPVdTREwgQmluZGluZyBEZXRhaWxzCi1GT1JNX0xBQkVMX0JJTkRJTkdfREVUQUlMU19ERVNDPVNob3duIGJlbG93IGFyZSB0aGUgZGV0YWlscyBmb3IgdGhpcyA8c3Ryb25nPiUxPC9zdHJvbmc+ICAmbHQ7YmluZGluZyZndDsgZWxlbWVudC4gQ2xpY2sgb24gYW4gb3BlcmF0aW9uIHRvIGZpbGwgaW4gaXRzIHBhcmFtZXRlcnMgYW5kIGludm9rZSBpdCBvciBzcGVjaWZ5IGFkZGl0aW9uYWwgZW5kcG9pbnRzLgotCi0jIEludm9rZVdTRExPcGVyYXRpb25BY3Rpb24KLUFMVF9JTlZPS0VfV1NETF9PUEVSQVRJT049SW52b2tlIGEgV1NETCBPcGVyYXRpb24KLU1TR19FUlJPUl9VTkFCTEVfVE9fQ09OTkVDVD1JV0FCMDM4MkUgVW5hYmxlIHRvIGNvbm5lY3QgdG8gJTEKLU1TR19FUlJPUl9WQUxJREFUSU5HX1BBUkFNRVRFUj1JV0FCMDM4M0UgRXJyb3IgdmFsaWRhdGluZyAlMQotCi0jIFdTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0RMX1RPX0ZBVk9SSVRFUz1BZGQgV1NETCBUbyBGYXZvcml0ZXMKLU1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFM9SVdBQjAzODRFICUxIGFscmVhZHkgZXhpc3RzIGluIGZhdm9yaXRlcy4KLU1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTPUlXQUIwMzg1RSBVbmFibGUgdG8gYWRkICUxIHRvIGZhdm9yaXRlcy4KLU1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTD1JV0FCMDM4NkkgJTEgaXMgYWRkZWQgdG8gZmF2b3JpdGVzLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9RmF2b3JpdGUgYWxyZWFkeSBleGlzdHMuICBEbyB5b3Ugd2lzaCB0byBvdmVyd3JpdGU/Ci0KLSMgUmVmcmVzaFdTRExBY3Rpb24KLU1TR19JTkZPX1JFRlJFU0hfV1NETF9TVUNDRVNTRlVMPUlXQUIwMzg3SSAlMSBpcyByZWZyZXNoZWQuCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1dTRExfTk9ERT0lMSBpcyBubyBsb25nZXIgcmVzb2x2YWJsZS4gIERvIHlvdSB3aXNoIHRvIGNsZWFyIGl0PwotCi0jIFVwZGF0ZVdTRExCaW5kaW5nQWN0aW9uCi1NU0dfSU5GT19VUERBVEVfV1NETF9CSU5ESU5HX1NVQ0NFU1NGVUw9SVdBQjAzODhJIEVuZHBvaW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLgotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NETD1PcGVuIFdTREwgRm9ybQotRk9STV9USVRMRV9XU0RMX0RFVEFJTFM9V1NETCBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfV1NETF9TRVJWSUNFX0RFVEFJTFM9V1NETCBTZXJ2aWNlIERldGFpbHMgRm9ybQotRk9STV9USVRMRV9XU0RMX0JJTkRJTkdfREVUQUlMUz1XU0RMIEJpbmRpbmcgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX0lOVk9LRV9XU0RMX09QRVJBVElPTj1XU0RMIE9wZXJhdGlvbiBGb3JtCi0KLSMgRm9ybSBMYWJlbHMKLUZPUk1fTEFCRUxfT1BFTl9XU0RMX0RFU0M9RW50ZXIgdGhlIFVSTCBvZiBhIFdTREwgZG9jdW1lbnQgYW5kIGNsaWNrIDxzdHJvbmc+R288L3N0cm9uZz4gdG8gZXhwbG9yZS4KLUZPUk1fTEFCRUxfU0VSVklDRVM9U2VydmljZXMKLUZPUk1fTEFCRUxfQklORElOR1M9QmluZGluZ3MKLUZPUk1fTEFCRUxfT1BFUkFUSU9OUz1PcGVyYXRpb25zCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRT1UeXBlCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9VTlNVUFBPUlRFRD1VbnN1cHBvcnRlZAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfU09BUD1TT0FQCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX0dFVD1IVFRQIEdFVAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9QT1NUPUhUVFAgUE9TVAotRk9STV9MQUJFTF9OQU1FPU5hbWUKLUZPUk1fTEFCRUxfRE9DVU1FTlRBVElPTj1Eb2N1bWVudGF0aW9uCi1GT1JNX0xBQkVMX0VORFBPSU5UPUVuZHBvaW50Ci1GT1JNX0xBQkVMX0lOVk9LRV9XU0RMX09QRVJBVElPTl9ERVNDPUVudGVyIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgV1NETCBvcGVyYXRpb24gYW5kIGNsaWNrIDxzdHJvbmc+R288L1N0cm9uZz4gdG8gaW52b2tlLgotRk9STV9MSU5LX0FERD1BZGQKLUZPUk1fTElOS19SRU1PVkU9UmVtb3ZlCi1GT1JNX0xBQkVMX1ZBTFVFUz1WYWx1ZXMKLUZPUk1fTEFCRUxfRU5BQkxFX0RJU0FCTEVfR1JPVVA9RW5hYmxlL0Rpc2FibGUgZ3JvdXAKLUZPUk1fTEFCRUxfVU5JT05fVFlQRT1VbmlvbiB0eXBlcwotRk9STV9MQUJFTF9MQU5HVUFHRT1MYW5ndWFnZQotRk9STV9MQUJFTF9YU0RfQVBQTElDQVRJT05fSU5GT1JNQVRJT049QXBwbGljYXRpb24gSW5mb3JtYXRpb24KLUZPUk1fTEFCRUxfWFNEX0RPQ1VNRU5UQVRJT049RG9jdW1lbnRhdGlvbgotRk9STV9MQUJFTF9TT0FQX1JFUVVFU1RfRU5WRUxPUEU9U09BUCBSZXF1ZXN0IEVudmVsb3BlOgotRk9STV9MQUJFTF9TT0FQX1JFU1BPTlNFX0VOVkVMT1BFPVNPQVAgUmVzcG9uc2UgRW52ZWxvcGU6Ci1GT1JNX0xBQkVMX0dST1VQX0FMTF9PUkRFUklOR19NT1ZFX1VQPU1vdmUgZWxlbWVudCB1cAotRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9ET1dOPU1vdmUgZWxlbWVudCBkb3duCi1GT1JNX0xBQkVMX0JBU0VfVFlQRT1CYXNlIHR5cGUKLUZPUk1fTEFCRUxfVU5CT1VOREVEPVVuYm91bmRlZAotRk9STV9MQUJFTF9MRU5HVEg9TGVuZ3RoCi1GT1JNX0xBQkVMX0xFTkdUSF9WQUxVRT1bJTEuLiUyXQotRk9STV9MQUJFTF9QQVRURVJOPVBhdHRlcm4KLUZPUk1fTEFCRUxfV0hJVEVTUEFDRT1XaGl0ZXNwYWNlCi1GT1JNX0xBQkVMX1JBTkdFX09GX1ZBTFVFUz1SYW5nZSBvZiB2YWx1ZXMKLUZPUk1fTEFCRUxfTUlOX0VYQ0xVU0lWRT0oJTEuLgotRk9STV9MQUJFTF9NSU5fSU5DTFVTSVZFPVslMS4uCi1GT1JNX0xBQkVMX01BWF9FWENMVVNJVkU9JTEpCi1GT1JNX0xBQkVMX01BWF9JTkNMVVNJVkU9JTFdCi1GT1JNX0xBQkVMX1RPVEFMX0RJR0lUUz1Ub3RhbCBkaWdpdHMKLUZPUk1fTEFCRUxfRlJBQ1RJT05fRElHSVRTPUZyYWN0aW9uIGRpZ2l0cwotRk9STV9MQUJFTF9PQ0NVUkFOQ0U9T2NjdXJhbmNlIG9mCi1GT1JNX0xBQkVMX1VOSU9OX01FTUJFUlM9VW5pb24gTWVtYmVycwotRk9STV9MQUJFTF9MSVNUX0lURU1TPUxpc3QgaXRlbXMKLUZPUk1fTEFCRUxfRUxFTUVOVFM9RWxlbWVudHMKLUZPUk1fTEFCRUxfU09BUF9FTkNfQVJSQVlTPVNPQVAgQXJyYXlzCi1GT1JNX0xBQkVMX0NPTlRFTlQ9Q29udGVudAotRk9STV9MQUJFTF9BVE9NSUNfTkFNRV9UWVBFPSUxICglMik6Ci1GT1JNX0xBQkVMX05VTEw9bnVsbAotRk9STV9MQUJFTF9HUk9VUF9OVU1CRVI9R3JvdXAgJTEKLUZPUk1fTEFCRUxfQ0hPSUNFUz1DaG9pY2VzCi1GT1JNX0xBQkVMX05PVEhJTkdfVE9fRElTUExBWV9JTl9GT1JNX1ZJRVc9VGhlcmUgaXMgbm90aGluZyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGZvcm0gdmlldy4gIFBsZWFzZSBzd2l0Y2ggdG8gdGhlIHNvdXJjZSB2aWV3IGZvciB0aGUgU09BUCByZXF1ZXN0IGFuZCByZXNwb25zZS4KLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9GQUlMRURfVkFMSURBVElPTl9JTl9GT1JNX1ZJRVc9VGhlIFNPQVAgcmVzcG9uc2UgZmFpbGVkIHNjaGVtYSB2YWxpZGF0aW9uLiAgUGxlYXNlIHN3aXRjaCB0byB0aGUgc291cmNlIHZpZXcgZm9yIHRoZSBTT0FQIHJlc3BvbnNlIGluIFhNTCBmb3JtYXQuCi1GT1JNX0xBQkVMX0VORF9QT0lOVFM9RW5kcG9pbnRzCi0KLSMgU291cmNlL0Zvcm0gdmlld3MKLUZPUk1fTElOS19GT1JNPUZvcm0KLUFMVF9TV0lUQ0hfVE9fRk9STV9WSUVXPVN3aXRjaCB0byBmb3JtIHZpZXcKLUZPUk1fTElOS19TT1VSQ0U9U291cmNlCi1BTFRfU1dJVENIX1RPX1NPVVJDRV9WSUVXPVN3aXRjaCB0byBzb3VyY2UgdmlldwotRk9STV9MQUJFTF9GUkFHTUVOVF9TT0FQX1ZJRVdfQ09OVEVOVD1Tb2FwIEJvZHk6Ci1CVVRUT05fTEFCRUxfTE9BRD1Mb2FkCi1CVVRUT05fTEFCRUxfU0FWRV9BUz1TYXZlIEFzLi4uCi1NU0dfUVVFU1RJT05fU1lOQ19WSUVXUz1Gb3JtYXQgb2YgdGhlIHNvdXJjZSBjb250ZW50IG1heSBiZSBhbHRlcmVkIGFzIGEgcmVzdWx0IG9mIHN3aXRjaGluZyB0byB0aGUgZm9ybSB2aWV3LiAgRG8geW91IHdpc2ggdG8gcHJvY2Vzcz8KLU1TR19RVUVTVElPTl9TWU5DX1ZJRVdTX0RFU1BJVEVfSU5WQUxJRF9TT1VSQ0VfQ09OVEVOVD1Db250ZW50IG9mIHRoZSBzb3VyY2UgdmlldyBmYWlsZWQgc2NoZW1hIHZhbGlkYXRpb24uICBTeW5jaHJvbml6ZSBhbnl3YXlzPyAgKENvbnRlbnQgb2YgdGhlIHNvdXJjZSB2aWV3IG1heSBiZSBtb2RpZmllZCkKLQotIyBGb3JtIGNvbnRyb2wgdGl0bGVzCi1GT1JNX0NPTlRST0xfVElUTEVfRU5BQkxFX0RJU0FCTEVfR1JPVVA9RW5hYmxlL0Rpc2FibGUgZ3JvdXAKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfRUxFTUVOVF9JTl9HUk9VUD1TZWxlY3QgZWxlbWVudCBpbiBncm91cAotRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9VTklPTl9UWVBFPVNlbGVjdCB1bmlvbiB0eXBlCi1GT1JNX0NPTlRST0xfVElUTEVfU09BUF9GSUxFPVNPQVAgZGF0YSBmaWxlCi0KLSMgWFNEIEluZm9ybWF0aW9uIERpYWxvZwotVElUTEVfWFNEX0lORk9STUFUSU9OX0RJQUxPRz1YU0QgSW5mb3JtYXRpb24gRGlhbG9nCi0KLSMgRXJyb3IgbWVzc2FnZXMKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzg5RSBTZWxlY3QgYXQgbGVhc3Qgb25lIGl0ZW0uCi1NU0dfRVJST1JfTUFYX09DQ1VSU19WSU9MQVRJT049SVdBQjAzOTBFIE1heGltdW0gb2NjdXJhbmNlIGlzIHJlYWNoZWQuCi1NU0dfRVJST1JfTUlOX09DQ1VSU19WSU9MQVRJT049SVdBQjAzOTFFIE1pbmltdW0gb2NjdXJhbmNlIGlzIHJlYWNoZWQuCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfRklSU1RfRUxFTUVOVF9VUD1JV0FCMDM5MkUgU2VsZWN0ZWQgZWxlbWVudCBpcyBhbHJlYWR5IHRoZSBmaXJzdCBpbiB0aGUgZ3JvdXAuCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfTEFTVF9FTEVNRU5UX0RPV049SVdBQjAzOTNFIFNlbGVjdGVkIGVsZW1lbnQgaXMgYWxyZWFkeSB0aGUgbGFzdCBpbiB0aGUgZ3JvdXAuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsX2RlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsX2RlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OTRmZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF9kZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVdTREwKLQotIyBOb2RlcwotTk9ERV9OQU1FX1dTRExfTUFJTj1XU0RMIC0gSGF1cHQKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9TmF2aWdhdG9yIC0gQ29udGFpbmVyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1OYXZpZ2F0b3IgLSBTeW1ib2xsZWlzdGUKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPU5hdmlnYXRvciAtIEluaGFsdAotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9QWt0aW9uZW4gLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPUVpZ2Vuc2NoYWZ0ZW4gLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1FaWdlbnNjaGFmdGVuIC0gU3ltYm9sbGVpc3RlCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9RWlnZW5zY2hhZnRlbiAtIEluaGFsdAotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1TdGF0dXMgLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVN0YXR1cyAtIFN5bWJvbGxlaXN0ZQotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9U3RhdHVzIC0gSW5oYWx0Ci1GUkFNRV9USVRMRV9XU0RMX1BFUlNQRUNUSVZFX0NPTlRFTlQ9V1NETC1TZWl0ZSAtIEluaGFsdAotRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX1RPT0xCQVI9U3ltYm9sbGVpc3RlIGRlcyBYU0QtSW5mb3JtYXRpb25zZGlhbG9ncwotRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX0NPTlRFTlQ9SW5oYWx0IGRlcyBYU0QtSW5mb3JtYXRpb25zZGlhbG9ncwotCi0jIE9wZW5XU0RMQWN0aW9uCi1BTFRfT1BFTl9XU0RMPVdTREwgXHUwMGY2ZmZuZW4KLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMPUlXQUIwMzc4RSBHZWJlbiBTaWUgZWluZSBnXHUwMGZjbHRpZ2UgV1NETC1VUkwgZWluLgotTVNHX0VSUk9SX09QRU5fV1NETD1JV0FCMDM3OUUgJTEga2FubiBuaWNodCBnZVx1MDBmNmZmbmV0IHdlcmRlbi4KLU1TR19FUlJPUl9YU0RfVkFMSURBVElPTj1JV0FCMDM4MEUgQmVpbSBBdXN3ZXJ0ZW4gdm9uIFhNTC1TY2hlbWFzIHd1cmRlbiBGZWhsZXIgZmVzdGdlc3RlbGx0LgotTVNHX0lORk9fT1BFTl9XU0RMX1NVQ0NFU1NGVUw9SVdBQjAzODFJICUxIHd1cmRlIGVyZm9sZ3JlaWNoIGdlXHUwMGY2ZmZuZXQuCi0KLSMgV1NETCBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX0RFVEFJTFM9V1NETCAtIERldGFpbHMKLUZPUk1fTEFCRUxfV1NETF9ERVRBSUxTX0RFU0M9TmFjaHN0ZWhlbmQgc2luZCBkaWUgRGV0YWlscyBmXHUwMGZjciBkaWVzZXMgV1NETC1Eb2t1bWVudCBhdWZnZWZcdTAwZmNocnQuIEtsaWNrZW4gU2llIGVpbmVuIFNlcnZpY2Ugb2RlciBlaW4gQmluZGluZyBhbiwgdW0gZGVzc2VuIERldGFpbHMgYW56dXplaWdlbi4KLQotIyBXU0RMIFNlcnZpY2UgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9TRVJWSUNFX0RFVEFJTFM9V1NETC1TZXJ2aWNlIC0gRGV0YWlscwotRk9STV9MQUJFTF9TRVJWSUNFX0RFVEFJTFNfREVTQz1OYWNoc3RlaGVuZCBzaW5kIGRpZSBEZXRhaWxzIGZcdTAwZmNyIGRpZXNlcyAmbHQ7c2VydmljZSZndDstRWxlbWVudCBhdWZnZWZcdTAwZmNocnQuIEtsaWNrZW4gU2llIGVpbiBCaW5kaW5nIGFuLCB1bSBkZXNzZW4gT3BlcmF0aW9uZW4gYW56dXplaWdlbi4KLQotIyBXU0RMIEJpbmRpbmcgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9CSU5ESU5HX0RFVEFJTFM9V1NETC1CaW5kaW5nIC0gRGV0YWlscwotRk9STV9MQUJFTF9CSU5ESU5HX0RFVEFJTFNfREVTQz1OYWNoc3RlaGVuZCBzaW5kIGRpZSBEZXRhaWxzIGZcdTAwZmNyIGRpZXNlcyA8c3Ryb25nPiUxPC9zdHJvbmc+ICAmbHQ7YmluZGluZyZndDstRWxlbWVudCBhdWZnZWZcdTAwZmNocnQuIEtsaWNrZW4gU2llIGVpbmUgT3BlcmF0aW9uIGFuLCB1bSBkaWUgenVnZWhcdTAwZjZyaWdlbiBQYXJhbWV0ZXIgYXVzenVmXHUwMGZjbGxlbiB1bmQgZGllIE9wZXJhdGlvbiBhdWZ6dXJ1ZmVuIG9kZXIgenVzXHUwMGU0dHpsaWNoZSBFbmRwdW5rdGUgYW56dWdlYmVuLgotCi0jIEludm9rZVdTRExPcGVyYXRpb25BY3Rpb24KLUFMVF9JTlZPS0VfV1NETF9PUEVSQVRJT049RWluZSBXU0RMLU9wZXJhdGlvbiBhdWZydWZlbgotTVNHX0VSUk9SX1VOQUJMRV9UT19DT05ORUNUPUlXQUIwMzgyRSBFcyBrYW5uIGtlaW5lIFZlcmJpbmR1bmcgenUgJTEgaGVyZ2VzdGVsbHQgd2VyZGVuLgotTVNHX0VSUk9SX1ZBTElEQVRJTkdfUEFSQU1FVEVSPUlXQUIwMzgzRSBGZWhsZXIgYmVpbSBBdXN3ZXJ0ZW4gdm9uICUxCi0KLSMgV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fRkFWT1JJVEVTPVdTREwgenUgRmF2b3JpdGVuIGhpbnp1Zlx1MDBmY2dlbgotTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUz1JV0FCMDM4NEUgJTEgaXN0IGJlcmVpdHMgaW4gZGVuIEZhdm9yaXRlbiB2b3JoYW5kZW4uCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM4NUUgJTEga29ubnRlIG5pY2h0IHp1IGRlbiBGYXZvcml0ZW4gaGluenVnZWZcdTAwZmNndCB3ZXJkZW4uCi1NU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUw9SVdBQjAzODZJICUxIHd1cmRlIHp1IGRlbiBGYXZvcml0ZW4gaGluenVnZWZcdTAwZmNndC4KLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPUZhdm9yaXQgYmVyZWl0cyB2b3JoYW5kZW4uICBcdTAwZGNiZXJzY2hyZWliZW4/Ci0KLSMgUmVmcmVzaFdTRExBY3Rpb24KLU1TR19JTkZPX1JFRlJFU0hfV1NETF9TVUNDRVNTRlVMPUlXQUIwMzg3SSAlMSB3dXJkZSBha3R1YWxpc2llcnQuCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1dTRExfTk9ERT0lMSBrYW5uIG5pY2h0IG1laHIgYXVmZ2VsXHUwMGY2c3Qgd2VyZGVuLiAgU29sbCBkZXIgS25vdGVuIGdlbFx1MDBmNnNjaHQgd2VyZGVuPwotCi0jIFVwZGF0ZVdTRExCaW5kaW5nQWN0aW9uCi1NU0dfSU5GT19VUERBVEVfV1NETF9CSU5ESU5HX1NVQ0NFU1NGVUw9SVdBQjAzODhJIERpZSBFbmRwdW5rdGUgd3VyZGVuIGVyZm9sZ3JlaWNoIGFrdHVhbGlzaWVydC4KLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9PUEVOX1dTREw9V1NETC1Gb3JtdWxhciBcdTAwZjZmZm5lbgotRk9STV9USVRMRV9XU0RMX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgV1NETC1EZXRhaWxzCi1GT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTPUZvcm11bGFyIGZcdTAwZmNyIFdTREwtU2VydmljZWRldGFpbHMKLUZPUk1fVElUTEVfV1NETF9CSU5ESU5HX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgV1NETC1CaW5kaW5nZGV0YWlscwotRk9STV9USVRMRV9JTlZPS0VfV1NETF9PUEVSQVRJT049Rm9ybXVsYXIgZlx1MDBmY3IgV1NETC1PcGVyYXRpb24KLQotIyBGb3JtIExhYmVscwotRk9STV9MQUJFTF9PUEVOX1dTRExfREVTQz1HZWJlbiBTaWUgZGllIFVSTCBlaW5lcyBXU0RMLURva3VtZW50cyBlaW4sIHVuZCBrbGlja2VuIFNpZSBhdWYgPHN0cm9uZz5Mb3M8L3N0cm9uZz4sIHVtIGVzIHp1IGR1cmNoc3VjaGVuLgotRk9STV9MQUJFTF9TRVJWSUNFUz1TZXJ2aWNlcwotRk9STV9MQUJFTF9CSU5ESU5HUz1CaW5kaW5ncwotRk9STV9MQUJFTF9PUEVSQVRJT05TPU9wZXJhdGlvbmVuCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRT1UeXAKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX1VOU1VQUE9SVEVEPU5pY2h0IHVudGVyc3RcdTAwZmN0enQKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX1NPQVA9U09BUAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9HRVQ9SFRUUCBHRVQKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX0hUVFBfUE9TVD1IVFRQIFBPU1QKLUZPUk1fTEFCRUxfTkFNRT1OYW1lCi1GT1JNX0xBQkVMX0RPQ1VNRU5UQVRJT049RG9rdW1lbnRhdGlvbgotRk9STV9MQUJFTF9FTkRQT0lOVD1FbmRwdW5rdAotRk9STV9MQUJFTF9JTlZPS0VfV1NETF9PUEVSQVRJT05fREVTQz1HZWJlbiBTaWUgZGllIFBhcmFtZXRlciBkaWVzZXIgV1NETC1PcGVyYXRpb24gZWluLCB1bmQga2xpY2tlbiBTaWUgYXVmIDxzdHJvbmc+TG9zPC9TdHJvbmc+LCB1bSBkaWUgT3BlcmF0aW9uIGF1Znp1cnVmZW4uCi1GT1JNX0xJTktfQUREPUhpbnp1Zlx1MDBmY2dlbgotRk9STV9MSU5LX1JFTU9WRT1FbnRmZXJuZW4KLUZPUk1fTEFCRUxfVkFMVUVTPVdlcnRlCi1GT1JNX0xBQkVMX0VOQUJMRV9ESVNBQkxFX0dST1VQPUdydXBwZSBha3RpdmllcmVuL2luYWt0aXZpZXJlbgotRk9STV9MQUJFTF9VTklPTl9UWVBFPUdlc2FtdHZlcmtuXHUwMGZjcGZ1bmdzdHlwCi1GT1JNX0xBQkVMX0xBTkdVQUdFPVNwcmFjaGUKLUZPUk1fTEFCRUxfWFNEX0FQUExJQ0FUSU9OX0lORk9STUFUSU9OPUFud2VuZHVuZ3NpbmZvcm1hdGlvbmVuCi1GT1JNX0xBQkVMX1hTRF9ET0NVTUVOVEFUSU9OPURva3VtZW50YXRpb24KLUZPUk1fTEFCRUxfU09BUF9SRVFVRVNUX0VOVkVMT1BFPVNPQVAtUmFobWVuYW53ZWlzdW5nIGZcdTAwZmNyIEFuZm9yZGVydW5nCi1GT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRU5WRUxPUEU9U09BUC1SYWhtZW5hbndlaXN1bmcgZlx1MDBmY3IgQW50d29ydAotRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9VUD1FbGVtZW50IG5hY2ggb2JlbiB2ZXJzY2hpZWJlbgotRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9ET1dOPUVsZW1lbnQgbmFjaCB1bnRlbiB2ZXJzY2hpZWJlbgotRk9STV9MQUJFTF9CQVNFX1RZUEU9QmFzaXN0eXAKLUZPUk1fTEFCRUxfVU5CT1VOREVEPVVuYmVncmVuenQKLUZPUk1fTEFCRUxfTEVOR1RIPUxcdTAwZTRuZ2UKLUZPUk1fTEFCRUxfTEVOR1RIX1ZBTFVFPVslMS4uJTJdCi1GT1JNX0xBQkVMX1BBVFRFUk49TXVzdGVyCi1GT1JNX0xBQkVMX1dISVRFU1BBQ0U9TGVlcnplaWNoZW4KLUZPUk1fTEFCRUxfUkFOR0VfT0ZfVkFMVUVTPVdlcnRlYmVyZWljaAotRk9STV9MQUJFTF9NSU5fRVhDTFVTSVZFPSglMS4uCi1GT1JNX0xBQkVMX01JTl9JTkNMVVNJVkU9WyUxLi4KLUZPUk1fTEFCRUxfTUFYX0VYQ0xVU0lWRT0lMSkKLUZPUk1fTEFCRUxfTUFYX0lOQ0xVU0lWRT0lMV0KLUZPUk1fTEFCRUxfVE9UQUxfRElHSVRTPUdlc2FtdHN1bW1lbnN0ZWxsZW4KLUZPUk1fTEFCRUxfRlJBQ1RJT05fRElHSVRTPUJydWNodGVpbHN0ZWxsZW4KLUZPUk1fTEFCRUxfT0NDVVJBTkNFPVZvcmtvbW1lbiB2b24KLUZPUk1fTEFCRUxfVU5JT05fTUVNQkVSUz1Vbmlvbi1NZW1iZXJzCi1GT1JNX0xBQkVMX0xJU1RfSVRFTVM9TGlzdGVuZWludHJcdTAwZTRnZQotRk9STV9MQUJFTF9FTEVNRU5UUz1FbGVtZW50ZQotRk9STV9MQUJFTF9TT0FQX0VOQ19BUlJBWVM9U09BUC1CZXJlaWNoZQotRk9STV9MQUJFTF9DT05URU5UPUluaGFsdAotRk9STV9MQUJFTF9BVE9NSUNfTkFNRV9UWVBFPSUxICglMik6Ci1GT1JNX0xBQkVMX05VTEw9TnVsbAotRk9STV9MQUJFTF9HUk9VUF9OVU1CRVI9R3J1cHBlICUxCi1GT1JNX0xBQkVMX0NIT0lDRVM9QXVzd2FobG1cdTAwZjZnbGljaGtlaXRlbgotRk9STV9MQUJFTF9OT1RISU5HX1RPX0RJU1BMQVlfSU5fRk9STV9WSUVXPUVzIGdpYnQgbmljaHRzIHp1bSBBbnplaWdlbiBpbiBkZXIgRm9ybXVsYXJzaWNodC4gIFdlY2hzZWxuIFNpZSBiaXR0ZSBpbiBkaWUgUXVlbGxlbnNpY2h0IGZcdTAwZmNyIGRpZSBTT0FQLUFuZm9yZGVydW5nIHVuZCAtQW50d29ydC4KLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9GQUlMRURfVkFMSURBVElPTl9JTl9GT1JNX1ZJRVc9RGllIFNPQVAtQW50d29ydCBoYXQgZGllIFNjaGVtYWF1c3dlcnR1bmcgbmljaHQgYmVzdGFuZGVuLiAgV2VjaHNlbG4gU2llIGJpdHRlIHp1ciBRdWVsbGVuc2ljaHQgZlx1MDBmY3IgZGllIFNPQVAtQW50d29ydCBpbiBYTUwtRm9ybWF0LgotRk9STV9MQUJFTF9FTkRfUE9JTlRTPUVuZHB1bmt0ZQotCi0jIFNvdXJjZS9Gb3JtIHZpZXdzCi1GT1JNX0xJTktfRk9STT1Gb3JtdWxhcgotQUxUX1NXSVRDSF9UT19GT1JNX1ZJRVc9WnVyIEZvcm11bGFyc2ljaHQgd2VjaHNlbG4KLUZPUk1fTElOS19TT1VSQ0U9UXVlbGxlCi1BTFRfU1dJVENIX1RPX1NPVVJDRV9WSUVXPVp1ciBRdWVsbGVuc2ljaHQgd2VjaHNlbG4KLUZPUk1fTEFCRUxfRlJBR01FTlRfU09BUF9WSUVXX0NPTlRFTlQ9U09BUC1IYXVwdHRlaWw6Ci1CVVRUT05fTEFCRUxfTE9BRD1MYWRlbgotQlVUVE9OX0xBQkVMX1NBVkVfQVM9U3BlaWNoZXJuIGFscy4uLgotTVNHX1FVRVNUSU9OX1NZTkNfVklFV1M9RHVyY2ggZGVuIFdlY2hzZWwgenVyIEZvcm11bGFyc2ljaHQga2FubiBzaWNoIGRhcyBGb3JtYXQgZGVzIFF1ZWxsZW5pbmhhbHRzIFx1MDBlNG5kZXJuLiAgV29sbGVuIFNpZSBkaWUgVmVyYXJiZWl0dW5nIGZvcnRzZXR6ZW4/Ci1NU0dfUVVFU1RJT05fU1lOQ19WSUVXU19ERVNQSVRFX0lOVkFMSURfU09VUkNFX0NPTlRFTlQ9RGVyIEluaGFsdCBkZXIgUXVlbGxlbnNpY2h0IGhhdCBkaWUgU2NoZW1hYXVzd2VydHVuZyBuaWNodCBiZXN0YW5kZW4uICBUcm90emRlbSBzeW5jaHJvbmlzaWVyZW4/ICAoRGVyIEluaGFsdCBkZXIgUXVlbGxlbnNpY2h0IGthbm4gZGFkdXJjaCBnZVx1MDBlNG5kZXJ0IHdlcmRlbikKLQotIyBGb3JtIGNvbnRyb2wgdGl0bGVzCi1GT1JNX0NPTlRST0xfVElUTEVfRU5BQkxFX0RJU0FCTEVfR1JPVVA9R3J1cHBlIGFrdGl2aWVyZW4vaW5ha3RpdmllcmVuCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0VMRU1FTlRfSU5fR1JPVVA9RWxlbWVudCBpbiBHcnVwcGUgYXVzd1x1MDBlNGhsZW4KLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfVU5JT05fVFlQRT1HZXNhbXR2ZXJrblx1MDBmY3BmdW5nc3R5cCBhdXN3XHUwMGU0aGxlbgotRk9STV9DT05UUk9MX1RJVExFX1NPQVBfRklMRT1TT0FQLURhdGVuZGF0ZWkKLQotIyBYU0QgSW5mb3JtYXRpb24gRGlhbG9nCi1USVRMRV9YU0RfSU5GT1JNQVRJT05fRElBTE9HPVhTRC1JbmZvcm1hdGlvbnNkaWFsb2cKLQotIyBFcnJvciBtZXNzYWdlcwotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzODlFIFdcdTAwZTRobGVuIFNpZSBtaW5kZXN0ZW5zIGVpbmVuIEVpbnRyYWcgYXVzLgotTVNHX0VSUk9SX01BWF9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkwRSBNYXhpbWFsZXMgVm9ya29tbWVuIGVycmVpY2h0LgotTVNHX0VSUk9SX01JTl9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkxRSBNaW5kZXN0dm9ya29tbWVuIGVycmVpY2h0LgotTVNHX0VSUk9SX0NBTk5PVF9NT1ZFX0ZJUlNUX0VMRU1FTlRfVVA9SVdBQjAzOTJFIERhcyBhdXNnZXdcdTAwZTRobHRlIEVsZW1lbnQgYmVmaW5kZXQgc2ljaCBiZXJlaXRzIGluIGRlciBlcnN0ZW4gR3J1cHBlLgotTVNHX0VSUk9SX0NBTk5PVF9NT1ZFX0xBU1RfRUxFTUVOVF9ET1dOPUlXQUIwMzkzRSBEYXMgYXVzZ2V3XHUwMGU0aGx0ZSBFbGVtZW50IGJlZmluZGV0IHNpY2ggYmVyZWl0cyBpbiBkZXIgbGV0enRlbiBHcnVwcGUuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsX2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsX2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZGY0ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF9lcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVdTREwKLQotIyBOb2RlcwotTk9ERV9OQU1FX1dTRExfTUFJTj1QcmluY2lwYWwgZGUgV1NETAotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1Db250ZW5lZG9yIGRlbCBuYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPUJhcnJhIGRlIGhlcnJhbWllbnRhcyBkZWwgbmF2ZWdhZG9yCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1Db250ZW5pZG8gZGVsIG5hdmVnYWRvcgotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9Q29udGVuZWRvciBkZSBhY2Npb25lcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9Q29udGVuZWRvciBkZSBwcm9waWVkYWRlcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPUJhcnJhIGRlIGhlcnJhbWllbnRhcyBkZSBwcm9waWVkYWRlcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPUNvbnRlbmlkbyBkZSBwcm9waWVkYWRlcwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1Db250ZW5lZG9yIGRlIGVzdGFkbwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9QmFycmEgZGUgaGVycmFtaWVudGFzIGRlIGVzdGFkbwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9Q29udGVuaWRvIGRlIGVzdGFkbwotRlJBTUVfVElUTEVfV1NETF9QRVJTUEVDVElWRV9DT05URU5UPUNvbnRlbmlkbyBkZSBwXHUwMGUxZ2luYSBXU0RMCi1GUkFNRV9USVRMRV9YU0RfSU5GT1JNQVRJT05fVE9PTEJBUj1CYXJyYSBkZSBoZXJyYW1pZW50YXMgZGUgZGlcdTAwZTFsb2dvIGRlIGluZm9ybWFjaVx1MDBmM24gWFNECi1GUkFNRV9USVRMRV9YU0RfSU5GT1JNQVRJT05fQ09OVEVOVD1Db250ZW5pZG8gZGUgZGlcdTAwZTFsb2dvIGRlIGluZm9ybWFjaVx1MDBmM24gWFNECi0KLSMgT3BlbldTRExBY3Rpb24KLUFMVF9PUEVOX1dTREw9QWJyaXIgV1NETAotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkw9SVdBQjAzNzhFIEVudHJlIHVuIFVSTCBXU0RMIHZcdTAwZTFsaWRvLgotTVNHX0VSUk9SX09QRU5fV1NETD1JV0FCMDM3OUUgTm8gc2UgcHVlZGUgYWJyaXIgJTEuCi1NU0dfRVJST1JfWFNEX1ZBTElEQVRJT049SVdBQjAzODBFIFNlIGhhbiBlbmNvbnRyYWRvIGVycm9yZXMgYWwgdmFsaWRhciBlc3F1ZW1hcyBYTUwuCi1NU0dfSU5GT19PUEVOX1dTRExfU1VDQ0VTU0ZVTD1JV0FCMDM4MUkgJTEgc2UgaGEgYWJpZXJ0byBzYXRpc2ZhY3RvcmlhbWVudGUuCi0KLSMgV1NETCBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX0RFVEFJTFM9RGV0YWxsZXMgZGUgV1NETAotRk9STV9MQUJFTF9XU0RMX0RFVEFJTFNfREVTQz1BIGNvbnRpbnVhY2lcdTAwZjNuIHNlIG11ZXN0cmFuIGxvcyBkZXRhbGxlcyBkZSBlc3RlIGRvY3VtZW50byBXU0RMLiBQdWxzZSBzb2JyZSB1biBzZXJ2aWNpbyBvIGVubGFjZSBwYXJhIHZlciBsb3MgZGV0YWxsZXMgY29ycmVzcG9uZGllbnRlcy4KLQotIyBXU0RMIFNlcnZpY2UgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9TRVJWSUNFX0RFVEFJTFM9RGV0YWxsZXMgZGUgc2VydmljaW8gV1NETAotRk9STV9MQUJFTF9TRVJWSUNFX0RFVEFJTFNfREVTQz1BIGNvbnRpbnVhY2lcdTAwZjNuIHNlIG11ZXN0cmFuIGxvcyBkZXRhbGxlcyBwYXJhIGVzdGUgZWxlbWVudG8gJmx0O3NlcnZpY2UmZ3Q7LiBQdWxzZSBzb2JyZSB1biBlbmxhY2UgcGFyYSB2ZXIgbGFzIG9wZXJhY2lvbmVzIGNvcnJlc3BvbmRpZW50ZXMuCi0KLSMgV1NETCBCaW5kaW5nIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfQklORElOR19ERVRBSUxTPURldGFsbGVzIGRlIGVubGFjZSBXU0RMCi1GT1JNX0xBQkVMX0JJTkRJTkdfREVUQUlMU19ERVNDPUEgY29udGludWFjaVx1MDBmM24gc2UgbXVlc3RyYW4gbG9zIGRldGFsbGVzIHBhcmEgZXN0ZSBlbGVtZW50byAmbHQ7YmluZGluZyZndDsgPHN0cm9uZz4lMTwvc3Ryb25nPi4gUHVsc2Ugc29icmUgdW5hIG9wZXJhY2lcdTAwZjNuIHBhcmEgY3VtcGxpbWVudGFyIGxvcyBwYXJcdTAwZTFtZXRyb3MgZSBpbnZvY2FybGEgbyBlc3BlY2lmaWNhciBwdW50b3MgZmluYWxlcyBhZGljaW9uYWxlcy4KLQotIyBJbnZva2VXU0RMT3BlcmF0aW9uQWN0aW9uCi1BTFRfSU5WT0tFX1dTRExfT1BFUkFUSU9OPUludm9jYXIgdW5hIG9wZXJhY2lcdTAwZjNuIFdTREwKLU1TR19FUlJPUl9VTkFCTEVfVE9fQ09OTkVDVD1JV0FCMDM4MkUgTm8gZXMgcG9zaWJsZSBjb25lY3RhciBjb24gJTEKLU1TR19FUlJPUl9WQUxJREFUSU5HX1BBUkFNRVRFUj1JV0FCMDM4M0UgRXJyb3IgYWwgdmFsaWRhciAlMQotCi0jIFdTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0RMX1RPX0ZBVk9SSVRFUz1BXHUwMGYxYWRpciBXU0RMIGEgZmF2b3JpdG9zCi1NU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzg0RSAlMSB5YSBleGlzdGUgZW4gbG9zIGZhdm9yaXRvcy4KLU1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTPUlXQUIwMzg1RSBObyBzZSBwdWVkZSBhXHUwMGYxYWRpciAlMSBhIGxvcyBmYXZvcml0b3MuCi1NU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUw9SVdBQjAzODZJICUxIHNlIGFcdTAwZjFhZGUgYSBsb3MgZmF2b3JpdG9zLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9RWwgZmF2b3JpdG8geWEgZXhpc3RlLiAgXHUwMGJmRGVzZWEgc29icmVzY3JpYmlybG8/Ci0KLSMgUmVmcmVzaFdTRExBY3Rpb24KLU1TR19JTkZPX1JFRlJFU0hfV1NETF9TVUNDRVNTRlVMPUlXQUIwMzg3SSAlMSBzZSByZW51ZXZhLgotTVNHX1FVRVNUSU9OX1JFTU9WRV9XU0RMX05PREU9JTEgeWEgbm8gcHVlZGUgcmVzb2x2ZXJzZS4gIFx1MDBiZkRlc2VhIGJvcnJhcmxvPwotCi0jIFVwZGF0ZVdTRExCaW5kaW5nQWN0aW9uCi1NU0dfSU5GT19VUERBVEVfV1NETF9CSU5ESU5HX1NVQ0NFU1NGVUw9SVdBQjAzODhJIExvcyBwdW50b3MgZmluYWxlcyBzZSBoYW4gYWN0dWFsaXphZG8gc2F0aXNmYWN0b3JpYW1lbnRlLgotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NETD1BYnJpciBmb3JtdWxhcmlvIFdTREwKLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPUZvcm11bGFyaW8gRGV0YWxsZXMgZGUgV1NETAotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1Gb3JtdWxhcmlvIERldGFsbGVzIGRlIHNlcnZpY2lvIFdTREwKLUZPUk1fVElUTEVfV1NETF9CSU5ESU5HX0RFVEFJTFM9Rm9ybXVsYXJpbyBEZXRhbGxlcyBkZSBlbmxhY2UgV1NETAotRk9STV9USVRMRV9JTlZPS0VfV1NETF9PUEVSQVRJT049Rm9ybXVsYXJpbyBPcGVyYWNpXHUwMGYzbiBXU0RMCi0KLSMgRm9ybSBMYWJlbHMKLUZPUk1fTEFCRUxfT1BFTl9XU0RMX0RFU0M9RXNwZWNpZmlxdWUgZWwgVVJMIGRlIHVuIGRvY3VtZW50byBXU0RMIHkgcHVsc2UgPHN0cm9uZz5Jcjwvc3Ryb25nPiBwYXJhIGV4cGxvcmFyLgotRk9STV9MQUJFTF9TRVJWSUNFUz1TZXJ2aWNpb3MKLUZPUk1fTEFCRUxfQklORElOR1M9RW5sYWNlcwotRk9STV9MQUJFTF9PUEVSQVRJT05TPU9wZXJhY2lvbmVzCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRT1UaXBvCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9VTlNVUFBPUlRFRD1ObyBzb3BvcnRhZG8KLUZPUk1fTEFCRUxfQklORElOR19UWVBFX1NPQVA9U09BUAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9HRVQ9SFRUUCBHRVQKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX0hUVFBfUE9TVD1IVFRQIFBPU1QKLUZPUk1fTEFCRUxfTkFNRT1Ob21icmUKLUZPUk1fTEFCRUxfRE9DVU1FTlRBVElPTj1Eb2N1bWVudGFjaVx1MDBmM24KLUZPUk1fTEFCRUxfRU5EUE9JTlQ9UHVudG8gZmluYWwKLUZPUk1fTEFCRUxfSU5WT0tFX1dTRExfT1BFUkFUSU9OX0RFU0M9RXNwZWNpZmlxdWUgbG9zIHBhclx1MDBlMW1ldHJvcyBkZSBlc3RhIG9wZXJhY2lcdTAwZjNuIFdTREwgeSBwdWxzZSA8c3Ryb25nPklyPC9TdHJvbmc+IHBhcmEgaW52b2Nhci4KLUZPUk1fTElOS19BREQ9QVx1MDBmMWFkaXIKLUZPUk1fTElOS19SRU1PVkU9RWxpbWluYXIKLUZPUk1fTEFCRUxfVkFMVUVTPVZhbG9yZXMKLUZPUk1fTEFCRUxfRU5BQkxFX0RJU0FCTEVfR1JPVVA9SGFiaWxpdGFyL2luaGFiaWxpdGFyIGdydXBvCi1GT1JNX0xBQkVMX1VOSU9OX1RZUEU9VGlwb3MgZGUgdW5pXHUwMGYzbgotRk9STV9MQUJFTF9MQU5HVUFHRT1MZW5ndWFqZQotRk9STV9MQUJFTF9YU0RfQVBQTElDQVRJT05fSU5GT1JNQVRJT049SW5mb3JtYWNpXHUwMGYzbiBkZSBhcGxpY2FjaVx1MDBmM24KLUZPUk1fTEFCRUxfWFNEX0RPQ1VNRU5UQVRJT049RG9jdW1lbnRhY2lcdTAwZjNuCi1GT1JNX0xBQkVMX1NPQVBfUkVRVUVTVF9FTlZFTE9QRT1Tb2JyZSBkZSBwZXRpY2lcdTAwZjNuIFNPQVA6Ci1GT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRU5WRUxPUEU9U29icmUgZGUgcmVzcHVlc3RhIFNPQVA6Ci1GT1JNX0xBQkVMX0dST1VQX0FMTF9PUkRFUklOR19NT1ZFX1VQPVN1YmlyIGVsZW1lbnRvCi1GT1JNX0xBQkVMX0dST1VQX0FMTF9PUkRFUklOR19NT1ZFX0RPV049QmFqYXIgZWxlbWVudG8KLUZPUk1fTEFCRUxfQkFTRV9UWVBFPVRpcG8gYmFzZQotRk9STV9MQUJFTF9VTkJPVU5ERUQ9Tm8gZW5sYXphZG8KLUZPUk1fTEFCRUxfTEVOR1RIPUxvbmdpdHVkCi1GT1JNX0xBQkVMX0xFTkdUSF9WQUxVRT1bJTEuLiUyXQotRk9STV9MQUJFTF9QQVRURVJOPVBhdHJcdTAwZjNuCi1GT1JNX0xBQkVMX1dISVRFU1BBQ0U9RXNwYWNpbyBlbiBibGFuY28KLUZPUk1fTEFCRUxfUkFOR0VfT0ZfVkFMVUVTPVJhbmdvIGRlIHZhbG9yZXMKLUZPUk1fTEFCRUxfTUlOX0VYQ0xVU0lWRT0oJTEuLgotRk9STV9MQUJFTF9NSU5fSU5DTFVTSVZFPVslMS4uCi1GT1JNX0xBQkVMX01BWF9FWENMVVNJVkU9JTEpCi1GT1JNX0xBQkVMX01BWF9JTkNMVVNJVkU9JTFdCi1GT1JNX0xBQkVMX1RPVEFMX0RJR0lUUz1EXHUwMGVkZ2l0b3MgdG90YWxlcwotRk9STV9MQUJFTF9GUkFDVElPTl9ESUdJVFM9RFx1MDBlZGdpdG9zIGRlIGZyYWNjaVx1MDBmM24KLUZPUk1fTEFCRUxfT0NDVVJBTkNFPUFwYXJpY2lcdTAwZjNuIGRlCi1GT1JNX0xBQkVMX1VOSU9OX01FTUJFUlM9TWllbWJyb3MgZGUgdW5pXHUwMGYzbgotRk9STV9MQUJFTF9MSVNUX0lURU1TPUVsZW1lbnRvcyBkZSBsYSBsaXN0YQotRk9STV9MQUJFTF9FTEVNRU5UUz1FbGVtZW50b3MKLUZPUk1fTEFCRUxfU09BUF9FTkNfQVJSQVlTPU1hdHJpY2VzIFNPQVAKLUZPUk1fTEFCRUxfQ09OVEVOVD1Db250ZW5pZG8KLUZPUk1fTEFCRUxfQVRPTUlDX05BTUVfVFlQRT0lMSAoJTIpOgotRk9STV9MQUJFTF9OVUxMPW51bG8KLUZPUk1fTEFCRUxfR1JPVVBfTlVNQkVSPUdydXBvICUxCi1GT1JNX0xBQkVMX0NIT0lDRVM9T3BjaW9uZXMKLUZPUk1fTEFCRUxfTk9USElOR19UT19ESVNQTEFZX0lOX0ZPUk1fVklFVz1ObyBoYXkgbmFkYSBxdWUgdmlzdWFsaXphciBlbiBsYSB2aXN0YSBkZWwgZm9ybXVsYXJpby4gIFBhc2UgYSBsYSB2aXN0YSBkZSBmdWVudGUgcGFyYSBsYSBwZXRpY2lcdTAwZjNuIHkgbGEgcmVzcHVlc3RhIFNPQVAuCi1GT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRkFJTEVEX1ZBTElEQVRJT05fSU5fRk9STV9WSUVXPUxhIHJlc3B1ZXN0YSBTT0FQIG5vIGhhIHBhc2FkbyBsYSB2YWxpZGFjaVx1MDBmM24gZGUgZXNxdWVtYS4gIFBhc2UgYSBsYSB2aXN0YSBkZSBmdWVudGUgcGFyYSBsYSBwZXRpY2lcdTAwZjNuIFNPQVAgZW4gZm9ybWF0byBYTUwuCi1GT1JNX0xBQkVMX0VORF9QT0lOVFM9UHVudG9zIGZpbmFsZXMKLQotIyBTb3VyY2UvRm9ybSB2aWV3cwotRk9STV9MSU5LX0ZPUk09Rm9ybXVsYXJpbwotQUxUX1NXSVRDSF9UT19GT1JNX1ZJRVc9UGFzYXIgYSBsYSB2aXN0YSBkZSBmb3JtdWxhcmlvCi1GT1JNX0xJTktfU09VUkNFPUZ1ZW50ZQotQUxUX1NXSVRDSF9UT19TT1VSQ0VfVklFVz1QYXNhciBhIGxhIHZpc3RhIGRlIGZ1ZW50ZQotRk9STV9MQUJFTF9GUkFHTUVOVF9TT0FQX1ZJRVdfQ09OVEVOVD1DdWVycG8gU29hcDoKLUJVVFRPTl9MQUJFTF9MT0FEPUNhcmdhcgotQlVUVE9OX0xBQkVMX1NBVkVfQVM9R3VhcmRhciBjb21vLi4uCi1NU0dfUVVFU1RJT05fU1lOQ19WSUVXUz1FbCBmb3JtYXRvIGRlbCBjb250ZW5pZG8gZnVlbnRlIHB1ZWRlIGFsdGVyYXJzZSBhbCBwYXNhciBhIGxhIHZpc3RhIGRlIGZvcm11bGFyaW8uICBcdTAwYmZEZXNlYSBjb250aW51YXI/Ci1NU0dfUVVFU1RJT05fU1lOQ19WSUVXU19ERVNQSVRFX0lOVkFMSURfU09VUkNFX0NPTlRFTlQ9RWwgY29udGVuaWRvIGRlIGxhIHZpc3RhIGZ1ZW50ZSBubyBoYSBwYXNhZG8gbGEgdmFsaWRhY2lcdTAwZjNuIGRlIGVzcXVlbWEuICBcdTAwYmZEZXNlYSBzaW5jcm9uaXphciBkZSB0b2RvcyBtb2Rvcz8gIChFbCBjb250ZW5pZG8gZGUgbGEgdmlzdGEgZGUgZnVlbnRlIHB1ZWRlIG1vZGlmaWNhcnNlKQotCi0jIEZvcm0gY29udHJvbCB0aXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9FTkFCTEVfRElTQUJMRV9HUk9VUD1IYWJpbGl0YXIvaW5oYWJpbGl0YXIgZ3J1cG8KLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfRUxFTUVOVF9JTl9HUk9VUD1TZWxlY2Npb25hciBlbGVtZW50byBkZWwgZ3J1cG8KLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfVU5JT05fVFlQRT1TZWxlY2Npb25hciB0aXBvIGRlIHVuaVx1MDBmM24KLUZPUk1fQ09OVFJPTF9USVRMRV9TT0FQX0ZJTEU9QXJjaGl2byBkZSBkYXRvcyBTT0FQCi0KLSMgWFNEIEluZm9ybWF0aW9uIERpYWxvZwotVElUTEVfWFNEX0lORk9STUFUSU9OX0RJQUxPRz1EaVx1MDBlMWxvZ28gaW5mb3JtYXRpdm8gZGUgWFNECi0KLSMgRXJyb3IgbWVzc2FnZXMKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzg5RSBTZWxlY2Npb25lIGNvbW8gbVx1MDBlZG5pbW8gdW4gZWxlbWVudG8uCi1NU0dfRVJST1JfTUFYX09DQ1VSU19WSU9MQVRJT049SVdBQjAzOTBFIFNlIGhhIGFsY2FuemFkbyBlbCBuXHUwMGZhbWVybyBtXHUwMGUxeGltbyBkZSBhcGFyaWNpb25lcy4KLU1TR19FUlJPUl9NSU5fT0NDVVJTX1ZJT0xBVElPTj1JV0FCMDM5MUUgU2UgaGEgYWxjYW56YWRvIGVsIG5cdTAwZmFtZXJvIG1cdTAwZWRuaW1vIGRlIGFwYXJpY2lvbmVzLgotTVNHX0VSUk9SX0NBTk5PVF9NT1ZFX0ZJUlNUX0VMRU1FTlRfVVA9SVdBQjAzOTJFIEVsIGVsZW1lbnRvIHNlbGVjY2lvbmFkbyB5YSBlcyBlbCBwcmltZXJvIGRlbCBncnVwby4KLU1TR19FUlJPUl9DQU5OT1RfTU9WRV9MQVNUX0VMRU1FTlRfRE9XTj1JV0FCMDM5M0UgRWwgZWxlbWVudG8gc2VsZWNjaW9uYWRvIHlhIGVzIGVsIFx1MDBmYWx0aW1vIGRlbCBncnVwby4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfZnIucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfZnIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4MjFlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsX2ZyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9V1NETAotCi0jIE5vZGVzCi1OT0RFX05BTUVfV1NETF9NQUlOPVdTREwgLSBQYWdlIHByaW5jaXBhbGUKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9TmF2aWdhdGV1ciAtIENvbnRlbmV1cgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9TmF2aWdhdGV1ciAtIEJhcnJlIGQnb3V0aWxzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1OYXZpZ2F0ZXVyIC0gQ29udGVudQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9Q29udGVuZXVyIGQnYWN0aW9ucwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9Q29udGVuZXVyIGRlIHByb3ByaVx1MDBlOXRcdTAwZTlzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9QmFycmUgZCdvdXRpbHMgZGVzIHByb3ByaVx1MDBlOXRcdTAwZTlzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9Q29udGVudSBkZXMgcHJvcHJpXHUwMGU5dFx1MDBlOXMKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9Q29udGVuZXVyIGRlIHN0YXR1dHMKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPUJhcnJlIGQnb3V0aWxzIGRlcyBzdGF0dXRzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZW51IGRlcyBzdGF0dXRzCi1GUkFNRV9USVRMRV9XU0RMX1BFUlNQRUNUSVZFX0NPTlRFTlQ9Q29udGVudSBkZSBsYSBwYWdlIFdTREwKLUZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9UT09MQkFSPU1lc3NhZ2UgZCdpbmZvcm1hdGlvbiBYU0QgLSBCYXJyZSBkJ291dGlscwotRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX0NPTlRFTlQ9TWVzc2FnZSBkJ2luZm9ybWF0aW9uIFhTRCAtIENvbnRlbnUKLQotIyBPcGVuV1NETEFjdGlvbgotQUxUX09QRU5fV1NETD1PdXZyaXIgdW4gZG9jdW1lbnQgV1NETAotTVNHX0VSUk9SX0lOVkFMSURfV1NETF9VUkw9SVdBQjAzNzhFIEluZGlxdWV6IHVuZSBVUkwgV1NETCB2YWxpZGUuCi1NU0dfRVJST1JfT1BFTl9XU0RMPUlXQUIwMzc5RSBJbXBvc3NpYmxlIGQnb3V2cmlyICUxLgotTVNHX0VSUk9SX1hTRF9WQUxJREFUSU9OPUlXQUIwMzgwRSBEZXMgZXJyZXVycyBzZSBzb250IHByb2R1aXRlcyBsb3JzIGRlIGxhIHZhbGlkYXRpb24gZGVzIHNjaFx1MDBlOW1hcyBYTUwuCi1NU0dfSU5GT19PUEVOX1dTRExfU1VDQ0VTU0ZVTD1JV0FCMDM4MUkgJTEgYSBcdTAwZTl0XHUwMGU5IG91dmVydC4KLQotIyBXU0RMIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfREVUQUlMUz1JbmZvcm1hdGlvbnMgc3VyIGxlIGRvY3VtZW50IFdTREwKLUZPUk1fTEFCRUxfV1NETF9ERVRBSUxTX0RFU0M9TGVzIGluZm9ybWF0aW9ucyBzdXIgbGUgZG9jdW1lbnQgV1NETCBmaWd1cmVudCBjaS1hcHJcdTAwZThzLiBQb3VyIGxlcyBhZmZpY2hlciwgY2xpcXVleiBzdXIgdW4gc2VydmljZSBvdSB1bmUgbGlhaXNvbi4KLQotIyBXU0RMIFNlcnZpY2UgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9TRVJWSUNFX0RFVEFJTFM9SW5mb3JtYXRpb25zIHN1ciBsZSBzZXJ2aWNlIFdTREwKLUZPUk1fTEFCRUxfU0VSVklDRV9ERVRBSUxTX0RFU0M9TGVzIGluZm9ybWF0aW9ucyBzdXIgY2V0IFx1MDBlOWxcdTAwZTltZW50ICZsdDtzZXJ2aWNlJmd0OyBmaWd1cmVudCBjaS1hcHJcdTAwZThzLiBDbGlxdWV6IHN1ciB1bmUgbGlhaXNvbiBwb3VyIGFmZmljaGVyIHNlcyBvcFx1MDBlOXJhdGlvbnMuCi0KLSMgV1NETCBCaW5kaW5nIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfQklORElOR19ERVRBSUxTPUluZm9ybWF0aW9ucyBzdXIgbGEgbGlhaXNvbiBXU0RMCi1GT1JNX0xBQkVMX0JJTkRJTkdfREVUQUlMU19ERVNDPUxlcyBpbmZvcm1hdGlvbnMgc3VyIGNldCBcdTAwZTlsXHUwMGU5bWVudCAmbHQ7bGlhaXNvbiZndDsgPHN0cm9uZz4lMTwvc3Ryb25nPiBmaWd1cmVudCBjaS1hcHJcdTAwZThzLiBDbGlxdWV6IHN1ciB1bmUgb3BcdTAwZTlyYXRpb24gcG91ciBpbmRpcXVlciBzZXMgcGFyYW1cdTAwZTh0cmVzIGV0IGwnYXBwZWxlciBvdSBzcFx1MDBlOWNpZmllciBkJ2F1dHJlcyBub2V1ZHMgZmluYXV4LgotCi0jIEludm9rZVdTRExPcGVyYXRpb25BY3Rpb24KLUFMVF9JTlZPS0VfV1NETF9PUEVSQVRJT049QXBwZWxlciB1bmUgb3BcdTAwZTlyYXRpb24gV1NETAotTVNHX0VSUk9SX1VOQUJMRV9UT19DT05ORUNUPUlXQUIwMzgyRSBJbXBvc3NpYmxlIGQnXHUwMGU5dGFibGlyIGxhIGNvbm5leGlvbiBhdmVjICUxCi1NU0dfRVJST1JfVkFMSURBVElOR19QQVJBTUVURVI9SVdBQjAzODNFIEVycmV1ciBsb3JzIGRlIGxhIHZhbGlkYXRpb24gZGUgJTEKLQotIyBXU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NETF9UT19GQVZPUklURVM9QWpvdXRlciBsZSBkb2N1bWVudCBXU0RMIGF1eCBmYXZvcmlzCi1NU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzg0RSAlMSBleGlzdGUgZFx1MDBlOWpcdTAwZTAgZGFucyBsZXMgZmF2b3Jpcy4KLU1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTPUlXQUIwMzg1RSBJbXBvc3NpYmxlIGQnYWpvdXRlciAlMSBhdXggZmF2b3Jpcy4KLU1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTD1JV0FCMDM4NkkgJTEgZXN0IGFqb3V0XHUwMGU5IGF1eCBmYXZvcmlzLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9TGUgZmF2b3JpIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4gIFZvdWxlei12b3VzIGxlIHJlbXBsYWNlciA/Ci0KLSMgUmVmcmVzaFdTRExBY3Rpb24KLU1TR19JTkZPX1JFRlJFU0hfV1NETF9TVUNDRVNTRlVMPUlXQUIwMzg3SSAlMSBlc3Qgclx1MDBlOWdcdTAwZTluXHUwMGU5clx1MDBlOS4KLU1TR19RVUVTVElPTl9SRU1PVkVfV1NETF9OT0RFPSUxIG5lIHBldXQgcGx1cyBcdTAwZWF0cmUgclx1MDBlOXNvbHUuIFZvdWxlei12b3VzIGwnZWZmYWNlciA/Ci0KLSMgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24KLU1TR19JTkZPX1VQREFURV9XU0RMX0JJTkRJTkdfU1VDQ0VTU0ZVTD1JV0FCMDM4OEkgTGVzIG5vZXVkcyBmaW5hdXggb250IFx1MDBlOXRcdTAwZTkgbWlzIFx1MDBlMCBqb3VyLgotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NETD1Gb3JtdWxhaXJlIE91dmVydHVyZSBkJ3VuIFdTREwKLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPUZvcm11bGFpcmUgSW5mb3JtYXRpb25zIHN1ciBXU0RMCi1GT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTPUZvcm11bGFpcmUgSW5mb3JtYXRpb25zIHN1ciBsZSBzZXJ2aWNlIFdTREwKLUZPUk1fVElUTEVfV1NETF9CSU5ESU5HX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxhIGxpYWlzb24gV1NETAotRk9STV9USVRMRV9JTlZPS0VfV1NETF9PUEVSQVRJT049Rm9ybXVsYWlyZSBPcFx1MDBlOXJhdGlvbiBXU0RMCi0KLSMgRm9ybSBMYWJlbHMKLUZPUk1fTEFCRUxfT1BFTl9XU0RMX0RFU0M9SW5kaXF1ZXogbCdVUkwgZCd1biBkb2N1bWVudCBXU0RMIGV0IGNsaXF1ZXogc3VyIDxzdHJvbmc+T0s8L3N0cm9uZz4gcG91ciBsYW5jZXIgbCdleHBsb3JhdGlvbi4KLUZPUk1fTEFCRUxfU0VSVklDRVM9U2VydmljZXMKLUZPUk1fTEFCRUxfQklORElOR1M9TGlhaXNvbnMKLUZPUk1fTEFCRUxfT1BFUkFUSU9OUz1PcFx1MDBlOXJhdGlvbnMKLUZPUk1fTEFCRUxfQklORElOR19UWVBFPVR5cGUKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX1VOU1VQUE9SVEVEPU5vbiBwcmlzIGVuIGNoYXJnZQotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfU09BUD1TT0FQCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX0dFVD1IVFRQIEdFVAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9QT1NUPUhUVFAgUE9TVAotRk9STV9MQUJFTF9OQU1FPU5vbQotRk9STV9MQUJFTF9ET0NVTUVOVEFUSU9OPURvY3VtZW50YXRpb24KLUZPUk1fTEFCRUxfRU5EUE9JTlQ9Tm9ldWQgZmluYWwKLUZPUk1fTEFCRUxfSU5WT0tFX1dTRExfT1BFUkFUSU9OX0RFU0M9SW5kaXF1ZXogbGVzIHBhcmFtXHUwMGU4dHJlcyBkZSBjZXR0ZSBvcFx1MDBlOXJhdGlvbiBXU0RMIGV0IGNsaXF1ZXogc3VyIDxzdHJvbmc+T0s8L1N0cm9uZz4gcG91ciBhcHBlbGVyLgotRk9STV9MSU5LX0FERD1Bam91dGVyCi1GT1JNX0xJTktfUkVNT1ZFPVN1cHByaW1lcgotRk9STV9MQUJFTF9WQUxVRVM9VmFsZXVycwotRk9STV9MQUJFTF9FTkFCTEVfRElTQUJMRV9HUk9VUD1BY3RpdmVyL2RcdTAwZTlzYWN0aXZlciBsZSBncm91cGUKLUZPUk1fTEFCRUxfVU5JT05fVFlQRT1UeXBlcyBkJ3VuaW9uCi1GT1JNX0xBQkVMX0xBTkdVQUdFPUxhbmd1ZQotRk9STV9MQUJFTF9YU0RfQVBQTElDQVRJT05fSU5GT1JNQVRJT049SW5mb3JtYXRpb25zIHN1ciBsJ2FwcGxpY2F0aW9uCi1GT1JNX0xBQkVMX1hTRF9ET0NVTUVOVEFUSU9OPURvY3VtZW50YXRpb24KLUZPUk1fTEFCRUxfU09BUF9SRVFVRVNUX0VOVkVMT1BFPUVudmVsb3BwZSBkZSBkZW1hbmRlIFNPQVAgOgotRk9STV9MQUJFTF9TT0FQX1JFU1BPTlNFX0VOVkVMT1BFPUVudmVsb3BwZSBkZSByXHUwMGU5cG9uc2UgU09BUCA6Ci1GT1JNX0xBQkVMX0dST1VQX0FMTF9PUkRFUklOR19NT1ZFX1VQPURcdTAwZTlwbGFjZXIgbCdcdTAwZTlsXHUwMGU5bWVudCB2ZXJzIGxlIGhhdXQKLUZPUk1fTEFCRUxfR1JPVVBfQUxMX09SREVSSU5HX01PVkVfRE9XTj1EXHUwMGU5cGxhY2VyIGwnXHUwMGU5bFx1MDBlOW1lbnQgdmVycyBsZSBiYXMKLUZPUk1fTEFCRUxfQkFTRV9UWVBFPVR5cGUgZGUgYmFzZQotRk9STV9MQUJFTF9VTkJPVU5ERUQ9Tm9uIGxpXHUwMGU5Ci1GT1JNX0xBQkVMX0xFTkdUSD1Mb25ndWV1cgotRk9STV9MQUJFTF9MRU5HVEhfVkFMVUU9WyUxLi4lMl0KLUZPUk1fTEFCRUxfUEFUVEVSTj1Nb2RcdTAwZThsZQotRk9STV9MQUJFTF9XSElURVNQQUNFPUVzcGFjZSBibGFuYwotRk9STV9MQUJFTF9SQU5HRV9PRl9WQUxVRVM9UGxhZ2UgZGUgdmFsZXVycwotRk9STV9MQUJFTF9NSU5fRVhDTFVTSVZFPSglMS4uCi1GT1JNX0xBQkVMX01JTl9JTkNMVVNJVkU9WyUxLi4KLUZPUk1fTEFCRUxfTUFYX0VYQ0xVU0lWRT0lMSkKLUZPUk1fTEFCRUxfTUFYX0lOQ0xVU0lWRT0lMV0KLUZPUk1fTEFCRUxfVE9UQUxfRElHSVRTPUNoaWZmcmVzIHRvdGF1eAotRk9STV9MQUJFTF9GUkFDVElPTl9ESUdJVFM9UHJcdTAwZTljaXNpb24KLUZPUk1fTEFCRUxfT0NDVVJBTkNFPU9jY3VycmVuY2UgZGUKLUZPUk1fTEFCRUxfVU5JT05fTUVNQkVSUz1NZW1icmVzIGQndW5pb24KLUZPUk1fTEFCRUxfTElTVF9JVEVNUz1FbFx1MDBlOW1lbnRzIGRlIGxpc3RlCi1GT1JNX0xBQkVMX0VMRU1FTlRTPUVsXHUwMGU5bWVudHMKLUZPUk1fTEFCRUxfU09BUF9FTkNfQVJSQVlTPVRhYmxlYXV4IFNPQVAKLUZPUk1fTEFCRUxfQ09OVEVOVD1Db250ZW51Ci1GT1JNX0xBQkVMX0FUT01JQ19OQU1FX1RZUEU9JTEgKCUyKSA6Ci1GT1JNX0xBQkVMX05VTEw9bnVsbAotRk9STV9MQUJFTF9HUk9VUF9OVU1CRVI9R3JvdXBlICUxCi1GT1JNX0xBQkVMX0NIT0lDRVM9Q2hvaXgKLUZPUk1fTEFCRUxfTk9USElOR19UT19ESVNQTEFZX0lOX0ZPUk1fVklFVz1JbCBuJ3kgYSByaWVuIFx1MDBlMCBhZmZpY2hlciBkYW5zIGxhIHZ1ZSBkZSBmb3JtdWxhaXJlLiAgUGFzc2V6IFx1MDBlMCBsYSB2dWUgU291cmNlIHBvdXIgbGEgZGVtYW5kZSBTT0FQIGV0IGxhIHJcdTAwZTlwb25zZS4KLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9GQUlMRURfVkFMSURBVElPTl9JTl9GT1JNX1ZJRVc9TGEgdmFsaWRhdGlvbiBkdSBzY2hcdTAwZTltYSBkZSByXHUwMGU5cG9uc2UgU09BUCBhIFx1MDBlOWNob3VcdTAwZTkuICBQYXNzZXogXHUwMGUwIGxhIHZ1ZSBTb3VyY2UgcG91ciBhZmZpY2hlciBsYSByXHUwMGU5cG9uc2UgU09BUCBhdSBmb3JtYXQgWE1MLgotRk9STV9MQUJFTF9FTkRfUE9JTlRTPU5vZXVkcyBmaW5hdXgKLQotIyBTb3VyY2UvRm9ybSB2aWV3cwotRk9STV9MSU5LX0ZPUk09Rm9ybXVsYWlyZQotQUxUX1NXSVRDSF9UT19GT1JNX1ZJRVc9UGFzc2VyIFx1MDBlMCBsYSB2dWUgRm9ybXVsYWlyZQotRk9STV9MSU5LX1NPVVJDRT1Tb3VyY2UKLUFMVF9TV0lUQ0hfVE9fU09VUkNFX1ZJRVc9UGFzc2VyIFx1MDBlMCBsYSB2dWUgU291cmNlCi1GT1JNX0xBQkVMX0ZSQUdNRU5UX1NPQVBfVklFV19DT05URU5UPUNvcnBzIFNPQVAgOgotQlVUVE9OX0xBQkVMX0xPQUQ9Q2hhcmdlcgotQlVUVE9OX0xBQkVMX1NBVkVfQVM9RW5yZWdpc3RyZXIgc291cy4uLgotTVNHX1FVRVNUSU9OX1NZTkNfVklFV1M9TGUgZm9ybWF0IGR1IGNvbnRlbnUgc291cmNlIHBldXQgXHUwMGVhdHJlIG1vZGlmaVx1MDBlOSBhcHJcdTAwZThzIGxlIHBhc3NhZ2UgXHUwMGUwIGxhIHZ1ZSBGb3JtdWxhaXJlLiAgVm91bGV6LXZvdXMgY29udGludWVyID8KLU1TR19RVUVTVElPTl9TWU5DX1ZJRVdTX0RFU1BJVEVfSU5WQUxJRF9TT1VSQ0VfQ09OVEVOVD1MYSB2YWxpZGF0aW9uIGR1IHNjaFx1MDBlOW1hIGEgXHUwMGU5Y2hvdVx1MDBlOSBwb3VyIGxhIHZ1ZSBTb3VyY2UuICBWb3VsZXotdm91cyBtYWxnclx1MDBlOSB0b3V0IHN5bmNocm9uaXNlciA/ICAoTGUgY29udGVudSBkZSBsYSB2dWUgU291cmNlIHNlcmEgcGV1dC1cdTAwZWF0cmUgbW9kaWZpXHUwMGU5LikKLQotIyBGb3JtIGNvbnRyb2wgdGl0bGVzCi1GT1JNX0NPTlRST0xfVElUTEVfRU5BQkxFX0RJU0FCTEVfR1JPVVA9QWN0aXZlci9kXHUwMGU5c2FjdGl2ZXIgbGUgZ3JvdXBlCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0VMRU1FTlRfSU5fR1JPVVA9U1x1MDBlOWxlY3Rpb25uZXIgdW4gXHUwMGU5bFx1MDBlOW1lbnQgZHUgZ3JvdXBlCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1VOSU9OX1RZUEU9U1x1MDBlOWxlY3Rpb25uZXIgdW4gdHlwZSBkJ3VuaW9uCi1GT1JNX0NPTlRST0xfVElUTEVfU09BUF9GSUxFPUZpY2hpZXIgZGUgZG9ublx1MDBlOWVzIFNPQVAKLQotIyBYU0QgSW5mb3JtYXRpb24gRGlhbG9nCi1USVRMRV9YU0RfSU5GT1JNQVRJT05fRElBTE9HPU1lc3NhZ2UgZCdpbmZvcm1hdGlvbiBYU0QKLQotIyBFcnJvciBtZXNzYWdlcwotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzODlFIFNcdTAwZTlsZWN0aW9ubmV6IGF1IG1vaW5zIHVuIFx1MDBlOWxcdTAwZTltZW50LgotTVNHX0VSUk9SX01BWF9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkwRSBMZSBub21icmUgZCdham91dCBtYXhpbWFsIGVzdCBhdHRlaW50LgotTVNHX0VSUk9SX01JTl9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkxRSBMJ29jY3VycmVuY2UgbWluaW1hbGUgZXN0IGF0dGVpbnRlLgotTVNHX0VSUk9SX0NBTk5PVF9NT1ZFX0ZJUlNUX0VMRU1FTlRfVVA9SVdBQjAzOTJFIEwnXHUwMGU5bFx1MDBlOW1lbnQgc1x1MDBlOWxlY3Rpb25uXHUwMGU5IGVzdCBkXHUwMGU5alx1MDBlMCBsZSBwcmVtaWVyIGR1IGdyb3VwZS4KLU1TR19FUlJPUl9DQU5OT1RfTU9WRV9MQVNUX0VMRU1FTlRfRE9XTj1JV0FCMDM5M0UgTCdcdTAwZTlsXHUwMGU5bWVudCBzXHUwMGU5bGVjdGlvbm5cdTAwZTkgZXN0IGRcdTAwZTlqXHUwMGUwIGxlIGRlcm5pZXIgZHUgZ3JvdXBlLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF9pdC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF9pdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDZlOWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfaXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0RMCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9XU0RMX01BSU49V1NETCBwcmluY2lwYWxlCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPUNvbnRlbml0b3JlIFNlbGV6aW9uZQotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIFNlbGV6aW9uZQotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9Q29udGVudXRvIFNlbGV6aW9uZQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9Q29udGVuaXRvcmUgYXppb25pCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Db250ZW5pdG9yZSBwcm9wcmlldFx1MDBlMAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPUJhcnJhIGRlZ2xpIHN0cnVtZW50aSBwcm9wcmlldFx1MDBlMAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPUNvbnRlbnV0byBwcm9wcmlldFx1MDBlMAotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1Db250ZW5pdG9yZSBzdGF0bwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIHN0YXRvCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZW51dG8gc3RhdG8KLUZSQU1FX1RJVExFX1dTRExfUEVSU1BFQ1RJVkVfQ09OVEVOVD1Db250ZW51dG8gZGVsbGEgcGFnaW5hIFdTREwKLUZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9UT09MQkFSPUJhcnJhIGRlZ2xpIHN0cnVtZW50aSBkZWxsYSBmaW5lc3RyYSBkaSBkaWFsb2dvIHJlbGF0aXZhIGFsbGUgaW5mb3JtYXppb25pIHN1IFhTRAotRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX0NPTlRFTlQ9Q29udGVudXRvIGRlbGxhIGZpbmVzdHJhIGRpIGRpYWxvZ28gcmVsYXRpdmEgYWxsZSBpbmZvcm1hemlvbmkgc3UgWFNECi0KLSMgT3BlbldTRExBY3Rpb24KLUFMVF9PUEVOX1dTREw9QXByaSBXU0RMCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTD1JV0FCMDM3OEUgSW1tZXR0ZXJlIHVuIFVSTCBXU0RMIHZhbGlkby4KLU1TR19FUlJPUl9PUEVOX1dTREw9SVdBQjAzNzlFIEltcG9zc2liaWxlIGFwcmlyZSAlMS4KLU1TR19FUlJPUl9YU0RfVkFMSURBVElPTj1JV0FCMDM4MEUgU29ubyBzdGF0aSByaWxldmF0aSBkZWdsaSBlcnJvcmkgZHVyYW50ZSBsYSBjb252YWxpZGEgZGVnbGkgc2NoZW1pIFhNTC4KLU1TR19JTkZPX09QRU5fV1NETF9TVUNDRVNTRlVMPUlXQUIwMzgxSSAlMSBcdTAwZTggc3RhdG8gYXBlcnRvIGNvcnJldHRhbWVudGUuCi0KLSMgV1NETCBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX0RFVEFJTFM9RGV0dGFnbGkgV1NETAotRk9STV9MQUJFTF9XU0RMX0RFVEFJTFNfREVTQz1JbiBiYXNzbyBzb25vIHZpc3VhbGl6emF0aSBpIGRldHRhZ2xpIHJlbGF0aXZpIGEgcXVlc3RvIGRvY3VtZW50byBXU0RMLiBGYXJlIGNsaWMgc3UgdW4gc2Vydml6aW8gbyBzdSB1biBiaW5kaW5nIHBlciB2aXN1YWxpenphcmUgaSByZWxhdGl2aSBkZXR0YWdsaS4KLQotIyBXU0RMIFNlcnZpY2UgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9TRVJWSUNFX0RFVEFJTFM9RGV0dGFnbGkgc2Vydml6aW8gV1NETAotRk9STV9MQUJFTF9TRVJWSUNFX0RFVEFJTFNfREVTQz1JbiBiYXNzbyBzb25vIHZpc3VhbGl6emF0aSBpIGRldHRhZ2xpIHJlbGF0aXZpIGEgcXVlc3RvIGVsZW1lbnRvICZsdDtzZXJ2aXppbyZndDsuIEZhcmUgY2xpYyBzdSB1biBiaW5kaW5nIHBlciB2aXN1YWxpenphcmUgbGUgcmVsYXRpdmUgb3BlcmF6aW9uaS4KLQotIyBXU0RMIEJpbmRpbmcgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9CSU5ESU5HX0RFVEFJTFM9RGV0dGFnbGkgYmluZGluZyBXU0RMCi1GT1JNX0xBQkVMX0JJTkRJTkdfREVUQUlMU19ERVNDPUluIGJhc3NvIHNvbm8gdmlzdWFsaXp6YXRpIGkgZGV0dGFnbGkgcmVsYXRpdmkgYSBxdWVzdG8gZWxlbWVudG8gPHN0cm9uZz4lMTwvc3Ryb25nPiAmbHQ7YmluZGluZyZndDsuIEZhcmUgY2xpYyBzdSB1bidvcGVyYXppb25lIHBlciBpbnNlcmlyZSBpIHBhcmFtZXRyaSBlIHJpY2hpYW1hcmUgbCdvcGVyYXppb25lIG8gcGVyIHNwZWNpZmljYXJlIGVuZHBvaW50IHN1cHBsZW1lbnRhcmkuCi0KLSMgSW52b2tlV1NETE9wZXJhdGlvbkFjdGlvbgotQUxUX0lOVk9LRV9XU0RMX09QRVJBVElPTj1SaWNoaWFtYSB1bidvcGVyYXppb25lIFdTREwKLU1TR19FUlJPUl9VTkFCTEVfVE9fQ09OTkVDVD1JV0FCMDM4MkUgSW1wb3NzaWJpbGUgY29ubmV0dGVyc2kgYSAlMQotTVNHX0VSUk9SX1ZBTElEQVRJTkdfUEFSQU1FVEVSPUlXQUIwMzgzRSBFcnJvcmUgZHVyYW50ZSBsYSBjb252YWxpZGEgZGkgJTEKLQotIyBXU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NETF9UT19GQVZPUklURVM9QWdnaXVuZ2kgV1NETCBhaSBwcmVmZXJpdGkKLU1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFM9SVdBQjAzODRFICUxIGVzaXN0ZSBnaVx1MDBlMCBuZWkgcHJlZmVyaXRpLgotTVNHX0VSUk9SX0FERF9UT19GQVZPUklURVM9SVdBQjAzODVFIEltcG9zc2liaWxlIGFnZ2l1bmdlcmUgJTEgYWkgcHJlZmVyaXRpLgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzg2SSAlMSB2aWVuZSBhZ2dpdW50byBhaSBwcmVmZXJpdGkuCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1JIHByZWZlcml0aSBlc2lzdG9ubyBnaVx1MDBlMC4gIFNvdnJhc2NyaXZlcmxpPwotCi0jIFJlZnJlc2hXU0RMQWN0aW9uCi1NU0dfSU5GT19SRUZSRVNIX1dTRExfU1VDQ0VTU0ZVTD1JV0FCMDM4N0kgJTEgdmllbmUgYWdnaW9ybmF0by4KLU1TR19RVUVTVElPTl9SRU1PVkVfV1NETF9OT0RFPSUxIG5vbiBcdTAwZTggcGlcdTAwZjkgcmlzb2x2aWJpbGUuICBDYW5jZWxsYXJsbz8KLQotIyBVcGRhdGVXU0RMQmluZGluZ0FjdGlvbgotTVNHX0lORk9fVVBEQVRFX1dTRExfQklORElOR19TVUNDRVNTRlVMPUlXQUIwMzg4SSBHbGkgZW5kcG9pbnQgc29ubyBzdGF0aSBhZ2dpb3JuYXRpIGNvcnJldHRhbWVudGUuCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfT1BFTl9XU0RMPUFwcmkgbW9kdWxvIFdTREwKLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPU1vZHVsbyBkZXR0YWdsaSBXU0RMCi1GT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTPU1vZHVsbyBkZXR0YWdsaSBzZXJ2aXppbyBXU0RMCi1GT1JNX1RJVExFX1dTRExfQklORElOR19ERVRBSUxTPU1vZHVsbyBkZXR0YWdsaSBiaW5kaW5nIFdTREwKLUZPUk1fVElUTEVfSU5WT0tFX1dTRExfT1BFUkFUSU9OPU1vZHVsbyBvcGVyYXppb25lIFdTREwKLQotIyBGb3JtIExhYmVscwotRk9STV9MQUJFTF9PUEVOX1dTRExfREVTQz1JbW1ldHRlcmUgbCdVUkwgZGkgdW4gZG9jdW1lbnRvIFdTREwgZSBmYXJlIGNsaWMgc3UgPHN0cm9uZz5WYWk8L3N0cm9uZz4gcGVyIGwnZXNwbG9yYXppb25lLgotRk9STV9MQUJFTF9TRVJWSUNFUz1TZXJ2aXppCi1GT1JNX0xBQkVMX0JJTkRJTkdTPUJpbmRpbmcKLUZPUk1fTEFCRUxfT1BFUkFUSU9OUz1PcGVyYXppb25pCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRT1UaXBvCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9VTlNVUFBPUlRFRD1Ob24gc3VwcG9ydGF0bwotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfU09BUD1TT0FQCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX0dFVD1IVFRQIEdFVAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9QT1NUPUhUVFAgUE9TVAotRk9STV9MQUJFTF9OQU1FPU5vbWUKLUZPUk1fTEFCRUxfRE9DVU1FTlRBVElPTj1Eb2N1bWVudGF6aW9uZQotRk9STV9MQUJFTF9FTkRQT0lOVD1FbmRwb2ludAotRk9STV9MQUJFTF9JTlZPS0VfV1NETF9PUEVSQVRJT05fREVTQz1JbW1ldHRlcmUgaSBwYXJhbWV0cmkgZGkgcXVlc3RhIG9wZXJhemlvbmUgV1NETCBlIGZhcmUgY2xpYyBzdSA8c3Ryb25nPlZhaTwvU3Ryb25nPiBwZXIgcmljaGlhbWFyZSBsJ29wZXJhemlvbmUuCi1GT1JNX0xJTktfQUREPUFnZ2l1bmdpCi1GT1JNX0xJTktfUkVNT1ZFPVJpbXVvdmkKLUZPUk1fTEFCRUxfVkFMVUVTPVZhbG9yaQotRk9STV9MQUJFTF9FTkFCTEVfRElTQUJMRV9HUk9VUD1BYmlsaXRhL0Rpc2FiaWxpdGEgZ3J1cHBvCi1GT1JNX0xBQkVMX1VOSU9OX1RZUEU9VGlwaSBkaSB1bmlvbmUKLUZPUk1fTEFCRUxfTEFOR1VBR0U9TGluZ3VhCi1GT1JNX0xBQkVMX1hTRF9BUFBMSUNBVElPTl9JTkZPUk1BVElPTj1JbmZvcm1hemlvbmkgc3VsbCdhcHBsaWNhemlvbmUKLUZPUk1fTEFCRUxfWFNEX0RPQ1VNRU5UQVRJT049RG9jdW1lbnRhemlvbmUKLUZPUk1fTEFCRUxfU09BUF9SRVFVRVNUX0VOVkVMT1BFPUludm9sdWNybyByaWNoaWVzdGEgU09BUDoKLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9FTlZFTE9QRT1JbnZvbHVjcm8gcmlzcG9zdGEgU09BUDoKLUZPUk1fTEFCRUxfR1JPVVBfQUxMX09SREVSSU5HX01PVkVfVVA9U3Bvc3RhIGVsZW1lbnRvIHN1Ci1GT1JNX0xBQkVMX0dST1VQX0FMTF9PUkRFUklOR19NT1ZFX0RPV049U3Bvc3RhIGVsZW1lbnRvIGdpXHUwMGY5Ci1GT1JNX0xBQkVMX0JBU0VfVFlQRT1UaXBvIGJhc2UKLUZPUk1fTEFCRUxfVU5CT1VOREVEPU5vbiBjb2xsZWdhdG8KLUZPUk1fTEFCRUxfTEVOR1RIPUx1bmdoZXp6YQotRk9STV9MQUJFTF9MRU5HVEhfVkFMVUU9WyUxLi4lMl0KLUZPUk1fTEFCRUxfUEFUVEVSTj1Nb2RlbGxvCi1GT1JNX0xBQkVMX1dISVRFU1BBQ0U9U3BhemlvIGJpYW5jbwotRk9STV9MQUJFTF9SQU5HRV9PRl9WQUxVRVM9SW50ZXJ2YWxsbyBkaSB2YWxvcmkKLUZPUk1fTEFCRUxfTUlOX0VYQ0xVU0lWRT0oJTEuLgotRk9STV9MQUJFTF9NSU5fSU5DTFVTSVZFPVslMS4uCi1GT1JNX0xBQkVMX01BWF9FWENMVVNJVkU9JTEpCi1GT1JNX0xBQkVMX01BWF9JTkNMVVNJVkU9JTFdCi1GT1JNX0xBQkVMX1RPVEFMX0RJR0lUUz1DaWZyZSB0b3RhbGkKLUZPUk1fTEFCRUxfRlJBQ1RJT05fRElHSVRTPUNpZnJlIGZyYXppb25lCi1GT1JNX0xBQkVMX09DQ1VSQU5DRT1SaWNvcnJlbnphIGRpCi1GT1JNX0xBQkVMX1VOSU9OX01FTUJFUlM9TWVtYnJpIHVuaW9uZQotRk9STV9MQUJFTF9MSVNUX0lURU1TPUVsZW1lbnRpIGVsZW5jbwotRk9STV9MQUJFTF9FTEVNRU5UUz1FbGVtZW50aQotRk9STV9MQUJFTF9TT0FQX0VOQ19BUlJBWVM9TWF0cmljaSBTT0FQCi1GT1JNX0xBQkVMX0NPTlRFTlQ9Q29udGVudXRvCi1GT1JNX0xBQkVMX0FUT01JQ19OQU1FX1RZUEU9JTEgKCUyKToKLUZPUk1fTEFCRUxfTlVMTD1udWxsCi1GT1JNX0xBQkVMX0dST1VQX05VTUJFUj1HcnVwcG8gJTEKLUZPUk1fTEFCRUxfQ0hPSUNFUz1TY2VsdGUKLUZPUk1fTEFCRUxfTk9USElOR19UT19ESVNQTEFZX0lOX0ZPUk1fVklFVz1Ob24gZXNpc3RlIGFsY3VuIGVsZW1lbnRvIGRhIHZpc3VhbGl6emFyZSBuZWxsYSB2aXN0YSBkZWwgbW9kdWxvLiAgUGFzc2FyZSBhbGxhIHZpc3RhIGRpIG9yaWdpbmUgcGVyIGxhIHJpY2hpZXN0YSBlIGxhIHJpc3Bvc3RhICBTT0FQLgotRk9STV9MQUJFTF9TT0FQX1JFU1BPTlNFX0ZBSUxFRF9WQUxJREFUSU9OX0lOX0ZPUk1fVklFVz1MYSByaXNwb3N0YSBTT0FQIG5vbiBcdTAwZTggcml1c2NpdGEgYWQgZXNlZ3VpcmUgbGEgY29udmFsaWRhIGRlbGxvIHNjaGVtYS4gIFBhc3NhcmUgYWxsYSB2aXN0YSBkaSBvcmlnaW5lIHBlciBsYSByaXNwb3N0YSBTT0FQIGluIGZvcm1hdG8gWE1MLgotRk9STV9MQUJFTF9FTkRfUE9JTlRTPUVuZHBvaW50Ci0KLSMgU291cmNlL0Zvcm0gdmlld3MKLUZPUk1fTElOS19GT1JNPU1vZHVsbwotQUxUX1NXSVRDSF9UT19GT1JNX1ZJRVc9UGFzc2EgYWxsYSB2aXN0YSBkZWwgbW9kdWxvCi1GT1JNX0xJTktfU09VUkNFPU9yaWdpbmUKLUFMVF9TV0lUQ0hfVE9fU09VUkNFX1ZJRVc9UGFzc2EgYWxsYSB2aXN0YSBkaSBvcmlnaW5lCi1GT1JNX0xBQkVMX0ZSQUdNRU5UX1NPQVBfVklFV19DT05URU5UPUNvcnBvIFNvYXA6Ci1CVVRUT05fTEFCRUxfTE9BRD1DYXJpY2EKLUJVVFRPTl9MQUJFTF9TQVZFX0FTPVNhbHZhIGNvbiBub21lLi4uCi1NU0dfUVVFU1RJT05fU1lOQ19WSUVXUz1JbCBmb3JtYXRvIGRlbCBjb250ZW51dG8gZGkgb3JpZ2luZSBwdVx1MDBmMiBlc3NlcmUgYWx0ZXJhdG8gY29tZSByaXN1bHRhdG8gZGVsIHBhc3NhZ2dpbyBhbGxhIHZpc3RhIGRlbCBtb2R1bG8uICBDb250aW51YXJlPwotTVNHX1FVRVNUSU9OX1NZTkNfVklFV1NfREVTUElURV9JTlZBTElEX1NPVVJDRV9DT05URU5UPUlsIGNvbnRlbnV0byBkZWxsYSB2aXN0YSBkaSBvcmlnaW5lIG5vbiBcdTAwZTggcml1c2NpdG8gYWQgZXNlZ3VpcmUgbGEgY29udmFsaWRhIGRlbGxvIHNjaGVtYS4gIEVzZWd1aXJlIHVndWFsbWVudGUgbGEgc2luY3Jvbml6emF6aW9uZT8gIChJbCBjb250ZW51dG8gZGVsbGEgdmlzdGEgZGkgb3JpZ2luZSBwdVx1MDBmMiBlc3NlcmUgbW9kaWZpY2F0bykKLQotIyBGb3JtIGNvbnRyb2wgdGl0bGVzCi1GT1JNX0NPTlRST0xfVElUTEVfRU5BQkxFX0RJU0FCTEVfR1JPVVA9QWJpbGl0YS9EaXNhYmlsaXRhIGdydXBwbwotRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9FTEVNRU5UX0lOX0dST1VQPVNlbGV6aW9uYSBlbGVtZW50byBpbiBncnVwcG8KLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfVU5JT05fVFlQRT1TZWxlemlvbmEgdGlwbyBkaSB1bmlvbmUKLUZPUk1fQ09OVFJPTF9USVRMRV9TT0FQX0ZJTEU9RmlsZSBkaSBkYXRpIFNPQVAKLQotIyBYU0QgSW5mb3JtYXRpb24gRGlhbG9nCi1USVRMRV9YU0RfSU5GT1JNQVRJT05fRElBTE9HPUZpbmVzdHJhIGRpIGRpYWxvZ28gc3VsbGUgaW5mb3JtYXppb25pIFhTRAotCi0jIEVycm9yIG1lc3NhZ2VzCi1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDM4OUUgU2VsZXppb25hcmUgYWxtZW5vIHVuIGVsZW1lbnRvLgotTVNHX0VSUk9SX01BWF9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkwRSBWaWVuZSByYWdnaXVudGEgbGEgcmljb3JyZW56YSBtYXNzaW1hLgotTVNHX0VSUk9SX01JTl9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkxRSBWaWVuZSByYWdnaXVudGEgbGEgcmljb3JyZW56YSBtaW5pbWEuCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfRklSU1RfRUxFTUVOVF9VUD1JV0FCMDM5MkUgTCdlbGVtZW50byBzZWxlemlvbmF0byBcdTAwZTggZ2lcdTAwZTAgaWwgcHJpbW8gZGVsIGdydXBwby4KLU1TR19FUlJPUl9DQU5OT1RfTU9WRV9MQVNUX0VMRU1FTlRfRE9XTj1JV0FCMDM5M0UgTCdlbGVtZW50byBzZWxlemlvbmF0byBcdTAwZTggZ2lcdTAwZTAgbCd1bHRpbW8gZGVsIGdydXBwby4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfamEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfamEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkZDE2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2RsX2phLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9V1NETAotCi0jIE5vZGVzCi1OT0RFX05BTUVfV1NETF9NQUlOPVdTREwgXHUzMGUxXHUzMGE0XHUzMGYzCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPVx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9XHUzMGNhXHUzMGQzXHUzMGIyXHUzMGZjXHUzMGJmXHUzMGZjXHUzMGZiXHUzMGM0XHUzMGZjXHUzMGViXHUzMGQwXHUzMGZjCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1cdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPVx1MzBhMlx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGNhXHUzMGZjCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGM0XHUzMGZjXHUzMGViXHUzMGQwXHUzMGZjCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9XHUzMGQ3XHUzMGVkXHUzMGQxXHUzMGM2XHUzMGEzXHUzMGZjXHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0Ci1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPVx1NzJiNlx1NmNjMVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9XHU3MmI2XHU2Y2MxXHUzMGM0XHUzMGZjXHUzMGViXHUzMGQwXHUzMGZjCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1cdTcyYjZcdTZjYzFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLUZSQU1FX1RJVExFX1dTRExfUEVSU1BFQ1RJVkVfQ09OVEVOVD1XU0RMIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNAotRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX1RPT0xCQVI9WFNEIFx1NjBjNVx1NTgzMVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMFx1MzBmYlx1MzBjNFx1MzBmY1x1MzBlYlx1MzBkMFx1MzBmYwotRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX0NPTlRFTlQ9WFNEIFx1NjBjNVx1NTgzMVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMFx1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNAotCi0jIE9wZW5XU0RMQWN0aW9uCi1BTFRfT1BFTl9XU0RMPVdTREwgXHUzMDkyXHU5NThiXHUzMDRmCi1NU0dfRVJST1JfSU5WQUxJRF9XU0RMX1VSTD1JV0FCMDM3OEUgXHU2NzA5XHU1MmI5XHUzMDZhIFdTREwgVVJMIFx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX09QRU5fV1NETD1JV0FCMDM3OUUgJTEgXHUzMDkyXHU5NThiXHUzMDUxXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCi1NU0dfRVJST1JfWFNEX1ZBTElEQVRJT049SVdBQjAzODBFIFhNTCBcdTMwYjlcdTMwYWRcdTMwZmNcdTMwZGVcdTMwNmVcdTU5YTVcdTVmNTNcdTYwMjdcdTY5MWNcdTY3ZmJcdTY2NDJcdTMwNmJcdTMwYThcdTMwZTlcdTMwZmNcdTMwNGNcdTc2N2FcdTc1MWZcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19JTkZPX09QRU5fV1NETF9TVUNDRVNTRlVMPUlXQUIwMzgxSSAlMSBcdTMwNGNcdTZiNjNcdTVlMzhcdTMwNmJcdTk1OGJcdTMwNGRcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIKLQotIyBXU0RMIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfREVUQUlMUz1XU0RMIFx1OGE3M1x1N2QzMAotRk9STV9MQUJFTF9XU0RMX0RFVEFJTFNfREVTQz1cdTMwNTNcdTMwNmUgV1NETCBcdTY1ODdcdTY2ZjhcdTMwNmVcdThhNzNcdTdkMzBcdTMwOTJcdTRlZTVcdTRlMGJcdTMwNmJcdTc5M2FcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDdlXHUzMDVmXHUzMDZmXHUzMGQwXHUzMGE0XHUzMGYzXHUzMGM3XHUzMGEzXHUzMGYzXHUzMGIwXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDAxXHUzMDVkXHUzMDZlXHU4YTczXHU3ZDMwXHUzMDkyXHU1M2MyXHU3MTY3XHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyCi0KLSMgV1NETCBTZXJ2aWNlIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfU0VSVklDRV9ERVRBSUxTPVdTREwgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHU4YTczXHU3ZDMwCi1GT1JNX0xBQkVMX1NFUlZJQ0VfREVUQUlMU19ERVNDPVx1MzA1M1x1MzA2ZSAmbHQ7c2VydmljZSZndDsgXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZlXHU4YTczXHU3ZDMwXHUzMDZmXHU0ZWU1XHU0ZTBiXHUzMDZlXHUzMDY4XHUzMDRhXHUzMDhhXHUzMDY3XHUzMDU5XHUzMDAyIFx1MzBkMFx1MzBhNFx1MzBmM1x1MzBjN1x1MzBhM1x1MzBmM1x1MzBiMFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzAwMVx1MzA1ZFx1MzA2ZVx1NjRjZFx1NGY1Y1x1MzA5Mlx1NTNjMlx1NzE2N1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotCi0jIFdTREwgQmluZGluZyBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX0JJTkRJTkdfREVUQUlMUz1XU0RMIFx1MzBkMFx1MzBhNFx1MzBmM1x1MzBjN1x1MzBhM1x1MzBmM1x1MzBiMFx1OGE3M1x1N2QzMAotRk9STV9MQUJFTF9CSU5ESU5HX0RFVEFJTFNfREVTQz08c3Ryb25nPiUxPC9zdHJvbmc+ICAmbHQ7YmluZGluZyZndDsgXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZlXHU4YTczXHU3ZDMwXHUzMDZmXHU0ZWU1XHU0ZTBiXHUzMDZlXHUzMDY4XHUzMDRhXHUzMDhhXHUzMDY3XHUzMDU5XHUzMDAyIFx1NjRjZFx1NGY1Y1x1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA1ZFx1MzA2ZVx1MzBkMVx1MzBlOVx1MzBlMVx1MzBmY1x1MzBiZlx1MzBmY1x1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzAwMVx1MzA1ZFx1MzA2ZVx1NjRjZFx1NGY1Y1x1MzA5Mlx1NTQ3Y1x1MzA3M1x1NTFmYVx1MzA1OVx1MzA0Ylx1MzAwMVx1MzA3ZVx1MzA1Zlx1MzA2Zlx1OGZmZFx1NTJhMFx1MzA2ZVx1MzBhOFx1MzBmM1x1MzBjOVx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOFx1MzA5Mlx1NjMwN1x1NWI5YVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotCi0jIEludm9rZVdTRExPcGVyYXRpb25BY3Rpb24KLUFMVF9JTlZPS0VfV1NETF9PUEVSQVRJT049V1NETCBcdTY0Y2RcdTRmNWNcdTMwNmVcdThkNzdcdTUyZDUKLU1TR19FUlJPUl9VTkFCTEVfVE9fQ09OTkVDVD1JV0FCMDM4MkUgJTEgXHUzMDZiXHU2M2E1XHU3ZDlhXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCi1NU0dfRVJST1JfVkFMSURBVElOR19QQVJBTUVURVI9SVdBQjAzODNFICUxIFx1MzA5Mlx1NjkxY1x1NjdmYlx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Ylx1MzA2OFx1MzA0ZFx1MzA2Ylx1MzBhOFx1MzBlOVx1MzBmY1x1MzA0Y1x1NzY3YVx1NzUxZlx1MzA1N1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotCi0jIFdTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0RMX1RPX0ZBVk9SSVRFUz1XU0RMIFx1MzA5Mlx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2Ylx1OGZmZFx1NTJhMAotTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUz1JV0FCMDM4NEUgJTEgXHUzMDZmXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHUzMDU5XHUzMDY3XHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM4NUUgJTEgXHUzMDkyXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCi1NU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUw9SVdBQjAzODZJICUxIFx1MzA0Y1x1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2Ylx1OGZmZFx1NTJhMFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1OVx1MzAwMgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZmXHUzMDU5XHUzMDY3XHUzMDZiXHU1YjU4XHU1NzI4XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyICBcdTRlMGFcdTY2ZjhcdTMwNGRcdTMwNTdcdTMwN2VcdTMwNTlcdTMwNGI/Ci0KLSMgUmVmcmVzaFdTRExBY3Rpb24KLU1TR19JTkZPX1JFRlJFU0hfV1NETF9TVUNDRVNTRlVMPUlXQUIwMzg3SSAlMSBcdTMwNGNcdTY3MDBcdTY1YjBcdTg4NjhcdTc5M2FcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19RVUVTVElPTl9SRU1PVkVfV1NETF9OT0RFPSUxIFx1MzA2Zlx1ODllM1x1NmM3YVx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0Zlx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiAgXHUzMGFmXHUzMGVhXHUzMGEyXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPwotCi0jIFVwZGF0ZVdTRExCaW5kaW5nQWN0aW9uCi1NU0dfSU5GT19VUERBVEVfV1NETF9CSU5ESU5HX1NVQ0NFU1NGVUw9SVdBQjAzODhJIFx1MzBhOFx1MzBmM1x1MzBjOVx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOFx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1NjZmNFx1NjViMFx1MzA1NVx1MzA4Y1x1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NETD1XU0RMIFx1NjZmOFx1NWYwZlx1MzA5Mlx1OTU4Ylx1MzA0ZgotRk9STV9USVRMRV9XU0RMX0RFVEFJTFM9V1NETCBcdThhNzNcdTdkMzBcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfV1NETF9TRVJWSUNFX0RFVEFJTFM9V1NETCBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdThhNzNcdTdkMzBcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfV1NETF9CSU5ESU5HX0RFVEFJTFM9V1NETCBcdTMwZDBcdTMwYTRcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZjNcdTMwYjBcdThhNzNcdTdkMzBcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfSU5WT0tFX1dTRExfT1BFUkFUSU9OPVdTREwgXHU2NGNkXHU0ZjVjXHU2NmY4XHU1ZjBmCi0KLSMgRm9ybSBMYWJlbHMKLUZPUk1fTEFCRUxfT1BFTl9XU0RMX0RFU0M9V1NETCBcdTY1ODdcdTY2ZjhcdTMwNmUgVVJMIFx1MzA5Mlx1NTE2NVx1NTI5Ylx1MzA1N1x1MzAwMVx1MzAwYzxzdHJvbmc+XHU1YjlmXHU4ODRjPC9zdHJvbmc+XHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHU2M2EyXHU3ZDIyXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyCi1GT1JNX0xBQkVMX1NFUlZJQ0VTPVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOQotRk9STV9MQUJFTF9CSU5ESU5HUz1cdTMwZDBcdTMwYTRcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZjNcdTMwYjAKLUZPUk1fTEFCRUxfT1BFUkFUSU9OUz1cdTY0Y2RcdTRmNWMKLUZPUk1fTEFCRUxfQklORElOR19UWVBFPVx1MzBiZlx1MzBhNFx1MzBkNwotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfVU5TVVBQT1JURUQ9XHU5NzVlXHUzMGI1XHUzMGRkXHUzMGZjXHUzMGM4Ci1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9TT0FQPVNPQVAKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX0hUVFBfR0VUPUhUVFAgR0VUCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX1BPU1Q9SFRUUCBQT1NUCi1GT1JNX0xBQkVMX05BTUU9XHU1NDBkXHU1MjRkCi1GT1JNX0xBQkVMX0RPQ1VNRU5UQVRJT049XHUzMGM5XHUzMGFkXHUzMGU1XHUzMGUxXHUzMGYzXHUzMGM2XHUzMGZjXHUzMGI3XHUzMGU3XHUzMGYzCi1GT1JNX0xBQkVMX0VORFBPSU5UPVx1MzBhOFx1MzBmM1x1MzBjOVx1MzBkZFx1MzBhNFx1MzBmM1x1MzBjOAotRk9STV9MQUJFTF9JTlZPS0VfV1NETF9PUEVSQVRJT05fREVTQz1cdTMwNTNcdTMwNmUgV1NETCBcdTY0Y2RcdTRmNWNcdTMwNmVcdTMwZDFcdTMwZTlcdTMwZTFcdTMwZmNcdTMwYmZcdTMwZmNcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwMDFcdTMwMGM8c3Ryb25nPlx1NWI5Zlx1ODg0YzwvU3Ryb25nPlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1OGQ3N1x1NTJkNVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotRk9STV9MSU5LX0FERD1cdThmZmRcdTUyYTAKLUZPUk1fTElOS19SRU1PVkU9XHU5NjY0XHU1M2JiCi1GT1JNX0xBQkVMX1ZBTFVFUz1cdTUwMjQKLUZPUk1fTEFCRUxfRU5BQkxFX0RJU0FCTEVfR1JPVVA9XHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDkyXHU0ZjdmXHU3NTI4XHU1M2VmXHU4MGZkL1x1NGY3Zlx1NzUyOFx1NGUwZFx1NTNlZlx1MzA2Ylx1MzA1OVx1MzA4YgotRk9STV9MQUJFTF9VTklPTl9UWVBFPVx1NTE3MVx1NzUyOFx1NGY1M1x1MzBiZlx1MzBhNFx1MzBkNwotRk9STV9MQUJFTF9MQU5HVUFHRT1cdThhMDBcdThhOWUKLUZPUk1fTEFCRUxfWFNEX0FQUExJQ0FUSU9OX0lORk9STUFUSU9OPVx1MzBhMlx1MzBkN1x1MzBlYVx1MzBiMVx1MzBmY1x1MzBiN1x1MzBlN1x1MzBmM1x1NjBjNVx1NTgzMQotRk9STV9MQUJFTF9YU0RfRE9DVU1FTlRBVElPTj1cdTMwYzlcdTMwYWRcdTMwZTVcdTMwZTFcdTMwZjNcdTMwYzZcdTMwZmNcdTMwYjdcdTMwZTdcdTMwZjMKLUZPUk1fTEFCRUxfU09BUF9SRVFVRVNUX0VOVkVMT1BFPVNPQVAgXHU4OTgxXHU2YzQyXHUzMGE4XHUzMGYzXHUzMGQ5XHUzMGVkXHUzMGZjXHUzMGQ3OgotRk9STV9MQUJFTF9TT0FQX1JFU1BPTlNFX0VOVkVMT1BFPVNPQVAgXHU1ZmRjXHU3YjU0XHUzMGE4XHUzMGYzXHUzMGQ5XHUzMGVkXHUzMGZjXHUzMGQ3OgotRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9VUD1cdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzhcdTMwOTJcdTRlMGFcdTMwNmJcdTc5ZmJcdTUyZDUKLUZPUk1fTEFCRUxfR1JPVVBfQUxMX09SREVSSU5HX01PVkVfRE9XTj1cdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzhcdTMwOTJcdTRlMGJcdTMwNmJcdTc5ZmJcdTUyZDUKLUZPUk1fTEFCRUxfQkFTRV9UWVBFPVx1NTdmYVx1NjcyY1x1NTc4YgotRk9STV9MQUJFTF9VTkJPVU5ERUQ9XHUzMGEyXHUzMGYzXHUzMGQwXHUzMGE2XHUzMGYzXHUzMGM5Ci1GT1JNX0xBQkVMX0xFTkdUSD1cdTk1NzdcdTMwNTUKLUZPUk1fTEFCRUxfTEVOR1RIX1ZBTFVFPVslMS4uJTJdCi1GT1JNX0xBQkVMX1BBVFRFUk49XHUzMGQxXHUzMGJmXHUzMGZjXHUzMGYzCi1GT1JNX0xBQkVMX1dISVRFU1BBQ0U9XHU3YTdhXHU3NjdkXHU2NTg3XHU1YjU3Ci1GT1JNX0xBQkVMX1JBTkdFX09GX1ZBTFVFUz1cdTUwMjRcdTMwNmVcdTdiYzRcdTU2ZjIKLUZPUk1fTEFCRUxfTUlOX0VYQ0xVU0lWRT0oJTEuLgotRk9STV9MQUJFTF9NSU5fSU5DTFVTSVZFPVslMS4uCi1GT1JNX0xBQkVMX01BWF9FWENMVVNJVkU9JTEpCi1GT1JNX0xBQkVMX01BWF9JTkNMVVNJVkU9JTFdCi1GT1JNX0xBQkVMX1RPVEFMX0RJR0lUUz1cdTU0MDhcdThhMDhcdTY4NDFcdTY1NzAKLUZPUk1fTEFCRUxfRlJBQ1RJT05fRElHSVRTPVx1NWMwZlx1NjU3MFx1Njg0MQotRk9STV9MQUJFTF9PQ0NVUkFOQ0U9XHUzMGFhXHUzMGFiXHUzMGVjXHUzMGYzXHUzMGI5Ci1GT1JNX0xBQkVMX1VOSU9OX01FTUJFUlM9XHU1MTcxXHU3NTI4XHU0ZjUzXHUzMGUxXHUzMGYzXHUzMGQwXHUzMGZjCi1GT1JNX0xBQkVMX0xJU1RfSVRFTVM9XHUzMGVhXHUzMGI5XHUzMGM4XHU5ODA1XHU3NmVlCi1GT1JNX0xBQkVMX0VMRU1FTlRTPVx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOAotRk9STV9MQUJFTF9TT0FQX0VOQ19BUlJBWVM9U09BUCBcdTkxNGRcdTUyMTcKLUZPUk1fTEFCRUxfQ09OVEVOVD1cdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzQKLUZPUk1fTEFCRUxfQVRPTUlDX05BTUVfVFlQRT0lMSAoJTIpOgotRk9STV9MQUJFTF9OVUxMPU5VTEwKLUZPUk1fTEFCRUxfR1JPVVBfTlVNQkVSPVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkNyAlMQotRk9STV9MQUJFTF9DSE9JQ0VTPVx1OTA3OFx1NjI5ZVx1OTgwNVx1NzZlZQotRk9STV9MQUJFTF9OT1RISU5HX1RPX0RJU1BMQVlfSU5fRk9STV9WSUVXPVx1NjZmOFx1NWYwZlx1MzBkM1x1MzBlNVx1MzBmY1x1MzA2Ylx1MzA2Zlx1ODg2OFx1NzkzYVx1MzA1OVx1MzA4Ylx1MzA4Mlx1MzA2ZVx1MzA0Y1x1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMiAgU09BUCBcdTg5ODFcdTZjNDJcdTMwNGFcdTMwODhcdTMwNzNcdTVmZGNcdTdiNTRcdTMwNmJcdTMwNjRcdTMwNDRcdTMwNjZcdTMwNmZcdTMwMDFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNmJcdTUyMDdcdTMwOGFcdTY2ZmZcdTMwNDhcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9GQUlMRURfVkFMSURBVElPTl9JTl9GT1JNX1ZJRVc9U09BUCBcdTVmZGNcdTdiNTRcdTMwNGNcdTMwYjlcdTMwYWRcdTMwZmNcdTMwZGVcdTMwNmVcdTY5MWNcdThhM2NcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgIFhNTCBcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZGVcdTMwYzNcdTMwYzhcdTMwNmUgU09BUCBcdTVmZGNcdTdiNTRcdTMwNmJcdTMwNjRcdTMwNDRcdTMwNjZcdTMwNmZcdTMwMDFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNmJcdTUyMDdcdTMwOGFcdTY2ZmZcdTMwNDhcdTMwNjZcdTMwNGZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIKLUZPUk1fTEFCRUxfRU5EX1BPSU5UUz1cdTMwYThcdTMwZjNcdTMwYzlcdTMwZGRcdTMwYTRcdTMwZjNcdTMwYzgKLQotIyBTb3VyY2UvRm9ybSB2aWV3cwotRk9STV9MSU5LX0ZPUk09XHU2NmY4XHU1ZjBmCi1BTFRfU1dJVENIX1RPX0ZPUk1fVklFVz1cdTY2ZjhcdTVmMGZcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNzhcdTMwNmVcdTUyMDdcdTMwOGFcdTY2ZmZcdTMwNDgKLUZPUk1fTElOS19TT1VSQ0U9XHUzMGJkXHUzMGZjXHUzMGI5Ci1BTFRfU1dJVENIX1RPX1NPVVJDRV9WSUVXPVx1MzBiZFx1MzBmY1x1MzBiOVx1MzBmYlx1MzBkM1x1MzBlNVx1MzBmY1x1MzA3OFx1MzA2ZVx1NTIwN1x1MzA4YVx1NjZmZlx1MzA0OAotRk9STV9MQUJFTF9GUkFHTUVOVF9TT0FQX1ZJRVdfQ09OVEVOVD1TT0FQIFx1MzBkY1x1MzBjN1x1MzBhMzoKLUJVVFRPTl9MQUJFTF9MT0FEPVx1MzBlZFx1MzBmY1x1MzBjOQotQlVUVE9OX0xBQkVMX1NBVkVfQVM9XHU1MjI1XHU1NDBkXHU0ZmRkXHU3YmExLi4uCi1NU0dfUVVFU1RJT05fU1lOQ19WSUVXUz1cdTY2ZjhcdTVmMGZcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNzhcdTMwNmVcdTUyMDdcdTMwOGFcdTY2ZmZcdTMwNDhcdTMwNmJcdTMwODhcdTMwNjNcdTMwNjZcdTMwMDFcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNmVcdTMwZDVcdTMwYTlcdTMwZmNcdTMwZGVcdTMwYzNcdTMwYzhcdTMwNGNcdTU5MDlcdTY2ZjRcdTMwNTVcdTMwOGNcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTlcdTMwMDIgIFx1N2Q5YVx1ODg0Y1x1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8KLU1TR19RVUVTVElPTl9TWU5DX1ZJRVdTX0RFU1BJVEVfSU5WQUxJRF9TT1VSQ0VfQ09OVEVOVD1cdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNGNcdTMwYjlcdTMwYWRcdTMwZmNcdTMwZGVcdTMwNmVcdTY5MWNcdThhM2NcdTMwNmJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN2VcdTMwNTdcdTMwNWZcdTMwMDIgIFx1NWUzOFx1MzA2Ylx1NTQwY1x1NjcxZlx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8gIChcdTMwYmRcdTMwZmNcdTMwYjlcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmNcdTMwNmVcdTMwYjNcdTMwZjNcdTMwYzZcdTMwZjNcdTMwYzRcdTMwNGNcdTU5MDlcdTY2ZjRcdTMwNTVcdTMwOGNcdTMwOGJcdTU4MzRcdTU0MDhcdTMwNGNcdTMwNDJcdTMwOGFcdTMwN2VcdTMwNTkpCi0KLSMgRm9ybSBjb250cm9sIHRpdGxlcwotRk9STV9DT05UUk9MX1RJVExFX0VOQUJMRV9ESVNBQkxFX0dST1VQPVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA5Mlx1NGY3Zlx1NzUyOFx1NTNlZlx1ODBmZC9cdTRmN2ZcdTc1MjhcdTRlMGRcdTUzZWZcdTMwNmJcdTMwNTlcdTMwOGIKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfRUxFTUVOVF9JTl9HUk9VUD1cdTMwYjBcdTMwZWJcdTMwZmNcdTMwZDdcdTUxODVcdTMwNmVcdTMwYThcdTMwZWNcdTMwZTFcdTMwZjNcdTMwYzhcdTMwOTJcdTkwNzhcdTYyOWUKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfVU5JT05fVFlQRT1cdTUxNzFcdTc1MjhcdTRmNTNcdTMwYmZcdTMwYTRcdTMwZDdcdTMwNmVcdTkwNzhcdTYyOWUKLUZPUk1fQ09OVFJPTF9USVRMRV9TT0FQX0ZJTEU9U09BUCBcdTMwYzdcdTMwZmNcdTMwYmZcdTMwZmJcdTMwZDVcdTMwYTFcdTMwYTRcdTMwZWIKLQotIyBYU0QgSW5mb3JtYXRpb24gRGlhbG9nCi1USVRMRV9YU0RfSU5GT1JNQVRJT05fRElBTE9HPVhTRCBcdTYwYzVcdTU4MzFcdTMwYzBcdTMwYTRcdTMwYTJcdTMwZWRcdTMwYjAKLQotIyBFcnJvciBtZXNzYWdlcwotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzODlFIFx1NWMxMVx1MzA2YVx1MzA0Zlx1MzA2OFx1MzA4MiAxIFx1MzA2NFx1MzA2ZVx1OTgwNVx1NzZlZVx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotTVNHX0VSUk9SX01BWF9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkwRSBcdTY3MDBcdTU5MjdcdTMwYWFcdTMwYWJcdTMwZWNcdTMwZjNcdTMwYjlcdTMwNmJcdTkwNTRcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19FUlJPUl9NSU5fT0NDVVJTX1ZJT0xBVElPTj1JV0FCMDM5MUUgXHU2NzAwXHU1YzBmXHUzMGFhXHUzMGFiXHUzMGVjXHUzMGYzXHUzMGI5XHUzMDZiXHU5MDU0XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfRklSU1RfRUxFTUVOVF9VUD1JV0FCMDM5MkUgXHU5MDc4XHU2MjllXHUzMDU1XHUzMDhjXHUzMDVmXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDRjXHUzMDU5XHUzMDY3XHUzMDZiXHUzMDVkXHUzMDZlXHUzMGIwXHUzMGViXHUzMGZjXHUzMGQ3XHUzMDZlXHU2NzAwXHU1MjFkXHUzMDZiXHUzMGE4XHUzMGVjXHUzMGUxXHUzMGYzXHUzMGM4XHUzMDZiXHUzMDZhXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfTEFTVF9FTEVNRU5UX0RPV049SVdBQjAzOTNFIFx1OTA3OFx1NjI5ZVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2Zlx1MzA1OVx1MzA2N1x1MzA2Ylx1MzA1ZFx1MzA2ZVx1MzBiMFx1MzBlYlx1MzBmY1x1MzBkN1x1MzA2ZVx1NjcwMFx1NWY4Y1x1MzA2ZVx1MzBhOFx1MzBlY1x1MzBlMVx1MzBmM1x1MzBjOFx1MzA2Ylx1MzA2YVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF9rby5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF9rby5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmI5N2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfa28ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0RMCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9XU0RMX01BSU49V1NETCBcdWFlMzBcdWJjZjgKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9XHViMTI0XHViZTQ0XHVhYzhjXHVjNzc0XHVkMTMwIFx1Y2VlOFx1ZDE0Y1x1Yzc3NFx1YjEwOAotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9XHViMTI0XHViZTQ0XHVhYzhjXHVjNzc0XHVkMTMwIFx1YjNjNFx1YWQ2YyBcdWJhYThcdWM3NGMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPVx1YjEyNFx1YmU0NFx1YWM4Y1x1Yzc3NFx1ZDEzMCBcdWNlZThcdWQxNTBcdWNlMjAKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPVx1Yzg3MFx1Y2U1OCBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPVx1ZDJiOVx1YzEzMSBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1cdWQyYjlcdWMxMzEgXHViM2M0XHVhZDZjIFx1YmFhOFx1Yzc0YwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPVx1ZDJiOVx1YzEzMSBcdWNlZThcdWQxNTBcdWNlMjAKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9XHVjMGMxXHVkMGRjIFx1Y2VlOFx1ZDE0Y1x1Yzc3NFx1YjEwOAotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9XHVjMGMxXHVkMGRjIFx1YjNjNFx1YWQ2YyBcdWJhYThcdWM3NGMKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVx1YzBjMVx1ZDBkYyBcdWNlZThcdWQxNTBcdWNlMjAKLUZSQU1FX1RJVExFX1dTRExfUEVSU1BFQ1RJVkVfQ09OVEVOVD1XU0RMIFx1ZDM5OFx1Yzc3NFx1YzljMCBcdWNlZThcdWQxNTBcdWNlMjAKLUZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9UT09MQkFSPVhTRCBcdWM4MTVcdWJjZjQgXHViMzAwXHVkNjU0IFx1YzBjMVx1Yzc5MCBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi1GUkFNRV9USVRMRV9YU0RfSU5GT1JNQVRJT05fQ09OVEVOVD1YU0QgXHVjODE1XHViY2Y0IFx1YjMwMFx1ZDY1NCBcdWMwYzFcdWM3OTAgXHVjZWU4XHVkMTUwXHVjZTIwCi0KLSMgT3BlbldTRExBY3Rpb24KLUFMVF9PUEVOX1dTREw9V1NETCBcdWM1ZjRcdWFlMzAKLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMPUlXQUIwMzc4RSBcdWM2MmNcdWJjMTRcdWI5NzggV1NETCBVUkxcdWM3NDQgXHVjNzg1XHViODI1XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotTVNHX0VSUk9SX09QRU5fV1NETD1JV0FCMDM3OUUgJTFcdWM3NDQoXHViOTdjKSBcdWM1ZjQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9YU0RfVkFMSURBVElPTj1JV0FCMDM4MEUgWE1MIFx1YzJhNFx1ZDBhNFx1YjljOFx1Yjk3YyBcdWM3MjBcdWQ2YThcdWMxMzEgXHVhYzgwXHVjOTlkXHVkNTU4XHViMjk0IFx1YjNkOVx1YzU0OCBcdWM2MjRcdWI5NThcdWFjMDAgXHViYzFjXHVjMGRkXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fT1BFTl9XU0RMX1NVQ0NFU1NGVUw9SVdBQjAzODFJICUxXHVjNzc0KFx1YWMwMCkgXHVjNWY0XHViODM4XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIFdTREwgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9ERVRBSUxTPVdTREwgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi1GT1JNX0xBQkVMX1dTRExfREVUQUlMU19ERVNDPVx1Yzc3NCBXU0RMIFx1YmIzOFx1YzExY1x1Yzc1OCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NzQgXHVjNTQ0XHViNzk4IFx1ZDQ1Y1x1YzJkY1x1YjQyOVx1YjJjOFx1YjJlNC4gXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YmNmNFx1YjgyNFx1YmE3NCBcdWMxMWNcdWJlNDRcdWMyYTRcdWIwOTggXHViYzE0XHVjNzc4XHViNTI5XHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBXU0RMIFNlcnZpY2UgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9TRVJWSUNFX0RFVEFJTFM9V1NETCBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi1GT1JNX0xBQkVMX1NFUlZJQ0VfREVUQUlMU19ERVNDPVx1Yzc3NCAmbHQ7XHVjMTFjXHViZTQ0XHVjMmE0Jmd0OyBcdWM2OTRcdWMxOGNcdWM3NTggXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkXHVjNzc0IFx1YzU0NFx1Yjc5OCBcdWQ0NWNcdWMyZGNcdWI0MjlcdWIyYzhcdWIyZTQuIFx1Yzg3MFx1Yzc5MVx1Yzc0NCBcdWJjZjRcdWI4MjRcdWJhNzQgXHViYzE0XHVjNzc4XHViNTI5XHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBXU0RMIEJpbmRpbmcgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9CSU5ESU5HX0RFVEFJTFM9V1NETCBcdWJjMTRcdWM3NzhcdWI1MjkgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi1GT1JNX0xBQkVMX0JJTkRJTkdfREVUQUlMU19ERVNDPVx1Yzc3NCA8c3Ryb25nPiUxPC9zdHJvbmc+ICZsdDtcdWJjMTRcdWM3NzhcdWI1MjkmZ3Q7IFx1YzY5NFx1YzE4Y1x1Yzc1OCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmRcdWM3NzQgXHVjNTQ0XHViNzk4IFx1ZDQ1Y1x1YzJkY1x1YjQyOVx1YjJjOFx1YjJlNC4gXHVjODcwXHVjNzkxXHVjNzQ0IFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzVlYyBcdWI5ZTRcdWFjMWNcdWJjYzBcdWMyMThcdWI5N2MgXHVjYzQ0XHVjNmIwXHVhY2UwIFx1ZDYzOFx1Y2Q5Y1x1ZDU1OFx1YWM3MFx1YjA5OCBcdWNkOTRcdWFjMDAgXHVjNWQ0XHViNGRjXHVkM2VjXHVjNzc4XHVkMmI4XHViOTdjIFx1YzljMFx1YzgxNVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBJbnZva2VXU0RMT3BlcmF0aW9uQWN0aW9uCi1BTFRfSU5WT0tFX1dTRExfT1BFUkFUSU9OPVdTREwgXHVjODcwXHVjNzkxIFx1ZDYzOFx1Y2Q5YwotTVNHX0VSUk9SX1VOQUJMRV9UT19DT05ORUNUPUlXQUIwMzgyRSAlMVx1YzVkMCBcdWM1ZjBcdWFjYjBcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9WQUxJREFUSU5HX1BBUkFNRVRFUj1JV0FCMDM4M0UgJTEgXHVjNzIwXHVkNmE4XHVjMTMxIFx1YWM4MFx1Yzk5ZCBcdWM5MTFcdWM1ZDAgXHVjNjI0XHViOTU4IFx1YmMxY1x1YzBkZAotCi0jIFdTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0RMX1RPX0ZBVk9SSVRFUz1XU0RMXHVjNzQ0IFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMFx1YzVkMCBcdWNkOTRcdWFjMDAKLU1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFM9SVdBQjAzODRFICUxXHVjNzc0KFx1YWMwMCkgXHVjNzc0XHViYmY4IFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMFx1YzVkMCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM4NUUgJTFcdWM3NDQoXHViOTdjKSBcdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWM1ZDAgXHVjZDk0XHVhYzAwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUw9SVdBQjAzODZJICUxXHVjNzc0KFx1YWMwMCkgXHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPVx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMFx1YWMwMCBcdWM3NzRcdWJiZjggXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LiBcdWFjYjlcdWNjZDBcdWM0ZjBcdWMyZGNcdWFjYTBcdWMyYjVcdWIyYzhcdWFlNGM/Ci0KLSMgUmVmcmVzaFdTRExBY3Rpb24KLU1TR19JTkZPX1JFRlJFU0hfV1NETF9TVUNDRVNTRlVMPUlXQUIwMzg3SSAlMVx1Yzc0NChcdWI5N2MpIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNjZTRcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1dTRExfTk9ERT0lMVx1Yzc0NChcdWI5N2MpIFx1YjM1NCBcdWM3NzRcdWMwYzEgXHVkNTc0XHVjMTFkXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzBhZFx1YzgxY1x1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8KLQotIyBVcGRhdGVXU0RMQmluZGluZ0FjdGlvbgotTVNHX0lORk9fVVBEQVRFX1dTRExfQklORElOR19TVUNDRVNTRlVMPUlXQUIwMzg4SSBcdWM1ZDRcdWI0ZGNcdWQzZWNcdWM3NzhcdWQyYjhcdWFjMDAgXHVhYzMxXHVjMmUwXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NETD1XU0RMIFx1YzU5MVx1YzJkZCBcdWM1ZjRcdWFlMzAKLUZPUk1fVElUTEVfV1NETF9ERVRBSUxTPVdTREwgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YzU5MVx1YzJkZAotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFx1YzExY1x1YmU0NFx1YzJhNCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHVjNTkxXHVjMmRkCi1GT1JNX1RJVExFX1dTRExfQklORElOR19ERVRBSUxTPVdTREwgXHViYzE0XHVjNzc4XHViNTI5IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfSU5WT0tFX1dTRExfT1BFUkFUSU9OPVdTREwgXHVjODcwXHVjNzkxIFx1YzU5MVx1YzJkZAotCi0jIEZvcm0gTGFiZWxzCi1GT1JNX0xBQkVMX09QRU5fV1NETF9ERVNDPVdTREwgXHViYjM4XHVjMTFjXHVjNzU4IFVSTFx1Yzc0NCBcdWM3ODVcdWI4MjVcdWQ1NThcdWFjZTAgPHN0cm9uZz5cdWM3NzRcdWIzZDk8L3N0cm9uZz5cdWM3NDQgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1ZDBkMFx1YzBjOVx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLUZPUk1fTEFCRUxfU0VSVklDRVM9XHVjMTFjXHViZTQ0XHVjMmE0Ci1GT1JNX0xBQkVMX0JJTkRJTkdTPVx1YmMxNFx1Yzc3OFx1YjUyOQotRk9STV9MQUJFTF9PUEVSQVRJT05TPVx1Yzg3MFx1Yzc5MQotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEU9XHVjNzIwXHVkNjE1Ci1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9VTlNVUFBPUlRFRD1cdWM5YzBcdWM2ZDBcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzRjCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9TT0FQPVNPQVAKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX0hUVFBfR0VUPUhUVFAgR0VUCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX1BPU1Q9SFRUUCBQT1NUCi1GT1JNX0xBQkVMX05BTUU9XHVjNzc0XHViOTg0Ci1GT1JNX0xBQkVMX0RPQ1VNRU5UQVRJT049XHViYjM4XHVjMTFjCi1GT1JNX0xBQkVMX0VORFBPSU5UPVx1YzVkNFx1YjRkY1x1ZDNlY1x1Yzc3OFx1ZDJiOAotRk9STV9MQUJFTF9JTlZPS0VfV1NETF9PUEVSQVRJT05fREVTQz1cdWM3NzQgV1NETCBcdWM4NzBcdWM3OTFcdWM3NTggXHViOWU0XHVhYzFjXHViY2MwXHVjMjE4XHViOTdjIFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YWNlMCA8c3Ryb25nPlx1Yzc3NFx1YjNkOTwvU3Ryb25nPlx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHVkNjM4XHVjZDljXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotRk9STV9MSU5LX0FERD1cdWNkOTRcdWFjMDAKLUZPUk1fTElOS19SRU1PVkU9XHVjODFjXHVhYzcwCi1GT1JNX0xBQkVMX1ZBTFVFUz1cdWFjMTIKLUZPUk1fTEFCRUxfRU5BQkxFX0RJU0FCTEVfR1JPVVA9XHVhZGY4XHViOGY5IFx1YzBhY1x1YzZhOS9cdWMwYWNcdWM2YTkgXHVjNTQ4XHVkNTY4Ci1GT1JNX0xBQkVMX1VOSU9OX1RZUEU9XHVjNzIwXHViMmM4XHVjNjI4IFx1YzcyMFx1ZDYxNQotRk9STV9MQUJFTF9MQU5HVUFHRT1cdWM1YjhcdWM1YjQKLUZPUk1fTEFCRUxfWFNEX0FQUExJQ0FUSU9OX0lORk9STUFUSU9OPVx1Yzc1MVx1YzZhOVx1ZDUwNFx1Yjg1Y1x1YWRmOFx1YjdhOCBcdWM4MTVcdWJjZjQKLUZPUk1fTEFCRUxfWFNEX0RPQ1VNRU5UQVRJT049XHViYjM4XHVjMTFjCi1GT1JNX0xBQkVMX1NPQVBfUkVRVUVTVF9FTlZFTE9QRT1TT0FQIFx1YzY5NFx1Y2NhZCBcdWM1ZDRcdWJjYThcdWI4NWNcdWQ1MDQoZW52ZWxvcGUpCi1GT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRU5WRUxPUEU9U09BUCBcdWM3NTFcdWIyZjUgXHVjNWQ0XHViY2E4XHViODVjXHVkNTA0KGVudmVsb3BlKQotRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9VUD1cdWM2OTRcdWMxOGNcdWI5N2MgXHVjNzA0XHViODVjIFx1Yzc3NFx1YjNkOQotRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9ET1dOPVx1YzY5NFx1YzE4Y1x1Yjk3YyBcdWM1NDRcdWI3OThcdWI4NWMgXHVjNzc0XHViM2Q5Ci1GT1JNX0xBQkVMX0JBU0VfVFlQRT1cdWFlMzBcdWJjZjggXHVjNzIwXHVkNjE1Ci1GT1JNX0xBQkVMX1VOQk9VTkRFRD1cdWJjMTRcdWM3NzhcdWI0ZGNcdWI0MThcdWM5YzAgXHVjNTRhXHVjNzRjCi1GT1JNX0xBQkVMX0xFTkdUSD1cdWFlMzhcdWM3NzQKLUZPUk1fTEFCRUxfTEVOR1RIX1ZBTFVFPVslMS4uJTJdCi1GT1JNX0xBQkVMX1BBVFRFUk49XHVkMzI4XHVkMTM0Ci1GT1JNX0xBQkVMX1dISVRFU1BBQ0U9XHVhY2Y1XHViYzMxCi1GT1JNX0xBQkVMX1JBTkdFX09GX1ZBTFVFUz1cdWFjMTJcdWM3NTggXHViYzk0XHVjNzA0Ci1GT1JNX0xBQkVMX01JTl9FWENMVVNJVkU9KCUxLi4KLUZPUk1fTEFCRUxfTUlOX0lOQ0xVU0lWRT1bJTEuLgotRk9STV9MQUJFTF9NQVhfRVhDTFVTSVZFPSUxKQotRk9STV9MQUJFTF9NQVhfSU5DTFVTSVZFPSUxXQotRk9STV9MQUJFTF9UT1RBTF9ESUdJVFM9XHVjZDFkIFx1YzIyYlx1Yzc5MAotRk9STV9MQUJFTF9GUkFDVElPTl9ESUdJVFM9XHVjMThjXHVjMjE4IFx1Yzc5MFx1YjlhYwotRk9STV9MQUJFTF9PQ0NVUkFOQ0U9XHViYzFjXHVjMGRkCi1GT1JNX0xBQkVMX1VOSU9OX01FTUJFUlM9XHVjNzIwXHViMmM4XHVjNjI4IFx1YWQ2Y1x1YzEzMVx1YzZkMAotRk9STV9MQUJFTF9MSVNUX0lURU1TPVx1ZDU2ZFx1YmFhOSBcdWIwOThcdWM1ZjQKLUZPUk1fTEFCRUxfRUxFTUVOVFM9XHVjNjk0XHVjMThjCi1GT1JNX0xBQkVMX1NPQVBfRU5DX0FSUkFZUz1TT0FQIFx1YmMzMFx1YzVmNAotRk9STV9MQUJFTF9DT05URU5UPVx1Y2VlOFx1ZDE1MFx1Y2UyMAotRk9STV9MQUJFTF9BVE9NSUNfTkFNRV9UWVBFPSUxICglMik6Ci1GT1JNX0xBQkVMX05VTEw9XHViMTEwKG51bGwpCi1GT1JNX0xBQkVMX0dST1VQX05VTUJFUj1cdWFkZjhcdWI4ZjkgJTEKLUZPUk1fTEFCRUxfQ0hPSUNFUz1cdWMxMjBcdWQwZGRcdWMwYWNcdWQ1NmQKLUZPUk1fTEFCRUxfTk9USElOR19UT19ESVNQTEFZX0lOX0ZPUk1fVklFVz1cdWM1OTFcdWMyZGQgXHViY2Y0XHVhZTMwXHVjNWQwIFx1ZDQ1Y1x1YzJkY1x1YjQxOFx1YjI5NCBcdWQ1NmRcdWJhYTlcdWM3NzQgXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LiBTT0FQIFx1YzY5NFx1Y2NhZCBcdWJjMGYgXHVjNzUxXHViMmY1XHVjNzQ0IFx1YzcwNFx1ZDU3NCBcdWMxOGNcdWMyYTQgXHViY2Y0XHVhZTMwXHViODVjIFx1YzgwNFx1ZDY1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9GQUlMRURfVkFMSURBVElPTl9JTl9GT1JNX1ZJRVc9U09BUCBcdWM3NTFcdWIyZjVcdWM3NzQgXHVjMmE0XHVkMGE0XHViOWM4IFx1YzcyMFx1ZDZhOFx1YzEzMSBcdWQ2NTVcdWM3NzhcdWM1ZDAgXHVjMmU0XHVkMzI4XHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LiBYTUwgXHVkNjE1XHVjMmRkXHVjNzNjXHViODVjIFx1YjQxYyBTT0FQIFx1Yzc1MVx1YjJmNVx1Yzc1OCBcdWMxOGNcdWMyYTQgXHViY2Y0XHVhZTMwXHViODVjIFx1YzgwNFx1ZDY1OFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLUZPUk1fTEFCRUxfRU5EX1BPSU5UUz1cdWM1ZDRcdWI0ZGNcdWQzZWNcdWM3NzhcdWQyYjgKLQotIyBTb3VyY2UvRm9ybSB2aWV3cwotRk9STV9MSU5LX0ZPUk09XHVjNTkxXHVjMmRkCi1BTFRfU1dJVENIX1RPX0ZPUk1fVklFVz1cdWM1OTFcdWMyZGQgXHViY2Y0XHVhZTMwXHViODVjIFx1YzgwNFx1ZDY1OAotRk9STV9MSU5LX1NPVVJDRT1cdWMxOGNcdWMyYTQKLUFMVF9TV0lUQ0hfVE9fU09VUkNFX1ZJRVc9XHVjMThjXHVjMmE0IFx1YmNmNFx1YWUzMFx1Yjg1YyBcdWM4MDRcdWQ2NTgKLUZPUk1fTEFCRUxfRlJBR01FTlRfU09BUF9WSUVXX0NPTlRFTlQ9U29hcCBcdWJjZjhcdWJiMzg6Ci1CVVRUT05fTEFCRUxfTE9BRD1cdWI4NWNcdWI0ZGMKLUJVVFRPTl9MQUJFTF9TQVZFX0FTPVx1YjJlNFx1Yjk3OCBcdWM3NzRcdWI5ODRcdWM3M2NcdWI4NWMgXHVjODAwXHVjN2E1Li4uCi1NU0dfUVVFU1RJT05fU1lOQ19WSUVXUz1cdWMxOGNcdWMyYTQgXHVjZWU4XHVkMTUwXHVjZTIwXHVjNzU4IFx1ZDYxNVx1YzJkZFx1Yzc0MCBcdWM1OTFcdWMyZGQgXHViY2Y0XHVhZTMwXHViODVjIFx1YzgwNFx1ZDY1OFx1ZDU1OFx1YjI5NCBcdWFjYjBcdWFjZmNcdWI4NWMgXHViY2MwXHVhY2JkXHViNDIwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1Y2M5OFx1YjlhY1x1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8KLU1TR19RVUVTVElPTl9TWU5DX1ZJRVdTX0RFU1BJVEVfSU5WQUxJRF9TT1VSQ0VfQ09OVEVOVD1cdWMxOGNcdWMyYTQgXHViY2Y0XHVhZTMwXHVjNzU4IFx1Y2VlOFx1ZDE1MFx1Y2UyMFx1YWMwMCBcdWMyYTRcdWQwYTRcdWI5YzggXHVjNzIwXHVkNmE4XHVjMTMxIFx1ZDY1NVx1Yzc3OFx1YzVkMCBcdWMyZTRcdWQzMjhcdWQ1ODhcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YjNkOVx1YWUzMFx1ZDY1NFx1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8oXHVjMThjXHVjMmE0IFx1YmNmNFx1YWUzMFx1Yzc1OCBcdWNlZThcdWQxNTBcdWNlMjBcdWFjMDAgXHVjMjE4XHVjODE1XHViNDIwIFx1YzIxOCBcdWM3ODhcdWMyYjVcdWIyYzhcdWIyZTQpLgotCi0jIEZvcm0gY29udHJvbCB0aXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9FTkFCTEVfRElTQUJMRV9HUk9VUD1cdWFkZjhcdWI4ZjkgXHVjMGFjXHVjNmE5L1x1YzBhY1x1YzZhOSBcdWM1NDhcdWQ1NjgKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfRUxFTUVOVF9JTl9HUk9VUD1cdWFkZjhcdWI4ZjlcdWM1ZDBcdWMxMWMgXHVjNjk0XHVjMThjIFx1YzEyMFx1ZDBkZAotRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9VTklPTl9UWVBFPVx1YzcyMFx1YjJjOFx1YzYyOCBcdWM3MjBcdWQ2MTUgXHVjMTIwXHVkMGRkCi1GT1JNX0NPTlRST0xfVElUTEVfU09BUF9GSUxFPVNPQVAgXHViMzcwXHVjNzc0XHVkMTMwIFx1ZDMwY1x1Yzc3YwotCi0jIFhTRCBJbmZvcm1hdGlvbiBEaWFsb2cKLVRJVExFX1hTRF9JTkZPUk1BVElPTl9ESUFMT0c9WFNEIFx1YzgxNVx1YmNmNCBcdWIzMDBcdWQ2NTQgXHVjMGMxXHVjNzkwCi0KLSMgRXJyb3IgbWVzc2FnZXMKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzg5RSBcdWNkNWNcdWMxOGNcdWQ1NWMgXHVkNTU4XHViMDk4XHVjNzU4IFx1ZDU2ZFx1YmFhOVx1Yzc0NCBcdWMxMjBcdWQwZGRcdWQ1NThcdWMyZWRcdWMyZGNcdWM2MjQuCi1NU0dfRVJST1JfTUFYX09DQ1VSU19WSU9MQVRJT049SVdBQjAzOTBFIFx1Y2Q1Y1x1YjMwMCBcdWJjMWNcdWMwZGRcdWM1ZDAgXHViM2M0XHViMmVjXHVkNTg4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX01JTl9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkxRSBcdWNkNWNcdWMxOGMgXHViYzFjXHVjMGRkXHVjNWQwIFx1YjNjNFx1YjJlY1x1ZDU4OFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9DQU5OT1RfTU9WRV9GSVJTVF9FTEVNRU5UX1VQPUlXQUIwMzkyRSBcdWMxMjBcdWQwZGRcdWQ1NWMgXHVjNjk0XHVjMThjXHViMjk0IFx1Yzc3NFx1YmJmOCBcdWFkZjhcdWI4ZjlcdWM3NTggXHVjY2FiIFx1YmM4OFx1YzlmOCBcdWM2OTRcdWMxOGNcdWM3ODVcdWIyYzhcdWIyZTQuCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfTEFTVF9FTEVNRU5UX0RPV049SVdBQjAzOTNFIFx1YzEyMFx1ZDBkZFx1ZDU1YyBcdWM2OTRcdWMxOGNcdWIyOTQgXHVjNzc0XHViYmY4IFx1YWRmOFx1YjhmOVx1Yzc1OCBcdWI5YzhcdWM5YzBcdWI5YzkgXHVjNjk0XHVjMThjXHVjNzg1XHViMmM4XHViMmU0LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF9wdF9CUi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmE2ZmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0RMCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9XU0RMX01BSU49UHJpbmNpcGFsIGRvIFdTREwKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9Q29udFx1MDBlYWluZXIgZG8gTmF2ZWdhZG9yCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1CYXJyYSBkZSBGZXJyYW1lbnRhcyBkbyBOYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPUNvbnRlXHUwMGZhZG8gZG8gTmF2ZWdhZG9yCi1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1Db250XHUwMGVhaW5lciBkZSBBXHUwMGU3XHUwMGY1ZXMKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPUNvbnRcdTAwZWFpbmVyIGRlIFByb3ByaWVkYWRlcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPUJhcnJhIGRlIEZlcnJhbWVudGFzIGRlIFByb3ByaWVkYWRlcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPUNvbnRlXHUwMGZhZG8gZGFzIFByb3ByaWVkYWRlcwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1Db250XHUwMGVhaW5lciBkZSBTdGF0dXMKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPUJhcnJhIGRlIEZlcnJhbWVudGFzIGRlIFN0YXR1cwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9Q29udGVcdTAwZmFkbyBkbyBTdGF0dXMKLUZSQU1FX1RJVExFX1dTRExfUEVSU1BFQ1RJVkVfQ09OVEVOVD1Db250ZVx1MDBmYWRvIGRhIFBcdTAwZTFnaW5hIGRvIFdTREwKLUZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9UT09MQkFSPUJhcnJhIGRlIEZlcnJhbWVudGFzIGRvIERpXHUwMGUxbG9nbyBJbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgbyBYU0QKLUZSQU1FX1RJVExFX1hTRF9JTkZPUk1BVElPTl9DT05URU5UPUNvbnRlXHUwMGZhZG8gZG8gRGlcdTAwZTFsb2dvIEluZm9ybWFcdTAwZTdcdTAwZjVlcyBzb2JyZSBvIFhTRAotCi0jIE9wZW5XU0RMQWN0aW9uCi1BTFRfT1BFTl9XU0RMPUFicmlyIFdTREwKLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMPUlXQUIwMzc4RSBEaWdpdGUgdW0gVVJMIHZcdTAwZTFsaWRvIGRvIFdTREwuCi1NU0dfRVJST1JfT1BFTl9XU0RMPUlXQUIwMzc5RSBJbXBvc3NcdTAwZWR2ZWwgYWJyaXIgJTEuCi1NU0dfRVJST1JfWFNEX1ZBTElEQVRJT049SVdBQjAzODBFIEZvcmFtIGVuY29udHJhZG9zIGVycm9zIGFvIHZhbGlkYXIgZXNxdWVtYXMgWE1MLgotTVNHX0lORk9fT1BFTl9XU0RMX1NVQ0NFU1NGVUw9SVdBQjAzODFJICUxIGZvaSBhYmVydG8gY29tIFx1MDBlYXhpdG8uCi0KLSMgV1NETCBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX0RFVEFJTFM9RGV0YWxoZXMgZG8gV1NETAotRk9STV9MQUJFTF9XU0RMX0RFVEFJTFNfREVTQz1BIHNlZ3VpciBlc3RcdTAwZTNvIG9zIGRldGFsaGVzIHBhcmEgZXN0ZSBkb2N1bWVudG8gV1NETC4gQ2xpcXVlIGVtIHVtIHNlcnZpXHUwMGU3byBvdSBsaWdhXHUwMGU3XHUwMGUzbyBwYXJhIHZlciBzZXVzIGRldGFsaGVzLgotCi0jIFdTREwgU2VydmljZSBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX1NFUlZJQ0VfREVUQUlMUz1EZXRhbGhlcyBkbyBTZXJ2aVx1MDBlN28gV1NETAotRk9STV9MQUJFTF9TRVJWSUNFX0RFVEFJTFNfREVTQz1BIHNlZ3VpciBlc3RcdTAwZTNvIG9zIGRldGFsaGVzIHBhcmEgZXN0ZSBlbGVtZW50byBkZSAmbHQ7c2VydmlcdTAwZTdvJmd0Oy4gQ2xpcXVlIGVtIHVtYSBsaWdhXHUwMGU3XHUwMGUzbyBwYXJhIHZlciBzdWFzIG9wZXJhXHUwMGU3XHUwMGY1ZXMuCi0KLSMgV1NETCBCaW5kaW5nIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfQklORElOR19ERVRBSUxTPURldGFsaGVzIGRhIExpZ2FcdTAwZTdcdTAwZTNvIFdTREwKLUZPUk1fTEFCRUxfQklORElOR19ERVRBSUxTX0RFU0M9QSBzZWd1aXIgZXN0XHUwMGUzbyBvcyBkZXRhbGhlcyBwYXJhIGVzdGUgZWxlbWVudG8gZGUgJmx0O2xpZ2FcdTAwZTdcdTAwZTNvJmd0OyA8c3Ryb25nPiUxPC9zdHJvbmc+LiBDbGlxdWUgZW0gdW1hIG9wZXJhXHUwMGU3XHUwMGUzbyBwYXJhIHByZWVuY2hlciBzZXVzIHBhclx1MDBlMm1ldHJvcyBlIGNoYW1lLWEgb3UgZXNwZWNpZmlxdWUgblx1MDBmM3MgZGUgZXh0cmVtaWRhZGUgYWRpY2lvbmFpcy4KLQotIyBJbnZva2VXU0RMT3BlcmF0aW9uQWN0aW9uCi1BTFRfSU5WT0tFX1dTRExfT1BFUkFUSU9OPUNoYW1hciB1bWEgT3BlcmFcdTAwZTdcdTAwZTNvIFdTREwKLU1TR19FUlJPUl9VTkFCTEVfVE9fQ09OTkVDVD1JV0FCMDM4MkUgSW1wb3NzXHUwMGVkdmVsIGNvbmVjdGFyLXNlIGEgJTEKLU1TR19FUlJPUl9WQUxJREFUSU5HX1BBUkFNRVRFUj1JV0FCMDM4M0UgRXJybyBhbyB2YWxpZGFyICUxCi0KLSMgV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fRkFWT1JJVEVTPUluY2x1aXIgV1NETCBlbSBGYXZvcml0b3MKLU1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFM9SVdBQjAzODRFICUxIGpcdTAwZTEgZXhpc3RlIGVtIGZhdm9yaXRvcy4KLU1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTPUlXQUIwMzg1RSBJbXBvc3NcdTAwZWR2ZWwgaW5jbHVpciAgJTEgZW0gZmF2b3JpdG9zLgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzg2SSAlMSBmb2kgaW5jbHVcdTAwZWRkbyBlbSBmYXZvcml0b3MuCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1Fc3NlIGZhdm9yaXRvIGpcdTAwZTEgZXhpc3RlLiAgRGVzZWphIHN1YnN0aXR1aXI/Ci0KLSMgUmVmcmVzaFdTRExBY3Rpb24KLU1TR19JTkZPX1JFRlJFU0hfV1NETF9TVUNDRVNTRlVMPUlXQUIwMzg3SSAlMSBmb2kgYXR1YWxpemFkby4KLU1TR19RVUVTVElPTl9SRU1PVkVfV1NETF9OT0RFPSUxIG5cdTAwZTNvIHRlbSBtYWlzIHNvbHVcdTAwZTdcdTAwZTNvLiAgRGVzZWphIGxpbXBcdTAwZTEtbG8/Ci0KLSMgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24KLU1TR19JTkZPX1VQREFURV9XU0RMX0JJTkRJTkdfU1VDQ0VTU0ZVTD1JV0FCMDM4OEkgT3Mgblx1MDBmM3MgZGUgZXh0cmVtaWRhZGUgZm9yYW0gYXR1YWxpemFkb3MgY29tIFx1MDBlYXhpdG8uCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfT1BFTl9XU0RMPUFicmlyIEZvcm11bFx1MDBlMXJpbyBkbyBXU0RMCi1GT1JNX1RJVExFX1dTRExfREVUQUlMUz1Gb3JtdWxcdTAwZTFyaW8gZGUgRGV0YWxoZXMgZG8gV1NETAotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1Gb3JtdWxcdTAwZTFyaW8gZGUgRGV0YWxoZXMgZG8gU2VydmlcdTAwZTdvIFdTREwKLUZPUk1fVElUTEVfV1NETF9CSU5ESU5HX0RFVEFJTFM9Rm9ybXVsXHUwMGUxcmlvIGRlIERldGFsaGVzIGRhIExpZ2FcdTAwZTdcdTAwZTNvIFdTREwKLUZPUk1fVElUTEVfSU5WT0tFX1dTRExfT1BFUkFUSU9OPUZvcm11bFx1MDBlMXJpbyBkYSBPcGVyYVx1MDBlN1x1MDBlM28gV1NETAotCi0jIEZvcm0gTGFiZWxzCi1GT1JNX0xBQkVMX09QRU5fV1NETF9ERVNDPURpZ2l0ZSBvIFVSTCBkZSB1bSBkb2N1bWVudG8gV1NETCBlIGNsaXF1ZSBlbSA8c3Ryb25nPklyPC9zdHJvbmc+IHBhcmEgZXhwbG9yYXIuCi1GT1JNX0xBQkVMX1NFUlZJQ0VTPVNlcnZpXHUwMGU3b3MKLUZPUk1fTEFCRUxfQklORElOR1M9TGlnYVx1MDBlN1x1MDBmNWVzCi1GT1JNX0xBQkVMX09QRVJBVElPTlM9T3BlcmFcdTAwZTdcdTAwZjVlcwotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEU9VGlwbwotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfVU5TVVBQT1JURUQ9Tlx1MDBlM28gU3Vwb3J0YWRvCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9TT0FQPVNPQVAKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX0hUVFBfR0VUPUhUVFAgR0VUCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX1BPU1Q9SFRUUCBQT1NUCi1GT1JNX0xBQkVMX05BTUU9IE5vbWUKLUZPUk1fTEFCRUxfRE9DVU1FTlRBVElPTj1Eb2N1bWVudGFcdTAwZTdcdTAwZTNvCi1GT1JNX0xBQkVMX0VORFBPSU5UPU5cdTAwZjMgZGUgZXh0cmVtaWRhZGUKLUZPUk1fTEFCRUxfSU5WT0tFX1dTRExfT1BFUkFUSU9OX0RFU0M9RGlnaXRlIG9zIHBhclx1MDBlMm1ldHJvcyBkZXNzYSBvcGVyYVx1MDBlN1x1MDBlM28gV1NETCBlIGNsaXF1ZSBlbSA8c3Ryb25nPklyPC9TdHJvbmc+IHBhcmEgY2hhbWFyLgotRk9STV9MSU5LX0FERD1JbmNsdWlyCi1GT1JNX0xJTktfUkVNT1ZFPVJlbW92ZXIKLUZPUk1fTEFCRUxfVkFMVUVTPVZhbG9yZXMKLUZPUk1fTEFCRUxfRU5BQkxFX0RJU0FCTEVfR1JPVVA9QXRpdmFyL0Rlc2F0aXZhciBncnVwbwotRk9STV9MQUJFTF9VTklPTl9UWVBFPVRpcG9zIGRlIHVuaVx1MDBlM28KLUZPUk1fTEFCRUxfTEFOR1VBR0U9SWRpb21hCi1GT1JNX0xBQkVMX1hTRF9BUFBMSUNBVElPTl9JTkZPUk1BVElPTj1JbmZvcm1hXHUwMGU3XHUwMGY1ZXMgc29icmUgbyBBcGxpY2F0aXZvCi1GT1JNX0xBQkVMX1hTRF9ET0NVTUVOVEFUSU9OPURvY3VtZW50YVx1MDBlN1x1MDBlM28KLUZPUk1fTEFCRUxfU09BUF9SRVFVRVNUX0VOVkVMT1BFPUVudmVsb3BlIGRlIFBlZGlkbyBkbyBTT0FQOgotRk9STV9MQUJFTF9TT0FQX1JFU1BPTlNFX0VOVkVMT1BFPUVudmVsb3BlIGRlIFJlc3Bvc3RhIGRvIFNPQVA6Ci1GT1JNX0xBQkVMX0dST1VQX0FMTF9PUkRFUklOR19NT1ZFX1VQPU1vdmVyIGVsZW1lbnRvIHBhcmEgY2ltYQotRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9ET1dOPU1vdmVyIGVsZW1lbnRvIHBhcmEgYmFpeG8KLUZPUk1fTEFCRUxfQkFTRV9UWVBFPVRpcG8gYmFzZQotRk9STV9MQUJFTF9VTkJPVU5ERUQ9Tlx1MDBlM28gbGlnYWRvCi1GT1JNX0xBQkVMX0xFTkdUSD1Db21wcmltZW50bwotRk9STV9MQUJFTF9MRU5HVEhfVkFMVUU9WyUxLi4lMl0KLUZPUk1fTEFCRUxfUEFUVEVSTj1QYWRyXHUwMGUzbwotRk9STV9MQUJFTF9XSElURVNQQUNFPUVzcGFcdTAwZTdvIGVtIEJyYW5jbwotRk9STV9MQUJFTF9SQU5HRV9PRl9WQUxVRVM9SW50ZXJ2YWxvIGRlIHZhbG9yZXMKLUZPUk1fTEFCRUxfTUlOX0VYQ0xVU0lWRT0oJTEuLgotRk9STV9MQUJFTF9NSU5fSU5DTFVTSVZFPVslMS4uCi1GT1JNX0xBQkVMX01BWF9FWENMVVNJVkU9JTEpCi1GT1JNX0xBQkVMX01BWF9JTkNMVVNJVkU9JTFdCi1GT1JNX0xBQkVMX1RPVEFMX0RJR0lUUz1Ub3RhbCBkZSBkXHUwMGVkZ2l0b3MKLUZPUk1fTEFCRUxfRlJBQ1RJT05fRElHSVRTPURcdTAwZWRnaXRvcyBkZSBmcmFcdTAwZTdcdTAwZTNvCi1GT1JNX0xBQkVMX09DQ1VSQU5DRT1PY29yclx1MDBlYW5jaWEgZGUKLUZPUk1fTEFCRUxfVU5JT05fTUVNQkVSUz1NZW1icm9zIGRhIFVuaVx1MDBlM28KLUZPUk1fTEFCRUxfTElTVF9JVEVNUz1MaXN0YXIgaXRlbnMKLUZPUk1fTEFCRUxfRUxFTUVOVFM9RWxlbWVudG9zCi1GT1JNX0xBQkVMX1NPQVBfRU5DX0FSUkFZUz1NYXRyaXplcyBkbyBTT0FQCi1GT1JNX0xBQkVMX0NPTlRFTlQ9Q29udGVcdTAwZmFkbwotRk9STV9MQUJFTF9BVE9NSUNfTkFNRV9UWVBFPSUxICglMik6Ci1GT1JNX0xBQkVMX05VTEw9bnVsbwotRk9STV9MQUJFTF9HUk9VUF9OVU1CRVI9R3J1cG8gJTEKLUZPUk1fTEFCRUxfQ0hPSUNFUz1PcFx1MDBlN1x1MDBmNWVzCi1GT1JNX0xBQkVMX05PVEhJTkdfVE9fRElTUExBWV9JTl9GT1JNX1ZJRVc9Tlx1MDBlM28gaFx1MDBlMSBuYWRhIHBhcmEgc2VyIGV4aWJpZG8gbmEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkbyBmb3JtdWxcdTAwZTFyaW8uICBNdWRlIHBhcmEgYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIG9yaWdlbSBwYXJhIG8gcGVkaWRvIGUgcmVzcG9zdGEgZG8gU09BUC4KLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9GQUlMRURfVkFMSURBVElPTl9JTl9GT1JNX1ZJRVc9QSByZXNwb3N0YSBkbyBTT0FQIGZhbGhvdSBuYSB2YWxpZGFcdTAwZTdcdTAwZTNvIGRvIGVzcXVlbWEuICBNdWRlIHBhcmEgYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIG9yaWdlbSBwYXJhIGEgcmVzcG9zdGEgZG8gU09BUCBubyBmb3JtYXRvIFhNTC4KLUZPUk1fTEFCRUxfRU5EX1BPSU5UUz1OXHUwMGYzcyBkZSBFeHRyZW1pZGFkZQotCi0jIFNvdXJjZS9Gb3JtIHZpZXdzCi1GT1JNX0xJTktfRk9STT1Gb3JtdWxcdTAwZTFyaW8KLUFMVF9TV0lUQ0hfVE9fRk9STV9WSUVXPU11ZGFyIHBhcmEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkbyBmb3JtdWxcdTAwZTFyaW8KLUZPUk1fTElOS19TT1VSQ0U9T3JpZ2VtCi1BTFRfU1dJVENIX1RPX1NPVVJDRV9WSUVXPUFsdGVybmFyIHBhcmEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkZSBvcmlnZW0KLUZPUk1fTEFCRUxfRlJBR01FTlRfU09BUF9WSUVXX0NPTlRFTlQ9Q29ycG8gZG8gU29hcDoKLUJVVFRPTl9MQUJFTF9MT0FEPUNhcnJlZ2FyCi1CVVRUT05fTEFCRUxfU0FWRV9BUz1TYWx2YXIgQ29tby4uLgotTVNHX1FVRVNUSU9OX1NZTkNfVklFV1M9TyBmb3JtYXRvIGRvIGNvbnRlXHUwMGZhZG8gZGUgb3JpZ2VtIHBvZGVyXHUwMGUxIHNlciBhbHRlcmFkbyBjb21vIHVtIHJlc3VsdGFkbyBkYSBtdWRhblx1MDBlN2EgZGEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkbyBmb3JtdWxcdTAwZTFyaW8uICBEZXNlamEgcHJvY2Vzc2FyPwotTVNHX1FVRVNUSU9OX1NZTkNfVklFV1NfREVTUElURV9JTlZBTElEX1NPVVJDRV9DT05URU5UPU8gY29udGVcdTAwZmFkbyBkYSB2aXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIG9yaWdlbSBmYWxob3UgbmEgdmFsaWRhXHUwMGU3XHUwMGUzbyBkbyBlc3F1ZW1hLiAgU2luY3Jvbml6YXIgZGUgcXVhbHF1ZXIgbWFuZWlyYT8gIChPIGNvbnRlXHUwMGZhZG8gZGEgdmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkZSBvcmlnZW0gcG9kZXJcdTAwZTEgc2VyIG1vZGlmaWNhZG8pCi0KLSMgRm9ybSBjb250cm9sIHRpdGxlcwotRk9STV9DT05UUk9MX1RJVExFX0VOQUJMRV9ESVNBQkxFX0dST1VQPUF0aXZhci9EZXNhdGl2YXIgZ3J1cG8KLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfRUxFTUVOVF9JTl9HUk9VUD1TZWxlY2lvbmFyIGVsZW1lbnRvIG5vIGdydXBvCi1GT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1VOSU9OX1RZUEU9U2VsZWNpb25hciB0aXBvIGRlIHVuaVx1MDBlM28KLUZPUk1fQ09OVFJPTF9USVRMRV9TT0FQX0ZJTEU9QXJxdWl2byBkZSBkYWRvcyBkbyBTT0FQCi0KLSMgWFNEIEluZm9ybWF0aW9uIERpYWxvZwotVElUTEVfWFNEX0lORk9STUFUSU9OX0RJQUxPRz1EaVx1MDBlMWxvZ28gSW5mb3JtYVx1MDBlN1x1MDBmNWVzIHNvYnJlIG8gWFNECi0KLSMgRXJyb3IgbWVzc2FnZXMKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzg5RSBTZWxlY2lvbmUgcGVsbyBtZW5vcyB1bSBpdGVtLgotTVNHX0VSUk9SX01BWF9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkwRSBPIG1cdTAwZTF4aW1vIGRlIG9jb3JyXHUwMGVhbmNpYXMgZm9pIGF0aW5naWRvLgotTVNHX0VSUk9SX01JTl9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkxRSBPIG1cdTAwZWRuaW1vIGRlIG9jb3JyXHUwMGVhbmNpYXMgZm9pIGF0aW5naWRvLgotTVNHX0VSUk9SX0NBTk5PVF9NT1ZFX0ZJUlNUX0VMRU1FTlRfVVA9SVdBQjAzOTJFIE8gZWxlbWVudG8gc2VsZWNpb25hZG8galx1MDBlMSBcdTAwZTkgbyBwcmltZWlybyBubyBncnVwby4KLU1TR19FUlJPUl9DQU5OT1RfTU9WRV9MQVNUX0VMRU1FTlRfRE9XTj1JV0FCMDM5M0UgTyBlbGVtZW50byBzZWxlY2lvbmFkbyBqXHUwMGUxIFx1MDBlOSBvIFx1MDBmYWx0aW1vIG5vIGdydXBvLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF96aF9DTi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF96aF9DTi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODUxYTQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfemhfQ04ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0RMCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9XU0RMX01BSU49V1NETCBcdTRlM2JcdTg5ODEKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9XHU1YmZjXHU4MjJhXHU1NjY4XHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1cdTViZmNcdTgyMmFcdTU2NjhcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPVx1NWJmY1x1ODIyYVx1NTY2OFx1NTE4NVx1NWJiOQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9XHU2NGNkXHU0ZjVjXHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1cdTVjNWVcdTYwMjdcdTViYjlcdTU2NjgKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1cdTVjNWVcdTYwMjdcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1cdTVjNWVcdTYwMjdcdTUxODVcdTViYjkKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9XHU3MmI2XHU2MDAxXHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1cdTcyYjZcdTYwMDFcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVx1NzJiNlx1NjAwMVx1NTE4NVx1NWJiOQotRlJBTUVfVElUTEVfV1NETF9QRVJTUEVDVElWRV9DT05URU5UPVdTREwgXHU5ODc1XHU5NzYyXHU1MTg1XHU1YmI5Ci1GUkFNRV9USVRMRV9YU0RfSU5GT1JNQVRJT05fVE9PTEJBUj1YU0QgXHU0ZmUxXHU2MDZmXHU1YmY5XHU4YmRkXHU2ODQ2XHU1ZGU1XHU1MTc3XHU2ODBmCi1GUkFNRV9USVRMRV9YU0RfSU5GT1JNQVRJT05fQ09OVEVOVD1YU0QgXHU0ZmUxXHU2MDZmXHU1YmY5XHU4YmRkXHU2ODQ2XHU1MTg1XHU1YmI5Ci0KLSMgT3BlbldTRExBY3Rpb24KLUFMVF9PUEVOX1dTREw9XHU2MjUzXHU1ZjAwIFdTREwKLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMPUlXQUIwMzc4RSBcdThmOTNcdTUxNjVcdTY3MDlcdTY1NDhcdTc2ODQgV1NETCBVUkxcdTMwMDIKLU1TR19FUlJPUl9PUEVOX1dTREw9SVdBQjAzNzlFIFx1NjVlMFx1NmNkNVx1NjI1M1x1NWYwMCAlMVx1MzAwMgotTVNHX0VSUk9SX1hTRF9WQUxJREFUSU9OPUlXQUIwMzgwRSBcdTlhOGNcdThiYzEgWE1MIFx1NmEyMVx1NWYwZlx1NjVmNlx1OTA0N1x1NTIzMFx1OTUxOVx1OGJlZlx1MzAwMgotTVNHX0lORk9fT1BFTl9XU0RMX1NVQ0NFU1NGVUw9SVdBQjAzODFJIFx1NWRmMlx1NjIxMFx1NTI5Zlx1NjI1M1x1NWYwMCAlMVx1MzAwMgotCi0jIFdTREwgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9ERVRBSUxTPVdTREwgXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi1GT1JNX0xBQkVMX1dTRExfREVUQUlMU19ERVNDPVx1NGVlNVx1NGUwYlx1NjYzZVx1NzkzYVx1NzY4NFx1NjYyZlx1NmI2NCBXU0RMIFx1NjU4N1x1Njg2M1x1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMlx1NTM1NVx1NTFmYlx1NjcwZFx1NTJhMVx1NjIxNlx1N2VkMVx1NWI5YVx1NGVlNVx1NjdlNVx1NzcwYlx1NTE3Nlx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMgotCi0jIFdTREwgU2VydmljZSBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFx1NjcwZFx1NTJhMVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2ZgotRk9STV9MQUJFTF9TRVJWSUNFX0RFVEFJTFNfREVTQz1cdTRlZTVcdTRlMGJcdTY2M2VcdTc5M2FcdTc2ODRcdTY2MmZcdTZiNjQgJmx0O1x1NjcwZFx1NTJhMSZndDsgXHU1MTQzXHU3ZDIwXHU3Njg0XHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHUzMDAyXHU1MzU1XHU1MWZiXHU3ZWQxXHU1YjlhXHU0ZWU1XHU2N2U1XHU3NzBiXHU1MTc2XHU2NGNkXHU0ZjVjXHUzMDAyCi0KLSMgV1NETCBCaW5kaW5nIEVsZW1lbnQgZGV0YWlscwotQUxUX1dTRExfQklORElOR19ERVRBSUxTPVdTREwgXHU3ZWQxXHU1YjlhXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi1GT1JNX0xBQkVMX0JJTkRJTkdfREVUQUlMU19ERVNDPVx1NGVlNVx1NGUwYlx1NjYzZVx1NzkzYVx1NzY4NFx1NjYyZlx1NmI2NCA8c3Ryb25nPiUxPC9zdHJvbmc+ICZsdDtcdTdlZDFcdTViOWEmZ3Q7IFx1NTE0M1x1N2QyMFx1NzY4NFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1MzAwMlx1NTM1NVx1NTFmYlx1NjRjZFx1NGY1Y1x1NGVlNVx1NTg2Ylx1NTE0NVx1NTE3Nlx1NTNjMlx1NjU3MFx1NWU3Nlx1OGMwM1x1NzUyOFx1NWI4M1x1NjIxNlx1NjMwN1x1NWI5YVx1NTE3Nlx1NWI4M1x1N2FlZlx1NzBiOVx1MzAwMgotCi0jIEludm9rZVdTRExPcGVyYXRpb25BY3Rpb24KLUFMVF9JTlZPS0VfV1NETF9PUEVSQVRJT049XHU4YzAzXHU3NTI4IFdTREwgXHU2NGNkXHU0ZjVjCi1NU0dfRVJST1JfVU5BQkxFX1RPX0NPTk5FQ1Q9SVdBQjAzODJFIFx1NjVlMFx1NmNkNVx1OGZkZVx1NjNhNVx1ODFmMyAlMQotTVNHX0VSUk9SX1ZBTElEQVRJTkdfUEFSQU1FVEVSPUlXQUIwMzgzRSBcdTlhOGNcdThiYzEgJTEgXHU2NWY2XHU1MWZhXHU5NTE5Ci0KLSMgV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fRkFWT1JJVEVTPVx1NWMwNiBXU0RMIFx1NmRmYlx1NTJhMFx1NTIzMFx1NjUzNlx1ODVjZlx1NTkzOQotTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUz1JV0FCMDM4NEUgXHU2NTM2XHU4NWNmXHU1OTM5XHU0ZTJkXHU1ZGYyXHU1YjU4XHU1NzI4ICUxXHUzMDAyCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM4NUUgXHU2NWUwXHU2Y2Q1XHU1YzA2ICUxIFx1NmRmYlx1NTJhMFx1NTIzMFx1NjUzNlx1ODVjZlx1NTkzOVx1MzAwMgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzg2SSBcdTVkZjJcdTVjMDYgJTEgXHU2ZGZiXHU1MmEwXHU1MjMwXHU2NTM2XHU4NWNmXHU1OTM5XHUzMDAyCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1cdTY1MzZcdTg1Y2ZcdTk4NzlcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdTYwZjNcdTg5ODFcdTg5ODZcdTc2ZDZcdTU0MTdcdWZmMWYKLQotIyBSZWZyZXNoV1NETEFjdGlvbgotTVNHX0lORk9fUkVGUkVTSF9XU0RMX1NVQ0NFU1NGVUw9SVdBQjAzODdJIFx1NWRmMlx1NTIzN1x1NjViMCAlMVx1MzAwMgotTVNHX1FVRVNUSU9OX1JFTU9WRV9XU0RMX05PREU9JTEgXHU0ZTBkXHU1MThkXHU1M2VmXHU4OWUzXHU2NzkwXHUzMDAyXHU2MGYzXHU4OTgxXHU2ZTA1XHU5NjY0XHU1YjgzXHU1NDE3XHVmZjFmCi0KLSMgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24KLU1TR19JTkZPX1VQREFURV9XU0RMX0JJTkRJTkdfU1VDQ0VTU0ZVTD1JV0FCMDM4OEkgXHU1ZGYyXHU2MjEwXHU1MjlmXHU2NmY0XHU2NWIwXHU3YWVmXHU3MGI5XHUzMDAyCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfT1BFTl9XU0RMPVx1NjI1M1x1NWYwMCBXU0RMIFx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9XU0RMX0RFVEFJTFM9V1NETCBcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTg4NjhcdTUzNTUKLUZPUk1fVElUTEVfV1NETF9TRVJWSUNFX0RFVEFJTFM9V1NETCBcdTY3MGRcdTUyYTFcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTg4NjhcdTUzNTUKLUZPUk1fVElUTEVfV1NETF9CSU5ESU5HX0RFVEFJTFM9V1NETCBcdTdlZDFcdTViOWFcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmZcdTg4NjhcdTUzNTUKLUZPUk1fVElUTEVfSU5WT0tFX1dTRExfT1BFUkFUSU9OPVdTREwgXHU2NGNkXHU0ZjVjXHU4ODY4XHU1MzU1Ci0KLSMgRm9ybSBMYWJlbHMKLUZPUk1fTEFCRUxfT1BFTl9XU0RMX0RFU0M9XHU4ZjkzXHU1MTY1IFdTREwgXHU2NTg3XHU2ODYzXHU3Njg0IFVSTCBcdTVlNzZcdTUzNTVcdTUxZmI8c3Ryb25nPlx1NjI2N1x1ODg0Yzwvc3Ryb25nPlx1OGZkYlx1ODg0Y1x1NjNhMlx1N2QyMlx1MzAwMgotRk9STV9MQUJFTF9TRVJWSUNFUz1cdTY3MGRcdTUyYTEKLUZPUk1fTEFCRUxfQklORElOR1M9XHU3ZWQxXHU1YjlhCi1GT1JNX0xBQkVMX09QRVJBVElPTlM9XHU2NGNkXHU0ZjVjCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRT1cdTdjN2JcdTU3OGIKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX1VOU1VQUE9SVEVEPVx1NGUwZFx1NTNkN1x1NjUyZlx1NjMwMQotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfU09BUD1TT0FQCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9IVFRQX0dFVD1IVFRQIEdFVAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9QT1NUPUhUVFAgUE9TVAotRk9STV9MQUJFTF9OQU1FPVx1NTQwZFx1NzlmMAotRk9STV9MQUJFTF9ET0NVTUVOVEFUSU9OPVx1NjU4N1x1Njg2MwotRk9STV9MQUJFTF9FTkRQT0lOVD1cdTdhZWZcdTcwYjkKLUZPUk1fTEFCRUxfSU5WT0tFX1dTRExfT1BFUkFUSU9OX0RFU0M9XHU4ZjkzXHU1MTY1XHU2YjY0IFdTREwgXHU2NGNkXHU0ZjVjXHU3Njg0XHU1M2MyXHU2NTcwXHU1ZTc2XHU1MzU1XHU1MWZiPHN0cm9uZz5cdTYyNjdcdTg4NGM8L1N0cm9uZz5cdTRlZTVcdThjMDNcdTc1MjhcdTMwMDIKLUZPUk1fTElOS19BREQ9XHU2ZGZiXHU1MmEwCi1GT1JNX0xJTktfUkVNT1ZFPVx1OTY2NFx1NTNiYgotRk9STV9MQUJFTF9WQUxVRVM9XHU1MDNjCi1GT1JNX0xBQkVMX0VOQUJMRV9ESVNBQkxFX0dST1VQPVx1NTQyZlx1NzUyOFx1ZmYwZlx1Nzk4MVx1NzUyOFx1N2VjNAotRk9STV9MQUJFTF9VTklPTl9UWVBFPVx1ODA1NFx1NTQwOFx1N2M3Ylx1NTc4YgotRk9STV9MQUJFTF9MQU5HVUFHRT1cdThiZWRcdThhMDAKLUZPUk1fTEFCRUxfWFNEX0FQUExJQ0FUSU9OX0lORk9STUFUSU9OPVx1NWU5NFx1NzUyOFx1N2EwYlx1NWU4Zlx1NGZlMVx1NjA2ZgotRk9STV9MQUJFTF9YU0RfRE9DVU1FTlRBVElPTj1cdTY1ODdcdTY4NjMKLUZPUk1fTEFCRUxfU09BUF9SRVFVRVNUX0VOVkVMT1BFPVNPQVAgXHU4YmY3XHU2YzQyXHU1MzA1XHU3ZWRjXHVmZjFhCi1GT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRU5WRUxPUEU9U09BUCBcdTU0Y2RcdTVlOTRcdTUzMDVcdTdlZGNcdWZmMWEKLUZPUk1fTEFCRUxfR1JPVVBfQUxMX09SREVSSU5HX01PVkVfVVA9XHU0ZTBhXHU3OWZiXHU1MTQzXHU3ZDIwCi1GT1JNX0xBQkVMX0dST1VQX0FMTF9PUkRFUklOR19NT1ZFX0RPV049XHU0ZTBiXHU3OWZiXHU1MTQzXHU3ZDIwCi1GT1JNX0xBQkVMX0JBU0VfVFlQRT1cdTU3ZmFcdTY3MmNcdTdjN2JcdTU3OGIKLUZPUk1fTEFCRUxfVU5CT1VOREVEPVx1NTNkNlx1NmQ4OFx1N2VkMVx1NWI5YVx1NzY4NAotRk9STV9MQUJFTF9MRU5HVEg9XHU5NTdmXHU1ZWE2Ci1GT1JNX0xBQkVMX0xFTkdUSF9WQUxVRT1bJTEuLiUyXQotRk9STV9MQUJFTF9QQVRURVJOPVx1NmEyMVx1NWYwZgotRk9STV9MQUJFTF9XSElURVNQQUNFPVx1N2E3YVx1NjgzYwotRk9STV9MQUJFTF9SQU5HRV9PRl9WQUxVRVM9XHU1MDNjXHU4MzAzXHU1NmY0Ci1GT1JNX0xBQkVMX01JTl9FWENMVVNJVkU9KCUxLi4KLUZPUk1fTEFCRUxfTUlOX0lOQ0xVU0lWRT1bJTEuLgotRk9STV9MQUJFTF9NQVhfRVhDTFVTSVZFPSUxKQotRk9STV9MQUJFTF9NQVhfSU5DTFVTSVZFPSUxXQotRk9STV9MQUJFTF9UT1RBTF9ESUdJVFM9XHU2MDNiXHU0ZjRkXHU2NTcwCi1GT1JNX0xBQkVMX0ZSQUNUSU9OX0RJR0lUUz1cdTVjMGZcdTY1NzBcdTRmNGRcdTY1NzAKLUZPUk1fTEFCRUxfT0NDVVJBTkNFPVx1NTFmYVx1NzNiMAotRk9STV9MQUJFTF9VTklPTl9NRU1CRVJTPVx1ODA1NFx1NTQwOFx1NjIxMFx1NTQ1OAotRk9STV9MQUJFTF9MSVNUX0lURU1TPVx1NTIxN1x1ODg2OFx1OTg3OQotRk9STV9MQUJFTF9FTEVNRU5UUz1cdTUxNDNcdTdkMjAKLUZPUk1fTEFCRUxfU09BUF9FTkNfQVJSQVlTPVNPQVAgXHU2NTcwXHU3ZWM0Ci1GT1JNX0xBQkVMX0NPTlRFTlQ9XHU1MTg1XHU1YmI5Ci1GT1JNX0xBQkVMX0FUT01JQ19OQU1FX1RZUEU9JTEgKCUyKVx1ZmYxYQotRk9STV9MQUJFTF9OVUxMPVx1N2E3YQotRk9STV9MQUJFTF9HUk9VUF9OVU1CRVI9XHU3ZWM0ICUxCi1GT1JNX0xBQkVMX0NIT0lDRVM9XHU5MDA5XHU5ODc5Ci1GT1JNX0xBQkVMX05PVEhJTkdfVE9fRElTUExBWV9JTl9GT1JNX1ZJRVc9XHU4ODY4XHU1MzU1XHU4OWM2XHU1NmZlXHU0ZTJkXHU2Y2ExXHU2NzA5XHU4OTgxXHU2NjNlXHU3OTNhXHU3Njg0XHU1MTg1XHU1YmI5XHUzMDAyXHU2NzA5XHU1MTczIFNPQVAgXHU4YmY3XHU2YzQyXHU1NDhjXHU1NGNkXHU1ZTk0XHVmZjBjXHU4YmY3XHU1MjA3XHU2MzYyXHU4MWYzXHUyMDFjXHU2ZTkwXHU0ZWUzXHU3ODAxXHUyMDFkXHU4OWM2XHU1NmZlXHUzMDAyCi1GT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRkFJTEVEX1ZBTElEQVRJT05fSU5fRk9STV9WSUVXPVNPQVAgXHU1NGNkXHU1ZTk0XHU1YmZjXHU4MWY0XHU2YTIxXHU1ZjBmXHU5YThjXHU4YmMxXHU1OTMxXHU4ZDI1XHUzMDAyXHU2NzA5XHU1MTczIFhNTCBcdTY4M2NcdTVmMGZcdTc2ODQgU09BUCBcdTU0Y2RcdTVlOTRcdWZmMGNcdThiZjdcdTUyMDdcdTYzNjJcdTgxZjNcdTIwMWNcdTZlOTBcdTRlZTNcdTc4MDFcdTIwMWRcdTg5YzZcdTU2ZmVcdTMwMDIKLUZPUk1fTEFCRUxfRU5EX1BPSU5UUz1cdTdhZWZcdTcwYjkKLQotIyBTb3VyY2UvRm9ybSB2aWV3cwotRk9STV9MSU5LX0ZPUk09XHU4ODY4XHU1MzU1Ci1BTFRfU1dJVENIX1RPX0ZPUk1fVklFVz1cdTUyMDdcdTYzNjJcdTgxZjNcdTg4NjhcdTUzNTVcdTg5YzZcdTU2ZmUKLUZPUk1fTElOS19TT1VSQ0U9XHU2ZTkwXHU0ZWUzXHU3ODAxCi1BTFRfU1dJVENIX1RPX1NPVVJDRV9WSUVXPVx1NTIwN1x1NjM2Mlx1ODFmM1x1MjAxY1x1NmU5MFx1NGVlM1x1NzgwMVx1MjAxZFx1ODljNlx1NTZmZQotRk9STV9MQUJFTF9GUkFHTUVOVF9TT0FQX1ZJRVdfQ09OVEVOVD1TT0FQIFx1NGUzYlx1NGY1M1x1ZmYxYQotQlVUVE9OX0xBQkVMX0xPQUQ9XHU4OGM1XHU1MTY1Ci1CVVRUT05fTEFCRUxfU0FWRV9BUz1cdTUzZTZcdTViNThcdTRlM2EuLi4KLU1TR19RVUVTVElPTl9TWU5DX1ZJRVdTPVx1NmU5MFx1NGVlM1x1NzgwMVx1NTE4NVx1NWJiOVx1NzY4NFx1NjgzY1x1NWYwZlx1NTNlZlx1ODBmZFx1NGYxYVx1NTZlMFx1NGUzYVx1NTIwN1x1NjM2Mlx1ODFmM1x1ODg2OFx1NTM1NVx1ODljNlx1NTZmZVx1ODAwY1x1NjUzOVx1NTNkOFx1MzAwMlx1NjBmM1x1ODk4MVx1NTkwNFx1NzQwNlx1NTQxN1x1ZmYxZgotTVNHX1FVRVNUSU9OX1NZTkNfVklFV1NfREVTUElURV9JTlZBTElEX1NPVVJDRV9DT05URU5UPVx1MjAxY1x1NmU5MFx1NGVlM1x1NzgwMVx1MjAxZFx1ODljNlx1NTZmZVx1NzY4NFx1NTE4NVx1NWJiOVx1NmEyMVx1NWYwZlx1OWE4Y1x1OGJjMVx1NTkzMVx1OGQyNVx1MzAwMlx1NGUwMFx1NWI5YVx1ODk4MVx1NTQwY1x1NmI2NVx1NTQxN1x1ZmYxZlx1ZmYwOFx1NTNlZlx1NGZlZVx1NjUzOVx1MjAxY1x1NmU5MFx1NGVlM1x1NzgwMVx1MjAxZFx1ODljNlx1NTZmZVx1NzY4NFx1NTE4NVx1NWJiOVx1ZmYwOQotCi0jIEZvcm0gY29udHJvbCB0aXRsZXMKLUZPUk1fQ09OVFJPTF9USVRMRV9FTkFCTEVfRElTQUJMRV9HUk9VUD1cdTU0MmZcdTc1MjhcdWZmMGZcdTc5ODFcdTc1MjhcdTdlYzQKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfRUxFTUVOVF9JTl9HUk9VUD1cdTkwMDlcdTYyZTlcdTdlYzRcdTRlMmRcdTc2ODRcdTUxNDNcdTdkMjAKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfVU5JT05fVFlQRT1cdTkwMDlcdTYyZTlcdTgwNTRcdTU0MDhcdTdjN2JcdTU3OGIKLUZPUk1fQ09OVFJPTF9USVRMRV9TT0FQX0ZJTEU9U09BUCBcdTY1NzBcdTYzNmVcdTY1ODdcdTRlZjYKLQotIyBYU0QgSW5mb3JtYXRpb24gRGlhbG9nCi1USVRMRV9YU0RfSU5GT1JNQVRJT05fRElBTE9HPVhTRCBcdTRmZTFcdTYwNmZcdTViZjlcdThiZGRcdTY4NDYKLQotIyBFcnJvciBtZXNzYWdlcwotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzODlFIFx1ODFmM1x1NWMxMVx1OTAwOVx1NjJlOVx1NGUwMFx1OTg3OVx1MzAwMgotTVNHX0VSUk9SX01BWF9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkwRSBcdThmYmVcdTUyMzBcdTY3MDBcdTU5MjdcdTUxZmFcdTczYjBcdTZiMjFcdTY1NzBcdTMwMDIKLU1TR19FUlJPUl9NSU5fT0NDVVJTX1ZJT0xBVElPTj1JV0FCMDM5MUUgXHU4ZmJlXHU1MjMwXHU2NzAwXHU1YzBmXHU1MWZhXHU3M2IwXHU2YjIxXHU2NTcwXHUzMDAyCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfRklSU1RfRUxFTUVOVF9VUD1JV0FCMDM5MkUgXHU5MDA5XHU2MmU5XHU3Njg0XHU1MTQzXHU3ZDIwXHU1ZGYyXHU2NjJmXHU3ZWM0XHU0ZTJkXHU3Njg0XHU3YjJjXHU0ZTAwXHU0ZTJhXHU1MTQzXHU3ZDIwXHUzMDAyCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfTEFTVF9FTEVNRU5UX0RPV049SVdBQjAzOTNFIFx1OTAwOVx1NjJlOVx1NzY4NFx1NTE0M1x1N2QyMFx1NWRmMlx1NjYyZlx1N2VjNFx1NGUyZFx1NzY4NFx1NjcwMFx1NTQwZVx1NGUwMFx1NGUyYVx1NTE0M1x1N2QyMFx1MzAwMgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF96aF9UVy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NkbF96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzZlNjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzZGxfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0RMCi0KLSMgTm9kZXMKLU5PREVfTkFNRV9XU0RMX01BSU49V1NETCBcdTRlM2JcdTg5ODEKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9XHU1YzBlXHU4OWJkXHU1NjY4XHU1MTMyXHU1YjU4XHU1NjY4Ci1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1cdTVjMGVcdTg5YmRcdTU2NjhcdTVkZTVcdTUxNzdcdTUyMTcKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPVx1NWMwZVx1ODliZFx1NTY2OFx1NTE2N1x1NWJiOQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9XHU1MmQ1XHU0ZjVjXHU1MTMyXHU1YjU4XHU1NjY4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1cdTUxNjdcdTViYjlcdTUxMzJcdTViNThcdTU2NjgKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1cdTUxNjdcdTViYjlcdTVkZTVcdTUxNzdcdTUyMTcKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1cdTUxNjdcdTViYjlcdTUxNjdcdTY1ODcKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9XHU3MmMwXHU2MTRiXHU1MTMyXHU1YjU4XHU1NjY4Ci1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1cdTcyYzBcdTYxNGJcdTVkZTVcdTUxNzdcdTUyMTcKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVx1NzJjMFx1NjE0Ylx1NTE2N1x1NWJiOQotRlJBTUVfVElUTEVfV1NETF9QRVJTUEVDVElWRV9DT05URU5UPVdTREwgXHU5ODAxXHU5NzYyXHU1MTY3XHU1YmI5Ci1GUkFNRV9USVRMRV9YU0RfSU5GT1JNQVRJT05fVE9PTEJBUj1YU0QgXHU4Y2M3XHU4YTBhXHU1YzBkXHU4YTcxXHU2ODQ2XHU1ZGU1XHU1MTc3XHU1MjE3Ci1GUkFNRV9USVRMRV9YU0RfSU5GT1JNQVRJT05fQ09OVEVOVD1YU0QgXHU4Y2M3XHU4YTBhXHU1YzBkXHU4YTcxXHU2ODQ2XHU1MTY3XHU1YmI5Ci0KLSMgT3BlbldTRExBY3Rpb24KLUFMVF9PUEVOX1dTREw9XHU5NThiXHU1NTVmIFdTREwKLU1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJMPUlXQUIwMzc4RSBcdThhY2JcdThmMzhcdTUxNjVcdTY3MDlcdTY1NDhcdTc2ODQgV1NETCBVUkxcdTMwMDIKLU1TR19FUlJPUl9PUEVOX1dTREw9SVdBQjAzNzlFIFx1NzEyMVx1NmNkNVx1OTU4Ylx1NTU1ZiAlMVx1MzAwMgotTVNHX0VSUk9SX1hTRF9WQUxJREFUSU9OPUlXQUIwMzgwRSBcdTc1NzZcdTlhNTdcdThiNDkgWE1MIFx1N2RiMVx1NzZlZVx1NjY0Mlx1ZmYwY1x1NzY3Y1x1NzUxZlx1OTMyZlx1OGFhNFx1MzAwMgotTVNHX0lORk9fT1BFTl9XU0RMX1NVQ0NFU1NGVUw9SVdBQjAzODFJIFx1NWRmMlx1OTgwNlx1NTIyOVx1OTU4Ylx1NTU1ZiAlMVx1MzAwMgotCi0jIFdTREwgRWxlbWVudCBkZXRhaWxzCi1BTFRfV1NETF9ERVRBSUxTPVdTREwgXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5Ci1GT1JNX0xBQkVMX1dTRExfREVUQUlMU19ERVNDPVx1NGVlNVx1NGUwYlx1OTg2Zlx1NzkzYVx1OTAxOVx1NGVmZCBXU0RMIFx1NjU4N1x1NGVmNlx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwMlx1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1NjcwZFx1NTJkOVx1NjIxNlx1OTAyM1x1N2Q1MFx1NGY4Nlx1NjdlNVx1NzcwYlx1NWI4M1x1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwMgotCi0jIFdTREwgU2VydmljZSBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFx1NjcwZFx1NTJkOVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQotRk9STV9MQUJFTF9TRVJWSUNFX0RFVEFJTFNfREVTQz1cdTRlZTVcdTRlMGJcdTk4NmZcdTc5M2FcdTkwMTlcdTUwMGIgJmx0O3NlcnZpY2UmZ3Q7IFx1NTE0M1x1N2QyMFx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwMlx1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1OTAyM1x1N2Q1MFx1NGY4Nlx1NjdlNVx1NzcwYlx1NWI4M1x1NzY4NFx1NGY1Y1x1Njk2ZFx1MzAwMgotCi0jIFdTREwgQmluZGluZyBFbGVtZW50IGRldGFpbHMKLUFMVF9XU0RMX0JJTkRJTkdfREVUQUlMUz1XU0RMIFx1OTAyM1x1N2Q1MFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQotRk9STV9MQUJFTF9CSU5ESU5HX0RFVEFJTFNfREVTQz1cdTRlZTVcdTRlMGJcdTk4NmZcdTc5M2FcdTkwMTlcdTUwMGIgPHN0cm9uZz4lMTwvc3Ryb25nPiAgJmx0O2JpbmRpbmcmZ3Q7IFx1NTE0M1x1N2QyMFx1NzY4NFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1MzAwMlx1OGFjYlx1NjMwOVx1NGUwMFx1NGUwYlx1NjdkMFx1OTgwNVx1NGY1Y1x1Njk2ZFx1NGY4Nlx1NTg2Ylx1NTE2NVx1NWI4M1x1NzY4NFx1NTNjM1x1NjU3OFx1NTNjYVx1NTQ3Y1x1NTNlYlx1NWI4M1x1ZmYwY1x1NjIxNlx1NjMwN1x1NWI5YVx1NTE3Nlx1NGVkNlx1N2FlZlx1OWVkZVx1MzAwMgotCi0jIEludm9rZVdTRExPcGVyYXRpb25BY3Rpb24KLUFMVF9JTlZPS0VfV1NETF9PUEVSQVRJT049XHU1NDdjXHU1M2ViIFdTREwgXHU0ZjVjXHU2OTZkCi1NU0dfRVJST1JfVU5BQkxFX1RPX0NPTk5FQ1Q9SVdBQjAzODJFIFx1NzEyMVx1NmNkNVx1OTAyM1x1NjNhNVx1NTIzMCAlMQotTVNHX0VSUk9SX1ZBTElEQVRJTkdfUEFSQU1FVEVSPUlXQUIwMzgzRSBcdTlhNTdcdThiNDkgJTEgXHU2NjQyXHVmZjBjXHU3NjdjXHU3NTFmXHU5MzJmXHU4YWE0Ci0KLSMgV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fRkFWT1JJVEVTPVx1NWMwNyBXU0RMIFx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYgotTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUz1JV0FCMDM4NEUgJTEgXHU1ZGYyXHU1NzI4XHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiXHU0ZTJkXHUzMDAyCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM4NUUgXHU3MTIxXHU2Y2Q1XHU1YzA3ICUxIFx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYlx1MzAwMgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzg2SSAlMSBcdTVkZjJcdTUyYTBcdTUyMzBcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWJcdTRlMmRcdTMwMDIKLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPVx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYlx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1NjBhOFx1ODk4MVx1NjUzOVx1NWJlYlx1NTVjZVx1ZmYxZgotCi0jIFJlZnJlc2hXU0RMQWN0aW9uCi1NU0dfSU5GT19SRUZSRVNIX1dTRExfU1VDQ0VTU0ZVTD1JV0FCMDM4N0kgXHU1ZGYyXHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2ICUxXHUzMDAyCi1NU0dfUVVFU1RJT05fUkVNT1ZFX1dTRExfTk9ERT0lMSBcdTVkZjJcdTcxMjFcdTZjZDVcdTg5ZTNcdTY3OTBcdTMwMDJcdTYwYThcdTg5ODFcdTZlMDVcdTk2NjRcdTViODNcdTU1Y2VcdWZmMWYKLQotIyBVcGRhdGVXU0RMQmluZGluZ0FjdGlvbgotTVNHX0lORk9fVVBEQVRFX1dTRExfQklORElOR19TVUNDRVNTRlVMPUlXQUIwMzg4SSBcdTVkZjJcdTk4MDZcdTUyMjlcdTY2ZjRcdTY1YjBcdTdhZWZcdTllZGVcdTMwMDIKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9PUEVOX1dTREw9XHU5NThiXHU1NTVmIFdTREwgXHU4ODY4XHU1NWFlCi1GT1JNX1RJVExFX1dTRExfREVUQUlMUz1XU0RMIFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFx1NjcwZFx1NTJkOVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9XU0RMX0JJTkRJTkdfREVUQUlMUz1XU0RMIFx1OTAyM1x1N2Q1MFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9JTlZPS0VfV1NETF9PUEVSQVRJT049V1NETCBcdTRmNWNcdTY5NmRcdTg4NjhcdTU1YWUKLQotIyBGb3JtIExhYmVscwotRk9STV9MQUJFTF9PUEVOX1dTRExfREVTQz1cdThhY2JcdThmMzhcdTUxNjUgV1NETCBcdTY1ODdcdTRlZjZcdTc2ODQgVVJMXHVmZjBjXHU1MThkXHU2MzA5XHU0ZTAwXHU0ZTBiPHN0cm9uZz5cdTU3ZjdcdTg4NGM8L3N0cm9uZz5cdTRmODZcdTkwMzJcdTg4NGNcdTYzYTJcdTdkMjJcdTMwMDIKLUZPUk1fTEFCRUxfU0VSVklDRVM9XHU2NzBkXHU1MmQ5Ci1GT1JNX0xBQkVMX0JJTkRJTkdTPVx1OTAyM1x1N2Q1MAotRk9STV9MQUJFTF9PUEVSQVRJT05TPVx1NGY1Y1x1Njk2ZAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEU9XHU5ODVlXHU1NzhiCi1GT1JNX0xBQkVMX0JJTkRJTkdfVFlQRV9VTlNVUFBPUlRFRD1cdTRlMGRcdTY1MmZcdTYzZjQKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX1NPQVA9U09BUAotRk9STV9MQUJFTF9CSU5ESU5HX1RZUEVfSFRUUF9HRVQ9SFRUUCBHRVQKLUZPUk1fTEFCRUxfQklORElOR19UWVBFX0hUVFBfUE9TVD1IVFRQIFBPU1QKLUZPUk1fTEFCRUxfTkFNRT1cdTU0MGRcdTdhMzEKLUZPUk1fTEFCRUxfRE9DVU1FTlRBVElPTj1cdTY1ODdcdTRlZjYKLUZPUk1fTEFCRUxfRU5EUE9JTlQ9XHU3YWVmXHU5ZWRlCi1GT1JNX0xBQkVMX0lOVk9LRV9XU0RMX09QRVJBVElPTl9ERVNDPVx1OGFjYlx1OGYzOFx1NTE2NVx1OTAxOVx1NTAwYiBXU0RMIFx1NGY1Y1x1Njk2ZFx1NzY4NFx1NTNjM1x1NjU3OFx1ZmYwY1x1NTE4ZFx1NjMwOVx1NGUwMFx1NGUwYjxzdHJvbmc+XHU1N2Y3XHU4ODRjPC9TdHJvbmc+XHU0Zjg2XHU5MDMyXHU4ODRjXHU1NDdjXHU1M2ViXHUzMDAyCi1GT1JNX0xJTktfQUREPVx1NjViMFx1NTg5ZQotRk9STV9MSU5LX1JFTU9WRT1cdTc5ZmJcdTk2NjQKLUZPUk1fTEFCRUxfVkFMVUVTPVx1NTAzYwotRk9STV9MQUJFTF9FTkFCTEVfRElTQUJMRV9HUk9VUD1cdTU1NWZcdTc1MjgvXHU1MDVjXHU3NTI4XHU3ZmE0XHU3ZDQ0Ci1GT1JNX0xBQkVMX1VOSU9OX1RZUEU9XHU4MDZmXHU5NmM2XHU5ODVlXHU1NzhiCi1GT1JNX0xBQkVMX0xBTkdVQUdFPVx1OGE5ZVx1OGEwMAotRk9STV9MQUJFTF9YU0RfQVBQTElDQVRJT05fSU5GT1JNQVRJT049XHU2MWM5XHU3NTI4XHU3YTBiXHU1ZjBmXHU4Y2M3XHU4YTBhCi1GT1JNX0xBQkVMX1hTRF9ET0NVTUVOVEFUSU9OPVx1NjU4N1x1NGVmNgotRk9STV9MQUJFTF9TT0FQX1JFUVVFU1RfRU5WRUxPUEU9U09BUCBcdTg5ODFcdTZjNDJcdTVjMDFcdTU5NTdcdWZmMWEKLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9FTlZFTE9QRT1TT0FQIFx1NTZkZVx1NjFjOVx1NWMwMVx1NTk1N1x1ZmYxYQotRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9VUD1cdTVjMDdcdTUxNDNcdTdkMjBcdTU0MTFcdTRlMGFcdTc5ZmJcdTUyZDUKLUZPUk1fTEFCRUxfR1JPVVBfQUxMX09SREVSSU5HX01PVkVfRE9XTj1cdTVjMDdcdTUxNDNcdTdkMjBcdTU0MTFcdTRlMGJcdTc5ZmJcdTUyZDUKLUZPUk1fTEFCRUxfQkFTRV9UWVBFPVx1NTdmYVx1NjcyY1x1OTg1ZVx1NTc4YgotRk9STV9MQUJFTF9VTkJPVU5ERUQ9XHU3MTIxXHU3NTRjXHU5NjUwCi1GT1JNX0xBQkVMX0xFTkdUSD1cdTk1NzdcdTVlYTYKLUZPUk1fTEFCRUxfTEVOR1RIX1ZBTFVFPVslMS4uJTJdCi1GT1JNX0xBQkVMX1BBVFRFUk49XHU1NzhiXHU2YTIzCi1GT1JNX0xBQkVMX1dISVRFU1BBQ0U9XHU3YTdhXHU3NjdkCi1GT1JNX0xBQkVMX1JBTkdFX09GX1ZBTFVFUz1cdTUwM2NcdTdiYzRcdTU3MGQKLUZPUk1fTEFCRUxfTUlOX0VYQ0xVU0lWRT0oJTEuLgotRk9STV9MQUJFTF9NSU5fSU5DTFVTSVZFPVslMS4uCi1GT1JNX0xBQkVMX01BWF9FWENMVVNJVkU9JTEpCi1GT1JNX0xBQkVMX01BWF9JTkNMVVNJVkU9JTFdCi1GT1JNX0xBQkVMX1RPVEFMX0RJR0lUUz1cdTdlM2RcdTRmNGRcdTY1NzgKLUZPUk1fTEFCRUxfRlJBQ1RJT05fRElHSVRTPVx1NWMwZlx1NjU3OFx1NGY0ZFx1NjU3OAotRk9STV9MQUJFTF9PQ0NVUkFOQ0U9XHU1MWZhXHU3M2ZlXHU5ODA1XHU3NmVlCi1GT1JNX0xBQkVMX1VOSU9OX01FTUJFUlM9XHU4MDZmXHU5NmM2XHU2MjEwXHU1NGUxCi1GT1JNX0xBQkVMX0xJU1RfSVRFTVM9XHU2ZTA1XHU1NWFlXHU5ODA1XHU3NmVlCi1GT1JNX0xBQkVMX0VMRU1FTlRTPVx1NTE0M1x1N2QyMAotRk9STV9MQUJFTF9TT0FQX0VOQ19BUlJBWVM9U09BUCBcdTk2NjNcdTUyMTcKLUZPUk1fTEFCRUxfQ09OVEVOVD1cdTUxNjdcdTViYjkKLUZPUk1fTEFCRUxfQVRPTUlDX05BTUVfVFlQRT0lMSAoJTIpXHVmZjFhCi1GT1JNX0xBQkVMX05VTEw9XHU3YTdhXHU1MDNjCi1GT1JNX0xBQkVMX0dST1VQX05VTUJFUj0lMSBcdTdmYTRcdTdkNDQKLUZPUk1fTEFCRUxfQ0hPSUNFUz1cdTkwNzhcdTk4MDUKLUZPUk1fTEFCRUxfTk9USElOR19UT19ESVNQTEFZX0lOX0ZPUk1fVklFVz1cdTZjOTJcdTY3MDlcdTg4NjhcdTU1YWVcdTg5OTZcdTU3MTZcdTYyNDBcdTg5ODFcdTk4NmZcdTc5M2FcdTc2ODRcdTk4MDVcdTc2ZWVcdTMwMDJcdThhY2JcdTUyMDdcdTYzZGJcdTgxZjMgU09BUCBcdTg5ODFcdTZjNDJcdTU0OGNcdTU2ZGVcdTYxYzlcdTc2ODRcdTdhMGJcdTVmMGZcdTc4YmNcdTg5OTZcdTU3MTZcdTMwMDIKLUZPUk1fTEFCRUxfU09BUF9SRVNQT05TRV9GQUlMRURfVkFMSURBVElPTl9JTl9GT1JNX1ZJRVc9U09BUCBcdTU2ZGVcdTYxYzlcdTRmN2ZcdTdkYjFcdTc2ZWVcdTlhNTdcdThiNDlcdTU5MzFcdTY1NTdcdTMwMDJcdThhY2JcdTUyMDdcdTYzZGJcdTgxZjMgWE1MIFx1NjgzY1x1NWYwZlx1NzY4NCBTT0FQIFx1NTZkZVx1NjFjOVx1N2EwYlx1NWYwZlx1NzhiY1x1ODk5Nlx1NTcxNlx1MzAwMgotRk9STV9MQUJFTF9FTkRfUE9JTlRTPVx1N2FlZlx1OWVkZQotCi0jIFNvdXJjZS9Gb3JtIHZpZXdzCi1GT1JNX0xJTktfRk9STT1cdTg4NjhcdTU1YWUKLUFMVF9TV0lUQ0hfVE9fRk9STV9WSUVXPVx1NTIwN1x1NjNkYlx1ODFmM1x1ODg2OFx1NTVhZVx1ODk5Nlx1NTcxNgotRk9STV9MSU5LX1NPVVJDRT1cdTdhMGJcdTVmMGZcdTc4YmMKLUFMVF9TV0lUQ0hfVE9fU09VUkNFX1ZJRVc9XHU1MjA3XHU2M2RiXHU4MWYzXHU3YTBiXHU1ZjBmXHU3OGJjXHU4OTk2XHU1NzE2Ci1GT1JNX0xBQkVMX0ZSQUdNRU5UX1NPQVBfVklFV19DT05URU5UPVNPQVAgXHU0ZTNiXHU5YWQ0XHVmZjFhCi1CVVRUT05fTEFCRUxfTE9BRD1cdThmMDlcdTUxNjUKLUJVVFRPTl9MQUJFTF9TQVZFX0FTPVx1NTNlNlx1NWI1OFx1NjViMFx1NmE5NC4uLgotTVNHX1FVRVNUSU9OX1NZTkNfVklFV1M9XHU1M2VmXHU4MGZkXHU2NzAzXHU1NmUwXHU3MGJhXHU1MjA3XHU2M2RiXHU4MWYzXHU4ODY4XHU1NWFlXHU4OTk2XHU1NzE2XHU4MDBjXHU2NTM5XHU4YjhhXHU3YTBiXHU1ZjBmXHU3OGJjXHU1MTY3XHU1YmI5XHU3Njg0XHU2ODNjXHU1ZjBmXHUzMDAyXHU2MGE4XHU4OTgxXHU3ZTdjXHU3ZThjXHU1NWNlXHVmZjFmCi1NU0dfUVVFU1RJT05fU1lOQ19WSUVXU19ERVNQSVRFX0lOVkFMSURfU09VUkNFX0NPTlRFTlQ9XHU3YTBiXHU1ZjBmXHU3OGJjXHU4OTk2XHU1NzE2XHU3Njg0XHU1MTY3XHU1YmI5XHU0ZjdmXHU3ZGIxXHU3NmVlXHU5YTU3XHU4YjQ5XHU1OTMxXHU2NTU3XHUzMDAyXHU0ZWNkXHU4OTgxXHU1NDBjXHU2YjY1XHU1MzE2XHU1NWNlXHVmZjFmXHVmZjA4XHU1M2VmXHU0ZWU1XHU0ZmVlXHU2NTM5XHU3YTBiXHU1ZjBmXHU3OGJjXHU4OTk2XHU1NzE2XHU3Njg0XHU1MTY3XHU1YmI5XHVmZjA5Ci0KLSMgRm9ybSBjb250cm9sIHRpdGxlcwotRk9STV9DT05UUk9MX1RJVExFX0VOQUJMRV9ESVNBQkxFX0dST1VQPVx1NTU1Zlx1NzUyOC9cdTUwNWNcdTc1MjhcdTdmYTRcdTdkNDQKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfRUxFTUVOVF9JTl9HUk9VUD1cdTkwNzhcdTUzZDZcdTdmYTRcdTdkNDRcdTRlMmRcdTc2ODRcdTUxNDNcdTdkMjAKLUZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfVU5JT05fVFlQRT1cdTkwNzhcdTUzZDZcdTgwNmZcdTk2YzZcdTk4NWVcdTU3OGIKLUZPUk1fQ09OVFJPTF9USVRMRV9TT0FQX0ZJTEU9U09BUCBcdThjYzdcdTY1OTlcdTZhOTQKLQotIyBYU0QgSW5mb3JtYXRpb24gRGlhbG9nCi1USVRMRV9YU0RfSU5GT1JNQVRJT05fRElBTE9HPVhTRCBcdThjYzdcdThhMGFcdTVjMGRcdThhNzFcdTY4NDYKLQotIyBFcnJvciBtZXNzYWdlcwotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzODlFIFx1OGFjYlx1OTA3OFx1NTNkNlx1ODFmM1x1NWMxMVx1NGUwMFx1NTAwYlx1OTgwNVx1NzZlZVx1MzAwMgotTVNHX0VSUk9SX01BWF9PQ0NVUlNfVklPTEFUSU9OPUlXQUIwMzkwRSBcdTVkZjJcdTUyMzBcdTkwNTRcdTc2N2NcdTc1MWZcdTZiMjFcdTY1NzhcdTRlMGFcdTk2NTBcdTMwMDIKLU1TR19FUlJPUl9NSU5fT0NDVVJTX1ZJT0xBVElPTj1JV0FCMDM5MUUgXHU1ZGYyXHU1MjMwXHU5MDU0XHU3NjdjXHU3NTFmXHU2YjIxXHU2NTc4XHU0ZTBiXHU5NjUwXHUzMDAyCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfRklSU1RfRUxFTUVOVF9VUD1JV0FCMDM5MkUgXHU2MjQwXHU5MDc4XHU1MTQzXHU3ZDIwXHU1ZGYyXHU2NjJmXHU3ZmE0XHU3ZDQ0XHU0ZTJkXHU3Njg0XHU3YjJjXHU0ZTAwXHU1MDBiXHUzMDAyCi1NU0dfRVJST1JfQ0FOTk9UX01PVkVfTEFTVF9FTEVNRU5UX0RPV049SVdBQjAzOTNFIFx1NjI0MFx1OTA3OFx1NTE0M1x1N2QyMFx1NWRmMlx1NjYyZlx1N2ZhNFx1N2Q0NFx1NGUyZFx1NzY4NFx1NjcwMFx1NWY4Y1x1NGUwMFx1NTAwYlx1MzAwMgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRjNWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0lMCi0KLSMgTmF2aWdhdG9yCi1XU0lMX01BSU5fTk9ERT1XU0lMIE1haW4KLQotIyBGb3JtcwotRk9STV9MQUJFTF9VUkw9VVJMCi1GT1JNX0xBQkVMX0lURU1fTlVNQkVSPUl0ZW0gIwotRk9STV9MQUJFTF9VRERJX0JVU0lORVNTX05BTUU9VURESSBCdXNpbmVzcyBOYW1lCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRV9OQU1FPVVEREkgU2VydmljZSBOYW1lCi1GT1JNX0xBQkVMX0xBTkdVQUdFPUxhbmd1YWdlCi1GT1JNX0xBQkVMX0FCU1RSQUNUPUFic3RyYWN0Ci1GT1JNX0xBQkVMX05BTUU9TmFtZQotRk9STV9MQUJFTF9XU0RMX0JJTkRJTkdTPVdTREwgQmluZGluZ3MKLUZPUk1fTEFCRUxfTkFNRVNQQUNFX1VSST1OYW1lc3BhY2UgVVJJCi1GT1JNX0xBQkVMX0xPQ0FMX05BTUU9TG9jYWwgTmFtZQotRk9STV9MQUJFTF9JTlFVSVJZX0FQST1JbnF1aXJ5IEFQSQotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1TZXJ2aWNlIEtleQotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9QnVzaW5lc3MgS2V5Ci1GT1JNX0xBQkVMX0RJU0NPVkVSWV9VUkw9RGlzY292ZXJ5IFVSTAotRk9STV9MQUJFTF9XU0lMPVdTSUwgRGV0YWlscwotRk9STV9MQUJFTF9XU0lMX0xJTktTPVdTSUwgTGlua3MKLUZPUk1fTEFCRUxfV1NETF9TRVJWSUNFPVdTREwgU2VydmljZXMKLUZPUk1fTEFCRUxfVURESV9TRVJWSUNFPVVEREkgU2VydmljZXMKLUZPUk1fTEFCRUxfVURESV9CVVNJTkVTUz1VRERJIEJ1c2luZXNzZXMKLUZPUk1fTEFCRUxfQUREX1RPX05BVklHQVRPUj1BZGQgVG8gTmF2aWdhdG9yCi1GT1JNX0xBQkVMX0FERF9UT19GQVZPUklURVM9QWRkIFRvIEZhdm9yaXRlcwotRk9STV9MQUJFTF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1BZGQgVG8gVURESSBQYWdlCi1GT1JNX0xBQkVMX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFPUFkZCBUbyBXU0RMIFBhZ2UKLUZPUk1fTEFCRUxfUkVGUkVTSD1SZWZyZXNoCi1GT1JNX0xBQkVMX05BPU4vQQotRk9STV9MQUJFTF9VTkFWQUlMQUJMRV9VRERJX1NFUlZJQ0U9U2VydmljZSBVbmF2YWlsYWJsZToKLUZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9CVVNJTkVTUz1CdXNpbmVzcyBVbmF2YWlsYWJsZToKLUZPUk1fTEFCRUxfQ0hPT1NFX1dTSUxfSU5TUEVDVElPTl9UWVBFPUNob29zZSB0aGUgdHlwZSBvZiBvYmplY3RzIHRvIGluc3BlY3Q6Ci1NU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRD1JV0FCMDMyOEUgU2VsZWN0IGF0IGxlYXN0IG9uZSBpdGVtLgotCi0jIE9wZW5XU0lMQWN0aW9uCi1BTFRfT1BFTl9XU0lMPU9wZW4gV1NJTAotRk9STV9MQUJFTF9PUEVOX1dTSUxfREVTQz1FbnRlciB0aGUgVVJMIG9mIGEgV1NJTCBkb2N1bWVudCBvciBhIEhUTUwgZG9jdW1lbnQgYW5kIGNsaWNrIDxzdHJvbmc+R288L3N0cm9uZz4gdG8gb3BlbiBpbnNwZWN0LgotV1NJTF9VUkw9VVJMIHRvIGRvY3VtZW50OgotTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9VUkw9SVdBQjAzOTRFICUxIGlzIG5vdCBhIHZhbGlkIFdTSUwgVVJMIG9yIEhUTUwgVVJMLgotTVNHX0VSUk9SX1dTSUxfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMjlFICUxIGlzIGFscmVhZHkgb3BlbmVkIGluIHRoZSBuYXZpZ2F0b3IuCi1NU0dfSU5GT19PUEVOX1dTSUxfU1VDQ0VTU0ZVTD1JV0FCMDMzMEkgJTEgd2FzIHN1Y2Nlc3NmdWxseSBvcGVuZWQuCi0KLSMgT3BlbldTSUxMaW5rQWN0aW9uCi1BTFRfT1BFTl9XU0lMX0xJTks9T3BlbiBXU0lMIExpbmsKLU1TR19FUlJPUl9XU0lMX0xJTktfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMzFFICUxIGlzIGFscmVhZHkgb3BlbmVkIGluIHRoZSBuYXZpZ2F0b3IKLU1TR19JTkZPX09QRU5fV1NJTF9MSU5LX1NVQ0NFU1NGVUw9SVdBQjAzMzJJICUxIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkLgotCi0jIFdzaWxEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9ERVRBSUxTPVdTSUwgRGV0YWlscwotCi0jIFdzaWxTZXJ2aWNlRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfU0VSVklDRV9ERVRBSUxTPVdTSUwgU2VydmljZSBEZXRhaWxzCi0KLSMgVWRkaUxpbmtEZXRhaWxzQWN0aW9uCi1BTFRfVURESV9MSU5LX0RFVEFJTFM9VURESSBCdXNpbmVzcyBEZXRhaWxzCi0KLSMgV3NpbExpbmtEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9MSU5LX0RFVEFJTFM9V1NJTCBMaW5rIERldGFpbHMKLQotIyBMaXN0V1NETFNlcnZpY2VzQWN0aW9uCi1BTFRfTElTVF9XU0RMX1NFUlZJQ0VTPUxpc3QgQWxsIFdTREwgU2VydmljZXMKLUZPUk1fTEFCRUxfTElTVF9XU0RMX1NFUlZJQ0VTX0RFU0M9U2VsZWN0IGEgc2V0IG9mIFdTREwgc2VydmljZXMgYW5kIGNsaWNrIDxzdHJvbmc+QWRkIHRvIEZhdm9yaXRlczwvc3Ryb25nPiB0byBhZGQgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgZmF2b3JpdGVzLgotCi0jIExpc3RVRERJU2VydmljZXNBY3Rpb24KLUFMVF9MSVNUX1VERElfU0VSVklDRVM9TGlzdCBBbGwgVURESSBTZXJ2aWNlcwotRk9STV9MQUJFTF9MSVNUX1VERElfU0VSVklDRVNfREVTQz1TZWxlY3QgYSBzZXQgb2YgVURESSBzZXJ2aWNlcyBhbmQgY2xpY2sgPHN0cm9uZz5BZGQgdG8gRmF2b3JpdGVzPC9zdHJvbmc+IHRvIGFkZCB0aGVzZSB0byB0aGUgbGlzdCBvZiBmYXZvcml0ZXMuIENsaWNrIDxzdHJvbmc+QWRkIHRvIFVEREkgUGFnZTwvc3Ryb25nPiB0byBhZGQgdGhlIHNlbGVjdGlvbnMgdG8gdGhlIFVEREkgUGFnZS4gQ2xpY2sgPHN0cm9uZz5SZWZyZXNoPC9zdHJvbmc+IHRvIHJlZnJlc2ggdGhlIHNlbGVjdGlvbnMuCi0KLSMgTGlzdFVERElCdXNpbmVzc2VzQWN0aW9uCi1BTFRfTElTVF9VRERJX0xJTktTPUxpc3QgQWxsIFVEREkgQnVzaW5lc3NlcwotRk9STV9MQUJFTF9MSVNUX1VERElfQlVTSU5FU1NFU19ERVNDPVNlbGVjdCBhIHNldCBvZiBVRERJIGJ1c2luZXNzZXMgYW5kIGNsaWNrIDxzdHJvbmc+QWRkIHRvIEZhdm9yaXRlczwvc3Ryb25nPiB0byBhZGQgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgZmF2b3JpdGVzLiBDbGljayA8c3Ryb25nPkFkZCB0byBVRERJIFBhZ2U8L3N0cm9uZz4gdG8gYWRkIHRoZXNlIHRvIHRoZSBVRERJIFBhZ2UuIENsaWNrIDxzdHJvbmc+UmVmcmVzaDwvc3Ryb25nPiB0byByZWZyZXNoIHRoZSBzZWxlY3Rpb25zLgotCi0jIExpc3RXU0lMTGlua3NBY3Rpb24KLUFMVF9MSVNUX1dTSUxfTElOS1M9TGlzdCBBbGwgV1NJTCBMaW5rcwotRk9STV9MQUJFTF9MSVNUX1dTSUxfTElOS1M9U2VsZWN0IGEgc2V0IG9mIFdTSUwgbGlua3MgYW5kIHByZXNzIDxzdHJvbmc+QWRkIHRvIE5hdmlnYXRvcjwvc3Ryb25nPiB0byBvcGVuIHRoZW0gaW4gdGhlIG5hdmlnYXRvci4KLQotIyBDbGVhcldTSUxBY3Rpb24KLUFMVF9DTEVBUl9XU0lMPUNsZWFyIFdTSUwKLQotIyBSZWZyZXNoQWN0aW9uCi1BTFRfUkVGUkVTSF9XU0lMPVJlZnJlc2ggV1NJTAotQUxUX1JFRlJFU0hfVURESV9CVVNJTkVTUz1SZWZyZXNoIFVEREkgQnVzaW5lc3MKLUFMVF9SRUZSRVNIX1VERElfU0VSVklDRT1SZWZyZXNoIFVEREkgU2VydmljZQotTVNHX0VSUk9SX1dTSUxfTk9UX0ZPVU5EPUlXQUIwMzMzRSBXU0lMICUxIGNvdWxkIG5vdCBiZSBsb2FkZWQuCi1NU0dfRVJST1JfQlVTSU5FU1NfTk9UX0ZPVU5EPUlXQUIwMzM0RSBCdXNpbmVzcyAlMSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX0ZPVU5EPUlXQUIwMzM1RSBTZXJ2aWNlICUxIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuCi1NU0dfSU5GT19SRUZSRVNIX1NVQ0NFU1NGVUw9SVdBQjAzMzZJICUxIGlzIHJlZnJlc2hlZC4KLU1TR19DT05GSVJNX1JFTU9WRV9OT0RFPSUxIGlzIG5vIGxvbmdlciByZXNvbHZhYmxlLiAgRG8geW91IHdpc2ggdG8gY2xlYXIgaXQ/Ci0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfQlVTSU5FU1NfVE9fVURESV9QRVJTUEVDVElWRT1BZGQgQnVzaW5lc3MgVG8gVURESSBQYWdlCi1BTFRfQUREX1NFUlZJQ0VfVE9fVURESV9QRVJTUEVDVElWRT1BZGQgU2VydmljZSBUbyBVRERJIFBhZ2UKLU1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMzdJICUxIGlzIGFkZGVkIHRvIFVEREkgUGFnZS4KLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMzOEUgVW5hYmxlIHRvIGFkZCAlMSB0byBVRERJIFBhZ2UuCi1NU0dfRVJST1JfQlVTSU5FU1NfTk9UX0ZPVU5EPUlXQUIwMzM5RSBCdXNpbmVzcyAlMSBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX0ZPVU5EPUlXQUIwMzQwRSBTZXJ2aWNlICUxIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgcmVnaXN0cnkuCi0KLSMgV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1BZGQgV1NETCBUbyBXU0RMIFBhZ2UKLU1TR19JTkZPX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDM5NUkgJTEgaXMgYWRkZWQgdG8gV1NETCBQYWdlLgotTVNHX0VSUk9SX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzOTZFICUxIGNvdWxkIG5vdCBiZSBsb2FkZWQuCi0KLSMgQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTSUxfVE9fRkFWT1JJVEVTPUFkZCBXU0lMIFRvIEZhdm9yaXRlcwotTVNHX0VSUk9SX0FERF9UT19GQVZPUklURVM9SVdBQjAzNDFFIFVuYWJsZSB0byBhZGQgJTEgdG8gZmF2b3JpdGVzLgotTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUz1JV0FCMDM0MkUgJTEgYWxyZWFkeSBleGlzdHMgaW4gZmF2b3JpdGVzLgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzQzSSAlMSBpcyBhZGRlZCB0byBmYXZvcml0ZXMuCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1GYXZvcml0ZSBhbHJlYWR5IGV4aXN0cy4gIERvIHlvdSB3aXNoIHRvIG92ZXJ3cml0ZT8KLQotIyBBZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfU0VSVklDRV9UT19GQVZPUklURVM9QWRkIFdTREwgVG8gRmF2b3JpdGVzCi0KLSMgQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9VRERJX0JVU0lORVNTX1RPX0ZBVk9SSVRFUz1BZGQgVURESSBCdXNpbmVzcyBUbyBGYXZvcml0ZXMKLQotIyBBZGRTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfU0VSVklDRV9UT19GQVZPUklURVM9QWRkIFVEREkgU2VydmljZSBUbyBGYXZvcml0ZXMKLQotIyBXU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoCi1BVExfSU1QT1JUX1dTSUxfVE9fV09SS0JFTkNIPUltcG9ydCBXU0lMIFRvIFdvcmtiZW5jaAotRk9STV9MQUJFTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0hfREVTQz1TZWxlY3QgYSB3b3JrYmVuY2ggcHJvamVjdCB0byBzYXZlIHRoZSBXU0lMIGZpbGUgaW50by4gWW91IG1heSBhbHNvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgV1NJTCBmaWxlLgotCi0jIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotQUxUX1dTSUxfSU1QT1JUX1RPX0ZTPUltcG9ydCBXU0lMIFRvIEZpbGUgU3lzdGVtCi1BTFRfV1NETF9JTVBPUlRfVE9fRlM9SW1wb3J0IFdTREwgVG8gRmlsZSBTeXN0ZW0KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9TmF2aWdhdG9yIENvbnRhaW5lcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9TmF2aWdhdG9yIFRvb2xiYXIKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPU5hdmlnYXRvciBDb250ZW50Ci1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1BY3Rpb25zIENvbnRhaW5lcgotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9UHJvcGVydGllcyBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1Qcm9wZXJ0aWVzIENvbnRlbnQKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1Qcm9wZXJ0aWVzIFRvb2xiYXIKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9U3RhdHVzIENvbnRhaW5lcgotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9U3RhdHVzIENvbnRlbnQKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVN0YXR1cyBUb29sYmFyCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfT1BFTl9XU0lMPU9wZW4gV1NJTCBGb3JtCi1GT1JNX1RJVExFX1VERElfQlVTSU5FU1NfREVUQUlMUz1VRERJIEJ1c2luZXNzIERldGFpbHMgRm9ybQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfREVUQUlMUz1VRERJIFNlcnZpY2UgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTPVdTREwgU2VydmljZSBEZXRhaWxzIEZvcm0KLUZPUk1fVElUTEVfV1NJTF9ERVRBSUxTPVdTSUwgRGV0YWlscyBGb3JtCi1GT1JNX1RJVExFX1dTSUxfTElOS19ERVRBSUxTPVdTSUwgTGluayBEZXRhaWxzIEZvcm0KLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTRVM9VURESSBCdXNpbmVzc2VzIFZpZXcKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFUz1VRERJIFNlcnZpY2VzIFZpZXcKLVZJRVdfVElUTEVfV1NETF9TRVJWSUNFUz1XU0RMIFNlcnZpY2VzIFZpZXcKLVZJRVdfVElUTEVfV1NJTF9MSU5LUz1XU0lMIExpbmtzIFZpZXcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfZGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczMWZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsX2RlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9V1NJTAotCi0jIE5hdmlnYXRvcgotV1NJTF9NQUlOX05PREU9V1NJTCAtIEhhdXB0Ci0KLSMgRm9ybXMKLUZPUk1fTEFCRUxfVVJMPVVSTAotRk9STV9MQUJFTF9JVEVNX05VTUJFUj1FaW50cmFnICMKLUZPUk1fTEFCRUxfVURESV9CVVNJTkVTU19OQU1FPU5hbWUgZGVzIFVEREktR2VzY2hcdTAwZTRmdHMKLUZPUk1fTEFCRUxfVURESV9TRVJWSUNFX05BTUU9TmFtZSBkZXMgVURESS1TZXJ2aWNlcwotRk9STV9MQUJFTF9MQU5HVUFHRT1TcHJhY2hlCi1GT1JNX0xBQkVMX0FCU1RSQUNUPUt1cnpkYXJzdGVsbHVuZwotRk9STV9MQUJFTF9OQU1FPU5hbWUKLUZPUk1fTEFCRUxfV1NETF9CSU5ESU5HUz1XU0RMLUJpbmRpbmdzCi1GT1JNX0xBQkVMX05BTUVTUEFDRV9VUkk9TmFtZW5zYmVyZWljaHMtVVJJCi1GT1JNX0xBQkVMX0xPQ0FMX05BTUU9TG9rYWxlciBOYW1lCi1GT1JNX0xBQkVMX0lOUVVJUllfQVBJPUFiZnJhZ2UtQVBJCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPVNlcnZpY2VzY2hsXHUwMGZjc3NlbAotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9R2VzY2hcdTAwZTRmdHNzY2hsXHUwMGZjc3NlbAotRk9STV9MQUJFTF9ESVNDT1ZFUllfVVJMPUVya2VubnVuZ3MtVVJMCi1GT1JNX0xBQkVMX1dTSUw9V1NJTCAtIERldGFpbHMKLUZPUk1fTEFCRUxfV1NJTF9MSU5LUz1XU0lMLUxpbmtzCi1GT1JNX0xBQkVMX1dTRExfU0VSVklDRT1XU0RMLVNlcnZpY2VzCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRT1VRERJLVNlcnZpY2VzCi1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1M9VURESS1HZXNjaFx1MDBlNGZ0ZQotRk9STV9MQUJFTF9BRERfVE9fTkFWSUdBVE9SPVp1IE5hdmlnYXRvciBoaW56dWZcdTAwZmNnZW4KLUZPUk1fTEFCRUxfQUREX1RPX0ZBVk9SSVRFUz1adSBGYXZvcml0ZW4gaGluenVmXHUwMGZjZ2VuCi1GT1JNX0xBQkVMX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPVp1IFVEREktU2VpdGUgaGluenVmXHUwMGZjZ2VuCi1GT1JNX0xBQkVMX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFPVp1IFdTREwtU2VpdGUgaGluenVmXHUwMGZjZ2VuCi1GT1JNX0xBQkVMX1JFRlJFU0g9QWt0dWFsaXNpZXJlbgotRk9STV9MQUJFTF9OQT1uL3YKLUZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9TRVJWSUNFPVNlcnZpY2UgbmljaHQgdmVyZlx1MDBmY2diYXI6Ci1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfQlVTSU5FU1M9R2VzY2hcdTAwZTRmdCBuaWNodCB2ZXJmXHUwMGZjZ2JhcjoKLUZPUk1fTEFCRUxfQ0hPT1NFX1dTSUxfSU5TUEVDVElPTl9UWVBFPVdcdTAwZTRobGVuIFNpZSBkZW4gVHlwIGRlciB6dSB1bnRlcnN1Y2hlbmRlbiBPYmpla3RlIGF1czoKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzI4RSBXXHUwMGU0aGxlbiBTaWUgbWluZGVzdGVucyBlaW5lbiBFaW50cmFnIGF1cy4KLQotIyBPcGVuV1NJTEFjdGlvbgotQUxUX09QRU5fV1NJTD1XU0lMIFx1MDBmNmZmbmVuCi1GT1JNX0xBQkVMX09QRU5fV1NJTF9ERVNDPUdlYmVuIFNpZSBkaWUgVVJMIGVpbmVzIFdTSUwtRG9rdW1lbnRzIG9kZXIgZWluZXMgSFRNTC1Eb2t1bWVudHMgZWluLCB1bmQga2xpY2tlbiBTaWUgPHN0cm9uZz5Mb3M8L3N0cm9uZz4gYW4sIHVtIG1pdCBkZXIgVW50ZXJzdWNodW5nIHp1IGJlZ2lubmVuLgotV1NJTF9VUkw9VVJMIHp1bSBEb2t1bWVudDoKLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfVVJMPUlXQUIwMzk0RSAlMSBpc3Qga2VpbmUgZ1x1MDBmY2x0aWdlIFdTSUwtVVJMIG9kZXIgSFRNTC1VUkwuCi1NU0dfRVJST1JfV1NJTF9BTFJFQURZX09QRU5FRD1JV0FCMDMyOUUgJTEgaXN0IGJlcmVpdHMgaW0gTmF2aWdhdG9yIGdlXHUwMGY2ZmZuZXQuCi1NU0dfSU5GT19PUEVOX1dTSUxfU1VDQ0VTU0ZVTD1JV0FCMDMzMEkgJTEgd3VyZGUgZXJmb2xncmVpY2ggZ2VcdTAwZjZmZm5ldAotCi0jIE9wZW5XU0lMTGlua0FjdGlvbgotQUxUX09QRU5fV1NJTF9MSU5LPVdTSUwtTGluayBcdTAwZjZmZm5lbgotTVNHX0VSUk9SX1dTSUxfTElOS19BTFJFQURZX09QRU5FRD1JV0FCMDMzMUUgJTEgaXN0IGJlcmVpdHMgaW0gTmF2aWdhdG9yIGdlXHUwMGY2ZmZuZXQuCi1NU0dfSU5GT19PUEVOX1dTSUxfTElOS19TVUNDRVNTRlVMPUlXQUIwMzMySSAlMSB3dXJkZSBlcmZvbGdyZWljaCBnZVx1MDBmNmZmbmV0LgotCi0jIFdzaWxEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9ERVRBSUxTPVdTSUwgLSBEZXRhaWxzCi0KLSMgV3NpbFNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFM9V1NETC1TZXJ2aWNlIC0gRGV0YWlscwotCi0jIFVkZGlMaW5rRGV0YWlsc0FjdGlvbgotQUxUX1VERElfTElOS19ERVRBSUxTPVVEREktR2VzY2hcdTAwZTRmdCAtIERldGFpbHMKLQotIyBXc2lsTGlua0RldGFpbHNBY3Rpb24KLUFMVF9XU0lMX0xJTktfREVUQUlMUz1XU0lMLUxpbmsgLSBEZXRhaWxzCi0KLSMgTGlzdFdTRExTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfV1NETF9TRVJWSUNFUz1BbGxlIFdTREwtU2VydmljZXMgYXVmbGlzdGVuCi1GT1JNX0xBQkVMX0xJU1RfV1NETF9TRVJWSUNFU19ERVNDPVdcdTAwZTRobGVuIFNpZSBlaW5lIEdydXBwZSB2b24gV1NETC1TZXJ2aWNlcyBhdXMsIHVuZCBrbGlja2VuIFNpZSA8c3Ryb25nPlp1IEZhdm9yaXRlbiBoaW56dWZcdTAwZmNnZW48L3N0cm9uZz4gYW4sIHVtIHNpZSB6dXIgTGlzdGUgZGVyICBGYXZvcml0ZW4gaGluenV6dWZcdTAwZmNnZW4uCi0KLSMgTGlzdFVERElTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfVURESV9TRVJWSUNFUz1BbGxlIFVEREktU2VydmljZXMgYXVmbGlzdGVuCi1GT1JNX0xBQkVMX0xJU1RfVURESV9TRVJWSUNFU19ERVNDPVdcdTAwZTRobGVuIFNpZSBlaW5lIEdydXBwZSB2b24gVURESS1TZXJ2aWNlcyBhdXMsIHVuZCBrbGlja2VuIFNpZSA8c3Ryb25nPlp1IEZhdm9yaXRlbiBoaW56dWZcdTAwZmNnZW48L3N0cm9uZz4gYW4sIHVtIHNpZSB6dXIgTGlzdGUgZGVyIEZhdm9yaXRlbiBoaW56dXp1Zlx1MDBmY2dlbi4gS2xpY2tlbiBTaWUgPHN0cm9uZz5adSBVRERJLVNlaXRlIGhpbnp1Zlx1MDBmY2dlbjwvc3Ryb25nPiBhbiwgdW0gZGllIEF1c3dhaGwgenVyIFVEREktU2VpdGUgaGluenV6dWZcdTAwZmNnZW4uIEtsaWNrZW4gU2llIDxzdHJvbmc+QWt0dWFsaXNpZXJlbjwvc3Ryb25nPiBhbiwgdW0gZGllIEF1c3dhaGwgenUgYWt0dWFsaXNpZXJlbi4KLQotIyBMaXN0VURESUJ1c2luZXNzZXNBY3Rpb24KLUFMVF9MSVNUX1VERElfTElOS1M9QWxsZSBVRERJLUdlc2NoXHUwMGU0ZnRlIGF1Zmxpc3RlbgotRk9STV9MQUJFTF9MSVNUX1VERElfQlVTSU5FU1NFU19ERVNDPVdcdTAwZTRobGVuIFNpZSBlaW5lIEdydXBwZSB2b24gVURESS1HZXNjaFx1MDBlNGZ0ZW4gYXVzLCB1bmQga2xpY2tlbiBTaWUgPHN0cm9uZz5adSBGYXZvcml0ZW4gaGluenVmXHUwMGZjZ2VuPC9zdHJvbmc+IGFuLCB1bSBzaWUgenVyIExpc3RlIGRlciAgRmF2b3JpdGVuIGhpbnp1enVmXHUwMGZjZ2VuLiBLbGlja2VuIFNpZSA8c3Ryb25nPlp1IFVEREktU2VpdGUgaGluenVmXHUwMGZjZ2VuPC9zdHJvbmc+IGFuLCB1bSBzaWUgenVyIFVEREktU2VpdGUgaGluenV6dWZcdTAwZmNnZW4uIEtsaWNrZW4gU2llIDxzdHJvbmc+QWt0dWFsaXNpZXJlbjwvc3Ryb25nPiBhbiwgdW0gZGllIEF1c3dhaGwgenUgYWt0dWFsaXNpZXJlbi4KLQotIyBMaXN0V1NJTExpbmtzQWN0aW9uCi1BTFRfTElTVF9XU0lMX0xJTktTPUFsbGUgV1NJTC1MaW5rcyBhdWZsaXN0ZW4KLUZPUk1fTEFCRUxfTElTVF9XU0lMX0xJTktTPVdcdTAwZTRobGVuIFNpZSBlaW5lIEdydXBwZSB2b24gV1NJTC1MaW5rcyBhdXMsIHVuZCBrbGlja2VuIFNpZSA8c3Ryb25nPlp1IE5hdmlnYXRvciBoaW56dWZcdTAwZmNnZW48L3N0cm9uZz4gYW4sIHVtIHNpZSBpbSBOYXZpZ2F0b3IgenUgXHUwMGY2ZmZuZW4uCi0KLSMgQ2xlYXJXU0lMQWN0aW9uCi1BTFRfQ0xFQVJfV1NJTD1XU0lMIGxcdTAwZjZzY2hlbgotCi0jIFJlZnJlc2hBY3Rpb24KLUFMVF9SRUZSRVNIX1dTSUw9V1NJTCBha3R1YWxpc2llcmVuCi1BTFRfUkVGUkVTSF9VRERJX0JVU0lORVNTPVVEREktR2VzY2hcdTAwZTRmdGUgYWt0dWFsaXNpZXJlbgotQUxUX1JFRlJFU0hfVURESV9TRVJWSUNFPVVEREktU2VydmljZSBha3R1YWxpc2llcmVuCi1NU0dfRVJST1JfV1NJTF9OT1RfRk9VTkQ9SVdBQjAzMzNFIFdTSUwgJTEga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzNEUgR2VzY2hcdTAwZTRmdCAlMSBrb25udGUgaW4gZGVyIFJlZ2lzdHJpZXJ1bmcgbmljaHQgZ2VmdW5kZW4gd2VyZGVuLgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX0ZPVU5EPUlXQUIwMzM1RSBTZXJ2aWNlICUxIGtvbm50ZSBpbiBkZXIgUmVnaXN0cmllcnVuZyBuaWNodCBnZWZ1bmRlbiB3ZXJkZW4uCi1NU0dfSU5GT19SRUZSRVNIX1NVQ0NFU1NGVUw9SVdBQjAzMzZJICUxIHd1cmRlIGFrdHVhbGlzaWVydC4KLU1TR19DT05GSVJNX1JFTU9WRV9OT0RFPSUxIGthbm4gbmljaHQgbWVociBhdWZnZWxcdTAwZjZzdCB3ZXJkZW4uICBTb2xsIGRlciBLbm90ZW4gZ2VsXHUwMGY2c2NodCB3ZXJkZW4/Ci0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfQlVTSU5FU1NfVE9fVURESV9QRVJTUEVDVElWRT1HZXNjaFx1MDBlNGZ0IHp1IFVEREktU2VpdGUgaGluenVmXHUwMGZjZ2VuCi1BTFRfQUREX1NFUlZJQ0VfVE9fVURESV9QRVJTUEVDVElWRT1TZXJ2aWNlIHp1IFVEREktU2VpdGUgaGluenVmXHUwMGZjZ2VuCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzM3SSAlMSB3dXJkZSB6dSBVRERJLVNlaXRlIGhpbnp1Z2VmXHUwMGZjZ3QuCi1NU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9SVdBQjAzMzhFICUxIGthbm4gbmljaHQgenUgVURESS1TZWl0ZSBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbi4KLU1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQ9SVdBQjAzMzlFIEdlc2NoXHUwMGU0ZnQgJTEga29ubnRlIGluIGRlciBSZWdpc3RyaWVydW5nIG5pY2h0IGdlZnVuZGVuIHdlcmRlbi4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDM0MEUgU2VydmljZSAlMSBrb25udGUgaW4gZGVyIFJlZ2lzdHJpZXJ1bmcgbmljaHQgZ2VmdW5kZW4gd2VyZGVuLgotCi0jIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9V1NETCB6dSBXU0RMLVNlaXRlIGhpbnp1Zlx1MDBmY2dlbgotTVNHX0lORk9fQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzk1SSAlMSB3dXJkZSB6dSBXU0RMLVNlaXRlIGhpbnp1Z2VmXHUwMGZjZ3QuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM5NkUgJTEga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuLgotCi0jIEFkZFdTSUxUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0lMX1RPX0ZBVk9SSVRFUz1XU0lMIHp1IEZhdm9yaXRlbiBoaW56dWZcdTAwZmNnZW4KLU1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTPUlXQUIwMzQxRSAlMSBrYW5uIG5pY2h0IHp1IEZhdm9yaXRlbiBoaW56dWdlZlx1MDBmY2d0IHdlcmRlbi4KLU1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFM9SVdBQjAzNDJFICUxIGlzdCBiZXJlaXRzIGluIGRlbiBGYXZvcml0ZW4gdm9yaGFuZGVuLgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzQzSSAlMSB3dXJkZSB6dSBkZW4gRmF2b3JpdGVuIGhpbnp1Z2VmXHUwMGZjZ3QuCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1GYXZvcml0IGJlcmVpdHMgdm9yaGFuZGVuLiAgXHUwMGRjYmVyc2NocmVpYmVuPwotCi0jIEFkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NETF9TRVJWSUNFX1RPX0ZBVk9SSVRFUz1XU0RMIHp1IEZhdm9yaXRlbiBoaW56dWZcdTAwZmNnZW4KLQotIyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1VERElfQlVTSU5FU1NfVE9fRkFWT1JJVEVTPVVEREktR2VzY2hcdTAwZTRmdCB6dSBGYXZvcml0ZW4gaGluenVmXHUwMGZjZ2VuCi0KLSMgQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1NFUlZJQ0VfVE9fRkFWT1JJVEVTPVVEREktU2VydmljZSB6dSBGYXZvcml0ZW4gaGluenVmXHUwMGZjZ2VuCi0KLSMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaAotQVRMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSD1XU0lMIGluIFdvcmtiZW5jaCBpbXBvcnRpZXJlbgotRk9STV9MQUJFTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0hfREVTQz1XXHUwMGU0aGxlbiBTaWUgZWluIFdvcmtiZW5jaC1Qcm9qZWt0IGF1cywgaW4gZGVtIGRpZSBXU0lMLURhdGVpIGdlc3BlaWNoZXJ0IHdlcmRlbiBzb2xsLiBTaWUga1x1MDBmNm5uZW4gYXVjaCBkZW4gTmFtZW4gZGVyIFdTSUwtRGF0ZWkgXHUwMGU0bmRlcm4uCi0KLSMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uCi1BTFRfV1NJTF9JTVBPUlRfVE9fRlM9V1NJTCBpbiBEYXRlaXN5c3RlbSBpbXBvcnRpZXJlbgotQUxUX1dTRExfSU1QT1JUX1RPX0ZTPVdTREwgaW4gRGF0ZWlzeXN0ZW0gaW1wb3J0aWVyZW4KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9TmF2aWdhdG9yIC0gQ29udGFpbmVyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1OYXZpZ2F0b3IgLSBTeW1ib2xsZWlzdGUKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPU5hdmlnYXRvciAtIEluaGFsdAotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9QWt0aW9uZW4gLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPUVpZ2Vuc2NoYWZ0ZW4gLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1FaWdlbnNjaGFmdGVuIC0gSW5oYWx0Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9RWlnZW5zY2hhZnRlbiAtIFN5bWJvbGxlaXN0ZQotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1TdGF0dXMgLSBDb250YWluZXIKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVN0YXR1cyAtIEluaGFsdAotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9U3RhdHVzIC0gU3ltYm9sbGVpc3RlCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfT1BFTl9XU0lMPVdTSUwtRm9ybXVsYXIgXHUwMGY2ZmZuZW4KLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPUZvcm11bGFyIGZcdTAwZmNyIFVEREktR2VzY2hcdTAwZTRmdHNkZXRhaWxzCi1GT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTPUZvcm11bGFyIGZcdTAwZmNyIFVEREktU2VydmljZWRldGFpbHMKLUZPUk1fVElUTEVfV1NETF9TRVJWSUNFX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgV1NETC1TZXJ2aWNlZGV0YWlscwotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9Rm9ybXVsYXIgZlx1MDBmY3IgV1NJTC1EZXRhaWxzCi1GT1JNX1RJVExFX1dTSUxfTElOS19ERVRBSUxTPUZvcm11bGFyIGZcdTAwZmNyIFdTSUwtTGlua2RldGFpbHMKLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTRVM9U2ljaHQgZlx1MDBmY3IgVURESS1HZXNjaFx1MDBlNGZ0ZQotVklFV19USVRMRV9VRERJX1NFUlZJQ0VTPVNpY2h0IGZcdTAwZmNyIFVEREktU2VydmljZXMKLVZJRVdfVElUTEVfV1NETF9TRVJWSUNFUz1TaWNodCBmXHUwMGZjciBXU0RMLVNlcnZpY2VzCi1WSUVXX1RJVExFX1dTSUxfTElOS1M9U2ljaHQgZlx1MDBmY3IgV1NJTC1MaW5rcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF9lcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF9lcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTYzY2U0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0lMCi0KLSMgTmF2aWdhdG9yCi1XU0lMX01BSU5fTk9ERT1XU0lMIC0gUHJpbmNpcGFsCi0KLSMgRm9ybXMKLUZPUk1fTEFCRUxfVVJMPVVSTAotRk9STV9MQUJFTF9JVEVNX05VTUJFUj1FbGVtZW50byAjCi1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1NfTkFNRT1Ob21icmUgZGUgZW1wcmVzYSBVRERJCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRV9OQU1FPU5vbWJyZSBkZSBzZXJ2aWNpbyBVRERJCi1GT1JNX0xBQkVMX0xBTkdVQUdFPUxlbmd1YWplCi1GT1JNX0xBQkVMX0FCU1RSQUNUPUFic3RyYWN0bwotRk9STV9MQUJFTF9OQU1FPU5vbWJyZQotRk9STV9MQUJFTF9XU0RMX0JJTkRJTkdTPUVubGFjZXMgV1NETAotRk9STV9MQUJFTF9OQU1FU1BBQ0VfVVJJPVVSSSBkZSBlc3BhY2lvIGRlIG5vbWJyZXMKLUZPUk1fTEFCRUxfTE9DQUxfTkFNRT1Ob21icmUgbG9jYWwKLUZPUk1fTEFCRUxfSU5RVUlSWV9BUEk9QVBJIGRlIGNvbnN1bHRhCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPUNsYXZlIGRlIHNlcnZpY2lvCi1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1DbGF2ZSBkZSBlbXByZXNhCi1GT1JNX0xBQkVMX0RJU0NPVkVSWV9VUkw9VVJMIGRlIGRlc2N1YnJpbWllbnRvCi1GT1JNX0xBQkVMX1dTSUw9RGV0YWxsZXMgZGUgV1NJTAotRk9STV9MQUJFTF9XU0lMX0xJTktTPUVubGFjZXMgV1NJTAotRk9STV9MQUJFTF9XU0RMX1NFUlZJQ0U9U2VydmljaW9zIFdTREwKLUZPUk1fTEFCRUxfVURESV9TRVJWSUNFPVNlcnZpY2lvcyBVRERJCi1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1M9RW1wcmVzYXMgVURESQotRk9STV9MQUJFTF9BRERfVE9fTkFWSUdBVE9SPUFcdTAwZjFhZGlyIGEgbmF2ZWdhZG9yCi1GT1JNX0xBQkVMX0FERF9UT19GQVZPUklURVM9QVx1MDBmMWFkaXIgYSBmYXZvcml0b3MKLUZPUk1fTEFCRUxfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9QVx1MDBmMWFkaXIgYSBwXHUwMGUxZ2luYSBVRERJCi1GT1JNX0xBQkVMX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFPUFcdTAwZjFhZGlyIGEgcFx1MDBlMWdpbmEgV1NETAotRk9STV9MQUJFTF9SRUZSRVNIPVJlbm92YXIKLUZPUk1fTEFCRUxfTkE9Ti9ECi1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfU0VSVklDRT1TZXJ2aWNpbyBubyBkaXNwb25pYmxlOgotRk9STV9MQUJFTF9VTkFWQUlMQUJMRV9VRERJX0JVU0lORVNTPUVtcHJlc2Egbm8gZGlzcG9uaWJsZToKLUZPUk1fTEFCRUxfQ0hPT1NFX1dTSUxfSU5TUEVDVElPTl9UWVBFPUVsaWphIGVsIHRpcG8gZGUgb2JqZXRvcyBxdWUgZGVzZWEgaW5zcGVjY2lvbmFyOgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMjhFIFNlbGVjY2lvbmUgY29tbyBtXHUwMGVkbmltbyB1biBlbGVtZW50by4KLQotIyBPcGVuV1NJTEFjdGlvbgotQUxUX09QRU5fV1NJTD1BYnJpciBXU0lMCi1GT1JNX0xBQkVMX09QRU5fV1NJTF9ERVNDPUVudHJlIGVsIFVSTCBkZSB1biBkb2N1bWVudG8gV1NJTCBvIHVuIGRvY3VtZW50byBIVE1MIHkgcHVsc2UgPHN0cm9uZz5Jcjwvc3Ryb25nPiBwYXJhIGFicmlyIGxhIGluc3BlY2NpXHUwMGYzbi4KLVdTSUxfVVJMPVVSTCBwYXJhIGRvY3VtZW50bzoKLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfVVJMPUlXQUIwMzk0RSAlMSBubyBlcyB1biBVUkwgV1NJTCBuaSB1biBVUkwgSFRNTCB2XHUwMGUxbGlkby4KLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzI5RSAlMSB5YSBlc3RcdTAwZTEgYWJpZXJ0byBlbiBlbCBuYXZlZ2Fkb3IuCi1NU0dfSU5GT19PUEVOX1dTSUxfU1VDQ0VTU0ZVTD1JV0FCMDMzMEkgJTEgc2UgaGEgYWJpZXJ0byBzYXRpc2ZhY3RvcmlhbWVudGUuCi0KLSMgT3BlbldTSUxMaW5rQWN0aW9uCi1BTFRfT1BFTl9XU0lMX0xJTks9QWJyaXIgZW5sYWNlIFdTSUwKLU1TR19FUlJPUl9XU0lMX0xJTktfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMzFFICUxIHlhIGVzdFx1MDBlMSBhYmllcnRvIGVuIGVsIG5hdmVnYWRvcgotTVNHX0lORk9fT1BFTl9XU0lMX0xJTktfU1VDQ0VTU0ZVTD1JV0FCMDMzMkkgJTEgc2UgaGEgYWJpZXJ0byBzYXRpc2ZhY3RvcmlhbWVudGUuCi0KLSMgV3NpbERldGFpbHNBY3Rpb24KLUFMVF9XU0lMX0RFVEFJTFM9RGV0YWxsZXMgZGUgV1NJTAotCi0jIFdzaWxTZXJ2aWNlRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfU0VSVklDRV9ERVRBSUxTPURldGFsbGVzIGRlIHNlcnZpY2lvIFdTSUwKLQotIyBVZGRpTGlua0RldGFpbHNBY3Rpb24KLUFMVF9VRERJX0xJTktfREVUQUlMUz1EZXRhbGxlcyBkZSBlbXByZXNhIFVEREkKLQotIyBXc2lsTGlua0RldGFpbHNBY3Rpb24KLUFMVF9XU0lMX0xJTktfREVUQUlMUz1EZXRhbGxlcyBkZSBlbmxhY2UgV1NJTAotCi0jIExpc3RXU0RMU2VydmljZXNBY3Rpb24KLUFMVF9MSVNUX1dTRExfU0VSVklDRVM9TGlzdGFyIHRvZG9zIGxvcyBzZXJ2aWNpb3MgV1NETAotRk9STV9MQUJFTF9MSVNUX1dTRExfU0VSVklDRVNfREVTQz1TZWxlY2Npb25lIHVuIGNvbmp1bnRvIGRlIHNlcnZpY2lvcyBXU0RMIHkgcHVsc2UgPHN0cm9uZz5BXHUwMGYxYWRpciBhIGZhdm9yaXRvczwvc3Ryb25nPiBwYXJhIGFcdTAwZjFhZGlybG9zIGEgbGEgbGlzdGEgZGUgZmF2b3JpdG9zLgotCi0jIExpc3RVRERJU2VydmljZXNBY3Rpb24KLUFMVF9MSVNUX1VERElfU0VSVklDRVM9TGlzdGFyIHRvZG9zIGxvcyBzZXJ2aWNpb3MgVURESQotRk9STV9MQUJFTF9MSVNUX1VERElfU0VSVklDRVNfREVTQz1TZWxlY2Npb25lIHVuIGNvbmp1bnRvIGRlIHNlcnZpY2lvcyBVRERJIHkgcHVsc2UgPHN0cm9uZz5BXHUwMGYxYWRpciBhIGZhdm9yaXRvczwvc3Ryb25nPiBwYXJhIGFcdTAwZjFhZGlybG9zIGEgbGEgbGlzdGEgZGUgZmF2b3JpdG9zLiBQdWxzZSA8c3Ryb25nPkFcdTAwZjFhZGlyIGEgcFx1MDBlMWdpbmEgVURESTwvc3Ryb25nPiBwYXJhIGFcdTAwZjFhZGlyIGxhcyBzZWxlY2Npb25lcyBhIGxhIFBcdTAwZTFnaW5hIFVEREkuIFB1bHNlIDxzdHJvbmc+UmVub3Zhcjwvc3Ryb25nPiBwYXJhIHJlbm92YXIgbGFzIHNlbGVjY2lvbmVzLgotCi0jIExpc3RVRERJQnVzaW5lc3Nlc0FjdGlvbgotQUxUX0xJU1RfVURESV9MSU5LUz1MaXN0YXIgdG9kYXMgbGFzIGVtcHJlc2FzIFVEREkKLUZPUk1fTEFCRUxfTElTVF9VRERJX0JVU0lORVNTRVNfREVTQz1TZWxlY2Npb25lIHVuIGNvbmp1bnRvIGRlIGVtcHJlc2FzIFVEREkgeSBwdWxzZSA8c3Ryb25nPkFcdTAwZjFhZGlyIGEgZmF2b3JpdG9zPC9zdHJvbmc+IHBhcmEgYVx1MDBmMWFkaXJsYXMgYSBsYSBsaXN0YSBkZSBmYXZvcml0b3MuIFB1bHNlIDxzdHJvbmc+QVx1MDBmMWFkaXIgYSBwXHUwMGUxZ2luYSBVRERJPC9zdHJvbmc+IHBhcmEgYVx1MDBmMWFkaXJsYXMgYSBsYSBQXHUwMGUxZ2luYSBVRERJLiBQdWxzZSA8c3Ryb25nPlJlbm92YXI8L3N0cm9uZz4gcGFyYSByZW5vdmFyIGxhcyBzZWxlY2Npb25lcy4KLQotIyBMaXN0V1NJTExpbmtzQWN0aW9uCi1BTFRfTElTVF9XU0lMX0xJTktTPUxpc3RhciB0b2RvcyBsb3MgZW5sYWNlcyBXU0lMCi1GT1JNX0xBQkVMX0xJU1RfV1NJTF9MSU5LUz1TZWxlY2Npb25lIHVuIGNvbmp1bnRvIGRlIGVubGFjZXMgV1NJTCB5IHB1bHNlIDxzdHJvbmc+QVx1MDBmMWFkaXIgYSBuYXZlZ2Fkb3I8L3N0cm9uZz4gcGFyYSBhYnJpcmxvcyBlbiBlbCBuYXZlZ2Fkb3IuCi0KLSMgQ2xlYXJXU0lMQWN0aW9uCi1BTFRfQ0xFQVJfV1NJTD1Cb3JyYXIgV1NJTAotCi0jIFJlZnJlc2hBY3Rpb24KLUFMVF9SRUZSRVNIX1dTSUw9UmVub3ZhciBXU0lMCi1BTFRfUkVGUkVTSF9VRERJX0JVU0lORVNTPVJlbm92YXIgZW1wcmVzYSBVRERJCi1BTFRfUkVGUkVTSF9VRERJX1NFUlZJQ0U9UmVub3ZhciBzZXJ2aWNpbyBVRERJCi1NU0dfRVJST1JfV1NJTF9OT1RfRk9VTkQ9SVdBQjAzMzNFIE5vIHNlIGhhIHBvZGlkbyBjYXJnYXIgV1NJTCAlMS4KLU1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQ9SVdBQjAzMzRFIExhIGVtcHJlc2EgJTEgbm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbiBlbCByZWdpc3Ryby4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDMzNUUgRWwgc2VydmljaW8gJTEgbm8gc2UgaGEgcG9kaWRvIGVuY29udHJhciBlbiBlbCByZWdpc3Ryby4KLU1TR19JTkZPX1JFRlJFU0hfU1VDQ0VTU0ZVTD1JV0FCMDMzNkkgJTEgc2UgaGEgcmVub3ZhZG8uCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSB5YSBubyBwdWVkZSByZXNvbHZlcnNlLiAgXHUwMGJmRGVzZWEgYm9ycmFybG8/Ci0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfQlVTSU5FU1NfVE9fVURESV9QRVJTUEVDVElWRT1BXHUwMGYxYWRpciBlbXByZXNhIGEgcFx1MDBlMWdpbmEgVURESQotQUxUX0FERF9TRVJWSUNFX1RPX1VERElfUEVSU1BFQ1RJVkU9QVx1MDBmMWFkaXIgc2VydmljaW8gYSBwXHUwMGUxZ2luYSBVRERJCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzM3SSAlMSBzZSBhXHUwMGYxYWRlIGEgbGEgcFx1MDBlMWdpbmEgVURESS4KLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMzOEUgTm8gc2UgcHVlZGUgYVx1MDBmMWFkaXIgJTEgYSBsYSBwXHUwMGUxZ2luYSBVRERJLgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzOUUgTGEgZW1wcmVzYSAlMSBubyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGVuIGVsIHJlZ2lzdHJvLgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX0ZPVU5EPUlXQUIwMzQwRSBFbCBzZXJ2aWNpbyAlMSBubyBzZSBoYSBwb2RpZG8gZW5jb250cmFyIGVuIGVsIHJlZ2lzdHJvLgotCi0jIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9QVx1MDBmMWFkaXIgV1NETCBhIHBcdTAwZTFnaW5hIFdTREwKLU1TR19JTkZPX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDM5NUkgJTEgc2UgYVx1MDBmMWFkZSBhIGxhIHBcdTAwZTFnaW5hIFdTREwuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM5NkUgJTEgbm8gc2UgaGEgcG9kaWRvIGNhcmdhci4KLQotIyBBZGRXU0lMVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NJTF9UT19GQVZPUklURVM9QVx1MDBmMWFkaXIgV1NJTCBhIGZhdm9yaXRvcwotTVNHX0VSUk9SX0FERF9UT19GQVZPUklURVM9SVdBQjAzNDFFIE5vIHNlIHB1ZWRlIGFcdTAwZjFhZGlyICUxIGEgbG9zIGZhdm9yaXRvcy4KLU1TR19FUlJPUl9GQVZPUklURVNfQUxSRUFEWV9FWElTVFM9SVdBQjAzNDJFICUxIHlhIGV4aXN0ZSBlbiBsb3MgZmF2b3JpdG9zLgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzQzSSAlMSBzZSBhXHUwMGYxYWRlIGEgbG9zIGZhdm9yaXRvcy4KLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPUVsIGZhdm9yaXRvIHlhIGV4aXN0ZS4gIFx1MDBiZkRlc2VhIHNvYnJlc2NyaWJpcmxvPwotCi0jIEFkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NETF9TRVJWSUNFX1RPX0ZBVk9SSVRFUz1BXHUwMGYxYWRpciBXU0RMIGEgZmF2b3JpdG9zCi0KLSMgQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9VRERJX0JVU0lORVNTX1RPX0ZBVk9SSVRFUz1BXHUwMGYxYWRpciBlbXByZXNhIFVEREkgYSBmYXZvcml0b3MKLQotIyBBZGRTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfU0VSVklDRV9UT19GQVZPUklURVM9QVx1MDBmMWFkaXIgc2VydmljaW8gVURESSBhIGZhdm9yaXRvcwotCi0jIFdTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2gKLUFUTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0g9SW1wb3J0YXIgV1NJTCBhbCBlbnRvcm5vIGRlIHRyYWJham8KLUZPUk1fTEFCRUxfSU1QT1JUX1dTSUxfVE9fV09SS0JFTkNIX0RFU0M9U2VsZWNjaW9uZSB1biBwcm95ZWN0byBlbiBlbCBxdWUgZ3VhcmRhciBlbCBhcmNoaXZvIFdTSUwuIFRhbWJpXHUwMGU5biBwdWVkZSBjYW1iaWFyIGVsIG5vbWJyZSBkZWwgYXJjaGl2byBXU0lMLgotCi0jIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotQUxUX1dTSUxfSU1QT1JUX1RPX0ZTPUltcG9ydGFyIFdTSUwgYWwgc2lzdGVtYSBkZSBhcmNoaXZvcwotQUxUX1dTRExfSU1QT1JUX1RPX0ZTPUltcG9ydGFyIFdTREwgYWwgc2lzdGVtYSBkZSBhcmNoaXZvcwotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1Db250ZW5lZG9yIGRlbCBuYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPUJhcnJhIGRlIGhlcnJhbWllbnRhcyBkZWwgbmF2ZWdhZG9yCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1Db250ZW5pZG8gZGVsIG5hdmVnYWRvcgotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9Q29udGVuZWRvciBkZSBhY2Npb25lcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9Q29udGVuZWRvciBkZSBwcm9waWVkYWRlcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPUNvbnRlbmlkbyBkZSBwcm9waWVkYWRlcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPUJhcnJhIGRlIGhlcnJhbWllbnRhcyBkZSBwcm9waWVkYWRlcwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1Db250ZW5lZG9yIGRlIGVzdGFkbwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9Q29udGVuaWRvIGRlIGVzdGFkbwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9QmFycmEgZGUgaGVycmFtaWVudGFzIGRlIGVzdGFkbwotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NJTD1BYnJpciBmb3JtdWxhcmlvIFdTSUwKLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPUZvcm11bGFyaW8gZGUgZGV0YWxsZXMgZGUgZW1wcmVzYSBVRERJCi1GT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTPUZvcm11bGFyaW8gZGUgZGV0YWxsZXMgZGUgc2VydmljaW8gVURESQotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1Gb3JtdWxhcmlvIERldGFsbGVzIGRlIHNlcnZpY2lvIFdTREwKLUZPUk1fVElUTEVfV1NJTF9ERVRBSUxTPUZvcm11bGFyaW8gZGUgZGV0YWxsZXMgZGUgV1NJTAotRk9STV9USVRMRV9XU0lMX0xJTktfREVUQUlMUz1Gb3JtdWxhcmlvIGRlIGRldGFsbGVzIGRlIGVubGFjZSBkZSBXU0lMCi0KLSMgVmlldyB0aXRsZXMKLVZJRVdfVElUTEVfVURESV9CVVNJTkVTU0VTPVZpc3RhIGRlIGVtcHJlc2FzIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFUz1WaXN0YSBkZSBzZXJ2aWNpb3MgVURESQotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VTPVZpc3RhIGRlIHNlcnZpY2lvcyBXU0RMCi1WSUVXX1RJVExFX1dTSUxfTElOS1M9VmlzdGEgZGUgZW5sYWNlcyBXU0lMCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsX2ZyLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsX2ZyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYzljZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF9mci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVdTSUwKLQotIyBOYXZpZ2F0b3IKLVdTSUxfTUFJTl9OT0RFPVdTSUwgLSBQYWdlIHByaW5jaXBhbGUKLQotIyBGb3JtcwotRk9STV9MQUJFTF9VUkw9VVJMCi1GT1JNX0xBQkVMX0lURU1fTlVNQkVSPU5cdTAwYjAgZGUgbCdcdTAwZTlsXHUwMGU5bWVudAotRk9STV9MQUJFTF9VRERJX0JVU0lORVNTX05BTUU9Tm9tIGR1IG1cdTAwZTl0aWVyIFVEREkKLUZPUk1fTEFCRUxfVURESV9TRVJWSUNFX05BTUU9Tm9tIGR1IHNlcnZpY2UgVURESQotRk9STV9MQUJFTF9MQU5HVUFHRT1MYW5ndWUKLUZPUk1fTEFCRUxfQUJTVFJBQ1Q9Ulx1MDBlOXN1bVx1MDBlOQotRk9STV9MQUJFTF9OQU1FPU5vbQotRk9STV9MQUJFTF9XU0RMX0JJTkRJTkdTPUxpYWlzb25zIFdTREwKLUZPUk1fTEFCRUxfTkFNRVNQQUNFX1VSST1VUkkgZGUgbCdlc3BhY2UgZGUgbm9tCi1GT1JNX0xBQkVMX0xPQ0FMX05BTUU9Tm9tIGxvY2FsCi1GT1JNX0xBQkVMX0lOUVVJUllfQVBJPUFQSSBkJ2ludGVycm9nYXRpb24KLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9Q2xcdTAwZTkgZHUgc2VydmljZQotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9Q2xcdTAwZTkgZHUgbVx1MDBlOXRpZXIKLUZPUk1fTEFCRUxfRElTQ09WRVJZX1VSTD1VUkwgZGUgcmVjaGVyY2hlCi1GT1JNX0xBQkVMX1dTSUw9SW5mb3JtYXRpb25zIHN1ciBsZSBmaWNoaWVyIFdTSUwKLUZPUk1fTEFCRUxfV1NJTF9MSU5LUz1MaWVucyBXU0lMCi1GT1JNX0xBQkVMX1dTRExfU0VSVklDRT1TZXJ2aWNlcyBXU0RMCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRT1TZXJ2aWNlcyBVRERJCi1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1M9TVx1MDBlOXRpZXJzIFVEREkKLUZPUk1fTEFCRUxfQUREX1RPX05BVklHQVRPUj1Bam91dGVyIGF1IG5hdmlnYXRldXIKLUZPUk1fTEFCRUxfQUREX1RPX0ZBVk9SSVRFUz1Bam91dGVyIGF1eCBmYXZvcmlzCi1GT1JNX0xBQkVMX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUFqb3V0ZXIgXHUwMGUwIGxhIHBhZ2UgVURESQotRk9STV9MQUJFTF9BRERfVE9fV1NETF9QRVJTUEVDVElWRT1Bam91dGVyIFx1MDBlMCBsYSBwYWdlIFdTREwKLUZPUk1fTEFCRUxfUkVGUkVTSD1SXHUwMGU5Z1x1MDBlOW5cdTAwZTlyYXRpb24KLUZPUk1fTEFCRUxfTkE9Tm9uIGRpc3BvbmlibGUKLUZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9TRVJWSUNFPVNlcnZpY2Ugbm9uIGRpc3BvbmlibGUgOgotRk9STV9MQUJFTF9VTkFWQUlMQUJMRV9VRERJX0JVU0lORVNTPU1cdTAwZTl0aWVyIG5vbiBkaXNwb25pYmxlIDoKLUZPUk1fTEFCRUxfQ0hPT1NFX1dTSUxfSU5TUEVDVElPTl9UWVBFPUNob2lzaXNzZXogbGUgdHlwZSBkZXMgb2JqZXRzIFx1MDBlMCBpbnNwZWN0ZXIgOgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMjhFIFNcdTAwZTlsZWN0aW9ubmV6IGF1IG1vaW5zIHVuIFx1MDBlOWxcdTAwZTltZW50LgotCi0jIE9wZW5XU0lMQWN0aW9uCi1BTFRfT1BFTl9XU0lMPU91dnJpciB1biBmaWNoaWVyIFdTSUwKLUZPUk1fTEFCRUxfT1BFTl9XU0lMX0RFU0M9SW5kaXF1ZXogbCdVUkwgZCd1biBkb2N1bWVudCBXU0lMIG91IGQndW4gZG9jdW1lbnQgSFRNTCBldCBjbGlxdWV6IHN1ciA8c3Ryb25nPk9LPC9zdHJvbmc+IHBvdXIgbGFuY2VyIGwnaW5zcGVjdGlvbi4KLVdTSUxfVVJMPVVSTCBkdSBkb2N1bWVudCA6Ci1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX1VSTD1JV0FCMDM5NEUgJTEgbidlc3QgcGFzIHVuZSBVUkwgV1NJTCBvdSBIVE1MIHZhbGlkZS4KLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzI5RSAlMSBlc3QgZFx1MDBlOWpcdTAwZTAgb3V2ZXJ0IGRhbnMgbGUgbmF2aWdhdGV1ci4KLU1TR19JTkZPX09QRU5fV1NJTF9TVUNDRVNTRlVMPUlXQUIwMzMwSSAlMSBhIFx1MDBlOXRcdTAwZTkgb3V2ZXJ0LgotCi0jIE9wZW5XU0lMTGlua0FjdGlvbgotQUxUX09QRU5fV1NJTF9MSU5LPU91dnJpciB1biBsaWVuIFdTSUwKLU1TR19FUlJPUl9XU0lMX0xJTktfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMzFFICUxIGVzdCBkXHUwMGU5alx1MDBlMCBvdXZlcnQgZGFucyBsZSBuYXZpZ2F0ZXVyCi1NU0dfSU5GT19PUEVOX1dTSUxfTElOS19TVUNDRVNTRlVMPUlXQUIwMzMySSAlMSBhIFx1MDBlOXRcdTAwZTkgb3V2ZXJ0LgotCi0jIFdzaWxEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9ERVRBSUxTPUluZm9ybWF0aW9ucyBzdXIgbGUgZmljaGllciBXU0lMCi0KLSMgV3NpbFNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFM9SW5mb3JtYXRpb25zIHN1ciBsZXMgc2VydmljZXMgV1NJTAotCi0jIFVkZGlMaW5rRGV0YWlsc0FjdGlvbgotQUxUX1VERElfTElOS19ERVRBSUxTPUNhcmFjdFx1MDBlOXJpc3RpcXVlcyBkZXMgbVx1MDBlOXRpZXJzIFVEREkKLQotIyBXc2lsTGlua0RldGFpbHNBY3Rpb24KLUFMVF9XU0lMX0xJTktfREVUQUlMUz1DYXJhY3RcdTAwZTlyaXN0aXF1ZXMgZGVzIGxpZW5zIFdTSUwKLQotIyBMaXN0V1NETFNlcnZpY2VzQWN0aW9uCi1BTFRfTElTVF9XU0RMX1NFUlZJQ0VTPVJcdTAwZTlwZXJ0b3JpZXIgdG91cyBsZXMgc2VydmljZXMgV1NETAotRk9STV9MQUJFTF9MSVNUX1dTRExfU0VSVklDRVNfREVTQz1TXHUwMGU5bGVjdGlvbm5leiB1biBncm91cGUgZGUgc2VydmljZXMgV1NETCBldCBjbGlxdWV6IHN1ciA8c3Ryb25nPkFqb3V0ZXIgYXV4IGZhdm9yaXM8L3N0cm9uZz4gcG91ciBsZXMgYWpvdXRlciBcdTAwZTAgbGEgbGlzdGUgZGVzIGZhdm9yaXMuCi0KLSMgTGlzdFVERElTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfVURESV9TRVJWSUNFUz1SXHUwMGU5cGVydG9yaWVyIHRvdXMgbGVzIHNlcnZpY2VzIFVEREkKLUZPUk1fTEFCRUxfTElTVF9VRERJX1NFUlZJQ0VTX0RFU0M9U1x1MDBlOWxlY3Rpb25uZXogdW4gZ3JvdXBlIGRlIHNlcnZpY2VzIFVEREkgZXQgY2xpcXVleiBzdXIgPHN0cm9uZz5Bam91dGVyIGF1eCBmYXZvcmlzPC9zdHJvbmc+IHBvdXIgbGVzIGFqb3V0ZXIgXHUwMGUwIGxhIGxpc3RlIGRlcyBmYXZvcmlzLiBDbGlxdWV6IHN1ciA8c3Ryb25nPkFqb3V0ZXIgXHUwMGUwIGxhIHBhZ2UgVURESTwvc3Ryb25nPiBwb3VyIGFqb3V0ZXIgbGVzIHNcdTAwZTlsZWN0aW9ucyBcdTAwZTAgbGEgcGFnZSBVRERJLiBDbGlxdWV6IHN1ciA8c3Ryb25nPlJcdTAwZTlnXHUwMGU5blx1MDBlOXJlcjwvc3Ryb25nPiBwb3VyIHJcdTAwZTlnXHUwMGU5blx1MDBlOXJlciBsZXMgc1x1MDBlOWxlY3Rpb25zLgotCi0jIExpc3RVRERJQnVzaW5lc3Nlc0FjdGlvbgotQUxUX0xJU1RfVURESV9MSU5LUz1SXHUwMGU5cGVydG9yaWVyIHRvdXMgbGVzIG1cdTAwZTl0aWVycyBVRERJCi1GT1JNX0xBQkVMX0xJU1RfVURESV9CVVNJTkVTU0VTX0RFU0M9U1x1MDBlOWxlY3Rpb25uZXogdW4gZ3JvdXBlIGRlIG1cdTAwZTl0aWVycyBVRERJIGV0IGNsaXF1ZXogc3VyIDxzdHJvbmc+QWpvdXRlciBhdXggZmF2b3Jpczwvc3Ryb25nPiBwb3VyIGxlcyBham91dGVyIFx1MDBlMCBsYSBsaXN0ZSBkZXMgZmF2b3Jpcy4gQ2xpcXVleiBzdXIgPHN0cm9uZz5Bam91dGVyIFx1MDBlMCBsYSBwYWdlIFVEREk8L3N0cm9uZz4gcG91ciBsZXMgYWpvdXRlciBcdTAwZTAgbGEgcGFnZSBVRERJLiBDbGlxdWV6IHN1ciA8c3Ryb25nPlJcdTAwZTlnXHUwMGU5blx1MDBlOXJlcjwvc3Ryb25nPiBwb3VyIHJcdTAwZTlnXHUwMGU5blx1MDBlOXJlciBsZXMgc1x1MDBlOWxlY3Rpb25zLgotCi0jIExpc3RXU0lMTGlua3NBY3Rpb24KLUFMVF9MSVNUX1dTSUxfTElOS1M9Ulx1MDBlOXBlcnRvcmllciB0b3VzIGxlcyBsaWVucyBXU0lMCi1GT1JNX0xBQkVMX0xJU1RfV1NJTF9MSU5LUz1TXHUwMGU5bGVjdGlvbm5leiB1biBncm91cGUgZGUgbGllbnMgV1NJTCBldCBjbGlxdWV6IHN1ciA8c3Ryb25nPkFqb3V0ZXIgYXUgbmF2aWdhdGV1cjwvc3Ryb25nPiBwb3VyIG91dnJpciBjZXMgbGllbnMgZGFucyBsZSBuYXZpZ2F0ZXVyLgotCi0jIENsZWFyV1NJTEFjdGlvbgotQUxUX0NMRUFSX1dTSUw9RWZmYWNlciBsZXMgZG9jdW1lbnRzIFdTSUwKLQotIyBSZWZyZXNoQWN0aW9uCi1BTFRfUkVGUkVTSF9XU0lMPVJcdTAwZTlnXHUwMGU5blx1MDBlOXJlciBsZXMgZG9jdW1lbnRzIFdTSUwKLUFMVF9SRUZSRVNIX1VERElfQlVTSU5FU1M9Ulx1MDBlOWdcdTAwZTluXHUwMGU5cmVyIGxlIG1cdTAwZTl0aWVyIFVEREkKLUFMVF9SRUZSRVNIX1VERElfU0VSVklDRT1SXHUwMGU5Z1x1MDBlOW5cdTAwZTlyZXIgbGUgc2VydmljZSBVRERJCi1NU0dfRVJST1JfV1NJTF9OT1RfRk9VTkQ9SVdBQjAzMzNFIExlIGRvY3VtZW50IFdTSUwgJTEgbidhIHBhcyBwdSBcdTAwZWF0cmUgY2hhcmdcdTAwZTkuCi1NU0dfRVJST1JfQlVTSU5FU1NfTk9UX0ZPVU5EPUlXQUIwMzM0RSBMZSBtXHUwMGU5dGllciAlMSBlc3QgaW50cm91dmFibGUgZGFucyBsZSByZWdpc3RyZS4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDMzNUUgTGUgc2VydmljZSAlMSBlc3QgaW50cm91dmFibGUgZGFucyBsZSByZWdpc3RyZS4KLU1TR19JTkZPX1JFRlJFU0hfU1VDQ0VTU0ZVTD1JV0FCMDMzNkkgJTEgZXN0IHJcdTAwZTlnXHUwMGU5blx1MDBlOXJcdTAwZTkuCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSBuZSBwZXV0IHBsdXMgXHUwMGVhdHJlIHJcdTAwZTlzb2x1LiAgVm91bGV6LXZvdXMgbCdlZmZhY2VyID8KLQotIyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9CVVNJTkVTU19UT19VRERJX1BFUlNQRUNUSVZFPUFqb3V0ZXIgbGUgbVx1MDBlOXRpZXIgXHUwMGUwIGxhIHBhZ2UgVURESQotQUxUX0FERF9TRVJWSUNFX1RPX1VERElfUEVSU1BFQ1RJVkU9QWpvdXRlciBsZSBzZXJ2aWNlIFx1MDBlMCBsYSBwYWdlIFVEREkKLU1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMzdJICUxIGVzdCBham91dFx1MDBlOSBcdTAwZTAgbGEgcGFnZSBVRERJLgotTVNHX0VSUk9SX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUlXQUIwMzM4RSBJbXBvc3NpYmxlIGQnYWpvdXRlciAlMSBcdTAwZTAgbGEgcGFnZSBVRERJLgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzOUUgTGUgbVx1MDBlOXRpZXIgJTEgZXN0IGludHJvdXZhYmxlIGRhbnMgbGUgcmVnaXN0cmUuCi1NU0dfRVJST1JfU0VSVklDRV9OT1RfRk9VTkQ9SVdBQjAzNDBFIExlIHNlcnZpY2UgJTEgZXN0IGludHJvdXZhYmxlIGRhbnMgbGUgcmVnaXN0cmUuCi0KLSMgV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1Bam91dGVyIGxlIGRvY3VtZW50IFdTREwgXHUwMGUwIGxhIHBhZ2UgV1NETAotTVNHX0lORk9fQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzk1SSAlMSBlc3QgYWpvdXRcdTAwZTkgXHUwMGUwIGxhIHBhZ2UgV1NETC4KLU1TR19FUlJPUl9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzk2RSAlMSBuJ2EgcGFzIHB1IFx1MDBlYXRyZSBjaGFyZ1x1MDBlOS4KLQotIyBBZGRXU0lMVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NJTF9UT19GQVZPUklURVM9QWpvdXRlciBsZSBkb2N1bWVudCBXU0lMIGF1eCBmYXZvcmlzCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM0MUUgSW1wb3NzaWJsZSBkJ2Fqb3V0ZXIgJTEgYXV4IGZhdm9yaXMuCi1NU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzQyRSAlMSBleGlzdGUgZFx1MDBlOWpcdTAwZTAgZGFucyBsZXMgZmF2b3Jpcy4KLU1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTD1JV0FCMDM0M0kgJTEgZXN0IGFqb3V0XHUwMGU5IGF1eCBmYXZvcmlzLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9TGUgZmF2b3JpIGV4aXN0ZSBkXHUwMGU5alx1MDBlMC4gIFZvdWxlei12b3VzIGxlIHJlbXBsYWNlciA/Ci0KLSMgQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0RMX1NFUlZJQ0VfVE9fRkFWT1JJVEVTPUFqb3V0ZXIgbGUgZG9jdW1lbnQgV1NETCBhdXggZmF2b3JpcwotCi0jIEFkZEJ1c2luZXNzVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfVURESV9CVVNJTkVTU19UT19GQVZPUklURVM9QWpvdXRlciBsZSBtXHUwMGU5dGllciBVRERJIGF1eCBmYXZvcmlzCi0KLSMgQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1NFUlZJQ0VfVE9fRkFWT1JJVEVTPUFqb3V0ZXIgbGUgc2VydmljZSBVRERJIGF1eCBmYXZvcmlzCi0KLSMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaAotQVRMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSD1JbXBvcnRlciB1biBmaWNoaWVyIFdTSUwgZGFucyBsZSBwbGFuIGRlIHRyYXZhaWwKLUZPUk1fTEFCRUxfSU1QT1JUX1dTSUxfVE9fV09SS0JFTkNIX0RFU0M9U1x1MDBlOWxlY3Rpb25uZXogdW4gcHJvamV0IGR1IHBsYW4gZGUgdHJhdmFpbCBwb3VyIHkgc2F1dmVnYXJkZXIgbGUgZmljaGllciBXU0lMLiBWb3VzIHBvdXZleiBhdXNzaSBjaGFuZ2VyIGxlIG5vbSBkdSBmaWNoaWVyIFdTSUwuCi0KLSMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uCi1BTFRfV1NJTF9JTVBPUlRfVE9fRlM9SW1wb3J0ZXIgdW4gZmljaGllciBXU0lMIGRhbnMgbGUgc3lzdFx1MDBlOG1lIGRlIGZpY2hpZXJzCi1BTFRfV1NETF9JTVBPUlRfVE9fRlM9SW1wb3J0ZXIgdW4gZG9jdW1lbnQgV1NETCBkYW5zIGxlIHN5c3RcdTAwZThtZSBkZSBmaWNoaWVycwotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1OYXZpZ2F0ZXVyIC0gQ29udGVuZXVyCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1OYXZpZ2F0ZXVyIC0gQmFycmUgZCdvdXRpbHMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPU5hdmlnYXRldXIgLSBDb250ZW51Ci1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1Db250ZW5ldXIgZCdhY3Rpb25zCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1Db250ZW5ldXIgZGUgcHJvcHJpXHUwMGU5dFx1MDBlOXMKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1Db250ZW51IGRlcyBwcm9wcmlcdTAwZTl0XHUwMGU5cwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPUJhcnJlIGQnb3V0aWxzIGRlcyBwcm9wcmlcdTAwZTl0XHUwMGU5cwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1Db250ZW5ldXIgZGUgc3RhdHV0cwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9Q29udGVudSBkZXMgc3RhdHV0cwotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9QmFycmUgZCdvdXRpbHMgZGVzIHN0YXR1dHMKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9PUEVOX1dTSUw9Rm9ybXVsYWlyZSBPdXZlcnR1cmUgZCd1biBmaWNoaWVyIFdTSUwKLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPUZvcm11bGFpcmUgSW5mb3JtYXRpb25zIHN1ciBsZSBtXHUwMGU5dGllciBVRERJCi1GT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTPUZvcm11bGFpcmUgSW5mb3JtYXRpb25zIHN1ciBsZSBzZXJ2aWNlIFVEREkKLUZPUk1fVElUTEVfV1NETF9TRVJWSUNFX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIHNlcnZpY2UgV1NETAotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9Rm9ybXVsYWlyZSBJbmZvcm1hdGlvbnMgc3VyIGxlIGZpY2hpZXIgV1NJTAotRk9STV9USVRMRV9XU0lMX0xJTktfREVUQUlMUz1Gb3JtdWxhaXJlIEluZm9ybWF0aW9ucyBzdXIgbGUgbGllbiBXU0lMCi0KLSMgVmlldyB0aXRsZXMKLVZJRVdfVElUTEVfVURESV9CVVNJTkVTU0VTPVZ1ZSBkZXMgbVx1MDBlOXRpZXJzIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFUz1WdWUgZGVzIHNlcnZpY2VzIFVEREkKLVZJRVdfVElUTEVfV1NETF9TRVJWSUNFUz1WdWUgZGVzIHNlcnZpY2VzIFdTREwKLVZJRVdfVElUTEVfV1NJTF9MSU5LUz1WdWUgZGVzIGxpZW5zIFdTSUwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfaXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfaXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwZTAyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsX2l0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9V1NJTAotCi0jIE5hdmlnYXRvcgotV1NJTF9NQUlOX05PREU9V1NJTCBwcmluY2lwYWxlCi0KLSMgRm9ybXMKLUZPUk1fTEFCRUxfVVJMPVVSTAotRk9STV9MQUJFTF9JVEVNX05VTUJFUj1FbGVtZW50byBuLgotRk9STV9MQUJFTF9VRERJX0JVU0lORVNTX05BTUU9Tm9tZSBidXNpbmVzcyBVRERJCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRV9OQU1FPU5vbWUgc2Vydml6aW8gVURESQotRk9STV9MQUJFTF9MQU5HVUFHRT1MaW5ndWEKLUZPUk1fTEFCRUxfQUJTVFJBQ1Q9QXN0cmF0dGEKLUZPUk1fTEFCRUxfTkFNRT1Ob21lCi1GT1JNX0xBQkVMX1dTRExfQklORElOR1M9QmluZGluZyBXU0RMCi1GT1JNX0xBQkVMX05BTUVTUEFDRV9VUkk9VVJJIHNwYXppbyBkZWkgbm9taQotRk9STV9MQUJFTF9MT0NBTF9OQU1FPU5vbWUgbG9jYWxlCi1GT1JNX0xBQkVMX0lOUVVJUllfQVBJPUFQSSBkaSByaWNoaWVzdGEKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9Q2hpYXZlIHNlcnZpemlvCi1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1DaGlhdmUgYnVzaW5lc3MKLUZPUk1fTEFCRUxfRElTQ09WRVJZX1VSTD1VUkwgZGkgcmlsZXZhbWVudG8KLUZPUk1fTEFCRUxfV1NJTD1EZXR0YWdsaSBXU0lMCi1GT1JNX0xBQkVMX1dTSUxfTElOS1M9Q29sbGVnYW1lbnRpIFdTSUwKLUZPUk1fTEFCRUxfV1NETF9TRVJWSUNFPVNlcnZpemkgV1NETAotRk9STV9MQUJFTF9VRERJX1NFUlZJQ0U9U2Vydml6aSBVRERJCi1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1M9QnVzaW5lc3MgVURESQotRk9STV9MQUJFTF9BRERfVE9fTkFWSUdBVE9SPUFnZ2l1bmdpIGFsbGEgcGFnaW5hIFNlbGV6aW9uZQotRk9STV9MQUJFTF9BRERfVE9fRkFWT1JJVEVTPUFnZ2l1bmdpIGFsbGEgcGFnaW5hIFByZWZlcml0aQotRk9STV9MQUJFTF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1BZ2dpdW5naSBhbGxhIHBhZ2luYSBVRERJCi1GT1JNX0xBQkVMX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFPUFnZ2l1bmdpIGFsbGEgcGFnaW5hIFdTREwKLUZPUk1fTEFCRUxfUkVGUkVTSD1BZ2dpb3JuYQotRk9STV9MQUJFTF9OQT1OL0QKLUZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9TRVJWSUNFPVNlcnZpemlvIG5vbiBkaXNwb25pYmlsZToKLUZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9CVVNJTkVTUz1CdXNpbmVzcyBub24gZGlzcG9uaWJpbGU6Ci1GT1JNX0xBQkVMX0NIT09TRV9XU0lMX0lOU1BFQ1RJT05fVFlQRT1TY2VnbGllcmUgaWwgdGlwbyBkaSBvZ2dldHRpIGRhIGVzYW1pbmFyZToKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzI4RSBTZWxlemlvbmFyZSBhbG1lbm8gdW4gZWxlbWVudG8uCi0KLSMgT3BlbldTSUxBY3Rpb24KLUFMVF9PUEVOX1dTSUw9QXByaSBXU0lMCi1GT1JNX0xBQkVMX09QRU5fV1NJTF9ERVNDPUltbWV0dGVyZSBsJ1VSTCBkaSB1biBkb2N1bWVudG8gV1NJTCBvIGRpIHVuIGRvY3VtZW50byBIVE1MIGUgZmFyZSBjbGljIHN1IDxzdHJvbmc+VmFpPC9zdHJvbmc+IHBlciBpbml6aWFyZSBsJ2VzYW1lLgotV1NJTF9VUkw9VVJMIHBlciBpbCBkb2N1bWVudG86Ci1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX1VSTD1JV0FCMDM5NEUgJTEgbm9uIFx1MDBlOCB1biBVUkwgV1NJTCBvIHVuIFVSTCBIVE1MIHZhbGlkby4KLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzI5RSAlMSBcdTAwZTggZ2lcdTAwZTAgYXBlcnRvIG5lbGxhIHBhZ2luYSBkaSBzZWxlemlvbmUuCi1NU0dfSU5GT19PUEVOX1dTSUxfU1VDQ0VTU0ZVTD1JV0FCMDMzMEkgJTEgXHUwMGU4IHN0YXRvIGFwZXJ0byBjb3JyZXR0YW1lbnRlLgotCi0jIE9wZW5XU0lMTGlua0FjdGlvbgotQUxUX09QRU5fV1NJTF9MSU5LPUFwcmkgY29sbGVnYW1lbnRvIFdTSUwKLU1TR19FUlJPUl9XU0lMX0xJTktfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMzFFICUxIFx1MDBlOCBnaVx1MDBlMCBhcGVydG8gbmVsbGEgcGFnaW5hIGRpIHNlbGV6aW9uZS4KLU1TR19JTkZPX09QRU5fV1NJTF9MSU5LX1NVQ0NFU1NGVUw9SVdBQjAzMzJJICUxIFx1MDBlOCBzdGF0byBhcGVydG8gY29ycmV0dGFtZW50ZS4KLQotIyBXc2lsRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfREVUQUlMUz1EZXR0YWdsaSBXU0lMCi0KLSMgV3NpbFNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFM9RGV0dGFnbGkgc2Vydml6aW8gV1NJTAotCi0jIFVkZGlMaW5rRGV0YWlsc0FjdGlvbgotQUxUX1VERElfTElOS19ERVRBSUxTPURldHRhZ2xpIGJ1c2luZXNzIFVEREkKLQotIyBXc2lsTGlua0RldGFpbHNBY3Rpb24KLUFMVF9XU0lMX0xJTktfREVUQUlMUz1EZXR0YWdsaSBjb2xsZWdhbWVudG8gV1NJTAotCi0jIExpc3RXU0RMU2VydmljZXNBY3Rpb24KLUFMVF9MSVNUX1dTRExfU0VSVklDRVM9VmlzdWFsaXp6YSB0dXR0aSBpIHNlcnZpemkgV1NETAotRk9STV9MQUJFTF9MSVNUX1dTRExfU0VSVklDRVNfREVTQz1TZWxlemlvbmFyZSB1biBpbnNpZW1lIGRpIHNlcnZpemkgV1NETCBlIGZhcmUgY2xpYyBzdSA8c3Ryb25nPkFhZ2dpdW5naSBhIHByZWZlcml0aTwvc3Ryb25nPiBwZXIgYWdnaXVuZ2VyZSBpIHNlcnZpemkgYWxsJ2VsZW5jbyBkaSBwcmVmZXJpdGkuCi0KLSMgTGlzdFVERElTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfVURESV9TRVJWSUNFUz1WaXN1YWxpenphIHR1dHRpIGkgc2Vydml6aSBVRERJCi1GT1JNX0xBQkVMX0xJU1RfVURESV9TRVJWSUNFU19ERVNDPVNlbGV6aW9uYXJlIHVuIGluc2llbWUgZGkgc2Vydml6aSBVRERJIGUgZmFyZSBjbGljIHN1IDxzdHJvbmc+QWFnZ2l1bmdpIGEgcHJlZmVyaXRpPC9zdHJvbmc+IHBlciBhZ2dpdW5nZXJlIGkgc2Vydml6aSBhbGwnZWxlbmNvIGRpIHByZWZlcml0aS4gRmFyZSBjbGljIHN1IDxzdHJvbmc+QWdnaXVuZ2kgYWxsYSBwYWdpbmEgVURESTwvc3Ryb25nPiBwZXIgYWdnaXVuZ2VyZSBsZSBzZWxlemlvbmkgYWxsYSBwYWdpbmEgVURESS4gRmFyZSBjbGljIHN1IDxzdHJvbmc+QWdnaW9ybmE8L3N0cm9uZz4gcGVyIGFnZ2lvcm5hcmUgbGUgc2VsZXppb25pLgotCi0jIExpc3RVRERJQnVzaW5lc3Nlc0FjdGlvbgotQUxUX0xJU1RfVURESV9MSU5LUz1WaXN1YWxpenphIHR1dHRpIGkgYnVzaW5lc3MgVURESQotRk9STV9MQUJFTF9MSVNUX1VERElfQlVTSU5FU1NFU19ERVNDPVNlbGV6aW9uYXJlIHVuIGluc2llbWUgZGkgYnVzaW5lc3MgVURESSBlIGZhcmUgY2xpYyBzdSA8c3Ryb25nPkFhZ2dpdW5naSBhIHByZWZlcml0aTwvc3Ryb25nPiBwZXIgYWdnaXVuZ2VyZSBpIGJ1c2luZXNzIGFsbCdlbGVuY28gZGkgcHJlZmVyaXRpLiBGYXJlIGNsaWMgc3UgPHN0cm9uZz5BZ2dpdW5naSBhbGxhIHBhZ2luYSBVRERJPC9zdHJvbmc+IHBlciBhZ2dpdW5nZXJlIGkgYnVzaW5lc3MgYWxsYSBwYWdpbmEgVURESS4gRmFyZSBjbGljIHN1IDxzdHJvbmc+QWdnaW9ybmE8L3N0cm9uZz4gcGVyIGFnZ2lvcm5hcmUgbGUgc2VsZXppb25pLgotCi0jIExpc3RXU0lMTGlua3NBY3Rpb24KLUFMVF9MSVNUX1dTSUxfTElOS1M9VmlzdWFsaXp6YSB0dXR0aSBpIGNvbGxlZ2FtZW50aSBXU0lMCi1GT1JNX0xBQkVMX0xJU1RfV1NJTF9MSU5LUz1TZWxlemlvbmFyZSB1biBpbnNpZW1lIGRpIGNvbGxlZ2FtZW50aSBXU0lMIGUgcHJlbWVyZSA8c3Ryb25nPkFnZ2l1bmdpIGFsbGEgcGFnaW5hIFNlbGV6aW9uZTwvc3Ryb25nPiBwZXIgYXByaXJlIGkgY29sbGVnYW1lbnRpIG5lbGxhIHBhZ2luYSBkaSAgc2VsZXppb25lLgotCi0jIENsZWFyV1NJTEFjdGlvbgotQUxUX0NMRUFSX1dTSUw9Q2FuY2VsbGEgV1NJTAotCi0jIFJlZnJlc2hBY3Rpb24KLUFMVF9SRUZSRVNIX1dTSUw9QWdnaW9ybmEgV1NJTAotQUxUX1JFRlJFU0hfVURESV9CVVNJTkVTUz1BZ2dpb3JuYSBidXNpbmVzcyBVRERJCi1BTFRfUkVGUkVTSF9VRERJX1NFUlZJQ0U9QWdnaW9ybmEgc2Vydml6aW8gVURESQotTVNHX0VSUk9SX1dTSUxfTk9UX0ZPVU5EPUlXQUIwMzMzRSBcdTAwYzggcG9zc2liaWxlIGNoZSBXU0lMICUxIG5vbiBzaWEgc3RhdG8gY2FyaWNhdG8uCi1NU0dfRVJST1JfQlVTSU5FU1NfTk9UX0ZPVU5EPUlXQUIwMzM0RSBcdTAwYzggcG9zc2liaWxlIGNoZSBpbCBidXNpbmVzcyAlMSBub24gc2lhIHN0YXRvIHRyb3ZhdG8gbmVsIHJlZ2lzdHJvLgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX0ZPVU5EPUlXQUIwMzM1RSBcdTAwYzggcG9zc2liaWxlIGNoZSBpbCBzZXJ2aXppbyAlMSBub24gc2lhIHN0YXRvIHRyb3ZhdG8gbmVsIHJlZ2lzdHJvLgotTVNHX0lORk9fUkVGUkVTSF9TVUNDRVNTRlVMPUlXQUIwMzM2SSAlMSB2aWVuZSBhZ2dpb3JuYXRvLgotTVNHX0NPTkZJUk1fUkVNT1ZFX05PREU9JTEgbm9uIFx1MDBlOCBwaVx1MDBmOSByaXNvbHZpYmlsZS4gIENhbmNlbGxhcmxvPwotCi0jIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX0JVU0lORVNTX1RPX1VERElfUEVSU1BFQ1RJVkU9QWdnaXVuZ2kgYnVzaW5lc3MgYWxsYSBwYWdpbmEgVURESQotQUxUX0FERF9TRVJWSUNFX1RPX1VERElfUEVSU1BFQ1RJVkU9QWdnaXVuZ2kgc2Vydml6aW8gYWxsYSBwYWdpbmEgVURESQotTVNHX0lORk9fQUREX1RPX1VERElfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMzN0kgJTEgdmllbmUgYWdnaXVudG8gYWxsYSBwYWdpbmEgVURESS4KLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMzOEUgSW1wb3NzaWJpbGUgYWdnaXVuZ2VyZSAlMSBhbGxhIHBhZ2luYSBVRERJLgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzOUUgXHUwMGM4IHBvc3NpYmlsZSBjaGUgaWwgYnVzaW5lc3MgJTEgbm9uIHNpYSBzdGF0byB0cm92YXRvIG5lbCByZWdpc3Ryby4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDM0MEUgXHUwMGM4IHBvc3NpYmlsZSBjaGUgaWwgc2Vydml6aW8gJTEgbm9uIHNpYSBzdGF0byB0cm92YXRvIG5lbCByZWdpc3Ryby4KLQotIyBXc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFPUFnZ2l1bmdpIFdTREwgYWxsYSBwYWdpbmEgV1NETAotTVNHX0lORk9fQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzk1SSAlMSB2aWVuZSBhZ2dpdW50byBhbGxhIHBhZ2luYSBXU0RMLgotTVNHX0VSUk9SX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzOTZFIFx1MDBjOCBwb3NzaWJpbGUgY2hlICUxIG5vbiBzaWEgc3RhdG8gY2FyaWNhdG8uCi0KLSMgQWRkV1NJTFRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTSUxfVE9fRkFWT1JJVEVTPUFnZ2l1bmdpIFdTSUwgYWkgcHJlZmVyaXRpCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM0MUUgSW1wb3NzaWJpbGUgYWdnaXVuZ2VyZSAlMSBhaSBwcmVmZXJpdGkuCi1NU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzQyRSAlMSBlc2lzdGUgZ2lcdTAwZTAgbmVpIHByZWZlcml0aS4KLU1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTD1JV0FCMDM0M0kgJTEgdmllbmUgYWdnaXVudG8gYWkgcHJlZmVyaXRpLgotTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVM9SSBwcmVmZXJpdGkgZXNpc3Rvbm8gZ2lcdTAwZTAuICBTb3ZyYXNjcml2ZXJsaT8KLQotIyBBZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfU0VSVklDRV9UT19GQVZPUklURVM9QWdnaXVuZ2kgV1NETCBhaSBwcmVmZXJpdGkKLQotIyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1VERElfQlVTSU5FU1NfVE9fRkFWT1JJVEVTPUFnZ2l1bmdpIGJ1c2luZXNzIFVEREkgYWkgcHJlZmVyaXRpCi0KLSMgQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1NFUlZJQ0VfVE9fRkFWT1JJVEVTPUFnZ2l1bmdpIHNlcnZpemlvIFVEREkgYWkgcHJlZmVyaXRpCi0KLSMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaAotQVRMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSD1JbXBvcnRhIFdTSUwgbmVsIHdvcmtiZW5jaAotRk9STV9MQUJFTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0hfREVTQz1TZWxlemlvbmFyZSB1biBwcm9nZXR0byBkZWwgd29ya2JlbmNoIGluIGN1aSBzYWx2YXJlIGlsIGZpbGUgV1NETC4gXHUwMGM4IHBvc3NpYmlsZSBhbmNoZSBtb2RpZmljYXJlIGlsIG5vbWUgZGVsIGZpbGUgV1NJTC4KLQotIyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLUFMVF9XU0lMX0lNUE9SVF9UT19GUz1JbXBvcnRhIFdTSUwgbmVsIGZpbGVzeXN0ZW0KLUFMVF9XU0RMX0lNUE9SVF9UT19GUz1JbXBvcnRhIFdTREwgbmVsIGZpbGVzeXN0ZW0KLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9Q29udGVuaXRvcmUgU2VsZXppb25lCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1CYXJyYSBkZWdsaSBzdHJ1bWVudGkgU2VsZXppb25lCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1Db250ZW51dG8gU2VsZXppb25lCi1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1Db250ZW5pdG9yZSBhemlvbmkKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPUNvbnRlbml0b3JlIHByb3ByaWV0XHUwMGUwCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9Q29udGVudXRvIHByb3ByaWV0XHUwMGUwCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9QmFycmEgZGVnbGkgc3RydW1lbnRpIHByb3ByaWV0XHUwMGUwCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPUNvbnRlbml0b3JlIHN0YXRvCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1Db250ZW51dG8gc3RhdG8KLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPUJhcnJhIGRlZ2xpIHN0cnVtZW50aSBzdGF0bwotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NJTD1BcHJpIG1vZHVsbyBXU0lMCi1GT1JNX1RJVExFX1VERElfQlVTSU5FU1NfREVUQUlMUz1Nb2R1bG8gZGV0dGFnbGkgYnVzaW5lc3MgVURESQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfREVUQUlMUz1Nb2R1bG8gZGV0dGFnbGkgc2Vydml6aW8gVURESQotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1Nb2R1bG8gZGV0dGFnbGkgc2Vydml6aW8gV1NETAotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9TW9kdWxvIGRldHRhZ2xpIFdTSUwKLUZPUk1fVElUTEVfV1NJTF9MSU5LX0RFVEFJTFM9TW9kdWxvIGRldHRhZ2xpIGNvbGxlZ2FtZW50byBXU0lMCi0KLSMgVmlldyB0aXRsZXMKLVZJRVdfVElUTEVfVURESV9CVVNJTkVTU0VTPVZpc3RhIEJ1c2luZXNzIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFUz1WaXN0YSBTZXJ2aXppIFVEREkKLVZJRVdfVElUTEVfV1NETF9TRVJWSUNFUz1WaXN0YSBTZXJ2aXppIFdTREwKLVZJRVdfVElUTEVfV1NJTF9MSU5LUz1WaXN0YSBDb2xsZWdhbWVudGkgV1NJTApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF9qYS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF9qYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzJiMGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfamEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0lMCi0KLSMgTmF2aWdhdG9yCi1XU0lMX01BSU5fTk9ERT1XU0lMIFx1MzBlMVx1MzBhNFx1MzBmMwotCi0jIEZvcm1zCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9XHU5ODA1XHU3NmVlXHU3NTZhXHU1M2Y3Ci1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1NfTkFNRT1VRERJIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1NTQwZAotRk9STV9MQUJFTF9VRERJX1NFUlZJQ0VfTkFNRT1VRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1NTQwZAotRk9STV9MQUJFTF9MQU5HVUFHRT1cdThhMDBcdThhOWUKLUZPUk1fTEFCRUxfQUJTVFJBQ1Q9XHU4OTgxXHU3ZDA0Ci1GT1JNX0xBQkVMX05BTUU9XHU1NDBkXHU1MjRkCi1GT1JNX0xBQkVMX1dTRExfQklORElOR1M9V1NETCBcdTMwZDBcdTMwYTRcdTMwZjNcdTMwYzdcdTMwYTNcdTMwZjNcdTMwYjAKLUZPUk1fTEFCRUxfTkFNRVNQQUNFX1VSST1cdTU0MGRcdTUyNGRcdTdhN2FcdTk1OTMgVVJJCi1GT1JNX0xBQkVMX0xPQ0FMX05BTUU9XHUzMGVkXHUzMGZjXHUzMGFiXHUzMGViXHU1NDBkCi1GT1JNX0xBQkVMX0lOUVVJUllfQVBJPVx1NzE2N1x1NGYxYSBBUEkKLUZPUk1fTEFCRUxfU0VSVklDRV9LRVk9XHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGFkXHUzMGZjCi1GT1JNX0xBQkVMX0JVU0lORVNTX0tFWT1cdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwZmJcdTMwYWRcdTMwZmMKLUZPUk1fTEFCRUxfRElTQ09WRVJZX1VSTD1cdTMwYzdcdTMwYTNcdTMwYjlcdTMwYWJcdTMwZDBcdTMwZWFcdTMwZmMgVVJMCi1GT1JNX0xBQkVMX1dTSUw9V1NJTCBcdThhNzNcdTdkMzAKLUZPUk1fTEFCRUxfV1NJTF9MSU5LUz1XU0lMIFx1MzBlYVx1MzBmM1x1MzBhZgotRk9STV9MQUJFTF9XU0RMX1NFUlZJQ0U9V1NETCBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkKLUZPUk1fTEFCRUxfVURESV9TRVJWSUNFPVVEREkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5Ci1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1M9VURESSBcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjkKLUZPUk1fTEFCRUxfQUREX1RPX05BVklHQVRPUj1cdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwNmJcdThmZmRcdTUyYTAKLUZPUk1fTEFCRUxfQUREX1RPX0ZBVk9SSVRFUz1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmJcdThmZmRcdTUyYTAKLUZPUk1fTEFCRUxfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9VURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTAKLUZPUk1fTEFCRUxfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTAKLUZPUk1fTEFCRUxfUkVGUkVTSD1cdTY2ZjRcdTY1YjAKLUZPUk1fTEFCRUxfTkE9Ti9BCi1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfU0VSVklDRT1cdTRmN2ZcdTc1MjhcdTRlMGRcdTUzZWZcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjk6Ci1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfQlVTSU5FU1M9XHU0ZjdmXHU3NTI4XHU0ZTBkXHU1M2VmXHUzMDZlXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5OgotRk9STV9MQUJFTF9DSE9PU0VfV1NJTF9JTlNQRUNUSU9OX1RZUEU9XHUzMGE0XHUzMGYzXHUzMGI5XHUzMGRhXHUzMGFmXHUzMGI3XHUzMGU3XHUzMGYzXHUzMDU5XHUzMDhiXHUzMGFhXHUzMGQ2XHUzMGI4XHUzMGE3XHUzMGFmXHUzMGM4XHUzMDZlXHUzMGJmXHUzMGE0XHUzMGQ3XHUzMDZlXHU5MDc4XHU2MjllOgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMjhFIFx1NWMxMVx1MzA2YVx1MzA0Zlx1MzA2OFx1MzA4MiAxIFx1MzA2NFx1MzA2ZVx1OTgwNVx1NzZlZVx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA2Nlx1MzA0Zlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMgotCi0jIE9wZW5XU0lMQWN0aW9uCi1BTFRfT1BFTl9XU0lMPVdTSUwgXHUzMDkyXHU5NThiXHUzMDRmCi1GT1JNX0xBQkVMX09QRU5fV1NJTF9ERVNDPVdTSUwgXHU2NTg3XHU2NmY4XHUzMDdlXHUzMDVmXHUzMDZmIEhUTUwgXHU2NTg3XHU2NmY4XHUzMDZlIFVSTCBcdTMwOTJcdTUxNjVcdTUyOWJcdTMwNTdcdTMwMDFcdTMwMGM8c3Ryb25nPlx1NWI5Zlx1ODg0Yzwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzBhNFx1MzBmM1x1MzBiOVx1MzBkYVx1MzBhZlx1MzBiN1x1MzBlN1x1MzBmM1x1MzA5Mlx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMgotV1NJTF9VUkw9XHU2NTg3XHU2NmY4XHUzMDZlIFVSTDoKLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfVVJMPUlXQUIwMzk0RSAlMSBcdTMwNmZcdTY3MDlcdTUyYjlcdTMwNmEgV1NJTCBVUkwgXHUzMDdlXHUzMDVmXHUzMDZmIEhUTUwgVVJMIFx1MzA2N1x1MzA2Zlx1MzA0Mlx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgotTVNHX0VSUk9SX1dTSUxfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMjlFICUxIFx1MzA2Zlx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzA2N1x1MzA1OVx1MzA2N1x1MzA2Ylx1OTU4Ylx1MzA0NFx1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMgotTVNHX0lORk9fT1BFTl9XU0lMX1NVQ0NFU1NGVUw9SVdBQjAzMzBJICUxIFx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotCi0jIE9wZW5XU0lMTGlua0FjdGlvbgotQUxUX09QRU5fV1NJTF9MSU5LPVdTSUwgXHUzMGVhXHUzMGYzXHUzMGFmXHUzMDkyXHU5NThiXHUzMDRmCi1NU0dfRVJST1JfV1NJTF9MSU5LX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzMxRSAlMSBcdTMwNmZcdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwNjdcdTMwNTlcdTMwNjdcdTMwNmJcdTk1OGJcdTMwNDRcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19JTkZPX09QRU5fV1NJTF9MSU5LX1NVQ0NFU1NGVUw9SVdBQjAzMzJJICUxIFx1MzA0Y1x1NmI2M1x1NWUzOFx1MzA2Ylx1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMgotCi0jIFdzaWxEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9ERVRBSUxTPVdTSUwgXHU4YTczXHU3ZDMwCi0KLSMgV3NpbFNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFM9V1NJTCBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdThhNzNcdTdkMzAKLQotIyBVZGRpTGlua0RldGFpbHNBY3Rpb24KLUFMVF9VRERJX0xJTktfREVUQUlMUz1VRERJIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1OGE3M1x1N2QzMAotCi0jIFdzaWxMaW5rRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfTElOS19ERVRBSUxTPVdTSUwgXHUzMGVhXHUzMGYzXHUzMGFmXHU4YTczXHU3ZDMwCi0KLSMgTGlzdFdTRExTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfV1NETF9TRVJWSUNFUz1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmUgV1NETCBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwOTJcdTMwZWFcdTMwYjlcdTMwYzgKLUZPUk1fTEFCRUxfTElTVF9XU0RMX1NFUlZJQ0VTX0RFU0M9V1NETCBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTMwYmJcdTMwYzNcdTMwYzhcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwMDFcdTMwMGM8c3Ryb25nPlx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2Ylx1OGZmZFx1NTJhMDwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1MzA1M1x1MzA4Y1x1MzA4OVx1MzA2ZVx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzA5Mlx1MzA0YVx1NmMxN1x1MzA2Ylx1NTE2NVx1MzA4YVx1MzA2ZVx1MzBlYVx1MzBiOVx1MzBjOFx1MzA2Ylx1OGZmZFx1NTJhMFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotCi0jIExpc3RVRERJU2VydmljZXNBY3Rpb24KLUFMVF9MSVNUX1VERElfU0VSVklDRVM9XHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZlIFVEREkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDkyXHUzMGVhXHUzMGI5XHUzMGM4Ci1GT1JNX0xBQkVMX0xJU1RfVURESV9TRVJWSUNFU19ERVNDPVVEREkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDZlXHUzMGJiXHUzMGMzXHUzMGM4XHUzMDkyXHU5MDc4XHU2MjllXHUzMDU3XHUzMDAxXHUzMDBjPHN0cm9uZz5cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmJcdThmZmRcdTUyYTA8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwOTJcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmVcdTMwZWFcdTMwYjlcdTMwYzhcdTMwNmJcdThmZmRcdTUyYTBcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjPHN0cm9uZz5VRERJIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1OGZmZFx1NTJhMDwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1OTA3OFx1NjI5ZVx1MzA5MiBVRERJIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1OGZmZFx1NTJhMFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBcdTMwMGM8c3Ryb25nPlx1NjZmNFx1NjViMDwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1MzBhZlx1MzBlYVx1MzBjM1x1MzBhZlx1MzA1N1x1MzA2Nlx1OTA3OFx1NjI5ZVx1MzA5Mlx1NjZmNFx1NjViMFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMgotCi0jIExpc3RVRERJQnVzaW5lc3Nlc0FjdGlvbgotQUxUX0xJU1RfVURESV9MSU5LUz1cdTMwNTlcdTMwNzlcdTMwNjZcdTMwNmUgVURESSBcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwOTJcdTMwZWFcdTMwYjlcdTMwYzgKLUZPUk1fTEFCRUxfTElTVF9VRERJX0JVU0lORVNTRVNfREVTQz1VRERJIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1MzA2ZVx1MzBiYlx1MzBjM1x1MzBjOFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzAwMVx1MzAwYzxzdHJvbmc+XHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU4ZmZkXHU1MmEwPC9zdHJvbmc+XHUzMDBkXHUzMDkyXHUzMGFmXHUzMGVhXHUzMGMzXHUzMGFmXHUzMDU3XHUzMDY2XHUzMDUzXHUzMDhjXHUzMDg5XHUzMDZlXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDkyXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZlXHUzMGVhXHUzMGI5XHUzMGM4XHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDAyIFx1MzAwYzxzdHJvbmc+VURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTA8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTMwNTNcdTMwOGNcdTMwODlcdTMwNmVcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwOTIgVURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTBcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIgXHUzMDBjPHN0cm9uZz5cdTY2ZjRcdTY1YjA8L3N0cm9uZz5cdTMwMGRcdTMwOTJcdTMwYWZcdTMwZWFcdTMwYzNcdTMwYWZcdTMwNTdcdTMwNjZcdTkwNzhcdTYyOWVcdTMwOTJcdTY2ZjRcdTY1YjBcdTMwNTdcdTMwN2VcdTMwNTlcdTMwMDIKLQotIyBMaXN0V1NJTExpbmtzQWN0aW9uCi1BTFRfTElTVF9XU0lMX0xJTktTPVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2ZSBXU0lMIFx1MzBlYVx1MzBmM1x1MzBhZlx1MzA5Mlx1MzBlYVx1MzBiOVx1MzBjOAotRk9STV9MQUJFTF9MSVNUX1dTSUxfTElOS1M9V1NJTCBcdTMwZWFcdTMwZjNcdTMwYWZcdTMwNmVcdTMwYmJcdTMwYzNcdTMwYzhcdTMwOTJcdTkwNzhcdTYyOWVcdTMwNTdcdTMwMDFcdTMwMGM8c3Ryb25nPlx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzA2Ylx1OGZmZFx1NTJhMDwvc3Ryb25nPlx1MzAwZFx1MzA5Mlx1NjJiY1x1MzA1N1x1MzA2Nlx1MzA1ZFx1MzA4Y1x1MzA4OVx1MzA2ZVx1MzBlYVx1MzBmM1x1MzBhZlx1MzA5Mlx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzA2N1x1OTU4Ylx1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMgotCi0jIENsZWFyV1NJTEFjdGlvbgotQUxUX0NMRUFSX1dTSUw9V1NJTCBcdTMwNmVcdTMwYWZcdTMwZWFcdTMwYTIKLQotIyBSZWZyZXNoQWN0aW9uCi1BTFRfUkVGUkVTSF9XU0lMPVdTSUwgXHUzMDZlXHU2NmY0XHU2NWIwCi1BTFRfUkVGUkVTSF9VRERJX0JVU0lORVNTPVVEREkgXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDZlXHU2NmY0XHU2NWIwCi1BTFRfUkVGUkVTSF9VRERJX1NFUlZJQ0U9VURESSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjlcdTMwNmVcdTY2ZjRcdTY1YjAKLU1TR19FUlJPUl9XU0lMX05PVF9GT1VORD1JV0FCMDMzM0UgV1NJTCAlMSBcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQ9SVdBQjAzMzRFIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOSAlMSBcdTMwNGNcdTMwZWNcdTMwYjhcdTMwYjlcdTMwYzhcdTMwZWFcdTMwZmNcdTMwNjdcdTg5OGJcdTMwNjRcdTMwNGJcdTMwOGFcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIKLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDMzNUUgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5ICUxIFx1MzA0Y1x1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2N1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMgotTVNHX0lORk9fUkVGUkVTSF9TVUNDRVNTRlVMPUlXQUIwMzM2SSAlMSBcdTMwNGNcdTY3MDBcdTY1YjBcdTg4NjhcdTc5M2FcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19DT05GSVJNX1JFTU9WRV9OT0RFPSUxIFx1MzA2Zlx1ODllM1x1NmM3YVx1MzA2N1x1MzA0ZFx1MzA2YVx1MzA0Zlx1MzA2YVx1MzA4YVx1MzA3ZVx1MzA1N1x1MzA1Zlx1MzAwMiAgXHUzMGFmXHUzMGVhXHUzMGEyXHUzMDU3XHUzMDdlXHUzMDU5XHUzMDRiPwotCi0jIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX0JVU0lORVNTX1RPX1VERElfUEVSU1BFQ1RJVkU9VURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwOTJcdThmZmRcdTUyYTAKLUFMVF9BRERfU0VSVklDRV9UT19VRERJX1BFUlNQRUNUSVZFPVVEREkgXHUzMGRhXHUzMGZjXHUzMGI4XHUzMDZiXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDkyXHU4ZmZkXHU1MmEwCi1NU0dfSU5GT19BRERfVE9fVURESV9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzM3SSAlMSBcdTMwNGMgVURESSBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMzOEUgICUxIFx1MzA5MiBVRERJIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1OGZmZFx1NTJhMFx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzOUUgXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5ICUxIFx1MzA0Y1x1MzBlY1x1MzBiOFx1MzBiOVx1MzBjOFx1MzBlYVx1MzBmY1x1MzA2N1x1ODk4Ylx1MzA2NFx1MzA0Ylx1MzA4YVx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Zlx1MzAwMgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX0ZPVU5EPUlXQUIwMzQwRSBcdTMwYjVcdTMwZmNcdTMwZDNcdTMwYjkgJTEgXHUzMDRjXHUzMGVjXHUzMGI4XHUzMGI5XHUzMGM4XHUzMGVhXHUzMGZjXHUzMDY3XHU4OThiXHUzMDY0XHUzMDRiXHUzMDhhXHUzMDdlXHUzMDViXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVmXHUzMDAyCi0KLSMgV3NpbEFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1XU0RMIFx1MzA5MiBXU0RMIFx1MzBkYVx1MzBmY1x1MzBiOFx1MzA2Ylx1OGZmZFx1NTJhMAotTVNHX0lORk9fQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRV9TVUNDRVNTRlVMPUlXQUIwMzk1SSAlMSBcdTMwNGMgV1NETCBcdTMwZGFcdTMwZmNcdTMwYjhcdTMwNmJcdThmZmRcdTUyYTBcdTMwNTVcdTMwOGNcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19FUlJPUl9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzk2RSAlMSBcdTMwOTJcdTMwZWRcdTMwZmNcdTMwYzlcdTMwNjdcdTMwNGRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNWZcdTMwMDIKLQotIyBBZGRXU0lMVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NJTF9UT19GQVZPUklURVM9V1NJTCBcdTMwOTJcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmJcdThmZmRcdTUyYTAKLU1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTPUlXQUIwMzQxRSAgJTEgXHUzMDkyXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDY3XHUzMDRkXHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyCi1NU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzQyRSAlMSBcdTMwNmZcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmJcdTMwNTlcdTMwNjdcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIKLU1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTD1JV0FCMDM0M0kgJTEgXHUzMDRjXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU4ZmZkXHU1MmEwXHUzMDU1XHUzMDhjXHUzMDdlXHUzMDU5XHUzMDAyCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1cdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmZcdTMwNTlcdTMwNjdcdTMwNmJcdTViNThcdTU3MjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIgIFx1NGUwYVx1NjZmOFx1MzA0ZFx1MzA1N1x1MzA3ZVx1MzA1OVx1MzA0Yj8KLQotIyBBZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfU0VSVklDRV9UT19GQVZPUklURVM9V1NETCBcdTMwOTJcdTMwNGFcdTZjMTdcdTMwNmJcdTUxNjVcdTMwOGFcdTMwNmJcdThmZmRcdTUyYTAKLQotIyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1VERElfQlVTSU5FU1NfVE9fRkFWT1JJVEVTPVVEREkgXHUzMGQzXHUzMGI4XHUzMGNkXHUzMGI5XHUzMDkyXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU4ZmZkXHU1MmEwCi0KLSMgQWRkU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1NFUlZJQ0VfVE9fRkFWT1JJVEVTPVVEREkgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMDkyXHUzMDRhXHU2YzE3XHUzMDZiXHU1MTY1XHUzMDhhXHUzMDZiXHU4ZmZkXHU1MmEwCi0KLSMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaAotQVRMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSD1XU0lMIFx1MzA5Mlx1MzBlZlx1MzBmY1x1MzBhZlx1MzBkOVx1MzBmM1x1MzBjMVx1MzA2Ylx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOAotRk9STV9MQUJFTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0hfREVTQz1XU0lMIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA5Mlx1NGZkZFx1N2JhMVx1MzA1OVx1MzA4Ylx1MzBlZlx1MzBmY1x1MzBhZlx1MzBkOVx1MzBmM1x1MzBjMVx1MzBmYlx1MzBkN1x1MzBlZFx1MzBiOFx1MzBhN1x1MzBhZlx1MzBjOFx1MzA5Mlx1OTA3OFx1NjI5ZVx1MzA1N1x1MzA3ZVx1MzA1OVx1MzAwMiBXU0lMIFx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzA2ZVx1NTQwZFx1NTI0ZFx1MzA5Mlx1NTkwOVx1NjZmNFx1MzA1OVx1MzA4Ylx1MzA1M1x1MzA2OFx1MzA4Mlx1MzA2N1x1MzA0ZFx1MzA3ZVx1MzA1OVx1MzAwMgotCi0jIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotQUxUX1dTSUxfSU1QT1JUX1RPX0ZTPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBmYlx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzA3OFx1MzA2ZSBXU0lMIFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOAotQUxUX1dTRExfSU1QT1JUX1RPX0ZTPVx1MzBkNVx1MzBhMVx1MzBhNFx1MzBlYlx1MzBmYlx1MzBiN1x1MzBiOVx1MzBjNlx1MzBlMFx1MzA3OFx1MzA2ZSBXU0RMIFx1MzA2ZVx1MzBhNFx1MzBmM1x1MzBkZFx1MzBmY1x1MzBjOAotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1cdTMwY2FcdTMwZDNcdTMwYjJcdTMwZmNcdTMwYmZcdTMwZmNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPVx1MzBjYVx1MzBkM1x1MzBiMlx1MzBmY1x1MzBiZlx1MzBmY1x1MzBmYlx1MzBjNFx1MzBmY1x1MzBlYlx1MzBkMFx1MzBmYwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9XHUzMGNhXHUzMGQzXHUzMGIyXHUzMGZjXHUzMGJmXHUzMGZjXHUzMGZiXHUzMGIzXHUzMGYzXHUzMGM2XHUzMGYzXHUzMGM0Ci1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1cdTMwYTJcdTMwYWZcdTMwYjdcdTMwZTdcdTMwZjNcdTMwZmJcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBjYVx1MzBmYwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05URU5UPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPVx1MzBkN1x1MzBlZFx1MzBkMVx1MzBjNlx1MzBhM1x1MzBmY1x1MzBmYlx1MzBjNFx1MzBmY1x1MzBlYlx1MzBkMFx1MzBmYwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUj1cdTcyYjZcdTZjYzFcdTMwYjNcdTMwZjNcdTMwYzZcdTMwY2FcdTMwZmMKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVx1NzJiNlx1NmNjMVx1MzBiM1x1MzBmM1x1MzBjNlx1MzBmM1x1MzBjNAotRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVI9XHU3MmI2XHU2Y2MxXHUzMGM0XHUzMGZjXHUzMGViXHUzMGQwXHUzMGZjCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfT1BFTl9XU0lMPVdTSUwgXHU2NmY4XHU1ZjBmXHUzMDkyXHU5NThiXHUzMDRmCi1GT1JNX1RJVExFX1VERElfQlVTSU5FU1NfREVUQUlMUz1VRERJIFx1MzBkM1x1MzBiOFx1MzBjZFx1MzBiOVx1OGE3M1x1N2QzMFx1NjZmOFx1NWYwZgotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfREVUQUlMUz1VRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1OGE3M1x1N2QzMFx1NjZmOFx1NWYwZgotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1OGE3M1x1N2QzMFx1NjZmOFx1NWYwZgotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9V1NJTCBcdThhNzNcdTdkMzBcdTY2ZjhcdTVmMGYKLUZPUk1fVElUTEVfV1NJTF9MSU5LX0RFVEFJTFM9V1NJTCBcdTMwZWFcdTMwZjNcdTMwYWZcdThhNzNcdTdkMzBcdTY2ZjhcdTVmMGYKLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTRVM9VURESSBcdTMwZDNcdTMwYjhcdTMwY2RcdTMwYjlcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmMKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFUz1VRERJIFx1MzBiNVx1MzBmY1x1MzBkM1x1MzBiOVx1MzBmYlx1MzBkM1x1MzBlNVx1MzBmYwotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VTPVdTREwgXHUzMGI1XHUzMGZjXHUzMGQzXHUzMGI5XHUzMGZiXHUzMGQzXHUzMGU1XHUzMGZjCi1WSUVXX1RJVExFX1dTSUxfTElOS1M9V1NJTCBcdTMwZWFcdTMwZjNcdTMwYWZcdTMwZmJcdTMwZDNcdTMwZTVcdTMwZmMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfa28ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfa28ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2YWE0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsX2tvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotdGl0bGU9V1NJTAotCi0jIE5hdmlnYXRvcgotV1NJTF9NQUlOX05PREU9V1NJTCBcdWFlMzBcdWJjZjgKLQotIyBGb3JtcwotRk9STV9MQUJFTF9VUkw9VVJMCi1GT1JNX0xBQkVMX0lURU1fTlVNQkVSPVx1ZDU2ZFx1YmFhOSAjCi1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1NfTkFNRT1VRERJIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCBcdWM3NzRcdWI5ODQKLUZPUk1fTEFCRUxfVURESV9TRVJWSUNFX05BTUU9VURESSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjNzc0XHViOTg0Ci1GT1JNX0xBQkVMX0xBTkdVQUdFPVx1YzViOFx1YzViNAotRk9STV9MQUJFTF9BQlNUUkFDVD1cdWFjMWNcdWM2OTQKLUZPUk1fTEFCRUxfTkFNRT1cdWM3NzRcdWI5ODQKLUZPUk1fTEFCRUxfV1NETF9CSU5ESU5HUz1XU0RMIFx1YmMxNFx1Yzc3OFx1YjUyOQotRk9STV9MQUJFTF9OQU1FU1BBQ0VfVVJJPVx1Yzc3NFx1Yjk4NCBcdWFjZjVcdWFjMDQgVVJJCi1GT1JNX0xBQkVMX0xPQ0FMX05BTUU9XHViODVjXHVjZWVjIFx1Yzc3NFx1Yjk4NAotRk9STV9MQUJFTF9JTlFVSVJZX0FQST1BUEkgXHVjODcwXHVkNjhjCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPVx1YzExY1x1YmU0NFx1YzJhNCBcdWQwYTQKLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCBcdWQwYTQKLUZPUk1fTEFCRUxfRElTQ09WRVJZX1VSTD1VUkwgXHViYzFjXHVhY2FjCi1GT1JNX0xBQkVMX1dTSUw9V1NJTCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQKLUZPUk1fTEFCRUxfV1NJTF9MSU5LUz1XU0lMIFx1YjljMVx1ZDA2YwotRk9STV9MQUJFTF9XU0RMX1NFUlZJQ0U9V1NETCBcdWMxMWNcdWJlNDRcdWMyYTQKLUZPUk1fTEFCRUxfVURESV9TRVJWSUNFPVVEREkgXHVjMTFjXHViZTQ0XHVjMmE0Ci1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1M9VURESSBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQKLUZPUk1fTEFCRUxfQUREX1RPX05BVklHQVRPUj1cdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzBcdWM1ZDAgXHVjZDk0XHVhYzAwCi1GT1JNX0xBQkVMX0FERF9UT19GQVZPUklURVM9XHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVjNWQwIFx1Y2Q5NFx1YWMwMAotRk9STV9MQUJFTF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1VRERJIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDAKLUZPUk1fTEFCRUxfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkU9V1NETCBcdWQzOThcdWM3NzRcdWM5YzBcdWM1ZDAgXHVjZDk0XHVhYzAwCi1GT1JNX0xBQkVMX1JFRlJFU0g9XHVjMGM4XHViODVjIFx1YWNlMFx1Y2U1OFx1YWUzMAotRk9STV9MQUJFTF9OQT1OL0EKLUZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9TRVJWSUNFPVx1YzBhY1x1YzZhOSBcdWJkODhcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjMTFjXHViZTQ0XHVjMmE0OgotRk9STV9MQUJFTF9VTkFWQUlMQUJMRV9VRERJX0JVU0lORVNTPVx1YzBhY1x1YzZhOSBcdWJkODhcdWFjMDBcdWIyYTVcdWQ1NWMgXHVjMTFjXHViZTQ0XHVjMmE0OgotRk9STV9MQUJFTF9DSE9PU0VfV1NJTF9JTlNQRUNUSU9OX1RZUEU9XHVhYzgwXHVjMGFjXHVkNTYwIFx1YzYyNFx1YmUwY1x1YzgxZFx1ZDJiOCBcdWM3MjBcdWQ2MTUgXHVjMTIwXHVkMGRkOgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMjhFIFx1Y2Q1Y1x1YzE4Y1x1ZDU1YyBcdWQ1NThcdWIwOThcdWM3NTggXHVkNTZkXHViYWE5XHVjNzQ0IFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBPcGVuV1NJTEFjdGlvbgotQUxUX09QRU5fV1NJTD1XU0lMIFx1YzVmNFx1YWUzMAotRk9STV9MQUJFTF9PUEVOX1dTSUxfREVTQz1XU0lMIFx1YmIzOFx1YzExYyBcdWI2MTBcdWIyOTQgSFRNTCBcdWJiMzhcdWMxMWNcdWM3NTggVVJMXHVjNzQ0IFx1Yzc4NVx1YjgyNVx1ZDU1OFx1YWNlMCA8c3Ryb25nPlx1Yzc3NFx1YjNkOTwvc3Ryb25nPlx1Yzc0NCBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHVhYzgwXHVjMGFjXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LgotV1NJTF9VUkw9XHViYjM4XHVjMTFjXHVjNWQwIFx1YjMwMFx1ZDU1YyBVUkw6Ci1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX1VSTD1JV0FCMDM5NEUgJTFcdWM3NzQoXHVhYzAwKSBcdWM2MmNcdWJjMTRcdWI5NzggV1NJTCBVUkwgXHViNjEwXHViMjk0IEhUTUwgVVJMXHVjNzc0IFx1YzU0NFx1YjJkOVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzI5RSAlMVx1Yzc3NChcdWFjMDApIFx1Yzc3NFx1YmJmOCBcdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzBcdWM1ZDAgXHVjNWY0XHViODI0XHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fT1BFTl9XU0lMX1NVQ0NFU1NGVUw9SVdBQjAzMzBJICUxXHVjNzc0KFx1YWMwMCkgXHVjNWY0XHViODM4XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIE9wZW5XU0lMTGlua0FjdGlvbgotQUxUX09QRU5fV1NJTF9MSU5LPVdTSUwgXHViOWMxXHVkMDZjIFx1YzVmNFx1YWUzMAotTVNHX0VSUk9SX1dTSUxfTElOS19BTFJFQURZX09QRU5FRD1JV0FCMDMzMUUgJTFcdWM3NzQoXHVhYzAwKSBcdWM3NzRcdWJiZjggXHViMTI0XHViZTQ0XHVhYzhjXHVjNzc0XHVkMTMwXHVjNWQwXHVjMTFjIFx1YzVmNFx1YjgzOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19JTkZPX09QRU5fV1NJTF9MSU5LX1NVQ0NFU1NGVUw9SVdBQjAzMzJJICUxXHVjNzc0KFx1YWMwMCkgXHVjNWY0XHViODM4XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIFdzaWxEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9ERVRBSUxTPVdTSUwgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi0KLSMgV3NpbFNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFM9V1NJTCBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi0KLSMgVWRkaUxpbmtEZXRhaWxzQWN0aW9uCi1BTFRfVURESV9MSU5LX0RFVEFJTFM9VURESSBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi0KLSMgV3NpbExpbmtEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9MSU5LX0RFVEFJTFM9V1NJTCBcdWI5YzFcdWQwNmMgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkCi0KLSMgTGlzdFdTRExTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfV1NETF9TRVJWSUNFUz1cdWJhYThcdWI0ZTAgV1NETCBcdWMxMWNcdWJlNDRcdWMyYTQgXHViMDk4XHVjNWY0Ci1GT1JNX0xBQkVMX0xJU1RfV1NETF9TRVJWSUNFU19ERVNDPVdTREwgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YzEzOFx1ZDJiOFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgPHN0cm9uZz5cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWM1ZDAgXHVjZDk0XHVhYzAwPC9zdHJvbmc+XHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzVlYyBcdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgXHViYWE5XHViODVkXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBMaXN0VURESVNlcnZpY2VzQWN0aW9uCi1BTFRfTElTVF9VRERJX1NFUlZJQ0VTPVx1YmFhOFx1YjRlMCBVRERJIFx1YzExY1x1YmU0NFx1YzJhNCBcdWIwOThcdWM1ZjQKLUZPUk1fTEFCRUxfTElTVF9VRERJX1NFUlZJQ0VTX0RFU0M9VURESSBcdWMxMWNcdWJlNDRcdWMyYTQgXHVjMTM4XHVkMmI4XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YWNlMCA8c3Ryb25nPlx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMFx1YzVkMCBcdWNkOTRcdWFjMDA8L3N0cm9uZz5cdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMCBcdWJhYTlcdWI4NWRcdWM1ZDAgXHVjZDk0XHVhYzAwXHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LiA8c3Ryb25nPlVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMDwvc3Ryb25nPlx1Yjk3YyBcdWQwNzRcdWI5YWRcdWQ1NThcdWM1ZWMgXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNzQ0IFVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWI4MjRcdWJhNzQgPHN0cm9uZz5cdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwPC9zdHJvbmc+XHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBMaXN0VURESUJ1c2luZXNzZXNBY3Rpb24KLUFMVF9MSVNUX1VERElfTElOS1M9XHViYWE4XHViNGUwIFVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YjA5OFx1YzVmNAotRk9STV9MQUJFTF9MSVNUX1VERElfQlVTSU5FU1NFU19ERVNDPVVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YzEzOFx1ZDJiOFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgPHN0cm9uZz5cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWM1ZDAgXHVjZDk0XHVhYzAwPC9zdHJvbmc+XHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzVlYyBcdWM5OTBcdWFjYThcdWNjM2VcdWFlMzAgXHViYWE5XHViODVkXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gPHN0cm9uZz5VRERJIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDA8L3N0cm9uZz5cdWI5N2MgXHVkMDc0XHViOWFkXHVkNTU4XHVjNWVjIFVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gXHVjMTIwXHVkMGRkXHVjMGFjXHVkNTZkXHVjNzQ0IFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWI4MjRcdWJhNzQgPHN0cm9uZz5cdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwPC9zdHJvbmc+XHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4KLQotIyBMaXN0V1NJTExpbmtzQWN0aW9uCi1BTFRfTElTVF9XU0lMX0xJTktTPVx1YmFhOFx1YjRlMCBXU0lMIFx1YjljMVx1ZDA2YyBcdWIwOThcdWM1ZjQKLUZPUk1fTEFCRUxfTElTVF9XU0lMX0xJTktTPVdTSUwgXHViOWMxXHVkMDZjIFx1YzEzOFx1ZDJiOFx1Yjk3YyBcdWMxMjBcdWQwZGRcdWQ1NThcdWFjZTAgPHN0cm9uZz5cdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzBcdWM1ZDAgXHVjZDk0XHVhYzAwPC9zdHJvbmc+XHViOTdjIFx1ZDA3NFx1YjlhZFx1ZDU1OFx1YzVlYyBcdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzBcdWM1ZDBcdWMxMWMgXHVjNWVjXHVjMmVkXHVjMmRjXHVjNjI0LiAKLSMgQ2xlYXJXU0lMQWN0aW9uCi1BTFRfQ0xFQVJfV1NJTD1XU0lMIFx1YzljMFx1YzZiMFx1YWUzMAotCi0jIFJlZnJlc2hBY3Rpb24KLUFMVF9SRUZSRVNIX1dTSUw9V1NJTCBcdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwCi1BTFRfUkVGUkVTSF9VRERJX0JVU0lORVNTPVVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNlNThcdWFlMzAKLUFMVF9SRUZSRVNIX1VERElfU0VSVklDRT1VRERJIFx1YzExY1x1YmU0NFx1YzJhNCBcdWMwYzhcdWI4NWMgXHVhY2UwXHVjZTU4XHVhZTMwCi1NU0dfRVJST1JfV1NJTF9OT1RfRk9VTkQ9SVdBQjAzMzNFIFdTSUwgJTFcdWM3NDQoXHViOTdjKSBcdWI4NWNcdWI0ZGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQ9SVdBQjAzMzRFIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCAlMVx1Yzc0NChcdWI5N2MpIFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhY1x1YzVkMFx1YzExYyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDMzNUUgXHVjMTFjXHViZTQ0XHVjMmE0ICUxXHVjNzQ0KFx1Yjk3YykgXHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjXHVjNWQwXHVjMTFjIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fUkVGUkVTSF9TVUNDRVNTRlVMPUlXQUIwMzM2SSAlMVx1Yzc0NChcdWI5N2MpIFx1YzBjOFx1Yjg1YyBcdWFjZTBcdWNjZTRcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMVx1Yzc0NChcdWI5N2MpIFx1YjM1NCBcdWM3NzRcdWMwYzEgXHVkNTc0XHVjMTFkXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuIFx1YzBhZFx1YzgxY1x1ZDU1OFx1YzJkY1x1YWNhMFx1YzJiNVx1YjJjOFx1YWU0Yz8KLQotIyBBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9CVVNJTkVTU19UT19VRERJX1BFUlNQRUNUSVZFPVx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNFx1Yjk3YyBVRERJIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDAKLUFMVF9BRERfU0VSVklDRV9UT19VRERJX1BFUlNQRUNUSVZFPVx1YzExY1x1YmU0NFx1YzJhNFx1Yjk3YyBVRERJIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDAKLU1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMzdJICUxXHVjNzc0KFx1YWMwMCkgVURESSBcdWQzOThcdWM3NzRcdWM5YzBcdWM1ZDAgXHVjZDk0XHVhYzAwXHViNDE4XHVjNWM4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0VSUk9SX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUlXQUIwMzM4RSAlMVx1Yzc3NChcdWFjMDApIFVEREkgXHVkMzk4XHVjNzc0XHVjOWMwXHVjNWQwIFx1Y2Q5NFx1YWMwMFx1YjQxOFx1YzVjOFx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQ9SVdBQjAzMzlFIFx1YmU0NFx1Yzk4OFx1YjJjOFx1YzJhNCAlMVx1Yzc0NChcdWI5N2MpIFx1YjgwOFx1YzljMFx1YzJhNFx1ZDJiOFx1YjlhY1x1YzVkMFx1YzExYyBcdWNjM2VcdWM3NDQgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDM0MEUgXHVjMTFjXHViZTQ0XHVjMmE0ICUxXHVjNzQ0KFx1Yjk3YykgXHViODA4XHVjOWMwXHVjMmE0XHVkMmI4XHViOWFjXHVjNWQwXHVjMTFjIFx1Y2MzZVx1Yzc0NCBcdWMyMTggXHVjNWM2XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9V1NETFx1Yzc0NCBXU0RMIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDAKLU1TR19JTkZPX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDM5NUkgJTFcdWM3NzQoXHVhYzAwKSBXU0RMIFx1ZDM5OFx1Yzc3NFx1YzljMFx1YzVkMCBcdWNkOTRcdWFjMDBcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfRVJST1JfQUREX1dTRExfVE9fV1NETF9QRVJTUEVDVElWRT1JV0FCMDM5NkUgJTFcdWM3NDQoXHViOTdjKSBcdWI4NWNcdWI0ZGNcdWQ1NjAgXHVjMjE4IFx1YzVjNlx1YzJiNVx1YjJjOFx1YjJlNC4KLQotIyBBZGRXU0lMVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NJTF9UT19GQVZPUklURVM9V1NJTFx1Yzc0NCBcdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWM1ZDAgXHVjZDk0XHVhYzAwCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM0MUUgJTFcdWM3NDQoXHViOTdjKSBcdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWM1ZDAgXHVjZDk0XHVhYzAwXHVkNTYwIFx1YzIxOCBcdWM1YzZcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzQyRSAlMVx1Yzc3NChcdWFjMDApIFx1Yzc3NFx1YmJmOCBcdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWM1ZDAgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzQzSSAlMVx1Yzc3NChcdWFjMDApIFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMFx1YzVkMCBcdWNkOTRcdWFjMDBcdWI0MThcdWM1YzhcdWMyYjVcdWIyYzhcdWIyZTQuCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1cdWM5OTBcdWFjYThcdWNjM2VcdWFlMzBcdWFjMDAgXHVjNzc0XHViYmY4IFx1Yzc4OFx1YzJiNVx1YjJjOFx1YjJlNC4gXHVhY2I5XHVjY2QwXHVjNGYwXHVjMmRjXHVhY2EwXHVjMmI1XHViMmM4XHVhZTRjPwotCi0jIEFkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NETF9TRVJWSUNFX1RPX0ZBVk9SSVRFUz1XU0RMXHVjNzQ0IFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMFx1YzVkMCBcdWNkOTRcdWFjMDAKLQotIyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1VERElfQlVTSU5FU1NfVE9fRkFWT1JJVEVTPVVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0XHViOTdjIFx1Yzk5MFx1YWNhOFx1Y2MzZVx1YWUzMFx1YzVkMCBcdWNkOTRcdWFjMDAKLQotIyBBZGRTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfU0VSVklDRV9UT19GQVZPUklURVM9VURESSBcdWMxMWNcdWJlNDRcdWMyYTRcdWI5N2MgXHVjOTkwXHVhY2E4XHVjYzNlXHVhZTMwXHVjNWQwIFx1Y2Q5NFx1YWMwMAotCi0jIFdTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2gKLUFUTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0g9V1NJTFx1Yzc0NCBXb3JrYmVuY2hcdWM1ZDAgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwCi1GT1JNX0xBQkVMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSF9ERVNDPVdTSUwgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1YzgwMFx1YzdhNVx1ZDU1OFx1YjgyNFx1YmE3NCBXb3JrYmVuY2ggXHVkNTA0XHViODVjXHVjODFkXHVkMmI4XHViOTdjIFx1YzEyMFx1ZDBkZFx1ZDU1OFx1YzJlZFx1YzJkY1x1YzYyNC4gV1NJTCBcdWQzMGNcdWM3N2NcdWM3NTggXHVjNzc0XHViOTg0XHVjNzQ0IFx1YmNjMFx1YWNiZFx1ZDU2MCBcdWMyMThcdWIzYzQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgotCi0jIEltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbgotQUxUX1dTSUxfSU1QT1JUX1RPX0ZTPVdTSUxcdWM3NDQgXHVkMzBjXHVjNzdjIFx1YzJkY1x1YzJhNFx1ZDE1Y1x1YzczY1x1Yjg1YyBcdWFjMDBcdWM4MzhcdWM2MjRcdWFlMzAKLUFMVF9XU0RMX0lNUE9SVF9UT19GUz1XU0RMXHVjNzQ0IFx1ZDMwY1x1Yzc3YyBcdWMyZGNcdWMyYTRcdWQxNWNcdWM3M2NcdWI4NWMgXHVhYzAwXHVjODM4XHVjNjI0XHVhZTMwCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPVx1YjEyNFx1YmU0NFx1YWM4Y1x1Yzc3NFx1ZDEzMCBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPVx1YjEyNFx1YmU0NFx1YWM4Y1x1Yzc3NFx1ZDEzMCBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1cdWIxMjRcdWJlNDRcdWFjOGNcdWM3NzRcdWQxMzAgXHVjZWU4XHVkMTUwXHVjZTIwCi1GUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUj1cdWM4NzBcdWNlNTggXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1cdWQyYjlcdWMxMzEgXHVjZWU4XHVkMTRjXHVjNzc0XHViMTA4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9XHVkMmI5XHVjMTMxIFx1Y2VlOFx1ZDE1MFx1Y2UyMAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSPVx1ZDJiOVx1YzEzMSBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPVx1YzBjMVx1ZDBkYyBcdWNlZThcdWQxNGNcdWM3NzRcdWIxMDgKLUZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UPVx1YzBjMVx1ZDBkYyBcdWNlZThcdWQxNTBcdWNlMjAKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVx1YzBjMVx1ZDBkYyBcdWIzYzRcdWFkNmMgXHViYWE4XHVjNzRjCi0KLSMgRm9ybSB0aXRsZXMKLUZPUk1fVElUTEVfT1BFTl9XU0lMPVdTSUwgXHVjNTkxXHVjMmRkIFx1YzVmNFx1YWUzMAotRk9STV9USVRMRV9VRERJX0JVU0lORVNTX0RFVEFJTFM9VURESSBcdWJlNDRcdWM5ODhcdWIyYzhcdWMyYTQgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YzU5MVx1YzJkZAotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfREVUQUlMUz1VRERJIFx1YzExY1x1YmU0NFx1YzJhNCBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHVjNTkxXHVjMmRkCi1GT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTPVdTREwgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YzEzOFx1YmQ4MFx1YzBhY1x1ZDU2ZCBcdWM1OTFcdWMyZGQKLUZPUk1fVElUTEVfV1NJTF9ERVRBSUxTPVdTSUwgXHVjMTM4XHViZDgwXHVjMGFjXHVkNTZkIFx1YzU5MVx1YzJkZAotRk9STV9USVRMRV9XU0lMX0xJTktfREVUQUlMUz1XU0lMIFx1YjljMVx1ZDA2YyBcdWMxMzhcdWJkODBcdWMwYWNcdWQ1NmQgXHVjNTkxXHVjMmRkCi0KLSMgVmlldyB0aXRsZXMKLVZJRVdfVElUTEVfVURESV9CVVNJTkVTU0VTPVVEREkgXHViZTQ0XHVjOTg4XHViMmM4XHVjMmE0IFx1YmNmNFx1YWUzMAotVklFV19USVRMRV9VRERJX1NFUlZJQ0VTPVVEREkgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YmNmNFx1YWUzMAotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VTPVdTREwgXHVjMTFjXHViZTQ0XHVjMmE0IFx1YmNmNFx1YWUzMAotVklFV19USVRMRV9XU0lMX0xJTktTPVdTSUwgXHViOWMxXHVkMDZjIFx1YmNmNFx1YWUzMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF9wdF9CUi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF9wdF9CUi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg3YzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfcHRfQlIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0lMCi0KLSMgTmF2aWdhdG9yCi1XU0lMX01BSU5fTk9ERT1QcmluY2lwYWwgZG8gV1NJTAotCi0jIEZvcm1zCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9Tlx1MDBiYSBkbyBJdGVtCi1GT1JNX0xBQkVMX1VERElfQlVTSU5FU1NfTkFNRT1Ob21lIGRvIE5lZ1x1MDBmM2NpbyBVRERJCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRV9OQU1FPU5vbWUgZG8gU2VydmlcdTAwZTdvIFVEREkKLUZPUk1fTEFCRUxfTEFOR1VBR0U9SWRpb21hCi1GT1JNX0xBQkVMX0FCU1RSQUNUPUFic3RyYXRvCi1GT1JNX0xBQkVMX05BTUU9IE5vbWUKLUZPUk1fTEFCRUxfV1NETF9CSU5ESU5HUz1MaWdhXHUwMGU3XHUwMGY1ZXMgZG8gV1NETAotRk9STV9MQUJFTF9OQU1FU1BBQ0VfVVJJPVVSSSBkbyBFc3BhXHUwMGU3byBkZSBOb21lcwotRk9STV9MQUJFTF9MT0NBTF9OQU1FPU5vbWUgTG9jYWwKLUZPUk1fTEFCRUxfSU5RVUlSWV9BUEk9QVBJIGRlIENvbnN1bHRhCi1GT1JNX0xBQkVMX1NFUlZJQ0VfS0VZPUNoYXZlIGRlIFNlcnZpXHUwMGU3bwotRk9STV9MQUJFTF9CVVNJTkVTU19LRVk9Q2hhdmUgZGUgTmVnXHUwMGYzY2lvcwotRk9STV9MQUJFTF9ESVNDT1ZFUllfVVJMPVVSTCBkbyBEaXNjb3ZlcnkKLUZPUk1fTEFCRUxfV1NJTD1EZXRhbGhlcyBkbyBXU0lMCi1GT1JNX0xBQkVMX1dTSUxfTElOS1M9TGlua3MgV1NJTAotRk9STV9MQUJFTF9XU0RMX1NFUlZJQ0U9U2VydmlcdTAwZTdvcyBXU0RMCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRT1TZXJ2aVx1MDBlN29zIFVEREkKLUZPUk1fTEFCRUxfVURESV9CVVNJTkVTUz1OZWdcdTAwZjNjaW9zIFVEREkKLUZPUk1fTEFCRUxfQUREX1RPX05BVklHQVRPUj1JbmNsdWlyIG5vIE5hdmVnYWRvcgotRk9STV9MQUJFTF9BRERfVE9fRkFWT1JJVEVTPUluY2x1aXIgZW0gRmF2b3JpdG9zCi1GT1JNX0xBQkVMX0FERF9UT19VRERJX1BFUlNQRUNUSVZFPUluY2x1aXIgbmEgUFx1MDBlMWdpbmEgZG8gVURESQotRk9STV9MQUJFTF9BRERfVE9fV1NETF9QRVJTUEVDVElWRT1JbmNsdWlyIG5hIFBcdTAwZTFnaW5hIGRvIFdTREwKLUZPUk1fTEFCRUxfUkVGUkVTSD1BdHVhbGl6YXIKLUZPUk1fTEFCRUxfTkE9Ti9ECi1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfU0VSVklDRT1TZXJ2aVx1MDBlN28gSW5kaXNwb25cdTAwZWR2ZWw6Ci1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfQlVTSU5FU1M9TmVnXHUwMGYzY2lvIEluZGlzcG9uXHUwMGVkdmVsOgotRk9STV9MQUJFTF9DSE9PU0VfV1NJTF9JTlNQRUNUSU9OX1RZUEU9RXNjb2xoYSBvIHRpcG8gZGUgb2JqZXRvcyBhIGluc3BlY2lvbmFyOgotTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQ9SVdBQjAzMjhFIFNlbGVjaW9uZSBwZWxvIG1lbm9zIHVtIGl0ZW0uCi0KLSMgT3BlbldTSUxBY3Rpb24KLUFMVF9PUEVOX1dTSUw9QWJyaXIgV1NJTAotRk9STV9MQUJFTF9PUEVOX1dTSUxfREVTQz1EaWdpdGUgbyBVUkwgZGUgdW0gZG9jdW1lbnRvIFdTSUwgb3UgZG9jdW1lbnRvIEhUTUwgZSBjbGlxdWUgZW0gPHN0cm9uZz5Jcjwvc3Ryb25nPiBwYXJhIGFicmlyIGEgaW5zcGVcdTAwZTdcdTAwZTNvLgotV1NJTF9VUkw9VVJMIGEgZG9jdW1lbnRhcjoKLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfVVJMPUlXQUIwMzk0RSAlMSBuXHUwMGUzbyBcdTAwZTkgdW0gVVJMIHZcdTAwZTFsaWRvIGRvIFdTSUwgb3UgZG8gSFRNTC4KLU1TR19FUlJPUl9XU0lMX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzI5RSAlMSBqXHUwMGUxIGVzdFx1MDBlMSBhYmVydG8gbm8gbmF2ZWdhZG9yLgotTVNHX0lORk9fT1BFTl9XU0lMX1NVQ0NFU1NGVUw9SVdBQjAzMzBJICUxIGZvaSBhYmVydG8gY29tIFx1MDBlYXhpdG8uCi0KLSMgT3BlbldTSUxMaW5rQWN0aW9uCi1BTFRfT1BFTl9XU0lMX0xJTks9QWJyaXIgTGluayBXU0lMCi1NU0dfRVJST1JfV1NJTF9MSU5LX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzMxRSAlMSBqXHUwMGUxIGVzdFx1MDBlMSBhYmVydG8gbm8gbmF2ZWdhZG9yLgotTVNHX0lORk9fT1BFTl9XU0lMX0xJTktfU1VDQ0VTU0ZVTD1JV0FCMDMzMkkgJTEgZm9pIGFiZXJ0byBjb20gXHUwMGVheGl0by4KLQotIyBXc2lsRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfREVUQUlMUz1EZXRhbGhlcyBkbyBXU0lMCi0KLSMgV3NpbFNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFM9RGV0YWxoZXMgZG8gU2VydmlcdTAwZTdvIFdTSUwKLQotIyBVZGRpTGlua0RldGFpbHNBY3Rpb24KLUFMVF9VRERJX0xJTktfREVUQUlMUz1EZXRhbGhlcyBkbyBOZWdcdTAwZjNjaW8gVURESQotCi0jIFdzaWxMaW5rRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfTElOS19ERVRBSUxTPURldGFsaGVzIGRlIExpbmtzIFdTSUwKLQotIyBMaXN0V1NETFNlcnZpY2VzQWN0aW9uCi1BTFRfTElTVF9XU0RMX1NFUlZJQ0VTPUxpc3RhciBUb2RvcyBvcyBTZXJ2aVx1MDBlN29zIFdTREwKLUZPUk1fTEFCRUxfTElTVF9XU0RMX1NFUlZJQ0VTX0RFU0M9U2VsZWNpb25lIHVtIGNvbmp1bnRvIGRlIHNlcnZpXHUwMGU3b3MgV1NETCBlIGNsaXF1ZSBlbSA8c3Ryb25nPkluY2x1aXIgZW0gRmF2b3JpdG9zPC9zdHJvbmc+IHBhcmEgaW5jbHVcdTAwZWQtbG9zIG5hIGxpc3RhIGRlIGZhdm9yaXRvcy4KLQotIyBMaXN0VURESVNlcnZpY2VzQWN0aW9uCi1BTFRfTElTVF9VRERJX1NFUlZJQ0VTPUxpc3RhciBUb2RvcyBvcyBTZXJ2aVx1MDBlN29zIFVEREkKLUZPUk1fTEFCRUxfTElTVF9VRERJX1NFUlZJQ0VTX0RFU0M9U2VsZWNpb25lIHVtIGNvbmp1bnRvIGRlIHNlcnZpXHUwMGU3b3MgVURESSBlIGNsaXF1ZSBlbSA8c3Ryb25nPkluY2x1aXIgZW0gRmF2b3JpdG9zPC9zdHJvbmc+IHBhcmEgaW5jbHVcdTAwZWQtbG9zIG5hIGxpc3RhIGRlIGZhdm9yaXRvcy4gQ2xpcXVlIGVtIDxzdHJvbmc+SW5jbHVpciBuYSBQXHUwMGUxZ2luYSBkbyBVRERJPC9zdHJvbmc+IHBhcmEgaW5jbHVpciBhcyBzZWxlXHUwMGU3XHUwMGY1ZXMgbmEgUFx1MDBlMWdpbmEgZG8gVURESS4gQ2xpcXVlIGVtIDxzdHJvbmc+QXR1YWxpemFyPC9zdHJvbmc+IHBhcmEgYXR1YWxpemFyIGFzIHNlbGVcdTAwZTdcdTAwZjVlcy4KLQotIyBMaXN0VURESUJ1c2luZXNzZXNBY3Rpb24KLUFMVF9MSVNUX1VERElfTElOS1M9TGlzdGFyIFRvZG9zIG9zIE5lZ1x1MDBmM2Npb3MgVURESQotRk9STV9MQUJFTF9MSVNUX1VERElfQlVTSU5FU1NFU19ERVNDPVNlbGVjaW9uZSB1bSBjb25qdW50byBkZSBuZWdcdTAwZjNjaW9zIFVEREkgZSBjbGlxdWUgZW0gPHN0cm9uZz5JbmNsdWlyIGVtIEZhdm9yaXRvczwvc3Ryb25nPiBwYXJhIGluY2x1XHUwMGVkLWxvcyBuYSBsaXN0YSBkZSBmYXZvcml0b3MuIENsaXF1ZSBlbSA8c3Ryb25nPkluY2x1aXIgbmEgUFx1MDBlMWdpbmEgZG8gVURESTwvc3Ryb25nPiBwYXJhIGluY2x1XHUwMGVkLWxvcyBuYSBQXHUwMGUxZ2luYSBkbyBVRERJLiBDbGlxdWUgZW0gPHN0cm9uZz5BdHVhbGl6YXI8L3N0cm9uZz4gcGFyYSBhdHVhbGl6YXIgYXMgc2VsZVx1MDBlN1x1MDBmNWVzLgotCi0jIExpc3RXU0lMTGlua3NBY3Rpb24KLUFMVF9MSVNUX1dTSUxfTElOS1M9TGlzdGFyIFRvZG9zIG9zIExpbmtzIFdTSUwKLUZPUk1fTEFCRUxfTElTVF9XU0lMX0xJTktTPVNlbGVjaW9uZSB1bSBjb25qdW50byBkZSBsaW5rcyBXU0lMIGUgcHJlc3Npb25lIDxzdHJvbmc+SW5jbHVpciBubyBOYXZlZ2Fkb3I8L3N0cm9uZz4gcGFyYSBhYnJpLWxvcyBubyBuYXZlZ2Fkb3IuCi0KLSMgQ2xlYXJXU0lMQWN0aW9uCi1BTFRfQ0xFQVJfV1NJTD1MaW1wYXIgV1NJTAotCi0jIFJlZnJlc2hBY3Rpb24KLUFMVF9SRUZSRVNIX1dTSUw9QXR1YWxpemFyIFdTSUwKLUFMVF9SRUZSRVNIX1VERElfQlVTSU5FU1M9QXR1YWxpemFyIE5lZ1x1MDBmM2Npb3MgVURESQotQUxUX1JFRlJFU0hfVURESV9TRVJWSUNFPUF0dWFsaXphciBTZXJ2aVx1MDBlN28gVURESQotTVNHX0VSUk9SX1dTSUxfTk9UX0ZPVU5EPUlXQUIwMzMzRSBXU0lMICUxIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgY2FycmVnYWRvCi1NU0dfRVJST1JfQlVTSU5FU1NfTk9UX0ZPVU5EPUlXQUIwMzM0RSBPIG5lZ1x1MDBmM2NpbyAlMSBuXHUwMGUzbyBwXHUwMGY0ZGUgc2VyIGxvY2FsaXphZG8gbm8gcmVnaXN0cm8uCi1NU0dfRVJST1JfU0VSVklDRV9OT1RfRk9VTkQ9SVdBQjAzMzVFIE8gc2VydmlcdTAwZTdvICUxIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgbG9jYWxpemFkbyBubyByZWdpc3Ryby4KLU1TR19JTkZPX1JFRlJFU0hfU1VDQ0VTU0ZVTD1JV0FCMDMzNkkgJTEgZm9pIGF0dWFsaXphZG8uCi1NU0dfQ09ORklSTV9SRU1PVkVfTk9ERT0lMSBuXHUwMGUzbyB0ZW0gbWFpcyBzb2x1XHUwMGU3XHUwMGUzby4gIERlc2VqYSBsaW1wXHUwMGUxLWxvPwotCi0jIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX0JVU0lORVNTX1RPX1VERElfUEVSU1BFQ1RJVkU9SW5jbHVpciBOZWdcdTAwZjNjaW8gbmEgUFx1MDBlMWdpbmEgZG8gVURESQotQUxUX0FERF9TRVJWSUNFX1RPX1VERElfUEVSU1BFQ1RJVkU9SW5jbHVpciBTZXJ2aVx1MDBlN28gbmEgUFx1MDBlMWdpbmEgZG8gVURESQotTVNHX0lORk9fQUREX1RPX1VERElfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMzN0kgJTEgZm9pIGluY2x1XHUwMGVkZG8gbmEgUFx1MDBlMWdpbmEgZG8gVURESS4KLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMzOEUgSW1wb3NzXHUwMGVkdmVsIGluY2x1aXIgJTEgbmEgUFx1MDBlMWdpbmEgZG8gVURESS4KLU1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQ9SVdBQjAzMzlFIE8gbmVnXHUwMGYzY2lvICUxIG5cdTAwZTNvIHBcdTAwZjRkZSBzZXIgbG9jYWxpemFkbyBubyByZWdpc3Ryby4KLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDM0MEUgTyBzZXJ2aVx1MDBlN28gJTEgblx1MDBlM28gcFx1MDBmNGRlIHNlciBsb2NhbGl6YWRvIG5vIHJlZ2lzdHJvLgotCi0jIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9SW5jbHVpciBXU0RMIG5hIFBcdTAwZTFnaW5hIGRvIFdTREwKLU1TR19JTkZPX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDM5NUkgJTEgZm9pIGluY2x1XHUwMGVkZG8gbmEgUFx1MDBlMWdpbmEgZG8gV1NETC4KLU1TR19FUlJPUl9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzk2RSAlMSBuXHUwMGUzbyBwXHUwMGY0ZGUgc2VyIGNhcnJlZ2FkbwotCi0jIEFkZFdTSUxUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0lMX1RPX0ZBVk9SSVRFUz1JbmNsdWlyIFdTSUwgZW0gRmF2b3JpdG9zCi1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM0MUUgSW1wb3NzXHUwMGVkdmVsIGluY2x1aXIgJTEgZW0gZmF2b3JpdG9zLgotTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUz1JV0FCMDM0MkUgJTEgalx1MDBlMSBleGlzdGUgZW0gZmF2b3JpdG9zLgotTVNHX0lORk9fQUREX1RPX0ZBVk9SSVRFU19TVUNDRVNTRlVMPUlXQUIwMzQzSSAlMSBmb2kgaW5jbHVcdTAwZWRkbyBlbSBmYXZvcml0b3MuCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1Fc3NlIGZhdm9yaXRvIGpcdTAwZTEgZXhpc3RlLiAgRGVzZWphIHN1YnN0aXR1aXI/Ci0KLSMgQWRkV1NETFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0RMX1NFUlZJQ0VfVE9fRkFWT1JJVEVTPUluY2x1aXIgV1NETCBlbSBGYXZvcml0b3MKLQotIyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1VERElfQlVTSU5FU1NfVE9fRkFWT1JJVEVTPUluY2x1aXIgTmVnXHUwMGYzY2lvcyBVRERJIGVtIEZhdm9yaXRvcwotCi0jIEFkZFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9TRVJWSUNFX1RPX0ZBVk9SSVRFUz1JbmNsdWlyIFNlcnZpXHUwMGU3byBVRERJIGVtIEZhdm9yaXRvcwotCi0jIFdTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2gKLUFUTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0g9SW1wb3J0YXIgV1NJTCBQYXJhIG8gV29ya2JlbmNoCi1GT1JNX0xBQkVMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSF9ERVNDPVNlbGVjaW9uZSB1bSBwcm9qZXRvIGRvIHdvcmtiZW5jaCBubyBxdWFsIGlyXHUwMGUxIHNhbHZhciBvIGFycXVpdm8gV1NJTC4gVm9jXHUwMGVhIHRhbWJcdTAwZTltIHBvZGVyXHUwMGUxIGFsdGVyYXIgbyBub21lIGRvIGFycXVpdm8gV1NJTC4KLQotIyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLUFMVF9XU0lMX0lNUE9SVF9UT19GUz1JbXBvcnRhciBXU0lMIFBhcmEgbyBTaXN0ZW1hIGRlIEFycXVpdm9zCi1BTFRfV1NETF9JTVBPUlRfVE9fRlM9SW1wb3J0YXIgV1NETCBwYXJhIG8gU2lzdGVtYSBkZSBBcnF1aXZvcwotCi0jIEZyYW1lIHRpdGxlcwotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUj1Db250XHUwMGVhaW5lciBkbyBOYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSPUJhcnJhIGRlIEZlcnJhbWVudGFzIGRvIE5hdmVnYWRvcgotRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRFTlQ9Q29udGVcdTAwZmFkbyBkbyBOYXZlZ2Fkb3IKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPUNvbnRcdTAwZWFpbmVyIGRlIEFcdTAwZTdcdTAwZjVlcwotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9Q29udFx1MDBlYWluZXIgZGUgUHJvcHJpZWRhZGVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9Q29udGVcdTAwZmFkbyBkYXMgUHJvcHJpZWRhZGVzCi1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9QmFycmEgZGUgRmVycmFtZW50YXMgZGUgUHJvcHJpZWRhZGVzCi1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPUNvbnRcdTAwZWFpbmVyIGRlIFN0YXR1cwotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9Q29udGVcdTAwZmFkbyBkbyBTdGF0dXMKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPUJhcnJhIGRlIEZlcnJhbWVudGFzIGRlIFN0YXR1cwotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NJTD1BYnJpciBGb3JtdWxcdTAwZTFyaW8gZG8gV1NJTAotRk9STV9USVRMRV9VRERJX0JVU0lORVNTX0RFVEFJTFM9Rm9ybXVsXHUwMGUxcmlvIGRlIERldGFsaGVzIGRvIE5lZ1x1MDBmM2NpbyBVRERJCi1GT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTPUZvcm11bFx1MDBlMXJpbyBkZSBEZXRhbGhlcyBkbyBTZXJ2aVx1MDBlN28gVURESQotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1Gb3JtdWxcdTAwZTFyaW8gZGUgRGV0YWxoZXMgZG8gU2VydmlcdTAwZTdvIFdTREwKLUZPUk1fVElUTEVfV1NJTF9ERVRBSUxTPUZvcm11bFx1MDBlMXJpbyBkZSBEZXRhbGhlcyBkbyBXU0lMCi1GT1JNX1RJVExFX1dTSUxfTElOS19ERVRBSUxTPUZvcm11bFx1MDBlMXJpbyBkZSBEZXRhbGhlcyBkbyBMaW5rIFdTSUwKLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTRVM9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkZSBOZWdcdTAwZjNjaW9zIFVEREkKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFUz1WaXN1YWxpemFcdTAwZTdcdTAwZTNvIGRlIFNlcnZpXHUwMGU3b3MgVURESQotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VTPVZpc3VhbGl6YVx1MDBlN1x1MDBlM28gZGUgU2VydmlcdTAwZTdvcyBXU0RMCi1WSUVXX1RJVExFX1dTSUxfTElOS1M9VmlzdWFsaXphXHUwMGU3XHUwMGUzbyBkZSBMaW5rcyBXU0lMCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsX3poX0NOLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvY2xhc3Nlcy93c2lsX3poX0NOLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZDMyYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF96aF9DTi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXRpdGxlPVdTSUwKLQotIyBOYXZpZ2F0b3IKLVdTSUxfTUFJTl9OT0RFPVdTSUwgXHU0ZTNiXHU4OTgxCi0KLSMgRm9ybXMKLUZPUk1fTEFCRUxfVVJMPVVSTAotRk9STV9MQUJFTF9JVEVNX05VTUJFUj1cdTdmMTZcdTUzZjcKLUZPUk1fTEFCRUxfVURESV9CVVNJTkVTU19OQU1FPVVEREkgXHU0ZTFhXHU1MmExXHU1NDBkXHU3OWYwCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRV9OQU1FPVVEREkgXHU2NzBkXHU1MmExXHU1NDBkXHU3OWYwCi1GT1JNX0xBQkVMX0xBTkdVQUdFPVx1OGJlZFx1OGEwMAotRk9STV9MQUJFTF9BQlNUUkFDVD1cdTYyYmRcdThjNjEKLUZPUk1fTEFCRUxfTkFNRT1cdTU0MGRcdTc5ZjAKLUZPUk1fTEFCRUxfV1NETF9CSU5ESU5HUz1XU0RMIFx1N2VkMVx1NWI5YQotRk9STV9MQUJFTF9OQU1FU1BBQ0VfVVJJPVx1NTQwZFx1NzlmMFx1N2E3YVx1OTVmNCBVUkkKLUZPUk1fTEFCRUxfTE9DQUxfTkFNRT1cdTY3MmNcdTU3MzBcdTU0MGRcdTc5ZjAKLUZPUk1fTEFCRUxfSU5RVUlSWV9BUEk9XHU2N2U1XHU4YmUyIEFQSQotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1cdTY3MGRcdTUyYTFcdTViYzZcdTk0YTUKLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPVx1NGUxYVx1NTJhMVx1NWJjNlx1OTRhNQotRk9STV9MQUJFTF9ESVNDT1ZFUllfVVJMPVx1NTNkMVx1NzNiMCBVUkwKLUZPUk1fTEFCRUxfV1NJTD1XU0lMIFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2ZgotRk9STV9MQUJFTF9XU0lMX0xJTktTPVdTSUwgXHU5NGZlXHU2M2E1Ci1GT1JNX0xBQkVMX1dTRExfU0VSVklDRT1XU0RMIFx1NjcwZFx1NTJhMQotRk9STV9MQUJFTF9VRERJX1NFUlZJQ0U9VURESSBcdTY3MGRcdTUyYTEKLUZPUk1fTEFCRUxfVURESV9CVVNJTkVTUz1VRERJIFx1NGUxYVx1NTJhMQotRk9STV9MQUJFTF9BRERfVE9fTkFWSUdBVE9SPVx1NmRmYlx1NTJhMFx1NTIzMFx1NWJmY1x1ODIyYVx1NTY2OAotRk9STV9MQUJFTF9BRERfVE9fRkFWT1JJVEVTPVx1NmRmYlx1NTJhMFx1NTIzMFx1NjUzNlx1ODVjZlx1NTkzOQotRk9STV9MQUJFTF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1cdTZkZmJcdTUyYTBcdTUyMzAgVURESSBcdTk4NzVcdTk3NjIKLUZPUk1fTEFCRUxfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkU9XHU2ZGZiXHU1MmEwXHU1MjMwIFdTREwgXHU5ODc1XHU5NzYyCi1GT1JNX0xBQkVMX1JFRlJFU0g9XHU1MjM3XHU2NWIwCi1GT1JNX0xBQkVMX05BPVx1NGUwZFx1OTAwMlx1NzUyOAotRk9STV9MQUJFTF9VTkFWQUlMQUJMRV9VRERJX1NFUlZJQ0U9XHU2NzBkXHU1MmExXHU0ZTBkXHU1M2VmXHU3NTI4XHVmZjFhCi1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfQlVTSU5FU1M9XHU0ZTFhXHU1MmExXHU0ZTBkXHU1M2VmXHU3NTI4XHVmZjFhCi1GT1JNX0xBQkVMX0NIT09TRV9XU0lMX0lOU1BFQ1RJT05fVFlQRT1cdTkwMDlcdTYyZTlcdTg5ODFcdTY4YzBcdTY3ZTVcdTc2ODRcdTViZjlcdThjNjFcdTdjN2JcdTU3OGJcdWZmMWEKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzI4RSBcdTgxZjNcdTVjMTFcdTkwMDlcdTYyZTlcdTRlMDBcdTk4NzlcdTMwMDIKLQotIyBPcGVuV1NJTEFjdGlvbgotQUxUX09QRU5fV1NJTD1cdTYyNTNcdTVmMDAgV1NJTAotRk9STV9MQUJFTF9PUEVOX1dTSUxfREVTQz1cdThmOTNcdTUxNjUgV1NJTCBcdTY1ODdcdTY4NjNcdTYyMTYgSFRNTCBcdTY1ODdcdTY4NjNcdTc2ODQgVVJMIFx1NWU3Nlx1NTM1NVx1NTFmYjxzdHJvbmc+XHU2MjY3XHU4ODRjPC9zdHJvbmc+XHU0ZWU1XHU2MjUzXHU1ZjAwXHU2OGMwXHU2N2U1XHUzMDAyCi1XU0lMX1VSTD1cdTYzMDdcdTU0MTFcdTY1ODdcdTY4NjNcdTc2ODQgVVJMXHVmZjFhCi1NU0dfRVJST1JfSU5WQUxJRF9XU0lMX1VSTD1JV0FCMDM5NEUgJTEgXHU0ZTBkXHU2NjJmXHU2NzA5XHU2NTQ4XHU3Njg0IFdTSUwgVVJMIFx1NjIxNiBIVE1MIFVSTFx1MzAwMgotTVNHX0VSUk9SX1dTSUxfQUxSRUFEWV9PUEVORUQ9SVdBQjAzMjlFIFx1NWRmMlx1NTcyOFx1NWJmY1x1ODIyYVx1NTY2OFx1NGUyZFx1NjI1M1x1NWYwMCAlMVx1MzAwMgotTVNHX0lORk9fT1BFTl9XU0lMX1NVQ0NFU1NGVUw9SVdBQjAzMzBJIFx1NWRmMlx1NjIxMFx1NTI5Zlx1NjI1M1x1NWYwMCAlMVx1MzAwMgotCi0jIE9wZW5XU0lMTGlua0FjdGlvbgotQUxUX09QRU5fV1NJTF9MSU5LPVx1NjI1M1x1NWYwMCBXU0lMIFx1OTRmZVx1NjNhNQotTVNHX0VSUk9SX1dTSUxfTElOS19BTFJFQURZX09QRU5FRD1JV0FCMDMzMUUgXHU1ZGYyXHU1NzI4XHU1YmZjXHU4MjJhXHU1NjY4XHU0ZTJkXHU2MjUzXHU1ZjAwICUxCi1NU0dfSU5GT19PUEVOX1dTSUxfTElOS19TVUNDRVNTRlVMPUlXQUIwMzMySSBcdTVkZjJcdTYyMTBcdTUyOWZcdTYyNTNcdTVmMDAgJTFcdTMwMDIKLQotIyBXc2lsRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfREVUQUlMUz1XU0lMIFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2ZgotCi0jIFdzaWxTZXJ2aWNlRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfU0VSVklDRV9ERVRBSUxTPVdTSUwgXHU2NzBkXHU1MmExXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmCi0KLSMgVWRkaUxpbmtEZXRhaWxzQWN0aW9uCi1BTFRfVURESV9MSU5LX0RFVEFJTFM9VURESSBcdTRlMWFcdTUyYTFcdThiZTZcdTdlYzZcdTRmZTFcdTYwNmYKLQotIyBXc2lsTGlua0RldGFpbHNBY3Rpb24KLUFMVF9XU0lMX0xJTktfREVUQUlMUz1XU0lMIFx1OTRmZVx1NjNhNVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2ZgotCi0jIExpc3RXU0RMU2VydmljZXNBY3Rpb24KLUFMVF9MSVNUX1dTRExfU0VSVklDRVM9XHU1MjE3XHU3OTNhXHU2MjQwXHU2NzA5IFdTREwgXHU2NzBkXHU1MmExCi1GT1JNX0xBQkVMX0xJU1RfV1NETF9TRVJWSUNFU19ERVNDPVx1OTAwOVx1NjJlOVx1NGUwMFx1N2VjNCBXU0RMIFx1NjcwZFx1NTJhMVx1NWU3Nlx1NTM1NVx1NTFmYjxzdHJvbmc+XHU2ZGZiXHU1MmEwXHU1MjMwXHU2NTM2XHU4NWNmXHU1OTM5PC9zdHJvbmc+XHU0ZWU1XHU1YzA2XHU4ZmQ5XHU0ZTliXHU2NzBkXHU1MmExXHU2ZGZiXHU1MmEwXHU1MjMwXHU2NTM2XHU4NWNmXHU1OTM5XHU1MjE3XHU4ODY4XHUzMDAyCi0KLSMgTGlzdFVERElTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfVURESV9TRVJWSUNFUz1cdTUyMTdcdTc5M2FcdTYyNDBcdTY3MDkgVURESSBcdTY3MGRcdTUyYTEKLUZPUk1fTEFCRUxfTElTVF9VRERJX1NFUlZJQ0VTX0RFU0M9XHU5MDA5XHU2MmU5XHU0ZTAwXHU3ZWM0IFVEREkgXHU2NzBkXHU1MmExXHU1ZTc2XHU1MzU1XHU1MWZiPHN0cm9uZz5cdTZkZmJcdTUyYTBcdTUyMzBcdTY1MzZcdTg1Y2ZcdTU5Mzk8L3N0cm9uZz5cdTRlZTVcdTVjMDZcdThmZDlcdTRlOWJcdTY3MGRcdTUyYTFcdTZkZmJcdTUyYTBcdTUyMzBcdTY1MzZcdTg1Y2ZcdTU5MzlcdTUyMTdcdTg4NjhcdTMwMDJcdTUzNTVcdTUxZmI8c3Ryb25nPlx1NmRmYlx1NTJhMFx1NTIzMCBVRERJIFx1OTg3NVx1OTc2Mjwvc3Ryb25nPlx1NGVlNVx1NWMwNlx1NjI0MFx1OTAwOVx1NTE4NVx1NWJiOVx1NmRmYlx1NTJhMFx1NTIzMCBVRERJIFx1OTg3NVx1OTc2Mlx1MzAwMlx1NTM1NVx1NTFmYjxzdHJvbmc+XHU1MjM3XHU2NWIwPC9zdHJvbmc+XHU0ZWU1XHU1MjM3XHU2NWIwXHU2MjQwXHU5MDA5XHU1MTg1XHU1YmI5XHUzMDAyCi0KLSMgTGlzdFVERElCdXNpbmVzc2VzQWN0aW9uCi1BTFRfTElTVF9VRERJX0xJTktTPVx1NTIxN1x1NzkzYVx1NjI0MFx1NjcwOSBVRERJIFx1NGUxYVx1NTJhMQotRk9STV9MQUJFTF9MSVNUX1VERElfQlVTSU5FU1NFU19ERVNDPVx1OTAwOVx1NjJlOVx1NGUwMFx1N2VjNCBVRERJIFx1NGUxYVx1NTJhMVx1NWU3Nlx1NTM1NVx1NTFmYjxzdHJvbmc+XHU2ZGZiXHU1MmEwXHU1MjMwXHU2NTM2XHU4NWNmXHU1OTM5PC9zdHJvbmc+XHU0ZWU1XHU1YzA2XHU4ZmQ5XHU0ZTliXHU0ZTFhXHU1MmExXHU2ZGZiXHU1MmEwXHU1MjMwXHU2NTM2XHU4NWNmXHU1OTM5XHU1MjE3XHU4ODY4XHUzMDAyXHU1MzU1XHU1MWZiPHN0cm9uZz5cdTZkZmJcdTUyYTBcdTUyMzAgVURESSBcdTk4NzVcdTk3NjI8L3N0cm9uZz5cdTRlZTVcdTVjMDZcdThmZDlcdTRlOWJcdTRlMWFcdTUyYTFcdTZkZmJcdTUyYTBcdTUyMzAgVURESSBcdTk4NzVcdTk3NjJcdTMwMDJcdTUzNTVcdTUxZmI8c3Ryb25nPlx1NTIzN1x1NjViMDwvc3Ryb25nPlx1NGVlNVx1NTIzN1x1NjViMFx1NjI0MFx1OTAwOVx1NTE4NVx1NWJiOVx1MzAwMgotCi0jIExpc3RXU0lMTGlua3NBY3Rpb24KLUFMVF9MSVNUX1dTSUxfTElOS1M9XHU1MjE3XHU3OTNhXHU2MjQwXHU2NzA5IFdTSUwgXHU5NGZlXHU2M2E1Ci1GT1JNX0xBQkVMX0xJU1RfV1NJTF9MSU5LUz1cdTkwMDlcdTYyZTlcdTRlMDBcdTdlYzQgV1NJTCBcdTk0ZmVcdTYzYTVcdTVlNzZcdTYzMDk8c3Ryb25nPlx1NmRmYlx1NTJhMFx1ODFmM1x1NWJmY1x1ODIyYVx1NTY2ODwvc3Ryb25nPlx1NGVlNVx1NTcyOFx1NWJmY1x1ODIyYVx1NTY2OFx1NGUyZFx1NjI1M1x1NWYwMFx1NWI4M1x1NGVlY1x1MzAwMgotCi0jIENsZWFyV1NJTEFjdGlvbgotQUxUX0NMRUFSX1dTSUw9XHU2ZTA1XHU5NjY0IFdTSUwKLQotIyBSZWZyZXNoQWN0aW9uCi1BTFRfUkVGUkVTSF9XU0lMPVx1NTIzN1x1NjViMCBXU0lMCi1BTFRfUkVGUkVTSF9VRERJX0JVU0lORVNTPVx1NTIzN1x1NjViMCBVRERJIFx1NGUxYVx1NTJhMQotQUxUX1JFRlJFU0hfVURESV9TRVJWSUNFPVx1NTIzN1x1NjViMCBVRERJIFx1NjcwZFx1NTJhMQotTVNHX0VSUk9SX1dTSUxfTk9UX0ZPVU5EPUlXQUIwMzMzRSBcdTY3MmFcdTgwZmRcdTg4YzVcdTUxNjUgV1NJTCAlMVx1MzAwMgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzNEUgXHU1NzI4XHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU0ZTFhXHU1MmExICUxXHUzMDAyCi1NU0dfRVJST1JfU0VSVklDRV9OT1RfRk9VTkQ9SVdBQjAzMzVFIFx1NTcyOFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1NjcwZFx1NTJhMSAlMVx1MzAwMgotTVNHX0lORk9fUkVGUkVTSF9TVUNDRVNTRlVMPUlXQUIwMzM2SSBcdTVkZjJcdTUyMzdcdTY1YjAgJTFcdTMwMDIKLU1TR19DT05GSVJNX1JFTU9WRV9OT0RFPSUxIFx1NGUwZFx1NTE4ZFx1NTNlZlx1ODllM1x1Njc5MFx1MzAwMlx1NjBmM1x1ODk4MVx1NmUwNVx1OTY2NFx1NWI4M1x1NTQxN1x1ZmYxZgotCi0jIEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uCi1BTFRfQUREX0JVU0lORVNTX1RPX1VERElfUEVSU1BFQ1RJVkU9XHU1YzA2XHU0ZTFhXHU1MmExXHU2ZGZiXHU1MmEwXHU1MjMwIFVEREkgXHU5ODc1XHU5NzYyCi1BTFRfQUREX1NFUlZJQ0VfVE9fVURESV9QRVJTUEVDVElWRT1cdTVjMDZcdTY3MGRcdTUyYTFcdTZkZmJcdTUyYTBcdTUyMzAgVURESSBcdTk4NzVcdTk3NjIKLU1TR19JTkZPX0FERF9UT19VRERJX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzMzdJIFx1NWRmMlx1NWMwNiAlMSBcdTZkZmJcdTUyYTBcdTUyMzAgVURESSBcdTk4NzVcdTk3NjJcdTMwMDIKLU1TR19FUlJPUl9BRERfVE9fVURESV9QRVJTUEVDVElWRT1JV0FCMDMzOEUgXHU2NWUwXHU2Y2Q1XHU1YzA2ICUxIFx1NmRmYlx1NTJhMFx1NTIzMCBVRERJIFx1OTg3NVx1OTc2Mlx1MzAwMgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzOUUgXHU1NzI4XHU2Y2U4XHU1MThjXHU0ZTJkXHU1ZmMzXHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwXHU0ZTFhXHU1MmExICUxXHUzMDAyCi1NU0dfRVJST1JfU0VSVklDRV9OT1RfRk9VTkQ9SVdBQjAzNDBFIFx1NTcyOFx1NmNlOFx1NTE4Y1x1NGUyZFx1NWZjM1x1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMFx1NjcwZFx1NTJhMSAlMVx1MzAwMgotCi0jIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9XHU1YzA2IFdTREwgXHU2ZGZiXHU1MmEwXHU1MjMwIFdTREwgXHU5ODc1XHU5NzYyCi1NU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzOTVJIFx1NWRmMlx1NWMwNiAlMSBcdTZkZmJcdTUyYTBcdTUyMzAgV1NETCBcdTk4NzVcdTk3NjJcdTMwMDIKLU1TR19FUlJPUl9BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFPUlXQUIwMzk2RSBcdTY3MmFcdTgwZmRcdTg4YzVcdTUxNjUgJTFcdTMwMDIKLQotIyBBZGRXU0lMVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NJTF9UT19GQVZPUklURVM9XHU1YzA2IFdTSUwgXHU2ZGZiXHU1MmEwXHU1MjMwXHU2NTM2XHU4NWNmXHU1OTM5Ci1NU0dfRVJST1JfQUREX1RPX0ZBVk9SSVRFUz1JV0FCMDM0MUUgXHU2NWUwXHU2Y2Q1XHU1YzA2ICUxIFx1NmRmYlx1NTJhMFx1NTIzMFx1NjUzNlx1ODVjZlx1NTkzOVx1MzAwMgotTVNHX0VSUk9SX0ZBVk9SSVRFU19BTFJFQURZX0VYSVNUUz1JV0FCMDM0MkUgXHU2NTM2XHU4NWNmXHU1OTM5XHU0ZTJkXHU1ZGYyXHU1YjU4XHU1NzI4ICUxXHUzMDAyCi1NU0dfSU5GT19BRERfVE9fRkFWT1JJVEVTX1NVQ0NFU1NGVUw9SVdBQjAzNDNJIFx1NWRmMlx1NWMwNiAlMSBcdTZkZmJcdTUyYTBcdTUyMzBcdTY1MzZcdTg1Y2ZcdTU5MzlcdTMwMDIKLU1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTPVx1NjUzNlx1ODVjZlx1OTg3OVx1NWRmMlx1NWI1OFx1NTcyOFx1MzAwMlx1NjBmM1x1ODk4MVx1ODk4Nlx1NzZkNlx1NTQxN1x1ZmYxZgotCi0jIEFkZFdTRExTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfV1NETF9TRVJWSUNFX1RPX0ZBVk9SSVRFUz1cdTVjMDYgV1NETCBcdTZkZmJcdTUyYTBcdTUyMzBcdTY1MzZcdTg1Y2ZcdTU5MzkKLQotIyBBZGRCdXNpbmVzc1RvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1VERElfQlVTSU5FU1NfVE9fRkFWT1JJVEVTPVx1NWMwNiBVRERJIFx1NGUxYVx1NTJhMVx1NmRmYlx1NTJhMFx1NTIzMFx1NjUzNlx1ODVjZlx1NTkzOQotCi0jIEFkZFNlcnZpY2VUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9TRVJWSUNFX1RPX0ZBVk9SSVRFUz1cdTVjMDYgVURESSBcdTY3MGRcdTUyYTFcdTZkZmJcdTUyYTBcdTUyMzBcdTY1MzZcdTg1Y2ZcdTU5MzkKLQotIyBXU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoCi1BVExfSU1QT1JUX1dTSUxfVE9fV09SS0JFTkNIPVx1NWMwNiBXU0lMIFx1NWJmY1x1NTE2NVx1ODFmM1x1NWRlNVx1NGY1Y1x1NTNmMAotRk9STV9MQUJFTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0hfREVTQz1cdTkwMDlcdTYyZTlcdTg5ODFcdTVjMDYgV1NJTCBcdTY1ODdcdTRlZjZcdTRmZGRcdTViNThcdTgxZjNcdTUxNzZcdTRlMmRcdTc2ODRcdTVkZTVcdTRmNWNcdTUzZjBcdTk4NzlcdTc2ZWVcdTMwMDJcdThmZDhcdTUzZWZcdTRlZTVcdTY2ZjRcdTY1MzkgV1NJTCBcdTY1ODdcdTRlZjZcdTc2ODRcdTU0MGRcdTc5ZjBcdTMwMDIKLQotIyBJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24KLUFMVF9XU0lMX0lNUE9SVF9UT19GUz1cdTVjMDYgV1NJTCBcdTViZmNcdTUxNjVcdTgxZjNcdTY1ODdcdTRlZjZcdTdjZmJcdTdlZGYKLUFMVF9XU0RMX0lNUE9SVF9UT19GUz1cdTVjMDYgV1NETCBcdTViZmNcdTUxNjVcdTgxZjNcdTY1ODdcdTRlZjZcdTdjZmJcdTdlZGYKLQotIyBGcmFtZSB0aXRsZXMKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05UQUlORVI9XHU1YmZjXHU4MjJhXHU1NjY4XHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUj1cdTViZmNcdTgyMmFcdTU2NjhcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UPVx1NWJmY1x1ODIyYVx1NTY2OFx1NTE4NVx1NWJiOQotRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVI9XHU2NGNkXHU0ZjVjXHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUj1cdTVjNWVcdTYwMjdcdTViYjlcdTU2NjgKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVD1cdTVjNWVcdTYwMjdcdTUxODVcdTViYjkKLUZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUj1cdTVjNWVcdTYwMjdcdTVkZTVcdTUxNzdcdTY4MGYKLUZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVI9XHU3MmI2XHU2MDAxXHU1YmI5XHU1NjY4Ci1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVD1cdTcyYjZcdTYwMDFcdTUxODVcdTViYjkKLUZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSPVx1NzJiNlx1NjAwMVx1NWRlNVx1NTE3N1x1NjgwZgotCi0jIEZvcm0gdGl0bGVzCi1GT1JNX1RJVExFX09QRU5fV1NJTD1cdTYyNTNcdTVmMDAgV1NJTCBcdTg4NjhcdTUzNTUKLUZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTPVVEREkgXHU0ZTFhXHU1MmExXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTPVVEREkgXHU2NzBkXHU1MmExXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTPVdTREwgXHU2NzBkXHU1MmExXHU4YmU2XHU3ZWM2XHU0ZmUxXHU2MDZmXHU4ODY4XHU1MzU1Ci1GT1JNX1RJVExFX1dTSUxfREVUQUlMUz1XU0lMIFx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ODg2OFx1NTM1NQotRk9STV9USVRMRV9XU0lMX0xJTktfREVUQUlMUz1XU0lMIFx1OTRmZVx1NjNhNVx1OGJlNlx1N2VjNlx1NGZlMVx1NjA2Zlx1ODg2OFx1NTM1NQotCi0jIFZpZXcgdGl0bGVzCi1WSUVXX1RJVExFX1VERElfQlVTSU5FU1NFUz1VRERJIFx1NGUxYVx1NTJhMVx1ODljNlx1NTZmZQotVklFV19USVRMRV9VRERJX1NFUlZJQ0VTPVVEREkgXHU2NzBkXHU1MmExXHU4OWM2XHU1NmZlCi1WSUVXX1RJVExFX1dTRExfU0VSVklDRVM9V1NETCBcdTY3MGRcdTUyYTFcdTg5YzZcdTU2ZmUKLVZJRVdfVElUTEVfV1NJTF9MSU5LUz1XU0lMIFx1OTRmZVx1NjNhNVx1ODljNlx1NTZmZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF96aF9UVy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL2NsYXNzZXMvd3NpbF96aF9UVy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDVjMTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9jbGFzc2VzL3dzaWxfemhfVFcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10aXRsZT1XU0lMCi0KLSMgTmF2aWdhdG9yCi1XU0lMX01BSU5fTk9ERT1XU0lMIFx1NGUzYlx1ODk4MQotCi0jIEZvcm1zCi1GT1JNX0xBQkVMX1VSTD1VUkwKLUZPUk1fTEFCRUxfSVRFTV9OVU1CRVI9XHU5ODA1XHU3NmVlICMKLUZPUk1fTEFCRUxfVURESV9CVVNJTkVTU19OQU1FPVVEREkgXHU1NTQ2XHU2OTZkXHU1NDBkXHU3YTMxCi1GT1JNX0xBQkVMX1VERElfU0VSVklDRV9OQU1FPVVEREkgXHU2NzBkXHU1MmQ5XHU1NDBkXHU3YTMxCi1GT1JNX0xBQkVMX0xBTkdVQUdFPVx1OGE5ZVx1OGEwMAotRk9STV9MQUJFTF9BQlNUUkFDVD1cdTYyYmRcdThjNjEKLUZPUk1fTEFCRUxfTkFNRT1cdTU0MGRcdTdhMzEKLUZPUk1fTEFCRUxfV1NETF9CSU5ESU5HUz1XU0RMIFx1OTAyM1x1N2Q1MAotRk9STV9MQUJFTF9OQU1FU1BBQ0VfVVJJPVx1NTQwZFx1N2EzMVx1N2E3YVx1OTU5MyBVUkkKLUZPUk1fTEFCRUxfTE9DQUxfTkFNRT1cdTY3MmNcdTdhZWZcdTU0MGRcdTdhMzEKLUZPUk1fTEFCRUxfSU5RVUlSWV9BUEk9XHU2N2U1XHU4YTYyIEFQSQotRk9STV9MQUJFTF9TRVJWSUNFX0tFWT1cdTY3MGRcdTUyZDlcdTkxZDFcdTk0NzAKLUZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZPVx1NTU0Nlx1Njk2ZFx1OTFkMVx1OTQ3MAotRk9STV9MQUJFTF9ESVNDT1ZFUllfVVJMPVx1NjNhMlx1N2QyMiBVUkwKLUZPUk1fTEFCRUxfV1NJTD1XU0lMIFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQotRk9STV9MQUJFTF9XU0lMX0xJTktTPVdTSUwgXHU5M2M4XHU3ZDUwCi1GT1JNX0xBQkVMX1dTRExfU0VSVklDRT1XU0RMIFx1NjcwZFx1NTJkOQotRk9STV9MQUJFTF9VRERJX1NFUlZJQ0U9VURESSBcdTY3MGRcdTUyZDkKLUZPUk1fTEFCRUxfVURESV9CVVNJTkVTUz1VRERJIFx1NTU0Nlx1Njk2ZAotRk9STV9MQUJFTF9BRERfVE9fTkFWSUdBVE9SPVx1NTJhMFx1NTIzMFx1NWMwZVx1ODliZFx1NTY2OAotRk9STV9MQUJFTF9BRERfVE9fRkFWT1JJVEVTPVx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYgotRk9STV9MQUJFTF9BRERfVE9fVURESV9QRVJTUEVDVElWRT1cdTUyYTBcdTUyMzAgVURESSBcdTk4MDFcdTk3NjIKLUZPUk1fTEFCRUxfQUREX1RPX1dTRExfUEVSU1BFQ1RJVkU9XHU1MmEwXHU1MjMwIFdTREwgXHU5ODAxXHU5NzYyCi1GT1JNX0xBQkVMX1JFRlJFU0g9XHU5MWNkXHU2NWIwXHU2NTc0XHU3NDA2Ci1GT1JNX0xBQkVMX05BPU4vQQotRk9STV9MQUJFTF9VTkFWQUlMQUJMRV9VRERJX1NFUlZJQ0U9XHU2NzBkXHU1MmQ5XHU3MTIxXHU2Y2Q1XHU0ZjdmXHU3NTI4XHVmZjFhCi1GT1JNX0xBQkVMX1VOQVZBSUxBQkxFX1VERElfQlVTSU5FU1M9XHU1NTQ2XHU2OTZkXHU3MTIxXHU2Y2Q1XHU0ZjdmXHU3NTI4XHVmZjFhCi1GT1JNX0xBQkVMX0NIT09TRV9XU0lMX0lOU1BFQ1RJT05fVFlQRT1cdTkwNzhcdTY0YzdcdTg5ODFcdTg5OTZcdTViZGZcdTc2ODRcdTcyNjlcdTRlZjZcdTk4NWVcdTU3OGJcdWZmMWEKLU1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEPUlXQUIwMzI4RSBcdThhY2JcdTkwNzhcdTY0YzdcdTgxZjNcdTVjMTFcdTRlMDBcdTUwMGJcdTk4MDVcdTc2ZWVcdTMwMDIKLQotIyBPcGVuV1NJTEFjdGlvbgotQUxUX09QRU5fV1NJTD1cdTk1OGJcdTU1NWYgV1NJTAotRk9STV9MQUJFTF9PUEVOX1dTSUxfREVTQz1cdThhY2JcdThmMzhcdTUxNjUgV1NJTCBcdTY1ODdcdTRlZjZcdTYyMTYgSFRNTCBcdTY1ODdcdTRlZjZcdTc2ODQgVVJMXHVmZjBjXHU1MThkXHU2MzA5XHU0ZTAwXHU0ZTBiPHN0cm9uZz5cdTU3ZjdcdTg4NGM8L3N0cm9uZz5cdTRmODZcdTk1OGJcdTU1NWZcdTg5OTZcdTViZGZcdTMwMDIKLVdTSUxfVVJMPVx1NjU4N1x1NGVmNiBVUkxcdWZmMWEKLU1TR19FUlJPUl9JTlZBTElEX1dTSUxfVVJMPUlXQUIwMzk0RSAlMSBcdTRlMGRcdTY2MmZcdTY3MDlcdTY1NDhcdTc2ODQgV1NJTCBVUkwgXHU2MjE2IEhUTUwgVVJMXHUzMDAyCi1NU0dfRVJST1JfV1NJTF9BTFJFQURZX09QRU5FRD1JV0FCMDMyOUUgJTEgXHU1ZGYyXHU5NThiXHU1NzI4XHU1YzBlXHU4OWJkXHU1NjY4XHU0ZTJkXHUzMDAyCi1NU0dfSU5GT19PUEVOX1dTSUxfU1VDQ0VTU0ZVTD1JV0FCMDMzMEkgJTEgXHU1ZGYyXHU5ODA2XHU1MjI5XHU5NThiXHU1NTVmXHUzMDAyCi0KLSMgT3BlbldTSUxMaW5rQWN0aW9uCi1BTFRfT1BFTl9XU0lMX0xJTks9XHU5NThiXHU1NTVmIFdTSUwgXHU5M2M4XHU3ZDUwCi1NU0dfRVJST1JfV1NJTF9MSU5LX0FMUkVBRFlfT1BFTkVEPUlXQUIwMzMxRSAlMSBcdTVkZjJcdTk1OGJcdTU3MjhcdTVjMGVcdTg5YmRcdTU2NjhcdTRlMmQKLU1TR19JTkZPX09QRU5fV1NJTF9MSU5LX1NVQ0NFU1NGVUw9SVdBQjAzMzJJICUxIFx1NWRmMlx1OTgwNlx1NTIyOVx1OTU4Ylx1NTU1Zlx1MzAwMgotCi0jIFdzaWxEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9ERVRBSUxTPVdTSUwgXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5Ci0KLSMgV3NpbFNlcnZpY2VEZXRhaWxzQWN0aW9uCi1BTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFM9V1NJTCBcdTY3MGRcdTUyZDlcdThhNzNcdTdkMzBcdThjYzdcdTY1OTkKLQotIyBVZGRpTGlua0RldGFpbHNBY3Rpb24KLUFMVF9VRERJX0xJTktfREVUQUlMUz1VRERJIFx1NTU0Nlx1Njk2ZFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OQotCi0jIFdzaWxMaW5rRGV0YWlsc0FjdGlvbgotQUxUX1dTSUxfTElOS19ERVRBSUxTPVdTSUwgXHU5M2M4XHU3ZDUwXHU4YTczXHU3ZDMwXHU4Y2M3XHU2NTk5Ci0KLSMgTGlzdFdTRExTZXJ2aWNlc0FjdGlvbgotQUxUX0xJU1RfV1NETF9TRVJWSUNFUz1cdTUyMTdcdTUxZmFcdTYyNDBcdTY3MDkgV1NETCBcdTY3MGRcdTUyZDkKLUZPUk1fTEFCRUxfTElTVF9XU0RMX1NFUlZJQ0VTX0RFU0M9XHU4YWNiXHU5MDc4XHU1M2Q2XHU0ZTAwXHU3ZDQ0IFdTREwgXHU2NzBkXHU1MmQ5XHVmZjBjXHU2MzA5XHU0ZTAwXHU0ZTBiPHN0cm9uZz5cdTUyYTBcdTUyMzBcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWI8L3N0cm9uZz5cdWZmMGNcdTVjMDdcdTkwMTlcdTRlOWJcdTUyYTBcdTUyMzBcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWJcdTZlMDVcdTU1YWVcdTRlMmRcdTMwMDIKLQotIyBMaXN0VURESVNlcnZpY2VzQWN0aW9uCi1BTFRfTElTVF9VRERJX1NFUlZJQ0VTPVx1NTIxN1x1NTFmYVx1NjI0MFx1NjcwOSBVRERJIFx1NjcwZFx1NTJkOQotRk9STV9MQUJFTF9MSVNUX1VERElfU0VSVklDRVNfREVTQz1cdThhY2JcdTkwNzhcdTUzZDZcdTRlMDBcdTdkNDQgVURESSBcdTY3MGRcdTUyZDlcdWZmMGNcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYjwvc3Ryb25nPlx1ZmYwY1x1NWMwN1x1OTAxOVx1NGU5Ylx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYlx1NmUwNVx1NTVhZVx1NGUyZFx1MzAwMiBcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1NTJhMFx1NTIzMCBVRERJIFx1OTgwMVx1OTc2Mjwvc3Ryb25nPlx1ZmYwY1x1NWMwN1x1OTA3OFx1OTgwNVx1NTJhMFx1NTIzMCBVRERJIFx1OTgwMVx1OTc2Mlx1NGUyZFx1MzAwMiBcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNjwvc3Ryb25nPlx1NGY4Nlx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNlx1OTA3OFx1OTgwNVx1MzAwMgotCi0jIExpc3RVRERJQnVzaW5lc3Nlc0FjdGlvbgotQUxUX0xJU1RfVURESV9MSU5LUz1cdTUyMTdcdTUxZmFcdTYyNDBcdTY3MDkgVURESSBcdTU1NDZcdTY5NmQKLUZPUk1fTEFCRUxfTElTVF9VRERJX0JVU0lORVNTRVNfREVTQz1cdThhY2JcdTkwNzhcdTUzZDZcdTRlMDBcdTdkNDQgVURESSBcdTU1NDZcdTY5NmRcdWZmMGNcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYjwvc3Ryb25nPlx1ZmYwY1x1NWMwN1x1OTAxOVx1NGU5Ylx1NTJhMFx1NTIzMFx1NjIxMVx1NzY4NFx1NjcwMFx1NjExYlx1NmUwNVx1NTVhZVx1NGUyZFx1MzAwMiBcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1NTJhMFx1NTIzMCBVRERJIFx1OTgwMVx1OTc2Mjwvc3Ryb25nPlx1ZmYwY1x1NWMwN1x1OTAxOVx1NGU5Ylx1NTJhMFx1NTIzMCBVRERJIFx1OTgwMVx1OTc2Mlx1NGUyZFx1MzAwMiBcdThhY2JcdTYzMDlcdTRlMDBcdTRlMGI8c3Ryb25nPlx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNjwvc3Ryb25nPlx1NGY4Nlx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNlx1OTA3OFx1OTgwNVx1MzAwMgotCi0jIExpc3RXU0lMTGlua3NBY3Rpb24KLUFMVF9MSVNUX1dTSUxfTElOS1M9XHU1MjE3XHU1MWZhXHU2MjQwXHU2NzA5IFdTSUwgXHU5M2M4XHU3ZDUwCi1GT1JNX0xBQkVMX0xJU1RfV1NJTF9MSU5LUz1cdThhY2JcdTkwNzhcdTUzZDZcdTRlMDBcdTdkNDQgV1NJTCBcdTkzYzhcdTdkNTBcdWZmMGNcdTUxOGRcdTYzMDk8c3Ryb25nPlx1NTJhMFx1NTIzMFx1NWMwZVx1ODliZFx1NTY2ODwvc3Ryb25nPlx1ZmYwY1x1NWMwN1x1NWI4M1x1NTAxMVx1OTU4Ylx1NTcyOFx1NWMwZVx1ODliZFx1NTY2OFx1NGUyZFx1MzAwMgotCi0jIENsZWFyV1NJTEFjdGlvbgotQUxUX0NMRUFSX1dTSUw9XHU2ZTA1XHU5NjY0IFdTSUwKLQotIyBSZWZyZXNoQWN0aW9uCi1BTFRfUkVGUkVTSF9XU0lMPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNiBXU0lMCi1BTFRfUkVGUkVTSF9VRERJX0JVU0lORVNTPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNiBVRERJIFx1NTU0Nlx1Njk2ZAotQUxUX1JFRlJFU0hfVURESV9TRVJWSUNFPVx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNiBVRERJIFx1NjcwZFx1NTJkOQotTVNHX0VSUk9SX1dTSUxfTk9UX0ZPVU5EPUlXQUIwMzMzRSBcdTcxMjFcdTZjZDVcdThmMDlcdTUxNjUgV1NJTCAlMVx1MzAwMgotTVNHX0VSUk9SX0JVU0lORVNTX05PVF9GT1VORD1JV0FCMDMzNEUgXHU1NzI4XHU3NjdiXHU5MzA0XHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwICUxIFx1NTU0Nlx1Njk2ZFx1MzAwMgotTVNHX0VSUk9SX1NFUlZJQ0VfTk9UX0ZPVU5EPUlXQUIwMzM1RSBcdTU3MjhcdTc2N2JcdTkzMDRcdTRlMmRcdTYyN2VcdTRlMGRcdTUyMzAgJTEgXHU2NzBkXHU1MmQ5XHUzMDAyCi1NU0dfSU5GT19SRUZSRVNIX1NVQ0NFU1NGVUw9SVdBQjAzMzZJIFx1NWRmMlx1OTFjZFx1NjViMFx1NjU3NFx1NzQwNiAlMVx1MzAwMgotTVNHX0NPTkZJUk1fUkVNT1ZFX05PREU9JTEgXHU1ZGYyXHU3MTIxXHU2Y2Q1XHU4OWUzXHU2NzkwXHUzMDAyXHU2MGE4XHU4OTgxXHU2ZTA1XHU5NjY0XHU1YjgzXHU1NWNlXHVmZjFmCi0KLSMgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24KLUFMVF9BRERfQlVTSU5FU1NfVE9fVURESV9QRVJTUEVDVElWRT1cdTVjMDdcdTU1NDZcdTY5NmRcdTUyYTBcdTUyMzAgVURESSBcdTk4MDFcdTk3NjIKLUFMVF9BRERfU0VSVklDRV9UT19VRERJX1BFUlNQRUNUSVZFPVx1NWMwN1x1NjcwZFx1NTJkOVx1NTJhMFx1NTIzMCBVRERJIFx1OTgwMVx1OTc2MgotTVNHX0lORk9fQUREX1RPX1VERElfUEVSU1BFQ1RJVkVfU1VDQ0VTU0ZVTD1JV0FCMDMzN0kgJTEgXHU1ZGYyXHU1MmEwXHU1MjMwIFVEREkgXHU5ODAxXHU5NzYyXHU0ZTJkXHUzMDAyCi1NU0dfRVJST1JfQUREX1RPX1VERElfUEVSU1BFQ1RJVkU9SVdBQjAzMzhFIFx1NzEyMVx1NmNkNVx1NWMwNyAlMSBcdTUyYTBcdTUyMzAgVURESSBcdTk4MDFcdTk3NjJcdTRlMmRcdTMwMDIKLU1TR19FUlJPUl9CVVNJTkVTU19OT1RfRk9VTkQ9SVdBQjAzMzlFIFx1NTcyOFx1NzY3Ylx1OTMwNFx1NGUyZFx1NjI3ZVx1NGUwZFx1NTIzMCAlMSBcdTU1NDZcdTY5NmRcdTMwMDIKLU1TR19FUlJPUl9TRVJWSUNFX05PVF9GT1VORD1JV0FCMDM0MEUgXHU1NzI4XHU3NjdiXHU5MzA0XHU0ZTJkXHU2MjdlXHU0ZTBkXHU1MjMwICUxIFx1NjcwZFx1NTJkOVx1MzAwMgotCi0jIFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbgotQUxUX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9XHU1YzA3IFdTREwgXHU1MmEwXHU1MjMwIFdTREwgXHU5ODAxXHU5NzYyCi1NU0dfSU5GT19BRERfV1NETF9UT19XU0RMX1BFUlNQRUNUSVZFX1NVQ0NFU1NGVUw9SVdBQjAzOTVJICUxIFx1NWRmMlx1NTJhMFx1NTIzMCBXU0RMIFx1OTgwMVx1OTc2Mlx1NGUyZFx1MzAwMgotTVNHX0VSUk9SX0FERF9XU0RMX1RPX1dTRExfUEVSU1BFQ1RJVkU9SVdBQjAzOTZFIFx1NzEyMVx1NmNkNVx1OGYwOVx1NTE2NSAlMVx1MzAwMgotCi0jIEFkZFdTSUxUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9XU0lMX1RPX0ZBVk9SSVRFUz1cdTVjMDcgV1NJTCBcdTUyYTBcdTUyMzBcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIKLU1TR19FUlJPUl9BRERfVE9fRkFWT1JJVEVTPUlXQUIwMzQxRSBcdTcxMjFcdTZjZDVcdTVjMDcgJTEgXHU1MmEwXHU1MjMwXHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiXHUzMDAyCi1NU0dfRVJST1JfRkFWT1JJVEVTX0FMUkVBRFlfRVhJU1RTPUlXQUIwMzQyRSAlMSBcdTVkZjJcdTU3MjhcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWJcdTRlMmRcdTMwMDIKLU1TR19JTkZPX0FERF9UT19GQVZPUklURVNfU1VDQ0VTU0ZVTD1JV0FCMDM0M0kgJTEgXHU1ZGYyXHU1MmEwXHU1MjMwXHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiXHU0ZTJkXHUzMDAyCi1NU0dfUVVFU1RJT05fT1ZFUldSSVRFX0ZBVk9SSVRFUz1cdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWJcdTVkZjJcdTViNThcdTU3MjhcdTMwMDJcdTYwYThcdTg5ODFcdTY1MzlcdTViZWJcdTU1Y2VcdWZmMWYKLQotIyBBZGRXU0RMU2VydmljZVRvRmF2b3JpdGVzQWN0aW9uCi1BTFRfQUREX1dTRExfU0VSVklDRV9UT19GQVZPUklURVM9XHU1YzA3IFdTREwgXHU1MmEwXHU1MjMwXHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiCi0KLSMgQWRkQnVzaW5lc3NUb0Zhdm9yaXRlc0FjdGlvbgotQUxUX0FERF9VRERJX0JVU0lORVNTX1RPX0ZBVk9SSVRFUz1cdTVjMDcgVURESSBcdTU1NDZcdTY5NmRcdTUyYTBcdTUyMzBcdTYyMTFcdTc2ODRcdTY3MDBcdTYxMWIKLQotIyBBZGRTZXJ2aWNlVG9GYXZvcml0ZXNBY3Rpb24KLUFMVF9BRERfU0VSVklDRV9UT19GQVZPUklURVM9XHU1YzA3IFVEREkgXHU2NzBkXHU1MmQ5XHU1MmEwXHU1MjMwXHU2MjExXHU3Njg0XHU2NzAwXHU2MTFiCi0KLSMgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaAotQVRMX0lNUE9SVF9XU0lMX1RPX1dPUktCRU5DSD1cdTVjMDcgV1NJTCBcdTUzMmZcdTUxNjVcdTVkZTVcdTRmNWNcdTUzZjAKLUZPUk1fTEFCRUxfSU1QT1JUX1dTSUxfVE9fV09SS0JFTkNIX0RFU0M9XHU4YWNiXHU5MDc4XHU1M2Q2XHU3NTI4XHU0Zjg2XHU1MTMyXHU1YjU4IFdTSUwgXHU2YTk0XHU3Njg0XHU1ZGU1XHU0ZjVjXHU1M2YwXHU1YzA4XHU2ODQ4XHUzMDAyXHU2MGE4XHU0ZTVmXHU1M2VmXHU4MGZkXHU4YjhhXHU2NmY0IFdTSUwgXHU2YTk0XHU3Njg0XHU1NDBkXHU3YTMxXHUzMDAyCi0KLSMgSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uCi1BTFRfV1NJTF9JTVBPUlRfVE9fRlM9XHU1YzA3IFdTSUwgXHU1MzJmXHU1MTY1XHU2YTk0XHU2ODQ4XHU3Y2ZiXHU3ZDcxXHU0ZTJkCi1BTFRfV1NETF9JTVBPUlRfVE9fRlM9XHU1YzA3IFdTREwgXHU1MzJmXHU1MTY1XHU2YTk0XHU2ODQ4XHU3Y2ZiXHU3ZDcxXHU0ZTJkCi0KLSMgRnJhbWUgdGl0bGVzCi1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSPVx1NWMwZVx1ODliZFx1NTY2OFx1NTEzMlx1NWI1OFx1NTY2OAotRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVI9XHU1YzBlXHU4OWJkXHU1NjY4XHU1ZGU1XHU1MTc3XHU1MjE3Ci1GUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVD1cdTVjMGVcdTg5YmRcdTU2NjhcdTUxNjdcdTViYjkKLUZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSPVx1NTJkNVx1NGY1Y1x1NTEzMlx1NWI1OFx1NTY2OAotRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVI9XHU1MTY3XHU1YmI5XHU1MTMyXHU1YjU4XHU1NjY4Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQ9XHU1MTY3XHU1YmI5XHU1MTY3XHU2NTg3Ci1GUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVI9XHU1MTY3XHU1YmI5XHU1ZGU1XHU1MTc3XHU1MjE3Ci1GUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSPVx1NzJjMFx1NjE0Ylx1NTEzMlx1NWI1OFx1NTY2OAotRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQ9XHU3MmMwXHU2MTRiXHU1MTY3XHU1YmI5Ci1GUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUj1cdTcyYzBcdTYxNGJcdTVkZTVcdTUxNzdcdTUyMTcKLQotIyBGb3JtIHRpdGxlcwotRk9STV9USVRMRV9PUEVOX1dTSUw9XHU5NThiXHU1NTVmIFdTSUwgXHU4ODY4XHU1NWFlCi1GT1JNX1RJVExFX1VERElfQlVTSU5FU1NfREVUQUlMUz1VRERJIFx1NTU0Nlx1Njk2ZFx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfREVUQUlMUz1VRERJIFx1NjcwZFx1NTJkOVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUz1XU0RMIFx1NjcwZFx1NTJkOVx1OGE3M1x1N2QzMFx1OGNjN1x1NjU5OVx1ODg2OFx1NTVhZQotRk9STV9USVRMRV9XU0lMX0RFVEFJTFM9V1NJTCBcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTg4NjhcdTU1YWUKLUZPUk1fVElUTEVfV1NJTF9MSU5LX0RFVEFJTFM9V1NJTCBcdTkzYzhcdTdkNTBcdThhNzNcdTdkMzBcdThjYzdcdTY1OTlcdTg4NjhcdTU1YWUKLQotIyBWaWV3IHRpdGxlcwotVklFV19USVRMRV9VRERJX0JVU0lORVNTRVM9VURESSBcdTU1NDZcdTY5NmRcdTg5OTZcdTU3MTYKLVZJRVdfVElUTEVfVURESV9TRVJWSUNFUz1VRERJIFx1NjcwZFx1NTJkOVx1ODk5Nlx1NTcxNgotVklFV19USVRMRV9XU0RMX1NFUlZJQ0VTPVdTREwgXHU2NzBkXHU1MmQ5XHU4OTk2XHU1NzE2Ci1WSUVXX1RJVExFX1dTSUxfTElOS1M9V1NJTCBcdTkzYzhcdTdkNTBcdTg5OTZcdTU3MTYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9saWIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvV0VCLUlORi9saWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5MmYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0qLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9XRUItSU5GL3dlYi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvd2ViLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwMmUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi08IURPQ1RZUEUgd2ViLWFwcAotICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgotICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgotCi08d2ViLWFwcD4KLTwvd2ViLWFwcD4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25lbmdpbmUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25lbmdpbmUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBiMDQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9uZW5naW5lLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkFjdGlvbklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25FbmdpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuQWN0aW9uRGF0YVBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlNjZW5hcmlvRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlRyYW5zYWN0aW9uRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLkFjdGlvbkRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlhNTFV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5IVE1MVXRpbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLk11bHRpcGFydEZvcm1EYXRhUGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yIiAlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotU3RyaW5nIG1vZGUgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuQUNUSU9OX0VOR0lORV9NT0RFKTsKLVN0cmluZyBzY2VuYXJpbyA9IG51bGw7Ci10cnkKLXsKLSAgTXVsdGlwYXJ0Rm9ybURhdGFQYXJzZXIgcGFyc2VyID0gbmV3IE11bHRpcGFydEZvcm1EYXRhUGFyc2VyKCk7Ci0gIHBhcnNlci5wYXJzZVJlcXVlc3QocmVxdWVzdCwgSFRNTFV0aWxzLlVURjhfRU5DT0RJTkcpOwotICBzY2VuYXJpbyA9IHBhcnNlci5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkFDVElPTl9FTkdJTkVfU0NFTkFSSU8pOwotfQotY2F0Y2ggKFRocm93YWJsZSB0KQotewotfQotQWN0aW9uRW5naW5lIGFjdGlvbkVuZ2luZSA9IGNvbnRyb2xsZXIuZ2V0QWN0aW9uRW5naW5lKCk7Ci1pZiAobW9kZSAhPSBudWxsKQotewotICBhY3Rpb25FbmdpbmUuc2V0TW9kZShBY3Rpb25FbmdpbmUuTU9ERV9ESVNBQkxFRCk7Ci0gIHRyeQotICB7Ci0gICAgYWN0aW9uRW5naW5lLnNldE1vZGUoQnl0ZS5wYXJzZUJ5dGUobW9kZSkpOwotICB9Ci0gIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICB7Ci0gIH0KLX0KLWlmIChzY2VuYXJpbyAhPSBudWxsICYmIHNjZW5hcmlvLmxlbmd0aCgpID4gMCkKLXsKLSAgU2NlbmFyaW9EZXNjcmlwdG9yIHNjZW5hcmlvRGVzY3JpcHRvciA9IG51bGw7Ci0gIHRyeQotICB7Ci0gICAgQWN0aW9uRGF0YVBhcnNlciBwYXJzZXIgPSBuZXcgQWN0aW9uRGF0YVBhcnNlcigpOwotICAgIHNjZW5hcmlvRGVzY3JpcHRvciA9IHBhcnNlci5wYXJzZVNjZW5hcmlvKFhNTFV0aWxzLnN0cmluZ1RvRWxlbWVudChzY2VuYXJpbykpOwotICAgIGFjdGlvbkVuZ2luZS5leGVjdXRlU2NlbmFyaW8oc2NlbmFyaW9EZXNjcmlwdG9yKTsKLSAgfQotICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gIHsKLSAgfQotICBpZiAoc2NlbmFyaW9EZXNjcmlwdG9yICE9IG51bGwpCi0gIHsKLSAgICBUcmFuc2FjdGlvbkRlc2NyaXB0b3JbXSB0cmFuc2FjdGlvbkRlc2NyaXB0b3JzID0gc2NlbmFyaW9EZXNjcmlwdG9yLmdldFRyYW5zYWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zYWN0aW9uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQWN0aW9uRGVzY3JpcHRvcltdIGFjdGlvbkRlc2NyaXB0b3JzID0gdHJhbnNhY3Rpb25EZXNjcmlwdG9yc1tpXS5nZXRBY3Rpb25EZXNjcmlwdG9ycygpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhY3Rpb25EZXNjcmlwdG9ycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgJT4KLSAgICAgICAgPCEtLQotICAgICAgICA8JT1hY3Rpb25EZXNjcmlwdG9yc1tqXS5nZXRJZCgpJT4KLSAgICAgICAgPCU9YWN0aW9uRGVzY3JpcHRvcnNbal0uZ2V0U3RhdHVzSWQoKSU+Ci0gICAgICAgIDwlCi0gICAgICAgIExpc3Qgc3RhdHVzID0gYWN0aW9uRGVzY3JpcHRvcnNbal0uZ2V0U3RhdHVzKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBzdGF0dXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAlPgotICAgICAgICAgICAgPCU9aXQubmV4dCgpLnRvU3RyaW5nKCklPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgJT4KLSAgICAgICAgLS0+Ci0gICAgICAgIDwlCi0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25lbmdpbmVfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9uZW5naW5lX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTk3OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25lbmdpbmVfY29udGFpbmVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25FbmdpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LioiICU+Ci08JQotU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci1Db250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLUFjdGlvbkVuZ2luZSBhY3Rpb25FbmdpbmUgPSBjb250cm9sbGVyLmdldEFjdGlvbkVuZ2luZSgpOwotU3RyaW5nIG1vZGVTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuQUNUSU9OX0VOR0lORV9NT0RFKTsKLWlmIChtb2RlU3RyaW5nICE9IG51bGwgJiYgbW9kZVN0cmluZy5sZW5ndGgoKSA+IDApCi17Ci0gIHRyeQotICB7Ci0gICAgYnl0ZSBtb2RlID0gQnl0ZS5wYXJzZUJ5dGUobW9kZVN0cmluZyk7Ci0gICAgYWN0aW9uRW5naW5lLnNldE1vZGUobW9kZSk7Ci0gIH0KLSAgY2F0Y2ggKFRocm93YWJsZSB0KQotICB7Ci0gIH0KLX0KLVN0cmluZyBwbGF5RmlsZUlkID0gInBsYXlGaWxlSWQiOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiVElUTEVfQUNUSU9OX1JFQ09SREVSIiklPjwvdGl0bGU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGZ1bmN0aW9uIHNldE1vZGUobW9kZSkKLSAgICB7Ci0gICAgICA8JQotICAgICAgU3RyaW5nQnVmZmVyIGZvcm1BY3Rpb24gPSBuZXcgU3RyaW5nQnVmZmVyKHJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiYWN0aW9uZW5naW5lX2NvbnRhaW5lci5qc3A/IikpKTsKLSAgICAgIGZvcm1BY3Rpb24uYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgICAgZm9ybUFjdGlvbi5hcHBlbmQoIj0iKTsKLSAgICAgIGZvcm1BY3Rpb24uYXBwZW5kKHNlc3Npb25JZCk7Ci0gICAgICBmb3JtQWN0aW9uLmFwcGVuZCgiJiIpOwotICAgICAgZm9ybUFjdGlvbi5hcHBlbmQoQWN0aW9uSW5wdXRzLkFDVElPTl9FTkdJTkVfTU9ERSk7Ci0gICAgICBmb3JtQWN0aW9uLmFwcGVuZCgiPSIpOwotICAgICAgJT4KLSAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZm9ybXNbMF07Ci0gICAgICBmb3JtLmFjdGlvbiA9ICc8JT1mb3JtQWN0aW9uLnRvU3RyaW5nKCklPicgKyBtb2RlOwotICAgICAgZm9ybS50YXJnZXQgPSAiX3NlbGYiOwotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBwbGF5KCkKLSAgICB7Ci0gICAgICB2YXIgcGxheUZpbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiPCU9cGxheUZpbGVJZCU+Iik7Ci0gICAgICBpZiAocGxheUZpbGUudmFsdWUgIT0gbnVsbCAmJiBwbGF5RmlsZS52YWx1ZS5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmZvcm1zWzBdOwotICAgICAgICBmb3JtLmFjdGlvbiA9ICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZXhwbG9yZXIuanNwIikpJT4nOwotICAgICAgICBmb3JtLnRhcmdldCA9ICI8JT1GcmFtZU5hbWVzLldJTkRPV19OQU1FX1dTRVhQTE9SRVJfSlNQJT4iOwotICAgICAgICBmb3JtLmVuY3R5cGUgPSAibXVsdGlwYXJ0L2Zvcm0tZGF0YSI7Ci0gICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIGZvcm0uZW5jb2RpbmcgPSAibXVsdGlwYXJ0L2Zvcm0tZGF0YSI7Ci0gICAgICAgIGZvcm0uc3VibWl0KCk7Ci0gICAgICAgIHNldE1vZGUoJzwlPUFjdGlvbkVuZ2luZS5NT0RFX1BMQVklPicpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBhbGVydCgnPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfRVJST1JfSU5WQUxJRF9QTEFZX0ZJTEUiKSU+Jyk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2F2ZSgpCi0gICAgewotICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtc1swXTsKLSAgICAgIGZvcm0uYWN0aW9uID0gJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiYWN0aW9ucy9TYXZlQWN0aW9uRW5naW5lU2NlbmFyaW8uanNwIikpJT4nOwotICAgICAgZm9ybS50YXJnZXQgPSAiX3NlbGYiOwotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICB9Ci0gIDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci0gIDxmb3JtIG1ldGhvZD0icG9zdCI+Ci0gICAgPCUKLSAgICBTdHJpbmcgbGFiZWxNb2RlUGxheSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NT0RFX1BMQVkiKTsKLSAgICBTdHJpbmcgbGFiZWxNb2RlU3RvcCA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NT0RFX1NUT1AiKTsKLSAgICBTdHJpbmcgbGFiZWxNb2RlUmVjb3JkID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01PREVfUkVDT1JEIik7Ci0gICAgU3RyaW5nIGxhYmVsU2F2ZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TQVZFIik7Ci0gICAgYnl0ZSBtb2RlID0gYWN0aW9uRW5naW5lLmdldE1vZGUoKTsKLSAgICBTdHJpbmcgaW1nUGxheSA9IChtb2RlID09IEFjdGlvbkVuZ2luZS5NT0RFX1BMQVkpID8gImltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3BsYXkuZ2lmIiA6ICJpbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9wbGF5LmdpZiI7Ci0gICAgU3RyaW5nIGltZ1N0b3AgPSAobW9kZSA9PSBBY3Rpb25FbmdpbmUuTU9ERV9TVE9QKSA/ICJpbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9zdG9wLmdpZiIgOiAiaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfc3RvcC5naWYiOwotICAgIFN0cmluZyBpbWdSZWNvcmQgPSAobW9kZSA9PSBBY3Rpb25FbmdpbmUuTU9ERV9SRUNPUkQpID8gImltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3JlY29yZC5naWYiIDogImltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3JlY29yZC5naWYiOwotICAgIFN0cmluZyBpbWdTYXZlID0gImltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3NhdmUuZ2lmIjsKLSAgICAlPgotICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTM+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiIG5vd3JhcD4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnBsYXkoKSI+Ci0gICAgICAgICAgICA8aW1nIGNsYXNzPSJub3JtYWwiIGJvcmRlcj0wIGFsdD0iPCU9bGFiZWxNb2RlUGxheSU+IiB0aXRsZT0iPCU9bGFiZWxNb2RlUGxheSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChpbWdQbGF5KSklPiI+Ci0gICAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTU9ERV9QTEFZIiklPgotICAgICAgICAgIDwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgY2xhc3M9ImxhYmVscyIgbm93cmFwPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6c2V0TW9kZSgnPCU9U3RyaW5nLnZhbHVlT2YoQWN0aW9uRW5naW5lLk1PREVfU1RPUCklPicpIj4KLSAgICAgICAgICAgIDxpbWcgY2xhc3M9Im5vcm1hbCIgYm9yZGVyPTAgYWx0PSI8JT1sYWJlbE1vZGVTdG9wJT4iIHRpdGxlPSI8JT1sYWJlbE1vZGVTdG9wJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGltZ1N0b3ApKSU+Ij4KLSAgICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NT0RFX1NUT1AiKSU+Ci0gICAgICAgICAgPC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIiBub3dyYXA+Ci0gICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzZXRNb2RlKCc8JT1TdHJpbmcudmFsdWVPZihBY3Rpb25FbmdpbmUuTU9ERV9SRUNPUkQpJT4nKSI+Ci0gICAgICAgICAgICA8aW1nIGNsYXNzPSJub3JtYWwiIGJvcmRlcj0wIGFsdD0iPCU9bGFiZWxNb2RlUmVjb3JkJT4iIHRpdGxlPSI8JT1sYWJlbE1vZGVSZWNvcmQlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoaW1nUmVjb3JkKSklPiI+Ci0gICAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTU9ERV9SRUNPUkQiKSU+Ci0gICAgICAgICAgPC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIiBub3dyYXA+Ci0gICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzYXZlKCkiPgotICAgICAgICAgICAgPGltZyBjbGFzcz0ibm9ybWFsIiBib3JkZXI9MCBhbHQ9IjwlPWxhYmVsU2F2ZSU+IiB0aXRsZT0iPCU9bGFiZWxTYXZlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGltZ1NhdmUpKSU+Ij4KLSAgICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TQVZFIiklPgotICAgICAgICAgIDwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0zPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIiBub3dyYXA+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BMQVlfRklMRSIpJT48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9IjwlPXBsYXlGaWxlSWQlPiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLkFDVElPTl9FTkdJTkVfU0NFTkFSSU8lPiI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZm9ybT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9DaGVja1dvcmtiZW5jaEZpbGVSZWFkT25seUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2hlY2tXb3JrYmVuY2hGaWxlUmVhZE9ubHlBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjhjMDA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9DaGVja1dvcmtiZW5jaEZpbGVSZWFkT25seUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIHBhbmVzRmlsZS5hcHBlbmQoY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotPCUKLSAgIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IChJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbilzZXNzaW9uLmdldEF0dHJpYnV0ZShBY3Rpb25JbnB1dHMuSU1QT1JUX0FDVElPTik7Ci0gICBpZiAoYWN0aW9uLmlzVGFyZ2V0RmlsZVJlc291cmNlUmVhZE9ubHkoKSkKLSAgIHsKLSU+Ci0gIHZhciBwcm9jZWVkID0gdHJ1ZTsKLTwlICAgCi0gICAgIGlmICghYWN0aW9uLmlzQ2hlY2tvdXRGaWxlc0VuYWJsZWQoKSkKLSAgICAgewotJT4KLSAgcHJvY2VlZCA9IGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZShhY3Rpb24uZ2V0V2ViU2VydmljZVBsdWdpbkZpbGVNZXNzYWdlKCJNU0dfRVJST1JfRklMRV9DSEVDS09VVF9ESVNBQkxFRCIpKSU+Iik7Ci08JSAgICAgCi0gICAgIH0KLSU+Ci0gIGlmIChwcm9jZWVkKQotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFZhbGlkYXRlRWRpdEFjdGlvbi5nZXRBY3Rpb25MaW5rKCkpKSU+IjsKLTwlICAgICAKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFdyaXRlV1NETFRvV29ya2JlbmNoQWN0aW9uLmdldEFjdGlvbkxpbmsoKSkpJT4iOwotPCUKLSAgIH0KLSU+ICAgICAKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPiAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2xlYXJOb2RlQWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0Zjk3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvQ2xlYXJOb2RlQWN0aW9uLmluYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCUKLSAgIFBlcnNwZWN0aXZlIGN1cnJlbnRQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsgICAgCi08JQotICAgU3RyaW5nIHRyZWVDb250ZW50VmFyID0gYWN0aW9uLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gICBpZiAodHJlZUNvbnRlbnRWYXIgIT0gbnVsbCkKLSAgIHsKLSU+Ci0gICAgPCU9dHJlZUNvbnRlbnRWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFRyZWVDb250ZW50UGFnZSgpKSklPiI7Ci08JQotICAgfQotICAgU3RyaW5nIHByb3BlcnRpZXNDb250YWluZXJWYXIgPSBhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpOwotICAgaWYgKHByb3BlcnRpZXNDb250YWluZXJWYXIgIT0gbnVsbCkKLSAgIHsKLSU+Ci0gICAgPCU9cHJvcGVydGllc0NvbnRhaW5lclZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRhaW5lclBhZ2UoKSkpJT4iOwotPCUgICAKLSAgIH0KLSAgIFN0cmluZyBzdGF0dXNDb250ZW50VmFyID0gYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgIGlmIChzdGF0dXNDb250ZW50VmFyICE9IG51bGwpCi0gICB7Ci0lPgotICAgIDwlPXN0YXR1c0NvbnRlbnRWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRQYWdlKCkpKSU+IjsKLTwlCi0gICB9Ci0lPgotICB9Ci0gIGVsc2UKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCkpKSU+IjsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0NsZWFyVmlld0VsZW1lbnRBY3Rpb24uaW5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0NsZWFyVmlld0VsZW1lbnRBY3Rpb24uaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjEyNDExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9DbGVhclZpZXdFbGVtZW50QWN0aW9uLmluYworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCUKLSAgIFBlcnNwZWN0aXZlIGN1cnJlbnRQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08aGVhZD4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci08JQotICAgU3RyaW5nIHByb3BlcnRpZXNDb250YWluZXJWYXIgPSBhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpOwotICAgaWYgKHByb3BlcnRpZXNDb250YWluZXJWYXIgIT0gbnVsbCkKLSAgIHsKLSU+Ci0gIDwlPXByb3BlcnRpZXNDb250YWluZXJWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkpKSU+IjsKLTwlCi0gICB9Ci0gICBTdHJpbmcgc3RhdHVzQ29udGVudFZhciA9IGFjdGlvbi5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICBpZiAoc3RhdHVzQ29udGVudFZhciAhPSBudWxsKQotICAgewotJT4KLSAgPCU9c3RhdHVzQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSkpJT4iOwotPCUKLSAgIH0KLSU+Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uaW5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZTA3NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIC8vIHJ1biB0aGUgYWN0aW9uCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5ydW4oKTsKLSAgIGJvb2xlYW4gd3JpdHRlbiA9IGZhbHNlOwotCi0gICBpZiAoYWN0aW9uUmVzdWx0KQotICAgewotICAgICAvLyB3cml0ZSB0byBmaWxlIHN5c3RlbQotICAgICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgIHJlc3BvbnNlLnNldEhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbiIsImF0dGFjaG1lbnQ7ZmlsZW5hbWU9IithY3Rpb24uZ2V0RGVmYXVsdEZpbGVOYW1lKCkpOwotICAgICBhY3Rpb24ud3JpdGUocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICB3cml0dGVuID0gdHJ1ZTsKLSAgIH0KLQotICAgaWYgKCF3cml0dGVuKQotICAgewotJT4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08JQotICAgICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgICAgIHBhbmVzRmlsZS5hcHBlbmQoY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAgICBpZiAoYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRWYXIoKSAhPSBudWxsKQotICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICA8JT1hY3Rpb24uZ2V0U3RhdHVzQ29udGVudFZhcigpJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRTdGF0dXNDb250ZW50UGFnZSgpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgICB9Ci0lPiAgICAgIAotPC9ib2R5PgotPC9odG1sPgotPCUKLSAgIH0KLSU+ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2U1NzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIHBhbmVzRmlsZS5hcHBlbmQoY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotPCUKLSAgIC8vTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIGlmICghaW5wdXRzVmFsaWQpCi0gICB7Ci0gICAgIFN0cmluZyBzdGF0dXNDb250ZW50VmFyID0gYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICAgaWYgKHN0YXR1c0NvbnRlbnRWYXIgIT0gbnVsbCkKLSAgICAgewotJT4KLSAgPCU9c3RhdHVzQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0U3RhdHVzQ29udGVudFBhZ2UoKSkpJT4iOwotPCUKLSAgICAgfQotICAgfQotICAgZWxzZQotICAgewotICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShBY3Rpb25JbnB1dHMuSU1QT1JUX0FDVElPTixhY3Rpb24pOyAgIAotICAgICBpZiAoYWN0aW9uLmZpbGVFeGlzdHMoKSkKLSAgICAgewotJT4KLSAgdmFyIHByb2NlZWQgPSB0cnVlOwotPCUgICAgICAgIAotICAgICAgIGlmICghYWN0aW9uLmlzT3ZlcndyaXRlRmlsZXNFbmFibGVkKCkpCi0gICAgICAgewotJT4KLSAgcHJvY2VlZCA9IGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZShhY3Rpb24uZ2V0V2ViU2VydmljZVBsdWdpbkZpbGVNZXNzYWdlKCJNU0dfRVJST1JfRklMRV9PVkVSV1JJVEVfRElTQUJMRUQiKSklPiIpOwotPCUKLSAgICAgICB9Ci0lPgotICBpZiAocHJvY2VlZCkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChDaGVja1dvcmtiZW5jaEZpbGVSZWFkT25seUFjdGlvbi5nZXRBY3Rpb25MaW5rKCkpKSU+IjsKLTwlCi0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0lPgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChXcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbi5nZXRBY3Rpb25MaW5rKCkpKSU+IjsKLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci08L3NjcmlwdD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxNDlhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlCi0gICAvL0xvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24ucnVuKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwlCi0gICBTdHJpbmdCdWZmZXIgcGFuZXNGaWxlID0gbmV3IFN0cmluZ0J1ZmZlcigiLyIpOwotICAgcGFuZXNGaWxlLmFwcGVuZChjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldFBhbmVzRmlsZSgpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9cGFuZXNGaWxlLnRvU3RyaW5nKCklPiIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIGlmICghYWN0aW9uUmVzdWx0KQotICAgewotICAgICBTdHJpbmcgc3RhdHVzQ29udGVudFZhciA9IGFjdGlvbi5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICAgIGlmIChzdGF0dXNDb250ZW50VmFyICE9IG51bGwpCi0gICAgIHsKLSU+ICAgIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIDwlPXN0YXR1c0NvbnRlbnRWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRQYWdlKCkpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgICAgfQotICAgfQotJT4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9SZXRyaWV2ZUhpc3RvcnlBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1JldHJpZXZlSGlzdG9yeUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTUxYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1JldHJpZXZlSGlzdG9yeUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmV0cmlldmVIaXN0b3J5QWN0aW9uIGFjdGlvbiA9IG5ldyBSZXRyaWV2ZUhpc3RvcnlBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5ydW4oKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgVVRGLTgiPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLTwlCi0gICBCcmVhZENydW1iIGIgPSBhY3Rpb24uZ2V0QnJlYWRDcnVtYigpOwotICAgaWYgKGIgIT0gbnVsbCkKLSAgIHsKLSAgICAgaW50IGJyZWFkQ3J1bWJQZXJzcGVjdGl2ZUlkID0gYi5nZXRQZXJzcGVjdGl2ZUlkKCk7Ci0gICAgIGlmIChicmVhZENydW1iUGVyc3BlY3RpdmVJZCAhPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldFBlcnNwZWN0aXZlSWQoKSkKLSAgICAgewotICAgICAgIC8vIFN3aXRjaCB0aGUgcGVyc3BlY3RpdmUuCi0lPgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhicmVhZENydW1iUGVyc3BlY3RpdmVJZCx0cnVlKSkpJT4iOwotPCUKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAvLyBKdW1wIHRvIHRoZSBwYWdlIHJldHJpZXZlZCBmcm9tIGhpc3RvcnkuCi0lPgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYi5nZXRVUkwoKSkpJT4iOwotPCUKLSAgICAgfQotICAgfQotJT4KLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1NhdmVBY3Rpb25FbmdpbmVTY2VuYXJpby5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2F2ZUFjdGlvbkVuZ2luZVNjZW5hcmlvLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwYjlkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2F2ZUFjdGlvbkVuZ2luZVNjZW5hcmlvLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5kYXRhLlNjZW5hcmlvRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmVuZ2luZS5BY3Rpb25EYXRhUGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5YTUxVdGlscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby5QcmludFdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCIlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotcmVzcG9uc2Uuc2V0SGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uIiwiYXR0YWNobWVudDtmaWxlbmFtZT1zY2VuYXJpby54bWwiKTsKLVNjZW5hcmlvRGVzY3JpcHRvciBzY2VuYXJpb0Rlc2NyaXB0b3IgPSBjb250cm9sbGVyLmdldEFjdGlvbkVuZ2luZSgpLmdldFNjZW5hcmlvKCk7Ci1BY3Rpb25EYXRhUGFyc2VyIHBhcnNlciA9IG5ldyBBY3Rpb25EYXRhUGFyc2VyKCk7Ci1FbGVtZW50IHNjZW5hcmlvID0gcGFyc2VyLnRvRWxlbWVudChzY2VuYXJpb0Rlc2NyaXB0b3IpOwotaWYgKHNjZW5hcmlvICE9IG51bGwpCi17Ci0gIHRyeQotICB7Ci0gICAgU3RyaW5nIHNjZW5hcmlvU3RyaW5nID0gWE1MVXRpbHMuc2VyaWFsaXplKHNjZW5hcmlvLCBmYWxzZSk7Ci0gICAgaWYgKHNjZW5hcmlvU3RyaW5nICE9IG51bGwpCi0gICAgewotICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIocmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOwotICAgICAgcHcucHJpbnRsbihzY2VuYXJpb1N0cmluZyk7Ci0gICAgICBwdy5jbG9zZSgpOwotICAgIH0KLSAgfQotICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gIHsKLSAgfQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TZWxlY3ROb2RlQWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmODZmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2VsZWN0Tm9kZUFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JQotICAgUGVyc3BlY3RpdmUgY3VycmVudFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgVVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICBpZiAoIWFjdGlvblJlc3VsdCkKLSAgIHsKLSAgICAgaWYgKGFjdGlvbi5pc1N0YWxlQnJlYWRDcnVtYigpKQotICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIC8vIFJlcnVuIHRoZSBoaXN0b3J5IGFjdGlvbiB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGl0ZW0uCi0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXROZXh0SGlzdG9yeUFjdGlvbkxpbmsoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIFN0cmluZyB0cmVlQ29udGVudFZhciA9IGFjdGlvbi5nZXRUcmVlQ29udGVudFZhcigpOwotICAgICBTdHJpbmcgcHJvcGVydGllc0NvbnRhaW5lclZhciA9IGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyVmFyKCk7Ci0gICAgIGlmIChhY3Rpb24ucmVxdWlyZXNUcmVlVmlld1JlZnJlc2goKSkKLSAgICAgewotICAgICAgIGlmICh0cmVlQ29udGVudFZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGlzTWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcigpKQotICB7Ci0gICAgLy8gVXBkYXRlIHRoZSB0cmVldmlldy4KLSAgICA8JT10cmVlQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0VHJlZUNvbnRlbnRQYWdlKCkpKSU+IjsKLSAgfQotICBlbHNlCi0gICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChjdXJyZW50UGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50UGFnZSgpKSklPiI7ICAKLTwvc2NyaXB0PgotPCUKLSAgICAgICB9Ci0gICAgICAgaWYgKHByb3BlcnRpZXNDb250YWluZXJWYXIgIT0gbnVsbCkKLSAgICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgICA8JT1wcm9wZXJ0aWVzQ29udGFpbmVyVmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgICAgfQotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gYWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgTm9kZSBwcmV2aW91c1NlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFByZXZpb3VzU2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgaW50IHNlbGVjdGVkTm9kZUlkID0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpOwotICAgICAgIGlmICh0cmVlQ29udGVudFZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgLy8gVXBkYXRlIHRoZSBwZXJzcGVjdGl2ZS4KLTwlCi0gICAgICAgICBpZiAocHJldmlvdXNTZWxlY3RlZE5vZGUgIT0gbnVsbCAmJiBwcmV2aW91c1NlbGVjdGVkTm9kZS5pc1Zpc2libGUoKSkKLSAgICAgICAgIHsKLSU+Ci0gIDwlPXRyZWVDb250ZW50VmFyJT4uYWx0ZXJJbWFnZSgnPCU9cHJldmlvdXNTZWxlY3RlZE5vZGUuZ2V0QW5jaG9yTmFtZSgpJT4nLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQocHJldmlvdXNTZWxlY3RlZE5vZGUuZ2V0Q2xvc2VkSW1hZ2VQYXRoKCkpKSU+Jyk7Ci08JQotICAgICAgICAgfQotICAgICAgICAgU3RyaW5nIHNlbGVjdGVkTm9kZUFuY2hvck5hbWUgPSBzZWxlY3RlZE5vZGUuZ2V0QW5jaG9yTmFtZSgpOwotJT4KLSAgPCU9dHJlZUNvbnRlbnRWYXIlPi5zZWxlY3ROb2RlKCc8JT1zZWxlY3RlZE5vZGVBbmNob3JOYW1lJT4nLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoc2VsZWN0ZWROb2RlLmdldE9wZW5JbWFnZVBhdGgoKSkpJT4nKTsKLSAgPCU9dHJlZUNvbnRlbnRWYXIlPi5sb2NhdGlvbi5oYXNoID0gJyM8JT1zZWxlY3RlZE5vZGVBbmNob3JOYW1lJT4nOwotPCUKLSAgICAgICB9Ci0gICAgICAgaWYgKHByb3BlcnRpZXNDb250YWluZXJWYXIgIT0gbnVsbCkKLSAgICAgICB7Ci0lPgotICA8JT1wcm9wZXJ0aWVzQ29udGFpbmVyVmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpKSklPiI7Ci08JQotICAgICAgIH0KLSU+Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci08L2JvZHk+Ci08aHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2VsZWN0Tm9kZVRvb2xBY3Rpb24uaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRjZmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JQotICAgUGVyc3BlY3RpdmUgY3VycmVudFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgVVRGLTgiPgotPCUKLSAgIFN0cmluZ0J1ZmZlciBwYW5lc0ZpbGUgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7Ci0gICBwYW5lc0ZpbGUuYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQYW5lc0ZpbGUoKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9IjwlPXBhbmVzRmlsZS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICBpZiAoIWFjdGlvblJlc3VsdCkKLSAgIHsKLSAgICAgaWYgKGFjdGlvbi5pc1N0YWxlQnJlYWRDcnVtYigpKQotICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIC8vIFJlcnVuIHRoZSBoaXN0b3J5IGFjdGlvbiB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGl0ZW0uCi0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXROZXh0SGlzdG9yeUFjdGlvbkxpbmsoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIGlmIChhY3Rpb24ucmVxdWlyZXNTdGF0dXNVcGRhdGUoKSkKLSAgICAgewotICAgICAgIFN0cmluZyBzdGF0dXNDb250ZW50VmFyID0gYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgICAgICBpZiAoc3RhdHVzQ29udGVudFZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgLy8gVXBkYXRlIHRoZSBzdGF0dXMgY29udGVudCB3aXRoIGFueSBtZXNzYWdlcyBhcmlzaW5nIGZyb20gdGhpcyBhY3Rpb24uCi0gIDwlPXN0YXR1c0NvbnRlbnRWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRQYWdlKCkpKSU+IjsKLTwvc2NyaXB0PiAgCi08JSAgICAKLSAgICAgICB9Ci0gICAgIH0gCi0gICAgICAgIAotICAgICBTdHJpbmcgdHJlZUNvbnRlbnRWYXIgPSBhY3Rpb24uZ2V0VHJlZUNvbnRlbnRWYXIoKTsKLSAgICAgU3RyaW5nIHByb3BlcnRpZXNDb250YWluZXJWYXIgPSBhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpOwotICAgICBpZiAoYWN0aW9uLnJlcXVpcmVzVHJlZVZpZXdSZWZyZXNoKCkpCi0gICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLTwlCi0gICAgICAgaWYgKHRyZWVDb250ZW50VmFyICE9IG51bGwpCi0gICAgICAgewotJT4KLSAgaWYgKGlzTWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcigpKQotICB7Ci0gICAgLy8gUmVsb2FkIHRoZSBuYXZpZ2F0b3IgdHJlZSB2aWV3IHRvIHNob3cgdGhlIHN0cnVjdHVyYWwgY2hhbmdlLgotICAgIDwlPXRyZWVDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRUcmVlQ29udGVudFBhZ2UoKSkpJT4iOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoY3VycmVudFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudFBhZ2UoKSkpJT4iOwotICB9Ci08JQotICAgICAgIH0KLSAgICAgICBpZiAocHJvcGVydGllc0NvbnRhaW5lclZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgICA8JT1wcm9wZXJ0aWVzQ29udGFpbmVyVmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpKSklPiI7Ci08JQotICAgICAgIH0KLSU+Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgICAgZWxzZSBpZiAoYWN0aW9uLnJlcXVpcmVzTm9kZVNlbGVjdGlvbigpKQotICAgICB7Ci0gICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBhY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICBOb2RlIHByZXZpb3VzU2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0UHJldmlvdXNTZWxlY3RlZE5vZGUoKTsKLSAgICAgICBpbnQgc2VsZWN0ZWROb2RlSWQgPSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci08JQotICAgICAgIGlmICh0cmVlQ29udGVudFZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci0gIC8vIFVwZGF0ZSB0aGUgbmF2aWdhdG9yIHRyZWUgdG8gc2hvdyB0aGUgc2VsZWN0aW9uLgotPCUKLSAgICAgICAgIGlmIChwcmV2aW91c1NlbGVjdGVkTm9kZSAhPSBudWxsKQotICAgICAgICAgewotJT4KLSAgPCU9dHJlZUNvbnRlbnRWYXIlPi5hbHRlckltYWdlKCc8JT1wcmV2aW91c1NlbGVjdGVkTm9kZS5nZXRBbmNob3JOYW1lKCklPicsJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChwcmV2aW91c1NlbGVjdGVkTm9kZS5nZXRDbG9zZWRJbWFnZVBhdGgoKSkpJT4nKTsKLTwlCi0gICAgICAgICB9Ci0gICAgICAgICBTdHJpbmcgc2VsZWN0ZWROb2RlQW5jaG9yTmFtZSA9IHNlbGVjdGVkTm9kZS5nZXRBbmNob3JOYW1lKCk7Ci0lPgotICA8JT10cmVlQ29udGVudFZhciU+LnNlbGVjdE5vZGUoJzwlPXNlbGVjdGVkTm9kZUFuY2hvck5hbWUlPicsJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChzZWxlY3RlZE5vZGUuZ2V0T3BlbkltYWdlUGF0aCgpKSklPicpOwotICA8JT10cmVlQ29udGVudFZhciU+LmxvY2F0aW9uLmhhc2ggPSAnIzwlPXNlbGVjdGVkTm9kZUFuY2hvck5hbWUlPic7Ci08JQotICAgICAgIH0KLSAgICAgICBpZiAocHJvcGVydGllc0NvbnRhaW5lclZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci0gIDwlPXByb3BlcnRpZXNDb250YWluZXJWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkpKSU+IjsKLTwlCi0gICAgICAgfQotJT4KLTwvc2NyaXB0PgotPCUKLSAgICAgfQotICAgICBlbHNlIGlmIChhY3Rpb24ucmVxdWlyZXNWaWV3U2VsZWN0aW9uKCkpCi0gICAgIHsKLSAgICAgICBpZiAocHJvcGVydGllc0NvbnRhaW5lclZhciAhPSBudWxsKQotICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgLy8gVXBkYXRlIHRoZSBwcm9wZXJ0aWVzIGNvbnRhaW5lciB0byBzaG93IHRoZSB2aWV3LgotICA8JT1wcm9wZXJ0aWVzQ29udGFpbmVyVmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGFpbmVyUGFnZSgpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgICAgfQotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIFN0cmluZyBwcm9wZXJ0aWVzQ29udGVudFZhciA9IGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGVudFZhcigpOwotICAgICAgIFRvb2wgdG9vbCA9IGFjdGlvbi5nZXRTZWxlY3RlZFZpZXdUb29sKCk7Ci0gICAgICAgaWYgKHRvb2wgPT0gbnVsbCkKLSAgICAgICAgIHRvb2wgPSBhY3Rpb24uZ2V0U2VsZWN0ZWRUb29sKCk7Ci0gICAgICAgaWYgKHRvb2wuZ2V0VG9vbFR5cGUoKSAhPSBUb29sVHlwZXMuQUNUSU9OKQotICAgICAgIHsKLSAgICAgICAgIGlmIChwcm9wZXJ0aWVzQ29udGVudFZhciAhPSBudWxsKQotICAgICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAvLyBVcGRhdGUgdGhlIHByb3BlcnRpZXMgY29udGVudCB3aXRoIHRoZSB0b29sJ3MgZm9ybS4KLSAgPCU9cHJvcGVydGllc0NvbnRlbnRWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodG9vbC5nZXRGb3JtTGluaygpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBpZiAoIWFjdGlvbi5pc0hpc3RvcnlBY3Rpb24oKSkKLSAgICAgICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgLy8gUnVuIHRoZSB0b29sJ3MgYWN0aW9uIG9ubHkgaWYgaXQgaXMgbm90IGZyb20gdGhlIGhpc3RvcnkuCi0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRvb2wuZ2V0QWN0aW9uTGluaygpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgIGlmIChwcm9wZXJ0aWVzQ29udGVudFZhciAhPSBudWxsKQotICAgICAgICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIDwlPXByb3BlcnRpZXNDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRQcm9wZXJ0aWVzQ29udGVudFBhZ2UoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICB9Ci0lPgotPC9ib2R5PgotPGh0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvU2hvd1BlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TaG93UGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFlZDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9TaG93UGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFBlcnNwZWN0aXZlIGN1cnJlbnRQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmdCdWZmZXIgZnJhbWVzZXRzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIGZyYW1lc2V0c0ZpbGUuYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRGcmFtZXNldHNGaWxlKCkpOwotICAgCi0gICBTdHJpbmdCdWZmZXIgZnJhbWVzZXRzRm9ybSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIGZyYW1lc2V0c0Zvcm0uYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQcm9jZXNzRnJhbWVzZXRzRm9ybSgpKTsKLSAgIAotICAgaW50IHRhcmdldFBlcnNwZWN0aXZlSWQ7Ci0gICBib29sZWFuIGlzSGlzdG9yeTsKLSAgIHRyeQotICAgewotICAgICB0YXJnZXRQZXJzcGVjdGl2ZUlkID0gSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkUpKTsKLSAgICAgaXNIaXN0b3J5ID0gKCIxIi5lcXVhbHMocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLklTSElTVE9SWSkpKTsKLSAgIH0KLSAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgIHsKLSAgICAgdGFyZ2V0UGVyc3BlY3RpdmVJZCA9IEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJOwotICAgICBpc0hpc3RvcnkgPSBmYWxzZTsKLSAgIH0KLSAgIAotICAgaWYgKGNvbnRyb2xsZXIuaXNQZXJzcGVjdGl2ZUNvbnRlbnRCbGFuaygpKQotICAgewotICAgICBjb250cm9sbGVyLmVuYWJsZVBlcnNwZWN0aXZlQ29udGVudEJsYW5rKGZhbHNlKTsKLSAgICAgY29udHJvbGxlci5hZGRUb0hpc3RvcnkoY3VycmVudFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlSWQoKSxTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXRQZXJzcGVjdGl2ZUlkLHRydWUpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvc3dpdGNocGVyc3BlY3RpdmUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1mcmFtZXNldHNGaWxlLnRvU3RyaW5nKCklPiIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1BY3Rpb24uYXBwZW5kKGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRTd2l0Y2hQZXJzcGVjdGl2ZUZvcm1BY3Rpb25MaW5rKHRhcmdldFBlcnNwZWN0aXZlSWQsaXNIaXN0b3J5KSk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9ZnJhbWVzZXRzRm9ybS50b1N0cmluZygpJT4iIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+Ci08JQotICAgfQotJT4gICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNGYzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvVG9nZ2xlTm9kZUFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlCi0gICBQZXJzcGVjdGl2ZSBjdXJyZW50UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBVVEYtOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIHBhbmVzRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoIi8iKTsKLSAgIHBhbmVzRmlsZS5hcHBlbmQoY3VycmVudFBlcnNwZWN0aXZlLmdldFBhbmVzRmlsZSgpKTsKLSU+ICAgICAKLTxqc3A6aW5jbHVkZSBwYWdlPSI8JT1wYW5lc0ZpbGUudG9TdHJpbmcoKSU+IiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PiAgCi08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICBpZiAoIWFjdGlvblJlc3VsdCkKLSAgIHsKLSAgICAgaWYgKGFjdGlvbi5pc1N0YWxlQnJlYWRDcnVtYigpKQotICAgICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIC8vIFJlcnVuIHRoZSBoaXN0b3J5IGFjdGlvbiB0byBnZXQgdGhlIG5leHQgYXZhaWxhYmxlIGl0ZW0uCi0gIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXROZXh0SGlzdG9yeUFjdGlvbkxpbmsoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIFN0cmluZyB0cmVlQ29udGVudFZhciA9IGFjdGlvbi5nZXRUcmVlQ29udGVudFZhcigpOwotICAgICBpZiAodHJlZUNvbnRlbnRWYXIgIT0gbnVsbCkKLSAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICAvLyBVcGRhdGUgdGhlIHBlcnNwZWN0aXZlLgotICAgIDwlPXRyZWVDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRUcmVlQ29udGVudFBhZ2UoKSkpJT4iOwotICB9Ci0gIGVsc2UKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGN1cnJlbnRQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCkpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgICAgfQotICAgICBpZiAoYWN0aW9uLnJlcXVpcmVzTm9kZVNlbGVjdGlvbigpKQotICAgICB7Ci0gICAgICAgU3RyaW5nIHByb3BlcnRpZXNDb250YWluZXJWYXIgPSBhY3Rpb24uZ2V0UHJvcGVydGllc0NvbnRhaW5lclZhcigpOwotICAgICAgIGlmIChwcm9wZXJ0aWVzQ29udGFpbmVyVmFyICE9IG51bGwpCi0gICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICAvLyBVcGRhdGUgdGhlIHByb3BlcnRpZXMgY29udGFpbmVyLgotICAgIDwlPXByb3BlcnRpZXNDb250YWluZXJWYXIlPi5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFByb3BlcnRpZXNDb250YWluZXJQYWdlKCkpKSU+IjsKLSAgfQotPC9zY3JpcHQ+Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotJT4KLTwvYm9keT4KLTxodG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1ZhbGlkYXRlRWRpdEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvVmFsaWRhdGVFZGl0QWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3ZGQ4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2FjdGlvbnMvVmFsaWRhdGVFZGl0QWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwlCi0gICBTdHJpbmdCdWZmZXIgcGFuZXNGaWxlID0gbmV3IFN0cmluZ0J1ZmZlcigiLyIpOwotICAgcGFuZXNGaWxlLmFwcGVuZChjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldFBhbmVzRmlsZSgpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9cGFuZXNGaWxlLnRvU3RyaW5nKCklPiIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IChJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbilzZXNzaW9uLmdldEF0dHJpYnV0ZShBY3Rpb25JbnB1dHMuSU1QT1JUX0FDVElPTik7Ci0gICBib29sZWFuIHJlc3VsdCA9IGFjdGlvbi52YWxpZGF0ZUVkaXQoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKDwlPXJlc3VsdCU+KQotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFdyaXRlV1NETFRvV29ya2JlbmNoQWN0aW9uLmdldEFjdGlvbkxpbmsoKSkpJT4iOwotICBlbHNlCi0gIHsKLTwlICAKLSAgIFN0cmluZyBzdGF0dXNDb250ZW50VmFyID0gYWN0aW9uLmdldFN0YXR1c0NvbnRlbnRWYXIoKTsKLSAgIGlmIChzdGF0dXNDb250ZW50VmFyICE9IG51bGwpCi0gICB7Ci0lPiAgICAKLSAgICA8JT1zdGF0dXNDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRTdGF0dXNDb250ZW50UGFnZSgpKSklPiI7Ci08JQotICAgfQotJT4KLSAgfQotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1dyaXRlV1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvYWN0aW9ucy9Xcml0ZVdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2ViNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9hY3Rpb25zL1dyaXRlV1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwlCi0gICBTdHJpbmdCdWZmZXIgcGFuZXNGaWxlID0gbmV3IFN0cmluZ0J1ZmZlcigiLyIpOwotICAgcGFuZXNGaWxlLmFwcGVuZChjb250cm9sbGVyLmdldEN1cnJlbnRQZXJzcGVjdGl2ZSgpLmdldFBhbmVzRmlsZSgpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9cGFuZXNGaWxlLnRvU3RyaW5nKCklPiIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIEltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IChJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbilzZXNzaW9uLmdldEF0dHJpYnV0ZShBY3Rpb25JbnB1dHMuSU1QT1JUX0FDVElPTik7Ci0gICBhY3Rpb24ucnVuKCk7Ci0gICBTdHJpbmcgc3RhdHVzQ29udGVudFZhciA9IGFjdGlvbi5nZXRTdGF0dXNDb250ZW50VmFyKCk7Ci0gICBpZiAoc3RhdHVzQ29udGVudFZhciAhPSBudWxsKQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICA8JT1zdGF0dXNDb250ZW50VmFyJT4ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGFjdGlvbi5nZXRTdGF0dXNDb250ZW50UGFnZSgpKSklPiI7Ci08L3NjcmlwdD4gIAotPCUKLSAgIH0KLSU+Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX2Jyb3dzZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jYWxlbmRhcl9icm93c2VyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjMWU4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX2Jyb3dzZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPgotICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiVElUTEVfQ0FMRU5EQVJfQlJPV1NFUiIpJT4KLSAgPC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLTwlCi0gICBTdHJpbmdCdWZmZXIgbGluayA9IG5ldyBTdHJpbmdCdWZmZXIoImNhbGVuZGFyX3Rvb2xiYXIuanNwPyIpOwotICAgbGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCk7Ci0lPiAgIAotICA8ZnJhbWUgbmFtZT0iPCU9RnJhbWVOYW1lcy5DQUxFTkRBUl9UT09MQkFSJT4iIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0NBTEVOREFSX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChsaW5rLnRvU3RyaW5nKCkpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08JQotICAgbGluay5zZXRMZW5ndGgoMCk7Ci0gICBsaW5rLmFwcGVuZCgiY2FsZW5kYXJfY29udGVudC5qc3A/Iik7Ci0gICBsaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSAgIGxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFKS5hcHBlbmQoJz0nKS5hcHBlbmQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEUpKTsKLSU+ICAgICAKLSAgPGZyYW1lIG5hbWU9IjwlPUZyYW1lTmFtZXMuQ0FMRU5EQVJfQ09OVEVOVCU+IiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9DQUxFTkRBUl9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQobGluay50b1N0cmluZygpKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY2FsZW5kYXJfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmM2Y2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY2FsZW5kYXJfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgaW50IGNhbGVuZGFyVHlwZSA9IEludGVnZXIucGFyc2VJbnQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEUpKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gIDx0aXRsZT48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0NBTEVOREFSX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvY2FsZW5kYXIuY3NzIikpJT4iPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgZGF5cyA9IG5ldyBBcnJheSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TSF9TVU5EQVkiKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0hfTU9OREFZIikpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NIX1RVRVNEQVkiKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0hfV0VETkVTREFZIikpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NIX1RIVVJTREFZIikpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NIX0ZSSURBWSIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TSF9TQVRVUkRBWSIpKSU+Iik7Ci0gIHZhciBtb250aHMgPSBuZXcgQXJyYXkoIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSkFOVUFSWSIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GRUJSVUFSWSIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NQVJDSCIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BUFJJTCIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NQVkiKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSlVORSIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9KVUxZIikpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FVR1VTVCIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVBURU1CRVIiKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfT0NUT0JFUiIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OT1ZFTUJFUiIpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERUNFTUJFUiIpKSU+Iik7Ci0gIHZhciBlbmdNb250aHMgPSBuZXcgQXJyYXkoIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIik7Ci0gIHZhciBjdXJyZW50RGF0ZTsKLSAgdmFyIGNhbGVuZGFyQm9keVNldCA9IGZhbHNlOwotICB2YXIgY2FsZW5kYXJCb2R5OwotICB2YXIgc2F2ZWRZZWFyVGV4dFZhbHVlID0gIiI7Ci0KLTwlCi0gICAvLyBSZWd1bGFyIGV4cHJlc3Npb25zCi0gICAvLyB0aW1lICAgICAgIC0gSEg6TU06U1NbLlNTU10KLSAgIC8vIHllYXIgICAgICAgLSBZKgotICAgLy8gZGF0ZSAgICAgICAtIFlZWVkrLU1NLURECi0gICAvLyBkYXRlVGltZSAgIC0gWVlZWSstTU0tRERUSEg6TU06U1NbLlNTU11aCi0gICAvLyBnWWVhck1vbnRoIC0gWVlZWSstTU0gCi0gICAvLyBnRGF5ICAgICAgIC0gLS0tREQKLSAgIC8vIGdNb250aERheSAgLSAtLU1NLURECi0lPgotICB2YXIgdGltZVJlZ0V4cCA9IC9eKFxkezJ9KTooXGR7Mn0pOihcZHsyfSkoXC5cZHszfSk/JC87Ci0gIHZhciB5ZWFyUmVnRXhwID0gL14oXGQqKSQvOwotICB2YXIgZGF0ZVJlZ0V4cCA9IC9eKFxkezQsfSktKFxkezJ9KS0oXGR7Mn0pJC87Ci0gIHZhciBkYXRlVGltZVJlZ0V4cCA9IC9eKFxkezQsfSktKFxkezJ9KS0oXGR7Mn0pVChcZHsyfSk6KFxkezJ9KTooXGR7Mn0pKFwuXGR7M30pP1okLzsKLSAgdmFyIGdZZWFyTW9udGhSZWdFeHAgPSAvXihcZHs0LH0pLShcZHsyfSkkLzsKLSAgdmFyIGdEYXlSZWdFeHAgPSAvXi17M30oXGR7Mn0pJC87Ci0gIHZhciBnTW9udGhEYXlSZWdFeHAgPSAvXi17Mn0oXGR7Mn0pLShcZHsyfSkkLzsKLQotICBmdW5jdGlvbiB2YWxpZGF0ZVllYXJTdHJpbmcoeWVhclN0cmluZykKLSAgewotICAgIHJldHVybiB5ZWFyUmVnRXhwLnRlc3QoeWVhclN0cmluZyk7Ci0gIH0KLQotICBmdW5jdGlvbiBnZXRUaW1lUGFyYW1ldGVycyh0aW1lU3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIHRpbWVSZWdFeHAuZXhlYyh0aW1lU3RyaW5nKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldERhdGVQYXJhbWV0ZXJzKGRhdGVTdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gZGF0ZVJlZ0V4cC5leGVjKGRhdGVTdHJpbmcpOwotICB9Ci0KLSAgZnVuY3Rpb24gZ2V0RGF0ZVRpbWVQYXJhbWV0ZXJzKGRhdGVUaW1lU3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIGRhdGVUaW1lUmVnRXhwLmV4ZWMoZGF0ZVRpbWVTdHJpbmcpOwotICB9Ci0gIAotICBmdW5jdGlvbiBnZXRHWWVhck1vbnRoUGFyYW1ldGVycyhnWWVhck1vbnRoU3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIGdZZWFyTW9udGhSZWdFeHAuZXhlYyhnWWVhck1vbnRoU3RyaW5nKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gZ2V0R0RheVBhcmFtZXRlcnMoZ0RheVN0cmluZykKLSAgewotICAgIHJldHVybiBnRGF5UmVnRXhwLmV4ZWMoZ0RheVN0cmluZyk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGdldEdNb250aERheVBhcmFtZXRlcnMoZ01vbnRoRGF5U3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIGdNb250aERheVJlZ0V4cC5leGVjKGdNb250aERheVN0cmluZyk7Ci0gIH0KLSAgCi08JQotICAgLy8gSEg6TU06U1NbLlNTU10KLSU+Ci0gIGZ1bmN0aW9uIHNlcmlhbGl6ZVRpbWUoaG91cnMsbWludXRlcyxzZWNvbmRzLG1pbGxpc2Vjb25kcykKLSAgewotICAgIHZhciB0aW1lU3RyaW5nID0gIiI7Ci0gICAgaWYgKGhvdXJzIDwgMTApCi0gICAgICB0aW1lU3RyaW5nICs9ICIwIjsKLSAgICB0aW1lU3RyaW5nICs9IGhvdXJzICsgIjoiOwotICAgIGlmIChtaW51dGVzIDwgMTApCi0gICAgICB0aW1lU3RyaW5nICs9ICIwIjsKLSAgICB0aW1lU3RyaW5nICs9IG1pbnV0ZXMgKyAiOiI7Ci0gICAgaWYgKHNlY29uZHMgPCAxMCkKLSAgICAgIHRpbWVTdHJpbmcgKz0gIjAiOwotICAgIHRpbWVTdHJpbmcgKz0gc2Vjb25kczsKLSAgICBpZiAobWlsbGlzZWNvbmRzID4gMCkKLSAgICB7Ci0gICAgICB0aW1lU3RyaW5nICs9ICIuIjsKLSAgICAgIGlmIChtaWxsaXNlY29uZHMgPCAxMDApCi0gICAgICB7Ci0gICAgICAgIGlmIChtaWxsaXNlY29uZHMgPCAxMCkKLSAgICAgICAgICB0aW1lU3RyaW5nICs9ICIwMCI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0aW1lU3RyaW5nICs9ICIwIjsKLSAgICAgIH0KLSAgICAgIHRpbWVTdHJpbmcgKz0gbWlsbGlzZWNvbmRzOwotICAgIH0KLSAgICByZXR1cm4gdGltZVN0cmluZzsKLSAgfQotCi08JQotICAgLy8gWVlZWSstTU0KLSU+ICAgCi0gIGZ1bmN0aW9uIHNlcmlhbGl6ZUdZZWFyTW9udGgoZnVsbFllYXIsbW9udGgpCi0gIHsKLSAgICB2YXIgZ1llYXJNb250aFN0cmluZyA9ICIiOwotICAgIGlmIChmdWxsWWVhciA8IDEwMDApCi0gICAgewotICAgICAgaWYgKGZ1bGxZZWFyIDwgMTAwKQotICAgICAgewotICAgICAgICBpZiAoZnVsbFllYXIgPCAxMCkKLSAgICAgICAgICBnWWVhck1vbnRoU3RyaW5nICs9ICIwMDAiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZ1llYXJNb250aFN0cmluZyArPSAiMDAiOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBnWWVhck1vbnRoU3RyaW5nICs9ICIwIjsKLSAgICB9Ci0gICAgZ1llYXJNb250aFN0cmluZyArPSBmdWxsWWVhcisiLSI7Ci0gICAgaWYgKG1vbnRoIDwgMTApCi0gICAgICBnWWVhck1vbnRoU3RyaW5nICs9ICIwIjsKLSAgICBnWWVhck1vbnRoU3RyaW5nICs9IG1vbnRoOwotICAgIHJldHVybiBnWWVhck1vbnRoU3RyaW5nOyAgICAKLSAgfQotICAKLTwlCi0gICAvLyBZWVlZKy1NTS1ERAotJT4KLSAgZnVuY3Rpb24gc2VyaWFsaXplRGF0ZShmdWxsWWVhcixtb250aCxkYXRlKQotICB7Ci0gICAgdmFyIGRhdGVTdHJpbmcgPSBzZXJpYWxpemVHWWVhck1vbnRoKGZ1bGxZZWFyLG1vbnRoKSArICItIjsKLSAgICBpZiAoZGF0ZSA8IDEwKQotICAgICAgZGF0ZVN0cmluZyArPSAiMCI7Ci0gICAgZGF0ZVN0cmluZyArPSBkYXRlOwotICAgIHJldHVybiBkYXRlU3RyaW5nOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXJpYWxpemVHRGF5KGRhdGUpCi0gIHsKLSAgICB2YXIgZ0RheVN0cmluZyA9ICItLS0iOwotICAgIGlmIChkYXRlIDwgMTApCi0gICAgICBnRGF5U3RyaW5nICs9ICIwIjsKLSAgICBnRGF5U3RyaW5nICs9IGRhdGU7Ci0gICAgcmV0dXJuIGdEYXlTdHJpbmc7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNlcmlhbGl6ZUdNb250aERheShtb250aCxkYXRlKQotICB7Ci0gICAgdmFyIGdNb250aERheVN0cmluZyA9ICItLSI7Ci0gICAgaWYgKG1vbnRoIDwgMTApCi0gICAgICBnTW9udGhEYXlTdHJpbmcgKz0gIjAiOwotICAgIGdNb250aERheVN0cmluZyArPSBtb250aCsiLSI7Ci0gICAgaWYgKGRhdGUgPCAxMCkKLSAgICAgIGdNb250aERheVN0cmluZyArPSAiMCI7Ci0gICAgZ01vbnRoRGF5U3RyaW5nICs9IGRhdGU7Ci0gICAgcmV0dXJuIGdNb250aERheVN0cmluZzsKLSAgfSAgICAKLQotICBmdW5jdGlvbiBzZXREYXRlVXNpbmdHRGF5UGFyYW1ldGVycyhnRGF5UGFyYW1ldGVycyxkYXRlT2JqKQotICB7Ci0gICAgaWYgKGdEYXlQYXJhbWV0ZXJzICE9IG51bGwpCi0gICAgICBkYXRlT2JqLnNldERhdGUoZ0RheVBhcmFtZXRlcnNbMV0pOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXREYXRlVXNpbmdHTW9udGhEYXlQYXJhbWV0ZXJzKGdNb250aERheVBhcmFtZXRlcnMsZGF0ZU9iaikKLSAgewotICAgIGlmIChnTW9udGhEYXlQYXJhbWV0ZXJzICE9IG51bGwpCi0gICAgewotICAgICAgZGF0ZU9iai5zZXRNb250aChnTW9udGhEYXlQYXJhbWV0ZXJzWzFdLTEpOwotICAgICAgZGF0ZU9iai5zZXREYXRlKGdNb250aERheVBhcmFtZXRlcnNbMl0pOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gc2V0RGF0ZVVzaW5nR1llYXJNb250aFBhcmFtZXRlcnMoZ1llYXJNb250aFBhcmFtZXRlcnMsZGF0ZU9iaikKLSAgewotICAgIGlmIChnWWVhck1vbnRoUGFyYW1ldGVycyAhPSBudWxsKQotICAgIHsKLSAgICAgIGRhdGVPYmouc2V0RnVsbFllYXIoZ1llYXJNb250aFBhcmFtZXRlcnNbMV0pOwotICAgICAgZGF0ZU9iai5zZXRNb250aChnWWVhck1vbnRoUGFyYW1ldGVyc1syXS0xKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNldERhdGVVc2luZ0RhdGVQYXJhbWV0ZXJzKGRhdGVQYXJhbWV0ZXJzLGRhdGVPYmopCi0gIHsKLSAgICBpZiAoZGF0ZVBhcmFtZXRlcnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXREYXRlVXNpbmdHWWVhck1vbnRoUGFyYW1ldGVycyhkYXRlUGFyYW1ldGVycyxkYXRlT2JqKTsKLSAgICAgIGRhdGVPYmouc2V0RGF0ZShkYXRlUGFyYW1ldGVyc1szXSk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGF0ZVVzaW5nRGF0ZVRpbWVQYXJhbWV0ZXJzKGRhdGVUaW1lUGFyYW1ldGVycyxkYXRlT2JqKQotICB7Ci0gICAgaWYgKGRhdGVUaW1lUGFyYW1ldGVycyAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldERhdGVVc2luZ0RhdGVQYXJhbWV0ZXJzKGRhdGVUaW1lUGFyYW1ldGVycyxkYXRlT2JqKTsKLSAgICAgIGRhdGVPYmouc2V0VVRDSG91cnMoZGF0ZVRpbWVQYXJhbWV0ZXJzWzRdKTsKLSAgICAgIGRhdGVPYmouc2V0VVRDTWludXRlcyhkYXRlVGltZVBhcmFtZXRlcnNbNV0pOwotICAgICAgZGF0ZU9iai5zZXRVVENTZWNvbmRzKGRhdGVUaW1lUGFyYW1ldGVyc1s2XSk7Ci0gICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZGF0ZVRpbWVQYXJhbWV0ZXJzWzddOwotICAgICAgaWYgKG1pbGxpc2Vjb25kcy5sZW5ndGggPiAwKQotPCUKLSAgIC8vIEVsaW1pbmF0ZSB0aGUgZGVjaW1hbCBwb2ludAotJT4KLSAgICAgICAgZGF0ZU9iai5zZXRVVENNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzLnN1YnN0cigxKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGRhdGVPYmouc2V0VVRDTWlsbGlzZWNvbmRzKDApOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNldERhdGVVc2luZ1RpbWVQYXJhbWV0ZXJzKHRpbWVQYXJhbWV0ZXJzLGRhdGVPYmopCi0gIHsKLSAgICBpZiAodGltZVBhcmFtZXRlcnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkYXRlT2JqLnNldEhvdXJzKHRpbWVQYXJhbWV0ZXJzWzFdKTsKLSAgICAgIGRhdGVPYmouc2V0TWludXRlcyh0aW1lUGFyYW1ldGVyc1syXSk7Ci0gICAgICBkYXRlT2JqLnNldFNlY29uZHModGltZVBhcmFtZXRlcnNbM10pOwotICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRpbWVQYXJhbWV0ZXJzWzRdOwotICAgICAgaWYgKG1pbGxpc2Vjb25kcy5sZW5ndGggPiAwKQotPCUKLSAgIC8vIEVsaW1pbmF0ZSB0aGUgZGVjaW1hbCBwb2ludAotJT4KLSAgICAgICAgZGF0ZU9iai5zZXRNaWxsaXNlY29uZHMobWlsbGlzZWNvbmRzLnN1YnN0cigxKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGRhdGVPYmouc2V0TWlsbGlzZWNvbmRzKDApOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIGluaXQoKQotICB7Ci0gICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwotPCUKLSAgIHN3aXRjaCAoY2FsZW5kYXJUeXBlKQotICAgewotICAgICBjYXNlIEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0RBVEU6Ci0lPgotICAgIHNldERhdGVVc2luZ0RhdGVQYXJhbWV0ZXJzKGdldERhdGVQYXJhbWV0ZXJzKHRvcC5vcGVuZXIuY2FsZW5kYXJUYXJnZXQudmFsdWUpLGQpOwotPCUKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFVElNRToKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nRGF0ZVRpbWVQYXJhbWV0ZXJzKGdldERhdGVUaW1lUGFyYW1ldGVycyh0b3Aub3BlbmVyLmNhbGVuZGFyVGFyZ2V0LnZhbHVlKSxkKTsKLTwlCi0gICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR1lFQVJNT05USDoKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nR1llYXJNb250aFBhcmFtZXRlcnMoZ2V0R1llYXJNb250aFBhcmFtZXRlcnModG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSksZCk7Ci08JSAgICAgCi0gICAgIGNhc2UgQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR0RBWToKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nR0RheVBhcmFtZXRlcnMoZ2V0R0RheVBhcmFtZXRlcnModG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSksZCk7Ci08JSAgIAotICAgICBjYXNlIEFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dNT05USERBWToKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nR01vbnRoRGF5UGFyYW1ldGVycyhnZXRHTW9udGhEYXlQYXJhbWV0ZXJzKHRvcC5vcGVuZXIuY2FsZW5kYXJUYXJnZXQudmFsdWUpLGQpOwotPCUgICAgICAgCi0gICAgIGRlZmF1bHQ6Ci0gICAgICAgYnJlYWs7Ci0gICB9Ci0lPgotICAgIGdlbmVyYXRlQ2FsZW5kYXIoZCk7Ci0gICAgdmFyIG1vbnRoU2VsZWN0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9udGhTZWxlY3RvciIpOwotICAgIGZvciAodmFyIGk9MDtpPG1vbnRocy5sZW5ndGg7aSsrKQotICAgICAgbW9udGhTZWxlY3Rvci5vcHRpb25zW2ldID0gbmV3IE9wdGlvbihtb250aHNbaV0saSk7Ci0gICAgZ2VuZXJhdGVDYWxlbmRhcihkKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGluaXRDYWxlbmRhckhlYWRlcih0YWJsZSkKLSAgewotICAgIGNhbGVuZGFyQm9keSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRCT0RZIik7Ci0gICAgdmFyIGhlYWRlclJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgZm9yICh2YXIgaT0wO2k8ZGF5cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpOwotICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRheXNbaV0pKTsKLSAgICAgIGhlYWRlci5jbGFzc05hbWU9ImhlYWRlcmNvbG9yIjsKLSAgICAgIGhlYWRlclJvdy5hcHBlbmRDaGlsZChoZWFkZXIpOwotICAgIH0KLSAgICBjYWxlbmRhckJvZHkuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTsKLSAgICB0YWJsZS5hcHBlbmRDaGlsZChjYWxlbmRhckJvZHkpOwotICAgIGNhbGVuZGFyQm9keVNldCA9IHRydWU7Ci0gIH0KLQotICBmdW5jdGlvbiBnZW5lcmF0ZUNhbGVuZGFyKGRhdGUpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsZW5kYXIiKTsKLSAgICB2YXIgZGF0ZURhdGUgPSBkYXRlLmdldERhdGUoKTsKLSAgICB2YXIgZGF0ZU1vbnRoID0gZGF0ZS5nZXRNb250aCgpOwotICAgIHZhciBkYXRlRnVsbFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7Ci0gICAgdmFyIGRhdGVJdGVyYXRvciA9IG5ldyBEYXRlKCk7Ci0gICAgZGF0ZUl0ZXJhdG9yLnNldFRpbWUoRGF0ZS5wYXJzZShlbmdNb250aHNbZGF0ZU1vbnRoXSsiIDEsICIrZGF0ZUZ1bGxZZWFyKSk7Ci0gICAgdmFyIHN0YXJ0aW5nRGF0ZSA9IGRhdGVJdGVyYXRvci5nZXREYXRlKCk7IC8vIDEsMiwzLi4uCi0gICAgdmFyIHN0YXJ0aW5nRGF5ID0gZGF0ZUl0ZXJhdG9yLmdldERheSgpOyAvLyBTdW4sTW9uLFR1ZXMuLi4KLSAgICBjbGVhckNhbGVuZGFyKCk7Ci0gICAgZm9yICh2YXIgcm93cz0wO3Jvd3M8Njtyb3dzKyspCi0gICAgewotICAgICAgdmFyIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgICBmb3IgKHZhciBjb2x1bW5zPTA7Y29sdW1uczxkYXlzLmxlbmd0aDtjb2x1bW5zKyspCi0gICAgICB7Ci0gICAgICAgIHZhciBjb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgICAgICB2YXIgZGF0ZUl0ZXJhdG9yRGF0ZSA9IGRhdGVJdGVyYXRvci5nZXREYXRlKCk7Ci0gICAgICAgIHZhciBkYXRlSXRlcmF0b3JNb250aCA9IGRhdGVJdGVyYXRvci5nZXRNb250aCgpOwotICAgICAgICB2YXIgZGF0ZUl0ZXJhdG9yRnVsbFllYXIgPSBkYXRlSXRlcmF0b3IuZ2V0RnVsbFllYXIoKTsKLSAgICAgICAgY29sdW1uLndpZHRoID0gMjQ7Ci0gICAgICAgIGNvbHVtbi5oZWlnaHQgPSAyNDsKLSAgICAgICAgY29sdW1uLmFsaWduID0gImNlbnRlciI7Ci0gICAgICAgIGNvbHVtbi52YWxpZ24gPSAiY2VudGVyIjsKLSAgICAgICAgY29sdW1uLmNsYXNzTmFtZSA9ICJjYWxlbmRhcnRhYmxlY2VsbHMiOwotICAgICAgICBpZiAoKGRhdGVJdGVyYXRvckRhdGUgPT0gc3RhcnRpbmdEYXRlICYmIGNvbHVtbnMgPCBzdGFydGluZ0RheSkgfHwgKGRhdGVJdGVyYXRvck1vbnRoICE9IGRhdGVNb250aCkpCi0gICAgICAgICAgY29sdW1uLmlubmVySFRNTCA9ICImbmJzcDsiOwotICAgICAgICBlbHNlIGlmIChkYXRlSXRlcmF0b3JNb250aCA9PSBkYXRlTW9udGgpCi0gICAgICAgIHsKLSAgICAgICAgICB2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICAgICAgICBzd2l0Y2ggKDwlPWNhbGVuZGFyVHlwZSU+KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURSU+OgotICAgICAgICAgICAgICBsaW5rLmhyZWYgPSAiamF2YXNjcmlwdDp0cmFuc2ZlckRhdGUoIitkYXRlSXRlcmF0b3JEYXRlKyIpIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0RBVEVUSU1FJT46Ci0gICAgICAgICAgICAgIGxpbmsuaHJlZiA9ICJqYXZhc2NyaXB0OnRyYW5zZmVyRGF0ZVRpbWUoIitkYXRlSXRlcmF0b3JEYXRlKyIpIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dZRUFSTU9OVEglPjoKLSAgICAgICAgICAgICAgbGluay5ocmVmID0gImphdmFzY3JpcHQ6dHJhbnNmZXJHWWVhck1vbnRoKCkiOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR0RBWSU+OgotICAgICAgICAgICAgICBsaW5rLmhyZWYgPSAiamF2YXNjcmlwdDp0cmFuc2ZlckdEYXkoIitkYXRlSXRlcmF0b3JEYXRlKyIpIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dNT05USERBWSU+OgotICAgICAgICAgICAgICBsaW5rLmhyZWYgPSAiamF2YXNjcmlwdDp0cmFuc2ZlckdNb250aERheSgiK2RhdGVJdGVyYXRvckRhdGUrIikiOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkYXRlSXRlcmF0b3JEYXRlKSk7Ci0gICAgICAgICAgY29sdW1uLmFwcGVuZENoaWxkKGxpbmspOwotICAgICAgICAgIGlmIChkYXRlSXRlcmF0b3JEYXRlID09IGRhdGVEYXRlICYmIGRhdGVJdGVyYXRvckZ1bGxZZWFyID09IGRhdGVGdWxsWWVhcikKLSAgICAgICAgICAgIGNvbHVtbi5jbGFzc05hbWUgPSAidG9kYXl0YWJsZWNlbGwiOwotICAgICAgICAgIGRhdGVJdGVyYXRvckRhdGUrKzsKLSAgICAgICAgICBkYXRlSXRlcmF0b3Iuc2V0VGltZShEYXRlLnBhcnNlKGVuZ01vbnRoc1tkYXRlSXRlcmF0b3JNb250aF0rIiAiK2RhdGVJdGVyYXRvckRhdGUrIiwgIitkYXRlSXRlcmF0b3IuZ2V0RnVsbFllYXIoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJvdy5hcHBlbmRDaGlsZChjb2x1bW4pOwotICAgICAgfQotICAgICAgY2FsZW5kYXJCb2R5LmFwcGVuZENoaWxkKHJvdyk7Ci0gICAgfQotICAgIHZhciBtb250aFNlbGVjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vbnRoU2VsZWN0b3IiKTsKLSAgICBmb3IgKHZhciBpPTA7aTxtb250aFNlbGVjdG9yLm9wdGlvbnMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAobW9udGhTZWxlY3Rvci5vcHRpb25zW2ldLnZhbHVlID09IGRhdGVNb250aCkKLSAgICAgIHsKLSAgICAgICAgbW9udGhTZWxlY3Rvci5zZWxlY3RlZEluZGV4ID0gaTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHZhciB5ZWFyVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ5ZWFyVGV4dCIpOwotICAgIHllYXJUZXh0LnZhbHVlID0gZGF0ZUZ1bGxZZWFyOwotICAgIHNhdmVkWWVhclRleHRWYWx1ZSA9IHllYXJUZXh0LnZhbHVlOwotPCUKLSAgIGlmIChjYWxlbmRhclR5cGUgPT0gQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURVRJTUUpCi0gICB7Ci0lPgotICAgIHZhciB0aW1lVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0aW1lVGV4dCIpOwotICAgIHRpbWVUZXh0LnZhbHVlID0gc2VyaWFsaXplVGltZShkYXRlLmdldEhvdXJzKCksZGF0ZS5nZXRNaW51dGVzKCksZGF0ZS5nZXRTZWNvbmRzKCksZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSk7Ci08JQotICAgfQotJT4KLSAgICBjdXJyZW50RGF0ZSA9IGRhdGU7Ci0gIH0KLQotICBmdW5jdGlvbiBjbGVhckNhbGVuZGFyKCkKLSAgewotICAgIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYWxlbmRhciIpOwotICAgIGlmICghY2FsZW5kYXJCb2R5U2V0KQotICAgICAgaW5pdENhbGVuZGFySGVhZGVyKHRhYmxlKTsKLSAgICBmb3IgKHZhciBpPTE7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdGFibGUuZGVsZXRlUm93KGkpOwotICAgICAgaS0tOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHVwZGF0ZUNhbGVuZGFyKG5ld01vbnRoLG5ld0Z1bGxZZWFyKQotICB7Ci0gICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwotICAgIGlmIChuZXdNb250aCA+IG1vbnRocy5sZW5ndGgpCi0gICAgewotICAgICAgbmV3RnVsbFllYXIrKzsKLSAgICAgIG5ld01vbnRoID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAobmV3TW9udGggPCAwKQotICAgIHsKLSAgICAgIG5ld0Z1bGxZZWFyLS07Ci0gICAgICBuZXdNb250aCA9IG1vbnRocy5sZW5ndGgtMTsKLSAgICB9Ci0gICAgZC5zZXRNb250aChuZXdNb250aCk7Ci0gICAgZC5zZXRGdWxsWWVhcihuZXdGdWxsWWVhcik7Ci08JQotICAgaWYgKGNhbGVuZGFyVHlwZSA9PSBBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFVElNRSkKLSAgIHsKLSU+Ci0gICAgc2V0RGF0ZVVzaW5nVGltZVBhcmFtZXRlcnMoZ2V0VGltZVBhcmFtZXRlcnMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRpbWVUZXh0IikudmFsdWUpLGQpOwotPCUKLSAgIH0KLSU+Ci0gICAgZ2VuZXJhdGVDYWxlbmRhcihkKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGp1bXBUb1ByZXZpb3VzWWVhcigpCi0gIHsKLSAgICB1cGRhdGVDYWxlbmRhcihjdXJyZW50RGF0ZS5nZXRNb250aCgpLGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCktMSkKLSAgfQotCi0gIGZ1bmN0aW9uIGp1bXBUb1ByZXZpb3VzTW9udGgoKQotICB7Ci0gICAgdXBkYXRlQ2FsZW5kYXIoY3VycmVudERhdGUuZ2V0TW9udGgoKS0xLGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCkpOwotICB9Ci0KLSAgZnVuY3Rpb24ganVtcFRvTmV4dE1vbnRoKCkKLSAgewotICAgIHVwZGF0ZUNhbGVuZGFyKGN1cnJlbnREYXRlLmdldE1vbnRoKCkrMSxjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGp1bXBUb05leHRZZWFyKCkKLSAgewotICAgIHVwZGF0ZUNhbGVuZGFyKGN1cnJlbnREYXRlLmdldE1vbnRoKCksY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSsxKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGp1bXBUb1RvZGF5KCkKLSAgewotICAgIGdlbmVyYXRlQ2FsZW5kYXIobmV3IERhdGUoKSk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXROZXdEYXRlKCkKLSAgewotICAgIHZhciBtb250aFNlbGVjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vbnRoU2VsZWN0b3IiKTsKLSAgICB2YXIgbmV3TW9udGggPSBtb250aFNlbGVjdG9yLm9wdGlvbnNbbW9udGhTZWxlY3Rvci5zZWxlY3RlZEluZGV4XS52YWx1ZTsKLSAgICB2YXIgbmV3RnVsbFllYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieWVhclRleHQiKS52YWx1ZTsKLTwlCi0gICAvLyBZWVlZKwotJT4KLSAgICB2YXIgZCA9IG5ldyBEYXRlKCk7Ci0gICAgaWYgKHZhbGlkYXRlWWVhclN0cmluZyhuZXdGdWxsWWVhcikpCi0gICAgewotICAgICAgLy8gVGhlIHllYXIgc3RyaW5nIGNvbnRhaW5zIG9ubHkgZGlnaXRzIGFuZCBpcyBoZW5jZSBhIHZhbGlkIHllYXIuCi0gICAgICBkLnNldEZ1bGxZZWFyKG5ld0Z1bGxZZWFyKTsKLSAgICAgIGQuc2V0TW9udGgobmV3TW9udGgpOwotICAgIH0KLSAgICBnZW5lcmF0ZUNhbGVuZGFyKGQpOwotICB9Ci0KLSAgZnVuY3Rpb24gaGFuZGxlWWVhclRleHRLZXlVcEV2ZW50KCkKLSAgewotICAgIHZhciBjdXJyZW50WWVhclRleHRWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ5ZWFyVGV4dCIpLnZhbHVlOwotICAgIGlmIChjdXJyZW50WWVhclRleHRWYWx1ZSA9PSBzYXZlZFllYXJUZXh0VmFsdWUpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgc2V0TmV3RGF0ZSgpOwotICB9Ci0KLTwlCi0gICAvLyBZWVlZKy1NTS1ERAotJT4KLSAgZnVuY3Rpb24gdHJhbnNmZXJEYXRlKGRhdGUpCi0gIHsKLSAgICB2YXIgZnVsbFllYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgieWVhclRleHQiKS52YWx1ZTsKLSAgICB2YXIgbW9udGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9udGhTZWxlY3RvciIpLnNlbGVjdGVkSW5kZXgrMTsKLSAgICB0b3Aub3BlbmVyLmNhbGVuZGFyVGFyZ2V0LnZhbHVlID0gc2VyaWFsaXplRGF0ZShmdWxsWWVhcixtb250aCxkYXRlKTsKLSAgICB0b3Aub3BlbmVyLmNsb3NlQ2FsZW5kYXJCcm93c2VyKCk7Ci0gIH0KLQotPCUKLSAgIC8vIFlZWVkrLU1NLUREVEhIOk1NOlNTWy5TU1NdWgotJT4KLSAgZnVuY3Rpb24gdHJhbnNmZXJEYXRlVGltZShkYXRlKQotICB7Ci0gICAgdmFyIGZ1bGxZZWFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInllYXJUZXh0IikudmFsdWU7Ci0gICAgdmFyIG1vbnRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vbnRoU2VsZWN0b3IiKS5zZWxlY3RlZEluZGV4KzE7Ci0gICAgdmFyIHNlcmlhbGl6ZWREYXRlID0gc2VyaWFsaXplRGF0ZShmdWxsWWVhcixtb250aCxkYXRlKTsKLSAgICB2YXIgZCA9IG5ldyBEYXRlKCk7Ci0gICAgc2V0RGF0ZVVzaW5nRGF0ZVBhcmFtZXRlcnMoZ2V0RGF0ZVBhcmFtZXRlcnMoc2VyaWFsaXplZERhdGUpLGQpOwotICAgIHZhciB0aW1lVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGltZVRleHQiKS52YWx1ZTsKLSAgICB2YXIgdGltZVBhcmFtZXRlcnMgPSBnZXRUaW1lUGFyYW1ldGVycyh0aW1lVmFsdWUpOwotICAgIGlmICh0aW1lUGFyYW1ldGVycyA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmICghY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX0lOVkFMSURfVElNRV9GT1JNQVQiKSklPiIpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHNldERhdGVVc2luZ1RpbWVQYXJhbWV0ZXJzKHRpbWVQYXJhbWV0ZXJzLGQpOwotICAgIHRvcC5vcGVuZXIuY2FsZW5kYXJUYXJnZXQudmFsdWUgPSBzZXJpYWxpemVkRGF0ZSArICJUIiArIHNlcmlhbGl6ZVRpbWUoZC5nZXRVVENIb3VycygpLGQuZ2V0VVRDTWludXRlcygpLGQuZ2V0VVRDU2Vjb25kcygpLGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCkpICsgIloiOwotICAgIHRvcC5vcGVuZXIuY2xvc2VDYWxlbmRhckJyb3dzZXIoKTsKLSAgfQotICAKLTwlCi0gICAvLyBZWVlZKy1NTQotJT4KLSAgZnVuY3Rpb24gdHJhbnNmZXJHWWVhck1vbnRoKCkKLSAgewotICAgIHZhciBmdWxsWWVhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ5ZWFyVGV4dCIpLnZhbHVlOwotICAgIHZhciBtb250aCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtb250aFNlbGVjdG9yIikuc2VsZWN0ZWRJbmRleCsxOwotICAgIHZhciBzZXJpYWxpemVkR1llYXJNb250aCA9IHNlcmlhbGl6ZUdZZWFyTW9udGgoZnVsbFllYXIsbW9udGgpOwotICAgIHZhciBkID0gbmV3IERhdGUoKTsKLSAgICBzZXREYXRlVXNpbmdHWWVhck1vbnRoUGFyYW1ldGVycyhnZXRHWWVhck1vbnRoUGFyYW1ldGVycyhzZXJpYWxpemVkR1llYXJNb250aCksZCk7Ci0gICAgdG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSA9IHNlcmlhbGl6ZWRHWWVhck1vbnRoOwotICAgIHRvcC5vcGVuZXIuY2xvc2VDYWxlbmRhckJyb3dzZXIoKTsKLSAgfSAgICAgCi0gIAotPCUKLSAgIC8vIC0tLURECi0lPgotICBmdW5jdGlvbiB0cmFuc2ZlckdEYXkoZGF0ZSkgICAgIAotICB7Ci0gICAgdG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSA9IHNlcmlhbGl6ZUdEYXkoZGF0ZSk7Ci0gICAgdG9wLm9wZW5lci5jbG9zZUNhbGVuZGFyQnJvd3NlcigpOwotICB9Ci08JQotICAgLy8gLS1NTS1ERAotJT4gIAotICBmdW5jdGlvbiB0cmFuc2ZlckdNb250aERheShkYXRlKQotICB7Ci0gICAgdmFyIG1vbnRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vbnRoU2VsZWN0b3IiKS5zZWxlY3RlZEluZGV4KzE7Ci0gICAgdG9wLm9wZW5lci5jYWxlbmRhclRhcmdldC52YWx1ZSA9IHNlcmlhbGl6ZUdNb250aERheShtb250aCxkYXRlKTsKLSAgICB0b3Aub3BlbmVyLmNsb3NlQ2FsZW5kYXJCcm93c2VyKCk7Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPHRhYmxlIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIDx0YWJsZT4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ibW9udGhTZWxlY3RvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01PTlRIIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJ5ZWFyVGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1lFQVIiKSU+PC9sYWJlbD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJjZW50ZXIiPgotICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9Im1vbnRoU2VsZWN0b3IiIG9uQ2hhbmdlPSJzZXROZXdEYXRlKCkiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJjZW50ZXIiPgotICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ieWVhclRleHQiIHNpemU9NiBvbmtleXVwPSJoYW5kbGVZZWFyVGV4dEtleVVwRXZlbnQoKSIgY2xhc3M9InRhYmxldGV4dGVudGVyIj4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgPHRhYmxlIGlkPSJjYWxlbmRhciIgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0zIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci08JQotICAgaWYgKGNhbGVuZGFyVHlwZSA9PSBBY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9EQVRFVElNRSkKLSAgIHsKLSU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgPHRhYmxlIGJvcmRlcj0wPgotICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iY2VudGVyIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0idGltZVRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9USU1FIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iY2VudGVyIiB3aWR0aD0iODAlIj4KLSAgICAgICAgICAgICAgPGlucHV0IGlkPSJ0aW1lVGV4dCIgdHlwZT0idGV4dCIgY2xhc3M9InRhYmxldGV4dGVudGVyIiBzaXplPTEyIG1heGxlbmd0aD0xMj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgd2lkdGg9IjEwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLTwlCi0gICB9Ci0lPgotICAgICAgPHRyPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIDx0YWJsZSBib3JkZXI9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6anVtcFRvUHJldmlvdXNZZWFyKCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9QUkVWSU9VU19ZRUFSIiklPiI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUFJFVklPVVNfWUVBUiIpJT48L2E+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Omp1bXBUb1ByZXZpb3VzTW9udGgoKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1BSRVZJT1VTX01PTlRIIiklPiI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUFJFVklPVVNfTU9OVEgiKSU+PC9hPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpqdW1wVG9Ub2RheSgpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVE9EQVkiKSU+Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19UT0RBWSIpJT48L2E+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Omp1bXBUb05leHRNb250aCgpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTkVYVF9NT05USCIpJT4iPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX05FWFRfTU9OVEgiKSU+PC9hPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpqdW1wVG9OZXh0WWVhcigpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTkVYVF9ZRUFSIiklPiI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfTkVYVF9ZRUFSIiklPjwvYT4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaW5pdCgpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jYWxlbmRhcl90b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlNzlmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2NhbGVuZGFyX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQ0FMRU5EQVJfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IG9uVW5sb2FkPSJ0b3Aub3BlbmVyLmNhbGVuZGFyQnJvd3NlckNsb3NlZD10cnVlIiBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NhbGVuZGFyLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0NBTEVOREFSX0JST1dTRVIiKSU+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0b3Aub3BlbmVyLmNhbGVuZGFyQnJvd3NlckNsb3NlZCA9IGZhbHNlOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy9jYWxlbmRhci5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy9jYWxlbmRhci5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzc3YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvY2FsZW5kYXIuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0uY2FsZW5kYXJ0YWJsZWNlbGxzIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1yaWdodDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXRvcDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0I4QjRBMzsgZm9udC1mYW1pbHk6IFRhaG9tYSwgVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYTsgZm9udC1zaXplOiAxMXB4OyB0ZXh0LWFsaWduOmNlbnRlcn0KLS50b2RheXRhYmxlY2VsbCB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyBib3JkZXItbGVmdDoxcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXJpZ2h0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItdG9wOjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjQjhCNEEzOyBmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDExcHg7IHRleHQtYWxpZ246Y2VudGVyfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvY3NzL3Rvb2xiYXIuY3NzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvdG9vbGJhci5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NWI4YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvdG9vbGJhci5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jdG9vbGJhciB7IHdpZHRoOjEwMCU7IGhlaWdodDoyNXB4OyBiYWNrZ3JvdW5kOiNFQ0U5RDg7IGJvcmRlci1jb2xvcjp3aGl0ZTsgIGJvcmRlci1zdHlsZTpzb2xpZDsgIGJvcmRlci13aWR0aDoxIDEgMSAxcHg7IGJvcmRlci1ib3R0b20tY29sb3I6Izg0ODI4NDsgYm9yZGVyLXJpZ2h0LWNvbG9yOiM4NDgyODQ7IG1hcmdpbjowIDAgMCAwcHg7fQotI3Rvb2xiYXJib3JkZXIgeyBoZWlnaHQ6MjZweDsgd2lkdGg6MTAwJTsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGg6MSAwIDAgMXB4OyBib3JkZXItY29sb3I6Izg0ODI4NDsgfQotCi0vKiBpZnJhbWUgU3BhY2luZyBDb250b2wgKi8KLS50b29sYmFyYm9keW1hcmdpbiB7IG1hcmdpbjogNSA1IDAgNTsgYmFja2dyb3VuZDogI0VDRTlEODsgfQotCi0vKiBUb29sYmFyIFN0eWxlcyAqLwotLnRleHQge2ZvbnQtc2l6ZToxMnB4OyBmb250LWZhbWlseTogVGFob21hO30KLWE6bGluayB7Y29sb3I6IGJsYWNrO30KLQotLyogSlMgUm9sbG92ZXIgU3R5bGUgKi8KLUlNRyB7IGJvcmRlci13aWR0aDoycHg7IGJvcmRlci1zdHlsZTpzb2xpZDt9Ci0ubm9ybWFsIHsgYm9yZGVyLWNvbG9yIDogI0VDRTlEODsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOjFweDsgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsgYm9yZGVyLWJvdHRvbS1jb2xvciA6I0VDRTlEODsgYm9yZGVyLXJpZ2h0LWNvbG9yIDojRUNFOUQ4O30KLS5ob3ZlciB7IGJvcmRlci1jb2xvciA6IHdoaXRlOyBib3JkZXItc3R5bGU6IHNvbGlkOyBib3JkZXItd2lkdGg6MXB4OyBib3JkZXItbGVmdC13aWR0aDogMXB4OyBib3JkZXItYm90dG9tLWNvbG9yIDojOEM4RThDOyBib3JkZXItcmlnaHQtY29sb3IgOiM4QzhFOEM7IH0KLS5kb3duIHsgYm9yZGVyLWNvbG9yIDogIzhDOEU4QzsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOjFweDsgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsgYm9yZGVyLWJvdHRvbS1jb2xvcjp3aGl0ZTsgYm9yZGVyLXJpZ2h0LWNvbG9yOndoaXRlO30KLQotLyogR2xvYmFsVG9vbGJhciAqLwotLmd0b29sYmFyYm9keW1hcmdpbiB7bWFyZ2luIDogMCAxIDMgMDsgYmFja2dyb3VuZDogI0VDRTlEOH0KLSNnbG9iYWx0b29sYmFye2hlaWdodDoxMDAlOyBiYWNrZ3JvdW5kOiAjRUNFOUQ4OyBib3JkZXItY29sb3IgOiB3aGl0ZTsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLXdpZHRoOjFweDsgYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsgYm9yZGVyLWJvdHRvbS1jb2xvciA6YmxhY2s7IGJvcmRlci1yaWdodC13aWR0aDogMXB4OyBib3JkZXItcmlnaHQtY29sb3IgOiM4NDgyODQ7fQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy90cmVldmlldy5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy90cmVldmlldy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NjE1ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3MvdHJlZXZpZXcuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1hIHt0ZXh0LWRlY29yYXRpb246IG5vbmU7fQotYTpob3ZlciB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7fQotdGQge2ZvbnQtZmFtaWx5OiBUYWhvbWE7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6IEJsYWNrO30KLS51bnNlbGVjdGVkVGV4dEFuY2hvciB7Y29sb3I6Ymx1ZTsgYmFja2dyb3VuZC1jb2xvcjpkb2N1bWVudC5iYWNrZ3JvdW5kQ29sb3J9Ci0uc2VsZWN0ZWRUZXh0QW5jaG9yIHtjb2xvcjp3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjpuYXZ5fQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9jc3Mvd2luZG93cy5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy93aW5kb3dzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiZTIzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Nzcy93aW5kb3dzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSNjb250ZW50Ym9yZGVyIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICM4NDgyODQ7IGJvcmRlci1yaWdodDoxcHggc29saWQgIzg0ODI4NDsgYm9yZGVyLXRvcDowcHggc29saWQgIzg0ODI4NDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzg0ODI4NDsgaGVpZ2h0OjEwMCU7IHdpZHRoOjEwMCU7IGJhY2tncm91bmQ6d2hpdGU7IG92ZXJmbG93OmF1dG87IHBhZGRpbmctbGVmdDoxMHB4OyBwYWRkaW5nLXJpZ2h0OjA7IHBhZGRpbmctdG9wOjEwOyBwYWRkaW5nLWJvdHRvbToxMH0KLSN0cmVlY29udGVudGJvcmRlciB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjODQ4Mjg0OyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICM4NDgyODQ7IGJvcmRlci10b3A6MHB4IHNvbGlkICM4NDgyODQ7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICM4NDgyODQ7IGhlaWdodDoxMDAlOyB3aWR0aDoxMDAlOyBiYWNrZ3JvdW5kOndoaXRlOyBvdmVyZmxvdzphdXRvOyBwYWRkaW5nLXRvcDo1cHh9Ci0KLS8qIGlmcmFtZSBTcGFjaW5nIENvbnRvbCAqLwotLmNvbnRlbnRib2R5bWFyZ2luIHsgbWFyZ2luOiAwIDUgMTIgNTsgYmFja2dyb3VuZDojRUNFOUQ4OyB9Ci0KLS8qIERvY3VtZW50IFN0eWxlcyAgKi8KLS5sYWJlbHMgeyBmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDEycHg7IGNvbG9yOmJsYWNrOyBmb250LXdlaWdodDogbm9ybWFsO30KLQotLyogZmllbGRzZXQrbGVnZW5kIFN0eWxlcyAqLwotLmtleWxpbmVmaWVsZHNldCB7IGJvcmRlci1jb2xvcjojODA4MEZGOyBib3JkZXItd2lkdGg6MXB4OyBib3JkZXItc3R5bGU6c29saWQ7IH0KLQotLyogdGFibGUgU3R5bGVzICovCi0udGFibGVib3JkZXIge2JvcmRlci1sZWZ0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MHB4IHNvbGlkICNCOEI0QTM7IH0KLS50YWJsZWNlbGxzIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1yaWdodDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXRvcDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0I4QjRBMzsgZm9udC1mYW1pbHk6IFRhaG9tYSwgVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYTsgZm9udC1zaXplOiAxMXB4OyB0ZXh0LWFsaWduOmxlZnR9Ci0uY2hlY2tib3hjZWxscyB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNCOEI0QTM7IGZvbnQtZmFtaWx5OiBUYWhvbWEsIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7IGZvbnQtc2l6ZTogMTFweDsgYmFja2dyb3VuZC1jb2xvcjogI0VDRTlEOH0KLXRoLmhlYWRlcmNvbG9yIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1yaWdodDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXRvcDowcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0I4QjRBMzsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDExcHg7IGJhY2tncm91bmQtY29sb3I6IzQ5NzdCNDsgY29sb3I6I0ZGRkZGRjsgdGV4dC1hbGlnbjpjZW50ZXJ9Ci10aC5zaW5nbGVoZWFkZXJjb2xvciB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MHB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNCOEI0QTM7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC1mYW1pbHk6IFRhaG9tYSwgVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYTsgZm9udC1zaXplOiAxMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiM0OTc3QjQ7IGNvbG9yOiNGRkZGRkY7IHRleHQtYWxpZ246bGVmdH0KLS5maXJzdGNvbHVtbmVycmFudHJvd2NvbG9yIHsgYm9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJlZDsgYm9yZGVyLXJpZ2h0OjBweCBzb2xpZCAjQjdCNEEzOyBib3JkZXItdG9wOjFweCBzb2xpZCByZWQ7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkIHJlZDsgZm9udC1mYW1pbHk6IFRhaG9tYSwgVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYTsgZm9udC1zaXplOiAxMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiNFNkVBRDg7IHRleHQtYWxpZ246bGVmdH0KLS5taWRkbGVlcnJhbnRyb3djb2xvciB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjdCNEEzOyBib3JkZXItcmlnaHQ6MHB4IHNvbGlkICNCN0I0QTM7IGJvcmRlci10b3A6MXB4IHNvbGlkIHJlZDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgcmVkOyBmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDExcHg7IGJhY2tncm91bmQtY29sb3I6I0U2RUFEODsgdGV4dC1hbGlnbjpsZWZ0fQotLmxhc3Rjb2x1bW5lcnJhbnRyb3djb2xvciB7IGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjQjdCNEEzOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJlZDsgYm9yZGVyLXRvcDoxcHggc29saWQgcmVkOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCByZWQ7IGZvbnQtZmFtaWx5OiBUYWhvbWEsIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7IGZvbnQtc2l6ZTogMTFweDsgYmFja2dyb3VuZC1jb2xvcjojRTZFQUQ4OyB0ZXh0LWFsaWduOmxlZnR9Ci0ucm93Y29sb3IgeyBib3JkZXItbGVmdDoxcHggc29saWQgI0I4QjRBMzsgYm9yZGVyLXJpZ2h0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItdG9wOjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjQjhCNEEzOyBmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDExcHg7IGJhY2tncm91bmQtY29sb3I6I0U2RUFEODsgdGV4dC1hbGlnbjpsZWZ0fQotCi0vKiBGb3JtIGVsZW1lbnRzIGFuZCBzdGF0dXMgY29udGVudHMgKi8KLXRkIHsgZm9udC1mYW1pbHk6IFRhaG9tYSwgVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYTsgZm9udC1zaXplOiAxMnB4OyB9Ci10aCB7IGZvbnQtZmFtaWx5OiBUYWhvbWEsIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7IGZvbnQtc2l6ZTogMTJweDsgfQotaW5wdXQgeyBmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDEycHg7IH0KLS5zZWxlY3RsaXN0IHtmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDEycHg7IGNvbG9yOiBCbGFjazsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGggOiAxcHg7ICBib3JkZXItY29sb3I6I0M3QzVCMjt9Ci1zZWxlY3QgeyBmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDEycHg7IH0KLXByZSB7IGZvbnQtZmFtaWx5OiBUYWhvbWEsIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7IGZvbnQtc2l6ZTogMTJweDsgfQotLnNtdGV4dGVudGVyIHtmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiBCbGFjazsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGggOiAxcHg7IGJvcmRlci1jb2xvcjogI0M3QzVCMjsgd2lkdGg6MTAlOyB9Ci0udGV4dGVudGVyIHtmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiBCbGFjazsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGggOiAxcHg7IGJvcmRlci1jb2xvcjogI0M3QzVCMjsgd2lkdGg6OTAlOyB9Ci0udGFibGV0ZXh0ZW50ZXIge2ZvbnQtZmFtaWx5OiBUYWhvbWEsIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6IEJsYWNrOyBib3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci13aWR0aCA6IDFweDsgYm9yZGVyLWNvbG9yOiAjQzdDNUIyOyB3aWR0aDoxMDAlOyB9Ci0udGFibGVmaWxlYnJvd3NlIHt3aWR0aDoxMDAlOyBib3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci13aWR0aDoxcHg7IGZvbnQtc2l6ZTogMTRweDsgYm9yZGVyLWNvbG9yOiAjQzdDNUIyOyBmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyB9Ci1pbnB1dC5idXR0b24ge2ZvbnQtZmFtaWx5OiBUYWhvbWEsIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7IGZvbnQtc2l6ZTogMTFweDsgYm9yZGVyLXdpZHRoIDogMXB4OyBib3JkZXItc3R5bGU6b3V0c2V0OyBoZWlnaHQ6MjJweDt9Ci1pbnB1dC5yYWRpbyB7Zm9udC1mYW1pbHk6IFRhaG9tYSwgVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYTsgZm9udC1zaXplOiAxMXB4O30KLWltZy50d2lzdCB7Ym9yZGVyLXdpZHRoOjAgMCAwIDBweDsgaGVpZ2h0OjEwcHg7IHdpZHRoOjExcHg7fQotCi0vKiBGcmFnbWVudCBTdHlsZXMgKi8KLS5maXhmcmFndGFibGUge3dpZHRoOjk1JTsgYm9yZGVyOjBweCBub25lOyB9Ci0uaW5uZXJmaXhmcmFndGFibGUge3dpZHRoOjEwMCU7IGJvcmRlcjowcHggbm9uZTsgfQotLnJhbmdlZnJhZ3RhYmxlIHt3aWR0aDo5NSU7IGJvcmRlci1sZWZ0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MHB4IHNvbGlkICNCOEI0QTM7fQotLmlubmVycmFuZ2VmcmFndGFibGUge3dpZHRoOjEwMCU7IGJvcmRlci1sZWZ0OjBweCBzb2xpZCAjQjhCNEEzOyBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci10b3A6MXB4IHNvbGlkICNCOEI0QTM7IGJvcmRlci1ib3R0b206MHB4IHNvbGlkICNCOEI0QTM7fQotLnRleHRhcmVhZW50ZXIge2ZvbnQtZmFtaWx5OiBUYWhvbWEsIFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2E7IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6IEJsYWNrOyBib3JkZXItc3R5bGU6c29saWQ7IGJvcmRlci13aWR0aCA6IDFweDsgYm9yZGVyLWNvbG9yOiAjQzdDNUIyOyB3aWR0aDoxMDAlOyBoZWlnaHQ6MTUwcHg7IH0KLS5iaWd0ZXh0YXJlYWVudGVyIHtmb250LWZhbWlseTogVGFob21hLCBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhOyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiBCbGFjazsgYm9yZGVyLXN0eWxlOnNvbGlkOyBib3JkZXItd2lkdGggOiAxcHg7IGJvcmRlci1jb2xvcjogI0M3QzVCMjsgd2lkdGg6MTAwJTsgaGVpZ2h0OjMwMHB4OyB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0FkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjQ0YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9BZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICBBZGRXU0lMVG9XU0lMUGVyc3BlY3RpdmVBY3Rpb24gYWN0aW9uID0gbmV3IEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICBpZiAoYWN0aW9uUmVzdWx0KSB7Ci0lPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTSUwsZmFsc2UpKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci0gIGVsc2UgewotICAgIGlmIChyZXF1ZXN0LmdldFBhcmFtZXRlcihGYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04pID09IG51bGwpIHsKLSU+Ci0gICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0NvbmZpcm1KU1AuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgICB9Ci0gICAgZWxzZSB7Ci0lPgotICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIGZhdlByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICAgICAgZmF2U3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgPC9zY3JpcHQ+Ci08JQotICAgIH0KLSAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTRlZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24iJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24gYWN0aW9uID0gQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24ubmV3QWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0gIGlmIChhY3Rpb25SZXN1bHQpIHsKLSAgICBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKS5tYWtlU2VsZWN0ZWROb2RlVmlzaWJsZSgpOwotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNob3dQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9VRERJLGZhbHNlKSkpJT4iOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotICBlbHNlIHsKLSAgICBpZiAocmVxdWVzdC5nZXRQYXJhbWV0ZXIoRmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OKSA9PSBudWxsKSB7Ci0lPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNDb25maXJtSlNQLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICAgfQotICAgIGVsc2UgewotJT4KLSAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICBmYXZQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgIGZhdlN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIDwvc2NyaXB0PgotPCUKLSAgICB9Ci0gIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTU2YThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLkZhdm9yaXRlc0FjdGlvbklucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5BY3Rpb25JbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLlNob3dQZXJzcGVjdGl2ZUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLUZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uIGFjdGlvbiA9IG5ldyBGYXZvcml0ZXNBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1ib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLWlmIChhY3Rpb25SZXN1bHQpIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwsZmFsc2UpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi19Ci1lbHNlIHsKLSAgaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTikgPT0gbnVsbCkgewotJT4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0NvbmZpcm1KU1AuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgfQotICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBmYXZQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICBmYXZTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci19Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTk5NDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIEZhdm9yaXRlc0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbiBhY3Rpb24gPSBuZXcgRmF2b3JpdGVzSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTkzNWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc0ltcG9ydFRvV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBGYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwMzNiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL0Zhdm9yaXRlc0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIGFjdGlvbiA9IG5ldyBGYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOGQxNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNUb2dnbGVOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgRmF2b3JpdGVzVG9nZ2xlTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi0gICBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1RvZ2dsZU5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmExYjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVtb3ZlRmF2b3JpdGVzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuUmVtb3ZlRmF2b3JpdGVzQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgICBSZW1vdmVGYXZvcml0ZXNBY3Rpb24gYWN0aW9uID0gbmV3IFJlbW92ZUZhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0NvbmZpcm1KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9SZW1vdmVGYXZvcml0ZXNDb25maXJtSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3YjFhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1JlbW92ZUZhdm9yaXRlc0NvbmZpcm1KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy5SZW1vdmVGYXZvcml0ZXNBY3Rpb24iJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIGlmIChjb25maXJtKCI8JT1jb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX0NPTkZJUk1fUkVNT1ZFX05PREUiLCBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXROb2RlTmFtZSgpKSU+IikpIHsKLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICAgICAgJT4KLSAgICAgICAgICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxULCBBY3Rpb25JbnB1dHMuVklFV1RPT0xJRF9ERUZBVUxUKSkpJT4iOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmF2UHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICAgICAgZmF2U3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICB9Ci0gICAgPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc2l6ZUZhdm9yaXRlc0ZyYW1lc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMDYyYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9SZXNpemVGYXZvcml0ZXNGcmFtZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIENyZWF0ZSB0aGUgYWN0aW9uLgotICAgUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uIGFjdGlvbiA9IG5ldyBSZXNpemVGYXZvcml0ZXNGcmFtZXNBY3Rpb24oY29udHJvbGxlcik7Ci0gICAKLSAgIC8vIFBvcHVsYXRlIHRoZSBhY3Rpb24gd2l0aCB0aGUgcmVxdWVzdCBwcm9wZXJ0aWVzLgotICAgYm9vbGVhbiByZXN1bHQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIGlmIChyZXN1bHQpCi0gICB7Ci0gICAgIGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLSAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgewotICAgIHZhciBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCA9IGdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0KCk7Ci0gICAgdmFyIGFjdGlvbnNDb250YWluZXJGcmFtZXNldCA9IGdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldCgpOwotICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0LnNldEF0dHJpYnV0ZSgiY29scyIsIjwlPWZhdlBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpJT4iKTsKLSAgICBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQuc2V0QXR0cmlidXRlKCJyb3dzIiwiPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iKTsKLSAgfQotICBlbHNlCi0gICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCIpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjc2NjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLkZhdm9yaXRlc1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzUGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgICBGYXZvcml0ZXNSZXN0b3JlRGVmYXVsdEZhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBuZXcgRmF2b3JpdGVzUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgIGlmIChhY3Rpb25SZXN1bHQpIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICAgIH0KLSAgICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIGZhdlN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNDb25maXJtSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNDb25maXJtSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjOTRmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQ29uZmlybUpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICBpZiAoY29uZmlybSgiPCU9Y29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19DT05GSVJNX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVMiKSU+IikpCi0gICAgICAgICAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2FjdGlvbnMvUmVzdG9yZURlZmF1bHRGYXZvcml0ZXNBY3Rpb25KU1AuanNwIikpJT4iOwotICAgIDwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTZlMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgU2VsZWN0RmF2b3JpdGVzTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi1ib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1NlbGVjdE5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjdkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvYWN0aW9ucy9TZWxlY3RGYXZvcml0ZXNUb29sQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbiBhY3Rpb24gPSBuZXcgU2VsZWN0RmF2b3JpdGVzVG9vbEFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi1ib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhMGNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbUZhdm9yaXRlc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24KLVN3aXRjaFBlcnNwZWN0aXZlRnJvbUZhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBuZXcgU3dpdGNoUGVyc3BlY3RpdmVGcm9tRmF2b3JpdGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLS8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0vLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLWJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3N3aXRjaHBlcnNwZWN0aXZlLmpzcCIgZmx1c2g9InRydWUiLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9hY3Rpb25zX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfYWN0aW9uc19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGE0ZWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9hY3Rpb25zX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjwlPWZhdlBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+IiBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05UQUlORVIlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTEgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuU1RBVFVTX0NPTlRBSU5FUiU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGFpbmVyLmpzcCIpKSU+IiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250YWluZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmU0MDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9uYXZpZ2F0b3JfY29udGFpbmVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX1RPT0xCQVIlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX3Rvb2xiYXIuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRFTlQlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRlbnQuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X25hdmlnYXRvcl9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmNWIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3RyZWV2aWV3LmNzcyIpKSU+Ij4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci0gIDwvc2NyaXB0PgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90cmVldmlldy5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08JQotICAgIFN0cmluZyBzZWxlY3RlZEFuY2hvck5hbWUgPSAiIjsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgaW50IGZvY3VzZWROb2RlSWQgPSBub2RlTWFuYWdlci5nZXRGb2N1c2VkTm9kZUlkKCk7Ci0gICAgU3RyaW5nIGZvY3VzZWRBbmNob3JOYW1lID0gU3RyaW5nLnZhbHVlT2YoZm9jdXNlZE5vZGVJZCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLSAgICAgICAgc2VsZWN0ZWRBbmNob3JOYW1lID0gc2VsZWN0ZWROb2RlLmdldEFuY2hvck5hbWUoKTsKLSAgICAgICAgaWYgKGZvY3VzZWROb2RlSWQgPT0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKQotICAgICAgICAgICAgZm9jdXNlZEFuY2hvck5hbWUgPSBzZWxlY3RlZEFuY2hvck5hbWU7Ci0gICAgfQotJT4KLTxib2R5IG9uTG9hZD0ic2VsZi5sb2NhdGlvbi5oYXNoPScjPCU9Zm9jdXNlZEFuY2hvck5hbWUlPic7c2V0U2VsZWN0ZWRBbmNob3JOYW1lKCc8JT1zZWxlY3RlZEFuY2hvck5hbWUlPicpIiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0idHJlZWNvbnRlbnRib3JkZXIiPgotICAgIDwlPW5vZGVNYW5hZ2VyLnJlbmRlclRyZWVWaWV3KHJlc3BvbnNlKSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9uYXZpZ2F0b3JfdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQ4Yzk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9uYXZpZ2F0b3JfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3Rvb2xiYXIuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPiAgCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90b29sYmFyLmpzIikpJT4iPgotPC9zY3JpcHQ+ICAKLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJmYXZvcml0ZXMvYWN0aW9ucy9SZXNpemVGYXZvcml0ZXNGcmFtZXNBY3Rpb25KU1AuanNwIik7Ci0lPiAgCi08L2pzcDp1c2VCZWFuPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1GcmFtZU5hbWUuYXBwZW5kKEZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL2Zvcm1zL1Byb2Nlc3NGYXZvcml0ZXNGcmFtZXNldHNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0yNSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9uYXZpZ2F0b3IuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmIChmYXZQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgZWxzZQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFIik7Ci0lPiAgICAgICAgCi0gICAgICAgIDx0ZCBpZD0iZG91YmxlY2xpY2tjb2x1bW4iIHRpdGxlPSI8JT1kb3VibGVDbGlja0NvbHVtblRpdGxlJT4iIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX05BVklHQVRPUiIpJT48L3RkPgotPCUKLSAgIFN0cmluZyBhbHRSZXN0b3JlID0gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1JFU1RPUkVfREVGQVVMVF9GQVZPUklURVMiKTsKLSAgIFN0cmluZyBhbHRSZW1vdmUgPSBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfUkVNT1ZFX0ZBVk9SSVRFIik7Ci0lPiAgIAotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9hY3Rpb25zL1Jlc3RvcmVEZWZhdWx0RmF2b3JpdGVzQ29uZmlybUpTUC5qc3AiKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcykiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIiBhbHQ9IjwlPWFsdFJlc3RvcmUlPiIgdGl0bGU9IjwlPWFsdFJlc3RvcmUlPiI+PC9hPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2FjdGlvbnMvUmVtb3ZlRmF2b3JpdGVzQWN0aW9uSlNQLmpzcCIpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRSZW1vdmUlPiIgdGl0bGU9IjwlPWFsdFJlbW92ZSU+Ij48L2E+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4NGU2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfcGVyc3BlY3RpdmVfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QRVJTUEVDVElWRV9DT05URU5UIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgY29scz0iPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiIgYmdjb2xvcj0jRUNFOUQ4PgotICA8ZnJhbWUgbmFtZT0iPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImZhdm9yaXRlcy9mYXZfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AiKSklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotICA8ZnJhbWUgbmFtZT0iPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5BQ1RJT05TX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiZmF2b3JpdGVzL2Zhdl9hY3Rpb25zX2NvbnRhaW5lci5qc3AiKSklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotPC9mcmFtZXNldD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfcHJvcGVydGllc19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGE4YmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5QUk9QRVJUSUVTX1RPT0xCQVIlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfdG9vbGJhci5qc3AiKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5QUk9QRVJUSUVTX0NPTlRFTlQlPiIgdGl0bGU9IjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMTkxNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3Byb3BlcnRpZXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08JQotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyOwotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sTWFuYWdlcigpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRUb29sICE9IG51bGwgJiYgc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikgewotICAgICAgICAlPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIGxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoc2VsZWN0ZWRUb29sLmdldEZvcm1MaW5rKCkpKSU+IjsKLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19BQ1RJT05fU0VMRUNURUQiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0gICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfcHJvcGVydGllc190b29sYmFyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTljNmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc2ZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJmYXZvcml0ZXMvYWN0aW9ucy9SZXNpemVGYXZvcml0ZXNGcmFtZXNBY3Rpb25KU1AuanNwIik7Ci0lPiAgCi08L2pzcDp1c2VCZWFuPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1GcmFtZU5hbWUuYXBwZW5kKEZhdm9yaXRlc0ZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9mb3Jtcy9Qcm9jZXNzRmF2b3JpdGVzRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvYWN0aW9ucy5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci08JQotICAgU3RyaW5nIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBudWxsOwotICAgaWYgKGZhdlBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpLmVuZHNXaXRoKCIxMDAlIikpCi0gICB7Ci0gICAgIGlmIChmYXZQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkuc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgfQotICAgaWYgKGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPT0gbnVsbCkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9BQ1RJT05TIiklPjwvdGQ+Ci08JQotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkgewotICAgICAgICBUb29sTWFuYWdlciB0b29sTWFuYWdlcjsKLSAgICAgICAgaWYgKHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpCi0gICAgICAgICAgICB0b29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0b29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8dG9vbE1hbmFnZXIuZ2V0TnVtYmVyT2ZUb29scygpOyBpKyspIHsKLSAgICAgICAgICAgIFRvb2wgdG9vbCA9IChUb29sKXRvb2xNYW5hZ2VyLmdldFRvb2woaSk7Ci0gICAgICAgICAgICAlPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48JT10b29sLnJlbmRlclRvb2wocmVzcG9uc2UsY29udHJvbGxlciklPjwvdGQ+Ci0gICAgICAgICAgICA8JQotICAgICAgICB9Ci0gICAgfQotJT4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGFpbmVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0ZDY2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfc3RhdHVzX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgcm93cz0iMzMsKiIgYm9yZGVyPTAgYmdjb2xvcj0iI0VDRTlEOCI+Ci0gIDxmcmFtZSBuYW1lPSI8JT1GYXZvcml0ZXNGcmFtZU5hbWVzLlNUQVRVU19UT09MQkFSJT4iIHRpdGxlPSI8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3N0YXR1c190b29sYmFyLmpzcCIpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci0gIDxmcmFtZSBuYW1lPSI8JT1GYXZvcml0ZXNGcmFtZU5hbWVzLlNUQVRVU19DT05URU5UJT4iIHRpdGxlPSI8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3N0YXR1c19jb250ZW50LmpzcCIpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3N0YXR1c19jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9zdGF0dXNfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTgxZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZmF2X3N0YXR1c19jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8cHJlPgotPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZVF1ZXVlKCkuZ2V0TWVzc2FnZXNGcm9tTGlzdCgpJT4KLSAgICAgICAgPC9wcmU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9zdGF0dXNfdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mYXZfc3RhdHVzX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQxYzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zhdl9zdGF0dXNfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3Rvb2xiYXIuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPiAgCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90b29sYmFyLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgiZmF2b3JpdGVzL2FjdGlvbnMvUmVzaXplRmF2b3JpdGVzRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChGYXZvcml0ZXNGcmFtZU5hbWVzLlNUQVRVU19DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9mb3Jtcy9Qcm9jZXNzRmF2b3JpdGVzRnJhbWVzZXRzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3RhdHVzLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLTwlCi0gICBTdHJpbmcgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IG51bGw7Ci0gICBpZiAoZmF2UGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgIHsKLSAgICAgaWYgKGZhdlBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOyAgICAgICAKLSAgIH0KLSAgIGlmIChkb3VibGVDbGlja0NvbHVtblRpdGxlID09IG51bGwpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkUiKTsKLSU+ICAgICAgICAKLSAgICAgICAgPHRkIGlkPSJkb3VibGVjbGlja2NvbHVtbiIgdGl0bGU9IjwlPWRvdWJsZUNsaWNrQ29sdW1uVGl0bGUlPiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfU1RBVFVTIiklPjwvdGQ+Ci08JQotICAgU3RyaW5nIGFsdENsZWFyID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfQ0xFQVIiKTsKLSU+ICAgICAgICAgICAKLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJmYXZvcml0ZXMvZmF2X3N0YXR1c19jb250ZW50LmpzcCIpKSU+IiB0YXJnZXQ9IjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuU1RBVFVTX0NPTlRFTlQlPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRDbGVhciU+IiB0aXRsZT0iPCU9YWx0Q2xlYXIlPiI+PC9hPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzSW1wb3J0VG9Xb3JrYmVuY2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiNDE4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtUHJvcGVydGllcyIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgIC8vIFRoZSBzZWxlY3RlZCBub2RlIG11c3QgYmUgYSBGYXZvcml0ZXNXU0RMU2VydmljZU5vZGUuCi0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50IHdzZGxFbGVtZW50ID0gKEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIGZvcm1Qcm9wZXJ0aWVzLnB1dCgiZm9ybUFjdGlvbkxpbmsiLCJmYXZvcml0ZXMvYWN0aW9ucy9GYXZvcml0ZXNJbXBvcnRUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AiKTsKLSAgIGZvcm1Qcm9wZXJ0aWVzLnB1dCgid3NkbFVSTCIsd3NkbEVsZW1lbnQuZ2V0V3NkbFVybCgpKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9JbXBvcnRXU0RMQW5kV1NJTFRvV29ya2JlbmNoRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MzIzZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb25MaW5rIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1BY3Rpb25MaW5rLmFwcGVuZCgiZmF2b3JpdGVzL2FjdGlvbnMvRmF2b3JpdGVzTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AiKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJQnVzaW5lc3NEZXRhaWxzUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTA4NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESUJ1c2luZXNzRGV0YWlsc1BhZ2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfVURESV9CVVNJTkVTU19ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfVURESV9CVVNJTkVTU19ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50KSB7Ci0gICAgICAgIEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChGYXZvcml0ZXNVRERJQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICAlPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CVVNJTkVTU19OQU1FIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWJ1c0VsZW1lbnQuZ2V0TmFtZSgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTlFVSVJZX1VSTCIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1idXNFbGVtZW50LmdldElucXVpcnlVUkwoKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQlVTSU5FU1NfS0VZIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NLZXkoKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPiAgICAgICAgCi0KLSAgICA8JQotICAgIH0KLSAgICAlPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJUmVnaXN0cnlEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJUmVnaXN0cnlEZXRhaWxzUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YjQyZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVJlZ2lzdHJ5RGV0YWlsc1BhZ2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24udWRkaS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgICAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9VRERJX1JFR0lTVFJZX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLQotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19VRERJX1JFR0lTVFJZX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpIHsKLSAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgICAgICBTdHJpbmcgcmVnaXN0cnlOYW1lID0gcmVnRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgJT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRSIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1yZWdpc3RyeU5hbWUlPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lOUVVJUllfVVJMIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXJlZ0VsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICAgIFN0cmluZyBwdWJsaXNoVVJMID0gcmVnRWxlbWVudC5nZXRQdWJsaXNoVVJMKCk7Ci0gICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocHVibGlzaFVSTCkpCi0gICAgIHsKLSU+Ci0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfVVJMIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXB1Ymxpc2hVUkwlPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPCUKLSAgICAgfQotICAgCi0gICAgIFN0cmluZyByZWdpc3RyeVVSTCA9IHJlZ0VsZW1lbnQuZ2V0UmVnaXN0cmF0aW9uVVJMKCk7Ci0gICAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocmVnaXN0cnlVUkwpKQotICAgICB7Ci0lPgotICAgICAgICAgICAgPGJyPgotICAgICAgICAgICAgPHRhYmxlPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfVVJMIixyZWdpc3RyeVVSTCklPgotICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8L3RhYmxlPgotPCUKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nQnVmZmVyIGNhdGVnb3J5RGlyZWN0b3J5ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5Rm9sZGVyRWxlbWVudC5mb3JtQ2F0ZWdvcmllc0RpcmVjdG9yeShjYXRlZ29yeURpcmVjdG9yeSxjb250cm9sbGVyLmdldFNlcnZsZXRFbmdpbmVTdGF0ZUxvY2F0aW9uKCkscmVnaXN0cnlOYW1lKTsKLSAgICAgIEZpbGUgY2F0ZWdvcnlEaXJlY3RvcnlGaWxlID0gbmV3IEZpbGUoY2F0ZWdvcnlEaXJlY3RvcnkudG9TdHJpbmcoKSk7Ci0gICAgICBTdHJpbmdbXSBjYXRlZ29yeUZpbGVzID0gY2F0ZWdvcnlEaXJlY3RvcnlGaWxlLmxpc3QoKTsKLSAgICAgIGlmIChjYXRlZ29yeUZpbGVzICE9IG51bGwpCi0gICAgICB7Ci0lPgotPGJyPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VTRVJfREVGSU5FRF9DQVRFR09SWV9EQVRBX0ZJTEVTIiklPgotICAgIDwvdGg+Ci0gIDwvdHI+Ci08JSAgICAgIAotICAgICAgICBmb3IgKGludCBpPTA7aTxjYXRlZ29yeUZpbGVzLmxlbmd0aDtpKyspCi0gICAgICAgIHsKLSU+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgPCU9Y2F0ZWdvcnlGaWxlc1tpXSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwlICAgICAgICAKLSAgICAgICAgfQotJT4KLTwvdGFibGU+Ci08JSAgICAgICAgCi0gICAgICB9ICAgICAgCi0lPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlICAgICAgCi0gICAgfQotJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNQYWdlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhNjAxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9GYXZvcml0ZXNVRERJU2VydmljZURldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGkuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1VERElfU0VSVklDRV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfVURESV9TRVJWSUNFX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCkgewotICAgICAgICBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgc2VyRWxlbWVudCA9IChGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgICU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NFUlZJQ0VfTkFNRSIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT1zZXJFbGVtZW50LmdldE5hbWUoKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5RVUlSWV9VUkwiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9c2VyRWxlbWVudC5nZXRJbnF1aXJ5VVJMKCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NFUlZJQ0VfS0VZIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXNlckVsZW1lbnQuZ2V0U2VydmljZUtleSgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgICAgICAKLQotICAgIDwlCi0gICAgfQotICAgICU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1VERElTZXJ2aWNlSW50RGV0YWlsc1BhZ2UuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVNlcnZpY2VJbnREZXRhaWxzUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3N2I5YzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzVURESVNlcnZpY2VJbnREZXRhaWxzUGFnZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICAgICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2UGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICAgICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgICAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLQotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZBVk9SSVRFU19VRERJX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCkgewotICAgICAgICBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2VySW50RWxlbWVudCA9IChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgICU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9c2VySW50RWxlbWVudC5nZXROYW1lKCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lOUVVJUllfVVJMIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXNlckludEVsZW1lbnQuZ2V0SW5xdWlyeVVSTCgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVkiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9c2VySW50RWxlbWVudC5nZXRTZXJ2aWNlSW50ZXJmYWNlS2V5KCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4gICAgICAgIAotCi0gICAgPCUKLSAgICB9Ci0gICAgJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NETERldGFpbHNQYWdlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1dTRExEZXRhaWxzUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YzFlNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NETERldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgICAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICAgICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgICAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgICAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTRExfREVUQUlMUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotCi0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBmYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfRkFWT1JJVEVTX1dTRExfREVUQUlMUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KSB7Ci0gICAgICAgIEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCB3c2RsRWxlbWVudCA9IChGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50OwotICAgICU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VSTCIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT13c2RsRWxlbWVudC5nZXRXc2RsVXJsKCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4gICAgICAgIAotCi0gICAgPCUKLSAgICB9Ci0gICAgJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NJTERldGFpbHNQYWdlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL0Zhdm9yaXRlc1dTSUxEZXRhaWxzUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjFlYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvZm9ybXMvRmF2b3JpdGVzV1NJTERldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3NpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgICAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdlBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfV1NJTF9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IGZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9GQVZPUklURVNfV1NJTF9ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNXU0lMRWxlbWVudCkgewotICAgICAgICBGYXZvcml0ZXNXU0lMRWxlbWVudCB3c2lsRWxlbWVudCA9IChGYXZvcml0ZXNXU0lMRWxlbWVudClzZWxlY3RlZEVsZW1lbnQ7Ci0gICAgICAgICU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8JT1mYXZQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VSTCIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT13c2lsRWxlbWVudC5nZXRXc2lsVXJsKCklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4gICAgICAgIAotCi0gICAgICAgIDwlCi0gICAgfQotICAgICU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL1Byb2Nlc3NGYXZvcml0ZXNGcmFtZXNldHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2Zvcm1zL1Byb2Nlc3NGYXZvcml0ZXNGcmFtZXNldHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5YTcxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9mb3Jtcy9Qcm9jZXNzRmF2b3JpdGVzRnJhbWVzZXRzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdlBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoZm9ybUFjdGlvbi50b1N0cmluZygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgc3R5bGU9Im1hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjAiPgotICA8aW5wdXQgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLkZSQU1FX05BTUUlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9Zm9ybUZyYW1lTmFtZSU+Ij4KLSAgPGlucHV0IG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9ZmF2UGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuRlJBTUVTRVRfUk9XU19BQ1RJT05TX0NPTlRBSU5FUiU+IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8JT1mYXZQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCklPiI+Ci08L2Zvcm0+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3VkZGlfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3VkZGlfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NWQxOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2FkZF90b191ZGRpX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2FkZF90b191ZGRpX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fdWRkaV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTNkZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2FkZF90b191ZGRpX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fd3NpbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9hZGRfdG9fd3NpbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0MTg0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3dzaWxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3dzaWxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2FkZF90b193c2lsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyYjhjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvYWRkX3RvX3dzaWxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfV1NJTF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X1dTSUxfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTA5ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfV1NJTF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X1dTSUxfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfV1NJTF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTRjZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfV1NJTF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9idXNpbmVzc19lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X2J1c2luZXNzX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDFlMzdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X2J1c2luZXNzX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFiOTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3JlZ2lzdHJ5X2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFhMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MWVjYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3RfcmVnaXN0cnlfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTFkYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTEzMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF9zZXJ2aWNlX2ludGVyZmFjZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfaW50ZXJmYWNlX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDY5ODZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfaW50ZXJmYWNlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTUzMTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3NlcnZpY2VfaW50ZXJmYWNlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF93c2RsX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGMwMjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvbGlzdF93c2RsX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhjOGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy9saXN0X3dzZGxfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3VkZGlfYnVzaW5lc3Nfbm9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9idXNpbmVzc19ub2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkNmE3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9idXNpbmVzc19ub2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3JlZ2lzdHJ5X2NhdF9ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3JlZ2lzdHJ5X2NhdF9ub2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlYzI4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9yZWdpc3RyeV9jYXRfbm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9yZWdpc3RyeV9ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3JlZ2lzdHJ5X25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQzY2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3JlZ2lzdHJ5X25vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3VkZGlfc2VydmljZV9pbnRlcmZhY2Vfbm9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9zZXJ2aWNlX2ludGVyZmFjZV9ub2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzMjVjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9zZXJ2aWNlX2ludGVyZmFjZV9ub2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3NlcnZpY2Vfbm9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvdWRkaV9zZXJ2aWNlX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzAyNTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL2ltYWdlcy91ZGRpX3NlcnZpY2Vfbm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvd3NkbF9zZXJ2aWNlX25vZGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3dzZGxfc2VydmljZV9ub2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvd3NkbF9zZXJ2aWNlX25vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvaW1hZ2VzL3dzaWxfbm9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvd3NpbF9ub2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1OTE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9pbWFnZXMvd3NpbF9ub2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzRm9ybVN1Ym1pdC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc0Zvcm1TdWJtaXQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTVmZTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzRm9ybVN1Ym1pdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBmdW5jdGlvbiBpc1NvbWV0aGluZ1NlbGVjdGVkKHRhYmxlQ29udGFpbmVySWQpIHsKLSAgICAgICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzOyBpPHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhciByb3dDaGVja2JveENlbGwgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLml0ZW0oMCk7Ci0gICAgICAgICAgICB2YXIgcm93Q2hlY2tib3ggPSByb3dDaGVja2JveENlbGwuY2hpbGROb2Rlc1swXTsKLSAgICAgICAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFsZXJ0KCI8JT1jb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQiKSU+Iik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQodGFibGVDb250YWluZXJJZCwgZm9ybSwgbG9jYXRpb24pIHsKLSAgICAgICAgaWYgKGlzU29tZXRoaW5nU2VsZWN0ZWQodGFibGVDb250YWluZXJJZCkpCi0gICAgICAgICAgICBzZXRMb2NhdGlvbkFuZFN1Ym1pdChmb3JtLCBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gc2V0TG9jYXRpb25BbmRTdWJtaXQoZm9ybSwgbG9jYXRpb24pIHsKLSAgICAgICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICAgICAgewotICAgICAgICAgIGZvcm0uYWN0aW9uID0gbG9jYXRpb247Ci0gICAgICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICAgICAgfQotICAgIH0KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNQYW5lcy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1BhbmVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhNTg4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1BhbmVzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIGZhdk5hdmlnYXRvckNvbnRhaW5lciA9IHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRBSU5FUiU+Il07Ci0gIHZhciBmYXZOYXZpZ2F0b3JUb29sYmFyID0gZmF2TmF2aWdhdG9yQ29udGFpbmVyLmZyYW1lc1siPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5OQVZJR0FUT1JfVE9PTEJBUiU+Il07Ci0gIHZhciBmYXZOYXZpZ2F0b3JDb250ZW50ID0gZmF2TmF2aWdhdG9yQ29udGFpbmVyLmZyYW1lc1siPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEVOVCU+Il07Ci0gIHZhciBmYXZBY3Rpb25zQ29udGFpbmVyID0gcGVyc3BlY3RpdmVDb250ZW50LmZyYW1lc1siPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5BQ1RJT05TX0NPTlRBSU5FUiU+Il07Ci0gIHZhciBmYXZQcm9wZXJ0aWVzQ29udGFpbmVyID0gZmF2QWN0aW9uc0NvbnRhaW5lci5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05UQUlORVIlPiJdOwotICB2YXIgZmF2UHJvcGVydGllc1Rvb2xiYXIgPSBmYXZQcm9wZXJ0aWVzQ29udGFpbmVyLmZyYW1lc1siPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5QUk9QRVJUSUVTX1RPT0xCQVIlPiJdOwotICB2YXIgZmF2UHJvcGVydGllc0NvbnRlbnQgPSBmYXZQcm9wZXJ0aWVzQ29udGFpbmVyLmZyYW1lc1siPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5QUk9QRVJUSUVTX0NPTlRFTlQlPiJdOwotICB2YXIgZmF2U3RhdHVzQ29udGFpbmVyID0gZmF2QWN0aW9uc0NvbnRhaW5lci5mcmFtZXNbIjwlPUZhdm9yaXRlc0ZyYW1lTmFtZXMuU1RBVFVTX0NPTlRBSU5FUiU+Il07Ci0gIHZhciBmYXZTdGF0dXNUb29sYmFyID0gZmF2U3RhdHVzQ29udGFpbmVyLmZyYW1lc1siPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5TVEFUVVNfVE9PTEJBUiU+Il07Ci0gIHZhciBmYXZTdGF0dXNDb250ZW50ID0gZmF2U3RhdHVzQ29udGFpbmVyLmZyYW1lc1siPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5TVEFUVVNfQ09OVEVOVCU+Il07Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzVGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NmFkMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy90YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0KLSAgICBmdW5jdGlvbiBmYXZIYW5kbGVDaGVja0FsbENsaWNrKHRhYmxlQ29udGFpbmVySWQsIGNoZWNrQWxsQ2hlY2tib3gpIHsKLSAgICAgICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzOyBpPHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHZhciByb3dDaGVja2JveENlbGwgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLml0ZW0oMCk7Ci0gICAgICAgICAgICB2YXIgcm93Q2hlY2tib3ggPSByb3dDaGVja2JveENlbGwuY2hpbGROb2Rlc1swXTsKLSAgICAgICAgICAgIHJvd0NoZWNrYm94LmNoZWNrZWQgPSBjaGVja0FsbENoZWNrYm94LmNoZWNrZWQ7Ci0gICAgICAgICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkgewotICAgICAgICAgICAgICAgIGhpZ2hsaWdodFJvdyh0YWJsZS5yb3dzW2ldLCJyb3djb2xvciIpOwotICAgICAgICAgICAgICAgIHJvd0NoZWNrYm94Lm5hbWUgPSAiPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQlPiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRSb3codGFibGUucm93c1tpXSwidGFibGVjZWxscyIpOwotICAgICAgICAgICAgICAgIHJvd0NoZWNrYm94Lm5hbWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIHZhbGlkYXRlQ2hlY2tCb3hJbnB1dChjaGVja2JveCwgaXNDaGVja2VkKSB7Ci0gICAgICAgIGlmIChpc0NoZWNrZWQpIHsKLSAgICAgICAgICAgIGNoZWNrYm94Lm5hbWUgPSAiPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQlPiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjaGVja2JveC5uYW1lID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaGFuZGxlUm93Q2hlY2tib3hDbGljaygpOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHR3aXN0SW5pdCh0YWJsZUNvbnRhaW5lcklkLHR3aXN0SW1hZ2VOYW1lKSB7Ci0gICAgICAgIHZhciB0YWJsZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICAgICAgaWYgKHRhYmxlLnJvd3MubGVuZ3RoID4gbnVtYmVyT2ZIZWFkZXJSb3dzKSB7Ci0gICAgICAgICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgICAgICAgdHdpc3QodGFibGVDb250YWluZXJJZCwgdHdpc3RJbWFnZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgICAgICAgdHdpc3QodGFibGVDb250YWluZXJJZCwgdHdpc3RJbWFnZU5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzZnJhbWVzZXRzLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzZnJhbWVzZXRzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiZTA5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc2ZyYW1lc2V0cy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldCgpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50LmZyYW1lc1siPCU9RmF2b3JpdGVzRnJhbWVOYW1lcy5BQ1RJT05TX0NPTlRBSU5FUiU+Il0uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZyYW1lc2V0IikuaXRlbSgwKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NGcmFtZXNldFNpemVzKGZyYW1lc2V0U2l6ZXNGb3JtKQotICB7Ci0gICAgdG9nZ2xlRG91YmxlQ2xpY2tDb2x1bW5UaXRsZSgpOwotICAgIHZhciBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCA9IGdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0KCk7Ci0gICAgdmFyIGFjdGlvbnNDb250YWluZXJGcmFtZXNldCA9IGdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldCgpOwotICAgIGZyYW1lc2V0U2l6ZXNGb3JtLjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5GUkFNRVNFVF9DT0xTX1BFUlNQRUNUSVZFX0NPTlRFTlQlPi52YWx1ZSA9IHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0LmNvbHM7Ci0gICAgZnJhbWVzZXRTaXplc0Zvcm0uPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPi52YWx1ZSA9IGFjdGlvbnNDb250YWluZXJGcmFtZXNldC5yb3dzOwotICAgIGZyYW1lc2V0U2l6ZXNGb3JtLnN1Ym1pdCgpOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElCdXNpbmVzc1ZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESUJ1c2luZXNzVmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMGE5YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESUJ1c2luZXNzVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgU3RyaW5nIGRpdkZhdm9yaXRlVURESUJ1c2luZXNzVGFibGUgPSAiZGl2RmF2b3JpdGVVRERJQnVzaW5lc3NUYWJsZSI7Ci0gICAgU3RyaW5nIHhkaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlID0gInhkaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlIjsKLQotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VERElfQlVTSU5FU1NfTElTVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzaWwvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgIFN0cmluZyB0aXRsZSA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX0ZBVk9SSVRFX1VERElfQlVTSU5FU1MiKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgIDwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX0JVU0lORVNTX0RFU0MiKSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyI+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzVURESUJ1c2luZXNzRm9sZGVyRWxlbWVudCkgewotICAgICU+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdkZhdm9yaXRlVURESUJ1c2luZXNzVGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlJT4nKSI+PGltZyBuYW1lPSI8JT14ZGl2RmF2b3JpdGVVRERJQnVzaW5lc3NUYWJsZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfQlVTSU5FU1MiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdkZhdm9yaXRlVURESUJ1c2luZXNzVGFibGUlPiI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iZmF2SGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9ZGl2RmF2b3JpdGVVRERJQnVzaW5lc3NUYWJsZSU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSAoKEZhdm9yaXRlc1VERElCdXNpbmVzc0ZvbGRlckVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICAgICAgICAgICAgICBWZWN0b3Igc29ydGVkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgCXNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgUXVpY2tTb3J0LnNvcnQoc29ydGVkVmVjdG9yKTsKLSAgICAgICAgICAgICAgICBlID0gc29ydGVkVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESUJ1c2luZXNzRWxlbWVudCBmYXZVRERJQnVzaW5lc3NFbGVtZW50ID0gKEZhdm9yaXRlc1VERElCdXNpbmVzc0VsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgIG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NQVNTX0FDVElPTl9OT0RFX0lEJT4iIHZhbHVlPSI8JT1zZWxlY3RlZE5vZGUuZ2V0Q2hpbGROb2RlKGZhdlVERElCdXNpbmVzc0VsZW1lbnQpLmdldE5vZGVJZCgpJT4iIG9uQ2xpY2s9InZhbGlkYXRlQ2hlY2tCb3hJbnB1dCh0aGlzLCB0aGlzLmNoZWNrZWQpIiAgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZVRERJQnVzaW5lc3NFbGVtZW50KS5nZXROb2RlSWQoKSwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPWZhdlVERElCdXNpbmVzc0VsZW1lbnQuZ2V0TmFtZSgpJT48L2E+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAlPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICB0d2lzdEluaXQoJzwlPWRpdkZhdm9yaXRlVURESUJ1c2luZXNzVGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlJT4nKTsKLSAgICAgICAgPC9zY3JpcHQ+Ci0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lNUE9SVF9UT19VRERJX1BFUlNQRUNUSVZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVVERElCdXNpbmVzc1RhYmxlJT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQWRkVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1JFTU9WRSIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2RmF2b3JpdGVVRERJQnVzaW5lc3NUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci0gICAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJUmVnaXN0cnlWaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElSZWdpc3RyeVZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDRkMjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElSZWdpc3RyeVZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuUXVpY2tTb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlID0gImRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUiOwotICAgIFN0cmluZyB4ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSA9ICJ4ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSI7Ci0KLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZvcml0ZXNQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiVklFV19USVRMRV9VRERJX1JFR0lTVFJZX0xJU1QiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc0Zvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX0ZBVk9SSVRFX1VERElfUkVHSVNUUlkiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTElTVF9GQVZPUklURV9VRERJX1JFR0lTVFJZX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+ICAgIAotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDsiPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4nKSI+PGltZyBuYW1lPSI8JT14ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfUkVHSVNUUlkiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUlPiI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iZmF2SGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSAoKEZhdm9yaXRlc1VERElSZWdpc3RyeUZvbGRlckVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICAgICAgICAgICAgICBWZWN0b3Igc29ydGVkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgCXNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgUXVpY2tTb3J0LnNvcnQoc29ydGVkVmVjdG9yKTsKLSAgICAgICAgICAgICAgICBlID0gc29ydGVkVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudCBmYXZVRERJUmVnaXN0cnlFbGVtZW50ID0gKEZhdm9yaXRlc1VERElSZWdpc3RyeUVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgIG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NQVNTX0FDVElPTl9OT0RFX0lEJT4iIHZhbHVlPSI8JT1zZWxlY3RlZE5vZGUuZ2V0Q2hpbGROb2RlKGZhdlVERElSZWdpc3RyeUVsZW1lbnQpLmdldE5vZGVJZCgpJT4iIG9uQ2xpY2s9InZhbGlkYXRlQ2hlY2tCb3hJbnB1dCh0aGlzLCB0aGlzLmNoZWNrZWQpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Q2hpbGROb2RlKGZhdlVERElSZWdpc3RyeUVsZW1lbnQpLmdldE5vZGVJZCgpLCBmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PCU9ZmF2VURESVJlZ2lzdHJ5RWxlbWVudC5nZXROYW1lKCklPjwvYT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2RmF2b3JpdGVVRERJUmVnaXN0cnlUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlVURESVJlZ2lzdHJ5VGFibGUlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVNT1ZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVVERElSZWdpc3RyeVRhYmxlJT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLSAgICA8L2Zvcm0+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJU2VydmljZUludGVyZmFjZVZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWY0YTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVVERElTZXJ2aWNlSW50ZXJmYWNlVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgU3RyaW5nIGRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSA9ICJkaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUiOwotICAgIFN0cmluZyB4ZGl2RmF2b3JpdGVVRERJU2VydmljZUludFRhYmxlID0gInhkaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUiOwotCi0gICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2b3JpdGVzUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlZJRVdfVElUTEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9MSVNUIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNGb3JtU3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJmYXZvcml0ZXMvaW1hZ2VzL2xpc3Rfc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9GQVZPUklURV9VRERJX1NFUlZJQ0VfSU5URVJGQUNFIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfVURESV9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZW1vdmVGYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+JykiPjxpbWcgbmFtZT0iPCU9eGRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRV9JTlRFUkZBQ0UiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJmYXZIYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gKChGYXZvcml0ZXNVRERJU2VydmljZUludGVyZmFjZUZvbGRlckVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICAgICAgICAgICAgICBWZWN0b3Igc29ydGVkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgCXNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgUXVpY2tTb3J0LnNvcnQoc29ydGVkVmVjdG9yKTsKLSAgICAgICAgICAgICAgICBlID0gc29ydGVkVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGVzVURESVNlcnZpY2VJbnRlcmZhY2VFbGVtZW50IGZhdlVERElTZXJJbnRFbGVtZW50ID0gKEZhdm9yaXRlc1VERElTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGUoZmF2VURESVNlckludEVsZW1lbnQpLmdldE5vZGVJZCgpJT4iIG9uQ2xpY2s9InZhbGlkYXRlQ2hlY2tCb3hJbnB1dCh0aGlzLCB0aGlzLmNoZWNrZWQpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdEZhdm9yaXRlc05vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Q2hpbGROb2RlKGZhdlVERElTZXJJbnRFbGVtZW50KS5nZXROb2RlSWQoKSwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPWZhdlVERElTZXJJbnRFbGVtZW50LmdldE5hbWUoKSU+PC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgJT4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgdHdpc3RJbml0KCc8JT1kaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVVERElTZXJ2aWNlSW50VGFibGUlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SRU1PVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VJbnRUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci0gICAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJU2VydmljZVZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlVURESVNlcnZpY2VWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3NjE3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVVRERJU2VydmljZVZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuUXVpY2tTb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS5GYXZvcml0ZXNQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZGYXZvcml0ZVVERElTZXJ2aWNlVGFibGUgPSAiZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlIjsKLSAgICBTdHJpbmcgeGRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSA9ICJ4ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlIjsKLQotICAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VERElfU0VSVklDRV9MSVNUIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mYXZvcml0ZXMvc2NyaXB0cy9mYXZvcml0ZXNGb3JtU3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc1RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ3c2lsL2ltYWdlcy9saXN0X1VERElfc2VydmljZV9oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRSIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1VERElfU0VSVklDRV9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZW1vdmVGYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGYXZvcml0ZXNVRERJU2VydmljZUZvbGRlckVsZW1lbnQpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSU+JykiPjxpbWcgbmFtZT0iPCU9eGRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1VERElfU0VSVklDRSIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9ZGl2RmF2b3JpdGVVRERJU2VydmljZVRhYmxlJT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImZhdkhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSAoKEZhdm9yaXRlc1VERElTZXJ2aWNlRm9sZGVyRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbEZhdm9yaXRlcygpOwotICAgICAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAJc29ydGVkVmVjdG9yLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgICBRdWlja1NvcnQuc29ydChzb3J0ZWRWZWN0b3IpOwotICAgICAgICAgICAgICAgIGUgPSBzb3J0ZWRWZWN0b3IuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBGYXZvcml0ZXNVRERJU2VydmljZUVsZW1lbnQgZmF2VURESVNlcnZpY2VFbGVtZW50ID0gKEZhdm9yaXRlc1VERElTZXJ2aWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGUoZmF2VURESVNlcnZpY2VFbGVtZW50KS5nZXROb2RlSWQoKSU+IiBvbkNsaWNrPSJ2YWxpZGF0ZUNoZWNrQm94SW5wdXQodGhpcywgdGhpcy5jaGVja2VkKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZVRERJU2VydmljZUVsZW1lbnQpLmdldE5vZGVJZCgpLCBmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PCU9ZmF2VURESVNlcnZpY2VFbGVtZW50LmdldE5hbWUoKSU+PC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgJT4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgdHdpc3RJbml0KCc8JT1kaXZGYXZvcml0ZVVERElTZXJ2aWNlVGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVVERElTZXJ2aWNlVGFibGUlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU1QT1JUX1RPX1VERElfUEVSU1BFQ1RJVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SRU1PVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlVURESVNlcnZpY2VUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci0gICAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVXU0RMU2VydmljZVZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mYXZvcml0ZXMvdmlld3MvTGlzdEZhdm9yaXRlV1NETFNlcnZpY2VWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1YjExZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVXU0RMU2VydmljZVZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuUXVpY2tTb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLnBlcnNwZWN0aXZlLkZhdm9yaXRlc1BlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZGYXZvcml0ZVdTRExUYWJsZSA9ICJkaXZGYXZvcml0ZVdTRExUYWJsZSI7Ci0gICAgU3RyaW5nIHhkaXZGYXZvcml0ZVdTRExUYWJsZSA9ICJ4ZGl2RmF2b3JpdGVXU0RMVGFibGUiOwotCi0gICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2b3JpdGVzUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlZJRVdfVElUTEVfV1NETF9TRVJWSUNFX0xJU1QiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc0Zvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzaWwvaW1hZ2VzL2xpc3RfV1NETF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xJU1RfRkFWT1JJVEVfV1NETF9TRVJWSUNFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+ICAgIAotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDsiPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUZhdm9yaXRlc0FjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiU+IiB2YWx1ZT0iMSI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2RmF2b3JpdGVXU0RMVGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVdTRExUYWJsZSU+JykiPjxpbWcgbmFtZT0iPCU9eGRpdkZhdm9yaXRlV1NETFRhYmxlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRkFWT1JJVEVfV1NETCIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9ZGl2RmF2b3JpdGVXU0RMVGFibGUlPiI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iZmF2SGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9ZGl2RmF2b3JpdGVXU0RMVGFibGUlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VUkwiKSU+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSAoKEZhdm9yaXRlc1dTRExTZXJ2aWNlRm9sZGVyRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbEZhdm9yaXRlcygpOwotICAgICAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAJc29ydGVkVmVjdG9yLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgICBRdWlja1NvcnQuc29ydChzb3J0ZWRWZWN0b3IpOwotICAgICAgICAgICAgICAgIGUgPSBzb3J0ZWRWZWN0b3IuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgZmF2V1NETFNlcnZpY2VFbGVtZW50ID0gKEZhdm9yaXRlc1dTRExTZXJ2aWNlRWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9RmF2b3JpdGVzQWN0aW9uSW5wdXRzLk1BU1NfQUNUSU9OX05PREVfSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGUoZmF2V1NETFNlcnZpY2VFbGVtZW50KS5nZXROb2RlSWQoKSU+IiBvbkNsaWNrPSJ2YWxpZGF0ZUNoZWNrQm94SW5wdXQodGhpcywgdGhpcy5jaGVja2VkKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZXU0RMU2VydmljZUVsZW1lbnQpLmdldE5vZGVJZCgpLCBmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PCU9ZmF2V1NETFNlcnZpY2VFbGVtZW50LmdldFdzZGxVcmwoKSU+PC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgJT4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgdHdpc3RJbml0KCc8JT1kaXZGYXZvcml0ZVdTRExUYWJsZSU+JywnPCU9eGRpdkZhdm9yaXRlV1NETFRhYmxlJT4nKTsKLSAgICAgICAgPC9zY3JpcHQ+Ci0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lNUE9SVF9UT19XU0RMX1BFUlNQRUNUSVZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVdTRExUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEZhdm9yaXRlc0FkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SRU1PVkUiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdkZhdm9yaXRlV1NETFRhYmxlJT4nLCB0aGlzLmZvcm0sICc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLSAgICA8L2Zvcm0+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVdTSUxWaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZmF2b3JpdGVzL3ZpZXdzL0xpc3RGYXZvcml0ZVdTSUxWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3OThjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zhdm9yaXRlcy92aWV3cy9MaXN0RmF2b3JpdGVXU0lMVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuRmF2b3JpdGVzUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZmF2b3JpdGVzLmRhdGFtb2RlbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgU3RyaW5nIGRpdkZhdm9yaXRlV1NJTFRhYmxlID0gImRpdkZhdm9yaXRlV1NJTFRhYmxlIjsKLSAgICBTdHJpbmcgeGRpdkZhdm9yaXRlV1NJTFRhYmxlID0gInhkaXZGYXZvcml0ZVdTSUxUYWJsZSI7Ci0KLSAgICBGYXZvcml0ZXNQZXJzcGVjdGl2ZSBmYXZvcml0ZXNQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0RmF2b3JpdGVzUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiVklFV19USVRMRV9XU0lMX0xJU1QiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zhdm9yaXRlcy9zY3JpcHRzL2Zhdm9yaXRlc0Zvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvZmF2b3JpdGVzL3NjcmlwdHMvZmF2b3JpdGVzVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImZhdm9yaXRlcy9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfRkFWT1JJVEVfV1NJTCIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9ZmF2b3JpdGVzUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MSVNUX0ZBVk9SSVRFX1dTSUxfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4gICAgCi0gICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyI+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgRmF2b3JpdGVzV1NJTEZvbGRlckVsZW1lbnQpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTVVMVElQTEVfTElOS19BQ1RJT04lPiIgdmFsdWU9IjEiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWRpdkZhdm9yaXRlV1NJTFRhYmxlJT4nLCc8JT14ZGl2RmF2b3JpdGVXU0lMVGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhkaXZGYXZvcml0ZVdTSUxUYWJsZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZBVk9SSVRFX1dTSUwiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxkaXYgaWQ9IjwlPWRpdkZhdm9yaXRlV1NJTFRhYmxlJT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImZhdkhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPWRpdkZhdm9yaXRlV1NJTFRhYmxlJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVVJMIiklPjwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50IGZhdldTSUxGb2xkZXJFbGVtZW50ID0gKEZhdm9yaXRlc1dTSUxGb2xkZXJFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBmYXZXU0lMRm9sZGVyRWxlbWVudC5nZXRBbGxGYXZvcml0ZXMoKTsKLSAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFF1aWNrU29ydC5zb3J0KHNvcnRlZFZlY3Rvcik7Ci0gICAgICAgICAgICBlID0gc29ydGVkVmVjdG9yLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIEZhdm9yaXRlc1dTSUxFbGVtZW50IGZhdldTSUxFbGVtZW50ID0gKEZhdm9yaXRlc1dTSUxFbGVtZW50KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giICBuYW1lPSI8JT1GYXZvcml0ZXNBY3Rpb25JbnB1dHMuTUFTU19BQ1RJT05fTk9ERV9JRCU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZXU0lMRWxlbWVudCkuZ2V0Tm9kZUlkKCklPiIgb25DbGljaz0idmFsaWRhdGVDaGVja0JveElucHV0KHRoaXMsIHRoaXMuY2hlY2tlZCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RGYXZvcml0ZXNOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldENoaWxkTm9kZShmYXZXU0lMRWxlbWVudCkuZ2V0Tm9kZUlkKCksIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1mYXZXU0lMRWxlbWVudC5nZXRXc2lsVXJsKCklPjwvYT48L3RkPgotICAgICAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2RmF2b3JpdGVXU0lMVGFibGUlPicsJzwlPXhkaXZGYXZvcml0ZVdTSUxUYWJsZSU+Jyk7Ci0gICAgICAgIDwvc2NyaXB0PgotCi0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1mYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lNUE9SVF9UT19XU0lMX1BFUlNQRUNUSVZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVdTSUxUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFdTSUxUb1dTSUxQZXJzcGVjdGl2ZUFjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWZhdm9yaXRlc1BlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVNT1ZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZGYXZvcml0ZVdTSUxUYWJsZSU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlbW92ZUZhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSAgICAlPgotICAgIDwvZm9ybT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9JbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9JbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmU4ZmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvSW1wb3J0VG9Xb3JrYmVuY2hGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybVByb3BlcnRpZXMiIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCIvPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9JTVBPUlRfVE9fV09SS0JFTkNIIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4gICAgCi08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgoU3RyaW5nKWZvcm1Qcm9wZXJ0aWVzLmdldCgiZm9ybUFjdGlvbkxpbmsiKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRfRklMRSU+IiB2YWx1ZT0iPCU9QWN0aW9uSW5wdXRzLklNUE9SVF9GSUxFJT4iPgotCi0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9JTVBPUlRfV1NETF9UT19XT1JLQkVOQ0giKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTVBPUlRfVE9fV09SS0JFTkNIX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHRhYmxlPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTQwIHZhbGlnbj0iY2VudGVyIj4KLSAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJzZWxlY3Rfd29ya2JlbmNoX3Byb2plY3RfbmFtZSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJXT1JLQkVOQ0hfUFJPSkVDVF9OQU1FIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD00MCB2YWxpZ249ImNlbnRlciIgbm93cmFwPgotICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgSVdvcmtzcGFjZVJvb3QgaVdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBpV29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0cygpOwotICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ic2VsZWN0X3dvcmtiZW5jaF9wcm9qZWN0X25hbWUiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5XT1JLQkVOQ0hfUFJPSkVDVF9OQU1FJT4iIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvamVjdHNbaV0uaXNPcGVuKCkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1wcm9qZWN0TmFtZSU+Ij48JT1wcm9qZWN0TmFtZSU+Ci0gICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfaW1wb3J0ZWRfZmlsZV9uYW1lIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIklNUE9SVEVEX1dTRExfRklMRV9OQU1FIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iIHdpZHRoPSI2MCUiPgotPCUKLSAgIFN0cmluZyB3c2RsRmlsZU5hbWU9InRlbXAud3NkbCI7Ci0gICBTdHJpbmcgd3NkbFVSTCA9IChTdHJpbmcpZm9ybVByb3BlcnRpZXMuZ2V0KCJ3c2RsVVJMIik7Ci0gICBpZiAod3NkbFVSTCAhPSBudWxsICYmIHdzZGxVUkwuZW5kc1dpdGgoIi53c2RsIikpCi0gICB7Ci0gICAgIGludCBsYXN0U2VwYXJhdG9yUG9zID0gTWF0aC5tYXgod3NkbFVSTC5sYXN0SW5kZXhPZigiLyIpLHdzZGxVUkwubGFzdEluZGV4T2YoIlxcIikpOwotICAgICBpZiAobGFzdFNlcGFyYXRvclBvcyA+IDApCi0gICAgICAgd3NkbEZpbGVOYW1lID0gd3NkbFVSTC5zdWJzdHJpbmcobGFzdFNlcGFyYXRvclBvcysxLHdzZGxVUkwubGVuZ3RoKCkpOwotICAgfQotJT4gICAKLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfaW1wb3J0ZWRfZmlsZV9uYW1lIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FJT4iIHZhbHVlPSI8JT13c2RsRmlsZU5hbWUlPiIgc2l6ZT01MCBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgIAotICAgIDwvZm9ybT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9JbXBvcnRXU0RMQW5kV1NJTFRvV29ya2JlbmNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL0ltcG9ydFdTRExBbmRXU0lMVG9Xb3JrYmVuY2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0YzAzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL0ltcG9ydFdTRExBbmRXU0lMVG9Xb3JrYmVuY2hGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybVByb3BlcnRpZXMiIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHRvZ2dsZURpdkNvbnRhaW5lcihkaXZJZCkKLSAgewotICAgIHZhciBkaXZDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkaXZJZCk7Ci0gICAgaWYgKGRpdkNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09ICJub25lIikKLSAgICAgIGRpdkNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgZWxzZQotICAgICAgZGl2Q29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gIH0KLTwvc2NyaXB0PgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX0lNUE9SVF9UT19XT1JLQkVOQ0giKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm11dGlscy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoKFN0cmluZylmb3JtUHJvcGVydGllcy5nZXQoImZvcm1BY3Rpb25MaW5rIikpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KLQotICA8JQotICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgU3RyaW5nIHRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfSU1QT1JUX1dTRExfVE9fV09SS0JFTkNIIik7Ci0gICU+Ci0gIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU1QT1JUX1RPX1dPUktCRU5DSF9ERVNDIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD00MCB2YWxpZ249ImNlbnRlciI+Ci0gICAgICAgIDxsYWJlbCBmb3I9InNlbGVjdF93b3JrYmVuY2hfcHJvamVjdF9uYW1lIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIldPUktCRU5DSF9QUk9KRUNUX05BTUUiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTQwIHZhbGlnbj0iY2VudGVyIiBub3dyYXA+Ci0gICAgICAgIDwlCi0gICAgICAgIElXb3Jrc3BhY2VSb290IGlXb3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IGlXb3Jrc3BhY2VSb290LmdldFByb2plY3RzKCk7Ci0gICAgICAgICU+Ci0gICAgICAgIDxzZWxlY3QgaWQ9InNlbGVjdF93b3JrYmVuY2hfcHJvamVjdF9uYW1lIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuV09SS0JFTkNIX1BST0pFQ1RfTkFNRSU+IiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci0gICAgICAgIDwlCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFwcm9qZWN0c1tpXS5pc09wZW4oKSkKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICU+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPXByb2plY3ROYW1lJT4iPjwlPXByb2plY3ROYW1lJT4KLSAgICAgICAgPCUKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotCi0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2hlY2tlZCBpZD0iaW5wdXRfaW1wb3J0X3dzZGwiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRfRklMRSU+IiB2YWx1ZT0iPCU9QWN0aW9uSW5wdXRzLklNUE9SVF9GSUxFJT4iIG9uQ2xpY2s9InRvZ2dsZURpdkNvbnRhaW5lcignZGl2X2ltcG9ydF93c2RsJykiPgotICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9pbXBvcnRfd3NkbCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJMQUJFTF9JTVBPUlRfV1NETCIpJT48L2xhYmVsPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8ZGl2IGlkPSJkaXZfaW1wb3J0X3dzZGwiPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9pbXBvcnRlZF93c2RsX2ZpbGVfbmFtZSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJJTVBPUlRFRF9XU0RMX0ZJTEVfTkFNRSIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9IjYwJSI+Ci08JQotIFN0cmluZyB3c2RsRmlsZU5hbWU9InRlbXAud3NkbCI7Ci0gU3RyaW5nIHdzZGxVUkwgPSAoU3RyaW5nKWZvcm1Qcm9wZXJ0aWVzLmdldCgid3NkbFVSTCIpOwotIGlmICh3c2RsVVJMICE9IG51bGwgJiYgd3NkbFVSTC5lbmRzV2l0aCgiLndzZGwiKSkKLSB7Ci0gICBpbnQgbGFzdFNlcGFyYXRvclBvcyA9IE1hdGgubWF4KHdzZGxVUkwubGFzdEluZGV4T2YoIi8iKSx3c2RsVVJMLmxhc3RJbmRleE9mKCJcXCIpKTsKLSAgIGlmIChsYXN0U2VwYXJhdG9yUG9zID4gMCkKLSAgICAgd3NkbEZpbGVOYW1lID0gd3NkbFVSTC5zdWJzdHJpbmcobGFzdFNlcGFyYXRvclBvcysxLHdzZGxVUkwubGVuZ3RoKCkpOwotIH0KLSU+ICAgCi0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9pbXBvcnRlZF93c2RsX2ZpbGVfbmFtZSIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLklNUE9SVEVEX0ZJTEVfTkFNRSU+IiB2YWx1ZT0iPCU9d3NkbEZpbGVOYW1lJT4iIHNpemU9NTAgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotCi0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Jm5ic3A7PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotCi0gIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRFRF9XU0RMX1VSTCU+IiB2YWx1ZT0iPCU9d3NkbFVSTCU+Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iaW5wdXRfaW1wb3J0X3dzaWwiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRfVE9fV1NJTCU+IiB2YWx1ZT0iPCU9QWN0aW9uSW5wdXRzLklNUE9SVF9UT19XU0lMJT4iIG9uQ2xpY2s9InRvZ2dsZURpdkNvbnRhaW5lcignZGl2X2ltcG9ydF93c2lsJykiPgotICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9pbXBvcnRfd3NpbCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJMQUJFTF9JTVBPUlRfVE9fV1NJTCIpJT48L2xhYmVsPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8ZGl2IGlkPSJkaXZfaW1wb3J0X3dzaWwiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9pbXBvcnRlZF93c2lsX2ZpbGVfbmFtZSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJXU0lMX0ZJTEVfTkFNRSIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSIgd2lkdGg9IjYwJSI+Ci08JQotIFN0cmluZyB3c2lsRmlsZU5hbWUgPSAoU3RyaW5nKWZvcm1Qcm9wZXJ0aWVzLmdldCgid3NpbEZpbGVOYW1lIik7Ci0gaWYgKHdzaWxGaWxlTmFtZSA9PSBudWxsIHx8IHdzaWxGaWxlTmFtZS5sZW5ndGgoKSA8PSAwKQotICAgd3NpbEZpbGVOYW1lID0gd3NkbEZpbGVOYW1lLnN1YnN0cmluZygwLCB3c2RsRmlsZU5hbWUubGVuZ3RoKCktNCkgKyAid3NpbCI7Ci0lPiAgIAotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfaW1wb3J0ZWRfd3NpbF9maWxlX25hbWUiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5XU0lMX0ZJTEVfTkFNRSU+IiB2YWx1ZT0iPCU9d3NpbEZpbGVOYW1lJT4iIHNpemU9NTAgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotCi08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgIAotICA8L2Zvcm0+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3M2EwZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbkxpbmsiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX0xBVU5DSF9XRUJTRVJWSUNFX1dJWkFSRCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChmb3JtQWN0aW9uTGluay50b1N0cmluZygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2xhdW5jaF93c3dpemFyZF9oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfTEFVTkNIX1dFQl9TRVJWSUNFX1dJWkFSRCIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NIT09TRV9XSVpBUkQiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fd3NfY2xpZW50X3dpemFyZCIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuV0VCX1NFUlZJQ0VfV0laQVJEJT4iIGNoZWNrZWQ9dHJ1ZSB2YWx1ZT0iPCU9U3RyaW5nLnZhbHVlT2YoQWN0aW9uSW5wdXRzLldFQl9TRVJWSUNFX0NMSUVOVF9XSVpBUkQpJT4iPjxsYWJlbCBmb3I9InJhZGlvX3dzX2NsaWVudF93aXphcmQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19XRUJfU0VSVklDRV9DTElFTlRfV0laQVJEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fd3Nfc2tlbGV0b25fd2l6YXJkIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5XRUJfU0VSVklDRV9XSVpBUkQlPiIgdmFsdWU9IjwlPVN0cmluZy52YWx1ZU9mKEFjdGlvbklucHV0cy5XRUJfU0VSVklDRV9TS0VMRVRPTl9XSVpBUkQpJT4iPjxsYWJlbCBmb3I9InJhZGlvX3dzX3NrZWxldG9uX3dpemFyZCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX1dFQl9TRVJWSUNFX1NLRUxFVE9OX1dJWkFSRCIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgICAKLSAgPC9mb3JtPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL1Byb3h5TG9hZENvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9Qcm94eUxvYWRDb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyNDM2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL1Byb3h5TG9hZENvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0gICBTdHJpbmdCdWZmZXIgdGFyZ2V0Q29udGVudExpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5UQVJHRVRfUEFHRSkpOwotICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKQotICAgewotICAgICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgICAgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgICBpZiAodGFyZ2V0Q29udGVudExpbmsudG9TdHJpbmcoKS5pbmRleE9mKCI/IikgIT0gLTEpCi0gICAgICAgdGFyZ2V0Q29udGVudExpbmsuYXBwZW5kKCcmJyk7Ci0gICAgIGVsc2UKLSAgICAgICB0YXJnZXRDb250ZW50TGluay5hcHBlbmQoJz8nKTsKLSAgICAgdGFyZ2V0Q29udGVudExpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotICAgfQotICAgZWxzZQotICAgICBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIAotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9QQUdFX0xPQURFUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBsb2FkQ29udGVudCgpCi0gIHsKLSAgICB2YXIgZnJhbWVzZXQgPSBwYXJlbnQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb3h5UGFnZSIpOwotICAgIHZhciBjb250ZW50RnJhbWUgPSBmcmFtZXNldC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZnJhbWUiKS5pdGVtKDEpOwotICAgIGNvbnRlbnRGcmFtZS5zcmMgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRhcmdldENvbnRlbnRMaW5rLnRvU3RyaW5nKCkpKSU+IjsgIAotICB9Ci0gIAotICBmdW5jdGlvbiBoYW5kbGVDb21wbGV0aW9uKCkKLSAgewotICAgIHZhciB0YWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YWJsZSIpLml0ZW0oMCk7Ci0gICAgdmFyIHRCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgZG9uZVJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGRvbmVDb2x1bW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIGRvbmVDb2x1bW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlBhZ2UgbG9hZGVkLiIpKTsKLSAgICBkb25lUm93LmFwcGVuZENoaWxkKGRvbmVDb2x1bW4pOwotICAgIHRCb2R5LmFwcGVuZENoaWxkKGRvbmVSb3cpOyAgIAotICB9Ci08L3NjcmlwdD4gIAotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfTE9BRF9JTl9QUk9HUkVTUyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgbG9hZENvbnRlbnQoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9Qcm94eUxvYWRQYWdlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvUHJveHlMb2FkUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjQ2MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9Qcm94eUxvYWRQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5VUkxVdGlscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubmV0LioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXI7Ci0gICBTdHJpbmdCdWZmZXIgbG9hZENvbnRlbnRMaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigiZm9ybXMvUHJveHlMb2FkQ29udGVudC5qc3A/Iik7Ci0gICBpZiAoc2Vzc2lvbklkICE9IG51bGwpCi0gICB7Ci0gICAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgICBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICAgIGxvYWRDb250ZW50TGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCkuYXBwZW5kKCcmJyk7Ci0gICB9Ci0gICBlbHNlCi0gICAgIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlcilzZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgbG9hZENvbnRlbnRMaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuVEFSR0VUX1BBR0UpLmFwcGVuZCgnPScpLmFwcGVuZChVUkxVdGlscy5lbmNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlRBUkdFVF9QQUdFKSkpOwotJT4KLTxmcmFtZXNldCBpZD0icHJveHlQYWdlIiByb3dzPSIxMDAlLCoiIGJvcmRlcj0wPgotICA8ZnJhbWUgc3JjPSI8JT1jb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChsb2FkQ29udGVudExpbmsudG9TdHJpbmcoKSklPiIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9QQUdFX0xPQURFUiIpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBub3Jlc2l6ZT4KLSAgPGZyYW1lIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfUEFHRV9DT05URU5UIiklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG5vcmVzaXplPgotPC9mcmFtZXNldD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvY29weXJpZ2h0LmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvY29weXJpZ2h0LmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmZGNlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL2NvcHlyaWdodC5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9mb3Jtcy9mb3JtaGVhZGVyLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxYzk4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh0aXRsZUltYWdlUGF0aCkpJT4iIGFsdD0iIj4KLSAgICAgIDxzdHJvbmc+PCU9dGl0bGUlPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwPiA8aW1nIGhlaWdodD0yIHdpZHRoPSIxMDAlIiBhbGlnbj0idG9wIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iPiA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0ZTNmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLQotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gKFRvb2xNYW5hZ2VyKWN1cnJlbnRUb29sTWFuYWdlckhhc2guZ2V0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUik7Ci0gICBpbnQgbnVtYmVyT2ZUb29scyA9IGN1cnJlbnRUb29sTWFuYWdlci5nZXROdW1iZXJPZlRvb2xzKCk7Ci0gICBpZiAobnVtYmVyT2ZUb29scyA+IDEpCi0gICB7Ci0lPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8c3Ryb25nPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX09USEVSX0FDVElPTlMiKSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjA+IDxpbWcgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiIGFsaWduPSJ0b3AiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiI+IDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHRhYmxlPgotPCUKLSAgICAgZm9yIChpbnQgaT0xO2k8bnVtYmVyT2ZUb29scztpKyspCi0gICAgIHsKLSAgICAgICBUb29sIHQgPSBjdXJyZW50VG9vbE1hbmFnZXIuZ2V0VG9vbChpKTsKLSU+Ci0gIDx0cj4KLSAgICA8dGQ+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHQuZ2V0U2VsZWN0VG9vbEFjdGlvbkhyZWYoZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT10LmdldFNlbGVjdFRvb2xBY3Rpb25UYXJnZXQoKSU+Ij48JT10LmdldEFsdFRleHQoKSU+PC9hPjwvdGQ+Ci0gIDwvdHI+Ci08JQotICAgICB9Ci0lPgotPC90YWJsZT4KLTwlCi0gICB9Ci0lPiAgICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmZThhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9HTyIpJT4iIGNsYXNzPSJidXR0b24iPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX1JFU0VUIiklPiIgb25DbGljaz0icmVzZXRGb3JtSW5wdXRzKCkiIGNsYXNzPSJidXR0b24iPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2FjdGlvbnMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvYWN0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWVkN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvYWN0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9hZGRfdG9fd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2FkZF90b193c2RsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWNlNTYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2FkZF90b193c2RsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvYWRkX3RvX3dzZGxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvYWRkX3RvX3dzZGxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWFkNjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2FkZF90b193c2RsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2JhY2tfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9iYWNrX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ2NjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2JhY2tfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9iYWNrX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2JhY2tfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI0MTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2JhY2tfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvY2FsZW5kYXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvY2FsZW5kYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI4MTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2NhbGVuZGFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OTg0ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzEwZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RldGFpbHNfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMzMyNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGV0YWlsc19lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YTJiYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3BsYXkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9wbGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxN2MxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3BsYXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9yZWNvcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9yZWNvcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzAwNGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfcmVjb3JkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfc2F2ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3NhdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTAwNDhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2RsY2wxNi9hY3Rpb25lbmdpbmVfc2F2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3N0b3AuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZGxjbDE2L2FjdGlvbmVuZ2luZV9zdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlZTlhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9kbGNsMTYvYWN0aW9uZW5naW5lX3N0b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9wbGF5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfcGxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OGZiNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9wbGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfcmVjb3JkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfcmVjb3JkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjY2ZlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3JlY29yZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3NhdmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9zYXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlN2I5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9lbGNsMTYvYWN0aW9uZW5naW5lX3NhdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9zdG9wLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2VsY2wxNi9hY3Rpb25lbmdpbmVfc3RvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzM2NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZWxjbDE2L2FjdGlvbmVuZ2luZV9zdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2V2aWV3MTYvYWN0aW9uZW5naW5lLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2V2aWV3MTYvYWN0aW9uZW5naW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2NGJjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9ldmlldzE2L2FjdGlvbmVuZ2luZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mYXZvcml0ZXNfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mYXZvcml0ZXNfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjAyNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2Zhdm9yaXRlc19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNjIyMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2Zhdm9yaXRlc19wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2Zhdm9yaXRlc19wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkwMDRiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZmF2b3JpdGVzX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2NWI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9sZGVyX2Nsb3NlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb2xkZXJfY2xvc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlMDI3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb2xkZXJfY2xvc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ZvbGRlcl9vcGVuLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ZvbGRlcl9vcGVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzMjJlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb2xkZXJfb3Blbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb3J3YXJkX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9yd2FyZF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzMTQzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb3J3YXJkX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvZm9yd2FyZF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb3J3YXJkX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmOGMzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9mb3J3YXJkX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF9mc19lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF9mc19lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwYzdhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9pbXBvcnRfZnNfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9pbXBvcnRfZnNfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvaW1wb3J0X2ZzX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ2ZDNlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9pbXBvcnRfZnNfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvaW1wb3J0X3RvX3dvcmtiZW5jaF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGEwN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvaW1wb3J0X3RvX3dvcmtiZW5jaF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvaW1wb3J0X3RvX3dvcmtiZW5jaF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODA4NWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2ltcG9ydF90b193b3JrYmVuY2hfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMva2V5bGluZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9rZXlsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4MDY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9rZXlsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2xhdW5jaF93c3dpemFyZF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2xhdW5jaF93c3dpemFyZF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1OGRjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9sYXVuY2hfd3N3aXphcmRfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9sYXVuY2hfd3N3aXphcmRfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGF1bmNoX3dzd2l6YXJkX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYwOTdkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9sYXVuY2hfd3N3aXphcmRfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGluZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9saW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxZTViNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9saW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2xpbmVfbGFzdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9saW5lX2xhc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjBlZjgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL2xpbmVfbGFzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9saW5lX25vdGxhc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbGluZV9ub3RsYXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5MmNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9saW5lX25vdGxhc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbWludXNfbGFzdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9taW51c19sYXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllYmI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9taW51c19sYXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL21pbnVzX25vdGxhc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbWludXNfbm90bGFzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjQzMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbWludXNfbm90bGFzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9uYXZpZ2F0b3IuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvbmF2aWdhdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjMDU2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9uYXZpZ2F0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcGx1c19sYXN0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3BsdXNfbGFzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGM4OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcGx1c19sYXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3BsdXNfbm90bGFzdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9wbHVzX25vdGxhc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdiZDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3BsdXNfbm90bGFzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkNWQxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5MDQyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3Jvb3RfbWFpbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9yb290X21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FkZTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3Jvb3RfbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9zcGFjZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy9zcGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTE5MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvc3BhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvc3RhdHVzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3N0YXR1cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTAwMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvc3RhdHVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3RvcF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3RvcF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1YmM5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90b3BfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90b3BfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdG9wX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxNjQ3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90b3BfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdHdpc3RjbG9zZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQzMzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyYzVmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy90d2lzdG9wZW5lZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy91ZGRpX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdWRkaV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFjYWIzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy91ZGRpX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvdWRkaV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy91ZGRpX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmYzBhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy91ZGRpX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzZGwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2RsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyYWNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2RsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9pbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2RsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4ZWZjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2RsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzaWxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWY4OGZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzaWxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2ltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzaWxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IzNWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvaW1hZ2VzL3dzaWxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9sYXVuY2hfb3B0aW9uc19yZWdpc3RyeS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2xhdW5jaF9vcHRpb25zX3JlZ2lzdHJ5LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwNWI0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL2xhdW5jaF9vcHRpb25zX3JlZ2lzdHJ5LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLldTRXhwbG9yZXJDb250ZXh0LAotICBqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gIGphdmEudXRpbC5IYXNodGFibGUsCi0gIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlVSTFV0aWxzIiAlPgotCi08JQotICBTdHJpbmcga2V5ID0gbnVsbDsKLSAgSGFzaHRhYmxlIG9wdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIEVudW1lcmF0aW9uIHBhcmFtTmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Ci0gIHdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKQotICB7Ci0gICAgU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpOwotICAgIFN0cmluZ1tdIHBhcmFtVmFsdWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1OYW1lKTsKLSAgICBpZiAocGFyYW1WYWx1ZXMgIT0gbnVsbCAmJiBwYXJhbVZhbHVlcy5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGlmIChrZXkgPT0gbnVsbCAmJiBVUkxVdGlscy5kZWNvZGUocGFyYW1OYW1lKS5lcXVhbHMoV1NFeHBsb3JlckNvbnRleHQuSUQpKQotICAgICAgICBrZXkgPSBwYXJhbVZhbHVlc1swXTsKLSAgICAgIGVsc2UKLSAgICAgICAgb3B0aW9ucy5wdXQocGFyYW1OYW1lLCBwYXJhbVZhbHVlcyk7Ci0gICAgfQotICB9Ci0gIGlmIChrZXkgIT0gbnVsbCkKLSAgewotICAgIExhdW5jaE9wdGlvbnNNYW5hZ2VyIG1hbmFnZXIgPSBMYXVuY2hPcHRpb25zTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotICAgIG1hbmFnZXIubWFuYWdlKGtleSwgb3B0aW9ucywgYXBwbGljYXRpb24pOwotICB9Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvcGVyc3BlY3RpdmVfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYmFkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QRVJTUEVDVElWRV9DT05URU5UIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNob3dQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKGNvbnRyb2xsZXIuZ2V0Q3VycmVudFBlcnNwZWN0aXZlKCkuZ2V0UGVyc3BlY3RpdmVJZCgpLGZhbHNlKSkpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3BlcnNwZWN0aXZlX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9wZXJzcGVjdGl2ZV90b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4NGJiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3BlcnNwZWN0aXZlX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5lbmdpbmUuQWN0aW9uRW5naW5lIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi1TdHJpbmdCdWZmZXIgaHJlZkFjdGlvbkVuZ2luZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLWhyZWZBY3Rpb25FbmdpbmUuYXBwZW5kKHJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiYWN0aW9uZW5naW5lX2NvbnRhaW5lci5qc3AiKSkpOwotaHJlZkFjdGlvbkVuZ2luZS5hcHBlbmQoIj8iKTsKLWhyZWZBY3Rpb25FbmdpbmUuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotaHJlZkFjdGlvbkVuZ2luZS5hcHBlbmQoIj0iKTsKLWhyZWZBY3Rpb25FbmdpbmUuYXBwZW5kKHNlc3Npb24uZ2V0SWQoKSk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QRVJTUEVDVElWRV9UT09MQkFSIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3Rvb2xiYXIuY3NzIikpJT4iPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90b29sYmFyLmpzIikpJT4iPgotICA8L3NjcmlwdD4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgZnVuY3Rpb24gb3BlbkFjdGlvbkVuZ2luZUNvbnRhaW5lcigpCi0gICAgewotICAgICAgdmFyIGxpbmsgPSAiPCU9aHJlZkFjdGlvbkVuZ2luZS50b1N0cmluZygpJT4iOwotICAgICAgdmFyIGFjdGlvbkVuZ2luZUNvbnRhaW5lciA9IHdpbmRvdy5vcGVuKGxpbmssImFjdGlvbkVuZ2luZUNvbnRhaW5lciIsImhlaWdodD0xMDAsd2lkdGg9MzUwLHN0YXR1cz15ZXMsc2Nyb2xsYmFycz15ZXMscmVzaXphYmxlPXllcyIpOwotICAgICAgaWYgKGFjdGlvbkVuZ2luZUNvbnRhaW5lci5mb2N1cykKLSAgICAgICAgYWN0aW9uRW5naW5lQ29udGFpbmVyLmZvY3VzKCk7Ci0gICAgfQotICA8L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJndG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0iZ2xvYmFsdG9vbGJhciI+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0idGV4dCIgbm93cmFwIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IjEwMCUiIGhlaWdodD0yNT48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIlRJVExFX1dTRVhQTE9SRVIiKSU+PC90ZD4KLSAgICA8JQotICAgIFN0cmluZyBhbHRIaXN0b3J5QmFjayA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0JBQ0siKTsKLSAgICBTdHJpbmcgYWx0SGlzdG9yeUZvcndhcmQgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9GT1JXQVJEIik7Ci0gICAgU3RyaW5nIGFsdEFjdGlvbkVuZ2luZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0FDVElPTl9FTkdJTkUiKTsKLSAgICBTdHJpbmcgYWx0VURESSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1VERElfUEVSU1BFQ1RJVkUiKTsKLSAgICBTdHJpbmcgYWx0V1NJTCA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1dTSUxfUEVSU1BFQ1RJVkUiKTsKLSAgICBTdHJpbmcgYWx0V1NETCA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1dTRExfUEVSU1BFQ1RJVkUiKTsKLSAgICBTdHJpbmcgYWx0RmF2b3JpdGVzID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRkFWT1JJVEVTX1BFUlNQRUNUSVZFIik7Ci0gICAgJT4gICAKLSAgICA8dGQgY2xhc3M9InRleHQiIG5vd3JhcCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MTYgaGVpZ2h0PTI2PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZXRyaWV2ZUhpc3RvcnlBY3Rpb24uZ2V0QWN0aW9uTGluayhBY3Rpb25JbnB1dHMuSlVNUF9CQUNLKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIGFsdD0iPCU9YWx0SGlzdG9yeUJhY2slPiIgdGl0bGU9IjwlPWFsdEhpc3RvcnlCYWNrJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvYmFja19lbmFibGVkLmdpZiIpKSU+IiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9iYWNrX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcyk7IiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2JhY2tfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2JhY2tfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2JhY2tfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSI+PC9hPjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJ0ZXh0IiBub3dyYXAgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJldHJpZXZlSGlzdG9yeUFjdGlvbi5nZXRBY3Rpb25MaW5rKEFjdGlvbklucHV0cy5KVU1QX0ZPUldBUkQpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgYWx0PSI8JT1hbHRIaXN0b3J5Rm9yd2FyZCU+IiB0aXRsZT0iPCU9YWx0SGlzdG9yeUZvcndhcmQlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9mb3J3YXJkX2VuYWJsZWQuZ2lmIikpJT4iIG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2ZvcndhcmRfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKTsiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZm9yd2FyZF9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZm9yd2FyZF9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZm9yd2FyZF9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIj48L2E+PC90ZD4KLSAgICA8JQotICAgIEFjdGlvbkVuZ2luZSBhY3Rpb25FbmdpbmUgPSBjb250cm9sbGVyLmdldEFjdGlvbkVuZ2luZSgpOwotICAgIGlmIChhY3Rpb25FbmdpbmUgIT0gbnVsbCAmJiBhY3Rpb25FbmdpbmUuZ2V0TW9kZSgpICE9IEFjdGlvbkVuZ2luZS5NT0RFX0RJU0FCTEVEKQotICAgIHsKLSAgICAlPgotICAgICAgPHRkIGNsYXNzPSJ0ZXh0IiBub3dyYXAgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiBoZWlnaHQ9MjU+PGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuQWN0aW9uRW5naW5lQ29udGFpbmVyKCkiPjxpbWcgY2xhc3M9Im5vcm1hbCIgYWx0PSI8JT1hbHRBY3Rpb25FbmdpbmUlPiIgdGl0bGU9IjwlPWFsdEFjdGlvbkVuZ2luZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2V2aWV3MTYvYWN0aW9uZW5naW5lLmdpZiIpKSU+IiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9ldmlldzE2L2FjdGlvbmVuZ2luZS5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpOyIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9ldmlldzE2L2FjdGlvbmVuZ2luZS5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2V2aWV3MTYvYWN0aW9uZW5naW5lLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9ldmlldzE2L2FjdGlvbmVuZ2luZS5naWYiKSklPic7bW91c2V1cCh0aGlzKSI+PC9hPjwvdGQ+Ci0gICAgPCUKLSAgICB9Ci0gICAgJT4KLSAgICA8dGQgY2xhc3M9InRleHQiIG5vd3JhcCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREksZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgYWx0PSI8JT1hbHRVRERJJT4iIHRpdGxlPSI8JT1hbHRVRERJJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdWRkaV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+IiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy91ZGRpX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcyk7IiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3VkZGlfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3VkZGlfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3VkZGlfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSI+PC9hPjwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJ0ZXh0IiBub3dyYXAgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNob3dQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9XU0lMLGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIGFsdD0iPCU9YWx0V1NJTCU+IiB0aXRsZT0iPCU9YWx0V1NJTCU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3dzaWxfcGVyc3BlY3RpdmVfZW5hYmxlZC5naWYiKSklPiIgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NpbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpOyIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy93c2lsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiPjwvYT48L3RkPgotICAgIDx0ZCBjbGFzcz0idGV4dCIgbm93cmFwIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETCxmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBhbHQ9IjwlPWFsdFdTREwlPiIgdGl0bGU9IjwlPWFsdFdTREwlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy93c2RsX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIikpJT4iIG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3dzZGxfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKTsiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NkbF9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIj48L2E+PC90ZD4gICAgCi0gICAgPHRkIGNsYXNzPSJ0ZXh0IiBub3dyYXAgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNob3dQZXJzcGVjdGl2ZUFjdGlvbi5nZXRBY3Rpb25MaW5rKEFjdGlvbklucHV0cy5QRVJTUEVDVElWRV9GQVZPUklURVMsZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgYWx0PSI8JT1hbHRGYXZvcml0ZXMlPiIgdGl0bGU9IjwlPWFsdEZhdm9yaXRlcyU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2Zhdm9yaXRlc19wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+IiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKTsiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvZmF2b3JpdGVzX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9mYXZvcml0ZXNfcGVyc3BlY3RpdmVfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2Zhdm9yaXRlc19wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIj48L2E+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODEzNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotLy8KLQotZnVuY3Rpb24gaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkKLXsKLSAgcmV0dXJuIG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2NhbGVuZGFyYnJvd3Nlci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvY2FsZW5kYXJicm93c2VyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliOWNhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvY2FsZW5kYXJicm93c2VyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSBzZXNzaW9uLmdldElkKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciBjYWxlbmRhckJyb3dzZXI7Ci0gIHZhciBjYWxlbmRhckJyb3dzZXJDbG9zZWQgPSB0cnVlOwotICB2YXIgY2FsZW5kYXJUYXJnZXRSb3cgPSAtMTsKLSAgdmFyIGNhbGVuZGFyVGFyZ2V0OwotCi0gIGZ1bmN0aW9uIG9wZW5DYWxlbmRhckJyb3dzZXIodHlwZSxmb3JtQ29udGFpbmVySWQsZWxlbWVudE5hbWUsaW5kZXgpCi0gIHsKLSAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1Db250YWluZXJJZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHZhciBlbGVtZW50cyA9IGZvcm0uZWxlbWVudHNbZWxlbWVudE5hbWVdOwotICAgIGlmIChpbmRleCA9PSAwICYmIGVsZW1lbnRzLmxlbmd0aCA9PSB1bmRlZmluZWQpCi08JQotICAgLy8gT25seSBvbmUgZWxlbWVudC4KLSU+Ci0gICAgICBjYWxlbmRhclRhcmdldCA9IGVsZW1lbnRzOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjYWxlbmRhclRhcmdldFJvdyA9IGluZGV4OwotICAgICAgY2FsZW5kYXJUYXJnZXQgPSBlbGVtZW50cy5pdGVtKGluZGV4KTsKLSAgICB9Ci0gICAgdmFyIGxpbms7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfREFURSU+OgotICAgICAgICBsaW5rID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuQ2FsZW5kYXJCcm93c2VyQWN0aW9uLmdldEFjdGlvbkxpbmtGb3JEYXRlKHNlc3Npb25JZCkpKSU+IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0RBVEVUSU1FJT46Ci0gICAgICAgIGxpbmsgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uZ2V0QWN0aW9uTGlua0ZvckRhdGVUaW1lKHNlc3Npb25JZCkpKSU+IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5DQUxFTkRBUl9UWVBFX0dZRUFSTU9OVEglPjoKLSAgICAgICAgbGluayA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlbkNhbGVuZGFyQnJvd3NlckFjdGlvbi5nZXRBY3Rpb25MaW5rRm9yR1llYXJNb250aChzZXNzaW9uSWQpKSklPiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA8JT1BY3Rpb25JbnB1dHMuQ0FMRU5EQVJfVFlQRV9HREFZJT46Ci0gICAgICAgIGxpbmsgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uZ2V0QWN0aW9uTGlua0ZvckdEYXkoc2Vzc2lvbklkKSkpJT4iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgPCU9QWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEVfR01PTlRIREFZJT46Ci0gICAgICAgIGxpbmsgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5DYWxlbmRhckJyb3dzZXJBY3Rpb24uZ2V0QWN0aW9uTGlua0ZvckdNb250aERheShzZXNzaW9uSWQpKSklPiI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYWxlbmRhckJyb3dzZXIgPSB3aW5kb3cub3BlbihsaW5rLCJjYWxlbmRhckJyb3dzZXIiLCJoZWlnaHQ9MzUwLHdpZHRoPTI2NCxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMiKTsKLSAgICBpZiAoY2FsZW5kYXJCcm93c2VyLmZvY3VzKQotICAgICAgY2FsZW5kYXJCcm93c2VyLmZvY3VzKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBjbG9zZUNhbGVuZGFyQnJvd3NlcigpCi0gIHsKLSAgICBpZiAoIWNhbGVuZGFyQnJvd3NlckNsb3NlZCkKLSAgICAgIGNhbGVuZGFyQnJvd3Nlci5jbG9zZSgpOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzYjRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIHJlcXVlc3RTdWJtaXR0ZWQgPSBmYWxzZTsKLQotICBmdW5jdGlvbiBoYW5kbGVTdWJtaXQoZm9ybSkKLSAgewotICAgIGlmIChyZXF1ZXN0U3VibWl0dGVkKQotICAgIHsKLSAgICAgIGFsZXJ0KCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfU1VCTUlUX0lOX1BST0dSRVNTIikpJT4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmVxdWVzdFN1Ym1pdHRlZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBmdW5jdGlvbiByZXNldFN1Ym1pc3Npb24oKQotICB7Ci0gICAgcmVxdWVzdFN1Ym1pdHRlZCA9IGZhbHNlOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2Zvcm11dGlscy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWM4MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL2Zvcm11dGlscy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICA8JS8vIFJlcXVpcmVzIGJyb3dzZXJkZXRlY3QuanMlPgotICBmdW5jdGlvbiBjcmVhdGVIaWRkZW5FbGVtZW50KGVsZW1lbnROYW1lLHZhbHVlKQotICB7Ci0gICAgdmFyIGhpZGRlbklucHV0OwotICAgIGlmIChlbGVtZW50TmFtZS5sZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgICAgICAgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCI8aW5wdXQgbmFtZT0nIitlbGVtZW50TmFtZSsiJz4iKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgICBoaWRkZW5JbnB1dC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGVsZW1lbnROYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgaGlkZGVuSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGhpZGRlbklucHV0LnR5cGUgPSAiaGlkZGVuIjsKLSAgICBoaWRkZW5JbnB1dC52YWx1ZSA9IHZhbHVlOwotICAgIHJldHVybiBoaWRkZW5JbnB1dDsKLSAgfQotCi0gIGZ1bmN0aW9uIHJlc2V0Rm9ybUlucHV0cygpCi0gIHsKLSAgICBkb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQoKTsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvcGFuZXMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3BhbmVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2OWMyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvcGFuZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciBwZXJzcGVjdGl2ZVdvcmtBcmVhID0gdG9wLmZyYW1lc1siPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Il07Ci0gIHZhciBwZXJzcGVjdGl2ZVRvb2xiYXIgPSB0b3AuZnJhbWVzWyI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1RPT0xCQVIlPiJdOwotICB2YXIgcGVyc3BlY3RpdmVDb250ZW50ID0gdG9wLmZyYW1lc1siPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9DT05URU5UJT4iXTsKLQotICBmdW5jdGlvbiBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFtZXNldCIpLml0ZW0oMCk7Ci0gIH0KLQotICBmdW5jdGlvbiB0b2dnbGVEb3VibGVDbGlja0NvbHVtblRpdGxlKCkKLSAgewotICAgIHZhciBkb3VibGVDbGlja0NvbHVtbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkb3VibGVjbGlja2NvbHVtbiIpOwotICAgIGlmIChkb3VibGVDbGlja0NvbHVtbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotPCUKLSAgIFN0cmluZyBqc0FsdFJlc3RvcmUgPSBIVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKSk7Ci0lPgotICAgIGlmIChkb3VibGVDbGlja0NvbHVtbi50aXRsZSA9PSAiPCU9anNBbHRSZXN0b3JlJT4iKQotICAgICAgZG91YmxlQ2xpY2tDb2x1bW4udGl0bGUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpKSU+IjsKLSAgICBlbHNlCi0gICAgICBkb3VibGVDbGlja0NvbHVtbi50aXRsZSA9ICI8JT1qc0FsdFJlc3RvcmUlPiI7Ci0gIH0KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3Jlc3VtZXByb3h5bG9hZHBhZ2UuanMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMTU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0vLwotCi1mdW5jdGlvbiByZXN1bWVQcm94eUxvYWRQYWdlKCkKLXsKLSAgdmFyIHByb3h5UGFnZSA9IHBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJveHlQYWdlIik7Ci0gIHByb3h5UGFnZS5zZXRBdHRyaWJ1dGUoInJvd3MiLCAiMCwxMDAlIik7Ci0gIHBhcmVudC5mcmFtZXNbMF0uaGFuZGxlQ29tcGxldGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3N3aXRjaHBlcnNwZWN0aXZlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy9zd2l0Y2hwZXJzcGVjdGl2ZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTY3MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3N3aXRjaHBlcnNwZWN0aXZlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotCi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoY29udHJvbGxlci5nZXRDdXJyZW50UGVyc3BlY3RpdmUoKS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRQYWdlKCkpKSU+IjsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3RhYmxlcy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvdGFibGVzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhMjRlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvdGFibGVzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIG51bWJlck9mSGVhZGVyUm93cyA9IDE7Ci0gIGZ1bmN0aW9uIGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJZCk7Ci0gICAgcmV0dXJuIGNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKS5pdGVtKDApOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0U2VsZWN0KHNlbGVjdCx2YWx1ZSkKLSAgewotICAgIGZvciAodmFyIGk9MDtpPHNlbGVjdC5vcHRpb25zLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKHNlbGVjdC5vcHRpb25zW2ldLnZhbHVlID09IHZhbHVlKQotICAgICAgewotICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGk7Ci0gICAgICAgIHJldHVybiBzZWxlY3Qub3B0aW9uc1tpXS50ZXh0OwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHJlbW92ZVNlbGVjdGVkUm93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICB7Ci0gICAgICAgIHRhYmxlLmRlbGV0ZVJvdyhpKTsKLSAgICAgICAgaS0tOwotICAgICAgfQotICAgIH0KLSAgICB2YXIgY2hlY2tBbGxDaGVja2JveFJvdyA9IHRhYmxlLnJvd3NbMF07Ci0gICAgdmFyIGNoZWNrQWxsQ2hlY2tib3ggPSBjaGVja0FsbENoZWNrYm94Um93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgaWYgKGNoZWNrQWxsQ2hlY2tib3guY2hlY2tlZCkKLSAgICAgIGNoZWNrQWxsQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlOwotICB9Ci0KLSAgZnVuY3Rpb24gaGFuZGxlUm93Q2hlY2tib3hDbGljayhlKQotICB7Ci0gICAgdmFyIGNoZWNrYm94OwotICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgICAgIGNoZWNrYm94ID0gZXZlbnQuc3JjRWxlbWVudDsKLSAgICBlbHNlCi0gICAgICBjaGVja2JveCA9IGUudGFyZ2V0OwotICAgIHZhciBjZWxsID0gY2hlY2tib3gucGFyZW50Tm9kZTsKLSAgICB2YXIgcm93ID0gY2VsbC5wYXJlbnROb2RlOwotICAgIGlmIChjaGVja2JveC5jaGVja2VkKQotICAgICAgaGlnaGxpZ2h0Um93KHJvdywicm93Y29sb3IiKTsKLSAgICBlbHNlCi0gICAgICBoaWdobGlnaHRSb3cocm93LCJ0YWJsZWNlbGxzIik7Ci0KLSAgICB2YXIgdGJvZHkgPSByb3cucGFyZW50Tm9kZTsKLSAgICB2YXIgdGFibGUgPSB0Ym9keS5wYXJlbnROb2RlOwotICAgIHZhciBjaGVja0FsbENoZWNrYm94ID0gdGFibGUucm93c1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgIGlmIChjaGVja0FsbENoZWNrYm94LmNoZWNrZWQpCi0gICAgICBjaGVja0FsbENoZWNrYm94LmNoZWNrZWQgPSBmYWxzZTsKLSAgfQotCi0gIGZ1bmN0aW9uIGNyZWF0ZVJvd0NoZWNrYm94KCkKLSAgewotICAgIHZhciByb3dDaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgcm93Q2hlY2tib3guc2V0QXR0cmlidXRlKCJuYW1lIixyb3dDaGVja2JveE5hbWUpOwotICAgIHJvd0NoZWNrYm94LnR5cGUgPSAiY2hlY2tib3giOwotICAgIHJvd0NoZWNrYm94LnRpdGxlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpKSU+IjsKLSAgICByb3dDaGVja2JveC5vbmNsaWNrID0gaGFuZGxlUm93Q2hlY2tib3hDbGljazsKLSAgICByZXR1cm4gcm93Q2hlY2tib3g7Ci0gIH0KLQotICBmdW5jdGlvbiBoYW5kbGVDaGVja0FsbENsaWNrKHRhYmxlQ29udGFpbmVySWQsY2hlY2tBbGxDaGVja2JveCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveENlbGwgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLml0ZW0oMCk7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSByb3dDaGVja2JveENlbGwuY2hpbGROb2Rlc1swXTsKLSAgICAgIHJvd0NoZWNrYm94LmNoZWNrZWQgPSBjaGVja0FsbENoZWNrYm94LmNoZWNrZWQ7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgaGlnaGxpZ2h0Um93KHRhYmxlLnJvd3NbaV0sInJvd2NvbG9yIik7Ci0gICAgICBlbHNlCi0gICAgICAgIGhpZ2hsaWdodFJvdyh0YWJsZS5yb3dzW2ldLCJ0YWJsZWNlbGxzIik7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gaGlnaGxpZ2h0Um93KHJvdyxjbGFzc05hbWUpCi0gIHsKLSAgICB2YXIgcm93Q29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICBmb3IgKHZhciBpPTE7aTxyb3dDb2x1bW5zLmxlbmd0aDtpKyspCi0gICAgICByb3dDb2x1bW5zLml0ZW0oaSkuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICB9Ci0KLSAgZnVuY3Rpb24gaGlnaGxpZ2h0RXJyYW50Um93KHJvdyxjbGFzc05hbWUpCi0gIHsKLSAgICB2YXIgcm93Q29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY29sdW1uMCA9IHJvd0NvbHVtbnMuaXRlbSgwKTsKLSAgICB2YXIgY29sdW1uMENvbnRyb2wgPSBjb2x1bW4wLmNoaWxkTm9kZXNbMF07Ci0gICAgdmFyIHN0YXJ0OwotICAgIGlmIChjb2x1bW4wQ29udHJvbC50eXBlID09ICJjaGVja2JveCIpCi0gICAgewotICAgICAgY29sdW1uMENvbnRyb2wuY2hlY2tlZCA9IHRydWU7Ci0gICAgICByb3dDb2x1bW5zLml0ZW0oMSkuY2xhc3NOYW1lID0gImZpcnN0Y29sdW1uZXJyYW50cm93Y29sb3IiOwotICAgICAgc3RhcnQgPSAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29sdW1uMC5jbGFzc05hbWUgPSAiZmlyc3Rjb2x1bW5lcnJhbnRyb3djb2xvciI7Ci0gICAgICBzdGFydCA9IDE7Ci0gICAgfQotICAgIHJvd0NvbHVtbnMuaXRlbShyb3dDb2x1bW5zLmxlbmd0aC0xKS5jbGFzc05hbWUgPSAibGFzdGNvbHVtbmVycmFudHJvd2NvbG9yIjsKLSAgICBmb3IgKHZhciBpPXN0YXJ0O2k8cm93Q29sdW1ucy5sZW5ndGgtMTtpKyspCi0gICAgICByb3dDb2x1bW5zLml0ZW0oaSkuY2xhc3NOYW1lID0gIm1pZGRsZWVycmFudHJvd2NvbG9yIjsKLSAgfQotCi0gIGZ1bmN0aW9uIHR3aXN0KHRhYmxlQ29udGFpbmVySWQsdHdpc3RJbWFnZU5hbWUpCi0gIHsKLSAgICB2YXIgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdHdpc3RJbWFnZSA9IGRvY3VtZW50LmltYWdlc1t0d2lzdEltYWdlTmFtZV07Ci0gICAgaWYgKHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKQotICAgIHsKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIHR3aXN0SW1hZ2Uuc3JjID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IjsKLSAgICAgIHR3aXN0SW1hZ2UuYWx0ID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSklPiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgdHdpc3RJbWFnZS5zcmMgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iOwotICAgICAgdHdpc3RJbWFnZS5hbHQgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpKSU+IjsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiB0d2lzdE9wZW4odGFibGVDb250YWluZXJJZCkKLSAgewotICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUNvbnRhaW5lcklkKS5zdHlsZS5kaXNwbGF5ID09ICJub25lIikKLSAgICAgIHR3aXN0KHRhYmxlQ29udGFpbmVySWQsIngiK3RhYmxlQ29udGFpbmVySWQpOwotICB9Ci0KLSAgZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXlTdHJpbmcoaW5wdXRWYWx1ZSkKLSAgewotICAgIGlmIChpbnB1dFZhbHVlID09IG51bGwgfHwgaW5wdXRWYWx1ZS5sZW5ndGggPCAxKQotICAgICAgcmV0dXJuICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJUQUJMRV9CTEFOS19QTEFDRUhPTERFUiIpKSU+IjsKLSAgICByZXR1cm4gaW5wdXRWYWx1ZTsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvdG9vbGJhci5qcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy90b29sYmFyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIxYjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy90b29sYmFyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLS8vCi0KLWZ1bmN0aW9uIG1vdXNlb3ZlcihpbWcpCi17Ci0gIGltZy5jbGFzc05hbWUgPSAiaG92ZXIiOwotfQotCi1mdW5jdGlvbiBtb3VzZW91dChpbWcpCi17Ci0gIGltZy5jbGFzc05hbWUgPSAibm9ybWFsIjsKLX0KLQotZnVuY3Rpb24gbW91c2Vkb3duKGltZykKLXsKLSAgaW1nLmNsYXNzTmFtZSA9ICJkb3duIjsKLX0KLQotZnVuY3Rpb24gbW91c2V1cChpbWcpCi17Ci0gIHJldHVybiBtb3VzZW91dChpbWcpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy90cmVldmlldy5qcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvc2NyaXB0cy90cmVldmlldy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4NDNmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvdHJlZXZpZXcuanMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLwotLy8gQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotLy8KLQotLy8gUmVxdWlyZXMgYnJvd3NlcmRldGVjdC5qcwotCi12YXIgc2VsZWN0ZWRBbmNob3JOYW1lID0gIiI7Ci0KLWZ1bmN0aW9uIHNldFNlbGVjdGVkQW5jaG9yTmFtZShhbmNob3JOYW1lKQotewotICBzZWxlY3RlZEFuY2hvck5hbWUgPSBhbmNob3JOYW1lOwotfQotCi1mdW5jdGlvbiBzZWxlY3ROb2RlKGFuY2hvck5hbWUsb3BlbkltYWdlUGF0aCkKLXsKLSAgdmFyIGlzSUUgPSBpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKTsKLSAgaWYgKHNlbGVjdGVkQW5jaG9yTmFtZS5sZW5ndGggPiAwKQotICB7Ci0gICAgdmFyIHNlbGVjdGVkQW5jaG9yOwotICAgIGlmIChpc0lFKQotICAgICAgc2VsZWN0ZWRBbmNob3IgPSBkb2N1bWVudC5hbmNob3JzKHNlbGVjdGVkQW5jaG9yTmFtZSk7Ci0gICAgZWxzZQotICAgICAgc2VsZWN0ZWRBbmNob3IgPSBkb2N1bWVudC5hbmNob3JzW3NlbGVjdGVkQW5jaG9yTmFtZV07Ci0gICAgaWYgKHNlbGVjdGVkQW5jaG9yKQotICAgICAgc2VsZWN0ZWRBbmNob3IuY2xhc3NOYW1lID0gInVuc2VsZWN0ZWRUZXh0QW5jaG9yIjsKLSAgfQotICBpZiAoYW5jaG9yTmFtZS5pbmRleE9mKCItMSIpID09IC0xKQotICB7Ci0gICAgaWYgKGlzSUUpCi0gICAgICBkb2N1bWVudC5hbmNob3JzKGFuY2hvck5hbWUpLmNsYXNzTmFtZSA9ICJzZWxlY3RlZFRleHRBbmNob3IiOwotICAgIGVsc2UKLSAgICAgIGRvY3VtZW50LmFuY2hvcnNbYW5jaG9yTmFtZV0uY2xhc3NOYW1lID0gInNlbGVjdGVkVGV4dEFuY2hvciI7Ci0gICAgc2V0U2VsZWN0ZWRBbmNob3JOYW1lKGFuY2hvck5hbWUpOwotICAgIGFsdGVySW1hZ2UoYW5jaG9yTmFtZSxvcGVuSW1hZ2VQYXRoKTsKLSAgfQotICBlbHNlCi0gICAgc2V0U2VsZWN0ZWRBbmNob3JOYW1lKCIiKTsKLX0KLQotZnVuY3Rpb24gYWx0ZXJJbWFnZShpbWFnZU5hbWUsaW1hZ2VQYXRoKQotewotICBkb2N1bWVudC5pbWFnZXNbaW1hZ2VOYW1lXS5zcmMgPSBpbWFnZVBhdGg7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvd3NkbGJyb3dzZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci9zY3JpcHRzL3dzZGxicm93c2VyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0NWE3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3NjcmlwdHMvd3NkbGJyb3dzZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHNlc3Npb24uZ2V0SWQoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIHdzZGxXaW5kb3c7Ci0gIHZhciB3c2RsV2luZG93Q2xvc2VkID0gdHJ1ZTsKLSAgdmFyIHRhcmdldFdTRExVUkxFbGVtZW50OwotICBmdW5jdGlvbiBvcGVuV1NETEJyb3dzZXIoZm9ybUNvbnRhaW5lcklkLHR5cGUpCi0gIHsKLSAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1Db250YWluZXJJZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHRhcmdldFdTRExVUkxFbGVtZW50ID0gZm9ybS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPjsKLSAgICB2YXIgbGluazsKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgY2FzZSA8JT1BY3Rpb25JbnB1dHMuV1NETF9UWVBFX1NFUlZJQ0UlPjoKLSAgICAgICAgbGluayA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlbldTRExCcm93c2VyQWN0aW9uLmdldEFjdGlvbkxpbmtGb3JTZXJ2aWNlKHNlc3Npb25JZCkpKSU+IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDwlPUFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0UlPjoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGxpbmsgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5XU0RMQnJvd3NlckFjdGlvbi5nZXRBY3Rpb25MaW5rRm9yU2VydmljZUludGVyZmFjZShzZXNzaW9uSWQpKSklPiI7Ci0gICAgfQotICAgIHdzZGxXaW5kb3cgPSB3aW5kb3cub3BlbihsaW5rLCJ3c2RsV2luZG93IiwiaGVpZ2h0PTMwMCx3aWR0aD00NTAsc3RhdHVzPXllcyxzY3JvbGxiYXJzPXllcyxyZXNpemFibGU9eWVzIik7Ci0gICAgaWYgKHdzZGxXaW5kb3cuZm9jdXMpCi0gICAgICB3c2RsV2luZG93LmZvY3VzKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBjbG9zZVdTRExCcm93c2VyKCkKLSAgewotICAgIGlmICghd3NkbFdpbmRvd0Nsb3NlZCkKLSAgICAgIHdzZGxXaW5kb3cuY2xvc2UoKTsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9BZGRJdGVtc1RvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0FkZEl0ZW1zVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDgyMGM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0FkZEl0ZW1zVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBuZXcgQWRkSXRlbXNUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9BZGRQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0FkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NhMDY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0FkZFB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBBZGRQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGFjdGlvbiA9IG5ldyBBZGRQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoaW5wdXRzVmFsaWQpCi0gICB7Ci0gICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gICB9Ci0lPgotCi0gICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgcHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgIHN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgIDwvc2NyaXB0PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9BZGRUb0Zhdm9yaXRlc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9BZGRUb0Zhdm9yaXRlc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZDY1MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24iJT4KLQotCi08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgQWRkVG9GYXZvcml0ZXNBY3Rpb24gYWN0aW9uID0gbmV3IEFkZFRvRmF2b3JpdGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0J1c1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYmU1MDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uCi0gICBCdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uIGFjdGlvbiA9IG5ldyBCdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoIWFjdGlvbi5pc1N1YlF1ZXJ5SW5pdGlhdGVkKCkpCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0J1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0J1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmM2Q4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9CdXNQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24gYWN0aW9uID0gbmV3IEJ1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9CdXNpbmVzc0dldFNlcnZpY2VzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0J1c2luZXNzR2V0U2VydmljZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWU1ZDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0J1c2luZXNzR2V0U2VydmljZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIEJ1c2luZXNzR2V0U2VydmljZXNBY3Rpb24gYWN0aW9uID0gbmV3IEJ1c2luZXNzR2V0U2VydmljZXNBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGJvb2xlYW4gYnVzaW5lc3NFeGlzdHMgPSBhY3Rpb24udmFsaWRhdGVCdXNpbmVzcygpOwotCi0gICBpZiAoIWJ1c2luZXNzRXhpc3RzKQotICAgewotICAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKShhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSkpOwotICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1JFTU9WRV9CVVNJTkVTU19OT0RFIikpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChDbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9DaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlmNmNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9DaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiJT4KLQotCi08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9BZGRUb0Zhdm9yaXRlc0FjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+Ci08JQotRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLXdoaWxlIChwYXJhbU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gIFN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKXBhcmFtTmFtZXMubmV4dEVsZW1lbnQoKTsKLSAgU3RyaW5nW10gcGFyYW1WYWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbU5hbWUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0lPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPXBhcmFtTmFtZSU+IiB2YWx1ZT0iPCU9cGFyYW1WYWx1ZXNbaV0lPiI+Ci08JQotICB9Ci19Ci0lPgotPC9mb3JtPgotPC9ib2R5PgotPC9odG1sPgotCi08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotQWRkVG9GYXZvcml0ZXNBY3Rpb24gYWN0aW9uID0gbmV3IEFkZFRvRmF2b3JpdGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotaWYgKGFjdGlvbi5mYXZvcml0ZUV4aXN0cygpKSB7Ci0lPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVMiKSklPiIpKQotICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLWVsc2UgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkZWM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbiBhY3Rpb247Ci0gICBpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgRm9sZGVyTm9kZSkKLSAgICAgYWN0aW9uID0gbmV3IENsZWFyTmF2aWdhdG9yRm9sZGVyTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLSAgIGVsc2UKLSAgICAgYWN0aW9uID0gbmV3IENsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gVGhlIGFjdGlvbiBtYXkgYmUgZXhlY3V0ZWQgcHJvZ3JhbW1lZCBsaW5rLgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIAotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IHRydWU7Ci0gICAKLSAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0NsZWFyTm9kZUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTZkMTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbiBhY3Rpb24gPSBuZXcgQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQ29tcGxldGVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0NvbXBsZXRlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NzYyNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvQ29tcGxldGVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgQ29tcGxldGVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGFjdGlvbiA9IG5ldyBDb21wbGV0ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGlmIChpbnB1dHNWYWxpZCkKLSAgIHsKLSAgICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgIH0KLSU+Ci0KLSAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgPC9zY3JpcHQ+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0xhdW5jaFN1YlF1ZXJ5QWN0aW9uLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL0xhdW5jaFN1YlF1ZXJ5QWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiZmVlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlCi0gICBTdHJpbmcgc3ViUXVlcnlLZXkgPSBhY3Rpb24uZ2V0U3ViUXVlcnlLZXkoKTsKLSAgIFN0cmluZ0J1ZmZlciBuZXdTdWJRdWVyeUtleSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgIGlmIChzdWJRdWVyeUtleSAhPSBudWxsICYmIHN1YlF1ZXJ5S2V5Lmxlbmd0aCgpID4gMCkKLSAgICAgbmV3U3ViUXVlcnlLZXkuYXBwZW5kKGFjdGlvbi5nZXRTdWJRdWVyeUtleSgpKS5hcHBlbmQoJzonKTsKLSAgIG5ld1N1YlF1ZXJ5S2V5LmFwcGVuZChhY3Rpb24uZ2V0TmV3U3ViUXVlcnkoKSk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbClhY3Rpb24uZ2V0U2VsZWN0ZWRGb3JtVG9vbCgpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHBhcmVudEZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHN1YlF1ZXJ5Rm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhuZXdTdWJRdWVyeUtleS50b1N0cmluZygpKTsKLSAgIFN0cmluZyBuZXdTdWJRdWVyeUl0ZW1TdHJpbmcgPSBhY3Rpb24uZ2V0TmV3U3ViUXVlcnlJdGVtKCk7Ci0gICBzdWJRdWVyeUZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNLG5ld1N1YlF1ZXJ5SXRlbVN0cmluZyk7Ci0gICBzdWJRdWVyeUZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQsbmV3IEJvb2xlYW4oYWN0aW9uLmlzU3ViUXVlcnlHZXQoKSkpOwotICAgCi0gICAvLyBBbHdheXMgaW5pdGlhbGl6ZSB0aGUgcXVlcnkgbmFtZSBzbyB0aGUgc3VicXVlcnkgbWFrZXMgc2Vuc2UuCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyBwYXJlbnRRdWVyeU5hbWUgPSAoU3RyaW5nKXBhcmVudEZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FKTsKLSAgIGlmIChwYXJlbnRRdWVyeU5hbWUgPT0gbnVsbCkKLSAgICAgcGFyZW50UXVlcnlOYW1lID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkRFRkFVTFRfUVVFUllfTkFNRSIpOwotICAgaW50IG5ld1N1YlF1ZXJ5SXRlbSA9IEludGVnZXIucGFyc2VJbnQobmV3U3ViUXVlcnlJdGVtU3RyaW5nKTsKLSAgIFN0cmluZyBuZXdTdWJRdWVyeUl0ZW1UeXBlU3RyaW5nID0gbnVsbDsKLSAgIHN3aXRjaCAobmV3U3ViUXVlcnlJdGVtKQotICAgewotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTOgotICAgICAgIG5ld1N1YlF1ZXJ5SXRlbVR5cGVTdHJpbmcgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQlVTSU5FU1NFUyIpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICBuZXdTdWJRdWVyeUl0ZW1UeXBlU3RyaW5nID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VTIik7Ci0gICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUzoKLSAgICAgZGVmYXVsdDoKLSAgICAgICBuZXdTdWJRdWVyeUl0ZW1UeXBlU3RyaW5nID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUyIpOwotICAgfQotICAgU3RyaW5nW10gbWVzc2FnZVBhcmFtZXRlcnMgPSB7cGFyZW50UXVlcnlOYW1lLG5ld1N1YlF1ZXJ5SXRlbVR5cGVTdHJpbmd9OwotICAgc3ViUXVlcnlGb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSx1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiREVGQVVMVF9TVUJRVUVSWV9OQU1FIixtZXNzYWdlUGFyYW1ldGVycykpOwotICAgCi0gICBOb2RlIG5vZGUgPSBhY3Rpb24uZ2V0U2VsZWN0ZWROYXZpZ2F0b3JOb2RlKCk7Ci0gICBpbnQgbm9kZUlkID0gbm9kZS5nZXROb2RlSWQoKTsKLSAgIGludCB0b29sSWQgPSBub2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKTsKLSAgIGludCB2aWV3SWQgPSBub2RlLmdldFZpZXdJZCgpOwotICAgaW50IHZpZXdUb29sSWQgPSBub2RlLmdldFZpZXdUb29sSWQoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0RmluZFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQsdG9vbElkLHZpZXdJZCx2aWV3VG9vbElkLG5ld1N1YlF1ZXJ5S2V5LnRvU3RyaW5nKCksZmFsc2UpKSklPiI7Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGY3YjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQWN0aW9uIGFjdGlvbiA9IG5ldyBNYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGlmICghaW5wdXRzVmFsaWQpCi0gICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIGlmICghYWN0aW9uLmlzU3ViUXVlcnlJbml0aWF0ZWQoKSkKLSAgICAgewotICAgICAgIGFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMiICU+Ci08JQotICAgICB9Ci0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY5ZTQ4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCUKLSAgIGlmICghaW5wdXRzVmFsaWQpCi0gICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLSAgICAgaWYgKGFjdGlvblJlc3VsdCkKLSAgICAgewotICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzZWxlY3RlZCBub2RlIGlzIHZpc2libGUuCi0gICAgICAgY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCkubWFrZVNlbGVjdGVkTm9kZVZpc2libGUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGlzTWljcm9zb2Z0SW50ZXJuZXRFeHBsb3JlcigpKQotICB7Ci0gICAgbmF2aWdhdG9yQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvbmF2aWdhdG9yX2NvbnRlbnQuanNwIikpJT4iOwotICAgIHByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gIH0KLSAgZWxzZQotICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvdWRkaV9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCIpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gIHN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLTwvc2NyaXB0PgotPCUKLSAgICAgfQotICAgfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL09wZW5SZWdpc3RyeUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9PcGVuUmVnaXN0cnlBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk2NGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL09wZW5SZWdpc3RyeUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0KLSAgIE9wZW5SZWdpc3RyeUFjdGlvbiBhY3Rpb24gPSBuZXcgT3BlblJlZ2lzdHJ5QWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVmcmVzaFVERElOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4MzJhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZnJlc2hVRERJTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVmcmVzaFVERElOb2RlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBUaGUgYWN0aW9uIG1heSBiZSBleGVjdXRlZCB2aWEgcHJvZ3JhbSBsaW5rLgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIGJvb2xlYW4gaXNOb2RlRGF0YVZhbGlkID0gYWN0aW9uLnZlcmlmeU5vZGVEYXRhKCk7Ci0KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSB0cnVlOwotICAgU3RyaW5nIG9uTG9hZEFjdGlvbjsKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBwcm9jZXNzQ2xlYXJOb2Rlc0Zvcm0oKQotICB7Ci0gICAgdmFyIGNsZWFyTm9kZXNGb3JtID0gZG9jdW1lbnQuZm9ybXNbMF07Ci0gICAgdmFyIHN1Ym1pdENsZWFyTm9kZXNGb3JtID0gZmFsc2U7Ci08JQotICAgICBWZWN0b3Igc3RhbGVOb2RlcyA9IGFjdGlvbi5nZXRTdGFsZU5vZGVzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHN0YWxlTm9kZXMuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIE5vZGUgc3RhbGVOb2RlID0gKE5vZGUpc3RhbGVOb2Rlcy5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9SRU1PVkVfTk9ERSIsc3RhbGVOb2RlLmdldE5vZGVOYW1lKCkpKSU+IikpCi0gICAgewotICAgICAgY2xlYXJOb2Rlc0Zvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9QWN0aW9uSW5wdXRzLk5PREVJRCU+Iiw8JT1zdGFsZU5vZGUuZ2V0Tm9kZUlkKCklPikpOwotICAgICAgc3VibWl0Q2xlYXJOb2Rlc0Zvcm0gPSB0cnVlOwotICAgIH0KLTwlCi0gICAgIH0KLSU+Ci0gICAgaWYgKHN1Ym1pdENsZWFyTm9kZXNGb3JtKQotICAgICAgY2xlYXJOb2Rlc0Zvcm0uc3VibWl0KCk7Ci0gIH0KLTwvc2NyaXB0PiAgICAKLTwvaGVhZD4KLTxib2R5PgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9DbGVhck5hdmlnYXRvck5vZGVzQWN0aW9uSlNQLmpzcCIpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIj4KLTwvZm9ybT4KLTwlCi0gICBpZiAoIWlzTm9kZURhdGFWYWxpZCkKLSAgIHsKLSAgICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykoYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKS5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpKTsKLSAgICAgU3RyaW5nIG5vZGVOYW1lID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKS5nZXROb2RlKG5vZGVJZCkuZ2V0Tm9kZU5hbWUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1JFTU9WRV9OT0RFIixub2RlTmFtZSkpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChDbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQpKSklPiI7Ci08L3NjcmlwdD4gICAgCi08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwcm9jZXNzQ2xlYXJOb2Rlc0Zvcm0oKTsKLTwvc2NyaXB0PgotPCVAIGluY2x1ZGUgZmlsZSA9ICIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2M5ZjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZnJlc2hVRERJTm9kZXNBY3Rpb24gYWN0aW9uID0gbmV3IFJlZnJlc2hVRERJTm9kZXNBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0gICAKLSAgIC8vIFJ1biB0aGUgYWN0aW9uCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHByb2Nlc3NDbGVhck5vZGVzRm9ybSgpCi0gIHsKLSAgICB2YXIgY2xlYXJOb2Rlc0Zvcm0gPSBkb2N1bWVudC5mb3Jtc1swXTsKLTwlCi0gICAgIFZlY3RvciBzdGFsZU5vZGVzID0gYWN0aW9uLmdldFN0YWxlTm9kZXMoKTsKLSAgICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHN0YWxlTm9kZXMuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIE5vZGUgc3RhbGVOb2RlID0gKE5vZGUpc3RhbGVOb2Rlcy5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9SRU1PVkVfTk9ERSIsc3RhbGVOb2RlLmdldE5vZGVOYW1lKCkpKSU+IikpCi0gICAgICBjbGVhck5vZGVzRm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1BY3Rpb25JbnB1dHMuTk9ERUlEJT4iLDwlPXN0YWxlTm9kZS5nZXROb2RlSWQoKSU+KSk7Ci08JSAgICAKLSAgICAgfQotJT4KLSAgICBjbGVhck5vZGVzRm9ybS5zdWJtaXQoKTsKLSAgfSAgICAgICAgIAotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvQ2xlYXJOYXZpZ2F0b3JOb2Rlc0FjdGlvbkpTUC5qc3AiKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci08L2Zvcm0+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgcHJvY2Vzc0NsZWFyTm9kZXNGb3JtKCk7Ci08L3NjcmlwdD4gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzVVVJREFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3YTMzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kQnVzaW5lc3NVVUlEQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE2MWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGlmICghYWN0aW9uLmlzU3ViUXVlcnlJbml0aWF0ZWQoKSkKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL0xhdW5jaFN1YlF1ZXJ5QWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ2NWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc2VzU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZWdGaW5kQnVzaW5lc3Nlc1NpbXBsZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzRmMzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJREFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZUludGVyZmFjZVVVSURBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZTQxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoIWFjdGlvbi5pc1N1YlF1ZXJ5SW5pdGlhdGVkKCkpCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc4MTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZVVVSURBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2VlZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZFNlcnZpY2VVVUlEQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZVVVSURBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5MzFjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNBZHZhbmNlZEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoIWFjdGlvbi5pc1N1YlF1ZXJ5SW5pdGlhdGVkKCkpCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDc0Y2FmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnRmluZFNlcnZpY2VzU2ltcGxlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdGaW5kU2VydmljZXNTaW1wbGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1NmRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlZ1B1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDczNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4MDUwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uIGFjdGlvbiA9IG5ldyBSZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoIWFjdGlvbi5pc1N1YlF1ZXJ5SW5pdGlhdGVkKCkpCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTY5Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjUxZGE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0MTJiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb24gYWN0aW9uID0gbmV3IFJlZ1B1Ymxpc2hTZXJ2aWNlU2ltcGxlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoIWFjdGlvbi5pc1N1YlF1ZXJ5SW5pdGlhdGVkKCkpCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9MYXVuY2hTdWJRdWVyeUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1JlbW92ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVtb3ZlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWE2MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVtb3ZlUHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBSZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGFjdGlvbiA9IG5ldyBSZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoaW5wdXRzVmFsaWQpCi0gICB7Ci0gICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gICB9Ci0lPgotCi0gICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgcHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgIHN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgIDwvc2NyaXB0PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZW1vdmVTdWJRdWVyeUl0ZW1BY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTMxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZW1vdmVTdWJRdWVyeUl0ZW1BY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFJlbW92ZVN1YlF1ZXJ5SXRlbUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9SZXNpemVVRERJRnJhbWVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1Jlc2l6ZVVERElGcmFtZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWUwZjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1Jlc2l6ZVVERElGcmFtZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gQ3JlYXRlIHRoZSBhY3Rpb24uCi0gICBSZXNpemVVRERJRnJhbWVzQWN0aW9uIGFjdGlvbiA9IG5ldyBSZXNpemVVRERJRnJhbWVzQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgCi0gICAvLyBQb3B1bGF0ZSB0aGUgYWN0aW9uIHdpdGggdGhlIHJlcXVlc3QgcHJvcGVydGllcy4KLSAgIGJvb2xlYW4gcmVzdWx0ID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIGlmIChyZXN1bHQpCi0gICB7Ci0gICAgIGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLSAgICAgCi0gICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldC5zZXRBdHRyaWJ1dGUoImNvbHMiLCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiIpOwotICAgIGFjdGlvbnNDb250YWluZXJGcmFtZXNldC5zZXRBdHRyaWJ1dGUoInJvd3MiLCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iKTsKLSAgfQotICBlbHNlCi0gICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS91ZGRpX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlbGVjdENhdGVnb3J5Tm9kZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RDYXRlZ29yeU5vZGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFhOTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlbGVjdENhdGVnb3J5Tm9kZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qIiAlPgotCi08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy9jYnBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBTZWxlY3RDYXRlZ29yeU5vZGVBY3Rpb24gYWN0aW9uID0gbmV3IFNlbGVjdENhdGVnb3J5Tm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoZmFsc2UpOwotCi0gICBDYXRlZ29yeU5vZGUgc2VsZWN0ZWROb2RlID0gKENhdGVnb3J5Tm9kZSlhY3Rpb24uZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXROb2RlTWFuYWdlcigpOwotICAgTm9kZSBwcmV2aW91c1NlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFByZXZpb3VzU2VsZWN0ZWROb2RlKCk7Ci0gICBpbnQgc2VsZWN0ZWROb2RlSWQgPSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci08JQotICAgU3RyaW5nIHRyZWVDb250ZW50VmFyID0gYWN0aW9uLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gICBpZiAocHJldmlvdXNTZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgIHsKLSAgICAgaWYgKHRyZWVDb250ZW50VmFyICE9IG51bGwpCi0gICAgIHsKLSU+Ci0gIDwlPXRyZWVDb250ZW50VmFyJT4uYWx0ZXJJbWFnZSgnPCU9cHJldmlvdXNTZWxlY3RlZE5vZGUuZ2V0QW5jaG9yTmFtZSgpJT4nLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQocHJldmlvdXNTZWxlY3RlZE5vZGUuZ2V0Q2xvc2VkSW1hZ2VQYXRoKCkpKSU+Jyk7Ci08JQotICAgICB9Ci0gICB9Ci0gICBTdHJpbmcgc2VsZWN0ZWROb2RlQW5jaG9yTmFtZSA9IHNlbGVjdGVkTm9kZS5nZXRBbmNob3JOYW1lKCk7Ci0gICBpZiAodHJlZUNvbnRlbnRWYXIgIT0gbnVsbCkKLSAgIHsKLSU+ICAgICAKLSAgPCU9dHJlZUNvbnRlbnRWYXIlPi5zZWxlY3ROb2RlKCc8JT1zZWxlY3RlZE5vZGVBbmNob3JOYW1lJT4nLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoc2VsZWN0ZWROb2RlLmdldE9wZW5JbWFnZVBhdGgoKSkpJT4nKTsKLSAgPCU9dHJlZUNvbnRlbnRWYXIlPi5sb2NhdGlvbi5oYXNoID0gJyM8JT1zZWxlY3RlZE5vZGVBbmNob3JOYW1lJT4nOwotPCUgIAotICAgfQotICAgCi0gICBDYXRlZ29yeUVsZW1lbnQgY2F0ZWdvcnlFbGVtZW50ID0gKENhdGVnb3J5RWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIEtleWVkUmVmZXJlbmNlIGtyID0gY2F0ZWdvcnlFbGVtZW50LmdldENhdGVnb3J5KCk7Ci0lPgotICBjYXRlZ29yeUJyb3dzZXJXaW5kb3cub3BlbmVyLnRhcmdldENhdGVnb3J5S2V5TmFtZUVsZW1lbnQudmFsdWUgPSAiPCU9a3IuZ2V0S2V5TmFtZSgpJT4iOwotICBjYXRlZ29yeUJyb3dzZXJXaW5kb3cub3BlbmVyLnRhcmdldENhdGVnb3J5S2V5VmFsdWVFbGVtZW50LnZhbHVlID0gIjwlPWtyLmdldEtleVZhbHVlKCklPiI7Ci0gIGNhdGVnb3J5QnJvd3NlcldpbmRvdy5vcGVuZXIuY2xvc2VDYXRlZ29yeUJyb3dzZXIoKTsKLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RGaW5kVG9vbEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2M2NmMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0RmluZFRvb2xBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFNlbGVjdEZpbmRUb29sQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RGaW5kVG9vbEFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi0gICBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1NlbGVjdE5vZGVUb29sQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlbGVjdE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYjdkMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi0gICBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1NlbGVjdE5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzRhNDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlbGVjdFByb3BlcnRpZXNUb29sQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1TZWxlY3RQcm9wZXJ0aWVzVG9vbEFjdGlvbiBhY3Rpb24gPSBuZXcgU2VsZWN0UHJvcGVydGllc1Rvb2xBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5NjExMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24gYWN0aW9uID0gbmV3IFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoZmFsc2UpOwotICAgCi0gICBpZiAoIWFjdGlvblJlc3VsdCkKLSAgIHsKLSAgICAgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpOwotICAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKXByb3BlcnR5VGFibGUuZ2V0KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgICAgU3RyaW5nIHN1YlF1ZXJ5TGlzdEtleSA9IChTdHJpbmcpcHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0tFWSk7Ci0gICAgIGludCBzdWJRdWVyeUxpc3RJdGVtSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpcHJvcGVydHlUYWJsZS5nZXQoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9MSVNUX0lURU1JRCkpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBVVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPiAgCi08L2hlYWQ+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfUVVFU1RJT05fSVRFTV9WQUxJREFUSU9OX0ZBSUxFRCIsYWN0aW9uLmdldEl0ZW1OYW1lKCkpKSU+IikpCi0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoUmVtb3ZlU3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsoc3ViUXVlcnlLZXksc3ViUXVlcnlMaXN0S2V5LHN1YlF1ZXJ5TGlzdEl0ZW1JZCkpKSU+IjsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgotPCUKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi0gICAgIGJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvU2VsZWN0Tm9kZVRvb2xBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUdldEJ1c2luZXNzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5ZTcxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZXJ2aWNlR2V0QnVzaW5lc3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFNlcnZpY2VHZXRCdXNpbmVzc0FjdGlvbiBhY3Rpb24gPSBuZXcgU2VydmljZUdldEJ1c2luZXNzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBib29sZWFuIHNlcnZpY2VFeGlzdHMgPSBhY3Rpb24udmFsaWRhdGVTZXJ2aWNlKCk7Ci0KLSAgIGlmICghc2VydmljZUV4aXN0cykKLSAgIHsKLSAgICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykoYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKS5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpKTsKLSAgICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9SRU1PVkVfU0VSVklDRV9OT0RFIikpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChDbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjVmOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUdldFNlcnZpY2VJbnRlcmZhY2VzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBTZXJ2aWNlR2V0U2VydmljZUludGVyZmFjZXNBY3Rpb24gYWN0aW9uID0gbmV3IFNlcnZpY2VHZXRTZXJ2aWNlSW50ZXJmYWNlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgYm9vbGVhbiBzZXJ2aWNlRXhpc3RzID0gYWN0aW9uLnZhbGlkYXRlU2VydmljZSgpOwotCi0gICBpZiAoIXNlcnZpY2VFeGlzdHMpCi0gICB7Ci0gICAgIGludCBub2RlSWQgPSBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpKGFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkuZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKSk7Ci0gICAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfUVVFU1RJT05fUkVNT1ZFX1NFUlZJQ0VfTk9ERSIpKSU+IikpCi0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRCdXNpbmVzc2VzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRCdXNpbmVzc2VzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViMjg3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TZXJ2aWNlSW50ZXJmYWNlR2V0QnVzaW5lc3Nlc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgU2VydmljZUludGVyZmFjZUdldEJ1c2luZXNzZXNBY3Rpb24gYWN0aW9uID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VHZXRCdXNpbmVzc2VzQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBib29sZWFuIHNpRXhpc3RzID0gYWN0aW9uLnZhbGlkYXRlU2VydmljZUludGVyZmFjZSgpOwotCi0gICBpZiAoIXNpRXhpc3RzKQotICAgewotICAgICBpbnQgbm9kZUlkID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKShhY3Rpb24uZ2V0UHJvcGVydHlUYWJsZSgpLmdldChBY3Rpb25JbnB1dHMuTk9ERUlEKSkpOwotICAgICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1JFTU9WRV9TSV9OT0RFIikpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChDbGVhck5hdmlnYXRvck5vZGVBY3Rpb24uZ2V0QWN0aW9uTGluayhub2RlSWQpKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICB9Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1NlcnZpY2VJbnRlcmZhY2VHZXRTZXJ2aWNlc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOTY3YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvU2VydmljZUludGVyZmFjZUdldFNlcnZpY2VzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBTZXJ2aWNlSW50ZXJmYWNlR2V0U2VydmljZXNBY3Rpb24gYWN0aW9uID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VHZXRTZXJ2aWNlc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgYm9vbGVhbiBzaUV4aXN0cyA9IGFjdGlvbi52YWxpZGF0ZVNlcnZpY2VJbnRlcmZhY2UoKTsKLQotICAgaWYgKCFzaUV4aXN0cykKLSAgIHsKLSAgICAgaW50IG5vZGVJZCA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZykoYWN0aW9uLmdldFByb3BlcnR5VGFibGUoKS5nZXQoQWN0aW9uSW5wdXRzLk5PREVJRCkpKTsKLSAgICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9SRU1PVkVfU0lfTk9ERSIpKSU+IikpCi0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQ2xlYXJOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsobm9kZUlkKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTmV3Tm9kZUFjdGlvbi5pbmMiICU+Ci08JQotICAgfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1Nob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1Nob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjYjFiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9TaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb24gYWN0aW9uID0gbmV3IFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoIWFjdGlvbi5pc1N1YlF1ZXJ5SW5pdGlhdGVkKCkpCi0gICB7Ci0gICAgIGlmIChpbnB1dHNWYWxpZCkKLSAgICAgewotICAgICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgICAgfQotJT4KLSAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgPC9zY3JpcHQ+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii91ZGRpL2FjdGlvbnMvTGF1bmNoU3ViUXVlcnlBY3Rpb24uaW5jIiAlPgotPCUKLSAgIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21VRERJQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2UzNzRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVVERElBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbgotU3dpdGNoUGVyc3BlY3RpdmVGcm9tVURESUFjdGlvbiBhY3Rpb24gPSBuZXcgU3dpdGNoUGVyc3BlY3RpdmVGcm9tVURESUFjdGlvbihjb250cm9sbGVyKTsKLSAgIAotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotICAgCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgIAotLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi1ib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9zd2l0Y2hwZXJzcGVjdGl2ZS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Ub2dnbGVDYXRlZ29yeU5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhMGNmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9Ub2dnbGVDYXRlZ29yeU5vZGVBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLSAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvY2JwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgVG9nZ2xlQ2F0ZWdvcnlOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBUb2dnbGVDYXRlZ29yeU5vZGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLQotICAgU3RyaW5nIHRyZWVDb250ZW50VmFyID0gYWN0aW9uLmdldFRyZWVDb250ZW50VmFyKCk7Ci0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLTwlCi0gICBpZiAodHJlZUNvbnRlbnRWYXIgIT0gbnVsbCkKLSAgIHsKLSU+Ci0gIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgICA8JT10cmVlQ29udGVudFZhciU+LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb24uZ2V0VHJlZUNvbnRlbnRQYWdlKCkpKSU+IjsKLSAgZWxzZQotICAgIGNhdGVnb3J5QnJvd3NlcldpbmRvdy5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoYWN0aW9uLmdldFRyZWVDb250YWluZXJQYWdlKCkpKSU+IjsKLTwlCi0gICB9Ci0lPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWU3NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVG9nZ2xlTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLVRvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24gYWN0aW9uID0gbmV3IFRvZ2dsZU5hdmlnYXRvck5vZGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4ZWNkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9UcmFuc2ZlclN1YlF1ZXJ5UmVzdWx0c0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIFRyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uIGFjdGlvbiA9IG5ldyBUcmFuc2ZlclN1YlF1ZXJ5UmVzdWx0c0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgaWYgKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFVERElBY3Rpb25JbnB1dHMuU0hPV19SRVNVTFRTX1RBUkdFVCkgIT0gbnVsbCkKLSAgICAgYWN0aW9uLmVuYWJsZVNob3dSZXN1bHRzVGFyZ2V0KCk7Ci0gICBlbHNlCi0gICAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgIE5vZGUgdGFyZ2V0Tm9kZSA9IGFjdGlvbi5nZXRUYXJnZXROb2RlKCk7Ci0gICBTdHJpbmcgdGFyZ2V0Tm9kZUFuY2hvck5hbWUgPSB0YXJnZXROb2RlLmdldEFuY2hvck5hbWUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgbmF2aWdhdG9yQ29udGVudC5zZWxlY3ROb2RlKCc8JT10YXJnZXROb2RlQW5jaG9yTmFtZSU+JywnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRhcmdldE5vZGUuZ2V0T3BlbkltYWdlUGF0aCgpKSklPicpOwotICBuYXZpZ2F0b3JDb250ZW50LmxvY2F0aW9uLmhhc2g9JyM8JT10YXJnZXROb2RlQW5jaG9yTmFtZSU+JzsKLSAgcHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9UcmFuc2ZlclRvQWRkQ2F0ZWdvcnlEYXRhQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjM5NmExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1RyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgU3RyaW5nIGNhdGVnb3J5VE1vZGVsS2V5ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5DQVRFR09SWV9UTU9ERUxfS0VZKTsKLSAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgUmVnaXN0cnlOb2RlIHJlZ05vZGUgPSB1ZGRpTWFpbk5vZGUuZ2V0UmVnaXN0cnlOb2RlKG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCkpOwotICAgUmVnaXN0cnlEZXRhaWxzVG9vbCByZWdEZXRhaWxzVG9vbCA9IHJlZ05vZGUuZ2V0UmVnRGV0YWlsc1Rvb2woKTsKLSAgIHJlZ0RldGFpbHNUb29sLmZsYWdSb3dFcnJvcihVRERJQWN0aW9uSW5wdXRzLlVTRVJfREVGSU5FRF9DQVRFR09SSUVTLGNhdGVnb3J5VE1vZGVsS2V5KTsKLSAgIHJlZ05vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuc2V0U2VsZWN0ZWRUb29sSWQocmVnRGV0YWlsc1Rvb2wuZ2V0VG9vbElkKCkpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsocmVnTm9kZS5nZXROb2RlSWQoKSxmYWxzZSkpKSU+IjsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVURESUFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDk1ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVURESUFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TaG93UGVyc3BlY3RpdmVBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuVURESUFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uIiU+Ci0KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLVVERElBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiBhY3Rpb24gPSBuZXcgVURESUFkZFRvV1NETFBlcnNwZWN0aXZlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWJvb2xlYW4gcGFyYW1WYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLWlmIChwYXJhbVZhbGlkKSB7Ci0gIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gIGlmIChhY3Rpb25SZXN1bHQpIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTaG93UGVyc3BlY3RpdmVBY3Rpb24uZ2V0QWN0aW9uTGluayhBY3Rpb25JbnB1dHMuUEVSU1BFQ1RJVkVfV1NETCxmYWxzZSkpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLSAgZWxzZSB7Ci0lPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgcHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci19Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDNmZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVURESUltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIFVERElJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBVRERJSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb0ZpbGVTeXN0ZW1BY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1ODIwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzFmNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24gYWN0aW9uID0gbmV3IFVERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0xhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVW5wdWJsaXNoQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VucHVibGlzaEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NzQ3MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVW5wdWJsaXNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFVucHVibGlzaEFjdGlvbiBhY3Rpb24gPSBuZXcgVW5wdWJsaXNoQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZUFjdGlvbi5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVBY3Rpb24uaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGY0MDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZUFjdGlvbi5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlCi0gICBpZiAoIWlucHV0c1ZhbGlkKQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotICAgZWxzZQotICAgewotICAgICBib29sZWFuIHJlZnJlc2hSZXN1bHQgPSBhY3Rpb24ucmVmcmVzaEZyb21SZWdpc3RyeSgpOwotICAgICAKLSAgICAgaWYgKCFyZWZyZXNoUmVzdWx0KQotICAgICB7Ci0gICAgICAgc2Vzc2lvbi5zZXRBdHRyaWJ1dGUoVURESUFjdGlvbklucHV0cy5QVUJMSVNIX0FDVElPTixhY3Rpb24pOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9QVUJMSVNIX0lURU0iKSklPiIpKQotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvVXBkYXRlTmV3UHVibGlzaEFjdGlvbkpTUC5qc3AiKSklPiI7Ci0gIGVsc2UKLSAgICBwcm9wZXJ0aWVzQ29udGVudC5yZXF1ZXN0U3VibWl0dGVkID0gZmFsc2U7Ci08L3NjcmlwdD4KLTwlCi0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9OZXdOb2RlQWN0aW9uLmluYyIgJT4KLTwlCi0gICAgIH0KLSAgIH0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVCdXNpbmVzc0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVCdXNpbmVzc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTg2MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlQnVzaW5lc3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgIFVwZGF0ZUJ1c2luZXNzQWN0aW9uIGFjdGlvbiA9IG5ldyBVcGRhdGVCdXNpbmVzc0FjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL1VwZGF0ZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVOZXdQdWJsaXNoQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZU5ld1B1Ymxpc2hBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTE0NzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZU5ld1B1Ymxpc2hBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIFVwZGF0ZUFjdGlvbiBhY3Rpb24gPSAoVXBkYXRlQWN0aW9uKXNlc3Npb24uZ2V0QXR0cmlidXRlKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSF9BQ1RJT04pOwotICAgc2Vzc2lvbi5yZW1vdmVBdHRyaWJ1dGUoVURESUFjdGlvbklucHV0cy5QVUJMSVNIX0FDVElPTik7Ci0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gdHJ1ZTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWNhNjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVJlZ2lzdHJ5QWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBVcGRhdGVSZWdpc3RyeUFjdGlvbiBhY3Rpb24gPSBuZXcgVXBkYXRlUmVnaXN0cnlBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvYWN0aW9ucy9VcGRhdGVBY3Rpb24uaW5jIiAlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlU2VydmljZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3YWZiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICBVcGRhdGVTZXJ2aWNlQWN0aW9uIGFjdGlvbiA9IG5ldyBVcGRhdGVTZXJ2aWNlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gICBpZiAoIWlucHV0c1ZhbGlkKQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotICAgZWxzZQotICAgewotICAgICBib29sZWFuIHJlZnJlc2hTZXJ2aWNlUmVzdWx0ID0gYWN0aW9uLnJlZnJlc2hGcm9tUmVnaXN0cnkoKTsKLSAgICAgYm9vbGVhbiByZWZyZXNoQnVzaW5lc3NSZXN1bHQgPSBhY3Rpb24ucmVmcmVzaEJ1c2luZXNzRnJvbVJlZ2lzdHJ5KCk7Ci0gICAgIGlmICghcmVmcmVzaFNlcnZpY2VSZXN1bHQpCi0gICAgIHsKLSAgICAgICBzZXNzaW9uLnNldEF0dHJpYnV0ZShVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hfQUNUSU9OLGFjdGlvbik7Ci0gICAgICAgaWYgKCFyZWZyZXNoQnVzaW5lc3NSZXN1bHQpCi0gICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfUVVFU1RJT05fU0VSVklDRV9QVUJMSVNIX0JVU0lORVNTIikpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VOZXdQdWJsaXNoQnVzaW5lc3NBY3Rpb25KU1AuanNwIikpJT4iOwotICBlbHNlCi0gICAgcHJvcGVydGllc0NvbnRlbnQucmVxdWVzdFN1Ym1pdHRlZCA9IGZhbHNlOwotPC9zY3JpcHQ+Ci08JQotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfUVVFU1RJT05fUFVCTElTSF9JVEVNIikpJT4iKSkKLSAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1VwZGF0ZU5ld1B1Ymxpc2hBY3Rpb25KU1AuanNwIikpJT4iOwotICBlbHNlCi0gICAgcHJvcGVydGllc0NvbnRlbnQucmVxdWVzdFN1Ym1pdHRlZCA9IGZhbHNlOwotPC9zY3JpcHQ+Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL05ld05vZGVBY3Rpb24uaW5jIiAlPgotPCUKLSAgICAgfQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNDVlMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnMvVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbiBhY3Rpb24gPSBuZXcgVXBkYXRlU2VydmljZUludGVyZmFjZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9hY3Rpb25zL1VwZGF0ZUFjdGlvbi5pbmMiICU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvYWN0aW9ucy9VcGRhdGVTZXJ2aWNlTmV3UHVibGlzaEJ1c2luZXNzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VOZXdQdWJsaXNoQnVzaW5lc3NBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGUzN2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VOZXdQdWJsaXNoQnVzaW5lc3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIFVwZGF0ZVNlcnZpY2VBY3Rpb24gYWN0aW9uID0gKFVwZGF0ZVNlcnZpY2VBY3Rpb24pc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoVURESUFjdGlvbklucHV0cy5QVUJMSVNIX0FDVElPTik7Ci0gICBzZXNzaW9uLnJlbW92ZUF0dHJpYnV0ZShVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hfQUNUSU9OKTsKLQotICAgUmVnUHVibGlzaFRvb2wgcmVnUHVibGlzaFRvb2wgPSBhY3Rpb24uc2V0dXBSZWdQdWJsaXNoVG9vbCgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChyZWdQdWJsaXNoVG9vbC5nZXRTZWxlY3RUb29sQWN0aW9uSHJlZihmYWxzZSkpKSU+IjsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9hY3Rpb25zX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMWFjMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2FjdGlvbnNfY29udGFpbmVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgcm93cz0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+IiBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPVVERElGcmFtZU5hbWVzLlBST1BFUlRJRVNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiIgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MSBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuU1RBVFVTX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9zdGF0dXNfY29udGFpbmVyLmpzcCIpKSU+IiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2NhdGVnb3J5X2Jyb3dzZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2NhdGVnb3J5X2Jyb3dzZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTYzNzc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9jYXRlZ29yeV9icm93c2VyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgU3RyaW5nIGNhdGVnb3J5VE1vZGVsS2V5ID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVURESUFjdGlvbklucHV0cy5DQVRFR09SWV9UTU9ERUxfS0VZKTsKLSAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIHVkZGlQZXJzcGVjdGl2ZS5zZXRDYXRlZ29yeVRNb2RlbEtleShjYXRlZ29yeVRNb2RlbEtleSk7Ci0gICAKLSAgIFN0cmluZ0J1ZmZlciB0b29sYmFyTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoInVkZGkvY2F0ZWdvcnlfdG9vbGJhci5qc3A/Iik7Ci0gICB0b29sYmFyTGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlRJVExFX0NBVEVHT1JZX0JST1dTRVIiKSU+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIwLDMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuQ0FURUdPUklFU19XT1JLQVJFQSU+IiB0aXRsZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0NBVEVHT1JJRVNfV09SS0FSRUEiKSU+IiBmcmFtZWJvcmRlcj0wIG5vcmVzaXplPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuQ0FURUdPUklFU19UT09MQkFSJT4iIHRpdGxlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQ0FURUdPUklFU19UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodG9vbGJhckxpbmsudG9TdHJpbmcoKSkpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPVVERElGcmFtZU5hbWVzLkNBVEVHT1JJRVNfQ09OVEVOVCU+IiB0aXRsZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0NBVEVHT1JJRVNfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5DYXRlZ29yeUJyb3dzZXJBY3Rpb24uZ2V0Q2F0ZWdvcnlDb250ZW50UGFnZShzZXNzaW9uSWQsY2F0ZWdvcnlUTW9kZWxLZXkpKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9jYXRlZ29yeV9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9jYXRlZ29yeV9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkN2YxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvY2F0ZWdvcnlfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qIiAlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLTxqc3A6dXNlQmVhbiBpZD0iY29tbW9uQ2F0ZWdvcnlNb2RlbHMiIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0iYXBwbGljYXRpb24iLz4KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBTdHJpbmcgY2F0ZWdvcnlUTW9kZWxLZXkgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX1RNT0RFTF9LRVkpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9DQVRFR09SSUVTX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdHJlZXZpZXcuY3NzIikpJT4iPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3RyZWV2aWV3LmpzIikpJT4iPgotICA8L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiB0cmFuc2ZlclRvQWRkQ2F0ZWdvcnlEYXRhKCkKLSAgewotICAgIHRvcC5vcGVuZXIudG9wLmZyYW1lc1siPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Il0ubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFRyYW5zZmVyVG9BZGRDYXRlZ29yeURhdGFBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsY2F0ZWdvcnlUTW9kZWxLZXkpKSklPiI7Ci0gIH0gIAotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPCUgICAKLSAgIC8vIENoZWNrIGlmIHRoZSBjYXRlZ29yeSBpcyBhIGNvbW1vbiBjYXRlZ29yeS4KLSAgIENhdGVnb3J5TW9kZWwgY2F0ZWdvcnlNb2RlbCA9IChDYXRlZ29yeU1vZGVsKWNvbW1vbkNhdGVnb3J5TW9kZWxzLmdldChjYXRlZ29yeVRNb2RlbEtleSk7Ci0gICBpZiAoY2F0ZWdvcnlNb2RlbCA9PSBudWxsKQotICAgewotICAgICAvLyBUaGUgY2F0ZWdvcnkgaXMgdXNlci1kZWZpbmVkLiAgICAgCi0gICAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSluYXZpZ2F0b3JNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpKTsKLSAgICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsgICAKLSAgICAgY2F0ZWdvcnlNb2RlbCA9IChDYXRlZ29yeU1vZGVsKXJlZ0VsZW1lbnQuZ2V0VXNlckRlZmluZWRDYXRlZ29yeShjYXRlZ29yeVRNb2RlbEtleSk7Ci0gICB9Ci0gICBieXRlIHJjID0gQ2F0ZWdvcnlNb2RlbC5PUEVSQVRJT05fU1VDQ0VTU0ZVTDsKLSAgIGlmICghY2F0ZWdvcnlNb2RlbC5pc0RhdGFMb2FkZWQoKSkKLSAgIHsKLSAgICAgc3luY2hyb25pemVkKGNhdGVnb3J5TW9kZWwpCi0gICAgIHsKLSAgICAgICBpZiAoIWNhdGVnb3J5TW9kZWwuaXNEYXRhTG9hZGVkKCkpCi0gICAgICAgICByYyA9IGNhdGVnb3J5TW9kZWwubG9hZEZyb21EZWZhdWx0RGF0YUZpbGUoKTsKLSAgICAgfQotICAgfQotICAgaWYgKHJjICE9IENhdGVnb3J5TW9kZWwuT1BFUkFUSU9OX1NVQ0NFU1NGVUwpCi0gICB7Ci0lPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19OT19DQVRFR09SWV9EQVRBIixjYXRlZ29yeU1vZGVsLmdldERpc3BsYXlOYW1lKCkpJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPiZuYnNwOzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FERF9DQVRFR09SWV9EQVRBIiwiamF2YXNjcmlwdDp0cmFuc2ZlclRvQWRkQ2F0ZWdvcnlEYXRhKCkiKSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTwlICAgCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIE5vZGVNYW5hZ2VyIGNhdGVnb3J5TWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRDYXRlZ29yeU1hbmFnZXIoY2F0ZWdvcnlNb2RlbCk7Ci0gICAgIFN0cmluZyBzZWxlY3RlZEFuY2hvck5hbWUgPSAiIjsKLSAgICAgaW50IGZvY3VzZWROb2RlSWQgPSBjYXRlZ29yeU1hbmFnZXIuZ2V0Rm9jdXNlZE5vZGVJZCgpOwotICAgICBTdHJpbmcgZm9jdXNlZEFuY2hvck5hbWUgPSBTdHJpbmcudmFsdWVPZihmb2N1c2VkTm9kZUlkKTsKLSAgICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBjYXRlZ29yeU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgICAgewotICAgICAgIHNlbGVjdGVkQW5jaG9yTmFtZSA9IHNlbGVjdGVkTm9kZS5nZXRBbmNob3JOYW1lKCk7Ci0gICAgICAgaWYgKGZvY3VzZWROb2RlSWQgPT0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKQotICAgICAgICAgZm9jdXNlZEFuY2hvck5hbWUgPSBzZWxlY3RlZEFuY2hvck5hbWU7Ci0gICAgIH0KLSU+Ci08ZGl2IGlkPSJ0cmVlY29udGVudGJvcmRlciI+Ci08JT1jYXRlZ29yeU1hbmFnZXIucmVuZGVyVHJlZVZpZXcocmVzcG9uc2UpJT4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNlbGYubG9jYXRpb24uaGFzaD0iIzwlPWZvY3VzZWRBbmNob3JOYW1lJT4iCi0gIHNldFNlbGVjdGVkQW5jaG9yTmFtZSgiPCU9c2VsZWN0ZWRBbmNob3JOYW1lJT4iKTsKLTwvc2NyaXB0PgotPCUKLSAgIH0KLSU+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvY2F0ZWdvcnlfdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvY2F0ZWdvcnlfdG9vbGJhci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZGRlNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2NhdGVnb3J5X3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklkKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0NBVEVHT1JJRVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiIgb25VbmxvYWQ9InRvcC5vcGVuZXIuY2F0ZWdvcnlXaW5kb3dDbG9zZWQ9dHJ1ZSI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2ltYWdlcy9jYXRlZ29yeS5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0NBVEVHT1JJRVMiKSU+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0b3Aub3BlbmVyLmNhdGVnb3J5V2luZG93Q2xvc2VkPWZhbHNlOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS9kV0NvbW11bml0eS1kYXRhLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL2RXQ29tbXVuaXR5LWRhdGEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDkwYWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL2RXQ29tbXVuaXR5LWRhdGEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1kV0NvbW11bml0eSNHZW5lcmFsI1dlYiBzZXJ2aWNlIGluZm9ybWF0aW9uIGZvciB0aGUgZGV2ZWxvcGVyV29ya3MgV2ViIHNlcnZpY2VzIGNvbW11bml0eSNHZW5lcmFsCi1kV0NvbW11bml0eSNTcGVlZCBTdGFydCNXZWIgc2VydmljZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGRldmVsb3BlcldvcmtzIFNwZWVkIFN0YXJ0IGNvbW11bml0eSNTcGVlZCBTdGFydApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL2dlby1kYXRhLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL2dlby1kYXRhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3OGFiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS9nZW8tZGF0YS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzgzICswLDAgQEAKLWdlbyMtLSNXb3JsZCMtLQotZ2VvI0FFI1VuaXRlZCBBcmFiIEVtaXJhdGVzIy0tCi1nZW8jQUYjQWZnaGFuaXN0YW4jLS0KLWdlbyNBRyNBbnRpZ3VhIEFuZCBCYXJidWRhIy0tCi1nZW8jQUkjQW5ndWlsbGEjLS0KLWdlbyNBTCNBbGJhbmlhIy0tCi1nZW8jQU0jQXJtZW5pYSMtLQotZ2VvI0FOI05ldGhlcmxhbmRzIEFudGlsbGVzIy0tCi1nZW8jQU8jQW5nb2xhIy0tCi1nZW8jQVEjQW50YXJjdGljYSMtLQotZ2VvI0FSI0FyZ2VudGluYSMtLQotZ2VvI0FSLUEjU2FsdGEjQVIKLWdlbyNBUi1CI0J1ZW5vcyBBaXJlcyNBUgotZ2VvI0FSLUMjRGlzdHJpdG8gRmVkZXJhbCNBUgotZ2VvI0FSLUQjU2FuIEx1aXMjQVIKLWdlbyNBUi1FI0VudHJlIFJpb3MjQVIKLWdlbyNBUi1GI0xhIFJpb2phI0FSCi1nZW8jQVItRyNTYW50aWFnbyBEZWwgRXN0ZXJvI0FSCi1nZW8jQVItSCNDaGFjbyNBUgotZ2VvI0FSLUojU2FuIEp1YW4jQVIKLWdlbyNBUi1LI0NhdGFtYXJjYSNBUgotZ2VvI0FSLUwjTGEgUGFtcGEjQVIKLWdlbyNBUi1NI01lbmRvemEjQVIKLWdlbyNBUi1OI01pc2lvbmVzI0FSCi1nZW8jQVItUCNGb3Jtb3NhI0FSCi1nZW8jQVItUSNOZXVxdWVuI0FSCi1nZW8jQVItUiNSaW8gTmVncm8jQVIKLWdlbyNBUi1TI1NhbnRhIEZlI0FSCi1nZW8jQVItVCNUdWN1bWFuI0FSCi1nZW8jQVItVSNDaHVidXQjQVIKLWdlbyNBUi1WI1RpZXJyYSBEZWwgRnVlZ28jQVIKLWdlbyNBUi1XI0NvcnJpZW50ZXMjQVIKLWdlbyNBUi1YI0NvcmRvYmEjQVIKLWdlbyNBUi1ZI0p1anV5I0FSCi1nZW8jQVItWiNTYW50YSBDcnV6I0FSCi1nZW8jQVMjQW1lcmljYW4gU2Ftb2EjLS0KLWdlbyNBVCNBdXN0cmlhIy0tCi1nZW8jQVUjQXVzdHJhbGlhIy0tCi1nZW8jQVUtQ1QjQXVzdHJhbGlhbiBDYXBpdGFsIFRlcnJpdG9yeSNBVQotZ2VvI0FVLU5TI05ldyBTb3V0aCBXYWxlcyNBVQotZ2VvI0FVLU5UI05vcnRoZXJuIFRlcnJpdG9yeSNBVQotZ2VvI0FVLVFMI1F1ZWVuc2xhbmQjQVUKLWdlbyNBVS1TQSNTb3V0aCBBdXN0cmFsaWEjQVUKLWdlbyNBVS1UUyNUYXNtYW5pYSNBVQotZ2VvI0FVLVZJI1ZpY3RvcmlhI0FVCi1nZW8jQVUtV0EjV2VzdGVybiBBdXN0cmFsaWEjQVUKLWdlbyNBVyNBcnViYSMtLQotZ2VvI0FaI0F6ZXJiYWlqYW4jLS0KLWdlbyNCQSNCb3NuaWEtSGVyY2Vnb3ZpbmEjLS0KLWdlbyNCQiNCYXJiYWRvcyMtLQotZ2VvI0JEI0JhbmdsYWRlc2gjLS0KLWdlbyNCRSNCZWxnaXVtIy0tCi1nZW8jQkYjQnVya2luYSBGYXNvIy0tCi1nZW8jQkcjQnVsZ2FyaWEjLS0KLWdlbyNCSCNCYWhyYWluIy0tCi1nZW8jQkkjQnVydW5kaSMtLQotZ2VvI0JKI0JlbmluIy0tCi1nZW8jQk0jQmVybXVkYSMtLQotZ2VvI0JOI0JydW5laSBEYXJ1c3NhbGFtIy0tCi1nZW8jQk8jQm9saXZpYSMtLQotZ2VvI0JSI0JyYXppbCMtLQotZ2VvI0JSLUFDI0FjcmUjQlIKLWdlbyNCUi1BTCNBbGFnb2FzI0JSCi1nZW8jQlItQU0jQW1hem9uYXMjQlIKLWdlbyNCUi1BUCNBbWFwYSNCUgotZ2VvI0JSLUJBI0JhaGlhI0JSCi1nZW8jQlItQ0UjQ2VhcmEjQlIKLWdlbyNCUi1ERiNEaXN0cml0byBGZWRlcmFsI0JSCi1nZW8jQlItRVMjRXNwaXJpdG8gU2FudG8jQlIKLWdlbyNCUi1HTyNHb2lhcyNCUgotZ2VvI0JSLU1BI01hcmFuaGFvI0JSCi1nZW8jQlItTUcjTWluYXMgR2VyYWlzI0JSCi1nZW8jQlItTVMjTWF0byBHcm9zc28gRG8gU3VsI0JSCi1nZW8jQlItTVQjTWF0byBHcm9zc28jQlIKLWdlbyNCUi1QQSNQYXJhI0JSCi1nZW8jQlItUEIjUGFyYWliYSNCUgotZ2VvI0JSLVBFI1Blcm5hbWJ1Y28jQlIKLWdlbyNCUi1QSSNQaWF1aSNCUgotZ2VvI0JSLVBSI1BhcmFuYSNCUgotZ2VvI0JSLVJKI1JpbyBEZSBKYW5laXJvI0JSCi1nZW8jQlItUk4jUmlvIEdyYW5kZSBEbyBOb3J0ZSNCUgotZ2VvI0JSLVJPI1JvbmRvbmlhI0JSCi1nZW8jQlItUlIjUm9yYWltYSNCUgotZ2VvI0JSLVJTI1JpbyBHcmFuZGUgRG8gU3VsI0JSCi1nZW8jQlItU0MjU2FudGEgQ2F0YXJpbmEjQlIKLWdlbyNCUi1TRSNTZXJnaXBlI0JSCi1nZW8jQlItU1AjU2FvIFBhdWxvI0JSCi1nZW8jQlItVE8jVG9jYW50aW5hI0JSCi1nZW8jQlMjQmFoYW1hcyMtLQotZ2VvI0JUI0JodXRhbiMtLQotZ2VvI0JVI0J1cm1hIChTZWUgTU0gTXlhbm1hcikjLS0KLWdlbyNCVyNCb3Rzd2FuYSMtLQotZ2VvI0JZI0JlbGFydXMjLS0KLWdlbyNCWS1CUiNCcmVzdHNrYXlhIHZvYmxhc3RzJyNCWQotZ2VvI0JZLUhPI0hvbXllbCdza2F5YSB2b2JsYXN0cycjQlkKLWdlbyNCWS1IUiNIcm9kemVuc2theWEgdm9ibGFzdHMnI0JZCi1nZW8jQlktTUEjTWFoaWx5b3dza2F5YSB2b2JsYXN0cycjQlkKLWdlbyNCWS1NSSNNaW5za2F5YSB2b2JsYXN0cycjQlkKLWdlbyNCWS1WSSNWaXRzeWVic2theWEgdm9ibGFzdHMnI0JZCi1nZW8jQlojQmVsaXplIy0tCi1nZW8jQ0EjQ2FuYWRhIy0tCi1nZW8jQ0EtQUIjQWxiZXJ0YSNDQQotZ2VvI0NBLUJDI0JyaXRpc2ggQ29sdW1iaWEjQ0EKLWdlbyNDQS1NQiNNYW5pdG9iYSNDQQotZ2VvI0NBLU5CI05ldyBCcnVuc3dpY2sjQ0EKLWdlbyNDQS1ORiNOZXdmb3VuZGxhbmQjQ0EKLWdlbyNDQS1OUyNOb3ZhIFNjb3RpYSNDQQotZ2VvI0NBLU5UI05vcnRod2VzdCBUZXJyaXRvcmllcyNDQQotZ2VvI0NBLU5VI051bmF2dXQjQ0EKLWdlbyNDQS1PTiNPbnRhcmlvI0NBCi1nZW8jQ0EtUEUjUHJpbmNlIEVkd2FyZCBJc2xhbmQjQ0EKLWdlbyNDQS1RQyNRdWViZWMjQ0EKLWdlbyNDQS1TSyNTYXNrYXRjaGV3YW4jQ0EKLWdlbyNDQS1ZVCNZdWtvbiBUZXJyaXRvcnkjQ0EKLWdlbyNDQyNDb2NvcyAoS2VlbGluZykgSXNsYW5kcyMtLQotZ2VvI0NEIyJDb25nbywgRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiIjLS0KLWdlbyNDRiNDZW50cmFsIEFmcmljYW4gUmVwdWJsaWMjLS0KLWdlbyNDRyNDb25nbyMtLQotZ2VvI0NII1N3aXR6ZXJsYW5kIy0tCi1nZW8jQ0gtQUcjQWFyZ2F1I0NICi1nZW8jQ0gtQUkjQXBwZW56ZWxsIElubmVyLVJob2RlbiNDSAotZ2VvI0NILUFSI0FwcGVuemVsbCBBdXNzZXItUmhvZGVuI0NICi1nZW8jQ0gtQkUjQmVybiNDSAotZ2VvI0NILUJMI0Jhc2VsLUxhbmRzY2hhZnQjQ0gKLWdlbyNDSC1CUyNCYXNlbC1TdGFkdCNDSAotZ2VvI0NILUZSI0ZyaWJvdXJnI0NICi1nZW8jQ0gtR0UjR2Vuw6h2ZSNDSAotZ2VvI0NILUdMI0dsYXJ1cyNDSAotZ2VvI0NILUdSI0dyYXViw7xuZGVuI0NICi1nZW8jQ0gtSlUjSnVyYSNDSAotZ2VvI0NILUxVI0x1emVybiNDSAotZ2VvI0NILU5FI05ldWNoYXRlbCNDSAotZ2VvI0NILU5XI05pZHdhbGRlbiNDSAotZ2VvI0NILU9XI09id2FsZGVuI0NICi1nZW8jQ0gtU0cjU3QgR2FsbGVuI0NICi1nZW8jQ0gtU0gjU2NoYWZmaGF1c2VuI0NICi1nZW8jQ0gtU08jU29sb3RodXJuI0NICi1nZW8jQ0gtU1ojU2Nod3l6I0NICi1nZW8jQ0gtVEcjVGh1cmdhdSNDSAotZ2VvI0NILVRJI1RpY2lubyNDSAotZ2VvI0NILVVSI1VyaSNDSAotZ2VvI0NILVZEI1ZhdWQjQ0gKLWdlbyNDSC1WUyNWYWxhaXMjQ0gKLWdlbyNDSC1aRyNadWcjQ0gKLWdlbyNDSC1aSCNaw7xyaWNoI0NICi1nZW8jQ0kjQ290ZSBEJ0l2b2lyZSMtLQotZ2VvI0NLI0Nvb2sgSXNsYW5kcyMtLQotZ2VvI0NMI0NoaWxlIy0tCi1nZW8jQ00jQ2FtZXJvb24jLS0KLWdlbyNDTiNDaGluYSMtLQotZ2VvI0NOLTExI0JlaWppbmcjQ04KLWdlbyNDTi0xMiNUaWFuamluI0NOCi1nZW8jQ04tMTMjSGViZWkjQ04KLWdlbyNDTi0xNCNTaGFueGkjQ04KLWdlbyNDTi0xNSNOZWkgTW9uZ29sI0NOCi1nZW8jQ04tMjEjTGlhb25pbmcjQ04KLWdlbyNDTi0yMiNKaWxpbiNDTgotZ2VvI0NOLTIzI0hlaWxvbmdqaWFuZyNDTgotZ2VvI0NOLTMxI1NoYW5naGFpI0NOCi1nZW8jQ04tMzIjSmlhbmdzdSNDTgotZ2VvI0NOLTMzI1poZWppYW5nI0NOCi1nZW8jQ04tMzQjQW5odWkjQ04KLWdlbyNDTi0zNSNGdWppYW4jQ04KLWdlbyNDTi0zNiNKaWFuZ3hpI0NOCi1nZW8jQ04tMzcjU2hhbmRvbmcjQ04KLWdlbyNDTi00MSNIZW5hbiNDTgotZ2VvI0NOLTQyI0h1YmVpI0NOCi1nZW8jQ04tNDMjSHVuYW4jQ04KLWdlbyNDTi00NCNHdWFuZ2RvbmcjQ04KLWdlbyNDTi00NSNHdWFuZ3hpI0NOCi1nZW8jQ04tNDYjSGFpbmFuI0NOCi1nZW8jQ04tNTEjU2ljaHVhbiNDTgotZ2VvI0NOLTUyI0d1aXpob3UjQ04KLWdlbyNDTi01MyNZdW5uYW4jQ04KLWdlbyNDTi01NCNYaXphbmcjQ04KLWdlbyNDTi02MSNTaGFhbnhpI0NOCi1nZW8jQ04tNjIjR2Fuc3UjQ04KLWdlbyNDTi02MyNRaW5naGFpI0NOCi1nZW8jQ04tNjQjTmluZ3hpYSNDTgotZ2VvI0NOLTY1I1hpbmppYW5nI0NOCi1nZW8jQ04tNzEjVGFpd2FuI0NOCi1nZW8jQ04tOTEjWGlhbmdnYW5nIChIb25nIEtvbmcpI0NOCi1nZW8jQ04tOTIjQW9tZW4gKE1hY2F1KSNDTgotZ2VvI0NPI0NvbG9tYmlhIy0tCi1nZW8jQ1IjQ29zdGEgUmljYSMtLQotZ2VvI0NTI0Zvcm1lciBDemVjaG9zbG92YWtpYSMtLQotZ2VvI0NVI0N1YmEjLS0KLWdlbyNDViNDYXBlIFZlcmRlIy0tCi1nZW8jQ1gjQ2hyaXN0bWFzIElzbGFuZHMjLS0KLWdlbyNDWSNDeXBydXMjLS0KLWdlbyNDWiNDemVjaCBSZXB1YmxpYyMtLQotZ2VvI0RFIyJHZXJtYW55LCBGZWRlcmFsIFJlcHVibGljIG9mIiMtLQotZ2VvI0RFLUJFI0JlcmxpbiNERQotZ2VvI0RFLUJSI0JyYW5kZW5idXJnI0RFCi1nZW8jREUtQlcjQmFkZW4tV8O8cnR0ZW1iZXJnI0RFCi1nZW8jREUtQlkjQmF5ZXJuI0RFCi1nZW8jREUtSEIjQnJlbWVuIChIYW5zZXN0YWR0KSNERQotZ2VvI0RFLUhFI0hlc3NlbiNERQotZ2VvI0RFLUhII0hhbWJ1cmcgKEhhbnNlc3RhZHQpI0RFCi1nZW8jREUtTVYjTWVja2xlbmJ1cmctVm9ycG9tbWVybiNERQotZ2VvI0RFLU5JI05pZWRlcnNhY2hzZW4jREUKLWdlbyNERS1OVyNOb3JkcmhlaW4tV2VzdGZhbGVuI0RFCi1nZW8jREUtUlAjUmhlaW5sYW5kLVBmYWx6I0RFCi1nZW8jREUtU0gjU2NobGVzd2lnLUhvbHN0ZWluI0RFCi1nZW8jREUtU0wjU2FhcmxhbmQjREUKLWdlbyNERS1TTiNTYWNoc2VuI0RFCi1nZW8jREUtU1QjU2FjaHNlbi1BbmhhbHQjREUKLWdlbyNERS1USCNUaMO8cmluZ2VuI0RFCi1nZW8jREojRGppYm91dGkjLS0KLWdlbyNESyNEZW5tYXJrIy0tCi1nZW8jRE0jRG9taW5pY2EjLS0KLWdlbyNETyNEb21pbmljYW4gUmVwdWJsaWMjLS0KLWdlbyNETy0wMiNBenVhI0RPCi1nZW8jRE8tMDMjQmFob3J1Y28jRE8KLWdlbyNETy0wNCNCYXJhaG9uYSNETwotZ2VvI0RPLTA1I0RhamFiw7NuI0RPCi1nZW8jRE8tMDYjRHVhcnRlI0RPCi1nZW8jRE8tMDgjRWwgU2V5Ym8jRE8KLWdlbyNETy0wOSNFc3BhaWxsYXQjRE8KLWdlbyNETy0zMCNIYXRvIE1heW9yI0RPCi1nZW8jRE8tMTAjSW5kZXBlbmRlbmNpYSNETwotZ2VvI0RPLTExI0xhIEFsdGFncmFjaWEjRE8KLWdlbyNETy0wNyNMYSBFc3RyZWxsZXRhI0RPCi1nZW8jRE8tMTIjTGEgUm9tYW5hI0RPCi1nZW8jRE8tMTMjTGEgVmVnYSNETwotZ2VvI0RPLTE0I01hcsOtYSBUcmluaWRhZCBTw6FuY2hleiNETwotZ2VvI0RPLTI4I01vbnNlbm9yIE5vdWVsI0RPCi1nZW8jRE8tMTUjTW9udGUgQ3Jpc3RpI0RPCi1nZW8jRE8tMjkjTW9udGUgUGxhdGEjRE8KLWdlbyNETy0xNiNQZWRlcm5hbGVzI0RPCi1nZW8jRE8tMTcjUGVyYXZpYSNETwotZ2VvI0RPLTE4I1B1ZXJ0byBQbGF0YSNETwotZ2VvI0RPLTE5I1NvbGNlZG8jRE8KLWdlbyNETy0yMCNTYW1hbsOhI0RPCi1nZW8jRE8tMjEjU2FuIENyaXN0w7NiYWwjRE8KLWdlbyNETy0yMiNTYW4gSnVhbiNETwotZ2VvI0RPLTIzI1NhbiBQZWRybyBkZSBNYWNvcsOtcyNETwotZ2VvI0RPLTI0I1PDoW5jaGV6IFJhbcOtcmV6I0RPCi1nZW8jRE8tMjUjU2FudGlhZ28jRE8KLWdlbyNETy0yNiNTYW50aWFnbyBSb2Ryw61ndWV6I0RPCi1nZW8jRE8tMjcjVmFsdmVyZGUjRE8KLWdlbyNEWiNBbGdlcmlhIy0tCi1nZW8jRUMjRWN1YWRvciMtLQotZ2VvI0VFI0VzdG9uaWEjLS0KLWdlbyNFRyNFZ3lwdCMtLQotZ2VvI0VII1dlc3Rlcm4gU2FoYXJhIy0tCi1nZW8jRVIjRXJpdHJlYSMtLQotZ2VvI0VSLUFOI0Fuc2ViYSNFUgotZ2VvI0VSLURVI0RlYnViI0VSCi1nZW8jRVItREsjRGVidWJhd2kgS2V5aWggQmFocmkgW0RlYnViLUtlaWgtQmFocmldI0VSCi1nZW8jRVItR0IjR2FzaC1CYXJrYSNFUgotZ2VvI0VSLU1BI01hYWtlbCBbTWFla2VsXSNFUgotZ2VvI0VSLVNLI1NlbWVuYXdpIEtleWloIEJhaHJpIFtTZW1pZW4tS2VpaC1CYWhyaV0jRVIKLWdlbyNFUyNTcGFpbiMtLQotZ2VvI0VTLUFOI0FuZGFsdWPDrWEjRVMKLWdlbyNFUy1BTCNBbG1lcsOtYSNFUy1BTgotZ2VvI0VTLUNBI0PDoWRpeiNFUy1BTgotZ2VvI0VTLUNPI0PDs3Jkb2JhI0VTLUFOCi1nZW8jRVMtR1IjR3JhbmFkYSNFUy1BTgotZ2VvI0VTLUgjSHVlbHZhI0VTLUFOCi1nZW8jRVMtSiNKYcOpbiNFUy1BTgotZ2VvI0VTLU1BI03DoWxhZ2EjRVMtQU4KLWdlbyNFUy1TRSNTZXZpbGxhI0VTLUFOCi1nZW8jRVMtQVIjQXJhZ8OzbiNFUwotZ2VvI0VTLUhVI0h1ZXNjYSNFUy1BUgotZ2VvI0VTLVRFI1RlcnVlbCNFUy1BUgotZ2VvI0VTLVojWmFyYWdvemEjRVMtQVIKLWdlbyNFUy1PIyJBc3R1cmlhcywgUHJpbmNpcGFkbyBkZSIjRVMKLWdlbyNFUy1DTiNDYW5hcmlhcyNFUwotZ2VvI0VTLUdDI0xhcyBQYWxtYXMjRVMtQ04KLWdlbyNFUy1URiNTYW50YSBDcnV6IGRlIFRlbmVyaWZlI0VTLUNOCi1nZW8jRVMtUyNDYW50YWJyaWEjRVMKLWdlbyNFUy1DTSNDYXN0aWxsYS1MYSBNYW5jaGEjRVMKLWdlbyNFUy1BQiNBbGJhY2V0ZSNFUy1DTQotZ2VvI0VTLUNSI0N1aWRhZCBSZWFsI0VTLUNNCi1nZW8jRVMtQ1UjQ3VlbmNhI0VTLUNNCi1nZW8jRVMtR1UjR3VhZGFsYWphcmEjRVMtQ00KLWdlbyNFUy1UTyNUb2xlZG8jRVMtQ00KLWdlbyNFUy1DTCNDYXN0aWxsYSB5IExlw7NuI0VTCi1nZW8jRVMtQVYjw4F2aWxhI0VTLUNMCi1nZW8jRVMtQlUjQnVyZ29zI0VTLUNMCi1nZW8jRVMtTEUjTGXDs24jRVMtQ0wKLWdlbyNFUy1QI1BhbGVuY2lhI0VTLUNMCi1nZW8jRVMtU0EjU2FsYW1hbmNhI0VTLUNMCi1nZW8jRVMtU0cjU2Vnb3ZpYSNFUy1DTAotZ2VvI0VTLVNPI1NvcmlhI0VTLUNMCi1nZW8jRVMtVkEjVmFsbGFkb2xpZCNFUy1DTAotZ2VvI0VTLVpBI1phbW9yYSNFUy1DTAotZ2VvI0VTLUNUI0NhdGFsdW5hI0VTCi1nZW8jRVMtQiNCYXJjZWxvbmEjRVMtQ1QKLWdlbyNFUy1HRSNHaXJvbmEgW0dlcm9uYV0jRVMtQ1QKLWdlbyNFUy1MI0xsZWlkYSBbTMOpcnVkYV0jRVMtQ1QKLWdlbyNFUy1UI1RhcnJhZ29uYSNFUy1DVAotZ2VvI0VTLUVYI0V4dHJlbWFkdXJhI0VTCi1nZW8jRVMtQkEjQmFkYWpveiNFUy1FWAotZ2VvI0VTLUNDI0PDoWNlcmVzI0VTLUVYCi1nZW8jRVMtR0EjR2FsaWNpYSNFUwotZ2VvI0VTLUMjTGEgQ29ydW5hI0VTLUdBCi1nZW8jRVMtTFUjTHVnbyNFUy1HQQotZ2VvI0VTLU9SI09yZW5zZSNFUy1HQQotZ2VvI0VTLVBPI1BvbnRldmVkcmEjRVMtR0EKLWdlbyNFUy1QTSNJc2xhcyBCYWxlYXJlcyNFUwotZ2VvI0VTLUxPI0xhIFJpb2phI0VTCi1nZW8jRVMtTSMiTWFkcmlkLCBDb211bmlkYWQgZGUiI0VTCi1nZW8jRVMtTVUjIk11cmNpYSwgUmVnacOzbiBkZSIjRVMKLWdlbyNFUy1OQSMiTmF2YXJyYSwgQ29tdW5pZGFkIEZvcmFsIGRlIiNFUwotZ2VvI0VTLVBWI1Bhw61zIFZhc2NpI0VTCi1nZW8jRVMtVkkjw4FsYXZhI0VTLVBWCi1nZW8jRVMtU1MjR3VpcMO6emNvYSNFUy1QVgotZ2VvI0VTLUJJI1ZpemNheWEjRVMtUFYKLWdlbyNFUy1WQyMiVmFsZW5jaWFuYSwgQ29tdW5pZGFkIiNFUwotZ2VvI0VTLUEjQWxpY2FudGUjRVMtVkMKLWdlbyNFUy1DUyNDYXN0ZWxsw7NuI0VTLVZDCi1nZW8jRVMtViNWYWxlbmNpYSNFUy1WQwotZ2VvI0VTLUNFI0NldXRhI0VTCi1nZW8jRVMtTUwjTWVsaWxsYSNFUwotZ2VvI0VUI0V0aGlvcGlhIy0tCi1nZW8jRkkjRmlubGFuZCMtLQotZ2VvI0ZJLUFMI0FodmVuYW5tYWFuIE1hYWt1bnRhIChGaSkgw4VsYW5kcyBMw6RuIChTdikjRkkKLWdlbyNGSS1FUyNFdGVsw6QtU3VvbWVuIEzDpMOkbmkgKEZpKSBTw7ZkcmEgRmlubGFuZHMgTMOkbiAoU3YpI0ZJCi1nZW8jRkktSVMjSXTDpC1TdW9tZW4gTMOkw6RuaSAoRmkpIMOWc3RyYSBGaW5sYW5kcyBMw6RuIChTdikjRkkKLWdlbyNGSS1MTCNMYXBpbiBMw6TDpG5pIChGaSkgTGFwbGFuZHMgTMOkbiAoU3YpI0ZJCi1nZW8jRkktTFMjTMOkbnNpLVN1b21lbiBMw6TDpG5pIChGaSkgVsOkc3RyYSBGaW5sYW5kcyBMw6RuIChTdikjRkkKLWdlbyNGSS1PTCNPdWx1biBMw6TDpG5pIChGaSkgVWxlw6Vib3JncyBMw6RuIChTdikjRkkKLWdlbyNGSiNGaWppIy0tCi1nZW8jRksjRmFsa2xhbmQgSXNsYW5kcyAoTWFsdmluYXMpIy0tCi1nZW8jRk0jRmVkZXJhdGVkIFN0YXRlcyBPZiBNaWNyb25lc2lhIy0tCi1nZW8jRk8jRmFlcm9lIElzbGFuZHMjLS0KLWdlbyNGUiNGcmFuY2UjLS0KLWdlbyNGUi0wMSNBaW4jRlItVgotZ2VvI0ZSLTAyI0Fpc25lI0ZSLVMKLWdlbyNGUi0wMyNBbGxpZXIjRlItQwotZ2VvI0ZSLTA0I0FscGVzLURlLUhhdXRlLVByb3ZlbmNlI0ZSLVUKLWdlbyNGUi0wNSNIYXV0ZXMtQWxwZXMjRlItVQotZ2VvI0ZSLTA2I0FscGVzLU1hcml0aW1lcyNGUi1VCi1nZW8jRlItMDcjQXJkw6hjaGUjRlItVgotZ2VvI0ZSLTA4I0FyZGVubmVzI0ZSLUcKLWdlbyNGUi0wOSNBcmnDqGdlI0ZSLU4KLWdlbyNGUi0xMCNBdWJlI0ZSLUcKLWdlbyNGUi0xMSNBdWRlI0ZSLUsKLWdlbyNGUi0xMiNBdmV5cm9uI0ZSLU4KLWdlbyNGUi0xMyNCb3VjaGVzLUR1LVJow7RuZSNGUi1VCi1nZW8jRlItMTQjQ2FsdmFkb3MjRlItUAotZ2VvI0ZSLTE1I0NhbnRhbCNGUi1DCi1nZW8jRlItMTYjQ2hhcmVudGUjRlItVAotZ2VvI0ZSLTE3I0NoYXJlbnRlLU1hcml0aW1lI0ZSLVQKLWdlbyNGUi0xOCNDaGVyI0ZSLUYKLWdlbyNGUi0xOSNDb3Jyw6h6ZSNGUi1MCi1nZW8jRlItMjEjQ8O0dGUtRCdPciNGUi1ECi1nZW8jRlItMjIjQ8O0dGVzLUQnQXJtb3IjRlItRQotZ2VvI0ZSLTIzI0NyZXVzZSNGUi1MCi1nZW8jRlItMjQjRG9yZG9nbmUjRlItQgotZ2VvI0ZSLTI1I0RvdWJzI0ZSLUkKLWdlbyNGUi0yNiNEcsO0bWUjRlItVgotZ2VvI0ZSLTI3I0V1cmUjRlItUQotZ2VvI0ZSLTI4I0V1cmUtRXQtTG9pciNGUi1GCi1nZW8jRlItMjkjRmluaXN0w6hyZSNGUi1FCi1nZW8jRlItMkEjQ29yc2UtRHUtU3VkI0ZSLUgKLWdlbyNGUi0yQiNIYXV0ZS1Db3JzZSNGUi1ICi1nZW8jRlItMzAjR2FyZCNGUi1LCi1nZW8jRlItMzEjSGF1dGUtR2Fyb25uZSNGUi1OCi1nZW8jRlItMzIjR2VycyNGUi1OCi1nZW8jRlItMzMjR2lyb25kZSNGUi1CCi1nZW8jRlItMzQjSMOpcmF1bHQjRlItSwotZ2VvI0ZSLTM1I0lsbGUtRXQtVmlsYWluZSNGUi1FCi1nZW8jRlItMzYjSW5kcmUjRlItRgotZ2VvI0ZSLTM3I0luZHJlLUV0LUxvaXJlI0ZSLUYKLWdlbyNGUi0zOCNJc8OocmUjRlItVgotZ2VvI0ZSLTM5I0p1cmEjRlItSQotZ2VvI0ZSLTQwI0xhbmRlcyNGUi1CCi1nZW8jRlItNDEjTG9pci1FdC1DaGVyI0ZSLUYKLWdlbyNGUi00MiNMb2lyZSNGUi1WCi1nZW8jRlItNDMjSGF1dGUtTG9pcmUjRlItQwotZ2VvI0ZSLTQ0I0xvaXJlLUF0bGFudGlxdWUjRlItUgotZ2VvI0ZSLTQ1I0xvaXJldCNGUi1GCi1nZW8jRlItNDYjTG90I0ZSLU4KLWdlbyNGUi00NyNMb3QtRXQtR2Fyb25uZSNGUi1CCi1nZW8jRlItNDgjTG96w6hyZSNGUi1LCi1nZW8jRlItNDkjTWFpbmUtRXQtTG9pcmUjRlItUgotZ2VvI0ZSLTUwI01hbmNoZSNGUi1QCi1nZW8jRlItNTEjTWFybmUjRlItRwotZ2VvI0ZSLTUyI0hhdXRlLU1hcm5lI0ZSLUcKLWdlbyNGUi01MyNNYXllbm5lI0ZSLVIKLWdlbyNGUi01NCNNZXVydGhlLUV0LU1vc2VsbGUjRlItTQotZ2VvI0ZSLTU1I01ldXNlI0ZSLU0KLWdlbyNGUi01NiNNb3JiaWhhbiNGUi1FCi1nZW8jRlItNTcjTW9zZWxsZSNGUi1NCi1nZW8jRlItNTgjTmnDqHZyZSNGUi1ECi1nZW8jRlItNTkjTm9yZCNGUi1PCi1nZW8jRlItNjAjT2lzZSNGUi1TCi1nZW8jRlItNjEjT3JuZSNGUi1QCi1nZW8jRlItNjIjUGFzLURlLUNhbGFpcyNGUi1PCi1nZW8jRlItNjMjUHV5LURlLUTDtG1lI0ZSLUMKLWdlbyNGUi02NCNQeXLDqW7DqWVzLUF0bGFudGlxdWVzI0ZSLUIKLWdlbyNGUi02NSNIYXV0ZXMtUHlyw6luw6llcyNGUi1OCi1nZW8jRlItNjYjUHlyw6luw6llcy1PcmllbnRhbGVzI0ZSLUsKLWdlbyNGUi02NyNCYXMtUmhpbiNGUi1BCi1nZW8jRlItNjgjSGF1dC1SaGluI0ZSLUEKLWdlbyNGUi02OSNSaMO0bmUjRlItVgotZ2VvI0ZSLTcwI0hhdXRlLVNhw7RuZSNGUi1JCi1nZW8jRlItNzEjU2HDtG5lLUV0LUxvaXJlI0ZSLUQKLWdlbyNGUi03MiNTYXJ0aGUjRlItUgotZ2VvI0ZSLTczI1Nhdm9pZSNGUi1WCi1nZW8jRlItNzQjSGF1dGUtU2F2b2llI0ZSLVYKLWdlbyNGUi03NSNQYXJpcyNGUi1KCi1nZW8jRlItNzYjU2VpbmUtTWFyaXRpbWUjRlItUQotZ2VvI0ZSLTc3I1NlaW5lLUV0LU1hcm5lI0ZSLUoKLWdlbyNGUi03OCNZdmVsaW5lcyNGUi1KCi1nZW8jRlItNzkjRGV1eC1Tw6h2cmVzI0ZSLUIKLWdlbyNGUi04MCNTb21tZSNGUi1TCi1nZW8jRlItODEjVGFybiNGUi1OCi1nZW8jRlItODIjVGFybi1FdC1HYXJvbm5lI0ZSLU4KLWdlbyNGUi04MyNWYXIjRlItVQotZ2VvI0ZSLTg0I1ZhdWNsdXNlI0ZSLVUKLWdlbyNGUi04NSNWZW5kw6llI0ZSLVIKLWdlbyNGUi04NiNWaWVubmUjRlItVAotZ2VvI0ZSLTg3I0hhdXRlLVZpZW5uZSNGUi1MCi1nZW8jRlItODgjVm9zZ2VzI0ZSLU0KLWdlbyNGUi04OSNZb25uZSNGUi1ECi1nZW8jRlItOTAjVGVycml0b2lyZSBEZSBCZWxmb3J0I0ZSLUkKLWdlbyNGUi05MSNFc3Nvbm5lI0ZSLUoKLWdlbyNGUi05MiNIYXV0cy1EZS1TZWluZSNGUi1KCi1nZW8jRlItOTMjU2VpbmUtU2FpbnQtRGVuaXMjRlItSgotZ2VvI0ZSLTk0I1ZhbC1EZS1NYXJuZSNGUi1KCi1nZW8jRlItOTUjVmFsLUQnT2lzZSNGUi1KCi1nZW8jRlItQSNBbHNhY2UjRlIKLWdlbyNGUi1CI0FxdWl0YWluZSNGUgotZ2VvI0ZSLUMjQXV2ZXJnbmUjRlIKLWdlbyNGUi1EI0JvdXJnb2duZSNGUgotZ2VvI0ZSLUUjQnJldGFnbmUjRlIKLWdlbyNGUi1GI0NlbnRyZSNGUgotZ2VvI0ZSLUcjQ2hhbXBhZ25lLUFyZGVubmUjRlIKLWdlbyNGUi1II0NvcnNlI0ZSCi1nZW8jRlItSSNGcmFuY2hlLUNvbXTDqSNGUgotZ2VvI0ZSLUojSWxlLURlLUZyYW5jZSNGUgotZ2VvI0ZSLUsjTGFuZ3VlZG9jLVJvdXNzaWxsb24jRlIKLWdlbyNGUi1MI0xpbW91c2luI0ZSCi1nZW8jRlItTSNMb3JyYWluZSNGUgotZ2VvI0ZSLU4jTWlkaS1QeXLDqW7DqWVzI0ZSCi1nZW8jRlItTyNOb3JkLVBhcy1EZS1DYWxhaXMjRlIKLWdlbyNGUi1QI0Jhc3NlLU5vcm1hbmRpZSNGUgotZ2VvI0ZSLVEjSGF1dGUtTm9ybWFuZGllI0ZSCi1nZW8jRlItUiNQYXlzIERlIExhIExvaXJlI0ZSCi1nZW8jRlItUyNQaWNhcmRpZSNGUgotZ2VvI0ZSLVQjUG9pdG91LUNoYXJlbnRlcyNGUgotZ2VvI0ZSLVUjUHJvdmVuY2UtQWxwZXMtQ8O0dGUgRCdBenVyI0ZSCi1nZW8jRlItViNSaMO0bmUtQWxwZXMjRlIKLWdlbyNHQSNHYWJvbiMtLQotZ2VvI0dCI1VuaXRlZCBLaW5nZG9tIy0tCi1nZW8jR0ItQU5UI0FudHJpbSNHQi1OSVIKLWdlbyNHQi1BUkQjQXJkcyNHQi1OSVIKLWdlbyNHQi1BUk0jQXJtYWdoI0dCLU5JUgotZ2VvI0dCLUFWTiNBdm9uI0dCLUVORwotZ2VvI0dCLUJERiNCZWRmb3Jkc2hpcmUjR0ItRU5HCi1nZW8jR0ItQkZTI0JlbGZhc3QjR0ItTklSCi1nZW8jR0ItQktNI0J1Y2tpbmdoYW1zaGlyZSNHQi1FTkcKLWdlbyNHQi1CTEEjQmFsbHltZW5hI0dCLU5JUgotZ2VvI0dCLUJMWSNCYWxseW1vbmV5I0dCLU5JUgotZ2VvI0dCLUJOQiNCYW5icmlkZ2UjR0ItTklSCi1nZW8jR0ItQk9SI0JvcmRlcnMgUmVnaW9uI0dCLVNDVAotZ2VvI0dCLUJSSyNCZXJrc2hpcmUjR0ItRU5HCi1nZW8jR0ItQ0FNI0NhbWJyaWRnZXNoaXJlI0dCLUVORwotZ2VvI0dCLUNFTiNDZW50cmFsIFJlZ2lvbiNHQi1TQ1QKLWdlbyNHQi1DR1YjQ3JhaWdhdm9uI0dCLU5JUgotZ2VvI0dCLUNIQSNDaGFubmVsIElzbGFuZHMjR0IKLWdlbyNHQi1DSFMjQ2hlc2hpcmUjR0ItRU5HCi1nZW8jR0ItQ0tGI0NhcnJpY2tmZXJndXMjR0ItTklSCi1nZW8jR0ItQ0tUI0Nvb2tzdG93biNHQi1OSVIKLWdlbyNHQi1DTFIjQ29sZXJhaW5lI0dCLU5JUgotZ2VvI0dCLUNMViNDbGV2ZWxhbmQjR0ItRU5HCi1nZW8jR0ItQ01BI0N1bWJyaWEjR0ItRU5HCi1nZW8jR0ItQ09OI0Nvcm53YWxsI0dCLUVORwotZ2VvI0dCLUNTUiNDYXN0bGVyZWFnaCNHQi1OSVIKLWdlbyNHQi1DV0QjQ2x3eWQjR0ItV0xTCi1nZW8jR0ItREJZI0RlcmJ5c2hpcmUjR0ItRU5HCi1nZW8jR0ItREZEI0R5ZmVkI0dCLVdMUwotZ2VvI0dCLURHTiNEdW5nYW5ub24jR0ItTklSCi1nZW8jR0ItREdZI0R1bWZyaWVzICYgR2FsbG93YXkgUmVnaW9uI0dCLVNDVAotZ2VvI0dCLURPUiNEb3JzZXQjR0ItRU5HCi1nZW8jR0ItRE9XI0Rvd24jR0ItTklSCi1nZW8jR0ItRFJZI0RlcnJ5I0dCLU5JUgotZ2VvI0dCLURVUiNEdXJoYW0jR0ItRU5HCi1nZW8jR0ItRFZWI0Rldm9uI0dCLUVORwotZ2VvI0dCLUVORyNFbmdsYW5kI0dCCi1nZW8jR0ItRVNTI0Vzc2V4I0dCLUVORwotZ2VvI0dCLUVTWCNFYXN0IFN1c3NleCNHQi1FTkcKLWdlbyNHQi1GRVIjRmVybWFuYWdoI0dCLU5JUgotZ2VvI0dCLUZJRiNGaWZlIFJlZ2lvbiNHQi1TQ1QKLWdlbyNHQi1HTFMjR2xvdWNlc3RlcnNoaXJlI0dCLUVORwotZ2VvI0dCLUdNUCNHcmFtcGlhbiBSZWdpb24jR0ItU0NUCi1nZW8jR0ItR05UI0d3ZW50I0dCLVdMUwotZ2VvI0dCLUdTWSNHdWVybnNleSNHQi1DSEEKLWdlbyNHQi1HVEwjR3JlYXRlciBMb25kb24jR0ItRU5HCi1nZW8jR0ItR1RNI0dyZWF0ZXIgTWFuY2hlc3RlciNHQi1FTkcKLWdlbyNHQi1HV04jR3d5bmVkZCNHQi1XTFMKLWdlbyNHQi1IQU0jSGFtcHNoaXJlI0dCLUVORwotZ2VvI0dCLUhMRCNIaWdobGFuZCBSZWdpb24jR0ItU0NUCi1nZW8jR0ItSFJUI0hlcnRmb3Jkc2hpcmUjR0ItRU5HCi1nZW8jR0ItSFVNI0h1bWJlcnNpZGUjR0ItRU5HCi1nZW8jR0ItSFdSI0hlcmVmb3JkIEFuZCBXb3JjZXN0ZXIjR0ItRU5HCi1nZW8jR0ItSU9NI0lzbGUgT2YgTWFuI0dCCi1nZW8jR0ItSU9TI0lzbGVzIE9mIFNjaWxseSNHQi1FTkcKLWdlbyNHQi1JT1cjSXNsZSBPZiBXaWdodCNHQi1FTkcKLWdlbyNHQi1KU1kjSmVyc2V5I0dCLUNIQQotZ2VvI0dCLUtFTiNLZW50I0dCLUVORwotZ2VvI0dCLUxBTiNMYW5jYXNoaXJlI0dCLUVORwotZ2VvI0dCLUxFQyNMZWljZXN0ZXJzaGlyZSNHQi1FTkcKLWdlbyNHQi1MSU4jTGluY29sbnNoaXJlI0dCLUVORwotZ2VvI0dCLUxNViNMaW1hdmFkeSNHQi1OSVIKLWdlbyNHQi1MUk4jTGFybmUjR0ItTklSCi1nZW8jR0ItTFNCI0xpc2J1cm4jR0ItTklSCi1nZW8jR0ItTFROI0xvdGhpYW4gUmVnaW9uI0dCLVNDVAotZ2VvI0dCLU1GVCNNYWdoZXJhZmVsdCNHQi1OSVIKLWdlbyNHQi1NR00jTWlkIEdsYW1vcmdhbiNHQi1XTFMKLWdlbyNHQi1NU1kjTWVyc2V5c2lkZSNHQi1FTkcKLWdlbyNHQi1NWUwjTW95bGUjR0ItTklSCi1nZW8jR0ItTkJMI05vcnRodW1iZXJsYW5kI0dCLUVORwotZ2VvI0dCLU5ETiNOb3J0aCBEb3duI0dCLU5JUgotZ2VvI0dCLU5GSyNOb3Jmb2xrI0dCLUVORwotZ2VvI0dCLU5JUiNOb3J0aGVybiBJcmVsYW5kI0dCCi1nZW8jR0ItTlRBI05ld3RvbmFiYmV5I0dCLU5JUgotZ2VvI0dCLU5USCNOb3J0aGFtcHRvbnNoaXJlI0dCLUVORwotZ2VvI0dCLU5UVCNOb3R0aW5naGFtc2hpcmUjR0ItRU5HCi1nZW8jR0ItTllLI05vcnRoIFlvcmtzaGlyZSNHQi1FTkcKLWdlbyNHQi1OWU0jTmV3cnkgQW5kIE1vdXJuZSNHQi1OSVIKLWdlbyNHQi1PTUgjT21hZ2gjR0ItTklSCi1nZW8jR0ItT1JLI09ya25leSNHQi1TQ1QKLWdlbyNHQi1PWEYjT3hmb3Jkc2hpcmUjR0ItRU5HCi1nZW8jR0ItUE9XI1Bvd3lzI0dCLVdMUwotZ2VvI0dCLVNDVCNTY290bGFuZCNHQgotZ2VvI0dCLVNGSyNTdWZmb2xrI0dCLUVORwotZ2VvI0dCLVNHTSNTb3V0aCBHbGFtb3JnYW4jR0ItV0xTCi1nZW8jR0ItU0hSI1Nocm9wc2hpcmUjR0ItRU5HCi1nZW8jR0ItU09NI1NvbWVyc2V0I0dCLUVORwotZ2VvI0dCLVNSWSNTdXJyZXkjR0ItRU5HCi1nZW8jR0ItU1RCI1N0cmFiYW5lI0dCLU5JUgotZ2VvI0dCLVNURCNTdHJhdGhjbHlkZSBSZWdpb24jR0ItU0NUCi1nZW8jR0ItU1RTI1N0YWZmb3Jkc2hpcmUjR0ItRU5HCi1nZW8jR0ItU1lLI1NvdXRoIFlvcmtzaGlyZSNHQi1FTkcKLWdlbyNHQi1UQVkjVGF5c2lkZSBSZWdpb24jR0ItU0NUCi1nZW8jR0ItVFdSI1R5bmUgQW5kIFdlYXIjR0ItRU5HCi1nZW8jR0ItV0FSI1dhcndpY2tzaGlyZSNHQi1FTkcKLWdlbyNHQi1XR00jV2VzdCBHbGFtb3JnYW4jR0ItV0xTCi1nZW8jR0ItV0lMI1dpbHRzaGlyZSNHQi1FTkcKLWdlbyNHQi1XSVMjV2VzdGVybiBJc2xlcyNHQi1TQ1QKLWdlbyNHQi1XTFMjV2FsZXMjR0IKLWdlbyNHQi1XTUQjV2VzdCBNaWRsYW5kcyNHQi1FTkcKLWdlbyNHQi1XU1gjV2VzdCBTdXNzZXgjR0ItRU5HCi1nZW8jR0ItV1lLI1dlc3QgWW9ya3NoaXJlI0dCLUVORwotZ2VvI0dCLVpFVCNTaGV0bGFuZCAoWmV0bGFuZCkjR0ItU0NUCi1nZW8jR0QjR3JlbmFkYSMtLQotZ2VvI0dFI0dlb3JnaWEjLS0KLWdlbyNHRiNGcmVuY2ggR3VpYW5hIy0tCi1nZW8jR0gjR2hhbmEjLS0KLWdlbyNHSSNHaWJyYWx0YXIjLS0KLWdlbyNHTCNHcmVlbmxhbmQjLS0KLWdlbyNHTSNHYW1iaWEjLS0KLWdlbyNHTiNHdWluZWEjLS0KLWdlbyNHUCNHdWFkZWxvdXBlIy0tCi1nZW8jR1EjRXF1YXRvcmlhbCBHdWluZWEjLS0KLWdlbyNHUiNHcmVlY2UjLS0KLWdlbyNHUyNHZW9yZ2lhICYgU2FuZHdpY2ggSXNsYW5kcyMtLQotZ2VvI0dUI0d1YXRlbWFsYSMtLQotZ2VvI0dVI0d1YW0jLS0KLWdlbyNHVyNHdWluZWEtQmlzc2F1Iy0tCi1nZW8jR1kjR3V5YW5hIy0tCi1nZW8jSEsjSG9uZyBLb25nIy0tCi1nZW8jSE4jSG9uZHVyYXMjLS0KLWdlbyNIUiNDcm9hdGlhIy0tCi1nZW8jSFQjSGFpdGkjLS0KLWdlbyNIVSNIdW5nYXJ5Iy0tCi1nZW8jSUQjSW5kb25lc2lhIy0tCi1nZW8jSUUjSXJlbGFuZCMtLQotZ2VvI0lMI0lzcmFlbCMtLQotZ2VvI0lOI0luZGlhIy0tCi1nZW8jSU8jSW5kaWFuIE9jZWFuIFRlcnJpdG9yeSMtLQotZ2VvI0lRI0lyYXEjLS0KLWdlbyNJUiMiSXJhbiwgSXNsYW1pYyBSZXB1YmxpYyBvZiIjLS0KLWdlbyNJUyNJY2VsYW5kIy0tCi1nZW8jSVQjSXRhbHkjLS0KLWdlbyNJVC0yMSNQaWVtb250ZSNJVAotZ2VvI0lULUFMI0FsZXNzYW5kcmlhI0lULTIxCi1nZW8jSVQtQVQjQXN0aSNJVC0yMgotZ2VvI0lULUJJI0JpZWxsYSNJVC0yMwotZ2VvI0lULUFPI0Fvc3RhIEFvc3RlIChmcikjSVQtMjMKLWdlbyNJVC1DTiNDdW5lbyNJVC0yNAotZ2VvI0lULU5PI05vdmFyYSNJVC0yNQotZ2VvI0lULUJHI0JlcmdhbW8jSVQtMjUKLWdlbyNJVC1CUyNCcmVzY2lhI0lULTI1Ci1nZW8jSVQtQ08jQ29tbyNJVC0yNQotZ2VvI0lULUNSI0NyZW1vbmEjSVQtMjUKLWdlbyNJVC1MQyNMZWNjbyNJVC0yNQotZ2VvI0lULUxPI0xvZGkjSVQtMjUKLWdlbyNJVC1NTiNNYW50b3ZhI0lULTI1Ci1nZW8jSVQtTUkjTWlsYW5vI0lULTI1Ci1nZW8jSVQtUFYjUGF2aWEjSVQtMjUKLWdlbyNJVC1TTyNTb25kcmlvI0lULTI1Ci1nZW8jSVQtVkEjVmFyZXNlI0lULTI1Ci1nZW8jSVQtVE8jVG9yaW5vI0lULTI2Ci1nZW8jSVQtVkIjVmVyYmFuby1DdXNpby1Pc3NvbGEjSVQtMjcKLWdlbyNJVC1WQyNWZXJjZWxsaSNJVC0yOAotZ2VvI0lULTIzI1ZhbGxlIGQnQW9zdGEjSVQKLWdlbyNJVC0yNSNMb21iYXJkaWEjSVQKLWdlbyNJVC0zMiNUcmVudGluby1BbHRvIEFkaWdlI0lUCi1nZW8jSVQtQlojQm9semFubyBCb3plbiAoZGUpI0lULTMyCi1nZW8jSVQtVE4jVHJlbnRvI0lULTMyCi1nZW8jSVQtMzQjVmVuZXRvI0lUCi1nZW8jSVQtQkwjQmVsbHVubyNJVC0zNAotZ2VvI0lULVBEI1BhZG92YSNJVC0zNAotZ2VvI0lULVJPI1JvdmlnbyNJVC0zNAotZ2VvI0lULVRWI1RyZXZpc28jSVQtMzQKLWdlbyNJVC1WRSNWZW5lemlhI0lULTM0Ci1nZW8jSVQtVlIjVmVyb25hI0lULTM0Ci1nZW8jSVQtVkkjVmljZW56YSNJVC0zNAotZ2VvI0lULTM2I0ZyaXVsaS1WZW5lemlhIEdpdWxpYSNJVAotZ2VvI0lULUdPI0dvcml6aWEjSVQtMzYKLWdlbyNJVC1QTiNQb3JkZW5vbmUjSVQtMzYKLWdlbyNJVC1UUyNUcmllc3RlI0lULTM2Ci1nZW8jSVQtVUQjVWRpbmUjSVQtMzYKLWdlbyNJVC00MiNMaWd1cmlhI0lUCi1nZW8jSVQtR0UjR2Vub3ZhI0lULTQyCi1nZW8jSVQtSU0jSW1wZXJpYSNJVC00MgotZ2VvI0lULVNQI0xhIFNwZXppYSNJVC00MgotZ2VvI0lULVNWI1Nhdm9uYSNJVC00MgotZ2VvI0lULTQ1I0VtaWxpYS1Sb21hZ25hI0lUCi1nZW8jSVQtQk8jQm9sb2duYSNJVC00NQotZ2VvI0lULUZFI0ZlcnJhcmEjSVQtNDUKLWdlbyNJVC1GTyNGb3Jsw6wjSVQtNDUKLWdlbyNJVC1NTyNNb2RlbmEjSVQtNDUKLWdlbyNJVC1QUiNQYXJtYSNJVC00NQotZ2VvI0lULVBDI1BpYWNlbnphI0lULTQ1Ci1nZW8jSVQtUkEjUmF2ZW5uYSNJVC00NQotZ2VvI0lULVJFI1JlZ2dpbyBFbWlsaWEjSVQtNDUKLWdlbyNJVC1STiNSaW1pbmkjSVQtNDUKLWdlbyNJVC01MiNUb3NjYW5hI0lUCi1nZW8jSVQtQVIjQXJlenpvI0lULTUyCi1nZW8jSVQtRkkjRmlyZW56ZSNJVC01MgotZ2VvI0lULUdSI0dyb3NzZXRvI0lULTUyCi1nZW8jSVQtTEkjTGl2b3JubyNJVC01MgotZ2VvI0lULUxVI0x1Y2NhI0lULTUyCi1nZW8jSVQtTVMjTWFzc2EtQ2FycmFyYSNJVC01MgotZ2VvI0lULVBJI1Bpc2EjSVQtNTIKLWdlbyNJVC1QVCNQaXN0b2lhI0lULTUyCi1nZW8jSVQtUE8jUHJhdG8jSVQtNTIKLWdlbyNJVC1TSSNTaWVuYSNJVC01MgotZ2VvI0lULTU1I1VtYnJpYSNJVAotZ2VvI0lULVBHI1BlcnVnaWEjSVQtNTUKLWdlbyNJVC1UUiNUZXJuaSNJVC01NQotZ2VvI0lULTU3I01hcmNoZSNJVAotZ2VvI0lULUFOI0FuY29uYSNJVC01NwotZ2VvI0lULUFQI0FzY29saSBQaWNlbm8jSVQtNTcKLWdlbyNJVC1NQyNNYWNlcmF0YSNJVC01NwotZ2VvI0lULVBTI1Blc2FybyBlIFVyYmlubyNJVC01NwotZ2VvI0lULTYyI0xhemlvI0lUCi1nZW8jSVQtRlIjRnJvc2lub25lI0lULTYyCi1nZW8jSVQtTFQjTGF0aW5hI0lULTYyCi1nZW8jSVQtUkkjUmlldGkjSVQtNjIKLWdlbyNJVC1STSNSb21hI0lULTYyCi1nZW8jSVQtVlQjVml0ZXJibyNJVC02MgotZ2VvI0lULTY1I0FicnV6em8jSVQKLWdlbyNJVC1DSCNDaGlldGkjSVQtNjUKLWdlbyNJVC1BUSNMJ0FxdWlsYSNJVC02NQotZ2VvI0lULVBFI1Blc2NhcmEjSVQtNjUKLWdlbyNJVC1URSNUZXJhbW8jSVQtNjUKLWdlbyNJVC02NyNNb2xpc2UjSVQKLWdlbyNJVC1DQiNDYW1wb2Jhc3NvI0lULTY3Ci1nZW8jSVQtSVMjSXNlcm5pYSNJVC02NwotZ2VvI0lULTcyI0NhbXBhbmlhI0lUCi1nZW8jSVQtQk4jQmVuZXZlbnRvI0lULTcyCi1nZW8jSVQtQ0UjQ2FzZXJ0YSNJVC03MgotZ2VvI0lULU5BI05hcG9saSNJVC03MgotZ2VvI0lULVNBI1NhbGVybm8jSVQtNzIKLWdlbyNJVC1BViNBdmVsbGlubyNJVC03MgotZ2VvI0lULTc1I1B1Z2xpYSNJVAotZ2VvI0lULUJBI0JhcmkjSVQtNzUKLWdlbyNJVC1CUiNCcmluZGlzaSNJVC03NQotZ2VvI0lULUZHI0ZvZ2dpYSNJVC03NQotZ2VvI0lULUxFI0xlY2NlI0lULTc1Ci1nZW8jSVQtVEEjVGFyYW50byNJVC03NQotZ2VvI0lULTc3I0Jhc2lsaWNhdGEjSVQKLWdlbyNJVC1NVCNNYXRlcmEjSVQtNzcKLWdlbyNJVC1QWiNQb3RlbnphI0lULTc3Ci1nZW8jSVQtNzgjQ2FsYWJyaWEjSVQKLWdlbyNJVC1DWiNDYXRhbnphcm8jSVQtNzgKLWdlbyNJVC1DUyNDb3NlbnphI0lULTc4Ci1nZW8jSVQtS1IjQ3JvdG9uZSNJVC03OAotZ2VvI0lULVJDI1JlZ2dpbyBDYWxhYnJpYSNJVC03OAotZ2VvI0lULVZWI1ZpYm8gVmFsZW50aWEjSVQtNzgKLWdlbyNJVC04MiNTaWNpbGlhI0lUCi1nZW8jSVQtQUcjQWdyaWdlbnRvI0lULTgyCi1nZW8jSVQtQ0wjQ2FsdGFuaXNzZXR0YSNJVC04MgotZ2VvI0lULUNUI0NhdGFuaWEjSVQtODIKLWdlbyNJVC1FTiNFbm5hI0lULTgyCi1nZW8jSVQtTUUjTWVzc2luYSNJVC04MgotZ2VvI0lULVBBI1BhbGVybW8jSVQtODIKLWdlbyNJVC1SRyNSYWd1c2EjSVQtODIKLWdlbyNJVC1TUiNTaXJhY3VzYSNJVC04MgotZ2VvI0lULVRQI1RyYXBhbmkjSVQtODIKLWdlbyNJVC04OCNTYXJkZWduYSNJVAotZ2VvI0lULUNBI0NhZ2xpYXJpI0lULTg4Ci1nZW8jSVQtTlUjTnVvcm8jSVQtODgKLWdlbyNJVC1PUiNPcmlzdGFubyNJVC04OAotZ2VvI0lULVNTI1Nhc3NhcmkjSVQtODgKLWdlbyNKTSNKYW1haWNhIy0tCi1nZW8jSk8jSm9yZGFuIy0tCi1nZW8jSlAjSmFwYW4jLS0KLWdlbyNKUC0wMSNIb2trYWlkbyNKUAotZ2VvI0pQLTAyI0FvbW9yaSNKUAotZ2VvI0pQLTAzI0l3YXRlI0pQCi1nZW8jSlAtMDQjTWl5YWdpI0pQCi1nZW8jSlAtMDUjQWtpdGEjSlAKLWdlbyNKUC0wNiNZYW1hZ2F0YSNKUAotZ2VvI0pQLTA3I0h1a3VzaW1hIChGdWt1c2hpbWEpI0pQCi1nZW8jSlAtMDgjSWJhcmFraSNKUAotZ2VvI0pQLTA5I1RvdGlnaSAoVG9jaGlnaSkjSlAKLWdlbyNKUC0xMCNHdW5tYSNKUAotZ2VvI0pQLTExI1NhaXRhbWEjSlAKLWdlbyNKUC0xMiNUaWJhIChDaGliYSkjSlAKLWdlbyNKUC0xMyNUb2t5byNKUAotZ2VvI0pQLTE0I0thbmFnYXdhI0pQCi1nZW8jSlAtMTUjTmlpZ2F0YSNKUAotZ2VvI0pQLTE2I1RveWFtYSNKUAotZ2VvI0pQLTE3I0lzaWthd2EgKElzaGlrYXdhKSNKUAotZ2VvI0pQLTE4I0h1a3VpIChGdWt1aSkjSlAKLWdlbyNKUC0xOSNZYW1hbmFzaSAoWWFtYW5hc2hpKSNKUAotZ2VvI0pQLTIwI05hZ2FubyNKUAotZ2VvI0pQLTIxI0dpaHUgKEdpZnUpI0pQCi1nZW8jSlAtMjIjU2l6dW9rYSAoU2hpenVva2EpI0pQCi1nZW8jSlAtMjMjQWl0aSAoQWljaGkpI0pQCi1nZW8jSlAtMjQjTWllI0pQCi1nZW8jSlAtMjUjU2lnYSAoU2hpZ2EpI0pQCi1nZW8jSlAtMjYjS3lvdG8jSlAKLWdlbyNKUC0yNyNPc2FrYSNKUAotZ2VvI0pQLTI4I0h5b2dvI0pQCi1nZW8jSlAtMjkjTmFyYSNKUAotZ2VvI0pQLTMwI1dha2F5YW1hI0pQCi1nZW8jSlAtMzEjVG90dG9yaSNKUAotZ2VvI0pQLTMyI1NpbWFuZSAoU2hpbWFuZSkjSlAKLWdlbyNKUC0zMyNPa2F5YW1hI0pQCi1nZW8jSlAtMzQjSGlyb3NpbWEgKEhpcm9zaGltYSkjSlAKLWdlbyNKUC0zNSNZYW1hZ3V0aSAoWWFtYWd1Y2hpKSNKUAotZ2VvI0pQLTM2I1Rva3VzaW1hIChUb2t1c2hpbWEpI0pQCi1nZW8jSlAtMzcjS2FnYXdhI0pQCi1nZW8jSlAtMzgjRWhpbWUjSlAKLWdlbyNKUC0zOSNLb3RpIChLb2NoaSkjSlAKLWdlbyNKUC00MCNIdWt1b2thIChGdWt1b2thKSNKUAotZ2VvI0pQLTQxI1NhZ2EjSlAKLWdlbyNKUC00MiNOYWdhc2FraSNKUAotZ2VvI0pQLTQzI0t1bWFtb3RvI0pQCi1nZW8jSlAtNDQjT2l0YSNKUAotZ2VvI0pQLTQ1I01peWF6YWtpI0pQCi1nZW8jSlAtNDYjS2Fnb3NpbWEgKEthZ29zaGltYSkjSlAKLWdlbyNKUC00NyNPa2luYXdhI0pQCi1nZW8jS0UjS2VueWEjLS0KLWdlbyNLRyNLeXJneXpzdGFuIy0tCi1nZW8jS0gjQ2FtYm9kaWEjLS0KLWdlbyNLSSNLaXJpYmF0aSMtLQotZ2VvI0tNI0NvbW9yb3MjLS0KLWdlbyNLTiNTdCBLaXR0cy1OZXZpcyMtLQotZ2VvI0tQIyJLb3JlYSwgRGVtIFBlb3BsZSdzIFJlcHVibGljIiMtLQotZ2VvI0tSIyJLb3JlYSwgUmVwdWJsaWMgb2YiIy0tCi1nZW8jS1ItMTEjU2VvdWwgVGV1Z2J5ZW9sc2kjS1IKLWdlbyNLUi0yNiNCdXNhbiBHd2FuZyd5ZW9nc2kjS1IKLWdlbyNLUi0yNyNEYWVndSBHd2FuZyd5ZW9nc2kjS1IKLWdlbyNLUi0zMCNEYWVqZW9uIEd3YW5nJ3llb2dzaSNLUgotZ2VvI0tSLTI5I0d3YW5nanUgR3dhbmcneWVvZ3NpI0tSCi1nZW8jS1ItMjgjSW5jaGVvbiBHd2FuZyd5ZW9nc2kjS1IKLWdlbyNLUi0zMSNVbHNhbiBHd2FuZyd5ZW9nc2kjS1IKLWdlbyNLUi00MyNDaHVuZ2NoZW9uZ2J1Z2RvI0tSCi1nZW8jS1ItNDQjQ2h1bmdjaGVvbmduYW1kbyNLUgotZ2VvI0tSLTQyI0dhbmcnd2VvbmRvI0tSCi1nZW8jS1ItNDEjR3llb25nZ2lkbyNLUgotZ2VvI0tSLTQ3I0d5ZW9uZ3NhbmdidWdkbyNLUgotZ2VvI0tSLTQ4I0d5ZW9uZ3NhbmduYW1kbyNLUgotZ2VvI0tSLTQ5I0planVkbyNLUgotZ2VvI0tSLTQ1I0plb25yYWJ1Z2RvI0tSCi1nZW8jS1ItNDYjSmVvbnJhbmFtZG8jS1IKLWdlbyNLVyNLdXdhaXQjLS0KLWdlbyNLWSNDYXltYW4gSXNsYW5kcyMtLQotZ2VvI0taI0themFraHN0YW4jLS0KLWdlbyNMQSNMYW8gUGVvcGxlJ3MgRGVtb2NyYXRpYyBSZXB1YmxpYyMtLQotZ2VvI0xCI0xlYmFub24jLS0KLWdlbyNMQyNTYWludCBMdWNpYSMtLQotZ2VvI0xJI0xpZWNodGVuc3RlaW4jLS0KLWdlbyNMSyNTcmkgTGFua2EjLS0KLWdlbyNMUiNMaWJlcmlhIy0tCi1nZW8jTFMjTGVzb3RobyMtLQotZ2VvI0xUI0xpdGh1YW5pYSMtLQotZ2VvI0xVI0x1eGVtYm91cmcjLS0KLWdlbyNMViNMYXR2aWEjLS0KLWdlbyNMWSNMeWJpYW4gQXJhYiBKYW1haGlyaXlhIy0tCi1nZW8jTUEjTW9yb2NjbyMtLQotZ2VvI01DI01vbmFjbyMtLQotZ2VvI01EI01vbGRvdmEjLS0KLWdlbyNNRyNNYWRhZ2FzY2FyIy0tCi1nZW8jTUgjTWFyc2hhbGwgSXNsYW5kcyMtLQotZ2VvI01LI0Zvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBPZiBNYWNlZG9uaWEjLS0KLWdlbyNNTCNNYWxpIy0tCi1nZW8jTU0jTXlhbm1hciAoRm9ybWVyIEJ1cm1hKSMtLQotZ2VvI01OI01vbmdvbGlhIy0tCi1nZW8jTU8jTWFjYXUjLS0KLWdlbyNNUCNOb3J0aGVybiBNYXJpYW5hcyMtLQotZ2VvI01RI01hcnRpbmlxdWUjLS0KLWdlbyNNUiNNYXVyaXRhbmlhIy0tCi1nZW8jTVMjTW9udHNlcnJhdCMtLQotZ2VvI01UI01hbHRhIy0tCi1nZW8jTVUjTWF1cml0aXVzIy0tCi1nZW8jTVYjTWFsZGl2ZXMjLS0KLWdlbyNNVyNNYWxhd2kjLS0KLWdlbyNNWCNNZXhpY28jLS0KLWdlbyNNWC1BR1UjQWd1YXNjYWxpZW50ZXMjTVgKLWdlbyNNWC1CQ04jQmFqYSBDYWxpZm9ybmlhI01YCi1nZW8jTVgtQkNTI0JhamEgQ2FsaWZvcm5pYSBTdXIjTVgKLWdlbyNNWC1DQU0jQ2FtcGVjaGUjTVgKLWdlbyNNWC1DSEgjQ2hpaHVhaHVhI01YCi1nZW8jTVgtQ0hQI0NoaWFwYXMjTVgKLWdlbyNNWC1DT0EjQ29haHVpbGEjTVgKLWdlbyNNWC1DT0wjQ29saW1hI01YCi1nZW8jTVgtREYjRGlzdHJpdG8gRmVkZXJhbCNNWAotZ2VvI01YLURVUiNEdXJhbmdvI01YCi1nZW8jTVgtR1JPI0d1ZXJyZXJvI01YCi1nZW8jTVgtR1VBI0d1YW5hanVhdG8jTVgKLWdlbyNNWC1ISUQjSGlkYWxnbyNNWAotZ2VvI01YLUpBTCNKYWxpc2NvI01YCi1nZW8jTVgtTUVYI01leGljbyNNWAotZ2VvI01YLU1JQyNNaWNob2FjYW4jTVgKLWdlbyNNWC1NT1IjTW9yZWxvcyNNWAotZ2VvI01YLU5BWSNOYXlhcml0I01YCi1nZW8jTVgtTkxFI051ZXZvIExlb24jTVgKLWdlbyNNWC1PQVgjT2F4YWNhI01YCi1nZW8jTVgtUFVFI1B1ZWJsYSNNWAotZ2VvI01YLVFVRSNRdWVyZXRhcm8jTVgKLWdlbyNNWC1ST08jUXVpbnRhbmEgUm9vI01YCi1nZW8jTVgtU0lOI1NpbmFsb2EjTVgKLWdlbyNNWC1TTFAjU2FuIEx1aXMgUG90b3NpI01YCi1nZW8jTVgtU09OI1Nvbm9yYSNNWAotZ2VvI01YLVRBQiNUYWJhc2NvI01YCi1nZW8jTVgtVEFNI1RhbWF1bGlwYXMjTVgKLWdlbyNNWC1UTEEjVGxheGNhbGEjTVgKLWdlbyNNWC1WRVIjVmVyYWNydXojTVgKLWdlbyNNWC1ZVUMjWXVjYXRhbiNNWAotZ2VvI01YLVpBQyNaYWNhdGVjYXMjTVgKLWdlbyNNWSNNYWxheXNpYSMtLQotZ2VvI01aI01vemFtYmlxdWUjLS0KLWdlbyNOQSNOYW1pYmlhIy0tCi1nZW8jTkMjTmV3IENhbGVkb25pYSMtLQotZ2VvI05FI05pZ2VyIy0tCi1nZW8jTkYjTm9yZm9sayBJc2xhbmQjLS0KLWdlbyNORyNOaWdlcmlhIy0tCi1nZW8jTkctRkMjQWJ1amEgQ2FwaXRhbCBUZXJyaXRvcnkjTkcKLWdlbyNORy1BQiNBYmlhI05HCi1nZW8jTkctQUQjQWRhbWF3YSNORwotZ2VvI05HLUFLI0Frd2EgSWJvbSNORwotZ2VvI05HLUFOI0FuYW1icmEjTkcKLWdlbyNORy1CQSNCYXVjaGkjTkcKLWdlbyNORy1CWSNCYXllbHNhI05HCi1nZW8jTkctQkUjQmVudWUjTkcKLWdlbyNORy1CTyNCb3JubyNORwotZ2VvI05HLUNSI0Nyb3NzIFJpdmVyI05HCi1nZW8jTkctREUjRGVsdGEjTkcKLWdlbyNORy1FQiNFYm9ueWkjTkcKLWdlbyNORy1FRCNFZG8jTkcKLWdlbyNORy1FSyNFa2l0aSNORwotZ2VvI05HLUVOI0VudWd1I05HCi1nZW8jTkctR08jR29tYmUjTkcKLWdlbyNORy1JTSNJbW8jTkcKLWdlbyNORy1KSSNKaWdhd2EjTkcKLWdlbyNORy1LRCNLYWR1bmEjTkcKLWdlbyNORy1LTiNLYW5vI05HCi1nZW8jTkctS1QjS2F0c2luYSNORwotZ2VvI05HLUtFI0tlYmJpI05HCi1nZW8jTkctS08jS29naSNORwotZ2VvI05HLUtXI0t3YXJhI05HCi1nZW8jTkctTEEjTGFnb3MjTkcKLWdlbyNORy1OQSNOYXNzYXJhd2EjTkcKLWdlbyNORy1OSSNOaWdlciNORwotZ2VvI05HLU9HI09ndW4jTkcKLWdlbyNORy1PTiNPbmRvI05HCi1nZW8jTkctT1MjT3N1biNORwotZ2VvI05HLU9ZI095byNORwotZ2VvI05HLVBMI1BsYXRlYXUjTkcKLWdlbyNORy1SSSNSaXZlcnMjTkcKLWdlbyNORy1TTyNTb2tvdG8jTkcKLWdlbyNORy1UQSNUYXJhYmEjTkcKLWdlbyNORy1ZTyNZb2JlI05HCi1nZW8jTkctWkEjWmFtZmFyYSNORwotZ2VvI05JI05pY2FyYWd1YSMtLQotZ2VvI05MI05ldGhlcmxhbmRzIy0tCi1nZW8jTk8jTm9yd2F5Iy0tCi1nZW8jTk8tMDEjw5hzdGZvbGQjTk8KLWdlbyNOTy0wMiNBa2Vyc2h1cyNOTwotZ2VvI05PLTAzI09zbG8jTk8KLWdlbyNOTy0wNCNIZWRtYXJrI05PCi1nZW8jTk8tMDUjT3BwbGFuZCNOTwotZ2VvI05PLTA2I0J1c2tlcnVkI05PCi1nZW8jTk8tMDcjVmVzdGZvbGQjTk8KLWdlbyNOTy0wOCNUZWxlbWFyayNOTwotZ2VvI05PLTA5I0F1c3QtQWdkZXIjTk8KLWdlbyNOTy0xMCNWZXN0LUFnZGVyI05PCi1nZW8jTk8tMTEjUm9nYWxhbmQjTk8KLWdlbyNOTy0xMiNOb3JkYWxhbmQjTk8KLWdlbyNOTy0xNCNTb2duIE9nIEZqb3JkYW5lI05PCi1nZW8jTk8tMTUjTcO4cmUgT2cgUm9tc2RhbCNOTwotZ2VvI05PLTE2I1PDuHItVHLDuG5kZWxhZyNOTwotZ2VvI05PLTE3I05vcmQtVHLDuG5kZWxhZyNOTwotZ2VvI05PLTE4I05vcmRsYW5kI05PCi1nZW8jTk8tMTkjVHJvbXMjTk8KLWdlbyNOTy0yMCNGaW5ubWFyayNOTwotZ2VvI05QI05lcGFsIy0tCi1nZW8jTlIjTmF1cnUjLS0KLWdlbyNOVSNOaXVlIy0tCi1nZW8jTlojTmV3IFplYWxhbmQjLS0KLWdlbyNOWi1BVUsjQXVja2xhbmQjTlotTgotZ2VvI05aLUJPUCNCYXkgT2YgUGxlbnR5I05aLU4KLWdlbyNOWi1DQU4jQ2FudGVyYnVyeSNOWi1TCi1nZW8jTlotR0lTI0dpc2Jvcm5lI05aLU4KLWdlbyNOWi1IS0IjSGF3a2VzJ1MgQmF5I05aLU4KLWdlbyNOWi1NQkgjTWFybGJvcm91Z2gjTlotUwotZ2VvI05aLU1XVCNNYW5hd2F0dS1XYW5nYW51aSNOWi1OCi1nZW8jTlotTiNOb3J0aCBJc2xhbmQjTloKLWdlbyNOWi1OU04jTmVsc29uI05aLVMKLWdlbyNOWi1OVEwjTm9ydGhsYW5kI05aLU4KLWdlbyNOWi1PVEEjT3RhZ28jTlotUwotZ2VvI05aLVMjU291dGggSXNsYW5kI05aCi1nZW8jTlotU1RMI1NvdXRobGFuZCNOWi1TCi1nZW8jTlotVEFTI1Rhc21hbiNOWi1TCi1nZW8jTlotVEtJI1RhcmFuYWtpI05aLU4KLWdlbyNOWi1XR04jV2VsbGluZ3RvbiNOWi1OCi1nZW8jTlotV0tPI1dhaWthdG8jTlotTgotZ2VvI05aLVdUQyNXZXN0IENvYXN0I05aLVMKLWdlbyNPTSNPbWFuIy0tCi1nZW8jUEEjUGFuYW1hIy0tCi1nZW8jUEUjUGVydSMtLQotZ2VvI1BGI0ZyZW5jaCBQb2x5bmVzaWEjLS0KLWdlbyNQRyNQYXB1YSBOZXcgR3VpbmVhIy0tCi1nZW8jUEgjUGhpbGlwcGluZXMjLS0KLWdlbyNQSyNQYWtpc3RhbiMtLQotZ2VvI1BMI1BvbGFuZCMtLQotZ2VvI1BMLURTI0RvbG5vxZtsxIVza2llI1BMCi1nZW8jUEwtS1AjS3VqYXdza28tcG9tb3Jza2llI1BMCi1nZW8jUEwtTFUjTHViZWxza2llI1BMCi1nZW8jUEwtTEIjTHVidXNraWUjUEwKLWdlbyNQTC1MRCPFgcOzZHpraWUjUEwKLWdlbyNQTC1NQSNNYcWCb3BvbHNraWUjUEwKLWdlbyNQTC1NWiNNYXpvd2llY2tpZSNQTAotZ2VvI1BMLU9QI09wb2xza2llI1BMCi1nZW8jUEwtUEsjUG9ka2FycGFja2llI1BMCi1nZW8jUEwtUEQjUG9kbGFza2llI1BMCi1nZW8jUEwtUE0jUG9tb3Jza2llI1BMCi1nZW8jUEwtU0wjxZpsxIVza2llI1BMCi1nZW8jUEwtU0sjxZp3acSZdG9rcnp5c2tpZSNQTAotZ2VvI1BMLVdOI1dhcm1pxYRza28tbWF6dXJza2llI1BMCi1nZW8jUEwtV1AjV2llbGtvcG9sc2tpZSNQTAotZ2VvI1BMLVpQI1phY2hvZG5pb3BvbW9yc2tpZSNQTAotZ2VvI1BNI1N0IFBpZXJyZSBBbmQgTWlxdWVsb24jLS0KLWdlbyNQTiNQaXRjYWlybiMtLQotZ2VvI1BSI1B1ZXJ0byBSaWNvIy0tCi1nZW8jUFMjIlBhbGVzdGluaWFuIFRlcnJpdG9yeSwgT2NjdXBpZWQiIy0tCi1nZW8jUFQjUG9ydHVnYWwjLS0KLWdlbyNQVyNQYWxhdSMtLQotZ2VvI1BZI1BhcmFndWF5Iy0tCi1nZW8jUUEjUWF0YXIjLS0KLWdlbyNSRSNSZXVuaW9uIy0tCi1nZW8jUk8jUm9tYW5pYSMtLQotZ2VvI1JPLUIjQnVjdXJlxZ90aSNSTwotZ2VvI1JPLUFCI0FsYmEjUk8KLWdlbyNSTy1BUiNBcmFkI1JPCi1nZW8jUk8tQUcjQXJnZcWfI1JPCi1nZW8jUk8tQkMjQmFjxIN1I1JPCi1nZW8jUk8tQkgjQmlob3IjUk8KLWdlbyNSTy1CTiNCaXN0cmnFo2EtTsSDc8SDdWQjUk8KLWdlbyNSTy1CVCNCb3RvxZ9hbmkjUk8KLWdlbyNSTy1CViNCcmHFn292I1JPCi1nZW8jUk8tQlIjQnLEg2lsYSNSTwotZ2VvI1JPLUJaI0J1esSDdSNSTwotZ2VvI1JPLUNTI0NhcmHFny1TZXZlcmluI1JPCi1nZW8jUk8tQ0wjQ8SDbMSDcmHFn2kjUk8KLWdlbyNSTy1DSiNDbHVqI1JPCi1nZW8jUk8tQ1QjQ29uc3RhbsWjYSNSTwotZ2VvI1JPLUNWI0NvdmFzbmEjUk8KLWdlbyNSTy1EQiNEw6JtYm92acWjYSNSTwotZ2VvI1JPLURKI0RvbGojUk8KLWdlbyNSTy1HTCNHYWxhxaNpI1JPCi1nZW8jUk8tR1IjR2l1cmdpdSNSTwotZ2VvI1JPLUdKI0dvcmojUk8KLWdlbyNSTy1IUiNIYXJnaGl0YSNSTwotZ2VvI1JPLUhEI0h1bmVkb2FyYSNSTwotZ2VvI1JPLUlMI0lhbG9tacWjYSNSTwotZ2VvI1JPLUlTI0lhxZ9pI1JPCi1nZW8jUk8tTU0jTWFyYW11cmXFnyNSTwotZ2VvI1JPLU1II01laGVkaW7Fo2kjUk8KLWdlbyNSTy1NUyNNdXJlxZ8jUk8KLWdlbyNSTy1OVCNOZWFtxaMjUk8KLWdlbyNSTy1PVCNPbHQjUk8KLWdlbyNSTy1QSCNQcmFob3ZhI1JPCi1nZW8jUk8tU00jU2F0dSBNYXJlI1JPCi1nZW8jUk8tU0ojU8SDbGFqI1JPCi1nZW8jUk8tU0IjU2liaXUjUk8KLWdlbyNSTy1TViNTdWNlYXZhI1JPCi1nZW8jUk8tVFIjVGVsZW9ybWFuI1JPCi1nZW8jUk8tVE0jVGltacWfI1JPCi1nZW8jUk8tVEwjVHVsY2VhI1JPCi1nZW8jUk8tVlMjVmFzbHVpI1JPCi1nZW8jUk8tVkwjVsOibGNlYSNSTwotZ2VvI1JPLVZOI1ZyYW5jZWEjUk8KLWdlbyNSVSNSdXNzaWFuIEZlZGVyYXRpb24jLS0KLWdlbyNSVS1BRCMiQWR5Z2VqYSwgUmVzcHVibGlrYSIjUlUKLWdlbyNSVS1BTCMiQWx0YWosIFJlc3B1Ymxpa2EiI1JVCi1nZW8jUlUtQkEjIkJhxaFrb3J0b3N0YW4sIFJlc3B1Ymxpa2EiI1JVCi1nZW8jUlUtQlUjIkJ1cmphdGlqYSwgUmVzcHVibGlrYSIjUlUKLWdlbyNSVS1DRSPEjGXEjWVuc2thamEgUmVzcHVibGlrYSNSVQotZ2VvI1JVLUNVI8SMdXZhxaFza2FqYSBSZXNwdWJsaWthI1JVCi1nZW8jUlUtREEjIkRhZ2VzdGFuLCBSZXNwdWJsaWthIiNSVQotZ2VvI1JVLUlOI0luZ3XFoXNrYWphIFJlc3B1Ymxpa2EgW1Jlc3B1Ymxpa2EgSW5ndcWhZXRpamFdI1JVCi1nZW8jUlUtS0IjS2FiYXJkaW5vLUJhbGthcnNrYWphIFJlc3B1Ymxpa2EjUlUKLWdlbyNSVS1LTCMiS2FsbXlraWphLCBSZXNwdWJsaWthIiNSVQotZ2VvI1JVLUtDI0thcmHEjWFqZXZvLcSMZXJrZXNza2FqYSBSZXNwdWJsaWthI1JVCi1nZW8jUlUtS1IjIkthcmVsaWphLCBSZXNwdWJsaWthIiNSVQotZ2VvI1JVLUtLIyJIYWthc2lqYSwgUmVzcHVibGlrYSIjUlUKLWdlbyNSVS1LTyMiS29taSwgUmVzcHVibGlrYSIjUlUKLWdlbyNSVS1NRSMiTWFyaWogw4hsLCBSZXNwdWJsaWthIiNSVQotZ2VvI1JVLU1PIyJNb3Jkb3ZpamEsIFJlc3B1Ymxpa2EiI1JVCi1nZW8jUlUtU0EjIlNhaGEsIFJlc3B1Ymxpa2EgW0pha3V0aWphXSIjUlUKLWdlbyNSVS1TRSMiU2V2ZXJuYWphIE9zZXRpamEsIFJlc3B1Ymxpa2EgW0FsYW5pamFdIFtSZXNwdWJsaWthIFNldmVybmFqYSBPc2V0aWphLUFsYW5pamFdIiNSVQotZ2VvI1JVLVRBIyJUYXRhcnN0YW4sIFJlc3B1Ymxpa2EiI1JVCi1nZW8jUlUtVFkjIlR5dmEsIFJlc3B1Ymxpa2EgW1R1dmFdIiNSVQotZ2VvI1JVLVVEI1VkbXVydHNrYWphIFJlc3B1Ymxpa2EjUlUKLWdlbyNSVS1BTFQjQWx0YWpza2lqIGtyYWojUlUKLWdlbyNSVS1LSEEjSGFiYXJvdnNraWoga3JhaiNSVQotZ2VvI1JVLUtEQSNLcmFzbm9kYXJza2lqIGtyYWojUlUKLWdlbyNSVS1LWUEjS3Jhc25vamFyc2tpaiBrcmFqI1JVCi1nZW8jUlUtUFJJI1ByaW1vcnNraWoga3JhaiNSVQotZ2VvI1JVLVNUQSNTdGF2cm9wb2wnc2tpaiBrcmFqI1JVCi1nZW8jUlUtQU1VI0FtdXJza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtQVJLI0FyaGFuZ2VsJ3NrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1BU1QjQXN0cmFoYW5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtQkVMI0JlbGdvcm9kc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUJSWSNCcmphbnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1DSEUjxIxlbGphYmluc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUNISSPEjGl0aW5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtSVJLI0lya3V0c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUlWQSNJdmFub3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS0dEI0thbGluaW5ncmFkc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUtMVSNLYWx1xb5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS0FNI0thbcSNYXRza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS0VNI0tlbWVyb3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS0lSI0tpcm92c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUtPUyNLb3N0cm9tc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUtHTiNLdXJnYW5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtS1JTI0t1cnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1MRU4jTGVuaW5ncmFkc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLUxJUCNMaXBldHNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1NQUcjTWFnYWRhbnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1NT1MjTW9za292c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLU1VUiNNdXJtYW5za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtTklaI05pxb5lZ29yb2Rza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtTkdSI05vdmdvcm9kc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLU5WUyNOb3Zvc2liaXJza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtT01TI09tc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLU9SRSNPcmVuYnVyZ3NrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1PUkwjT3Jsb3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtUE5aI1BlbnplbnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1QRVIjUGVybXNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1QU0sjUHNrb3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtUk9TI1Jvc3RvdnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1SWUEjUmphemFuc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVNBSyNTYWhhbGluc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVNBTSNTYW1hcnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1TQVIjU2FyYXRvdnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1TTU8jU21vbGVuc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVNWRSNTdmVyZGxvdnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1UQU0jVGFtYm92c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVRPTSNUb21za2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVFVMI1R1bCdza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVFZFI1R2ZXJza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVFlVI1RqdW1lbnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1VTFkjVWwnamFub3Zza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVkxBI1ZsYWRpbWlyc2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVZHRyNWb2xnb2dyYWRza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVkxHI1ZvbG9nb2Rza2FqYSBvYmxhc3QnI1JVCi1nZW8jUlUtVk9SI1Zvcm9uZcW+c2thamEgb2JsYXN0JyNSVQotZ2VvI1JVLVlBUiNKYXJvc2xhdnNrYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1NT1cjTW9za3ZhI1JVCi1nZW8jUlUtU1BFI1Nhbmt0LVBldGVyYnVyZyNSVQotZ2VvI1JVLVlFViNFdnJlanNrYWphIGF2dG9ub21uYWphIG9ibGFzdCcjUlUKLWdlbyNSVS1BR0IjQWdpbnNraWogQnVyamF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnI1JVCi1nZW8jUlUtQ0hVI8SMdWtvdHNraWogYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLUVWRSPDiHZlbmtpanNraWogYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLUtITSNIYW50eS1NYW5zaWpza2lqIGF2dG9ub21ueWogb2tydWcjUlUKLWdlbyNSVS1LT1AjS29taS1QZXJtamF0c2tpaiBhdnRvbm9tbnlqIG9rcnVnI1JVCi1nZW8jUlUtS09SI0tvcmpha3NraWogYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLU5FTiNOZW5ldHNraWogYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLVRBWSNUYWpteXJza2lqIChEb2xnYW5vLU5lbmV0c2tpaikgYXZ0b25vbW55aiBva3J1ZyNSVQotZ2VvI1JVLVVPQiNVc3QnLU9yZHluc2tpaiBCdXJqYXRza2lqIGF2dG9ub21ueWogb2tydWcjUlUKLWdlbyNSVS1ZQU4jSmFtYWxvLU5lbmV0c2tpaiBhdnRvbm9tbnlqIG9rcnVnI1JVCi1nZW8jUlcjUndhbmRhIy0tCi1nZW8jU0EjU2F1ZGkgQXJhYmlhIy0tCi1nZW8jU0IjU29sb21vbiBJc2xhbmRzIy0tCi1nZW8jU0MjU2V5Y2hlbGxlcyMtLQotZ2VvI1NEI1N1ZGFuIy0tCi1nZW8jU0UjU3dlZGVuIy0tCi1nZW8jU0UtQUIjU3RvY2tob2xtcyBMw6RuI1NFCi1nZW8jU0UtQUMjVsOkc3RlcmJvdHRlbnMgTMOkbiNTRQotZ2VvI1NFLUJEI05vcnJib3R0ZW5zIEzDpG4jU0UKLWdlbyNTRS1DI1VwcHNhbGEgTMOkbiNTRQotZ2VvI1NFLUQjU8O2ZGVybWFubGFuZHMgTMOkbiNTRQotZ2VvI1NFLUUjw5ZzdGVyZ8O2dGxhbmRzIEzDpG4jU0UKLWdlbyNTRS1GI0rDtm5rw7ZwaW5ncyBMw6RuI1NFCi1nZW8jU0UtRyNLcm9ub2JvcmdzIEzDpG4jU0UKLWdlbyNTRS1II0thbG1hciBMw6RuI1NFCi1nZW8jU0UtSSNHb3RsYW5kcyBMw6RuI1NFCi1nZW8jU0UtSyNCbGVraW5nZSBMw6RuI1NFCi1nZW8jU0UtTSNTa8OlbmUgTMOkbiNTRQotZ2VvI1NFLU4jSGFsbGFuZHMgTMOkbiNTRQotZ2VvI1NFLU8jVsOkc3RyYSBHw7Z0YWxhbmRzIEzDpG4jU0UKLWdlbyNTRS1TI1bDpHJtbGFuZHMgTMOkbiNTRQotZ2VvI1NFLVQjw5ZyZWJybyBMw6RuI1NFCi1nZW8jU0UtVSNWw6RzdG1hbmxhbmRzIEzDpG4jU0UKLWdlbyNTRS1XI0RhbGFybmVzIEzDpG4jU0UKLWdlbyNTRS1YI0fDpHZsZWJvcmdzIEzDpG4jU0UKLWdlbyNTRS1ZI1bDpHN0ZXJub3JybGFuZHMgTMOkbiNTRQotZ2VvI1NFLVojSsOkbXRsYW5kcyBMw6RuI1NFCi1nZW8jU0cjU2luZ2Fwb3JlIy0tCi1nZW8jU0gjU3QgSGVsZW5hIy0tCi1nZW8jU0kjU2xvdmVuaWEjLS0KLWdlbyNTSiNTdmFsYmFyZCBBbmQgSmFuIE1heWVuIy0tCi1nZW8jU0sjU2xvdmFraWEjLS0KLWdlbyNTTCNTaWVycmEgTGVvbmUjLS0KLWdlbyNTTSNTYW4gTWFyaW5vIy0tCi1nZW8jU04jU2VuZWdhbCMtLQotZ2VvI1NPI1NvbWFsaWEjLS0KLWdlbyNTUiNTdXJpbmFtZSMtLQotZ2VvI1NUI1NhbyBUb21lIEFuZCBQcmluY2lwZSMtLQotZ2VvI1NWI0VsIFNhbHZhZG9yIy0tCi1nZW8jU1kjU3lyaWFuIEFyYWIgUmVwdWJsaWMjLS0KLWdlbyNTWiNTd2F6aWxhbmQjLS0KLWdlbyNUQyNUdXJrcyBBbmQgQ2FpY29zIElzbGFuZHMjLS0KLWdlbyNURCNDaGFkIy0tCi1nZW8jVEYjRnJlbmNoIFNvdXRoZXJuIFRlcnJpdG9yaWVzIy0tCi1nZW8jVEcjVG9nbyMtLQotZ2VvI1RII1RoYWlsYW5kIy0tCi1nZW8jVEojVGFqaWtpc3RhbiMtLQotZ2VvI1RNI1R1cmttZW5pc3RhbiMtLQotZ2VvI1ROI1R1bmlzaWEjLS0KLWdlbyNUTyNUb25nYSMtLQotZ2VvI1RQI0Vhc3QgVGltb3IjLS0KLWdlbyNUUiNUdXJrZXkjLS0KLWdlbyNUUi0wMSNBZGFuYSNUUgotZ2VvI1RSLTAyI0FkxLF5YW1hbiNUUgotZ2VvI1RSLTAzI0FmeW9uI1RSCi1nZW8jVFItMDQjQcSfcsSxI1RSCi1nZW8jVFItMDUjQW1hc3lhI1RSCi1nZW8jVFItMDYjQW5rYXJhI1RSCi1nZW8jVFItMDcjQW50YWx5YSNUUgotZ2VvI1RSLTA4I0FydHZpbiNUUgotZ2VvI1RSLTA5I0F5ZMSxbiNUUgotZ2VvI1RSLTEwI0JhbMSxa2VzaXIjVFIKLWdlbyNUUi0xMSNCaWxlY2lrI1RSCi1nZW8jVFItMTIjQmluZ8O2bCNUUgotZ2VvI1RSLTEzI0JpdGxpcyNUUgotZ2VvI1RSLTE0I0JvbHUjVFIKLWdlbyNUUi0xNSNCdXJkdXIjVFIKLWdlbyNUUi0xNiNCdXJzYSNUUgotZ2VvI1RSLTE3I8OHYW5ha2thbGUjVFIKLWdlbyNUUi0xOCPDh2Fua8SxcsSxI1RSCi1nZW8jVFItMTkjw4dvcnVtI1RSCi1nZW8jVFItMjAjRGVuaXpsaSNUUgotZ2VvI1RSLTIxI0RpeWFyYmFrxLFyI1RSCi1nZW8jVFItMjIjRWRpcm5lI1RSCi1nZW8jVFItMjMjRWxhesSxZyNUUgotZ2VvI1RSLTI0I0VyemluY2FuI1RSCi1nZW8jVFItMjUjRXJ6dXJ1bSNUUgotZ2VvI1RSLTI2I0Vza2nFn2VoaXIjVFIKLWdlbyNUUi0yNyNHYXppYW50ZXAjVFIKLWdlbyNUUi0yOCNHaXJlc3VuI1RSCi1nZW8jVFItMjkjR8O8bcO8xZ9oYW5lI1RSCi1nZW8jVFItMzAjSGFra8OicmkjVFIKLWdlbyNUUi0zMSNIYXRheSNUUgotZ2VvI1RSLTMyI0lzcGFydGEjVFIKLWdlbyNUUi0zMyPEsMOnZWwjVFIKLWdlbyNUUi0zNCPEsHN0YW5idWwjVFIKLWdlbyNUUi0zNSPEsHptaXIjVFIKLWdlbyNUUi0zNiNLYXJzI1RSCi1nZW8jVFItMzcjS2FzdGFtb251I1RSCi1nZW8jVFItMzgjS2F5c2VyaSNUUgotZ2VvI1RSLTM5I0vEsXJrbGFyZWxpI1RSCi1nZW8jVFItNDAjS8SxcsWfZWhpciNUUgotZ2VvI1RSLTQxI0tvY2FlbGkjVFIKLWdlbyNUUi00MiNLb255YSNUUgotZ2VvI1RSLTQzI0vDvHRhaHlhI1RSCi1nZW8jVFItNDQjTWFsYXR5YSNUUgotZ2VvI1RSLTQ1I01hbmlzYSNUUgotZ2VvI1RSLTQ2I0thaHJhbWFubWFyYcWfI1RSCi1nZW8jVFItNDcjTWFyZGluI1RSCi1nZW8jVFItNDgjTXXEn2xhI1RSCi1nZW8jVFItNDkjTXXFnyNUUgotZ2VvI1RSLTUwI05ldsWfZWhpciNUUgotZ2VvI1RSLTUxI05pxJ9kZSNUUgotZ2VvI1RSLTUyI09yZHUjVFIKLWdlbyNUUi01MyNSaXplI1RSCi1nZW8jVFItNTQjU2FrYXJ5YSNUUgotZ2VvI1RSLTU1I1NhbXN1biNUUgotZ2VvI1RSLTU2I1NpaXJ0I1RSCi1nZW8jVFItNTcjU2lub3AjVFIKLWdlbyNUUi01OCNTaXZhcyNUUgotZ2VvI1RSLTU5I1Rla2lyZGHEnyNUUgotZ2VvI1RSLTYwI1Rva2F0I1RSCi1nZW8jVFItNjEjVHJhYnpvbiNUUgotZ2VvI1RSLTYyI1R1bmNlbGkjVFIKLWdlbyNUUi02MyPFnmFubMSxdXJmYSNUUgotZ2VvI1RSLTY0I1XFn2FrI1RSCi1nZW8jVFItNjUjVmFuI1RSCi1nZW8jVFItNjYjWW96Z2F0I1RSCi1nZW8jVFItNjcjWm9uZ3VsZGFrI1RSCi1nZW8jVFItNjgjQWtzYXJheSNUUgotZ2VvI1RSLTY5I0JheWJ1cnQjVFIKLWdlbyNUUi03MCNLYXJhbWFuI1RSCi1nZW8jVFItNzEjS8SxcsSxa2thbGUjVFIKLWdlbyNUUi03MiNCYXRtYW4jVFIKLWdlbyNUUi03MyPFnsSxcm5hayNUUgotZ2VvI1RSLTc0I0JhcnTEsW4jVFIKLWdlbyNUUi03NSNBcmRhaGFuI1RSCi1nZW8jVFItNzYjScSfZMSxciNUUgotZ2VvI1RSLTc3I1lhbG92YSNUUgotZ2VvI1RSLTc4I0thcmFiw7xrI1RSCi1nZW8jVFItNzkjS2lsaXMjVFIKLWdlbyNUUi04MCNPc21hbml5ZSNUUgotZ2VvI1RUI1RyaW5pZGFkIEFuZCBUb2JhZ28jLS0KLWdlbyNUViNUdXZhbHUjLS0KLWdlbyNUVyMiVGFpd2FuLCBQcm92aW5jZSBPZiBDaGluYSIjLS0KLWdlbyNUWiMiVGFuemFuaWEsIFVuaXRlZCBSZXB1YmxpYyBvZiIjLS0KLWdlbyNVQSNVa3JhaW5lIy0tCi1nZW8jVUcjVWdhbmRhIy0tCi1nZW8jVU0jVVMgTWlub3IgT3V0bHlpbmcgSXNsYW5kcyMtLQotZ2VvI1VNLTY3I0pvaG5zdG9uIEF0b2xsI1VNCi1nZW8jVU0tNzEjTWlkd2F5IElzbGFuZHMjVU0KLWdlbyNVTS03NiNOYXZhc3NhIElzbGFuZCNVTQotZ2VvI1VNLTc5I1dha2UgSXNsYW5kI1VNCi1nZW8jVU0tODEjQmFrZXIgSXNsYW5kI1VNCi1nZW8jVU0tODQjSG93bGFuZCBJc2xhbmQjVU0KLWdlbyNVTS04NiNKYXJ2aXMgSXNsYW5kI1VNCi1nZW8jVU0tODkjS2luZ21hbiBSZWVmI1VNCi1nZW8jVU0tOTUjUGFsbXlyYSBBdG9sbCNVTQotZ2VvI1VTI1VuaXRlZCBTdGF0ZXMjLS0KLWdlbyNVUy1BSyNBbGFza2EjVVMKLWdlbyNVUy1BTCNBbGFiYW1hI1VTCi1nZW8jVVMtQVIjQXJrYW5zYXMjVVMKLWdlbyNVUy1BUyNBbWVyaWNhbiBTYW1vYSNVUwotZ2VvI1VTLUFaI0FyaXpvbmEjVVMKLWdlbyNVUy1DQSNDYWxpZm9ybmlhI1VTCi1nZW8jVVMtQ08jQ29sb3JhZG8jVVMKLWdlbyNVUy1DVCNDb25uZWN0aWN1dCNVUwotZ2VvI1VTLURDI0Rpc3RyaWN0IE9mIENvbHVtYmlhI1VTCi1nZW8jVVMtREUjRGVsYXdhcmUjVVMKLWdlbyNVUy1GTCNGbG9yaWRhI1VTCi1nZW8jVVMtR0EjR2VvcmdpYSNVUwotZ2VvI1VTLUdVI0d1YW0jVVMKLWdlbyNVUy1ISSNIYXdhaWkjVVMKLWdlbyNVUy1JQSNJb3dhI1VTCi1nZW8jVVMtSUQjSWRhaG8jVVMKLWdlbyNVUy1JTCNJbGxpbm9pcyNVUwotZ2VvI1VTLUlOI0luZGlhbmEjVVMKLWdlbyNVUy1LUyNLYW5zYXMjVVMKLWdlbyNVUy1LWSNLZW50dWNreSNVUwotZ2VvI1VTLUxBI0xvdWlzaWFuYSNVUwotZ2VvI1VTLU1BI01hc3NhY2h1c2V0dHMjVVMKLWdlbyNVUy1NRCNNYXJ5bGFuZCNVUwotZ2VvI1VTLU1FI01haW5lI1VTCi1nZW8jVVMtTUkjTWljaGlnYW4jVVMKLWdlbyNVUy1NTiNNaW5uZXNvdGEjVVMKLWdlbyNVUy1NTyNNaXNzb3VyaSNVUwotZ2VvI1VTLU1QI05vcnRoZXJuIE1hcmlhbmEgSXNsYW5kcyNVUwotZ2VvI1VTLU1TI01pc3Npc3NpcHBpI1VTCi1nZW8jVVMtTVQjTW9udGFuYSNVUwotZ2VvI1VTLU5DI05vcnRoIENhcm9saW5hI1VTCi1nZW8jVVMtTkQjTm9ydGggRGFrb3RhI1VTCi1nZW8jVVMtTkUjTmVicmFza2EjVVMKLWdlbyNVUy1OSCNOZXcgSGFtcHNoaXJlI1VTCi1nZW8jVVMtTkojTmV3IEplcnNleSNVUwotZ2VvI1VTLU5NI05ldyBNZXhpY28jVVMKLWdlbyNVUy1OViNOZXZhZGEjVVMKLWdlbyNVUy1OWSNOZXcgWW9yayNVUwotZ2VvI1VTLU9II09oaW8jVVMKLWdlbyNVUy1PSyNPa2xhaG9tYSNVUwotZ2VvI1VTLU9SI09yZWdvbiNVUwotZ2VvI1VTLVBBI1Blbm5zeWx2YW5pYSNVUwotZ2VvI1VTLVBSI1B1ZXJ0byBSaWNvI1VTCi1nZW8jVVMtUkkjUmhvZGUgSXNsYW5kI1VTCi1nZW8jVVMtU0MjU291dGggQ2Fyb2xpbmEjVVMKLWdlbyNVUy1TRCNTb3V0aCBEYWtvdGEjVVMKLWdlbyNVUy1UTiNUZW5uZXNzZWUjVVMKLWdlbyNVUy1UWCNUZXhhcyNVUwotZ2VvI1VTLVVNI1UuUy4gTWlub3IgT3V0bHlpbmcgSXNsYW5kcyNVUwotZ2VvI1VTLVVUI1V0YWgjVVMKLWdlbyNVUy1WQSNWaXJnaW5pYSNVUwotZ2VvI1VTLVZJI1ZpcmdpbiBJc2xhbmRzIE9mIFRoZSBVLlMuI1VTCi1nZW8jVVMtVlQjVmVybW9udCNVUwotZ2VvI1VTLVdBI1dhc2hpbmd0b24jVVMKLWdlbyNVUy1XSSNXaXNjb25zaW4jVVMKLWdlbyNVUy1XViNXZXN0IFZpcmdpbmlhI1VTCi1nZW8jVVMtV1kjV3lvbWluZyNVUwotZ2VvI1VZI1VydWd1YXkjLS0KLWdlbyNVWiNVemJla2lzdGFuIy0tCi1nZW8jVkEjVmF0aWNhbiBDaXR5IFN0YXRlIy0tCi1nZW8jVkMjU3QgVmluY2VudCBBbmQgR3JlbmFkaW5lcyMtLQotZ2VvI1ZFI1ZlbmV6dWVsYSMtLQotZ2VvI1ZHIyJWaXJnaW4gSXNsYW5kcywgQnJpdGlzaCIjLS0KLWdlbyNWSSNVbml0ZWQgU3RhdGVzIFZpcmdpbiBJc2xhbmRzIy0tCi1nZW8jVk4jVmlldCBOYW0jLS0KLWdlbyNWTi0wMSNMYWkgQ2hhdSNWTgotZ2VvI1ZOLTAyI0xhbyBDYWkjVk4KLWdlbyNWTi0wMyNIYSBHaWFuZyNWTgotZ2VvI1ZOLTA0I0NhbyBCYW5nI1ZOCi1nZW8jVk4tMDUjU29uIExhI1ZOCi1nZW8jVk4tMDYjWWVuIEJhaSNWTgotZ2VvI1ZOLTA3I1R1eWVuIFF1YW5nI1ZOCi1nZW8jVk4tMDkjTGFuZyBTb24jVk4KLWdlbyNWTi0xMyNRdWFuZyBOaW5oI1ZOCi1nZW8jVk4tMTQjSG9hIEJpbmgjVk4KLWdlbyNWTi0xNSNIYSBUYXkjVk4KLWdlbyNWTi0xOCNOaW5oIEJpbmgjVk4KLWdlbyNWTi0yMCNUaGFpIEJpbmgjVk4KLWdlbyNWTi0yMSNUaGFuaCBIb2EjVk4KLWdlbyNWTi0yMiNOZ2hlIEFuI1ZOCi1nZW8jVk4tMjMjSGEgVGluaCNWTgotZ2VvI1ZOLTI0I1F1YW5nIEJpbmgjVk4KLWdlbyNWTi0yNSNRdWFuZyBUcmkjVk4KLWdlbyNWTi0yNiNUaHVhIFRoaWVuLUh1ZSNWTgotZ2VvI1ZOLTI3I1F1YW5nIE5hbSNWTgotZ2VvI1ZOLTI4I0tvbiBUdW0jVk4KLWdlbyNWTi0yOSNRdWFuZyBOZ2FpI1ZOCi1nZW8jVk4tMzAjR2lhIExhaSNWTgotZ2VvI1ZOLTMxI0JpbmggRGluaCNWTgotZ2VvI1ZOLTMyI1BodSBZZW4jVk4KLWdlbyNWTi0zMyNEYWMgTGFjI1ZOCi1nZW8jVk4tMzQjS2hhbmggSG9hI1ZOCi1nZW8jVk4tMzUjTGFtIERvbmcjVk4KLWdlbyNWTi0zNiNOaW5oIFRodWFuI1ZOCi1nZW8jVk4tMzcjVGF5IE5pbmgjVk4KLWdlbyNWTi0zOSNEb25nIE5haSNWTgotZ2VvI1ZOLTQwI0JpbmggVGh1YW4jVk4KLWdlbyNWTi00MSNMb25nIEFuI1ZOCi1nZW8jVk4tNDMjQmEgUmlhIC0gVnVuZyBUYXUjVk4KLWdlbyNWTi00NCNBbiBHaWFuZyNWTgotZ2VvI1ZOLTQ1I0RvbmcgVGhhcCNWTgotZ2VvI1ZOLTQ2I1RpZW4gR2lhbmcjVk4KLWdlbyNWTi00NyNLaWVuIEdpYW5nI1ZOCi1nZW8jVk4tNDgjQ2FuIFRobyNWTgotZ2VvI1ZOLTQ5I1ZpbmggTG9uZyNWTgotZ2VvI1ZOLTUwI0JlbiBUcmUjVk4KLWdlbyNWTi01MSNUcmEgVmluaCNWTgotZ2VvI1ZOLTUyI1NvYyBUcmFuZyNWTgotZ2VvI1ZOLTUzI0JhYyBDYW4jVk4KLWdlbyNWTi01NCNCYWMgR2lhbmcjVk4KLWdlbyNWTi01NSNCYWMgTGlldSNWTgotZ2VvI1ZOLTU2I0JhYyBOaW5oI1ZOCi1nZW8jVk4tNTcjQmluaCBEdW9uZyNWTgotZ2VvI1ZOLTU4I0JpbmggUGh1b2MjVk4KLWdlbyNWTi01OSNDYSBNYXUjVk4KLWdlbyNWTi02MCMiRGEgTmFuZywgdGhhbmggcGhvIiNWTgotZ2VvI1ZOLTYxI0hhaSBEdW9uZyNWTgotZ2VvI1ZOLTYyIyJIYWkgUGhvbmcsIHRoYW5oIHBobyIjVk4KLWdlbyNWTi02MyNIYSBOYW0jVk4KLWdlbyNWTi02NCMiSGEgTm9pLCB0aHUgZG8iI1ZOCi1nZW8jVk4tNjUjIkhvIENoaSBNaW5oLCB0aGFuaCBwbyBbU2FpIEdvbl0iI1ZOCi1nZW8jVk4tNjYjSHVuZyBZZW4jVk4KLWdlbyNWTi02NyNOYW0gRGluaCNWTgotZ2VvI1ZOLTY4I1BodSBUaG8jVk4KLWdlbyNWTi02OSNUaGFpIE5ndXllbiNWTgotZ2VvI1ZOLTcwI1ZpbmggUGh1YyNWTgotZ2VvI1ZVI1ZhbnVhdHUjLS0KLWdlbyNXRiNXYWxsaXMgQW5kIEZ1dHVuYSBJc2xhbmRzIy0tCi1nZW8jV1MjU2Ftb2EjLS0KLWdlbyNZRSNZZW1lbiMtLQotZ2VvI1lUI01heW90dGUjLS0KLWdlbyNZVSNZdWdvc2xhdmlhIChGZWQgUmVwIE9mKSMtLQotZ2VvI1lVLUNHI0NybmEgR29yYSNZVQotZ2VvI1lVLVNSI1NyYmlqYSNZVQotZ2VvI1lVLUtNI0tvc292by1NZXRvaGlqYSNZVS1TUgotZ2VvI1lVLVZPI1ZvanZvZGluYSNZVS1TUgotZ2VvI1pBI1NvdXRoIEFmcmljYSMtLQotZ2VvI1pNI1phbWJpYSMtLQotZ2VvI1pXI1ppbWJhYndlIy0tCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS9uYWljcy1kYXRhLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL25haWNzLWRhdGEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDZmOTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9kYXRhL25haWNzLWRhdGEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTgxNCArMCwwIEBACi1uYWljcyMxMSNBZ3JpY3VsdHVyZSwgRm9yZXN0cnksIEZpc2hpbmcgYW5kIEh1bnRpbmcjMTEKLW5haWNzIzExMSNDcm9wIFByb2R1Y3Rpb24jMTEKLW5haWNzIzExMTEjT2lsc2VlZCBhbmQgR3JhaW4gRmFybWluZyMxMTEKLW5haWNzIzExMTExI1NveWJlYW4gRmFybWluZyMxMTExCi1uYWljcyMxMTExMiNPaWxzZWVkIChleGNlcHQgU295YmVhbikgRmFybWluZyMxMTExCi1uYWljcyMxMTExMyNEcnkgUGVhIGFuZCBCZWFuIEZhcm1pbmcjMTExMQotbmFpY3MjMTExMTQjV2hlYXQgRmFybWluZyMxMTExCi1uYWljcyMxMTExNSNDb3JuIEZhcm1pbmcjMTExMQotbmFpY3MjMTExMTYjUmljZSBGYXJtaW5nIzExMTEKLW5haWNzIzExMTE5I090aGVyIEdyYWluIEZhcm1pbmcjMTExMQotbmFpY3MjMTExMTkxI09pbHNlZWQgYW5kIEdyYWluIENvbWJpbmF0aW9uIEZhcm1pbmcjMTExMTkKLW5haWNzIzExMTE5OSNBbGwgT3RoZXIgR3JhaW4gRmFybWluZyMxMTExOQotbmFpY3MjMTExMiNWZWdldGFibGUgYW5kIE1lbG9uIEZhcm1pbmcjMTExCi1uYWljcyMxMTEyMSNWZWdldGFibGUgYW5kIE1lbG9uIEZhcm1pbmcjMTExMgotbmFpY3MjMTExMjExI1BvdGF0byBGYXJtaW5nIzExMTIxCi1uYWljcyMxMTEyMTkjT3RoZXIgVmVnZXRhYmxlIChleGNlcHQgUG90YXRvKSBhbmQgTWVsb24gRmFybWluZyMxMTEyMQotbmFpY3MjMTExMyNGcnVpdCBhbmQgVHJlZSBOdXQgRmFybWluZyMxMTEKLW5haWNzIzExMTMxI09yYW5nZSBHcm92ZXMjMTExMwotbmFpY3MjMTExMzIjQ2l0cnVzIChleGNlcHQgT3JhbmdlKSBHcm92ZXMjMTExMwotbmFpY3MjMTExMzMjTm9uY2l0cnVzIEZydWl0IGFuZCBUcmVlIE51dCBGYXJtaW5nIzExMTMKLW5haWNzIzExMTMzMSNBcHBsZSBPcmNoYXJkcyMxMTEzMwotbmFpY3MjMTExMzMyI0dyYXBlIFZpbmV5YXJkcyMxMTEzMwotbmFpY3MjMTExMzMzI1N0cmF3YmVycnkgRmFybWluZyMxMTEzMwotbmFpY3MjMTExMzM0I0JlcnJ5IChleGNlcHQgU3RyYXdiZXJyeSkgRmFybWluZyMxMTEzMwotbmFpY3MjMTExMzM1I1RyZWUgTnV0IEZhcm1pbmcjMTExMzMKLW5haWNzIzExMTMzNiNGcnVpdCBhbmQgVHJlZSBOdXQgQ29tYmluYXRpb24gRmFybWluZyMxMTEzMwotbmFpY3MjMTExMzM5I090aGVyIE5vbmNpdHJ1cyBGcnVpdCBGYXJtaW5nIzExMTMzCi1uYWljcyMxMTE0I0dyZWVuaG91c2UsIE51cnNlcnksIGFuZCBGbG9yaWN1bHR1cmUgUHJvZHVjdGlvbiMxMTEKLW5haWNzIzExMTQxI0Zvb2QgQ3JvcHMgR3Jvd24gVW5kZXIgQ292ZXIjMTExNAotbmFpY3MjMTExNDExI011c2hyb29tIFByb2R1Y3Rpb24jMTExNDEKLW5haWNzIzExMTQxOSNPdGhlciBGb29kIENyb3BzIEdyb3duIFVuZGVyIENvdmVyIzExMTQxCi1uYWljcyMxMTE0MiNOdXJzZXJ5IGFuZCBGbG9yaWN1bHR1cmUgUHJvZHVjdGlvbiMxMTE0Ci1uYWljcyMxMTE0MjEjTnVyc2VyeSBhbmQgVHJlZSBQcm9kdWN0aW9uIzExMTQyCi1uYWljcyMxMTE0MjIjRmxvcmljdWx0dXJlIFByb2R1Y3Rpb24jMTExNDIKLW5haWNzIzExMTkjT3RoZXIgQ3JvcCBGYXJtaW5nIzExMQotbmFpY3MjMTExOTEjVG9iYWNjbyBGYXJtaW5nIzExMTkKLW5haWNzIzExMTkyI0NvdHRvbiBGYXJtaW5nIzExMTkKLW5haWNzIzExMTkzI1N1Z2FyY2FuZSBGYXJtaW5nIzExMTkKLW5haWNzIzExMTk0I0hheSBGYXJtaW5nIzExMTkKLW5haWNzIzExMTk5I0FsbCBPdGhlciBDcm9wIEZhcm1pbmcjMTExOQotbmFpY3MjMTExOTkxI1N1Z2FyIEJlZXQgRmFybWluZyMxMTE5OQotbmFpY3MjMTExOTkyI1BlYW51dCBGYXJtaW5nIzExMTk5Ci1uYWljcyMxMTE5OTgjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgQ3JvcCBGYXJtaW5nIzExMTk5Ci1uYWljcyMxMTIjQW5pbWFsIFByb2R1Y3Rpb24jMTEKLW5haWNzIzExMjEjQ2F0dGxlIFJhbmNoaW5nIGFuZCBGYXJtaW5nIzExMgotbmFpY3MjMTEyMTEjQmVlZiBDYXR0bGUgUmFuY2hpbmcgYW5kIEZhcm1pbmcsIGluY2x1ZGluZyBGZWVkbG90cyMxMTIxCi1uYWljcyMxMTIxMTEjQmVlZiBDYXR0bGUgUmFuY2hpbmcgYW5kIEZhcm1pbmcjMTEyMTEKLW5haWNzIzExMjExMiNDYXR0bGUgRmVlZGxvdHMjMTEyMTEKLW5haWNzIzExMjEyI0RhaXJ5IENhdHRsZSBhbmQgTWlsayBQcm9kdWN0aW9uIzExMjEKLW5haWNzIzExMjEzI0R1YWwgUHVycG9zZSBDYXR0bGUgUmFuY2hpbmcgYW5kIEZhcm1pbmcjMTEyMQotbmFpY3MjMTEyMiNIb2cgYW5kIFBpZyBGYXJtaW5nIzExMgotbmFpY3MjMTEyMjEjSG9nIGFuZCBQaWcgRmFybWluZyMxMTIyCi1uYWljcyMxMTIzI1BvdWx0cnkgYW5kIEVnZyBQcm9kdWN0aW9uIzExMgotbmFpY3MjMTEyMzEjQ2hpY2tlbiBFZ2cgUHJvZHVjdGlvbiMxMTIzCi1uYWljcyMxMTIzMiNCcm9pbGVycyBhbmQgT3RoZXIgTWVhdCBUeXBlIENoaWNrZW4gUHJvZHVjdGlvbiMxMTIzCi1uYWljcyMxMTIzMyNUdXJrZXkgUHJvZHVjdGlvbiMxMTIzCi1uYWljcyMxMTIzNCNQb3VsdHJ5IEhhdGNoZXJpZXMjMTEyMwotbmFpY3MjMTEyMzkjT3RoZXIgUG91bHRyeSBQcm9kdWN0aW9uIzExMjMKLW5haWNzIzExMjQjU2hlZXAgYW5kIEdvYXQgRmFybWluZyMxMTIKLW5haWNzIzExMjQxI1NoZWVwIEZhcm1pbmcjMTEyNAotbmFpY3MjMTEyNDIjR29hdCBGYXJtaW5nIzExMjQKLW5haWNzIzExMjUjQW5pbWFsIEFxdWFjdWx0dXJlIzExMgotbmFpY3MjMTEyNTEjQW5pbWFsIEFxdWFjdWx0dXJlIzExMjUKLW5haWNzIzExMjUxMSNGaW5maXNoIEZhcm1pbmcgYW5kIEZpc2ggSGF0Y2hlcmllcyMxMTI1MQotbmFpY3MjMTEyNTEyI1NoZWxsZmlzaCBGYXJtaW5nIzExMjUxCi1uYWljcyMxMTI1MTkjT3RoZXIgQW5pbWFsIEFxdWFjdWx0dXJlIzExMjUxCi1uYWljcyMxMTI5I090aGVyIEFuaW1hbCBQcm9kdWN0aW9uIzExMgotbmFpY3MjMTEyOTEjQXBpY3VsdHVyZSMxMTI5Ci1uYWljcyMxMTI5MiNIb3JzZSBhbmQgT3RoZXIgRXF1aW5lIFByb2R1Y3Rpb24jMTEyOQotbmFpY3MjMTEyOTMjRnVyLUJlYXJpbmcgQW5pbWFsIGFuZCBSYWJiaXQgUHJvZHVjdGlvbiMxMTI5Ci1uYWljcyMxMTI5OSNBbGwgT3RoZXIgQW5pbWFsIFByb2R1Y3Rpb24jMTEyOQotbmFpY3MjMTEzI0ZvcmVzdHJ5IGFuZCBMb2dnaW5nIzExCi1uYWljcyMxMTMxI1RpbWJlciBUcmFjdCBPcGVyYXRpb25zIzExMwotbmFpY3MjMTEzMTEjVGltYmVyIFRyYWN0IE9wZXJhdGlvbnMjMTEzMQotbmFpY3MjMTEzMiNGb3Jlc3QgTnVyc2VyaWVzIGFuZCBHYXRoZXJpbmcgb2YgRm9yZXN0IFByb2R1Y3RzIzExMwotbmFpY3MjMTEzMjEjRm9yZXN0IE51cnNlcmllcyBhbmQgR2F0aGVyaW5nIG9mIEZvcmVzdCBQcm9kdWN0cyMxMTMyCi1uYWljcyMxMTMzI0xvZ2dpbmcjMTEzCi1uYWljcyMxMTMzMSNMb2dnaW5nIzExMzMKLW5haWNzIzExNCNGaXNoaW5nLCBIdW50aW5nIGFuZCBUcmFwcGluZyMxMQotbmFpY3MjMTE0MSNGaXNoaW5nIzExNAotbmFpY3MjMTE0MTEjRmlzaGluZyMxMTQxCi1uYWljcyMxMTQxMTEjRmluZmlzaCBGaXNoaW5nIzExNDExCi1uYWljcyMxMTQxMTIjU2hlbGxmaXNoIEZpc2hpbmcjMTE0MTEKLW5haWNzIzExNDExOSNPdGhlciBNYXJpbmUgRmlzaGluZyMxMTQxMQotbmFpY3MjMTE0MiNIdW50aW5nIGFuZCBUcmFwcGluZyMxMTQKLW5haWNzIzExNDIxI0h1bnRpbmcgYW5kIFRyYXBwaW5nIzExNDIKLW5haWNzIzExNSNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIEFncmljdWx0dXJlIGFuZCBGb3Jlc3RyeSMxMQotbmFpY3MjMTE1MSNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIENyb3AgUHJvZHVjdGlvbiMxMTUKLW5haWNzIzExNTExI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgQ3JvcCBQcm9kdWN0aW9uIzExNTEKLW5haWNzIzExNTExMSNDb3R0b24gR2lubmluZyMxMTUxMQotbmFpY3MjMTE1MTEyI1NvaWwgUHJlcGFyYXRpb24sIFBsYW50aW5nLCBhbmQgQ3VsdGl2YXRpbmcjMTE1MTEKLW5haWNzIzExNTExMyNDcm9wIEhhcnZlc3RpbmcsIFByaW1hcmlseSBieSBNYWNoaW5lIzExNTExCi1uYWljcyMxMTUxMTQjUG9zdGhhcnZlc3QgQ3JvcCBBY3Rpdml0aWVzIChleGNlcHQgQ290dG9uIEdpbm5pbmcpIzExNTExCi1uYWljcyMxMTUxMTUjRmFybSBMYWJvciBDb250cmFjdG9ycyBhbmQgQ3JldyBMZWFkZXJzIzExNTExCi1uYWljcyMxMTUxMTYjRmFybSBNYW5hZ2VtZW50IFNlcnZpY2VzIzExNTExCi1uYWljcyMxMTUyI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgQW5pbWFsIFByb2R1Y3Rpb24jMTE1Ci1uYWljcyMxMTUyMSNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIEFuaW1hbCBQcm9kdWN0aW9uIzExNTIKLW5haWNzIzExNTMjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBGb3Jlc3RyeSMxMTUKLW5haWNzIzExNTMxI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgRm9yZXN0cnkjMTE1MwotbmFpY3MjMjEjTWluaW5nIzIxCi1uYWljcyMyMTEjT2lsIGFuZCBHYXMgRXh0cmFjdGlvbiMyMQotbmFpY3MjMjExMSNPaWwgYW5kIEdhcyBFeHRyYWN0aW9uIzIxMQotbmFpY3MjMjExMTEjT2lsIGFuZCBHYXMgRXh0cmFjdGlvbiMyMTExCi1uYWljcyMyMTExMTEjQ3J1ZGUgUGV0cm9sZXVtIGFuZCBOYXR1cmFsIEdhcyBFeHRyYWN0aW9uIzIxMTExCi1uYWljcyMyMTExMTIjTmF0dXJhbCBHYXMgTGlxdWlkIEV4dHJhY3Rpb24jMjExMTEKLW5haWNzIzIxMiNNaW5pbmcgKGV4Y2VwdCBPaWwgYW5kIEdhcykjMjEKLW5haWNzIzIxMjEjQ29hbCBNaW5pbmcjMjEyCi1uYWljcyMyMTIxMSNDb2FsIE1pbmluZyMyMTIxCi1uYWljcyMyMTIxMTEjQml0dW1pbm91cyBDb2FsIGFuZCBMaWduaXRlIFN1cmZhY2UgTWluaW5nIzIxMjExCi1uYWljcyMyMTIxMTIjQml0dW1pbm91cyBDb2FsIFVuZGVyZ3JvdW5kIE1pbmluZyMyMTIxMQotbmFpY3MjMjEyMTEzI0FudGhyYWNpdGUgTWluaW5nIzIxMjExCi1uYWljcyMyMTIyI01ldGFsIE9yZSBNaW5pbmcjMjEyCi1uYWljcyMyMTIyMSNJcm9uIE9yZSBNaW5pbmcjMjEyMgotbmFpY3MjMjEyMjIjR29sZCBPcmUgYW5kIFNpbHZlciBPcmUgTWluaW5nIzIxMjIKLW5haWNzIzIxMjIyMSNHb2xkIE9yZSBNaW5pbmcjMjEyMjIKLW5haWNzIzIxMjIyMiNTaWx2ZXIgT3JlIE1pbmluZyMyMTIyMgotbmFpY3MjMjEyMjMjQ29wcGVyLCBOaWNrZWwsIExlYWQsIGFuZCBaaW5jIE1pbmluZyMyMTIyCi1uYWljcyMyMTIyMzEjTGVhZCBPcmUgYW5kIFppbmMgT3JlIE1pbmluZyMyMTIyMwotbmFpY3MjMjEyMjM0I0NvcHBlciBPcmUgYW5kIE5pY2tlbCBPcmUgTWluaW5nIzIxMjIzCi1uYWljcyMyMTIyOSNPdGhlciBNZXRhbCBPcmUgTWluaW5nIzIxMjIKLW5haWNzIzIxMjI5MSNVcmFuaXVtLVJhZGl1bS1WYW5hZGl1bSBPcmUgTWluaW5nIzIxMjI5Ci1uYWljcyMyMTIyOTkjQWxsIE90aGVyIE1ldGFsIE9yZSBNaW5pbmcjMjEyMjkKLW5haWNzIzIxMjMjTm9ubWV0YWxsaWMgTWluZXJhbCBNaW5pbmcgYW5kIFF1YXJyeWluZyMyMTIKLW5haWNzIzIxMjMxI1N0b25lIE1pbmluZyBhbmQgUXVhcnJ5aW5nIzIxMjMKLW5haWNzIzIxMjMxMSNEaW1lbnNpb24gU3RvbmUgTWluaW5nIGFuZCBRdWFycnlpbmcjMjEyMzEKLW5haWNzIzIxMjMxMiNDcnVzaGVkIGFuZCBCcm9rZW4gTGltZXN0b25lIE1pbmluZyBhbmQgUXVhcnJ5aW5nIzIxMjMxCi1uYWljcyMyMTIzMTMjQ3J1c2hlZCBhbmQgQnJva2VuIEdyYW5pdGUgTWluaW5nIGFuZCBRdWFycnlpbmcjMjEyMzEKLW5haWNzIzIxMjMxOSNPdGhlciBDcnVzaGVkIGFuZCBCcm9rZW4gU3RvbmUgTWluaW5nIGFuZCBRdWFycnlpbmcjMjEyMzEKLW5haWNzIzIxMjMyI1NhbmQsIEdyYXZlbCwgQ2xheSwgYW5kIENlcmFtaWMgYW5kIFJlZnJhY3RvcnkgTWluZXJhbHMgTWluaW5nIGFuZCBRdWFycnlpbmcjMjEyMwotbmFpY3MjMjEyMzIxI0NvbnN0cnVjdGlvbiBTYW5kIGFuZCBHcmF2ZWwgTWluaW5nIzIxMjMyCi1uYWljcyMyMTIzMjIjSW5kdXN0cmlhbCBTYW5kIE1pbmluZyMyMTIzMgotbmFpY3MjMjEyMzI0I0thb2xpbiBhbmQgQmFsbCBDbGF5IE1pbmluZyMyMTIzMgotbmFpY3MjMjEyMzI1I0NsYXkgYW5kIENlcmFtaWMgYW5kIFJlZnJhY3RvcnkgTWluZXJhbHMgTWluaW5nIzIxMjMyCi1uYWljcyMyMTIzOSNPdGhlciBOb25tZXRhbGxpYyBNaW5lcmFsIE1pbmluZyBhbmQgUXVhcnJ5aW5nIzIxMjMKLW5haWNzIzIxMjM5MSNQb3Rhc2gsIFNvZGEsIGFuZCBCb3JhdGUgTWluZXJhbCBNaW5pbmcjMjEyMzkKLW5haWNzIzIxMjM5MiNQaG9zcGhhdGUgUm9jayBNaW5pbmcjMjEyMzkKLW5haWNzIzIxMjM5MyNPdGhlciBDaGVtaWNhbCBhbmQgRmVydGlsaXplciBNaW5lcmFsIE1pbmluZyMyMTIzOQotbmFpY3MjMjEyMzk5I0FsbCBPdGhlciBOb25tZXRhbGxpYyBNaW5lcmFsIE1pbmluZyMyMTIzOQotbmFpY3MjMjEzI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgTWluaW5nIzIxCi1uYWljcyMyMTMxI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgTWluaW5nIzIxMwotbmFpY3MjMjEzMTEjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBNaW5pbmcjMjEzMQotbmFpY3MjMjEzMTExI0RyaWxsaW5nIE9pbCBhbmQgR2FzIFdlbGxzIzIxMzExCi1uYWljcyMyMTMxMTIjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBPaWwgYW5kIEdhcyBPcGVyYXRpb25zIzIxMzExCi1uYWljcyMyMTMxMTMjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBDb2FsIE1pbmluZyMyMTMxMQotbmFpY3MjMjEzMTE0I1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgTWV0YWwgTWluaW5nIzIxMzExCi1uYWljcyMyMTMxMTUjU3VwcG9ydCBBY3Rpdml0aWVzIGZvciBOb25tZXRhbGxpYyBNaW5lcmFscyAoZXhjZXB0IEZ1ZWxzKSMyMTMxMQotbmFpY3MjMjIjVXRpbGl0aWVzIzIyCi1uYWljcyMyMjEjVXRpbGl0aWVzIzIyCi1uYWljcyMyMjExI0VsZWN0cmljIFBvd2VyIEdlbmVyYXRpb24sIFRyYW5zbWlzc2lvbiBhbmQgRGlzdHJpYnV0aW9uIzIyMQotbmFpY3MjMjIxMTEjRWxlY3RyaWMgUG93ZXIgR2VuZXJhdGlvbiMyMjExCi1uYWljcyMyMjExMTEjSHlkcm9lbGVjdHJpYyBQb3dlciBHZW5lcmF0aW9uIzIyMTExCi1uYWljcyMyMjExMTIjRm9zc2lsIEZ1ZWwgRWxlY3RyaWMgUG93ZXIgR2VuZXJhdGlvbiMyMjExMQotbmFpY3MjMjIxMTEzI051Y2xlYXIgRWxlY3RyaWMgUG93ZXIgR2VuZXJhdGlvbiMyMjExMQotbmFpY3MjMjIxMTE5I090aGVyIEVsZWN0cmljIFBvd2VyIEdlbmVyYXRpb24jMjIxMTEKLW5haWNzIzIyMTEyI0VsZWN0cmljIFBvd2VyIFRyYW5zbWlzc2lvbiwgQ29udHJvbCwgYW5kIERpc3RyaWJ1dGlvbiMyMjExCi1uYWljcyMyMjExMjEjRWxlY3RyaWMgQnVsayBQb3dlciBUcmFuc21pc3Npb24gYW5kIENvbnRyb2wjMjIxMTIKLW5haWNzIzIyMTEyMiNFbGVjdHJpYyBQb3dlciBEaXN0cmlidXRpb24jMjIxMTIKLW5haWNzIzIyMTIjTmF0dXJhbCBHYXMgRGlzdHJpYnV0aW9uIzIyMQotbmFpY3MjMjIxMjEjTmF0dXJhbCBHYXMgRGlzdHJpYnV0aW9uIzIyMTIKLW5haWNzIzIyMTMjV2F0ZXIsIFNld2FnZSBhbmQgT3RoZXIgU3lzdGVtcyMyMjEKLW5haWNzIzIyMTMxI1dhdGVyIFN1cHBseSBhbmQgSXJyaWdhdGlvbiBTeXN0ZW1zIzIyMTMKLW5haWNzIzIyMTMyI1Nld2FnZSBUcmVhdG1lbnQgRmFjaWxpdGllcyMyMjEzCi1uYWljcyMyMjEzMyNTdGVhbSBhbmQgQWlyLUNvbmRpdGlvbmluZyBTdXBwbHkjMjIxMwotbmFpY3MjMjMjQ29uc3RydWN0aW9uIzIzCi1uYWljcyMyMzMjQnVpbGRpbmcsIERldmVsb3BpbmcsIGFuZCBHZW5lcmFsIENvbnRyYWN0aW5nIzIzCi1uYWljcyMyMzMxI0xhbmQgU3ViZGl2aXNpb24gYW5kIExhbmQgRGV2ZWxvcG1lbnQjMjMzCi1uYWljcyMyMzMxMSNMYW5kIFN1YmRpdmlzaW9uIGFuZCBMYW5kIERldmVsb3BtZW50IzIzMzEKLW5haWNzIzIzMzIjUmVzaWRlbnRpYWwgQnVpbGRpbmcgQ29uc3RydWN0aW9uIzIzMwotbmFpY3MjMjMzMjEjU2luZ2xlIEZhbWlseSBIb3VzaW5nIENvbnN0cnVjdGlvbiMyMzMyCi1uYWljcyMyMzMyMiNNdWx0aWZhbWlseSBIb3VzaW5nIENvbnN0cnVjdGlvbiMyMzMyCi1uYWljcyMyMzMzI05vbnJlc2lkZW50aWFsIEJ1aWxkaW5nIENvbnN0cnVjdGlvbiMyMzMKLW5haWNzIzIzMzMxI01hbnVmYWN0dXJpbmcgYW5kIEluZHVzdHJpYWwgQnVpbGRpbmcgQ29uc3RydWN0aW9uIzIzMzMKLW5haWNzIzIzMzMyI0NvbW1lcmNpYWwgYW5kIEluc3RpdHV0aW9uYWwgQnVpbGRpbmcgQ29uc3RydWN0aW9uIzIzMzMKLW5haWNzIzIzNCNIZWF2eSBDb25zdHJ1Y3Rpb24jMjMKLW5haWNzIzIzNDEjSGlnaHdheSwgU3RyZWV0LCBCcmlkZ2UsIGFuZCBUdW5uZWwgQ29uc3RydWN0aW9uIzIzNAotbmFpY3MjMjM0MTEjSGlnaHdheSBhbmQgU3RyZWV0IENvbnN0cnVjdGlvbiMyMzQxCi1uYWljcyMyMzQxMiNCcmlkZ2UgYW5kIFR1bm5lbCBDb25zdHJ1Y3Rpb24jMjM0MQotbmFpY3MjMjM0OSNPdGhlciBIZWF2eSBDb25zdHJ1Y3Rpb24jMjM0Ci1uYWljcyMyMzQ5MSNXYXRlciwgU2V3ZXIsIGFuZCBQaXBlbGluZSBDb25zdHJ1Y3Rpb24jMjM0OQotbmFpY3MjMjM0OTIjUG93ZXIgYW5kIENvbW11bmljYXRpb24gVHJhbnNtaXNzaW9uIExpbmUgQ29uc3RydWN0aW9uIzIzNDkKLW5haWNzIzIzNDkzI0luZHVzdHJpYWwgTm9uYnVpbGRpbmcgU3RydWN0dXJlIENvbnN0cnVjdGlvbiMyMzQ5Ci1uYWljcyMyMzQ5OSNBbGwgT3RoZXIgSGVhdnkgQ29uc3RydWN0aW9uIzIzNDkKLW5haWNzIzIzNSNTcGVjaWFsIFRyYWRlIENvbnRyYWN0b3JzIzIzCi1uYWljcyMyMzUxI1BsdW1iaW5nLCBIZWF0aW5nLCBhbmQgQWlyLUNvbmRpdGlvbmluZyBDb250cmFjdG9ycyMyMzUKLW5haWNzIzIzNTExI1BsdW1iaW5nLCBIZWF0aW5nLCBhbmQgQWlyLUNvbmRpdGlvbmluZyBDb250cmFjdG9ycyMyMzUxCi1uYWljcyMyMzUyI1BhaW50aW5nIGFuZCBXYWxsIENvdmVyaW5nIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1MjEjUGFpbnRpbmcgYW5kIFdhbGwgQ292ZXJpbmcgQ29udHJhY3RvcnMjMjM1MgotbmFpY3MjMjM1MyNFbGVjdHJpY2FsIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1MzEjRWxlY3RyaWNhbCBDb250cmFjdG9ycyMyMzUzCi1uYWljcyMyMzU0I01hc29ucnksIERyeXdhbGwsIEluc3VsYXRpb24sIGFuZCBUaWxlIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1NDEjTWFzb25yeSBhbmQgU3RvbmUgQ29udHJhY3RvcnMjMjM1NAotbmFpY3MjMjM1NDIjRHJ5d2FsbCwgUGxhc3RlcmluZywgQWNvdXN0aWNhbCwgYW5kIEluc3VsYXRpb24gQ29udHJhY3RvcnMjMjM1NAotbmFpY3MjMjM1NDMjVGlsZSwgTWFyYmxlLCBUZXJyYXp6bywgYW5kIE1vc2FpYyBDb250cmFjdG9ycyMyMzU0Ci1uYWljcyMyMzU1I0NhcnBlbnRyeSBhbmQgRmxvb3IgQ29udHJhY3RvcnMjMjM1Ci1uYWljcyMyMzU1MSNDYXJwZW50cnkgQ29udHJhY3RvcnMjMjM1NQotbmFpY3MjMjM1NTIjRmxvb3IgTGF5aW5nIGFuZCBPdGhlciBGbG9vciBDb250cmFjdG9ycyMyMzU1Ci1uYWljcyMyMzU2I1Jvb2ZpbmcsIFNpZGluZywgYW5kIFNoZWV0IE1ldGFsIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1NjEjUm9vZmluZywgU2lkaW5nLCBhbmQgU2hlZXQgTWV0YWwgQ29udHJhY3RvcnMjMjM1NgotbmFpY3MjMjM1NyNDb25jcmV0ZSBDb250cmFjdG9ycyMyMzUKLW5haWNzIzIzNTcxI0NvbmNyZXRlIENvbnRyYWN0b3JzIzIzNTcKLW5haWNzIzIzNTgjV2F0ZXIgV2VsbCBEcmlsbGluZyBDb250cmFjdG9ycyMyMzUKLW5haWNzIzIzNTgxI1dhdGVyIFdlbGwgRHJpbGxpbmcgQ29udHJhY3RvcnMjMjM1OAotbmFpY3MjMjM1OSNPdGhlciBTcGVjaWFsIFRyYWRlIENvbnRyYWN0b3JzIzIzNQotbmFpY3MjMjM1OTEjU3RydWN0dXJhbCBTdGVlbCBFcmVjdGlvbiBDb250cmFjdG9ycyMyMzU5Ci1uYWljcyMyMzU5MiNHbGFzcyBhbmQgR2xhemluZyBDb250cmFjdG9ycyMyMzU5Ci1uYWljcyMyMzU5MyNFeGNhdmF0aW9uIENvbnRyYWN0b3JzIzIzNTkKLW5haWNzIzIzNTk0I1dyZWNraW5nIGFuZCBEZW1vbGl0aW9uIENvbnRyYWN0b3JzIzIzNTkKLW5haWNzIzIzNTk1I0J1aWxkaW5nIEVxdWlwbWVudCBhbmQgT3RoZXIgTWFjaGluZXJ5IEluc3RhbGxhdGlvbiBDb250cmFjdG9ycyMyMzU5Ci1uYWljcyMyMzU5OSNBbGwgT3RoZXIgU3BlY2lhbCBUcmFkZSBDb250cmFjdG9ycyMyMzU5Ci1uYWljcyMzMSNNYW51ZmFjdHVyaW5nIzMxCi1uYWljcyMzMTEjRm9vZCBNYW51ZmFjdHVyaW5nIzMxCi1uYWljcyMzMTExI0FuaW1hbCBGb29kIE1hbnVmYWN0dXJpbmcjMzExCi1uYWljcyMzMTExMSNBbmltYWwgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTEKLW5haWNzIzMxMTExMSNEb2cgYW5kIENhdCBGb29kIE1hbnVmYWN0dXJpbmcjMzExMTEKLW5haWNzIzMxMTExOSNPdGhlciBBbmltYWwgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTExCi1uYWljcyMzMTEyI0dyYWluIGFuZCBPaWxzZWVkIE1pbGxpbmcjMzExCi1uYWljcyMzMTEyMSNGbG91ciBNaWxsaW5nIGFuZCBNYWx0IE1hbnVmYWN0dXJpbmcjMzExMgotbmFpY3MjMzExMjExI0Zsb3VyIE1pbGxpbmcjMzExMjEKLW5haWNzIzMxMTIxMiNSaWNlIE1pbGxpbmcjMzExMjEKLW5haWNzIzMxMTIxMyNNYWx0IE1hbnVmYWN0dXJpbmcjMzExMjEKLW5haWNzIzMxMTIyI1N0YXJjaCBhbmQgVmVnZXRhYmxlIEZhdHMgYW5kIE9pbHMgTWFudWZhY3R1cmluZyMzMTEyCi1uYWljcyMzMTEyMjEjV2V0IENvcm4gTWlsbGluZyMzMTEyMgotbmFpY3MjMzExMjIyI1NveWJlYW4gUHJvY2Vzc2luZyMzMTEyMgotbmFpY3MjMzExMjIzI090aGVyIE9pbHNlZWQgUHJvY2Vzc2luZyMzMTEyMgotbmFpY3MjMzExMjI1I0ZhdHMgYW5kIE9pbHMgUmVmaW5pbmcgYW5kIEJsZW5kaW5nIzMxMTIyCi1uYWljcyMzMTEyMyNCcmVha2Zhc3QgQ2VyZWFsIE1hbnVmYWN0dXJpbmcjMzExMgotbmFpY3MjMzExMyNTdWdhciBhbmQgQ29uZmVjdGlvbmVyeSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzExCi1uYWljcyMzMTEzMSNTdWdhciBNYW51ZmFjdHVyaW5nIzMxMTMKLW5haWNzIzMxMTMxMSNTdWdhcmNhbmUgTWlsbHMjMzExMzEKLW5haWNzIzMxMTMxMiNDYW5lIFN1Z2FyIFJlZmluaW5nIzMxMTMxCi1uYWljcyMzMTEzMTMjQmVldCBTdWdhciBNYW51ZmFjdHVyaW5nIzMxMTMxCi1uYWljcyMzMTEzMiNDaG9jb2xhdGUgYW5kIENvbmZlY3Rpb25lcnkgTWFudWZhY3R1cmluZyBmcm9tIENhY2FvIEJlYW5zIzMxMTMKLW5haWNzIzMxMTMzI0NvbmZlY3Rpb25lcnkgTWFudWZhY3R1cmluZyBmcm9tIFB1cmNoYXNlZCBDaG9jb2xhdGUjMzExMwotbmFpY3MjMzExMzQjTm9uY2hvY29sYXRlIENvbmZlY3Rpb25lcnkgTWFudWZhY3R1cmluZyMzMTEzCi1uYWljcyMzMTE0I0ZydWl0IGFuZCBWZWdldGFibGUgUHJlc2VydmluZyBhbmQgU3BlY2lhbHR5IEZvb2QgTWFudWZhY3R1cmluZyMzMTEKLW5haWNzIzMxMTQxI0Zyb3plbiBGb29kIE1hbnVmYWN0dXJpbmcjMzExNAotbmFpY3MjMzExNDExI0Zyb3plbiBGcnVpdCwgSnVpY2UsIGFuZCBWZWdldGFibGUgTWFudWZhY3R1cmluZyMzMTE0MQotbmFpY3MjMzExNDEyI0Zyb3plbiBTcGVjaWFsdHkgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTQxCi1uYWljcyMzMTE0MiNGcnVpdCBhbmQgVmVnZXRhYmxlIENhbm5pbmcsIFBpY2tsaW5nLCBhbmQgRHJ5aW5nIzMxMTQKLW5haWNzIzMxMTQyMSNGcnVpdCBhbmQgVmVnZXRhYmxlIENhbm5pbmcjMzExNDIKLW5haWNzIzMxMTQyMiNTcGVjaWFsdHkgQ2FubmluZyMzMTE0MgotbmFpY3MjMzExNDIzI0RyaWVkIGFuZCBEZWh5ZHJhdGVkIEZvb2QgTWFudWZhY3R1cmluZyMzMTE0MgotbmFpY3MjMzExNSNEYWlyeSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzExCi1uYWljcyMzMTE1MSNEYWlyeSBQcm9kdWN0IChleGNlcHQgRnJvemVuKSBNYW51ZmFjdHVyaW5nIzMxMTUKLW5haWNzIzMxMTUxMSNGbHVpZCBNaWxrIE1hbnVmYWN0dXJpbmcjMzExNTEKLW5haWNzIzMxMTUxMiNDcmVhbWVyeSBCdXR0ZXIgTWFudWZhY3R1cmluZyMzMTE1MQotbmFpY3MjMzExNTEzI0NoZWVzZSBNYW51ZmFjdHVyaW5nIzMxMTUxCi1uYWljcyMzMTE1MTQjRHJ5LCBDb25kZW5zZWQsIGFuZCBFdmFwb3JhdGVkIERhaXJ5IFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMTE1MQotbmFpY3MjMzExNTIjSWNlIENyZWFtIGFuZCBGcm96ZW4gRGVzc2VydCBNYW51ZmFjdHVyaW5nIzMxMTUKLW5haWNzIzMxMTYjQW5pbWFsIFNsYXVnaHRlcmluZyBhbmQgUHJvY2Vzc2luZyMzMTEKLW5haWNzIzMxMTYxI0FuaW1hbCBTbGF1Z2h0ZXJpbmcgYW5kIFByb2Nlc3NpbmcjMzExNgotbmFpY3MjMzExNjExI0FuaW1hbCAoZXhjZXB0IFBvdWx0cnkpIFNsYXVnaHRlcmluZyMzMTE2MQotbmFpY3MjMzExNjEyI01lYXQgUHJvY2Vzc2VkIGZyb20gQ2FyY2Fzc2VzIzMxMTYxCi1uYWljcyMzMTE2MTMjUmVuZGVyaW5nIGFuZCBNZWF0IEJ5cHJvZHVjdCBQcm9jZXNzaW5nIzMxMTYxCi1uYWljcyMzMTE2MTUjUG91bHRyeSBQcm9jZXNzaW5nIzMxMTYxCi1uYWljcyMzMTE3I1NlYWZvb2QgUHJvZHVjdCBQcmVwYXJhdGlvbiBhbmQgUGFja2FnaW5nIzMxMQotbmFpY3MjMzExNzEjU2VhZm9vZCBQcm9kdWN0IFByZXBhcmF0aW9uIGFuZCBQYWNrYWdpbmcjMzExNwotbmFpY3MjMzExNzExI1NlYWZvb2QgQ2FubmluZyMzMTE3MQotbmFpY3MjMzExNzEyI0ZyZXNoIGFuZCBGcm96ZW4gU2VhZm9vZCBQcm9jZXNzaW5nIzMxMTcxCi1uYWljcyMzMTE4I0Jha2VyaWVzIGFuZCBUb3J0aWxsYSBNYW51ZmFjdHVyaW5nIzMxMQotbmFpY3MjMzExODEjQnJlYWQgYW5kIEJha2VyeSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzExOAotbmFpY3MjMzExODExI1JldGFpbCBCYWtlcmllcyMzMTE4MQotbmFpY3MjMzExODEyI0NvbW1lcmNpYWwgQmFrZXJpZXMjMzExODEKLW5haWNzIzMxMTgxMyNGcm96ZW4gQ2FrZXMsIFBpZXMsIGFuZCBPdGhlciBQYXN0cmllcyBNYW51ZmFjdHVyaW5nIzMxMTgxCi1uYWljcyMzMTE4MiNDb29raWUsIENyYWNrZXIsIGFuZCBQYXN0YSBNYW51ZmFjdHVyaW5nIzMxMTgKLW5haWNzIzMxMTgyMSNDb29raWUgYW5kIENyYWNrZXIgTWFudWZhY3R1cmluZyMzMTE4MgotbmFpY3MjMzExODIyI0Zsb3VyIE1peGVzIGFuZCBEb3VnaCBNYW51ZmFjdHVyaW5nIGZyb20gUHVyY2hhc2VkIEZsb3VyIzMxMTgyCi1uYWljcyMzMTE4MjMjRHJ5IFBhc3RhIE1hbnVmYWN0dXJpbmcjMzExODIKLW5haWNzIzMxMTgzI1RvcnRpbGxhIE1hbnVmYWN0dXJpbmcjMzExOAotbmFpY3MjMzExOSNPdGhlciBGb29kIE1hbnVmYWN0dXJpbmcjMzExCi1uYWljcyMzMTE5MSNTbmFjayBGb29kIE1hbnVmYWN0dXJpbmcjMzExOQotbmFpY3MjMzExOTExI1JvYXN0ZWQgTnV0cyBhbmQgUGVhbnV0IEJ1dHRlciBNYW51ZmFjdHVyaW5nIzMxMTkxCi1uYWljcyMzMTE5MTkjT3RoZXIgU25hY2sgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTkxCi1uYWljcyMzMTE5MiNDb2ZmZWUgYW5kIFRlYSBNYW51ZmFjdHVyaW5nIzMxMTkKLW5haWNzIzMxMTkzI0ZsYXZvcmluZyBTeXJ1cCBhbmQgQ29uY2VudHJhdGUgTWFudWZhY3R1cmluZyMzMTE5Ci1uYWljcyMzMTE5NCNTZWFzb25pbmcgYW5kIERyZXNzaW5nIE1hbnVmYWN0dXJpbmcjMzExOQotbmFpY3MjMzExOTQxI01heW9ubmFpc2UsIERyZXNzaW5nLCBhbmQgT3RoZXIgUHJlcGFyZWQgU2F1Y2UgTWFudWZhY3R1cmluZyMzMTE5NAotbmFpY3MjMzExOTQyI1NwaWNlIGFuZCBFeHRyYWN0IE1hbnVmYWN0dXJpbmcjMzExOTQKLW5haWNzIzMxMTk5I0FsbCBPdGhlciBGb29kIE1hbnVmYWN0dXJpbmcjMzExOQotbmFpY3MjMzExOTkxI1BlcmlzaGFibGUgUHJlcGFyZWQgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTk5Ci1uYWljcyMzMTE5OTkjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgRm9vZCBNYW51ZmFjdHVyaW5nIzMxMTk5Ci1uYWljcyMzMTIjQmV2ZXJhZ2UgYW5kIFRvYmFjY28gUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMxCi1uYWljcyMzMTIxI0JldmVyYWdlIE1hbnVmYWN0dXJpbmcjMzEyCi1uYWljcyMzMTIxMSNTb2Z0IERyaW5rIGFuZCBJY2UgTWFudWZhY3R1cmluZyMzMTIxCi1uYWljcyMzMTIxMTEjU29mdCBEcmluayBNYW51ZmFjdHVyaW5nIzMxMjExCi1uYWljcyMzMTIxMTIjQm90dGxlZCBXYXRlciBNYW51ZmFjdHVyaW5nIzMxMjExCi1uYWljcyMzMTIxMTMjSWNlIE1hbnVmYWN0dXJpbmcjMzEyMTEKLW5haWNzIzMxMjEyI0JyZXdlcmllcyMzMTIxCi1uYWljcyMzMTIxMyNXaW5lcmllcyMzMTIxCi1uYWljcyMzMTIxNCNEaXN0aWxsZXJpZXMjMzEyMQotbmFpY3MjMzEyMiNUb2JhY2NvIE1hbnVmYWN0dXJpbmcjMzEyCi1uYWljcyMzMTIyMSNUb2JhY2NvIFN0ZW1taW5nIGFuZCBSZWRyeWluZyMzMTIyCi1uYWljcyMzMTIyMiNUb2JhY2NvIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMTIyCi1uYWljcyMzMTIyMjEjQ2lnYXJldHRlIE1hbnVmYWN0dXJpbmcjMzEyMjIKLW5haWNzIzMxMjIyOSNPdGhlciBUb2JhY2NvIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMTIyMgotbmFpY3MjMzEzI1RleHRpbGUgTWlsbHMjMzEKLW5haWNzIzMxMzEjRmliZXIsIFlhcm4sIGFuZCBUaHJlYWQgTWlsbHMjMzEzCi1uYWljcyMzMTMxMSNGaWJlciwgWWFybiwgYW5kIFRocmVhZCBNaWxscyMzMTMxCi1uYWljcyMzMTMxMTEjWWFybiBTcGlubmluZyBNaWxscyMzMTMxMQotbmFpY3MjMzEzMTEyI1lhcm4gVGV4dHVyaXppbmcsIFRocm93aW5nLCBhbmQgVHdpc3RpbmcgTWlsbHMjMzEzMTEKLW5haWNzIzMxMzExMyNUaHJlYWQgTWlsbHMjMzEzMTEKLW5haWNzIzMxMzIjRmFicmljIE1pbGxzIzMxMwotbmFpY3MjMzEzMjEjQnJvYWR3b3ZlbiBGYWJyaWMgTWlsbHMjMzEzMgotbmFpY3MjMzEzMjIjTmFycm93IEZhYnJpYyBNaWxscyBhbmQgU2NoaWZmbGkgTWFjaGluZSBFbWJyb2lkZXJ5IzMxMzIKLW5haWNzIzMxMzIyMSNOYXJyb3cgRmFicmljIE1pbGxzIzMxMzIyCi1uYWljcyMzMTMyMjIjU2NoaWZmbGkgTWFjaGluZSBFbWJyb2lkZXJ5IzMxMzIyCi1uYWljcyMzMTMyMyNOb253b3ZlbiBGYWJyaWMgTWlsbHMjMzEzMgotbmFpY3MjMzEzMjQjS25pdCBGYWJyaWMgTWlsbHMjMzEzMgotbmFpY3MjMzEzMjQxI1dlZnQgS25pdCBGYWJyaWMgTWlsbHMjMzEzMjQKLW5haWNzIzMxMzI0OSNPdGhlciBLbml0IEZhYnJpYyBhbmQgTGFjZSBNaWxscyMzMTMyNAotbmFpY3MjMzEzMyNUZXh0aWxlIGFuZCBGYWJyaWMgRmluaXNoaW5nIGFuZCBGYWJyaWMgQ29hdGluZyBNaWxscyMzMTMKLW5haWNzIzMxMzMxI1RleHRpbGUgYW5kIEZhYnJpYyBGaW5pc2hpbmcgTWlsbHMjMzEzMwotbmFpY3MjMzEzMzExI0Jyb2Fkd292ZW4gRmFicmljIEZpbmlzaGluZyBNaWxscyMzMTMzMQotbmFpY3MjMzEzMzEyI1RleHRpbGUgYW5kIEZhYnJpYyBGaW5pc2hpbmcgKGV4Y2VwdCBCcm9hZHdvdmVuIEZhYnJpYykgTWlsbHMjMzEzMzEKLW5haWNzIzMxMzMyI0ZhYnJpYyBDb2F0aW5nIE1pbGxzIzMxMzMKLW5haWNzIzMxNCNUZXh0aWxlIFByb2R1Y3QgTWlsbHMjMzEKLW5haWNzIzMxNDEjVGV4dGlsZSBGdXJuaXNoaW5ncyBNaWxscyMzMTQKLW5haWNzIzMxNDExI0NhcnBldCBhbmQgUnVnIE1pbGxzIzMxNDEKLW5haWNzIzMxNDEyI0N1cnRhaW4gYW5kIExpbmVuIE1pbGxzIzMxNDEKLW5haWNzIzMxNDEyMSNDdXJ0YWluIGFuZCBEcmFwZXJ5IE1pbGxzIzMxNDEyCi1uYWljcyMzMTQxMjkjT3RoZXIgSG91c2Vob2xkIFRleHRpbGUgUHJvZHVjdCBNaWxscyMzMTQxMgotbmFpY3MjMzE0OSNPdGhlciBUZXh0aWxlIFByb2R1Y3QgTWlsbHMjMzE0Ci1uYWljcyMzMTQ5MSNUZXh0aWxlIEJhZyBhbmQgQ2FudmFzIE1pbGxzIzMxNDkKLW5haWNzIzMxNDkxMSNUZXh0aWxlIEJhZyBNaWxscyMzMTQ5MQotbmFpY3MjMzE0OTEyI0NhbnZhcyBhbmQgUmVsYXRlZCBQcm9kdWN0IE1pbGxzIzMxNDkxCi1uYWljcyMzMTQ5OSNBbGwgT3RoZXIgVGV4dGlsZSBQcm9kdWN0IE1pbGxzIzMxNDkKLW5haWNzIzMxNDk5MSNSb3BlLCBDb3JkYWdlLCBhbmQgVHdpbmUgTWlsbHMjMzE0OTkKLW5haWNzIzMxNDk5MiNUaXJlIENvcmQgYW5kIFRpcmUgRmFicmljIE1pbGxzIzMxNDk5Ci1uYWljcyMzMTQ5OTkjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgVGV4dGlsZSBQcm9kdWN0IE1pbGxzIzMxNDk5Ci1uYWljcyMzMTUjQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxCi1uYWljcyMzMTUxI0FwcGFyZWwgS25pdHRpbmcgTWlsbHMjMzE1Ci1uYWljcyMzMTUxMSNIb3NpZXJ5IGFuZCBTb2NrIE1pbGxzIzMxNTEKLW5haWNzIzMxNTExMSNTaGVlciBIb3NpZXJ5IE1pbGxzIzMxNTExCi1uYWljcyMzMTUxMTkjT3RoZXIgSG9zaWVyeSBhbmQgU29jayBNaWxscyMzMTUxMQotbmFpY3MjMzE1MTkjT3RoZXIgQXBwYXJlbCBLbml0dGluZyBNaWxscyMzMTUxCi1uYWljcyMzMTUxOTEjT3V0ZXJ3ZWFyIEtuaXR0aW5nIE1pbGxzIzMxNTE5Ci1uYWljcyMzMTUxOTIjVW5kZXJ3ZWFyIGFuZCBOaWdodHdlYXIgS25pdHRpbmcgTWlsbHMjMzE1MTkKLW5haWNzIzMxNTIjQ3V0IGFuZCBTZXcgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNQotbmFpY3MjMzE1MjEjQ3V0IGFuZCBTZXcgQXBwYXJlbCBDb250cmFjdG9ycyMzMTUyCi1uYWljcyMzMTUyMTEjTWVuJ3MgYW5kIEJveXMnIEN1dCBhbmQgU2V3IEFwcGFyZWwgQ29udHJhY3RvcnMjMzE1MjEKLW5haWNzIzMxNTIxMiNXb21lbidzLCBHaXJscycsIGFuZCBJbmZhbnRzJyBDdXQgYW5kIFNldyBBcHBhcmVsIENvbnRyYWN0b3JzIzMxNTIxCi1uYWljcyMzMTUyMiNNZW4ncyBhbmQgQm95cycgQ3V0IGFuZCBTZXcgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNTIKLW5haWNzIzMxNTIyMSNNZW4ncyBhbmQgQm95cycgQ3V0IGFuZCBTZXcgVW5kZXJ3ZWFyIGFuZCBOaWdodHdlYXIgTWFudWZhY3R1cmluZyMzMTUyMgotbmFpY3MjMzE1MjIyI01lbidzIGFuZCBCb3lzJyBDdXQgYW5kIFNldyBTdWl0LCBDb2F0LCBhbmQgT3ZlcmNvYXQgTWFudWZhY3R1cmluZyMzMTUyMgotbmFpY3MjMzE1MjIzI01lbidzIGFuZCBCb3lzJyBDdXQgYW5kIFNldyBTaGlydCAoZXhjZXB0IFdvcmsgU2hpcnQpIE1hbnVmYWN0dXJpbmcjMzE1MjIKLW5haWNzIzMxNTIyNCNNZW4ncyBhbmQgQm95cycgQ3V0IGFuZCBTZXcgVHJvdXNlciwgU2xhY2ssIGFuZCBKZWFuIE1hbnVmYWN0dXJpbmcjMzE1MjIKLW5haWNzIzMxNTIyNSNNZW4ncyBhbmQgQm95cycgQ3V0IGFuZCBTZXcgV29yayBDbG90aGluZyBNYW51ZmFjdHVyaW5nIzMxNTIyCi1uYWljcyMzMTUyMjgjTWVuJ3MgYW5kIEJveXMnIEN1dCBhbmQgU2V3IE90aGVyIE91dGVyd2VhciBNYW51ZmFjdHVyaW5nIzMxNTIyCi1uYWljcyMzMTUyMyNXb21lbidzIGFuZCBHaXJscycgQ3V0IGFuZCBTZXcgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNTIKLW5haWNzIzMxNTIzMSNXb21lbidzIGFuZCBHaXJscycgQ3V0IGFuZCBTZXcgTGluZ2VyaWUsIExvdW5nZXdlYXIsIGFuZCBOaWdodHdlYXIgTWFudWZhY3R1cmluZyMzMTUyMwotbmFpY3MjMzE1MjMyI1dvbWVuJ3MgYW5kIEdpcmxzJyBDdXQgYW5kIFNldyBCbG91c2UgYW5kIFNoaXJ0IE1hbnVmYWN0dXJpbmcjMzE1MjMKLW5haWNzIzMxNTIzMyNXb21lbidzIGFuZCBHaXJscycgQ3V0IGFuZCBTZXcgRHJlc3MgTWFudWZhY3R1cmluZyMzMTUyMwotbmFpY3MjMzE1MjM0I1dvbWVuJ3MgYW5kIEdpcmxzJyBDdXQgYW5kIFNldyBTdWl0LCBDb2F0LCBUYWlsb3JlZCBKYWNrZXQsIGFuZCBTa2lydCBNYW51ZmFjdHVyaW5nIzMxNTIzCi1uYWljcyMzMTUyMzkjV29tZW4ncyBhbmQgR2lybHMnIEN1dCBhbmQgU2V3IE90aGVyIE91dGVyd2VhciBNYW51ZmFjdHVyaW5nIzMxNTIzCi1uYWljcyMzMTUyOSNPdGhlciBDdXQgYW5kIFNldyBBcHBhcmVsIE1hbnVmYWN0dXJpbmcjMzE1MgotbmFpY3MjMzE1MjkxI0luZmFudHMnIEN1dCBhbmQgU2V3IEFwcGFyZWwgTWFudWZhY3R1cmluZyMzMTUyOQotbmFpY3MjMzE1MjkyI0Z1ciBhbmQgTGVhdGhlciBBcHBhcmVsIE1hbnVmYWN0dXJpbmcjMzE1MjkKLW5haWNzIzMxNTI5OSNBbGwgT3RoZXIgQ3V0IGFuZCBTZXcgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNTI5Ci1uYWljcyMzMTU5I0FwcGFyZWwgQWNjZXNzb3JpZXMgYW5kIE90aGVyIEFwcGFyZWwgTWFudWZhY3R1cmluZyMzMTUKLW5haWNzIzMxNTk5I0FwcGFyZWwgQWNjZXNzb3JpZXMgYW5kIE90aGVyIEFwcGFyZWwgTWFudWZhY3R1cmluZyMzMTU5Ci1uYWljcyMzMTU5OTEjSGF0LCBDYXAsIGFuZCBNaWxsaW5lcnkgTWFudWZhY3R1cmluZyMzMTU5OQotbmFpY3MjMzE1OTkyI0dsb3ZlIGFuZCBNaXR0ZW4gTWFudWZhY3R1cmluZyMzMTU5OQotbmFpY3MjMzE1OTkzI01lbidzIGFuZCBCb3lzJyBOZWNrd2VhciBNYW51ZmFjdHVyaW5nIzMxNTk5Ci1uYWljcyMzMTU5OTkjT3RoZXIgQXBwYXJlbCBBY2Nlc3NvcmllcyBhbmQgT3RoZXIgQXBwYXJlbCBNYW51ZmFjdHVyaW5nIzMxNTk5Ci1uYWljcyMzMTYjTGVhdGhlciBhbmQgQWxsaWVkIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMQotbmFpY3MjMzE2MSNMZWF0aGVyIGFuZCBIaWRlIFRhbm5pbmcgYW5kIEZpbmlzaGluZyMzMTYKLW5haWNzIzMxNjExI0xlYXRoZXIgYW5kIEhpZGUgVGFubmluZyBhbmQgRmluaXNoaW5nIzMxNjEKLW5haWNzIzMxNjIjRm9vdHdlYXIgTWFudWZhY3R1cmluZyMzMTYKLW5haWNzIzMxNjIxI0Zvb3R3ZWFyIE1hbnVmYWN0dXJpbmcjMzE2MgotbmFpY3MjMzE2MjExI1J1YmJlciBhbmQgUGxhc3RpY3MgRm9vdHdlYXIgTWFudWZhY3R1cmluZyMzMTYyMQotbmFpY3MjMzE2MjEyI0hvdXNlIFNsaXBwZXIgTWFudWZhY3R1cmluZyMzMTYyMQotbmFpY3MjMzE2MjEzI01lbidzIEZvb3R3ZWFyIChleGNlcHQgQXRobGV0aWMpIE1hbnVmYWN0dXJpbmcjMzE2MjEKLW5haWNzIzMxNjIxNCNXb21lbidzIEZvb3R3ZWFyIChleGNlcHQgQXRobGV0aWMpIE1hbnVmYWN0dXJpbmcjMzE2MjEKLW5haWNzIzMxNjIxOSNPdGhlciBGb290d2VhciBNYW51ZmFjdHVyaW5nIzMxNjIxCi1uYWljcyMzMTY5I090aGVyIExlYXRoZXIgYW5kIEFsbGllZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzE2Ci1uYWljcyMzMTY5OSNPdGhlciBMZWF0aGVyIGFuZCBBbGxpZWQgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMxNjkKLW5haWNzIzMxNjk5MSNMdWdnYWdlIE1hbnVmYWN0dXJpbmcjMzE2OTkKLW5haWNzIzMxNjk5MiNXb21lbidzIEhhbmRiYWcgYW5kIFB1cnNlIE1hbnVmYWN0dXJpbmcjMzE2OTkKLW5haWNzIzMxNjk5MyNQZXJzb25hbCBMZWF0aGVyIEdvb2QgKGV4Y2VwdCBXb21lbidzIEhhbmRiYWcgYW5kIFB1cnNlKSBNYW51ZmFjdHVyaW5nIzMxNjk5Ci1uYWljcyMzMTY5OTkjQWxsIE90aGVyIExlYXRoZXIgR29vZCBNYW51ZmFjdHVyaW5nIzMxNjk5Ci1uYWljcyMzMiNNYW51ZmFjdHVyaW5nIzMyCi1uYWljcyMzMjEjV29vZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIKLW5haWNzIzMyMTEjU2F3bWlsbHMgYW5kIFdvb2QgUHJlc2VydmF0aW9uIzMyMQotbmFpY3MjMzIxMTEjU2F3bWlsbHMgYW5kIFdvb2QgUHJlc2VydmF0aW9uIzMyMTEKLW5haWNzIzMyMTExMyNTYXdtaWxscyMzMjExMQotbmFpY3MjMzIxMTE0I1dvb2QgUHJlc2VydmF0aW9uIzMyMTExCi1uYWljcyMzMjEyI1ZlbmVlciwgUGx5d29vZCwgYW5kIEVuZ2luZWVyZWQgV29vZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIxCi1uYWljcyMzMjEyMSNWZW5lZXIsIFBseXdvb2QsIGFuZCBFbmdpbmVlcmVkIFdvb2QgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMTIKLW5haWNzIzMyMTIxMSNIYXJkd29vZCBWZW5lZXIgYW5kIFBseXdvb2QgTWFudWZhY3R1cmluZyMzMjEyMQotbmFpY3MjMzIxMjEyI1NvZnR3b29kIFZlbmVlciBhbmQgUGx5d29vZCBNYW51ZmFjdHVyaW5nIzMyMTIxCi1uYWljcyMzMjEyMTMjRW5naW5lZXJlZCBXb29kIE1lbWJlciAoZXhjZXB0IFRydXNzKSBNYW51ZmFjdHVyaW5nIzMyMTIxCi1uYWljcyMzMjEyMTQjVHJ1c3MgTWFudWZhY3R1cmluZyMzMjEyMQotbmFpY3MjMzIxMjE5I1JlY29uc3RpdHV0ZWQgV29vZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIxMjEKLW5haWNzIzMyMTkjT3RoZXIgV29vZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIxCi1uYWljcyMzMjE5MSNNaWxsd29yayMzMjE5Ci1uYWljcyMzMjE5MTEjV29vZCBXaW5kb3cgYW5kIERvb3IgTWFudWZhY3R1cmluZyMzMjE5MQotbmFpY3MjMzIxOTEyI0N1dCBTdG9jaywgUmVzYXdpbmcgTHVtYmVyLCBhbmQgUGxhbmluZyMzMjE5MQotbmFpY3MjMzIxOTE4I090aGVyIE1pbGx3b3JrIChpbmNsdWRpbmcgRmxvb3JpbmcpIzMyMTkxCi1uYWljcyMzMjE5MiNXb29kIENvbnRhaW5lciBhbmQgUGFsbGV0IE1hbnVmYWN0dXJpbmcjMzIxOQotbmFpY3MjMzIxOTkjQWxsIE90aGVyIFdvb2QgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMTkKLW5haWNzIzMyMTk5MSNNYW51ZmFjdHVyZWQgSG9tZSAoTW9iaWxlIEhvbWUpIE1hbnVmYWN0dXJpbmcjMzIxOTkKLW5haWNzIzMyMTk5MiNQcmVmYWJyaWNhdGVkIFdvb2QgQnVpbGRpbmcgTWFudWZhY3R1cmluZyMzMjE5OQotbmFpY3MjMzIxOTk5I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIFdvb2QgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMTk5Ci1uYWljcyMzMjIjUGFwZXIgTWFudWZhY3R1cmluZyMzMgotbmFpY3MjMzIyMSNQdWxwLCBQYXBlciwgYW5kIFBhcGVyYm9hcmQgTWlsbHMjMzIyCi1uYWljcyMzMjIxMSNQdWxwIE1pbGxzIzMyMjEKLW5haWNzIzMyMjEyI1BhcGVyIE1pbGxzIzMyMjEKLW5haWNzIzMyMjEyMSNQYXBlciAoZXhjZXB0IE5ld3NwcmludCkgTWlsbHMjMzIyMTIKLW5haWNzIzMyMjEyMiNOZXdzcHJpbnQgTWlsbHMjMzIyMTIKLW5haWNzIzMyMjEzI1BhcGVyYm9hcmQgTWlsbHMjMzIyMQotbmFpY3MjMzIyMiNDb252ZXJ0ZWQgUGFwZXIgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMgotbmFpY3MjMzIyMjEjUGFwZXJib2FyZCBDb250YWluZXIgTWFudWZhY3R1cmluZyMzMjIyCi1uYWljcyMzMjIyMTEjQ29ycnVnYXRlZCBhbmQgU29saWQgRmliZXIgQm94IE1hbnVmYWN0dXJpbmcjMzIyMjEKLW5haWNzIzMyMjIxMiNGb2xkaW5nIFBhcGVyYm9hcmQgQm94IE1hbnVmYWN0dXJpbmcjMzIyMjEKLW5haWNzIzMyMjIxMyNTZXR1cCBQYXBlcmJvYXJkIEJveCBNYW51ZmFjdHVyaW5nIzMyMjIxCi1uYWljcyMzMjIyMTQjRmliZXIgQ2FuLCBUdWJlLCBEcnVtLCBhbmQgU2ltaWxhciBQcm9kdWN0cyBNYW51ZmFjdHVyaW5nIzMyMjIxCi1uYWljcyMzMjIyMTUjTm9uZm9sZGluZyBTYW5pdGFyeSBGb29kIENvbnRhaW5lciBNYW51ZmFjdHVyaW5nIzMyMjIxCi1uYWljcyMzMjIyMiNQYXBlciBCYWcgYW5kIENvYXRlZCBhbmQgVHJlYXRlZCBQYXBlciBNYW51ZmFjdHVyaW5nIzMyMjIKLW5haWNzIzMyMjIyMSNDb2F0ZWQgYW5kIExhbWluYXRlZCBQYWNrYWdpbmcgUGFwZXIgYW5kIFBsYXN0aWNzIEZpbG0gTWFudWZhY3R1cmluZyMzMjIyMgotbmFpY3MjMzIyMjIyI0NvYXRlZCBhbmQgTGFtaW5hdGVkIFBhcGVyIE1hbnVmYWN0dXJpbmcjMzIyMjIKLW5haWNzIzMyMjIyMyNQbGFzdGljcywgRm9pbCwgYW5kIENvYXRlZCBQYXBlciBCYWcgTWFudWZhY3R1cmluZyMzMjIyMgotbmFpY3MjMzIyMjI0I1VuY29hdGVkIFBhcGVyIGFuZCBNdWx0aXdhbGwgQmFnIE1hbnVmYWN0dXJpbmcjMzIyMjIKLW5haWNzIzMyMjIyNSNMYW1pbmF0ZWQgQWx1bWludW0gRm9pbCBNYW51ZmFjdHVyaW5nIGZvciBGbGV4aWJsZSBQYWNrYWdpbmcgVXNlcyMzMjIyMgotbmFpY3MjMzIyMjI2I1N1cmZhY2UtQ29hdGVkIFBhcGVyYm9hcmQgTWFudWZhY3R1cmluZyMzMjIyMgotbmFpY3MjMzIyMjMjU3RhdGlvbmVyeSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIyMgotbmFpY3MjMzIyMjMxI0RpZS1DdXQgUGFwZXIgYW5kIFBhcGVyYm9hcmQgT2ZmaWNlIFN1cHBsaWVzIE1hbnVmYWN0dXJpbmcjMzIyMjMKLW5haWNzIzMyMjIzMiNFbnZlbG9wZSBNYW51ZmFjdHVyaW5nIzMyMjIzCi1uYWljcyMzMjIyMzMjU3RhdGlvbmVyeSwgVGFibGV0LCBhbmQgUmVsYXRlZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIyMjMKLW5haWNzIzMyMjI5I090aGVyIENvbnZlcnRlZCBQYXBlciBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzIyMgotbmFpY3MjMzIyMjkxI1Nhbml0YXJ5IFBhcGVyIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjIyOQotbmFpY3MjMzIyMjk5I0FsbCBPdGhlciBDb252ZXJ0ZWQgUGFwZXIgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyMjI5Ci1uYWljcyMzMjMjUHJpbnRpbmcgYW5kIFJlbGF0ZWQgU3VwcG9ydCBBY3Rpdml0aWVzIzMyCi1uYWljcyMzMjMxI1ByaW50aW5nIGFuZCBSZWxhdGVkIFN1cHBvcnQgQWN0aXZpdGllcyMzMjMKLW5haWNzIzMyMzExI1ByaW50aW5nIzMyMzEKLW5haWNzIzMyMzExMCNDb21tZXJjaWFsIExpdGhvZ3JhcGhpYyBQcmludGluZyMzMjMxMQotbmFpY3MjMzIzMTExI0NvbW1lcmNpYWwgR3JhdnVyZSBQcmludGluZyMzMjMxMQotbmFpY3MjMzIzMTEyI0NvbW1lcmNpYWwgRmxleG9ncmFwaGljIFByaW50aW5nIzMyMzExCi1uYWljcyMzMjMxMTMjQ29tbWVyY2lhbCBTY3JlZW4gUHJpbnRpbmcjMzIzMTEKLW5haWNzIzMyMzExNCNRdWljayBQcmludGluZyMzMjMxMQotbmFpY3MjMzIzMTE1I0RpZ2l0YWwgUHJpbnRpbmcjMzIzMTEKLW5haWNzIzMyMzExNiNNYW5pZm9sZCBCdXNpbmVzcyBGb3JtcyBQcmludGluZyMzMjMxMQotbmFpY3MjMzIzMTE3I0Jvb2tzIFByaW50aW5nIzMyMzExCi1uYWljcyMzMjMxMTgjQmxhbmtib29rLCBMb29zZWxlYWYgQmluZGVycywgYW5kIERldmljZXMgTWFudWZhY3R1cmluZyMzMjMxMQotbmFpY3MjMzIzMTE5I090aGVyIENvbW1lcmNpYWwgUHJpbnRpbmcjMzIzMTEKLW5haWNzIzMyMzEyI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgUHJpbnRpbmcjMzIzMQotbmFpY3MjMzIzMTIxI1RyYWRlYmluZGluZyBhbmQgUmVsYXRlZCBXb3JrIzMyMzEyCi1uYWljcyMzMjMxMjIjUHJlcHJlc3MgU2VydmljZXMjMzIzMTIKLW5haWNzIzMyNCNQZXRyb2xldW0gYW5kIENvYWwgUHJvZHVjdHMgTWFudWZhY3R1cmluZyMzMgotbmFpY3MjMzI0MSNQZXRyb2xldW0gYW5kIENvYWwgUHJvZHVjdHMgTWFudWZhY3R1cmluZyMzMjQKLW5haWNzIzMyNDExI1BldHJvbGV1bSBSZWZpbmVyaWVzIzMyNDEKLW5haWNzIzMyNDEyI0FzcGhhbHQgUGF2aW5nLCBSb29maW5nLCBhbmQgU2F0dXJhdGVkIE1hdGVyaWFscyBNYW51ZmFjdHVyaW5nIzMyNDEKLW5haWNzIzMyNDEyMSNBc3BoYWx0IFBhdmluZyBNaXh0dXJlIGFuZCBCbG9jayBNYW51ZmFjdHVyaW5nIzMyNDEyCi1uYWljcyMzMjQxMjIjQXNwaGFsdCBTaGluZ2xlIGFuZCBDb2F0aW5nIE1hdGVyaWFscyBNYW51ZmFjdHVyaW5nIzMyNDEyCi1uYWljcyMzMjQxOSNPdGhlciBQZXRyb2xldW0gYW5kIENvYWwgUHJvZHVjdHMgTWFudWZhY3R1cmluZyMzMjQxCi1uYWljcyMzMjQxOTEjUGV0cm9sZXVtIEx1YnJpY2F0aW5nIE9pbCBhbmQgR3JlYXNlIE1hbnVmYWN0dXJpbmcjMzI0MTkKLW5haWNzIzMyNDE5OSNBbGwgT3RoZXIgUGV0cm9sZXVtIGFuZCBDb2FsIFByb2R1Y3RzIE1hbnVmYWN0dXJpbmcjMzI0MTkKLW5haWNzIzMyNSNDaGVtaWNhbCBNYW51ZmFjdHVyaW5nIzMyCi1uYWljcyMzMjUxI0Jhc2ljIENoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjUxMSNQZXRyb2NoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1MQotbmFpY3MjMzI1MTIjSW5kdXN0cmlhbCBHYXMgTWFudWZhY3R1cmluZyMzMjUxCi1uYWljcyMzMjUxMyNTeW50aGV0aWMgRHllIGFuZCBQaWdtZW50IE1hbnVmYWN0dXJpbmcjMzI1MQotbmFpY3MjMzI1MTMxI0lub3JnYW5pYyBEeWUgYW5kIFBpZ21lbnQgTWFudWZhY3R1cmluZyMzMjUxMwotbmFpY3MjMzI1MTMyI1N5bnRoZXRpYyBPcmdhbmljIER5ZSBhbmQgUGlnbWVudCBNYW51ZmFjdHVyaW5nIzMyNTEzCi1uYWljcyMzMjUxOCNPdGhlciBCYXNpYyBJbm9yZ2FuaWMgQ2hlbWljYWwgTWFudWZhY3R1cmluZyMzMjUxCi1uYWljcyMzMjUxODEjQWxrYWxpZXMgYW5kIENobG9yaW5lIE1hbnVmYWN0dXJpbmcjMzI1MTgKLW5haWNzIzMyNTE4MiNDYXJib24gQmxhY2sgTWFudWZhY3R1cmluZyMzMjUxOAotbmFpY3MjMzI1MTg4I0FsbCBPdGhlciBCYXNpYyBJbm9yZ2FuaWMgQ2hlbWljYWwgTWFudWZhY3R1cmluZyMzMjUxOAotbmFpY3MjMzI1MTkjT3RoZXIgQmFzaWMgT3JnYW5pYyBDaGVtaWNhbCBNYW51ZmFjdHVyaW5nIzMyNTEKLW5haWNzIzMyNTE5MSNHdW0gYW5kIFdvb2QgQ2hlbWljYWwgTWFudWZhY3R1cmluZyMzMjUxOQotbmFpY3MjMzI1MTkyI0N5Y2xpYyBDcnVkZSBhbmQgSW50ZXJtZWRpYXRlIE1hbnVmYWN0dXJpbmcjMzI1MTkKLW5haWNzIzMyNTE5MyNFdGh5bCBBbGNvaG9sIE1hbnVmYWN0dXJpbmcjMzI1MTkKLW5haWNzIzMyNTE5OSNBbGwgT3RoZXIgQmFzaWMgT3JnYW5pYyBDaGVtaWNhbCBNYW51ZmFjdHVyaW5nIzMyNTE5Ci1uYWljcyMzMjUyI1Jlc2luLCBTeW50aGV0aWMgUnViYmVyLCBhbmQgQXJ0aWZpY2lhbCBhbmQgU3ludGhldGljIEZpYmVycyBhbmQgRmlsYW1lbnRzIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjUyMSNSZXNpbiBhbmQgU3ludGhldGljIFJ1YmJlciBNYW51ZmFjdHVyaW5nIzMyNTIKLW5haWNzIzMyNTIxMSNQbGFzdGljcyBNYXRlcmlhbCBhbmQgUmVzaW4gTWFudWZhY3R1cmluZyMzMjUyMQotbmFpY3MjMzI1MjEyI1N5bnRoZXRpYyBSdWJiZXIgTWFudWZhY3R1cmluZyMzMjUyMQotbmFpY3MjMzI1MjIjQXJ0aWZpY2lhbCBhbmQgU3ludGhldGljIEZpYmVycyBhbmQgRmlsYW1lbnRzIE1hbnVmYWN0dXJpbmcjMzI1MgotbmFpY3MjMzI1MjIxI0NlbGx1bG9zaWMgT3JnYW5pYyBGaWJlciBNYW51ZmFjdHVyaW5nIzMyNTIyCi1uYWljcyMzMjUyMjIjTm9uY2VsbHVsb3NpYyBPcmdhbmljIEZpYmVyIE1hbnVmYWN0dXJpbmcjMzI1MjIKLW5haWNzIzMyNTMjUGVzdGljaWRlLCBGZXJ0aWxpemVyLCBhbmQgT3RoZXIgQWdyaWN1bHR1cmFsIENoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjUzMSNGZXJ0aWxpemVyIE1hbnVmYWN0dXJpbmcjMzI1MwotbmFpY3MjMzI1MzExI05pdHJvZ2Vub3VzIEZlcnRpbGl6ZXIgTWFudWZhY3R1cmluZyMzMjUzMQotbmFpY3MjMzI1MzEyI1Bob3NwaGF0aWMgRmVydGlsaXplciBNYW51ZmFjdHVyaW5nIzMyNTMxCi1uYWljcyMzMjUzMTQjRmVydGlsaXplciAoTWl4aW5nIE9ubHkpIE1hbnVmYWN0dXJpbmcjMzI1MzEKLW5haWNzIzMyNTMyI1Blc3RpY2lkZSBhbmQgT3RoZXIgQWdyaWN1bHR1cmFsIENoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1MwotbmFpY3MjMzI1NCNQaGFybWFjZXV0aWNhbCBhbmQgTWVkaWNpbmUgTWFudWZhY3R1cmluZyMzMjUKLW5haWNzIzMyNTQxI1BoYXJtYWNldXRpY2FsIGFuZCBNZWRpY2luZSBNYW51ZmFjdHVyaW5nIzMyNTQKLW5haWNzIzMyNTQxMSNNZWRpY2luYWwgYW5kIEJvdGFuaWNhbCBNYW51ZmFjdHVyaW5nIzMyNTQxCi1uYWljcyMzMjU0MTIjUGhhcm1hY2V1dGljYWwgUHJlcGFyYXRpb24gTWFudWZhY3R1cmluZyMzMjU0MQotbmFpY3MjMzI1NDEzI0luLVZpdHJvIERpYWdub3N0aWMgU3Vic3RhbmNlIE1hbnVmYWN0dXJpbmcjMzI1NDEKLW5haWNzIzMyNTQxNCNCaW9sb2dpY2FsIFByb2R1Y3QgKGV4Y2VwdCBEaWFnbm9zdGljKSBNYW51ZmFjdHVyaW5nIzMyNTQxCi1uYWljcyMzMjU1I1BhaW50LCBDb2F0aW5nLCBhbmQgQWRoZXNpdmUgTWFudWZhY3R1cmluZyMzMjUKLW5haWNzIzMyNTUxI1BhaW50IGFuZCBDb2F0aW5nIE1hbnVmYWN0dXJpbmcjMzI1NQotbmFpY3MjMzI1NTIjQWRoZXNpdmUgTWFudWZhY3R1cmluZyMzMjU1Ci1uYWljcyMzMjU2I1NvYXAsIENsZWFuaW5nIENvbXBvdW5kLCBhbmQgVG9pbGV0IFByZXBhcmF0aW9uIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjU2MSNTb2FwIGFuZCBDbGVhbmluZyBDb21wb3VuZCBNYW51ZmFjdHVyaW5nIzMyNTYKLW5haWNzIzMyNTYxMSNTb2FwIGFuZCBPdGhlciBEZXRlcmdlbnQgTWFudWZhY3R1cmluZyMzMjU2MQotbmFpY3MjMzI1NjEyI1BvbGlzaCBhbmQgT3RoZXIgU2FuaXRhdGlvbiBHb29kIE1hbnVmYWN0dXJpbmcjMzI1NjEKLW5haWNzIzMyNTYxMyNTdXJmYWNlIEFjdGl2ZSBBZ2VudCBNYW51ZmFjdHVyaW5nIzMyNTYxCi1uYWljcyMzMjU2MiNUb2lsZXQgUHJlcGFyYXRpb24gTWFudWZhY3R1cmluZyMzMjU2Ci1uYWljcyMzMjU5I090aGVyIENoZW1pY2FsIFByb2R1Y3QgYW5kIFByZXBhcmF0aW9uIE1hbnVmYWN0dXJpbmcjMzI1Ci1uYWljcyMzMjU5MSNQcmludGluZyBJbmsgTWFudWZhY3R1cmluZyMzMjU5Ci1uYWljcyMzMjU5MiNFeHBsb3NpdmVzIE1hbnVmYWN0dXJpbmcjMzI1OQotbmFpY3MjMzI1OTkjQWxsIE90aGVyIENoZW1pY2FsIFByb2R1Y3QgYW5kIFByZXBhcmF0aW9uIE1hbnVmYWN0dXJpbmcjMzI1OQotbmFpY3MjMzI1OTkxI0N1c3RvbSBDb21wb3VuZGluZyBvZiBQdXJjaGFzZWQgUmVzaW5zIzMyNTk5Ci1uYWljcyMzMjU5OTIjUGhvdG9ncmFwaGljIEZpbG0sIFBhcGVyLCBQbGF0ZSwgYW5kIENoZW1pY2FsIE1hbnVmYWN0dXJpbmcjMzI1OTkKLW5haWNzIzMyNTk5OCNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBDaGVtaWNhbCBQcm9kdWN0IGFuZCBQcmVwYXJhdGlvbiBNYW51ZmFjdHVyaW5nIzMyNTk5Ci1uYWljcyMzMjYjUGxhc3RpY3MgYW5kIFJ1YmJlciBQcm9kdWN0cyBNYW51ZmFjdHVyaW5nIzMyCi1uYWljcyMzMjYxI1BsYXN0aWNzIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjYKLW5haWNzIzMyNjExI1Vuc3VwcG9ydGVkIFBsYXN0aWNzIEZpbG0sIFNoZWV0LCBhbmQgQmFnIE1hbnVmYWN0dXJpbmcjMzI2MQotbmFpY3MjMzI2MTExI1Vuc3VwcG9ydGVkIFBsYXN0aWNzIEJhZyBNYW51ZmFjdHVyaW5nIzMyNjExCi1uYWljcyMzMjYxMTIjVW5zdXBwb3J0ZWQgUGxhc3RpY3MgUGFja2FnaW5nIEZpbG0gYW5kIFNoZWV0IE1hbnVmYWN0dXJpbmcjMzI2MTEKLW5haWNzIzMyNjExMyNVbnN1cHBvcnRlZCBQbGFzdGljcyBGaWxtIGFuZCBTaGVldCAoZXhjZXB0IFBhY2thZ2luZykgTWFudWZhY3R1cmluZyMzMjYxMQotbmFpY3MjMzI2MTIjUGxhc3RpY3MgUGlwZSwgUGlwZSBGaXR0aW5nLCBhbmQgVW5zdXBwb3J0ZWQgUHJvZmlsZSBTaGFwZSBNYW51ZmFjdHVyaW5nIzMyNjEKLW5haWNzIzMyNjEyMSNVbnN1cHBvcnRlZCBQbGFzdGljcyBQcm9maWxlIFNoYXBlIE1hbnVmYWN0dXJpbmcjMzI2MTIKLW5haWNzIzMyNjEyMiNQbGFzdGljcyBQaXBlIGFuZCBQaXBlIEZpdHRpbmcgTWFudWZhY3R1cmluZyMzMjYxMgotbmFpY3MjMzI2MTMjTGFtaW5hdGVkIFBsYXN0aWNzIFBsYXRlLCBTaGVldCwgYW5kIFNoYXBlIE1hbnVmYWN0dXJpbmcjMzI2MQotbmFpY3MjMzI2MTQjUG9seXN0eXJlbmUgRm9hbSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI2MQotbmFpY3MjMzI2MTUjVXJldGhhbmUgYW5kIE90aGVyIEZvYW0gUHJvZHVjdCAoZXhjZXB0IFBvbHlzdHlyZW5lKSBNYW51ZmFjdHVyaW5nIzMyNjEKLW5haWNzIzMyNjE2I1BsYXN0aWNzIEJvdHRsZSBNYW51ZmFjdHVyaW5nIzMyNjEKLW5haWNzIzMyNjE5I090aGVyIFBsYXN0aWNzIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjYxCi1uYWljcyMzMjYxOTEjUGxhc3RpY3MgUGx1bWJpbmcgRml4dHVyZSBNYW51ZmFjdHVyaW5nIzMyNjE5Ci1uYWljcyMzMjYxOTIjUmVzaWxpZW50IEZsb29yIENvdmVyaW5nIE1hbnVmYWN0dXJpbmcjMzI2MTkKLW5haWNzIzMyNjE5OSNBbGwgT3RoZXIgUGxhc3RpY3MgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyNjE5Ci1uYWljcyMzMjYyI1J1YmJlciBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI2Ci1uYWljcyMzMjYyMSNUaXJlIE1hbnVmYWN0dXJpbmcjMzI2MgotbmFpY3MjMzI2MjExI1RpcmUgTWFudWZhY3R1cmluZyAoZXhjZXB0IFJldHJlYWRpbmcpIzMyNjIxCi1uYWljcyMzMjYyMTIjVGlyZSBSZXRyZWFkaW5nIzMyNjIxCi1uYWljcyMzMjYyMiNSdWJiZXIgYW5kIFBsYXN0aWNzIEhvc2VzIGFuZCBCZWx0aW5nIE1hbnVmYWN0dXJpbmcjMzI2MgotbmFpY3MjMzI2MjkjT3RoZXIgUnViYmVyIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjYyCi1uYWljcyMzMjYyOTEjUnViYmVyIFByb2R1Y3QgTWFudWZhY3R1cmluZyBmb3IgTWVjaGFuaWNhbCBVc2UjMzI2MjkKLW5haWNzIzMyNjI5OSNBbGwgT3RoZXIgUnViYmVyIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjYyOQotbmFpY3MjMzI3I05vbm1ldGFsbGljIE1pbmVyYWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyCi1uYWljcyMzMjcxI0NsYXkgUHJvZHVjdCBhbmQgUmVmcmFjdG9yeSBNYW51ZmFjdHVyaW5nIzMyNwotbmFpY3MjMzI3MTEjUG90dGVyeSwgQ2VyYW1pY3MsIGFuZCBQbHVtYmluZyBGaXh0dXJlIE1hbnVmYWN0dXJpbmcjMzI3MQotbmFpY3MjMzI3MTExI1ZpdHJlb3VzIENoaW5hIFBsdW1iaW5nIEZpeHR1cmUgYW5kIENoaW5hIGFuZCBFYXJ0aGVud2FyZSBCYXRocm9vbSBBY2Nlc3NvcmllcyBNYW51ZmFjdHVyaW5nIzMyNzExCi1uYWljcyMzMjcxMTIjVml0cmVvdXMgQ2hpbmEsIEZpbmUgRWFydGhlbndhcmUsIGFuZCBPdGhlciBQb3R0ZXJ5IFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjcxMQotbmFpY3MjMzI3MTEzI1BvcmNlbGFpbiBFbGVjdHJpY2FsIFN1cHBseSBNYW51ZmFjdHVyaW5nIzMyNzExCi1uYWljcyMzMjcxMiNDbGF5IEJ1aWxkaW5nIE1hdGVyaWFsIGFuZCBSZWZyYWN0b3JpZXMgTWFudWZhY3R1cmluZyMzMjcxCi1uYWljcyMzMjcxMjEjQnJpY2sgYW5kIFN0cnVjdHVyYWwgQ2xheSBUaWxlIE1hbnVmYWN0dXJpbmcjMzI3MTIKLW5haWNzIzMyNzEyMiNDZXJhbWljIFdhbGwgYW5kIEZsb29yIFRpbGUgTWFudWZhY3R1cmluZyMzMjcxMgotbmFpY3MjMzI3MTIzI090aGVyIFN0cnVjdHVyYWwgQ2xheSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI3MTIKLW5haWNzIzMyNzEyNCNDbGF5IFJlZnJhY3RvcnkgTWFudWZhY3R1cmluZyMzMjcxMgotbmFpY3MjMzI3MTI1I05vbmNsYXkgUmVmcmFjdG9yeSBNYW51ZmFjdHVyaW5nIzMyNzEyCi1uYWljcyMzMjcyI0dsYXNzIGFuZCBHbGFzcyBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI3Ci1uYWljcyMzMjcyMSNHbGFzcyBhbmQgR2xhc3MgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyNzIKLW5haWNzIzMyNzIxMSNGbGF0IEdsYXNzIE1hbnVmYWN0dXJpbmcjMzI3MjEKLW5haWNzIzMyNzIxMiNPdGhlciBQcmVzc2VkIGFuZCBCbG93biBHbGFzcyBhbmQgR2xhc3N3YXJlIE1hbnVmYWN0dXJpbmcjMzI3MjEKLW5haWNzIzMyNzIxMyNHbGFzcyBDb250YWluZXIgTWFudWZhY3R1cmluZyMzMjcyMQotbmFpY3MjMzI3MjE1I0dsYXNzIFByb2R1Y3QgTWFudWZhY3R1cmluZyBNYWRlIG9mIFB1cmNoYXNlZCBHbGFzcyMzMjcyMQotbmFpY3MjMzI3MyNDZW1lbnQgYW5kIENvbmNyZXRlIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjcKLW5haWNzIzMyNzMxI0NlbWVudCBNYW51ZmFjdHVyaW5nIzMyNzMKLW5haWNzIzMyNzMyI1JlYWR5LU1peCBDb25jcmV0ZSBNYW51ZmFjdHVyaW5nIzMyNzMKLW5haWNzIzMyNzMzI0NvbmNyZXRlIFBpcGUsIEJyaWNrLCBhbmQgQmxvY2sgTWFudWZhY3R1cmluZyMzMjczCi1uYWljcyMzMjczMzEjQ29uY3JldGUgQmxvY2sgYW5kIEJyaWNrIE1hbnVmYWN0dXJpbmcjMzI3MzMKLW5haWNzIzMyNzMzMiNDb25jcmV0ZSBQaXBlIE1hbnVmYWN0dXJpbmcjMzI3MzMKLW5haWNzIzMyNzM5I090aGVyIENvbmNyZXRlIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjczCi1uYWljcyMzMjc0I0xpbWUgYW5kIEd5cHN1bSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI3Ci1uYWljcyMzMjc0MSNMaW1lIE1hbnVmYWN0dXJpbmcjMzI3NAotbmFpY3MjMzI3NDIjR3lwc3VtIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjc0Ci1uYWljcyMzMjc5I090aGVyIE5vbm1ldGFsbGljIE1pbmVyYWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyNwotbmFpY3MjMzI3OTEjQWJyYXNpdmUgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMyNzkKLW5haWNzIzMyNzk5I0FsbCBPdGhlciBOb25tZXRhbGxpYyBNaW5lcmFsIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjc5Ci1uYWljcyMzMjc5OTEjQ3V0IFN0b25lIGFuZCBTdG9uZSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzI3OTkKLW5haWNzIzMyNzk5MiNHcm91bmQgb3IgVHJlYXRlZCBNaW5lcmFsIGFuZCBFYXJ0aCBNYW51ZmFjdHVyaW5nIzMyNzk5Ci1uYWljcyMzMjc5OTMjTWluZXJhbCBXb29sIE1hbnVmYWN0dXJpbmcjMzI3OTkKLW5haWNzIzMyNzk5OSNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBOb25tZXRhbGxpYyBNaW5lcmFsIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMjc5OQotbmFpY3MjMzMjTWFudWZhY3R1cmluZyMzMwotbmFpY3MjMzMxI1ByaW1hcnkgTWV0YWwgTWFudWZhY3R1cmluZyMzMwotbmFpY3MjMzMxMSNJcm9uIGFuZCBTdGVlbCBNaWxscyBhbmQgRmVycm9hbGxveSBNYW51ZmFjdHVyaW5nIzMzMQotbmFpY3MjMzMxMTEjSXJvbiBhbmQgU3RlZWwgTWlsbHMgYW5kIEZlcnJvYWxsb3kgTWFudWZhY3R1cmluZyMzMzExCi1uYWljcyMzMzExMTEjSXJvbiBhbmQgU3RlZWwgTWlsbHMjMzMxMTEKLW5haWNzIzMzMTExMiNFbGVjdHJvbWV0YWxsdXJnaWNhbCBGZXJyb2FsbG95IFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMzExMQotbmFpY3MjMzMxMiNTdGVlbCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcgZnJvbSBQdXJjaGFzZWQgU3RlZWwjMzMxCi1uYWljcyMzMzEyMSNJcm9uIGFuZCBTdGVlbCBQaXBlIGFuZCBUdWJlIE1hbnVmYWN0dXJpbmcgZnJvbSBQdXJjaGFzZWQgU3RlZWwjMzMxMgotbmFpY3MjMzMxMjIjUm9sbGluZyBhbmQgRHJhd2luZyBvZiBQdXJjaGFzZWQgU3RlZWwjMzMxMgotbmFpY3MjMzMxMjIxI1JvbGxlZCBTdGVlbCBTaGFwZSBNYW51ZmFjdHVyaW5nIzMzMTIyCi1uYWljcyMzMzEyMjIjU3RlZWwgV2lyZSBEcmF3aW5nIzMzMTIyCi1uYWljcyMzMzEzI0FsdW1pbmEgYW5kIEFsdW1pbnVtIFByb2R1Y3Rpb24gYW5kIFByb2Nlc3NpbmcjMzMxCi1uYWljcyMzMzEzMSNBbHVtaW5hIGFuZCBBbHVtaW51bSBQcm9kdWN0aW9uIGFuZCBQcm9jZXNzaW5nIzMzMTMKLW5haWNzIzMzMTMxMSNBbHVtaW5hIFJlZmluaW5nIzMzMTMxCi1uYWljcyMzMzEzMTIjUHJpbWFyeSBBbHVtaW51bSBQcm9kdWN0aW9uIzMzMTMxCi1uYWljcyMzMzEzMTQjU2Vjb25kYXJ5IFNtZWx0aW5nIGFuZCBBbGxveWluZyBvZiBBbHVtaW51bSMzMzEzMQotbmFpY3MjMzMxMzE1I0FsdW1pbnVtIFNoZWV0LCBQbGF0ZSwgYW5kIEZvaWwgTWFudWZhY3R1cmluZyMzMzEzMQotbmFpY3MjMzMxMzE2I0FsdW1pbnVtIEV4dHJ1ZGVkIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMzEzMQotbmFpY3MjMzMxMzE5I090aGVyIEFsdW1pbnVtIFJvbGxpbmcgYW5kIERyYXdpbmcjMzMxMzEKLW5haWNzIzMzMTQjTm9uZmVycm91cyBNZXRhbCAoZXhjZXB0IEFsdW1pbnVtKSBQcm9kdWN0aW9uIGFuZCBQcm9jZXNzaW5nIzMzMQotbmFpY3MjMzMxNDEjTm9uZmVycm91cyBNZXRhbCAoZXhjZXB0IEFsdW1pbnVtKSBTbWVsdGluZyBhbmQgUmVmaW5pbmcjMzMxNAotbmFpY3MjMzMxNDExI1ByaW1hcnkgU21lbHRpbmcgYW5kIFJlZmluaW5nIG9mIENvcHBlciMzMzE0MQotbmFpY3MjMzMxNDE5I1ByaW1hcnkgU21lbHRpbmcgYW5kIFJlZmluaW5nIG9mIE5vbmZlcnJvdXMgTWV0YWwgKGV4Y2VwdCBDb3BwZXIgYW5kIEFsdW1pbnVtKSMzMzE0MQotbmFpY3MjMzMxNDIjQ29wcGVyIFJvbGxpbmcsIERyYXdpbmcsIEV4dHJ1ZGluZywgYW5kIEFsbG95aW5nIzMzMTQKLW5haWNzIzMzMTQyMSNDb3BwZXIgUm9sbGluZywgRHJhd2luZywgYW5kIEV4dHJ1ZGluZyMzMzE0MgotbmFpY3MjMzMxNDIyI0NvcHBlciBXaXJlIChleGNlcHQgTWVjaGFuaWNhbCkgRHJhd2luZyMzMzE0MgotbmFpY3MjMzMxNDIzI1NlY29uZGFyeSBTbWVsdGluZywgUmVmaW5pbmcsIGFuZCBBbGxveWluZyBvZiBDb3BwZXIjMzMxNDIKLW5haWNzIzMzMTQ5I05vbmZlcnJvdXMgTWV0YWwgKGV4Y2VwdCBDb3BwZXIgYW5kIEFsdW1pbnVtKSBSb2xsaW5nLCBEcmF3aW5nLCBFeHRydWRpbmcsIGFuZCBBbGxveWluZyMzMzE0Ci1uYWljcyMzMzE0OTEjTm9uZmVycm91cyBNZXRhbCAoZXhjZXB0IENvcHBlciBhbmQgQWx1bWludW0pIFJvbGxpbmcsIERyYXdpbmcsIGFuZCBFeHRydWRpbmcjMzMxNDkKLW5haWNzIzMzMTQ5MiNTZWNvbmRhcnkgU21lbHRpbmcsIFJlZmluaW5nLCBhbmQgQWxsb3lpbmcgb2YgTm9uZmVycm91cyBNZXRhbCAoZXhjZXB0IENvcHBlciBhbmQgQWx1bWludW0pIzMzMTQ5Ci1uYWljcyMzMzE1I0ZvdW5kcmllcyMzMzEKLW5haWNzIzMzMTUxI0ZlcnJvdXMgTWV0YWwgRm91bmRyaWVzIzMzMTUKLW5haWNzIzMzMTUxMSNJcm9uIEZvdW5kcmllcyMzMzE1MQotbmFpY3MjMzMxNTEyI1N0ZWVsIEludmVzdG1lbnQgRm91bmRyaWVzIzMzMTUxCi1uYWljcyMzMzE1MTMjU3RlZWwgRm91bmRyaWVzIChleGNlcHQgSW52ZXN0bWVudCkjMzMxNTEKLW5haWNzIzMzMTUyI05vbmZlcnJvdXMgTWV0YWwgRm91bmRyaWVzIzMzMTUKLW5haWNzIzMzMTUyMSNBbHVtaW51bSBEaWUtQ2FzdGluZyBGb3VuZHJpZXMjMzMxNTIKLW5haWNzIzMzMTUyMiNOb25mZXJyb3VzIChleGNlcHQgQWx1bWludW0pIERpZS1DYXN0aW5nIEZvdW5kcmllcyMzMzE1MgotbmFpY3MjMzMxNTI0I0FsdW1pbnVtIEZvdW5kcmllcyAoZXhjZXB0IERpZS1DYXN0aW5nKSMzMzE1MgotbmFpY3MjMzMxNTI1I0NvcHBlciBGb3VuZHJpZXMgKGV4Y2VwdCBEaWUtQ2FzdGluZykjMzMxNTIKLW5haWNzIzMzMTUyOCNPdGhlciBOb25mZXJyb3VzIEZvdW5kcmllcyAoZXhjZXB0IERpZS1DYXN0aW5nKSMzMzE1MgotbmFpY3MjMzMyI0ZhYnJpY2F0ZWQgTWV0YWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzCi1uYWljcyMzMzIxI0ZvcmdpbmcgYW5kIFN0YW1waW5nIzMzMgotbmFpY3MjMzMyMTEjRm9yZ2luZyBhbmQgU3RhbXBpbmcjMzMyMQotbmFpY3MjMzMyMTExI0lyb24gYW5kIFN0ZWVsIEZvcmdpbmcjMzMyMTEKLW5haWNzIzMzMjExMiNOb25mZXJyb3VzIEZvcmdpbmcjMzMyMTEKLW5haWNzIzMzMjExNCNDdXN0b20gUm9sbCBGb3JtaW5nIzMzMjExCi1uYWljcyMzMzIxMTUjQ3Jvd24gYW5kIENsb3N1cmUgTWFudWZhY3R1cmluZyMzMzIxMQotbmFpY3MjMzMyMTE2I01ldGFsIFN0YW1waW5nIzMzMjExCi1uYWljcyMzMzIxMTcjUG93ZGVyIE1ldGFsbHVyZ3kgUGFydCBNYW51ZmFjdHVyaW5nIzMzMjExCi1uYWljcyMzMzIyI0N1dGxlcnkgYW5kIEhhbmR0b29sIE1hbnVmYWN0dXJpbmcjMzMyCi1uYWljcyMzMzIyMSNDdXRsZXJ5IGFuZCBIYW5kdG9vbCBNYW51ZmFjdHVyaW5nIzMzMjIKLW5haWNzIzMzMjIxMSNDdXRsZXJ5IGFuZCBGbGF0d2FyZSAoZXhjZXB0IFByZWNpb3VzKSBNYW51ZmFjdHVyaW5nIzMzMjIxCi1uYWljcyMzMzIyMTIjSGFuZCBhbmQgRWRnZSBUb29sIE1hbnVmYWN0dXJpbmcjMzMyMjEKLW5haWNzIzMzMjIxMyNTYXcgQmxhZGUgYW5kIEhhbmRzYXcgTWFudWZhY3R1cmluZyMzMzIyMQotbmFpY3MjMzMyMjE0I0tpdGNoZW4gVXRlbnNpbCwgUG90LCBhbmQgUGFuIE1hbnVmYWN0dXJpbmcjMzMyMjEKLW5haWNzIzMzMjMjQXJjaGl0ZWN0dXJhbCBhbmQgU3RydWN0dXJhbCBNZXRhbHMgTWFudWZhY3R1cmluZyMzMzIKLW5haWNzIzMzMjMxI1BsYXRlIFdvcmsgYW5kIEZhYnJpY2F0ZWQgU3RydWN0dXJhbCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzMyMwotbmFpY3MjMzMyMzExI1ByZWZhYnJpY2F0ZWQgTWV0YWwgQnVpbGRpbmcgYW5kIENvbXBvbmVudCBNYW51ZmFjdHVyaW5nIzMzMjMxCi1uYWljcyMzMzIzMTIjRmFicmljYXRlZCBTdHJ1Y3R1cmFsIE1ldGFsIE1hbnVmYWN0dXJpbmcjMzMyMzEKLW5haWNzIzMzMjMxMyNQbGF0ZSBXb3JrIE1hbnVmYWN0dXJpbmcjMzMyMzEKLW5haWNzIzMzMjMyI09ybmFtZW50YWwgYW5kIEFyY2hpdGVjdHVyYWwgTWV0YWwgUHJvZHVjdHMgTWFudWZhY3R1cmluZyMzMzIzCi1uYWljcyMzMzIzMjEjTWV0YWwgV2luZG93IGFuZCBEb29yIE1hbnVmYWN0dXJpbmcjMzMyMzIKLW5haWNzIzMzMjMyMiNTaGVldCBNZXRhbCBXb3JrIE1hbnVmYWN0dXJpbmcjMzMyMzIKLW5haWNzIzMzMjMyMyNPcm5hbWVudGFsIGFuZCBBcmNoaXRlY3R1cmFsIE1ldGFsIFdvcmsgTWFudWZhY3R1cmluZyMzMzIzMgotbmFpY3MjMzMyNCNCb2lsZXIsIFRhbmssIGFuZCBTaGlwcGluZyBDb250YWluZXIgTWFudWZhY3R1cmluZyMzMzIKLW5haWNzIzMzMjQxI1Bvd2VyIEJvaWxlciBhbmQgSGVhdCBFeGNoYW5nZXIgTWFudWZhY3R1cmluZyMzMzI0Ci1uYWljcyMzMzI0MiNNZXRhbCBUYW5rIChIZWF2eSBHYXVnZSkgTWFudWZhY3R1cmluZyMzMzI0Ci1uYWljcyMzMzI0MyNNZXRhbCBDYW4sIEJveCwgYW5kIE90aGVyIE1ldGFsIENvbnRhaW5lciAoTGlnaHQgR2F1Z2UpIE1hbnVmYWN0dXJpbmcjMzMyNAotbmFpY3MjMzMyNDMxI01ldGFsIENhbiBNYW51ZmFjdHVyaW5nIzMzMjQzCi1uYWljcyMzMzI0MzkjT3RoZXIgTWV0YWwgQ29udGFpbmVyIE1hbnVmYWN0dXJpbmcjMzMyNDMKLW5haWNzIzMzMjUjSGFyZHdhcmUgTWFudWZhY3R1cmluZyMzMzIKLW5haWNzIzMzMjUxI0hhcmR3YXJlIE1hbnVmYWN0dXJpbmcjMzMyNQotbmFpY3MjMzMyNiNTcHJpbmcgYW5kIFdpcmUgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMgotbmFpY3MjMzMyNjEjU3ByaW5nIGFuZCBXaXJlIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMzI2Ci1uYWljcyMzMzI2MTEjU3ByaW5nIChIZWF2eSBHYXVnZSkgTWFudWZhY3R1cmluZyMzMzI2MQotbmFpY3MjMzMyNjEyI1NwcmluZyAoTGlnaHQgR2F1Z2UpIE1hbnVmYWN0dXJpbmcjMzMyNjEKLW5haWNzIzMzMjYxOCNPdGhlciBGYWJyaWNhdGVkIFdpcmUgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMjYxCi1uYWljcyMzMzI3I01hY2hpbmUgU2hvcHM7IFR1cm5lZCBQcm9kdWN0OyBhbmQgU2NyZXcsIE51dCwgYW5kIEJvbHQgTWFudWZhY3R1cmluZyMzMzIKLW5haWNzIzMzMjcxI01hY2hpbmUgU2hvcHMjMzMyNwotbmFpY3MjMzMyNzIjVHVybmVkIFByb2R1Y3QgYW5kIFNjcmV3LCBOdXQsIGFuZCBCb2x0IE1hbnVmYWN0dXJpbmcjMzMyNwotbmFpY3MjMzMyNzIxI1ByZWNpc2lvbiBUdXJuZWQgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMjcyCi1uYWljcyMzMzI3MjIjQm9sdCwgTnV0LCBTY3JldywgUml2ZXQsIGFuZCBXYXNoZXIgTWFudWZhY3R1cmluZyMzMzI3MgotbmFpY3MjMzMyOCNDb2F0aW5nLCBFbmdyYXZpbmcsIEhlYXQgVHJlYXRpbmcsIGFuZCBBbGxpZWQgQWN0aXZpdGllcyMzMzIKLW5haWNzIzMzMjgxI0NvYXRpbmcsIEVuZ3JhdmluZywgSGVhdCBUcmVhdGluZywgYW5kIEFsbGllZCBBY3Rpdml0aWVzIzMzMjgKLW5haWNzIzMzMjgxMSNNZXRhbCBIZWF0IFRyZWF0aW5nIzMzMjgxCi1uYWljcyMzMzI4MTIjTWV0YWwgQ29hdGluZywgRW5ncmF2aW5nIChleGNlcHQgSmV3ZWxyeSBhbmQgU2lsdmVyd2FyZSksIGFuZCBBbGxpZWQgU2VydmljZXMgdG8gTWFudWZhY3R1cmVycyMzMzI4MQotbmFpY3MjMzMyODEzI0VsZWN0cm9wbGF0aW5nLCBQbGF0aW5nLCBQb2xpc2hpbmcsIEFub2RpemluZywgYW5kIENvbG9yaW5nIzMzMjgxCi1uYWljcyMzMzI5I090aGVyIEZhYnJpY2F0ZWQgTWV0YWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMgotbmFpY3MjMzMyOTEjTWV0YWwgVmFsdmUgTWFudWZhY3R1cmluZyMzMzI5Ci1uYWljcyMzMzI5MTEjSW5kdXN0cmlhbCBWYWx2ZSBNYW51ZmFjdHVyaW5nIzMzMjkxCi1uYWljcyMzMzI5MTIjRmx1aWQgUG93ZXIgVmFsdmUgYW5kIEhvc2UgRml0dGluZyBNYW51ZmFjdHVyaW5nIzMzMjkxCi1uYWljcyMzMzI5MTMjUGx1bWJpbmcgRml4dHVyZSBGaXR0aW5nIGFuZCBUcmltIE1hbnVmYWN0dXJpbmcjMzMyOTEKLW5haWNzIzMzMjkxOSNPdGhlciBNZXRhbCBWYWx2ZSBhbmQgUGlwZSBGaXR0aW5nIE1hbnVmYWN0dXJpbmcjMzMyOTEKLW5haWNzIzMzMjk5I0FsbCBPdGhlciBGYWJyaWNhdGVkIE1ldGFsIFByb2R1Y3QgTWFudWZhY3R1cmluZyMzMzI5Ci1uYWljcyMzMzI5OTEjQmFsbCBhbmQgUm9sbGVyIEJlYXJpbmcgTWFudWZhY3R1cmluZyMzMzI5OQotbmFpY3MjMzMyOTkyI1NtYWxsIEFybXMgQW1tdW5pdGlvbiBNYW51ZmFjdHVyaW5nIzMzMjk5Ci1uYWljcyMzMzI5OTMjQW1tdW5pdGlvbiAoZXhjZXB0IFNtYWxsIEFybXMpIE1hbnVmYWN0dXJpbmcjMzMyOTkKLW5haWNzIzMzMjk5NCNTbWFsbCBBcm1zIE1hbnVmYWN0dXJpbmcjMzMyOTkKLW5haWNzIzMzMjk5NSNPdGhlciBPcmRuYW5jZSBhbmQgQWNjZXNzb3JpZXMgTWFudWZhY3R1cmluZyMzMzI5OQotbmFpY3MjMzMyOTk2I0ZhYnJpY2F0ZWQgUGlwZSBhbmQgUGlwZSBGaXR0aW5nIE1hbnVmYWN0dXJpbmcjMzMyOTkKLW5haWNzIzMzMjk5NyNJbmR1c3RyaWFsIFBhdHRlcm4gTWFudWZhY3R1cmluZyMzMzI5OQotbmFpY3MjMzMyOTk4I0VuYW1lbGVkIElyb24gYW5kIE1ldGFsIFNhbml0YXJ5IFdhcmUgTWFudWZhY3R1cmluZyMzMzI5OQotbmFpY3MjMzMyOTk5I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIEZhYnJpY2F0ZWQgTWV0YWwgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzMjk5Ci1uYWljcyMzMzMjTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMKLW5haWNzIzMzMzEjQWdyaWN1bHR1cmUsIENvbnN0cnVjdGlvbiwgYW5kIE1pbmluZyBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMKLW5haWNzIzMzMzExI0FncmljdWx0dXJhbCBJbXBsZW1lbnQgTWFudWZhY3R1cmluZyMzMzMxCi1uYWljcyMzMzMxMTEjRmFybSBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzExCi1uYWljcyMzMzMxMTIjTGF3biBhbmQgR2FyZGVuIFRyYWN0b3IgYW5kIEhvbWUgTGF3biBhbmQgR2FyZGVuIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzExCi1uYWljcyMzMzMxMiNDb25zdHJ1Y3Rpb24gTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMQotbmFpY3MjMzMzMTMjTWluaW5nIGFuZCBPaWwgYW5kIEdhcyBGaWVsZCBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMxCi1uYWljcyMzMzMxMzEjTWluaW5nIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzMzMTMKLW5haWNzIzMzMzEzMiNPaWwgYW5kIEdhcyBGaWVsZCBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzEzCi1uYWljcyMzMzMyI0luZHVzdHJpYWwgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzCi1uYWljcyMzMzMyMSNTYXdtaWxsIGFuZCBXb29kd29ya2luZyBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMyCi1uYWljcyMzMzMyMiNQbGFzdGljcyBhbmQgUnViYmVyIEluZHVzdHJ5IE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzIKLW5haWNzIzMzMzI5I090aGVyIEluZHVzdHJpYWwgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMgotbmFpY3MjMzMzMjkxI1BhcGVyIEluZHVzdHJ5IE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzI5Ci1uYWljcyMzMzMyOTIjVGV4dGlsZSBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMyOQotbmFpY3MjMzMzMjkzI1ByaW50aW5nIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzMzMjkKLW5haWNzIzMzMzI5NCNGb29kIFByb2R1Y3QgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMjkKLW5haWNzIzMzMzI5NSNTZW1pY29uZHVjdG9yIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzI5Ci1uYWljcyMzMzMyOTgjQWxsIE90aGVyIEluZHVzdHJpYWwgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMjkKLW5haWNzIzMzMzMjQ29tbWVyY2lhbCBhbmQgU2VydmljZSBJbmR1c3RyeSBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMKLW5haWNzIzMzMzMxI0NvbW1lcmNpYWwgYW5kIFNlcnZpY2UgSW5kdXN0cnkgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMwotbmFpY3MjMzMzMzExI0F1dG9tYXRpYyBWZW5kaW5nIE1hY2hpbmUgTWFudWZhY3R1cmluZyMzMzMzMQotbmFpY3MjMzMzMzEyI0NvbW1lcmNpYWwgTGF1bmRyeSwgRHJ5Y2xlYW5pbmcsIGFuZCBQcmVzc2luZyBNYWNoaW5lIE1hbnVmYWN0dXJpbmcjMzMzMzEKLW5haWNzIzMzMzMxMyNPZmZpY2UgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzMzEKLW5haWNzIzMzMzMxNCNPcHRpY2FsIEluc3RydW1lbnQgYW5kIExlbnMgTWFudWZhY3R1cmluZyMzMzMzMQotbmFpY3MjMzMzMzE1I1Bob3RvZ3JhcGhpYyBhbmQgUGhvdG9jb3B5aW5nIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzMxCi1uYWljcyMzMzMzMTkjT3RoZXIgQ29tbWVyY2lhbCBhbmQgU2VydmljZSBJbmR1c3RyeSBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzMzMQotbmFpY3MjMzMzNCNWZW50aWxhdGlvbiwgSGVhdGluZywgQWlyLUNvbmRpdGlvbmluZywgYW5kIENvbW1lcmNpYWwgUmVmcmlnZXJhdGlvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzMKLW5haWNzIzMzMzQxI1ZlbnRpbGF0aW9uLCBIZWF0aW5nLCBBaXItQ29uZGl0aW9uaW5nLCBhbmQgQ29tbWVyY2lhbCBSZWZyaWdlcmF0aW9uIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzQKLW5haWNzIzMzMzQxMSNBaXIgUHVyaWZpY2F0aW9uIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzQxCi1uYWljcyMzMzM0MTIjSW5kdXN0cmlhbCBhbmQgQ29tbWVyY2lhbCBGYW4gYW5kIEJsb3dlciBNYW51ZmFjdHVyaW5nIzMzMzQxCi1uYWljcyMzMzM0MTQjSGVhdGluZyBFcXVpcG1lbnQgKGV4Y2VwdCBXYXJtIEFpciBGdXJuYWNlcykgTWFudWZhY3R1cmluZyMzMzM0MQotbmFpY3MjMzMzNDE1I0Fpci1Db25kaXRpb25pbmcgYW5kIFdhcm0gQWlyIEhlYXRpbmcgRXF1aXBtZW50IGFuZCBDb21tZXJjaWFsIGFuZCBJbmR1c3RyaWFsIFJlZnJpZ2VyYXRpb24gRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzMzNDEKLW5haWNzIzMzMzUjTWV0YWx3b3JraW5nIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMwotbmFpY3MjMzMzNTEjTWV0YWx3b3JraW5nIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzUKLW5haWNzIzMzMzUxMSNJbmR1c3RyaWFsIE1vbGQgTWFudWZhY3R1cmluZyMzMzM1MQotbmFpY3MjMzMzNTEyI01hY2hpbmUgVG9vbCAoTWV0YWwgQ3V0dGluZyBUeXBlcykgTWFudWZhY3R1cmluZyMzMzM1MQotbmFpY3MjMzMzNTEzI01hY2hpbmUgVG9vbCAoTWV0YWwgRm9ybWluZyBUeXBlcykgTWFudWZhY3R1cmluZyMzMzM1MQotbmFpY3MjMzMzNTE0I1NwZWNpYWwgRGllIGFuZCBUb29sLCBEaWUgU2V0LCBKaWcsIGFuZCBGaXh0dXJlIE1hbnVmYWN0dXJpbmcjMzMzNTEKLW5haWNzIzMzMzUxNSNDdXR0aW5nIFRvb2wgYW5kIE1hY2hpbmUgVG9vbCBBY2Nlc3NvcnkgTWFudWZhY3R1cmluZyMzMzM1MQotbmFpY3MjMzMzNTE2I1JvbGxpbmcgTWlsbCBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzMzUxCi1uYWljcyMzMzM1MTgjT3RoZXIgTWV0YWx3b3JraW5nIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzUxCi1uYWljcyMzMzM2I0VuZ2luZSwgVHVyYmluZSwgYW5kIFBvd2VyIFRyYW5zbWlzc2lvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzMKLW5haWNzIzMzMzYxI0VuZ2luZSwgVHVyYmluZSwgYW5kIFBvd2VyIFRyYW5zbWlzc2lvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM2Ci1uYWljcyMzMzM2MTEjVHVyYmluZSBhbmQgVHVyYmluZSBHZW5lcmF0b3IgU2V0IFVuaXRzIE1hbnVmYWN0dXJpbmcjMzMzNjEKLW5haWNzIzMzMzYxMiNTcGVlZCBDaGFuZ2VyLCBJbmR1c3RyaWFsIEhpZ2gtU3BlZWQgRHJpdmUsIGFuZCBHZWFyIE1hbnVmYWN0dXJpbmcjMzMzNjEKLW5haWNzIzMzMzYxMyNNZWNoYW5pY2FsIFBvd2VyIFRyYW5zbWlzc2lvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM2MQotbmFpY3MjMzMzNjE4I090aGVyIEVuZ2luZSBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM2MQotbmFpY3MjMzMzOSNPdGhlciBHZW5lcmFsIFB1cnBvc2UgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzCi1uYWljcyMzMzM5MSNQdW1wIGFuZCBDb21wcmVzc29yIE1hbnVmYWN0dXJpbmcjMzMzOQotbmFpY3MjMzMzOTExI1B1bXAgYW5kIFB1bXBpbmcgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzMzOTEKLW5haWNzIzMzMzkxMiNBaXIgYW5kIEdhcyBDb21wcmVzc29yIE1hbnVmYWN0dXJpbmcjMzMzOTEKLW5haWNzIzMzMzkxMyNNZWFzdXJpbmcgYW5kIERpc3BlbnNpbmcgUHVtcCBNYW51ZmFjdHVyaW5nIzMzMzkxCi1uYWljcyMzMzM5MiNNYXRlcmlhbCBIYW5kbGluZyBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM5Ci1uYWljcyMzMzM5MjEjRWxldmF0b3IgYW5kIE1vdmluZyBTdGFpcndheSBNYW51ZmFjdHVyaW5nIzMzMzkyCi1uYWljcyMzMzM5MjIjQ29udmV5b3IgYW5kIENvbnZleWluZyBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM5MgotbmFpY3MjMzMzOTIzI092ZXJoZWFkIFRyYXZlbGluZyBDcmFuZSwgSG9pc3QsIGFuZCBNb25vcmFpbCBTeXN0ZW0gTWFudWZhY3R1cmluZyMzMzM5MgotbmFpY3MjMzMzOTI0I0luZHVzdHJpYWwgVHJ1Y2ssIFRyYWN0b3IsIFRyYWlsZXIsIGFuZCBTdGFja2VyIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzkyCi1uYWljcyMzMzM5OSNBbGwgT3RoZXIgR2VuZXJhbCBQdXJwb3NlIE1hY2hpbmVyeSBNYW51ZmFjdHVyaW5nIzMzMzkKLW5haWNzIzMzMzk5MSNQb3dlci1Ecml2ZW4gSGFuZHRvb2wgTWFudWZhY3R1cmluZyMzMzM5OQotbmFpY3MjMzMzOTkyI1dlbGRpbmcgYW5kIFNvbGRlcmluZyBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzM5OQotbmFpY3MjMzMzOTkzI1BhY2thZ2luZyBNYWNoaW5lcnkgTWFudWZhY3R1cmluZyMzMzM5OQotbmFpY3MjMzMzOTk0I0luZHVzdHJpYWwgUHJvY2VzcyBGdXJuYWNlIGFuZCBPdmVuIE1hbnVmYWN0dXJpbmcjMzMzOTkKLW5haWNzIzMzMzk5NSNGbHVpZCBQb3dlciBDeWxpbmRlciBhbmQgQWN0dWF0b3IgTWFudWZhY3R1cmluZyMzMzM5OQotbmFpY3MjMzMzOTk2I0ZsdWlkIFBvd2VyIFB1bXAgYW5kIE1vdG9yIE1hbnVmYWN0dXJpbmcjMzMzOTkKLW5haWNzIzMzMzk5NyNTY2FsZSBhbmQgQmFsYW5jZSAoZXhjZXB0IExhYm9yYXRvcnkpIE1hbnVmYWN0dXJpbmcjMzMzOTkKLW5haWNzIzMzMzk5OSNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBHZW5lcmFsIFB1cnBvc2UgTWFjaGluZXJ5IE1hbnVmYWN0dXJpbmcjMzMzOTkKLW5haWNzIzMzNCNDb21wdXRlciBhbmQgRWxlY3Ryb25pYyBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzMKLW5haWNzIzMzNDEjQ29tcHV0ZXIgYW5kIFBlcmlwaGVyYWwgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0Ci1uYWljcyMzMzQxMSNDb21wdXRlciBhbmQgUGVyaXBoZXJhbCBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzQxCi1uYWljcyMzMzQxMTEjRWxlY3Ryb25pYyBDb21wdXRlciBNYW51ZmFjdHVyaW5nIzMzNDExCi1uYWljcyMzMzQxMTIjQ29tcHV0ZXIgU3RvcmFnZSBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzQxMQotbmFpY3MjMzM0MTEzI0NvbXB1dGVyIFRlcm1pbmFsIE1hbnVmYWN0dXJpbmcjMzM0MTEKLW5haWNzIzMzNDExOSNPdGhlciBDb21wdXRlciBQZXJpcGhlcmFsIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNDExCi1uYWljcyMzMzQyI0NvbW11bmljYXRpb25zIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNAotbmFpY3MjMzM0MjEjVGVsZXBob25lIEFwcGFyYXR1cyBNYW51ZmFjdHVyaW5nIzMzNDIKLW5haWNzIzMzNDIyI1JhZGlvIGFuZCBUZWxldmlzaW9uIEJyb2FkY2FzdGluZyBhbmQgV2lyZWxlc3MgQ29tbXVuaWNhdGlvbnMgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0MgotbmFpY3MjMzM0MjkjT3RoZXIgQ29tbXVuaWNhdGlvbnMgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0MgotbmFpY3MjMzM0MyNBdWRpbyBhbmQgVmlkZW8gRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0Ci1uYWljcyMzMzQzMSNBdWRpbyBhbmQgVmlkZW8gRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM0MwotbmFpY3MjMzM0NCNTZW1pY29uZHVjdG9yIGFuZCBPdGhlciBFbGVjdHJvbmljIENvbXBvbmVudCBNYW51ZmFjdHVyaW5nIzMzNAotbmFpY3MjMzM0NDEjU2VtaWNvbmR1Y3RvciBhbmQgT3RoZXIgRWxlY3Ryb25pYyBDb21wb25lbnQgTWFudWZhY3R1cmluZyMzMzQ0Ci1uYWljcyMzMzQ0MTEjRWxlY3Ryb24gVHViZSBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTIjQmFyZSBQcmludGVkIENpcmN1aXQgQm9hcmQgTWFudWZhY3R1cmluZyMzMzQ0MQotbmFpY3MjMzM0NDEzI1NlbWljb25kdWN0b3IgYW5kIFJlbGF0ZWQgRGV2aWNlIE1hbnVmYWN0dXJpbmcjMzM0NDEKLW5haWNzIzMzNDQxNCNFbGVjdHJvbmljIENhcGFjaXRvciBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTUjRWxlY3Ryb25pYyBSZXNpc3RvciBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTYjRWxlY3Ryb25pYyBDb2lsLCBUcmFuc2Zvcm1lciwgYW5kIE90aGVyIEluZHVjdG9yIE1hbnVmYWN0dXJpbmcjMzM0NDEKLW5haWNzIzMzNDQxNyNFbGVjdHJvbmljIENvbm5lY3RvciBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTgjUHJpbnRlZCBDaXJjdWl0IEFzc2VtYmx5IChFbGVjdHJvbmljIEFzc2VtYmx5KSBNYW51ZmFjdHVyaW5nIzMzNDQxCi1uYWljcyMzMzQ0MTkjT3RoZXIgRWxlY3Ryb25pYyBDb21wb25lbnQgTWFudWZhY3R1cmluZyMzMzQ0MQotbmFpY3MjMzM0NSNOYXZpZ2F0aW9uYWwsIE1lYXN1cmluZywgRWxlY3Ryb21lZGljYWwsIGFuZCBDb250cm9sIEluc3RydW1lbnRzIE1hbnVmYWN0dXJpbmcjMzM0Ci1uYWljcyMzMzQ1MSNOYXZpZ2F0aW9uYWwsIE1lYXN1cmluZywgRWxlY3Ryb21lZGljYWwsIGFuZCBDb250cm9sIEluc3RydW1lbnRzIE1hbnVmYWN0dXJpbmcjMzM0NQotbmFpY3MjMzM0NTEwI0VsZWN0cm9tZWRpY2FsIGFuZCBFbGVjdHJvdGhlcmFwZXV0aWMgQXBwYXJhdHVzIE1hbnVmYWN0dXJpbmcjMzM0NTEKLW5haWNzIzMzNDUxMSNTZWFyY2gsIERldGVjdGlvbiwgTmF2aWdhdGlvbiwgR3VpZGFuY2UsIEFlcm9uYXV0aWNhbCwgYW5kIE5hdXRpY2FsIFN5c3RlbSBhbmQgSW5zdHJ1bWVudCBNYW51ZmFjdHVyaW5nIzMzNDUxCi1uYWljcyMzMzQ1MTIjQXV0b21hdGljIEVudmlyb25tZW50YWwgQ29udHJvbCBNYW51ZmFjdHVyaW5nIGZvciBSZXNpZGVudGlhbCwgQ29tbWVyY2lhbCwgYW5kIEFwcGxpYW5jZSBVc2UjMzM0NTEKLW5haWNzIzMzNDUxMyNJbnN0cnVtZW50cyBhbmQgUmVsYXRlZCBQcm9kdWN0cyBNYW51ZmFjdHVyaW5nIGZvciBNZWFzdXJpbmcsIERpc3BsYXlpbmcsIGFuZCBDb250cm9sbGluZyBJbmR1c3RyaWFsIFByb2Nlc3MgVmFyaWFibGVzIzMzNDUxCi1uYWljcyMzMzQ1MTQjVG90YWxpemluZyBGbHVpZCBNZXRlciBhbmQgQ291bnRpbmcgRGV2aWNlIE1hbnVmYWN0dXJpbmcjMzM0NTEKLW5haWNzIzMzNDUxNSNJbnN0cnVtZW50IE1hbnVmYWN0dXJpbmcgZm9yIE1lYXN1cmluZyBhbmQgVGVzdGluZyBFbGVjdHJpY2l0eSBhbmQgRWxlY3RyaWNhbCBTaWduYWxzIzMzNDUxCi1uYWljcyMzMzQ1MTYjQW5hbHl0aWNhbCBMYWJvcmF0b3J5IEluc3RydW1lbnQgTWFudWZhY3R1cmluZyMzMzQ1MQotbmFpY3MjMzM0NTE3I0lycmFkaWF0aW9uIEFwcGFyYXR1cyBNYW51ZmFjdHVyaW5nIzMzNDUxCi1uYWljcyMzMzQ1MTgjV2F0Y2gsIENsb2NrLCBhbmQgUGFydCBNYW51ZmFjdHVyaW5nIzMzNDUxCi1uYWljcyMzMzQ1MTkjT3RoZXIgTWVhc3VyaW5nIGFuZCBDb250cm9sbGluZyBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzQ1MQotbmFpY3MjMzM0NiNNYW51ZmFjdHVyaW5nIGFuZCBSZXByb2R1Y2luZyBNYWduZXRpYyBhbmQgT3B0aWNhbCBNZWRpYSMzMzQKLW5haWNzIzMzNDYxI01hbnVmYWN0dXJpbmcgYW5kIFJlcHJvZHVjaW5nIE1hZ25ldGljIGFuZCBPcHRpY2FsIE1lZGlhIzMzNDYKLW5haWNzIzMzNDYxMSNTb2Z0d2FyZSBSZXByb2R1Y2luZyMzMzQ2MQotbmFpY3MjMzM0NjEyI1ByZXJlY29yZGVkIENvbXBhY3QgRGlzYyAoZXhjZXB0IFNvZnR3YXJlKSwgVGFwZSwgYW5kIFJlY29yZCBSZXByb2R1Y2luZyMzMzQ2MQotbmFpY3MjMzM0NjEzI01hZ25ldGljIGFuZCBPcHRpY2FsIFJlY29yZGluZyBNZWRpYSBNYW51ZmFjdHVyaW5nIzMzNDYxCi1uYWljcyMzMzUjRWxlY3RyaWNhbCBFcXVpcG1lbnQsIEFwcGxpYW5jZSwgYW5kIENvbXBvbmVudCBNYW51ZmFjdHVyaW5nIzMzCi1uYWljcyMzMzUxI0VsZWN0cmljIExpZ2h0aW5nIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNQotbmFpY3MjMzM1MTEjRWxlY3RyaWMgTGFtcCBCdWxiIGFuZCBQYXJ0IE1hbnVmYWN0dXJpbmcjMzM1MQotbmFpY3MjMzM1MTIjTGlnaHRpbmcgRml4dHVyZSBNYW51ZmFjdHVyaW5nIzMzNTEKLW5haWNzIzMzNTEyMSNSZXNpZGVudGlhbCBFbGVjdHJpYyBMaWdodGluZyBGaXh0dXJlIE1hbnVmYWN0dXJpbmcjMzM1MTIKLW5haWNzIzMzNTEyMiNDb21tZXJjaWFsLCBJbmR1c3RyaWFsLCBhbmQgSW5zdGl0dXRpb25hbCBFbGVjdHJpYyBMaWdodGluZyBGaXh0dXJlIE1hbnVmYWN0dXJpbmcjMzM1MTIKLW5haWNzIzMzNTEyOSNPdGhlciBMaWdodGluZyBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzUxMgotbmFpY3MjMzM1MiNIb3VzZWhvbGQgQXBwbGlhbmNlIE1hbnVmYWN0dXJpbmcjMzM1Ci1uYWljcyMzMzUyMSNTbWFsbCBFbGVjdHJpY2FsIEFwcGxpYW5jZSBNYW51ZmFjdHVyaW5nIzMzNTIKLW5haWNzIzMzNTIxMSNFbGVjdHJpYyBIb3VzZXdhcmVzIGFuZCBIb3VzZWhvbGQgRmFuIE1hbnVmYWN0dXJpbmcjMzM1MjEKLW5haWNzIzMzNTIxMiNIb3VzZWhvbGQgVmFjdXVtIENsZWFuZXIgTWFudWZhY3R1cmluZyMzMzUyMQotbmFpY3MjMzM1MjIjTWFqb3IgQXBwbGlhbmNlIE1hbnVmYWN0dXJpbmcjMzM1MgotbmFpY3MjMzM1MjIxI0hvdXNlaG9sZCBDb29raW5nIEFwcGxpYW5jZSBNYW51ZmFjdHVyaW5nIzMzNTIyCi1uYWljcyMzMzUyMjIjSG91c2Vob2xkIFJlZnJpZ2VyYXRvciBhbmQgSG9tZSBGcmVlemVyIE1hbnVmYWN0dXJpbmcjMzM1MjIKLW5haWNzIzMzNTIyNCNIb3VzZWhvbGQgTGF1bmRyeSBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzUyMgotbmFpY3MjMzM1MjI4I090aGVyIE1ham9yIEhvdXNlaG9sZCBBcHBsaWFuY2UgTWFudWZhY3R1cmluZyMzMzUyMgotbmFpY3MjMzM1MyNFbGVjdHJpY2FsIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNQotbmFpY3MjMzM1MzEjRWxlY3RyaWNhbCBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzUzCi1uYWljcyMzMzUzMTEjUG93ZXIsIERpc3RyaWJ1dGlvbiwgYW5kIFNwZWNpYWx0eSBUcmFuc2Zvcm1lciBNYW51ZmFjdHVyaW5nIzMzNTMxCi1uYWljcyMzMzUzMTIjTW90b3IgYW5kIEdlbmVyYXRvciBNYW51ZmFjdHVyaW5nIzMzNTMxCi1uYWljcyMzMzUzMTMjU3dpdGNoZ2VhciBhbmQgU3dpdGNoYm9hcmQgQXBwYXJhdHVzIE1hbnVmYWN0dXJpbmcjMzM1MzEKLW5haWNzIzMzNTMxNCNSZWxheSBhbmQgSW5kdXN0cmlhbCBDb250cm9sIE1hbnVmYWN0dXJpbmcjMzM1MzEKLW5haWNzIzMzNTkjT3RoZXIgRWxlY3RyaWNhbCBFcXVpcG1lbnQgYW5kIENvbXBvbmVudCBNYW51ZmFjdHVyaW5nIzMzNQotbmFpY3MjMzM1OTEjQmF0dGVyeSBNYW51ZmFjdHVyaW5nIzMzNTkKLW5haWNzIzMzNTkxMSNTdG9yYWdlIEJhdHRlcnkgTWFudWZhY3R1cmluZyMzMzU5MQotbmFpY3MjMzM1OTEyI1ByaW1hcnkgQmF0dGVyeSBNYW51ZmFjdHVyaW5nIzMzNTkxCi1uYWljcyMzMzU5MiNDb21tdW5pY2F0aW9uIGFuZCBFbmVyZ3kgV2lyZSBhbmQgQ2FibGUgTWFudWZhY3R1cmluZyMzMzU5Ci1uYWljcyMzMzU5MjEjRmliZXIgT3B0aWMgQ2FibGUgTWFudWZhY3R1cmluZyMzMzU5MgotbmFpY3MjMzM1OTI5I090aGVyIENvbW11bmljYXRpb24gYW5kIEVuZXJneSBXaXJlIE1hbnVmYWN0dXJpbmcjMzM1OTIKLW5haWNzIzMzNTkzI1dpcmluZyBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzU5Ci1uYWljcyMzMzU5MzEjQ3VycmVudC1DYXJyeWluZyBXaXJpbmcgRGV2aWNlIE1hbnVmYWN0dXJpbmcjMzM1OTMKLW5haWNzIzMzNTkzMiNOb25jdXJyZW50LUNhcnJ5aW5nIFdpcmluZyBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzU5MwotbmFpY3MjMzM1OTkjQWxsIE90aGVyIEVsZWN0cmljYWwgRXF1aXBtZW50IGFuZCBDb21wb25lbnQgTWFudWZhY3R1cmluZyMzMzU5Ci1uYWljcyMzMzU5OTEjQ2FyYm9uIGFuZCBHcmFwaGl0ZSBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzM1OTkKLW5haWNzIzMzNTk5OSNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBFbGVjdHJpY2FsIEVxdWlwbWVudCBhbmQgQ29tcG9uZW50IE1hbnVmYWN0dXJpbmcjMzM1OTkKLW5haWNzIzMzNiNUcmFuc3BvcnRhdGlvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMwotbmFpY3MjMzM2MSNNb3RvciBWZWhpY2xlIE1hbnVmYWN0dXJpbmcjMzM2Ci1uYWljcyMzMzYxMSNBdXRvbW9iaWxlIGFuZCBMaWdodCBEdXR5IE1vdG9yIFZlaGljbGUgTWFudWZhY3R1cmluZyMzMzYxCi1uYWljcyMzMzYxMTEjQXV0b21vYmlsZSBNYW51ZmFjdHVyaW5nIzMzNjExCi1uYWljcyMzMzYxMTIjTGlnaHQgVHJ1Y2sgYW5kIFV0aWxpdHkgVmVoaWNsZSBNYW51ZmFjdHVyaW5nIzMzNjExCi1uYWljcyMzMzYxMiNIZWF2eSBEdXR5IFRydWNrIE1hbnVmYWN0dXJpbmcjMzM2MQotbmFpY3MjMzM2MiNNb3RvciBWZWhpY2xlIEJvZHkgYW5kIFRyYWlsZXIgTWFudWZhY3R1cmluZyMzMzYKLW5haWNzIzMzNjIxI01vdG9yIFZlaGljbGUgQm9keSBhbmQgVHJhaWxlciBNYW51ZmFjdHVyaW5nIzMzNjIKLW5haWNzIzMzNjIxMSNNb3RvciBWZWhpY2xlIEJvZHkgTWFudWZhY3R1cmluZyMzMzYyMQotbmFpY3MjMzM2MjEyI1RydWNrIFRyYWlsZXIgTWFudWZhY3R1cmluZyMzMzYyMQotbmFpY3MjMzM2MjEzI01vdG9yIEhvbWUgTWFudWZhY3R1cmluZyMzMzYyMQotbmFpY3MjMzM2MjE0I1RyYXZlbCBUcmFpbGVyIGFuZCBDYW1wZXIgTWFudWZhY3R1cmluZyMzMzYyMQotbmFpY3MjMzM2MyNNb3RvciBWZWhpY2xlIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2Ci1uYWljcyMzMzYzMSNNb3RvciBWZWhpY2xlIEdhc29saW5lIEVuZ2luZSBhbmQgRW5naW5lIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2MwotbmFpY3MjMzM2MzExI0NhcmJ1cmV0b3IsIFBpc3RvbiwgUGlzdG9uIFJpbmcsIGFuZCBWYWx2ZSBNYW51ZmFjdHVyaW5nIzMzNjMxCi1uYWljcyMzMzYzMTIjR2Fzb2xpbmUgRW5naW5lIGFuZCBFbmdpbmUgUGFydHMgTWFudWZhY3R1cmluZyMzMzYzMQotbmFpY3MjMzM2MzIjTW90b3IgVmVoaWNsZSBFbGVjdHJpY2FsIGFuZCBFbGVjdHJvbmljIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjMyMSNWZWhpY3VsYXIgTGlnaHRpbmcgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM2MzIKLW5haWNzIzMzNjMyMiNPdGhlciBNb3RvciBWZWhpY2xlIEVsZWN0cmljYWwgYW5kIEVsZWN0cm9uaWMgRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM2MzIKLW5haWNzIzMzNjMzI01vdG9yIFZlaGljbGUgU3RlZXJpbmcgYW5kIFN1c3BlbnNpb24gQ29tcG9uZW50cyAoZXhjZXB0IFNwcmluZykgTWFudWZhY3R1cmluZyMzMzYzCi1uYWljcyMzMzYzNCNNb3RvciBWZWhpY2xlIEJyYWtlIFN5c3RlbSBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjM1I01vdG9yIFZlaGljbGUgVHJhbnNtaXNzaW9uIGFuZCBQb3dlciBUcmFpbiBQYXJ0cyBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjM2I01vdG9yIFZlaGljbGUgU2VhdGluZyBhbmQgSW50ZXJpb3IgVHJpbSBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjM3I01vdG9yIFZlaGljbGUgTWV0YWwgU3RhbXBpbmcjMzM2MwotbmFpY3MjMzM2MzkjT3RoZXIgTW90b3IgVmVoaWNsZSBQYXJ0cyBNYW51ZmFjdHVyaW5nIzMzNjMKLW5haWNzIzMzNjM5MSNNb3RvciBWZWhpY2xlIEFpci1Db25kaXRpb25pbmcgTWFudWZhY3R1cmluZyMzMzYzOQotbmFpY3MjMzM2Mzk5I0FsbCBPdGhlciBNb3RvciBWZWhpY2xlIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2MzkKLW5haWNzIzMzNjQjQWVyb3NwYWNlIFByb2R1Y3QgYW5kIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2Ci1uYWljcyMzMzY0MSNBZXJvc3BhY2UgUHJvZHVjdCBhbmQgUGFydHMgTWFudWZhY3R1cmluZyMzMzY0Ci1uYWljcyMzMzY0MTEjQWlyY3JhZnQgTWFudWZhY3R1cmluZyMzMzY0MQotbmFpY3MjMzM2NDEyI0FpcmNyYWZ0IEVuZ2luZSBhbmQgRW5naW5lIFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2NDEKLW5haWNzIzMzNjQxMyNPdGhlciBBaXJjcmFmdCBQYXJ0cyBhbmQgQXV4aWxpYXJ5IEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNjQxCi1uYWljcyMzMzY0MTQjR3VpZGVkIE1pc3NpbGUgYW5kIFNwYWNlIFZlaGljbGUgTWFudWZhY3R1cmluZyMzMzY0MQotbmFpY3MjMzM2NDE1I0d1aWRlZCBNaXNzaWxlIGFuZCBTcGFjZSBWZWhpY2xlIFByb3B1bHNpb24gVW5pdCBhbmQgUHJvcHVsc2lvbiBVbml0IFBhcnRzIE1hbnVmYWN0dXJpbmcjMzM2NDEKLW5haWNzIzMzNjQxOSNPdGhlciBHdWlkZWQgTWlzc2lsZSBhbmQgU3BhY2UgVmVoaWNsZSBQYXJ0cyBhbmQgQXV4aWxpYXJ5IEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNjQxCi1uYWljcyMzMzY1I1JhaWxyb2FkIFJvbGxpbmcgU3RvY2sgTWFudWZhY3R1cmluZyMzMzYKLW5haWNzIzMzNjUxI1JhaWxyb2FkIFJvbGxpbmcgU3RvY2sgTWFudWZhY3R1cmluZyMzMzY1Ci1uYWljcyMzMzY2I1NoaXAgYW5kIEJvYXQgQnVpbGRpbmcjMzM2Ci1uYWljcyMzMzY2MSNTaGlwIGFuZCBCb2F0IEJ1aWxkaW5nIzMzNjYKLW5haWNzIzMzNjYxMSNTaGlwIEJ1aWxkaW5nIGFuZCBSZXBhaXJpbmcjMzM2NjEKLW5haWNzIzMzNjYxMiNCb2F0IEJ1aWxkaW5nIzMzNjYxCi1uYWljcyMzMzY5I090aGVyIFRyYW5zcG9ydGF0aW9uIEVxdWlwbWVudCBNYW51ZmFjdHVyaW5nIzMzNgotbmFpY3MjMzM2OTkjT3RoZXIgVHJhbnNwb3J0YXRpb24gRXF1aXBtZW50IE1hbnVmYWN0dXJpbmcjMzM2OQotbmFpY3MjMzM2OTkxI01vdG9yY3ljbGUsIEJpY3ljbGUsIGFuZCBQYXJ0cyBNYW51ZmFjdHVyaW5nIzMzNjk5Ci1uYWljcyMzMzY5OTIjTWlsaXRhcnkgQXJtb3JlZCBWZWhpY2xlLCBUYW5rLCBhbmQgVGFuayBDb21wb25lbnQgTWFudWZhY3R1cmluZyMzMzY5OQotbmFpY3MjMzM2OTk5I0FsbCBPdGhlciBUcmFuc3BvcnRhdGlvbiBFcXVpcG1lbnQgTWFudWZhY3R1cmluZyMzMzY5OQotbmFpY3MjMzM3I0Z1cm5pdHVyZSBhbmQgUmVsYXRlZCBQcm9kdWN0IE1hbnVmYWN0dXJpbmcjMzMKLW5haWNzIzMzNzEjSG91c2Vob2xkIGFuZCBJbnN0aXR1dGlvbmFsIEZ1cm5pdHVyZSBhbmQgS2l0Y2hlbiBDYWJpbmV0IE1hbnVmYWN0dXJpbmcjMzM3Ci1uYWljcyMzMzcxMSNXb29kIEtpdGNoZW4gQ2FiaW5ldCBhbmQgQ291bnRlcnRvcCBNYW51ZmFjdHVyaW5nIzMzNzEKLW5haWNzIzMzNzEyI0hvdXNlaG9sZCBhbmQgSW5zdGl0dXRpb25hbCBGdXJuaXR1cmUgTWFudWZhY3R1cmluZyMzMzcxCi1uYWljcyMzMzcxMjEjVXBob2xzdGVyZWQgSG91c2Vob2xkIEZ1cm5pdHVyZSBNYW51ZmFjdHVyaW5nIzMzNzEyCi1uYWljcyMzMzcxMjIjTm9udXBob2xzdGVyZWQgV29vZCBIb3VzZWhvbGQgRnVybml0dXJlIE1hbnVmYWN0dXJpbmcjMzM3MTIKLW5haWNzIzMzNzEyNCNNZXRhbCBIb3VzZWhvbGQgRnVybml0dXJlIE1hbnVmYWN0dXJpbmcjMzM3MTIKLW5haWNzIzMzNzEyNSNIb3VzZWhvbGQgRnVybml0dXJlIChleGNlcHQgV29vZCBhbmQgTWV0YWwpIE1hbnVmYWN0dXJpbmcjMzM3MTIKLW5haWNzIzMzNzEyNyNJbnN0aXR1dGlvbmFsIEZ1cm5pdHVyZSBNYW51ZmFjdHVyaW5nIzMzNzEyCi1uYWljcyMzMzcxMjkjV29vZCBUZWxldmlzaW9uLCBSYWRpbywgYW5kIFNld2luZyBNYWNoaW5lIENhYmluZXQgTWFudWZhY3R1cmluZyMzMzcxMgotbmFpY3MjMzM3MiNPZmZpY2UgRnVybml0dXJlIChpbmNsdWRpbmcgRml4dHVyZXMpIE1hbnVmYWN0dXJpbmcjMzM3Ci1uYWljcyMzMzcyMSNPZmZpY2UgRnVybml0dXJlIChpbmNsdWRpbmcgRml4dHVyZXMpIE1hbnVmYWN0dXJpbmcjMzM3MgotbmFpY3MjMzM3MjExI1dvb2QgT2ZmaWNlIEZ1cm5pdHVyZSBNYW51ZmFjdHVyaW5nIzMzNzIxCi1uYWljcyMzMzcyMTIjQ3VzdG9tIEFyY2hpdGVjdHVyYWwgV29vZHdvcmsgYW5kIE1pbGx3b3JrIE1hbnVmYWN0dXJpbmcjMzM3MjEKLW5haWNzIzMzNzIxNCNPZmZpY2UgRnVybml0dXJlIChleGNlcHQgV29vZCkgTWFudWZhY3R1cmluZyMzMzcyMQotbmFpY3MjMzM3MjE1I1Nob3djYXNlLCBQYXJ0aXRpb24sIFNoZWx2aW5nLCBhbmQgTG9ja2VyIE1hbnVmYWN0dXJpbmcjMzM3MjEKLW5haWNzIzMzNzkjT3RoZXIgRnVybml0dXJlIFJlbGF0ZWQgUHJvZHVjdCBNYW51ZmFjdHVyaW5nIzMzNwotbmFpY3MjMzM3OTEjTWF0dHJlc3MgTWFudWZhY3R1cmluZyMzMzc5Ci1uYWljcyMzMzc5MiNCbGluZCBhbmQgU2hhZGUgTWFudWZhY3R1cmluZyMzMzc5Ci1uYWljcyMzMzkjTWlzY2VsbGFuZW91cyBNYW51ZmFjdHVyaW5nIzMzCi1uYWljcyMzMzkxI01lZGljYWwgRXF1aXBtZW50IGFuZCBTdXBwbGllcyBNYW51ZmFjdHVyaW5nIzMzOQotbmFpY3MjMzM5MTEjTWVkaWNhbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIE1hbnVmYWN0dXJpbmcjMzM5MQotbmFpY3MjMzM5MTExI0xhYm9yYXRvcnkgQXBwYXJhdHVzIGFuZCBGdXJuaXR1cmUgTWFudWZhY3R1cmluZyMzMzkxMQotbmFpY3MjMzM5MTEyI1N1cmdpY2FsIGFuZCBNZWRpY2FsIEluc3RydW1lbnQgTWFudWZhY3R1cmluZyMzMzkxMQotbmFpY3MjMzM5MTEzI1N1cmdpY2FsIEFwcGxpYW5jZSBhbmQgU3VwcGxpZXMgTWFudWZhY3R1cmluZyMzMzkxMQotbmFpY3MjMzM5MTE0I0RlbnRhbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIE1hbnVmYWN0dXJpbmcjMzM5MTEKLW5haWNzIzMzOTExNSNPcGh0aGFsbWljIEdvb2RzIE1hbnVmYWN0dXJpbmcjMzM5MTEKLW5haWNzIzMzOTExNiNEZW50YWwgTGFib3JhdG9yaWVzIzMzOTExCi1uYWljcyMzMzk5I090aGVyIE1pc2NlbGxhbmVvdXMgTWFudWZhY3R1cmluZyMzMzkKLW5haWNzIzMzOTkxI0pld2VscnkgYW5kIFNpbHZlcndhcmUgTWFudWZhY3R1cmluZyMzMzk5Ci1uYWljcyMzMzk5MTEjSmV3ZWxyeSAoZXhjZXB0IENvc3R1bWUpIE1hbnVmYWN0dXJpbmcjMzM5OTEKLW5haWNzIzMzOTkxMiNTaWx2ZXJ3YXJlIGFuZCBIb2xsb3d3YXJlIE1hbnVmYWN0dXJpbmcjMzM5OTEKLW5haWNzIzMzOTkxMyNKZXdlbGVycycgTWF0ZXJpYWwgYW5kIExhcGlkYXJ5IFdvcmsgTWFudWZhY3R1cmluZyMzMzk5MQotbmFpY3MjMzM5OTE0I0Nvc3R1bWUgSmV3ZWxyeSBhbmQgTm92ZWx0eSBNYW51ZmFjdHVyaW5nIzMzOTkxCi1uYWljcyMzMzk5MiNTcG9ydGluZyBhbmQgQXRobGV0aWMgR29vZHMgTWFudWZhY3R1cmluZyMzMzk5Ci1uYWljcyMzMzk5MyNEb2xsLCBUb3ksIGFuZCBHYW1lIE1hbnVmYWN0dXJpbmcjMzM5OQotbmFpY3MjMzM5OTMxI0RvbGwgYW5kIFN0dWZmZWQgVG95IE1hbnVmYWN0dXJpbmcjMzM5OTMKLW5haWNzIzMzOTkzMiNHYW1lLCBUb3ksIGFuZCBDaGlsZHJlbidzIFZlaGljbGUgTWFudWZhY3R1cmluZyMzMzk5MwotbmFpY3MjMzM5OTQjT2ZmaWNlIFN1cHBsaWVzIChleGNlcHQgUGFwZXIpIE1hbnVmYWN0dXJpbmcjMzM5OQotbmFpY3MjMzM5OTQxI1BlbiBhbmQgTWVjaGFuaWNhbCBQZW5jaWwgTWFudWZhY3R1cmluZyMzMzk5NAotbmFpY3MjMzM5OTQyI0xlYWQgUGVuY2lsIGFuZCBBcnQgR29vZCBNYW51ZmFjdHVyaW5nIzMzOTk0Ci1uYWljcyMzMzk5NDMjTWFya2luZyBEZXZpY2UgTWFudWZhY3R1cmluZyMzMzk5NAotbmFpY3MjMzM5OTQ0I0NhcmJvbiBQYXBlciBhbmQgSW5rZWQgUmliYm9uIE1hbnVmYWN0dXJpbmcjMzM5OTQKLW5haWNzIzMzOTk1I1NpZ24gTWFudWZhY3R1cmluZyMzMzk5Ci1uYWljcyMzMzk5OSNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBNYW51ZmFjdHVyaW5nIzMzOTkKLW5haWNzIzMzOTk5MSNHYXNrZXQsIFBhY2tpbmcsIGFuZCBTZWFsaW5nIERldmljZSBNYW51ZmFjdHVyaW5nIzMzOTk5Ci1uYWljcyMzMzk5OTIjTXVzaWNhbCBJbnN0cnVtZW50IE1hbnVmYWN0dXJpbmcjMzM5OTkKLW5haWNzIzMzOTk5MyNGYXN0ZW5lciwgQnV0dG9uLCBOZWVkbGUsIGFuZCBQaW4gTWFudWZhY3R1cmluZyMzMzk5OQotbmFpY3MjMzM5OTk0I0Jyb29tLCBCcnVzaCwgYW5kIE1vcCBNYW51ZmFjdHVyaW5nIzMzOTk5Ci1uYWljcyMzMzk5OTUjQnVyaWFsIENhc2tldCBNYW51ZmFjdHVyaW5nIzMzOTk5Ci1uYWljcyMzMzk5OTkjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgTWFudWZhY3R1cmluZyMzMzk5OQotbmFpY3MjNDIjV2hvbGVzYWxlIFRyYWRlIzQyCi1uYWljcyM0MjEjV2hvbGVzYWxlIFRyYWRlLCBEdXJhYmxlIEdvb2RzIzQyCi1uYWljcyM0MjExI01vdG9yIFZlaGljbGUgYW5kIE1vdG9yIFZlaGljbGUgUGFydHMgYW5kIFN1cHBsaWVzIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxMTEjQXV0b21vYmlsZSBhbmQgT3RoZXIgTW90b3IgVmVoaWNsZSBXaG9sZXNhbGVycyM0MjExCi1uYWljcyM0MjExMiNNb3RvciBWZWhpY2xlIFN1cHBsaWVzIGFuZCBOZXcgUGFydHMgV2hvbGVzYWxlcnMjNDIxMQotbmFpY3MjNDIxMTMjVGlyZSBhbmQgVHViZSBXaG9sZXNhbGVycyM0MjExCi1uYWljcyM0MjExNCNNb3RvciBWZWhpY2xlIFBhcnRzIChVc2VkKSBXaG9sZXNhbGVycyM0MjExCi1uYWljcyM0MjEyI0Z1cm5pdHVyZSBhbmQgSG9tZSBGdXJuaXNoaW5nIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxMjEjRnVybml0dXJlIFdob2xlc2FsZXJzIzQyMTIKLW5haWNzIzQyMTIyI0hvbWUgRnVybmlzaGluZyBXaG9sZXNhbGVycyM0MjEyCi1uYWljcyM0MjEzI0x1bWJlciBhbmQgT3RoZXIgQ29uc3RydWN0aW9uIE1hdGVyaWFscyBXaG9sZXNhbGVycyM0MjEKLW5haWNzIzQyMTMxI0x1bWJlciwgUGx5d29vZCwgTWlsbHdvcmssIGFuZCBXb29kIFBhbmVsIFdob2xlc2FsZXJzIzQyMTMKLW5haWNzIzQyMTMyI0JyaWNrLCBTdG9uZSwgYW5kIFJlbGF0ZWQgQ29uc3RydWN0aW9uIE1hdGVyaWFsIFdob2xlc2FsZXJzIzQyMTMKLW5haWNzIzQyMTMzI1Jvb2ZpbmcsIFNpZGluZywgYW5kIEluc3VsYXRpb24gTWF0ZXJpYWwgV2hvbGVzYWxlcnMjNDIxMwotbmFpY3MjNDIxMzkjT3RoZXIgQ29uc3RydWN0aW9uIE1hdGVyaWFsIFdob2xlc2FsZXJzIzQyMTMKLW5haWNzIzQyMTQjUHJvZmVzc2lvbmFsIGFuZCBDb21tZXJjaWFsIEVxdWlwbWVudCBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxCi1uYWljcyM0MjE0MSNQaG90b2dyYXBoaWMgRXF1aXBtZW50IGFuZCBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjE0Ci1uYWljcyM0MjE0MiNPZmZpY2UgRXF1aXBtZW50IFdob2xlc2FsZXJzIzQyMTQKLW5haWNzIzQyMTQzI0NvbXB1dGVyIGFuZCBDb21wdXRlciBQZXJpcGhlcmFsIEVxdWlwbWVudCBhbmQgU29mdHdhcmUgV2hvbGVzYWxlcnMjNDIxNAotbmFpY3MjNDIxNDQjT3RoZXIgQ29tbWVyY2lhbCBFcXVpcG1lbnQgV2hvbGVzYWxlcnMjNDIxNAotbmFpY3MjNDIxNDUjTWVkaWNhbCwgRGVudGFsLCBhbmQgSG9zcGl0YWwgRXF1aXBtZW50IGFuZCBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjE0Ci1uYWljcyM0MjE0NiNPcGh0aGFsbWljIEdvb2RzIFdob2xlc2FsZXJzIzQyMTQKLW5haWNzIzQyMTQ5I090aGVyIFByb2Zlc3Npb25hbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIFdob2xlc2FsZXJzIzQyMTQKLW5haWNzIzQyMTUjTWV0YWwgYW5kIE1pbmVyYWwgKGV4Y2VwdCBQZXRyb2xldW0pIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxNTEjTWV0YWwgU2VydmljZSBDZW50ZXJzIGFuZCBPZmZpY2VzIzQyMTUKLW5haWNzIzQyMTUyI0NvYWwgYW5kIE90aGVyIE1pbmVyYWwgYW5kIE9yZSBXaG9sZXNhbGVycyM0MjE1Ci1uYWljcyM0MjE2I0VsZWN0cmljYWwgR29vZHMgV2hvbGVzYWxlcnMjNDIxCi1uYWljcyM0MjE2MSNFbGVjdHJpY2FsIEFwcGFyYXR1cyBhbmQgRXF1aXBtZW50LCBXaXJpbmcgU3VwcGxpZXMsIGFuZCBDb25zdHJ1Y3Rpb24gTWF0ZXJpYWwgV2hvbGVzYWxlcnMjNDIxNgotbmFpY3MjNDIxNjIjRWxlY3RyaWNhbCBBcHBsaWFuY2UsIFRlbGV2aXNpb24sIGFuZCBSYWRpbyBTZXQgV2hvbGVzYWxlcnMjNDIxNgotbmFpY3MjNDIxNjkjT3RoZXIgRWxlY3Ryb25pYyBQYXJ0cyBhbmQgRXF1aXBtZW50IFdob2xlc2FsZXJzIzQyMTYKLW5haWNzIzQyMTcjSGFyZHdhcmUsIGFuZCBQbHVtYmluZyBhbmQgSGVhdGluZyBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxNzEjSGFyZHdhcmUgV2hvbGVzYWxlcnMjNDIxNwotbmFpY3MjNDIxNzIjUGx1bWJpbmcgYW5kIEhlYXRpbmcgRXF1aXBtZW50IGFuZCBTdXBwbGllcyAoSHlkcm9uaWNzKSBXaG9sZXNhbGVycyM0MjE3Ci1uYWljcyM0MjE3MyNXYXJtIEFpciBIZWF0aW5nIGFuZCBBaXItQ29uZGl0aW9uaW5nIEVxdWlwbWVudCBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxNwotbmFpY3MjNDIxNzQjUmVmcmlnZXJhdGlvbiBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIFdob2xlc2FsZXJzIzQyMTcKLW5haWNzIzQyMTgjTWFjaGluZXJ5LCBFcXVpcG1lbnQsIGFuZCBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjEKLW5haWNzIzQyMTgxI0NvbnN0cnVjdGlvbiBhbmQgTWluaW5nIChleGNlcHQgT2lsIFdlbGwpIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IFdob2xlc2FsZXJzIzQyMTgKLW5haWNzIzQyMTgyI0Zhcm0gYW5kIEdhcmRlbiBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBXaG9sZXNhbGVycyM0MjE4Ci1uYWljcyM0MjE4MyNJbmR1c3RyaWFsIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IFdob2xlc2FsZXJzIzQyMTgKLW5haWNzIzQyMTg0I0luZHVzdHJpYWwgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxOAotbmFpY3MjNDIxODUjU2VydmljZSBFc3RhYmxpc2htZW50IEVxdWlwbWVudCBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxOAotbmFpY3MjNDIxODYjVHJhbnNwb3J0YXRpb24gRXF1aXBtZW50IGFuZCBTdXBwbGllcyAoZXhjZXB0IE1vdG9yIFZlaGljbGUpIFdob2xlc2FsZXJzIzQyMTgKLW5haWNzIzQyMTkjTWlzY2VsbGFuZW91cyBEdXJhYmxlIEdvb2RzIFdob2xlc2FsZXJzIzQyMQotbmFpY3MjNDIxOTEjU3BvcnRpbmcgYW5kIFJlY3JlYXRpb25hbCBHb29kcyBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxOQotbmFpY3MjNDIxOTIjVG95IGFuZCBIb2JieSBHb29kcyBhbmQgU3VwcGxpZXMgV2hvbGVzYWxlcnMjNDIxOQotbmFpY3MjNDIxOTMjUmVjeWNsYWJsZSBNYXRlcmlhbCBXaG9sZXNhbGVycyM0MjE5Ci1uYWljcyM0MjE5NCNKZXdlbHJ5LCBXYXRjaCwgUHJlY2lvdXMgU3RvbmUsIGFuZCBQcmVjaW91cyBNZXRhbCBXaG9sZXNhbGVycyM0MjE5Ci1uYWljcyM0MjE5OSNPdGhlciBNaXNjZWxsYW5lb3VzIER1cmFibGUgR29vZHMgV2hvbGVzYWxlcnMjNDIxOQotbmFpY3MjNDIyI1dob2xlc2FsZSBUcmFkZSwgTm9uZHVyYWJsZSBHb29kcyM0MgotbmFpY3MjNDIyMSNQYXBlciBhbmQgUGFwZXIgUHJvZHVjdCBXaG9sZXNhbGVycyM0MjIKLW5haWNzIzQyMjExI1ByaW50aW5nIGFuZCBXcml0aW5nIFBhcGVyIFdob2xlc2FsZXJzIzQyMjEKLW5haWNzIzQyMjEyI1N0YXRpb25lcnkgYW5kIE9mZmljZSBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjIxCi1uYWljcyM0MjIxMyNJbmR1c3RyaWFsIGFuZCBQZXJzb25hbCBTZXJ2aWNlIFBhcGVyIFdob2xlc2FsZXJzIzQyMjEKLW5haWNzIzQyMjIjRHJ1Z3MgYW5kIERydWdnaXN0cycgU3VuZHJpZXMgV2hvbGVzYWxlcnMjNDIyCi1uYWljcyM0MjIyMSNEcnVncyBhbmQgRHJ1Z2dpc3RzJyBTdW5kcmllcyBXaG9sZXNhbGVycyM0MjIyCi1uYWljcyM0MjIzI0FwcGFyZWwsIFBpZWNlIEdvb2RzLCBhbmQgTm90aW9ucyBXaG9sZXNhbGVycyM0MjIKLW5haWNzIzQyMjMxI1BpZWNlIEdvb2RzLCBOb3Rpb25zLCBhbmQgT3RoZXIgRHJ5IEdvb2RzIFdob2xlc2FsZXJzIzQyMjMKLW5haWNzIzQyMjMyI01lbidzIGFuZCBCb3lzJyBDbG90aGluZyBhbmQgRnVybmlzaGluZ3MgV2hvbGVzYWxlcnMjNDIyMwotbmFpY3MjNDIyMzMjV29tZW4ncywgQ2hpbGRyZW4ncywgYW5kIEluZmFudHMnIENsb3RoaW5nIGFuZCBBY2Nlc3NvcmllcyBXaG9sZXNhbGVycyM0MjIzCi1uYWljcyM0MjIzNCNGb290d2VhciBXaG9sZXNhbGVycyM0MjIzCi1uYWljcyM0MjI0I0dyb2NlcnkgYW5kIFJlbGF0ZWQgUHJvZHVjdCBXaG9sZXNhbGVycyM0MjIKLW5haWNzIzQyMjQxI0dlbmVyYWwgTGluZSBHcm9jZXJ5IFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQyI1BhY2thZ2VkIEZyb3plbiBGb29kIFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQzI0RhaXJ5IFByb2R1Y3QgKGV4Y2VwdCBEcmllZCBvciBDYW5uZWQpIFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQ0I1BvdWx0cnkgYW5kIFBvdWx0cnkgUHJvZHVjdCBXaG9sZXNhbGVycyM0MjI0Ci1uYWljcyM0MjI0NSNDb25mZWN0aW9uZXJ5IFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQ2I0Zpc2ggYW5kIFNlYWZvb2QgV2hvbGVzYWxlcnMjNDIyNAotbmFpY3MjNDIyNDcjTWVhdCBhbmQgTWVhdCBQcm9kdWN0IFdob2xlc2FsZXJzIzQyMjQKLW5haWNzIzQyMjQ4I0ZyZXNoIEZydWl0IGFuZCBWZWdldGFibGUgV2hvbGVzYWxlcnMjNDIyNAotbmFpY3MjNDIyNDkjT3RoZXIgR3JvY2VyeSBhbmQgUmVsYXRlZCBQcm9kdWN0cyBXaG9sZXNhbGVycyM0MjI0Ci1uYWljcyM0MjI1I0Zhcm0gUHJvZHVjdCBSYXcgTWF0ZXJpYWwgV2hvbGVzYWxlcnMjNDIyCi1uYWljcyM0MjI1MSNHcmFpbiBhbmQgRmllbGQgQmVhbiBXaG9sZXNhbGVycyM0MjI1Ci1uYWljcyM0MjI1MiNMaXZlc3RvY2sgV2hvbGVzYWxlcnMjNDIyNQotbmFpY3MjNDIyNTkjT3RoZXIgRmFybSBQcm9kdWN0IFJhdyBNYXRlcmlhbCBXaG9sZXNhbGVycyM0MjI1Ci1uYWljcyM0MjI2I0NoZW1pY2FsIGFuZCBBbGxpZWQgUHJvZHVjdHMgV2hvbGVzYWxlcnMjNDIyCi1uYWljcyM0MjI2MSNQbGFzdGljcyBNYXRlcmlhbHMgYW5kIEJhc2ljIEZvcm1zIGFuZCBTaGFwZXMgV2hvbGVzYWxlcnMjNDIyNgotbmFpY3MjNDIyNjkjT3RoZXIgQ2hlbWljYWwgYW5kIEFsbGllZCBQcm9kdWN0cyBXaG9sZXNhbGVycyM0MjI2Ci1uYWljcyM0MjI3I1BldHJvbGV1bSBhbmQgUGV0cm9sZXVtIFByb2R1Y3RzIFdob2xlc2FsZXJzIzQyMgotbmFpY3MjNDIyNzEjUGV0cm9sZXVtIEJ1bGsgU3RhdGlvbnMgYW5kIFRlcm1pbmFscyM0MjI3Ci1uYWljcyM0MjI3MiNQZXRyb2xldW0gYW5kIFBldHJvbGV1bSBQcm9kdWN0cyBXaG9sZXNhbGVycyAoZXhjZXB0IEJ1bGsgU3RhdGlvbnMgYW5kIFRlcm1pbmFscykjNDIyNwotbmFpY3MjNDIyOCNCZWVyLCBXaW5lLCBhbmQgRGlzdGlsbGVkIEFsY29ob2xpYyBCZXZlcmFnZSBXaG9sZXNhbGVycyM0MjIKLW5haWNzIzQyMjgxI0JlZXIgYW5kIEFsZSBXaG9sZXNhbGVycyM0MjI4Ci1uYWljcyM0MjI4MiNXaW5lIGFuZCBEaXN0aWxsZWQgQWxjb2hvbGljIEJldmVyYWdlIFdob2xlc2FsZXJzIzQyMjgKLW5haWNzIzQyMjkjTWlzY2VsbGFuZW91cyBOb25kdXJhYmxlIEdvb2RzIFdob2xlc2FsZXJzIzQyMgotbmFpY3MjNDIyOTEjRmFybSBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjI5Ci1uYWljcyM0MjI5MiNCb29rLCBQZXJpb2RpY2FsLCBhbmQgTmV3c3BhcGVyIFdob2xlc2FsZXJzIzQyMjkKLW5haWNzIzQyMjkzI0Zsb3dlciwgTnVyc2VyeSBTdG9jaywgYW5kIEZsb3Jpc3RzJyBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjI5Ci1uYWljcyM0MjI5NCNUb2JhY2NvIGFuZCBUb2JhY2NvIFByb2R1Y3QgV2hvbGVzYWxlcnMjNDIyOQotbmFpY3MjNDIyOTUjUGFpbnQsIFZhcm5pc2gsIGFuZCBTdXBwbGllcyBXaG9sZXNhbGVycyM0MjI5Ci1uYWljcyM0MjI5OSNPdGhlciBNaXNjZWxsYW5lb3VzIE5vbmR1cmFibGUgR29vZHMgV2hvbGVzYWxlcnMjNDIyOQotbmFpY3MjNDQjUmV0YWlsIFRyYWRlIzQ0Ci1uYWljcyM0NDEjTW90b3IgVmVoaWNsZSBhbmQgUGFydHMgRGVhbGVycyM0NAotbmFpY3MjNDQxMSNBdXRvbW9iaWxlIERlYWxlcnMjNDQxCi1uYWljcyM0NDExMSNOZXcgQ2FyIERlYWxlcnMjNDQxMQotbmFpY3MjNDQxMTIjVXNlZCBDYXIgRGVhbGVycyM0NDExCi1uYWljcyM0NDEyI090aGVyIE1vdG9yIFZlaGljbGUgRGVhbGVycyM0NDEKLW5haWNzIzQ0MTIxI1JlY3JlYXRpb25hbCBWZWhpY2xlIERlYWxlcnMjNDQxMgotbmFpY3MjNDQxMjIjTW90b3JjeWNsZSwgQm9hdCwgYW5kIE90aGVyIE1vdG9yIFZlaGljbGUgRGVhbGVycyM0NDEyCi1uYWljcyM0NDEyMjEjTW90b3JjeWNsZSBEZWFsZXJzIzQ0MTIyCi1uYWljcyM0NDEyMjIjQm9hdCBEZWFsZXJzIzQ0MTIyCi1uYWljcyM0NDEyMjkjQWxsIE90aGVyIE1vdG9yIFZlaGljbGUgRGVhbGVycyM0NDEyMgotbmFpY3MjNDQxMyNBdXRvbW90aXZlIFBhcnRzLCBBY2Nlc3NvcmllcywgYW5kIFRpcmUgU3RvcmVzIzQ0MQotbmFpY3MjNDQxMzEjQXV0b21vdGl2ZSBQYXJ0cyBhbmQgQWNjZXNzb3JpZXMgU3RvcmVzIzQ0MTMKLW5haWNzIzQ0MTMyI1RpcmUgRGVhbGVycyM0NDEzCi1uYWljcyM0NDIjRnVybml0dXJlIGFuZCBIb21lIEZ1cm5pc2hpbmdzIFN0b3JlcyM0NAotbmFpY3MjNDQyMSNGdXJuaXR1cmUgU3RvcmVzIzQ0MgotbmFpY3MjNDQyMTEjRnVybml0dXJlIFN0b3JlcyM0NDIxCi1uYWljcyM0NDIyI0hvbWUgRnVybmlzaGluZ3MgU3RvcmVzIzQ0MgotbmFpY3MjNDQyMjEjRmxvb3IgQ292ZXJpbmcgU3RvcmVzIzQ0MjIKLW5haWNzIzQ0MjI5I090aGVyIEhvbWUgRnVybmlzaGluZ3MgU3RvcmVzIzQ0MjIKLW5haWNzIzQ0MjI5MSNXaW5kb3cgVHJlYXRtZW50IFN0b3JlcyM0NDIyOQotbmFpY3MjNDQyMjk5I0FsbCBPdGhlciBIb21lIEZ1cm5pc2hpbmdzIFN0b3JlcyM0NDIyOQotbmFpY3MjNDQzI0VsZWN0cm9uaWNzIGFuZCBBcHBsaWFuY2UgU3RvcmVzIzQ0Ci1uYWljcyM0NDMxI0VsZWN0cm9uaWNzIGFuZCBBcHBsaWFuY2UgU3RvcmVzIzQ0MwotbmFpY3MjNDQzMTEjQXBwbGlhbmNlLCBUZWxldmlzaW9uLCBhbmQgT3RoZXIgRWxlY3Ryb25pY3MgU3RvcmVzIzQ0MzEKLW5haWNzIzQ0MzExMSNIb3VzZWhvbGQgQXBwbGlhbmNlIFN0b3JlcyM0NDMxMQotbmFpY3MjNDQzMTEyI1JhZGlvLCBUZWxldmlzaW9uLCBhbmQgT3RoZXIgRWxlY3Ryb25pY3MgU3RvcmVzIzQ0MzExCi1uYWljcyM0NDMxMiNDb21wdXRlciBhbmQgU29mdHdhcmUgU3RvcmVzIzQ0MzEKLW5haWNzIzQ0MzEzI0NhbWVyYSBhbmQgUGhvdG9ncmFwaGljIFN1cHBsaWVzIFN0b3JlcyM0NDMxCi1uYWljcyM0NDQjQnVpbGRpbmcgTWF0ZXJpYWwgYW5kIEdhcmRlbiBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIERlYWxlcnMjNDQKLW5haWNzIzQ0NDEjQnVpbGRpbmcgTWF0ZXJpYWwgYW5kIFN1cHBsaWVzIERlYWxlcnMjNDQ0Ci1uYWljcyM0NDQxMSNIb21lIENlbnRlcnMjNDQ0MQotbmFpY3MjNDQ0MTIjUGFpbnQgYW5kIFdhbGxwYXBlciBTdG9yZXMjNDQ0MQotbmFpY3MjNDQ0MTMjSGFyZHdhcmUgU3RvcmVzIzQ0NDEKLW5haWNzIzQ0NDE5I090aGVyIEJ1aWxkaW5nIE1hdGVyaWFsIERlYWxlcnMjNDQ0MQotbmFpY3MjNDQ0MiNMYXduIGFuZCBHYXJkZW4gRXF1aXBtZW50IGFuZCBTdXBwbGllcyBTdG9yZXMjNDQ0Ci1uYWljcyM0NDQyMSNPdXRkb29yIFBvd2VyIEVxdWlwbWVudCBTdG9yZXMjNDQ0MgotbmFpY3MjNDQ0MjIjTnVyc2VyeSBhbmQgR2FyZGVuIENlbnRlcnMjNDQ0MgotbmFpY3MjNDQ1I0Zvb2QgYW5kIEJldmVyYWdlIFN0b3JlcyM0NAotbmFpY3MjNDQ1MSNHcm9jZXJ5IFN0b3JlcyM0NDUKLW5haWNzIzQ0NTExI1N1cGVybWFya2V0cyBhbmQgT3RoZXIgR3JvY2VyeSAoZXhjZXB0IENvbnZlbmllbmNlKSBTdG9yZXMjNDQ1MQotbmFpY3MjNDQ1MTIjQ29udmVuaWVuY2UgU3RvcmVzIzQ0NTEKLW5haWNzIzQ0NTIjU3BlY2lhbHR5IEZvb2QgU3RvcmVzIzQ0NQotbmFpY3MjNDQ1MjEjTWVhdCBNYXJrZXRzIzQ0NTIKLW5haWNzIzQ0NTIyI0Zpc2ggYW5kIFNlYWZvb2QgTWFya2V0cyM0NDUyCi1uYWljcyM0NDUyMyNGcnVpdCBhbmQgVmVnZXRhYmxlIE1hcmtldHMjNDQ1MgotbmFpY3MjNDQ1MjkjT3RoZXIgU3BlY2lhbHR5IEZvb2QgU3RvcmVzIzQ0NTIKLW5haWNzIzQ0NTI5MSNCYWtlZCBHb29kcyBTdG9yZXMjNDQ1MjkKLW5haWNzIzQ0NTI5MiNDb25mZWN0aW9uZXJ5IGFuZCBOdXQgU3RvcmVzIzQ0NTI5Ci1uYWljcyM0NDUyOTkjQWxsIE90aGVyIFNwZWNpYWx0eSBGb29kIFN0b3JlcyM0NDUyOQotbmFpY3MjNDQ1MyNCZWVyLCBXaW5lLCBhbmQgTGlxdW9yIFN0b3JlcyM0NDUKLW5haWNzIzQ0NTMxI0JlZXIsIFdpbmUsIGFuZCBMaXF1b3IgU3RvcmVzIzQ0NTMKLW5haWNzIzQ0NiNIZWFsdGggYW5kIFBlcnNvbmFsIENhcmUgU3RvcmVzIzQ0Ci1uYWljcyM0NDYxI0hlYWx0aCBhbmQgUGVyc29uYWwgQ2FyZSBTdG9yZXMjNDQ2Ci1uYWljcyM0NDYxMSNQaGFybWFjaWVzIGFuZCBEcnVnIFN0b3JlcyM0NDYxCi1uYWljcyM0NDYxMiNDb3NtZXRpY3MsIEJlYXV0eSBTdXBwbGllcywgYW5kIFBlcmZ1bWUgU3RvcmVzIzQ0NjEKLW5haWNzIzQ0NjEzI09wdGljYWwgR29vZHMgU3RvcmVzIzQ0NjEKLW5haWNzIzQ0NjE5I090aGVyIEhlYWx0aCBhbmQgUGVyc29uYWwgQ2FyZSBTdG9yZXMjNDQ2MQotbmFpY3MjNDQ2MTkxI0Zvb2QgKEhlYWx0aCkgU3VwcGxlbWVudCBTdG9yZXMjNDQ2MTkKLW5haWNzIzQ0NjE5OSNBbGwgT3RoZXIgSGVhbHRoIGFuZCBQZXJzb25hbCBDYXJlIFN0b3JlcyM0NDYxOQotbmFpY3MjNDQ3I0dhc29saW5lIFN0YXRpb25zIzQ0Ci1uYWljcyM0NDcxI0dhc29saW5lIFN0YXRpb25zIzQ0NwotbmFpY3MjNDQ3MTEjR2Fzb2xpbmUgU3RhdGlvbnMgd2l0aCBDb252ZW5pZW5jZSBTdG9yZXMjNDQ3MQotbmFpY3MjNDQ3MTkjT3RoZXIgR2Fzb2xpbmUgU3RhdGlvbnMjNDQ3MQotbmFpY3MjNDQ4I0Nsb3RoaW5nIGFuZCBDbG90aGluZyBBY2Nlc3NvcmllcyBTdG9yZXMjNDQKLW5haWNzIzQ0ODEjQ2xvdGhpbmcgU3RvcmVzIzQ0OAotbmFpY3MjNDQ4MTEjTWVuJ3MgQ2xvdGhpbmcgU3RvcmVzIzQ0ODEKLW5haWNzIzQ0ODEyI1dvbWVuJ3MgQ2xvdGhpbmcgU3RvcmVzIzQ0ODEKLW5haWNzIzQ0ODEzI0NoaWxkcmVuJ3MgYW5kIEluZmFudHMnIENsb3RoaW5nIFN0b3JlcyM0NDgxCi1uYWljcyM0NDgxNCNGYW1pbHkgQ2xvdGhpbmcgU3RvcmVzIzQ0ODEKLW5haWNzIzQ0ODE1I0Nsb3RoaW5nIEFjY2Vzc29yaWVzIFN0b3JlcyM0NDgxCi1uYWljcyM0NDgxOSNPdGhlciBDbG90aGluZyBTdG9yZXMjNDQ4MQotbmFpY3MjNDQ4MiNTaG9lIFN0b3JlcyM0NDgKLW5haWNzIzQ0ODIxI1Nob2UgU3RvcmVzIzQ0ODIKLW5haWNzIzQ0ODMjSmV3ZWxyeSwgTHVnZ2FnZSwgYW5kIExlYXRoZXIgR29vZHMgU3RvcmVzIzQ0OAotbmFpY3MjNDQ4MzEjSmV3ZWxyeSBTdG9yZXMjNDQ4MwotbmFpY3MjNDQ4MzIjTHVnZ2FnZSBhbmQgTGVhdGhlciBHb29kcyBTdG9yZXMjNDQ4MwotbmFpY3MjNDUjUmV0YWlsIFRyYWRlIzQ1Ci1uYWljcyM0NTEjU3BvcnRpbmcgR29vZHMsIEhvYmJ5LCBCb29rLCBhbmQgTXVzaWMgU3RvcmVzIzQ1Ci1uYWljcyM0NTExI1Nwb3J0aW5nIEdvb2RzLCBIb2JieSwgYW5kIE11c2ljYWwgSW5zdHJ1bWVudCBTdG9yZXMjNDUxCi1uYWljcyM0NTExMSNTcG9ydGluZyBHb29kcyBTdG9yZXMjNDUxMQotbmFpY3MjNDUxMTIjSG9iYnksIFRveSwgYW5kIEdhbWUgU3RvcmVzIzQ1MTEKLW5haWNzIzQ1MTEzI1Nld2luZywgTmVlZGxld29yaywgYW5kIFBpZWNlIEdvb2RzIFN0b3JlcyM0NTExCi1uYWljcyM0NTExNCNNdXNpY2FsIEluc3RydW1lbnQgYW5kIFN1cHBsaWVzIFN0b3JlcyM0NTExCi1uYWljcyM0NTEyI0Jvb2ssIFBlcmlvZGljYWwsIGFuZCBNdXNpYyBTdG9yZXMjNDUxCi1uYWljcyM0NTEyMSNCb29rIFN0b3JlcyBhbmQgTmV3cyBEZWFsZXJzIzQ1MTIKLW5haWNzIzQ1MTIxMSNCb29rIFN0b3JlcyM0NTEyMQotbmFpY3MjNDUxMjEyI05ld3MgRGVhbGVycyBhbmQgTmV3c3N0YW5kcyM0NTEyMQotbmFpY3MjNDUxMjIjUHJlcmVjb3JkZWQgVGFwZSwgQ29tcGFjdCBEaXNjLCBhbmQgUmVjb3JkIFN0b3JlcyM0NTEyCi1uYWljcyM0NTIjR2VuZXJhbCBNZXJjaGFuZGlzZSBTdG9yZXMjNDUKLW5haWNzIzQ1MjEjRGVwYXJ0bWVudCBTdG9yZXMjNDUyCi1uYWljcyM0NTIxMSNEZXBhcnRtZW50IFN0b3JlcyM0NTIxCi1uYWljcyM0NTI5I090aGVyIEdlbmVyYWwgTWVyY2hhbmRpc2UgU3RvcmVzIzQ1MgotbmFpY3MjNDUyOTEjV2FyZWhvdXNlIENsdWJzIGFuZCBTdXBlcnN0b3JlcyM0NTI5Ci1uYWljcyM0NTI5OSNBbGwgT3RoZXIgR2VuZXJhbCBNZXJjaGFuZGlzZSBTdG9yZXMjNDUyOQotbmFpY3MjNDUzI01pc2NlbGxhbmVvdXMgU3RvcmUgUmV0YWlsZXJzIzQ1Ci1uYWljcyM0NTMxI0Zsb3Jpc3RzIzQ1MwotbmFpY3MjNDUzMTEjRmxvcmlzdHMjNDUzMQotbmFpY3MjNDUzMiNPZmZpY2UgU3VwcGxpZXMsIFN0YXRpb25lcnksIGFuZCBHaWZ0IFN0b3JlcyM0NTMKLW5haWNzIzQ1MzIxI09mZmljZSBTdXBwbGllcyBhbmQgU3RhdGlvbmVyeSBTdG9yZXMjNDUzMgotbmFpY3MjNDUzMjIjR2lmdCwgTm92ZWx0eSwgYW5kIFNvdXZlbmlyIFN0b3JlcyM0NTMyCi1uYWljcyM0NTMzI1VzZWQgTWVyY2hhbmRpc2UgU3RvcmVzIzQ1MwotbmFpY3MjNDUzMzEjVXNlZCBNZXJjaGFuZGlzZSBTdG9yZXMjNDUzMwotbmFpY3MjNDUzOSNPdGhlciBNaXNjZWxsYW5lb3VzIFN0b3JlIFJldGFpbGVycyM0NTMKLW5haWNzIzQ1MzkxI1BldCBhbmQgUGV0IFN1cHBsaWVzIFN0b3JlcyM0NTM5Ci1uYWljcyM0NTM5MiNBcnQgRGVhbGVycyM0NTM5Ci1uYWljcyM0NTM5MyNNYW51ZmFjdHVyZWQgKE1vYmlsZSkgSG9tZSBEZWFsZXJzIzQ1MzkKLW5haWNzIzQ1Mzk5I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIFN0b3JlIFJldGFpbGVycyM0NTM5Ci1uYWljcyM0NTM5OTEjVG9iYWNjbyBTdG9yZXMjNDUzOTkKLW5haWNzIzQ1Mzk5OCNBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBTdG9yZSBSZXRhaWxlcnMgKGV4Y2VwdCBUb2JhY2NvIFN0b3JlcykjNDUzOTkKLW5haWNzIzQ1NCNOb25zdG9yZSBSZXRhaWxlcnMjNDUKLW5haWNzIzQ1NDEjRWxlY3Ryb25pYyBTaG9wcGluZyBhbmQgTWFpbC1PcmRlciBIb3VzZXMjNDU0Ci1uYWljcyM0NTQxMSNFbGVjdHJvbmljIFNob3BwaW5nIGFuZCBNYWlsLU9yZGVyIEhvdXNlcyM0NTQxCi1uYWljcyM0NTQyI1ZlbmRpbmcgTWFjaGluZSBPcGVyYXRvcnMjNDU0Ci1uYWljcyM0NTQyMSNWZW5kaW5nIE1hY2hpbmUgT3BlcmF0b3JzIzQ1NDIKLW5haWNzIzQ1NDMjRGlyZWN0IFNlbGxpbmcgRXN0YWJsaXNobWVudHMjNDU0Ci1uYWljcyM0NTQzMSNGdWVsIERlYWxlcnMjNDU0MwotbmFpY3MjNDU0MzExI0hlYXRpbmcgT2lsIERlYWxlcnMjNDU0MzEKLW5haWNzIzQ1NDMxMiNMaXF1ZWZpZWQgUGV0cm9sZXVtIEdhcyAoQm90dGxlZCBHYXMpIERlYWxlcnMjNDU0MzEKLW5haWNzIzQ1NDMxOSNPdGhlciBGdWVsIERlYWxlcnMjNDU0MzEKLW5haWNzIzQ1NDM5I090aGVyIERpcmVjdCBTZWxsaW5nIEVzdGFibGlzaG1lbnRzIzQ1NDMKLW5haWNzIzQ4I1RyYW5zcG9ydGF0aW9uIGFuZCBXYXJlaG91c2luZyM0OAotbmFpY3MjNDgxI0FpciBUcmFuc3BvcnRhdGlvbiM0OAotbmFpY3MjNDgxMSNTY2hlZHVsZWQgQWlyIFRyYW5zcG9ydGF0aW9uIzQ4MQotbmFpY3MjNDgxMTEjU2NoZWR1bGVkIEFpciBUcmFuc3BvcnRhdGlvbiM0ODExCi1uYWljcyM0ODExMTEjU2NoZWR1bGVkIFBhc3NlbmdlciBBaXIgVHJhbnNwb3J0YXRpb24jNDgxMTEKLW5haWNzIzQ4MTExMiNTY2hlZHVsZWQgRnJlaWdodCBBaXIgVHJhbnNwb3J0YXRpb24jNDgxMTEKLW5haWNzIzQ4MTIjTm9uc2NoZWR1bGVkIEFpciBUcmFuc3BvcnRhdGlvbiM0ODEKLW5haWNzIzQ4MTIxI05vbnNjaGVkdWxlZCBBaXIgVHJhbnNwb3J0YXRpb24jNDgxMgotbmFpY3MjNDgxMjExI05vbnNjaGVkdWxlZCBDaGFydGVyZWQgUGFzc2VuZ2VyIEFpciBUcmFuc3BvcnRhdGlvbiM0ODEyMQotbmFpY3MjNDgxMjEyI05vbnNjaGVkdWxlZCBDaGFydGVyZWQgRnJlaWdodCBBaXIgVHJhbnNwb3J0YXRpb24jNDgxMjEKLW5haWNzIzQ4MTIxOSNPdGhlciBOb25zY2hlZHVsZWQgQWlyIFRyYW5zcG9ydGF0aW9uIzQ4MTIxCi1uYWljcyM0ODIjUmFpbCBUcmFuc3BvcnRhdGlvbiM0OAotbmFpY3MjNDgyMSNSYWlsIFRyYW5zcG9ydGF0aW9uIzQ4MgotbmFpY3MjNDgyMTEjUmFpbCBUcmFuc3BvcnRhdGlvbiM0ODIxCi1uYWljcyM0ODIxMTEjTGluZS1IYXVsIFJhaWxyb2FkcyM0ODIxMQotbmFpY3MjNDgyMTEyI1Nob3J0IExpbmUgUmFpbHJvYWRzIzQ4MjExCi1uYWljcyM0ODMjV2F0ZXIgVHJhbnNwb3J0YXRpb24jNDgKLW5haWNzIzQ4MzEjRGVlcCBTZWEsIENvYXN0YWwsIGFuZCBHcmVhdCBMYWtlcyBXYXRlciBUcmFuc3BvcnRhdGlvbiM0ODMKLW5haWNzIzQ4MzExI0RlZXAgU2VhLCBDb2FzdGFsLCBhbmQgR3JlYXQgTGFrZXMgV2F0ZXIgVHJhbnNwb3J0YXRpb24jNDgzMQotbmFpY3MjNDgzMTExI0RlZXAgU2VhIEZyZWlnaHQgVHJhbnNwb3J0YXRpb24jNDgzMTEKLW5haWNzIzQ4MzExMiNEZWVwIFNlYSBQYXNzZW5nZXIgVHJhbnNwb3J0YXRpb24jNDgzMTEKLW5haWNzIzQ4MzExMyNDb2FzdGFsIGFuZCBHcmVhdCBMYWtlcyBGcmVpZ2h0IFRyYW5zcG9ydGF0aW9uIzQ4MzExCi1uYWljcyM0ODMxMTQjQ29hc3RhbCBhbmQgR3JlYXQgTGFrZXMgUGFzc2VuZ2VyIFRyYW5zcG9ydGF0aW9uIzQ4MzExCi1uYWljcyM0ODMyI0lubGFuZCBXYXRlciBUcmFuc3BvcnRhdGlvbiM0ODMKLW5haWNzIzQ4MzIxI0lubGFuZCBXYXRlciBUcmFuc3BvcnRhdGlvbiM0ODMyCi1uYWljcyM0ODMyMTEjSW5sYW5kIFdhdGVyIEZyZWlnaHQgVHJhbnNwb3J0YXRpb24jNDgzMjEKLW5haWNzIzQ4MzIxMiNJbmxhbmQgV2F0ZXIgUGFzc2VuZ2VyIFRyYW5zcG9ydGF0aW9uIzQ4MzIxCi1uYWljcyM0ODQjVHJ1Y2sgVHJhbnNwb3J0YXRpb24jNDgKLW5haWNzIzQ4NDEjR2VuZXJhbCBGcmVpZ2h0IFRydWNraW5nIzQ4NAotbmFpY3MjNDg0MTEjR2VuZXJhbCBGcmVpZ2h0IFRydWNraW5nLCBMb2NhbCM0ODQxCi1uYWljcyM0ODQxMiNHZW5lcmFsIEZyZWlnaHQgVHJ1Y2tpbmcsIExvbmctRGlzdGFuY2UjNDg0MQotbmFpY3MjNDg0MTIxI0dlbmVyYWwgRnJlaWdodCBUcnVja2luZywgTG9uZy1EaXN0YW5jZSwgVHJ1Y2tsb2FkIzQ4NDEyCi1uYWljcyM0ODQxMjIjR2VuZXJhbCBGcmVpZ2h0IFRydWNraW5nLCBMb25nLURpc3RhbmNlLCBMZXNzIFRoYW4gVHJ1Y2tsb2FkIzQ4NDEyCi1uYWljcyM0ODQyI1NwZWNpYWxpemVkIEZyZWlnaHQgVHJ1Y2tpbmcjNDg0Ci1uYWljcyM0ODQyMSNVc2VkIEhvdXNlaG9sZCBhbmQgT2ZmaWNlIEdvb2RzIE1vdmluZyM0ODQyCi1uYWljcyM0ODQyMiNTcGVjaWFsaXplZCBGcmVpZ2h0IChleGNlcHQgVXNlZCBHb29kcykgVHJ1Y2tpbmcsIExvY2FsIzQ4NDIKLW5haWNzIzQ4NDIzI1NwZWNpYWxpemVkIEZyZWlnaHQgKGV4Y2VwdCBVc2VkIEdvb2RzKSBUcnVja2luZywgTG9uZy1EaXN0YW5jZSM0ODQyCi1uYWljcyM0ODUjVHJhbnNpdCBhbmQgR3JvdW5kIFBhc3NlbmdlciBUcmFuc3BvcnRhdGlvbiM0OAotbmFpY3MjNDg1MSNVcmJhbiBUcmFuc2l0IFN5c3RlbXMjNDg1Ci1uYWljcyM0ODUxMSNVcmJhbiBUcmFuc2l0IFN5c3RlbXMjNDg1MQotbmFpY3MjNDg1MTExI01peGVkIE1vZGUgVHJhbnNpdCBTeXN0ZW1zIzQ4NTExCi1uYWljcyM0ODUxMTIjQ29tbXV0ZXIgUmFpbCBTeXN0ZW1zIzQ4NTExCi1uYWljcyM0ODUxMTMjQnVzIGFuZCBPdGhlciBNb3RvciBWZWhpY2xlIFRyYW5zaXQgU3lzdGVtcyM0ODUxMQotbmFpY3MjNDg1MTE5I090aGVyIFVyYmFuIFRyYW5zaXQgU3lzdGVtcyM0ODUxMQotbmFpY3MjNDg1MiNJbnRlcnVyYmFuIGFuZCBSdXJhbCBCdXMgVHJhbnNwb3J0YXRpb24jNDg1Ci1uYWljcyM0ODUyMSNJbnRlcnVyYmFuIGFuZCBSdXJhbCBCdXMgVHJhbnNwb3J0YXRpb24jNDg1MgotbmFpY3MjNDg1MyNUYXhpIGFuZCBMaW1vdXNpbmUgU2VydmljZSM0ODUKLW5haWNzIzQ4NTMxI1RheGkgU2VydmljZSM0ODUzCi1uYWljcyM0ODUzMiNMaW1vdXNpbmUgU2VydmljZSM0ODUzCi1uYWljcyM0ODU0I1NjaG9vbCBhbmQgRW1wbG95ZWUgQnVzIFRyYW5zcG9ydGF0aW9uIzQ4NQotbmFpY3MjNDg1NDEjU2Nob29sIGFuZCBFbXBsb3llZSBCdXMgVHJhbnNwb3J0YXRpb24jNDg1NAotbmFpY3MjNDg1NSNDaGFydGVyIEJ1cyBJbmR1c3RyeSM0ODUKLW5haWNzIzQ4NTUxI0NoYXJ0ZXIgQnVzIEluZHVzdHJ5IzQ4NTUKLW5haWNzIzQ4NTkjT3RoZXIgVHJhbnNpdCBhbmQgR3JvdW5kIFBhc3NlbmdlciBUcmFuc3BvcnRhdGlvbiM0ODUKLW5haWNzIzQ4NTk5I090aGVyIFRyYW5zaXQgYW5kIEdyb3VuZCBQYXNzZW5nZXIgVHJhbnNwb3J0YXRpb24jNDg1OQotbmFpY3MjNDg1OTkxI1NwZWNpYWwgTmVlZHMgVHJhbnNwb3J0YXRpb24jNDg1OTkKLW5haWNzIzQ4NTk5OSNBbGwgT3RoZXIgVHJhbnNpdCBhbmQgR3JvdW5kIFBhc3NlbmdlciBUcmFuc3BvcnRhdGlvbiM0ODU5OQotbmFpY3MjNDg2I1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIzQ4Ci1uYWljcyM0ODYxI1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIG9mIENydWRlIE9pbCM0ODYKLW5haWNzIzQ4NjExI1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIG9mIENydWRlIE9pbCM0ODYxCi1uYWljcyM0ODYyI1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIG9mIE5hdHVyYWwgR2FzIzQ4NgotbmFpY3MjNDg2MjEjUGlwZWxpbmUgVHJhbnNwb3J0YXRpb24gb2YgTmF0dXJhbCBHYXMjNDg2MgotbmFpY3MjNDg2OSNPdGhlciBQaXBlbGluZSBUcmFuc3BvcnRhdGlvbiM0ODYKLW5haWNzIzQ4NjkxI1BpcGVsaW5lIFRyYW5zcG9ydGF0aW9uIG9mIFJlZmluZWQgUGV0cm9sZXVtIFByb2R1Y3RzIzQ4NjkKLW5haWNzIzQ4Njk5I0FsbCBPdGhlciBQaXBlbGluZSBUcmFuc3BvcnRhdGlvbiM0ODY5Ci1uYWljcyM0ODcjU2NlbmljIGFuZCBTaWdodHNlZWluZyBUcmFuc3BvcnRhdGlvbiM0OAotbmFpY3MjNDg3MSNTY2VuaWMgYW5kIFNpZ2h0c2VlaW5nIFRyYW5zcG9ydGF0aW9uLCBMYW5kIzQ4NwotbmFpY3MjNDg3MTEjU2NlbmljIGFuZCBTaWdodHNlZWluZyBUcmFuc3BvcnRhdGlvbiwgTGFuZCM0ODcxCi1uYWljcyM0ODcyI1NjZW5pYyBhbmQgU2lnaHRzZWVpbmcgVHJhbnNwb3J0YXRpb24sIFdhdGVyIzQ4NwotbmFpY3MjNDg3MjEjU2NlbmljIGFuZCBTaWdodHNlZWluZyBUcmFuc3BvcnRhdGlvbiwgV2F0ZXIjNDg3MgotbmFpY3MjNDg3OSNTY2VuaWMgYW5kIFNpZ2h0c2VlaW5nIFRyYW5zcG9ydGF0aW9uLCBPdGhlciM0ODcKLW5haWNzIzQ4Nzk5I1NjZW5pYyBhbmQgU2lnaHRzZWVpbmcgVHJhbnNwb3J0YXRpb24sIE90aGVyIzQ4NzkKLW5haWNzIzQ4OCNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIFRyYW5zcG9ydGF0aW9uIzQ4Ci1uYWljcyM0ODgxI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgQWlyIFRyYW5zcG9ydGF0aW9uIzQ4OAotbmFpY3MjNDg4MTEjQWlycG9ydCBPcGVyYXRpb25zIzQ4ODEKLW5haWNzIzQ4ODExMSNBaXIgVHJhZmZpYyBDb250cm9sIzQ4ODExCi1uYWljcyM0ODgxMTkjT3RoZXIgQWlycG9ydCBPcGVyYXRpb25zIzQ4ODExCi1uYWljcyM0ODgxOSNPdGhlciBTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIEFpciBUcmFuc3BvcnRhdGlvbiM0ODgxCi1uYWljcyM0ODgyI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgUmFpbCBUcmFuc3BvcnRhdGlvbiM0ODgKLW5haWNzIzQ4ODIxI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgUmFpbCBUcmFuc3BvcnRhdGlvbiM0ODgyCi1uYWljcyM0ODgzI1N1cHBvcnQgQWN0aXZpdGllcyBmb3IgV2F0ZXIgVHJhbnNwb3J0YXRpb24jNDg4Ci1uYWljcyM0ODgzMSNQb3J0IGFuZCBIYXJib3IgT3BlcmF0aW9ucyM0ODgzCi1uYWljcyM0ODgzMiNNYXJpbmUgQ2FyZ28gSGFuZGxpbmcjNDg4MwotbmFpY3MjNDg4MzMjTmF2aWdhdGlvbmFsIFNlcnZpY2VzIHRvIFNoaXBwaW5nIzQ4ODMKLW5haWNzIzQ4ODM5I090aGVyIFN1cHBvcnQgQWN0aXZpdGllcyBmb3IgV2F0ZXIgVHJhbnNwb3J0YXRpb24jNDg4MwotbmFpY3MjNDg4NCNTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIFJvYWQgVHJhbnNwb3J0YXRpb24jNDg4Ci1uYWljcyM0ODg0MSNNb3RvciBWZWhpY2xlIFRvd2luZyM0ODg0Ci1uYWljcyM0ODg0OSNPdGhlciBTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIFJvYWQgVHJhbnNwb3J0YXRpb24jNDg4NAotbmFpY3MjNDg4NSNGcmVpZ2h0IFRyYW5zcG9ydGF0aW9uIEFycmFuZ2VtZW50IzQ4OAotbmFpY3MjNDg4NTEjRnJlaWdodCBUcmFuc3BvcnRhdGlvbiBBcnJhbmdlbWVudCM0ODg1Ci1uYWljcyM0ODg5I090aGVyIFN1cHBvcnQgQWN0aXZpdGllcyBmb3IgVHJhbnNwb3J0YXRpb24jNDg4Ci1uYWljcyM0ODg5OSNPdGhlciBTdXBwb3J0IEFjdGl2aXRpZXMgZm9yIFRyYW5zcG9ydGF0aW9uIzQ4ODkKLW5haWNzIzQ4ODk5MSNQYWNraW5nIGFuZCBDcmF0aW5nIzQ4ODk5Ci1uYWljcyM0ODg5OTkjQWxsIE90aGVyIFN1cHBvcnQgQWN0aXZpdGllcyBmb3IgVHJhbnNwb3J0YXRpb24jNDg4OTkKLW5haWNzIzQ5I1RyYW5zcG9ydGF0aW9uIGFuZCBXYXJlaG91c2luZyM0OQotbmFpY3MjNDkxI1Bvc3RhbCBTZXJ2aWNlIzQ5Ci1uYWljcyM0OTExI1Bvc3RhbCBTZXJ2aWNlIzQ5MQotbmFpY3MjNDkxMTEjUG9zdGFsIFNlcnZpY2UjNDkxMQotbmFpY3MjNDkyI0NvdXJpZXJzIGFuZCBNZXNzZW5nZXJzIzQ5Ci1uYWljcyM0OTIxI0NvdXJpZXJzIzQ5MgotbmFpY3MjNDkyMTEjQ291cmllcnMjNDkyMQotbmFpY3MjNDkyMiNMb2NhbCBNZXNzZW5nZXJzIGFuZCBMb2NhbCBEZWxpdmVyeSM0OTIKLW5haWNzIzQ5MjIxI0xvY2FsIE1lc3NlbmdlcnMgYW5kIExvY2FsIERlbGl2ZXJ5IzQ5MjIKLW5haWNzIzQ5MyNXYXJlaG91c2luZyBhbmQgU3RvcmFnZSM0OQotbmFpY3MjNDkzMSNXYXJlaG91c2luZyBhbmQgU3RvcmFnZSM0OTMKLW5haWNzIzQ5MzExI0dlbmVyYWwgV2FyZWhvdXNpbmcgYW5kIFN0b3JhZ2UjNDkzMQotbmFpY3MjNDkzMTIjUmVmcmlnZXJhdGVkIFdhcmVob3VzaW5nIGFuZCBTdG9yYWdlIzQ5MzEKLW5haWNzIzQ5MzEzI0Zhcm0gUHJvZHVjdCBXYXJlaG91c2luZyBhbmQgU3RvcmFnZSM0OTMxCi1uYWljcyM0OTMxOSNPdGhlciBXYXJlaG91c2luZyBhbmQgU3RvcmFnZSM0OTMxCi1uYWljcyM1MSNJbmZvcm1hdGlvbiM1MQotbmFpY3MjNTExI1B1Ymxpc2hpbmcgSW5kdXN0cmllcyM1MQotbmFpY3MjNTExMSNOZXdzcGFwZXIsIFBlcmlvZGljYWwsIEJvb2ssIGFuZCBEYXRhYmFzZSBQdWJsaXNoZXJzIzUxMQotbmFpY3MjNTExMTEjTmV3c3BhcGVyIFB1Ymxpc2hlcnMjNTExMQotbmFpY3MjNTExMTIjUGVyaW9kaWNhbCBQdWJsaXNoZXJzIzUxMTEKLW5haWNzIzUxMTEzI0Jvb2sgUHVibGlzaGVycyM1MTExCi1uYWljcyM1MTExNCNEYXRhYmFzZSBhbmQgRGlyZWN0b3J5IFB1Ymxpc2hlcnMjNTExMQotbmFpY3MjNTExMTkjT3RoZXIgUHVibGlzaGVycyM1MTExCi1uYWljcyM1MTExOTEjR3JlZXRpbmcgQ2FyZCBQdWJsaXNoZXJzIzUxMTE5Ci1uYWljcyM1MTExOTkjQWxsIE90aGVyIFB1Ymxpc2hlcnMjNTExMTkKLW5haWNzIzUxMTIjU29mdHdhcmUgUHVibGlzaGVycyM1MTEKLW5haWNzIzUxMTIxI1NvZnR3YXJlIFB1Ymxpc2hlcnMjNTExMgotbmFpY3MjNTEyI01vdGlvbiBQaWN0dXJlIGFuZCBTb3VuZCBSZWNvcmRpbmcgSW5kdXN0cmllcyM1MQotbmFpY3MjNTEyMSNNb3Rpb24gUGljdHVyZSBhbmQgVmlkZW8gSW5kdXN0cmllcyM1MTIKLW5haWNzIzUxMjExI01vdGlvbiBQaWN0dXJlIGFuZCBWaWRlbyBQcm9kdWN0aW9uIzUxMjEKLW5haWNzIzUxMjEyI01vdGlvbiBQaWN0dXJlIGFuZCBWaWRlbyBEaXN0cmlidXRpb24jNTEyMQotbmFpY3MjNTEyMTMjTW90aW9uIFBpY3R1cmUgYW5kIFZpZGVvIEV4aGliaXRpb24jNTEyMQotbmFpY3MjNTEyMTMxI01vdGlvbiBQaWN0dXJlIFRoZWF0ZXJzIChleGNlcHQgRHJpdmUtSW5zKSM1MTIxMwotbmFpY3MjNTEyMTMyI0RyaXZlLUluIE1vdGlvbiBQaWN0dXJlIFRoZWF0ZXJzIzUxMjEzCi1uYWljcyM1MTIxOSNQb3N0cHJvZHVjdGlvbiBTZXJ2aWNlcyBhbmQgT3RoZXIgTW90aW9uIFBpY3R1cmUgYW5kIFZpZGVvIEluZHVzdHJpZXMjNTEyMQotbmFpY3MjNTEyMTkxI1RlbGVwcm9kdWN0aW9uIGFuZCBPdGhlciBQb3N0cHJvZHVjdGlvbiBTZXJ2aWNlcyM1MTIxOQotbmFpY3MjNTEyMTk5I090aGVyIE1vdGlvbiBQaWN0dXJlIGFuZCBWaWRlbyBJbmR1c3RyaWVzIzUxMjE5Ci1uYWljcyM1MTIyI1NvdW5kIFJlY29yZGluZyBJbmR1c3RyaWVzIzUxMgotbmFpY3MjNTEyMjEjUmVjb3JkIFByb2R1Y3Rpb24jNTEyMgotbmFpY3MjNTEyMjIjSW50ZWdyYXRlZCBSZWNvcmQgUHJvZHVjdGlvbi9EaXN0cmlidXRpb24jNTEyMgotbmFpY3MjNTEyMjMjTXVzaWMgUHVibGlzaGVycyM1MTIyCi1uYWljcyM1MTIyNCNTb3VuZCBSZWNvcmRpbmcgU3R1ZGlvcyM1MTIyCi1uYWljcyM1MTIyOSNPdGhlciBTb3VuZCBSZWNvcmRpbmcgSW5kdXN0cmllcyM1MTIyCi1uYWljcyM1MTMjQnJvYWRjYXN0aW5nIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMjNTEKLW5haWNzIzUxMzEjUmFkaW8gYW5kIFRlbGV2aXNpb24gQnJvYWRjYXN0aW5nIzUxMwotbmFpY3MjNTEzMTEjUmFkaW8gQnJvYWRjYXN0aW5nIzUxMzEKLW5haWNzIzUxMzExMSNSYWRpbyBOZXR3b3JrcyM1MTMxMQotbmFpY3MjNTEzMTEyI1JhZGlvIFN0YXRpb25zIzUxMzExCi1uYWljcyM1MTMxMiNUZWxldmlzaW9uIEJyb2FkY2FzdGluZyM1MTMxCi1uYWljcyM1MTMyI0NhYmxlIE5ldHdvcmtzIGFuZCBQcm9ncmFtIERpc3RyaWJ1dGlvbiM1MTMKLW5haWNzIzUxMzIxI0NhYmxlIE5ldHdvcmtzIzUxMzIKLW5haWNzIzUxMzIyI0NhYmxlIGFuZCBPdGhlciBQcm9ncmFtIERpc3RyaWJ1dGlvbiM1MTMyCi1uYWljcyM1MTMzI1RlbGVjb21tdW5pY2F0aW9ucyM1MTMKLW5haWNzIzUxMzMxI1dpcmVkIFRlbGVjb21tdW5pY2F0aW9ucyBDYXJyaWVycyM1MTMzCi1uYWljcyM1MTMzMiNXaXJlbGVzcyBUZWxlY29tbXVuaWNhdGlvbnMgQ2FycmllcnMgKGV4Y2VwdCBTYXRlbGxpdGUpIzUxMzMKLW5haWNzIzUxMzMyMSNQYWdpbmcjNTEzMzIKLW5haWNzIzUxMzMyMiNDZWxsdWxhciBhbmQgT3RoZXIgV2lyZWxlc3MgVGVsZWNvbW11bmljYXRpb25zIzUxMzMyCi1uYWljcyM1MTMzMyNUZWxlY29tbXVuaWNhdGlvbnMgUmVzZWxsZXJzIzUxMzMKLW5haWNzIzUxMzM0I1NhdGVsbGl0ZSBUZWxlY29tbXVuaWNhdGlvbnMjNTEzMwotbmFpY3MjNTEzMzkjT3RoZXIgVGVsZWNvbW11bmljYXRpb25zIzUxMzMKLW5haWNzIzUxNCNJbmZvcm1hdGlvbiBTZXJ2aWNlcyBhbmQgRGF0YSBQcm9jZXNzaW5nIFNlcnZpY2VzIzUxCi1uYWljcyM1MTQxI0luZm9ybWF0aW9uIFNlcnZpY2VzIzUxNAotbmFpY3MjNTE0MTEjTmV3cyBTeW5kaWNhdGVzIzUxNDEKLW5haWNzIzUxNDEyI0xpYnJhcmllcyBhbmQgQXJjaGl2ZXMjNTE0MQotbmFpY3MjNTE0MTkjT3RoZXIgSW5mb3JtYXRpb24gU2VydmljZXMjNTE0MQotbmFpY3MjNTE0MTkxI09uLUxpbmUgSW5mb3JtYXRpb24gU2VydmljZXMjNTE0MTkKLW5haWNzIzUxNDE5OSNBbGwgT3RoZXIgSW5mb3JtYXRpb24gU2VydmljZXMjNTE0MTkKLW5haWNzIzUxNDIjRGF0YSBQcm9jZXNzaW5nIFNlcnZpY2VzIzUxNAotbmFpY3MjNTE0MjEjRGF0YSBQcm9jZXNzaW5nIFNlcnZpY2VzIzUxNDIKLW5haWNzIzUyI0ZpbmFuY2UgYW5kIEluc3VyYW5jZSM1MgotbmFpY3MjNTIxI01vbmV0YXJ5IEF1dGhvcml0aWVzIC0gQ2VudHJhbCBCYW5rIzUyCi1uYWljcyM1MjExI01vbmV0YXJ5IEF1dGhvcml0aWVzIC0gQ2VudHJhbCBCYW5rIzUyMQotbmFpY3MjNTIxMTEjTW9uZXRhcnkgQXV0aG9yaXRpZXMgLSBDZW50cmFsIEJhbmsjNTIxMQotbmFpY3MjNTIyI0NyZWRpdCBJbnRlcm1lZGlhdGlvbiBhbmQgUmVsYXRlZCBBY3Rpdml0aWVzIzUyCi1uYWljcyM1MjIxI0RlcG9zaXRvcnkgQ3JlZGl0IEludGVybWVkaWF0aW9uIzUyMgotbmFpY3MjNTIyMTEjQ29tbWVyY2lhbCBCYW5raW5nIzUyMjEKLW5haWNzIzUyMjEyI1NhdmluZ3MgSW5zdGl0dXRpb25zIzUyMjEKLW5haWNzIzUyMjEzI0NyZWRpdCBVbmlvbnMjNTIyMQotbmFpY3MjNTIyMTkjT3RoZXIgRGVwb3NpdG9yeSBDcmVkaXQgSW50ZXJtZWRpYXRpb24jNTIyMQotbmFpY3MjNTIyMiNOb25kZXBvc2l0b3J5IENyZWRpdCBJbnRlcm1lZGlhdGlvbiM1MjIKLW5haWNzIzUyMjIxI0NyZWRpdCBDYXJkIElzc3VpbmcjNTIyMgotbmFpY3MjNTIyMjIjU2FsZXMgRmluYW5jaW5nIzUyMjIKLW5haWNzIzUyMjI5I090aGVyIE5vbmRlcG9zaXRvcnkgQ3JlZGl0IEludGVybWVkaWF0aW9uIzUyMjIKLW5haWNzIzUyMjI5MSNDb25zdW1lciBMZW5kaW5nIzUyMjI5Ci1uYWljcyM1MjIyOTIjUmVhbCBFc3RhdGUgQ3JlZGl0IzUyMjI5Ci1uYWljcyM1MjIyOTMjSW50ZXJuYXRpb25hbCBUcmFkZSBGaW5hbmNpbmcjNTIyMjkKLW5haWNzIzUyMjI5NCNTZWNvbmRhcnkgTWFya2V0IEZpbmFuY2luZyM1MjIyOQotbmFpY3MjNTIyMjk4I0FsbCBPdGhlciBOb25kZXBvc2l0b3J5IENyZWRpdCBJbnRlcm1lZGlhdGlvbiM1MjIyOQotbmFpY3MjNTIyMyNBY3Rpdml0aWVzIFJlbGF0ZWQgdG8gQ3JlZGl0IEludGVybWVkaWF0aW9uIzUyMgotbmFpY3MjNTIyMzEjTW9ydGdhZ2UgYW5kIE5vbm1vcnRnYWdlIExvYW4gQnJva2VycyM1MjIzCi1uYWljcyM1MjIzMiNGaW5hbmNpYWwgVHJhbnNhY3Rpb25zIFByb2Nlc3NpbmcsIFJlc2VydmUsIGFuZCBDbGVhcmluZ2hvdXNlIEFjdGl2aXRpZXMjNTIyMwotbmFpY3MjNTIyMzkjT3RoZXIgQWN0aXZpdGllcyBSZWxhdGVkIHRvIENyZWRpdCBJbnRlcm1lZGlhdGlvbiM1MjIzCi1uYWljcyM1MjMjU2VjdXJpdGllcywgQ29tbW9kaXR5IENvbnRyYWN0cywgYW5kIE90aGVyIEZpbmFuY2lhbCBJbnZlc3RtZW50cyBhbmQgUmVsYXRlZCBBY3Rpdml0aWVzIzUyCi1uYWljcyM1MjMxI1NlY3VyaXRpZXMgYW5kIENvbW1vZGl0eSBDb250cmFjdHMgSW50ZXJtZWRpYXRpb24gYW5kIEJyb2tlcmFnZSM1MjMKLW5haWNzIzUyMzExI0ludmVzdG1lbnQgQmFua2luZyBhbmQgU2VjdXJpdGllcyBEZWFsaW5nIzUyMzEKLW5haWNzIzUyMzEyI1NlY3VyaXRpZXMgQnJva2VyYWdlIzUyMzEKLW5haWNzIzUyMzEzI0NvbW1vZGl0eSBDb250cmFjdHMgRGVhbGluZyM1MjMxCi1uYWljcyM1MjMxNCNDb21tb2RpdHkgQ29udHJhY3RzIEJyb2tlcmFnZSM1MjMxCi1uYWljcyM1MjMyI1NlY3VyaXRpZXMgYW5kIENvbW1vZGl0eSBFeGNoYW5nZXMjNTIzCi1uYWljcyM1MjMyMSNTZWN1cml0aWVzIGFuZCBDb21tb2RpdHkgRXhjaGFuZ2VzIzUyMzIKLW5haWNzIzUyMzkjT3RoZXIgRmluYW5jaWFsIEludmVzdG1lbnQgQWN0aXZpdGllcyM1MjMKLW5haWNzIzUyMzkxI01pc2NlbGxhbmVvdXMgSW50ZXJtZWRpYXRpb24jNTIzOQotbmFpY3MjNTIzOTIjUG9ydGZvbGlvIE1hbmFnZW1lbnQjNTIzOQotbmFpY3MjNTIzOTMjSW52ZXN0bWVudCBBZHZpY2UjNTIzOQotbmFpY3MjNTIzOTkjQWxsIE90aGVyIEZpbmFuY2lhbCBJbnZlc3RtZW50IEFjdGl2aXRpZXMjNTIzOQotbmFpY3MjNTIzOTkxI1RydXN0LCBGaWR1Y2lhcnksIGFuZCBDdXN0b2R5IEFjdGl2aXRpZXMjNTIzOTkKLW5haWNzIzUyMzk5OSNNaXNjZWxsYW5lb3VzIEZpbmFuY2lhbCBJbnZlc3RtZW50IEFjdGl2aXRpZXMjNTIzOTkKLW5haWNzIzUyNCNJbnN1cmFuY2UgQ2FycmllcnMgYW5kIFJlbGF0ZWQgQWN0aXZpdGllcyM1MgotbmFpY3MjNTI0MSNJbnN1cmFuY2UgQ2FycmllcnMjNTI0Ci1uYWljcyM1MjQxMSNEaXJlY3QgTGlmZSwgSGVhbHRoLCBhbmQgTWVkaWNhbCBJbnN1cmFuY2UgQ2FycmllcnMjNTI0MQotbmFpY3MjNTI0MTEzI0RpcmVjdCBMaWZlIEluc3VyYW5jZSBDYXJyaWVycyM1MjQxMQotbmFpY3MjNTI0MTE0I0RpcmVjdCBIZWFsdGggYW5kIE1lZGljYWwgSW5zdXJhbmNlIENhcnJpZXJzIzUyNDExCi1uYWljcyM1MjQxMiNEaXJlY3QgSW5zdXJhbmNlIChleGNlcHQgTGlmZSwgSGVhbHRoLCBhbmQgTWVkaWNhbCkgQ2FycmllcnMjNTI0MQotbmFpY3MjNTI0MTI2I0RpcmVjdCBQcm9wZXJ0eSBhbmQgQ2FzdWFsdHkgSW5zdXJhbmNlIENhcnJpZXJzIzUyNDEyCi1uYWljcyM1MjQxMjcjRGlyZWN0IFRpdGxlIEluc3VyYW5jZSBDYXJyaWVycyM1MjQxMgotbmFpY3MjNTI0MTI4I090aGVyIERpcmVjdCBJbnN1cmFuY2UgKGV4Y2VwdCBMaWZlLCBIZWFsdGgsIGFuZCBNZWRpY2FsKSBDYXJyaWVycyM1MjQxMgotbmFpY3MjNTI0MTMjUmVpbnN1cmFuY2UgQ2FycmllcnMjNTI0MQotbmFpY3MjNTI0MiNBZ2VuY2llcywgQnJva2VyYWdlcywgYW5kIE90aGVyIEluc3VyYW5jZSBSZWxhdGVkIEFjdGl2aXRpZXMjNTI0Ci1uYWljcyM1MjQyMSNJbnN1cmFuY2UgQWdlbmNpZXMgYW5kIEJyb2tlcmFnZXMjNTI0MgotbmFpY3MjNTI0MjkjT3RoZXIgSW5zdXJhbmNlIFJlbGF0ZWQgQWN0aXZpdGllcyM1MjQyCi1uYWljcyM1MjQyOTEjQ2xhaW1zIEFkanVzdGluZyM1MjQyOQotbmFpY3MjNTI0MjkyI1RoaXJkIFBhcnR5IEFkbWluaXN0cmF0aW9uIG9mIEluc3VyYW5jZSBhbmQgUGVuc2lvbiBGdW5kcyM1MjQyOQotbmFpY3MjNTI0Mjk4I0FsbCBPdGhlciBJbnN1cmFuY2UgUmVsYXRlZCBBY3Rpdml0aWVzIzUyNDI5Ci1uYWljcyM1MjUjRnVuZHMsIFRydXN0cywgYW5kIE90aGVyIEZpbmFuY2lhbCBWZWhpY2xlcyM1MgotbmFpY3MjNTI1MSNJbnN1cmFuY2UgYW5kIEVtcGxveWVlIEJlbmVmaXQgRnVuZHMjNTI1Ci1uYWljcyM1MjUxMSNQZW5zaW9uIEZ1bmRzIzUyNTEKLW5haWNzIzUyNTEyI0hlYWx0aCBhbmQgV2VsZmFyZSBGdW5kcyM1MjUxCi1uYWljcyM1MjUxOSNPdGhlciBJbnN1cmFuY2UgRnVuZHMjNTI1MQotbmFpY3MjNTI1OSNPdGhlciBJbnZlc3RtZW50IFBvb2xzIGFuZCBGdW5kcyM1MjUKLW5haWNzIzUyNTkxI09wZW4tRW5kIEludmVzdG1lbnQgRnVuZHMjNTI1OQotbmFpY3MjNTI1OTIjVHJ1c3RzLCBFc3RhdGVzLCBhbmQgQWdlbmN5IEFjY291bnRzIzUyNTkKLW5haWNzIzUyNTkzI1JlYWwgRXN0YXRlIEludmVzdG1lbnQgVHJ1c3RzIzUyNTkKLW5haWNzIzUyNTk5I090aGVyIEZpbmFuY2lhbCBWZWhpY2xlcyM1MjU5Ci1uYWljcyM1MyNSZWFsIEVzdGF0ZSBhbmQgUmVudGFsIGFuZCBMZWFzaW5nIzUzCi1uYWljcyM1MzEjUmVhbCBFc3RhdGUjNTMKLW5haWNzIzUzMTEjTGVzc29ycyBvZiBSZWFsIEVzdGF0ZSM1MzEKLW5haWNzIzUzMTExI0xlc3NvcnMgb2YgUmVzaWRlbnRpYWwgQnVpbGRpbmdzIGFuZCBEd2VsbGluZ3MjNTMxMQotbmFpY3MjNTMxMTIjTGVzc29ycyBvZiBOb25yZXNpZGVudGlhbCBCdWlsZGluZ3MgKGV4Y2VwdCBNaW5pd2FyZWhvdXNlcykjNTMxMQotbmFpY3MjNTMxMTMjTGVzc29ycyBvZiBNaW5pd2FyZWhvdXNlcyBhbmQgU2VsZi1TdG9yYWdlIFVuaXRzIzUzMTEKLW5haWNzIzUzMTE5I0xlc3NvcnMgb2YgT3RoZXIgUmVhbCBFc3RhdGUgUHJvcGVydHkjNTMxMQotbmFpY3MjNTMxMiNPZmZpY2VzIG9mIFJlYWwgRXN0YXRlIEFnZW50cyBhbmQgQnJva2VycyM1MzEKLW5haWNzIzUzMTIxI09mZmljZXMgb2YgUmVhbCBFc3RhdGUgQWdlbnRzIGFuZCBCcm9rZXJzIzUzMTIKLW5haWNzIzUzMTMjQWN0aXZpdGllcyBSZWxhdGVkIHRvIFJlYWwgRXN0YXRlIzUzMQotbmFpY3MjNTMxMzEjUmVhbCBFc3RhdGUgUHJvcGVydHkgTWFuYWdlcnMjNTMxMwotbmFpY3MjNTMxMzExI1Jlc2lkZW50aWFsIFByb3BlcnR5IE1hbmFnZXJzIzUzMTMxCi1uYWljcyM1MzEzMTIjTm9ucmVzaWRlbnRpYWwgUHJvcGVydHkgTWFuYWdlcnMjNTMxMzEKLW5haWNzIzUzMTMyI09mZmljZXMgb2YgUmVhbCBFc3RhdGUgQXBwcmFpc2VycyM1MzEzCi1uYWljcyM1MzEzOSNPdGhlciBBY3Rpdml0aWVzIFJlbGF0ZWQgdG8gUmVhbCBFc3RhdGUjNTMxMwotbmFpY3MjNTMyI1JlbnRhbCBhbmQgTGVhc2luZyBTZXJ2aWNlcyM1MwotbmFpY3MjNTMyMSNBdXRvbW90aXZlIEVxdWlwbWVudCBSZW50YWwgYW5kIExlYXNpbmcjNTMyCi1uYWljcyM1MzIxMSNQYXNzZW5nZXIgQ2FyIFJlbnRhbCBhbmQgTGVhc2luZyM1MzIxCi1uYWljcyM1MzIxMTEjUGFzc2VuZ2VyIENhciBSZW50YWwjNTMyMTEKLW5haWNzIzUzMjExMiNQYXNzZW5nZXIgQ2FyIExlYXNpbmcjNTMyMTEKLW5haWNzIzUzMjEyI1RydWNrLCBVdGlsaXR5IFRyYWlsZXIsIGFuZCBSViAoUmVjcmVhdGlvbmFsIFZlaGljbGUpIFJlbnRhbCBhbmQgTGVhc2luZyM1MzIxCi1uYWljcyM1MzIyI0NvbnN1bWVyIEdvb2RzIFJlbnRhbCM1MzIKLW5haWNzIzUzMjIxI0NvbnN1bWVyIEVsZWN0cm9uaWNzIGFuZCBBcHBsaWFuY2VzIFJlbnRhbCM1MzIyCi1uYWljcyM1MzIyMiNGb3JtYWwgV2VhciBhbmQgQ29zdHVtZSBSZW50YWwjNTMyMgotbmFpY3MjNTMyMjMjVmlkZW8gVGFwZSBhbmQgRGlzYyBSZW50YWwjNTMyMgotbmFpY3MjNTMyMjkjT3RoZXIgQ29uc3VtZXIgR29vZHMgUmVudGFsIzUzMjIKLW5haWNzIzUzMjI5MSNIb21lIEhlYWx0aCBFcXVpcG1lbnQgUmVudGFsIzUzMjI5Ci1uYWljcyM1MzIyOTIjUmVjcmVhdGlvbmFsIEdvb2RzIFJlbnRhbCM1MzIyOQotbmFpY3MjNTMyMjk5I0FsbCBPdGhlciBDb25zdW1lciBHb29kcyBSZW50YWwjNTMyMjkKLW5haWNzIzUzMjMjR2VuZXJhbCBSZW50YWwgQ2VudGVycyM1MzIKLW5haWNzIzUzMjMxI0dlbmVyYWwgUmVudGFsIENlbnRlcnMjNTMyMwotbmFpY3MjNTMyNCNDb21tZXJjaWFsIGFuZCBJbmR1c3RyaWFsIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IFJlbnRhbCBhbmQgTGVhc2luZyM1MzIKLW5haWNzIzUzMjQxI0NvbnN0cnVjdGlvbiwgVHJhbnNwb3J0YXRpb24sIE1pbmluZywgYW5kIEZvcmVzdHJ5IE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IFJlbnRhbCBhbmQgTGVhc2luZyM1MzI0Ci1uYWljcyM1MzI0MTEjQ29tbWVyY2lhbCBBaXIsIFJhaWwsIGFuZCBXYXRlciBUcmFuc3BvcnRhdGlvbiBFcXVpcG1lbnQgUmVudGFsIGFuZCBMZWFzaW5nIzUzMjQxCi1uYWljcyM1MzI0MTIjQ29uc3RydWN0aW9uLCBNaW5pbmcsIGFuZCBGb3Jlc3RyeSBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBSZW50YWwgYW5kIExlYXNpbmcjNTMyNDEKLW5haWNzIzUzMjQyI09mZmljZSBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBSZW50YWwgYW5kIExlYXNpbmcjNTMyNAotbmFpY3MjNTMyNDkjT3RoZXIgQ29tbWVyY2lhbCBhbmQgSW5kdXN0cmlhbCBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCBSZW50YWwgYW5kIExlYXNpbmcjNTMyNAotbmFpY3MjNTMzI0xlc3NvcnMgb2YgTm9uZmluYW5jaWFsIEludGFuZ2libGUgQXNzZXRzIChleGNlcHQgQ29weXJpZ2h0ZWQgV29ya3MpIzUzCi1uYWljcyM1MzMxI0xlc3NvcnMgb2YgTm9uZmluYW5jaWFsIEludGFuZ2libGUgQXNzZXRzIChleGNlcHQgQ29weXJpZ2h0ZWQgV29ya3MpIzUzMwotbmFpY3MjNTMzMTEjTGVzc29ycyBvZiBOb25maW5hbmNpYWwgSW50YW5naWJsZSBBc3NldHMgKGV4Y2VwdCBDb3B5cmlnaHRlZCBXb3JrcykjNTMzMQotbmFpY3MjNTQjUHJvZmVzc2lvbmFsLCBTY2llbnRpZmljLCBhbmQgVGVjaG5pY2FsIFNlcnZpY2VzIzU0Ci1uYWljcyM1NDEjUHJvZmVzc2lvbmFsLCBTY2llbnRpZmljLCBhbmQgVGVjaG5pY2FsIFNlcnZpY2VzIzU0Ci1uYWljcyM1NDExI0xlZ2FsIFNlcnZpY2VzIzU0MQotbmFpY3MjNTQxMTEjT2ZmaWNlcyBvZiBMYXd5ZXJzIzU0MTEKLW5haWNzIzU0MTEyI09mZmljZXMgb2YgTm90YXJpZXMjNTQxMQotbmFpY3MjNTQxMTkjT3RoZXIgTGVnYWwgU2VydmljZXMjNTQxMQotbmFpY3MjNTQxMTkxI1RpdGxlIEFic3RyYWN0IGFuZCBTZXR0bGVtZW50IE9mZmljZXMjNTQxMTkKLW5haWNzIzU0MTE5OSNBbGwgT3RoZXIgTGVnYWwgU2VydmljZXMjNTQxMTkKLW5haWNzIzU0MTIjQWNjb3VudGluZywgVGF4IFByZXBhcmF0aW9uLCBCb29ra2VlcGluZywgYW5kIFBheXJvbGwgU2VydmljZXMjNTQxCi1uYWljcyM1NDEyMSNBY2NvdW50aW5nLCBUYXggUHJlcGFyYXRpb24sIEJvb2trZWVwaW5nLCBhbmQgUGF5cm9sbCBTZXJ2aWNlcyM1NDEyCi1uYWljcyM1NDEyMTEjT2ZmaWNlcyBvZiBDZXJ0aWZpZWQgUHVibGljIEFjY291bnRhbnRzIzU0MTIxCi1uYWljcyM1NDEyMTMjVGF4IFByZXBhcmF0aW9uIFNlcnZpY2VzIzU0MTIxCi1uYWljcyM1NDEyMTQjUGF5cm9sbCBTZXJ2aWNlcyM1NDEyMQotbmFpY3MjNTQxMjE5I090aGVyIEFjY291bnRpbmcgU2VydmljZXMjNTQxMjEKLW5haWNzIzU0MTMjQXJjaGl0ZWN0dXJhbCwgRW5naW5lZXJpbmcsIGFuZCBSZWxhdGVkIFNlcnZpY2VzIzU0MQotbmFpY3MjNTQxMzEjQXJjaGl0ZWN0dXJhbCBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzMiNMYW5kc2NhcGUgQXJjaGl0ZWN0dXJhbCBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzMyNFbmdpbmVlcmluZyBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzNCNEcmFmdGluZyBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzNSNCdWlsZGluZyBJbnNwZWN0aW9uIFNlcnZpY2VzIzU0MTMKLW5haWNzIzU0MTM2I0dlb3BoeXNpY2FsIFN1cnZleWluZyBhbmQgTWFwcGluZyBTZXJ2aWNlcyM1NDEzCi1uYWljcyM1NDEzNyNTdXJ2ZXlpbmcgYW5kIE1hcHBpbmcgKGV4Y2VwdCBHZW9waHlzaWNhbCkgU2VydmljZXMjNTQxMwotbmFpY3MjNTQxMzgjVGVzdGluZyBMYWJvcmF0b3JpZXMjNTQxMwotbmFpY3MjNTQxNCNTcGVjaWFsaXplZCBEZXNpZ24gU2VydmljZXMjNTQxCi1uYWljcyM1NDE0MSNJbnRlcmlvciBEZXNpZ24gU2VydmljZXMjNTQxNAotbmFpY3MjNTQxNDIjSW5kdXN0cmlhbCBEZXNpZ24gU2VydmljZXMjNTQxNAotbmFpY3MjNTQxNDMjR3JhcGhpYyBEZXNpZ24gU2VydmljZXMjNTQxNAotbmFpY3MjNTQxNDkjT3RoZXIgU3BlY2lhbGl6ZWQgRGVzaWduIFNlcnZpY2VzIzU0MTQKLW5haWNzIzU0MTUjQ29tcHV0ZXIgU3lzdGVtcyBEZXNpZ24gYW5kIFJlbGF0ZWQgU2VydmljZXMjNTQxCi1uYWljcyM1NDE1MSNDb21wdXRlciBTeXN0ZW1zIERlc2lnbiBhbmQgUmVsYXRlZCBTZXJ2aWNlcyM1NDE1Ci1uYWljcyM1NDE1MTEjQ3VzdG9tIENvbXB1dGVyIFByb2dyYW1taW5nIFNlcnZpY2VzIzU0MTUxCi1uYWljcyM1NDE1MTIjQ29tcHV0ZXIgU3lzdGVtcyBEZXNpZ24gU2VydmljZXMjNTQxNTEKLW5haWNzIzU0MTUxMyNDb21wdXRlciBGYWNpbGl0aWVzIE1hbmFnZW1lbnQgU2VydmljZXMjNTQxNTEKLW5haWNzIzU0MTUxOSNPdGhlciBDb21wdXRlciBSZWxhdGVkIFNlcnZpY2VzIzU0MTUxCi1uYWljcyM1NDE2I01hbmFnZW1lbnQsIFNjaWVudGlmaWMsIGFuZCBUZWNobmljYWwgQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDEKLW5haWNzIzU0MTYxI01hbmFnZW1lbnQgQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDE2Ci1uYWljcyM1NDE2MTEjQWRtaW5pc3RyYXRpdmUgTWFuYWdlbWVudCBhbmQgR2VuZXJhbCBNYW5hZ2VtZW50IENvbnN1bHRpbmcgU2VydmljZXMjNTQxNjEKLW5haWNzIzU0MTYxMiNIdW1hbiBSZXNvdXJjZXMgYW5kIEV4ZWN1dGl2ZSBTZWFyY2ggQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDE2MQotbmFpY3MjNTQxNjEzI01hcmtldGluZyBDb25zdWx0aW5nIFNlcnZpY2VzIzU0MTYxCi1uYWljcyM1NDE2MTQjUHJvY2VzcywgUGh5c2ljYWwgRGlzdHJpYnV0aW9uLCBhbmQgTG9naXN0aWNzIENvbnN1bHRpbmcgU2VydmljZXMjNTQxNjEKLW5haWNzIzU0MTYxOCNPdGhlciBNYW5hZ2VtZW50IENvbnN1bHRpbmcgU2VydmljZXMjNTQxNjEKLW5haWNzIzU0MTYyI0Vudmlyb25tZW50YWwgQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDE2Ci1uYWljcyM1NDE2OSNPdGhlciBTY2llbnRpZmljIGFuZCBUZWNobmljYWwgQ29uc3VsdGluZyBTZXJ2aWNlcyM1NDE2Ci1uYWljcyM1NDE3I1NjaWVudGlmaWMgUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IFNlcnZpY2VzIzU0MQotbmFpY3MjNTQxNzEjUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IGluIHRoZSBQaHlzaWNhbCwgRW5naW5lZXJpbmcsIGFuZCBMaWZlIFNjaWVuY2VzIzU0MTcKLW5haWNzIzU0MTcyI1Jlc2VhcmNoIGFuZCBEZXZlbG9wbWVudCBpbiB0aGUgU29jaWFsIFNjaWVuY2VzIGFuZCBIdW1hbml0aWVzIzU0MTcKLW5haWNzIzU0MTgjQWR2ZXJ0aXNpbmcgYW5kIFJlbGF0ZWQgU2VydmljZXMjNTQxCi1uYWljcyM1NDE4MSNBZHZlcnRpc2luZyBBZ2VuY2llcyM1NDE4Ci1uYWljcyM1NDE4MiNQdWJsaWMgUmVsYXRpb25zIEFnZW5jaWVzIzU0MTgKLW5haWNzIzU0MTgzI01lZGlhIEJ1eWluZyBBZ2VuY2llcyM1NDE4Ci1uYWljcyM1NDE4NCNNZWRpYSBSZXByZXNlbnRhdGl2ZXMjNTQxOAotbmFpY3MjNTQxODUjRGlzcGxheSBBZHZlcnRpc2luZyM1NDE4Ci1uYWljcyM1NDE4NiNEaXJlY3QgTWFpbCBBZHZlcnRpc2luZyM1NDE4Ci1uYWljcyM1NDE4NyNBZHZlcnRpc2luZyBNYXRlcmlhbCBEaXN0cmlidXRpb24gU2VydmljZXMjNTQxOAotbmFpY3MjNTQxODkjT3RoZXIgU2VydmljZXMgUmVsYXRlZCB0byBBZHZlcnRpc2luZyM1NDE4Ci1uYWljcyM1NDE5I090aGVyIFByb2Zlc3Npb25hbCwgU2NpZW50aWZpYywgYW5kIFRlY2huaWNhbCBTZXJ2aWNlcyM1NDEKLW5haWNzIzU0MTkxI01hcmtldGluZyBSZXNlYXJjaCBhbmQgUHVibGljIE9waW5pb24gUG9sbGluZyM1NDE5Ci1uYWljcyM1NDE5MiNQaG90b2dyYXBoaWMgU2VydmljZXMjNTQxOQotbmFpY3MjNTQxOTIxI1Bob3RvZ3JhcGh5IFN0dWRpb3MsIFBvcnRyYWl0IzU0MTkyCi1uYWljcyM1NDE5MjIjQ29tbWVyY2lhbCBQaG90b2dyYXBoeSM1NDE5MgotbmFpY3MjNTQxOTMjVHJhbnNsYXRpb24gYW5kIEludGVycHJldGF0aW9uIFNlcnZpY2VzIzU0MTkKLW5haWNzIzU0MTk0I1ZldGVyaW5hcnkgU2VydmljZXMjNTQxOQotbmFpY3MjNTQxOTkjQWxsIE90aGVyIFByb2Zlc3Npb25hbCwgU2NpZW50aWZpYywgYW5kIFRlY2huaWNhbCBTZXJ2aWNlcyM1NDE5Ci1uYWljcyM1NSNNYW5hZ2VtZW50IG9mIENvbXBhbmllcyBhbmQgRW50ZXJwcmlzZXMjNTUKLW5haWNzIzU1MSNNYW5hZ2VtZW50IG9mIENvbXBhbmllcyBhbmQgRW50ZXJwcmlzZXMjNTUKLW5haWNzIzU1MTEjTWFuYWdlbWVudCBvZiBDb21wYW5pZXMgYW5kIEVudGVycHJpc2VzIzU1MQotbmFpY3MjNTUxMTEjTWFuYWdlbWVudCBvZiBDb21wYW5pZXMgYW5kIEVudGVycHJpc2VzIzU1MTEKLW5haWNzIzU1MTExMSNPZmZpY2VzIG9mIEJhbmsgSG9sZGluZyBDb21wYW5pZXMjNTUxMTEKLW5haWNzIzU1MTExMiNPZmZpY2VzIG9mIE90aGVyIEhvbGRpbmcgQ29tcGFuaWVzIzU1MTExCi1uYWljcyM1NTExMTQjQ29ycG9yYXRlLCBTdWJzaWRpYXJ5LCBhbmQgUmVnaW9uYWwgTWFuYWdpbmcgT2ZmaWNlcyM1NTExMQotbmFpY3MjNTYjQWRtaW5pc3RyYXRpdmUgYW5kIFN1cHBvcnQgYW5kIFdhc3RlIE1hbmFnZW1lbnQgYW5kIFJlbWVkaWF0aW9uIFNlcnZpY2VzIzU2Ci1uYWljcyM1NjEjQWRtaW5pc3RyYXRpdmUgYW5kIFN1cHBvcnQgU2VydmljZXMjNTYKLW5haWNzIzU2MTEjT2ZmaWNlIEFkbWluaXN0cmF0aXZlIFNlcnZpY2VzIzU2MQotbmFpY3MjNTYxMTEjT2ZmaWNlIEFkbWluaXN0cmF0aXZlIFNlcnZpY2VzIzU2MTEKLW5haWNzIzU2MTIjRmFjaWxpdGllcyBTdXBwb3J0IFNlcnZpY2VzIzU2MQotbmFpY3MjNTYxMjEjRmFjaWxpdGllcyBTdXBwb3J0IFNlcnZpY2VzIzU2MTIKLW5haWNzIzU2MTMjRW1wbG95bWVudCBTZXJ2aWNlcyM1NjEKLW5haWNzIzU2MTMxI0VtcGxveW1lbnQgUGxhY2VtZW50IEFnZW5jaWVzIzU2MTMKLW5haWNzIzU2MTMyI1RlbXBvcmFyeSBIZWxwIFNlcnZpY2VzIzU2MTMKLW5haWNzIzU2MTMzI0VtcGxveWVlIExlYXNpbmcgU2VydmljZXMjNTYxMwotbmFpY3MjNTYxNCNCdXNpbmVzcyBTdXBwb3J0IFNlcnZpY2VzIzU2MQotbmFpY3MjNTYxNDEjRG9jdW1lbnQgUHJlcGFyYXRpb24gU2VydmljZXMjNTYxNAotbmFpY3MjNTYxNDIjVGVsZXBob25lIENhbGwgQ2VudGVycyM1NjE0Ci1uYWljcyM1NjE0MjEjVGVsZXBob25lIEFuc3dlcmluZyBTZXJ2aWNlcyM1NjE0MgotbmFpY3MjNTYxNDIyI1RlbGVtYXJrZXRpbmcgQnVyZWF1cyM1NjE0MgotbmFpY3MjNTYxNDMjQnVzaW5lc3MgU2VydmljZSBDZW50ZXJzIzU2MTQKLW5haWNzIzU2MTQzMSNQcml2YXRlIE1haWwgQ2VudGVycyM1NjE0MwotbmFpY3MjNTYxNDM5I090aGVyIEJ1c2luZXNzIFNlcnZpY2UgQ2VudGVycyAoaW5jbHVkaW5nIENvcHkgU2hvcHMpIzU2MTQzCi1uYWljcyM1NjE0NCNDb2xsZWN0aW9uIEFnZW5jaWVzIzU2MTQKLW5haWNzIzU2MTQ1I0NyZWRpdCBCdXJlYXVzIzU2MTQKLW5haWNzIzU2MTQ5I090aGVyIEJ1c2luZXNzIFN1cHBvcnQgU2VydmljZXMjNTYxNAotbmFpY3MjNTYxNDkxI1JlcG9zc2Vzc2lvbiBTZXJ2aWNlcyM1NjE0OQotbmFpY3MjNTYxNDkyI0NvdXJ0IFJlcG9ydGluZyBhbmQgU3Rlbm90eXBlIFNlcnZpY2VzIzU2MTQ5Ci1uYWljcyM1NjE0OTkjQWxsIE90aGVyIEJ1c2luZXNzIFN1cHBvcnQgU2VydmljZXMjNTYxNDkKLW5haWNzIzU2MTUjVHJhdmVsIEFycmFuZ2VtZW50IGFuZCBSZXNlcnZhdGlvbiBTZXJ2aWNlcyM1NjEKLW5haWNzIzU2MTUxI1RyYXZlbCBBZ2VuY2llcyM1NjE1Ci1uYWljcyM1NjE1MiNUb3VyIE9wZXJhdG9ycyM1NjE1Ci1uYWljcyM1NjE1OSNPdGhlciBUcmF2ZWwgQXJyYW5nZW1lbnQgYW5kIFJlc2VydmF0aW9uIFNlcnZpY2VzIzU2MTUKLW5haWNzIzU2MTU5MSNDb252ZW50aW9uIGFuZCBWaXNpdG9ycyBCdXJlYXVzIzU2MTU5Ci1uYWljcyM1NjE1OTkjQWxsIE90aGVyIFRyYXZlbCBBcnJhbmdlbWVudCBhbmQgUmVzZXJ2YXRpb24gU2VydmljZXMjNTYxNTkKLW5haWNzIzU2MTYjSW52ZXN0aWdhdGlvbiBhbmQgU2VjdXJpdHkgU2VydmljZXMjNTYxCi1uYWljcyM1NjE2MSNJbnZlc3RpZ2F0aW9uLCBHdWFyZCwgYW5kIEFybW9yZWQgQ2FyIFNlcnZpY2VzIzU2MTYKLW5haWNzIzU2MTYxMSNJbnZlc3RpZ2F0aW9uIFNlcnZpY2VzIzU2MTYxCi1uYWljcyM1NjE2MTIjU2VjdXJpdHkgR3VhcmRzIGFuZCBQYXRyb2wgU2VydmljZXMjNTYxNjEKLW5haWNzIzU2MTYxMyNBcm1vcmVkIENhciBTZXJ2aWNlcyM1NjE2MQotbmFpY3MjNTYxNjIjU2VjdXJpdHkgU3lzdGVtcyBTZXJ2aWNlcyM1NjE2Ci1uYWljcyM1NjE2MjEjU2VjdXJpdHkgU3lzdGVtcyBTZXJ2aWNlcyAoZXhjZXB0IExvY2tzbWl0aHMpIzU2MTYyCi1uYWljcyM1NjE2MjIjTG9ja3NtaXRocyM1NjE2MgotbmFpY3MjNTYxNyNTZXJ2aWNlcyB0byBCdWlsZGluZ3MgYW5kIER3ZWxsaW5ncyM1NjEKLW5haWNzIzU2MTcxI0V4dGVybWluYXRpbmcgYW5kIFBlc3QgQ29udHJvbCBTZXJ2aWNlcyM1NjE3Ci1uYWljcyM1NjE3MiNKYW5pdG9yaWFsIFNlcnZpY2VzIzU2MTcKLW5haWNzIzU2MTczI0xhbmRzY2FwaW5nIFNlcnZpY2VzIzU2MTcKLW5haWNzIzU2MTc0I0NhcnBldCBhbmQgVXBob2xzdGVyeSBDbGVhbmluZyBTZXJ2aWNlcyM1NjE3Ci1uYWljcyM1NjE3OSNPdGhlciBTZXJ2aWNlcyB0byBCdWlsZGluZ3MgYW5kIER3ZWxsaW5ncyM1NjE3Ci1uYWljcyM1NjE5I090aGVyIFN1cHBvcnQgU2VydmljZXMjNTYxCi1uYWljcyM1NjE5MSNQYWNrYWdpbmcgYW5kIExhYmVsaW5nIFNlcnZpY2VzIzU2MTkKLW5haWNzIzU2MTkyI0NvbnZlbnRpb24gYW5kIFRyYWRlIFNob3cgT3JnYW5pemVycyM1NjE5Ci1uYWljcyM1NjE5OSNBbGwgT3RoZXIgU3VwcG9ydCBTZXJ2aWNlcyM1NjE5Ci1uYWljcyM1NjIjV2FzdGUgTWFuYWdlbWVudCBhbmQgUmVtZWRpYXRpb24gU2VydmljZXMjNTYKLW5haWNzIzU2MjEjV2FzdGUgQ29sbGVjdGlvbiM1NjIKLW5haWNzIzU2MjExI1dhc3RlIENvbGxlY3Rpb24jNTYyMQotbmFpY3MjNTYyMTExI1NvbGlkIFdhc3RlIENvbGxlY3Rpb24jNTYyMTEKLW5haWNzIzU2MjExMiNIYXphcmRvdXMgV2FzdGUgQ29sbGVjdGlvbiM1NjIxMQotbmFpY3MjNTYyMTE5I090aGVyIFdhc3RlIENvbGxlY3Rpb24jNTYyMTEKLW5haWNzIzU2MjIjV2FzdGUgVHJlYXRtZW50IGFuZCBEaXNwb3NhbCM1NjIKLW5haWNzIzU2MjIxI1dhc3RlIFRyZWF0bWVudCBhbmQgRGlzcG9zYWwjNTYyMgotbmFpY3MjNTYyMjExI0hhemFyZG91cyBXYXN0ZSBUcmVhdG1lbnQgYW5kIERpc3Bvc2FsIzU2MjIxCi1uYWljcyM1NjIyMTIjU29saWQgV2FzdGUgTGFuZGZpbGwjNTYyMjEKLW5haWNzIzU2MjIxMyNTb2xpZCBXYXN0ZSBDb21idXN0b3JzIGFuZCBJbmNpbmVyYXRvcnMjNTYyMjEKLW5haWNzIzU2MjIxOSNPdGhlciBOb25oYXphcmRvdXMgV2FzdGUgVHJlYXRtZW50IGFuZCBEaXNwb3NhbCM1NjIyMQotbmFpY3MjNTYyOSNSZW1lZGlhdGlvbiBhbmQgT3RoZXIgV2FzdGUgTWFuYWdlbWVudCBTZXJ2aWNlcyM1NjIKLW5haWNzIzU2MjkxI1JlbWVkaWF0aW9uIFNlcnZpY2VzIzU2MjkKLW5haWNzIzU2MjkyI01hdGVyaWFscyBSZWNvdmVyeSBGYWNpbGl0aWVzIzU2MjkKLW5haWNzIzU2Mjk5I0FsbCBPdGhlciBXYXN0ZSBNYW5hZ2VtZW50IFNlcnZpY2VzIzU2MjkKLW5haWNzIzU2Mjk5MSNTZXB0aWMgVGFuayBhbmQgUmVsYXRlZCBTZXJ2aWNlcyM1NjI5OQotbmFpY3MjNTYyOTk4I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIFdhc3RlIE1hbmFnZW1lbnQgU2VydmljZXMjNTYyOTkKLW5haWNzIzYxI0VkdWNhdGlvbmFsIFNlcnZpY2VzIzYxCi1uYWljcyM2MTEjRWR1Y2F0aW9uYWwgU2VydmljZXMjNjEKLW5haWNzIzYxMTEjRWxlbWVudGFyeSBhbmQgU2Vjb25kYXJ5IFNjaG9vbHMjNjExCi1uYWljcyM2MTExMSNFbGVtZW50YXJ5IGFuZCBTZWNvbmRhcnkgU2Nob29scyM2MTExCi1uYWljcyM2MTEyI0p1bmlvciBDb2xsZWdlcyM2MTEKLW5haWNzIzYxMTIxI0p1bmlvciBDb2xsZWdlcyM2MTEyCi1uYWljcyM2MTEzI0NvbGxlZ2VzLCBVbml2ZXJzaXRpZXMsIGFuZCBQcm9mZXNzaW9uYWwgU2Nob29scyM2MTEKLW5haWNzIzYxMTMxI0NvbGxlZ2VzLCBVbml2ZXJzaXRpZXMsIGFuZCBQcm9mZXNzaW9uYWwgU2Nob29scyM2MTEzCi1uYWljcyM2MTE0I0J1c2luZXNzIFNjaG9vbHMgYW5kIENvbXB1dGVyIGFuZCBNYW5hZ2VtZW50IFRyYWluaW5nIzYxMQotbmFpY3MjNjExNDEjQnVzaW5lc3MgYW5kIFNlY3JldGFyaWFsIFNjaG9vbHMjNjExNAotbmFpY3MjNjExNDIjQ29tcHV0ZXIgVHJhaW5pbmcjNjExNAotbmFpY3MjNjExNDMjUHJvZmVzc2lvbmFsIGFuZCBNYW5hZ2VtZW50IERldmVsb3BtZW50IFRyYWluaW5nIzYxMTQKLW5haWNzIzYxMTUjVGVjaG5pY2FsIGFuZCBUcmFkZSBTY2hvb2xzIzYxMQotbmFpY3MjNjExNTEjVGVjaG5pY2FsIGFuZCBUcmFkZSBTY2hvb2xzIzYxMTUKLW5haWNzIzYxMTUxMSNDb3NtZXRvbG9neSBhbmQgQmFyYmVyIFNjaG9vbHMjNjExNTEKLW5haWNzIzYxMTUxMiNGbGlnaHQgVHJhaW5pbmcjNjExNTEKLW5haWNzIzYxMTUxMyNBcHByZW50aWNlc2hpcCBUcmFpbmluZyM2MTE1MQotbmFpY3MjNjExNTE5I090aGVyIFRlY2huaWNhbCBhbmQgVHJhZGUgU2Nob29scyM2MTE1MQotbmFpY3MjNjExNiNPdGhlciBTY2hvb2xzIGFuZCBJbnN0cnVjdGlvbiM2MTEKLW5haWNzIzYxMTYxI0ZpbmUgQXJ0cyBTY2hvb2xzIzYxMTYKLW5haWNzIzYxMTYyI1Nwb3J0cyBhbmQgUmVjcmVhdGlvbiBJbnN0cnVjdGlvbiM2MTE2Ci1uYWljcyM2MTE2MyNMYW5ndWFnZSBTY2hvb2xzIzYxMTYKLW5haWNzIzYxMTY5I0FsbCBPdGhlciBTY2hvb2xzIGFuZCBJbnN0cnVjdGlvbiM2MTE2Ci1uYWljcyM2MTE2OTEjRXhhbSBQcmVwYXJhdGlvbiBhbmQgVHV0b3JpbmcjNjExNjkKLW5haWNzIzYxMTY5MiNBdXRvbW9iaWxlIERyaXZpbmcgU2Nob29scyM2MTE2OQotbmFpY3MjNjExNjk5I0FsbCBPdGhlciBNaXNjZWxsYW5lb3VzIFNjaG9vbHMgYW5kIEluc3RydWN0aW9uIzYxMTY5Ci1uYWljcyM2MTE3I0VkdWNhdGlvbmFsIFN1cHBvcnQgU2VydmljZXMjNjExCi1uYWljcyM2MTE3MSNFZHVjYXRpb25hbCBTdXBwb3J0IFNlcnZpY2VzIzYxMTcKLW5haWNzIzYyI0hlYWx0aCBDYXJlIGFuZCBTb2NpYWwgQXNzaXN0YW5jZSM2MgotbmFpY3MjNjIxI0FtYnVsYXRvcnkgSGVhbHRoIENhcmUgU2VydmljZXMjNjIKLW5haWNzIzYyMTEjT2ZmaWNlcyBvZiBQaHlzaWNpYW5zIzYyMQotbmFpY3MjNjIxMTEjT2ZmaWNlcyBvZiBQaHlzaWNpYW5zIzYyMTEKLW5haWNzIzYyMTExMSNPZmZpY2VzIG9mIFBoeXNpY2lhbnMgKGV4Y2VwdCBNZW50YWwgSGVhbHRoIFNwZWNpYWxpc3RzKSM2MjExMQotbmFpY3MjNjIxMTEyI09mZmljZXMgb2YgUGh5c2ljaWFucywgTWVudGFsIEhlYWx0aCBTcGVjaWFsaXN0cyM2MjExMQotbmFpY3MjNjIxMiNPZmZpY2VzIG9mIERlbnRpc3RzIzYyMQotbmFpY3MjNjIxMjEjT2ZmaWNlcyBvZiBEZW50aXN0cyM2MjEyCi1uYWljcyM2MjEzI09mZmljZXMgb2YgT3RoZXIgSGVhbHRoIFByYWN0aXRpb25lcnMjNjIxCi1uYWljcyM2MjEzMSNPZmZpY2VzIG9mIENoaXJvcHJhY3RvcnMjNjIxMwotbmFpY3MjNjIxMzIjT2ZmaWNlcyBvZiBPcHRvbWV0cmlzdHMjNjIxMwotbmFpY3MjNjIxMzMjT2ZmaWNlcyBvZiBNZW50YWwgSGVhbHRoIFByYWN0aXRpb25lcnMgKGV4Y2VwdCBQaHlzaWNpYW5zKSM2MjEzCi1uYWljcyM2MjEzNCNPZmZpY2VzIG9mIFBoeXNpY2FsLCBPY2N1cGF0aW9uYWwgYW5kIFNwZWVjaCBUaGVyYXBpc3RzLCBhbmQgQXVkaW9sb2dpc3RzIzYyMTMKLW5haWNzIzYyMTM5I09mZmljZXMgb2YgQWxsIE90aGVyIEhlYWx0aCBQcmFjdGl0aW9uZXJzIzYyMTMKLW5haWNzIzYyMTM5MSNPZmZpY2VzIG9mIFBvZGlhdHJpc3RzIzYyMTM5Ci1uYWljcyM2MjEzOTkjT2ZmaWNlcyBvZiBBbGwgT3RoZXIgTWlzY2VsbGFuZW91cyBIZWFsdGggUHJhY3RpdGlvbmVycyM2MjEzOQotbmFpY3MjNjIxNCNPdXRwYXRpZW50IENhcmUgQ2VudGVycyM2MjEKLW5haWNzIzYyMTQxI0ZhbWlseSBQbGFubmluZyBDZW50ZXJzIzYyMTQKLW5haWNzIzYyMTQyI091dHBhdGllbnQgTWVudGFsIEhlYWx0aCBhbmQgU3Vic3RhbmNlIEFidXNlIENlbnRlcnMjNjIxNAotbmFpY3MjNjIxNDkjT3RoZXIgT3V0cGF0aWVudCBDYXJlIENlbnRlcnMjNjIxNAotbmFpY3MjNjIxNDkxI0hNTyBNZWRpY2FsIENlbnRlcnMjNjIxNDkKLW5haWNzIzYyMTQ5MiNLaWRuZXkgRGlhbHlzaXMgQ2VudGVycyM2MjE0OQotbmFpY3MjNjIxNDkzI0ZyZWVzdGFuZGluZyBBbWJ1bGF0b3J5IFN1cmdpY2FsIGFuZCBFbWVyZ2VuY3kgQ2VudGVycyM2MjE0OQotbmFpY3MjNjIxNDk4I0FsbCBPdGhlciBPdXRwYXRpZW50IENhcmUgQ2VudGVycyM2MjE0OQotbmFpY3MjNjIxNSNNZWRpY2FsIGFuZCBEaWFnbm9zdGljIExhYm9yYXRvcmllcyM2MjEKLW5haWNzIzYyMTUxI01lZGljYWwgYW5kIERpYWdub3N0aWMgTGFib3JhdG9yaWVzIzYyMTUKLW5haWNzIzYyMTUxMSNNZWRpY2FsIExhYm9yYXRvcmllcyM2MjE1MQotbmFpY3MjNjIxNTEyI0RpYWdub3N0aWMgSW1hZ2luZyBDZW50ZXJzIzYyMTUxCi1uYWljcyM2MjE2I0hvbWUgSGVhbHRoIENhcmUgU2VydmljZXMjNjIxCi1uYWljcyM2MjE2MSNIb21lIEhlYWx0aCBDYXJlIFNlcnZpY2VzIzYyMTYKLW5haWNzIzYyMTkjT3RoZXIgQW1idWxhdG9yeSBIZWFsdGggQ2FyZSBTZXJ2aWNlcyM2MjEKLW5haWNzIzYyMTkxI0FtYnVsYW5jZSBTZXJ2aWNlcyM2MjE5Ci1uYWljcyM2MjE5OSNBbGwgT3RoZXIgQW1idWxhdG9yeSBIZWFsdGggQ2FyZSBTZXJ2aWNlcyM2MjE5Ci1uYWljcyM2MjE5OTEjQmxvb2QgYW5kIE9yZ2FuIEJhbmtzIzYyMTk5Ci1uYWljcyM2MjE5OTkjQWxsIE90aGVyIE1pc2NlbGxhbmVvdXMgQW1idWxhdG9yeSBIZWFsdGggQ2FyZSBTZXJ2aWNlcyM2MjE5OQotbmFpY3MjNjIyI0hvc3BpdGFscyM2MgotbmFpY3MjNjIyMSNHZW5lcmFsIE1lZGljYWwgYW5kIFN1cmdpY2FsIEhvc3BpdGFscyM2MjIKLW5haWNzIzYyMjExI0dlbmVyYWwgTWVkaWNhbCBhbmQgU3VyZ2ljYWwgSG9zcGl0YWxzIzYyMjEKLW5haWNzIzYyMjIjUHN5Y2hpYXRyaWMgYW5kIFN1YnN0YW5jZSBBYnVzZSBIb3NwaXRhbHMjNjIyCi1uYWljcyM2MjIyMSNQc3ljaGlhdHJpYyBhbmQgU3Vic3RhbmNlIEFidXNlIEhvc3BpdGFscyM2MjIyCi1uYWljcyM2MjIzI1NwZWNpYWx0eSAoZXhjZXB0IFBzeWNoaWF0cmljIGFuZCBTdWJzdGFuY2UgQWJ1c2UpIEhvc3BpdGFscyM2MjIKLW5haWNzIzYyMjMxI1NwZWNpYWx0eSAoZXhjZXB0IFBzeWNoaWF0cmljIGFuZCBTdWJzdGFuY2UgQWJ1c2UpIEhvc3BpdGFscyM2MjIzCi1uYWljcyM2MjMjTnVyc2luZyBhbmQgUmVzaWRlbnRpYWwgQ2FyZSBGYWNpbGl0aWVzIzYyCi1uYWljcyM2MjMxI051cnNpbmcgQ2FyZSBGYWNpbGl0aWVzIzYyMwotbmFpY3MjNjIzMTEjTnVyc2luZyBDYXJlIEZhY2lsaXRpZXMjNjIzMQotbmFpY3MjNjIzMiNSZXNpZGVudGlhbCBNZW50YWwgUmV0YXJkYXRpb24sIE1lbnRhbCBIZWFsdGggYW5kIFN1YnN0YW5jZSBBYnVzZSBGYWNpbGl0aWVzIzYyMwotbmFpY3MjNjIzMjEjUmVzaWRlbnRpYWwgTWVudGFsIFJldGFyZGF0aW9uIEZhY2lsaXRpZXMjNjIzMgotbmFpY3MjNjIzMjIjUmVzaWRlbnRpYWwgTWVudGFsIEhlYWx0aCBhbmQgU3Vic3RhbmNlIEFidXNlIEZhY2lsaXRpZXMjNjIzMgotbmFpY3MjNjIzMyNDb21tdW5pdHkgQ2FyZSBGYWNpbGl0aWVzIGZvciB0aGUgRWxkZXJseSM2MjMKLW5haWNzIzYyMzMxI0NvbW11bml0eSBDYXJlIEZhY2lsaXRpZXMgZm9yIHRoZSBFbGRlcmx5IzYyMzMKLW5haWNzIzYyMzMxMSNDb250aW51aW5nIENhcmUgUmV0aXJlbWVudCBDb21tdW5pdGllcyM2MjMzMQotbmFpY3MjNjIzMzEyI0hvbWVzIGZvciB0aGUgRWxkZXJseSM2MjMzMQotbmFpY3MjNjIzOSNPdGhlciBSZXNpZGVudGlhbCBDYXJlIEZhY2lsaXRpZXMjNjIzCi1uYWljcyM2MjM5OSNPdGhlciBSZXNpZGVudGlhbCBDYXJlIEZhY2lsaXRpZXMjNjIzOQotbmFpY3MjNjI0I1NvY2lhbCBBc3Npc3RhbmNlIzYyCi1uYWljcyM2MjQxI0luZGl2aWR1YWwgYW5kIEZhbWlseSBTZXJ2aWNlcyM2MjQKLW5haWNzIzYyNDExI0NoaWxkIGFuZCBZb3V0aCBTZXJ2aWNlcyM2MjQxCi1uYWljcyM2MjQxMiNTZXJ2aWNlcyBmb3IgdGhlIEVsZGVybHkgYW5kIFBlcnNvbnMgd2l0aCBEaXNhYmlsaXRpZXMjNjI0MQotbmFpY3MjNjI0MTkjT3RoZXIgSW5kaXZpZHVhbCBhbmQgRmFtaWx5IFNlcnZpY2VzIzYyNDEKLW5haWNzIzYyNDIjQ29tbXVuaXR5IEZvb2QgYW5kIEhvdXNpbmcsIGFuZCBFbWVyZ2VuY3kgYW5kIE90aGVyIFJlbGllZiBTZXJ2aWNlcyM2MjQKLW5haWNzIzYyNDIxI0NvbW11bml0eSBGb29kIFNlcnZpY2VzIzYyNDIKLW5haWNzIzYyNDIyI0NvbW11bml0eSBIb3VzaW5nIFNlcnZpY2VzIzYyNDIKLW5haWNzIzYyNDIyMSNUZW1wb3JhcnkgU2hlbHRlcnMjNjI0MjIKLW5haWNzIzYyNDIyOSNPdGhlciBDb21tdW5pdHkgSG91c2luZyBTZXJ2aWNlcyM2MjQyMgotbmFpY3MjNjI0MjMjRW1lcmdlbmN5IGFuZCBPdGhlciBSZWxpZWYgU2VydmljZXMjNjI0MgotbmFpY3MjNjI0MyNWb2NhdGlvbmFsIFJlaGFiaWxpdGF0aW9uIFNlcnZpY2VzIzYyNAotbmFpY3MjNjI0MzEjVm9jYXRpb25hbCBSZWhhYmlsaXRhdGlvbiBTZXJ2aWNlcyM2MjQzCi1uYWljcyM2MjQ0I0NoaWxkIERheSBDYXJlIFNlcnZpY2VzIzYyNAotbmFpY3MjNjI0NDEjQ2hpbGQgRGF5IENhcmUgU2VydmljZXMjNjI0NAotbmFpY3MjNzEjQXJ0cywgRW50ZXJ0YWlubWVudCwgYW5kIFJlY3JlYXRpb24jNzEKLW5haWNzIzcxMSNQZXJmb3JtaW5nIEFydHMsIFNwZWN0YXRvciBTcG9ydHMsIGFuZCBSZWxhdGVkIEluZHVzdHJpZXMjNzEKLW5haWNzIzcxMTEjUGVyZm9ybWluZyBBcnRzIENvbXBhbmllcyM3MTEKLW5haWNzIzcxMTExI1RoZWF0ZXIgQ29tcGFuaWVzIGFuZCBEaW5uZXIgVGhlYXRlcnMjNzExMQotbmFpY3MjNzExMTIjRGFuY2UgQ29tcGFuaWVzIzcxMTEKLW5haWNzIzcxMTEzI011c2ljYWwgR3JvdXBzIGFuZCBBcnRpc3RzIzcxMTEKLW5haWNzIzcxMTE5I090aGVyIFBlcmZvcm1pbmcgQXJ0cyBDb21wYW5pZXMjNzExMQotbmFpY3MjNzExMiNTcGVjdGF0b3IgU3BvcnRzIzcxMQotbmFpY3MjNzExMjEjU3BlY3RhdG9yIFNwb3J0cyM3MTEyCi1uYWljcyM3MTEyMTEjU3BvcnRzIFRlYW1zIGFuZCBDbHVicyM3MTEyMQotbmFpY3MjNzExMjEyI1JhY2V0cmFja3MjNzExMjEKLW5haWNzIzcxMTIxOSNPdGhlciBTcGVjdGF0b3IgU3BvcnRzIzcxMTIxCi1uYWljcyM3MTEzI1Byb21vdGVycyBvZiBQZXJmb3JtaW5nIEFydHMsIFNwb3J0cywgYW5kIFNpbWlsYXIgRXZlbnRzIzcxMQotbmFpY3MjNzExMzEjUHJvbW90ZXJzIG9mIFBlcmZvcm1pbmcgQXJ0cywgU3BvcnRzLCBhbmQgU2ltaWxhciBFdmVudHMgd2l0aCBGYWNpbGl0aWVzIzcxMTMKLW5haWNzIzcxMTMyI1Byb21vdGVycyBvZiBQZXJmb3JtaW5nIEFydHMsIFNwb3J0cywgYW5kIFNpbWlsYXIgRXZlbnRzIHdpdGhvdXQgRmFjaWxpdGllcyM3MTEzCi1uYWljcyM3MTE0I0FnZW50cyBhbmQgTWFuYWdlcnMgZm9yIEFydGlzdHMsIEF0aGxldGVzLCBFbnRlcnRhaW5lcnMsIGFuZCBPdGhlciBQdWJsaWMgRmlndXJlcyM3MTEKLW5haWNzIzcxMTQxI0FnZW50cyBhbmQgTWFuYWdlcnMgZm9yIEFydGlzdHMsIEF0aGxldGVzLCBFbnRlcnRhaW5lcnMsIGFuZCBPdGhlciBQdWJsaWMgRmlndXJlcyM3MTE0Ci1uYWljcyM3MTE1I0luZGVwZW5kZW50IEFydGlzdHMsIFdyaXRlcnMsIGFuZCBQZXJmb3JtZXJzIzcxMQotbmFpY3MjNzExNTEjSW5kZXBlbmRlbnQgQXJ0aXN0cywgV3JpdGVycywgYW5kIFBlcmZvcm1lcnMjNzExNQotbmFpY3MjNzEyI011c2V1bXMsIEhpc3RvcmljYWwgU2l0ZXMsIGFuZCBTaW1pbGFyIEluc3RpdHV0aW9ucyM3MQotbmFpY3MjNzEyMSNNdXNldW1zLCBIaXN0b3JpY2FsIFNpdGVzLCBhbmQgU2ltaWxhciBJbnN0aXR1dGlvbnMjNzEyCi1uYWljcyM3MTIxMSNNdXNldW1zIzcxMjEKLW5haWNzIzcxMjEyI0hpc3RvcmljYWwgU2l0ZXMjNzEyMQotbmFpY3MjNzEyMTMjWm9vcyBhbmQgQm90YW5pY2FsIEdhcmRlbnMjNzEyMQotbmFpY3MjNzEyMTkjTmF0dXJlIFBhcmtzIGFuZCBPdGhlciBTaW1pbGFyIEluc3RpdHV0aW9ucyM3MTIxCi1uYWljcyM3MTMjQW11c2VtZW50LCBHYW1ibGluZywgYW5kIFJlY3JlYXRpb24gSW5kdXN0cmllcyM3MQotbmFpY3MjNzEzMSNBbXVzZW1lbnQgUGFya3MgYW5kIEFyY2FkZXMjNzEzCi1uYWljcyM3MTMxMSNBbXVzZW1lbnQgYW5kIFRoZW1lIFBhcmtzIzcxMzEKLW5haWNzIzcxMzEyI0FtdXNlbWVudCBBcmNhZGVzIzcxMzEKLW5haWNzIzcxMzIjR2FtYmxpbmcgSW5kdXN0cmllcyM3MTMKLW5haWNzIzcxMzIxI0Nhc2lub3MgKGV4Y2VwdCBDYXNpbm8gSG90ZWxzKSM3MTMyCi1uYWljcyM3MTMyOSNPdGhlciBHYW1ibGluZyBJbmR1c3RyaWVzIzcxMzIKLW5haWNzIzcxMzkjT3RoZXIgQW11c2VtZW50IGFuZCBSZWNyZWF0aW9uIEluZHVzdHJpZXMjNzEzCi1uYWljcyM3MTM5MSNHb2xmIENvdXJzZXMgYW5kIENvdW50cnkgQ2x1YnMjNzEzOQotbmFpY3MjNzEzOTIjU2tpaW5nIEZhY2lsaXRpZXMjNzEzOQotbmFpY3MjNzEzOTMjTWFyaW5hcyM3MTM5Ci1uYWljcyM3MTM5NCNGaXRuZXNzIGFuZCBSZWNyZWF0aW9uYWwgU3BvcnRzIENlbnRlcnMjNzEzOQotbmFpY3MjNzEzOTUjQm93bGluZyBDZW50ZXJzIzcxMzkKLW5haWNzIzcxMzk5I0FsbCBPdGhlciBBbXVzZW1lbnQgYW5kIFJlY3JlYXRpb24gSW5kdXN0cmllcyM3MTM5Ci1uYWljcyM3MiNBY2NvbW1vZGF0aW9uIGFuZCBGb29kIFNlcnZpY2VzIzcyCi1uYWljcyM3MjEjQWNjb21tb2RhdGlvbiM3MgotbmFpY3MjNzIxMSNUcmF2ZWxlciBBY2NvbW1vZGF0aW9uIzcyMQotbmFpY3MjNzIxMTEjSG90ZWxzIChleGNlcHQgQ2FzaW5vIEhvdGVscykgYW5kIE1vdGVscyM3MjExCi1uYWljcyM3MjExMiNDYXNpbm8gSG90ZWxzIzcyMTEKLW5haWNzIzcyMTE5I090aGVyIFRyYXZlbGVyIEFjY29tbW9kYXRpb24jNzIxMQotbmFpY3MjNzIxMTkxI0JlZC1hbmQtQnJlYWtmYXN0IElubnMjNzIxMTkKLW5haWNzIzcyMTE5OSNBbGwgT3RoZXIgVHJhdmVsZXIgQWNjb21tb2RhdGlvbiM3MjExOQotbmFpY3MjNzIxMiNSViAoUmVjcmVhdGlvbmFsIFZlaGljbGUpIFBhcmtzIGFuZCBSZWNyZWF0aW9uYWwgQ2FtcHMjNzIxCi1uYWljcyM3MjEyMSNSViAoUmVjcmVhdGlvbmFsIFZlaGljbGUpIFBhcmtzIGFuZCBSZWNyZWF0aW9uYWwgQ2FtcHMjNzIxMgotbmFpY3MjNzIxMjExI1JWIChSZWNyZWF0aW9uYWwgVmVoaWNsZSkgUGFya3MgYW5kIENhbXBncm91bmRzIzcyMTIxCi1uYWljcyM3MjEyMTQjUmVjcmVhdGlvbmFsIGFuZCBWYWNhdGlvbiBDYW1wcyAoZXhjZXB0IENhbXBncm91bmRzKSM3MjEyMQotbmFpY3MjNzIxMyNSb29taW5nIGFuZCBCb2FyZGluZyBIb3VzZXMjNzIxCi1uYWljcyM3MjEzMSNSb29taW5nIGFuZCBCb2FyZGluZyBIb3VzZXMjNzIxMwotbmFpY3MjNzIyI0Zvb2QgU2VydmljZXMgYW5kIERyaW5raW5nIFBsYWNlcyM3MgotbmFpY3MjNzIyMSNGdWxsLVNlcnZpY2UgUmVzdGF1cmFudHMjNzIyCi1uYWljcyM3MjIxMSNGdWxsLVNlcnZpY2UgUmVzdGF1cmFudHMjNzIyMQotbmFpY3MjNzIyMiNMaW1pdGVkLVNlcnZpY2UgRWF0aW5nIFBsYWNlcyM3MjIKLW5haWNzIzcyMjIxI0xpbWl0ZWQtU2VydmljZSBFYXRpbmcgUGxhY2VzIzcyMjIKLW5haWNzIzcyMjIxMSNMaW1pdGVkLVNlcnZpY2UgUmVzdGF1cmFudHMjNzIyMjEKLW5haWNzIzcyMjIxMiNDYWZldGVyaWFzIzcyMjIxCi1uYWljcyM3MjIyMTMjU25hY2sgYW5kIE5vbmFsY29ob2xpYyBCZXZlcmFnZSBCYXJzIzcyMjIxCi1uYWljcyM3MjIzI1NwZWNpYWwgRm9vZCBTZXJ2aWNlcyM3MjIKLW5haWNzIzcyMjMxI0Zvb2QgU2VydmljZSBDb250cmFjdG9ycyM3MjIzCi1uYWljcyM3MjIzMiNDYXRlcmVycyM3MjIzCi1uYWljcyM3MjIzMyNNb2JpbGUgRm9vZCBTZXJ2aWNlcyM3MjIzCi1uYWljcyM3MjI0I0RyaW5raW5nIFBsYWNlcyAoQWxjb2hvbGljIEJldmVyYWdlcykjNzIyCi1uYWljcyM3MjI0MSNEcmlua2luZyBQbGFjZXMgKEFsY29ob2xpYyBCZXZlcmFnZXMpIzcyMjQKLW5haWNzIzgxI090aGVyIFNlcnZpY2VzIChleGNlcHQgUHVibGljIEFkbWluaXN0cmF0aW9uKSM4MQotbmFpY3MjODExI1JlcGFpciBhbmQgTWFpbnRlbmFuY2UjODEKLW5haWNzIzgxMTEjQXV0b21vdGl2ZSBSZXBhaXIgYW5kIE1haW50ZW5hbmNlIzgxMQotbmFpY3MjODExMTEjQXV0b21vdGl2ZSBNZWNoYW5pY2FsIGFuZCBFbGVjdHJpY2FsIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMQotbmFpY3MjODExMTExI0dlbmVyYWwgQXV0b21vdGl2ZSBSZXBhaXIjODExMTEKLW5haWNzIzgxMTExMiNBdXRvbW90aXZlIEV4aGF1c3QgU3lzdGVtIFJlcGFpciM4MTExMQotbmFpY3MjODExMTEzI0F1dG9tb3RpdmUgVHJhbnNtaXNzaW9uIFJlcGFpciM4MTExMQotbmFpY3MjODExMTE4I090aGVyIEF1dG9tb3RpdmUgTWVjaGFuaWNhbCBhbmQgRWxlY3RyaWNhbCBSZXBhaXIgYW5kIE1haW50ZW5hbmNlIzgxMTExCi1uYWljcyM4MTExMiNBdXRvbW90aXZlIEJvZHksIFBhaW50LCBJbnRlcmlvciwgYW5kIEdsYXNzIFJlcGFpciM4MTExCi1uYWljcyM4MTExMjEjQXV0b21vdGl2ZSBCb2R5LCBQYWludCwgYW5kIEludGVyaW9yIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMTIKLW5haWNzIzgxMTEyMiNBdXRvbW90aXZlIEdsYXNzIFJlcGxhY2VtZW50IFNob3BzIzgxMTEyCi1uYWljcyM4MTExOSNPdGhlciBBdXRvbW90aXZlIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMQotbmFpY3MjODExMTkxI0F1dG9tb3RpdmUgT2lsIENoYW5nZSBhbmQgTHVicmljYXRpb24gU2hvcHMjODExMTkKLW5haWNzIzgxMTE5MiNDYXIgV2FzaGVzIzgxMTE5Ci1uYWljcyM4MTExOTgjQWxsIE90aGVyIEF1dG9tb3RpdmUgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTExOQotbmFpY3MjODExMiNFbGVjdHJvbmljIGFuZCBQcmVjaXNpb24gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExCi1uYWljcyM4MTEyMSNFbGVjdHJvbmljIGFuZCBQcmVjaXNpb24gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMgotbmFpY3MjODExMjExI0NvbnN1bWVyIEVsZWN0cm9uaWNzIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMjEKLW5haWNzIzgxMTIxMiNDb21wdXRlciBhbmQgT2ZmaWNlIE1hY2hpbmUgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTEyMQotbmFpY3MjODExMjEzI0NvbW11bmljYXRpb24gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMjEKLW5haWNzIzgxMTIxOSNPdGhlciBFbGVjdHJvbmljIGFuZCBQcmVjaXNpb24gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExMjEKLW5haWNzIzgxMTMjQ29tbWVyY2lhbCBhbmQgSW5kdXN0cmlhbCBNYWNoaW5lcnkgYW5kIEVxdWlwbWVudCAoZXhjZXB0IEF1dG9tb3RpdmUgYW5kIEVsZWN0cm9uaWMpIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExCi1uYWljcyM4MTEzMSNDb21tZXJjaWFsIGFuZCBJbmR1c3RyaWFsIE1hY2hpbmVyeSBhbmQgRXF1aXBtZW50IChleGNlcHQgQXV0b21vdGl2ZSBhbmQgRWxlY3Ryb25pYykgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTEzCi1uYWljcyM4MTE0I1BlcnNvbmFsIGFuZCBIb3VzZWhvbGQgR29vZHMgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTEKLW5haWNzIzgxMTQxI0hvbWUgYW5kIEdhcmRlbiBFcXVpcG1lbnQgYW5kIEFwcGxpYW5jZSBSZXBhaXIgYW5kIE1haW50ZW5hbmNlIzgxMTQKLW5haWNzIzgxMTQxMSNIb21lIGFuZCBHYXJkZW4gRXF1aXBtZW50IFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExNDEKLW5haWNzIzgxMTQxMiNBcHBsaWFuY2UgUmVwYWlyIGFuZCBNYWludGVuYW5jZSM4MTE0MQotbmFpY3MjODExNDIjUmV1cGhvbHN0ZXJ5IGFuZCBGdXJuaXR1cmUgUmVwYWlyIzgxMTQKLW5haWNzIzgxMTQzI0Zvb3R3ZWFyIGFuZCBMZWF0aGVyIEdvb2RzIFJlcGFpciM4MTE0Ci1uYWljcyM4MTE0OSNPdGhlciBQZXJzb25hbCBhbmQgSG91c2Vob2xkIEdvb2RzIFJlcGFpciBhbmQgTWFpbnRlbmFuY2UjODExNAotbmFpY3MjODEyI1BlcnNvbmFsIGFuZCBMYXVuZHJ5IFNlcnZpY2VzIzgxCi1uYWljcyM4MTIxI1BlcnNvbmFsIENhcmUgU2VydmljZXMjODEyCi1uYWljcyM4MTIxMSNIYWlyLCBOYWlsLCBhbmQgU2tpbiBDYXJlIFNlcnZpY2VzIzgxMjEKLW5haWNzIzgxMjExMSNCYXJiZXIgU2hvcHMjODEyMTEKLW5haWNzIzgxMjExMiNCZWF1dHkgU2Fsb25zIzgxMjExCi1uYWljcyM4MTIxMTMjTmFpbCBTYWxvbnMjODEyMTEKLW5haWNzIzgxMjE5I090aGVyIFBlcnNvbmFsIENhcmUgU2VydmljZXMjODEyMQotbmFpY3MjODEyMTkxI0RpZXQgYW5kIFdlaWdodCBSZWR1Y2luZyBDZW50ZXJzIzgxMjE5Ci1uYWljcyM4MTIxOTkjT3RoZXIgUGVyc29uYWwgQ2FyZSBTZXJ2aWNlcyM4MTIxOQotbmFpY3MjODEyMiNEZWF0aCBDYXJlIFNlcnZpY2VzIzgxMgotbmFpY3MjODEyMjEjRnVuZXJhbCBIb21lcyBhbmQgRnVuZXJhbCBTZXJ2aWNlcyM4MTIyCi1uYWljcyM4MTIyMiNDZW1ldGVyaWVzIGFuZCBDcmVtYXRvcmllcyM4MTIyCi1uYWljcyM4MTIzI0RyeWNsZWFuaW5nIGFuZCBMYXVuZHJ5IFNlcnZpY2VzIzgxMgotbmFpY3MjODEyMzEjQ29pbi1PcGVyYXRlZCBMYXVuZHJpZXMgYW5kIERyeWNsZWFuZXJzIzgxMjMKLW5haWNzIzgxMjMyI0RyeWNsZWFuaW5nIGFuZCBMYXVuZHJ5IFNlcnZpY2VzIChleGNlcHQgQ29pbi1PcGVyYXRlZCkjODEyMwotbmFpY3MjODEyMzMjTGluZW4gYW5kIFVuaWZvcm0gU3VwcGx5IzgxMjMKLW5haWNzIzgxMjMzMSNMaW5lbiBTdXBwbHkjODEyMzMKLW5haWNzIzgxMjMzMiNJbmR1c3RyaWFsIExhdW5kZXJlcnMjODEyMzMKLW5haWNzIzgxMjkjT3RoZXIgUGVyc29uYWwgU2VydmljZXMjODEyCi1uYWljcyM4MTI5MSNQZXQgQ2FyZSAoZXhjZXB0IFZldGVyaW5hcnkpIFNlcnZpY2VzIzgxMjkKLW5haWNzIzgxMjkyI1Bob3RvZmluaXNoaW5nIzgxMjkKLW5haWNzIzgxMjkyMSNQaG90b2ZpbmlzaGluZyBMYWJvcmF0b3JpZXMgKGV4Y2VwdCBPbmUtSG91cikjODEyOTIKLW5haWNzIzgxMjkyMiNPbmUtSG91ciBQaG90b2ZpbmlzaGluZyM4MTI5MgotbmFpY3MjODEyOTMjUGFya2luZyBMb3RzIGFuZCBHYXJhZ2VzIzgxMjkKLW5haWNzIzgxMjk5I0FsbCBPdGhlciBQZXJzb25hbCBTZXJ2aWNlcyM4MTI5Ci1uYWljcyM4MTMjUmVsaWdpb3VzLCBHcmFudG1ha2luZywgQ2l2aWMsIFByb2Zlc3Npb25hbCwgYW5kIFNpbWlsYXIgT3JnYW5pemF0aW9ucyM4MQotbmFpY3MjODEzMSNSZWxpZ2lvdXMgT3JnYW5pemF0aW9ucyM4MTMKLW5haWNzIzgxMzExI1JlbGlnaW91cyBPcmdhbml6YXRpb25zIzgxMzEKLW5haWNzIzgxMzIjR3JhbnRtYWtpbmcgYW5kIEdpdmluZyBTZXJ2aWNlcyM4MTMKLW5haWNzIzgxMzIxI0dyYW50bWFraW5nIGFuZCBHaXZpbmcgU2VydmljZXMjODEzMgotbmFpY3MjODEzMjExI0dyYW50bWFraW5nIEZvdW5kYXRpb25zIzgxMzIxCi1uYWljcyM4MTMyMTIjVm9sdW50YXJ5IEhlYWx0aCBPcmdhbml6YXRpb25zIzgxMzIxCi1uYWljcyM4MTMyMTkjT3RoZXIgR3JhbnRtYWtpbmcgYW5kIEdpdmluZyBTZXJ2aWNlcyM4MTMyMQotbmFpY3MjODEzMyNTb2NpYWwgQWR2b2NhY3kgT3JnYW5pemF0aW9ucyM4MTMKLW5haWNzIzgxMzMxI1NvY2lhbCBBZHZvY2FjeSBPcmdhbml6YXRpb25zIzgxMzMKLW5haWNzIzgxMzMxMSNIdW1hbiBSaWdodHMgT3JnYW5pemF0aW9ucyM4MTMzMQotbmFpY3MjODEzMzEyI0Vudmlyb25tZW50LCBDb25zZXJ2YXRpb24gYW5kIFdpbGRsaWZlIE9yZ2FuaXphdGlvbnMjODEzMzEKLW5haWNzIzgxMzMxOSNPdGhlciBTb2NpYWwgQWR2b2NhY3kgT3JnYW5pemF0aW9ucyM4MTMzMQotbmFpY3MjODEzNCNDaXZpYyBhbmQgU29jaWFsIE9yZ2FuaXphdGlvbnMjODEzCi1uYWljcyM4MTM0MSNDaXZpYyBhbmQgU29jaWFsIE9yZ2FuaXphdGlvbnMjODEzNAotbmFpY3MjODEzOSNCdXNpbmVzcywgUHJvZmVzc2lvbmFsLCBMYWJvciwgUG9saXRpY2FsLCBhbmQgU2ltaWxhciBPcmdhbml6YXRpb25zIzgxMwotbmFpY3MjODEzOTEjQnVzaW5lc3MgQXNzb2NpYXRpb25zIzgxMzkKLW5haWNzIzgxMzkyI1Byb2Zlc3Npb25hbCBPcmdhbml6YXRpb25zIzgxMzkKLW5haWNzIzgxMzkzI0xhYm9yIFVuaW9ucyBhbmQgU2ltaWxhciBMYWJvciBPcmdhbml6YXRpb25zIzgxMzkKLW5haWNzIzgxMzk0I1BvbGl0aWNhbCBPcmdhbml6YXRpb25zIzgxMzkKLW5haWNzIzgxMzk5I090aGVyIFNpbWlsYXIgT3JnYW5pemF0aW9ucyAoZXhjZXB0IEJ1c2luZXNzLCBQcm9mZXNzaW9uYWwsIExhYm9yLCBhbmQgUG9saXRpY2FsIE9yZ2FuaXphdGlvbnMpIzgxMzkKLW5haWNzIzgxNCNQcml2YXRlIEhvdXNlaG9sZHMjODEKLW5haWNzIzgxNDEjUHJpdmF0ZSBIb3VzZWhvbGRzIzgxNAotbmFpY3MjODE0MTEjUHJpdmF0ZSBIb3VzZWhvbGRzIzgxNDEKLW5haWNzIzkyI1B1YmxpYyBBZG1pbmlzdHJhdGlvbiM5MgotbmFpY3MjOTIxI0V4ZWN1dGl2ZSwgTGVnaXNsYXRpdmUsIGFuZCBPdGhlciBHZW5lcmFsIEdvdmVybm1lbnQgU3VwcG9ydCM5MgotbmFpY3MjOTIxMSNFeGVjdXRpdmUsIExlZ2lzbGF0aXZlLCBhbmQgT3RoZXIgR2VuZXJhbCBHb3Zlcm5tZW50IFN1cHBvcnQjOTIxCi1uYWljcyM5MjExMSNFeGVjdXRpdmUgT2ZmaWNlcyM5MjExCi1uYWljcyM5MjExMiNMZWdpc2xhdGl2ZSBCb2RpZXMjOTIxMQotbmFpY3MjOTIxMTMjUHVibGljIEZpbmFuY2UgQWN0aXZpdGllcyM5MjExCi1uYWljcyM5MjExNCNFeGVjdXRpdmUgYW5kIExlZ2lzbGF0aXZlIE9mZmljZXMsIENvbWJpbmVkIzkyMTEKLW5haWNzIzkyMTE1I0FtZXJpY2FuIEluZGlhbiBhbmQgQWxhc2thIE5hdGl2ZSBUcmliYWwgR292ZXJubWVudHMjOTIxMQotbmFpY3MjOTIxMTkjT3RoZXIgR2VuZXJhbCBHb3Zlcm5tZW50IFN1cHBvcnQjOTIxMQotbmFpY3MjOTIyI0p1c3RpY2UsIFB1YmxpYyBPcmRlciwgYW5kIFNhZmV0eSBBY3Rpdml0aWVzIzkyCi1uYWljcyM5MjIxI0p1c3RpY2UsIFB1YmxpYyBPcmRlciwgYW5kIFNhZmV0eSBBY3Rpdml0aWVzIzkyMgotbmFpY3MjOTIyMTEjQ291cnRzIzkyMjEKLW5haWNzIzkyMjEyI1BvbGljZSBQcm90ZWN0aW9uIzkyMjEKLW5haWNzIzkyMjEzI0xlZ2FsIENvdW5zZWwgYW5kIFByb3NlY3V0aW9uIzkyMjEKLW5haWNzIzkyMjE0I0NvcnJlY3Rpb25hbCBJbnN0aXR1dGlvbnMjOTIyMQotbmFpY3MjOTIyMTUjUGFyb2xlIE9mZmljZXMgYW5kIFByb2JhdGlvbiBPZmZpY2VzIzkyMjEKLW5haWNzIzkyMjE2I0ZpcmUgUHJvdGVjdGlvbiM5MjIxCi1uYWljcyM5MjIxOSNPdGhlciBKdXN0aWNlLCBQdWJsaWMgT3JkZXIsIGFuZCBTYWZldHkgQWN0aXZpdGllcyM5MjIxCi1uYWljcyM5MjMjQWRtaW5pc3RyYXRpb24gb2YgSHVtYW4gUmVzb3VyY2UgUHJvZ3JhbXMjOTIKLW5haWNzIzkyMzEjQWRtaW5pc3RyYXRpb24gb2YgSHVtYW4gUmVzb3VyY2UgUHJvZ3JhbXMjOTIzCi1uYWljcyM5MjMxMSNBZG1pbmlzdHJhdGlvbiBvZiBFZHVjYXRpb24gUHJvZ3JhbXMjOTIzMQotbmFpY3MjOTIzMTIjQWRtaW5pc3RyYXRpb24gb2YgUHVibGljIEhlYWx0aCBQcm9ncmFtcyM5MjMxCi1uYWljcyM5MjMxMyNBZG1pbmlzdHJhdGlvbiBvZiBIdW1hbiBSZXNvdXJjZSBQcm9ncmFtcyAoZXhjZXB0IEVkdWNhdGlvbiwgUHVibGljIEhlYWx0aCwgYW5kIFZldGVyYW5zJyBBZmZhaXJzIFByb2dyYW1zKSM5MjMxCi1uYWljcyM5MjMxNCNBZG1pbmlzdHJhdGlvbiBvZiBWZXRlcmFucycgQWZmYWlycyM5MjMxCi1uYWljcyM5MjQjQWRtaW5pc3RyYXRpb24gb2YgRW52aXJvbm1lbnRhbCBRdWFsaXR5IFByb2dyYW1zIzkyCi1uYWljcyM5MjQxI0FkbWluaXN0cmF0aW9uIG9mIEVudmlyb25tZW50YWwgUXVhbGl0eSBQcm9ncmFtcyM5MjQKLW5haWNzIzkyNDExI0FkbWluaXN0cmF0aW9uIG9mIEFpciBhbmQgV2F0ZXIgUmVzb3VyY2UgYW5kIFNvbGlkIFdhc3RlIE1hbmFnZW1lbnQgUHJvZ3JhbXMjOTI0MQotbmFpY3MjOTI0MTIjQWRtaW5pc3RyYXRpb24gb2YgQ29uc2VydmF0aW9uIFByb2dyYW1zIzkyNDEKLW5haWNzIzkyNSNBZG1pbmlzdHJhdGlvbiBvZiBIb3VzaW5nIFByb2dyYW1zLCBVcmJhbiBQbGFubmluZywgYW5kIENvbW11bml0eSBEZXZlbG9wbWVudCM5MgotbmFpY3MjOTI1MSNBZG1pbmlzdHJhdGlvbiBvZiBIb3VzaW5nIFByb2dyYW1zLCBVcmJhbiBQbGFubmluZywgYW5kIENvbW11bml0eSBEZXZlbG9wbWVudCM5MjUKLW5haWNzIzkyNTExI0FkbWluaXN0cmF0aW9uIG9mIEhvdXNpbmcgUHJvZ3JhbXMjOTI1MQotbmFpY3MjOTI1MTIjQWRtaW5pc3RyYXRpb24gb2YgVXJiYW4gUGxhbm5pbmcgYW5kIENvbW11bml0eSBhbmQgUnVyYWwgRGV2ZWxvcG1lbnQjOTI1MQotbmFpY3MjOTI2I0FkbWluaXN0cmF0aW9uIG9mIEVjb25vbWljIFByb2dyYW1zIzkyCi1uYWljcyM5MjYxI0FkbWluaXN0cmF0aW9uIG9mIEVjb25vbWljIFByb2dyYW1zIzkyNgotbmFpY3MjOTI2MTEjQWRtaW5pc3RyYXRpb24gb2YgR2VuZXJhbCBFY29ub21pYyBQcm9ncmFtcyM5MjYxCi1uYWljcyM5MjYxMiNSZWd1bGF0aW9uIGFuZCBBZG1pbmlzdHJhdGlvbiBvZiBUcmFuc3BvcnRhdGlvbiBQcm9ncmFtcyM5MjYxCi1uYWljcyM5MjYxMyNSZWd1bGF0aW9uIGFuZCBBZG1pbmlzdHJhdGlvbiBvZiBDb21tdW5pY2F0aW9ucywgRWxlY3RyaWMsIEdhcywgYW5kIE90aGVyIFV0aWxpdGllcyM5MjYxCi1uYWljcyM5MjYxNCNSZWd1bGF0aW9uIG9mIEFncmljdWx0dXJhbCBNYXJrZXRpbmcgYW5kIENvbW1vZGl0aWVzIzkyNjEKLW5haWNzIzkyNjE1I1JlZ3VsYXRpb24sIExpY2Vuc2luZywgYW5kIEluc3BlY3Rpb24gb2YgTWlzY2VsbGFuZW91cyBDb21tZXJjaWFsIFNlY3RvcnMjOTI2MQotbmFpY3MjOTI3I1NwYWNlIFJlc2VhcmNoIGFuZCBUZWNobm9sb2d5IzkyCi1uYWljcyM5MjcxI1NwYWNlIFJlc2VhcmNoIGFuZCBUZWNobm9sb2d5IzkyNwotbmFpY3MjOTI3MTEjU3BhY2UgUmVzZWFyY2ggYW5kIFRlY2hub2xvZ3kjOTI3MQotbmFpY3MjOTI4I05hdGlvbmFsIFNlY3VyaXR5IGFuZCBJbnRlcm5hdGlvbmFsIEFmZmFpcnMjOTIKLW5haWNzIzkyODEjTmF0aW9uYWwgU2VjdXJpdHkgYW5kIEludGVybmF0aW9uYWwgQWZmYWlycyM5MjgKLW5haWNzIzkyODExI05hdGlvbmFsIFNlY3VyaXR5IzkyODEKLW5haWNzIzkyODEyI0ludGVybmF0aW9uYWwgQWZmYWlycyM5MjgxCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS91bnNwc2MtZGF0YS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZGF0YS91bnNwc2MtZGF0YS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODM1MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2RhdGEvdW5zcHNjLWRhdGEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTcwNTQgKzAsMCBAQAotdW5zcHNjNyMxMC4wMC4wMC4wMC4wMCNMaXZlIFBsYW50IGFuZCBBbmltYWwgTWF0ZXJpYWwgYW5kIEFjY2Vzc29yaWVzIGFuZCBTdXBwbGllcyMxMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMC4wMC4wMC4wMCNMaXZlIGFuaW1hbHMjMTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMDAuMDAjTGl2ZXN0b2NrIzEwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjAxLjAwI0NhdHMjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMDIuMDAjRG9ncyMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4wNC4wMCNNaW5rIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjA1LjAwI1JhdHMjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMDYuMDAjSG9yc2VzIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjA3LjAwI1NoZWVwIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjA4LjAwI0dvYXRzIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjA5LjAwI0Fzc2VzIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjEwLjAwI01pY2UjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMTEuMDAjU3dpbmUjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTUuMTIuMDAjUmFiYml0cyMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4xMy4wMCNHdWluZWEgcGlncyMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4xNC4wMCNQcmltYXRlcyMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4xNS4wMCNBcm1hZGlsbG9zIzEwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE1LjE2LjAwI0NhdHRsZSMxMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNS4xNy4wMCNDYW1lbHMjMTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTYuMDAuMDAjQmlyZHMgYW5kIGZvd2wjMTAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTYuMDEuMDAjTGl2ZSBjaGlja2VucyMxMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNi4wMi4wMCNMaXZlIGR1Y2tzIzEwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE2LjAzLjAwI0xpdmUgdHVya2V5cyMxMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNi4wNC4wMCNMaXZlIGdlZXNlIzEwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE2LjA1LjAwI0xpdmUgcGhlYXNhbnRzIzEwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE3LjAwLjAwI0xpdmUgZmlzaCMxMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNy4wMS4wMCNMaXZlIHNhbG1vbiMxMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNy4wMi4wMCNMaXZlIHRyb3V0IzEwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE3LjAzLjAwI0xpdmUgdGFsYXBpYSMxMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMC4xMC4xNy4wNC4wMCNMaXZlIGNhcnAjMTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTcuMDUuMDAjTGl2ZSBlZWxzIzEwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjAwLjAwI1NoZWxsZmlzaCBhbmQgYXF1YXRpYyBpbnZlcnRlYnJhdGVzIzEwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjAxLjAwI0xpdmUgc2hyaW1wIzEwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjAyLjAwI0xpdmUgY2xhbXMjMTAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTguMDMuMDAjTGl2ZSBtdXNzZWxzIzEwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjA0LjAwI0xpdmUgb3lzdGVycyMxMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMC4xOC4wNS4wMCNMaXZlIGNyYWJzIzEwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE4LjA2LjAwI0xpdmUgYWJhbG9uZSMxMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMC4xOC4wNy4wMCNMaXZlIG9jdG9waSMxMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMC4xOC4wOC4wMCNMaXZlIHNxdWlkIzEwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE5LjAwLjAwI0luc2VjdHMjMTAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTkuMDEuMDAjQnV0dGVyZmxpZXMjMTAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMTkuMDIuMDAjQmVldGxlcyMxMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMxMC4xMC4xOS4wMy4wMCNCZWVzIzEwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzEwLjEwLjE5LjA0LjAwI1NpbGt3b3JtcyMxMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMxMC4xMC4yMC4wMC4wMCNXaWxkIGFuaW1hbHMjMTAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTAuMjAuMDEuMDAjRWxlcGhhbnRzIzEwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEwLjEwLjIwLjAyLjAwI0xpdmUgZm94ZXMjMTAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMDAuMDAuMDAjRG9tZXN0aWMgcGV0IHByb2R1Y3RzIzEwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjExLjExLjAwLjAwI1BldCBmb29kIGJvd2xzIG9yIGVxdWlwbWVudCMxMC4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMS4xMi4wMC4wMCNNZWRpY2F0ZWQgcGV0IHRyZWF0bWVudHMjMTAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMTMuMDAuMDAjRG9tZXN0aWMgcGV0IHRyZWF0bWVudHMgYW5kIGFjY2Vzc29yaWVzIGFuZCBlcXVpcG1lbnQjMTAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMTMuMDEuMDAjUGV0IHRveXMjMTAuMTEuMTMuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMTMuMDIuMDAjUGV0IGdyb29taW5nIHByb2R1Y3RzIzEwLjExLjEzLjAwLjAwCi11bnNwc2M3IzEwLjExLjEzLjAzLjAwI1BldCBsaXR0ZXIgb3IgZXF1aXBtZW50IGZvciBwZXQgd2FzdGUgbWFuYWdlbWVudCMxMC4xMS4xMy4wMC4wMAotdW5zcHNjNyMxMC4xMS4xMy4wNC4wMCNQZXQgZm9vZCBib3dscyBvciBlcXVpcG1lbnQjMTAuMTEuMTMuMDAuMDAKLXVuc3BzYzcjMTAuMTEuMTMuMDUuMDAjTWVkaWNhdGVkIHBldCB0cmVhdG1lbnRzIzEwLjExLjEzLjAwLjAwCi11bnNwc2M3IzEwLjEyLjAwLjAwLjAwI0FuaW1hbCBmZWVkIzEwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjE1LjAwLjAwI0xpdmVzdG9jayBmZWVkIzEwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjE1LjAxLjAwI1B1cmUgd2hlYXQgYnJhbiMxMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNS4wMi4wMCNGZWVkIG9hdHMjMTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTUuMDMuMDAjRmVlZCBjb3JuIzEwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzEwLjEyLjE1LjA0LjAwI0ZlZWQgc29yZ2h1bSMxMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNS4wNS4wMCNIYXkjMTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTUuMDYuMDAjT2lsIGNha2UjMTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTYuMDAuMDAjQmlyZCBhbmQgZm93bCBmb29kIzEwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjE2LjAxLjAwI0xpdmUgZm9vZCBmb3IgYmlyZHMjMTAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTYuMDIuMDAjQmlyZCBzZWVkIzEwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEyLjE2LjAzLjAwI0JpcmQgdHJlYXRzIG9yIHNuYWNrcyMxMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNi4wNC4wMCNQb3VsdHJ5IGZvb2QjMTAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTcuMDAuMDAjRmlzaCBmb29kIzEwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjE3LjAxLjAwI0ZyZXNoIG9yIGZyb3plbiBicmluZSMxMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNy4wMi4wMCNGaXNoIGZvb2QgcGVsbGV0cyMxMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMC4xMi4xNy4wMy4wMCNGaXNoIGZvb2QgZmxha2VzIzEwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzEwLjEyLjE4LjAwLjAwI0RvZyBhbmQgY2F0IGZvb2QjMTAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTguMDEuMDAjRHJ5IGZvb2QgZm9yIGRvZ3MjMTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTguMDIuMDAjTW9pc3QgZm9vZCBmb3IgZG9ncyMxMC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMi4xOC4wMy4wMCNNaWxrIGZvciBkb2dzIG9yIGNhdHMjMTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTguMDQuMDAjRHJ5IGZvb2QgZm9yIGNhdHMjMTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTguMDUuMDAjTW9pc3QgZm9vZCBmb3IgY2F0cyMxMC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMC4xMi4xOC4wNi4wMCNUcmVhdHMgb3Igc25hY2tzIGZvciBjYXRzIG9yIGRvZ3MjMTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTkuMDAuMDAjUm9kZW50IGZvb2QjMTAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTIuMTkuMDEuMDAjUGVsbGV0aXplZCBmb29kIGZvciByb2RlbnRzIzEwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzEwLjEyLjIwLjAwLjAwI1JlcHRpbGUgZm9vZCMxMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMi4yMC4wMS4wMCNQZWxsZXRpemVkIGZvb2QgZm9yIHJlcHRpbGVzIzEwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjIwLjAyLjAwI01vaXN0IGZvb2QgZm9yIHJlcHRpbGVzIzEwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzEwLjEyLjIwLjAzLjAwI0xpdmUgZm9vZCBmb3IgcmVwdGlsZXMjMTAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMDAuMDAuMDAjQW5pbWFsIGNvbnRhaW5tZW50IGFuZCBoYWJpdGF0cyMxMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMy4xNS4wMC4wMCNBbmltYWwgc2hlbHRlcnMjMTAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTUuMDYuMDAjTGl2ZXN0b2NrIHN0YWJsZXMjMTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTUuMDcuMDAjRG9tZXN0aWNpemVkIHBldCBob3VzZXMjMTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTUuMDguMDAjUGV0IGJlZHMjMTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTYuMDAuMDAjQW5pbWFsIGNvbnRhaW5tZW50IzEwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzEwLjEzLjE2LjAxLjAwI0NhZ2VzIzEwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEzLjE2LjAyLjAwI0tlbm5lbHMjMTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTMuMTYuMDMuMDAjQW5pbWFsIGNhcnJ5aW5nIGNhc2VzIzEwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEzLjE2LjA0LjAwI0RvZyBydW5zIzEwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEwLjEzLjE3LjAwLjAwI0FuaW1hbCBoYWJpdGF0cyMxMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMxMC4xMy4xNy4wMS4wMCNUZXJyYXJpdW1zIzEwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzEwLjEzLjE3LjAyLjAwI0FxdWFyaXVtcyMxMC4xMy4xNy4wMC4wMAotdW5zcHNjNyMxMC4xNC4wMC4wMC4wMCNTYWRkbGVyeSBhbmQgaGFybmVzcyBnb29kcyMxMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNS4wMC4wMCNTYWRkbGVyeSMxMC4xNC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNS4wMS4wMCNTYWRkbGVzIzEwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE1LjAyLjAwI1doaXBzIzEwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE2LjAwLjAwI0hhcm5lc3MgZ29vZHMjMTAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTQuMTYuMDEuMDAjQnJpZGxlcyMxMC4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNi4wMi4wMCNZb2tlcyMxMC4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNi4wMy4wMCNIb3JzZSBiaXRzIzEwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE2LjA0LjAwI1JlaW5zIzEwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE2LjA1LjAwI1N0aXJydXBzIzEwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE0LjE2LjA2LjAwI0xlYXNoZXMgb3IgbGVhZHMjMTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTQuMTYuMDcuMDAjQ29sbGFycyMxMC4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNC4xNi4wOC4wMCNIYXJuZXNzZXMjMTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTQuMTYuMDkuMDAjUmVzdHJhaW50cyMxMC4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4wMC4wMC4wMCNTZWVkcyBhbmQgYnVsYnMgYW5kIHNlZWRsaW5ncyBhbmQgY3V0dGluZ3MjMTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMDAuMDAjVmVnZXRhYmxlIHNlZWRzIGFuZCBzZWVkbGluZ3MjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMDEuMDAjQmVhbiBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMDIuMDAjQ2Fycm90IHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4wMy4wMCNDZWxlcnkgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjA0LjAwI0NoaWxpIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4wNS4wMCNDb3VyZ2V0dGUgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjA2LjAwI0NvdyBwZWEgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjA3LjAwI0N1Y3VtYmVyIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4wOC4wMCNFZ2dwbGFudCBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMDkuMDAjRW5kaXZlIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4xMC4wMCNHYXJsaWMgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjExLjAwI0xlZWsgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjEyLjAwI0xldHR1Y2Ugc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjEzLjAwI0Nvcm4gc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjE0LjAwI01lbG9uIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4xNS4wMCNPbmlvbiBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMTYuMDAjU295YSBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMTcuMDAjU3BpbmFjaCBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTUuMTguMDAjVG9tYXRvIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4xOS4wMCNUdXJuaXAgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjIwLjAwI0NoYXJkIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4yMS4wMCNTd2VldCBwZXBwZXIgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjIyLjAwI0JlZXQgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE1LjIzLjAwI0NhdWxpZmxvd2VyIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNS4yNC4wMCNQYXJzZWx5IHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNi4wMC4wMCNDZXJlYWwgc2VlZHMjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDEuMDAjV2hlYXQgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDIuMDAjQ29semEgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDMuMDAjQmFybGV5IHNlZWRzIzEwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE2LjA0LjAwI01pbGxldCBzZWVkcyMxMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNi4wNS4wMCNPYXQgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDYuMDAjU2VzYW1lIHNlZWRzIzEwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE2LjA3LjAwI0xpbnNlZWQgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMDguMDAjQ2FzdG9yIG9pbCBzZWVkcyMxMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNi4wOS4wMCNNYWl6ZSBzZWVkcyMxMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNi4xMC4wMCNSeWUgc2VlZHMjMTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTYuMTEuMDAjU29yZ2h1bSBzZWVkcyMxMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNS4xNy4wMC4wMCNHcmFzcyBhbmQgZm9yYWdlIHNlZWRzIGFuZCBzZWVkbGluZ3MjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTcuMDEuMDAjUmljZSBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTcuMDIuMDAjQ2xvdmVyIHNlZWRzIG9yIHNlZWRsaW5nIzEwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE3LjAzLjAwI0FsZmFsZmEgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE3LjA0LjAwI0dyYXNzIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wMC4wMCNTcGljZSBjcm9wIHNlZWRzIGFuZCBzZWVkbGluZ3MjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTguMDEuMDAjUGVwcGVyIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wMi4wMCNWYW5pbGxhIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wMy4wMCNDaW5uYW1vbiBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTguMDQuMDAjQ2xvdmUgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE4LjA1LjAwI0NvcmlhbmRlciBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTguMDYuMDAjR2luZ2VyIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wNy4wMCNTYWZmcm9uIHNlZWRzIG9yIHNlZWRsaW5ncyMxMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOC4wOC4wMCNUaHltZSBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTguMDkuMDAjQ3Vycnkgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE4LjEwLjAwI011c3RhcmQgc2VlZHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE4LjExLjAwI0dpbnNlbmcgcm9vdHMgb3Igc2VlZGxpbmdzIzEwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE5LjAwLjAwI0Zsb3dlciBzZWVkcyBhbmQgYnVsYnMgYW5kIHNlZWRsaW5ncyBhbmQgY3V0dGluZ3MjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTkuMDEuMDAjVHVsaXAgc2VlZHMgb3IgYnVsYnMgb3Igc2VlZGxpbmdzIG9yIGN1dHRpbmdzIzEwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE5LjAyLjAwI1Jvc2Ugc2VlZHMgb3Igc2VlZGxpbmdzIG9yIGN1dHRpbmdzIzEwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE5LjAzLjAwI0RhZmZvZGlsIHNlZWRzIG9yIGJ1bGJzIG9yIHNlZWRsaW5ncyBvciBjdXR0aW5ncyMxMC4xNS4xOS4wMC4wMAotdW5zcHNjNyMxMC4xNS4xOS4wNC4wMCNTdW5mbG93ZXIgc2VlZHMjMTAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMTkuMDUuMDAjSHlhY2ludGggYnVsYnMgb3Igc2hvb3RzIzEwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEwLjE1LjE5LjA2LjAwI0xpbHkgQnVsYnMjMTAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMjAuMDAuMDAjVHJlZSBhbmQgc2hydWIgc2VlZHMgYW5kIGN1dHRpbmdzIzEwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIwLjAxLjAwI0ZydWl0IHRyZWUgc2VlZHMgb3IgY3V0dGluZ3MjMTAuMTUuMjAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMjAuMDIuMDAjQ29uaWZlciB0cmVlIHNlZWRzIG9yIGN1dHRpbmdzIzEwLjE1LjIwLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIwLjAzLjAwI051dCB0cmVlIHNlZWRzIG9yIGN1dHRpbmdzIzEwLjE1LjIwLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIxLjAwLjAwI1Jlc2lkdWVzIG90aGVyIHRoYW4gYW5pbWFsIGZlZWQjMTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTUuMjEuMDEuMDAjUmVzaWR1ZXMgYmFib29sIHNlZWQgZXh0cmFjdGlvbiMxMC4xNS4yMS4wMC4wMAotdW5zcHNjNyMxMC4xNS4yMS4wMi4wMCNSZXNpZHVlcyBvZiByYXBlIHNlZWRzIzEwLjE1LjIxLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIxLjAzLjAwI1Jlc2lkdWUgb2YgbGluc2VlZCMxMC4xNS4yMS4wMC4wMAotdW5zcHNjNyMxMC4xNS4yMS4wNC4wMCNPaWwgY2FrZSBvZiBuZWVtIzEwLjE1LjIxLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIyLjAwLjAwI0ZpYnJvdXMgY3JvcCBzZWVkcyBhbmQgc2VlZGxpbmdzIzEwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE1LjIyLjAxLjAwI0NvdHRvbiBzZWVkcyBvciBzZWVkbGluZ3MjMTAuMTUuMjIuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMDAuMDAuMDAjRmxvcmljdWx0dXJlIGFuZCBzaWx2aWN1bHR1cmUgcHJvZHVjdHMjMTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTUuMDAuMDAjVHJlZXMgYW5kIHNocnVicyMxMC4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNS4wMS4wMCNPbGl2ZSB0cmVlcyMxMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNS4wMi4wMCNDb2ZmZWUgc2hydWJzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjAzLjAwI0NvY29hIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjA0LjAwI0FwcGxlIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjA1LjAwI1BlYWNoIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjA2LjAwI09yYW5nZSB0cmVlcyMxMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNS4wNy4wMCNSaG9kZW5kcm9uIHNocnVicyMxMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNS4wOC4wMCNUZWEgc2hydWJzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjA5LjAwI0NvbmlmZXIgdHJlZXMjMTAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTUuMTAuMDAjU3BydWNlIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE1LjExLjAwI1BpbmUgdHJlZXMjMTAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTUuMTIuMDAjRmlyIHRyZWVzIzEwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE2LjAwLjAwI0Zsb3JhbCBwbGFudHMjMTAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTYuMDEuMDAjUm9zZSBwbGFudHMjMTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTYuMDIuMDAjUG9pbnNldHRpYXMgcGxhbnRzIzEwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE2LjAzLjAwI09yY2hpZHMgcGxhbnRzIzEwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE2LjA0LjAwI0F6YWxlYXMgcGxhbnRzIzEwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE2LjA1LjAwI0NhY3R1cyBwbGFudHMjMTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTcuMDAuMDAjQ3V0IGZsb3dlcnMjMTAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTcuMDEuMDAjQ3V0IGdsYWRpb2x1cyMxMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMC4xNi4xNy4wMi4wMCNDdXQgbGlsaWVzIzEwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE3LjAzLjAwI0N1dCBjYXJuYXRpb25zIzEwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE3LjA0LjAwI0N1dCB0dWxpcHMjMTAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTcuMDUuMDAjQ3V0IHJvc2VzIzEwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE4LjAwLjAwI05vbiBmbG93ZXJpbmcgcGxhbnRzIzEwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE2LjE4LjAxLjAwI0Zlcm5zIzEwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE4LjAyLjAwI0l2aWVzIzEwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE4LjAzLjAwI1BoaWxvZGVuZHJvbnMjMTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDAuMDAjRHJpZWQgZmxvcmFsIHByb2R1Y3RzIzEwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE2LjE5LjAxLjAwI0RyaWVkIHBvZHMjMTAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDIuMDAjRHJpZWQgbGVhZnkgZ3JlZW5lcnkjMTAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDMuMDAjRHJpZWQgZmVybiBncmVlbmVyeSMxMC4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xOS4wNC4wMCNEcmllZCBmdWxsIGZsb3dlcnMjMTAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDUuMDAjRHJpZWQgdHdpZ3Mgb3Igc3RpY2tzIzEwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzEwLjE2LjE5LjA2LjAwI0RyaWVkIGdyYXNzIHBsdW1lcyMxMC4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMC4xNi4xOS4wNy4wMCNEcmllZCBwcmVzc2VkIGZsb3dlcnMjMTAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTAuMTYuMTkuMDguMDAjRHJpZWQgZmxvd2VyIHBldGFscyMxMC4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMC4xNy4wMC4wMC4wMCNGZXJ0aWxpemVycyBhbmQgcGxhbnQgbnV0cmllbnRzIGFuZCBoZXJiaWNpZGVzIzEwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEwLjE3LjE1LjAwLjAwI09yZ2FuaWMgZmVydGlsaXplcnMgYW5kIHBsYW50IG51dHJpZW50cyMxMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNS4wMS4wMCNNYW51cmUgb3IgZ3Vhbm8jMTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTcuMTUuMDIuMDAjUGxhbnQgaG9ybW9uZXMjMTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTcuMTUuMDMuMDAjRmlzaCBtZWFsIzEwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE3LjE2LjAwLjAwI0NoZW1pY2FsIGZlcnRpbGl6ZXJzIGFuZCBwbGFudCBudXRyaWVudHMjMTAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMTAuMTcuMTYuMDEuMDAjTml0cm9nZW5vdXMgZmVydGlsaXplciMxMC4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNi4wMi4wMCNQb3Rhc3NpYyBmZXJ0aWxpemVyIzEwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE3LjE2LjAzLjAwI1Bob3NwaGF0aWMgZmVydGlsaXplciMxMC4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNi4wNC4wMCNTdWxwaHVyaWMgZmVydGlsaXplciMxMC4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNi4wNS4wMCNOaXRyb2dlbiBQaG9zcGhvcm91cyBQb3Rhc3NpdW0gTWl4dHVyZXMgKE5QSykjMTAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMTAuMTcuMTcuMDAuMDAjSGVyYmljaWRlcyMxMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNy4wMS4wMCNXZWVkIGtpbGxlciMxMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMxMC4xNy4xNy4wMi4wMCNGdW5naWNpZGVzIzEwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzEwLjE5LjAwLjAwLjAwI1Blc3QgY29udHJvbCBwcm9kdWN0cyMxMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNS4wMC4wMCNJbnNlY3RpY2lkZXMgYW5kIGluc2VjdCBjb250cm9sIHRyYXBzIzEwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE5LjE1LjAxLjAwI1NwcmF5IGluc2VjdGljaWRlcyMxMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNS4wMi4wMCNCYWl0IGluc2VjdGljaWRlcyMxMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNS4wMy4wMCNTaWxpY2ljIGFjaWQjMTAuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMTAuMTkuMTUuMDQuMDAjRmx5aW5nIGluc2VjdCBjb250cm9sIHRyYXBzIzEwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzEwLjE5LjE2LjAwLjAwI1JvZGVudGljaWRlcyMxMC4xOS4wMC4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNi4wMS4wMCNFeHRydWRlZCBiYWl0cyMxMC4xOS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNi4wMi4wMCNNZWFsIG9yIHBlbGxldCBvciBzZWVkIGJhaXRzIzEwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE5LjE2LjAzLjAwI0xpcXVpZCBiYWl0cyMxMC4xOS4xNi4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNi4wNC4wMCNUcmFja2luZyBwb3dkZXJzIzEwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzEwLjE5LjE3LjAwLjAwI0FuaW1hbCBjb250cm9sIHRyYXBzIzEwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzEwLjE5LjE3LjAxLjAwI01vdXNlIG9yIHJhdCB0cmFwcyMxMC4xOS4xNy4wMC4wMAotdW5zcHNjNyMxMC4xOS4xNy4wMi4wMCNXaXJlIGNhZ2UgdHJhcHMjMTAuMTkuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMDAuMDAuMDAuMDAjTWluZXJhbCBhbmQgVGV4dGlsZSBhbmQgSW5lZGlibGUgUGxhbnQgYW5kIEFuaW1hbCBNYXRlcmlhbHMjMTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMDAuMDAuMDAjTWluZXJhbHMgYW5kIG9yZXMgYW5kIG1ldGFscyMxMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wMC4wMCNNaW5lcmFscyMxMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wMS4wMCNNaWNhIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjAyLjAwI0VtZXJ5IzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjAzLjAwI1F1YXJ0eiMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wNC4wMCNQeXJpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMDUuMDAjU3VscGh1ciMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wNi4wMCNDaGFsayMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wNy4wMCNHcmFwaGl0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wOC4wMCNEb2xvbWl0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4wOS4wMCNNYWduZXNpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTAuMDAjQXNiZXN0b3MjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTEuMDAjQ2FsY2l1bSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4xMi4wMCNCb3JhdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTMuMDAjQ3J5b2xpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTQuMDAjRmVsZHNwYXIjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTUuMDAjTGV1Y2l0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4xNi4wMCNOZXBoZWxpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTcuMDAjU3RlYXRpdGUjMTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTUuMTguMDAjVGFsYyMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4xOS4wMCNEaWFtb25kcyMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4yMC4wMCNHYXJuZXRzIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjIxLjAwI1NpbGljb24gY2FyYmlkZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4yMi4wMCNBY3RpdmF0ZWQgY2FyYm9uIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjIzLjAwI011bGl0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4yNC4wMCNGbG91cm9zcGFyIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE1LjI1LjAwI0tlaXNlcml0ZSMxMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNS4yNi4wMCNDYXJuYWxsaXRlIzExLjEwLjE1LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjAwLjAwI09yZXMjMTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMDEuMDAjSXJvbiBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMDIuMDAjVGl0YW5pdW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjAzLjAwI1VyYW5pdW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjA0LjAwI0NvcHBlciBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMDUuMDAjQWx1bWludW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjA2LjAwI05pY2tlbCBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMDcuMDAjU2lsdmVyIG9yZSMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4wOC4wMCNMZWFkIG9yZSMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4wOS4wMCNaaW5jIG9yZSMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4xMC4wMCNUaW4gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjExLjAwI01hbmdhbmVzZSBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMTIuMDAjQ2hyb21pdW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjEzLjAwI1R1bmdzdGVuIG9yIHdvbGZyYW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjE0LjAwI01vbHliZGVudW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjE1LjAwI0NvYmFsdCBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMTYuMDAjR29sZCBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMTcuMDAjVGFudGFsdW0gb3JlIzExLjEwLjE2LjAwLjAwCi11bnNwc2M3IzExLjEwLjE2LjE4LjAwI1BsYXRpbnVtIG9yZSMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4xOS4wMCNWZXJtaWN1bGl0ZSBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMjAuMDAjVGhvcml1bSBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMjEuMDAjS3lhbml0ZSBvcmUjMTEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTYuMjIuMDAjQW50aW1vbnkgb3JlcyMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNi4yMy4wMCNaaXJjb25pdW0gb3JlcyMxMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wMC4wMCNCYXNlIG1ldGFscyMxMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wMS4wMCNTbGFnIG9yIGFzaCMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wMi4wMCNOYXR1cmFsIGdyYXBoaXRlIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjAzLjAwI1RpdGFuaXVtIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjA0LjAwI1N0ZWVsIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjA1LjAwI0FsdW1pbnVtIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjA2LjAwI05pY2tlbCMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wNy4wMCNNYWduZXNpdW0jMTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTcuMDguMDAjQmlzbXV0aCMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4wOS4wMCNBbnRpbW9ueSMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4xMC4wMCNDYWRtaXVtIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjExLjAwI05vbiBmZXJyb3VzIGFsbG95IzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjEyLjAwI0ZlcnJvdXMgYWxsb3kjMTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTcuMTMuMDAjSXJvbiMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xNy4xNC4wMCNMZWFkIzExLjEwLjE3LjAwLjAwCi11bnNwc2M3IzExLjEwLjE3LjE1LjAwI0NvcHBlciMxMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMC4xOC4wMC4wMCNQcmVjaW91cyBtZXRhbHMjMTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTguMDEuMDAjR29sZCMxMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMC4xOC4wMi4wMCNTaWx2ZXIjMTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTAuMTguMDMuMDAjUGxhdGludW0jMTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTEuMDAuMDAuMDAjRWFydGggYW5kIHN0b25lIzExLjAwLjAwLjAwLjAwCi11bnNwc2M3IzExLjExLjE1LjAwLjAwI0RpcnQgYW5kIHNvaWwjMTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTUuMDEuMDAjU29pbCMxMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNS4wMi4wMCNGaWxsIGRpcnQjMTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTUuMDMuMDAjVG9wc29pbCMxMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNi4wMC4wMCNTdG9uZSMxMS4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNi4wMS4wMCNHeXBzdW0jMTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTYuMDIuMDAjVHJhdmVydGluZSMxMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNi4wMy4wMCNFY2F1c3NpbmUgb3IgYWxhYmFzdGVyIzExLjExLjE2LjAwLjAwCi11bnNwc2M3IzExLjExLjE2LjA0LjAwI0dyYW5pdGUjMTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTYuMDUuMDAjTWFyYmxlIzExLjExLjE2LjAwLjAwCi11bnNwc2M3IzExLjExLjE2LjA2LjAwI1NsYXRlIzExLjExLjE2LjAwLjAwCi11bnNwc2M3IzExLjExLjE2LjA3LjAwI1NhbmRzdG9uZSMxMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNi4wOC4wMCNMaW1lc3RvbmUjMTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTYuMDkuMDAjQmFzYWx0IzExLjExLjE2LjAwLjAwCi11bnNwc2M3IzExLjExLjE2LjEwLjAwI1B1bWljZSBzdG9uZSMxMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMS4xNy4wMC4wMCNTYW5kIzExLjExLjAwLjAwLjAwCi11bnNwc2M3IzExLjExLjE3LjAxLjAwI1NpbGljYSBzYW5kIzExLjExLjE3LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjAwLjAwI0NsYXlzIzExLjExLjAwLjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjAxLjAwI1RlcnJhIGNvdHRhIzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjAyLjAwI0ZpcmVjbGF5IzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjAzLjAwI0thb2xpbiBvciBvdGhlciBrYW9saW5pYyBjbGF5cyMxMS4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMS4xOC4wNC4wMCNCZW50b25pdGUjMTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTEuMTguMDUuMDAjQW5kYWx1c2l0ZSMxMS4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMS4xOC4wNi4wMCNNdWxsaXRlIzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjA3LjAwI0NoYW1vdHRlIzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjA4LjAwI0NvbW1vbiBjbGF5IzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjExLjE4LjA5LjAwI0JhbGwgY2xheSMxMS4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMS4xOC4xMC4wMCNGdWxsZXJzIGVhcnRoIzExLjExLjE4LjAwLjAwCi11bnNwc2M3IzExLjEyLjAwLjAwLjAwI05vbiBlZGlibGUgcGxhbnQgYW5kIGZvcmVzdHJ5IHByb2R1Y3RzIzExLjAwLjAwLjAwLjAwCi11bnNwc2M3IzExLjEyLjE1LjAwLjAwI1NhcCMxMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNS4wMi4wMCNSb3NpbiMxMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNS4wMy4wMCNMYWMjMTEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTYuMDAuMDAjV29vZCMxMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNi4wMy4wMCNMb2dzIzExLjEyLjE2LjAwLjAwCi11bnNwc2M3IzExLjEyLjE2LjA0LjAwI1NvZnQgdGltYmVyIzExLjEyLjE2LjAwLjAwCi11bnNwc2M3IzExLjEyLjE2LjA1LjAwI1JhdHRhbiMxMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNi4wNi4wMCNDb3JrIzExLjEyLjE2LjAwLjAwCi11bnNwc2M3IzExLjEyLjE2LjA3LjAwI1dvb2QgcHVscCMxMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNi4wOC4wMCNCYW1ib28jMTEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTYuMDkuMDAjUGx5d29vZCMxMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNi4xMC4wMCNIYXJkd29vZHMjMTEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTcuMDAuMDAjRm9yZXN0cnkgYnkgcHJvZHVjdHMjMTEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTcuMDEuMDAjU2F3IGR1c3QjMTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTcuMDIuMDAjV29vZCBjaGlwcyMxMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNy4wMy4wMCNQZWF0IG1vc3MjMTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTcuMDQuMDAjV29vZCBzaGF2aW5ncyMxMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNy4wNS4wMCNCYXJrIzExLjEyLjE3LjAwLjAwCi11bnNwc2M3IzExLjEyLjE3LjA2LjAwI011bGNoIzExLjEyLjE3LjAwLjAwCi11bnNwc2M3IzExLjEyLjE3LjA3LjAwI1dvb2Qgd29vbCMxMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMxMS4xMi4xNy4wOC4wMCNXb29kIGZsb3VyIzExLjEyLjE3LjAwLjAwCi11bnNwc2M3IzExLjEyLjE3LjA5LjAwI0JhbHNhbXMjMTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTguMDAuMDAjUGxhbnQgZmliZXJzIzExLjEyLjAwLjAwLjAwCi11bnNwc2M3IzExLjEyLjE4LjAxLjAwI0hlbXAjMTEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTguMDIuMDAjQ290dG9uIzExLjEyLjE4LjAwLjAwCi11bnNwc2M3IzExLjEyLjE4LjAzLjAwI0ZsYXgjMTEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTIuMTguMDQuMDAjSnV0ZSMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4wNS4wMCNTaXNhbCMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4wNi4wMCNDb2NvbnV0IGZpYnJlcyBvciBjb2lyIzExLjEyLjE4LjAwLjAwCi11bnNwc2M3IzExLjEyLjE4LjA3LjAwI0FiYWNhIGZpYmVycyMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4wOC4wMCNSYW1pZSMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4wOS4wMCNTdHJhdyMxMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOC4xMC4wMCNCcm9vbSBjb3JuIG9yIGlzdGxlIG9yIHBpYXNzYXZhIzExLjEyLjE4LjAwLjAwCi11bnNwc2M3IzExLjEyLjE5LjAwLjAwI1BlcmZ1bWVyeSBwcm9kdWN0cyMxMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMi4xOS4wMS4wMCNMaWNvcmljZSByb290cyMxMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMxMS4xMy4wMC4wMC4wMCNOb24gZWRpYmxlIGFuaW1hbCBwcm9kdWN0cyMxMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wMC4wMCNBbmltYWwgaGlkZXMgYW5kIHNraW5zIGFuZCBhbmltYWwgdGV4dGlsZSBtYXRlcmlhbHMjMTEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTUuMDEuMDAjRmVhdGhlcnMjMTEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTUuMDIuMDAjRnVycyMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wMy4wMCNBbmltYWwgaGFpciMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wNC4wMCNIaWRlcyMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wNS4wMCNVbnByb2Nlc3NlZCBtb2hhaXIjMTEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTUuMDYuMDAjVW5wcm9jZXNzZWQgd29vbCMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wNy4wMCNTdWVkZSMxMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNS4wOC4wMCNGdWxsIGdyYWluIGxlYXRoZXIjMTEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTYuMDAuMDAjT3RoZXIgYW5pbWFsIHByb2R1Y3RzIzExLjEzLjAwLjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjAxLjAwI0l2b3J5IzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjAyLjAwI1NlbWVuIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjAzLjAwI0V4Y3JldGlvbnMjMTEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTMuMTYuMDQuMDAjRmlzaCBlZ2dzIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjA1LjAwI0JvbmVzIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjA2LjAwI0FuaW1hbCBob3JucyMxMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMxMS4xMy4xNi4wNy4wMCNFbWJyeW9zIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjEzLjE2LjA4LjAwI1NoZWxsIGFydGljbGVzIzExLjEzLjE2LjAwLjAwCi11bnNwc2M3IzExLjE0LjAwLjAwLjAwI1NjcmFwIGFuZCB3YXN0ZSBtYXRlcmlhbHMjMTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTUuMDAuMDAjTWV0YWwgd2FzdGUgYW5kIHNjcmFwIzExLjE0LjAwLjAwLjAwCi11bnNwc2M3IzExLjE0LjE1LjAxLjAwI0ZlcnJvdXMgbWV0YWwgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTUuMDIuMDAjTm9uIGZlcnJvdXMgbWV0YWwgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTUuMDMuMDAjQXV0b21vdGl2ZSB3cmVja2luZyBmb3Igd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDAuMDAjTm9uIG1ldGFsbGljIHdhc3RlIGFuZCBzY3JhcCMxMS4xNC4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNC4xNi4wMS4wMCNUZXh0aWxlIHdhc3RlIG9yIHNjcmFwIzExLjE0LjE2LjAwLjAwCi11bnNwc2M3IzExLjE0LjE2LjAyLjAwI1BsYXN0aWMgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDMuMDAjT2lsIHdhc3RlcyMxMS4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNC4xNi4wNC4wMCNQYXBlciB3YXN0ZXMjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDUuMDAjR2xhc3Mgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDYuMDAjV29vZCB3YXN0ZSBvciBzY3JhcCMxMS4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNC4xNi4wNy4wMCNSdWJiZXIgd2FzdGUgb3Igc2NyYXAjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMDguMDAjSGF6YXJkb3VzIHdhc3RlIG9yIHNjcmFwIzExLjE0LjE2LjAwLjAwCi11bnNwc2M3IzExLjE0LjE2LjA5LjAwI0NvbXBvc2l0aW9uIGxlYXRoZXIjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTYuMTAuMDAjTGVhdGhlciB3YXN0ZSBhbmQgc2NyYXAjMTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTcuMDAuMDAjRm9vZCBhbmQgdG9iYWNjbyB3YXN0ZSBhbmQgc2NyYXAjMTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTQuMTcuMDEuMDAjRm9vZCB3YXN0ZSBvciBzY3JhcCMxMS4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNC4xNy4wMi4wMCNUb2JhY2NvIHdhc3RlIG9yIHNjcmFwIzExLjE0LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjAwLjAwLjAwI0ZpYmVycyBhbmQgdGhyZWFkcyBhbmQgeWFybnMjMTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTUuMDAuMDAjRmliZXJzIzExLjE1LjAwLjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjAxLjAwI0FjZXRhdGUgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjAyLjAwI055bG9uIGZpYmVycyMxMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNS4wMy4wMCNQb2x5ZXN0ZXIgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA0LjAwI0FjcnlsaWMgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA1LjAwI1Zpc2Nvc2UgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA2LjAwI1JheW9uIGZpYmVycyMxMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNS4wNy4wMCNDb3R0b24gZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA4LjAwI1dvb2wgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjA5LjAwI1NpbGsgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjEwLjAwI1ZlZ2V0YWJsZSBmaWJlcnMjMTEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTUuMTEuMDAjUG9seXByb3B5bGVuZSBmaWJlcnMjMTEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTUuMTIuMDAjR2xhc3MgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjEzLjAwI0NlcmFtaWMgZmliZXJzIzExLjE1LjE1LjAwLjAwCi11bnNwc2M3IzExLjE1LjE1LjE0LjAwI1BvbHltZXIgYXJhbWlkIGZpYmVycyMxMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNS4xNS4wMCNBc2Jlc3RvcyBmaWJlcnMjMTEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMDAuMDAjVGhyZWFkcyMxMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNi4wMS4wMCNDb3R0b24gdGhyZWFkIzExLjE1LjE2LjAwLjAwCi11bnNwc2M3IzExLjE1LjE2LjAyLjAwI1NpbGsgdGhyZWFkIzExLjE1LjE2LjAwLjAwCi11bnNwc2M3IzExLjE1LjE2LjAzLjAwI1BvbHllc3RlciB0aHJlYWQjMTEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMDQuMDAjUG9seWFtaWRlIHRocmVhZCMxMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNi4wNS4wMCNCaXNtYWxlbWlkZSB0aHJlYWQjMTEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMDYuMDAjRmliZXJnbGFzcyB0aHJlYWQjMTEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMDcuMDAjR3JhcGhpdGUgdGhyZWFkIzExLjE1LjE2LjAwLjAwCi11bnNwc2M3IzExLjE1LjE2LjA4LjAwI055bG9uIHRocmVhZCMxMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNi4wOS4wMCNSZXNpbiBpbXByZWduYXRlZCB0aHJlYWQjMTEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTYuMTAuMDAjUnViYmVyIG9yIGxhdGV4IHRocmVhZCMxMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNi4xMS4wMCNTcGFuZGV4IHRocmVhZCMxMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4wMC4wMCNZYXJucyMxMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4wMS4wMCNXb29sIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTcuMDIuMDAjQ290dG9uIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTcuMDMuMDAjUG9seWVzdGVyIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTcuMDQuMDAjQWNyeWxpYyB5YXJuIzExLjE1LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjE3LjA1LjAwI1NpbGsgeWFybiMxMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4wNi4wMCNSYW1pZSB5YXJuIzExLjE1LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjE3LjA3LjAwI0ZsYXggeWFybiMxMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4wOC4wMCNBbmltYWwgaGFpciB5YXJuIzExLjE1LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjE3LjA5LjAwI1N5bnRoZXRpYyB5YXJuIzExLjE1LjE3LjAwLjAwCi11bnNwc2M3IzExLjE1LjE3LjEwLjAwI0p1dGUgeWFybiMxMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4xMS4wMCNDb2lyIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTUuMTcuMTIuMDAjUGFwZXIgeWFybiMxMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNS4xNy4xMy4wMCNIZW1wIHlhcm4jMTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMDAuMDAuMDAjRmFicmljcyBhbmQgbGVhdGhlciBtYXRlcmlhbHMjMTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTUuMDAuMDAjU2lsayBmYWJyaWNzIzExLjE2LjAwLjAwLjAwCi11bnNwc2M3IzExLjE2LjE1LjAxLjAwI1BsYWluIHdlYXZlIHNpbGsgZmFicmljcyMxMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMS4xNi4xNS4wMi4wMCNKYWNxdWFyZCB3ZWF2ZSBzaWxrIGZhYnJpY3MjMTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTUuMDMuMDAjS25pdCBzaWxrIGZhYnJpY3MjMTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTUuMDQuMDAjU2lsayB2ZWx2ZXRzIGZhYnJpY3MjMTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTYuMDAuMDAjV29vbCBmYWJyaWNzIzExLjE2LjAwLjAwLjAwCi11bnNwc2M3IzExLjE2LjE2LjAxLjAwI1BsYWluIHdlYXZlIHdvb2wgZmFicmljcyMxMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMxMS4xNi4xNi4wMi4wMCNKYWNxdWFyZCB3ZWF2ZSB3b29sIGZhYnJpY3MjMTEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTYuMDMuMDAjS25pdCB3b29sIGZhYnJpY3MjMTEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDAuMDAjQ290dG9uIGZhYnJpY3MjMTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDEuMDAjUGxhaW4gd2VhdmUgY290dG9uIGZhYnJpY3MjMTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDIuMDAjVHdpbGwgd2VhdmUgY290dG9uIGZhYnJpY3MjMTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDMuMDAjQ290dG9uIG94Zm9yZCBjbG90aHMjMTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTcuMDQuMDAjS25pdCBjb3R0b24gZmFicmljcyMxMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMS4xNi4xNy4wNS4wMCNDb3R0b24gdmVsdmV0IGZhYnJpY3MjMTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDAuMDAjU3ludGhldGljIGZhYnJpY3MjMTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDEuMDAjUGxhaW4gd2VhdmUgc3ludGhldGljIGZhYnJpY3MjMTEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDIuMDAjSmFjcXVhcmQgd2VhdmUgc3ludGhldGljIGZhYnJpY3MjMTEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDMuMDAjRG9iYnkgd2VhdmUgc3ludGhldGljIGZhYnJpY3MjMTEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTguMDQuMDAjS25pdCBzeW50aGV0aWMgZmFicmljcyMxMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMxMS4xNi4xOC4wNS4wMCNTeW50aGV0aWMgdmVsdmV0IGZhYnJpY3MjMTEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTkuMDAuMDAjQXJ0aWZpY2lhbCBmYWJyaWNzIzExLjE2LjAwLjAwLjAwCi11bnNwc2M3IzExLjE2LjE5LjAxLjAwI1BsYWluIHdlYXZlIGFydGlmaWNpYWwgZmFicmljcyMxMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMS4xNi4xOS4wMi4wMCNKYWNxdWFyZCB3ZWF2ZSBhcnRpZmljaWFsIGZhYnJpY3MjMTEuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMTkuMDMuMDAjRG9iYnkgd2VhdmUgYXJ0aWZpY2lhbCBmYWJyaWNzIzExLjE2LjE5LjAwLjAwCi11bnNwc2M3IzExLjE2LjE5LjA0LjAwI0tuaXQgYXJ0aWZpY2lhbCBmYWJyaWNzIzExLjE2LjE5LjAwLjAwCi11bnNwc2M3IzExLjE2LjE5LjA1LjAwI0FydGlmaWNhbCB2ZWx2ZXQgZmFicmljcyMxMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMC4wMC4wMCNGYWJyaWNzIG9mIHZlZ2V0YWJsZSBtYXRlcmlhbCBvdGhlciB0aGFuIGNvdHRvbiMxMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMC4wMS4wMCNQbGFpbiB3ZWF2ZSBub24gY290dG9uIHZlZ2V0YWJsZSBmaWJlciBmYWJyaWNzIzExLjE2LjIwLjAwLjAwCi11bnNwc2M3IzExLjE2LjIwLjAyLjAwI0tuaXQgbm9uIGNvdHRvbiB2ZWdldGFibGUgZmliZXIgZmFicmljcyMxMS4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMC4wMy4wMCNIZXNzaWFuIG9yIGhlbXAgb3IganV0ZSBjbG90aCMxMS4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wMC4wMCNTcGVjaWFsdHkgZmFicmljcyBvciBjbG90aCMxMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wMS4wMCNDaGVlc2UgY2xvdGggb3IgZmFicmljIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjAyLjAwI0Jpc21hbGVtaWRlIGZhYnJpYyBvciBjbG90aCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wMy4wMCNGaWJlcmdsYXNzIGZhYnJpYyBvciBjbG90aCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wNC4wMCNHcmFwaGl0ZSBmYWJyaWMgb3IgY2xvdGgjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMDUuMDAjR2xhc3MgZmFicmljIG9yIGNsb3RoIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjA3LjAwI1Jlc2luIGltcHJlZ25hdGVkIGZhYnJpYyBvciBjbG90aCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4wOC4wMCNXaXJlIG1lc2ggZmFicmljIG9yIGNsb3RoIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjA5LjAwI0xhY2UjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTAuMDAjTmV0dGluZyMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4xMS4wMCNNZXNoIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjEyLjAwI0NvYXRlZCBmYWJyaWNzIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjEzLjAwI1VwaG9sc3RlcnkgZmFicmljcyMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4xNC4wMCNIb29rIGFuZCBsb29wIGZhYnJpY3Mgb3IgdGFwZXMjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTUuMDAjRWxhc3RpYyBicmFpZCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4xNi4wMCNCdXJsYXAgY2xvdGgjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTcuMDAjUnViYmVyIGZhYnJpY3MjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTguMDAjUGFwZXIgeWFybiBmYWJyaWMjMTEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjEuMTkuMDAjVHJhY2luZyBjbG90aCMxMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMS4yMC4wMCNCb2x0aW5nIGNsb3RoIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIxLjIxLjAwI09ybmFtZW50YWwgdHJpbW1pbmdzIzExLjE2LjIxLjAwLjAwCi11bnNwc2M3IzExLjE2LjIyLjAwLjAwI05vbndvdmVuIGZhYnJpY3MjMTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjIuMDEuMDAjU3B1bmJvbmRlZCBub253b3ZlbnMjMTEuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjIuMDIuMDAjU3B1bmxhY2VkIG5vbndvdmVucyMxMS4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMy4wMC4wMCNMZWF0aGVycyMxMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMy4wMS4wMCNDaGFtb2lzIGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDIuMDAjR29hdCBsZWF0aGVyIzExLjE2LjIzLjAwLjAwCi11bnNwc2M3IzExLjE2LjIzLjAzLjAwI1NoZWVwIGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDQuMDAjUGF0ZW50IGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDUuMDAjQ293IGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDYuMDAjUGlnIGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTEuMTYuMjMuMDcuMDAjU3ludGhldGljIG9yIGltaXRhdGlvbiBsZWF0aGVyIzExLjE2LjIzLjAwLjAwCi11bnNwc2M3IzExLjE2LjIzLjA4LjAwI0J1ZmZhbG8gbGVhdGhlciMxMS4xNi4yMy4wMC4wMAotdW5zcHNjNyMxMS4xNi4yMy4wOS4wMCNSZXB0aWxlIGxlYXRoZXIjMTEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTIuMDAuMDAuMDAuMDAjQ2hlbWljYWxzIGluY2x1ZGluZyBCaW8gQ2hlbWljYWxzIGFuZCBHYXMgTWF0ZXJpYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjAwLjAwLjAwI09yZ2FuaWMgY2hlbWljYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjE1LjAwLjAwI0FsY29ob2wjMTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTUuMDEuMDAjU2F0dXJhdGVkIG1vbm9oeWRyaWMgYWxjb2hvbCMxMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNS4wMi4wMCNJc29wcm9weWwgYWxjb2hvbCMxMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNS4wMy4wMCNVbnNhdHVyYXRlZCBtb25vaHlkcmljIGFsY29ob2wjMTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTUuMDQuMDAjQ3ljbGljIGFsY29ob2wgb3IgdGhlaXIgaGFsb2dlbmF0ZWQgb3Igc3VscGhvbmF0ZWQgb3Igbml0cmF0ZWQgZGVyaXZhdGl2ZXMjMTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTUuMDUuMDAjUGhlbm9sIGFsY29ob2wjMTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTUuMDYuMDAjSGFsb2dlbmF0ZWQgb3Igc3VscGhvbmF0ZWQgb3Igbml0cmF0ZWQgb3Igbml0cm9zYXRlZCBkZXJpdmF0aXZlcyBvZiBwaGVub2xzIzEyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE1LjA3LjAwI01ldGh5bGF0ZWQgc3Bpcml0IzEyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjAwLjAwI0V0aGVycyBhbmQgYWxjb2hvbCBwZXJveGlkZXMgYW5kIGV0aGVyIHBlcm94aWRlcyBhbmQgb3RoZXIgb3JnYW5pYyBjb21wb3VuZHMjMTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMDEuMDAjQWN5Y2xpYyBldGhlcnMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMDIuMDAjQ3ljbG9uaWMgb3IgY3ljbGVuaWMgb3IgY3ljbG90ZXJwZW5pYyBldGhlcnMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMDMuMDAjRXRoZXIgb3IgYXJvbWF0aWMgZXRoZXIjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMDQuMDAjRXRoZXIgYWxjb2hvbCMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4wNS4wMCNFdGhlciBwaGVub2xzIG9yIGV0aGVyIGFsY29ob2wgcGhlbm9scyMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4wNi4wMCNBbGNvaG9sIHBlcm94aWRlcyMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4wNy4wMCNPeGlyYW5lIG9yIGV0aHlsZW5lIG94aWRlIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjA4LjAwI0VwaWNobG9yb2h5ZHJpbiBvciAxIGNobG9ybyAyIG9yIDMgZXBveHlwcm9wYW5lIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjA5LjAwI0Vwb3hpZGVzIG9yIGVwb3h5YWxjb2hvbHMgb3IgZXBveHlwaGVub2xzIG9yIGVwb3h5ZXRoZXJzIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjEwLjAwI0FjZXRhbHMgb3Iga2VtaWFjZXRhbHMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMTEuMDAjQWN5Y2xpYyBhbGRlaHlkZXMgd2l0aG91dCBvdGhlciBveHlnZW4gZnVuY3Rpb24jMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMTIuMDAjQ3ljbGljIGFsZGVoeWRlcyB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4xMy4wMCNBbGNvaG9sIGFsZGVoeWRlIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjE0LjAwI1BhcmFmb3JtYWxkZWh5ZGUjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMTUuMDAjQWxkZWh5ZGVzIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjE2LjAwI0FjeWNsaWMga2V0b25lcyB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4xNy4wMCNDeWNsb25pYyBvciBjeWNsZW5pYyBvciBjeWNsb3RlcnBlbmljIGtldG9uZXMgd2l0aG91dCBvdGhlciBveHlnZW4gZnVuY3Rpb24jMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMTguMDAjS2V0b25lcyBvciBhcm9tYXRpYyB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNi4xOS4wMCNLZXRvbmUgYWxjb2hvbCBvciBrZXRvbmUgYWxkZWh5ZGVzIzEyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE2LjIwLjAwI0tldG9uZSBwaGVub2xzIG9yIGtldG9uZXMgd2l0aCBvdGhlciBveHlnZW4gZnVuY3Rpb24jMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMjEuMDAjUXVpbm9uZXMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMjIuMDAjUmVubmV0IHRhYmxldHMjMTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTYuMjMuMDAjRW56eW1lcyMxMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNy4wMC4wMCNNb25vY2FyYm94eWxpYyBmYXR0eSBhY2lkcyBvciBpbmR1c3RyaWFsIGFjaWQgb2lscyBmcm9tIHJlZmluaW5nIzEyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjE3LjAxLjAwI09sZWljIGFjaWQjMTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTcuMDIuMDAjSW5kdXN0cmlhbCBmYXR0eSBhbGNvaG9scyMxMi4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMC4xNy4wMy4wMCNTdGVhcmljIGFjaWQjMTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTcuMDQuMDAjVGFsbCBvaWwgZmF0dHkgYWNpZHMjMTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTcuMDUuMDAjQWNpZCBvaWxzIGZyb20gcmVmaW5pbmcjMTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDAuMDAjQ2FyYm94eWxpYyBhY2lkcyBhbmQgdGhlaXIgYW5oeWRyaWRlcyBhbmQgaGFsaWRlcyBhbmQgcGVyb3hpZGVzIGFuZCBwZXJveHlhY2lkcyMxMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4wMS4wMCNGb3JtaWMgYWNpZCBvciBpdHMgc2FsdHMgb3IgZXN0ZXJzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjAyLjAwI0FjZXRpYyBhY2lkIG9yIGl0cyBzYWx0cyBvciAgYWNldGljIGFuaHlkcmlkZSMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4wMy4wMCNFc3RlcnMgb2YgYWNldGljIGFjaWQjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDQuMDAjTW9ubyBvciBkaSB0cmljaGxvcmFjZXRpYyBhY2lkIG9yIHRoZWlyIHNhbHRzIG9yIGVzdGVycyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4wNS4wMCNQcm9waW9uaWMgYWNpZCBvciBpdHMgc2FsdHMgb3IgZXN0ZXJzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjA2LjAwI0J1dHlyaWMgYWNpZHMgb3IgdmFsZXJpYyBhY2lkcyBvciB0aGVpciBzYWx0cyBvciBlc3RlcnMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDcuMDAjUGFsbWl0aWMgYWNpZHMgb3Igc3RlYXJpYyBhY2lkcyBvciB0aGVpciBzYWx0cyBvciBlc3RlcnMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDguMDAjU2F0dXJhdGVkIGFjcnlsaWMgbW9ub2NhcmJveHlsaWMgYWNpZHMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMDkuMDAjVW5zYXR1cmF0ZWQgYWN5Y2xpYyBtb25vY2FyYm94eWxpYyBhY2lkcyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xMC4wMCNDeWNsb25pYyBvciBjeWNsZW5pYyBvciBjeWNsb3RlcnBlbmljIG1vbm9jYXJib3h5bGljIGFjaWRzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjExLjAwI0Fyb21hdGljIG1vbm9jYXJib3h5bGljIGFjaWRzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjEyLjAwI0FjeWNsaWMgcG9seWNhcmJveHlsaWMgYWNpZHMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMTMuMDAjQ3ljbG9uaWMgb3IgY3ljbGVuaWMgb3IgY3ljbG90ZXJwZW5pYyBwb2x5Y2FyYm94eWxpYyBhY2lkcyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xNC4wMCNBcm9tYXRpYyBwb2x5Y2FyYm94eWxpYyBhY2lkcyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xNS4wMCNMYWN0aWMgYWNpZCBvciBpdHMgc2FsdHMgb3IgZXN0ZXJzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjE2LjAwI1RhcnRhcmljIGFjaWQgb3IgaXRzIHNhbHRzIG9yIGVzdGVycyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xNy4wMCNBdHJpYyBhY2lkIG9yIHRzIHNhbHRzIG9yIGVzdGVycyMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4xOC4wMCNHbHVjYXJpYyBhY2lkIG9yIGl0cyBzYWx0cyBvciBlc3RlcnMjMTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTAuMTguMTkuMDAjUGhlbnlsZ2x5b2NvbGljIGFjaWQgb3IgbWFuZGVsaWMgYWNpZCBvciBpdHMgc2FsdHMgb3IgZXN0ZXJzIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE4LjIwLjAwI0NhcmJveHlsaWMgYWNpZHMgd2l0aCBhbGNvaG9sIGZ1bmN0aW9uIGJ1dCB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4yMS4wMCNDYXJib3h5bGljIGFjaWRzIHdpdGggcGhlbm9sIGZ1bmN0aW9uIGJ1dCB3aXRob3V0IG90aGVyIG94eWdlbiBmdW5jdGlvbiMxMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMC4xOC4yMi4wMCNDYXJib3h5bGljIGFjaWRzIHdpdGggYWxkZWh5ZGUgb3Iga2V0b25lIGZ1bmN0aW9uIzEyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEwLjE5LjAwLjAwI0FtaW5lIGFuZCBveHlnZW4gZnVuY3Rpb24gYW1pbm8gY29tcG91bmRzIGFuZCB1cmVpbmVzIzEyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjE5LjAxLjAwI0dsdXRhbWljIGFjaWQgb3IgaXRzIHNhbHRzIzEyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzEyLjEwLjIwLjAwLjAwI09yZ2FubyBzdWxmdXIgY29tcG91bmRzIGFuZCBvdGhlciBvcmdhbm8gaW5vcmdhbmljIGNvbXBvdW5kcyMxMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wMS4wMCNPcmdhbm8gc3VsZnVyIGNvbXBvdW5kcyMxMi4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wMi4wMCNPdGhlciBvcmdhbm8gaW5vcmdhbmljIGNvbXBvdW5kcyMxMi4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wMy4wMCNDb21wb3VuZHMgY29udGFpbmluZyBhbiB1bmZ1c2VkIGZ1cmFuIHJpbmcgaW4gdGhlIHN0cnVjdHVyZSMxMi4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wNC4wMCNMYWN0aW5lcyMxMi4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMC4wNS4wMCNDb21wb3VuZHMgY29udGFpbmluZyBhbiB1bmZ1c2VkIGltaWRhem9sZSByaW5nIGluIHRoZSBzdHJ1Y3R1cmUjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjAuMDYuMDAjQ29tcG91bmRzIGNvbnRhaW5pbmcgYW4gdW5mdXNlZCBweXJpZGluZSByaW5nIGluIHRoZSBzdHJ1Y3R1cmUjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjAuMDcuMDAjQ29tcG91bmRzIGNvbnRhaW5pbmcgYSBxdWlub2xpbmUgb3IgaXNvcXVpbm9saW5lIHJpbmcgc3lzdGVtIzEyLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEyLjEwLjIwLjA4LjAwI0xhY3RhbXMjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjAuMDkuMDAjSGV0ZXJvY3ljbGljIGNvbXBvdW5kcyB3aXRoIG5pdHJvZ2VuIGhldGVybyBhdG9tIG9ubHkjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjAuMTAuMDAjQ29tcG91bmRzIGNvbnRhaW5pbmcgYW4gdW5mdXNlZCB0aGlhem9sZSByaW5nIGluIHRoZSBzdHJ1Y3R1cmUjMTIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDAuMDAjSHlkcm9jYXJib25zIGFuZCB0aGVpciBoYWxvZ2VuYXRlZCBhbmQgc3VscGhvbmF0ZWQgYW5kIG5pdHJvc2F0ZWQgZGVyaXZhdGl2ZXMjMTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDEuMDAjU2F0dXJhdGVkIGFjeWNsaWMgaHlkcm9jYXJib25zIzEyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEyLjEwLjIxLjAyLjAwI1Vuc2F0dXJhdGVkIGFjeWNsaWMgaHlkcm9jYXJib25zIzEyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEyLjEwLjIxLjAzLjAwI0N5Y2xpYyBoeWRyb2NhcmJvbnMjMTIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDQuMDAjSGFsb2dlbnRhdGVkIGRlcml2YXRpdmVzIG9mIGh5ZHJvY2FyYm9ucyMxMi4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMS4wNS4wMCNSZWZyaWdlcmFudHMjMTIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDYuMDAjU3VscGhvbmF0ZWQgb3Igbml0cmF0ZWQgb3Igbml0cm9zYXRlZCBkZXJpdmF0aXZlcyBvZiBoeWRyb2NhcmJvbnMjMTIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjEuMDcuMDAjUGFyYWZmaW4jMTIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTAuMjIuMDAuMDAjUGhvc3Bob3JpYyBlc3RlcnMgYW5kIHRoZWlyIHNhbHRzIGFuZCBlc3RlcnMgb2Ygb3RoZXIgb3JnYW5pYyBhY2lkcyMxMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMC4yMi4wMS4wMCNQaG9zcGhvcmljIGVzdGVycyBvciB0aGVpciBzYWx0cyMxMi4xMC4yMi4wMC4wMAotdW5zcHNjNyMxMi4xMS4wMC4wMC4wMCNJbm9yZ2FuaWMgY2hlbWljYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjAwLjAwI0NoZW1pY2FsIGVsZW1lbnRzIzEyLjExLjAwLjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjAxLjAwI0NobG9yaW5lIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjAyLjAwI0ZsdW9yaW5lIG9yIGJyb21pbmUjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMDMuMDAjQ2hsb3JpbmUgbGlxdWlkIGdhcyMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4wNC4wMCNTdWJsaW1lcyBvciBwcmVjaXBpdGF0ZWQgc3VscGh1ciBvciBjb2xsb2lkYWwgc3VscGh1ciMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4wNS4wMCNCb3JvbiBvciB0ZWxsdXJpdW0jMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMDYuMDAjU2lsaWNvbiMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4wNy4wMCNBbGthbGkgbWV0YWxzIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjA4LjAwI0Fsa2FsaW5lIGVhcnRoIG1ldGFscyMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4wOS4wMCNNZXJjdXJ5IzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjEwLjAwI0h5ZHJvZ2VuIGNobG9yaWRlIG9yIGh5ZHJvY2hsb3JpYyBhY2lkIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjExLjAwI0NobG9yb3N1bGZ1cmljIGFjaWQjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMTIuMDAjU3VscGh1cmljIGFjaWQjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMTMuMDAjUGhvc3Bob3J1cyBwZW50YW94aWRlIG9yIHBob3NwaG9yaWMgYWNpZCBvciBwb2x5cGhvc3Bob3JpYyBhY2lkcyMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4xNC4wMCNPeGlkZXMgb2YgYm9yb24gb3IgYm9yaWMgYWNpZHMjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMTUuMDAjSHlkcm9nZW4gZmx1b3JpZGUgb3IgaHlkcm9mbHVvcmljIGFjaWQjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTYuMTYuMDAjU2lsaWNvbiBkaW94aWRlIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjE3LjAwI1N1bHBodXIgZGlveGlkZSMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4xOC4wMCNIeWRyb2N5YW5pYyBhY2lkIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjE5LjAwI0hhbGlkZXMgb3IgaGFsaWRlIG94aWRlcyBvZiBub24gbWV0YWxzIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjIwLjAwI1N1bHBoaWRlcyBvZiBub24gbWV0YWxzIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjIxLjAwI1NvZGl1bSBvciBwb3Rhc3NpdW0gaHlkcm94aWRlIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjIyLjAwI0h5ZHJveGlkZSBvciBwZXJveGlkZSBvZiBtYWduZXNpdW0gb3Igb3hpZGVzIzEyLjExLjE2LjAwLjAwCi11bnNwc2M3IzEyLjExLjE2LjIzLjAwI0FsdW1pbnVtIGh5ZHJveGlkZSMxMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNi4yNC4wMCNIeWRyb3hpZGUgb3IgaHlkcm94eWxhbWluZSBvciB0aGVpciBpbm9yZ2FuaWMgc2FsdHMjMTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMDAuMDAjTWV0YWwgb3hpZGVzIGFuZCBoeWRyb3hpZGVzIGFuZCBwZXJveGlkZXMjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMDEuMDAjWmluYyBveGlkZSBvciB6aW5jIHBlcm94aWRlIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjAyLjAwI0Nocm9taXVtIG94aWRlcyBvciBoeWRyb3hpZGVzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjAzLjAwI01hbmdhbmVzZSBveGlkZXMjMTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMDQuMDAjSXJvbiBveGlkZXMgb3IgaHlkcm94aWRlcyBvciBlYXJ0aCBjb2xvdXJzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjA1LjAwI0NvYmFsdCBveGlkZXMgb3IgaHlkcm94aWRlcyBvciBjb21tZXJjaWFsIGNvYmFsdCBveGlkZXMjMTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMDYuMDAjVGl0YW5pdW0gb3hpZGVzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjA3LjAwI0xlYWQgb3hpZGVzIG9yIHJlZCBsZWFkIG9yIG9yYW5nZSBsZWFkIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjA4LjAwI0xpdGhpdW0gb3hpZGUgb3IgaHlkcm94aWRlIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjA5LjAwI1ZhbmFkaXVtIG94aWRlcyBvciBoeWRyb3hpZGVzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjEwLjAwI05pY2tlbCBveGlkZXMgb3IgaHlkcm94aWRlcyMxMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNy4xMS4wMCNDb3BwZXIgb3hpZGVzIG9yIGh5ZHJveGlkZXMjMTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTcuMTIuMDAjR2VybWFuaXVtIG94aWRlcyBvciB6aXJjb25pdW0gZGlveGlkZSMxMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMS4xNy4xMy4wMCNNb2x5YmRlbnVtIG94aWRlcyBvciBoeWRyb3hpZGVzIzEyLjExLjE3LjAwLjAwCi11bnNwc2M3IzEyLjExLjE3LjE0LjAwI0FudGltb255IG94aWRlcyMxMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wMC4wMCNTYWx0cyBvZiBveG9tZXRhbGxpYyBhbmQgcGVyb3hvbWV0YWxsaWMgYWNpZHMgYW5kIG90aGVyIGlub3JnYW5pYyBhY2lkcyMxMi4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wMS4wMCNBbHVtaW5hdGVzIzEyLjExLjE4LjAwLjAwCi11bnNwc2M3IzEyLjExLjE4LjAyLjAwI1ppbmMgb3IgbGVhZCBjaHJvbWF0ZSMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wMy4wMCNTb2RpdW0gZGljaHJvbWF0ZSMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wNC4wMCNQb3Rhc3NpdW0gZGljaHJvbWF0ZSMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wNS4wMCNPdGhlciBjaHJvbWF0ZSBvciBkaWNocm9tYXRlIG9yIHBlcm94b2Nocm9tYXRlcyMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wNi4wMCNNYW5nYW5pdGVzIG9yIG1hbmdhbmF0ZXMgb3IgcGVybWFuZ2FuYXRlcyMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4wNy4wMCNNb2x5YmRhdGVzIzEyLjExLjE4LjAwLjAwCi11bnNwc2M3IzEyLjExLjE4LjA4LjAwI1R1bmdzdGF0ZXMgb3Igd29sZnJhbWF0ZXMjMTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTguMDkuMDAjU2lsdmVyIGNvbXBvdW5kcyMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4xMC4wMCNHb2xkIGNvbXBvdW5kcyMxMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOC4xMS4wMCNPdGhlciBjb21wb3VuZHMgb3IgYW1hbGdhbXMjMTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTguMTIuMDAjQW1hbGdhbXMgb3RoZXIgdGhhbiBhbWFsZ2FtcyBvZiBwcmVjaW91cyBtZXRhbHMjMTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDAuMDAjU2FsdHMgYW5kIHBlcm94eXNhbHRzIG9mIGlub3JnYW5pYyBhY2lkcyBhbmQgbWV0YWwjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDEuMDAjRmx1b3JpZGVzIG9yIGZsdW9yb3NpbGljYXRlcyBvciBmbHVvcm9hbHVtaW5hdGVzIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjAyLjAwI0NobG9yaWRlcyMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4wMy4wMCNTb2RpdW0gY2hsb3JpZGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDQuMDAjU2FsIGFtbW9uaWFjIGJsb2NrcyMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4wNS4wMCNQb3Rhc3NpdW0gaW9kaW5hdGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDYuMDAjU3VscGhpZGVzIG9yIHBvbHlzdWxmaWRlcyBvciBkaXRoaW9uaXRlcyBvciAgc3VsZm94eWxhdGVzIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjA3LjAwI1N1bHBoaXRlcyBvciB0aGlvc3VsZmF0ZXMjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDguMDAjQWx1bWludW0gc3VscGhhdGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMDkuMDAjQ29sbG9pZGFsIHByZWNpb3VzIG1ldGFscyMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4xMC4wMCNGZXJyb3VzIHN1bHBoYXRlIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjExLjAwI1NpbHZlciBuaXRyYXRlIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjEyLjAwI1NvZGl1bSBkaWh5ZHJvZ2Vybm9ydGhvcGhvc3BoYXRlIzEyLjExLjE5LjAwLjAwCi11bnNwc2M3IzEyLjExLjE5LjEzLjAwI1NvZGl1bSBwaG9zcGhhdGUgZGliYXNpYyMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4xNC4wMCNTb2RpdW0gYmljYXJib25hdGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMTUuMDAjVHJpIHNvZGl1bSBjaXRyYXRlIGRpIGh5ZHJhdGUjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMTYuMDAjU29kaXVtIGNhcmJvbmF0ZSMxMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xMS4xOS4xNy4wMCNNZXRhbGxpYyBzb2RpdW0jMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMTguMDAjU29kaXVtIHNpbGljYXRlIGxpcXVpZHMjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMTkuMTkuMDAjU29kaXVtIHNpbGljYXRlIGJpbmRlcnMjMTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjAuMDAuMDAjSHlkcm9nZW4gcGVyb3hpZGUgYW5kIGh5ZHJpZGVzIGFuZCBuaXRyaWRlcyBhbmQgYXNpZGVzIGFuZCBzaWxpY2lkZXMgYW5kIGJvcmlkZXMjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjAuMDEuMDAjSHlkcm9nZW4gcGVyb3hpZGUjMTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjAuMDIuMDAjUGhvc3BoaWRlcyMxMi4xMS4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMC4wMy4wMCNDYXJiaWRlcyMxMi4xMS4yMC4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMC4wNC4wMCNDYWxjaXVtIGNhcmJpZGUjMTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjAuMDUuMDAjQnJvbWlkZXMjMTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDAuMDAjSXNvdG9wZXMgYW5kIHRoZWlyIGNvbXBvdW5kcyBpbm9yZ2FuaWMgYW5kIG9yZ2FuaWMjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDEuMDAjRGV1dGVyaXVtIzEyLjExLjIxLjAwLjAwCi11bnNwc2M3IzEyLjExLjIxLjAyLjAwI0RldXRlcmF0ZWQgc29sdmVudHMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDMuMDAjSGVhdnkgd2F0ZXIjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDQuMDAjQWxwaGEgc291cmNlcyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4wNS4wMCNCZXRhIHNvdXJjZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDYuMDAjQ29iYWx0IHNvdXJjZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDcuMDAjR2FtbWEgc291cmNlcyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4wOC4wMCNOZXV0cm9uIHNvdXJjZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMDkuMDAjUmFkaW9pc290b3BlIHNvdXJjZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMTAuMDAjQ2FsaWJyYXRpb24gc291cmNlcyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4xMS4wMCNJbiB2aXZvIHByb2R1Y3RzIzEyLjExLjIxLjAwLjAwCi11bnNwc2M3IzEyLjExLjIxLjEyLjAwI1JhZGlvY2hlbWljYWwgaXNvdG9wZXMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMTMuMDAjUmFkaW9ncmFwaGljIHNvdXJjZSMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4xNC4wMCNSYWRpb2ltbXVub2Fzc2F5IGlzb3RvcGVzIzEyLjExLjIxLjAwLjAwCi11bnNwc2M3IzEyLjExLjIxLjE1LjAwI1RyaXRpdW0gdGFyZ2V0cyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4xNi4wMCNFeGNpdGF0aW9uIHNvdXJjZSBvciBhbm51bGFyIzEyLjExLjIxLjAwLjAwCi11bnNwc2M3IzEyLjExLjIxLjE3LjAwI1JhZGlvcGhhcm1hY2V1dGljYWwgY29tcG91bmRzIGZvciBsYWJlbGxpbmcjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjEuMTguMDAjQ2hlbWljYWxzIGxhYmVsbGVkIEMxNCMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4xOS4wMCNGaXNzaW9uYWJsZSBpc290b3BlcyMxMi4xMS4yMS4wMC4wMAotdW5zcHNjNyMxMi4xMS4yMS4yMC4wMCNJbiB2aXZvIHJhZGlvYWN0aXZlIGlzb3RvcGUgcHJvZHVjdHMjMTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjIuMDAuMDAjQ3lhbmlkZXMjMTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTEuMjIuMDEuMDAjQ3lhbmlkZXMgb3IgY3lhbmlkZSBveGlkZXMgb2Ygc29kaXVtIzEyLjExLjIyLjAwLjAwCi11bnNwc2M3IzEyLjExLjIyLjAyLjAwI0NvbXBsZXggY3lhbmlkZXMgb3IgdGhpb2N5YW5hdGVzIzEyLjExLjIyLjAwLjAwCi11bnNwc2M3IzEyLjExLjIyLjAzLjAwI0N5YW5pZGVzIG9yIGN5YW5pZGUgb3hpZGVzIzEyLjExLjIyLjAwLjAwCi11bnNwc2M3IzEyLjEyLjAwLjAwLjAwI0dhc2VzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEyLjE1LjAwLjAwI0luZHVzdHJpYWwgZ2FzZXMjMTIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTUuMDEuMDAjTml0cm91cyBveGlkZSBnYXMjMTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTUuMDIuMDAjSGVsaXVtIGdhcyMxMi4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNS4wNC4wMCNDYXJib24gbW9ub3hpZGUjMTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTUuMDUuMDAjSHlkcm9nZW4gZ2FzIzEyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE1LjA2LjAwI0NhcmJvbiBkaW94aWRlIzEyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE1LjA3LjAwI05pdHJvZ2VuIGdhcyMxMi4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNS4wOC4wMCNOZW9uIGdhcyMxMi4xMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNS4xMC4wMCNPeHlnZW4jMTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTYuMDAuMDAjUmFyZSBnYXNlcyMxMi4xMi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNi4wMS4wMCNYZW5vbiBnYXMjMTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTYuMDIuMDAjUmFkb24gZ2FzIzEyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE2LjAzLjAwI0tyeXB0b24gZ2FzIzEyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE2LjA0LjAwI0FyZ29uIGdhcyMxMi4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMi4xNi4wOS4wMCNYZW5vbiBnYXMjMTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTIuMTYuMTAuMDAjUmFkb24gZ2FzIzEyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE2LjExLjAwI0tyeXB0b24gZ2FzIzEyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEyLjE2LjEyLjAwI0FyZ29uIGdhcyMxMi4xMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMy4wMC4wMC4wMCNFeHBsb3NpdmUgbWF0ZXJpYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEzLjE1LjAwLjAwI0V4cGxvc2l2ZXMjMTIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTUuMDEuMDAjRHluYW1pdGUjMTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTUuMDIuMDAjRXhwbG9zaXZlIGNhcnRyaWRnZXMjMTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTUuMDMuMDAjUHJvcGVsbGFudCBleHBsb3NpdmVzIzEyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE1LjA0LjAwI0V4cGxvc2l2ZSBjaGFyZ2VzIzEyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE1LjA1LjAwI1BsYXN0aWMgZXhwbG9zaXZlcyMxMi4xMy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xMy4xNS4wNi4wMCNBbHVtaW5pemVkIGV4cGxvc2l2ZXMjMTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTUuMDcuMDAjQW1tb25pdW0gbml0cmF0ZSBleHBsb3NpdmVzIzEyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE1LjA4LjAwI05pdHJvZ2x5Y2VyaW4gcG93ZGVyIGV4cGxvc2l2ZXMjMTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTYuMDAuMDAjUHlyb3RlY2huaWNzIzEyLjEzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEzLjE2LjAxLjAwI0ZpcmV3b3JrcyMxMi4xMy4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMy4xNi4wMi4wMCNGb2cgc2lnbmFscyMxMi4xMy4xNi4wMC4wMAotdW5zcHNjNyMxMi4xMy4xNi4wMy4wMCNSYWluIHJvY2tldHMjMTIuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTYuMDQuMDAjRmxhcmVzIzEyLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE2LjA1LjAwI1B5cm90ZWNobmljIG1hdGVyaWFscyBmb3IgdGhlYXRlciBvciB0ZWxldmlzaW9uIzEyLjEzLjE2LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjAwLjAwI0lnbml0ZXJzIzEyLjEzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjAxLjAwI0JsYXN0aW5nIGNhcHMjMTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTcuMDIuMDAjRGV0b25hdG9ycyMxMi4xMy4xNy4wMC4wMAotdW5zcHNjNyMxMi4xMy4xNy4wMy4wMCNFeHBsb3NpdmVzIGZ1c2VzIzEyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjA0LjAwI0V4cGxvc2l2ZSBpbml0aWF0b3JzIzEyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjA1LjAwI0V4cGxvc2l2ZSBwcmltZXJzIzEyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE3LjA2LjAwI01hdGNoZXMjMTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTcuMDcuMDAjTGlnaHRlcnMjMTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTguMDAuMDAjUHJvcGVsbGFudHMjMTIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTguMDEuMDAjUG93ZGVyIHByb3BlbGxhbnRzIzEyLjEzLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE4LjAyLjAwI1NvbGlkIHByb3BlbGxhbnRzIzEyLjEzLjE4LjAwLjAwCi11bnNwc2M3IzEyLjEzLjE4LjAzLjAwI0d1biBwcm9wZWxsYW50cyMxMi4xMy4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMy4xOC4wNC4wMCNIaWdoIGVuZXJneSBwcm9wZWxsYW50cyMxMi4xMy4xOC4wMC4wMAotdW5zcHNjNyMxMi4xMy4xOC4wNS4wMCNHZWxsZWQgcHJvcGVsbGFudHMjMTIuMTMuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTMuMTguMDYuMDAjSHlicmlkIHByb3BlbGxhbnRzIzEyLjEzLjE4LjAwLjAwCi11bnNwc2M3IzEyLjE0LjAwLjAwLjAwI0VsZW1lbnRzIGFuZCBnYXNlcyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNS4wMC4wMCNFYXJ0aCBtZXRhbHMjMTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTUuMDEuMDAjQmVyeWxsaXVtIChCZSkjMTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTUuMDIuMDAjTWFnbmVzaXVtIChNZykjMTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTUuMDMuMDAjQ2FsY2l1bSAoQ2EpIzEyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE1LjA0LjAwI1N0cm9udGl1bSAoU3IpIzEyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE1LjA1LjAwI0Jhcml1bSAoQmEpIzEyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE1LjA2LjAwI1JhZGl1bSAoUmEpIzEyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjAwLjAwI1JhcmUgZWFydGggbWV0YWxzIzEyLjE0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjAxLjAwI0Nlcml1bSAoQ2UpIzEyLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjAyLjAwI0R5c3Byb3NpdW0gKER5KSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4wMy4wMCNFcmJpdW0gKEVyKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4wNC4wMCNFdXJvcGl1bSAoRXUpIzEyLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjA1LjAwI0dhZG9saW5pdW0gKEdkKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4wNi4wMCNIb2xtaXVtIChIbykjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMDcuMDAjTGFudGhhbnVtIChMYSkjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMDguMDAjTHV0ZXRpdW0gKEx1KSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4wOS4wMCNOZW9keW1pdW0gKE5kKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4xMC4wMCNQcmFzZW9keW1pdW0gKFByKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4xMS4wMCNQcm9tZXRoaXVtIChQcikjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMTIuMDAjU2FtYXJpdW0gKFNtKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4xMy4wMCNTY2FuZGl1bSAoU2MpIzEyLjE0LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE2LjE0LjAwI1RlcmJpdW0gKFRiKSMxMi4xNC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNi4xNS4wMCNUaHVsaXVtIChUbSkjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMTYuMDAjWXR0ZXJiaXVtIChZYikjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTYuMTcuMDAjWXR0cml1bSAoWSkjMTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMDAuMDAjVHJhbnNpdGlvbiBtZXRhbHMjMTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMDEuMDAjQWN0aW5pdW0gKEFjKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4wMi4wMCNBbHVtaW51bSAoQWwpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjAzLjAwI0FtZXJpY2l1bSAoQW0pIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjA0LjAwI0FudGltb255IChTYikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMDUuMDAjQmVya2VsaXVtIChCaykjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMDYuMDAjQmlzbXV0aCAoQmkpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjA3LjAwI0NhZG1pdW0gKENhKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4wOC4wMCNDYWxpZm9ybml1bSAoQ2YpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjA5LjAwI0Nocm9taXVtIChDcikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTAuMDAjQ29iYWx0IChDbykjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTEuMDAjQ29wcGVyIChDdSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTIuMDAjQ3VyaXVtIChDbSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTMuMDAjRWluc3RlaW5pdW0gKEVzKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4xNC4wMCNGZXJtaXVtIChGbSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTUuMDAjR2FsbGl1bSAoR2EpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjE2LjAwI0dlcm1hbml1bSAoR2UpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjE3LjAwI0dvbGQgKEF1KSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4xOC4wMCNIYWZuaXVtIChIZikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMTkuMDAjSW5kaXVtIChJbikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMjAuMDAjSXJpZGl1bSAoSXIpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjIxLjAwI0lyb24gKEZlKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4yMi4wMCNMYXdyZW5jaXVtIChMcikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMjMuMDAjTGVhZCAoUGIpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjI0LjAwI01hbmdhbmVzZSAoTW4pIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjI1LjAwI01lbmRlbGV2aXVtIChNZCkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMjYuMDAjTWVyY3VyeSAoSGcpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjI3LjAwI01vbHliZGVudW0gKE1vKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4yOC4wMCNOZXB0dW5pdW0gKE5wKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4yOS4wMCNOaWNrZWwgKE5pKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zMC4wMCNOaW9iaXVtIChOYikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMzEuMDAjTm9iZWxpdW0gKE5vKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zMi4wMCNPc21pdW0gKE9zKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zMy4wMCNQYWxsYWRpdW0gKFBkKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zNC4wMCNQbGF0aW51bSAoUHQpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjM1LjAwI1BsdXRvbml1bSAoUHUpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjM2LjAwI1Byb3RhY3Rpbml1bSAoUGEpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjM3LjAwI1JoZW5pdW0gKFJlKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy4zOC4wMCNSaG9kaXVtIChSaCkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuMzkuMDAjUnV0aGVuaXVtIChSdSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDAuMDAjU2lsdmVyIChBZykjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDEuMDAjVGFudGFsdW0gKFRhKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy40Mi4wMCNUZWNobmV0aXVtIChUZSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDMuMDAjVGhhbGxpdW0gKFRsKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy40NC4wMCNUaG9yaXVtIChUaCkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDUuMDAjVGluIChTbikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDYuMDAjVGl0YW5pdW0gKFRpKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy40Ny4wMCNUdW5nc3RlbiAoVykjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDguMDAjVXJhbml1bSAoVSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNDkuMDAjVmFuYWRpdW0gKFYpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjUwLjAwI1ppbmMgKFpuKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy41MS4wMCNaaXJjb25pdW0gKFpyKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy41Mi4wMCNCb2hyaXVtIChCaCkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNTMuMDAjRHVibml1bSAoRGIpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjU0LjAwI0hhc3NpdW0gKEhzKSMxMi4xNC4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNC4xNy41NS4wMCNSdXRoZXJmb3JkaXVtIChSZikjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNTYuMDAjU2VhYm9yZ2l1bSAoU2cpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjU3LjAwI1VudW5uaWxpdW0gKFV1bSkjMTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTcuNTguMDAjVW51bnVuaXVtIChVdXUpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjU5LjAwI1VudW5iaXVtIChVdWIpIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE3LjYwLjAwI1BvbG9uaXVtICgoUG8pIzEyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE4LjAwLjAwI0Fsa2FsaSBtZXRhbHMjMTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTguMDEuMDAjQ2VzaXVtIChDcykjMTIuMTQuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTguMDIuMDAjRnJhbmNpdW0gKEZtKSMxMi4xNC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOC4wMy4wMCNMaXRoaXVtIChMaSkjMTIuMTQuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTguMDQuMDAjUG90YXNzaXVtIChLKSMxMi4xNC4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOC4wNS4wMCNSdWJpZGl1bSAoUmIpIzEyLjE0LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE4LjA2LjAwI1NvZGl1bSAoTmEpIzEyLjE0LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjAwLjAwI05vbiBtZXRhbHMgYW5kIHB1cmUgYW5kIGVsZW1lbnRhbCBnYXNlcyMxMi4xNC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4wMS4wMCNDaGxvcmluZSAgKENsKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4wMi4wMCNIeWRyb2dlbiAoSCkjMTIuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTkuMDMuMDAjTml0cm9nZW4gIChOKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4wNC4wMCNPeHlnZW4gKE8pIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjA1LjAwI0ZsdW9yaW5lICAoRikjMTIuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTkuMDYuMDAjQXJzZW5pYyAoQXMpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjA3LjAwI0Jvcm9uIChCaCkjMTIuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTkuMDguMDAjQ2FyYm9uIChDKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4wOS4wMCNQaG9zcGhvcnVzIChQKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4xMC4wMCNTZWxlbml1bSAoU2UpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjExLjAwI1NpbGljb24gKFNpKSMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4xMi4wMCNTdWxmdXIgKFMpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjEzLjAwI1RlbGx1cml1bSAoVGUpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjE5LjE0LjAwI0FzdGF0aW5lIChBdCkjMTIuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMTkuMTUuMDAjQnJvbWluZSBCciMxMi4xNC4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNC4xOS4xNi4wMCNJb2RpbmUgKEkpIzEyLjE0LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE0LjIwLjAwLjAwI05vYmxlIGdhc2VzIzEyLjE0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIwLjAxLjAwI1hlbm9uIGdhcyAgKFhlKSMxMi4xNC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4yMC4wMi4wMCNSYWRvbiBnYXMgKFJuKSMxMi4xNC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4yMC4wMy4wMCNLcnlwdG9uIGdhcyAoS3IpIzEyLjE0LjIwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIwLjA0LjAwI0FyZ29uIGdhcyAoQXIpIzEyLjE0LjIwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIwLjA1LjAwI0hlbGl1bSBnYXMgKEhlKSMxMi4xNC4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNC4yMC4wNi4wMCNOZW9uIGdhcyAoTmUpIzEyLjE0LjIwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjAwLjAwI0luZHVzdHJpYWwgdXNlIGdhc2VzIzEyLjE0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjAxLjAwI0h5ZHJvZ2VuIGNvbXBvdW5kIGdhc2VzIzEyLjE0LjIxLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjAyLjAwI0NobG9yaW5hdGVkIG1peGVkIGdhc2VzIzEyLjE0LjIxLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjAzLjAwI0FtbW9uaWEjMTIuMTQuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTQuMjEuMDQuMDAjQ2FyYm9uIGRpb3hpZGUgZ2FzIChDTzIpIzEyLjE0LjIxLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjA1LjAwI0luZHVzdHJpYWwgYWlyIzEyLjE0LjIxLjAwLjAwCi11bnNwc2M3IzEyLjE0LjIxLjA2LjAwI0luZXJ0IGdhcyBtaXh0dXJlcyMxMi4xNC4yMS4wMC4wMAotdW5zcHNjNyMxMi4xNS4wMC4wMC4wMCNBY2lkcyBhbmQgdGhlaXIgc2FsdHMgYW5kIGVzdGVycyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wMC4wMCNDYXJib3h5bGljIGFjaWRzIGFuZCB0aGVpciBzYWx0cyBhbmQgZXN0ZXJzIzEyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjAxLjAwI0FjZXRpYyBhY2lkIG9yIGl0cyBzYWx0cyMxMi4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wMi4wMCNBY3ljbGljIGFjaWRzIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjAzLjAwI0FsZGVoeWRpYyBhY2lkcyMxMi4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wNC4wMCNCdXR5cmljIGFjaWRzIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjA1LjAwI0NhcmJvY3lsaWMgYWNpZHMjMTIuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTUuMDYuMDAjSHlkcm94eSBhY2lkcyMxMi4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wNy4wMCNLZXRvIGFjaWRzIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjA4LjAwI1Byb3Bpb25pYyBhY2lkcyMxMi4xNS4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNS4wOS4wMCNBY3J5bGljIGFjaWQgZXN0ZXJzIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE1LjEwLjAwI0VzdGVycyBvZiBtZXRoYWNyeWxpYyBhY2lkIzEyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE2LjAwLjAwI0hldGVyb2N5Y2xpYyBhY2lkcyBhbmQgdGhlaXIgc2FsdHMgYW5kIGVzdGVycyMxMi4xNS4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNi4wMS4wMCNJbmRvbGVhY2V0aWMgYWNpZHMjMTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTYuMDIuMDAjSXNvbmljb3RpbmljIGFjaWRzIzEyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE2LjAzLjAwI0lzb25pcGVjb3RpYyBhY2lkcyMxMi4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNi4wNC4wMCNOaWNvdGluaWMgYWNpZHMjMTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTYuMDUuMDAjTmlwZWNvdGljIGFjaWRzIzEyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE2LjA2LjAwI09yb3RpYyBhY2lkcyMxMi4xNS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNi4wNy4wMCNQaWNvbGluaWMgYWNpZHMjMTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTYuMDguMDAjUGlwZWNvbGljIGFjaWRzIzEyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjAwLjAwI0ZhdHR5IGFjaWRzIGFuZCB0aGVpciBzYWx0cyBhbmQgZXN0ZXJzIzEyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjAxLjAwI0RlY2Fub2ljIGFjaWRzIzEyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjAyLjAwI1Vuc2F0dXJhdGVkIGZhdHR5IGFjaWRzIzEyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjAzLjAwI1ZvbGF0aWxlIGZhdHR5IGFjaWRzIzEyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE3LjA0LjAwI0hlcHRhbm9pYyBhY2lkcyMxMi4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNy4wNS4wMCNMYXVyaWMgYWNpZHMjMTIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTcuMDYuMDAjTXljb2xpYyBhY2lkcyMxMi4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNy4wNy4wMCNNeXJpc3RpYyBhY2lkcyMxMi4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNy4wOC4wMCNQYWxtaXRpYyBhY2lkcyMxMi4xNS4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNS4xNy4wOS4wMCNTdGVhcmljIGFjaWRzIzEyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE4LjAwLjAwI05vbiBjYXJib3h5bGljIGFjaWRzIGFuZCB0aGVpciBzYWx0cyMxMi4xNS4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wMS4wMCNDYXJib25pYyBhY2lkcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wMi4wMCNOaXRyaWMgYWNpZHMjMTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTguMDMuMDAjUGhvc3Bob3JvdXMgYWNpZHMjMTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTguMDQuMDAjU3VsZnVyIGFjaWRzIzEyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE4LjA1LjAwI0NobG9yaWRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wNi4wMCNIeWRyb2NobG9yaWRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wNy4wMCNOaXRyYXRlcyBvciBuaXRyaXRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4wOC4wMCNTaWxpY2F0ZXMjMTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTguMDkuMDAjUGhvc3BoYXRlcyBvciBwaG9zcGhpZGVzIzEyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE4LjEwLjAwI0JpY2FyYm9uYXRlcyBvciBjYXJiaWRlcyBvciBjYXJib25hdGVzIzEyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE4LjExLjAwI0ZsdW9yaWRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4xMi4wMCNCcm9taWRlcyBvciBicm9tYXRlcyMxMi4xNS4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOC4xMy4wMCNJb2RpZGVzIG9yIGlvZGF0ZXMjMTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTkuMDAuMDAjSW5vcmdhbmljIHN1bGZ1ciBjb21wb3VuZHMjMTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTUuMTkuMDEuMDAjSHlkcm9nZW4gc3VsZmlkZSMxMi4xNS4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNS4xOS4wMi4wMCNTdWxmdXJpYyBBY2lkIzEyLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE1LjE5LjAzLjAwI1NvZGl1bSBzdWxmYXRlIzEyLjE1LjE5LjAwLjAwCi11bnNwc2M3IzEyLjE2LjAwLjAwLjAwI0FkZGl0aXZlcyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNS4wMC4wMCNJbmRpY2F0b3JzIGFuZCBSZWFnZW50cyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNS4wMS4wMCNBZmZpbml0eSBsYWJlbHMjMTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTUuMDIuMDAjQ3Jvc3MgbGlua2luZyBhZ2VudHMjMTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTUuMDMuMDAjUmVhZ2VudCBraXRzIzEyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE1LjA0LjAwI1N1bGZoeWRyeWwgcmVhZ2VudHMjMTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTUuMDUuMDAjSW50ZXJjYWxhdGluZyBhZ2VudHMjMTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTUuMDYuMDAjRGl2ZXJ0aW5nIGFnZW50cyMxMi4xNi4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNi4wMC4wMCNDYXRhbHlzdHMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTYuMDEuMDAjQWNpZCBjYXRhbHlzdHMjMTIuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTYuMDIuMDAjQ29tYnVzdGlvbiBjYXRhbHlzdHMjMTIuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTYuMDMuMDAjQ3VzdG9tIGNhdGFseXN0cyMxMi4xNi4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNi4wNC4wMCNDcmFja2luZyBjYXRhbHlzdHMjMTIuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTcuMDAuMDAjQnVmZmVycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNy4wMS4wMCNBbXBob2x5dGUgbWl4dHVyZXMjMTIuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTcuMDIuMDAjQmljYXJib25hdGUgYnVmZmVycyMxMi4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNy4wMy4wMCNPdGhlciBidWZmZXJzIzEyLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE3LjA0LjAwI0FjaWQgYnVmZmVycyMxMi4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNi4xNy4wNS4wMCNCYXNpYyBidWZmZXJzIzEyLjE2LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE3LjA2LjAwI05ldXRyYWwgYnVmZmVycyMxMi4xNi4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOC4wMC4wMCNDb2xsb2lkcyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOC4wMS4wMCNHZWxzIzEyLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE4LjAyLjAwI1N1c3BlbnNpb25zIzEyLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE4LjAzLjAwI0Flcm9zb2xzIzEyLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE4LjA0LjAwI0VtdWxzaW9ucyMxMi4xNi4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOC4wNS4wMCNOYXR1cmFsIGdlbGxpbmcgYWdlbnRzIzEyLjE2LjE4LjAwLjAwCi11bnNwc2M3IzEyLjE2LjE4LjA2LjAwI1N5bnRoZXRpYyBnZWxsaW5nIGFnZW50cyMxMi4xNi4xOC4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOC4wNy4wMCNHZWwgc3RhYmlsaXplcnMjMTIuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTguMDguMDAjU3VzcGVuZGluZyBhZ2VudHMjMTIuMTYuMTguMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDAuMDAjU3VyZmFjdGFudHMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDEuMDAjQW50aSBmb2FtaW5nIGFnZW50cyMxMi4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOS4wMi4wMCNEZXRlcmdlbnQgc3VyZmFjdGFudHMjMTIuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDMuMDAjRm9hbWluZyBhZ2VudHMjMTIuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDQuMDAjRGlzcGVyc2luZyBhZ2VudHMjMTIuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMTkuMDUuMDAjRmx1c2hlcyMxMi4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOS4wNi4wMCNXZXR0aW5nIGFnZW50cyMxMi4xNi4xOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4xOS4wNy4wMCNXYXRlciBmbG9vZCBhZGRpdGl2ZXMjMTIuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjAuMDAuMDAjUGxhc3RpY2l6ZXJzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjIwLjAxLjAwI1BodGhhbGF0ZXMjMTIuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjAuMDIuMDAjUG9seW1lcmljcyMxMi4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMC4wMy4wMCNBZ3JpY3VsdHVyYWwgb2lscyMxMi4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMC4wNC4wMCNTdWxmb25hbWlkZXMjMTIuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjAuMDUuMDAjR2x1dGFyYXRlcyMxMi4xNi4yMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMS4wMC4wMCNGbGFtZSByZXRhcmRhbnRzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjIxLjAxLjAwI0Jyb21pbmF0ZWQjMTIuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMDAuMDAjQW50aSBveGlkYW50cyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4wMS4wMCNBc2NvcmJpYyBhY2lkIzEyLjE2LjIyLjAwLjAwCi11bnNwc2M3IzEyLjE2LjIyLjAyLjAwI0JldGEgY2Fyb3RlbmUjMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMDMuMDAjQnV0eWxhdGVkIGh5ZHJveHlhbmlzb2xlIzEyLjE2LjIyLjAwLjAwCi11bnNwc2M3IzEyLjE2LjIyLjA0LjAwI0J1dHlsYXRlZCBoeWRyb3h5dG9sdWVuZSMxMi4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4wNS4wMCNDYWxjaXVtIGNpdHJhdGUjMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMDYuMDAjQ2FudGhheGFudGhpbiMxMi4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4wNy4wMCNNZWxhdG9uaW4jMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMDguMDAjTm9yZGloeWRyb2d1YWlhcmV0aWMgYWNpZCMxMi4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4wOS4wMCNQcm9weWwgZ2FsbGF0ZSMxMi4xNi4yMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMi4xMC4wMCNTaWx5bWFyaW4jMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjIuMTEuMDAjU3VsZnVyIGRpb3hpZGUjMTIuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjMuMDAuMDAjQ3VyaW5nIGFnZW50cyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMy4wMS4wMCNXYXRlcmJvcm5lIGN1cmluZyBhZ2VudHMjMTIuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjMuMDIuMDAjQ2VtZW50IGFjY2VsZXJhdG9ycyMxMi4xNi4yMy4wMC4wMAotdW5zcHNjNyMxMi4xNi4yMy4wMy4wMCNDZW1lbnQgcmV0YXJkZXJzIzEyLjE2LjIzLjAwLjAwCi11bnNwc2M3IzEyLjE2LjI0LjAwLjAwI1BvbHltZXIgYnJlYWtlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjQuMDEuMDAjQWNpZGljIHBvbHltZXIgYnJlYWtlcnMjMTIuMTYuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjQuMDIuMDAjT3JnYW5pYyBwb2x5bWVyIGJyZWFrZXJzIzEyLjE2LjI0LjAwLjAwCi11bnNwc2M3IzEyLjE2LjI1LjAwLjAwI0VtdWxzaW9uIGJyZWFrZXJzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjI1LjAxLjAwI1dhdGVyIGluIG9pbCBlbXVsc2lvbiBicmVha2VycyMxMi4xNi4yNS4wMC4wMAotdW5zcHNjNyMxMi4xNi4yNS4wMi4wMCNPaWwgaW4gd2F0ZXIgZW11bHNpb24gYnJlYWtlcnMjMTIuMTYuMjUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjUuMDMuMDAjRmxvdGF0aW9uIGFpZHMjMTIuMTYuMjUuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjYuMDAuMDAjQ2xheSBzdGFiaWxpemVycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yNi4wMS4wMCNJbm9yZ2FuaWMgY2xheSBzdGFiaWxpemVycyMxMi4xNi4yNi4wMC4wMAotdW5zcHNjNyMxMi4xNi4yNi4wMi4wMCNPcmdhbmljIGNsYXkgc3RhYmlsaXplcnMjMTIuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjcuMDAuMDAjRmx1aWQgbG9zcyBhZGRpdGl2ZXMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjcuMDEuMDAjTmF0dXJhbCBwb2x5bWVyIGZsdWlkIGxvc3MgYWRkaXRpdmVzIzEyLjE2LjI3LjAwLjAwCi11bnNwc2M3IzEyLjE2LjI3LjAyLjAwI01vZGlmaWVkIHBvbHltZXIgZmx1aWQgbG9zcyBhZGRpdGl2ZXMjMTIuMTYuMjcuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjguMDAuMDAjRnJpY3Rpb24gcmVkdWNlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMjguMDEuMDAjQW5pb25pYyBmcmljdGlvbiByZWR1Y2VycyMxMi4xNi4yOC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yOC4wMi4wMCNDYXRpb25pYyBmcmljdGlvbiByZWR1Y2VycyMxMi4xNi4yOC4wMC4wMAotdW5zcHNjNyMxMi4xNi4yOS4wMC4wMCNQYXJhZmZpbiBhc3BoYWx0ZW5lIGNvbnRyb2wgYWdlbnRzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjI5LjAxLjAwI1NvbHZlbnQgdHlwZSBwYXJhZmZpbiBhc3BoYWx0ZW5lIGNvbnRyb2wgYWdlbnRzIzEyLjE2LjI5LjAwLjAwCi11bnNwc2M3IzEyLjE2LjI5LjAyLjAwI0NyeXN0YWwgbW9kaWZpZWQgcGFyYWZmaW4gYXNwaGFsdGVuZSBjb250cm9sIGFnZW50cyMxMi4xNi4yOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4yOS4wMy4wMCNEaXNwZXJzYW50IHR5cGUgcGFyYWZmaW4gYXNwaGFsdGVuZSBjb250cm9sIGFnZW50cyMxMi4xNi4yOS4wMC4wMAotdW5zcHNjNyMxMi4xNi4zMC4wMC4wMCNNdWQgcmVtb3ZhbCBtaXh0dXJlcyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zMC4wMS4wMCNNdWQgY2xlYW5vdXQgYWdlbnRzIzEyLjE2LjMwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjMxLjAwLjAwI0FudGkgc2x1ZGdlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzEuMDEuMDAjQW50aSBzbHVkZ2UgYWRkaXRpdmVzIzEyLjE2LjMxLjAwLjAwCi11bnNwc2M3IzEyLjE2LjMyLjAwLjAwI0FudGkgZ2FzIG1pZ3JhdGlvbiBhZ2VudHMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzIuMDEuMDAjQW50aSBnYXMgbWlncmF0aW9uIGFkZGl0aXZlcyMxMi4xNi4zMi4wMC4wMAotdW5zcHNjNyMxMi4xNi4zMy4wMC4wMCNFeHBhbmRpbmcgYWdlbnRzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjMzLjAxLjAwI0NlbWVudCBleHBhbmRpbmcgYWdlbnRzIzEyLjE2LjMzLjAwLjAwCi11bnNwc2M3IzEyLjE2LjM0LjAwLjAwI0V4dGVuZGVycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNC4wMS4wMCNDZW1lbnQgZXh0ZW5kZXJzIzEyLjE2LjM0LjAwLjAwCi11bnNwc2M3IzEyLjE2LjM1LjAwLjAwI09pbCB3ZWxsIHNlYWxhbnRzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjM1LjAxLjAwI0NlbWVudGluZyBzZWFsYW50cyMxMi4xNi4zNS4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNi4wMC4wMCNDb3Jyb3Npb24gaW5oaWJpdG9ycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNi4wMS4wMCNPaWwgcHJvZHVjdGlvbiBjb3Jyb3Npb24gaW5oaWJpdG9ycyMxMi4xNi4zNi4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNi4wMi4wMCNHYXMgcHJvZHVjdGlvbiBjb3Jyb3Npb24gaW5oaWJpdG9ycyMxMi4xNi4zNi4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNy4wMC4wMCNHYXMgaHlkcmF0ZSBjb250cm9sbGVycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zNy4wMS4wMCNLaW5ldGljIGh5ZHJhdGUgY29udHJvbGxlcnMjMTIuMTYuMzcuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzguMDAuMDAjU2NhdmVuZ2VycyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi4zOC4wMS4wMCNIeWRyb2dlbiBzdWxmaWRlIHNjYXZlbmdlcnMjMTIuMTYuMzguMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzguMDIuMDAjT3h5Z2VuIHNjYXZlbmdlcnMjMTIuMTYuMzguMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzkuMDAuMDAjU2NhbGUgY29udHJvbGxlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuMzkuMDEuMDAjU2NhbGUgaW5oaWJpdG9yIzEyLjE2LjM5LjAwLjAwCi11bnNwc2M3IzEyLjE2LjM5LjAyLjAwI1NjYWxlIHJlbW92ZXJzIGFuZCBjb252ZXJ0ZXJzIzEyLjE2LjM5LjAwLjAwCi11bnNwc2M3IzEyLjE2LjQwLjAwLjAwI0JhY3RlcmljaWRlcyMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi40MC4wMS4wMCNSZWdpc3RlcmVkIG1pY3JvYmlvY2lkZXMjMTIuMTYuNDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuNDEuMDAuMDAjSW4gc2l0dSMxMi4xNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNi40MS4wMS4wMCNJbiBzaXR1IGFkZGl0aXZlcyMxMi4xNi40MS4wMC4wMAotdW5zcHNjNyMxMi4xNi40MS4wMi4wMCNBY2lkIGFkZGl0aXZlcyMxMi4xNi40MS4wMC4wMAotdW5zcHNjNyMxMi4xNi40Mi4wMC4wMCNSZXRhcmRlcnMjMTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTYuNDIuMDEuMDAjQWNpZCBjb3Jyb3Npb24gaW5oaWJpdG9ycyMxMi4xNi40Mi4wMC4wMAotdW5zcHNjNyMxMi4xNi40My4wMC4wMCNJcm9uIGNvbnRyb2xsZXJzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjQzLjAxLjAwI0lyb24gY29udHJvbCBhZGRpdGl2ZXMjMTIuMTYuNDMuMDAuMDAKLXVuc3BzYzcjMTIuMTYuNDQuMDAuMDAjTm9uIGVtdWxzaWZpZXJzIzEyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE2LjQ0LjAxLjAwI05vbiBlbXVsc2lmeWluZyBhZGRpdGl2ZXMjMTIuMTYuNDQuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMDAuMDAuMDAjQ29sb3JhbnRzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjE3LjE1LjAwLjAwI0R5ZXMjMTIuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTUuMDEuMDAjRmx1b3Jlc2NlbnQgZHllcyMxMi4xNy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNS4wMi4wMCNQaHRoYWxlaW4gZHllcyMxMi4xNy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNS4wMy4wMCNSb3NhbmlsaW5lIGR5ZXMjMTIuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTUuMDQuMDAjRm9vZCBvciBkcnVnIG9yIGNvc21ldGljIHNhZmUgKEZEQykgZHllcyMxMi4xNy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNS4wNS4wMCNMYWtlZCMxMi4xNy4xNS4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNS4wNi4wMCNOYXR1cmFsIGR5ZXMjMTIuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTYuMDAuMDAjUGlnbWVudHMjMTIuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTYuMDEuMDAjTmF0dXJhbCBwaWdtZW50cyMxMi4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNi4wMi4wMCNJbm9yZ2FuaWMgbWV0YWwgb3hpZGVzIzEyLjE3LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE3LjE2LjAzLjAwI0NhcmJvbiBibGFjayMxMi4xNy4xNi4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNi4wNC4wMCNUaXRhbml1bSBkaW94aWRlIzEyLjE3LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE3LjE2LjA1LjAwI09yZ2FuaWMgcGlnbWVudHMjMTIuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTcuMDAuMDAjQ29sb3IgY29tcG91bmRzIGFuZCBkaXNwZXJzaW9ucyMxMi4xNy4wMC4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNy4wMS4wMCNQb2x5bWVyIG1hc3RlcmJhdGNoZXMjMTIuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMTcuMTcuMDIuMDAjUGlnbWVudCBkaXNwZXJzaW9ucyMxMi4xNy4xNy4wMC4wMAotdW5zcHNjNyMxMi4xNy4xNy4wMy4wMCNJbmtzIzEyLjE3LjE3LjAwLjAwCi11bnNwc2M3IzEyLjE4LjAwLjAwLjAwI1dheGVzIGFuZCBvaWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjE4LjE1LjAwLjAwI1dheGVzIzEyLjE4LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE4LjE1LjAxLjAwI1N5bnRoZXRpYyB3YXhlcyMxMi4xOC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xOC4xNS4wMi4wMCNOYXR1cmFsIHdheGVzIzEyLjE4LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE4LjE1LjAzLjAwI1BhcmFmZmlucyMxMi4xOC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xOC4xNS4wNC4wMCNQZXRyb2xhdHVtcyMxMi4xOC4xNS4wMC4wMAotdW5zcHNjNyMxMi4xOC4xNi4wMC4wMCNPaWxzIzEyLjE4LjAwLjAwLjAwCi11bnNwc2M3IzEyLjE4LjE2LjAxLjAwI1N5bnRoZXRpYyBvaWxzIzEyLjE4LjE2LjAwLjAwCi11bnNwc2M3IzEyLjE4LjE2LjAyLjAwI05hdHVyYWwgb2lscyMxMi4xOC4xNi4wMC4wMAotdW5zcHNjNyMxMi4xOS4wMC4wMC4wMCNTb2x2ZW50cyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4xOS4xNS4wMC4wMCNIeWRyb2NhcmJvbmF0ZWQgc29sdmVudHMjMTIuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTkuMTUuMDEuMDAjQXJvbWF0aWMgc29sdmVudHMjMTIuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMTkuMTUuMDIuMDAjQWxpcGhhdGljIHNvbHZlbnRzIzEyLjE5LjE1LjAwLjAwCi11bnNwc2M3IzEyLjE5LjE2LjAwLjAwI094eWdlbmF0ZWQgc29sdmVudHMjMTIuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMTkuMTYuMDEuMDAjQWxjb2hvbCBzb2x2ZW50cyMxMi4xOS4xNi4wMC4wMAotdW5zcHNjNyMxMi4xOS4xNi4wMi4wMCNBY3RpdmUgc29sdmVudHMjMTIuMTkuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMDAuMDAuMDAjQ2hlbWljYWwgaW50ZXJtZWRpYXRlcyBhbmQgZml4YXRpdmVzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIwLjE1LjAwLjAwI0ludGVybWVkaWF0ZXMjMTIuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTUuMDEuMDAjRXRoZXIgaW50ZXJtZWRpYXRlcyMxMi4yMC4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMC4xNS4wMi4wMCNLZXRvbmUgaW50ZXJtZWRpYXRlcyMxMi4yMC4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMC4xNS4wMy4wMCNBbGRlaHlkZSBpbnRlcm1lZGlhdGVzIzEyLjIwLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIwLjE1LjA0LjAwI1Blcm94aWRlIGludGVybWVkaWF0ZXMjMTIuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTUuMDUuMDAjQWNyeWxhdGUgb3IgbWV0aGFjcnlsYXRlIGludGVybWVkaWF0ZXMjMTIuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTYuMDAuMDAjRml4YXRpdmVzIzEyLjIwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIwLjE2LjAxLjAwI0Zvcm1hbGRlaHlkZXMjMTIuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTYuMDIuMDAjR2x1dHJhbHMjMTIuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTYuMDMuMDAjVGFubmlucyMxMi4yMC4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMC4xNy4wMC4wMCNBbWluZXMgYW5kIGFtaWRlcyBhbmQgaW1pbmVzIGFuZCBpbWlkZXMjMTIuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTcuMDEuMDAjUHJpbWFyeSMxMi4yMC4xNy4wMC4wMAotdW5zcHNjNyMxMi4yMC4xNy4wMi4wMCNTZWNvbmRhcnkjMTIuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTcuMDMuMDAjVGVydGlhcnkjMTIuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMjAuMTcuMDQuMDAjU3BlY2lhbHR5IzEyLjIwLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIwLjE3LjA1LjAwI1N1bHBob25hdGVkIzEyLjIwLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIxLjAwLjAwLjAwI0NhcmJvbiBiYXNlZCBjaGVtaWNhbHMgYW5kIGNvbXBvdW5kZWQgY2hlbWljYWxzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjAwLjAwI0FsY29ob2xzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjAxLjAwI0FtaW5vIGFsY29ob2xzIzEyLjIxLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjAyLjAwI0Jlbnp5bCBhbGNvaG9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4wMy4wMCNDaGxvcm9oeWRyaW5zIzEyLjIxLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjA0LjAwI0V0aGFub2wjMTIuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTUuMDUuMDAjRmF0dHkgYWxjb2hvbHMjMTIuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTUuMDYuMDAjR2x5Y29scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4wNy4wMCNIZXhhbm9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4wOC4wMCNNZXRoYW5vbCMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4wOS4wMCNQb2x5IHZpbnlsIG9yIFBWICBhbGNvaG9sIzEyLjIxLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE1LjEwLjAwI1Byb3Bhbm9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4xMS4wMCNTdWdhciBhbGNvaG9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4xMi4wMCNCdXR5bCBhbGNvaG9scyMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNS4xMy4wMCNJc29wcm9weWwgYWxjb2hvbCMxMi4yMS4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNi4wMC4wMCNIeWRyb2NhcmJvbnMjMTIuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTYuMDEuMDAjQWN5Y2xpYyBvciBjeWNsaWMgb3IgcG9seWN5Y2xpYyBoeWRyb2NhcmJvbnMjMTIuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTYuMDIuMDAjSGFsb2dlbmF0ZWQgaHlkcm9jYXJib25zIzEyLjIxLjE2LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE2LjAzLjAwI1N1bHBob25hdGVkIGh5ZHJvY2FyYm9ucyMxMi4yMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNi4wNC4wMCNOaXRyb3NhdGVkIGh5ZHJvY2FyYm9ucyMxMi4yMS4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMS4xNy4wMC4wMCNBbGRlaHlkZXMjMTIuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTcuMDEuMDAjQWNldGFsYWxkZWh5ZXMjMTIuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTcuMDIuMDAjR2x5b3hhbHMjMTIuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTguMDAuMDAjRXRoZXJzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjE4LjAxLjAwI0FjZXRhbCBldGhlcnMjMTIuMjEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTguMDIuMDAjRXRoeWwgZXRoZXJzIzEyLjIxLjE4LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE4LjAzLjAwI01ldGh5bCBldGhlcnMjMTIuMjEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTguMDQuMDAjUGhlbnlsIGV0aGVycyMxMi4yMS4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMS4xOC4wNS4wMCNNZXRoeWwgdGV0cmEgYnV0eWwgZXRoZXIjMTIuMjEuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjEuMTkuMDAuMDAjS2V0b25lcyMxMi4yMS4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMS4xOS4wMS4wMCNBY2V0b25lcyMxMi4yMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xOS4wMi4wMCNDYW1waG9ycyMxMi4yMS4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMS4xOS4wMy4wMCNLZXRvbmUgYm9kaWVzIzEyLjIxLjE5LjAwLjAwCi11bnNwc2M3IzEyLjIxLjE5LjA0LjAwI01hbm5pY2ggYmFzZXMjMTIuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjAuMDAuMDAjUGhlbm9scyMxMi4yMS4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMC4wMS4wMCNCcm9tcGhlbm9sIGJsdWUjMTIuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjAuMDIuMDAjQ3Jlc29scyMxMi4yMS4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMS4wMC4wMCNDYXJib2h5ZHJhdGVzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIxLjAxLjAwI1NpbXBsZSBzdWdhcnMgb3IgaXRzIGRlcml2YXRpdmVzIzEyLjIxLjIxLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIxLjAyLjAwI0d1bSByZXNpbnMjMTIuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjEuMDMuMDAjU3RhcmNoZXMjMTIuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDAuMDAjQ29tcG91bmRzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjAxLjAwI0NoZW1pY2FsIGFsbG95cyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4wMi4wMCNDeWFuaWRlcyBvciBjeWFuYXRlcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4wMy4wMCNBbHVtaW51bSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDQuMDAjQmFyaXVtIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4wNS4wMCNCb3JvbiBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDYuMDAjQnJvbWluZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDcuMDAjQ2FsY2l1bSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMDguMDAjQ2FyYm9uIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4wOS4wMCNDaGxvcmluZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTAuMDAjRmx1b3JpbmUgY29tcG91bmRzIzEyLjIxLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjExLjAwI0dvbGQgY29tcG91bmRzIzEyLjIxLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjEyLjAwI0lvZGluZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTMuMDAjSXJvbiBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTQuMDAjTWFnbmVzaXVtIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4xNS4wMCNOaXRyb2dlbiBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTYuMDAjTml0cmlsZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTcuMDAjT3h5Z2VuIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4xOC4wMCNQaG9zcGhvcm91cyBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMTkuMDAjUG90YXNzaXVtIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4yMC4wMCNTZWxlbml1bSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMjEuMDAjU2lsaWNvbiBvciBzaWxpY29uZSBvciBzaWxpY2FuZSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMjIuMDAjU29kaXVtIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4yMy4wMCNTdWxmdXIgY29tcG91bmRzIzEyLjIxLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjI0LjAwI1RpbiBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMjUuMDAjWmluYyBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjIuMjYuMDAjSGV0ZXJvY3ljbGljIGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4yNy4wMCNDb2JhbHQgY29tcG91bmRzIzEyLjIxLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIyLjI4LjAwI0FudGltb255IGNvbXBvdW5kcyMxMi4yMS4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMi4yOS4wMCNUaXRhbml1bSBjb21wb3VuZHMjMTIuMjEuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjMuMDAuMDAjT3hpZGVzIGluY2x1ZGVzIGFsbCBveGlkZWQgc3Vic3RhbmNlcyMxMi4yMS4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wMS4wMCNBbHVtaW51bSBveGlkZXMjMTIuMjEuMjMuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjMuMDIuMDAjQ2FyYm9uIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wMy4wMCNIeXBvY2hsb3JvdXMgYWNpZCMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wNC4wMCNNYWduZXNpdW0gb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjA1LjAwI05pdHJvZ2VuIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wNi4wMCNPc21pdW0gb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjA3LjAwI1Blcm94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wOC4wMCNTaWxpY29uIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4wOS4wMCNTdWxmdXIgb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjEwLjAwI1Rob3JpdW0gb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjExLjAwI1dhdGVyIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4xMi4wMCNaaW5jIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4xMy4wMCNIeWRyb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjE0LjAwI01ldGFsIG94aWRlcyMxMi4yMS4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMS4yMy4xNS4wMCNOb24gbWV0YWwgb3hpZGVzIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjIzLjE2LjAwI0V0aHlsZW5lIG94aWRlIzEyLjIxLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIxLjI0LjAwLjAwI0lzb3RvcGVzIzEyLjIxLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIxLjI0LjAxLjAwI0RldXRlcmF0ZWQgc29sdmVudHMjMTIuMjEuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjQuMDIuMDAjSGVhdnkgd2F0ZXIjMTIuMjEuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjQuMDMuMDAjQWxwaGEgc291cmNlcyMxMi4yMS4yNC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yNC4wNC4wMCNCZXRhIHNvdXJjZXMjMTIuMjEuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjQuMDUuMDAjQ29iYWx0IHNvdXJjZXMjMTIuMjEuMjQuMDAuMDAKLXVuc3BzYzcjMTIuMjEuMjQuMDYuMDAjR2FtbWEgc291cmNlcyMxMi4yMS4yNC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yNC4wNy4wMCNSYWRpb2lzb3RvcGUgc291cmNlcyMxMi4yMS4yNC4wMC4wMAotdW5zcHNjNyMxMi4yMS4yNC4wOC4wMCNDYWxpYnJhdGlvbiBzb3VyY2VzIzEyLjIxLjI0LjAwLjAwCi11bnNwc2M3IzEyLjIyLjAwLjAwLjAwI0JpbyBjaGVtaWNhbHMjMTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDAuMDAjUHJvdGVpbnMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDEuMDAjQWxidW1pbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDIuMDAjQmFjdGVyaWFsIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjAzLjAwI0Jsb29kIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjA0LjAwI0JvbmUgbW9ycGhvZ2VuZXRpYyBwcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4wNS4wMCNDYXJyaWVyIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjA2LjAwI0NvbnRyYWN0aWxlIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjA3LjAwI0RpZXRhcnkgcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDguMDAjRGVveHlyaWJvbnVjbGVpYyBhY2lkIChETkEpIGJpbmRpbmcgcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMDkuMDAjRWdnIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjEwLjAwI0dsb2J1bGlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xMS4wMCNHbHljb3Byb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjEyLjAwI0hlbWVwcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xMy4wMCNJbnRlcmZlcm9ucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xNC4wMCNMZWN0aW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjE1LjAwI0xpcG9wcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xNi4wMCNNZW1icmFuZSBwcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4xNy4wMCNNZXRhbGxvcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMTguMDAjTmVydmUgdGlzc3VlIHByb3RlaW5zIzEyLjIyLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE1LjE5LjAwI05lY3VsZW9wcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4yMC4wMCNQZXB0b25lcyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4yMS4wMCNQbGFudCBwcm90ZWlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4yMi4wMCNQcmlvbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjMuMDAjQ3l0b3BsYXNtaWMgb3IgbnVjbGVhciByZWNlcHRvcnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjQuMDAjUmVjb21iaW5hbnQgcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjUuMDAjU2VycGlucyMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNS4yNi4wMCNUcmFuc2NyaXB0aW9uIGZhY3RvcnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjcuMDAjVmlyYWwgcHJvdGVpbnMjMTIuMjIuMTUuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTUuMjguMDAjU2NsZXJvcHJvdGVpbiMxMi4yMi4xNS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wMC4wMCNBbnRpYm9kaWVzIzEyLjIyLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjE2LjAxLjAwI1ZpcmFsIGFudGlib2RpZXMjMTIuMjIuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTYuMDIuMDAjQW50aXRveGlucyMxMi4yMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wMy4wMCNCYWN0ZXJpYWwgYW50aWJvZGllcyMxMi4yMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wNC4wMCNBdXRvYW50aWJvZGllcyMxMi4yMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wNS4wMCNJbW11bmUgc2VyYSMxMi4yMi4xNi4wMC4wMAotdW5zcHNjNyMxMi4yMi4xNi4wNi4wMCNJbW11bm9nbG9idWxpbnMjMTIuMjIuMTYuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTcuMDAuMDAjTnV0cmllbnRzIzEyLjIyLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjE3LjAxLjAwI1ZpdGFtaW5zIzEyLjIyLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE4LjAwLjAwI0VuenltZXMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTguMDEuMDAjSHlkcm9sYXNlcyMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOC4wMi4wMCNJc29lbnp5bWVzIzEyLjIyLjE4LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE4LjAzLjAwI0lzb21lcmFzZXMjMTIuMjIuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTguMDQuMDAjTGlnYXNlcyMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOC4wNS4wMCNMeWFzZXMjMTIuMjIuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTguMDYuMDAjTXVsdGllbnp5bWUgY29tcGxleGVzIzEyLjIyLjE4LjAwLjAwCi11bnNwc2M3IzEyLjIyLjE4LjA3LjAwI094aWRvcmVkdWN0YXNlcyMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOC4wOC4wMCNQZXJtZWFzZXMjMTIuMjIuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTguMDkuMDAjVHJhbnNmZXJlYXNlcyMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOC4xMC4wMCNDYXRhbGFzZSMxMi4yMi4xOC4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wMC4wMCNUaXNzdWVzIzEyLjIyLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjE5LjAxLjAwI0Nvbm5lY3RpdmUgdGlzc3VlcyMxMi4yMi4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wMi4wMCNFcGl0aGVsaXVtcyMxMi4yMi4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wMy4wMCNFeG9jcmluZSBnbGFuZHMjMTIuMjIuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTkuMDQuMDAjTHltcGhvaWQgdGlzc3VlcyMxMi4yMi4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wNS4wMCNNZW1icmFuZXMjMTIuMjIuMTkuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMTkuMDYuMDAjTXVzY2xlcyMxMi4yMi4xOS4wMC4wMAotdW5zcHNjNyMxMi4yMi4xOS4wNy4wMCNOZXJ2ZSB0aXNzdWVzIzEyLjIyLjE5LjAwLjAwCi11bnNwc2M3IzEyLjIyLjIwLjAwLjAwI0N1bHR1cmVzIGFuZCBmbHVpZHMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjAuMDEuMDAjQWdhciMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wMi4wMCNCcm90aCMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wMy4wMCNTZXJ1bSBmcmVlIGN1bHR1cmUgbWVkaWEjMTIuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjAuMDQuMDAjQ29uZGl0aW9uZWQgY3VsdHVyZSBtZWRpYSMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wNS4wMCNCYWN0ZXJpYSBjdWx0dXJlcyMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wNi4wMCNCbG9vZCMxMi4yMi4yMC4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMC4wNy4wMCNVcmVhIzEyLjIyLjIwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIwLjA4LjAwI0JpbGUjMTIuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjAuMDkuMDAjUGxhc21hIzEyLjIyLjIwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIwLjEwLjAwI1NlbWVuIGN1bHR1cmVzIzEyLjIyLjIwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIxLjAwLjAwI051Y2xlaWMgYWNpZHMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjEuMDEuMDAjUmlib251Y2xlaWMgYWNpZCAoUk5BKSMxMi4yMi4yMS4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMS4wMi4wMCNEZW94eXJpYm9udWNsZWljIGFjaWQgKEROQSkjMTIuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDAuMDAjQW1pbm8gYWNpZHMjMTIuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDEuMDAjQnJhbmNoZWQgY2hhaW4gYW1pbm8gYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDIuMDAjQ3ljbGljIGFtaW5vIGFjaWRzIzEyLjIyLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIyLjAzLjAwI0RpYW1pbm8gYW1pbm8gYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDQuMDAjRGljYXJib3h5bGljIGFtaW5vIGFjaWRzIzEyLjIyLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIyLjA1LjAwI0Vzc2VudGlhbCBhbWlubyBhY2lkcyMxMi4yMi4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMi4wNi4wMCNTdWxmdXIgYW1pbm8gYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMDcuMDAjQW1pbm9idXR5cmljIGFjaWRzIzEyLjIyLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIyLjA4LjAwI0FtaW5vY2Fwcm9pYyBhY2lkcyMxMi4yMi4yMi4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMi4wOS4wMCNPeGFtaWMgYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjIuMTAuMDAjUGhvc3Bob2FtaW5vIGFjaWRzIzEyLjIyLjIyLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIyLjExLjAwI1F1aXNxdWFsaWMgYWNpZHMjMTIuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjMuMDAuMDAjQW1pbmVzIGFuZCBhbWlkZXMgYW5kIGltaW5lcyBhbmQgaW1pZGVzIzEyLjIyLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIzLjAxLjAwI1ByaW1hcnkjMTIuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMTIuMjIuMjMuMDIuMDAjU2Vjb25kYXJ5IzEyLjIyLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIzLjAzLjAwI1RlcnRpYXJ5IzEyLjIyLjIzLjAwLjAwCi11bnNwc2M3IzEyLjIyLjIzLjA0LjAwI1NwZWNpYWx0eSMxMi4yMi4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMi4yMy4wNS4wMCNTdWxwaG9uYXRlZCMxMi4yMi4yMy4wMC4wMAotdW5zcHNjNyMxMi4yMy4wMC4wMC4wMCNJbm9yZ2FuaWMgY29tcG91bmRzIzEyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIzLjEwLjAwLjAwI01pbmVyYWwgYWNpZHMjMTIuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTAuMDEuMDAjSHlkcm9mbG9yaWMgYWNpZCMxMi4yMy4xMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMC4wMi4wMCNIeWRyb2ZsdW9yb3NpbGljaWMgYWNpZCMxMi4yMy4xMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMC4wMy4wMCNIeWRyb2Zsb3VyaWMgYWNpZCMxMi4yMy4xMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMS4wMC4wMCNCYXNlcyMxMi4yMy4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMS4wMS4wMCNTb2RpdW0gaHlkcm94aWRlIzEyLjIzLjExLjAwLjAwCi11bnNwc2M3IzEyLjIzLjExLjAyLjAwI1BvdGFzc2l1bSBoeWRyb3hpZGUjMTIuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTIuMDAuMDAjU2FsdHMjMTIuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTIuMDEuMDAjQW1tb25pdW0gbml0cmF0ZSMxMi4yMy4xMi4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMy4wMC4wMCNTdWxwaGF0ZXMjMTIuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTMuMDEuMDAjRmVycmljIHN1bHBoYXRlIzEyLjIzLjEzLjAwLjAwCi11bnNwc2M3IzEyLjIzLjEzLjAyLjAwI0NvcHBlciBzdWxwaGF0ZSMxMi4yMy4xMy4wMC4wMAotdW5zcHNjNyMxMi4yMy4xMy4wMy4wMCNBbHVtaW5pdW0gc3VscGhhdGUjMTIuMjMuMTMuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTMuMDQuMDAjU29kaXVtIHN1bHBoYXRlIzEyLjIzLjEzLjAwLjAwCi11bnNwc2M3IzEyLjIzLjEzLjA1LjAwI1NvZGl1bSB0aGlvc3VscGhhdGUjMTIuMjMuMTMuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTQuMDAuMDAjQ2hsb3JpZGVzIGNobG9yYXRlcyBhbmQgcGVyY2hsb3JhdGVzIzEyLjIzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIzLjE0LjAxLjAwI1NvZGl1bSBjaGxvcml0ZSMxMi4yMy4xNC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNC4wMi4wMCNGZXJyaWMgQ2hsb3JpZGUjMTIuMjMuMTQuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTQuMDMuMDAjQWx1bWluaXVtIGNobG9yaWRlIzEyLjIzLjE0LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE0LjA0LjAwI1BvbHkgYWx1bWluaXVtIGNobG9yaWRlIzEyLjIzLjE0LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE0LjA1LjAwI0FsdW1pbml1bSBjaGxvcm9oeWRyYXRlIzEyLjIzLjE0LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE0LjA2LjAwI1NvZGl1bSBoeXBvY2hsb3JpdGUjMTIuMjMuMTQuMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTUuMDAuMDAjQm9yaWRlcyBhbmQgYm9yYXRlcyMxMi4yMy4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNS4wMS4wMCNTb2RpdW0gYm9yYXRlIzEyLjIzLjE1LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE2LjAwLjAwI0h5ZHJpZGVzIzEyLjIzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIzLjE2LjAxLjAwI0FsdW1pbml1bSBoeWRyaXRlIzEyLjIzLjE2LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE2LjAyLjAwI01hZ25lc2l1bSBoeWRyaXRlIzEyLjIzLjE2LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE3LjAwLjAwI1N1bHBoaWRlcyMxMi4yMy4wMC4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNy4wMS4wMCNIeWRyb2dlbiBzdWxwaGlkZSMxMi4yMy4xNy4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNy4wMi4wMCNQb2x5IHN1bHBoaWRlIzEyLjIzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE3LjAzLjAwI1NvZGl1bSBzdWxwaGlkZSMxMi4yMy4xNy4wMC4wMAotdW5zcHNjNyMxMi4yMy4xNy4wNC4wMCNJcm9uIHN1bHBoaWRlIzEyLjIzLjE3LjAwLjAwCi11bnNwc2M3IzEyLjIzLjE4LjAwLjAwI0lub3JnYW5pYyBveGlkaXNpbmcgYWdlbnRzIzEyLjIzLjAwLjAwLjAwCi11bnNwc2M3IzEyLjIzLjE4LjAxLjAwI1BvdGFzc2l1bSBwZXJtYW5nYW5hdGUjMTIuMjMuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTguMDIuMDAjUG90YXNzaXVtIGRpY2hyb21hdGUjMTIuMjMuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjMuMTguMDMuMDAjTWFuZ2FuZXNlIGRpb3hpZGUjMTIuMjMuMTguMDAuMDAKLXVuc3BzYzcjMTIuMjQuMDAuMDAuMDAjQWxjb2hvbHMjMTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjQuMTAuMDAuMDAjTW9ub2h5ZHJpYyBhbGNvaG9scyMxMi4yNC4wMC4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMC4wMS4wMCNFdGhhbm9sIzEyLjI0LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjEwLjAyLjAwI0lzb3Byb3Bhbm9sIzEyLjI0LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjEwLjAzLjAwI01ldGhhbm9sIzEyLjI0LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjEwLjA0LjAwI1BlbnRhbm9scyMxMi4yNC4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMC4wNS4wMCNPY3Rhbm9scyMxMi4yNC4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMC4wNi4wMCNJbm9zaXRvbHMjMTIuMjQuMTAuMDAuMDAKLXVuc3BzYzcjMTIuMjQuMTAuMDcuMDAjRmF0dHkgYWxjb2hvbHMjMTIuMjQuMTAuMDAuMDAKLXVuc3BzYzcjMTIuMjQuMTAuMDguMDAjQWxseWwgYWxjb2hvbCMxMi4yNC4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMS4wMC4wMCNQb2x5aHlkcmljIGFsY29ob2xzIzEyLjI0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjExLjAxLjAwI0dseWNvbCMxMi4yNC4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMS4wMi4wMCNHbHljZXJvbCMxMi4yNC4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMi4wMC4wMCNUaGlvIGFsY29ob2xzIzEyLjI0LjAwLjAwLjAwCi11bnNwc2M3IzEyLjI0LjEyLjAxLjAwI0V0aGFuZSB0aGlvbCMxMi4yNC4xMi4wMC4wMAotdW5zcHNjNyMxMi4yNC4xMi4wMi4wMCNNZXRoYW5lIHRoaW9sIzEyLjI0LjEyLjAwLjAwCi11bnNwc2M3IzEyLjI1LjAwLjAwLjAwI0Fsa2FuZXMgQWxrZW5lcyBBbGt5bmVzIGFuZCBBcm9tYXRpY3MjMTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjUuMTAuMDAuMDAjQWxrYW5lcyMxMi4yNS4wMC4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMC4wMS4wMCNQZW50YW5lIzEyLjI1LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI1LjEwLjAyLjAwI0hleGFuZSMxMi4yNS4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMS4wMC4wMCNDeWNsaWMgaHlkcm9jYXJib25zIzEyLjI1LjAwLjAwLjAwCi11bnNwc2M3IzEyLjI1LjExLjAxLjAwI1RvbHVlbmUjMTIuMjUuMTEuMDAuMDAKLXVuc3BzYzcjMTIuMjUuMTEuMDIuMDAjWHlsZW5lcyMxMi4yNS4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMS4wMy4wMCNCZW56ZW5lIzEyLjI1LjExLjAwLjAwCi11bnNwc2M3IzEyLjI1LjEyLjAwLjAwI0Fsa2VuZXMjMTIuMjUuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjUuMTIuMDEuMDAjUHJvcGVuZSMxMi4yNS4xMi4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMi4wMi4wMCNCdXRlbmUjMTIuMjUuMTIuMDAuMDAKLXVuc3BzYzcjMTIuMjUuMTIuMDMuMDAjU3R5cmVuZSMxMi4yNS4xMi4wMC4wMAotdW5zcHNjNyMxMi4yNS4xMy4wMC4wMCNBbGt5bmVzIzEyLjI1LjAwLjAwLjAwCi11bnNwc2M3IzEyLjI1LjEzLjAxLjAwI0FjeXRlbGVuZSMxMi4yNS4xMy4wMC4wMAotdW5zcHNjNyMxMi4yNi4wMC4wMC4wMCNBcm9tYXRpYyBkZXJpdmF0aXZlcyMxMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMC4wMC4wMCNBcm9tYXRpYyBzdWxwaG9uaWMgYWNpZHMjMTIuMjYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTAuMDEuMDAjQmVuemVuZSBzdWxwaG9uaWMgYWNpZHMjMTIuMjYuMTAuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTAuMDIuMDAjSGFsb2dlbmF0ZWQgc3VscGhvbmljIGFjaWRzIzEyLjI2LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI2LjEwLjAzLjAwI05pdHJvc3VscGhvbmljIGFjaWRzIzEyLjI2LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI2LjEwLjA0LjAwI0FtaW5vIHN1bHBob25pYyBhY2lkcyMxMi4yNi4xMC4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMC4wNS4wMCNTdWxwaG9ueWwgY2hsb3JpZGVzIzEyLjI2LjEwLjAwLjAwCi11bnNwc2M3IzEyLjI2LjExLjAwLjAwI0Fyb21hdGljIG5pdHJvIGNvbXBvdW5kcyMxMi4yNi4wMC4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMS4wMS4wMCNOaXRybyBiZW56ZW5lcyMxMi4yNi4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMS4wMi4wMCNOaXRybyB0b2x1ZW5lcyMxMi4yNi4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMS4wMy4wMCNDYXByb2xhY3RhbSMxMi4yNi4xMS4wMC4wMAotdW5zcHNjNyMxMi4yNi4xMi4wMC4wMCNDeWNsaWMgYWxjb2hvbHMjMTIuMjYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTIuMDEuMDAjSGV4YW5vbHMjMTIuMjYuMTIuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTIuMDIuMDAjTmFwdGhvbHMjMTIuMjYuMTIuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTIuMDMuMDAjWHlsZW5vbHMjMTIuMjYuMTIuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTIuMDQuMDAjQmVuenlsIGFsY29ob2xzIzEyLjI2LjEyLjAwLjAwCi11bnNwc2M3IzEyLjI2LjEzLjAwLjAwI1BodGhhbGF0ZXMjMTIuMjYuMDAuMDAuMDAKLXVuc3BzYzcjMTIuMjYuMTMuMDEuMDAjRGkgb2N0eWwgUGh0aGFsYXRlIzEyLjI2LjEzLjAwLjAwCi11bnNwc2M3IzEyLjI2LjEzLjAyLjAwI0RpIGV0aHlsIHBodGhhbGF0ZXMjMTIuMjYuMTMuMDAuMDAKLXVuc3BzYzcjMTMuMDAuMDAuMDAuMDAjUmVzaW4gYW5kIFJvc2luIGFuZCBSdWJiZXIgYW5kIEZvYW0gYW5kIEZpbG0gYW5kIEVsYXN0b21lcmljIE1hdGVyaWFscyMxMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4wMC4wMC4wMCNSdWJiZXIgYW5kIGVsYXN0b21lcnMjMTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTUuMDAuMDAjTmF0dXJhbCBydWJiZXIjMTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTUuMDEuMDAjTGF0ZXggcnViYmVyIzEzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE1LjAyLjAwI0NyZXBlIHJ1YmJlciMxMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNS4wMy4wMCNTbW9rZWQgc2hlZXQgcnViYmVyIzEzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE1LjA0LjAwI05hdHVyYWwgZm9hbSBydWJiZXIjMTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTUuMDUuMDAjQmxvY2sgb3IgY3J1bWIgcnViYmVyIzEzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE2LjAwLjAwI1Byb2Nlc3NlZCBhbmQgc3ludGhldGljIHJ1YmJlciMxMy4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNi4wMS4wMCNWdWxjYW5pemVkIHJ1YmJlciMxMy4xMC4xNi4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNi4wMi4wMCNDaGxvcmluYXRlZCBydWJiZXIjMTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTYuMDMuMDAjSHlkcm9jaGxvcmlkZSBydWJiZXIjMTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTYuMDQuMDAjQ3ljbGl6ZWQgcnViYmVyIzEzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE2LjA1LjAwI0lzb21lcml6ZWQgcnViYmVyIzEzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE2LjA2LjAwI1RoZXJtcGxhc3RpYyBydWJiZXIjMTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTYuMDcuMDAjUnViYmVyIGNvbXBvdW5kIzEzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjAwLjAwI0VsYXN0b21lcnMjMTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDEuMDAjQWNyeWxvbml0cmlsZSBidXRhZGllbmUgKE5CUikjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDIuMDAjSGlnaGx5IHNhdHVyYXRlZCBuaXRyaWxlIChITkJSKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4wMy4wMCNGbHVvcm9jYXJib24gKEZLTSkjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDQuMDAjRXRoeWxlbmUgcHJvcHlsZW5lIChFUCkjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDUuMDAjU3R5cmVuZSBidXRhZGllbmUgKFNCUikjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDYuMDAjQ2hsb3JvcHJlbmUgKENSKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4wNy4wMCNJc29idXR5bGVuZSBpc29wcmVuZSAoSUlSL1hJSVIpIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjA4LjAwI1NpbGljb25lIChWTVEgYW5kIFBNUSBhbmQgUFZNUSkjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMDkuMDAjRmx1b3Jvc2lsaWNvbmUgKEZWTVEpIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjEwLjAwI1BvbHlhY3J5bGF0ZSAoQUNNKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xMS4wMCNFdGh5bGVuZSBhY3J5bGljIChBRU0pIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjEyLjAwI0NobG9yb3N1bGZvbmF0ZWQgcG9seWV0aHlsZW5lIChDU00pIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjEzLjAwI0NobG9yb3BvbHlldGh5bGVuZSAoQ00pIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjE0LjAwI0VwaWNobG9yb2h5ZHJpbiAoRUNPKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xNS4wMCNOYXR1cmFsIHBvbHlpc29wcmVuZSAoTlIpIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjE2LjAwI1N5bnRoZXRpYyBwb2x5aXNvcHJlbmUgKElSKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xNy4wMCNQb2x5ZXN0ZXIgdXJldGhhbmUgKEFVKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xOC4wMCNQb2x5ZXRoZXIgdXJldGhhbmUgKEVVKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4xOS4wMCNQb2x5YnV0YWRpZW5lIChCUikjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTcuMjAuMDAjUG9seWV0aGVyIGJsb2NrIGFtaWRlIChQRUJBKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4yMS4wMCNTdHlyZW5lIGJsb2NrIGNvcGxveW1lciAoVEVTKSMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4yMi4wMCNDb3BvbHllc3RlciMxMy4xMC4xNy4wMC4wMAotdW5zcHNjNyMxMy4xMC4xNy4yMy4wMCNUaGVybW9wbGFzdGljIzEzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE3LjI0LjAwI1BvbHlvbGVuZmluaWMjMTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTguMDAuMDAjVGhlcm1vcGxhc3RpYyBlbGFzdG9tZXJzIzEzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjE4LjAxLjAwI1BvbHlldGhlciBibG9jayBhbWlkZSAoUEVCQSkjMTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTguMDIuMDAjUG9seW9sZW5maW5pYyAoVFBPKSMxMy4xMC4xOC4wMC4wMAotdW5zcHNjNyMxMy4xMC4xOC4wMy4wMCNFdGhlciBlc3RlciBibG9jayBjb3Bsb3ltZXIgKFRFRUUpIzEzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE4LjA0LjAwI1RoZXJtb3BsYXN0aWMgZWxhc3RvbWVyIHBvbHl1cmV0aGFuZSAoVFBVUikjMTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTguMDUuMDAjU3R5cmVuZSBibG9jayBjb3Bsb3ltZXIgKFRFUykjMTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTkuMDAuMDAjVGhlcm1vc2V0IHBsYXN0aWNzIzEzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjE5LjAxLjAwI0Vwb3h5IChFUCkjMTMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMTkuMDIuMDAjUGhlbm9saWMgKFBGKSMxMy4xMC4xOS4wMC4wMAotdW5zcHNjNyMxMy4xMC4xOS4wMy4wMCNVbnNhdHVyYXRlIHBvbHllc3RlciAoVVApIzEzLjEwLjE5LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE5LjA0LjAwI1VyZWEgKFVGKSMxMy4xMC4xOS4wMC4wMAotdW5zcHNjNyMxMy4xMC4xOS4wNS4wMCNNZWxhbWluZSAoTUYpIzEzLjEwLjE5LjAwLjAwCi11bnNwc2M3IzEzLjEwLjE5LjA2LjAwI1RoZXJtb3NldCBwb2x5dXJldGhhbmUgKFBVUikjMTMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMDAuMDAjVGhlcm1vcGxhc3RpYyBwbGFzdGljcyMxMy4xMC4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4wMS4wMCNBY3J5bG9uaXRyaWxlIGJ1dGFkaWVuZSBzdHlyZW5lIChBQlMpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjAyLjAwI0Fjcnlsb25pdHJpbGUgYnV0YWRpZW5lIHN0eXJlbmUgKEFCUykgYWxsb3lzIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjAzLjAwI0FjZXRhbCBwb2x5bWVyIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjA0LjAwI0FjcnlsaWMjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMDUuMDAjQWNyeWxvbml0cmlsZSBzdHlyZW5lIGFjcnlsaWMgKEFTQSkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMDYuMDAjQWNyeWxvbml0cmlsZSBzdHlyZW5lIGFjcnlsaWMgKEFTQSkgYWxsb3lzIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjA3LjAwI0NlbGx1bG9zaWNzIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjA4LjAwI0ZsdW9yb3BvbHltZXJzIChQVEZFKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4wOS4wMCNFdGh5bGVuZSB2aW55bCBhY2V0YXRlIChFVkEpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjEwLjAwI0xpcXVpZCBjcnlzdGFsIHBvbHltZXIgKExDUCkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMTEuMDAjUG9seWFtaWRlIG55bG9ucyAoUEEpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjEyLjAwI1BvbHlidXR5bGVuZSB0ZXJlcHRoYWxhdGUgKFBCVCkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMTMuMDAjUG9seWNhcmJvbmF0ZSAoUEMpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjE0LjAwI1BvbHlldGhlcmV0aGVya2V0b25lIChQRUVLKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4xNS4wMCNQb2x5ZXRoZXJpbWlkIChQRUkpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjE2LjAwI1BvbHlldGhlcnN1bGZvbmUgKFBFUykjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMTcuMDAjSGlnaCBkZW5zaXR5IHBvbHlldGh5bGVuZSAoSERQRSkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMTguMDAjTG93IGRlbnNpdHkgcG9seWV0aHlsZW5lIChMRFBFKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4xOS4wMCNNZWRpdW0gZGVuc2l0eSBwb2x5ZXRoeWxlbmUgKE1EUEUpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjIwLjAwI1BvbHlldGh5bGVuZSB0ZXJlcHRoYWxhdGUgKFBFVCkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMjEuMDAjUG9seWltaWRlIChQSSkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMjIuMDAjUG9seXByb3B5bGVuZSAoUFApIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjIzLjAwI1BvbHlwaHRoYWxhbWlkZSAoUFBBKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4yNC4wMCNQb2x5dGhlbnlsZW5lIG94aWRlIChQUE8pIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjI1LjAwI1BvbHlwaGVueWxlbmUgc3VsZmlkZSAoUFBTKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4yNi4wMCNQb2x5c3R5cmVuZSAoUFMpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjI3LjAwI0hpZ2ggaW1wYWN0IHBvbHlzdHlyZW5lIChISVBTKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4yOC4wMCNQb2x5c3VsZm9uZSAoUFNVKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMC4yOS4wMCNSaWdpZCB0aGVybW9wbGFzdGljIHBvbHl1cmV0aGFuZSAoUlBUVSkjMTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjAuMzAuMDAjUG9seXZpbnlsIGNobG9yaWRlIChQVkMpIzEzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIwLjMxLjAwI1N0eXJlbmUgYWNyeWxvbml0cmlsZSAoU0FOKSMxMy4xMC4yMC4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wMC4wMCNSZXNpbnMjMTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjEuMDEuMDAjUGxhc3RpYyByZXNpbnMjMTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjEuMDIuMDAjSW5kZW5lIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wMy4wMCNVcmVhIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wNC4wMCNQaGVub2xpYyByZXNpbnMjMTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjEuMDUuMDAjVGhlcm1vcGxhc3RpYyByZXNpbnMjMTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjEuMDYuMDAjQWxreWQgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjA3LjAwI01lbGFtaW5lIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wOC4wMCNQb2x5YWNldGFsIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4wOS4wMCNQb2x5YW1pZGUgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjEwLjAwI1BvbHljYXJib25hdGUgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjExLjAwI1BvbHlldGh5bGVuZSB0ZXJlcGh0aGFsYXRlIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4xMi4wMCNQb2x5ZXRoZXIgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjEzLjAwI0FsbHlsIHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4xNC4wMCNQb2x5dXJldGhhbmUgcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIxLjE1LjAwI0Vwb3h5IHJlc2lucyMxMy4xMC4yMS4wMC4wMAotdW5zcHNjNyMxMy4xMC4yMS4xNi4wMCNQZXRyb2xldW0gcmVzaW5zIzEzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIyLjAwLjAwI1BsYXN0aWMgZmlsbXMjMTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTAuMjIuMDEuMDAjUG9seXVyZXRoYW5lIGZpbG1zIzEzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzEzLjEwLjIyLjAyLjAwI1NpbGljb25lIGNvYXRlZCBmaWxtcyMxMy4xMC4yMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4wMC4wMC4wMCNSZXNpbnMgYW5kIHJvc2lucyBhbmQgb3RoZXIgcmVzaW4gZGVyaXZlZCBtYXRlcmlhbHMjMTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMDAuMDAjUmVzaW5zIzEzLjExLjAwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjAxLjAwI0Vwb3h5IzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjAyLjAwI1BoZW5vbGljIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjAzLjAwI1Vuc2F0dXJhdGVkIHBvbHllc3RlciMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4wNC4wMCNBY3J5bG9uaXRyaWxlIGJ1dGFkaWVuZSBzdHlyZW5lIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjA1LjAwI0Fjcnlsb25pdHJpbGUgc3R5cmVuZSBhY3J5bGljIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjA2LjAwI0Fjcnlsb25pdHJpbGUgc3R5cmVuZSBhY3J5bGljIGFsbG95cyMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4wNy4wMCNGbHVvcm9wb2x5bWVycyMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4wOC4wMCNFdGh5bGVuZSB2aW55bCBhY2V0YXRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjA5LjAwI0xpcXVpZCBjcnlzdGFsIHBvbHltZXIjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMTAuMDAjTnlsb24jMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMTEuMDAjUG9seWJ1dHlsZW5lIHRlcmVwdGhhdGxhdGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMTIuMDAjUG9seWNhcmJvbmF0ZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4xMy4wMCNQb2x5ZXRoZXJldGhlcmtldG9uZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4xNC4wMCNQb2x5ZXRoZXJpbWlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4xNS4wMCNQb2x5ZXRoZXJzdWxmb25lIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjE2LjAwI1BvbHlldGh5bGVuZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4xNy4wMCNQb2x5ZXRoeWxlbmUgdGVycHRoYWxhdGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMTguMDAjUG9seWltaWRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjE5LjAwI1BvbHlwcm9weWxlbmUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMjAuMDAjUG9seXBodGhhbGFtaWRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjIxLjAwI1BvbHlldGh5bGVuZSBveGlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4yMi4wMCNQb2x5cGhlbnlsZW5lIHN1bGZpZGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMjMuMDAjUG9seXN0eXJlbmUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMjQuMDAjUG9seXN1bGZvbmUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMjUuMDAjUG9seXZpbnlsIGNobG9yaWRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjI2LjAwI1N0eXJlbmUgYWNyeWxvbml0cmlsZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4yNy4wMCNVcmVhIGZvcm1hbGRlaHlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4yOC4wMCNBbGt5ZCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4yOS4wMCNNZWxhbWluZSBmb3JtYWxkZWh5ZGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMzAuMDAjUG9seWFjZXRhbCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4zMS4wMCNQb2x5YW1pZGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMzIuMDAjQWxseWwjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuMzMuMDAjRXRoeWxlbmUgYWNyeWxpYyBhY2lkIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjM0LjAwI1BvbHl2aW55bCBjaGxvcmlkZSBjb21wb3VuZCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4zNS4wMCNTb2x1dGlvbiB2aW55bCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC4zNi4wMCNQaGVub3h5IzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjM3LjAwI0NvbXBvdW5kZWQgcmVzaW5zIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjM4LjAwI1BvbHl2aW5seSBweXJvbGlkaW5lIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjM5LjAwI1BvbHlldGh5bGVuZSB0ZXJlcGh0aGFsYXRlIG9yIGdseWNvbCBtb2RpZmllZCMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC40MC4wMCNIeWRyb2NhcmJvbiB0YWNraWZpZXIjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNDEuMDAjUG9seWNhcmJvbmF0ZSBibGVuZHMjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNDIuMDAjUG9seXZpbnlsIGFsY29ob2wjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNDMuMDAjUG9seXZpbnlsIGJ1dHlyYWwjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNDQuMDAjUG9seWVzdGVyIG1vbGRpbmcgY29tcG91bmRzIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjQ1LjAwI1BvbHl2aW55bCBhY2V0YXRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjQ2LjAwI1BvbHl2aW55bCBldGhlciMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC40Ny4wMCNQb2x5dmlueWwgZm9ybWFsIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjQ4LjAwI1N0eXJlbmUgYWNyeWxpYyMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC40OS4wMCNFdGh5bGVuZSBwcm9weWxlbmUgcG9seW1lcnMjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNTAuMDAjUG9seXByb3B5bGVuZSBveGlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC41MS4wMCNQb2x5cHJvcHlsZW5lIGV0aGVyIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjUyLjAwI1BvbHlwcm9weWxlbmUgc3VsZm9uZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC41My4wMCNQb2x5bWV0aHlsYWNyeWxhdGUjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNTQuMDAjU3R5cmVuZSBtYWxlaWMgYW5oeWRyaWRlIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjU1LjAwI1N5bmRpb3RhdGljIHBvbHlzdHlyZW5lIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjU2LjAwI0NobG9yaW5hdGVkIHBvbHl2aW55bCBjaGxvcmlkZSMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC41Ny4wMCNUaGVybW9wbGFzdGljIHBvbHllc3RlciMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC41OC4wMCNJbmRlbmUgcmVzaW5zIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjU5LjAwI1BsYXN0aWMgcmVzaW5zIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjEwLjYwLjAwI1BldHJvbGV1bSByZXNpbnMjMTMuMTEuMTAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTAuNjEuMDAjUG9seXVyZXRoYW5lIHJlc2lucyMxMy4xMS4xMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMC42Mi4wMCNQb2x5ZXRoZXIgcmVzaW5zIzEzLjExLjEwLjAwLjAwCi11bnNwc2M3IzEzLjExLjExLjAwLjAwI1Jvc2lucyMxMy4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMS4wMS4wMCNXb29kIHJvc2luIzEzLjExLjExLjAwLjAwCi11bnNwc2M3IzEzLjExLjExLjAyLjAwI0d1bSByb3NpbiMxMy4xMS4xMS4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMS4wMy4wMCNUYWxsIG9pbCByb3NpbiMxMy4xMS4xMS4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4wMC4wMCNGaWxtcyMxMy4xMS4wMC4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4wMS4wMCNQb2x5ZXRoeWxlbmUgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMDIuMDAjUG9seXVyZXRoYW5lIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjAzLjAwI0FjZXRhdGUgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMDQuMDAjQWNyeWxpYyBmaWxtcyMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4wNS4wMCNDb2V4dHJ1ZGVkIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjA2LjAwI0Zsb3Vyb3BvbHltZXIgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMDcuMDAjTWV0YWxpemVkIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjA4LjAwI055bG9uIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjA5LjAwI1BvbHljYXJib25hdGUgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMTAuMDAjUG9seWVzdGVyIGZpbG1zIzEzLjExLjEyLjAwLjAwCi11bnNwc2M3IzEzLjExLjEyLjExLjAwI1BvbHlwcm9weWxlbmUgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMTIuMDAjQmlheGlhbGx5IG9yaWVudGF0ZWQgcG9seXByb3B5bGVuZSMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xMy4wMCNQb2x5bWlkZSBmaWxtcyMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xNC4wMCNQb2x5c3R5cmVuZSBmaWxtcyMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xNS4wMCNGbGV4aWJsZSBwb2x5dmlueWwgY2hsb3JpZGUgZmlsbSMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xNi4wMCNSaWdpZCBwb2x5dmlueWwgY2hsb3JpZGUgZmlsbSMxMy4xMS4xMi4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMi4xNy4wMCNFdGh5bGVuZSB2aW55bCBhbGNvaG9sIGZpbG0jMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMTguMDAjUG9seXZpbnlsaWRlbmUgY2hsb3JpZGUjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTIuMTkuMDAjUG9seXZpbnlsIGFsY29ob2wgZmlsbXMjMTMuMTEuMTIuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTMuMDAuMDAjRm9hbXMjMTMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTMuMDEuMDAjUG9seW9sZWZpbiBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjAyLjAwI1BvbHlldGhlciBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjAzLjAwI1NpbGljb25lIGZvYW0jMTMuMTEuMTMuMDAuMDAKLXVuc3BzYzcjMTMuMTEuMTMuMDQuMDAjRXRoeWxlbmUgcHJvcHlsZW5lIHRlcnBvbHltZXIgZm9hbSMxMy4xMS4xMy4wMC4wMAotdW5zcHNjNyMxMy4xMS4xMy4wNS4wMCNOZW9wcmVuZSBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjA2LjAwI1BvbHl2aW55bCBjaGxvcmlkZSBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjA3LjAwI1J1YmJlciBmb2FtIzEzLjExLjEzLjAwLjAwCi11bnNwc2M3IzEzLjExLjEzLjA4LjAwI1BvbHlzdHlyZW5lIGZvYW0jMTMuMTEuMTMuMDAuMDAKLXVuc3BzYzcjMTQuMDAuMDAuMDAuMDAjUGFwZXIgTWF0ZXJpYWxzIGFuZCBQcm9kdWN0cyMxNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMC4wMC4wMC4wMCNQYXBlciBtYXRlcmlhbHMjMTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTQuMTAuMTUuMDAuMDAjUmF3IG1hdGVyaWFscyMxNC4xMC4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMC4xNS4wMS4wMCNQYXBlciBwdWxwIzE0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjAwLjAwLjAwI1BhcGVyIHByb2R1Y3RzIzE0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjAwLjAwI1ByaW50aW5nIGFuZCB3cml0aW5nIHBhcGVyIzE0LjExLjAwLjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjAxLjAwI09uaW9uIHNraW4gcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMDIuMDAjVmVsbHVtIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjAzLjAwI1BhcmNobWVudCBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4wNC4wMCNUcmFjdG9yIGZlZWQgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMDUuMDAjTWltZW9ncmFwaCBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4wNi4wMCNDb21wdXRlciBwcmludG91dCBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4wNy4wMCNQcmludGVyIG9yIGNvcGllciBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4wOC4wMCNGYWNzaW1pbGUgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMDkuMDAjU3RhdGlvbmVyeSMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4xMC4wMCNQbG90dGVyIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjExLjAwI1dyaXRpbmcgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTIuMDAjR3JhcGggcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTMuMDAjTGVkZ2VyIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjE0LjAwI1BhcGVyIHBhZHMgb3Igbm90ZWJvb2tzIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjE1LjAwI0NhbGN1bGF0b3Igb3IgY2FzaCByZWdpc3RlciBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4xNi4wMCNOb3RlYm9vayBmaWxsZXIgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTcuMDAjQnVzaW5lc3MgZm9ybXMjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTguMDAjSW5kZXggY2FyZHMjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMTkuMDAjQ2FyZHN0b2NrIHBhcGVycyMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4yMC4wMCNCbG90dGVyIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjIxLjAwI0xhc2VyIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjIyLjAwI0lua2pldCBwYXBlciMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4yMy4wMCNUcmFjaW5nIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE1LjI0LjAwI0Zvb2xzY2FwIHNoZWV0cyMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4yNS4wMCNNdWx0aXB1cnBvc2UgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMjYuMDAjVGVsZXBob25lIG1lc3NhZ2UgcGFkcyBvciBib29rcyMxNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNS4yOC4wMCNNYWduZXQgcGFwZXIjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMjkuMDAjVGVsZXggcm9sbHMjMTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTUuMzAuMDAjU2VsZiBhZGhlc2l2ZSBub3RlIHBhcGVyIzE0LjExLjE1LjAwLjAwCi11bnNwc2M3IzE0LjExLjE2LjAwLjAwI05vdmVsdHkgcGFwZXIjMTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTYuMDEuMDAjR2lmdCB3cmFwcGluZyBwYXBlciBvciBiYWdzIG9yIGJveGVzIzE0LjExLjE2LjAwLjAwCi11bnNwc2M3IzE0LjExLjE2LjA0LjAwI0J1c2luZXNzIGNhcmRzIzE0LjExLjE2LjAwLjAwCi11bnNwc2M3IzE0LjExLjE2LjA1LjAwI0dyZWV0aW5nIG9yIG5vdGUgb3IgcG9zdCBjYXJkcyMxNC4xMS4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNi4wNi4wMCNBcnQgb3IgY3JhZnQgcGFwZXIjMTQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTYuMDcuMDAjUG9zdGVyIGJvYXJkcyMxNC4xMS4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNi4wOC4wMCNHaWZ0IGNlcnRpZmljYXRlIzE0LjExLjE2LjAwLjAwCi11bnNwc2M3IzE0LjExLjE2LjA5LjAwI0NvdmVyIHBhcGVyIzE0LjExLjE2LjAwLjAwCi11bnNwc2M3IzE0LjExLjE3LjAwLjAwI1BlcnNvbmFsIHBhcGVyIHByb2R1Y3RzIzE0LjExLjAwLjAwLjAwCi11bnNwc2M3IzE0LjExLjE3LjAxLjAwI0ZhY2lhbCB0aXNzdWVzIzE0LjExLjE3LjAwLjAwCi11bnNwc2M3IzE0LjExLjE3LjAyLjAwI1RvaWxldCBzZWF0IGNvdmVycyMxNC4xMS4xNy4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNy4wMy4wMCNQYXBlciB0b3dlbHMjMTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTcuMDQuMDAjVG9pbGV0IHRpc3N1ZSMxNC4xMS4xNy4wMC4wMAotdW5zcHNjNyMxNC4xMS4xNy4wNS4wMCNQYXBlciBuYXBraW5zIG9yIHNlcnZpZXR0ZXMjMTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTcuMDYuMDAjUGFwZXIgdGFibGUgY2xvdGgjMTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTguMDAuMDAjQnVzaW5lc3MgdXNlIHBhcGVycyMxNC4xMS4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMS4xOC4wMS4wMCNUaWNrZXRzIG9yIHRpY2tldCByb2xscyMxNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMS4xOC4wMi4wMCNSZWNlaXB0cyBvciByZWNlaXB0IGJvb2tzIzE0LjExLjE4LjAwLjAwCi11bnNwc2M3IzE0LjExLjE4LjAzLjAwI1ZvdWNoZXJzIzE0LjExLjE4LjAwLjAwCi11bnNwc2M3IzE0LjExLjE4LjA0LjAwI0JpbGxzIG9yIGJpbGwgYm9va3MjMTQuMTEuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTEuMTguMDUuMDAjQ2hlY2tzIG9yIGNoZWNrIGJvb2tzIzE0LjExLjE4LjAwLjAwCi11bnNwc2M3IzE0LjEyLjAwLjAwLjAwI0luZHVzdHJpYWwgdXNlIHBhcGVycyMxNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNS4wMC4wMCNQYXBlcmJvYXJkIGFuZCBwYWNrYWdpbmcgcGFwZXJzIzE0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE0LjEyLjE1LjAxLjAwI0JsZWFjaGVkIHBhcGVyYm9hcmQjMTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTUuMDIuMDAjVW5ibGVhY2hlZCBwYXBlcmJvYXJkIzE0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE0LjEyLjE1LjAzLjAwI0NhcmRib2FyZCMxNC4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNS4wNC4wMCNQYWNrYWdpbmcgcGFwZXIjMTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTYuMDAuMDAjVGlzc3VlIHBhcGVycyMxNC4xMi4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wMS4wMCNVbmJsZWFjaGVkIGNyZXBlIHBhcGVycyMxNC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wMi4wMCNTZW1pIGJsZWFjaGVkIGNyZXBlIHBhcGVycyMxNC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wMy4wMCNXZXQgc3RyZW5ndGggdGlzc3VlIHBhcGVycyMxNC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wNC4wMCNBY2lkIGZyZWUgdGlzc3VlIHBhcGVycyMxNC4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNi4wNS4wMCNLcmFmdCB0aXNzdWUgcGFwZXIjMTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTcuMDAuMDAjTGFtaW5hdGVkIHBhcGVycyMxNC4xMi4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNy4wMS4wMCNQYXBlcnMgYm9uZGVkIHdpdGggZmlsbSMxNC4xMi4xNy4wMC4wMAotdW5zcHNjNyMxNC4xMi4xNy4wMi4wMCNDeWxpbmRlciBwYXBlcnMgb3IgbXVsdGkgbGF5ZXIgaGVhdnl3ZWlnaHQgcGFwZXIjMTQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMDAuMDAjQ29hdGVkIHBhcGVycyMxNC4xMi4wMC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wMS4wMCNDbGF5IGNvYXRlZCBwYXBlcnMjMTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMDIuMDAjUG9seWV0aHlsZW5lIGNvYXRlZCBwYXBlcnMjMTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMDMuMDAjUG9seWVzdGVyIGNvYXRlZCBwYXBlcnMjMTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMDQuMDAjU2lsaWNvbmUgY29hdGVkIHBhcGVycyMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wNS4wMCNMYXRleCB0cmVhdGVkIGNvYXRlZCBwYXBlciMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wNi4wMCNXYXhlZCBwYXBlciMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wNy4wMCNCdXRjaGVyIHBhcGVycyMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOC4wOC4wMCNGcmVlemVyIHBhcGVyIzE0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzE0LjEyLjE4LjA5LjAwI01hc2tpbmcgcGFwZXIjMTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTguMTAuMDAjQ2FyYm9uIHBhcGVycyMxNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNC4xMi4xOS4wMC4wMCNOZXdzcHJpbnQgYW5kIG9mZnNldCBwYXBlcnMjMTQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTkuMDEuMDAjU3RhbmRhcmQgbmV3c3ByaW50IzE0LjEyLjE5LjAwLjAwCi11bnNwc2M3IzE0LjEyLjE5LjAyLjAwI0NvbG9yZWQgbmV3c3ByaW50IzE0LjEyLjE5LjAwLjAwCi11bnNwc2M3IzE0LjEyLjE5LjAzLjAwI0hpZ2ggYnJpZ2h0bmVzcyBuZXdzcHJpbnQjMTQuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMTkuMDQuMDAjT2Zmc2V0IHBhcGVyIzE0LjEyLjE5LjAwLjAwCi11bnNwc2M3IzE0LjEyLjIwLjAwLjAwI1NwZWNpYWx0eSBjb2F0ZWQgcGFwZXJzIzE0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE0LjEyLjIwLjAxLjAwI0J1dGNoZXIgcGFwZXJzIzE0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzE0LjEyLjIwLjAyLjAwI0ZyZWV6ZXIgcGFwZXIjMTQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMjEuMDAuMDAjVW5jb2F0ZWQgYmFzZSBwYXBlcnMjMTQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTQuMTIuMjEuMDEuMDAjU3VwZXIgY2FsZW5kYXJlZCBrcmFmdCBwYXBlciMxNC4xMi4yMS4wMC4wMAotdW5zcHNjNyMxNC4xMi4yMS4wMi4wMCNNYWNoaW5lIGZpbmlzaGVkIG9yIGdsYXplZCBrcmFmdCBwYXBlciMxNC4xMi4yMS4wMC4wMAotdW5zcHNjNyMxNC4xMi4yMS4wMy4wMCNOb24gdHJlYXRlZCB1bmNvYXRlZCBwYXBlciMxNC4xMi4yMS4wMC4wMAotdW5zcHNjNyMxNC4xMi4yMS4wNC4wMCNOb24gdHJlYXRlZCBjcmVwZSBwYXBlciMxNC4xMi4yMS4wMC4wMAotdW5zcHNjNyMxNC4xMi4yMS4wNS4wMCNMYXRleCB0cmVhdGVkIGNyZXBlIHBhcGVyIzE0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzE0LjEyLjIxLjA2LjAwI0xhdGV4IHRyZWF0ZWQgdW5jb2F0ZWQgcGFwZXIjMTQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMTUuMDAuMDAuMDAuMDAjRnVlbHMgYW5kIEZ1ZWwgQWRkaXRpdmVzIGFuZCBMdWJyaWNhbnRzIGFuZCBBbnRpIGNvcnJvc2l2ZSBNYXRlcmlhbHMjMTUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMDAuMDAuMDAjRnVlbHMjMTUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTUuMDAuMDAjUGV0cm9sZXVtIGFuZCBkaXN0aWxsYXRlcyMxNS4xMC4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4wMS4wMCNGdWVsIG9pbCMxNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4wMi4wMCNLZXJvc2VuZSMxNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4wMy4wMCNOYXBodGhhIzE1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEwLjE1LjA0LjAwI0F2aWF0aW9uIGZ1ZWwjMTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTUuMDUuMDAjRGllc2VsIGZ1ZWwjMTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTUuMDYuMDAjR2Fzb2xpbmUjMTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTUuMDcuMDAjUGV0cm9sIzE1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEwLjE1LjA4LjAwI0NydWRlIG9pbCMxNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4wOS4wMCNNYXJpbmUgZnVlbCMxNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNS4xMC4wMCNDb25kZW5zYXRlIzE1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEwLjE2LjAwLjAwI0NvYWwgYW5kIGxpZ25pdGUgYW5kIHBlYXQjMTUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTYuMDEuMDAjQ29hbCMxNS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNi4wMi4wMCNMaWduaXRlIzE1LjEwLjE2LjAwLjAwCi11bnNwc2M3IzE1LjEwLjE2LjAzLjAwI1BlYXQjMTUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMTUuMTAuMTYuMDQuMDAjQ29rZSMxNS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMC4xNi4wNS4wMCNDaGFyY29hbCMxNS4xMC4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMS4wMC4wMC4wMCNHYXNlb3VzIGZ1ZWxzIGFuZCBhZGRpdGl2ZXMjMTUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTEuMTUuMDAuMDAjR2FzZW91cyBmdWVscyMxNS4xMS4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4wMS4wMCNQcm9wYW5lIzE1LjExLjE1LjAwLjAwCi11bnNwc2M3IzE1LjExLjE1LjAyLjAwI01ldGhhbmUjMTUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTEuMTUuMDMuMDAjUHJvcHlsZW5lIzE1LjExLjE1LjAwLjAwCi11bnNwc2M3IzE1LjExLjE1LjA0LjAwI0V0aHlsZW5lIzE1LjExLjE1LjAwLjAwCi11bnNwc2M3IzE1LjExLjE1LjA1LjAwI0J1dGFuZSMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4wNi4wMCNBY2V0eWxlbmUjMTUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTEuMTUuMDcuMDAjV2F0ZXIgZ2FzIG9yIHByb2R1Y2VyIGdhcyMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4wOC4wMCNDb2FsIGdhcyMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4wOS4wMCNMaXF1aWZpZWQgcGV0cm9sZXVtIGdhcyMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNS4xMC4wMCNGdWVsIGFkZGl0aXZlcyMxNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNi4wMC4wMCNGdWVsIGFkZGl0aXZlcyMxNS4xMS4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMS4xNi4wMS4wMCNFdGhhbm9sIzE1LjExLjE2LjAwLjAwCi11bnNwc2M3IzE1LjExLjE2LjAyLjAwI01ldGhhbm9sIzE1LjExLjE2LjAwLjAwCi11bnNwc2M3IzE1LjEyLjAwLjAwLjAwI0x1YnJpY2FudHMgYW5kIG9pbHMgYW5kIGdyZWFzZXMgYW5kIGFudGkgY29ycm9zaXZlcyMxNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wMC4wMCNMdWJyaWNhdGluZyBwcmVwYXJhdGlvbnMjMTUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTUuMDEuMDAjRW5naW5lIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wMi4wMCNDdXR0aW5nIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wMy4wMCNHZWFyIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wNC4wMCNIeWRyYXVsaWMgb2lsIzE1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE1LjA1LjAwI1RyYW5zZm9ybWVyIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wNy4wMCNMaXRoaXVtIGdyZWFzZSMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4wOC4wMCNUcmFuc21pc3Npb24gb2lsIzE1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE1LjA5LjAwI0JyYWtlIG9pbCMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4xMC4wMCNBbnRpZ2FsbGluZyMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4xMS4wMCNBc3NlbWJseSBwYXN0ZXMjMTUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTUuMTIuMDAjQW50aSBhZGhlc2l2ZXMjMTUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTUuMTMuMDAjR3JhcGhpdGUgbHVicmljYW50cyMxNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNS4xNC4wMCNTcHJheSBsdWJyaWNhbnRzIzE1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE1LjE1LjAwI0FudGkgc2VpemUgb3IgYW50aSBzdGFpbiBjb21wb3VuZHMjMTUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTUuMTYuMDAjTGVhayBzdG9wIzE1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE2LjAwLjAwI1dheGVzIzE1LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEyLjE2LjAxLjAwI1BhcmFmZmluIHdheCMxNS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNi4wMi4wMCNTZWFsaW5nIHdheCMxNS4xMi4xNi4wMC4wMAotdW5zcHNjNyMxNS4xMi4xNi4wMy4wMCNPbGVmaW4gd2F4IzE1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE3LjAwLjAwI1NwZWNpYWx0eSBsdWJyaWNhbnRzIzE1LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEyLjE3LjAxLjAwI1BldHJvbGF0dW0jMTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTguMDAuMDAjQW50aSBjb3Jyb3NpdmVzIzE1LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEyLjE4LjAxLjAwI01vaXN0dXJlIHJlcGVsbGVudCMxNS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNS4xMi4xOC4wMi4wMCNBbnRpIGNvcnJvc2lvbiBsdWJyaWNhbnQjMTUuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTguMDMuMDAjUnVzdCByZW1vdmVyIzE1LjEyLjE4LjAwLjAwCi11bnNwc2M3IzE1LjEyLjE4LjA0LjAwI1J1c3QgcHJvb2ZpbmcgcHJlcGFyYXRpb24jMTUuMTIuMTguMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTguMDUuMDAjQW50aSB3ZWxkIHBhc3RlcyMxNS4xMi4xOC4wMC4wMAotdW5zcHNjNyMxNS4xMi4xOS4wMC4wMCNHcmVhc2VzIzE1LjEyLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEyLjE5LjAxLjAwI1NpbGljb25lIGdyZWFzZSMxNS4xMi4xOS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xOS4wMi4wMCNHcmVhc2UjMTUuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMTUuMTIuMTkuMDMuMDAjVGVmbG9uIGdyZWFzZSMxNS4xMi4xOS4wMC4wMAotdW5zcHNjNyMxNS4xMi4xOS4wNC4wMCNXb29sIGdyZWFzZSMxNS4xMi4xOS4wMC4wMAotdW5zcHNjNyMxNS4xMy4wMC4wMC4wMCNGdWVsIGZvciBudWNsZWFyIHJlYWN0b3JzIzE1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEzLjE1LjAwLjAwI051Y2xlYXIgZnVlbCMxNS4xMy4wMC4wMC4wMAotdW5zcHNjNyMxNS4xMy4xNS4wMi4wMCNEZXBsZXRlZCB1cmFuaXVtIzE1LjEzLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEzLjE1LjAzLjAwI0VucmljaGVkIHVyYW5pdW0jMTUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTMuMTUuMDQuMDAjSXJpZGl1bSMxNS4xMy4xNS4wMC4wMAotdW5zcHNjNyMxNS4xMy4xNS4wNS4wMCNFbnJpY2hlZCBwbHV0b25pdW0jMTUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMTUuMTMuMTUuMDYuMDAjRGVwbGV0ZWQgcGx1dG9uaXVtIzE1LjEzLjE1LjAwLjAwCi11bnNwc2M3IzE1LjEzLjE2LjAwLjAwI0Zpc3Npb24gZnVlbCBhc3NlbWJsaWVzIzE1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzE1LjEzLjE2LjAxLjAwI051Y2xlYXIgZnVlbCByb2QjMTUuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMDAuMDAuMDAuMDAjTWluaW5nIE1hY2hpbmVyeSBhbmQgQWNjZXNzb3JpZXMjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMDAuMDAuMDAjTWluaW5nIGFuZCBxdWFycnlpbmcgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTUuMDAuMDAjQ3V0dGluZyBlcXVpcG1lbnQjMjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTUuMDEuMDAjQ29udGludW91cyBtaW5pbmcgZXF1aXBtZW50IzIwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE1LjAyLjAwI0xvbmd3YWxsIHNoZWFycyMyMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNS4wMy4wMCNDb2FsIGN1dHRlcnMjMjAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTUuMDQuMDAjUm9jayBjdXR0ZXJzIzIwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE2LjAwLjAwI1NjcmVlbnMgYW5kIGZlZWRpbmcgZXF1aXBtZW50IzIwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEwLjE2LjAxLjAwI1NjcmVlbnMjMjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTYuMDIuMDAjRmVlZGVycyMyMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4wMC4wMCNDcnVzaGVycyBhbmQgYnJlYWtlcnMgYW5kIGdyaW5kZXJzIzIwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjAxLjAwI1JvY2sgY3J1c2hlcnMjMjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTcuMDIuMDAjUm9sbCBjcnVzaGVycyMyMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4wMy4wMCNDb25lIGNydXNoZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjA0LjAwI0d5cmF0b3J5IGNydXNoZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjA1LjAwI0ltcGFjdCBjcnVzaGVycyMyMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4wNi4wMCNKYXcgY3J1c2hlcnMjMjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTAuMTcuMDcuMDAjQ3J1c2hpbmcgcGxhbnRzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjA4LjAwI1JvZCBtaWxscyMyMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4wOS4wMCNCYWxsIG1pbGxzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjEwLjAwI1B1bHZlcml6aW5nIG1hY2hpbmVyeSMyMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMC4xNy4xMS4wMCNSb2NrIGJyZWFrZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjEyLjAwI0VhcnRoIGdyaW5kZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEwLjE3LjEzLjAwI0N5Y2xvbmUgb3Igdm9ydGV4IGdyaW5kZXJzIzIwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIwLjExLjAwLjAwLjAwI1dlbGwgZHJpbGxpbmcgYW5kIG9wZXJhdGlvbiBlcXVpcG1lbnQjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTUuMDAuMDAjRHJpbGxpbmcgYW5kIGV4cGxvcmF0aW9uIGVxdWlwbWVudCMyMC4xMS4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNS4wMS4wMCNHYXMgd2VsbCBkcmlsbGluZyBlcXVpcG1lbnQjMjAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTUuMDIuMDAjT2lsIHdlbGwgZHJpbGxpbmcgZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjAzLjAwI1N1YnNlYSBzeXN0ZW0gZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjA0LjAwI1dhdGVyIHdlbGwgZHJpbGxpbmcgZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjA1LjAwI1VyYW5pdW0gZXhwbG9yYXRpb24gZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjA2LjAwI1dlbGxoZWFkIGVxdWlwbWVudCMyMC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNS4wNy4wMCNNdWQgb3Igd29ya292ZXIgZmx1aWQgZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE1LjA4LjAwI1NlaXNtaWMgZXF1aXBtZW50IzIwLjExLjE1LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjAwLjAwI0RyaWxsaW5nIGFuZCBvcGVyYXRpb24gbWFjaGluZXJ5IzIwLjExLjAwLjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjAxLjAwI0JvcmluZyBvciBzaW5raW5nIG1hY2hpbmVyeSMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wMi4wMCNEb3duaG9sZSBhc3NlbWJseSBtYWNoaW5lcnkjMjAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTYuMDMuMDAjSGFtbWVyIGRyaWxscyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wNC4wMCNDcmF3bGVyIGRyaWxscyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wNS4wMCNSb2NrIGRyaWxscyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wNi4wMCNQbmV1bWF0aWMgdmlicmF0b3JzIzIwLjExLjE2LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjA3LjAwI1R1bm5lbGluZyBtYWNoaW5lcnkjMjAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTYuMDguMDAjU3RyaWtpbmcgaGFtbWVycyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4wOS4wMCNTaW5rZXIgZHJpbGxzIzIwLjExLjE2LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjEwLjAwI1Nld2VyIGluc3BlY3Rpb24gbWFjaGluZXJ5IzIwLjExLjE2LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjExLjAwI1JvdGFyeSBkcmlsbHMjMjAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTYuMTIuMDAjRHJpbGxpbmcgcmlncyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xMy4wMCNMb25nIGhvbGUgZHJpbGxzIzIwLjExLjE2LjAwLjAwCi11bnNwc2M3IzIwLjExLjE2LjE0LjAwI0luZHVzdHJpYWwgZHJpbGwgYml0cyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xNS4wMCNEcmlmdGVycyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xNi4wMCNEZXJyaWNrcyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xNy4wMCNEcmlsbGluZyBjYXJyaWFnZXMjMjAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTYuMTguMDAjRG93bmhvbGUgZmlzaGluZyBwb2xlcyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNi4xOS4wMCNXZWxsIGRyaWxsaW5nIGJpdCBjb25lcyMyMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNy4wMC4wMCNEcmlsbGluZyBhbmQgb3BlcmF0aW9uIGFjY2Vzc29yaWVzIzIwLjExLjAwLjAwLjAwCi11bnNwc2M3IzIwLjExLjE3LjAxLjAwI0F1ZGlvIHZpc3VhbCBpbnN0cnVtZW50cyBmb3Igd2VsbCBpbnNwZWN0aW9uIzIwLjExLjE3LjAwLjAwCi11bnNwc2M3IzIwLjExLjE3LjAyLjAwI1BhY2tlcnMgb3IgdHViaW5nIGFuY2hvcnMjMjAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTEuMTcuMDMuMDAjRHJpbGxpbmcgY2FzaW5ncyMyMC4xMS4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMS4xNy4wNC4wMCNEcmlsbGluZyBzY3JlZW5zIzIwLjExLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjAwLjAwLjAwI09pbCBhbmQgZ2FzIGRyaWxsaW5nIGFuZCBleHBsb3JhdGlvbiBlcXVpcG1lbnQjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMDAuMDAjQWNpZGl6aW5nIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMC4wMS4wMCNBY2lkaXppbmcgYmxlbmRpbmcgdW5pdHMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMDIuMDAjQWNpZGl6aW5nIGRlbnNpdHkgc2Vuc29ycyMyMC4xMi4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMC4wMy4wMCNBY2lkaXppbmcgcHVtcGluZyB1bml0cyMyMC4xMi4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMC4wNC4wMCNBY2lkaXppbmcgdW5pdHMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMDUuMDAjQWNpZGl6aW5nIGFpciBwaXBpbmcjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMDYuMDAjQWNpZGl6aW5nIGJhbGwgaW5qZWN0b3JzIzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjA3LjAwI0J1bGsgbGlxdWlkIGFjaWQgZXF1aXBtZW50IzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjA4LjAwI0FjaWRpemluZyBkcm9wIGJveGVzIzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjA5LjAwI0FjaWRpemluZyBmbG93IG1ldGVycyMyMC4xMi4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMC4xMC4wMCNBY2lkaXppbmcganVuY3Rpb24gYm94ZXMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMTEuMDAjQWNpZGl6aW5nIHByZXNzdXJlIHNlbnNvcnMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMTIuMDAjQWNpZGl6aW5nIHByb2Nlc3MgcGlwaW5nIzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjEzLjAwI0FjaWRpemluZyBzdHJhaWdodCBqb2ludHMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMTQuMDAjQWNpZGl6aW5nIHN3aXZlbHMjMjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTAuMTUuMDAjQWNpZGl6aW5nIHRyZWF0aW5nIGlyb25zIzIwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEwLjE2LjAwI0FjaWRpemluZyB0cmVlIHNhdmVycyMyMC4xMi4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4wMC4wMCNDZW1lbnRpbmcgZXF1aXBtZW50IzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjAxLjAwI0JsZW5kaW5nIHVuaXRzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjAyLjAwI0JyaWRnZSBwbHVncyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4wMy4wMCNCdWxrIGxpcXVpZCBjZW1lbnQgZXF1aXBtZW50IzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjA0LjAwI0NlbWVudCBidWxrIG1hdGVyaWFsIGVxdWlwbWVudCMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4wNS4wMCNDZW1lbnQgZGVuc2l0eSBzZW5zb3JzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjA2LjAwI0NlbWVudCBmbG9hdGluZyBidWxrIHVuaXRzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjA3LjAwI0NlbWVudCBmbG9hdGluZyBlcXVpcG1lbnQgc3RhZ2UgdG9vbHMjMjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTEuMDguMDAjQ2VtZW50IGZsb2F0aW5nIGVxdWlwbWVudCB3aXBlciBwbHVncyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4wOS4wMCNDZW1lbnQgcHVtcGluZyB1bml0cyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4xMC4wMCNDZW1lbnQgcmV0YWluZXJzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjExLjAwI0NlbnRyYWxpemVycyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4xMi4wMCNFeHByZXNzIGxhdGNoIGNvdXBsZXJzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjEzLjAwI0Zsb2F0IGNvbGxhcnMjMjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTEuMTQuMDAjRmxvYXQgc2hvZXMjMjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTEuMTUuMDAjT2lsZmllbGQgY2VtZW50aW5nIHRvb2xzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjE2LjAwI1JldHJpZXZhYmxlIGNlbWVudGluZyBwYWNrZXJzIzIwLjEyLjExLjAwLjAwCi11bnNwc2M3IzIwLjEyLjExLjE3LjAwI1NhZmV0eSBzbGluZ3MjMjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTEuMTguMDAjU3Vic2VhIGNlbWVudCBoZWFkcyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMS4xOS4wMCNTdXJmYWNlIGNlbWVudCBoZWFkcyMyMC4xMi4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wMC4wMCNGcmFjdHVyaW5nIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wMS4wMCNCdWxrIGxpcXVpZCBmcmFjdHVyaW5nIGVxdWlwbWVudCMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wMi4wMCNGcmFjdHVyaW5nIGJ1bGsgcHJvcHBhbnQgZXF1aXBtZW50IzIwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEyLjAzLjAwI0ZyYWN0dXJpbmcgY29udHJvbCB1bml0cyMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wNC4wMCNGcmFjdHVyaW5nIGRlbnNpdHkgc2Vuc29ycyMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wNS4wMCNGcmFjdHVyaW5nIG1hbmlmb2xkIHVuaXRzIzIwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEyLjA2LjAwI0ZyYWN0dXJpbmcgcHJvcHBhbnQgY29udmV5aW5nIGVxdWlwbWVudCMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMi4wNy4wMCNGcmFjdHVyaW5nIHB1bXBpbmcgdW5pdHMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMDguMDAjRnJhY3R1cmluZyBzbHVycnkgYmxlbmRpbmcgdW5pdHMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMDkuMDAjR2VsIGJsZW5kaW5nIHVuaXRzIzIwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEyLjEwLjAwI0ZyYWN0dXJpbmcgbWlzc2lsZXMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMTEuMDAjUHVtcCBpbnRlZ3JpdHkgbW9uaXRvcnMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMTIuMDAjRnJhY3R1cmluZyBzZXJ2aWNlIHBhY2tlcnMjMjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTIuMTMuMDAjU3RpbXVsYXRpb24gcHVtcGluZyB1bml0cyMyMC4xMi4xMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4wMC4wMCNTYW5kIGNvbnRyb2wgZXF1aXBtZW50IzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjAxLjAwI0JsYW5raW5nIHBsdWdzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjAyLjAwI0Zsb2F0ZXJzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjAzLjAwI0ZyYWMgcGFjayBzeXN0ZW1zIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjA0LjAwI0dyYXZlbCBwYWNrIHN5c3RlbXMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMDUuMDAjR3VpZGUgc2hvZXMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMDYuMDAjSG9vayB1cCBuaXBwbGVzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjA3LjAwI01ha2UgdXAgc3VicyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4wOC4wMCNQcm9kdWN0aW9uIHR1YmluZyBvdmVyc2hvdHMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMDkuMDAjU2FuZCBjb250cm9sIGJsYW5rcyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xMC4wMCNTYW5kIGNvbnRyb2wgYnVsayBsaXF1aWQgZXF1aXBtZW50IzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjExLjAwI1NhbmQgY29udHJvbCBidWxrIHByb3BwYW50IGVxdWlwbWVudCMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xMi4wMCNTYW5kIGNvbnRyb2wgZGVuc2l0eSBzZW5zb3JzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjEzLjAwI1NhbmQgY29udHJvbCBtYW5pZm9sZCB1bml0cyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xNC4wMCNTYW5kIGNvbnRyb2wgcHJvcHBhbnQgY29udmV5aW5nIGVxdWlwbWVudCMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xNS4wMCNTYW5kIGNvbnRyb2wgcHVtcGluZyB1bml0cyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xNi4wMCNTYW5kIGNvbnRyb2wgc2NyZWVucyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4xNy4wMCNTYW5kIGNvbnRyb2wgc2x1cnJ5IGJsZW5kaW5nIHVuaXRzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjE4LjAwI1NhbmQgZGV0ZWN0b3JzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjE5LjAwI1NlYWwgYXNzZW1ibHkgbG9jYXRvcnMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMjAuMDAjU2hlYXIgam9pbnRzIzIwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjEzLjIxLjAwI1NsZWV2ZSBzaGlmdGluZyB0b29scyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xMy4yMi4wMCNTbGlkaW5nIHNsZWV2ZXMjMjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTMuMjMuMDAjVmVsb2NpdHkgc3RyaW5ncyMyMC4xMi4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4wMC4wMCNDb21wbGV0aW9uIHRvb2xzIGFuZCBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMDEuMDAjQmFsbCBjYXRjaGVyIHN1YnMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMDIuMDAjQmxhc3Qgam9pbnRzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjAzLjAwI0JsYXN0IG5pcHBsZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMDQuMDAjQ29tcGxldGlvbiBidWxsIHBsdWdzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjA1LjAwI0NpcmN1bGF0aW9uIHByb2R1Y3Rpb24gZGV2aWNlcyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4wNi4wMCNDb21wbGV0aW9uIHRlc3QgZXF1aXBtZW50IzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjA3LjAwI0NvbnRyb2wgbGluZSBwcm90ZWN0b3JzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjA4LjAwI0RlZmxlY3Rpb24gdG9vbHMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMDkuMDAjQ29tcGxldGlvbiBleHBhbnNpb24gam9pbnRzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjEwLjAwI0Zsb3cgY291cGxpbmdzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjExLjAwI0dhcyBsaWZ0IGVxdWlwbWVudCMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xMi4wMCNIYW5nZXIgbGFuZGluZyB0b29scyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xMy4wMCNDb21wbGV0aW9uIGh5ZHJhdWxpYyBwdW1wcyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xNC4wMCNIeWRyYXVsaWMgc2V0dGluZyB0b29scyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xNS4wMCNJbmplY3Rpb24gc3lzdGVtcyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xNi4wMCNMYW5kaW5nIG5pcHBsZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMTcuMDAjTGluZXIgaGFuZ2VycyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xOC4wMCNQYWNrZXIgcHVsbGluZyB0b29scyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4xOS4wMCNQYWNrZXIgcnVubmluZyB0b29scyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4yMC4wMCNQcm9kdWN0aW9uIHBhY2tlcnMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjEuMDAjUHVtcCBkb3duIHRocm91Z2ggZmxvdyBsaW5lIGVxdWlwbWVudCMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4yMi4wMCNDb21wbGV0aW9uIHNhZmV0eSBqb2ludHMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjMuMDAjQ29tcGxldGlvbiBzZWFsIGFzc2VtYmxpZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjQuMDAjU2VhbCBib3JlcyBvciBwb2xpc2hlZCBib3JlcyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4yNS4wMCNTaWRlIHBvY2tldCBtYW5kcmVscyMyMC4xMi4xNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNC4yNi4wMCNTbGlkaW5nIHNsZWV2ZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjcuMDAjU3Vic3VyZmFjZSBzYWZldHkgdmFsdmVzIzIwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE0LjI4LjAwI1RyYXZlbCBqb2ludHMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMjkuMDAjVHViaW5nIGFuY2hvcnMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTQuMzAuMDAjVHdpbiBmbG93IGFzc2VtYmxpZXMjMjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTUuMDAuMDAjQ29udmVudGlvbmFsIGRyaWxsaW5nIHRvb2xzIzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjAxLjAwI0Jsb3dvdXQgcHJldmVudGVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4wMi4wMCNCbG93b3V0IHByZXZlbnRlciBjb250cm9scyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4wMy4wMCNDYXNpbmcgc2NyYXBlcnMjMjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTUuMDQuMDAjRHJpbGwgY29sbGFycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4wNS4wMCNDb3JpbmcgZXF1aXBtZW50IzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjA2LjAwI0RyaWxsIHBpcGUgdGhyZWFkIHByb3RlY3RvcnMjMjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTUuMDcuMDAjRHJpbGwgcGlwZSB0b29sIGpvaW50cyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4wOC4wMCNEcmlsbCBwaXBlIzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjA5LjAwI0dhdWdlIHJpbmdzIzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjEwLjAwI0hvbGUgb3BlbmVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4xMS4wMCNIb2xlIHJlYW1lcnMjMjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTUuMTIuMDAjRmlzaGluZyBqYXJzIzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjEzLjAwI0Rvd25ob2xlIHNob2NrIGFic29yYmVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4xNC4wMCNEb3duaG9sZSBzdGFiaWxpemVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNS4xNS4wMCNEcmlsbGluZyBzdWJzIzIwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE1LjE2LjAwI1RocnVzdGVycyMyMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNi4wMC4wMCNEcmlsbGluZyBiaXRzIzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjAxLjAwI0ZpeGVkIGN1dHRlciBkcmlsbCBiaXRzIzIwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjAyLjAwI05hdHVyYWwgZGlhbW9uZCBkcmlsbCBiaXRzIzIwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjAzLjAwI05venpsZSBkcmlsbCBiaXRzIzIwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjA0LjAwI1BEQyBiaXRzIzIwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE2LjA1LjAwI1JvbGxlciBjb25lIGJ1dHRvbiBpbnNlcnQgZHJpbGwgYml0cyMyMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNi4wNi4wMCNSb2xsZXIgc3RlZWwgdG9vdGggZHJpbGwgYml0cyMyMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNy4wMC4wMCNGaXNoaW5nIHRvb2xzIzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjE3LjAxLjAwI0J1bXBlciBzdWJzIzIwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE3LjAyLjAwI0Nhc2luZyBwYXRjaGVzIzIwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE3LjAzLjAwI0phciBib29zdGVycyMyMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNy4wNC4wMCNKdW5rIHN1YnMjMjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTcuMDUuMDAjTWlsbHMgb3IgYnVybmluZyBzaG9lcyMyMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xNy4wNi4wMCNPdmVyc2hvdHMjMjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTcuMDcuMDAjT2lsZmllbGQgZmlzaGluZyBzcGVhcnMjMjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTcuMDguMDAjVW5zcGVjaWZpZWQgZmlzaGluZyB0b29scyMyMC4xMi4xNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4xOC4wMC4wMCNEaXJlY3Rpb25hbCBkcmlsbGluZyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTguMDEuMDAjR2Vvc3RlZXJpbmcgdG9vbHMjMjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTguMDIuMDAjTXVkIG1vdG9ycyMyMC4xMi4xOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4xOC4wMy4wMCNSb3Rhcnkgc3RlZXJhYmxlIHRvb2xzIzIwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE4LjA0LjAwI0RpcmVjdGlvbmFsIGRyaWxsaW5nIHN1cmZhY2UgY29udHJvbCBzeXN0ZW1zIzIwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE4LjA1LjAwI1N0cmFpZ2h0IGhvbGUgZGlyZWN0aW9uYWwgZHJpbGxpbmcgdG9vbHMjMjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDAuMDAjV2VsbCBtZWFzdXJlbWVudCBhbmQgbG9nZ2luZyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDEuMDAjQWNvdXN0aWMgdG9vbHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDIuMDAjRHJpbGxpbmcgb3IgbXVkIGNvbnRyb2wgaW5zdHJ1bWVudHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDMuMDAjRHJpbGxpbmcgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgdG9vbHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDQuMDAjRmxvdyBtZWFzdXJlbWVudCBlcXVpcG1lbnQjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDUuMDAjTnVjbGVhciBtYWduZXRpYyByZXNvbmFuY2UgdG9vbHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMDYuMDAjTnVjbGVhciB0b29scyMyMC4xMi4xOS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xOS4wNy4wMCNQcm9kdWN0aW9uIGxvZ2dpbmcgZXF1aXBtZW50IzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE5LjA4LjAwI1Jlc2lzdGl2aXR5IHRvb2xzIzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE5LjA5LjAwI1N1cnZleWluZyBzeXN0ZW1zIzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE5LjEwLjAwI1RlbGVtZXRyeSBzeXN0ZW1zIzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjE5LjExLjAwI1VsdHJhc29uaWMgdG9vbHMjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMTIuMDAjV2VsbCBsb2dnaW5nIGJvdHRvbSBob2xlIHByZXNzdXJlIGVxdWlwbWVudCMyMC4xMi4xOS4wMC4wMAotdW5zcHNjNyMyMC4xMi4xOS4xMy4wMCNXZWxsIGxvZ2dpbmcgZG93bmhvbGUgdGVzdCBlcXVpcG1lbnQjMjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMTkuMTQuMDAjV2VsbCBsb2dnaW5nIHVuaXRzIzIwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjIwLjAwLjAwI0ZpeHR1cmluZyBhbmQgdGVzdCBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjAuMDEuMDAjRHJpZnQgYmFycyMyMC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMC4wMi4wMCNEcmlmdCBzbGVldmVzIzIwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIwLjAzLjAwI0RyaWZ0IHJhYmJpdHMjMjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjAuMDQuMDAjVGVzdCBmaXh0dXJlcyMyMC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMC4wNS4wMCNUZXN0IG5pcHBsZXMjMjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjAuMDYuMDAjVGVzdCBwbHVncyMyMC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMS4wMC4wMCNQZXJmb3JhdGluZyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMDEuMDAjQ2Fwc3VsZSBndW5zIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjAyLjAwI0Nhc2luZyBndW5zIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjAzLjAwI0RlcGxveW1lbnQgaGVhZHMjMjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMDQuMDAjUGVyZm9yYXRpbmcgZXhwbG9zaXZlcyMyMC4xMi4yMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMS4wNS4wMCNGaXJpbmcgaGVhZHMjMjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMDYuMDAjR3VuIGFkYXB0ZXJzIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjA3LjAwI0hpZ2ggc2hvdCBkZW5zaXR5IGd1bnMjMjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMDguMDAjUGVyZm9yYXRpbmcgYnVsbCBwbHVncyMyMC4xMi4yMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMS4wOS4wMCNQbHVnIHNldHRpbmcgdG9vbHMjMjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjEuMTAuMDAjUGVyZm9yYXRpbmcgcG9zaXRpb25pbmcgZXF1aXBtZW50IzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjExLjAwI1NjYWxsb3BlZCBndW5zIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjEyLjAwI1RhbmRlbSBzdWJzIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjEzLjAwI1Rocm91Z2ggdHViaW5nIHBlcmZvcmF0aW9uIGd1biBhY2Nlc3NvcmllcyMyMC4xMi4yMS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMS4xNC4wMCNUaHJvdWdoIHR1YmluZyBwZXJmb3JhdGlvbiBndW5zIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIxLjE1LjAwI1VuZGVyIGJhbGFuY2UgdmVudCBzdWJzIzIwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjAwLjAwI1dlbGwgdGVzdGluZyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMDEuMDAjRmxhcmUgYm9vbXMjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMDIuMDAjRmxhcmUgYnVybmVycyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4wMy4wMCNDYXNlZCBob2xlIHRlc3QgdG9vbHMjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMDQuMDAjQ2hva2UgbWFuaWZvbGRzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjA1LjAwI0RpdmVydGluZyBtYW5pZm9sZHMjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMDYuMDAjRmxvd2hlYWQgYmFza2V0cyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4wNy4wMCNGbG93aGVhZCBzd2l2ZWxzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjA4LjAwI0Zsb3doZWFkcyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4wOS4wMCNGb3JtYXRpb24gc2h1dCBpbiB0b29scyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4xMC4wMCNHYXMgZmxhcmVzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjExLjAwI011ZCBnYXMgYW5hbHl6ZXJzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIyLjEyLjAwI09pbCBzYW1wbGVycyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4xMy4wMCNXZWxsIHRlc3Rpbmcgc2VwYXJhdG9ycyMyMC4xMi4yMi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMi4xNC4wMCNXZWxsIHRlc3Rpbmcgc3VyZmFjZSBwaXBpbmcjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMTUuMDAjU3VyZ2UgdGFua3MjMjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjIuMTYuMDAjV2VsbCB0ZXN0aW5nIGRvd25ob2xlIHRvb2xzIzIwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjAwLjAwI1NsaWNrbGluZSBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDEuMDAjU2xpY2tsaW5lIGFkYXB0ZXIgaGVhZHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDIuMDAjU2xpY2tsaW5lIGJhY2tvZmZzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjAzLjAwI1NsaWNrbGluZSBiZWxsIGd1aWRlcyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4wNC4wMCNTbGlja2xpbmUgYmxpbmQgYm94ZXMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDUuMDAjU2xpY2tsaW5lIGJvdHRvbSBob2xlIHByZXNzdXJlIGVxdWlwbWVudCMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4wNi4wMCNTbGlja2xpbmUgY2FsaXBlciB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4wNy4wMCNTbGlja2xpbmUgY2VtZW50IGR1bXAgYmFpbGluZyBlcXVpcG1lbnQjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDguMDAjU2xpY2tsaW5lIGNoZW1pY2FsIGN1dHRlcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMDkuMDAjU2xpY2tsaW5lIGNsYW1wIG9uIHRvb2wgc3RyaW5nIGNlbnRyYWxpemVycyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4xMC4wMCNTbGlja2xpbmUgY2xhbXAgb24gd2lyZWxpbmUgY2VudHJhbGl6ZXJzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjExLjAwI1NsaWNrbGluZSBjb2xsYXIgbG9jYXRvcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMTIuMDAjU2xpY2tsaW5lIGNvbGxlY3RvcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMTMuMDAjU2xpY2tsaW5lIGNvbGxpZGluZyB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4xNC4wMCNTbGlja2xpbmUgY3Jvc3NvdmVycyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4xNS4wMCNTbGlja2xpbmUgZGVwdGggbWVhc3VyZW1lbnQgZXF1aXBtZW50IzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjE2LjAwI1NsaWNrbGluZSBkZXdhciBmbGFza3MjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMTcuMDAjU2xpY2tsaW5lIGRpcG1ldGVyIHRvb2xzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjE4LjAwI1NsaWNrbGluZSBkaXJlY3Rpb25hbCB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4xOS4wMCNTbGlja2xpbmUgZ28gZGV2aWwgdG9vbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjAuMDAjU2xpY2tsaW5lIGhvbGUgcHVuY2hlcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjEuMDAjU2xpY2tsaW5lIGpldCBjdXR0ZXJzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjIyLjAwI1NsaWNrbGluZSBqdW5rIHNob3RzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjIzLjAwI1NsaWNrbGluZSBraWNrb3ZlciB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4yNC4wMCNTbGlja2xpbmUga251Y2tsZSBqb2ludHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjUuMDAjU2xpY2tsaW5lIGxlYWQgaW1wcmVzc2lvbiBibG9ja3MjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjYuMDAjU2xpY2tsaW5lIGxvY2F0b3IgbWFuZHJlbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjcuMDAjU2xpY2tsaW5lIGxvY2sgbWFuZHJlbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMjguMDAjU2xpY2tsaW5lIGx1YnJpY2F0b3JzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjI5LjAwI1NsaWNrbGluZSBtZWNoYW5pY2FsIGJhaWxlcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMzAuMDAjU2xpY2tsaW5lIG1lY2hhbmljYWwgcGx1Z2JhY2tzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjMxLjAwI090aGVyIFNsaWNrbGluZSBUb29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4zMi4wMCNTbGlja2xpbmUgcGFyYWZmaW4gc2NyYXBwZXJzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjMzLjAwI1NsaWNrbGluZSByb3BlIHNvY2tldHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMzQuMDAjU2xpY2tsaW5lIHJ1bm5pbmcgb3IgcHVsbGluZyBwcm9uZ3MjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMzUuMDAjU2xpY2tsaW5lIHNldmVyaW5nIHRvb2xzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjM2LjAwI1NsaWNrbGluZSBzaGVhdmVzIG9yIGZsb29yIGJsb2NrcyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy4zNy4wMCNTbGlja2xpbmUgYm90dG9tIGhvbGUgcHJlc3N1cmUgZXF1aXBtZW50IzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjM4LjAwI1NsaWNrbGluZSBwdWxsaW5nIHRvb2wgYWNjZXNzb3JpZXMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuMzkuMDAjU2xpY2tsaW5lIHB1bGxpbmcgdG9vbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDAuMDAjU2xpY2tsaW5lIHJ1bm5pbmcgdG9vbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDEuMDAjU2xpY2tsaW5lIHVuaXRzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjQyLjAwI1NsaWNrbGluZSB3aXJlIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjQzLjAwI1NsaWNrbGluZSBzb25pYyB0b29scyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy40NC4wMCNTbGlja2xpbmUgc3BhY2VyIGJhcnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDUuMDAjU2xpY2tsaW5lIHN3YWdlcyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy40Ni4wMCNTbGlja2xpbmUgdGVuc2lvbiBkZXZpY2VzIzIwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzIwLjEyLjIzLjQ3LjAwI1NsaWNrbGluZSB0dWJpbmcgcGx1Z3MjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDguMDAjU2xpY2tsaW5lIHVsdHJhc29uaWMgdG9vbHMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNDkuMDAjV2lyZWxpbmUgR3JhYnMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjMuNTAuMDAjV2lyZWxpbmUgSmFycyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy41MS4wMCNXaXJlbGluZSBTY3JhcGVycyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy41Mi4wMCNXaXJlbGluZSBTcGVhciMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy41My4wMCNXaXJlbGluZSBTdGVtcyMyMC4xMi4yMy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yMy41NC4wMCNXaXJlbGluZSBWYWx2ZXMjMjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMDAuMDAjUHJvZHVjdGlvbiBzeXN0ZW1zIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNC4wMS4wMCNDYWJsZSB0aHVtcGVycyMyMC4xMi4yNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNC4wMi4wMCNPaWxmaWVsZCBwcm9kdWN0aW9uIGV2YXBvcmF0b3JzIzIwLjEyLjI0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI0LjAzLjAwI0hpcG90IHRlc3RlcnMjMjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMDQuMDAjT2lsZmllbGQgbGFwcGluZyBtYWNoaW5lcyMyMC4xMi4yNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNC4wNS4wMCNNb3RvciBlbmQgbGlmdHMjMjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMDYuMDAjT2lsIGRpZWxlY3RyaWMgdGVzdGVycyMyMC4xMi4yNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNC4wNy4wMCNPaWwgdmFjdXVtIGZpbGxpbmcgdW5pdHMjMjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMDguMDAjT2lsZmllbGQgcHJvZHVjdGlvbiBzaGFmdCBzdHJhaWdodGVuZXJzIzIwLjEyLjI0LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI0LjA5LjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gc3Bvb2xlcnMjMjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjQuMTAuMDAjVmlicmF0aW9uIGFuYWx5emVycyMyMC4xMi4yNC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wMC4wMCNDb2lsZWQgdHViaW5nIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wMS4wMCNCbGFzdGVyIHRvb2xzIzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjAyLjAwI0NvaWxlZCB0dWJpbmcgdHJ1Y2sgY3JhbmUgdW5pdHMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMDMuMDAjQ29pbGVkIHR1YmluZyB1bml0cyMyMC4xMi4yNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wNC4wMCNDb2lsZWQgdHViaW5nIGhvc2UgcGFja2FnZXMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMDUuMDAjQ29pbGVkIHR1YmluZyBpbmZsYXRhYmxlIHN5c3RlbXMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMDYuMDAjQ29pbGVkIHR1YmluZyBpbmplY3RvciBoZWFkcyMyMC4xMi4yNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wNy4wMCNDb2lsZWQgdHViaW5nIGxpZnRpbmcgZXF1aXBtZW50IzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjA4LjAwI09wZXJhdG9yIGhvdXNlcyMyMC4xMi4yNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4wOS4wMCNDb2lsZWQgdHViaW5nIHBvd2VyIHBhY2tzIzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjEwLjAwI0NvaWxlZCB0dWJpbmcgcmVlbHMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMTEuMDAjQ29pbGVkIHR1YmluZyBzcG9vbGluZyByZWVscyMyMC4xMi4yNS4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNS4xMi4wMCNUdWJpbmcgZ3VpZGVzIzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjEzLjAwI1dlbGxoZWFkIGhvb2t1cHMjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjUuMTQuMDAjV2VsbGhlYWQgc3VwcG9ydCBzdHJ1Y3R1cmVzIzIwLjEyLjI1LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI1LjE1LjAwI09pbGZpZWxkIGNvaWxlZCB0dWJpbmcjMjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMDAuMDAjU2Vpc21pYyBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMDEuMDAjU2Vpc21pYyBhbmFsb2cgc2Vuc29ycyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wMi4wMCNTZWlzbWljIGFycmF5cyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wMy4wMCNTZWlzbWljIHN0cmVhbWVyIGNhYmxlIGJpcmRzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjA0LjAwI1NlaXNtaWMgZHJpbGwgdGFua2VycyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wNS4wMCNTZWlzbWljIGdlb3Bob25lcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wNi4wMCNTZWlzbWljIGdyYXZpdHkgc3lzdGVtcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4wNy4wMCNTZWlzbWljIGd1biB3aW5jaCBzeXN0ZW1zIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjA4LjAwI1NlaXNtaWMgaHlkcm9waG9uZXMjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMDkuMDAjU2Vpc21pYyBpbXB1bHNlIHNvdXJjZXMjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMTAuMDAjU2Vpc21pYyBtYXJpbmUgc3RyZWFtZXIgY2FibGVzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjExLjAwI1NlaXNtaWMgb2NlYW4gYm90dG9tIGNhYmxlcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4xMi4wMCNTZWlzbWljIG1hZ25ldGljIHN5c3RlbXMjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMTMuMDAjU2Vpc21pYyBwb3NpdGlvbmluZyBlcXVpcG1lbnQjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMTQuMDAjU2Vpc21pYyByYW1zIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjE1LjAwI1NlaXNtaWMgcmVjZWl2ZXJzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjE2LjAwI1NlaXNtaWMgcmVmcmFjdGlvbiBzeXN0ZW1zIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjE3LjAwI1NlaXNtaWMgc291cmNlIGNvbnRyb2xsZXJzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjE4LjAwI1NlaXNtaWMgc3Bvb2xpbmcgZGV2aWNlcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNi4xOS4wMCNTZWlzbWljIHRvdyBibG9ja3MjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMjAuMDAjU2Vpc21pYyB0b3cgcG9pbnRzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjIxLjAwI1NlaXNtaWMgdmlicmF0b3JzIzIwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI2LjIyLjAwI1NlaXNtaWMgcmVjb3JkaW5nIHN5c3RlbXMjMjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjYuMjMuMDAjU2Vpc21pYyBkYXRhIHByb2Nlc3Npbmcgc3lzdGVtcyMyMC4xMi4yNi4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNy4wMC4wMCNPaWwgY291bnRyeSB0dWJ1bGFyIGdvb2RzIzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjI3LjAxLjAwI09pbCBjb3VudHJ5IGNhc2luZyMyMC4xMi4yNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNy4wMi4wMCNPaWwgY291bnRyeSBjb3VwbGluZ3MjMjAuMTIuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjcuMDMuMDAjT2lsIGNvdW50cnkgcHVwIGpvaW50cyMyMC4xMi4yNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNy4wNC4wMCNPaWwgY291bnRyeSB0dWJpbmcjMjAuMTIuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjcuMDUuMDAjT2lsIGNvdW50cnkgcGlwZSBjb2F0aW5ncyMyMC4xMi4yNy4wMC4wMAotdW5zcHNjNyMyMC4xMi4yNy4wNi4wMCNDb25kdWN0b3IgY2FzaW5nIzIwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI3LjA3LjAwI0NvbmR1Y3RvciBjYXNpbmcgcnVubmluZyBlcXVpcG1lbnQjMjAuMTIuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjcuMDguMDAjRHJpbGwgcGlwZSBjcm9zc292ZXJzIzIwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI3LjA5LjAwI09pbCBjb3VudHJ5IHRocmVhZCBwcm90ZWN0b3JzIzIwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjAwLjAwI0RyaWxsaW5nIGFuZCB3b3Jrb3ZlciByaWdzIGFuZCBlcXVpcG1lbnQjMjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMDEuMDAjTXVkIGFnaXRhdG9ycyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4wMi4wMCNNdWQgdGFua3MjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMDMuMDAjQWlyIGRyaWxsaW5nIGVxdWlwbWVudCMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4wNC4wMCNCYXJnZSByaWdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjA1LjAwI0Jsb3cgb3V0IHByZXZlbnRlcnMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMDYuMDAjRmx1aWQgZGl2ZXJ0ZXJzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjA3LjAwI0RyYXd3b3JrcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4wOC4wMCNEcmlsbCBmbG9vciBlcXVpcG1lbnQjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMDkuMDAjRHJpbGwgc3dpdmVscyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4xMC4wMCNEcmlsbGluZyByaWcgc2hpcHMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMTEuMDAjRHJpbGwgcmlnIGVsZXZhdG9ycyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4xMi4wMCNEcmlsbCByaWcgYmFpbHMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMTMuMDAjSHlkcmF1bGljIHdvcmtvdmVyIHVuaXRzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjE0LjAwI0RyaWxsIHJpZyBqYWNraW5nIHN5c3RlbXMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMTUuMDAjSmFja3VwIG1hcmluZSBkcmlsbGluZyByaWdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjE2LjAwI0tlbGx5IGJ1c2hpbmdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjE3LjAwI0tlbGx5IHZhbHZlcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4xOC4wMCNLZWxseSB3aXBlcnMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMTkuMDAjS2VsbHlzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjIwLjAwI0xhbmQgZHJpbGxpbmcgcmlncyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4yMS4wMCNNdWQgY2xlYW5pbmcgZXF1aXBtZW50IzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjIyLjAwI011ZCBtYW5pZm9sZHMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMjMuMDAjTXVkIG1peGVycyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4yNC4wMCNQaXBlIGhhbmRsaW5nIGVxdWlwbWVudCMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4yNS4wMCNQbGF0Zm9ybSBkcmlsbGluZyByaWdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjI2LjAwI1Bvd2VyIHN3aXZlbCBvciB0b3AgZHJpdmVzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjI3LjAwI1JpZyBza2lkcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4yOC4wMCNEcmlsbCByaWcgcmlzZXJzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjI5LjAwI0RyaWxsIHJpZyByb3RhcnkgdGFibGVzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjMwLjAwI1NlbGYgZWxldmF0aW5nIHdvcmtvdmVyIHBsYXRmb3JtcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4zMS4wMCNTZW1pIHN1Ym1lcnNpYmxlIGRyaWxsaW5nIHJpZ3MjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMzIuMDAjRHJpbGwgZmxvb3Igc2xpcHMjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjguMzMuMDAjTWFrZXVwIHRvbmdzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjM0LjAwI0lyb24gcm91Z2huZWNrcyMyMC4xMi4yOC4wMC4wMAotdW5zcHNjNyMyMC4xMi4yOC4zNS4wMCNUcmF2ZWxpbmcgZXF1aXBtZW50IzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjM2LjAwI1dvcmtvdmVyIGJvYXRzIzIwLjEyLjI4LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI4LjM3LjAwI1dvcmtvdmVyIHJpZ3MjMjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjkuMDAuMDAjU3VyZmFjZSBkYXRhIGxvZ2dpbmcgZXF1aXBtZW50IzIwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjI5LjAxLjAwI1N1cmZhY2UgZGF0YSBsb2dnaW5nIGNvbmR1aXRzIzIwLjEyLjI5LjAwLjAwCi11bnNwc2M3IzIwLjEyLjI5LjAyLjAwI1N1cmZhY2UgZGF0YSBsb2dnaW5nIHNlbnNvcnMjMjAuMTIuMjkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMjkuMDMuMDAjU3VyZmFjZSBkYXRhIGxvZ2dpbmcgdW5pdHMjMjAuMTIuMjkuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMzAuMDAuMDAjTXVsdGlsYXRlcmFsIGVxdWlwbWVudCMyMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMi4zMC4wMS4wMCNNdWx0aWxhdGVyYWwgY2FzaW5nIzIwLjEyLjMwLjAwLjAwCi11bnNwc2M3IzIwLjEyLjMwLjAyLjAwI011bHRpbGF0ZXJhbCBqdW5jdGlvbnMjMjAuMTIuMzAuMDAuMDAKLXVuc3BzYzcjMjAuMTIuMzAuMDMuMDAjTXVsdGlsYXRlcmFsIHBhY2tlcnMjMjAuMTIuMzAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMDAuMDAuMDAjT2lsIGFuZCBnYXMgZHJpbGxpbmcgYW5kIG9wZXJhdGlvbiBtYXRlcmlhbHMjMjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTAuMDAuMDAjRHJpbGxpbmcgbXVkIGFuZCBtYXRlcmlhbHMjMjAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTAuMDEuMDAjRmlsdHJhdGlvbiBjb250cm9sIGFnZW50cyMyMC4xMy4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMC4wMi4wMCNGbHVpZCBzcGFjZXJzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjAzLjAwI0xvc3QgY2lyY3VsYXRpb24gYWdlbnRzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjA0LjAwI09pbCBiYXNlZCBtdWRzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjA1LjAwI1JhdGUgb2YgcGVuZXRyYXRpb24gZW5oYW5jZXJzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjA2LjAwI1Nwb3R0aW5nIGZsdWlkcyMyMC4xMy4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMC4wNy4wMCNTeW50aGV0aWMgYmFzZWQgbXVkcyMyMC4xMy4xMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMC4wOC4wMCNNdWQgdGhpbm5pbmcgYWdlbnRzIzIwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEwLjA5LjAwI1dhdGVyIGJhc2VkIG11ZHMjMjAuMTMuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTAuMTAuMDAjTXVkIHdlaWdodGluZyBhZ2VudHMjMjAuMTMuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTEuMDAuMDAjV2VsbCBmcmFjdHVyaW5nIHByb3BwYW50cyMyMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMS4wMS4wMCNDZXJhbWljIHByb3BwYW50cyMyMC4xMy4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMS4wMi4wMCNGcmFjdHVyaW5nIHNhbmRzIzIwLjEzLjExLjAwLjAwCi11bnNwc2M3IzIwLjEzLjExLjAzLjAwI1Jlc2luIGNvYXRlZCBjZXJhbWljIHByb3BwYW50cyMyMC4xMy4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMS4wNC4wMCNSZXNpbiBjb2F0ZWQgZnJhY3R1cmluZyBzYW5kcyMyMC4xMy4xMS4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMS4wNS4wMCNSZXNpbiBjb2F0ZWQgc2ludGVyZWQgYmF1eGl0ZXMjMjAuMTMuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTEuMDYuMDAjU2ludGVyZWQgYmF1eGl0ZXMjMjAuMTMuMTEuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTIuMDAuMDAjQ29tcGxldGlvbiBmbHVpZHMjMjAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTIuMDEuMDAjRGl2YWxlbnQgYnJpbmVzIzIwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEyLjAyLjAwI01vbm92YWxlbnQgYnJpbmVzIzIwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzIwLjEzLjEzLjAwLjAwI09pbCB3ZWxsIGNlbWVudCMyMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wMS4wMCNPaWwgd2VsbCBidWxrIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wMi4wMCNPaWwgd2VsbCBjbGFzcyBhIHR5cGUgSSBjZW1lbnQjMjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTMuMDMuMDAjT2lsIHdlbGwgY2xhc3MgYiB0eXBlIElJIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wNC4wMCNPaWwgd2VsbCBjbGFzcyBjIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wNS4wMCNPaWwgd2VsbCBjbGFzcyBnIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wNi4wMCNPaWwgd2VsbCBjbGFzcyBoIGNlbWVudCMyMC4xMy4xMy4wMC4wMAotdW5zcHNjNyMyMC4xMy4xMy4wNy4wMCNPaWwgd2VsbCBsaWdodHdlaWdodCBjZW1lbnQjMjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTMuMTMuMDguMDAjT2lsIHdlbGwgc3RhbmRhcmQgZmluZSB0eXBlIElJSSBjZW1lbnQjMjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMDAuMDAuMDAjT2lsIGFuZCBnYXMgb3BlcmF0aW5nIGFuZCBwcm9kdWN0aW9uIGVxdWlwbWVudCMyMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wMC4wMCNXZWxsaGVhZCBlcXVpcG1lbnQjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTAuMDEuMDAjV2VsbGhlYWQgYWN0dWF0b3JzIzIwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjEwLjAyLjAwI1dlbGxoZWFkIGJlYW0gcHVtcHMjMjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTAuMDMuMDAjV2VsbGhlYWQgZmxvdyBsaW5lcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wNC4wMCNXZWxsaGVhZCBnYXRlIHZhbHZlcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wNS4wMCNXZWxsaGVhZCBwcm9kdWN0aW9uIGNob2tlcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wNi4wMCNXZWxsaGVhZCBzdWIgc3VyZmFjZSBmbG93IG9yIGNocmlzdG1hcyB0cmVlcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMC4wNy4wMCNXZWxsaGVhZCBzdXJmYWNlIGZsb3cgb3IgY2hyaXN0bWFzIHRyZWVzIzIwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjEwLjA4LjAwI1dlbGxoZWFkIHN1cmZhY2Ugc2FmZXR5IHZhbHZlcyMyMC4xNC4xMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMS4wMC4wMCNDaGVtaWNhbCBpbmplY3Rpb24gc3lzdGVtcyMyMC4xNC4wMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMS4wMS4wMCNQYXJhZmZpbiBpbmplY3Rpb24gc3lzdGVtcyMyMC4xNC4xMS4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMi4wMC4wMCNEZXNhbmRpbmcgZXF1aXBtZW50IzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjEyLjAxLjAwI1Byb2R1Y3Rpb24gZGVzYW5kaW5nIGVxdWlwbWVudCMyMC4xNC4xMi4wMC4wMAotdW5zcHNjNyMyMC4xNC4xMy4wMC4wMCNEb3duaG9sZSBqZXQgcHVtcHMgYW5kIGFuY2hvcnMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTMuMDEuMDAjRG93bmhvbGUgamV0IHB1bXBzIzIwLjE0LjEzLjAwLjAwCi11bnNwc2M3IzIwLjE0LjE0LjAwLjAwI0Rvd25ob2xlIHByb2R1Y3Rpb24gYWNjZXNzb3JpZXMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTQuMDEuMDAjVHViaW5nIHN0b3BzIzIwLjE0LjE0LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE1LjAwLjAwI0Rvd25ob2xlIHB1bXBzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjE1LjAxLjAwI0VsZWN0cmljIGRvd25ob2xlIHB1bXBzIzIwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE2LjAwLjAwI0V4cG9ydCBwdW1wcyMyMC4xNC4wMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xNi4wMS4wMCNQbmV1bWF0aWMgZXhwb3J0IHB1bXBzIzIwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjAwLjAwI09mZnNob3JlIHByb2R1Y3Rpb24gYW5kIHN0b3JhZ2UgcGxhdGZvcm1zIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjAxLjAwI0ZpeGVkIG9mZnNob3JlIHByb2R1Y3Rpb24gcGxhdGZvcm1zIzIwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjAyLjAwI0Zsb2F0aW5nIG9mZnNob3JlIHByb2R1Y3Rpb24gcGxhdGZvcm1zIzIwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjAzLjAwI0Zsb2F0aW5nIG9mZnNob3JlIHN0b3JhZ2UgcGxhdGZvcm1zIzIwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIwLjE0LjE3LjA0LjAwI0Zsb2F0aW5nIG9mZnNob3JlIHRlbnNpb24gbGVnICBwcm9kdWN0aW9uIHBsYXRmb3JtcyMyMC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xNC4xNy4wNS4wMCNGbG9hdGluZyBvZmZzaG9yZSB0ZW5zaW9uIGxlZyBzdG9yYWdlIHBsYXRmb3JtcyMyMC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyMC4xNC4xOC4wMC4wMCNXZWxsIHByb2R1Y3Rpb24gZmxvdyBtZWFzdXJlbWVudCBtZXRlcnMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMTguMDEuMDAjV2VsbCBwcm9kdWN0aW9uIGdhcyB0dXJiaW5lIG1ldGVycyMyMC4xNC4xOC4wMC4wMAotdW5zcHNjNyMyMC4xNC4xOS4wMC4wMCNHYXMgdHJlYXRpbmcgZXF1aXBtZW50IzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjE5LjAxLjAwI09pbCB3ZWxsIHByb2R1Y3Rpb24gZ2FzIHRyZWF0aW5nIGVxdWlwbWVudCMyMC4xNC4xOS4wMC4wMAotdW5zcHNjNyMyMC4xNC4yMC4wMC4wMCNHbHljb2wgcmVnZW5lcmF0b3JzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjIwLjAxLjAwI09pbCB3ZWxsIGdseWNvbCByZWdlbmVyYXRvcnMjMjAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjEuMDAuMDAjSGVhdGVyIHRyZWF0ZXJzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjIxLjAxLjAwI09pbCB3ZWxsIGhlYXRlciB0cmVhdGVycyMyMC4xNC4yMS4wMC4wMAotdW5zcHNjNyMyMC4xNC4yMi4wMC4wMCNMaW5lIGhlYXRlcnMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjIuMDEuMDAjRWxlY3RyaWNhbCBsaW5lIGhlYXRlcnMjMjAuMTQuMjIuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjMuMDAuMDAjUHJvZHVjdGlvbiBpbmplY3Rpb24gc2tpZHMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjMuMDEuMDAjUG5ldW1hdGljIG1ldGhhbm9sIGluamVjdGlvbnMgc2tpZHMjMjAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjQuMDAuMDAjT2NlYW4gZmxvb3IgZXF1aXBtZW50IzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjI0LjAxLjAwI1N1YnNlYSBwcm9kdWN0aW9uIHdlbGxoZWFkIGVxdWlwbWVudCMyMC4xNC4yNC4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNS4wMC4wMCNQcm9kdWNlZCB3YXRlciB0cmVhdGluZyBlcXVpcG1lbnQjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjUuMDEuMDAjT2lsIGZpZWxkIHdhdGVyIG9pbCBjZW50cmlmdWdlcyMyMC4xNC4yNS4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNi4wMC4wMCNQcm9kdWN0aW9uIGNvbnRyb2wgc3lzdGVtIGluc3RydW1lbnRhdGlvbiMyMC4xNC4wMC4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNi4wMS4wMCNXaXJlbGVzcyBwcm9kdWN0aW9uIGNvbnRyb2wgc3lzdGVtcyMyMC4xNC4yNi4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNy4wMC4wMCNQdW1waW5nIHVuaXRzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjI3LjAxLjAwI1N1Y2tlciByb2QgcHVtcCBqYWNrcyMyMC4xNC4yNy4wMC4wMAotdW5zcHNjNyMyMC4xNC4yNy4wMi4wMCNSb2QgcHVtcHMjMjAuMTQuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjcuMDMuMDAjTWVjaGFuaWNhbCByb2QgcHVtcHMjMjAuMTQuMjcuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjguMDAuMDAjUHJvZHVjdGlvbiBzZXBhcmF0b3JzIzIwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzIwLjE0LjI4LjAxLjAwI09pbCB3YXRlciBzZXBhcmF0b3JzIzIwLjE0LjI4LjAwLjAwCi11bnNwc2M3IzIwLjE0LjI5LjAwLjAwI1N0b3JhZ2UgdmVzc2VscyBhbmQgdGFua3MjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMjkuMDEuMDAjT2lsIHN0b3JhZ2UgdGFua3MjMjAuMTQuMjkuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMzAuMDAuMDAjU3Vja2VyIHJvZHMjMjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMzAuMDEuMDAjQWxsb3kgc3RlZWwgc3Vja2VyIHJvZHMjMjAuMTQuMzAuMDAuMDAKLXVuc3BzYzcjMjAuMTQuMzAuMDIuMDAjUG9ueSByb2RzIzIwLjE0LjMwLjAwLjAwCi11bnNwc2M3IzIxLjAwLjAwLjAwLjAwI0Zhcm1pbmcgYW5kIEZpc2hpbmcgYW5kIEZvcmVzdHJ5IGFuZCBXaWxkbGlmZSBNYWNoaW5lcnkgYW5kIEFjY2Vzc29yaWVzIzIxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjAwLjAwLjAwI0FncmljdWx0dXJhbCBhbmQgZm9yZXN0cnkgYW5kIGxhbmRzY2FwZSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCMyMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wMC4wMCNBZ3JpY3VsdHVyYWwgbWFjaGluZXJ5IGZvciBzb2lsIHByZXBhcmF0aW9uIzIxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjAxLjAwI1Bsb3VnaHMjMjEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTUuMDIuMDAjSGFycm93cyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wMy4wMCNDdWx0aXZhdG9ycyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wNC4wMCNXZWVkZXJzIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjA1LjAwI0hvZWluZyBtYWNoaW5lcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wNi4wMCNHcmFkZXJzIG9yIGxhbmQgbGV2ZWxlcnMjMjEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTUuMDcuMDAjQWdyaWN1bHR1cmFsIHJvbGxlcnMjMjEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTUuMDguMDAjUm9sbGVycyBmb3IgbGF3biBvciBzcG9ydHMgZ3JvdW5kcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4wOS4wMCNUcmVuY2hlciBkcmFpbmFnZSBtYWNoaW5lIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjEwLjAwI0lycmlnYXRpb24gcGlwZXMgb3IgdHViZXMjMjEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTUuMTEuMDAjSXJyaWdhdGlvbiB0cmlja2xlcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4xMi4wMCNJcnJpZ2F0aW9uIG92ZXJoZWFkcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4xMy4wMCNEaXNrcyMyMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNS4xNC4wMCNTdWJzb2lsZXJzIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjE1LjAwI0hlZGdlIGNsaXBwZXJzIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE1LjE2LjAwI0RpYmJsZXJzIzIxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjAwLjAwI0FncmljdWx0dXJhbCBtYWNoaW5lcnkgZm9yIHBsYW50aW5nIGFuZCBzZWVkaW5nIzIxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjAxLjAwI1BsYW50ZXJzIzIxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjAyLjAwI1RyYW5zcGxhbnRlcnMjMjEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTYuMDMuMDAjR3JhaW4gZHJpbGxzIzIxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjA0LjAwI1NlZWQgZHJpbGxzIzIxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjA1LjAwI1NlZWQgdHJlYXRpbmcgZXF1aXBtZW50IzIxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE2LjA2LjAwI0hvbGUgZGlnZ2VycyMyMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNy4wMC4wMCNBZ3JpY3VsdHVyYWwgbWFjaGluZXJ5IGZvciBoYXJ2ZXN0aW5nIzIxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjE3LjAxLjAwI01vd2VycyMyMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMS4xMC4xNy4wMi4wMCNIYXltYWtpbmcgbWFjaGluZXJ5IzIxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE3LjAzLjAwI0hhcnZlc3RlcnMjMjEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTcuMDQuMDAjQ29tYmluZSBoYXJ2ZXN0ZXJzIzIxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE3LjA1LjAwI1RocmVzaGluZyBtYWNoaW5lcyMyMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOC4wMC4wMCNEaXNwZXJzaW5nIGFuZCBzcHJheWluZyBhcHBsaWFuY2VzIGZvciBhZ3JpY3VsdHVyZSMyMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOC4wMS4wMCNTcHJheWVycyMyMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOC4wMi4wMCNEdXN0ZXJzIzIxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE4LjAzLjAwI1dhdGVyIHNwcmlua2xlcnMjMjEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTguMDQuMDAjRmVydGlsaXplciBzcHJlYWRlcnMgb3IgZGlzdHJpYnV0b3JzIzIxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE4LjA1LjAwI0ZvZyBvciBtaXN0IGdlbmVyYXRvcnMjMjEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTguMDYuMDAjQ29tcG9zdGVyIzIxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE4LjA3LjAwI1BvbGxpbmF0aW9uIGVxdWlwbWVudCBvciBzdXBwbGllcyMyMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOC4wOC4wMCNGcm9zdCBwcm90ZWN0aW9uIGVxdWlwbWVudCMyMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOS4wMC4wMCNQb3VsdHJ5IGFuZCBsaXZlc3RvY2sgZXF1aXBtZW50IzIxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIxLjEwLjE5LjAxLjAwI01pbGtpbmcgbWFjaGluZXMjMjEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTkuMDIuMDAjQW5pbWFsIGh1c2JhbmRyeSBlcXVpcG1lbnQjMjEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTkuMDMuMDAjSW5jdWJhdG9ycyBvciBicm9vZGVycyBmb3IgcG91bHRyeSMyMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOS4wNC4wMCNGZWVkIG1peGVycyMyMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOS4wNS4wMCNMaXZlc3RvY2sgaWRlbnRpZmljYXRpb24gZXF1aXBtZW50IzIxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE5LjA2LjAwI0VnZyBpbnNwZWN0aW9uIG9yIGNvbGxlY3RpbmcgZXF1aXBtZW50IzIxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzIxLjEwLjE5LjA3LjAwI0FuaW1hbCB3YXRlcmluZyBtYWNoaW5lcyMyMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyMS4xMC4xOS4wOC4wMCNNaWxrIGNvb2xpbmcgdGFua3MjMjEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMTkuMDkuMDAjQW5pbWFsIHNoZWFyaW5nIG9yIGNsaXBwaW5nIGVxdWlwbWVudCMyMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMC4wMC4wMCNBZ3JpY3VsdHVyYWwgbWFjaGluZXJ5IGZvciBjbGVhbmluZyBhbmQgc29ydGluZyBhbmQgZ3JhZGluZyMyMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMC4wMS4wMCNDbGVhbmluZyBtYWNoaW5lcyBmb3Igc2VlZCBvciBncmFpbiBvciBkcmllZCBsZWd1bWlub3VzIHZlZ2V0YWJsZXMjMjEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjAuMDIuMDAjU29ydGluZyBtYWNoaW5lcyBmb3Igc2VlZCBvciBncmFpbiBvciBkcmllZCBsZWd1bWlub3VzIHZlZ2V0YWJsZXMjMjEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjAuMDMuMDAjR3JhZGluZyBtYWNoaW5lcyBmb3Igc2VlZCBvciBncmFpbiBvciBkcmllZCBsZWd1bWlub3VzIHZlZ2V0YWJsZXMjMjEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjAuMDQuMDAjUmljZSBjbGVhbmluZyBvciBodWxsaW5nIGVxdWlwbWVudCMyMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMC4wNS4wMCNHcmluZGluZyBtaWxscyMyMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMC4wNi4wMCNIYW1tZXIgbWlsbHMjMjEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjEuMDAuMDAjQWdyaWN1bHR1cmFsIHByb2Nlc3NpbmcgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjEuMDEuMDAjQWdyaWN1bHR1cmFsIGJyaXF1ZXR0aW5nIG9yIHBlbHRpbmcgbWFjaGluZXMjMjEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjIuMDAuMDAjRm9yZXN0cnkgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjIuMDEuMDAjRGVjb3J0aWNhdG9ycyMyMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMi4wMi4wMCNMdW1iZXJpbmcgZXF1aXBtZW50IzIxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzIxLjEwLjIyLjAzLjAwI1JlZm9yZXN0YXRpb24gZXF1aXBtZW50IzIxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzIxLjEwLjIyLjA0LjAwI0ZvcmVzdHJ5IHNhd3MjMjEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjIuMDUuMDAjRm9yZXN0cnkgc2tpZGRlcnMjMjEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjIuMDYuMDAjRm9yZXN0cnkgaW5jcmVtZW50IGJvcmVycyMyMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMi4wNy4wMCNGb3Jlc3RyeSBpcHNvbWV0ZXIjMjEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjMuMDAuMDAjR3JlZW5ob3VzZSBlcXVpcG1lbnQjMjEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjMuMDEuMDAjR3JlZW5ob3VzZSBpcnJpZ2F0aW9uIGVxdWlwbWVudCMyMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMyMS4xMC4yMy4wMi4wMCNHcmVlbmhvdXNlIHBvdHMjMjEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjMuMDMuMDAjR3JlZW5ob3VzZSB2ZW50aWxhdGlvbiBlcXVpcG1lbnQjMjEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjMuMDQuMDAjR3JlZW5ob3VzZSBpc29sYXRpb24gZXF1aXBtZW50IzIxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzIxLjEwLjI0LjAwLjAwI0luc2VjdCBlcXVpcG1lbnQjMjEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjQuMDEuMDAjQmVla2VlcGluZyBlcXVpcG1lbnQjMjEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjQuMDIuMDAjU2lsa3dvcm0gZXF1aXBtZW50IzIxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzIxLjEwLjI0LjAzLjAwI0J1dHRlcmZseSBicmVlZGluZyBlcXVpcG1lbnQjMjEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMjEuMTAuMjQuMDQuMDAjQmVldGxlIGJyZWVkaW5nIGVxdWlwbWVudCMyMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMyMS4xMS4wMC4wMC4wMCNGaXNoaW5nIGFuZCBhcXVhY3VsdHVyZSBlcXVpcG1lbnQjMjEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjEuMTEuMTUuMDAuMDAjQ29tbWVyY2lhbCBmaXNoaW5nIGVxdWlwbWVudCMyMS4xMS4wMC4wMC4wMAotdW5zcHNjNyMyMS4xMS4xNS4wMS4wMCNDb21tZXJjaWFsIGZpc2ggaG9va3MjMjEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTEuMTUuMDIuMDAjQ29tbWVyY2lhbCBmaXNoaW5nIHJlZWxzIzIxLjExLjE1LjAwLjAwCi11bnNwc2M3IzIxLjExLjE1LjAzLjAwI0NvbW1lcmNpYWwgZmlzaGluZyBsaW5lIHRhY2tsZSMyMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMS4xNS4wNC4wMCNDb21tZXJjaWFsIGZpc2hpbmcgbmV0cyMyMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMS4xMS4xNS4wNi4wMCNDb21tZXJjaWFsIGZpc2hpbmcgZmxvYXRzIzIxLjExLjE1LjAwLjAwCi11bnNwc2M3IzIxLjExLjE1LjA3LjAwI0NvbW1lcmNpYWwgc2lua2VycyBvciB3ZWlnaHRzIzIxLjExLjE1LjAwLjAwCi11bnNwc2M3IzIxLjExLjE1LjA4LjAwI0Zpc2hpbmcgbmV0IGhhdWxlcnMjMjEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjEuMTEuMTYuMDAuMDAjQXF1YWN1bHR1cmUgZXF1aXBtZW50IzIxLjExLjAwLjAwLjAwCi11bnNwc2M3IzIxLjExLjE2LjAxLjAwI01hcmluZSBoYXRjaGVyeSBlcXVpcG1lbnQjMjEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjEuMTEuMTYuMDIuMDAjUGlzY2ljdWx0dXJlIHN1cHBsaWVzIzIxLjExLjE2LjAwLjAwCi11bnNwc2M3IzIyLjAwLjAwLjAwLjAwI0J1aWxkaW5nIGFuZCBDb25zdHJ1Y3Rpb24gTWFjaGluZXJ5IGFuZCBBY2Nlc3NvcmllcyMyMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMi4xMC4wMC4wMC4wMCNIZWF2eSBjb25zdHJ1Y3Rpb24gbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDAuMDAjRWFydGggbW92aW5nIG1hY2hpbmVyeSMyMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4wMS4wMCNGcm9udCBlbmQgbG9hZGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4wMi4wMCNHcmFkZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjAzLjAwI0xvYWRlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDQuMDAjUGlsZSBkcml2ZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjA1LjAwI1JvbGxlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDYuMDAjRWFydGhtb3Zpbmcgc2NyYXBlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDcuMDAjVGFtcGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4wOC4wMCNUcmVuY2hpbmcgbWFjaGluZXMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMDkuMDAjQmFja2hvZXMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMTAuMDAjQnVsbGRvemVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4xMS4wMCNDb21wYWN0b3JzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjEzLjAwI0RyYWdsaW5lcyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4xNC4wMCNEcmVkZ2VycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4xNS4wMCNFeGNhdmF0b3JzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjE2LjAwI0RpdGNoZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjE3LjAwI0NoZXJyeSBwaWNrZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjE4LjAwI0VsZXZhdGluZyBzY3JhcGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4xOS4wMCNUd2luIGVuZ2luZSBvcGVuIGJvd2wgc2NyYXBlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMjAuMDAjVHdpbiBlbmdpbmUgZWxldmF0aW5nIHNjcmFwZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjIxLjAwI1B1bGxlZCBzY3JhcGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4yMi4wMCNUcmFjayBidWxsZG96ZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjIzLjAwI1doZWVsIGJ1bGxkb3plcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMjQuMDAjTW9iaWxlIGV4Y2F2YXRvcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMjUuMDAjV2hlZWwgZXhjYXZhdG9ycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4yNi4wMCNUcmFjayBleGNhdmF0b3JzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjI3LjAwI0ludGVncmF0ZWQgdG9vbCBjYXJyaWVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4yOC4wMCNXaGVlbCBsb2FkZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjI5LjAwI1NraWQgc3RlZXIgbG9hZGVycyMyMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNS4zMC4wMCNPcGVuIGJvd2wgc2NyYXBlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTUuMzEuMDAjU25vdyBibG93ZXJzIzIyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE1LjMyLjAwI1RyYWNrIGxvYWRlcnMjMjIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTYuMDAuMDAjUGF2aW5nIGVxdWlwbWVudCMyMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNi4wMi4wMCNSYW1taW5nIGVxdWlwbWVudCMyMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNi4wMy4wMCNSb2FkIHdpZGVuZXJzIzIyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE2LjA0LjAwI1ZpYnJhdG9yeSBwbGF0ZXMjMjIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTYuMDUuMDAjQXNwaGFsdCBmaW5pc2hlcnMjMjIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTYuMDYuMDAjQ2hpcCBTcHJlYWRlcnMjMjIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTcuMDAuMDAjSGVhdnkgZXF1aXBtZW50IGNvbXBvbmVudHMjMjIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTcuMDEuMDAjRWFydGhtb3Zpbmcgc2hvdmVscyMyMi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNy4wMi4wMCNFYXJ0aG1vdmluZyBidWNrZXRzIzIyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE3LjAzLjAwI0VhcnRobW92aW5nIGJsYWRlcyMyMi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyMi4xMC4xNy4wNC4wMCNTY2FyaWZpZXJzIzIyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE4LjAwLjAwI0FlcmlhbCBsaWZ0cyMyMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMyMi4xMC4xOC4wMS4wMCNNYW5saWZ0IG9yIHBlcnNvbm5lbCBsaWZ0IzIyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzIyLjEwLjE4LjAyLjAwI1BsYXRmb3JtIGxpZnQjMjIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjIuMTAuMTguMDMuMDAjQXJ0aWN1bGF0aW5nIGJvb20gbGlmdCMyMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMyMi4xMC4xOC4wNC4wMCNUZWxlc2NvcGluZyBib29tIGxpZnQjMjIuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjMuMDAuMDAuMDAuMDAjSW5kdXN0cmlhbCBNYW51ZmFjdHVyaW5nIGFuZCBQcm9jZXNzaW5nIE1hY2hpbmVyeSBhbmQgQWNjZXNzb3JpZXMjMjMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMDAuMDAuMDAjUmF3IG1hdGVyaWFscyBwcm9jZXNzaW5nIG1hY2hpbmVyeSMyMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wMC4wMCNNYWNoaW5lcnkgZm9yIHdvcmtpbmcgd29vZCBhbmQgc3RvbmUgYW5kIGNlcmFtaWMgYW5kIHRoZSBsaWtlIzIzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEwLjE1LjAxLjAwI0NvcGluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wMi4wMCNEcmlsbGluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wMy4wMCNCcm9hY2hpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMDQuMDAjQmVuZGluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wNS4wMCNCb3JpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMDYuMDAjR3JpbmRpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMDcuMDAjTW9sZGluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4wOC4wMCNDdXR0aW5nIG1hY2hpbmVzIzIzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEwLjE1LjA5LjAwI1NhbmRpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTAuMDAjUG9saXNoaW5nIG1hY2hpbmVzIzIzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEwLjE1LjExLjAwI1R1cm5pbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTIuMDAjU2F3aW5nIG1hY2hpbmVzIzIzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEwLjE1LjEzLjAwI01pbGxpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTQuMDAjUGxhbmluZyBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4xNS4wMCNFbmdyYXZpbmcgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTYuMDAjR2xhc3MgYmVhZCBwZWVuZXIgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMTcuMDAjR3JpdCBibGFzdCBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4xOC4wMCNTaG90IHBlZW4gbWFjaGluZSMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4xOS4wMCNSb2JvdCBtYWNoaW5lcyMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4yMC4wMCNSYW0gZWxlY3RybyBkaXNjaGFyZ2UgbWFjaGluZXMjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTAuMTUuMjEuMDAjV2lyZSBjYXRob2RlIGVsZWN0cm9kZSBkaXNjaGFyZ2UgbWFjaGluZSMyMy4xMC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMC4xNS4yMi4wMCNDaGlwIGJyZWFrZXIjMjMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTEuMDAuMDAuMDAjUGV0cm9sZXVtIHByb2Nlc3NpbmcgbWFjaGluZXJ5IzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjAwLjAwI1BldHJvbGV1bSBkaXN0aWxsaW5nIGFuZCBwcm9jZXNzaW5nIG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IzIzLjExLjAwLjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjAxLjAwI0Rpc3RpbGxhdGUgaHlkcm9wcm9jZXNzaW5nIGVxdWlwbWVudCMyMy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNS4wMi4wMCNDcnVkZSBkaXN0aWxsaW5nIG1hY2hpbmVyeSMyMy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNS4wMy4wMCNDYXRhbHl0aWMgY3JhY2tpbmcgZXF1aXBtZW50IzIzLjExLjE1LjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjA0LjAwI0h5ZHJvY3JhY2tpbmcgZXF1aXBtZW50IzIzLjExLjE1LjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjA1LjAwI0lzb21lcml6YXRpb24gbWFjaGluZXJ5IzIzLjExLjE1LjAwLjAwCi11bnNwc2M3IzIzLjExLjE1LjA2LjAwI0Nva2luZyBtYWNoaW5lcnkjMjMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTEuMTUuMDcuMDAjR2FzIHJlY292ZXJ5IG1hY2hpbmVyeSMyMy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNi4wMC4wMCNIeWRyb3RyZWF0aW5nIG1hY2hpbmVyeSMyMy4xMS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNi4wMS4wMCNOYXB0aGEgaHlkcm90cmVhdGVyIzIzLjExLjE2LjAwLjAwCi11bnNwc2M3IzIzLjExLjE2LjAyLjAwI0Rpc3RpbGxhdGUgaHlkcm90cmVhdGVyIzIzLjExLjE2LjAwLjAwCi11bnNwc2M3IzIzLjExLjE2LjAzLjAwI0NhdGFseXRpYyBmZWVkIGh5ZHJvdHJlYXRlciMyMy4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNi4wNC4wMCNMdWJlIGh5ZHJvdHJlYXRlciMyMy4xMS4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMS4xNi4wNS4wMCNHYXNvbGluZSBoeWRyb3RyZWF0ZXIjMjMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTEuMTYuMDYuMDAjUmVzaWQgaHlkcm90cmVhdGVyIzIzLjExLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjAwLjAwLjAwI1RleHRpbGUgYW5kIGZhYnJpYyBtYWNoaW5lcnkgYW5kIGFjY2Vzc29yaWVzIzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjAwLjAwI1RleHRpbGUgcHJvY2Vzc2luZyBtYWNoaW5lcnkgYW5kIGFjY2Vzc29yaWVzIzIzLjEyLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjAxLjAwI0VtYnJvaWRlcnkgbWFraW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjAyLjAwI0ZlbHRpbmcgbWFjaGluZXMjMjMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTUuMDMuMDAjV2luZGluZyBvciByZWVsaW5nIG9yIHNwb29saW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA0LjAwI1R3aXN0aW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA1LjAwI1N0aXRjaCBib25kaW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA2LjAwI0tuaXR0aW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA3LjAwI1dlYXZpbmcgbWFjaGluZXMjMjMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTUuMDguMDAjRmluaXNoaW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjA5LjAwI1NwaW5uaW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE1LjEwLjAwI0xhY2UgbWFraW5nIG1hY2hpbmVzIzIzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjAwLjAwI1RleHRpbGUgd29ya2luZyBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCBhbmQgYWNjZXNzb3JpZXMjMjMuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMDEuMDAjQnV0dG9uIGNvdmVyaW5nIG1hY2hpbmVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjAyLjAwI0J1dHRvbiBzZXdpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMDMuMDAjQnV0dG9uaG9sZSBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4wNC4wMCNDbG90aCBjdXR0aW5nIG1hY2hpbmVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjA1LjAwI0N1c2hpb24gZmlsbGluZyBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4wNi4wMCNGb2xkaW5nIG9yIHJld2luZGluZyBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4wNy4wMCNCbGVhY2hpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMDguMDAjRmFicmljIG9yIGNsb3RoIGZvbGRpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMDkuMDAjUmVlbGluZyBvciB1bnJlZWxpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMTAuMDAjRHllaW5nIG1hY2hpbmVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjExLjAwI0N1dHRpbmcgb3IgcGlua2luZyBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4xMi4wMCNTZXdpbmcgbWFjaGluZSBuZWVkbGVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEyLjE2LjEzLjAwI1NpbGsgcHJvY2Vzc2luZyBtYWNoaW5lcyMyMy4xMi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMi4xNi4xNC4wMCNTZXdpbmcgbWFjaGluZXMjMjMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTIuMTYuMTUuMDAjRmFicmljIGN1dHRpbmcgdGFibGVzIzIzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEzLjAwLjAwLjAwI0xhcGlkYXJ5IG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEzLjE1LjAwLjAwI0dyaW5kaW5nIGFuZCBzYW5kaW5nIGFuZCBwb2xpc2hpbmcgZXF1aXBtZW50IGFuZCBzdXBwbGllcyMyMy4xMy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4wMS4wMCNBYnJhc2l2ZSBjb21wb3VuZHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDIuMDAjRmVsdCB3aGVlbHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDMuMDAjR3JpbmRpbmcgd2hlZWxzIzIzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE1LjA0LjAwI1BvbGlzaGluZyBjb21wb3VuZHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDUuMDAjUG9saXNoaW5nIGhlYWRzIzIzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE1LjA2LjAwI1BvbGlzaGluZyB3aGVlbHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDcuMDAjU2FuZGluZyBjbG90aHMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMDguMDAjU2FuZGluZyBkcnVtcyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4wOS4wMCNUdW1ibGVycyBvciBwb2xpc2hlcnMjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMTAuMDAjVHVtYmxpbmcgc3VwcGxpZXMgb3IgbWVkaWEjMjMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTUuMTEuMDAjV2F0ZXIgc3dpdmVscyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4xMi4wMCNXYXRlciB0cmF5cyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4xMy4wMCNTYW5kaW5nIGJsb2NrcyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4xNC4wMCNNb3VudGVkIHN0b25lcyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNS4xNS4wMCNHcmluZGluZyB3aGVlbCBkcmVzc2VycyMyMy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNi4wMC4wMCNGYWNldGluZyBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzIzLjEzLjAwLjAwLjAwCi11bnNwc2M3IzIzLjEzLjE2LjAxLjAwI0ZhY2V0aW5nIGFjY2Vzc29yaWVzIzIzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE2LjAyLjAwI0ZhY2V0aW5nIG1hY2hpbmVzIzIzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE2LjAzLjAwI0ZhY2V0aW5nIGxhcHMjMjMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTYuMDQuMDAjRmFjZXRpbmcgc2F3cyMyMy4xMy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNy4wMC4wMCNDYWJiaW5nIGVxdWlwbWVudCMyMy4xMy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNy4wMS4wMCNDYWJiaW5nIGFjY2Vzc29yaWVzIzIzLjEzLjE3LjAwLjAwCi11bnNwc2M3IzIzLjEzLjE3LjAyLjAwI0NhYmJpbmcgYmVsdHMjMjMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTMuMTcuMDMuMDAjQ2FiYmluZyBkaXNjcyMyMy4xMy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xMy4xNy4wNC4wMCNDYWJvY2hvbiBtYWNoaW5lcyMyMy4xMy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNC4wMC4wMC4wMCNMZWF0aGVyd29ya2luZyByZXBhaXJpbmcgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTQuMTYuMDAuMDAjTGVhdGhlciBwcmVwYXJpbmcgbWFjaGluZXJ5IGFuZCBhY2Nlc3NvcmllcyMyMy4xNC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNC4xNi4wMS4wMCNMZWF0aGVyIGZsZXNoaW5nIG1hY2hpbmVzIzIzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE0LjE2LjAyLjAwI0xlYXRoZXIgdGFubmluZyBtYWNoaW5lcyMyMy4xNC4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNC4xNi4wMy4wMCNMZWF0aGVyIGR5ZWluZyBtYWNoaW5lcyMyMy4xNC4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNC4xNi4wNC4wMCNMZWF0aGVyIGRlZ3JlYXNpbmcgbWFjaGluZXMjMjMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTQuMTYuMDUuMDAjTGVhdGhlciBwcmVzc2VzIzIzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE0LjE3LjAwLjAwI0xlYXRoZXIgd29ya2luZyBhbmQgcmVwYWlyaW5nIG1hY2hpbmVyeSBhbmQgYWNjZXNzb3JpZXMjMjMuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTQuMTcuMDEuMDAjTGVhdGhlciBjdXR0aW5nIG1hY2hpbmVzIzIzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE0LjE3LjAyLjAwI0xlYXRoZXIgcml2ZXRpbmcgbWFjaGluZXMjMjMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTQuMTcuMDMuMDAjTGVhdGhlciBuYWlsaW5nIG1hY2hpbmVzIzIzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE0LjE3LjA0LjAwI0xlYXRoZXJ3b3JraW5nIHdvcmtzaG9wIGVxdWlwbWVudCMyMy4xNC4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNS4wMC4wMC4wMCNJbmR1c3RyaWFsIHByb2Nlc3MgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjE1LjAwLjAwI1J1YmJlciBhbmQgcGxhc3RpYyBwcm9jZXNzaW5nIG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IGFuZCBzdXBwbGllcyMyMy4xNS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4wMS4wMCNCbG93IG1vbGRpbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDIuMDAjQ29hdGluZyBtYWNoaW5lcyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4wMy4wMCNFeHRydWRlcnMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDQuMDAjSW5qZWN0aW9uIG1vbGRpbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDUuMDAjUnViYmVyIG9yIHBsYXN0aWMgbWl4ZXJzIzIzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE1LjA2LjAwI1J1YmJlciBvciBwbGFzdGljIHByZXNzZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDcuMDAjVGhlcm1vIGZvcm1pbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDguMDAjVmFjdXVtIG1vbGRpbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMDkuMDAjVnVsY2FuaXppbmcgbWFjaGluZXMjMjMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTUuMTAuMDAjUGxhc3RpYyBjdXR0aW5nIG1hY2hpbmVyeSMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xMS4wMCNQbGFzdGljIGdyaW5kaW5nIG1hY2hpbmVyeSMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xMi4wMCNSdWJiZXIgb3IgcGxhc3RpYyBtaWxscyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xMy4wMCNSdWJiZXIgb3IgcGxhc3RpYyBleHRydXNpb24gZGllcyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xNC4wMCNQbGFzdGljIGluamVjdGlvbiBtb2xkcyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNS4xNS4wMCNUaGVybW9mb3JtaW5nIG1vbGRzIzIzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE1LjE2LjAwI0VqZWN0b3IgcGlucyMyMy4xNS4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNi4wMC4wMCNDZW1lbnQgYW5kIGNlcmFtaWNzIGFuZCBnbGFzcyBpbmR1c3RyeSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTYuMDEuMDAjQmxvd2VycyBvciBkcnllcnMjMjMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTYuMDIuMDAjQ3J1c2hlcnMjMjMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTYuMDMuMDAjRnVzaW9uIHdlbGRpbmcgb3IgZ2xhc3MgZHJhd2luZyBtYWNoaW5lcyMyMy4xNS4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNi4wNC4wMCNHcmluZGluZyBvciBwb2xpc2hpbmcgbWFjaGluZXMjMjMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTYuMDUuMDAjTWl4aW5nIG9yIGtuZWFkaW5nIG1hY2hpbmVzIzIzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE2LjA2LjAwI0NlbWVudCBvciBjZXJhbWljIG9yIGdsYXNzIG9yIHNpbWlsYXIgbWF0ZXJpYWwgbW9sZGluZyBtYWNoaW5lcyMyMy4xNS4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNi4wNy4wMCNQcmVzc2VzIzIzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE2LjA4LjAwI1NpZnRlcnMjMjMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTcuMDAuMDAjT3B0aWNhbCBpbmR1c3RyeSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTcuMDEuMDAjTGVucyBncmluZGluZyBtYWNoaW5lcyMyMy4xNS4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNS4xNy4wMi4wMCNMZW5zIG1lYXN1cmluZyBlcXVpcG1lbnQjMjMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTcuMDMuMDAjTGVucyBwb2xpc2hpbmcgZXF1aXBtZW50IzIzLjE1LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE3LjA0LjAwI0xlbnMgdGVzdGluZyBlcXVpcG1lbnQjMjMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTcuMDUuMDAjT3B0aWNhbCB2YWN1dW0gY29hdGluZyBlcXVpcG1lbnQjMjMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMDAuMDAjUGhhcm1hY2V1dGljYWwgaW5kdXN0cnkgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjAxLjAwI0FtcG91bGUgZmlsbGluZyBlcXVpcG1lbnQjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMDIuMDAjQm90dGxlIGNhcHBlcnMgb3IgY290dG9uIGluc2VydGVycyBvciBzYWZldHkgc2VhbCBhcHBsaWNhdG9ycyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4wMy4wMCNDYXBzdWxhdGluZyBtYWNoaW5lcyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4wNC4wMCNSZWFjdG9ycyBvciBmZXJtZW50ZXJzIG9yIGRpZ2VzdGVycyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4wNS4wMCNGaWxsaW5nIG9yIHNlYWxpbmcgYXVnZXIgZG9zZSBtYWNoaW5lcyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4wNi4wMCNQaGFybWFjZXV0aWNhbCBmaWx0ZXJzIG9yIHVsdHJhIGZpbHRlcnMjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMDcuMDAjRnJlZXplZHJ5ZXJzIG9yIGx5b3BoaWx6ZXJzIzIzLjE1LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjA4LjAwI1BoYXJtYWNldXRpY2FsIGdyYW51bGF0b3JzIzIzLjE1LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjA5LjAwI1BoYW1hY2V1dGljYWwgc2lldmUgb3Igc2NyZWVuaW5nIG1hY2hpbmVzIzIzLjE1LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjEwLjAwI1N0ZXJpbGUgb3IgYXNlcHRpYyBwcm9jZXNzaW5nIG9yIGZpbGxpbmcgbWFjaGluZXMjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMTEuMDAjVGFibGV0IG9yIGNhcHN1bGUgdGVzdGluZyBtYWNoaW5lcyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4xMi4wMCNUYWJsZXQgY291bnRlcnMjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTguMTMuMDAjVGFibGV0dGluZyBtYWNoaW5lcyMyMy4xNS4xOC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOC4xNC4wMCNWYWNjaW5lIHByb2R1Y3Rpb24gZXF1aXBtZW50IzIzLjE1LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE4LjE1LjAwI1Zlc3NlbCBtaXhlcnMjMjMuMTUuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTkuMDAuMDAjUGFwZXIgbWFraW5nIGFuZCBwYXBlciBwcm9jZXNzaW5nIG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IGFuZCBzdXBwbGllcyMyMy4xNS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOS4wMS4wMCNDdXR0ZXJzIzIzLjE1LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE5LjAyLjAwI1NsaXR0ZXJzIzIzLjE1LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE5LjAzLjAwI1dhc2hpbmcgb3IgZGV3YXRlcmluZyBtYWNoaW5lcyMyMy4xNS4xOS4wMC4wMAotdW5zcHNjNyMyMy4xNS4xOS4wNC4wMCNXaW5kZXJzIzIzLjE1LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjE5LjA1LjAwI1dvb2QgcHVscCBvciBkaXNzb2x2ZXIgbWFjaGluZXMjMjMuMTUuMTkuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMTkuMDYuMDAjQ2FsZW5kZXJzIGZvciBwYXBlciBvciBjYXJkYm9hcmQgbWFraW5nIzIzLjE1LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjIwLjAwLjAwI1dlYiBoYW5kbGluZyBhbmQgY29udHJvbCBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjAuMDEuMDAjQ29yb25hIHRyZWF0ZXJzIzIzLjE1LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjIwLjAyLjAwI0ZsYW1lIHRyZWF0ZXJzIzIzLjE1LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjIxLjAwLjAwI1NlcGFyYXRpb24gbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjEuMDEuMDAjVmlicmF0b3J5IHNlcGFyYXRpb24gZXF1aXBtZW50IGFuZCBwYXJ0cyBhbmQgc2NyZWVucyMyMy4xNS4yMS4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMS4wMi4wMCNTdGF0aW9uYXJ5IHNlcGFyYXRpb24gZXF1aXBtZW50IGFuZCBwYXJ0cyBhbmQgc2NyZWVucyMyMy4xNS4yMS4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMS4wMy4wMCNBaXIgY2xhc3NpZmljYXRpb24gZXF1aXBtZW50IGFuZCBwYXJ0cyBhbmQgc2NyZWVucyMyMy4xNS4yMS4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMS4wNC4wMCNDZW50aWZ1Z2FsIHNlcGFyYXRpb24gZXF1aXBtZW50IG9yIHBhcnRzIG9yIHNjcmVlbnMjMjMuMTUuMjEuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjIuMDAuMDAjTWFudWZhY3R1cmluZyB0YWJsZXMgYW5kIHN0YW5kcyMyMy4xNS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMi4wMS4wMCNSb3RhcnkgdGFibGVzIzIzLjE1LjIyLjAwLjAwCi11bnNwc2M3IzIzLjE1LjIyLjAyLjAwI1N0YWNrIHN0YW5kcyMyMy4xNS4yMi4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMi4wMy4wMCNFbmdpbmUgYW5kIGNvbXBvbmVudCB0ZXN0IHN0YW5kcyMyMy4xNS4yMi4wMC4wMAotdW5zcHNjNyMyMy4xNS4yMi4wNC4wMCNNYWNoaW5lIGd1YXJkaW5nIzIzLjE1LjIyLjAwLjAwCi11bnNwc2M3IzIzLjE1LjIzLjAwLjAwI1JvdGFyeSB0YWJsZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjQuMDAuMDAjU3RhY2sgc3RhbmRzIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjI1LjAwLjAwI0VuZ2luZSBhbmQgY29tcG9uZW50IHRlc3Qgc3RhbmRzIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjI2LjAwLjAwI01hY2hpbmUgZ3VhcmRpbmcjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjcuMDAuMDAjQWlyIGNsYXNzaWZpY2F0aW9uIGVxdWlwbWVudCBhbmQgcGFydHMgYW5kIHNjcmVlbnMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjguMDAuMDAjQ2VudGlmdWdhbCBzZXBhcmF0aW9uIGVxdWlwbWVudCBvciBwYXJ0cyBvciBzY3JlZW5zIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjI5LjAwLjAwI1BhY2thZ2luZyBtYWNoaW5lcnkjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMjkuMDEuMDAjV3JhcHBpbmcgbWFjaGluZXJ5IzIzLjE1LjI5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjI5LjAyLjAwI0Zvcm0gb3IgZmlsbCBvciBzZWFsIG1hY2hpbmVyeSMyMy4xNS4yOS4wMC4wMAotdW5zcHNjNyMyMy4xNS4yOS4wMy4wMCNQYWNrYWdpbmcgdmFjdXVtIzIzLjE1LjI5LjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjAwLjAwI0hvbGRpbmcgYW5kIHBvc2l0aW9uaW5nIGFuZCBndWlkaW5nIHN5c3RlbXMgYW5kIGRldmljZXMjMjMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMDEuMDAjQ2FsaWJyYXRpb24gamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjAyLjAwI0d1aWRlIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4wMy4wMCNNYXN0ZXIgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjA0LjAwI05lZWRsZSBqaWcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMDUuMDAjU2hhZnQgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjA2LjAwI0NoZWNraW5nIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4wNy4wMCNTZXR0aW5nIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4wOC4wMCNDYW1lcmEgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjA5LjAwI1BpY2t1cCBqaWcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMTAuMDAjUmVtb3ZhbCBqaWcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMTEuMDAjTm96emxlIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4xMi4wMCNTbGlkaW5nIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4xMy4wMCNDZW50ZXJpbmcgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjE0LjAwI0luc3BlY3RpbmcgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjE1LjAwI0ZlZWRlciBqaWcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMTYuMDAjQ2x1dGNoIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4xNy4wMCNBbGlnbm1lbnQgamlnIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjE4LjAwI1Bvc2l0aW9uaW5nIGppZyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4xOS4wMCNMaWZ0ZXIgcGxhdGUjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMjAuMDAjVGFwZSBndWlkZSMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yMS4wMCNUYXBlIGZlZWQgamF3IzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjIyLjAwI1Bvd2VyIGZlZWRlciMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yMy4wMCNGZWVkZXIgaGFybmVzcyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yNC4wMCNGZWVkIGphdyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yNS4wMCNNZWNoYW5pY2FsIGdyaXBwZXIjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMjYuMDAjSG9sZGVyIGphdyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMC4yNy4wMCNKYXcgYXNzZW1ibHkjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMjguMDAjU3RhdGlvbmFyeSBqYXcjMjMuMTUuMzAuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzAuMjkuMDAjSmlnIGJsb2NrIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjMwLjAwI0xpbmVhciBtb3Rpb24gZ3VpZGVzIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjMxLjAwI01lYXN1cmluZyBqaWdzIzIzLjE1LjMwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMwLjMyLjAwI1JpbmcgamlncyMyMy4xNS4zMC4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMS4wMC4wMCNJbmR1c3RyaWFsIG1hY2hpbmVyeSBjb21wb25lbnRzIzIzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE1LjMxLjAxLjAwI1BpdGNoIHN0b3BwZXIjMjMuMTUuMzEuMDAuMDAKLXVuc3BzYzcjMjMuMTUuMzEuMDIuMDAjUGFwZXIgc3RvcHBlciMyMy4xNS4zMS4wMC4wMAotdW5zcHNjNyMyMy4xNS4zMS4wMy4wMCNTdG9wcGVyIHBhZCMyMy4xNS4zMS4wMC4wMAotdW5zcHNjNyMyMy4xNi4wMC4wMC4wMCNGb3VuZHJ5ICBtYWNoaW5lcyBhbmQgZXF1aXBtZW50IGFuZCBzdXBwbGllcyMyMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wMC4wMCNGb3VuZHJ5IG1hY2hpbmVzIGFuZCBlcXVpcG1lbnQjMjMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMDEuMDAjRm91bmRyeSBibG93ZXJzIzIzLjE2LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE2LjE1LjAyLjAwI0ZvdW5kcnkgYnVybmVycyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wMy4wMCNDb3JlIGRyeWluZyBvdmVucyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wNC4wMCNGb3JnaW5nIHByZXNzZXMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMDUuMDAjSG90IG1ldGFsIG1peGVycyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wNi4wMCNGb3VuZHJ5IGNydWNpYmxlcyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wNy4wMCNGb3VuZHJ5IGNvbnZlcnRlcnMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMDguMDAjT3BlbiBkaWUgZm9yZ2luZyBwcmVzcyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4wOS4wMCNGb3JnaW5nIHN0YW1waW5nIG1hY2hpbmVzIzIzLjE2LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE2LjE1LjEwLjAwI0Nhc3RpbmcgbWFjaGluZXMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMTEuMDAjRm9yZ2luZyByb2xscyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4xMi4wMCNSYWRpYWwgZm9yZ2luZyBtYWNoaW5lcyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4xMy4wMCNDb2xkIGZvcm1pbmcgcHJlc3NlcyMyMy4xNi4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNS4xNC4wMCNTaXppbmcgb3IgZW1ib3NzaW5nIHByZXNzZXMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTUuMTUuMDAjRW5kIGZvcmdpbmcgbWFjaGluZXMjMjMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTYuMDAuMDAjRm91bmRyeSBzdXBwbGllcyMyMy4xNi4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wMS4wMCNGb3VuZHJ5IGJlbGxvd3MjMjMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTYuMTYuMDIuMDAjRm91bmRyeSBjbGF5cyMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wMy4wMCNGb3VuZHJ5IGZsYXNrcyMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wNC4wMCNGb3VuZHJ5IGZsdXhlcyMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wNS4wMCNGb3VuZHJ5IGxhZGxlcyMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wNi4wMCNGb3VuZHJ5IG1vbGRzIzIzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE2LjE2LjA3LjAwI0ZvdW5kcnkgc2FuZCMyMy4xNi4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNi4xNi4wOC4wMCNGb3VuZHJ5IHNob3ZlbHMjMjMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMDAuMDAuMDAjV29ya3Nob3AgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjAwLjAwI1NvbGRlcmluZyBhbmQgYnJhemluZyBhbmQgd2VsZGluZyBtYWNoaW5lcnkgYW5kIHN1cHBsaWVzIzIzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjAxLjAwI0FudGkgc3BhdHRlciBzcHJheXMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMDIuMDAjR2FzIHdlbGRpbmcgb3IgYnJhemluZyByb2RzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjAzLjAwI0ZpbGxlciBtZXRhbCMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4wNC4wMCNCbG93IHBpcGVzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjA1LjAwI0lyb24gcG93ZGVyIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjA2LjAwI1NvbGRlcmluZyBmbHVpZCMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4wNy4wMCNTb2xkZXJpbmcgaXJvbnMgb3IgZ3VucyMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4wOC4wMCNXZWxkZXJzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjA5LjAwI1NvbGRlciMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4xMC4wMCNXZWxkaW5nIHdpcmUjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMTEuMDAjV2VsZGluZyB0b29scyMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4xMi4wMCNXZWxkaW5nIHJvZHMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMTMuMDAjV2VsZGluZyByZWN0aWZpZXJzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjE0LjAwI1dlbGRpbmcgZ2VuZXJhdG9ycyMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4xNS4wMCNXZWxkaW5nIGVsZWN0cm9kZXMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMTcuMDAjQmxvdyB0b3JjaGVzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjE4LjAwI1BsYXNtYSB3ZWxkaW5nIG1hY2hpbmVyeSMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4xOS4wMCNUdW5nc3RlbiBpbmVydCBnYXMgKFRJRykgd2VsZGluZyBtYWNoaW5lcnkjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMjAuMDAjVWx0cmFzb3VuZCB3ZWxkaW5nIG1hY2hpbmVyeSMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4yMS4wMCNMYXNlciB3ZWxkaW5nIG1hY2hpbmVyeSMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4yMi4wMCNTb2xkZXJpbmcgZmx1eGVzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjIzLjAwI1RlbXBlcmF0dXJlIGluZGljYXRpbmcgc3RpY2tzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjI0LjAwI0JyYXplIHJpbmdzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjI1LjAwI1NvbGRlcmluZyB0aXBzIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjI2LjAwI0Rlc29sZGVyaW5nIHRpcHMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMjcuMDAjRGVzb2xkZXJpbmcgYnJhaWQjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMjguMDAjV2VsZGluZyBzY3JlZW5zIG9yIGN1cnRhaW5zIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE1LjI5LjAwI1dlbGRpbmcgb3Igc29sZGVyaW5nIGtpdCMyMy4xNy4xNS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNS4zMC4wMCNTb2xkZXJpbmcgb3IgZGVzb2xkZXJpbmcgb3IgY29tYmluZWQgc3RhdGlvbnMjMjMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTUuMzEuMDAjRGVzb2xkZXJpbmcgR3VuIzIzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjAwLjAwI01hY2hpbmUgdG9vbHMjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMDEuMDAjQm9yaW5nIHRvb2xzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjAyLjAwI0JhciBvciByb2QgY3V0dGVycyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4wMy4wMCNQaXBlIG9yIHR1YmUgY3V0dGVycyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4wNC4wMCNXaXJlIG9yIGNhYmxlIGN1dHRlcnMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMDUuMDAjRGVidXJyaW5nIGVxdWlwbWVudCMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4wNi4wMCNMYXRoZXMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMDcuMDAjTGF0aGUgdG9vbHMgb3IgZGllcyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4wOC4wMCNMYXNlciBjdXR0aW5nIHRvb2xzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjA5LjAwI1R3aXN0IGRyaWxscyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xMC4wMCNSZWFtZXJzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjExLjAwI0NvdW50ZXJib3JlcyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xMi4wMCNNaWxsaW5nIGN1dHRlcnMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMTMuMDAjSG9icyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xNC4wMCNHZWFyIHNoYXBlcnMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMTUuMDAjU2hhdmluZyBjdXR0ZXJzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjE2LjAwI1dhdGVyIGpldCBjdXR0aW5nIG1hY2hpbmVzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjE3LjAwI0Jyb2FjaGluZyB0b29scyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xOC4wMCNJbmRleGFibGUgaW5zZXJ0cyMyMy4xNy4xNi4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNi4xOS4wMCNCb3JpbmcgdG9vbHMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMjAuMDAjQnJvYWNoZXMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTYuMjEuMDAjSW5zZXJ0aW9uIHRvb2xzIzIzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE2LjIyLjAwI1dvcmtzaG9wIHByZXNzZXMjMjMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTcuMDAuMDAjTWV0YWwgYmVuZGluZyBhbmQgZm9ybWluZyBtYWNoaW5lcnkjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTcuMDEuMDAjVGFuZ2VudCBiZW5kZXJzIzIzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE3LjAyLjAwI1dpbmcgYmVuZGVycyMyMy4xNy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNy4wMy4wMCNUdWJlIGJlbmRpbmcgbWFjaGluZXJ5IzIzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE3LjA0LjAwI1BpcGUgYmVuZGluZyBtYW5kcmVscyMyMy4xNy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNy4wNS4wMCNEaWUgYmVuZHMjMjMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTcuMDYuMDAjU2VxdWVudGlhbCBmb3JtaW5nIG1hY2hpbmVzIzIzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE3LjA3LjAwI1R1YmUgZW5kIGZpbmlzaGVycyMyMy4xNy4xNy4wMC4wMAotdW5zcHNjNyMyMy4xNy4xNy4wOC4wMCNNYWNoaW5lIG1vdW50aW5nIzIzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE4LjAwLjAwI01ldGFsIGZhYnJpY2F0aW5nIGRpZXMjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDEuMDAjU3RhbXBpbmcgb3IgZm9ybWluZyBkaWVzIzIzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE4LjAyLjAwI0RpZSBjYXN0aW5nIGRpZXMjMjMuMTcuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDMuMDAjTWV0YWwgZXh0cnVzaW9uIGRpZXMjMjMuMTcuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDQuMDAjQ3V0dGluZyBkaWVzIG9yIHRvb2xpbmcjMjMuMTcuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDUuMDAjUm90YXJ5IGRpZXMjMjMuMTcuMTguMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTguMDYuMDAjU3RlZWwgcnVsZSBkaWVzIzIzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE5LjAwLjAwI1NwZWNpYWwgdG9vbGluZyBmaXh0dXJlcyMyMy4xNy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4xOS4wMS4wMCNIb2xkaW5nIGZpeHR1cmVzIzIzLjE3LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE5LjAyLjAwI0dhdWdlcyBhbmQgaW5zcGVjdGlvbiBmaXh0dXJlcyMyMy4xNy4xOS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xOS4wMy4wMCNGYWJyaWNhdGVkIHRvb2xpbmcgZml4dHVyZXMjMjMuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMTkuMDQuMDAjQ2FzdGluZyB0b29saW5nIzIzLjE3LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE3LjE5LjA1LjAwI0ZvcmdpbmcgdG9vbGluZyMyMy4xNy4xOS4wMC4wMAotdW5zcHNjNyMyMy4xNy4xOS4wNi4wMCNBc3NlbWJseSBvciBkaXNhc3NlbWJseSB0b29saW5nIzIzLjE3LjE5LjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjAwLjAwI01ldGFsIHdvcmtpbmcgbWFjaGluZXJ5IGF0dGFjaG1lbnRzIzIzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjAxLjAwI0J1cnJzIzIzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjAyLjAwI0Zvcm0gUmVsaWVmIzIzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjAzLjAwI01hY2hpbmUgdGhyZWFkaW5nIHRhcHMjMjMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjAuMDQuMDAjTWFjaGluZSB0aHJlYWRpbmcgZGllcyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4wNS4wMCNNYWNoaW5lIGVuZCBtaWxscyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4wNi4wMCNNZXRhbCBzdGFtcHMgb3IgcHVuY2hlcyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4wNy4wMCNNZXRhbCBjdXR0aW5nIGJhbmQgc2F3IGJsYWRlcyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4wOC4wMCNNZXRhbCBjdXR0aW5nIGNpcmN1bGFyIHNhdyBibGFkZXMjMjMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjAuMDkuMDAjQ2FyYmlkZSBpbnNlcnRzIzIzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjEwLjAwI0NlcmFtaWMgaW5zZXJ0cyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4xMS4wMCNTdGVlbCBpbnNlcnRzIzIzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjIwLjEyLjAwI0RpYW1vbmQgaW5zZXJ0cyMyMy4xNy4yMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMC4xMy4wMCNUaHJlYWRpbmcgbWlsbHMjMjMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjEuMDAuMDAjSG9sZGluZyBmaXh0dXJlcyMyMy4xNy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yMi4wMC4wMCNHYXVnZXMgYW5kIGluc3BlY3Rpb24gZml4dHVyZXMjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjMuMDAuMDAjRmFicmljYXRlZCB0b29saW5nIGZpeHR1cmVzIzIzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzIzLjE3LjI0LjAwLjAwI0Nhc3RpbmcgdG9vbGluZyMyMy4xNy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xNy4yNS4wMC4wMCNGb3JnaW5nIHRvb2xpbmcjMjMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTcuMjYuMDAuMDAjQXNzZW1ibHkgb3IgZGlzYXNzZW1ibHkgdG9vbGluZyMyMy4xNy4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOC4wMC4wMC4wMCNJbmR1c3RyaWFsIGZvb2QgYW5kIGJldmVyYWdlIGVxdWlwbWVudCMyMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wMC4wMCNGb29kIHByZXBhcmF0aW9uIG1hY2hpbmVyeSMyMy4xOC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wMS4wMCNGaWxsaW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wMi4wMCNNaWxsaW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wMy4wMCNNaXhpbmcgbWFjaGluZXJ5IzIzLjE4LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE1LjA0LjAwI1NpZnRpbmcgbWFjaGluZXJ5IzIzLjE4LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE1LjA1LjAwI0RlaHlkcmF0aW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wNi4wMCNXYXNoaW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wNy4wMCNDcnVzaGluZyBtYWNoaW5lcnkjMjMuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTUuMDguMDAjQmxhbmNoaW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4wOS4wMCNTb3J0aW5nIG1hY2hpbmVyeSMyMy4xOC4xNS4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNS4xMC4wMCNNZWF0IHR5ZXJzIzIzLjE4LjE1LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE2LjAwLjAwI0Zvb2QgY3V0dGluZyBtYWNoaW5lcnkjMjMuMTguMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTYuMDEuMDAjRGljaW5nIG1hY2hpbmVyeSMyMy4xOC4xNi4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNi4wMi4wMCNTbGljaW5nIG1hY2hpbmVyeSMyMy4xOC4xNi4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNi4wMy4wMCNDaG9wcGluZyBtYWNoaW5lcnkjMjMuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTYuMDQuMDAjQ3V0dGluZyBtYWNoaW5lcnkjMjMuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTYuMDUuMDAjR3JhdGluZyBtYWNoaW5lcnkjMjMuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTYuMDYuMDAjUGVlbGluZyBtYWNoaW5lcnkjMjMuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTcuMDAuMDAjRm9vZCBjb29raW5nIGFuZCBzbW9raW5nIG1hY2hpbmVyeSMyMy4xOC4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNy4wMS4wMCNTbW9raW5nIG1hY2hpbmVyeSMyMy4xOC4xNy4wMC4wMAotdW5zcHNjNyMyMy4xOC4xNy4wMi4wMCNSb2FzdGluZyBtYWNoaW5lcnkjMjMuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTcuMDMuMDAjQ29va2luZyBtYWNoaW5lcnkjMjMuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTcuMDQuMDAjU3RlYW1pbmcgbWFjaGluZXJ5IzIzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE4LjAwLjAwI0luZHVzdHJpYWwgYmV2ZXJhZ2UgcHJvY2Vzc2luZyBtYWNoaW5lcnkjMjMuMTguMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTguMTguMDEuMDAjQ29mZmVlIGJyZXdpbmcgZXF1aXBtZW50IG9yIHN1cHBsaWVzIzIzLjE4LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE4LjAyLjAwI0p1aWNpbmcgbWFjaGluZXJ5IzIzLjE4LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE4LjE4LjAzLjAwI0ljZSBtYWtpbmcgbWFjaGluZXMjMjMuMTguMTguMDAuMDAKLXVuc3BzYzcjMjMuMTguMTguMDQuMDAjSWNlIGNyZWFtIG1hY2hpbmVzIzIzLjE4LjE4LjAwLjAwCi11bnNwc2M3IzIzLjE5LjAwLjAwLjAwI01peGVycyBhbmQgdGhlaXIgcGFydHMgYW5kIGFjY2Vzc29yaWVzIzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjE5LjEwLjAwLjAwI0JhdGNoIG1peGVycyMyMy4xOS4wMC4wMC4wMAotdW5zcHNjNyMyMy4xOS4xMC4wMS4wMCNDaGFuZ2UgY2FuIG1peGVycyMyMy4xOS4xMC4wMC4wMAotdW5zcHNjNyMyMy4xOS4xMC4wMi4wMCNIZWxpY2FsIGJsYWRlIG1peGVyIzIzLjE5LjEwLjAwLjAwCi11bnNwc2M3IzIzLjE5LjEwLjAzLjAwI0RvdWJsZSBhcm0ga25lYWRpbmcgbWl4ZXJzIzIzLjE5LjEwLjAwLjAwCi11bnNwc2M3IzIzLjE5LjEwLjA0LjAwI0ludGVuc2l2ZSBtaXhlcnMjMjMuMTkuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMTkuMTAuMDUuMDAjUm9sbCBtaXhlcnMjMjMuMTkuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMTkuMTEuMDAuMDAjQ29udGludW91cyBtaXhlcnMjMjMuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMTkuMTEuMDEuMDAjU2luZ2xlIHNjcmV3IG1peGVycyMyMy4xOS4xMS4wMC4wMAotdW5zcHNjNyMyMy4xOS4xMS4wMi4wMCNUd2luIHNjcmV3IGV4dHJ1ZGVyIzIzLjE5LjExLjAwLjAwCi11bnNwc2M3IzIzLjIwLjAwLjAwLjAwI01hc3MgdHJhbnNmZXIgZXF1aXBtZW50IzIzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjIwLjEwLjAwLjAwI0dhcyBsaXF1aWQgY29udGFjdGluZyBzeXN0ZW1zIzIzLjIwLjAwLjAwLjAwCi11bnNwc2M3IzIzLjIwLjEwLjAxLjAwI1BsYXRlIGNvbHVtbnMjMjMuMjAuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMjAuMTAuMDIuMDAjUGFja2VkIGNvbHVtbnMjMjMuMjAuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMjAuMTAuMDMuMDAjTGlxdWlkIGRpc3BlcnNlZCBjb250YWN0b3IjMjMuMjAuMTAuMDAuMDAKLXVuc3BzYzcjMjMuMjAuMTAuMDQuMDAjV2V0dGVkIHdhbGwgY29sdW1uIzIzLjIwLjEwLjAwLjAwCi11bnNwc2M3IzIzLjIwLjEwLjA1LjAwI0J1YmJsZSBjb2x1bW5zIzIzLjIwLjEwLjAwLjAwCi11bnNwc2M3IzIzLjIwLjExLjAwLjAwI0Fkc29ycHRpb24gYW5kIGlvbiBleGNoYW5nZSMyMy4yMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4yMC4xMS4wMS4wMCNBZHNvcmJlciB2ZXNzZWwjMjMuMjAuMTEuMDAuMDAKLXVuc3BzYzcjMjMuMjAuMTEuMDIuMDAjQW1iaWVudCBwcmVzc3VyZSBhZHNvcmJlciB2ZXNzZWwjMjMuMjAuMTEuMDAuMDAKLXVuc3BzYzcjMjMuMjEuMDAuMDAuMDAjRWxlY3Ryb25pYyBtYW51ZmFjdHVyaW5nIG1hY2hpbmVyeSBhbmQgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyMyMy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyMy4yMS4xMC4wMC4wMCNFbGVjdHJvbmljIGFzc2VtYmx5IG1hY2hpbmVyeSBhbmQgc3VwcG9ydCBlcXVpcG1lbnQjMjMuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMjMuMjEuMTAuMDEuMDAjQ2hpcCBwbGFjZXJzIzIzLjIxLjEwLjAwLjAwCi11bnNwc2M3IzIzLjIxLjEwLjAyLjAwI0dsdWUgZGlzcGVuc2luZyBtYWNoaW5lcnkjMjMuMjEuMTAuMDAuMDAKLXVuc3BzYzcjMjQuMDAuMDAuMDAuMDAjTWF0ZXJpYWwgSGFuZGxpbmcgYW5kIENvbmRpdGlvbmluZyBhbmQgU3RvcmFnZSBNYWNoaW5lcnkgYW5kIHRoZWlyIEFjY2Vzc29yaWVzIGFuZCBTdXBwbGllcyMyNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4wMC4wMC4wMCNNYXRlcmlhbCBoYW5kbGluZyBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCMyNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wMC4wMCNJbmR1c3RyaWFsIHRydWNrcyMyNC4xMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wMS4wMCNDYXJ0cyMyNC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wMi4wMCNCdWxrIHRyYW5zcG9ydGVycyMyNC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wMy4wMCNEb2xsaWVzIzI0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE1LjA0LjAwI0hhbmQgdHJ1Y2tzIG9yIGFjY2Vzc29yaWVzIzI0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE1LjA1LjAwI1BhbGxldCB0cnVja3MjMjQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTUuMDYuMDAjUHVzaGNhcnRzIzI0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE1LjA3LjAwI1doZWVsYmFycm93cyMyNC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wOC4wMCNDcmVlcGVycyMyNC4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNS4wOS4wMCNXYWdvbnMjMjQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTUuMTAuMDAjVGlsdCB0cnVja3MjMjQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTUuMTEuMDAjU2hlbGYgdHJvbGxleXMjMjQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMDAuMDAjTGlmdGluZyBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzI0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjAxLjAwI0VsZXZhdG9ycyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4wMi4wMCNIb2lzdHMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMDMuMDAjRm9ya2xpZnRzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA0LjAwI0xpZnRzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA1LjAwI0xvYWRpbmcgZXF1aXBtZW50IzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA2LjAwI1N0YWNrZXJzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA3LjAwI0NyYW5lcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4wOC4wMCNXaW5jaGVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjA5LjAwI1RpbHRzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjEwLjAwI01hbmlwdWxhdG9ycyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4xMS4wMCNTbGluZ3MjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTIuMDAjSmFja3MjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTMuMDAjQmxvY2tzIG9yIHB1bGxleXMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTQuMDAjQWlyIGJhZ3MgZm9yIGxvYWRpbmcjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTUuMDAjTG9hZGluZyByYW1wcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4xNi4wMCNCZWxvdyB0aGUgaG9vayBkZXZpY2UjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTcuMDAjU2Npc3NvciBsaWZ0IzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjE4LjAwI1BpcGUgbGF5ZXIjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMTkuMDAjQnJpZGdlIGNyYW5lcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4yMC4wMCNUcmFjayBjcmFuZXMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMjEuMDAjQWxsIHRlcnJhaW4gY3JhbmVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjIyLjAwI1JvdWdoIHRlcnJhaW4gY3JhbmVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjIzLjAwI1Rvd2VyIGNyYW5lcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4yNC4wMCNIeWRyYXVsaWMgdHJ1Y2sgY3JhbmVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjI1LjAwI0NvbnZlbnRpb25hbCB0cnVjayBjcmFuZXMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMjYuMDAjRXNjYWxhdG9yIG9yIHdhbGt3YXlzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjI3LjAwI0dpcmRlciB0cm9sbGV5cyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4yOC4wMCNBZGp1c3RhYmxlIGZvcmtzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjI5LjAwI0ZvcmtsaWZ0IGFjY2Vzc29yaWVzIG9yIHN1cHBsaWVzIzI0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE2LjMwLjAwI1dvcmtzaG9wIGNyYW5lcyMyNC4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNi4zMS4wMCNTdWN0aW9uIGN1cHMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTYuMzIuMDAjU2lkZSBzaGlmdHMjMjQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDAuMDAjQ29udmV5b3JzIGFuZCBhY2Nlc3NvcmllcyMyNC4xMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4wMS4wMCNDb252ZXlvciByb2xsZXIjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDIuMDAjQmFsbCB0cmFuc2ZlciB0YWJsZXMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDMuMDAjUm9jayBiaW5zIzI0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE3LjA0LjAwI0NvbnZleW9yIGZlZWRlcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDUuMDAjQ29udmV5b3Igc2NyZXcjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDYuMDAjVHJvbGxleXMgb3IgYWNjZXNzb3JpZXMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDcuMDAjQ29udmV5b3IgcmFpbHMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDguMDAjRXh0ZW5kYWJsZSBjb252ZXlvcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMDkuMDAjUm9sbGVyIGNvbnZleW9ycyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4xMC4wMCNQYWNrYWdlIHN0b3BzIzI0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE3LjExLjAwI1R1cm50YWJsZXMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMTIuMDAjQmVsdCBjb252ZXlvcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMTMuMDAjQnVja2V0IGNvbnZleW9ycyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4xNC4wMCNBaXIgY29udmV5b3JzIzI0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE3LjE1LjAwI0NvbnZleW9yIGJlbHRpbmcjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMTYuMDAjQ29udmV5b3IgcHVsbGV5cyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4xNy4wMCNDb252ZXlvciBpZGxlcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTcuMTguMDAjQ29udmV5b3IgYmVsdCBsYWNpbmcgb3IgZmFzdGVuZXJzIzI0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE3LjE5LjAwI0NvbnZleW9yIGJlbHQgYnJ1c2hlcyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4yMC4wMCNXZWFyIHN0cmlwcyMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4yMS4wMCNUcm9sbGV5IGxpZCMyNC4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xMC4xNy4yMi4wMCNDaGFpbiBjb252ZXlvcnMjMjQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDAuMDAjRG9jayBlcXVpcG1lbnQjMjQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDEuMDAjRG9jayBsZXZlbGVycyMyNC4xMC4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xOC4wMi4wMCNEb2NrIHNlYWxzIzI0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE4LjAzLjAwI0RvY2sgcmFtcHMjMjQuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDQuMDAjU3RyaXAgZG9vcnMjMjQuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDUuMDAjRG9jayBidW1wZXJzIzI0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE4LjA2LjAwI0RvY2sgbGFkZGVycyMyNC4xMC4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xOC4wNy4wMCNEb2NrIHBsYXRlcyMyNC4xMC4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMC4xOC4wOC4wMCNXaGVlbCBjaG9ja3MjMjQuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTguMDkuMDAjRG9jayByYWlscyBhbmQgYWNjZXNzb3JpZXMjMjQuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTkuMDAuMDAjRHJ1bSBoYW5kbGluZyBlcXVpcG1lbnQjMjQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTkuMDEuMDAjRHJ1bSBvcGVuZXJzIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE5LjAyLjAwI0RydW0gZ3JhYnMjMjQuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMTkuMDMuMDAjRHJ1bSBsaWZ0ZXJzIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE5LjA0LjAwI0RydW0gY3JhZGxlcyMyNC4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNC4xMC4xOS4wNS4wMCNTcGlsbCBkZWNrIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE5LjA2LjAwI0RydW0gcmVjdXBlcmF0b3JzIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjE5LjA3LjAwI1NwaWxsIGNvbnRhaW5tZW50IHN1cHBvcnRzIzI0LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI0LjEwLjIwLjAwLjAwI1NoZWx2aW5nIGFuZCBzdG9yYWdlIzI0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIwLjAxLjAwI1JhY2sgc3lzdGVtcyBmb3IgcmFjayBtb3VudCBlbGVjdHJvbmljIGVxdWlwbWVudCMyNC4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMC4wMi4wMCNCaW4gaGFuZGxlcnMjMjQuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjAuMDMuMDAjUGFsbGV0cyMyNC4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMC4wNC4wMCNTdG9yYWdlIHJhY2tzIG9yIHNoZWx2ZXMjMjQuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjAuMDUuMDAjQXV0b21hdGVkIHN0b3JhZ2Ugb3IgcmV0cmlldmFsIHN5c3RlbXMjMjQuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjAuMDYuMDAjV29yayBiZW5jaGVzIzI0LjEwLjIwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIwLjA3LjAwI1JlZWwgc3RvcmFnZSBzaGVsdmVzIzI0LjEwLjIwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIwLjA4LjAwI1BvcnRhYmxlIHJlZWwgaG9sZGVycyMyNC4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wMC4wMCNXYXJlaG91c2luZyBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzI0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIxLjAxLjAwI0NhcmdvIGhhbmRsaW5nIGVxdWlwbWVudCMyNC4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wMi4wMCNXYXJlaG91c2UgY2Fyb3VzZWxzIzI0LjEwLjIxLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIxLjAzLjAwI1dhcmVob3VzZSBjYXNlcnMjMjQuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjEuMDQuMDAjRGVwYWxsZXRpemVycyMyNC4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wNS4wMCNQYWxsZXRpemVycyMyNC4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wNi4wMCNJbmR1c3RyaWFsIHNocmluayB3cmFwIGVxdWlwbWVudCMyNC4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMS4wNy4wMCNDYXJ0b25pbmcgbWFjaGluZXJ5IzI0LjEwLjIxLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIxLjA4LjAwI1BhY2thZ2luZyBjb21wYWN0b3JzIzI0LjEwLjIxLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIyLjAwLjAwI1BhY2tpbmcgdG9vbHMjMjQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjIuMDEuMDAjU3RyZXRjaCBmaWxtIGRpc3BlbnNlcnMjMjQuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjIuMDIuMDAjQm94IHNlYWxpbmcgdGFwZSBkaXNwZW5zZXJzIzI0LjEwLjIyLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIyLjAzLjAwI0JhZyBzZWFsaW5nIHRvb2xzIGFuZCBlcXVpcG1lbnQjMjQuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTAuMjIuMDQuMDAjU3RyYXBwaW5nIGRpc3BlbnNlciMyNC4xMC4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMC4yMi4wNS4wMCNTdHJhcHBpbmcgdGVuc2lvbmVycyBvciBzZWFsZXJzIzI0LjEwLjIyLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIyLjA2LjAwI0NhcnRvbiBmb3JtaW5nIG1hY2hpbmVzIzI0LjEwLjIyLjAwLjAwCi11bnNwc2M3IzI0LjEwLjIyLjA3LjAwI1RhcGluZyBtYWNoaW5lcyMyNC4xMC4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMS4wMC4wMC4wMCNDb250YWluZXJzIGFuZCBzdG9yYWdlIzI0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI0LjExLjE1LjAwLjAwI0JhZ3MjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTUuMDEuMDAjQ2FudmFzIGJhZ3MjMjQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTUuMDIuMDAjUGFwZXIgYmFncyMyNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4xNS4wMy4wMCNQbGFzdGljIGJhZ3MjMjQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTUuMDQuMDAjUG91Y2hlcyMyNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4xNS4wNS4wMCNGbGV4aWJsZSBpbnRlcm1lZGlhdGUgYnVsayBjb250YWluZXJzIzI0LjExLjE1LjAwLjAwCi11bnNwc2M3IzI0LjExLjE1LjA2LjAwI0xhdW5kcnkgbmV0cyBvciBiYWdzIzI0LjExLjE1LjAwLjAwCi11bnNwc2M3IzI0LjExLjE1LjA3LjAwI1Rvb2wgYmFncyMyNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4xNS4wOC4wMCNUZW50IGJhZyMyNC4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4xNi4wMC4wMCNDb3ZlcnMgYW5kIGNhcHMjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTguMDAuMDAjVGFua3MgYW5kIGN5bGluZGVycyBhbmQgdGhlaXIgYWNjZXNzb3JpZXMjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTguMDEuMDAjUmVzZXJ2b2lycyMyNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMS4xOC4wMi4wMCNBaXIgb3IgZ2FzIHRhbmtzIG9yIGN5bGluZGVycyMyNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMS4xOC4wMy4wMCNTdG9yYWdlIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjA0LjAwI0NhbGlicmF0aW5nIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjA1LjAwI0NoZW1pY2FsIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjA2LjAwI0RpcCB0YW5rcyMyNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMS4xOC4wNy4wMCNFeHBhbnNpb24gdGFua3MjMjQuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTguMDguMDAjRnVlbCBzdG9yYWdlIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjA5LjAwI1Byb2Nlc3NpbmcgdGFua3MjMjQuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTEuMTguMTAuMDAjV2F0ZXIgc3RvcmFnZSB0YW5rcyMyNC4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMS4xOC4xMS4wMCNDYXJib3lzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjEyLjAwI0NvbnRhaW5tZW50IGJhc2luIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjE4LjEzLjAwI1JpbnNlIHRhbmtzIzI0LjExLjE4LjAwLjAwCi11bnNwc2M3IzI0LjExLjIwLjAwLjAwI0JpbnMgYW5kIGJhc2tldHMjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjAuMDEuMDAjQmlucyMyNC4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMC4wMi4wMCNCYXNrZXRzIzI0LjExLjIwLjAwLjAwCi11bnNwc2M3IzI0LjExLjIwLjAzLjAwI05vbiBtZXRhbGxpYyBiaW5zIzI0LjExLjIwLjAwLjAwCi11bnNwc2M3IzI0LjExLjIwLjA0LjAwI01ldGFsbGljIGJpbnMjMjQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjAuMDUuMDAjTWV0YWxsaWMgYmFza2V0cyMyNC4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMC4wNi4wMCNOb24gbWV0YWxsaWMgYmFza2V0cyMyNC4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wMC4wMCNDYXNrcyBhbmQgYmFycmVscyBhbmQgZHJ1bXMjMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMDEuMDAjQ2Fza3MjMjQuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMDIuMDAjQmFycmVscyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wMy4wMCNTdGFpbmxlc3Mgc3RlZWwgZHJ1bXMjMjQuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMDQuMDAjU3RlZWwgZHJ1bXMjMjQuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMDUuMDAjUG9seWV0aHlsZW5lIGRydW1zIzI0LjExLjIxLjAwLjAwCi11bnNwc2M3IzI0LjExLjIxLjA2LjAwI0NvbXBvc2l0ZSBkcnVtcyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wNy4wMCNGaWJlciBkcnVtcyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wOC4wMCNNZXRhbGxpYyBkcnVtcyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4wOS4wMCNOb24gbWV0YWxsaWMgZHJ1bXMjMjQuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjEuMTAuMDAjSW50ZXJtZWRpYXRlIGJ1bGsgY29udGFpbmVycyMyNC4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMS4xMS4wMCNTdGFiaWxpemVyIzI0LjExLjIxLjAwLjAwCi11bnNwc2M3IzI0LjExLjIxLjEyLjAwI0RydW0gbGlkIzI0LjExLjIxLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjAwLjAwI0NhbnMgYW5kIHBhaWxzIzI0LjExLjAwLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjAxLjAwI1N0ZWVsIHBhaWxzIzI0LjExLjIyLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjAyLjAwI0dhc29saW5lIGNhbnMjMjQuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjIuMDMuMDAjUGxhc3RpYyBwYWlscyMyNC4xMS4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMi4wNC4wMCNNZXRhbGxpYyBwYWlscyMyNC4xMS4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMS4yMi4wNS4wMCNOb24gbWV0YWxsaWMgcGFpbHMjMjQuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjIuMDYuMDAjTWV0YWxsaWMgZmxhbW1hYmxlIGxpcXVpZCBjYW5zIzI0LjExLjIyLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjA3LjAwI05vbiBtZXRhbGxpYyBmbGFtbWFibGUgbGlxdWlkIGNhbnMjMjQuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjIuMDguMDAjU3ByYXkga2l0IzI0LjExLjIyLjAwLjAwCi11bnNwc2M3IzI0LjExLjIyLjA5LjAwI0plcnJ5Y2FucyMyNC4xMS4yMi4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNC4wMC4wMCNTdG9yYWdlIGNoZXN0cyBhbmQgY2FiaW5ldHMgYW5kIHRydW5rcyMyNC4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNC4wMS4wMCNUb29sIGNoZXN0cyBvciBib3hlcyBvciBjYWJpbmV0cyMyNC4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNC4wMi4wMCNIYXphcmRvdXMgbWF0ZXJpYWxzIGNhYmluZXRzIzI0LjExLjI0LjAwLjAwCi11bnNwc2M3IzI0LjExLjI0LjAzLjAwI1Rvb2wgYmVsdHMjMjQuMTEuMjQuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjQuMDQuMDAjQm94IzI0LjExLjI0LjAwLjAwCi11bnNwc2M3IzI0LjExLjI0LjA1LjAwI0RyYXdlcnMjMjQuMTEuMjQuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjQuMDYuMDAjQm94IG9yIHNoZWxmIHBhcnRpdGlvbnMjMjQuMTEuMjQuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjQuMDcuMDAjTWFpbCBib3hlcyMyNC4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNC4wOC4wMCNBbnRpc3RhdGljIGJveGVzIzI0LjExLjI0LjAwLjAwCi11bnNwc2M3IzI0LjExLjI0LjA5LjAwI0JveCBsaWRzIzI0LjExLjI0LjAwLjAwCi11bnNwc2M3IzI0LjExLjI1LjAwLjAwI0NvcnJ1Z2F0ZWQgYW5kIG90aGVyIGJveGVzIGZvciBkaXN0cmlidXRpb24jMjQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjUuMDEuMDAjU2xvdHRlZCBjb3JydWdhdGVkIGNhcnRvbnMjMjQuMTEuMjUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjUuMDIuMDAjT25lIHBpZWNlIGRpZSBjdXQgc2hpcHBpbmcgY2FydG9ucyMyNC4xMS4yNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNS4wMy4wMCNEaWUgY3V0IGNvcnJ1Z2F0ZWQgc2hpcHBpbmcgY2FydG9ucyB3aXRoIHNlcGFyYXRlIGxpZHMjMjQuMTEuMjUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjUuMDQuMDAjTW9sZGVkIGJveGVzIzI0LjExLjI1LjAwLjAwCi11bnNwc2M3IzI0LjExLjI1LjA1LjAwI1JpZ2lkIGJveGVzIzI0LjExLjI1LjAwLjAwCi11bnNwc2M3IzI0LjExLjI1LjA2LjAwI0ZsZXhpYmxlIGludGVybWVkaWF0ZSBidWxrIGNvbnRhaW5lcnMjMjQuMTEuMjUuMDAuMDAKLXVuc3BzYzcjMjQuMTEuMjUuMDcuMDAjSW50ZXJtZWRpYXRlIGJ1bGsgY29udGFpbmVycyMyNC4xMS4yNS4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNi4wMC4wMCNMaXF1aWQgY29udGFpbmVycyMyNC4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMS4yNi4wMS4wMCNKdWdzIzI0LjExLjI2LjAwLjAwCi11bnNwc2M3IzI0LjExLjI2LjAyLjAwI0phcnMjMjQuMTEuMjYuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMDAuMDAuMDAjUGFja2FnaW5nIG1hdGVyaWFscyMyNC4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMi4xNS4wMC4wMCNQYWNrYWdpbmcgYm94ZXMgYW5kIGJhZ3MgYW5kIHBvdWNoZXMjMjQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTUuMDEuMDAjUG9seSBiYWdzIzI0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE1LjAyLjAwI1BhY2thZ2luZyBwb3VjaGVzIG9yIGJhZ3MjMjQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTUuMDMuMDAjUGFja2FnaW5nIGJveGVzIzI0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE1LjA0LjAwI0NhcmRlZCBwYWNrYWdpbmcjMjQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTUuMDUuMDAjVGFycGF1bGlucyMyNC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMi4xNS4wNi4wMCNDb25kdWN0aXZlIGJveGVzIzI0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE1LjA3LjAwI1JpZ2lkIHNldCB1cCBib3hlcyMyNC4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMi4xNS4wOC4wMCNFZ2cgdHJheXMjMjQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTguMDAuMDAjUGFja2FnaW5nIGNhbnMjMjQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMTguMDEuMDAjQWVyb3NvbCBjYW5zIzI0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE4LjAyLjAwI1BhaW50IG9yIHZhcm5pc2ggY2FucyMyNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMi4xOC4wMy4wMCNCZXZlcmFnZSBjYW5zIzI0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE4LjA0LjAwI0Zvb2QgY2FucyMyNC4xMi4xOC4wMC4wMAotdW5zcHNjNyMyNC4xMi4xOC4wNS4wMCNTdGVlbCBjYW5zIzI0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzI0LjEyLjE4LjA2LjAwI0FsdW1pbnVtIGNhbnMjMjQuMTIuMTguMDAuMDAKLXVuc3BzYzcjMjQuMTIuMjAuMDAuMDAjQm90dGxlcyMyNC4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNC4xMi4yMC4wMS4wMCNTcXVlZXplIGJvdHRsZXMjMjQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMjAuMDIuMDAjUGxhc3RpYyBib3R0bGVzIzI0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzI0LjEyLjIwLjAzLjAwI0dsYXNzIGJvdHRsZXMjMjQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjMjQuMTIuMjAuMDQuMDAjQ2FwcyBvciB0b3BzIzI0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzI0LjEyLjIwLjA1LjAwI0FwcGxpY2F0b3IgYm90dGxlcyMyNC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMi4yMC4wNi4wMCNBcHBsaWNhdG9ycyMyNC4xMi4yMC4wMC4wMAotdW5zcHNjNyMyNC4xMy4wMC4wMC4wMCNJbmR1c3RyaWFsIHJlZnJpZ2VyYXRpb24jMjQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTUuMDAuMDAjSW5kdXN0cmlhbCByZWZyaWdlcmF0b3JzIzI0LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEzLjE1LjAxLjAwI0NvbWJpbmVkIHJlZnJpZ2VyYXRvciBmcmVlemVycyMyNC4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNS4wMi4wMCNMaXF1aWQgbml0cm9nZW4gcmVmcmlnZXJhdG9ycyMyNC4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNS4wMy4wMCNXYWxrIGluIHJlZnJpZ2VyYXRvcnMjMjQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTUuMDQuMDAjUmVmcmlnZXJhdGVkIGNvbnRhaW5lcnMjMjQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTUuMDUuMDAjUmVmcmlnZXJhdGVkIHZlc3NlbHMjMjQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTUuMDYuMDAjUmVmcmlnZXJhdGVkIHRhbmtzIzI0LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI0LjEzLjE2LjAwLjAwI0luZHVzdHJpYWwgZnJlZXplcnMjMjQuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTYuMDEuMDAjQ2hlc3QgZnJlZXplcnMjMjQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTYuMDIuMDAjVXByaWdodCBmcmVlemVycyMyNC4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNi4wMy4wMCNMb3cgdGVtcGVyYXR1cmUgZnJlZXplcnMjMjQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTYuMDQuMDAjRnJlZXplIGRyeWluZyBlcXVpcG1lbnQjMjQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTMuMTYuMDUuMDAjV2FsayBpbiBmcmVlemVycyMyNC4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNi4wNi4wMCNQbGF0ZSBmcmVlemVycyMyNC4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMy4xNi4wNy4wMCNCbGFzdCBmcmVlemVycyMyNC4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNC4xMy4xOS4wMC4wMCNJY2UgbWFrZXJzIzI0LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI0LjEzLjE5LjAxLjAwI0ljZSBjdWJlIG1ha2VycyMyNC4xMy4xOS4wMC4wMAotdW5zcHNjNyMyNC4xMy4xOS4wMi4wMCNJY2UgYmxvY2sgbWFrZXJzIzI0LjEzLjE5LjAwLjAwCi11bnNwc2M3IzI0LjE0LjAwLjAwLjAwI1BhY2tpbmcgc3VwcGxpZXMjMjQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTUuMDAuMDAjU2VjdXJpbmcgYW5kIHByb3RlY3Rpbmcgc3VwcGxpZXMjMjQuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTUuMDEuMDAjU3RyZXRjaCB3cmFwIGZpbG1zIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjAyLjAwI1NocmluayB3cmFwIGZpbG1zIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjAzLjAwI1BvbHlldGh5bGVuZSBmaWxtcyMyNC4xNC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNS4wNC4wMCNUYW1wZXIgcHJvb2Ygb3Igc2VjdXJpdHkgc2VhbHMjMjQuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTUuMDUuMDAjUG9seWV0aHlsZW5lIGZpbG1zIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjA2LjAwI1RhcnBhdWxpbnMjMjQuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTUuMDcuMDAjQW50aSBzdGF0aWMgcGFja2FnaW5nIGZpbG1zIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjA4LjAwI0NhcnRvbiBjb3JuZXIgc3VwcG9ydCMyNC4xNC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNS4wOS4wMCNSdWJiZXIgY29yZCMyNC4xNC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNS4xMC4wMCNDYWJsZSBwcm90ZWN0b3JzIzI0LjE0LjE1LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE1LjExLjAwI0xvYWQgYmluZGVycyMyNC4xNC4xNS4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNi4wMC4wMCNDdXNoaW9uaW5nIHN1cHBsaWVzIzI0LjE0LjAwLjAwLjAwCi11bnNwc2M3IzI0LjE0LjE2LjAxLjAwI0J1YmJsZSB3cmFwIzI0LjE0LjE2LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE2LjAyLjAwI1RoZXJtb2Zvcm1pbmcgbWF0ZXJpYWxzIzI0LjE0LjE2LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE2LjAzLjAwI0N1c2hpb25pbmcjMjQuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTYuMDQuMDAjV2FkZGluZyBtYXRlcmlhbHMjMjQuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTYuMDUuMDAjQWlyIGZpbGxlZCBwYWNraW5nIG1hdGVyaWFscyMyNC4xNC4xNi4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNi4wNi4wMCNQYWNraW5nIHBlYW51dHMjMjQuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTYuMDcuMDAjQ2FyZGJvYXJkIGluc2VydHMjMjQuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTYuMDguMDAjUHJvdGVjdGl2ZSBlbmRzIzI0LjE0LjE2LjAwLjAwCi11bnNwc2M3IzI0LjE0LjE3LjAwLjAwI1BhY2thZ2luZyB0dWJlcyBhbmQgY29yZXMgYW5kIGxhYmVscyBhbmQgYWNjZXNzb3JpZXMjMjQuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTcuMDEuMDAjUGFwZXIgdHViZXMgb3IgY29yZXMjMjQuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTcuMDIuMDAjVHViZSBvciBjb3JlIGVuZCBwbHVncyMyNC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNy4wMy4wMCNQYXBlciBwaWVjZXMjMjQuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMjQuMTQuMTcuMDQuMDAjUHJpbnRlZCBpbnNlcnRzIG9yIGluc3RydWN0aW9ucyMyNC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNy4wNS4wMCNDb2xsYXBzaWJsZSB0dWJlcyMyNC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNy4wNi4wMCNTcG9vbCMyNC4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNC4xNC4xNy4wNy4wMCNSZWVsIzI0LjE0LjE3LjAwLjAwCi11bnNwc2M3IzI1LjAwLjAwLjAwLjAwI0NvbW1lcmNpYWwgYW5kIE1pbGl0YXJ5IGFuZCBQcml2YXRlIFZlaGljbGVzIGFuZCB0aGVpciBBY2Nlc3NvcmllcyBhbmQgQ29tcG9uZW50cyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4wMC4wMC4wMCNNb3RvciB2ZWhpY2xlcyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNS4wMC4wMCNQYXNzZW5nZXIgbW90b3IgdmVoaWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTUuMDEuMDAjTWluaWJ1c2VzIzI1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE1LjAyLjAwI0J1c3NlcyMyNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNS4wMy4wMCNBdXRvbW9iaWxlcyBvciBjYXJzIzI1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE1LjA0LjAwI1N0YXRpb24gd2Fnb25zIzI1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE1LjA1LjAwI01pbml2YW5zIG9yIHZhbnMjMjUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTUuMDYuMDAjTGltb3VzaW5lcyMyNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNS4wNy4wMCNMaWdodCB0cnVja3Mgb3Igc3BvcnQgdXRpbGl0eSB2ZWhpY2xlcyMyNS4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNi4wMC4wMCNQcm9kdWN0IGFuZCBtYXRlcmlhbCB0cmFuc3BvcnQgdmVoaWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTYuMDEuMDAjRHVtcCB0cnVja3MjMjUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTYuMDIuMDAjVG93IHRydWNrcyMyNS4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNi4wNC4wMCNEZWxpdmVyeSB0cnVja3MjMjUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTYuMDkuMDAjU2x1ZGdlIG9yIHNld2FnZSBoYW5kbGluZyB0cnVja3MjMjUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTcuMDAuMDAjU2FmZXR5IGFuZCByZXNjdWUgdmVoaWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTcuMDEuMDAjRmlyZSBvciByZXNjdWUgdHJ1Y2tzIzI1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE3LjAyLjAwI1BvbGljZSB2ZWhpY2xlcyMyNS4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMC4xNy4wMy4wMCNBbWJ1bGFuY2VzIzI1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE4LjAwLjAwI01vdG9yaXplZCBjeWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTguMDEuMDAjTW90b3JjeWNsZXMjMjUuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTguMDIuMDAjU2Nvb3RlcnMjMjUuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTguMDMuMDAjTW9wZWRzIzI1LjEwLjE4LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE5LjAwLjAwI1NwZWNpYWxpemVkIGFuZCByZWNyZWF0aW9uYWwgdmVoaWNsZXMjMjUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMTkuMDEuMDAjQWdyaWN1bHR1cmFsIHRyYWN0b3JzIzI1LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE5LjAyLjAwI01vdG9yIGhvbWVzIzI1LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE5LjAzLjAwI1Nub3dtb2JpbGVzIG9yIHNub3cgc2Nvb3RlciMyNS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xOS4wNC4wMCNHb2xmIGNhcnRzIzI1LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEwLjE5LjA1LjAwI0FsbCB0ZXJyYWluIHZlaGljbGVzIHRyYWNrZWQgb3Igd2hlZWxlZCMyNS4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMC4xOS4wNi4wMCNHbyBjYXJ0IzI1LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEwLjIwLjAwLjAwI1dhciB2ZWhpY2xlcyMyNS4xMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMC4wMS4wMCNUYW5rcyMyNS4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMC4wMi4wMCNBcm1vcmVkIGZpZ2h0aW5nIHZlaGljbGVzIzI1LjEwLjIwLjAwLjAwCi11bnNwc2M3IzI1LjEwLjIwLjAzLjAwI1NlbGYgcHJvcGVsbGVkIGFydGlsbGVyeSMyNS4xMC4yMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMS4wMC4wMCNUcnVjayB0cmFjdG9ycyMyNS4xMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMS4wMS4wMCNMb3cgY2FiIGZvcndhcmQgdHJhY3RvcnMjMjUuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMjEuMDIuMDAjTG9uZyBub3NlIHRyYWN0b3JzIHdpdGggc2xlZXBlciMyNS4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4xMC4yMS4wMy4wMCNMb25nIG5vc2UgdHJhY3RvcnMgd2l0aG91dCBzbGVlcGVyIzI1LjEwLjIxLjAwLjAwCi11bnNwc2M3IzI1LjEwLjIxLjA0LjAwI0NhYiBvdmVyIGVuZ2luZSB0cmFjdG9ycyB3aXRoIHNsZWVwZXIjMjUuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTAuMjEuMDUuMDAjQ2FiIG92ZXIgZW5naW5lIHRyYWN0b3JzIHdpdGhvdXQgc2xlZXBlciMyNS4xMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4xMS4wMC4wMC4wMCNNYXJpbmUgdHJhbnNwb3J0IzI1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjAwLjAwI0NvbW1lcmNpYWwgbWFyaW5lIGNyYWZ0IzI1LjExLjAwLjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjAxLjAwI1RyYXdsZXJzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjAyLjAwI0Zpc2hpbmcgYm9hdHMjMjUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTUuMDMuMDAjQ2FyZ28gb3IgY29udGFpbmVyIHNoaXBzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjA0LjAwI0RyZWRnaW5nIGNyYWZ0IzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjA1LjAwI1RhbmtlcnMjMjUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTUuMDYuMDAjVHVnIGJvYXRzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjA3LjAwI0JhcmdlcyMyNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNS4wOC4wMCNQYXNzZW5nZXIgb3IgYXV0b21vYmlsZSBmZXJyaWVzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjA5LjAwI0NydWlzZSBzaGlwcyMyNS4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNS4xMC4wMCNTYWx2YWdlIHNoaXBzIzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjExLjAwI09pbCBvciBnYXMgY3JldyBib2F0IzI1LjExLjE1LjAwLjAwCi11bnNwc2M3IzI1LjExLjE1LjEyLjAwI09pbCBvciBnYXMgd29ya2JvYXQjMjUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTUuMTMuMDAjU2Vpc21pYyB2ZXNzZWwjMjUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTYuMDAuMDAjU2FmZXR5IGFuZCByZXNjdWUgd2F0ZXIgY3JhZnQjMjUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTYuMDEuMDAjTGlmZWJvYXRzIG9yIGxpZmVyYWZ0cyMyNS4xMS4xNi4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNi4wMi4wMCNGaXJlIGZpZ2h0aW5nIHdhdGVyY3JhZnQjMjUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTYuMDMuMDAjUmVzY3VlIHNoaXBzIG9yIGJvYXRzIzI1LjExLjE2LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjAwLjAwI01pbGl0YXJ5IHdhdGVyY3JhZnQjMjUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMDEuMDAjU3VibWFyaW5lcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wMi4wMCNBaXJjcmFmdCBjYXJyaWVycyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wMy4wMCNBbW11bml0aW9uIHNoaXBzIzI1LjExLjE3LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjA0LjAwI0FtcGhpYmlvdXMgYXNzYXVsdCBzaGlwcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wNS4wMCNBbXBoaWJpb3VzIHRyYW5zcG9ydCBkb2NrcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wNi4wMCNBbXBoaWJpb3VzIGNvbW1hbmQgc2hpcHMjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMDcuMDAjQ29tbWFuZCBzaGlwcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wOC4wMCNDcnVpc2VycyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4wOS4wMCNEZXN0cm95ZXJzIzI1LjExLjE3LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjEwLjAwI0RvY2sgbGFuZGluZyBzaGlwcyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xMS4wMCNGYXN0IGNvbWJhdCBzdXBwb3J0IHNoaXBzIzI1LjExLjE3LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjEyLjAwI0ZyaWdhdGVzIzI1LjExLjE3LjAwLjAwCi11bnNwc2M3IzI1LjExLjE3LjEzLjAwI0ZsZWV0IG9pbGVycyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xNC4wMCNVdGlsaXR5IGxhbmRpbmcgd2F0ZXJjcmFmdCMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xNS4wMCNNZWNoYW5pemVkIG9yIHV0aWxpdHkgd2F0ZXJjcmFmdCMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xNi4wMCNNaW5lIGh1bnRpbmcgc2hpcHMjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMTcuMDAjTWluZSBjb3VudGVybWVhc3VyZXMgc2hpcHMjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMTguMDAjQ29hc3RhbCBwYXRyb2wgd2F0ZXJjcmFmdCMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4xOS4wMCNTdWJtYXJpbmUgdGVuZGVycyMyNS4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMS4xNy4yMC4wMCNUYW5rIGxhbmRpbmcgc2hpcHMjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTcuMjEuMDAjQWlyIGN1c2hpb25lZCBsYW5kaW5nIHdhdGVyY3JhZnQjMjUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTguMDAuMDAjUmVjcmVhdGlvbmFsIHdhdGVyY3JhZnQjMjUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTguMDEuMDAjUmVjcmVhdGlvbmFsIHNhaWxib2F0cyMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOC4wMi4wMCNSZWNyZWF0aW9uYWwgbW90b3Jib2F0cyMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOC4wMy4wMCNSZWNyZWF0aW9uYWwgcm93Ym9hdHMjMjUuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjUuMTEuMTguMDQuMDAjQ2Fub2VzIG9yIGtheWFrcyMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOC4wNS4wMCNQZXJzb25hbCBtb3Rvcml6ZWQgd2F0ZXJjcmFmdCMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOC4wNi4wMCNSYWZ0cyMyNS4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wMC4wMCNNYXJpbmUgY3JhZnQgc3lzdGVtcyBhbmQgc3ViYXNzZW1ibGllcyMyNS4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wMS4wMCNNYXJpbmUgY3JhZnQgY29tbXVuaWNhdGlvbnMgc3lzdGVtcyMyNS4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wMi4wMCNNYXJpbmUgcHJvcGVsbGVycyMyNS4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wMy4wMCNTYWlscyMyNS4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMS4xOS4wNC4wMCNQYWRkbGVzIzI1LjExLjE5LjAwLjAwCi11bnNwc2M3IzI1LjExLjE5LjA1LjAwI01hcmluZSBiYWxsYXN0IHN5c3RlbXMjMjUuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMDAuMDAuMDAjUmFpbHdheSBhbmQgdHJhbXdheSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNS4wMC4wMCNMb2NvbW90aXZlcyBhbmQgZWxlY3RyaWMgdHJvbGxleXMjMjUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTUuMDEuMDAjRGllc2VsIGZyZWlnaHQgbG9jb21vdGl2ZXMjMjUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTUuMDIuMDAjRWxlY3RyaWMgZnJlaWdodCBsb2NvbW90aXZlcyMyNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNS4wMy4wMCNEaWVzZWwgcGFzc2VuZ2VyIGxvY29tb3RpdmVzIzI1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEyLjE1LjA0LjAwI0VsZWN0cmljIHBhc3NlbmdlciBsb2NvbW90aXZlcyMyNS4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNi4wMC4wMCNSYWlsd2F5IGFuZCB0cmFtd2F5IGNhcnMjMjUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTYuMDEuMDAjRnJlaWdodCByYWlsIGNhcnMjMjUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTYuMDIuMDAjVGFua2VyIHJhaWwgY2FycyMyNS4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNi4wMy4wMCNQYXNzZW5nZXIgcmFpbCBjYXJzIzI1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI1LjEyLjE2LjA0LjAwI0hvcHBlciByYWlsIGNhcnMjMjUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTYuMDUuMDAjU3RyZWV0Y2FycyBvciB0cmFtd2F5IGNhcnMjMjUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTcuMDAuMDAjUmFpbHJvYWQgc3VwcG9ydCBlcXVpcG1lbnQgYW5kIHN5c3RlbXMjMjUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTIuMTcuMDEuMDAjUmFpbCBzd2l0Y2hpbmcgc3lzdGVtcyMyNS4xMi4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMi4xNy4wMi4wMCNSYWlsd2F5IHNsZWVwZXJzIzI1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEyLjE3LjAzLjAwI1JhaWx3YXkgdHJhY2tzIzI1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEyLjE3LjA0LjAwI1JhaWx3YXkgZnJvZ3Mgb3IgZmlzaCBwbGF0ZXMjMjUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMDAuMDAuMDAjQWlyY3JhZnQjMjUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTUuMDAuMDAjUG93ZXJlZCBmaXhlZCB3aW5nIGFpcmNyYWZ0IzI1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjE1LjAxLjAwI0ZpeGVkIHdpbmcgYWdyaWN1bHR1cmFsIGFpcmNyYWZ0IzI1LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE1LjAyLjAwI0NhcmdvIHByb3BlbGxlciBhaXJjcmFmdCMyNS4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNS4wMy4wMCNTZWFwbGFuZXMjMjUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTUuMDQuMDAjQ29tbWVyY2lhbCBwYXNzZW5nZXIgcHJvcGVsbGVyIGFpcmNyYWZ0IzI1LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE1LjA1LjAwI0NhcmdvIGpldCBhaXJjcmFmdCMyNS4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNS4wNi4wMCNDb21tZXJjaWFsIHBhc3NlbmdlciBqZXQgYWlyY3JhZnQjMjUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTUuMDcuMDAjUHJpdmF0ZSBvciBidXNpbmVzcyBwcm9wZWxsZXIgYWlyY3JhZnQjMjUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTUuMDguMDAjUHJpdmF0ZSBvciBidXNpbmVzcyBqZXQgYWlyY3JhZnQjMjUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTYuMDAuMDAjQ2l2aWxpYW4gYW5kIGNvbW1lcmNpYWwgcm90YXJ5IHdpbmcgYWlyY3JhZnQjMjUuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTYuMDEuMDAjUGFzc2VuZ2VyIHRyYW5zcG9ydCBoZWxpY29wdGVycyMyNS4xMy4xNi4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNi4wMi4wMCNDYXJnbyB0cmFuc3BvcnQgaGVsaWNvcHRlcnMjMjUuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTYuMDMuMDAjQWdyaWN1bHR1cmFsIGhlbGljb3B0ZXJzIzI1LjEzLjE2LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE2LjA0LjAwI01lZGljYWwgb3IgcmVzY3VlIGhlbGljb3B0ZXJzIzI1LjEzLjE2LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjAwLjAwI01pbGl0YXJ5IGZpeGVkIHdpbmcgYWlyY3JhZnQjMjUuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTcuMDEuMDAjQm9tYmVyIGFpcmNyYWZ0IzI1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjAyLjAwI0ZpZ2h0ZXIgYm9tYmVyIGFpcmNyYWZ0IzI1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjAzLjAwI0ZpZ2h0ZXIgYWlyY3JhZnQjMjUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTcuMDQuMDAjQXR0YWNrIGFpcmNyYWZ0IzI1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjA1LjAwI1RhcmdldCBvciByZWNvbm5haXNzYW5jZSBkcm9uZXMjMjUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTcuMDYuMDAjTWlsaXRhcnkgc2VhcGxhbmVzIzI1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE3LjA3LjAwI1JlY29ubmFpc3NhbmNlIG9yIHN1cnZlaWxsYW5jZSBhaXJjcmFmdCMyNS4xMy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNy4wOC4wMCNBbnRpIHN1Ym1hcmluZSBhaXJjcmFmdCMyNS4xMy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xMy4xNy4wOS4wMCNNaWxpdGFyeSB0cmFuc3BvcnQgYWlyY3JhZnQjMjUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTguMDAuMDAjU3BlY2lhbHR5IGFpcmNyYWZ0IzI1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjE4LjAxLjAwI0FpcnNoaXBzIzI1LjEzLjE4LjAwLjAwCi11bnNwc2M3IzI1LjEzLjE5LjAwLjAwI01pbGl0YXJ5IHJvdGFyeSB3aW5nIGFpcmNyYWZ0IzI1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjE5LjAyLjAwI01pbGl0YXJ5IHRyYW5zcG9ydCBoZWxpY29wdGVycyMyNS4xMy4xOS4wMC4wMAotdW5zcHNjNyMyNS4xMy4xOS4wMy4wMCNBdHRhY2sgaGVsaWNvcHRlcnMjMjUuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTkuMDQuMDAjUmVjb25uYWlzc2FuY2UgaGVsaWNvcHRlcnMjMjUuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTkuMDUuMDAjQW50aSBzdWJtYXJpbmUgaGVsaWNvcHRlcnMjMjUuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMTkuMDYuMDAjVGlsdCByb3RvciB3aW5nIGFpcmNyYWZ0IzI1LjEzLjE5LjAwLjAwCi11bnNwc2M3IzI1LjEzLjIwLjAwLjAwI1JlY3JlYXRpb25hbCBhaXJjcmFmdCMyNS4xMy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xMy4yMC4wMS4wMCNIYW5nIGdsaWRlcnMjMjUuMTMuMjAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMjAuMDIuMDAjSG90IGFpciBiYWxsb29ucyMyNS4xMy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xMy4yMC4wMy4wMCNHbGlkZXJzIzI1LjEzLjIwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjIwLjA0LjAwI1BhcmFnbGlkZXJzIzI1LjEzLjIwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjIwLjA1LjAwI1VsdHJhIGxpZ2h0IGFpcmNyYWZ0IzI1LjEzLjIwLjAwLjAwCi11bnNwc2M3IzI1LjEzLjIxLjAwLjAwI0FpcmNyYWZ0IG1hbmFnZW1lbnQgc2VydmljZXMjMjUuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTMuMjEuMDEuMDAjQWlyY3JhZnQgcGlsb3RzIzI1LjEzLjIxLjAwLjAwCi11bnNwc2M3IzI1LjEzLjIxLjAyLjAwI0FpcmNyYWZ0IG1haW50ZW5hbmNlIG9yIHNlcnZpY2VzIzI1LjEzLjIxLjAwLjAwCi11bnNwc2M3IzI1LjE1LjAwLjAwLjAwI1NwYWNlY3JhZnQjMjUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTUuMDAuMDAjU3BhY2VzaGlwcyMyNS4xNS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNS4xNS4wMS4wMCNNYW5uZWQgc3BhY2VjcmFmdCMyNS4xNS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNS4xNS4wMi4wMCNTcGFjZWNyYWZ0IHN0cnVjdHVyZXMjMjUuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDAuMDAjU2F0ZWxsaXRlcyMyNS4xNS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNS4xNy4wMS4wMCNDb21tdW5pY2F0aW9uIHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDIuMDAjV2VhdGhlciBzYXRlbGxpdGVzIzI1LjE1LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE1LjE3LjAzLjAwI01pbGl0YXJ5IHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDQuMDAjU2NpZW50aWZpYyBvciByZXNlYXJjaCBzYXRlbGxpdGVzIzI1LjE1LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE1LjE3LjA1LjAwI05hdmlnYXRpb24gc2F0ZWxsaXRlcyMyNS4xNS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNS4xNy4wNi4wMCNHZW9zdGF0aW9uYXJ5IHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDcuMDAjTG93IGVhcnRoIG9yYml0IHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDguMDAjU3VuIHN5bmNocm9ub3VzIG9yYml0IHNhdGVsbGl0ZXMjMjUuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTUuMTcuMDkuMDAjR2Vvc3luY2hyb25vdXMgc2F0ZWxsaXRlcyMyNS4xNS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNi4wMC4wMC4wMCNOb24gbW90b3JpemVkIGN5Y2xlcyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNi4xNS4wMC4wMCNQZWRhbCBwb3dlcmVkIHZlaGljbGVzIzI1LjE2LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE2LjE1LjAxLjAwI1RvdXJpbmcgYmljeWNsZXMjMjUuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTYuMTUuMDIuMDAjVW5pY3ljbGVzIzI1LjE2LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE2LjE1LjAzLjAwI1RyaWN5Y2xlcyMyNS4xNi4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNi4xNS4wNC4wMCNUYW5kZW0gYmljeWNsZXMjMjUuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTYuMTUuMDUuMDAjTW91bnRhaW4gYmljeWNsZXMjMjUuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTYuMTUuMDYuMDAjUmFjaW5nIGJpY3ljbGVzIzI1LjE2LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE2LjE1LjA3LjAwI0JpY3ljbGVzIzI1LjE2LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE2LjE1LjA4LjAwI1JlY3VtYmVudCBiaWN5Y2xlcyMyNS4xNi4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNi4xNS4wOS4wMCNDaGlsZHJlbnMgYmljeWNsZXMjMjUuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMDAuMDAuMDAjVHJhbnNwb3J0YXRpb24gY29tcG9uZW50cyBhbmQgc3lzdGVtcyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNS4wMC4wMCNXaW5kc2hpZWxkIHdpcGVycyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNS4wMS4wMCNBaXJjcmFmdCB3aW5kc2hpZWxkIHdpcGVycyMyNS4xNy4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNS4wMi4wMCNBdXRvbW90aXZlIHdpbmRzaGllbGQgd2lwZXJzIzI1LjE3LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE1LjAzLjAwI0xvY29tb3RpdmUgd2luZHNoaWVsZCB3aXBlcnMjMjUuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTUuMDQuMDAjTWFyaW5lIHdpbmRzaGllbGQgd2lwZXJzIzI1LjE3LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE1LjA1LjAwI1RydWNrIHdpbmRzaGllbGQgd2lwZXJzIzI1LjE3LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE1LjA2LjAwI1dpbmRzaGllbGQgd2lwZXIgcHVtcCMyNS4xNy4xNS4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNi4wMC4wMCNEZWZyb3N0aW5nIGFuZCBkZWZvZ2dpbmcgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNi4wMS4wMCNBaXJjcmFmdCBvbmJvYXJkIGRlZnJvc3Rpbmcgb3IgZGVmb2dnaW5nIHN5c3RlbXMjMjUuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTYuMDIuMDAjQXV0b21vdGl2ZSBkZWZyb3N0aW5nIG9yIGRlZm9nZ2luZyBzeXN0ZW1zIzI1LjE3LjE2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE2LjAzLjAwI1RyYWluIGRlZnJvc3Rpbmcgb3IgZGVmb2dnaW5nIHN5c3RlbXMjMjUuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMDAuMDAjQnJha2luZyBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjAxLjAwI0FpcmNyYWZ0IGJyYWtpbmcgc3lzdGVtcyMyNS4xNy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNy4wMi4wMCNBdXRvbW90aXZlIGJyYWtpbmcgc3lzdGVtcyMyNS4xNy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNy4wMy4wMCNUcmFpbiBicmFraW5nIHN5c3RlbXMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMDQuMDAjRHJhZyBjaHV0ZXMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMDUuMDAjUm90b3JzIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjA2LjAwI0JyYWtlIGNhbGlwZXJzIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjA3LjAwI0RydW0gYnJha2UjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMDguMDAjRGlzYyBicmFrZSMyNS4xNy4xNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4xNy4wOS4wMCNMaXF1aWQgY29vbGVkIGJyYWtlIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjEwLjAwI01hc3RlciBjeWxpbmRhcnMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMTEuMDAjU2xhdmUgY3lsaW5kZXJzIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjEyLjAwI0RydW0gYnJha2Ugc2hvZXMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMTMuMDAjRGlzYyBicmFrZSBwYWRzIzI1LjE3LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE3LjE0LjAwI0JyYWtlIGRydW0jMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMTUuMDAjRGlzYyBicmFrZSByb3RvcnMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTcuMTYuMDAjQnJha2UgbGluZXMjMjUuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTkuMDAuMDAjV2hlZWxzIGFuZCB3aGVlbCB0cmltcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4xOS4wMS4wMCNBdXRvbW9iaWxlIHJpbXMgb3Igd2hlZWxzIzI1LjE3LjE5LjAwLjAwCi11bnNwc2M3IzI1LjE3LjE5LjAyLjAwI1RyYWluIHdoZWVscyMyNS4xNy4xOS4wMC4wMAotdW5zcHNjNyMyNS4xNy4xOS4wMy4wMCNUcnVjayByaW1zIG9yIHdoZWVscyMyNS4xNy4xOS4wMC4wMAotdW5zcHNjNyMyNS4xNy4xOS4wNC4wMCNBaXJjcmFmdCB3aGVlbHMjMjUuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMTkuMDUuMDAjVGlyZSB2YWx2ZXMjMjUuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjAuMDAuMDAjU3VzcGVuc2lvbiBzeXN0ZW0gY29tcG9uZW50cyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wMS4wMCNBdXRvbW9iaWxlIHN1c3BlbnNpb24gc3lzdGVtcyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wMi4wMCNUcnVjayBzdXNwZW5zaW9uIHN5c3RlbXMjMjUuMTcuMjAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjAuMDMuMDAjVHJ1Y2sgc2hvY2sgYWJzb3JiZXJzIzI1LjE3LjIwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIwLjA0LjAwI0F1dG9tb2JpbGUgc2hvY2sgYWJzb3JiZXJzIzI1LjE3LjIwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIwLjA1LjAwI1RyYWluIHN1c3BlbnNpb24gc3lzdGVtcyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wNi4wMCNTdGVlcmluZyBzeXN0ZW1zIzI1LjE3LjIwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIwLjA3LjAwI1N0cnV0cyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wOC4wMCNCYWxsIGpvaW50cyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4wOS4wMCNBdXRvbW90aXZlIGJ1c2hpbmdzIzI1LjE3LjIwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIwLjEwLjAwI1N3YXkgYmFycyMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMC4xMS4wMCNTaG9jayBhYnNvcmJlciMyNS4xNy4yMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMS4wMC4wMCNWZWhpY2xlIHNhZmV0eSBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIxLjAxLjAwI0FpcmJhZ3MjMjUuMTcuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjEuMDIuMDAjQWlyY3JhZnQgbGFwYmVsdHMjMjUuMTcuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjEuMDMuMDAjQWlyY3JhZnQgaGFybmVzcyByZXN0cmFpbnRzIzI1LjE3LjIxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIxLjA0LjAwI1NlYXRiZWx0cyMyNS4xNy4yMS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMS4wNS4wMCNDb2xsaXNpb24gYXZvaWRhbmNlIHN5c3RlbXMjMjUuMTcuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjEuMDYuMDAjSW1wYWN0IHNlbnNpbmcgc3lzdGVtcyMyNS4xNy4yMS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMS4wNy4wMCNBdXRvbW90aXZlIHNlYXRiZWx0cyMyNS4xNy4yMS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMS4wOC4wMCNIZWFkIHJlc3RyYWludHMjMjUuMTcuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjIuMDAuMDAjVmVoaWNsZSBkb29ycyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMi4wMS4wMCNSZW1vdmFibGUgYXV0b21vdGl2ZSBkb29ycyMyNS4xNy4yMi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMi4wMi4wMCNBaXJjcmFmdCBkb29ycyMyNS4xNy4yMi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMi4wMy4wMCNBdXRvbW90aXZlIGRvb3JzIzI1LjE3LjIyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIyLjA0LjAwI1JvbGwgdXAgdHJ1Y2sgZG9vcnMjMjUuMTcuMjIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjIuMDUuMDAjVGFpbGdhdGVzIG9yIGxpZnRnYXRlcyMyNS4xNy4yMi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMy4wMC4wMCNWZWhpY2xlIHdpbmRvd3MgYW5kIHdpbmRzaGllbGRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjIzLjAxLjAwI0F1dG9tb3RpdmUgd2luZHNoaWVsZHMjMjUuMTcuMjMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjMuMDIuMDAjQWlyY3JhZnQgd2luZG93cyMyNS4xNy4yMy4wMC4wMAotdW5zcHNjNyMyNS4xNy4yMy4wMy4wMCNBdXRvbW90aXZlIHdpbmRvd3MjMjUuMTcuMjMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjMuMDQuMDAjQWlyY3JhZnQgd2luZHNoaWVsZHMjMjUuMTcuMjMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjQuMDAuMDAjRnVlbCB0YW5rcyBhbmQgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNC4wMS4wMCNBaXJjcmFmdCBpbnRlcm5hbCBmdWVsIHRhbmtzIzI1LjE3LjI0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI0LjAyLjAwI0FpcmNyYWZ0IGZ1ZWwgZHJvcCB0YW5rcyMyNS4xNy4yNC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNC4wMy4wMCNBaXJjcmFmdCBwcm9wZWxsZW50IHRhbmtzIzI1LjE3LjI0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI0LjA0LjAwI0h5YnJpZCBmdWVsIHN0b3JhZ2Ugc3lzdGVtcyMyNS4xNy4yNC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNC4wNS4wMCNGdWVsIGluamVjdGlvbiBzeXN0ZW1zIzI1LjE3LjI0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI0LjA2LjAwI0Z1ZWwgdGFua3MjMjUuMTcuMjQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjQuMDcuMDAjQnJlYXRoZXIgZWxlbWVudHMjMjUuMTcuMjQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjQuMDguMDAjRnVlbCBvciBvaWwgY2FwcyMyNS4xNy4yNC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNS4wMC4wMCNUaXJlcyBhbmQgdGlyZSB0dWJlcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNS4wMS4wMCNBaXJjcmFmdCB0aXJlcyMyNS4xNy4yNS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNS4wMi4wMCNBdXRvbW9iaWxlIHRpcmUgdHViZXMjMjUuMTcuMjUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjUuMDMuMDAjSGVhdnkgdHJ1Y2sgdGlyZXMjMjUuMTcuMjUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjUuMDQuMDAjQXV0b21vYmlsZSBvciBsaWdodCB0cnVjayB0aXJlcyMyNS4xNy4yNS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNS4wNS4wMCNCaWN5Y2xlIHR1YmVzIzI1LjE3LjI1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI1LjA2LjAwI0JpY3ljbGUgdGlyZXMjMjUuMTcuMjUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjUuMDcuMDAjVGlyZSBjb3JkIzI1LjE3LjI1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI1LjA4LjAwI1RpcmUgdHJlYWRzIzI1LjE3LjI1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI2LjAwLjAwI1ZlaGljbGUgdHJpbSBhbmQgZXh0ZXJpb3IgY292ZXJpbmcjMjUuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjYuMDEuMDAjQXV0b21vdGl2ZSB0cmltIzI1LjE3LjI2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI2LjAyLjAwI0F1dG9tb3RpdmUgZmVuZGVycyMyNS4xNy4yNi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNi4wMy4wMCNWZWhpY2xlIGJ1bXBlcnMjMjUuMTcuMjYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjYuMDQuMDAjVmVoaWNsZSBtaXJyb3JzIzI1LjE3LjI2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI2LjA1LjAwI1ZlaGljbGUgZ3JpbGxlcyMyNS4xNy4yNi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNi4wNi4wMCNWZWhpY2xlIGhvb2RzIzI1LjE3LjI2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI2LjA3LjAwI1ZlaGljbGUgc2lkZSBwYW5lbHMjMjUuMTcuMjYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjYuMDguMDAjRmFzY2lhcyMyNS4xNy4yNi4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNy4wMC4wMCNFbnZpcm9ubWVudGFsIGNvbnRyb2wgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNy4wMS4wMCNBaXJjcmFmdCBlbnZpcm9ubWVudGFsIGNvbnRyb2wgc3lzdGVtcyMyNS4xNy4yNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNy4wMi4wMCNTcGFjZSBlbnZpcm9ubWVudGFsIGNvbnRyb2wgc3lzdGVtcyMyNS4xNy4yNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4yNy4wMy4wMCNNYXJpbmUgZW52aXJvbm1lbnRhbCBjb250cm9sIHN5c3RlbXMjMjUuMTcuMjcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjcuMDQuMDAjVmVoaWNsZSBjbGltYXRlIGNvbnRyb2wgc3lzdGVtcyMyNS4xNy4yNy4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOC4wMC4wMCNIeWRyYXVsaWMgc3lzdGVtcyBhbmQgY29tcG9uZW50cyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOC4wMS4wMCNBaXJjcmFmdCBoeWRyYXVsaWMgc3lzdGVtcyMyNS4xNy4yOC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOC4wMi4wMCNBdXRvbW90aXZlIGh5ZHJhdWxpYyBzeXN0ZW1zIzI1LjE3LjI4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjI4LjAzLjAwI01hcmluZSBoeWRyYXVsaWMgc3lzdGVtcyMyNS4xNy4yOC4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOS4wMC4wMCNFeHRlcmlvciB2ZWhpY2xlIGxpZ2h0aW5nIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjI5LjAxLjAwI0V4dGVyaW9yIGF1dG9tb2JpbGUgbGlnaHRpbmcjMjUuMTcuMjkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjkuMDIuMDAjRXh0ZXJpb3IgYWlyY3JhZnQgbGlnaHRpbmcjMjUuMTcuMjkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjkuMDMuMDAjRXh0ZXJpb3IgcmFpbGNhciBsaWdodGluZyMyNS4xNy4yOS4wMC4wMAotdW5zcHNjNyMyNS4xNy4yOS4wNC4wMCNFeHRlcmlvciBzaGlwIG9yIGJvYXQgbGlnaHRpbmcjMjUuMTcuMjkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjkuMDUuMDAjSGVhZGxhbXAgd2lwZXIgb3Igd2FzaGVyIHN5c3RlbXMjMjUuMTcuMjkuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMjkuMDYuMDAjUmVmbGVjdG9ycyMyNS4xNy4yOS4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMC4wMC4wMCNJbnRlcmlvciB2ZWhpY2xlIGxpZ2h0aW5nIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMwLjAxLjAwI0ludGVyaW9yIGF1dG9tb2JpbGUgbGlnaHRpbmcjMjUuMTcuMzAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzAuMDIuMDAjSW50ZXJpb3IgYWlyY3JhZnQgbGlnaHRpbmcjMjUuMTcuMzAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzAuMDMuMDAjSW50ZXJpb3IgcmFpbGNhciBsaWdodGluZyMyNS4xNy4zMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMC4wNC4wMCNJbnRlcmlvciBzaGlwIG9yIGJvYXQgbGlnaHRpbmcjMjUuMTcuMzAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzAuMDUuMDAjTGlnaHQgcGxhdGUgYXNzZW1ibGllcyMyNS4xNy4zMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMS4wMC4wMCNMb2NhdGlvbiBhbmQgbmF2aWdhdGlvbiBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMxLjAxLjAwI0FpcmNyYWZ0IGRpZ2l0YWwgYWx0aXR1ZGUgY29udHJvbCBzeXN0ZW1zIzI1LjE3LjMxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMxLjAyLjAwI0FpcmNyYWZ0IG5hdmlnYXRpb24gYmVhY29ucyMyNS4xNy4zMS4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMS4wMy4wMCNUZXJyYWluIGZvbGxvd2luZyBzeXN0ZW1zIzI1LjE3LjMxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMxLjA0LjAwI0FpcmNyYWZ0IGd1aWRhbmNlIHN5c3RlbXMjMjUuMTcuMzEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzEuMDUuMDAjQWlyY3JhZnQgc3RlZXJpbmcgY29udHJvbHMjMjUuMTcuMzEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzEuMDYuMDAjU3BhY2VjcmFmdCBhdHRpdHVkZSBjb250cm9sIHN5c3RlbXMjMjUuMTcuMzEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzEuMDcuMDAjVmVoaWN1bGFyIGdsb2JhbCBwb3NpdGlvbmluZyBzeXN0ZW1zIzI1LjE3LjMxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMyLjAwLjAwI0NvbW11bmljYXRpb25zIHJlbGF0ZWQgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMi4wMS4wMCNBaXJjcmFmdCBjb21tdW5pY2F0aW9uIHN5c3RlbXMjMjUuMTcuMzIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzIuMDIuMDAjRmxpZ2h0IHJlY29yZGVycyMyNS4xNy4zMi4wMC4wMAotdW5zcHNjNyMyNS4xNy4zMi4wMy4wMCNBaXJjcmFmdCBjb3VudGVybWVhc3VyZXMjMjUuMTcuMzIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzIuMDQuMDAjQWlyY3JhZnQgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHN5c3RlbXMjMjUuMTcuMzIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzIuMDUuMDAjQWlyY3JhZnQgdGVsZW1ldHJ5IHN5c3RlbXMjMjUuMTcuMzIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzIuMDYuMDAjQWlyY3JhZnQgaW50ZXJmYWNlIGVsZWN0cm9uaWNzIzI1LjE3LjMyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMzLjAwLjAwI01hc3RlciBjb250cm9sIHN5c3RlbXMjMjUuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzMuMDEuMDAjRmxpZ2h0IGNvbXB1dGVyIHN5c3RlbXMjMjUuMTcuMzMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzMuMDIuMDAjU3BhY2VjcmFmdCBjb21tYW5kIG1vZHVsZXMjMjUuMTcuMzMuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzMuMDMuMDAjQXV0b21vdGl2ZSBjb21wdXRlciBzeXN0ZW1zIzI1LjE3LjMzLjAwLjAwCi11bnNwc2M3IzI1LjE3LjMzLjA0LjAwI0VsZWN0cm9uaWMgaWduaXRpb24gc3lzdGVtcyMyNS4xNy4zMy4wMC4wMAotdW5zcHNjNyMyNS4xNy4zNC4wMC4wMCNWZWhpY2xlIGVtZXJnZW5jeSBzeXN0ZW1zIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjM0LjAxLjAwI0FpcmNyYWZ0IGZpcmUgY29udHJvbCBvciBleHRpbmd1aXNoaW5nIHN5c3RlbXMjMjUuMTcuMzQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzQuMDIuMDAjQWlyY3JhZnQgZXNjYXBlIG9yIGVqZWN0aW9uIHN5c3RlbXMjMjUuMTcuMzQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzQuMDMuMDAjQWlyY3JhZnQgd2FybmluZyBzeXN0ZW1zIzI1LjE3LjM0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM1LjAwLjAwI1ZlaGljbGUgcG93ZXIgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zNS4wMS4wMCNTcGFjZWNyYWZ0IHNvbGFyIGNlbGxzIzI1LjE3LjM1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM1LjAyLjAwI1NwYWNlY3JhZnQgc29sYXIgYXJyYXlzIzI1LjE3LjM1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM2LjAwLjAwI1ZlaGljbGUgaW5zdHJ1bWVudGF0aW9uIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjM2LjAxLjAwI0FpcmNyYWZ0IGNvY2twaXQgZGlzcGxheXMjMjUuMTcuMzYuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzcuMDAuMDAjRXhoYXVzdCBhbmQgZW1pc3Npb24gY29udHJvbHMjMjUuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzcuMDEuMDAjQ2F0YWx5dGljIGNvbnZlcnRlcnMjMjUuMTcuMzcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzcuMDIuMDAjTXVmZmxlcnMjMjUuMTcuMzcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzcuMDMuMDAjRXhoYXVzdCBtYW5pZm9sZHMjMjUuMTcuMzcuMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDAuMDAjRHJpdmV0cmFpbiBzeXN0ZW1zIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjAxLjAwI0RyaXZpbmcgYXhsZXMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDIuMDAjTm9uIGRyaXZpbmcgYXhsZXMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDMuMDAjQXhsZSBob3VzaW5ncyMyNS4xNy4zOC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zOC4wNC4wMCNBeGxlIHNwaW5kbGVzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjA1LjAwI0RpZmZlcmVudGlhbHMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDYuMDAjQ29uc3RhbnQgdmVsb2NpdHkgam9pbnRzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjA3LjAwI0F4bGUgc2hhZnRzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjA4LjAwI0F4bGUgcmVwYWlyIGtpdHMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMDkuMDAjQXhsZSBodWJzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjEwLjAwI1VuaXZlcnNhbCBqb2ludHMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMTEuMDAjRHJpdmUgc2hhZnRzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjEyLjAwI01hbnVhbCB0cmFuc21pc3Npb25zIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjEzLjAwI0F1dG9tYXRpYyB0cmFuc21pc3Npb25zIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjE0LjAwI1Bvd2VyIHRha2Ugb2ZmcyMyNS4xNy4zOC4wMC4wMAotdW5zcHNjNyMyNS4xNy4zOC4xNS4wMCNDbHV0Y2ggY2FibGVzIzI1LjE3LjM4LjAwLjAwCi11bnNwc2M3IzI1LjE3LjM4LjE2LjAwI0h5ZHJhdWxpYyBjbHV0Y2ggcGFydHMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzguMTcuMDAjRHJpdmV0cmFpbiBjaGFpbnMjMjUuMTcuMzguMDAuMDAKLXVuc3BzYzcjMjUuMTcuMzkuMDAuMDAjRWxlY3RyaWNhbCBjb21wb25lbnRzIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjM5LjAxLjAwI0lnbml0aW9uIzI1LjE3LjM5LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQwLjAwLjAwI0VuZ2luZSBjb29sYW50IHN5c3RlbSMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy40MC4wMS4wMCNGYW4jMjUuMTcuNDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDAuMDIuMDAjVmVoaWNsZSByYWRpYXRvcnMjMjUuMTcuNDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDAuMDMuMDAjUmFkaWF0b3IgY2FwcyMyNS4xNy40MC4wMC4wMAotdW5zcHNjNyMyNS4xNy40MC4wNC4wMCNFbmdpbmUgY29vbGFudCMyNS4xNy40MC4wMC4wMAotdW5zcHNjNyMyNS4xNy40MS4wMC4wMCNSb29mIHN5c3RlbXMjMjUuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDEuMDEuMDAjRW1lcmdlbmN5IHZlaGljbGUgZXhpdHMjMjUuMTcuNDEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDEuMDIuMDAjUGVybWFuZW50IGNvbnZlcnRpYmxlIHJvb2YgdG9wcyMyNS4xNy40MS4wMC4wMAotdW5zcHNjNyMyNS4xNy40MS4wMy4wMCNSZW1vdmFibGUgaGFyZCByb29mIHRvcHMjMjUuMTcuNDEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDEuMDQuMDAjUmVtb3ZhYmxlIHNvZnQgcm9vZiB0b3BzIzI1LjE3LjQxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQxLjA1LjAwI1Jvb2YgcmFjayBzeXN0ZW1zIzI1LjE3LjQxLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQxLjA2LjAwI1N1bnJvb2ZzIG9yIG1vb25yb29mcyMyNS4xNy40MS4wMC4wMAotdW5zcHNjNyMyNS4xNy40MS4wNy4wMCNXaW5kIGRlZmxlY3RvcnMjMjUuMTcuNDEuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDAuMDAjU3RlZXJpbmcgc3lzdGVtIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQyLjAxLjAwI1N0ZWVyaW5nIHNhY2tzIzI1LjE3LjQyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQyLjAyLjAwI1N0ZWVyaW5nIHN1c3BlbnNpb24jMjUuMTcuNDIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDMuMDAjQmFsbCBqb2ludCMyNS4xNy40Mi4wMC4wMAotdW5zcHNjNyMyNS4xNy40Mi4wNC4wMCNQb3dlciBzdGVlcmluZyBzeXN0ZW0jMjUuMTcuNDIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDUuMDAjVGllIFJvZHMjMjUuMTcuNDIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDYuMDAjRHJhZyBsaW5rIzI1LjE3LjQyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQyLjA3LjAwI1N0ZWVyaW5nIGxpbmthZ2UjMjUuMTcuNDIuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDIuMDguMDAjSHVibG9jayMyNS4xNy40Mi4wMC4wMAotdW5zcHNjNyMyNS4xNy40Mi4wOS4wMCNQaW5pb25zIzI1LjE3LjQyLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQyLjEwLjAwI1Bvd2VyIHN0ZWVyaW5nIHR1bmluZyBjYWJsZSMyNS4xNy40Mi4wMC4wMAotdW5zcHNjNyMyNS4xNy40My4wMC4wMCNWZWhpY2xlIGV4aGF1c3Qgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy40My4wMS4wMCNDYXRhbHl0aWMgY29udmVydGVycyMyNS4xNy40My4wMC4wMAotdW5zcHNjNyMyNS4xNy40My4wMi4wMCNNdWZmbGVycyBvciByZXNvbmF0b3JzIzI1LjE3LjQzLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ0LjAwLjAwI1ZlaGljbGUgaW50ZXJpb3Igc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy40NC4wMS4wMCNCZXplbHMjMjUuMTcuNDQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDQuMDIuMDAjQ29uc29sZXMjMjUuMTcuNDQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDQuMDMuMDAjRG9vciBwYW5lbHMjMjUuMTcuNDQuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDQuMDQuMDAjSGVhZGxpbmVycyMyNS4xNy40NC4wMC4wMAotdW5zcHNjNyMyNS4xNy40NC4wNS4wMCNJbnN0cnVtZW50IGNsdXN0ZXJzIzI1LjE3LjQ0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ0LjA2LjAwI0luc3RydW1lbnQgcGFuZWxzIzI1LjE3LjQ0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ0LjA3LjAwI1BlZGFscyMyNS4xNy40NC4wMC4wMAotdW5zcHNjNyMyNS4xNy40NC4wOC4wMCNQb3dlciBwb3J0cyBvciBsaWdodGVycyMyNS4xNy40NC4wMC4wMAotdW5zcHNjNyMyNS4xNy40NC4wOS4wMCNTdW4gdmlzb3JzIzI1LjE3LjQ0LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjAwLjAwI1ZlaGljbGUgc2FmZXR5IGFuZCBzZWN1cml0eSBzeXN0ZW1zIzI1LjE3LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjAxLjAwI0FpciBiYWcgcHJvcGVsbGFudCBjYW5pc3RlcnMjMjUuMTcuNDUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDUuMDIuMDAjQWlyIGJhZ3MjMjUuMTcuNDUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDUuMDMuMDAjVmVoaWNsZSBob3JucyMyNS4xNy40NS4wMC4wMAotdW5zcHNjNyMyNS4xNy40NS4wNC4wMCNSZW1vdGUgbG9ja2luZyBzeXN0ZW0jMjUuMTcuNDUuMDAuMDAKLXVuc3BzYzcjMjUuMTcuNDUuMDUuMDAjVmVoaWNsZSBzdGFiaWxpdHkgY29udHJvbCBzeXN0ZW1zIzI1LjE3LjQ1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjA2LjAwI1ZlaGljbGUgdHJhY3Rpb24gY29udHJvbCBzeXN0ZW1zIzI1LjE3LjQ1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjA3LjAwI1ZlaGljbGUgbmF2aWdhdGlvbiBzeXN0ZW1zIzI1LjE3LjQ1LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ1LjA4LjAwI1doZWVsIGNsYW1wcyMyNS4xNy40NS4wMC4wMAotdW5zcHNjNyMyNS4xNy40Ni4wMC4wMCNWZWhpY2xlIHNlYXRpbmcgc3lzdGVtcyMyNS4xNy4wMC4wMC4wMAotdW5zcHNjNyMyNS4xNy40Ni4wMS4wMCNTZWF0IGNvdmVycyMyNS4xNy40Ni4wMC4wMAotdW5zcHNjNyMyNS4xNy40Ni4wMi4wMCNTZWF0IGN1c2hpb25zIG9yIGJvbHN0ZXJzIzI1LjE3LjQ2LjAwLjAwCi11bnNwc2M3IzI1LjE3LjQ2LjAzLjAwI1NlYXQgZnJhbWVzIzI1LjE3LjQ2LjAwLjAwCi11bnNwc2M3IzI1LjE4LjAwLjAwLjAwI1ZlaGljbGUgYm9kaWVzIGFuZCB0cmFpbGVycyMyNS4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wMC4wMCNBaXJjcmFmdCBmdXNlbGFnZSBhbmQgY29tcG9uZW50cyMyNS4xOC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wMS4wMCNBaXJjcmFmdCBzcG9pbGVycyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wMi4wMCNBaXJjcmFmdCBmaW5zIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE1LjAzLjAwI0FpcmNyYWZ0IGhvcml6b250YWwgc3RhYmlsaXplcnMjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMDQuMDAjQWlyY3JhZnQgY2FuYXJkcyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wNS4wMCNBaXJjcmFmdCBzbGF0cyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wNi4wMCNBaXJjcmFmdCBmbGFwcyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wNy4wMCNBaXJjcmFmdCBydWRkZXJzIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE1LjA4LjAwI0FpcmNyYWZ0IGVsZXZhdG9ycyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4wOS4wMCNBaXJjcmFmdCBhaWxlcm9ucyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4xMC4wMCNBaXJjcmFmdCBwcm9wZWxsZXIjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMTEuMDAjQWlyY3JhZnQgd2luZ3MjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMTIuMDAjQWlyY3JhZnQgZnVzZWxhZ2UjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMTMuMDAjQWlyY3JhZnQgcmFkb21lcyMyNS4xOC4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNS4xNC4wMCNBaXJjcmFmdCByb3RvcnMjMjUuMTguMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTUuMTUuMDAjQWlyY3JhZnQgbGlmdCBmYW5zIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE1LjE2LjAwI0FpcmNyYWZ0IGNhbm9waWVzIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE1LjE3LjAwI0FpcmNyYWZ0IGZ1cm5pc2hpbmdzIzI1LjE4LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE2LjAwLjAwI0F1dG9tb3RpdmUgY2hhc3NpcyMyNS4xOC4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNi4wMS4wMCNBdXRvbW9iaWxlIGNoYXNzaXMjMjUuMTguMTYuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTYuMDIuMDAjVHJ1Y2sgY2hhc3NpcyMyNS4xOC4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNi4wMy4wMCNNb3RvcmN5Y2xlIGZyYW1lcyMyNS4xOC4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNi4wNC4wMCNUcnVjayBjaGFzc2lzIzI1LjE4LjE2LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjAwLjAwI1Byb2R1Y3QgYW5kIG1hdGVyaWFsIHRyYWlsZXJzIzI1LjE4LjAwLjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjAxLjAwI0NvbnRhaW5lciB0cmFpbGVycyMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4wMi4wMCNGbGF0YmVkIHRyYWlsZXJzIzI1LjE4LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjAzLjAwI0xpdmVzdG9jayB0cmFpbGVycyMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4wNC4wMCNOb24gdGVtcGVyYXR1cmUgY29udHJvbGxlZCB0YW5rZXIgdHJhaWxlcnMjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTcuMDUuMDAjVGVtcGVyYXR1cmUgY29udHJvbGxlZCB0YW5rZXIgdHJhaWxlcnMjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTcuMDYuMDAjVGVtcGVyYXR1cmUgY29udHJvbGxlZCBjb250YWluZXIgdHJhaWxlcnMjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTcuMDcuMDAjQXV0b21vYmlsZSBjYXJyaWVyIHRyYWlsZXJzIzI1LjE4LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjA4LjAwI1RyYWlsZXIgaGl0Y2hlcyMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4wOS4wMCNTa2lwIGxvYWRlciMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4xMC4wMCNUcmFpbGVyIGVuZCBwbGF0ZXMjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTguMTcuMTEuMDAjU25vd21vYmlsZSB0cmFpbGVyIzI1LjE4LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE4LjE3LjEyLjAwI01vdG9yY3ljbGUgdHJhaWxlciMyNS4xOC4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOC4xNy4xMy4wMCNCb2F0IFRyYWlsZXIjMjUuMTguMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMDAuMDAuMDAjVHJhbnNwb3J0YXRpb24gc2VydmljZXMgZXF1aXBtZW50IzI1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjE5LjE1LjAwLjAwI0FpciB0cmFuc3BvcnRhdGlvbiBzdXBwb3J0IHN5c3RlbXMgYW5kIGVxdWlwbWVudCMyNS4xOS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNS4wMS4wMCNHcm91bmQgc3VwcG9ydCB0cmFpbmluZyBzeXN0ZW1zIzI1LjE5LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE1LjAyLjAwI0dyb3VuZCBzdXBwb3J0IHRlc3Qgb3IgbWFpbnRlbmFuY2Ugc3lzdGVtcyMyNS4xOS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNS4wMy4wMCNJbnRlZ3JhdGVkIG1haW50ZW5hbmNlIGluZm9ybWF0aW9uIHN5c3RlbXMjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMDQuMDAjQWlyY3JhZnQgZmxpZ2h0IHNpbXVsYXRvcnMgb3IgdHJhaW5lcnMjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMDUuMDAjQWlyY3JhZnQgY2FyZ28gaGFuZGxpbmcgZXF1aXBtZW50IzI1LjE5LjE1LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE1LjA2LjAwI0FpcmNyYWZ0IHJlZnVlbGluZyBlcXVpcG1lbnQjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMDcuMDAjQWlyY3JhZnQgZGVpY2luZyBlcXVpcG1lbnQjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMDguMDAjSmV0d2F5cyMyNS4xOS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNS4wOS4wMCNBaXJjcmFmdCBwdXNoYmFjayBvciB0b3cgdHJhY3RvcnMjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMTAuMDAjR3JvdW5kIHBvd2VyIHVuaXRzIGZvciBhaXJjcmFmdCMyNS4xOS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNS4xMS4wMCNMYXZhdG9yeSBzZXJ2aWNlIGVxdWlwbWVudCBmb3IgYWlyY3JhZnQjMjUuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTUuMTIuMDAjQWlyc3RhaXJzIG9yIHN0YWlyIHRydWNrcyMyNS4xOS4xNS4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNi4wMC4wMCNTcGFjZSB0cmFuc3BvcnRhdGlvbiBzdXBwb3J0IHN5c3RlbXMgYW5kIGVxdWlwbWVudCMyNS4xOS4wMC4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNi4wMS4wMCNTcGFjZWNyYWZ0IGZsaWdodCBzaW11bGF0b3JzIzI1LjE5LjE2LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE2LjAyLjAwI1BheWxvYWQgZGVsaXZlcnkgc3lzdGVtcyBmb3Igc3BhY2VjcmFmdCMyNS4xOS4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNi4wMy4wMCNMaXF1aWQgbGF1bmNoIHZlaGljbGVzIzI1LjE5LjE2LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE2LjA0LjAwI1NvbGlkIGxhdW5jaCB2ZWhpY2xlcyMyNS4xOS4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNi4wNS4wMCNTcGFjZWNyYWZ0IHNlcnZpY2UgbW9kdWxlcyMyNS4xOS4xNi4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNy4wMC4wMCNWZWhpY2xlIHNlcnZpY2luZyBlcXVpcG1lbnQjMjUuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTcuMDEuMDAjV2hlZWwgYmFsYW5jaW5nIGVxdWlwbWVudCMyNS4xOS4xNy4wMC4wMAotdW5zcHNjNyMyNS4xOS4xNy4wMi4wMCNXaGVlbCBhbGlnbm1lbnQgZXF1aXBtZW50IzI1LjE5LjE3LjAwLjAwCi11bnNwc2M3IzI1LjE5LjE3LjAzLjAwI1RpcmUgY2hhbmdpbmcgbWFjaGluZXMjMjUuMTkuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMTkuMTcuMDQuMDAjRW5naW5lIG9yIHZlaGljbGUgc3RhbmRzIzI1LjE5LjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjAwLjAwLjAwI0Flcm9zcGFjZSBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIGFuZCBlcXVpcG1lbnQjMjUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDAuMDAjQWlyY3JhZnQgZnVzZWxhZ2UgYW5kIGNvbXBvbmVudHMjMjUuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDEuMDAjQWlyY3JhZnQgc3BvaWxlcnMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDIuMDAjQWlyY3JhZnQgZmlucyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4wMy4wMCNBaXJjcmFmdCBob3Jpem9udGFsIHN0YWJpbGl6ZXJzIzI1LjIwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE1LjA0LjAwI0FpcmNyYWZ0IGNhbmFyZHMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDUuMDAjQWlyY3JhZnQgc2xhdHMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDYuMDAjQWlyY3JhZnQgZmxhcHMgb3IgZmxhcCBkcml2ZXMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDcuMDAjQWlyY3JhZnQgcnVkZGVycyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4wOC4wMCNBaXJjcmFmdCBlbGV2YXRvcnMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMDkuMDAjQWlyY3JhZnQgYWlsZXJvbnMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMTAuMDAjQWlyY3JhZnQgcHJvcGVsbGVycyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4xMS4wMCNBaXJjcmFmdCB3aW5ncyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4xMi4wMCNBaXJjcmFmdCBmdXNlbGFnZXMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMTMuMDAjQWlyY3JhZnQgcmFkb21lcyMyNS4yMC4xNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNS4xNC4wMCNBaXJjcmFmdCByb3RvcnMjMjUuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTUuMTUuMDAjQWlyY3JhZnQgbGlmdCBmYW5zIzI1LjIwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE1LjE2LjAwI0FpcmNyYWZ0IGNhbm9waWVzIzI1LjIwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE1LjE3LjAwI0FpcmNyYWZ0IGZ1cm5pc2hpbmdzIzI1LjIwLjE1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE2LjAwLjAwI0Flcm9zcGFjZSBsb2NhdGlvbiBhbmQgbmF2aWdhdGlvbiBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzI1LjIwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjE2LjAxLjAwI0FpcmNyYWZ0IGRpZ2l0YWwgYWx0aXR1ZGUgY29udHJvbCBzeXN0ZW1zIzI1LjIwLjE2LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE2LjAyLjAwI0FpcmNyYWZ0IG5hdmlnYXRpb24gYmVhY29ucyMyNS4yMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNi4wMy4wMCNBaXIgdG8gZ3JvdW5kIHRlcnJhaW4gZm9sbG93aW5nIHN5c3RlbXMjMjUuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTYuMDQuMDAjQWlyY3JhZnQgZ3VpZGFuY2Ugc3lzdGVtcyMyNS4yMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNi4wNS4wMCNBaXJjcmFmdCBzdGVlcmluZyBjb250cm9scyMyNS4yMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNi4wNi4wMCNTcGFjZWNyYWZ0IGFsdGl0dWRlIGNvbnRyb2wgc3lzdGVtcyMyNS4yMC4xNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNy4wMC4wMCNGbGlnaHQgY29tbXVuaWNhdGlvbnMgcmVsYXRlZCBzeXN0ZW1zIzI1LjIwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjAxLjAwI0FpcmNyYWZ0IGNvbW11bmljYXRpb24gc3lzdGVtcyMyNS4yMC4xNy4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNy4wMi4wMCNGbGlnaHQgZGF0YSByZWNvcmRlcnMjMjUuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTcuMDMuMDAjQWlyY3JhZnQgY291bnRlcm1lYXN1cmVzIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjA0LjAwI0VuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBzeXN0ZW1zIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjA1LjAwI0FpcmNyYWZ0IHRlbGVtZXRyeSBzeXN0ZW1zIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjA2LjAwI0FpcmNyYWZ0IGludGVyZmFjZSBlbGVjdHJvbmljcyMyNS4yMC4xNy4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNy4wNy4wMCNBaXJjcmFmdCBneXJvcyMyNS4yMC4xNy4wMC4wMAotdW5zcHNjNyMyNS4yMC4xNy4wOC4wMCNBaXJjcmFmdCBjYW1lcmFzIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjA5LjAwI0FpcmNyYWZ0IHByb2JlcyBvciBzZW5zb3JzIzI1LjIwLjE3LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE3LjEwLjAwI0FpcmNyYWZ0IHdhdmVndWlkZXMjMjUuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMTguMDAuMDAjQWlyY3JhZnQgbWFzdGVyIGNvbnRyb2wgc3lzdGVtcyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOC4wMS4wMCNGbGlnaHQgY29tcHV0ZXIgc3lzdGVtcyMyNS4yMC4xOC4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOC4wMi4wMCNTcGFjZWNyYWZ0IGNvbW1hbmQgbW9kdWxlcyMyNS4yMC4xOC4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOS4wMC4wMCNBaXJjcmFmdCBlbWVyZ2VuY3kgc3lzdGVtcyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOS4wMS4wMCNBaXJjcmFmdCBmaXJlIGNvbnRyb2wgb3IgZXh0aW5ndWlzaGluZyBzeXN0ZW1zIzI1LjIwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE5LjAyLjAwI0FpcmNyYWZ0IGVzY2FwZSBvciBlamVjdGlvbiBzeXN0ZW1zIzI1LjIwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjIwLjE5LjAzLjAwI0FpcmNyYWZ0IHdhcm5pbmcgc3lzdGVtcyMyNS4yMC4xOS4wMC4wMAotdW5zcHNjNyMyNS4yMC4xOS4wNC4wMCNQYXJhY2h1dGVzIzI1LjIwLjE5LjAwLjAwCi11bnNwc2M3IzI1LjIwLjIwLjAwLjAwI0FpcmNyYWZ0IHBvd2VyIHN5c3RlbXMjMjUuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjAuMDEuMDAjU3BhY2VjcmFmdCBzb2xhciBjZWxscyMyNS4yMC4yMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMC4wMi4wMCNTcGFjZWNyYWZ0IHNvbGFyIGFycmF5cyMyNS4yMC4yMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMC4wMy4wMCNBaXJjcmFmdCBwb3dlciBzdXBwbHkgdW5pdHMjMjUuMjAuMjAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjAuMDQuMDAjQXV4aWxsaWFyeSBwb3dlciB1bml0IHN5c3RlbXMgKEFQVXMpIzI1LjIwLjIwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjIxLjAwLjAwI0ZsaWdodCBpbnN0cnVtZW50YXRpb24jMjUuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjEuMDEuMDAjQWVyb3NwYWNlIGNvY2twaXQgaW5kaWNhdG9ycyMyNS4yMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMS4wMi4wMCNBZXJvc3BhY2UgY29ja3BpdCBnYXVnZXMjMjUuMjAuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjEuMDMuMDAjQWVyb3NwYWNlIGNvY2twaXQgZGlzcGxheSBwYW5lbHMjMjUuMjAuMjEuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjEuMDQuMDAjQWVyb3NwYWNlIGNvY2twaXQgc3dpdGNoIHBhbmVscyMyNS4yMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMS4wNS4wMCNBZXJvc3BhY2UgaGVhZCB1cCBkaXNwbGF5IChIVURzKSMyNS4yMC4yMS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMi4wMC4wMCNBaXJjcmFmdCBsYW5kaW5nIGFuZCBicmFraW5nIHN5c3RlbXMjMjUuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjIuMDEuMDAjQWlyY3JhZnQgYnJha2luZyBzeXN0ZW1zIzI1LjIwLjIyLjAwLjAwCi11bnNwc2M3IzI1LjIwLjIyLjAyLjAwI0FpcmNyYWZ0IGRyYWcgY2h1dGVzIzI1LjIwLjIyLjAwLjAwCi11bnNwc2M3IzI1LjIwLjIyLjAzLjAwI0FpcmNyYWZ0IHdoZWVscyMyNS4yMC4yMi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMi4wNC4wMCNMYW5kaW5nIGdlYXIgYXNzZW1ibGllcyMyNS4yMC4yMi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMi4wNS4wMCNBaXJjcmFmdCB0aXJlcyMyNS4yMC4yMi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMi4wNi4wMCNBaWNyYWZ0IGFudGkgc2tpZCBjb250cm9scyMyNS4yMC4yMi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMy4wMC4wMCNBaXJjcmFmdCBwYXNzZW5nZXIgcmVzdHJhaW50cyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMy4wMS4wMCNBaXJjcmFmdCBsYXBiZWx0cyMyNS4yMC4yMy4wMC4wMAotdW5zcHNjNyMyNS4yMC4yMy4wMi4wMCNBaXJjcmFmdCBoYXJuZXNzIHJlc3RyYWludHMjMjUuMjAuMjMuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjQuMDAuMDAjQWlyY3JhZnQgZnVlbCB0YW5rcyBhbmQgc3lzdGVtcyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNC4wMS4wMCNBaXJjcmFmdCBpbnRlcm5hbCBmdWVsIHRhbmtzIzI1LjIwLjI0LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI0LjAyLjAwI0FpcmNyYWZ0IGZ1ZWwgZHJvcCB0YW5rcyMyNS4yMC4yNC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNC4wMy4wMCNBaXJjcmFmdCBwcm9wZWxsYW50IHRhbmtzIzI1LjIwLjI0LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI0LjA0LjAwI0FpcmNyYWZ0IGh5YnJpZCBmdWVsIHN0b3JhZ2Ugc3lzdGVtcyMyNS4yMC4yNC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNC4wNS4wMCNBaXJjcmFmdCBmdWVsIG1hbmFnZW1lbnQgc3lzdGVtcyMyNS4yMC4yNC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNC4wNi4wMCNQb3N0Ym9vc3RlcnMjMjUuMjAuMjQuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjUuMDAuMDAjQWlyY3JhZnQgZXF1aXBtZW50IzI1LjIwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjAxLjAwI0FpcmNyYWZ0IGh5ZHJhdWxpYyBzeXN0ZW1zIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjAyLjAwI0V4dGVyaW9yIGFpcmNyYWZ0IGxpZ2h0aW5nIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjAzLjAwI0ludGVyaW9yIGFpcmNyYWZ0IGxpZ2h0aW5nIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjA0LjAwI0FpcmNyYWZ0IHdpbmRzaGllbGQgd2lwZXJzIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjA1LjAwI0FpcmNyYWZ0IG9uYm9hcmQgZGVmcm9zdGluZyBvciBkZWZvZ2dpbmcgc3lzdGVtcyMyNS4yMC4yNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNS4wNi4wMCNBaXJjcmFmdCBkb29ycyMyNS4yMC4yNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNS4wNy4wMCNBaXJjcmFmdCB3aW5kb3dzIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjA4LjAwI0FpcmNyYWZ0IHdpbmRzaGllbGRzIzI1LjIwLjI1LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI1LjA5LjAwI0FpcmNyYWZ0IHNob2NrIG1vdW50cyMyNS4yMC4yNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNS4xMC4wMCNBaXJjcmFmdCBzbGlwIHJpbmcgYXNzZW1ibGllcyMyNS4yMC4yNS4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNi4wMC4wMCNBaXJjcmFmdCBlbnZpcm9ubWVudGFsIGNvbnRyb2wgc3lzdGVtcyBhbmQgY29tcG9uZW50cyMyNS4yMC4wMC4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNi4wMS4wMCNBaXJjcmFmdCBlbnZpcm9ubWVudCBjb250cm9sbGVycyMyNS4yMC4yNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNi4wMi4wMCNBaXJjcmFmdCBlbnZpcm9ubWVudCByZWd1bGF0b3JzIzI1LjIwLjI2LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI2LjAzLjAwI0FpcmNyYWZ0IGNvb2xpbmcgdHVyYmluZXMjMjUuMjAuMjYuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjYuMDQuMDAjQWlyY3JhZnQgY29vbGluZyBmYW5zIzI1LjIwLjI2LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI2LjA1LjAwI0FpcmNyYWZ0IGhlYXQgZXhjaGFuZ2VycyMyNS4yMC4yNi4wMC4wMAotdW5zcHNjNyMyNS4yMC4yNi4wNi4wMCNBaXJjcmFmdCB3YXRlciBzZXBhcmF0b3JzIzI1LjIwLjI2LjAwLjAwCi11bnNwc2M3IzI1LjIwLjI2LjA3LjAwI0FpcmNyYWZ0IG94eWdlbiBlcXVpcG1lbnQjMjUuMjAuMjYuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjcuMDAuMDAjQWlyY3JhZnQgYWNjdW11bGF0b3JzIzI1LjIwLjAwLjAwLjAwCi11bnNwc2M3IzI1LjIwLjI3LjAxLjAwI0h5ZHJhdWxpYyBhaXJjcmFmdCBhY2N1bXVsYXRvcnMjMjUuMjAuMjcuMDAuMDAKLXVuc3BzYzcjMjUuMjAuMjcuMDIuMDAjUG5ldW1hdGljIGFpcmNyYWZ0IGFjY3VtdWxhdG9ycyMyNS4yMC4yNy4wMC4wMAotdW5zcHNjNyMyNi4wMC4wMC4wMC4wMCNQb3dlciBHZW5lcmF0aW9uIGFuZCBEaXN0cmlidXRpb24gTWFjaGluZXJ5IGFuZCBBY2Nlc3NvcmllcyMyNi4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNi4xMC4wMC4wMC4wMCNQb3dlciBzb3VyY2VzIzI2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEwLjE1LjAwLjAwI0VuZ2luZXMjMjYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDEuMDAjSHlkcmF1bGljIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDIuMDAjUG5ldW1hdGljIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDMuMDAjR2FzIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDQuMDAjRGllc2VsIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDUuMDAjU3RlYW0gZW5naW5lcyMyNi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNS4wNi4wMCNUdXJiaW5lIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDcuMDAjVHVyYm9mYW4gZW5naW5lcyMyNi4xMC4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNS4wOC4wMCNUaGVybWFsIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMDkuMDAjSHlkcm9lbGVjdHJpYyBlbmdpbmVzIzI2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE1LjEwLjAwI1JvdGFyeSBlbmdpbmVzIzI2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE1LjExLjAwI0h5ZHJhdWxpYyB0dXJiaW5lIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMTIuMDAjVHVyYm9wcm9wIGVuZ2luZXMjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTUuMTMuMDAjRW5naW5lIFJlcGFpciBLaXQjMjYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMDAuMDAjTW90b3JzIzI2LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjAxLjAwI0luZHVjdGlvbiBtb3RvcnMjMjYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMDIuMDAjQWx0ZXJuYXRpbmcgY3VycmVudCAoQUMpIG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4wMy4wMCNEaXJlY3QgY3VycmVudCAoREMpIG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4wNC4wMCNBbHRlcm5hdGluZyBjdXJyZW50IG9yIGRpcmVjdCBjdXJyZW50IChBQy9EQykgbW90b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjA1LjAwI0R5bmFtb3RvcnMjMjYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMDYuMDAjU2Vydm9tb3RvcnMjMjYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMDcuMDAjVG9ycXVlIG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4wOC4wMCNMaXF1aWQgcm9ja2V0IG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4wOS4wMCNTeW5jaHJvbm91cyBtb3RvcnMjMjYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTYuMTAuMDAjU29saWQgcm9ja2V0IG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4xMS4wMCNTaW5nbGUgcGhhc2UgbW90b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjEyLjAwI011bHRpIHBoYXNlIG1vdG9ycyMyNi4xMC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNi4xMy4wMCNIeWRyYXVsaWMgbW90b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjE0LjAwI1N0ZXAgbW90b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjE1LjAwI0FsdGVybmF0b3JzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE2LjE2LjAwI0NhcmJvbiBCcnVzaGVzIzI2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjAwLjAwI0VuZ2luZSBjb21wb25lbnRzIzI2LjEwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjAxLjAwI0FpcmNyYWZ0IGJ1cm5lcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMDIuMDAjQWlyY3JhZnQgZW5naW5lIGNvbXByZXNzb3JzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjAzLjAwI0FpcmNyYWZ0IGVuZ2luZSBkaWZmdXNlcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMDQuMDAjRW5naW5lIG1vdW50cyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4wNS4wMCNBaXJjcmFmdCBkcml2ZSBzaGFmdHMgcG93ZXIgdGFrZSBvZmZzIG9yIHNjcmV3IGphY2tzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjA2LjAwI0FpcmNyYWZ0IHRyYW5zbWlzc2lvbiB1bml0cyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4wNy4wMCNCYWxhbmNlIHNoYWZ0cyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4wOC4wMCNDYW0gZm9sbG93ZXJzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjA5LjAwI0NhbXNoYWZ0IGxpZnRlcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMTAuMDAjQ2FyYnVyZXRvcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMTEuMDAjQ29ubmVjdGluZyByb2RzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjEyLjAwI0NyYW5rY2FzZSB2ZW50aWxsYXRpb24gdmFsdmVzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjEzLjAwI0N5bGluZGVyIGhlYWRzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjE0LjAwI0VuZ2luZSBjb29sYW50IHJhZGlhdG9ycyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4xNS4wMCNFbmdpbmUgY292ZXJzIG9yIHBhbnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMTYuMDAjRW5naW5lIGZvcmdpbmdzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjE3LjAwI0VuZ2luZSBoZWF0ZXJzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjE4LjAwI0VuZ2luZSBpZ25pdGlvbiBzeXN0ZW1zIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjE5LjAwI1N1cGVyY2hhcmdlciMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4yMC4wMCNUdXJib2NoYXJnZXIjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMjEuMDAjRW5naW5lIHB1bGxleXMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMjIuMDAjRnVlbCBpbmplY3Rpb24gc3lzdGVtcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4yMy4wMCNGdWVsIHZhcG9yIGNhbmlzdGVyIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjI0LjAwI0dsb3cgcGx1Z3MjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMjUuMDAjT2lsIGRpcCBzdGlja3MgYW5kIHR1YmVzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjI2LjAwI09pbCBzdHJhaW5lcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMjcuMDAjUGlzdG9uIHJpbmdzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjI4LjAwI1B1c2ggcm9kIHR1YmVzIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjI5LjAwI1JvY2tlciBhcm0gYmFsbHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzAuMDAjUm9ja2VyIGFybSBzaGFmdHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzEuMDAjUm9ja2VyIGFybXMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzIuMDAjU3BhcmsgcGx1Z3MjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzMuMDAjQ2FyYnVyZXRvciBqZXQjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzQuMDAjQ2FyYnVyZXRvciBkaWFwaHJhZ21zIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjM1LjAwI09pbCBwYW4jMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzYuMDAjUGlzdG9ucyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4zNy4wMCNUaW1pbmcgY2hhaW4jMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuMzguMDAjSW50YWtlIG1hbmlmb2xkcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy4zOS4wMCNFeGhhdXN0IG1hbmlmb2xkcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40MC4wMCNGdWVsIGluamVjdG9ycyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40MS4wMCNFbmdpbmUgc2xlZXZlcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40Mi4wMCNGdWVsIGluamVjdGlvbiBtYW5pZm9sZHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNDMuMDAjRW5naW5lIHZhbHZlcyMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40NC4wMCNUdXJib2NoYXJnZXIjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNDUuMDAjY2Ftc2hhZnQjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNDYuMDAjQ3lsaW5kZXIgaGVhZCMyNi4xMC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMC4xNy40Ny4wMCNQdXNoIHJvZHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNDguMDAjRW5naW5lIGZseXdoZWVsIzI2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE3LjQ5LjAwI0NyYW5rc2hhZnQjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNTAuMDAjVGhyb3R0bGUjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNTEuMDAjRWxlY3Ryb25pYyBlbmdpbmUgY29udHJvbHMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTcuNTIuMDAjVmlicmF0aW9uIGRhbXBlcnMjMjYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTguMDAuMDAjTW90b3Igb3IgZ2VuZXJhdG9yIGNvbXBvbmVudHMjMjYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTguMDEuMDAjTW90b3IgYnJ1c2hlcyMyNi4xMC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xMC4xOC4wMi4wMCNBcm1hdHVyZXMjMjYuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTguMDMuMDAjUm90b3JzIG9yIHN0YXRvcnMjMjYuMTAuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTguMDQuMDAjTW90b3IgbW91bnRzIG9yIGJhc2VzIzI2LjEwLjE4LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE5LjAwLjAwI0ludGVybmFsIGNvbWJ1c3Rpb24gZW5naW5lIGNvbXBvbmVudHMjMjYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTAuMTkuMDEuMDAjQ3Jhbmsgc2hhZnRzIzI2LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE5LjAyLjAwI1NwYXJrIHBsdWdzIzI2LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE5LjAzLjAwI0NhbXNoYWZ0IzI2LjEwLjE5LjAwLjAwCi11bnNwc2M3IzI2LjEwLjE5LjA0LjAwI0Z1ZWwgaW5qZWN0aW9uIG5venpsZSMyNi4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMC4xOS4wNS4wMCNDeWxpbmRlciBibG9jayMyNi4xMC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4wMC4wMC4wMCNCYXR0ZXJpZXMgYW5kIGdlbmVyYXRvcnMgYW5kIGtpbmV0aWMgcG93ZXIgdHJhbnNtaXNzaW9uIzI2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjAwLjAwI0tpbmV0aWMgcG93ZXIgdHJhbnNtaXNzaW9uIzI2LjExLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjAxLjAwI0NvbW11dGF0b3JzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjAzLjAwI0FkanVzdGFibGUgc3BlZWQgZHJpdmVzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjA0LjAwI0JlbHQgZHJpdmVzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjA1LjAwI0NoYWluIGRyaXZlcyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4wNi4wMCNMaW5lYXIgbW90aW9uIGRldmljZXMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMDcuMDAjQ2x1dGNoZXMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMDguMDAjUG93ZXIgdGFrZSBvZmZzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjA5LjAwI1RyYW5zbWlzc2lvbiB5b2tlcyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4xMC4wMCNUcmFuc21pc3Npb24gc2hhZnRzIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjExLjAwI1VuaXZlcnNhbCBqb2ludHMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMTIuMDAjQXhsZXMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMTMuMDAjUG93ZXIgdHJhbnNtaXNzaW9uIGNoYWlucyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4xNC4wMCNLbnVja2xlIGpvaW50cyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4xNS4wMCNTZXJ2byBjb250cm9sbGVyIzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjE2LjAwI1N0ZXAgZHJpdmUgb3Igc3RlcHBlciBkcml2ZSBvciBzdGVwIGluZGV4ZXIjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMTcuMDAjUGxhbmV0IGNhcnJpZXIjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMTguMDAjVGVuc2lvbiBzdHJ1dCMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4xOS4wMCNUb3JxdWUgY29udmVydGVycyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNS4yMC4wMCNUcnVubmlvbnMjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMjEuMDAjUHVzaGVyIGhlYWQjMjYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTUuMjIuMDAjUHVzaGVyIGFzc2VtYmx5IzI2LjExLjE1LjAwLjAwCi11bnNwc2M3IzI2LjExLjE1LjIzLjAwI0JhY2tzdG9wcyMyNi4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNi4wMC4wMCNQb3dlciBnZW5lcmF0b3JzIzI2LjExLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjE2LjAxLjAwI0RpZXNlbCBnZW5lcmF0b3JzIzI2LjExLjE2LjAwLjAwCi11bnNwc2M3IzI2LjExLjE2LjAyLjAwI0h5ZHJvIGVsZWN0cmljIGdlbmVyYXRvcnMjMjYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTYuMDMuMDAjV2luZCBnZW5lcmF0b3JzIzI2LjExLjE2LjAwLjAwCi11bnNwc2M3IzI2LjExLjE2LjA0LjAwI0dhcyBnZW5lcmF0b3JzIzI2LjExLjE2LjAwLjAwCi11bnNwc2M3IzI2LjExLjE2LjA1LjAwI1RoZXJtYWwgZ2VuZXJhdG9ycyMyNi4xMS4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNi4wNi4wMCNIeWRyYXVsaWMgZ2VuZXJhdG9ycyMyNi4xMS4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNi4wNy4wMCNTb2xhciBnZW5lcmF0b3JzIzI2LjExLjE2LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjAwLjAwI0JhdHRlcmllcyBhbmQgYWNjZXNzb3JpZXMjMjYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDEuMDAjUmVjaGFyZ2VhYmxlIGJhdHRlcmllcyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4wMi4wMCNBbGthbGluZSBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDMuMDAjVmVoaWNsZSBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDQuMDAjQmF0dGVyeSBjaGFyZ2VycyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4wNS4wMCNEcnkgY2VsbCBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDYuMDAjRWxlY3Ryb25pYyBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDcuMDAjTGVhZCBhY2lkIGJhdHRlcmllcyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4wOC4wMCNOaWNrZWwgaXJvbiBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMDkuMDAjTmlja2VsIGNhZG1pdW0gYmF0dGVyaWVzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjEwLjAwI1Byb2R1Y3Qgc3BlY2lmaWMgYmF0dGVyeSBwYWNrcyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4xMS4wMCNMaXRoaXVtIGJhdHRlcmllcyMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4xMi4wMCNOaWNrZWwgaHlkcm9nZW4gYmF0dGVyaWVzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjEzLjAwI1RoZXJtYWwgYmF0dGVyaWVzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjE0LjAwI1p5bmMgYWlyIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjE1LjAwI1ppbmMgY29hbCBiYXR0ZXJ5IzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjE2LjAwI01lcmN1cnkgb3hpZGUgYmF0dGVyeSMyNi4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNi4xMS4xNy4xNy4wMCNNYW5nYW5lc2UgYmF0dGVyaWVzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE3LjE4LjAwI1NpbHZlciBveGlkZSBiYXR0ZXJpZXMjMjYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTcuMTkuMDAjQmF0dGVyeSB0ZXN0ZXJzIzI2LjExLjE3LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjAwLjAwI0RyaXZlIGNvbXBvbmVudHMjMjYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTguMDEuMDAjViBiZWx0cyMyNi4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOC4wMi4wMCNHZWFyZWQgdGltaW5nIGJlbHRzIzI2LjExLjE4LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjAzLjAwI1JvdW5kIGJlbHRzIzI2LjExLjE4LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjA0LjAwI0ZsYXQgYmVsdHMjMjYuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTguMDUuMDAjQmVsdCB0ZW5zaW9uZXJzIzI2LjExLjE4LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjA2LjAwI1RyYW5zbWlzc2lvbiBwdWxsZXlzIzI2LjExLjE4LjAwLjAwCi11bnNwc2M3IzI2LjExLjE4LjA3LjAwI1RpbWluZyBwdWxsZXkjMjYuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTEuMTguMDguMDAjVHJhbnRvcnF1ZSMyNi4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOC4wOS4wMCNCZWx0IGd1YXJkcyMyNi4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wMC4wMCNDbHV0Y2hlcyMyNi4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wMS4wMCNQbGF0ZSBjbHV0Y2hlcyMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wMi4wMCNEaWFwaHJhZ20gY2x1dGNoIzI2LjExLjE5LjAwLjAwCi11bnNwc2M3IzI2LjExLjE5LjAzLjAwI0NlbnRyaWZ1Z2FsIGNsdXRjaCMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wNC4wMCNTZW1pIGNlbnRyaWZ1Z2FsIGNsdXRjaCMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wNS4wMCNGcmVlIHdoZWVsIGNsdXRjaCMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4xOS4wNi4wMCNUb3JxdWUgY29udmVydGVyIzI2LjExLjE5LjAwLjAwCi11bnNwc2M3IzI2LjExLjE5LjA3LjAwI0ZsdWlkIGNvdXBsaW5nIzI2LjExLjE5LjAwLjAwCi11bnNwc2M3IzI2LjExLjE5LjA4LjAwI0NhbSBjbHV0Y2hlcyMyNi4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNi4xMS4yMC4wMC4wMCNDbHV0Y2ggcGFydHMgYW5kIGFjY2Vzc29yaWVzIzI2LjExLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjIwLjAxLjAwI1ByZXNzdXJlIHBsYXRlIzI2LjExLjIwLjAwLjAwCi11bnNwc2M3IzI2LjExLjIwLjAyLjAwI0RyaXZlbiBwbGF0ZSMyNi4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNi4xMS4yMC4wMy4wMCNDbHV0Y2ggcGxhdGVzIzI2LjExLjIwLjAwLjAwCi11bnNwc2M3IzI2LjExLjIxLjAwLjAwI0luZHVzdHJpYWwgYnJha2luZyBzeXN0ZW1zIzI2LjExLjAwLjAwLjAwCi11bnNwc2M3IzI2LjExLjIxLjAxLjAwI0FpciBvciBwbmV1bWF0aWMgYnJha2luZyBzeXN0ZW1zIzI2LjExLjIxLjAwLjAwCi11bnNwc2M3IzI2LjExLjIxLjAyLjAwI0h5ZHJhdWxpYyBicmFraW5nIHN5c3RlbXMjMjYuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMjEuMDMuMDAjTWVjaGFuaWNhbCBicmFraW5nIHN5c3RlbXMjMjYuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjYuMTEuMjEuMDQuMDAjQnJha2luZyBjbHV0Y2ggYXNzZW1ibGllcyMyNi4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNi4xMi4wMC4wMC4wMCNFbGVjdHJpY2FsIHdpcmUgYW5kIGNhYmxlIGFuZCBoYXJuZXNzIzI2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjAwLjAwI0VsZWN0cmljYWwgd2lyZSMyNi4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4wMS4wMCNIZWF0aW5nIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMDUuMDAjRml4dHVyZSB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjA3LjAwI1JhZGlvIG9yIHRlbGV2aXNpb24gd2lyZSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4wOC4wMCNBdXRvbW90aXZlIG9yIGFpcmNyYWZ0IHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMDkuMDAjTWFnbmV0IHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMTAuMDAjVHJvbGxleSB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjE0LjAwI1VuZGVyZ3JvdW5kIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMTUuMDAjU2lsaWNvbiBhc2Jlc3RvcyAoU0EpIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMTcuMDAjQ29wcGVyIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMTkuMDAjQ29wcGVyIGNsYWQgYWx1bWludW0gd2lyZSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4yMC4wMCNDb3BwZXIgc3RlZWwgd2lyZSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4yMS4wMCNCcm9uemUgd2lyZSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4yMi4wMCNCYXJlIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMjMuMDAjQ292ZXJlZCBidXQgbm90IGluc3VsYXRlZCB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjI0LjAwI0luc3VsYXRlZCBvciBjb3ZlcmVkIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMzIuMDAjSW50ZXIgY29ubmVjdCB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjMzLjAwI0thcHRhbiB3aXJlIzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE1LjM0LjAwI1BvbHltaWRlIHdpcmUjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMzUuMDAjRXh0ZW5zaW9uIGNvcmQjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMzYuMDAjRXh0ZW5zaW9uIGNvcmQjMjYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTUuMzcuMDAjV2lyZSBhc3NlbWJseSMyNi4xMi4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNS4zOC4wMCNXaXJlIGFzc2VtYmx5IzI2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjAwLjAwI0VsZWN0cmljYWwgY2FibGUjMjYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMDEuMDAjSGVhdGluZyBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4wMi4wMCNTdWJtYXJpbmUgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMDMuMDAjQ29udHJvbCBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4wNC4wMCNTaWduYWwgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMDUuMDAjQXV0b21vdGl2ZSBvciBhaXJjcmFmdCBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4wNi4wMCNDb2F4aWFsIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjA3LjAwI0ZpYmVyIG9wdGljIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjA4LjAwI0FlcmlhbCBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4wOS4wMCNOZXR3b3JrIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjEwLjAwI0Jyb256ZSBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4xMS4wMCNCYXJlIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjEyLjAwI0NvdmVyZWQgYnV0IG5vdCBpbnN1bGF0ZWQgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMTMuMDAjSW5zdWxhdGVkIG9yIGNvdmVyZWQgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMTQuMDAjQnVpbGRpbmcgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMTUuMDAjUG93ZXIgY2FibGUgZm9yIGRpcmVjdCBidXJpYWwjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMTYuMDAjVGVsZWNvbW11bmljYXRpb25zIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjE3LjAwI1RyaWF4aWFsIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE2LjE4LjAwI0Nyb3NzbGlua2VkIHBvbHlrYWVuZSBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4xOS4wMCNGbG9yb3BvbHltZXIgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjAuMDAjSW50ZXIgY29ubmVjdCBjYWJsZSMyNi4xMi4xNi4wMC4wMAotdW5zcHNjNyMyNi4xMi4xNi4yMS4wMCNLYXB0YW4gY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjIuMDAjUG9seW1pZGUgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjMuMDAjUmFkaW8gZnJlcXVlbmN5IChSRikgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjQuMDAjUmliYm9uIG9yIGZsYXQgY2FibGUjMjYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTYuMjUuMDAjQ29wcGVyIGNhYmxlIzI2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE3LjAwLjAwI1dpcmluZyBoYXJuZXNzIzI2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEyLjE3LjAxLjAwI1BhbmVsIHdpcmluZyBoYXJuZXNzIzI2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE3LjAyLjAwI1RydW5rIHdpcmluZyBoYXJuZXNzIzI2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEyLjE3LjAzLjAwI0NvbW11bmljYXRpb24gd2lyaW5nIGhhcm5lc3MjMjYuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTIuMTcuMDQuMDAjU3BlY2lhbHR5IHdpcmluZyBoYXJuZXNzIzI2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI2LjEzLjAwLjAwLjAwI1Bvd2VyIGdlbmVyYXRpb24jMjYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDAuMDAjUG93ZXIgcGxhbnRzIzI2LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI2LjEzLjE1LjAxLjAwI0RpZXNlbCBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDIuMDAjR2VvdGhlcm1hbCBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDMuMDAjSHlkcm8gcG93ZXIgcGxhbnRzIzI2LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEzLjE1LjA0LjAwI0dhcyBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDUuMDAjTWFyaW5lIHBvd2VyIHBsYW50cyMyNi4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMy4xNS4wNi4wMCNQZXRyb2wgcG93ZXIgcGxhbnRzIzI2LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI2LjEzLjE1LjA3LjAwI1NvbGFyIHBvd2VyIHBsYW50cyMyNi4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNi4xMy4xNS4wOC4wMCNTdGVhbSBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMDkuMDAjV2luZCBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTMuMTUuMTAuMDAjVGhlcm1hbCBwb3dlciBwbGFudHMjMjYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMDAuMDAuMDAjQXRvbWljIGFuZCBudWNsZWFyIGVuZXJneSBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCMyNi4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xNi4wMC4wMCNTdWJjcml0aWNhbCBhc3NlbWJseSBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTYuMDEuMDAjU3ViY3JpdGljYWwgYXNzZW1ibHkgZnVlbCMyNi4xNC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xNC4xNi4wMi4wMCNTdWJjcml0aWNhbCBhc3NlbWJseSBjb21wb25lbnRzIzI2LjE0LjE2LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE2LjAzLjAwI1N1YmNyaXRpY2FsIGFzc2VtYmx5IG1vZGVyYXRvciMyNi4xNC4xNi4wMC4wMAotdW5zcHNjNyMyNi4xNC4xNy4wMC4wMCNEb3NpbWV0cnkgZXF1aXBtZW50IzI2LjE0LjAwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjE3LjAxLjAwI0lvbml6YXRpb24gY2hhbWJlciBkb3NpbWV0ZXJzIzI2LjE0LjE3LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE3LjAyLjAwI0Rvc2ltZXRlcnMjMjYuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTcuMDMuMDAjU2Vjb25kYXJ5IHN0YW5kYXJkIGRvc2ltZXRyeSBzeXN0ZW1zIzI2LjE0LjE3LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE3LjA0LjAwI1BoYW50b20gZG9zaW1ldGVycyMyNi4xNC4xNy4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOC4wMC4wMCNIb3QgY2VsbCBkZXZpY2VzIzI2LjE0LjAwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjE4LjAxLjAwI0hvdCBjZWxsIHJlbW90ZSBoYW5kbGluZyBlcXVpcG1lbnQjMjYuMTQuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTguMDIuMDAjSG90IGNlbGwgcmVtb3RlIHZpZXdpbmcgZGV2aWNlIzI2LjE0LjE4LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE4LjAzLjAwI0hvdCBjZWxsIHNoaWVsZGluZyBkb29ycyMyNi4xNC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOC4wNC4wMCNIb3QgY2VsbCBzYW1wbGVycyMyNi4xNC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOC4wNS4wMCNIb3QgY2VsbCBzYW1wbGUgcHJvY2Vzc2luZyBlcXVpcG1lbnQjMjYuMTQuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTguMDYuMDAjSG90IGNlbGwgc3BlY2lhbCB0b29scyMyNi4xNC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOC4wNy4wMCNIb3QgY2VsbCBsZWFkIGdsYXNzIHdpbmRvd3MjMjYuMTQuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTguMDguMDAjSG90IGNlbGwgZGVjb250YW1pbmF0aW9uIHN5c3RlbXMjMjYuMTQuMTguMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTguMDkuMDAjSG90IGNlbGwgcGVuZXRyYXRpb24gZGV2aWNlcyMyNi4xNC4xOC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wMC4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyBpbnN0cnVtZW50cyMyNi4xNC4wMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wMS4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyBhaXJib3JuZSBkdXN0IG1lYXN1cmluZyBzeXN0ZW1zIzI2LjE0LjE5LjAwLjAwCi11bnNwc2M3IzI2LjE0LjE5LjAyLjAwI0JldGEgZ2F1Z2UgbWVhc3VyaW5nIHN5c3RlbXMjMjYuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTkuMDQuMDAjSW5kdXN0cmlhbCBudWNsZW9uaWMgbGlxdWlkIGxldmVsIGdhdWdlcyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wNS4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyBtYXNzIHBlciB1bml0IG9yZSBtZWFzdXJpbmcgc3lzdGVtcyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wNi4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyBtb2lzdHVyZSBtZWFzdXJpbmcgc3lzdGVtcyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wNy4wMCNJbmR1c3RyaWFsIG51Y2xlb25pYyB0aGlja25lc3MgbWVhc3VyaW5nIHN5c3RlbXMjMjYuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTkuMDguMDAjSW5kdXN0cmlhbCBudWNsZW9uaWMgZmxvdyBtZWFzdXJpbmcgc3lzdGVtcyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4xOS4wOS4wMCNJc290b3BlIHNlcGFyYXRvcnMjMjYuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTkuMTAuMDAjSXNvdG9wZSBwcm9kdWN0aW9uIGZhY2lsaXRpZXMjMjYuMTQuMTkuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMTkuMTEuMDAjSXNvdG9wZSBjYWxpYnJhdG9yIGFjdGl2aXR5IG1ldGVycyMyNi4xNC4xOS4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMC4wMC4wMCNJcnJhZGlhdGlvbiBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjAuMDEuMDAjSXJyYWRpYXRpb24gZ2FtbWEgc291cmNlcyMyNi4xNC4yMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMC4wMi4wMCNNYWduZXQgc3lzdGVtcyMyNi4xNC4yMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMC4wMy4wMCNOSU0gbnVjbGVhciBlbGVjdHJvbmljIHVuaXRzIzI2LjE0LjIwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIwLjA0LjAwI05ldXRyb24gaXJyYWRpYXRvcnMjMjYuMTQuMjAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjAuMDUuMDAjSXJyYWRpYXRpb24gdGVzdGluZyBjYXBzdWxlcyMyNi4xNC4yMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMC4wNi4wMCNJcnJhZGlhdGlvbiBzYW1wbGUgdHJhbnNmZXIgc3lzdGVtIzI2LjE0LjIwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIwLjA3LjAwI05ldXRyb24gZ2VuZXJhdG9ycyMyNi4xNC4yMC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMS4wMC4wMCNOdWNsZWFyIHJlYWN0b3IgZXF1aXBtZW50IzI2LjE0LjAwLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIxLjAxLjAwI051Y2xlYXIgcmVhY3RvciBzcGVjaW1lbiBpcnJhZGlhdGlvbiBjb250YWluZXJzIzI2LjE0LjIxLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIxLjA2LjAwI051Y2xlYXIgcmVhY3RvciBjb250cm9sIHJvZCBzeXN0ZW1zIzI2LjE0LjIxLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIxLjA4LjAwI051Y2xlYXIgcmVhY3RvciBpbiBjb3JlIG5ldXRyb24gZmx1eCBpbnN0cnVtZW50YXRpb24jMjYuMTQuMjEuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjEuMTcuMDAjTnVjbGVhciByZWFjdG9yIGVhcnRocXVha2UgaW5zdHJ1bWVudGF0aW9uIzI2LjE0LjIxLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIyLjAwLjAwI051Y2xlYXIgZnVlbCBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjIuMDEuMDAjTnVjbGVhciBmdWVsIGNsYWRkaW5nIHR1YmVzIzI2LjE0LjIyLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIyLjAyLjAwI051Y2xlYXIgZnVlbCBlbGVtZW50IGZhaWx1cmUgZGV0ZWN0aW9uIHN5c3RlbXMjMjYuMTQuMjIuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDAuMDAjUmFkaWF0aW9uIHNoaWVsZGluZyBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDIuMDAjTGVhZCBzY3JlZW5zIzI2LjE0LjIzLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIzLjAzLjAwI0ZpbG0gYmFkZ2VzIzI2LjE0LjIzLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIzLjA0LjAwI1JhZGlvZ3JhcGhpYyBlcXVpcG1lbnQjMjYuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDYuMDAjU2hpZWxkZWQgY29udGFpbmVycyBmb3IgcmFkaWF0aW9uIHByb3RlY3Rpb24jMjYuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDcuMDAjTGVhZCBjaGFtYmVycyBvciBzYWZlcyBmb3IgcmFkaWF0aW9uIHByb3RlY3Rpb24jMjYuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMDguMDAjTGVhZCBicmlja3MgZm9yIHJhZGlhdGlvbiBwcm90ZWN0aW9uIzI2LjE0LjIzLjAwLjAwCi11bnNwc2M3IzI2LjE0LjIzLjEwLjAwI0dsb3ZlIGJveGVzIGZvciByYWRpYXRpb24gcHJvdGVjdGlvbiMyNi4xNC4yMy4wMC4wMAotdW5zcHNjNyMyNi4xNC4yMy4xMS4wMCNSYWRpYXRpb24gc2hpZWxkaW5nIHdpbmRvd3MjMjYuMTQuMjMuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjMuMTIuMDAjTGVhZCBmb3IgcmFkaWF0aW9uIHNoaWVsZGluZyMyNi4xNC4yMy4wMC4wMAotdW5zcHNjNyMyNi4xNC4yNC4wMC4wMCNSYWRpb2FjdGl2ZSB3YXN0ZSBlcXVpcG1lbnQjMjYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjQuMDEuMDAjUmFkaW9hY3RpdmUgd2FzdGUgdHJlYXRtZW50IGNvbXBhY3RvcnMgb3IgaW5jaW5lcmF0b3JzIzI2LjE0LjI0LjAwLjAwCi11bnNwc2M3IzI2LjE0LjI0LjAyLjAwI051Y2xlYXIgcmFkaWF0aW9uIGFic29yYmVycyMyNi4xNC4yNC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yNC4wMy4wMCNBdG9taWMgZW5lcmd5IGV2YXBvcmF0b3JzIG9yIGNvbmNlbnRyYXRvcnMgb3IgZHJ5ZXJzIzI2LjE0LjI0LjAwLjAwCi11bnNwc2M3IzI2LjE0LjI0LjA0LjAwI0Rvb3IgaW50ZXJsb2NraW5nIHN5c3RlbXMjMjYuMTQuMjQuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjQuMDUuMDAjUmFkaW9hY3RpdmUgd2FzdGUgZG9zYWdlIHN5c3RlbXMjMjYuMTQuMjQuMDAuMDAKLXVuc3BzYzcjMjYuMTQuMjQuMDYuMDAjUmFkaW9hY3RpdmUgd2FzdGUgc29saWRpZmljYXRpb24gc3lzdGVtcyMyNi4xNC4yNC4wMC4wMAotdW5zcHNjNyMyNi4xNC4yNC4wNy4wMCNSYWRpb2FjdGl2ZSB3YXN0ZSBkaXNwb3NhbCBzeXN0ZW1zIzI2LjE0LjI0LjAwLjAwCi11bnNwc2M3IzI2LjE0LjI0LjA4LjAwI1JhZGlvYWN0aXZlIHdhc3RlIHRyZWF0bWVudCBmYWNpbGl0aWVzIzI2LjE0LjI0LjAwLjAwCi11bnNwc2M3IzI3LjAwLjAwLjAwLjAwI1Rvb2xzIGFuZCBHZW5lcmFsIE1hY2hpbmVyeSMyNy4wMC4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4wMC4wMC4wMCNIYW5kIHRvb2xzIzI3LjAwLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjAwLjAwI0N1dHRpbmcgYW5kIGNyaW1waW5nIGFuZCBwdW5jaGluZyB0b29scyMyNy4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4wMS4wMCNLbmlmZSBibGFkZXMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMDIuMDAjUmF6b3Iga25pdmVzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjAzLjAwI1V0aWxpdHkga25pdmVzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjA0LjAwI1BvY2tldCBrbml2ZXMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMDUuMDAjUHVuY2hlcyBvciBuYWlsIHNldHMgb3IgZHJpZnRzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjA2LjAwI1NoZWFycyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4wNy4wMCNNZXRhbCBjdXR0ZXJzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjA4LjAwI1Nhd3MjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMDkuMDAjQXVnZXJzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjEwLjAwI1N0cmlwcGluZyB0b29scyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4xMS4wMCNXaXJlIGN1dHRlcnMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMTIuMDAjQm9sdCBjdXR0ZXJzIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjEzLjAwI0hvc2UgY3V0dGVyIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjE0LjAwI0dsYXNzIGN1dHRlcnMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMTUuMDAjSGFuZCBvciBwdXNoIGRyaWxsIzI3LjExLjE1LjAwLjAwCi11bnNwc2M3IzI3LjExLjE1LjE2LjAwI1B1bmNoaW5nIHBsaWVycyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4xNy4wMCNLbmlmZSBibGFkZSBzZXRzIG9yIGRpc3BlbnNlcnMjMjcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTUuMjAuMDAjTnV0IHNwbGl0dGVycyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNS4yMS4wMCNOaWJibGVycyMyNy4xMS4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNi4wMC4wMCNGb3JtaW5nIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjE2LjAxLjAwI01hbGxldHMjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTYuMDIuMDAjSGFtbWVycyMyNy4xMS4xNi4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNi4wMy4wMCNBbnZpbHMjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTYuMDQuMDAjSGF0Y2hldHMjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTYuMDUuMDAjUGlja3MjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTYuMDYuMDAjQm9sdCBjdXR0ZXJzIzI3LjExLjE2LjAwLjAwCi11bnNwc2M3IzI3LjExLjE2LjA3LjAwI1N3YWdpbmcgdG9vbHMjMjcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMDAuMDAjV3JlbmNoZXMgYW5kIGRyaXZlcnMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMDEuMDAjU2NyZXdkcml2ZXJzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjAyLjAwI051dCBkcml2ZXJzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjAzLjAwI1NvY2tldCBzZXRzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjA0LjAwI1NvY2tldHMjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMDUuMDAjQm94IGVuZCB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4wNi4wMCNPcGVuIGVuZCB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4wNy4wMCNBZGp1c3RhYmxlIHdyZW5jaGVzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjA4LjAwI1BpcGUgd3JlbmNoZXMjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMDkuMDAjU2NyZXcgZXh0cmFjdG9ycyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xMC4wMCNIZXgga2V5cyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xMS4wMCNSYXRjaGV0cyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xMi4wMCNQdWxsZXJzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjEzLjAwI0NvbWJpbmF0aW9uIHdyZW5jaGVzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjE0LjAwI1NwZWNpYWx0eSB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xNS4wMCNUb3JxdWUgd3JlbmNoZXMjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMTYuMDAjVG9yeCBrZXlzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjE3LjAwI1BpcGUgZXh0cmFjdG9ycyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xOC4wMCNUYXAgZXh0cmFjdG9ycyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4xOS4wMCNUb3JxdWUgd3JlbmNoIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjIwLjAwI1QgaGFuZGxlIHRhcCB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4yMS4wMCNDcmFua3MjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMjIuMDAjRGllIHN0b2NrcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4yMy4wMCNUdWJlIHdyZW5jaGVzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE3LjI0LjAwI0hvb2sgd3JlbmNoZXMjMjcuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTcuMjUuMDAjT2Zmc2V0IHNvY2tldCB3cmVuY2hlcyMyNy4xMS4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4xNy4yNi4wMCNTcGFubmVyIHdyZW5jaGVzIzI3LjExLjE3LjAwLjAwCi11bnNwc2M3IzI3LjExLjE4LjAwLjAwI01lYXN1cmluZyBhbmQgbGF5b3V0IHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjE4LjAxLjAwI1RhcGUgbWVhc3VyZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDIuMDAjTGV2ZWxzIzI3LjExLjE4LjAwLjAwCi11bnNwc2M3IzI3LjExLjE4LjAzLjAwI1NxdWFyZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDQuMDAjUGx1bWIgYm9icyMyNy4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOC4wNS4wMCNQcm90cmFjdG9ycyMyNy4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOC4wNi4wMCNOYWlsIG9yIHJvdXRlciBnYXVnZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDcuMDAjU3RyYWlnaHQgZWRnZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDguMDAjUnVsZXMjMjcuMTEuMTguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTguMDkuMDAjQmV2ZWxzIzI3LjExLjE4LjAwLjAwCi11bnNwc2M3IzI3LjExLjE4LjEwLjAwI1N0dWQgZmluZGVycyMyNy4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOC4xMS4wMCNDYWxpcGVycyMyNy4xMS4xOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOS4wMC4wMCNSb3VnaCBhbmQgZmluaXNoaW5nIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjE5LjAxLjAwI0NvbGQgY2hpc2VscyMyNy4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOS4wMi4wMCNGaWxlcyMyNy4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOS4wMy4wMCNQbGFuZXMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMDQuMDAjUmFzcHMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMDUuMDAjR3JpbmRlcnMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMDYuMDAjV29vZCBjaGlzZWxzIzI3LjExLjE5LjAwLjAwCi11bnNwc2M3IzI3LjExLjE5LjA3LjAwI1dpcmUgYnJ1c2hlcyMyNy4xMS4xOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4xOS4wOC4wMCNTaGFycGVuaW5nIHRvb2xzIG9yIGtpdHMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMDkuMDAjU3BhdHVsYXMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMTkuMTEuMDAjQ3Jvc3MgY3V0IGNoaXNlbHMjMjcuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMDAuMDAjR2FyZGVuIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjAxLjAwI01hY2hldGVzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjAyLjAwI1NwYWRlcyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4wMy4wMCNSYWtlcyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4wNC4wMCNTaG92ZWxzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjA1LjAwI0F4ZXMjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMDYuMDAjU2N5dGhlcyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4wNy4wMCNTZWNhdGV1cnMgb3IgcHJ1bmluZyBzaGVhcnMjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMDguMDAjSG9lcyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4wOS4wMCNTY3JhcGVycyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4xMC4wMCNHYXJkZW4gZm9ya3MjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMTEuMDAjVG9vbCBoYW5kbGVzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjEyLjAwI0dhcmRlbiByaWRkbGVzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIwLjEzLjAwI1Bvc3QgaG9sZSBkaWdnZXIjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMTQuMDAjTGF3bm1vd2VycyMyNy4xMS4yMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMC4xNS4wMCNMYXduIHNjYXJpZmllcnMjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMTYuMDAjSGVkZ2UgY2xpcHBlcnMjMjcuMTEuMjAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjAuMTcuMDAjRGlnZ2luZyBiYXJzIzI3LjExLjIwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjAwLjAwI0hvbGRpbmcgYW5kIGNsYW1waW5nIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjAxLjAwI1BpcGUgdmlzZXMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDIuMDAjQmVuY2ggdmlzZXMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDMuMDAjSGFuZCBjbGFtcHMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDQuMDAjVG9uZ3MjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDUuMDAjVHdlZXplcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMDYuMDAjTGluZW1hbnMgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjA3LjAwI0FkanVzdGFibGUgd2lkZW1vdXRoIHBsaWVycyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4wOC4wMCNOZWVkbGVub3NlIHBsaWVycyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4wOS4wMCNNYWduZXRpYyB0b29scyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4xMC4wMCNSZXRhaW5pbmcgcmluZyBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTEuMDAjQWxsaWdhdG9yIHBsaWVycyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4xMi4wMCNUb25ndWUgYW5kIGdyb292ZSBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTMuMDAjU2xpcCBvciBncm9vdmUgam9pbnQgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjE0LjAwI0RpYWdvbmFsIGN1dCBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTUuMDAjTG9ja2luZyBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTYuMDAjRmVuY2UgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjE3LjAwI0VuZCBjdXQgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjE4LjAwI1dpcmUgbHVnIGNyaW1waW5nIHRvb2wjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMTkuMDAjTGlnaHQgYnVsYiBjaGFuZ2VyIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjIwLjAwI0MgY2xhbXBzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjIxLjAwI0Nvcm5lciBjbGFtcHMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMjIuMDAjU2hlZXQgbWV0YWwgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjIzLjAwI0JlbmNoIGRvZyMyNy4xMS4yMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMS4yNC4wMCNUZW5zaW9uZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjI1LjAwI1JvdW5kIG5vc2UgcGxpZXJzIzI3LjExLjIxLjAwLjAwCi11bnNwc2M3IzI3LjExLjIxLjI2LjAwI0ZsYXQgbm9zZSBwbGllcnMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjEuMjcuMDAjU3RyYXAgd3JlbmNoZXMjMjcuMTEuMjEuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjIuMDAuMDAjTWFzb25yeSBhbmQgY29uY3JldGUgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjIuMDEuMDAjVHJvd2VscyMyNy4xMS4yMi4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMi4wMi4wMCNGbG9hdHMjMjcuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjIuMDMuMDAjRWRnZXJzIzI3LjExLjIyLjAwLjAwCi11bnNwc2M3IzI3LjExLjIyLjA0LjAwI0NlbWVudCBtaXhlcnMjMjcuMTEuMjIuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjMuMDAuMDAjTWFya2luZyB0b29scyMyNy4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMy4wMS4wMCNCcmFuZGVycyMyNy4xMS4yMy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMy4wMi4wMCNBd2xzIzI3LjExLjIzLjAwLjAwCi11bnNwc2M3IzI3LjExLjIzLjAzLjAwI1NjcmliZXJzIzI3LjExLjIzLjAwLjAwCi11bnNwc2M3IzI3LjExLjIzLjA0LjAwI0NoYWxrIGxpbmVzIzI3LjExLjIzLjAwLjAwCi11bnNwc2M3IzI3LjExLjIzLjA1LjAwI01ldGFsIG1hcmtlcnMgb3IgaG9sZGVycyMyNy4xMS4yMy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yMy4wNi4wMCNNZXRhbCBzdGFtcHMjMjcuMTEuMjMuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjQuMDAuMDAjRmFzdGVuZXIgc2V0dGluZyB0b29scyMyNy4xMS4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNC4wMS4wMCNTdGFwbGUgZ3VucyMyNy4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNC4wMi4wMCNSaXZldCB0b29scyMyNy4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNC4wMy4wMCNCYW5kZXJzIzI3LjExLjI0LjAwLjAwCi11bnNwc2M3IzI3LjExLjI0LjA0LjAwI0FuY2hvciBzZXR0aW5nIHRvb2xzIzI3LjExLjI0LjAwLjAwCi11bnNwc2M3IzI3LjExLjI0LjA1LjAwI0JvbHQgaGVhdGVycyMyNy4xMS4yNC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNS4wMC4wMCNQcnlpbmcgYW5kIGJlbmRpbmcgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjUuMDEuMDAjUGlwZSBiZW5kaW5nIHRvb2xzIzI3LjExLjI1LjAwLjAwCi11bnNwc2M3IzI3LjExLjI1LjAyLjAwI1ByeSBiYXJzIzI3LjExLjI1LjAwLjAwCi11bnNwc2M3IzI3LjExLjI1LjAzLjAwI0NvbmR1aXQgYmVuZGVycyMyNy4xMS4yNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNS4wNC4wMCNXZWRnZXMjMjcuMTEuMjUuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjUuMDUuMDAjUGFja2luZyBob29rcyMyNy4xMS4yNS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNS4wNi4wMCNIaWNrZXlzIzI3LjExLjI1LjAwLjAwCi11bnNwc2M3IzI3LjExLjI2LjAwLjAwI1NlYWxpbmcgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjYuMDEuMDAjUHV0dHkga25pdmVzIzI3LjExLjI2LjAwLjAwCi11bnNwc2M3IzI3LjExLjI2LjAyLjAwI0NhdWxraW5nIHRvb2xzIzI3LjExLjI2LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjAwLjAwI1Bvd2VyIHRvb2xzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjAxLjAwI1Bvd2VyIGJsb3dlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMDIuMDAjUG93ZXIgYnVmZmVycyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4wMy4wMCNQb3dlciBkcmlsbHMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMDQuMDAjUG93ZXIgZ3JpbmRlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMDUuMDAjRGVtb2xpdGlvbiBoYW1tZXJzIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjA2LjAwI1Bvd2VyIHBsYW5lcyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4wNy4wMCNQb3dlciByb3V0ZXJzIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjA4LjAwI1Bvd2VyIHNhbmRlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMDkuMDAjUG93ZXIgc2F3cyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4xMC4wMCNQb3dlciBzY3Jld2d1bnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTEuMDAjUG93ZXIgc3RhcGxlIGd1bnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTIuMDAjUG93ZXIgdHJpbW1lcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTMuMDAjSW1wYWN0IHdyZW5jaGVzIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjE0LjAwI1Bvd2VyIGNhdWxraW5nIGd1bnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTUuMDAjUG93ZXIgY2hpcHBlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTYuMDAjUG93ZXIgbmFpbCBndW5zIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjE3LjAwI0hlYXQgZ3VucyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4xOC4wMCNFbmdyYXZlcnMjMjcuMTEuMjcuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjcuMTkuMDAjR2x1ZSBndW5zIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI3LjIwLjAwI1RvcnF1ZSB0b29scyMyNy4xMS4yNy4wMC4wMAotdW5zcHNjNyMyNy4xMS4yNy4yMS4wMCNCaXNjdWl0IGpvaW50ZXJzIzI3LjExLjI3LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjAwLjAwI1Rvb2wgYXR0YWNobWVudHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDEuMDAjRHJpbGwgYml0cyMyNy4xMS4yOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yOC4wMi4wMCNTYXcgYmxhZGVzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjAzLjAwI0VuZCBtaWxscyMyNy4xMS4yOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yOC4wNC4wMCNTdGFtcGluZyBkaWVzIG9yIHB1bmNoZXMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDUuMDAjVGhyZWFkaW5nIGRpZXMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDYuMDAjVGhyZWFkaW5nIHRhcHMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDcuMDAjQ2h1Y2tzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjA4LjAwI0NvbGxldHMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMDkuMDAjVG9vbCBob2xkZXJzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjEwLjAwI1RocmVhZCByZXBhaXIga2l0cyMyNy4xMS4yOC4wMC4wMAotdW5zcHNjNyMyNy4xMS4yOC4xMS4wMCNBcmJvcnMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMTIuMDAjQ291bnRlcnNpbmtzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjEzLjAwI0V4dGVuc2lvbiBwb2xlIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjE0LjAwI1NjcmV3ZHJpdmVyIGJpdHMjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMTUuMDAjTnV0IGRyaXZlciBiaXRzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjE2LjAwI0FicmFzaXZlIGRpc2sjMjcuMTEuMjguMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjguMTcuMDAjSG9sZSBzYXdzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjE4LjAwI1Zpc2UgamF3IGxpbmVycyBvciBjYXBzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjE5LjAwI1NraXZpbmcgdG9vbCBjdXR0ZXIgYmxhZGVzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI4LjIxLjAwI1JvdXRlciBiaXRzIzI3LjExLjI4LjAwLjAwCi11bnNwc2M3IzI3LjExLjI5LjAwLjAwI0Rpc3BlbnNpbmcgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjkuMDEuMDAjR3JlYXNlIGd1bnMjMjcuMTEuMjkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjkuMDIuMDAjSW5kdXN0cmlhbCBmdW5uZWxzIzI3LjExLjI5LjAwLjAwCi11bnNwc2M3IzI3LjExLjI5LjAzLjAwI0hhbmQgc3ByYXllcnMjMjcuMTEuMjkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjkuMDQuMDAjUmVzaW4gZ3VucyMyNy4xMS4yOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4yOS4wNS4wMCNPaWwgY2FuIzI3LjExLjI5LjAwLjAwCi11bnNwc2M3IzI3LjExLjI5LjA2LjAwI0NhdWxraW5nIGd1bnMjMjcuMTEuMjkuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMjkuMDcuMDAjQnJvYWRjYXN0IHNwcmVhZGVycyMyNy4xMS4yOS4wMC4wMAotdW5zcHNjNyMyNy4xMS4zMC4wMC4wMCNCcnVzaGVzIzI3LjExLjAwLjAwLjAwCi11bnNwc2M3IzI3LjExLjMwLjAxLjAwI1NjcmF0Y2ggYnJ1c2hlcyMyNy4xMS4zMC4wMC4wMAotdW5zcHNjNyMyNy4xMS4zMC4wMi4wMCNUdWJlIGJydXNoZXMjMjcuMTEuMzAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzAuMDMuMDAjQXBwbGljYXRvciBicnVzaGVzIzI3LjExLjMwLjAwLjAwCi11bnNwc2M3IzI3LjExLjMxLjAwLjAwI1B1bGxpbmcgdG9vbHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzEuMDEuMDAjRmlzaCB0YXBlIzI3LjExLjMxLjAwLjAwCi11bnNwc2M3IzI3LjExLjMxLjAyLjAwI0Z1c2UgcHVsbGVycyMyNy4xMS4zMS4wMC4wMAotdW5zcHNjNyMyNy4xMS4zMi4wMC4wMCNUb29sIGtpdHMjMjcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzIuMDEuMDAjR2VuZXJhbCB0b29sIGtpdHMjMjcuMTEuMzIuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzIuMDIuMDAjQmVhcmluZyBmaXR0aW5nIHRvb2wga2l0cyMyNy4xMS4zMi4wMC4wMAotdW5zcHNjNyMyNy4xMS4zMi4wMy4wMCNDb21wdXRlciB0b29sIGtpdHMjMjcuMTEuMzIuMDAuMDAKLXVuc3BzYzcjMjcuMTEuMzIuMDQuMDAjRWxlY3RyaWNpYW4ga2l0cyMyNy4xMS4zMi4wMC4wMAotdW5zcHNjNyMyNy4xMi4wMC4wMC4wMCNIeWRyYXVsaWMgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjcuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTUuMDAuMDAjSHlkcmF1bGljIHByZXNzZXMjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTUuMDEuMDAjUHJlc3MgcmV0dXJuIHNwcmluZ3MjMjcuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTYuMDAuMDAjSHlkcmF1bGljIGN5bGluZGVycyBhbmQgcGlzdG9ucyMyNy4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMi4xNi4wMS4wMCNDeWxpbmRlciBwaXN0b25zIzI3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzI3LjEyLjE2LjAyLjAwI0h5ZHJhdWxpYyBjeWxpbmRlcnMjMjcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTcuMDAuMDAjSHlkcmF1bGljIGhvc2UgYW5kIHR1YmUgZml0dGluZ3MjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTcuMDEuMDAjSHlkcmF1bGljIHF1aWNrIGNvbm5lY3RvcnMjMjcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTcuMDIuMDAjSHlkcmF1bGljIHRlZXMgb3IgY3Jvc3NlcyMyNy4xMi4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMi4xNy4wMy4wMCNGZXJydWxlcyMyNy4xMi4xNy4wMC4wMAotdW5zcHNjNyMyNy4xMi4xNy4wNC4wMCNIeWRyYXVsaWMgdW5pb25zIzI3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI3LjEyLjE3LjA1LjAwI0h5ZHJhdWxpYyBvciBjb21wcmVzc2lvbiBlbGJvd3MjMjcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTcuMDYuMDAjRmVycnVsZSBudXRzIzI3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzI3LjEyLjE3LjA3LjAwI0NyaW1wIGNvbm5lY3RvcnMjMjcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTguMDAuMDAjSHlkcmF1bGljIHF1aWNrIGNvbm5lY3RvcnMjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuMTkuMDAuMDAjSHlkcmF1bGljIHRlZXMgb3IgY3Jvc3NlcyMyNy4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMi4yMC4wMC4wMCNGZXJydWxlcyMyNy4xMi4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMi4zMC4wMC4wMCNIeWRyYXVsaWMgdW5pb25zIzI3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzI3LjEyLjQwLjAwLjAwI0h5ZHJhdWxpYyBvciBjb21wcmVzc2lvbiBlbGJvd3MjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuNTAuMDAuMDAjRmVycnVsZSBudXRzIzI3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzI3LjEyLjYwLjAwLjAwI0NyaW1wIGNvbm5lY3RvcnMjMjcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTIuNjEuMDAuMDAjSHlkcmF1bGljIHRvb2xzIzI3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzI3LjEyLjYxLjAxLjAwI01hbmhvbGUgY292ZXIgbGlmdGVycyMyNy4xMi42MS4wMC4wMAotdW5zcHNjNyMyNy4xMy4wMC4wMC4wMCNQbmV1bWF0aWMgbWFjaGluZXJ5IGFuZCBlcXVpcG1lbnQjMjcuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTUuMDAuMDAjUG5ldW1hdGljIHRvb2xzIzI3LjEzLjAwLjAwLjAwCi11bnNwc2M3IzI3LjEzLjE1LjAxLjAwI1BuZXVtYXRpYyBpbXBhY3Qgd3JlbmNoZXMjMjcuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTUuMDIuMDAjQ29tcHJlc3NlZCBhaXIgZ3VuIzI3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE1LjAzLjAwI1BuZXVtYXRpYyBzY3Jld2RyaXZlciMyNy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMy4xNS4wNC4wMCNQbmV1bWF0aWMgaGFtbWVyIzI3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE1LjA1LjAwI1BuZXVtYXRpYyBkcmlsbCMyNy4xMy4xNS4wMC4wMAotdW5zcHNjNyMyNy4xMy4xNS4wNi4wMCNQbmV1bWF0aWMgbmFpbCBkcml2ZXJzIzI3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE1LjA3LjAwI1BuZXVtYXRpYyBzYW5kaW5nIG1hY2hpbmVzIzI3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE2LjAwLjAwI0FpciBmaXR0aW5ncyBhbmQgY29ubmVjdG9ycyMyNy4xMy4wMC4wMC4wMAotdW5zcHNjNyMyNy4xMy4xNi4wMS4wMCNBaXIgbWFuaWZvbGRzIzI3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE2LjAyLjAwI0ZpbHRlcnMjMjcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTYuMDMuMDAjUmVndWxhdG9yIzI3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzI3LjEzLjE2LjA0LjAwI0x1YnJpY2F0b3IjMjcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTYuMDUuMDAjQWlyIGN1cnRhaW4jMjcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMjcuMTMuMTYuMDYuMDAjQWlyIGNvdXBsaW5nIzI3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzMwLjAwLjAwLjAwLjAwI1N0cnVjdHVyZXMgYW5kIEJ1aWxkaW5nIGFuZCBDb25zdHJ1Y3Rpb24gYW5kIE1hbnVmYWN0dXJpbmcgQ29tcG9uZW50cyBhbmQgU3VwcGxpZXMjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMDAuMDAuMDAjU3RydWN0dXJhbCBtYXRlcmlhbHMgYW5kIGJhc2ljIHNoYXBlcyMzMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4wMC4wMCNBbmdsZXMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMDEuMDAjRmVycm91cyBhbGxveSBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjAzLjAwI0lyb24gYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjA0LjAwI1N0ZWVsIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjA2LjAwI0FsdW1pbnVtIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4wNy4wMCNNYWduZXNpdW0gYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjA4LjAwI1RpdGFuaXVtIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4wOS4wMCNDb3BwZXIgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjEwLjAwI0JyYXNzIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4xMS4wMCNCcm9uemUgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjEyLjAwI1ppbmMgYW5nbGVzIzMwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE1LjEzLjAwI1RpbiBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMTQuMDAjTGVhZCBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMTUuMDAjUGxhc3RpYyBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTUuMTYuMDAjUnViYmVyIGFuZ2xlcyMzMC4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNS4xNy4wMCNQcmVjaW91cyBtZXRhbCBhbmdsZXMjMzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMDAuMDAjQmFyIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjAxLjAwI0ZlcnJvdXMgYWxsb3kgYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4wMi4wMCNOb24gZmVycm91cyBhbGxveSBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjAzLjAwI0lyb24gYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4wNC4wMCNTdGVlbCBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjA1LjAwI1N0YWlubGVzcyBzdGVlbCBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjA2LjAwI0FsdW1pbnVtIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMDcuMDAjTWFnbmVzaXVtIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMDguMDAjVGl0YW5pdW0gYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4wOS4wMCNDb3BwZXIgYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4xMC4wMCNCcmFzcyBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjExLjAwI0Jyb256ZSBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjEyLjAwI1ppbmMgYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4xMy4wMCNUaW4gYmFycyMzMC4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNi4xNC4wMCNMZWFkIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMTUuMDAjUGxhc3RpYyBiYXJzIzMwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE2LjE2LjAwI1ByZWNpb3VzIG1ldGFsIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTYuMTcuMDAjV29vZGVuIGJhcnMjMzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMDAuMDAjQmVhbXMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMDEuMDAjRmVycm91cyBhbGxveSBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4wMi4wMCNOb24gZmVycm91cyBhbGxveSBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4wMy4wMCNJcm9uIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjA0LjAwI1N0ZWVsIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjA1LjAwI1N0YWlubGVzcyBzdGVlbCBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4wNi4wMCNBbHVtaW51bSBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4wNy4wMCNNYWduZXNpdW0gYmVhbXMjMzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMDguMDAjVGl0YW5pdW0gYmVhbXMjMzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMDkuMDAjQ29wcGVyIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjEwLjAwI0JyYXNzIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjExLjAwI0Jyb256ZSBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4xMi4wMCNaaW5jIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjEzLjAwI1RpbiBiZWFtcyMzMC4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4xNy4xNC4wMCNMZWFkIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjE1LjAwI1BsYXN0aWMgYmVhbXMjMzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTcuMTYuMDAjUnViYmVyIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjE3LjAwI0NvbmNyZXRlIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE3LjE4LjAwI1ByZWNpb3VzIG1ldGFsIGJlYW1zIzMwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjAwLjAwI0NoYW5uZWxzIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjAxLjAwI0ZlcnJvdXMgYWxsb3kgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMDMuMDAjSXJvbiBjaGFubmVscyMzMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOC4wNC4wMCNTdGVlbCBjaGFubmVscyMzMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOC4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMDYuMDAjQWx1bWludW0gY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMDcuMDAjTWFnbmVzaXVtIGNoYW5uZWxzIzMwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjA4LjAwI1RpdGFuaXVtIGNoYW5ubmVscyMzMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOC4wOS4wMCNDb3BwZXIgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTAuMDAjQnJhc3MgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTEuMDAjQnJvbnplIGNoYW5uZWxzIzMwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjEyLjAwI1ppbmMgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTMuMDAjVGluIGNoYW5uZWxzIzMwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE4LjE0LjAwI0xlYWQgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTUuMDAjUGxhc3RpYyBjaGFubmVscyMzMC4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOC4xNi4wMCNSdWJiZXIgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTguMTcuMDAjUHJlY2lvdXMgbWV0YWwgY2hhbm5lbHMjMzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMDAuMDAjQ29pbCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4wMS4wMCNGZXJyb3VzIGFsbG95IGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4wMy4wMCNJcm9uIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMDQuMDAjU3RlZWwgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4wNi4wMCNBbHVtaW51bSBjb2lsIzMwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE5LjA3LjAwI01hZ25lc2l1bSBjb2lsIzMwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE5LjA4LjAwI1RpdGFuaXVtIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMDkuMDAjQ29wcGVyIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMTAuMDAjQnJhc3MgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xMS4wMCNCcm9uemUgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xMi4wMCNaaW5jIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMTMuMDAjVGluIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMTQuMDAjTGVhZCBjb2lsIzMwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE5LjE1LjAwI1BsYXN0aWMgY29pbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xNi4wMCNQcmVjaW91cyBtZXRhbCBjb2lscyMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xNy4wMCNOb24gbWV0YWxsaWMgY29pbHMjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMTguMDAjUGVyZm9yYXRlZCBzdGVlbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4xOS4wMCNFbWJvc3NlZCBzdGVlbCMzMC4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4xOS4yMC4wMCNDb21wcmVzc2VkIGZpYmVyIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMTkuMjEuMDAjRmliZXIgYW5kIHJ1YmJlciBjb2lsIzMwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjE5LjIyLjAwI0dyYXBoaXRlIGNvaWwjMzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMDAuMDAjRm9pbCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4wMS4wMCNGZXJyb3VzIGFsbG95IGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4wMy4wMCNJcm9uIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMDQuMDAjU3RlZWwgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4wNi4wMCNBbHVtaW51bSBmb2lsIzMwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIwLjA3LjAwI01hZ25lc2l1bSBmb2lsIzMwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIwLjA4LjAwI1RpdGFuaXVtIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMDkuMDAjQ29wcGVyIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMTAuMDAjQnJhc3MgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4xMS4wMCNCcm9uemUgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMC4xMi4wMCNaaW5jIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMTMuMDAjVGluIGZvaWwjMzAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjAuMTQuMDAjTGVhZCBmb2lsIzMwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIwLjE1LjAwI1BsYXN0aWMgZm9pbCMzMC4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4wMC4wMCNQaXBlIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjAxLjAwI0ZlcnJvdXMgYWxsb3kgcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4wMi4wMCNOb24gZmVycm91cyBhbGxveSBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjAzLjAwI0lyb24gcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4wNC4wMCNTdGVlbCBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjA1LjAwI1N0YWlubGVzcyBzdGVlbCBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjA2LjAwI0FsdW1pbnVtIHBpcGUjMzAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjEuMDcuMDAjTWFnbmVzaXVtIHBpcGUjMzAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjEuMDguMDAjVGl0YW5pdW0gcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4wOS4wMCNDb3BwZXIgcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4xMC4wMCNCcmFzcyBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjExLjAwI0Jyb256ZSBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjEyLjAwI1ppbmMgcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4xMy4wMCNUaW4gcGlwZSMzMC4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMS4xNC4wMCNMZWFkIHBpcGUjMzAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjEuMTUuMDAjUGxhc3RpYyBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjE2LjAwI1J1YmJlciBwaXBlIzMwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIxLjE3LjAwI0NvbmNyZXRlIHBpcGUjMzAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMDAuMDAjUGxhdGUjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMDEuMDAjRmVycm91cyBhbGxveSBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4wMi4wMCNOb24gZmVycm91cyBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4wMy4wMCNJcm9uIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjA0LjAwI1N0ZWVsIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjA1LjAwI1N0YWlubGVzcyBzdGVlbCBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4wNi4wMCNBbHVtaW51bSBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4wNy4wMCNNYWduZXNpdW0gcGxhdGUjMzAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMDguMDAjVGl0YW5pdW0gcGxhdGUjMzAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMDkuMDAjQ29wcGVyIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjEwLjAwI0JyYXNzIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjExLjAwI0Jyb256ZSBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4xMi4wMCNaaW5jIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjEzLjAwI1RpbiBwbGF0ZSMzMC4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMi4xNC4wMCNMZWFkIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjE1LjAwI1BsYXN0aWMgcGxhdGUjMzAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjIuMTYuMDAjUnViYmVyIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjE3LjAwI0NvbmNyZXRlIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjE4LjAwI1ByZWNpb3VzIG1ldGFsIHBsYXRlIzMwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIyLjE5LjAwI05vbiBtZXRhbGxpYyBwbGF0ZXMjMzAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMDAuMDAjUHJvZmlsZXMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMDEuMDAjRmVycm91cyBhbGxveSBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4wMi4wMCNOb24gZmVycm91cyBhbGxveSBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4wMy4wMCNJcm9uIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjA0LjAwI1N0ZWVsIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjA1LjAwI1N0YWlubGVzcyBzdGVlbCBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4wNi4wMCNBbHVtaW51bSBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4wNy4wMCNNYWduZXNpdW0gcHJvZmlsZXMjMzAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMDguMDAjVGl0YW5pdW0gcHJvZmlsZXMjMzAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMDkuMDAjQ29wcGVyIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjEwLjAwI0JyYXNzIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjExLjAwI0Jyb256ZSBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4xMi4wMCNaaW5jIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjEzLjAwI1RpbiBwcm9maWxlcyMzMC4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yMy4xNC4wMCNMZWFkIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjIzLjE1LjAwI1BsYXN0aWMgcHJvZmlsZXMjMzAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjMuMTYuMDAjUnViYmVyIHByb2ZpbGVzIzMwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjI0LjAwLjAwI1JvZCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4wMS4wMCNGZXJyb3VzIGFsbG95IHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMDIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4wMy4wMCNJcm9uIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMDQuMDAjU3RlZWwgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4wNi4wMCNBbHVtaW51bSByb2RzIzMwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI0LjA3LjAwI01hZ25lc2l1bSByb2RzIzMwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI0LjA4LjAwI1RpdGFuaXVtIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMDkuMDAjQ29wcGVyIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMTAuMDAjQnJhc3Mgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4xMS4wMCNCcm9uemUgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4xMi4wMCNaaW5jIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMTMuMDAjVGluIHJvZHMjMzAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjQuMTQuMDAjTGVhZCByb2RzIzMwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI0LjE1LjAwI1BsYXN0aWMgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNC4xNi4wMCNSdWJiZXIgcm9kcyMzMC4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4wMC4wMCNTaGVldCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4wMS4wMCNGZXJyb3VzIGFsbG95IHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjAyLjAwI05vbiBmZXJyb3VzIGFsbG95IHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjAzLjAwI0lyb24gc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMDQuMDAjU3RlZWwgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMDUuMDAjU3RhaW5sZXNzIHN0ZWVsIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjA2LjAwI0FsdW1pbnVtIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjA3LjAwI01hZ25lc2l1bSBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4wOC4wMCNUaXRhbml1bSBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4wOS4wMCNDb3BwZXIgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTAuMDAjQnJhc3Mgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTEuMDAjQnJvbnplIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjEyLjAwI1ppbmMgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTMuMDAjVGluIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjE0LjAwI0xlYWQgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTUuMDAjUGxhc3RpYyBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4xNi4wMCNSdWJiZXIgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTcuMDAjQXJtb3Igc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMTguMDAjQmVyeWxsaXVtIGFsbG95IHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjE5LjAwI0NvbXBvc2l0ZSBtZXRhbCBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4yMC4wMCNOaWNrZWwgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMjEuMDAjRm9hbSBSdWJiZXIgU2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMjIuMDAjQ29yayBhbmQgcnViYmVyIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjIzLjAwI0NvbXByZXNzZWQgZmliZXIgc2hlZXQjMzAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjUuMjQuMDAjTWV0YWwgaW5zZXJ0ZWQgY29tcHJlc3NlZCBmaWJlciBzaGVldCMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNS4yNS4wMCNGaWJlciBhbmQgcnViYmVyIHNoZWV0IzMwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI1LjI2LjAwI0FzYmVzdG9zIHNoZWV0cyMzMC4xMC4yNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4wMC4wMCNTdHJpcCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4wMS4wMCNGZXJyb3VzIGFsbG95IHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjAyLjAwI05vbiBmZXJyb3VzIGFsbG95IHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjAzLjAwI0lyb24gc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMDQuMDAjU3RlZWwgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMDUuMDAjU3RhaW5sZXNzIHN0ZWVsIHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjA2LjAwI0FsdW1pbnVtIHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjA3LjAwI01hZ25lc2l1bSBzdHJpcCMzMC4xMC4yNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4wOC4wMCNUaXRhbml1bSBzdHJpcCMzMC4xMC4yNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4wOS4wMCNDb3BwZXIgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMTAuMDAjQnJhc3Mgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMTEuMDAjQnJvbnplIHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjEyLjAwI1ppbmMgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMTMuMDAjVGluIHN0cmlwIzMwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI2LjE0LjAwI0xlYWQgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjYuMTUuMDAjUGxhc3RpYyBzdHJpcCMzMC4xMC4yNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNi4xNi4wMCNSdWJiZXIgc3RyaXAjMzAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDAuMDAjVHViZSBhbmQgdHViaW5nIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjAxLjAwI0ZlcnJvdXMgYWxsb3kgdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjAyLjAwI0NvcHBlciB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDMuMDAjVGl0YW5pdW0gdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjA0LjAwI01hZ25lc2l1bSB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDUuMDAjVGluIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4wNi4wMCNCcmFzcyB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDcuMDAjTGVhZCB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMDguMDAjQnJvbnplIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4wOS4wMCNaaW5jIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xMC4wMCNTdGVlbCB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMTEuMDAjSXJvbiB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMTIuMDAjQ2VtZW50IHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xMy4wMCNQbGFzdGljIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xNC4wMCNSdWJiZXIgdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjE1LjAwI0dsYXNzIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xNi4wMCNTdG9uZSB0dWJpbmcjMzAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjcuMTcuMDAjTm9uIGZlcnJvdXMgYWxsb3kgdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjE4LjAwI0FsdW1pbnVtIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yNy4xOS4wMCNTdGFpbmxlc3Mgc3RlZWwgdHViaW5nIzMwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI3LjIwLjAwI1ByZWNpb3VzIG1ldGFsIHR1YmluZyMzMC4xMC4yNy4wMC4wMAotdW5zcHNjNyMzMC4xMC4yOC4wMC4wMCNQaWxpbmcjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjguMDEuMDAjQWx1bWludW0gcGlsaW5ncyMzMC4xMC4yOC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yOC4wMi4wMCNDb25jcmV0ZSBwaWxpbmdzIzMwLjEwLjI4LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI4LjAzLjAwI1N0ZWVsIHBpbGluZ3MjMzAuMTAuMjguMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDAuMDAjUG9zdCMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4yOS4wMS4wMCNDZW1lbnQgb3IgY29uY3JldGUgcG9zdHMjMzAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDIuMDAjU3RlZWwgcG9zdHMjMzAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDMuMDAjTWV0YWwgcG9zdHMjMzAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDQuMDAjV29vZGVuIHBvc3RzIzMwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzMwLjEwLjI5LjA1LjAwI1BsYXN0aWMgcG9zdHMjMzAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMjkuMDYuMDAjRmliZXJnbGFzcyBwb3N0cyMzMC4xMC4yOS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMC4wMC4wMCNTaGFmdGluZyMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMC4wMS4wMCNTdGVlbCBzaGFmdGluZyMzMC4xMC4zMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMC4wMi4wMCNTdGFpbmxlc3Mgc3RlZWwgc2hhZnRpbmcjMzAuMTAuMzAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzEuMDAuMDAjUmFpbHMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzEuMDEuMDAjU3RlZWwgcmFpbCMzMC4xMC4zMS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMS4wMi4wMCNBbHVtaW51bSByYWlsIzMwLjEwLjMxLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMxLjAzLjAwI01ldGFsIHJhaWwjMzAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzIuMDAuMDAjR3JhdGluZyMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMi4wMS4wMCNTdGVlbCBncmF0aW5nIzMwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMyLjAyLjAwI1N0YWlubGVzcyBzdGVlbCBncmF0aW5nIzMwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMyLjAzLjAwI0FsdW1pbnVtIGdyYXRpbmcjMzAuMTAuMzIuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzIuMDQuMDAjRmliZXJnbGFzcyBncmF0aW5nIzMwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMyLjA1LjAwI0lyb24gZ3JhdGluZyMzMC4xMC4zMi4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4wMC4wMCNCaWxsZXRzIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMzLjAxLjAwI0FsdW1pbnVtIGJpbGxldCMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4wMi4wMCNCcmFzcyBiaWxsZXQjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMDMuMDAjQnJvbnplIGJpbGxldHMjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMDQuMDAjQ29wcGVyIGJpbGxldHMjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMDUuMDAjTGVhZCBiaWxsZXRzIzMwLjEwLjMzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMzLjA2LjAwI1ppbmMgYmlsbGV0cyMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4wNy4wMCNTdGVlbCBiaWxsZXRzIzMwLjEwLjMzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMzLjA4LjAwI1RpdGFuaXVtIGJpbGxldHMjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMDkuMDAjTWFnbmVzaXVtIGJpbGxldHMjMzAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzMuMTAuMDAjUHJlY2lvdXMgbWV0YWwgYmlsbGV0cyMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4xMS4wMCNOb24gZmVycm91cyBtZXRhbCBiaWxsZXRzIzMwLjEwLjMzLjAwLjAwCi11bnNwc2M3IzMwLjEwLjMzLjEyLjAwI0ZlcnJvdXMgbWV0YWwgYmlsbGV0cyMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zMy4xMy4wMCNOb24gbWV0YWxsaWMgYmlsbGV0cyMzMC4xMC4zMy4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wMC4wMCNJbmdvdHMjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzQuMDEuMDAjQWx1bWludW0gaW5nb3RzIzMwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM0LjAyLjAwI0JyYXNzIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wMy4wMCNMZWFkIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wNC4wMCNaaW5jIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wNS4wMCNTdGVlbCBpbmdvdHMjMzAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzQuMDYuMDAjTWFnbmVzaXVtIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4wNy4wMCNCcm9uemUgaW5nb3RzIzMwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM0LjA4LjAwI0NvcHBlciBpbmdvdHMjMzAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzQuMDkuMDAjVGl0YW5pdW0gaW5nb3RzIzMwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM0LjEwLjAwI1ByZWNpb3VzIG1ldGFsIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4xMS4wMCNGZXJyb3VzIGFsbG95IGV4dHJ1c2lvbiBpbmdvdHMjMzAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzQuMTIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZXh0cnVzaW9uIGluZ290cyMzMC4xMC4zNC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNC4xMy4wMCNOb24gbWV0YWxsaWMgaW5nb3RzIzMwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjAwLjAwI0hvbmV5Y29tYiBjb3JlIzMwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjAxLjAwI0FsdW1pbnVtIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjAyLjAwI01hZ25lc2l1bSBob25leWNvbWIgY29yZSMzMC4xMC4zNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNS4wMy4wMCNGb2FtIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjA0LjAwI1BsYXN0aWMgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMDUuMDAjV29vZGVuIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjA2LjAwI0ZlcnJvdXMgbWV0YWwgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMDcuMDAjQnJvbnplIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjA4LjAwI0NvcHBlciBob25leWNvbWIgY29yZSMzMC4xMC4zNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNS4wOS4wMCNTdGVlbCBob25leWNvbWIgY29yZSMzMC4xMC4zNS4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNS4xMC4wMCNMZWFkIGhvbmV5Y29tYiBjb3JlIzMwLjEwLjM1LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM1LjExLjAwI1ppbmMgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMTIuMDAjVGl0YW5pdW0gaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMTMuMDAjQnJhc3MgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMTQuMDAjTm9uIGZlcnJvdXMgbWV0YWwgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzUuMTUuMDAjUHJlY2lvdXMgbWV0YWwgaG9uZXljb21iIGNvcmUjMzAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzYuMDAuMDAjU3RydWN0dXJhbCBwcm9kdWN0cyMzMC4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNi4wMS4wMCNXb29kIGJlYW1zIzMwLjEwLjM2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM2LjAyLjAwI1dvb2QgY29tcG9zaXRlIGJlYW1zIzMwLjEwLjM2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM2LjAzLjAwI0ZyYW1pbmcgbHVtYmVyIzMwLjEwLjM2LjAwLjAwCi11bnNwc2M3IzMwLjEwLjM2LjA0LjAwI1dvb2Qgc2hlYXRoaW5nIG9yIHNoZWV0cyMzMC4xMC4zNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNi4wNS4wMCNXb29kIHBsYW5rcyMzMC4xMC4zNi4wMC4wMAotdW5zcHNjNyMzMC4xMC4zNi4wNi4wMCNXb29kIHRydXNzZXMjMzAuMTAuMzYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzYuMDcuMDAjV29vZCBqb2lzdHMjMzAuMTAuMzYuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzcuMDAuMDAjQnJhaWQjMzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTAuMzcuMDEuMDAjU3RhaW5sZXNzIHN0ZWVsIGJyYWlkIzMwLjEwLjM3LjAwLjAwCi11bnNwc2M3IzMwLjExLjAwLjAwLjAwI0NvbmNyZXRlIGFuZCBjZW1lbnQgYW5kIHBsYXN0ZXIjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTEuMTUuMDAuMDAjQ29uY3JldGUgYW5kIG1vcnRhcnMjMzAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTEuMTUuMDEuMDAjRm9hbWVkIGNvbmNyZXRlIzMwLjExLjE1LjAwLjAwCi11bnNwc2M3IzMwLjExLjE1LjAyLjAwI0NvbmR1Y3RpdmUgY29uY3JldGUjMzAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTEuMTUuMDMuMDAjSW5zdWxhdGluZyBjb25jcmV0ZSMzMC4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNS4wNC4wMCNNb3J0YXJzIzMwLjExLjE1LjAwLjAwCi11bnNwc2M3IzMwLjExLjE2LjAwLjAwI0NlbWVudCBhbmQgbGltZSMzMC4xMS4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wMS4wMCNDZW1lbnQjMzAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTEuMTYuMDIuMDAjQ2hsb3JpbmF0ZWQgbGltZSMzMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wMy4wMCNIeWRyYXVsaWMgbGltZSMzMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wNC4wMCNIeWRyYXRlZCBsaW1lIzMwLjExLjE2LjAwLjAwCi11bnNwc2M3IzMwLjExLjE2LjA1LjAwI0xlYW4gbGltZSMzMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wNi4wMCNHcm91dCMzMC4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMS4xNi4wNy4wMCNVbnNsYWtlZCBsaW1lIzMwLjExLjE2LjAwLjAwCi11bnNwc2M3IzMwLjExLjE3LjAwLjAwI1BsYXN0ZXJzIzMwLjExLjAwLjAwLjAwCi11bnNwc2M3IzMwLjExLjE3LjAxLjAwI0d5cHN1bSBwbGFzdGVyIzMwLjExLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEyLjAwLjAwLjAwI1JvYWRzIGFuZCBsYW5kc2NhcGUjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTIuMTUuMDAuMDAjQml0dW1pbm91cyBkZXJpdmF0aXZlcyMzMC4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNS4wMS4wMCNDb2FsIHRhciMzMC4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNS4wMi4wMCNUYXJzIzMwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEyLjE1LjAzLjAwI0NyZXNvdGUjMzAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTIuMTYuMDAuMDAjQXNwaGFsdHMjMzAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTIuMTYuMDEuMDAjQXNwaGFsdCMzMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNi4wMi4wMCNQaXRjaCMzMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNi4wMy4wMCNHaWxzb25pdGUjMzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTIuMTYuMDQuMDAjQ3V0YmFjayBwcm9kdWN0cyMzMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMi4xNi4wNS4wMCNNYW5ob2xlIGZyYW1lcyB3aXRoIGNvdmVycyMzMC4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMy4wMC4wMC4wMCNTdHJ1Y3R1cmFsIGJ1aWxkaW5nIHByb2R1Y3RzIzMwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEzLjE1LjAwLjAwI0Jsb2NrcyMzMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNS4wMS4wMCNDZW1lbnQgYmxvY2tzIzMwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMwLjEzLjE1LjAyLjAwI0NvbmNyZXRlIGJsb2NrcyMzMC4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNS4wMy4wMCNTdG9uZSBibG9ja3MjMzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTUuMDQuMDAjQ2VyYW1pYyBibG9ja3MjMzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTYuMDAuMDAjQnJpY2tzIzMwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzMwLjEzLjE2LjAxLjAwI0NlbWVudCBicmlja3MjMzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTYuMDIuMDAjQ2VyYW1pYyBicmlja3MjMzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTYuMDMuMDAjQ29uY3JldGUgYnJpY2tzIzMwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMwLjEzLjE2LjA0LjAwI1N0b25lIGJyaWNrcyMzMC4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNy4wMC4wMCNUaWxlcyBhbmQgZmxhZ3N0b25lcyMzMC4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNy4wMS4wMCNDZW1lbnQgdGlsZXMgb3IgZmxhZ3N0b25lcyMzMC4xMy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xMy4xNy4wMi4wMCNTdG9uZSB0aWxlcyBvciBmbGFnc3RvbmVzIzMwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEzLjE3LjAzLjAwI0NvbmNyZXRlIHRpbGVzIG9yIGZsYWdzdG9uZXMjMzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTMuMTcuMDQuMDAjQ2VyYW1pYyB0aWxlcyBvciBmbGFnc3RvbmVzIzMwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMwLjEzLjE3LjA1LjAwI0hlYWQgc3RvbmVzIzMwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMwLjE0LjAwLjAwLjAwI0luc3VsYXRpb24jMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMDAuMDAjVGhlcm1hbCBpbnN1bGF0aW9uIzMwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjAxLjAwI1dlYXRoZXIgc3RyaXBwaW5nIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjAyLjAwI0luc3VsYXRpb24gYmxhbmtldHMjMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMDMuMDAjRm9hbSBpbnN1bGF0aW9uIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjA0LjAwI0luc3VsYXRpb24gYmF0dHMjMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMDUuMDAjVGhlcm1hbCBpbnN1bGF0aW9uIHNsZWV2aW5nIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjA2LjAwI0xvb3NlIGZpbGwgaW5zdWxhdGlvbiMzMC4xNC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNC4xNS4wNy4wMCNSaWdpZCBib2FyZCBpbnN1bGF0aW9uIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjA4LjAwI0ZpYmVyIGluc3VsYXRpb24jMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMDkuMDAjUmVmcmFjdG9yaWVzIzMwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE1LjEwLjAwI0Rvb3Igc3dlZXAjMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTUuMTEuMDAjV2luZG93IGZpbG0jMzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTYuMDAuMDAjU3BlY2lhbHR5IGluc3VsYXRpb24jMzAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTYuMDEuMDAjQWNvdXN0aWNhbCBpbnN1bGF0aW9uIzMwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE0LjE2LjAyLjAwI05vbiB0aGVybWFsIGluc3VsYXRpb24gc2xlZXZpbmcjMzAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTQuMTYuMDMuMDAjSGVhdCBTaGllbGRzIzMwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE1LjAwLjAwLjAwI0V4dGVyaW9yIGZpbmlzaGluZyBtYXRlcmlhbHMjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTUuMDAuMDAjUm9vZmluZyBtYXRlcmlhbHMjMzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTUuMDEuMDAjUm9sbCByb29maW5nIzMwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE1LjAyLjAwI1Jvb2YgdmFsbGV5cyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wMy4wMCNSb29maW5nIGZhYnJpY3MjMzAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTUuMDQuMDAjUm9vZmluZyBmZWx0cyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wNS4wMCNSb29maW5nIG1lbWJyYW5lcyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wNi4wMCNSb29maW5nIHRpbGVzIzMwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE1LjA3LjAwI1NoYWtlcyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wOC4wMCNTaGluZ2xlcyMzMC4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNS4wOS4wMCNUcnVzc2VzIzMwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE1LjEwLjAwI1NsYXRlIHJvb2ZpbmcjMzAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDAuMDAjUm9vZmluZyBhY2Nlc3NvcmllcyMzMC4xNS4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNi4wMS4wMCNSb29mIGZhc2NpYXMjMzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDIuMDAjRmxhc2hpbmdzIzMwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE2LjAzLjAwI0dyYXZlbCBzdG9wcyMzMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNi4wNC4wMCNSb29maW5nIGJydXNoZXMjMzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDUuMDAjUm9vZmluZyBkcmFpbnMjMzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDYuMDAjUm9vZmluZyBtb3BzIzMwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE2LjA3LjAwI1Jvb2ZpbmcgdmVudHMjMzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTYuMDguMDAjU29mZml0cyMzMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNi4wOS4wMCNSb29mIGN1cmJzIzMwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE2LjEwLjAwI1Jvb2YgcmlwcGVycyMzMC4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNS4xNy4wMC4wMCNSYWluIGd1dHRlcnMgYW5kIGFjY2Vzc29yaWVzIzMwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE1LjE3LjAxLjAwI0Rvd25zcG91dHMjMzAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTcuMDIuMDAjRHJpcCBjYXBzIzMwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE3LjAzLjAwI0d1dHRlcnMjMzAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTcuMDQuMDAjU3BsYXNoYmxvY2tzIzMwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE4LjAwLjAwI1NpZGluZyBhbmQgZXh0ZXJpb3Igd2FsbCBtYXRlcmlhbHMjMzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTguMDEuMDAjU2h1dHRlcnMjMzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTguMDIuMDAjU2lkaW5nIzMwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzMwLjE1LjE4LjAzLjAwI1NpZGluZyBidXR0IGpvaW50cyMzMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMzMC4xNS4xOC4wNC4wMCNTaWRpbmcgY29ybmVycyMzMC4xNS4xOC4wMC4wMAotdW5zcHNjNyMzMC4xNS4xOC4wNS4wMCNTdHVjY28jMzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTguMDYuMDAjR2xhc3MgY3VydGFpbndhbGxpbmcjMzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTkuMDAuMDAjRmluaXNoaW5nIG1hdGVyaWFscyBhbmQgcHJvZHVjdHMjMzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMTkuMDEuMDAjQXduaW5ncyMzMC4xNS4xOS4wMC4wMAotdW5zcHNjNyMzMC4xNS4xOS4wMi4wMCNFeHRlcmlvciB0cmltIG1hdGVyaWFscyMzMC4xNS4xOS4wMC4wMAotdW5zcHNjNyMzMC4xNS4yMC4wMC4wMCNGZW5jaW5nIzMwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE1LjIwLjAxLjAwI01ldGFsIGZlbmNpbmcjMzAuMTUuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMjAuMDIuMDAjV29vZCBmZW5jaW5nIzMwLjE1LjIwLjAwLjAwCi11bnNwc2M3IzMwLjE1LjIxLjAwLjAwI1N1cmZhY2UjMzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTUuMjEuMDEuMDAjU2hvdCBzdGVlbCMzMC4xNS4yMS4wMC4wMAotdW5zcHNjNyMzMC4xNi4wMC4wMC4wMCNJbnRlcmlvciBmaW5pc2hpbmcgbWF0ZXJpYWxzIzMwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjE2LjE1LjAwLjAwI1dhbGwgZmluaXNoaW5nIG1hdGVyaWFscyMzMC4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNS4wMS4wMCNXYWxsYm9hcmQjMzAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTUuMDIuMDAjV2FsbHBhcGVycyMzMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNS4wMy4wMCNEcnl3YWxsIzMwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE1LjA0LjAwI0Nvcm5lciBndWFyZHMjMzAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTUuMDUuMDAjUGFuZWxzIG9yIHBhbmVsbGluZyMzMC4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNS4wNi4wMCNQbGFzdGVyIzMwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE1LjA3LjAwI0RyeXdhbGwgam9pbnQgY29tcG91bmRzIzMwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE1LjA4LjAwI1dhbGxwYXBlciByb2xsZXIjMzAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTYuMDAuMDAjQ2VpbGluZyBtYXRlcmlhbHMjMzAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTYuMDEuMDAjQWNvdXN0aWMgY2VpbGluZyB0aWxlcyMzMC4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNi4wMi4wMCNDZWlsaW5nIHBhbmVscyMzMC4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNi4wMy4wMCNDb2ZmZXJzIzMwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE2LjA0LjAwI1N1c3BlbmRlZCBjZWlsaW5nIHN5c3RlbXMjMzAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDAuMDAjRmxvb3JpbmcjMzAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDEuMDAjQ2FycGV0aW5nIzMwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE3LjAyLjAwI1dvb2QgZmxvb3JpbmcjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDMuMDAjTGlub2xldW0jMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDUuMDAjUnViYmVyIGZsb29yaW5nIzMwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE3LjA2LjAwI1N0b25lIG9yIHRpbGUgZmxvb3JpbmcjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDcuMDAjVmlueWwgZmxvb3JpbmcjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDguMDAjS25vdHRlZCBjYXJwZXRpbmcjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMDkuMDAjVHVmdGVkIGNhcnBldGluZyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNy4xMC4wMCNMYW1pbmF0ZSBmbG9vcmluZyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNy4xMS4wMCNPdXRkb29yIGNhcnBldGluZyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNy4xMi4wMCNGbG9vcmluZyBqb2lzdHMjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMTMuMDAjQ2FycGV0IHBhZHMjMzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTcuMTQuMDAjQ29yayBmbG9vcmluZyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xNy4xNS4wMCNEdWNrYm9hcmRzIzMwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE3LjE2LjAwI1RpbGUgc3BhY2VycyMzMC4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNi4xOC4wMC4wMCNDYWJpbmV0cnkjMzAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTguMDEuMDAjQ2FiaW5ldHMjMzAuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTguMDIuMDAjQ291bnRlcnRvcHMjMzAuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTkuMDAuMDAjTW9sZGluZyBhbmQgbWlsbHdvcmsjMzAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTkuMDEuMDAjTG91dmVycyMzMC4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMC4xNi4xOS4wMi4wMCNDb2x1bW5zIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjAzLjAwI1dhaW5zY290aW5nIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjA0LjAwI0Nvcm5pY2VzIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjA1LjAwI0Rvb3Igc3Vycm91bmRzIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjA2LjAwI01vbGRpbmcjMzAuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTYuMTkuMDcuMDAjU3RhaXJzIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE2LjE5LjA4LjAwI1N0YWlyIHBhcnRzIzMwLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE3LjAwLjAwLjAwI0Rvb3JzIGFuZCB3aW5kb3dzIGFuZCBnbGFzcyMzMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4wMC4wMCNEb29ycyMzMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4wMS4wMCNHbGFzcyBkb29ycyMzMC4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4wMi4wMCNTY3JlZW4gZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDMuMDAjUm9sbGluZyBkb29ycyMzMC4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4wNC4wMCNXb29kZW4gZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDUuMDAjTWV0YWwgZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDYuMDAjU3Rvcm0gZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDcuMDAjRG9vciBmcmFtZXMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMDguMDAjUG9ja2V0IGRvb3JzIzMwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE1LjA5LjAwI1Jldm9sdmluZyBkb29ycyMzMC4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4xMC4wMCNBdXRvbWF0aWMgZG9vcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTUuMTEuMDAjU3dpbmcgZG9vciMzMC4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNS4xMi4wMCNEb29yIG9wZW5lcnMjMzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMDAuMDAjV2luZG93cyMzMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNi4wNC4wMCNEb3VibGUgaHVuZyB3aW5kb3dzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjA1LjAwI1NpbmdsZSBodW5nIHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMDYuMDAjQ2FzZW1lbnQgd2luZG93cyMzMC4xNy4xNi4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNi4wNy4wMCNIb3Jpem9udGFsIHNsaWRlciB3aW5kb3dzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjA4LjAwI1RpbHQgb3IgdHJhbnNvbSB3aW5kb3dzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjA5LjAwI0ZpeGVkIHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMTAuMDAjQmF5IHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMTEuMDAjQm93IHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMTIuMDAjUHJvamVjdGVkIHdpbmRvd3MjMzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTYuMTMuMDAjV2luZG93IHdhbGxzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjE0LjAwI1dpbmRvdyBzY3JlZW5zIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE2LjE1LjAwI0ZyZW5jaCB3aW5kb3dzIzMwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE3LjAwLjAwI0dsYXNzIHByb2R1Y3RzIzMwLjE3LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE3LjE3LjAxLjAwI1BhdmluZyBibG9ja3MjMzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTcuMDMuMDAjQmV2ZWxlZCBnbGFzcyMzMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNy4wNC4wMCNMZWFkZWQgZ2xhc3MjMzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTcuMDUuMDAjTGFtaW5hdGVkIGdsYXNzIzMwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE3LjA2LjAwI1RlbXBlcmVkIGdsYXNzIzMwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE3LjA3LjAwI1NhZmV0eSBnbGFzcyMzMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNy4wOC4wMCNGbG9hdCBnbGFzcyMzMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNy4xNy4wOS4wMCNXaXJlZCBnbGFzcyMzMC4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMC4xNy4xOC4wMC4wMCNTa3lsaWdodHMjMzAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTguMDEuMDAjRml4ZWQgc2t5bGlnaHRzIzMwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE4LjAyLjAwI1ZlbnRlZCBza3lsaWdodHMjMzAuMTcuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTguMDMuMDAjVHViZSBza3lsaWdodHMjMzAuMTcuMTguMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTkuMDAuMDAjV2luZG93IGZyYW1lcyMzMC4xNy4wMC4wMC4wMAotdW5zcHNjNyMzMC4xNy4xOS4wMS4wMCNEb3VibGUgaHVuZyB3aW5kb3cgZnJhbWVzIzMwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE5LjAyLjAwI1NpbmdsZSBodW5nIHdpbmRvdyBmcmFtZXMjMzAuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMTkuMDMuMDAjQ2FzZW1lbnQgd2luZG93IGZyYW1lcyMzMC4xNy4xOS4wMC4wMAotdW5zcHNjNyMzMC4xNy4xOS4wNC4wMCNIb3Jpem9udGFsIHNsaWRlciB3aW5kb3cgZnJhbWVzIzMwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE5LjA1LjAwI1RpbHQgb3IgdHJhbnNvbSB3aW5kb3cgZnJhbWVzIzMwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzMwLjE3LjE5LjA2LjAwI0ZpeGVkIHdpbmRvdyBmcmFtZXMjMzAuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMjAuMDAuMDAjR2F0ZXMjMzAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTcuMjAuMDEuMDAjU2luZ2xlIGJhciBnYXRlIzMwLjE3LjIwLjAwLjAwCi11bnNwc2M3IzMwLjE3LjIwLjAyLjAwI0RvdWJsZSBiYXIgZ2F0ZSMzMC4xNy4yMC4wMC4wMAotdW5zcHNjNyMzMC4xOC4wMC4wMC4wMCNQbHVtYmluZyBmaXh0dXJlcyMzMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4xOC4xNS4wMC4wMCNTYW5pdGFyeSB3YXJlIzMwLjE4LjAwLjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjAxLjAwI0JhdGh0dWJzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjAyLjAwI0JpZGV0cyMzMC4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOC4xNS4wMy4wMCNTaG93ZXJzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjA0LjAwI1NpbmtzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjA1LjAwI1RvaWxldHMjMzAuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTguMTUuMDYuMDAjVXJpbmFscyMzMC4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOC4xNS4wNy4wMCNCYXRodHViIG9yIHNob3dlciBlbmNsb3N1cmVzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE4LjE1LjA4LjAwI1Jlc3Ryb29tIHBhcnRpdGlvbnMjMzAuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTguMTUuMDkuMDAjU29hcCBkaXNoZXMjMzAuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTguMTUuMTAuMDAjTmFwa2luIHJpbmdzIzMwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE5LjAwLjAwLjAwI0NvbnN0cnVjdGlvbiBhbmQgbWFpbnRlbmFuY2Ugc3VwcG9ydCBlcXVpcG1lbnQjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTUuMDAuMDAjTGFkZGVycyBhbmQgc2NhZmZvbGRpbmcjMzAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTUuMDEuMDAjTGFkZGVycyMzMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOS4xNS4wMi4wMCNTY2FmZm9sZGluZyMzMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOS4xNS4wMy4wMCNTdGVwIHN0b29sIzMwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMwLjE5LjE1LjA0LjAwI1N0ZXAgc3Rvb2wjMzAuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTUuMDUuMDAjU3RlcCBzdG9vbCMzMC4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMC4xOS4xNi4wMC4wMCNMYWRkZXJzIGFuZCBzY2FmZm9sZGluZyBhY2Nlc3NvcmllcyMzMC4xOS4wMC4wMC4wMAotdW5zcHNjNyMzMC4xOS4xNi4wMS4wMCNIYW5kcmFpbHMjMzAuMTkuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTYuMDIuMDAjU2NhZmZvbGRpbmcgc3RhYmlsaXplcnMjMzAuMTkuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMTkuMTYuMDMuMDAjU2NhZmZvbGRpbmcgZmxvb3JpbmcjMzAuMTkuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjAuMDAuMDAuMDAjUHJlZmFicmljYXRlZCBzdHJ1Y3R1cmVzIzMwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIwLjE1LjAwLjAwI1ByZWZhYnJpY2F0ZWQgZmFybSBzdHJ1Y3R1cmVzIzMwLjIwLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIwLjE1LjAxLjAwI1NpbG9zIzMwLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE1LjAyLjAwI0dyZWVuaG91c2VzIzMwLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE2LjAwLjAwI1ByZWZhYnJpY2F0ZWQgcmVzaWRlbnRpYWwgc3RydWN0dXJlcyMzMC4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNi4wMS4wMCNIb3VzZXMjMzAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjAuMTYuMDIuMDAjTW9iaWxlIGhvbWVzIzMwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE2LjAzLjAwI0NhYmlucyMzMC4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNi4wNC4wMCNHYXJhZ2VzIzMwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE2LjA1LjAwI0dhemVibyMzMC4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNy4wMC4wMCNQcmVmYWJyaWNhdGVkIGNvbW1lcmNpYWwgYW5kIGluZHVzdHJpYWwgc3RydWN0dXJlcyMzMC4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNy4wMS4wMCNJbiBwbGFudCBvZmZpY2VzIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjAyLjAwI1NwcmF5IGJvb3RocyMzMC4yMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNy4wMy4wMCNTdG9yYWdlIHNoZWRzIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjA0LjAwI0NsZWFuIHJvb21zIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjA1LjAwI0d1YXJkaG91c2VzIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjA2LjAwI1BvcnRhYmxlIHRvaWxldHRlcyMzMC4yMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMC4xNy4wNy4wMCNXYXJlaG91c2VzIzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjA4LjAwI0F1ZGl0b3JpdW0jMzAuMjAuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjAuMTcuMDkuMDAjQ29uc2VydmF0b3J5IzMwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE3LjEwLjAwI09mZmljZSBraXRjaGVucyMzMC4yMC4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOC4wMC4wMCNQcmVmYWJyaWNhdGVkIGVtZXJnZW5jeSByZWxpZWYgc3RydWN0dXJlcyMzMC4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOC4wMS4wMCNTaGVsdGVycyMzMC4yMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOC4wMi4wMCNFbWVyZ2VuY3kgdGVudCBoYWxscyMzMC4yMC4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOC4wMy4wMCNDb250YWluZXIgdW5pdHMjMzAuMjAuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjAuMTkuMDAuMDAjUHJlZmFicmljYXRlZCBtZWRpY2FsIHN0cnVjdHVyZXMjMzAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjAuMTkuMDEuMDAjTWVkaWNhbCB1bml0cyMzMC4yMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOS4wMi4wMCNMYWJvcmF0b3J5IHVuaXRzIzMwLjIwLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIwLjE5LjAzLjAwI0RlbnRhbCB1bml0cyMzMC4yMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMC4xOS4wNC4wMCNTdXJnaWNhbCB1bml0cyMzMC4yMC4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4wMC4wMC4wMCNFbGVjdHJpY2FsIGVxdWlwbWVudCBhbmQgY29tcG9uZW50cyBhbmQgc3VwcGxpZXMjMzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMDAuMDAjUG93ZXIgY29udmVyc2lvbiMzMC4yMS4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNS4wMS4wMCNUcmFuc2Zvcm1lcnMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMDIuMDAjUG93ZXIgc3VwcGx5IHVuaXRzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjAzLjAwI1Bvd2VyIGRpc3RyaWJ1dGlvbiB1bml0cyAoUERVcykjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMDQuMDAjUG93ZXIgYWRhcHRlcnMgb3IgaW52ZXJ0ZXJzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjA1LjAwI0ZyZXF1ZW5jeSBjb252ZXJ0ZXJzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjA2LjAwI1NpZ25hbCBjb252ZXJ0ZXJzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjA3LjAwI1RyYW5zZHVjZXJzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjA4LjAwI1JlZ3VsYXRvcnMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMDkuMDAjTWFnbmV0aWMgY29pbHMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMTAuMDAjVW5pbnRlcnJ1cHRpYmxlIHBvd2VyIHN1cHBsaWVzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjExLjAwI1NvbGVub2lkcyMzMC4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNS4xMi4wMCNDaG9rZXMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMTMuMDAjRWxlY3RyaWMgcm90YXJ5IGNvbnZlcnRlcnMjMzAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTUuMTQuMDAjQ2FwYWNpdG9yIGJhbmtzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE1LjE1LjAwI1JlYWN0b3JzIzMwLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE2LjAwLjAwI0NvbmR1aXRzIGFuZCByYWNld2F5cyMzMC4yMS4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNi4wMS4wMCNDYWJsZSB0cmF5cyMzMC4yMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNi4wMi4wMCNFbGVjdHJpY2FsIGNvbmR1aXQjMzAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTYuMDMuMDAjRWxlY3RyaWNhbCByYWNld2F5cyMzMC4yMS4xNi4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNi4wNC4wMCNXaXJpbmcgZHVjdHMjMzAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTYuMDUuMDAjV2lyZXdheXMjMzAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTYuMDYuMDAjV2lyaW5nIHRyb3VnaHMjMzAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDAuMDAjRWxlY3RyaWNhbCBib3hlcyBhbmQgZW5jbG9zdXJlcyBhbmQgZml0dGluZ3MjMzAuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDEuMDAjRWxlY3RyaWNhbCBib3hlcyMzMC4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNy4wMi4wMCNFbGVjdHJpY2FsIGJveCBjb3ZlcnMjMzAuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDMuMDAjV2VhdGhlcnByb29mIGJveGVzIzMwLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE3LjA0LjAwI1N3aXRjaCBib3hlcyMzMC4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNy4wNS4wMCNGbG9vciBib3hlcyMzMC4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNy4wNi4wMCNPdXRsZXQgYm94ZXMjMzAuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDcuMDAjU3BlY2lhbHR5IGVsZWN0cmljYWwgYm94ZXMjMzAuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMDguMDAjVXRpbGl0eSBib3hlcyMzMC4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMC4yMS4xNy4wOS4wMCNFbGVjdHJpY2FsIGZpdHRpbmdzIzMwLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE3LjEwLjAwI0VsZWN0cmljYWwgYnVzaGluZ3MjMzAuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTcuMTEuMDAjQ2VpbGluZyBmbGFuZ2VzIzMwLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjAwLjAwI0x1Z3MgY29ubmVjdG9ycyBhbmQgdGVybWluYWxzIzMwLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjAxLjAwI0VsZWN0cmljYWwgdGVybWluYWxzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjAyLjAwI0VsZWN0cmljYWwgcGx1Z3MjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMDMuMDAjVHdpc3QgbG9jayBwbHVncyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4wNC4wMCNFbGVjdHJpY2FsIHNsZWV2ZXMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMDUuMDAjQ2FibGUgb3Igd2lyZSBsdWdzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjA2LjAwI0VsZWN0cmljYWwgcmVjZXB0YWNsZXMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMDcuMDAjVGVybWluYWwgc3RyaXBzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjA4LjAwI01lY2hhbmljYWwgY29ubmVjdG9ycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4wOS4wMCNSaW5nIG9yIGZsYWcgdGVybWluYWxzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjEwLjAwI1dpcmUgY29ubmVjdG9ycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4xMS4wMCNUZXJtaW5hbCBibG9ja3MjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTIuMDAjRnVzZSBibG9ja3MjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTMuMDAjQmFja3NoZWxsIGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTQuMDAjQ2lyY3VsYXIgY29ubmVjdG9ycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4xNS4wMCNDb2F4aWFsIGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTYuMDAjRmxhdCBjb25uZWN0b3JzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjE3LjAwI0VsZWN0cm9uaWMgY29ubmVjdG9yIGNhcHMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMTguMDAjUmFkaW8gZnJlcXVlbmN5IChSRikgY29ubmVjdG9ycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4xOS4wMCNFbGVjdHJpY2FsIG1ldGFsbGljIHR1YmluZyAoRU1UKSBjb25uZWN0b3JzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjIwLjAwI0NvbXByZXNzaW9uIGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjEuMDAjU2V0IHNjcmV3IGNvdXBsaW5ncyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4yMi4wMCNGbGV4IGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjMuMDAjTGlxdWlkIHRpZ2h0IGNvbm5lY3RvcnMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjQuMDAjQ29ubmVjdG9yIGFzc2VtYmxpZXMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjUuMDAjTWVjaGFuaWNhbCBjb3VwbGluZ3MjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjYuMDAjU3ByaW5nIGphdyBjb25uZWN0b3JzIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE4LjI3LjAwI1Rlcm1pbmFsIGJsb2NrIGNvdmVycyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4yOC4wMCNUZXJtaW5hbCBibG9jayBzZXBhcmF0b3IjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMjkuMDAjSnVtcGVyIGJhciMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4zMC4wMCNXaXJpbmcgdGFwcyMzMC4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOC4zMS4wMCNFbGVjdHJpY2FsIHRhcHMjMzAuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTguMzIuMDAjRmliZXIgb3B0aWMgY29ubmVjdG9yIzMwLjIxLjE4LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjAwLjAwI1N3aXRjaGVzIGFuZCBjb250cm9scyBhbmQgcmVsYXlzIzMwLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjAxLjAwI1NhZmV0eSBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4wMi4wMCNEaW1tZXIgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMDMuMDAjRHJ1bSBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4wNC4wMCNUaW1lIHN3aXRjaGVzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjA1LjAwI1NuYXAgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMDYuMDAjTWVjaGFuaWNhbCBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4wNy4wMCNQcmVzc3VyZSBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4wOC4wMCNUb2dnbGUgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMDkuMDAjU2xpZGUgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMTAuMDAjTGltaXQgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMTEuMDAjQ29udHJvbGxlciBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xMi4wMCNWYXJpYWJsZSBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xMy4wMCNQdXNoIGJ1dHRvbiBzd2l0Y2hlcyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xNC4wMCNSb3Rhcnkgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMTUuMDAjUG93ZXIgcmVsYXlzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjE2LjAwI0dlbmVyYWwgcHVycG9zZSByZWxheXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMTcuMDAjU29ja2V0IHJlbGF5cyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xOC4wMCNBbHRlcm5hdGluZyB2b2x0YWdlIHJlbGF5cyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4xOS4wMCNNZXJjdXJ5IHJlbGF5cyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4yMC4wMCNUaW1lIHJlbGF5cyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4yMS4wMCNPdmVybG9hZCByZWxheXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMjIuMDAjTW90b3Igc3RhcnRlciBjb250cm9scyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4yMy4wMCNFbGVjdHJpY2FsIGNvbnRhY3RzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjI0LjAwI1RpbWVyIGNvbnRyb2xzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjI1LjAwI1Bob3RvY29udHJvbHMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMjYuMDAjTm9uIGZ1c2libGUgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMjcuMDAjUmFkaW8gZnJlcXVlbmN5IChSRikgc3dpdGNoZXMjMzAuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMTkuMjguMDAjUHJveGltaXR5IHN3aXRjaGVzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjI5LjAwI0VuY29kZXJzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjE5LjMwLjAwI1Bob3RvZWxlY3RyaWMgc2Vuc29ycyMzMC4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMC4yMS4xOS4zMS4wMCNDb250YWN0b3JzIzMwLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjAwLjAwI0NpcmN1aXQgcHJvdGVjdGlvbiBkZXZpY2VzIGFuZCBhY2Nlc3NvcmllcyMzMC4yMS4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMC4wMS4wMCNDaXJjdWl0IGJyZWFrZXJzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjAyLjAwI01hZ25ldGljIGNpcmN1aXQgYnJlYWtlcnMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjAuMDMuMDAjTWluaWF0dXJlIGNpcmN1aXQgYnJlYWtlcnMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjAuMDQuMDAjVGltZSBkZWxheSBmdXNlcyMzMC4yMS4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMC4wNS4wMCNQbHVnIGZ1c2VzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjA2LjAwI0NhcnRyaWRnZSBmdXNlcyMzMC4yMS4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMC4wNy4wMCNHbGFzcyBib2R5IGZ1c2VzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjA4LjAwI0NsYXNzIHR5cGUgZnVzZXMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjAuMDkuMDAjTWlkZ2V0IGZ1c2VzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjEwLjAwI1N1cmdlIHN1cHByZXNzZXJzIzMwLjIxLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIwLjExLjAwI0NlcmFtaWMgZnVzZXMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjAuMTIuMDAjQmxhZGUgZnVzZXMjMzAuMjEuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDAuMDAjRWxlY3RyaWNhbCBoYXJkd2FyZSBhbmQgc3VwcGxpZXMjMzAuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDEuMDAjRWxlY3RyaWNhbCBoYW5nZXJzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjAyLjAwI0NhYmxlIGNsaXBzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjAzLjAwI0NhYmxlIHRpZXMjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDQuMDAjV2FsbHBsYXRlcyMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMS4wNS4wMCNTd2l0Y2hwbGF0ZXMjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDYuMDAjQ2FibGUgY2xhbXBzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjA3LjAwI1RyYW5zZm9ybWVyIGJ1c2hpbmdzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjA4LjAwI0hhcm5lc3MgYm9hcmQgbmFpbHMjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMDkuMDAjRGluIFJhaWwjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTAuMDAjSGFuZGxlIHRpZSMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMS4xMS4wMCNFbGVjdHJpY2FsIHJlY2VwdGFjbGUgbXVsdGlwbGllcnMjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTIuMDAjVHViaW5ncyMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMS4xMy4wMCNFbmQgY2FwcyMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMS4yMS4xNC4wMCNTcGlyYWwgd3JhcHBpbmcjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTUuMDAjR3JvbW1ldCBlZGdpbmcjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTYuMDAjQ29ycnVnYXRlZCBsb29tIHR1YmVzIzMwLjIxLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIxLjIxLjE3LjAwI0V4cGFuZGFibGUgYnJhaWRlZCBzbGVldmUjMzAuMjEuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjEuMjEuMTguMDAjQ2FibGUgdGllIG1vdW50cyMzMC4yMS4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4wMC4wMC4wMCNQZXJtYW5lbnQgc3RydWN0dXJlcyMzMC4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4xMC4wMC4wMCNDb21tZXJjaWFsIGFuZCBlbnRlcnRhaW5tZW50IHN0cnVjdHVyZXMjMzAuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMDEuMDAjU2hvcHBpbmcgbWFsbHMjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMDIuMDAjUGFya2luZyBzdHJ1Y3R1cmVzIzMwLjIyLjEwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjEwLjAzLjAwI0NhZmV0ZXJpYSMzMC4yMi4xMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4xMC4wNC4wMCNTaG9wIGJ1aWxkaW5ncyMzMC4yMi4xMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4xMC4wNS4wMCNTaG9wcGluZyBjZW50ZXIjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMDYuMDAjQ2FudGVlbiMzMC4yMi4xMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4xMC4wNy4wMCNUaGVhdGVyIzMwLjIyLjEwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjEwLjA4LjAwI0F1ZGl0b3JpdW0jMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMDkuMDAjTWFya2V0IzMwLjIyLjEwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjEwLjEwLjAwI0NoaWxkcmVucyBwbGF5IGFyZWEjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMTEuMDAjWm9vIzMwLjIyLjEwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjEwLjEyLjAwI0dhcmRlbnMjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMTMuMDAjUGFya3MjMzAuMjIuMTAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMTAuMTQuMDAjV2F0ZXJzaWRlIGxlaXN1cmUgZmFjaWxpdGllcyMzMC4yMi4xMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4wMC4wMCNUcmFuc3BvcnQgc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4wMS4wMCNTdGVlbCBicmlkZ2VzIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjAyLjAwI0RyeSBkb2NrIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjAzLjAwI0J1cyBzdGF0aW9uIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjA0LjAwI0J1cyBnYXJhZ2UjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMDUuMDAjU2VydmljZSBhcmVhIGJ1aWxkaW5nIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjA2LjAwI1JhaWx3YXkgc3RhdGlvbiMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4wNy4wMCNSYWlsd2F5IGRlcG90IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjA4LjAwI1VuZGVyZ3JvdW5kIHJhaWx3YXkgc3RhdGlvbiMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4wOS4wMCNSYWlsIHRlcm1pbmFsIGJ1aWxkaW5nIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjEwLjAwI1RyYW13YXkgZGVwb3QjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMTEuMDAjVHJhbXdheSBwbGF0Zm9ybXMjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMTIuMDAjQWlycG9ydCBidWlsZGluZ3MjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMTMuMDAjQWlycG9ydCBjb250cm9sIHRvd2VyIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjE0LjAwI0FpcmZpZWxkIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjE1LjAwI1J1bndheSMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4xNi4wMCNRdWF5IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjE3LjAwI1BpZXIjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMTguMDAjRG9jayMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4xOS4wMCNXaGFyZiMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4yMC4wMCNNYXJpbmEjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMjEuMDAjWWFjaHQgaGFyYm9yIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjIyLjAwI0JyZWFrd2F0ZXIjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMjMuMDAjU2Vhd2FsbCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4yNC4wMCNGZXJyeSB0ZXJtaW5hbCBidWlsZGluZyMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4yNS4wMCNSbyBybyB0ZXJtaW5hbCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4yNi4wMCNMaWdodGhvdXNlIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjI3LjAwI1JvYWQgYnJpZGdlIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjI4LjAwI1JhaWx3YXkgYnJpZGdlIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjI5LjAwI0Zvb3RicmlkZ2UjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMzAuMDAjUm9hZCB2aWFkdWN0IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjMxLjAwI1JhaWx3YXkgdmlhZHVjdCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC4zMi4wMCNVbmRlcnBhc3MjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMzMuMDAjT3ZlcnBhc3MjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuMzQuMDAjU3Vid2F5IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM1LjAwI0N1bHZlcnRzIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM2LjAwI1JvYWQgdHVubmVsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM3LjAwI1JhaWx3YXkgdHVubmVsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM4LjAwI1BlZGVzdHJpYW4gdHVubmVsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjM5LjAwI0NhbmFsIHR1bm5lbCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40MC4wMCNVbmRlciByaXZlciB0dW5uZWwjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNDEuMDAjVW5kZXJzZWEgdHVubmVsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjQyLjAwI0hpZ2h3YXlzIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjQzLjAwI0Nyb3Nzcm9hZCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40NC4wMCNSaW5nIHJvYWQjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNDUuMDAjVHJ1bmsgcm9hZCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40Ni4wMCNTZWNvbmRhcnkgcm9hZCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40Ny4wMCNBY2Nlc3Mgcm9hZCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC40OC4wMCNTbGlwIHJvYWQjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNDkuMDAjRHVhbCBjYXJyaWFnZXdheSMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41MC4wMCNTaW5nbGUgY2FycmlhZ2V3YXkjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNTEuMDAjUm9hZCBqdW5jdGlvbiMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41Mi4wMCNQZWRlc3RyaWFuIHdheXMjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNTMuMDAjUGVkZXN0cmlhbiBvdmVycGFzcyMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41NC4wMCNGb290cGF0aCMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41NS4wMCNDeWNsZSBwYXRoIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjU2LjAwI1BpcGVsaW5lIGNhcnJ5aW5nIGJyaWRnZSMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC41Ny4wMCNQaXBlbGluZXMjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjAuNTguMDAjUHVtcGluZyBzdGF0aW9uIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjU5LjAwI1Nld2FnZSBwdW1waW5nIHN0YXRpb25zIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjYwLjAwI1Nld2FnZSBvdXRmYWxsIzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjYxLjAwI1BhcmtpbmcgbG90IzMwLjIyLjIwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIwLjYyLjAwI1Bhcmtpbmcgc3RydWN0dXJlcyMzMC4yMi4yMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMC42My4wMCNNb3RvcndheSBzZXJ2aWNlIGFyZWEjMzAuMjIuMjAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMDAuMDAjUHVibGljIHN0cnVjdHVyZXMjMzAuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMDEuMDAjUG9zdCBvZmZpY2UjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMDIuMDAjQmFuayMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4wMy4wMCNQb2xpY2Ugc3RhdGlvbiMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4wNC4wMCNDb3VydCBidWlsZGluZyMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4wNS4wMCNQcmlzb24gYnVpbGRpbmcjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMDYuMDAjRmlyZSBzdGF0aW9uIzMwLjIyLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIxLjA3LjAwI0FtYnVsYW5jZSBzdGF0aW9uIzMwLjIyLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIxLjA4LjAwI01vdW50YWluIHJlc2N1ZSBidWlsZGluZyMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4wOS4wMCNMaWZlYm9hdCBzdGF0aW9uIzMwLjIyLjIxLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIxLjEwLjAwI0NvYXN0Z3VhcmQgYnVpbGRpbmcjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTEuMDAjUmVzY3VlIHNlcnZpY2Ugc3RhdGlvbiMzMC4yMi4yMS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMS4xMi4wMCNDaXZpYyBjZW50ZXIjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTMuMDAjQ3JlbWF0b3JpdW0jMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTQuMDAjQXJ0IGdhbGxlcnkjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTUuMDAjUHJlaGlzdG9yaWMgbW9udW1lbnQjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjEuMTYuMDAjVGlja2V0IG9mZmljZXMjMzAuMjIuMjEuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjIuMDAuMDAjVXRpbGl0aWVzIHN0cnVjdHVyZXMjMzAuMjIuMDAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjIuMDEuMDAjUmFkYXIgc3RhdGlvbiMzMC4yMi4yMi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMi4wMi4wMCNTdWJzdGF0aW9uIzMwLjIyLjIyLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIyLjAzLjAwI051Y2xlYXIgcG93ZXIgc3RhdGlvbiMzMC4yMi4yMi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMi4wNC4wMCNXYXRlciB0b3dlciMzMC4yMi4yMi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMi4wNS4wMCNXZWxscyMzMC4yMi4yMi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMi4wNi4wMCNNb2JpbGUgdGVsZXBob25lIGJhc2Ugc3RhdGlvbnMjMzAuMjIuMjIuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjIuMDcuMDAjRGFtIzMwLjIyLjIyLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIyLjA4LjAwI09pbCBvciBnYXMgcGxhdGZvcm1zIzMwLjIyLjIyLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIzLjAwLjAwI0VkdWNhdGlvbmFsIGFuZCByZXNlYXJjaCBzdHJ1Y3R1cmVzIzMwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIzLjAxLjAwI1NjaG9vbHMjMzAuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjMuMDIuMDAjUG9seXRlY2huaWMjMzAuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjMuMDMuMDAjVm9jYXRpb25hbCBjb2xsZWdlIzMwLjIyLjIzLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIzLjA0LjAwI0xlY3R1cmUgdGhlYXRlciMzMC4yMi4yMy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMy4wNS4wMCNMaWJyYXJ5IzMwLjIyLjIzLjAwLjAwCi11bnNwc2M3IzMwLjIyLjIzLjA2LjAwI0xhbmd1YWdlIGxhYm9yYXRvcnkjMzAuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjMuMDcuMDAjTGFib3JhdG9yeSBidWlsZGluZyMzMC4yMi4yMy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMy4wOC4wMCNNZXRlb3JvbG9naWNhbCBzdGF0aW9ucyMzMC4yMi4yMy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yMy4wOS4wMCNSZXNlYXJjaCBvciB0ZXN0aW5nIGZhY2lsaXRpZXMjMzAuMjIuMjMuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjQuMDAuMDAjSG9zcGl0YWwgc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNC4wMS4wMCNDbGluaWMjMzAuMjIuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjQuMDIuMDAjTnVyc2luZyBob21lIzMwLjIyLjI0LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI0LjAzLjAwI09wZXJhdGluZyB0aGVhdGVyIzMwLjIyLjI0LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI0LjA0LjAwI0ludGVuc2l2ZSBjYXJlIHVuaXQjMzAuMjIuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjQuMDUuMDAjRGlhZ25vc3RpYyBzY3JlZW5pbmcgcm9vbSMzMC4yMi4yNC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNC4wNi4wMCNTY3JlZW5pbmcgcm9vbXMjMzAuMjIuMjQuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjQuMDcuMDAjRmx1b3Jvc2NvcHkgcm9vbSMzMC4yMi4yNC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNC4wOC4wMCNQYXRob2xvZ3kgcm9vbSMzMC4yMi4yNC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNC4wOS4wMCNDYXRoZXRlciByb29tIzMwLjIyLjI0LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI1LjAwLjAwI0FjY29tbW9kYXRpb24gc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wMS4wMCNSZXNpZGVudGlhbCBob21lcyMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wMi4wMCNGbGF0cyMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wMy4wMCNDaGlsZHJlbnMgaG9tZSMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wNC4wMCNEYXljYXJlIGNlbnRlciMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wNS4wMCNSZXRpcmVtZW50IGhvbWUjMzAuMjIuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjUuMDYuMDAjT2xkIHBlb3BsZXMgaG9tZSMzMC4yMi4yNS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNS4wNy4wMCNIb3N0ZWwjMzAuMjIuMjUuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjYuMDAuMDAjU3BvcnRzIGFuZCBoZWFsdGggc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNi4wMS4wMCNTdGFkaXVtIzMwLjIyLjI2LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI2LjAyLjAwI1Nwb3J0cyBncm91bmQjMzAuMjIuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjYuMDMuMDAjUnVubmluZyB0cmFjayMzMC4yMi4yNi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNi4wNC4wMCNTcG9ydHMgaGFsbCMzMC4yMi4yNi4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNi4wNS4wMCNTcGEjMzAuMjIuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjYuMDYuMDAjR3ltbmFzaXVtIzMwLjIyLjI2LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI2LjA3LjAwI1N3aW1taW5nIHBvb2wjMzAuMjIuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjYuMDguMDAjV2F0ZXIgc3BvcnRzIGZhY2lsaXRpZXMjMzAuMjIuMjYuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjcuMDAuMDAjSW5kdXN0cmlhbCBzdHJ1Y3R1cmVzIzMwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjI3LjAxLjAwI1dvcmtzaG9wcyMzMC4yMi4yNy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNy4wMi4wMCNDb2xkIHN0b3JhZ2UgaW5zdGFsbGF0aW9ucyMzMC4yMi4yNy4wMC4wMAotdW5zcHNjNyMzMC4yMi4yNy4wMy4wMCNXYXJlaG91c2Ugc3RvcmVzIzMwLjIyLjI3LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI4LjAwLjAwI0FncmljdWx0dXJhbCBhbmQgZmFybWluZyBhbmQgZmlzaGluZyBzdHJ1Y3R1cmVzIzMwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjI4LjAxLjAwI0Jhcm4jMzAuMjIuMjguMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjguMDIuMDAjQ293c2hlZHMjMzAuMjIuMjguMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjguMDMuMDAjSXJyaWdhdGlvbiBjaGFubmVsIzMwLjIyLjI4LjAwLjAwCi11bnNwc2M3IzMwLjIyLjI5LjAwLjAwI0RlZmVuc2Ugc3RydWN0dXJlcyMzMC4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMC4yMi4yOS4wMS4wMCNNaWxpdGFyeSBidW5rZXIjMzAuMjIuMjkuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMjkuMDIuMDAjTWlsaXRhcnkgc2hlbHRlciMzMC4yMi4yOS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yOS4wMy4wMCNCYXJyYWNrcyMzMC4yMi4yOS4wMC4wMAotdW5zcHNjNyMzMC4yMi4yOS4wNC4wMCNNaWxpdGFyeSBtZXNzIzMwLjIyLjI5LjAwLjAwCi11bnNwc2M3IzMwLjIyLjMwLjAwLjAwI1JlbGlnaW91cyBzdHJ1Y3R1cmVzIzMwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjMwLjAxLjAwI0NodXJjaGVzIzMwLjIyLjMwLjAwLjAwCi11bnNwc2M3IzMwLjIyLjMwLjAyLjAwI1RlbXBsZXMjMzAuMjIuMzAuMDAuMDAKLXVuc3BzYzcjMzAuMjIuMzAuMDMuMDAjTW9zcXVlcyMzMC4yMi4zMC4wMC4wMAotdW5zcHNjNyMzMS4wMC4wMC4wMC4wMCNNYW51ZmFjdHVyaW5nIENvbXBvbmVudHMgYW5kIFN1cHBsaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjAwLjAwLjAwI0Nhc3RpbmdzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjE1LjAwLjAwI0RpZSBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4wMS4wMCNBbHVtaW51bSBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDIuMDAjRmVycm91cyBhbGxveSBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDMuMDAjSXJvbiBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDQuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZGllIGNhc3RpbmdzIzMxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE1LjA1LjAwI1N0YWlubGVzcyBzdGVlbCBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDYuMDAjU3RlZWwgZGllIGNhc3RpbmdzIzMxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE1LjA3LjAwI01hZ25lc2l1bSBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDguMDAjWmluYyBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMDkuMDAjVGluIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4xMC4wMCNUaXRhbml1bSBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMTEuMDAjQmVyeWxsaXVtIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4xMi4wMCNQcmVjaW91cyBtZXRhbCBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMTMuMDAjQ29wcGVyIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4xNC4wMCNMZWFkIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNS4xNS4wMCNCcmFzcyBkaWUgY2FzdGluZ3MjMzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTUuMTYuMDAjQnJvbnplIGRpZSBjYXN0aW5ncyMzMS4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4wMC4wMCNTYW5kIGNhc3RpbmdzIzMxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDIuMDAjRmVycm91cyBhbGxveSBzYW5kIGNhc3RpbmdzIzMxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjAzLjAwI1N0ZWVsIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDUuMDAjSXJvbiBzYW5kIGNhc3RpbmdzIzMxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjA2LjAwI0FsdW1pbnVtIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDcuMDAjTWFnbmVzaXVtIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMDguMDAjVGl0YW5pdW0gc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4wOS4wMCNCZXJ5bGxpdW0gc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4xMC4wMCNDb3BwZXIgc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4xMS4wMCNCcmFzcyBzYW5kIGNhc3RpbmdzIzMxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjEyLjAwI0Jyb256ZSBzYW5kIGNhc3RpbmdzIzMxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE2LjEzLjAwI1ppbmMgc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4xNC4wMCNUaW4gc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNi4xNS4wMCNMZWFkIHNhbmQgY2FzdGluZ3MjMzEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTYuMTYuMDAjUHJlY2lvdXMgbWV0YWwgc2FuZCBjYXN0aW5ncyMzMS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wMC4wMCNQZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wMS4wMCNOb24gZmVycm91cyBhbGxveSBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wMi4wMCNGZXJyb3VzIGFsbG95IHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjAzLjAwI1N0ZWVsIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjA0LjAwI1N0YWlubGVzcyBzdGVlbCBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wNS4wMCNJcm9uIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjA2LjAwI0FsdW1pbnVtIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjA3LjAwI01hZ25lc2l1bSBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wOC4wMCNUaXRhbml1bSBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4wOS4wMCNCZXJ5bGxpdW0gcGVybWFuZW50IG1vbGQgY2FzdGluZ3MjMzEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTcuMTAuMDAjQ29wcGVyIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjExLjAwI0JyYXNzIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjEyLjAwI0Jyb256ZSBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4xMy4wMCNaaW5jIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjE0LjAwI1RpbiBwZXJtYW5lbnQgbW9sZCBjYXN0aW5ncyMzMS4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMC4xNy4xNS4wMCNMZWFkIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE3LjE2LjAwI1ByZWNpb3VzIG1ldGFsIHBlcm1hbmVudCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjAwLjAwI1NoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wMi4wMCNGZXJyb3VzIGFsbG95IHNoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMDMuMDAjU3RlZWwgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wNS4wMCNJcm9uIHNoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMDYuMDAjQWx1bWludW0gc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wNy4wMCNNYWduZXNpdW0gc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4wOC4wMCNUaXRhbml1bSBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjA5LjAwI0JlcnlsbGl1bSBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjEwLjAwI0NvcHBlciBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjExLjAwI0JyYXNzIHNoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMTIuMDAjQnJvbnplIHNoZWxsIG1vbGQgY2FzdGluZ3MjMzEuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTguMTMuMDAjWmluYyBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjE0LjAwI1RpbiBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE4LjE1LjAwI0xlYWQgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOC4xNi4wMCNQcmVjaW91cyBzaGVsbCBtb2xkIGNhc3RpbmdzIzMxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE5LjAwLjAwI0ludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wMi4wMCNGZXJyb3VzIGFsbG95IGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMDMuMDAjU3RlZWwgaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wNS4wMCNJcm9uIGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMDYuMDAjQWx1bWludW0gaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wNy4wMCNNYWduZXNpdW0gaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4xOS4wOC4wMCNaaW5jIGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMDkuMDAjVGluIGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMTAuMDAjTGVhZCBpbnZlc3RtZW50IGNhc3RpbmdzIzMxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEwLjE5LjExLjAwI1ByZWNpb3VzIG1ldGFsIGludmVzdG1lbnQgY2FzdGluZ3MjMzEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMTkuMTIuMDAjVGl0YW5pdW0gaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMC4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wMC4wMCNDZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wMS4wMCNOb24gZmVycm91cyBhbGxveSBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wMi4wMCNGZXJyb3VzIGFsbG95IGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjAzLjAwI1N0ZWVsIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wNS4wMCNJcm9uIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjA2LjAwI0FsdW1pbnVtIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjA3LjAwI01hZ25lc2l1bSBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wOC4wMCNUaXRhbml1bSBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4wOS4wMCNCZXJ5bGxpdW0gY2VudHJpZnVnYWwgY2FzdGluZ3MjMzEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjAuMTAuMDAjQ29wcGVyIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjExLjAwI0JyYXNzIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjEyLjAwI0Jyb256ZSBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4xMy4wMCNaaW5jIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjE0LjAwI1RpbiBjZW50cmlmdWdhbCBjYXN0aW5ncyMzMS4xMC4yMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMC4xNS4wMCNMZWFkIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIwLjE2LjAwI1ByZWNpb3VzIG1ldGFsIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjAwLjAwI0NlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMS4wMS4wMCNOb24gZmVycm91cyBhbGxveSBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDIuMDAjRmVycm91cyBhbGxveSBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDMuMDAjU3RlZWwgY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDUuMDAjSXJvbiBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDYuMDAjQWx1bWludW0gY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjA3LjAwI01hZ25lc2l1bSBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMDguMDAjVGl0YW5pdW0gY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjA5LjAwI0JlcnlsbGl1bSBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMTAuMDAjQ29wcGVyIGNlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMS4xMS4wMCNCcmFzcyBjZXJhbWljIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjEuMTIuMDAjQnJvbnplIGNlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMS4xMy4wMCNaaW5jIGNlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMS4xNC4wMCNUaW4gY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjE1LjAwI0xlYWQgY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIxLjE2LjAwI1ByZWNpb3VzIG1ldGFsIGNlcmFtaWMgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMS4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4wMC4wMCNHcmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMDIuMDAjRmVycnJvdXMgYWxsb3kgZ3JhcGhpdGUgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4wMy4wMCNTdGVlbCBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjA1LjAwI0lyb24gZ3JhcGhpdGUgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4wNi4wMCNBbHVtaW51bSBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjA3LjAwI01hZ25lc2l1bSBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjA4LjAwI1RpdGFuaXVtIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMDkuMDAjQmVyeWxsaXVtIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMTAuMDAjQ29wcGVyIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMTEuMDAjQnJhc3MgZ3JhcGhpdGUgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4xMi4wMCNCcm9uemUgZ3JhcGhpdGUgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMi4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMi4xMy4wMCNaaW5jIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMTQuMDAjVGluIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjIuMTUuMDAjTGVhZCBncmFwaGl0ZSBtb2xkIGNhc3RpbmdzIzMxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIyLjE2LjAwI1ByZWNpb3VzIG1ldGFsIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMDAuMDAjUGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIzLjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wMi4wMCNGZXJyb3VzIGFsbG95IHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wMy4wMCNTdGVlbCBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wNS4wMCNJcm9uIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wNi4wMCNBbHVtaW51bSBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMDcuMDAjTWFnbmVzaXVtIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4wOC4wMCNUaXRhbml1bSBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMDkuMDAjQmVyeWxsaXVtIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4xMC4wMCNDb3BwZXIgcGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIzLjExLjAwI0JyYXNzIHBsYXN0ZXIgbW9sZCBjYXN0aW5ncyMzMS4xMC4yMy4wMC4wMAotdW5zcHNjNyMzMS4xMC4yMy4xMi4wMCNCcm9uemUgcGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIzLjEzLjAwI1ppbmMgcGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMxLjEwLjIzLjE0LjAwI1RpbiBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMTUuMDAjTGVhZCBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjMuMTYuMDAjUHJlY2lvdXMgbWV0YWwgcGxhc3RlciBtb2xkIGNhc3RpbmdzIzMxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjAwLjAwI1YgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yNC4wMS4wMCNOb24gZmVycm91cyBhbGxveSB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDIuMDAjRmVycm91cyBhbGxveSB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDMuMDAjU3RlZWwgdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjA0LjAwI1N0YWlubGVzcyBzdGVlbCB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDUuMDAjSXJvbiB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDYuMDAjQWx1bWludW0gdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjA3LjAwI01hZ25lc2l1bSB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMDguMDAjVGl0YW5pdW0gdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjA5LjAwI0JlcnlsbGl1bSB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMTAuMDAjQ29wcGVyIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yNC4xMS4wMCNCcmFzcyB2IHByb2Nlc3MgY2FzdGluZ3MjMzEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTAuMjQuMTIuMDAjQnJvbnplIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yNC4xMy4wMCNaaW5jIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMS4xMC4yNC4xNC4wMCNUaW4gdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjE1LjAwI0xlYWQgdiBwcm9jZXNzIGNhc3RpbmdzIzMxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzMxLjEwLjI0LjE2LjAwI1ByZWNpb3VzIG1ldGFsIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMC4yNC4wMC4wMAotdW5zcHNjNyMzMS4xMS4wMC4wMC4wMCNFeHRydXNpb25zIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjAwLjAwI1Byb2ZpbGUgZXh0cnVzaW9ucyMzMS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNS4wMS4wMCNBbHVtaW51bSBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMDIuMDAjQmVyeWxsaXVtIHByb2ZpbGUgZXh0cnVzaW9ucyMzMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNS4wMy4wMCNCcmFzcyBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMDQuMDAjQnJvbnplIHByb2ZpbGUgZXh0cnVzaW9ucyMzMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNS4wNS4wMCNDb3BwZXIgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjA2LjAwI0ZlcnJvdXMgYWxsb3kgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjA3LjAwI0xlYWQgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjA4LjAwI01hZ25lc2l1bSBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMDkuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjEwLjAwI1BsYXN0aWMgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjExLjAwI1ByZWNpb3VzIG1ldGFsIHByb2ZpbGUgZXh0cnVzaW9ucyMzMS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNS4xMi4wMCNSdWJiZXIgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjEzLjAwI1N0YWlubGVzcyBzdGVlbCBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMTQuMDAjU3RlZWwgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjE1LjAwI1RpbiBwcm9maWxlIGV4dHJ1c2lvbnMjMzEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTUuMTYuMDAjVGl0YW5pdW0gcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE1LjE3LjAwI1ppbmMgcHJvZmlsZSBleHRydXNpb25zIzMxLjExLjE1LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjAwLjAwI0ltcGFjdCBleHRydXNpb25zIzMxLjExLjAwLjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjAxLjAwI0FsdW1pbnVtIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjAyLjAwI0JlcnlsbGl1bSBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4wMy4wMCNCcmFzcyBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4wNC4wMCNCcm9uemUgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMDUuMDAjQ29wcGVyIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjA2LjAwI0ZlcnJvdXMgYWxsb3kgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMDcuMDAjTGVhZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4wOC4wMCNNYWduZXNpdW0gaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMDkuMDAjTm9uIGZlcnJvdXMgYWxsb3kgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMTAuMDAjUGxhc3RpYyBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4xMS4wMCNQcmVjaW91cyBtZXRhbCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4xMi4wMCNSdWJiZXIgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTYuMTMuMDAjU3RhaW5sZXNzIHN0ZWVsIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjE0LjAwI1N0ZWVsIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE2LjE1LjAwI1RpbiBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4xNi4wMCNUaXRhbml1bSBpbXBhY3QgZXh0cnVzaW9ucyMzMS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNi4xNy4wMCNaaW5jIGltcGFjdCBleHRydXNpb25zIzMxLjExLjE2LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjAwLjAwI0NvbGQgZXh0cnVzaW9ucyMzMS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNy4wMS4wMCNBbHVtaW51bSBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMDIuMDAjQmVyeWxsaXVtIGNvbGQgZXh0cnVzaW9ucyMzMS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNy4wMy4wMCNCcmFzcyBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMDQuMDAjQnJvbnplIGNvbGQgZXh0cnVzaW9ucyMzMS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNy4wNS4wMCNDb3BwZXIgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjA2LjAwI0ZlcnJvdXMgYWxsb3kgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjA3LjAwI0xlYWQgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjA4LjAwI01hZ25lc2l1bSBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMDkuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjEwLjAwI1BsYXN0aWMgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjExLjAwI1ByZWNpb3VzIG1ldGFsIGNvbGQgZXh0cnVzaW9ucyMzMS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMS4xNy4xMi4wMCNSdWJiZXIgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjEzLjAwI1N0YWlubGVzcyBzdGVlbCBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMTQuMDAjU3RlZWwgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjE1LjAwI1RpbiBjb2xkIGV4dHJ1c2lvbnMjMzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTEuMTcuMTYuMDAjVGl0YW5pdW0gY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjExLjE3LjE3LjAwI1ppbmMgY29sZCBleHRydXNpb25zIzMxLjExLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjAwLjAwLjAwI01hY2hpbmVkIGNhc3RpbmdzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjAwLjAwI01hY2hpbmVkIHYgcHJvY2VzcyBjYXN0aW5ncyMzMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4wMS4wMCNOb24gZmVycm91cyBhbGxveSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDIuMDAjRmVycm91cyBhbGxveSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDMuMDAjU3RlZWwgdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjA0LjAwI1N0YWlubGVzcyBzdGVlbCB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDUuMDAjSXJvbiB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDYuMDAjQWx1bWludW0gdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjA3LjAwI01hZ25lc2l1bSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMDguMDAjVGl0YW5pdW0gdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjA5LjAwI0JlcnlsbGl1bSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMTAuMDAjQ29wcGVyIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4xMS4wMCNCcmFzcyB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMTIuMDAjQnJvbnplIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4xMy4wMCNaaW5jIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4xNC4wMCNUaW4gdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjE1LjAwI0xlYWQgdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjE2LjAwI1ByZWNpb3VzIG1ldGFsIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMC4xNy4wMCNDb21wb3NpdGUgdiBwcm9jZXNzIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEwLjE4LjAwI05pY2tlbCBhbGxveSB2IHByb2Nlc3MgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTAuMTkuMDAjTm9uIG1ldGFsbGljIHYgcHJvY2VzcyBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMS4wMC4wMCNNYWNoaW5lZCBkaWUgY2FzdGluZ3MjMzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMDEuMDAjQWx1bWludW0gZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjAyLjAwI0ZlcnJvdXMgYWxsb3kgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjAzLjAwI0lyb24gZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjA0LjAwI05vbiBmZXJyb3VzIGFsbG95IGRpZSBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMS4wNS4wMCNTdGFpbmxlc3Mgc3RlZWwgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjA2LjAwI1N0ZWVsIGRpZSBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMS4wNy4wMCNNYWduZXNpdW0gZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjA4LjAwI1ppbmMgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjA5LjAwI1RpbiBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTAuMDAjVGl0YW5pdW0gZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjExLjAwI0JlcnlsbGl1bSBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTIuMDAjUHJlY2lvdXMgbWV0YWwgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjEzLjAwI0NvcHBlciBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTQuMDAjTGVhZCBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTUuMDAjQnJhc3MgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjE2LjAwI0Jyb256ZSBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTEuMTcuMDAjQ29tcG9zaXRlIGRpZSBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMS4xOC4wMCNOaWNrZWwgQWxsb3kgZGllIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjExLjAwLjAwCi11bnNwc2M3IzMxLjEyLjExLjE5LjAwI05vbiBtZXRhbGxpYyBkaWUgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMDAuMDAjTWFjaGluZWQgc2FuZCBjYXN0aW5ncyMzMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4wMS4wMCNOb24gZmVycm91cyBhbGxveSBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjAyLjAwI0ZlcnJvdXMgYWxsb3kgc2FuZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4wMy4wMCNTdGVlbCBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjA1LjAwI0lyb24gc2FuZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4wNi4wMCNBbHVtaW51bSBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjA3LjAwI01hZ25lc2l1bSBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjA4LjAwI1RpdGFuaXVtIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMDkuMDAjQmVyeWxsaXVtIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTAuMDAjQ29wcGVyIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTEuMDAjQnJhc3Mgc2FuZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4xMi4wMCNCcm9uemUgc2FuZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMi4xMy4wMCNaaW5jIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTQuMDAjVGluIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTUuMDAjTGVhZCBzYW5kIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEyLjE2LjAwI1ByZWNpb3VzIG1ldGFsIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTcuMDAjQ29tcG9zaXRlIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTguMDAjTmlja2VsIEFsbG95IHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTIuMTkuMDAjTm9uIG1ldGFsbGljIHNhbmQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDAuMDAjTWFjaGluZWQgcGVybWFuZW50IG1vbGQgY2FzdGluZ3MjMzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDIuMDAjRmVycm91cyBhbGxveSBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4wMy4wMCNTdGVlbCBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDUuMDAjSXJvbiBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4wNi4wMCNBbHVtaW51bSBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4wNy4wMCNNYWduZXNpdW0gcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDguMDAjVGl0YW5pdW0gcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMDkuMDAjQmVyeWxsaXVtIHBlcm1hbmVudCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEzLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEzLjEwLjAwI0NvcHBlciBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xMS4wMCNCcmFzcyBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xMi4wMCNCcm9uemUgcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMTMuMDAjWmluYyBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xNC4wMCNUaW4gcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMTUuMDAjTGVhZCBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xNi4wMCNQcmVjaW91cyBtZXRhbCBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xMy4xNy4wMCNDb21wb3NpdGUgcGVybWFuZW50IG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTMuMTguMDAjTmlja2VsIGFsbG95IHBlcm1hbmVudCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjEzLjAwLjAwCi11bnNwc2M3IzMxLjEyLjEzLjE5LjAwI05vbiBtZXRhbGxpYyBwZXJtYW5lbnQgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4wMC4wMCNNYWNoaW5lZCBwbGFzdGVyIG1vbGQgY2FzdGluZ3MjMzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjAyLjAwI0ZlcnJvdXMgYWxsb3kgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjAzLjAwI1N0ZWVsIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjA1LjAwI0lyb24gcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjA2LjAwI0FsdW1pbnVtIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4wNy4wMCNNYWduZXNpdW0gcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjA4LjAwI1RpdGFuaXVtIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4wOS4wMCNCZXJ5bGxpdW0gcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjEwLjAwI0NvcHBlciBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMTEuMDAjQnJhc3MgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjEyLjAwI0Jyb256ZSBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMTMuMDAjWmluYyBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMTQuMDAjVGluIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4xNS4wMCNMZWFkIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4xNi4wMCNQcmVjaW91cyBtZXRhbCBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTQuMTcuMDAjQ29tcG9zaXRlIHBsYXN0ZXIgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNC4xOC4wMCNOaWNrZWwgYWxsb3kgcGxhc3RlciBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE0LjE5LjAwI05vbiBtZXRhbGxpYyBwbGFzdGVyIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMDAuMDAjTWFjaGluZWQgc2hlbGwgbW9sZCBjYXN0aW5ncyMzMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4wMS4wMCNOb24gZmVycm91cyBhbGxveSBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjAyLjAwI0ZlcnJvdXMgYWxsb3kgc2hlbGwgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4wMy4wMCNTdGVlbCBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjA0LjAwI1N0YWlubGVzcyBzdGVlbCBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjA1LjAwI0lyb24gc2hlbGwgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4wNi4wMCNBbHVtaW51bSBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjA3LjAwI01hZ25lc2l1bSBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjA4LjAwI1RpdGFuaXVtIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMDkuMDAjQmVyeWxsaXVtIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTAuMDAjQ29wcGVyIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTEuMDAjQnJhc3Mgc2hlbGwgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4xMi4wMCNCcm9uemUgc2hlbGwgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNS4xMy4wMCNaaW5jIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTQuMDAjVGluIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTUuMDAjTGVhZCBzaGVsbCBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE1LjE2LjAwI1ByZWNpb3VzIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTcuMDAjQ29tcG9zaXRlIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTguMDAjTmlja2VsIGFsbG95IHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTUuMTkuMDAjTm9uIG1ldGFsbGljIHNoZWxsIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTYuMDAuMDAjTWFjaGluZWQgaW52ZXN0bWVudCBjYXN0aW5ncyMzMS4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4wMS4wMCNOb24gZmVycm91cyBhbGxveSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjAyLjAwI0ZlcnJvdXMgYWxsb3kgaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4wMy4wMCNTdGVlbCBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjA0LjAwI1N0YWlubGVzcyBzdGVlbCBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjA1LjAwI0lyb24gaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4wNi4wMCNBbHVtaW51bSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjA3LjAwI01hZ25lc2l1bSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjA4LjAwI1ppbmMgaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4wOS4wMCNUaW4gaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4xMC4wMCNMZWFkIGludmVzdG1lbnQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTYuMTEuMDAjUHJlY2lvdXMgbWV0YWwgaW52ZXN0bWVudCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNi4xMi4wMCNUaXRhbml1bSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjEzLjAwI0NvbXBvc2l0ZSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjE0LjAwI05pY2tlbCBhbGxveSBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE2LjE1LjAwI05vbiBtZXRhbGxpYyBpbnZlc3RtZW50IG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjAwLjAwI01hY2hpbmVkIGNlbnRyaWZ1Z2FsIGNhc3RpbmdzIzMxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjAyLjAwI0ZlcnJvdXMgYWxsb3kgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMDMuMDAjU3RlZWwgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjA1LjAwI0lyb24gY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMDYuMDAjQWx1bWludW0gY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMDcuMDAjTWFnbmVzaXVtIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjA4LjAwI1RpdGFuaXVtIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjA5LjAwI0JlcnlsbGl1bSBjZW50cmlmdWdhbCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNy4xMC4wMCNDb3BwZXIgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTEuMDAjQnJhc3MgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTIuMDAjQnJvbnplIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjEzLjAwI1ppbmMgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTQuMDAjVGluIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjE1LjAwI0xlYWQgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTYuMDAjUHJlY2lvdXMgbWV0YWwgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTcuMTcuMDAjQ29tcG9zaXRlIGNlbnRyaWZ1Z2FsIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE3LjE4LjAwI05pY2tlbCBhbGxveSBjZW50cmlmdWdhbCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMi4xNy4xOS4wMCNOb24gbWV0YWxsaWMgY2VudHJpZnVnYWwgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMDAuMDAjTWFjaGluZWQgY2VyYW1pYyBtb2xkIGNhc3RpbmdzIzMxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wMi4wMCNGZXJyb3VzIGFsbG95IGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wMy4wMCNTdGVlbCBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wNS4wMCNJcm9uIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wNi4wMCNBbHVtaW51bSBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMDcuMDAjTWFnbmVzaXVtIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4wOC4wMCNUaXRhbml1bSBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMDkuMDAjQmVyeWxsaXVtIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4xMC4wMCNDb3BwZXIgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjExLjAwI0JyYXNzIGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4xMi4wMCNCcm9uemUgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjEzLjAwI1ppbmMgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjE0LjAwI1RpbiBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMTUuMDAjTGVhZCBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMTYuMDAjUHJlY2lvdXMgbWV0YWwgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE4LjE3LjAwI0NvbXBvc2l0ZSBjZXJhbWljIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTguMTguMDAjTmlja2VsIGFsbG95IGNlcmFtaWMgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOC4xOS4wMCNOb24gbWV0YWxsaWMgY2VyYW1pYyBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjAwLjAwI01hY2hpbmVkIGdyYXBoaXRlIG1vbGQgY2FzdGluZ3MjMzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4wMi4wMCNGZXJycm91cyBhbGxveSBncmFwaGl0ZSBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjAzLjAwI1N0ZWVsIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDUuMDAjSXJvbiBncmFwaGl0ZSBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjA2LjAwI0FsdW1pbnVtIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDcuMDAjTWFnbmVzaXVtIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMDguMDAjVGl0YW5pdW0gZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4wOS4wMCNCZXJ5bGxpdW0gZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xMC4wMCNDb3BwZXIgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xMS4wMCNCcmFzcyBncmFwaGl0ZSBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjEyLjAwI0Jyb256ZSBncmFwaGl0ZSBtb2xkIG1hY2hpbmVkIGNhc3RpbmdzIzMxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEyLjE5LjEzLjAwI1ppbmMgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xNC4wMCNUaW4gZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xNS4wMCNMZWFkIGdyYXBoaXRlIG1vbGQgbWFjaGluZWQgY2FzdGluZ3MjMzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTIuMTkuMTYuMDAjUHJlY2lvdXMgbWV0YWwgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xNy4wMCNDb21wb3NpdGUgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xOC4wMCNOaWNrZWwgYWxsb3kgbWV0YWwgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMi4xOS4xOS4wMCNOb24gbWV0YWxsaWMgZ3JhcGhpdGUgbW9sZCBtYWNoaW5lZCBjYXN0aW5ncyMzMS4xMi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4wMC4wMC4wMCNGb3JnaW5ncyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wMC4wMCNPcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wMS4wMCNOb24gZmVycm91cyBhbGxveSBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wMi4wMCNGZXJyb3VzIGFsbG95IG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjAzLjAwI1N0ZWVsIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjA0LjAwI1N0YWlubGVzcyBzdGVlbCBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wNS4wMCNJcm9uIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjA2LjAwI0FsdW1pbnVtIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjA3LjAwI01hZ25lc2l1bSBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wOC4wMCNUaXRhbml1bSBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4wOS4wMCNCZXJ5bGxpdW0gb3BlbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTUuMTAuMDAjQ29wcGVyIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjExLjAwI0JyYXNzIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjEyLjAwI0Jyb256ZSBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4xMy4wMCNaaW5jIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjE0LjAwI1RpbiBvcGVuIGRpZSBmb3JnaW5ncyMzMS4xMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNS4xNS4wMCNMZWFkIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE1LjE2LjAwI1ByZWNpb3VzIG1ldGFsIG9wZW4gZGllIGZvcmdpbmdzIzMxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjAwLjAwI0Nsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wMi4wMCNGZXJyb3VzIGFsbG95IGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMDMuMDAjU3RlZWwgY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wNS4wMCNJcm9uIGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMDYuMDAjQWx1bWludW0gY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wNy4wMCNNYWduZXNpdW0gY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4wOC4wMCNUaXRhbml1bSBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjA5LjAwI0JlcnlsbGl1bSBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjEwLjAwI0NvcHBlciBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjExLjAwI0JyYXNzIGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMTIuMDAjQnJvbnplIGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTYuMTMuMDAjWmluYyBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjE0LjAwI1RpbiBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE2LjE1LjAwI0xlYWQgY2xvc2VkIGRpZSBmb3JnaW5ncyMzMS4xMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNi4xNi4wMCNQcmVjaW91cyBtZXRhbCBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjAwLjAwI0ltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjAwLjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjAyLjAwI0ZlcnJvdXMgYWxsb3kgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMDMuMDAjU3RlZWwgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjA1LjAwI0lyb24gaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMDYuMDAjQWx1bWludW0gaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMDcuMDAjTWFnbmVzaXVtIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjA4LjAwI1RpdGFuaXVtIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjA5LjAwI0JlcnlsbGl1bSBpbXByZXNzaW9uIGRpZSBmb3JnaW5ncyMzMS4xMy4xNy4wMC4wMAotdW5zcHNjNyMzMS4xMy4xNy4xMC4wMCNDb3BwZXIgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMTEuMDAjQnJhc3MgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMTIuMDAjQnJvbnplIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjEzLjAwI1ppbmMgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMTQuMDAjVGluIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE3LjE1LjAwI0xlYWQgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTcuMTYuMDAjUHJlY2lvdXMgbWV0YWwgaW1wcmVzc2lvbiBkaWUgZm9yZ2luZ3MjMzEuMTMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMDAuMDAjRHJvcCBmb3JnaW5ncyMzMS4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4wMS4wMCNOb24gZmVycm91cyBhbGxveSBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjAyLjAwI1ppbmMgZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4wMy4wMCNGZXJyb3VzIGFsbG95IGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMDQuMDAjVGluIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMDUuMDAjTGVhZCBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjA2LjAwI1N0ZWVsIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMDcuMDAjUHJlY2lvdXMgbWV0YWwgZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4wOC4wMCNTdGFpbmxlc3Mgc3RlZWwgZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4wOS4wMCNJcm9uIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMTAuMDAjQWx1bWludW0gZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4xMS4wMCNNYWduZXNpdW0gZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOC4xMi4wMCNUaXRhbml1bSBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjEzLjAwI0JlcnlsbGl1bSBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjE0LjAwI0NvcHBlciBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjE1LjAwI0JyYXNzIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMTYuMDAjQnJvbnplIGRyb3AgZm9yZ2luZ3MjMzEuMTMuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTguMTcuMDAjQ29sZCBzdGVlbCBkcm9wIGZvcmdpbmdzIzMxLjEzLjE4LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE4LjE4LjAwI1NlbWkgZmluaXNoZWQgZHJvcCBmb3JnaW5ncyMzMS4xMy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4wMC4wMCNSb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4wMS4wMCNBbHVtaW51bSByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4wMi4wMCNCZXJ5bGxpdW0gcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMDMuMDAjQnJhc3Mgcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMDQuMDAjQnJvbnplIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjA1LjAwI0NvcHBlciByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4wNi4wMCNJcm9uIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjA3LjAwI0xlYWQgcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMDguMDAjTWFnbmVzaXVtIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjA5LjAwI1ByZWNpb3VzIG1ldGFsIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjEwLjAwI1N0YWlubGVzcyBzdGVlbCByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4xMS4wMCNUaW4gcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMTIuMDAjVGl0YW5pdW0gcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMTMuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMTkuMTMuMDAjWmluYyByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4xNC4wMCNOb24gZmVycm91cyBhbGxveSByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4xMy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xMy4xOS4xNS4wMCNGZXJyb3VzIGFsbG95IHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjE5LjE2LjAwI1N0ZWVsIHJvbGxlZCByaW5nIGZvcmdpbmdzIzMxLjEzLjE5LjAwLjAwCi11bnNwc2M3IzMxLjEzLjIwLjAwLjAwI1Bvd2RlcmVkIG1ldGFsIGNvbXBvbmVudHMjMzEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTMuMjAuMDEuMDAjRmVycm91cyBwb3dkZXJlZCBtZXRhbCBjb21wb25lbnRzIzMxLjEzLjIwLjAwLjAwCi11bnNwc2M3IzMxLjEzLjIwLjAyLjAwI05vbiBmZXJyb3VzIHBvd2RlcmVkIG1ldGFsIHBhcnRzIzMxLjEzLjIwLjAwLjAwCi11bnNwc2M3IzMxLjE0LjAwLjAwLjAwI01vbGRpbmdzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjE0LjE1LjAwLjAwI0luamVjdGlvbiBtb2xkaW5ncyMzMS4xNC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNS4wMS4wMCNQbGFzdGljIGluamVjdGlvbiBtb2xkaW5ncyMzMS4xNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNS4wMi4wMCNSdWJiZXIgaW5qZWN0aW9uIG1vbGRpbmdzIzMxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE0LjE1LjAzLjAwI0dsYXNzIGluamVjdGlvbiBtb2xkaW5ncyMzMS4xNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNi4wMC4wMCNWYWN1dW0gbW9sZGluZ3MjMzEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTYuMDEuMDAjUGxhc3RpYyB2YWN1dW0gbW9sZGluZ3MjMzEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTYuMDIuMDAjUnViYmVyIHZhY3V1bSBtb2xkaW5ncyMzMS4xNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNi4wMy4wMCNHbGFzcyB2YWN1dW0gbW9sZGluZ3MjMzEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTcuMDAuMDAjQmxvdyBtb2xkaW5ncyMzMS4xNC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNC4xNy4wMS4wMCNQbGFzdGljIGJsb3cgbW9sZGluZ3MjMzEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTcuMDIuMDAjUnViYmVyIGJsb3cgbW9sZGluZ3MjMzEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTQuMTguMDAuMDAjUmVhY3Rpb24gaW5qZWN0aW9uIG1vbGRpbmdzIChSSU0pIzMxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE0LjE4LjAxLjAwI1BsYXN0aWMgcmVhY3Rpb24gaW5qZWN0aW9uIG1vbGRpbmdzIzMxLjE0LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE0LjE4LjAyLjAwI1J1YmJlciByZWFjdGlvbiBpbmplY3Rpb24gbW9sZGluZ3MjMzEuMTQuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTUuMDAuMDAuMDAjUm9wZSBhbmQgY2hhaW4gYW5kIGNhYmxlIGFuZCB3aXJlIGFuZCBzdHJhcCMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wMC4wMCNSb3BlcyMzMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wMS4wMCNDb3R0b24gcm9wZSMzMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wMi4wMCNQb2x5ZXN0ZXIgcm9wZSMzMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wMy4wMCNQb2x5cHJvcHlsZW5lIHJvcGUjMzEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTUuMDQuMDAjTnlsb24gcm9wZSMzMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wNS4wMCNXaXJlIHJvcGUjMzEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTUuMDYuMDAjSGVtcCByb3BlIzMxLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE1LjA3LjAwI1N0cmluZyBvciB0d2luZSMzMS4xNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNS4wOC4wMCNTaXNhbCByb3BlIzMxLjE1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE2LjAwLjAwI0NoYWlucyMzMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wMS4wMCNTYWZldHkgY2hhaW5zIzMxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE2LjAyLjAwI1NraWQgY2hhaW5zIzMxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE2LjAzLjAwI1JvbGxlciBjaGFpbnMjMzEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTYuMDQuMDAjUHJvb2YgY29pbCBjaGFpbnMjMzEuMTUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTYuMDUuMDAjU2FzaCBjaGFpbiMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wNi4wMCNKYWNrIGNoYWlucyMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wNy4wMCNDb2lsIGNoYWlucyMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wOC4wMCNCYWxsIGNoYWlucyMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNi4wOS4wMCNDaGFpbiBsaW5rcyMzMS4xNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNy4wMC4wMCNNZWNoYW5pY2FsIGNhYmxlIzMxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE1LjE3LjAxLjAwI01lY2hhbmljYWwgY2FibGVzIzMxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE3LjAyLjAwI05vbiBlbGVjdHJpYyBjb250cm9sIGNhYmxlcyMzMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNy4wMy4wMCNMaWZ0aW5nIGNhYmxlcyMzMS4xNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNS4xNy4wNC4wMCNUcmFjayBjYWJsZXMjMzEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTcuMDUuMDAjTm9uIGVsZWN0cmljYWwgc3RlZWwgY2FibGVzIzMxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE3LjA2LjAwI05vbiBlbGVjdHJpY2FsIGNvcHBlciBjYWJsZXMjMzEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTcuMDcuMDAjTm9uIGVsZWN0cmljYWwgYWx1bWludW0gY2FibGVzIzMxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE4LjAwLjAwI01lY2hhbmljYWwgd2lyZSMzMS4xNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xOC4wMS4wMCNNZWNoYW5pY2FsIHdpcmUjMzEuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTguMDIuMDAjQmFyYmVkIHdpcmUjMzEuMTUuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTguMDMuMDAjUGlhbm8gc3RlZWwgd2lyZSMzMS4xNS4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNS4xOS4wMC4wMCNTdHJhcHMjMzEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMTkuMDEuMDAjTWV0YWwgc3RyYXBzIzMxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE5LjAyLjAwI0xlYXRoZXIgc3RyYXBzIzMxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE1LjE5LjAzLjAwI0ZpYmVyIHN0cmFwcyMzMS4xNS4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNS4xOS4wNC4wMCNQbGFzdGljIHN0cmFwcyMzMS4xNS4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNS4yMC4wMC4wMCNTZWN1cml0eSB3aXJlIzMxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE1LjIwLjAxLjAwI1Jhem9yIHdpcmUjMzEuMTUuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMjAuMDIuMDAjQmFyYmVkIHdpcmUjMzEuMTUuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTUuMjEuMDAuMDAjRWxlY3RyaWNhbCB3aXJlIzMxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE1LjIxLjAxLjAwI1dpcmUgYXNzZW1ibHkjMzEuMTUuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMDAuMDAuMDAjSGFyZHdhcmUjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDAuMDAjU2NyZXdzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjE1LjAxLjAwI0NhcCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDIuMDAjQW5jaG9yIHNjcmV3cyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNS4wMy4wMCNEcml2ZSBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDQuMDAjTWFjaGluZSBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDUuMDAjU2V0IHNjcmV3cyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNS4wNi4wMCNTaGVldCBtZXRhbCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDcuMDAjVGFwcGluZyBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDguMDAjV29vZCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMDkuMDAjRHJ5d2FsbCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMTAuMDAjQ2FwdGl2ZSBzY3JldyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNS4xMS4wMCNMb2NraW5nIHNjcmV3cyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNS4xMi4wMCNUaHJlYWQgcm9sbGluZyBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMTMuMDAjRmxhdGhlYWQgc2NyZXdzIzMxLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE1LjE0LjAwI1dlbGQgc2NyZXdzIzMxLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE1LjE1LjAwI0ZsYXQgaGVhZCBzY3Jld3MjMzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTUuMTYuMDAjVGh1bWIgc2NyZXdzIzMxLjE2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE1LjE3LjAwI1Nob3VsZGVyIHNjcmV3cyMzMS4xNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4wMC4wMCNCb2x0cyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4wMS4wMCNBbmNob3IgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMDIuMDAjQmxpbmQgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMDMuMDAjQ2FycmlhZ2UgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMDQuMDAjQ2xldmlzIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjA1LjAwI0N5bGluZGVyIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjA2LjAwI0Rvb3IgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMDcuMDAjRXhwYW5zaW9uIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjA4LjAwI0xhZyBib2x0cyMzMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4wOS4wMCNUb2dnbGUgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTAuMDAjRXllIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjExLjAwI0xvY2tpbmcgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTIuMDAjUGluIG9yIGNvbGxhciBib2x0cyMzMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4xMy4wMCNUZW5zaW9uIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjE0LjAwI1N0cnVjdHVyYWwgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTUuMDAjVG9ycXVlIGJvbHRzIzMxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE2LjE2LjAwI1UgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTcuMDAjV2luZyBib2x0cyMzMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4xOC4wMCNUaHJlYWRlZCByb2QjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTYuMTkuMDAjU3R1ZCBib2x0cyMzMS4xNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNi4yMC4wMCNIZXhhZ29uYWwgYm9sdHMjMzEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMDAuMDAjTnV0cyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wMS4wMCNBbmNob3IgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wMi4wMCNCZWFyaW5nIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMDMuMDAjQmxpbmQgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wNC4wMCNCYXJyZWwgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wNS4wMCNDYXAgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4wNi4wMCNDYXB0aXZlIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMDcuMDAjQ2FzdGxlIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMDguMDAjQ2hhbm5lbCBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjA5LjAwI0NsYW1waW5nIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMTAuMDAjRXhwYW5zaW9uIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMTEuMDAjRXllIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMTIuMDAjRmxhbmdlIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMTMuMDAjSG9zZSBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjE0LjAwI0luc2VydCBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjE1LjAwI1NlbGYgbG9ja2luZyBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjE2LjAwI0xvY2tudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjE3LjAwI1dpbmcgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4xOC4wMCNUb2dnbGUgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4xOS4wMCNTd2l2ZWwgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4yMC4wMCNTdG9wIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMjEuMDAjU3ByaW5nIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMjIuMDAjVW5pb24gbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4yMy4wMCNOdXRwbGF0ZSBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjI0LjAwI1ByZXNzIG51dHMjMzEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTcuMjUuMDAjQ2xpcCBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjI2LjAwI0RvbWUgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4yNy4wMCNIZXhhZ29uYWwgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xNy4yOC4wMCNDb3VwbGluZyBudXRzIzMxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE3LjI5LjAwI0tudXJsZWQgbnV0cyMzMS4xNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wMC4wMCNXYXNoZXJzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjAxLjAwI0xvY2tpbmcgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wMi4wMCNCZXZlbCB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjAzLjAwI0JpbmRpbmcgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wNC4wMCNDdXJ2ZWQgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wNS4wMCNFbGVjdHJpY2FsIGluc3VsYXRpbmcgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wNi4wMCNGaW5pc2hpbmcgd2FzaGVycyMzMS4xNi4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOC4wNy4wMCNGbGF0IHdhc2hlcnMjMzEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTguMDguMDAjT3BlbiB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjA5LjAwI1JlZHVjaW5nIHdhc2hlcnMjMzEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTguMTAuMDAjU2hpbSB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjExLjAwI1NwcmluZyB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjEyLjAwI1NxdWFyZSB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjEzLjAwI1N3aXZlbCB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjE0LjAwI1RocnVzdCB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE4LjE1LjAwI1Nob3VsZGVyIHdhc2hlcnMjMzEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTguMTYuMDAjU3BhY2VycyBvciBzdGFuZG9mZnMjMzEuMTYuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTguMTcuMDAjQ29uaWNhbCB3YXNoZXJzIzMxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE5LjAwLjAwI1NwcmluZ3MjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMTkuMDEuMDAjSGVsaWNhbCBzcHJpbmdzIzMxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE5LjAyLjAwI0xlYWYgc3ByaW5ncyMzMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOS4wMy4wMCNTcGlyYWwgc3ByaW5ncyMzMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOS4wNC4wMCNDb21wcmVzc2lvbiBzcHJpbmdzIzMxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE5LjA1LjAwI0RpZSBzcHJpbmdzIzMxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzMxLjE2LjE5LjA2LjAwI0Rpc2sgc3ByaW5ncyMzMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOS4wNy4wMCNFeHRlbnNpb24gc3ByaW5ncyMzMS4xNi4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4xOS4wOC4wMCNUb3JzaW9uIHNwcmluZ3MjMzEuMTYuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjAuMDAuMDAjTmFpbHMjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjAuMDEuMDAjQnJhZHMjMzEuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjAuMDIuMDAjQ2FwIG5haWxzIzMxLjE2LjIwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIwLjAzLjAwI0ZpbmlzaGluZyBuYWlscyMzMS4xNi4yMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMC4wNC4wMCNNYXNvbnJ5IG5haWxzIzMxLjE2LjIwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIwLjA1LjAwI1Jvb2ZpbmcgbmFpbHMjMzEuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjAuMDYuMDAjV2lyZSBuYWlscyMzMS4xNi4yMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMC4wNy4wMCNVcGhvbHN0ZXJ5IG5haWxzIzMxLjE2LjIwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIwLjA4LjAwI0RyaXZlIHBpbnMjMzEuMTYuMjAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjEuMDAuMDAjQW5jaG9ycyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMS4wMS4wMCNDb25jcmV0ZSBhbmNob3JzIzMxLjE2LjIxLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIxLjAyLjAwI1dlZGdlIGFuY2hvcnMjMzEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjEuMDMuMDAjV2FsbCBhbmNob3JzIzMxLjE2LjIxLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIxLjA0LjAwI1NjcmV3IGFuY2hvcnMjMzEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjEuMDUuMDAjUmVzaW4gYW5jaG9ycyMzMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMS4wNi4wMCNQaXBlIGFuY2hvcnMjMzEuMTYuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjEuMDcuMDAjTmFpbCBleHBhbnNpb24gYW5jaG9ycyMzMS4xNi4yMS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMS4wOC4wMCNUaWUgZG93biBhbmNob3JzIzMxLjE2LjIxLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjAwLjAwI1JpdmV0cyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMi4wMS4wMCNCbGluZCByaXZldHMjMzEuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjIuMDIuMDAjQ3Jvd25oZWFkIHJpdmV0cyMzMS4xNi4yMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMi4wMy4wMCNGbGF0IGhlYWQgcml2ZXRzIzMxLjE2LjIyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjA0LjAwI0Z1bGwgcml2ZXRzIzMxLjE2LjIyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjA1LjAwI1JhdGNoZXQgcml2ZXRzIzMxLjE2LjIyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjA2LjAwI1Rpbm5lcnMgcml2ZXRzIzMxLjE2LjIyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIyLjA3LjAwI0NvbXByZXNzaW9uIHJpdmV0cyMzMS4xNi4yMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMi4wOC4wMCNDb29wZXJzIHJpdmV0cyMzMS4xNi4yMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMi4wOS4wMCNCdXR0b24gaGVhZCByaXZldHMjMzEuMTYuMjIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDAuMDAjTW91bnRpbmcgaGFyZHdhcmUjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDEuMDAjTW91bnRpbmcgcHJvZmlsZXMjMzEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDMuMDAjTW91bnRpbmcgYmFycyMzMS4xNi4yMy4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMy4wNC4wMCNNb3VudGluZyBzdHJpcHMjMzEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDUuMDAjTW91bnRpbmcgY2xpcHMjMzEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDYuMDAjTW91bnRpbmcgaGFuZ2VycyMzMS4xNi4yMy4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMy4wNy4wMCNNb3VudGluZyBwbGF0ZXMjMzEuMTYuMjMuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjMuMDguMDAjTW91bnRpbmcgcGFuZWxzIzMxLjE2LjIzLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIzLjA5LjAwI01vdW50aW5nIHJhY2tzIzMxLjE2LjIzLjAwLjAwCi11bnNwc2M3IzMxLjE2LjIzLjEwLjAwI01vdW50aW5nIHN0cmFwcyMzMS4xNi4yMy4wMC4wMAotdW5zcHNjNyMzMS4xNi4yMy4xMS4wMCNXYWxsIGJ1c2hpbmdzIzMxLjE2LjIzLjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjAwLjAwI01pc2NlbGxhbmVvdXMgZmFzdGVuZXJzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjAxLjAwI0dyb21tZXRzIzMxLjE2LjI0LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjAyLjAwI0hhc3BzIzMxLjE2LjI0LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjAzLjAwI0hpbmdlcyMzMS4xNi4yNC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNC4wNC4wMCNIYXJkd2FyZSBzdGFwbGVzIzMxLjE2LjI0LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjA1LjAwI1R1cm5idWNrbGVzIzMxLjE2LjI0LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI0LjA2LjAwI1N0cmFwcGluZyBvciBiYW5kaW5nIGJ1Y2tsZXMjMzEuMTYuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjQuMDcuMDAjTGF0Y2gjMzEuMTYuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjQuMDguMDAjQ290dGVyIHBpbnMjMzEuMTYuMjQuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjUuMDAuMDAjQnJhY2tldHMgYW5kIGJyYWNlcyMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNS4wMS4wMCNTaGVsZiBicmFja2V0cyMzMS4xNi4yNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNS4wMi4wMCNBbmdsZSBicmFja2V0cyMzMS4xNi4yNS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNS4wMy4wMCNCcmFjZXMjMzEuMTYuMjUuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjUuMDQuMDAjRWxlY3RyaWNhbCBmaXh0dXJlIGJyYWNrZXRzIzMxLjE2LjI1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI1LjA1LjAwI01hZ25ldGljIG1vdW50aW5nIGJyYWNrZXRzIzMxLjE2LjI1LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjAwLjAwI0hvb2tzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjAxLjAwI1N3aXZlbCBob29rcyMzMS4xNi4yNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNi4wMi4wMCNTcHJpbmcgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjYuMDMuMDAjUyBob29rcyMzMS4xNi4yNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNi4wNC4wMCNTYWZldHkgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjYuMDUuMDAjTGlmdGluZyBob29rcyMzMS4xNi4yNi4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNi4wNi4wMCNKIGhvb2tzIzMxLjE2LjI2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjA3LjAwI0d1eSB3aXJlIGhvb2tzIzMxLjE2LjI2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjA4LjAwI0dyYWIgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjYuMDkuMDAjU2NyZXcgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjYuMTAuMDAjUGVnIGJvYXJkIGhvb2tzIzMxLjE2LjI2LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI2LjExLjAwI1NsaXAgaG9va3MjMzEuMTYuMjYuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjcuMDAuMDAjUm9sbGluZyBoYXJkd2FyZSMzMS4xNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNy4wMS4wMCNDYXN0ZXJzIzMxLjE2LjI3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI3LjAyLjAwI1doZWVscyMzMS4xNi4yNy4wMC4wMAotdW5zcHNjNyMzMS4xNi4yNy4wMy4wMCNTbGlkZXJzIzMxLjE2LjI3LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI4LjAwLjAwI01pc2NlbGxhbmVvdXMgaGFyZHdhcmUjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjguMDEuMDAjSGFuZGxlcyBvciBrbm9icyMzMS4xNi4yOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yOC4wMi4wMCNJbnNlcnRzIzMxLjE2LjI4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI4LjAzLjAwI1NoYWNrbGVzIzMxLjE2LjI4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI4LjA0LjAwI0Rvb3Igc3RvcHMjMzEuMTYuMjguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjguMDUuMDAjQ2FibGUgdGhpbWJsZSMzMS4xNi4yOC4wMC4wMAotdW5zcHNjNyMzMS4xNi4yOC4wNi4wMCNTY3JldyBjb3ZlcnMjMzEuMTYuMjguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjguMDcuMDAjTGV2ZXJzIzMxLjE2LjI4LjAwLjAwCi11bnNwc2M3IzMxLjE2LjI4LjA4LjAwI1BhbmljIGJhcnMjMzEuMTYuMjguMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjkuMDAuMDAjQ2xhbXBzIzMxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjI5LjAxLjAwI0VhciBjbGFtcHMjMzEuMTYuMjkuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjkuMDIuMDAjU3ByaW5nIGNsYW1wcyMzMS4xNi4yOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yOS4wMy4wMCNTY3JldyBjbGFtcHMjMzEuMTYuMjkuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMjkuMDQuMDAjV2lyZSByb3BlIGNsYW1wcyMzMS4xNi4yOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4yOS4wNS4wMCNCZWFtIGNsYW1wcyMzMS4xNi4yOS4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMC4wMC4wMCNDb3VwbGluZ3MjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzAuMDEuMDAjRWxhc3RvbWVyaWMgY291cGxpbmdzIzMxLjE2LjMwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMwLjAyLjAwI0dlYXIgY291cGxpbmdzIzMxLjE2LjMwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMwLjAzLjAwI01ldGFsbGljIGNvdXBsaW5ncyMzMS4xNi4zMC4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMC4wNC4wMCNNaW5pYXR1cmUgY291cGxpbmdzIzMxLjE2LjMwLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMxLjAwLjAwI0Nvbm5lY3RvcnMjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzEuMDEuMDAjUXVpY2sgZGlzY29ubmVjdHMjMzEuMTYuMzEuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzEuMDIuMDAjRmVycnVsZSMzMS4xNi4zMS4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMS4wMy4wMCNUcmFpbGVyIENvbm5lY3RvciMzMS4xNi4zMS4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMi4wMC4wMCNSZXRhaW5pbmcgaGFyZHdhcmUjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDEuMDAjU3ByaW5nIHBpbnMjMzEuMTYuMzIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDIuMDAjUmV0YWluaW5nIHJpbmdzIzMxLjE2LjMyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMyLjAzLjAwI0Rvd2VsIHBpbiMzMS4xNi4zMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMi4wNC4wMCNDb3R0ZXIgcGluIzMxLjE2LjMyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMyLjA1LjAwI1RhcGVyIHBpbnMjMzEuMTYuMzIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDYuMDAjR3Jvb3ZlZCBwaW5zIzMxLjE2LjMyLjAwLjAwCi11bnNwc2M3IzMxLjE2LjMyLjA3LjAwI1NoYWZ0IG9yIHdvb2RydWZmIGtleXMjMzEuMTYuMzIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDguMDAjS2V5c3RvY2sjMzEuMTYuMzIuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzIuMDkuMDAjQmVhcmluZyBob2xkZXJzIG9yIHJldGFpbmVycyMzMS4xNi4zMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMi4xMC4wMCNSZXRhaW5pbmcgY29sbGFycyMzMS4xNi4zMi4wMC4wMAotdW5zcHNjNyMzMS4xNi4zMy4wMC4wMCNTcGFjZXIjMzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTYuMzMuMDEuMDAjU2hpbSMzMS4xNi4zMy4wMC4wMAotdW5zcHNjNyMzMS4xNy4wMC4wMC4wMCNCZWFyaW5ncyBhbmQgYnVzaGluZ3MgYW5kIHdoZWVscyBhbmQgZ2VhcnMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDAuMDAjQmVhcmluZ3MjMzEuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDEuMDAjRmxhbmdlZCBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4wMi4wMCNSYWRpYWwgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDMuMDAjV2hlZWwgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDQuMDAjQmFsbCBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4wNS4wMCNSb2xsZXIgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMDYuMDAjTGluZWFyIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjA3LjAwI1RocnVzdCBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4wOC4wMCNSb2QgZW5kIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjA5LjAwI1NsZWV2ZSBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4xMC4wMCNTcGhlcmljYWwgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMTEuMDAjUGlsbG93IGJsb2NrIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjEyLjAwI05lZWRsZSBiZWFyaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4xMy4wMCNIYW5nZXIgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMTQuMDAjRG9vciBjbG9zZXJzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjE1LjAwI1BsYWluIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjE2LjAwI1RhcGVyZWQgYmVhcmluZ3MjMzEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTUuMTcuMDAjTmVlZGxlIGJlYXJpbmdzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjE4LjAwI0JlYXJpbmcgQ2FnZSMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4xOS4wMCNCZWFyaW5nIGJsb2NrcyBvciBob3VzaW5ncyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNS4yMC4wMCNCZWFyaW5nIGpvdXJuYWxzIzMxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE1LjIxLjAwI0JlYXJpbmcgcm9sbGVycyBvciBiYWxscyMzMS4xNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNi4wMC4wMCNCdXNoaW5ncyMzMS4xNy4wMC4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNi4wMS4wMCNUcmFuc2Zvcm1lciBidXNoaW5ncyMzMS4xNy4xNi4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNi4wMi4wMCNXYWxsIGJ1c2hpbmdzIzMxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE2LjAzLjAwI0RyaWxsIGJ1c2hpbmdzIzMxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE2LjA0LjAwI1BpbG90IGJ1c2hpbmdzIzMxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE2LjA1LjAwI1NoYWZ0IGJ1c2hpbmdzIzMxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjAwLjAwI0dlYXJzIzMxLjE3LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjAxLjAwI0dlYXIgYm94ZXMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMDIuMDAjUmFjayBvciBwaW5pb24gZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMDMuMDAjRGlmZmVyZW50aWFsIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjA0LjAwI0ZyaWN0aW9uIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjA1LjAwI0hlbGljYWwgZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMDYuMDAjQ29uaWNhbCBnZWFycyMzMS4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNy4wNy4wMCNTcHVyIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjA4LjAwI0JldmVsIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjA5LjAwI1JhY2sgZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMTAuMDAjUGluaW9uIGdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjExLjAwI1JpbmcgZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTcuMTIuMDAjV29ybSBnZWFycyMzMS4xNy4xNy4wMC4wMAotdW5zcHNjNyMzMS4xNy4xNy4xMy4wMCNTaWRlIEdlYXJzIzMxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE3LjE0LjAwI0hlbGljYWwgZ2VhcnMjMzEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTguMDAuMDAjSW5kdXN0cmlhbCB3aGVlbHMjMzEuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTguMDEuMDAjQ29nIHdoZWVscyMzMS4xNy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNy4xOC4wMi4wMCNJbXBlbGxlciB3aGVlbHMjMzEuMTcuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTguMDMuMDAjRmx5d2hlZWxzIzMxLjE3LjE4LjAwLjAwCi11bnNwc2M3IzMxLjE3LjE4LjA0LjAwI1NoZWF2ZXMjMzEuMTcuMTguMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTguMDUuMDAjV2hlZWwgYnJ1c2hlcyMzMS4xNy4xOC4wMC4wMAotdW5zcHNjNyMzMS4xNy4xOS4wMC4wMCNTcHJvY2tldHMjMzEuMTcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTcuMTkuMDEuMDAjUm9sbGVyIGNoYWluIHNwcm9ja2V0cyMzMS4xNy4xOS4wMC4wMAotdW5zcHNjNyMzMS4xNy4xOS4wMi4wMCNTcGxpdCBzcHJvY2tldHMjMzEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMTguMDAuMDAuMDAjR2Fza2V0cyBhbmQgc2VhbHMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTUuMDAuMDAjR2Fza2V0cyMzMS4xOC4wMC4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4wMS4wMCNQbGFzdGljIGdhc2tldHMjMzEuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTUuMDIuMDAjUnViYmVyIGdhc2tldHMjMzEuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTUuMDMuMDAjTWV0YWwgZ2Fza2V0cyMzMS4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4wNC4wMCNUZXh0aWxlIGdhc2tldHMjMzEuMTguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTUuMDUuMDAjQ29yayBnYXNrZXRzIzMxLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE1LjA2LjAwI08gcmluZyBnYXNrZXRzIzMxLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE1LjA3LjAwI0VsZWN0cm9tYWduZXRpYyBpbnRlcmZlcmVuY2UgKEVNSSkgZ2Fza2V0cyMzMS4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4wOC4wMCNCb2x0ZWQgZ2Fza2V0cyMzMS4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4wOS4wMCNHYXNrZXQga2l0cyMzMS4xOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNS4xMC4wMCNTaWxpY29uZSBnYXNrZXRzIzMxLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE1LjExLjAwI0xpcXVpZCBnYXNrZXRzIzMxLjE4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE2LjAwLjAwI1NlYWxzIzMxLjE4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE4LjE2LjAxLjAwI1BsYXN0aWMgc2VhbHMjMzEuMTguMTYuMDAuMDAKLXVuc3BzYzcjMzEuMTguMTYuMDIuMDAjUnViYmVyIHNlYWxzIzMxLjE4LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE2LjAzLjAwI01ldGFsbGljIHNlYWxzIzMxLjE4LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE2LjA0LjAwI1NlYWwgbWVjaGFuaWNhbCMzMS4xOC4xNi4wMC4wMAotdW5zcHNjNyMzMS4xOC4xNy4wMC4wMCNQYWNraW5ncyBhbmQgZ2xhbmRzIzMxLjE4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjE4LjE3LjAxLjAwI1BhY2tpbmdzIzMxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzMxLjE4LjE3LjAyLjAwI0dsYW5kcyMzMS4xOC4xNy4wMC4wMAotdW5zcHNjNyMzMS4xOS4wMC4wMC4wMCNHcmluZGluZyBhbmQgcG9saXNoaW5nIGFuZCBzbW9vdGhpbmcgbWF0ZXJpYWxzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjAwLjAwI0FicmFzaXZlcyBhbmQgYWJyYXNpdmUgbWVkaWEjMzEuMTkuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMDEuMDAjQWJyYXNpdmUgcGFwZXJzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjAyLjAwI0J1ZmZzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjAzLjAwI0FicmFzaXZlIHdoZWVscyMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4wNC4wMCNBYnJhc2l2ZSBjbG90aCMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4wNS4wMCNBYnJhc2l2ZSBwYWRzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjA2LjAwI0FicmFzaXZlIGRpc2NzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjA3LjAwI0FicmFzaXZlIGJlbHRzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjA4LjAwI0JvcnQjMzEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMDkuMDAjQWJyYXNpdmUgcG9saXNoZXJzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjEwLjAwI0FicmFzaXZlIHN0b25lcyMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4xMS4wMCNTdGVlbCB3b29sIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE1LjEyLjAwI1Nob3QgYmxhc3QjMzEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMTMuMDAjR2xhc3MgYmVhZCMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4xNC4wMCNUdW1ibGUgbWVkaWEjMzEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMTUuMDAjQWJyYXNpdmUgbWVzaCMzMS4xOS4xNS4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNS4xNi4wMCNBYnJhc2l2ZSBjYXJ0cmlkZ2Ugcm9sbHMjMzEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMTkuMTUuMTcuMDAjRW1lcnkgYm9hcmRzIzMxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE2LjAwLjAwI0FicmFzaXZlIHdoZWVscyMzMS4xOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4xOS4xNi4wMS4wMCNBYnJhc2l2ZSBjdWJpYyBib3Jvem9uIG5pdHJhdGUgd2hlZWxzIzMxLjE5LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE2LjAyLjAwI0FicmFzaXZlIGRpYW1vbmQgd2hlZWxzIzMxLjE5LjE2LjAwLjAwCi11bnNwc2M3IzMxLjE5LjE2LjAzLjAwI1R1bmdzdGVuIGNhcmJpZGUgYWJyYXNpdmUgd2hlZWxzIzMxLjE5LjE2LjAwLjAwCi11bnNwc2M3IzMxLjIwLjAwLjAwLjAwI0FkaGVzaXZlcyBhbmQgc2VhbGFudHMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDAuMDAjVGFwZSMzMS4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4wMS4wMCNEdWN0IHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDIuMDAjRWxlY3RyaWNhbCBpbnN1bGF0aW5nIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDMuMDAjTWFza2luZyB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjA0LjAwI0NhcnBldCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjA1LjAwI0RvdWJsZSBzaWRlZCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjA2LjAwI0Jpc21hbGVtaWRlIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDcuMDAjRmliZXJnbGFzcyB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjA4LjAwI0dyYXBoaXRlIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMDkuMDAjTnlsb24gdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4xMC4wMCNSZXNpbiBpbXByZWduYXRlZCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjExLjAwI1dpcmUgbWVzaCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjEyLjAwI1RyYW5zcGFyZW50IHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMTMuMDAjTm9uIHNraWQgc2FmZXR5IHRhcGVzIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjE0LjAwI1BvbHl0ZXRyYWZsdW9yb2V0aHlsZW5lIChQVEZFKSB0aHJlYWQgc2VhbGluZyB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjE1LjAwI1BhcGVyIHRhcGVzIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjE2LjAwI1JlZmxlY3RpdmUgdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4xNy4wMCNQYWNrYWdpbmcgdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4xOC4wMCNFbGVjdHJpY2FsbHkgY29uZHVjdGl2ZSB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjE5LjAwI1BpcGUgb3IgaG9zZSByZXBhaXIgdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4yMC4wMCNBaXNsZSBtYXJraW5nIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMjEuMDAjRm9pbCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjIyLjAwI0FkaGVzaXZlIHRyYW5zZmVyIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTUuMjMuMDAjQ2xvdGggdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4yNC4wMCNDb2xvciBjb2RpbmcgdGFwZSMzMS4yMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNS4yNS4wMCNWaW55bCB0YXBlIzMxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE1LjI2LjAwI01hZ25ldGljIHRhcGUjMzEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDAuMDAjT3RoZXIgYWRoZXNpdmVzIGFuZCBzZWFsYW50cyMzMS4yMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4wMS4wMCNDaGVtaWNhbCBhZGhlc2l2ZXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDIuMDAjUGFzdGVzIzMxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE2LjAzLjAwI0d1bXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDQuMDAjUnViYmVyIGNlbWVudHMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDUuMDAjUHV0dGllcyMzMS4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4wNi4wMCNDYXVsa3MjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMDcuMDAjRXBveHkgYm9uZCMzMS4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4wOC4wMCNGb2FtIGFkaGVzaXZlcyMzMS4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4wOS4wMCNIb3QgbWVsdCBhZGhlc2l2ZXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMTAuMDAjR2x1ZXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMTEuMDAjRmlsbSBhZGhlc2l2ZXMjMzEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjAuMTYuMTIuMDAjVGhyZWFkIHNlYWxhbnRzIzMxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIwLjE2LjEzLjAwI1JlIHVzYWJsZSBhZGhlc2l2ZSMzMS4yMC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMC4xNi4xNC4wMCNTZWFsaW5nIHdheGVzIzMxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIxLjAwLjAwLjAwI1BhaW50cyBhbmQgcHJpbWVycyBhbmQgZmluaXNoZXMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTUuMDAuMDAjUGFpbnRzIGFuZCBwcmltZXJzIzMxLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjAxLjAwI0VuYW1lbCBwYWludHMjMzEuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTUuMDIuMDAjV2F0ZXIgYmFzZWQgcGFpbnRzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjAzLjAwI1BpZ21lbnQgcGFpbnRzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjA0LjAwI0NvYXRpbmcgcGFpbnRzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjA1LjAwI09pbCBiYXNlZCBwYWludHMjMzEuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTUuMDYuMDAjTGF0ZXggcGFpbnRzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjA3LjAwI1NwcmF5IHBhaW50cyMzMS4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNS4wOC4wMCNBY3J5bGljIHBhaW50cyMzMS4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNS4wOS4wMCNFbmFtZWwgcHJpbWVycyMzMS4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNS4xMC4wMCNQb2x5dXJldGhhbmUgcHJpbWVycyMzMS4yMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNS4xMS4wMCNVcmV0aGFuZSBwcmltZXJzIzMxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE1LjEyLjAwI0xhdGV4IHByaW1lcnMjMzEuMjEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTYuMDAuMDAjUGFpbnQgYWRkaXRpdmVzIzMxLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIxLjE2LjAxLjAwI0NhbGNpbWluZXMjMzEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTYuMDIuMDAjVGV4dHVyaW5nIG1hdGVyaWFscyMzMS4yMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNi4wMy4wMCNQYWludCBkcmllcnMjMzEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTYuMDQuMDAjUGFpbnQgZXh0ZW5kZXJzIzMxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE2LjA1LjAwI0FudGkgc2xpcCBhZ2VudHMjMzEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTYuMDYuMDAjTGV2ZWxpbmcgYWdlbnRzIzMxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE2LjA3LjAwI0FudGkgZm9hbWluZyBhZ2VudHMjMzEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTcuMDAuMDAjTWlzY2VsbGFuZW91cyBmaW5pc2hlcyMzMS4yMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNy4wMS4wMCNHbGF6ZXMjMzEuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTcuMDIuMDAjTHVzdGVycyMzMS4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNy4wMy4wMCNMYWNxdWVycyMzMS4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNy4wNC4wMCNTZWFsZXJzIzMxLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE3LjA1LjAwI1NoZWxsYWNzIzMxLjIxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE3LjA2LjAwI1N0YWlucyMzMS4yMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4yMS4xNy4wNy4wMCNWYXJuaXNoZXMjMzEuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTcuMDguMDAjUG93ZGVyIGNvYXQjMzEuMjEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTguMDAuMDAjUGFpbnQgc29sdmVudHMgYW5kIHRoaW5uZXJzIzMxLjIxLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIxLjE4LjAxLjAwI1BhaW50IG9yIHZhcm5pc2ggcmVtb3ZlcnMjMzEuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTguMDIuMDAjUGFpbnQgb3IgdmFybmlzaCBzdHJpcHBlcnMjMzEuMjEuMTguMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTguMDMuMDAjUGFpbnQgb3IgdmFybmlzaCB0aGlubmVycyMzMS4yMS4xOC4wMC4wMAotdW5zcHNjNyMzMS4yMS4xOS4wMC4wMCNQYWludCBhcHBsaWNhdG9ycyBhbmQgcGFpbnRpbmcgYWNjZXNzb3JpZXMjMzEuMjEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDEuMDAjRHJvcCBjbG90aHMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDIuMDAjRWRnaW5nIHRvb2xzIzMxLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE5LjAzLjAwI01hc2tpbmcgZXF1aXBtZW50IzMxLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE5LjA0LjAwI1BhaW50IGJydXNoZXMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDUuMDAjUGFpbnQgbWl4ZXJzIzMxLjIxLjE5LjAwLjAwCi11bnNwc2M3IzMxLjIxLjE5LjA2LjAwI1BhaW50IHJvbGxlcnMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDguMDAjUGFpbnQgc3ByYXllcnMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMDkuMDAjUGFpbnQgdHJheXMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMTAuMDAjUGFpbnQgbWl0dHMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMTIuMDAjVGVsZXNjb3BpbmcgcG9sZXMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjEuMTkuMTMuMDAjUGFpbnQgbm96emxlcyMzMS4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xOS4xNC4wMCNBaXIgYnJ1c2hlcyMzMS4yMS4xOS4wMC4wMAotdW5zcHNjNyMzMS4yMS4xOS4xNS4wMCNQYWludCBzdHJhaW5lcnMjMzEuMjEuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjIuMDAuMDAuMDAjRHllaW5nIGFuZCB0YW5uaW5nIGV4dHJhY3RzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIyLjE1LjAwLjAwI0R5ZWluZyBwcm9kdWN0cyMzMS4yMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMi4xNS4wMS4wMCNJbm9yZ2FuaWMgZHllcyMzMS4yMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMi4xNS4wMi4wMCNPcmdhbmljIGR5ZXMgb2YgYW5pbWFsIG9yaWdpbiMzMS4yMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMi4xNS4wMy4wMCNPcmdhbmljIGR5ZXMgb2YgdmVnZXRhYmxlIG9yaWdpbiMzMS4yMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yMi4xNi4wMC4wMCNUYW5uaW5nIHByb2R1Y3RzIzMxLjIyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIyLjE2LjAxLjAwI0lub3JnYW5pYyB0YW5uaW5nIGV4dHJhY3RzIzMxLjIyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIyLjE2LjAyLjAwI09yZ2FuaWMgdGFubmluZyBleHRyYWN0cyBvZiBhbmltYWwgb3JpZ2luIzMxLjIyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIyLjE2LjAzLjAwI09yZ2FuaWMgdGFubmluZyBleHRyYWN0cyBvZiB2ZWdldGFibGUgb3JpZ2luIzMxLjIyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjIzLjAwLjAwLjAwI01hY2hpbmVkIHJhdyBzdG9jayMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4wMC4wMCNNYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMDEuMDAjQWx1bWludW0gbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjAyLjAwI0JlcnlsbGl1bSBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMDMuMDAjQnJhc3MgbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjA0LjAwI0Jyb256ZSBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMDUuMDAjQ29wcGVyIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4wNi4wMCNJcm9uIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4wNy4wMCNMZWFkIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4wOC4wMCNNYWduZXNpdW0gbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjA5LjAwI1ByZWNpb3VzIG1ldGFsIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4xMC4wMCNTdGFpbmxlc3Mgc3RlZWwgbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjExLjAwI1RpbiBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMTIuMDAjVGl0YW5pdW0gbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjEzLjAwI1ppbmMgbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjE0LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4xNS4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4xNi4wMCNTdGVlbCBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTEuMTcuMDAjQ29tcG9zaXRlIG1hY2hpbmVkIGJhciBzdG9jayMzMS4yMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMS4xOC4wMCNOaWNrZWwgYWxsb3kgbWFjaGluZWQgYmFyIHN0b2NrIzMxLjIzLjExLjAwLjAwCi11bnNwc2M3IzMxLjIzLjExLjE5LjAwI05vbiBtZXRhbGxpYyBtYWNoaW5lZCBiYXIgc3RvY2sjMzEuMjMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMDAuMDAjTWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMDEuMDAjQWx1bWludW0gbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMDIuMDAjQmVyeWxsaXVtIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjAzLjAwI0JyYXNzIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjA0LjAwI0Jyb256ZSBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4wNS4wMCNDb3BwZXIgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMDYuMDAjSXJvbiBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4wNy4wMCNMZWFkIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjA4LjAwI01hZ25lc2l1bSBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4wOS4wMCNQcmVjaW91cyBtZXRhbCBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4xMC4wMCNTdGFpbmxlc3Mgc3RlZWwgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMTEuMDAjVGluIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjEyLjAwI1RpdGFuaXVtIG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjEzLjAwI1ppbmMgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMTQuMDAjTm9uIGZlcnJvdXMgYWxsb3kgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMTUuMDAjRmVycm91cyBhbGxveSBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4xNi4wMCNTdGVlbCBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMi4xNy4wMCNDb21wb3NpdGUgbWFjaGluZWQgcGxhdGUgc3RvY2sjMzEuMjMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTIuMTguMDAjTmlja2VsIGFsbG95IG1hY2hpbmVkIHBsYXRlIHN0b2NrIzMxLjIzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEyLjE5LjAwI05vbiBtZXRhbGxpYyBtYWNoaW5lZCBwbGF0ZSBzdG9jayMzMS4yMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMy4wMC4wMCNTaGltIHN0b2NrIzMxLjIzLjAwLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEzLjAxLjAwI0JyYXNzIHNoaW0gc3RvY2sjMzEuMjMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjMuMTMuMDIuMDAjU3RlZWwgc2hpbSBzdG9jayMzMS4yMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMy4wMy4wMCNTdGFpbmxlc3Mgc3RlZWwgc2hpbSBzdG9jayMzMS4yMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4yMy4xMy4wNC4wMCNBbHVtaW51bSBzaGltIHN0b2NrIzMxLjIzLjEzLjAwLjAwCi11bnNwc2M3IzMxLjIzLjEzLjA1LjAwI0NvcHBlciBzaGltIHN0b2NrIzMxLjIzLjEzLjAwLjAwCi11bnNwc2M3IzMxLjI0LjAwLjAwLjAwI0luZHVzdHJpYWwgb3B0aWNzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjE1LjAwLjAwI0xlbnNlcyBhbmQgcHJpc21zIzMxLjI0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjE1LjAxLjAwI0xlbnNlcyMzMS4yNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xNS4wMi4wMCNQcmlzbXMjMzEuMjQuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDAuMDAjT3B0aWNhbCBibGFua3MjMzEuMjQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDEuMDAjRmlsdGVyIGJsYW5rcyMzMS4yNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yNC4xNi4wMi4wMCNHbGFzcyBkaXNrcyMzMS4yNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4yNC4xNi4wMy4wMCNNb2xkZWQgZ2xhc3MjMzEuMjQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDQuMDAjUHJpc20gYmxhbmtzIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE2LjA1LjAwI1NpbGljb24gYmxhbmtzIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE2LjA2LjAwI0dlcm1hbml1bSBibGFua3MjMzEuMjQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDcuMDAjUm91bmQgYmFyIHN0b2NrIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE2LjA4LjAwI1NxdWFyZSBiYXIgc3RvY2sjMzEuMjQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTYuMDkuMDAjV2l0bmVzcyBzYW1wbGUgYmxhbmtzIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE2LjEwLjAwI0luZnJhcmVkIG9wdGljYWwgbWF0ZXJpYWwgYmxhbmtzIzMxLjI0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE3LjAwLjAwI01pcnJvcnMjMzEuMjQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTcuMDEuMDAjRGlhbW9uZCB0dXJuZWQgbWlycm9ycyMzMS4yNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4yNC4xNy4wMi4wMCNNZXRhbGxpYyBtaXJyb3JzIzMxLjI0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE3LjAzLjAwI1BhcmFib2xpYyBtaXJyb3JzIzMxLjI0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE3LjA0LjAwI1VuY29hdGVkIG1pcnJvcnMjMzEuMjQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTguMDAuMDAjT3B0aWNhbCBmaWx0ZXJzIzMxLjI0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjE4LjAxLjAwI0Jyb2FkIGJhbmQgZmlsdGVycyMzMS4yNC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOC4wMi4wMCNHcmFkaWVudCBmaWx0ZXJzIzMxLjI0LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE4LjAzLjAwI0luZnJhcmVkIGZpbHRlcnMjMzEuMjQuMTguMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTguMDQuMDAjTGFzZXIgZmlsdGVycyMzMS4yNC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOC4wNS4wMCNOYXJyb3cgYmFuZCBmaWx0ZXJzIzMxLjI0LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI0LjE4LjA2LjAwI1BlbGljbGUgZmlsdGVycyMzMS4yNC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOC4wNy4wMCNWaXN1YWwgZmlsdGVycyMzMS4yNC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wMC4wMCNPcHRpY2FsIGRvbWVzIzMxLjI0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjE5LjAxLjAwI1NwZWNpYWx0eSBkb21lcyMzMS4yNC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wMi4wMCNEaWFtb25kIHR1cm5lZCBkb21lcyMzMS4yNC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wMy4wMCNNZXRhbGxpYyBkb21lcyMzMS4yNC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wNC4wMCNNb2xkZWQgZ2xhc3MgZG9tZXMjMzEuMjQuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTkuMDUuMDAjTW9sZGVkIHBvbHljYXJib25hdGUgZG9tZXMjMzEuMjQuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTkuMDYuMDAjUmVwbGljYXRlZCBkb21lcyMzMS4yNC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yNC4xOS4wNy4wMCNTaGFwZWQgZG9tZXMjMzEuMjQuMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMTkuMDguMDAjRnJhbmdpYmxlIGRvbWVzIzMxLjI0LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI0LjIwLjAwLjAwI0xlbnMgYW5kIGxhc2VyIHdpbmRvd3MjMzEuMjQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMjAuMDEuMDAjRXh0ZXJuYWwgbGVucyBvciBsYXNlciB3aW5kb3dzIzMxLjI0LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjIwLjAyLjAwI0luZnJhcmVkIGxlbnMgb3IgbGFzZXIgd2luZG93cyMzMS4yNC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yNC4yMC4wMy4wMCNWaXN1YWwgbGVucyBvciBsYXNlciB3aW5kb3dzIzMxLjI0LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjIxLjAwLjAwI09wdGljYWwgZGV2aWNlIGFjY2Vzc29yaWVzIzMxLjI0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI0LjIxLjAxLjAwI1ByaXNtIGhvbGRlcnMjMzEuMjQuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjQuMjEuMDIuMDAjTGVucyBob2xkZXJzIzMxLjI0LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI0LjIxLjAzLjAwI09wdGljYWwgc2xpdHMjMzEuMjQuMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMDAuMDAuMDAjUG5ldW1hdGljIGFuZCBoeWRyYXVsaWMgYW5kIGVsZWN0cmljIGNvbnRyb2wgc3lzdGVtcyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4wMC4wMCNBY3R1YXRvcnMjMzEuMjUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMTUuMDEuMDAjRWxlY3RyaWMgYWN0dWF0b3JzIzMxLjI1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI1LjE1LjAyLjAwI0VsZWN0cm9uaWMgYWN0dWF0b3JzIzMxLjI1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI1LjE1LjAzLjAwI0h5ZHJhdWxpYyBhY3R1YXRvcnMjMzEuMjUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMTUuMDQuMDAjUG5ldW1hdGljIGFjdHVhdG9ycyMzMS4yNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4wNS4wMCNWYWx2ZSBhY3R1YXRvcnMjMzEuMjUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMTUuMDYuMDAjR2VhciBhY3R1YXRvcnMjMzEuMjUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjUuMTUuMDcuMDAjUm90YXJ5IGFjdHVhdG9ycyMzMS4yNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4wOC4wMCNQaG90b2VsZWN0cmljIGFjdHVhdG9ycyMzMS4yNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4wOS4wMCNFbGVjdHJvbWFnbmV0aWMgYWN0dWF0b3JzIzMxLjI1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI1LjE1LjEwLjAwI1NvbGVub2lkcyMzMS4yNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNS4xNS4xMS4wMCNMaW5lYXIgYWN0dWF0b3JzIzMxLjI1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI2LjAwLjAwLjAwI0hvdXNpbmdzIGFuZCBjYWJpbmV0cyBhbmQgY2FzaW5ncyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNS4wMC4wMCNIb3VzaW5ncyBhbmQgY2FiaW5ldHMjMzEuMjYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjYuMTUuMDEuMDAjUGxhc3RpYyBob3VzaW5ncyBvciBjYWJpbmV0cyMzMS4yNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNS4wMi4wMCNNZXRhbCBob3VzaW5ncyBvciBjYWJpbmV0cyMzMS4yNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNS4wMy4wMCNTdGVlbCBob3VzaW5ncyBvciBjYWJpbmV0cyMzMS4yNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNS4wNC4wMCNHZWFyIGJveGVzIG9yIGhvdXNpbmdzIzMxLjI2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI2LjE2LjAwLjAwI1NoZWxscyBhbmQgY2FzaW5ncyMzMS4yNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNi4xNi4wMS4wMCNQbGFzdGljIHNoZWxscyBvciBjYXNpbmdzIzMxLjI2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI2LjE2LjAyLjAwI01ldGFsIHNoZWxscyBvciBjYXNpbmdzIzMxLjI2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI2LjE2LjAzLjAwI1N0ZWVsIHNoZWxscyBvciBjYXNpbmdzIzMxLjI2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI3LjAwLjAwLjAwI01hY2hpbmUgbWFkZSBwYXJ0cyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNy4xNS4wMC4wMCNHZW5lcmFsIG1hY2hpbmUgbWFkZSBwYXJ0cyMzMS4yNy4wMC4wMC4wMAotdW5zcHNjNyMzMS4yNy4xNS4wMS4wMCNNZXRhbCBnZW5lcmFsIG1hY2hpbmUgbWFkZSBwYXJ0cyMzMS4yNy4xNS4wMC4wMAotdW5zcHNjNyMzMS4yNy4xNS4wMi4wMCNOb24gbWV0YWwgZ2VuZXJhbCBtYWNoaW5lIG1hZGUgcGFydHMjMzEuMjcuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjcuMTYuMDAuMDAjU2NyZXcgbWFjaGluZSBtYWRlIHBhcnRzIzMxLjI3LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI3LjE2LjAxLjAwI01ldGFsIHNjcmV3IG1hY2hpbmUgbWFkZSBwYXJ0cyMzMS4yNy4xNi4wMC4wMAotdW5zcHNjNyMzMS4yNy4xNi4wMi4wMCNOb24gbWV0YWwgc2NyZXcgbWFjaGluZSBtYWRlIHBhcnRzIzMxLjI3LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI4LjAwLjAwLjAwI1N0YW1waW5ncyBhbmQgc2hlZXQgY29tcG9uZW50cyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wMC4wMCNTdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMDEuMDAjU3RhbXBlZCBtZXRhbCBjb21wb25lbnRzIzMxLjI4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE1LjAyLjAwI0FsdW1pbnVtIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wMy4wMCNGZXJyb3VzIGFsbG95IHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wNC4wMCNJcm9uIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wNS4wMCNOb24gZmVycm91cyBhbGxveSBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMDYuMDAjU3RhaW5sZXNzIHN0ZWVsIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4wNy4wMCNDYXJib24gU3RlZWwgc3RhbXBlZCBjb21wb25lbnRzIzMxLjI4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE1LjA4LjAwI01hZ25lc2l1bSBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMDkuMDAjWmluYyBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMTAuMDAjVGluIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xMS4wMCNUaXRhbml1bSBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMTIuMDAjQmVyeWxsaXVtIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xMy4wMCNQcmVjaW91cyBtZXRhbCBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMTQuMDAjQ29wcGVyIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xNS4wMCNMZWFkIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xNi4wMCNCcmFzcyBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMTcuMDAjQnJvbnplIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4xOC4wMCNDb21wb3NpdGUgc3RhbXBlZCBjb21wb25lbnRzIzMxLjI4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE1LjE5LjAwI05pY2tlbCBhbGxveSBzdGFtcGVkIGNvbXBvbmVudHMjMzEuMjguMTUuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTUuMjAuMDAjTm9uIG1ldGFsbGljIHN0YW1wZWQgY29tcG9uZW50cyMzMS4yOC4xNS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xNS4yMS4wMCNDb2F0ZWQgU3RhbXBpbmdzIzMxLjI4LjE1LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE2LjAwLjAwI0Zvcm1lZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjE2LjAxLjAwI0Zvcm1lZCBtZXRhbCBjb21wb25lbnRzIzMxLjI4LjE2LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE3LjAwLjAwI1dlbGRlZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjE3LjAxLjAwI1dlbGRlZCBtZXRhbCBjb21wb25lbnRzIzMxLjI4LjE3LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjAwLjAwI1B1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4wMS4wMCNBbHVtaW51bSBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDIuMDAjRmVycm91cyBhbGxveSBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDMuMDAjSXJvbiBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDQuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcHVuY2hlZCBjb21wb25lbnRzIzMxLjI4LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjA1LjAwI1N0YWlubGVzcyBzdGVlbCBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDYuMDAjQ2FyYm9uIFN0ZWVsIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4wNy4wMCNDb21wb3NpdGUgcHVuY2hlZCBjb21wb25lbnRzIzMxLjI4LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjA4LjAwI05pY2tlbCBhbGxveSBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMDkuMDAjTm9uIG1ldGFsbGljIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xMC4wMCNUaXRhbml1bSBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMTEuMDAjQmVyeWxsaXVtIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xMi4wMCNQcmVjaW91cyBtZXRhbCBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMTMuMDAjQ29wcGVyIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xNC4wMCNMZWFkIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xNS4wMCNCcmFzcyBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTguMTYuMDAjQnJvbnplIHB1bmNoZWQgY29tcG9uZW50cyMzMS4yOC4xOC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOC4xNy4wMCNNYWduZXNpdW0gcHVuY2hlZCBjb21wb25lbnRzIzMxLjI4LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjE4LjAwI1ppbmMgcHVuY2hlZCBjb21wb25lbnRzIzMxLjI4LjE4LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE4LjE5LjAwI1RpbiBwdW5jaGVkIGNvbXBvbmVudHMjMzEuMjguMTguMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDAuMDAjRHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4wMS4wMCNBbHVtaW51bSBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjAyLjAwI0JlcnlsbGl1bSBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjAzLjAwI0JyYXNzIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDQuMDAjQnJvbnplIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDUuMDAjQ29tcG9zaXRlIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDYuMDAjQ29wcGVyIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMDcuMDAjRmVycm91cyBhbGxveSBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjA4LjAwI0lyb24gZHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4wOS4wMCNMZWFkIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTAuMDAjTWFnbmVzaXVtIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTEuMDAjTmlja2VsIGFsbG95IGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgZHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4xMy4wMCNOb24gbWV0YWxsaWMgZHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4xNC4wMCNQcmVjaW91cyBtZXRhbCBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjE1LjAwI1N0YWlubGVzcyBzdGVlbCBkcmF3IGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjE5LjAwLjAwCi11bnNwc2M3IzMxLjI4LjE5LjE2LjAwI1N0ZWVsIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTcuMDAjVGluIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMTkuMTguMDAjVGl0YW5pdW0gZHJhdyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4xOS4wMC4wMAotdW5zcHNjNyMzMS4yOC4xOS4xOS4wMCNaaW5jIGRyYXcgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMTkuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDAuMDAjSHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDEuMDAjQWx1bWludW0gaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDIuMDAjQmVyeWxsaXVtIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjAzLjAwI0JyYXNzIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjA0LjAwI0Jyb256ZSBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4wNS4wMCNDb21wb3NpdGUgaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDYuMDAjQ29wcGVyIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjA3LjAwI0ZlcnJvdXMgYWxsb3kgaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMDguMDAjSXJvbiBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4wOS4wMCNMZWFkIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjEwLjAwI01hZ25lc2l1bSBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4xMS4wMCNOaWNrZWwgYWxsb3kgaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMTIuMDAjTm9uIGZlcnJvdXMgYWxsb3kgaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMTMuMDAjTm9uIG1ldGFsbGljIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjE0LjAwI1ByZWNpb3VzIG1ldGFsIGh5ZHJvIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIwLjE1LjAwI1N0YWlubGVzcyBzdGVlbCBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4xNi4wMCNTdGVlbCBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMC4xNy4wMCNUaW4gaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMTguMDAjVGl0YW5pdW0gaHlkcm8gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjAuMTkuMDAjWmluYyBoeWRybyBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wMC4wMCNTcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjAxLjAwI0FsdW1pbnVtIHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMDIuMDAjQmVyeWxsaXVtIHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMDMuMDAjQnJhc3Mgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wNC4wMCNCcm9uemUgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wNS4wMCNDb21wb3NpdGUgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wNi4wMCNDb3BwZXIgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4wNy4wMCNGZXJyb3VzIGFsbG95IHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMDguMDAjSXJvbiBzcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjA5LjAwI0xlYWQgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xMC4wMCNNYWduZXNpdW0gc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xMS4wMCNOaWNrZWwgYWxsb3kgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xMi4wMCNOb24gZmVycm91cyBhbGxveSBzcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjEzLjAwI05vbiBtZXRhbGxpYyBzcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjE0LjAwI1ByZWNpb3VzIG1ldGFsIHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMTUuMDAjU3RhaW5sZXNzIHN0ZWVsIHNwaW4gZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjEuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjEuMTYuMDAjU3RlZWwgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xNy4wMCNUaW4gc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMS4xOC4wMCNUaXRhbml1bSBzcGluIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIxLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIxLjE5LjAwI1ppbmMgc3BpbiBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMS4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wMC4wMCNSb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjAxLjAwI0FsdW1pbnVtIHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMDIuMDAjQmVyeWxsaXVtIHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMDMuMDAjQnJhc3Mgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wNC4wMCNCcm9uemUgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wNS4wMCNDb21wb3NpdGUgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wNi4wMCNDb3BwZXIgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4wNy4wMCNGZXJyb3VzIGFsbG95IHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMDguMDAjSXJvbiByb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIyLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjA5LjAwI0xlYWQgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xMC4wMCNNYWduZXNpdW0gcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xMS4wMCNOaWNrZWwgYWxsb3kgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xMi4wMCNOb24gZmVycm91cyBhbGxveSByb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIyLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjEzLjAwI05vbiBtZXRhbGxpYyByb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIyLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjE0LjAwI1ByZWNpb3VzIG1ldGFsIHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMTUuMDAjU3RhaW5sZXNzIHN0ZWVsIHJvbGwgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjIuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjIuMTYuMDAjU3RlZWwgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xNy4wMCNUaW4gcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMi4xOC4wMCNUaXRhbml1bSByb2xsIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIyLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIyLjE5LjAwI1ppbmMgcm9sbCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMi4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wMC4wMCNTdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjAxLjAwI0FsdW1pbnVtIHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMDIuMDAjQmVyeWxsaXVtIHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMDMuMDAjQnJhc3Mgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wNC4wMCNCcm9uemUgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wNS4wMCNDb21wb3NpdGUgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wNi4wMCNDb3BwZXIgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4wNy4wMCNGZXJyb3VzIGFsbG95IHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMDguMDAjSXJvbiBzdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIzLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjA5LjAwI0xlYWQgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xMC4wMCNNYWduZXNpdW0gc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xMS4wMCNOaWNrZWwgYWxsb3kgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xMi4wMCNOb24gZmVycm91cyBhbGxveSBzdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIzLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjEzLjAwI05vbiBtZXRhbGxpYyBzdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIzLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjE0LjAwI1ByZWNpb3VzIG1ldGFsIHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMTUuMDAjU3RhaW5sZXNzIHN0ZWVsIHN0cmV0Y2ggZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjMuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjMuMTYuMDAjU3RlZWwgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xNy4wMCNUaW4gc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yMy4xOC4wMCNUaXRhbml1bSBzdHJldGNoIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjIzLjAwLjAwCi11bnNwc2M3IzMxLjI4LjIzLjE5LjAwI1ppbmMgc3RyZXRjaCBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yMy4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4wMC4wMCNFeHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMDEuMDAjQWx1bWludW0gZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjAyLjAwI0JlcnlsbGl1bSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMDMuMDAjQnJhc3MgZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjA0LjAwI0Jyb256ZSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMDUuMDAjQ29tcG9zaXRlIGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4wNi4wMCNDb3BwZXIgZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjA3LjAwI0ZlcnJvdXMgYWxsb3kgZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjA4LjAwI0lyb24gZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjA5LjAwI0xlYWQgZXhwbG9zaXZlIGZvcm1lZCBjb21wb25lbnRzIzMxLjI4LjI0LjAwLjAwCi11bnNwc2M3IzMxLjI4LjI0LjEwLjAwI01hZ25lc2l1bSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTEuMDAjTmlja2VsIGFsbG95IGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4xMi4wMCNOb24gZmVycm91cyBhbGxveSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTMuMDAjTm9uIG1ldGFsbGljIGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4xNC4wMCNQcmVjaW91cyBtZXRhbCBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTUuMDAjU3RhaW5sZXNzIHN0ZWVsIGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4xNi4wMCNTdGVlbCBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTcuMDAjVGluIGV4cGxvc2l2ZSBmb3JtZWQgY29tcG9uZW50cyMzMS4yOC4yNC4wMC4wMAotdW5zcHNjNyMzMS4yOC4yNC4xOC4wMCNUaXRhbml1bSBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjguMjQuMTkuMDAjWmluYyBleHBsb3NpdmUgZm9ybWVkIGNvbXBvbmVudHMjMzEuMjguMjQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMDAuMDAuMDAjTWFjaGluZWQgZXh0cnVzaW9ucyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4wMC4wMCNNYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4wMS4wMCNBbHVtaW51bSBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4wMi4wMCNCZXJ5bGxpdW0gbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMDMuMDAjQnJhc3MgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMDQuMDAjQnJvbnplIG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjA1LjAwI0NvcHBlciBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4wNi4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjA3LjAwI0xlYWQgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMDguMDAjTWFnbmVzaXVtIG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjA5LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjEwLjAwI1BsYXN0aWMgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTEuMDAjUHJlY2lvdXMgbWV0YWwgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTIuMDAjUnViYmVyIG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjEzLjAwI1N0YWlubGVzcyBzdGVlbCBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4xNC4wMCNTdGVlbCBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4xNS4wMCNUaW4gbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTYuMDAjVGl0YW5pdW0gbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTcuMDAjWmluYyBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMS4xOC4wMCNDb21wb3NpdGUgbWFjaGluZWQgaHlkcm8gc3RhdGljIGV4dHJ1c2lvbnMjMzEuMjkuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTEuMTkuMDAjTmlja2VsIGFsbG95IG1hY2hpbmVkIGh5ZHJvIHN0YXRpYyBleHRydXNpb25zIzMxLjI5LjExLjAwLjAwCi11bnNwc2M3IzMxLjI5LjExLjIwLjAwI05vbiBtZXRhbGxpYyBtYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4xMS4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4wMC4wMCNNYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4wMS4wMCNBbHVtaW51bSBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4wMi4wMCNCZXJ5bGxpdW0gbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMDMuMDAjQnJhc3MgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMDQuMDAjQnJvbnplIG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjA1LjAwI0NvcHBlciBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4wNi4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjA3LjAwI0xlYWQgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMDguMDAjTWFnbmVzaXVtIG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjA5LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjEwLjAwI1BsYXN0aWMgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTEuMDAjUHJlY2lvdXMgbWV0YWwgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTIuMDAjUnViYmVyIG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjEzLjAwI1N0YWlubGVzcyBzdGVlbCBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4xNC4wMCNTdGVlbCBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4xNS4wMCNUaW4gbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTYuMDAjVGl0YW5pdW0gbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTcuMDAjWmluYyBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMi4xOC4wMCNDb21wb3NpdGUgbWFjaGluZWQgaW1wYWN0IGV4dHJ1c2lvbnMjMzEuMjkuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTIuMTkuMDAjTmlja2VsIGFsbG95IG1hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjEyLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEyLjIwLjAwI05vbiBtZXRhbGxpYyBtYWNoaW5lZCBpbXBhY3QgZXh0cnVzaW9ucyMzMS4yOS4xMi4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4wMC4wMCNNYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMDEuMDAjQWx1bWludW0gbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjAyLjAwI0JlcnlsbGl1bSBtYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMDMuMDAjQnJhc3MgbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjA0LjAwI0Jyb256ZSBtYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMDUuMDAjQ29wcGVyIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4wNi4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4wNy4wMCNMZWFkIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4wOC4wMCNNYWduZXNpdW0gbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjA5LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xMC4wMCNQbGFzdGljIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xMS4wMCNQcmVjaW91cyBtZXRhbCBtYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMTIuMDAjUnViYmVyIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xMy4wMCNTdGFpbmxlc3Mgc3RlZWwgbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjE0LjAwI1N0ZWVsIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xNS4wMCNUaW4gbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjE2LjAwI1RpdGFuaXVtIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xNy4wMCNaaW5jIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xMy4xOC4wMCNDb21wb3NpdGUgbWFjaGluZWQgY29sZCBleHRydXNpb25zIzMxLjI5LjEzLjAwLjAwCi11bnNwc2M3IzMxLjI5LjEzLjE5LjAwI05pY2tlbCBhbGxveSBtYWNoaW5lZCBjb2xkIGV4dHJ1c2lvbnMjMzEuMjkuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTMuMjAuMDAjTm9uIG1ldGFsbGljIG1hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4xMy4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4wMC4wMCNNYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4wMS4wMCNBbHVtaW51bSBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4wMi4wMCNCZXJ5bGxpdW0gbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMDMuMDAjQnJhc3MgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMDQuMDAjQnJvbnplIG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjA1LjAwI0NvcHBlciBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4wNi4wMCNGZXJyb3VzIGFsbG95IG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjA3LjAwI0xlYWQgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMDguMDAjTWFnbmVzaXVtIG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjA5LjAwI05vbiBmZXJyb3VzIGFsbG95IG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjEwLjAwI1BsYXN0aWMgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTEuMDAjUHJlY2lvdXMgbWV0YWwgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTIuMDAjUnViYmVyIG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjEzLjAwI1N0YWlubGVzcyBzdGVlbCBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4xNC4wMCNTdGVlbCBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4xNS4wMCNUaW4gbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTYuMDAjVGl0YW5pdW0gbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTcuMDAjWmluYyBtYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4xNC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNC4xOC4wMCNDb21wb3NpdGUgbWFjaGluZWQgaG90IGV4dHJ1c2lvbnMjMzEuMjkuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMjkuMTQuMTkuMDAjTmlja2VsIGFsbG95IG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE0LjIwLjAwI05vbiAgIG1ldGFsbGljIG1hY2hpbmVkIGhvdCBleHRydXNpb25zIzMxLjI5LjE0LjAwLjAwCi11bnNwc2M3IzMxLjI5LjE1LjAwLjAwI01hY2hpbmVkIGltcGFjdCBleHRydXNpb25zIzMxLjI5LjAwLjAwLjAwCi11bnNwc2M3IzMxLjI5LjE2LjAwLjAwI01hY2hpbmVkIGNvbGQgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xNy4wMC4wMCNNYWNoaW5lZCBob3QgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4yOS4xOC4wMC4wMCNNYWNoaW5lZCBoeWRybyBzdGF0aWMgZXh0cnVzaW9ucyMzMS4yOS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4wMC4wMC4wMCNNYWNoaW5lZCBmb3JnaW5ncyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMC4wMC4wMCNNYWNoaW5lZCByb2xsZWQgcmluZyBmb3JnaW5ncyMzMS4zMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wMC4wMCNNYWNoaW5lZCBvcGVuIGRpZSBmb3JnaW5ncyMzMS4zMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wMS4wMCNOb24gZmVycm91cyBhbGxveSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wMi4wMCNGZXJyb3VzIGFsbG95IG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjAzLjAwI1N0ZWVsIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjA0LjAwI1N0YWlubGVzcyBzdGVlbCBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wNS4wMCNJcm9uIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjA2LjAwI0FsdW1pbnVtIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjA3LjAwI01hZ25lc2l1bSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wOC4wMCNUaXRhbml1bSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4wOS4wMCNCZXJ5bGxpdW0gb3BlbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTEuMTAuMDAjQ29wcGVyIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjExLjAwI0JyYXNzIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjEyLjAwI0Jyb256ZSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4xMy4wMCNaaW5jIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjE0LjAwI1RpbiBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4xNS4wMCNMZWFkIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjE2LjAwI1ByZWNpb3VzIG1ldGFsIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjExLjE3LjAwI0NvbXBvc2l0ZSBvcGVuIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMS4xOC4wMCNOaWNrZWwgYWxsb3kgb3BlbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTEuMTkuMDAjTm9uIG1ldGFsbGljIG9wZW4gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjExLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjAwLjAwI01hY2hpbmVkIGNsb3NlZCBkaWUgZm9yZ2luZ3MjMzEuMzAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMDEuMDAjTm9uIGZlcnJvdXMgYWxsb3kgY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wMi4wMCNGZXJyb3VzIGFsbG95IGNsb3NlZCBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMDMuMDAjU3RlZWwgY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wNC4wMCNTdGFpbmxlc3Mgc3RlZWwgY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wNS4wMCNJcm9uIGNsb3NlZCBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMDYuMDAjQWx1bWludW0gY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wNy4wMCNNYWduZXNpdW0gY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4wOC4wMCNUaXRhbml1bSBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjA5LjAwI0JlcnlsbGl1bSBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjEwLjAwI0NvcHBlciBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjExLjAwI0JyYXNzIGNsb3NlZCBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMTIuMDAjQnJvbnplIGNsb3NlZCBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTIuMTMuMDAjWmluYyBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE0LjAwI1RpbiBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE1LjAwI0xlYWQgY2xvc2VkIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMi4xNi4wMCNQcmVjaW91cyBtZXRhbCBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE3LjAwI0NvbXBvc2l0ZSBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE4LjAwI05pY2tlbCBhbGxveSBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEyLjE5LjAwI05vbiBtZXRhbGxpYyBjbG9zZWQgZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjAwLjAwI01hY2hpbmVkIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjMwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjAxLjAwI05vbiBmZXJyb3VzIGFsbG95IGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjAyLjAwI0ZlcnJvdXMgYWxsb3kgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMDMuMDAjU3RlZWwgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMDQuMDAjU3RhaW5sZXNzIHN0ZWVsIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjA1LjAwI0lyb24gaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMDYuMDAjQWx1bWludW0gaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMDcuMDAjTWFnbmVzaXVtIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjA4LjAwI1RpdGFuaXVtIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjA5LjAwI0JlcnlsbGl1bSBpbXByZXNzaW9uIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMy4xMC4wMCNDb3BwZXIgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTEuMDAjQnJhc3MgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTIuMDAjQnJvbnplIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjEzLjAwI1ppbmMgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTQuMDAjVGluIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjE1LjAwI0xlYWQgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTYuMDAjUHJlY2lvdXMgbWV0YWwgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTMuMTcuMDAjQ29tcG9zaXRlIGltcHJlc3Npb24gZGllIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMwLjEzLjE4LjAwI05pY2tlbCBhbGxveSBpbXByZXNzaW9uIGRpZSBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMC4xMy4xOS4wMCNOb24gbWV0YWxsaWMgaW1wcmVzc2lvbiBkaWUgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMDAuMDAjTWFjaGluZWQgZHJvcCBmb3JnaW5ncyMzMS4zMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4wMS4wMCNOb24gZmVycm91cyBhbGxveSBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjAyLjAwI1ppbmMgZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4wMy4wMCNGZXJyb3VzIGFsbG95IGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMDQuMDAjVGluIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMDUuMDAjTGVhZCBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjA2LjAwI1N0ZWVsIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMDcuMDAjUHJlY2lvdXMgbWV0YWwgZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4wOC4wMCNTdGFpbmxlc3Mgc3RlZWwgZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4wOS4wMCNJcm9uIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTAuMDAjQWx1bWludW0gZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4xMS4wMCNNYWduZXNpdW0gZHJvcCBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNC4xMi4wMCNUaXRhbml1bSBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjEzLjAwI0JlcnlsbGl1bSBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjE0LjAwI0NvcHBlciBkcm9wIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE0LjE1LjAwI0JyYXNzIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTYuMDAjQnJvbnplIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTcuMDAjQ29tcG9zaXRlIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTguMDAjTmlja2VsIGFsbG95IGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTQuMTkuMDAjTm9uIG1ldGFsbGljIGRyb3AgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMDAuMDAjTWFjaGluZWQgcm9sbGVkIHJpbmcgZm9yZ2luZ3MjMzEuMzAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMDEuMDAjQWx1bWludW0gcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMDIuMDAjQmVyeWxsaXVtIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjAzLjAwI0JyYXNzIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjA0LjAwI0Jyb256ZSByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4wNS4wMCNDb3BwZXIgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMDYuMDAjSXJvbiByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4wNy4wMCNMZWFkIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjA4LjAwI01hZ25lc2l1bSByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4wOS4wMCNQcmVjaW91cyBtZXRhbCByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4xMC4wMCNTdGFpbmxlc3Mgc3RlZWwgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMTEuMDAjVGluIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjEyLjAwI1RpdGFuaXVtIHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjEzLjAwI1ppbmMgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMTQuMDAjTm9uIGZlcnJvdXMgYWxsb3kgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMTUuMDAjRmVycm91cyBhbGxveSByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4xNi4wMCNTdGVlbCByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNS4xNy4wMCNDb21wb3NpdGUgcm9sbGVkIHJpbmcgbWFjaGluZWQgZm9yZ2luZ3MjMzEuMzAuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzAuMTUuMTguMDAjTmlja2VsIGFsbG95IHJvbGxlZCByaW5nIG1hY2hpbmVkIGZvcmdpbmdzIzMxLjMwLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMwLjE1LjE5LjAwI05vbiBtZXRhbGxpYyByb2xsZWQgcmluZyBtYWNoaW5lZCBmb3JnaW5ncyMzMS4zMC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNi4wMC4wMCNNYWNoaW5lZCBvcGVuIGRpZSBmb3JnaW5ncyMzMS4zMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMC4xNy4wMC4wMCNNYWNoaW5lZCBjbG9zZWQgZGllIGZvcmdpbmdzIzMxLjMwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMwLjE4LjAwLjAwI01hY2hpbmVkIGltcHJlc3Npb24gZGllIGZvcmdpbmdzIzMxLjMwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMwLjE5LjAwLjAwI01hY2hpbmVkIGRyb3AgZm9yZ2luZ3MjMzEuMzAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMDAuMDAuMDAjRmFicmljYXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMDAuMDAjU29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjAxLjAwI0FsdW1pbnVtIHNvbHZlbnQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMS4wMi4wMCNDYXJib24gc3RlZWwgc29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjExLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjAzLjAwI0hhc3RhbGxveSBYIHNvbHZlbnQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMS4wNC4wMCNJbmNvbmVsIHNvbHZlbnQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMS4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjExLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjA2LjAwI05vbiBtZXRhbGxpYyBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMDcuMDAjT3RoZXIgZmVycm91cyBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjExLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjA5LjAwI1N0YWlubGVzcyBzdGVlbCBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMTAuMDAjVGl0YW5pdW0gc29sdmVudCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjExLjAwLjAwCi11bnNwc2M3IzMxLjMxLjExLjExLjAwI1dhc3BhbGxveSBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTEuMTIuMDAjQ29wcGVyIHNvbHZlbnQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMS4xMy4wMCNCcmFzcyBzb2x2ZW50IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMDAuMDAjUml2ZXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMDEuMDAjQWx1bWludW0gcml2ZXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMDIuMDAjQ2FyYm9uIHN0ZWVsIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjAzLjAwI0hhc3RhbGxveSBYIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjA0LjAwI0luY29uZWwgcml2ZXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjA2LjAwI05vbiBtZXRhbGxpYyByaXZldGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMi4wNy4wMCNPdGhlciBmZXJyb3VzIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjA5LjAwI1N0YWlubGVzcyBzdGVlbCByaXZldGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMi4xMC4wMCNUaXRhbml1bSByaXZldGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMi4xMS4wMCNXYXNwYWxsb3kgcml2ZXRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTIuMTIuMDAjQ29wcGVyIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEyLjEzLjAwI0JyYXNzIHJpdmV0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjAwLjAwI0JvbHRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTMuMDEuMDAjQWx1bWludW0gYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wMi4wMCNDYXJib24gc3RlZWwgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wMy4wMCNIYXN0YWxsb3kgWCBib2x0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjA0LjAwI0luY29uZWwgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wNi4wMCNOb24gbWV0YWxsaWMgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbHRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTMuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9sdGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xMy4xMC4wMCNUaXRhbml1bSBib2x0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjExLjAwI1dhc3BhbGxveSBib2x0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjEyLjAwI0NvcHBlciBib2x0ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMxLjEzLjEzLjAwI0JyYXNzIGJvbHRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDAuMDAjVWx0cmEgdmlvbGV0IHdlbGRlZCAoVVYpIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNC4wMS4wMCNBbHVtaW51bSB1bHRyYSB2aW9sZXQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNC4wMi4wMCNDYXJib24gc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDMuMDAjSGFzdGFsbG95IFggdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDQuMDAjSW5jb25lbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNC4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDYuMDAjTm9uIG1ldGFsbGljIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE0LjA3LjAwI090aGVyIGZlcnJvdXMgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE0LjEwLjAwI1RpdGFuaXVtIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE0LjExLjAwI1dhc3BhbGxveSB1bHRyYSB2aW9sZXQgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNC4xMi4wMCNDb3BwZXIgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTQuMTMuMDAjQnJhc3MgdWx0cmEgdmlvbGV0IHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMDAuMDAjV2VsZGVkIG9yIGJyYXplZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMDEuMDAjQWx1bWludW0gd2VsZGVkIG9yIGJyYXplZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMDIuMDAjQ2FyYm9uIHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjAzLjAwI0hhc3RhbGxveSBYIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjA0LjAwI0luY29uZWwgd2VsZGVkIG9yIGJyYXplZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjA2LjAwI05vbiBtZXRhbGxpYyB3ZWxkZWQgb3IgYnJhemVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNS4wNy4wMCNPdGhlciBmZXJyb3VzIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjA5LjAwI1N0YWlubGVzcyBzdGVlbCB3ZWxkZWQgb3IgYnJhemVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNS4xMC4wMCNUaXRhbml1bSB3ZWxkZWQgb3IgYnJhemVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNS4xMS4wMCNXYXNwYWxsb3kgd2VsZGVkIG9yIGJyYXplZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTUuMTIuMDAjQ29wcGVyIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE1LjEzLjAwI0JyYXNzIHdlbGRlZCBvciBicmF6ZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjAwLjAwI1NvbmljIHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTYuMDEuMDAjQWx1bWludW0gc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wMi4wMCNDYXJib24gc3RlZWwgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wMy4wMCNIYXN0YWxsb3kgWCBzb25pYyB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjA0LjAwI0luY29uZWwgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wNi4wMCNOb24gbWV0YWxsaWMgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbmljIHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTYuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29uaWMgd2VsZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNi4xMC4wMCNUaXRhbml1bSBzb25pYyB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjExLjAwI1dhc3BhbGxveSBzb25pYyB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjEyLjAwI0NvcHBlciBzb25pYyB3ZWxkZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE2LjEzLjAwI0JyYXNzIHNvbmljIHdlbGRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMDAuMDAjQm9uZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNy4wMS4wMCNBbHVtaW51bSBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjAyLjAwI0NhcmJvbiBzdGVlbCBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjAzLjAwI0hhc3RhbGxveSBYIGJvbmRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMDQuMDAjSW5jb25lbCBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjA1LjAwI0xvdyBhbGxveSBzdGVlbCBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjA2LjAwI05vbiBtZXRhbGxpYyBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjA3LjAwI090aGVyIGZlcnJvdXMgYm9uZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMS4xNy4wOC4wMCNPdGhlciBub24gZmVycm91cyBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib25kZWQgcGlwZSBhc3NlbWJsaWVzIzMxLjMxLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMxLjE3LjEwLjAwI1RpdGFuaXVtIGJvbmRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMTEuMDAjV2FzcGFsbG95IGJvbmRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMTIuMDAjQ29wcGVyIGJvbmRlZCBwaXBlIGFzc2VtYmxpZXMjMzEuMzEuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzEuMTcuMTMuMDAjQnJhc3MgYm9uZGVkIHBpcGUgYXNzZW1ibGllcyMzMS4zMS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4wMC4wMC4wMCNGYWJyaWNhdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjAwLjAwI0JvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4wMS4wMCNBbHVtaW51bSBib25kZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTEuMDIuMDAjQ2FyYm9uIHN0ZWVsIGJvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4wMy4wMCNIYXN0YWxsb3kgWCBib25kZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTEuMDQuMDAjSW5jb25lbCBib25kZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTEuMDUuMDAjTG93IGFsbG95IHN0ZWVsIGJvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4wNi4wMCNOb24gbWV0YWxsaWMgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjA3LjAwI090aGVyIGZlcnJvdXMgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIGJvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjEwLjAwI1RpdGFuaXVtIGJvbmRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMS4xMS4wMCNXYXNwYWxsb3kgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjExLjEyLjAwI0NvcHBlciBib25kZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTEuMTMuMDAjQnJhc3MgYm9uZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjExLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjAwLjAwI1NvbHZlbnQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjAxLjAwI0FsdW1pbnVtIHNvbHZlbnQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjAyLjAwI0NhcmJvbiBzdGVlbCBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wMy4wMCNIYXN0YWxsb3kgWCBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wNC4wMCNJbmNvbmVsIHNvbHZlbnQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjA1LjAwI0xvdyBhbGxveSBzdGVlbCBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wNi4wMCNOb24gbWV0YWxsaWMgc29sdmVudCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTIuMDcuMDAjT3RoZXIgZmVycm91cyBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wOC4wMCNPdGhlciBub24gZmVycm91cyBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29sdmVudCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTIuMTAuMDAjVGl0YW5pdW0gc29sdmVudCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTIuMTEuMDAjV2FzcGFsbG95IHNvbHZlbnQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEyLjEyLjAwI0NvcHBlciBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMi4xMy4wMCNCcmFzcyBzb2x2ZW50IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4wMC4wMCNSaXZldGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEzLjAxLjAwI0FsdW1pbnVtIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDIuMDAjQ2FyYm9uIHN0ZWVsIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDMuMDAjSGFzdGFsbG95IFggcml2ZXRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4wNC4wMCNJbmNvbmVsIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDYuMDAjTm9uIG1ldGFsbGljIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDcuMDAjT3RoZXIgZmVycm91cyByaXZldGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMyLjEzLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHJpdmV0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTMuMTAuMDAjVGl0YW5pdW0gcml2ZXRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4xMS4wMCNXYXNwYWxsb3kgcml2ZXRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4xMi4wMCNDb3BwZXIgcml2ZXRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xMy4xMy4wMCNCcmFzcyByaXZldGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjAwLjAwI1dlbGRlZCBvciBicmF6ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTQuMDEuMDAjQWx1bWludW0gd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wMi4wMCNDYXJib24gc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wMy4wMCNIYXN0YWxsb3kgWCB3ZWxkZWQgb3IgYnJhemVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjA0LjAwI0luY29uZWwgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wNi4wMCNOb24gbWV0YWxsaWMgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wNy4wMCNPdGhlciBmZXJyb3VzIHdlbGRlZCBvciBicmF6ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTQuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNC4xMC4wMCNUaXRhbml1bSB3ZWxkZWQgb3IgYnJhemVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjExLjAwI1dhc3BhbGxveSB3ZWxkZWQgb3IgYnJhemVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjEyLjAwI0NvcHBlciB3ZWxkZWQgb3IgYnJhemVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE0LjEzLjAwI0JyYXNzIHdlbGRlZCBvciBicmF6ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDAuMDAjVWx0cmEgdmlvbGV0IHdlbGRlZCAoVVYpIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMyLjE1LjAxLjAwI0FsdW1pbnVtIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDIuMDAjQ2FyYm9uIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDMuMDAjSGFzdGFsbG95IFggdWx0cmEgdmlvbGV0IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNS4wNC4wMCNJbmNvbmVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDYuMDAjTm9uIG1ldGFsbGljIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDcuMDAjT3RoZXIgZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE1LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTUuMTAuMDAjVGl0YW5pdW0gdWx0cmEgdmlvbGV0IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNS4xMS4wMCNXYXNwYWxsb3kgdWx0cmEgdmlvbGV0IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNS4xMi4wMCNDb3BwZXIgdWx0cmEgdmlvbGV0IHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNS4xMy4wMCNCcmFzcyB1bHRyYSB2aW9sZXQgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjAwLjAwI1NvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4wMS4wMCNBbHVtaW51bSBzb25pYyB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTYuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4wMy4wMCNIYXN0YWxsb3kgWCBzb25pYyB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTYuMDQuMDAjSW5jb25lbCBzb25pYyB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTYuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4wNi4wMCNOb24gbWV0YWxsaWMgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjA3LjAwI090aGVyIGZlcnJvdXMgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjEwLjAwI1RpdGFuaXVtIHNvbmljIHdlbGRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNi4xMS4wMCNXYXNwYWxsb3kgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE2LjEyLjAwI0NvcHBlciBzb25pYyB3ZWxkZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTYuMTMuMDAjQnJhc3Mgc29uaWMgd2VsZGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjAwLjAwI0JvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4wMS4wMCNBbHVtaW51bSBib2x0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTcuMDIuMDAjQ2FyYm9uIHN0ZWVsIGJvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4wMy4wMCNIYXN0YWxsb3kgWCBib2x0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTcuMDQuMDAjSW5jb25lbCBib2x0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTcuMDUuMDAjTG93IGFsbG95IHN0ZWVsIGJvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4wNi4wMCNOb24gbWV0YWxsaWMgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjA3LjAwI090aGVyIGZlcnJvdXMgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIGJvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjEwLjAwI1RpdGFuaXVtIGJvbHRlZCBiYXIgc3RvY2sgYXNzZW1ibGllcyMzMS4zMi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMi4xNy4xMS4wMCNXYXNwYWxsb3kgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMyLjE3LjEyLjAwI0NvcHBlciBib2x0ZWQgYmFyIHN0b2NrIGFzc2VtYmxpZXMjMzEuMzIuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzIuMTcuMTMuMDAjQnJhc3MgYm9sdGVkIGJhciBzdG9jayBhc3NlbWJsaWVzIzMxLjMyLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMzLjAwLjAwLjAwI0ZhYnJpY2F0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjAwLjAwI0JvbmRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTEuMDEuMDAjQWx1bWludW0gYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wMi4wMCNDYXJib24gc3RlZWwgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wMy4wMCNIYXN0YWxsb3kgWCBib25kZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjExLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjA0LjAwI0luY29uZWwgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wNi4wMCNOb24gbWV0YWxsaWMgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbmRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTEuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9uZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMS4xMC4wMCNUaXRhbml1bSBib25kZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjExLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjExLjAwI1dhc3BhbGxveSBib25kZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjExLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjEyLjAwI0NvcHBlciBib25kZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjExLjAwLjAwCi11bnNwc2M3IzMxLjMzLjExLjEzLjAwI0JyYXNzIGJvbmRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMDAuMDAjQm9sdGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMi4wMS4wMCNBbHVtaW51bSBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjAyLjAwI0NhcmJvbiBzdGVlbCBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjAzLjAwI0hhc3RhbGxveSBYIGJvbHRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMDQuMDAjSW5jb25lbCBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjA1LjAwI0xvdyBhbGxveSBzdGVlbCBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjA2LjAwI05vbiBtZXRhbGxpYyBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjA3LjAwI090aGVyIGZlcnJvdXMgYm9sdGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMi4wOC4wMCNPdGhlciBub24gZmVycm91cyBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib2x0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEyLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEyLjEwLjAwI1RpdGFuaXVtIGJvbHRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMTEuMDAjV2FzcGFsbG95IGJvbHRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMTIuMDAjQ29wcGVyIGJvbHRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTIuMTMuMDAjQnJhc3MgYm9sdGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4wMC4wMCNTb25pYyB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEzLjAxLjAwI0FsdW1pbnVtIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDMuMDAjSGFzdGFsbG95IFggc29uaWMgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4wNC4wMCNJbmNvbmVsIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDYuMDAjTm9uIG1ldGFsbGljIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDcuMDAjT3RoZXIgZmVycm91cyBzb25pYyB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMzLjEzLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHNvbmljIHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTMuMTAuMDAjVGl0YW5pdW0gc29uaWMgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4xMS4wMCNXYXNwYWxsb3kgc29uaWMgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4xMi4wMCNDb3BwZXIgc29uaWMgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xMy4xMy4wMCNCcmFzcyBzb25pYyB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjEzLjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjAwLjAwI1VsdHJhIHZpb2xldCB3ZWxkZWQgKFVWKSBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTQuMDEuMDAjQWx1bWludW0gdWx0cmEgdmlvbGV0IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTQuMDIuMDAjQ2FyYm9uIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjAzLjAwI0hhc3RhbGxveSBYIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjA0LjAwI0luY29uZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTQuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjA2LjAwI05vbiBtZXRhbGxpYyB1bHRyYSB2aW9sZXQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNC4wNy4wMCNPdGhlciBmZXJyb3VzIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjA5LjAwI1N0YWlubGVzcyBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNC4xMC4wMCNUaXRhbml1bSB1bHRyYSB2aW9sZXQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNC4xMS4wMCNXYXNwYWxsb3kgdWx0cmEgdmlvbGV0IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTQuMTIuMDAjQ29wcGVyIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE0LjEzLjAwI0JyYXNzIHVsdHJhIHZpb2xldCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE0LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjAwLjAwI1NvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4wMS4wMCNBbHVtaW51bSBzb2x2ZW50IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTUuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4wMy4wMCNIYXN0YWxsb3kgWCBzb2x2ZW50IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTUuMDQuMDAjSW5jb25lbCBzb2x2ZW50IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTUuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4wNi4wMCNOb24gbWV0YWxsaWMgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjA3LjAwI090aGVyIGZlcnJvdXMgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjEwLjAwI1RpdGFuaXVtIHNvbHZlbnQgd2VsZGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNS4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNS4xMS4wMCNXYXNwYWxsb3kgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE1LjEyLjAwI0NvcHBlciBzb2x2ZW50IHdlbGRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTUuMTMuMDAjQnJhc3Mgc29sdmVudCB3ZWxkZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE1LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjAwLjAwI1dlbGRlZCBvciBicmF6ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjAwLjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjAxLjAwI0FsdW1pbnVtIHdlbGRlZCBvciBicmF6ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjAyLjAwI0NhcmJvbiBzdGVlbCB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wMy4wMCNIYXN0YWxsb3kgWCB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wNC4wMCNJbmNvbmVsIHdlbGRlZCBvciBicmF6ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjA1LjAwI0xvdyBhbGxveSBzdGVlbCB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wNi4wMCNOb24gbWV0YWxsaWMgd2VsZGVkIG9yIGJyYXplZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTYuMDcuMDAjT3RoZXIgZmVycm91cyB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wOC4wMCNPdGhlciBub24gZmVycm91cyB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTYuMTAuMDAjVGl0YW5pdW0gd2VsZGVkIG9yIGJyYXplZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTYuMTEuMDAjV2FzcGFsbG95IHdlbGRlZCBvciBicmF6ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE2LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE2LjEyLjAwI0NvcHBlciB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNi4xMy4wMCNCcmFzcyB3ZWxkZWQgb3IgYnJhemVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNi4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4wMC4wMCNSaXZldGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4wMC4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4wMS4wMCNBbHVtaW51bSByaXZldGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4wMi4wMCNDYXJib24gc3RlZWwgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDMuMDAjSGFzdGFsbG95IFggcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDQuMDAjSW5jb25lbCByaXZldGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDYuMDAjTm9uIG1ldGFsbGljIHJpdmV0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE3LjA3LjAwI090aGVyIGZlcnJvdXMgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHJpdmV0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE3LjEwLjAwI1RpdGFuaXVtIHJpdmV0ZWQgc3RydWN0dXJhbCBhc3NlbWJsaWVzIzMxLjMzLjE3LjAwLjAwCi11bnNwc2M3IzMxLjMzLjE3LjExLjAwI1dhc3BhbGxveSByaXZldGVkIHN0cnVjdHVyYWwgYXNzZW1ibGllcyMzMS4zMy4xNy4wMC4wMAotdW5zcHNjNyMzMS4zMy4xNy4xMi4wMCNDb3BwZXIgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzMuMTcuMTMuMDAjQnJhc3Mgcml2ZXRlZCBzdHJ1Y3R1cmFsIGFzc2VtYmxpZXMjMzEuMzMuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMDAuMDAuMDAjRmFicmljYXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjAwLjAwI1dlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4wMS4wMCNBbHVtaW51bSB3ZWxkZWQgb3IgYnJhemVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTEuMDIuMDAjQ2FyYm9uIHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4wMy4wMCNIYXN0YWxsb3kgWCB3ZWxkZWQgb3IgYnJhemVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTEuMDQuMDAjSW5jb25lbCB3ZWxkZWQgb3IgYnJhemVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTEuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4wNi4wMCNOb24gbWV0YWxsaWMgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjA3LjAwI090aGVyIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHdlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjEwLjAwI1RpdGFuaXVtIHdlbGRlZCBvciBicmF6ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMS4xMS4wMCNXYXNwYWxsb3kgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjExLjEyLjAwI0NvcHBlciB3ZWxkZWQgb3IgYnJhemVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTEuMTMuMDAjQnJhc3Mgd2VsZGVkIG9yIGJyYXplZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjExLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjAwLjAwI1JpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4wMS4wMCNBbHVtaW51bSByaXZldGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTIuMDIuMDAjQ2FyYm9uIHN0ZWVsIHJpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4wMy4wMCNIYXN0YWxsb3kgWCByaXZldGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTIuMDQuMDAjSW5jb25lbCByaXZldGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTIuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHJpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4wNi4wMCNOb24gbWV0YWxsaWMgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjA3LjAwI090aGVyIGZlcnJvdXMgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHJpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjEwLjAwI1RpdGFuaXVtIHJpdmV0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMi4xMS4wMCNXYXNwYWxsb3kgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEyLjEyLjAwI0NvcHBlciByaXZldGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTIuMTMuMDAjQnJhc3Mgcml2ZXRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjAwLjAwI1VsdHJhIHZpb2xldCB3ZWxkZWQgKFVWKSBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjAxLjAwI0FsdW1pbnVtIHVsdHJhIHZpb2xldCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMy4wMi4wMCNDYXJib24gc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjAzLjAwI0hhc3RhbGxveSBYIHVsdHJhIHZpb2xldCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMy4wNC4wMCNJbmNvbmVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjA2LjAwI05vbiBtZXRhbGxpYyB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTMuMDcuMDAjT3RoZXIgZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTMuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgdWx0cmEgdmlvbGV0IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjA5LjAwI1N0YWlubGVzcyBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTMuMTAuMDAjVGl0YW5pdW0gdWx0cmEgdmlvbGV0IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM0LjEzLjExLjAwI1dhc3BhbGxveSB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTMuMTIuMDAjQ29wcGVyIHVsdHJhIHZpb2xldCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xMy4xMy4wMCNCcmFzcyB1bHRyYSB2aW9sZXQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMDAuMDAjU29uaWMgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMDEuMDAjQWx1bWludW0gc29uaWMgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjAzLjAwI0hhc3RhbGxveSBYIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjA0LjAwI0luY29uZWwgc29uaWMgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjA2LjAwI05vbiBtZXRhbGxpYyBzb25pYyB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNC4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjA5LjAwI1N0YWlubGVzcyBzdGVlbCBzb25pYyB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNC4xMC4wMCNUaXRhbml1bSBzb25pYyB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNC4xMS4wMCNXYXNwYWxsb3kgc29uaWMgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTQuMTIuMDAjQ29wcGVyIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE0LjEzLjAwI0JyYXNzIHNvbmljIHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjAwLjAwI1NvbHZlbnQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTUuMDEuMDAjQWx1bWludW0gc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wMi4wMCNDYXJib24gc3RlZWwgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wMy4wMCNIYXN0YWxsb3kgWCBzb2x2ZW50IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjA0LjAwI0luY29uZWwgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wNi4wMCNOb24gbWV0YWxsaWMgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbHZlbnQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTUuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29sdmVudCB3ZWxkZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNS4xMC4wMCNUaXRhbml1bSBzb2x2ZW50IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjExLjAwI1dhc3BhbGxveSBzb2x2ZW50IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjEyLjAwI0NvcHBlciBzb2x2ZW50IHdlbGRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE1LjEzLjAwI0JyYXNzIHNvbHZlbnQgd2VsZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMDAuMDAjQm9uZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMDEuMDAjQWx1bWludW0gYm9uZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMDIuMDAjQ2FyYm9uIHN0ZWVsIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjAzLjAwI0hhc3RhbGxveSBYIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjA0LjAwI0luY29uZWwgYm9uZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMDUuMDAjTG93IGFsbG95IHN0ZWVsIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjA2LjAwI05vbiBtZXRhbGxpYyBib25kZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNi4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib25kZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNi4xMC4wMCNUaXRhbml1bSBib25kZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNi4xMS4wMCNXYXNwYWxsb3kgYm9uZGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTYuMTIuMDAjQ29wcGVyIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE2LjEzLjAwI0JyYXNzIGJvbmRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjAwLjAwI0JvbHRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjAxLjAwI0FsdW1pbnVtIGJvbHRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjAyLjAwI0NhcmJvbiBzdGVlbCBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wMy4wMCNIYXN0YWxsb3kgWCBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wNC4wMCNJbmNvbmVsIGJvbHRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjA1LjAwI0xvdyBhbGxveSBzdGVlbCBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wNi4wMCNOb24gbWV0YWxsaWMgYm9sdGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTcuMDcuMDAjT3RoZXIgZmVycm91cyBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wOC4wMCNPdGhlciBub24gZmVycm91cyBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9sdGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTcuMTAuMDAjVGl0YW5pdW0gYm9sdGVkIHNoZWV0IGFzc2VtYmxpZXMjMzEuMzQuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzQuMTcuMTEuMDAjV2FzcGFsbG95IGJvbHRlZCBzaGVldCBhc3NlbWJsaWVzIzMxLjM0LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM0LjE3LjEyLjAwI0NvcHBlciBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNC4xNy4xMy4wMCNCcmFzcyBib2x0ZWQgc2hlZXQgYXNzZW1ibGllcyMzMS4zNC4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4wMC4wMC4wMCNGYWJyaWNhdGVkIHR1YmUgYXNzZW1ibGllcyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wMC4wMCNVbHRyYSB2aW9sZXQgd2VsZGVkIChVVikgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM1LjExLjAxLjAwI0FsdW1pbnVtIHVsdHJhIHZpb2xldCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjExLjAwLjAwCi11bnNwc2M3IzMxLjM1LjExLjAyLjAwI0NhcmJvbiBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wMy4wMCNIYXN0YWxsb3kgWCB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wNC4wMCNJbmNvbmVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjExLjAwLjAwCi11bnNwc2M3IzMxLjM1LjExLjA1LjAwI0xvdyBhbGxveSBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wNi4wMCNOb24gbWV0YWxsaWMgdWx0cmEgdmlvbGV0IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTEuMDcuMDAjT3RoZXIgZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wOC4wMCNPdGhlciBub24gZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTEuMTAuMDAjVGl0YW5pdW0gdWx0cmEgdmlvbGV0IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTEuMTEuMDAjV2FzcGFsbG95IHVsdHJhIHZpb2xldCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjExLjAwLjAwCi11bnNwc2M3IzMxLjM1LjExLjEyLjAwI0NvcHBlciB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMS4xMy4wMCNCcmFzcyB1bHRyYSB2aW9sZXQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4wMC4wMCNXZWxkZWQgb3IgYnJhemVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4wMS4wMCNBbHVtaW51bSB3ZWxkZWQgb3IgYnJhemVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4wMi4wMCNDYXJib24gc3RlZWwgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDMuMDAjSGFzdGFsbG95IFggd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDQuMDAjSW5jb25lbCB3ZWxkZWQgb3IgYnJhemVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDYuMDAjTm9uIG1ldGFsbGljIHdlbGRlZCBvciBicmF6ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEyLjA3LjAwI090aGVyIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHdlbGRlZCBvciBicmF6ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEyLjEwLjAwI1RpdGFuaXVtIHdlbGRlZCBvciBicmF6ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEyLjExLjAwI1dhc3BhbGxveSB3ZWxkZWQgb3IgYnJhemVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMi4xMi4wMCNDb3BwZXIgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTIuMTMuMDAjQnJhc3Mgd2VsZGVkIG9yIGJyYXplZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMDAuMDAjUml2ZXRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMDEuMDAjQWx1bWludW0gcml2ZXRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMDIuMDAjQ2FyYm9uIHN0ZWVsIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjAzLjAwI0hhc3RhbGxveSBYIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjA0LjAwI0luY29uZWwgcml2ZXRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjA2LjAwI05vbiBtZXRhbGxpYyByaXZldGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMy4wNy4wMCNPdGhlciBmZXJyb3VzIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjA5LjAwI1N0YWlubGVzcyBzdGVlbCByaXZldGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMy4xMC4wMCNUaXRhbml1bSByaXZldGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xMy4xMS4wMCNXYXNwYWxsb3kgcml2ZXRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTMuMTIuMDAjQ29wcGVyIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjEzLjEzLjAwI0JyYXNzIHJpdmV0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjAwLjAwI0JvbmRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTQuMDEuMDAjQWx1bWludW0gYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wMi4wMCNDYXJib24gc3RlZWwgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wMy4wMCNIYXN0YWxsb3kgWCBib25kZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjA0LjAwI0luY29uZWwgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wNi4wMCNOb24gbWV0YWxsaWMgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbmRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTQuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgYm9uZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNC4xMC4wMCNUaXRhbml1bSBib25kZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjExLjAwI1dhc3BhbGxveSBib25kZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjEyLjAwI0NvcHBlciBib25kZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE0LjEzLjAwI0JyYXNzIGJvbmRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMDAuMDAjQm9sdGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNS4wMS4wMCNBbHVtaW51bSBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjAyLjAwI0NhcmJvbiBzdGVlbCBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjAzLjAwI0hhc3RhbGxveSBYIGJvbHRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMDQuMDAjSW5jb25lbCBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjA1LjAwI0xvdyBhbGxveSBzdGVlbCBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjA2LjAwI05vbiBtZXRhbGxpYyBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjA3LjAwI090aGVyIGZlcnJvdXMgYm9sdGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNS4wOC4wMCNPdGhlciBub24gZmVycm91cyBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib2x0ZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE1LjEwLjAwI1RpdGFuaXVtIGJvbHRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMTEuMDAjV2FzcGFsbG95IGJvbHRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMTIuMDAjQ29wcGVyIGJvbHRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTUuMTMuMDAjQnJhc3MgYm9sdGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4wMC4wMCNTb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMDEuMDAjQWx1bWludW0gc29sdmVudCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE2LjAyLjAwI0NhcmJvbiBzdGVlbCBzb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMDMuMDAjSGFzdGFsbG95IFggc29sdmVudCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE2LjA0LjAwI0luY29uZWwgc29sdmVudCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE2LjA1LjAwI0xvdyBhbGxveSBzdGVlbCBzb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMDYuMDAjTm9uIG1ldGFsbGljIHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4wOC4wMCNPdGhlciBub24gZmVycm91cyBzb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4xMC4wMCNUaXRhbml1bSBzb2x2ZW50IHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTYuMTEuMDAjV2FzcGFsbG95IHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNi4xMi4wMCNDb3BwZXIgc29sdmVudCB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE2LjEzLjAwI0JyYXNzIHNvbHZlbnQgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4wMC4wMCNTb25pYyB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM1LjE3LjAxLjAwI0FsdW1pbnVtIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDIuMDAjQ2FyYm9uIHN0ZWVsIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDMuMDAjSGFzdGFsbG95IFggc29uaWMgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4wNC4wMCNJbmNvbmVsIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDUuMDAjTG93IGFsbG95IHN0ZWVsIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDYuMDAjTm9uIG1ldGFsbGljIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDcuMDAjT3RoZXIgZmVycm91cyBzb25pYyB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM1LjE3LjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHNvbmljIHdlbGRlZCB0dWJlIGFzc2VtYmxpZXMjMzEuMzUuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzUuMTcuMTAuMDAjVGl0YW5pdW0gc29uaWMgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4xMS4wMCNXYXNwYWxsb3kgc29uaWMgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4xMi4wMCNDb3BwZXIgc29uaWMgd2VsZGVkIHR1YmUgYXNzZW1ibGllcyMzMS4zNS4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNS4xNy4xMy4wMCNCcmFzcyBzb25pYyB3ZWxkZWQgdHViZSBhc3NlbWJsaWVzIzMxLjM1LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjAwLjAwLjAwI0ZhYnJpY2F0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4wMC4wMCNCb25kZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4wMS4wMCNBbHVtaW51bSBib25kZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4wMi4wMCNDYXJib24gc3RlZWwgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDMuMDAjSGFzdGFsbG95IFggYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDQuMDAjSW5jb25lbCBib25kZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDYuMDAjTm9uIG1ldGFsbGljIGJvbmRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjExLjAwLjAwCi11bnNwc2M3IzMxLjM2LjExLjA3LjAwI090aGVyIGZlcnJvdXMgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIGJvbmRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjExLjAwLjAwCi11bnNwc2M3IzMxLjM2LjExLjEwLjAwI1RpdGFuaXVtIGJvbmRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjExLjAwLjAwCi11bnNwc2M3IzMxLjM2LjExLjExLjAwI1dhc3BhbGxveSBib25kZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMS4xMi4wMCNDb3BwZXIgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTEuMTMuMDAjQnJhc3MgYm9uZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMDAuMDAjQm9sdGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMDEuMDAjQWx1bWludW0gYm9sdGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMDIuMDAjQ2FyYm9uIHN0ZWVsIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjAzLjAwI0hhc3RhbGxveSBYIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjA0LjAwI0luY29uZWwgYm9sdGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMDUuMDAjTG93IGFsbG95IHN0ZWVsIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjA2LjAwI05vbiBtZXRhbGxpYyBib2x0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMi4wNy4wMCNPdGhlciBmZXJyb3VzIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjA4LjAwI090aGVyIG5vbiBmZXJyb3VzIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjA5LjAwI1N0YWlubGVzcyBzdGVlbCBib2x0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMi4xMC4wMCNUaXRhbml1bSBib2x0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMi4xMS4wMCNXYXNwYWxsb3kgYm9sdGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTIuMTIuMDAjQ29wcGVyIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEyLjEzLjAwI0JyYXNzIGJvbHRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjAwLjAwI1NvbHZlbnQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTMuMDEuMDAjQWx1bWludW0gc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wMi4wMCNDYXJib24gc3RlZWwgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wMy4wMCNIYXN0YWxsb3kgWCBzb2x2ZW50IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjA0LjAwI0luY29uZWwgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wNi4wMCNOb24gbWV0YWxsaWMgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wNy4wMCNPdGhlciBmZXJyb3VzIHNvbHZlbnQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTMuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4wOS4wMCNTdGFpbmxlc3Mgc3RlZWwgc29sdmVudCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xMy4xMC4wMCNUaXRhbml1bSBzb2x2ZW50IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjExLjAwI1dhc3BhbGxveSBzb2x2ZW50IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjEyLjAwI0NvcHBlciBzb2x2ZW50IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjEzLjAwLjAwCi11bnNwc2M3IzMxLjM2LjEzLjEzLjAwI0JyYXNzIHNvbHZlbnQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTMuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMDAuMDAjV2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjAxLjAwI0FsdW1pbnVtIHdlbGRlZCBvciBicmF6ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNC4wMi4wMCNDYXJib24gc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjAzLjAwI0hhc3RhbGxveSBYIHdlbGRlZCBvciBicmF6ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNC4wNC4wMCNJbmNvbmVsIHdlbGRlZCBvciBicmF6ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNC4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgd2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjA2LjAwI05vbiBtZXRhbGxpYyB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMDcuMDAjT3RoZXIgZmVycm91cyB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgd2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjA5LjAwI1N0YWlubGVzcyBzdGVlbCB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMTAuMDAjVGl0YW5pdW0gd2VsZGVkIG9yIGJyYXplZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE0LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE0LjExLjAwI1dhc3BhbGxveSB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTQuMTIuMDAjQ29wcGVyIHdlbGRlZCBvciBicmF6ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNC4xMy4wMCNCcmFzcyB3ZWxkZWQgb3IgYnJhemVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTQuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDAuMDAjVWx0cmEgdmlvbGV0IHdlbGRlZCAoVVYpIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDEuMDAjQWx1bWludW0gdWx0cmEgdmlvbGV0IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE1LjAyLjAwI0NhcmJvbiBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDMuMDAjSGFzdGFsbG95IFggdWx0cmEgdmlvbGV0IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE1LjA0LjAwI0luY29uZWwgdWx0cmEgdmlvbGV0IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE1LjA1LjAwI0xvdyBhbGxveSBzdGVlbCB1bHRyYSB2aW9sZXQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDYuMDAjTm9uIG1ldGFsbGljIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNS4wNy4wMCNPdGhlciBmZXJyb3VzIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNS4wOC4wMCNPdGhlciBub24gZmVycm91cyB1bHRyYSB2aW9sZXQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNS4xMC4wMCNUaXRhbml1bSB1bHRyYSB2aW9sZXQgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTUuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTUuMTEuMDAjV2FzcGFsbG95IHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNS4xMi4wMCNDb3BwZXIgdWx0cmEgdmlvbGV0IHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE1LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE1LjEzLjAwI0JyYXNzIHVsdHJhIHZpb2xldCB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNS4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4wMC4wMCNTb25pYyB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4wMC4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4wMS4wMCNBbHVtaW51bSBzb25pYyB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4wMi4wMCNDYXJib24gc3RlZWwgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDMuMDAjSGFzdGFsbG95IFggc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDQuMDAjSW5jb25lbCBzb25pYyB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDYuMDAjTm9uIG1ldGFsbGljIHNvbmljIHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE2LjA3LjAwI090aGVyIGZlcnJvdXMgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMDkuMDAjU3RhaW5sZXNzIHN0ZWVsIHNvbmljIHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE2LjEwLjAwI1RpdGFuaXVtIHNvbmljIHdlbGRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE2LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE2LjExLjAwI1dhc3BhbGxveSBzb25pYyB3ZWxkZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNi4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNi4xMi4wMCNDb3BwZXIgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTYuMTMuMDAjQnJhc3Mgc29uaWMgd2VsZGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTYuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMDAuMDAjUml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjAxLjAwI0FsdW1pbnVtIHJpdmV0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNy4wMi4wMCNDYXJib24gc3RlZWwgcml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjAzLjAwI0hhc3RhbGxveSBYIHJpdmV0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNy4wNC4wMCNJbmNvbmVsIHJpdmV0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNy4wNS4wMCNMb3cgYWxsb3kgc3RlZWwgcml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjA2LjAwI05vbiBtZXRhbGxpYyByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMDcuMDAjT3RoZXIgZmVycm91cyByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMDguMDAjT3RoZXIgbm9uIGZlcnJvdXMgcml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjA5LjAwI1N0YWlubGVzcyBzdGVlbCByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMTAuMDAjVGl0YW5pdW0gcml2ZXRlZCBwbGF0ZSBhc3NlbWJsaWVzIzMxLjM2LjE3LjAwLjAwCi11bnNwc2M3IzMxLjM2LjE3LjExLjAwI1dhc3BhbGxveSByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzYuMTcuMTIuMDAjQ29wcGVyIHJpdmV0ZWQgcGxhdGUgYXNzZW1ibGllcyMzMS4zNi4xNy4wMC4wMAotdW5zcHNjNyMzMS4zNi4xNy4xMy4wMCNCcmFzcyByaXZldGVkIHBsYXRlIGFzc2VtYmxpZXMjMzEuMzYuMTcuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMDAuMDAuMDAjUmVmcmFjdG9yaWVzIzMxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEwLjAwLjAwI0NlcmFtaWMgZmlicmUgcHJvZHVjdHMjMzEuMzcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTAuMDEuMDAjSW5zdWxhdGlvbiBib2FyZHMjMzEuMzcuMTAuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTAuMDIuMDAjSW5zdWxhdGluZyB3b29sIzMxLjM3LjEwLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjAwLjAwI1JlZnJhY3RvcnkgYnJpY2tzIzMxLjM3LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjAxLjAwI011bGxpdGUgYnJpY2tzIzMxLjM3LjExLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjAyLjAwI1NpbGxpbWFuaXRlIGJyaWNrcyMzMS4zNy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMS4wMy4wMCNBY2lkIHJlc2lzdGFudCBicmlja3MjMzEuMzcuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTEuMDQuMDAjU2lsaWNhIGJyaWNrcyMzMS4zNy4xMS4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMS4wNS4wMCNIaWdoIGFsdW1pbmEgYnJpY2tzIzMxLjM3LjExLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjA2LjAwI0NhbGNpdW0gc2lsaWNhdGUgYmxvY2tzIzMxLjM3LjExLjAwLjAwCi11bnNwc2M3IzMxLjM3LjExLjA3LjAwI1NoYXBlZCBicmlja3MjMzEuMzcuMTEuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTIuMDAuMDAjQ2FzdGFibGVzIzMxLjM3LjAwLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEyLjAxLjAwI0RlbnNlIGNhc3RhYmxlcyMzMS4zNy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMi4wMi4wMCNJbnN1bGF0aW5nIGNhc3RhYmxlcyMzMS4zNy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMi4wMy4wMCNMb3cgY2VtZW50IGNhc3RhYmxlcyMzMS4zNy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMi4wNC4wMCNBY2lkIG9yIGFsa2FsaSByZXNpc3RhbnQgY2FzdGFibGUjMzEuMzcuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTIuMDUuMDAjQWJyYXNpb24gcmVzaXN0YW50IGNhc3RhYmxlIzMxLjM3LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEyLjA2LjAwI1NpYyBjYXN0YWJsZSMzMS4zNy4xMi4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMi4wNy4wMCNTZWxmIGZsb3cgY2FzdGFibGUjMzEuMzcuMTIuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTIuMDguMDAjVGFidWxhciBhbHVtaW5hIGNhc3RhYmxlIzMxLjM3LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEyLjA5LjAwI0Vyb3Npb24gcmVzaXN0YW50IGNhc3RhYmxlIzMxLjM3LjEyLjAwLjAwCi11bnNwc2M3IzMxLjM3LjEzLjAwLjAwI1NoYXBlZCByZWZyYWN0b3JpZXMjMzEuMzcuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzcuMTMuMDEuMDAjUG9yb3VzIGJsb2NrcyMzMS4zNy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zNy4xMy4wMi4wMCNaaXJjb24gbm96emxlcyMzMS4zNy4xMy4wMC4wMAotdW5zcHNjNyMzMS4zOC4wMC4wMC4wMCNNYWduZXRzIGFuZCBtYWduZXRpYyBtYXRlcmlhbHMjMzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzguMTAuMDAuMDAjUGVybWFuZW50IG1hZ25ldHMjMzEuMzguMDAuMDAuMDAKLXVuc3BzYzcjMzEuMzguMTAuMDEuMDAjTG9kZSBzdG9uZSMzMS4zOC4xMC4wMC4wMAotdW5zcHNjNyMzMS4zOC4xMC4wMi4wMCNBbG5pY28gbWFnbmV0cyMzMS4zOC4xMC4wMC4wMAotdW5zcHNjNyMzMi4wMC4wMC4wMC4wMCNFbGVjdHJvbmljIENvbXBvbmVudHMgYW5kIFN1cHBsaWVzIzMyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzMyLjEwLjAwLjAwLjAwI1ByaW50ZWQgY2lyY3VpdHMgYW5kIGludGVncmF0ZWQgY2lyY3VpdHMgYW5kIG1pY3JvYXNzZW1ibGllcyMzMi4wMC4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNS4wMC4wMCNQcmludGVkIGNpcmN1aXRzIGFuZCBjaXJjdWl0IGNhcmQgYXNzZW1ibGllcyMzMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNS4wMS4wMCNCYXJlIHByaW50ZWQgY2lyY3VpdCBib2FyZHMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTUuMDIuMDAjUHJpbnRlZCBjaXJjdWl0IGFzc2VtYmxpZXMgKFBDQXMpIzMyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE1LjAzLjAwI01peGVkIGNpcmN1aXQgYXNzZW1ibGllcyMzMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNS4wNC4wMCNTdXJmYWNlIG1vdW50IGNpcmN1aXQgYXNzZW1ibGllcyMzMi4xMC4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNS4wNS4wMCNQbGF0ZWQgdGhyb3VnaCBjaXJjdWl0IGFzc2VtYmxpZXMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTUuMDYuMDAjRG91YmxlIHNpZGVkIGNpcmN1aXQgY2FyZHMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTUuMDcuMDAjQmFja3BsYW5lIGNpcmN1aXQgY2FyZHMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTUuMDguMDAjTXVsdGlsYXllciBjaXJjdWl0IGNhcmRzIzMyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE1LjA5LjAwI1NpbmdsZSBzaWRlZCBjaXJjdWl0IGNhcmRzIzMyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE1LjEwLjAwI1ByaW50ZWQgd2lyZSBib2FyZHMjMzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDAuMDAjRWxlY3Ryb25pYyBjb21wb25lbnRzIGZvciBtZW1vcnkgb3Igc21hcnQgY2FyZHMjMzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDEuMDAjUmFuZG9tIGFjY2VzcyBtZW1vcnkgKFJBTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDIuMDAjRHluYW1pYyByYW5kb20gYWNjZXNzIG1lbW9yeSAoRFJBTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDMuMDAjU3RhdGljIHJhbmRvbSBhY2Nlc3MgbWVtb3J5IChTUkFNKSMzMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNi4wNC4wMCNQcm9ncmFtbWFibGUgcmVhZCBvbmx5IG1lbW9yeSAoUFJPTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDUuMDAjRXJhc2VhYmxlIHByb2dyYW1tYWJsZSByZWFkIG9ubHkgbWVtb3J5IChFUFJPTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDYuMDAjRWxlY3Ryb25pY2FsbHkgZXJhc2VhYmxlIHByb2dyYW1tYWJsZSByZWFkIG9ubHkgbWVtb3J5IChFRVBST00pIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjA3LjAwI01vbm9saXRpaGMgbWVtb3J5IGludGVncmF0ZWQgY2lyY3VpdHMgKE1NSUMpIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjA4LjAwI1JlYWQgb25seSBtZW1vcnkgKFJPTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMDkuMDAjQXBwbGljYXRpb24gc3BlY2lmaWMgaW50ZWdyYXRlZCBjaXJjdWl0cyAoQVNJQykjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTAuMDAjVGhpbiBxdWFkIGZsYXQgcGFjayAoVFFGUCkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTEuMDAjUHJvZ3JhbW1hYmxlIGFycmF5IGxvZ2ljIChQQUwpIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjEyLjAwI0dhdGUgYXJyYXkgbG9naWMgKEdBTCkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTMuMDAjVHJhbnNpc3RvciB0cmFuc2lzdG9yIGxvZ2ljIChUVEwpIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjE0LjAwI0VtaXR0ZXIgY291cGxlZCBsb2dpYyAoRUNMKSMzMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNi4xNS4wMCNCaXBvbGFyIG9yIG1ldGFsIG94aWRlIHNlbWljb25kdWN0b3IgdGVjaG5vbG9neSAoQklNT1MpIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjE2LjAwI0JpcG9sYXIgY29tcGxlbWVudGFyeSBtZXRhbCBveGlkZSBzZW1pY29uZHVjdG9yIHRlY2hub2xvZ3kgKEJJQ01PUykjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTcuMDAjU21hcnQgY2FyZHMjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMTguMDAjVXBzY3JlZW5lZCBpbnRlZ3JhdGVkIGNpcmN1aXRzIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjE5LjAwI0xpbmVhciBpbnRlZ3JhdGVkIGNpcmN1aXRzIzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjIwLjAwI0RpZ2l0YWwgaW50ZWdyYXRlZCBjaXJjdWl0cyMzMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNi4yMS4wMCNTeW5jaHJvbm91cyBkeW5hbWljIHJhbmRvbSBhY2Nlc3MgbWVtb3J5IChTRFJBTSkjMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMjIuMDAjRmxhc2ggbWVtb3J5IzMyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE2LjIzLjAwI1JhbWJ1cyBkeW5hbWljIHJhbmRvbSBhY2Nlc3MgbWVtb3J5UkRSQU0jMzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTYuMjQuMDAjU3luY2hyb25vdXMgZ3JhcGhpYyByYW5kb20gYWNjZXNzIG1lbW9yeSBTR1JBTSMzMi4xMC4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNy4wMC4wMCNIeWJyaWQgaW50ZWdyYXRlZCBjaXJjdWl0cyMzMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xNy4wMS4wMCNNaWNyb3Byb2Nlc3NvcnMjMzIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTcuMDIuMDAjQ2xvY2sgb3NjaWxsYXRvcnMjMzIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTAuMTcuMDMuMDAjTWljcm9jb250cm9sbGVycyMzMi4xMC4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMC4xOC4wMC4wMCNVbm1vdW50ZWQgaW50ZWdyYXRlZCBjaXJjdWl0cyMzMi4xMC4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xOC4wMS4wMCNVbm1vdW50ZWQgZGllcyMzMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMi4xMC4xOC4wMi4wMCNVbm1vdW50ZWQgd2FmZXJzIzMyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzMyLjEwLjE4LjAzLjAwI1VubW91bnRlZCBjaGlwcyMzMi4xMC4xOC4wMC4wMAotdW5zcHNjNyMzMi4xMS4wMC4wMC4wMCNEaW9kZXMgYW5kIHRyYW5zaXN0b3JzIGFuZCBzZW1pY29uZHVjdG9yIGRldmljZXMjMzIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDAuMDAjRGlvZGVzIzMyLjExLjAwLjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjAxLjAwI01pY3Jvd2F2ZSBkaW9kZXMjMzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDIuMDAjWmVuZXIgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjAzLjAwI0xpZ2h0IGVtaXR0aW5nIGRpb2RlcyAoTEVEcykjMzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDQuMDAjU2Nob3R0a3kgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjA1LjAwI1R1bm5lbCBkaW9kZXMjMzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDYuMDAjUGhvdG9zZW5zaXRpdmUgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjA3LjAwI1ZhcmlhYmxlIGNhcGFjaXRhbmNlIGRpb2RlcyMzMi4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNS4wOC4wMCNTb2xhciBkaW9kZXMjMzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTUuMDkuMDAjUG93ZXIgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE1LjEwLjAwI1JhZGlvIGZyZXF1ZW5jeSAoUkYpIGRpb2RlcyMzMi4xMS4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNS4xMS4wMCNTbWFsbCBzaWduYWwgZGlvZGVzIzMyLjExLjE1LjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjAwLjAwI1RyYW5zaXN0b3JzIzMyLjExLjAwLjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjAxLjAwI1Bob3RvIHNlbnNpdGl2ZSB0cmFuc2lzdG9ycyMzMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNi4wMi4wMCNGaWVsZCBlZmZlY3QgdHJhbnNpc3RvcnMgKEZFVCkjMzIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTYuMDMuMDAjTWV0YWwgb3hpZGUgc2lsaWNvbmUgZmllbGQgZWZmZWN0IHRyYW5zaXN0b3JzIChNT1NGRVQpIzMyLjExLjE2LjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjA0LjAwI1RyYW5zaXN0b3IgY2hpcHMjMzIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTYuMDUuMDAjVHJhbnNpc3RvciBkaWVzIzMyLjExLjE2LjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjA2LjAwI1RyYW5zaXN0b3Igd2FmZXJzIzMyLjExLjE2LjAwLjAwCi11bnNwc2M3IzMyLjExLjE2LjA3LjAwI0JpcG9sYXIgZGFybGluZ3RvbiBvciByYWRpbyBmcmVxdWVuY3kgKFJGKSB0cmFuc2lzdG9ycyMzMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNi4wOC4wMCNVbmlqdW5jdGlvbiB0cmFuc2lzdG9ycyMzMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNi4wOS4wMCNJbnN1bGF0ZWQgZ2F0ZSBiaXBvbGFyIHRyYW5zaXN0b3JzIChJR0JUKSMzMi4xMS4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNi4xMC4wMCNKdW5jdGlvbiBmaWVsZCBlZmZlY3QgdHJhbnNpc3RvcnMgKEpGRVQpIzMyLjExLjE2LjAwLjAwCi11bnNwc2M3IzMyLjExLjE3LjAwLjAwI1NlbWljb25kdWN0b3IgZGV2aWNlcyMzMi4xMS4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNy4wMS4wMCNQaG90b3ZvbHRhaWMgY2VsbHMjMzIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTcuMDIuMDAjVGh5cmlzdG9ycyMzMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNy4wMy4wMCNEaWFjcyMzMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNy4wNC4wMCNUcmlhY3MjMzIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTcuMDUuMDAjT3B0aWNhbCBjb3VwbGVkIGlzb2xhdG9ycyMzMi4xMS4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMS4xNy4wNi4wMCNDcnlzdGFsIG9zY2lsbGF0b3JzIzMyLjExLjE3LjAwLjAwCi11bnNwc2M3IzMyLjExLjE4LjAwLjAwI0ludGVncmF0ZWQgY2lyY3VpdCBjb21wb25lbnRzIzMyLjExLjAwLjAwLjAwCi11bnNwc2M3IzMyLjExLjE4LjAxLjAwI0ludGVyZ3JhdGVkIGNpcmN1aXQgbGlkcyMzMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOC4wMi4wMCNJbnRlZ3JhdGVkIGNpcmN1aXQgcGFja2FnZXMjMzIuMTEuMTguMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTguMDMuMDAjU3Vic3RyYXRlcyMzMi4xMS4xOC4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4wMC4wMCNSYWRpbyBmcmVxdWVuY3kgKFJGKSBjb21wb25lbnRzIzMyLjExLjAwLjAwLjAwCi11bnNwc2M3IzMyLjExLjE5LjAxLjAwI0FtcGxpZmllcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDIuMDAjQXR0ZW51YXRvcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDMuMDAjQ2lyY3VsYXRvcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDQuMDAjQ291cGxlcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDUuMDAjRGVsYXkgbGluZXMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDYuMDAjRGV0ZWN0b3JzIzMyLjExLjE5LjAwLjAwCi11bnNwc2M3IzMyLjExLjE5LjA3LjAwI0R1bW15IGxvYWRzIzMyLjExLjE5LjAwLjAwCi11bnNwc2M3IzMyLjExLjE5LjA4LjAwI1JhZGlvIGZyZXF1ZW5jeSAoUkYpIGZpbHRlcnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMDkuMDAjSXNvbGF0b3JzIzMyLjExLjE5LjAwLjAwCi11bnNwc2M3IzMyLjExLjE5LjEwLjAwI01peGVycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4xMS4wMCNQaGFzZSBzaGlmdGVycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4xMi4wMCNQb3dlciBkaXZpZGVycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4xMy4wMCNXYXZlIHR1YmUgYW1wbGlmaWVycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMS4xOS4xNC4wMCNUZXJtaW5hdGlvbnMjMzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjMzIuMTEuMTkuMTUuMDAjTW9kdWxhdG9ycyMzMi4xMS4xOS4wMC4wMAotdW5zcHNjNyMzMi4xMi4wMC4wMC4wMCNQcmludGVkIGNvbXBvbmVudHMjMzIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTUuMDAuMDAjQ2FwYWNpdG9ycyMzMi4xMi4wMC4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNS4wMS4wMCNGaXhlZCBjYXBhY2l0b3JzIzMyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE1LjAyLjAwI1ZhcmlhYmxlIGNhcGFjaXRvcnMgb3IgdmFyYWN0b3JzIzMyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE1LjAzLjAwI0FkanVzdGFibGUgcHJlIHNldCBjYXBhY2l0b3JzIzMyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE1LjA0LjAwI0NhcGFjaXRvciBuZXR3b3JrcyMzMi4xMi4xNS4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNi4wMC4wMCNSZXNpc3RvcnMjMzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTYuMDEuMDAjVGhlcm1pc3RvcnMjMzIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTYuMDIuMDAjRnVzaXN0b3JzIzMyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE2LjAzLjAwI1ZhcmlhYmxlIHJlc2lzdG9ycyBvciB2YXJpc3RvcnMjMzIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTYuMDQuMDAjRml4ZWQgY2FyYm9uIHJlc2lzdG9ycyMzMi4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNi4wNS4wMCNGaXhlZCB0aGljayBmaWxtIHJlc2lzdG9ycyMzMi4xMi4xNi4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNi4wNi4wMCNGaXhlZCB0aGluIGZpbG0gcmVzaXN0b3JzIzMyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE2LjA3LjAwI1Jlc2lzdG9yIG5ldHdvcmtzIzMyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE2LjA4LjAwI1dpcmUgd291bmQgcmVzaXN0b3JzIzMyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE3LjAwLjAwI0Rpc2NyZXRlIGNvbXBvbmVudHMjMzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTcuMDEuMDAjUmVjdGlmaWVycyMzMi4xMi4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMi4xNy4wMi4wMCNJbmR1Y3RvcnMjMzIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTcuMDMuMDAjRmVycml0ZXMjMzIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTcuMDQuMDAjU3RhdGljIGNvbnZlcnRlcnMjMzIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjMzIuMTIuMTcuMDUuMDAjSW52ZXJ0ZXJzIzMyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzMyLjEyLjE3LjA2LjAwI1Jlc2lzdG9yIG9yIGNhcGFjaXRvciAoUi9DKSBuZXR3b3JrcyMzMi4xMi4xNy4wMC4wMAotdW5zcHNjNyMzMi4xMy4wMC4wMC4wMCNQYXNzaXZlIGNvbXBvbmVudHMjMzIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTMuMTAuMDAuMDAjVGVtcGVyYXR1cmUgY29udHJvbHMjMzIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjMzIuMTMuMTAuMDEuMDAjSGVhdCBzaW5rcyMzMi4xMy4xMC4wMC4wMAotdW5zcHNjNyMzOS4wMC4wMC4wMC4wMCNMaWdodGluZyBhbmQgRWxlY3RyaWNhbCBBY2Nlc3NvcmllcyBhbmQgU3VwcGxpZXMjMzkuMDAuMDAuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMDAuMDAuMDAjTGFtcHMgYW5kIGxpZ2h0YnVsYnMgYW5kIGxhbXAgY29tcG9uZW50cyMzOS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4wMC4wMCNMYW1wcyMzOS4xMC4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4wMS4wMCNIYWxvZ2VuIGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjAyLjAwI01lZGljYWwgbGFtcHMjMzkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTYuMDMuMDAjU29sYXIgbGFtcHMjMzkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTYuMDQuMDAjQWxjb2hvbCBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4wNS4wMCNGbHVvcmVzY2VudCBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4wNi4wMCNBcmMgbGFtcHMjMzkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTYuMDguMDAjU2hhZG93bGVzcyBvciBzY2lhbHl0aWMgb3BlcmF0aW9uIGxpZ2h0IzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjA5LjAwI1N0YWdlIG9yIHN0dWRpbyBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4xMC4wMCNGaWxhbWVudCBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4xMS4wMCNIaWdoIGludGVuc2l0eSBkaXNjaGFyZ2UgKEhJRCkgbGFtcHMjMzkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTYuMTIuMDAjSW5jYW5kZXNjZW50IGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjEzLjAwI0luZnJhcmVkIGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjE0LjAwI01ldGFsIGhhbGlkZSBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4xNS4wMCNWYXBvciBsYW1wcyMzOS4xMC4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMC4xNi4xNi4wMCNVbHRyYXZpb2xldCAoVVYpIGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE2LjE3LjAwI0hpZ2ggcHJlc3N1cmUgc29kaXVtIGxhbXBzIzM5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE3LjAwLjAwI0J1bGIgZ2xhc3MjMzkuMTAuMDAuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTcuMDEuMDAjRmx1b3Jlc2NlbnQgdHViZXMjMzkuMTAuMTcuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTguMDAuMDAjTGFtcCBjb21wb25lbnRzIzM5LjEwLjAwLjAwLjAwCi11bnNwc2M3IzM5LjEwLjE4LjAxLjAwI0xhbXAgZmlsYW1lbnQjMzkuMTAuMTguMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTkuMDAuMDAjTW9iaWxlIGFuZCBmaXhlZCBmbG9vZGxpZ2h0aW5nIzM5LjEwLjAwLjAwLjAwCi11bnNwc2M3IzM5LjEwLjE5LjAxLjAwI0xpZ2h0IHRvd2VyIzM5LjEwLjE5LjAwLjAwCi11bnNwc2M3IzM5LjEwLjE5LjAyLjAwI0xpZ2h0IGNhcnQjMzkuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzkuMTAuMTkuMDMuMDAjTGlnaHQgc3RhbmQjMzkuMTAuMTkuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMDAuMDAuMDAjTGlnaHRpbmcgYW5kIGZpeHR1cmVzIGFuZCBhY2Nlc3NvcmllcyMzOS4wMC4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4wMC4wMCNJbnRlcmlvciBsaWdodGluZyBhbmQgZml4dHVyZXMjMzkuMTEuMDAuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDEuMDAjRmx1b3Jlc2NlbnQgZml4dHVyZXMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDIuMDAjVmFuaXR5IGxpZ2h0aW5nIzM5LjExLjE1LjAwLjAwCi11bnNwc2M3IzM5LjExLjE1LjAzLjAwI1dhbGwgZml4dHVyZXMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDQuMDAjU3RhZ2Ugb3Igc3R1ZGlvIGxpZ2h0aW5nIHN5c3RlbXMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDUuMDAjUmVjZXNzZWQgbGlnaHRpbmcjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDYuMDAjQ2hhbmRlbGllcnMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMDcuMDAjRGVzayBmaXh0dXJlcyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4wOC4wMCNUcmFjayBsaWdodGluZyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4wOS4wMCNGbG9vciB0b3JjaGllcmUjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMTAuMDAjVGFibGUgbGFtcHMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMTEuMDAjRGVjb3JhdGl2ZSBsaWdodGluZyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xMi4wMCNMYWJvcmF0b3J5IGJlbmNoIGxpZ2h0cyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xMy4wMCNJbnRlcmlvciBzb2xhciBsaWdodGluZyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xNC4wMCNUcmVlIGxpZ2h0cyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xNS4wMCNEb3dubGlnaHRpbmcgZml4dHVyZXMjMzkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTUuMTYuMDAjVGFzayBsaWdodGluZyBmaXh0dXJlcyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xNy4wMCNXYXggY2FuZGxlcyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xOC4wMCNIYW5kIG9yIGV4dGVuc2lvbiBsaWdodCMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4xOS4wMCNDYW5kbGUgaG9sZGVycyMzOS4xMS4xNS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNS4yMC4wMCNIYWxvZ2VuIGxpZ2h0aW5nIGZpeHR1cmVzIzM5LjExLjE1LjAwLjAwCi11bnNwc2M3IzM5LjExLjE2LjAwLjAwI0V4dGVyaW9yIGxpZ2h0aW5nIGFuZCBmaXh0dXJlcyMzOS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNi4wMy4wMCNSb2Fkd2F5IG9yIGhpZ2h3YXkgbGlnaHRpbmcjMzkuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTYuMDUuMDAjTGFuZHNjYXBlIG9yIGFyZWEgbGlnaHRpbmcjMzkuMTEuMTYuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTYuMDYuMDAjVW5kZXJ3YXRlciBsaWdodGluZyMzOS4xMS4xNi4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNi4wOC4wMCNSZXNpZGVudGlhbCBzdHJlZXQgbGlnaHRzIzM5LjExLjE2LjAwLjAwCi11bnNwc2M3IzM5LjExLjE2LjA5LjAwI0tlcm9zZW5lIG9yIHByb3BhbmUgb3IgYnV0YW5lIGxhbnRlcm5zIzM5LjExLjE2LjAwLjAwCi11bnNwc2M3IzM5LjExLjE3LjAwLjAwI0VtZXJnZW5jeSBsaWdodGluZyMzOS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNy4wMi4wMCNGbGFzaGxpZ2h0cyMzOS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzOS4xMS4xNy4wMy4wMCNTdG9ybSBsaWdodHMjMzkuMTEuMTcuMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTcuMDQuMDAjRmxvb2QgbGlnaHRzIzM5LjExLjE3LjAwLjAwCi11bnNwc2M3IzM5LjExLjE3LjA1LjAwI0xpZ2h0IHN0aWNrcyMzOS4xMS4xNy4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4wMC4wMCNMaWdodGluZyBhY2Nlc3NvcmllcyMzOS4xMS4wMC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4wMS4wMCNMYW1wIGJhbGxhc3RzIzM5LjExLjE4LjAwLjAwCi11bnNwc2M3IzM5LjExLjE4LjAyLjAwI0xhbXAgaG91c2luZ3MjMzkuMTEuMTguMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTguMDMuMDAjTGFtcCBzb2NrZXRzIzM5LjExLjE4LjAwLjAwCi11bnNwc2M3IzM5LjExLjE4LjA0LjAwI0xhbXAgYmFzZXMjMzkuMTEuMTguMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTguMDUuMDAjTGFtcCBicmFja2V0cyMzOS4xMS4xOC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4wNi4wMCNMaWdodCBib3hlcyMzOS4xMS4xOC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4wOC4wMCNHcmlsbGVzIzM5LjExLjE4LjAwLjAwCi11bnNwc2M3IzM5LjExLjE4LjA5LjAwI0xpZ2h0IGNvbmRpdGlvbmVyIGZpbHRlcnMjMzkuMTEuMTguMDAuMDAKLXVuc3BzYzcjMzkuMTEuMTguMTAuMDAjTGFtcCBzdGFydGVyIzM5LjExLjE4LjAwLjAwCi11bnNwc2M3IzM5LjExLjE4LjExLjAwI0VsZWN0cmlmaWVkIHRyYWNrcyMzOS4xMS4xOC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOC4xMi4wMCNMYW1wIGNvdmVycyMzOS4xMS4xOC4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOS4wMC4wMCNIYXphcmRvdXMgbG9jYXRpb24gbGlnaHRpbmcgYW5kIGZpeHR1cmVzIzM5LjExLjAwLjAwLjAwCi11bnNwc2M3IzM5LjExLjE5LjAxLjAwI0hhemFyZG91cyBsb2NhdGlvbiBmbG91cmVzY2VudCBmaXh0dXJlcyMzOS4xMS4xOS4wMC4wMAotdW5zcHNjNyMzOS4xMS4xOS4wMi4wMCNIYXphcmRvdXMgbG9jYXRpb24gaW5jYW5kZXNjZW50IGZpeHR1cmVzIzM5LjExLjE5LjAwLjAwCi11bnNwc2M3IzQwLjAwLjAwLjAwLjAwI0Rpc3RyaWJ1dGlvbiBhbmQgQ29uZGl0aW9uaW5nIFN5c3RlbXMgYW5kIEVxdWlwbWVudCBhbmQgQ29tcG9uZW50cyM0MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xMC4wMC4wMC4wMCNIZWF0aW5nIGFuZCB2ZW50aWxhdGlvbiBhbmQgYWlyIGNpcmN1bGF0aW9uIzQwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjAwLjAwI1ZlbnRpbGF0aW9uIzQwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjAxLjAwI0FpciBjb2xsZWN0b3JzIzQwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjAyLjAwI0FpciBleGhhdXN0ZXJzIzQwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjAzLjAwI1ZlbnRzIzQwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE1LjA0LjAwI1ZlbnRpbGF0aW9uIGRhbXBlcnMjNDAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTUuMDUuMDAjQWlyIGRpZmZ1c2VycyM0MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNS4wNi4wMCNWZW50aWxhdGlvbiBwaXBlcyM0MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNi4wMC4wMCNBaXIgY2lyY3VsYXRpb24jNDAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTYuMDEuMDAjQmxvd2VycyM0MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNi4wMi4wMCNBaXIgY2lyY3VsYXRvcnMjNDAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTYuMDMuMDAjSW1wZWxsZXJzIzQwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE2LjA0LjAwI0ZhbnMjNDAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTcuMDAuMDAjQ29vbGluZyM0MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNy4wMS4wMCNBaXIgY29uZGl0aW9uZXJzIzQwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE3LjAyLjAwI0Nvb2xpbmcgZXhjaGFuZ2VycyM0MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xMC4xNy4wMy4wMCNFdmFwb3JhdGl2ZSBjb29sZXJzIzQwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE3LjA0LjAwI0NvbmRlbnNpbmcgdW5pdHMjNDAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMDAuMDAjSGVhdGluZyBlcXVpcG1lbnQjNDAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMDEuMDAjUmFkaWF0b3JzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjAyLjAwI0hlYXQgZXhjaGFuZ2VycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4wMy4wMCNGaXJlcGxhY2VzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjA0LjAwI0hlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMDUuMDAjRnVybmFjZXMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMDYuMDAjSGVhdCBwdW1wcyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4wNy4wMCNTb2xhciBoZWF0aW5nIHVuaXRzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjA4LjAwI0hlYXRpbmcgc3RvdmVzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjA5LjAwI0NpcmN1bGF0aW9uIGhlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMTAuMDAjQ29pbCBkdWN0IGhlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMTEuMDAjQ29udmVjdGlvbiBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjEyLjAwI0RpdmlkZWQgZXhjaGFuZ2VycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4xMy4wMCNEb3VibGUgc3BsaXQgZXhjaGFuZ2VycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4xNC4wMCNGaW5uZWQgdHVidWxhciBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjE1LjAwI0ltbWVyc2lvbiBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjE2LjAwI0tldHRsZSBleGNoYW5nZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjE3LjAwI09uZSBwYXNzIGV4Y2hhbmdlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMTguMDAjUHJvY2VzcyBhaXIgaGVhdGVycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4xOS4wMCNTcGFjZSBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjIwLjAwI1NwbGl0IGV4Y2hhbmdlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMjEuMDAjU3RyaXAgaGVhdGVycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4yMi4wMCNUdWJ1bGFyIGhlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMjMuMDAjVHdvIHBhc3MgZXhjaGFuZ2VycyM0MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOC4yNC4wMCNRdWFydHogaGVhdGVyIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE4LjI1LjAwI0RvbWVzdGljIHdhdGVyIGhlYXRlcnMjNDAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTguMjYuMDAjQ29tbWVyY2lhbCB3YXRlciBoZWF0ZXJzIzQwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE5LjAwLjAwI0h1bWlkaXR5IGNvbnRyb2wjNDAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMTkuMDEuMDAjVmFwb3JpemVycyM0MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0MC4xMC4xOS4wMi4wMCNEZWh1bWlkaWZpZXJzIzQwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQwLjEwLjE5LjAzLjAwI0h1bWlkaWZpZXJzIzQwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQwLjEwLjIwLjAwLjAwI0JvaWxlcnMjNDAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMjAuMDEuMDAjRmlyZSB0dWJlIGJvaWxlcnMjNDAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMjAuMDIuMDAjV2F0ZXIgdHViZSBib2lsZXIjNDAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTAuMjAuMDMuMDAjRWxlY3RyaWMgYm9pbGVycyM0MC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4wMC4wMC4wMCNGbHVpZCBhbmQgZ2FzIGRpc3RyaWJ1dGlvbiM0MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNS4wMC4wMCNGbHVpZCBhbmQgZ2FzIGNvbmR1aXRzIzQwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjE1LjAyLjAwI0R1Y3RzIzQwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE1LjA0LjAwI0hvc2VzIzQwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjAwLjAwI1ZhbHZlcyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4wMS4wMCNDaGVjayB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMDIuMDAjTmVlZGxlIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4wMy4wMCNQbmV1bWF0aWMgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjA0LjAwI1NhZmV0eSB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMDUuMDAjU29sZW5vaWQgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjA2LjAwI1JlbGllZiB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMDcuMDAjQmFsbCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMDguMDAjSHlkcmF1bGljIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4wOS4wMCNDb250cm9sIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4xMC4wMCNGbG9hdCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMTEuMDAjR2xvYmUgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjEyLjAwI0V4cGFuc2lvbiB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMTMuMDAjR2F0ZSB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMTQuMDAjQnV0dGVyZmx5IHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4xNS4wMCNGbGFwIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4xNi4wMCNWYWx2ZSBwYXJ0cyBhbmQgYWNjZXNzb3JpZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMTcuMDAjQW5nbGUgZ2xvYmUgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjE4LjAwI0JhbGwgY2hlY2sgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjE5LjAwI0J1dHRlcmZseSBsdWcgcGF0dGVybiB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMjAuMDAjQnV0dGVyZmx5IHdhZmVyIHBhdHRlcm4gdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjIxLjAwI0RpYXBocmFnbSB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMjIuMDAjSW5saW5lIGNoZWNrIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4yMy4wMCNLbmlmZSBnYXRlIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4yNC4wMCNMdWJyaWNhdGVkIHBsdWcgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjI1LjAwI011ZCBvciBzbHVzaCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMjYuMDAjTm9ubHVicmljYXRlZCBwbHVnIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4yNy4wMCNPcmlmaWNlIHZhbHZlcyM0MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNi4yOC4wMCNQaWxvdCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMjkuMDAjUGluY2ggdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjMwLjAwI1Bpc3RvbiBjaGVjayB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMzEuMDAjUHVtcCB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMzIuMDAjU2VudGluZWwgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjMzLjAwI1NsaWRlciB2YWx2ZXMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMzQuMDAjU3dpbmcgY2hlY2sgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjM1LjAwI1R1cmJpbmUgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE2LjM2LjAwI1ZhbHZlIGtpdHMjNDAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTYuMzcuMDAjV2FmZXIgY2hlY2sgdmFsdmVzIzQwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjAwLjAwI0hhcmR3YXJlIGFuZCBmaXR0aW5ncyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wMS4wMCNEcmFpbnMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMDIuMDAjRmF1Y2V0cyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wMy4wMCNTaG93ZXIgaGVhZHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMDQuMDAjU3BpZ290cyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wNS4wMCNTcG91dHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMDYuMDAjUGlwZSBwbHVncyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wNy4wMCNQaXBlIGNsYW1wcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4wOC4wMCNMaXF1aWQgdHJhcHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMDkuMDAjU3RlYW0gdHJhcHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMTAuMDAjUGx1bWJpbmcgZmxhbmdlcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4xMS4wMCNNZXRhbCBvciBydWJiZXIgZXhwYW5zaW9uIGpvaW50cyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4xMi4wMCNQaXBlIGNhcHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMTMuMDAjUGx1bWJpbmcgdW5pb25zIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjE0LjAwI1BsdW1iaW5nIGNyb3NzZXMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMTUuMDAjUGx1bWJpbmcgbmlwcGxlcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4xNi4wMCNQIHRyYXBzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjE3LjAwI1BpcGUgYmVuZHMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMTguMDAjUGx1bWJpbmcgZWxib3dzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjE5LjAwI1BsdW1iaW5nIGFkYXB0ZXJzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjIwLjAwI1BsdW1iaW5nIGNvbm5lY3RvcnMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMjEuMDAjUGx1bWJpbmcgY291cGxpbmdzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjIyLjAwI0hhbGYgY291cGxpbmdzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjIzLjAwI1JlZHVjaW5nIGNvdXBsaW5ncyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4yNC4wMCNQbHVtYmluZyBidXNoaW5ncyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4yNS4wMCNQbHVtYmluZyBoYW5nZXJzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjI2LjAwI0h5ZHJhbnRzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjI3LjAwI1BsdW1iaW5nIHZlbnRzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjI4LjAwI0ZsdWlkIHJlZ3VsYXRvcnMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMjkuMDAjUGx1bWJpbmcgdGVlcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zMC4wMCNTdHJhaW5lcnMjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMzEuMDAjTm96emxlcyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zMi4wMCNQbHVtYmluZyBzcGlkZXJzIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE3LjMzLjAwI1BpcGUgZml0dGluZyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zNC4wMCNIb3NlIGZpdHRpbmcjNDAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTcuMzUuMDAjRnVubmVscyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zNi4wMCNHcmVhc2UgZml0dGluZyM0MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNC4xNy4zNy4wMCNEaWFwaHJhZ21zIzQwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjAwLjAwI1R1YmUgYW5kIHR1YmluZyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4wMS4wMCNGZXJyb3VzIGFsbG95IHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4wMi4wMCNDb3BwZXIgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjAzLjAwI1RpdGFuaXVtIHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4wNC4wMCNNYWduZXNpdW0gdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjA1LjAwI1RpbiB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMDYuMDAjQnJhc3MgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjA3LjAwI0xlYWQgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjA4LjAwI0Jyb256ZSB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMDkuMDAjWmluYyB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTAuMDAjU3RlZWwgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjExLjAwI0lyb24gdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjEyLjAwI0NlbWVudCB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTMuMDAjUGxhc3RpYyB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTQuMDAjUnViYmVyIHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4xNS4wMCNHbGFzcyB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTYuMDAjU3RvbmUgdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE4LjE3LjAwI05vbiBmZXJyb3VzIGFsbG95IHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4xOC4wMCNBbHVtaW51bSB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMTkuMDAjU3RhaW5sZXNzIHN0ZWVsIHR1YmluZyM0MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNC4xOC4yMC4wMCNQcmVjaW91cyBtZXRhbCB0dWJpbmcjNDAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTQuMTguMjEuMDAjTnlsb24gdHViaW5nIzQwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE5LjAwLjAwI0R1Y3RzIzQwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjE5LjAxLjAwI0ZsZXhpYmxlIGR1Y3RzIzQwLjE0LjE5LjAwLjAwCi11bnNwc2M3IzQwLjE0LjE5LjAyLjAwI1JpZ2lkIGR1Y3RzIzQwLjE0LjE5LjAwLjAwCi11bnNwc2M3IzQwLjE0LjIwLjAwLjAwI0hvc2VzIzQwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIwLjAxLjAwI0FjaWQgaG9zZXMjNDAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjAuMDIuMDAjQWlyIGhvc2VzIzQwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIwLjAzLjAwI0RyaWxsIGhvc2VzIzQwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIwLjA0LjAwI01hcmluZSBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4wNS4wMCNNYXRlcmlhbCBoYW5kbGluZyBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4wNi4wMCNPaWwgaG9zZXMjNDAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjAuMDcuMDAjU3BlY2lhbCBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4wOC4wMCNXYXRlciBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4wOS4wMCNBaXIgd2F0ZXIgZ2FzIG11bHRpcHVycG9zZSBob3NlcyM0MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMC4xMC4wMCNUZWZsb24gbGluZWQgaG9zZXMjNDAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjEuMDAuMDAjUGlwZSM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wMS4wMCNDYXJib24gc3RlZWwgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wMi4wMCNEdWN0aWxlIGlyb24gcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wMy4wMCNIaWdoIG5pY2tlbCBhbGxveSBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjA0LjAwI0hpZ2ggeWllbGQgc3RlZWwgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wNS4wMCNGZXJyaXRpYyBhbGxveSBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjA2LjAwI0FsdW1pbnVtIHBpcGUjNDAuMTQuMjEuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjEuMDcuMDAjQnJhc3MgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wOC4wMCNCcm9uemUgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4wOS4wMCNDb25jcmV0ZSBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjEwLjAwI0NvcHBlciBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjExLjAwI0Nhc3QgaXJvbiBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjEyLjAwI0xlYWQgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xMy4wMCNNYWduZXNpdW0gcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xNC4wMCNOb24gZmVycm91cyBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjE1LjAwI1BsYXN0aWMgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xNi4wMCNSdWJiZXIgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xNy4wMCNTdGFpbmxlc3Mgc3RlZWwgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xOC4wMCNUaW4gcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4xOS4wMCNUaXRhbml1bSBwaXBlIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIxLjIwLjAwI1ppbmMgcGlwZSM0MC4xNC4yMS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMS4yMS4wMCNIb3NlIHJlZWxzIzQwLjE0LjIxLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIyLjAwLjAwI0ZsdWlkIGFuZCBnYXMgcmVndWxhdG9ycyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMi4wMS4wMCNHYXMgcmVndWxhdG9ycyM0MC4xNC4yMi4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMi4wMi4wMCNGbHVpZCByZWd1bGF0b3JzIzQwLjE0LjIyLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjAwLjAwI1BpcGUgZml0dGluZ3MjNDAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDEuMDAjUGlwZSBhbmdsZSBmYWNlIHJpbmdzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjAyLjAwI1BpcGUgYnJhbmNoIG91dGxldHMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDMuMDAjUGlwZSBsYXRlcmFscyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4wNC4wMCNQaXBlIGluc2VydHMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDUuMDAjUGlwZSByZWR1Y2VycyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4wNi4wMCNQaXBlIHNhZGRsZXMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDcuMDAjUGlwZSBzdHViZW5kcyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4wOC4wMCNQaXBlIHd5ZXMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMDkuMDAjUGlwZSBiZW5kcyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xMC4wMCNQaXBlIGNhcHMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMTEuMDAjUGlwZSBoYWxmIGNvdXBsaW5ncyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xMi4wMCNQaXBlIGV4cGFuc2lvbiBqb2ludHMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMTMuMDAjUGlwZSBwbHVncyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xNC4wMCNQaXBlIGJ1c2hpbmdzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjE1LjAwI1BpcGUgY291cGxpbmdzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjE2LjAwI1BpcGUgY3Jvc3NlcyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xNy4wMCNQaXBlIGVsYm93cyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4xOC4wMCNQaXBlIG5pcHBsZXMjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjMuMTkuMDAjUGlwZSB0ZWVzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjIwLjAwI1BpcGUgdW5pb25zIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjIxLjAwI1BpcGUgcmVkdWNpbmcgY291cGxpbmdzIzQwLjE0LjIzLjAwLjAwCi11bnNwc2M3IzQwLjE0LjIzLjIyLjAwI1BpcGUgcmVwYWlyIGNsYW1wcyM0MC4xNC4yMy4wMC4wMAotdW5zcHNjNyM0MC4xNC4yMy4yMy4wMCNSdXB0dXJlIGRpc2sjNDAuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjQuMDAuMDAjUGlwZSBmbGFuZ2VzIzQwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjAxLjAwI0FtbW9uaWEgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4wMi4wMCNCYWNrdXAgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4wMy4wMCNCbGluZCBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjA0LjAwI0xhcGpvaW50IGZsYW5nZXMjNDAuMTQuMjQuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjQuMDUuMDAjTG9uZyB3ZWxkbmVjayBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjA2LjAwI09yaWZpY2UgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4wNy4wMCNQbGF0ZSBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjA4LjAwI1NsaXBvbiBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjA5LjAwI1NvY2tldHdlbGQgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4xMC4wMCNTcGVjdGFjbGUgYmxpbmQgZmxhbmdlcyM0MC4xNC4yNC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNC4xMS4wMCNUaHJlYWRlZCBmbGFuZ2VzIzQwLjE0LjI0LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI0LjEyLjAwI1dlbGRuZWNrIGZsYW5nZXMjNDAuMTQuMjQuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjUuMDAuMDAjVHJhcHMgYW5kIHN0cmFpbmVycyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNS4wMS4wMCNMaXF1aWQgc3RyYWluZXJzIzQwLjE0LjI1LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI1LjAyLjAwI0xpcXVpZCB0cmFwcyM0MC4xNC4yNS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNS4wMy4wMCNTdGVhbSB0cmFwcyM0MC4xNC4yNS4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNS4wNC4wMCNTdGVhbSBzdHJhaW5lcnMjNDAuMTQuMjUuMDAuMDAKLXVuc3BzYzcjNDAuMTQuMjYuMDAuMDAjVHViZSBmaXR0aW5ncyM0MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNC4yNi4wMS4wMCNCcmFzcyB0dWJlIGZpdHRpbmdzIzQwLjE0LjI2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI2LjAyLjAwI0NhcmJvbiBzdGVlbCB0dWJlIGZpdHRpbmdzIzQwLjE0LjI2LjAwLjAwCi11bnNwc2M3IzQwLjE0LjI2LjAzLjAwI1N0YWlubGVzcyBzdGVlbCB0dWJlIGZpdHRpbmdzIzQwLjE0LjI2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjAwLjAwLjAwI0luZHVzdHJpYWwgcHVtcHMgYW5kIGNvbXByZXNzb3JzIzQwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjAwLjAwI1B1bXBzIzQwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjAxLjAwI0FpciBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4wMi4wMCNWYWN1dW0gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDMuMDAjQ2VudHJpZnVnYWwgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDQuMDAjQ2lyY3VsYXRpbmcgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDUuMDAjRG9zaW5nIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjA2LjAwI0hhbmQgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDcuMDAjSXJyaWdhdGlvbiBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4wOC4wMCNNdWQgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMDkuMDAjUmVjaXByb2NhdGluZyBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4xMC4wMCNXYXRlciBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4xMS4wMCNXZWxsIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjEyLjAwI1N1bXAgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTMuMDAjU3VibWVyc2libGUgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTQuMDAjU3RlYW0gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTUuMDAjU29sZW5vaWQgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTYuMDAjU2hlYXIgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMTcuMDAjU2V3YWdlIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjE4LjAwI1NlYWxsZXNzIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjE5LjAwI1Nhbml0YXJ5IHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjIwLjAwI1NhbXBsaW5nIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjIxLjAwI1JvdGFyeSBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4yMi4wMCNSZXZlcnNlIG9zbW9zaXMgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMjMuMDAjUG9zaXRpdmUgZGlzcGxhY2VtZW50IHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjI0LjAwI09pbCBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4yNS4wMCNTbHVkZ2UgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMjYuMDAjVHVyYmluZSBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4yNy4wMCNQbHVuZ2VyIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjI4LjAwI09zY2lsbGF0aW5nIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjI5LjAwI0RydW0gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMzAuMDAjRHJlZGdlIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjMxLjAwI0Rld2F0ZXJpbmcgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMzIuMDAjRnVlbCBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4zMy4wMCNIeWRyYXVsaWMgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMzQuMDAjQ3J5b2dlbmljIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjM1LjAwI1NsdWRnZSBwdW1wIHNwYXJlIHBhcnRzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjM2LjAwI1Nld2FnZSBwdW1wIHNwYXJlIHBhcnRzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjM3LjAwI1N1Ym1lcnNpYmxlIHB1bXAgc3BhcmUgcGFydHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuMzguMDAjV2F0ZXIgcHVtcCBzcGFyZSBwYXJ0cyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS4zOS4wMCNXZWxsIHB1bXAgc3BhcmUgcGFydHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNDAuMDAjU3VtcCBwdW1wIHNwYXJlIHBhcnRzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjQxLjAwI0Rvc2luZyBwdW1wIHNwYXJlIHBhcnRzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjQyLjAwI0NlbnRyaWZ1Z2FsIHB1bXAgc3BhcmUgcGFydHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNDMuMDAjQ2lyY3VsYXRpb24gcHVtcCBzcGFyZSBwYXJ0cyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40NC4wMCNSb3RhcnkgcHVtcCBzcGFyZSBwYXJ0cyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40NS4wMCNQdW1wIHBhcnRzIGFuZCBhY2Nlc3NvcmllcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40Ni4wMCNBeGlhbCBzcGxpdCBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40Ny4wMCNEZWVwd2VsbCBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS40OC4wMCNEaWFwaHJhZ20gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNDkuMDAjRG91YmxlIGRpYXBocmFnbSBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS41MC4wMCNEdXBsZXggcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNTEuMDAjR2VhciBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS41Mi4wMCNNZXRlcmluZyBvciBpbmplY3Rpb24gb3IgcHJvcG9ydGlvbmluZyBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNS41My4wMCNQcm9ncmVzc2l2ZSBjYXZpdHkgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNTQuMDAjUmFtIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjU1LjAwI1JvdGFyeSBjYW0gcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNTYuMDAjUm90YXJ5IGxvYmUgcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNTcuMDAjUm90YXRpbmcgcGlzdG9uIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjU4LjAwI1NjcmV3IFB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjU5LjAwI1NpbXBsZXggcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNjAuMDAjU2xpZGluZyB2YW5lIHB1bXBzIzQwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE1LjYxLjAwI1RyaXBsZXggcHVtcHMjNDAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTUuNjIuMDAjV29ybSBwdW1wcyM0MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4wMC4wMCNDb21wcmVzc29ycyM0MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4wMS4wMCNBaXIgY29tcHJlc3NvcnMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTYuMDIuMDAjQXhpYWwgZmxvdyBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4wMy4wMCNEaWFwaHJhZ20gY29tcHJlc3NvcnMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTYuMDQuMDAjR2FzIGNvbXByZXNzb3JzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjA1LjAwI01vdG9yIGNvbXByZXNzb3JzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjA2LjAwI1JlY2lwcm9jYXRpbmcgY29tcHJlc3NvcnMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTYuMDcuMDAjUmVmcmlnZXJhbnQgY29tcHJlc3NvcnMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTYuMDguMDAjUm90YXJ5IGNvbXByZXNzb3JzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjA5LjAwI1NjcmV3IGNvbXByZXNzb3JzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjEwLjAwI0NvbXByZXNzb3IgcGFydHMgYW5kIGFjY2Vzc29yaWVzIzQwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE2LjExLjAwI0JhcnJlbCBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xMi4wMCNDZW50cmlmdWdhbCBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xMy4wMCNDb21iaW5hdGlvbiBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xNC4wMCNTZW1pIHJhZGlhbCBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xNS4wMCNUdXJibyBjb21wcmVzc29ycyM0MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM0MC4xNS4xNi4xNi4wMCNDb21wcmVzc29yIGtpdHMjNDAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTcuMDAuMDAjUHVtcCBwYXJ0cyBhbmQgYWNjZXNzb3JpZXMjNDAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTUuMTcuMDEuMDAjUHVtcCBjYXNpbmdzIzQwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE1LjE3LjAyLjAwI1B1bXAgcGFja2luZ3MjNDAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMDAuMDAuMDAjSW5kdXN0cmlhbCBmaWx0ZXJpbmcgYW5kIHB1cmlmaWNhdGlvbiM0MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNS4wMC4wMCNGaWx0ZXJzIzQwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjAxLjAwI1ZhY3V1bSBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjAyLjAwI1dhdGVyIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMDMuMDAjRHVzdCBjb2xsZWN0b3JzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjA0LjAwI09pbCBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjA1LjAwI0FpciBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjA2LjAwI0ZpbHRlcmluZyBtYWNoaW5lcnkjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMDcuMDAjRmlsdGVyIG1lbWJyYW5lcyM0MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNS4wOC4wMCNCYWcgZmlsdGVycyM0MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNS4wOS4wMCNBYnNvcnB0aW9uIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTAuMDAjQmFnIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTEuMDAjQ29hbGVzY2luZyBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjEyLjAwI0VsZWN0cm9uaWMgZmlsdGVycyM0MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNS4xMy4wMCNGdWVsIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTQuMDAjR2FzIHBpcGVsaW5lIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTUuMDAjSHlkcmF1bGljIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTYuMDAjSW4gbGluZSBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjE3LjAwI0xpZ2h0IGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMTguMDAjTWljcm9maWJlciBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjE5LjAwI1BhbmVsIGZpbHRlcnMjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMjAuMDAjUmFkaWFsIGZpbiBmaWx0ZXJzIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjIxLjAwI0ZpbHRlciBCYXNlIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjIyLjAwI0ZpbHRlciBGaW5zIzQwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE1LjIzLjAwI0Z1ZWwjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTUuMjQuMDAjUGFpbnQjNDAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTYuMDAuMDAjUHVyaWZpY2F0aW9uIzQwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQwLjE2LjE2LjAxLjAwI0FpciBzY3J1YmJlcnMjNDAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTYuMDIuMDAjQWlyIGNsZWFuZXJzIzQwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE3LjAwLjAwI1NlcGFyYXRvcnMjNDAuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTcuMDEuMDAjQ2VudHJpZnVnZXMjNDAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTcuMDIuMDAjV2V0IHNjcnViYmVycyM0MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM0MC4xNi4xNy4wMy4wMCNNaXN0IGVsaW1pbmF0b3JzIzQwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE4LjAwLjAwI0ZpbHRlciBtZWRpYSM0MC4xNi4wMC4wMC4wMAotdW5zcHNjNyM0MC4xNi4xOC4wMS4wMCNNZXRhbCBmYWJyaWMgbWVkaWEjNDAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNDAuMTYuMTguMDIuMDAjUHJlc3NlZCBmZWx0cyM0MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM0MC4xNi4xOC4wMy4wMCNGaWx0ZXIgcGFwZXJzIzQwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzQwLjE2LjE4LjA1LjAwI0ZpbHRlciBjbG90aCM0MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM0MS4wMC4wMC4wMC4wMCNMYWJvcmF0b3J5IGFuZCBNZWFzdXJpbmcgYW5kIE9ic2VydmluZyBhbmQgVGVzdGluZyBFcXVpcG1lbnQjNDEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMDAuMDAuMDAjTGFib3JhdG9yeSBhbmQgc2NpZW50aWZpYyBlcXVpcG1lbnQjNDEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMDAuMDAjTGFib3JhdG9yeSBibGVuZGluZyBhbmQgZGlzcGVyc2luZyBhbmQgaG9tb2dlbml6aW5nIGFuZCBtaXhpbmcgYW5kIHN0aXJyaW5nIGVxdWlwbWVudCM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wMS4wMCNNaXhlcnMgb3IgYmxlbmRlcnMgb3IgZW11bHNpZmllcnMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMDIuMDAjU3RvbWFjaGVycyM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wMy4wMCNMYWJvcmF0b3J5IHNwcmF5ZXJzIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE1LjA0LjAwI0hvbW9nZW5pc2VycyM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wNS4wMCNGcmVuY2ggcHJlc3N1cmUgY2VsbHMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMDYuMDAjUm9sbGVyIG1peGVycyM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wNy4wMCNSb3RhdG9ycyM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4wOC4wMCNWaWJyYXRvcnMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMTAuMDAjTWFnbmV0aWMgc3BpbiBiYXJzIG9yIHJldHJpZXZlcnMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMTEuMDAjU3RpcnJpbmcgdGFibGVzIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE1LjEyLjAwI011bHRpIGJhbmsgb3IgZmxvY2N1bGF0aW9uIGVxdWlwbWVudCM0MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNS4xMy4wMCNTaGFrZXJzIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE1LjE0LjAwI0xhYm9yYXRvcnkgY2VudHJpZnVnZXMjNDEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTUuMTUuMDAjTGlxdWlkIG1lYXN1cmluZyBjYW5zIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE1LjE2LjAwI0xpcXVpZCBkaXNwZW5zZXJzIzQxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjAwLjAwI0xhYm9yYXRvcnkgZml4dHVyZXMgYW5kIGFjY2Vzc29yaWVzIzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjAzLjAwI0xhYm9yYXRvcnkgc3RhbmRzIG9yIGNsYW1wcyBvciB0b25ncyM0MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNi4wNC4wMCNTbGlkZSBjb250YWluZXJzIzQxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjA1LjAwI1NsaWRlIGRyeWluZyBwbGF0ZXMjNDEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTYuMDcuMDAjTWljcm9zbGlkZSBtYWtpbmcgZXF1aXBtZW50IzQxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjA4LjAwI01pY3Jvc2xpZGUgc3RvcmFnZSBlcXVpcG1lbnQjNDEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTYuMDkuMDAjU3RhdGljIGVsaW1pbmF0b3JzIzQxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE2LjExLjAwI1NsaWRlIHdhcm1lcnMjNDEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTcuMDAuMDAjTGFib3JhdG9yeSBib3JpbmcgYW5kIGdyaW5kaW5nIGFuZCBjdXR0aW5nIGFuZCBjcnVzaGluZyBhbmQgcHJlc3NpbmcgZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjAxLjAwI01pbGxzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjAyLjAwI1Blc3RsZSBvciBtb3J0YXJzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjAzLjAwI1Rpc3N1ZSBncmluZGVycyM0MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4xNy4wNC4wMCNNaWNyb3RvbWVzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjA1LjAwI0NydXNoZXJzIG9yIHB1bHZlcmlzZXJzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjA2LjAwI0Rpc2ludGVncmF0b3JzIzQxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE3LjA3LjAwI0xhYm9yYXRvcnkgcHJlc3NlcyM0MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOC4wMC4wMCNMYWJvcmF0b3J5IGVsZWN0cm9uIGFuZCBzb2xpZCBzdGF0ZSBwaHlzaWNzIGVxdWlwbWVudCM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOC4wMS4wMCNFbGVjdHJvbiBndW5zIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjAyLjAwI1ggcmF5IGdlbmVyYXRvcnMjNDEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTguMDMuMDAjQ291bG9tZXRlcnMjNDEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTguMDQuMDAjRWxlY3Ryb3Njb3BlcyM0MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOC4wNS4wMCNGbHV4bWV0ZXJzIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjA2LjAwI01hZ25ldG9tZXRlcnMjNDEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTAuMTguMDcuMDAjRWxlY3Ryb24gZGlmZnJhY3Rpb24gYXBwYXJhdHVzIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjA4LjAwI05ldXRyb24gZGlmZnJhY3Rpb24gYXBwYXJhdHVzIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjA5LjAwI09wdGljYWwgZGlmZnJhY3Rpb24gYXBwYXJhdHVzIzQxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE4LjEwLjAwI0RpZmZyYWN0b21ldGVycyM0MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOS4wMC4wMCNMYWJvcmF0b3J5IGlvbmljIGVxdWlwbWVudCM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOS4wMS4wMCNJb24gc291cmNlcyM0MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4xOS4wMi4wMCNJb24gZXhjaGFuZ2UgYXBwYXJhdHVzIzQxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQxLjEwLjE5LjAzLjAwI0lvbiBpbXBsYW50YXRpb24gZXF1aXBtZW50IzQxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjAwLjAwI1NhbXBsaW5nIGFuZCBwdXJpZmljYXRpb24gZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjAxLjAwI1NhbXBsZSBjaGFuZ2VycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4wMi4wMCNTYW1wbGUgb3hpZGlzZXIjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMDMuMDAjU2FtcGxlIHByZXBhcmF0aW9uIGxpbmUjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMDQuMDAjU2FtcGxlIHByZXBhcmF0aW9uIGJvbWJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA1LjAwI1dhdGVyIHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA2LjAwI0FpciBzYW1wbGVycyBvciBjb2xsZWN0b3JzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA3LjAwI1JlYWdlbnQga2l0cyBmb3IgdXNlIHdpdGggYWlyIHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA4LjAwI0ZpbHRlcnMgb3Igb3RoZXIgc3BhcmUgcGFydHMgZm9yIHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjA5LjAwI0R1c3QgZmFsbCBob2xkZXJzIG9yIGphcnMjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMTEuMDAjU3VscGh1ciBkaW94aWRlIG9yIHNtb2tlIHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjEyLjAwI1NhbXBsZSBhcHBsaWNhdG9ycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4xMy4wMCNQbGFudCBzYW1wbGVzIGFuYWx5c2lzIGVxdWlwbWVudCM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4xNC4wMCNBaXIgcG9sbHV0YW50IHNhbXBsZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjE1LjAwI1dhdGVyIHB1cmlmaWNhdGlvbiByZWFnZW50cyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4xNi4wMCNEZWlvbmlzYXRpb24gb3IgZGVtaW5lcmFsaXNhdGlvbiBlcXVpcG1lbnQjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMTcuMDAjQmFzZSBleGNoYW5nZSBlcXVpcG1lbnQjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMTguMDAjUmV2ZXJzZSBvc21vc2lzIGVxdWlwbWVudCM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4xOS4wMCNVbHRyYSB2aW9sZXQgd2F0ZXIgcHVyaWZpY2F0aW9uIHVuaXRzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjIwLjAwI1VsdHJhIHB1cmUgd2F0ZXIgc3lzdGVtcyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4yMS4wMCNXYXRlciBhbmFseXNpcyBzeXN0ZW1zIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjIyLjAwI0RlaHlkcmF0b3JzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjIzLjAwI0Rlb3hpZGVycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4yNC4wMCNEaXNzb2x2ZXJzIzQxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIwLjI1LjAwI1NwZWNpbWVuIGhvbGRlcnMjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjAuMjYuMDAjU3BlY2ltZW4gY29sbGVjdG9ycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4yNy4wMCNTYW1wbGUgaG9sZGVycyM0MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMC4yOC4wMCNMdWJyaWNhbnQgc2FtcGxlcnMjNDEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMDAuMDAjTGFib3JhdG9yeSBmZXJtZW50YXRpb24gYW5kIGluY3ViYXRpbmcgZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjAxLjAwI1N0YW5kYXJkIGZlcm1lbnRhdGlvbiB1bml0cyM0MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMy4wMi4wMCNDb250aW51b3VzIGN1bHR1cmUgYXBwYXJhdHVzIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjAzLjAwI0FuYWVyb2JpYyBqYXJzIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjA0LjAwI0RpZ2VzdGlvbiBzeXN0ZW1zIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjA1LjAwI1dhdGVyIGphY2tldGVkIGluY3ViYXRvcnMjNDEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMDYuMDAjQ08yIGluY3ViYXRvcnMjNDEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMDcuMDAjVGlzc3VlIGN1bHR1cmUgaW5jdWJhdG9ycyM0MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMy4wOC4wMCNJbmN1YmF0b3Igb3ZlbnMjNDEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMDkuMDAjQ29vbGVkIGluY3ViYXRvcnMgKEJPRCkjNDEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjMuMTAuMDAjU2hha2luZyBpbmN1YmF0b3JzIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjExLjAwI0luc3Bpc3NhdG9ycyM0MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yMy4xMi4wMCNQbGF0ZSBpbmN1YmF0b3JzIzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjEzLjAwI0luIHZpdHJvIGN1bHR1cmUgZXF1aXBtZW50IzQxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjIzLjE0LjAwI0JhY3RlcmlhIGVxdWlwbWVudCM0MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4wMC4wMCNMYWJvcmF0b3J5IGhlYXRpbmcgYW5kIGRyeWluZyBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDEuMDAjR2FzIGJ1cm5lcnMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDIuMDAjU3Bpcml0IGJ1cm5lcnMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDMuMDAjTGFib3JhdG9yeSBpbmNpbmVyYXRvcnMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDQuMDAjTGFib3JhdG9yeSBoZWF0ZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjA1LjAwI01hbnRsZXMgb3IgdGFwZXMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMDYuMDAjSG90IHBsYXRlcyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4wNy4wMCNXYXJtaW5nIGNhYmluZXRzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjA4LjAwI0RyeWluZyBvdmVucyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4wOS4wMCNJbmR1Y3Rpb24gZHJ5ZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjEwLjAwI0luZnJhcmVkIGRyeWVycyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4xMS4wMCNTcHJheSBkcnllcnMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMTIuMDAjSG90IGFpciBibG93ZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjEzLjAwI0RyeWluZyBjYWJpbmV0cyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4xNC4wMCNGcmVlemUgZHJ5ZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjE1LjAwI0xhYm9yYXRvcnkgZnVybmFjZXMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMTYuMDAjQWdlaW5nIG92ZW5zIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI0LjE4LjAwI1F1YXJ0eiBvdmVuIHBvdHMjNDEuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjQuMTkuMDAjTWljcm93YXZlIG9yIHJhZGlhbnQgaGVhdCBvdmVucyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4yMC4wMCNEZXNpY2NhdG9ycyM0MS4xMC4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNC4yMS4wMCNUZW1wZXJhdHVyZSBjeWNsaW5nIGNoYW1iZXJzIzQxLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjAwLjAwI0xhYm9yYXRvcnkgZW50b21vbG9naWNhbCBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjAxLjAwI0luc2VjdCBjb250YWluZXJzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjAyLjAwI1JlYXJpbmcgZmFjaWxpdGllcyBmb3IgZW50b21vbG9neSM0MS4xMC4yNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNS4wMy4wMCNGYWJyaWMgb3IgbmV0dGluZyBmb3IgZW50b21vbG9neSM0MS4xMC4yNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNS4wNC4wMCNFbnRvbW9sb2dpY2FsIHBpbm5pbmcgZXF1aXBtZW50IzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjA1LjAwI0VudG9tb2xvZ2ljYWwgbW91bnRpbmcgbWF0ZXJpYWxzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjA2LjAwI0VudG9tb2xvZ2ljYWwgdHJheXMjNDEuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjUuMDcuMDAjRW50b21vbG9naWNhbCBjYXRjaGluZyBlcXVpcG1lbnQjNDEuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjUuMDguMDAjRW50b21vbG9naWNhbCBhc3BpcmF0b3JzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjA5LjAwI0VudG9tb2xvZ2ljYWwgZGlwcGVycyM0MS4xMC4yNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNS4xMC4wMCNFbnRvbW9sb2dpY2FsIG1vbm9jdXBzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjExLjAwI0VudG9tb2xvZ2ljYWwgc3RpY2t5IHRyYXBzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI1LjEyLjAwI0luc2VjdCB0ZXN0IGtpdHMjNDEuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjUuMTMuMDAjRW50b21vbG9naWNhbCBkaXNwbGF5IHVuaXRzIzQxLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI2LjAwLjAwI0FuaW1hbCBsYWJvcmF0b3J5IGVxdWlwbWVudCBhbmQgYWNjZXNzb3JpZXMjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjYuMDEuMDAjQ2FnZXMgZm9yIHNtYWxsIGFuaW1hbHMjNDEuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjYuMDIuMDAjQXF1YXJpYSBlcXVpcG1lbnQjNDEuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjYuMDMuMDAjQW5pbWFsIGlkZW50aWZpY2F0aW9uIHN1cHBsaWVzIzQxLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI2LjA0LjAwI0FuaW1hbCBjYXRjaGluZyBkZXZpY2VzIzQxLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI2LjA1LjAwI0Zpc2ggYWVyYXRpb24gc3lzdGVtcyM0MS4xMC4yNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNi4wNi4wMCNBbmltYWwgZmVlZGluZyBuZWVkbGVzIzQxLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI3LjAwLjAwI0NyeXN0YWxsb2dyYXBoeSBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjcuMDEuMDAjQ3J5c3RhbCBsYXR0aWNlIG1vZGVscyM0MS4xMC4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNy4wMi4wMCNTY2ludGlsbGF0aW9uIGNyeXN0YWwgYXNzZW1ibGllcyM0MS4xMC4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNy4wMy4wMCNMaWdodCBzY2F0dGVyaW5nIGVxdWlwbWVudCM0MS4xMC4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNy4wNC4wMCNYIHJheSBkaWZmcmFjdGlvbiBlcXVpcG1lbnQjNDEuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjcuMDUuMDAjQ3J5c3RhbGxpc2VycyM0MS4xMC4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4yNy4wNi4wMCNDcnlzdGFsIGdyb3dpbmcgZXF1aXBtZW50IzQxLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI5LjAwLjAwI0hpc3RvbG9neSBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMDEuMDAjVGlzc3VlIGVtYmVkZGluZyBzdGF0aW9ucyM0MS4xMC4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yOS4wMi4wMCNFbWJlZGRpbmcgbW9sZHMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMDMuMDAjRW1iZWRkaW5nIGNhcHN1bGVzIzQxLjEwLjI5LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI5LjA0LjAwI0VtYmVkZGluZyBjb21wb3VuZHMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMDUuMDAjSGlzdG9sb2dpY2FsIHN0YWluaW5nIGFwcGFyYXR1cyM0MS4xMC4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yOS4wOS4wMCNUaXNzdWUgcHJvY2Vzc29ycyM0MS4xMC4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4yOS4xMC4wMCNUaXNzdWUgY3VsdHVyZSBhcHBhcmF0dXMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMTEuMDAjSGlzdG9sb2dpY2FsIGtuaXZlcyBvciBrbmlmZSBob2xkZXJzIzQxLjEwLjI5LjAwLjAwCi11bnNwc2M3IzQxLjEwLjI5LjEyLjAwI0hpc3RvbG9naWNhbCBnbGFzcyBrbmlmZSBtYWtlcnMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMTMuMDAjSGlzdG9sb2dpY2FsIGhvbmVzIG9yIHN0cmFwcyBvciBjb21wb3VuZHMjNDEuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMjkuMTQuMDAjVWx0cmFzb25pYyBkaXNpbnRlZ3JhdG9ycyM0MS4xMC4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wMC4wMCNMYWJvcmF0b3J5IGNvb2xpbmcgZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMwLjAxLjAwI1JlZnJpZ2VyYXRlZCBjb29saW5nIHBsYXRlIHByb2JlcyM0MS4xMC4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wMi4wMCNGcmVlemluZyBzcHJheSBhZXJvc29scyM0MS4xMC4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wMy4wMCNDcnlvc3RhdHMjNDEuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzAuMDQuMDAjRmFuIGNpcmN1bGF0ZWQgb3ZlbnMjNDEuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzAuMDUuMDAjVWx0cmEgY29sZCBjYWJpbmV0cyM0MS4xMC4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wNi4wMCNDcnlvZ2VuaWMgZnJlZXplcnMjNDEuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzAuMDcuMDAjQ2hpbGxpbmcgdW5pdHMgb3IgY29sZCB3YXRlciBjaXJjdWxhdGlvbiM0MS4xMC4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMC4wOC4wMCNSZWZyaWdlcmF0ZWQgY29vbGluZyBtb2R1bGVzIzQxLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMwLjA5LjAwI0NhZGF2ZXIgc3RvcmFnZSByZWZyaWdlcmF0b3JzIzQxLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjAwLjAwI0xhYm9yYXRvcnkgc3VwcGxpZXMjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMDEuMDAjVGVzdCB0dWJlcyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4wMy4wMCNQaXBldHRlcyBvciBhY2Nlc3NvcmllcyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4wNC4wMCNGbGFza3MjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMDUuMDAjQmVha2VycyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4wNi4wMCNTdGlycmluZyByb2RzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjA3LjAwI0xhYm9yYXRvcnkgb3Igc2FtcGxpbmcgc3lyaW5nZXMjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMDguMDAjRGVzaWNjYW50cyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4wOS4wMCNXYXRjaCBnbGFzc2VzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjEwLjAwI0J1cmV0cyM0MS4xMC4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMS4xMS4wMCNNZWFzdXJpbmcgY3lsaW5kZXIjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMTIuMDAjTGFib3JhdG9yeSBkaXNoZXMjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMTMuMDAjU2xpZGVzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjE0LjAwI1N0b3BwZXJzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjE1LjAwI1R1YmluZyBjb25uZWN0b3JzIzQxLjEwLjMxLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMxLjE2LjAwI0xhYm9yYXRvcnkgY2FzZXMjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzEuMTcuMDAjTGFib3JhdG9yeSBzY29vcHMgb3Igc3BhdHVsYXMjNDEuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzIuMDAuMDAjTGFib3JhdG9yeSBjbGVhbmluZyBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzIuMDEuMDAjQ2hlbWljYWwgZW5naW5lZXJpbmcgd2FzaGVycyM0MS4xMC4zMi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMi4wMi4wMCNMYWJvcmF0b3J5IHdhc2hpbmcgbWFjaGluZXMjNDEuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzIuMDMuMDAjUGlwZXR0ZSB3YXNoZXJzIzQxLjEwLjMyLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMyLjA0LjAwI1VsdHJhc29uaWMgY2xlYW5lcnMjNDEuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDAuMDAjRmx1aWQgbWVjaGFuaWNzIGVxdWlwbWVudCM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMy4wMS4wMCNMaXF1aWQgc2NpbnRpbGxhdGlvbiBjb3VudGVycyM0MS4xMC4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMy4wMi4wMCNCYXR0ZXJ5IGFjaWQgaHlkcm9tZXRlcnMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDMuMDAjRGVuc2l0b21ldGVycyM0MS4xMC4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMy4wNC4wMCNWYWN1dW0gb3ZlbnMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDUuMDAjSGlnaCB2YWN1dW0gZXF1aXBtZW50IzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjA2LjAwI1BuZXVtYXRpYyB2YWN1dW0gZXF1aXBtZW50IzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjA3LjAwI1ZhY3V1bSBvciBtZXJjdXJ5IHZhcG91ciBlcXVpcG1lbnQjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDguMDAjSGlnaCB2YWN1dW0gY29tYnVzdGlvbiBhcHBhcmF0dXMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMDkuMDAjRmxvdyBpbmplY3Rpb24gYW5hbHlzaXMgZXF1aXBtZW50IzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjEwLjAwI0dhcyBvciB2YXBvdXIgY29uY2VudHJhdGlvbiBtZWFzdXJpbmcgaW5zdHJ1bWVudHMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMTEuMDAjTWFub21ldGVycyM0MS4xMC4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zMy4xMi4wMCNWaXNjb3NpbWV0ZXJzIzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjEzLjAwI0RlcHRoIGluZGljYXRvcnMjNDEuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzMuMTQuMDAjTWljcm9zY29waWMgc3RydWN0dXJlIGVzdGltYXRpb24gYXBwYXJhdHVzIzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjMzLjE1LjAwI1NvbHV0aW9uIHN0cmVuZ3RoIGVzdGltYXRpb24gYXBwYXJhdHVzIzQxLjEwLjMzLjAwLjAwCi11bnNwc2M3IzQxLjEwLjM0LjAwLjAwI0xhYm9yYXRvcnkgZW52aXJvbm1lbnRhbCBjb25kaXRpb25pbmcgZXF1aXBtZW50IzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjM0LjAxLjAwI0NvbnRhbWluYXRpb24gY29udHJvbCBzY3JlZW5zIzQxLjEwLjM0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM0LjAyLjAwI0Vudmlyb25tZW50YWwgY2hhbWJlcnMjNDEuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzQuMDMuMDAjTWljcm9iaW9sb2dpY2FsIGFpcmNvbnRyb2wjNDEuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzQuMDQuMDAjR3Jvd3RoIGNoYW1iZXJzIzQxLjEwLjM0LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM0LjA1LjAwI1dhbGsgaW4gY2hhbWJlcnMjNDEuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzQuMDYuMDAjR2xvdmUgYm94ZXMjNDEuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzUuMDAuMDAjTGFib3JhdG9yeSB2ZW50aWxhdGluZyBlcXVpcG1lbnQjNDEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzUuMDEuMDAjRWJ1bGlvbWV0ZXIjNDEuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzUuMDIuMDAjRnVtZSBob29kcyM0MS4xMC4zNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNS4wMy4wMCNGdW1lIGN1cGJvYXJkcyM0MS4xMC4zNS4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNS4wNC4wMCNMYW1pbmFyIGZsb3cgY2FiaW5ldHMgb3Igc3RhdGlvbnMjNDEuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMDAuMDAjTGFib3JhdG9yeSBkZWNhbnRpbmcgYW5kIGRpc3RpbGxpbmcgYW5kIGV2YXBvcmF0aW5nIGFuZCBmaWx0ZXJpbmcgZXF1aXBtZW50IGFuZCBzdXBwbGllcyM0MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4wMS4wMCNGbGFzayBvciByZXRvcnQgdW5pdHMjNDEuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMDIuMDAjQmkgZGlzdGlsbGF0aW9uIHVuaXRzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjAzLjAwI0V2YXBvcmF0b3JzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjA0LjAwI1ZhY3V1bSBldmFwb3JhdG9ycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4wNS4wMCNFeHRyYWN0aW5nIGVxdWlwbWVudCM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4wNi4wMCNMaW5lIGZpbHRlcnMjNDEuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMDcuMDAjR2VsIGZpbHRyYXRpb24gZXF1aXBtZW50IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjA4LjAwI1VsdHJhIGZpbHRyYXRpb24gZXF1aXBtZW50IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjA5LjAwI1NpbnRlcmVkIGNlbGwgZmlsdGVycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xMC4wMCNUaGluIGNoYW5uZWwgZmlsdHJhdGlvbiBlcXVpcG1lbnQjNDEuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMTEuMDAjUmV2ZXJzZSBvc21vc2lzIGZpbHRyYXRpb24gZXF1aXBtZW50IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjEyLjAwI01vbGVjdWxhciBmaWx0cmF0aW9uIGVxdWlwbWVudCM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xMy4wMCNDYXJ0cmlkZ2UgZWxlbWVudCBmaWx0ZXJzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjE0LjAwI0ZpbHRlciBob2xkZXJzIG9yIGN5Y2xvbmVzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjE1LjAwI011bHRpIHNoZWV0IG9yIHByZXNzIG9yIGZpbHRlciM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xNi4wMCNBaXIgZmlsdHJhdGlvbiBzeXN0ZW1zIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjE3LjAwI0hlcGEgZmlsdGVycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xOC4wMCNGbHVpZCBwcmVzc2VzIGZpbHRlciM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4xOS4wMCNTZWRpbWVudG9sb2dpY2FsIGFuYWx5emluZyB1bml0IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjIwLjAwI0xhYm9yYXRvcnkgc2VwYXJhdG9ycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4yMS4wMCNMYWJvcmF0b3J5IHNpZnRpbmcgZXF1aXBtZW50IzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjIyLjAwI1Rlc3Qgc2lldmVzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjIzLjAwI0xhYm9yYXRvcnkgc2NydWJiZXJzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjI0LjAwI1RpdHJhdGlvbiBlcXVpcG1lbnQjNDEuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTAuMzYuMjUuMDAjTGFib3JhdG9yeSBkaWx1dGVycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4yNi4wMCNGcmFjdGlvbmF0aW9uIGFwcGFyYXR1cyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNi4yNy4wMCNEaXN0aWxsYXRpb24gcGlwaW5ncyBvciBjb2x1bW5zIG9yIGZpdHRpbmdzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjI4LjAwI1JlZmx1eCBjb21wb25lbnRzIzQxLjEwLjM2LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM2LjI5LjAwI0hlYXQgZXhjaGFuZ2UgY29uZGVuc2VycyM0MS4xMC4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNy4wMC4wMCNMYWJvcmF0b3J5IGJhdGhzIzQxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjAxLjAwI0NpcmN1bGF0aW5nIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjAyLjAwI1RoZXJtb3N0YXRpYyBiYXRocyM0MS4xMC4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNy4wMy4wMCNNdWx0aXBsZSBiYXRocyM0MS4xMC4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNy4wNC4wMCNCaW9sb2dpY2FsIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjA1LjAwI09yZ2FuIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjA2LjAwI1dhdGVyIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjA3LjAwI09pbCBiYXRocyM0MS4xMC4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMC4zNy4wOC4wMCNTYW5kIGJhdGhzIzQxLjEwLjM3LjAwLjAwCi11bnNwc2M3IzQxLjEwLjM3LjA5LjAwI1JlZnJpZ2VyYXRlZCBiYXRocyM0MS4xMC4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4wMC4wMC4wMCNNZWFzdXJpbmcgYW5kIG9ic2VydmluZyBhbmQgdGVzdGluZyBpbnN0cnVtZW50cyM0MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNS4wMC4wMCNXZWlnaHQgbWVhc3VyaW5nIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjE1LjAxLjAwI0VsZWN0cm9uaWMgdG9wbG9hZGluZyBiYWxhbmNlcyM0MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNS4wMi4wMCNMYWJvcmF0b3J5IGJhbGFuY2VzIzQxLjExLjE1LjAwLjAwCi11bnNwc2M3IzQxLjExLjE1LjAzLjAwI01lY2hhbmljYWwgYmFsYW5jZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTUuMDQuMDAjUHVsbCBzcHJpbmcgYmFsYW5jZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTUuMDUuMDAjQ2FsaWJyYXRpb24gd2VpZ2h0cyBvciB3ZWlnaHQgc2V0cyM0MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNS4wNi4wMCNBbmltYWwgd2VpZ2hpbmcgc2NhbGVzIzQxLjExLjE1LjAwLjAwCi11bnNwc2M3IzQxLjExLjE1LjA3LjAwI0JlbmNoIHNjYWxlcyM0MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNS4wOC4wMCNCb2R5d2VpZ2h0IG1lYXN1cmluZyBzY2FsZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTUuMDkuMDAjRmxvb3Igb3IgcGxhdGZvcm0gc2NhbGVzIzQxLjExLjE1LjAwLjAwCi11bnNwc2M3IzQxLjExLjE1LjEwLjAwI1Bvc3RhbCBzY2FsZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTUuMTEuMDAjVHJ1Y2sgb3IgcmFpbCBzY2FsZXMjNDEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMDAuMDAjTGVuZ3RoIGFuZCB0aGlja25lc3MgYW5kIGRpc3RhbmNlIG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4wMS4wMCNNaWNyb21ldGVycyM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4wMi4wMCNQZWRvbWV0ZXJzIzQxLjExLjE2LjAwLjAwCi11bnNwc2M3IzQxLjExLjE2LjAzLjAwI1JhbmdlZmluZGVycyM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4wNC4wMCNSdWxlcnMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMDUuMDAjU3RyYWluIGdhdWdlcyM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4wNi4wMCNUZWxsdXJvbWV0ZXJzIzQxLjExLjE2LjAwLjAwCi11bnNwc2M3IzQxLjExLjE2LjA3LjAwI1RocmVhZCBjb3VudGVycyBvciBnYXVnZXMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMDguMDAjQ2FsaXBlcnMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMTMuMDAjRGlzdGFuY2UgbWV0ZXJzIzQxLjExLjE2LjAwLjAwCi11bnNwc2M3IzQxLjExLjE2LjE0LjAwI0hlaWdodCBnYXVnZXMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMTUuMDAjTGFzZXIgbWVhc3VyaW5nIHN5c3RlbXMjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMTYuMDAjTWVhc3VyaW5nIHdoZWVscyBmb3IgZGlzdGFuY2UjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTYuMTcuMDAjRmVlbGVyIGdhdWdlcyM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4xOC4wMCNHYWdlIGJsb2NrIHNldCM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4xOS4wMCNHbyBvciBubyBnbyBnYXVnZSM0MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNi4yMC4wMCNFdGFsb24gd2VkZ2UjNDEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTcuMDAuMDAjVmlld2luZyBhbmQgb2JzZXJ2aW5nIGluc3RydW1lbnRzIGFuZCBhY2Nlc3NvcmllcyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4wMS4wMCNJb24gbWljcm9zY29wZXMjNDEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTcuMDIuMDAjTW9ub2N1bGFyIG1pY3Jvc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjAzLjAwI1N0ZXJlbyBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4wNC4wMCNJbGx1bWluYXRvcnMgZm9yIG1pY3Jvc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjA1LjAwI09iamVjdGl2ZXMgZm9yIG1pY3Jvc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjA2LjAwI1Bob3RvIGF0dGFjaG1lbnRzIGZvciBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4wNy4wMCNQcm9maWxlIHByb2plY3RvcnMjNDEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTcuMDguMDAjVmlkZW8gYXR0YWNobWVudHMgZm9yIG1pY3Jvc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjA5LjAwI0Jpbm9jdWxhciBtaWNyb3Njb3BlIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjEwLjAwI0NvbWJpbmF0aW9uIGVsZWN0cm9uIGFuZCBsaWdodCBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xMS4wMCNFbGVjdHJvbiBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xMi4wMCNJbnZlcnRlZCBtaWNyb3Njb3BlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xMy4wMCNNYWduaWZpZXJzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjE0LjAwI0xvdXBlcyM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xNS4wMCNUZWxlc2NvcGVzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE3LjE2LjAwI0JvcmVzY29wZSBpbnNwZWN0aW9uIGVxdWlwbWVudCM0MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4xNy4xNy4wMCNCaW5vY3VsYXJzIzQxLjExLjE3LjAwLjAwCi11bnNwc2M3IzQxLjExLjE4LjAwLjAwI05vbiBkZXN0cnVjdGl2ZSBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTguMDEuMDAjRWRkeSBjdXJyZW50IGV4YW1pbmF0aW9uIGVxdWlwbWVudCM0MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOC4wMi4wMCNMaXF1aWQgcGVuZXRyYW50IGV4YW1pbmF0aW9uIGVxdWlwbWVudCM0MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOC4wMy4wMCNNYWduZXRpYyBwYXJ0aWNsZSBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTguMDQuMDAjVWx0cmFzb25pYyBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTguMDUuMDAjQ08gNjAgcmFkaW9ncmFwaHkgZXhhbWluYXRpb24gZXF1aXBtZW50IzQxLjExLjE4LjAwLjAwCi11bnNwc2M3IzQxLjExLjE4LjA2LjAwI0NTIDEzNyByYWRpb2dyYXBoeSBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTguMDcuMDAjSVIgMTkyIHJhZGlvZ3JhcGh5IGV4YW1pbmF0aW9uIGVxdWlwbWVudCM0MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOC4wOC4wMCNYIHJheSByYWRpb2dyYXBoeSBleGFtaW5hdGlvbiBlcXVpcG1lbnQjNDEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDAuMDAjSW5kaWNhdGluZyBhbmQgcmVjb3JkaW5nIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjAxLjAwI0NvdW50ZXJzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjAyLjAwI0VsZWN0cm9uaWMgY291bnRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDMuMDAjTWV0YWwgZGV0ZWN0b3JzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjA0LjAwI0VsZWN0cm9uaWMgY29sdW1ucyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4wNS4wMCNFbGVjdHJvbmljIG1lYXN1cmluZyBwcm9iZXMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDYuMDAjQ2hhcnQgcmVjb3JkZXJzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjA3LjAwI0RpZ2l0YWwgcmVhZG91dCByZWNvcmRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDguMDAjR3JhcGhpYyByZWNvcmRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMDkuMDAjTWFnbmV0aWMgdGFwZSByZWNvcmRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMTAuMDAjTXVsdGlwZW4gcmVjb3JkZXJzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjExLjAwI09zY2lsbG9ncmFwaGljIHJlY29yZGVycyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4xMi4wMCNQaHlzaW9sb2dpY2FsIHJlY29yZGVycyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4xMy4wMCNQb2ludCBwbG90dGluZyByZWNvcmRlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMTQuMDAjU2Vydm8gcmVjb3JkZXJzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjE1LjAwI0JpIG1ldGFsbGljIHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMTYuMDAjTm9uIGNvbnRhY3Qgc2Vuc29ycyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4xNy4wMCNEaWdpdGFsIHRlc3RlcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMTguMDAjR3lyb3Njb3BpYyBpbnN0cnVtZW50cyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4xOS4wMCNEZXRlY3Rpb24gYXBwYXJhdHVzIGZvciBub24gbWV0YWxpYyBvYmplY3RzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjIwLjAwI0Nvb3JkaW5hdGUgbWVhc3VyaW5nIG1hY2hpbmVzIChDTU0pIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjIxLjAwI1NwZWVkIHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMjIuMDAjTGFtcCBmYWlsdXJlIHNlbnNvciM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4yMy4wMCNQcmUgaWduaXRpb24ga25vY2sgc2Vuc29yIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjI0LjAwI094eWdlbiBzZW5zb3JzIzQxLjExLjE5LjAwLjAwCi11bnNwc2M3IzQxLjExLjE5LjI1LjAwI1NwZWVkIHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMjYuMDAjUHJveGltaXR5IHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMTkuMjcuMDAjUHJlc3N1cmUgc2Vuc29ycyM0MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4xOS4yOC4wMCNDdXJyZW50IHNlbnNvcnMjNDEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMDAuMDAjTGlnaHQgYW5kIHdhdmUgYW5kIHNvdW5kIGdlbmVyYXRpbmcgYW5kICBtZWFzdXJpbmcgZXF1aXBtZW50IzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjAxLjAwI0xpZ2h0IGFic29ycHRpb25tZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMDIuMDAjQWNvdXN0aWMgdGVzdGluZyByb29tcyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4wMy4wMCNBbmVjaG9pYyBjaGFtYmVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4wNC4wMCNGcmVxdWVuY3kgYW5hbHl6ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjA1LjAwI0ZyZXF1ZW5jeSBjb3VudGVycyBvciB0aW1lciBvciBkaXZpZGVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4wNi4wMCNFbGVjdHJpY2FsIGZyZXF1ZW5jeSBtZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMDcuMDAjSW50ZXJmZXJvbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjA4LjAwI0xhc2VycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4wOS4wMCNMaWdodG1ldGVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xMC4wMCNMdXhtZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMTEuMDAjT3B0aWNhbCBjYWxsaWJyYXRpb24gc2V0cyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xMi4wMCNQaG90b21ldGVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xMy4wMCNQb2xhcmltZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMTQuMDAjUG9sYXJpc2NvcGVzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjE1LjAwI1JlZmxlY3RvbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjE2LjAwI1NvbmFycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xNy4wMCNTb25vbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjE4LjAwI1NvdW5kIG1lYXN1cmluZyBhcHBhcmF0dXMgb3IgZGVjaWJlbCBtZXRlciM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4xOS4wMCNTcGVjdHJvZmx1b3JpbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjIwLjAwI1NwZWN0cm9ncmFwaHMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMjEuMDAjU3BlY3Ryb21ldGVycyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4yMi4wMCNNYXNzIHNwZWN0cm9tZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMjMuMDAjUHJvdG9uIHNwZWN0cm9tZXRlcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMjQuMDAjU3BlY3Ryb3Bob3RvbWV0ZXJzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIwLjI1LjAwI1N0cm9ib3Njb3BlcyM0MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMC4yNi4wMCNTb3VuZCB2ZWxvY2l0eSBhbmFseXplcnMjNDEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjAuMjcuMDAjVGhpY2tuZXNzIG1lYXN1cmluZyBkZXZpY2VzIzQxLjExLjIwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIxLjAwLjAwI1RyYW5zZHVjZXJzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjIxLjAxLjAwI1BpZXpvIGVsZWN0cmljIGNyeXN0YWxzIzQxLjExLjIxLjAwLjAwCi11bnNwc2M3IzQxLjExLjIxLjAyLjAwI1N0cmFpbiBnYXVnZXMjNDEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjEuMDMuMDAjRmliZXIgc2Vuc29ycyM0MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4wMC4wMCNUZW1wZXJhdHVyZSBhbmQgaGVhdCBtZWFzdXJpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjIuMDEuMDAjQ2Fsb3JpbWV0ZXJzIzQxLjExLjIyLjAwLjAwCi11bnNwc2M3IzQxLjExLjIyLjAyLjAwI0hlYXQgdHJhY2luZyBlcXVpcG1lbnQjNDEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjIuMDMuMDAjTWVsdGluZyBwb2ludCByZWNvcmRlcnMjNDEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjIuMDQuMDAjUHlyb21ldGVycyM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4wNS4wMCNUZW1wZXJhdHVyZSByZWd1bGF0b3JzIzQxLjExLjIyLjAwLjAwCi11bnNwc2M3IzQxLjExLjIyLjA2LjAwI1RoZXJtb2NvdXBsZXMjNDEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjIuMDcuMDAjVGhlcm1vZ3JhcGhzIzQxLjExLjIyLjAwLjAwCi11bnNwc2M3IzQxLjExLjIyLjA5LjAwI1RoZXJtb3N0YXRzIzQxLjExLjIyLjAwLjAwCi11bnNwc2M3IzQxLjExLjIyLjEwLjAwI1JlbW90ZSByZWFkaW5nIHRoZXJtb21ldGVycyM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4xMS4wMCNSZXNpc3RhbmNlIHRoZXJtb21ldGVycyM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4xMi4wMCNTdXJmYWNlIHRoZXJtb21ldGVycyM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMi4xMy4wMCNIYW5kaGVsZCB0aGVybW9tZXRlciM0MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMy4wMC4wMCNIdW1pZGl0eSBtZWFzdXJpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjMuMDEuMDAjSHlncm9tZXRlcnMjNDEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjMuMDIuMDAjUHN5Y2hyb21ldGVycyM0MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4yMy4wMy4wMCNUZW1wZXJhdHVyZSBodW1pZGl0eSB0ZXN0ZXJzIzQxLjExLjIzLjAwLjAwCi11bnNwc2M3IzQxLjExLjI0LjAwLjAwI1ByZXNzdXJlIG1lYXN1cmluZyBhbmQgY29udHJvbCBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNC4wMS4wMCNEZXB0aCBnYXVnZXMjNDEuMTEuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjQuMDIuMDAjTWFub3N0YXRzIzQxLjExLjI0LjAwLjAwCi11bnNwc2M3IzQxLjExLjI0LjAzLjAwI1ByZXNzdXJlIHJlYWRpbmcgaW5kaWNhdG9ycyM0MS4xMS4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNC4wNC4wMCNQcmVzc3VyZSByZWd1bGF0b3IjNDEuMTEuMjQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjQuMDUuMDAjUHJlc3N1cmUgb3IgdmFjdXVtIHJlY29yZGVycyM0MS4xMS4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNC4wNi4wMCNWYWN1dW0gZ2F1Z2VzIzQxLjExLjI0LjAwLjAwCi11bnNwc2M3IzQxLjExLjI0LjA3LjAwI0xpcXVpZCBsZXZlbCBjb250cm9scyBvciBpbnN0cnVtZW50cyM0MS4xMS4yNC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNS4wMC4wMCNGbG93IG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNS4wMS4wMCNGbG93bWV0ZXJzIzQxLjExLjI1LjAwLjAwCi11bnNwc2M3IzQxLjExLjI1LjAyLjAwI1JoZW9tZXRlcnMjNDEuMTEuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjUuMDMuMDAjUm90YW1ldGVycyM0MS4xMS4yNS4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNS4wNC4wMCNXYXRlciBtZXRlcnMjNDEuMTEuMjUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjUuMDUuMDAjV2F0ZXIgbWV0ZXIgc3BhcmVzIzQxLjExLjI1LjAwLjAwCi11bnNwc2M3IzQxLjExLjI1LjA2LjAwI1ZlbnR1cmlzIzQxLjExLjI1LjAwLjAwCi11bnNwc2M3IzQxLjExLjI3LjAwLjAwI1NlZWQgYW5kIGZlZWQgZXF1aXBtZW50IzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjI3LjAxLjAwI0dyYWluIGFuYWx5emVycyM0MS4xMS4yNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4yNy4wMi4wMCNTZWVkIGNvdW50ZXJzIzQxLjExLjI3LjAwLjAwCi11bnNwc2M3IzQxLjExLjI3LjAzLjAwI0ZpYmVyIGFwcGFyYXR1cyBmb3IgZmVlZCBzYW1wbGUgYW5hbHlzaXMjNDEuMTEuMjcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjguMDAuMDAjVHJhbnNwb3J0YXRpb24gcmVsYXRlZCBlcXVpcG1lbnQgYW5kIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjI4LjAxLjAwI1NwZWVkb21ldGVycyM0MS4xMS4yOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOC4wMi4wMCNUYWNob21ldGVycyM0MS4xMS4yOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOS4wMC4wMCNOYXZpZ2F0aW9uYWwgZXF1aXBtZW50IGFuZCBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOS4wMS4wMCNEaXJlY3Rpb24gZmluZGluZyBjb21wYXNzZXMjNDEuMTEuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMjkuMDIuMDAjUmFkaW8gbmF2aWdhdGlvbiBpbnN0cnVtZW50cyM0MS4xMS4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOS4wMy4wMCNTZXh0YW50cyM0MS4xMS4yOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4yOS4wNC4wMCNDb21wbGV4IGNvbnRyb2xsaW5nIGRldmljZXMjNDEuMTEuMjkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMDAuMDAjQ2hlbWljYWwgZXZhbHVhdGlvbiBpbnN0cnVtZW50cyBhbmQgc3VwcGxpZXMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMDEuMDAjRGlnaXRhbCBhbmFseXplciBjb250cm9sbGVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4wMi4wMCNDaGVtaWx1bWluZXNjZW5jZSBvciBiaW9sdW1pbmVzY2VuY2UgYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjAzLjAwI0VsZWN0cm9ncmF2aW1ldHJ5IGFuYWx5emVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4wNC4wMCNGbGFtZSBpb25pemF0aW9uIGFuYWx5emVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4wNS4wMCNJb24gYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjA2LjAwI1JhZGlvbWV0cnkgYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjA3LjAwI1JhbmRvbSBhY2Nlc3MgYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjA4LjAwI0NpbnRpZ3JhcGhpYyBhbmFseXplcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMDkuMDAjVGhlcm1hbCBkaWZmZXJlbnRpYWwgYW5hbHl6ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjEwLjAwI1RoZXJtbyBncmF2aW1ldHJ5IGFuYWx5emVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4xMS4wMCNDaHJvbWF0b2dyYXBoaWMgZGV0ZWN0b3JzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjEyLjAwI0Nocm9tYXRvZ3JhcGhpYyBzY2FubmVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4xMy4wMCNHYXMgY2hyb21hdG9ncmFwaHMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMTQuMDAjSW9uIGNocm9tYXRvZ3JhcGhzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjE1LjAwI0xpcXVpZCBjaHJvbWF0b2dyYXBocyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4xNi4wMCNUaGlubGF5ZXIgY2hyb21hdG9ncmFwaHMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMTguMDAjSGlnaCBwcmVzc3VyZSBsaXF1aWQgY2hyb21hdG9ncmFwaCBjaHJvbWF0b2dyYXBoeSM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4xOS4wMCNIaWdoIHByZXNzdXJlIHRoaW4gbGF5ZXIgY2hyb21hdG9ncmFwaCAoVExDKSM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4yMC4wMCNDb2xvcmltZXRlcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMjEuMDAjQ29uZHVjdGltZXRyaWMgaW5zdHJ1bWVudHMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMjIuMDAjRmx1b3JpbWV0ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjIzLjAwI0dlbCBwYXJ0aXRpb24gZXF1aXBtZW50IzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjI0LjAwI0h5ZHJvbWV0ZXJzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjI1LjAwI01vbm9jaHJvbWF0b3JzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjI2LjAwI05lcGhlbG9tZXRlcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMjcuMDAjT3Ntb21ldGVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMC4yOC4wMCNwSCBtZXRlcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMjkuMDAjUG9sYXJvZ3JhcGhzIzQxLjExLjMwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMwLjMwLjAwI1JhZGlvY2hyb21hdG9ncmFwaGljIHNjYW5uZXIjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMzEuMDAjU2FjY2hhcm9tZXRlcnMjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMzIuMDAjU2FsaW5pdHkgbWV0ZXIjNDEuMTEuMzAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzAuMzMuMDAjVm9sdW1ldGVycyM0MS4xMS4zMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMS4wMC4wMCNHYXMgYW5hbHl6ZXJzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjAxLjAwI0F1dG9tb3RpdmUgZXhoYXVzdCBlbWlzc2lvbiBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMDIuMDAjQ2F0YWx5dGljIGNvbWJ1c3Rpb24gYW5hbHl6ZXJzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjAzLjAwI0NoZW1pY2FsIGFic29ycHRpb24gZ2FzIGFuYWx5emVycyM0MS4xMS4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMS4wNC4wMCNFeHBsb3NpbWV0ZXJzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjA1LjAwI0h5ZHJvY2FyYm9ucyBhbmFseXplcnMgb3IgZGV0ZWN0b3JzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjA2LjAwI0luZnJhIHJlZCBvciB1bHRyYSB2aW9sZXQgYWJzb3JwdGlvbiBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMDcuMDAjTml0cm9nZW4gYW5hbHl6ZXJzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjA4LjAwI05pdHJvZ2VuIG94aWRlIGFuYWx5emVycyM0MS4xMS4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMS4wOS4wMCNPUlNBVCBlcXVpcG1lbnQjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMTAuMDAjT3h5Z2VuIGdhcyBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMTEuMDAjT3pvbmUgYW5hbHl6ZXJzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjEyLjAwI1BhcmFtYWduZXRpYyBzdXNjZXB0aWJpbGl0eSBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMTMuMDAjU3VsZnVyIGRpb3hpZGUgYW5hbHl6ZXJzIG9yIGRldGVjdG9ycyM0MS4xMS4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMS4xNC4wMCNUaGVybWFsIGNvbmR1Y3Rpdml0eSBhbmFseXplcnMjNDEuMTEuMzEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzEuMTUuMDAjUmFkb24gZGV0ZWN0b3JzIzQxLjExLjMxLjAwLjAwCi11bnNwc2M3IzQxLjExLjMxLjE2LjAwI0dhcyBkZXRlY3RvciB0dWJlcyM0MS4xMS4zMS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4wMC4wMCNMaXF1aWQgYW5kIHNvbGlkIGFuYWx5emVycyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4wMS4wMCNBY2lkIG9yIGJhc2UgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjAyLjAwI0FsYnVtaW5vbWV0ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjAzLjAwI0FtaW5vIGFjaWQgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjA0LjAwI0JhdXhpdGUgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjA1LjAwI0NhbGNpdW0gYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjA2LjAwI0NobG9yaWRlIGFuYWx5emVycyM0MS4xMS4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4wNy4wMCNEaXNzb2x2ZWQgb3h5Z2VuIG1lYXN1cmVtZW50IG1ldGVyIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjA4LjAwI0VsZWN0cm9seXRlIGFuYWx5emVycyM0MS4xMS4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4wOS4wMCNFbnp5bWUgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjEwLjAwI0ZhdHR5IGFjaWQgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjExLjAwI0hhbGlkZSBkZXRlY3RvciBsYW1wIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjEyLjAwI0xhY3RhdGUgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjEzLjAwI01pbmVyYWwgb2lsIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzMuMTQuMDAjT2lsIGNvbnRlbnQgbW9uaXRvcnMgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjE1LjAwI09yZ2FuaWMgY2FyYm9uIGFuYWx5emVycyM0MS4xMS4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4xNi4wMCNQZXRyb2xldW0gdGVzdGluZyBlcXVpcG1lbnQjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzMuMTcuMDAjUHJvdGVpbiBhbmFseXplcnMjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzMuMTguMDAjVXJhbml1bSBhbmFseXplcnMjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzMuMTkuMDAjV2F0ZXIgYW5hbHl6ZXJzIzQxLjExLjMzLjAwLjAwCi11bnNwc2M3IzQxLjExLjMzLjIwLjAwI0x1YnJpY2F0aW5nIG9pbCB0ZXN0aW5nIGtpdCM0MS4xMS4zMy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zMy4yMS4wMCNQYWludCB0ZXN0ZXIjNDEuMTEuMzMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzQuMDAuMDAjTnVjbGVhciBldmFsdWF0aW9uIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjM0LjAxLjAwI0FscGhhIGNvdW50ZXJzIzQxLjExLjM0LjAwLjAwCi11bnNwc2M3IzQxLjExLjM0LjAyLjAwI0FscGhhIGJldGEgY291bnRlcnMjNDEuMTEuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzQuMDMuMDAjQmV0YSBjb3VudGVycyM0MS4xMS4zNC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNC4wNC4wMCNCZXRhIGdhbW1hIGNvdW50ZXJzIzQxLjExLjM0LjAwLjAwCi11bnNwc2M3IzQxLjExLjM0LjA1LjAwI0dhbW1hIGNvdW50ZXJzIzQxLjExLjM0LjAwLjAwCi11bnNwc2M3IzQxLjExLjM0LjA2LjAwI0tWUCBtZXRlcnMjNDEuMTEuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzQuMDcuMDAjWCByYXkgbWljcm9hbmFseXNlcnMjNDEuMTEuMzQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMDAuMDAjRWxlY3RyaWNhbCBtZWFzdXJpbmcgYW5kIHRlc3RpbmcgZXF1aXBtZW50IzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjAxLjAwI0FtbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjAyLjAwI1BoYXNlbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjAzLjAwI0JyaWRnZXMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMDQuMDAjQ2FwYWNpdGFuY2UgbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjA1LjAwI1RoZXJtb2FuYWx5c2lzIGRlcml2YXRvZ3JhcGhzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjA2LjAwI0ZyZWV6ZSB3YXRjaCBpbmRpY2F0b3JzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjA3LjAwI0hlYXQgc3RyZXNzIG1vbml0b3JzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjA4LjAwI0NvaW5jaWRlbmNlIG9yIGFudGljb2luY2lkZW5jZSBjb3VudGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4wOS4wMCNDb25kdWN0aXZpdHkgY2VsbHMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMTAuMDAjQ29uZHVjdGl2aXR5IG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xMS4wMCNDcm9zcyB0YWxrIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xMi4wMCNFYXJ0aCByZXNpc3RhbmNlIHRlc3RlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMTMuMDAjRWxlY3RyaWNhbCB2YWx1ZSByZWNvcmRlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMTQuMDAjRWxlY3Ryb21hZ25ldGljIGZpZWxkIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xNS4wMCNFbGVjdHJvbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjE2LjAwI0VsZWN0cm9uaWMgbG9hZHMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMTcuMDAjRmllbGQgc3RyZW5ndGggbWVhc3VyaW5nIGVxdWlwbWVudCM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xOC4wMCNHYWluIG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4xOS4wMCNHYWx2YW5vbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjIwLjAwI0hpZ2ggdm9sdGFnZSBjYWJsZSBkZXRlY3Rpb24jNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjEuMDAjSW1wZWRhbmNlIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4yMi4wMCNDYWxpYnJhdGVkIGluZHVjdGFuY2UgY29pbHMgb3IgYm94ZXMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjMuMDAjSW5zdWxhdGlvbiByZXNpc3RhbmNlIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4yNC4wMCNJbnN1bGF0aW9uIHRlc3RlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjUuMDAjSW9uaXphdGlvbiBjaGFtYmVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4yNi4wMCNJb25tZXRlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjcuMDAjTGluZSBlYXJ0aCBsb29wIHRlc3RlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMjguMDAjTWVnb2htbWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjI5LjAwI01pY3Jvd2F2ZSBsZWFrYWdlIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zMC4wMCNNdWx0aW1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zMS4wMCNPaG1tZXRlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMzIuMDAjT3NjaWxsb2dyYXBocyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zMy4wMCNQb3RlbnRpb21ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zNC4wMCNRIG1ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zNS4wMCNDYWxpYnJhdGVkIHJlc2lzdGFuY2UgbWVhc3VyaW5nIGVxdWlwbWVudCM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zNi4wMCNMZXZlbCBnZW5lcmF0b3JzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjM3LjAwI1ZvbHRhZ2Ugb3IgY3VycmVudCBtZXRlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuMzguMDAjT3NjaWxsb3Njb3BlcyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi4zOS4wMCNBY2NlbGVyb21ldGVycyM0MS4xMS4zNi4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNi40MC4wMCNXYXR0bWV0ZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM2LjQxLjAwI0dGSSBjaXJjdWl0IHRlc3RvcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuNDIuMDAjQ2lyY3VpdCB0ZXN0ZXIjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuNDMuMDAjRGVtYW5kIG1ldGVycyBvciByZWdpc3RlcnMjNDEuMTEuMzYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzYuNDQuMDAjQ2lyY3VpdCB0cmFjZXJzIzQxLjExLjM2LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjAwLjAwI0VsZWN0cm9uaWMgYW5kIGNvbW11bmljYXRpb24gbWVhc3VyaW5nIGFuZCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjAxLjAwI0NhdGhvZGUgcmF5IHR1YmUgdGVzdGVyIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjAyLjAwI0NvbXBhcmF0b3JzIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjAzLjAwI0RpcmVjdGlvbmFsIGNvdXBsZXIjNDEuMTEuMzcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzcuMDQuMDAjSW50ZWdyYXRlZCBjaXJjdWl0IHRlc3RlcnMjNDEuMTEuMzcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzcuMDUuMDAjTG9naWMgc3RhdGUgdGVzdGVycyM0MS4xMS4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNy4wNi4wMCNTZW1pY29uZHVjdG9yIHRlc3RlcnMjNDEuMTEuMzcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzcuMDcuMDAjVHJhbnNpc3RvciBjaXJjdWl0IHRlc3RlcnMjNDEuMTEuMzcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzcuMDguMDAjUG93ZXIgbWV0ZXJzIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjA5LjAwI01vZHVsYXRpb24gbWV0ZXJzIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjEwLjAwI0xldmVsIG1ldGVyIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjExLjAwI05ldHdvcmsgYW5hbHl6ZXJzIzQxLjExLjM3LjAwLjAwCi11bnNwc2M3IzQxLjExLjM3LjEyLjAwI1RhcGUgdGVzdGVycyM0MS4xMS4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNy4xMy4wMCNUYXBlc3BlZWQgdGVzdGVycyM0MS4xMS4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zNy4xNC4wMCNEaWZmZXJlbnRpYXRvciM0MS4xMS4zNy4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOC4wMC4wMCNHZW9waHlzaWNhbCBhbmQgZ2VvdGVjaG5pY2FsIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjAxLjAwI0dlb2xvZ2ljYWwgY29tcGFzc2VzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjAyLjAwI0dlb2xvZ2ljYWwgcHJvc3BlY3RpbmcgYXBwYXJhdHVzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjAzLjAwI0VsZWN0cm9tYWduZXRpYyBnZW9waHlzaWNhbCBpbnN0cnVtZW50cyM0MS4xMS4zOC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOC4wNC4wMCNHcmF2aXR5IGdlb3BoeXNpY2FsIGluc3RydW1lbnRzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjA1LjAwI0luZHVjZWQgcG9sYXJpemF0aW9uIChJUCkgZ2VvcGh5c2ljYWwgaW5zdHJ1bWVudHMjNDEuMTEuMzguMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzguMDYuMDAjTWFnbmV0b21ldGVyIGdlb3BoeXNpY2FsIGluc3RydW1lbnRzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjA3LjAwI1Jlc2lzdGl2aXR5IGdlb3BoeXNpY2FsIGluc3RydW1lbnRzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM4LjA4LjAwI0dyYXZpbWV0ZXJzIzQxLjExLjM4LjAwLjAwCi11bnNwc2M3IzQxLjExLjM5LjAwLjAwI1NvaWwgbWVhc3VyaW5nIGVxdWlwbWVudCM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4wMS4wMCNCb3JlIG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4wMi4wMCNEaXNzb2x1dGlvbiBvciBkaXNpbnRlZ3JhdGlvbiB0ZXN0ZXJzIzQxLjExLjM5LjAwLjAwCi11bnNwc2M3IzQxLjExLjM5LjAzLjAwI1BhcnRpY2xlIHNpemUgbWVhc3VyaW5nIGFwcGFyYXR1cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4wNC4wMCNQZW5ldHJvbWV0ZXJzIzQxLjExLjM5LjAwLjAwCi11bnNwc2M3IzQxLjExLjM5LjA1LjAwI1Blcm1lYWJpbGl0eSB0ZXN0aW5nIGFwcGFyYXR1cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4wNi4wMCNQZXJtZWFiaWxpdHkgb3IgcG9yb3NpdHkgZXN0aW1hdGlvbiBhcHBhcmF0dXMjNDEuMTEuMzkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzkuMDcuMDAjUG9yb3NpbWV0ZXJzIzQxLjExLjM5LjAwLjAwCi11bnNwc2M3IzQxLjExLjM5LjA4LjAwI1NhbmQgdGVzdGluZyBhcHBhcmF0dXMjNDEuMTEuMzkuMDAuMDAKLXVuc3BzYzcjNDEuMTEuMzkuMDkuMDAjU29pbCBjb3JlIHNhbXBsaW5nIGFwcGFyYXR1cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS4zOS4xMC4wMCNTb2lsIHRlc3Rpbmcga2l0cyM0MS4xMS4zOS4wMC4wMAotdW5zcHNjNyM0MS4xMS40MC4wMC4wMCNSb2NrIGFuZCBzdHJhdGEgbWVhc3VyaW5nIGVxdWlwbWVudCM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS40MC4wMS4wMCNDbGlub21ldGVycyM0MS4xMS40MC4wMC4wMAotdW5zcHNjNyM0MS4xMS40MS4wMC4wMCNTZWlzbW9sb2dpY2FsIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjQxLjAyLjAwI0VhcnRocXVha2Ugc2ltdWxhdG9ycyM0MS4xMS40MS4wMC4wMAotdW5zcHNjNyM0MS4xMS40MS4wMy4wMCNTZWlzbWljIGFsYXJtIG1vZHVsZXMjNDEuMTEuNDEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDEuMDQuMDAjU2Vpc21pYyBhbXBsaWZpZXJzIzQxLjExLjQxLjAwLjAwCi11bnNwc2M3IzQxLjExLjQxLjA1LjAwI1BvcnRhYmxlIHNlaXNtaWMgYXBwYXJhdHVzIzQxLjExLjQxLjAwLjAwCi11bnNwc2M3IzQxLjExLjQxLjA2LjAwI1NlaXNtaWMgcmVjb3JkZXJzIG9yIHNlaXNtb2dyYXBocyM0MS4xMS40MS4wMC4wMAotdW5zcHNjNyM0MS4xMS40MS4wNy4wMCNTZWlzbW9tZXRlcnMjNDEuMTEuNDEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDEuMDguMDAjVmlicm9tZXRlcnMjNDEuMTEuNDEuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDAuMDAjTGFuZCBzdXJ2ZXlpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDEuMDAjTWVhc3VyaW5nIHRhcGVzIzQxLjExLjQyLjAwLjAwCi11bnNwc2M3IzQxLjExLjQyLjAyLjAwI01lYXN1cmluZyByb2RzIzQxLjExLjQyLjAwLjAwCi11bnNwc2M3IzQxLjExLjQyLjAzLjAwI01lYXN1cmluZyB0YWJsZXMjNDEuMTEuNDIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDQuMDAjVGhlb2RvbGl0ZXMjNDEuMTEuNDIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDUuMDAjTG9jYXRpb24gc3Rha2UjNDEuMTEuNDIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDIuMDYuMDAjTG9jYXRpb24gaHViIzQxLjExLjQyLjAwLjAwCi11bnNwc2M3IzQxLjExLjQzLjAwLjAwI0h5ZHJvbG9naWNhbCBpbnN0cnVtZW50cyM0MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM0MS4xMS40My4wMS4wMCNPcGVuIHN0cmVhbSBjdXJyZW50IG1ldGVycyM0MS4xMS40My4wMC4wMAotdW5zcHNjNyM0MS4xMS40My4wMi4wMCNMb2dnaW5nIGluc3RydW1lbnRzIGZvciB3YXRlciB3ZWxscyM0MS4xMS40My4wMC4wMAotdW5zcHNjNyM0MS4xMS40My4wMy4wMCNPcGVuIHN0cmVhbSB3YXRlciBsZXZlbCByZWNvcmRlcnMjNDEuMTEuNDMuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDAuMDAjTWV0ZW9yb2xvZ2ljYWwgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDEuMDAjQW5lbW9tZXRlcnMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDIuMDAjQmFyb21ldGVycyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4wMy4wMCNQcmVjaXBpdGF0aW9uIG9yIGV2YXBvcmF0aW9uIHJlY29yZGVycyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4wNC4wMCNSYWRpb3NvbmRlIGFwcGFyYXR1cyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4wNS4wMCNSYWluZmFsbCByZWNvcmRlcnMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDYuMDAjUHJlY2lwaXRhdGlvbiBvciBldmFwb3JhdGlvbiBzdXJmYWNlIG9ic2VydmluZyBhcHBhcmF0dXMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDcuMDAjU29sYXIgcmFkaWF0aW9uIHN1cmZhY2Ugb2JzZXJ2aW5nIGFwcGFyYXR1cyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4wOC4wMCNUZW1wZXJhdHVyZSBvciBodW1pZGl0eSBzdXJmYWNlIG9ic2VydmluZyBhcHBhcmF0dXMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMDkuMDAjV2luZCBzdXJmYWNlIG9ic2VydmluZyBhcHBhcmF0dXMjNDEuMTEuNDQuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDQuMTAuMDAjV2VhdGhlciBzdGF0aW9ucyM0MS4xMS40NC4wMC4wMAotdW5zcHNjNyM0MS4xMS40NC4xMS4wMCNNZXRlb3JvbG9neSBpbnN0cnVtZW50IGFjY2Vzc29yaWVzIzQxLjExLjQ0LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ1LjAwLjAwI01lY2hhbmljYWwgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDUuMDEuMDAjRHluYW1vbWV0ZXJzIzQxLjExLjQ1LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ1LjAyLjAwI0VsYXN0b21ldGVycyM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40NS4wMy4wMCNFeHRlbnNvbWV0ZXJzIzQxLjExLjQ1LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ1LjA0LjAwI1BpdGNoIG1lYXN1cmluZyBpbnN0cnVtZW50cyM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40NS4wNS4wMCNSb3VuZG5lc3MgdGVzdGluZyBpbnN0cnVtZW50cyM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40NS4wNi4wMCNTcGhlcm9tZXRlcnMjNDEuMTEuNDUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDUuMDcuMDAjU3ByaW5nIHRlc3RpbmcgbWFjaGluZXMjNDEuMTEuNDUuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDUuMDguMDAjU3VyZmFjZSB0ZXN0ZXJzIzQxLjExLjQ1LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ1LjA5LjAwI1RlbnNpb21ldGVycyM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40NS4xMC4wMCNUb3JxdWUgbGltaXRlciM0MS4xMS40NS4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4wMC4wMCNNZXRhbHMgYW5kIG1ldGFsbHVyZ3kgYW5kIHN0cnVjdHVyYWwgbWF0ZXJpYWxzIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMDEuMDAjQWJyYXNpb24gdGVzdGVycyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4wMi4wMCNDb21wcmVzc2lvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjAzLjAwI0NvbmNyZXRlIG9yIGNlbWVudCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjA0LjAwI0NvcnJvc2lvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjA1LjAwI0NyYWNrIG9yIGNvcnJvc2lvbiBkZXRlY3RvcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMDYuMDAjQ3JlZXAgdGVzdGVycyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4wNy4wMCNEdWN0aWxpdHkgdGVzdGluZyBtYWNoaW5lcyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4wOC4wMCNGYXRpZ3VlIHRlc3RlcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMDkuMDAjRm9yZ2luZyB0ZXN0aW5nIGFwcGFyYXR1cyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4xMC4wMCNGb3VuZHJ5IHRlc3RpbmcgYXBwYXJhdHVzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjExLjAwI0hhcmRuZXNzIHRlc3RlcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMTIuMDAjSW1wYWN0IHRlc3RlcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMTMuMDAjTG9hZCBmcmFtZSM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4xNC4wMCNNZXRhbCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjE1LjAwI1Bob3RvZWxhc3RpYyB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjE2LjAwI1Byb29mc3RyZXNzIGluZGljYXRvcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMTcuMDAjUmVsYXhhdGlvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjE4LjAwI1JvdWdobmVzcyBtZWFzdXJpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMTkuMDAjU2hlYXIgc3RyZW5ndGggdGVzdGVycyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4yMC4wMCNTaG9jayB0ZXN0aW5nIGFwcGFyYXR1cyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4yMS4wMCNUZW5zaW9uIHRlc3RlcnMjNDEuMTEuNDYuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDYuMjIuMDAjVG9yc2lvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjIzLjAwI0ZsZXh1cmUgb3IgdHJhbnN2ZXJzZSB0ZXN0aW5nIG1hY2hpbmVzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjI0LjAwI1ZpYnJhdGlvbiB0ZXN0ZXJzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ2LjI1LjAwI1dlYXIgdGVzdGVycyM0MS4xMS40Ni4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ni4yNi4wMCNXZWxkaW5nIHRlc3RpbmcgYXBwYXJhdHVzIzQxLjExLjQ2LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ3LjAwLjAwI1BhcGVyIGFuZCB3b29kIGFuZCB0ZXh0aWxlIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDcuMDEuMDAjQ2FyZGJvYXJkIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDcuMDIuMDAjVGV4dGlsZXMgZmFzdG5lc3MgdGVzdGVycyM0MS4xMS40Ny4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ny4wMy4wMCNMZWF0aGVyIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDcuMDQuMDAjUGFwZXIgdGVzdGluZyBpbnN0cnVtZW50cyM0MS4xMS40Ny4wMC4wMAotdW5zcHNjNyM0MS4xMS40Ny4wNS4wMCNUZXh0aWxlIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDcuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDcuMDYuMDAjV29vZCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjQ3LjAwLjAwCi11bnNwc2M3IzQxLjExLjQ4LjAwLjAwI0NlcmFtaWNzIGFuZCBnbGFzcyB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjQ4LjAxLjAwI0NlcmFtaWNzIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDguMDAuMDAKLXVuc3BzYzcjNDEuMTEuNDguMDIuMDAjR2xhc3MgdGVzdGluZyBpbnN0cnVtZW50cyM0MS4xMS40OC4wMC4wMAotdW5zcHNjNyM0MS4xMS40OC4wMy4wMCNQb3R0ZXJ5IHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuNDguMDAuMDAKLXVuc3BzYzcjNDEuMTEuNTEuMDAuMDAjQ29hbCBhbmQgb3JlIHRlc3RpbmcgaW5zdHJ1bWVudHMjNDEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNTEuMDEuMDAjQ29hbCB0ZXN0aW5nIGluc3RydW1lbnRzIzQxLjExLjUxLjAwLjAwCi11bnNwc2M3IzQxLjExLjUyLjAwLjAwI1JhZGFyIGFuZCBzb25hciBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIzQxLjExLjAwLjAwLjAwCi11bnNwc2M3IzQxLjExLjUyLjAxLjAwI1JhZGFyYmFzZWQgc3VydmVpbGxhbmNlIHN5c3RlbXMjNDEuMTEuNTIuMDAuMDAKLXVuc3BzYzcjNDEuMTEuNTIuMDIuMDAjRmVlZCBob3JucyM0MS4xMS41Mi4wMC4wMAotdW5zcHNjNyM0Mi4wMC4wMC4wMC4wMCNNZWRpY2FsIEVxdWlwbWVudCBhbmQgQWNjZXNzb3JpZXMgYW5kIFN1cHBsaWVzIzQyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjAwLjAwLjAwI0hvc3BpdGFsIGFuZCBtZWRpY2FsIGFuZCBkZW50YWwgZXF1aXBtZW50IzQyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjE1LjAwLjAwI0FuZXN0aGVzaWEgZXF1aXBtZW50IGFuZCBpbnN0cnVtZW50cyBhbmQgYWNjZXNzb3JpZXMjNDIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTUuMDIuMDAjSGVhbHRoY2FyZSBnYXMgbWFjaGluZXMjNDIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTUuMDMuMDAjQW5lc3RoZXNpYSBtYWNoaW5lcyM0Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNS4wNC4wMCNSZWdpb25hbCBhbmFlc3RoZXNpYSBraXRzIG9yIG5lZWRsZXMjNDIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDAuMDAjTWVkaWNhbCBlcXVpcG1lbnQgYW5kIGluc3RydW1lbnRzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjAxLjAwI01lZGljYWwgdGhlcm1vbWV0ZXJzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjAyLjAwI1NwZWN1bHVtcyM0Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNi4wMy4wMCNPdG9zY29wZXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDQuMDAjQXVkaW9tZXRlcnMgb3IgdHltcGFub21ldGVycyM0Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNi4wNS4wMCNTdGV0aG9zY29wZXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDYuMDAjRXJnb25vbWV0ZXJzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjA3LjAwI0VsZWN0cm8gdGhlcmFweSBhcHBhcmF0dXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDguMDAjUGhvdG8gdGhlcmFweSBhcHBhcmF0dXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTYuMDkuMDAjSHlkcm90aGVyYXB5IHN1cHBsaWVzIG9yIGFjY2Vzc29yaWVzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjEwLjAwI0FjdXB1bmN0dXJlIHVuaXRzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjExLjAwI1N0ZXRob2dyYXBocyM0Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNi4xMi4wMCNNZWRpY2FsIHB1bXBzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjEzLjAwI01lZGljYWwgdmFsdmVzIzQyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE2LjE0LjAwI0VuZG9zY29wZXMjNDIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDAuMDAjTWVkaWNhbCB0ZXN0aW5nIGFuZCBhbmFseXppbmcgYW5kIGRpYWdub3N0aWMgZXF1aXBtZW50IzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjAxLjAwI1NraW4gdGVzdCBzdHJpcHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDIuMDAjQmxvb2QgYW5hbHl6ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjAzLjAwI0Jsb29kIGNlbGwgY291bnRlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDQuMDAjSGFlbW9nbG9iaW5vbWV0ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjA1LjAwI0JpbGlydWJpbiBtZXRlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDYuMDAjSGFlbWFjeXRvbWV0ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjA3LjAwI0NvbG9ueSBjb3VudGVycyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNy4wOC4wMCNGZXJyaXRpbiB0ZXN0IGtpdHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMDkuMDAjRW56eW1lIGxpbmtlZCBpbW11bm9zb3JiZW50IGFzc2F5IChFTElTQSkgdGVzdCBraXQjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTAuMDAjSHVtYW4gaW1tdW5lIGRlZmljaWVuY3kgKEhJVikgdGVzdCBraXRzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjExLjAwI1N5ZmFjYXJkIHN5cGhpbGlzIHRlc3RzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjEyLjAwI1ByZWduYW5jeSB0ZXN0IGtpdHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTMuMDAjUmFkaW8gaW1tdW5vYXNzYXkgKFJJQSkgdGVzdCBraXRzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjE0LjAwI1BvbGlvIGNhc2UgaW52ZXN0aWdhdGlvbiBraXQjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTUuMDAjVXJpbmUgYmxvb2QgdGVzdCBzdHJpcHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTYuMDAjQ2VsbCBzaXplIGFuYWx5emVycyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNy4xNy4wMCNXaG9sZSBib2R5IGNvdW50ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjE4LjAwI0Jpb21lZGljYWwgY291bnRlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMTkuMDAjTWVkaWNhbCBtdWx0aXByb2JlIHN5c3RlbSBjb3VudGVycyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNy4yMC4wMCNBbGxlcmd5IG9yIGRpYWdub3N0aWMga2l0cyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xNy4yMS4wMCNVcmluYXJ5IHRlc3Qgc2V0IzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjIyLjAwI0RpZmZlcmVudGlhbCBjZWxsIGNvdW50ZXJzIzQyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE3LjIzLjAwI1BsYXNtYSB2aXNjb3NpdHkgbWVhc3VyZW1lbnQjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjQuMDAjUGxhdGVsZXQgYW5hbHlzaXMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjUuMDAjQmxvb2QgZ2x1Y29zZSBtZXRlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjYuMDAjSGVtb2N1bHR1cmUgdGVzdHMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjcuMDAjQm9keWZhdCBhbmFseXNlcnMjNDIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTcuMjguMDAjU2FtcGxlIGNvbGxlY3Rpb24gc3lzdGVtcyM0Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wMC4wMCNYIHJheSBhbmQgYWxwaGEgYW5kIGJldGEgYW5kIGdhbW1hIHJhZGlhdGlvbiBhcHBhcmF0dXMjNDIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMDEuMDAjRGlhZ25vc3RpYyB4IHJheSBlcXVpcG1lbnQjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMDIuMDAjUmFkaW90aGVyYXB5IHNpbXVsYXRvciM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wMy4wMCNDYWxpYnJhdGlvbiBlcXVpcG1lbnQjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMDQuMDAjQmlvbWVkaWNhbCByZXNlYXJjaCBzdXBwb3J0IHVuaXRzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjA1LjAwI0NvbXB1dGVkIHRvbW9ncmFwaHkgKENUKSBzY2FubmVycyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wNi4wMCNXYXRlciBwaGFudG9tcyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wNy4wMCNSYWRpb2Jpb2xvZ2ljYWwgaW5zdHJ1bWVudHMjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMDguMDAjR2FtbWEgc2NpbnRpbGxhdG9ycyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4wOS4wMCNHYW1tYSBjYW1lcmFzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjEwLjAwI0xpbmVhciBhY2NlbGVyYXRvcnMjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMTEuMDAjUmFkaW90aGVyYXB5IGJyYWNoeXRoZXJhcHkgZXF1aXBtZW50IzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjEyLjAwI1JhZGlvdGhlcmFweSB0ZWxldGhlcmFweSBjb2JhbHQgNjAgbWFjaGluZSM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4xMy4wMCNSYWRpb3RoZXJhcHkgdGVsZXRoZXJhcHkgc3VwZXJmaWNpYWwgeCByYXkgbWFjaGluZSM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4xNC4wMCNSYWRpb3RoZXJhcHkgdGVsZXRoZXJhcHkgb3J0aG92b2x0YWdlIHggcmF5IG1hY2hpbmUjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMTUuMDAjUmFkaW90aGVyYXB5IHRlbGV0aGVyYXB5IGxpbmVhciBhY2NlbGVyYXRvcnMjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTguMTYuMDAjUmFkaW9pc290b3BlIHNjYW5uZXJzIGZvciBtZWRpY2FsIHB1cnBvc2VzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjE3LjAwI0RlbnRhbCB4IHJheSB1bml0cyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4xOC4wMCNBbmdpb2dyYXBoeSBzdXBwbGllcyM0Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOC4xOS4wMCNBbmdpb2dyYXBoeSBkZXZpY2VzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjIwLjAwI0FuZ2lvcGxhc3R5IHN1cHBsaWVzIzQyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE4LjIxLjAwI0FuZ2lvcGxhc3R5IGRldmljZXMjNDIuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMDAuMDAjT3h5Z2VuIHRoZXJhcHkgZXF1aXBtZW50IzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjAxLjAwI0luaGFsYXRpb24gZXF1aXBtZW50IzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjAyLjAwI01lZGljYWwgaHVtaWRpZmllcnMjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMDMuMDAjUmVzdXNjaXRhdG9ycyBvciByZXNwaXJhdG9ycyM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4wNC4wMCNBc3BpcmF0b3JzIzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjA1LjAwI0luc3VmZmxhdG9ycyM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4wNi4wMCNSZXN1c2NpdGF0aW9uIGVtZXJnZW5jeSBvdXRmaXRzIzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjA3LjAwI05lYnVsaXplcnMjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMDguMDAjQWVyb3NvbCB0aGVyYXB5IGFwcGFyYXR1cyM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4wOS4wMCNNZWRpY2FsIHZlbnRpbGF0aW9uIHN5c3RlbXMjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTAuMDAjTWFza3Mgb3IgYnJlYXRoaW5nIGJhZ3MjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTEuMDAjSGVhcnQgbHVuZyBhcHBhcmF0dXMjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTIuMDAjQnJlYXRoaW5nIGRldmljZSB3aXRoIGh5Z2llbmljIGJhcnJpZXIjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTMuMDAjT3h5Z2VuIG1hc2tzIzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjE5LjE0LjAwI01vYmlsZSBzdWN0aW9uIHVuaXQjNDIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMTkuMTUuMDAjSHlwZXJiYXJpYyB0cmVhdG1lbnQgY2hhbWJlciM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4xNi4wMCNPeHlnZW5hdG9ycyM0Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4xOS4xNy4wMCNBaXIgb3h5Z2VuIHVuaXRzIzQyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjIwLjAwLjAwI01lZGljYWwgYW5kIHN1cmdpY2FsIGFuZCBsYWJvcmF0b3J5IHN0ZXJpbGl6ZXJzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIwLjAxLjAwI0F1dG9jbGF2ZXMjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjAuMDIuMDAjU3RlYW0gc3RlcmlsaXplcnMjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjAuMDMuMDAjQm9pbGluZyBkaXNpbmZlY3RvcnMjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjAuMDQuMDAjSG90IGFpciBzdGVyaWxpemVycyM0Mi4xMC4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMC4wNS4wMCNDaGVtaWNhbCBzdGVyaWxpemVycyM0Mi4xMC4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMC4wNi4wMCNMYWJvcmF0b3J5IHN0ZXJpbGl6ZXJzIzQyLjEwLjIwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIwLjA3LjAwI1N0ZXJpbGl6YXRpb24gb3ZlbnMjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjAuMDguMDAjR2VybWljaWRhbCBsYW1wcyM0Mi4xMC4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMC4wOS4wMCNTdGVyaWxpemluZyBsYW1wcyM0Mi4xMC4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMC4xMC4wMCNEZWNvbnRhbWluYXRpb24gd2FzaGluZyBlcXVpcG1lbnQjNDIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDAuMDAjU3VyZ2ljYWwgc2V0cyBhbmQgaW5zdHJ1bWVudHMjNDIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDEuMDAjQ3J5byBzdXJnZXJ5IGVxdWlwbWVudCM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4wMi4wMCNBdXRvcHN5IGluc3RydW1lbnRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjAzLjAwI1N1Y3Rpb24gdW5pdHMgb3IgcGFydHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDQuMDAjU3VyZ2ljYWwgbGFzZXJzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjA1LjAwI0VsZWN0cm8gY2F1dGVyeSBzdXJnaWNhbCBlcXVpcG1lbnQjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDYuMDAjRWFyIG9yIG5vc2Ugb3IgdGhyb2F0IChFTlQpIHN1cmdlcnkgaW5zdHJ1bWVudHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMDcuMDAjR3luZWNvbG9naWNhbCBzdXJnZXJ5IGluc3RydW1lbnRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjA4LjAwI0NhcmRpb2xvZ3kgc3VyZ2VyeSBpbnN0cnVtZW50cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4wOS4wMCNNaWNybyBzdXJnZXJ5IGluc3RydW1lbnRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjEwLjAwI09ydGhvcGVkaWMgc3VyZ2VyeSBpbnN0cnVtZW50cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4xMS4wMCNTdXR1cmUgY2xpcHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMTIuMDAjRGlzc2VjdGluZyBpbnN0cnVtZW50cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4xMy4wMCNEaXNzZWN0aW5nIHBpbnMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMTQuMDAjSW1wbGFudCBzeXN0ZW1zIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjE1LjAwI0Jsb29kIGxhbmNldHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMTYuMDAjU2NhbHBlbHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMTcuMDAjU3VyZ2ljYWwgYmxhZGVzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjE4LjAwI0NyYW5pb2NsYXN0cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4xOS4wMCNTdXJnaWNhbCBzY2lzc29ycyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yMC4wMCNTdXJnaWNhbCBzaGVhcnMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMjEuMDAjU3VyZ2ljYWwgZHJpbGxzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjIyLjAwI1N1cmdpY2FsIHdpcmUgc2F3cyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yMy4wMCNTdXJnaWNhbCBwZXJmb3JhdG9ycyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yNC4wMCNDdXJldHRlcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yNS4wMCNTdXJnaWNhbCBjbGFtcHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMjYuMDAjU3VyZ2ljYWwgaW5zdHJ1bWVudCBob2xkZXJzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjI3LjAwI1N1cmdpY2FsIGVsZXZhdG9ycyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4yOC4wMCNSYXNwYXRvcnkgaW5zdHJ1bWVudHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuMjkuMDAjRm9yY2VwcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4zMC4wMCNTdXJnaWNhbCByZXRyYWN0b3JzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjMxLjAwI1N1cmdpY2FsIHNwcmVhZGVycyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4zMi4wMCNVdGVyaW5lIHNvdW5kIGluc3RydW1lbnRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjMzLjAwI0RpbGF0b3JzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjM0LjAwI1N1cmdpY2FsIGRpc2hlcyBvciBwb3RzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjM1LjAwI1N1cmdpY2FsIHByb2JlcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4zNi4wMCNTdXJnaWNhbCBtYWxsZXRzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjM3LjAwI0RlY2FwaXRhdGlvbiBob29rcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS4zOC4wMCNTdXR1cmVzIzQyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIxLjM5LjAwI0NhdGd1dCBjaHJvbWljIHN1dHVyZXMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjEuNDAuMDAjTGFyeW5nb3Njb3BlcyM0Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMS40MS4wMCNTdXJnaWNhbCBzaGF2aW5nIGtpdHMjNDIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMDAuMDAjUmVoYWJpbGl0YXRpb24gZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4wMS4wMCNTcGxpbnRzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjAyLjAwI1BzeWNob2xvZ2ljYWwgYXB0aXR1ZGUgdGVzdGluZyBhcHBhcmF0dXMjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMDMuMDAjTWFzc2FnZSBhcHBhcmF0dXMjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMDQuMDAjVHJhY3Rpb24gcHVsbGV5cyBvciBiZWx0cyBvciB3ZWlnaHRzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjA1LjAwI1BoeXNpY2FsIHRoZXJhcHkgcmVoYWJpbGl0YXRpb24gZXF1aXBtZW50IG9yIGFjY2Vzc29yaWVzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjA2LjAwI092ZXJiZWQgZnJhbWVzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjA3LjAwI1JlaGFiaWxpdGF0aW9uIHN0aW11bGF0b3JzIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIyLjA4LjAwI1BhdGllbnQgbGlmdGVycyM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4wOS4wMCNTaG9ydCB3YXZlIGRpYXRoZXJteSBlcXVpcG1lbnQjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTAuMDAjTW9pc3QgaGVhdCB0aGVyYXB5IGVxdWlwbWVudCM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xMS4wMCNIZWF0IG9yIGNvbGQgcGFja3MjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTIuMDAjUGh5c2lvbG9naWNhbCBlcXVpcG1lbnQjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTMuMDAjU3RpbXVsYXRvcnMjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTQuMDAjUmVoYWJpbGl0YXRpb24gc3VwcGxpZXMgZm9yIHRoZSBibGluZCM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xNS4wMCNFbGVjdHJvbXlvZ3JhcGgjNDIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjIuMTYuMDAjUmVoYWJpbGl0YXRpb24gc3VwcGxpZXMgZm9yIHNwZWVjaCBoYW5kaWNhcHBlZCM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xNy4wMCNFbGVjdHJvIHNsZWVwIGFwcGFyYXR1cyM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xOC4wMCNWaXN1YWwgZXhlcmNpc2UgdHJhaW5pbmcgYWlkcyM0Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMi4xOS4wMCNPcnRob3BlZGljIGN1c2hpb25zIzQyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjAwLjAwI09waHRoYWxtb2xvZ3kgaW5zdHJ1bWVudHMgYW5kIGFwcGxpYW5jZXMjNDIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDEuMDAjT3B0aGFsbW9sb2dpY2FsIHB1bmNoZXMjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDIuMDAjUGhvdG9jb2FndWxhdG9ycyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMy4wMy4wMCNTbGl0IGxhbXBzIzQyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjA0LjAwI1BlcmltZXRlcnMjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDUuMDAjVG9ub21ldGVycyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMy4wNi4wMCNSZXRpbm9tZXRlcnMjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDcuMDAjRXlld2FzaGVycyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMy4wOC4wMCNPcGh0aGFsbW9tZXRlcnMjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMDkuMDAjT3BodGhhbG1vc2NvcGVzIzQyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjEwLjAwI0VtZXJnZW5jeSBleWUgY2FyZSBlcXVpcG1lbnQjNDIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjMuMTEuMDAjS2VyYXRvbWV0ZXJzIzQyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjEyLjAwI1Zpc2lvbiB0ZXN0ZXJzIzQyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzQyLjEwLjIzLjEzLjAwI1N5bm90b3Njb3BlcyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yMy4xNC4wMCNPcGh0aGFsbWljIG9wZXJhdGlvbiBpbnN0cnVtZW50cyM0Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wMC4wMCNHeW5lY29sb2dpY2FsIGFuZCBvYnN0ZXRyaWNhbCBpbnN0cnVtZW50cyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wMS4wMCNJbnRyYSB1dGVyaW5lIGRldmljZSAoSVVEKSBpbnNlcnRpb24ga2l0cyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wMi4wMCNUdWJhbCBsaWdhdGlvbiBraXRzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjAzLjAwI1Zhc2VjdG9teSBraXRzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjA0LjAwI0xhcGFyb3Njb3BpYyBlcXVpcG1lbnQjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMDUuMDAjU2lsYXN0aWMgYmFuZHMjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMDYuMDAjTWVuc3RydWF0aW9uIHJlZ3VsYXRpb24ga2l0cyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wNy4wMCNTcGVybW9raW5lc2VtZXRlciM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4wOC4wMCNVdGVyaW5lIG9yIGd5bmVjb2xvZ2ljYWwgdGVzdHMjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMDkuMDAjT2JzdGV0cmljYWwgcmV0cmFjdG9ycyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4xMC4wMCNVbWJpbGljYWwgdGFwZXMjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMTEuMDAjQnJlYXN0IHB1bXBzIG9yIGFjY2Vzc29yaWVzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjEyLjAwI01pZHdpZmUgZXF1aXBtZW50IG9yIGtpdHMjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMTMuMDAjSHlzdGVyb3Njb3BpYyBlcXVpcG1lbnQjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMTQuMDAjVmFnaW5vc2NvcGUjNDIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjQuMTUuMDAjVXJldGhyb3Njb3BlIGN5c3RlcnNjb3BlIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjE2LjAwI1VtYmlsaWNhbCBjb3JkIGNsYW1wcyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4xNy4wMCNWYWN1dW0gZXh0cmFjdG9ycyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4xOC4wMCNJbiB2aXRybyBmZXJ0aWxpemF0aW9uIGVxdWlwbWVudCBvciBzdXBwbGllcyM0Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNC4xOS4wMCNFbmRvbWV0cmlhbCBiaW9wc3kgZXF1aXBtZW50IzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjIwLjAwI0ludHJhdXRlcmluZSBpbnNlbWluYXRpb24gY2F0aGV0ZXJzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI0LjIxLjAwI1BlbHZpbWV0ZXJzIzQyLjEwLjI0LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI1LjAwLjAwI0ZpYmVyIG9wdGljIGV4YW1pbmF0aW9uIGluc3RydW1lbnRzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjI1LjAxLjAwI0xpZ2h0IHNvdXJjZXMjNDIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjUuMDIuMDAjRW5kb3Njb3B5IGVxdWlwbWVudCM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wMy4wMCNQcm90b3Njb3BlcyM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wNC4wMCNDdWxkb3Njb3BlcyM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wNS4wMCNHYXN0cm9zY29wZXMjNDIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjUuMDYuMDAjRXNvcGhhZ29zY29wZSM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wNy4wMCNTaWdtb2lkb3Njb3BlIzQyLjEwLjI1LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI1LjA4LjAwI0Jyb25jaG9zY29wZSM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4wOS4wMCNDb2xvbm9zY29wZSM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNS4xMC4wMCNBcnRocm9zY29wZSM0Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4wMC4wMCNFbGVjdHJvIGRpYWdub3N0aWMgYXBwYXJhdHVzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjAxLjAwI0VsZWN0cm9jYXJkaW9ncmFwaHMgKEVDR3MpIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjAyLjAwI0NhcmRpb3Njb3BlcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4wMy4wMCNTdGVyZW90YWN0aWMgc3lzdGVtcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4wNC4wMCNBY2hpbGxlYW4gcmVmbGV4b21ldGVyIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA1LjAwI1RoZXNpb21ldGVyIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA2LjAwI1BuZXVtb3RhY2hvZ3JhcGhzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA3LjAwI0Jpb3ZpZGVvZ3JhcGhzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA4LjAwI1BoeXNpb2xvZ2ljYWwgbGV2ZXJzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjA5LjAwI05lcnZlIGNoYW1iZXIgZXF1aXBtZW50IzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjEwLjAwI1VsdHJhc29uaWMgZGlhZ25vc3RpYyBlcXVpcG1lbnQjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMTEuMDAjVWx0cmFzb3VuZCBzY2FubmVycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4xMi4wMCNEb3BwbGVyIHVsdHJhc291bmQgZXF1aXBtZW50IzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjEzLjAwI1VsdHJhc29uaWMgc3VyZ2VyeSBlcXVpcG1lbnQgb3IgdWx0cmFzb25pYyBhc3BpcmF0aW9uIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjE0LjAwI1VsdHJhc291bmQgcGh5c2lvdGhlcmFweSBlcXVpcG1lbnQjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMTUuMDAjQ2FyZGlvIHNvbmFycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4xNi4wMCNTaG9ydCB3YXZlIG1lZGljYWwgYXBwYXJhdHVzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjE3LjAwI0Jsb29kIHByZXNzdXJlIG1lYXN1cmluZyBlcXVpcG1lbnQjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMTguMDAjRWxlY3Ryb2VuY2VwaGFsb2dyYXBocyAoRUVHcykjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMTkuMDAjU3Bpcm9tZXRlcnMjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMjAuMDAjR3luZWNvbG9naWNhbCBkaWFnbm9zdGljIGVxdWlwbWVudCM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yMS4wMCNDb2xwb3Njb3BlcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yMi4wMCNBbW5pb3Njb3BlcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yMy4wMCNGZXRhbCBtb25pdG9ycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yNC4wMCNEZWxpdmVyeSBtb25pdG9ycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yNS4wMCNOZW9uYXRhbCBtb25pdG9ycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4yNi4wMCNIZWFydCBtb25pdG9yIHN5c3RlbXMjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMjcuMDAjSW50ZW5zaXZlIGNhcmUgbW9uaXRvcnMjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMjguMDAjRWxlY3Ryb21lZGljYWwgdGVzdGluZyBlcXVpcG1lbnQjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMjkuMDAjRGVmaWJyaWxsYXRvciB0ZXN0ZXIjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMzAuMDAjQXVkaW9tZXRlciBjYWxpYnJhdGlvbiB0ZXN0ZXIjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMzEuMDAjRWxlY3Ryb2RlIG9yIGVsZWN0cm9tZWRpY2FsIHRlc3RlciM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4zMi4wMCNWZW50aWxhdG9yIHRlc3QgbWV0ZXJzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjMzLjAwI0VDRyBwYXRpZW50IHNpbXVsYXRvcnMjNDIuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjYuMzQuMDAjRWxlY3Ryb3N1cmdpY2FsIGFuYWx5emVycyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4zNS4wMCNFbGVjdHJvbWVkaWNhbCBzYWZldHkgYW5hbHl6ZXJzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjM2LjAwI0VsZWN0cm9tZWRpY2FsIHRlc3Qgc3lzdGVtcyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4zNy4wMCNFbGVjdHJvbmljIHB1bHNlIG1vbml0b3JzIzQyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI2LjM4LjAwI1ZhZ2luYWwgdWx0cmFzb3VuZCBwcm9iZSM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNi4zOS4wMCNNZWRpY2FsIGNvbmR1Y3RpdmUgZ2VscyM0Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4wMC4wMCNEaWFseXNpcyBlcXVpcG1lbnQgYW5kIGluc3RydW1lbnRzIzQyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjAxLjAwI0Jsb29kIGJhZyBzYW1wbGVyIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjAyLjAwI0Jsb29kIHdhcm1lciM0Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4wMy4wMCNEaWFseXNpcyBpbnN0cnVtZW50IHNldHMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMDQuMDAjUGVyaXRvbmVhbCBkaWFseXNpcyB1bml0cyM0Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4wNS4wMCNIYWVtb2RpYWx5c2lzIHVuaXRzIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjA2LjAwI0Jsb29kIGZpbHRlcnMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMDcuMDAjQmxvb2Qgc2VwYXJhdG9yIHN0YW5kIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjA4LjAwI1BsYXNtYXBob3Jlc2lzIGVxdWlwbWVudCM0Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4wOS4wMCNBbmdpb2dyYXBoaWMgaW5qZWN0b3JzIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjEwLjAwI0hlbWFmaWx0ZXJzIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjExLjAwI0RpYWx5c2lzIHR1YmluZyBvciBtZW1icmFuZXMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMTIuMDAjQmxvb2Qgb3h5Z2VuIGRlbWFuZCBhcHBhcmF0dXMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMTMuMDAjQ2xvdCBjb2FndWxhdGlvbiBkZXRlY3Rpb24gc3lzdGVtcyM0Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yNy4xNC4wMCNNZWRpY2FsIGRyYWlucyBvciBkcmFpbmFnZSBraXRzIzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI3LjE1LjAwI0t5bW9ncmFwaHMjNDIuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjcuMTYuMDAjQmxvb2Qgc2FtcGxpbmcgZXF1aXBtZW50IzQyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjAwLjAwI0RlbnRhbCBpbnN0cnVtZW50cyBhbmQgYXBwbGlhbmNlcyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4wMS4wMCNEZW50YWwgbWl4aW5nIHNsYWJzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjAyLjAwI0JhbmRzIGZvciBkZW50YWwgbWF0cml4IzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjAzLjAwI0RlbnRhbCByZXRhaW5lcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMDQuMDAjRGVudGFsIGhhbmRwaWVjZXMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMDUuMDAjRGVudGFsIGNyeW9zdXJnaWNhbCBpbnN0cnVtZW50YXRpb24jNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMDYuMDAjRGVudGFsIGZvcm1lcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMDcuMDAjUGVyaW9kb250aXVtIGNvbnRyb2wgaW5zdHJ1bWVudHMgb3IgcGVyaW90ZXN0IzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjA4LjAwI0RlbnRhbCB0cmF5cyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4wOS4wMCNEZW50YWwgcHJvYmVzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjEwLjAwI0RlbnRhbCBzY2FsZXMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTEuMDAjRGVudGFsIHNwYXR1bGFzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjEyLjAwI0RlbnRhbCBlbGV2YXRvcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTMuMDAjRGVudGFsIGV4Y2F2YXRvcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTQuMDAjRGVudGFsIGZpbmdlciBwcm90ZWN0b3JzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjE1LjAwI0RlbnRhbCB0d2VlemVycyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4xNi4wMCNEZW50YWwgc2Npc3NvcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTcuMDAjRGVudGFsIGZvcmNlcHMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTguMDAjRGVudGFsIG1pcnJvcnMjNDIuMTAuMjguMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjguMTkuMDAjT3J0aG9kb250aWMgYXBwbGlhbmNlcyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4yMC4wMCNEZW50YWwgaW1wcmVzc2lvbiB0cmF5cyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4yMS4wMCNEZW50YWwgc3lyaW5nZXMgb3IgbmVlZGxlcyM0Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOC4yMi4wMCNEZW50YWwgZHJpbGxzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI4LjIzLjAwI0VuZG9kb250aWNzIGFjY2Vzc29yaWVzIzQyLjEwLjI4LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI5LjAwLjAwI0NhcmRpb2xvZ3kgZXF1aXBtZW50IGFuZCBzdXBwbGllcyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4yOS4wMS4wMCNIZWFydCB2YWx2ZXMjNDIuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjkuMDIuMDAjSGVhcnQgY2F0aGV0ZXJzIzQyLjEwLjI5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI5LjAzLjAwI0RlZnJpYmlsYXRvcnMjNDIuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMjkuMDQuMDAjQW9ydGljIGJhbGxvb24gZXF1aXBtZW50IzQyLjEwLjI5LjAwLjAwCi11bnNwc2M3IzQyLjEwLjI5LjA1LjAwI1BhY2VtYWtlcnMjNDIuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMDAuMDAjTWVkaWNhbCBjb25zdW1hYmxlcyM0Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wMS4wMCNCbG9vZCBvciBpbnRyYXZlbm91cyAoSVYpIGJvdHRsZXMgb3IgYmFncyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wMi4wMCNUb25ndWUgZGVwcmVzc29ycyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wMy4wMCNTdXR1cmUgbmVlZGxlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wNC4wMCNCaW9wc3kgbmVlZGxlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wNS4wMCNCaW9wc3kgY2Fwc3VsZXMgb3IgcHVuY2hlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wNi4wMCNEaXNzZWN0aW5nIG5lZWRsZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMDcuMDAjQWN1cHVuY3R1cmUgbmVlZGxlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4wOC4wMCNNZWRpY2FsIGRpc3Bvc2FsIGNvbnRhaW5lcnMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMDkuMDAjSGFlbWF0b2NyaXQgdHViZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMTAuMDAjU3dhYnMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMTEuMDAjQmxvb2QgdHJhbnNmdXNpb24gbmVlZGxlcyBvciBjYW5udWxhZSM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xMi4wMCNUcmFuc2ZlciBzd2FicyBvciBhcHBsaWNhdG9ycyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xMy4wMCNVcmluZSBiYWdzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjE0LjAwI1NwZWNpbWVuIGNvbnRhaW5lcnMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMTUuMDAjUGxhc3RlciBvZiBwYXJpcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xNi4wMCNTdGVyaWxlIHN0cmlwcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xNy4wMCNHYXV6ZSBjbG90aCM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xOC4wMCNDb3R0b24gd29vbCM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4xOS4wMCNTdGVyaWxlIHN1cmdpY2FsIGNvbXByZXNzZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjAuMDAjQmFuZGFnZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjEuMDAjRmlyc3QgYWlkIGtpdHMgb3Iga2l0IHJlZmlsbHMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjIuMDAjSHlwb2Rlcm1pYyBzeXJpbmdlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4yMy4wMCNDb3R0b24gc3dhYnMgb24gc3RpY2tzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjI0LjAwI0luZnVzaW9uIHNldHMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjUuMDAjTmFzb2dhc3RyaWMgdHViZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjYuMDAjRGVzdHJ1Y3Rpb24gY2xpcHMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMjcuMDAjRHJlc3NpbmdzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjI4LjAwI0ltcGxhbnRhYmxlIGRydWcgZGVsaXZlcnkgc3lzdGVtcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4yOS4wMCNBdXRvbWF0aWMgbWFzcyB2YWNjaW5hdG9ycyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4zMC4wMCNQaXBldHRpbmcgc3lyaW5nZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzEuMDAjU2NhbHAgdmVpbiBuZWVkbGVzIG9yIHN0b3Bjb2NrcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC4zMi4wMCNIeXBvZGVybWljIG5lZWRsZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzMuMDAjTWVkaWNhbCBqZXQgaW5qZWN0b3JzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjM0LjAwI0xhbmNldHMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzUuMDAjQ2F0aGV0ZXIgZm9yIGluZnVzaW9uIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjM2LjAwI0ludGF2ZW5vdXMgKElWKSBlcXVpcG1lbnQgdHViZXMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzcuMDAjRXlld2FzaCBzb2x1dGlvbnMjNDIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDIuMTAuMzAuMzguMDAjRXhhbWluYXRpb24gZ2xvdmVzIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjEwLjMwLjM5LjAwI1BhdGhvZ2VuIGNsZWFudXAga2l0cyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC40MC4wMCNEaWFiZXRpYyBzeXJpbmdlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC40MS4wMCNEaWFiZXRpYyBwZW4gbmVlZGxlcyM0Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM0Mi4xMC4zMC40Mi4wMCNMYW5jZXQgZGV2aWNlIzQyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzQyLjExLjAwLjAwLjAwI0Fzc2lzdGl2ZSBhbmQgY29ycmVjdGl2ZSBkZXZpY2VzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDAuMDAjUHJvc3RoZXNlcyBhbmQgcGFydHMgdGhlcmVvZiM0Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4wMS4wMCNBbmtsZSBvciBmb290IG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjAyLjAwI0NlcnZpY2FsIG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjAzLjAwI0NlcnZpY28gdGhvcmF0aWMgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDQuMDAjQ2VydmljbyB0aG9yYXRpYyBsdW1ibyBzYWNyYWwgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDUuMDAjRWxib3cgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDYuMDAjRWxib3cgd3Jpc3Qgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDcuMDAjRmluZ2VyIG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjA4LjAwI0Zvb3Qgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMDkuMDAjSGFuZCBvcnRob3NlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4xMC4wMCNIaXAgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMTEuMDAjSGlwIGtuZWUgYW5rbGUgZm9vdCBvcnRob3NlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4xMi4wMCNIaXAgb3Iga25lZSBvciBhbmtsZSBvcnRob3NlcyBqb2ludHMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMTMuMDAjU2hvdWxkZXIgb3IgZWxib3cgb3Igd3Jpc3Qgb3J0aG9zZXMgam9pbnRzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjE0LjAwI0tuZWUgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMTUuMDAjS25lZSBhbmtsZSBmb290IG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjE2LjAwI0x1bWJvIG9yIHNhY3JhbCBvcnRob3NlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4xNy4wMCNTYWNybyBpbGlhYyBvcnRob3NlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4xOC4wMCNTaG91bGRlciBvciBlbGJvdyBvciB3cmlzdCBvciBoYW5kIG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjE5LjAwI1Rob3JhY28gb3IgbHVtYm8gb3Igc2FjcmFsIG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjIwLjAwI1dyaXN0IG9ydGhvc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjIxLjAwI1dyaXN0IG9yIGhhbmQgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjIuMDAjV3Jpc3Qgb3IgaGFuZCBvciBmaW5nZXIgb3J0aG9zZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjMuMDAjQW5rbGUgZGlzYXJ0aWN1bGF0aW9uIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjQuMDAjQXVyYWwgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4yNS4wMCNDb3NtZXRpYyBvciBza2luIGNvdmVyaW5nIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjYuMDAjRWxib3cgZGlzYXJ0aWN1bGF0aW9uIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjcuMDAjSGlwIGRpc2FydGljdWxhdGlvbiBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjI4LjAwI0hvb2sgb3IgZnVuY3Rpb25hbCB0b29sIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMjkuMDAjS25lZSBvciBoaXAgam9pbnQgcHJvc3RoZXNlcyBvciB0b3JxdWUgcmVkdWNlcnMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMzAuMDAjV3Jpc3Qgb3IgZWxib3cgam9pbnQgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4zMS4wMCNLbmVlIGRpc2FydGljdWxhdGlvbiBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjMyLjAwI01hbW1hcnkgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4zMy4wMCNOYXNhbCBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjM0LjAwI09jdWxhciBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjM1LjAwI0JhY2sgZmlsbGVyIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMzYuMDAjUGFsYXRlIHByb3N0aGVzZXMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuMzcuMDAjUGFydGlhbCBmb290IGluY2x1ZGluZyB0b2UgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS4zOC4wMCNQYXJ0aWFsIGhhbmQgaW5jbHVkaW5nIGZpbmdlciBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjM5LjAwI1Nob3VsZGVyIGRpc2FydGljdWxhdGlvbiBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQwLjAwI1NvY2tldCBvciBhbGlnbm1lbnQgdW5pdCBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQxLjAwI1RlbXBvcmFyeSBwcm9zdGhlc2VzIGZvciBlYXJseSBtb2JpbGl6YXRpb24gb2YgbG93ZXIgbGltYiBhbXB1dGVlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS40Mi4wMCNUcmFuc2ZlbW9yYWwgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS40My4wMCNUcmFuc2h1bWVyYWwgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNS40NC4wMCNUcmFuc3JhZGlhbCBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQ1LjAwI1RyYW5zdGliaWFsIGluY2x1ZGluZyBhbmtsZSBvciBmb290IGRldmljZSBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQ2LjAwI1dyaXN0IGRpc2FydGljdWxhdGlvbiBwcm9zdGhlc2VzIzQyLjExLjE1LjAwLjAwCi11bnNwc2M3IzQyLjExLjE1LjQ3LjAwI1Byb3N0aGV0aWMgaGFuZHMjNDIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTUuNDguMDAjVmFzY3VsYXIgcHJvc3RoZXNlcyM0Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4wMC4wMCNDb21tdW5pY2F0aW9uIGFuZCBlZHVjYXRpb25hbCBtYXRlcmlhbCBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjAxLjAwI0JyYWlsbGUgd3JpdGluZyBwYXBlciBvciBwbGFzdGljIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjAyLjAwI1N3aXRjaGJvYXJkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjAzLjAwI0NoYXJhY3RlciByZWFkaW5nIG1hY2hpbmVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMDQuMDAjU3ludGhldGljIHNwZWVjaCBkZXZpY2VzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMDUuMDAjVGFjdGlsZSBkaXNwbGF5cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjA2LjAwI0xldHRlciBvciBzeW1ib2wgYm9hcmRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMDcuMDAjRGlhbG9ndWUgdW5pdHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4wOC4wMCNWb2ljZSBnZW5lcmF0b3JzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMDkuMDAjVm9pY2UgYW1wbGlmaWVycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjEwLjAwI0hlYXJpbmcgYWlkcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4xMS4wMCNXcml0aW5nIGZyYW1lcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjEyLjAwI1JhaW4gaW5kaWNhdG9ycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjEzLjAwI0xpZ2h0IGluZGljYXRvcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4xNC4wMCNTb3VuZCBpbmRpY2F0b3JzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMTUuMDAjU3BlZWNoIHRyYWluaW5nIGFpZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4xNi4wMCNMYW5ndWFnZSB0cmFpbmluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMTcuMDAjQnJhaWxsZSBlcXVpcG1lbnQjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTYuMTguMDAjQm9vayBvciBtYW51c2NyaXB0IGhvbGRlcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4xOS4wMCNQYWdlIHR1cm5lcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNi4yMC4wMCNTaWduYXR1cmUgZ3VpZGVzIG9yIHN0YW1wcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE2LjAwLjAwCi11bnNwc2M3IzQyLjExLjE2LjIxLjAwI0VyZ29ub21pY2FsbHkgZGVzaWduZWQgc3RhdGlvbmVyeSBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDAuMDAjRnVybml0dXJlIGFuZCBhY2Nlc3NvcmllcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjAxLjAwI1ByZXNzdXJlIHNvcmUgcHJldmVudGlvbiBmdXJuaXR1cmUjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDIuMDAjUHJlc3N1cmUgc29yZSBwcmV2ZW50aW9uIG1hdHRyZXNzZXMgb3IgY292ZXJpbmdzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjAzLjAwI0JhY2twYWRzIG9yIGJhY2tyZXN0cyBvciBzaW1pbGFyIGFkYXB0YXRpb25zIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDQuMDAjQXJtIHJlc3RzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDUuMDAjQmVkIGV4dGVuc2lvbnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4wNi4wMCNCZWQgbGlmdHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4wNy4wMCNCZWQgc2hvcnRlbmluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMDguMDAjRXJnb25vbWljYWxsIGRlc2lnbmVkIGJlZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4wOS4wMCNCbGFua2V0IHN1cHBvcnRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTcuMTAuMDAjTWVjaGFuaXplZCBjaGFpcnMgdG8gYXNzaXN0IHdpdGggc2l0dGluZyBvciBzdGFuZGluZyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjExLjAwI0NveGl0IG9yIGFydGhyb2Rlc2lzIGNoYWlycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjEyLjAwI0xlZyBleHRlbmRlcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4xMy4wMCNMZWcgc3VwcG9ydHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4xNC4wMCNNb2R1bGFyIG9yIHNwZWNpYWwgc2l0dGluZyBmdXJuaXR1cmUgc3lzdGVtcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE3LjE1LjAwI0hlaWdodCBhZGp1c3RhYmxlIHBsaW50aHMgb3IgYnJhY2tldHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xNy4xNi4wMCNFcmdvbm9taWNhbGx5IGRlc2lnbmVkIHRhYmxlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE3LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjAwLjAwI1BlcnNvbmFsIGNhcmUgZGV2aWNlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjAxLjAwI0FpZHMgdG8gYXNzaXN0IGluIGRyZXNzaW5nIG9uZXMgc2VsZiBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjAyLjAwI0FpZHMgZm9yIHdhc2hpbmcgb25lcyBzZWxmIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMDMuMDAjQWlkcyBmb3IgZHJ5aW5nIG9uZXMgc2VsZiBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjA0LjAwI0JhdGhpbmcgc3RyZXRjaGVycyBvciBzaG93ZXIgdGFibGVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMDUuMDAjRGlhcGVyIGNoYW5naW5nIHRhYmxlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjA2LjAwI0JlZHBhbnMgb3IgY29tbW9kZSBjaGFpcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOC4wNy4wMCNCdXR0b25pbmcgb3IgZmFzdGVuaW5nIGRldmljZXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOC4wOC4wMCNFeHRlbmRlZCBoYW5kbGUgY29tYnMgb3IgYnJ1c2hlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjA5LjAwI1RvaWxldCBhdHRhY2hlZCBkb3VjaGVzIG9yIGFpciBkcnllcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOC4xMC4wMCNUb2lsZXQgc2VhdHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOC4xMS4wMCNIYW5kIGdyaXAgdG9vdGhicnVzaGVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMTIuMDAjQm9keSB3b3JuIHVyaW5lIGFic29yYmluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMTMuMDAjVXJpbmUgY29sbGVjdGlvbiBzeXN0ZW1zIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTguMTQuMDAjSW5jb250aW5lbmNlIGFsYXJtcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE4LjAwLjAwCi11bnNwc2M3IzQyLjExLjE4LjE1LjAwI09zdG9teSBiYWdzIG9yIGFjY2Vzc29yaWVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMDAuMDAjUHJvdGVjdGlvbiBhbmQgbW9iaWxpdHkgZGV2aWNlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjAxLjAwI0NydXRjaGVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjAyLjAwI1RyaXBvZHMgb3IgcXVhZHJvcG9kcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4wMy4wMCNXYWxraW5nIHN0aWNrcyBhY2Nlc3NvcmllcyBvciBwYXJ0cyB0aGVyZW9mIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjA0LjAwI1JvbGxhdG9ycyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4wNS4wMCNXYWxrZXJzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjA2LjAwI1doZWVsY2hhaXJzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjA3LjAwI1doZWVsY2hhaXIgYWNjZXNzb3JpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMDguMDAjU3VwcG9ydCByYWlscyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjA5LjAwI1JvcGUgbGFkZGVycyBvciBsaWZ0aW5nIGJlbHRzIG9yIGhhcm5lc3NlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjEwLjAwI0xpZnRpbmcgb3IgdHVybmluZyBjdXNoaW9ucyBjYXJwZXRzIG9yIHNoZWV0cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjExLjAwI0hvaXN0cyBvciB0cm9sbGV5cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4xMi4wMCNXaGVlbGNoYWlyIHJhbXBzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjEzLjAwI1doZWVsY2hhaXIgbGlmdGluZyBwbGF0Zm9ybXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMTQuMDAjTmF2aWdhdGlvbiBvciBvcmllbnRhdGlvbiBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMTUuMDAjQ2hhaXIgbGlmdHMgb3IgY2hhaXIgdHJhbnNwb3J0ZXJzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMTYuMDAjV2FybmluZyBvciBhbGFybSBkZXZpY2VzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMTcuMDAjQWlyd2F5IHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjE4LjAwI0VhciBvciBoZWFyaW5nIHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjE5LjAwI0ZhY2Ugb3IgZXllIHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjIwLjAwI0hhbmQgb3IgYXJtIG9yIGVsYm93IHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjIxLjAwI0hlYWQgcHJvdGVjdGlvbiBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMjIuMDAjTG93ZXIgZXh0cmVtaXR5IHByb3RlY3Rpb24gYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjIzLjAwI0JhdGh0dWIgbGVuZ3RoIG9yIHdpZHRoIHJlZHVjdGlvbiBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMjQuMDAjVHJ1bmsgb3Igd2hvbGUgYm9keSBwcm90ZWN0aW9uIGFpZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4yNS4wMCNCb2R5IHN1cHBvcnQgdW5pdHMgZm9yIGhvaXN0cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjI2LjAwI0Rvb3Igd2FybmVycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjE5LjI3LjAwI0Zsb2F0YXRpb24gb3Igc3dtbWluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMjguMDAjUmVsaWVmIG1hcHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4yOS4wMCNOb24gY29zbWV0aWMgc2tpbiBjbGVhbmluZyBvciBwcm90ZWN0aXZlIHByb2R1Y3RzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMzAuMDAjU3RhdGlvbmFyeSBob2lzdHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4zMS4wMCNTdG9tYSBzaGllbGRzIG9yIHByb3RlY3RvcnMjNDIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMTkuMzIuMDAjVGFjdGlsZSBzdGlja3MgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4xOS4zMy4wMCNUb2lsZXQgYXJtIG9yIGJhY2tyZXN0cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjE5LjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjAwLjAwI1JlY3JlYXRpb25hbCBhbmQgdHJhaW5pbmcgYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjAwLjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjAxLjAwI0NhbXBpbmcgZXF1aXBtZW50IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMDIuMDAjVGlsdGluZyB0YWJsZXMgZm9yIGJhbGFuY2UgdHJhaW5pbmcgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMC4wMy4wMCNCaW9mZWVkYmFjayBkZXZpY2VzIGZvciBtb3ZlbWVudCBzdHJlbmd0aCBvciBiYWxhbmNlIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMDQuMDAjU3BvcnRzIGV4ZXJjaXNlIGFpZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMC4wNS4wMCNGaXNoaW5nIG9yIGh1bnRpbmcgYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIwLjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjA2LjAwI1BsYXlpbmcgb3IgdHJhaW5pbmcgYmFsbHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMC4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMC4wNy4wMCNDaGVzcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIwLjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjA4LjAwI1BsYXlpbmcgY2FyZHMgb3IgaG9sZGVycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIwLjAwLjAwCi11bnNwc2M3IzQyLjExLjIwLjA5LjAwI0dhcmRlbmluZyB0b29scyBvciBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMTAuMDAjSGFuZGljcmFmdCB0b29scyBtYXRlcmlhbHMgb3IgZXF1aXBtZW50IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMTEuMDAjUGhvdG9ncmFwaGljIGVxdWlwbWVudCBvciBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMTIuMDAjQ2FyYXZhbm5pbmcgZXF1aXBtZW50IGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjAuMTMuMDAjVmlicmF0aW5nIGNoYWlycyBmb3IgdHJhaW5pbmcgZGVhZiBwZW9wbGUjNDIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDAuMDAjU3BlY2lhbGl6ZWQgYWlkcyBmb3IgaG91c2VrZWVwaW5nIGFuZCBoYW5kbGluZyBnb29kcyBhbmQgbWVhc3VyaW5nIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDEuMDAjV2VpZ2hpbmcgb3IgbWVhc3VyaW5nIGFpZHMgb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjAyLjAwI0N1dHRpbmcgb3IgY2hvcHBpbmcgb3IgZGl2aWRpbmcgYWlkcyBvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDMuMDAjQ2xlYW5pbmcgb3IgcGVlbGluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDQuMDAjQmFraW5nIG9yIGNvb2tpbmcgb3IgZnJ5aW5nIGFpZHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4wNS4wMCNGb29kIG9yIGRyaW5rIHNlcnZpY2UgYWlkcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjA2LjAwI0Zvb2Qgc3RvcHBlcnMgb3IgZnVubmVscyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjA3LjAwI1RhYmxld2FyZSBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjA4LjAwI1B1c2hlciBlZGdlcyBvciBwbGF0ZSBidWZmZXJzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMDkuMDAjRmVlZGluZyBhcHBhcmF0dXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4xMC4wMCNGZWVkaW5nIHByb2JlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjExLjAwI1Nob2UgY2xlYW5pbmcgYXBwYXJhdHVzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMTIuMDAjU2V3aW5nIG9yIGtuaXR0aW5nIG9yIGNyb2NoZXRpbmcgb3IgZGFybmluZyBhaWRzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMTMuMDAjQm90dGxlIG9yIGNhbiBvciBjb250YWluZXIgb3BlbmVycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjE0LjAwI1R1YmUgc3F1ZWV6aW5nIGtleXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4xNS4wMCNHcmFzcGluZyBhaWRzIHRvIGFzc2lzdCBvciByZXBsYWNlIGhhbmQgb3IgZmluZ2VyIGZ1bmN0aW9uIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMTYuMDAjR3JpcCBhZGFwdGVycyBvciBhdHRhY2htZW50cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjE3LjAwI0JvZHkgd29ybiBob2xkZXJzIHRvIGFzc2lzdCBoYW5kIG9yIGZpbmdlciBmdW5jdGlvbiBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjE4LjAwI1N0YW5kcyB0byBhc3Npc3QgaGFuZCBvciBmaW5nZXIgZnVuY3Rpb24gZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4xOS4wMCNPcGVyYXRpbmcgc3RpY2tzIHN1Y2ggYXMgaGVhZCBvciBjaGluIG9yIG1vdXRoIHN0aWNrcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjIwLjAwI0V4dGVuZGVycyB3aXRob3V0IGdyaXAgZnVuY3Rpb24gZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4yMS4wMCNGaXhlZCBwb3NpdGlvbmluZyBzeXN0ZW1zIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMjIuMDAjQmFsYW5jZXMgb3IgZXF1aXBtZW50IGZvciBob2lzdGluZyBvciBiYWxhbmNpbmcgb2JqZWN0cyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjIzLjAwI01hbmlwdWxhdG9ycyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjI0LjAwI1JvYm90cyB0byBhc3Npc3QgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjI1LjAwI0luZGljYXRvcnMgc3VjaCBhcyBzaWduYWwgbGlnaHRzIG9yIGJ1enplcnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM0Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM0Mi4xMS4yMS4yNi4wMCNQb2ludGluZyBsYW1wcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzQyLjExLjIxLjAwLjAwCi11bnNwc2M3IzQyLjExLjIxLjI3LjAwI01lYXN1cmluZyBhaWRzIG9yIHRvb2xzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMjguMDAjT2JqZWN0IHBvc2l0aW9uaW5nIGxpZnRpbmcgb3IgdGlsdGluZyBzeXN0ZW1zIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTEuMjEuMjkuMDAjTWFudWFsIGV4dGVuZGVkIHJlYWNoIGdyaXBwaW5nIHRvbmdzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjNDIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMDAuMDAuMDAjVmV0ZXJpbmFyeSBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzQyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEyLjE1LjAwLjAwI1ZldGVyaW5hcnkgZXF1aXBtZW50IzQyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzQyLjEyLjE1LjAxLjAwI1ZldGVyaW5hcnkgYmxvb2QgcHJlc3N1cmUgdGVzdGVycyM0Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Mi4xMi4xNS4wMi4wMCNWZXRlcmluYXJ5IGt5bW9ncmFwaCB0ZXN0ZXIjNDIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMTUuMDMuMDAjVmV0ZXJpbmFyeSBweXJvZ2VuaWMgdGVzdGVyIzQyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE1LjA0LjAwI1ZldGVyaW5hcnkgc3RlcmVvdG94aWMgZXF1aXBtZW50IzQyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE1LjA1LjAwI1ZldGVyaW5hcnkgZWxlY3Ryb2NhcmRpb2dyYXBoIChFQ0cpIzQyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE2LjAwLjAwI1ZldGVyaW5hcnkgcHJvZHVjdHMjNDIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMTYuMDEuMDAjR2FzdHJvaW50ZXN0aW5hbCB2ZXRlcmluYXJ5IHByb2R1Y3RzIzQyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE2LjAyLjAwI0Jsb29kIG9yIGJsb29kIGZvcm1pbmcgdmV0ZXJpbmFyeSBwcm9kdWN0cyM0Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMi4xNi4wMy4wMCNSZXNwaXJhdG9yeSBzeXN0ZW0gdmV0ZXJpbmFyeSBwcm9kdWN0cyM0Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Mi4xMi4xNi4wNC4wMCNNdXNjdWxvIHNrZWxldGFsIG9yIG5lcnZvdXMgc3lzdGVtIHZldGVyaW5hcnkgcHJvZHVjdHMjNDIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMTYuMDUuMDAjQ2FyZGlvdmFzY3VsYXIgc3lzdGVtIHZldGVyaW5hcnkgcHJvZHVjdHMjNDIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDIuMTIuMTYuMDYuMDAjRGVybWF0b2xvZ2ljYWxzIG9yIGFudGlwcm90b3pvYSB2ZXRlcmluYXJ5IHByb2R1Y3RzIzQyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzQyLjEyLjE2LjA3LjAwI0dlbml0byB1cmluYXJ5IHN5c3RlbSBzZXggb3IgaG9ybW9uZSB2ZXRlcmluYXJ5IHByb2R1Y3RzIzQyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzQzLjAwLjAwLjAwLjAwI0NvbW11bmljYXRpb25zIGFuZCBDb21wdXRlciBFcXVpcG1lbnQgYW5kIFBlcmlwaGVyYWxzIGFuZCBDb21wb25lbnRzIGFuZCBTdXBwbGllcyM0My4wMC4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4wMC4wMC4wMCNTb2Z0d2FyZSM0My4wMC4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4xNS4wMC4wMCNEYXRhYmFzZSBzeXN0ZW1zIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjE1LjAxLjAwI0RhdGFiYXNlIHNvZnR3YXJlIzQzLjE2LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE2LjAwLjAwI09wZXJhdGluZyBzeXN0ZW1zIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjE2LjAxLjAwI01haW5mcmFtZSBvcGVyYXRpbmcgc3lzdGVtIHNvZnR3YXJlIzQzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE2LjAyLjAwI1BlcnNvbmFsIGNvbXB1dGVyIChQQykgb3BlcmF0aW5nIHN5c3RlbSBzb2Z0d2FyZSM0My4xNi4xNi4wMC4wMAotdW5zcHNjNyM0My4xNi4xNi4wMy4wMCNPcGVuIHN5c3RlbXMgb3BlcmF0aW5nIHN5c3RlbXMjNDMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTYuMDQuMDAjQ2x1c3RlcmluZyBzb2Z0d2FyZSM0My4xNi4xNi4wMC4wMAotdW5zcHNjNyM0My4xNi4xNy4wMC4wMCNCdXNpbmVzcyB0cmFuc2FjdGlvbiBhbmQgcGVyc29uYWwgYnVzaW5lc3Mgc29mdHdhcmUjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTcuMDEuMDAjSW52ZXN0bWVudCBtYW5hZ2VtZW50IHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjAyLjAwI1RheCBwcmVwYXJhdGlvbiBzb2Z0d2FyZSM0My4xNi4xNy4wMC4wMAotdW5zcHNjNyM0My4xNi4xNy4wMy4wMCNGYWNpbGl0aWVzIG1hbmFnZW1lbnQgc29mdHdhcmUjNDMuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTcuMDQuMDAjU29mdHdhcmUgc3VpdGVzIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjA1LjAwI0ludmVudG9yeSBtYW5hZ2VtZW50IHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjA2LjAwI0ZpbmFuY2lhbCBhbmFseXNpcyBzb2Z0d2FyZSM0My4xNi4xNy4wMC4wMAotdW5zcHNjNyM0My4xNi4xNy4wNy4wMCNBY2NvdW50aW5nIHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjA4LjAwI1RpbWUgYWNjb3VudGluZyBvciBodW1hbiByZXNvdXJjZXMgc29mdHdhcmUjNDMuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTcuMDkuMDAjQW5hbHl0aWNhbCBvciBzY2llbnRpZmljIHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjEwLjAwI01hdGhlbWF0aWNhbCBvciBmb3JlY2FzdGluZyBzb2Z0d2FyZSM0My4xNi4xNy4wMC4wMAotdW5zcHNjNyM0My4xNi4xNy4xMS4wMCNBdWN0aW9uIHNvZnR3YXJlIzQzLjE2LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE3LjEyLjAwI1NhbGVzIG9yIG1hcmtldGluZyBzb2Z0d2FyZSM0My4xNi4xNy4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wMC4wMCNEb2N1bWVudCBjcmVhdGlvbiBzb2Z0d2FyZSM0My4xNi4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wMS4wMCNEb2N1bWVudCBtYW5hZ2VtZW50IHNvZnR3YXJlIzQzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE4LjAyLjAwI0VsZWN0cm9uaWMgcHVibGlzaGluZyBzb2Z0d2FyZSM0My4xNi4xOC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wMy4wMCNPcHRpY2FsIGNoYXJhY3RlciByZWFkZXIgKE9DUikgc29mdHdhcmUjNDMuMTYuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTguMDQuMDAjVm9pY2UgcmVjb2duaXRpb24gc29mdHdhcmUjNDMuMTYuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTguMDUuMDAjRGVza3RvcCBwdWJsaXNoaW5nIHNvZnR3YXJlIzQzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE4LjA2LjAwI1ByZXNlbnRhdGlvbiBzb2Z0d2FyZSM0My4xNi4xOC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wNy4wMCNXb3JkIHByb2Nlc3Npbmcgc29mdHdhcmUjNDMuMTYuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTYuMTguMDguMDAjU2Nhbm5lciBzb2Z0d2FyZSM0My4xNi4xOC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOC4wOS4wMCNTcGVsbCBjaGVja2VycyM0My4xNi4xOC4wMC4wMAotdW5zcHNjNyM0My4xNi4xOS4wMC4wMCNEcmF3aW5nIGFuZCBpbWFnaW5nIHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjE5LjAxLjAwI0NvbXB1dGVyIGFpZGVkIGRlc2lnbiAoQ0FEKSBzb2Z0d2FyZSM0My4xNi4xOS4wMC4wMAotdW5zcHNjNyM0My4xNi4xOS4wMi4wMCNHcmFwaGljcyBzb2Z0d2FyZSM0My4xNi4xOS4wMC4wMAotdW5zcHNjNyM0My4xNi4xOS4wMy4wMCNFZHVjYXRpb25hbCBzb2Z0d2FyZSM0My4xNi4xOS4wMC4wMAotdW5zcHNjNyM0My4xNi4xOS4wNC4wMCNDb21wdXRlciBhaWRlZCBtYW51ZmFjdHVyaW5nIChDQU0pIHNvZnR3YXJlIzQzLjE2LjE5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE5LjA1LjAwI0NoYXJ0aW5nIHNvZnR3YXJlIzQzLjE2LjE5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE5LjA2LjAwI0Zvcm0gbWFraW5nIHNvZnR3YXJlIzQzLjE2LjE5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjE5LjA3LjAwI01hcHBpbmcgc29mdHdhcmUjNDMuMTYuMTkuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjAuMDAuMDAjU2NoZWR1bGluZyBhbmQgcHJvZHVjdGl2aXR5IHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIwLjAxLjAwI1Byb2plY3QgbWFuYWdlbWVudCBzb2Z0d2FyZSM0My4xNi4yMC4wMC4wMAotdW5zcHNjNyM0My4xNi4yMC4wMi4wMCNTY2hlZHVsaW5nIHNvZnR3YXJlIzQzLjE2LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIwLjAzLjAwI0NvbnRhY3QgbWFuYWdlbWVudCBzb2Z0d2FyZSM0My4xNi4yMC4wMC4wMAotdW5zcHNjNyM0My4xNi4yMS4wMC4wMCNTcHJlYWRzaGVldHMgYW5kIGVuaGFuY2VtZW50IHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIxLjAxLjAwI1NwcmVhZHNoZWV0IHNvZnR3YXJlIzQzLjE2LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIyLjAwLjAwI011bHRpbWVkaWEgc29mdHdhcmUjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjIuMDEuMDAjTXVzaWMgb3Igc291bmQgZWRpdGluZyBzb2Z0d2FyZSM0My4xNi4yMi4wMC4wMAotdW5zcHNjNyM0My4xNi4yMy4wMC4wMCNQcmludCBzaG9wIHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjIzLjAxLjAwI0FkZHJlc3MgYm9vayBtYWtpbmcgc29mdHdhcmUjNDMuMTYuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjMuMDIuMDAjTGFiZWwgbWFraW5nIHNvZnR3YXJlIzQzLjE2LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE2LjI0LjAwLjAwI1Byb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgdG9vbHMjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjQuMDEuMDAjQ29tcGlsaW5nIHNvZnR3YXJlcyM0My4xNi4yNC4wMC4wMAotdW5zcHNjNyM0My4xNi4yNC4wMi4wMCNDb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgc29mdHdhcmUjNDMuMTYuMjQuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjQuMDMuMDAjRGV2ZWxvcG1lbnQgc29mdHdhcmUjNDMuMTYuMjQuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjQuMDQuMDAjR3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIChHVUkpIHRvb2xzIzQzLjE2LjI0LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI0LjA1LjAwI1Byb2dyYW1taW5nIGxhbmd1YWdlcyM0My4xNi4yNC4wMC4wMAotdW5zcHNjNyM0My4xNi4yNC4wNi4wMCNQcm9ncmFtIHRlc3Rpbmcgc29mdHdhcmUjNDMuMTYuMjQuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjUuMDAuMDAjU29mdHdhcmUgdXRpbGl0aWVzIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjAxLjAwI0JhY2t1cCBvciByZWNvdmVyeSBzb2Z0d2FyZSM0My4xNi4yNS4wMC4wMAotdW5zcHNjNyM0My4xNi4yNS4wMi4wMCNCYXIgY29kaW5nIHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjAzLjAwI0ZpbGUgc2VjdXJpdHkgb3IgZGF0YSBzZWN1cml0eSBzb2Z0d2FyZSM0My4xNi4yNS4wMC4wMAotdW5zcHNjNyM0My4xNi4yNS4wNC4wMCNGb3JlaWduIGxhbmd1YWdlIHRyYW5zbGF0aW9uIHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjA1LjAwI1ByaW50IHV0aWxpdHkgc29mdHdhcmUjNDMuMTYuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjUuMDYuMDAjU3RvcmFnZSBtZWRpYSBsb2FkaW5nIHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjA3LjAwI1ZpcnVzIHByb3RlY3Rpb24gc29mdHdhcmUjNDMuMTYuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjUuMDguMDAjR2VuZXJhbCB1dGlsaXR5IHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI1LjA5LjAwI0NvbXByZXNzaW9uIHV0aWxpdGllcyM0My4xNi4yNS4wMC4wMAotdW5zcHNjNyM0My4xNi4yNS4xMC4wMCNTeXN0ZW0gbWFuYWdlbWVudCBzb2Z0d2FyZSM0My4xNi4yNS4wMC4wMAotdW5zcHNjNyM0My4xNi4yNS4xMS4wMCNTdG9yYWdlIG1hbmFnZW1lbnQgc29mdHdhcmUjNDMuMTYuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjUuMTIuMDAjVmVyc2lvbiBjaGVja2VyIHNvZnR3YXJlIzQzLjE2LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjAwLjAwI05ldHdvcmtpbmcgc29mdHdhcmUjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMDEuMDAjUGxhdGZvcm0gaW50ZXJjb25uZWN0aXZpdHkgc29mdHdhcmUjNDMuMTYuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMDIuMDAjT3B0aWNhbCBqdWtlYm94IHNlcnZlciBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4wMy4wMCNPcGVyYXRpbmcgc3lzdGVtIGVuaGFuY2VtZW50IHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjA0LjAwI05ldHdvcmsgb3BlcmF0aW5nIHN5c3RlbSBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4wNS4wMCNOZXR3b3JraW5nIGRldmVsb3BlcnMgc29mdHdhcmUjNDMuMTYuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMDYuMDAjTmV0d29yayBjb25uZWN0aXZpdHkgdGVybWluYWwgZW11bGF0aW9uIHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjA3LjAwI01haW5mcmFtZSB0cmFuc2FjdGlvbiBwcm9jZXNzaW5nIHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjA4LjAwI0xpY2Vuc2UgbWFuYWdlbWVudCBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4wOS4wMCNHYXRld2F5IHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI2LjEwLjAwI0NvbXBhY3QgZGlzYyAoQ0QpIHNlcnZlciBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4xMS4wMCNBZG1pbmlzdHJhdGlvbiBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4xMi4wMCNUcmFuc2FjdGlvbiBzZXJ2ZXIgc29mdHdhcmUjNDMuMTYuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMTMuMDAjU3dpdGNoIG9yIHJvdXRlciBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4xNC4wMCNNdWx0aXBsZXhlciBzb2Z0d2FyZSM0My4xNi4yNi4wMC4wMAotdW5zcHNjNyM0My4xNi4yNi4xNS4wMCNDb21tdW5pY2F0aW9ucyBzZXJ2ZXIgc29mdHdhcmUjNDMuMTYuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjYuMTYuMDAjQnJpZGdlIHNvZnR3YXJlIzQzLjE2LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI3LjAwLjAwI0NvbW11bmljYXRpb24gU29mdHdhcmUjNDMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDEuMDAjRGVza3RvcCBjb21tdW5pY2F0aW9ucyBzb2Z0d2FyZSM0My4xNi4yNy4wMC4wMAotdW5zcHNjNyM0My4xNi4yNy4wMi4wMCNTZXJ2ZXIgY29tbXVuaWNhdGlvbnMgc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDMuMDAjSW50ZXJhY3RpdmUgdm9pY2UgcmVzcG9uc2Ugc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDQuMDAjTW9kZW0gc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDUuMDAjUmVtb3RlIGFjY2VzcyBzb2Z0d2FyZSM0My4xNi4yNy4wMC4wMAotdW5zcHNjNyM0My4xNi4yNy4wNi4wMCNWaWRlbyBjb25mZXJlbmNpbmcgc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjcuMDcuMDAjRXhjaGFuZ2Ugc29mdHdhcmUjNDMuMTYuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjguMDAuMDAjSW50ZXJuZXQgYW5kIGludHJhbmV0IHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjI4LjAxLjAwI0ludGVybmV0IGJyb3dzaW5nIHNvZnR3YXJlIzQzLjE2LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI4LjAyLjAwI1dlYiBzZXJ2ZXIgc29mdHdhcmUjNDMuMTYuMjguMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjkuMDAuMDAjTWlzY2VsbGFuZW91cyBzb2Z0d2FyZSM0My4xNi4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4yOS4wMS4wMCNDb21wdXRlciBnYW1lIHNvZnR3YXJlIzQzLjE2LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI5LjAyLjAwI1NjcmVlbiBzYXZlcnMjNDMuMTYuMjkuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjkuMDMuMDAjVHJhaW5pbmcgc29mdHdhcmUjNDMuMTYuMjkuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMjkuMDQuMDAjRW50ZXJ0YWlubWVudCBzb2Z0d2FyZSM0My4xNi4yOS4wMC4wMAotdW5zcHNjNyM0My4xNi4yOS4wNS4wMCNGYW1pbHkgdGl0bGVzIzQzLjE2LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjI5LjA2LjAwI0VkdWNhdGlvbmFsIHNvZnR3YXJlIzQzLjE2LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE2LjMwLjAwLjAwI0luZHVzdHJ5IHNwZWNpZmljIHNvZnR3YXJlIzQzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjMwLjAxLjAwI1BvaW50IG9mIHNhbGUgKFBPUykgc29mdHdhcmUjNDMuMTYuMzAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMzAuMDIuMDAjRmxpZ2h0IGNvbnRyb2wgc29mdHdhcmUjNDMuMTYuMzAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMzAuMDMuMDAjQXZpYXRpb24gZ3JvdW5kIHN1cHBvcnQgc29mdHdhcmUjNDMuMTYuMzAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMzAuMDQuMDAjQXZpYXRpb24gdGVzdCBzb2Z0d2FyZSM0My4xNi4zMC4wMC4wMAotdW5zcHNjNyM0My4xNi4zMC4wNS4wMCNJbmR1c3RyaWFsIGNvbnRyb2wgc29mdHdhcmUjNDMuMTYuMzAuMDAuMDAKLXVuc3BzYzcjNDMuMTYuMzAuMDYuMDAjTGlicmFyeSBzb2Z0d2FyZSM0My4xNi4zMC4wMC4wMAotdW5zcHNjNyM0My4xNi4zMC4wNy4wMCNDb21wbGlhbmNlIHNvZnR3YXJlIzQzLjE2LjMwLjAwLjAwCi11bnNwc2M3IzQzLjE2LjMxLjAwLjAwI0RyaXZlcnMgYW5kIHN5c3RlbSBzb2Z0d2FyZSM0My4xNi4wMC4wMC4wMAotdW5zcHNjNyM0My4xNi4zMS4wMS4wMCNFdGhlcm5ldCBkcml2ZXJzIzQzLjE2LjMxLjAwLjAwCi11bnNwc2M3IzQzLjE2LjMxLjAyLjAwI0dyYXBoaWNzIGNhcmQgZHJpdmVycyM0My4xNi4zMS4wMC4wMAotdW5zcHNjNyM0My4xNy4wMC4wMC4wMCNIYXJkd2FyZSBhbmQgYWNjZXNzb3JpZXMjNDMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDAuMDAjVGVsZXBob255IGVxdWlwbWVudCM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4wMS4wMCNFeGNoYW5nZSBjb21wb25lbnRzIChDT0RFQykjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDIuMDAjRXhjaGFuZ2UgZGF0YSBpbnRlcmZhY2UgY2FyZHMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDMuMDAjRXhjaGFuZ2UgZGF0YWNvbSBtb2R1bGVzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjA0LjAwI1Bob25lIGV4Y2hhbmdlIGludGVyZmFjZXMgb3IgY29tcG9uZW50cyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4wNS4wMCNFeGNoYW5nZSB0cnVuayBpbnRlcmZhY2Ugb3IgY2FyZCBjb21wb25lbnRzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjA2LjAwI1ByZW1pc2UgYnJhbmNoIGV4Y2hhbmdlIChQQlgpIHN5c3RlbXMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDcuMDAjVGVsZXBob25lIHN3aXRjaGluZyBlcXVpcG1lbnQjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMDguMDAjU3dpdGNoYm9hcmQgZXF1aXBtZW50IzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjA5LjAwI1B1bmNoIGRvd24gYmxvY2tzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjEwLjAwI0FuYWxvZyBvciBkaWdpdGFsIHRlbGVwaG9uZXMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMTEuMDAjQW5hbG9nIG9yIGRpZ2l0YWwgY2VsbHVsYXIgdGVsZXBob25lcyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4xMi4wMCNNb2JpbGUgdGVsZXBob25lcyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4xMy4wMCNDb3JkbGVzcyB0ZWxlcGhvbmVzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjE0LjAwI1BheSB0ZWxlcGhvbmVzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjE1LjAwI0Fuc3dlcmluZyBtYWNoaW5lcyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4xNi4wMCNUZWxlcGhvbmUgaGVhZHNldHMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMTcuMDAjVm9pY2UgbWFpbCBzeXN0ZW1zIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjE4LjAwI0NhbGwgbWFuYWdlbWVudCBzeXN0ZW0jNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMTkuMDAjQ2VsbHVsYXIgdGVsZXBob25lIGFjY2Vzc29yaWVzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjIwLjAwI1RlbGVwaG9uZSByZXN0cyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yMS4wMCNUZWxlcGhvbmUgYWRhcHRlcnMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMjIuMDAjVGVsZXBob25lIGxpbmUgbXVsdGlwbGllcnMjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTUuMjMuMDAjVGVsZXBob25lIGxpbmUgbW9kdWxhciBjb3VwbGVycyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yNC4wMCNWaWRlb3Bob25lcyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yNS4wMCNEaWFsZXJzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjI2LjAwI1RlbGVwaG9uZSBhbXBsaWZpZXJzIzQzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE1LjI3LjAwI1RlbGVwaG9uZSBzdGFuZHMgb3IgaG9sZGVycyM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yOC4wMCNJbnRlZ3JhdGVkIHNlcnZpY2VzIGRpZ2l0YWwgbmV0d29yayBleGNoYW5nZXMgSVNETiM0My4xNy4xNS4wMC4wMAotdW5zcHNjNyM0My4xNy4xNS4yOS4wMCNUZWxlcGhvbmUgamFja3MjNDMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDAuMDAjQW50ZW5uYXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDEuMDAjVHJhbnNtaXR0ZXJzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjAyLjAwI1JlY2VpdmVycyM0My4xNy4xNi4wMC4wMAotdW5zcHNjNyM0My4xNy4xNi4wMy4wMCNUdW5lcnMjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDQuMDAjU2hvcnQgd2F2ZSBlcXVpcG1lbnQjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDUuMDAjQWlyY3JhZnQgYW50ZW5uYXMjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDYuMDAjQXV0b21vdGl2ZSBhbnRlbm5hcyM0My4xNy4xNi4wMC4wMAotdW5zcHNjNyM0My4xNy4xNi4wNy4wMCNCcm9hZGNhc3QgYW50ZW5uYXMjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMDguMDAjTWljcm93YXZlIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjA5LjAwI1RlbGV2aXNpb24gYW50ZW5uYXMjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTYuMTAuMDAjU2F0ZWxsaXRlIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjExLjAwI1JhZGlvIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjEyLjAwI1JhZGFyIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjEzLjAwI0NvbW11bmljYXRpb25zIGFudGVubmFzIzQzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE2LjE0LjAwI0NvbW11bmljYXRpb24gdG93ZXJzIG9yIHN1cHBvcnQjNDMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTcuMDAuMDAjVGVsZWNvbW11bmljYXRpb25zIGVxdWlwbWVudCM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4wMS4wMCNXaXJlbGVzcyBiYXNlIHN0YXRpb25zIzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE3LjAyLjAwI1RlbGVncmFwaCBlcXVpcG1lbnQjNDMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTcuMDMuMDAjVGVsZXR5cGUgZXF1aXBtZW50IzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE3LjA0LjAwI1RlbGVjb25mZXJlbmNpbmcgZXF1aXBtZW50IzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE3LjA1LjAwI1NhdGVsbGl0ZSBjb21tdW5pY2F0aW9uIGVxdWlwbWVudCM0My4xNy4xNy4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4wNi4wMCNQYWdlcnMgb3IgYmVlcGVycyM0My4xNy4xNy4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4wNy4wMCNJbnRlcmNvbW11bmljYXRpb25zIG9yIHBhZ2luZyBzeXN0ZW1zIzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE3LjA4LjAwI1B1YmxpYyBhZGRyZXNzIGVxdWlwbWVudCM0My4xNy4xNy4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4wOS4wMCNFbGVjdHJvbmljIHNvdW5kIGVxdWlwbWVudCM0My4xNy4xNy4wMC4wMAotdW5zcHNjNyM0My4xNy4xNy4xMC4wMCNEaWN0YXRpbmcgbWFjaGluZXMjNDMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTcuMTEuMDAjTGluZSBjb25kaXRpb25lcnMjNDMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTcuMTIuMDAjQ2hhbm5lbCBzZXJ2aWNlIHVuaXQgb3IgZGF0YSBzZXJ2aWNlIHVuaXQgKENTVSBvciBEU1UpIzQzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjAwLjAwI0NvbXB1dGVycyM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4wMS4wMCNOb3RlYm9vayBjb21wdXRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMDIuMDAjRG9ja2luZyBzdGF0aW9ucyM0My4xNy4xOC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4wMy4wMCNXb3Jrc3RhdGlvbnMgb3IgZGVza3RvcCBjb21wdXRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMDQuMDAjUGVyc29uYWwgZGlnaXRhbCBhc3Npc3RhbnRzIChQREFzKSBvciBwZW4gYmFzZWQgY29tcHV0ZXJzIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjA1LjAwI01haW5mcmFtZSBjb21wdXRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMDYuMDAjU2VydmVycyM0My4xNy4xOC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4wNy4wMCNQb3J0IHJlcGxpY2F0b3JzIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjA4LjAwI01pbmljb21wdXRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMDkuMDAjUG9pbnQgb2Ygc2FsZSAoUE9TKSB0ZXJtaW5hbHMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMTAuMDAjUHJvZ3JhbW1hYmxlIGxvZ2ljIGNvbnRyb2xsZXIgKFBMQykjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMTEuMDAjQ29uc29sZSAgbWFpbmZyYW1lIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjEyLjAwI0NvbnNvbGUgY29udHJvbGxlciAgbWFpbmZyYW1lIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjEzLjAwI0NoYW5uZWwgY29udmVydGVyIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjE0LjAwI0NoYW5uZWwgdG8gY2hhbm5lbCBpbnRlcmZhY2UgbWFpbmZyYW1lIzQzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjE4LjE1LjAwI0NvbnRyb2wgdW5pdCM0My4xNy4xOC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4xNi4wMCNDb3VwbGVyIGZhY2lsaXR5ICBtYWluZnJhbWUjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMTcuMDAjUG93ZXIgY29vbGVyIHVuaXQgIG1haW5mcmFtZSM0My4xNy4xOC4wMC4wMAotdW5zcHNjNyM0My4xNy4xOC4xOC4wMCNUaGluIGNsaWVudCBvciBkaXNrbGVzcyB3b3Jrc3RhdGlvbnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTguMTkuMDAjQ29uc29sZSBleHRlbmRlcnMjNDMuMTcuMTguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTkuMDAuMDAjTWVtb3J5IGFuZCBjZW50cmFsIHByb2Nlc3NpbmcgdW5pdHMgQ1BVcyBhbmQgYWNjZXNzb3JpZXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTkuMDEuMDAjQ2FjaGUgbWVtb3J5IG1vZHVsZXMjNDMuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMTkuMDIuMDAjQ2VudHJhbCBwcm9jZXNzaW5nIHVuaXQgKENQVSkgcHJvY2Vzc29ycyM0My4xNy4xOS4wMC4wMAotdW5zcHNjNyM0My4xNy4xOS4wMy4wMCNDZW50YWwgcHJvY2Vzc2luZyB1bml0IChDUFUpIG1vdGhlcmJvYXJkcyBvciBkYXVnaHRlcmJvYXJkcyM0My4xNy4xOS4wMC4wMAotdW5zcHNjNyM0My4xNy4xOS4wNC4wMCNNZW1vcnkgbW9kdWxlcyM0My4xNy4xOS4wMC4wMAotdW5zcHNjNyM0My4xNy4xOS4wNS4wMCNDZW50cmFsIHByb2Nlc3NpbmcgdW5pdCBjb29sZXJzIzQzLjE3LjE5LjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjAwLjAwI0NvbXB1dGVyIGNvbnRyb2wgYW5kIGludGVyZmFjZSBib2FyZHMgYW5kIGNhcmRzIGFuZCBjYWJsZXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMDEuMDAjUGFyYWxsZWwgdG8gc21hbGwgY29tcHV0ZXIgc3lzdGVtIGludGVyZmFjZSBjb252ZXJ0ZXJzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjAyLjAwI1BhcmFsbGVsIHRvIHNlcmlhbCBjb252ZXJ0ZXJzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjAzLjAwI1NlcmlhbCBpbmZyYXJlZCBwb3J0cyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4wNC4wMCNWaWRlbyBhY2NlbGVyYXRvciBjYXJkcyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4wNS4wMCNHcmFwaGljIGFjY2VsZXJhdG9yIGNhcmRzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjA2LjAwI05ldHdvcmsgaW50ZXJmYWNlIGNhcmRzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjA3LjAwI0F1ZGlvIGNhcmRzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjA4LjAwI0VtdWxhdGlvbiBhZGFwdGVycyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4wOS4wMCNTZXJpYWwgcG9ydCBjYXJkcyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4xMC4wMCNQYXJhbGxlbCBwb3J0IGNhcmRzIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjExLjAwI1NtYWxsIGNvbXB1dGVyIHN5c3RlbSBpbnRlcmZhY2UgKFNDU0kpIGNvbnRyb2xsZXIgY2FyZHMjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTIuMDAjRGVjb2RlciM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMC4xMy4wMCNQcm9ncmFtbWFibGUgbG9naWMgY29udHJvbGxlciBpbnB1dCBtb2R1bGUjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTQuMDAjUHJvZ3JhbW1hYmxlIGxvZ2ljIGNvbnRyb2xsZXIgY291bnRlciBtb2R1bGUjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTUuMDAjUHJvZ3JhbW1hYmxlIGxvZ2ljIGNvbnRyb2xsZXIgY29tbXVuaWNhdGlvbiBtb2R1bGUjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTYuMDAjV2lyZWxlc3MgbmV0d29yayBpbnRlcmZhY2UgY2FyZHMjNDMuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjAuMTcuMDAjVGltZWtlZXBpbmcgY2FyZCBtYWNoaW5lIGFuZCBjb21wdXRlciBpbnRlcmZhY2UgZGV2aWNlIzQzLjE3LjIwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIwLjE4LjAwI1Byb2Nlc3NvciBjYXJkcyM0My4xNy4yMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yMS4wMC4wMCNBdWRpbyBhbmQgdmlzdWFsIGFjY2Vzc29yaWVzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjAxLjAwI011c2ljYWwgaW5zdHJ1bWVudCBkaWdpdGFsIGludGVyZmFjZSAoTUlESSkgaW50ZXJmYWNlcyBvciBhZGFwdGVycyM0My4xNy4yMS4wMC4wMAotdW5zcHNjNyM0My4xNy4yMS4wMi4wMCNTaWduYWwgcHJvY2Vzc29yIHVwZ3JhZGVzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjAzLjAwI1ZpZGVvIGNhcHR1cmUgYm9hcmRzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjA0LjAwI1RlbGV2aXNpb24gY2FyZHMjNDMuMTcuMjEuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjEuMDUuMDAjUmFkaW8gY2FyZHMjNDMuMTcuMjEuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjEuMDYuMDAjTXVsdGltZWRpYSBraXRzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjA3LjAwI0NvbXB1dGVyIHNwZWFrZXJzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIxLjA4LjAwI0NvbXB1dGVyIGhlYWRzZXQjNDMuMTcuMjEuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjEuMDkuMDAjU2V0IHRvcCBib3hlcyM0My4xNy4yMS4wMC4wMAotdW5zcHNjNyM0My4xNy4yMS4xMC4wMCNWaWRlbyBjYXNzZXR0ZSBjb250YWluZXJzIzQzLjE3LjIxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjAwLjAwI0lucHV0IGRldmljZXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjIuMDEuMDAjQmFyIGNvZGUgcmVhZGVycyM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4wMi4wMCNHcmFwaGljcyB0YWJsZXRzIG9yIGRpZ2l0aXplcnMjNDMuMTcuMjIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjIuMDMuMDAjSm95c3RpY2tzIG9yIGdhbWUgcGFkcyM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4wNC4wMCNLZXlib2FyZHMgb3Iga2V5cGFkcyM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4wNS4wMCNDb21wdXRlciBtb3VzZSM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4wNi4wMCNSZW1vdGUgdXNlciBpbnRlcmZhY2VzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjA3LjAwI1NjYW5uZXJzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjA4LjAwI1RvdWNoIHBhZHMjNDMuMTcuMjIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjIuMDkuMDAjVG91Y2ggc2NyZWVucyM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4xMC4wMCNUcmFja2JhbGxzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjExLjAwI1ZvaWNlIG1pY3JvcGhvbmVzIGZvciBjb21wdXRlcnMjNDMuMTcuMjIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjIuMTIuMDAjUHVuY2ggY2FyZCByZWFkZXJzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjEzLjAwI0xpZ2h0IHBlbiM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4xNC4wMCNTdHlsdXMgcGVuIGZvciBtb2JpbGUgY29tcHV0ZXJzIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjE1LjAwI01vdXNlIHBhZCM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4xNi4wMCNQcm9ncmFtbWFibGUgbG9naWMgY29udHJvbGxlciBoYW5kaGVsZCBwcm9ncmFtbWVyIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjE3LjAwI0VHUiAgRWxlY3Ryb25pYyBnYXRlIHJlYWRlciM0My4xNy4yMi4wMC4wMAotdW5zcHNjNyM0My4xNy4yMi4xOC4wMCNEdW1iIHRlcm1pbmFsIzQzLjE3LjIyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIyLjE5LjAwI1B1bmNoZWQgY2FyZHMjNDMuMTcuMjIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDAuMDAjRWxlY3Ryb25pYyBkYXRhIHN0b3JhZ2UgZXF1aXBtZW50IzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIzLjAxLjAwI1JlYWQgb25seSBjb21wYWN0IGRpc2MgKENEKSBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDIuMDAjQ29tcGFjdCBkaXNjIChDRCkganVrZWJveGVzIG9yIGNoYW5nZXJzIzQzLjE3LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIzLjAzLjAwI0NvbWJpbmF0aW9uIGZsb3BweSBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDQuMDAjRGlzayBhcnJheXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDUuMDAjRmxvcHB5IGRyaXZlcyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4wNi4wMCNIaWdoIGNhcGFjaXR5IHJlbW92YWJsZSBtZWRpYSBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDcuMDAjTXVsdGkgZHJpdmUgaGFyZCBkcml2ZSB0b3dlcnMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDguMDAjUmVjb3JkYWJsZSBjb21wYWN0IGRpc2MgKENEKSBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMDkuMDAjUmVlbCB0byByZWVsIHRhcGUgZHJpdmVzIzQzLjE3LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIzLjEwLjAwI1NpbmdsZSBvcHRpY2FsIGRyaXZlcyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4xMS4wMCNUYXBlIGFycmF5cyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4xMi4wMCNUYXBlIGRyaXZlIGF1dG8gbG9hZGVycyBvciBsaWJyYXJpZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMTMuMDAjSGFyZCBkcml2ZXMjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMTQuMDAjQ29tcHV0ZXIgRFZEIGRyaXZlcyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4xNS4wMCNBcnJheSBjb250cm9sbGVyIzQzLjE3LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE3LjIzLjE2LjAwI01QMyBwbGF5ZXIjNDMuMTcuMjMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjMuMTcuMDAjTWVtb3J5IGNhcmQgcmVhZGVycyM0My4xNy4yMy4wMC4wMAotdW5zcHNjNyM0My4xNy4yMy4xOC4wMCNQZXJpcGhlcmFsIGNvbXBvbmVudCBtaWNyb2NoYW5uZWwgaW50ZXJjb25uZWN0IGFyY2hpdGVjdHVyZSAgcmVhZGVyIGFuZCB3cml0ZXIgZHJpdmVzIzQzLjE3LjIzLjAwLjAwCi11bnNwc2M3IzQzLjE3LjI0LjAwLjAwI01vbml0b3JzIGFuZCBkaXNwbGF5cyM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yNC4wMS4wMCNNb25pdG9ycyM0My4xNy4yNC4wMC4wMAotdW5zcHNjNyM0My4xNy4yNC4wMi4wMCNGbGF0IHBhbmVsIGRpc3BsYXlzIzQzLjE3LjI0LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI0LjAzLjAwI1RvdWNoIHNjcmVlbiBtb25pdG9ycyM0My4xNy4yNC4wMC4wMAotdW5zcHNjNyM0My4xNy4yNC4wNC4wMCNNb25pdG9yIGFjY2Vzc29yaWVzIzQzLjE3LjI0LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjAwLjAwI1ByaW50ZXJzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjAxLjAwI1Bsb3R0ZXJzIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjAyLjAwI0JhbmQgcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMDMuMDAjRG90IG1hdHJpeCBwcmludGVycyM0My4xNy4yNS4wMC4wMAotdW5zcHNjNyM0My4xNy4yNS4wNC4wMCNMYWJlbCBwcmludGVycyM0My4xNy4yNS4wMC4wMAotdW5zcHNjNyM0My4xNy4yNS4wNS4wMCNMYXJnZSBmb3JtYXQgcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMDYuMDAjTGluZSBtYXRyaXggcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMDcuMDAjUGFnZSBwcmludGVycyM0My4xNy4yNS4wMC4wMAotdW5zcHNjNyM0My4xNy4yNS4wOC4wMCNUaGVybWFsIHRhcGUgcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMDkuMDAjSW5ramV0IHByaW50ZXJzIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjEwLjAwI0xhc2VyIHByaW50ZXJzIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjExLjAwI0J1YmJsZSBqZXQgcHJpbnRlcnMjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjUuMTIuMDAjQmFnIHRhZyBwcmludGVyIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjEzLjAwI1ByaW50ZXIgc2VwZXJhdG9yIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjE0LjAwI011bHRpIGZ1bmN0aW9uIHByaW50ZXJzIzQzLjE3LjI1LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI1LjE1LjAwI0FUQiBhaXJsaW5lIHRpY2tldCBvciBib2FyZGluZyBwYXNzIHByaW50ZXIjNDMuMTcuMjUuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjYuMDAuMDAjRW5jbG9zdXJlcyBhbmQgZnJhbWVzIGFuZCBiYWNrcGxhbmVzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjAxLjAwI0NoYXNzaXMjNDMuMTcuMjYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjYuMDIuMDAjTmV0d29yayBjaGFzc2lzIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjAzLjAwI0RyaXZlIGNhYmluZXRzIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjA0LjAwI0V4cGFuc2lvbiBzbG90IGV4cGFuZGVyIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjA1LjAwI1JhY2tzIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI2LjA2LjAwI1Byb2dyYW1tYWJsZSBsb2dpYyBjb250cm9sbGVyIHJhY2sgb3IgYmFzZSM0My4xNy4yNi4wMC4wMAotdW5zcHNjNyM0My4xNy4yNi4wNy4wMCNSZW1vdmFibGUgZHJpdmUgZnJhbWVzIzQzLjE3LjI2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjAwLjAwI05ldHdvcmsgaGFyZHdhcmUgYW5kIGNvbXBvbmVudHMgYW5kIGFjY2Vzc29yaWVzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjAxLjAwI0h1YnMgb3IgY29uY2VudHJhdG9ycyM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wMi4wMCNSb3V0ZXJzIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjAzLjAwI1JlcGVhdGVycyM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wNC4wMCNOZXR3b3JrIGJyaWRnZXMjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMDUuMDAjU3dpdGNoZXMjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMDYuMDAjTWVkaWEgZmlsdGVycyM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wNy4wMCNXaWRlIGFyZWEgbmV0d29yayAoV0FOKSBjYXJkcyM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wOC4wMCNNdWx0aXN0YXRpb24gYWNjZXNzIHVuaXRzIChNQVVzKSM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4wOS4wMCNEYXRhIHNlcnZpY2UgdW5pdHMgKERTVXMpIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjEwLjAwI05ldHdvcmsgYWRhcHRlcnMjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMTEuMDAjTG9hZCBiYWxhbmNlciM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xMi4wMCNQcmludGVyICBhY2N1bXVsYXRvciM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xMy4wMCNFbnRlcnByaXNlIFN5c3RlbSBDb25uZWN0aXZpdHkgRVNDT04gRGlyZWN0b3IjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMTQuMDAjTmV0d29yayBtYW5hZ2VtZW50IHN5c3RlbSM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xNS4wMCNGaXJld2FsbCBmaXJld2FsbCBhcHBsaWFuY2UjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMTYuMDAjQ2FibGUgbmV0d29yayB0ZXN0ZXJzIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjE3LjAwI0RhdGEgc3luY2hyb25pemF0aW9uIGRldmljZSM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xOC4wMCNEaWdpdGFsIGNyb3NzIGNvbm5lY3RzIGVxdWlwbWVudCM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4xOS4wMCNPcHRpY2FsIGNyb3NzIGNvbm5lY3RzIGVxdWlwbWVudCM0My4xNy4yNy4wMC4wMAotdW5zcHNjNyM0My4xNy4yNy4yMC4wMCNTY3JlZW4gYW1wbGlmaWVyIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjIxLjAwI1RpbWUgZGl2aXNpb25hbCBtdWx0aXBsZXgjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMjIuMDAjQ29ubmVjdGlvbiBwYW5lbHMjNDMuMTcuMjcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjcuMjMuMDAjVm9pY2UgZWNobyBjYW5jZWxsZXJzIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI3LjI0LjAwI1BhdGNoIHBhbmVsIzQzLjE3LjI3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI4LjAwLjAwI01vZGVtcyBhbmQgcmVsYXRlZCBoYXJkd2FyZSM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4yOC4wMS4wMCNNb2RlbXMgb3IgbmV0d29yayBjb21ibyBjYXJkcyM0My4xNy4yOC4wMC4wMAotdW5zcHNjNyM0My4xNy4yOC4wMi4wMCNNb2RlbXMjNDMuMTcuMjguMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjguMDMuMDAjSW50ZWdyYXRlZCBzZXJ2aWNlcyBkaWdpdGFsIG5ldHdvcmsgKElTRE4pIGFkYXB0ZXJzIzQzLjE3LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI4LjA0LjAwI01vZGVtIGJhbmtzIzQzLjE3LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI4LjA1LjAwI01vZGVtIHRlbGVhZGFwdG9ycyM0My4xNy4yOC4wMC4wMAotdW5zcHNjNyM0My4xNy4yOC4wNi4wMCNNdWx0aXBsZXhvciBNVVhzIzQzLjE3LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI4LjA3LjAwI0FkZCBkcm9wIG11bHRpcGxleGVyIzQzLjE3LjI4LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI5LjAwLjAwI05ldHdvcmsgc3dpdGNoZXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjkuMDEuMDAjTG9jYWwgYXJlYSBuZXR3b3JrIChMQU4pIHN3aXRjaGVzIzQzLjE3LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI5LjAyLjAwI0FzeW5jaHJvbm91cyB0cmFuc2ZlciBtb2RlIChBVE0pIHN3aXRjaGVzIzQzLjE3LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE3LjI5LjAzLjAwI0ZpYmVyIGRpc3RyaWJ1dGVkIGRhdGEgaW50ZXJmYWNlIChGRERJKSAgc3dpdGNoZXMjNDMuMTcuMjkuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjkuMDQuMDAjV2lkZSBhcmVhIG5ldHdvcmsgKFdBTikgc3dpdGNoZXMjNDMuMTcuMjkuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMjkuMDUuMDAjSW50ZWxsaWdlbnQgbmV0d29yayBzd2l0Y2hpbmcgc3lzdGVtIzQzLjE3LjI5LjAwLjAwCi11bnNwc2M3IzQzLjE3LjMwLjAwLjAwI05ldHdvcmsgcmVwZWF0ZXJzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMwLjAxLjAwI0F0dGFjaGVkIHJlc291cmNlIGNvbXB1dGVyIG5ldHdvcmsgKEFSQ25ldCkgcmVwZWF0ZXJzIzQzLjE3LjMwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMwLjAyLjAwI0V0aGVybmV0IHJlcGVhdGVycyM0My4xNy4zMC4wMC4wMAotdW5zcHNjNyM0My4xNy4zMC4wMy4wMCNGaWJlciBkaXN0cmlidXRlZCBkYXRhIGludGVyZmFjZSAoRkRESSkgcmVwZWF0ZXJzIzQzLjE3LjMwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMwLjA0LjAwI1Rva2VuIHJpbmcgcmVwZWF0ZXJzIzQzLjE3LjMwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMxLjAwLjAwI1JhZGlvIHN5c3RlbXMjNDMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzEuMDEuMDAjVHJhbnNtaXR0ZXJzIzQzLjE3LjMxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMxLjAyLjAwI1JlY2VpdmVycyM0My4xNy4zMS4wMC4wMAotdW5zcHNjNyM0My4xNy4zMS4wMy4wMCNUcmFuc2NlaXZlcnMjNDMuMTcuMzEuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzEuMDQuMDAjVHVuZXJzIzQzLjE3LjMxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMxLjA1LjAwI1Nob3J0IHdhdmUgZXF1aXBtZW50IzQzLjE3LjMxLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMyLjAwLjAwI0F1dG9tYXRlZCBkYXRhIGNvbGxlY3Rpb24gZXF1aXBtZW50IzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMyLjAxLjAwI0JhciBjb2RlIGVxdWlwbWVudCM0My4xNy4zMi4wMC4wMAotdW5zcHNjNyM0My4xNy4zMi4wMi4wMCNSYWRpbyBmcmVxdWVuY3kgaWRlbnRpZmljYXRpb24gKElEKSBlcXVpcG1lbnQjNDMuMTcuMzIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzIuMDMuMDAjUmFkaW8gZnJlcXVlbmN5IGRhdGEgY29tbXVuaWNhdGlvbiBlcXVpcG1lbnQjNDMuMTcuMzIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzIuMDQuMDAjQ2FtZXJhIGJhc2VkIHZpc2lvbiBzeXN0ZW1zIGZvciBhdXRvbWF0ZWQgZGF0YSBjb2xsZWN0aW9uIzQzLjE3LjMyLjAwLjAwCi11bnNwc2M3IzQzLjE3LjMyLjA1LjAwI0N1cnJlbmN5IHJlY29nbml0aW9uIGVxdWlwbWVudCM0My4xNy4zMi4wMC4wMAotdW5zcHNjNyM0My4xNy4zMi4wNi4wMCNNYWduZXRpYyBjYXJkIHJlYWRlcnMjNDMuMTcuMzIuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDAuMDAjQ29tcHV0ZXIgZGF0YSBzd2l0Y2hlcyM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4zMy4wMS4wMCNTZXJpYWwgZGF0YSBzd2l0Y2hlcyM0My4xNy4zMy4wMC4wMAotdW5zcHNjNyM0My4xNy4zMy4wMi4wMCNLZXlib2FyZCB2aWRlbyBtb3VzZSAoS1ZNKSBzd2l0Y2ggYm94ZXMjNDMuMTcuMzMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDMuMDAjTWFudWFsIHByaW50ZXIgc3dpdGNoZXMjNDMuMTcuMzMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDQuMDAjQXV0b21hdGljIHByaW50ZXIgc3dpdGNoZXMjNDMuMTcuMzMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDUuMDAjQ29uc29sZSBzd2l0Y2gjNDMuMTcuMzMuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzMuMDYuMDAjUGFyYWxsZWwgZGF0YSBzd2l0Y2hlcyM0My4xNy4zMy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNC4wMC4wMCNDb21wdXRlciBhY2Nlc3NvcnkgY292ZXJzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjM0LjAxLjAwI0tleSBib2FyZCBza2lucyM0My4xNy4zNC4wMC4wMAotdW5zcHNjNyM0My4xNy4zNC4wMi4wMCNOb3RlYm9vayBvciBwYWxtdG9wIHNraW5zIzQzLjE3LjM0LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM1LjAwLjAwI0tleSBib2FyZCBza2lucyM0My4xNy4wMC4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4wMC4wMCNDb21wdXRlciBjYWJsZXMgYW5kIGFjY2Vzc29yaWVzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjM2LjAxLjAwI01vdXNlIGFkYXB0ZXIjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMDIuMDAjS2V5Ym9hcmQgZXh0ZW5zaW9uIGNhYmxlcyM0My4xNy4zNi4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4wMy4wMCNNb2RlbSBjYWJsZXMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMDQuMDAjQ29yZCBjb3ZlcnMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMDUuMDAjUGFyYWxsZWwgY2FibGVzIzQzLjE3LjM2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM2LjA2LjAwI1NlcmlhbCBjYWJsZXMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMDcuMDAjVW5pdmVyc2FsIHNlcmlhbCBidXMgVVNCIGNhYmxlcyM0My4xNy4zNi4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4wOC4wMCNOZXR3b3JrIHBhdGNoIGNhYmxlcyM0My4xNy4zNi4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4wOS4wMCNDb21wdXRlciBhdWRpbyBjYWJsZXMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzYuMTAuMDAjQ29tcHV0ZXIgdmlkZW8gY2FibGVzIzQzLjE3LjM2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM2LjExLjAwI0ludGVyIGRldmljZSBsaW5rIGNhYmxlcyM0My4xNy4zNi4wMC4wMAotdW5zcHNjNyM0My4xNy4zNi4xMi4wMCNDb21wdXRlciBjYWJsZSBraXRzIzQzLjE3LjM2LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM2LjEzLjAwI0NhYmxlIGphY2tzIG9yIGNvbm5lY3RvcnMjNDMuMTcuMzYuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzcuMDAuMDAjU3RvcmFnZSBkcml2ZSBjb21wb25lbnRzIzQzLjE3LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE3LjM3LjAxLjAwI0hlYWQgYXNzZW1ibGllcyBvciBwYXJ0cyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wMi4wMCNMZWFkIGFzc2VtYmxpZXMjNDMuMTcuMzcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzcuMDMuMDAjSGVhZCBzdGFjayBhc3NlbWJsaWVzIzQzLjE3LjM3LjAwLjAwCi11bnNwc2M3IzQzLjE3LjM3LjA0LjAwI0NvbWIgYXNzZW1ibGllcyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wNS4wMCNDcmFzaCBzdG9wcyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wNi4wMCNQbGF0dGVycyBvciBkaXNrcyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wNy4wMCNIZWFkIG1vdW50aW5nIGFybXMjNDMuMTcuMzcuMDAuMDAKLXVuc3BzYzcjNDMuMTcuMzcuMDguMDAjUmVhZCB3cml0ZSBoZWFkcyM0My4xNy4zNy4wMC4wMAotdW5zcHNjNyM0My4xNy4zNy4wOS4wMCNNb3RvciBkcml2ZXMjNDMuMTcuMzcuMDAuMDAKLXVuc3BzYzcjNDMuMTguMDAuMDAuMDAjQ29tbXVuaWNhdGlvbnMgYW5kIGNvbXB1dGVyIHN1cHBsaWVzIzQzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzQzLjE4LjE1LjAwLjAwI0F1ZGlvIHJlY29yZGluZyBtZWRpYSM0My4xOC4wMC4wMC4wMAotdW5zcHNjNyM0My4xOC4xNS4wMS4wMCNCbGFuayBhdWRpbyB0YXBlcyM0My4xOC4xNS4wMC4wMAotdW5zcHNjNyM0My4xOC4xNi4wMC4wMCNEYXRhIHN0b3JhZ2UgbWVkaWEjNDMuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDMuMTguMTYuMDEuMDAjRmxvcHB5IGRpc2tldHRlcyM0My4xOC4xNi4wMC4wMAotdW5zcHNjNyM0My4xOC4xNi4wMi4wMCNSZWNvcmRhYmxlIGNvbXBhY3QgZGlzY3MgKENEcykjNDMuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTguMTYuMDMuMDAjQmxhbmsgZGF0YSB0YXBlcyM0My4xOC4xNi4wMC4wMAotdW5zcHNjNyM0My4xOC4xNi4wNC4wMCNIaWdoIGRlbnNpdHkgcmVtb3ZhYmxlIG1lZGlhIGJsYW5rIGRpc2tzIzQzLjE4LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE2LjA1LjAwI0JsYW5rIGRpZ2l0YWwgdmlkZW8gZGlzY3MgRFZEIzQzLjE4LjE2LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE2LjA2LjAwI0RhdGEgc3RvcmFnZSBjYXJkcyM0My4xOC4xNi4wMC4wMAotdW5zcHNjNyM0My4xOC4xNi4wNy4wMCNNYWduZXRvIG9wdGljYWwgZGlza3MjNDMuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDMuMTguMTcuMDAuMDAjTXVsdGltZWRpYSBzdG9yYWdlIzQzLjE4LjAwLjAwLjAwCi11bnNwc2M3IzQzLjE4LjE3LjAxLjAwI011bHRpbWVkaWEgdG93ZXJzIzQzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE3LjAyLjAwI011bHRpbWVkaWEgZHJhd2VycyM0My4xOC4xNy4wMC4wMAotdW5zcHNjNyM0My4xOC4xNy4wMy4wMCNDb21wYWN0IGRpc2MgKENEKSBjYXNlcyM0My4xOC4xNy4wMC4wMAotdW5zcHNjNyM0My4xOC4xNy4wNC4wMCNEaXNrZXR0ZSBob2xkZXJzIzQzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE3LjA1LjAwI0Rpc2tldHRlIHN0b3JhZ2UjNDMuMTguMTcuMDAuMDAKLXVuc3BzYzcjNDMuMTguMTcuMDYuMDAjTXVsdGltZWRpYSB0cmF5cyBvciBvcmdhbml6ZXJzIzQzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE3LjA3LjAwI1ppcCBtYWlsZXJzIzQzLjE4LjE3LjAwLjAwCi11bnNwc2M3IzQzLjE4LjE4LjAwLjAwI01vbml0b3Igc3RhbmRzIG9yIHJpc2VycyM0My4xOC4wMC4wMC4wMAotdW5zcHNjNyM0My4xOC4xOS4wMC4wMCNNb25pdG9yIGFybXMjNDMuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDQuMDAuMDAuMDAuMDAjT2ZmaWNlIEVxdWlwbWVudCBhbmQgQWNjZXNzb3JpZXMgYW5kIFN1cHBsaWVzIzQ0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjAwLjAwLjAwI09mZmljZSBtYWNoaW5lcyBhbmQgdGhlaXIgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzQ0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE1LjAwLjAwI0R1cGxpY2F0aW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE1LjAxLjAwI1Bob3RvY29waWVycyM0NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNS4wMi4wMCNGYWNzaW1pbGUgbWFjaGluZXMjNDQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTUuMDMuMDAjTXVsdGlmdW5jdGlvbiBtYWNoaW5lcyM0NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNi4wMC4wMCNQYXBlciBwcm9jZXNzaW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE2LjAxLjAwI1BhcGVyIGN1dHRpbmcgbWFjaGluZXMjNDQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTYuMDIuMDAjUGFwZXIgcHVuY2hpbmcgb3IgYmluZGluZyBtYWNoaW5lcyM0NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNi4wMy4wMCNQYXBlciBzaHJlZGRpbmcgbWFjaGluZXMgb3IgYWNjZXNzb3JpZXMjNDQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTcuMDAuMDAjUHJpbnRlciBhbmQgcGhvdG9jb3BpZXIgYW5kIGZhY3NpbWlsZSBhY2Nlc3NvcmllcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNy4wMS4wMCNDb2xvciBvcHRpb25zIG9yIHVwZ3JhZGVzIzQ0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE3LjAyLjAwI0R1cGxleGVyIHRyYXlzIzQ0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE3LjAzLjAwI0R1cGxleGVyIHVuaXRzIzQ0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE3LjA0LjAwI0ZhY3NpbWlsZSBoYW5kc2V0cyM0NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNy4wNS4wMCNQcmludGVyIHRyYXlzIG9yIGZlZWRlcnMjNDQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTcuMDYuMDAjUGhvdG9jb25kdWN0b3Igb3IgaW1hZ2luZyB1bml0cyM0NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMC4xNy4wNy4wMCNTdGFwbGVyIHVuaXRzIzQ0LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE4LjAwLjAwI0NhbGN1bGF0aW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE4LjAxLjAwI0NhbGN1bGF0b3JzIzQ0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE4LjAyLjAwI0FkZGluZyBtYWNoaW5lcyM0NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMC4xOC4wMy4wMCNBY2NvdW50aW5nIG1hY2hpbmVzIzQ0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE4LjA0LjAwI0Nhc2ggcmVnaXN0ZXJzIzQ0LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjE5LjAwLjAwI0NoZWNrIGVuZG9yc2luZyBhbmQgd3JpdGluZyBtYWNoaW5lcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4xOS4wMS4wMCNDaGVjayBlbmRvcnNpbmcgbWFjaGluZXMjNDQuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMTkuMDIuMDAjQ2hlY2sgd3JpdGluZyBtYWNoaW5lcyM0NC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMC4wMC4wMCNMYW1pbmF0aW5nIHN1cHBsaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIwLjAxLjAwI0xhbWluYXRpb24gZmlsbSM0NC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMC4wMi4wMCNMYW1pbmF0b3IgcG91Y2hlcyM0NC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMS4wMC4wMCNNYWlsIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIxLjAxLjAwI0ZyYW5raW5nIG9yIHBvc3RhZ2UgbWFjaGluZXMjNDQuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjEuMDIuMDAjTWFpbCBvcGVuaW5nIG1hY2hpbmVzIzQ0LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIxLjAzLjAwI01haWwgc2VhbGluZyBtYWNoaW5lcyM0NC4xMC4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMS4wNC4wMCNTdGFtcCBjYW5jZWxpbmcgbWFjaGluZXMjNDQuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjEuMDUuMDAjQWRkcmVzc2luZyBtYWNoaW5lcyM0NC4xMC4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMS4wNi4wMCNMZXR0ZXIgZm9sZGVycyM0NC4xMC4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMi4wMC4wMCNTY2FubmVyIGFjY2Vzc29yaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIyLjAxLjAwI0VuZG9yc2VycyM0NC4xMC4yMi4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMy4wMC4wMCNQYWNraW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIzLjAxLjAwI0J1bmRsaW5nIG1hY2hpbmVzIzQ0LjEwLjIzLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIzLjAyLjAwI1BhcmNlbCB3cmFwcGluZyBtYWNoaW5lcyM0NC4xMC4yMy4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMy4wMy4wMCNTZWFsIHByZXNzZXMjNDQuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjMuMDQuMDAjU2VhbGluZyBtYWNoaW5lcyM0NC4xMC4yMy4wMC4wMAotdW5zcHNjNyM0NC4xMC4yMy4wNS4wMCNTdHJhcHBpbmcgdGVuc2lvbmVycyBvciBzZWFsZXJzIzQ0LjEwLjIzLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjIzLjA2LjAwI1R5aW5nIG1hY2hpbmVzIzQ0LjEwLjIzLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjAwLjAwI0xhYmVsaW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjAxLjAwI1RhcGUgbGFiZWwgbWFrZXJzIzQ0LjEwLjI0LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjAyLjAwI0RhdGluZyBvciBudW1iZXJpbmcgbWFjaGluZXMjNDQuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjQuMDMuMDAjSWRlbnRpZmljYXRpb24gKElEKSBwcmVzcyBtYWNoaW5lcyM0NC4xMC4yNC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNC4wNC4wMCNMYWJlbCBhcHBseWluZyBtYWNoaW5lcyM0NC4xMC4yNC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNC4wNS4wMCNMYWJlbCBtYWtpbmcgbWFjaGluZXMjNDQuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjQuMDYuMDAjTGV0dGVyaW5nIGVxdWlwbWVudCM0NC4xMC4yNC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNC4wNy4wMCNUYXBlIGVtYm9zc2VyIzQ0LjEwLjI0LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjA4LjAwI0F1dG9tYXRpYyBsYWJlbGluZyBzeXN0ZW1zIzQ0LjEwLjI0LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI0LjA5LjAwI1NlbWkgYXV0b21hdGljIGxhYmVsaW5nIHN5c3RlbXMjNDQuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjQuMTEuMDAjTGFiZWwgZGlzcGVuc2VycyM0NC4xMC4yNC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNS4wMC4wMCNTb3J0aW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI1LjAxLjAwI01vbmV5IGNvdW50aW5nIG1hY2hpbmVzIzQ0LjEwLjI1LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI1LjAyLjAwI1NvcnRlcnMjNDQuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjYuMDAuMDAjVHlwaW5nIG1hY2hpbmVzIGFuZCBhY2Nlc3NvcmllcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNi4wMi4wMCNUeXBld3JpdGVycyM0NC4xMC4yNi4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNi4wMy4wMCNQcmludHdoZWVscyM0NC4xMC4yNi4wMC4wMAotdW5zcHNjNyM0NC4xMC4yNi4wNC4wMCNTdGVub3R5cGUgbWFjaGluZXMjNDQuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjYuMDUuMDAjRGljdGF0aW9uIG1hY2hpbmVzIzQ0LjEwLjI2LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI2LjA2LjAwI1R5cGVyd3JpdGVyIHJpYmJvbnMjNDQuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjYuMDcuMDAjV29yZCBwcm9jZXNzb3JzIzQ0LjEwLjI2LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI2LjA4LjAwI1R5cGV3cml0ZXIgcHJpbnRpbmcgZWxlbWVudHMjNDQuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjguMDAuMDAjQmluZGluZyBhbmQgbGFtaW5hdGlvbiBtYWNoaW5lcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOC4wMS4wMCNMYW1pbmF0b3JzIzQ0LjEwLjI4LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjAwLjAwI09mZmljZSBtYWNoaW5lIGFjY2Vzc29yaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjAxLjAwI1RyYXZlbCBraXRzIGZvciBvZmZpY2UgbWFjaGluZXMjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMDIuMDAjU3RvcmFnZSBhY2Nlc3NvcmllcyBmb3Igb2ZmaWNlIG1hY2hpbmVzIzQ0LjEwLjI5LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjAzLjAwI1RhcGUgY2xlYW5lcnMjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMDQuMDAjQWlyIGNvbXByZXNzZWQgc3ByYXkjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMDUuMDAjU21hbGwgcGFwZXIgYmFncyBvZiB3ZXQgYWJzb3JiaW5nIHNhbHRzIzQ0LjEwLjI5LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjA2LjAwI0NvbXB1dGVyIG9yIG9mZmljZSBlcXVpcG1lbnQgY2xlYW5pbmcga2l0IzQ0LjEwLjI5LjAwLjAwCi11bnNwc2M3IzQ0LjEwLjI5LjA3LjAwI0VxdWlwbWVudCBkdXN0IGNvdmVycyM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOS4wOC4wMCNDb21wYWN0IGRpc2MgY2xlYW5lcnMgb3Igc2NyYXRjaCByZW1vdmVycyM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOS4wOS4wMCNDb21wYWN0IGRpc2MgZHJpdmUgY2xlYW5lciM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOS4xMC4wMCNMYW1pbmF0b3IgdHJheXMjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMTEuMDAjQ2xlYW5pbmcgd2lwZXMgZm9yIG9mZmljZSBtYWNoaW5lcyM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4yOS4xMi4wMCNDbGVhbmluZyBzb2x1dGlvbnMgZm9yIG9mZmljZSBlcXVpcG1lbnQjNDQuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMjkuMTMuMDAjQ29tcGFjdCBkaXNjIGRlc3Ryb3llciM0NC4xMC4yOS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMC4wMC4wMCNGdXNlcnMgYW5kIGFjY2Vzc29yaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMwLjAxLjAwI0Z1c2VyIGNsZWFuaW5nIHBhZHMjNDQuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzAuMDIuMDAjRnVzZXIgb2lsIzQ0LjEwLjMwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMwLjAzLjAwI0Z1c2VyIHdpcGVyIzQ0LjEwLjMwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMwLjA0LjAwI0Z1c2VycyM0NC4xMC4zMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4wMC4wMCNQcmludGVyIGFuZCBmYWNzaW1pbGUgYW5kIHBob3RvY29waWVyIHN1cHBsaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMxLjAxLjAwI1ByaW50ZXIgb3IgZmFjc2ltaWxlIG9yIHBob3RvY29waWVyIGJlbHRzIzQ0LjEwLjMxLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMxLjAyLjAwI1ByaW50ZXIgb3IgZmFjc2ltaWxlIG9yIHBob3RvY29waWVyIHJpYmJvbnMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMDMuMDAjVG9uZXIjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMDQuMDAjVHJhbnNmZXIgcm9sbHMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMDUuMDAjSW5rIGNhcnRyaWRnZXMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMDYuMDAjSW5rIHN0aWNrcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4wNy4wMCNQcmludGVyIG9yIGZhY3NpbWlsZSBvciBwaG90b2NvcGllciBjbGVhbmluZyBzdXBwbGllcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4wOC4wMCNEZXZlbG9wZXIgZm9yIHByaW50ZXJzIG9yIHBob3RvY29waWVycyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4wOS4wMCNQcmludGVyIG9yIGZhY3NpbWlsZSBvciBwaG90b2NvcGllciBkcnVtcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4xMC4wMCNQcmludCBoZWFkcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4xMS4wMCNJbmsgcm9sbHMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMTIuMDAjUHJpbnRlciByaWJib24jNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMTMuMDAjUGhhc2VycyBvciBpbmtqZXQga2l0cyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4xNC4wMCNMYXNlcmpldCBjb2F0aW5nIGtpdHMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMTUuMDAjSW1hZ2luZyBmaWxtcyM0NC4xMC4zMS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMS4xNi4wMCNLaXQgZm9yIHByaW50ZXIjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzEuMTcuMDAjRmFjc2ltaWxlIHJpYmJvbnMjNDQuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzIuMDAuMDAjT2ZmaWNlIHRpbWUgcmVjb3JkaW5nIG1hY2hpbmVzIGFuZCBhY2Nlc3NvcmllcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMi4wMS4wMCNUaW1lIGNhcmQgbWFjaGluZXMjNDQuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzIuMDIuMDAjVGltZSBzdGFtcGluZyBtYWNoaW5lcyM0NC4xMC4zMi4wMC4wMAotdW5zcHNjNyM0NC4xMC4zMi4wMy4wMCNUaW1lIGNhcmQgbWFjaGluZSByZXBsYWNlbWVudCByaWJib24jNDQuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNDQuMTAuMzIuMDQuMDAjVGltZSBjYXJkIHJhY2tzIzQ0LjEwLjMyLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMyLjA1LjAwI1RpbWUgY2FyZHMgb3Igc2hlZXRzIzQ0LjEwLjMyLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjMzLjAwLjAwI1RpbWUgY2FyZCBtYWNoaW5lcyM0NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMC4zNC4wMC4wMCNUaW1lIHN0YW1waW5nIG1hY2hpbmVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjM1LjAwLjAwI0JpbmRpbmcgbWFjaGluZSBzdXBsaWVzIzQ0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEwLjM1LjAxLjAwI1dpcmUgYmluZGluZyBlbGVtZW50cyBvciBjb21icyM0NC4xMC4zNS4wMC4wMAotdW5zcHNjNyM0NC4xMC4zNS4wMi4wMCNCaW5kaW5nIGNvdmVycyM0NC4xMC4zNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4wMC4wMC4wMCNPZmZpY2UgYW5kIGRlc2sgYWNjZXNzb3JpZXMjNDQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDAuMDAjT3JnYW5pemVycyBhbmQgYWNjZXNzb3JpZXMjNDQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDEuMDAjTWVzc2FnZSBob2xkZXJzIG9yIGRpc3BlbnNlcnMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDIuMDAjRGVzayBkcmF3ZXIgb3JnYW5pemVycyM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4wMy4wMCNEZXNrdG9wIHRyYXlzIG9yIG9yZ2FuaXplcnMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDQuMDAjRGlza2V0dGUgaG9sZGVycyM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4wNS4wMCNDb3B5IGhvbGRlcnMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDYuMDAjUGFwZXIgb3IgcGFkIGhvbGRlciM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4wNy4wMCNCb29rIGVuZHMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMDguMDAjU3RheSBwdXQgcGVuIG9yIGhvbGRlciM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4wOS4wMCNQZW4gb3IgcGVuY2lsIGhvbGRlcnMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMTAuMDAjSGFuZ2luZyBvcmdhbml6ZXJzIG9yIGFjY2Vzc29yaWVzIzQ0LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE1LjExLjAwI0Rpc3BsYXkgcmFja3Mgb3IgYWNjZXNzb3JpZXMjNDQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTUuMTIuMDAjTGl0ZXJhdHVyZSByYWNrIzQ0LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE1LjEzLjAwI1N1cHBvcnRzIGZvciBkaWFyaWVzIG9yIGNhbGVuZGFycyM0NC4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNS4xNC4wMCNTdGFtcCByYWNrcyBvciBvcmdhbml6ZXJzIzQ0LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE1LjE1LjAwI0ZpbGUgc3RvcmFnZSBib3hlcyBvciBvcmdhbml6ZXJzIzQ0LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE2LjAwLjAwI0Nhc2ggaGFuZGxpbmcgc3VwcGxpZXMjNDQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTYuMDEuMDAjQ3VycmVuY3kgYmFncyBvciB3YWxsZXRzIzQ0LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE2LjAyLjAwI0NvdW50ZXJmZWl0IGJpbGwgZGV0ZWN0b3IgcGVucyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wMy4wMCNDb2luIHNvcnRlcnMjNDQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTYuMDQuMDAjQ29pbiB3cmFwcGVycyBvciBiaWxsIHN0cmFwcyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wNS4wMCNDYXNoIG9yIHRpY2tldCBib3hlcyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wNi4wMCNDYXNoIGJveCB0cmF5cyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wNy4wMCNDaGVjayBmaWxlcyM0NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMS4xNi4wOC4wMCNDb2luIGJhbmtzIzQ0LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE2LjA5LjAwI0NvdW50ZXJmZWl0IGJpbGwgZGV0ZWN0b3JzIG9yIHN1cHBsaWVzIzQ0LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjAwLjAwI0RyYWZ0aW5nIHN1cHBsaWVzIzQ0LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjAxLjAwI1N0ZW5jaWxzIG9yIGxldHRlcmluZyBhaWRzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjAyLjAwI0RyYWZ0aW5nIGZpbG1zIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjAzLjAwI0NvbXBhc3NlcyM0NC4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOC4wNC4wMCNEcmFmdGluZyBwYXBlcnMjNDQuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTguMDUuMDAjQ3VydmVzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjA2LjAwI1Byb3RyYWN0b3JzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjA3LjAwI1NjYWxlcyM0NC4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOC4wOC4wMCNUIHNxdWFyZXMjNDQuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTguMDkuMDAjVGVtcGxhdGVzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjEwLjAwI1RyaWFuZ2xlcyM0NC4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOC4xMS4wMCNDb2xvciBjaGFydHMjNDQuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTguMTIuMDAjRHJhZnRpbmcga2l0cyBvciBzZXRzIzQ0LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE4LjEzLjAwI0RyYWZ0aW5nIGRvdHMgb3IgdGFwZXMjNDQuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTkuMDAuMDAjQm9hcmRzIzQ0LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjE5LjAxLjAwI1BsYW5uaW5nIGJvYXJkcyBvciBhY2Nlc3NvcmllcyM0NC4xMS4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOS4wMi4wMCNFbGVjdHJvbmljIGNvcHlib2FyZHMgb3IgYWNjZXNzb3JpZXMjNDQuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTkuMDMuMDAjRWFzZWxzIG9yIGFjY2Vzc29yaWVzIzQ0LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE5LjA0LjAwI0xldHRlciBib2FyZHMgb3IgYWNjZXNzb3JpZXMjNDQuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTkuMDUuMDAjRHJ5IGVyYXNlIGJvYXJkcyBvciBhY2Nlc3NvcmllcyM0NC4xMS4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOS4wNi4wMCNDaGFsayBib2FyZHMgb3IgYWNjZXNzb3JpZXMjNDQuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMTkuMDcuMDAjQnVsbGV0aW4gYm9hcmRzIG9yIGFjY2Vzc29yaWVzIzQ0LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ0LjExLjE5LjA4LjAwI01hZ25ldGljIGJvYXJkcyBvciBhY2Nlc3NvcmllcyM0NC4xMS4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMS4xOS4wOS4wMCNCb2FyZCBjbGVhbmluZyBraXRzIG9yIGFjY2Vzc29yaWVzIzQ0LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjAwLjAwI1BsYW5uaW5nIHN5c3RlbXMjNDQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMjAuMDEuMDAjQWRkcmVzcyBib29rcyBvciByZWZpbGxzIzQ0LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjAyLjAwI0NhbGVuZGFycyM0NC4xMS4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMS4yMC4wNC4wMCNNZWV0aW5nIHBsYW5uZXJzIzQ0LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjA1LjAwI0FwcG9pbnRtZW50IGJvb2tzIG9yIHJlZmlsbHMjNDQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTEuMjAuMDYuMDAjRGlhcmllcyBvciByZWZpbGxzIzQ0LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjA3LjAwI1N1Z2dlc3Rpb24gYm94IzQ0LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjExLjIwLjA4LjAwI1dhbGwgcGxhbm5lcnMgb3IgcmVmaWxscyM0NC4xMS4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4wMC4wMC4wMCNPZmZpY2Ugc3VwcGxpZXMjNDQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMDAuMDAjTWFpbGluZyBzdXBwbGllcyM0NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNS4wMS4wMCNNYWlsZXIgdHViZXMjNDQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMDMuMDAjTWFpbGVycyM0NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNS4wNC4wMCNXaW5kb3cgZW52ZWxvcGVzIzQ0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE1LjA1LjAwI1NwZWNpYWx0eSBlbnZlbG9wZXMjNDQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMDYuMDAjU3RhbmRhcmQgZW52ZWxvcGVzIzQ0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE1LjA3LjAwI0NhdGFsb2cgb3IgY2xhc3AgZW52ZWxvcGVzIzQ0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE1LjA4LjAwI01lc3NhZ2UgZHJvcHBlcnMjNDQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMDkuMDAjTWFpbGluZyBiYWdzIzQ0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE1LjEwLjAwI01haWxpbmcgc2VhbHMjNDQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTUuMTEuMDAjTWFpbGluZyBib3hlcyM0NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4wMC4wMCNEZXNrIHN1cHBsaWVzIzQ0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjA0LjAwI1N0YW1wcyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4wNS4wMCNUYXBlIGRpc3BlbnNlcnMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMDYuMDAjRmluZ2VyIHN0YWxscyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4xMS4wMCNQYXBlciBvciBleWVsZXQgcHVuY2hlcyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4xMi4wMCNQYXBlciBjdXR0ZXJzIG9yIHJlZmlsbHMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMTMuMDAjU3RhcGxlIHJlbW92ZXJzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjE0LjAwI0NhbGwgYmVsbHMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMTUuMDAjU3RhcGxlcnMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMTcuMDAjTWFudWFsIGxldHRlciBvcGVuZXJzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjE4LjAwI1NjaXNzb3JzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjE5LjAwI1BlbmNpbCBzaGFycGVuZXJzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjIwLjAwI0ZpbmdlciBzdGFsbHMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMjEuMDAjRGVzayBwYWRzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjIyLjAwI01vaXN0ZW5lcnMjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMjMuMDAjTWVjaGFuaWNhbCBsZXR0ZXIgb3BlbmVyIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjI0LjAwI0VtYm9zc2luZyB0b29scyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4yNS4wMCNQYXBlciB3ZWlnaHRzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjI2LjAwI0FkaGVzaXZlIHJlbW92ZXIjNDQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTYuMjcuMDAjQm9va21hcmtzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjI4LjAwI0NsaXAgaG9sZGVycyBvciBkaXNwZW5zZXJzIzQ0LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE2LjI5LjAwI1BhcGVyIGNsaXAgZGlzcGVuc2VyIG9yIGhvbGRlciM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4zMC4wMCNTdGFwbGVyIGtpdCM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNi4zMS4wMCNHbHVlIGRpc3BlbnNlcnMgb3IgcmVmaWxscyM0NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4wMC4wMCNXcml0aW5nIGluc3RydW1lbnRzIzQ0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjAxLjAwI1JvbGxlcmJhbGwgcGVucyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4wMi4wMCNQZW4gb3IgcGVuY2lsIHNldHMjNDQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTcuMDMuMDAjRm91bnRhaW4gcGVucyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4wNC4wMCNCYWxsIHBvaW50IHBlbnMjNDQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTcuMDUuMDAjTWVjaGFuaWNhbCBwZW5jaWxzIzQ0LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjA2LjAwI1dvb2RlbiBwZW5jaWxzIzQ0LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjA3LjAwI0NvbG9yZWQgcGVuY2lscyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4wOC4wMCNNYXJrZXJzIzQ0LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjA5LjAwI0NyYXlvbnMjNDQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTcuMTAuMDAjV3JpdGluZyBjaGFsayBvciBhY2Nlc3NvcmllcyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4xMS4wMCNGZWx0IHBlbiM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4xMi4wMCNNYXJrZXIgcmVmaWxscyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4xMy4wMCNQZW4gbmlicyM0NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NC4xMi4xNy4xNC4wMCNQZW5jaWwgb3IgcGVuIGdyaXBzIzQ0LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE3LjE1LjAwI0NvbWJpbmF0aW9uIHBlbiBvciBwZW5jaWwjNDQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTguMDAuMDAjQ29ycmVjdGlvbiBtZWRpYSM0NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOC4wMS4wMCNDb3JyZWN0aW9uIGZpbG0gb3IgdGFwZSM0NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOC4wMi4wMCNDb3JyZWN0aW9uIGZsdWlkIzQ0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE4LjA0LjAwI0VyYXNlcnMjNDQuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTguMDUuMDAjQ29ycmVjdGlvbiBwZW5zIzQ0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE4LjA2LjAwI0NvcnJlY3Rpb24gcGVuIHJlZmlsbHMjNDQuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTguMDcuMDAjRXJhc2VyIHJlZmlsbHMjNDQuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTkuMDAuMDAjSW5rIGFuZCBsZWFkIHJlZmlsbHMjNDQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMTkuMDEuMDAjSW5kaWEgaW5rIzQ0LjEyLjE5LjAwLjAwCi11bnNwc2M3IzQ0LjEyLjE5LjAyLjAwI0xlYWQgcmVmaWxscyM0NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOS4wMy4wMCNQZW4gcmVmaWxscyM0NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOS4wNC4wMCNJbmsgcmVmaWxscyM0NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMi4xOS4wNS4wMCNJbmsgb3Igc3RhbXAgcGFkcyM0NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wMC4wMCNGb2xkZXJzIGFuZCBiaW5kZXJzIGFuZCBpbmRleGVzIzQ0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjAxLjAwI0luZGV4IGNhcmQgZmlsZXMjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMDIuMDAjU2hlZXQgcHJvdGVjdG9ycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wMy4wMCNCaW5kZXJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjA0LjAwI0RhdGEgYmluZGVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wNS4wMCNNYWdhemluZSBvciBib29rIGNvdmVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wNi4wMCNIYW5naW5nIGZpbGUgZm9sZGVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wNy4wMCNQcmVzZW50YXRpb24gYmluZGVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wOC4wMCNUYWIgaW5kZXhlcyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4wOS4wMCNSb3Rhcnkgb3IgYnVzaW5lc3MgY2FyZCBmaWxlcyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4xMC4wMCNEaXZpZGVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4xMS4wMCNGb2xkZXJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjEyLjAwI0NsaXBib2FyZHMjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMTMuMDAjUmVwb3J0IGNvdmVycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4xNC4wMCNTaGVldCBsaWZ0ZXJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjE1LjAwI0ZpbGUgYmFja2VycyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4xNi4wMCNEb2N1bWVudCBob2xkZXIjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMTcuMDAjSGFuZ2luZyBmb2xkZXJzIG9yIGFjY2Vzc29yaWVzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjE4LjAwI0ZpbGUgaW5zZXJ0cyBvciB0YWJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIwLjE5LjAwI0ZpbGUgcG9ja2V0cyBvciBhY2Nlc3NvcmllcyM0NC4xMi4yMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMC4yMC4wMCNDYXJkIHBvY2tldHMjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMjEuMDAjUG9zdGFnZSBzdGFtcCBhbGJ1bXMjNDQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjAuMjIuMDAjQmluZGluZyBiYXJzIzQ0LjEyLjIwLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjAwLjAwI0Zhc3RlbmluZyBzdXBwbGllcyM0NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4wMS4wMCNSdWJiZXIgYmFuZHMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMDIuMDAjUHJvbmdzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjAzLjAwI0NsYXNwIGZhc3RlbmVycyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4wNC4wMCNQYXBlciBjbGlwcyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4wNS4wMCNCaW5kZXIgb3IgYnVsbGRvZyBjbGlwcyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4wNi4wMCNQaW5zIG9yIHRhY2tzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjA3LjAwI1N0YXBsZXMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMDguMDAjRmlsaW5nIHBvY2tldHMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMDkuMDAjVmVsY3JvIGZhc3RlbmVycyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4xMC4wMCNBZGhlc2l2ZSBtb3VudHMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMTEuMDAjSG9sZSByZWluZm9yY2VtZW50cyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4xMi4wMCNSb3VuZCBoZWFkIGZhc3RlbmVycyM0NC4xMi4yMS4wMC4wMAotdW5zcHNjNyM0NC4xMi4yMS4xMy4wMCNUYWcgZmFzdGVuZXJzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjE0LjAwI1NjcmV3IHBvc3RzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjE1LjAwI0FkaGVzaXZlIGNvcm5lcnMjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDQuMTIuMjEuMTYuMDAjQmFnIGNsaXBzIzQ0LjEyLjIxLjAwLjAwCi11bnNwc2M3IzQ0LjEyLjIxLjE3LjAwI0Jvb2sgcmluZ3MjNDQuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNDUuMDAuMDAuMDAuMDAjUHJpbnRpbmcgYW5kIFBob3RvZ3JhcGhpYyBhbmQgQXVkaW8gYW5kIFZpc3VhbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIzQ1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjAwLjAwLjAwI1ByaW50aW5nIGFuZCBwdWJsaXNoaW5nIGVxdWlwbWVudCM0NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4wMC4wMCNQcmludGluZyBtYWNoaW5lcnkgYW5kIGVxdWlwbWVudCM0NS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4wMS4wMCNIZWxpb2dyYXBoaWMgcHJpbnRlcnMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDIuMDAjT2Zmc2V0IHByaW50aW5nIHByZXNzZXMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDMuMDAjTGV0dGVycHJlc3MgZXF1aXBtZW50IzQ1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE1LjA0LjAwI0xpdGhvZ3JhcGhpYyBlcXVpcG1lbnQjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDUuMDAjUGhvdG9ncmF2dXJlIHByaW50aW5nIG1hY2hpbmVzIzQ1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE1LjA2LjAwI1NpbGsgc2NyZWVuIHByaW50aW5nIG1hY2hpbmVzIzQ1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE1LjA3LjAwI1ByaW50aW5nIHByZXNzZXMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDguMDAjUGVyZm9yYXRpbmcgbWFjaGluZXMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMDkuMDAjVWx0cmF2aW9sZXQgKFVWKSByb3RhcnkgcHJpbnRlciM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xMC4wMCNGbGV4b2dyYXBoaWMgcHJpbnRlciM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xMS4wMCNJbmtqZXQgcHJpbnRlciBmb3IgY29tbWVyY2lhbCBwcmludGluZyBhcHBsaWNhdGlvbnMjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTUuMTIuMDAjVGhlcm1hbCB0cmFuc2ZlciBwcmludGVyIGZvciBjb21tZXJjaWFsIHByaW50aW5nIGFwcGxpY2F0aW9ucyM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xMy4wMCNIb3Qgc3RhbXAgcHJpbnRlciM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xNC4wMCNQYWQgcHJpbnRlciM0NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNS4xNS4wMCNDb3JlIHByaW50ZXIjNDUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTYuMDAuMDAjUHJpbnRpbmcgbWFjaGluZXJ5IGFjY2Vzc29yaWVzIzQ1LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE2LjAyLjAwI09mZnNldCBkYXJrcm9vbSBlcXVpcG1lbnQjNDUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTYuMDMuMDAjT2Zmc2V0IHByaW50aW5nIGNvbnN1bWFibGVzIzQ1LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE2LjA0LjAwI09mZnNldCBwcmludGluZyBwbGF0ZSBwcm9jZXNzb3JzIzQ1LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE2LjA1LjAwI09mZnNldCBwbGF0ZXMjNDUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTYuMDYuMDAjT2Zmc2V0IGZpbG0gcHJvY2Vzc29ycyM0NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNi4wNy4wMCNTaWxrIHNjcmVlbiBhcmMgbGFtcHMjNDUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTYuMDguMDAjU2lsayBzY3JlZW4gc2NyZWVucyM0NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNi4wOS4wMCNTaWxrIHNjcmVlbiBwcmludGluZyByYWNrcyM0NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNi4xMC4wMCNTaWxrIHNjcmVlbiB2YWN1dW0gcHJpbnRpbmcgZnJhbWVzIzQ1LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE2LjExLjAwI1NpbGsgc2NyZWVuIHNxdWVlZ2VlcyM0NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNy4wMC4wMCNQcmludGluZyBhY2Nlc3NvcmllcyM0NS4xMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNy4wMS4wMCNQcmludGluZyBhc3NlbWJsZXJzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjAyLjAwI1ByaW50aW5nIGd1aWxsb3RpbmVzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjAzLjAwI1ByaW50aW5nIGNvbGxhdG9ycyBvciBkZWNvbGxhdG9ycyM0NS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0NS4xMC4xNy4wNC4wMCNQcmludGluZyBjdXR0ZXJzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjA1LjAwI1ByaW50aW5nIHRyaW1tZXJzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjA2LjAwI1ByaW50aW5nIHB1bmNoZXMjNDUuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTcuMDcuMDAjUHJpbnRpbmcgcGxhdGVzIzQ1LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE3LjA4LjAwI1ByaW50aW5nIGF3bHMjNDUuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTguMDAuMDAjQm9vayBiaW5kaW5nIGFuZCBzZXdpbmcgbWFjaGluZXJ5IzQ1LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE4LjAxLjAwI0Jvb2sgY3JlYXNpbmcgbWFjaGluZXMjNDUuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTguMDIuMDAjQm9vayBjdXR0aW5nIG1hY2hpbmVzIzQ1LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE4LjAzLjAwI0Jvb2sgcHVuY2hpbmcgbWFjaGluZXMjNDUuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTguMDQuMDAjQm9vayBzdGl0Y2hpbmcgbWFjaGluZXMjNDUuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTguMDUuMDAjQm9vayBqb2dnaW5nIG1hY2hpbmVzIzQ1LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE4LjA2LjAwI0Jvb2sgZ2F0aGVyaW5nIG1hY2hpbmVzIzQ1LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjEwLjE4LjA3LjAwI0Jvb2sgZm9sZGluZyBtYWNoaW5lcyM0NS4xMC4xOC4wMC4wMAotdW5zcHNjNyM0NS4xMC4xOS4wMC4wMCNQcmludGluZyBsYWJvcmF0b3J5IGVxdWlwbWVudCBhbmQgYWNjZXNzb3JpZXMjNDUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTkuMDEuMDAjQmFuZGluZyBtYWNoaW5lcyM0NS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xOS4wMi4wMCNQbGF0ZW1ha2VycyM0NS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xOS4wMy4wMCNQYXBlciBkcmlsbGluZyBtYWNoaW5lcyM0NS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMC4xOS4wNC4wMCNFbmxhcmdlcnMjNDUuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMTkuMDUuMDAjRHJhd2luZyBvciByZXRvdWNoaW5nIGJvYXJkcyM0NS4xMC4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMC4yMC4wMC4wMCNDb21wb3NpbmcgbWFjaGluZXMgYW5kIGFjY2Vzc29yaWVzIzQ1LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjIwLjAxLjAwI0ludGVydHlwZSBjb21wb3NpbmcgbWFjaGluZXMjNDUuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDUuMTAuMjAuMDIuMDAjTGlub3R5cGUgY29tcG9zaW5nIG1hY2hpbmVzIzQ1LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjIwLjAzLjAwI1Bob3RvY29tcG9zaXRpb24gbWF0ZXJpYWxzIzQ1LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ1LjEwLjIwLjA0LjAwI01vbm90eXBlIGNvbXBvc2luZyBtYWNoaW5lcyM0NS4xMC4yMC4wMC4wMAotdW5zcHNjNyM0NS4xMC4yMC4wNS4wMCNQaG90b3R5cGVzZXR0aW5nIG1hY2hpbmVzIzQ1LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ1LjExLjAwLjAwLjAwI0F1ZGlvIGFuZCB2aXN1YWwgcHJlc2VudGF0aW9uIGVxdWlwbWVudCM0NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNS4wMC4wMCNMZWN0ZXJucyBhbmQgc291bmQgc3lzdGVtcyBhbmQgYWNjZXNzb3JpZXMjNDUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTUuMDEuMDAjRnJlZSBzdGFuZGluZyBsZWN0ZXJucyM0NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNS4wMi4wMCNUYWJsZSB0b3AgbGVjdGVybnMjNDUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDAuMDAjUHJvamVjdG9ycyBhbmQgc3VwcGxpZXMjNDUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDEuMDAjUG9pbnRlcnMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDIuMDAjUHJvamVjdGlvbiBidWxicyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4wMy4wMCNQcm9qZWN0aW9uIHNjcmVlbnMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDQuMDAjU2xpZGUgcHJvamVjdG9ycyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4wNS4wMCNUcmFuc3BhcmVuY3kgZXF1aXBtZW50IG9yIHN1cHBsaWVzIzQ1LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE2LjA2LjAwI0xpcXVpZCBjcnlzdGFsIGRpc3BsYXkgcHJvamVjdGlvbiBwYW5lbHMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDcuMDAjT3ZlcmhlYWQgcHJvamVjdG9ycyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4wOC4wMCNGaWxtIHByb2plY3RvcnMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMDkuMDAjQ29tcHV0ZXIgc2NyZWVuIHByb2plY3RvciM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xMC4wMCNFcGlkaWFzY29wZXMjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMTEuMDAjTWljcm9maWNoZSBvciBtaWNyb2ZpbG0gdmlld2VycyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xMi4wMCNEaXNzb2x2ZSBjb250cm9scyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xMy4wMCNDYXRob2RlIHJheSB0dWJlIGRhdGEjNDUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTYuMTQuMDAjTGlxdWlkIGNyeXN0YWwgZGlzcGxheSBkYXRhIG9yIHZpZGVvIHByb2plY3RvciM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xNS4wMCNQcm9qZWN0aW9uIGxlbnNlcyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNi4xNi4wMCNWaWRlbyBwcm9qZWN0b3JzIzQ1LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE2LjE4LjAwI1ByZXNlbnRhdGlvbiBsaWdodCBib3hlcyM0NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMS4xNy4wMC4wMCNBdWRpbyBwcmVzZW50YXRpb24gZXF1aXBtZW50IGFuZCBoYXJkd2FyZSBhbmQgY29udHJvbGxlcnMjNDUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTcuMDEuMDAjQXNzaXN0aXZlIGxpc3RlbmluZyBkZXZpY2VzIzQ1LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE3LjAyLjAwI0F1ZGlvIGphY2sgYm94ZXMjNDUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTcuMDMuMDAjTGlzdGVuaW5nIGNlbnRlcnMjNDUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTguMDAuMDAjVmlkZW8gYW5kIGNvbWJpbmF0aW9uIHZpZGVvIGFuZCBhdWRpbyBwcmVzZW50YXRpb24gZXF1aXBtZW50IGFuZCBoYXJkd2FyZSBhbmQgY29udHJvbGxlcnMjNDUuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTguMDEuMDAjTWVkaWEgY29udHJvbCBzeXN0ZW1zIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE4LjAyLjAwI1RlbGV2aXNpb24gbW91bnRzIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE4LjAzLjAwI1NjYW4gY29udmVydGVycyM0NS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NS4xMS4xOC4wNC4wMCNMaW5lIGRvdWJsZXJzIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE4LjA1LjAwI1ZpZGVvIGVkaXRvcnMjNDUuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTguMDYuMDAjRGlzdGFuY2UgbGVhcm5pbmcgc3lzdGVtcyM0NS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0NS4xMS4xOC4wNy4wMCNJbnRlcmZhY2VzIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE4LjA4LjAwI0xpZ2h0aW5nIGNvbnRyb2xzIzQ1LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ1LjExLjE5LjAwLjAwI1Bob25lIGFuZCB2aWRlbyBjb25mZXJlbmNlIGVxdWlwbWVudCBhbmQgaGFyZHdhcmUgYW5kIGNvbnRyb2xsZXJzIzQ1LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjExLjE5LjAxLjAwI0F1ZGlvY29uZmVyZW5jaW5nIHN5c3RlbXMjNDUuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDUuMTEuMTkuMDIuMDAjVmlkZW9jb25mZXJlbmNpbmcgc3lzdGVtcyM0NS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0NS4xMi4wMC4wMC4wMCNQaG90b2dyYXBoaWMgZXF1aXBtZW50IzQ1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjAwLjAwI0NhbWVyYXMjNDUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMDEuMDAjU3RpbGwgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4wMi4wMCNJbnN0YW50IHByaW50IGNhbWVyYXMjNDUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMDMuMDAjRGlzcG9zYWJsZSBjYW1lcmFzIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjA0LjAwI0RpZ2l0YWwgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4wNS4wMCNDaW5lbWF0b2dyYXBoaWMgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4wNi4wMCNWaWRlbyBjb25mZXJlbmNlIGNhbWVyYXMjNDUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMDguMDAjTWljcm9maWxtIGNhbWVyYXMjNDUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMTAuMDAjQWVyaWFsIGNhbWVyYXMjNDUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTUuMTEuMDAjSGlnaCBzcGVlZCBjYW1lcmFzIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjEyLjAwI1VuZGVyd2F0ZXIgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4xMy4wMCNPZmZzZXQgY2FtZXJhcyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4xNC4wMCNQaG90b2NvcGllciBjYW1lcmFzIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjE1LjAwI0hhbmQgaGVsZCBjYW1jb3JkZXJzIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjE2LjAwI0RpZ2l0YWwgY2FtY29yZGVyIzQ1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE1LjE3LjAwI0RvY3VtZW50IGNhbWVyYSM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNS4xOC4wMCNDYW1lcmEga2l0cyM0NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4wMC4wMCNDYW1lcmEgYWNjZXNzb3JpZXMjNDUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMDEuMDAjQ2FtZXJhIGZsYXNoZXMgb3IgbGlnaHRpbmcjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMDIuMDAjQ2FtZXJhIHRyaXBvZHMjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMDMuMDAjQ2FtZXJhIGxlbnNlcyBvciBmaWx0ZXJzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjA0LjAwI0NhbWVyYSBzaHV0dGVycyM0NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4wNS4wMCNTY3JlZW4gZnJhbWVzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjA2LjAwI0NhbWVyYSBoYXJuZXNzZXMjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMDcuMDAjQ2FtZXJhIGJsb2NrcyBvciBob2xkZXJzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjA4LjAwI0NhbWVyYSBhc3NlbWJsaWVzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjA5LjAwI0NhbWVyYSBicmFja2V0cyM0NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4xMC4wMCNDYW1lcmEgY2FibGVzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE2LjExLjAwI0xlbnMgY292ZXIjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMTIuMDAjQ2FtZXJhIHRhYmxlcyM0NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4xMy4wMCNDYW1lcmEgZW5jbG9zdXJlcyBvciBjb3ZlcnMjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMTQuMDAjUmV0cm9maXQga2l0cyM0NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNi4xNS4wMCNDYW1lcmEgcmluZ3MjNDUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTYuMTYuMDAjUGFuIGhlYWRzIzQ1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ1LjEyLjE3LjAwLjAwI1Bob3RvZ3JhcGhpYyBwcm9jZXNzaW5nIGVxdWlwbWVudCM0NS4xMi4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNy4wMS4wMCNGaWxtIGRyaWVycyM0NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNy4wMi4wMCNGaWxtIHdhc2hlcnMjNDUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTcuMDMuMDAjRmlsbSBzcGxpY2VycyM0NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NS4xMi4xNy4wNC4wMCNGaWxtIGVkaXRvcnMjNDUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDUuMTIuMTcuMDUuMDAjUGhvdG9ncmFwaGljIGVubGFyZ2VycyM0NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM0NS4xMy4wMC4wMC4wMCNQaG90b2dyYXBoaWMgYW5kIHJlY29yZGluZyBtZWRpYSM0NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wMC4wMCNTdGlsbCBwaWN0dXJlIGZpbG0jNDUuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTMuMTUuMDEuMDAjQ29sb3IgZmlsbSM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wMi4wMCNCbGFjayBhbmQgd2hpdGUgZmlsbSM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wMy4wMCNJbnN0YW50IHBpY3R1cmUgZmlsbSM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wNC4wMCNNaWNyb2ZpbG0jNDUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTMuMTUuMDUuMDAjWCByYXkgZmlsbSM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNS4wNi4wMCNQaG90b2dyYXBoeSBwYXBlciM0NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNi4wMC4wMCNNb3ZpbmcgcGljdHVyZSBtZWRpYSM0NS4xMy4wMC4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNi4wMS4wMCNNb3Rpb24gcGljdHVyZSBjYW1lcmEgZmlsbSM0NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNi4wNC4wMCNCbGFuayB2aWRlbyB0YXBlcyM0NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM0NS4xMy4xNy4wMC4wMCNNZWRpYSBzdG9yYWdlIzQ1LjEzLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjEzLjE3LjAxLjAwI1NsaWRlIHRyYXlzIzQ1LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ1LjE0LjAwLjAwLjAwI1Bob3RvZ3JhcGhpYyBmaWxtbWFraW5nIHN1cHBsaWVzIzQ1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ1LjE0LjE1LjAwLjAwI1Bob3RvZ3JhcGhpYyBwcm9jZXNzaW5nIGNoZW1pY2FscyM0NS4xNC4wMC4wMC4wMAotdW5zcHNjNyM0NS4xNC4xNS4wMS4wMCNEZXZlbG9wZXIgc29sdXRpb24jNDUuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTQuMTUuMDIuMDAjRml4YXRpdmUjNDUuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDUuMTQuMTYuMDAuMDAjRGFya3Jvb20gc3VwcGxpZXMjNDUuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNDUuMTQuMTYuMDEuMDAjRGV2ZWxvcGluZyB0cmF5cyM0NS4xNC4xNi4wMC4wMAotdW5zcHNjNyM0NS4xNC4xNi4wMi4wMCNEZXZlbG9waW5nIHRhbmtzIzQ1LjE0LjE2LjAwLjAwCi11bnNwc2M3IzQ1LjE0LjE2LjAzLjAwI0RldmVsb3BpbmcgdG9uZ3MjNDUuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMDAuMDAuMDAuMDAjRGVmZW5zZSBhbmQgTGF3IEVuZm9yY2VtZW50IGFuZCBTZWN1cml0eSBhbmQgU2FmZXR5IEVxdWlwbWVudCBhbmQgU3VwcGxpZXMjNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTAuMDAuMDAuMDAjTGlnaHQgd2VhcG9ucyBhbmQgYW1tdW5pdGlvbiM0Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wMC4wMCNGaXJlYXJtcyM0Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wMS4wMCNNYWNoaW5lIGd1bnMjNDYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTAuMTUuMDIuMDAjUG9saWNlIG9yIHNlY3VyaXR5IHNob3RndW5zIzQ2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEwLjE1LjAzLjAwI01pbGl0YXJ5IHJpZmxlcyM0Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wNC4wMCNIYW5kZ3VucyM0Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wNS4wMCNBaXIgcmlmbGVzIG9yIGFpciBoYW5kZ3VucyM0Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNS4wNi4wMCNQYXJ0cyBvZiBndW5zIG9yIHBpc3RvbHMjNDYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTAuMTYuMDAuMDAjQW1tdW5pdGlvbiM0Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNi4wMS4wMCNEZWZlbnNlIG9yIGxhdyBlbmZvcmNlbWVudCBhbW11bml0aW9uIzQ2LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEwLjE3LjAwLjAwI0FtbXVuaXRpb24gaGFuZGxpbmcgc3lzdGVtcyM0Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNy4wMS4wMCNUYW5rIGFtbXVuaXRpb24gaGFuZGxpbmcgc3lzdGVtcyM0Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xNy4wMi4wMCNBaXJjcmFmdCBhbW11bml0aW9uIGhhbmRsaW5nIHN5c3RlbXMjNDYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDYuMTAuMTguMDAuMDAjQXJtcyBhbmQgYW1tdW5pdGlvbiBhY2Nlc3NvcmllcyM0Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMC4xOC4wMS4wMCNHdW4gY2FzZXMjNDYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNDYuMTEuMDAuMDAuMDAjQ29udmVudGlvbmFsIHdhciB3ZWFwb25zIzQ2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ2LjExLjE1LjAwLjAwI0JvbWJzIGFuZCBncmVuYWRlcyM0Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMS4xNS4wMS4wMCNHcmVuYWRlcyM0Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMS4xNS4wMi4wMCNNaW5lcyM0Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMS4xNS4wMy4wMCNNb3J0YXIgYm9tYnMjNDYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTYuMDAuMDAjR3VuIHN5c3RlbXMjNDYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTYuMDEuMDAjQ2hhaW4gZ3VuIHN5c3RlbXMjNDYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTYuMDIuMDAjR2F0bGluZyBndW4gc3lzdGVtcyM0Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xMS4xNy4wMC4wMCNJbmZyYXJlZCAoSVIpIHNlbnNvcnMjNDYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTcuMDEuMDAjSW5mcmFyZWQgKElSKSBjb29sZXJzIzQ2LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ2LjExLjE3LjAyLjAwI0luZnJhcmVkIChJUikgZGV0ZWN0b3JzIzQ2LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ2LjExLjE4LjAwLjAwI05hdmFsIHdlYXBvbnMjNDYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTEuMTguMDEuMDAjVG9ycGVkb2VzIzQ2LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjAwLjAwLjAwI01pc3NpbGVzIzQ2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjAwLjAwI0d1aWRlZCBtaXNzaWxlcyM0Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wMS4wMCNBaXIgdG8gYWlyIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjAyLjAwI0FudGlhaXJjcmFmdCBtaXNzaWxlcyM0Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wMy4wMCNBbnRpbWlzc2lsZSBtaXNzaWxlcyM0Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wNC4wMCNBbnRpc2hpcCBtaXNzaWxlcyM0Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wNS4wMCNBbnRpdGFuayBtaXNzaWxlcyM0Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNS4wNi4wMCNCYWxsaXN0aWMgbWlzc2lsZXMjNDYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTIuMTUuMDcuMDAjQ3J1aXNlIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjA4LjAwI1N1cmZhY2UgdG8gYWlyIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjA5LjAwI0FudGliYWxsaXN0aWMgbWlzc2lsZXMjNDYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTIuMTUuMTAuMDAjU3VyZmFjZSB0byBzdXJmYWNlIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjExLjAwI0FpciB0byBzdXJmYWNlIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE1LjEyLjAwI1RyYWluaW5nIG1pc3NpbGVzIzQ2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE2LjAwLjAwI01pc3NpbGUgc3Vic3lzdGVtcyM0Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNi4wMS4wMCNFbGVjdHJvbmljIHNhZmUgb3IgYXJtIGRldmljZXMjNDYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTIuMTYuMDIuMDAjU29saWQgbWlzc2lsZSBib29zdGVycyM0Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNi4wMy4wMCNNaXNzaWxlIHdhcmhlYWRzIzQ2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEyLjE2LjA0LjAwI1NhZmV0eSBwaW4gcHVsbGVycyM0Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xMi4xNi4wNS4wMCNKZXQgcmVhY3Rpb24gY29udHJvbCBhc3NlbWJsaWVzIzQ2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjAwLjAwLjAwI1JvY2tldHMgYW5kIHN1YnN5c3RlbXMjNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTMuMTUuMDAuMDAjTGF1bmNoIHZlaGljbGVzIGFuZCByb2NrZXRzIzQ2LjEzLjAwLjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE1LjAxLjAwI011bHRpIHN0YWdlIHJvY2tldHMjNDYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTMuMTUuMDIuMDAjUmV1c2FibGUgcm9ja2V0cyM0Ni4xMy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMy4xNS4wMy4wMCNTaW5nbGUgc3RhZ2Ugcm9ja2V0cyM0Ni4xMy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMy4xNS4wNC4wMCNMaXF1aWQgcm9ja2V0cyM0Ni4xMy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xMy4xNS4wNS4wMCNTb2xpZCByb2NrZXRzIzQ2LjEzLjE1LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjAwLjAwI0Jvb3N0ZXJzIzQ2LjEzLjAwLjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjAxLjAwI1JldXNhYmxlIGJvb3N0ZXJzIzQ2LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjAyLjAwI1NvbGlkIGJvb3N0ZXJzIzQ2LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjAzLjAwI011bHRpIHN0YWdlIGJvb3N0ZXJzIzQ2LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ2LjEzLjE2LjA0LjAwI0xpcXVpZCBib29zdGVycyM0Ni4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNC4wMC4wMC4wMCNMYXVuY2hlcnMjNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTQuMTUuMDAuMDAjTWlzc2lsZSBhbmQgcm9ja2V0IGxhdW5jaGVycyM0Ni4xNC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xNC4xNS4wMS4wMCNNaXNzaWxlIGxhdW5jaGVycyM0Ni4xNC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNC4xNS4wMi4wMCNSb2NrZXQgbGF1bmNoZXJzIzQ2LjE0LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE1LjAwLjAwLjAwI0xhdyBlbmZvcmNlbWVudCM0Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xNS4xNS4wMC4wMCNDcm93ZCBjb250cm9sIGVxdWlwbWVudCM0Ni4xNS4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xNS4xNS4wMS4wMCNCYXJyaWNhZGVzIzQ2LjE1LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE1LjE1LjAyLjAwI1Jpb3QgaGVsbWV0cyM0Ni4xNS4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNS4xNS4wMy4wMCNSaW90IHNoaWVsZHMjNDYuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTUuMDQuMDAjQm9keSBhcm1vdXIjNDYuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTUuMDUuMDAjQmFycmllcnMjNDYuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTYuMDAuMDAjU2VjdXJpdHkgYW5kIGNvbnRyb2wgZXF1aXBtZW50IzQ2LjE1LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE1LjE2LjAxLjAwI0hhbmRjdWZmcyM0Ni4xNS4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNS4xNi4wMi4wMCNOaWdodCBzdGlja3MjNDYuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTYuMDMuMDAjRmluZ2VycHJpbnQgZXF1aXBtZW50IzQ2LjE1LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE1LjE2LjA0LjAwI0FsY29ob2wgYW5hbHlzZXJzIzQ2LjE1LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE1LjE2LjA1LjAwI1dlYXBvbnMgb3IgZXhwbG9zaXZlcyBkZXRlY3RvcnMjNDYuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTUuMTYuMDYuMDAjTmFyY290aWMgdGVzdCBraXRzIzQ2LjE1LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjAwLjAwLjAwI1B1YmxpYyBzYWZldHkgYW5kIGNvbnRyb2wjNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTUuMDAuMDAjVHJhZmZpYyBjb250cm9sIzQ2LjE2LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE1LjAxLjAwI0FpcnBvcnQgc2lnbmFsaW5nIHN5c3RlbXMjNDYuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTUuMDIuMDAjUmFpbHdheSBzaWduYWxpbmcgc3lzdGVtcyM0Ni4xNi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNS4wMy4wMCNNYXJpbmUgc2lnbmFsaW5nIHN5c3RlbXMjNDYuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTUuMDQuMDAjVHJhZmZpYyBzaWduYWxzIzQ2LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE1LjA1LjAwI1BhcmtpbmcgbWV0ZXJzIzQ2LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE1LjA2LjAwI1Nub3cgb3IgaWNlIG1lbHRlciM0Ni4xNi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNS4wNy4wMCNCYXJyaWVyIHRhcGUjNDYuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTUuMDguMDAjVHJhZmZpYyBvciBmbG9vciBjb25lcyM0Ni4xNi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNS4wOS4wMCNTcGVlZCBzdG9wcGVycyM0Ni4xNi4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNi4wMC4wMCNXYXRlciBzYWZldHkjNDYuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTYuMTYuMDEuMDAjUm9wZSBmbG9hdCBsaW5lcyM0Ni4xNi4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNi4xNi4wMi4wMCNMaWZlIHJpbmdzIzQ2LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE2LjAzLjAwI1Bvb2wgYWxhcm1zIzQ2LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE2LjE2LjA0LjAwI0xpZmUgdmVzdHMgb3IgcHJlc2VydmVycyM0Ni4xNi4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4wMC4wMC4wMCNTZWN1cml0eSBzdXJ2ZWlsbGFuY2UgYW5kIGRldGVjdGlvbiM0Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4wMC4wMCNMb2NrcyBhbmQgc2VjdXJpdHkgaGFyZHdhcmUjNDYuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMDEuMDAjUGFkbG9ja3MjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMDIuMDAjQ2FibGUgbG9ja3MjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMDMuMDAjTG9jayBzZXRzIzQ2LjE3LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE1LjA0LjAwI1B1c2hidXR0b24gbG9ja3MjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMDUuMDAjS2V5cyBvciBhY2Nlc3NvcmllcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4wNi4wMCNTYWZlcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4wNy4wMCNTZWN1cml0eSBiYXJzIzQ2LjE3LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE1LjA4LjAwI051bWJlciBsb2NrcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4wOS4wMCNLZXkgY2FiaW5ldHMjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMTAuMDAjVGltZSBsb2NrcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4xMS4wMCNMb2Nrb3V0IGRldmljZXMjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTUuMTIuMDAjSW5zdHJ1bWVudCBsb2NrcyM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4xMy4wMCNMb2NraW5nIGNhbSM0Ni4xNy4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNS4xNC4wMCNTZWN1cml0eSBjaGFpbnMgb3IgYWNjZXNzb3JpZXMjNDYuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMDAuMDAjU3VydmVpbGxhbmNlIGFuZCBkZXRlY3Rpb24gZXF1aXBtZW50IzQ2LjE3LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjAyLjAwI1NhZmV0eSBob3JucyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4wMy4wMCNDbG9jayB0aW1lcnMjNDYuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMDQuMDAjQWxhcm0gc3lzdGVtcyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4wNS4wMCNEb29yIGNoaW1lcyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4wNi4wMCNTaXJlbnMjNDYuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMDcuMDAjQnV6emVycyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4wOC4wMCNNb3Rpb24gZGV0ZWN0b3JzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjA5LjAwI0NvbnZleCBzZWN1cml0eSBtaXJyb3JzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjEwLjAwI1NlY3VyaXR5IGNhbWVyYXMjNDYuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMTEuMDAjVmlkZW8gaWRlbnRpZmljYXRpb24gc3lzdGVtcyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4xMi4wMCNWaWRlbyBtb25pdG9ycyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4xMy4wMCNHYXMgZGV0ZWN0b3JzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjE0LjAwI1N1cnZlaWxsYW5jZSBjYW1lcmFzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjE1LjAwI0xpZ2h0IGVuaGFuY2luZyBjYW1lcmFzIG9yIHZpc2lvbiBkZXZpY2VzIzQ2LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE3LjE2LjE2LjAwI1JhZGFyIGRldGVjdG9ycyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xNy4xNi4xNy4wMCNEb29yIGV5ZXMjNDYuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTcuMTYuMTguMDAjRG9vciBiZWxscyM0Ni4xNy4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4wMC4wMC4wMCNQZXJzb25hbCBzYWZldHkgYW5kIHByb3RlY3Rpb24jNDYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMDAuMDAjU2FmZXR5IGFwcGFyZWwjNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMDEuMDAjUHJvdGVjdGl2ZSBhcHJvbnMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMDIuMDAjQnVsbGV0IHByb29mIHZlc3RzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjAzLjAwI1Byb3RlY3RpdmUgY292ZXJhbGxzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjA0LjAwI1Byb3RlY3RpdmUgZ2xvdmVzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjA1LjAwI1Byb3RlY3RpdmUga25lZSBwYWRzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjA2LjAwI1Byb3RlY3RpdmUgcG9uY2hvcyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4wNy4wMCNTYWZldHkgdmVzdHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMDguMDAjRmlyZSByZXRhcmRhbnQgYXBwYXJlbCM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4wOS4wMCNIYXphcmRvdXMgbWF0ZXJpYWwgcHJvdGVjdGl2ZSBhcHBhcmVsIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjEwLjAwI0ZpcmUgcmV0YXJkYW50IGdsb3ZlcyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xMS4wMCNIYXphcmRvdXMgbWF0ZXJpYWwgcHJvdGVjdGl2ZSBnb29kcyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xMi4wMCNDbGVhbnJvb20gYXBwYXJlbCM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xMy4wMCNDbGVhbnJvb20gZ2xvdmVzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjE0LjAwI0VsYm93IHByb3RlY3RvcnMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMTUuMDAjSW5zZWN0aWNpZGUgcHJvdGVjdGl2ZSBjbG90aGluZyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xNi4wMCNTYWZldHkgc2xlZXZlcyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4xNy4wMCNJbnN1bGF0ZWQgb3IgZmxvdGF0aW9uIHN1aXRzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjE4LjAwI0hlYXQgcmVzaXN0YW50IGNsb3RoaW5nIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjE5LjAwI1NhZmV0eSBoYXJuZXNzZXMgb3IgYmVsdHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjAuMDAjTGVnIHByb3RlY3RvcnMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjEuMDAjUmFkaWF0aW9uIHByb3RlY3Rpb24gY2xvdGhpbmcgb3IgY29hdHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjIuMDAjU2FmZXR5IGhvb2RzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjIzLjAwI0luc3VsYXRlZCBjbG90aGluZyBmb3IgY29sZCBlbnZpcm9ubWVudHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjQuMDAjUGVyc29uYWwgZmxvdGF0aW9uIGRldmljZXMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjUuMDAjUHJvdGVjdGl2ZSByYWlud2VhciBvciB3ZXQgZW52aXJvbm1lbnQgYXBwYXJlbCM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4yNi4wMCNQcm90ZWN0aXZlIHNoaXJ0cyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4yNy4wMCNQcm90ZWN0aXZlIHBhbnRzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjI4LjAwI1Byb3RlY3RpdmUgZnJvY2sjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTUuMjkuMDAjSW5zdWxhdGVkIGNsb3RoaW5nIGZvciBjb2xkIGVudmlyb25tZW50cyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4zMC4wMCNQcm90ZWN0aXZlIGZpbmdlciBjb3RzIzQ2LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE1LjMxLjAwI1JlZmxlY3RpdmUgc3VzcGVuZGVycyM0Ni4xOC4xNS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNS4zMi4wMCNMYWIgY29hdHMjNDYuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTYuMDAuMDAjU2FmZXR5IGZvb3R3ZWFyIzQ2LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE2LjAxLjAwI0ZpcmUgcmV0YXJkYW50IGZvb3R3ZWFyIzQ2LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE2LjAyLjAwI0hhemFyZG91cyBtYXRlcmlhbCBwcm90ZWN0aXZlIGZvb3R3ZWFyIzQ2LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE2LjAzLjAwI0NsZWFucm9vbSBmb290d2VhciM0Ni4xOC4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNi4wNC4wMCNTYWZldHkgYm9vdHMjNDYuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTYuMDUuMDAjU2FmZXR5IHNob2VzIzQ2LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE2LjA2LjAwI0Zvb3R3ZWFyIGNvdmVycyM0Ni4xOC4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xNy4wMC4wMCNGYWNlIGFuZCBoZWFkIHByb3RlY3Rpb24jNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTcuMDEuMDAjSGFyZCBoYXRzIzQ2LjE4LjE3LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE3LjAyLjAwI0ZhY2lhbCBzaGllbGRzIzQ2LjE4LjE3LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE3LjAzLjAwI1dlbGRpbmcgbWFza3MjNDYuMTguMTcuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTcuMDQuMDAjU2FmZXR5IGhlbG1ldHMjNDYuMTguMTcuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTcuMDUuMDAjTW90b3JjeWNsZSBoZWxtZXRzIzQ2LjE4LjE3LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE3LjA2LjAwI0hlbG1ldCBwYXJ0cyBvciBhY2Nlc3NvcmllcyM0Ni4xOC4xNy4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xOC4wMC4wMCNWaXNpb24gcHJvdGVjdGlvbiBhbmQgYWNjZXNzb3JpZXMjNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTguMDEuMDAjRXlld2VhciBob2xkZXJzIzQ2LjE4LjE4LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE4LjAyLjAwI1NhZmV0eSBnbGFzc2VzIzQ2LjE4LjE4LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE4LjAzLjAwI0V5ZSBzaGllbGRzIzQ2LjE4LjE4LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE4LjA0LjAwI0dvZ2dsZXMjNDYuMTguMTguMDAuMDAKLXVuc3BzYzcjNDYuMTguMTguMDUuMDAjVmlkZW8gZGlzcGxheSBmaWx0ZXJzIzQ2LjE4LjE4LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE4LjA2LjAwI0xlbnMgY2xlYW5lciM0Ni4xOC4xOC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4xOS4wMC4wMCNIZWFyaW5nIHByb3RlY3RvcnMjNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMTkuMDEuMDAjRWFyIHBsdWdzIzQ2LjE4LjE5LjAwLjAwCi11bnNwc2M3IzQ2LjE4LjE5LjAyLjAwI0VhciBtdWZmcyM0Ni4xOC4xOS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMC4wMC4wMCNSZXNwaXJhdG9yeSBwcm90ZWN0aW9uIzQ2LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIwLjAxLjAwI01hc2tzIzQ2LjE4LjIwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIwLjAyLjAwI1Jlc3BpcmF0b3JzIzQ2LjE4LjIwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIwLjAzLjAwI0dhcyBtYXNrcyM0Ni4xOC4yMC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMC4wNC4wMCNSZXNwaXJhdGlvbiBhaXIgc3VwcGx5aW5nIHNlbGYgY29udGFpbmVkIGJyZWF0aGluZyBhcHBhcmF0dXMgKFNDQkEpIzQ2LjE4LjIwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIwLjA1LjAwI01hc2sgZmlsdGVycyM0Ni4xOC4yMC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wMC4wMCNBbnRpIHN0YXRpYyBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzQ2LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIxLjAxLjAwI0FudGlzdGF0aWMgd3Jpc3Qgc3RyYXBzIzQ2LjE4LjIxLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIxLjAyLjAwI0hlZWwgZ3JvdW5kaW5nIHN0cmFwcyM0Ni4xOC4yMS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wMy4wMCNHcm91bmRpbmcgaGFyZHdhcmUjNDYuMTguMjEuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjEuMDQuMDAjQW50aSBzdGF0aWMgZmxvb3IgbWF0cyM0Ni4xOC4yMS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wNS4wMCNBbnRpIHN0YXRpYyB3b3JrdGFibGUgbWF0cyM0Ni4xOC4yMS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wNi4wMCNBbnRpc3RhdGljIGJlbHRzIzQ2LjE4LjIxLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIxLjA3LjAwI0FudGlzdGF0aWMgbWFpbnRlbmFuY2Uga2l0cyM0Ni4xOC4yMS4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMS4wOC4wMCNBbnRpc3RhdGljIHRvZSBzdHJhcHMjNDYuMTguMjEuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjIuMDAuMDAjRXJnb25vbWljIHN1cHBvcnQgYWlkcyM0Ni4xOC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMi4wMS4wMCNCYWNrIHN1cHBvcnQgYmVsdHMjNDYuMTguMjIuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjIuMDIuMDAjRWxib3cgc3VwcG9ydHMjNDYuMTguMjIuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjIuMDMuMDAjQmFjayBzdXBwb3J0IHJlc3RzIzQ2LjE4LjIyLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIyLjA0LjAwI1dyaXN0IGJyYWNlcyM0Ni4xOC4yMi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMi4wNS4wMCNGb290IHJlc3RzIzQ2LjE4LjIyLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIyLjA2LjAwI1dyaXN0IHJlc3RzIzQ2LjE4LjIyLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIyLjA3LjAwI0Fua2xlIHN1cHBvcnRzIzQ2LjE4LjIyLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIyLjA4LjAwI1Nob2UgaW5zb2xlcyM0Ni4xOC4yMi4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMy4wMC4wMCNGYWxsIHByb3RlY3Rpb24jNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjMuMDEuMDAjTGlmZWxpbmVzIG9yIGxpZmVsaW5lIGVxdWlwbWVudCM0Ni4xOC4yMy4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMy4wMi4wMCNGYWxsIHByb3RlY3Rpb24gbGFueWFyZCM0Ni4xOC4yMy4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yMy4wMy4wMCNTYWZldHkgaGFybmVzcyB3aW5kZXJzIzQ2LjE4LjIzLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjIzLjA0LjAwI0FuY2hvcmFnZSBjb25uZWN0b3IjNDYuMTguMjMuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjMuMDUuMDAjU2VsZiByZXRyYWN0aW5nIGxhbnlhcmQjNDYuMTguMjMuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjQuMDAuMDAjRGVjb250YW1pbmF0aW9uIGFpZHMjNDYuMTguMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTguMjQuMDEuMDAjRGVjb250YW1pbmF0aW9uIHNob3dlciM0Ni4xOC4yNC4wMC4wMAotdW5zcHNjNyM0Ni4xOC4yNS4wMC4wMCNQZXJzb25hbCBzYWZldHkgZGV2aWNlcyBvciB3ZWFwb25zIzQ2LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ2LjE4LjI1LjAxLjAwI1JlcGVsbGVudHMgZm9yIGNhbmluZSBhdHRhY2tzIzQ2LjE4LjI1LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjAwLjAwLjAwI0ZpcmUgcHJvdGVjdGlvbiM0Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ni4xOS4xNS4wMC4wMCNGaXJlIHByZXZlbnRpb24jNDYuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTUuMDEuMDAjU21va2UgZGV0ZWN0b3JzIzQ2LjE5LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE1LjAyLjAwI0hlYXQgZGV0ZWN0b3JzIzQ2LjE5LjE1LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE1LjAzLjAwI0ZpcmUgcmVzaXN0YW50IGNvYXRpbmdzIG9yIHB1dHRpZXMgb3Igc2VhbGFudHMjNDYuMTkuMTUuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTYuMDAuMDAjRmlyZSBmaWdodGluZyBlcXVpcG1lbnQjNDYuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTYuMDEuMDAjRmlyZSBleHRpbmd1aXNoZXJzIzQ2LjE5LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE2LjAyLjAwI0ZpcmUgc3ByaW5rbGVyIHN5c3RlbXMjNDYuMTkuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTYuMDMuMDAjRmlyZSBob3NlcyBvciBub3p6bGVzIzQ2LjE5LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE2LjA0LjAwI0ZpcmUgYmxhbmtldHMjNDYuMTkuMTYuMDAuMDAKLXVuc3BzYzcjNDYuMTkuMTYuMDUuMDAjRmlyZSBzdXBwcmVzc2lvbiBoYW5kIHRvb2xzIzQ2LjE5LjE2LjAwLjAwCi11bnNwc2M3IzQ2LjE5LjE2LjA2LjAwI0ZpcmUgc3VwcHJlc3Npb24gZm9hbSBvciBzaW1pbGFyIGNvbXBvdW5kcyM0Ni4xOS4xNi4wMC4wMAotdW5zcHNjNyM0Ni4xOS4xNi4wNy4wMCNGaXJlIGJyZWF0aGluZyBhcHBhcmF0dXMjNDYuMTkuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMDAuMDAuMDAuMDAjQ2xlYW5pbmcgRXF1aXBtZW50IGFuZCBTdXBwbGllcyM0Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMC4wMC4wMC4wMCNXYXRlciBhbmQgd2FzdGV3YXRlciB0cmVhdG1lbnQgc3VwcGx5IGFuZCBkaXNwb3NhbCM0Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4wMC4wMCNXYXRlciB0cmVhdG1lbnQgYW5kIHN1cHBseSBlcXVpcG1lbnQjNDcuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMDEuMDAjQWN0aXZhdGVkIGNhcmJvbiBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMDIuMDAjQW1tb25pYSByZW1vdmFsIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4wMy4wMCNDYXJib24gZmlsdHJhdGlvbiBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMDQuMDAjQmFjdGVyaWFsIHJlbW92YWwgZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjA1LjAwI0NobG9yaW5lIGhhbmRsaW5nIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4wNi4wMCNDb3Jyb3Npb24gY29udHJvbCBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMDcuMDAjR3JpdCBjaGFtYmVycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4wOC4wMCNEZXNhbGluYXRpb24gZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjA5LjAwI0ZsdW9yaWRhdGlvbiBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMTAuMDAjSXJvbiByZW1vdmFsIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4xMS4wMCNJb24gZXhjaGFuZ2UgZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjEyLjAwI01peGVycyBvciBhZ2l0YXRvcnMjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMTMuMDAjT3h5Z2VuIGdlbmVyYXRvcnMjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMTQuMDAjV2F0ZXIgcHVyaWZpY2F0aW9uIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4xNi4wMCNUdXJiaWRpbWV0ZXJzIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjE3LjAwI1VsdHJhdmlvbGV0IGRpc2luZmVjdGlvbiBlcXVpcG1lbnQjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMTguMDAjV2F0ZXIgY29uZGl0aW9uZXJzIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjE5LjAwI1dhdGVyIHNvZnRlbmluZyBhY2Nlc3NvcmllcyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4yMS4wMCNVbHRyYWZpbHRyYXRpb24gZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjIyLjAwI1BhY2thZ2VkIHdhdGVyIHRyZWF0bWVudCBzeXN0ZW1zIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjIzLjAwI0NvbGxlY3Rpb24gdGFua3MjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMjQuMDAjU2x1ZGdlIG9yIHNld2FnZSBjb21wb3N0aW5nIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4yNS4wMCNEZXdhdGVyaW5nIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4yNi4wMCNTbHVkZ2UgcGVsbGV0aXplcnMjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMjcuMDAjU2x1ZGdlIHNocmVkZGVycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4yOC4wMCNXYXRlciB0cmVhdG1lbnQgZHJ5ZXJzIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjI5LjAwI0luY2luZXJhdG9ycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zMC4wMCNPZG9yIGNvbnRyb2wgZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjMxLjAwI1NlcHRpYyB0YW5rcyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zMi4wMCNTZXR0bGluZyB0YW5rcyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zMy4wMCNMaWZ0IHN0YXRpb25zIzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE1LjM0LjAwI1Nld2FnZSBkaXN0cmlidXRvcnMjNDcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTUuMzUuMDAjU2x1ZGdlIGRpc3Bvc2FsIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zNi4wMCNTbHVkZ2UgY29sbGVjdG9ycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zNy4wMCNTbHVkZ2UgY29uZGl0aW9uaW5nIGVxdWlwbWVudCM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zOC4wMCNTbHVkZ2Ugb3Igc2V3YWdlIGRpZ2VzdGVycyM0Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNS4zOS4wMCNTbHVkZ2Ugb3Igc2V3YWdlIHJlbW92YWwgZXF1aXBtZW50IzQ3LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjAwLjAwI1dhdGVyIHRyZWF0bWVudCBjb25zdW1hYmxlcyM0Ny4xMC4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wMS4wMCNBbGdhZWNpZGVzIzQ3LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjAyLjAwI0FudGlzY2FsYW50cyM0Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wMy4wMCNEZXNjYWxlcnMjNDcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTYuMDQuMDAjQm9pbGVyIGZlZWQgY2hlbWljYWxzIzQ3LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjA1LjAwI0JhY3RlcmlhbCByZW1vdmFsIGNoZW1pY2FscyM0Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wNi4wMCNDb3Jyb3Npb24gY29udHJvbCBjaGVtaWNhbHMjNDcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTYuMDcuMDAjT2RvciBjb250cm9sIGNoZW1pY2FscyM0Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wOC4wMCNGbG9jY3VsZW50cyM0Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMC4xNi4wOS4wMCNNaWNyb2Jpb2NpZGVzIzQ3LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjEwLjAwI1dhdGVyIHNvZnRlbmluZyBjb21wb3VuZHMjNDcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTAuMTYuMTEuMDAjRGVtdWxzaWZpZXJzIzQ3LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEwLjE2LjEyLjAwI1BvbHllbGVjdHJvbHl0ZXMjNDcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTEuMDAuMDAuMDAjSW5kdXN0cmlhbCBsYXVuZHJ5IGFuZCBkcnkgY2xlYW5pbmcgZXF1aXBtZW50IzQ3LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjExLjE1LjAwLjAwI1dhc2hpbmcgYW5kIGRyeWluZyBlcXVpcG1lbnQjNDcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTEuMTUuMDEuMDAjTGF1bmRyeSB0eXBlIGNvbWJpbmVkIHdhc2hpbmcgb3IgZHJ5aW5nIG1hY2hpbmVzIzQ3LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE1LjAyLjAwI0xhdW5kcnkgdHlwZSB3YXNoaW5nIG1hY2hpbmVzIzQ3LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE1LjAzLjAwI0Nsb3RoZXMgZHJ5ZXJzIzQ3LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE1LjA0LjAwI0xhdW5kcnkgdHlwZSBkcnlpbmcgbWFjaGluZXMjNDcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTEuMTUuMDUuMDAjTGF1bmRyeSBlcXVpcG1lbnQgc3RhbmRzIzQ3LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE2LjAwLjAwI0lyb25pbmcgZXF1aXBtZW50IzQ3LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjExLjE2LjAxLjAwI0lyb25pbmcgbWFjaGluZXMgb3IgcHJlc3NlcyM0Ny4xMS4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMS4xNi4wMi4wMCNGb2xkaW5nIG1hY2hpbmVzIzQ3LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE2LjAzLjAwI1N0ZWFtIHByZXNzaW5nIG1hY2hpbmVzIzQ3LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjExLjE3LjAwLjAwI0RyeSBjbGVhbmluZyBlcXVpcG1lbnQjNDcuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTEuMTcuMDEuMDAjRHJ5IGNsZWFuaW5nIG1hY2hpbmVzIzQ3LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjAwLjAwLjAwI0phbml0b3JpYWwgZXF1aXBtZW50IzQ3LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE1LjAwLjAwI0phbml0b3IgY2FydHMgYW5kIGFjY2Vzc29yaWVzIzQ3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE1LjAxLjAwI0phbml0b3IgY2FydHMjNDcuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTUuMDIuMDAjSmFuaXRvciBjYXJ0IGFjY2Vzc29yaWVzIzQ3LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE2LjAwLjAwI0Zsb29yIG1hY2hpbmVzIGFuZCBhY2Nlc3NvcmllcyM0Ny4xMi4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xNi4wMi4wMCNWYWN1dW0gY2xlYW5lcnMjNDcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTYuMDMuMDAjRmxvb3IgcG9saXNoZXJzIzQ3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE2LjA0LjAwI1dldCBvciBkcnkgY29tYmluYXRpb24gdmFjdXVtIGNsZWFuZXJzIzQ3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE2LjA1LjAwI0Zsb29yIHNjcnViYmVycyM0Ny4xMi4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xNi4wNi4wMCNDYXJwZXQgc3dlZXBlcnMjNDcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTYuMDcuMDAjVmFjdXVtIGNsZWFuZXIgc3VwcGxpZXMgb3IgYWNjZXNzb3JpZXMjNDcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTYuMDguMDAjRmxvb3IgbWFjaGluZSBwYWRzIzQ3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE2LjA5LjAwI0NhcnBldCBjbGVhbmluZyBlcXVpcG1lbnQjNDcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTYuMTAuMDAjRmxvb3Igd2FzaGluZyBtYWNoaW5lIzQ3LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjAwLjAwI1dhc3RlIGNvbnRhaW5lcnMgYW5kIGFjY2Vzc29yaWVzIzQ3LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjAxLjAwI1RyYXNoIGJhZ3MjNDcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTcuMDIuMDAjV2FzdGUgY29udGFpbmVycyBvciByaWdpZCBsaW5lcnMjNDcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTcuMDMuMDAjU21va2luZyB1cm5zIG9yIGFjY2Vzc29yaWVzIzQ3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjA0LjAwI1dhc3RlIGNvbnRhaW5lciBsaWRzIzQ3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjA1LjAwI1VybiBzYW5kIGJhZ3MjNDcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTcuMDYuMDAjQXNoIHRyYXlzIzQ3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE3LjA3LjAwI01vdGlvbiBzaWNrbmVzcyBiYWdzIzQ3LjEyLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjAwLjAwI0NsZWFuaW5nIGVxdWlwbWVudCM0Ny4xMi4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xOC4wMS4wMCNDbGVhbmluZyBkdXN0ZXJzIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjAyLjAwI0xpbnQgcmVtb3ZlcnMjNDcuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTIuMTguMDMuMDAjU3F1ZWVnZXMgb3Igd2FzaGVycyM0Ny4xMi4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xOC4wNC4wMCNDbGVhbmluZyBwYWlscyBvciBidWNrZXRzIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA1LjAwI1ByZXNzdXJlIG9yIHN0ZWFtIGNsZWFuZXJzIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA2LjAwI01vcCB3cmluZ2VyIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA3LjAwI0RyYWluIG9yIHRvaWxldCBwbHVuZ2VyIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA4LjAwI0RyYWluIG9yIHBpcGUgY2xlYW5pbmcgZXF1aXBtZW50IzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjA5LjAwI0RlZ3JlYXNpbmcgcGFucyM0Ny4xMi4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMi4xOC4xMC4wMCNDbGVhbmluZyByYWcgZGlzcGVuc2VyIzQ3LjEyLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEyLjE4LjExLjAwI0R1Y3QgY2xlYW5pbmcgbWFjaGluZXMjNDcuMTIuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMDAuMDAuMDAjQ2xlYW5pbmcgYW5kIGphbml0b3JpYWwgc3VwcGxpZXMjNDcuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTUuMDAuMDAjQ2xlYW5pbmcgcmFncyBhbmQgY2xvdGhzIGFuZCB3aXBlcyM0Ny4xMy4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNS4wMS4wMCNSYWdzIzQ3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE1LjAyLjAwI1dpcGVzIzQ3LjEzLjE1LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE2LjAwLjAwI0Jyb29tcyBhbmQgbW9wcyBhbmQgYnJ1c2hlcyBhbmQgYWNjZXNzb3JpZXMjNDcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTYuMDEuMDAjRHVzdCBicnVzaGVzIG9yIHBhbnMjNDcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTYuMDIuMDAjU2NvdXJpbmcgcGFkcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wMy4wMCNTcG9uZ2VzIzQ3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE2LjA0LjAwI0Jyb29tcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wNS4wMCNDbGVhbmluZyBicnVzaGVzIzQ3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE2LjA2LjAwI0R1c3QgbW9wcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wNy4wMCNXZXQgbW9wcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wOC4wMCNUb2lsZXQgYnJ1c2hlcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4wOS4wMCNCcm9vbSBvciBtb3AgaGFuZGxlcyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4xMC4wMCNGbG9vciBmaW5pc2ggYXBwbGljYXRvciM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4xMS4wMCNUcmFzaCBwaWNrZXIjNDcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTYuMTIuMDAjUmVwbGFjZW1lbnQgcnViYmVycyM0Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNi4xMy4wMCNNb3Agb3IgYnJvb20gaG9sZGVyIzQ3LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE2LjE0LjAwI0NsZWFuaW5nIGVxdWlwbWVudCBjbGFtcHMjNDcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTcuMDAuMDAjUmVzdHJvb20gc3VwcGxpZXMjNDcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTcuMDEuMDAjUGFwZXIgdG93ZWwgZGlzcGVuc2VycyM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNy4wMi4wMCNTYW5pdGFyeSBnb29kcyBkaXNwZW5zZXJzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjAzLjAwI1Nhbml0YXJ5IHdhc3RlIHJlY2VwdGFjbGVzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjA0LjAwI0luc3RpdHV0aW9uYWwgc29hcCBvciBsb3Rpb24gZGlzcGVuc2VycyM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNy4wNS4wMCNVcmluYWwgb3IgdG9pbGV0IGFjY2Vzc29yaWVzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjA2LjAwI0FpciBmcmVzaGVuZXIgZGlzcGVuc2VycyM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNy4wNy4wMCNJbnN0aXR1dGlvbmFsIGhhbmQgZHJ5ZXJzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjA4LjAwI0JhdGhyb29tIHRpc3N1ZSBkaXNwZW5zZXIjNDcuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTcuMDkuMDAjRmFjaWFsIHRpc3N1ZSBkaXNwZW5zZXJzIzQ3LjEzLjE3LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE3LjEwLjAwI1RvaWxldCB0aXNzdWUgZGlzcGVuc2VycyM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xNy4xMS4wMCNDbGVhbmVyIGRpc3BlbnNlciM0Ny4xMy4xNy4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wMC4wMCNDbGVhbmluZyBhbmQgZGlzaW5mZWN0aW5nIHNvbHV0aW9ucyM0Ny4xMy4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wMS4wMCNGbG9vciBjbGVhbmVycyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wMi4wMCNGbG9vciB3YXhlcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wMy4wMCNIb3VzZWhvbGQgZGlzaW5mZWN0YW50cyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wNC4wMCNBbW1vbmlhcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wNS4wMCNHZW5lcmFsIHB1cnBvc2UgY2xlYW5lcnMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMDYuMDAjRnVybml0dXJlIHBvbGlzaCBvciB3YXhlcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wNy4wMCNCbGVhY2hlcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wOC4wMCNEcnkgZ2VybWljaWRhbCM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4wOS4wMCNTaG9lIGNsZWFuaW5nIG9yIHBvbGlzaGluZyBwcm9kdWN0cyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xMC4wMCNEaXNod2FzaGluZyBwcm9kdWN0cyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xMS4wMCNMYXVuZHJ5IHByb2R1Y3RzIzQ3LjEzLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE4LjEyLjAwI0FpciBmcmVzaGVuZXIjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMTMuMDAjU2NyZWVuIGNsZWFuZXIjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMTQuMDAjTWV0YWwgY2xlYW5lcnMgb3IgcG9saXNoZXMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMTUuMDAjRHJhaW4gY2xlYW5lciM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xNi4wMCNEZW9kb3JpemVycyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xNy4wMCNIb3VzZWhvbGQgb3IgYXV0b21vdGl2ZSBwcm90ZWN0YW50cyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4xOC4wMCNBaXIgc2FuaXRpemVyIzQ3LjEzLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE4LjE5LjAwI0NhdXN0aWMgY2xlYW5lcnMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMjAuMDAjUGV0cm9sZXVtIGRlcml2YXRpdmUgY2xlYW5lcnMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMjEuMDAjRGVncmVhc2luZyBjb21wb3VuZHMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTguMjIuMDAjQ2FyYm9uIHJlbW92aW5nIGNvbXBvdW5kcyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4yMy4wMCNEZWljZXJzIGFuZCBkZWZyb3N0ZXJzIzQ3LjEzLjE4LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE4LjI0LjAwI0dsYXNzIG9yIHdpbmRvdyBjbGVhbmVycyM0Ny4xMy4xOC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOC4yNS4wMCNDb250YWN0IHN1cmZhY2UgY2xlYW5lcnMjNDcuMTMuMTguMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTkuMDAuMDAjQWJzb3JiZW50cyM0Ny4xMy4wMC4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wMS4wMCNNYXRzIzQ3LjEzLjE5LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE5LjAyLjAwI0dyYW51bGFyIGFic29yYmVudCM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wMy4wMCNQbHVnZ2luZyBjb21wb3VuZCM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wNC4wMCNBYnNvcmJlbnQgc29ja3MjNDcuMTMuMTkuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMTkuMDUuMDAjU3BpbGwga2l0cyM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wNi4wMCNQYW5zIzQ3LjEzLjE5LjAwLjAwCi11bnNwc2M3IzQ3LjEzLjE5LjA3LjAwI0Fic29yYmVudCBib29tcyM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4xOS4wOC4wMCNBYnNvcmJlbnQgcGlsbG93cyM0Ny4xMy4xOS4wMC4wMAotdW5zcHNjNyM0Ny4xMy4yMC4wMC4wMCNNYXRzIzQ3LjEzLjAwLjAwLjAwCi11bnNwc2M3IzQ3LjEzLjIxLjAwLjAwI0NsZWFuaW5nIGtpdHMjNDcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNDcuMTMuMjEuMDEuMDAjSW5kdXN0cmlhbCBjbGVhbmluZyBraXRzIzQ3LjEzLjIxLjAwLjAwCi11bnNwc2M3IzQ3LjEzLjIxLjAyLjAwI0dlbmVyYWwgcHVycG9zZSBjbGVhbmluZyBraXRzIzQ3LjEzLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjAwLjAwLjAwLjAwI1NlcnZpY2UgSW5kdXN0cnkgTWFjaGluZXJ5IGFuZCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIzQ4LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjAwLjAwLjAwI0luc3RpdHV0aW9uYWwgZm9vZCBzZXJ2aWNlcyBlcXVpcG1lbnQjNDguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDAuMDAjQ29va2luZyBhbmQgd2FybWluZyBlcXVpcG1lbnQjNDguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDEuMDAjQ29tbWVyY2lhbCB1c2UgYmFpbiBtYXJpZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDIuMDAjQ29tbWVyY2lhbCB1c2UgYmFyYmVxdWUgb3ZlbnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDMuMDAjQ29tbWVyY2lhbCB1c2UgYnJvaWxlcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDQuMDAjQ29tbWVyY2lhbCB1c2UgY2hhcmNvYWwgZ3JpbGxzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjA1LjAwI0NvbW1lcmNpYWwgdXNlIGNvZmZlZSBvciBpY2VkIHRlYSBtYWtlcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDYuMDAjQ29tbWVyY2lhbCB1c2UgY29mZmVlIHdhcm1lcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMDcuMDAjQ29tbWVyY2lhbCB1c2UgY29udmVjdGlvbiBvdmVucyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4wOC4wMCNDb21tZXJjaWFsIHVzZSBjb252ZXllciB0b2FzdGVycyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4wOS4wMCNDb21tZXJjaWFsIHVzZSBkZWVwIGZyeWVycyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4xMC4wMCNDb21tZXJjaWFsIHVzZSBmb29kIHdhcm1lcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTEuMDAjQ29tbWVyY2lhbCB1c2UgZ3JpZGRsZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTIuMDAjQ29tbWVyY2lhbCB1c2UgZ3JpbGxzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjEzLjAwI0NvbW1lcmNpYWwgdXNlIGhlYXQgbGFtcHMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTQuMDAjQ29tbWVyY2lhbCB1c2UgaGlnaCBwcmVzc3VyZSBzdGVhbWVycyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4xNS4wMCNDb21tZXJjaWFsIHVzZSBob3QgZG9nIGdyaWxscyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4xNi4wMCNDb21tZXJjaWFsIHVzZSBtaWNyb3dhdmUgb3ZlbnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTcuMDAjQ29tbWVyY2lhbCB1c2Ugb3ZlbnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMTguMDAjQ29tbWVyY2lhbCB1c2UgcGFzdGEgY29va2VycyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4xOS4wMCNDb21tZXJjaWFsIHVzZSBwaXp6YSBvdmVucyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4yMC4wMCNDb21tZXJjaWFsIHVzZSBwb3Bjb3JuIG1hY2hpbmVzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjIxLjAwI0NvbW1lcmNpYWwgdXNlIHJhbmdlcyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4yMi4wMCNDb21tZXJjaWFsIHVzZSByb3Rpc3NlcmllcyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4yMy4wMCNDb21tZXJjaWFsIHVzZSBzbW9rZXJzIG9yIHNtb2tlIG92ZW5zIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjI0LjAwI0NvbW1lcmNpYWwgdXNlIHN0ZWFtZXJzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjI1LjAwI0NvbW1lcmNpYWwgdXNlIHRvYXN0ZXJzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjI2LjAwI0NvbW1lcmNpYWwgdXNlIHdhZmZsZSBpcm9ucyM0OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNS4yNy4wMCNCYXJiZWN1ZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMjguMDAjQ29tbWVyY2lhbCB1c2UgY3JlcGUgbWFjaGluZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMjkuMDAjUHJlc3N1cmUgY29va2VycyBvciBwcmVzc3VyZSBmcnllcnMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTUuMzAuMDAjQ29tbWVyY2lhbCB1c2UgcmljZSBjb29rZXJzIzQ4LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE1LjMxLjAwI0NvbW1lcmNpYWwgc2FsbW9uIHBvYWNoZXJzIG9yIGtldHRsZXMjNDguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDAuMDAjRm9vZCBwcmVwYXJhdGlvbiBlcXVpcG1lbnQjNDguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDEuMDAjQ29tbWVyY2lhbCB1c2UgYmxlbmRlcnMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDIuMDAjQ29tbWVyY2lhbCB1c2UgZWxlY3RyaWMgY2FuIG9wZW5lcnMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDMuMDAjQ29tbWVyY2lhbCB1c2UgZm9vZCBjaG9wcGVycyBvciBjdWJlcnMgb3IgZGljZXJzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjA0LjAwI0NvbW1lcmNpYWwgdXNlIGNvZmZlZSBncmluZGVycyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4wNS4wMCNDb21tZXJjaWFsIHVzZSBmb29kIGdyaW5kZXJzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjA2LjAwI0NvbW1lcmNpYWwgdXNlIGdyYXRlcnMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDcuMDAjQ29tbWVyY2lhbCB1c2UganVpY2VycyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4wOC4wMCNDb21tZXJjaWFsIHVzZSBtaXhlcnMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMDkuMDAjQ29tbWVyY2lhbCB1c2UgcGFzdGEgbWFjaGluZXMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMTAuMDAjQ29tbWVyY2lhbCB1c2UgcGVlbGVycyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4xMS4wMCNDb21tZXJjaWFsIHVzZSBzY2FsZXMjNDguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTYuMTIuMDAjQ29tbWVyY2lhbCB1c2UgZm9vZCBwcm9jZXNzb3JzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjEzLjAwI0NvbW1lcmNpYWwgdXNlIGRvdWdoIG1hY2hpbmVzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjE0LjAwI0NvbW1lcmNpYWwgdXNlIGljaW5nIHNldHMgb3IgYmFncyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4xNS4wMCNDb21tZXJjaWFsIHVzZSBkaXNod2FzaGVycyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNi4xNi4wMCNDb21tZXJjaWFsIHVzZSBicmVhZCBzbGljZXJzIzQ4LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE2LjE3LjAwI0NvbW1lcmNpYWwgdXNlIHBsYXN0aWMgc2hvdmVscyM0OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNy4wMC4wMCNGb29kIGFuZCBiZXZlcmFnZSBkaXNwZW5zaW5nIGVxdWlwbWVudCM0OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNy4wMS4wMCNDYXJib25hdGVkIGJldmVyYWdlIGRpc3BlbnNlciM0OC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNy4wMi4wMCNOb24gY2FyYm9uYXRlZCBiZXZlcmFnZSBkaXNwZW5zZXIjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMDMuMDAjTWlsayBkaXNwZW5zZXJzIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjA0LjAwI1N5cnVwIHB1bXBzIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjA1LjAwI0NhcHB1Y2Npbm8gb3IgZXNwcmVzc28gbWFjaGluZXMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMDYuMDAjTWlsa3NoYWtlIG1hY2hpbmVzIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjA3LjAwI1NvZnQgc2VydmUgbWFjaGluZXMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMDguMDAjU2x1c2ggbWFjaGluZXMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMDkuMDAjSWNlIGRpc3BlbnNlcnMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMTAuMDAjRHJpbmtpbmcgZm91bnRhaW5zIG9yIGJ1YmJsZXJzIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjExLjAwI0JvdHRsZWQgd2F0ZXIgZGlzcGVuc2VycyBvciBhY2Nlc3NvcmllcyM0OC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OC4xMC4xNy4xMi4wMCNDdXAgZGlzcGVuc2VyIzQ4LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE3LjEzLjAwI0NvY2t0YWlsIHNoYWtlcnMgb3IgYWNjZXNzb3JpZXMjNDguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTcuMTQuMDAjSG90IHdhdGVyIGRpc3BlbnNlciM0OC4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wMC4wMCNDb29rd2FyZSBhbmQga2l0Y2hlbiB0b29scyM0OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wMS4wMCNDb21tZXJjaWFsIHVzZSBjdXRsZXJ5IzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjAyLjAwI0NvbW1lcmNpYWwgdXNlIG1vbGRzIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjAzLjAwI0NvbW1lcmNpYWwgdXNlIHNjb29wcyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wNC4wMCNDb21tZXJjaWFsIHVzZSBtZWFzdXJpbmcgY3VwcyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wNS4wMCNDb21tZXJjaWFsIHVzZSBtaXhpbmcgYm93bHMjNDguMTAuMTguMDAuMDAKLXVuc3BzYzcjNDguMTAuMTguMDYuMDAjQ29tbWVyY2lhbCB1c2UgY2FrZSBvciBwaWUgcGFucyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4wNy4wMCNDb21tZXJjaWFsIHVzZSBwaXp6YSBwYW5zIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjA4LjAwI0NvbW1lcmNpYWwgdXNlIHNhdWNlIG9yIHNhdXRlIHBhbnMjNDguMTAuMTguMDAuMDAKLXVuc3BzYzcjNDguMTAuMTguMDkuMDAjQ29tbWVyY2lhbCB1c2Ugc3RvY2sgb3Igc2F1Y2UgcG90cyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4xMC4wMCNDb21tZXJjaWFsIHVzZSBwb3Qgb3IgcGFuIGNvdmVycyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4xMS4wMCNDb21tZXJjaWFsIHVzZSByb2xsaW5nIHBpbnMjNDguMTAuMTguMDAuMDAKLXVuc3BzYzcjNDguMTAuMTguMTIuMDAjQ29tbWVyY2lhbCB1c2Ugc3RyYWluZXJzIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjEzLjAwI0NvbW1lcmNpYWwgdXNlIHdoaXNrcyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4xNC4wMCNDb21tZXJjaWFsIHVzZSB3b2tzIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjE1LjAwI0NvbW1lcmNpYWwgdXNlIGxhZGxlcyM0OC4xMC4xOC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOC4xNi4wMCNDb21tZXJjaWFsIHVzZSBjdXRsZXJ5IHBvdWNoIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE4LjE3LjAwI0Nha2UgZGVjb3JhdGluZyBlcXVpcG1lbnQgb3IgbW91bGRzIzQ4LjEwLjE4LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE5LjAwLjAwI1RhYmxldG9wIGFuZCBzZXJ2aW5nIGVxdWlwbWVudCM0OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4wMS4wMCNGb29kIHNlcnZpY2UgZGlubmVyd2FyZSM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4wMi4wMCNGb29kIHNlcnZpY2UgZmxhdHdhcmUjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDMuMDAjRm9vZCBzZXJ2aWNlIGdsYXNzZXMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDQuMDAjRm9vZCBzZXJ2aWNlIHN0ZW13YXJlIzQ4LjEwLjE5LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE5LjA1LjAwI0Zvb2Qgc2VydmljZSBjdXBzIG9yIG11Z3MjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDYuMDAjRm9vZCBzZXJ2aWNlIHNlcnZpbmcgYmFza2V0cyM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4wNy4wMCNGb29kIHNlcnZpY2UgcGl0Y2hlcnMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDguMDAjRm9vZCBzZXJ2aWNlIGNoYWZlcnMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMDkuMDAjRm9vZCBzZXJ2aWNlIGNvZmZlZSBvciB0ZWEgcG90cyM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4xMC4wMCNGb29kIHNlcnZpY2Ugc291cCBjcm9ja3MjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMTEuMDAjRm9vZCBzZXJ2aWNlIGljZSBidWNrZXRzIG9yIHdpbmUgY29vbGVycyM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4xMi4wMCNGb29kIHNlcnZpY2UgY29uZGltZW50IGRpc3BlbnNlcnMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMTMuMDAjRm9vZCBzZXJ2aWNlIHB1bmNoIGJvd2xzIzQ4LjEwLjE5LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE5LjE0LjAwI0Zvb2Qgc2VydmljZSB3aW5lIGNhcmFmZXMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMTkuMTUuMDAjRm9vZCBzZXJ2aWNlIHRyYXlzIzQ4LjEwLjE5LjAwLjAwCi11bnNwc2M3IzQ4LjEwLjE5LjE2LjAwI0Zvb2Qgc2VydmljZSBuYXBraW4gZGlzcGVuc2VycyM0OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM0OC4xMC4xOS4xNy4wMCNGb29kIHNlcnZpY2UgZm9uZHVlIHBvdHMjNDguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNDguMTAuMjAuMDAuMDAjUmVzdGF1cmFudCBmdXJuaXR1cmUjNDguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMjAuMDEuMDAjUmVzdGF1cmFudCBjaGFpcnMjNDguMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMjAuMDIuMDAjQm9vdGhzIzQ4LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIwLjAzLjAwI1NhbGFkIGJhcnMjNDguMTAuMjAuMDAuMDAKLXVuc3BzYzcjNDguMTAuMjAuMDQuMDAjVGFibGV0b3BzIzQ4LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIwLjA1LjAwI1Jlc3RhdXJhbnQgb3IgYmFyIHN0b29scyM0OC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4yMC4wNi4wMCNQZXJtYW5lbnQgYmFycyM0OC4xMC4yMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4yMC4wNy4wMCNQb3J0YWJsZSBiYXJzIzQ4LjEwLjIwLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjAwLjAwI1N0b3JhZ2UgYW5kIGhhbmRsaW5nIGVxdWlwbWVudCM0OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMC4yMS4wMS4wMCNEaXNwbGF5IGNhc2VzIzQ4LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjAyLjAwI0hlYXRlZCBkaXNwbGF5IGNhc2VzIzQ4LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjAzLjAwI1JlZnJpZ2VyYXRlZCBkaXNwbGF5IGNhc2VzIzQ4LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjA0LjAwI0ljZSBjcmVhbSBkaXNwbGF5IGNhc2VzIzQ4LjEwLjIxLjAwLjAwCi11bnNwc2M3IzQ4LjEwLjIxLjA1LjAwI0dsYXNzIGNoaWxsaW5nIGVxdWlwbWVudCM0OC4xMC4yMS4wMC4wMAotdW5zcHNjNyM0OC4xMC4yMS4wNi4wMCNDb29sIGNvbnRhaW5lcnMjNDguMTAuMjEuMDAuMDAKLXVuc3BzYzcjNDguMTEuMDAuMDAuMDAjVmVuZGluZyBtYWNoaW5lcyM0OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMC4wMC4wMCNMaXF1aWQgdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMC4wMS4wMCNNYWNoaW5lcyBkaXNwZW5zaW5nIHNpbmdsZSBzZXJ2aW5ncyB3aXRoIGN1cHMjNDguMTEuMTAuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTAuMDIuMDAjTWFjaGluZXMgZGlzcGVuc2luZyBidWxrIHF1YW50aXRpZXMjNDguMTEuMTAuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTEuMDAuMDAjUGllY2UgYW5kIHBhcnQgdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMS4wMS4wMCNCb3R0bGUgb3IgY2FuIHZlbmRpbmcgbWFjaGluZXMjNDguMTEuMTEuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTEuMDIuMDAjR3VtYmFsbCBjYW5keSBvciBjaGlsZHJlbnMgbm92ZWx0aWVzIG1hY2hpbmVzIzQ4LjExLjExLjAwLjAwCi11bnNwc2M3IzQ4LjExLjExLjAzLjAwI1NuYWNrIG9yIHNtYWxsIHBhY2thZ2UgZ29vZHMgZGlzcGxheSBtYWNoaW5lcyM0OC4xMS4xMS4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMS4wNC4wMCNBIGxhIGNhcnRlIGZvb2RzIHZlbmRpbmcgbWFjaGluZXMjNDguMTEuMTEuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTEuMDUuMDAjRnJvemVuIGNvbmZlY3Rpb25zIG1hY2hpbmVzIzQ4LjExLjExLjAwLjAwCi11bnNwc2M3IzQ4LjExLjExLjA2LjAwI1BlcnNvbmFsIGFjY29tbW9kYXRpb24gaXRlbSBkaXNwZW5zZXJzIzQ4LjExLjExLjAwLjAwCi11bnNwc2M3IzQ4LjExLjExLjA3LjAwI0NpZ2FyZXR0ZSBtYWNoaW5lcyM0OC4xMS4xMS4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMi4wMC4wMCNQcmVwYXJlZCB0byBvcmRlciBmb29kIHZlbmRpbmcgbWFjaGluZXMjNDguMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTIuMDEuMDAjRnJlbmNoIGZyeSB2ZW5kaW5nIG1hY2hpbmVzIzQ4LjExLjEyLjAwLjAwCi11bnNwc2M3IzQ4LjExLjEyLjAyLjAwI1BvcGNvcm4gdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4xMi4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMy4wMC4wMCNTZXJ2aWNlIGFuZCB0aWNrZXQgdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMy4wMS4wMCNUaWNrZXQgZGlzcGVuc2luZyBtYWNoaW5lcyM0OC4xMS4xMy4wMC4wMAotdW5zcHNjNyM0OC4xMS4xMy4wMi4wMCNJbnN1cmFuY2UgcG9saWN5IHZlbmRpbmcgbWFjaGluZXMjNDguMTEuMTMuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTMuMDMuMDAjU3RhbXAgbWFjaGluZXMjNDguMTEuMTMuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTQuMDAuMDAjQ3VycmVuY3kgdmVuZGluZyBtYWNoaW5lcyM0OC4xMS4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xNC4wMS4wMCNBdXRvbWF0aWMgdGVsbGVyIG1hY2hpbmVzIChBVE1zKSM0OC4xMS4xNC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xNC4wMi4wMCNCaWxsIHRvIGNvaW4gY2hhbmdlcnMjNDguMTEuMTQuMDAuMDAKLXVuc3BzYzcjNDguMTEuMTQuMDMuMDAjRm9yZWlnbiBjdXJyZW5jeSBleGNoYW5nZSBtYWNoaW5lcyM0OC4xMS4xNC4wMC4wMAotdW5zcHNjNyM0OC4xMS4xNC4wNC4wMCNFbGVjdHJvbmljIGZ1bmRzIHRyYW5zZmVyIHBvaW50IG9mIHNhbGUgZXF1aXBtZW50IzQ4LjExLjE0LjAwLjAwCi11bnNwc2M3IzQ4LjEyLjAwLjAwLjAwI0dhbWJsaW5nIG9yIHdhZ2VyaW5nIGVxdWlwbWVudCM0OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMi4xMS4wMC4wMCNDb2luIG9wZXJhdGVkIGdhbWJsaW5nIG1hY2hpbmVzIzQ4LjEyLjAwLjAwLjAwCi11bnNwc2M3IzQ4LjEyLjExLjAxLjAwI1Bva2VyIG9yIHNsb3QgbWFjaGluZXMjNDguMTIuMTEuMDAuMDAKLXVuc3BzYzcjNDguMTIuMTIuMDAuMDAjR2FtYmxpbmcgdGFibGVzIGFuZCBnYW1lcyM0OC4xMi4wMC4wMC4wMAotdW5zcHNjNyM0OC4xMi4xMi4wMS4wMCNSb3VsZXR0ZSB3aGVlbHMjNDguMTIuMTIuMDAuMDAKLXVuc3BzYzcjNDguMTIuMTIuMDIuMDAjQ2FyZCB0YWJsZXMjNDguMTIuMTIuMDAuMDAKLXVuc3BzYzcjNDguMTIuMTMuMDAuMDAjR2FtYmxpbmcgbWFuYWdlbWVudCBhbmQgbmV0d29ya2VkIHdhZ2VyaW5nIHN5c3RlbXMjNDguMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDguMTIuMTMuMDEuMDAjVGFibGUgZ2FtYmxpbmcgbWFuYWdlbWVudCBzeXN0ZW1zIzQ4LjEyLjEzLjAwLjAwCi11bnNwc2M3IzQ4LjEyLjEzLjAyLjAwI05ldHdvcmtlZCB3YWdlcmluZyBnYW1lcyM0OC4xMi4xMy4wMC4wMAotdW5zcHNjNyM0OS4wMC4wMC4wMC4wMCNTcG9ydHMgYW5kIFJlY3JlYXRpb25hbCBFcXVpcG1lbnQgYW5kIFN1cHBsaWVzIGFuZCBBY2Nlc3NvcmllcyM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMC4wMC4wMC4wMCNDb2xsZWN0aWJsZXMgYW5kIGF3YXJkcyM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNS4wMC4wMCNBcnQjNDkuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMDEuMDAjUGFpbnRpbmdzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjAyLjAwI1NjdWxwdHVyZXMjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMDMuMDAjU3RhdHVhcnkjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMDQuMDAjUG9ydHJhaXRzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjA1LjAwI0RyYXdpbmdzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjA2LjAwI1BpY3R1cmVzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjA3LjAwI0xpdGhvZ3JhcGhzIzQ5LjEwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE1LjA4LjAwI1Bvc3RlcnMjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMDkuMDAjRGVjb3JhdGl2ZSBwb3QjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTUuMTAuMDAjU2Nyb2xscyM0OS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNS4xMS4wMCNQaG90b2dyYXBocyM0OS4xMC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNS4xMi4wMCNGbG93ZXIgdmFzZXMjNDkuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMDAuMDAjQ29sbGVjdGlibGVzIzQ5LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjAxLjAwI0FudGlxdWVzIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjAyLjAwI1NvdXZlbmlycyM0OS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNi4wMy4wMCNNaW50IGNvaW4gY29sbGVjdGlvbnMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMDQuMDAjU3RhbXAgY29sbGVjdGlvbnMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMDUuMDAjQW50aXF1ZSBydWdzIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjA2LjAwI0RpZ2dpbmdzIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjA3LjAwI0NvbWljIGJvb2sgY29sbGVjdGlvbnMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMDguMDAjQW50aXF1ZSBtdXNpY2FsIGluc3RydW1lbnRzIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjA5LjAwI09ybmFtZW50cyBvciBkZWNvcmF0aW9ucyM0OS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNi4xMC4wMCNLZXkgY2hhaW5zIzQ5LjEwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE2LjExLjAwI0NoYXJtcyM0OS4xMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNi4xMi4wMCNIb2xvZ3JhbXMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTYuMTMuMDAjR2xhc3MgY3J5c3RhbHMjNDkuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTcuMDAuMDAjQXdhcmRzIzQ5LjEwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjAxLjAwI01lZGFscyM0OS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNy4wMi4wMCNUcm9waGllcyM0OS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMC4xNy4wMy4wMCNNZWRhbGxpb25zIzQ5LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjA0LjAwI1BsYXF1ZXMjNDkuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTAuMTcuMDUuMDAjQ2VydGlmaWNhdGVzIzQ5LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjA2LjAwI1Bob3RvIGF3YXJkIzQ5LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjA3LjAwI0FjaGlldmVtZW50IGNlcnRpZmljYXRlIzQ5LjEwLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjEwLjE3LjA4LjAwI0Nyb3ducyM0OS4xMC4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMS4wMC4wMC4wMCNNdXNpY2FsIGluc3RydW1lbnRzIzQ5LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE1LjAwLjAwI0tleWJvYXJkIGluc3RydW1lbnRzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE1LjAxLjAwI011c2ljYWwgb3JnYW5zIzQ5LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE1LjAyLjAwI0FjY29yZGlvbnMjNDkuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTUuMDMuMDAjUGlhbm9zIzQ5LjExLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE2LjAwLjAwI0JyYXNzIGluc3RydW1lbnRzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE2LjAxLjAwI1RydW1wZXRzIzQ5LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE2LjAyLjAwI1Ryb21ib25lcyM0OS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMS4xNi4wMy4wMCNTb3VzYXBob25lcyM0OS4xMS4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMS4xNi4wNC4wMCNTYXhvcGhvbmVzIzQ5LjExLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE2LjA1LjAwI1doaXN0bGUjNDkuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTcuMDAuMDAjV29vZHdpbmQgaW5zdHJ1bWVudHMjNDkuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTcuMDEuMDAjQ2xhcmluZXRzIzQ5LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE3LjAyLjAwI09ib2VzIzQ5LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE3LjAzLjAwI011c2ljYWwgZmx1dGVzIzQ5LjExLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE3LjA0LjAwI1BpY2NvbG9lcyM0OS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMS4xNy4wNS4wMCNNdXNpY2FsIGNvcm5ldHMjNDkuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTcuMDYuMDAjQmFncGlwZXMjNDkuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTcuMDcuMDAjSGFybW9uaWNhcyM0OS4xMS4xNy4wMC4wMAotdW5zcHNjNyM0OS4xMS4xNy4wOC4wMCNLYXpvb3MjNDkuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTguMDAuMDAjU3RyaW5nIGluc3RydW1lbnRzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE4LjAxLjAwI0hhcnBzaWNob3JkcyM0OS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4xMS4xOC4wMi4wMCNDbGF2aWNob3JkcyM0OS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4xMS4xOC4wMy4wMCNHdWl0YXJzIzQ5LjExLjE4LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE4LjA0LjAwI1Zpb2xpbnMjNDkuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTguMDUuMDAjSGFycHMjNDkuMTEuMTguMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTguMDYuMDAjQmFuam9lcyM0OS4xMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4xMS4xOS4wMC4wMCNQZXJjdXNzaW9uIGluc3RydW1lbnRzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjE5LjAxLjAwI0N5bWJhbHMjNDkuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTkuMDIuMDAjQmVsbHMjNDkuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTkuMDMuMDAjVGFtYm91cmluZXMjNDkuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTkuMDQuMDAjQ2FzdGFuZXRzIzQ5LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE5LjA1LjAwI0RydW1zIzQ5LjExLjE5LjAwLjAwCi11bnNwc2M3IzQ5LjExLjE5LjA2LjAwI1h5bG9waG9uZXMjNDkuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMTkuMDcuMDAjQm9kaHJhbiM0OS4xMS4xOS4wMC4wMAotdW5zcHNjNyM0OS4xMS4yMC4wMC4wMCNNdXNpY2FsIGluc3RydW1lbnQgcGFydHMgYW5kIGFjY2Vzc29yaWVzIzQ5LjExLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjIwLjAxLjAwI01ldHJvbm9tZXMjNDkuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMjAuMDIuMDAjUmVlZHMjNDkuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMjAuMDMuMDAjSW5zdHJ1bWVudCBzdHJpbmdzIG9yIHBpY2tzIzQ5LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjIwLjA0LjAwI1R1bmluZyBwaW5zIzQ5LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ5LjExLjIwLjA1LjAwI011c2ljYWwgaW5zdHJ1bWVudCBzdGFuZHMgb3Igc2hlZXQgaG9sZGVycyM0OS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0OS4xMS4yMC4wNi4wMCNBY2Nlc3NvcmllcyBmb3Igc3RyaW5nZWQgaW5zdHJ1bWVudHMjNDkuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNDkuMTEuMjAuMDcuMDAjUGVyY3Vzc2lvbiBpbnN0cnVtZW50IGFjY2Vzc29yeSM0OS4xMS4yMC4wMC4wMAotdW5zcHNjNyM0OS4xMS4yMC4wOC4wMCNNdXNpYyBib3hlcyBvciBtZWNoYW5pc21zIzQ5LjExLjIwLjAwLjAwCi11bnNwc2M3IzQ5LjEyLjAwLjAwLjAwI0NhbXBpbmcgYW5kIG91dGRvb3IgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMi4xNS4wMC4wMCNDYW1waW5nIGFuZCBvdXRkb29yIGVxdWlwbWVudCM0OS4xMi4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMi4xNS4wMS4wMCNUYXJwYXVsaW5zIzQ5LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE1LjAyLjAwI1NsZWVwaW5nIHBhZHMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTUuMDMuMDAjVGVudHMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTUuMDQuMDAjU2xlZXBpbmcgYmFncyM0OS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMi4xNS4wNS4wMCNJY2UgY2hlc3RzIzQ5LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE1LjA2LjAwI1RlbnQgcmVwYWlyIGtpdHMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTUuMDcuMDAjUG5ldW1hdGljIG1hdHRyZXNzZXMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTUuMDguMDAjTW9zcXVpdG8gbmV0cyM0OS4xMi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMi4xNS4wOS4wMCNDYW1waW5nIG9yIG91dGRvb3Igc3RvdmVzIzQ5LjEyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE1LjEwLjAwI0RyaW5rIGNvb2xlcnMjNDkuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTYuMDAuMDAjQ2FtcGluZyBmdXJuaXR1cmUjNDkuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTIuMTYuMDEuMDAjQ2FtcGluZyBjaGFpcnMgb3Igc3Rvb2xzIzQ5LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE2LjAyLjAwI0NhbXBpbmcgdGFibGVzIzQ5LjEyLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEyLjE2LjAzLjAwI0NhbXBpbmcgY290cyM0OS4xMi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMy4wMC4wMC4wMCNGaXNoaW5nIGFuZCBodW50aW5nIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNS4wMC4wMCNGaXNoaW5nIHRhY2tsZSM0OS4xMy4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNS4wMS4wMCNGaXNoaW5nIHJvZHMjNDkuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTUuMDIuMDAjRmlzaGluZyBsaW5lIzQ5LjEzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE1LjAzLjAwI0Zpc2hpbmcgcmVlbHMjNDkuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTUuMDQuMDAjRmlzaGluZyBsdXJlcyM0OS4xMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNS4wNS4wMCNGaXNoaW5nIGJhaXQjNDkuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTUuMDYuMDAjRmlzaGluZyB3ZWlnaHRzIG9yIHNpbmtlcnMjNDkuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTYuMDAuMDAjSHVudGluZyBwcm9kdWN0cyM0OS4xMy4wMC4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNi4wMS4wMCNBbmltYWwgY2FsbHMjNDkuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTMuMTYuMDIuMDAjU3BvcnRpbmcgZGVjb3lzIzQ5LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE2LjAzLjAwI1Nwb3J0aW5nIHRyYXBzIzQ5LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE2LjA0LjAwI1Nwb3J0aW5nIHNob3RndW5zIzQ5LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE2LjA1LjAwI1Nwb3J0aW5nIHJpZmxlcyM0OS4xMy4xNi4wMC4wMAotdW5zcHNjNyM0OS4xMy4xNi4wNi4wMCNTcG9ydGluZyBhbW11bml0aW9uIzQ5LjEzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjEzLjE2LjA3LjAwI0d1biBiYXJyZWwjNDkuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMDAuMDAuMDAjV2F0ZXJzcG9ydHMgZXF1aXBtZW50IzQ5LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE1LjAwLjAwI1NjdWJhIGFuZCBzbm9ya2VsaW5nIGdlYXIjNDkuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTUuMDEuMDAjQm91eWFuY3kgY29tcGVuc2F0b3JzIzQ5LjE0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE1LjAyLjAwI1NjdWJhIHRhbmtzIzQ5LjE0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE1LjAzLjAwI1NjdWJhIHJlZ3VsYXRvcnMjNDkuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTUuMDQuMDAjRGl2aW5nIGluc3RydW1lbnRzIG9yIGFjY2Vzc29yaWVzIzQ5LjE0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE1LjA1LjAwI01hc2tzIG9yIGZpbnMgb3Igc25vcmtlbHMjNDkuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTUuMDYuMDAjV2V0c3VpdHMjNDkuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTUuMDcuMDAjRHJ5c3VpdHMjNDkuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTYuMDAuMDAjU3VyZiBhbmQgc3dpbSBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzQ5LjE0LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE2LjAyLjAwI1dha2Vib2FyZHMgb3Iga25lZWJvYXJkcyBvciBib29naWVib2FyZHMjNDkuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTYuMDMuMDAjV2F0ZXIgc2tpcyBvciBhY2Nlc3NvcmllcyM0OS4xNC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNC4xNi4wNC4wMCNXaW5kc3VyZmluZyBlcXVpcG1lbnQjNDkuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTQuMTYuMDUuMDAjU3VyZmJvYXJkcyM0OS4xNC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNC4xNi4wNi4wMCNTd2ltIGdvZ2dsZXMgb3Igc3dpbSBmaW5zIzQ5LjE0LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE0LjE2LjA3LjAwI1BhcmFzYWlsaW5nIGVxdWlwbWVudCM0OS4xNC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNS4wMC4wMC4wMCNXaW50ZXIgc3BvcnRzIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNS4xNS4wMC4wMCNTa2lpbmcgYW5kIHNub3dib2FyZGluZyBlcXVpcG1lbnQjNDkuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTUuMDEuMDAjU2tpIGJvb3RzIzQ5LjE1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE1LjE1LjAyLjAwI1NraXMjNDkuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTUuMDMuMDAjU2tpIHBvbGVzIzQ5LjE1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE1LjE1LjA0LjAwI0JpbmRpbmdzIzQ5LjE1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE1LjE1LjA1LjAwI1Nub3dib2FyZHMjNDkuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTYuMDAuMDAjU2thdGluZyBhbmQgaWNlIGhvY2tleSBlcXVpcG1lbnQjNDkuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTYuMDEuMDAjSG9ja2V5IHB1Y2tzIzQ5LjE1LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE1LjE2LjAyLjAwI0ljZSBza2F0ZXMjNDkuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTUuMTYuMDMuMDAjSG9ja2V5IHN0aWNrcyM0OS4xNS4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4wMC4wMC4wMCNGaWVsZCBhbmQgY291cnQgc3BvcnRzIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4wMC4wMCNGaWVsZCBzcG9ydHMgZXF1aXBtZW50IzQ5LjE2LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjAxLjAwI0Zvb3RiYWxsIGJsb2NraW5nIHNsZWRzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjAyLjAwI0Jhc2ViYWxsIGdsb3ZlcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4wMy4wMCNCYXNlYmFsbHMjNDkuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTUuMDQuMDAjRm9vdGJhbGxzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjA1LjAwI1NvY2NlciBiYWxscyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4wNi4wMCNCYXNlYmFsbCBiYXRzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjA3LjAwI0Jhc2ViYWxsIGJhc2VzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjA4LjAwI1BpdGNoaW5nIG1hY2hpbmVzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjA5LjAwI1NvZnRiYWxscyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xMC4wMCNGb290YmFsbCB0YWNrbGluZyBkdW1taWVzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjExLjAwI0xhY3Jvc3NlIHN0aWNrcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xMi4wMCNMYWNyb3NzZSBiYWxscyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xMy4wMCNGaWVsZCBob2NrZXkgc3RpY2tzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjE0LjAwI0ZpZWxkIGhvY2tleSBiYWxscyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xNS4wMCNUZWFtIGhhbmRiYWxsIGJhbGxzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjE2LjAwI1RlYW0gaGFuZGJhbGwgc2Nob29sIHNldHMjNDkuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTUuMTcuMDAjQmFzZWJhbGwgb3Igc29mdGJhbGwgcHJvdGVjdGl2ZSBnZWFyIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjE4LjAwI0Jhc2ViYWxsIGJhdHRpbmcgYWlkcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4xOS4wMCNCYXNlYmFsbCBiYWNrc3RvcHMgb3IgZmVuY2VzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjIwLjAwI1NvZnRiYWxsIGJhdHMjNDkuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTUuMjEuMDAjU29mdGJhbGwgZ2xvdmVzIzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjIyLjAwI0Zvb3RiYWxsIGtpY2tpbmcgdGVlcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4yMy4wMCNGbGFnIGZvb3RiYWxsIGdlYXIjNDkuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTUuMjQuMDAjU29jY2VyIGZpZWxkIG1hcmtpbmcgZXF1aXBtZW50IzQ5LjE2LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE1LjI1LjAwI1NvY2NlciBwcm90ZWN0aXZlIGVxdWlwbWVudCM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNS4yNi4wMCNTb2NjZXIgdHJhaW5pbmcgYWlkcyM0OS4xNi4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4wMC4wMCNSYWNxdWV0IGFuZCBjb3VydCBzcG9ydHMgZXF1aXBtZW50IzQ5LjE2LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjAxLjAwI1JhY3F1ZXRiYWxsIHJhY2tldHMjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMDIuMDAjQmFkbWludG9uIHJhY2tldHMjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMDMuMDAjQmFza2V0YmFsbHMjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMDQuMDAjVGVubmlzIGJhbGxzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjA1LjAwI1JhY3F1ZXQgYmFsbHMjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMDYuMDAjU3F1YXNoIGJhbGxzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjA3LjAwI1Rlbm5pcyByYWNxdWV0cyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4wOC4wMCNWb2xsZXliYWxscyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4wOS4wMCNCYWRtaW50b24gYmlyZGllcyBvciBzaHV0dGxlY29ja3MjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMTAuMDAjU3F1YXNoIHJhY3F1ZXRzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjExLjAwI1Rlbm5pcyB0cmFpbmluZyBhaWRzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjEyLjAwI1Rlbm5pcyBjb3VydCBlcXVpcG1lbnQjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMTMuMDAjVm9sbGV5YmFsbCBzdG9yYWdlIGZvciBiYWxscyBvciBuZXRzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjE0LjAwI1ZvbGxleWJhbGwgZ3ltbmFzaXVtIHN0YW5kYXJkcyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4xNS4wMCNCYXNrZXRiYWxsIGNvbXBsZXRlIGdhbWUgc3lzdGVtcyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNi4xNi4wMCNGbG9vciBob2NrZXkgcHJvdGVjdGl2ZSBlcXVpcG1lbnQjNDkuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTYuMTcuMDAjVGV0aGVyIHBvbGVzIzQ5LjE2LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE2LjE4LjAwI1RldGhlciBiYWxscyM0OS4xNi4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNy4wMC4wMCNUcmFjayBzcG9ydHMgZXF1aXBtZW50IzQ5LjE2LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE3LjAxLjAwI0phdmVsaW5zIzQ5LjE2LjE3LjAwLjAwCi11bnNwc2M3IzQ5LjE2LjE3LjAyLjAwI0p1bXBpbmcgYmFycyM0OS4xNi4xNy4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNy4wMy4wMCNEaXNjdXMjNDkuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTcuMDQuMDAjU2hvdHB1dHMjNDkuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTcuMDUuMDAjVmF1bHRpbmcgcG9sZXMjNDkuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTYuMTcuMDYuMDAjSHVyZGxlcyM0OS4xNi4xNy4wMC4wMAotdW5zcHNjNyM0OS4xNi4xNy4wNy4wMCNCYXRvbnMjNDkuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMDAuMDAuMDAjR3ltbmFzdGljcyBhbmQgYm94aW5nIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNS4wMC4wMCNHeW1uYXN0aWNzIGVxdWlwbWVudCM0OS4xNy4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNS4wMS4wMCNHeW1uYXN0aWMgYmFycyBvciBiZWFtcyM0OS4xNy4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNS4wMi4wMCNHeW1uYXN0aWMgcm9wZXMgb3IgcmluZ3Mgb3IgY2xpbWJpbmcgYWNjZXNzb3JpZXMjNDkuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMTUuMDMuMDAjR3ltbmFzdGljIHZhdWx0aW5nIGVxdWlwbWVudCM0OS4xNy4xNS4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNS4wNC4wMCNHeW1uYXN0aWMgdHJhbXBvbGluZXMjNDkuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMTUuMDUuMDAjQmFsYW5jZSBlcXVpcG1lbnQjNDkuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMTYuMDAuMDAjQm94aW5nIGVxdWlwbWVudCM0OS4xNy4wMC4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNi4wMS4wMCNCb3hpbmcgcmluZ3MjNDkuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTcuMTYuMDIuMDAjUHVuY2hpbmcgYmFncyM0OS4xNy4xNi4wMC4wMAotdW5zcHNjNyM0OS4xNy4xNi4wMy4wMCNCb3hpbmcgZ2xvdmVzIzQ5LjE3LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjAwLjAwLjAwI1RhcmdldCBhbmQgdGFibGUgZ2FtZXMgYW5kIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4wMC4wMCNUYWJsZSBnYW1lcyBhbmQgZXF1aXBtZW50IzQ5LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjAxLjAwI0JpbGxpYXJkIHRhYmxlcyM0OS4xOC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4wMi4wMCNQb29sIGN1ZXMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMDMuMDAjU2h1ZmZsZWJvYXJkIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjA0LjAwI1BpbmJhbGwgZ2FtZXMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMDUuMDAjQmlsbGlhcmQgYmFsbHMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMDYuMDAjQWlyIGhvY2tleSB0YWJsZXMgb3IgYWNjZXNzb3JpZXMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMDcuMDAjVGVubmlzIHRhYmxlcyM0OS4xOC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4wOC4wMCNUYWJsZSB0ZW5uaXMgcGFkZGxlcyM0OS4xOC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4wOS4wMCNUYWJsZSB0ZW5uaXMgYmFsbHMjNDkuMTguMTUuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTUuMTAuMDAjRm9vc2JhbGwgdGFibGVzIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjExLjAwI0Zvb3NiYWxscyM0OS4xOC4xNS4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNS4xMi4wMCNGb29zYmFsbCByZXBsYWNlbWVudCBwbGF5ZXJzIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjEzLjAwI0JpbGxpYXJkIGN1ZSB0aXBzIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjE0LjAwI0JpbGxpYXJkIGNoYWxrIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE1LjE1LjAwI0JpbGxpYXJkIHJhY2tzIzQ5LjE4LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE2LjAwLjAwI1RhcmdldCBnYW1lcyBhbmQgZXF1aXBtZW50IzQ5LjE4LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE2LjAxLjAwI0FyY2hlcnkgdGFyZ2V0cyM0OS4xOC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNi4wMi4wMCNBcmNoZXJ5IGJvd3MjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDMuMDAjQXJjaGVyeSBhcnJvd3MjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDQuMDAjRGFydHMjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDUuMDAjRGFydCBib2FyZHMjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDYuMDAjVHJhcHNob290aW5nIGVxdWlwbWVudCM0OS4xOC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNi4wNy4wMCNUaHJvd2luZyB0YXJnZXRzIzQ5LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE2LjA4LjAwI0FyY2hlcnkgYm93IHN0cmluZ3MjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMDkuMDAjQXJjaGVyeSBnbG92ZXMjNDkuMTguMTYuMDAuMDAKLXVuc3BzYzcjNDkuMTguMTYuMTAuMDAjQXJjaGVyeSBhcm0gZ3VhcmRzIzQ5LjE4LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjE4LjE2LjExLjAwI0FyY2hlcnkgdGFyZ2V0IHN0YW5kcyM0OS4xOC4xNi4wMC4wMAotdW5zcHNjNyM0OS4xOC4xNi4xMi4wMCNBcmNoZXJ5IGJhY2tzdG9wcyM0OS4xOC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMC4wMC4wMC4wMCNGaXRuZXNzIGVxdWlwbWVudCM0OS4wMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNS4wMC4wMCNBZXJvYmljIHRyYWluaW5nIGVxdWlwbWVudCM0OS4yMC4wMC4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNS4wMS4wMCNUcmVhZG1pbGxzIzQ5LjIwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE1LjAyLjAwI1N0YWlyIGNsaW1iZXJzIzQ5LjIwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE1LjAzLjAwI1N0YXRpb25hcnkgYmljeWNsZXMjNDkuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTUuMDQuMDAjUm93aW5nIG1hY2hpbmVzIzQ5LjIwLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE1LjEyLjAwI0p1bXAgcm9wZXMjNDkuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTUuMTMuMDAjRXhlcmNpc2UgdHJhbXBvbGluZXMjNDkuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTUuMTQuMDAjRXhlcmNpc2UgYmFsbHMjNDkuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTUuMTUuMDAjU3RlcCBhZXJvYmljIGVxdWlwbWVudCM0OS4yMC4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNi4wMC4wMCNXZWlnaHQgYW5kIHJlc2lzdGFuY2UgdHJhaW5pbmcgZXF1aXBtZW50IzQ5LjIwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE2LjAxLjAwI0R1bWJiZWxscyM0OS4yMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNi4wMi4wMCNCYXJiZWxscyM0OS4yMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNi4wMy4wMCNMb3dlciBib2R5IHJlc2lzdGFuY2UgbWFjaGluZXMjNDkuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTYuMDQuMDAjV2VpZ2h0IGJlbmNoZXMgb3IgcmFja3MjNDkuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTYuMDUuMDAjVXBwZXIgYm9keSByZXNpc3RhbmNlIG1hY2hpbmVzIzQ5LjIwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE2LjA2LjAwI0ZpdG5lc3Mgd2VpZ2h0cyM0OS4yMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMC4xNi4wNy4wMCNQaWxhdGVzIG1hY2hpbmVzIzQ5LjIwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE2LjA4LjAwI0dyaXAgc3RyZW5ndGhlbmVyIzQ5LjIwLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIwLjE2LjA5LjAwI1Jlc2lzdGFuY2UgYmFuZHMjNDkuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjAuMTYuMTAuMDAjUmVzaXN0YW5jZSB0dWJlcyM0OS4yMC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMS4wMC4wMC4wMCNPdGhlciBzcG9ydHMjNDkuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTYuMDAuMDAjR29sZiBlcXVpcG1lbnQjNDkuMjEuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTYuMDEuMDAjR29sZiBiYWdzIzQ5LjIxLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE2LjAyLjAwI0dvbGYgYmFsbHMjNDkuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTYuMDMuMDAjR29sZiBjbHVicyM0OS4yMS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMS4xNi4wNC4wMCNHb2xmIHRlZXMjNDkuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTYuMDUuMDAjR29sZiBjbHViIGhlYWQgY292ZXJzIzQ5LjIxLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE2LjA2LjAwI0dvbGYgZ2xvdmVzIzQ5LjIxLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE2LjA3LjAwI0Rpdm90IGZpeGVycyM0OS4yMS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMS4xNy4wMC4wMCNCb3dsaW5nIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzQ5LjIxLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE3LjAxLjAwI0Jvd2xpbmcgZXF1aXBtZW50IzQ5LjIxLjE3LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE3LjAyLjAwI0Jvd2xpbmcgc3VwcGxpZXMjNDkuMjEuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTcuMDMuMDAjQm93bGluZyBhY2Nlc3NvcmllcyM0OS4yMS4xNy4wMC4wMAotdW5zcHNjNyM0OS4yMS4xOC4wMC4wMCNQaHlzaWNhbCBlZHVjYXRpb24gY2xhc3Nyb29tIGVxdWlwbWVudCM0OS4yMS4wMC4wMC4wMAotdW5zcHNjNyM0OS4yMS4xOC4wMS4wMCNQYXJhY2h1dGUgZXF1aXBtZW50IzQ5LjIxLjE4LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE4LjAyLjAwI0h1bGEgaG9vcHMgb3IgaG9vcCBlcXVpcG1lbnQjNDkuMjEuMTguMDAuMDAKLXVuc3BzYzcjNDkuMjEuMTguMDMuMDAjT3JpZW50ZWVyaW5nIGVxdWlwbWVudCM0OS4yMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4yMS4xOC4wNC4wMCNUZWFtIGlkZW50aWZpY2F0aW9uIG1hdGVyaWFscyBvciBtYXJrZXJzIzQ5LjIxLjE4LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE4LjA1LjAwI0xhbnlhcmRzIzQ5LjIxLjE4LjAwLjAwCi11bnNwc2M3IzQ5LjIxLjE4LjA2LjAwI1BoeXNpY2FsIGVkdWNhdGlvbiBlcXVpcG1lbnQgc3RvcmFnZSM0OS4yMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4yMS4xOC4wNy4wMCNQaHlzaWNhbCBlZHVjYXRpb24gYXNzZXNzbWVudCB0b29scyM0OS4yMS4xOC4wMC4wMAotdW5zcHNjNyM0OS4yMi4wMC4wMC4wMCNTcG9ydHMgYWNjZXNzb3JpZXMjNDkuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDAuMDAjU3BvcnQgYWNjZXNzb3JpZXMjNDkuMjIuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDEuMDAjU3BvcnQgc2NvcmVib2FyZHMjNDkuMjIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDIuMDAjU3BvcnQgZ29hbHMjNDkuMjIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDMuMDAjU3BvcnQgc2FmZXR5IGVxdWlwbWVudCBvdGhlciB0aGFuIGhlYWRnZWFyIzQ5LjIyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIyLjE1LjA0LjAwI1Nwb3J0IHNhZmV0eSBoZWFkZ2VhciM0OS4yMi4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMi4xNS4wNS4wMCNTcG9ydCBuZXRzIG9yIG5ldHRpbmcjNDkuMjIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDYuMDAjU3BvcnQgbWF0cyBvciBwYWRkaW5nIzQ5LjIyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIyLjE1LjA3LjAwI0Jhc2tldGJhbGwgYmFja2JvYXJkcyM0OS4yMi4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMi4xNS4wOC4wMCNCYXNrZXRiYWxsIGhvb3AjNDkuMjIuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjIuMTUuMDkuMDAjUm9sbGVyIHNrYXRlcyBvciByb2xsZXIgYmxhZGVzIzQ5LjIyLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjAwLjAwLjAwI1RveXMgYW5kIGdhbWVzIzQ5LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjAwLjAwI1RveXMjNDkuMjMuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMDEuMDAjTXVzaWNhbCB0b3lzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjAyLjAwI0VkdWNhdGlvbmFsIHRveXMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMDMuMDAjVG95IGJhbGxvb25zIG9yIGJhbGxzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA0LjAwI0RvbGxzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA1LjAwI0RvbGwgaG91c2VzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA2LjAwI1N0dWZmZWQgYW5pbWFscyBvciBwdXBwZXRzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA3LjAwI1BsYXlob3VzZXMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMDguMDAjQnVpbGRpbmcgYmxvY2tzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjA5LjAwI1JpZGluZyB0b3lzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjEwLjAwI1B1bGwgdG95cyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xMS4wMCNDaGlsZHJlbnMgc2NpZW5jZSBraXRzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjEyLjAwI1RveSB2ZWhpY2xlcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xMy4wMCNUb3kgdHJhaW5zIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjE0LjAwI0luZmxhdGFibGUgdG95cyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xNS4wMCNEb2xsIHBhcnRzIG9yIGFjY2Vzc29yaWVzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjE2LjAwI1lvIHlvcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xNy4wMCNLaXRlcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4xOC4wMCNQb2dzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjE5LjAwI0thbGVpZG9zY29wZXMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMjAuMDAjUG9tIHBvbXMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTUuMjEuMDAjUGluYXRhcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4yMi4wMCNCb29tZXJhbmdzIzQ5LjIzLjE1LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE1LjIzLjAwI0ZseWluZyBkaXNjcyM0OS4yMy4xNS4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNS4yNC4wMCNUb3kgcGFpbHMjNDkuMjMuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTYuMDAuMDAjR2FtZXMjNDkuMjMuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTYuMDEuMDAjRWR1Y2F0aW9uYWwgZ2FtZXMjNDkuMjMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTYuMDIuMDAjQm9hcmQgZ2FtZXMjNDkuMjMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjMuMTYuMDMuMDAjUGxheWluZyBjYXJkcyM0OS4yMy4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNi4wNC4wMCNWaWRlbyBnYW1lcyM0OS4yMy4xNi4wMC4wMAotdW5zcHNjNyM0OS4yMy4xNi4wNS4wMCNQdXp6bGVzIzQ5LjIzLjE2LjAwLjAwCi11bnNwc2M3IzQ5LjIzLjE2LjA2LjAwI0RpY2UjNDkuMjMuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMDAuMDAuMDAjUmVjcmVhdGlvbiBhbmQgcGxheWdyb3VuZCBhbmQgc3dpbW1pbmcgYW5kIHNwYSBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzQ5LjAwLjAwLjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjAwLjAwI1BsYXlncm91bmQgZXF1aXBtZW50IzQ5LjI0LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjAxLjAwI1BsYXlncm91bmQgc3dpbmdzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjAyLjAwI1BsYXlncm91bmQgY2xpbWJpbmcgYXBwYXJhdHVzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjAzLjAwI1BsYXlncm91bmQgbWVycnkgZ28gcm91bmRzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA0LjAwI1BsYXlncm91bmQgc2xpZGVzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA1LjAwI1BsYXlncm91bmQgc2VlIHNhd3MjNDkuMjQuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTUuMDYuMDAjUGxheWdyb3VuZCB0dW5uZWxzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA3LjAwI1BsYXlncm91bmQgc2FuZGJveGVzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA4LjAwI1BsYXlncm91bmQgYmxlYWNoZXJzIzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjA5LjAwI1dhbGwgY2xpbWJpbmcgZXF1aXBtZW50IzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE1LjEwLjAwI1JvcGUgY2xpbWJpbmcgZXF1aXBtZW50IzQ5LjI0LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE2LjAwLjAwI1JlY3JlYXRpb25hbCBlcXVpcG1lbnQjNDkuMjQuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTYuMDEuMDAjQ3JvcXVldCBzZXRzIzQ5LjI0LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE2LjAyLjAwI0xhd24gYm93bGluZyBlcXVpcG1lbnQjNDkuMjQuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTYuMDMuMDAjSG9yc2VzaG9lIGVxdWlwbWVudCM0OS4yNC4xNi4wMC4wMAotdW5zcHNjNyM0OS4yNC4xNi4wNC4wMCNMYXduIGRhcnRzIzQ5LjI0LjE2LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE3LjAwLjAwI1N3aW1taW5nIHBvb2wgYW5kIHNwYSBlcXVpcG1lbnQgYW5kIHN1cHBsaWVzIzQ5LjI0LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE3LjAxLjAwI0RpdmluZyBib2FyZHMjNDkuMjQuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTcuMDIuMDAjUG9vbCBzbGlkZXMjNDkuMjQuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTcuMDMuMDAjU3BhIGJsb3dlciM0OS4yNC4xNy4wMC4wMAotdW5zcHNjNyM0OS4yNC4xNy4wNC4wMCNXYXRlciB0ZXN0IGtpdCBvciBzb2x1dGlvbnMjNDkuMjQuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTcuMDUuMDAjQXV0b21hdGljIHBvb2wgY2xlYW5lciM0OS4yNC4xNy4wMC4wMAotdW5zcHNjNyM0OS4yNC4xNy4wNi4wMCNTb2xhciBibGFua2V0IzQ5LjI0LjE3LjAwLjAwCi11bnNwc2M3IzQ5LjI0LjE3LjA3LjAwI1Bvb2wgb3Igc3BhIGhlYXRlciM0OS4yNC4xNy4wMC4wMAotdW5zcHNjNyM0OS4yNC4xNy4wOC4wMCNPem9uZSBnZW5lcmF0b3IjNDkuMjQuMTcuMDAuMDAKLXVuc3BzYzcjNDkuMjQuMTcuMDkuMDAjU29sYXIgYmxhbmtldCByZWVscyM0OS4yNC4xNy4wMC4wMAotdW5zcHNjNyM0OS4yNS4wMC4wMC4wMCNBcnRzIGFuZCBjcmFmdHMgc3VwcGxpZXMjNDkuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTUuMDAuMDAjQXJ0IHN1cHBsaWVzIzQ5LjI1LjAwLjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjAxLjAwI0FydCBwYWludHMjNDkuMjUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTUuMDIuMDAjTW9kZWxpbmcgY2xheSM0OS4yNS4xNS4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNS4wMy4wMCNBcnQgcGFpbnRicnVzaGVzIzQ5LjI1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjA0LjAwI1BpY3R1cmUgb3IgcG9zdGVyIGZyYW1lcyM0OS4yNS4xNS4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNS4wNS4wMCNQaWN0dXJlIGFsYnVtcyBvciBvcmdhbml6ZXJzIzQ5LjI1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjA2LjAwI0N1dHRpbmcgbWF0cyM0OS4yNS4xNS4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNS4wNy4wMCNDYXJ2aW5nIGJvYXJkIzQ5LjI1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjA4LjAwI1BhbGV0dGVzIzQ5LjI1LjE1LjAwLjAwCi11bnNwc2M3IzQ5LjI1LjE1LjA5LjAwI0dsaXR0ZXIjNDkuMjUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTUuMTAuMDAjQmVhZHMjNDkuMjUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTUuMTEuMDAjRGVjb3JhdGl2ZSB0YXBlcyBvciB0d2lzdHMjNDkuMjUuMTUuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTYuMDAuMDAjQ3JhZnQgc3VwcGxpZXMjNDkuMjUuMDAuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTYuMDEuMDAjTW9kZWwga2l0cyM0OS4yNS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNi4wMi4wMCNQb3R0ZXJzIHdoZWVscyM0OS4yNS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNi4wMy4wMCNEZWNvcmF0aXZlIGJ1dHRvbnMjNDkuMjUuMTYuMDAuMDAKLXVuc3BzYzcjNDkuMjUuMTYuMDQuMDAjRGVjb3JhdGl2ZSBzaGFwZXMgb3Igc3RyaW5ncyM0OS4yNS4xNi4wMC4wMAotdW5zcHNjNyM0OS4yNS4xNi4wNS4wMCNDcmFmdCBraXRzIzQ5LjI1LjE2LjAwLjAwCi11bnNwc2M3IzUwLjAwLjAwLjAwLjAwI0Zvb2QgQmV2ZXJhZ2UgYW5kIFRvYmFjY28gUHJvZHVjdHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMDAuMDAuMDAjRnJ1aXRzIGFuZCB2ZWdldGFibGVzIGFuZCBudXRzIGFuZCBzZWVkcyM1MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4wMC4wMCNWZWdldGFibGVzIzUwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjAxLjAwI0JlYW5zIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjAyLjAwI1NwaW5hY2gjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMDMuMDAjUG90YXRvZXMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMDQuMDAjUGVhcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4wNS4wMCNPbmlvbnMgb3Igb3RoZXIgYWxsaWFjZW91cyB2ZWdldGFibGVzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjA2LjAwI0xldHR1Y2UjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMDcuMDAjQ2FiYmFnZSM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4wOC4wMCNTcXVhc2hlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4wOS4wMCNZYW1zIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjEwLjAwI0NhcnJvdHMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMTEuMDAjUnV0YWJhZ2FzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjEyLjAwI0VnZ3BsYW50cyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4xMy4wMCNQZXBwZXJzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjE0LjAwI1JodWJhcmIjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMTUuMDAjRW5kaXZlIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjE2LjAwI0FzcGFyYWd1cyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4xNy4wMCNBcnRpY2hva2VzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjE4LjAwI1BhcnNuaXBzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjE5LjAwI0NlbGVyeSM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4yMC4wMCNSYWRpc2hlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4yMS4wMCNNdXNocm9vbXMgb3Igb3RoZXIgZWRpYmxlIGZ1bmdpIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjIyLjAwI0hvcnNlcmFkaXNoIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjIzLjAwI1R1cm5pcHMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMjQuMDAjTXVzdGFyZCBncmVlbnMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMjUuMDAjS2FsZSM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4yNi4wMCNDb2xsYXJkcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4yNy4wMCNCcnVzc2VsIHNwcm91dHMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMjguMDAjQnJvY2NvbGkjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMjkuMDAjQ2F1bGlmbG93ZXJzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjMwLjAwI09rcmEjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMzEuMDAjQ3VjdW1iZXJzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjMyLjAwI1RvbWF0b2VzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjMzLjAwI0JlZXRzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjM0LjAwI01hbmlvYyByb290cyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4zNS4wMCNMZW50aWxzIzUwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE1LjM2LjAwI0Nvcm4jNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMzcuMDAjUHVtcGtpbnMjNTAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTUuMzguMDAjRnJlc2ggdmVnZXRhYmxlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS4zOS4wMCNGcm96ZW4gdmVnZXRhYmxlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNS40MC4wMCNTaGVsZiBzdGFibGUgdmVnZXRhYmxlcyM1MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4wMC4wMCNGcnVpdHMjNTAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMDEuMDAjTGltZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMDIuMDAjTWFuZ29lcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4wMy4wMCNHdWF2YXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMDQuMDAjR3JhcGVzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjA1LjAwI0RhdGVzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjA2LjAwI0Fwcmljb3RzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjA3LjAwI0JlcnJpZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMDguMDAjUGVhY2hlcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4wOS4wMCNDaGVycmllcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xMC4wMCNCYW5hbmFzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjExLjAwI01lbG9ucyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xMi4wMCNQb21lZ3JhbmF0ZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMTMuMDAjUGFwYXlhcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xNC4wMCNLaXdpcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xNS4wMCNMaWNoZWVzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjE2LjAwI1BlYXJzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjE3LjAwI1BsdW1zIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjE4LjAwI0FwcGxlcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4xOS4wMCNQYXNzaW9uIGZydWl0IzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjIwLjAwI05lY3RhcmluZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMjEuMDAjUGluZWFwcGxlcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4yMi4wMCNGaWdzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjIzLjAwI1RhbmdlbG9zIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjI0LjAwI01hbmRhcmlucyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4yNS4wMCNPcmFuZ2VzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjI2LjAwI1RhbmdlcmluZXMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMjcuMDAjR3JhcGVmcnVpdCM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4yOC4wMCNMZW1vbnMjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMjkuMDAjRHVyaWFucyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zMC4wMCNDb2NvbnV0cyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zMS4wMCNBdm9jYWRvcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zMi4wMCNRdWluY2VzIzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE2LjMzLjAwI09saXZlcyM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zNC4wMCNGcmVzaCBmcnVpdCM1MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNi4zNS4wMCNGcm96ZW4gZnJ1aXQjNTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTYuMzYuMDAjU2hlbGYgc3RhYmxlIGZydWl0IzUwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjAwLjAwI051dHMgYW5kIHNlZWRzIzUwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjAxLjAwI0NoZXN0bnV0cyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4wMy4wMCNQZWNhbnMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMDQuMDAjQnJhemlsIG51dHMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMDUuMDAjQ2FzaGV3cyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4wNi4wMCNBbG1vbmRzIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjA3LjAwI01hY2FkYW1pYSBudXRzIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjA4LjAwI0hhemVsbnV0cyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4wOS4wMCNQaW5lIG51dHMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMTAuMDAjUGlzdGFjaGlvcyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4xMS4wMCNXYWxudXRzIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjEyLjAwI0JldGVsIG51dHMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMTMuMDAjUGVhbnV0cyBvciBncm91bmRudXRzIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEwLjE3LjE0LjAwI01peGVkIG51dHMjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMTUuMDAjTnV0IG1lYXQjNTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTAuMTcuMTYuMDAjV2hvbGUgbnV0cyBvciBzZWVkcyM1MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMC4xNy4xNy4wMCNTaGVsbGVkIzUwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjExLjAwLjAwLjAwI01lYXQgYW5kIHBvdWx0cnkgcHJvZHVjdHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDAuMDAjTWVhdCBhbmQgcG91bHRyeSM1MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNS4wMS4wMCNDaGlja2VuIzUwLjExLjE1LjAwLjAwCi11bnNwc2M3IzUwLjExLjE1LjAyLjAwI1R1cmtleSM1MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNS4wMy4wMCNEdWNrIzUwLjExLjE1LjAwLjAwCi11bnNwc2M3IzUwLjExLjE1LjA0LjAwI09zdHJpY2gjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDUuMDAjUGFydHJpZGdlIzUwLjExLjE1LjAwLjAwCi11bnNwc2M3IzUwLjExLjE1LjA2LjAwI0RvdmUjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDcuMDAjUGhlYXNhbnQjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDguMDAjUXVhaWwjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMDkuMDAjR29vc2UjNTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTUuMTAuMDAjRnJlc2ggbWVhdCBhbmQgcG91bHRyeSM1MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNS4xMS4wMCNGcm96ZW4gbWVhdCBhbmQgcG91bHRyeSM1MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNS4xMi4wMCNTaGVsZiBzdGFibGUgbWVhdCBhbmQgcG91bHRyeSM1MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNi4wMC4wMCNGcmVzaCBhbmQgZnJvemVuIHJlZCBtZWF0IGFuZCBieXByb2R1Y3RzIzUwLjExLjAwLjAwLjAwCi11bnNwc2M3IzUwLjExLjE2LjAxLjAwI0JlZWYjNTAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTYuMDIuMDAjVmVhbCM1MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNi4wMy4wMCNNdXR0b24jNTAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTYuMDQuMDAjTGFtYiM1MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNi4wNS4wMCNCdWZmYWxvIzUwLjExLjE2LjAwLjAwCi11bnNwc2M3IzUwLjExLjE2LjA2LjAwI0hvcnNlbWVhdCM1MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNi4wNy4wMCNBc3Mgb3IgbXVsZSBvciBoaW5ueSBtZWF0IzUwLjExLjE2LjAwLjAwCi11bnNwc2M3IzUwLjExLjE3LjAwLjAwI0ZyZXNoIGFuZCBmcm96ZW4gcG9yayBhbmQgYnlwcm9kdWN0cyM1MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMS4xNy4wMS4wMCNQb3JrIzUwLjExLjE3LjAwLjAwCi11bnNwc2M3IzUwLjExLjE4LjAwLjAwI0ZyZXNoIGFuZCBmcm96ZW4gb3JnYW4gbWVhdCBhbmQgYnlwcm9kdWN0cyM1MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMS4xOC4wMS4wMCNPcmdhbiBtZWF0IzUwLjExLjE4LjAwLjAwCi11bnNwc2M3IzUwLjExLjE4LjAyLjAwI0xpdmVyIzUwLjExLjE4LjAwLjAwCi11bnNwc2M3IzUwLjExLjE4LjAzLjAwI0dpenphcmQjNTAuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTguMDQuMDAjVHJpcGUjNTAuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTguMDUuMDAjU3RvbWFjaCM1MC4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MC4xMS4xOC4wNi4wMCNLaWRuZXkjNTAuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTguMDcuMDAjQnJhaW5zIzUwLjExLjE4LjAwLjAwCi11bnNwc2M3IzUwLjExLjE5LjAwLjAwI0RlbGljYXRlc3NlbiBtZWF0IHByb2R1Y3RzIzUwLjExLjAwLjAwLjAwCi11bnNwc2M3IzUwLjExLjE5LjAxLjAwI1NhbGFtaSM1MC4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xOS4wMi4wMCNLYWJhbmEjNTAuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTkuMDMuMDAjUGFzdHJhbWkjNTAuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMTkuMDQuMDAjUm9hc3QgYmVlZiM1MC4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xMS4xOS4wNS4wMCNDb3JuZWQgYmVlZiBvciBzaWx2ZXJzaWRlIzUwLjExLjE5LjAwLjAwCi11bnNwc2M3IzUwLjExLjE5LjA2LjAwI0ZyYW5rZnVydCBvciBob3QgZG9nIzUwLjExLjE5LjAwLjAwCi11bnNwc2M3IzUwLjExLjIwLjAwLjAwI1Byb2Nlc3NlZCBhbmQgcHJlcGFyZWQgbWVhdHMjNTAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMjAuMDEuMDAjRnJlc2ggcHJvY2Vzc2VkIG9yIHByZXBhcmVkIG1lYXRzIzUwLjExLjIwLjAwLjAwCi11bnNwc2M3IzUwLjExLjIwLjAyLjAwI0Zyb3plbiBwcm9jZXNzZWQgb3IgcHJlcGFyZWQgbWVhdHMjNTAuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMTEuMjAuMDMuMDAjU2hlbGYgc3RhYmxlIHByb2Nlc3NlZCBvciBwcmVwYXJlZCBtZWF0cyM1MC4xMS4yMC4wMC4wMAotdW5zcHNjNyM1MC4xMi4wMC4wMC4wMCNTZWFmb29kIzUwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjAwLjAwI0Zpc2gjNTAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMDEuMDAjTGVtb25maXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjAyLjAwI0RvZ2Zpc2gjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMDMuMDAjR3JvdXBlciM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4wNC4wMCNNYWhpIG1haGkjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMDUuMDAjTW9ua2Zpc2gjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMDYuMDAjUG9tcGFubyM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4wNy4wMCNCYXNzIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjA4LjAwI1NoYXJrIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjA5LjAwI1RpbGFwaWEjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMTAuMDAjU3dvcmRmaXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjExLjAwI0FuY2hvdmllcyM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4xMi4wMCNDYXJwIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjEzLjAwI0NhdGZpc2gjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMTQuMDAjRWVsIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjE1LjAwI1N0dXJnZW9uIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjE2LjAwI1R1bmEjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMTcuMDAjQ29kIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjE4LjAwI0hhbGlidXQjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMTkuMDAjSGFkZG9jayM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4yMC4wMCNPY2VhbiBwZXJjaCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4yMS4wMCNPcmFuZ2Ugcm91Z2h5IzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjIyLjAwI1BhcnJvdCBmaXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjIzLjAwI1Bpa2UjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMjQuMDAjUmVkIHNuYXBwZXIjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMjUuMDAjUm9ja2Zpc2gjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMjYuMDAjU21lbHQjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMjcuMDAjU29sZSM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4yOC4wMCNXaGl0aW5nIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjI5LjAwI1NhbG1vbiM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zMC4wMCNNYWNrZXJlbCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zMS4wMCNTYXJkaW5lcyM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zMi4wMCNUcm91dCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zMy4wMCNTdXJpbWkjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMzQuMDAjQmxhY2tmaXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE1LjM1LjAwI0hlcnJpbmcjNTAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTUuMzYuMDAjRnJlc2ggZmlzaCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zNy4wMCNGcm96ZW4gZmlzaCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zOC4wMCNTaGVsZiBzdGFibGUgZmlzaCM1MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNS4zOS4wMCNGcmVzaCBmaXNoIzUwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjAwLjAwI1NoZWxsZmlzaCM1MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNi4wMS4wMCNBYmFsb25lIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjAyLjAwI1NjYWxsb3BzIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjAzLjAwI0NsYW1zIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjA0LjAwI0NyYWJzIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjA1LjAwI0NvbmNoIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjA2LjAwI0NyYXlmaXNoIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjA3LjAwI0xvYnN0ZXIjNTAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTYuMDguMDAjTXVzc2VscyM1MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNi4wOS4wMCNPeXN0ZXJzIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE2LjEwLjAwI1NocmltcCM1MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNi4xMS4wMCNGcmVzaCBzaGVsbGZpc2gjNTAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTYuMTIuMDAjRnJvemVuIHNoZWxsZmlzaCM1MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNi4xMy4wMCNTaGVsZiBzdGFibGUgc2hlbGxmaXNoIzUwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE3LjAwLjAwI0FxdWF0aWMgaW52ZXJ0ZWJyYXRlcyM1MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNy4wMS4wMCNTcXVpZCM1MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMi4xNy4wMi4wMCNPY3RvcHVzIzUwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE3LjAzLjAwI0FuZW1vbmVzIzUwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE3LjA0LjAwI1NlYSBjdWN1bWJlcnMjNTAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTcuMDUuMDAjRnJlc2ggYXF1YXRpYyBpbnZlcnRlYnJhdGVzIzUwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEyLjE3LjA2LjAwI0Zyb3plbiBhcXVhdGljIGludmVydGVicmF0ZXMjNTAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTcuMDcuMDAjU2hlbGYgc3RhYmxlIGFxdWF0aWMgaW52ZXJ0ZWJyYXRlcyM1MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xMi4xOC4wMC4wMCNBcXVhdGljIHBsYW50cyM1MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xOC4wMS4wMCNTZWF3ZWVkcyM1MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xOC4wMi4wMCNGcmVzaCBhcXVhdGljIHBsYW50cyM1MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xMi4xOC4wMy4wMCNGcm96ZW4gYXF1YXRpYyBwbGFudHMjNTAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTIuMTguMDQuMDAjU2hlbGYgc3RhYmxlIGFxdWF0aWMgcGxhbnRzIzUwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzUwLjEzLjAwLjAwLjAwI0RhaXJ5IHByb2R1Y3RzIGFuZCBlZ2dzIzUwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjAwLjAwI0RhaXJ5IHByb2R1Y3RzIGFuZCBkYWlyeSBzdWJzdGl0dXRlcyM1MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wMS4wMCNDb2ZmZWUgY3JlYW1lciM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wMi4wMCNCdXR0ZXIjNTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTUuMDMuMDAjTWlsayM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wNC4wMCNTb2Z0IGNoZWVzZXMjNTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTUuMDUuMDAjWW9ndXJ0cyM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wNi4wMCNJY2UgY3JlYW1zIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjA3LjAwI1NvdXIgY3JlYW1zIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjA4LjAwI0hhcmQgY2hlZXNlcyM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4wOS4wMCNCdXR0ZXJtaWxrIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjEwLjAwI0luZmFudCBmb3JtdWxhIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjExLjAwI0N1c3RhcmQjNTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTUuMTIuMDAjRXZhcG9yYXRlZCBtaWxrIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjEzLjAwI1N3ZWV0ZW5lZCBjb25kZW5zZWQgbWlsayM1MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNS4xNC4wMCNQb3dkZXJlZCBtaWxrIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjE1LjAwI0NyZWFtIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE1LjE2LjAwI0xvbmcgbGlmZSBtaWxrIzUwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjAwLjAwI0VnZ3MgYW5kIGVnZyBzdWJzdGl0dXRlcyM1MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNi4wMS4wMCNFZ2dzIzUwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjAyLjAwI0VnZyBzdWJzdGl0dXRlcyM1MC4xMy4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNi4wMy4wMCNNZXJpbmd1ZSBwb3dkZXJzIzUwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjA0LjAwI0VnZyB3aGl0ZXMjNTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTYuMDUuMDAjRWdnIHlvbGtzIzUwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjA2LjAwI0ZyZXNoIGVnZ3MjNTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTYuMDcuMDAjRWdnIHN1YnN0aXR1dGVzIzUwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE2LjA4LjAwI0VnZyB3aGl0ZXMgb3IgeW9sa3MjNTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTYuMDkuMDAjUHJlcGFyZWQgZWdncyM1MC4xMy4xNi4wMC4wMAotdW5zcHNjNyM1MC4xMy4xNy4wMC4wMCNNaWxrIGFuZCBidXR0ZXIgcHJvZHVjdHMjNTAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTcuMDEuMDAjRnJlc2ggbWlsayBhbmQgYnV0dGVyIHByb2R1Y3RzIzUwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE3LjAyLjAwI1NoZWxmIHN0YWJsZSBtaWxrIGFuZCBidXR0ZXIgcHJvZHVjdHMjNTAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTguMDAuMDAjQ2hlZXNlIzUwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzUwLjEzLjE4LjAxLjAwI05hdHVyYWwgY2hlZXNlIzUwLjEzLjE4LjAwLjAwCi11bnNwc2M3IzUwLjEzLjE4LjAyLjAwI1Byb2Nlc3NlZCBjaGVlc2UjNTAuMTMuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTMuMTguMDMuMDAjSW1pdGF0aW9uIGNoZWVzZSM1MC4xMy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNC4wMC4wMC4wMCNHcmFpbnMgYW5kIGNlcmVhbHMgYW5kIHRoZWlyIGZsb3VycyM1MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNS4wMC4wMCNHcmFpbnMgYW5kIGNlcmVhbHMjNTAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTUuMDEuMDAjTWlsbGV0IzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjAyLjAwI0hvcHMjNTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTUuMDMuMDAjQnVja3doZWF0IzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjA0LjAwI1J5ZSM1MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNS4wNS4wMCNDb3JuIGNlcmVhbHMjNTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTUuMDYuMDAjU29yZ2h1bSM1MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNS4wNy4wMCNPYXRzIzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjA4LjAwI1JpY2UjNTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTUuMDkuMDAjQmFybGV5IzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjEwLjAwI1doZWF0IzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjExLjAwI1Bhc3RhIG9yIG5vb2RsZSM1MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNS4xMi4wMCNCcmFuIzUwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE1LjEzLjAwI3Nob3J0IGdyYWluIHJpY2UjNTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTYuMDAuMDAjRmxvdXJzIzUwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjAxLjAwI01pbGxldCBmbG91ciM1MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNi4wMi4wMCNPYXQgZmxvdXIjNTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTYuMDMuMDAjQmFybGV5IGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjA0LjAwI1JpY2UgZmxvdXIjNTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTQuMTYuMDUuMDAjQnVja3doZWF0IGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjA2LjAwI1J5ZSBmbG91ciM1MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNC4xNi4wNy4wMCNDb3JuIGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjA4LjAwI1doZWF0IGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjA5LjAwI1NlbGYgcmlzaW5nIGZsb3VyIzUwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE0LjE2LjEwLjAwI0xvbmcgR3JhaW4gUmljZSM1MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNS4wMC4wMC4wMCNFZGlibGUgb2lscyBhbmQgZmF0cyM1MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4wMC4wMCNFZGlibGUgdmVnZXRhYmxlIGFuZCBwbGFudCBvaWxzIGFuZCBmYXRzIzUwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjAxLjAwI1NveWJlYW4gb2lsIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjAyLjAwI0Nvcm4gb2lsIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjAzLjAwI0Nhbm9sYSBvaWwjNTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTUuMDQuMDAjU2VzYW1lIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4wNS4wMCNQZWFudXQgb2lsIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjA2LjAwI09saXZlIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4wNy4wMCNQYWxtIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4wOC4wMCNTYWZmbG93ZXIgb2lsIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjA5LjAwI0Nhc3RvciBvaWwjNTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTUuMTAuMDAjU3VuZmxvd2VyIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4xMS4wMCNDb3R0b25zZWVkIG9pbCM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNS4xMi4wMCNDb2x6YSBvaWwjNTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTUuMTMuMDAjRWRpYmxlIHZlZ2V0YWJsZSBvciBwbGFudCBvaWxzIzUwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE1LjE0LjAwI0VkaWJsZSB2ZWdldGFibGUgb3IgcGxhbnQgZmF0cyM1MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNi4wMC4wMCNFZGlibGUgYW5pbWFsIG9pbHMgYW5kIGZhdHMjNTAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTYuMDEuMDAjTGFyZCM1MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNi4wMi4wMCNUYWxsb3cjNTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTYuMDMuMDAjQ29kIGxpdmVyIG9pbCM1MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNi4wNC4wMCNFZGlibGUgYW5pbWFsIG9pbHMjNTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTYuMDUuMDAjRWRpYmxlIGFuaW1hbCBmYXRzIzUwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE3LjAwLjAwI09pbHMgYW5kIGZhdHMgYW5kIG90aGVyIzUwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE1LjE3LjAxLjAwI1Nob3J0ZW5pbmdzIzUwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE1LjE3LjAyLjAwI01hcmdhcmluZSM1MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNy4wMy4wMCNMaW5zZWVkIG9pbCM1MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNy4wNC4wMCNDb2NvYSBidXR0ZXIjNTAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTUuMTcuMDUuMDAjSG9wIE9pbCM1MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNS4xNy4wNi4wMCNNYWNhZGFtaWEgb2lsIzUwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE2LjAwLjAwLjAwI0Nob2NvbGF0ZSBhbmQgc3VnYXJzIGFuZCBzd2VldGVuZXJzIGFuZCBjb25mZWN0aW9uYXJ5IHByb2R1Y3RzIzUwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjAwLjAwI0Nob2NvbGF0ZSBhbmQgc3VnYXJzIGFuZCBzd2VldGVuaW5nIHByb2R1Y3RzIzUwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjAxLjAwI0Jyb3duIHN1Z2FyIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjAyLjAwI1doaXRlIHN1Z2FycyM1MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNS4wMy4wMCNTdWdhciBjYW5lIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjA0LjAwI0ZydWN0b3NlIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjA1LjAwI1BhbG0gc3VnYXIjNTAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTUuMDYuMDAjR2x1Y29zZSM1MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNS4wNy4wMCNCZWV0IHN1Z2FyIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjA4LjAwI1JhdyBzdWdhciM1MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNS4wOS4wMCNOYXR1cmFsIHN1Z2FycyBhbmQgc3dlZXRlbmluZyBwcm9kdWN0cyM1MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNS4xMC4wMCNBcnRpZmljaWFsIHN3ZWV0ZW5pbmcgYWdlbnRzIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE1LjExLjAwI0Nob2NvbGF0ZSBhbmQgY2hvY29sYXRlIHN1YnN0aXR1dGUjNTAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTUuMTIuMDAjU3lydXBzIzUwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE2LjAwLjAwI1N5cnVwcyBhbmQgb3RoZXIgc3dlZXRlbmVycyM1MC4xNi4wMC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNi4wMS4wMCNNb2xhc3NlcyM1MC4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNi4wMi4wMCNIb25leSM1MC4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNi4wMy4wMCNCbGFjayB0cmVhY2xlIzUwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE2LjA0LjAwI0Nvcm4gc3lydXAjNTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTYuMDUuMDAjQXNwZXJ0YW1lIzUwLjE2LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE2LjA2LjAwI1NhY2NoYXJyaW4jNTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTYuMDcuMDAjTWFwbGUgc3lydXAjNTAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTcuMDAuMDAjQ2hvY29sYXRlIGFuZCBjYXJvYiBhbmQgY2hvY29sYXRlIHN1YnN0aXR1dGVzIzUwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE2LjE3LjAxLjAwI0Nob2NvbGF0ZSM1MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNy4wMi4wMCNDYXJvYiM1MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNi4xNy4wMy4wMCNDb2NvYSM1MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4wMC4wMCNDb25mZWN0aW9uYXJ5IHByb2R1Y3RzIzUwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE2LjE4LjA0LjAwI0NoZXdpbmcgZ3VtcyM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4wNS4wMCNDYW5keSM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4wNi4wMCNMaWNvcmljZSM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4wNy4wMCNqZWxsaWVkIGNvbmZlY3Rpb25hcnkjNTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTguMDguMDAjRnVkZ2UjNTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTguMDkuMDAjTWVkaWNhdGVkIGNvbmZlY3Rpb25lcnkgb3IgbG96ZW5nZXMjNTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTguMTAuMDAjU3VnYXIgZnJlZSBjb25mZWN0aW9uYXJ5IzUwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE4LjExLjAwI01hcnNobWFsbG93IzUwLjE2LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE2LjE4LjEyLjAwI05vdWdhdCM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4xMy4wMCNDaG9jb2xhdGUgb3IgY2hvY29sYXRlIHN1YnN0aXR1dGUgY2FuZHkjNTAuMTYuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTYuMTguMTQuMDAjU3VnYXIgb3Igc3VnYXIgc3Vic3RpdHV0ZSBjYW5keSM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNi4xOC4xNS4wMCNDaGV3aW5nIGd1bSM1MC4xNi4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4wMC4wMC4wMCNTZWFzb25pbmdzIGFuZCBwcmVzZXJ2YXRpdmVzIzUwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjAwLjAwI0hlcmJzIGFuZCBzcGljZXMgYW5kIGV4dHJhY3RzIzUwLjE3LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjAxLjAwI1NhbHQjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMDMuMDAjTnV0bWVnIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjA0LjAwI0JheSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4wNS4wMCNBbmlzZSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4wNi4wMCNTYWZmcm9uIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjA3LjAwI0Jhc2lsIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjA4LjAwI0dpbmdlciM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4wOS4wMCNMYXZlbmRlciM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4xMC4wMCNNYWNlIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjExLjAwI1BhcHJpa2EjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMTIuMDAjQ2hpY29yeSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4xMy4wMCNHYXJsaWMjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMTQuMDAjQ3VtaW4jNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMTUuMDAjQ2xvdmVzIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjE2LjAwI0Npbm5hbW9uIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjE3LjAwI0NpbGFudHJvIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjE4LjAwI0FsbHNwaWNlIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjE5LjAwI01hcmpvcmFtIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjIwLjAwI1lhcnJvdyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yMS4wMCNUaHltZSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yMi4wMCNUYXJyYWdvbiM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yMy4wMCNTZXNhbWUjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMjQuMDAjU2FnZSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yNS4wMCNSb3NlbWFyeSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yNi4wMCNQYXJzbGV5IzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjI3LjAwI0NoYW1vbWlsZSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yOC4wMCNNaW50cyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4yOS4wMCNDYXJhd2F5IzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjMwLjAwI0xlbW9uZ3Jhc3MjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMzEuMDAjTGVtb24gYmFsbSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4zMi4wMCNEaWxsIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjMzLjAwI0Zlbm5lbCM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4zNC4wMCNDdXJyeSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4zNS4wMCNDb21mcmV5IzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjM2LjAwI0NoaXZlcyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS4zNy4wMCNDaGVydmlsIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjM4LjAwI09yZWdhbm8jNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuMzkuMDAjUGVwcGVyY29ybnMjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDAuMDAjQ2FyZGFtb20jNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDEuMDAjQ29yaWFuZGVyIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjQyLjAwI0ZsYXZvcmluZyBleHRyYWN0cyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS40My4wMCNDaGlsaSBwb3dkZXIjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDQuMDAjUG9wcHkgc2VlZHMjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDUuMDAjTWl4ZWQgaGVyYnMjNTAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTUuNDYuMDAjVmFuaWxsYSM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNS40Ny4wMCNTZWFzb25pbmcgbWl4IzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjQ4LjAwI0ZyZXNoIGhlcmJzIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjQ5LjAwI0RyaWVkIGhlcmJzIzUwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE1LjUwLjAwI1NwaWNlcyBvciBleHRyYWN0cyM1MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNi4wMC4wMCNQcmVzZXJ2YXRpdmVzIGFuZCBhZGRpdGl2ZXMjNTAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTYuMDEuMDAjUGVjdGluIzUwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE2LjAyLjAwI0Zvb2QgY29sb3JpbmdzIzUwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE2LjAzLjAwI01vbm9zb2RpdW0gZ2x1dGFtYXRlIChNU0cpIzUwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE3LjAwLjAwI1ZpbmVnYXJzIGFuZCBjb29raW5nIHdpbmVzIzUwLjE3LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE3LjE3LjAxLjAwI0NpZGVyIHZpbmVhZ2FyIzUwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE3LjAyLjAwI0JhbHNhbWljIHZpbmVnYXIjNTAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTcuMDMuMDAjRGlzdGlsbGVkIHZpbmVnYXIjNTAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTcuMDQuMDAjUmljZSB2aW5lZ2FyIzUwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE3LjA1LjAwI1dpbmUgdmluZWdhciM1MC4xNy4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNy4xNy4wNi4wMCNJbmZ1c2VkIHZpbmVnYXIjNTAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTcuMDcuMDAjVmluZWdhcnMjNTAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTcuMDguMDAjQ29va2luZyB3aW5lcyM1MC4xNy4xNy4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4wMC4wMCNTYXVjZXMgYW5kIHNwcmVhZHMgYW5kIGNvbmRpbWVudHMjNTAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMDEuMDAjTXVzdGFyZHMjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMDIuMDAjQ2F0c3VwIG9yIGtldGNodXAgb3IgdG9tYXRvIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjAzLjAwI0JhcmJlY3VlIHNhdWNlcyM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4wNC4wMCNNYXJpbmFkZXMjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMDUuMDAjSG90IHNhdWNlcyM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4wNi4wMCNNYXlvbm5haXNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjA3LjAwI1NveSBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4wOC4wMCNTYWxhZCBkcmVzc2luZ3MjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMDkuMDAjV29yY2hlc3RlcnNoaXJlIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjEwLjAwI1NhbHNhIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjExLjAwI1JlbGlzaGVzIG9yIGNodXRuZXlzIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjEyLjAwI0NvbnNlcnZlIG9yIGphbSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4xMy4wMCNEaXAgb3IgY2hpbGxlZCBkaXBwaW5nIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjE0LjAwI1N3ZWV0IGFuZCBzb3VyIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjE1LjAwI1RhcnRhcmUgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMTYuMDAjTWludCBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4xNy4wMCNHcmF2eSBzYXVjZSBvciBwb3dkZXIjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMTguMDAjTm9vZGxlIG9yIHBhc3RhIHNhdWNlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjE5LjAwI0Zvb2Qgc3ByZWFkcyBvciBwYXN0ZXMjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjAuMDAjVG9tYXRvIHBhc3RlIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjIxLjAwI0JsYWNrIGJlYW4gc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjIuMDAjU2F0YXkgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjMuMDAjVGVyaXlha2kgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjQuMDAjU2VhZm9vZCBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4yNS4wMCNQZXN0byM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4yNi4wMCNTdGVhayBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4yNy4wMCNPeXN0ZXIgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMjguMDAjUGx1bSBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4yOS4wMCNXaGl0ZSBzYXVjZSM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4zMC4wMCNEaXBwaW5nIHNhdWNlcyBvciBjb25kaW1lbnRzIG9yIHNwcmVhZHMgb3IgbWFyaW5hZGVzIzUwLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE4LjMxLjAwI0Nvb2tpbmcgc2F1Y2UjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTguMzIuMDAjU2FsYWQgZHJlc3Npbmcgb3IgZGlwcyM1MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOC4zMy4wMCNTYXZvcnkgc3ByZWFkIG9yIHBhdGUjNTAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTkuMDAuMDAjUGlja2xlcyBhbmQgcmVsaXNoIGFuZCBvbGl2ZXMjNTAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTkuMDEuMDAjUGlja2xlcyM1MC4xNy4xOS4wMC4wMAotdW5zcHNjNyM1MC4xNy4xOS4wMi4wMCNSZWxpc2gjNTAuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTcuMTkuMDMuMDAjT2xpdmVzIzUwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE3LjE5LjA0LjAwI0NodXRuZXlzIzUwLjE3LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE4LjAwLjAwLjAwI0JyZWFkIGFuZCBiYWtlcnkgcHJvZHVjdHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTUuMDAuMDAjTGVhdmVuaW5nIGFnZW50cyM1MC4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNS4wMS4wMCNZZWFzdCM1MC4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNS4wMi4wMCNCYWtpbmcgcG93ZGVyIzUwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE1LjAzLjAwI0Jha2luZyBzb2RhIzUwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE1LjA0LjAwI0Jha2VycyBhbW1vbmlhIzUwLjE4LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE2LjAwLjAwI1RoaWNrZW5lcnMjNTAuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTYuMDEuMDAjR2VsYXRpbnMjNTAuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTYuMDIuMDAjRm9vZCBncmFkZSBzdGFyY2hlcyM1MC4xOC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNi4wMy4wMCNUYXBpb2NhIzUwLjE4LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE2LjA0LjAwI0Fycm93cm9vdCM1MC4xOC4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNi4wNS4wMCNGb29kIGdyYWRlIGFnYXIjNTAuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTcuMDAuMDAjQmFraW5nIG1peGVzIGFuZCBzdXBwbGllcyM1MC4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wMS4wMCNGb29kIGdsYXplcyM1MC4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wMi4wMCNJY2luZ3MjNTAuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTcuMDMuMDAjQ2FrZSBkZWNvcmF0aW9ucyM1MC4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wNC4wMCNDYWtlIG9yIHB1ZGRpbmcgbWl4dHVyZXMjNTAuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTcuMDUuMDAjUGllIGZpbGxpbmdzIzUwLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE3LjA2LjAwI0Jha2luZyBtaXhlcyM1MC4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wNy4wMCNDb2F0aW5nIG1peCBvciBicmVhZGNydW1icyM1MC4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOC4xNy4wOC4wMCNCYWtpbmcgbWl4ZXMjNTAuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTcuMDkuMDAjQmFraW5nIHN1cHBsaWVzIzUwLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE4LjAwLjAwI0Jha2VkIGdvb2RzIzUwLjE4LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE4LjE4LjAxLjAwI1Bhc3RyeSBzaGVsbHMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDIuMDAjQ3JhY2tlcnMgb3IgZHJ5IG9yIHNhdm91cnkgYmlzY3VpdHMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDMuMDAjQnJlYWQjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDQuMDAjUGFzdHJpZXMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDUuMDAjQ2FrZXMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDYuMDAjQ29va2llIG9yIHN3ZWV0IGJpc2N1aXQjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDcuMDAjQmlzY3VpdHMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTguMDguMDAjVW5sZWF2ZW5lZCBicmVhZCM1MC4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOC4wOS4wMCNNdWZmaW5zIzUwLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE4LjEwLjAwI0RvbnV0cyM1MC4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOC4xMS4wMCNQaXp6YSBvciBwaXp6YSBiYXNlcyM1MC4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOC4xMi4wMCNDb3JuZXRzIG9yIGNvbmVzIG9yIHdhZmZsZXMjNTAuMTguMTguMDAuMDAKLXVuc3BzYzcjNTAuMTguMTkuMDAuMDAjQnJlYWQgYW5kIGJpc2N1aXRzIGFuZCBjb29raWVzIzUwLjE4LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE4LjE5LjAxLjAwI0ZyZXNoIGJyZWFkIzUwLjE4LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE4LjE5LjAyLjAwI0Zyb3plbiBicmVhZCM1MC4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOS4wMy4wMCNQbGFpbiBzYXZvcnkgYmlzY3VpdHMjNTAuMTguMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTguMTkuMDQuMDAjRHJpZWQgYnJlYWRzIG9yIGJyZWFkIHNoZWxscyBvciBjcm91dG9ucyM1MC4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOC4xOS4wNS4wMCNTd2VldCBiaXNjdWl0cyBvciBjb29raWVzIzUwLjE4LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE4LjIwLjAwLjAwI0Nha2VzIGFuZCBwaWVzIGFuZCBwYXN0cmllcyM1MC4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOC4yMC4wMS4wMCNGcmVzaCBjYWtlcyBvciBwaWVzIG9yIHBhc3RyaWVzIzUwLjE4LjIwLjAwLjAwCi11bnNwc2M3IzUwLjE4LjIwLjAyLjAwI0Zyb3plbiBjYWtlcyBvciBwaWVzIG9yIHBhc3RyaWVzIzUwLjE4LjIwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjAwLjAwLjAwI1ByZXBhcmVkIGFuZCBwcmVzZXJ2ZWQgZm9vZHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTUuMDAuMDAjUHJlcGFyZWQgc291cHMgYW5kIHN0ZXdzIzUwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjAxLjAwI1N0ZXdzIzUwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjAyLjAwI1NvdXBzIzUwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjAzLjAwI1N0b2NrIG9yIHN0b2NrIGN1YmVzIzUwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjA0LjAwI1N0ZXcgb3IgY2Fzc2Vyb2xlIGJhc2UjNTAuMTkuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTUuMDUuMDAjRnJlc2ggcHJlcGFyZWQgc291cHMgb3Igc3Rld3MjNTAuMTkuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTUuMDYuMDAjRnJvemVuIHByZXBhcmVkIHNvdXBzIG9yIHN0ZXdzIzUwLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE1LjA3LjAwI1NoZWxmIHN0YWJsZSBwcmVwYXJlZCBzb3VwcyBvciBzdGV3cyM1MC4xOS4xNS4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4wMC4wMCNGcm96ZW4gZm9vZHMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTYuMDEuMDAjRnJvemVuIGRlc3NlcnRzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE2LjAyLjAwI0Zyb3plbiBtZWF0cyM1MC4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4wMy4wMCNGcm96ZW4gZnJ1aXRzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE2LjA0LjAwI0Zyb3plbiB2ZWdldGFibGVzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE2LjA1LjAwI0Zyb3plbiBwcmVwYXJlZCBtZWFscyM1MC4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4wNi4wMCNGcm96ZW4gZmlzaCM1MC4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4wNy4wMCNGcm96ZW4gY3J1c3RhY2VhbnMjNTAuMTkuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTYuMDguMDAjRnJvemVuIG1vbGx1c2tzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE2LjA5LjAwI0Zyb3plbiBwcmVwYXJlZCBwYXN0cnkgdW5iYWtlZCM1MC4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNi4xMC4wMCNGcm96ZW4gc2F2b3VyaWVzIzUwLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE3LjAwLjAwI0Nhbm5lZCBmb29kcyBhbmQgYm90dGxlZCBldGMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTcuMDEuMDAjQ2FubmVkIGZydWl0cyM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wMi4wMCNDYW5uZWQgdmVnZXRhYmxlcyM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wMy4wMCNDYW5uZWQgZmlzaCM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wNC4wMCNDYW5uZWQgbWVhdCM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wNS4wMCNDYW5uZWQgSW5mYW50IGZvb2RzIzUwLjE5LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE3LjA2LjAwI0ZydWl0IGphbXMjNTAuMTkuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTcuMDcuMDAjTWFybWFsYWRlIzUwLjE5LjE3LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE3LjA4LjAwI0Nhbm5lZCBwcmVwYXJlZCBtZWFscyM1MC4xOS4xNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4xNy4wOS4wMCNDYW5uZWQgZGVzc2VydHMjNTAuMTkuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTguMDAuMDAjRHJpZWQgZm9vZHMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTguMDEuMDAjRHJpZWQgZmlzaCM1MC4xOS4xOC4wMC4wMAotdW5zcHNjNyM1MC4xOS4xOC4wMi4wMCNEcmllZCBtZWF0IzUwLjE5LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE4LjAzLjAwI0RyaWVkIHZlZ2V0YWJsZXMjNTAuMTkuMTguMDAuMDAKLXVuc3BzYzcjNTAuMTkuMTguMDQuMDAjRHJpZWQgZnJ1aXRzIzUwLjE5LjE4LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE5LjAwLjAwI1NhbHRlZCBhbmQgc21va2VkIGZvb2RzIzUwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjE5LjAxLjAwI1NhbHRlZCBvciBzbW9rZWQgZmlzaCM1MC4xOS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4xOS4wMi4wMCNTYWx0ZWQgb3Igc21va2VkIG1lYXRzIzUwLjE5LjE5LjAwLjAwCi11bnNwc2M3IzUwLjE5LjE5LjAzLjAwI1NhbHRlZCBvciBzbW9rZWQgc2hlbGxmaXNoIG9yIGNydXN0YWNlYW5zIG9yIHJvZSM1MC4xOS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4xOS4wNC4wMCNTYWx0ZWQgb3Igc21va2VkIGZydWl0cyM1MC4xOS4xOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4xOS4wNS4wMCNTYWx0ZWQgb3Igc21va2VkIG51dHMjNTAuMTkuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjAuMDAuMDAjUGlja2xlZCBmb29kcyM1MC4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMC4wMS4wMCNQaWNrbGVkIGZpc2gjNTAuMTkuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjAuMDIuMDAjUGlja2xlZCBjcnVzdGFjZWFucyM1MC4xOS4yMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMC4wMy4wMCNQaWNrbGVkIG1lYXRzIzUwLjE5LjIwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjIwLjA0LjAwI1BpY2tsZWQgdmVnZXRhYmxlcyM1MC4xOS4yMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMC4wNS4wMCNQaWNrbGVkIGVnZ3MjNTAuMTkuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDAuMDAjU25hY2sgZm9vZHMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDEuMDAjUHJldHplbHMjNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDIuMDAjQ29ybiBjaGlwcyM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4wMy4wMCNQb3RhdG8gY2hpcHMjNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDQuMDAjUG9wY29ybiM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4wNS4wMCNGaXNoIGZpbmdlcnMjNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMDYuMDAjRnJ1aXQgc25hY2tzIzUwLjE5LjIxLjAwLjAwCi11bnNwc2M3IzUwLjE5LjIxLjA3LjAwI090aGVyIGZsYXZvdXJlZCBzbmFjayBmb29kcyM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4wOC4wMCNGcnVpdCBvciBudXQgbWl4IzUwLjE5LjIxLjAwLjAwCi11bnNwc2M3IzUwLjE5LjIxLjA5LjAwI0NyaXNwcyBvciBjaGlwcyBvciBwcmV0emVscyBvciBtaXhlcyM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4xMC4wMCNOdXRzIG9yIGRyaWVkIGZydWl0cyM1MC4xOS4yMS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMS4xMS4wMCNEcmllZCBvciBwcm9jZXNzZWQgbWVhdHMjNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjEuMTIuMDAjUG9wcGVkIGNvcm4jNTAuMTkuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjIuMDAuMDAjU3ByZWFkcyBhbmQgY29uc2VydmVzIzUwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjIyLjAxLjAwI1BlYW51dCBidXR0ZXIjNTAuMTkuMjIuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjIuMDIuMDAjWWVhc3Qgb3IgdmVnZXRhYmxlIGV4dHJhY3Qgc3ByZWFkcyM1MC4xOS4yMi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMi4wMy4wMCNKYW1zIG9yIGplbGxpZXMgb3IgcXVpbmNlcyM1MC4xOS4yMi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMy4wMC4wMCNEZXNlcnRzIGFuZCBkZXNlcnQgdG9wcGluZ3MjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjMuMDEuMDAjUHJlcGFyZWQgZGVzZXJ0cyM1MC4xOS4yMy4wMC4wMAotdW5zcHNjNyM1MC4xOS4yMy4wMi4wMCNEZXNlcnQgdG9wcGluZ3MjNTAuMTkuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjMuMDMuMDAjRmxhdm9yZWQgaWNlcyBvciBpY2UgY3JlYW0gb3IgaWNlIGNyZWFtIGRlc2VydHMgb3IgZnJvemVuIHlvZ3VydHMjNTAuMTkuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjQuMDAuMDAjSmFtcyBhbmQgamVsbGllcyBhbmQgbnV0IGFuZCBzd2VldCBzcHJlYWRzIGFuZCBmcnVpdCBjb25zZXJ2ZXMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjQuMDEuMDAjSmFtcyBvciBqZWxsaWVzIG9yIGZydWl0IHByZXNlcnZlcyM1MC4xOS4yNC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNC4wMi4wMCNOdXQgb3IgbWl4ZWQgc3ByZWFkcyM1MC4xOS4yNC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNC4wMy4wMCNIb25leSM1MC4xOS4yNC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNS4wMC4wMCNTYW5kd2ljaGVzIGFuZCBmaWxsZWQgcm9sbHMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjUuMDEuMDAjRnJlc2ggc2FuZHdpY2hlcyBvciBmaWxsZWQgcm9sbHMjNTAuMTkuMjUuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjUuMDIuMDAjRnJvemVuIHNhbmR3aWNoZXMgb3IgZmlsbGVkIHJvbGxzIzUwLjE5LjI1LjAwLjAwCi11bnNwc2M3IzUwLjE5LjI2LjAwLjAwI1ByZXBhcmVkIHBvdGF0b2VzIGFuZCByaWNlIGFuZCBwYXN0YSBhbmQgc3R1ZmZpbmcjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjYuMDEuMDAjRnJlc2ggcHJlcGFyZWQgcG90YXRvZXMgb3IgcmljZSBvciBwYXN0YSBvciBzdHVmZmluZyM1MC4xOS4yNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNi4wMi4wMCNGcm96ZW4gcHJlcGFyZWQgcG90YXRvZXMgb3IgcmljZSBvciBwYXN0YSBvciBzdHVmZmluZyM1MC4xOS4yNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNi4wMy4wMCNTaGVsZiBzdGFibGUgcHJlcGFyZWQgcG90YXRvZXMgb3IgcmljZSBvciBwYXN0YSBvciBzdHVmZmluZyM1MC4xOS4yNi4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNy4wMC4wMCNQYWNrYWdlZCBjb21iaW5hdGlvbiBtZWFscyM1MC4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNy4wMS4wMCNGcmVzaCBjb21iaW5hdGlvbiBtZWFscyM1MC4xOS4yNy4wMC4wMAotdW5zcHNjNyM1MC4xOS4yNy4wMi4wMCNGcm96ZW4gY29tYmluYXRpb24gbWVhbHMjNTAuMTkuMjcuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjcuMDMuMDAjU2hlbGYgc3RhYmxlIGNvbWJpbmF0aW9uIG1lYWxzIzUwLjE5LjI3LjAwLjAwCi11bnNwc2M3IzUwLjE5LjI4LjAwLjAwI1Nhdm9yeSBwaWVzIGFuZCBxdWljaGVzIGFuZCBwYXN0aWVzIzUwLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUwLjE5LjI4LjAxLjAwI0ZyZXNoIHNhdm9yeSBwaWVzIG9yIHF1aWNoZXMgb3IgcGFzdGllcyM1MC4xOS4yOC4wMC4wMAotdW5zcHNjNyM1MC4xOS4yOC4wMi4wMCNGcm96ZW4gc2F2b3J5IHBpZXMgb3IgcXVpY2hlcyBvciBwYXN0aWVzIzUwLjE5LjI4LjAwLjAwCi11bnNwc2M3IzUwLjE5LjI4LjAzLjAwI1NoZWxmIHN0YWJsZSBzYXZvcnkgcGllcyBvciBxdWljaGVzIG9yIHBhc3RpZXMjNTAuMTkuMjguMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjkuMDAuMDAjUGxhaW4gcGFzdGEgYW5kIG5vb2RsZXMjNTAuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMjkuMDEuMDAjRnJlc2ggcGxhaW4gcGFzdGEgb3Igbm9vZGxlcyM1MC4xOS4yOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4yOS4wMi4wMCNTaGVsZiBzdGFibGUgcGxhaW4gcGFzdGEgb3Igbm9vZGxlcyM1MC4xOS4yOS4wMC4wMAotdW5zcHNjNyM1MC4xOS4zMC4wMC4wMCNJbmZhbnQgZm9vZHMgYW5kIGJldmVyYWdlcyM1MC4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MC4xOS4zMC4wMS4wMCNJbmZhbnQgZm9vZHMjNTAuMTkuMzAuMDAuMDAKLXVuc3BzYzcjNTAuMTkuMzAuMDIuMDAjSW5mYW50IGJldmVyYWdlcyM1MC4xOS4zMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4wMC4wMC4wMCNCZXZlcmFnZXMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTUuMDAuMDAjV2F0ZXIjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTUuMDEuMDAjU3BhcmtsaW5nIHdhdGVyIzUwLjIwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE1LjAyLjAwI1NwcmluZyB3YXRlciM1MC4yMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNS4wMy4wMCNNaW5lcmFsIHdhdGVyIzUwLjIwLjE1LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE1LjA0LjAwI0Rpc3RpbGxlZCBvciBwdXJpZmllZCB3YXRlciM1MC4yMC4xNS4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNi4wMC4wMCNKdWljZXMjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMDEuMDAjQmxlbmRlZCBqdWljZXMjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMDIuMDAjR3VhdmEganVpY2UjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMDMuMDAjUHJ1bmUganVpY2UjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMDQuMDAjVG9tYXRvIGp1aWNlIzUwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE2LjA1LjAwI0NyYW5iZXJyeSBqdWljZSM1MC4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNi4wNi4wMCNHcmFwZWZydWl0IGp1aWNlIzUwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE2LjA3LjAwI0dyYXBlIGp1aWNlIzUwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE2LjA4LjAwI1BpbmVhcHBsZSBqdWljZSM1MC4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNi4wOS4wMCNPcmFuZ2UganVpY2UjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMTAuMDAjQXBwbGUganVpY2UjNTAuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTYuMTEuMDAjTGVtb24ganVpY2VzIG9yIGxlbW9uYWRlIzUwLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE2LjEyLjAwI0luZmFudCBqdWljZSM1MC4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wMC4wMCNDb2ZmZWUgYW5kIHRlYSM1MC4yMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wMS4wMCNJbnN0YW50IGNvZmZlZSM1MC4yMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wMi4wMCNHcm91bmQgY29mZmVlIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjAzLjAwI1dob2xlIGJlYW4gY29mZmVlIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjA0LjAwI0dyZWVuIGNvZmZlZSM1MC4yMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wNS4wMCNDb2ZmZWUgc3Vic3RpdHV0ZXMjNTAuMjAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTcuMDYuMDAjQ29mZmVlIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjA3LjAwI0NvZmZlZSBzdWJzdGl0dXRlcyM1MC4yMC4xNy4wMC4wMAotdW5zcHNjNyM1MC4yMC4xNy4wOC4wMCNDb2ZmZWUgZHJpbmtzIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjA5LjAwI0luc3RhbnQgY29mZmVlIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjEwLjAwI0xlYWYgdGVhIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjExLjAwI0luc3RhbnQgdGVhIzUwLjIwLjE3LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE3LjEyLjAwI1RlYSBkcmlua3MjNTAuMjAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTcuMTMuMDAjVGVhIGJhZ3MjNTAuMjAuMTcuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTguMDAuMDAjVGVhIzUwLjIwLjAwLjAwLjAwCi11bnNwc2M3IzUwLjIwLjE4LjAxLjAwI0dyZWVuIHRlYSM1MC4yMC4xOC4wMC4wMAotdW5zcHNjNyM1MC4yMC4xOC4wMi4wMCNCbGFjayB0ZWEjNTAuMjAuMTguMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTguMDMuMDAjSGVyYmFsIHRlYSM1MC4yMC4xOC4wMC4wMAotdW5zcHNjNyM1MC4yMC4xOC4wNC4wMCNQb3dkZXJlZCB0ZWEjNTAuMjAuMTguMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTguMDUuMDAjVGVhIGJhZ3MjNTAuMjAuMTguMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTkuMDAuMDAjU29mdCBkcmlua3MjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTkuMDEuMDAjTm9uIGNhcmJvbmF0ZWQgc29mdCBkcmlua3MjNTAuMjAuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTkuMDIuMDAjQ2FyYm9uYXRlZCBzb2Z0IGRyaW5rcyM1MC4yMC4xOS4wMC4wMAotdW5zcHNjNyM1MC4yMC4xOS4wMy4wMCNDb3JkaWFscyBvciBjb2xvdXJpbmdzIzUwLjIwLjE5LjAwLjAwCi11bnNwc2M3IzUwLjIwLjE5LjA0LjAwI1Nwb3J0cyBvciBoaWdoIGVuZXJneSBkcmlua3MjNTAuMjAuMTkuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMTkuMDUuMDAjU295IGJldmVyYWdlIzUwLjIwLjE5LjAwLjAwCi11bnNwc2M3IzUwLjIwLjIwLjAwLjAwI0JlZXIgYW5kIHdpbmUjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDEuMDAjQ2hhbXBhZ25lIzUwLjIwLjIwLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIwLjAyLjAwI0JlZXIjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDMuMDAjV2luZSM1MC4yMC4yMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMC4wNC4wMCNTcGFya2xpbmcgd2luZXMjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDUuMDAjRm9ydGlmaWVkIHdpbmUjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDYuMDAjUG9ydCM1MC4yMC4yMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMC4wNy4wMCNTaGVycnkjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjAuMDguMDAjV2luZSBjb29sZXIgYmV2ZXJhZ2UjNTAuMjAuMjAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDAuMDAjU3Bpcml0cyBhbmQgbGlxdW9ycyM1MC4yMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMS4wMS4wMCNCcmFuZHkjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDIuMDAjQ29nbmFjIG9yIGFybWFnbmFjIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjAzLjAwI1doaXNrZXkjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDQuMDAjVm9ka2EjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDUuMDAjVGVxdWlsYSM1MC4yMC4yMS4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMS4wNi4wMCNHaW4jNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDcuMDAjTGlxdWV1cnMjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMDguMDAjUnVtIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjA5LjAwI0JvdXJib24jNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMTAuMDAjU2NvdGNoIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjExLjAwI0NpZGVyIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjEyLjAwI1NjaG5hcHBzIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjEzLjAwI091em8jNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMTQuMDAjQXBlcml0aWZzIG9yIGJpdHRlcnMjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMTUuMDAjVmVybW91dGgjNTAuMjAuMjEuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjEuMTYuMDAjU2FtYnVjYSM1MC4yMC4yMS4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMS4xNy4wMCNTYWtlIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIxLjE4LjAwI011c2NhdCBvciBtYWRlaXJhIzUwLjIwLjIxLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIyLjAwLjAwI0FsY29ob2xpYyBiZXZlcmFnZXMjNTAuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjIuMDEuMDAjQmVlciM1MC4yMC4yMi4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMi4wMi4wMCNDaWRlciBvciBwZXJyeSM1MC4yMC4yMi4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMi4wMy4wMCNXaW5lIzUwLjIwLjIyLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIyLjA0LjAwI0ZvcnRpZmllZCB3aW5lIzUwLjIwLjIyLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIyLjA1LjAwI1NwYXJrbGluZyB3aW5lIzUwLjIwLjIyLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIyLjA2LjAwI1NwaXJpdHMgb3IgbGlxdW9ycyM1MC4yMC4yMi4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMi4wNy4wMCNBbGNvaG9sIGNvY2t0YWlscyBvciBkcmluayBtaXhlcyM1MC4yMC4yMi4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wMC4wMCNOb24gYWxjb2hvbGljIGJldmVyYWdlcyM1MC4yMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wMS4wMCNXYXRlciM1MC4yMC4yMy4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wMi4wMCNJY2UjNTAuMjAuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjMuMDMuMDAjRnJvemVuIGp1aWNlcyM1MC4yMC4yMy4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wNC4wMCNTaGVsZiBzdGFibGUganVpY2UjNTAuMjAuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjMuMDUuMDAjRnJlc2gganVpY2UjNTAuMjAuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjMuMDYuMDAjU29mdCBkcmlua3MjNTAuMjAuMjMuMDAuMDAKLXVuc3BzYzcjNTAuMjAuMjMuMDcuMDAjQ2hvY29sYXRlIG9yIG1hbHQgb3Igb3RoZXIgaG90IGJldmVyYWdlcyM1MC4yMC4yMy4wMC4wMAotdW5zcHNjNyM1MC4yMC4yMy4wOC4wMCNBbGNvaG9sIGZyZWUgY29ja3RhaWxzIG9yIGRyaW5rIG1peGVzIzUwLjIwLjIzLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIzLjA5LjAwI1Nwb3J0IGRyaW5rIG1peGVzIzUwLjIwLjIzLjAwLjAwCi11bnNwc2M3IzUwLjIwLjIzLjEwLjAwI1NwcmluZyB3YXRlciM1MC4yMC4yMy4wMC4wMAotdW5zcHNjNyM1MC4yMS4wMC4wMC4wMCNUb2JhY2NvIGFuZCBzbW9raW5nIHByb2R1Y3RzIGFuZCBzdWJzdGl0dXRlcyM1MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNS4wMC4wMCNUb2JhY2NvIGFuZCBzdWJzdGl0dXRlcyM1MC4yMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNS4wMS4wMCNUb2JhY2NvIGxlYWYjNTAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTUuMDIuMDAjQ2lnYXJldHRlcyBvciBjaWdhcnMjNTAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTUuMDMuMDAjUGlwZSB0b2JhY2NvIG9yIGxlYWYgdG9iYWNjbyM1MC4yMS4xNS4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNS4wNC4wMCNDaGV3aW5nIHRvYmFjY28jNTAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTUuMDUuMDAjSGVyYmFsIGNpZ2FyZXR0ZXMjNTAuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDAuMDAjVG9iYWNjbyBwcm9kdWN0IGFjY2Vzc29yaWVzIGFuZCBzdXBwbGllcyM1MC4yMS4wMC4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNi4wMS4wMCNQaXBlIHRvYmFjY28jNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDIuMDAjQ2lnYXJzIzUwLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIxLjE2LjAzLjAwI0NpZ2FyZXR0ZXMjNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDQuMDAjU21va2VsZXNzIHRvYmFjY28jNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDUuMDAjUmVhZHkgcnViYmVkIHRvYmFjY28jNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDYuMDAjQ2lnYXJldHRlIHBhcGVycyM1MC4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNi4wNy4wMCNDaWdhcmV0dGUgcGFwZXJzIG9yIGZpbHRlcnMjNTAuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTAuMjEuMTYuMDguMDAjQ2lnYXJldHRlIGxpZ2h0ZXJzIG9yIGZsaW50cyM1MC4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MC4yMS4xNi4wOS4wMCNTbW9raW5nIHBpcGVzIzUwLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUwLjIyLjAwLjAwLjAwI0NlcmVhbCBhbmQgcHVsc2UgcHJvZHVjdHMjNTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTAuMjIuMTAuMDAuMDAjUHVsc2VzIzUwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzUwLjIyLjEwLjAxLjAwI1B1bHNlIGdyYWlucyM1MC4yMi4xMC4wMC4wMAotdW5zcHNjNyM1MC4yMi4xMC4wMi4wMCNQdWxzZSBmbG91ciM1MC4yMi4xMC4wMC4wMAotdW5zcHNjNyM1MC4yMi4xMS4wMC4wMCNDZXJlYWxzIzUwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzUwLjIyLjExLjAxLjAwI0NlcmVhbCBncmFpbnMjNTAuMjIuMTEuMDAuMDAKLXVuc3BzYzcjNTAuMjIuMTEuMDIuMDAjQ2VyZWFsIGZsb3VyIzUwLjIyLjExLjAwLjAwCi11bnNwc2M3IzUwLjIyLjEyLjAwLjAwI1Byb2Nlc3NlZCBjZXJlYWxzIzUwLjIyLjAwLjAwLjAwCi11bnNwc2M3IzUwLjIyLjEyLjAxLjAwI1JlYWR5IHRvIGVhdCBvciBob3QgY2VyZWFscyM1MC4yMi4xMi4wMC4wMAotdW5zcHNjNyM1MC4yMi4xMi4wMi4wMCNIZWFsdGggb3IgYnJlYWtmYXN0IGJhcnMjNTAuMjIuMTIuMDAuMDAKLXVuc3BzYzcjNTEuMDAuMDAuMDAuMDAjRHJ1Z3MgYW5kIFBoYXJtYWNldXRpY2FsIFByb2R1Y3RzIzUxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjAwLjAwLjAwI0FudGkgaW5mZWN0aXZlIGRydWdzIzUxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjE1LjAwLjAwI0FudGliaW90aWNzIzUxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjE1LjAxLjAwI0FtaW5vZ2x5Y29zaWRlcyM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wMi4wMCNDZXBoYWxvc3BvcmlucyM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wMy4wMCNDaGxvcmFtcGhlbmljb2wjNTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTUuMDQuMDAjQ2xpbmRhbXljaW4gb3IgbGluY29teWNpbiM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wNS4wMCNGbHVvcm9xdWlub2xvbmVzIzUxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE1LjA2LjAwI01hY3JvbGlkZSM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wNy4wMCNQZW5pY2lsbGlucyM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wOC4wMCNBbnRpYmlvdGljIHN1bGZvbmFtaWRlcyM1MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNS4wOS4wMCNUZXRyYWN5Y2xpbmVzIzUxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE2LjAwLjAwI0FtZWJpY2lkZXMgYW5kIFRyaWNob21vbmFjaWRlcyBhbmQgQW50aXByb3Rvem9hbHMjNTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTYuMDEuMDAjQXRvdmFxdW9uZSM1MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNi4wMi4wMCNFZmxvcm5pdGhpbmUgaHlkcm9jaGxvcmlkZSM1MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNi4wMy4wMCNNZXRyb25pZGF6b2xlIzUxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE3LjAwLjAwI0FudGhlbG1pbnRpY3MjNTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTcuMDEuMDAjQWxiZW5kYWRvbGUjNTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTcuMDIuMDAjTWViZW5kYXpvbGUjNTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTcuMDMuMDAjT3hhbW5pcXVpbmUjNTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTcuMDQuMDAjUGlwZXJhemluZSBjaXRyYXRlIzUxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE3LjA1LjAwI1ByYXppcXVhbnRlbCM1MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMC4xNy4wNi4wMCNQeXJhbnRlbCBwYW1vYXRlIzUxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE3LjA3LjAwI1RoaWFiZW5kYXpvbGUjNTEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMDAuMDAjQW50aWZ1bmdhbCBkcnVncyM1MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wMS4wMCNBbXBob3RlcmljaW4gYiM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wMi4wMCNCdXRlbmFmaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMDMuMDAjQnV0b2NvbmF6b2xlIG5pdHJhdGUjNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMDQuMDAjQ2ljbG9waXJveCBvbGFtaW5lIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjA1LjAwI0Nsb3RyaW1hem9sZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wNi4wMCNFY29uYXpvbGUgbml0cmF0ZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wNy4wMCNGbHVjb25hem9sZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wOC4wMCNGbHVjeXRvc2luZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4wOS4wMCNHcmlzZW9mdWx2aW4jNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMTAuMDAjSXRyYWNvbmF6b2xlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjExLjAwI0tldG9jb25hem9sZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4xMi4wMCNNaWNvbmF6b2xlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjEzLjAwI05hZnRpZmluZSBoeWRyb2NobG9yaWRlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjE0LjAwI05hdGFteWNpbiM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4xNS4wMCNOeXN0YXRpbiM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4xNi4wMCNPeGljb25hem9sZSBuaXRyYXRlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjE3LjAwI1N1bGNvbmF6b2xlIG5pdHJhdGUjNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTguMTguMDAjVGVyYmluYWZpbmUgaHlkcm9jaGxvcmlkZSM1MS4xMC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOC4xOS4wMCNUZXJjb25hem9sZSBuaXRyYXRlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjIwLjAwI1Rpb2NvbmF6b2xlIzUxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE4LjIxLjAwI1RvbG5hZnRhdGUjNTEuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTkuMDAuMDAjQW50aW1hbGFyaWFsIGRydWdzIzUxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjE5LjAxLjAwI0FtaW5vcXVpbm9saW5lcyM1MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOS4wMi4wMCNNZWZsb3F1aW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTkuMDMuMDAjUHJpbWFxdWluZSBwaG9zcGhhdGUjNTEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMTkuMDQuMDAjUXVpbmluZSBzdWxmYXRlIzUxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE5LjA1LjAwI0NobG9yb3F1aW5lIzUxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEwLjE5LjA2LjAwI1Byb2d1YW5pbCM1MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMC4xOS4wNy4wMCNQeXJpbWV0aGFtaW5lIzUxLjEwLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEwLjIwLjAwLjAwI0FudGl0dWJlcmN1bGFyIGRydWdzIzUxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIwLjAxLjAwI0N5Y2xvc2VyaW5lIzUxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIwLjAyLjAwI0V0aGFtYnV0b2wgaHlkcm9jaGxvcmlkZSM1MS4xMC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMC4wMy4wMCNJc29uaWF6aWQjNTEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjAuMDQuMDAjUmlmdWJ1dGluIzUxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIwLjA1LjAwI1JpZmFtcGluIzUxLjEwLjIwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIxLjAwLjAwI0xlcHJvc3RhdGljcyM1MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMS4wMS4wMCNDbG9mYXppbWluZSM1MS4xMC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMS4wMi4wMCNEYXBzb25lIzUxLjEwLjIxLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjAwLjAwI1VyaW5hcnkgYW50aSBpbmZlY3RpdmVzIGFuZCBhbmFsZ2VzaWNzIzUxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjAxLjAwI0Npbm94YWNpbiM1MS4xMC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMi4wMi4wMCNGbGF2b3hhdGUgaHlkcm9jaGxvcmlkZSM1MS4xMC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMi4wMy4wMCNNZXRoZW5hbWluZSBoaXBwdXJhdGUjNTEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjIuMDQuMDAjTWV0aGVuYW1pbmUgbWFuZGVsYXRlIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjA1LjAwI05hbGlkaXhpYyBhY2lkIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjA2LjAwI05pdHJvZnVyYW50b2luIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjA3LjAwI094eWJ1dHluaW4gY2hsb3JpZGUjNTEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjIuMDguMDAjUGVudG9zYW4gcG9seXN1bGZhdGUgc29kaXVtIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjA5LjAwI1BoZW5hem9weXJpZGluZSBoeWRyb2NobG9yaWRlIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIyLjEwLjAwI0FudGlzZXB0aWMgc29sdXRpb25zIzUxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjAwLjAwI0FudGl2aXJhbCBkcnVncyM1MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4wMS4wMCNBY3ljbG92aXIjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMDIuMDAjQW1hbnRhZGluZSBoeWRyb2NobG9yaWRlIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjAzLjAwI0N5ZG9mb3ZpciM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4wNC4wMCNEaWRhbm9zaW5lIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjA1LjAwI0ZhbWNpY2xvdmlyIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjA2LjAwI0Zvc2Nhcm5ldCBzb2RpdW0jNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMDcuMDAjR2FuY2ljbG92aXIgc29kaXVtIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjA4LjAwI0lkb3h1cmlkaW5lIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjA5LjAwI0luZGluYXZpciBzdWxmYXRlIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjEwLjAwI0xhbWl2dWRpbmUjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMTEuMDAjTmV2aXJhcGluZSM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4xMi4wMCNSaWJhdmlyaW4jNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMTMuMDAjUmltYW50YWRpbmUgaHlkcm9jaGxvcmlkZSM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4xNC4wMCNSaXRvbmF2aXIjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMTUuMDAjU2FxdWluYXZpciBtZXN5bGF0ZSM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMC4yMy4xNi4wMCNTdGF2aWRpbmUjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMTcuMDAjVHJpZmx1cmFkaW5lIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjE4LjAwI1ZhbGFjeWNsb3ZpciBoeWRyb2NobG9yaWRlIzUxLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUxLjEwLjIzLjE5LjAwI1ZpZGFyYWJpbmUjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMjAuMDAjWmFsY2l0YWJpbmUjNTEuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTAuMjMuMjEuMDAjWmlkb3Z1ZGluZSM1MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xMS4wMC4wMC4wMCNBbnRpbmVvcGxhc3RpYyBhZ2VudHMjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMDAuMDAjQWxreWxhdGluZyBhZ2VudHMjNTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMDEuMDAjQW1pZm9zdGluZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wMi4wMCNCdXN1bGZhbiM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wMy4wMCNDYXJib3BsYXRpbiM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wNC4wMCNDYXJtdXN0aW5lIzUxLjExLjE1LjAwLjAwCi11bnNwc2M3IzUxLjExLjE1LjA1LjAwI0NobG9yYW1idWNpbCM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wNi4wMCNDaXNwbGF0aW4jNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMDcuMDAjQ3ljbG9waG9zcGhhbWlkZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wOC4wMCNEYWNhcmJhemluZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4wOS4wMCNJZm9zZmFtaWRlIzUxLjExLjE1LjAwLjAwCi11bnNwc2M3IzUxLjExLjE1LjEwLjAwI0xvbXVzdGluZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4xMS4wMCNNZWNobG9yZXRoYW1pbmUgaHlkcm9jaGxvcmlkZSM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4xMi4wMCNNZWxwaGFsYW4jNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMTMuMDAjTWVzbmEjNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMTQuMDAjUGlwb2Jyb21hbiM1MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNS4xNS4wMCNTdHJlcHRvem9jaW4jNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMTYuMDAjVGhpb3RlcGEjNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTUuMTcuMDAjVXJhY2lsIG11c3RhcmQjNTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMDAuMDAjQW50aW1ldGFib2xpdGVzIzUxLjExLjAwLjAwLjAwCi11bnNwc2M3IzUxLjExLjE2LjAxLjAwI0NsYWRyaWJpbmUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMDIuMDAjQ3l0YXJhYmluZSM1MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNi4wMy4wMCNGbG94dXJpZGluZSM1MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNi4wNC4wMCNGbHVkYXJhYmluZSBwaG9zcGhhdGUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMDUuMDAjRmx1b3JvdXJhY2lsIzUxLjExLjE2LjAwLjAwCi11bnNwc2M3IzUxLjExLjE2LjA2LjAwI0h5ZHJveHl1cmVhIzUxLjExLjE2LjAwLjAwCi11bnNwc2M3IzUxLjExLjE2LjA3LjAwI0lkYXJ1YmljaW4gaHlkcm9jaGxvcmlkZSM1MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMS4xNi4wOC4wMCNMZXZhbWlzb2xlIGh5ZHJvY2hsb3JpZGUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMDkuMDAjTWVyY2FwdG9wdXJpbmUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMTAuMDAjTWV0aG90cmV4YXRlIzUxLjExLjE2LjAwLjAwCi11bnNwc2M3IzUxLjExLjE2LjExLjAwI1Rlbmlwb3NpZGUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTYuMTIuMDAjVGhpb2d1YW5pbmUjNTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTcuMDAuMDAjQW50aW5lb3BsYXN0aWMgYW50aWJpb3RpY3MjNTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTcuMDEuMDAjQmxlb215Y2luIHN1bGZhdGUjNTEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTcuMDIuMDAjRGFjdGlub215Y2luIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjAzLjAwI0RhdW5vcnViaWNpbnMjNTEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTcuMDQuMDAjTWl0b215Y2luIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjA1LjAwI01pdG90YW5lIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjA2LjAwI01pdG94YW50cm9uZSBoeWRyb2NobG9yaWRlIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjA3LjAwI1BlbnRvc3RhdGluIzUxLjExLjE3LjAwLjAwCi11bnNwc2M3IzUxLjExLjE3LjA4LjAwI1BsaWNhbXljaW4jNTEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMDAuMDAjSG9ybW9uZXMgYW5kIGFudGlob3Jtb25lcyM1MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4wMS4wMCNBbmFzdHJvem9sZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4wMi4wMCNCaWNhbHV0YW1pZGUjNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMDMuMDAjRXN0cmFtdXN0aW5lIHBob3NwaGF0ZSBzb2RpdW0jNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMDQuMDAjRmx1dGFtaWRlIzUxLjExLjE4LjAwLjAwCi11bnNwc2M3IzUxLjExLjE4LjA1LjAwI0dvc2VyZWxpbiBhY2V0YXRlIzUxLjExLjE4LjAwLjAwCi11bnNwc2M3IzUxLjExLjE4LjA2LjAwI0lyaW5vdGVjYW4gaHlkcm9jaGxvcmlkZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4wNy4wMCNMZXVwcm9saWRlIGFjZXRhdGUjNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMDguMDAjTmlsdXRhbWlkZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4wOS4wMCNUYW1veGlmZW4jNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMTAuMDAjVGVzdG9sYWN0b25lIzUxLjExLjE4LjAwLjAwCi11bnNwc2M3IzUxLjExLjE4LjExLjAwI1RvcG90ZWNhbiBoeWRyb2NobG9yaWRlIzUxLjExLjE4LjAwLjAwCi11bnNwc2M3IzUxLjExLjE4LjEyLjAwI1ZpbmJsYXN0aW5lIHN1bGZhdGUjNTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTguMTMuMDAjVmluY3Jpc3RpbmUgc3VsZmF0ZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOC4xNC4wMCNWaW5vcmVsYmluZSB0YXJ0cmF0ZSM1MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOS4wMC4wMCNOYXR1cmFsIGFudGluZW9wbGFzdGljIHByb2R1Y3RzIzUxLjExLjAwLjAwLjAwCi11bnNwc2M3IzUxLjExLjE5LjAxLjAwI0FzcGFyYWdpbmFzZSM1MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOS4wMi4wMCNEb2NldGF4ZWwjNTEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTEuMTkuMDMuMDAjSW50ZXJmZXJvbiM1MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMS4xOS4wNC4wMCNQYWNsaXRheGVsIzUxLjExLjE5LjAwLjAwCi11bnNwc2M3IzUxLjExLjE5LjA1LjAwI1BvcmZpbWVyIHNvZGl1bSM1MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMi4wMC4wMC4wMCNDYXJkaW92YXNjdWxhciBkcnVncyM1MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNS4wMC4wMCNBbnRpYXJyeXRobWljIGFnZW50cyM1MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNS4wMS4wMCNBZGVub3NpbmUjNTEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTUuMDIuMDAjRGlnb3hpbiM1MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNS4wMy4wMCNRdWluaWRpbmUgZ2x1Y29uYXRlIzUxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE2LjAwLjAwI0FudGlhbmdpbmFsIGRydWdzIzUxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzUxLjEyLjE2LjAxLjAwI0FteWwgbml0cmF0ZSM1MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNi4wMi4wMCNJc29zb3JiaWRlIGRpbml0cmF0ZSM1MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNi4wMy4wMCNOaXRyb2dseWNlcmluIzUxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE2LjA0LjAwI1BlbnRhZXJ5dGhyaXRvbCB0ZXRyYW5pdHJhdGUjNTEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTcuMDAuMDAjQW50aWh5cGVydGVuc2l2ZSBkcnVncyM1MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4wMS4wMCNEaWF6b3hpZGUjNTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTcuMDIuMDAjVGVyYXpvc2luIzUxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE3LjAzLjAwI0NhcHRvcHJpbCM1MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4wNC4wMCNMaXNpbm9wcmlsIzUxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE3LjA1LjAwI0ZlbG9kaXBpbmUjNTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTcuMDYuMDAjSXNyYWRpcGluZSM1MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4wNy4wMCNWZXJhcGFtaWwjNTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTcuMDguMDAjTWV0aHlsZG9wYSM1MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4wOS4wMCNDYXJ2ZWRpbG9sIzUxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE3LjEwLjAwI0xvc2FydGFuIHBvdGFzc2l1bSM1MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMi4xNy4xMS4wMCNNaW5veGlkaWwjNTEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTguMDAuMDAjQW50aWh5cGVybGlwaWRlbWljIGFuZCBoeXBvY2hvbGVzdGVyb2xlbWljIGFnZW50cyM1MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xOC4wMS4wMCNGbHV2YXN0YXRpbiBzb2RpdW0jNTEuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTIuMTguMDIuMDAjTG92YXN0YXRpbiM1MS4xMi4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xOC4wMy4wMCNTaW12YXN0YXRpbiM1MS4xMi4xOC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xOC4wNC4wMCNDbG9maWJyYXRlIzUxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE4LjA1LjAwI0dlbWZpYnJvemlsIzUxLjEyLjE4LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE5LjAwLjAwI0RydWdzIHVzZWQgZm9yIGNvbmdlc3RpdmUgaGVhcnQgZmFpbHVyZSM1MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMi4xOS4wMS4wMCNBbXJpbm9uZSBsYWN0YXRlIzUxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE5LjAyLjAwI01pbHJpbm9uZSBsYWN0YXRlIzUxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzUxLjEyLjE5LjAzLjAwI0RpZ2l0b3hpbiM1MS4xMi4xOS4wMC4wMAotdW5zcHNjNyM1MS4xMy4wMC4wMC4wMCNIZW1hdG9saWMgZHJ1Z3MjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTMuMTUuMDAuMDAjQW50aWFuZW1pYyBkcnVncyM1MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNS4wMS4wMCNGZXJyb3VzIGZ1bWFyYXRlIzUxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE1LjAyLjAwI0ZlcnJvdXMgZ2x1Y29uYXRlIzUxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE1LjAzLjAwI0ZlcnJvdXMgc3VsZmF0ZSM1MS4xMy4xNS4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNi4wMC4wMCNBbnRpY29hZ3VsYW50cyM1MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNi4wMS4wMCNBcHJvdGluaW4jNTEuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTMuMTYuMDIuMDAjSGVwYXJpbiBjYWxjaXVtIzUxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE2LjAzLjAwI0hlcGFyaW4gc29kaXVtIzUxLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE2LjA0LjAwI1dhcmZhcmluIHNvZGl1bSM1MS4xMy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNy4wMC4wMCNUaHJvbWJvbHl0aWMgZHJ1Z3MgYW5kIHBsYXRlbGV0IGFnZ3JlZ2F0aW9uIGluaGliaXRvcnMjNTEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTMuMTcuMDEuMDAjQWJjaXhpbWFiIzUxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE3LjAyLjAwI0FsdGVwbGFzZSM1MS4xMy4xNy4wMC4wMAotdW5zcHNjNyM1MS4xMy4xNy4wMy4wMCNTdHJlcHRva2luYXNlIzUxLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUxLjEzLjE3LjA0LjAwI1Vyb2tpbmFzZSM1MS4xMy4xNy4wMC4wMAotdW5zcHNjNyM1MS4xNC4wMC4wMC4wMCNDZW50cmFsIG5lcnZvdXMgc3lzdGVtIGRydWdzIzUxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjAwLjAwI0FudGljb252dWxzYW50cyM1MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4xNS4wMS4wMCNBY2V0YXpvbGFtaWRlIzUxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjAyLjAwI0Nsb25hemVwYW0jNTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTUuMDMuMDAjRmVsYmFtYXRlIzUxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjA0LjAwI0xhbW90cmlnaW5lIzUxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjA1LjAwI1BoZW5vYmFyYml0YWwjNTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTUuMDYuMDAjUGhlbm9iYXJiaXRhbCBzb2RpdW0jNTEuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTUuMDcuMDAjUGhlbnl0b2luIzUxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE1LjA4LjAwI0V0aG9zdXhpbWlkZSM1MS4xNC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNC4xNi4wMC4wMCNBbnRpZGVwcmVzc2FudHMjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTYuMDEuMDAjQW1pdHJpcHR5bGluZSBoeWRyb2NobG9yaWRlIzUxLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE2LjAyLjAwI0RveGVwaW4gaHlkcm9jaGxvcmlkZSM1MS4xNC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNC4xNi4wMy4wMCNJbWlwcmFtaW5lIHBhbW9hdGUjNTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTYuMDQuMDAjTWlydGF6YXBpbmUjNTEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTYuMDUuMDAjUGFyb3hldGluZSBoeWRyb2NobG9yaWRlIzUxLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE2LjA2LjAwI1RyYXpvZG9uZSBoeWRyb2NobG9yaWRlIzUxLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE3LjAwLjAwI0FudGlwc3ljaG90aWMgYWdlbnRzIzUxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjE3LjAxLjAwI1BoZW5vdGhpYXppbmVzIzUxLjE0LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE3LjAyLjAwI0hhbG9wZXJpZG9sIzUxLjE0LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE3LjAzLjAwI09sYW56YXBpbmUjNTEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTcuMDQuMDAjUmlzcGVyaWRvbmUjNTEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTguMDAuMDAjSHlwbm90aWNzIzUxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjE4LjAxLjAwI1BlbnRvYmFyYml0YWwjNTEuMTQuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTguMDIuMDAjU2Vjb2JhcmJpdGFsIHNvZGl1bSM1MS4xNC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOC4wMy4wMCNDaGxvcmFsIGh5ZHJhdGUjNTEuMTQuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTguMDQuMDAjRXN0YXpvbGFtIzUxLjE0LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE0LjE4LjA1LjAwI1RyaWF6b2xhbSM1MS4xNC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOS4wMC4wMCNUcmFucXVpbGl6ZXJzIGFuZCBhbnRpbWFuaWMgZHJ1Z3MjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTkuMDEuMDAjQWxwcmF6b2xhbSM1MS4xNC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOS4wMi4wMCNEaWF6ZXBhbSM1MS4xNC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOS4wMy4wMCNMaXRoaXVtIGNhcmJvbmF0ZSM1MS4xNC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNC4xOS4wNC4wMCNMaXRoaXVtIGNpdHJhdGUjNTEuMTQuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTkuMDUuMDAjTWlkYXpvbGFtIGh5ZHJvY2hsb3JpZGUjNTEuMTQuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMTkuMDYuMDAjVGVtYXplcGFtIzUxLjE0LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE0LjIwLjAwLjAwI05vbiBuYXJjb3RpYyBhbmFsZ2VzaWNzIGFuZCBhbnRpcHlyZXRpY3MjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjAuMDEuMDAjQWNldGFtaW5vcGhlbiM1MS4xNC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMC4wMi4wMCNBY2V0eWxzYWxpY3lsaWMgYWNpZCM1MS4xNC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMC4wMy4wMCNNZXNhbGFtaW5lIzUxLjE0LjIwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIwLjA0LjAwI01lcHJvYnJvbWF0ZSM1MS4xNC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMS4wMC4wMCNOb25zdGVyb2lkYWwgYW50aSBpbmZsYW1tYXRvcnkgZHJ1Z3MgKE5TQUlEcykjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjEuMDEuMDAjQXVyYW5vZmluIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjAyLjAwI0NhcnBvZmVuIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjAzLjAwI0RpY2xvZmVuYWMgcG90YXNzaXVtIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjA0LjAwI0RpY2xvZmVuYWMgc29kaXVtIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjA1LjAwI0ZsdXJiaXByb2ZlbiM1MS4xNC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMS4wNi4wMCNJYnVwcm9mZW4jNTEuMTQuMjEuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjEuMDcuMDAjSW5kb21ldGhhY2luIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjA4LjAwI0tldG9wcm9mZW4jNTEuMTQuMjEuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjEuMDkuMDAjTmFwcm94ZW4jNTEuMTQuMjEuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjEuMTAuMDAjTmFwcm94ZW4gc29kaXVtIzUxLjE0LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIxLjExLjAwI094YXByb3ppbiM1MS4xNC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMS4xMi4wMCNTdWxpbmRhYyM1MS4xNC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMS4xMy4wMCNTdXByb2ZlbiM1MS4xNC4yMS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMi4wMC4wMCNOYXJjb3RpYyBhbmFsZ2VzaWNzIzUxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIyLjAxLjAwI0J1dG9ycGhhbm9sIHRhcnRyYXRlIzUxLjE0LjIyLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIyLjAyLjAwI0NvZGVpbmUgcGhvc3BoYXRlIzUxLjE0LjIyLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIyLjAzLjAwI0NvZGVpbmUgc3VsZmF0ZSM1MS4xNC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMi4wNS4wMCNNZXBlcmlkaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTQuMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjIuMDYuMDAjTW9ycGhpbmUgc3VsZmF0ZSM1MS4xNC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMi4wNy4wMCNPeHljb2RvbmUjNTEuMTQuMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjIuMDguMDAjU3VmZW50YW5pbCM1MS4xNC4yMi4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMy4wMC4wMCNOYXJjb3RpYyBhbnRhZ29uaXN0cyM1MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMy4wMS4wMCNOYWxtZWZlbmUgaHlkcm9jaGxvcmlkZSM1MS4xNC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xNC4yMy4wMi4wMCNOYWxveG9uZSBoeWRyb2NobG9yaWRlIzUxLjE0LjIzLjAwLjAwCi11bnNwc2M3IzUxLjE0LjIzLjAzLjAwI05hbHRyZXhvbmUjNTEuMTQuMjMuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjQuMDAuMDAjRHJ1Z3MgdXNlZCBmb3IgdmFzY3VsYXIgYW5kIG1pZ3JhaW5lIGhlYWRhY2hlcyM1MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNC4wMS4wMCNNZXRoeXNlcmdpZGUgbWFsZWF0ZSM1MS4xNC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNC4wMi4wMCNTdW1hdHJpcHRhbiBzdWNjaW5hdGUjNTEuMTQuMjQuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjUuMDAuMDAjQW50aXBhcmtpbnNvbiBkcnVncyM1MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNS4wMS4wMCNCcm9tb2NyaXB0aW5lIG1lc3lsYXRlIzUxLjE0LjI1LjAwLjAwCi11bnNwc2M3IzUxLjE0LjI1LjAyLjAwI0NhcmJpZG9wYSM1MS4xNC4yNS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNS4wMy4wMCNMZXZvZG9wYSM1MS4xNC4yNS4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNS4wNC4wMCNTZWxlZ2lsaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTQuMjUuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDAuMDAjU3RpbXVsYW50cyBhbmQgYW5vcmV4aWFudHMjNTEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDEuMDAjQW1waGV0YW1pbmUgc3VsZmF0ZSM1MS4xNC4yNi4wMC4wMAotdW5zcHNjNyM1MS4xNC4yNi4wMi4wMCNGZW5mbHVyYW1pbmUjNTEuMTQuMjYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDMuMDAjTWF6aW5kb2wjNTEuMTQuMjYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDQuMDAjUGVtb2xpbmUjNTEuMTQuMjYuMDAuMDAKLXVuc3BzYzcjNTEuMTQuMjYuMDUuMDAjUGhlbmRpbWV0cmF6aW5lIHRhcnRyYXRlIzUxLjE0LjI2LjAwLjAwCi11bnNwc2M3IzUxLjE1LjAwLjAwLjAwI0F1dG9ub21pYyBuZXJ2b3VzIHN5c3RlbSBkcnVncyM1MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNS4wMC4wMCNDaG9saW5lcmdpYyBkcnVncyBhbmQgY2hvbGluZXN0ZXJhc2UgaW5oaWJpdG9ycyM1MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNS4wMS4wMCNCZXRoYW5lY2hvbCBjaGxvcmlkZSM1MS4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNS4wMi4wMCNFZHJvcGhvbml1bSBjaGxvcmlkZSM1MS4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNS4wMy4wMCNQaHlzb3N0aWdtaW5lIHNhbGljeWxhdGUjNTEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTUuMDQuMDAjUGlsb2NhcnBpbmUgbml0cmF0ZSM1MS4xNS4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNi4wMC4wMCNDaG9saW5lcmdpYyBibG9ja2luZyBhZ2VudHMjNTEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTYuMDEuMDAjQXRyb3BpbmUgc3VsZmF0ZSM1MS4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNi4wMi4wMCNCZW56dHJvcGluZSBtZXN5bGF0ZSM1MS4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNi4wMy4wMCNQcm9jeWNsaWRpbmUgaHlkcm9jaGxvcmlkZSM1MS4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNi4wNC4wMCNUcmloZXh5cGhlbmlkeWwgaHlkcm9jaGxvcmlkZSM1MS4xNS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNy4wMC4wMCNTeW1wYXRob21pbWV0aWMgb3IgYWRyZW5lcmdpYyBkcnVncyM1MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNy4wMS4wMCNBbGJ1dGVyb2wjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDIuMDAjQnJpbW9uaWRpbmUgdGFydHJhdGUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDMuMDAjRXBpbmVwaHJpbmUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDQuMDAjRXBpbmVwaHJpbmUgYm9yYXRlIzUxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE3LjA1LjAwI0VwaW5lcGhyaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDYuMDAjSXNvcHJvdGVyZW5vbCM1MS4xNS4xNy4wMC4wMAotdW5zcHNjNyM1MS4xNS4xNy4wNy4wMCNJc29wcm90ZXJlbm9sIHN1bGZhdGUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDguMDAjTGV2YXJ0ZXJlbm9sIGJpdGFydHJhdGUjNTEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTcuMDkuMDAjUGhlbnlscHJvcGFub2xhbWluZSBoeWRyb2NobG9yaWRlIzUxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjAwLjAwI0FkcmVuZXJnaWMgYmxvY2tpbmcgYWdlbnRzIzUxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjAxLjAwI0F0ZW5vbG9sIzUxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjAyLjAwI0VzbW9sb2wgaHlkcm9jaGxvcmlkZSM1MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xOC4wMy4wMCNOYWRvbG9sIzUxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjA0LjAwI1BpbmRvbG9sIzUxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE4LjA1LjAwI1RpbW9sb2wgbWFsZWF0ZSM1MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xOC4xMC4wMCNQaGVudG9sYW1pbmUgbWVzeWxhdGUjNTEuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTkuMDAuMDAjU2tlbGV0YWwgbXVzY2xlIHJlbGF4YW50cyBhbmQgY2VudHJhbGx5IGFjdGluZyM1MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNS4xOS4wMS4wMCNCYWNsb2ZlbiM1MS4xNS4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNS4xOS4wMi4wMCNDaGxvcnpveGF6b25lIzUxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE5LjAzLjAwI0RhbnRyb2xlbmUgc29kaXVtIzUxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE1LjE5LjA0LjAwI01ldGhvY2FyYmFtb2wjNTEuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMTkuMDUuMDAjQ2FyaXNvcHJvZG9sIzUxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE1LjIwLjAwLjAwI05ldXJvbXVzY3VsYXIgYmxvY2tpbmcgYWdlbnRzIzUxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE1LjIwLjAxLjAwI0F0cmFjdXJpdW0gYmVzeWxhdGUjNTEuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMjAuMDIuMDAjTWl2YWN1cml1bSBjaHlsb3JpZGUjNTEuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTUuMjAuMDMuMDAjUm9jdXJvbml1bSBicm9taWRlIzUxLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUxLjE1LjIwLjA0LjAwI1ZlY3Vyb25pdW0gYnJvbWlkZSM1MS4xNS4yMC4wMC4wMAotdW5zcHNjNyM1MS4xNi4wMC4wMC4wMCNEcnVncyBhZmZlY3RpbmcgdGhlIHJlc3BpcmF0b3J5IHRyYWN0IzUxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUxLjE2LjE1LjAwLjAwI0FudGlhc3RobWF0aWMgZHJ1Z3MjNTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTUuMDEuMDAjQml0b2x0ZXJvbCBtZXN5bGF0ZSM1MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNS4wMi4wMCNOZWRvY3JvbWlsIHNvZGl1bSM1MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNS4wMy4wMCNQaXJidXRlcm9sIGFjZXRhdGUjNTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTUuMDQuMDAjQW1pbm9waHlsbGluZSM1MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNS4wNS4wMCNUaGVvcGh5bGxpbmUjNTEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTYuMDAuMDAjQW50aWhpc3RhbWluZXMgb3IgSDEgYmxvY2tlcnMjNTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTYuMDEuMDAjQXN0ZW1pem9sZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNi4wMi4wMCNDbGVtYXN0aW5lIGZ1bWFyYXRlIzUxLjE2LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE2LjAzLjAwI0RleGNobG9ycGhlbmlyYW1pbmUgbWFsZWF0ZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNi4wNC4wMCNEaW1lbmh5ZHJpbmF0ZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNi4wNS4wMCNMZXZvY2FiYXN0aW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTYuMDYuMDAjTG9yYXRpZGluZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNi4wNy4wMCNUZXJmZW5hZGluZSM1MS4xNi4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNi4xNy4wMC4wMCNEcnVncyB1c2VkIGZvciByZXNwaXJhdG9yeSB0cmFjdCBkaXNvcmRlcnMjNTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTcuMDEuMDAjQWNldHlsY3lzdGVpbmUjNTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTcuMDIuMDAjQmVyYWN0YW50IzUxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE3LjAzLjAwI0J1ZGVzb25pZGUjNTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTcuMDQuMDAjQ29sZm9zY2VyaWwgcGFsbWl0YXRlIzUxLjE2LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE3LjA1LjAwI0lwcmF0cm9waXVtIGJyb21pZGUjNTEuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTguMDAuMDAjQ291Z2ggYW5kIGNvbGQgYW5kIGFudGlhbGxlcmd5IHByb2R1Y3RzIzUxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE2LjE4LjAxLjAwI0JlbnpvbmF0YXRlIzUxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE4LjAyLjAwI0d1YWlmZW5lc2luIzUxLjE2LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE5LjAwLjAwI05hc2FsIGRlY29uZ2VzdGFudHMjNTEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTYuMTkuMDEuMDAjT3h5bWV0YXpvbGluZSBoeWRyb2NobG9yaWRlIzUxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE5LjAyLjAwI1BzZXVkb2VwaGVkcmluZSBoeWRyb2NobG9yaWRlIzUxLjE2LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE2LjE5LjAzLjAwI1h5bG9tZXRhem9saW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTYuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMDAuMDAuMDAjRHJ1Z3MgYWZmZWN0aW5nIHRoZSBnYXN0cm9pbnRlc3RpbmFsIHN5c3RlbSM1MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNS4wMC4wMCNBbnRhY2lkcyM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNS4wMS4wMCNDYWxjaXVtIGNhcmJvbmF0ZSM1MS4xNy4xNS4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNS4wMi4wMCNNYWdhbGRyYXRlIzUxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE1LjAzLjAwI01hZ25lc2l1bSBoeWRyb3hpZGUjNTEuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTUuMDQuMDAjU29kaXVtIGJpY2FyYm9uYXRlIGFudGFjaWRzIzUxLjE3LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE2LjAwLjAwI0xheGF0aXZlcyM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNi4wMS4wMCNDYXNjYXJhIHNhZ3JhZGEjNTEuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTYuMDIuMDAjRG9jdXNhdGUgY2FsY2l1bSM1MS4xNy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNi4wMy4wMCNEb2N1c2F0ZSBwb3Rhc3NpdW0jNTEuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTYuMDQuMDAjRG9jdXNhdGUgc29kaXVtIzUxLjE3LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE2LjA1LjAwI0xhY3R1bG9zZSM1MS4xNy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNi4wNi4wMCNNYWduZXNpdW0gc3VsZmF0ZSM1MS4xNy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNi4wNy4wMCNQc3lsbGl1bSBoeWRyb3BoaWxpYyBtdWNpbG9pZCM1MS4xNy4xNi4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNy4wMC4wMCNBbnRpZGlhcnJoZWFscyM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNy4wMS4wMCNEaWZlbm94aW4gaHlkcm9jaGxvcmlkZSM1MS4xNy4xNy4wMC4wMAotdW5zcHNjNyM1MS4xNy4xNy4wMi4wMCNMb3BlcmFtaWRlIGh5ZHJvY2hsb3JpZGUjNTEuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTcuMDMuMDAjUGFyZWdvcmljIzUxLjE3LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE4LjAwLjAwI0FudGllbWV0aWNzIGFuZCBhbnRpbmF1c2VhbnRzIzUxLjE3LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE3LjE4LjAxLjAwI0Ryb25hYmlub2wjNTEuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTguMDIuMDAjR3JhbmlzZXRyb24gaHlkcm9jaGxvcmlkZSM1MS4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOC4wMy4wMCNNZWNsaXppbmUgaHlkcm9jaGxvcmlkZSM1MS4xNy4xOC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOC4wNC4wMCNPbmRhbnNldHJvbiBoeWRyb2NobG9yaWRlIzUxLjE3LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE4LjA1LjAwI1RyaW1ldGhvYmVuemFtaWRlIGh5ZHJvY2hsb3JpZGUjNTEuMTcuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTkuMDAuMDAjQW50aXVsY2VyIGFuZCByZWxhdGVkIGdhc3Ryb2ludGVzdGluYWwgKEdJKSBkcnVncyM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOS4wMS4wMCNDaW1ldGlkaW5lIzUxLjE3LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE5LjAyLjAwI0ZhbW90aWRpbmUjNTEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTkuMDMuMDAjTml6YXRpZGluZSM1MS4xNy4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOS4wNC4wMCNSYW5pdGlkaW5lIGh5ZHJvY2hsb3JpZGUjNTEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTkuMDUuMDAjQ2lzYXByaWRlIzUxLjE3LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE3LjE5LjA2LjAwI0xhbnNvcHJhem9sZSM1MS4xNy4xOS4wMC4wMAotdW5zcHNjNyM1MS4xNy4xOS4wNy4wMCNMaWJyYXgjNTEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMTkuMDguMDAjTWlzb3Byb3N0b2wjNTEuMTcuMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMjAuMDAuMDAjRHJ1Z3MgdXNlZCBmb3IgZ2FsbGJsYWRkZXIgZGlzZWFzZSM1MS4xNy4wMC4wMC4wMAotdW5zcHNjNyM1MS4xNy4yMC4wMS4wMCNDaGVub2Rpb2wjNTEuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMjAuMDIuMDAjTW9ub2N0YW5vaW4jNTEuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTcuMjAuMDMuMDAjVXJzb2Rpb2wjNTEuMTcuMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMDAuMDAuMDAjSG9ybW9uZXMgYW5kIGhvcm1vbmUgYW50YWdvbmlzdHMjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTUuMDAuMDAjQW50aWRpYWJldGljIGFnZW50cyBhbmQgaHlwZXJnbHljZW1pYyBhZ2VudHMjNTEuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTUuMDEuMDAjQWNhcmJvc2UjNTEuMTguMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTUuMDIuMDAjQWNldG9oZXhhbWlkZSM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNS4wMy4wMCNDaGxvcnByb3BhbWlkZSM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNS4wNC4wMCNHbGltZXBpcmlkZSM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNS4wNS4wMCNHbGlwaXppZGUjNTEuMTguMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTUuMDYuMDAjSW5zdWxpbiM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNS4wOC4wMCNHbHVjYWdvbiM1MS4xOC4xNS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNi4wMC4wMCNUaHlyb2lkIGFuZCBhbnRpdGh5cm9pZCBkcnVncyM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNi4wMS4wMCNMZXZvdGh5cm94aW5lIHNvZGl1bSM1MS4xOC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNi4wMi4wMCNMaW90aHlyb25pbmUgc29kaXVtIzUxLjE4LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE2LjAzLjAwI0xpb3RyaXgjNTEuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTYuMDQuMDAjVGh5cm90cm9waW4jNTEuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTYuMDUuMDAjTWV0aGltYXpvbGUjNTEuMTguMTYuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTYuMDYuMDAjUHJvcHlsdGhpb3VyYWNpbCM1MS4xOC4xNi4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNy4wMC4wMCNDb3J0aWNvc3Rlcm9pZHMjNTEuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTcuMDEuMDAjQmV0YW1ldGhhc29uZSM1MS4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNy4wMi4wMCNDb3J0aWNvdHJvcGluIzUxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE3LjAzLjAwI0Nvc3ludHJvcGluIzUxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE3LjA0LjAwI0RleGFtZXRoYXNvbmUjNTEuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTcuMDUuMDAjRmx1bmlzb2xpZGUjNTEuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTcuMDYuMDAjSHlkcm9jb3J0aXNvbmUjNTEuMTguMTcuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTcuMDcuMDAjTWV0aHlscHJlZG5pc29sb25lIzUxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE3LjA4LjAwI1ByZWRuaXNvbG9uZSM1MS4xOC4xNy4wMC4wMAotdW5zcHNjNyM1MS4xOC4xNy4wOS4wMCNUcmlhbWNpbm9sb25lIzUxLjE4LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjAwLjAwI0VzdHJvZ2VucyBhbmQgcHJvZ2VzdGlucyBhbmQgaW50ZXJuYWwgY29udHJhY2VwdGl2ZXMjNTEuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTguMDEuMDAjQ2hsb3JvdHJpYW5pc2VuZSM1MS4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOC4wMi4wMCNFc3Ryb25lIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjAzLjAwI0VzdHJvZ2VucyBjb25qdWdhdGVkIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA0LjAwI0VzdHJvcGlwYXRlIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA1LjAwI0xldm9ub3JnZXN0cmVsIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA2LjAwI01lZ2VzdHJvbCBhY2V0YXRlIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA3LjAwI0V0aGlueWwgZXN0cmFkaW9sIzUxLjE4LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE4LjA4LjAwI01lc3RyYW5vbCM1MS4xOC4xOC4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wMC4wMCNHb25hZG90cm9waWMgaG9ybW9uZXMgYW5kIG92YXJpYW4gc3RpbXVsYW50cyBhbmQgaW5oaWJpdG9ycyM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wMS4wMCNDaG9yaW9uaWMgZ29uYWRvdHJvcGluIzUxLjE4LjE5LjAwLjAwCi11bnNwc2M3IzUxLjE4LjE5LjAyLjAwI0RhbmF6b2wjNTEuMTguMTkuMDAuMDAKLXVuc3BzYzcjNTEuMTguMTkuMDMuMDAjR29uYWRvcmVsaW4gYWNldGF0ZSM1MS4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wNC4wMCNIaXN0cmVsaW4gYWNldGF0ZSM1MS4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wNS4wMCNNZW5vdHJvcGlucyM1MS4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xOC4xOS4wNi4wMCNVcm9mb2xsaXRyb3BpbiM1MS4xOC4xOS4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMC4wMC4wMCNBbmRyb2dlbnMgYW5kIGFuZHJvZ2VuIGluaGliaXRvcnMjNTEuMTguMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjAuMDEuMDAjRmluYXN0ZXJpZGUjNTEuMTguMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjAuMDIuMDAjVGVzdG9zdGVyb25lIzUxLjE4LjIwLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIwLjAzLjAwI1Rlc3Rvc3Rlcm9uZSBjeXBpb25hdGUjNTEuMTguMjAuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjAuMDQuMDAjVGVzdG9zdGVyb25lIGVuYW50aGF0ZSM1MS4xOC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMC4wNS4wMCNUZXN0b3N0ZXJvbmUgcHJvcGlvbmF0ZSM1MS4xOC4yMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMS4wMC4wMCNQb3N0ZXJpb3IgcGl0dWl0YXJ5IGhvcm1vbmVzIzUxLjE4LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIxLjAxLjAwI0Rlc21vcHJlc3NpbiBhY2V0YXRlIzUxLjE4LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIxLjAyLjAwI1Zhc29wcmVzc2luIzUxLjE4LjIxLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIyLjAwLjAwI0RydWdzIGZvciBpbmR1Y2luZyBsYWJvciM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMi4wMS4wMCNEaW5vcHJvc3RvbmUjNTEuMTguMjIuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjIuMDIuMDAjTWV0aHlsZXJnb25vdmluZSBtYWxlYXRlIzUxLjE4LjIyLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIyLjAzLjAwI094eXRvY2luIzUxLjE4LjIyLjAwLjAwCi11bnNwc2M3IzUxLjE4LjIzLjAwLjAwI0dyb3d0aCBob3Jtb25lcyM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMy4wMS4wMCNTb21hdHJlbSM1MS4xOC4yMy4wMC4wMAotdW5zcHNjNyM1MS4xOC4yMy4wMi4wMCNTb21hdHJvcGluIzUxLjE4LjIzLjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjAwLjAwI0NhbGNpdW0gc2FsdHMgYW5kIGNhbGNpdW0gcmVndWxhdG9ycyM1MS4xOC4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yNC4wMS4wMCNDYWxjaXVtIGNobG9yaWRlIzUxLjE4LjI0LjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjAyLjAwI0NhbGNpdW0gY2l0cmF0ZSM1MS4xOC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yNC4wMy4wMCNDYWxjaXVtIGdsdWNvbmF0ZSM1MS4xOC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yNC4wNC4wMCNDYWxjaXVtIGxhY3RhdGUjNTEuMTguMjQuMDAuMDAKLXVuc3BzYzcjNTEuMTguMjQuMDUuMDAjRGliYXNlIGNhbGNpdW0gcGhvc3BoYXRlIzUxLjE4LjI0LjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjA2LjAwI0FsZW5kcm9uYXRlIHNvZGl1bSM1MS4xOC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xOC4yNC4wNy4wMCNDYWxjaXRvbmluIzUxLjE4LjI0LjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjA4LjAwI0NlbGx1bG9zZSBzb2RpdW0gcGhvc3BoYXRlIzUxLjE4LjI0LjAwLjAwCi11bnNwc2M3IzUxLjE4LjI0LjA5LjAwI0dhbGxpdW0gbml0cmF0ZSM1MS4xOC4yNC4wMC4wMAotdW5zcHNjNyM1MS4xOS4wMC4wMC4wMCNBZ2VudHMgYWZmZWN0aW5nIHdhdGVyIGFuZCBlbGVjdHJvbHl0ZXMjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTkuMTUuMDAuMDAjRGl1cmV0aWNzIzUxLjE5LjAwLjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjAxLjAwI0NobG9yb3RoaWF6aWRlIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjAyLjAwI0NobG9ydGhhbGlkb25lIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjAzLjAwI01lbnRvbGF6b25lIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA0LjAwI0J1bWV0YW5pZGUjNTEuMTkuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMTkuMTUuMDUuMDAjRXRoYWNyeW5hdGUgc29kaXVtIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA2LjAwI0FtaWxvcmlkZSBoeWRyb2NobG9yaWRlIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA3LjAwI1NwaXJvbm9sYWN0b25lIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA4LjAwI1RyaWFtdGVyZW5lIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE1LjA5LjAwI01hbm5pdG9sIzUxLjE5LjE1LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE2LjAwLjAwI0VsZWN0cm9seXRlcyM1MS4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOS4xNi4wMS4wMCNEZXh0cm9zZSM1MS4xOS4xNi4wMC4wMAotdW5zcHNjNyM1MS4xOS4xNi4wMi4wMCNTb2RpdW0gY2hsb3JpZGUgZWxlY3Ryb2x5dGVzIzUxLjE5LjE2LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE3LjAwLjAwI0Fsa2FsaW5pemluZyBhZ2VudHMjNTEuMTkuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMTkuMTcuMDEuMDAjVHJvbWV0aGFtaW5lIzUxLjE5LjE3LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE4LjAwLjAwI1BvdGFzc2l1bSBzYWx0cyM1MS4xOS4wMC4wMC4wMAotdW5zcHNjNyM1MS4xOS4xOC4wMS4wMCNQb3Rhc3NpdW0gYmljYXJib25hdGUjNTEuMTkuMTguMDAuMDAKLXVuc3BzYzcjNTEuMTkuMTguMDIuMDAjUG90YXNzaXVtIGNobG9yaWRlIzUxLjE5LjE4LjAwLjAwCi11bnNwc2M3IzUxLjE5LjE4LjAzLjAwI1BvdGFzc2l1bSBnbHVjb25hdGUjNTEuMTkuMTguMDAuMDAKLXVuc3BzYzcjNTEuMjAuMDAuMDAuMDAjSW1tdW5vbW9kdWxhdGluZyBkcnVncyM1MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNS4wMC4wMCNJbW11bm9zdXBwcmVzc2FudHMjNTEuMjAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTUuMDEuMDAjQXphdGhpb3ByaW5lIzUxLjIwLjE1LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE1LjAyLjAwI0N5Y2xvc3BvcmluZSM1MS4yMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNS4wMy4wMCNNeWNvcGhlbm9sYXRlIG1vZmV0aWwjNTEuMjAuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTUuMDQuMDAjVGFjcm9saW11cyM1MS4yMC4xNS4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wMC4wMCNWYWNjaW5lcyM1MS4yMC4wMC4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wMS4wMCNBbnRocmF4IGFudGlnZW4jNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMDIuMDAjQnJ1Y2VsbGEgYW50aWdlbiM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wMy4wMCNDaG9sZXJhIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjA0LjAwI0RpcGh0ZXJpYSM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wNS4wMCNFbmNlcGhhbGl0aXMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMDYuMDAjSGVtb3BoaWx1cyBpbmZsdWVuemFlIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjA3LjAwI0hlcGF0aXRpcyBiIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjA4LjAwI0luZmx1ZW56YSM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4wOS4wMCNNZWFzbGVzIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjEwLjAwI01lbmluZ29jb2NjdXMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTEuMDAjTW9yYmlsbGkjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTIuMDAjTXVtcHMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTMuMDAjUGFyb3RpdGlzIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjE0LjAwI1BlcnR1c3NpcyM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4xNS4wMCNQbmV1bW9jb2NjdXMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTYuMDAjUG9saW9teWVsaXRpcyM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4xNy4wMCNSYWJpZXMjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMTguMDAjUm90YSB2aXJ1cyM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4xOS4wMCNSdWJlbGxhIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjIwLjAwI1NtYWxscG94IzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjIxLjAwI1RldGFudXMgdG94b2lkIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjIyLjAwI1R1YmVyY3Vsb3NpcyM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4yMy4wMCNUeXBob2lkIzUxLjIwLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIwLjE2LjI0LjAwI1ZhcmljZWxsYSM1MS4yMC4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMC4xNi4yNS4wMCNZZWxsb3cgZmV2ZXIjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjAuMTYuMjYuMDAjSGVwYXRpdGlzIGEjNTEuMjAuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMDAuMDAuMDAjTWlzY2VsbGFuZW91cyBkcnVnIGNhdGVnb3JpZXMjNTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTUuMDAuMDAjQW50aWdvdXQgZHJ1Z3MjNTEuMjEuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTUuMDEuMDAjQWxsb3B1cmlub2wjNTEuMjEuMTUuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTUuMDIuMDAjQ29sY2hpY2luZSM1MS4yMS4xNS4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNS4wMy4wMCNQcm9iZW5lY2lkIzUxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE1LjA0LjAwI1N1bGZpbnB5cmF6b25lIzUxLjIxLjE1LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE2LjAwLjAwI0FudGlkb3RlcyM1MS4yMS4wMC4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNi4wMS4wMCNEZWZlcm94YW1pbmUgbWVzeWxhdGUjNTEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTYuMDIuMDAjRGV4cmF6b3hhbmUjNTEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTYuMDMuMDAjRGlnb3hpbiBpbW11bmUgZmFiIzUxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE2LjA0LjAwI0RpbWVyY2Fwcm9sIzUxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE2LjA1LjAwI0VkZXRhdGUgZGlzb2RpdW0jNTEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTYuMDYuMDAjRmx1bWF6ZW5pbCM1MS4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNi4wNy4wMCNJcGVjYWMjNTEuMjEuMTYuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTYuMDguMDAjUGVuaWNpbGxhbWluZSM1MS4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNi4wOS4wMCNQcm90YW1pbmUgc3VsZmF0ZSM1MS4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNi4xMC4wMCNTb2RpdW0gcG9seXN0eXJlbmUgc3VsZm9uYXRlIzUxLjIxLjE2LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE2LjExLjAwI1RyaWVudGluZSM1MS4yMS4xNi4wMC4wMAotdW5zcHNjNyM1MS4yMS4xNy4wMC4wMCNOdXRyaXRpb3VzIGZvb2QjNTEuMjEuMDAuMDAuMDAKLXVuc3BzYzcjNTEuMjEuMTcuMDEuMDAjUmVzaWR1ZSBvZiBtYWl6ZSBnZXJtIzUxLjIxLjE3LjAwLjAwCi11bnNwc2M3IzUxLjIxLjE4LjAwLjAwI0FuYWVzdGhldGljIGRydWdzIzUxLjIxLjAwLjAwLjAwCi11bnNwc2M3IzUxLjIxLjE4LjAxLjAwI0NobG9yb2Zvcm0jNTEuMjEuMTguMDAuMDAKLXVuc3BzYzcjNTIuMDAuMDAuMDAuMDAjRG9tZXN0aWMgQXBwbGlhbmNlcyBhbmQgU3VwcGxpZXMgYW5kIENvbnN1bWVyIEVsZWN0cm9uaWMgUHJvZHVjdHMjNTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMDAuMDAuMDAjRmxvb3IgY292ZXJpbmdzIzUyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjAwLjAwI1J1Z3MgYW5kIG1hdHMjNTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMTUuMDEuMDAjT3JpZW50YWwgcnVncyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4wMi4wMCNBcmVhIHJ1Z3MjNTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMTUuMDMuMDAjV29vbCBydWdzIzUyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjA0LjAwI0NvdHRvbiBydWdzIzUyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjA1LjAwI1N5bnRoZXRpYyBydWdzIzUyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjA2LjAwI0JyYWlkZWQgcnVncyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4wNy4wMCNCYXRoIG1hdHMjNTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMTUuMDguMDAjRG9vciBtYXRzIzUyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEwLjE1LjA5LjAwI0RlY29yYXRpdmUgbWF0cyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4xMC4wMCNBbnRpIGZhdGlndWUgbWF0cyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4xMS4wMCNSdWJiZXIgb3IgdmlueWwgbWF0cyM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMC4xNS4xMi4wMCNDaGFpciBtYXQjNTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTAuMTUuMTMuMDAjQ2FycGV0IHByb3RlY3RvciM1Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4wMC4wMC4wMCNBY2NvbW1vZGF0aW9uIGZ1cm5pdHVyZSM1Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4wMC4wMCNGdXJuaXR1cmUjNTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMDEuMDAjU29mYXMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMDIuMDAjU3RhbmRzIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjAzLjAwI0Jvb2tjYXNlcyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4wNC4wMCNFbnRlcnRhaW5tZW50IGNlbnRlcnMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMDUuMDAjRnV0b25zIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjA2LjAwI0NoYWlycyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4wNy4wMCNDb2F0IHJhY2tzIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjA4LjAwI1dhbGwgcmFja3MjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMDkuMDAjTWF0dHJlc3NlcyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4xMC4wMCNDb3RzIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjExLjAwI0JlZHMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMTIuMDAjRm9vdCBzdG9vbHMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMTMuMDAjVGFibGVzIzUyLjExLjE1LjAwLjAwCi11bnNwc2M3IzUyLjExLjE1LjE0LjAwI0NoZXN0cyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNS4xNS4wMCNTdG9vbHMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMTYuMDAjRHJlc3NlcnMjNTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTEuMTUuMTcuMDAjUGFydGl0aW9ucyM1Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNi4wMC4wMCNPdXRkb29yIGZ1cm5pdHVyZSM1Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNi4wMS4wMCNPdXRkb29yIGNoYWlycyM1Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNi4wMi4wMCNPdXRkb29yIHRhYmxlcyBvciBwaWNuaWMgdGFibGVzIzUyLjExLjE2LjAwLjAwCi11bnNwc2M3IzUyLjExLjE2LjAzLjAwI091dGRvb3Igc3dpbmdzIzUyLjExLjE2LjAwLjAwCi11bnNwc2M3IzUyLjExLjE2LjA0LjAwI091dGRvb3IgYmVuY2hlcyM1Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNi4wNS4wMCNPdXRkb29yIHVtYnJlbGxhcyM1Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNy4wMC4wMCNPZmZpY2UgZnVybml0dXJlIzUyLjExLjAwLjAwLjAwCi11bnNwc2M3IzUyLjExLjE3LjAxLjAwI0NyZWRlbnphcyM1Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Mi4xMS4xNy4wMy4wMCNEZXNrcyM1Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Mi4xMi4wMC4wMC4wMCNCZWRjbG90aGVzIGFuZCB0YWJsZSBhbmQga2l0Y2hlbiBsaW5lbiBhbmQgdG93ZWxzIzUyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjAwLjAwI0JlZGNsb3RoZXMjNTIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTUuMDEuMDAjUXVpbHRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjAyLjAwI0NvbWZvcnRlcnMjNTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTUuMDMuMDAjQ29tZm9ydGVyIGNvdmVycyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNS4wNC4wMCNNYXR0cmVzcyBjb3ZlcnMjNTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTUuMDUuMDAjUGlsbG93cyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNS4wNi4wMCNNYXR0cmVzcyBwYWRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjA3LjAwI0ZlYXRoZXJiZWRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjA4LjAwI0JsYW5rZXRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjA5LjAwI1NoZWV0cyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNS4xMC4wMCNEdXN0IHJ1ZmZsZXMjNTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTUuMTEuMDAjRHV2ZXRzIzUyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE1LjEyLjAwI1BpbGxvdyBjYXNlcyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNS4xMy4wMCNCZWQgc3ByZWFkcyM1Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNi4wMC4wMCNUYWJsZSBhbmQga2l0Y2hlbiBsaW5lbiM1Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNi4wMS4wMCNEaXNoIHRvd2VscyM1Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNi4wMi4wMCNOYXBraW5zIzUyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE2LjAzLjAwI1RhYmxlIHJ1bm5lcnMjNTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTYuMDQuMDAjVGFibGUgY2xvdGhzIzUyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE2LjA1LjAwI0RvbWVzdGljIG92ZW4gbWl0cyBvciBwb3QgaG9sZGVycyM1Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNi4wNi4wMCNQbGFjZSBtYXRzIzUyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE2LjA3LjAwI1RhYmxlIHNraXJ0cyM1Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMi4xNy4wMC4wMCNUb3dlbHMjNTIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTcuMDEuMDAjQmF0aCB0b3dlbHMjNTIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTIuMTcuMDIuMDAjQmVhY2ggdG93ZWxzIzUyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE3LjAzLjAwI1dhc2ggY2xvdGhzIzUyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEyLjE3LjA0LjAwI0hhbmQgdG93ZWxzIzUyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEzLjAwLjAwLjAwI1dpbmRvdyB0cmVhdG1lbnRzIzUyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUyLjEzLjE1LjAwLjAwI0N1cnRhaW5zIGFuZCBkcmFwZXJpZXMjNTIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTUuMDEuMDAjQ3VydGFpbnMjNTIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTUuMDMuMDAjRHJhcGVyaWVzIzUyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUyLjEzLjE2LjAwLjAwI0JsaW5kcyBhbmQgc2hhZGVzIzUyLjEzLjAwLjAwLjAwCi11bnNwc2M3IzUyLjEzLjE2LjAxLjAwI1ZlbmV0aWFuIGJsaW5kcyM1Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMy4xNi4wMi4wMCNSb2xsIHVwIHNoYWRlcyM1Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMy4xNi4wMy4wMCNJbnRlcmlvciBzaHV0dGVycyM1Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xMy4xNi4wNC4wMCNWZXJ0aWNhbCBibGluZHMjNTIuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTcuMDAuMDAjV2luZG93IHRyZWF0bWVudCBhY2Nlc3NvcmllcyBhbmQgaGFyZHdhcmUjNTIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTcuMDEuMDAjVmFsYW5jZXMjNTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTMuMTcuMDIuMDAjQ3VydGFpbiByb2RzIzUyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEzLjE3LjAzLjAwI1JvZCBmaW5pYWxzIzUyLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUyLjEzLjE3LjA0LjAwI0N1cnRhaW4gcmluZ3Mgb3IgY2xpcHMjNTIuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMDAuMDAuMDAjRG9tZXN0aWMgYXBwbGlhbmNlcyM1Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4wMC4wMCNEb21lc3RpYyBraXRjaGVuIGFwcGxpYW5jZXMjNTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMDEuMDAjRG9tZXN0aWMgcmVmcmlnZXJhdG9ycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4wMi4wMCNEb21lc3RpYyBtaWNyb3dhdmUgb3ZlbnMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMDMuMDAjRG9tZXN0aWMgZ2FyYmFnZSBkaXNwb3NhbHMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMDQuMDAjRG9tZXN0aWMgcmFuZ2VzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjA1LjAwI0RvbWVzdGljIGRpc2ggd2FzaGVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4wNi4wMCNEb21lc3RpYyBmcmVlemVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4wNy4wMCNEb21lc3RpYyB1cHJpZ2h0IGZyZWV6ZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjA4LjAwI0RvbWVzdGljIGNoZXN0IGZyZWV6ZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjA5LjAwI0RvbWVzdGljIGNvbWJpbmF0aW9uIHJlZnJpZ2VyYXRvciBmcmVlemVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4xMC4wMCNEb21lc3RpYyBwb3J0YWJsZSBhaXIgY29uZGl0aW9uZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjExLjAwI0RvbWVzdGljIGp1aWNlcnMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMTIuMDAjRG9tZXN0aWMgd2FmZmxlIGlyb25zIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjEzLjAwI0RvbWVzdGljIGVsZWN0cmljIGNhbiBvcGVuZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjE0LjAwI0RvbWVzdGljIGZvb2QgcHJvY2Vzc29ycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4xNS4wMCNEb21lc3RpYyB0cmFzaCBjb21wYWN0b3JzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjE2LjAwI0RvbWVzdGljIGRlZXAgZnJ5ZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjE3LjAwI0RvbWVzdGljIHBvcGNvcm4gcG9wcGVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4xOC4wMCNEb21lc3RpYyBicmVhZCBtYWtpbmcgbWFjaGluZXMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMTkuMDAjRG9tZXN0aWMgY29udmVjdGlvbmFsIG92ZW5zIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjIwLjAwI0RvbWVzdGljIG1peGVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4yMS4wMCNEb21lc3RpYyB0b2FzdGVyIG92ZW5zIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjIyLjAwI0RvbWVzdGljIHRvYXN0ZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjIzLjAwI0RvbWVzdGljIGVsZWN0cmljYWwga2V0dGxlcyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4yNC4wMCNEb21lc3RpYyBibGVuZGVycyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4yNS4wMCNEb21lc3RpYyBob3QgcGxhdGVzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjI2LjAwI0RvbWVzdGljIGNvZmZlZSBtYWtlcnMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMjcuMDAjRG9tZXN0aWMgZWxlY3RyaWMga25pdmVzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjI4LjAwI0RvbWVzdGljIGVsZWN0cmljIHdva3MjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMjkuMDAjRG9tZXN0aWMgY29mZmVlIGdyaW5kZXJzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjMwLjAwI1BhcnRzIG9mIGRpc2h3YXNoaW5nIG1hY2hpbmVzIzUyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE1LjMxLjAwI0RvbWVzdGljIGZvb2QgY2hvcHBlcnMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMzIuMDAjRG9tZXN0aWMgZWxlY3RyaWMgc2tpbGxldHMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMzMuMDAjRG9tZXN0aWMgZWxlY3RyaWMgZ3JpZGRsZXMjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMzQuMDAjRG9tZXN0aWMgZWxlY3RyaWMgc2FuZHdpY2ggbWFrZXIjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTUuMzUuMDAjRG9tZXN0aWMgaW5kb29yIGVsZWN0cmljIGdyaWxscyM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4zNi4wMCNEb21lc3RpYyBwaXplbGxlIG9yIGNvb2tpZSBtYWtlciM1Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNS4zNy4wMCNEb21lc3RpYyBjcm9jayBwb3QjNTIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTYuMDAuMDAjRG9tZXN0aWMgbGF1bmRyeSBhcHBsaWFuY2VzIGFuZCBzdXBwbGllcyM1Mi4xNC4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNi4wMS4wMCNEb21lc3RpYyBjbG90aGVzIHdhc2hlcnMjNTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTYuMDIuMDAjRG9tZXN0aWMgdHVtYmxlIGRyeWVycyM1Mi4xNC4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNi4wMy4wMCNEb21lc3RpYyBjbG90aGluZyBpcm9ucyM1Mi4xNC4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNi4wNC4wMCNGb290d2VhciBkcnllcnMjNTIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTYuMDUuMDAjTGF1bmRyeSBoYW1wZXJzIzUyLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE2LjA2LjAwI0xhdW5kcnkgYmFza2V0cyM1Mi4xNC4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNy4wMC4wMCNEb21lc3RpYyBiYXRoIGFwcGxpYW5jZXMjNTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTcuMDEuMDAjRG9tZXN0aWMgZWxlY3RyaWMgdG9vdGhicnVzaGVzIzUyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE3LjAzLjAwI0RvbWVzdGljIGhhaXIgZHJ5ZXJzIzUyLjE0LjE3LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE3LjA0LjAwI0RvbWVzdGljIGVsZWN0cmljIHJhem9ycyM1Mi4xNC4xNy4wMC4wMAotdW5zcHNjNyM1Mi4xNC4xNy4wNS4wMCNQYXJ0cyBvZiBzaGF2ZXJzIG9yIGhhaXIgcmVtb3ZlcnMjNTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTcuMDYuMDAjTmFpbCBkcnllcnMjNTIuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTguMDAuMDAjT3RoZXIgZG9tZXN0aWMgaG91c2Vob2xkIGFwcGxpYW5jZXMjNTIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTguMDEuMDAjRG9tZXN0aWMgc2V3aW5nIG1hY2hpbmVzIzUyLjE0LjE4LjAwLjAwCi11bnNwc2M3IzUyLjE0LjE4LjAyLjAwI0RvbWVzdGljIHNwYWNlIGhlYXRlcnMjNTIuMTQuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTQuMTguMDMuMDAjRG9tZXN0aWMgZWxlY3RyaWMgYmxhbmtldHMjNTIuMTQuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMDAuMDAuMDAjRG9tZXN0aWMga2l0Y2hlbndhcmUjNTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTUuMDAuMDAjRG9tZXN0aWMgZGlzcG9zYWJsZSBraXRjaGVud2FyZSM1Mi4xNS4wMC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNS4wMS4wMCNEb21lc3RpYyBkaXNwb3NhYmxlIGNvb2t3YXJlIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE1LjAyLjAwI0RvbWVzdGljIGRpc3Bvc2FibGUgZGlzaGVzIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE1LjAzLjAwI0RvbWVzdGljIGRpc3Bvc2FibGUgZmxhdHdhcmUjNTIuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTUuMDQuMDAjRG9tZXN0aWMgZGlzcG9zYWJsZSBjdXBzIG9yIGdsYXNzZXMgb3IgbGlkcyM1Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNS4wNS4wMCNEb21lc3RpYyBkaXNwb3NhYmxlIHN0aXJyZXJzIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE1LjA2LjAwI0RvbWVzdGljIGRpc3Bvc2FibGUgZm9vZCBjb250YWluZXJzIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE1LjA3LjAwI0RvbWVzdGljIGRpc3Bvc2FibGUgZHJpbmtpbmcgc3RyYXdzIzUyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjAwLjAwI0RvbWVzdGljIGtpdGNoZW4gdG9vbHMgYW5kIHV0ZW5zaWxzIzUyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjAxLjAwI0RvbWVzdGljIHJvbGxpbmcgcGlucyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wMi4wMCNEb21lc3RpYyBtaXhpbmcgYm93bHMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMDMuMDAjRG9tZXN0aWMgZ3JhdGVycyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wNC4wMCNEb21lc3RpYyBzdHJhaW5lcnMgb3IgY29sYW5kZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjA1LjAwI0RvbWVzdGljIGNhbiBvciBib3R0bGUgb3BlbmVycyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wNi4wMCNEb21lc3RpYyBjdXR0aW5nIGJvYXJkcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wNy4wMCNEb21lc3RpYyBtZWFzdXJpbmcgY3VwcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wOC4wMCNCYXN0ZXJzIG9yIGJhc3RpbmcgYnJ1c2hlcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4wOS4wMCNWZWdldGFibGUgcGVlbGVyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjEwLjAwI0Nvb2tpZSBjdXR0ZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjExLjAwI0RvbWVzdGljIGtpdGNoZW4gdG9uZ3MjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMTIuMDAjRG9tZXN0aWMga2l0Y2hlbiB3aXJlIHdoaXBzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjEzLjAwI0RvbWVzdGljIGZvb2Qgc2NyYXBlcnMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMTQuMDAjRG9tZXN0aWMgY29vbGluZyByYWNrcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4xNS4wMCNEb21lc3RpYyBwaXp6YSBjdXR0ZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjE2LjAwI0RvbWVzdGljIGtpdGNoZW4gc3BhdHVsYXMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMTcuMDAjRG9tZXN0aWMgd29vZGVuIHNwb29ucyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4xOC4wMCNEb21lc3RpYyB3b29kZW4gb3ZlbiBwYWRkbGUjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMTkuMDAjRG9tZXN0aWMgcGFzdHJ5IGJsZW5kZXIjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMjAuMDAjRG9tZXN0aWMgc2lmdGVyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjIxLjAwI0RvbWVzdGljIGNvb2tpZSBzdGFtcGVycyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4yMi4wMCNEb21lc3RpYyBwYXN0cnkgZGVjb3JhdGluZyBndW4jNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMjMuMDAjRG9tZXN0aWMgY29va2llIHByZXNzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjI0LjAwI0RvbWVzdGljIGtuaWZlIHNoYXJwZW5lcnMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMjUuMDAjRG9tZXN0aWMgYmlzY3VpdCBjdXR0ZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjI2LjAwI0RvbWVzdGljIG1hbmRvbGluIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjI3LjAwI0RvbWVzdGljIGdhcmxpYyBwcmVzcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4yOC4wMCNEb21lc3RpYyBlZ2cgc2xpY2VyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjI5LjAwI0RvbWVzdGljIGVnZyBzZXBhcmF0b3IjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzAuMDAjRG9tZXN0aWMgY2hlZXNlIHNsaWNlciM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4zMS4wMCNEb21lc3RpYyBmb29kIG1pbGwjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzIuMDAjRG9tZXN0aWMga2l0Y2hlbiBmdW5uZWxzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjMzLjAwI0RvbWVzdGljIGdhcm5pc2hpbmcgdG9vbHMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzQuMDAjRG9tZXN0aWMgYXBwbGUgY29yZXIjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzUuMDAjRG9tZXN0aWMgbWVsb24gb3IgYnV0dGVyIGJhbGxlciM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4zNi4wMCNEb21lc3RpYyBmb29kIHNjb29wcyM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4zNy4wMCNEb21lc3RpYyBwdW1wa2luIGNhcnZlciM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi4zOC4wMCNEb21lc3RpYyB2ZWdldGFibGUgYnJ1c2gjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuMzkuMDAjRG9tZXN0aWMgZWdnIGJlYXRlciM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi40MC4wMCNEb21lc3RpYyBwYXN0YSBkcnlpbmcgcmFjayM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi40MS4wMCNEb21lc3RpYyB3aGlwcGVkIGNyZWFtIG1ha2VyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQyLjAwI0RvbWVzdGljIGRvdWdoIHByZXNzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQzLjAwI0RvbWVzdGljIHJhdmlvbGkgbWFrZXIjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuNDQuMDAjRG9tZXN0aWMgbWlzdCBzcHJheWVyIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQ1LjAwI0RvbWVzdGljIHBhc3RyeSBicnVzaCM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi40Ni4wMCNEb21lc3RpYyBraXRjaGVuIG9yIGRpZXQgc2NhbGVzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQ3LjAwI0RvbWVzdGljIGtpdGNoZW4gdGltZXJzIzUyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE2LjQ4LjAwI0RvbWVzdGljIGtpdGNoZW4gb3IgZm9vZCB0aGVybW9tZXRlcnMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTYuNDkuMDAjRG9tZXN0aWMgYnJlYWQgc2xpY2luZyBndWlkZSM1Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNi41MC4wMCNEb21lc3RpYyBkcmFpbiBib2FyZHMjNTIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTcuMDAuMDAjRG9tZXN0aWMgZmxhdHdhcmUgYW5kIGN1dGxlcnkjNTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTcuMDEuMDAjRG9tZXN0aWMgc2VydmluZyB1dGVuc2lscyM1Mi4xNS4xNy4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xNy4wMi4wMCNEb21lc3RpYyBrbml2ZXMjNTIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTcuMDMuMDAjRG9tZXN0aWMgZm9ya3MjNTIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTcuMDQuMDAjRG9tZXN0aWMgc3Bvb25zIzUyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE3LjA1LjAwI1Nwb29uIHJlc3RzIzUyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE3LjA2LjAwI0Nob3BzdGlja3MjNTIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDAuMDAjRG9tZXN0aWMgY29va3dhcmUjNTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDEuMDAjRG9tZXN0aWMgZHV0Y2ggb3ZlbnMjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDIuMDAjRG9tZXN0aWMgZnJ5aW5nIHBhbnMjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDMuMDAjRG9tZXN0aWMgc2F1Y2VwYW5zIzUyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE4LjA0LjAwI0RvbWVzdGljIGtldHRsZXMjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDUuMDAjRG9tZXN0aWMgd29rcyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4wNi4wMCNEb21lc3RpYyBzdGVhbWVycyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4wNy4wMCNEb21lc3RpYyBzdG9jayBwb3RzIzUyLjE1LjE4LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE4LjA4LjAwI0RvbWVzdGljIHByZXNzdXJlIGNvb2tlcnMjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTguMDkuMDAjRG9tZXN0aWMgc2F1dGUgcGFucyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4xMC4wMCNEb21lc3RpYyBjaGFmaW5nIGRpc2hlcyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4xMS4wMCNEb21lc3RpYyBncmlkZGxlcyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4xMi4wMCNEb21lc3RpYyBkb3VibGUgYm9pbGVycyM1Mi4xNS4xOC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOC4xMy4wMCNEb21lc3RpYyBzcGxhdHRlciBzaGllbGQjNTIuMTUuMTguMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDAuMDAjRG9tZXN0aWMgYmFrZXdhcmUjNTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDEuMDAjRG9tZXN0aWMgbXVmZmluIHBhbnMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDIuMDAjRG9tZXN0aWMgYmFraW5nIHBhbnMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDMuMDAjRG9tZXN0aWMgY2FrZSBvciBwaWUgcGFucyM1Mi4xNS4xOS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOS4wNC4wMCNEb21lc3RpYyByb2FzdGluZyBwYW5zIzUyLjE1LjE5LjAwLjAwCi11bnNwc2M3IzUyLjE1LjE5LjA1LjAwI0RvbWVzdGljIGJha2luZyBzaGVldHMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDYuMDAjRG9tZXN0aWMgYnJvaWxpbmcgcGFucyM1Mi4xNS4xOS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOS4wNy4wMCNEb21lc3RpYyBiYWtpbmcgbW9sZHMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMTkuMDguMDAjRG9tZXN0aWMgcGl6emEgcGFucyM1Mi4xNS4xOS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4xOS4wOS4wMCNEb21lc3RpYyB0b3J0aWxsYSBiYWtlcnMjNTIuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMDAuMDAjRG9tZXN0aWMgZGlzaGVzIGFuZCBzZXJ2aW5nd2FyZSBhbmQgc3RvcmFnZSBjb250YWluZXJzIzUyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjAxLjAwI0RvbWVzdGljIHBpdGNoZXJzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjAyLjAwI0RvbWVzdGljIGZvb2Qgc3RvcmFnZSBjb250YWluZXJzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjAzLjAwI0RvbWVzdGljIHB1bmNoIGJvd2xzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjA0LjAwI0RvbWVzdGljIHBsYXRlcyM1Mi4xNS4yMC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMC4wNS4wMCNEb21lc3RpYyBzYXVjZXJzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjA2LjAwI0RvbWVzdGljIHRyYXlzIG9yIHBsYXR0ZXJzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjA3LjAwI0RvbWVzdGljIHNlcnZpbmcgYm93bHMjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMDguMDAjRG9tZXN0aWMgdGVhIG9yIGNvZmZlZSBwb3RzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjA5LjAwI0RvbWVzdGljIHNvdXAgb3Igc2FsYWQgYm93bHMjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMTAuMDAjRG9tZXN0aWMgdmFjdXVtIGZsYXNrcyM1Mi4xNS4yMC4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMC4xMS4wMCNJbm5lcnMgZm9yIHZhY2N1bSBmbGFza3MjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMTIuMDAjSWNlIHRyYXlzIzUyLjE1LjIwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIwLjEzLjAwI1NwaWNlIG9yIHNhbHQgb3IgcGVwcGVyIHNoYWtlcnMjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMTQuMDAjQ2FyYWZlIHNldHMjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjAuMTUuMDAjRG9tZXN0aWMgY2FrZSBwbGF0ZSB3aXRoIGRvbWUjNTIuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjEuMDAuMDAjRG9tZXN0aWMgZHJpbmtpbmcgdXRlbnNpbHMjNTIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjEuMDEuMDAjRG9tZXN0aWMgY29mZmVlIG9yIHRlYSBjdXBzIzUyLjE1LjIxLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIxLjAyLjAwI0RvbWVzdGljIGRyaW5raW5nIGdsYXNzZXMjNTIuMTUuMjEuMDAuMDAKLXVuc3BzYzcjNTIuMTUuMjEuMDMuMDAjRG9tZXN0aWMgbXVncyM1Mi4xNS4yMS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMS4wNC4wMCNEb21lc3RpYyBzdGVtd2FyZSM1Mi4xNS4yMS4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMi4wMC4wMCNEaXNod2FzaGluZyBhbmQgZGlzaCBzdG9yYWdlIGFjY2Vzc29yaWVzIzUyLjE1LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIyLjAxLjAwI1NoZWxmIGxpbmVyIzUyLjE1LjIyLjAwLjAwCi11bnNwc2M3IzUyLjE1LjIyLjAyLjAwI0Rpc2ggZHJhaW5lciM1Mi4xNS4yMi4wMC4wMAotdW5zcHNjNyM1Mi4xNS4yMi4wMy4wMCNTb2FwIGRpc3BlbnNpbmcgYnJ1c2gjNTIuMTUuMjIuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMDAuMDAuMDAjQ29uc3VtZXIgZWxlY3Ryb25pY3MjNTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDAuMDAjQXVkaW8gYW5kIHZpc3VhbCBlcXVpcG1lbnQjNTIuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDEuMDAjQ29tcGFjdCBkaXNjIHBsYXllcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDIuMDAjQ2Fzc2V0dGUgcGxheWVycyBvciByZWNvcmRlcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDMuMDAjRGlnaXRhbCB2aWRlbyBkaXNjIHBsYXllcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDQuMDAjVmlkZW8gY2Fzc2V0dGUgcmVjb3JkZXJzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjA1LjAwI1RlbGV2aXNpb25zIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjA2LjAwI0hlYWRwaG9uZXMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMDcuMDAjQ2xvY2sgcmFkaW9zIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjA4LjAwI0xhc2VyIGRpc2MgcGxheWVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4wOS4wMCNQb3J0YWJsZSBzdGVyZW8gc3lzdGVtcyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xMC4wMCNIb21lIHN0ZXJlbyBzeXN0ZW1zIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjExLjAwI1JhZGlvcyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xMi4wMCNTcGVha2VycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xMy4wMCNDb21iaW5hdGlvbiB0ZWxldmlzaW9uIHZpZGVvIGNhc3NldHRlIHJlY29yZGVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xNC4wMCNIZWFkcGhvbmVzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjE1LjAwI0NvbXBhY3QgZGlzayBwbGF5ZXJzIG9yIHJlY29yZGVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xNi4wMCNEaWdpdGFsIHZpZGVvIGRpc2sgcGxheWVycyBvciByZWNvcmRlcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMTcuMDAjRXF1YWxpemVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xOC4wMCNHbG9iYWwgcG9zaXRpb25pbmcgc3lzdGVtIHJlY2VpdmVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4xOS4wMCNIZWFkcGhvbmVzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjIwLjAwI01pY3JvcGhvbmVzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjIxLjAwI011bHRpbWVkaWEgcmVjZWl2ZXJzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjIyLjAwI1JhZGlvIGZyZXF1ZW5jeSBzY2FubmVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4yMy4wMCNSYWRpbyBmcmVxdWVuY3kgdHJhbnNtaXR0ZXJzcmVjZWl2ZXJzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjI0LjAwI1JhZGlvIHJlY2VpdmVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4yNS4wMCNSZW1vdGUgY29udHJvbCM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4yNi4wMCNTYXRlbGxpdGUgcmVjZWl2ZXJzIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjI3LjAwI1N1Yndvb2ZlcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMjguMDAjVGVsZXZpc2lvbnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMjkuMDAjVmlkZW8gY2Fzc2V0dGUgcGxheWVycyBvciByZWNvcmRlcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMzAuMDAjVmlkZW8gbW9uaXRvcnMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMzEuMDAjUmFkaW8gcGhvbm9ncmFwaHMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMzIuMDAjS2FyYW9rZSBzeXN0ZW1zIzUyLjE2LjE1LjAwLjAwCi11bnNwc2M3IzUyLjE2LjE1LjMzLjAwI01lZ2FwaG9uZXMjNTIuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTUuMzQuMDAjSW50ZWdyYXRlZCBjaXJjdXQgSUMgY2hpcCByZWNvcmRlciM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4zNS4wMCNEaWdpdGFsIHZvaWNlIHJlY29yZGVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNS4zNi4wMCNNaW5pZGlzYyBwbGF5ZXJzIG9yIHJlY29yZGVycyM1Mi4xNi4xNS4wMC4wMAotdW5zcHNjNyM1Mi4xNi4xNi4wMC4wMCNBdWRpbyB2aXN1YWwgZXF1aXBtZW50IGFjY2Vzc29yaWVzIzUyLjE2LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE2LjE2LjAxLjAwI0Nhc3NldHRlIHN0b3JhZ2UjNTIuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNTIuMTYuMTYuMDIuMDAjQXVkaW8gb3IgdmlkZW8gaGVhZCBjbGVhbmVycyM1Mi4xNi4xNi4wMC4wMAotdW5zcHNjNyM1Mi4xNy4wMC4wMC4wMCNEb21lc3RpYyB3YWxsIHRyZWF0bWVudHMjNTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTIuMTcuMTAuMDAuMDAjQmF0aHJvb20gd2FsbCB0cmVhdG1lbnRzIzUyLjE3LjAwLjAwLjAwCi11bnNwc2M3IzUyLjE3LjEwLjAxLjAwI0hhbmdpbmcgdG9pbGV0cnkgb3JnYW5pemVyIG9yIHNoZWxmIzUyLjE3LjEwLjAwLjAwCi11bnNwc2M3IzUzLjAwLjAwLjAwLjAwI0FwcGFyZWwgYW5kIEx1Z2dhZ2UgYW5kIFBlcnNvbmFsIENhcmUgUHJvZHVjdHMjNTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMDAuMDAuMDAjQ2xvdGhpbmcjNTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTUuMDAuMDAjU2xhY2tzIGFuZCB0cm91c2VycyBhbmQgc2hvcnRzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjE1LjAxLjAwI0JveXMgc2xhY2tzIG9yIHRyb3VzZXJzIG9yIHNob3J0cyM1My4xMC4xNS4wMC4wMAotdW5zcHNjNyM1My4xMC4xNS4wMi4wMCNNZW5zIHNsYWNrcyBvciB0cm91c2VycyBvciBzaG9ydHMjNTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTUuMDMuMDAjR2lybHMgc2xhY2tzIG9yIHRyb3VzZXJzIG9yIHNob3J0cyM1My4xMC4xNS4wMC4wMAotdW5zcHNjNyM1My4xMC4xNS4wNC4wMCNXb21lbnMgc2xhY2tzIG9yIHRyb3VzZXJzIG9yIHNob3J0cyM1My4xMC4xNS4wMC4wMAotdW5zcHNjNyM1My4xMC4xNS4wNS4wMCNJbmZhbnRzIHNsYWNrcyBvciB0cm91c2VycyBvciBzaG9ydHMjNTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTYuMDAuMDAjU2hpcnRzIGFuZCBibG91c2VzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjE2LjAxLjAwI0JveXMgc2hpcnRzIzUzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE2LjAyLjAwI01lbnMgc2hpcnRzIzUzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE2LjAzLjAwI0dpcmxzIHNoaXJ0cyBvciBibG91c2VzIzUzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE2LjA0LjAwI1dvbWVucyBzaGlydHMgb3IgYmxvdXNlcyM1My4xMC4xNi4wMC4wMAotdW5zcHNjNyM1My4xMC4xNi4wNS4wMCNJbmZhbnRzIHNoaXJ0cyBvciBibG91c2VzIzUzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE3LjAwLjAwI1N3ZWF0ZXJzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjE3LjAxLjAwI0JveXMgc3dlYXRlcnMjNTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTcuMDIuMDAjTWVucyBzd2VhdGVycyM1My4xMC4xNy4wMC4wMAotdW5zcHNjNyM1My4xMC4xNy4wMy4wMCNHaXJscyBzd2VhdGVycyM1My4xMC4xNy4wMC4wMAotdW5zcHNjNyM1My4xMC4xNy4wNC4wMCNXb21lbnMgc3dlYXRlcnMjNTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTcuMDUuMDAjSW5mYW50cyBzd2VhdGVycyM1My4xMC4xNy4wMC4wMAotdW5zcHNjNyM1My4xMC4xOC4wMC4wMCNDb2F0cyBhbmQgamFja2V0cyM1My4xMC4wMC4wMC4wMAotdW5zcHNjNyM1My4xMC4xOC4wMS4wMCNCb3lzIGNvYXRzIG9yIGphY2tldHMjNTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTguMDIuMDAjTWVucyBjb2F0cyBvciBqYWNrZXRzIzUzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE4LjAzLjAwI0dpcmxzIGNvYXRzIG9yIGphY2tldHMjNTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTguMDQuMDAjV29tZW5zIGNvYXRzIG9yIGphY2tldHMjNTMuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTguMDUuMDAjSW5mYW50cyBjb2F0cyBvciBqYWNrZXRzIzUzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzUzLjEwLjE5LjAwLjAwI1N1aXRzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjE5LjAxLjAwI0JveXMgc3VpdHMjNTMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTkuMDIuMDAjTWVucyBzdWl0cyM1My4xMC4xOS4wMC4wMAotdW5zcHNjNyM1My4xMC4xOS4wMy4wMCNHaXJscyBzdWl0cyM1My4xMC4xOS4wMC4wMAotdW5zcHNjNyM1My4xMC4xOS4wNC4wMCNXb21lbnMgc3VpdHMjNTMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMTkuMDUuMDAjSW5mYW50cyBzdWl0cyM1My4xMC4xOS4wMC4wMAotdW5zcHNjNyM1My4xMC4yMC4wMC4wMCNEcmVzc2VzIGFuZCBza2lydHMgYW5kIHNhcmlzIGFuZCBraW1vbm9zIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIwLjAxLjAwI0dpcmxzIGRyZXNzZXMgb3Igc2tpcnRzIG9yIHNhcmlzIG9yIGtpbW9ub3MjNTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjAuMDIuMDAjV29tZW5zIGRyZXNzZXMgb3Igc2tpcnRzIG9yIHNhcmlzIG9yIGtpbW9ub3MjNTMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjAuMDMuMDAjSW5mYW50cyBkcmVzc2VzIG9yIHNraXJ0cyBvciBzYXJpcyBvciBraW1vbm9zIzUzLjEwLjIwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIxLjAwLjAwI092ZXJhbGxzIGFuZCBjb3ZlcmFsbHMjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjEuMDEuMDAjQm95cyBvdmVyYWxscyBvciBjb3ZlcmFsbHMjNTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjEuMDIuMDAjTWVucyBvdmVyYWxscyBvciBjb3ZlcmFsbHMjNTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjEuMDMuMDAjR2lybHMgb3ZlcmFsbHMgb3IgY292ZXJhbGxzIzUzLjEwLjIxLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIxLjA0LjAwI1dvbWVucyBvdmVyYWxscyBvciBjb3ZlcmFsbHMjNTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjEuMDUuMDAjSW5mYW50cyBvdmVyYWxscyBvciBjb3ZlcmFsbHMjNTMuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjIuMDAuMDAjRm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIyLjAxLjAwI0JveXMgZm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIyLjAyLjAwI01lbnMgZm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIyLjAzLjAwI0dpcmxzIGZvbGtsb3JpYyBjbG90aGluZyM1My4xMC4yMi4wMC4wMAotdW5zcHNjNyM1My4xMC4yMi4wNC4wMCNXb21lbnMgZm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIyLjA1LjAwI0luZmFudHMgZm9sa2xvcmljIGNsb3RoaW5nIzUzLjEwLjIyLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIzLjAwLjAwI1VuZGVyZ2FybWVudHMjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjMuMDEuMDAjVW5kZXJzaGlydHMjNTMuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjMuMDIuMDAjU2xpcHMjNTMuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjMuMDMuMDAjVW5kZXJwYW50cyM1My4xMC4yMy4wMC4wMAotdW5zcHNjNyM1My4xMC4yMy4wNC4wMCNCcmFzc2llcmVzIzUzLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIzLjA1LjAwI0luZmFudCBkaWFwZXJzIzUzLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUzLjEwLjIzLjA2LjAwI0FkdWx0IGRpYXBlcnMjNTMuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjMuMDcuMDAjQm9keSBzaGFwaW5nIGdhcm1lbnRzIzUzLjEwLjIzLjAwLjAwCi11bnNwc2M3IzUzLjEwLjI0LjAwLjAwI0hvc2llcnkjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjQuMDEuMDAjU3RvY2tpbmdzIzUzLjEwLjI0LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI0LjAyLjAwI1NvY2tzIzUzLjEwLjI0LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI0LjAzLjAwI1BhbnR5IGhvc2UjNTMuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjQuMDQuMDAjVGlnaHRzIzUzLjEwLjI0LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjAwLjAwI0Nsb3RoaW5nIGFjY2Vzc29yaWVzIzUzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjAxLjAwI0JlbHRzIG9yIHN1c3BlbmRlcnMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDIuMDAjVGllcyBvciBzY2FydmVzIG9yIG11ZmZsZXJzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjAzLjAwI0hhdHMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDQuMDAjR2xvdmVzIG9yIG1pdHRlbnMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDUuMDAjVW1icmVsbGFzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjA2LjAwI1N3ZWF0IGJhbmRzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjA3LjAwI0Nsb3RoaW5nIGhhbmdlcnMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDguMDAjQXJtYmFuZHMjNTMuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjUuMDkuMDAjR2FydGVycyM1My4xMC4yNS4wMC4wMAotdW5zcHNjNyM1My4xMC4yNS4xMC4wMCNUYXNzbGVzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjExLjAwI0JhbmRhbm5hcyM1My4xMC4yNS4wMC4wMAotdW5zcHNjNyM1My4xMC4yNS4xMi4wMCNIYW5ka2VyY2hpZWZzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI1LjEzLjAwI0hlYWRiYW5kcyM1My4xMC4yNS4wMC4wMAotdW5zcHNjNyM1My4xMC4yNS4xNC4wMCNQb2NrZXQgcHJvdGVjdG9ycyM1My4xMC4yNS4wMC4wMAotdW5zcHNjNyM1My4xMC4yNS4xNS4wMCNCdXR0b24gY292ZXJzIzUzLjEwLjI1LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI2LjAwLjAwI05pZ2h0d2VhciM1My4xMC4wMC4wMC4wMAotdW5zcHNjNyM1My4xMC4yNi4wMS4wMCNCb3lzIHBhamFtYXMgb3IgbmlnaHRzaGlydHMjNTMuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjYuMDIuMDAjTWVucyBwYWphbWFzIG9yIG5pZ2h0c2hpcnRzIzUzLjEwLjI2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI2LjAzLjAwI0dpcmxzIHBhamFtYXMgb3IgbmlnaHRzaGlydHMjNTMuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjYuMDQuMDAjV29tZW5zIHBhamFtYXMgb3IgbmlnaHRzaGlydHMjNTMuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjYuMDUuMDAjSW5mYW50cyBwYWphbWFzIG9yIG5pZ2h0c2hpcnRzIzUzLjEwLjI2LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI2LjA2LjAwI0JhdGggcm9iZXMjNTMuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjcuMDAuMDAjVW5pZm9ybXMjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjcuMDEuMDAjTWlsaXRhcnkgdW5pZm9ybXMjNTMuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjcuMDIuMDAjQ3VzdG9tcyB1bmlmb3JtcyM1My4xMC4yNy4wMC4wMAotdW5zcHNjNyM1My4xMC4yNy4wMy4wMCNQb2xpY2UgdW5pZm9ybXMjNTMuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjguMDAuMDAjU3dpbXdlYXIjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjguMDEuMDAjTWVucyBzd2ltd2VhciM1My4xMC4yOC4wMC4wMAotdW5zcHNjNyM1My4xMC4yOC4wMi4wMCNXb21lbnMgc3dpbXdlYXIjNTMuMTAuMjguMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjguMDMuMDAjQm95cyBzd2ltd2VhciM1My4xMC4yOC4wMC4wMAotdW5zcHNjNyM1My4xMC4yOC4wNC4wMCNHaXJscyBzd2ltd2VhciM1My4xMC4yOC4wMC4wMAotdW5zcHNjNyM1My4xMC4yOC4wNS4wMCNJbmZhbnRzIHN3aW13ZWFyIzUzLjEwLjI4LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI5LjAwLjAwI0F0aGxldGljIHdlYXIjNTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjkuMDEuMDAjV29tZW5zIGF0aGxldGljIHdlYXIjNTMuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNTMuMTAuMjkuMDIuMDAjTWVucyBhdGhsZXRpYyB3ZWFyIzUzLjEwLjI5LjAwLjAwCi11bnNwc2M3IzUzLjEwLjI5LjAzLjAwI0JveXMgYXRobGV0aWMgd2VhciM1My4xMC4yOS4wMC4wMAotdW5zcHNjNyM1My4xMC4yOS4wNC4wMCNHaXJscyBhdGhsZXRpYyB3ZWFyIzUzLjEwLjI5LjAwLjAwCi11bnNwc2M3IzUzLjExLjAwLjAwLjAwI0Zvb3R3ZWFyIzUzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjExLjE1LjAwLjAwI0Jvb3RzIzUzLjExLjAwLjAwLjAwCi11bnNwc2M3IzUzLjExLjE1LjAxLjAwI01lbnMgYm9vdHMjNTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTUuMDIuMDAjV29tZW5zIGJvb3RzIzUzLjExLjE1LjAwLjAwCi11bnNwc2M3IzUzLjExLjE1LjAzLjAwI0JveXMgYm9vdHMjNTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTUuMDQuMDAjR2lybHMgYm9vdHMjNTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTUuMDUuMDAjSW5mYW50cyBib290cyM1My4xMS4xNS4wMC4wMAotdW5zcHNjNyM1My4xMS4xNi4wMC4wMCNTaG9lcyM1My4xMS4wMC4wMC4wMAotdW5zcHNjNyM1My4xMS4xNi4wMS4wMCNNZW5zIHNob2VzIzUzLjExLjE2LjAwLjAwCi11bnNwc2M3IzUzLjExLjE2LjAyLjAwI1dvbWVucyBzaG9lcyM1My4xMS4xNi4wMC4wMAotdW5zcHNjNyM1My4xMS4xNi4wMy4wMCNCb3lzIHNob2VzIzUzLjExLjE2LjAwLjAwCi11bnNwc2M3IzUzLjExLjE2LjA0LjAwI0dpcmxzIHNob2VzIzUzLjExLjE2LjAwLjAwCi11bnNwc2M3IzUzLjExLjE2LjA1LjAwI0luZmFudHMgc2hvZXMjNTMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTcuMDAuMDAjU2xpcHBlcnMjNTMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTcuMDEuMDAjTWVucyBzbGlwcGVycyM1My4xMS4xNy4wMC4wMAotdW5zcHNjNyM1My4xMS4xNy4wMi4wMCNXb21lbnMgc2xpcHBlcnMjNTMuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTcuMDMuMDAjQm95cyBzbGlwcGVycyM1My4xMS4xNy4wMC4wMAotdW5zcHNjNyM1My4xMS4xNy4wNC4wMCNHaXJscyBzbGlwcGVycyM1My4xMS4xNy4wMC4wMAotdW5zcHNjNyM1My4xMS4xNy4wNS4wMCNJbmZhbnRzIHNsaXBwZXJzIzUzLjExLjE3LjAwLjAwCi11bnNwc2M3IzUzLjExLjE4LjAwLjAwI1NhbmRhbHMjNTMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMTguMDEuMDAjTWVucyBzYW5kYWxzIzUzLjExLjE4LjAwLjAwCi11bnNwc2M3IzUzLjExLjE4LjAyLjAwI1dvbWVucyBzYW5kYWxzIzUzLjExLjE4LjAwLjAwCi11bnNwc2M3IzUzLjExLjE4LjAzLjAwI0JveXMgc2FuZGFscyM1My4xMS4xOC4wMC4wMAotdW5zcHNjNyM1My4xMS4xOC4wNC4wMCNHaXJscyBzYW5kYWxzIzUzLjExLjE4LjAwLjAwCi11bnNwc2M3IzUzLjExLjE4LjA1LjAwI0luZmFudHMgc2FuZGFscyM1My4xMS4xOC4wMC4wMAotdW5zcHNjNyM1My4xMS4xOS4wMC4wMCNBdGhsZXRpYyBmb290d2VhciM1My4xMS4wMC4wMC4wMAotdW5zcHNjNyM1My4xMS4xOS4wMS4wMCNNZW5zIGF0aGxldGljIGZvb3R3ZWFyIzUzLjExLjE5LjAwLjAwCi11bnNwc2M3IzUzLjExLjE5LjAyLjAwI1dvbWVucyBhdGhsZXRpYyBmb290d2VhciM1My4xMS4xOS4wMC4wMAotdW5zcHNjNyM1My4xMS4xOS4wMy4wMCNCb3lzIGF0aGxldGljIGZvb3R3ZWFyIzUzLjExLjE5LjAwLjAwCi11bnNwc2M3IzUzLjExLjE5LjA0LjAwI0dpcmxzIGF0aGxldGljIGZvb3R3ZWFyIzUzLjExLjE5LjAwLjAwCi11bnNwc2M3IzUzLjExLjE5LjA1LjAwI0luZmFudHMgYXRobGV0aWMgZm9vdHdlYXIjNTMuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMjAuMDAuMDAjU2hvZSBhY2Nlc3NvcmllcyM1My4xMS4wMC4wMC4wMAotdW5zcHNjNyM1My4xMS4yMC4wMS4wMCNTaG9laG9ybnMjNTMuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNTMuMTEuMjAuMDIuMDAjU2hvZWxhY2VzIzUzLjExLjIwLjAwLjAwCi11bnNwc2M3IzUzLjEyLjAwLjAwLjAwI0x1Z2dhZ2UgYW5kIGhhbmRiYWdzIGFuZCBwYWNrcyBhbmQgY2FzZXMjNTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTUuMDAuMDAjTHVnZ2FnZSM1My4xMi4wMC4wMC4wMAotdW5zcHNjNyM1My4xMi4xNS4wMS4wMCNHYXJtZW50IGJhZ3MjNTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTUuMDIuMDAjTHVnZ2FnZSBzZXRzIzUzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE1LjAzLjAwI0luZGl2aWR1YWwgbHVnZ2FnZSBwaWVjZXMjNTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTYuMDAuMDAjUHVyc2VzIGFuZCBoYW5kYmFncyBhbmQgYmFncyM1My4xMi4wMC4wMC4wMAotdW5zcHNjNyM1My4xMi4xNi4wMS4wMCNIYW5kYmFncyBvciBwdXJzZXMjNTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTYuMDIuMDAjRHVmZmxlIGJhZ3MjNTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTYuMDMuMDAjQmFja3BhY2tzIzUzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE2LjA0LjAwI0V5ZWdsYXNzIGNhc2VzIzUzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE2LjA1LjAwI0NvaW4gcHVyc2VzIzUzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE2LjA2LjAwI0xpcHN0aWNrIGNhc2VzIzUzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE2LjA3LjAwI0NpZ2FyIGNhc2UjNTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTcuMDAuMDAjQnVzaW5lc3MgY2FzZXMjNTMuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTcuMDEuMDAjQnJpZWZjYXNlcyM1My4xMi4xNy4wMC4wMAotdW5zcHNjNyM1My4xMi4xNy4wMi4wMCNBdHRhY2hlcyM1My4xMi4xNy4wMC4wMAotdW5zcHNjNyM1My4xMi4xNy4wNC4wMCNQb3J0Zm9saW9zIzUzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE3LjA1LjAwI0VxdWlwbWVudCBjYXNlcyM1My4xMi4xNy4wMC4wMAotdW5zcHNjNyM1My4xMi4xNy4wNi4wMCNDb21wdXRlciBiYWdzIzUzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE4LjAwLjAwI1RyYXZlbCBraXRzIGFuZCBhY2Nlc3NvcmllcyM1My4xMi4wMC4wMC4wMAotdW5zcHNjNyM1My4xMi4xOC4wMS4wMCNUcmF2ZWwga2l0cyM1My4xMi4xOC4wMC4wMAotdW5zcHNjNyM1My4xMi4xOC4wMi4wMCNUcmF2ZWwgY2FydHMjNTMuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTMuMTIuMTguMDMuMDAjR2FybWVudCBicnVzaGVzIzUzLjEyLjE4LjAwLjAwCi11bnNwc2M3IzUzLjEyLjE4LjA0LjAwI01ha2V1cCBvciBtYW5pY3VyZSBjYXNlcyM1My4xMi4xOC4wMC4wMAotdW5zcHNjNyM1My4xMy4wMC4wMC4wMCNQZXJzb25hbCBjYXJlIHByb2R1Y3RzIzUzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzUzLjEzLjE1LjAwLjAwI0RlbnRhbCM1My4xMy4wMC4wMC4wMAotdW5zcHNjNyM1My4xMy4xNS4wMS4wMCNNb3V0aHdhc2gjNTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTUuMDIuMDAjVG9vdGhwYXN0ZSM1My4xMy4xNS4wMC4wMAotdW5zcHNjNyM1My4xMy4xNS4wMy4wMCNUb290aGJydXNoZXMjNTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTUuMDQuMDAjRGVudGFsIGZsb3NzIzUzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE1LjA1LjAwI0luZmFudCBzb290aGVyIG9yIHBhY2lmaWVyIG9yIGR1bW15IzUzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE1LjA2LjAwI0RlbnRhbCBraXRzIzUzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE1LjA3LjAwI1Rvb3RocGlja3MjNTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTUuMDguMDAjRGVudHVyZSBjbGVhbmluZyB0YWJsZXRzIzUzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjAwLjAwI0JhdGggYW5kIGJvZHkjNTMuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMDEuMDAjU2hvd2VyIGNhcHMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMDIuMDAjSGFpciBjYXJlIHN1cHBsaWVzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjAzLjAwI1Jhem9ycyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4wNC4wMCNIYWlyIGNvbWJzIG9yIGJydXNoZXMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMDUuMDAjVmFuaXR5IGtpdHMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMDYuMDAjRGVvZG9yYW50cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4wNy4wMCNIYW5kIG9yIGJvZHkgbG90aW9ucyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4wOC4wMCNTb2FwcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4wOS4wMCNTdW4gcHJvdGVjdGlvbiBwcm9kdWN0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xMC4wMCNFeWUgY2FyZSBzdXBwbGllcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xMS4wMCNTaGF2aW5nIGNyZWFtcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xMi4wMCNCYXRoIGdlbHMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMTMuMDAjU2tpbiBjYXJlIHByb2R1Y3RzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjE0LjAwI0Zvb3QgY2FyZSBwcm9kdWN0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xNS4wMCNGZW1pbmluZSBoeWdpZW5lIHByb2R1Y3RzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjE2LjAwI1BhcmEgcGhhcm1hY2V1dGljYWwgY3JlYW1zIG9yIGxvdGlvbnMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMTcuMDAjTWFuaWN1cmUgaW1wbGVtZW50cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4xOC4wMCNQZWRpY3VyZSBpbXBsZW1lbnRzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjE5LjAwI0Nvc21ldGljcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yMC4wMCNQZXJmdW1lcyBvciBjb2xvZ25lcyBvciBmcmFncmFuY2VzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjIxLjAwI05haWwgY2xpcHBlcnMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMjIuMDAjQ29uZG9tcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yMy4wMCNIYWlyIHJlbW92YWwgb3IgZGVwaWxhdG9yeSBwcm9kdWN0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yNC4wMCNEaXNwb3NhYmxlIHBlcnNvbmFsIHdpcGVzIzUzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzUzLjEzLjE2LjI1LjAwI0hhaXIgb3IgYmVhcmQgbmV0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yNi4wMCNIYW5kIHNhbml0aXplciM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4yNy4wMCNIYW5kIGNsZWFuZXIjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMjguMDAjU2hhbXBvb3MjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMjkuMDAjTWFrZXVwIGtpdHMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMzAuMDAjTGlwIGJhbG0jNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMzEuMDAjVGF0dG9vcyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4zMi4wMCNIb3Qgcm9sbGVycyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4zMy4wMCNCYXJyZXR0ZXMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTYuMzQuMDAjQ2hlbWljYWwgcHJvdGVjdGlvbiBwcm9kdWN0cyM1My4xMy4xNi4wMC4wMAotdW5zcHNjNyM1My4xMy4xNi4zNS4wMCNTaGF2aW5nIGJydXNoZXMjNTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTMuMTcuMDAuMDAjRXlld2VhciM1My4xMy4wMC4wMC4wMAotdW5zcHNjNyM1My4xMy4xNy4wMS4wMCNPcHRpY2FsIGdsYXNzZXMgb3Igc3BlY3RhY2xlcyM1My4xMy4xNy4wMC4wMAotdW5zcHNjNyM1My4xMy4xNy4wMi4wMCNDb250YWN0IGxlbnNlcyM1My4xMy4xNy4wMC4wMAotdW5zcHNjNyM1My4xMy4xNy4wMy4wMCNTdW5nbGFzc2VzIzUzLjEzLjE3LjAwLjAwCi11bnNwc2M3IzUzLjE0LjAwLjAwLjAwI1Nld2luZyBzdXBwbGllcyBhbmQgYWNjZXNzb3JpZXMjNTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTUuMDAuMDAjU2V3aW5nIGZhc3RlbmVycyM1My4xNC4wMC4wMC4wMAotdW5zcHNjNyM1My4xNC4xNS4wMS4wMCNTdHJhaWdodCBwaW5zIzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE1LjAyLjAwI1NhZmV0eSBwaW5zIzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE1LjAzLjAwI1ppcHBlcnMjNTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTUuMDQuMDAjQnVja2xlcyM1My4xNC4xNS4wMC4wMAotdW5zcHNjNyM1My4xNC4xNS4wNS4wMCNCdXR0b25zIzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE1LjA2LjAwI1NuYXBzIzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE1LjA3LjAwI0NsYXNwcyM1My4xNC4xNS4wMC4wMAotdW5zcHNjNyM1My4xNC4xNS4wOC4wMCNHYXJtZW50IHJpdmV0IzUzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjAwLjAwI01pc2NlbGxhbmVvdXMgc2V3aW5nIHN1cHBsaWVzIzUzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjAxLjAwI1BpbiBjdXNoaW9ucyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wMi4wMCNTZXdpbmcga2l0cyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wMy4wMCNUaGltYmxlcyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wNC4wMCNTZXdpbmcgcGF0dGVybnMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMDUuMDAjU2V3aW5nIG5lZWRsZXMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMDYuMDAjQm9iYmlucyBvciBib2JiaW4gaG9sZGVycyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wNy4wMCNTZWFtIGdhdWdlIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjA4LjAwI0JvZGtpbiM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4wOS4wMCNMb29wIHR1cm5lciM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4xMC4wMCNGYWJyaWMgb3IgdGFpbG9ycyBjaGFsayBob2xkZXJzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjExLjAwI0ZhYnJpYyBtYXJrZXJzIG9yIGZhYnJpYyBwZW5jaWxzIG9yIGZhYnJpYyBjaGFsayM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4xMi4wMCNTZXJyYXRlZCBwYXR0ZXJuIHRyYWNpbmcgd2hlZWwjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMTMuMDAjVHJhbnNmZXIgcGFwZXIjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMTQuMDAjVGFwZXN0cnkgbmVlZGxlcyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4xNS4wMCNXZWF2aW5nIG5lZWRsZXMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMTYuMDAjTG9vcGVyIGxvb21zIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjE3LjAwI0NvdHRvbiBqZXJzZXkgbG9vcHMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMTguMDAjTmVlZGxlcG9pbnQgY2FudmFzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjE5LjAwI01hZ25ldCB3YW5kcyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4yMC4wMCNTZWFtIHJpcHBlciM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4yMS4wMCNOZWVkbGUgdGhyZWFkZXIjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMjIuMDAjRHJlc3NtYWtlcnMgcnVsZXIjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMjMuMDAjTGlxdWlkIHRocmVhZCBsb2NrIG9yIHJlaW5mb3JjZXIjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMjQuMDAjQ3Jvc3Mgc3RpdGNoIGZhYnJpYyBvciBuZWVkbGVzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjI1LjAwI0Nyb3NzIHN0aXRjaCBkZXNpZ25zIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjI2LjAwI0VtYnJvaWRlcnkgaG9vcHMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMjcuMDAjQ3JvY2hldCBob29rcyM1My4xNC4xNi4wMC4wMAotdW5zcHNjNyM1My4xNC4xNi4yOC4wMCNRdWlsdGVycyBiYXN0aW5nIHRvb2xzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzUzLjE0LjE2LjI5LjAwI1F1aWx0ZXJzIHBpbnMjNTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNTMuMTQuMTYuMzAuMDAjUGF0dGVybiBjdXR0aW5nIG1hdHMgb3IgYm9hcmRzIzUzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzU0LjAwLjAwLjAwLjAwI1RpbWVwaWVjZXMgYW5kIEpld2VscnkgYW5kIEdlbXN0b25lIFByb2R1Y3RzIzU0LjAwLjAwLjAwLjAwCi11bnNwc2M3IzU0LjEwLjAwLjAwLjAwI0pld2VscnkjNTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTUuMDAuMDAjRmluZSBqZXdlbHJ5IzU0LjEwLjAwLjAwLjAwCi11bnNwc2M3IzU0LjEwLjE1LjAxLjAwI0dvbGQgb3Igc2lsdmVyIG9yIHBsYXRpbnVtIGNoYWlucyM1NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNS4wMi4wMCNGaW5lIGpld2VscnkgbmVja2xhY2VzIzU0LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU0LjEwLjE1LjAzLjAwI0ZpbmUgamV3ZWxyeSByaW5ncyM1NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNS4wNC4wMCNGaW5lIGpld2VscnkgZWFycmluZ3MjNTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTUuMDUuMDAjRmluZSBib2R5IGpld2VscnkjNTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTUuMDYuMDAjRmluZSBqZXdlbHJ5IGJyYWNlbGV0cyM1NC4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNS4wNy4wMCNUaWFyYXMjNTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTYuMDAuMDAjSW1pdGF0aW9uIGpld2VscnkjNTQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTQuMTAuMTYuMDEuMDAjQnJhY2VsZXRzIzU0LjEwLjE2LjAwLjAwCi11bnNwc2M3IzU0LjEwLjE2LjAyLjAwI05lY2tsYWNlcyM1NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNi4wMy4wMCNSaW5ncyM1NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNi4wNC4wMCNFYXJyaW5ncyM1NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM1NC4xMC4xNi4wNS4wMCNCb2R5IGpld2VscnkjNTQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMDAuMDAuMDAjVGltZXBpZWNlcyM1NC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1NC4xMS4xNS4wMC4wMCNXYXRjaGVzIzU0LjExLjAwLjAwLjAwCi11bnNwc2M3IzU0LjExLjE1LjAxLjAwI1dyaXN0IHdhdGNoZXMjNTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTUuMDIuMDAjUG9ja2V0IHdhdGNoZXMjNTQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTYuMDAuMDAjQ2xvY2tzIzU0LjExLjAwLjAwLjAwCi11bnNwc2M3IzU0LjExLjE2LjAxLjAwI1dhbGwgY2xvY2tzIzU0LjExLjE2LjAwLjAwCi11bnNwc2M3IzU0LjExLjE2LjAyLjAwI01hbnRlbCBvciB0YWJsZSBjbG9ja3MjNTQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTYuMDMuMDAjRnJlZSBzdGFuZGluZyBjbG9ja3MjNTQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTYuMDQuMDAjSG91cmdsYXNzZXMjNTQuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDAuMDAjV2F0Y2ggb3IgY2xvY2sgcGFydHMjNTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDEuMDAjV2F0Y2ggb3IgY2xvY2sgZGlhbHMjNTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDIuMDAjV2F0Y2ggb3IgY2xvY2sgY3J5c3RhbHMjNTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDMuMDAjV2F0Y2ggb3IgY2xvY2sgcGxhdGVzIG9yIGJyaWRnZXMjNTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTQuMTEuMTcuMDQuMDAjV2F0Y2ggc3RyYXBzIG9yIGJhbmRzIG9yIGJyYWNlbGV0cyBvciBmb2JzIzU0LjExLjE3LjAwLjAwCi11bnNwc2M3IzU0LjEyLjAwLjAwLjAwI0dlbXN0b25lcyM1NC4wMC4wMC4wMC4wMAotdW5zcHNjNyM1NC4xMi4xNS4wMC4wMCNQcmVjaW91cyBzdG9uZXMjNTQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTUuMDEuMDAjRGlhbW9uZCBnZW1zdG9uZXMjNTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTUuMDIuMDAjRW1lcmFsZCBnZW1zdG9uZXMjNTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTUuMDMuMDAjUnVieSBnZW1zdG9uZXMjNTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTUuMDQuMDAjU2FwcGhpcmUgZ2Vtc3RvbmVzIzU0LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU0LjEyLjE2LjAwLjAwI1NlbWkgcHJlY2lvdXMgc3RvbmVzIzU0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU0LjEyLjE2LjAxLjAwI0dhcm5ldCBnZW1zdG9uZXMjNTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTYuMDIuMDAjSmFkZSBnZW1zdG9uZXMjNTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTYuMDMuMDAjT3BhbCBnZW1zdG9uZXMjNTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTQuMTIuMTcuMDAuMDAjUGVhcmxzIzU0LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU0LjEyLjE3LjAxLjAwI0N1bHR1cmVkIHBlYXJscyM1NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NC4xMi4xNy4wMi4wMCNOYXR1cmFsIHBlYXJscyM1NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NC4xMi4xOC4wMC4wMCNJbmR1c3RyaWFsIHByZWNpb3VzIGFuZCBzZW1pIHByZWNpb3VzIHN0b25lcyM1NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM1NC4xMi4xOC4wMS4wMCNJbmR1c3RyaWFsIGRpYW1vbmRzIzU0LjEyLjE4LjAwLjAwCi11bnNwc2M3IzU0LjEyLjE4LjAyLjAwI0luZHVzdHJpYWwgZ2FybmV0cyM1NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM1NS4wMC4wMC4wMC4wMCNQdWJsaXNoZWQgUHJvZHVjdHMjNTUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMDAuMDAuMDAjUHJpbnRlZCBtZWRpYSM1NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4wMC4wMCNQcmludGVkIHB1YmxpY2F0aW9ucyM1NS4xMC4wMC4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4wMS4wMCNDaGFydHMgb3IgbWFwcyBvciBhdGxhc2VzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjAyLjAwI0RpcmVjdG9yaWVzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjAzLjAwI0NhdGFsb2dzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjA0LjAwI05ld3NwYXBlcnMjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMDUuMDAjQ29taWMgYm9va3MjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMDYuMDAjTWFnYXppbmVzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjA3LjAwI1BpY3R1cmUgb3IgZHJhd2luZyBvciBjb2xvcmluZyBib29rcyBmb3IgY2hpbGRyZW4jNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMDguMDAjRW5jeWNsb3BlZGlhcyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4wOS4wMCNFZHVjYXRpb25hbCBvciB2b2NhdGlvbmFsIHRleHRib29rcyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4xMC4wMCNMZWlzdXJlIHJlYWRpbmcgYm9va3MjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMTEuMDAjUmVmZXJlbmNlIGJvb2tzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjEyLjAwI0RpY3Rpb25hcmllcyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4xMy4wMCNUcmFkaW5nIGNhcmRzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjE0LjAwI1NoZWV0IG11c2ljIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjE1LjAwI1Byb21vdGlvbmFsIG1hdGVyaWFsIG9yIGFubnVhbCByZXBvcnRzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjE2LjAwI09wZXJhdGlvbiBhbmQgaW5zdHJ1Y3Rpb24gbWFudWFscyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4xNy4wMCNDbGVhcmFuY2UgYW5kIGRpbWVuc2lvbmFsIGRyYXdpbmdzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjE4LjAwI1RlY2huaWNhbCBkaWFncmFtcyBvciBkcmF3aW5ncyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4xOS4wMCNQZXJpb2RpY2FscyM1NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMC4xNS4yMC4wMCNJbnN0cnVjdGlvbiBzaGVldHMgb3IgYm9va2xldHMjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMjEuMDAjT3duZXIgb3IgdXNlciBtYW51YWxzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjIyLjAwI1RlcnJlc3RyaWFsIG9yIGNlbGVzdGlhbCBnbG9iZXMjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMjMuMDAjRXhlcmNpc2UgYm9va3MjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMjQuMDAjUmVmZXJlbmNlIGJvb2tzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEwLjE1LjI1LjAwI0VuY3ljbG9wZWRpYXMjNTUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTAuMTUuMjYuMDAjRGljdGlvbmFyaWVzIzU1LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjAwLjAwLjAwI0VsZWN0cm9uaWMgcmVmZXJlbmNlIG1hdGVyaWFsIzU1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjAwLjAwI0VsZWN0cm9uaWMgcHVibGljYXRpb25zIGFuZCBtdXNpYyM1NS4xMS4wMC4wMC4wMAotdW5zcHNjNyM1NS4xMS4xNS4wMS4wMCNFbGVjdHJvbmljIGRpcmVjdG9yaWVzIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjAyLjAwI0VsZWN0cm9uaWMgZGljdGlvbmFyaWVzIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjAzLjAwI0VsZWN0cm9uaWMgZW5jeWNsb3BlZGlhcyM1NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMS4xNS4wNC4wMCNFbGVjdHJvbmljIGNhdGFsb2dzIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjA1LjAwI0Jvb2tzIG9uIHRhcGUgb3IgY29tcGFjdCBkaXNjIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjA2LjAwI0VsZWN0cm9uaWMgbWFnYXppbmVzIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjA3LjAwI0VsZWN0cm9uaWMgbmV3c3BhcGVycyM1NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMS4xNS4wOC4wMCNFbGVjdHJvbmljIGNoYXJ0cyBvciBtYXBzIG9yIGF0bGFzZXMjNTUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTEuMTUuMDkuMDAjQmFja2dyb3VuZCBtdXNpYyM1NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMS4xNS4xMC4wMCNNb3Rpb24gcGljdHVyZXMgb24gY2VsbHVsb2lkIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjExLjAwI01vdGlvbiBwaWN0dXJlcyBvbiB2aWRlbyB0YXBlIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE1LjEyLjAwI011c2ljIG9uIHRhcGUgb3IgY29tcGFjdCBkaXNjIzU1LjExLjE1LjAwLjAwCi11bnNwc2M3IzU1LjExLjE2LjAwLjAwI0VsZWN0cm9uaWMgU29mdHdhcmUgcmVmZXJlbmNlIG1hdGVyaWFsIzU1LjExLjAwLjAwLjAwCi11bnNwc2M3IzU1LjExLjE2LjAxLjAwI0VsZWN0cm9uaWMgU29mdHdhcmUgRG9jdW1lbnRhdGlvbiBhbmQgVXNlciBNYW51YWxzIzU1LjExLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjAwLjAwLjAwI1NpZ25hZ2UgYW5kIGFjY2Vzc29yaWVzIzU1LjAwLjAwLjAwLjAwCi11bnNwc2M3IzU1LjEyLjE1LjAwLjAwI1RhZ3MjNTUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTUuMDEuMDAjTHVnZ2FnZSB0YWdzIzU1LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE1LjAyLjAwI1NlY3VyaXR5IHRhZ3MjNTUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTUuMDMuMDAjSWRlbnRpZmljYXRpb24gdGFncyM1NS4xMi4xNS4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wMC4wMCNMYWJlbHMjNTUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMDEuMDAjTGFiZWwgcmVtb3Zpbmcga2l0cyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wMi4wMCNDbG90aGluZyBsYWJlbHMjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMDMuMDAjUHJlc3N1cmUgc2Vuc2l0aXZlIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wNC4wMCNDYW5uaW5nIG9yIGJvdHRsaW5nIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wNS4wMCNBZGRyZXNzaW5nIG9yIG1haWxpbmcgbGFiZWxzIzU1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE2LjA2LjAwI1NlbGYgYWRoZXNpdmUgbGFiZWxzIzU1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE2LjA3LjAwI0RlY2FscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4wOC4wMCNCYXIgY29kZSBsYWJlbHMjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMDkuMDAjUGFja2FnaW5nIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4xMC4wMCNDb25zZWN1dGl2ZWx5IG51bWJlcmVkIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4xMS4wMCNMYWJlbCBtYWtpbmcgdGFwZXMjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMTIuMDAjUHJpbnRlciBsYWJlbHMjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTYuMTMuMDAjQ29sb3IgY29kaW5nIGxhYmVscyM1NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNi4xNC4wMCNSZW1vdmFibGUgbGFiZWxzIzU1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE2LjE1LjAwI0FkaGVzaXZlIGRvdHMgb3IgYXJyb3dzIzU1LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE2LjE2LjAwI1NlbGYgYWRoZXNpdmUgZmxhZ3MjNTUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMDAuMDAjU2lnbmFnZSM1NS4xMi4wMC4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4wMS4wMCNNZXRhbGxpYyBuYW1lcGxhdGVzIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjAyLjAwI05vbiBtZXRhbGxpYyBuYW1lcGxhdGVzIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjAzLjAwI0lsbHVtaW5hdGVkIHNpZ25zIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjA0LjAwI1NhZmV0eSBzaWducyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4wNS4wMCNTZWxmIGFkaGVzaXZlIHNpZ25zIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjA2LjAwI0Jhbm5lcnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMDcuMDAjTWFnbmV0aWMgc2lnbnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMDguMDAjTmVvbiBzaWducyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4wOS4wMCNNb3ZpbmcgbWVzc2FnZSBzaWducyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4xMC4wMCNUcmFmZmljIHNpZ25zIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjExLjAwI0JpbGxib2FyZHMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTIuMDAjRGlyZWN0aW9uYWwgc2lnbnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTMuMDAjUG9pbnQgb2YgcHVyY2hhc2Ugc2lnbnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTQuMDAjUGVubmFudHMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTUuMDAjRmxhZ3MjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTYuMDAjV29vZGVuIHNpZ25zIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjE3LjAwI01hcmtlciBwbGF0ZXMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMTguMDAjSW5mb3JtYXRpb25hbCBzaWducyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4xOS4wMCNTaWduYWxsaW5nIGNvbXBvbmVudHMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMjAuMDAjRW1ibGVtcyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xNy4yMS4wMCNWaW55bCBsZXR0ZXJzIG9yIG51bWJlcnMjNTUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTcuMjIuMDAjRmxhZ3BvbGVzIzU1LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU1LjEyLjE3LjIzLjAwI1NpZ24gaG9sZGVycyM1NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM1NS4xMi4xOC4wMC4wMCNJZGVudGlmaWNhdGlvbiBkb2N1bWVudHMjNTUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTguMDEuMDAjQ2FyIHRheCBkaXNjcyM1NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM1NS4xMi4xOC4wMi4wMCNJZGVudGlmaWNhdGlvbiBjYXJkcyM1NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM1NS4xMi4xOC4wMy4wMCNQYXNzcG9ydHMjNTUuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTUuMTIuMTguMDQuMDAjQmFkZ2VzIG9yIGJhZGdlIGhvbGRlcnMjNTUuMTIuMTguMDAuMDAKLXVuc3BzYzcjNTYuMDAuMDAuMDAuMDAjRnVybml0dXJlIGFuZCBGdXJuaXNoaW5ncyM1Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4wMC4wMC4wMCNBY2NvbW1vZGF0aW9uIGZ1cm5pdHVyZSM1Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4wMC4wMCNGdXJuaXR1cmUjNTYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMDEuMDAjU3RhbmRzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjAyLjAwI1NvZmFzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjAzLjAwI0NvYXQgcmFja3MjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMDQuMDAjQ2hhaXJzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjA1LjAwI0VudGVydGFpbm1lbnQgY2VudGVycyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4wNi4wMCNGdXRvbnMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMDcuMDAjQm9va2Nhc2VzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjA4LjAwI01hdHRyZXNzZXMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMDkuMDAjRHJlc3NlcnMgb3IgYXJtb2lyZXMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMTAuMDAjUGFydGl0aW9ucyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4xMi4wMCNTdG9vbHMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMTMuMDAjQ290cyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4xNC4wMCNGb290IHN0b29scyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4xNS4wMCNCZWRzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjE2LjAwI0NoZXN0cyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4xOC4wMCNXYWxsIHJhY2tzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjE5LjAwI1RhYmxlcyM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4yMC4wMCNMb2NrZXJzIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjIxLjAwI0JlZCBoZWFkYm9hcmQgb3IgZm9vdGJvYXJkIzU2LjEwLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE1LjIyLjAwI0FybSBjaGFpciM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4yMy4wMCNVbWJyZWxsYSBzdGFuZHMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjQuMDAjSXJvbmluZyBib2FyZHMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjUuMDAjSXJvbmluZyBib2FyZCBjb3ZlcnMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjYuMDAjRnJpZGdlIGJhciM1Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNS4yNy4wMCNIb3VzZWhvbGQgdHlwZSBsaW5lbiBkcmllcnMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjguMDAjQXJ0aWZpY2lhbCBwbGFudHMjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTUuMjkuMDAjTWFnYXppbmUgcmFja3MjNTYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDAuMDAjT3V0ZG9vciBmdXJuaXR1cmUjNTYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDEuMDAjT3V0ZG9vciB1bWJyZWxsYXMjNTYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDIuMDAjT3V0ZG9vciBjaGFpcnMjNTYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDMuMDAjT3V0ZG9vciB0YWJsZXMgb3IgcGljbmljIHRhYmxlcyM1Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNi4wNC4wMCNPdXRkb29yIHN3aW5ncyM1Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNi4wNS4wMCNPdXRkb29yIGJlbmNoZXMjNTYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTYuMDYuMDAjRmxvd2VyIHN0YW5kcyM1Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNi4wNy4wMCNPdXRzaWRlIGNsb3RoZXMgZHJ5ZXIjNTYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDAuMDAjT2ZmaWNlIGZ1cm5pdHVyZSM1Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNy4wMS4wMCNDcmVkZW56YXMjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDIuMDAjRmlsaW5nIGNhYmluZXRzIG9yIGFjY2Vzb3JpZXMjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDMuMDAjRGVza3MjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDQuMDAjVGFibGUgYmFzZSM1Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNy4wNS4wMCNTaG93Y2FzZXMjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDYuMDAjQ29uZmVyZW5jaW5nIHRhYmxlcyM1Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNy4wNy4wMCNEcmFmdGluZyB0YWJsZXMjNTYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTcuMDguMDAjTW9iaWxlIGZpbGVzIG9yIGVxdWlwbWVudCBjYXJ0cyM1Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xNy4wOS4wMCNUYWJsZSB0b3BzIzU2LjEwLjE3LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE4LjAwLjAwI0JhYnkgYW5kIHRvZGRsZXIgZnVybml0dXJlIGFuZCBhY2Nlc3NvcmllcyM1Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xOC4wMy4wMCNDYXJyaWFnZXMgb3IgcGVyYW1idWxhdG9ycyBvciBzdHJvbGxlcnMjNTYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTguMDQuMDAjQ3JpYnMgb3IgcGxheXBlbnMjNTYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTguMDUuMDAjQ2FyIHNlYXRzIzU2LjEwLjE4LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE4LjA2LjAwI0hpZ2ggY2hhaXJzIG9yIGFjY2Vzc29yaWVzIzU2LjEwLjE4LjAwLjAwCi11bnNwc2M3IzU2LjEwLjE4LjA3LjAwI0JvdW5jZXIgc2VhdHMgb3IganVtcGVycyM1Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xOC4wOC4wMCNTd2luZ3Mgb3IganVtcGVycyBvciBhY2Nlc3NvcmllcyM1Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xOC4wOS4wMCNQb3R0eSBzZWF0cyM1Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMC4xOC4xMC4wMCNCYWJ5IGJhdGhzIG9yIHR1YnMjNTYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTguMTEuMDAjQmFzc2luZXRzIG9yIGNyYWRsZXMjNTYuMTAuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTAuMTguMTIuMDAjQ2hhbmdpbmcgdGFibGVzIG9yIGFjY2Vzc29yaWVzIzU2LjEwLjE4LjAwLjAwCi11bnNwc2M3IzU2LjExLjAwLjAwLjAwI0NvbW1lcmNpYWwgYW5kIGluZHVzdHJpYWwgZnVybml0dXJlIzU2LjAwLjAwLjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjAwLjAwI1dvcmtzdGF0aW9ucyBhbmQgb2ZmaWNlIHBhY2thZ2VzIzU2LjExLjAwLjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjAxLjAwI01vZHVsYXIgcmVjZXB0aW9uIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wMi4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBleGVjdXRpdmUgb2ZmaWNlIHBhY2thZ2VzIzU2LjExLjE1LjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjAzLjAwI01vZHVsYXIgZXhlY3V0aXZlIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wNC4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBtYW5hZ2VyaWFsIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wNS4wMCNNb2R1bGFyIG1hbmFnZXJpYWwgb2ZmaWNlIHBhY2thZ2VzIzU2LjExLjE1LjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjA2LjAwI0Nhc2Vnb29kIG9yIG5vbiBtb2R1bGFyIHN0YWZmIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wNy4wMCNNb2R1bGFyIHN0YWZmIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4wOC4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciB0ZWNobmljYWwgb2ZmaWNlIHBhY2thZ2VzIzU2LjExLjE1LjAwLjAwCi11bnNwc2M3IzU2LjExLjE1LjA5LjAwI01vZHVsYXIgdGVjaG5pY2FsIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4xMC4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBjbGVyaWNhbCBvZmZpY2UgcGFja2FnZXMjNTYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTUuMTEuMDAjTW9kdWxhciBjbGVyaWNhbCBvZmZpY2UgcGFja2FnZXMjNTYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTUuMTIuMDAjQ2FzZWdvb2Qgb3Igbm9uIG1vZHVsYXIgcmVjZXB0aW9uIG9mZmljZSBwYWNrYWdlcyM1Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNS4xMy4wMCNDb25mZXJlbmNlIG9yIG5vbiBtb2R1bGFyIHJvb20gcGFja2FnZXMjNTYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTYuMDAuMDAjUGFuZWwgc3lzdGVtcyM1Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNi4wMS4wMCNTY3JlZW5zIGZvciBwYW5lbCBzeXN0ZW1zIzU2LjExLjE2LjAwLjAwCi11bnNwc2M3IzU2LjExLjE2LjAyLjAwI1N0b3JhZ2UgZm9yIHBhbmVsIHN5c3RlbXMjNTYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTYuMDMuMDAjT3JnYW5pemF0aW9uIGZvciBwYW5lbCBzeXN0ZW1zIzU2LjExLjE2LjAwLjAwCi11bnNwc2M3IzU2LjExLjE2LjA0LjAwI1dvcmsgc3VyZmFjZXMgZm9yIHBhbmVsIHN5c3RlbXMjNTYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTYuMDUuMDAjTGlnaHRpbmcgb3IgcG93ZXIgb3IgZGF0YSBjb21wb25ldHMgZm9yIHBhbmVsIHN5c3RlbXMjNTYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTYuMDYuMDAjUGFydHMgb3IgYWNjZXNzb3JpZXMgcGFuZWwgc3lzdGVtcyM1Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wMC4wMCNDYXNlZ29vZCBhbmQgbm9uIG1vZHVsYXIgc3lzdGVtcyM1Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wMS4wMCNDYXNlZ29vZCAgb3Igbm9uIG1vZHVsYXIgZGVzayM1Ni4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wMi4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBjcmVkZW56YSM1Ni4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wMy4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBzdG9yYWdlIzU2LjExLjE3LjAwLjAwCi11bnNwc2M3IzU2LjExLjE3LjA0LjAwI0Nhc2Vnb29kIG9yIG5vbiBtb2R1bGFyIG9yZ2FuaXphdGlvbiM1Ni4xMS4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xNy4wNS4wMCNDYXNlZ29vZCBvciBub24gbW9kdWxhciBsaWdodGluZyBvciBwb3dlciBvciBkYXRhIGNvbXBvbmVudHMjNTYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTcuMDYuMDAjQ2FzZWdvb2Qgb3Igbm9uIG1vZHVsYXIgcGFydHMgb3IgYWNjZXNzb3JpZXMjNTYuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTguMDAuMDAjRnJlZXN0YW5kaW5nIGZ1cm5pdHVyZSM1Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xOC4wMS4wMCNGcmVlc3RhbmRpbmcgbGlnaHRpbmcgb3IgcG93ZXIgb3IgZGF0YSBjb21wb25lbnRzIzU2LjExLjE4LjAwLjAwCi11bnNwc2M3IzU2LjExLjE4LjAyLjAwI0ZyZWVzdGFuZGluZyB0YWJsZXMjNTYuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTguMDMuMDAjRnJlZXN0YW5kaW5nIHN0b3JhZ2UjNTYuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTguMDQuMDAjRnJlZXN0YW5kaW5nIG9yZ2FuaXphdGlvbiM1Ni4xMS4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xOC4wNS4wMCNGcmVlc3RhbmRpbmcgcGFydHMgb3IgYWNjZXNzb3JpZXMjNTYuMTEuMTguMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTkuMDAuMDAjSW5kdXN0cmlhbCBmdXJuaXR1cmUjNTYuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTkuMDEuMDAjSW5kdXN0cmlhbCBsaWdodGluZyBvciBwb3dlciBvciBkYXRhIGNvbXBvbmVudHMjNTYuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMTkuMDIuMDAjSW5kdXN0cmlhbCB3b3JrIHN1cmZhY2VzIzU2LjExLjE5LjAwLjAwCi11bnNwc2M3IzU2LjExLjE5LjAzLjAwI0luZHVzdHJpYWwgc3RvcmFnZSB1bml0cyM1Ni4xMS4xOS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xOS4wNC4wMCNJbmR1c3RyaWFsIG9yZ2FuaXphdGlvbiM1Ni4xMS4xOS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4xOS4wNS4wMCNJbmR1c3RyaWFsIHBhcnRzIG9yIGFjY2Vzc29yaWVzIzU2LjExLjE5LjAwLjAwCi11bnNwc2M3IzU2LjExLjIwLjAwLjAwI0NvbXB1dGVyIHN1cHBvcnQgZnVybml0dXJlIzU2LjExLjAwLjAwLjAwCi11bnNwc2M3IzU2LjExLjIwLjAxLjAwI0NvbXB1dGVyIHN1cHBvcnQgbGlnaHRpbmcgb3IgcG93ZXIgb3IgZGF0YSBjb21wb25lbnRzIzU2LjExLjIwLjAwLjAwCi11bnNwc2M3IzU2LjExLjIwLjAyLjAwI0NvbXB1dGVyIHN1cHBvcnQgd29yayBzdXJmYWNlcyM1Ni4xMS4yMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4yMC4wMy4wMCNDb21wdXRlciBzdXBwb3J0IHN0b3JhZ2UgYWNjZXNzb3JpZXMjNTYuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMjAuMDQuMDAjQ29tcHV0ZXIgc3VwcG9ydCBvcmdhbml6YXRpb24jNTYuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMjAuMDUuMDAjQ29tcHV0ZXIgc3VwcG9ydCBwYXJ0cyBvciBhY2Nlc3NvcmllcyM1Ni4xMS4yMC4wMC4wMAotdW5zcHNjNyM1Ni4xMS4yMS4wMC4wMCNTZWF0aW5nIzU2LjExLjAwLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjAxLjAwI0F1ZGl0b3JpdW0gb3Igc3RhZGl1bSBvciBzcGVjaWFsIHVzZSBzZWF0aW5nIzU2LjExLjIxLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjAyLjAwI1Rhc2sgc2VhdGluZyM1Ni4xMS4yMS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4yMS4wMy4wMCNHdWVzdCBzZWF0aW5nIzU2LjExLjIxLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjA0LjAwI0V4ZWN1dGl2ZSBzZWF0aW5nIzU2LjExLjIxLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjA1LjAwI0xvdW5nZSBzZWF0aW5nIzU2LjExLjIxLjAwLjAwCi11bnNwc2M3IzU2LjExLjIxLjA2LjAwI1N0b29sIHNlYXRpbmcjNTYuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMjEuMDcuMDAjU2VhdGluZyBwYXJ0cyBvciBhY2Nlc3NvcmllcyM1Ni4xMS4yMS4wMC4wMAotdW5zcHNjNyM1Ni4xMS4yMS4wOC4wMCNDb21iaW5hdGlvbiBjaGFpciB3aXRoIGRlc2sjNTYuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNTYuMTEuMjEuMDkuMDAjQmVuY2hlcyM1Ni4xMS4yMS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4wMC4wMC4wMCNDbGFzc3Jvb20gYW5kIGluc3RydWN0aW9uYWwgYW5kIGluc3RpdHV0aW9uYWwgZnVybml0dXJlIGFuZCBmaXh0dXJlcyM1Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4wMC4wMCNMaWJyYXJ5IGZ1cm5pc2hpbmdzIzU2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEwLjAxLjAwI0Jvb2sgY2FydHMgb3IgYm9vayB0cnVja3MjNTYuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTAuMDIuMDAjQ2lyY3VsYXRpb24gb3IgbGlicmFyaWFuIGRlc2tzIG9yIGNvbXBvbmVudHMjNTYuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTAuMDMuMDAjQm9vayByZXR1cm5zIzU2LjEyLjEwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEwLjA0LjAwI0NhcmQgY2F0YWxvZyB1bml0cyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4wNS4wMCNEaWN0aW9uYXJ5IHN0YW5kcyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4wNi4wMCNVcGhvbHN0ZXJlZCBiZW5jaGVzIzU2LjEyLjEwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEwLjA3LjAwI1B1YmxpYyBhY2Nlc3MgdGFibGVzIzU2LjEyLjEwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEwLjA4LjAwI0Jvb2sgYnJvd3NlciB1bml0cyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4wOS4wMCNTbG9wZWQgcmVhZGluZyB0YWJsZXMjNTYuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTAuMTAuMDAjQm9vayBraW9za3MjNTYuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTAuMTEuMDAjTGlicmFyeSBjb21wYWN0IGRpc2Mgb3IgYXVkaW8gY2Fzc2V0dGUgZGlzcGxheWVycyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4xMi4wMCNSb3RhcnkgaXNsYW5kIHN0YW5kcyM1Ni4xMi4xMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xMC4xNC4wMCNIYW5nIHVwIGJhZyByYWNrcyBvciBiYWdzIzU2LjEyLjEwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjExLjAwLjAwI0FydCBjbGFzc3Jvb20gZnVybmlzaGluZ3MjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTEuMDEuMDAjQXJ0IGhvcnNlIzU2LjEyLjExLjAwLjAwCi11bnNwc2M3IzU2LjEyLjExLjAyLjAwI0FydCBzdHVkZW50IGJlbmNoIzU2LjEyLjExLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEyLjAwLjAwI0ZpcnN0IGFpZCByb29tIGZ1cm5pc2hpbmdzIzU2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEyLjAxLjAwI0ZpcnN0IGFpZCBjb3VjaGVzIzU2LjEyLjEyLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEzLjAwLjAwI0dlbmVyYWwgZWR1Y2F0aW9uYWwgZmFjaWxpdHkgZml4dHVyZXMjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTMuMDEuMDAjU3RhbmRpbmcgcmlzZXJzIzU2LjEyLjEzLjAwLjAwCi11bnNwc2M3IzU2LjEyLjEzLjAyLjAwI1RhYmxlIG9yIGNoYWlyIG1vdmVycyBvciBjYWRkeXMjNTYuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTMuMDMuMDAjUnViYmVyIGJydXNoIGZsb29yIG1hdHRpbmcjNTYuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTMuMDQuMDAjUGxhbm5pbmcgdGFibGVzIzU2LjEyLjEzLjAwLjAwCi11bnNwc2M3IzU2LjEyLjE0LjAwLjAwI0NhZmV0ZXJpYSBhbmQgbHVuY2hyb29tIGZ1cm5pc2hpbmdzIzU2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjE0LjAxLjAwI01vYmlsZSBiZW5jaCB0YWJsZXMjNTYuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTQuMDIuMDAjTW9iaWxlIHN0b29sIHRhYmxlcyM1Ni4xMi4xNC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNC4wMy4wMCNNb2JpbGUgdGFibGVzIzU2LjEyLjE0LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjAwLjAwI0dlbmVyYWwgY2xhc3Nyb29tIGZ1cm5pc2hpbmdzIzU2LjEyLjAwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjAxLjAwI0FjdGl2aXR5IHRhYmxlcyM1Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNS4wMi4wMCNDbGFzc3Jvb20gY2hhaXJzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjAzLjAwI0NsYXNzcm9vbSBiZW5jaGVzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjA0LjAwI0NsYXNyb29tIHN0b29scyM1Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNS4wNS4wMCNDbGFzc3Jvb20gdGFibGVzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjA2LjAwI1N0dWRlbnQgZGVza3MjNTYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTUuMDcuMDAjU3R1ZHkgY2FycmVscyM1Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNS4wOC4wMCNTdHVkZW50IGNvbXB1dGVyIGRlc2tzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE1LjA5LjAwI1N0dWRlbnQgY29tcHV0ZXIgdGFibGVzIzU2LjEyLjE1LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE2LjAwLjAwI0NyZWF0aXZlIHBsYXkgYW5kIHJlc3QgdGltZSBmdXJuaXNoaW5ncyBmb3IgZGF5Y2FyZSBhbmQgZWFybHkgY2hpbGRob29kIGZhY2lsaXRpZXMjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTYuMDEuMDAjVG9kZGxlciBvciBjaGlsZCBzaXplIGxpdmluZyByb29tIHNldHMjNTYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTYuMDIuMDAjVG9kZGxlciBvciBjaGlsZCBzaXplIHNvZmFzIzU2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE2LjAzLjAwI1RvZGRsZXIgb3IgY2hpbGQgc2l6ZSBlYXN5IGNoYWlycyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNi4wNC4wMCNUb2RkbGVyIG9yIGNoaWxkIHNpemUgYmVhbiBiYWcgY2hhaXJzIzU2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE2LjA1LjAwI0xvdyByaXNlIHJvb20gZGl2aWRlcnMgb3IgcGxheSBwYW5lbHMjNTYuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTYuMDYuMDAjQ2hpbGRzIHJlc3QgbWF0cyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNi4wNy4wMCNDaGlsZHMgcmVzdCBtYXQgcmFja3Mgb3IgaG9sZGVycyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNi4wOC4wMCNDaGlsZHJlbnMgY290cyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNi4wOS4wMCNDaGlsZHJlbnMgY290IGNhcnJpZXJzIzU2LjEyLjE2LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE2LjEwLjAwI0NoaWxkcmVucyBjb3QgYWN0aXZpdHkgc3lzdGVtcyM1Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNy4wMC4wMCNCb29rIGFuZCBnZW5lcmFsIHN0b3JhZ2UgdW5pdHMgZm9yIGNsYXNzcm9vbXMjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTcuMDEuMDAjR2VuZXJhbCBzdG9yYWdlIHVuaXRzIzU2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE3LjAyLjAwI0Jvb2sgc3RvcmFnZSB1bml0cyM1Ni4xMi4xNy4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xNy4wMy4wMCNDdWJiaWUgdW5pdHMjNTYuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTcuMDQuMDAjSW5zdGl0dXRpb25hbCBTdG9yYWdlIENhYmluZXRzIzU2LjEyLjE3LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE4LjAwLjAwI1ZvY2F0aW9uYWwgY2xhc3Nyb29tIGZ1cm5pc2hpbmdzIGFuZCBmaXh0dXJlcyM1Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xOC4wMS4wMCNUZWNobmljYWwgZWR1Y2F0aW9uIHRvb2wgc3RvcmFnZSBjYWJpbmV0cyBvciBjYWJpbmV0cyB3aXRoIHRvb2xzIzU2LjEyLjE4LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE4LjAyLjAwI0dlbmVyYWwgc2hvcCB0b29sIHN0b3JhZ2UgY2FiaW5ldHMgb3IgY2FiaW5ldHMgd2l0aCB0b29scyM1Ni4xMi4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xOC4wMy4wMCNXb3Jkd29ya2luZyB0b29sIHN0b3JhZ2UgY2FiaW5ldHMgb3IgY2FiaW5ldHMgd2l0aCB0b29scyM1Ni4xMi4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xOC4wNC4wMCNJbnN0cnVjdG9ycyB0ZWNobmljYWwgZGVzayM1Ni4xMi4xOC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4xOC4wNS4wMCNGbGF0IGZpbGVzIzU2LjEyLjE4LjAwLjAwCi11bnNwc2M3IzU2LjEyLjE5LjAwLjAwI0RlbW9uc3RyYXRpb24gZnVybmlzaGluZ3MjNTYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMTkuMDEuMDAjU2V3aW5nIG1hY2hpbmUgZGVtb25zdHJhdG9yIHRhYmxlcyM1Ni4xMi4xOS4wMC4wMAotdW5zcHNjNyM1Ni4xMi4yMC4wMC4wMCNMYWJvcmF0b3J5IGZ1cm5pdHVyZSM1Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM1Ni4xMi4yMC4wMS4wMCNMYWJvcmF0b3J5IGJlbmNoZXMjNTYuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNTYuMTIuMjAuMDIuMDAjTGFib3JhdG9yeSBzdG9yYWdlIHVuaXRzIG9yIGFjY2Vzc29yaWVzIzU2LjEyLjIwLjAwLjAwCi11bnNwc2M3IzU2LjEyLjIwLjAzLjAwI0xhYm9yYXRvcnkgd29ya3N0YXRpb25zIzU2LjEyLjIwLjAwLjAwCi11bnNwc2M3IzYwLjAwLjAwLjAwLjAwI011c2ljYWwgSW5zdHJ1bWVudHMgYW5kIEdhbWVzIGFuZCBUb3lzIGFuZCBBcnRzIGFuZCBDcmFmdHMgYW5kIEVkdWNhdGlvbmFsIEVxdWlwbWVudCBhbmQgTWF0ZXJpYWxzIGFuZCBBY2Nlc3NvcmllcyBhbmQgU3VwcGxpZXMjNjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMDAuMDAuMDAjRGV2ZWxvcG1lbnRhbCBhbmQgcHJvZmVzc2lvbmFsIHRlYWNoaW5nIGFpZHMgYW5kIG1hdGVyaWFscyBhbmQgYWNjZXNzb3JpZXMgYW5kIHN1cHBsaWVzIzYwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEwLjAwLjAwI01hdGgga2l0cyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMC4wMS4wMCNBZGRpdGlvbiBtYXRoIGtpdHMjNjAuMTAuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTAuMDIuMDAjRGl2aXNpb24gbWF0aCBraXRzIzYwLjEwLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEwLjAzLjAwI0ZyYWN0aW9uIG1hdGgga2l0cyM2MC4xMC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMC4wNC4wMCNNaWRkbGUgU2Nob29sIG1hdGgga2l0cyM2MC4xMC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMC4wNS4wMCNFYXJseSBjaGlsZGhvb2QgbWF0aCBraXRzIzYwLjEwLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEwLjA2LjAwI01lYXN1cmVtZW50IG1hdGgga2l0cyM2MC4xMC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMC4wNy4wMCNNdWx0aXBsaWNhdGlvbiBtYXRoIGtpdHMjNjAuMTAuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTAuMDguMDAjRWxlbWVudGFyeSBtYXRoIGtpdHMjNjAuMTAuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTAuMDkuMDAjU3VidHJhY3Rpb24gbWF0aCBraXRzIzYwLjEwLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEwLjEwLjAwI0hpZ2ggc2Nob29sIG1hdGgga2l0cyM2MC4xMC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMS4wMC4wMCNFbGVjdHJvbmljIGxlYXJuaW5nIGFpZHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTEuMDEuMDAjRWxlY3Ryb25pYyBjYXJkIHJlYWRlcnMjNjAuMTAuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTEuMDIuMDAjQ3VycmljdWx1bSBiYXNlZCBlbGVjdHJvbmljIGxlYXJuaW5nIGFpZHMjNjAuMTAuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTEuMDMuMDAjRWxlY3Ryb25pYyBnbG9iZXMjNjAuMTAuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTEuMDQuMDAjRWxlY3Ryb25pYyBxdWl6IG1hY2hpbmVzIzYwLjEwLjExLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEyLjAwLjAwI0VkdWNhdGlvbmFsIGluY2VudGl2ZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTIuMDEuMDAjQmlibGUgYmFzZWQgY2hhcnQgc3RpY2tlcnMjNjAuMTAuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTIuMDIuMDAjQmlibGUgYmFzZWQgaW5jZW50aXZlIGNoYXJ0cyM2MC4xMC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMi4wMy4wMCNJbmNlbnRpdmUgY2hhcnQgc3RpY2tlcnMjNjAuMTAuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTIuMDQuMDAjSW5jZW50aXZlIGNoYXJ0cyM2MC4xMC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMi4wNS4wMCNJbmNlbnRpdmUgcHVuY2hjYXJkcyM2MC4xMC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4wMC4wMCNFZHVjYXRpb25hbCBzdGlja2VycyBhbmQgc3VwcGxpZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDEuMDAjQmlibGUgYmFzZWQgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDIuMDAjR2lhbnQgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDMuMDAjTm90YXJ5IHNlYWwgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDQuMDAjUGhvdG8gc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDUuMDAjUmV3YXJkIHN0aWNrZXJzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjA2LjAwI1NjZW50ZWQgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDcuMDAjU2hhcGUgc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMDguMDAjU3BhcmtsZSBzdGlja2VycyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4wOS4wMCNSZXdhcmQgc3RhciBzdGlja2VycyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4xMC4wMCNTdGlja2VyIGFzc29ydG1lbnRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjExLjAwI1N0aWNrZXIgYm9va3MjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMTIuMDAjU3RpY2tlciBib3hlcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4xMy4wMCNUYXR0b28gc3RpY2tlcnMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMTQuMDAjQWRkaXRpb24gZmxhc2ggY2FyZHMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMTUuMDAjQWxsIGZhY3RzIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjE2LjAwI0JsYW5rIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjE3LjAwI0RpdmlzaW9uIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjE4LjAwI0VsZWN0cm9uaWMgZmxhc2ggY2FyZHMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMTkuMDAjRXF1aXZhbGVudCBmbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4yMC4wMCNGcmFjdGlvbiBmbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4yMS4wMCNHcmVhdGVyIHRoYW4gb3IgbGVzcyB0aGFuIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjIyLjAwI011bHRpcGxpY2F0aW9uIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjIzLjAwI1N1YnRyYWN0aW9uIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjI0LjAwI0FscGhhYmV0IGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjI1LjAwI1dvcmQgYnVpbGRpbmcgZmxhc2ggY2FyZHMjNjAuMTAuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTMuMjYuMDAjUGhvbmljcyBmbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4yNy4wMCNIYW5kd3JpdGluZyBvciB3cml0aW5nIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjI4LjAwI051bWJlciBjbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4yOS4wMCNNb25leSBmbGFzaCBjYXJkcyM2MC4xMC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xMy4zMC4wMCNUaW1lIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjEzLjMxLjAwI1N0YXRlIGZsYXNoIGNhcmRzIzYwLjEwLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjE0LjAwLjAwI0NsYXNzcm9vbSBhd2FyZHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTQuMDEuMDAjQmFkZ2VzIzYwLjEwLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE0LjAyLjAwI0F3YXJkIGJ1dHRvbnMjNjAuMTAuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTQuMDMuMDAjQ2VsZWJyYXRpb24gY3Jvd25zIzYwLjEwLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE0LjA0LjAwI1Jld2FyZCBqZXdsZXJ5IzYwLjEwLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE0LjA1LjAwI0NsYXNzcm9vbSByaWJib25zIG9yIHJvc2V0dGVzIzYwLjEwLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE2LjAwLjAwI0VkdWNhdGlvbmFsIGNlcnRpZmljYXRlcyBvciBkaXBsb21hcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNi4wMS4wMCNCaWJsZSBiYXNlZCBjZXJ0aWZpY2F0ZXMjNjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTYuMDIuMDAjQmxhbmsgY2VydGlmaWNhdGVzIzYwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE2LjAzLjAwI0NlcnRpZmljYXRlIGZyYW1lcyM2MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNi4wNC4wMCNDZXJ0aWZpY2F0ZSBob2xkZXJzIzYwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE2LjA1LjAwI0NlcnRpZmljYXRlIHJpYmJvbnMjNjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTYuMDYuMDAjRGlwbG9tYXMjNjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTYuMDcuMDAjRm9yZWlnbiBsYW5ndWFnZSBjZXJ0aWZpY2F0ZXMjNjAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTYuMDguMDAjR2VuZXJhbCBwcmFpc2UgY2VydGlmaWNhdGVzIzYwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE2LjA5LjAwI0dyYWRlIHNwZWNpZmljIGNlcnRpZmljYXRlcyM2MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNi4xMC4wMCNTdWJqZWN0IHNwZWNpZmljIGNlcnRpZmljYXRlcyM2MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4wMC4wMCNUZWFjaGVyIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4wMS4wMCNBc3Nlc3NtZW50IHJlc291cmNlIGJvb2tzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjAyLjAwI0NhbGVuZGFycyBvciBjdXQgb3V0cyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4wMy4wMCNDaGFyYWN0ZXIgZWR1Y2F0aW9uIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4wNC4wMCNDbGFzc3Jvb20gYWN0aXZpdHkgYm9va3MjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMDUuMDAjQ3JpdGljYWwgdGhpbmtpbmcgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjA2LjAwI0Nyb3NzIGN1cnJpY3VsdW0gZ3VpZGVzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjA3LjAwI0N1cnJpY3VsdW0gZ3VpZGVzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjA4LjAwI0ZhYnJpYyBjaGFydHMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMDkuMDAjRmxhbm5lbCBib2FyZCBhaWRzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjEwLjAwI0VkdWNhdG9yIGdpZnRzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjExLjAwI0dyYWRpbmcgc3RhbXBzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjEyLjAwI0hhbGwgcGFzc2VzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjEzLjAwI0hvbWUgZWR1Y2F0aW9uIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4xNC4wMCNIb21ld29yayBhc3NpZ25tZW50IHJlc291cmNlcyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4xNS4wMCNJZGVhIGJvb2tzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjE2LjAwI01hZ25ldGljIGJvYXJkIGFpZHMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMTcuMDAjTmFtZSBwbGF0ZXMgb3IgdGFncyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4xOC4wMCNUZWFjaGVyIHBsYW4gYm9va3MjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMTkuMDAjUG9ja2V0IGNoYXJ0cyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4yMC4wMCNUZWFjaGVyIGNvbW11bmljYXRpb24gcG9zdGNhcmRzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjIxLjAwI1Byb2Zlc3Npb25hbCB0ZWFjaGVyIHJlc291cmNlIGJvb2tzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjIyLjAwI1RlYWNoZXIgY2xhc3Nyb29tIGdyYWRpbmcgYm9va3MjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMjMuMDAjQ2xhc3Nyb29tIHN0dWRlbnQgc2VhdGluZyBjaGFydHMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMjQuMDAjU3Vic3RpdHV0ZSB0ZWFjaGVyIGZvbGRlcnMgb3IgZm9ybXMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMjUuMDAjVGVjaG5vbG9neSBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4xNy4yNi4wMCNUZWNobm9sb2d5IHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMjcuMDAjVGVzdCB0YWtpbmcgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjI4LjAwI1RoZW1lIHVuaXQgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE3LjI5LjAwI01pZGRsZSBvciBqdW5pb3Igc2Nob29sIHRlYWNoaW5nIGtpdHMjNjAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTcuMzAuMDAjTGFib3JhdG9yeSBtYW51YWxzIzYwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE4LjAwLjAwI0NodXJjaCBzY2hvb2wgZWR1Y2F0aW9uYWwgcmVzb3VyY2VzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjE4LjAxLjAwI0JpYmxlIHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTguMDIuMDAjQmlibGUgYmFzZWQgZHJhbWFzIzYwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE4LjAzLjAwI0JpYmxlIGJhc2VkIHJlc291cmNlIG9yIGFjdGl2aXR5IGJvb2tzIzYwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE4LjA0LjAwI1N1bmRheSBzY2hvb2wgYWN0aXZpdHkgcmVzb3VyY2UgYm9va3MjNjAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTguMDUuMDAjVmFjYXRpb24gYmlibGUgc2Nob29sIHJlc291cmNlcyM2MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wMC4wMCNBbHBoYWJldCBza2lsbHMgbWF0ZXJpYWxzIGFuZCByZXNvdXJjZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMDEuMDAjQWxwaGFiZXQgYWN0aXZpdHkgYm9va3MjNjAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMDIuMDAjQWxwaGFiZXQgY3ViZXMjNjAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMDMuMDAjQWxwaGFiZXQgZGVzayB0YXBlcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wNC4wMCNBbHBoYWJldCBraXRzIzYwLjEwLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjE5LjA1LjAwI0FscGhhYmV0IGxldHRlciB0aWxlcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wNi4wMCNBbHBoYWJldCBwb3N0ZXIgY2FyZHMjNjAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMDcuMDAjQWxwaGFiZXQgcmVmZXJlbmNlIGd1aWRlcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wOC4wMCNBbHBoYWJldCByZXNvdXJjZSBib29rcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4wOS4wMCNBbHBoYWJldCBzdGFtcHMjNjAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMTkuMTAuMDAjQWxwaGFiZXQgd2FsbCBjYXJkcyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4xOS4xMS4wMCNUYWN0aWxlIGFscGhhYmV0cyM2MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMC4wMC4wMCNXb3JkIGJ1aWxkaW5nIHJlc291cmNlIG1hdGVyaWFscyBhbmQgYWNjZXNzb3JpZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjAuMDEuMDAjU3BlZWNoIG1pcnJvciM2MC4xMC4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMC4wMi4wMCNTcGVsbGluZyByZXNvdXJjZSBtYXRlcmlhbHMjNjAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjAuMDMuMDAjV29yZCBidWlsZGluZyBhY3Rpdml0eSBib29rcyM2MC4xMC4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMC4wNC4wMCNXb3JkIGJ1aWxkaW5nIGtpdHMjNjAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjAuMDUuMDAjV29yZCBidWlsZGluZyByZXNvdXJjZSBib29rcyM2MC4xMC4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMC4wNi4wMCNXb3JkIGJ1aWxkaW5nIHRpbGVzIzYwLjEwLjIwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIwLjA3LjAwI1dvcmQgd2FsbHMjNjAuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjEuMDAuMDAjTGFuZ3VhZ2UgYXJ0cyByZXNvdXJjZSBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjEuMDEuMDAjQWRqZWN0aXZlIHJlc291cmNlIGJvb2tzIzYwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIxLjAyLjAwI0FkdmVyYiByZXNvdXJjZSBib29rcyM2MC4xMC4yMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMS4wMy4wMCNHcmFtbWFyIHJlc291cmNlIGJvb2tzIzYwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIxLjA0LjAwI05vdW4gcmVzb3VyY2UgYm9va3MjNjAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjEuMDUuMDAjUHVuY3R1dGF0aW9uIHJlc291cmNlIGJvb2tzIzYwLjEwLjIxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIxLjA2LjAwI1ZlcmIgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjIuMDAuMDAjUGhvbmljcyByZXNvdXJjZSBtYXRlcmlhbHMgYW5kIGFjY2Vzc29yaWVzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIyLjAxLjAwI1Bob25pY3MgYWN0aXZpdHkgYm9va3MjNjAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjIuMDIuMDAjUGhvbmljcyBkcmlsbCBjYXJkcyM2MC4xMC4yMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMi4wMy4wMCNQaG9uaWNzIGtpdCM2MC4xMC4yMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMi4wNC4wMCNQaG9uaWNzIHBpY3R1cmUgY2FyZHMjNjAuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjIuMDUuMDAjUGhvbmljcyByZXNvdXJjZSBib29rcyM2MC4xMC4yMi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMi4wNi4wMCNQaG9uaWNzIHRpbGVzIzYwLjEwLjIyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjAwLjAwI1JlYWRpbmcgYm9va3MgYW5kIHJlc291cmNlcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMy4wMS4wMCNSZWFkaW5nIGFjdGl2aXR5IGJvb2tzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjAyLjAwI0JlZ2lubmluZyByZWFkaW5nIGJvb2tzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjAzLjAwI0JpYmxlIGJhc2VkIGNoaWxkcmVucyBsaXRlcmF0dXJlIGJvb2tzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA0LjAwI0NoaWxkcmVucyBsaXRlcmF0dXJlIGJvb2tzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA1LjAwI0NyaXRpY2FsIHJlYWRpbmcgc2tpbGxzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA2LjAwI0ZsYW5uZWwgYm9hcmRzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA3LjAwI1BvZXRyeSByZXNvdXJjZSBib29rcyM2MC4xMC4yMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMy4wOC4wMCNSZWFkaW5nIGNvbXByZWhlbnNpb24gbWF0ZXJpYWxzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjA5LjAwI1JlYWRpbmcgZGV2ZWxvcG1lbnQgbWF0ZXJpYWxzIG9yIGtpdHMjNjAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjMuMTAuMDAjUmVhZGluZyByZXNvdXJjZSBib29rcyM2MC4xMC4yMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yMy4xMS4wMCNSZWFkaW5nIHRoZW1hdGljIHVuaXRzIzYwLjEwLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjIzLjEyLjAwI1ZvY2FidWxhcnkgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMDAuMDAjRWFybHkgbGVhcm5pbmcgbWF0aCBhbmQgY291bnRpbmcgcmVzb3VyY2VzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNC4wMS4wMCNBYmFjdXMgb3IgY291bnRpbmcgZnJhbWVzIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjAyLjAwI0FjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIGZvciB3b3JraW5nIHdpdGggZWFybHkgbWF0aCBtYW5pcHVsYXRpdmVzIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjAzLjAwI0FjdGl2aXR5IGNhcmRzIGZvciB3b3JraW5nIHdpdGggZWFybHkgbWF0aCBtYW5pcHVsYXRpdmVzIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjA0LjAwI0JlYWRzIG9yIGJlYWQgYWN0aXZpdHkgc2V0cyBmb3IgZWFybHkgbWF0aCM2MC4xMC4yNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNC4wNS4wMCNDb3VudGVycyBvciBjb3VudGVyIGFjdGl2aXR5IHNldHMgZm9yIGVhcmx5IG1hdGgjNjAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMDYuMDAjQ291bnRpbmcgb3Igc29ydGluZyB0cmF5cyBvciBib3dscyBmb3IgZWFybHkgbWF0aCM2MC4xMC4yNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNC4wNy4wMCNMYWNlcyBvciBsYWNpbmcgc2V0cyBmb3IgZWFybHkgbWF0aCM2MC4xMC4yNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNC4wOC4wMCNMaW5raW5nIG1hbmlwdWxhdGl2ZXMgb3IgbGlua2luZyBhY3Rpdml0eSBzZXRzIGZvciBlYXJseSBtYXRoIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjA5LjAwI01hdGggZ2FtZSBjaGlwcyBvciB0b2tlbnMjNjAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMTAuMDAjTnVtYmVyIGNhcmRzIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjExLjAwI051bWJlciBmb3JtcyBtb2RlbHMgb3IgYWNjZXNzb3JpZXMjNjAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMTIuMDAjUGVnYm9hcmRzIGZvciBlYXJseSBtYXRoIzYwLjEwLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI0LjEzLjAwI1BlZ3MgZm9yIGVhcmx5IG1hdGgjNjAuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjQuMTQuMDAjU29ydGluZyBtYW5pcHVsYXRpdmVzIG9yIHNvcnRpbmcgYWN0aXZpdHkgc2V0cyBmb3IgZWFybHkgbWF0aCM2MC4xMC4yNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNS4wMC4wMCNCYXNpYyBtYXRoIG9wZXJhdGlvbnMgYW5kIG51bWVyYXRpb24gcmVzb3VyY2VzIGFuZCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjUuMDEuMDAjQWRkaXRpb24gYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjUuMDIuMDAjQmFzaWMgb3BlcmF0aW9ucyBtb2RlbHMjNjAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjUuMDMuMDAjQmFzaWMgb3BlcmF0aW9ucyByZWZlcmVuY2UgZ3VpZGVzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA0LjAwI0RpdmlzaW9uIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA1LjAwI011bHRpcGxpY2F0aW9uIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA2LjAwI1N1YnRyYWN0aW9uIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA3LjAwI051bWJlciBkZXNrIHRhcGVzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjA4LjAwI0h1bmRyZWRzIGNoYXJ0cyBvciBib2FyZHMjNjAuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjUuMDkuMDAjSHVuZHJlZHMgbnVtYmVyIHRpbGVzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjEwLjAwI051bWJlciBraXRzIzYwLjEwLjI1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI1LjExLjAwI051bWJlciBsaW5lcyM2MC4xMC4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNS4xMi4wMCNOdW1iZXJhdGlvbiBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNS4xMy4wMCNEb21pbm9lcyM2MC4xMC4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wMC4wMCNQcm9iYWJpbGl0eSBvciBjaGFuY2Ugb3IgZGF0YSBvciBwcm9ibGVtIHNvbHZpbmcgdGVhY2hlciByZXNvdXJjZSBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMDEuMDAjVHdvIHNpZGVkIGNvdW50ZXJzIG9yIHRva2VucyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wMi4wMCNTcGlubmVycyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wMy4wMCNEaWNlIHNldHMjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMDQuMDAjUHJvYmFiaWxpdHkgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMDUuMDAjTG9naWMgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMDYuMDAjQXR0cmlidXRlIGJsb2NrcyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wNy4wMCNBdHRyaWJ1dGUgYmxvY2tzIGFjdGl2aXR5IGNhcmRzIzYwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI2LjA4LjAwI0F0dHJpYnV0ZSBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4wOS4wMCNHcmFwaGluZyBtYXQjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMTAuMDAjR3JhcGhpbmcgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMTEuMDAjTG9naWMgZ2FtZXMjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMTIuMDAjQXR0cmlidXRlIHNldHMgb3Iga2l0cyM2MC4xMC4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNi4xMy4wMCNQcm9ibGVtIHNvbHZpbmcgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjYuMTQuMDAjUHJvYmxlbSBzb2x2aW5nIGFjdGl2aXR5IGNhcmRzIzYwLjEwLjI2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjAwLjAwI1BhdHRlcm5pbmcgb3IgbWF0Y2hpbmcgb3Igc3BhdGlhbCBwZXJjZXB0aW9uIG9yIGxvZ2ljYWwgdGhpbmtpbmcgdGVhY2hlciByZXNvdXJjZSBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMDEuMDAjUGF0dGVybiBibG9ja3Mgb3IgcGFycXVldHJ5IGJsb2NrcyBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4wMi4wMCNQYXR0ZXJuIGJsb2NrcyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4wMy4wMCNQYXR0ZXJuIGJsb2NrIGFjdGl2aXR5IG9yIHBhdHRlcm4gY2FyZHMjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMDQuMDAjUGF0dGVybiBibG9jayBnYW1lcyBvciBhY3Rpdml0eSBzZXRzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjA1LjAwI1BhdHRlcm4gYmxvY2sgc3RpY2tlcnMjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMDYuMDAjUGF0dGVybiBibG9ja3MgbWlycm9yIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjA3LjAwI1BhdHRlcm4gYmxvY2tzIGNoYXJ0cyBvciBwb3N0ZXJzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjA4LjAwI1BhcnF1ZXRyeSBibG9ja3MjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMDkuMDAjUGFycXVldHJ5IGJsb2NrcyBhY3Rpdml0eSBvciBwYXR0ZXJuIGNhcmRzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjEwLjAwI1BhcnF1ZXRyeSBibG9ja3MgYWN0aXZpdHkgc2V0cyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4xMS4wMCNUYW5ncmFtcyBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4xMi4wMCNUYW5ncmFtIGFjdGl2aXR5IG9yIHBhdHRlcm4gY2FyZHMjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjcuMTMuMDAjVGFuZ3JhbSBwdXp6bGUgYWN0aXZpdHkgc2V0cyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4xNC4wMCNUYW5ncmFtcyBwdXp6bGVzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjE1LjAwI1BlbnRvbWlub2VzIGFjdGl2aXR5IGFuZCByZXNvdXJjZSBib29rcyM2MC4xMC4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMC4yNy4xNi4wMCNQZW50b21pbm9lcyBhY3Rpdml0eSBvciBwYXR0ZXJuIGNhcmRzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjE3LjAwI1BlbnRvbWlub2VzIzYwLjEwLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI3LjE4LjAwI1BlbnRvbWlub2VzIGFjdGl2aXR5IHNldHMjNjAuMTAuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjguMDAuMDAjQmFzZSB0ZW4gYW5kIHBsYWNlIHZhbHVlIHRlYWNoZXIgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjI4LjAxLjAwI0Jhc2UgdGVuIGJsb2NrcyM2MC4xMC4yOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOC4wMi4wMCNCYXNlIHRlbiBvciBwbGFjZSB2YWx1ZSBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4yOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOC4wMy4wMCNCYXNlIHRlbiBvciBwbGFjZSB2YWx1ZSBhY3Rpdml0eSBjYXJkcyM2MC4xMC4yOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOC4wNC4wMCNCYXNlIHRlbiBydWJiZXIgc3RhbXBzIzYwLjEwLjI4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI4LjA1LjAwI1BsYWNlIHZhbHVlIGdyaWRzIzYwLjEwLjI4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI4LjA2LjAwI1BsYWNlIHZhbHVlIGdhbWVzIG9yIGFjdGl2aXR5IHNldHMjNjAuMTAuMjguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjguMDcuMDAjUGxhY2UgdmFsdWUgbW9kZWxzIG9yIGFjY2Vzc29yaWVzIzYwLjEwLjI4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjAwLjAwI01vbmV5IGFuZCB0aW1lIHRlYWNoZXIgcmVzb3VyY2UgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjAxLjAwI01vbmV5IGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjAyLjAwI0J1bGsgYmlsbHMgZm9yIHRoZSBjbGFzc3Jvb20jNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDMuMDAjQnVsayBjb2lucyBmb3IgdGhlIGNsYXNzcm9vbSM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4wNC4wMCNDb2luIGN1YmVzIG9yIGRpY2UjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDUuMDAjTWFnbmV0aWMgbW9uZXkjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDYuMDAjT3ZlcmhlYWQgYmlsbHMjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDcuMDAjT3ZlcmhlYWQgY29pbnMjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMDguMDAjTW9uZXkgcHV6emxlcyM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4wOS4wMCNNb25leSBydWJiZXIgc3RhbXBzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjEwLjAwI0NvaW4gYmFuayM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4xMS4wMCNNb25leSBnYW1lcyBvciBraXRzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjEyLjAwI1BsYXkgY2FzaCByZWdpc3RlcnMjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMTMuMDAjTW9uZXkgcmVmZXJlbmNlIGd1aWRlcyM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4xNC4wMCNUaW1lIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjI5LjE1LjAwI1RpbWUgcnViYmVyIHN0YW1wcyM2MC4xMC4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4yOS4xNi4wMCNUaW1lIGtpdHMjNjAuMTAuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMjkuMTcuMDAjVGltZSByZWZlcmVuY2UgZ3VpZGVzIzYwLjEwLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjAwLjAwI0ZyYWN0aW9ucyBhbmQgcGVudG9taW5vZXMgYW5kIGRlY2ltYWxzIHRlYWNoaW5nIGFpZHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzAuMDEuMDAjRnJhY3Rpb24gY2lyY2xlcyBvciBzcXVhcmVzIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjAyLjAwI0RlY2ltYWwgc3F1YXJlcyM2MC4xMC4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMC4wMy4wMCNGcmFjdGlvbiBhY3Rpdml0eSBib29rcyM2MC4xMC4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMC4wNC4wMCNGcmFjdGlvbiBiYXJzIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjA1LjAwI0ZyYWN0aW9uIGNoYXJ0cyM2MC4xMC4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMC4wNi4wMCNGcmFjdGlvbiBkaWNlIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjA3LjAwI0ZyYWN0aW9uIGdhbWVzIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjA4LjAwI0ZyYWN0aW9uIGtpdHMjNjAuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzAuMDkuMDAjRnJhY3Rpb24gdGlsZXMjNjAuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzAuMTAuMDAjRnJhY3Rpb25zIGRpc2NzIzYwLjEwLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMwLjEyLjAwI1BlbnRvbWlub2VzIGFjdGl2aXR5IGJvb2sjNjAuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzAuMTMuMDAjUGVudG9taW5vZXMgcGF0dGVybiBjYXJkcyM2MC4xMC4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wMC4wMCNHZW9tZXRyeSB0ZWFjaGVyIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wMS4wMCNHZW9tZXRyeSBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wMi4wMCNHZW9tZXRyeSBjaGFydHMgb3IgcG9zdGVycyM2MC4xMC4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wMy4wMCNHZW9ib2FyZHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMDQuMDAjR2VvbWV0cmljIGNvbnN0cnVjdGlvbiBzZXRzIzYwLjEwLjMxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMxLjA1LjAwI0RvdWJsZSBzaWRlZCBnZW9ib2FyZHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMDYuMDAjR2VvYm9hcmQgZ2FtZXMgb3IgYWN0aXZpdHkga2l0cyM2MC4xMC4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4wNy4wMCNHZW9ib2FyZCBydWJiZXIgYmFuZHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMDguMDAjR2VvYm9hcmRzIGFjdGl2aXR5IGNhcmRzIzYwLjEwLjMxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMxLjA5LjAwI0dlb21ldHJpYyBjaGFsa2JvYXJkIGRyYXdpbmcgaW5zdHJ1bWVudHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMTAuMDAjR2VvbWV0cnkgcmVmZXJlbmNlIGd1aWRlcyM2MC4xMC4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMS4xMS4wMCNHZW9NaXJyb3IjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzEuMTIuMDAjR2VvbWV0cmljIHNvbGlkcyBtb2RlbHMjNjAuMTAuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzIuMDAuMDAjQWxnZWJyYSB0ZWFjaGVyIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMi4wMS4wMCNBbGdlYnJhIGFjdGl2aXR5IG9yIHJlc291cmNlIGJvb2tzIzYwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMyLjAyLjAwI0NlbnRpbWV0ZXIgY3ViZXMjNjAuMTAuMzIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzIuMDMuMDAjQWxnZWJyYSBvciBwcmUgYWxnZWJyYSByZWZlcmVuY2UgZ3VpZGVzIzYwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMyLjA0LjAwI0FsZ2VicmEgbW9kZWxzIG9yIGFjY2Vzc29yaWVzIzYwLjEwLjMyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjMzLjAwLjAwI1ByZWNhbGN1bHVzIGFuZCBjYWxjdWx1cyB0ZWFjaGVyIHJlc291cmNlIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMy4wMS4wMCNDYWxjdWx1cyBhY3Rpdml0eSBvciByZXNvdXJjZXMgYm9va3MjNjAuMTAuMzMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzMuMDIuMDAjUHJlY2FsY3VsdXMgb3IgY2FsY3VsdXMgcmVmZXJlbmNlIGd1aWRlcyM2MC4xMC4zMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4zMy4wMy4wMCNQcmVjYWxjdWx1cyBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4zMy4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNC4wMC4wMCNHZW9ncmFwaHkgYW5kIG1hcCBza2lsbHMgcmVzb3VyY2VzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNC4wMS4wMCNHb2VncmFwaHkgY2hhcnRzIG9yIHBvc3RlcnMjNjAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzQuMDIuMDAjQ29udGluZW50cyBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4zNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNC4wMy4wMCNFbGVjdHJvbmljIHNvY2lhbCBzdHVkaWVzIGxlYXJuaW5nIGFpZHMjNjAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzQuMDQuMDAjR2VvZ3JhcGh5IHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzQuMDUuMDAjTWFwIHJhY2tzIzYwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM0LjA2LjAwI01hcCBzdGVuY2lsIGtpdHMjNjAuMTAuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzQuMDcuMDAjUG9ydGFibGUgd2FsbCBtYXBzIzYwLjEwLjM0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM0LjA4LjAwI0dlb2dyYXBoeSByZXNvdXJjZSBvciBhY3Rpdml0eSBib29rcyM2MC4xMC4zNC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNS4wMC4wMCNQb2xpdGljYWwgc2NpZW5jZSM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNS4wMS4wMCNFY29ub21pY3MgYWN0aXZpdHkgb3IgcmVzb3VyY2UgYm9va3MjNjAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzUuMDIuMDAjR292ZXJubWVudCBhY3Rpdml0eSBvciByZXNvdXJjZSBib29rcyM2MC4xMC4zNS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNS4wMy4wMCNHb3Zlcm5tZW50IHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzUuMDQuMDAjU3RhdGUgdGhlbWUgdW5pdHMjNjAuMTAuMzUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzYuMDAuMDAjTXVsdGljdWx0dXJhbCBhY3Rpdml0aWVzIGFuZCByZXNvdXJjZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzYuMDEuMDAjQW5jaWVudCBjaXZpbGl6YXRpb25zIHJlc291cmNlcyM2MC4xMC4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNi4wMi4wMCNDdXN0b21zIG9yIHJpdHVhbHMgb3IgdHJhZGl0aW9ucyByZXNvdXJjZXMjNjAuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzYuMDMuMDAjRXRobmljIGRpdmVyc2l0eSByZXNvdXJjZXMjNjAuMTAuMzYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzYuMDQuMDAjR2VuZWFsb2d5IHJlc291cmNlcyM2MC4xMC4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNi4wNS4wMCNNdWx0aWN1bHR1cmFsIGhvbGlkYXlzIHJlc291cmNlcyM2MC4xMC4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNi4wNi4wMCNNdWx0aWN1bHR1cmFsIHRoZW1lIHVuaXRzIzYwLjEwLjM2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM3LjAwLjAwI0ZvcmVpZ24gbGFuZ3VhZ2VzIHJlc291cmNlcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zNy4wMS4wMCNSZXNvdXJjZXMgZm9yIExlYXJuaW5nIHRvIHNwZWFrIHNwYW5pc2gjNjAuMTAuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzcuMDIuMDAjUmVzb3VyY2VzIGZvciBMZWFybmluZyB0byBzcGVhayBmcmVuY2gjNjAuMTAuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzcuMDMuMDAjUmVzb3VyY2VzIGZvciBMZWFybmluZyB0byBzcGVhayBnZXJtYW4jNjAuMTAuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzcuMDQuMDAjUmVzb3VyY2VzIGZvciBMZWFybmluZyB0byBzcGVhayBlbmdsaXNoIzYwLjEwLjM3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM3LjA1LjAwI1Jlc291cmNlcyBmb3IgTGVhcm5pbmcgdG8gc3BlYWsgbGF0aW4jNjAuMTAuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzcuMDYuMDAjUmVzb3VyY2VzIGZvciBMZWFybmluZyB0byBzcGVhayBpdGFsaWFuIzYwLjEwLjM3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjAwLjAwI0hpc3RvcnkgdGVhY2hpbmcgcmVzb3VyY2VzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjAxLjAwI0FmcmljYW4gaGlzdG9yeSByZXNvdXJjZSBib29rcyM2MC4xMC4zOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOC4wMi4wMCNIaXN0b3J5IGNoYXJ0cyBvciBwb3N0ZXJzIzYwLjEwLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjAzLjAwI0V1cm9wZWFuIGhpc3RvcnkgcmVzb3VyY2UgYm9va3MjNjAuMTAuMzguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzguMDQuMDAjSGlzdG9yaWNhbCBtYXBzIzYwLjEwLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjA1LjAwI0hpc3RvcnkgdGhlbWUgdW5pdHMjNjAuMTAuMzguMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzguMDYuMDAjSGlzdG9yeSBwaG90byBjYXJkcyM2MC4xMC4zOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOC4wNy4wMCNIaXN0b3J5IHJlc291cmNlIGJvb2tzIzYwLjEwLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM4LjA4LjAwI1dvbWFucyBoaXN0b3J5IHJlc291cmNlcyM2MC4xMC4zOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOC4wOS4wMCNXb3JsZCBoaXN0b3J5IHJlc291cmNlcyM2MC4xMC4zOC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wMC4wMCNMaXZpbmcgb3JnYW5pc21zIGFuZCBwcmVzZXJ2ZWQgc3BlY2ltZW5zIGFuZCByZWxhdGVkIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wMS4wMCNMaXZlIGFtcGhpYmlhIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjAyLjAwI1ByZXNlcnZlZCBhbXBoaWJpYSM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wMy4wMCNBbXBoaWJpYSBtb2RlbHMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMDQuMDAjRnVuZ2kgY3VsdHVyZXMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMDUuMDAjQ3VsdHVyZSBraXRzIG9yIHN1cHBsaWVzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjA2LjAwI1Byb3Rvem9hbiBjdWx0dXJlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wNy4wMCNBcXVhcmlhIHBsYW50cyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4wOC4wMCNUZXJyYXJpdW0gcGxhbnRzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjA5LjAwI0xpdmUgaW52ZXJ0ZWJyYXRlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xMC4wMCNQcmVzZXJ2ZWQgaW52ZXJ0ZWJyYXRlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xMS4wMCNMaXZlIHZlcnRlYnJhdGVzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjEyLjAwI1ByZXNlcnZlZCB2ZXJ0ZWJyYXRlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xMy4wMCNMaXZlIHJlcHRpbGlhIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjE0LjAwI1ByZXNlcnZlZCByZXB0aWxsYSM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xNS4wMCNEaXNzZWN0aW9uIGtpdHMgb3Igc3VwcGxpZXMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMTguMDAjQmlvc3BoZXJlcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4xOS4wMCNCaW9sb2d5IGV4cGVyaW1lbnQga2l0cyBvciBzdXBwbGllcyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yMC4wMCNTdGFpbmluZyBraXRzIG9yIHN1cHBsaWVzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjIxLjAwI1ByZXNlcnZlZCBsaWZlIGN5Y2xlIHNwZWNpbWVucyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yMi4wMCNCaW9sb2d5IHJlZmVyZW5jZSBndWlkZXMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMjMuMDAjU2tlbGV0b24gb3IgYm9uZSBvciBzaGVsbCBzcGVjaW1lbiM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yNC4wMCNCaW9sb2d5IHJlc291cmNlIG9yIGFjdGl2aXR5IGJvb2tzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjI1LjAwI0Jpb2xvZ3kgc3R1ZHkgb3IgYWN0aXZpdHkga2l0cyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yNi4wMCNCaW9sb2d5IGNoYXJ0cyBvciBwb3N0ZXJzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjI3LjAwI1ByZXNlcnZlZCBwbGFudCBib2R5IG9yIG9yZ2FuIHNwZWNpbWVucyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4yOC4wMCNCaW9sb2d5IGFjdGl2aXR5IG9yIHBob3RvIGNhcmRzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjI5LjAwI1BsYW50IGxpZmUgY3ljbGUgc3BlY2ltZW5zIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjMwLjAwI0NvbWJpbmF0aW9uIG9yZ2FuaXNtIHNwZWNpbWVucyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4zMS4wMCNBbmltYWwgYm9keSBvciBib2R5IHBhcnQgb3Igb3JnYW4gc3BlY2ltZW5zIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjM5LjMyLjAwI0Vjb3N5c3RlbSBkaXNwbGF5cyM2MC4xMC4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMC4zOS4zMy4wMCNIdW1hbiBib2R5IG9yIGJvZHkgcGFydCBvciBvcmdhbiBzcGVjaW1lbnMjNjAuMTAuMzkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuMzkuMzQuMDAjVGlzc3VlIGN1bHR1cmVzIzYwLjEwLjM5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjAwLjAwI0Jpb3RlY2hub2xvZ3kgYW5kIGJpbyBjaGVtaXN0cnkgYW5kIGdlbmV0aWNzIGFuZCBtaWNyb2Jpb2xvZ3kgYW5kIHJlbGF0ZWQgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjAxLjAwI0Rlb3h5cmlib251Y2xlaWMgYWNpZCBETkEgbW9kZWxzIzYwLjEwLjQwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjAyLjAwI0Rlb3h5cmlib251Y2xlaWMgYWNpZCBETkEgZXhwZXJpbWVudCBraXRzIzYwLjEwLjQwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjAzLjAwI0dlbmV0aWMgYm9va3MjNjAuMTAuNDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDAuMDQuMDAjR2VuZXRpYyBraXRzIzYwLjEwLjQwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQwLjA1LjAwI0JhY3RlcmlhIHRlYWNoaW5nIGtpdHMjNjAuMTAuNDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDAuMDYuMDAjQmFjdGVyaWEgdGVzdGluZyBzdXBwbGllcyM2MC4xMC40MC4wMC4wMAotdW5zcHNjNyM2MC4xMC40MC4wNy4wMCNFbnp5bW9sb2d5IGtpdHMgb3Igc3VwcGxpZXMjNjAuMTAuNDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDAuMDguMDAjUHJvdGVpbiB0ZXN0aW5nIGtpdHMgb3Igc3VwcGxpZXMjNjAuMTAuNDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDEuMDAuMDAjQm9keSBzeXN0ZW1zIGFuZCByZWxhdGVkIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC40MS4wMS4wMCNCb2R5IG1vZGVscyM2MC4xMC40MS4wMC4wMAotdW5zcHNjNyM2MC4xMC40MS4wMi4wMCNDZWxsIG1vZGVscyM2MC4xMC40MS4wMC4wMAotdW5zcHNjNyM2MC4xMC40MS4wMy4wMCNDZWxsIHRlYWNoaW5nIGtpdHMjNjAuMTAuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDEuMDQuMDAjQm9keSBzeXN0ZW1zIHRlYWNoaW5nIGtpdHMjNjAuMTAuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDEuMDUuMDAjQm9keSBzeXN0ZW1zIHRlYWNoaW5nIGFpZHMjNjAuMTAuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDIuMDAuMDAjV2F0ZXIgdGVzdGluZyBhbmQgY29uc2VydmF0aW9uIGFuZCBlY29sb2d5IzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQyLjAxLjAwI1dhdGVyIHRlc3RpbmcgY2hlbWljYWxzIzYwLjEwLjQyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQyLjAyLjAwI1dhdGVyIHRlc3RpbmcgYW5kIHNhbXBsaW5nIGtpdHMjNjAuMTAuNDIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDIuMDMuMDAjV2F0ZXIgbW9kZWxzIzYwLjEwLjQyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQyLjA0LjAwI1dhdGVyIGVjb2xvZ3kgc3VwcGxpZXMjNjAuMTAuNDIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDMuMDAuMDAjQXN0cm9ub215IzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQzLjAxLjAwI0FzdHJvbm9teSBtb2RlbHMjNjAuMTAuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDMuMDIuMDAjQXN0cm9ub215IGNoYXJ0cyM2MC4xMC40My4wMC4wMAotdW5zcHNjNyM2MC4xMC40My4wMy4wMCNBc3Ryb25vbXkgc3R1ZHkga2l0cyM2MC4xMC40My4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wMC4wMCNHZW9sb2d5IGFuZCBlYXJ0aCBzY2llbmNlIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ0LjAxLjAwI1JvY2sgc3BlY2ltZW4gc2V0cyM2MC4xMC40NC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wMi4wMCNSb2NrIHNwZWNpbWVucyM2MC4xMC40NC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wMy4wMCNGb3NzaWxzIzYwLjEwLjQ0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ0LjA0LjAwI0xhbmRmb3JtIG1vZGVscyM2MC4xMC40NC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wNS4wMCNGb3NzaWwgbW9kZWxzIzYwLjEwLjQ0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ0LjA2LjAwI0dlb2xvZ3kgdG9vbHMgb3IgZmllbGQjNjAuMTAuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDQuMDcuMDAjU3RyZWFtIHRhYmxlcyM2MC4xMC40NC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NC4wOC4wMCNHZW9sb2d5IHN0dWR5IGtpdHMjNjAuMTAuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDUuMDAuMDAjQ2hlbWlzdHJ5IGFuZCBlbGVjdHJvY2hlbWlzdHJ5IGFuZCBtaWNyb2NoZW1pc3RyeSM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC40NS4wMS4wMCNQZXJpb2RpYyB0YWJsZSBwb3N0ZXJzIG9yIGJvYXJkcyM2MC4xMC40NS4wMC4wMAotdW5zcHNjNyM2MC4xMC40NS4wMi4wMCNDb25zdW1lciBhbmFseXNpcyBraXRzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjAzLjAwI0NoZW1pc3RyeSBjbGFzcyBraXRzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjA0LjAwI0NoZW1pc3RyeSBkZW1vbnN0cmF0aW9uIGtpdHMjNjAuMTAuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDUuMDUuMDAjQXRvbWljIG1vZGVscyM2MC4xMC40NS4wMC4wMAotdW5zcHNjNyM2MC4xMC40NS4wNi4wMCNNb2xlY3VsYXIgbW9kZWxzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjA3LjAwI0VsZWN0cm9jaGVtaWNhbCBkZW1vbnN0cmF0aW9uIHRvb2xzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjA4LjAwI0VsZWN0cm9jaGVtaWNhbCBraXRzIzYwLjEwLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ1LjA5LjAwI0Z1ZWwgY2VsbHMjNjAuMTAuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDUuMTAuMDAjTWljcm9jaGVtaXN0cnkga2l0cyM2MC4xMC40NS4wMC4wMAotdW5zcHNjNyM2MC4xMC40NS4xMS4wMCNNaWNyb2NoZW1pc3RyeSB0b29scyM2MC4xMC40NS4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ni4wMC4wMCNNZWNoYW5pY2FsIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ2LjAxLjAwI0ZvcmNlIHRhYmxlcyM2MC4xMC40Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ni4wMi4wMCNHcmF2aXR5IG1vZGVscyBvciBtb2RlbCBzZXRzIzYwLjEwLjQ2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ2LjA0LjAwI0luY2xpbmVkIHBsYW5lcyM2MC4xMC40Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ni4wNS4wMCNGcmljdGlvbiBhcHBhcmF0dXMjNjAuMTAuNDYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDYuMDYuMDAjUGh5c2ljIGNhcnMjNjAuMTAuNDYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDYuMDcuMDAjUGVuZHVsdW0gYXBwYXJhdHVzIzYwLjEwLjQ2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ2LjA4LjAwI1RvcnF1ZSBhcHBhcmF0dXMjNjAuMTAuNDYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDYuMDkuMDAjUHJvamVjdGlsZSBhcHBhcmF0dXMjNjAuMTAuNDYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDYuMTAuMDAjQWlyIHRhYmxlcyM2MC4xMC40Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ni4xMS4wMCNBaXIgYXBwYXJhdHVzIzYwLjEwLjQ2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ2LjEyLjAwI0xpZ2h0IG9yIHBob3RvIGFwcGFyYXR1cyM2MC4xMC40Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ny4wMC4wMCNFbmVyZ3kgYW5kIHBvd2VyIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ3LjAxLjAwI1NvbGFyIGNvbGxlY3RpbmcgZGV2aWNlcyM2MC4xMC40Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ny4wMi4wMCNTb2xhciBraXRzIzYwLjEwLjQ3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ3LjAzLjAwI0VuZXJneSBkZW1vbnN0cmF0aW9uIGtpdHMjNjAuMTAuNDcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDcuMDQuMDAjRW5lcmd5IGNsYXNzIGtpdHMjNjAuMTAuNDcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDcuMDUuMDAjTWF0dGVyIGRlbW9uc3RyYXRpb24ga2l0cyM2MC4xMC40Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ny4wNi4wMCNNYXR0ZXIgY2xhc3Mga2l0cyM2MC4xMC40Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC40Ny4wNy4wMCNNb25vbWV0ZXJzIzYwLjEwLjQ3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ3LjA4LjAwI0dhcyBkaWZmdXNpb24gYXBwYXJhdHVzIzYwLjEwLjQ3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjAwLjAwI1dhdmUgYW5kIHNvdW5kIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjAxLjAwI1dhdmUgZ2VuZXJhdG9ycyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4wMi4wMCNXYXZlIHRhbmtzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjAzLjAwI1dhdmUgc3ByaW5ncyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4wNC4wMCNXYXZlIGRlbW9uc3RyYXRpb24gc2V0cyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4wNS4wMCNUdW5pbmcgZm9ya3MjNjAuMTAuNDguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDguMDYuMDAjRG9wcGxlciBkZW1vbnN0cmF0b3JzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjA3LjAwI1Jlc29uYW5jZSBhcHBhcmF0dXMjNjAuMTAuNDguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDguMDguMDAjU291bmQgbWV0ZXJzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjA5LjAwI1dhdmUgYXBwYXJhdHVzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjEwLjAwI1NwZWN0cm9zY29wZXMjNjAuMTAuNDguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDguMTEuMDAjU3BlY3RydW0gY2hhcnRzIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjEyLjAwI0xpZ2h0IGRlbW9uc3RyYXRpb24ga2l0cyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4xMy4wMCNDb2xvciBjaGFydHMgb3Igc2FtcGxlcyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OC4xNC4wMCNSYWRpb21ldGVyIzYwLjEwLjQ4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ4LjE1LjAwI1JlZmxlY3Rpb24gb3IgcmVmcmFjdGlvbiBhcHBhcmF0dXMjNjAuMTAuNDguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDguMTYuMDAjT3B0aWNzIHNldHMgb3Iga2l0cyM2MC4xMC40OC4wMC4wMAotdW5zcHNjNyM2MC4xMC40OS4wMC4wMCNFbGVjdHJpY2FsIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ5LjAxLjAwI1ZhbiBkZWdyYWZmIGdlbmVyYXRvcnMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDIuMDAjRWxlY3Ryb3N0YXRpYyBhcHBhcmF0dXMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDMuMDAjRWxlY3Ryb3N0YXRpYyBraXRzIzYwLjEwLjQ5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ5LjA0LjAwI0VsZWN0cmljaXR5IGtpdHMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDUuMDAjRWxlY3RyaWNpdHkgZGVtb25zdHJhdGlvbiBib2FyZHMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDYuMDAjQmF0dGVyeSBraXRzIzYwLjEwLjQ5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ5LjA3LjAwI0hhbmQgaGVsZCBnZW5lcmF0b3JzIzYwLjEwLjQ5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjQ5LjA4LjAwI0VsZWN0cm9tYWduZXRpYyBhcHBhcmF0dXMjNjAuMTAuNDkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNDkuMDkuMDAjTWFnbmV0aXNtIGFwcGFyYXR1cyM2MC4xMC40OS4wMC4wMAotdW5zcHNjNyM2MC4xMC40OS4xMC4wMCNFbGVjdHJvbWFnbmV0cyM2MC4xMC40OS4wMC4wMAotdW5zcHNjNyM2MC4xMC40OS4xMS4wMCNFbGVjdHJpYyBiZWxscyM2MC4xMC40OS4wMC4wMAotdW5zcHNjNyM2MC4xMC40OS4xMi4wMCNFbGVjdHJpYyBsZWFkIHdpcmVzIG9yIGNhYmxlcyM2MC4xMC40OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41MC4wMC4wMCNOdWNsZWFyIHBoeXNpY3MgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUwLjAxLjAwI1JhZGlvYWN0aXZpdHkgc2V0cyM2MC4xMC41MC4wMC4wMAotdW5zcHNjNyM2MC4xMC41MC4wMi4wMCNHZWlnZXIgY291bnRlcnMjNjAuMTAuNTAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTAuMDMuMDAjRWxlY3Ryb24gYXBwYXJhdHVzIzYwLjEwLjUwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUwLjA0LjAwI1JhZGlhdGlvbiB3YXJuaW5nIHNpZ25zIzYwLjEwLjUwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUwLjA1LjAwI051Y2xlYXIgcGh5c2ljcyB0cmFuc3BhcmVuY2llcyM2MC4xMC41MC4wMC4wMAotdW5zcHNjNyM2MC4xMC41MC4wNi4wMCNOdWNsZWFyIHBoeXNpY3MgY2hhcnRzIzYwLjEwLjUwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUxLjAwLjAwI1JvY2tldHJ5IGFuZCBmbGlnaHQgbWF0ZXJpYWxzIGFuZCBzdXBwbGllcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC41MS4wMS4wMCNSb2NrZXQgc2V0cyM2MC4xMC41MS4wMC4wMAotdW5zcHNjNyM2MC4xMC41MS4wMi4wMCNMYXVuY2hpbmcgYXBwYXJhdHVzIzYwLjEwLjUxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUxLjAzLjAwI0FsdGl0dWRlIG1lYXN1cmluZyBkZXZpY2VzIzYwLjEwLjUxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUxLjA0LjAwI0FpcnBsYW5lIGtpdHMjNjAuMTAuNTEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTIuMDAuMDAjTGlmZSBza2lsbHMgcmVzb3VyY2VzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUyLjAxLjAwI0J1aWxkaW5nIGxpc3RlbmluZyBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTIuMDIuMDAjU3R1ZHkgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjUyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUyLjAzLjAwI1Rlc3QgcHJlcGFyYXRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTMuMDAuMDAjQ2FyZWVyIGVkdWNhdGlvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wMS4wMCNDYXJlZXIgZWR1Y2F0aW9uIG9yIHBsYW5uaW5nIG9yIGRlY2lzaW9uIG1ha2luZyBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTMuMDIuMDAjQmFzaWMgam9iIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wMy4wMCNKb2Igc2VhcmNoIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wNC4wMCNUaW1lIG1hbmFnZW1lbnQgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjUzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjUzLjA1LjAwI0ludGVydmlldyBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTMuMDYuMDAjUmVzdW1lIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wNy4wMCNXb3JrIGV0aGljcyBvciBhdHRpdHVkZSB0cmFpbmluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wOC4wMCNUZWFtIGJ1aWxkaW5nIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41My4wMC4wMAotdW5zcHNjNyM2MC4xMC41My4wOS4wMCNCdXNpbmVzcyBldGlxdWV0dGUgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTMuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMDAuMDAjQ29uc3VtZXIgZWNvbm9taWNzIGFuZCBtb25leSBtYW5hZ2VtZW50IGFuZCBpbmRlcGVuZGVudCBsaXZpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMDEuMDAjUGVyc29uYWwgZmluYW5jZSBvciBtb25leSBtYW5hZ2VtZW50IGVkdWNhdGlvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4wMi4wMCNTaG9wcGluZyBvciBjb25zdW1lciBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMDMuMDAjSW5kZXBlbmRlbnQgbGl2aW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjA0LjAwI1VuZGVyc3RhbmRpbmcgY29uc3VtZXIgY3JlZGl0IG9yIGxvYW5zIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjA1LjAwI0luc3VyYW5jZSBjb3ZlcmFnZSBvciBpbnN1cmFuY2UgY29tcGFyaXNvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4wNi4wMCNIb21lIGJ1eWluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4wNy4wMCNBcGFydG1lbnQgcmVudGFsIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjA4LjAwI0NhciBidXlpbmcgZWR1Y2F0aW9uYWwgYWlkcyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4wOS4wMCNCcmFuZCBtYXJrZXRpbmcgb3IgYWR2ZXJ0aXNpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMTAuMDAjUmVsYXRpb25zaGlwIGJ1aWxkaW5nIG9yIGZhbWlseSBsaWZlIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4xMS4wMCNEZXZlbG9waW5nIHNlbGYgY29uY2VwdCBhbmQgc2VsZiBlc3RlZW0gaW5zdHVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4xMi4wMCNWaW9sZW5jZSBhdm9pZGFuY2UgZWR1Y2F0aW9uIG9yIHZpb2xlbmNlIHByZXZlbnRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMTMuMDAjQW5nZXIgcmVzb2x1dGlvbiB0cmFpbmluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4xNC4wMCNUZWFjaGluZyBwYXRpZW5jZSBza2lsbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMTUuMDAjVG9sZXJhbmNlIHRyYWluaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjE2LjAwI1BlcnNvbmFsIHNhZmV0eSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4xNy4wMCNQZXJzb25hbCBjb25mbGljdCByZXNvbHV0aW9uIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjE4LjAwI1ByYWN0aWNhbCB0ZWVuIGFkdmljZSBndWlkZXMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMTkuMDAjRGV2ZWxvcGluZyBzb2NpYWwgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjIwLjAwI01hbm5lcnMgb3IgZXRpcXVldHRlIG9yIGNvdXJ0ZXN5IGluc3RydWN0aW9uYWwgYWlkcyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4yMS4wMCNVbmRlcnN0YW5kaW5nIG9yIGRlYWxpbmcgd2l0aCBjdWx0dXJhbCBkaXZlcnNpdHkgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMjIuMDAjSG93IHRvIHJlYWQgYm9keSBsYW5ndWFnZSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4yMy4wMCNEZXZlbG9waW5nIHJlc2lsaWVuY3kgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTQuMjQuMDAjVW5kZXJzdGFuZGluZyBjb21tdW5pdHkgc2VydmljZSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4yNS4wMCNEZXZlbG9waW5nIHJlZnVzYWwgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjI2LjAwI1Jlc3BvbnNpYmlsaXR5IG9yIERkZWNpc2lvbiBtYWtpbmcgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjI3LjAwI1VuZGVyc3RhbmRpbmcgdGVlbnMgbGVnYWwgcmlnaHRzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU0LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU0LjI4LjAwI1JlcGVyY3Vzc2lvbnMgb2YgZHJvcHBpbmcgb3V0IG9mIHNjaG9vbCBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NC4wMC4wMAotdW5zcHNjNyM2MC4xMC41NC4yOS4wMCNSYWNlIHJlbGF0aW9ucyB2aWRlb3MjNjAuMTAuNTQuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTUuMDAuMDAjSG9tZSBhbmQgaW50ZXJpb3IgZGVzaWduIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjU1LjAxLjAwI0Zlbmcgc2h1aSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41NS4wMC4wMAotdW5zcHNjNyM2MC4xMC41NS4wMi4wMCNJbnN0cnVjdGlvbmFsIG1hdGVyaWFscyBmb3IgdXNpbmcgY29sb3Igb3IgcGFpbnQgZm9yIGhvbWUgZGVjb3JhdGlvbiM2MC4xMC41NS4wMC4wMAotdW5zcHNjNyM2MC4xMC41NS4wMy4wMCNJbnN0cnVjdGlvbmFsIG1hdGVyaWFscyBmb3IgaG9tZSBwbGFubmluZyBvciBkZXNpZ24jNjAuMTAuNTUuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTUuMDQuMDAjTGFuZHNjYXBpbmcgZGVzaWduIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU1LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU1LjA1LjAwI0luc3RydWN0aW9uYWwgbWF0ZXJpYWxzIGZvciBob21lIGRlY29yYXRpbmcgb3IgZnVybmlzaGluZyM2MC4xMC41NS4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wMC4wMCNIZWFsdGggZWR1Y2F0aW9uIGFuZCBudXRyaXRpb24gYW5kIGZvb2QgcHJlcGFyYXRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMDEuMDAjRGlldGFyeSBndWlkZWxpbmVzIG9yIGJhbGFuY2VkIGRpZXRzIGVkdWNhdGlvbmFsIHJlc291cmNlcyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wMi4wMCNOdXRyaXRpb25hbCBjdXJyaWN1bHVtIG1lbnUgcGxhbm5pbmcgc2tpbGxzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjAzLjAwI1VuZGVyc3RhbmRpbmcgbnV0cml0aW9uIGxhYmVsaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjA0LjAwI0Zvb2Qgc2hvcHBpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMDUuMDAjSGVhbHRoeSBmb29kIGNob2ljZXMgZGVtb25zdHJhdGlvbiB1bml0cyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wNi4wMCNVbmRlcnN0YW5kaW5nIHRoZSBlZmZlY3RzIG9mIGRpZXRhcnkgZmF0IGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjA3LjAwI1VuZGVyc3RhbmRpbmcgdmVnZXRhcmlhbmlzbSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wOC4wMCNSZWNpcGUgYm9va3Mgb3IgY29vayBib29rcyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4wOS4wMCNFYXRpbmcgZGlzb3JkZXJzIGVkdWNhdGlvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4xMC4wMCNXZWlnaHQgY29udHJvbCBvciBleGVyY2lzZSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4xMS4wMCNLaXRjaGVuIG1lYXN1cmVtZW50cyBvZiBzb2xpZHMgb3IgbGlxdWlkcyBpbnN0cnVjdGlvbmFsIGFpZHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTIuMDAjS2l0Y2hlbiBlcXVpdmFsYW50cyBvciBraXRjaGVuIG1hdGggaW5zdHJ1Y3Rpb25hbCBhaWRzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjEzLjAwI0tpdGNoZW4gdXRlbnNpbHMgaW5zdHJ1Y3Rpb25hbCBhaWRzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjE0LjAwI0tpdGNoZW4gc2FmZXR5IG9yIHNhbml0YXRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTUuMDAjRm9vZCBzYWZldHkgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTYuMDAjRm9vZCBzY2llbmNlIGFjdGl2aXRpZXMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTcuMDAjQ29va2luZyBza2lsbHMgaW5zdHJ1Y3Rpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMTguMDAjVGFibGUgbWFubmVycyBvciBlYXRpbmcgZXRpcXVldHRlIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjE5LjAwI1RhYmxlIHNldHRpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMjAuMDAjRm9vZCBzZXJ2aWNlIHRyYWluaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU2LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU2LjIxLjAwI0RydWcgb3IgdG9iYWNjbyBvciBhbGNvaG9sIGFidXNlIGVkdWNhdGlvbiBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4yMi4wMCNTbW9raW5nIFNpbXVsYXRvcnMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMjMuMDAjVW5kZXJzdGFuZGluZyBhZGRpY3Rpb24gb3IgYWRkaWN0aW9uIGF2b2lkYW5jZSBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4yNC4wMCNUZWVuIGRlcHJlc3Npb24gc3ltcHRvbXMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTYuMjUuMDAjVGVlbiBzdWljaWRlIGF2b2lkYW5jZSB0cmFpbmluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41Ni4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ni4yNi4wMCNDb3Bpbmcgd2l0aCBzdHJlc3MgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTYuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTcuMDAuMDAjTWVtb3J5IGJvb2tzIGFuZCBzdXBwbGllcyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ny4wMS4wMCNNZW1vcnkgYm9va3MjNjAuMTAuNTcuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTcuMDIuMDAjTWVtb3J5IGJvb2sgcG9zdHMgb3IgZXh0ZW5kZXJzIzYwLjEwLjU3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU3LjAzLjAwI01lbW9yeSBib29rIHBhcGVyIzYwLjEwLjU3LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU3LjA0LjAwI0FjaWQgZnJlZSBtZW1vcnkgYm9vayBnbHVlIHN0aWNrcyM2MC4xMC41Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC41Ny4wNS4wMCNBY2lkIGZyZWUgbWVtb3J5IGJvb2sgdGFwZSM2MC4xMC41Ny4wMC4wMAotdW5zcHNjNyM2MC4xMC41OC4wMC4wMCNDbG90aGluZyBhbmQgdGV4dGlsZSBkZXNpZ24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDEuMDAjU2V3aW5nIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OC4wMC4wMAotdW5zcHNjNyM2MC4xMC41OC4wMi4wMCNTZXdpbmcgcHJvamVjdCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDMuMDAjVW5kZXJzdGFuZGluZyBjbG90aGluZyBjb25zdHJ1Y3Rpb24gb3Igd29ya21hbnNoaXAgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDQuMDAjQ2xvdGhpbmcgZGVzaWduIG9yIGZhc2hpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDUuMDAjUGVyc29uYWwgY29sb3IgYW5hbHlzaXMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDYuMDAjRmFzaGlvbiBtZXJjaGFuZGlzaW5nIG9yIHJldGFpbCBmdW5kYW1lbnRhbHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDcuMDAjU2NpZW5jZSBvZiBmYWJyaWNzIG9yIGZpYmVycyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OC4wMC4wMAotdW5zcHNjNyM2MC4xMC41OC4wOC4wMCNDbG90aGluZyBjYXJlIG9yIG1haW50ZW5hbmNlIG9yIGxhdW5kZXJpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMDkuMDAjTWF0ZXJpYWxzIGZvciB0ZWFjaGluZyB0aGUgYXJ0IG9mIGRlc2lnbiBjb2xvciBvbiBmYWJyaWMjNjAuMTAuNTguMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTguMTAuMDAjRmFicmljIGR5ZXMgb3IgcGFpbnRzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU4LjExLjAwI1F1aWx0aW5nIHByb2plY3RzIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU4LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjAwLjAwI0RhdGluZyBhbmQgc2V4IGFuZCB0ZWVuIHByZWduYW5jeSBhbmQgcGFyZW50aW5nIHNraWxscyBhbmQgY2hpbGQgZGV2ZWxvcG1lbnQgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDEuMDAjU2V4IGVkdWNhdGlvbiBvciBzZXh1YWxseSB0cmFuc21pdHRlZCBkaXNlYXNlIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjAyLjAwI1ByZW5hdGFsIG51dHJpdGlvbiByZXNvdXJjZXMgb3IgZmV0YWwgYWJ1c2UgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDMuMDAjUGFyZW50aW5nIHNraWxscyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41OS4wNC4wMCNDaGlsZCBkZXZlbG9wbWVudCBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41OS4wNS4wMCNVbmRlcnN0YW5kaW5nIGRhdGUgcmFwZSBvciBkYXRpbmcgc2tpbGxzIG9yIGhhcmFzc21lbnQgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDYuMDAjQ2hpbGRiaXJ0aCBlZHVjYXRpb24gaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDcuMDAjUHJlZ25hbmN5IGZyb20gY29uY2VwdGlvbiB0aHJvdWdoIGJpcnRoIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjA4LjAwI1VuZGVyc3RhbmRpbmcgdGhlIHJpc2tzIG9mIGJpcnRoIGRlZmVjdHMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMDkuMDAjUHJlZ25hbmN5IHNpbXVsYXRvcnMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMTAuMDAjSW5mYW50IHNpbXVsYXRvcnMgYW5kIGFjY2Vzc29yaWVzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjExLjAwI0luZmFudCBjYXJlIHRyYWluaW5nIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjEyLjAwI1VuZGVyc3RhbmRpbmcgcGh5c2ljYWwgb3IgZW1vdGlvbmFsIGNoaWxkIGFidXNlIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjEzLjAwI0Rpc2NpcGxpbmUgc2tpbGwgZWR1Y2F0aW9uIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIGZvciBwYXJlbnRzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjE0LjAwI0hvbWUgc2FmZXR5IG9yIGNoaWxkcHJvb2ZpbmcgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMTUuMDAjQ2FyZGlvIHB1bG1vbmFyeSByZXN1c2l0YXRpb24gb3IgIGJhc2ljIGxpZmUgc3VwcG9ydCBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41OS4xNi4wMCNVbmRlcnN0YW5kaW5nIGNoaWxkaG9vZCBpbGxuZXNzZXMgaW5zdHJ1Y3Rpb25hbCBtYXRlcmlhbHMjNjAuMTAuNTkuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNTkuMTcuMDAjVW5kZXJzdGFuZGluZyBhdHRlbnRpb24gZGVmaWNpdCBoeXBlcmFjdGl2aXR5IGRpc29yZGVyIGluc3RydWN0aW9uYWwgbWF0ZXJpYWxzIzYwLjEwLjU5LjAwLjAwCi11bnNwc2M3IzYwLjEwLjU5LjE4LjAwI0NoaWxkIGNhcmVnaXZlciBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC41OS4xOS4wMCNCYWJ5c2l0dGluZyBpbnN0cnVjdGlvbmFsIG1hdGVyaWFscyM2MC4xMC41OS4wMC4wMAotdW5zcHNjNyM2MC4xMC42MC4wMC4wMCNDdXJyaWN1bHVtIGd1aWRlcyBhbmQgcHJvamVjdHMgYW5kIGFjdGl2aXRpZXMgYW5kIGxlc3NvbnMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjAuMDEuMDAjTWlkZGxlIHNjaG9vbCBjdXJyaWN1bHVtIHJlc291cmNlIG9yIGlkZWEgYm9va3MjNjAuMTAuNjAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjAuMDIuMDAjSGlnaCBTY2hvb2wgY3VycmljdWx1bSByZXNvdXJjZSBvciBpZGVhIGJvb2tzIzYwLjEwLjYwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYwLjAzLjAwI0hvbWUgZWNvbm9taWNzIGluZGVwZW5kZW50IHN0dWR5IHByb2plY3RzIzYwLjEwLjYwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYwLjA0LjAwI0hvbWUgZWNvbm9taWNzIHByb2plY3RzIG9yIGFjdGl2aXRpZXMgcmVzb3VyY2VzIG9yIGd1aWRlcyM2MC4xMC42MC4wMC4wMAotdW5zcHNjNyM2MC4xMC42MS4wMC4wMCNWb2NhdGlvbmFsIHRlYWNoaW5nIGFpZHMgYW5kIG1hdGVyaWFscyM2MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMC42MS4wMS4wMCNBdXRvbW90aXZlIHRlYWNoaW5nIGFpZHMgb3IgbWF0ZXJpYWxzIzYwLjEwLjYxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYxLjAyLjAwI0NvbnN0cnVjdGlvbiB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42MS4wMC4wMAotdW5zcHNjNyM2MC4xMC42MS4wMy4wMCNEcmFmdGluZyBvciBkZXNpZ24gdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjEuMDQuMDAjRWxlY3Ryb25pY3Mgb3IgZWxlY3RyaWNpdHkgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjEuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjEuMDUuMDAjR3JhcGhpYyBhcnRzIG9yIHBob3RvZ3JhcGh5IHRlYWNoaW5nIGFpZHMgb3IgbWF0ZXJpYWxzIzYwLjEwLjYxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYxLjA2LjAwI0hvcnRpY3VsdHVyZSB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42MS4wMC4wMAotdW5zcHNjNyM2MC4xMC42MS4wNy4wMCNNYW51ZmFjdHVyaW5nIHRlYWNoaW5nIGFpZHMgb3IgbWF0ZXJpYWxzIzYwLjEwLjYxLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYyLjAwLjAwI1RlY2hub2xvZ3kgdGVhY2hpbmcgYWlkcyBhbmQgbWF0ZXJpYWxzIzYwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYyLjAxLjAwI0FncmljdWx0dXJlIHRlYWNoaW5nIGFpZHMgb3IgbWF0ZXJpYWxzIzYwLjEwLjYyLjAwLjAwCi11bnNwc2M3IzYwLjEwLjYyLjAyLjAwI0Jpb3RlY2hub2xvZ3kgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjIuMDMuMDAjQ29tbXVuaWNhdGlvbnMgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjIuMDQuMDAjQ29tcHV0ZXIgc2NpZW5jZSB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42Mi4wMC4wMAotdW5zcHNjNyM2MC4xMC42Mi4wNS4wMCNFbmVyZ3kgb3IgcG93ZXIgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjIuMDYuMDAjRW52aXJvbm1lbnRhbCB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42Mi4wMC4wMAotdW5zcHNjNyM2MC4xMC42Mi4wNy4wMCNNYXRlcmlhbHMgdGVhY2hpbmcgYWlkcyBvciBtYXRlcmlhbHMjNjAuMTAuNjIuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjIuMDguMDAjTWVkaWNhbCB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42Mi4wMC4wMAotdW5zcHNjNyM2MC4xMC42Mi4wOS4wMCNUcmFuc3BvcnRhdGlvbiB0ZWFjaGluZyBhaWRzIG9yIG1hdGVyaWFscyM2MC4xMC42Mi4wMC4wMAotdW5zcHNjNyM2MC4xMC42My4wMC4wMCNGb3JlbnNpYyBzY2llbmNlIHRlYWNoaW5nIGVxdWlwbWVudCBhbmQgc3VwcGxpZXMjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjMuMDEuMDAjRm9yZW5zaWMgc2NpZW5jZSBraXRzIzYwLjEwLjYzLjAwLjAwCi11bnNwc2M3IzYwLjEwLjY0LjAwLjAwI0VsZWN0cm9uaWNzIHRlYWNoaW5nIHN1cHBsaWVzIGFuZCBlcXVpcG1lbnQjNjAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTAuNjQuMDEuMDAjRWxlY3Ryb25pY3Mga2l0cyM2MC4xMC42NC4wMC4wMAotdW5zcHNjNyM2MC4xMC42NC4wMi4wMCNFbGVjdHJvbmljcyB0ZWFjaGluZyBzdXBwbGllcyM2MC4xMC42NC4wMC4wMAotdW5zcHNjNyM2MC4xMC42NC4wMy4wMCNGb3JlbnNpYyBzY2llbmNlIHRlYWNoaW5nIHN1cHBsaWVzIzYwLjEwLjY0LjAwLjAwCi11bnNwc2M3IzYwLjExLjAwLjAwLjAwI0NsYXNzcm9vbSBkZWNvcmF0aXZlcyBhbmQgc3VwcGxpZXMjNjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTAuMDAuMDAjQ2xhc3Nyb29tIENoYXJ0cyBvciBjbGFzc3Jvb20gcG9zdGVycyM2MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMC4wMS4wMCNDaGFydCBwYWNrcyM2MC4xMS4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMC4wMi4wMCNDbGFzc3Jvb20gY2hhcnRzIzYwLjExLjEwLjAwLjAwCi11bnNwc2M3IzYwLjExLjEwLjAzLjAwI0NsYXNzcm9vbSBwb3N0ZXJzIG9yIHNldHMjNjAuMTEuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTAuMDQuMDAjRG8gaXQgeW91cnNlbGYgcG9zdGVycyM2MC4xMS4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMS4wMC4wMCNCdWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjAwLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjAxLjAwI0JpZyBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjAyLjAwI0NhbGVuZGFyIGJ1bGxldGluZyBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjAzLjAwI0Vhcmx5IGNoaWxkaG9vZCBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjA0LjAwI0xhbmd1YWdlIGJ1bGxldGluIGJvYXJkIHNldHMjNjAuMTEuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTEuMDUuMDAjTWF0aCBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjA2LjAwI011bHRpcHVycG9zZSBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjA3LjAwI1NjaWVuY2UgYnVsbGV0aW4gYm9hcmQgc2V0cyM2MC4xMS4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMS4wOC4wMCNTZWFzb25hbCBidWxsZXRpbiBib2FyZCBzZXRzIzYwLjExLjExLjAwLjAwCi11bnNwc2M3IzYwLjExLjExLjA5LjAwI1NvY2lhbCBzdHVkaWVzIGJ1bGxldGluIGJvYXJkIHNldHMjNjAuMTEuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDAuMDAjQnVsbGV0aW4gYm9hcmQgYm9yZGVycyBhbmQgdHJpbW1lcnMjNjAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDEuMDAjQ2xhc3Nyb29tIGJhbm5lcnMjNjAuMTEuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDIuMDAjQm9yZGVyIHBhY2tzIzYwLjExLjEyLjAwLjAwCi11bnNwc2M3IzYwLjExLjEyLjAzLjAwI0NsYXNzcm9vbSBoZWFkZXJzIzYwLjExLjEyLjAwLjAwCi11bnNwc2M3IzYwLjExLjEyLjA0LjAwI0NvcnJpZ3VhdGVkIGJvcmRlcnMgb3IgdHJpbW1lcnMjNjAuMTEuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDUuMDAjRGllIGN1dCBzaGFwZWQgc2NhbGxvcGVkIGJvcmRlcnMgb3IgdHJpbW1lcnMjNjAuMTEuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDYuMDAjU3BhcmtsZSBib3JkZXJzIG9yIHRyaW1tZXJzIzYwLjExLjEyLjAwLjAwCi11bnNwc2M3IzYwLjExLjEyLjA3LjAwI1N0cmFpZ2h0IGJvcmRlcnMgb3IgdHJpbW1lcnMjNjAuMTEuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTIuMDguMDAjQm9yZGVyIG9yIFRyaW1tZXIgc3RvcmFnZSM2MC4xMS4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMy4wMC4wMCNEZWNvcmF0aXZlIGxldHRlcnMgYW5kIG51bWJlcnMjNjAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTMuMDEuMDAjTGV0dGVyZWQgb3IgbnVtYmVyZWQgYmxvY2tzIzYwLjExLjEzLjAwLjAwCi11bnNwc2M3IzYwLjExLjEzLjAyLjAwI0Nhc3VhbCBsZXR0ZXJzIG9yIG51bWJlcnMjNjAuMTEuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTMuMDMuMDAjSXRhbGljIGxldHRlcnMgb3IgbnVtYmVycyM2MC4xMS4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMy4wNC4wMCNTZWxmIGFkaGVzaXZlIGxldHRlcnMgb3IgbnVtYmVycyM2MC4xMS4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMy4wNS4wMCNTcGFya2xlIGxldHRlcnMgb3IgbnVtYmVycyM2MC4xMS4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMS4xMy4wNi4wMCNUcmFjaW5nIGxldHRlcnMgb3IgbnVtYmVycyM2MC4xMS4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wMC4wMCNTcGVjaWFsdHkgZGVjb3JhdGl2ZXMgZm9yIHRoZSBjbGFzc3Jvb20gYW5kIGRlY29yYXRpdmUgYWNjZXNzb3JpZXMjNjAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTQuMDEuMDAjQ2xhc3Nyb29tIGRlY29yYXRpdmUga2l0cyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wMi4wMCNEb29yIGRlY29yYXRpb25zIzYwLjExLjE0LjAwLjAwCi11bnNwc2M3IzYwLjExLjE0LjAzLjAwI01vYmlsZXMjNjAuMTEuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTQuMDQuMDAjVHdvIHNpZGVkIGRlY29yYXRpb25zIzYwLjExLjE0LjAwLjAwCi11bnNwc2M3IzYwLjExLjE0LjA1LjAwI1dpbmRvdyBjbGluZyBkZWNvcmF0aW9ucyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wNy4wMCNEZWNvcmF0aXZlIFN0b3JhZ2UgU3lzdGVtcyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wOC4wMCNEZWNvcmF0aXZlIHRhcGVzIG9yIHR3aXN0cyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMS4xNC4wOS4wMCNEZWNvcmF0aXZlIGJ1dHRvbnMjNjAuMTEuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTEuMTQuMTAuMDAjRGVjb3JhdGl2ZSBzaGFwZXMgb3Igc3RyaW5ncyM2MC4xMS4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4wMC4wMC4wMCNBcnRzIGFuZCBjcmFmdHMgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyBhbmQgc3VwcGxpZXMjNjAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTAuMDAuMDAjQXJ0IzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjAxLjAwI1BhaW50aW5ncyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wMi4wMCNTY3VscHR1cmVzIzYwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjAzLjAwI1N0YXR1YXJ5IzYwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjA0LjAwI1BvcnRyYWl0cyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wNS4wMCNEcmF3aW5ncyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wNi4wMCNQaWN0dXJlcyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wNy4wMCNMaXRob2dyYXBocyM2MC4xMi4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMC4wOC4wMCNQb3N0ZXJzIzYwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjA5LjAwI0RlY29yYXRpdmUgcG90IzYwLjEyLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEwLjEwLjAwI1Njcm9sbHMjNjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTAuMTEuMDAjUGhvdG9ncmFwaHMjNjAuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMDAuMDAjQ2FudmFzZXMgYW5kIGZpbG1zIGFuZCBib2FyZHMgYW5kIGFydGlzdHMgcGFwZXJzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjAxLjAwI1N1bHBoaXRlIGRyYXdpbmcgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMDIuMDAjR3JvdW5kd29vZCBkcmF3aW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjAzLjAwI1RyYWNpbmcgb3IgdmVsbHVtIGRyYXdpbmcgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMDQuMDAjQm9uZCBkcmF3aW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjA1LjAwI0NoYXJjb2FsIG9yIHBhc3RlbCBkcmF3aW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjA2LjAwI0JyaXN0b2wgZHJhd2luZyBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4wNy4wMCNXYXRlcmNvbG9yIHBhcGVyIHNoZWV0cyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4wOC4wMCNXYXRlcmNvbG9yIHBhcGVyIHBhZHMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMDkuMDAjV2F0ZXJjb2xvciBwYXBlciBibG9ja3MjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMTAuMDAjRmluZ2VyIHBhaW50IHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjExLjAwI1N1bHBoaXRlIGNvbnN0cnVjdGlvbiBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4xMi4wMCNHcm91bmR3b29kIGNvbnN0cnVjdGlvbiBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4xMy4wMCNGb2lsIGNvbnN0cnVjdGlvbiBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4xNC4wMCNPcmlnYW1pIGNyYWZ0IHBhcGVycyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4xNS4wMCNQYXBlciBvciBwbGFzdGljIENvbmZldHRpIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjE2LjAwI0NyZXBlIHBhcGVyIGZvciBjcmFmdHMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMTcuMDAjQ3JhZnQgdGlzc3VlIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjE4LjAwI0NvcnJ1Z2F0ZWQgY3JhZnQgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMTkuMDAjUGF0dGVybiBwcmludGVkIGNyYWZ0IHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjIwLjAwI1NlbGYgYWRoZXNpdmUgY3JhZnQgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMjEuMDAjR2xvdyBpbiB0aGUgZGFyayBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4yMy4wMCNIYW5kIG1hZGUgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMjQuMDAjS3JhZnQgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMjUuMDAjQ2FudmFzIHBhbmVscyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4yNi4wMCNQcmVzdHJldGNoZWQgY2FudmFzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjI3LjAwI1ByaW1lZCBjYW52YXMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMjguMDAjVW5wcmltZWQgY2FudmFzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjI5LjAwI01hc29uaXRlIHBhbmVscyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4zMC4wMCNDYW52YXMgbGlrZSBwYXBlciBwYWRzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjMxLjAwI0phcGFuZXNlIHByaW50bWFraW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjMyLjAwI0xpdGhvZ3JhcGh5IG9yIGludGFnbGlvIHByaW50bWFraW5nIHBhcGVyIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjMzLjAwI0Jsb2NrcHJpbnRpbmcgcHJpbnRtYWtpbmcgcGFwZXIjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMzQuMDAjRm9pbCBwYXBlciM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4zNS4wMCNBY2V0YXRlIG9yIHZpbnlsIG9yIHBvbHllc3RlciBmaWxtcyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS4zNi4wMCNDZWxsb3BoYW5lIGZpbG1zIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjM3LjAwI0FjcnlsaWMgc2hlZXRzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjM4LjAwI0lsbHVzdHJhdGlvbiBib2FyZHMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuMzkuMDAjTWF0IGJvYXJkcyM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS40MC4wMCNNb3VudGluZyBib2FyZCM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS40MS4wMCNGb2FtIGNvcmUgbW91bnRpbmcgYm9hcmQjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuNDIuMDAjVGFnYm9hcmQgb3IgcmFpbHJvYWQgYm9hcmQjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuNDMuMDAjRGlzcGxheSBib2FyZCM2MC4xMi4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMS40NC4wMCNTY3JhdGNoIGFydCBwYXBlcnMjNjAuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTEuNDUuMDAjU2NyYXRjaCBhcnQgYm9hcmRzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjExLjQ2LjAwI1NjcmF0Y2ggYXJ0IGFjY2Vzc29yaWVzIzYwLjEyLjExLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjAwLjAwI0NsYXNzcm9vbSBhbmQgZmluZSBhcnQgcGFpbnQgYW5kIG1lZGl1bXMgYW5kIGFwcGxpY2F0b3JzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wMS4wMCNUcmFkaXRpb25hbCBsaXF1aWQgdGVtcGVyYSBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wMi4wMCNDb250ZW1wb3JhcnkgbGlxdWlkIHRlbXBlcmEgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMDMuMDAjUG93ZGVyZWQgdGVtcGVyYSBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wNC4wMCNXYXNoYWJsZSB0ZW1wZXJhIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjA1LjAwI1RlbXBlcmEgY2FrZXMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMDYuMDAjTGlxdWlkIGZhY2Ugb3IgYm9keSBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wNy4wMCNDYWtlIGZhY2Ugb3IgYm9keSBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4wOC4wMCNNYXJrZXIgZmFjZSBvciBib2R5IHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjA5LjAwI1RlbXBvcmFyeSB0YXR0b28gcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMTAuMDAjV2FzaGFibGUgZmluZ2VyIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjExLjAwI1NjaG9vbCBzdHlsZSBhY3J5bGljIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjEyLjAwI0FjcnlsaWMgYWlyYnJ1c2ggcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMTMuMDAjU3ludGhldGljIGhlYXQgdHJlYXRlZCBvaWwgcGFpbnQgb3IgbWVkaXVtcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4xNC4wMCNXYXRlciBzb2x1YmxlIG9pbCBwYWludCBvciBtZWRpdW1zIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjE1LjAwI0xvdyB2aXNjb3NpdHkgcmVtb3ZhYmxlIGdsYXNzIG9yIGNlcmFtaWMgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMTYuMDAjTG93IHZpc2Nvc2l0eSBwZXJtYW5lbnQgZ2xhc3Mgb3IgY2VyYW1pYyBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4xNy4wMCNIaWdoIHZpc2Nvc2l0eSBHZWwgcmVtb3ZhYmxlIGdsYXNzIG9yIGNlcmFtaWMgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMTguMDAjSGlnaCB2aXNjb3NpdHkgR2VsIHBlcm1hbmVudCBnbGFzcyBvciBjZXJhbWljIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjE5LjAwI092ZW4gYmFrZWQgZ2xhc3Mgb3IgY2VyYW1pYyBwYWludCM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4yMC4wMCNNYXJrZXIgZGVsaXZlcnkgc3lzdGVtIGdsYXNzIG9yIGNlcmFtaWMgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMjEuMDAjUGFuIHdhdGVyY29sb3IgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMjIuMDAjVHViZSB3YXRlcmNvbG9yIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjIzLjAwI0xpcXVpZCB3YXRlcmNvbG9yIHBhaW50IzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjI0LjAwI0xpcXVpZCB3YXRlcmNvbG9yIGZyaXNrZXQgcGFpbnQjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMjUuMDAjV2F0ZXJjb2xvciBwYWludGluZyBtZWRpdW1zIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjI2LjAwI1dhdGVyY29sb3IgYnJ1c2hlcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4yNy4wMCNPcmllbnRhbCBicnVzaGVzIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjI4LjAwI1V0aWxpdHkgYnJ1c2hlcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4yOS4wMCNTcGVjaWFsdHkgYnJ1c2hlcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zMC4wMCNFYXNlbCBicnVzaGVzIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjMxLjAwI1BhbGV0dGUga25pdmVzIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEyLjMyLjAwI0JyYXllcnMgZm9yIGhhbmQgcHJpbnRpbmcjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMzMuMDAjU3BvbmdlIHN0YW1wcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zNC4wMCNTY3JhcGVycyBmb3IgcGFpbnQgYXBwbGljYXRpb24jNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMzUuMDAjUGlwZXR0ZXMgZm9yIHBhaW50IG9yIGR5ZSBtaXhpbmcjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuMzYuMDAjQ29tYnMgb3IgdG9vbHMgZm9yIHBhaW50IG9yIGluayBhcHBsaWNhdGlvbiM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zNy4wMCNQYWxldHRlcyBmb3IgcGFpbnQgb3IgaW5rIG1peGluZyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zOC4wMCNQYWludCBwb3RzIGZvciBwYWludCBzdG9yYWdlIG9yIG1peGluZyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi4zOS4wMCNQYWludCBjdXBzIG9yIGJvdHRsZXMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDEuMDAjQnJ1c2ggb3IgdG9vbCBjbGVhbmVycyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi40Mi4wMCNQYWludCBhcHJvbnMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDMuMDAjQXJ0aXN0cyBTbW9ja3MjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDQuMDAjU3RyZXRjaGVyIHN0cmlwcyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi40NS4wMCNDYW52YXMgc3RyZXRjaGVycyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi40Ni4wMCNNZXRhbCBlYXNlbHMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDcuMDAjV29vZCBlYXNlbHMjNjAuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTIuNDguMDAjVGFibGUgdG9wIGVhc2VscyM2MC4xMi4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMi40OS4wMCNQcmVzZW50YXRpb24gZWFzZWxzIzYwLjEyLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEzLjAwLjAwI0FydCBhbmQgY3JhZnQgY3V0dGluZyBwcm9kdWN0cyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMy4wMS4wMCNHdWlsbG90aW5lIHBhcGVyIHRyaW1tZXJzIzYwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEzLjAyLjAwI01hdCBjdXR0ZXIjNjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTMuMDMuMDAjTWF0IGtuaXZlcyM2MC4xMi4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMi4xMy4wNC4wMCNBcnRpc3Qga25pdmVzIzYwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEzLjA1LjAwI1JvdGFyeSBwYXBlciBvciBmYWJyaWMgY3V0dGVyIzYwLjEyLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjEzLjA2LjAwI0NpcmNsZSBvciBvdmFsIHBhcGVyIGN1dHRlcnMjNjAuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMDAuMDAjUGljdHVyZSBGcmFtaW5nIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjE0LjAxLjAwI1ByZSBhc3NlbWJsZWQgd29vZCBwaWN0dXJlIGZyYW1lcyM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wMi4wMCNXb29kIHNlY3Rpb24gcGljdHVyZSBmcmFtZXMjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMDMuMDAjUHJlIGFzc2VtYmxlZCBtZXRhbCBwaWN0dXJlIGZyYW1lcyM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wNC4wMCNNZXRhbCBzZWN0aW9uIHBpY3R1cmUgZnJhbWVzIzYwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE0LjA1LjAwI0FkanVzdGFibGUgcGljdHVyZSBmcmFtZXMjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMDYuMDAjUGxhc3RpYyBwaWN0dXJlIGZyYW1lcyM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wNy4wMCNDbGVhciBib3ggcGljdHVyZSBmcmFtZSM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wOC4wMCNQb2ludCBkcml2ZXJzIG9yIGFjY2Vzc29yaWVzIGZvciBwaWN0dXJlIGZyYW1lcyM2MC4xMi4xNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNC4wOS4wMCNNaXRyZSBib3gjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMTAuMDAjUGljdHVyZSBIYW5naW5nIGRldmljZXMjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTQuMTEuMDAjQWNyeWxpYyBwYW5lbHMgZm9yIHBpY3R1cmUgZnJhbWVzIzYwLjEyLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE0LjEyLjAwI0dsYXNzIHBhbmVscyBmb3IgcGljdHVyZSBmcmFtZXMjNjAuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMDAuMDAjRHJhd2luZyB0b29scyBhbmQgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjAxLjAwI1dhdGVyIGJhc2VkIG1hcmtlcnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMDIuMDAjU29sdmVudCBiYXNlZCBtYXJrZXJzIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjAzLjAwI1dhc2hhYmxlIG1hcmtlcnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMDQuMDAjQ2FsbGlncmFwaHkgbWFya2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4wNS4wMCNGYWJyaWMgbWFya2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4wNi4wMCNNZXRhbGxpYyBtYXJrZXJzIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjA3LjAwI1RlbXBlcmEgb3IgY2hhbGsgd2luZG93IG1hcmtlcnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMDguMDAjUGFpbnQgbWFya2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4wOS4wMCNXYXggYmFzZWQgY3JheW9ucyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xMC4wMCNTb3kgYmFzZWQgY3JheW9ucyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xMS4wMCNTcGVjaWFsdHkgY3JheW9ucyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xMi4wMCNXYXRlcmNvbG9yIGNyYXlvbnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMTMuMDAjRHJ5IHBhc3RlbCM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xNC4wMCNDaGFsayBwYXN0ZWwjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMTUuMDAjT2lsIGJhc2VkIHBhc3RlbCM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xNi4wMCNDb21wcmVzc2VkIGNoYXJjb2FsIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjE3LjAwI1ZpbmUgY2hhcmNvYWwjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMTguMDAjR3JhcGhpdGUgcGVuY2lscyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4xOS4wMCNXYXggYmFzZWQgY29sb3JlZCBkcmF3aW5nIHBlbmNpbHMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMjAuMDAjQ2hhcmNvYWwgcGVuY2lscyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4yMS4wMCNXYXRlcmNvbG9yIHBlbmNpbHMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMjIuMDAjV2F0ZXJiYXNlZCBwZW5zIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjIzLjAwI1Blcm1hbmVudCBwZW5zIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjI0LjAwI0dlbCBwZW5zIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjI1LjAwI1RlY2huaWNhbCBwZW5zIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjI2LjAwI0NhbGxpZ3JhcGh5IHBlbnMjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMjguMDAjV2F0ZXIgYmFzZWQgZHJhd2luZyBpbmsjNjAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTUuMjkuMDAjU29sdmVudCBiYXNlZCBkcmF3aW5nIGluayM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4zMC4wMCNDYWxsaWdyYXBoeSBkcmF3aW5nIGluayM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4zMS4wMCNQaW5rIHBlbmNpbCBlcmFzZXJzIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjMyLjAwI0tuZWFkZWQgZXJhc2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4zMy4wMCNWaW55bCBlcmFzZXJzIzYwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE1LjM0LjAwI1BsYXN0aWMgZXJhc2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNS4zNS4wMCNHdW0gZXJhc2VycyM2MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNi4wMC4wMCNTdHVkaW8gYWlkcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNi4wMS4wMCNXb29kIE1hbm5lcXVpbnMjNjAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTYuMDIuMDAjQ2xlYXIgYWNyeWxpYyBtaXJyb3JzIG9yIHBhbmVscyM2MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNi4wMy4wMCNQbGFzdGljIFJ1YmJpbmcgcGxhdGVzIzYwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE2LjA0LjAwI1N0dWRpbyBhaWQgYWNjZXNzb3JpZXMjNjAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTYuMDUuMDAjQW5hdG9taWNhbCBtb2RlbHMjNjAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDAuMDAjUHJpbnRtYWtpbmcgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjAxLjAwI1J1YmJlciBzdGFtcGluZyBzdGFtcHMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDIuMDAjUnViYmVyIHN0YW1waW5nIHN0YW1wIHBhZHMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDMuMDAjUnViYmVyIHN0YW1waW5nIGFjY2Vzc29yaWVzIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjA0LjAwI0xpbm9sZXVtIGZvciBibG9jayBwcmludGluZyM2MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNy4wNS4wMCNXb29kIGJsb2NrcyBmb3IgcHJpbnRpbmcjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDYuMDAjU3ludGhldGljIGJsb2NrcyBmb3IgcHJpbnRpbmcjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDcuMDAjQmxvY2sgcHJpbnRpbmcgYWNjZXNzb3JpZXMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMDguMDAjSW50YWdsaW8gb3IgbGl0aG9ncmFwaHkgcGxhdGVzIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjA5LjAwI0ludGFnbGlvIG9yIGxpdGhvZ3JhcGh5IGJsYW5rZXRzIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjEwLjAwI0ludGFnbGlvIG9yIGxpdGhvZ3JhcGh5IHdpcGVzIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjExLjAwI0ludGFnbGlvIG9yIGxpdGhvZ3JhcGh5IGhvdCBwbGF0ZXMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMTIuMDAjSW50YWdsaW8gb3IgbGl0aG9ncmFwaHkgcHJpbnRpbmcgcHJlc3NlcyM2MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMi4xNy4xMy4wMCNQcmludGluZyBCYXJlbnMgYW5kIEJyYXllcnMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMTQuMDAjSW50YWdsaW8gRXRjaGluZyBvciBlbmdyYXZpbmcgdG9vbHMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTcuMTUuMDAjU2lsa3NjcmVlbiBzY3JlZW5zIG9yIHByaW50aW5nIHN0YXRpb25zIzYwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE3LjE2LjAwI1NpbGtzY3JlZW4gYWNjZXNzb3JpZXMjNjAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMDAuMDAjUHJpbnRpbmcgYW5kIGRyYXdpbmcgaW5rcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wMS4wMCNXYXRlciBiYXNlZCBwb3N0ZXIgaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wMi4wMCNXYXRlciBiYXNlZCBhY3J5bGljIGlua3MjNjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMDMuMDAjT2lsIGJhc2VkIHNpbGtzY3JlZW4gaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wNC4wMCNXYXRlciBiYXNlZCBUZXh0aWxlIGlua3MjNjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMDUuMDAjT2lsIGJhc2VkIHRleHRpbGUgaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wNi4wMCNQcmludG1ha2luZyBzdWJsaW1hdGlvbiBpbmtzIzYwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE4LjA3LjAwI09pbCBiYXNlZCBpbnRhZ2xpbyBvciBsaXRob2dyYXBoeSBpbmtzIzYwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE4LjA4LjAwI09pbCBiYXNlZCBtb25vcHJpbnQgaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4wOS4wMCNXYXRlciBiYXNlZCBtb25vcHJpbnQgaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOC4xMC4wMCNXYXRlciBiYXNlZCBkcmF3aW5nIGlua3MjNjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMTEuMDAjU29sdmVudCBiYXNlZCBkcmF3aW5nIGlua3MjNjAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTguMTIuMDAjQ2FsbGlncmFwaHkgZHJhd2luZyBpbmtzIzYwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE4LjEzLjAwI1NpbGtzY3JlZW4gaW5rcyM2MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOS4wMC4wMCNBcnQgZmFicmljIGFuZCBmYWJyaWMgZGVjb3JhdGlvbiBtYXRlcmlhbHMgYW5kIHN1cHBsaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjE5LjAxLjAwI011c2xpbiM2MC4xMi4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOS4wMi4wMCNGZWx0IzYwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE5LjAzLjAwI0NyYWZ0IGZ1ciM2MC4xMi4xOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4xOS4wNC4wMCNDb3R0b24gYmxlbmRzIzYwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE5LjA1LjAwI0NhbnZhcyBpbXByaW50YWJsZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMDYuMDAjUHJlIHNlbnNpdGl6ZWQgaW1wcmludGFibGVzIzYwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjE5LjA3LjAwI0NvdHRvbiBpbXByaW50YWJsZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMDguMDAjQmxlbmRlZCBpbXByaW50YWJsZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMDkuMDAjQmF0aWsgd2F4ZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMTAuMDAjQmF0aWsgYWNjZXNzb3JpZXMjNjAuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMTkuMTEuMDAjQmF0aWsgZmFicmljIzYwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjIwLjAwLjAwI1Nld2luZyBhbmQgc3RpdGNoZXJ5IGFuZCB3ZWF2aW5nIGVxdWlwbWVudCBhbmQgYWNjZXNzb3JpZXMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjAuMDEuMDAjV2VhdmluZyBvciB0YXBlc3RyeSBuZWVkbGVzIzYwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIwLjAyLjAwI1dlYXZpbmcgYWNjZXNzb3JpZXMjNjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjAuMDMuMDAjSGFuZCBzZXdpbmcgbmVlZGxlcyM2MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMC4wNC4wMCNTdHJpbmcgYXJ0IGtpdHMjNjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjAuMDUuMDAjSGFuZCBsb29tcyM2MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMC4wNi4wMCNUYWJsZSBsb29tcyM2MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMC4wNy4wMCNGbG9vciBsb29tcyM2MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMC4wOC4wMCNSZXhsYWNlIzYwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIwLjA5LjAwI0xhY2luZyBvciBzdHJpbmdpbmcgYWNjZXNzb3JpZXMjNjAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjEuMDAuMDAjQ2FuZGxlbWFraW5nIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIxLjAxLjAwI0NhbmRsZW1ha2luZyB3aWNrcyM2MC4xMi4yMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yMS4wMi4wMCNDYW5kbGVtYWtpbmcgZm9ybXMjNjAuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjEuMDMuMDAjQ2FuZGxlbWFraW5nIGFjY2Vzc29yaWVzIzYwLjEyLjIxLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIyLjAwLjAwI1dvb2QgY3JhZnRzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIyLjAxLjAwI1dvb2QgY3JhZnQgbWF0ZXJpYWxzIzYwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIyLjAyLjAwI0ZpbmlzaGluZyBtYXRlcmlhbHMjNjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjIuMDMuMDAjV29vZCBidXJuaW5nIHRvb2xzIzYwLjEyLjIyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIyLjA0LjAwI0NhcnZpbmcgdG9vbHMjNjAuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjMuMDAuMDAjQmFza2V0cnkgbWFraW5nIHN1cHBsaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjIzLjAxLjAwI0Jhc2tldHJ5IHJlZWQjNjAuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjMuMDIuMDAjQmFza2V0cnkgcHJvamVjdCBraXRzIzYwLjEyLjIzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjI0LjAwLjAwI1N0YWluZWQgZ2xhc3MgbWFraW5nIHN1cHBsaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjI0LjAxLjAwI1N0YWluZWQgR2xhc3MgZnJhZ21lbnRzIzYwLjEyLjI0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI0LjAyLjAwI1N0YWluZWQgZ2xhc3MgdG9vbHMgb3IgYWNjZXNzb3JpZXMjNjAuMTIuMjQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDAuMDAjUGFwZXIgY3JhZnRzIGFuZCBoYW5kIG1hZGUgcGFwZXJtYWtpbmcjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDEuMDAjUGFwZXIgc2hhcGluZyB0b29scyM2MC4xMi4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNS4wMi4wMCNQYXBlciBwaWN0dXJlIGZyYW1lcyM2MC4xMi4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNS4wMy4wMCNQYXBlciBwbGF0ZXMgb3IgdHJheXMjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDQuMDAjUGFwZXIgZmlsdGVycyM2MC4xMi4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNS4wNS4wMCNDb3JydWdhdGVkIGNhcmRib2FyZCBzaGFwZXMjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDYuMDAjUGFwZXIgRG9pbGllcyM2MC4xMi4yNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNS4wNy4wMCNEZWNrbGVzIG9yIG1vbGRzIGZvciBoYW5kIG1hZGUgcGFwZXIjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDguMDAjQ291Y2ggc2hlZXRzIG9yIGZlbHRzIGZvciBoYW5kIG1hZGUgcGFwZXIjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjUuMDkuMDAjUHVscCBvciByYXcgbWF0ZXJpYWxzIGZvciBoYW5kIG1hZGUgcGFwZXIjNjAuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjYuMDAuMDAjTW9zYWljcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNi4wMS4wMCNNb3NhaWMgdGlsZXMjNjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjYuMDIuMDAjTW9zYWljIG1vbGRzIzYwLjEyLjI2LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI2LjAzLjAwI01vc2FpYyB0b29scyM2MC4xMi4yNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4yNi4wNC4wMCNNb3NhaWMgYWNjZXNzb3JpZXMjNjAuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjcuMDAuMDAjRW5hbWVsaW5nIHBhaW50cyBhbmQgYWNjZXNzb3JpZXMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjcuMDEuMDAjRW5hbWVsaW5nIHBhaW50cyBvciBtZWRpdW1zIzYwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI3LjAyLjAwI0NvcHBlciBzaGFwZXMjNjAuMTIuMjcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjcuMDMuMDAjRW5hbWVsaW5nIGFjY2Vzc29yaWVzIzYwLjEyLjI3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI3LjA0LjAwI0VuYW1lbGluZyBLaWxucyM2MC4xMi4yNy4wMC4wMAotdW5zcHNjNyM2MC4xMi4yOC4wMC4wMCNNYXNrbWFraW5nIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjI4LjAxLjAwI01hc2ttYWtpbmcgZm9ybXMjNjAuMTIuMjguMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjkuMDAuMDAjQmVhZHMgb3IgYmVhZGluZyBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4yOS4wMS4wMCNTZWVkIGJlYWRzIzYwLjEyLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI5LjAyLjAwI1BvbnkgYmVhZHMjNjAuMTIuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjkuMDMuMDAjV29vZCBiZWFkcyM2MC4xMi4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yOS4wNC4wMCNTdHJhdyBiZWFkcyM2MC4xMi4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4yOS4wNS4wMCNDZXJhbWljIGJlYWRzIzYwLjEyLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI5LjA2LjAwI0dsYXNzIGJlYWRzIzYwLjEyLjI5LjAwLjAwCi11bnNwc2M3IzYwLjEyLjI5LjA3LjAwI0Fzc29ydGVkIG9yIGRlY29yYXRpdmUgYmVhZHMjNjAuMTIuMjkuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMjkuMDguMDAjQmVhZCBhY2Nlc3NvcmllcyM2MC4xMi4yOS4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMC4wMC4wMCNGb2FtIGNyYWZ0cyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMC4wMS4wMCNTdHlyb2ZvYW0gc2hhcGVzIzYwLjEyLjMwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjMwLjAyLjAwI1Rvb2xzIGZvciBmb2FtIGNyYWZ0cyM2MC4xMi4zMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMS4wMC4wMCNDaGVuaWxsZSBzdGVtIGNyYWZ0cyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMS4wMS4wMCNKdW1ibyBjaGVuaWxsZSBzdGVtcyM2MC4xMi4zMS4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMS4wMi4wMCNDb3R0b24gY2hlbmlsbGUgc3RlbXMjNjAuMTIuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzEuMDMuMDAjQnVtcHMgY2hlbmlsbGUgc3RlbXMjNjAuMTIuMzEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzIuMDAuMDAjUmliYm9uIG1ha2luZyBtYXRlcmlhbHMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzIuMDEuMDAjUGFwZXIgcmliYm9ucyM2MC4xMi4zMi4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMi4wMi4wMCNTaWxrIHJpYmJvbnMjNjAuMTIuMzIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzIuMDMuMDAjU3ludGhldGljIHJpYmJvbnMjNjAuMTIuMzIuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzIuMDQuMDAjRGVjb3JhdGl2ZSByaWJib25zIzYwLjEyLjMyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjMzLjAwLjAwI0NyYWZ0IFBvbXMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzMuMDEuMDAjQWNyeWxpYyBjcmFmdCBwb21zIzYwLjEyLjMzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjMzLjAyLjAwI0dsaXR0ZXIgY3JhZnQgcG9tcyM2MC4xMi4zMy4wMC4wMAotdW5zcHNjNyM2MC4xMi4zMy4wMy4wMCNDcmFmdCBwb20gYmVhZHojNjAuMTIuMzMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzQuMDAuMDAjV2lnZ2xlIGV5ZXMgbWF0ZXJpYWxzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjM0LjAxLjAwI05vbiBzZWxmIGFkaGVzaXZlIHdpZ2dsZSBleWVzIzYwLjEyLjM0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM0LjAyLjAwI1NlbGYgYWRoZXNpdmUgd2lnZ2xlIGV5ZXMjNjAuMTIuMzQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzQuMDMuMDAjRGVjb3JhdGl2ZSB3aWdnbGUgZXllcyM2MC4xMi4zNC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNS4wMC4wMCNMZWF0aGVyIGNyYWZ0IG1hdGVyaWFscyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNS4wMS4wMCNMZWF0aGVyIG9yIGxlYXRoZXIgbGFjaW5nIG1hdGVyaWFscyM2MC4xMi4zNS4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNS4wMi4wMCNMZWF0aGVyIGFjY2Vzc29yaWVzIzYwLjEyLjM1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM2LjAwLjAwI0dsaXR0ZXIjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzYuMDEuMDAjR2xpdHRlciBnbHVlIzYwLjEyLjM2LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM2LjAyLjAwI0dsaXR0ZXIgZG90cyM2MC4xMi4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNi4wMy4wMCNHbGl0dGVyIGpld2VscyM2MC4xMi4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNi4wNC4wMCNQbGFzdGljIGdsaXR0ZXIjNjAuMTIuMzYuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzYuMDUuMDAjSXJyaWRlc2NlbnQgZ2xpdHRlciM2MC4xMi4zNi4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNi4wNi4wMCNNZXRhbGxpYyBnbGl0dGVyIzYwLjEyLjM2LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM3LjAwLjAwI01hY3JhbWUgY3JhZnQgbWF0ZXJpYWxzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNy4wMS4wMCNNYWNyYW1lIGNvcmQjNjAuMTIuMzcuMDAuMDAKLXVuc3BzYzcjNjAuMTIuMzcuMDIuMDAjTWFjcmFtZSBiZWFkcyM2MC4xMi4zNy4wMC4wMAotdW5zcHNjNyM2MC4xMi4zNy4wMy4wMCNNYWNyYW1lIGFjY2Vzc29yaWVzIzYwLjEyLjM3LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM4LjAwLjAwI01hcmJsaW5nIHN1cHBsaWVzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi4zOC4wMS4wMCNNYXJibGluZyBpbmtzIzYwLjEyLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM4LjAyLjAwI01hcmJsaW5nIGFjY2Vzc29yaWVzIzYwLjEyLjM4LjAwLjAwCi11bnNwc2M3IzYwLjEyLjM5LjAwLjAwI1NlcXVpbnMgYW5kIHRyaW1zIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjM5LjAxLjAwI0RlY29yYXRpdmUgc2VxdWlucyBvciB0cmltcyM2MC4xMi4zOS4wMC4wMAotdW5zcHNjNyM2MC4xMi40MC4wMC4wMCNDb3JrIGNyYWZ0IHN1cHBsaWVzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi40MC4wMS4wMCNDb3JrIHNoZWV0cyM2MC4xMi40MC4wMC4wMAotdW5zcHNjNyM2MC4xMi40MC4wMi4wMCNDb3JrIHN0b3BwZXJzIzYwLjEyLjQwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQxLjAwLjAwI011bHRpY3VsdHVyYWwgcHJvamVjdCBtYXRlcmlhbHMgYW5kIGFjY2Vzc29yaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQxLjAxLjAwI011bHRpY3VsdHVyYWwgcGFpbnRpbmcgcHJvZHVjdHMjNjAuMTIuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDEuMDIuMDAjTXVsdGljdWx0dXJhbCBjcmFmdHMgcHJvZHVjdHMjNjAuMTIuNDEuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDIuMDAuMDAjQ3Jvc3MgY3VycmljdWxhciBwcm9qZWN0cyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi40Mi4wMS4wMCNNeWxhciBzY3VscHR1cmVzIzYwLjEyLjQyLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjAwLjAwI0NsYXkgYW5kIG1vZGVsaW5nIGNvbXBvdW5kcyBhbmQgY2VyYW1pY3MgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyM2MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4wMS4wMCNNb2lzdCBraWxuIGZpcmVkIGNsYXkjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMDIuMDAjRHJ5IGtpbG4gZmlyZWQgY2xheSM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4wMy4wMCNLaWxuIGZ1cm5pdHVyZSM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4wNC4wMCNLaWxucyBmb3IgZmlyaW5nIGNlcmFtaWNzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjA1LjAwI0tpbG4gYWNjZXNzb3JpZXMgZm9yIGZpcmluZyBjZXJhbWljcyM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4wNi4wMCNQb3R0ZXJzIHdoZWVscyBmb3IgaGFuZCBtYWRlIGNlcmFtaWNzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjA3LjAwI0V4dHJ1ZGVycyBmb3IgbW9kZWxpbmcgbWF0ZXJpYWxzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjA4LjAwI0NvbmVzIGZvciBmaXJpbmcga2lsbnMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMDkuMDAjUG90dGVyeSBCYXR0cyM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4xMC4wMCNEZWNvcmF0aW5nIHdoZWVscyBmb3IgcG90dGVyeSM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4xMS4wMCNDbGF5IG9yIG1vZGVsaW5nIHRvb2xzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjEyLjAwI0ZpcmVkIGNlcmFtaWMgdGlsZXMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMTMuMDAjQ2xheSBzdG9yYWdlIGNvbnRhaW5lcnMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMTQuMDAjUGxhc2ljaXplZCBub24gaGFyZGVuaW5nIG1vZGVsaW5nIGNvbXBvdW5kcyM2MC4xMi40My4wMC4wMAotdW5zcHNjNyM2MC4xMi40My4xNS4wMCNPaWxiYXNlZCBub25oYXJkZW5pbmcgbW9kZWxpbmcgY29tcG91bmRzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjE2LjAwI0FpciBkcnkgY2xheSBvciBtb2RlbGluZyBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMTcuMDAjTW9kZWxpbmcgZG91Z2gjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMTguMDAjUGFwaWVyIE1hY2hlIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQzLjE5LjAwI1NwZWNpYWx0eSBtb2RlbGluZyBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMjAuMDAjUGxhc3RlciBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMjEuMDAjT3ZlbiBoYXJkZW5pbmcgY2xheSBvciBtb2RlbGluZyBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMjIuMDAjUGxhc3RpYyBtb2RlbGluZyBjb21wb3VuZHMjNjAuMTIuNDMuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDMuMjMuMDAjQ2FzdHMgb3IgbW9sZHMgZm9yIHNoYXBpbmcgbW9kZWxpbmcgY29tcG91bmRzIzYwLjEyLjQzLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ0LjAwLjAwI0FydCBtZXRhbHMjNjAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDQuMDEuMDAjQ29wcGVyIHRvb2xpbmcgZm9pbCM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wMi4wMCNBbHVtaW51bSB0b29saW5nIGZvaWwjNjAuMTIuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDQuMDMuMDAjQWx1bWludW0gd2lyZSM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wNC4wMCNCcmFzcyB0b29saW5nIGZvaWwjNjAuMTIuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDQuMDUuMDAjQnJhc3Mgd2lyZSM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wNi4wMCNTaWx2ZXIgc2hlZXRzIG9yIHBsYXRlcyM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wNy4wMCNTaWx2ZXIgd2lyZSM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wOC4wMCNQZXd0ZXIgcGVsbGV0cyBvciBzaG90cyM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4wOS4wMCNQZXd0ZXIgaW5nb3RzIzYwLjEyLjQ0LjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ0LjEwLjAwI051IGdvbGQgc2hlZXRzIHBsYXRlcyM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NC4xMS4wMCNOdSBnb2xkIHdpcmUjNjAuMTIuNDQuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDQuMTIuMDAjR2FsdmFuaXplZCBzdG92ZXBpcGUgd2lyZSM2MC4xMi40NC4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4wMC4wMCNTY3VscHR1cmUgc3VwcGxpZXMgYW5kIGFjY2Vzc29yaWVzIzYwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ1LjAxLjAwI1BsYXN0ZXIgd3JhcCM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4wMi4wMCNDYXN0aW5nIHJlc2lucyM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4wMy4wMCNTY3VscHR1cmUgYWNjZXNzb3JpZXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMDQuMDAjUHV6emxlIHJhY2tzIzYwLjEyLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ1LjA1LjAwI0J1YmJsZXMgb3IgYWNjZXNzb3JpZXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMDYuMDAjUGxhc3RpYyBzYW5kIG9yIHdhdGVyIHRvb2xzIG9yIG1vbGRzIG9yIHRveXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMDcuMDAjUGxheSBzYW5kIzYwLjEyLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ1LjA4LjAwI1NhbmQgb3Igd2F0ZXIgdGFibGVzIG9yIGFjdGl2aXR5IGNlbnRlcnMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMDkuMDAjVmVoaWNsZSBzZXRzIzYwLjEyLjQ1LjAwLjAwCi11bnNwc2M3IzYwLjEyLjQ1LjEwLjAwI1dhdGVyd2F5IHNldHMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMTEuMDAjUGxheSB0b29scyBvciBwbGF5IHRvb2wga2l0cyM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4xMi4wMCNTY29vdGVyIGJvYXJkcyM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4xMy4wMCNCZWFuYmFncyM2MC4xMi40NS4wMC4wMAotdW5zcHNjNyM2MC4xMi40NS4xNC4wMCNUYWN0aWxlIHRveXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTIuNDUuMTUuMDAjQ29nbml0aXZlIHRveXMjNjAuMTIuNDUuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMDAuMDAuMDAjTXVzaWNhbCBJbnN0cnVtZW50cyBhbmQgcGFydHMgYW5kIGFjY2Vzc29yaWVzIzYwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEwLjAwLjAwI0tleWJvYXJkIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEwLjAxLjAwI1BpYW5vcyM2MC4xMy4xMC4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMC4wMi4wMCNBY2NvcmRpb25zIzYwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEwLjAzLjAwI011c2ljYWwgb3JnYW5zIzYwLjEzLjEwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjExLjAwLjAwI0JyYXNzIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjExLjAxLjAwI1RydW1wZXRzIzYwLjEzLjExLjAwLjAwCi11bnNwc2M3IzYwLjEzLjExLjAyLjAwI1Ryb21ib25lcyM2MC4xMy4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMS4wMy4wMCNTb3VzYXBob25lcyM2MC4xMy4xMS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMS4wNC4wMCNTYXhvcGhvbmVzIzYwLjEzLjExLjAwLjAwCi11bnNwc2M3IzYwLjEzLjExLjA1LjAwI1doaXN0bGUjNjAuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTIuMDAuMDAjV29vZHdpbmQgaW5zdHJ1bWVudHMjNjAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTIuMDEuMDAjQ2xhcmluZXRzIzYwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEyLjAyLjAwI09ib2VzIzYwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEyLjAzLjAwI011c2ljYWwgZmx1dGVzIzYwLjEzLjEyLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEyLjA0LjAwI1BpY2NvbG9lcyM2MC4xMy4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMi4wNS4wMCNNdXNpY2FsIGNvcm5ldHMjNjAuMTMuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTIuMDYuMDAjQmFncGlwZXMjNjAuMTMuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTIuMDcuMDAjSGFybW9uaWNhcyM2MC4xMy4xMi4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMi4wOC4wMCNLYXpvb3MjNjAuMTMuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTMuMDAuMDAjU3RyaW5nIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEzLjAxLjAwI0hhcnBzaWNob3JkcyM2MC4xMy4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMy4wMi4wMCNDbGF2aWNob3JkcyM2MC4xMy4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMy4xMy4wMy4wMCNHdWl0YXJzIzYwLjEzLjEzLjAwLjAwCi11bnNwc2M3IzYwLjEzLjEzLjA0LjAwI1Zpb2xpbnMjNjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTMuMDUuMDAjSGFycHMjNjAuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTMuMDYuMDAjQmFuam9lcyM2MC4xMy4xMy4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNC4wMC4wMCNQZXJjdXNzaW9uIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjE0LjAxLjAwI0N5bWJhbHMjNjAuMTMuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTQuMDIuMDAjQmVsbHMjNjAuMTMuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTQuMDMuMDAjVGFtYm91cmluZXMjNjAuMTMuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTQuMDQuMDAjQ2FzdGFuZXRzIzYwLjEzLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE0LjA1LjAwI0RydW1zIzYwLjEzLjE0LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE0LjA2LjAwI1h5bG9waG9uZXMjNjAuMTMuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTUuMDAuMDAjTXVzaWNhbCBpbnN0cnVtZW50IHBhcnRzIGFuZCBhY2Nlc3NvcmllcyM2MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNS4wMS4wMCNNZXRyb25vbWVzIzYwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE1LjAyLjAwI1JlZWRzIzYwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE1LjAzLjAwI0luc3RydW1lbnQgc3RyaW5ncyBvciBwaWNrcyM2MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNS4wNC4wMCNUdW5pbmcgcGlucyM2MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNS4wNS4wMCNNdXNpY2FsIGluc3RydW1lbnQgc3RhbmRzIG9yIHNoZWV0IGhvbGRlcnMjNjAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTUuMDYuMDAjQWNjZXNzb3JpZXMgZm9yIHN0cmluZ2VkIGluc3RydW1lbnRzIzYwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE1LjA3LjAwI1BlcmN1c3Npb24gaW5zdHJ1bWVudCBhY2Nlc3NvcnkjNjAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTUuMDguMDAjTXVzaWMgYm94ZXMgb3IgbWVjaGFuaXNtcyM2MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNi4wMC4wMCNNdXNpY2FsIGluc3RydW1lbnQgc2V0cyM2MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNi4wMS4wMCNSaHl0aG0gYmFuZCBzZXRzIzYwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE3LjAwLjAwI0FsdGVybmF0aXZlIHNvdW5kcyBtdXNpY2FsIGluc3RydW1lbnRzIzYwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzYwLjEzLjE3LjAxLjAwI0Jvb213aGFja2VycyM2MC4xMy4xNy4wMC4wMAotdW5zcHNjNyM2MC4xMy4xNy4wMi4wMCNEaXNjbyB0YXBzIzYwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzYwLjEzLjE4LjAwLjAwI011c2ljIGFuZCBkYW5jZSBhY2Nlc3NvcmllcyM2MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM2MC4xMy4xOC4wMS4wMCNEYW5jaW5nIHNjYXJ2ZXMjNjAuMTMuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTguMDIuMDAjUmh5dGhtIHN0aWNrcyBvciBsdW1taSBzdGlja3MjNjAuMTMuMTguMDAuMDAKLXVuc3BzYzcjNjAuMTMuMTguMDMuMDAjUmh5dGhtIHdhbmRzIG9yIGhvb3BzIzYwLjEzLjE4LjAwLjAwCi11bnNwc2M3IzYwLjE0LjAwLjAwLjAwI1RveXMgYW5kIGdhbWVzIzYwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjAwLjAwI1RveXMjNjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTAuMDEuMDAjVG95IGJhbGxvb25zIG9yIGJhbGxzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjAyLjAwI0RvbGxzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjAzLjAwI0RvbGwgaG91c2VzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjA0LjAwI1N0dWZmZWQgYW5pbWFscyBvciBwdXBwZXRzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjA1LjAwI1BsYXlob3VzZXMjNjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTAuMDYuMDAjQnVpbGRpbmcgYmxvY2tzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjA3LjAwI1JpZGluZyB0b3lzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjA4LjAwI1B1bGwgdG95cyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4wOS4wMCNDaGlsZHJlbnMgc2NpZW5jZSBraXRzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjEwLjAwI1RveSB2ZWhpY2xlcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4xMS4wMCNUb3kgdHJhaW5zIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjEyLjAwI0luZmxhdGFibGUgdG95cyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4xMy4wMCNEb2xsIHBhcnRzIG9yIGFjY2Vzc29yaWVzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjE0LjAwI1lvIHlvcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4xNS4wMCNLaXRlcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4xNi4wMCNQb2dzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjE3LjAwI0thbGVpZG9zY29wZXMjNjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTAuMTguMDAjUG9tIHBvbXMjNjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTAuMTkuMDAjUGluYXRhcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4yMC4wMCNCb29tZXJhbmdzIzYwLjE0LjEwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEwLjIxLjAwI0ZseWluZyBkaXNjcyM2MC4xNC4xMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMC4yMi4wMCNUb3kgcGFpbHMjNjAuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDAuMDAjR2FtZXMjNjAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDEuMDAjRWR1Y2F0aW9uYWwgZ2FtZXMjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDIuMDAjQm9hcmQgZ2FtZXMjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDMuMDAjUGxheWluZyBjYXJkcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4wNC4wMCNWaWRlbyBnYW1lcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4wNS4wMCNQdXp6bGVzIzYwLjE0LjExLjAwLjAwCi11bnNwc2M3IzYwLjE0LjExLjA2LjAwI0RpY2UjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDcuMDAjQmluZ28jNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMDguMDAjQ2xhc3NpYyBnYW1lcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4wOS4wMCNDb2xsYWJvcmF0aXZlIGdhbWVzIzYwLjE0LjExLjAwLjAwCi11bnNwc2M3IzYwLjE0LjExLjEwLjAwI1N0cmF0ZWd5IGdhbWVzIzYwLjE0LjExLjAwLjAwCi11bnNwc2M3IzYwLjE0LjExLjExLjAwI0dhbWUgYWNjZXNzb3JpZXMjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTEuMTIuMDAjR2FtZSBib29rcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4xMy4wMCNMb3R0byBnYW1lcyM2MC4xNC4xMS4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMS4xNC4wMCNNZW1vcnkgZ2FtZXMjNjAuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTIuMDAuMDAjQWN0aXZlIFBsYXkgZXF1aXBtZW50IGFuZCBhY2Nlc3NvcmllcyM2MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMi4wMS4wMCNCYWxhbmNlIG9yIGdyb3NzIG1vdG9yIGVxdWlwbWVudCM2MC4xNC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMi4wMi4wMCNCYWxsIHBvb2xzIG9yIGFjY2Vzc29yaWVzIzYwLjE0LjEyLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEyLjAzLjAwI1BsYXkgaG91c2VzIG9yIGh1dHMjNjAuMTQuMTIuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTIuMDQuMDAjVHJpa2VzIG9yIHdhZ29ucyM2MC4xNC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMi4wNS4wMCNTb2Z0IHBsYXkgY2VudGVycyM2MC4xNC4xMi4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMy4wMC4wMCNDaGlsZHJlbnMgYmxvY2tzIGFuZCBidWlsZGluZyBzeXN0ZW1zIzYwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEzLjAyLjAwI0NvbnN0cnVjdGlvbiBzZXRzIzYwLjE0LjEzLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEzLjAzLjAwI1BsYXltYXRzIzYwLjE0LjEzLjAwLjAwCi11bnNwc2M3IzYwLjE0LjEzLjA0LjAwI1JhaWxwbGF5IHN5c3RlbXMgb3IgYWNjZXNzb3JpZXMjNjAuMTQuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTMuMDUuMDAjVW5pdCBibG9ja3MjNjAuMTQuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTMuMDYuMDAjUGxheSB2ZWhpY2xlcyM2MC4xNC4xMy4wMC4wMAotdW5zcHNjNyM2MC4xNC4xMy4wNy4wMCNQbGF5IGFuaW1hbHMjNjAuMTQuMTMuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTQuMDAuMDAjRHJhbWF0aWMgcGxheSBlcXVpcG1lbnQgYW5kIGFjY2Vzc29yaWVzIzYwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzYwLjE0LjE0LjAxLjAwI0Nvc3R1bWVzIG9yIGFjY2Vzc29yaWVzIzYwLjE0LjE0LjAwLjAwCi11bnNwc2M3IzYwLjE0LjE0LjAyLjAwI0RyZXNzIHVwIENlbnRlcnMjNjAuMTQuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTQuMDMuMDAjSG91c2VrZWVwaW5nIHVuaXRzIG9yIGFjY2Vzc29yaWVzIzYwLjE0LjE0LjAwLjAwCi11bnNwc2M3IzYwLjE0LjE0LjA0LjAwI1BsYXkgZm9vZCBkaXNoZXMgb3IgYWNjZXNzb3JpZXMjNjAuMTQuMTQuMDAuMDAKLXVuc3BzYzcjNjAuMTQuMTQuMDUuMDAjUHJldGVuZCBwbGF5IGtpdHMgb3Igc3VwcGxpZXMjNjAuMTQuMTQuMDAuMDAKLXVuc3BzYzcjNzAuMDAuMDAuMDAuMDAjRmFybWluZyBhbmQgRmlzaGluZyBhbmQgRm9yZXN0cnkgYW5kIFdpbGRsaWZlIENvbnRyYWN0aW5nIFNlcnZpY2VzIzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEwLjAwLjAwLjAwI0Zpc2hlcmllcyBhbmQgYXF1YWN1bHR1cmUjNzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDAuMDAjRmlzaGVyaWVzIG9wZXJhdGlvbnMjNzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDEuMDAjQ29tbWVyY2lhbCBmaXNoaW5nIG9wZXJhdGlvbnMjNzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDIuMDAjRmlzaGluZyBwb3J0IHNlcnZpY2VzIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE1LjAzLjAwI0Zpc2hpbmcgb25zaG9yZSBmYWNpbGl0aWVzIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE1LjA0LjAwI0RlZXAgc2VhIGZpc2hpbmcgb3BlcmF0aW9ucyM3MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNS4wNS4wMCNTb25hciBmaXNoaW5nIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE1LjA2LjAwI1doYWxpbmcjNzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDcuMDAjVHJhd2xpbmcjNzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMDguMDAjTGluZSBmaXNoaW5nIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE1LjA5LjAwI1NlaW5lIG9wZXJhdGlvbnMjNzAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTUuMTAuMDAjRmlzaGluZyBuZXRzIzcwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE2LjAwLjAwI0Zpc2hlcmllcyBvdmVyc2lnaHQjNzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTYuMDEuMDAjRmlzaGVyeSBpbmZvcm1hdGlvbiBvciBkb2N1bWVudGF0aW9uIHNlcnZpY2VzIzcwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE2LjAyLjAwI0Zpc2hlcnkgcmVzZWFyY2ggb3IgZXhwZXJpbWVudGF0aW9uIHNlcnZpY2VzIzcwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE2LjAzLjAwI0Zpc2hlcnkgZGF0YSBjb2xsZWN0aW9uIG9yIGRpc3RyaWJ1dGlvbiM3MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNi4wNC4wMCNGaXNoZXJ5IGNvbW1lcmNpYWwgbWFuYWdlbWVudCM3MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNi4wNS4wMCNGaXNoaW5nIGZsZWV0IG1hbmFnZW1lbnQjNzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTYuMDYuMDAjRmlzaGluZyBjb29wZXJhdGl2ZXMjNzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTYuMDcuMDAjRmlzaGVyeSByZXNvdXJjZXMgcHJvdGVjdGlvbiBvciBjb25zZXJ2YXRpb24jNzAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTcuMDAuMDAjRmlzaGVyeSBpbmR1c3RyeSBhbmQgdGVjaG5vbG9neSM3MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNy4wMS4wMCNGaXNoaW5nIHRlY2hub2xvZ3kgc2VydmljZXMjNzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTcuMDIuMDAjRmlzaGVyeSBieSBwcm9kdWN0cyBwcm9kdWN0aW9uIHNlcnZpY2VzIzcwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE3LjAzLjAwI0Zpc2ggcHJvZHVjdGlvbiM3MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMC4xNy4wNC4wMCNGaXNoIHN0b3JhZ2UjNzAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTguMDAuMDAjRmlzaGVyaWVzIHJlc291cmNlcyM3MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOC4wMS4wMCNJbmxhbmQgd2F0ZXIgZmlzaGVyeSByZXNvdXJjZXMjNzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTguMDIuMDAjRmlzaCBwb25kIHJlc291cmNlcyM3MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOC4wMy4wMCNGaXNoIGhhdGNoZXJpZXMjNzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTguMDQuMDAjRmlzaCByYW5jaGVzIzcwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzcwLjEwLjE4LjA1LjAwI0Zpc2hlcnkgYnkgcHJvZHVjdCByZXNvdXJjZXMjNzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTguMDYuMDAjRmlzaGVyaWVzIHJlc291cmNlIGV2YWx1YXRpb24jNzAuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTkuMDAuMDAjQXF1YWN1bHR1cmUjNzAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTkuMDEuMDAjTWFyaWN1bHR1cmUjNzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTAuMTkuMDIuMDAjT3N0cmVpY3VsdHVyZSM3MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOS4wMy4wMCNTaGVsbGZpc2ggY3VsdHVyZSM3MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOS4wNC4wMCNTaHJpbXAgZmFybWluZyM3MC4xMC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xMC4xOS4wNS4wMCNGaXNoIGZhcm1pbmcjNzAuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMDAuMDAuMDAjSG9ydGljdWx0dXJlIzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjExLjE1LjAwLjAwI1BsYW50cyBhbmQgb3JuYW1lbnRhbCB0cmVlcyM3MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNS4wMS4wMCNQbGFudGluZyBzZXJ2aWNlcyBvciBvcm5hbWVudGFsIHBsYW50IG9yIGJ1c2ggb3IgdHJlZSM3MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNS4wMi4wMCNQcnVuaW5nIHNlcnZpY2VzIG9yIG9ybmFtZW50YWwgcGxhbnQgb3IgYnVzaCM3MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNS4wMy4wMCNUcmVlIHRyaW1taW5nIHNlcnZpY2VzIzcwLjExLjE1LjAwLjAwCi11bnNwc2M3IzcwLjExLjE1LjA0LjAwI0JyYWNpbmcgc2VydmljZXMjNzAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTUuMDUuMDAjVHJlZSBzdXJnZXJ5IHNlcnZpY2VzIzcwLjExLjE1LjAwLjAwCi11bnNwc2M3IzcwLjExLjE1LjA2LjAwI0FyYm9yaXN0IHNlcnZpY2VzIzcwLjExLjE1LjAwLjAwCi11bnNwc2M3IzcwLjExLjE1LjA3LjAwI1JlbW92YWwgc2VydmljZXMgb3Igb3JuYW1lbnRhbCBwbGFudCBvciBidXNoIG9yIHRyZWUjNzAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTUuMDguMDAjUGxhbnRzIG9yIG9ybmFtZW50YWwgdHJlZSBzcHJheWluZyBzZXJ2aWNlcyM3MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNi4wMC4wMCNGbG93ZXJpbmcgcGxhbnRzIzcwLjExLjAwLjAwLjAwCi11bnNwc2M3IzcwLjExLjE2LjAxLjAwI1BsYW50aW5nIHNlcnZpY2VzIzcwLjExLjE2LjAwLjAwCi11bnNwc2M3IzcwLjExLjE2LjAyLjAwI051cnNlcnkgc2VydmljZXMjNzAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTYuMDMuMDAjRmxvcmljdWx0dXJlIHNlcnZpY2VzIzcwLjExLjE2LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjAwLjAwI1BhcmtzIGFuZCBnYXJkZW5zIGFuZCBvcmNoYXJkcyM3MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNy4wMS4wMCNPcmNoYXJkIG1hbmFnZW1lbnQgb3IgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTcuMDIuMDAjVmluZXlhcmQgbWFuYWdlbWVudCBvciBtYWludGVuYW5jZSBzZXJ2aWNlcyM3MC4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNy4wMy4wMCNHYXJkZW4gcGxhbnRpbmcgb3IgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTcuMDQuMDAjSG9ydGljdWx0dXJhbCBjb3Vuc2VsaW5nIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjA1LjAwI0NlbWV0ZXJ5IHVwa2VlcCBzZXJ2aWNlcyM3MC4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNy4wNi4wMCNMYXduIGNhcmUgc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTcuMDcuMDAjSGlnaHdheSBsYXduIG1haW50ZW5hbmNlIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjA4LjAwI011bGNoaW5nIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjA5LjAwI1NlZWRpbmcgc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTEuMTcuMTAuMDAjTW93aW5nIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjExLjAwI1NwcmlnZ2luZyBzZXJ2aWNlcyM3MC4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMS4xNy4xMi4wMCNQYXJrcyBvciBnYXJkZW5zIHNwcmF5aW5nIHNlcnZpY2VzIzcwLjExLjE3LjAwLjAwCi11bnNwc2M3IzcwLjExLjE3LjEzLjAwI1BhcmtzIG1hbmFnZW1lbnQgb3IgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMDAuMDAuMDAjTGl2ZXN0b2NrIHNlcnZpY2VzIzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjE1LjAwLjAwI0RhaXJ5aW5nIzcwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjE1LjAxLjAwI0RhaXJ5IGhlcmQgbWFuYWdlbWVudCM3MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNS4wMi4wMCNEYWlyeSBpbmR1c3RyeSBkZXZlbG9wbWVudCM3MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNS4wMy4wMCNEYWlyeSB0ZWNobm9sb2d5IzcwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE1LjA0LjAwI0RhaXJ5IGxhYm9yYXRvcmllcyBzZXJ2aWNlcyM3MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNS4wNS4wMCNEYWlyeSBmYXJtIGluIGhvdXNlIHByb2Nlc3NpbmcjNzAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTYuMDAuMDAjTGl2ZXN0b2NrIGluZHVzdHJ5IzcwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjE2LjAxLjAwI0xpdmVzdG9jayBicmVlZGluZyM3MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNi4wMi4wMCNMaXZlc3RvY2sgZ2VuZXRpY3Mgc2VydmljZXMjNzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTYuMDMuMDAjU2VyaWN1bHR1cmUjNzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTYuMDQuMDAjQW5pbWFsIGh1c2JhbmRyeSM3MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNi4wNS4wMCNGYXJtIHJlYXJpbmcgc3lzdGVtcyM3MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNi4wNi4wMCNQb3VsdHJ5IHByb2R1Y3Rpb24gc2VydmljZXMjNzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTYuMDcuMDAjU21hbGwgYW5pbWFsIGJyZWVkaW5nIHNlcnZpY2VzIzcwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE2LjA4LjAwI0JvdmluZSBwcm9kdWN0aW9uIHNlcnZpY2VzIzcwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE2LjEwLjAwI0FwaWN1bHR1cmUjNzAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTcuMDAuMDAjTGl2ZXN0b2NrIG1hbmFnZW1lbnQjNzAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTcuMDEuMDAjTGl2ZXN0b2NrIHNlbGVjdGlvbiM3MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNy4wMi4wMCNMaXZlc3RvY2sgc2hvd2luZyBzZXJ2aWNlcyM3MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNy4wMy4wMCNMaXZlc3RvY2sgc2xhdWdodGVyaW5nIHNlcnZpY2VzIzcwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE3LjA0LjAwI0hlcmQgbWFuYWdlbWVudCM3MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMi4xNy4wNS4wMCNMaXZlc3RvY2sgYnJlZWRpbmcgb3IgZ3Jvb21pbmcgc2VydmljZXMjNzAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTguMDAuMDAjUGV0cyBpbmR1c3RyeSM3MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMi4xOC4wMS4wMCNQZXQgYnJlZWRpbmcgc2VydmljZXMjNzAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTguMDIuMDAjUGV0IGdyb29taW5nIHNlcnZpY2VzIzcwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE4LjAzLjAwI0tlbm5lbHMgc2VydmljZXMjNzAuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTkuMDAuMDAjUGFzdHVyZSBhbmQgcmFuZ2Ugc2VydmljZXMjNzAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMTkuMDEuMDAjUGFzdHVyZSBpbXByb3ZlbWVudCM3MC4xMi4xOS4wMC4wMAotdW5zcHNjNyM3MC4xMi4xOS4wMi4wMCNSYW5nZSBtYW5hZ2VtZW50IzcwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzcwLjEyLjE5LjAzLjAwI1JhbmdlIHJlc2VhcmNoIzcwLjEyLjE5LjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjAwLjAwI0FuaW1hbCBoZWFsdGgjNzAuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMjAuMDEuMDAjQW5pbWFsIG51dHJpdGlvbiM3MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM3MC4xMi4yMC4wMi4wMCNBbmltYWwgZGlzZWFzZSBjb250cm9sIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjAzLjAwI0FuaW1hbCB0cnlwYW5vc29taWFzaXMjNzAuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNzAuMTIuMjAuMDQuMDAjRm9vdCBvciBtb3V0aCBjb250cm9sIHNlcnZpY2VzIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjA1LjAwI0FuaW1hbCBoZWFsdGggcHJldmVudGl2ZSBtZWRpY2F0aW9uIHNlcnZpY2VzIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjA2LjAwI0FuaW1hbCB2YWNjaW5hdGlvbiBzZXJ2aWNlcyM3MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM3MC4xMi4yMC4wNy4wMCNWZXRlcmluYXJ5IGFkbWluaXN0cmF0aW9uIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjA4LjAwI1ZldGVyaW5hcnkgbGFib3JhdG9yeSB0ZWNobm9sb2d5IzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEyLjIwLjA5LjAwI0FuaW1hbCBob3NwaXRhbCBzZXJ2aWNlcyM3MC4xMi4yMC4wMC4wMAotdW5zcHNjNyM3MC4xMi4yMC4xMC4wMCNBbmltYWwgaGVhbHRoIGluZm9ybWF0aW9uIHNlcnZpY2VzIzcwLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcwLjEzLjAwLjAwLjAwI0xhbmQgYW5kIHNvaWwgcHJlcGFyYXRpb24gYW5kIG1hbmFnZW1lbnQgYW5kIHByb3RlY3Rpb24jNzAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTUuMDAuMDAjTGFuZCBhbmQgc29pbCBwcm90ZWN0aW9uIzcwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEzLjE1LjAxLjAwI0Rlc2VydGlmaWNhdGlvbiBhc3Nlc3NtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjNzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTUuMDIuMDAjU29pbCBjb25zZXJ2YXRpb24gb3IgcHJvdGVjdGlvbiBzZXJ2aWNlcyM3MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM3MC4xMy4xNS4wMy4wMCNFcm9zaW9uIGNvbnRyb2wgc2VydmljZXMjNzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTUuMDQuMDAjU2FuZCBkdW5lIGZpeGF0aW9uIzcwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE1LjA1LjAwI1NvaWwgY29uZGl0aW9uaW5nIzcwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE1LjA2LjAwI1NvaWwgaW1wcm92ZW1lbnQjNzAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTYuMDAuMDAjTGFuZCBhbmQgc29pbCBwcmVwYXJhdGlvbiM3MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM3MC4xMy4xNi4wMS4wMCNGZXJ0aWxpemVyIGFwcGxpY2F0aW9uIHNlcnZpY2VzIzcwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE2LjAyLjAwI0xpbWUgc3ByZWFkaW5nIHNlcnZpY2VzIzcwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE2LjAzLjAwI1Bsb3dpbmcgc2VydmljZXMjNzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTYuMDQuMDAjU2VlZCBiZWQgcHJlcGFyYXRpb24gc2VydmljZXMjNzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTYuMDUuMDAjU29pbCBjaGVtaWNhbCB0cmVhdG1lbnQgc2VydmljZXMjNzAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTcuMDAuMDAjTGFuZCBhbmQgc29pbCBtYW5hZ2VtZW50IzcwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzcwLjEzLjE3LjAxLjAwI0xhbmQgdXNlIHBsYW5uaW5nIzcwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE3LjAyLjAwI0xhbmQgZXZhbHVhdGlvbiM3MC4xMy4xNy4wMC4wMAotdW5zcHNjNyM3MC4xMy4xNy4wMy4wMCNMYW5kIHJlY2xhbWF0aW9uIzcwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE3LjA0LjAwI0Fncm8gZWNvbG9naWNhbCB6b25lcyBhc3Nlc3NtZW50IG9yIHBsYW5uaW5nIzcwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzcwLjEzLjE3LjA1LjAwI1NvaWwgY2xhc3NpZmljYXRpb24jNzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTcuMDYuMDAjV2F0ZXJzaGVkIG1hbmFnZW1lbnQjNzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTcuMDcuMDAjU29pbCBmZXJ0aWxpdHkgYW5hbHlzaXMjNzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTMuMTcuMDguMDAjUGVkb2xvZ3kjNzAuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMDAuMDAuMDAjQ3JvcCBwcm9kdWN0aW9uIGFuZCBtYW5hZ2VtZW50IGFuZCBwcm90ZWN0aW9uIzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjAwLjAwI0Nyb3AgcHJvZHVjdGlvbiM3MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4wMS4wMCNTZWVkIHByb2R1Y3Rpb24gc2VydmljZXMjNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMDIuMDAjSHlkcm9wb25pY3MjNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMDMuMDAjR3Jhc3Mgb3IgZm9kZGVyIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMDQuMDAjQXJvbWF0aWMgcGxhbnRzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMDUuMDAjQmV2ZXJhZ2UgY3JvcHMgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4wNi4wMCNDb2NvYSBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjA3LjAwI1N1Z2FyYmVldCBvciBzdWdhcmNhbmUgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4wOC4wMCNOdXQgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4wOS4wMCNFc3NlbnRpYWwgb2lsIGNyb3BzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMTAuMDAjRmliZXIgY3JvcHMgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4xMS4wMCNGcnVpdCBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjEyLjAwI0dyYWluIG9yIGxlZ3VtZSBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjEzLjAwI0luc2VjdGljaWRhbCBwbGFudHMgcHJvZHVjdGlvbiM3MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNS4xNC4wMCNNZWRpY2luYWwgcGxhbnRzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMTUuMDAjUm9vdHMgb3IgdHViZXJzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMTYuMDAjQ2VyZWFscyBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjE3LjAwI1J1YmJlciBwbGFudCBwcm9kdWN0aW9uIzcwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE1LjE4LjAwI1NwaWNlIGNyb3BzIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMTkuMDAjVG9iYWNjbyBjcm9wIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTUuMjAuMDAjVmVnZXRhYmxlIHByb2R1Y3Rpb24jNzAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTYuMDAuMDAjQ3JvcCBwcm90ZWN0aW9uIzcwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjE2LjAxLjAwI0Nyb3Agc3ByYXlpbmcgc2VydmljZXMjNzAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTYuMDIuMDAjQmlvbG9naWNhbCBjb250cm9sIHNlcnZpY2VzIzcwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE2LjAzLjAwI1dlZWQgY29udHJvbCBzZXJ2aWNlcyM3MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNi4wNC4wMCNIZXJiaWNpZGUgc2VydmljZXMjNzAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTYuMDUuMDAjSW50ZWdyYXRlZCBwZXN0IG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTYuMDYuMDAjUGxhbnQgcGF0aG9sb2d5IzcwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE2LjA3LjAwI0xvY3VzdCBjb250cm9sIzcwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE3LjAwLjAwI0Nyb3AgbWFuYWdlbWVudCM3MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNy4wMS4wMCNHcmVlbmhvdXNlIHNlcnZpY2VzIzcwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE3LjAyLjAwI0ZlcnRpbGl6ZXIgc2VydmljZXMjNzAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTcuMDMuMDAjQ3JvcCBhZG1pbmlzdHJhdGlvbiM3MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNy4wNC4wMCNDcm9wIHN1YnN0aXR1dGlvbiM3MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNy4wNS4wMCNFeHRlbnNpb24gc2VydmljZXMjNzAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTcuMDYuMDAjQ3JvcCBzcGVjaWFsaXphdGlvbiM3MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNC4xNy4wNy4wMCNDdWx0aXZhdGlvbiBmYXJtaW5nIHN5c3RlbSBtYW5hZ2VtZW50IzcwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE3LjA4LjAwI0Nyb3Agcm90YXRpb24gb3IgZGl2ZXJzaWZpY2F0aW9uIGNvdW5zZWxpbmcgc2VydmljZXMjNzAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTcuMDkuMDAjUGxhbnQgdGF4b25vbXkgc2VydmljZXMjNzAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTcuMTAuMDAjRmllbGQgY3JvcCBlbnRvbW9sb2d5IzcwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE4LjAwLjAwI0Nyb3AgcGxhbnRpbmcgYW5kIGN1bHRpdmF0aW9uIzcwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjE4LjAxLjAwI09yY2hhcmQgdHJlZSBvciB2aW5lIHBsYW50aW5nIHNlcnZpY2VzIzcwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE4LjAyLjAwI1Nwcm91dCBvciB0d2lnIHNlcnZpY2VzIzcwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE0LjE4LjAzLjAwI0Nyb3AgY3VsdGl2YXRpbmcgc2VydmljZXMjNzAuMTQuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTguMDQuMDAjQ3JvcCBwbGFudGluZyBzZXJ2aWNlcyM3MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNC4xOS4wMC4wMCNDcm9wIGhhcnZlc3RpbmcjNzAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTkuMDEuMDAjQ2FzaCBncmFpbnMgaGFydmVzdGluZyBzZXJ2aWNlcyM3MC4xNC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xOS4wMi4wMCNGcnVpdCBvciB0cmVlIG51dHMgaGFydmVzdGluZyBzZXJ2aWNlcyM3MC4xNC4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNC4xOS4wMy4wMCNGaWVsZCBjcm9wIGhhcnZlc3Rpbmcgc2VydmljZXMjNzAuMTQuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMTkuMDQuMDAjU2VlZCBoYXJ2ZXN0aW5nIHNlcnZpY2VzIzcwLjE0LjE5LjAwLjAwCi11bnNwc2M3IzcwLjE0LjIwLjAwLjAwI1Bvc3QgaGFydmVzdGluZyBjcm9wIHByb2Nlc3NpbmcjNzAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMjAuMDEuMDAjU2lsb3MgcmVsYXRlZCBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4wMi4wMCNHcmFpbiBkcnllcnMgc2VydmljZXMjNzAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMjAuMDMuMDAjQ3JvcCBwcm9jZXNzaW5nIHNlcnZpY2VzIzcwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjIwLjA0LjAwI0ZpZWxkIGNyb3BzIG1hcmtldCBwcmVwYXJhdGlvbiBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4wNS4wMCNDYXNoIGdyYWluIGNyb3BzIG1hcmtldCBwcmVwYXJhdGlvbiBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4wNi4wMCNWZWdldGFibGUgY3JvcHMgbWFya2V0IHByZXBhcmF0aW9uIHNlcnZpY2VzIzcwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjIwLjA3LjAwI0ZydWl0IGNyb3BzIG1hcmtldCBwcmVwYXJhdGlvbiBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4wOC4wMCNUcmVlIG51dCBjcm9wcyBtYXJrZXQgcHJlcGFyYXRpb24gc2VydmljZXMjNzAuMTQuMjAuMDAuMDAKLXVuc3BzYzcjNzAuMTQuMjAuMDkuMDAjR2lubmluZyBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4xMC4wMCNDcm9wIGNsZWFuaW5nIHNlcnZpY2VzIzcwLjE0LjIwLjAwLjAwCi11bnNwc2M3IzcwLjE0LjIwLjExLjAwI0Nvb2xpbmcgb3IgcmVmcmlnZXJhdGlvbiBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNC4yMC4xMi4wMCNTcHJheWluZyBzZXJ2aWNlcyM3MC4xNC4yMC4wMC4wMAotdW5zcHNjNyM3MC4xNS4wMC4wMC4wMCNGb3Jlc3RyeSM3MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNS4wMC4wMCNGb3Jlc3RyeSBtYW5hZ2VtZW50IzcwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjAxLjAwI0ZvcmVzdCByZXNvdXJjZXMgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNS4wMi4wMCNGb3Jlc3QgcGVzdCBjb250cm9sIzcwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjAzLjAwI0ZvcmVzdCBvcmdhbml6YXRpb25zIG9yIGFzc29jaWF0aW9ucyBvciBjb29wZXJhdGl2ZXMjNzAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTUuMDQuMDAjRm9yZXN0IGFkbWluaXN0cmF0aW9uIHNlcnZpY2VzIzcwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjA1LjAwI0ZvcmVzdCBpbnZlbnRvcnkjNzAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTUuMDYuMDAjRm9yZXN0IG1vbml0b3Jpbmcgb3IgZXZhbHVhdGlvbiM3MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNS4wNy4wMCNBZmZvcmVzdGF0aW9uIHNlcnZpY2VzIzcwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjA4LjAwI0ZvcmVzdHJ5IGV4dGVuc2lvbiBzZXJ2aWNlcyM3MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNS4wOS4wMCNGb3Jlc3QgbnVyc2VyeSBtYW5hZ2VtZW50IzcwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE1LjEwLjAwI0ZvcmVzdCBzZWN0b3JhbCBwbGFubmluZyM3MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNi4wMC4wMCNGb3Jlc3RyeSBpbmR1c3RyeSM3MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNi4wMS4wMCNOb253b29kIHByb2R1Y3Rpb24gc2VydmljZXMjNzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTYuMDIuMDAjRXNzZW50aWFsIG9pbHMgcHJvZHVjdGlvbiM3MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNi4wMy4wMCNUaW1iZXIgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNi4wNC4wMCNEeWVzIHByb2R1Y3Rpb24jNzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTYuMDUuMDAjRWRpYmxlIGZvcmVzdHJ5IHByb2R1Y3Rpb24jNzAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTYuMDYuMDAjV29vZCB0ZXN0aW5nIHNlcnZpY2VzIzcwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE2LjA3LjAwI1RpbWJlciBwcm9kdWN0aW9uIzcwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjAwLjAwI0ZvcmVzdHJ5IGhhcnZlc3RpbmcjNzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTcuMDEuMDAjTG9nZ2luZyBvciBmZWxsaW5nIzcwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjAyLjAwI0ZvcmVzdCBoYXJ2ZXN0aW5nIG1vdW50YWlub3VzIGFyZWFzIzcwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjAzLjAwI0ZvcmVzdCBoYXJ2ZXN0aW5nIHNwZWNpYWxpemVkIG9wZXJhdGlvbnMjNzAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTcuMDQuMDAjUGxhbnRhdGlvbiBoYXJ2ZXN0aW5nIzcwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjA1LjAwI1N3YW1wIG9yIG1hbmdyb3ZlIGZvcmVzdCBoYXJ2ZXN0aW5nIzcwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE3LjA2LjAwI1RlbXBlcmF0ZSBmb3Jlc3QgaGFydmVzdGluZyM3MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNS4xNy4wNy4wMCNUcm9waWNhbCBoaWdoIGZvcmVzdHMgaGFydmVzdGluZyM3MC4xNS4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOC4wMC4wMCNGb3Jlc3RyeSBjb25zZXJ2YXRpb24gc2VydmljZXMjNzAuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTguMDEuMDAjQ29uc2VydmF0aW9uIG9mIGZvcmVzdCBnZW5ldGljIHJlc291cmNlcyM3MC4xNS4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOC4wMi4wMCNGb3Jlc3QgcHJvdGVjdGlvbiBzZXJ2aWNlcyM3MC4xNS4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOC4wMy4wMCNGb3Jlc3QgYXJpZCBsYW5kIHJlaGFiaWxpdGF0aW9uIzcwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE4LjA0LjAwI0ZvcmVzdCB3aW5kIGJyZWFrcyBvciBzaGVsdGVyIGJlbHRzIzcwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE4LjA1LjAwI0ZvcmVzdCByZXNlcnZlcyBvciBwYXJrcyBjb25zZXJ2YXRpb24gc2VydmljZXMjNzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTguMDYuMDAjRm9yZXN0cnkgd2F0ZXJzaGVkIG1hbmFnZW1lbnQjNzAuMTUuMTguMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTguMDcuMDAjRm9yZXN0cnkgdG9ycmVudCBjb250cm9sIzcwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE5LjAwLjAwI0ZvcmVzdHJ5IHJlc291cmNlcyM3MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4wMS4wMCNGb3Jlc3QgcmVzb3VyY2VzIGRldmVsb3BtZW50IzcwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE5LjAyLjAwI0Fncm9mb3Jlc3RyeSByZXNvdXJjZXMjNzAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTkuMDMuMDAjRnVlbCB3b29kIHJlc291cmNlcyM3MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4wNC4wMCNTaWx2aWN1bHR1cmUjNzAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNzAuMTUuMTkuMDUuMDAjQXJpZCByYWluZmVkIHBsYW50YXRpb24gcmVzb3VyY2VzIzcwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzcwLjE1LjE5LjA2LjAwI0Jyb2FkIGxlYWZlZCBwbGFudGF0aW9uIHJlc291cmNlcyM3MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4wNy4wMCNDb25pZmVycyBwbGFudGF0aW9ucyM3MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4wOS4wMCNUcm9waWNhbCByYWluIGZvcmVzdCBwbGFudGF0aW9ucyM3MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM3MC4xNS4xOS4xMC4wMCNNYW5ncm92ZSBzd2FtcHMgcmVzb3VyY2VzIzcwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzcwLjE2LjAwLjAwLjAwI1dpbGRsaWZlIGFuZCBmbG9yYSM3MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNi4xNS4wMC4wMCNGYXVuYSM3MC4xNi4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNi4xNS4wMS4wMCNGYXVuYSBwcm90ZWN0aW9uIzcwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE2LjE2LjAwLjAwI0Zsb3JhIzcwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE2LjE2LjAxLjAwI0Zsb3JhIHByb3RlY3Rpb24jNzAuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTYuMTcuMDAuMDAjRWNvc3lzdGVtcyM3MC4xNi4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNi4xNy4wMS4wMCNFY29kZXZlbG9wbWVudCBzZXJ2aWNlcyM3MC4xNi4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNi4xNy4wMi4wMCNNYXJpbmUgZWNvc3lzdGVtIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTYuMTcuMDMuMDAjVGVycmVzdHJpYWwgZWNvc3lzdGVtIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTYuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTYuMTcuMDQuMDAjRWNvc3lzdGVtcyBwcm90ZWN0aW9uIHNlcnZpY2VzIzcwLjE2LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE3LjAwLjAwLjAwI1dhdGVyIHJlc291cmNlcyBkZXZlbG9wbWVudCBhbmQgb3ZlcnNpZ2h0IzcwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjAwLjAwI0RldmVsb3BtZW50IzcwLjE3LjAwLjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjAxLjAwI1dhdGVyIHF1YWxpdHkgYXNzZXNzbWVudCBzZXJ2aWNlcyM3MC4xNy4xNS4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNS4wMi4wMCNXYXRlciByZXNvdXJjZXMgcGxhbm5pbmcgc2VydmljZXMjNzAuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTUuMDMuMDAjR3JvdW5kIG9yIHN1cmZhY2Ugd2F0ZXIgc3VydmV5aW5nIzcwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjA0LjAwI1dhdGVyIHJlc291cmNlcyBtYXBwaW5nIHNlcnZpY2VzIzcwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjA1LjAwI1JpdmVyIGJhc2luIGRldmVsb3BtZW50IzcwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE1LjA2LjAwI0dyb3VuZCBvciBzdXJmYWNlIHdhdGVyIG1vZGVsaW5nIHNlcnZpY2VzIzcwLjE3LjE1LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE2LjAwLjAwI092ZXJzaWdodCM3MC4xNy4wMC4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNi4wMS4wMCNXYXRlciBxdWFsaXR5IG1hbmFnZW1lbnQjNzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTYuMDIuMDAjV2F0ZXIgdGVzdGluZyBzZXJ2aWNlcyM3MC4xNy4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNi4wMy4wMCNGbG9vZHBsYWluIG1hbmFnZW1lbnQjNzAuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTYuMDQuMDAjV2F0ZXIgY29uc2VydmF0aW9uIGFkdmlzb3J5IHNlcnZpY2VzIzcwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE2LjA1LjAwI1dhdGVyIHJpZ2h0cyBhZHZpc29yeSBzZXJ2aWNlcyM3MC4xNy4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNi4wNi4wMCNXYXRlciByZXNvdXJjZSByZWNvdmVyeSBzZXJ2aWNlcyM3MC4xNy4xNi4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNi4wNy4wMCNXYXRlciBwcmljaW5nIHNlcnZpY2VzIzcwLjE3LjE2LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE3LjAwLjAwI0lycmlnYXRpb24jNzAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDEuMDAjQ2FuYWwgbWFpbnRlbmFuY2Ugb3IgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MC4xNy4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNy4wMi4wMCNEYW0gbWFpbnRlbmFuY2Ugb3IgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MC4xNy4xNy4wMC4wMAotdW5zcHNjNyM3MC4xNy4xNy4wMy4wMCNSZXNlcnZvaXJzIG1haW50ZW5hbmNlIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDQuMDAjUHVtcGluZyBzdGF0aW9uIG1haW50ZW5hbmNlIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDUuMDAjUGlwZWxpbmVzIG1haW50ZW5hbmNlIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDYuMDAjRGlrZSBvciBlbWJhbmttZW50IG1haW50ZW5hbmNlIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDcuMDAjV2F0ZXIgd2VsbCBtYWludGVuYW5jZSBvciBtYW5hZ2VtZW50IHNlcnZpY2VzIzcwLjE3LjE3LjAwLjAwCi11bnNwc2M3IzcwLjE3LjE3LjA4LjAwI0lycmlnYXRpb24gYWR2aXNvcnkgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTcuMDkuMDAjSXJyaWdhdGlvbiBzeXN0ZW1zIG1hbmFnZW1lbnQgc2VydmljZXMjNzAuMTcuMTcuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTguMDAuMDAjRHJhaW5hZ2Ugc2VydmljZXMjNzAuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNzAuMTcuMTguMDEuMDAjTGFuZCBkcmFpbmFnZSBzZXJ2aWNlcyM3MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNy4xOC4wMi4wMCNTdG9ybSB3YXRlciBkcmFpbmFnZSM3MC4xNy4xOC4wMC4wMAotdW5zcHNjNyM3MC4xNy4xOC4wMy4wMCNGbG9vZCBwcm90ZWN0aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjNzAuMTcuMTguMDAuMDAKLXVuc3BzYzcjNzEuMDAuMDAuMDAuMDAjTWluaW5nIGFuZCBPaWwgYW5kIEdhcyBTZXJ2aWNlcyM3MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMC4wMC4wMC4wMCNNaW5pbmcgc2VydmljZXMjNzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTUuMDAuMDAjTWluZSBleHBsb3JhdGlvbiM3MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNS4wMS4wMCNNaW5lIGRldmVsb3BtZW50IzcxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE1LjAyLjAwI1Rlc3QgYm9yaW5nIG9yIGNvcmUgZHJpbGxpbmcjNzEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTYuMDAuMDAjTWluZSBkcmlsbGluZyBhbmQgYmxhc3Rpbmcgc2VydmljZXMjNzEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTYuMDEuMDAjU2hhZnQgc2lua2luZyM3MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNi4wMi4wMCNNaW5lIGJsYXN0aW5nIHNlcnZpY2VzIzcxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE3LjAwLjAwI0V4dHJhY3Rpb24jNzEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTcuMDEuMDAjU2hhZnQgbWluaW5nIHNlcnZpY2VzIzcxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE3LjAyLjAwI09wZW4gcGl0IG1pbmluZyBzZXJ2aWNlcyM3MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNy4wMy4wMCNTdHJpcCBtaW5pbmcgc2VydmljZXMjNzEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTcuMDQuMDAjSW4gc2l0dSBsZWFjaGluZyAoSVNMKSBzZXJ2aWNlcyM3MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNy4wNS4wMCNQdW1waW5nIG9yIGRyYWluaW5nIzcxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE3LjA2LjAwI092ZXJidXJkZW4gcmVtb3ZhbCM3MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMC4xNy4wNy4wMCNJbXBvdW5kbWVudCBvciBzdG9yYWdlIG9mIHdhdGVyIHNlcnZpY2VzIzcxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEwLjE3LjA4LjAwI1NvaWwgZmx1c2hpbmcgc2VydmljZXMjNzEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTAuMTcuMDkuMDAjTWluZSBmaWxsaW5nIHNlcnZpY2VzIzcxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcxLjExLjAwLjAwLjAwI09pbCBhbmQgZ2FzIGV4cGxvcmF0aW9uIHNlcnZpY2VzIzcxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjE1LjAwLjAwI09pbCBhbmQgZ2FzIGV4cGxvcmF0aW9uIzcxLjExLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjE1LjAxLjAwI1NlaXNtb2dyYXBoaWMgc3VydmV5cyM3MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNS4wMi4wMCNPZmZzaG9yZSBleHBsb3JhdGlvbiM3MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNS4wMy4wMCNXZWxsIHN1cnZleWluZyM3MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wMC4wMCNXZWxsIGRyaWxsaW5nIGFuZCBtYWludGVuYW5jZSM3MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wMS4wMCNEaXJlY3Rpb25hbCBkcmlsbGluZyM3MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wMi4wMCNPaWwgd2VsbCBkcmlsbGluZyM3MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wMy4wMCNEcmlsbGluZyBvZiB3YXRlciBpbnRha2Ugd2VsbHMjNzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTYuMDQuMDAjUmVkcmlsbGluZyBvciByZXdvcmtpbmcgb2Ygd2VsbHMjNzEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTYuMDUuMDAjQWNpZGl6aW5nIG9yIGNoZW1pY2FsIHRyZWF0aW5nIG9mIHdlbGxzIzcxLjExLjE2LjAwLjAwCi11bnNwc2M3IzcxLjExLjE2LjA2LjAwI1Rvb2wgZmlzaGluZyBzZXJ2aWNlcyM3MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNi4wNy4wMCNPaWwgd2VsbCBwbGF0Zm9ybSBtYWludGVuYW5jZSBzZXJ2aWNlcyM3MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNy4wMC4wMCNFeHRyYWN0aW9uIHNlcnZpY2VzIzcxLjExLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjE3LjAxLjAwI0Zsb3cgcmF0ZSBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNy4wMi4wMCNPaWwgc2FtcGxpbmcgc2VydmljZXMjNzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTcuMDMuMDAjT2lsIGZpZWxkIGRyaWxsaW5nIG9yIG11ZCBzZXJ2aWNlcyM3MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMS4xNy4wNC4wMCNJbXBvdW5kIG9yIHN0b3JhZ2Ugb2Ygd2F0ZXIjNzEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTguMDAuMDAjV2VsbCByZXN0b3JhdGlvbiBhbmQgcmVjbGFtYXRpb24jNzEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTguMDEuMDAjQ2xlYW5pbmcgb3Igc3dhYmJpbmcgb2Ygd2VsbHMjNzEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTguMDIuMDAjU29pbCBmbHVzaGluZyBzZXJ2aWNlcyM3MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xOC4wMy4wMCNNaW5lIGZpbGxpbmcgc2VydmljZXMjNzEuMTEuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTguMDQuMDAjV2VsbCBwbHVnZ2luZyBvciBhYmFuZG9ubWVudCBzZXJ2aWNlcyM3MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xOC4wNS4wMCNDZW1lbnRpbmcgc2VydmljZXMgZm9yIHdlbGwgY2FzaW5ncyM3MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xOS4wMC4wMCNXZWxsIGVtZXJnZW5jeSBzZXJ2aWNlcyM3MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4xOS4wMS4wMCNXZWxsIGZpcmUgZmlnaHRpbmcgc2VydmljZXMjNzEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMTkuMDIuMDAjV2VsbCBjYXBwaW5nIHNlcnZpY2VzIzcxLjExLjE5LjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjAwLjAwI0Nhc2VkIGhvbGUgd2VsbCBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjAxLjAwI0Nhc2VkIGhvbGUgZm9ybWF0aW9uIHNhbXBsaW5nIHRlc3Rpbmcgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMDIuMDAjQ2FzaW5nIHRoaWNrbmVzcyBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4wMy4wMCNDaGVtaWNhbCBjdXR0ZXJzIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjA0LjAwI0VsZWN0cm9tYWduZXRpYyBwaXBlIHJlY292ZXJ5IHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjA1LjAwI1dlbGwgZmxvdyBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4wNi4wMCNXZWxsIGZsdWlkIGRlbnNpdHkgbWVhc3VyZW1lbnQgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMDcuMDAjV2VsbCBmbHVpZCB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4wOC4wMCNGcmVlIHBvaW50IHRvb2wgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMDkuMDAjR2FtbWEgcmF5IHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjEwLjAwI0pldCBjdXR0ZXIgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMTEuMDAjTWVhc3VyZW1lbnQgd2hpbGUgcGVyZm9yYXRpbmcgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMTIuMDAjTmV1dHJvbiBwb3Jvc2l0eSBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4xMy4wMCNOdWNsZWFyIHNwZWN0cm9zY29weSBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4xNC4wMCNXZWxsIHBhY2tlciBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4xNS4wMCNQZXJtYW5lbnQgbWFnbmV0cyBwaXBlIHJlY292ZXJ5IHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjE2LjAwI1dlbGwgcGx1Z2dpbmcgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMTcuMDAjV2VsbCBwcmVzc3VyZSBtZWFzdXJlbWVudCBjb250cm9sIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjE4LjAwI1Byb2R1Y3Rpb24gbG9nZ2luZyBib3JlaG9sZSBmbHVpZCBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4xOS4wMCNQcm9kdWN0aW9uIGxvZ2dpbmcgZGVuc2l0eSBtZWFzdXJlbWVudCBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4yMC4wMCNQcm9kdWN0aW9uIGxvZ2dpbmcgZG93bmhvbGUgdmlkZW8gc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMjEuMDAjUHJvZHVjdGlvbiBsb2dnaW5nIGZsb3cgbWVhc3VyZW1lbnQgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMjIuMDAjUHJvZHVjdGlvbiBsb2dnaW5nIHByZXNzdXJlIG1lYXN1cmVtZW50IHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjIzLjAwI090aGVyIHByb2R1Y3Rpb24gbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4yNC4wMCNQcm9kdWN0aW9uIGxvZ2dpbmcgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgc2VydmljZXMjNzEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjAuMjUuMDAjU2V2ZXJpbmcgY29sbGlkaW5nIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjI2LjAwI1dlbGwgbG9nZ2luZyBzb25pYyBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4yNy4wMCNTdHVjayBwb2ludCB0b29sIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjI4LjAwI1RoZXJtYWwgZGVjYXkgd2VsbCBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjI5LjAwI1dlbGwgdHVidWxhciBjb3Jyb3Npb24gZXZhbHVhdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMC4zMC4wMCNXZWxsIHBlcmZvcm1hbmNlIHNlcnZpY2VzIzcxLjExLjIwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIwLjMxLjAwI1dlbGwgdHVidWxhciBzZXJ2aWNlcyM3MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4wMC4wMCNPcGVuIGhvbGUgd2VsbCBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjAwLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjAxLjAwI0RpZ2l0YWwgc29uaWMgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4wMi4wMCNCb3JlaG9sZSBnZW9tZXRyeSBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjAzLjAwI0RlbnNpdHkgbGl0aG9sb2d5IG51Y2xlYXIgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4wNC4wMCNEaXBtZXRlciBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjA1LjAwI0RpcG9sZSBzb25pYyBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjA2LjAwI0RpcmVjdGlvbmFsIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMDcuMDAjRGlyZWN0aW9uYWwgc3VydmV5IHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjA4LjAwI0VsZWN0cm9tYWduZXRpYyBwcm9wYWdhdGlvbiBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjA5LjAwI0Zvcm1hdGlvbiB0ZXN0aW5nIHNhbXBsaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjEwLjAwI0ZyYWN0dXJlIGlkZW50aWZpY2F0aW9uIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTEuMDAjR2FtbWEgcmF5IGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTIuMDAjR2FtbWEgcmF5IHNwZWN0cm9zY29weSBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjEzLjAwI0dlb2NoZW1pY2FsIG51Y2xlYXIgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4xNC4wMCNXZWxsIGltYWdpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTUuMDAjTWFnbmV0aWMgcmVzb25hbmNlIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTYuMDAjTWljcm9yZXNpc3Rpdml0eSBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjE3LjAwI05ldXRyb24gcG9yb3NpdHkgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4xOC4wMCNQZXRyb3BoeXNpY3Mgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMTkuMDAjUmVzaXN0aXZpdHkgbG9nZ2luZyBzZXJ2aWNlcyM3MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMS4yMC4wMCNTbGltIGFjY2VzcyBzb25pYyBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIxLjIxLjAwI1NvbmljIGNlbWVudCBib25kIHJhdGlvIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjEuMjIuMDAjV2VsbCBzb25pYyBpbWFnaW5nIHNlcnZpY2VzIzcxLjExLjIxLjAwLjAwCi11bnNwc2M3IzcxLjExLjIyLjAwLjAwI090aGVyIGxvZ2dpbmcgc2VydmljZXMjNzEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjIuMDEuMDAjTG9nZ2luZyB3aXRoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjIuMDIuMDAjTG9nZ2luZyB3aGlsZSBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMi4wMy4wMCNMb2dnaW5nIGR1cmluZyBmaXNoaW5nIHNlcnZpY2VzIzcxLjExLjIyLjAwLjAwCi11bnNwc2M3IzcxLjExLjIyLjA0LjAwI0xvZ2dpbmcgd2hpbGUgcGVyZm9yYXRpbmcgc2VydmljZXMjNzEuMTEuMjIuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjIuMDUuMDAjRHJpbGwgcGlwZSBjb252ZXllZCB3ZWxsIHNlcnZpY2VzIzcxLjExLjIyLjAwLjAwCi11bnNwc2M3IzcxLjExLjIyLjA2LjAwI0dlbmVyYWwgd2VsbCBsb2dnaW5nIHNlcnZpY2VzIzcxLjExLjIyLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjAwLjAwI1NlaXNtaWMgc2VydmljZXMjNzEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMDEuMDAjVHdvIGRpbWVuc2lvbmFsIGxhbmQgc2Vpc21pYyBhY3F1aXNpdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wMi4wMCNUd28gZGltZW5zaW9uYWwgbWFyaW5lIHNlaXNtaWMgYWNxdWlzaXRpb24gc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMDMuMDAjVHdvIGRpbWVuc2lvbmFsIHNlaXNtaWMgZGF0YSBwcm9jZXNzaW5nIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjA0LjAwI1RocmVlIGRpbWVuc2lvbmFsIGxhbmQgc2Vpc21pYyBhY3F1aXNpdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wNS4wMCNUaHJlZSBkaW1lbnNpb25hbCBtYXJpbmUgc2Vpc21pYyBhY3F1aXNpdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wNi4wMCNUaHJlZSBkaW1lbnNpb25hbCBzZWlzbWljIGRhdGEgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wNy4wMCNGb3VyIGRpbWVuc2lvbmFsIGxhbmQgc2Vpc21pYyBhY3F1aXNpdGlvbiBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4wOC4wMCNGb3VyIGRpbWVuc2lvbmFsIG1hcmluZSBzZWlzbWljIGFjcXVpc2l0aW9uIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjA5LjAwI0ZvdXIgZGltZW5zaW9uYWwgc2Vpc21pYyBkYXRhIHByb2Nlc3Npbmcgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTAuMDAjQ2hlY2tzaG90IHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTEuMDAjQ3Jvc3Mgd2VsbCBzZWlzbWljIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjEyLjAwI0RldmlhdGVkIHdlbGwgc2Vpc21pYyBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4xMy4wMCNHZW9waHlzaWNzIHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTQuMDAjT2Zmc2V0IHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTUuMDAjUXVpY2tzaG90IHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMTYuMDAjU2Vpc21pYyBkYXRhIGFjcXVpc2l0aW9uIHdoaWxlIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjE3LjAwI1NsaW0gaG9sZSBzZWlzbWljIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjE4LjAwI1NlaXNtaWMgc3VydmV5IGV2YWx1YXRpb24gb3IgZGVzaWduIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjExLjIzLjE5LjAwI1ZlcnRpY2FsIHNlaXNtaWMgc2VydmljZXMjNzEuMTEuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTEuMjMuMjAuMDAjV2Fsa2F3YXkgc2Vpc21pYyBzZXJ2aWNlcyM3MS4xMS4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMS4yMy4yMS4wMCNHZW9sb2dpY2FsIHNlcnZpY2VzIzcxLjExLjIzLjAwLjAwCi11bnNwc2M3IzcxLjEyLjAwLjAwLjAwI1dlbGwgZHJpbGxpbmcgY29uc3RydWN0aW9uIGFuZCBtYWludGVuYW5jZSBzZXJ2aWNlcyM3MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wMC4wMCNDZW1lbnQgcHVtcGluZyBzZXJ2aWNlcyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wMS4wMCNPaWxmaWVsZCBjYXNpbmcgaGFyZHdhcmUgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMDIuMDAjT2lsZmllbGQgY2VtZW50IGxhYiB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjAzLjAwI0Rvd25ob2xlIG9pbGZpZWxkIHRvb2xzIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjA0LjAwI09pbGZpZWxkIGZpbHRlcmluZyBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wNS4wMCNGb2FtIGNlbWVudGluZyBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wNi4wMCNHZW90aGVybWFsIHdlbGwgY2VtZW50aW5nIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjA3LjAwI0xpbmVyIGNlbWVudGluZyBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4wOC4wMCNPaWx3ZWxsIGxvc3QgY2lyY3VsYXRpb24gc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMDkuMDAjT2lsZmllbGQgbXVkIHJlbW92YWwgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTAuMDAjUGx1ZyBjZW1lbnRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTEuMDAjV2VsbCBzaXRlIHByZXNzdXJlIHB1bXBpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTIuMDAjT2lsZmllbGQgcHJlc3N1cmUgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4xMy4wMCNTdXJmYWNlIGNhc2luZyBjZW1lbnRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTQuMDAjSW50ZXJtZWRpYXRlIGNhc2luZyBjZW1lbnRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTUuMDAjUHJvZHVjdGlvbiBzdHJpbmcgY2VtZW50aW5nIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjE2LjAwI1NxdWVlemUgd2VsbCBjZW1lbnRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTcuMDAjV2VsbCB3YXRlciBjb250cm9sIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjE4LjAwI1dlbGwgY2VtZW50IGV2YWx1YXRpb24gc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMTkuMDAjV2VsbCBjZW1lbnQgZ3JvdXRpbmcgc2VydmljZXMjNzEuMTIuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTAuMjAuMDAjV2VsbCBjZW1lbnRpbmcgYWRkaXRpdmVzIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjIxLjAwI1dlbGwgY2VtZW50aW5nIGRlc2lnbiBzZXJ2aWNlcyM3MS4xMi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMC4yMi4wMCNXZWxsIGNsZWFuaW5nIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEwLjIzLjAwI1dlbGwgcmVwYWlyIHNlcnZpY2VzIzcxLjEyLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjAwLjAwI0NvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMDEuMDAjQWNpZGl6aW5nIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4wMi4wMCNDYWJsZSBpbnN0YWxsYXRpb24gdGhyb3VnaCBjb2lsZWQgdHViaW5nIHNlcnZpY2VzIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjAzLjAwI0NlbWVudGluZyB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMDQuMDAjQ2hlbWljYWwgY3V0dGluZyB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMDUuMDAjQ2xlYW4gb3V0IHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4wNi4wMCNDb21wbGV0aW9uIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4wNy4wMCNDb252ZXlpbmcgaW5mbGF0YWJsZXMgdGhyb3VnaCBjb2lsZWQgdHViaW5nIHNlcnZpY2VzIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjA4LjAwI0NvcmluZyB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMDkuMDAjRXh0ZW5kZWQgcmVhY2ggd2VsbCBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4xMC4wMCNGaXNoaW5nIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4xMS4wMCNGcmFjdHVyaW5nIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4xMi4wMCNIaWdoIHByZXNzdXJlIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTMuMDAjSG9yaXpvbnRhbCBpc29sYXRpb24gb2lsZmllbGQgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTQuMDAjTG9nZ2luZyB3aXRoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTUuMDAjTWlsbGluZyB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTYuMDAjTml0cm9nZW4gcmVsYXRlZCBhcHBsaWNhdGlvbnMgdGhyb3VnaCBjb2lsZWQgdHViaW5nIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjE3LjAwI1BlcmZvcmF0aW5nIHRocm91Z2ggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4xOC4wMCNQaXBlbGluZSBvciBmbG93bGluZSBsYXlpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMTkuMDAjUGlwZWxpbmUgaW50ZXJ2ZW50aW9uIHNlcnZpY2VzIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjIwLjAwI1NhbmQgY29udHJvbCB0aHJvdWdoIGNvaWxlZCB0dWJpbmcgc2VydmljZXMjNzEuMTIuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTEuMjEuMDAjQWJyYXNpdmUgdHVidWxhciBjbGVhbmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMS4yMi4wMCNXZWxsIGtpbGwgdGhyb3VnaCBjb2lsZWQgdHViaW5nIHNlcnZpY2VzIzcxLjEyLjExLjAwLjAwCi11bnNwc2M3IzcxLjEyLjExLjIzLjAwI0Nhc2luZyBleGl0IHdpdGggY29pbGVkIHR1YmluZyBzZXJ2aWNlcyM3MS4xMi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wMC4wMCNDb3Jpbmcgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTIuMDEuMDAjQ29udmVudGlvbmFsIGNvcmluZyBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wMi4wMCNDb3JlIGlzb2xhdGlvbiBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wMy4wMCNDb3JlIHByZXNlcnZhdGlvbiBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wNC4wMCNIb3Jpem9udGFsIGNvcmluZyBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wNS4wMCNPcmllbnRlZCBjb3Jpbmcgc2VydmljZXMjNzEuMTIuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTIuMDYuMDAjUmlnIHNpdGUgY29yZSBhbmFseXNpcyBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMi4wNy4wMCNTcG9uZ2UgY29yaW5nIHNlcnZpY2VzIzcxLjEyLjEyLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEyLjA4LjAwI1dpcmVsaW5lIHJldHJpZXZhYmxlIGNvcmluZyBzZXJ2aWNlcyM3MS4xMi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMy4wMC4wMCNEb3duaG9sZSB0b29sIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEzLjAxLjAwI0Rvd25ob2xlIHZpYnJhdGlvbiBjb250cm9sIHNlcnZpY2VzIzcxLjEyLjEzLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEzLjAyLjAwI0Rvd25ob2xlIGhvbGUgb3BlbmluZyBzZXJ2aWNlcyM3MS4xMi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMy4wMy4wMCNSZWFtaW5nIHdoaWxlIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjEzLjAwLjAwCi11bnNwc2M3IzcxLjEyLjEzLjA0LjAwI0Rvd25ob2xlIHRvcnF1ZSBvciBkcmFnIHJlZHVjdGlvbiBzZXJ2aWNlcyM3MS4xMi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xMi4xMy4wNS4wMCNEb3duaG9sZSB1bmRlcnJlYW1pbmcgc2VydmljZXMjNzEuMTIuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDAuMDAjT2lsZmllbGQgZHJpbGxpbmcgYml0IHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjE0LjAxLjAwI09pbGZpZWxkIGRyaWxsaW5nIGJpdCBkZXNpZ24gc2VydmljZXMjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDIuMDAjT2lsZmllbGQgZHJpbGxpbmcgYml0IGh5ZHJhdWxpYyBvcHRpbWl6YXRpb24gc2VydmljZXMjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDMuMDAjT2lsZmllbGQgZHJpbGxpbmcgYml0IHBsYW5uaW5nIHNlcnZpY2VzIzcxLjEyLjE0LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE0LjA0LjAwI09pbGZpZWxkIGRyaWxsaW5nIGJpdCByZWNvcmRpbmcgc2VydmljZXMjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDUuMDAjT2lsZmllbGQgZHJpbGxpbmcgYml0IHJlcGFpciBzZXJ2aWNlcyM3MS4xMi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNC4wNi4wMCNPaWxmaWVsZCBkcmlsbGluZyBiaXQgZm9vdGFnZSBjb250cmFjdHMjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTQuMDcuMDAjV2VsbCBzaXRlIGRyaWxsaW5nIG9wdGltaXphdGlvbiBhc3Npc3RhbmNlIHNlcnZpY2UjNzEuMTIuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDAuMDAjRHJpbGxpbmcgbWVhc3VyZW1lbnQgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDEuMDAjQWNvdXN0aWMgbWVhc3VyZW1lbnQgd2hlbiBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNS4wMi4wMCNBY291c3RpYyB0ZWxlbWV0cnkgd2hlbiBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNS4wMy4wMCNDYWxpcGVyIG1lYXN1cmVtZW50IHdoZW4gZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDQuMDAjRGVuc2l0eSBtZWFzdXJlbWVudCB3aGVuIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE1LjA1LjAwI09pbGZpZWxkIGRyaWxsaW5nIHBlcmZvcm1hbmNlIHNlcnZpY2VzIzcxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE1LjA2LjAwI0VsZWN0cm9tYWduZXRpYyB0ZWxlbWV0cnkgd2hlbiBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNS4wNy4wMCNGb3JtYXRpb24gZGlwIG1lYXN1cmVtZW50IHdoZW4gZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDguMDAjRm9ybWF0aW9uIHByZXNzdXJlIG1lYXN1cmVtZW50IHdoZW4gZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMDkuMDAjR2VvbG9naWNhbGx5IHN0ZWVyZWQgd2VsbHMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTAuMDAjR2Vvc3RvcHBpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTEuMDAjTXVkIGxvZ2dpbmcgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTIuMDAjTnVjbGVhciBtYWduZXRpYyByZXNvbmFuY2Ugc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTMuMDAjUG9yb3NpdHkgbWVhc3VyZW1lbnQgd2hlbiBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNS4xNC4wMCNSZXNpc3Rpdml0eSBtZWFzdXJlbWVudCB3aGVuIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE1LjE1LjAwI1dlbGwgc3VydmV5aW5nIG1hbmFnZW1lbnQgc2VydmljZXMjNzEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTUuMTYuMDAjU3VydmV5aW5nIHdpcmVsaW5lIHNlcnZpY2VzIzcxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjAwLjAwI09pbCB3ZWxsIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjAxLjAwI1dlbGwgY2FzaW5nIGNyZXcgc2VydmljZSM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4wMi4wMCNXZWxsIGNhc2luZyBwbGFubmluZyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4wMy4wMCNXZWxsIGNhc2luZyBtaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjA0LjAwI0NvaWxlZCB0dWJpbmcgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMDUuMDAjV2VsbCBjb21wbGV0aW9uIHBsYW5uaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjA2LjAwI0NvbnZlbnRpb25hbCB3ZWxsIGRpcmVjdGlvbmFsIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjA3LjAwI1dlbGwgZGlyZWN0aW9uYWwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMDguMDAjV2VsbCBkcmlsbGluZyBjb250cmFjdCBkZXZlbG9wbWVudCBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4wOS4wMCNXZWxsIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjEwLjAwI1dlbGwgZHJpbGxpbmcgZW5naW5lZXJpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTEuMDAjV2VsbCBkcmlsbGluZyBtdWQgb3IgZmx1aWQgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTIuMDAjV2VsbCBkcmlsbGluZyBvZiB3YXRlciBpbnRha2Ugd2VsbCBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4xMy4wMCNXZWxsIGRyaWxsaW5nIHJpZyBtb25pdG9yIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjE0LjAwI1dlbGwgZHJpbGxpbmcgc29saWRzIGNvbnRyb2wjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTUuMDAjV2VsbCBkcmlsbGluZyBzdGFiaWxpemluZyBvciBob2xlIG9wZW5pbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTYuMDAjV2VsbCBkcmlsbGluZyBzdXBlcnZpc2lvbiM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4xNy4wMCNXZWxsIGRyaWxsaW5nIGNvbnRyb2wgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMTguMDAjV2VsbCBkcmlsbGluZyBvdGhlciBnZW5lcmFsIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjE5LjAwI0V4dGVuZGVkIHJlYWNoIGRpcmVjdGlvbmFsIHdlbGwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjAuMDAjTXVsdGlsYXRlcmFsIGRpcmVjdGlvbmFsIHdlbGwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjEuMDAjT2lsIGNvdW50cnkgdHVidWxhciBtb2RpZmljYXRpb24gb3IgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4yMi4wMCNXZWxsIGRyaWxsaW5nIHBpY2t1cCBvciBsYXlkb3duIHNlcnZpY2UjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjMuMDAjV2VsbCBkcmlsbGluZyBwaXBlIHN0b3JhZ2UjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjQuMDAjV2VsbCBkcmlsbGluZyBwaXBlIHRocmVhZGluZyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4yNS4wMCNSYXRob2xlIHdlbGwgZHJpbGxpbmcgc2VydmljZSM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4yNi4wMCNTaG9ydCByYWRpdXMgZGlyZWN0aW9uYWwgd2VsbCBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4yNy4wMCNTdGVlcmFibGUgdW5kZXJyZWFtaW5nIHdoaWxlIHdlbGwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjguMDAjVWx0cmEgc2hvcnQgcmFkaXVzIGRpcmVjdGlvbmFsIHdlbGwgZHJpbGxpbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMjkuMDAjVW5kZXJiYWxhbmNlZCB3ZWxsIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjMwLjAwI1dlbGwgcGxhbm5pbmcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMzEuMDAjV2VsbCByZWRyaWxsaW5nIG9yIHJld29ya2luZyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4zMi4wMCNXZWxsIGRyaWxsaW5nIGRldmlhdGlvbiBjb250cm9sIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjMzLjAwI09pbGZpZWxkIGdyYXZlbCBwYWNraW5nIHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjM0LjAwI09pbGZpZWxkIGh1bGwgc3lzdGVtcyBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNi4zNS4wMCNSaWcgd2VsbCBwdWxsaW5nIGNyZXcgc2VydmljZXMjNzEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTYuMzYuMDAjV2VsbGhlYWQgZXF1aXBtZW50IHNlcnZpY2VzIzcxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE2LjM3LjAwI1NpZGV0cmFja2luZyB3aXRoIHdoaXBzdG9jayBzZXJ2aWNlcyM3MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNy4wMC4wMCNPaWxmaWVsZCBmaXNoaW5nIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjE3LjAxLjAwI09pbGZpZWxkIGZpc2hpbmcgc2VydmljZSBkZXNpZ24gc2VydmljZXMjNzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTcuMDIuMDAjT2lsZmllbGQgZmlzaGluZyBzZXJ2aWNlIGVjb25vbWljIGV2YWx1YXRpb24gc2VydmljZXMjNzEuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTcuMDMuMDAjT2lsZmllbGQgZmlzaGluZyBzZXJ2aWNlIG9wZXJhdGlvbiBzZXJ2aWNlcyM3MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNy4wNC4wMCNPaWxmaWVsZCBqdW5rIHJlY292ZXJ5IHNlcnZpY2VzIzcxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE3LjA1LjAwI09pbGZpZWxkIHBpcGUgcmVjb3Zlcnkgc2VydmljZSM3MS4xMi4xNy4wMC4wMAotdW5zcHNjNyM3MS4xMi4xNy4wNi4wMCNPaWxmaWVsZCBmaXNoaW5nIG9yIGRyaWxsaW5nIHNlcnZpY2VzIzcxLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjE4LjAwLjAwI0dhcyBsaWZ0IHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjE4LjAxLjAwI0NvaWxlZCB0dWJpbmcgZ2FzIGxpZnQgc2VydmljZXMjNzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTguMDIuMDAjR2FzIGxpZnQgZml4aW5nIG9yIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTguMDMuMDAjR2FzIGxpZnQga2lja292ZXIgc2VydmljZXMjNzEuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTguMDQuMDAjR2FzIGxpZnQgc2FuZCBjb250YWlubWVudCBzZXJ2aWNlcyM3MS4xMi4xOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4xOS4wMC4wMCNEb3duIGhvbGUgZmx1aWQgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTkuMDEuMDAjRG93biBob2xlIGZsdWlkIGV2YWx1YXRpb24gc2VydmljZXMjNzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTkuMDIuMDAjRG93biBob2xlIGZsdWlkIGxhYm9yYXRvcnkgc2VydmljZXMjNzEuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMTkuMDMuMDAjRG93biBob2xlIGZsdWlkIHNhbXBsaW5nIHNlcnZpY2VzIzcxLjEyLjE5LjAwLjAwCi11bnNwc2M3IzcxLjEyLjIwLjAwLjAwI1dlbGwgcGVyZm9yYXRpbmcgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjAuMDEuMDAjQ29pbGVkIHR1YmluZyB3ZWxsIHBlcmZvcmF0aW5nIHNlcnZpY2VzIzcxLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIwLjAyLjAwI1NsaWNrbGluZSB3ZWxsIHBlcmZvcmF0aW5nIHNlcnZpY2VzIzcxLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIwLjAzLjAwI1Rocm91Z2ggdHViaW5nIHdlbGwgcGVyZm9yYXRpb24gc2VydmljZXMjNzEuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjAuMDQuMDAjVHViaW5nIGNvbnZleWVkIHdlbGwgcGVyZm9yYXRpbmcgc2VydmljZXMjNzEuMTIuMjAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjAuMDUuMDAjV2lyZWxpbmUgd2VsbCBwZXJmb3JhdGluZyBzZXJ2aWNlcyM3MS4xMi4yMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMC4wNi4wMCNXZWxsIHR1YmluZyBwdW5jaGVyIHNlcnZpY2VzIzcxLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjAwLjAwI09pbGZpZWxkIHNhbmQgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4wMS4wMCNBY2lkIHNhbmQgY29udHJvbCBwdW1waW5nIHNlcnZpY2VzIzcxLjEyLjIxLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjAyLjAwI1NhbmQgY29udHJvbCBibGVuZGluZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4wMy4wMCNDbGVhbmluZyBmbHVpZCBzYW5kIGNvbnRyb2wgc2VydmljZXMjNzEuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjEuMDQuMDAjQ29tcGxldGlvbiBmbHVpZCBzYW5kIGNvbnRyb2wgc2VydmljZXMjNzEuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjEuMDUuMDAjV2VsbCBjb25zb2xpZGF0aW9uIHNlcnZpY2VzIzcxLjEyLjIxLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjA2LjAwI09pbGZpZWxkIGZpbHRlcmluZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4wNy4wMCNGcmFjdHVyaW5nIGZsdWlkIHNhbmQgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4wOC4wMCNGcmFjdHVyaW5nIHByZSBmcmFjIGRlc2lnbiB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjIxLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjA5LjAwI0dlbmVyYWwgc2FuZCBjb250cm9sIHNlcnZpY2VzIzcxLjEyLjIxLjAwLjAwCi11bnNwc2M3IzcxLjEyLjIxLjEwLjAwI0dyYXZlbCBjYXJyaWVyIGZsdWlkIHNhbmQgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xMS4wMCNTYW5kIGNvbnRyb2wgbGFiIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjEuMTIuMDAjTXVsdGl6b25lIHNhbmQgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xMy4wMCNTYW5kIGNvbnRyb2wgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xNC4wMCNTYW5kIGNvbnRyb2wgdGVtcG9yYXJ5IGlzb2xhdGlvbiBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xNS4wMCNXZWxsIHRvb2wgcmVkcmVzc2luZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMS4xNi4wMCNOb24gZnJhY3R1cmluZyBzYW5kIGNvbnRyb2wgcHVtcGluZyBzZXJ2aWNlcyM3MS4xMi4yMS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMi4wMC4wMCNTbGlja2xpbmUgc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjIuMDEuMDAjU2xpY2tsaW5lIGZpc2hpbmcgc2VydmljZXMjNzEuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjIuMDIuMDAjU2xpY2tsaW5lIGxpZnRpbmcgc2VydmljZXMjNzEuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjIuMDMuMDAjU2xpY2tsaW5lIG1hbmlwdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMi4yMi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMy4wMC4wMCNTdWJzZWEgd2VsbCBzZXJ2aWNlcyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMy4wMS4wMCNTdWJzZWEgd2VsbCBkaXZpbmcgc2VydmljZXMjNzEuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjMuMDIuMDAjU3Vic2VhIHdlbGwgcmVtb3RlIG9wZXJhdGlvbiB2ZWhpY2xlIHJvdiBzZXJ2aWNlcyM3MS4xMi4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMy4wMy4wMCNTdWJzZWEgd2VsbCBmaXh0dXJpbmcgb3IgdGVzdCBlcXVpcG1lbnQgc2VydmljZXMjNzEuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjMuMDQuMDAjU3Vic2VhIHdlbGwgaW50ZXJ2ZW50aW9uIG9yIGNvbXBsZXRpb24gc2VydmljZXMjNzEuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjMuMDUuMDAjU3Vic2VhIHdlbGwgc2FmZXR5IHRlc3QgdHJlZSBzZXJ2aWNlcyM3MS4xMi4yMy4wMC4wMAotdW5zcHNjNyM3MS4xMi4yMy4wNi4wMCNTdWJzZWEgd2VsbCBlcXVpcG1lbnQgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzEuMTIuMjMuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjQuMDAuMDAjV2VsbCB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjI0LjAxLjAwI0RyaWxsIHN0ZW0gZmxvdyBtZXRlcmluZyBzZXJ2aWNlcyM3MS4xMi4yNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNC4wMi4wMCNEcmlsbCBzdGVtIHN1cmZhY2UgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4yNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNC4wMy4wMCNEcmlsbCBzdGVtIHRlc3RpbmcgcGFja2VyIHNlcnZpY2VzIzcxLjEyLjI0LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI0LjA0LjAwI0RyaWxsIHN0ZW0gdGVzdGluZyBwcmVzc3VyZSBjb250cm9sIHRlc3Qgc2VydmljZXMjNzEuMTIuMjQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjQuMDUuMDAjRHJpbGwgc3RlbSB0ZXN0aW5nIHB1bHNlIG9wZXJhdGVkIHRlc3Qgc2VydmljZXMjNzEuMTIuMjQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjQuMDYuMDAjRHJpbGwgc3RlbSB0ZXN0aW5nIGZvciB1bHRyYSBoaWdoIHByZXNzIGhpZ2ggdGVtcCBlbnZpcm9ubWVudCBzZXJ2aWNlcyM3MS4xMi4yNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNC4wNy4wMCNEcmlsbCBzdGVtIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMjQuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjQuMDguMDAjUGVyaW9kaWMgd2VsbCB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjI0LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI0LjA5LjAwI1N1cmZhY2Ugd2VsbCB0ZXN0aW5nIHNlcnZpY2VzIzcxLjEyLjI0LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI0LjEwLjAwI1VuZGVyYmFsYW5jZWQgdGVzdGluZyB3aGlsZSBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xMi4yNC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNS4wMC4wMCNXYXRlciBvciBnYXMgY29udHJvbCBzZXJ2aWNlcyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNS4wMS4wMCNXYXRlciBvciBnYXMgY29udHJvbCBkZXNpZ24gc2VydmljZXMjNzEuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjUuMDIuMDAjV2F0ZXIgb3IgZ2FzIGNvbnRyb2wgZXZhbHVhdGlvbiBzZXJ2aWNlcyM3MS4xMi4yNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNS4wMy4wMCNXYXRlciBvciBnYXMgY29udHJvbCBpc29sYXRpb24gc2VydmljZXMjNzEuMTIuMjUuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjUuMDQuMDAjV2F0ZXIgb3IgZ2FzIGNvbnRyb2wgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4yNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNS4wNS4wMCNXYXRlciBvciBnYXMgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMi4yNS4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4wMC4wMCNXZWxsIGNvbXBsZXRpb24gc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjYuMDEuMDAjV2VsbCBjYXNpbmcgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4wMi4wMCNXZWxsIGNvbXBsZXRpb24gZmx1aWRzIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI2LjAzLjAwI0dhcyBsaWZ0IHdlbGwgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4wNC4wMCNIb3Jpem9udGFsIGNhc2VkIGhvbGUgc2VydmljZXMjNzEuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjYuMDUuMDAjSG9yaXpvbnRhbCBvcGVuIGhvbGUgc2VydmljZXMjNzEuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjYuMDYuMDAjSW50ZWxsaWdlbnQgd2VsbCBjb21wbGV0aW9uIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI2LjA3LjAwI0xpbmVyIHdlbGwgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4wOC4wMCNNdWx0aWxhdGVyYWwgd2VsbCBjb21wbGV0aW9uIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI2LjA5LjAwI1Blcm1hbmVudCB3ZWxsIGNvbXBsZXRpb24gc2VydmljZXMjNzEuMTIuMjYuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjYuMTAuMDAjU2FuZCBjb250cm9sIHdlbGwgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4xMS4wMCNUZW1wb3JhcnkgZHJpbGwgc3RlbSB0ZXN0aW5nIHdlbGwgY29tcGxldGlvbiBzZXJ2aWNlcyM3MS4xMi4yNi4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNi4xMi4wMCNUdWJpbmcgd2VsbCBjb21wbGV0aW9uIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI2LjEzLjAwI1VuZGVyYmFsYW5jZWQgd2VsbCBjb21wbGV0aW9uIHNlcnZpY2VzIzcxLjEyLjI2LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI3LjAwLjAwI1dlbGwgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzEuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjcuMDEuMDAjT2lsIHdlbGwgcGxhdGZvcm0gbWFpbnRlbmFuY2Ugc2VydmljZXMjNzEuMTIuMjcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjcuMDIuMDAjT2lsZmllbGQgcHVtcGluZyB1bml0IG1haW50ZW5hbmNlIHNlcnZpY2VzIzcxLjEyLjI3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI3LjAzLjAwI09pbGZpZWxkIHJvZCBwdW1wIHJlcGFpciBzZXJ2aWNlcyM3MS4xMi4yNy4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNy4wNC4wMCNPaWxmaWVsZCBzbnViYmluZyBzZXJ2aWNlIzcxLjEyLjI3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI3LjA1LjAwI09pbGZpZWxkIHN1Y2tlciByb2QgbWFpbnRlbmFuY2Ugc2VydmljZXMjNzEuMTIuMjcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjcuMDYuMDAjV2VsbCBzd2FiYmluZyBzZXJ2aWNlcyM3MS4xMi4yNy4wMC4wMAotdW5zcHNjNyM3MS4xMi4yNy4wNy4wMCNPaWxmaWVsZCB0dWJpbmcgYW5jaG9yIHNlcnZpY2VzIzcxLjEyLjI3LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI3LjA4LjAwI09pbGZpZWxkIHB1bXAgbWVjaGFuaWMgc2VydmljZXMjNzEuMTIuMjcuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjguMDAuMDAjV2VsbCBtb25pdG9yaW5nIHNlcnZpY2VzIzcxLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEyLjI4LjAxLjAwI0Rvd25ob2xlIHJlY29yZGluZyBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wMi4wMCNXZWxsIGZsb3cgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wMy4wMCNPaWwgb3IgZ2FzIHdlbGwgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wNC4wMCNXZWxsIHNpdGUgcGhhc2UgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wNS4wMCNXZWxsIHNpdGUgcHVtcCBtb25pdG9yaW5nIHNlcnZpY2VzIzcxLjEyLjI4LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI4LjA2LjAwI1dlbGwgc2l0ZSBzdXJmYWNlIGRhdGEgYWNxdWlzaXRpb24gc2VydmljZXMjNzEuMTIuMjguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjguMDcuMDAjV2VsbCBzaXRlIHN1cmZhY2UgcmVhZG91dCBzZXJ2aWNlcyM3MS4xMi4yOC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOC4wOC4wMCNXZWxsIHNpdGUgc3VyZmFjZSByZWNvcmRpbmcgc2VydmljZXMjNzEuMTIuMjguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjguMDkuMDAjU3VyZmFjZSB3ZWxsIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMjguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjguMTAuMDAjU3Vic3VyZmFjZSB3ZWxsIHRlc3Rpbmcgc2VydmljZXMjNzEuMTIuMjguMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjkuMDAuMDAjT2lsZmllbGQgcmlncyM3MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMi4yOS4wMS4wMCNEZWVwd2F0ZXIgb2lsZmllbGQgcmlnIHNlcnZpY2VzIzcxLjEyLjI5LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI5LjAyLjAwI0phY2t1cCBvaWxmaWVsZCByaWcgc2VydmljZXMjNzEuMTIuMjkuMDAuMDAKLXVuc3BzYzcjNzEuMTIuMjkuMDMuMDAjQmFyZ2Ugb2lsZmllbGQgcmlnIHNlcnZpY2VzIzcxLjEyLjI5LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI5LjA0LjAwI0xhbmQgb2lsZmllbGQgcmlnIHNlcnZpY2VzIzcxLjEyLjI5LjAwLjAwCi11bnNwc2M3IzcxLjEyLjI5LjA1LjAwI1BsYXRmb3JtIG9pbGZpZWxkIHJpZyBzZXJ2aWNlcyM3MS4xMi4yOS4wMC4wMAotdW5zcHNjNyM3MS4xMy4wMC4wMC4wMCNPaWwgYW5kIGdhcyBleHRyYWN0aW9uIGFuZCBwcm9kdWN0aW9uIGVuaGFuY2VtZW50IHNlcnZpY2VzIzcxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEwLjAwLjAwI1dlbGwgZnJhY3R1cmluZyBzZXJ2aWNlcyM3MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wMS4wMCNBY2lkIGJhc2VkIGZsdWlkIHdlbGwgZnJhY3R1cmluZyBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wMi4wMCNFbXVsc2lvbiBiYXNlZCBmbHVpZCB3ZWxsIGZyYWN0dXJpbmcgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMDMuMDAjRm9hbSBiYXNlZCBmbHVpZCB3ZWxsIGZyYWN0dXJpbmcgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMDQuMDAjT2lsIHdlbGwgZnJhY3R1cmluZyBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wNS4wMCNPaWwgd2VsbCBzY2FsZSBjb250cm9sIHNlcnZpY2VzIzcxLjEzLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEwLjA2LjAwI1dlbGwgZnJhY3R1cmUgdGVzdGluZyBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wNy4wMCNXZWxsIGZyYWN0dXJpbmcgZG93bmhvbGUgZXZhbHVhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4wOC4wMCNXZWxsIGZyYWN0dXJpbmcgaGVpZ2h0IGNvbnRyb2wgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMDkuMDAjV2VsbCBmcmFjdHVyaW5nIG1vbml0b3Jpbmcgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMTAuMDAjV2VsbCBmcmFjdHVyaW5nIHNlcnZpY2UgZGVzaWduIHNlcnZpY2VzIzcxLjEzLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEwLjExLjAwI1dlbGwgZnJhY3R1cmluZyBzZXJ2aWNlIGV2YWx1YXRpb24gc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMTIuMDAjV2VsbCBmcmFjdHVyaW5nIHN1cmZhY2UgZXZhbHVhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4xMy4wMCNXZWxsIGZyYWN0dXJpbmcgdHJlYXRtZW50IHF1YWxpdHkgY29udHJvbCBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4xNC4wMCNPaWwgYmFzZWQgZmx1aWQgd2VsbCBmcmFjdHVyaW5nIHNlcnZpY2VzIzcxLjEzLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEwLjE1LjAwI090aGVyIHdlbGwgZnJhY3R1cmluZyBzZXJ2aWNlcyM3MS4xMy4xMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMC4xNi4wMCNXZWxsIGZyYWN0dXJpbmcgc3RyZXNzIG1hbmFnZW1lbnQgc2VydmljZXMjNzEuMTMuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTAuMTcuMDAjV2F0ZXIgYmFzZWQgZmx1aWQgd2VsbCBmcmFjdHVyaW5nIHNlcnZpY2VzIzcxLjEzLjEwLjAwLjAwCi11bnNwc2M3IzcxLjEzLjExLjAwLjAwI01hdHJpeCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMS4wMS4wMCNBY2lkIGJhc2VkIG1hdHJpeCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMS4wMi4wMCNGb3JtYXRpb24gc2VhbGVyIG1hdHJpeCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMS4wMy4wMCNNYXRyaXggb3JnYW5pYyBjbGVhbnVwIHNlcnZpY2VzIzcxLjEzLjExLjAwLjAwCi11bnNwc2M3IzcxLjEzLjExLjA0LjAwI01hdHJpeCBvcmdhbmljIGluaGliaXRpb24gc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDUuMDAjTWF0cml4IHNjYWxlIGNsZWFudXAgc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDYuMDAjTWF0cml4IHNjYWxlIGluaGliaXRpb24gc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDcuMDAjTWF0cml4IHRyZWF0bWVudCBkZXNpZ24gc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDguMDAjTWF0cml4IHRyZWF0bWVudCBkaXZlcnNpb24gc2VydmljZXMjNzEuMTMuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTEuMDkuMDAjTWF0cml4IHRyZWF0bWVudCBldmFsdWF0aW9uIHNlcnZpY2VzIzcxLjEzLjExLjAwLjAwCi11bnNwc2M3IzcxLjEzLjExLjEwLjAwI01hdHJpeCB0cmVhdG1lbnQgcXVhbGl0eSBjb250cm9sIHNlcnZpY2VzIzcxLjEzLjExLjAwLjAwCi11bnNwc2M3IzcxLjEzLjExLjExLjAwI05vbiBhY2lkIGJhc2VkIG1hdHJpeCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMS4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMi4wMC4wMCNPaWxmaWVsZCBuaXRyb2dlbiBzZXJ2aWNlcyM3MS4xMy4wMC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMi4wMS4wMCNOaXRyb2dlbiB3ZWxsIHNlcnZpY2VzIzcxLjEzLjEyLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEzLjAwLjAwI090aGVyIG9pbGZpZWxkIHB1bXBpbmcgc2VydmljZXMjNzEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDEuMDAjQm90dG9tIGludGFrZSBvaWxmaWVsZCBwdW1waW5nIHNlcnZpY2VzIzcxLjEzLjEzLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEzLjAyLjAwI0NhYmxlIGRlcGxveWVkIG9pbGZpZWxkIHB1bXBpbmcgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDMuMDAjQ28yIG9pbGZpZWxkIHB1bXBpbmcgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDQuMDAjQ29pbGVkIHR1YmluZyBkZXBsb3llZCBvaWxmaWVsZCBwdW1waW5nIHNlcnZpY2VzIzcxLjEzLjEzLjAwLjAwCi11bnNwc2M3IzcxLjEzLjEzLjA1LjAwI0Rvd25ob2xlIHB1bXBpbmcgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDYuMDAjRHVhbCBjb21wbGV0aW9uIHdlbGwgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDcuMDAjSG9yaXpvbnRhbCBwdW1waW5nIHdlbGwgc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDguMDAjT2lsZmllbGQgcHVtcGluZyBpbnN0YWxsYXRpb24gcHVsbCBvciBvcGVyYXRpb24gc2VydmljZXMjNzEuMTMuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTMuMDkuMDAjV2VsbCBwcm9maWxlIG1vZGlmaWNhdGlvbiBzZXJ2aWNlcyM3MS4xMy4xMy4wMC4wMAotdW5zcHNjNyM3MS4xMy4xMy4xMC4wMCNPaWxmaWVsZCBzcG9vbGluZyBzZXJ2aWNlcyM3MS4xMy4xMy4wMC4wMAotdW5zcHNjNyM3MS4xMy4xNC4wMC4wMCNXZWxsIHByb2R1Y3Rpb24gc2VydmljZXMjNzEuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTMuMTQuMDEuMDAjT2lsZmllbGQgZmxhcmUgc3lzdGVtIHNlcnZpY2VzIzcxLjEzLjE0LjAwLjAwCi11bnNwc2M3IzcxLjEzLjE0LjAyLjAwI09pbGZpZWxkIGhvdCBvaWwgb3Igd2F0ZXIgc2VydmljZSM3MS4xMy4xNC4wMC4wMAotdW5zcHNjNyM3MS4xMy4xNC4wMy4wMCNPaWxmaWVsZCBzdGVhbWluZyBzZXJ2aWNlcyM3MS4xMy4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNC4wMC4wMC4wMCNPaWwgYW5kIGdhcyByZXN0b3JhdGlvbiBhbmQgcmVjbGFtYXRpb24gc2VydmljZXMjNzEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTQuMTAuMDAuMDAjRW1lcmdlbmN5IHdlbGwgY29udHJvbCBzZXJ2aWNlcyM3MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNC4xMC4wMS4wMCNXZWxsIHByZXNzdXJlIGNvbnRyb2wgc2VydmljZXMjNzEuMTQuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTQuMTAuMDIuMDAjV2VsbCBjYXBwaW5nIHNlcnZpY2VzIzcxLjE0LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE0LjEwLjAzLjAwI1dlbGwgZmlyZSBmaWdodGluZyBzZXJ2aWNlcyM3MS4xNC4xMC4wMC4wMAotdW5zcHNjNyM3MS4xNC4xMC4wNC4wMCNXaWxkIHdlbGwgY29udHJvbCBzZXJ2aWNlcyM3MS4xNC4xMC4wMC4wMAotdW5zcHNjNyM3MS4xNC4xMS4wMC4wMCNXZWxsIHBsdWdnaW5nIGFuZCBhYmFuZG9ubWVudCBzZXJ2aWNlcyM3MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNC4xMS4wMS4wMCNXZWxsIGFiYW5kb25tZW50IHNlcnZpY2VzIzcxLjE0LjExLjAwLjAwCi11bnNwc2M3IzcxLjE0LjExLjAyLjAwI1dlbGwgcGx1Z2dpbmcgc2VydmljZXMjNzEuMTQuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTQuMTIuMDAuMDAjV2VsbCBzaXRlIHJlc3RvcmF0aW9uIzcxLjE0LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE0LjEyLjAxLjAwI1dlbGwgY2xlYW5pbmcgb3Igc3dhYmJpbmcgc2VydmljZXMjNzEuMTQuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTQuMTIuMDIuMDAjV2VsbCBzaXRlIHJlc3RvcmF0aW9uIHNlcnZpY2VzIzcxLjE0LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE1LjAwLjAwLjAwI09pbCBhbmQgZ2FzIGRhdGEgbWFuYWdlbWVudCBhbmQgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMC4wMC4wMCNPaWxmaWVsZCBkYXRhIGNvbW11bmljYXRpb24gc2VydmljZXMjNzEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTAuMDEuMDAjTG9nIGRhdGEgdHJhbnNtaXNzaW9uIHNlcnZpY2VzIzcxLjE1LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEwLjAyLjAwI0xvZyBncmFwaGljcyB0cmFuc21pc3Npb24gc2VydmljZXMjNzEuMTUuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTAuMDMuMDAjUmVhbCB0aW1lIHdlbGwgZGF0YSBtb25pdG9yaW5nIHNlcnZpY2VzIzcxLjE1LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEwLjA0LjAwI1NhdGVsbGl0ZSB3ZWxsIGRhdGEgdHJhbnNtaXNzaW9uIHNlcnZpY2VzIzcxLjE1LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEwLjA1LjAwI1dlbGwgZGF0YSB0cmFuc21pc3Npb24gc2VydmljZXMjNzEuMTUuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTEuMDAuMDAjT2lsZmllbGQgZGF0YSBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjExLjAxLjAwI09pbGZpZWxkIGFzc2V0IGRhdGEgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MS4xNS4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMS4wMi4wMCNPaWxmaWVsZCBkYXRhIG1pbmluZyBzZXJ2aWNlcyM3MS4xNS4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMS4wMy4wMCNMb2cgZGF0YSBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE1LjExLjAwLjAwCi11bnNwc2M3IzcxLjE1LjExLjA0LjAwI09pbGZpZWxkIG1hcHBpbmcgZGF0YSBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE1LjExLjAwLjAwCi11bnNwc2M3IzcxLjE1LjExLjA1LjAwI1NlaXNtaWMgZGF0YSBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE1LjExLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEyLjAwLjAwI09pbGZpZWxkIGVjb25vbWljIGFuZCByaXNrIG1vZGVsIHNlcnZpY2VzIzcxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEyLjAxLjAwI09pbGZpZWxkIGJ1ZGdldGluZyBzZXJ2aWNlcyM3MS4xNS4xMi4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMi4wMi4wMCNPaWxmaWVsZCBjYXBpdGFsIHBsYW5uaW5nIHNlcnZpY2VzIzcxLjE1LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEyLjAzLjAwI09pbGZpZWxkIGRlY2lzaW9uIHRyZWUgc2VydmljZXMjNzEuMTUuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMDAuMDAjT2lsZmllbGQgaW50ZXJwcmV0YXRpb24gc2VydmljZXMjNzEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMDEuMDAjT2lsZmllbGQgYnViYmxlIG1hcCBzZXJ2aWNlcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4wMi4wMCNPaWxmaWVsZCBjYXNlIHN0dWRpZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMDMuMDAjT2lsZmllbGQgZGVjbGluZSBhbmFseXNpcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4wNC4wMCNPaWxmaWVsZCBmaWVsZCBzdHVkaWVzIzcxLjE1LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEzLjA1LjAwI09pbGZpZWxkIGZyYWN0dXJpbmcgaW50ZXJwcmV0YXRpb24gc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMDYuMDAjR2VvbG9neSBzZXJ2aWNlcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4wNy4wMCNHZW9waHlzaWNzIHNlcnZpY2VzIzcxLjE1LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEzLjA4LjAwI0dyYXZlbCBwYWNrIGludGVycHJldGF0aW9uIHNlcnZpY2VzIzcxLjE1LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEzLjA5LjAwI09pbGZpZWxkIGdyaWQgbWFwcGluZyBzZXJ2aWNlcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4xMC4wMCNPaWxmaWVsZCBtYXBwaW5nIG9yIHZpc3VhbGl6YXRpb24gc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMTEuMDAjUGV0cm9waHlzaWNzIHNlcnZpY2VzIzcxLjE1LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE1LjEzLjEyLjAwI1Jlc2Vydm9pciBlbmdpbmVlcmluZyBzZXJ2aWNlcyM3MS4xNS4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNS4xMy4xMy4wMCNSZXNlcnZvaXIgbW9kZWxpbmcgc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMTQuMDAjUmVzZXJ2b2lyIHNpbXVsYXRpb24gc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTMuMTUuMDAjUm9jayBtZWNoYW5pY3Mgc2VydmljZXMjNzEuMTUuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTQuMDAuMDAjV2VsbCBzZXJ2aWNlIGVuZ2luZWVyaW5nIzcxLjE1LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE1LjE0LjAxLjAwI1dlbGwgY2VtZW50aW5nIGpvYiBkZXNpZ24gc2VydmljZXMjNzEuMTUuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTUuMTQuMDIuMDAjQ29pbGVkIHR1YmluZyBqb2IgZGVzaWduIHNlcnZpY2VzIzcxLjE1LjE0LjAwLjAwCi11bnNwc2M3IzcxLjE1LjE0LjAzLjAwI1dlbGwgZHJpbGxpbmcgam9iIGRlc2lnbiBzZXJ2aWNlcyM3MS4xNS4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNS4xNC4wNC4wMCNXZWxsIGZyYWN0dXJpbmcgam9iIGRlc2lnbiBzZXJ2aWNlcyM3MS4xNS4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNS4xNC4wNS4wMCNNYXRyaXggc3RpbXVsYXRpb24gam9iIGRlc2lnbiBzZXJ2aWNlcyM3MS4xNS4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNS4xNC4wNi4wMCNXZWxsIHNhbmQgY29udHJvbCBqb2IgZGVzaWduIHNlcnZpY2VzIzcxLjE1LjE0LjAwLjAwCi11bnNwc2M3IzcxLjE2LjAwLjAwLjAwI09pbCBhbmQgZ2FzIHdlbGwgcHJvamVjdCBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjAwLjAwI09pbGZpZWxkIE1vZGVsaW5nIFNlcnZpY2VzIzcxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjAxLjAwI09pbGZpZWxkIGNvbXBsZXRpb24gbW9kZWxzIzcxLjE2LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjAyLjAwI09pbGZpZWxkIGRyaWxsaW5nIG1vZGVscyM3MS4xNi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMC4wMy4wMCNPaWxmaWVsZCBlY29ub21pYyBtb2RlbHMjNzEuMTYuMTAuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTAuMDQuMDAjT2lsZmllbGQgZmllbGQgZGV2ZWxvcG1lbnQgbW9kZWxzIzcxLjE2LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjA1LjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gbW9kZWxzIzcxLjE2LjEwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEwLjA2LjAwI09pbGZpZWxkIHJpc2sgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MS4xNi4xMC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wMC4wMCNPaWxmaWVsZCBwcm9kdWN0aW9uIGVuZ2luZWVyaW5nIG1hbmFnZW1lbnQjNzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTEuMDEuMDAjT2lsZmllbGQgYXJ0aWZpY2lhbCBsaWZ0IHNlcnZpY2VzIzcxLjE2LjExLjAwLjAwCi11bnNwc2M3IzcxLjE2LjExLjAyLjAwI0VuaGFuY2VkIG9pbCByZWNvdmVyeSBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wMy4wMCNXZWxsIGluamVjdGlvbiBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wNC4wMCNPaWxmaWVsZCBub2RhbCBhbmFseXNpcyBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wNS4wMCNXZWxsIHBlcmZvcmF0aW9uIHNlcnZpY2VzIzcxLjE2LjExLjAwLjAwCi11bnNwc2M3IzcxLjE2LjExLjA2LjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gY2hlbWlzdHJ5IHNlcnZpY2VzIzcxLjE2LjExLjAwLjAwCi11bnNwc2M3IzcxLjE2LjExLjA3LjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4wOC4wMCNPaWxmaWVsZCBzYW5kIGNvbnRyb2wgc2VydmljZXMjNzEuMTYuMTEuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTEuMDkuMDAjV2VsbCBzdGltdWxhdGlvbiBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4xMC4wMCNVbmRlcmdyb3VuZCBnYXMgc3RvcmFnZSBzZXJ2aWNlcyM3MS4xNi4xMS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMS4xMS4wMCNPaWxmaWVsZCB3YXRlciBtYW5hZ2VtZW50IHNlcnZpY2VzIzcxLjE2LjExLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjAwLjAwI09pbGZpZWxkIHByb2R1Y3Rpb24gb3BlcmF0aW9ucyBtYW5hZ2VtZW50IzcxLjE2LjAwLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjAxLjAwI09pbGZpZWxkIGhvdCBvaWxpbmcgc2VydmljZSM3MS4xNi4xMi4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMi4wMi4wMCNPaWxmaWVsZCBsZWFzZSBvcGVyYXRpb25zIzcxLjE2LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjAzLjAwI09pbGZpZWxkIGxvZ2dpbmcgc2VydmljZXMjNzEuMTYuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTIuMDQuMDAjT2lsZmllbGQgcGFyYWZmaW4gY3V0dGluZyBzZXJ2aWNlIzcxLjE2LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjA1LjAwI09pbGZpZWxkIHBsYW5uaW5nIHNlcnZpY2VzIzcxLjE2LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEyLjA2LjAwI09pbGZpZWxkIHByb2Nlc3Npbmcgc2VydmljZXMjNzEuMTYuMTIuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTIuMDcuMDAjV2VsbCB0ZXN0aW5nIHNlcnZpY2VzIzcxLjE2LjEyLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEzLjAwLjAwI09pbGZpZWxkIHByb2plY3QgbWFuYWdlbWVudCBzZXJ2aWNlcyM3MS4xNi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMy4wMS4wMCNPaWxmaWVsZCBhdWRpdHMgb3IgaW5zcGVjdGlvbiBzZXJ2aWNlcyM3MS4xNi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMy4wMi4wMCNPaWxmaWVsZCBlbWVyZ2VuY3kgcmVzcG9uc2UgcGxhbm5pbmcgc2VydmljZXMjNzEuMTYuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTMuMDMuMDAjT2lsZmllbGQgZmllbGQgZGV2ZWxvcG1lbnQgc2VydmljZXMjNzEuMTYuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTMuMDQuMDAjT2lsZmllbGQgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyBzZXJ2aWNlcyM3MS4xNi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMy4wNS4wMCNPaWxmaWVsZCByZXBvcnRpbmcgc2VydmljZXMjNzEuMTYuMTMuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTMuMDYuMDAjT2lsZmllbGQgc3VjY2Vzc2lvbiBwbGFuIG9yIGhhbmRvdmVyIHNlcnZpY2VzIzcxLjE2LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE2LjEzLjA3LjAwI09pbGZpZWxkIHRyYWluaW5nIG1hdHJpeCBzZXJ2aWNlcyM3MS4xNi4xMy4wMC4wMAotdW5zcHNjNyM3MS4xNi4xMy4wOC4wMCNXZWxsIHNpdGUgbG9naXN0aWNzIG9yIHByb2N1cmVtZW50IHNlcnZpY2VzIzcxLjE2LjEzLjAwLjAwCi11bnNwc2M3IzcxLjE2LjE0LjAwLjAwI1dlbGwgY29uc3RydWN0aW9uIG1hbmFnZW1lbnQgc2VydmljZXMjNzEuMTYuMDAuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMDEuMDAjQ29pbGVkIHR1YmluZyBkcmlsbGluZyBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wMi4wMCNXZWxsIGNvbXBsZXRpb24gZW5naW5lZXJpbmcgc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMDMuMDAjRGVhZG1hbiBhbmNob3Igc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMDQuMDAjV2VsbCBkcmlsbGluZyBlbmdpbmVlcmluZyBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wNS4wMCNXZWxsIHNpdGUgcGl0IGxpbmluZyBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wNi4wMCNXZWxsIHBsdWcgb3IgYWJhbmRvbm1lbnQgc2VydmljZSM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wNy4wMCNXZWxsIHB1bGxpbmcgdW5pdCBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4wOC4wMCNTaG9yZWJhc2Ugc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMDkuMDAjVGVzdCBwaXQgbGluaW5nIHNlcnZpY2VzIzcxLjE2LjE0LjAwLjAwCi11bnNwc2M3IzcxLjE2LjE0LjEwLjAwI1dlbGwgc2l0ZSB2YWN1dW0gdHJ1Y2sgc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMTEuMDAjVW5kZXJiYWxhbmNlZCBhcHBsaWNhdGlvbnMgZW5naW5lZXJpbmcgc2VydmljZXMjNzEuMTYuMTQuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTQuMTIuMDAjV2VsbCB3b3Jrb3ZlciBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNC4xMy4wMCNXZWxsIGZhYnJpY2F0aW9uIG9yIGNvbnN0cnVjdGlvbiBzZXJ2aWNlcyM3MS4xNi4xNC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNS4wMC4wMCNXZWxsIHNpdGUgb3BlcmF0aW9ucyBzZXJ2aWNlcyM3MS4xNi4wMC4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNS4wMS4wMCNXZWxsIHNpdGUgZWxlY3RyaWNhbCBvciBpbnN0cnVtZW50YXRpb24gc2VydmljZXMjNzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTUuMDIuMDAjV2VsbCBzaXRlIGhlYXZ5IGVxdWlwbWVudCBvciBjcmFuZSBzZXJ2aWNlcyM3MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNS4wMy4wMCNXZWxsIHNpdGUgaW5zcGVjdGlvbiBvciBlcXVpcG1lbnQgdGVzdGluZyBzZXJ2aWNlcyM3MS4xNi4xNS4wMC4wMAotdW5zcHNjNyM3MS4xNi4xNS4wNC4wMCNXZWxsIHNpdGUgaW5zdHJ1bWVudCBhbmQgbWV0ZXIgc2VydmljZXMjNzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzEuMTYuMTUuMDUuMDAjV2VsbCBzaXRlIHZhbHZlIG9yIHZhbHZlIHBhcnQgc2VydmljZXMjNzEuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMDAuMDAuMDAuMDAjQnVpbGRpbmcgYW5kIENvbnN0cnVjdGlvbiBhbmQgTWFpbnRlbmFuY2UgU2VydmljZXMjNzIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMDAuMDAuMDAjQnVpbGRpbmcgY29uc3RydWN0aW9uIGFuZCBzdXBwb3J0IGFuZCBtYWludGVuYW5jZSBhbmQgcmVwYWlyIHNlcnZpY2VzIzcyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjE1LjAwLjAwI0J1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTUuMDEuMDAjSGFuZHltYW4gc2VydmljZXMjNzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTUuMDIuMDAjU2NhZmZvbGRpbmcgc2VydmljZXMjNzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTUuMDMuMDAjUmlnZ2luZyBzZXJ2aWNlcyM3Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xNS4wNC4wMCNEaXNhc3RlciBwcm9vZmluZyBvciBjb250aW5nZW5jeSBzZXJ2aWNlcyM3Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xNS4wNS4wMCNMb2Nrc21pdGggc2VydmljZXMjNzIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTYuMDAuMDAjUm9vZmluZyBhbmQgc2lkaW5nIGFuZCBzaGVldCBtZXRhbCB3b3JrIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjE2LjAxLjAwI1Jvb2ZpbmcgaW5zdGFsbGF0aW9uIG9yIHJlcGFpciM3Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xNi4wMi4wMCNTa3lsaWdodCBpbnN0YWxsYXRpb24jNzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTYuMDMuMDAjR3V0dGVyIG9yIGRvd25zcG91dCBzZXJ2aWNlcyM3Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xNi4wNC4wMCNBcmNoaXRlY3R1cmFsIHNoZWV0IG1ldGFsIHdvcmsjNzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTYuMDUuMDAjQ2VpbGluZyBlcmVjdGlvbiBvciByZXBhaXIjNzIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTYuMDYuMDAjQ2h1dGUgaW5zdGFsbGF0aW9uIzcyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE2LjA3LjAwI1NpZGluZyBpbnN0YWxsYXRpb24gb3IgcmVwYWlyIzcyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE3LjAwLjAwI0NvbmNyZXRlIHdvcmsjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTcuMDEuMDAjRXh0ZXJpb3IgY29uY3JldGUgb3Igc3R1Y2NvIHNlcnZpY2VzIzcyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE3LjAyLjAwI0dyb3V0aW5nIHNlcnZpY2VzIzcyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE3LjAzLjAwI1NpZGV3YWxrIG9yIGN1cmIgY29uc3RydWN0aW9uIzcyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE3LjA0LjAwI0ZvdW5kYXRpb24gb3Igc2xhYiB3b3JrIzcyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE4LjAwLjAwI0V4dGVyaW9yIGNsZWFuaW5nIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjE4LjAxLjAwI1NhbmRibGFzdGluZyM3Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xOC4wMi4wMCNIaWdoIHByZXNzdXJlIHdhdGVyIGJsYXN0aW5nIzcyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE4LjAzLjAwI1N0ZWFtIGNsZWFuaW5nIzcyLjEwLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEwLjE5LjAwLjAwI0ludGVyaW9yIGZpbmlzaGluZyM3Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xOS4wMS4wMCNJbnRlcmlvciBkZXNpZ24gb3IgZGVjb3JhdGluZyM3Mi4xMC4xOS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4xOS4wMi4wMCNQbGFzdGVyaW5nIG9yIGRyeXdhbGwjNzIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMTkuMDMuMDAjRmluaXNoIGNhcnBlbnRyeSBvciBjYWJpbmV0cnkjNzIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDAuMDAjQ29hdGluZyBhbmQgY2F1bGtpbmcgYW5kIHdlYXRoZXIgYW5kIHdhdGVyIGFuZCBmaXJlcHJvb2ZpbmcjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDEuMDAjQ2F1bGtpbmcjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDIuMDAjUGxhc3RpYyBlbmNhc2VtZW50IG9yIGNvYXRpbmcgb2Ygc3RydWN0dXJhbCBtYXRlcmlhbHMjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDMuMDAjQ29hdGluZyBvciBnbGF6aW5nIG9mIG1ldGFsIG9yIHdvb2Qgb3IgY29uY3JldGUgc3RydWN0dXJhbCBtYXRlcmlhbHMjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDQuMDAjRGFtcHByb29maW5nIzcyLjEwLjIwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIwLjA1LjAwI0ZpcmVwcm9vZmluZyBvZiBidWlsZGluZ3MjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjAuMDYuMDAjV3JhcHBpbmcgb2YgcGlwZXMjNzIuMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjEuMDAuMDAjUGVzdCBjb250cm9sIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIxLjAxLjAwI0JpcmQgcHJvb2Zpbmcgc2VydmljZXMjNzIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjEuMDIuMDAjVGVybWl0ZSBjb250cm9sIHNlcnZpY2VzIzcyLjEwLjIxLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIxLjAzLjAwI0V4dGVybWluYXRpb24gb3IgZnVtaWdhdGlvbiBzZXJ2aWNlcyM3Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMS4wNC4wMCNTdHJ1Y3R1cmFsIHBlc3QgY29udHJvbCM3Mi4xMC4yMS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMS4wNS4wMCNBbmltYWwgdHJhcHBpbmcjNzIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjEuMDYuMDAjUm9kZW50IGNvbnRyb2wjNzIuMTAuMjEuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjIuMDAuMDAjRWxlY3RyaWNhbCBzZXJ2aWNlcyM3Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMi4wMS4wMCNFbGVjdHJpYyBwb3dlciBzeXN0ZW1zIGluc3RhbGxhdGlvbiBvciBzZXJ2aWNlIzcyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIyLjAyLjAwI0VsZWN0cm9uaWMgY29udHJvbHMgaW5zdGFsbGF0aW9uIzcyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIyLjAzLjAwI0NvbW11bmljYXRpb24gZXF1aXBtZW50IGluc3RhbGxhdGlvbiM3Mi4xMC4yMi4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMi4wNC4wMCNTYWZldHkgb3Igc2VjdXJpdHkgc3lzdGVtcyBpbnN0YWxsYXRpb24jNzIuMTAuMjIuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjIuMDUuMDAjQ2FibGluZyBzZXJ2aWNlIzcyLjEwLjIyLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIzLjAwLjAwI1BsdW1iaW5nIGFuZCBoZWF0aW5nIGFuZCBhaXIgY29uZGl0aW9uaW5nIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIzLjAxLjAwI0JvaWxlciBpbnN0YWxsYXRpb24gb3IgYWRqdXN0bWVudCBvciBtYWludGVuYW5jZSBvciByZXBhaXIgc2VydmljZXMjNzIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjMuMDIuMDAjSGVhdGluZyBzeXN0ZW1zIGluc3RhbGxhdGlvbiByZXBhaXIgb3IgbWFpbnRlbmFuY2UjNzIuMTAuMjMuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjMuMDMuMDAjUGx1bWJpbmcgc3lzdGVtIGNvbnN0cnVjdGlvbiM3Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yMy4wNC4wMCNQbHVtYmluZyBzeXN0ZW0gbWFpbnRlbmFuY2Ugb3IgcmVwYWlyIzcyLjEwLjIzLjAwLjAwCi11bnNwc2M3IzcyLjEwLjIzLjA1LjAwI0FpciBjb25kaXRpb25pbmcgaW5zdGFsbGF0aW9uIG9yIG1haW50ZW5hbmNlIG9yIHJlcGFpciBzZXJ2aWNlcyM3Mi4xMC4yMy4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNC4wMC4wMCNQYWludGluZyBhbmQgcGFwZXIgaGFuZ2luZyM3Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNC4wMS4wMCNFeHRlcmlvciBwYWludGluZyBzZXJ2aWNlcyM3Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNC4wMi4wMCNJbnRlcmlvciBwYWludGluZyBzZXJ2aWNlcyM3Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNC4wMy4wMCNXYWxsY292ZXJpbmcgc2VydmljZXMjNzIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjQuMDQuMDAjSW5kdXN0cmlhbCBvciBzcGVjaWFsaXplZCBwYWludCBhcHBsaWNhdGlvbiBmb3IgYWlyY3JhZnQgb3Igc2hpcCBvciBicmlkZ2UjNzIuMTAuMjQuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjQuMDUuMDAjUGF2ZW1lbnQgbWFya2luZyBzZXJ2aWNlcyM3Mi4xMC4yNC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNS4wMC4wMCNNYXNvbnJ5IGFuZCBzdG9uZXdvcmsgYW5kIHRpbGUgc2V0dGluZyM3Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNS4wMS4wMCNCcmlja2xheWluZyM3Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNS4wMi4wMCNDaGltbmV5IGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNS4wMy4wMCNNYXJibGUgb3Igc3RvbmUgb3IgdGlsZSBpbnN0YWxsYXRpb24jNzIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjUuMDQuMDAjUmV0YWluaW5nIHdhbGwgY29uc3RydWN0aW9uIzcyLjEwLjI1LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI1LjA1LjAwI0ZyZXNjbyB3b3JrIzcyLjEwLjI1LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI1LjA2LjAwI0Fjb3VzdGljYWwjNzIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjUuMDcuMDAjSW5zdWxhdGluZyBtYXRlcmlhbCBpbnN0YWxsYXRpb24jNzIuMTAuMjUuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjUuMDguMDAjUmVzdG9yYXRpb24gb2YgbWFzb25yeSBvciBzdG9uZXdvcmsgb3IgdGlsZSM3Mi4xMC4yNS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNi4wMC4wMCNDYXJwZW50cnkjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjYuMDEuMDAjUm91Z2ggY2FycGVudHJ5IzcyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI2LjAyLjAwI1dpbmRvd3Mgb3IgZG9vciBvciBmaXh0dXJlIGluc3RhbGxhdGlvbiM3Mi4xMC4yNi4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNi4wMy4wMCNGdXJuaXR1cmUgaW5zdGFsbGF0aW9uIzcyLjEwLjI2LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI3LjAwLjAwI0Zsb29yaW5nIHNlcnZpY2UjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjcuMDEuMDAjRmxvb3Igc2hlYXRoaW5nIG9yIGxheWluZyBvciBpbnN0YWxsYXRpb24gb3IgZmluaXNoaW5nIzcyLjEwLjI3LjAwLjAwCi11bnNwc2M3IzcyLjEwLjI3LjAyLjAwI0Zsb29yIGNvdmVyaW5nIGluc3RhbGxhdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yNy4wMy4wMCNGbG9vciBjbGVhbmluZyBzZXJ2aWNlcyM3Mi4xMC4yNy4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yOC4wMC4wMCNSZWZ1cmJpc2hpbmcgc2VydmljZXMjNzIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMjguMDEuMDAjUmVub3ZhdGlvbiBvZiBidWlsZGluZ3Mgb3IgbGFuZG1hcmtzIG9yIG1vbnVtZW50cyM3Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yOC4wMi4wMCNSZXN0b3JhdGlvbiBvZiBidWlsZGluZ3Mgb3IgbGFuZG1hcmtzIG9yIG1vbnVtZW50cyM3Mi4xMC4yOC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yOS4wMC4wMCNHcm91bmRzIG1haW50ZW5hbmNlIHNlcnZpY2VzIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjI5LjAxLjAwI1Nub3cgUmVtb3ZhbCBTZXJ2aWNlcyM3Mi4xMC4yOS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4yOS4wMi4wMCNMYW5kc2NhcGluZyBzZXJ2aWNlcyM3Mi4xMC4yOS4wMC4wMAotdW5zcHNjNyM3Mi4xMC4zMC4wMC4wMCNTaXRlIHByZXBhcmF0aW9uIHNlcnZpY2VzIzcyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEwLjMwLjAxLjAwI0xhbmQgY2xlYXJpbmcgc2VydmljZXMjNzIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMzAuMDIuMDAjTGFuZCBsZXZlbGxpbmcgc2VydmljZXMjNzIuMTAuMzAuMDAuMDAKLXVuc3BzYzcjNzIuMTAuMzAuMDMuMDAjRGVtb2xpdGlvbiBzZXJ2aWNlcyM3Mi4xMC4zMC4wMC4wMAotdW5zcHNjNyM3Mi4xMC4zMC4wNC4wMCNEaWdnaW5nIHNlcnZpY2VzIzcyLjEwLjMwLjAwLjAwCi11bnNwc2M3IzcyLjExLjAwLjAwLjAwI0dlbmVyYWwgYnVpbGRpbmcgY29uc3RydWN0aW9uIzcyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjExLjE1LjAwLjAwI1ByaXZhdGUgaG91c2luZyM3Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMS4xNS4wMS4wMCNTaW5nbGUgZmFtaWx5IGhvdXNpbmcgY29uc3RydWN0aW9uIG9yIHJlbW9kZWxpbmcgb3IgcmVwYWlyIzcyLjExLjE1LjAwLjAwCi11bnNwc2M3IzcyLjExLjE1LjAyLjAwI1Jlc2lkZW50aWFsIG11bHRpIHRlbmFudCBjb25zdHJ1Y3Rpb24gb3IgcmVtb2RlbGluZyBvciByZXBhaXIjNzIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTYuMDAuMDAjSW5kdXN0cmlhbCBwbGFudHMjNzIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTYuMDEuMDAjQ29tbWVyY2lhbCBvZmZpY2UgYnVpbGRpbmcgY29uc3RydWN0aW9uIG9yIHJlbW9kZWxpbmcgb3IgcmVub3ZhdGlvbiBvciByZXBhaXIjNzIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTYuMDIuMDAjSW5kdXN0cmlhbCBidWlsZGluZ3Mgb3Igd2FyZWhvdXNlIGNvbnN0cnVjdGlvbiBvciByZW1vZGVsaW5nIG9yIHJlbm92YXRpb24gb3IgcmVwYWlyIzcyLjExLjE2LjAwLjAwCi11bnNwc2M3IzcyLjExLjE3LjAwLjAwI1B1YmxpYyB1c2UgYnVpbGRpbmdzIzcyLjExLjAwLjAwLjAwCi11bnNwc2M3IzcyLjExLjE3LjAxLjAwI1NwZWNpYWxpemVkIHB1YmxpYyB1c2UgYnVpbGRpbmcgY29uc3RydWN0aW9uIzcyLjExLjE3LjAwLjAwCi11bnNwc2M3IzcyLjExLjE3LjAyLjAwI05vbiByZXNpZGVudGlhbCBhZ3JpY3VsdHVyYWwgYnVpbGRpbmcgY29uc3RydWN0aW9uIzcyLjExLjE3LjAwLjAwCi11bnNwc2M3IzcyLjExLjE3LjAzLjAwI1NlcnZpY2Ugc3RhdGlvbiBvciBzZXJ2aWNlIGdhcmFnZSBjb25zdHJ1Y3Rpb24jNzIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTcuMDQuMDAjQ29tbWVyY2lhbCBidWlsZGluZyBjb25zdHJ1Y3Rpb24gb3IgZXJlY3Rpb24gb3IgcmVub3ZhdGlvbiBvciByZXBhaXIjNzIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTguMDAuMDAjQ29tbWVyY2lhbCBidWlsZGluZ3MjNzIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTguMDEuMDAjUmVzdGF1cmFudCBjb25zdHJ1Y3Rpb24gb3IgcmVub3ZhdGlvbiBvciByZXBhaXIgb3IgbWFpbnRlbmFuY2UjNzIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTguMDIuMDAjU2hvcHBpbmcgY2VudGVyIG9yIHN0b3JlIGNvbnN0cnVjdGlvbiBvciByZW5vdmF0aW9uIG9yIHJlcGFpciBvciBtYWludGVuYW5jZSM3Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM3Mi4xMS4xOC4wMy4wMCNPZmZpY2UgYnVpbGRpbmcgY29uc3RydWN0aW9uIG9yIHJlbm92YXRpb24gb3IgcmVwYWlyIG9yIG1haW50ZW5hbmNlIzcyLjExLjE4LjAwLjAwCi11bnNwc2M3IzcyLjExLjE4LjA0LjAwI0JhdGhyb29tIHJlbm92YXRpb24jNzIuMTEuMTguMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTkuMDAuMDAjTGFuZCBhbmQgYnVpbGRpbmcgc2l0ZSBwcmVwYXJhdGlvbiM3Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMS4xOS4wMS4wMCNMYW5kIGNsZWFyaW5nIzcyLjExLjE5LjAwLjAwCi11bnNwc2M3IzcyLjExLjE5LjAyLjAwI0xhbmQgbGV2ZWxpbmcjNzIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTEuMTkuMDMuMDAjQnVpbGRpbmcgZGVtb2xpdGlvbiM3Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM3Mi4xMi4wMC4wMC4wMCNJbmZyYXN0cnVjdHVyZSBjb25zdHJ1Y3Rpb24gYW5kIG1haW50ZW5hbmNlIzcyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjE1LjAwLjAwI0hpZ2h3YXlzIGFuZCBzdHJlZXRzIzcyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjE1LjAxLjAwI0hpZ2h3YXkgb3Igc3RyZWV0IG9yIHJvYWQgY29uc3RydWN0aW9uIzcyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE1LjAyLjAwI0hpZ2h3YXkgb3Igc3RyZWV0IG9yIHJvYWQgc3VyZmFjaW5nIG9yIHBhdmluZyBvciBtYWludGVuYW5jZSM3Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNS4wMy4wMCNIaWdod2F5IG9yIHN0cmVldCBndWFyZHJhaWwgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE1LjA0LjAwI0hpZ2h3YXkgb3Igc3RyZWV0IHNpZ24gb3IgdHJhZmZpYyBzaWduYWwgaW5zdGFsbGF0aW9uIzcyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE2LjAwLjAwI1dhdGVyIGFuZCBzZXdlciBhbmQgdXRpbGl0eSBsaW5lcyM3Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNi4wMS4wMCNFbGVjdHJpYyBwb3dlciBsaW5lIGNvbnN0cnVjdGlvbiBvciBpbnN0YWxsYXRpb24jNzIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMTYuMDIuMDAjQ2FibGUgbGF5aW5nIzcyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE2LjAzLjAwI0FxdWVkdWN0IGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNi4wNC4wMCNTZXdlciBsaW5lIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNi4wNS4wMCNXYXRlciBtYWluIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNi4wNi4wMCNWb2ljZSBvciBkYXRhIGxpbmUgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE2LjA3LjAwI1dhdGVyIGluZHVzdHJpYWwgcGxhbnQgY29uc3RydWN0aW9uIzcyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE3LjAwLjAwI0RhbXMgYW5kIG1hcmluZSBjb25zdHJ1Y3Rpb24jNzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMTcuMDEuMDAjRGFtIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNy4wMi4wMCNQaWVyIG9yIGRvY2sgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE3LjAzLjAwI0hhcmJvciBvciBicmVha3dhdGVyIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNy4wNC4wMCNEeWtlIG9yIGxldmVlIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNy4wNS4wMCNEcmVkZ2luZyBvciBjYWlzc29uIGRyaWxsaW5nIzcyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE3LjA2LjAwI0NhbmFsIG9yIGRyYWluYWdlIG9yIGlycmlnYXRpb24gc3lzdGVtIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xNy4wNy4wMCNQb25kIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xOC4wMC4wMCNSYWlscm9hZHMgYW5kIHN1YndheXMgYW5kIHRyYW13YXlzIzcyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjE4LjAxLjAwI0N1dHRpbmcgb2YgcmlnaHQgb2Ygd2F5IzcyLjEyLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE4LjAyLjAwI1JhaWxyb2FkIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4xOC4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xOC4wMy4wMCNTdWJ3YXkgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE4LjA0LjAwI1RyYW0gY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjE4LjAwLjAwCi11bnNwc2M3IzcyLjEyLjE5LjAwLjAwI0FpcnBvcnRzIGFuZCBhdmlhdGlvbiM3Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM3Mi4xMi4xOS4wMS4wMCNBaXJwb3J0IHJ1bndheSBjb25zdHJ1Y3Rpb24jNzIuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMTkuMDIuMDAjQWlycG9ydCB0ZXJtaW5hbCBjb25zdHJ1Y3Rpb24jNzIuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMTkuMDMuMDAjSGVsaXBhZCBjb25zdHJ1Y3Rpb24jNzIuMTIuMTkuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjAuMDAuMDAjQnJpZGdlcyBhbmQgdHVubmVscyBhbmQgdmlhZHVjdHMjNzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjAuMDEuMDAjQnJpZGdlIGNvbnN0cnVjdGlvbiBvciBtYWludGVuYW5jZSM3Mi4xMi4yMC4wMC4wMAotdW5zcHNjNyM3Mi4xMi4yMC4wMi4wMCNUdW5uZWwgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjIwLjAzLjAwI1ZpYWR1Y3QgY29uc3RydWN0aW9uIG9yIG1haW50ZW5hbmNlIzcyLjEyLjIwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjIxLjAwLjAwI0NvbnN0cnVjdGlvbiBxdWFudGl0eSBzdXJ2ZXlvcnMjNzIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjEuMDEuMDAjV2F0ZXIgb3Igd2FzdGV3YXRlciBxdWFudGl0eSBzdXJ2ZXlvcnMjNzIuMTIuMjEuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjIuMDAuMDAjQ29uc3RydWN0aW9uIGNvbnN1bHRhbmN5IHNlcnZpY2VzIzcyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzcyLjEyLjIyLjAxLjAwI1NpdGUgc3VwZXJ2aXNpb24jNzIuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNzIuMTIuMjIuMDIuMDAjSW5kdXN0cmlhbCBwbGFudCBkZXNpZ24jNzIuMTIuMjIuMDAuMDAKLXVuc3BzYzcjNzMuMDAuMDAuMDAuMDAjSW5kdXN0cmlhbCBQcm9kdWN0aW9uIGFuZCBNYW51ZmFjdHVyaW5nIFNlcnZpY2VzIzczLjAwLjAwLjAwLjAwCi11bnNwc2M3IzczLjEwLjAwLjAwLjAwI1BsYXN0aWMgYW5kIGNoZW1pY2FsIGluZHVzdHJpZXMjNzMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTUuMDAuMDAjUGV0cm9jaGVtaWNhbCBhbmQgcGxhc3RpYyBwcm9kdWN0aW9uIzczLjEwLjAwLjAwLjAwCi11bnNwc2M3IzczLjEwLjE1LjAxLjAwI1BldHJvbGV1bSByZWZpbmluZyBzZXJ2aWNlcyM3My4xMC4xNS4wMC4wMAotdW5zcHNjNyM3My4xMC4xNS4wMi4wMCNOYXR1cmFsIGdhcyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE1LjAwLjAwCi11bnNwc2M3IzczLjEwLjE1LjAzLjAwI09pbHMgb3IgZ3JlYXNlcyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE1LjAwLjAwCi11bnNwc2M3IzczLjEwLjE1LjA0LjAwI0NvYWwgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNS4wMC4wMAotdW5zcHNjNyM3My4xMC4xNS4wNS4wMCNQbGFzdGljcyBvciByZXNpbnMgb3IgZmliZXJzIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTUuMDYuMDAjQ3JlZGl0IGNhcmQgcHJvZHVjdGlvbiBvciBlbWJvc3Npbmcgc2VydmljZXMjNzMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMDAuMDAjQ2hlbWljYWxzIGFuZCBmZXJ0aWxpemVycyBwcm9kdWN0aW9uIzczLjEwLjAwLjAwLjAwCi11bnNwc2M3IzczLjEwLjE2LjAxLjAwI0lub3JnYW5pYyBjaGVtaWNhbHMgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wMi4wMCNTb2RhIGFzaCBvciBjaGxvcmluZSBvciBjYXVzdGljIHNvZGEgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wMy4wMCNJbm9yZ2FuaWMgYWNpZHMgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wNC4wMCNPcmdhbmljIGNoZW1pY2FsIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMDUuMDAjQWNldHlsZW5lIG9yIGRlcml2YXRpdmVzIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMDYuMDAjRXRoeWxlbmUgb3IgZGVyaXZhdGl2ZXMgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wNy4wMCNFdGhhbm9sIG9yIG1ldGhhbm9sIG9yIGRlcml2YXRpdmVzIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMDguMDAjRmVydGlsaXplcnMgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNi4wMC4wMAotdW5zcHNjNyM3My4xMC4xNi4wOS4wMCNQb3Rhc2ggbWluaW5nIG9yIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMTAuMDAjUGVzdGljaWRlIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTYuMTEuMDAjUGFpbnRzIG9yIHZhcm5pc2hlcyBvciBsYWNxdWVycyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE2LjAwLjAwCi11bnNwc2M3IzczLjEwLjE2LjEyLjAwI1NvYXAgb3IgY2xlYW5pbmcgcHJlcGFyYXRpb25zIG9yIHBlcmZ1bWVzIG9yIGNvc21ldGljcyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE2LjAwLjAwCi11bnNwc2M3IzczLjEwLjE2LjEzLjAwI1NvbHZlbnRzIG9yIGdseWNvbHMgb3IgZGV0ZXJnZW50cyBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE2LjAwLjAwCi11bnNwc2M3IzczLjEwLjE2LjE0LjAwI0Zlcm1lbnRzIG9yIGVuenltZXMgc2VydmljZXMjNzMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTcuMDAuMDAjUGhhcm1hY2V1dGljYWwgcHJvZHVjdGlvbiM3My4xMC4wMC4wMC4wMAotdW5zcHNjNyM3My4xMC4xNy4wMS4wMCNEcnVncyBvciBtZWRpY2luZSBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjEwLjE3LjAwLjAwCi11bnNwc2M3IzczLjEwLjE3LjAyLjAwI1ZhY2NpbmVzIG9yIHNlcmEgb3IgYW50aWJpb3RpY3MgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNy4wMC4wMAotdW5zcHNjNyM3My4xMC4xNy4wMy4wMCNQYXJhcGhhcm1hY2V1dGljYWwgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xNy4wMC4wMAotdW5zcHNjNyM3My4xMC4xOC4wMC4wMCNCaW9jaGVtaWNhbCBhbmQgYmlvdGVjaG5vbG9neSBwcm9kdWN0aW9uIzczLjEwLjAwLjAwLjAwCi11bnNwc2M3IzczLjEwLjE4LjAxLjAwI0Jpb21hc3MgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xOC4wMC4wMAotdW5zcHNjNyM3My4xMC4xOC4wMi4wMCNCaW9wcm90ZWluIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTkuMDAuMDAjUnViYmVyIHByb2R1Y3Rpb24jNzMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTkuMDEuMDAjUnViYmVyIG1pbGxpbmcgc2VydmljZXMjNzMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTkuMDIuMDAjUnViYmVyIHRpcmVzIG9yIHR1YmVzIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTAuMTkuMDMuMDAjUnViYmVyIG9yIHBsYXN0aWMgZm9vdHdlYXIgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMC4xOS4wMC4wMAotdW5zcHNjNyM3My4xMS4wMC4wMC4wMCNXb29kIGFuZCBwYXBlciBpbmR1c3RyaWVzIzczLjAwLjAwLjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjAwLjAwI1dvb2QgcHJvY2Vzc2luZyM3My4xMS4wMC4wMC4wMAotdW5zcHNjNyM3My4xMS4xNS4wMS4wMCNTYXdtaWxsaW5nIHNlcnZpY2VzIzczLjExLjE1LjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjAyLjAwI1ZlbmVlciBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjExLjE1LjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjAzLjAwI1dvb2QgYmFzZSBwYW5lbHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xMS4xNS4wMC4wMAotdW5zcHNjNyM3My4xMS4xNS4wNC4wMCNXb29kZW4gY29udGFpbmVycyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjExLjE1LjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjA1LjAwI0Z1cm5pdHVyZSBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjExLjE1LjAwLjAwCi11bnNwc2M3IzczLjExLjE1LjA2LjAwI0NvcmsgcHJvZHVjdHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xMS4xNS4wMC4wMAotdW5zcHNjNyM3My4xMS4xNS4wNy4wMCNDYW5lIG9yIHdpY2tlcndhcmUgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMS4xNS4wMC4wMAotdW5zcHNjNyM3My4xMS4xNi4wMC4wMCNQdWxwIGFuZCBwYXBlciBwcm9jZXNzaW5nIzczLjExLjAwLjAwLjAwCi11bnNwc2M3IzczLjExLjE2LjAxLjAwI1B1bHAgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMS4xNi4wMC4wMAotdW5zcHNjNyM3My4xMS4xNi4wMi4wMCNQYXBlciBvciBwYXBlciBib2FyZCBwcm9kdWN0aW9uIHNlcnZpY2VzIzczLjExLjE2LjAwLjAwCi11bnNwc2M3IzczLjExLjE2LjAzLjAwI0hhcmRib2FyZCBvciBmaWJlcmJvYXJkIHByb2R1Y3Rpb24gc2VydmljZXMjNzMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTEuMTYuMDQuMDAjUGFwZXIgcHJvZHVjdGlvbiBvciByZWN5Y2xpbmcgc2VydmljZXMjNzMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMDAuMDAuMDAjTWV0YWwgYW5kIG1pbmVyYWwgaW5kdXN0cmllcyM3My4wMC4wMC4wMC4wMAotdW5zcHNjNyM3My4xMi4xNS4wMC4wMCNNZXRhbCBzbWVsdGluZyBhbmQgcmVmaW5pbmcgYW5kIGZvcm1pbmcgcHJvY2Vzc2VzIzczLjEyLjAwLjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjAxLjAwI0ZlcnJvdXMgYWxsb3kgcHJvZHVjdGlvbiBzZXJ2aWNlcyM3My4xMi4xNS4wMC4wMAotdW5zcHNjNyM3My4xMi4xNS4wMi4wMCNCYXNpYyBtZXRhbCBjb21iaW5hdGlvbiBwcm9jZXNzZXMgc2VydmljZXMjNzMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTUuMDMuMDAjUmVmcmFjdG9ycyBzZXJ2aWNlcyBmb3IgaXJvbiBvciBzdGVlbCBwcm9kdWN0aW9uIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA0LjAwI0lyb24gb3Igc3RlZWwgbWFraW5nIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA1LjAwI0lyb24gb3Igc3RlZWwgZm9yZ2luZyBzZXJ2aWNlcyM3My4xMi4xNS4wMC4wMAotdW5zcHNjNyM3My4xMi4xNS4wNi4wMCNQcmUgZmluaXNoaW5nIGlyb24gb3Igc3RlZWwgcHJvY2Vzc2VzIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA3LjAwI0ZpbmlzaGluZyBtZXRhbCBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA4LjAwI1NtZWx0aW5nIG1ldGFsIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE1LjA5LjAwI1JlZmluaW5nIG1ldGFsIHNlcnZpY2VzIzczLjEyLjE1LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjAwLjAwI01ldGFsIGZpbmlzaGluZyM3My4xMi4wMC4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wMS4wMCNNZXRhbCBjdXR0aW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjAyLjAwI0JsYWNrc21pdGggc2VydmljZXMjNzMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTYuMDMuMDAjTWV0YWwgaGVhdGluZyBzZXJ2aWNlcyM3My4xMi4xNi4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wNC4wMCNNZXRhbCBwbGF0aW5nIG9yIHJlcGxhdGluZyBzZXJ2aWNlcyM3My4xMi4xNi4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wNS4wMCNNZXRhbCByb2xsaW5nIG9wZXJhdGlvbnMjNzMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTYuMDYuMDAjTWV0YWwgZm9yZ2luZyBzZXJ2aWNlcyM3My4xMi4xNi4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wNy4wMCNNZXRhbCBkcmF3aW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjA4LjAwI01ldGFsIGV4dHJ1ZGluZyBzZXJ2aWNlcyM3My4xMi4xNi4wMC4wMAotdW5zcHNjNyM3My4xMi4xNi4wOS4wMCNTdXJmYWNlIG1ldGFsIGZpbmlzaGluZyBvciB0cmVhdG1lbnQgc2VydmljZXMjNzMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTYuMTAuMDAjSG9yc2VzaG9laW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjExLjAwI1RpbnNtaXRoaW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjEyLjAwI1JlYmFiYml0aW5nIHNlcnZpY2VzIzczLjEyLjE2LjAwLjAwCi11bnNwc2M3IzczLjEyLjE2LjEzLjAwI01ldGFsIGNhc3Rpbmcgc2VydmljZXMjNzMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTcuMDAuMDAjV2VsZGluZyBhbmQgYnJhemluZyBhbmQgc29sZGVyaW5nIzczLjEyLjAwLjAwLjAwCi11bnNwc2M3IzczLjEyLjE3LjAxLjAwI1dlbGRpbmcgc2VydmljZXMjNzMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTcuMDIuMDAjQnJhemluZyBzZXJ2aWNlcyM3My4xMi4xNy4wMC4wMAotdW5zcHNjNyM3My4xMi4xNy4wMy4wMCNTb2xkZXJpbmcgc2VydmljZXMjNzMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTcuMDQuMDAjQ2FzdGluZyBzZXJ2aWNlcyM3My4xMi4xNy4wMC4wMAotdW5zcHNjNyM3My4xMi4xOC4wMC4wMCNOb24gbWV0YWxsaWMgbWluZXJhbCBwcm9kdWN0cyBpbmR1c3RyeSBzZXJ2aWNlcyM3My4xMi4wMC4wMC4wMAotdW5zcHNjNyM3My4xMi4xOC4wMS4wMCNQb3R0ZXJ5IG9yIGNoaW5hIG9yIGVhcnRoZW53YXJlIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTguMDIuMDAjR2xhc3Mgb3IgZ2xhc3MgcHJvZHVjdHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xMi4xOC4wMC4wMAotdW5zcHNjNyM3My4xMi4xOC4wMy4wMCNTdHJ1Y3R1cmFsIGNsYXkgcHJvZHVjdHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xMi4xOC4wMC4wMAotdW5zcHNjNyM3My4xMi4xOC4wNC4wMCNDZW1lbnQgb3IgbGltZSBvciBwbGFzdGVyIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTIuMTguMDUuMDAjQ29uY3JldGUgb3IgYWdncmVnYXRlcyBvciBzdG9uZSBwcm9kdWN0cyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjEyLjE4LjAwLjAwCi11bnNwc2M3IzczLjEyLjE4LjA2LjAwI0FicmFzaXZlcyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjEyLjE4LjAwLjAwCi11bnNwc2M3IzczLjEyLjE4LjA3LjAwI0FzYmVzdG9zIHByb2R1Y3RzIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTIuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTMuMDAuMDAuMDAjRm9vZCBhbmQgYmV2ZXJhZ2UgaW5kdXN0cmllcyM3My4wMC4wMC4wMC4wMAotdW5zcHNjNyM3My4xMy4xNS4wMC4wMCNCZXZlcmFnZSBwcm9jZXNzaW5nIzczLjEzLjAwLjAwLjAwCi11bnNwc2M3IzczLjEzLjE1LjAxLjAwI1NwaXJpdHMgZGlzdGlsbGluZyBvciBibGVuZGluZyBzZXJ2aWNlcyM3My4xMy4xNS4wMC4wMAotdW5zcHNjNyM3My4xMy4xNS4wMi4wMCNXaW5lIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTUuMDMuMDAjQnJld2VyeSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE1LjAwLjAwCi11bnNwc2M3IzczLjEzLjE1LjA0LjAwI05vbiBhbGNvaG9saWMgZnJ1aXQgYmFzZWQgYmV2ZXJhZ2UgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xNS4wMC4wMAotdW5zcHNjNyM3My4xMy4xNS4wNS4wMCNXYXRlciBiZXZlcmFnZXMgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xNS4wMC4wMAotdW5zcHNjNyM3My4xMy4xNS4wNi4wMCNJbmZ1c2VkIGJldmVyYWdlcyBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE1LjAwLjAwCi11bnNwc2M3IzczLjEzLjE1LjA3LjAwI0NvZmZlZSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE1LjAwLjAwCi11bnNwc2M3IzczLjEzLjE1LjA4LjAwI1RlYSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE1LjAwLjAwCi11bnNwc2M3IzczLjEzLjE2LjAwLjAwI01lYXQgYW5kIHBvdWx0cnkgYW5kIHNlYWZvb2QgcHJvY2Vzc2luZyM3My4xMy4wMC4wMC4wMAotdW5zcHNjNyM3My4xMy4xNi4wMS4wMCNNZWF0IHByb2R1Y3RzIG9yIGJ5IHByb2R1Y3RzIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTYuMDIuMDAjRmlzaCBvciBmaXNoIHByb2R1Y3RzIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTYuMDMuMDAjUG91bHRyeSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE2LjAwLjAwCi11bnNwc2M3IzczLjEzLjE2LjA0LjAwI01lYXQgaHlnaWVuZSBvciBpbnNwZWN0aW9uIHNlcnZpY2VzIzczLjEzLjE2LjAwLjAwCi11bnNwc2M3IzczLjEzLjE2LjA1LjAwI01lYXQgcGxhbnQgb3BlcmF0aW9uIG9yIG1hbmFnZW1lbnQgc2VydmljZXMjNzMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTYuMDYuMDAjU2xhdWdodGVyIGhvdXNlcyBzZXJ2aWNlcyM3My4xMy4xNi4wMC4wMAotdW5zcHNjNyM3My4xMy4xNi4wNy4wMCNCdXRjaGVyIHNlcnZpY2VzIzczLjEzLjE2LjAwLjAwCi11bnNwc2M3IzczLjEzLjE2LjA4LjAwI0NvbGQgc3RvcmFnZSBzZXJ2aWNlcyM3My4xMy4xNi4wMC4wMAotdW5zcHNjNyM3My4xMy4xNy4wMC4wMCNGcnVpdHMgYW5kIHZlZ2V0YWJsZXMgcHJvY2Vzc2luZyM3My4xMy4wMC4wMC4wMAotdW5zcHNjNyM3My4xMy4xNy4wMS4wMCNGcnVpdCBvciB2ZWdldGFibGUgY2xlYW5pbmcgc2VydmljZXMjNzMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTcuMDIuMDAjRnJ1aXQgb3IgdmVnZXRhYmxlIHNwcmF5aW5nIHNlcnZpY2VzIzczLjEzLjE3LjAwLjAwCi11bnNwc2M3IzczLjEzLjE3LjAzLjAwI0ZydWl0IG9yIHZlZ2V0YWJsZSBwYWNraW5nIHNlcnZpY2VzIzczLjEzLjE3LjAwLjAwCi11bnNwc2M3IzczLjEzLjE4LjAwLjAwI0RhaXJ5IGFuZCBlZ2dzIHByb2Nlc3NpbmcjNzMuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTguMDEuMDAjTWlsayBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE4LjAwLjAwCi11bnNwc2M3IzczLjEzLjE4LjAyLjAwI0VnZyBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE4LjAwLjAwCi11bnNwc2M3IzczLjEzLjE4LjAzLjAwI0NoZWVzZSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE4LjAwLjAwCi11bnNwc2M3IzczLjEzLjE4LjA0LjAwI0J1dHRlciBvciBjcmVhbSBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjEzLjE4LjAwLjAwCi11bnNwc2M3IzczLjEzLjE5LjAwLjAwI0dyYWlucyBhbmQgc3VnYXIgYW5kIG9pbHMgYW5kIGZhdCBwcm9jZXNzaW5nIzczLjEzLjAwLjAwLjAwCi11bnNwc2M3IzczLjEzLjE5LjAxLjAwI01pbGxpbmcgc2VydmljZXMjNzMuMTMuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTkuMDIuMDAjQ2VyZWFsIHByb2R1Y3RzIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTkuMDMuMDAjU3VnYXIgb3Igc3VnYXIgcHJvZHVjdHMgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xOS4wMC4wMAotdW5zcHNjNyM3My4xMy4xOS4wNC4wMCNWZWdldGFibGUgb2lscyBvciBmYXRzIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMTMuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTMuMTkuMDUuMDAjU3BpY2UgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xOS4wMC4wMAotdW5zcHNjNyM3My4xMy4xOS4wNi4wMCNCYWtlcnkgcHJvZHVjdHMgcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xMy4xOS4wMC4wMAotdW5zcHNjNyM3My4xNC4wMC4wMC4wMCNGaWJlcnMgYW5kIHRleHRpbGVzIGFuZCBmYWJyaWMgaW5kdXN0cmllcyM3My4wMC4wMC4wMC4wMAotdW5zcHNjNyM3My4xNC4xNS4wMC4wMCNGaWJlciBwcm9kdWN0aW9uIzczLjE0LjAwLjAwLjAwCi11bnNwc2M3IzczLjE0LjE1LjAxLjAwI1JheW9uIG9yIGFjZXRhdGUgZmliZXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNS4wMC4wMAotdW5zcHNjNyM3My4xNC4xNS4wMi4wMCNHbGFzcyBmaWJlciBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE0LjE1LjAwLjAwCi11bnNwc2M3IzczLjE0LjE1LjAzLjAwI1NpbGsgZmliZXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNS4wMC4wMAotdW5zcHNjNyM3My4xNC4xNS4wNC4wMCNDb3R0b24gZmliZXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNS4wMC4wMAotdW5zcHNjNyM3My4xNC4xNS4wNS4wMCNXb29sIGZpYmVyIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTUuMDYuMDAjUG9seWVzdGVyIGZpYmVyIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTUuMDcuMDAjUG9seWFtaWRlIGZpYmVyIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTUuMDguMDAjQWNyeWxpYyBmaWJlciBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE0LjE1LjAwLjAwCi11bnNwc2M3IzczLjE0LjE2LjAwLjAwI1RocmVhZCBhbmQgeWFybiBwcm9jZXNzaW5nIzczLjE0LjAwLjAwLjAwCi11bnNwc2M3IzczLjE0LjE2LjAxLjAwI1RocmVhZCBwcm9jZXNzaW5nIHNlcnZpY2VzIzczLjE0LjE2LjAwLjAwCi11bnNwc2M3IzczLjE0LjE2LjAyLjAwI1lhcm4gcHJvY2Vzc2luZyBzZXJ2aWNlcyM3My4xNC4xNi4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wMC4wMCNGYWJyaWNzIGFuZCBsZWF0aGVyIHByb2R1Y3Rpb24jNzMuMTQuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMDEuMDAjQnJvYWQgd292ZW4gZmFicmljcyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE0LjE3LjAwLjAwCi11bnNwc2M3IzczLjE0LjE3LjAyLjAwI05hcnJvdyB3b3ZlbiBmYWJyaWNzIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMDMuMDAjS25pdHdlYXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wNC4wMCNDYXJwZXQgb3IgcnVnIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMDUuMDAjQ29yZGFnZSBvciByb3BlIG9yIHR3aW5lIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMDYuMDAjRHllaW5nIG9yIHByaW50aW5nIG9yIGZpbmlzaGluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wNy4wMCNXb3ZlbiBzdWl0cyBvciBjb2F0cyBvciBvdmVyY29hdHMgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wOC4wMCNXb3ZlbiBvdXRlcndlYXIgY2xvdGhpbmcgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4wOS4wMCNGdXIgZHJlc3Npbmcgb3IgZHllaW5nIHNlcnZpY2VzIzczLjE0LjE3LjAwLjAwCi11bnNwc2M3IzczLjE0LjE3LjEwLjAwI0xlYXRoZXIgZm9vdHdlYXIgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4xMS4wMCNMZWF0aGVyIGx1Z2dhZ2Ugb3IgaGFuZGJhZ3MgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNC4xNy4wMC4wMAotdW5zcHNjNyM3My4xNC4xNy4xMi4wMCNMZWF0aGVyIHRhbm5pbmcgb3IgZmluaXNoaW5nIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMTMuMDAjTm9ud292ZW4gZmFicmljIHNlcnZpY2VzIzczLjE0LjE3LjAwLjAwCi11bnNwc2M3IzczLjE0LjE3LjE0LjAwI0JyYWlkZWQgeWFybiBvciBmYWJyaWMgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTQuMTcuMTUuMDAjSW5kdXN0cmlhbCBzZXdpbmcgc2VydmljZXMjNzMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMDAuMDAuMDAjTWFudWZhY3R1cmluZyBzdXBwb3J0IHNlcnZpY2VzIzczLjAwLjAwLjAwLjAwCi11bnNwc2M3IzczLjE1LjE1LjAwLjAwI0Fzc2VtYmx5IHNlcnZpY2VzIzczLjE1LjAwLjAwLjAwCi11bnNwc2M3IzczLjE1LjE1LjAxLjAwI0Fzc2VtYmx5IGxpbmUgd29yayM3My4xNS4xNS4wMC4wMAotdW5zcHNjNyM3My4xNS4xNS4wMi4wMCNKb2ludCBzZWFsaW5nIHNlcnZpY2VzIzczLjE1LjE1LjAwLjAwCi11bnNwc2M3IzczLjE1LjE2LjAwLjAwI1BhY2thZ2luZyBzZXJ2aWNlcyM3My4xNS4wMC4wMC4wMAotdW5zcHNjNyM3My4xNS4xNi4wMS4wMCNDYW5uaW5nIHBsYW50cyBzZXJ2aWNlcyM3My4xNS4xNi4wMC4wMAotdW5zcHNjNyM3My4xNS4xNi4wMi4wMCNQYWNrYWdpbmcgb2YgYWdyaWN1bHR1cmFsIGJ5IHByb2R1Y3RzIHNlcnZpY2VzIzczLjE1LjE2LjAwLjAwCi11bnNwc2M3IzczLjE1LjE2LjAzLjAwI1BhY2thZ2luZyBvZiBub24gZm9vZCBwcm9kdWN0cyBzZXJ2aWNlcyM3My4xNS4xNi4wMC4wMAotdW5zcHNjNyM3My4xNS4xNi4wNC4wMCNQYWNrYWdpbmcgb2YgcGhhcm1hY2V1dGljYWxzIHNlcnZpY2VzIzczLjE1LjE2LjAwLjAwCi11bnNwc2M3IzczLjE1LjE2LjA1LjAwI1BvaW50IG9mIHB1cmNoYXNlIGRpc3BsYXkgcGFja2FnaW5nIHNlcnZpY2VzIzczLjE1LjE2LjAwLjAwCi11bnNwc2M3IzczLjE1LjE2LjA2LjAwI01hbnVhbCBoYW5kIHBhY2thZ2luZyBzZXJ2aWNlcyM3My4xNS4xNi4wMC4wMAotdW5zcHNjNyM3My4xNS4xNi4wNy4wMCNNYWNoaW5lIGFzc2lzdGVkIHBhY2thZ2luZyBzZXJ2aWNlcyM3My4xNS4xNi4wMC4wMAotdW5zcHNjNyM3My4xNS4xNy4wMC4wMCNNYXRlcmlhbCB0cmVhdG1lbnQjNzMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMTcuMDEuMDAjV2F0ZXIgcHJvb2ZpbmcgbWF0ZXJpYWwgdHJlYXRtZW50IHNlcnZpY2VzIzczLjE1LjE3LjAwLjAwCi11bnNwc2M3IzczLjE1LjE3LjAyLjAwI0ZpcmUgcHJvdGVjdGlvbiBtYXRlcmlhbCB0cmVhdG1lbnQgc2VydmljZXMjNzMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMTcuMDMuMDAjQW50aWNvcnJvc2lvbiBtYXRlcmlhbCB0cmVhdG1lbnQgc2VydmljZXMjNzMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMTguMDAuMDAjQ29udmVydGluZyBzZXJ2aWNlcyM3My4xNS4wMC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOC4wMS4wMCNTaGVldGluZyBzZXJ2aWNlcyM3My4xNS4xOC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOC4wMi4wMCNTbGl0dGluZyBzZXJ2aWNlcyM3My4xNS4xOC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOC4wMy4wMCNEaWUgY3V0dGluZyBzZXJ2aWNlcyM3My4xNS4xOC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOC4wNC4wMCNGb2xkaW5nIHNlcnZpY2VzIzczLjE1LjE4LjAwLjAwCi11bnNwc2M3IzczLjE1LjE4LjA1LjAwI0xhbWluYXRpbmcgc2VydmljZXMjNzMuMTUuMTguMDAuMDAKLXVuc3BzYzcjNzMuMTUuMTkuMDAuMDAjSW5kdXN0cmlhbCBwcmludGluZyBzZXJ2aWNlcyM3My4xNS4wMC4wMC4wMAotdW5zcHNjNyM3My4xNS4xOS4wMS4wMCNGbGV4b2dyYXBoaWMgaW5kdXN0cmlhbCBwcmludGluZyBzZXJ2aWNlcyM3My4xNS4xOS4wMC4wMAotdW5zcHNjNyM3My4xNS4xOS4wMi4wMCNSb3RvZ3JhdnVyZSBpbmR1c3RyaWFsIHByaW50aW5nIHNlcnZpY2VzIzczLjE1LjE5LjAwLjAwCi11bnNwc2M3IzczLjE1LjE5LjAzLjAwI1NjcmVlbiBpbmR1c3RyaWFsIHByaW50aW5nIHNlcnZpY2VzIzczLjE1LjE5LjAwLjAwCi11bnNwc2M3IzczLjE1LjE5LjA0LjAwI09mZnNldCBpbmR1c3RyaWFsIHByaW50aW5nIHNlcnZpY2VzIzczLjE1LjE5LjAwLjAwCi11bnNwc2M3IzczLjE1LjE5LjA1LjAwI0RpZ2l0YWwgaW5kdXN0cmlhbCBwcmludGluZyBzZXJ2aWNlcyM3My4xNS4xOS4wMC4wMAotdW5zcHNjNyM3My4xNS4xOS4wNi4wMCNUaGVybWFsIHRyYW5zZmVyIGluZHVzdHJpYWwgcHJpbnRpbmcgc2VydmljZXMjNzMuMTUuMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMjAuMDAuMDAjRmlsbGluZyBTZXJ2aWNlcyM3My4xNS4wMC4wMC4wMAotdW5zcHNjNyM3My4xNS4yMC4wMS4wMCNMaXF1aWQgZmlsbGluZyBzZXJ2aWNlcyM3My4xNS4yMC4wMC4wMAotdW5zcHNjNyM3My4xNS4yMC4wMi4wMCNBZXJvc29sIGZpbGxpbmcgc2VydmljZXMjNzMuMTUuMjAuMDAuMDAKLXVuc3BzYzcjNzMuMTUuMjAuMDMuMDAjUGFzdGUgZmlsbGluZyBzZXJ2aWNlcyM3My4xNS4yMC4wMC4wMAotdW5zcHNjNyM3My4xNS4yMC4wNC4wMCNQb3dkZXIgZmlsbGluZyBzZXJ2aWNlcyM3My4xNS4yMC4wMC4wMAotdW5zcHNjNyM3My4xNS4yMS4wMC4wMCNNYW51ZmFjdHVyaW5nIGVxdWlwbWVudCBtYWludGVuYW5jZSBhbmQgcmVwYWlyIHNlcnZpY2VzIzczLjE1LjAwLjAwLjAwCi11bnNwc2M3IzczLjE1LjIxLjAxLjAwI01hbnVmYWN0dXJpbmcgZXF1aXBtZW50IG1haW50ZW5hbmNlIHNlcnZpY2VzIzczLjE1LjIxLjAwLjAwCi11bnNwc2M3IzczLjE1LjIxLjAyLjAwI01hbnVmYWN0dXJpbmcgZXF1aXBtZW50IHJlcGFpciBzZXJ2aWNlcyM3My4xNS4yMS4wMC4wMAotdW5zcHNjNyM3My4xNi4wMC4wMC4wMCNNYWNoaW5lcnkgYW5kIHRyYW5zcG9ydCBlcXVpcG1lbnQgbWFudWZhY3R1cmUjNzMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMDAuMDAjTWFudWZhY3R1cmUgb2YgbWFjaGluZXJ5IzczLjE2LjAwLjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjAxLjAwI0VuZ2luZSBvciB0dXJiaW5lIG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMDIuMDAjQWdyaWN1bHR1cmFsIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNi4xNS4wMC4wMAotdW5zcHNjNyM3My4xNi4xNS4wMy4wMCNNYWNoaW5lIHRvb2xzIG9yIG1ldGFsIG9yIHdvb2Qgd29ya2luZyBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjA0LjAwI1NwZWNpYWwgaW5kdXN0cmlhbCBwbGFudHMgb3IgbWFjaGluZXJ5IG1hbnVmYWN0dXJpbmcgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMDUuMDAjQ29uc3RydWN0aW9uIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmluZyBzZXJ2aWNlcyM3My4xNi4xNS4wMC4wMAotdW5zcHNjNyM3My4xNi4xNS4wNi4wMCNNaW5pbmcgbWFjaGluZXJ5IG9yIGVxdWlwbWVudCBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjA3LjAwI0Zvb2QgcHJvZHVjdHMgbWFjaGluZXJ5IG9yIGVxdWlwbWVudCBtYW51ZmFjdHVyaW5nIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjA4LjAwI1BhcGVyIHByaW50aW5nIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMDkuMDAjTWV0YWxsdXJnaWNhbCBtYWNoaW5lcnkgb3IgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjEwLjAwI0NoZW1pY2FsIG9yIHBoYXJtYWNldXRpY2FsIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTEuMDAjQ2VtZW50IHBsYW50IG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTIuMDAjVGV4dGlsZSBtYWNoaW5lcnkgb3IgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjEzLjAwI1Bvd2VyIHBsYW50IGJvaWxlcnMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTQuMDAjRnVybmFjZXMgb3Igb3ZlbnMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTUuMDAjT2ZmaWNlIG1hY2hpbmVyeSBvciBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTYuMDAjTGlmdGluZyBvciBob2lzdGluZyBvciBjb252ZXlpbmcgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE2LjE1LjAwLjAwCi11bnNwc2M3IzczLjE2LjE1LjE3LjAwI0FpciBjb25kaXRpb25pbmcgb3IgdmVudGlsYXRpbmcgb3IgcmVmcmlnZXJhdGlvbiBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTUuMTguMDAjRG9tZXN0aWMgYXBwbGlhbmNlcyBvciBtYWNoaW5lcyBleGNlcHQgZWxlY3RyaWNhbCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNS4wMC4wMAotdW5zcHNjNyM3My4xNi4xNS4xOS4wMCNQdW1wcyBvciBjb21wcmVzc29ycyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNS4wMC4wMAotdW5zcHNjNyM3My4xNi4xNi4wMC4wMCNNYW51ZmFjdHVyZSBvZiB0cmFuc3BvcnQgZXF1aXBtZW50IzczLjE2LjAwLjAwLjAwCi11bnNwc2M3IzczLjE2LjE2LjAxLjAwI0Zpc2hpbmcgc2hpcCBvciBib2F0IGJ1aWxkaW5nIHNlcnZpY2VzIzczLjE2LjE2LjAwLjAwCi11bnNwc2M3IzczLjE2LjE2LjAyLjAwI1JhaWxyb2FkIHJvbGxpbmcgc3RvY2sgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTYuMDMuMDAjTG9jb21vdGl2ZSBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNi4wMC4wMAotdW5zcHNjNyM3My4xNi4xNi4wNC4wMCNNb3RvciB2ZWhpY2xlcyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNi4wMC4wMAotdW5zcHNjNyM3My4xNi4xNi4wNS4wMCNNb3RvciB2ZWhpY2xlcyBwYXJ0cyBvciBhY2Nlc3NvcmllcyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNi4xNi4wMC4wMAotdW5zcHNjNyM3My4xNi4xNi4wNi4wMCNNb3RvcmN5Y2xlIG9yIGJpY3ljbGUgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTYuMTYuMDcuMDAjQWlyIG9yIHNwYWNlY3JhZnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMDAuMDAuMDAjTWFudWZhY3R1cmUgb2YgZWxlY3RyaWNhbCBnb29kcyBhbmQgcHJlY2lzaW9uIGluc3RydW1lbnRzIzczLjAwLjAwLjAwLjAwCi11bnNwc2M3IzczLjE3LjE1LjAwLjAwI01hbnVmYWN0dXJlIG9mIGVsZWN0cmljYWwgZ29vZHMjNzMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTUuMDEuMDAjUG93ZXIgZ2VuZXJhdGlvbiBvciB0cmFuc21pc3Npb24gb3IgZGlzdHJpYnV0aW9uIGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4wMi4wMCNEcnkgb3Igc3RvcmFnZSBiYXR0ZXJ5IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE1LjAwLjAwCi11bnNwc2M3IzczLjE3LjE1LjAzLjAwI0VsZWN0cmljYWwgdG9vbHMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTUuMDQuMDAjTWVhc3VyaW5nIG9yIHRlc3RpbmcgaW5zdHJ1bWVudHMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTUuMDUuMDAjUmFkaW8gb3IgdGVsZXZpc2lvbiBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4wNi4wMCNDb21tdW5pY2F0aW9uIGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4wNy4wMCNFbGVjdHJpY2FsIGhvdXNlaG9sZCBhcHBsaWFuY2VzIG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE1LjAwLjAwCi11bnNwc2M3IzczLjE3LjE1LjA4LjAwI0luc3VsYXRlZCB3aXJlIG9yIGNhYmxlIG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE1LjAwLjAwCi11bnNwc2M3IzczLjE3LjE1LjA5LjAwI0VsZWN0cmljYWwgYWNjZXNzb3JpZXMgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTUuMTAuMDAjRWxlY3RyaWNhbCBhY2Nlc3NvcmllcyBvciBzdXBwbGllcyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4xMS4wMCNFbGVjdHJvbmljIGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNS4wMC4wMAotdW5zcHNjNyM3My4xNy4xNS4xMi4wMCNFbGVjdHJvbmljIGNvbXB1dGVycyBvciBkYXRhIHByb2Nlc3NpbmcgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE1LjAwLjAwCi11bnNwc2M3IzczLjE3LjE2LjAwLjAwI01hbnVmYWN0dXJlIG9mIHByZWNpc2lvbiBpbnN0cnVtZW50cyM3My4xNy4wMC4wMC4wMAotdW5zcHNjNyM3My4xNy4xNi4wMS4wMCNTY2llbnRpZmljIGluc3RydW1lbnRzIG9yIG1lYXN1cmluZyBlcXVpcG1lbnQgbWFudWZhY3R1cmUgc2VydmljZXMjNzMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjNzMuMTcuMTYuMDIuMDAjTWVkaWNhbCBvciBkZW50YWwgZXF1aXBtZW50IG1hbnVmYWN0dXJlIHNlcnZpY2VzIzczLjE3LjE2LjAwLjAwCi11bnNwc2M3IzczLjE3LjE2LjAzLjAwI1Bob3RvZ3JhcGhpYyBvciBvcHRpY2FsIGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNi4wMC4wMAotdW5zcHNjNyM3My4xNy4xNi4wNC4wMCNXYXRjaGVzIG9yIGNsb2NrcyBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNi4wMC4wMAotdW5zcHNjNyM3My4xNy4xNi4wNS4wMCNMYWJvcmF0b3J5IGVxdWlwbWVudCBtYW51ZmFjdHVyZSBzZXJ2aWNlcyM3My4xNy4xNi4wMC4wMAotdW5zcHNjNyM3My4xOC4wMC4wMC4wMCNNYWNoaW5pbmcgYW5kIHByb2Nlc3Npbmcgc2VydmljZXMjNzMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMDAuMDAjTWFjaGluaW5nIHNlcnZpY2VzIzczLjE4LjAwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjAxLjAwI1R1cm5pbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMDIuMDAjRWxlY3RybyBkaXNjaGFyZ2UgbWFjaGluaW5nIChFRE0pIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjAzLjAwI0VsZWN0cm8gY2hlbWljYWwgbWFjaGluaW5nIChFQ00pIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjA0LjAwI0NoZW0gbWlsbGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4wNS4wMCNQdW5jaGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4wNi4wMCNTdGFtcGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4wNy4wMCNCb3Jpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMDguMDAjRHJpbGxpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMDkuMDAjVGFwcGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xMC4wMCNMYXNlciBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xMS4wMCNCZW5kaW5nIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjEyLjAwI0dyaW5kaW5nIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjEzLjAwI1Nob3QgYmxhc3Rpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMTQuMDAjUG9saXNoaW5nIHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjE1LjAwI0ZsYW1lIGN1dHRpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMTYuMDAjTGFzZXIgY3V0dGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xNy4wMCNQbGFzbWEgY3V0dGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xOC4wMCNXYXRlciBqZXQgY3V0dGluZyBzZXJ2aWNlcyM3My4xOC4xMC4wMC4wMAotdW5zcHNjNyM3My4xOC4xMC4xOS4wMCNSb2xsaW5nIFNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjIwLjAwI1N1cmZhY2UgdHJlYXRtZW50IHNlcnZpY2VzIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEwLjIxLjAwI01pbGxpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMjIuMDAjU3ByYXlpbmcgc2VydmljZXMjNzMuMTguMTAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTAuMjMuMDAjU2hhcnBlbmluZyBzZXJ2aWNlIzczLjE4LjEwLjAwLjAwCi11bnNwc2M3IzczLjE4LjExLjAwLjAwI0NvYXRpbmcgc2VydmljZXMjNzMuMTguMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDEuMDAjRWxlY3RybyBjb2F0aW5nIHNlcnZpY2VzIzczLjE4LjExLjAwLjAwCi11bnNwc2M3IzczLjE4LjExLjAyLjAwI0RpcHBpbmcgc2VydmljZXMjNzMuMTguMTEuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDMuMDAjV3JhcHBpbmcgc2VydmljZXMjNzMuMTguMTEuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDQuMDAjUGFpbnRpbmcgc2VydmljZXMjNzMuMTguMTEuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDUuMDAjV2ViIGNvYXRpbmcgc2VydmljZXMjNzMuMTguMTEuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTEuMDYuMDAjUGxhdGluZyBzZXJ2aWNlcyM3My4xOC4xMS4wMC4wMAotdW5zcHNjNyM3My4xOC4xMi4wMC4wMCNGb3JtaW5nIHNlcnZpY2VzIzczLjE4LjAwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEyLjAxLjAwI0RyYXcgZm9ybWluZyBzZXJ2aWNlcyM3My4xOC4xMi4wMC4wMAotdW5zcHNjNyM3My4xOC4xMi4wMi4wMCNIeWRybyBmb3JtaW5nIHNlcnZpY2VzIzczLjE4LjEyLjAwLjAwCi11bnNwc2M3IzczLjE4LjEyLjAzLjAwI1JvbGwgZm9ybWluZyBzZXJ2aWNlcyM3My4xOC4xMi4wMC4wMAotdW5zcHNjNyM3My4xOC4xMi4wNC4wMCNTdHJldGNoIGZvcm1pbmcgc2VydmljZXMjNzMuMTguMTIuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTIuMDUuMDAjU3BpbiBmb3JtaW5nIHNlcnZpY2VzIzczLjE4LjEyLjAwLjAwCi11bnNwc2M3IzczLjE4LjEyLjA2LjAwI0V4cGxvc2l2ZSBmb3JtaW5nIHNlcnZpY2VzIzczLjE4LjEyLjAwLjAwCi11bnNwc2M3IzczLjE4LjEzLjAwLjAwI0hlYXQgdHJlYXRtZW50IHNlcnZpY2VzIzczLjE4LjAwLjAwLjAwCi11bnNwc2M3IzczLjE4LjEzLjAxLjAwI1F1ZW5jaCBhbmQgdGVtcGVyIHNlcnZpY2VzIzczLjE4LjEzLjAwLjAwCi11bnNwc2M3IzczLjE4LjEzLjAyLjAwI0FubmVhbGluZyBzZXJ2aWNlcyM3My4xOC4xMy4wMC4wMAotdW5zcHNjNyM3My4xOC4xMy4wMy4wMCNOb3JtYWxpemluZyBzZXJ2aWNlcyM3My4xOC4xMy4wMC4wMAotdW5zcHNjNyM3My4xOC4xMy4wNC4wMCNBZ2luZyBvciBzdGFiaWxpemluZyBzZXJ2aWNlcyM3My4xOC4xMy4wMC4wMAotdW5zcHNjNyM3My4xOC4xOS4wMC4wMCNXZWxkaW5nIGFuZCBicmF6aW5nIGFuZCBzb2xkZXJpbmcgc2VydmljZXMjNzMuMTguMDAuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDEuMDAjQXJjIHdlbGRpbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDIuMDAjTWV0YWwgaW5lcnQgZ2FzIChNSUcpIHdlbGRpbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDMuMDAjVHVuZ3N0ZW4gaW5lcnQgZ2FzIChUSUcpIHdlbGRpbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDQuMDAjTGFzZXIgd2VsZGluZyBzZXJ2aWNlcyM3My4xOC4xOS4wMC4wMAotdW5zcHNjNyM3My4xOC4xOS4wNS4wMCNTcG90IHdlbGRpbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDYuMDAjUHJvamVjdGlvbiB3ZWxkaW5nIHNlcnZpY2VzIzczLjE4LjE5LjAwLjAwCi11bnNwc2M3IzczLjE4LjE5LjA3LjAwI0JyYXppbmcgc2VydmljZXMjNzMuMTguMTkuMDAuMDAKLXVuc3BzYzcjNzMuMTguMTkuMDguMDAjU29sZGVyaW5nIHNlcnZpY2VzIzczLjE4LjE5LjAwLjAwCi11bnNwc2M3Izc2LjAwLjAwLjAwLjAwI0luZHVzdHJpYWwgQ2xlYW5pbmcgU2VydmljZXMjNzYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTAuMDAuMDAuMDAjRGVjb250YW1pbmF0aW9uIHNlcnZpY2VzIzc2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc2LjEwLjE1LjAwLjAwI0Rpc2luZmVjdGlvbiM3Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMC4xNS4wMS4wMCNXYXNocm9vbSBzYW5pdGF0aW9uIHNlcnZpY2VzIzc2LjEwLjE1LjAwLjAwCi11bnNwc2M3Izc2LjEwLjE1LjAyLjAwI1Jlc3Qgcm9vbSBjbGVhbmluZyBzZXJ2aWNlcyM3Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM3Ni4xMC4xNS4wMy4wMCNEaXNpbmZlY3Rpb24gb3IgZGVvZG9yaXppbmcgc2VydmljZXMjNzYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzYuMTAuMTYuMDAuMDAjSGF6YXJkb3VzIG1hdGVyaWFsIGRlY29udGFtaW5hdGlvbiM3Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMC4xNi4wMS4wMCNSYWRpb2FjdGl2ZSBkZWNvbnRhbWluYXRpb24gc2VydmljZXMjNzYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzYuMTAuMTYuMDIuMDAjQXNiZXN0b3MgZGVjb250YW1pbmF0aW9uIG9yIHJlbW92YWwjNzYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzYuMTEuMDAuMDAuMDAjQ2xlYW5pbmcgYW5kIGphbml0b3JpYWwgc2VydmljZXMjNzYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTEuMTUuMDAuMDAjR2VuZXJhbCBidWlsZGluZyBhbmQgb2ZmaWNlIGNsZWFuaW5nIHNlcnZpY2VzIzc2LjExLjAwLjAwLjAwCi11bnNwc2M3Izc2LjExLjE1LjAxLjAwI0J1aWxkaW5nIGNsZWFuaW5nIHNlcnZpY2VzIzc2LjExLjE1LjAwLjAwCi11bnNwc2M3Izc2LjExLjE1LjAyLjAwI0J1aWxkaW5nIG1haW50ZW5hbmNlIG9yIHJlcGFpciBzZXJ2aWNlcyM3Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNS4wMy4wMCNMaWdodGluZyBtYWludGVuYW5jZSBzZXJ2aWNlcyM3Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNS4wNC4wMCNXaW5kb3cgb3Igd2luZG93IGJsaW5kIGNsZWFuaW5nIHNlcnZpY2VzIzc2LjExLjE1LjAwLjAwCi11bnNwc2M3Izc2LjExLjE2LjAwLjAwI0J1aWxkaW5nIGNvbXBvbmVudCBjbGVhbmluZyBzZXJ2aWNlcyM3Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNi4wMS4wMCNBY291c3RpY2FsIHRpbGUgb3IgY2VpbGluZyBjbGVhbmluZyBzZXJ2aWNlcyM3Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNi4wMi4wMCNBaXIgZHVjdCBjbGVhbmluZyM3Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNi4wMy4wMCNDaGltbmV5IGNsZWFuaW5nIzc2LjExLjE2LjAwLjAwCi11bnNwc2M3Izc2LjExLjE2LjA0LjAwI0Zsb29yIHdheGluZyBvciBjYXJwZXQgY2xlYW5pbmcjNzYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzYuMTEuMTYuMDUuMDAjRXhoYXVzdCBob29kIG9yIGZhbiBjbGVhcmluZyM3Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMS4xNy4wMC4wMCNCdWlsZGluZyBzaXRlIGNsZWFuIHVwIzc2LjExLjAwLjAwLjAwCi11bnNwc2M3Izc2LjExLjE3LjAxLjAwI0NvbnN0cnVjdGlvbiBzaXRlIGNsZWFuIHVwIHNlcnZpY2VzIzc2LjExLjE3LjAwLjAwCi11bnNwc2M3Izc2LjExLjE3LjAyLjAwI0NvbnN0cnVjdGlvbiBzaXRlIGhhdWwgYXdheSBzZXJ2aWNlcyM3Ni4xMS4xNy4wMC4wMAotdW5zcHNjNyM3Ni4xMi4wMC4wMC4wMCNSZWZ1c2UgZGlzcG9zYWwgYW5kIHRyZWF0bWVudCM3Ni4wMC4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNS4wMC4wMCNSZWZ1c2UgY29sbGVjdGlvbiBhbmQgZGlzcG9zYWwjNzYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTUuMDEuMDAjR2FyYmFnZSBjb2xsZWN0aW9uIG9yIGRlc3RydWN0aW9uIG9yIHByb2Nlc3Npbmcgb3IgZGlzcG9zYWwjNzYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTUuMDIuMDAjTGlxdWlkIHdhc3RlIGNvbGxlY3Rpb24gb3IgcHJvY2Vzc2luZyBvciBkaXNwb3NhbCM3Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNS4wMy4wMCNTdHJlZXQgY2xlYW5pbmcgc2VydmljZXMjNzYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTYuMDAuMDAjTm9uaGF6YXJkb3VzIHdhc3RlIGRpc3Bvc2FsIzc2LjEyLjAwLjAwLjAwCi11bnNwc2M3Izc2LjEyLjE2LjAxLjAwI0dhcmJhZ2UgZHVtcCM3Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNi4wMi4wMCNTYW5pdGFyeSBsYW5kZmlsbCBvcGVyYXRpb25zIzc2LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc2LjEyLjE2LjAzLjAwI1NsdWRnZSBkaXNwb3NhbCM3Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNi4wNC4wMCNEZWFkIGFuaW1hbCBkaXNwb3NhbCBzZXJ2aWNlcyM3Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xNy4wMC4wMCNMaXF1aWQgd2FzdGUgdHJlYXRtZW50Izc2LjEyLjAwLjAwLjAwCi11bnNwc2M3Izc2LjEyLjE3LjAxLjAwI1Nld2FnZSB0cmVhdG1lbnQgc2VydmljZXMjNzYuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTcuMDIuMDAjQ2hlbWljYWwgdHJlYXRtZW50IHNlcnZpY2VzIzc2LjEyLjE3LjAwLjAwCi11bnNwc2M3Izc2LjEyLjE4LjAwLjAwI1JlZnVzZSB0cmVhdG1lbnQjNzYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTIuMTguMDEuMDAjUmVjeWNsaW5nIHNlcnZpY2VzIzc2LjEyLjE4LjAwLjAwCi11bnNwc2M3Izc2LjEyLjE5LjAwLjAwI0hhemFyZG91cyB3YXN0ZSBkaXNwb3NhbCM3Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xOS4wMS4wMCNNZWRpY2FsIHdhc3RlIGRpc3Bvc2FsIzc2LjEyLjE5LjAwLjAwCi11bnNwc2M3Izc2LjEyLjE5LjAyLjAwI0FjaWQgd2FzdGUgY29sbGVjdGlvbiBvciBkaXNwb3NhbCM3Ni4xMi4xOS4wMC4wMAotdW5zcHNjNyM3Ni4xMi4xOS4wMy4wMCNDaGVtaWNhbCBkZXRveGlmaWNhdGlvbiM3Ni4xMi4xOS4wMC4wMAotdW5zcHNjNyM3Ni4xMy4wMC4wMC4wMCNUb3hpYyBhbmQgaGF6YXJkb3VzIHdhc3RlIGNsZWFudXAjNzYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTUuMDAuMDAjTnVjbGVhciB3YXN0ZSB0cmVhdG1lbnQjNzYuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTUuMDEuMDAjUmFkaW9hY3RpdmUgd2FzdGUgbWF0ZXJpYWwgdHJlYXRtZW50Izc2LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc2LjEzLjE1LjAyLjAwI1JhZGlvYWN0aXZlIGNvbnRhaW5tZW50IHNlcnZpY2VzIzc2LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc2LjEzLjE2LjAwLjAwI1RveGljIHNwaWxsIGNsZWFudXAjNzYuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTYuMDEuMDAjVG94aWMgc3BpbGwgY29udGFpbm1lbnQjNzYuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTYuMDIuMDAjVG94aWMgc3Vic3RhbmNlcyBzcGlsbCBjbGVhbnVwIzc2LjEzLjE2LjAwLjAwCi11bnNwc2M3Izc2LjEzLjE3LjAwLjAwI09pbCBzcGlsbCBjbGVhbnVwIzc2LjEzLjAwLjAwLjAwCi11bnNwc2M3Izc2LjEzLjE3LjAxLjAwI09pbCByZXNpZHVlIGRpc3Bvc2FsIG9yIGNvbnRyb2wgc2VydmljZXMjNzYuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzYuMTMuMTcuMDIuMDAjT2lsIHNwaWxsIHRyZWF0bWVudCBzZXJ2aWNlcyM3Ni4xMy4xNy4wMC4wMAotdW5zcHNjNyM3Ny4wMC4wMC4wMC4wMCNFbnZpcm9ubWVudGFsIFNlcnZpY2VzIzc3LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEwLjAwLjAwLjAwI0Vudmlyb25tZW50YWwgbWFuYWdlbWVudCM3Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNS4wMC4wMCNFbnZpcm9ubWVudGFsIGltcGFjdCBhc3Nlc3NtZW50Izc3LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEwLjE1LjAxLjAwI1Jpc2sgb3IgaGF6YXJkIGFzc2Vzc21lbnQjNzcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTUuMDIuMDAjRW52aXJvbm1lbnRhbCBzdGFuZGFyZHMjNzcuMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTUuMDMuMDAjRW52aXJvbm1lbnRhbCBpbmRpY2F0b3JzIGFuYWx5c2lzIzc3LjEwLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE1LjA0LjAwI0Vudmlyb25tZW50YWwgaW1wYWN0IGFzc2Vzc21lbnQgIChFSUEpIHNlcnZpY2VzIzc3LjEwLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE1LjA1LjAwI0Vudmlyb25tZW50YWwgbW9uaXRvcmluZyM3Ny4xMC4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNi4wMC4wMCNFbnZpcm9ubWVudGFsIHBsYW5uaW5nIzc3LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEwLjE2LjAxLjAwI1VyYmFuIGVudmlyb25tZW50YWwgZGV2ZWxvcG1lbnQgcGxhbm5pbmcjNzcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTYuMDIuMDAjRm9yZXN0IGNvbnNlcnZhdGlvbiBzdHJhdGVneSBwbGFubmluZyM3Ny4xMC4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNi4wMy4wMCNNYXJpbmUgY29uc2VydmF0aW9uIHN0cmF0ZWd5IHBsYW5uaW5nIzc3LjEwLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE2LjA0LjAwI05hdHVyYWwgcmVzb3VyY2VzIG1hbmFnZW1lbnQgb3IgY29uc2VydmF0aW9uIHN0cmF0ZWd5IHBsYW5uaW5nIHNlcnZpY2VzIzc3LjEwLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE2LjA1LjAwI0Vudmlyb25tZW50YWwgaW5zdGl0dXRpb24gYnVpbGRpbmcgb3IgcGxhbm5pbmcjNzcuMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTcuMDAuMDAjRW52aXJvbm1lbnRhbCBhZHZpc29yeSBzZXJ2aWNlcyM3Ny4xMC4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNy4wMS4wMCNFbnZpcm9ubWVudGFsIHNjaWVuY2VzIGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE3LjAyLjAwI0Vudmlyb25tZW50YWwgY2hlbWlzdHJ5IGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE3LjAzLjAwI0Vudmlyb25tZW50YWwgZXRoaWNzIGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE3LjA0LjAwI0Vudmlyb25tZW50YWwgdGVjaG5vbG9neSBhZHZpc29yeSBzZXJ2aWNlcyM3Ny4xMC4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNy4wNS4wMCNFbnZpcm9ubWVudGFsIGVjb25vbWljcyBhZHZpc29yeSBzZXJ2aWNlcyM3Ny4xMC4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNy4wNi4wMCNFbnZpcm9ubWVudGFsIGxhdyBhZHZpc29yeSBzZXJ2aWNlcyM3Ny4xMC4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xNy4wNy4wMCNFY29sb2d5IGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE4LjAwLjAwI0Vudmlyb25tZW50YWwgYXVkaXRpbmcjNzcuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTguMDEuMDAjRW52aXJvbm1lbnRhbCBpbmZvcm1hdGlvbiBzeXN0ZW1zIzc3LjEwLjE4LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE4LjAyLjAwI0NvcnBvcmF0ZSBlbnZpcm9ubWVudGFsIGF1ZGl0aW5nIHNlcnZpY2VzIzc3LjEwLjE4LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE4LjAzLjAwI1NlY3RvcmFsIGVudmlyb25tZW50YWwgYXVkaXRpbmcgc2VydmljZXMjNzcuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTguMDQuMDAjQWN0aXZpdHkgc3BlY2lmaWMgZW52aXJvbm1lbnRhbCBhdWRpdGluZyBzZXJ2aWNlcyM3Ny4xMC4xOC4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xOC4wNS4wMCNFbnZpcm9ubWVudGFsIHF1YWxpdHkgY29udHJvbCBzZXJ2aWNlcyM3Ny4xMC4xOC4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xOC4wNi4wMCNFbnZpcm9ubWVudGFsIHNlY3VyaXR5IGNvbnRyb2wgc2VydmljZXMjNzcuMTAuMTguMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDAuMDAjUG9sbHV0aW9uIGludmVzdGlnYXRpb24gc2VydmljZXMjNzcuMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDEuMDAjSW5kdXN0cmlhbCBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDIuMDAjSW5kdXN0cmlhbCB3YXN0ZSBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDMuMDAjR2Fzd29ya3Mgc2l0ZSBpbnZlc3RpZ2F0aW9uIzc3LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE5LjA0LjAwI0NoZW1pY2FsIHdvcmtzIG9yIG9pbCByZWZpbmVyeSB3YXN0ZSBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDUuMDAjV29vZCB0cmVhdG1lbnQgcGxhbnQgc2l0ZSBpbnZlc3RpZ2F0aW9uIzc3LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc3LjEwLjE5LjA2LjAwI09pbCBkZXBvdCBvciB0ZXJtaW5hbCBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDcuMDAjRHJ5IGNsZWFuaW5nIHBsYW50cyBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDguMDAjRm91bmRyeSBzaXRlIGludmVzdGlnYXRpb24jNzcuMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzcuMTAuMTkuMDkuMDAjUmVjeWNsaW5nIHBsYW50IHNpdGUgaW52ZXN0aWdhdGlvbiM3Ny4xMC4xOS4wMC4wMAotdW5zcHNjNyM3Ny4xMC4xOS4xMC4wMCNGb29kIHByb2Nlc3NpbmcgcGxhbnQgc2l0ZSBpbnZlc3RpZ2F0aW9uIzc3LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc3LjExLjAwLjAwLjAwI0Vudmlyb25tZW50YWwgcHJvdGVjdGlvbiM3Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNS4wMC4wMCNFbnZpcm9ubWVudGFsIHNhZmV0eSBzZXJ2aWNlcyM3Ny4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNS4wMS4wMCNMYW5kc2NhcGUgcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMS4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNS4wMi4wMCNPem9uZSBwcm90ZWN0aW9uIHNlcnZpY2VzIzc3LjExLjE1LjAwLjAwCi11bnNwc2M3Izc3LjExLjE1LjAzLjAwI0Zvb2Qgb3IgZmVlZCBjb250YW1pbmF0aW9uIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTUuMDQuMDAjR2VuZXRpYyByZXNvdXJjZXMgcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMS4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNS4wNS4wMCNUb3hpYyBzdWJzdGFuY2VzIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTUuMDYuMDAjUmFkaWF0aW9uIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTUuMDcuMDAjRW5kYW5nZXJlZCBzcGVjaWVzIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTUuMDguMDAjTmF0dXJhbCByaXNrcyBvciBoYXphcmRzIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTEuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTYuMDAuMDAjRW52aXJvbm1lbnRhbCByZWhhYmlsaXRhdGlvbiM3Ny4xMS4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMS4xNi4wMS4wMCNJbmR1c3RyaWFsIHNpdGUgcmVoYWJpbGl0YXRpb24jNzcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTYuMDIuMDAjRW52aXJvbm1lbnRhbCBkZWNvbnRhbWluYXRpb24gc2VydmljZXMjNzcuMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTEuMTYuMDMuMDAjTGFuZCByZWNsYW1hdGlvbiBzZXJ2aWNlcyM3Ny4xMS4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMi4wMC4wMC4wMCNQb2xsdXRpb24gdHJhY2tpbmcgYW5kIG1vbml0b3JpbmcgYW5kIHJlaGFiaWxpdGF0aW9uIzc3LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEyLjE1LjAwLjAwI0FpciBwb2xsdXRpb24jNzcuMTIuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTUuMDEuMDAjQWlyIHF1YWxpdHkgbWFuYWdlbWVudCM3Ny4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNS4wMi4wMCNUcmFuc2JvdW5kYXJ5IGFpciBwb2xsdXRpb24gbWFuYWdlbWVudCBvciBjb250cm9sIHNlcnZpY2VzIzc3LjEyLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE1LjAzLjAwI0FpciBwb2xsdXRpb24gcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNS4wNC4wMCNBaXIgcG9sbHV0aW9uIG1vbml0b3Jpbmcgb3IgbWVhc3VyZW1lbnQgc2VydmljZXMjNzcuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTUuMDUuMDAjVG94aWMgZ2FzIGRldGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNS4wNi4wMCNNZXRoYW5lIG1vbml0b3JpbmcjNzcuMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTUuMDcuMDAjQ2FyYm9uIGRpb3hpZGUgbW9uaXRvcmluZyBzZXJ2aWNlcyM3Ny4xMi4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNS4wOC4wMCNBaXJib3JuZSBwYXJ0aWNsZSBtb25pdG9yaW5nIzc3LjEyLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE1LjA5LjAwI096b25lIGRlcGxldGlvbiBtb25pdG9yaW5nIHNlcnZpY2VzIzc3LjEyLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjAwLjAwI1NvaWwgcG9sbHV0aW9uIzc3LjEyLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjAxLjAwI1NvaWwgcG9sbHV0aW9uIHByb3RlY3Rpb24gc2VydmljZXMjNzcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTYuMDIuMDAjUG9sbHV0ZWQgc29pbCByZW1vdmFsIHNlcnZpY2VzIzc3LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjAzLjAwI1BvbGx1dGVkIHNvaWwgdHJlYXRtZW50IG9yIHJlaGFiaWxpdGF0aW9uIzc3LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjA0LjAwI1NvaWwgcG9sbHV0aW9uIGFkdmlzb3J5IHNlcnZpY2VzIzc3LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE2LjA1LjAwI1NvaWwgcG9sbHV0aW9uIG1hcHBpbmcjNzcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTYuMDYuMDAjU29pbCBwb2xsdXRpb24gbWVhc3VyZW1lbnQgb3IgbW9uaXRvcmluZyM3Ny4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNi4wNy4wMCNPcmdhbmljIGZlcnRpbGl6ZXIgcG9sbHV0aW9uIGFzc2Vzc21lbnQjNzcuMTIuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTYuMDguMDAjUGVzdGljaWRlcyBwb2xsdXRpb24gYXNzZXNzbWVudCM3Ny4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNi4wOS4wMCNOaXRyYXRlcyBwb2xsdXRpb24gYXNzZXNzbWVudCM3Ny4xMi4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNi4xMC4wMCNQaG9zcGhhdGVzIHBvbGx1dGlvbiBhc3Nlc3NtZW50Izc3LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc3LjEyLjE3LjAwLjAwI1dhdGVyIHBvbGx1dGlvbiM3Ny4xMi4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wMS4wMCNTdXJmYWNlIHdhdGVyIHBvbGx1dGlvbiBtb25pdG9yaW5nIG9yIGNvbnRyb2wgc2VydmljZXMjNzcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTcuMDIuMDAjU3VyZmFjZSB3YXRlciBwb2xsdXRpb24gcmVoYWJpbGl0YXRpb24gc2VydmljZXMjNzcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTcuMDMuMDAjU3VyZmFjZSB3YXRlciBwb2xsdXRpb24gcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wNC4wMCNTdXJmYWNlIHdhdGVyIHRyZWF0bWVudCBzZXJ2aWNlcyM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wNS4wMCNTdXJmYWNlIHdhdGVyIHBvbGx1dGlvbiBkcmFpbmFnZSBzZXJ2aWNlcyM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wNi4wMCNUcmFuc2JvdW5kYXJ5IHdhdGVyIHBvbGx1dGlvbiBtYW5hZ2VtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjNzcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTcuMDcuMDAjR3JvdW5kd2F0ZXIgcG9sbHV0aW9uIG1vbml0b3Jpbmcgb3IgY29udHJvbCBzZXJ2aWNlcyM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMi4xNy4wOC4wMCNHcm91bmR3YXRlciBwb2xsdXRpb24gZHJhaW5hZ2Ugc2VydmljZXMjNzcuMTIuMTcuMDAuMDAKLXVuc3BzYzcjNzcuMTIuMTcuMDkuMDAjR3JvdW5kd2F0ZXIgcG9sbHV0aW9uIHRyZWF0bWVudCBvciByZWhhYmlsaXRhdGlvbiM3Ny4xMi4xNy4wMC4wMAotdW5zcHNjNyM3Ny4xMy4wMC4wMC4wMCNQb2xsdXRhbnRzIHRyYWNraW5nIGFuZCBtb25pdG9yaW5nIGFuZCByZWhhYmlsaXRhdGlvbiBzZXJ2aWNlcyM3Ny4wMC4wMC4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNS4wMC4wMCNPaWwgcG9sbHV0aW9uIzc3LjEzLjAwLjAwLjAwCi11bnNwc2M3Izc3LjEzLjE1LjAxLjAwI09pbCBzcGlsbGFnZSBtb25pdG9yaW5nIHNlcnZpY2VzIzc3LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEzLjE1LjAyLjAwI09pbCBzcGlsbGFnZSBjb250cm9sIHNlcnZpY2VzIzc3LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc3LjEzLjE1LjAzLjAwI09pbCBzcGlsbGFnZSByZWhhYmlsaXRhdGlvbiBzZXJ2aWNlcyM3Ny4xMy4xNS4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNi4wMC4wMCNOb2lzZSBwb2xsdXRpb24jNzcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTMuMTYuMDEuMDAjTm9pc2UgY29udHJvbCBzZXJ2aWNlcyM3Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNi4wMi4wMCNOb2lzZSBwb2xsdXRpb24gcHJvdGVjdGlvbiBzZXJ2aWNlcyM3Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNi4wMy4wMCNOb2lzZSBwb2xsdXRpb24gbW9uaXRvcmluZyBzZXJ2aWNlcyM3Ny4xMy4xNi4wMC4wMAotdW5zcHNjNyM3Ny4xMy4xNi4wNC4wMCNOb2lzZSBwb2xsdXRpb24gYWR2aXNvcnkgc2VydmljZXMjNzcuMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzcuMTMuMTcuMDAuMDAjVG94aWMgc3Vic3RhbmNlcyBwb2xsdXRpb24jNzcuMTMuMDAuMDAuMDAKLXVuc3BzYzcjNzcuMTMuMTcuMDEuMDAjVG94aWMgc3Vic3RhbmNlcyBtb25pdG9yaW5nIHNlcnZpY2VzIzc3LjEzLjE3LjAwLjAwCi11bnNwc2M3Izc3LjEzLjE3LjAyLjAwI1RveGljIHN1YnN0YW5jZXMgcmVoYWJpbGl0YXRpb24gc2VydmljZXMjNzcuMTMuMTcuMDAuMDAKLXVuc3BzYzcjNzguMDAuMDAuMDAuMDAjVHJhbnNwb3J0YXRpb24gYW5kIFN0b3JhZ2UgYW5kIE1haWwgU2VydmljZXMjNzguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMDAuMDAuMDAjTWFpbCBhbmQgY2FyZ28gdHJhbnNwb3J0Izc4LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEwLjE1LjAwLjAwI0FpciBjYXJnbyB0cmFuc3BvcnQjNzguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTUuMDEuMDAjRG9tZXN0aWMgYWlyIGNhcmdvIHRyYW5wb3NydCM3OC4xMC4xNS4wMC4wMAotdW5zcHNjNyM3OC4xMC4xNS4wMi4wMCNJbnRlcm5hdGlvbmFsIGFpciBjYXJnbyB0cmFuc3BvcnQjNzguMTAuMTUuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTUuMDMuMDAjQXJtb3JlZCBhaXIgdHJhbnNwb3J0Izc4LjEwLjE1LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE2LjAwLjAwI1JhaWwgY2FyZ28gdHJhbnNwb3J0Izc4LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEwLjE2LjAxLjAwI0JveGNhciB0cmFuc3BvcnQgc2VydmljZXMjNzguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTYuMDIuMDAjQnVsayBjYXJnbyByYWlsIHRyYXNucG9ydCBzZXJ2aWNlcyM3OC4xMC4xNi4wMC4wMAotdW5zcHNjNyM3OC4xMC4xNi4wMy4wMCNMaXZlc3RvY2sgcmFpbCB0cmFuc3BvcnQjNzguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTYuMDQuMDAjVmVoaWNsZSB0cmFuc3BvcnQgc2VydmljZXMjNzguMTAuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTcuMDAuMDAjTWFyaW5lIGNhcmdvIHRyYW5zcG9ydCM3OC4xMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMC4xNy4wMS4wMCNEb21lc3RpYyB2ZXNzZWwgdHJhbnNwb3J0IHNlcnZpY2VzIzc4LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE3LjAyLjAwI0ludGVybmF0aW9uYWwgdmVzc2VsIHRyYW5zcG9ydCBzZXJ2aWNlcyM3OC4xMC4xNy4wMC4wMAotdW5zcHNjNyM3OC4xMC4xNy4wMy4wMCNEb21lc3RpYyBiYXJnZSB0cmFuc3BvcnQgc2VydmljZXMjNzguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTcuMDQuMDAjSW50ZXJuYXRpb25hbCBiYXJnZSB0cmFuc3BvcnQgc2VydmljZXMjNzguMTAuMTcuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTcuMDUuMDAjQXJtb3JlZCBtYXJpbmUgdHJhbnNwb3J0Izc4LjEwLjE3LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE4LjAwLjAwI1JvYWQgY2FyZ28gdHJhbnNwb3J0Izc4LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEwLjE4LjAxLjAwI0xvY2FsIGFyZWEgdHJ1Y2tpbmcgc2VydmljZXMjNzguMTAuMTguMDAuMDAKLXVuc3BzYzcjNzguMTAuMTguMDIuMDAjUmVnaW9uYWwgb3IgbmF0aW9uYWwgdHJ1Y2tpbmcgc2VydmljZXMjNzguMTAuMTguMDAuMDAKLXVuc3BzYzcjNzguMTAuMTguMDMuMDAjVmVoaWNsZSBjYXJyaWVyIHNlcnZpY2VzIzc4LjEwLjE4LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE4LjA0LjAwI1JlbG9jYXRpb24gc2VydmljZXMjNzguMTAuMTguMDAuMDAKLXVuc3BzYzcjNzguMTAuMTkuMDAuMDAjSW50ZXJtb2RhbCBjYXJnbyB0cmFuc3BvcnQjNzguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTkuMDEuMDAjQWlyIHRvIG9jZWFuIHRyYW5zcG9ydGF0aW9uIzc4LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc4LjEwLjE5LjAyLjAwI09jZWFuIHRvIHJhaWwgdHJhbnNwb3J0YXRpb24jNzguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTkuMDMuMDAjT2NlYW4gdG8gdHJ1Y2sgdHJhbnNwb3J0YXRpb24jNzguMTAuMTkuMDAuMDAKLXVuc3BzYzcjNzguMTAuMTkuMDQuMDAjQWlyIHRvIHRydWNrIHRyYW5zcG9ydCM3OC4xMC4xOS4wMC4wMAotdW5zcHNjNyM3OC4xMC4xOS4wNS4wMCNSYWlsIHRydWNrIHRyYW5zcG9ydGF0aW9uIzc4LjEwLjE5LjAwLjAwCi11bnNwc2M3Izc4LjEwLjIwLjAwLjAwI1NwYWNlY3JhZnQgY2FyZ28gdHJhbnNwb3J0Izc4LjEwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEwLjIwLjAxLjAwI1NhdGVsbGl0ZSBsYXVuY2ggc2VydmljZXMjNzguMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjAuMDIuMDAjRXhwZXJpbWVudGFsIHBheWxvYWQgc2VydmljZXMjNzguMTAuMjAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjEuMDAuMDAjUGlwZWxpbmUgc2VydmljZXMjNzguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjEuMDEuMDAjUGV0cm9sZXVtIHByb2R1Y3RzIHRyYW5zcG9ydCM3OC4xMC4yMS4wMC4wMAotdW5zcHNjNyM3OC4xMC4yMS4wMi4wMCNXYXRlciB0cmFuc3BvcnQjNzguMTAuMjEuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjIuMDAuMDAjUG9zdGFsIGFuZCBzbWFsbCBwYXJjZWwgYW5kIGNvdXJpZXIgc2VydmljZXMjNzguMTAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTAuMjIuMDEuMDAjTmF0aW9uYWwgcG9zdGFsIGRlbGl2ZXJ5IHNlcnZpY2VzIzc4LjEwLjIyLjAwLjAwCi11bnNwc2M3Izc4LjEwLjIyLjAyLjAwI1Bvc3Qgb2ZmaWNlIGJveCBzZXJ2aWNlcyM3OC4xMC4yMi4wMC4wMAotdW5zcHNjNyM3OC4xMC4yMi4wMy4wMCNNYWlsaW5nIG9yIG1haWwgcGljayB1cCBvciBkZWxpdmVyeSBzZXJ2aWNlcyM3OC4xMC4yMi4wMC4wMAotdW5zcHNjNyM3OC4xMC4yMi4wNC4wMCNMZXR0ZXIgb3Igc21hbGwgcGFyY2VsIHdvcmxkd2lkZSBkZWxpdmVyeSBzZXJ2aWNlcyM3OC4xMC4yMi4wMC4wMAotdW5zcHNjNyM3OC4xMC4yMi4wNS4wMCNMZXR0ZXIgb3Igc21hbGwgcGFyY2VsIGxvY2FsIGRlbGl2ZXJ5IHNlcnZpY2VzIzc4LjEwLjIyLjAwLjAwCi11bnNwc2M3Izc4LjEwLjIyLjA2LjAwI0JpY3ljbGUgb3Igc2Nvb3RlciBtZXNzZW5nZXIgc2VydmNpZXMjNzguMTAuMjIuMDAuMDAKLXVuc3BzYzcjNzguMTEuMDAuMDAuMDAjUGFzc2VuZ2VyIHRyYW5zcG9ydCM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMS4xNS4wMC4wMCNBaXIgdHJhbnNwb3J0YXRpb24jNzguMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTUuMDEuMDAjSGVsaWNvcHRlciBzZXJ2aWNlcyM3OC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3OC4xMS4xNS4wMi4wMCNDb21tZXJjaWFsIGFpcnBsYW5lIHRyYXZlbCM3OC4xMS4xNS4wMC4wMAotdW5zcHNjNyM3OC4xMS4xNS4wMy4wMCNDaGFydGVyZWQgYWlycGxhbmUgdHJhdmVsIzc4LjExLjE1LjAwLjAwCi11bnNwc2M3Izc4LjExLjE2LjAwLjAwI1JhaWx3YXkgdHJhbnNwb3J0YXRpb24jNzguMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTYuMDEuMDAjTGlnaHQgcmFpbCB2ZWhpY2xlIHRyYW5zcG9ydCAoTFJWKSBzZXJ2aWNlcyM3OC4xMS4xNi4wMC4wMAotdW5zcHNjNyM3OC4xMS4xNi4wMi4wMCNTdWJ3YXkgdHJhbnNwb3J0Izc4LjExLjE2LjAwLjAwCi11bnNwc2M3Izc4LjExLjE2LjAzLjAwI0NvbnRpbmVudGFsIG9yIGludGVyIGNvbnRpbmVudGFsIHJhaWwgc2VydmljZXMjNzguMTEuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTcuMDAuMDAjTWFyaW5lIHRyYW5zcG9ydGF0aW9uIzc4LjExLjAwLjAwLjAwCi11bnNwc2M3Izc4LjExLjE3LjAxLjAwI1dhdGVyIHRheGlzIzc4LjExLjE3LjAwLjAwCi11bnNwc2M3Izc4LjExLjE3LjAyLjAwI092ZXJuaWdodCBzaGlwIGNydWlzZXMjNzguMTEuMTcuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTcuMDMuMDAjU2lnaHRzZWVpbmcgYm9hdCBleGN1cnNpb25zIzc4LjExLjE3LjAwLjAwCi11bnNwc2M3Izc4LjExLjE4LjAwLjAwI1JvYWQgdHJhbnNwb3J0YXRpb24jNzguMTEuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTEuMTguMDEuMDAjQ2FyIHJlbnRhbCBzZXJ2aWNlcyM3OC4xMS4xOC4wMC4wMAotdW5zcHNjNyM3OC4xMS4xOC4wMi4wMCNTY2hlZHVsZWQgYnVzIHNlcnZpY2VzIzc4LjExLjE4LjAwLjAwCi11bnNwc2M3Izc4LjExLjE4LjAzLjAwI0NoYXJ0ZXJlZCBidXMgc2VydmljZXMjNzguMTEuMTguMDAuMDAKLXVuc3BzYzcjNzguMTEuMTguMDQuMDAjVGF4aWNhYiBzZXJ2aWNlcyM3OC4xMS4xOC4wMC4wMAotdW5zcHNjNyM3OC4xMS4xOC4wNS4wMCNUcmFuc3BvcnRhdGlvbiBtYWludGVuYW5jZSM3OC4xMS4xOC4wMC4wMAotdW5zcHNjNyM3OC4xMS4xOC4wNi4wMCNWZWhpY2xlIHJlbnRhbCBvciBsZWFzaW5nIzc4LjExLjE4LjAwLjAwCi11bnNwc2M3Izc4LjExLjE5LjAwLjAwI1NwYWNlIHRyYW5zcG9ydGF0aW9uIzc4LjExLjAwLjAwLjAwCi11bnNwc2M3Izc4LjExLjE5LjAxLjAwI0V4cGVyaW1lbnRhbCBvciBlZHVjYXRpb25hbCBtaXNzaW9ucyM3OC4xMS4xOS4wMC4wMAotdW5zcHNjNyM3OC4xMi4wMC4wMC4wMCNNYXRlcmlhbCBwYWNraW5nIGFuZCBoYW5kbGluZyM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMi4xNS4wMC4wMCNQYWNraW5nIzc4LjEyLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEyLjE1LjAxLjAwI0NvbnRhaW5lcml6YXRpb24gb2YgZ29vZHMjNzguMTIuMTUuMDAuMDAKLXVuc3BzYzcjNzguMTIuMTUuMDIuMDAjQ3JhdGluZyBzZXJ2aWNlcyM3OC4xMi4xNS4wMC4wMAotdW5zcHNjNyM3OC4xMi4xNi4wMC4wMCNNYXRlcmlhbCBoYW5kbGluZyBzZXJ2aWNlcyM3OC4xMi4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMi4xNi4wMS4wMCNGcmVpZ2h0IGxvYWRpbmcgb3IgdW5sb2FkaW5nIzc4LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc4LjEyLjE2LjAyLjAwI1dlaWdoaW5nIHNlcnZpY2VzIzc4LjEyLjE2LjAwLjAwCi11bnNwc2M3Izc4LjEzLjAwLjAwLjAwI1N0b3JhZ2UjNzguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTMuMTUuMDAuMDAjRmFybSBwcm9kdWN0cyB3YXJlaG91c2luZyM3OC4xMy4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMy4xNS4wMS4wMCNTaWxvIHNlcnZpY2VzIzc4LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE1LjAyLjAwI0dyYWluIGVsZXZhdG9yIHNlcnZpY2VzIzc4LjEzLjE1LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE2LjAwLjAwI0dlbmVyYWwgZ29vZHMgc3RvcmFnZSM3OC4xMy4wMC4wMC4wMAotdW5zcHNjNyM3OC4xMy4xNi4wMS4wMCNQYWxsZXRpemVkIGNhcmdvIHN0b3JhZ2UjNzguMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTMuMTYuMDIuMDAjRmlsZSBhcmNoaXZlIHN0b3JhZ2UjNzguMTMuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTMuMTcuMDAuMDAjQnVsayBzdG9yYWdlIzc4LjEzLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEzLjE3LjAxLjAwI0luIGdyb3VuZCBzdG9yYWdlIHNlcnZpY2VzIzc4LjEzLjE3LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE4LjAwLjAwI1NwZWNpYWxpemVkIHdhcmVob3VzaW5nIGFuZCBzdG9yYWdlIzc4LjEzLjAwLjAwLjAwCi11bnNwc2M3Izc4LjEzLjE4LjAxLjAwI1JlZnJpZ2VyYXRlZCBzdG9yYWdlIzc4LjEzLjE4LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE4LjAyLjAwI0N1c3RvbXMgYm9uZGVkIHN0b3JhZ2Ugc2VydmljZXMjNzguMTMuMTguMDAuMDAKLXVuc3BzYzcjNzguMTMuMTguMDMuMDAjSGF6YXJkb3VzIG1hdGVyaWFscyBzdG9yYWdlIzc4LjEzLjE4LjAwLjAwCi11bnNwc2M3Izc4LjEzLjE4LjA0LjAwI0RvY3VtZW50IHN0b3JhZ2Ugc2VydmljZXMjNzguMTMuMTguMDAuMDAKLXVuc3BzYzcjNzguMTQuMDAuMDAuMDAjVHJhbnNwb3J0IG9wZXJhdGlvbnMjNzguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTQuMTUuMDAuMDAjVHJhbnNwb3J0IGFycmFuZ2VtZW50cyM3OC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xNS4wMS4wMCNGcmVpZ2h0IGZvcndhcmRlcnMgc2VydmljZXMjNzguMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzguMTQuMTUuMDIuMDAjQ3VzdG9tcyBicm9rZXJhZ2Ugc2VydmljZXMjNzguMTQuMTUuMDAuMDAKLXVuc3BzYzcjNzguMTQuMTUuMDMuMDAjVHJhbnNwb3J0YXRpb24gaW5kdXN0cnkgdGFyaWZmIGNvbXBhcmlzb24gb3IgZnJlaWdodCBhdWRpdCBzZXJ2aWNlcyM3OC4xNC4xNS4wMC4wMAotdW5zcHNjNyM3OC4xNC4xNi4wMC4wMCNJbnNwZWN0aW9uIzc4LjE0LjAwLjAwLjAwCi11bnNwc2M3Izc4LjE0LjE2LjAxLjAwI1BhY2tpbmcgaW5zcGVjdGlvbiBzZXJ2aWNlcyM3OC4xNC4xNi4wMC4wMAotdW5zcHNjNyM3OC4xNC4xNi4wMi4wMCNDYXJnbyBzdXJ2ZXkgc2VydmljZXMjNzguMTQuMTYuMDAuMDAKLXVuc3BzYzcjNzguMTQuMTYuMDMuMDAjUGVzdCBjb250cm9sIGluc3BlY3Rpb25zIzc4LjE0LjE2LjAwLjAwCi11bnNwc2M3Izc4LjE0LjE3LjAwLjAwI05hdmlnYXRpb25hbCBzZXJ2aWNlcyM3OC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xNy4wMS4wMCNUdWdib2F0IHNlcnZpY2VzIzc4LjE0LjE3LjAwLjAwCi11bnNwc2M3Izc4LjE0LjE3LjAyLjAwI0RyYXdicmlkZ2Ugb3BlcmF0aW9ucyM3OC4xNC4xNy4wMC4wMAotdW5zcHNjNyM3OC4xNC4xOC4wMC4wMCNUZXJtaW5hbCBzZXJ2aWNlcyM3OC4xNC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xOC4wMS4wMCNTdGV2ZWRvcmluZyBzZXJ2aWNlcyM3OC4xNC4xOC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xOC4wMi4wMCNWZXNzZWwgZG9ja2luZyBzZXJ2aWNlcyM3OC4xNC4xOC4wMC4wMAotdW5zcHNjNyM3OC4xNC4xOC4wMy4wMCNWZXNzZWwgc3RvcmVzIHNlcnZpY2VzIzc4LjE0LjE4LjAwLjAwCi11bnNwc2M3Izc4LjE0LjE4LjA0LjAwI1Bhcmtpbmcgc3RydWN0dXJlcyM3OC4xNC4xOC4wMC4wMAotdW5zcHNjNyM3OC4xNS4wMC4wMC4wMCNUcmFuc3BvcnQgaW5kdXN0cnkgc3VwcG9ydCBhbmQgbWFpbnRlbmFuY2UgYW5kIHJlcGFpciBzZXJ2aWNlcyM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xNS4wMS4wMC4wMCNQYW5lbCBhbmQgcGFpbnQgc2VydmljZXMjNzguMTUuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTUuMDEuMDEuMDAjUGFuZWxiZWF0aW5nIHNlcnZpY2VzIzc4LjE1LjAxLjAwLjAwCi11bnNwc2M3Izc4LjE1LjAyLjAwLjAwI1RyYW5zcG9ydCBmdWVsbGluZyBhbmQgdmVoaWNsZSBzdG9yYWdlIGFuZCBzdXBwb3J0IHNlcnZpY2VzIzc4LjE1LjAwLjAwLjAwCi11bnNwc2M3Izc4LjE1LjAyLjAxLjAwI0Z1ZWxsaW5nIG9mIHZlaGljbGVzIzc4LjE1LjAyLjAwLjAwCi11bnNwc2M3Izc4LjE1LjAyLjAyLjAwI1RyYW5zcG9ydGF0aW9uIHN0b3JhZ2UjNzguMTUuMDIuMDAuMDAKLXVuc3BzYzcjNzguMTYuMDAuMDAuMDAjUGFuZWwgYW5kIHBhaW50IHNlcnZpY2VzIzc4LjAwLjAwLjAwLjAwCi11bnNwc2M3Izc4LjE3LjAwLjAwLjAwI1BhbmVsYmVhdGluZyBzZXJ2aWNlcyM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xOC4wMC4wMC4wMCNUcmFuc3BvcnRhdGlvbiBvciB2ZWhpY2xlIHJlcGFpciBzZXJ2aWNlcyM3OC4wMC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xOC4wMS4wMC4wMCNWZWhpY2xlIHJlcGFpciBzZXJ2aWNlcyM3OC4xOC4wMC4wMC4wMAotdW5zcHNjNyM3OC4xOC4wMS4wMS4wMCNWZWhpY2xlIGJvZHkgcmVwYWlyIG9yIHBhaW50aW5nIHNlcnZpY2VzIzc4LjE4LjAxLjAwLjAwCi11bnNwc2M3Izc4LjE4LjAxLjAyLjAwI1RyYW5zbWlzc2lvbiByZXBhaXIjNzguMTguMDEuMDAuMDAKLXVuc3BzYzcjNzguMTkuMDAuMDAuMDAjVmVoaWNsZSByZXBhaXIgc2VydmljZXMjNzguMDAuMDAuMDAuMDAKLXVuc3BzYzcjNzguMTkuMTEuMDAuMDAjVmVoaWNsZSBib2R5IHJlcGFpciBvciBwYWludGluZyBzZXJ2aWNlcyM3OC4xOS4wMC4wMC4wMAotdW5zcHNjNyM3OC4xOS4xMi4wMC4wMCNUcmFuc21pc3Npb24gcmVwYWlyIzc4LjE5LjAwLjAwLjAwCi11bnNwc2M3IzgwLjAwLjAwLjAwLjAwI01hbmFnZW1lbnQgYW5kIEJ1c2luZXNzIFByb2Zlc3Npb25hbHMgYW5kIEFkbWluaXN0cmF0aXZlIFNlcnZpY2VzIzgwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEwLjAwLjAwLjAwI01hbmFnZW1lbnQgYWR2aXNvcnkgc2VydmljZXMjODAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTUuMDAuMDAjQnVzaW5lc3MgYW5kIGNvcnBvcmF0ZSBtYW5hZ2VtZW50IzgwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEwLjE1LjAxLjAwI05ldyBidXNpbmVzcyBzdGFydCB1cCBjb25zdWx0YXRpb24gc2VydmljZXMjODAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTUuMDIuMDAjQ29ycG9yYXRlIG1lcmdlcnMgY29uc3VsdGF0aW9uIHNlcnZpY2VzIzgwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgwLjEwLjE1LjAzLjAwI0NvcnBvcmF0ZSBkaXZlc3RpdHVyZSBjb25zdWx0YXRpb24gc2VydmljZXMjODAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTUuMDQuMDAjU3RyYXRlZ2ljIHBsYW5uaW5nIGNvbnN1bHRhdGlvbiBzZXJ2aWNlcyM4MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNS4wNS4wMCNDb3Jwb3JhdGUgb2JqZWN0aXZlcyBvciBwb2xpY3kgZGV2ZWxvcG1lbnQjODAuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTUuMDYuMDAjT3JnYW5pemF0aW9uYWwgc3RydWN0dXJlIGNvbnN1bHRhdGlvbiM4MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNS4wNy4wMCNJbmZvcm1hdGlvbiB0ZWNobm9sb2d5IGNvbnN1bHRhdGlvbiBzZXJ2aWNlcyM4MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNi4wMC4wMCNQcm9qZWN0IG1hbmFnZW1lbnQjODAuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTYuMDEuMDAjRmVhc2liaWxpdHkgc3R1ZGllcyBvciBzY3JlZW5pbmcgb2YgcHJvamVjdCBpZGVhcyM4MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNi4wMi4wMCNSZWdpb25hbCBvciBsb2NhdGlvbiBzdHVkaWVzIGZvciBwcm9qZWN0cyM4MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNi4wMy4wMCNFY29ub21pYyBvciBmaW5hbmNpYWwgZXZhbHVhdGlvbiBvZiBwcm9qZWN0cyM4MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNi4wNC4wMCNQcm9qZWN0IGFkbWluaXN0cmF0aW9uIG9yIHBsYW5uaW5nIzgwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEwLjE3LjAwLjAwI0luZHVzdHJpYWwgbWFuYWdlbWVudCM4MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNy4wMS4wMCNGYWN0b3J5IG1hbmFnZW1lbnQgc2VydmljZXMjODAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTcuMDIuMDAjUHJvZHVjdGl2aXR5IG9yIGVmZmljaWVuY3kgc3R1ZGllcyBvciBpbXBsZW1lbnRhdGlvbiM4MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNy4wMy4wMCNTcGVjaWZpY2F0aW9uIHN0YW5kYXJkaXphdGlvbiBzZXJ2aWNlcyM4MC4xMC4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMC4xNy4wNC4wMCNTdXBwbHkgY2hhaW4gYW5hbHlzaXMgb3IgcmUgZW5naW5lZXJpbmcgc2VydmljZXMjODAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTcuMDUuMDAjQ28gb3BlcmF0aXZlIG9yIGNvbnNvcnRpdW0gc2VydmljZXMjODAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTAuMTcuMDYuMDAjUHJvZmVzc2lvbmFsIHByb2N1cmVtZW50IHNlcnZpY2VzIzgwLjEwLjE3LjAwLjAwCi11bnNwc2M3IzgwLjExLjAwLjAwLjAwI0h1bWFuIHJlc291cmNlcyBzZXJ2aWNlcyM4MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNS4wMC4wMCNIdW1hbiByZXNvdXJjZSBkZXZlbG9wbWVudCM4MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNS4wMS4wMCNNYW5hZ2VtZW50IGRldmVsb3BtZW50IzgwLjExLjE1LjAwLjAwCi11bnNwc2M3IzgwLjExLjE1LjAyLjAwI0NvbXBlbnNhdGlvbiBvciBiZW5lZml0cyBwbGFubmluZyM4MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNS4wMy4wMCNMYWJvciBvciB1bmlvbiByZWxhdGlvbnMjODAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTUuMDQuMDAjTGFib3IgdHJhaW5pbmcgb3IgZGV2ZWxvcG1lbnQjODAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTUuMDUuMDAjSHVtYW4gcmVzb3VyY2VzIHByb2R1Y3Rpdml0eSBhdWRpdHMjODAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTUuMDYuMDAjUGVyc29ubmVsIHJlbG9jYXRpb24jODAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDAuMDAjVGVtcG9yYXJ5IHBlcnNvbm5lbCBzZXJ2aWNlcyM4MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4wMS4wMCNUZW1wb3JhcnkgY2xlcmljYWwgb3IgYWRtaW5zdHJhdGl2ZSBhc3Npc3RhbmNlIzgwLjExLjE2LjAwLjAwCi11bnNwc2M3IzgwLjExLjE2LjAyLjAwI1RlbXBvcmFyeSBtYXJrZXRpbmcgc3RhZmYgbmVlZHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDMuMDAjVGVtcG9yYXJ5IHByb2R1Y3Rpb24gc3RhZmZpbmcgbmVlZHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDQuMDAjVGVtcG9yYXJ5IHRlY2huaWNpYW4gc3RhZmZpbmcgbmVlZHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDUuMDAjVGVtcG9yYXJ5IGZpbmFuY2lhbCBzdGFmZmluZyBuZWVkcyM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4wNi4wMCNUZW1wb3JhcnkgbWVkaWNhbCBzdGFmZmluZyBuZWVkcyM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4wNy4wMCNUZW1wb3JhcnkgbGVnYWwgc3RhZmZpbmcgbmVlZHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMDguMDAjVGVtcG9yYXJ5IGluZm9ybWF0aW9uIHRlY2hub2xvZ3kgc29mdHdhcmUgZGV2ZWxvcGVycyM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4wOS4wMCNUZW1wb3JhcnkgaW5mb3JtYXRpb24gdGVjaG5vbG9neSBzeXN0ZW1zIG9yIGRhdGFiYXNlIGFkbWluaXN0cmF0b3JzIzgwLjExLjE2LjAwLjAwCi11bnNwc2M3IzgwLjExLjE2LjEwLjAwI1RlbXBvcmFyeSBpbmZvcm1hdGlvbiB0ZWNobm9sb2d5IG5ldHdvcmtpbmcgc3BlY2lhbGlzdHMjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMTEuMDAjVGVtcG9yYXJ5IHdhcmVob3VzZSBzdGFmZiM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4xMi4wMCNUZW1wb3JhcnkgZHJpdmVycyM4MC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMS4xNi4xMy4wMCNUZW1wb3JhcnkgbWFudWFsIGxhYm9yIzgwLjExLjE2LjAwLjAwCi11bnNwc2M3IzgwLjExLjE2LjE0LjAwI1RlbXBvcmFyeSBwcm9mZXNzaW9uYWwgc3RhZmYjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTYuMTUuMDAjVGVtcG9yYXJ5IG1hY2hpbmlzdCBwZXJzb25uZWwjODAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTcuMDAuMDAjUGVyc29ubmVsIHJlY3J1aXRtZW50IzgwLjExLjAwLjAwLjAwCi11bnNwc2M3IzgwLjExLjE3LjAxLjAwI1N0YWZmIHJlY3J1aXRpbmcgc2VydmljZXMjODAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTcuMDIuMDAjUmVmZXJlbmNlIG9yIGJhY2tncm91bmQgY2hlY2sgc2VydmljZXMjODAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTcuMDMuMDAjUmVzdW1lIG9yIGN1cnJpY3VsdW0gdml0YWUgc2NyZWVuaW5nIHNlcnZpY2VzIzgwLjExLjE3LjAwLjAwCi11bnNwc2M3IzgwLjExLjE4LjAwLjAwI0luZm9ybWF0aW9uIHRlY2hub2xvZ3kgY29udHJhY3RvcnMjODAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTEuMTguMDEuMDAjVGVtcG9yYXJ5IGluZm9ybWF0aW9uIHRlY2hub2xvZ3kgY29udHJhY3RvcnMjODAuMTEuMTguMDAuMDAKLXVuc3BzYzcjODAuMTIuMDAuMDAuMDAjTGVnYWwgc2VydmljZXMjODAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTUuMDAuMDAjQ3JpbWluYWwgbGF3IHNlcnZpY2VzIzgwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEyLjE1LjAxLjAwI0p1dmVuaWxlIGp1c3RpY2UgbGF3IHNlcnZpY2VzIzgwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE1LjAyLjAwI0FwcGVsbGF0ZSBwcm9jZWR1cmUgc2VydmljZXMjODAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTUuMDMuMDAjRGVmZW5zZSBvciBjcmltaW5hbCBsYXcgc2VydmljZXMjODAuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTYuMDAuMDAjQnVzaW5lc3MgbGF3IHNlcnZpY2VzIzgwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEyLjE2LjAxLjAwI0dvdmVybm1lbnQgYW50aXRydXN0IG9yIHJlZ3VsYXRpb25zIGxhdyBzZXJ2aWNlcyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4wMi4wMCNCYW5rcnVwdGN5IGxhdyBzZXJ2aWNlcyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4wMy4wMCNQYXJ0bmVyc2hpcCBsYXcjODAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTYuMDQuMDAjUGF0ZW50IG9yIHRyYWRlbWFyayBvciBjb3B5cmlnaHQgbGF3IzgwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE2LjA1LjAwI0xpcXVpZGF0aW9uIGxhdyBzZXJ2aWNlcyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4wNi4wMCNSZWFsIGVzdGF0ZSBsYXcjODAuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTYuMDcuMDAjVGF4YXRpb24gbGF3IzgwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE2LjA4LjAwI01lcmdlcnMgb3IgYWNxdWlzaXRpb25zIGxhdyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4wOS4wMCNMZWdhbCByZXNlYXJjaCBzZXJ2aWNlcyM4MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNi4xMC4wMCNEZWJ0IGNvbGxlY3Rpb24gbGF3IHNlcnZpY2VzIzgwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE3LjAwLjAwI0NpdmlsIGxpYWJpbGl0eSBzZXJ2aWNlcyM4MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNy4wMS4wMCNNYWxwcmFjdGljZSBvciBuZWdsaWdlbmNlIGxhdyBzZXJ2aWNlcyM4MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNy4wMi4wMCNQZXJzb25hbCBpbmp1cnkgbGF3IHNlcnZpY2VzIzgwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE3LjAzLjAwI1Byb3BlcnR5IGxhdyBzZXJ2aWNlcyM4MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMi4xNy4wNC4wMCNDb250cmFjdCBsYXcgc2VydmljZXMjODAuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTIuMTguMDAuMDAjRmFtaWx5IGxhdyBzZXJ2aWNlcyM4MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMi4xOC4wMS4wMCNEaXZvcmNlIGxhdyBzZXJ2aWNlcyM4MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4MC4xMi4xOC4wMi4wMCNBZG9wdGlvbiBsYXcgc2VydmljZXMjODAuMTIuMTguMDAuMDAKLXVuc3BzYzcjODAuMTIuMTguMDMuMDAjSW1taWdyYXRpb24gb3IgbmF0dXJhbGl6YXRpb24gbGF3IzgwLjEyLjE4LjAwLjAwCi11bnNwc2M3IzgwLjEyLjE4LjA0LjAwI0d1YXJkaWFuc2hpcCBvciBjdXN0b2R5IGxhdyBzZXJ2aWNlcyM4MC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4MC4xMy4wMC4wMC4wMCNSZWFsIGVzdGF0ZSBzZXJ2aWNlcyM4MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM4MC4xMy4xNS4wMC4wMCNMZWFzZSBhbmQgcmVudGFsIG9mIHByb3BlcnR5IG9yIGJ1aWxkaW5nIzgwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEzLjE1LjAxLjAwI1Jlc2lkZW50aWFsIHJlbnRhbCM4MC4xMy4xNS4wMC4wMAotdW5zcHNjNyM4MC4xMy4xNS4wMi4wMCNDb21tZXJjaWFsIG9yIGluZHVzdHJpYWwgZmFjaWxpdHkgcmVudGFsIzgwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE1LjAzLjAwI0xhbmQgbGVhc2VzIzgwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE2LjAwLjAwI1NhbGUgb2YgcHJvcGVydHkgYW5kIGJ1aWxkaW5nIzgwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEzLjE2LjAxLjAwI1JlYWwgZXN0YXRlIGJyb2tlcnMgb3IgYWdlbnRzIzgwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE2LjAyLjAwI1JlYWwgZXN0YXRlIGF1Y3Rpb24jODAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTMuMTYuMDMuMDAjU2FsZSBvZiByZXNpZGVudGlhbCBsYW5kIzgwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE2LjA0LjAwI1NhbGUgb2YgY29tbWVyY2lhbCBvciBpbmR1c3RyaWFsIGxhbmQjODAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTMuMTYuMDUuMDAjU2FsZSBvZiBjb21tZXJjaWFsIGJ1aWxkaW5nIzgwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE3LjAwLjAwI0VzY3JvdyBhbmQgdGl0bGUgc2VydmljZXMjODAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTMuMTcuMDEuMDAjVGl0bGUgcmVjb252ZXlhbmNlIHNlcnZpY2VzIzgwLjEzLjE3LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE3LjAyLjAwI1RpdGxlIHNlYXJjaCBzZXJ2aWNlcyM4MC4xMy4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMy4xNy4wMy4wMCNFc2Nyb3cgYWNjb3VudCBzZXJ2aWNlcyM4MC4xMy4xNy4wMC4wMAotdW5zcHNjNyM4MC4xMy4xOC4wMC4wMCNSZWFsIGVzdGF0ZSBtYW5hZ2VtZW50IHNlcnZpY2VzIzgwLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgwLjEzLjE4LjAxLjAwI1Byb3BlcnR5IG1hbmFnZW1lbnQjODAuMTMuMTguMDAuMDAKLXVuc3BzYzcjODAuMTMuMTguMDIuMDAjUmVhbCBlc3RhdGUgYXBwcmFpc2FsIHNlcnZpY2VzIzgwLjEzLjE4LjAwLjAwCi11bnNwc2M3IzgwLjEzLjE4LjAzLjAwI1JlYWwgZXN0YXRlIGxpc3Rpbmcgc2VydmljZXMjODAuMTMuMTguMDAuMDAKLXVuc3BzYzcjODAuMTQuMDAuMDAuMDAjTWFya2V0aW5nIGFuZCBkaXN0cmlidXRpb24jODAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTUuMDAuMDAjTWFya2V0IHJlc2VhcmNoIzgwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE0LjE1LjAxLjAwI01hcmtldGluZyBhbmFseXNpcyM4MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNS4wMi4wMCNEaXN0cmlidXRpdmUgb3Igc2VydmljZSB0cmFkZSBzdGF0aXN0aWNzIzgwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE1LjAzLjAwI0NvbW1vZGl0eSBwcmljZSBmb3JlY2FzdGluZyM4MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNS4wNC4wMCNQcmVwYXJhdGlvbiBvZiBjb21tb2RpdHkgbWFya2V0IHN1cnZleXMjODAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTUuMDUuMDAjTWFya2V0aW5nIHBsYW5zIzgwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE1LjA2LjAwI0ludGVybmV0IGJhc2VkIG1hcmtldCByZXNlYXJjaCM4MC4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNi4wMC4wMCNTYWxlcyBhbmQgYnVzaW5lc3MgcHJvbW90aW9uIGFjdGl2aXRpZXMjODAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTYuMDEuMDAjU2FsZXMgcHJvbW90aW9uIHNlcnZpY2VzIzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjAyLjAwI1B1YmxpYyByZWxhdGlvbiBzZXJ2aWNlcyM4MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNi4wMy4wMCNUZWxlbWFya2V0aW5nIzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjA0LjAwI0JyYW5kaW5nIG9mIHByb2R1Y3QgbmFtaW5nIHNlcnZpY2VzIzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjA1LjAwI1Byb21vdGlvbmFsIG1lcmNoYW5kaXNlIzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjA2LjAwI0RpcmVjdCBtYXJrZXRpbmcgZnVsZmlsbG1lbnQjODAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTYuMDcuMDAjRXZlbnRzIG1hbmFnZW1lbnQjODAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTYuMDguMDAjTGV0dGVyIHNob3Agc2VydmljZXMjODAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTYuMDkuMDAjU3BvbnNvcnNoaXAgb2YgZXZlbnQgb3IgY2VsZWJyaXR5IzgwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE2LjEwLjAwI0Nsb3NlIG91dHMjODAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTcuMDAuMDAjRGlzdHJpYnV0aW9uIzgwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE0LjE3LjAxLjAwI0RpcmVjdCBzYWxlcyBzZXJ2aWNlcyM4MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM4MC4xNC4xNy4wMi4wMCNXaG9sZXNhbGUgZGlzdHJpYnV0aW9uIHNlcnZpY2VzIzgwLjE0LjE3LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE3LjAzLjAwI1JldGFpbCBkaXN0cmlidXRpb24gc2VydmljZXMjODAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTcuMDQuMDAjRnJhbmNoaXNlIG9wZXJhdGlvbnMjODAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODAuMTQuMTcuMDUuMDAjQXVjdGlvbiBzZXJ2aWNlcyM4MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM4MC4xNC4xOC4wMC4wMCNNYWlsaW5nIHNlcnZpY2VzIzgwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE0LjE4LjAxLjAwI01haWxpbmcgbGlzdCBjb21waWxhdGlvbiBzZXJ2aWNlcyM4MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM4MC4xNC4xOC4wMi4wMCNNYWlsaW5nIGxpc3QgbWFuYWdlbWVudCBzZXJ2aWNlIzgwLjE0LjE4LjAwLjAwCi11bnNwc2M3IzgwLjE0LjE4LjAzLjAwI0FkZHJlc3Npbmcgc2VydmljZSM4MC4xNC4xOC4wMC4wMAotdW5zcHNjNyM4MC4xNS4wMC4wMC4wMCNUcmFkZSBwb2xpY3kgYW5kIHNlcnZpY2VzIzgwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgwLjE1LjE1LjAwLjAwI1RyYWRlIGZhY2lsaXRhdGlvbiM4MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNS4wMS4wMCNDb21tb2RpdHkgcG9saWN5IG9yIHByb2plY3Rpb25zIHNlcnZpY2VzIzgwLjE1LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE1LjE1LjAyLjAwI1RyYWRlIGV4cGFuc2lvbiM4MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNS4wMy4wMCNUcmFkZSBpbmZvcm1hdGlvbiBzZXJ2aWNlcyM4MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNS4wNC4wMCNUcmFkZSBwcm9tb3Rpb24gc2VydmljZXMjODAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTUuMTUuMDUuMDAjTXVsdGluYXRpb25hbCBtYXJrZXRpbmcgZW50ZXJwcmlzZXMjODAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTUuMTYuMDAuMDAjSW50ZXJuYXRpb25hbCB0cmFkZSBzZXJ2aWNlcyM4MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNi4wMS4wMCNFeHBvcnQgZGV2ZWxvcG1lbnQjODAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTUuMTYuMDIuMDAjSW1wb3J0IHBsYW5uaW5nIzgwLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgwLjE1LjE2LjAzLjAwI0V4cG9ydCBwcm9qZWN0aW9ucyM4MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM4MC4xNS4xNi4wNC4wMCNJbXBvcnQgcHJvY3VyZW1lbnQgc2VydmljZXMjODAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODAuMTYuMDAuMDAuMDAjQnVzaW5lc3MgYWRtaW5pc3RyYXRpb24gc2VydmljZXMjODAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODAuMTYuMTUuMDAuMDAjTWFuYWdlbWVudCBzdXBwb3J0IHNlcnZpY2VzIzgwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE2LjE1LjAxLjAwI09mZmljZSBhZG1pbmlzdHJhdGlvbiBvciBzZWNyZXRhcmlhbCBzZXJ2aWNlcyM4MC4xNi4xNS4wMC4wMAotdW5zcHNjNyM4MC4xNi4xNS4wMi4wMCNNZWV0aW5nIHBsYW5uaW5nIHNlcnZpY2VzIzgwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE2LjE1LjAzLjAwI0tleWJvYXJkIGVudHJ5IHNlcnZpY2VzIzgwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE2LjE1LjA0LjAwI0NsZXJpY2FsIHNlcnZpY2VzIzgwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE2LjE1LjA1LjAwI0ZsZWV0IG1hbmFnZW1lbnQgc2VydmljZXMjODAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTYuMTUuMDYuMDAjRGF0YSBhcmNoaXZpbmcgc2VydmljZXMjODAuMTYuMTUuMDAuMDAKLXVuc3BzYzcjODAuMTYuMTUuMDcuMDAjQXVkaW8gdmlzdWFsIHNlcnZpY2VzIzgwLjE2LjE1LjAwLjAwCi11bnNwc2M3IzgwLjE2LjE2LjAwLjAwI0J1c2luZXNzIGZhY2lsaXRpZXMgb3ZlcnNpZ2h0IzgwLjE2LjAwLjAwLjAwCi11bnNwc2M3IzgwLjE2LjE2LjAxLjAwI1Byb3BlcnR5IG1hbmFnbWVudCBzZXJ2aWNlcyM4MC4xNi4xNi4wMC4wMAotdW5zcHNjNyM4MS4wMC4wMC4wMC4wMCNFbmdpbmVlcmluZyBhbmQgUmVzZWFyY2ggYW5kIFRlY2hub2xvZ3kgQmFzZWQgU2VydmljZXMjODEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMDAuMDAuMDAjUHJvZmVzc2lvbmFsIGVuZ2luZWVyaW5nIHNlcnZpY2VzIzgxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjAwLjAwI0NpdmlsIGVuZ2luZWVyaW5nIzgxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjAxLjAwI1dlbGwgZW5naW5lZXJpbmcjODEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTUuMDIuMDAjVGVjaG5pY2FsIGRyYXdpbmcjODEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTUuMDMuMDAjSGFyYm9yIG9yIHdhdGVyIHBvcnRzIGVuZ2luZWVyaW5nIzgxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjA1LjAwI1N0cnVjdHVyYWwgZW5naW5lZXJpbmcjODEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTUuMDYuMDAjTmF2YWwgYXJjaGl0ZWN0dXJlIzgxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjA3LjAwI0RhbSBlbmdpbmVlcmluZyM4MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMC4xNS4wOC4wMCNBcmNoaXRlY3R1cmFsIGVuZ2luZWVyaW5nIzgxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE1LjA5LjAwI0FpcnBvcnQgZW5naW5lZXJpbmcjODEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTUuMTAuMDAjSGlnaHdheSBlbmdpbmVlcmluZyM4MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMC4xNS4xMS4wMCNSYWlsd2F5IGVuZ2luZWVyaW5nIzgxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE2LjAwLjAwI01lY2hhbmljYWwgZW5naW5lZXJpbmcjODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTYuMDEuMDAjTWVjaGFuaWNhbCBkcmF3aW5nIzgxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE2LjAyLjAwI01lY2hhbmljYWwgcHJvZHVjdCBlbmNsb3N1cmVzIGRlc2lnbiM4MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMC4xNi4wMy4wMCNNYWNoaW5lIHRvb2wgZGVzaWduIzgxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE2LjA0LjAwI1Bvd2VyIHRyYW5zbWlzc2lvbiBkZXNpZ24jODEuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTcuMDAuMDAjRWxlY3RyaWNhbCBhbmQgZWxlY3Ryb25pYyBlbmdpbmVlcmluZyM4MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMC4xNy4wMS4wMCNFbGVjdHJpY2FsIGVuZ2luZWVyaW5nIHNlcnZpY2VzIzgxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzgxLjEwLjE3LjAyLjAwI0VsZWN0cm9uaWMgY2lyY3VpdCBkZXNpZ24jODEuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTguMDAuMDAjQ2hlbWljYWwgZW5naW5lZXJpbmcjODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTguMDEuMDAjUGxhc3RpY3MgZW5naW5lZXJpbmcjODEuMTAuMTguMDAuMDAKLXVuc3BzYzcjODEuMTAuMTkuMDAuMDAjT2lsIGFuZCBnYXMgZW5naW5lZXJpbmcjODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTkuMDEuMDAjRHJpbGxpbmcgZW5naW5lZXJpbmcgZm9yIG9pbCBvciBnYXMjODEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjODEuMTAuMTkuMDIuMDAjUHJvZHVjdGlvbiBlbmdpbmVlcmluZyBmb3Igb2lsIG9yIGdhcyM4MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM4MS4xMC4xOS4wMy4wMCNSZXNlcnZvaXIgZW5naW5lZXJpbmcgZm9yIG9pbCBvciBnYXMjODEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjODEuMTAuMjAuMDAuMDAjTWluaW5nIGVuZ2luZWVyaW5nIzgxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEwLjIwLjAxLjAwI0h5ZHJhdWxpYyBtaW5pbmcjODEuMTAuMjAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMjEuMDAuMDAjT2NlYW4gZW5naW5lZXJpbmcjODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTAuMjEuMDEuMDAjQ29hc3RhbCBlbmdpbmVlcmluZyM4MS4xMC4yMS4wMC4wMAotdW5zcHNjNyM4MS4xMC4yMi4wMC4wMCNUcmFuc3BvcnRhdGlvbiBlbmdpbmVlcmluZyM4MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMC4yMi4wMS4wMCNUcmFmZmljIGVuZ2luZWVyaW5nIzgxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzgxLjEwLjIyLjAyLjAwI1VyYmFuIHRyYW5zcG9ydCBuZXR3b3JrIzgxLjEwLjIyLjAwLjAwCi11bnNwc2M3IzgxLjEwLjIyLjAzLjAwI0lubGFuZCB3YXRlcndheXMjODEuMTAuMjIuMDAuMDAKLXVuc3BzYzcjODEuMTAuMjMuMDAuMDAjQWVyb25hdXRpY2FsIGVuZ2luZWVyaW5nIzgxLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEwLjIzLjAxLjAwI0F2aW9uaWNzIGRlc2lnbiM4MS4xMC4yMy4wMC4wMAotdW5zcHNjNyM4MS4xMC4yNC4wMC4wMCNBdmlvbmljcyBkZXNpZ24jODEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMDAuMDAuMDAjQ29tcHV0ZXIgc2VydmljZXMjODEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDAuMDAjU29mdHdhcmUgb3IgaGFyZHdhcmUgZW5naW5lZXJpbmcjODEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDEuMDAjTWFpbmZyYW1lIHNvZnR3YXJlIGFwcGxpY2F0aW9ucyBkZXNpZ24jODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDIuMDAjUGVyc29uYWwgY29tcHV0ZXIgKFBDKSBhcHBsaWNhdGlvbiBkZXNpZ24jODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDMuMDAjU3lzdGVtcyBpbnRlZ3JhdGlvbiBkZXNpZ24jODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDQuMDAjQXBwbGljYXRpb24gcHJvZ3JhbW1pbmcgc2VydmljZXMjODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDUuMDAjT3BlcmF0aW5nIHN5c3RlbSBwcm9ncmFtbWluZyBzZXJ2aWNlcyM4MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNS4wNi4wMCNDbGllbnQgb3Igc2VydmVyIHByb2dyYW1taW5nIHNlcnZpY2VzIzgxLjExLjE1LjAwLjAwCi11bnNwc2M3IzgxLjExLjE1LjA3LjAwI0VSUCBvciBkYXRhYmFzZSBhcHBsaWNhdGlvbnMgcHJvZ3JhbW1pbmcgc2VydmljZXMjODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDguMDAjQXBwbGljYXRpb24gaW1wbGVtZW50YXRpb24gc2VydmljZXMjODEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTUuMDkuMDAjSW50ZXJuZXQgb3IgaW50cmFuZXQgY2xpZW50IGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHNlcnZpY2VzIzgxLjExLjE1LjAwLjAwCi11bnNwc2M3IzgxLjExLjE1LjEwLjAwI0ludGVybmV0IG9yIGludHJhbmV0IHNlcnZlciBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCBzZXJ2aWNlcyM4MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNS4xMS4wMCNIdW1hbiByZXNvdXJjZXMgcHJvZHVjdGl2aXR5IGF1ZGl0cyM4MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNi4wMC4wMCNDb21wdXRlciBwcm9ncmFtbWVycyM4MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNi4wMS4wMCNQcm9ncmFtbWluZyBmb3IgVmlzdWFsIEJhc2ljIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjAyLjAwI1Byb2dyYW1taW5nIGZvciBKYXZhIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjAzLjAwI1Byb2dyYW1taW5nIGZvciBIVE1MIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjA0LjAwI1Byb2dyYW1taW5nIGZvciBBTEdPTCM4MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNi4wNS4wMCNQcm9ncmFtbWluZyBmb3IgQXNzZW1ibGVyIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjA2LjAwI1Byb2dyYW1taW5nIGZvciBCYXNpYyM4MS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNi4wNy4wMCNQcm9ncmFtbWluZyBmb3IgQyBvciBDKysjODEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTYuMDguMDAjUHJvZ3JhbW1pbmcgZm9yIENPQk9MIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjA5LjAwI1Byb2dyYW1taW5nIGZvciBGT1JUUkFOIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE2LjEwLjAwI1Byb2dyYW1taW5nIGZvciBQYXNjYWwjODEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTYuMTEuMDAjUHJvZ3JhbW1pbmcgZm9yIFBMLzEjODEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTYuMTIuMDAjUHJvZ3JhbW1pbmcgb3IgUHJvcHJpZXRhcnkgTGFuZ3VhZ2VzIzgxLjExLjE2LjAwLjAwCi11bnNwc2M3IzgxLjExLjE3LjAwLjAwI01hbmFnZW1lbnQgaW5mb3JtYXRpb24gc3lzdGVtcyAoTUlTKSM4MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNy4wMS4wMCNXaWRlIGFyZWEgbmV0d29yayBjb21tdW5pY2F0aW9ucyBkZXNpZ24jODEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTcuMDIuMDAjTG9jYWwgYXJlYSBuZXR3b3JrIGNvbW11bmljYXRpb25zIGRlc2lnbiM4MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNy4wMy4wMCNFbGVjdHJvbmljIGRhdGEgaW50ZXJjaGFuZ2UgKEVESSkgZGVzaWduIzgxLjExLjE3LjAwLjAwCi11bnNwc2M3IzgxLjExLjE3LjA0LjAwI0RhdGFiYXNlIGRlc2lnbiM4MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xMS4xNy4wNS4wMCNTeXN0ZW1zIGFyY2hpdGVjdHVyZSM4MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4wMC4wMCNTeXN0ZW0gYWRtaW5pc3RyYXRvcnMjODEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDEuMDAjQ29tcHV0ZXIgb3IgbmV0d29yayBvciBpbnRlcm5ldCBzZWN1cml0eSM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4wMi4wMCNNYWluZnJhbWUgYWRtaW5pc3RyYXRpb24gc2VydmljZXMjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDMuMDAjTG9jYWwgYXJlYSBuZXR3b3JrIChMQU4pIG1haW50ZW5hbmNlIG9yIHN1cHBvcnQjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDQuMDAjV2lkZSBhcmVhIG5ldHdvcmsgKFdBTikgbWFpbnRlbmFuY2Ugb3Igc3VwcG9ydCM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4wNS4wMCNQcm9wcmlldGFyeSBvciBsaWNlbnNlZCBzeXN0ZW1zIG1haW50ZW5hbmNlIG9yIHN1cHBvcnQjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDYuMDAjRGF0YWJhc2UgYW5hbHlzaXMjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDcuMDAjRGF0YSBzdG9yYWdlIzgxLjExLjE4LjAwLjAwCi11bnNwc2M3IzgxLjExLjE4LjA4LjAwI1N5c3RlbXMgYW5hbHlzaXMjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMDkuMDAjU3lzdGVtIGluc3RhbGxhdGlvbiM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4xMC4wMCNTb2Z0d2FyZSBjb2RpbmcjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMTEuMDAjVGVjaG5pY2FsIHN1cHBvcnQgb3IgaGVscCBkZXNrIHNlcnZpY2VzIzgxLjExLjE4LjAwLjAwCi11bnNwc2M3IzgxLjExLjE4LjEyLjAwI0NvbXB1dGVyIGhhcmR3YXJlIG1haW50ZW5hbmNlIG9yIHN1cHBvcnQjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMTMuMDAjQ29tcHV0ZXIgc29mdHdhcmUgbWFpbnRlbmFuY2Ugb3Igc3VwcG9ydCM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOC4xNC4wMCNDbyBsb2NhdGlvbiBzZXJ2aWNlIzgxLjExLjE4LjAwLjAwCi11bnNwc2M3IzgxLjExLjE4LjE1LjAwI1ByaW50ZXIgbWFpbnRlbmFuY2UgYW5kIHN1cHBvcnQgc2VydmljZXMjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMTYuMDAjTWFpbmZyYW1lIGNvbXB1dGVyIG1haW50ZW5hbmNlIG9yIHN1cHBvcnQjODEuMTEuMTguMDAuMDAKLXVuc3BzYzcjODEuMTEuMTguMTcuMDAjVGVsZWNvbSBlcXVpcG1lbnQgbWFpbnRlbmFuY2Ugb3Igc3VwcG9ydCM4MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOS4wMC4wMCNJbmZvcm1hdGlvbiByZXRyaWV2YWwgc3lzdGVtcyM4MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4xOS4wMS4wMCNEYXRhYmFzZSBpbmZvcm1hdGlvbiByZXRyaWV2YWwjODEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTkuMDIuMDAjT24gbGluZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiByZXRyaWV2YWwjODEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODEuMTEuMTkuMDMuMDAjUmVtb3RlIGRhdGFiYXNlIGluZm9ybWF0aW9uIHJldHJpZXZhbCM4MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMC4wMC4wMCNEYXRhIHNlcnZpY2VzIzgxLjExLjAwLjAwLjAwCi11bnNwc2M3IzgxLjExLjIwLjAxLjAwI09uIGxpbmUgZGF0YSBwcm9jZXNzaW5nIzgxLjExLjIwLjAwLjAwCi11bnNwc2M3IzgxLjExLjIwLjAyLjAwI0RhdGEgcHJvY2Vzc2luZyBvciBwcmVwYXJhdGlvbiBzZXJ2aWNlcyM4MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMC4wMy4wMCNEYXRhIGNlbnRlciBzZXJ2aWNlcyM4MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMC4wNC4wMCNEaXNhc3RlciByZWNvdmVyeSBzZXJ2aWNlcyM4MS4xMS4yMC4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMC4wNS4wMCNEb2N1bWVudCBzY2FubmluZyBzZXJ2aWNlIzgxLjExLjIwLjAwLjAwCi11bnNwc2M3IzgxLjExLjIwLjA2LjAwI0RhdGEgc3RvcmFnZSBzZXJ2aWNlIzgxLjExLjIwLjAwLjAwCi11bnNwc2M3IzgxLjExLjIwLjA3LjAwI0NvbnRlbnQgb3IgZGF0YSBzdGFuZGFyZGl6YXRpb24gc2VydmljZXMjODEuMTEuMjAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDAuMDAjSW50ZXJuZXQgc2VydmljZXMjODEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDEuMDAjSW50ZXJuZXQgc2VydmljZSBwcm92aWRlcnMgKElTUCkjODEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDIuMDAjRWxlY3Ryb25pYyBtYWlsIHNlcnZpY2UgcHJvdmlkZXIjODEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDMuMDAjV29ybGQgd2lkZSB3ZWIgKFdXVykgc2l0ZSBkZXNpZ24gc2VydmljZXMjODEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjEuMDQuMDAjV2ViIHNlYXJjaCBlbmdpbmUgcHJvdmlkZXJzIzgxLjExLjIxLjAwLjAwCi11bnNwc2M3IzgxLjExLjIxLjA1LjAwI1dvcmxkIHdpZGUgd2ViIChXV1cpIHNpdGUgb3BlcmF0aW9uIChob3N0KSBzZXJ2aWNlcyM4MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMS4wNi4wMCNBcHBsaWNhdGlvbiBzZXJ2aWNlIHByb3ZpZGVycyM4MS4xMS4yMS4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMS4wNy4wMCNJbnRlcm5ldCBkb21haW4gbmFtZXMjODEuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjIuMDAuMDAjU29mdHdhcmUgbWFpbnRlbmFuY2UgYW5kIHN1cHBvcnQjODEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTEuMjIuMDEuMDAjTWFpbnRlbmFuY2UgYW5kIHN1cHBvcnQgZmVlcyM4MS4xMS4yMi4wMC4wMAotdW5zcHNjNyM4MS4xMS4yMi4wMi4wMCNTb2Z0d2FyZSBwYXRjaGVzIG9yIHVwZ3JhZGVzIzgxLjExLjIyLjAwLjAwCi11bnNwc2M3IzgxLjEyLjAwLjAwLjAwI0Vjb25vbWljcyM4MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNS4wMC4wMCNFY29ub21pYyBhbmFseXNpcyM4MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNS4wMS4wMCNNYWNybyBlY29ub21pYyBhbmFseXNpcyM4MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNS4wMi4wMCNNaWNybyBlY29ub21pYyBhbmFseXNpcyM4MS4xMi4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNS4wMy4wMCNFY29ub21ldHJpY3MjODEuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTIuMTUuMDQuMDAjRWNvbm9taWMgZm9yZWNhc3RzIzgxLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEyLjE2LjAwLjAwI01vbmV0YXJ5IHN5c3RlbXMgYW5kIGlzc3VlcyM4MS4xMi4wMC4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNi4wMS4wMCNNb25ldGFyeSBwb2xpY3kjODEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTIuMTYuMDIuMDAjTW9uZXRhcnkgc3lzdGVtcyM4MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNi4wMy4wMCNNb25ldGFyeSBhbmFseXNpcyM4MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNi4wNC4wMCNNb25ldGFyeSBsaXF1aWRpdHkjODEuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTIuMTYuMDUuMDAjUHJlY2lvdXMgbWV0YWxzIHJlc2VydmVzIzgxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgxLjEyLjE2LjA2LjAwI0ZvcmVpZ24gZXhjaGFuZ2UgY29udHJvbCM4MS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4MS4xMi4xNi4wNy4wMCNDdXJyZW5jeSBleGNoYW5nZSBtYXJrZXRzIzgxLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgxLjEzLjAwLjAwLjAwI1N0YXRpc3RpY3MjODEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTMuMTUuMDAuMDAjTWV0aG9kb2xvZ3kgYW5kIGFuYWx5c2lzIzgxLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgxLjEzLjE1LjAxLjAwI0ZhY3RvciBhbmFseXNpcyM4MS4xMy4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMy4xNS4wMi4wMCNNdWx0aXZhcmlhdGUgYW5hbHlzaXMjODEuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTMuMTUuMDMuMDAjUmVncmVzc2lvbiBhbmFseXNpcyM4MS4xMy4xNS4wMC4wMAotdW5zcHNjNyM4MS4xMy4xNS4wNC4wMCNTYW1wbGluZyBzdXJ2ZXlzIzgxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgxLjEzLjE1LjA1LjAwI1RpbWUgc2VyaWVzIGFuYWx5c2lzIzgxLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjAwLjAwLjAwI01hbnVmYWN0dXJpbmcgdGVjaG5vbG9naWVzIzgxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjAwLjAwI1F1YWxpdHkgY29udHJvbCM4MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNS4wMS4wMCNNYXRlcmlhbHMgdGVzdGluZyM4MS4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNS4wMi4wMCNNYXRlcmlhbHMgc3ludGhlc2lzIzgxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjAzLjAwI01hdGVyaWFscyBpbnNwZWN0aW9uIzgxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjA0LjAwI0VxdWlwbWVudCB0ZXN0IG9yIGNhbGlicmF0aW9uIzgxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjA1LjAwI1Byb2R1Y3Rpb24gc3RhbmRhcmRzIGRldmVsb3BtZW50IzgxLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE1LjA2LjAwI1Byb2R1Y3QgdGVzdGluZyM4MS4xNC4xNS4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNi4wMC4wMCNTdXBwbHkgY2hhaW4gbWFuYWdlbWVudCM4MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNi4wMS4wMCNMb2dpc3RpY3MjODEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTYuMDIuMDAjVHJhbnNpdCBhbmFseXNpcyM4MS4xNC4xNi4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNi4wMy4wMCNUcmFuc3BvcnQgZmluYW5jZSBvciBlY29ub21pY3MjODEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTYuMDQuMDAjVHJhbnNwb3J0IGZhY2lsaXRhdGlvbiM4MS4xNC4xNi4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNi4wNS4wMCNUcmFuc3BvcnQgaW5mcmFzdHJ1Y3R1cmUjODEuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTYuMDYuMDAjVHJhbnNwb3J0IHBsYW5uaW5nIzgxLjE0LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE3LjAwLjAwI1Byb2R1Y3Rpb24gcGxhbm5pbmcgYW5kIGNvbnRyb2wjODEuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTcuMDEuMDAjUHJvZHVjdGlvbiBwbGFubmluZyM4MS4xNC4xNy4wMC4wMAotdW5zcHNjNyM4MS4xNC4xNy4wMi4wMCNQcm9kdWN0aW9uIGNvbnRyb2wjODEuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODEuMTQuMTcuMDMuMDAjUHJvZHVjdGlvbiBzY2hlZHVsaW5nIzgxLjE0LjE3LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE3LjA0LjAwI1Byb2R1Y3Rpb24gc3RhdGlzdGljcyBjb2xsZWN0aW9uIG9yIGFuYWx5c2lzIHNlcnZpY2VzIzgxLjE0LjE3LjAwLjAwCi11bnNwc2M3IzgxLjE0LjE4LjAwLjAwI0ZhY2lsaXRpZXMgbWFuYWdlbWVudCM4MS4xNC4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xOC4wMS4wMCNTYWZldHkgb3IgcmlzayBhbmFseXNpcyM4MS4xNC4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xOC4wMi4wMCNJbmR1c3RyaWFsIGh5Z2llbmUgb3IgdmVudGlsYXRpb24jODEuMTQuMTguMDAuMDAKLXVuc3BzYzcjODEuMTQuMTguMDMuMDAjQWNvdXN0aWNzIG9yIG5vaXNlIGNvbnRyb2wjODEuMTQuMTguMDAuMDAKLXVuc3BzYzcjODEuMTQuMTguMDQuMDAjRXF1aXBtZW50IGluc3BlY3Rpb24gc2VydmljZSM4MS4xNC4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNC4xOC4wNS4wMCNCdWlsZGluZyBpbnNwZWN0aW9uIHNlcnZpY2UjODEuMTQuMTguMDAuMDAKLXVuc3BzYzcjODEuMTQuMTguMDYuMDAjUG93ZXIgbGluZSBpbnNwZWN0aW9uIHNlcnZpY2UjODEuMTQuMTguMDAuMDAKLXVuc3BzYzcjODEuMTQuMTguMDcuMDAjUGx1bWJpbmcgb3Igc2V3ZXIgaW5zcGVjdGlvbiBzZXJ2aWNlIzgxLjE0LjE4LjAwLjAwCi11bnNwc2M3IzgxLjE1LjAwLjAwLjAwI0VhcnRoIHNjaWVuY2Ugc2VydmljZXMjODEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTUuMDAuMDAjTWV0ZW9yb2xvZ3kjODEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTUuMDEuMDAjQ2xpbWF0b2xvZ3kjODEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTUuMDIuMDAjTWV0ZW9yb2xvZ2ljYWwgc2VydmljZXMjODEuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTUuMDMuMDAjSHlkcm9tZXRlb3JvbG9neSM4MS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4MS4xNS4xNi4wMC4wMCNDYXJ0b2dyYXBoeSM4MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xNi4wMS4wMCNNYXBwaW5nIzgxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE2LjAyLjAwI01hcCBwcm9kdWN0aW9uIzgxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE2LjAzLjAwI1Bob3RvZ3JhbW1ldHJ5IzgxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE2LjA0LjAwI0xhbmQgc3VydmV5aW5nIzgxLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE3LjAwLjAwI0dlb2xvZ3kjODEuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTcuMDEuMDAjUGhvdG9nZW9sb2d5IzgxLjE1LjE3LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE3LjAyLjAwI1N0cmF0aWdyYXBoaWMgZ2VvbG9neSM4MS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xNS4xNy4wMy4wMCNHZW9sb2dpY2FsIHN1cnZleXMjODEuMTUuMTcuMDAuMDAKLXVuc3BzYzcjODEuMTUuMTcuMDQuMDAjR2VvbG9naWNhbCBleHBsb3JhdGlvbiM4MS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xNS4xNy4wNS4wMCNBcmNoYWVvbG9naWNhbCBzZXJ2aWNlcyM4MS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wMC4wMCNPY2Vhbm9ncmFwaHkgYW5kIGh5ZHJvbG9neSM4MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wMS4wMCNPY2Vhbm9ncmFwaGljIHN1cnZleSM4MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wMi4wMCNFc3R1YXJpbmUgb2NlYW5vZ3JhcGh5IzgxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE4LjAzLjAwI1BoeXNpY2FsIG9jZWFub2dyYXBoeSM4MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wNC4wMCNIeWRyb2xvZ2ljYWwgc3VydmV5cyM4MS4xNS4xOC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOC4wNS4wMCNCYXRoeW1ldHJpYyBzdXJ2ZXlzIzgxLjE1LjE4LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE4LjA2LjAwI1VuZGVyd2F0ZXIgZXhwbG9yYXRpb24jODEuMTUuMTguMDAuMDAKLXVuc3BzYzcjODEuMTUuMTkuMDAuMDAjR2VvcGh5c2ljcyM4MS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4MS4xNS4xOS4wMS4wMCNHZW9waHlzaWNhbCBzdXJ2ZXlzIzgxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE5LjAyLjAwI0dlb3BoeXNpY2FsIGV4cGxvcmF0aW9uIzgxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE5LjAzLjAwI0dlb3BoeXNpY2FsIHBob3RvIGludGVycHJldGF0aW9uIzgxLjE1LjE5LjAwLjAwCi11bnNwc2M3IzgxLjE1LjE5LjA0LjAwI0Flcm8gbWFnbmV0aWMgZ2VvcGh5c2ljcyM4MS4xNS4xOS4wMC4wMAotdW5zcHNjNyM4Mi4wMC4wMC4wMC4wMCNFZGl0b3JpYWwgYW5kIERlc2lnbiBhbmQgR3JhcGhpYyBhbmQgRmluZSBBcnQgU2VydmljZXMjODIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTAuMDAuMDAuMDAjQWR2ZXJ0aXNpbmcjODIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTUuMDAuMDAjUHJpbnQgYWR2ZXJ0aXNpbmcjODIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTUuMDEuMDAjQmlsbGJvYXJkIGFkdmVydGlzaW5nIzgyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE1LjAyLjAwI1Bvc3RlciBhZHZlcnRpc2luZyM4Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNS4wMy4wMCNNYWdhemluZSBhZHZlcnRpc2luZyM4Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNS4wNC4wMCNOZXdzcGFwZXIgYWR2ZXJ0aXNpbmcjODIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTUuMDUuMDAjSGFuZGJpbGwgb3IgY291cG9uIGFkdmVydGlzaW5nIzgyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE1LjA2LjAwI1RyYW5zaXQgYWR2ZXJ0aXNpbmcgc2VydmljZXMjODIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTUuMDcuMDAjU2hvcHBpbmcgbmV3cyBvciBhZHZlcnRpc2luZyBvciBkaXN0cmlidXRpb24gc2VydmljZSM4Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNS4wOC4wMCNZZWxsb3cgIHBhZ2VzIGFkdmVydGlzaW5nIzgyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE2LjAwLjAwI0Jyb2FkY2FzdCBhZHZlcnRpc2luZyM4Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNi4wMS4wMCNSYWRpbyBhZHZlcnRpc2luZyM4Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNi4wMi4wMCNUZWxldmlzaW9uIGFkdmVydGlzaW5nIzgyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE2LjAzLjAwI0ludGVybmV0IGFkdmVydGlzaW5nIzgyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgyLjEwLjE3LjAwLjAwI0FlcmlhbCBhZHZlcnRpc2luZyM4Mi4xMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xNy4wMS4wMCNCYW5uZXIgYWR2ZXJ0aXNpbmcgc2VydmljZXMjODIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTcuMDIuMDAjU2t5d3JpdGluZyBhZHZlcnRpc2luZyBzZXJ2aWNlcyM4Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Mi4xMC4xOC4wMC4wMCNBZHZlcnRpc2luZyBhZ2VuY3kgc2VydmljZXMjODIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTAuMTguMDEuMDAjQWR2ZXJ0aXNpbmcgY2FtcGFpZ24gc2VydmljZXMjODIuMTAuMTguMDAuMDAKLXVuc3BzYzcjODIuMTEuMDAuMDAuMDAjV3JpdGluZyBhbmQgdHJhbnNsYXRpb25zIzgyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgyLjExLjE1LjAwLjAwI1RlY2huaWNhbCB3cml0aW5nIzgyLjExLjAwLjAwLjAwCi11bnNwc2M3IzgyLjExLjE1LjAxLjAwI0luc3RydWN0aW9uIHdyaXRpbmcgc2VydmljZXMjODIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTUuMDIuMDAjTWFudWFsIHdyaXRpbmcgc2VydmljZXMjODIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTUuMDMuMDAjQWNhZGVtaWMgb3Igc2NpZW50aWZpYyBhcnRpY2xlIHdyaXRpbmcjODIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTYuMDAuMDAjTm9uIHRlY2huaWNhbCB3cml0aW5nIzgyLjExLjAwLjAwLjAwCi11bnNwc2M3IzgyLjExLjE2LjAxLjAwI0xldHRlciB3cml0aW5nIHNlcnZpY2VzIzgyLjExLjE2LjAwLjAwCi11bnNwc2M3IzgyLjExLjE2LjAyLjAwI1Jlc3VtZSB3cml0aW5nIHNlcnZpY2VzIzgyLjExLjE2LjAwLjAwCi11bnNwc2M3IzgyLjExLjE2LjAzLjAwI0NvdXJ0IHJlcG9ydGluZyBzZXJ2aWNlcyM4Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMS4xNi4wNC4wMCNUcmFuc2NyaWJpbmcgc2VydmljZXMjODIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTcuMDAuMDAjQ3JlYXRpdmUgd3JpdGluZyM4Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMS4xNy4wMS4wMCNBcnRpY2xlIHdyaXRlcnMgc2VydmljZXMjODIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTcuMDIuMDAjQm9vayBhdXRob3JzIHNlcnZpY2VzIzgyLjExLjE3LjAwLjAwCi11bnNwc2M3IzgyLjExLjE3LjAzLjAwI1BvZXRyeSBhdXRob3JzIHNlcnZpY2VzIzgyLjExLjE3LjAwLjAwCi11bnNwc2M3IzgyLjExLjE3LjA0LjAwI0NvcHl3cml0aW5nIzgyLjExLjE3LjAwLjAwCi11bnNwc2M3IzgyLjExLjE3LjA1LjAwI1NwZWVjaCB3cml0aW5nIzgyLjExLjE3LjAwLjAwCi11bnNwc2M3IzgyLjExLjE4LjAwLjAwI0VkaXRvcmlhbCBhbmQgc3VwcG9ydCBzZXJ2aWNlcyM4Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMS4xOC4wMS4wMCNFZGl0aW5nIHNlcnZpY2VzIzgyLjExLjE4LjAwLjAwCi11bnNwc2M3IzgyLjExLjE4LjAyLjAwI0ZhY3QgY2hlY2tpbmcgc2VydmljZXMjODIuMTEuMTguMDAuMDAKLXVuc3BzYzcjODIuMTEuMTguMDMuMDAjUHJvb2ZyZWFkaW5nIHNlcnZpY2VzIzgyLjExLjE4LjAwLjAwCi11bnNwc2M3IzgyLjExLjE4LjA0LjAwI1dyaXR0ZW4gdHJhbnNsYXRpb24gc2VydmljZXMjODIuMTEuMTguMDAuMDAKLXVuc3BzYzcjODIuMTEuMTkuMDAuMDAjTmV3cyBhbmQgcHVibGljaXR5IHNlcnZpY2VzIzgyLjExLjAwLjAwLjAwCi11bnNwc2M3IzgyLjExLjE5LjAxLjAwI1ByZXNzIHJlbGVhc2Ugc2VydmljZXMjODIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTkuMDIuMDAjU3BlY2lhbCBpbnRlcmVzdCBuZXdzbGV0dGVyIHNlcnZpY2VzIzgyLjExLjE5LjAwLjAwCi11bnNwc2M3IzgyLjExLjE5LjAzLjAwI05ld3MgYWdlbmN5IHdpcmUgc2VydmljZXMjODIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODIuMTEuMTkuMDQuMDAjTmV3c3BhcGVyIG9yIGFkdmVydGlzaW5nIG1hdGVyaWFsIGRlbGl2ZXJ5IHNlcnZpY2VzIzgyLjExLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEyLjAwLjAwLjAwI1JlcHJvZHVjdGlvbiBzZXJ2aWNlcyM4Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4wMC4wMCNQcmludGluZyM4Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4wMS4wMCNQbGFubmluZyBvciBsYXlvdXQgb2YgZ3JhcGhpYyBwcm9kdWN0aW9uIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjAyLjAwI1R5cGVzZXR0aW5nIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjAzLjAwI0RpZ2l0YWwgcHJpbnRpbmcjODIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTUuMDQuMDAjTGV0dGVycHJlc3Mgb3Igc2NyZWVuIHByaW50aW5nIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjA1LjAwI1Byb21vdGlvbmFsIG9yIGFkdmVydGlzaW5nIHByaW50aW5nIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjA2LjAwI1B1YmxpY2F0aW9uIHByaW50aW5nIzgyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE1LjA3LjAwI1N0YXRpb25lcnkgb3IgYnVzaW5lc3MgZm9ybSBwcmludGluZyM4Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4wOC4wMCNXcmFwIG9yIHRhZyBvciBsYWJlbCBvciBzZWFsIG9yIGJhZyBwcmludGluZyM4Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4wOS4wMCNTZWN1cml0eSBvciBmaW5hbmNpYWwgaW5zdHJ1bWVudHMgcHJpbnRpbmcjODIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTUuMTAuMDAjVGV4dGlsZSBwcmludGluZyM4Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4xMS4wMCNUZWNobmljYWwgbWFudWFsIGFuZCBpbnN0cnVjdGlvbiBzaGVldCBwcmludGluZyM4Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNS4xMi4wMCNFbWJvc3NpbmcjODIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTYuMDAuMDAjRW5ncmF2aW5nIzgyLjEyLjAwLjAwLjAwCi11bnNwc2M3IzgyLjEyLjE2LjAxLjAwI0N1cnJlbmN5IGVuZ3JhdmluZyM4Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNi4wMi4wMCNFbmdyYXZlZCByb2xsIHByaW50aW5nIzgyLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE2LjAzLjAwI01ldGFsIHBsYXRlIGVuZ3JhdmluZyM4Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xNy4wMC4wMCNQaG90b2NvcHlpbmcjODIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTcuMDEuMDAjQmxhY2sgYW5kIHdoaXRlIGNvcHkgb3IgY29sbGF0aW5nIHNlcnZpY2VzIzgyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE3LjAyLjAwI0NvbG9yIGNvcHkgb3IgY29sbGF0aW5nIHNlcnZpY2VzIzgyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE4LjAwLjAwI1B1Ymxpc2hpbmcjODIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTguMDEuMDAjVGV4dGJvb2sgb3IgcmVzZWFyY2ggcHVibGlzaGluZyM4Mi4xMi4xOC4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xOC4wMi4wMCNBdXRob3IgZnVuZGVkIHB1Ymxpc2hpbmcgc2VydmljZXMjODIuMTIuMTguMDAuMDAKLXVuc3BzYzcjODIuMTIuMTkuMDAuMDAjQm9va2JpbmRpbmcjODIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTIuMTkuMDEuMDAjVGhyZWFkIHN0aXRjaCBib29rYmluZGluZyM4Mi4xMi4xOS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xOS4wMi4wMCNTcGlyYWwgYmluZGluZyM4Mi4xMi4xOS4wMC4wMAotdW5zcHNjNyM4Mi4xMi4xOS4wMy4wMCNHbHVlZCBiaW5kaW5nIzgyLjEyLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE5LjA0LjAwI0NvbWIgb3IgY2xhbXAgdHlwZSBiaW5kaW5nIzgyLjEyLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE5LjA1LjAwI0JpbmRpbmcgcmVzdG9yYXRpb24gb3IgcmVwYWlyIzgyLjEyLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEyLjE5LjA2LjAwI0Jyb256aW5nIG9yIGdpbGRpbmcgb3IgZWRnaW5nIG9yIGRlY2tsaW5nIzgyLjEyLjE5LjAwLjAwCi11bnNwc2M3IzgyLjEzLjAwLjAwLjAwI1Bob3RvZ3JhcGhpYyBzZXJ2aWNlcyM4Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNS4wMC4wMCNGaWxtIHByb2Nlc3Npbmcgc2VydmljZXMjODIuMTMuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTMuMTUuMDEuMDAjU3RpbGwgZmlsbSBwcm9jZXNzaW5nIG9yIHJlcHJvZHVjdGlvbiM4Mi4xMy4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNS4wMi4wMCNNb3Rpb24gcGljdHVyZSBmaWxtIHByb2Nlc3Npbmcgb3IgcmVwcm9kdWN0aW9uIzgyLjEzLjE1LjAwLjAwCi11bnNwc2M3IzgyLjEzLjE1LjAzLjAwI01pY3JvZmljaGUgc2VydmljZXMjODIuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTMuMTUuMDQuMDAjQ29sb3Igc2VwYXJhdGlvbiM4Mi4xMy4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNi4wMC4wMCNQaG90b2dyYXBoZXJzIGFuZCBjaW5lbWF0b2dyYXBoZXJzIzgyLjEzLjAwLjAwLjAwCi11bnNwc2M3IzgyLjEzLjE2LjAxLjAwI0FlcmlhbCBwaG90b2dyYXBoeSBzZXJ2aWNlcyM4Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNi4wMi4wMCNNb3Rpb24gcGljdHVyZSBjaW5lbWF0b2dyYXBoeSM4Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xMy4xNi4wMy4wMCNWaWRlbyBwcm9kdWN0aW9uIHNlcnZpY2VzIzgyLjEzLjE2LjAwLjAwCi11bnNwc2M3IzgyLjEzLjE2LjA0LjAwI1N0dWRpbyBwaG90b2dyYXBoeSBzZXJ2aWNlcyBvciBzdGlsbCBwaG90b2dyYXBocyM4Mi4xMy4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xNC4wMC4wMC4wMCNHcmFwaGljIGRlc2lnbiM4Mi4wMC4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNS4wMC4wMCNBcnQgZGVzaWduIHNlcnZpY2VzIzgyLjE0LjAwLjAwLjAwCi11bnNwc2M3IzgyLjE0LjE1LjAxLjAwI0xheW91dCBvciBncmFwaGljcyBlZGl0aW5nIHNlcnZpY2VzIzgyLjE0LjE1LjAwLjAwCi11bnNwc2M3IzgyLjE0LjE1LjAyLjAwI0FydCBkZXNpZ24gb3IgZ3JhcGhpY3MjODIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTQuMTUuMDMuMDAjUGhvdG9jb21wb3NpdGlvbiM4Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNS4wNC4wMCNDaGFydCBvciBncmFwaCBkZXNpZ24gc2VydmljZXMjODIuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTQuMTUuMDUuMDAjQ29tcHV0ZXIgZ2VuZXJhdGVkIGRlc2lnbiBzZXJ2aWNlcyM4Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNS4wNi4wMCNQYWNrYWdlIGRlc2lnbiBzZXJ2aWNlcyM4Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNS4wNy4wMCNTaWxrc2NyZWVuIGRlc2lnbiBzZXJ2aWNlcyM4Mi4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNi4wMC4wMCNHcmFwaGljIGRpc3BsYXkgc2VydmljZXMjODIuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTQuMTYuMDEuMDAjUGhvdG9ncmFwaGljIG9yIHBpY3R1cmUgbW91bnRpbmcgb3IgZnJhbWluZyBzZXJ2aWNlcyM4Mi4xNC4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xNC4xNi4wMi4wMCNBcnRpY2xlIGRpc3BsYXkgYXJyYW5nZW1lbnQjODIuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODIuMTUuMDAuMDAuMDAjUHJvZmVzc2lvbmFsIGFydGlzdHMgYW5kIHBlcmZvcm1lcnMjODIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTUuMDAuMDAjVmlzdWFsIGFydCBzZXJ2aWNlcyM4Mi4xNS4wMC4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wMS4wMCNQYWludGVycyBzZXJ2aWNlcyM4Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wMi4wMCNMaXRob2dyYXBoZXJzIHNlcnZpY2VzIzgyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE1LjAzLjAwI0NhcnRvb25pc3RzIHNlcnZpY2VzIzgyLjE1LjE1LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE1LjA0LjAwI1NjdWxwdG9ycyBzZXJ2aWNlcyM4Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wNS4wMCNDZXJhbWljcyBtYWtlcnMgc2VydmljZXMjODIuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTUuMDYuMDAjR2xhc3MgYmxvd2VycyBzZXJ2aWNlcyM4Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wNy4wMCNUZXh0aWxlIHNwaW5uZXJzIG9yIGxvb21lcnMgb3Igd2VhdmVycyBzZXJ2aWNlcyM4Mi4xNS4xNS4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNS4wOC4wMCNUYXhpZGVybXkgc2VydmljZXMjODIuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTYuMDAuMDAjQ2lyY3VzIHBlcmZvcm1lcnMjODIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTYuMDEuMDAjQW5pbWFsIHRyYWluZXJzIHNlcnZpY2VzIzgyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE2LjAyLjAwI0Fjcm9iYXRzIHNlcnZpY2VzIzgyLjE1LjE2LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE2LjAzLjAwI01hZ2ljaWFucyBzZXJ2aWNlcyM4Mi4xNS4xNi4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNi4wNC4wMCNDbG93bnMgc2VydmljZXMjODIuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTcuMDAuMDAjUGVyZm9ybWluZyBhcnRzIHByb2Zlc3Npb25hbHMjODIuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTcuMDEuMDAjQWN0aW5nIHNlcnZpY2VzIzgyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE3LjAyLjAwI0NvbWVkaWFucyBzZXJ2aWNlcyM4Mi4xNS4xNy4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNy4wMy4wMCNEYW5jZXJzIHNlcnZpY2VzIzgyLjE1LjE3LjAwLjAwCi11bnNwc2M3IzgyLjE1LjE3LjA0LjAwI011c2ljaWFucyBzZXJ2aWNlcyM4Mi4xNS4xNy4wMC4wMAotdW5zcHNjNyM4Mi4xNS4xNy4wNS4wMCNWb2NhbGlzdHMgc2VydmljZXMjODIuMTUuMTcuMDAuMDAKLXVuc3BzYzcjODIuMTUuMTcuMDYuMDAjQ2hvcmVvZ3JhcGhpYyBzZXJ2aWNlcyM4Mi4xNS4xNy4wMC4wMAotdW5zcHNjNyM4My4wMC4wMC4wMC4wMCNQdWJsaWMgVXRpbGl0aWVzIGFuZCBQdWJsaWMgU2VjdG9yIFJlbGF0ZWQgU2VydmljZXMjODMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTAuMDAuMDAuMDAjVXRpbGl0aWVzIzgzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEwLjE1LjAwLjAwI1dhdGVyIGFuZCBzZXdlciB1dGlsaXRpZXMjODMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDEuMDAjU3VwcGx5IG9mIHdhdGVyIzgzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE1LjAyLjAwI1dhdGVyIHJlc291cmNlIG1hbmFnZW1lbnQjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDMuMDAjV2F0ZXIgcXVhbGl0eSBjb250cm9sIG1hbmFnZW1lbnQjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDQuMDAjV2F0ZXIgZGlzdHJpYnV0aW9uIG1hbmFnZW1lbnQjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDUuMDAjV2F0ZXIgcG9saWN5IGFkdmlzb3J5IHNlcnZpY2VzIzgzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE1LjA2LjAwI1dhdGVyIHRyZWF0bWVudCBzZXJ2aWNlcyM4My4xMC4xNS4wMC4wMAotdW5zcHNjNyM4My4xMC4xNS4wNy4wMCNEZXNhbGluYXRpb24gc2VydmljZXMjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTUuMDguMDAjVG93biB3YXRlciM4My4xMC4xNS4wMC4wMAotdW5zcHNjNyM4My4xMC4xNS4wOS4wMCNTZXJ2aWNlIHdhdGVyIzgzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE1LjEwLjAwI0NoaWxsZWQgd2F0ZXIjODMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTYuMDAuMDAjT2lsIGFuZCBnYXMgdXRpbGl0aWVzIzgzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEwLjE2LjAxLjAwI1N1cHBseSBvZiBuYXR1cmFsIGdhcyM4My4xMC4xNi4wMC4wMAotdW5zcHNjNyM4My4xMC4xNi4wMi4wMCNTdXBwbHkgb2YgZnVlbCBvaWwjODMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTYuMDMuMDAjT2lsIHBpcGVsaW5lIHNlcnZpY2VzIzgzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE2LjA0LjAwI0dhcyBwaXBlbGluZSBzZXJ2aWNlcyM4My4xMC4xNi4wMC4wMAotdW5zcHNjNyM4My4xMC4xNi4wNS4wMCNHYXMgZmFjaWxpdHkgY2hhcmdlIzgzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE4LjAwLjAwI0VsZWN0cmljIHV0aWxpdGllcyM4My4xMC4wMC4wMC4wMAotdW5zcHNjNyM4My4xMC4xOC4wMS4wMCNTdXBwbHkgb2Ygc2luZ2xlIHBoYXNlIGVsZWN0cmljaXR5IzgzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE4LjAyLjAwI1N1cHBseSBvZiB0d28gcGhhc2UgZWxlY3RyaWNpdHkjODMuMTAuMTguMDAuMDAKLXVuc3BzYzcjODMuMTAuMTguMDMuMDAjU3VwcGx5IG9mIHRocmVlIHBoYXNlIGVsZWN0cmljaXR5IzgzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE4LjA0LjAwI0VsZWN0cmljIHBvd2VyIHRyYW5zbWlzc2lvbiBzZXJ2aWNlcyM4My4xMC4xOC4wMC4wMAotdW5zcHNjNyM4My4xMC4xOC4wNS4wMCNJbmR1c3RyaWFsIGVsZWN0cmljIHBvd2VyIGRpc3RyaWJ1dGlvbiM4My4xMC4xOC4wMC4wMAotdW5zcHNjNyM4My4xMC4xOC4wNi4wMCNSdXJhbCBlbGVjdHJpY2FsIHBvd2VyIGRpc3RyaWJ1dGlvbiM4My4xMC4xOC4wMC4wMAotdW5zcHNjNyM4My4xMC4xOC4wNy4wMCNNdW5pY2lwYWwgZWxlY3RyaWMgcG93ZXIgZGlzdHJpYnV0aW9uIzgzLjEwLjE4LjAwLjAwCi11bnNwc2M3IzgzLjEwLjE5LjAwLjAwI0VuZXJneSBjb25zZXJ2YXRpb24jODMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTAuMTkuMDEuMDAjRW5lcmd5IGNvbnNlcnZhdGlvbiBwcm9ncmFtcyM4My4xMC4xOS4wMC4wMAotdW5zcHNjNyM4My4xMC4xOS4wMi4wMCNFbmVyZ3kgdXNlIHJlZHVjdGlvbiBtZWFzdXJlcyM4My4xMC4xOS4wMC4wMAotdW5zcHNjNyM4My4xMC4yMC4wMC4wMCNGdW5lcmFsIHNlcnZpY2VzIzgzLjEwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEwLjIwLjAxLjAwI0dyYXZlIGRpZ2dpbmcjODMuMTAuMjAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMDAuMDAuMDAjVGVsZWNvbW11bmljYXRpb25zIG1lZGlhIHNlcnZpY2VzIzgzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjExLjE1LjAwLjAwI0xvY2FsIGFuZCBsb25nIGRpc3RhbmNlIHRlbGVwaG9uZSBjb21tdW5pY2F0aW9ucyM4My4xMS4wMC4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wMS4wMCNMb2NhbCB0ZWxlcGhvbmUgc2VydmljZSM4My4xMS4xNS4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wMi4wMCNMb25nIGRpc3RhbmNlIHRlbGVwaG9uZSBzZXJ2aWNlcyM4My4xMS4xNS4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wMy4wMCNQYXkgcGhvbmUgcHJvdmlkZXIgc2VydmljZXMjODMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTUuMDQuMDAjUHJlIHBhaWQgcGhvbmUgY2FyZCBzZXJ2aWNlcyM4My4xMS4xNS4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wNS4wMCNEaXJlY3RvcnkgYXNzaXN0YW5jZSBzZXJ2aWNlcyM4My4xMS4xNS4wMC4wMAotdW5zcHNjNyM4My4xMS4xNS4wNi4wMCNDb25mZXJlbmNlIGNhbGxpbmcgc2VydmljZXMjODMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTUuMDcuMDAjQ2FsbCBjZW50cmUgYnVyZWF1IHNlcnZpY2VzIzgzLjExLjE1LjAwLjAwCi11bnNwc2M3IzgzLjExLjE1LjA4LjAwI1RvbGwgZnJlZSBpbmJvdW5kIHRlbGVwaG9uZSBzZXJ2aWNlIzgzLjExLjE1LjAwLjAwCi11bnNwc2M3IzgzLjExLjE1LjA5LjAwI1RlbGVwaG9uZSBlcXVpcG1lbnQgcmVwYWlyIHNlcnZpY2VzIzgzLjExLjE1LjAwLjAwCi11bnNwc2M3IzgzLjExLjE2LjAwLjAwI01vYmlsZSBjb21tdW5pY2F0aW9ucyBzZXJ2aWNlcyM4My4xMS4wMC4wMC4wMAotdW5zcHNjNyM4My4xMS4xNi4wMS4wMCNUZWxlY29tbXVuaWNhdGlvbiBzaWduYWwgZW5oYW5jZW1lbnQgbmV0d29yayBzZXJ2aWNlcyM4My4xMS4xNi4wMC4wMAotdW5zcHNjNyM4My4xMS4xNi4wMi4wMCNTYXRlbGxpdGUgb3IgZWFydGggY29tbXVuaWNhdGlvbiBzeXN0ZW1zIHNlcnZpY2VzIzgzLjExLjE2LjAwLjAwCi11bnNwc2M3IzgzLjExLjE2LjAzLjAwI0NlbGx1bGFyIHRlbGVwaG9uZSBzZXJ2aWNlcyM4My4xMS4xNi4wMC4wMAotdW5zcHNjNyM4My4xMS4xNi4wNC4wMCNQYWdpbmcgc2VydmljZXMjODMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTcuMDAuMDAjRmFjc2ltaWxlIGFuZCB0ZWxlZ3JhcGggc2VydmljZXMjODMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTcuMDEuMDAjRmFjc2ltaWxlIHRyYW5zbWlzc2lvbiBzZXJ2aWNlcyM4My4xMS4xNy4wMC4wMAotdW5zcHNjNyM4My4xMS4xNy4wMi4wMCNUZWxlZ3JhcGggdHJhbnNtaXNzaW9uIHNlcnZpY2VzIzgzLjExLjE3LjAwLjAwCi11bnNwc2M3IzgzLjExLjE3LjAzLjAwI1RlbGV4IHRyYW5zbWlzc2lvbiBzZXJ2aWNlcyM4My4xMS4xNy4wMC4wMAotdW5zcHNjNyM4My4xMS4xOC4wMC4wMCNUZWxldmlzaW9uIHNlcnZpY2VzIzgzLjExLjAwLjAwLjAwCi11bnNwc2M3IzgzLjExLjE4LjAxLjAwI0NhYmxlIHRlbGV2aXNpb24gc2VydmljZXMjODMuMTEuMTguMDAuMDAKLXVuc3BzYzcjODMuMTEuMTguMDIuMDAjQ2xvc2VkIGNpcmN1aXQgdGVsZXZpc2lvbiBzZXJ2aWNlcyM4My4xMS4xOC4wMC4wMAotdW5zcHNjNyM4My4xMS4xOC4wMy4wMCNUZWxldmlzaW9uIGFudGVubmEgY29uc3RydWN0aW9uIG9yIHJlbnRhbCBzZXJ2aWNlcyM4My4xMS4xOC4wMC4wMAotdW5zcHNjNyM4My4xMS4xOC4wNC4wMCNUZWxldmlzaW9uIGJyb2FkY2FzdGluZyBzdGF0aW9uIG1hbmFnZW1lbnQjODMuMTEuMTguMDAuMDAKLXVuc3BzYzcjODMuMTEuMTkuMDAuMDAjUmFkaW8gc2VydmljZXMjODMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTkuMDEuMDAjUmFkaW8gYnJvYWRjYXN0aW5nIHN0YXRpb24gbWFuYWdlbWVudCM4My4xMS4xOS4wMC4wMAotdW5zcHNjNyM4My4xMS4xOS4wMi4wMCNBbWF0ZXVyIHJhZGlvIG5ldHdvcmtzIG9yIHNlcnZpY2VzIzgzLjExLjE5LjAwLjAwCi11bnNwc2M3IzgzLjExLjE5LjAzLjAwI1NtYWxsIHNjYWxlIHJhZGlvIHN5c3RlbXMjODMuMTEuMTkuMDAuMDAKLXVuc3BzYzcjODMuMTEuMTkuMDQuMDAjUmFkaW8gc3R1ZGlvIG9yIGVxdWlwbWVudCBzZXJ2aWNlcyM4My4xMS4xOS4wMC4wMAotdW5zcHNjNyM4My4xMS4yMC4wMC4wMCNGaWJlciB0ZWxlY29tbXVuaWNhdGlvbnMgc2VydmljZXMjODMuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjAuMDEuMDAjRGFyayBmaWJlciM4My4xMS4yMC4wMC4wMAotdW5zcHNjNyM4My4xMS4yMC4wMi4wMCNEZW5zZSB3YXZlbGVuZ3RoIGRpdmlzaW9uIG11bHRpcGxleGluZyBEV0RNIzgzLjExLjIwLjAwLjAwCi11bnNwc2M3IzgzLjExLjIwLjAzLjAwI1dhdmUgZGl2aXNpb24gbXVsdGlwbGV4aW5nIFdETSM4My4xMS4yMC4wMC4wMAotdW5zcHNjNyM4My4xMS4yMC4wNC4wMCNPY3ggb3B0aWNhbCBjYXJyaWVyIHNlcnZpY2UjODMuMTEuMjAuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjEuMDAuMDAjU3dpdGNoZWQgZGlhbCB1cCBhbmQgbGVhc2VkIGRlZGljYXRlZCBsaW5lIGNpcmN1aXQgdGVsZWNvbW11bmljYXRpb25zIHNlcnZpY2VzIzgzLjExLjAwLjAwLjAwCi11bnNwc2M3IzgzLjExLjIxLjAxLjAwI0hpZ2ggc3BlZWQgY2lyY3VpdCBzd2l0Y2hlZCBkaWFsIHVwIHNlcnZpY2VzIzgzLjExLjIxLjAwLjAwCi11bnNwc2M3IzgzLjExLjIxLjAyLjAwI0lTRE4gaW50ZWdyYXRlZCBzZXJ2aWNlcyBkaWdpdGFsIG5ldHdvcmsgc2VydmljZXMjODMuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjEuMDMuMDAjUG9pbnQgdG8gcG9pbnQgZGlnaXRhbCB0ZWxlY29tbXVuaWNhdGlvbnMgY2lyY3VpdCM4My4xMS4yMS4wMC4wMAotdW5zcHNjNyM4My4xMS4yMS4wNC4wMCNNdWx0aSBwb2ludCBhbmFsb2cgdGVsZWNvbW11bmljYXRpb25zIGNpcmN1aXQjODMuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjEuMDUuMDAjUG9pbnQgdG8gcG9pbnQgYW5hbG9nIHRlbGVjb21tdW5pY2F0aW9ucyBjaXJjdWl0IzgzLjExLjIxLjAwLjAwCi11bnNwc2M3IzgzLjExLjIxLjA2LjAwI3hEU0wgZGlnaXRhbCBzdWJzY3JpYmVyIGxpbmUjODMuMTEuMjEuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjIuMDAuMDAjRW5oYW5jZWQgdGVsZWNvbW11bmljYXRpb25zIHNlcnZpY2VzIzgzLjExLjAwLjAwLjAwCi11bnNwc2M3IzgzLjExLjIyLjAxLjAwI0FUTSBhc3luY3Jvbm91cyB0cmFuc2ZlciBtb2RlIG1hbmFnZWQgbmV0d29yayBzZXJ2aWNlcyM4My4xMS4yMi4wMC4wMAotdW5zcHNjNyM4My4xMS4yMi4wMi4wMCNGcmFtZSByZWxheSBwdWJsaWMgbWFuYWdlZCBuZXR3b3JrIHNlcnZpY2VzIzgzLjExLjIyLjAwLjAwCi11bnNwc2M3IzgzLjExLjIyLjAzLjAwI1ZQTiB2aXJ0dWFsIHByaXZhdGUgbmV0d29yayBtYW5hZ2VkIG5ldHdvcmsgc2VydmljZXMjODMuMTEuMjIuMDAuMDAKLXVuc3BzYzcjODMuMTEuMjIuMDQuMDAjWDc1IG1hbmFnZWQgbmV0d29yayBzZXJ2aWNlcyM4My4xMS4yMi4wMC4wMAotdW5zcHNjNyM4My4xMS4yMi4wNS4wMCNYMjUgbWFuYWdlZCBuZXR3b3JrIHNlcnZpY2VzIzgzLjExLjIyLjAwLjAwCi11bnNwc2M3IzgzLjEyLjAwLjAwLjAwI0luZm9ybWF0aW9uIHNlcnZpY2VzIzgzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEyLjE1LjAwLjAwI0xpYnJhcmllcyM4My4xMi4wMC4wMC4wMAotdW5zcHNjNyM4My4xMi4xNS4wMS4wMCNHZW5lcmFsIG11bmljaXBhbCBwdWJsaWMgdXNlIGxpYnJhcmllcyM4My4xMi4xNS4wMC4wMAotdW5zcHNjNyM4My4xMi4xNS4wMi4wMCNDb2xsZWdlIG9yIHVuaXZlcnNpdHkgbGlicmFyaWVzIzgzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE1LjAzLjAwI1ByaXZhdGVseSBvd25lZCBsaWJyYXJpZXMjODMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODMuMTIuMTUuMDQuMDAjTmF0aW9uYWwgZ292ZXJubWVudCBvciBtaWxpdGFyeSBwb3N0IGxpYnJhcmllcyM4My4xMi4xNS4wMC4wMAotdW5zcHNjNyM4My4xMi4xNi4wMC4wMCNJbmZvcm1hdGlvbiBjZW50ZXJzIzgzLjEyLjAwLjAwLjAwCi11bnNwc2M3IzgzLjEyLjE2LjAxLjAwI0NoYW1iZXJzIG9mIGNvbW1lcmNlIzgzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE2LjAyLjAwI1RvdXJpc20gYm9hcmQgc2VydmljZXMjODMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODMuMTIuMTYuMDMuMDAjQ29tcHV0ZXJpemVkIGluZm9ybWF0aW9uIHJldHJpZXZhbCBzeXN0ZW1zIzgzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE2LjA0LjAwI09ubGluZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiByZXRyaWV2YWwgc3lzdGVtcyM4My4xMi4xNi4wMC4wMAotdW5zcHNjNyM4My4xMi4xNi4wNS4wMCNSZW1vdGUgZGF0YWJhc2UgaW5mb3JtYXRpb24gcmV0cmlldmFsIHNlcnZpY2VzIzgzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE2LjA2LjAwI1NraXAgdHJhY2luZyM4My4xMi4xNi4wMC4wMAotdW5zcHNjNyM4My4xMi4xNy4wMC4wMCNNYXNzIGNvbW11bmljYXRpb24gc2VydmljZXMjODMuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODMuMTIuMTcuMDEuMDAjVGVsZXZpc2lvbiByZWxhdGVkIHNlcnZpY2VzIzgzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzgzLjEyLjE3LjAyLjAwI1JhZGlvIHJlbGF0ZWQgc2VydmljZXMjODMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODMuMTIuMTcuMDMuMDAjSW50ZXJuZXQgcmVsYXRlZCBzZXJ2aWNlcyM4My4xMi4xNy4wMC4wMAotdW5zcHNjNyM4My4xMi4xNy4wNC4wMCNDaXRpemVuIHdhcm5pbmcgc3lzdGVtcyM4My4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NC4wMC4wMC4wMC4wMCNGaW5hbmNpYWwgYW5kIEluc3VyYW5jZSBTZXJ2aWNlcyM4NC4wMC4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMC4wMC4wMC4wMCNEZXZlbG9wbWVudCBmaW5hbmNlIzg0LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEwLjE1LjAwLjAwI0RldmVsb3BtZW50IGFzc2lzdGFuY2UjODQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTUuMDEuMDAjRmluYW5jaWFsIGFzc2lzdGFuY2UjODQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTUuMDIuMDAjU2F2aW5ncyBtb2JpbGl6YXRpb24gcHJvZ3JhbXMjODQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTUuMDMuMDAjR3VhcmFudGVlIGFncmVlbWVudHMjODQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTYuMDAuMDAjQWlkIGZpbmFuY2luZyM4NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNi4wMS4wMCNDbyBmaW5hbmNpbmcjODQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTYuMDIuMDAjQmkgbGF0ZXJhbCBvciBtdWx0aSBsYXRlcmFsIGFpZCM4NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNi4wMy4wMCNOb24gZ292ZXJubWVudGFsIGFpZCM4NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNi4wNC4wMCNHb3Zlcm5tZW50IGFpZCM4NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNy4wMC4wMCNEZWJ0IG1hbmFnZW1lbnQjODQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTAuMTcuMDEuMDAjRGVidCBuZWdvdGlhdGlvbiM4NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNy4wMi4wMCNEZWJ0IHJlb3JnYW5pemF0aW9uIzg0LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg0LjEwLjE3LjAzLjAwI0RlYnQgc2VydmljaW5nIzg0LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg0LjEwLjE3LjA0LjAwI0RlYnQgY29sbGVjdGlvbiBzZXJ2aWNlcyM4NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMC4xNy4wNS4wMCNSZXBvc3Nlc3Npb24gc2VydmljZXMjODQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTEuMDAuMDAuMDAjQWNjb3VudGluZyBhbmQgYXVkaXRpbmcjODQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDAuMDAjQWNjb3VudGluZyBzZXJ2aWNlcyM4NC4xMS4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMS4xNS4wMS4wMCNDb3N0IGFjY291bnRpbmcjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDIuMDAjRmluYW5jaWFsIGFjY291bnRpbmcjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDMuMDAjVGF4IGFjY291bnRpbmcjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDQuMDAjQm9va2tlZXBpbmcgc2VydmljZXMjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDUuMDAjUGF5cm9sbCBhY2NvdW50aW5nIHNlcnZpY2VzIzg0LjExLjE1LjAwLjAwCi11bnNwc2M3Izg0LjExLjE1LjA2LjAwI0JpbGxpbmcgc2VydmljZXMjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTUuMDcuMDAjSW52ZW50b3J5IGFjY291bnRpbmcjODQuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTYuMDAuMDAjQXVkaXQgc2VydmljZXMjODQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTYuMDEuMDAjWWVhciBlbmQgYXVkaXRzIzg0LjExLjE2LjAwLjAwCi11bnNwc2M3Izg0LjExLjE2LjAyLjAwI1F1YXJ0ZXJseSByZXZpZXdzIzg0LjExLjE2LjAwLjAwCi11bnNwc2M3Izg0LjExLjE2LjAzLjAwI0ludGVybmFsIGF1ZGl0cyM4NC4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMS4xNy4wMC4wMCNDb3Jwb3JhdGUgZmluYW5jZSM4NC4xMS4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMS4xNy4wMS4wMCNUcmVhc3VyeSBzZXJ2aWNlcyM4NC4xMS4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMS4xNy4wMi4wMCNJbnZlc3RvciByZWxhdGlvbnMgc2VydmljZXMgb3IgcHJvZ3JhbXMjODQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTEuMTcuMDMuMDAjQnVkZ2V0IHByZXBhcmF0aW9uIG9yIHJldmlldyBzZXJ2aWNlcyM4NC4xMS4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMS4xOC4wMC4wMCNUYXhhdGlvbiBpc3N1ZXMgYW5kIHByZXBhcmF0aW9uIzg0LjExLjAwLjAwLjAwCi11bnNwc2M3Izg0LjExLjE4LjAxLjAwI1RheCBwcmVwYXJlcnMjODQuMTEuMTguMDAuMDAKLXVuc3BzYzcjODQuMTEuMTguMDIuMDAjVGF4IGFkdmlzb3J5IHNlcnZpY2VzIzg0LjExLjE4LjAwLjAwCi11bnNwc2M3Izg0LjEyLjAwLjAwLjAwI0JhbmtpbmcgYW5kIGludmVzdG1lbnQjODQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTUuMDAuMDAjQmFua2luZyBpbnN0aXR1dGlvbnMjODQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTUuMDEuMDAjUHJpdmF0ZWx5IG93bmVkIGJhbmtzIzg0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE1LjAyLjAwI1B1YmxpY2x5IG93bmVkIGJhbmtzIzg0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE1LjAzLjAwI0NyZWRpdCB1bmlvbnMjODQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTUuMDQuMDAjRGV2ZWxvcG1lbnQgZmluYW5jZSBpbnN0aXR1dGlvbnMjODQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDAuMDAjRnVuZHMgdHJhbnNmZXIgYW5kIGNsZWFyYW5jZSBhbmQgZXhjaGFuZ2Ugc2VydmljZXMjODQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDEuMDAjRnVuZHMgY2xlYXJhbmNlIHNlcnZpY2VzIzg0LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE2LjAyLjAwI0xldHRlciBvZiBjcmVkaXQgc2VydmljZXMjODQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDMuMDAjQ3VycmVuY3kgZXhjaGFuZ2Ugc2VydmljZXMjODQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDQuMDAjU3BvdCBleGNoYW5nZSB0cmFuc2FjdGlvbiBzZXJ2aWNlcyM4NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMi4xNi4wNS4wMCNDdXJyZW5jeSBjb252ZXJzaW9uIHNlcnZpY2UjODQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTYuMDYuMDAjUmVtaXR0YW5jZSBwcm9jZXNzaW5nIHNlcnZpY2VzIzg0LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE3LjAwLjAwI0ludmVzdG1lbnQgYWR2aWNlIzg0LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEyLjE3LjAxLjAwI0ludmVzdG1lbnQgYWR2aXNlcnMjODQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTcuMDIuMDAjSW52ZXN0bWVudCBwb2xpY3kjODQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTcuMDMuMDAjSW52ZXN0bWVudCBhbmFseXNpcyM4NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMi4xNy4wNC4wMCNJbnZlc3RtZW50IGFncmVlbWVudHMjODQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTcuMDUuMDAjTWFya2V0IGRhdGEjODQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTguMDAuMDAjU2VjdXJpdGllcyBhbmQgY29tbW9kaXRpZXMgbWFya2V0cyBzZXJ2aWNlcyM4NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOC4wMS4wMCNTdG9jayBtYXJrZXQgdHJhZGluZyBzZXJ2aWNlcyM4NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOC4wMi4wMCNDb21tb2RpdGllcyBvciBmdXR1cmVzIG1hcmtldCBzZXJ2aWNlcyM4NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOC4wMy4wMCNHb3Zlcm5tZW50IGJvbmRzIzg0LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg0LjEyLjE4LjA0LjAwI1ByaXZhdGVseSBpc3N1ZWQgYm9uZHMjODQuMTIuMTguMDAuMDAKLXVuc3BzYzcjODQuMTIuMTguMDUuMDAjUHJlY2lvdXMgbWV0YWxzIG1hcmtldCBzZXJ2aWNlcyM4NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOS4wMC4wMCNNb3J0Z2FnZSBiYW5raW5nIzg0LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEyLjE5LjAxLjAwI0hvdXNpbmcgZmluYW5jZSM4NC4xMi4xOS4wMC4wMAotdW5zcHNjNyM4NC4xMi4xOS4wMi4wMCNSZSBmaW5hbmNpbmcgc2VydmljZXMjODQuMTIuMTkuMDAuMDAKLXVuc3BzYzcjODQuMTIuMTkuMDMuMDAjQ29tbWVyY2lhbCBtb3J0Z2FnZSBmaW5hbmNlIzg0LjEyLjE5LjAwLjAwCi11bnNwc2M3Izg0LjEyLjIwLjAwLjAwI0Nhc2ggdmF1bHQgc2VydmljZXMjODQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTIuMjAuMDEuMDAjRGVwb3NpdCB2ZXJpZmljYXRpb24gc2VydmljZXMjODQuMTIuMjAuMDAuMDAKLXVuc3BzYzcjODQuMTMuMDAuMDAuMDAjSW5zdXJhbmNlIGFuZCByZXRpcmVtZW50IHNlcnZpY2VzIzg0LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEzLjE1LjAwLjAwI0luc3VyYW5jZSBzZXJ2aWNlcyBmb3Igc3RydWN0dXJlcyBhbmQgcHJvcGVydHkgYW5kIHBvc3Nlc3Npb25zIzg0LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEzLjE1LjAxLjAwI0J1aWxkaW5nIG9yIGJ1aWxkaW5nIGNvbnRlbnRzIGluc3VyYW5jZSM4NC4xMy4xNS4wMC4wMAotdW5zcHNjNyM4NC4xMy4xNS4wMi4wMCNIb21lb3duZXJzIG9yIHJlbnRlcnMgaW5zdXJhbmNlIzg0LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE1LjAzLjAwI0NhciBvciB0cnVjayBpbnN1cmFuY2UjODQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTUuMDQuMDAjQ2FyZ28gaW5zdXJhbmNlIzg0LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE1LjA1LjAwI01hcmluZSBpbnN1cmFuY2UjODQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTUuMDYuMDAjUmVpbnN1cmFuY2Ugc2VydmljZXMjODQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTYuMDAuMDAjTGlmZSBhbmQgaGVhbHRoIGFuZCBhY2NpZGVudCBpbnN1cmFuY2UjODQuMTMuMDAuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTYuMDEuMDAjTGlmZSBpbnN1cmFuY2UjODQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTYuMDIuMDAjSGVhbHRoIG9yIGhvc3BpdGFsaXphdGlvbiBpbnN1cmFuY2UjODQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTYuMDMuMDAjQWNjaWRlbnRhbCBpbmp1cnkgaW5zdXJhbmNlIzg0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE2LjA0LjAwI0Rpc2FiaWxpdHkgaW5zdXJhbmNlIzg0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE2LjA1LjAwI1dvcmttZW5zIGluc3VyYW5jZSM4NC4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NC4xMy4xNi4wNi4wMCNVbmVtcGxveW1lbnQgaW5zdXJhbmNlIzg0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izg0LjEzLjE2LjA3LjAwI0xpYWJpbGl0eSBpbnN1cmFuY2UjODQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODQuMTMuMTcuMDAuMDAjUGVuc2lvbiBmdW5kcyM4NC4xMy4wMC4wMC4wMAotdW5zcHNjNyM4NC4xMy4xNy4wMS4wMCNFbXBsb3llciBhZG1pbmlzdGVyZWQgcGVuc2lvbiBmdW5kcyM4NC4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMy4xNy4wMi4wMCNVbmlvbiBvciBndWlsZCBhZG1pbmlzdGVyZWQgcGVuc2lvbiBmdW5kcyM4NC4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NC4xMy4xOC4wMC4wMCNSZXRpcmVtZW50IGZ1bmRzIzg0LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg0LjEzLjE4LjAxLjAwI1NlbGYgZGlyZWN0ZWQgb3IgZW1wbG95ZXIgc3BvbnNvcmVkIHJldGlyZW1lbnQgZnVuZHMjODQuMTMuMTguMDAuMDAKLXVuc3BzYzcjODQuMTMuMTguMDIuMDAjU2VsZiBkaXJlY3RlZCBvciBzZWxmIGluaXRpYXRlZCByZXRpcmVtZW50IHBsYW5zIzg0LjEzLjE4LjAwLjAwCi11bnNwc2M3Izg0LjE0LjAwLjAwLjAwI0NyZWRpdCBhZ2VuY2llcyM4NC4wMC4wMC4wMC4wMAotdW5zcHNjNyM4NC4xNC4xNS4wMC4wMCNHb3Zlcm5tZW50YWwgY3JlZGl0IGFnZW5jaWVzIzg0LjE0LjAwLjAwLjAwCi11bnNwc2M3Izg0LjE0LjE1LjAxLjAwI0Zhcm0gY3JlZGl0IHNlcnZpY2VzIzg0LjE0LjE1LjAwLjAwCi11bnNwc2M3Izg0LjE0LjE1LjAyLjAwI1NtYWxsIGJ1c2luZXNzIGxvYW4gYWdlbmNpZXMjODQuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTQuMTUuMDMuMDAjTWlub3JpdHkgb3duZWQgYnVzaW5lc3MgcHJvZ3JhbXMjODQuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODQuMTQuMTYuMDAuMDAjUGVyc29uYWwgY3JlZGl0IGFnZW5jaWVzIzg0LjE0LjAwLjAwLjAwCi11bnNwc2M3Izg0LjE0LjE2LjAxLjAwI0NvbnN1bWVyIGNyZWRpdCBnYXRoZXJpbmcgb3IgcmVwb3J0aW5nIHNlcnZpY2VzIzg0LjE0LjE2LjAwLjAwCi11bnNwc2M3Izg0LjE0LjE2LjAyLjAwI0NyZWRpdCBjYXJkIHNlcnZpY2UgcHJvdmlkZXJzIzg0LjE0LjE2LjAwLjAwCi11bnNwc2M3Izg0LjE0LjE3LjAwLjAwI0J1c2luZXNzIGNyZWRpdCBhZ2VuY2llcyM4NC4xNC4wMC4wMC4wMAotdW5zcHNjNyM4NC4xNC4xNy4wMS4wMCNCdXNpbmVzcyBjcmVkaXQgZ2F0aGVyaW5nIG9yIHJlcG9ydGluZyBzZXJ2aWNlcyM4NC4xNC4xNy4wMC4wMAotdW5zcHNjNyM4NC4xNC4xNy4wMi4wMCNWYWx1ZSBhZGRlZCBuZXR3b3JrIChWQU4pIHNlcnZpY2VzIzg0LjE0LjE3LjAwLjAwCi11bnNwc2M3Izg1LjAwLjAwLjAwLjAwI0hlYWx0aGNhcmUgU2VydmljZXMjODUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTAuMDAuMDAuMDAjQ29tcHJlaGVuc2l2ZSBoZWFsdGggc2VydmljZXMjODUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTUuMDAuMDAjSGVhbHRoY2FyZSBjZW50ZXJzIzg1LjEwLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEwLjE1LjAxLjAwI0VtZXJnZW5jeSBvciBzdXJnaWNhbCBob3NwaXRhbCBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wMi4wMCNQcml2YXRlIHNwZWNpYWxpemVkIGNsaW5pYyBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wMy4wMCNNZWRpY2FsIG9mZmljZSBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wNC4wMCNQc3ljaGlhdHJpYyBob3NwaXRhbCBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wNS4wMCNSZXNwaXJhdG9yeSBob3NwaXRhbCBzZXJ2aWNlcyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wNi4wMCNTdWJzdGFuY2UgYWJ1c2UgaG9zcGl0YWwgc2VydmljZXMjODUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTUuMDcuMDAjVXJnZW50IGNhcmUgY2VudGVycyM4NS4xMC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNS4wOC4wMCNNb2JpbGUgaGVhbHRoY2FyZSBjZW50ZXJzIG9yIHNlcnZpY2VzIzg1LjEwLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEwLjE1LjA5LjAwI0d5bmVjb2xvZ2ljYWwgb3Igb2JzdGV0cmljYWwgaG9zcGl0YWwgc2VydmljZXMjODUuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTYuMDAuMDAjSGVhbHRoY2FyZSBwcm92aWRlciBzdXBwb3J0IHBlcnNvbnMjODUuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTYuMDEuMDAjTnVyc2luZyBzZXJ2aWNlcyM4NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNi4wMi4wMCNNaWR3aWZlcnkgb3IgY2hpbGQgYmlydGggcHJlcGFyYXRpb24gc2VydmljZXMjODUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTYuMDMuMDAjUGVyc29uYWwgY2FyZSBzZXJ2aWNlcyBpbiBzcGVjaWFsaXplZCBpbnN0aXR1dGlvbnMjODUuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTYuMDQuMDAjUGh5c2ljaWFucyBwZXJzb25uZWwgYXNzaXN0YW5jZSBzZXJ2aWNlcyM4NS4xMC4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNi4wNS4wMCNIb21lIGhlYWx0aCBhc3Npc3RhbnRzIzg1LjEwLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEwLjE3LjAwLjAwI0hlYWx0aCBhZG1pbmlzdHJhdGlvbiBzZXJ2aWNlcyM4NS4xMC4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNy4wMS4wMCNIZWFsdGggcG9saWN5Izg1LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEwLjE3LjAyLjAwI0hlYWx0aCBsZWdpc2xhdGlvbiBvciByZWd1bGF0aW9ucyM4NS4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNy4wMy4wMCNIZWFsdGggc2VydmljZSBwbGFubmluZyM4NS4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNy4wNC4wMCNIZWFsdGggZWNvbm9taWNzIzg1LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEwLjE3LjA1LjAwI1B1YmxpYyBoZWFsdGggYWRtaW5pc3RyYXRpb24jODUuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTAuMTcuMDYuMDAjVHJhZGl0aW9uYWwgaGVhbHRoY2FyZSBzZXJ2aWNlcyM4NS4xMC4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMC4xNy4wNy4wMCNIZWFsdGggc3lzdGVtcyBldmFsdWF0aW9uIHNlcnZpY2VzIzg1LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg1LjExLjAwLjAwLjAwI0Rpc2Vhc2UgcHJldmVudGlvbiBhbmQgY29udHJvbCM4NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wMC4wMCNDb250YWdpb3VzIGRpc2Vhc2UgcHJldmVudGlvbiBhbmQgY29udHJvbCM4NS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wMS4wMCNBaWRzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wMi4wMCNQYXJhc2l0aWMgZGlzZWFzZSBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTUuMDMuMDAjRnVuZ2FsIGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wNC4wMCNUdWJlcmN1bG9zaXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjA1LjAwI0xlcHJvc3kgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjA2LjAwI0JhY3RlcmlhbCBkaXNlYXNlIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4wNy4wMCNTZXh1YWxseSB0cmFuc21pdHRlZCBkaXNlYXNlcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTUuMDguMDAjVmlyYWwgZGlzZWFzZXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjA5LjAwI1pvb25vdGljIGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4xMC4wMCNWYWNjaW5hdGlvbiBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4xMS4wMCNRdWFyYW50aW5lIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjEyLjAwI0ltbXVuaXphdGlvbiBzZXJ2aWNlcyM4NS4xMS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNS4xMy4wMCNEaXNpbnNlY3RpemF0aW9uIHNlcnZpY2VzIzg1LjExLjE1LjAwLjAwCi11bnNwc2M3Izg1LjExLjE1LjE0LjAwI0VwaWRlbWljcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDAuMDAjTm9uIGNvbnRhZ2lvdXMgZGlzZWFzZSBwcmV2ZW50aW9uIGFuZCBjb250cm9sIzg1LjExLjAwLjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjAxLjAwI0JvbmUgZGlzZWFzZXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjAyLjAwI0NhbmNlciBvciBsZXVrZW1pYSBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDMuMDAjRW5kb2NyaW5lIGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNi4wNC4wMCNIZWFydCBkaXNlYXNlcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDUuMDAjSW1tdW5vbG9naWMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjA2LjAwI0FsbGVyZ2llcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDcuMDAjTmV1cm9sb2dpY2FsIGRpc29yZGVycyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMDguMDAjTnV0cml0aW9uYWwgZGlzZWFzZXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjA5LjAwI1JhZGlhdGlvbiBzaWNrbmVzcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMTAuMDAjRGlnZXN0aXZlIHN5c3RlbSBkaXNlYXNlcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMTEuMDAjRXllIGRpc2Vhc2UgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjEyLjAwI1Jlc3BpcmF0b3J5IGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNi4xMy4wMCNUcm9waWNhbCBkaXNlYXNlcyBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTYuMTQuMDAjQ2hpbGRob29kIGRpc2Vhc2VzIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNi4xNS4wMCNEaWFycmhlYWwgZGlzZWFzZXMgcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjE2LjAwI0FsY29ob2xpc20gcHJldmVudGlvbiBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE2LjAwLjAwCi11bnNwc2M3Izg1LjExLjE2LjE3LjAwI0RydWcgYWRkaWN0aW9uIHByZXZlbnRpb24gb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNy4wMC4wMCNEaXNlYXNlIHZlY3RvcnMgbWFuYWdlbWVudCBhbmQgY29udHJvbCM4NS4xMS4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNy4wMS4wMCNUaWNrcyBtYW5hZ2VtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTcuMDIuMDAjVHNldHNlIGZsaWVzIG1hbmFnZW1lbnQgb3IgY29udHJvbCBzZXJ2aWNlcyM4NS4xMS4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMS4xNy4wMy4wMCNCYWN0ZXJpYSBtYW5hZ2VtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTEuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTEuMTcuMDQuMDAjTW9zcXVpdG8gbWFuYWdlbWVudCBvciBjb250cm9sIHNlcnZpY2VzIzg1LjExLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEyLjAwLjAwLjAwI01lZGljYWwgcHJhY3RpY2UjODUuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTUuMDAuMDAjUHJpbWFyeSBjYXJlIHByYWN0aXRpb25lcnMgc2VydmljZXMjODUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTUuMDEuMDAjUHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMgaG9tZSB2aXNpdHMgc2VydmljZXMjODUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTUuMDIuMDAjUHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMgY29uc3VsdGF0aW9uIHNlcnZpY2VzIzg1LjEyLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE1LjAzLjAwI1ByaW1hcnkgY2FyZSBwaHlzaWNpYW5zIGNvbnRyb2wgc2VydmljZXMjODUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTUuMDQuMDAjUHJpbWFyeSBjYXJlIHBoeXNpY2lhbnMgZW1lcmdlbmN5IG1lZGljYWwgc2VydmljZXMjODUuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMDAuMDAjTWVkaWNhbCBkb2N0b3JzIHNwZWNpYWxpc3Qgc2VydmljZXMjODUuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMDEuMDAjR3luZWNvbG9naWMgb3Igb2JzdGV0cmljIHNlcnZpY2VzIzg1LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE2LjAyLjAwI05lcGhyb2xvZ3kgc2VydmljZXMjODUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMDMuMDAjQ2FyZGlvbG9neSBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4wNC4wMCNQdWxvbW9uYXJ5IHNwZWNpYWxpc3RzIHNlcnZpY2VzIzg1LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE2LjA1LjAwI0dhc3Ryb2VudGVyb2xvZ2lzdHMgc2VydmljZXMjODUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMDYuMDAjR2VyaWF0cmljIHNlcnZpY2VzIzg1LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE2LjA3LjAwI1BzeWNoaWF0cmlzdCBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4wOC4wMCNQc3ljaG9sb2dpc3RzIHNlcnZpY2VzIzg1LjEyLjE2LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE2LjA5LjAwI1N1cmdlcnkgc2VydmljZXMjODUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMTAuMDAjT3BodGhhbG1vbG9naXN0cyBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4xMS4wMCNEZXJtYXRvbG9neSBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4xMi4wMCNPcnRob3BlZGljcyBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNi4xMy4wMCNQZWRpYXRyaWMgc2VydmljZXMjODUuMTIuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTYuMTQuMDAjTmVydm91cyBzeXN0ZW0gc3BlY2lhbGlzdCBzZXJ2aWNlcyM4NS4xMi4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNy4wMC4wMCNIZWFsdGhjYXJlIHByb3ZpZGVycyBzcGVjaWFsaXN0cyBzZXJ2aWNlcyM4NS4xMi4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNy4wMS4wMCNQc3ljaG90aGVyYXBpc3RzIHNlcnZpY2VzIzg1LjEyLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE3LjAyLjAwI09wdG9tZXRyaXN0cyBzZXJ2aWNlcyM4NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNy4wMy4wMCNQb2RpYXRyaXN0cyBzZXJ2aWNlcyM4NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMi4xNy4wNC4wMCNTcGVlY2ggc3BlY2lhbGlzdHMgc2VydmljZXMjODUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTcuMDUuMDAjQWN1cHVuY3R1cmlzdHMgc2VydmljZXMjODUuMTIuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTIuMTcuMDYuMDAjQ2hpcm9wcmFjdG9ycyBzZXJ2aWNlcyM4NS4xMi4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4wMC4wMCNNZWRpY2FsIGxhYm9yYXRvcmllcyM4NS4xMi4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4wMS4wMCNCbG9vZCBhbmFseXNpcyBsYWJvcmF0b3J5IHNlcnZpY2VzIzg1LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE4LjAyLjAwI0JhY3RlcmlvbG9naWNhbCBsYWJvcmF0b3J5IHNlcnZpY2VzIzg1LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE4LjAzLjAwI0Jpb2xvZ2ljYWwgbGFib3JhdG9yeSBzZXJ2aWNlcyM4NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4wNC4wMCNQYXRob2xvZ2ljYWwgbGFib3JhdG9yeSBzZXJ2aWNlcyM4NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4wNS4wMCNVcmluYWx5c2lzIGxhYm9yYXRvcnkgc2VydmljZXMjODUuMTIuMTguMDAuMDAKLXVuc3BzYzcjODUuMTIuMTguMDYuMDAjTmV1cm9sb2dpY2FsIGxhYm9yYXRvcnkgc2VydmljZXMjODUuMTIuMTguMDAuMDAKLXVuc3BzYzcjODUuMTIuMTguMDcuMDAjVWx0cmFzb3VuZCBsYWJvcmF0b3J5IHNlcnZpY2VzIzg1LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE4LjA4LjAwI1ggcmF5IGxhYm9yYXRvcnkgc2VydmljZXMjODUuMTIuMTguMDAuMDAKLXVuc3BzYzcjODUuMTIuMTguMDkuMDAjQmxvb2Qgb3Igc3Blcm0gb3IgdHJhbnNwbGFudCBvcmdhbiBiYW5rcyBzZXJ2aWNlcyM4NS4xMi4xOC4wMC4wMAotdW5zcHNjNyM4NS4xMi4xOC4xMC4wMCNEcnVnIG9yIGFsY29ob2wgc2NyZWVuaW5nIzg1LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE5LjAwLjAwI1BoYXJtYWNpc3RzIzg1LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjE5LjAxLjAwI1BoYXJtYWNldXRpY2FsIHByZXBhcmF0aW9uIHNlcnZpY2VzIzg1LjEyLjE5LjAwLjAwCi11bnNwc2M3Izg1LjEyLjE5LjAyLjAwI0NvbW1lcmNpYWwgcGhhcm1hY2V1dGljYWwgc2VydmljZXMjODUuMTIuMTkuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjAuMDAuMDAjRGVudGFsIHNlcnZpY2VzIzg1LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIwLjAxLjAwI0RlbnRpc3RzIHNlcnZpY2VzIzg1LjEyLjIwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIwLjAyLjAwI0RlbnRhbCBoeWdpZW5pc3RzIHNlcnZpY2VzIzg1LjEyLjIwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIwLjAzLjAwI0RlbnRpc3Qgc3VwcG9ydCBzdGFmZiBzZXJ2aWNlcyM4NS4xMi4yMC4wMC4wMAotdW5zcHNjNyM4NS4xMi4yMC4wNC4wMCNPcmFsIHN1cmdlb25zIHNlcnZpY2VzIzg1LjEyLjIwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIwLjA1LjAwI09ydGhvZG9udGljIHNlcnZpY2VzIzg1LjEyLjIwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIxLjAwLjAwI1JlaGFiaWxpdGF0aW9uIHNlcnZpY2VzIzg1LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIxLjAxLjAwI1BoeXNpY2FsIHRoZXJhcHkgc2VydmljZXMjODUuMTIuMjEuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjEuMDIuMDAjT2NjdXBhdGlvbmFsIHRoZXJhcHkgc2VydmljZXMjODUuMTIuMjEuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjEuMDMuMDAjUmVoYWJpbGl0YXRpb24gc2VydmljZXMgZm9yIHN1YnN0YW5jZSBhYnVzZSM4NS4xMi4yMS4wMC4wMAotdW5zcHNjNyM4NS4xMi4yMS4wNC4wMCNBdGhsZXRpYyByZWhhYmlsaXRhdGlvbiBzZXJ2aWNlcyM4NS4xMi4yMS4wMC4wMAotdW5zcHNjNyM4NS4xMi4yMS4wNS4wMCNFYXRpbmcgZGlzb3JkZXJzIHNlcnZpY2VzIzg1LjEyLjIxLjAwLjAwCi11bnNwc2M3Izg1LjEyLjIxLjA2LjAwI0JyYWluIG9yIHNwaW5hbCBjb3JkIGluanVyeSBzZXJ2aWNlcyM4NS4xMi4yMS4wMC4wMAotdW5zcHNjNyM4NS4xMi4yMS4wNy4wMCNCbGluZCBvciB2aXNpb24gaW1wYWlyZWQgcmVoYWJpbGl0YXRpb24gc2VydmljZXMjODUuMTIuMjEuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjEuMDguMDAjU3BlZWNoIG9yIGxhbmd1YWdlIHRoZXJhcHkjODUuMTIuMjEuMDAuMDAKLXVuc3BzYzcjODUuMTIuMjEuMDkuMDAjUmVoYWJpbGl0YXRpb24gc2VydmljZXMgZm9yIHBlb3BsZSB3aXRoIGNocm9uaWMgZGlzYWJpbGl0aWVzIzg1LjEyLjIxLjAwLjAwCi11bnNwc2M3Izg1LjEzLjAwLjAwLjAwI01lZGljYWwgc2NpZW5jZSByZXNlYXJjaCBhbmQgZXhwZXJpbWVudGF0aW9uIzg1LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEzLjE1LjAwLjAwI0V4cGVyaW1lbnRhbCBtZWRpY2luZSBzZXJ2aWNlcyM4NS4xMy4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNS4wMS4wMCNPcmdhbiB0cmFuc3BsYW50IHNlcnZpY2VzIzg1LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE1LjAyLjAwI0NsaW5pY2FsIGh1bWFuIGRydWcgdHJpYWxzIzg1LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE1LjAzLjAwI0FuaW1hbCBleHBlcmltZW50YXRpb24jODUuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTUuMDQuMDAjSHVtYW4gZXhwZXJpbWVudGF0aW9uIzg1LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE1LjA1LjAwI1NwYWNlIGV4cGVyaW1lbnRhdGlvbiM4NS4xMy4xNS4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wMC4wMCNNZWRpY2FsIGV0aGljcyM4NS4xMy4wMC4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wMS4wMCNFdXRoYW5hc2lhIGlzc3VlcyM4NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wMi4wMCNNZWRpY2FsIGNvZGUgb2YgY29uZHVjdCM4NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wMy4wMCNNZWRpY2FsIHNvY2lldGllcyM4NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNi4wNC4wMCNJbnRlcm5hdGlvbmFsIGRydWcgbW9uaXRvcmluZyBzZXJ2aWNlcyM4NS4xMy4xNi4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4wMC4wMCNNZWRpY2FsIHNjaWVuY2UgYW5kIHJlc2VhcmNoIzg1LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg1LjEzLjE3LjAxLjAwI1BoYXJtYWNldXRpY2FsIHJlc2VhcmNoIHNlcnZpY2VzIzg1LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE3LjAyLjAwI0JhY3RlcmlvbG9neSByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4wMy4wMCNCaW9tZWRpY2FsIHJlc2VhcmNoIHNlcnZpY2VzIzg1LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE3LjA0LjAwI0NhcmRpb2xvZ3kgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMDUuMDAjQW5hdG9teSByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4wNi4wMCNQYXRob2xvZ3kgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMDcuMDAjRW1icnlvbG9neSByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4wOC4wMCNFcGlkZW1pb2xvZ3kgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMDkuMDAjR2VuZXRpY3MgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMTAuMDAjSW1tdW5vbG9neSByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xMy4xNy4wMC4wMAotdW5zcHNjNyM4NS4xMy4xNy4xMS4wMCNQaHlzaW9sb2d5IHJlc2VhcmNoIHNlcnZpY2VzIzg1LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg1LjEzLjE3LjEyLjAwI1RveGljb2xvZ3kgcmVzZWFyY2ggc2VydmljZXMjODUuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTMuMTcuMTMuMDAjTmV1cm9sb2d5IHJlc2VhcmNoIHNlcnZpY2VzIzg1LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg1LjE0LjAwLjAwLjAwI0FsdGVybmF0aXZlIGFuZCBob2xpc3RpYyBtZWRpY2luZSM4NS4wMC4wMC4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNS4wMC4wMCNGYWl0aCBoZWFsZXJzIzg1LjE0LjAwLjAwLjAwCi11bnNwc2M3Izg1LjE0LjE1LjAxLjAwI1dpdGNoIGRvY3RvcnMgb3Igdm9vZG9vIHNlcnZpY2VzIzg1LjE0LjE1LjAwLjAwCi11bnNwc2M3Izg1LjE0LjE1LjAyLjAwI0ZhaXRoIGhlYWxlcnMgc2VydmljZXMjODUuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTQuMTUuMDMuMDAjU2hhbWFucyM4NS4xNC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNS4wNC4wMCNFbmVyZ3kgd29yayM4NS4xNC4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNi4wMC4wMCNIZXJiYWwgdHJlYXRtZW50cyM4NS4xNC4wMC4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNi4wMS4wMCNIZXJiYWwgbWVkaWNpbmUgb3IgaGVyYmFsaXN0cyBzZXJ2aWNlcyM4NS4xNC4xNi4wMC4wMAotdW5zcHNjNyM4NS4xNC4xNi4wMi4wMCNBbGdhZSBvciBzZWEgd2VlZCBtZWRpY2FsIGN1cmVzIzg1LjE0LjE2LjAwLjAwCi11bnNwc2M3Izg1LjE0LjE2LjAzLjAwI0hvdCBzcHJpbmdzIGN1cmUgc2VydmljZXMjODUuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTQuMTcuMDAuMDAjSG9tZW9wYXRoaWMgcHJhY3RpY2UjODUuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTQuMTcuMDEuMDAjSW5pdGlhbCBkaWFnbm9zdGljIGFzc2Vzc21lbnQjODUuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTQuMTcuMDIuMDAjUmVtZWR5IGNvbnN1bHRhdGlvbnMjODUuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODUuMTUuMDAuMDAuMDAjRm9vZCBhbmQgbnV0cml0aW9uIHNlcnZpY2VzIzg1LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg1LjE1LjE1LjAwLjAwI0Zvb2QgdGVjaG5vbG9neSM4NS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wMS4wMCNGb29kIGh5Z2llbmUgY29udHJvbCBzZXJ2aWNlcyM4NS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wMi4wMCNGb29kIGNvbnRhbWluYXRpb24gY29udHJvbCBzZXJ2aWNlcyM4NS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wMy4wMCNGb29kIHByZXNlcnZhdGlvbiBtYW5hZ2VtZW50IG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTUuMDQuMDAjRm9vZCBwcmVwYXJhdGlvbiBjb3Vuc2VsaW5nIG9yIGNvbnRyb2wgc2VydmljZXMjODUuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTUuMDUuMDAjRm9vZCByZXNlYXJjaCBzZXJ2aWNlcyM4NS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wNi4wMCNTdHVkaWVzIG9uIGZvb2RzIG9yIGZvb2QgaGFiaXRzIzg1LjE1LjE1LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE1LjA3LjAwI0Zvb2QgYWRkaXRpdmUgb3IgcXVhbGl0eSBzdGFuZGFyZHMgc2VydmljZXMjODUuMTUuMTUuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTUuMDguMDAjRm9vZCBhbmFseXNpcyBzZXJ2aWNlcyM4NS4xNS4xNS4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNS4wOS4wMCNGb29kIGxlZ2lzbGF0aW9uIHNlcnZpY2VzIzg1LjE1LjE1LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE2LjAwLjAwI051dHJpdGlvbiBpc3N1ZXMjODUuMTUuMDAuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTYuMDEuMDAjTnV0cml0aW9uIHByb2dyYW1taW5nIHNlcnZpY2VzIzg1LjE1LjE2LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE2LjAyLjAwI0JyZWFzdCBvciBib3R0bGUgZmVlZGluZyBwb2xpY3kjODUuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTYuMDMuMDAjTnV0cml0aW9uYWwgcmVoYWJpbGl0YXRpb24gc2VydmljZXMjODUuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTYuMDQuMDAjTnV0cml0aW9uIHByb2plY3QgZXZhbHVhdGlvbiM4NS4xNS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNi4wNS4wMCNGb29kIG9yIG51dHJpdGlvbiBkZXZlbG9wbWVudCBzdHJhdGVnaWVzIzg1LjE1LjE2LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE2LjA2LjAwI051dHJpZW50IGRlZmljaWVuY3kgY29udHJvbCBwcm9ncmFtcyM4NS4xNS4xNi4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNi4wNy4wMCNEaWV0IGNvbnRyb2wgb3IgcHJvZ3JhbXMjODUuMTUuMTYuMDAuMDAKLXVuc3BzYzcjODUuMTUuMTcuMDAuMDAjRm9vZCBwb2xpY3kgcGxhbm5pbmcgYW5kIGFpZCM4NS4xNS4wMC4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNy4wMS4wMCNGb29kIHN0YW5kYXJkcyM4NS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNy4wMi4wMCNGb29kIGFpZCBnbG9iYWwgaW5mb3JtYXRpb24gb3IgZWFybHkgd2FybmluZyBzeXN0ZW1zIHNlcnZpY2VzIzg1LjE1LjE3LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE3LjAzLjAwI0Fzc2Vzc21lbnQgb2YgZW1lcmdlbmN5IGZvb2QgcmVxdWlyZW1lbnRzIzg1LjE1LjE3LjAwLjAwCi11bnNwc2M3Izg1LjE1LjE3LjA0LjAwI05hdGlvbmFsIGZvb2QgaW50ZXJ2ZW50aW9uIHBvbGljeSBvciBwcm9ncmFtcyM4NS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4NS4xNS4xNy4wNS4wMCNFdmFsdWF0aW9uIG9mIGZvb2QgYWlkIG51dHJpdGlvbmFsIGltcGFjdCM4NS4xNS4xNy4wMC4wMAotdW5zcHNjNyM4Ni4wMC4wMC4wMC4wMCNFZHVjYXRpb24gYW5kIFRyYWluaW5nIFNlcnZpY2VzIzg2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEwLjAwLjAwLjAwI1ZvY2F0aW9uYWwgdHJhaW5pbmcjODYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDAuMDAjQWdyaWN1bHR1cmUgYW5kIGZvcmVzdHJ5IGFuZCBvdGhlciBuYXR1cmFsIHJlc291cmNlcyB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNS4wMS4wMCNBZ3JvIGluZHVzdHJ5IHZvY2F0aW9uYWwgdHJhaW5pbmcjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDIuMDAjRGFpcnkgaW5kdXN0cnkgdm9jYXRpb25hbCB0cmFpbmluZyM4Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNS4wMy4wMCNNZWF0IGluZHVzdHJ5IHZvY2F0aW9uYWwgdHJhaW5pbmcjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDQuMDAjQWdyaWN1bHR1cmUgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNS4wNS4wMCNSdXJhbCB5b3V0aCBvciBmYXJtZXJzIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDYuMDAjRm9yZXN0cnkgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNS4wNy4wMCNGaXNoZXJ5IHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTUuMDguMDAjRW52aXJvbm1lbnRhbCB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE1LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE1LjA5LjAwI05hdHVyYWwgcmVzb3VyY2VzIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDAuMDAjU2NpZW50aWZpYyB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEwLjE2LjAxLjAwI0NvbXB1dGVyIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDIuMDAjRW5lcmd5IHJlbGF0ZWQgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNi4wMy4wMCNDaGVtaXN0cnkgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNi4wNC4wMCNCaW9sb2d5IHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDUuMDAjTWVkaWNhbCB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE2LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE2LjA2LjAwI0VsZWN0cm9uaWNzIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDcuMDAjVGVsZWNvbW11bmljYXRpb25zIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTYuMDguMDAjSHlkcmF1bGljcyB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE2LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE2LjA5LjAwI0luZHVzdHJpYWwgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNi4xMC4wMCNFbmdpbmVlcmluZyB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE2LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE3LjAwLjAwI05vbiBzY2llbnRpZmljIHZvY2F0aW9uYWwgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTcuMDEuMDAjQ29tbXVuaWNhdGlvbnMgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wMi4wMCNUb3VyaXNtIHJlbGF0ZWQgdHJhaW5pbmcjODYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTcuMDMuMDAjTGlicmFyeSBvciBkb2N1bWVudGF0aW9uIHRyYWluaW5nIzg2LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE3LjA0LjAwI1Byb2N1cmVtZW50IG9yIHN1cHBseSBjaGFpbiB0cmFpbmluZyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wNS4wMCNDbGVyaWNhbCB0cmFpbmluZyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wNi4wMCNIZWFsdGggYXNzaXN0YW5jZSB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE3LjA3LjAwI1BlcnNvbmFsIGNhcmUgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wOC4wMCNMaXRlcmFjeSBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4wOS4wMCNTYWZldHkgdHJhaW5pbmcgc2VydmljZXMjODYuMTAuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTAuMTcuMTAuMDAjVGVhY2hlciB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xMS4wMCNGaXJlIGZpZ2h0aW5nIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE3LjEyLjAwI0hhbmRjcmFmdHMgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xMy4wMCNMYXcgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xNC4wMCNMYXcgZW5mb3JjZW1lbnQgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xNS4wMCNSb2FkIG9yIHJhaWwgdHJhbnNwb3J0YXRpb24gdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xNy4xNi4wMCNTaGlwcGluZyB2b2NhdGlvbmFsIHRyYWluaW5nIHNlcnZpY2VzIzg2LjEwLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjAwLjAwI0luIHNlcnZpY2UgdHJhaW5pbmcgYW5kIG1hbnBvd2VyIGRldmVsb3BtZW50Izg2LjEwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjAxLjAwI0Jhbmsgb3IgZmluYW5jZSBzZWN0b3IgbWFucG93ZXIgZGV2ZWxvcG1lbnQjODYuMTAuMTguMDAuMDAKLXVuc3BzYzcjODYuMTAuMTguMDIuMDAjUmUgdHJhaW5pbmcgb3IgcmVmcmVzaGluZyB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xOC4wMy4wMCNWb2NhdGlvbmFsIHJlaGFiaWxpdGF0aW9uIHNlcnZpY2VzIzg2LjEwLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjA0LjAwI0NvbW1lcmNpYWwgc2VjdG9yIG1hbnBvd2VyIGRldmVsb3BtZW50Izg2LjEwLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjA1LjAwI0luZHVzdHJpYWwgc2VjdG9yIG1hbnBvd2VyIGRldmVsb3BtZW50Izg2LjEwLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEwLjE4LjA2LjAwI0hlYWx0aCBzZWN0b3IgbWFucG93ZXIgZGV2ZWxvcG1lbnQjODYuMTAuMTguMDAuMDAKLXVuc3BzYzcjODYuMTAuMTguMDcuMDAjTWFuYWdlbWVudCBzZWN0b3IgbWFucG93ZXIgZGV2ZWxvcG1lbnQjODYuMTAuMTguMDAuMDAKLXVuc3BzYzcjODYuMTAuMTguMDguMDAjUHVibGljIHNlY3RvciBtYW5wb3dlciBkZXZlbG9wbWVudCBzZXJ2aWNlcyM4Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMC4xOC4wOS4wMCNNZXJjaGFudCBtYXJpbmUgdm9jYXRpb25hbCB0cmFpbmluZyBzZXJ2aWNlcyM4Ni4xMC4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMS4wMC4wMC4wMCNBbHRlcm5hdGl2ZSBlZHVjYXRpb25hbCBzeXN0ZW1zIzg2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjAwLjAwI0Rpc3RhbmNlIGxlYXJuaW5nIHNlcnZpY2VzIzg2LjExLjAwLjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjAxLjAwI0Rpc3RhbmNlIGxlYXJuaW5nIGd1aWRhbmNlIHNlcnZpY2VzIzg2LjExLjE1LjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjAyLjAwI0Rpc3RhbmNlIHRlYWNoaW5nIHNlcnZpY2VzIzg2LjExLjE1LjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjAzLjAwI0NlcnRpZmljYXRlZCBkaXN0YW5jZSBsZWFybmluZyBzZXJ2aWNlcyM4Ni4xMS4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMS4xNS4wNC4wMCNOb24gY2VydGlmaWNhdGVkIGRpc3RhbmNlIGxlYXJuaW5nIHNlcnZpY2VzIzg2LjExLjE1LjAwLjAwCi11bnNwc2M3Izg2LjExLjE1LjA1LjAwI0Rpc3RhbmNlIGxlYXJuaW5nIGFzc2Vzc21lbnQgc2VydmljZXMjODYuMTEuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTEuMTYuMDAuMDAjQWR1bHQgZWR1Y2F0aW9uIzg2LjExLjAwLjAwLjAwCi11bnNwc2M3Izg2LjExLjE2LjAxLjAwI0V2ZW5pbmcgY291cnNlcyM4Ni4xMS4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMS4xNi4wMi4wMCNQYXJ0IHRpbWUgYWR1bHQgZWR1Y2F0aW9uIHNlcnZpY2VzIzg2LjExLjE2LjAwLjAwCi11bnNwc2M3Izg2LjExLjE2LjAzLjAwI1BhcmVudCBlZHVjYXRpb24jODYuMTEuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTEuMTYuMDQuMDAjRW1wbG95ZWUgRWR1Y2F0aW9uIzg2LjExLjE2LjAwLjAwCi11bnNwc2M3Izg2LjExLjE3LjAwLjAwI0xhbmd1YWdlIHNjaG9vbGluZyM4Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMS4xNy4wMS4wMCNDb252ZXJzYXRpb25hbCBmb3JlaWduIGxhbmd1YWdlIGluc3RydWN0aW9uIzg2LjExLjE3LjAwLjAwCi11bnNwc2M3Izg2LjExLjE3LjAyLjAwI0ZvcmVpZ24gbGFuZ3VhZ2UgaW1tZXJzaW9uIGluc3RydWN0aW9uIzg2LjExLjE3LjAwLjAwCi11bnNwc2M3Izg2LjExLjE4LjAwLjAwI0VkdWNhdGlvbmFsIGV4Y2hhbmdlcyM4Ni4xMS4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMS4xOC4wMS4wMCNFZHVjYXRpb25hbCBleGNoYW5nZXMgYmV0d2VlbiB1bml2ZXJzaXRpZXMjODYuMTEuMTguMDAuMDAKLXVuc3BzYzcjODYuMTEuMTguMDIuMDAjRWR1Y2F0aW9uYWwgZXhjaGFuZ2VzIGJldHdlZW4gc2Nob29scyM4Ni4xMS4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMi4wMC4wMC4wMCNFZHVjYXRpb25hbCBpbnN0aXR1dGlvbnMjODYuMDAuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTIuMTUuMDAuMDAjRWxlbWVudGFyeSBhbmQgc2Vjb25kYXJ5IHNjaG9vbHMjODYuMTIuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTIuMTUuMDEuMDAjUHJlIHNjaG9vbCBlZHVjYXRpb25hbCBzZXJ2aWNlcyM4Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNS4wMi4wMCNSZWxpZ2lvdXMgZWxlbWVudGFyeSBvciBzZWNvbmRhcnkgc2Nob29scyM4Ni4xMi4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNS4wMy4wMCNQcml2YXRlIGVsZW1lbnRhcnkgb3Igc2Vjb25kYXJ5IHNjaG9vbHMjODYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTIuMTUuMDQuMDAjUHVibGljIGVsZW1lbnRhcnkgb3Igc2Vjb25kYXJ5IHNjaG9vbHMjODYuMTIuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTIuMTYuMDAuMDAjSnVuaW9yIGNvbGxlZ2VzIzg2LjEyLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEyLjE2LjAxLjAwI0NvbW11bml0eSBjb2xsZWdlcyM4Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNi4wMi4wMCNUZWNobmljYWwgaW5zdGl0dXRlcyM4Ni4xMi4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNy4wMC4wMCNVbml2ZXJzaXR5IGFuZCBjb2xsZWdlcyM4Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xNy4wMS4wMCNVbmRlcmdyYWR1YXRlIHByb2dyYW1zIzg2LjEyLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEyLjE3LjAyLjAwI1Bvc3RncmFkdWF0ZSBwcm9ncmFtcyM4Ni4xMi4xNy4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xOC4wMC4wMCNQcm9mZXNzaW9uYWwgc2Nob29scyM4Ni4xMi4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xOC4wMi4wMCNUaGVvbG9naWNhbCBzZW1pbmFyaWVzIzg2LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEyLjE4LjAzLjAwI1RlY2huaWNhbCBwcm9mZXNzaW9uYWwgc2Nob29scyM4Ni4xMi4xOC4wMC4wMAotdW5zcHNjNyM4Ni4xMi4xOC4wNC4wMCNOb24gdGVjaG5pY2FsIHByb2Zlc3Npb25hbCBzY2hvb2xzIzg2LjEyLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEzLjAwLjAwLjAwI1NwZWNpYWxpemVkIGVkdWNhdGlvbmFsIHNlcnZpY2VzIzg2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEzLjE1LjAwLjAwI0ZpbmUgYXJ0cyM4Ni4xMy4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMy4xNS4wMS4wMCNUaGVhdGVyIHN0dWRpZXMjODYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTUuMDIuMDAjUGFpbnRpbmcjODYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTUuMDMuMDAjU2N1bHB0dXJlIzg2LjEzLjE1LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE1LjA0LjAwI01lZGlhIHN0dWRpZXMjODYuMTMuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTYuMDAuMDAjTXVzaWMgYW5kIGRyYW1hIzg2LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEzLjE2LjAxLjAwI011c2ljIHNjaG9vbHMjODYuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTYuMDIuMDAjRGFuY2UgZWR1Y2F0aW9uIzg2LjEzLjE2LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE2LjAzLjAwI0RyYW1hIHN0dWRpZXMjODYuMTMuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTcuMDAuMDAjRHJpdmluZyBhbmQgZmx5aW5nIGFuZCBzYWlsaW5nIzg2LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEzLjE3LjAxLjAwI1ZlaGljbGUgZHJpdmluZyBzY2hvb2xzIHNlcnZpY2VzIzg2LjEzLjE3LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE3LjAyLjAwI0ZsaWdodCBzY2hvb2wgc2VydmljZXMjODYuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTcuMDMuMDAjWWFjaHRpbmcgb3IgYm9hdGluZyBzY2hvb2wgc2VydmljZXMjODYuMTMuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTguMDAuMDAjTWlsaXRhcnkgZWR1Y2F0aW9uIzg2LjEzLjAwLjAwLjAwCi11bnNwc2M3Izg2LjEzLjE4LjAxLjAwI1NlcnZpY2UgYWNhZGVtaWVzIzg2LjEzLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE4LjAyLjAwI1BpbG90IHNjaG9vbHMjODYuMTMuMTguMDAuMDAKLXVuc3BzYzcjODYuMTMuMTguMDMuMDAjTWlsaXRhcnkgcG9saWNlIHRyYWluaW5nIzg2LjEzLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE4LjA0LjAwI1dhciBjb2xsZWdlIzg2LjEzLjE4LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE5LjAwLjAwI1NjaG9vbHMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM4Ni4xMy4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xMy4xOS4wMS4wMCNQcmltYXJ5IHNjaG9vbGluZyBzZXJ2aWNlcyBmb3IgcGVvcGxlIHdpdGggZGlzYWJpbGl0aWVzIzg2LjEzLjE5LjAwLjAwCi11bnNwc2M3Izg2LjEzLjE5LjAyLjAwI1NlY29uZGFyeSBzY2hvb2xpbmcgc2VydmljZXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM4Ni4xMy4xOS4wMC4wMAotdW5zcHNjNyM4Ni4xMy4xOS4wMy4wMCNTcGVjaWFsaXplZCBzY2hvb2xzIGZvciBwZW9wbGUgd2l0aCBkaXNhYmlsaXRpZXMjODYuMTMuMTkuMDAuMDAKLXVuc3BzYzcjODYuMTMuMTkuMDQuMDAjU3BlY2lhbGl6ZWQgcmVoYWJpbGl0YXRpb24gc2VydmljZXMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM4Ni4xMy4xOS4wMC4wMAotdW5zcHNjNyM4Ni4xNC4wMC4wMC4wMCNFZHVjYXRpb25hbCBmYWNpbGl0aWVzIzg2LjAwLjAwLjAwLjAwCi11bnNwc2M3Izg2LjE0LjE1LjAwLjAwI0VkdWNhdGlvbmFsIGd1aWRhbmNlIHNlcnZpY2VzIzg2LjE0LjAwLjAwLjAwCi11bnNwc2M3Izg2LjE0LjE1LjAxLjAwI0VkdWNhdGlvbmFsIGFkdmlzb3J5IHNlcnZpY2VzIzg2LjE0LjE1LjAwLjAwCi11bnNwc2M3Izg2LjE0LjE1LjAyLjAwI1VuaXZlcnNpdGllcyBjb29wZXJhdGlvbiBndWlkYW5jZSBzZXJ2aWNlcyM4Ni4xNC4xNS4wMC4wMAotdW5zcHNjNyM4Ni4xNC4xNS4wMy4wMCNTdHVkeSBhYnJvYWQgYWR2aXNvcnkgc2VydmljZXMjODYuMTQuMTUuMDAuMDAKLXVuc3BzYzcjODYuMTQuMTYuMDAuMDAjU3R1ZGVudHMgb3JnYW5pemF0aW9ucyM4Ni4xNC4wMC4wMC4wMAotdW5zcHNjNyM4Ni4xNC4xNi4wMS4wMCNTdHVkZW50cyBob2JieSBjbHVicyM4Ni4xNC4xNi4wMC4wMAotdW5zcHNjNyM4Ni4xNC4xNi4wMi4wMCNTdHVkZW50cyB1bmlvbnMjODYuMTQuMTYuMDAuMDAKLXVuc3BzYzcjODYuMTQuMTYuMDMuMDAjU3R1ZGVudHMgdHJhdmVsbGluZyBvcmdhbml6YXRpb25zIzg2LjE0LjE2LjAwLjAwCi11bnNwc2M3Izg2LjE0LjE3LjAwLjAwI0VkdWNhdGlvbmFsIHRlY2hub2xvZ3kjODYuMTQuMDAuMDAuMDAKLXVuc3BzYzcjODYuMTQuMTcuMDEuMDAjTGFuZ3VhZ2UgbGFib3JhdG9yaWVzIzg2LjE0LjE3LjAwLjAwCi11bnNwc2M3Izg2LjE0LjE3LjAyLjAwI0F1ZGlvIHZpc3VhbCB0ZWNobm9sb2d5Izg2LjE0LjE3LjAwLjAwCi11bnNwc2M3Izg2LjE0LjE3LjAzLjAwI0NvbXB1dGVyIHByb2dyYW1tZWQgaW5zdHJ1Y3Rpb24jODYuMTQuMTcuMDAuMDAKLXVuc3BzYzcjODYuMTQuMTcuMDQuMDAjTGlicmFyeSBvciBkb2N1bWVudGF0aW9uIHNlcnZpY2VzIzg2LjE0LjE3LjAwLjAwCi11bnNwc2M3IzkwLjAwLjAwLjAwLjAwI1RyYXZlbCBhbmQgRm9vZCBhbmQgTG9kZ2luZyBhbmQgRW50ZXJ0YWlubWVudCBTZXJ2aWNlcyM5MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMC4wMC4wMC4wMCNSZXN0YXVyYW50cyBhbmQgY2F0ZXJpbmcjOTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTAuMTUuMDAuMDAjRWF0aW5nIGFuZCBkcmlua2luZyBlc3RhYmxpc2htZW50cyM5MC4xMC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMC4xNS4wMS4wMCNSZXN0YXVyYW50cyM5MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMC4xNS4wMi4wMCNCYXJzIzkwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE1LjAzLjAwI0Zhc3QgZm9vZCBlc3RhYmxpc2htZW50cyM5MC4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMC4xNS4wNC4wMCNPbiBzdHJlZXQgZm9vZCB2ZW5kb3JzIzkwLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE2LjAwLjAwI0JhbnF1ZXQgYW5kIGNhdGVyaW5nIHNlcnZpY2VzIzkwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkwLjEwLjE2LjAxLjAwI0JhbnF1ZXQgZmFjaWxpdGllcyM5MC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5MC4xMC4xNi4wMi4wMCNQYXJ0eSB0ZW50IHNlcnZpY2VzIzkwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE2LjAzLjAwI0NhdGVyaW5nIHNlcnZpY2VzIzkwLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE2LjA0LjAwI0NvbnN0cnVjdGlvbiBvciB3b3JrIHNpdGUgY2F0ZXJpbmcgc2VydmljZXMjOTAuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTAuMTcuMDAuMDAjQ2FmZXRlcmlhIHNlcnZpY2VzIzkwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkwLjEwLjE3LjAxLjAwI09uIHNpdGUgY2FmZXRlcmlhIG1hbmFnZW1lbnQjOTAuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTAuMTAuMTguMDAuMDAjQ2FycnlvdXQgYW5kIHRha2Vhd2F5IHNlcnZpY2VzIzkwLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkwLjEwLjE4LjAxLjAwI1Byb2Zlc3Npb25hbGx5IHByZXBhcmVkIGNhcnJ5b3V0IG1lYWxzIzkwLjEwLjE4LjAwLjAwCi11bnNwc2M3IzkwLjEwLjE4LjAyLjAwI0RlbGl2ZXJlZCBtZWFscyBzZXJ2aWNlcyM5MC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5MC4xMS4wMC4wMC4wMCNIb3RlbHMgYW5kIGxvZGdpbmcgYW5kIG1lZXRpbmcgZmFjaWxpdGllcyM5MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNS4wMC4wMCNIb3RlbHMgYW5kIG1vdGVscyBhbmQgaW5ucyM5MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNS4wMS4wMCNIb3RlbHMjOTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTUuMDIuMDAjTG9kZ2VzIG9yIHJlc29ydHMjOTAuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTUuMDMuMDAjQmVkIGFuZCBicmVha2Zhc3QgaW5ucyM5MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNS4wNC4wMCNDb3R0YWdlIHJlbnRhbCBzZXJ2aWNlcyM5MC4xMS4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNi4wMC4wMCNNZWV0aW5nIGZhY2lsaXRpZXMjOTAuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTYuMDEuMDAjQ29uZmVyZW5jZSBjZW50ZXJzIzkwLjExLjE2LjAwLjAwCi11bnNwc2M3IzkwLjExLjE2LjAyLjAwI1ZpZGVvY29uZmVyZW5jaW5nIGZhY2lsaXRpZXMjOTAuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTYuMDMuMDAjTWVldGluZyBvciBiYW5xdWV0IHJvb21zIzkwLjExLjE2LjAwLjAwCi11bnNwc2M3IzkwLjExLjE3LjAwLjAwI0NhbXBpbmcgYW5kIHdpbGRlcm5lc3MgZmFjaWxpdGllcyM5MC4xMS4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNy4wMS4wMCNDYW1wc2l0ZXMjOTAuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTAuMTEuMTcuMDIuMDAjR292ZXJubWVudCBvd25lZCBwYXJrcyM5MC4xMS4xNy4wMC4wMAotdW5zcHNjNyM5MC4xMS4xNy4wMy4wMCNSZWNyZWF0aW9uYWwgdmVoaWNsZSBjYW1wc2l0ZSBmYWNpbGl0aWVzIzkwLjExLjE3LjAwLjAwCi11bnNwc2M3IzkwLjEyLjAwLjAwLjAwI1RyYXZlbCBmYWNpbGl0YXRpb24jOTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTIuMTUuMDAuMDAjVHJhdmVsIGFnZW50cyM5MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMi4xNS4wMS4wMCNUb3VyIGFycmFuZ2VtZW50IHNlcnZpY2VzIzkwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEyLjE1LjAyLjAwI1RyYXZlbCBhZ2VuY2llcyM5MC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5MC4xMi4xNS4wMy4wMCNDaGFydGVyaW5nIHNlcnZpY2VzIzkwLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEyLjE2LjAwLjAwI1RyYXZlbCBkb2N1bWVudCBhc3Npc3RhbmNlIzkwLjEyLjAwLjAwLjAwCi11bnNwc2M3IzkwLjEyLjE2LjAxLjAwI1Bhc3Nwb3J0IHNlcnZpY2VzIzkwLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkwLjEyLjE2LjAyLjAwI1Zpc2Egb3IgYXV4aWxsaWFyeSBkb2N1bWVudCBzZXJ2aWNlcyM5MC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5MC4xMi4xNy4wMC4wMCNHdWlkZXMgYW5kIGludGVycHJldGVycyM5MC4xMi4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMi4xNy4wMS4wMCNBcmVhIG9yIHRvdXIgZ3VpZGVzIzkwLjEyLjE3LjAwLjAwCi11bnNwc2M3IzkwLjEyLjE3LjAyLjAwI0ludGVycHJldGVycyM5MC4xMi4xNy4wMC4wMAotdW5zcHNjNyM5MC4xMy4wMC4wMC4wMCNQZXJmb3JtaW5nIGFydHMjOTAuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTMuMTUuMDAuMDAjTGl2ZSBwZXJmb3JtYW5jZXMjOTAuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTMuMTUuMDEuMDAjVGhlYXRyaWNhbCBwZXJmb3JtYW5jZXMgb3IgcGxheXMjOTAuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTMuMTUuMDIuMDAjRGFuY2UgcGVyZm9ybWFuY2VzIzkwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEzLjE1LjAzLjAwI09wZXJhIzkwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEzLjE1LjA0LjAwI0NvbmNlcnRzIzkwLjEzLjE1LjAwLjAwCi11bnNwc2M3IzkwLjEzLjE2LjAwLjAwI1RhcGVkIG9yIG1vdGlvbiBwaWN0dXJlIHBlcmZvcm1hbmNlcyM5MC4xMy4wMC4wMC4wMAotdW5zcHNjNyM5MC4xMy4xNi4wMS4wMCNNb3Rpb24gcGljdHVyZXMjOTAuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTMuMTYuMDIuMDAjVmlkZW90YXBlZCBlbnRlcnRhaW5tZW50IzkwLjEzLjE2LjAwLjAwCi11bnNwc2M3IzkwLjE0LjAwLjAwLjAwI0NvbW1lcmNpYWwgc3BvcnRzIzkwLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkwLjE0LjE1LjAwLjAwI1Byb2Zlc3Npb25hbCBzcG9ydGluZyBldmVudHMjOTAuMTQuMDAuMDAuMDAKLXVuc3BzYzcjOTAuMTQuMTUuMDEuMDAjTGVhZ3VlIHBsYXkjOTAuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTQuMTUuMDIuMDAjQ29tcGV0aXRpdmUgZXZlbnRzIzkwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzkwLjE0LjE1LjAzLjAwI0V4aGliaXRpb25zIzkwLjE0LjE1LjAwLjAwCi11bnNwc2M3IzkwLjE0LjE2LjAwLjAwI1Nwb3J0cyBldmVudCBwcm9tb3Rpb24gYW5kIHNwb25zb3JzaGlwIzkwLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE0LjE2LjAxLjAwI0NvbXBhbnkgc3BvbnNvcmVkIHByb2Zlc3Npb25hbCBzcG9ydHMgZXZlbnRzIzkwLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkwLjE0LjE2LjAyLjAwI0NvbXBhbnkgc3BvbnNvcmVkIGFtYXRldXIgc3BvcnRzIGV2ZW50cyM5MC4xNC4xNi4wMC4wMAotdW5zcHNjNyM5MC4xNC4xNi4wMy4wMCNTcG9ydGluZyBldmVudCBwcm9tb3Rpb24gc2VydmljZXMjOTAuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTQuMTcuMDAuMDAjQW1hdGV1ciBhbmQgcmVjcmVhdGlvbmFsIHNwb3J0cyM5MC4xNC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xNC4xNy4wMS4wMCNZb3V0aCBjb21wZXRpdGl2ZSBzcG9ydHMgbGVhZ3VlcyM5MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM5MC4xNC4xNy4wMi4wMCNBZHVsdCBzcG9ydHMgbGVhZ3VlcyM5MC4xNC4xNy4wMC4wMAotdW5zcHNjNyM5MC4xNC4xNy4wMy4wMCNZb3V0aCBzcG9ydHMjOTAuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMDAuMDAuMDAjRW50ZXJ0YWlubWVudCBzZXJ2aWNlcyM5MC4wMC4wMC4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNS4wMC4wMCNUb3VyaXN0IGF0dHJhY3Rpb25zIzkwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE1LjE1LjAxLjAwI011c2V1bXMjOTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTUuMDIuMDAjSGlzdG9yaWNhbCBvciBjdWx0dXJhbCBzaXRlcyM5MC4xNS4xNS4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNS4wMy4wMCNab29sb2dpY2FsIGdhcmRlbnMjOTAuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTYuMDAuMDAjVHJhdmVsbGluZyBzaG93cyM5MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNi4wMS4wMCNDaXJjdXNlcyM5MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNi4wMi4wMCNUb3VyaW5nIGNvbXBhbmllcyM5MC4xNS4xNi4wMC4wMAotdW5zcHNjNyM5MC4xNS4xNi4wMy4wMCNBcnQgZXhoaWJpdGlvbnMjOTAuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTcuMDAuMDAjQW11c2VtZW50IHBhcmtzIzkwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE1LjE3LjAxLjAwI1RoZW1lIHBhcmtzIzkwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzkwLjE1LjE3LjAyLjAwI1dhdGVyIHBhcmtzIzkwLjE1LjE3LjAwLjAwCi11bnNwc2M3IzkwLjE1LjE3LjAzLjAwI01pbmlhdHVyZSBnb2xmIGNvdXJzZXMjOTAuMTUuMTcuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTguMDAuMDAjQ2Fybml2YWxzIGFuZCBmYWlycyM5MC4xNS4wMC4wMC4wMAotdW5zcHNjNyM5MC4xNS4xOC4wMS4wMCNUcmF2ZWxsaW5nIGNhcm5pdmFscyM5MC4xNS4xOC4wMC4wMAotdW5zcHNjNyM5MC4xNS4xOC4wMi4wMCNGYWlyIG9yZ2FuaXphdGlvbiBvciBtYW5hZ2VtZW50IHNlcnZpY2VzIzkwLjE1LjE4LjAwLjAwCi11bnNwc2M3IzkwLjE1LjE5LjAwLjAwI0dhbWJsaW5nIGFuZCBiZXR0aW5nIGVzdGFibGlzaG1lbnRzIzkwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE1LjE5LjAxLjAwI0Nhc2lub3MjOTAuMTUuMTkuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMTkuMDIuMDAjQ2FyZCBjbHVicyM5MC4xNS4xOS4wMC4wMAotdW5zcHNjNyM5MC4xNS4xOS4wMy4wMCNSYWNldHJhY2tzIzkwLjE1LjE5LjAwLjAwCi11bnNwc2M3IzkwLjE1LjIwLjAwLjAwI05pZ2h0Y2x1YnMgYW5kIGRhbmNlIGhhbGxzIzkwLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkwLjE1LjIwLjAxLjAwI05pZ2h0Y2x1YnMjOTAuMTUuMjAuMDAuMDAKLXVuc3BzYzcjOTAuMTUuMjAuMDIuMDAjRGFuY2UgaGFsbHMjOTAuMTUuMjAuMDAuMDAKLXVuc3BzYzcjOTEuMDAuMDAuMDAuMDAjUGVyc29uYWwgYW5kIERvbWVzdGljIFNlcnZpY2VzIzkxLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkxLjEwLjAwLjAwLjAwI1BlcnNvbmFsIGFwcGVhcmFuY2UjOTEuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTUuMDAuMDAjU3BhIGFuZCB3b3Jrb3V0IGFuZCByZWp1dmVuYXRpb24gZmFjaWxpdGllcyM5MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNS4wMS4wMCNIZWFsdGggb3IgZml0bmVzcyBjbHVicyM5MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNS4wMi4wMCNTcGFzIzkxLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE1LjAzLjAwI01hc3NhZ2Ugc2VydmljZXMjOTEuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTUuMDQuMDAjQWVyb2JpY3Mgb3IgZXhlcmNpc2UgY2xhc3NlcyM5MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNS4wNS4wMCNUdXJraXNoIG9yIHN0ZWFtIG9yIHJpdHVhbCBiYXRocyM5MS4xMC4xNS4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNi4wMC4wMCNGYWNlIGFuZCBib2R5IGNhcmUgYW5kIGFkb3JubWVudCM5MS4xMC4wMC4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNi4wMS4wMCNGYWNpYWwgb3IgYm9keSB0cmVhdG1lbnRzIzkxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE2LjAyLjAwI01ha2UgdXAgY29uc3VsdGF0aW9uIzkxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE2LjAzLjAwI1RhdHRvbyBzZXJ2aWNlcyM5MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNi4wNC4wMCNCb2R5IHBpZXJjaW5nIHNlcnZpY2VzIzkxLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE2LjA1LjAwI0VsZWN0cm9seXNpcyM5MS4xMC4xNi4wMC4wMAotdW5zcHNjNyM5MS4xMC4xNy4wMC4wMCNIYWlyIGNhcmUjOTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTcuMDEuMDAjSGFpciBjdXR0aW5nIG9yIGNvbG9yIHNlcnZpY2VzIzkxLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE3LjAyLjAwI0hhaXIgd2VhdmluZyBvciByZXBsYWNlbWVudCBzZXJ2aWNlcyM5MS4xMC4xNy4wMC4wMAotdW5zcHNjNyM5MS4xMC4xOC4wMC4wMCNDbG90aGluZyByZW50YWwjOTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTguMDEuMDAjVHV4ZWRvIG9yIGZvcm1hbHdlYXIgcmVudGFsIzkxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE4LjAyLjAwI0V2ZW5pbmcgb3IgYnJpZGFsIGdvd24gb3IgZHJlc3MgcmVudGFsIzkxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE4LjAzLjAwI0Nvc3R1bWUgcmVudGFsIzkxLjEwLjE4LjAwLjAwCi11bnNwc2M3IzkxLjEwLjE5LjAwLjAwI0Zhc2hpb24gY29uc3VsdGFudHMjOTEuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTkuMDEuMDAjQ29sb3IgY29uc3VsdGFudCM5MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM5MS4xMC4xOS4wMi4wMCNGYXNoaW9uIHN0eWxpc3QjOTEuMTAuMTkuMDAuMDAKLXVuc3BzYzcjOTEuMTAuMTkuMDMuMDAjV2FyZHJvYmUgY29uc3VsdGFudCM5MS4xMC4xOS4wMC4wMAotdW5zcHNjNyM5MS4xMS4wMC4wMC4wMCNEb21lc3RpYyBhbmQgcGVyc29uYWwgYXNzaXN0YW5jZSM5MS4wMC4wMC4wMC4wMAotdW5zcHNjNyM5MS4xMS4xNS4wMC4wMCNMYXVuZGVyaW5nIHNlcnZpY2VzIzkxLjExLjAwLjAwLjAwCi11bnNwc2M3IzkxLjExLjE1LjAxLjAwI1VuaWZvcm0gcmVudGFsIzkxLjExLjE1LjAwLjAwCi11bnNwc2M3IzkxLjExLjE1LjAyLjAwI0xhdW5kcnkgc2VydmljZXMjOTEuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTUuMDMuMDAjRHJ5IGNsZWFuaW5nIzkxLjExLjE1LjAwLjAwCi11bnNwc2M3IzkxLjExLjE1LjA0LjAwI0NvaW4gb3BlcmF0ZWQgc2VsZiBzZXJ2aWNlIGxhdW5kcmllcyM5MS4xMS4xNS4wMC4wMAotdW5zcHNjNyM5MS4xMS4xNi4wMC4wMCNIb3VzZWhvbGQgYXNzaXN0YW5jZSBhbmQgY2FyZSM5MS4xMS4wMC4wMC4wMAotdW5zcHNjNyM5MS4xMS4xNi4wMS4wMCNIb3VzZWtlZXBpbmcgc2VydmljZXMjOTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTYuMDIuMDAjWWFyZCBvciBwb29sIGNhcmUgc2VydmljZXMjOTEuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTYuMDMuMDAjQ29va2luZyBvciBmb29kIHByZXBhcmF0aW9uIHNlcnZpY2VzIzkxLjExLjE2LjAwLjAwCi11bnNwc2M3IzkxLjExLjE3LjAwLjAwI0NvbnN1bWVyIGJ1eWluZyBhbmQgYmFydGVyaW5nIHNlcnZpY2VzIzkxLjExLjAwLjAwLjAwCi11bnNwc2M3IzkxLjExLjE3LjAxLjAwI1VzZWQgY2xvdGhpbmcgY29uc2lnbm1lbnQgc2VydmljZXMjOTEuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTcuMDIuMDAjQmFydGVyIGNsdWJzIG9yIGNvbnNvcnRpdW1zIzkxLjExLjE3LjAwLjAwCi11bnNwc2M3IzkxLjExLjE3LjAzLjAwI1dhcmRyb2JlIGJ1eWluZyBzZXJ2aWNlcyM5MS4xMS4xNy4wMC4wMAotdW5zcHNjNyM5MS4xMS4xOC4wMC4wMCNQZXJzb25hbCBpdGVtIGNhcmUgYW5kIHN0b3JhZ2UjOTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTguMDEuMDAjVmFsZXQgc2VydmljZXMjOTEuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTguMDIuMDAjQ2hlY2sgcm9vbSBjb25jZXNzaW9ucyM5MS4xMS4xOC4wMC4wMAotdW5zcHNjNyM5MS4xMS4xOC4wMy4wMCNMb2NrZXIgcmVudGFsIzkxLjExLjE4LjAwLjAwCi11bnNwc2M3IzkxLjExLjE4LjA0LjAwI0Z1ciBzdG9yYWdlIzkxLjExLjE4LjAwLjAwCi11bnNwc2M3IzkxLjExLjE5LjAwLjAwI1BlcnNvbmFsIGNhcmUgc2VydmljZXMjOTEuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTkuMDEuMDAjSW5mYW50IG9yIGNoaWxkIGRheWNhcmUgc2VydmljZXMjOTEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTkuMDIuMDAjTmFubnkgb3IgYmFieXNpdHRpbmcgc2VydmljZXMjOTEuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTEuMTEuMTkuMDMuMDAjRWxkZXJseSBkYXljYXJlIHNlcnZpY2VzIzkxLjExLjE5LjAwLjAwCi11bnNwc2M3IzkxLjExLjE5LjA0LjAwI0Fzc2lzdGVkIGxpdmluZyBzZXJ2aWNlcyM5MS4xMS4xOS4wMC4wMAotdW5zcHNjNyM5Mi4wMC4wMC4wMC4wMCNOYXRpb25hbCBEZWZlbnNlIGFuZCBQdWJsaWMgT3JkZXIgYW5kIFNlY3VyaXR5IGFuZCBTYWZldHkgU2VydmljZXMjOTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMDAuMDAuMDAjUHVibGljIG9yZGVyIGFuZCBzYWZldHkjOTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTUuMDAuMDAjUG9saWNlIHNlcnZpY2VzIzkyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkyLjEwLjE1LjAxLjAwI1BvbGljaW5nIHNlcnZpY2VzIzkyLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkyLjEwLjE1LjAyLjAwI1NwZWNpYWwgd2VhcG9ucyBhbmQgdGFjdGljcyAoU1dBVCkgb3IgcmlvdCB0ZWFtcyM5Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xNS4wMy4wMCNDb21tdW5pdHkgb3V0cmVhY2ggcHJvZ3JhbXMjOTIuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTUuMDQuMDAjQ3JpbWUgZGV0ZXJyZW5jZSBwcm9ncmFtcyM5Mi4xMC4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xNi4wMC4wMCNGaXJlIHNlcnZpY2VzIzkyLjEwLjAwLjAwLjAwCi11bnNwc2M3IzkyLjEwLjE2LjAxLjAwI011bmljaXBhbCBvciBuYXRpb25hbCBmaXJlZmlnaHRpbmcgc2VydmljZXMjOTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTYuMDIuMDAjVm9sdW50ZWVyIGZpcmUgZGVwYXJ0bWVudCBzZXJ2aWNlcyM5Mi4xMC4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xNi4wMy4wMCNGaXJlIHByZXZlbnRpb24gc2VydmljZXMjOTIuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTYuMDQuMDAjRm9yZXN0IG9yIHdpbGRlcm5lc3MgZmlyZWZpZ2h0aW5nIHNlcnZpY2VzIzkyLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkyLjEwLjE3LjAwLjAwI0phaWwgYW5kIHByaXNvbiBzeXN0ZW0jOTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTcuMDEuMDAjSmFpbCBvciBwcmlzb24gb3IgcGVuaXRlbnRpYXJ5IHNlcnZpY2VzIzkyLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkyLjEwLjE3LjAyLjAwI1lvdXRoIGNhbXBzIG9yIGZhY2lsaXRpZXMgc2VydmljZXMjOTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTcuMDMuMDAjSGFsZiB3YXkgaG91c2Ugc2VydmljZXMjOTIuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTcuMDQuMDAjTWVudGFsbHkgaW1wYWlyZWQgY3JpbWluYWwgZmFjaWxpdGllcyM5Mi4xMC4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xOC4wMC4wMCNDb3VydCBzeXN0ZW0jOTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTguMDEuMDAjU2hlcmlmZnMgc2VydmljZXMjOTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTguMDIuMDAjUGxlYSBiYXJnYWluIGFncmVlbWVudHMjOTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTguMDMuMDAjQ2l2aWwgY2FzZSBjb3VydCBleHBlbnNlcyM5Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xOC4wNC4wMCNDcmltaW5hbCBjYXNlIGZlZXMgb3IgZmluZXMjOTIuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTguMDUuMDAjQXBwZWFscyBwcm9jZXNzIG9yIGp1ZGljaWFsIHJldmlldyM5Mi4xMC4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMC4xOS4wMC4wMCNSZXNjdWUgc2VydmljZXMjOTIuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTkuMDEuMDAjU2VhcmNoIGFuZCByZXNjdWUgdGVhbXMjOTIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTkuMDIuMDAjQW1idWxhbmNlIHNlcnZpY2VzIzkyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzkyLjEwLjE5LjAzLjAwI0xpZmUgc2F2aW5nIGhlbGljb3B0ZXIgc2VydmljZXMjOTIuMTAuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTAuMTkuMDQuMDAjTGlmZWd1YXJkIHNlcnZpY2VzIGZvciBwb29sIG9yIGJlYWNoIzkyLjEwLjE5LjAwLjAwCi11bnNwc2M3IzkyLjExLjAwLjAwLjAwI01pbGl0YXJ5IHNlcnZpY2VzIGFuZCBuYXRpb25hbCBkZWZlbnNlIzkyLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjE1LjAwLjAwI01haW50ZW5hbmNlIG9mIGludGVybmF0aW9uYWwgcGVhY2UgYW5kIHNlY3VyaXR5IzkyLjExLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjE1LjAxLjAwI0Rpc3B1dGUgbWVkaWF0aW9uIG9yIGNvbmNpbGlhdGlvbiBvciBuZWdvdGlhdGlvbiBvciBzZXR0bGVtZW50IzkyLjExLjE1LjAwLjAwCi11bnNwc2M3IzkyLjExLjE1LjAyLjAwI1BlYWNlIGtlZXBpbmcgb3BlcmF0aW9ucyM5Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNS4wMy4wMCNDZWFzZSBmaXJlIGFncmVlbWVudHMgb3IgdHJ1Y2Ugc3VwZXJ2aXNpb24jOTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTUuMDQuMDAjRmFjdCBmaW5kaW5nIG1pc3Npb25zIzkyLjExLjE1LjAwLjAwCi11bnNwc2M3IzkyLjExLjE1LjA1LjAwI1dhciBwcmV2ZW50aW9uIHN0cmF0ZWdpZXMjOTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTUuMDYuMDAjQ291bnRlcnRlcnJvcmlzbSM5Mi4xMS4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNS4wNy4wMCNFbWJhcmdvZXMjOTIuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTYuMDAuMDAjRGlzYXJtYW1lbnQjOTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTYuMDEuMDAjQXJtcyBsaW1pdGF0aW9ucyM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNi4wMi4wMCNDb252ZW50aW9uYWwgYXJtcyBkaXNhcm1hbWVudCM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNi4wMy4wMCNOdWNsZWFyIGZyZWV6ZXMgb3IgZGlzYXJtYW1lbnQjOTIuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTYuMDQuMDAjV2VhcG9ucyBkZXN0cnVjdGlvbiM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNi4wNS4wMCNEaXNhcm1hbWVudCBuZWdvdGlhdGlvbnMgb3IgYWdyZWVtZW50cyM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNi4wNi4wMCNNdXR1YWwgb3IgYmFsYW5jZWQgZm9yY2UgcmVkdWN0aW9ucyM5Mi4xMS4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNy4wMC4wMCNNaWxpdGFyeSBzY2llbmNlIGFuZCByZXNlYXJjaCM5Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNy4wMS4wMCNNaWxpdGFyeSBoaXN0b3J5IzkyLjExLjE3LjAwLjAwCi11bnNwc2M3IzkyLjExLjE3LjAyLjAwI0NvbnZlbnRpb25hbCB3ZWFwb25zIHVzYWdlIzkyLjExLjE3LjAwLjAwCi11bnNwc2M3IzkyLjExLjE3LjAzLjAwI0NoZW1pY2FsIHdlYXBvbnMgdXNhZ2UjOTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTcuMDQuMDAjR3VlcmlsbGEgd2FyZmFyZSM5Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNy4wNS4wMCNNaWxpdGFyeSBzdHJhdGVneSM5Mi4xMS4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xNy4wNi4wMCNBZXJpYWwgbWFuZXV2ZXJzIzkyLjExLjE3LjAwLjAwCi11bnNwc2M3IzkyLjExLjE3LjA3LjAwI05hdmFsIG9yIHN1Ym1hcmluZSBtYW5ldXZlcnMjOTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTcuMDguMDAjTGFuZCBtYW5ldXZlcnMjOTIuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDAuMDAjTWlsaXRhcnkgcGVyc29ubmVsIGFuZCBkaXNjaXBsaW5lIzkyLjExLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjE4LjAxLjAwI0NpdmlsIGRlZmVuc2UjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDIuMDAjQ29tcHVsc29yeSBtaWxpdGFyeSBzZXJ2aWNlcyM5Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xOC4wMy4wMCNWb2x1bnRhcnkgbWlsaXRhcnkgc2VydmljZXMjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDQuMDAjTWlsaXRhcnkgcmVzZXJ2aXN0cyM5Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xOC4wNS4wMCNHdWVyaWxsYXMjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDYuMDAjTWVyY2VuYXJpZXMjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDcuMDAjVmV0ZXJhbnMjOTIuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTguMDguMDAjTWlsaXRhcnkgY291cnRzIzkyLjExLjE4LjAwLjAwCi11bnNwc2M3IzkyLjExLjE4LjA5LjAwI01pbGl0YXJ5IG9mZmVuc2VzIzkyLjExLjE4LjAwLjAwCi11bnNwc2M3IzkyLjExLjE4LjEwLjAwI01pbGl0YXJ5IHBlcnNvbm5lbCM5Mi4xMS4xOC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4xOS4wMC4wMCNNaWxpdGFyeSBwb2xpY3kjOTIuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTkuMDEuMDAjTmF0aW9uYWwgc2VjdXJpdHkjOTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTkuMDIuMDAjRGVmZW5zZSBjb250cmFjdHMjOTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTkuMDMuMDAjTm9uIGZpcnN0IHVzZSBwb2xpY3kjOTIuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMTkuMDQuMDAjQXJtcyByYWNlIzkyLjExLjE5LjAwLjAwCi11bnNwc2M3IzkyLjExLjE5LjA1LjAwI01pbGl0YXJ5IHJlbGF0aW9ucyM5Mi4xMS4xOS4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMC4wMC4wMCNNaWxpdGFyeSB6b25lcyM5Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMC4wMS4wMCNEZW1pbGl0YXJpemVkIHpvbmVzIzkyLjExLjIwLjAwLjAwCi11bnNwc2M3IzkyLjExLjIwLjAyLjAwI051Y2xlYXIgb3IgY2hlbWljYWwgd2VhcG9uIGZyZWUgem9uZXMjOTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjAuMDMuMDAjUGVhY2Ugem9uZXMjOTIuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjAuMDQuMDAjTm8gZmx5IHpvbmVzIzkyLjExLjIwLjAwLjAwCi11bnNwc2M3IzkyLjExLjIxLjAwLjAwI051Y2xlYXIgd2FyZmFyZSM5Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMS4wMS4wMCNOdWNsZWFyIHNhZmVndWFyZHMjOTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjEuMDIuMDAjTnVjbGVhciB3ZWFwb24gdGVzdHMjOTIuMTEuMjEuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjEuMDMuMDAjTnVjbGVhciBub24gcHJvbGlmZXJhdGlvbiM5Mi4xMS4yMS4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMi4wMC4wMCNNaWxpdGFyeSB0YWN0aWNzIzkyLjExLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjIyLjAxLjAwI1dlYXBvbnMgZGVwbG95bWVudCM5Mi4xMS4yMi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMi4wMi4wMCNNaWxpdGFyeSByZWNvbm5haXNzYW5jZSM5Mi4xMS4yMi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMi4wMy4wMCNBcm1zIHRyYW5zZmVycyM5Mi4xMS4yMi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMi4wNC4wMCNNaWxpdGFyeSBhc3Npc3RhbmNlIzkyLjExLjIyLjAwLjAwCi11bnNwc2M3IzkyLjExLjIyLjA1LjAwI1Ryb29wIHdpdGhkcmF3YWxzIzkyLjExLjIyLjAwLjAwCi11bnNwc2M3IzkyLjExLjIyLjA2LjAwI1JhcGlkIGRlcGxveW1lbnQgZm9yY2VzIzkyLjExLjIyLjAwLjAwCi11bnNwc2M3IzkyLjExLjIyLjA3LjAwI0Vudmlyb25tZW50YWwgd2FyZmFyZSM5Mi4xMS4yMi4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMy4wMC4wMCNNaWxpdGFyeSBiYXNlcyM5Mi4xMS4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMy4wMS4wMCNEb21lc3RpYyBtaWxpdGFyeSBiYXNlcyM5Mi4xMS4yMy4wMC4wMAotdW5zcHNjNyM5Mi4xMS4yMy4wMi4wMCNGb3JlaWduIG1pbGl0YXJ5IGJhc2VzIzkyLjExLjIzLjAwLjAwCi11bnNwc2M3IzkyLjExLjIzLjAzLjAwI05hdmFsIGJhc2VzIzkyLjExLjIzLjAwLjAwCi11bnNwc2M3IzkyLjExLjI0LjAwLjAwI0FybWVkIGNvbmZsaWN0cyBhbmQgaW5jaWRlbnRzIzkyLjExLjAwLjAwLjAwCi11bnNwc2M3IzkyLjExLjI0LjAxLjAwI0JvcmRlciBpbmNpZGVudHMjOTIuMTEuMjQuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjQuMDIuMDAjTGltaXRlZCB3YXIjOTIuMTEuMjQuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjQuMDMuMDAjTnVjbGVhciB3YXIjOTIuMTEuMjQuMDAuMDAKLXVuc3BzYzcjOTIuMTEuMjQuMDQuMDAjU3BhY2UgYmFzZWQgd2FyIzkyLjExLjI0LjAwLjAwCi11bnNwc2M3IzkyLjExLjI0LjA1LjAwI1Jlc3BvbnNlIHRvIHRlcnJvcmlzdCBhdHRhY2tzIzkyLjExLjI0LjAwLjAwCi11bnNwc2M3IzkyLjEyLjAwLjAwLjAwI1NlY3VyaXR5IGFuZCBwZXJzb25hbCBzYWZldHkjOTIuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTUuMDAuMDAjR3VhcmQgc2VydmljZXMjOTIuMTIuMDAuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTUuMDEuMDAjQXJtb3JlZCBjYXIgc2VydmljZXMjOTIuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTUuMDIuMDAjQnVyZ2xhcnkgcHJvdGVjdGlvbiBzZXJ2aWNlcyM5Mi4xMi4xNS4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNS4wMy4wMCNHdWFyZCBkb2cgcmVudGFsIzkyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkyLjEyLjE1LjA0LjAwI1NlY3VyaXR5IGd1YXJkIHNlcnZpY2VzIzkyLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkyLjEyLjE2LjAwLjAwI0RldGVjdGl2ZSBzZXJ2aWNlcyM5Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNi4wMS4wMCNEZXRlY3RpdmUgYWdlbmNpZXMjOTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTYuMDIuMDAjRmluZ2VycHJpbnQgc2VydmljZXMjOTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTYuMDMuMDAjTGllIGRldGVjdGlvbiBzZXJ2aWNlcyM5Mi4xMi4xNi4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNi4wNC4wMCNQcml2YXRlIGludmVzdGlnYXRpb24gc2VydmljZXMjOTIuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTcuMDAuMDAjU2VjdXJpdHkgc3lzdGVtcyBzZXJ2aWNlcyM5Mi4xMi4wMC4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNy4wMS4wMCNTdXJ2ZWlsbGFuY2Ugb3IgYWxhcm0gbWFpbnRlbmFuY2Ugb3IgbW9uaXRvcmluZyM5Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNy4wMi4wMCNGaXJlIGFsYXJtIG1haW50ZW5hbmNlIG9yIG1vbml0b3JpbmcjOTIuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTIuMTIuMTcuMDMuMDAjU3RvcmUgb3IgYnVzaW5lc3MgYW50aSB0aGVmdCBzZXJ2aWNlcyM5Mi4xMi4xNy4wMC4wMAotdW5zcHNjNyM5Mi4xMi4xNy4wNC4wMCNDb25maW5lbWVudCBzdXJ2ZWlsbGFuY2Ugc3lzdGVtcyBtYWludGVuYW5jZSBvciBtb25pdG9yaW5nIzkyLjEyLjE3LjAwLjAwCi11bnNwc2M3IzkzLjAwLjAwLjAwLjAwI1BvbGl0aWNzIGFuZCBDaXZpYyBBZmZhaXJzIFNlcnZpY2VzIzkzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkzLjEwLjAwLjAwLjAwI1BvbGl0aWNhbCBzeXN0ZW1zIGFuZCBpbnN0aXR1dGlvbnMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTUuMDAuMDAjUG9saXRpY2FsIGJvZGllcyM5My4xMC4wMC4wMC4wMAotdW5zcHNjNyM5My4xMC4xNS4wMS4wMCNQb2xpdGljYWwgcGFydGllcyByZXByZXNlbnRhdGlvbiBzZXJ2aWNlcyM5My4xMC4xNS4wMC4wMAotdW5zcHNjNyM5My4xMC4xNS4wMi4wMCNQb2xpdGljYWwgcGFydGllcyBmdW5kIHJhaXNpbmcgc2VydmljZXMjOTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTUuMDMuMDAjUG9saXRpY2FsIHBhcnRpZXMgcHVibGljIGFwcGVhcmFuY2Ugc2VydmljZXMjOTMuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTUuMDQuMDAjUG9saXRpY2FsIGxlZ2lzbGF0dXJlIHNlcnZpY2VzIzkzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE1LjA1LjAwI1BvbGl0aWNhbCBqdWRpY2lhbCBwb3dlciBvciBzZXJ2aWNlcyM5My4xMC4xNS4wMC4wMAotdW5zcHNjNyM5My4xMC4xNS4wNi4wMCNQb2xpdGljYWwgZXhlY3V0aXZlIHBvd2VyIG9yIHNlcnZpY2VzIzkzLjEwLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE2LjAwLjAwI1BvbGl0aWNhbCBvZmZpY2lhbHMjOTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTYuMDEuMDAjQ2FiaW5ldCBvZmZpY2VycyBzZXJ2aWNlcyM5My4xMC4xNi4wMC4wMAotdW5zcHNjNyM5My4xMC4xNi4wMi4wMCNHb3Zlcm5vcnMgc2VydmljZXMjOTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTYuMDMuMDAjSGVhZHMgb2Ygc3RhdGVzIHNlcnZpY2VzIzkzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE2LjA0LjAwI1ByZXNpZGVudGlhbCBzZXJ2aWNlcyM5My4xMC4xNi4wMC4wMAotdW5zcHNjNyM5My4xMC4xNi4wNS4wMCNQcmltZSBtaW5pc3RlcnMgc2VydmljZXMjOTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTYuMDYuMDAjTW9uYXJjaCBzZXJ2aWNlcyM5My4xMC4xNi4wMC4wMAotdW5zcHNjNyM5My4xMC4xNi4wNy4wMCNTdGF0ZXNtZW4gc2VydmljZXMjOTMuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTYuMDguMDAjUGFybGlhbWVudCBtZW1iZXJzIHNlcnZpY2VzIzkzLjEwLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE3LjAwLjAwI0xlZ2lzbGF0aXZlIGJvZGllcyBhbmQgcHJhY3RpY2UjOTMuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTcuMDEuMDAjTmF0aW9uYWwgY291bmNpbCBzZXJ2aWNlcyM5My4xMC4xNy4wMC4wMAotdW5zcHNjNyM5My4xMC4xNy4wMi4wMCNDb3Jwb3JhdGUgc3RhdGVzIzkzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE3LjAzLjAwI0JpbGwgZHJhZnRpbmcgc2VydmljZXMjOTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTcuMDQuMDAjTGVnaXNsYXRpdmUgaGVhcmluZ3Mgc2VydmljZXMjOTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTAuMTcuMDUuMDAjSW50ZWxsaWdlbmNlIHNlcnZpY2VzIzkzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE3LjA2LjAwI0xlZ2lzbGF0b3JzIHNlcnZpY2VzIzkzLjEwLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEwLjE3LjA3LjAwI1BhcmxpYW1lbnRhcnkgcHJhY3RpY2Ugc2VydmljZXMjOTMuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMDAuMDAuMDAjU29jaW8gcG9saXRpY2FsIGNvbmRpdGlvbnMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTUuMDAuMDAjUG9saXRpY2FsIG1vdmVtZW50cyM5My4xMS4wMC4wMC4wMAotdW5zcHNjNyM5My4xMS4xNS4wMS4wMCNFeHRyZW1pc3QgbW92ZW1lbnRzIzkzLjExLjE1LjAwLjAwCi11bnNwc2M3IzkzLjExLjE1LjAyLjAwI1BlYWNlIG1vdmVtZW50cyM5My4xMS4xNS4wMC4wMAotdW5zcHNjNyM5My4xMS4xNS4wMy4wMCNQcm90ZXN0IG1vdmVtZW50cyM5My4xMS4xNS4wMC4wMAotdW5zcHNjNyM5My4xMS4xNS4wNC4wMCNVbmRlcmdyb3VuZCBtb3ZlbWVudHMjOTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTUuMDUuMDAjU3R1ZGVudCBtb3ZlbWVudHMjOTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTUuMDYuMDAjUGVhc2FudCBtb3ZlbWVudHMjOTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTUuMDcuMDAjT3Bwb3NpdGlvbiBtb3ZlbWVudHMjOTMuMTEuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTYuMDAuMDAjUG9saXRpY2FsIHJlcHJlc2VudGF0aW9uIGFuZCBwYXJ0aWNpcGF0aW9uIzkzLjExLjAwLjAwLjAwCi11bnNwc2M3IzkzLjExLjE2LjAxLjAwI1BvbGl0aWNhbCByZXByZXNlbnRhdGlvbiM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wMi4wMCNQb2xpdGljYWwgcGFydGljaXBhdGlvbiM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wMy4wMCNQcm9wb3J0aW9uYWwgcmVwcmVzZW50YXRpb24jOTMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTEuMTYuMDQuMDAjVm90ZSBjYXRjaGVyIHNlcnZpY2VzIzkzLjExLjE2LjAwLjAwCi11bnNwc2M3IzkzLjExLjE2LjA1LjAwI1ZvdGVyIHJlZ2lzdHJhdGlvbiBvciBjb3VudGluZyBvciBhbmFseXNpcyBvciBzY3J1dGlueSBzZXJ2aWNlcyM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wNi4wMCNQcmVzc3VyZSBncm91cHMgcmVwcmVzZW50YXRpb24gb3IgcGFydGljaXBhdGlvbiBzZXJ2aWNlcyM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wNy4wMCNFbGVjdGlvbiBhbmFseXNpcyBzZXJ2aWNlcyM5My4xMS4xNi4wMC4wMAotdW5zcHNjNyM5My4xMS4xNi4wOC4wMCNFbGVjdGlvbiBvcmdhbml6YXRpb24gc2VydmljZXMjOTMuMTEuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMDAuMDAuMDAjSW50ZXJuYXRpb25hbCByZWxhdGlvbnMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDAuMDAjRGlwbG9tYWN5IzkzLjEyLjAwLjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjAxLjAwI0RpcGxvbWF0aWMgc2VydmljZXMjOTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDIuMDAjQ29uc3VsYXIgc2VydmljZXMjOTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDMuMDAjRGlwbG9tYXRzIHNlY3VyaXR5IHNlcnZpY2VzIzkzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjA0LjAwI0RpcGxvbWF0aWMgcHJpdmlsZWdlcyBvciBpbW11bml0aWVzIHNlcnZpY2VzIzkzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjA1LjAwI1N0YXRlIGltbXVuaXRpZXMgc2VydmljZXMjOTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDYuMDAjRW1iYXNzaWVzIG9yIGFtYmFzc2Fkb3JzIHNlcnZpY2VzIzkzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjA3LjAwI1N0YXRlIHZpc2l0cyBvcmdhbml6YXRpb24gc2VydmljZXMjOTMuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTUuMDguMDAjSW50ZXJuYXRpb25hbCBsYXcgcHJlc2NyaXB0aW9uIHNlcnZpY2VzIzkzLjEyLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE1LjA5LjAwI0ludGVybmF0aW9uYWwgbGF3IHByb21vdGlvbiBvciByZWNvZ25pdGlvbiBzZXJ2aWNlcyM5My4xMi4xNS4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4wMC4wMCNJbnRlcm5hdGlvbmFsIHJlbGF0aW9ucyBhbmQgY29vcGVyYXRpb24jOTMuMTIuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTYuMDEuMDAjTXVsdGlsYXRlcmFsIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjAyLjAwI01pbGl0YXJ5IGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjAzLjAwI1BvbGl0aWNhbCBjb29wZXJhdGlvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4wNC4wMCNJbnRlcm5hdGlvbmFsIGVjb25vbWljIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjA1LjAwI05vcnRoIHNvdXRoIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjA2LjAwI0Vhc3Qgd2VzdCBjb29wZXJhdGlvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4wNy4wMCNJbnRlcm5hdGlvbmFsIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjA4LjAwI05vbiBnb3Zlcm5tZW50YWwgbGlhaXNvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4wOS4wMCNOb24gYWxpZ25lZCBjb3VudHJpZXMgY29vcGVyYXRpb24jOTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTYuMTAuMDAjQWxpZ25lZCBjb3VudHJpZXMgY29vcGVyYXRpb24jOTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTYuMTEuMDAjUG9saXRpY2FsIGNyaW1lcyBjb29wZXJhdGlvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4xMi4wMCNQZWFjZSB0cmVhdGllcyBjb29wZXJhdGlvbiM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4xMy4wMCNUcmVhdHkgc2lnbmF0dXJlIG9yIGFjY2Vzc2lvbnMgb3IgcmVjdGlmaWNhdGlvbiBzZXJ2aWNlcyM5My4xMi4xNi4wMC4wMAotdW5zcHNjNyM5My4xMi4xNi4xNC4wMCNJbnRlcm5hdGlvbmFsIHdhdGVyY291cnNlIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjEyLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE2LjE1LjAwI1RlcnJpdG9yaWFsIGNsYWltcyBvciBuZWdvdGlhdGlvbnMgdGhpcmQgcGFydHkgc2VydmljZXMjOTMuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDAuMDAjSW50ZXJuYXRpb25hbCBvcmdhbml6YXRpb25zIzkzLjEyLjAwLjAwLjAwCi11bnNwc2M3IzkzLjEyLjE3LjAxLjAwI1N5c3RlbSBvZiBvcmdhbml6YXRpb25zIHNlcnZpY2VzIzkzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE3LjAyLjAwI1NlY3VyaXR5IGNvdW5jaWwgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDMuMDAjRWNvbm9taWMgb3Igc29jaWFsIGNvdW5jaWwgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDQuMDAjU2VjcmV0YXJpYXQgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDUuMDAjVHJ1c3RzaGlwIGNvdW5jaWwgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDYuMDAjR2VuZXJhbCBhc3NlbWJseSBzZXJ2aWNlcyM5My4xMi4xNy4wMC4wMAotdW5zcHNjNyM5My4xMi4xNy4wNy4wMCNJbnRlcm5hdGlvbmFsIGNvdXJ0IG9mIGp1c3RpY2Ugc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTIuMTcuMDguMDAjSW50ZXJuYXRpb25hbCBwb2xpdGljYWwgb3JnYW5pemF0aW9ucyBzZXJ2aWNlcyM5My4xMi4xNy4wMC4wMAotdW5zcHNjNyM5My4xMi4xNy4wOS4wMCNJbnRlcm5hdGlvbmFsIGNoYXJpdHkgb3JnYW5pemF0aW9ucyBzZXJ2aWNlcyM5My4xMi4xNy4wMC4wMAotdW5zcHNjNyM5My4xMi4xNy4xMC4wMCNJbnRlcm5hdGlvbmFsIGh1bWFuIHJlbGllZiBvcmdhbml6YXRpb25zIHNlcnZpY2VzIzkzLjEyLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEyLjE3LjExLjAwI0ludGVybmF0aW9uYWwgaGVhbHRoIG9yZ2FuaXphdGlvbnMgc2VydmljZXMjOTMuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMDAuMDAuMDAjSHVtYW5pdGFyaWFuIGFpZCBhbmQgcmVsaWVmIzkzLjAwLjAwLjAwLjAwCi11bnNwc2M3IzkzLjEzLjE1LjAwLjAwI1JlZnVnZWUgcHJvZ3JhbXMjOTMuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTUuMDEuMDAjUHJvdGVjdGlvbiBvZiBodW1hbiByaWdodHMgc2VydmljZXMjOTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTUuMDIuMDAjUHJvbW90aW9uIG9mIGh1bWFuIHJpZ2h0cyBzZXJ2aWNlcyM5My4xMy4xNS4wMC4wMAotdW5zcHNjNyM5My4xMy4xNS4wMy4wMCNIdW1hbiByaWdodHMgZWR1Y2F0aW9uIG9yIGluZm9ybWF0aW9uIGRpc3NlbWluYXRpb24gc2VydmljZXMjOTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTUuMDQuMDAjUmVmdWdlZSBlbWVyZ2VuY3kgYXNzaXN0YW5jZSBzZXJ2aWNlcyM5My4xMy4xNS4wMC4wMAotdW5zcHNjNyM5My4xMy4xNS4wNS4wMCNSZWZ1Z2VlIGNhbXBzIHNlcnZpY2VzIzkzLjEzLjE1LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE1LjA2LjAwI1JlZnVnZWUgcmVzZXR0bGVtZW50cyBvciByZXBhdHJpYXRpb24gc2VydmljZXMjOTMuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTUuMDcuMDAjRGlzcGxhY2VkIHBlcnNvbnMgYXNzaXN0YW5jZSBzZXJ2aWNlcyM5My4xMy4xNS4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4wMC4wMCNGb29kIGFuZCBudXRyaXRpb24gcG9saWN5IHBsYW5uaW5nIGFuZCBwcm9ncmFtcyM5My4xMy4wMC4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4wMS4wMCNIdW5nZXIgZXJhZGljYXRpb24gcHJvZ3JhbXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDIuMDAjRW1lcmdlbmN5IGZvb2Qgc3VwcGx5IHNlcnZpY2VzIzkzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE2LjAzLjAwI1dvcmxkIGZvb2QgcHJvZ3JhbSBzZXJ2aWNlcyM5My4xMy4xNi4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4wNC4wMCNGb29kIG9yIGFncmljdWx0dXJlIG9yZ2FuaXphdGlvbiBzZXJ2aWNlcyM5My4xMy4xNi4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4wNS4wMCNDb21tb24gZnVuZCBmb3IgY29tbW9kaXRpZXMgc2VydmljZXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDYuMDAjSW50ZXJuYXRpb25hbCBmdW5kIGZvciBhZ3JpY3VsdHVyYWwgZGV2ZWxvcG1lbnQgc2VydmljZXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDcuMDAjRm9vZCBkaXN0cmlidXRpb24gc2VydmljZXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDguMDAjRm9vZCBzdXBwbHkgc2VydmljZXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMDkuMDAjRm9vZCBhaWQgcG9saWNpZXMgb3IgcHJvZ3JhbXMjOTMuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTYuMTAuMDAjRm9vZCBwbGFubmluZyBzZXJ2aWNlcyM5My4xMy4xNi4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4xMS4wMCNGb29kIHNlY3VyaXR5IHNlcnZpY2VzIzkzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE2LjEyLjAwI0Zvb2QgcmVzZXJ2ZXMgbWFuYWdlbWVudCM5My4xMy4xNi4wMC4wMAotdW5zcHNjNyM5My4xMy4xNi4xMy4wMCNGb29kIHNob3J0YWdlIG9yIHN1cnBsdXMgbWFuYWdlbWVudCBvciBjb250cm9sIHNlcnZpY2VzIzkzLjEzLjE2LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE3LjAwLjAwI0hlYWx0aCBwcm9ncmFtcyM5My4xMy4wMC4wMC4wMAotdW5zcHNjNyM5My4xMy4xNy4wMS4wMCNBbnRpIHRvYmFjY28gY2FtcGFpZ25zIzkzLjEzLjE3LjAwLjAwCi11bnNwc2M3IzkzLjEzLjE3LjAyLjAwI1Nhbml0YXRpb24gcHJvZ3JhbXMjOTMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTcuMDMuMDAjUmVzZWFyY2ggcHJvZ3JhbXMjOTMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTcuMDQuMDAjRGlzZWFzZSBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgc2VydmljZXMjOTMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTcuMDUuMDAjRHJ1ZyBhYnVzZSBwcmV2ZW50aW9uIG9yIGNvbnRyb2wgcHJvZ3JhbXMjOTMuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTguMDAuMDAjRGlzYXN0ZXIgcHJlcGFyZWRuZXNzIGFuZCByZWxpZWYjOTMuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTguMDEuMDAjRGlzYXN0ZXIgd2FybmluZyBzZXJ2aWNlcyM5My4xMy4xOC4wMC4wMAotdW5zcHNjNyM5My4xMy4xOC4wMi4wMCNEaXNhc3RlciBwcmVwYXJlZG5lc3MgcmVzcG9uc2Ugc2VydmljZXMjOTMuMTMuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTMuMTguMDMuMDAjRW1lcmdlbmN5IGhvdXNpbmcgc2VydmljZXMjOTMuMTMuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMDAuMDAuMDAjQ29tbXVuaXR5IGFuZCBzb2NpYWwgc2VydmljZXMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDAuMDAjU29jaWFsIGRldmVsb3BtZW50IGFuZCBzZXJ2aWNlcyM5My4xNC4wMC4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4wMS4wMCNTb2NpYWwgcG9saWN5IHNlcnZpY2VzIzkzLjE0LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE1LjAyLjAwI1NvY2lhbCBzZWN1cml0eSBsZWdpc2xhdGlvbiBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4wMy4wMCNTb2NpYWwgcGxhbm5pbmcgc2VydmljZXMjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDQuMDAjRm9zdGVyIGhvbWUgY2FyZSBzZXJ2aWNlcyBvciBvcnBoYW5hZ2UjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDUuMDAjQWRvcHRpb24gc2VydmljZXMjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDYuMDAjU29jaWFsIHdlbGZhcmUgc2VydmljZXMjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDcuMDAjU29jaWFsIHdvcmsgYWRtaW5pc3RyYXRpb24gc2VydmljZXMjOTMuMTQuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTUuMDguMDAjVm9sdW50YXJ5IHNlcnZpY2UgbWFuYWdlbWVudCM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4wOS4wMCNTb2NpYWwgcHJvYmxlbXMgYW5hbHlzaXMgb3IgbWFuYWdlbWVudCBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xMC4wMCNTb2NpYWwgc3RydWN0dXJlIHN0dWRpZXMgb3IgcmVsYXRlZCBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xMS4wMCNTb2NpYWwgZ3JvdXBzIHN0dWRpZXMgb3IgcmVsYXRlZCBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xMi4wMCNZb3V0aCBtb3ZlbWVudHMgb3Igb3JnYW5pemF0aW9ucyBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xMy4wMCNTb2NpYWwganVzdGljZSBvciBsZWdpc2xhdGlvbiBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNS4xNC4wMCNTb2NpbyBjdWx0dXJhbCBzZXJ2aWNlcyM5My4xNC4xNS4wMC4wMAotdW5zcHNjNyM5My4xNC4xNi4wMC4wMCNQb3B1bGF0aW9uIzkzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjAxLjAwI1BvcHVsYXRpb24gY2Vuc3VzIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjAyLjAwI1BvcHVsYXRpb24gc2FtcGxlIHN1cnZleXMgc2VydmljZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMDMuMDAjQmlydGggcmVwb3J0aW5nIG9yIGNvbnRyb2wgc2VydmljZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMDQuMDAjUG9wdWxhdGlvbiBjb250cm9sIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjA1LjAwI1BvcHVsYXRpb24gdHJlbmRzIG9yIHByb2plY3Rpb25zIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjA2LjAwI0JpcnRoIHN0YXRpc3RpY3Mgc2VydmljZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMDcuMDAjTWFycmlhZ2UgcmVzZWFyY2ggb3Igc3RhdGlzdGljcyBzZXJ2aWNlcyM5My4xNC4xNi4wMC4wMAotdW5zcHNjNyM5My4xNC4xNi4wOC4wMCNQb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvciBhbmFseXNpcyBzZXJ2aWNlcyM5My4xNC4xNi4wMC4wMAotdW5zcHNjNyM5My4xNC4xNi4wOS4wMCNQb3B1bGF0aW9uIGNvbXBvc2l0aW9uIGFuYWx5c2lzIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjEwLjAwI0RlbW9ncmFwaGljIHN0dWRpZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMTEuMDAjSW1taWdyYXRpb24gYW5hbHlzaXMgb3Igc2VydmljZXMjOTMuMTQuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTYuMTIuMDAjRmFtaWx5IHBsYW5uaW5nIHByb2dyYW1zIG9yIHNlcnZpY2VzIzkzLjE0LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE2LjEzLjAwI0h1bWFuIHJlcHJvZHVjdGlvbiBhbmFseXNpcyM5My4xNC4xNi4wMC4wMAotdW5zcHNjNyM5My4xNC4xNy4wMC4wMCNDdWx0dXJlIzkzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjAxLjAwI0N1bHR1cmFsIGV2ZW50cyBvcmdhbml6YXRpb25zIzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjAyLjAwI0N1bHR1cmUgcHJvbW90aW9uYWwgc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMDMuMDAjQXJ0IHJlbGF0ZWQgc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMDQuMDAjU29uZyB3cml0aW5nIHNlcnZpY2VzIzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjA1LjAwI0xpdGVyYXJ5IHdyaXRpbmcgc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMDYuMDAjTWlub3JpdGllcyBwcm90ZWN0aW9uIHNlcnZpY2VzIzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjA3LjAwI0N1bHR1cmFsIGhlcml0YWdlIHByZXNlcnZhdGlvbiBvciBwcm9tb3Rpb24gc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMDguMDAjTXVzZXVtIHNlcnZpY2VzIzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE3LjA5LjAwI0N1bHR1cmFsIHBvbGljeSBzZXJ2aWNlcyM5My4xNC4xNy4wMC4wMAotdW5zcHNjNyM5My4xNC4xNy4xMC4wMCNBcmNoYWljIG9yIGluZGlnZW5vdXMgbGFuZ3VhZ2Ugc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMTEuMDAjVHJhZGl0aW9uYWwgaGFuZGNyYWZ0cyBwcm9tb3Rpb24gc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMTIuMDAjUHJvdGVjdGlvbiBvZiBpbnRlbGxlY3R1YWwgb3IgY3VsdHVyYWwgcHJvcGVydHkgc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMTMuMDAjSGlzdG9yaWMgc2l0ZXMgb3IgbW9udW1lbnRzIHByb3RlY3Rpb24gc2VydmljZXMjOTMuMTQuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTcuMTQuMDAjTXl0aG9sb2d5IzkzLjE0LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjAwLjAwI0VtcGxveW1lbnQjOTMuMTQuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDEuMDAjRW1wbG95bWVudCBwcm9tb3Rpb24gb3IgcGxhbm5pbmcgc2VydmljZXMjOTMuMTQuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDIuMDAjUmVjcnVpdG1lbnQgc2VydmljZXMjOTMuMTQuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDMuMDAjSW50ZXJuYXRpb25hbCBsYWJvciBzdGFuZGFyZHMgc2VydmljZXMjOTMuMTQuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDQuMDAjSW50ZXJuYXRpb25hbCBsYWJvciByZWdpc3RyYXRpb24gc2VydmljZXMjOTMuMTQuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTguMDUuMDAjVW5lbXBsb3ltZW50IHNlcnZpY2VzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjA2LjAwI0VtcGxveW1lbnQgc3RhdGlzdGljcyBvciBmb3JlY2FzdGluZyBzZXJ2aWNlcyM5My4xNC4xOC4wMC4wMAotdW5zcHNjNyM5My4xNC4xOC4wNy4wMCNXb3JrIHRpbWUgYXJyYW5nZW1lbnRzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjA4LjAwI09jY3VwYXRpb25hbCBoZWFsdGggb3Igc2FmZXR5IHNlcnZpY2VzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjEwLjAwI0NhcmVlciBkZXZlbG9wbWVudCBzZXJ2aWNlcyM5My4xNC4xOC4wMC4wMAotdW5zcHNjNyM5My4xNC4xOC4xMS4wMCNQcm9tb3Rpb25hbCBzZXJ2aWNlcyM5My4xNC4xOC4wMC4wMAotdW5zcHNjNyM5My4xNC4xOC4xMi4wMCNMYWJvciBpbnNwZWN0aW9uIHNlcnZpY2VzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE4LjEzLjAwI1dvcmsgY291bmNpbCBzZXJ2aWNlcyM5My4xNC4xOC4wMC4wMAotdW5zcHNjNyM5My4xNC4xOC4xNC4wMCNJbnRlcm5hdGlvbmFsIGxhYm9yIHNlcnZpY2VzIzkzLjE0LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjAwLjAwI1J1cmFsIGRldmVsb3BtZW50IzkzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjAxLjAwI0FncmljdWx0dXJhbCBjb21tZXJjaWFsIGJhbmtpbmcgc2VydmljZXMjOTMuMTQuMTkuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTkuMDIuMDAjUnVyYWwgaW52ZXN0bWVudCBzZXJ2aWNlcyM5My4xNC4xOS4wMC4wMAotdW5zcHNjNyM5My4xNC4xOS4wMy4wMCNBZ3JpY3VsdHVyYWwgaW5zdGl0dXRpb25zIG9yZ2FuaXphdGlvbiBvciBtYW5hZ2VtZW50IHNlcnZpY2VzIzkzLjE0LjE5LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjA0LjAwI0FncmljdWx0dXJhbCBvciBydXJhbCBjb29wZXJhdGl2ZXMgc2VydmljZXMjOTMuMTQuMTkuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTkuMDUuMDAjQWdyaWN1bHR1cmFsIHJlc2VhcmNoIHNlcnZpY2VzIzkzLjE0LjE5LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjA2LjAwI0Zhcm1lcnMgb3IgcGVhc2FudHMgb3JnYW5pemF0aW9ucyBzZXJ2aWNlcyM5My4xNC4xOS4wMC4wMAotdW5zcHNjNyM5My4xNC4xOS4wNy4wMCNXb21lbnMgc2VydmljZXMgaW4gYWdyaWN1bHR1cmFsIHByb2R1Y3Rpb24gb3IgcnVyYWwgZGV2ZWxvcG1lbnQjOTMuMTQuMTkuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMTkuMDguMDAjQWdyYXJpYW4gcmVmb3JtIG9yIGxhbmQgc2V0dGxlbWVudCBzZXJ2aWNlcyM5My4xNC4xOS4wMC4wMAotdW5zcHNjNyM5My4xNC4xOS4wOS4wMCNMYW5kIGFkbWluaXN0cmF0aW9uIHNlcnZpY2VzIzkzLjE0LjE5LjAwLjAwCi11bnNwc2M3IzkzLjE0LjE5LjEwLjAwI0lzbGFuZCBkZXZlbG9wbWVudCBzZXJ2aWNlcyM5My4xNC4xOS4wMC4wMAotdW5zcHNjNyM5My4xNC4yMC4wMC4wMCNVcmJhbiBkZXZlbG9wbWVudCM5My4xNC4wMC4wMC4wMAotdW5zcHNjNyM5My4xNC4yMC4wMS4wMCNVcmJhbiBkZXZlbG9wbWVudCBwbGFubmluZyBzZXJ2aWNlcyM5My4xNC4yMC4wMC4wMAotdW5zcHNjNyM5My4xNC4yMC4wMi4wMCNVcmJhbiBsYW5kIGFkbWluaXN0cmF0aW9uIHNlcnZpY2VzIzkzLjE0LjIwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIwLjAzLjAwI1VyYmFuIGludmVzdG1lbnQgcHJvZ3JhbW1pbmcgc2VydmljZXMjOTMuMTQuMjAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMjAuMDQuMDAjU2x1bSByZWRldmxvcG1lbnQgc2VydmljZXMjOTMuMTQuMjAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMjAuMDUuMDAjVXJiYW4gbGlnaHRpbmcgc2VydmljZXMjOTMuMTQuMjAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMjAuMDYuMDAjVXJiYW4gZGV2ZWxvcG1lbnQgY29udHJvbCBvciByZWd1bGF0aW9ucyBzZXJ2aWNlcyM5My4xNC4yMC4wMC4wMAotdW5zcHNjNyM5My4xNC4yMC4wNy4wMCNVcmJhbiBidWlsZGluZyBzdGFuZGFyZHMgb3IgcmVndWxhdGlvbnMgc2VydmljZXMjOTMuMTQuMjAuMDAuMDAKLXVuc3BzYzcjOTMuMTQuMjAuMDguMDAjVXJiYW4gY29tbXVuaXR5IHNlcnZpY2VzIzkzLjE0LjIwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIwLjA5LjAwI1VyYmFuIHByb2plY3Qgb3IgcHJvZ3JhbSBhZG1pbmlzdHJhdGlvbiBvciBtYW5hZ2VtZW50IHNlcnZpY2VzIzkzLjE0LjIwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIxLjAwLjAwI1JlZ2lvbmFsIGRldmVsb3BtZW50IzkzLjE0LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIxLjAxLjAwI1JlZ2lvbmFsIGRldmVsb3BtZW50IHBsYW5uaW5nIHNlcnZpY2VzIzkzLjE0LjIxLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIxLjAyLjAwI0Vjb25vbWljIGNvb3BlcmF0aW9uIHNlcnZpY2VzIzkzLjE0LjIxLjAwLjAwCi11bnNwc2M3IzkzLjE0LjIxLjAzLjAwI1RlY2huaWNhbCBjb29wZXJhdGlvbiBzZXJ2aWNlcyM5My4xNC4yMS4wMC4wMAotdW5zcHNjNyM5My4xNC4yMS4wNC4wMCNTZWN0b3JhbCBwbGFubmluZyBzZXJ2aWNlcyM5My4xNC4yMS4wMC4wMAotdW5zcHNjNyM5My4xNS4wMC4wMC4wMCNQdWJsaWMgYWRtaW5pc3RyYXRpb24gYW5kIGZpbmFuY2Ugc2VydmljZXMjOTMuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMDAuMDAjUHVibGljIGFkbWluaXN0cmF0aW9uIzkzLjE1LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjAxLjAwI1B1YmxpYyBlbnRlcnByaXNlcyBtYW5hZ2VtZW50IG9yIGZpbmFuY2lhbCBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4wMi4wMCNQdWJsaWMgZW50ZXJwcmlzZXMgaW5mb3JtYXRpb24gb3IgY29udHJvbCBzeXN0ZW1zIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjAzLjAwI1ByaXZhdGl6YXRpb24gcHJvZ3JhbXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMDQuMDAjQWRtaW5pc3RyYXRpdmUgcmVmb3JtIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjA1LjAwI0FkbWluaXN0cmF0aXZlIGFnZW5jaWVzIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjA2LjAwI0FkbWluaXN0cmF0aXZlIGVjb25vbWljIGNvdW5jaWwgc2VydmljZXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMDcuMDAjQWRtaW5pc3RyYXRpdmUgcHJvY2VkdXJlcyBvciBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4wOC4wMCNHb3Zlcm5tZW50IGRlcGFydG1lbnRzIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjA5LjAwI0dvdmVybm1lbnQgaW5mb3JtYXRpb24gc2VydmljZXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMTAuMDAjQWRtaW5pc3RyYXRpdmUgZmVlcyBvciB0YXggY29sbGVjdGlvbiBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4xMS4wMCNBZG1pbmlzdHJhdGl2ZSBhY3RzIHJhdGlmaWNhdGlvbiBvciBpbXBsZW1lbnRhdGlvbiBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4xMi4wMCNQdWJsaWMgaW5zdGl0dXRpb25zIHNlcnZpY2VzIzkzLjE1LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE1LjEzLjAwI011bHRpbmF0aW9uYWwgcHVibGljIGNvcnBvcmF0aW9ucyBzZXJ2aWNlcyM5My4xNS4xNS4wMC4wMAotdW5zcHNjNyM5My4xNS4xNS4xNC4wMCNPbWJ1ZHNtYW4gc2VydmljZXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTUuMTUuMDAjTmF0aW9uYWwgcGxhbm5pbmcgc2VydmljZXMjOTMuMTUuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDAuMDAjUHVibGljIGZpbmFuY2UjOTMuMTUuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDEuMDAjUHJvZ3JhbSBidWRnZXRpbmcgc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDIuMDAjR292ZXJubWVudCBidWRnZXRpbmcgc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDMuMDAjQnVkZ2V0IG9yIHB1YmxpYyBpbnZlc3RtZW50IG1hbmFnZW1lbnQjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDQuMDAjTWlsaXRhcnkgZXhwZW5kaXR1cmVzIGJ1ZGdldGluZyBzZXJ2aWNlcyM5My4xNS4xNi4wMC4wMAotdW5zcHNjNyM5My4xNS4xNi4wNS4wMCNHb3Zlcm5tZW50IGZpbmFuY2Ugc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDYuMDAjR292ZXJubWVudCBhY2NvdW50aW5nIHNlcnZpY2VzIzkzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE2LjA3LjAwI0dvdmVybm1lbnQgYXVkaXRpbmcgc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDguMDAjR292ZXJubWVudCBvciBjZW50cmFsIGJhbmsgc2VydmljZXMjOTMuMTUuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTYuMDkuMDAjTG90dGVyaWVzIHNlcnZpY2VzIzkzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE2LjEwLjAwI1RheCBjb2xsZWN0aW9uIHNlcnZpY2VzIzkzLjE1LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE1LjE2LjExLjAwI1N1YnNpZGllcyM5My4xNS4xNi4wMC4wMAotdW5zcHNjNyM5My4xNS4xNy4wMC4wMCNDdXJyZW5jeSM5My4xNS4wMC4wMC4wMAotdW5zcHNjNyM5My4xNS4xNy4wMS4wMCNDdXJyZW5jaWVzIG9yIGNvaW5hZ2UjOTMuMTUuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTUuMTcuMDIuMDAjTmF0aW9uYWwgYmFuayBub3RlcyM5My4xNS4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4wMC4wMC4wMCNUYXhhdGlvbiM5My4wMC4wMC4wMC4wMAotdW5zcHNjNyM5My4xNi4xNS4wMC4wMCNJbmNvbWUgdGF4IzkzLjE2LjAwLjAwLjAwCi11bnNwc2M3IzkzLjE2LjE1LjAxLjAwI05hdGlvbmFsIGluY29tZSB0YXgjOTMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTUuMDIuMDAjTXVuaWNpcGFsIGluY29tZSB0YXgjOTMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTUuMDMuMDAjQ2FwaXRhbCBnYWlucyB0YXgjOTMuMTYuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTUuMDQuMDAjRXhjZXNzIHByb2ZpdHMgdGF4IzkzLjE2LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE2LjAwLjAwI1RheGVzIG90aGVyIHRoYW4gaW5jb21lIHRheCM5My4xNi4wMC4wMC4wMAotdW5zcHNjNyM5My4xNi4xNi4wMS4wMCNQcm9wZXJ0eSB0YXgjOTMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTYuMDIuMDAjTGFuZCB0YXgjOTMuMTYuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTYuMDMuMDAjVmFsdWUgYWRkZWQgdGF4IChWQVQpIzkzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE2LjA0LjAwI1BheXJvbGwgdGF4IzkzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE2LjA1LjAwI1NhbGVzIHRheCM5My4xNi4xNi4wMC4wMAotdW5zcHNjNyM5My4xNi4xNi4wNi4wMCNTb2NpYWwgc2VjdXJpdHkgdGF4IzkzLjE2LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE2LjA3LjAwI0luaGVyaXRhbmNlIG9yIHRyYW5zZmVyIHRheCM5My4xNi4xNi4wMC4wMAotdW5zcHNjNyM5My4xNi4xNy4wMC4wMCNUYXggYWRtaW5pc3RyYXRpb24jOTMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTcuMDEuMDAjVGF4IGNvbGxhdGlvbiM5My4xNi4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4xNy4wMi4wMCNUYXggaW5jZW50aXZlcyM5My4xNi4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4xNy4wMy4wMCNUYXggc3lzdGVtcyM5My4xNi4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4xNy4wNC4wMCNUYXggcmV2ZW51ZSBhZG1pbmlzdHJhdGlvbiM5My4xNi4xNy4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wMC4wMCNUYXhhdGlvbiBpc3N1ZXMjOTMuMTYuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTguMDEuMDAjVGF4IHJlZm9ybSM5My4xNi4xOC4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wMi4wMCNUYXhhdGlvbiBwb2xpY3kjOTMuMTYuMTguMDAuMDAKLXVuc3BzYzcjOTMuMTYuMTguMDMuMDAjVGF4IHJlc2VhcmNoIzkzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE4LjA0LjAwI0ludmVzdG1lbnQgdGF4IGNyZWRpdCM5My4xNi4xOC4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wNS4wMCNUYXggZGVkdWN0aW9ucyM5My4xNi4xOC4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wNi4wMCNUYXggZXZhc2lvbiM5My4xNi4xOC4wMC4wMAotdW5zcHNjNyM5My4xNi4xOC4wNy4wMCNUYXggc2hlbHRlcnMgb3IgaGF2ZW5zIzkzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE2LjE4LjA4LjAwI1RheCByZXR1cm5zIzkzLjE2LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE3LjAwLjAwLjAwI1RyYWRlIHBvbGljeSBhbmQgcmVndWxhdGlvbiM5My4wMC4wMC4wMC4wMAotdW5zcHNjNyM5My4xNy4xNS4wMC4wMCNUcmFkZSBwb2xpY3kjOTMuMTcuMDAuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTUuMDEuMDAjVHJhZGUgYWdyZWVtZW50cyM5My4xNy4xNS4wMC4wMAotdW5zcHNjNyM5My4xNy4xNS4wMi4wMCNUcmFkZSBuZWdvdGlhdGlvbnMjOTMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTUuMDMuMDAjRm9ybXVsYXRpb24gb2YgbmF0aW9uYWwgY29tbW9kaXR5IHBvbGljaWVzIzkzLjE3LjE1LjAwLjAwCi11bnNwc2M3IzkzLjE3LjE1LjA0LjAwI0RldmVsb3BtZW50IG9mIHNtYWxsIHNjYWxlIGluZHVzdHJpZXMjOTMuMTcuMTUuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTYuMDAuMDAjSW50ZXJuYXRpb25hbCB0cmFkZSM5My4xNy4wMC4wMC4wMAotdW5zcHNjNyM5My4xNy4xNi4wMS4wMCNJbnRlcm5hdGlvbmFsIGNvbW1vZGl0eSBhZ3JlZW1lbnRzIzkzLjE3LjE2LjAwLjAwCi11bnNwc2M3IzkzLjE3LjE2LjAyLjAwI0V4cG9ydCBwb2xpY3kjOTMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTYuMDMuMDAjR2xvYmFsIHRyYWRlIHBvbGljaWVzIG9yIHByb2NlZHVyZXMjOTMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTYuMDQuMDAjQmlsYXRlcmFsIHRyYWRlIGFncmVlbWVudHMjOTMuMTcuMTYuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTcuMDAuMDAjQ3VzdG9tcyBhZG1pbmlzdHJhdGlvbiBhbmQgY29tcGxpYW5jZSM5My4xNy4wMC4wMC4wMAotdW5zcHNjNyM5My4xNy4xNy4wMS4wMCNDdXN0b21zIGNvbnZlbnRpb25zIzkzLjE3LjE3LjAwLjAwCi11bnNwc2M3IzkzLjE3LjE3LjAyLjAwI0N1c3RvbXMgZm9ybWFsaXRpZXMjOTMuMTcuMTcuMDAuMDAKLXVuc3BzYzcjOTMuMTcuMTcuMDMuMDAjQ3VzdG9tcyBvZmZlbmNlcyM5My4xNy4xNy4wMC4wMAotdW5zcHNjNyM5My4xNy4xOC4wMC4wMCNUcmFkZSBhbmFseXNpcyM5My4xNy4wMC4wMC4wMAotdW5zcHNjNyM5My4xNy4xOC4wMS4wMCNUcmFkZSBwcm9qZWN0aW9ucyM5My4xNy4xOC4wMC4wMAotdW5zcHNjNyM5My4xNy4xOC4wMi4wMCNCYWxhbmNlIG9mIHRyYWRlIHByb2plY3Rpb25zIzkzLjE3LjE4LjAwLjAwCi11bnNwc2M3IzkzLjE3LjE4LjAzLjAwI1RyYWRlIHN0YXRpc3RpY3MjOTMuMTcuMTguMDAuMDAKLXVuc3BzYzcjOTQuMDAuMDAuMDAuMDAjT3JnYW5pemF0aW9ucyBhbmQgQ2x1YnMjOTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMDAuMDAuMDAjV29yayByZWxhdGVkIG9yZ2FuaXphdGlvbnMjOTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTUuMDAuMDAjQnVzaW5lc3MgYXNzb2NpYXRpb25zIzk0LjEwLjAwLjAwLjAwCi11bnNwc2M3Izk0LjEwLjE1LjAxLjAwI0FncmljdWx0dXJhbCBpbmR1c3RyeSBhc3NvY2lhdGlvbnMjOTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTUuMDIuMDAjUmVndWxhdG9yeSBhc3NvY2lhdGlvbnMjOTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTUuMDMuMDAjU2VjdG9yYWwgYnVzaW5lc3MgYXNzb2NpYXRpb25zIzk0LjEwLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE1LjA0LjAwI0ludGVybmF0aW9uYWwgYnVzaW5lc3MgYXNzb2NpYXRpb25zIzk0LjEwLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE1LjA1LjAwI0VtcGxveWVycyBhc3NvY2lhdGlvbnMjOTQuMTAuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTYuMDAuMDAjUHJvZmVzc2lvbmFsIGFzc29jaWF0aW9ucyM5NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNi4wMS4wMCNEZW50YWwgYXNzb2NpYXRpb25zIzk0LjEwLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE2LjAyLjAwI01lZGljYWwgaGVhbHRoIGFzc29jaWF0aW9ucyM5NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNi4wMy4wMCNOdXJzaW5nIGFzc29jaWF0aW9ucyM5NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNi4wNC4wMCNBY2NvdW50aW5nIGFzc29jaWF0aW9ucyM5NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNi4wNS4wMCNBcmNoaXRlY3QgYXNzb2NpYXRpb25zIzk0LjEwLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE2LjA2LjAwI0JhciBhc3NvY2lhdGlvbnMjOTQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTYuMDcuMDAjRWR1Y2F0aW9uYWwgb3IgdGVhY2hlciBhc3NvY2lhdGlvbnMjOTQuMTAuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTYuMDguMDAjRW5naW5lZXJpbmcgYXNzb2NpYXRpb25zIzk0LjEwLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE2LjA5LjAwI1NjaWVudGlmaWMgYXNzb2NpYXRpb25zIzk0LjEwLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE2LjEwLjAwI1Byb2Zlc3Npb25hbCBzdGFuZGFyZHMgcmV2aWV3IGJvYXJkcyM5NC4xMC4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNy4wMC4wMCNTdGFmZiBhc3NvY2lhdGlvbnMjOTQuMTAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTcuMDEuMDAjU3RhZmYgaG9iYnkgY2x1YnMjOTQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTcuMDIuMDAjU3RhZmYgc3BvcnRzIGFzc29jaWF0aW9ucyM5NC4xMC4xNy4wMC4wMAotdW5zcHNjNyM5NC4xMC4xNy4wMy4wMCNXb21lbiBzdGFmZiBhc3NvY2lhdGlvbnMjOTQuMTAuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTcuMDQuMDAjUGVuc2lvbm5pc3Qgc3RhZmYgYXNzb2NpYXRpb25zIzk0LjEwLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE3LjA1LjAwI01hbmFnZW1lbnQgc3RhZmYgYXNzb2NpYXRpb25zIzk0LjEwLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE4LjAwLjAwI1RyYWRlIHVuaW9ucyM5NC4xMC4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wMS4wMCNMYWJvciBvciBnZW5lcmFsIHdvcmtlcnMgdHJhZGUgdW5pb25zIzk0LjEwLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE4LjAyLjAwI1RyYWRlIHVuaW9uIGFjdGl2aXN0cyBzZXJ2aWNlcyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wMy4wMCNUcmFkZSB1bmlvbiBpbmZvcm1hdGlvbiBzZXJ2aWNlcyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wNC4wMCNUcmFuc3BvcnQgdW5pb25zIzk0LjEwLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEwLjE4LjA1LjAwI1RlYWNoZXJzIHVuaW9ucyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wNi4wMCNNZWRpY2FsIHBlcnNvbm5lbCB1bmlvbnMjOTQuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTguMDcuMDAjRW1wbG95ZXJzIHVuaW9ucyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4wOC4wMCNDaXZpbCBzZXJ2YW50cyB1bmlvbnMjOTQuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTAuMTguMDkuMDAjUGVyc29uYWwgYXNzaXN0YW5jZSBzZXJ2aWNlcyM5NC4xMC4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMC4xOC4xMC4wMCNBdmlhdGlvbiB1bmlvbnMjOTQuMTAuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTEuMDAuMDAuMDAjUmVsaWdpb3VzIG9yZ2FuaXphdGlvbnMjOTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTcuMDAuMDAjUmVsaWdpb3VzIHJlc2lkZW5jZXMjOTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTcuMDEuMDAjUHJpdmF0ZSByZWxpZ2lvdXMgaG9tZSByZXNpZGVuY2VzIzk0LjExLjE3LjAwLjAwCi11bnNwc2M3Izk0LjExLjE3LjAyLjAwI0NvbW11bml0eSByZWxpZ2lvdXMgaG9tZSByZXNpZGVuY2VzIzk0LjExLjE3LjAwLjAwCi11bnNwc2M3Izk0LjExLjE3LjAzLjAwI1JlbGlnaW91cyByZXRyZWF0IHJlc2lkZW5jZXMjOTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTcuMDQuMDAjVGVtcG9yYXJ5IHJlbGlnaW91cyBob21lIHJlc2lkZW5jZXMjOTQuMTEuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTguMDAuMDAjUGlsZ3JpbWFnZSBvcmdhbml6YXRpb25zIGFuZCBzZXJ2aWNlcyM5NC4xMS4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMS4xOC4wMS4wMCNNZWNjYSBwaWxncmltYWdlIG9yZ2FuaXphdGlvbnMgb3Igc2VydmljZXMjOTQuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTguMDIuMDAjVmF0aWNhbiBwaWxncmltYWdlIG9yZ2FuaXphdGlvbnMgb3Igc2VydmljZXMjOTQuMTEuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTguMDMuMDAjUGlsZ3JpbWFnZSB0cmF2ZWwgYXNzaXN0YW5jZSBzZXJ2aWNlcyM5NC4xMS4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMS4xOC4wNC4wMCNQaWxncmltYWdlIHRvdXIgb3BlcmF0b3JzIHNlcnZpY2VzIzk0LjExLjE4LjAwLjAwCi11bnNwc2M3Izk0LjExLjE5LjAwLjAwI01pc3Npb25hcnkgc2VydmljZXMjOTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMTkuMDEuMDAjUmVsaWdpb3VzIG9yZGVycyBzZXJ2aWNlcyM5NC4xMS4xOS4wMC4wMAotdW5zcHNjNyM5NC4xMS4xOS4wMi4wMCNFdmFuZ2VsaWNhbCBtaXNzaW9uYXJ5IHNlcnZpY2VzIzk0LjExLjE5LjAwLjAwCi11bnNwc2M3Izk0LjExLjE5LjAzLjAwI0VkdWNhdGlvbmFsIG1pc3Npb25hcnkgc2VydmljZXMjOTQuMTEuMTkuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMjAuMDAuMDAjRGVub21pbmF0aW9uYWwgc2VydmljZXMjOTQuMTEuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMjAuMDEuMDAjSGluZHVpc20gc2VydmljZXMjOTQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMjAuMDIuMDAjQnVkZGhpc20gc2VydmljZXMjOTQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTQuMTEuMjAuMDMuMDAjQ2hyaXN0aWFuIHNlcnZpY2VzIzk0LjExLjIwLjAwLjAwCi11bnNwc2M3Izk0LjExLjIwLjA0LjAwI0lzbGFtIHNlcnZpY2VzIzk0LjExLjIwLjAwLjAwCi11bnNwc2M3Izk0LjExLjIwLjA1LjAwI0p1ZGFpc20gc2VydmljZXMjOTQuMTEuMjAuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMDAuMDAuMDAjQ2x1YnMjOTQuMDAuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDAuMDAjU3BvcnQgY2x1YnMjOTQuMTIuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDEuMDAjSWNlIHNwb3J0cyBjbHVicyM5NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNS4wMi4wMCNCb2F0aW5nIG9yIHN3aW1taW5nIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjAzLjAwI0d1biBvciBodW50aW5nIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjA0LjAwI091dGRvb3IgZmllbGQgc3BvcnQgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDUuMDAjSW5kb29yIG9yIG91dGRvb3IgY291cnQgc3BvcnQgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDYuMDAjV2ludGVyIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjA3LjAwI0JlYWNoIG9yIHdhdGVyIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjA4LjAwI0N5Y2xpbmcgc3BvcnQgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMDkuMDAjTW91bnRhaW5lZXJpbmcgc3BvcnQgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMTAuMDAjUmFjaW5nIHNwb3J0IGNsdWJzIzk0LjEyLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE1LjExLjAwI0ZseWluZyBzcG9ydCBjbHVicyM5NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNS4xMi4wMCNQcm9mZXNzaW9uYWwgb3Igc2VtaXByb2Zlc3Npb25hbCBzcG9ydHMgY2x1YnMjOTQuMTIuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTUuMTMuMDAjU3RhZGl1bSBldmVudCBvcGVyYXRvciBzZXJ2aWNlcyM5NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNS4xNC4wMCNTcG9ydCBjbHViIG1hbmFnZXJzIG9yIHByb21vdGVycyBzZXJ2aWNlcyM5NC4xMi4xNS4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wMC4wMCNIb2JieSBjbHVicyM5NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wMS4wMCNQbGF5aW5nIGNhcmQgaG9iYnkgY2x1YnMjOTQuMTIuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTYuMDIuMDAjSGFuZGNyYWZ0cyBjbHVicyM5NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wMy4wMCNQb2V0cnkgb3IgbGl0ZXJhdHVyZSBob2JieSBjbHVicyM5NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wNC4wMCNDb29raW5nIGhvYmJ5IGNsdWJzIzk0LjEyLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE2LjA1LjAwI0dhcmRlbmluZyBob2JieSBjbHVicyM5NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wNi4wMCNDb2xsZWN0b3IgaG9iYnkgY2x1YiM5NC4xMi4xNi4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNi4wNy4wMCNTY291dGluZyBjbHViIzk0LjEyLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE3LjAwLjAwI0FtYXRldXJzIGNsdWJzIzk0LjEyLjAwLjAwLjAwCi11bnNwc2M3Izk0LjEyLjE3LjAxLjAwI0FtYXRldXIgZHJhbWEgY2x1YnMgb3Igc2VydmljZXMjOTQuMTIuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTcuMDIuMDAjQW1hdGV1ciBtdXNpYyBjbHVicyBvciBzZXJ2aWNlcyM5NC4xMi4xNy4wMC4wMAotdW5zcHNjNyM5NC4xMi4xNy4wMy4wMCNBbWF0ZXVyIGRhbmNlIGNsdWJzIG9yIHNlcnZpY2VzIzk0LjEyLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE3LjA0LjAwI0FtYXRldXIgZmluZSBhcnRzIGNsdWJzIG9yIHNlcnZpY2VzIzk0LjEyLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEyLjE4LjAwLjAwI1NvY2lhbCBjbHVicyM5NC4xMi4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xOC4wMS4wMCNZb3V0aCBjbHVicyM5NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xOC4wMi4wMCNTZW5pb3IgY2l0aXplbnMgY2x1YnMjOTQuMTIuMTguMDAuMDAKLXVuc3BzYzcjOTQuMTIuMTguMDMuMDAjU29jaWFsIGdhdGhlcmluZyBjbHVicyM5NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xOC4wNC4wMCNTb2NpYWwgY2x1YnMgZm9yIHBlb3BsZSB3aXRoIGRpc2FiaWxpdGllcyM5NC4xMi4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMi4xOC4wNS4wMCNXYXIgdmV0ZXJhbnMgc29jaWFsIGNsdWJzIzk0LjEyLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEzLjAwLjAwLjAwI0NpdmljIG9yZ2FuaXphdGlvbnMgYW5kIGFzc29jaWF0aW9ucyBhbmQgbW92ZW1lbnRzIzk0LjAwLjAwLjAwLjAwCi11bnNwc2M3Izk0LjEzLjE1LjAwLjAwI05vbiBnb3Zlcm5tZW50YWwgb3JnYW5pemF0aW9ucyM5NC4xMy4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xNS4wMS4wMCNFbnZpcm9ubWVudGFsIG5vbiBnb3Zlcm5tZW50YWwgc2VydmljZXMjOTQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTUuMDIuMDAjRW1lcmdlbmN5IHJlbGllZiBub24gZ292ZXJubWVudGFsIHNlcnZpY2VzIzk0LjEzLjE1LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE1LjAzLjAwI1RlY2huaWNhbCBhc3Npc3RhbmNlIG5vbiBnb3Zlcm5tZW50YWwgc2VydmljZXMjOTQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTUuMDQuMDAjRGV2ZWxvcG1lbnQgYWlkIG5vbiBnb3Zlcm5lbW50YWwgc2VydmljZXMjOTQuMTMuMTUuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTYuMDAuMDAjQ2hhcml0eSBvcmdhbml6YXRpb25zIzk0LjEzLjAwLjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjAxLjAwI0NoYXJpdHkgb3JnYW5pemF0aW9ucyBzaGVsdGVyIHNlcnZpY2VzIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjAyLjAwI0Zvb2QgcmVsaWVmIHNlcnZpY2VzIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjAzLjAwI0xlZ2FsIGFzc2lzdGFuY2Ugc2VydmljZXMjOTQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTYuMDQuMDAjUmVzb3VyY2UgbW9iaWxpemF0aW9uIHNlcnZpY2VzIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjA1LjAwI0ludGVybmF0aW9uYWwgYWlkIGFzc2lzdGFuY2Ugc2VydmljZXMjOTQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTYuMDYuMDAjT3JwaGFuYWdlIG9yIGFkb3B0aW9uIHNlcnZpY2VzIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE2LjA3LjAwI0VkZXJseSBhc3Npc3RhbmNlIG9yZ2FuaXphdGlvbnMjOTQuMTMuMTYuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTYuMDguMDAjUHJpc29uZXIgYXNzaXN0YW5jZSBvcmdhbml6YXRpb25zIzk0LjEzLjE2LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE3LjAwLjAwI0dyZWVuIGFzc29jaWF0aW9ucyM5NC4xMy4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xNy4wMS4wMCNSYWRpY2FsIGdyZWVuIGFzc29jaWF0aW9ucyM5NC4xMy4xNy4wMC4wMAotdW5zcHNjNyM5NC4xMy4xNy4wMi4wMCNFY29mZW1pbmlzdHMgYXNzb2NpYXRpb25zIzk0LjEzLjE3LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE3LjAzLjAwI0Vjb2xvZ2ljYWwgcG9saXRpY2FsIG9yZ2FuaXphdGlvbnMjOTQuMTMuMTcuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTcuMDQuMDAjR3JlZW4gYWN0aXZpc3RzIG1vdmVtZW50cyBvciBzZXJ2aWNlcyM5NC4xMy4xNy4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOC4wMC4wMCNNb3ZlbWVudHMjOTQuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTguMDEuMDAjR2F5IG9yIGxlc2JpYW4gb3IgYmlzZXh1YWwgb3IgdHJhbnNnZW5kZXIgbW92ZW1lbnRzIzk0LjEzLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE4LjAyLjAwI0FudGkgcmFjaXNtIG1vdmVtZW50cyM5NC4xMy4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOC4wMy4wMCNXb21lbiBsaWJlcmF0aW9uIG1vdmVtZW50cyM5NC4xMy4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOC4wNC4wMCNGcmF0ZXJuYWwgYXNzb2NpYXRpb25zIzk0LjEzLjE4LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE4LjA1LjAwI0V0aG5pYyBtaW5vcml0aWVzIGN1bHR1cmFsIHByZXNlcnZhdGlvbiBzZXJ2aWNlcyM5NC4xMy4xOC4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOS4wMC4wMCNBbmltYWwgcHJvdGVjdGlvbiBhc3NvY2lhdGlvbnMjOTQuMTMuMDAuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMTkuMDEuMDAjQW5pbWFsIGxpYmVyYXRpb24gbW92ZW1lbnRzIzk0LjEzLjE5LjAwLjAwCi11bnNwc2M3Izk0LjEzLjE5LjAyLjAwI0VuZGFuZ2VyZWQgc3BlY2llcyBwcm90ZWN0aW9uIGFzc29jaWF0aW9ucyM5NC4xMy4xOS4wMC4wMAotdW5zcHNjNyM5NC4xMy4xOS4wMy4wMCNUaHJlYXRlbmVkIGFuaW1hbHMgcHJvdGVjdGlvbiBhc3NvY2lhdGlvbnMjOTQuMTMuMTkuMDAuMDAKLXVuc3BzYzcjOTQuMTMuMjAuMDAuMDAjSHVtYW4gcmlnaHRzIGFkdm9jYWN5IGFuZCBkZWZlbnNlIGFzc29jaWF0aW9ucyM5NC4xMy4wMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wMS4wMCNDaGlsZHJlbiByaWdodHMgZGVmZW5zZSBzZXJ2aWNlcyM5NC4xMy4yMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wMi4wMCNQcmlzb25lcnMgZGVmZW5zZSBzZXJ2aWNlcyM5NC4xMy4yMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wMy4wMCNQaHlzaWNhbCBvciBtZW50YWwgdG9ydHVyZSBkZWZlbnNlIGFzc29jaWF0aW9ucyM5NC4xMy4yMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wNC4wMCNGcmVlZG9tIG9mIHNwZWVjaCBkZWZlbnNlIGFzc29jaWF0aW9ucyM5NC4xMy4yMC4wMC4wMAotdW5zcHNjNyM5NC4xMy4yMC4wNS4wMCNWb3RpbmcgcmlnaHRzIGRlZmVuc2UgYXNzb2NpYXRpb25zIzk0LjEzLjIwLjAwLjAwCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0J1c1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBlOWY5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBwcm9jZXNzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0oZm9ybSkKLSAgewotICAgIGlmIChoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgewotICAgICAgcHJvY2Vzc1Jlc3VsdFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkU2VydmljZUludGVyZmFjZSIsIjwlPVVERElBY3Rpb25JbnB1dHMuTk9ERUlEX1NFUlZJQ0VfSU5URVJGQUNFJT4iLGZvcm0sZmFsc2UpOwotICAgICAgcHJvY2Vzc0xhbmd1YWdlSW5wdXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUlPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTiU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NDYXRlZ29yeVRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQ2F0ZWdvcmllcyIsZm9ybSxmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci08L3NjcmlwdD4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9CdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIHByb2Nlc3NBZHZhbmNlZEZvcm0odGhpcykiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InN1YlF1ZXJ5R2V0Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9CVVNJTkVTUyU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpJT4iPiAgCi0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfSU5JVElBVEVEJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0lPiI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBub3dyYXAgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9idXNpbmVzc19wdWJsaXNoX3NlcnZpY2VfYWR2YW5jZV93c2RsX3VybCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvbGFiZWw+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIG5vd3JhcCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbldTRExCcm93c2VyKCdwdWJsaXNoU2VydmljZUFkdmFuY2VkJyw8JT1BY3Rpb25JbnB1dHMuV1NETF9UWVBFX1NFUlZJQ0UlPikiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0JST1dTRSIpJT48L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49Mz4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X2J1c2luZXNzX3B1Ymxpc2hfc2VydmljZV9hZHZhbmNlX3dzZGxfdXJsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPiIgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgYm9vbGVhbiB0YWJsZUhhc0Vycm9ycyA9ICFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgIFN0cmluZ1tdIHNlcnZpY2VJbnRlcmZhY2VTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfU0VSVklDRV9JTlRFUkZBQ0VTIiwobmV3IEJvb2xlYW4odGFibGVIYXNFcnJvcnMpKS50b1N0cmluZygpLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMpLCJwdWJsaXNoU2VydmljZUFkdmFuY2VkIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2UiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhzZXJ2aWNlSW50ZXJmYWNlU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIik7Ci0gICBTdHJpbmdbXSBuYW1lU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX05BTUVTIiwiRk9STV9MQUJFTF9OQU1FIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTKSl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG5hbWVTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9sYW5ndWFnZUlucHV0X3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWREZXNjcmlwdGlvbnMiKTsKLSAgIFN0cmluZ1tdIGRlc2NTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfREVTQ1JJUFRJT05TIiwiRk9STV9MQUJFTF9ERVNDUklQVElPTiIsU3RyaW5nLnZhbHVlT2YoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoZGVzY1NwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VBZHZhbmNlZENhdGVnb3JpZXMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvY2F0ZWdvcmllc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0J1c1B1Ymxpc2hTZXJ2aWNlRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzY2U3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLlNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC5MaXN0RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAvLyBzZWxlY3RlZE5vZGUgbXVzdCBiZSBhIGJ1c2luZXNzIG5vZGUuCi0gICBOb2RlIGJ1c05vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKGJ1c05vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotJT4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgIHN1YlF1ZXJ5S2V5UHJvcGVydHkuc2V0U3ViUXVlcnlLZXkoc3ViUXVlcnlLZXkpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08JQotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSAgIC8vIGJ1c2luZXNzIHBhcmVudCBub2RlIG1heSBiZSBlaXRoZXIgdGhlIHB1Ymxpc2hlZCBpdGVtcyBmb2xkZXIgb3IgYSBxdWVyeSBub2RlLgotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgTm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShidXNOb2RlKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfQlVTSU5FU1NfUFVCTElTSF9TRVJWSUNFIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgc2VjdGlvbklkcyA9IFsicHVibGlzaFNlcnZpY2VTaW1wbGUiLCJwdWJsaXNoU2VydmljZUFkdmFuY2VkIl07Ci0gIHZhciBzdHlsZUZvcm0gPSAicHVibGlzaFNlcnZpY2VTdHlsZSI7Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzQWR2YW5jZWRGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NSZXN1bHRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2UiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFX0lOVEVSRkFDRSU+Iixmb3JtLGZhbHNlKTsKLSAgICAgIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0xhbmd1YWdlSW5wdXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT05fTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04lPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzQ2F0ZWdvcnlUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZENhdGVnb3JpZXMiLGZvcm0sZmFsc2UpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgZnVuY3Rpb24gc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMoZm9ybSkKLSAgewotPCUKLSAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0lPgotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwdWJsaXNoVVJMKSU+IjsKLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJJZCklPiI7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHBhc3N3b3JkKSU+IjsKLSAgfQotICAKLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci08JQotICAgU3RyaW5nIHB1Ymxpc2hTZXJ2aWNlU3R5bGVJbmRleCA9IChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTKTsKLSU+Ci0gICAgZG9jdW1lbnQuZm9ybXNbc3R5bGVGb3JtXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTJT5bPCU9cHVibGlzaFNlcnZpY2VTdHlsZUluZGV4JT5dLmNoZWNrZWQgPSB0cnVlOwotICAgIAotICAgIHZhciBwdWJsaXNoU2VydmljZVNpbXBsZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT5dKTsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtID0gcHVibGlzaFNlcnZpY2VTaW1wbGVTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhwdWJsaXNoU2VydmljZVNpbXBsZUZvcm0pOwotICAgIHB1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfV1NETF9VUkwpKSU+IjsKLSAgICBwdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUpKSU+IjsKLSAgICBwdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9ERVNDUklQVElPTiU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9ERVNDUklQVElPTikpJT4iOwotICAgIAotICAgIC8vIEFkdmFuY2VkIGZvcm0gZGV0YWlscy4KLSAgICB2YXIgcHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQlPl0pOwotICAgIHZhciBwdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybSA9IHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhwdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybSk7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lc1RhYmxlID0gZ2V0VGFibGUoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lcyIpOwotICAgIHZhciBwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zVGFibGUgPSBnZXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotICAgIHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKSklPiI7Ci08JQotICAgVmVjdG9yIHNlcnZpY2VJbnRlcmZhY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgVmVjdG9yIHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFkpOwotICAgaWYgKHNlcnZpY2VJbnRlcmZhY2VzICE9IG51bGwpCi0gICB7Ci0gICAgIGlmIChzZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPT0gbnVsbCkKLSAgICAgICBzZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGVsc2UKLSAgICAgICBzZXJ2aWNlSW50ZXJmYWNlc0NvcHkucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZUludGVyZmFjZXMuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VJbnRlcmZhY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTLGZhbHNlKTsKLSAgICAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbClsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBzZXJ2aWNlSW50ZXJmYWNlc0NvcHkuYWRkRWxlbWVudChzZXJ2aWNlSW50ZXJmYWNlcy5lbGVtZW50QXQoaSkpOwotJT4KLSAgICBhZGRSZXN1bHRSb3coInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlIiw8JT10YXJnZXROb2RlSWQlPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodE1vZGVsLmdldE5hbWVTdHJpbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh0TW9kZWwuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFksc2VydmljZUludGVyZmFjZXNDb3B5KTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgc2VydmljZUludGVyZmFjZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTLHNlcnZpY2VJbnRlcmZhY2VzKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFksc2VydmljZUludGVyZmFjZXNDb3B5KTsKLSAgIH0KLSU+Ci08JQotICAgVmVjdG9yIHNlcnZpY2VOYW1lVmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyk7Ci0gICBpZiAoc2VydmljZU5hbWVWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZU5hbWVWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKXNlcnZpY2VOYW1lVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkTGFuZ3VhZ2VJbnB1dFJvdygicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFIikpJT4iKTsKLSAgICBzZXRMYW5ndWFnZUlucHV0Um93U2V0dGluZ3MoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRMYW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKCFmb3JtVG9vbFBJLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMsaSkpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3cocHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50cm93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBWZWN0b3Igc2VydmljZURlc2NyaXB0aW9uVmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpOwotICAgaWYgKHNlcnZpY2VEZXNjcmlwdGlvblZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlRGVzY3JpcHRpb25WZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKXNlcnZpY2VEZXNjcmlwdGlvblZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZExhbmd1YWdlSW5wdXRSb3coInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWREZXNjcmlwdGlvbnMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFIikpJT4iKTsKLSAgICBzZXRMYW5ndWFnZUlucHV0Um93U2V0dGluZ3MoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWREZXNjcmlwdGlvbnMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uLmdldExhbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbi5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKCFmb3JtVG9vbFBJLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TLGkpKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWREZXNjcmlwdGlvbnNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRyb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIENhdGVnb3J5QmFnIHNlcnZpY2VDYXRCYWcgPSAoQ2F0ZWdvcnlCYWcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0gICBpZiAoc2VydmljZUNhdEJhZyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBzZXJ2aWNlQ2F0QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGtleWVkUmVmZXJlbmNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlrZXllZFJlZmVyZW5jZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZENhdGVnb3J5Um93KCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQ2F0ZWdvcmllcyIpOwotICAgIHNldENhdGVnb3J5Um93U2V0dGluZ3MoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRDYXRlZ29yaWVzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotICAgCi0gICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgewotJT4KLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHVibGlzaFNlcnZpY2VTaW1wbGVBdXRoZW50aWNhdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHVibGlzaFNlcnZpY2VBZHZhbmNlZEF1dGhlbnRpY2F0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotPCUKLSAgIH0KLSU+Ci0gICAgc2hvd1B1Ymxpc2hGb3JtKDwlPXB1Ymxpc2hTZXJ2aWNlU3R5bGVJbmRleCU+KTsgICAgCi0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNob3dQdWJsaXNoRm9ybShzdHlsZSkKLSAgewotICAgIGNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpOwotICAgIGZvciAodmFyIGk9MDtpPHNlY3Rpb25JZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAoaSA9PSBzdHlsZSkKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VjdGlvbklkc1tpXSkuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgZWxzZQotICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWN0aW9uSWRzW2ldKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgIH0KLSAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICBpZiAobG9hZFNjcmVlblRhYmxlLnJvd3MubGVuZ3RoID4gMCkKLSAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7ICAgIAotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiIgb25VbmxvYWQ9ImNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPGRpdiBpZD0ibWFpblNjcmVlbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotPCUKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ1ZGRpL2ltYWdlcy9wdWJsaXNoX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgIFN0cmluZyB0aXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfUFVCTElTSF9TRVJWSUNFIik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgICAgPGZvcm0gbmFtZT0icHVibGlzaFNlcnZpY2VTdHlsZSIgc3R5bGU9Im1hcmdpbi10b3A6MDsiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUFVCTElTSF9GT1JNIiklPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPiAgICAgICAgCi0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19idXNpbmVzc19wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMlPiIgb25DbGljaz0ic2hvd1B1Ymxpc2hGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT4pIj48bGFiZWwgZm9yPSJyYWRpb19idXNpbmVzc19wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19TSU1QTEUiKSU+PC9sYWJlbD4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2UiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyU+IiBvbkNsaWNrPSJzaG93UHVibGlzaEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2UiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX0FEVkFOQ0VEIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Zvcm0+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9CdXNQdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC9kaXY+Ci0gIDwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci08L3NjcmlwdD4gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0J1c1B1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhNGQ5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hTZXJ2aWNlU2ltcGxlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvQnVzUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gaGFuZGxlU3VibWl0KHRoaXMpIj4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9CVVNJTkVTUyU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX0lOSVRJQVRFRCU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9RVUVSWV9JVEVNJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JVU0lORVNTX1BVQkxJU0hfU0VSVklDRV9TSU1QTEVfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlU2ltcGxlQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBub3dyYXAgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9idXNpbmVzc19wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlX3dzZGxfdXJsIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9VUkwiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfV1NETF9VUkwpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIG5vd3JhcCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbldTRExCcm93c2VyKCdwdWJsaXNoU2VydmljZVNpbXBsZScsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFJT4pIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19CUk9XU0UiKSU+PC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9idXNpbmVzc19wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlX3dzZGxfdXJsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPiIgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X2J1c2luZXNzX3B1Ymxpc2hfc2VydmljZV9zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZV9uYW1lIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X2J1c2luZXNzX3B1Ymxpc2hfc2VydmljZV9zaW1wbGVfZGVzYyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfYnVzaW5lc3NfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZV9kZXNjIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9CdXNpbmVzc0RldGFpbHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9CdXNpbmVzc0RldGFpbHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzliYjMxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvQnVzaW5lc3NEZXRhaWxzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoY3VycmVudFRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShzZWxlY3RlZE5vZGUpOwotICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9CVVNJTkVTU19ERVRBSUxTIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvZGV0YWlsc3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci0gICAgdmFyIGJ1c2luZXNzRGV0YWlsc0Rpc2NvdmVyeVVSTHNUYWJsZSA9IGdldFRhYmxlKCJidXNpbmVzc0RldGFpbHNEaXNjb3ZlcnlVUkxzIik7Ci0gICAgdmFyIGJ1c2luZXNzRGV0YWlsc05hbWVzVGFibGUgPSBnZXRUYWJsZSgiYnVzaW5lc3NEZXRhaWxzTmFtZXMiKTsKLSAgICB2YXIgYnVzaW5lc3NEZXRhaWxzRGVzY3JpcHRpb25zVGFibGUgPSBnZXRUYWJsZSgiYnVzaW5lc3NEZXRhaWxzRGVzY3JpcHRpb25zIik7Ci0gICAgdmFyIGJ1c2luZXNzRGV0YWlsc0lkZW50aWZpZXJzVGFibGUgPSBnZXRUYWJsZSgiYnVzaW5lc3NEZXRhaWxzSWRlbnRpZmllcnMiKTsKLTwlCi0gICBWZWN0b3IgZGlzY292ZXJ5VVJMVmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMpOwotICAgaWYgKGRpc2NvdmVyeVVSTFZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxkaXNjb3ZlcnlVUkxWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWRpc2NvdmVyeVVSTFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgRGlzY292ZXJ5VVJMIGRpc2NvdmVyeVVSTCA9IChEaXNjb3ZlcnlVUkwpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgYm9vbGVhbiBpc0Vycm9yID0gIWZvcm1Ub29sLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMsaSk7Ci0gICAgICAgYm9vbGVhbiBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvdygiYnVzaW5lc3NEZXRhaWxzRGlzY292ZXJ5VVJMcyIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNEaXNjb3ZlcnlVUkxSb3coImJ1c2luZXNzRGV0YWlsc0Rpc2NvdmVyeVVSTHMiLDwlPWklPiw8JT1saXN0RWxlbWVudC5nZXRWaWV3SWQoKSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGlzY292ZXJ5VVJMLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoaXNFcnJvcikKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhidXNpbmVzc0RldGFpbHNEaXNjb3ZlcnlVUkxzVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50Um93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBWZWN0b3IgbmFtZUluZGV4VmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgIGlmIChuYW1lSW5kZXhWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8bmFtZUluZGV4VmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudCluYW1lSW5kZXhWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGJvb2xlYW4gaXNFcnJvciA9ICFmb3JtVG9vbC5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19OQU1FUyxpKTsKLSAgICAgICBib29sZWFuIGlzTmV3SXRlbSA9IChsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotJT4KLSAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygiYnVzaW5lc3NEZXRhaWxzTmFtZXMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiKSklPiIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNMYW5ndWFnZUlucHV0Um93KCJidXNpbmVzc0RldGFpbHNOYW1lcyIsPCU9aSU+LDwlPWxpc3RFbGVtZW50LmdldFZpZXdJZCgpJT4sIjwlPW5hbWUuZ2V0TGFuZygpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKGlzRXJyb3IpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3coYnVzaW5lc3NEZXRhaWxzTmFtZXNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRSb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIFZlY3RvciBkZXNjcmlwdGlvbkluZGV4VmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyk7Ci0gICBpZiAoZGVzY3JpcHRpb25JbmRleFZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxkZXNjcmlwdGlvbkluZGV4VmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClkZXNjcmlwdGlvbkluZGV4VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBib29sZWFuIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfREVTQ1JJUFRJT05TLGkpOwotICAgICAgIGJvb2xlYW4gaXNOZXdJdGVtID0gKGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0lPgotICAgIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93KCJidXNpbmVzc0RldGFpbHNEZXNjcmlwdGlvbnMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFIikpJT4iLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygiYnVzaW5lc3NEZXRhaWxzRGVzY3JpcHRpb25zIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9ZGVzY3JpcHRpb24uZ2V0TGFuZygpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24uZ2V0VGV4dCgpKSU+Iik7Ci08JQotICAgICAgIGlmIChpc0Vycm9yKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KGJ1c2luZXNzRGV0YWlsc0Rlc2NyaXB0aW9uc1RhYmxlLnJvd3NbPCU9aSU+K251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgVmVjdG9yIGlkVmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLSAgIGlmIChpZFZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxpZFZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpaWRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGJvb2xlYW4gaXNFcnJvciA9ICFmb3JtVG9vbC5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19JREVOVElGSUVSUyxpKTsKLSAgICAgICBib29sZWFuIGlzTmV3SXRlbSA9IChsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotJT4KLSAgICBhZGREZXRhaWxzSWRlbnRpZmllclJvdygiYnVzaW5lc3NEZXRhaWxzSWRlbnRpZmllcnMiLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzSWRlbnRpZmllclJvdygiYnVzaW5lc3NEZXRhaWxzSWRlbnRpZmllcnMiLDwlPWklPiw8JT1saXN0RWxlbWVudC5nZXRWaWV3SWQoKSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0VE1vZGVsS2V5KCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5TmFtZSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleVZhbHVlKCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKGlzRXJyb3IpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3coYnVzaW5lc3NEZXRhaWxzSWRlbnRpZmllcnNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRSb3ciKTsKLTwlICAgICAgIAotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBWZWN0b3IgY2F0VmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMpOwotICAgaWYgKGNhdFZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxjYXRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWNhdFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgYm9vbGVhbiBpc0Vycm9yID0gIWZvcm1Ub29sLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0NBVEVHT1JJRVMsaSk7Ci0gICAgICAgYm9vbGVhbiBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93KCJidXNpbmVzc0RldGFpbHNDYXRlZ29yaWVzIiw8JT1pc0Vycm9yfHxpc05ld0l0ZW0lPik7Ci0gICAgc2V0RGV0YWlsc0NhdGVnb3J5Um93KCJidXNpbmVzc0RldGFpbHNDYXRlZ29yaWVzIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICAgIGlmIChpc0Vycm9yKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KGJ1c2luZXNzRGV0YWlsc0NhdGVnb3JpZXNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRSb3ciKTsKLTwlCi0gICAgICAgfSAgICAgICAKLSAgICAgfQotICAgfQotCi0gICAvLyBBdXRoZW50aWNhdGlvbi4KLSAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocHVibGlzaFVSTCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodXNlcklkKSU+IjsKLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHBhc3N3b3JkKSU+IjsKLSAgICBpZiAoPCU9IXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpJT4pCi0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnVzaW5lc3NEZXRhaWxzQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0KLSAgICBzaG93TWFpbkZvcm0oKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dNYWluRm9ybSgpCi0gIHsKLSAgICBjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKTsKLSAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICBpZiAobG9hZFNjcmVlblRhYmxlLnJvd3MubGVuZ3RoID4gMCkKLSAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzRGV0YWlsc0Rpc2NvdmVyeVVSTFRhYmxlKCJidXNpbmVzc0RldGFpbHNEaXNjb3ZlcnlVUkxzIiwiPCU9VURESUFjdGlvbklucHV0cy5ESVNDT1ZFUllVUkxfTU9ESUZJRUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuRElTQ09WRVJZVVJMX1ZJRVdJRCU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ESVNDT1ZFUllVUkwlPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzRGV0YWlsc0xhbmd1YWdlSW5wdXRUYWJsZSgiYnVzaW5lc3NEZXRhaWxzTmFtZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5BTUVfTU9ESUZJRUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuTkFNRV9WSUVXSUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0RldGFpbHNMYW5ndWFnZUlucHV0VGFibGUoImJ1c2luZXNzRGV0YWlsc0Rlc2NyaXB0aW9ucyIsIjwlPVVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fTU9ESUZJRUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuREVTQ1JJUFRJT05fVklFV0lEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0RldGFpbHNJZGVudGlmaWVyVGFibGUoImJ1c2luZXNzRGV0YWlsc0lkZW50aWZpZXJzIixmb3JtKTsKLSAgICAgIHByb2Nlc3NEZXRhaWxzQ2F0ZWdvcnlUYWJsZSgiYnVzaW5lc3NEZXRhaWxzQ2F0ZWdvcmllcyIsZm9ybSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvVXBkYXRlQnVzaW5lc3NBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPgotICAgICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8ZGl2IGlkPSJtYWluU2NyZWVuIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0JVU0lORVNTX0RFVEFJTFMiKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVklPiIgdmFsdWU9IjwlPWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9CVVNJTkVTU19LRVkpJT4iPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVRBSUxTX0VESVRBQkxFIixzZWxlY3RlZE5vZGUuZ2V0Tm9kZU5hbWUoKSklPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JVU0lORVNTX0tFWSIpJT4KLSAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICA8JT1mb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJidXNpbmVzc0RldGFpbHNOYW1lcyIpOwotICAgU3RyaW5nW10gbmFtZVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9OQU1FUyIsIkZPUk1fTEFCRUxfTkFNRSIsU3RyaW5nLnZhbHVlT2YoIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKSl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG5hbWVTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzTGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJidXNpbmVzc0RldGFpbHNEZXNjcmlwdGlvbnMiKTsKLSAgIFN0cmluZ1tdIGRlc2NTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfREVTQ1JJUFRJT05TIiwiRk9STV9MQUJFTF9ERVNDUklQVElPTiIsU3RyaW5nLnZhbHVlT2YoIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUykpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhkZXNjU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiYnVzaW5lc3NEZXRhaWxzSWRlbnRpZmllcnMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0lkZW50aWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImJ1c2luZXNzRGV0YWlsc0NhdGVnb3JpZXMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiYnVzaW5lc3NEZXRhaWxzRGlzY292ZXJ5VVJMcyIpOwotICAgQm9vbGVhbiBkaXNjb3ZlcnlVUkxTcGVjaWZpY0luZm8gPSBuZXcgQm9vbGVhbighZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUykpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKGRpc2NvdmVyeVVSTFNwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2RldGFpbHNEaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImJ1c2luZXNzRGV0YWlsc0F1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Zvcm0+Ci0gIDwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci0gIHJlc3VtZVByb3h5TG9hZFBhZ2UoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0dldEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0dldEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGZiYmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9HZXRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS5idXNpbmVzcy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLnNlcnZpY2UuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlUcmFuc2ZlclRhcmdldEhvbGRlciIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXkpOwotICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIFN0cmluZyBwYXJlbnRRdWVyeUtleTsKLSAgIGludCBsYXN0U2VwYXJhdG9yUG9zID0gc3ViUXVlcnlLZXkubGFzdEluZGV4T2YoJzonKTsKLSAgIGlmIChsYXN0U2VwYXJhdG9yUG9zID09IC0xKQotICAgICBwYXJlbnRRdWVyeUtleSA9ICIiOwotICAgZWxzZQotICAgICBwYXJlbnRRdWVyeUtleSA9IHN1YlF1ZXJ5S2V5LnN1YnN0cmluZygwLGxhc3RTZXBhcmF0b3JQb3MpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHBhcmVudEZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMocGFyZW50UXVlcnlLZXkpOwotICAgT2JqZWN0IHF1ZXJ5SXRlbVByb3BlcnR5ID0gcGFyZW50Rm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0pOwotICAgT2JqZWN0IHF1ZXJ5U3R5bGVCdXMgPSBwYXJlbnRGb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyk7Ci0gICBPYmplY3QgcXVlcnlTdHlsZVNlciA9IHBhcmVudEZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyk7Ci0gICBPYmplY3QgcXVlcnlTdHlsZVNlckludCA9IHBhcmVudEZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgSGFzaHRhYmxlIHBhcmVudFF1ZXJ5RGF0YSA9IG5ldyBIYXNodGFibGUoKTsKLSAgIGlmIChxdWVyeUl0ZW1Qcm9wZXJ0eSAhPSBudWxsKQotICAgICBwYXJlbnRRdWVyeURhdGEucHV0KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSwgcXVlcnlJdGVtUHJvcGVydHkpOwotICAgaWYgKHF1ZXJ5U3R5bGVCdXMgIT0gbnVsbCkKLSAgICAgcGFyZW50UXVlcnlEYXRhLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMsIHF1ZXJ5U3R5bGVCdXMpOwotICAgaWYgKHF1ZXJ5U3R5bGVTZXIgIT0gbnVsbCkKLSAgICAgcGFyZW50UXVlcnlEYXRhLnB1dChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTLCBxdWVyeVN0eWxlU2VyKTsKLSAgIGlmIChxdWVyeVN0eWxlU2VySW50ICE9IG51bGwpCi0gICAgIHBhcmVudFF1ZXJ5RGF0YS5wdXQoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMsIHF1ZXJ5U3R5bGVTZXJJbnQpOwotICAgU3ViUXVlcnlUcmFuc2ZlclRhcmdldCBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0ID0gbmV3IFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQoc2VsZWN0ZWROb2RlLHN1YlF1ZXJ5S2V5LHBhcmVudFF1ZXJ5RGF0YSk7Ci0gICB0cmVlRWxlbWVudC5zZXRQcm9wZXJ0eUFzT2JqZWN0KFVERElNb2RlbENvbnN0YW50cy5TVUJRVUVSWV9UUkFOU0ZFUl9UQVJHRVQsc3ViUXVlcnlUcmFuc2ZlclRhcmdldCk7Ci0gICBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyLmFkZEVsZW1lbnQoc3ViUXVlcnlUcmFuc2ZlclRhcmdldCk7Ci0gICBib29sZWFuIGhhc1RhcmdldCA9IHRydWU7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfR0VUX0ZPUk0iKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvcmVzdWx0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci08JQotICAgaW50IHF1ZXJ5SXRlbSA9IEludGVnZXIucGFyc2VJbnQoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSkpOwotICAgSGFzaHRhYmxlIGFsbFVuaXF1ZU5vZGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgVmVjdG9yIGFsbE5vZGVzID0gbmV3IFZlY3RvcigpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShzZWxlY3RlZE5vZGUpOwotICAgc3dpdGNoIChxdWVyeUl0ZW0pCi0gICB7Ci0gICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVM6Ci0gICAgICAgcmVnTm9kZS5nZXRBbGxCdXNpbmVzc05vZGVzKGFsbE5vZGVzKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgcmVnTm9kZS5nZXRBbGxTZXJ2aWNlTm9kZXMoYWxsTm9kZXMpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgcmVnTm9kZS5nZXRBbGxTZXJ2aWNlSW50ZXJmYWNlTm9kZXMoYWxsTm9kZXMpOwotICAgfQotICAgCi0gICBmb3IgKGludCBpPTA7aTxhbGxOb2Rlcy5zaXplKCk7aSsrKQotICAgewotICAgICBOb2RlIG5vZGUgPSAoTm9kZSlhbGxOb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgIGFsbFVuaXF1ZU5vZGVzLnB1dChub2RlLmdldFRyZWVFbGVtZW50KCkuZ2V0S2V5KCksbm9kZSk7Ci0gICB9Ci0KLSAgIGlmICghYWxsVW5pcXVlTm9kZXMuaXNFbXB0eSgpKQotICAgewotICAgICBPYmplY3RbXSBpdGVtTm9kZXMgPSBhbGxVbmlxdWVOb2Rlcy52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgIFF1aWNrU29ydC5zb3J0KGl0ZW1Ob2RlcywwLGl0ZW1Ob2Rlcy5sZW5ndGgtMSk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGl0ZW1Ob2Rlcy5sZW5ndGg7aSsrKQotICAgICB7Ci0gICAgICAgTm9kZSBpdGVtTm9kZSA9IChOb2RlKWl0ZW1Ob2Rlc1tpXTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKGl0ZW1Ob2RlLmdldE5vZGVJZCgpLGZhbHNlKTsKLSAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICBpZiAoaXRlbU5vZGUgaW5zdGFuY2VvZiBCdXNpbmVzc05vZGUpCi0gICAgICAgewotICAgICAgICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KWl0ZW1Ob2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICBCdXNpbmVzc0VudGl0eSBiZSA9IGJ1c0VsZW1lbnQuZ2V0QnVzaW5lc3NFbnRpdHkoKTsKLSAgICAgICAgIG5hbWUgPSBiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgICAgZGVzY3JpcHRpb24gPSBiZS5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAoaXRlbU5vZGUgaW5zdGFuY2VvZiBTZXJ2aWNlTm9kZSkKLSAgICAgICB7Ci0gICAgICAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudClpdGVtTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gc2VydmljZUVsZW1lbnQuZ2V0QnVzaW5lc3NTZXJ2aWNlKCk7Ci0gICAgICAgICBuYW1lID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICAgIGRlc2NyaXB0aW9uID0gYnMuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgICAgfQotICAgICAgIGVsc2UgaWYgKGl0ZW1Ob2RlIGluc3RhbmNlb2YgU2VydmljZUludGVyZmFjZU5vZGUpCi0gICAgICAgewotICAgICAgICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KWl0ZW1Ob2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICBUTW9kZWwgdE1vZGVsID0gc2lFbGVtZW50LmdldFRNb2RlbCgpOwotICAgICAgICAgbmFtZSA9IHRNb2RlbC5nZXROYW1lU3RyaW5nKCk7Ci0gICAgICAgICBkZXNjcmlwdGlvbiA9IHRNb2RlbC5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSAgICAgICB9Ci0lPgotICAgIGFkZFJlc3VsdFJvdygiR2V0Iiw8JT1pdGVtTm9kZS5nZXROb2RlSWQoKSU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uKSU+Iik7Ci08JQotICAgICB9Ci0lPgotICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgbG9hZFNjcmVlblRhYmxlLmRlbGV0ZVJvdygwKTsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0gICBlbHNlCi0gICB7Ci0lPgotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFRyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uLmdldEFjdGlvbkxpbmtGb3JSZXR1cm4oKSkpJT4iOwotPCUKLSAgIH0KLSU+Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotPGRpdiBpZD0iY29udGVudCI+Ci0gIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8ZGl2IGlkPSJtYWluU2NyZWVuIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci08JQotICAgU3RyaW5nIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9HRVQiKTsKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ1ZGRpL2ltYWdlcy9maW5kX2hpZ2hsaWdodGVkLmdpZiI7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvZm9ybXMvcmVzdWx0c2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDxmb3JtIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgU3RyaW5nIHRhYmxlVGl0bGU7Ci0gICBzd2l0Y2ggKHF1ZXJ5SXRlbSkKLSAgIHsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICB0YWJsZVRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTRVMiKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgdGFibGVUaXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFUyIpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVM6Ci0gICAgIGRlZmF1bHQ6Ci0gICAgICAgdGFibGVUaXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVMiKTsKLSAgIH0KLSAgIFN0cmluZ1tdIG90aGVyUHJvcGVydGllcyA9IHt0YWJsZVRpdGxlLCIifTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJHZXQiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhvdGhlclByb3BlcnRpZXMpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9yZXN1bHRzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgaGVpZ2h0PTQwIGFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fVFJBTlNGRVIiKSU+IiBvbkNsaWNrPSJ0cmFuc2ZlclNlbGVjdGlvbnMoJ0dldCcsdGhpcy5mb3JtKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgaGVpZ2h0PTQwIGFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX1JFRlJFU0giKSU+IiBvbkNsaWNrPSJyZWZyZXNoU2VsZWN0aW9ucygnR2V0Jyx0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9BRERfVE9fRkFWT1JJVEVTIiklPiIgb25DbGljaz0iYWRkU2VsZWN0aW9uc1RvRmF2b3JpdGVzKCdHZXQnLHRoaXMuZm9ybSkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0NMRUFSIiklPiIgb25DbGljaz0iY2xlYXJTZWxlY3Rpb25zKCdHZXQnLHRoaXMuZm9ybSkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L2Zvcm0+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvSXRlbXNTdW1tYXJ5Rm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvSXRlbXNTdW1tYXJ5Rm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDgwMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL0l0ZW1zU3VtbWFyeUZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBpbnQgcXVlcnlJdGVtID0gSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldFBhcmFtZXRlcihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU0pKTsKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbm9kZU1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBUb29sIHNlbGVjdGVkVG9vbCA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShzZWxlY3RlZE5vZGUpOwotICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIFZlY3RvciBzdW1tYXJ5Tm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICBpZiAodHJlZUVsZW1lbnQgaW5zdGFuY2VvZiBRdWVyeVBhcmVudEVsZW1lbnQpCi0gICAgIHJlZ05vZGUuZ2V0RGlzY292ZXJlZE5vZGVzKHN1bW1hcnlOb2RlcyxxdWVyeUl0ZW0pOwotICAgZWxzZSBpZiAodHJlZUVsZW1lbnQgaW5zdGFuY2VvZiBQdWJsaXNoZWRJdGVtc0VsZW1lbnQpCi0gICB7Ci0gICAgIHN3aXRjaCAocXVlcnlJdGVtKQotICAgICB7Ci0gICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgIHJlZ05vZGUuZ2V0UHVibGlzaGVkQnVzaW5lc3NOb2RlcyhzdW1tYXJ5Tm9kZXMpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgICByZWdOb2RlLmdldFB1Ymxpc2hlZFNlcnZpY2VOb2RlcyhzdW1tYXJ5Tm9kZXMpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICByZWdOb2RlLmdldFB1Ymxpc2hlZFNlcnZpY2VJbnRlcmZhY2VOb2RlcyhzdW1tYXJ5Tm9kZXMpOwotICAgICB9Ci0gICB9Ci0gICBib29sZWFuIGhhc1RhcmdldCA9IGZhbHNlOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX0lURU1TX1NVTU1BUlkiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9yZXN1bWVwcm94eWxvYWRwYWdlLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvcmVzdWx0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci08JSAgIAotICAgSGFzaHRhYmxlIGFsbFVuaXF1ZU5vZGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgZm9yIChpbnQgaT0wO2k8c3VtbWFyeU5vZGVzLnNpemUoKTtpKyspCi0gICB7Ci0gICAgIE5vZGUgc3VtbWFyeU5vZGUgPSAoTm9kZSlzdW1tYXJ5Tm9kZXMuZWxlbWVudEF0KGkpOwotICAgICBhbGxVbmlxdWVOb2Rlcy5wdXQoc3VtbWFyeU5vZGUuZ2V0VHJlZUVsZW1lbnQoKS5nZXRLZXkoKSxzdW1tYXJ5Tm9kZSk7Ci0gICB9Ci0gICAKLSAgIGlmICghYWxsVW5pcXVlTm9kZXMuaXNFbXB0eSgpKQotICAgewotICAgICBPYmplY3RbXSBpdGVtTm9kZXMgPSBhbGxVbmlxdWVOb2Rlcy52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgIFF1aWNrU29ydC5zb3J0KGl0ZW1Ob2RlcywwLGl0ZW1Ob2Rlcy5sZW5ndGgtMSk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGl0ZW1Ob2Rlcy5sZW5ndGg7aSsrKQotICAgICB7Ci0gICAgICAgTm9kZSBpdGVtTm9kZSA9IChOb2RlKWl0ZW1Ob2Rlc1tpXTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0TmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKGl0ZW1Ob2RlLmdldE5vZGVJZCgpLGZhbHNlKTsKLSAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICBpZiAoaXRlbU5vZGUgaW5zdGFuY2VvZiBRdWVyeU5vZGUpCi0gICAgICAgewotICAgICAgICAgUXVlcnlFbGVtZW50IHF1ZXJ5RWxlbWVudCA9IChRdWVyeUVsZW1lbnQpaXRlbU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgIG5hbWUgPSBxdWVyeUVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgICAgU3RyaW5nIG51bWJlck9mQ2hpbGROb2Rlc1N0cmluZyA9IFN0cmluZy52YWx1ZU9mKGl0ZW1Ob2RlLmdldENoaWxkTm9kZXMoKS5zaXplKCkpOwotICAgICAgICAgc3dpdGNoIChxdWVyeUVsZW1lbnQuZ2V0UXVlcnlUeXBlKCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVM6Ci0gICAgICAgICAgICAgZGVzY3JpcHRpb24gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fQlVTSU5FU1NFU19GT1VORCIsbnVtYmVyT2ZDaGlsZE5vZGVzU3RyaW5nKTsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVM6Ci0gICAgICAgICAgICAgZGVzY3JpcHRpb24gPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0lORk9fU0VSVklDRVNfRk9VTkQiLG51bWJlck9mQ2hpbGROb2Rlc1N0cmluZyk7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUzoKLSAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfSU5GT19TRVJWSUNFX0lOVEVSRkFDRVNfRk9VTkQiLG51bWJlck9mQ2hpbGROb2Rlc1N0cmluZyk7Ci0gICAgICAgICB9ICAgICAgICAgICAgIAotICAgICAgIH0KLSAgICAgICBlbHNlIGlmIChpdGVtTm9kZSBpbnN0YW5jZW9mIEJ1c2luZXNzTm9kZSkKLSAgICAgICB7Ci0gICAgICAgICBCdXNpbmVzc0VsZW1lbnQgYnVzRWxlbWVudCA9IChCdXNpbmVzc0VsZW1lbnQpaXRlbU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpOwotICAgICAgICAgbmFtZSA9IGJlLmdldERlZmF1bHROYW1lU3RyaW5nKCk7Ci0gICAgICAgICBkZXNjcmlwdGlvbiA9IGJlLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotICAgICAgIH0KLSAgICAgICBlbHNlIGlmIChpdGVtTm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VOb2RlKQotICAgICAgIHsKLSAgICAgICAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KWl0ZW1Ob2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICAgICAgIG5hbWUgPSBicy5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgICAgZGVzY3JpcHRpb24gPSBicy5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZSBpZiAoaXRlbU5vZGUgaW5zdGFuY2VvZiBTZXJ2aWNlSW50ZXJmYWNlTm9kZSkKLSAgICAgICB7Ci0gICAgICAgICBTZXJ2aWNlSW50ZXJmYWNlRWxlbWVudCBzaUVsZW1lbnQgPSAoU2VydmljZUludGVyZmFjZUVsZW1lbnQpaXRlbU5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICAgIFRNb2RlbCB0TW9kZWwgPSBzaUVsZW1lbnQuZ2V0VE1vZGVsKCk7Ci0gICAgICAgICBuYW1lID0gdE1vZGVsLmdldE5hbWVTdHJpbmcoKTsKLSAgICAgICAgIGRlc2NyaXB0aW9uID0gdE1vZGVsLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotICAgICAgIH0KLSU+Ci0gICAgYWRkUmVzdWx0Um93KCJTdW1tYXJ5Iiw8JT1pdGVtTm9kZS5nZXROb2RlSWQoKSU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0lPgotICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgbG9hZFNjcmVlblRhYmxlLmRlbGV0ZVJvdygwKTsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08ZGl2IGlkPSJjb250ZW50Ij4KLSAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLTwlCi0gICBTdHJpbmcgdGl0bGUgPSBzZWxlY3RlZFRvb2wuZ2V0QWx0VGV4dCgpOwotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gc2VsZWN0ZWRUb29sLmdldEhpZ2hsaWdodGVkSW1hZ2VMaW5rKCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvZm9ybXMvcmVzdWx0c2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDxmb3JtIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgU3RyaW5nIHRhYmxlVGl0bGU7Ci0gICBzd2l0Y2ggKHF1ZXJ5SXRlbSkKLSAgIHsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fUVVFUklFUzoKLSAgICAgICB0YWJsZVRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUVVFUklFUyIpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTOgotICAgICAgIHRhYmxlVGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQlVTSU5FU1NFUyIpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICB0YWJsZVRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VTIik7Ci0gICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUzoKLSAgICAgZGVmYXVsdDoKLSAgICAgICB0YWJsZVRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUyIpOwotICAgfQotICAgU3RyaW5nW10gb3RoZXJQcm9wZXJ0aWVzID0ge3RhYmxlVGl0bGUsIiJ9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoIlN1bW1hcnkiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhvdGhlclByb3BlcnRpZXMpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9yZXN1bHRzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgaGVpZ2h0PTQwIGFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX1JFRlJFU0giKSU+IiBvbkNsaWNrPSJyZWZyZXNoU2VsZWN0aW9ucygnU3VtbWFyeScsdGhpcy5mb3JtKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgPC90ZD4KLTwlCi0gICBpZiAocXVlcnlJdGVtICE9IFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9RVUVSSUVTKQotICAgewotJT4gICAgICAgICAgICAgCi0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0FERF9UT19GQVZPUklURVMiKSU+IiBvbkNsaWNrPSJhZGRTZWxlY3Rpb25zVG9GYXZvcml0ZXMoJ1N1bW1hcnknLHRoaXMuZm9ybSkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgIDwvdGQ+Ci08JQotICAgfQotJT4gICAgICAgICAgICAgCi0gICAgICAgICAgPHRkIGhlaWdodD00MCBhbGlnbj0iYm90dG9tIiBub3dyYXA+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0NMRUFSIiklPiIgb25DbGljaz0iY2xlYXJTZWxlY3Rpb25zKCdTdW1tYXJ5Jyx0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9mb3JtPgotICA8L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgc2V0RGVmYXVsdHMoKTsKLSAgcmVzdW1lUHJveHlMb2FkUGFnZSgpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc0Zvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL01hbmFnZVB1Ymxpc2hlckFzc2VydGlvbnNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkYzE3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvTWFuYWdlUHVibGlzaGVyQXNzZXJ0aW9uc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnJlc3BvbnNlLkNvbXBsZXRpb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBTdHJpbmcgcHViQXNzZXJ0aW9uRm9ybSA9ICJzaG93UHVibGlzaGVyQXNzZXJ0aW9uc0Zvcm0iOwotICAgU3RyaW5nIHB1Ymxpc2hlckFzc2VydGlvbnNCdXNpbmVzcyA9ICJwdWJsaXNoZXJBc3NlcnRpb25zQnVzaW5lc3MiOwotCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7ICAgCi0gICBSZWdpc3RyeU5vZGUgcmVnTm9kZSA9IHVkZGlNYWluTm9kZS5nZXRSZWdpc3RyeU5vZGUoc2VsZWN0ZWROb2RlKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLQotICAgU3RyaW5nIGRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlID0gImRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlIjsKLSAgIFN0cmluZyB4ZGl2UHVibGlzaGVyQXNzZXJ0aW9uVGFibGUgPSAieGRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlIjsKLSU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBTdHJpbmcgc3ViUXVlcnlLZXkgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZKTsKLSAgIHN1YlF1ZXJ5S2V5UHJvcGVydHkuc2V0U3ViUXVlcnlLZXkoc3ViUXVlcnlLZXkpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08JQotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUyIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLQotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9yZXN1bWVwcm94eWxvYWRwYWdlLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGl0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3Jlc3VsdHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHNldERlZmF1bHRzKCkKLSAgewotICAgIGNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpOwotPCUKLSAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICB7Ci0gICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHB1Ymxpc2hVUkwpJT4iOwotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJJZCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwYXNzd29yZCklPiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIjwlPXB1YkFzc2VydGlvbkZvcm0lPiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0gICAKLSAgIFZlY3RvciBidXNpbmVzcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OUyk7Ci0gICBMaXN0TWFuYWdlciBidXNpbmVzc0NvcHkgPSAoTGlzdE1hbmFnZXIpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OU19DT1BZKTsKLSAgIGlmIChidXNpbmVzcyAhPSBudWxsKQotICAgewotICAgICBpZiAoYnVzaW5lc3NDb3B5ID09IG51bGwpCi0gICAgICAgYnVzaW5lc3NDb3B5ID0gbmV3IExpc3RNYW5hZ2VyKCk7Ci0gICAgIGVsc2UKLSAgICAgICBidXNpbmVzc0NvcHkuY2xlYXIoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8YnVzaW5lc3Muc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWJ1c2luZXNzLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TLGksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMsZmFsc2UpOwotICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGJ1c2luZXNzQ29weS5hZGQobGlzdEVsZW1lbnQpOwotJT4KLSAgICBhZGRQdWJsaXNoZXJBc3NlcnRpb25SZXN1bHRSb3coIjwlPXB1Ymxpc2hlckFzc2VydGlvbnNCdXNpbmVzcyU+Iiw8JT1saXN0RWxlbWVudC5nZXRWaWV3SWQoKSU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGJlLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpKSU+Iik7Ci08JQotICAgICB9Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRERfUFVCTElTSEVSX0FTU0VSVElPTlNfQ09QWSxidXNpbmVzc0NvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBidXNpbmVzcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgYnVzaW5lc3NDb3B5ID0gbmV3IExpc3RNYW5hZ2VyKCk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRERfUFVCTElTSEVSX0FTU0VSVElPTlMsYnVzaW5lc3MpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TX0NPUFksYnVzaW5lc3NDb3B5KTsKLSAgIH0KLSU+Ci0gIH0KLQotICBmdW5jdGlvbiBwb3B1bGF0ZUFzc2VydGlvblRhYmxlKCkgewotPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgQnVzaW5lc3NFbGVtZW50KQotICAgIHsKLSAgICAgIExpc3RNYW5hZ2VyIHB1YkFzc2VydGlvbnMgPSAoKEJ1c2luZXNzRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldFB1Ymxpc2hlckFzc2VydGlvbnMoKTsKLSAgICAgIGlmIChwdWJBc3NlcnRpb25zID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFNob3dQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uIGFjdGlvbiA9IG5ldyBTaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbihjb250cm9sbGVyKTsKLSAgICAgICAgYWN0aW9uLnJ1bigpOwotJT4KLSAgICAgICAgc3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPCUKLSAgICAgICAgcHViQXNzZXJ0aW9ucyA9ICgoQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0UHVibGlzaGVyQXNzZXJ0aW9ucygpOwotICAgICAgfQotCi0gICAgICBwdWJBc3NlcnRpb25zID0gKChCdXNpbmVzc0VsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRQdWJsaXNoZXJBc3NlcnRpb25zKCk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gKChwdWJBc3NlcnRpb25zICE9IG51bGwpID8gcHViQXNzZXJ0aW9ucy5nZXRMaXN0RWxlbWVudHMoKSA6IG51bGwpOwotICAgICAgd2hpbGUgKGUgIT0gbnVsbCAmJiBlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBMaXN0RWxlbWVudCBsZSA9IChMaXN0RWxlbWVudCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIFB1Ymxpc2hlckFzc2VydGlvbkVsZW1lbnQgcHViQXNzZXJ0aW9uRWxlbWVudCA9IChQdWJsaXNoZXJBc3NlcnRpb25FbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgICAgICBpbnQgdmlld0lkID0gbGUuZ2V0Vmlld0lkKCk7Ci0gICAgICAgIFN0cmluZyBkaXJlY3Rpb247Ci0gICAgICAgIGlmICgoKEJ1c2luZXNzRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0QnVzaW5lc3NLZXkoKS5lcXVhbHMocHViQXNzZXJ0aW9uRWxlbWVudC5nZXRGcm9tS2V5KCkpKQotICAgICAgICAgIGRpcmVjdGlvbiA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX0ZST00iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGRpcmVjdGlvbiA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9BU1NFUlRJT05fRElSRUNUSU9OX1RPIik7Ci0gICAgICAgIExpc3RFbGVtZW50IHNwID0gKExpc3RFbGVtZW50KXB1YkFzc2VydGlvbkVsZW1lbnQuZ2V0U2VydmljZVByb3ZpZGVyKCk7Ci0gICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBzcC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICAgaW50IHRhcmdldFRvb2xJZCA9IHNwLmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgICBpbnQgdGFyZ2V0Vmlld0lkID0gc3AuZ2V0VGFyZ2V0Vmlld0lkKCk7Ci0gICAgICAgIGludCBzdWJRdWVyeUl0ZW1JZCA9IHB1YkFzc2VydGlvbkVsZW1lbnQuZ2V0U3ViUXVlcnlJdGVtSWQoKTsKLSAgICAgICAgU3RyaW5nIHVybCA9IFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHRhcmdldE5vZGVJZCx0YXJnZXRUb29sSWQsdGFyZ2V0Vmlld0lkLHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0VYSVNUSU5HX1BVQkxJU0hFUl9BU1NFUlRJT05TLHN1YlF1ZXJ5SXRlbUlkLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTLGZhbHNlKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAoKEJ1c2luZXNzRW50aXR5KXNwLmdldE9iamVjdCgpKS5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgICBTdHJpbmcgZGVzYyA9ICgoQnVzaW5lc3NFbnRpdHkpc3AuZ2V0T2JqZWN0KCkpLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotICAgICAgICBTdHJpbmcgc3RhdHVzID0gcHViQXNzZXJ0aW9uRWxlbWVudC5nZXRTdGF0dXMoKTsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBwdWJBc3NlcnRpb25FbGVtZW50LmdldEtleWVkUmVmKCkuZ2V0S2V5VmFsdWUoKTsKLSU+Ci0gICAgICBhZGRBc3NlcnRpb24oIjwlPWRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlJT4iLDwlPXZpZXdJZCU+LCI8JT1kaXJlY3Rpb24lPiIsIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzYyklPiIsIjwlPXN0YXR1cyU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHR5cGUpJT4iKTsKLTwlCi0gICAgICB9Ci0gICAgfQotJT4KLSAgfQotCi0gIGZ1bmN0aW9uIGFkZEFzc2VydGlvbih0YWJsZUNvbnRhaW5lcklkLHZpZXdJZCxkaXJlY3Rpb24sdXJsLG5hbWUsZGVzYyxzdGF0dXMsdHlwZSkKLSAgewotICAgIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW41ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uNiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIHJvd0NoZWNrYm94Lm5hbWUgPSAiPCU9VURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19WSUVXSUQlPiI7Ci0gICAgcm93Q2hlY2tib3gudmFsdWUgPSB2aWV3SWQ7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9USElTX0JVU0lORVNTIiklPiIpKTsKLQotICAgIGNvbHVtbjIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGlyZWN0aW9uKSk7Ci0KLSAgICB2YXIgbmFtZURldGFpbHNMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIG5hbWVEZXRhaWxzTGluay5ocmVmID0gdXJsOwotICAgIG5hbWVEZXRhaWxzTGluay50YXJnZXQgPSAiPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IjsKLSAgICBuYW1lRGV0YWlsc0xpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSkpOwotICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQobmFtZURldGFpbHNMaW5rKTsKLQotICAgIGNvbHVtbjQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZ2V0RGVmYXVsdERpc3BsYXlTdHJpbmcoZGVzYykpKTsKLQotICAgIGNvbHVtbjUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3RhdHVzKSk7Ci0KLSAgICBjb2x1bW42LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHR5cGUpKTsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjMuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjQuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjUuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjYuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4zKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uNCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjUpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW42KTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLQotICB9Ci0KLSAgZnVuY3Rpb24gYWRkUHVibGlzaGVyQXNzZXJ0aW9uUmVzdWx0Um93KHRhYmxlQ29udGFpbmVySWQsbm9kZUlkLHVybCxuYW1lLGRlc2NyaXB0aW9uKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsbm9kZUlkKSk7Ci0KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9USElTX0JVU0lORVNTIiklPiIpKTsKLQotICAgIHZhciBkaXJlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICBkaXJlY3Rpb24uaWQgPSAibGFiZWxfcHVibGlzaGVyX2Fzc2VydGlvbl9kaXJlY3Rpb24iOwotICAgIGRpcmVjdGlvbi5uYW1lID0gIjwlPVVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfRElSRUNUSU9OJT4iOwotICAgIGRpcmVjdGlvbi5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCI7Ci0gICAgZGlyZWN0aW9uLm9wdGlvbnNbMF0gPSBuZXcgT3B0aW9uKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9GUk9NIiklPiIsICI8JT1TdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLkRJUkVDVElPTl9GUk9NKSU+Iik7Ci0gICAgZGlyZWN0aW9uLm9wdGlvbnNbMV0gPSBuZXcgT3B0aW9uKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQVNTRVJUSU9OX0RJUkVDVElPTl9UTyIpJT4iLCAiPCU9U3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5ESVJFQ1RJT05fVE8pJT4iKTsKLSAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGRpcmVjdGlvbik7Ci0KLSAgICB2YXIgbmFtZURldGFpbHNMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIG5hbWVEZXRhaWxzTGluay5ocmVmID0gdXJsOwotICAgIG5hbWVEZXRhaWxzTGluay50YXJnZXQgPSAiPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IjsKLSAgICBuYW1lRGV0YWlsc0xpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSkpOwotICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQobmFtZURldGFpbHNMaW5rKTsKLQotICAgIGNvbHVtbjQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZ2V0RGVmYXVsdERpc3BsYXlTdHJpbmcoZGVzY3JpcHRpb24pKSk7Ci0KLSAgICB2YXIgYXNzZXJ0aW9uVHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIGFzc2VydGlvblR5cGUuaWQgPSAibGFiZWxfcHVibGlzaGVyX2Fzc2VydGlvbl90eXBlIjsKLSAgICBhc3NlcnRpb25UeXBlLm5hbWUgPSAiPCU9VURESUFjdGlvbklucHV0cy5QVUJMSVNIRVJfQVNTRVJUSU9OU19UWVBFJT4iOwotICAgIGFzc2VydGlvblR5cGUuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgIGFzc2VydGlvblR5cGUub3B0aW9uc1swXSA9IG5ldyBPcHRpb24oIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9BU1NFUlRJT05fVFlQRV9QQVJFTlRfQ0hJTEQiKSU+IiwgIjwlPVN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfVFlQRV9QQVJFTlRfQ0hJTEQpJT4iKTsKLSAgICBhc3NlcnRpb25UeXBlLm9wdGlvbnNbMV0gPSBuZXcgT3B0aW9uKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQVNTRVJUSU9OX1RZUEVfUEVFUl9UT19QRUVSIiklPiIsICI8JT1TdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1RZUEVfUEVFUl9UT19QRUVSKSU+Iik7Ci0gICAgYXNzZXJ0aW9uVHlwZS5vcHRpb25zWzJdID0gbmV3IE9wdGlvbigiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0FTU0VSVElPTl9UWVBFX0lERU5USVRZIiklPiIsICI8JT1TdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlBVQkxJU0hFUl9BU1NFUlRJT05TX1RZUEVfSURFTlRJVFkpJT4iKTsKLSAgICBjb2x1bW41LmFwcGVuZENoaWxkKGFzc2VydGlvblR5cGUpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMy5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uNC5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uNS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMik7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjMpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW40KTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uNSk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoZm9ybSxsb2NhdGlvbikKLSAgewotICAgIGZvcm0uYWN0aW9uID0gbG9jYXRpb247Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoIjwlPXB1Ymxpc2hlckFzc2VydGlvbnNCdXNpbmVzcyU+IiwgIjwlPVVERElBY3Rpb25JbnB1dHMuUFVCTElTSEVSX0FTU0VSVElPTlNfU0VMRUNURURfQlVTX0lEJT4iLCBmb3JtLCBmYWxzZSk7Ci0gICAgICBmb3JtLnN1Ym1pdCgpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIGNoZWNrVGFibGVFbnRyaWVzQW5kU3VibWl0KHRhYmxlQ29udGFpbmVySWQsZm9ybSxsb2NhdGlvbikKLSAgewotICAgIGlmIChnZXROdW1iZXJPZlNlbGVjdGlvbnModGFibGVDb250YWluZXJJZCkgPiAwKSB7Ci0gICAgICBzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoZm9ybSxsb2NhdGlvbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGFsZXJ0KCI8JT1jb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPiIpOwotICB9Ci0KLSAgZnVuY3Rpb24gY2hlY2tUYWJsZVNpemVBbmRTdWJtaXQodGFibGVDb250YWluZXJJZCxmb3JtLGxvY2F0aW9uKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgaWYgKHRhYmxlLnJvd3MubGVuZ3RoID4gbnVtYmVyT2ZIZWFkZXJSb3dzKSB7Ci0gICAgICBzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoZm9ybSxsb2NhdGlvbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGFsZXJ0KCI8JT1jb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPiIpOwotICB9Ci0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIiBvblVubG9hZD0iY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCkiPgotICA8ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8ZGl2IGlkPSJwdWJsaXNoZXJBc3NlcnRpb25zIj4KLSAgICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvU2hvd1B1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfSU5JVElBVEVEJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9RVUVSWV9JVEVNJT4iPgotCi08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gInVkZGkvaW1hZ2VzL3B1Ymxpc2hlcl9hc3NlcnRpb25zX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OUyIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01BTkFHRV9QVUJMSVNIRVJfQVNTRVJUSU9OU19ERVNDIiklPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2UHVibGlzaGVyQXNzZXJ0aW9uVGFibGUlPicsJzwlPXhkaXZQdWJsaXNoZXJBc3NlcnRpb25UYWJsZSU+JykiPjxpbWcgbmFtZT0iPCU9eGRpdlB1Ymxpc2hlckFzc2VydGlvblRhYmxlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX0FTU0VSVElPTlMiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8ZGl2IGlkPSI8JT1kaXZQdWJsaXNoZXJBc3NlcnRpb25UYWJsZSU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gICAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9ZGl2UHVibGlzaGVyQXNzZXJ0aW9uVGFibGUlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPSgoQnVzaW5lc3NFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QnVzaW5lc3NFbnRpdHkoKS5nZXREZWZhdWx0TmFtZVN0cmluZygpJT48L3RoPgotICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48bGFiZWwgZm9yPSJsYWJlbF9wdWJsaXNoZXJfYXNzZXJ0aW9uX2RpcmVjdGlvbiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRElSRUNUSU9OIiklPjwvbGFiZWw+PC90aD4KLSAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQlVTSU5FU1MiKSU+PC90aD4KLSAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKSU+PC90aD4KLSAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU1RBVFVTIiklPjwvdGg+Ci0gICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjxsYWJlbCBmb3I9ImxhYmVsX3B1Ymxpc2hlcl9hc3NlcnRpb25fdHlwZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQVNTRVJUSU9OX1RZUEUiKSU+PC9sYWJlbD48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICAgIDx0YWJsZSB3aWR0aD0iOTAlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5DT01QTEVURV9BU1NFUlRJT05TX1ZJU0lCSUxJVFlfREVTQyIpJT4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0KLTwlCi0gICBib29sZWFuIHRhYmxlSGFzRXJyb3JzID0gIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQUREX1BVQkxJU0hFUl9BU1NFUlRJT05TKTsKLSAgIFN0cmluZ1tdIGJ1c1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9CVVNJTkVTU0VTIiwobmV3IEJvb2xlYW4odGFibGVIYXNFcnJvcnMpKS50b1N0cmluZygpLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSwicHVibGlzaGVyQXNzZXJ0aW9ucyIsVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRERfUFVCTElTSEVSX0FTU0VSVElPTlN9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKHB1Ymxpc2hlckFzc2VydGlvbnNCdXNpbmVzcyk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoYnVzU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNQdWJsaXNoZXJBc3NlcnRpb25zX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZChwdWJBc3NlcnRpb25Gb3JtKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICA8YnI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fU0hPV19BTExfUFVCTElTSEVSX0FTU0VSVElPTlMiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQodGhpcy5mb3JtLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9TaG93UHVibGlzaGVyQXNzZXJ0aW9uc0FjdGlvbkpTUC5qc3AiKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fQ09NUExFVEVfUFVCTElTSEVSX0FTU0VSVElPTlMiKSU+IiBvbkNsaWNrPSJjaGVja1RhYmxlRW50cmllc0FuZFN1Ym1pdCgnPCU9ZGl2UHVibGlzaGVyQXNzZXJ0aW9uVGFibGUlPicsdGhpcy5mb3JtLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9Db21wbGV0ZVB1Ymxpc2hlckFzc2VydGlvbnNBY3Rpb25KU1AuanNwIikpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0FERF9QVUJMSVNIRVJfQVNTRVJUSU9OUyIpJT4iIG9uQ2xpY2s9ImNoZWNrVGFibGVTaXplQW5kU3VibWl0KCc8JT1wdWJsaXNoZXJBc3NlcnRpb25zQnVzaW5lc3MlPicsdGhpcy5mb3JtLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9BZGRQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcCIpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9SRU1PVkVfUFVCTElTSEVSX0FTU0VSVElPTlMiKSU+IiBvbkNsaWNrPSJjaGVja1RhYmxlRW50cmllc0FuZFN1Ym1pdCgnPCU9ZGl2UHVibGlzaGVyQXNzZXJ0aW9uVGFibGUlPicsdGhpcy5mb3JtLCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZW1vdmVQdWJsaXNoZXJBc3NlcnRpb25zQWN0aW9uSlNQLmpzcCIpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9mb3JtPgotCi0gICAgPC9kaXY+Ci0gIDwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHBvcHVsYXRlQXNzZXJ0aW9uVGFibGUoKTsKLSAgc2V0RGVmYXVsdHMoKTsKLSAgcmVzdW1lUHJveHlMb2FkUGFnZSgpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvTWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGJmZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL01hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBVRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSluYXZpZ2F0b3JNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShzZWxlY3RlZE5vZGUpOwotICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIEJ1c2luZXNzRWxlbWVudCBidXNFbGVtZW50ID0gKEJ1c2luZXNzRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgU3RyaW5nIHNrID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICBzdWJRdWVyeUtleVByb3BlcnR5LnNldFN1YlF1ZXJ5S2V5KHNrKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGh0bWw+Ci08aGVhZD4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvcmVzdWx0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci08JQotICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgIHsKLSAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocHVibGlzaFVSTCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodXNlcklkKSU+IjsKLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHBhc3N3b3JkKSU+IjsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci08JQotICAgfQotICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXkpOwotICAgVmVjdG9yIHJlZmVyZW5jZWRTZXJ2aWNlcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1JFRkVSRU5DRURfU0VSVklDRVMpOwotICAgaWYgKHJlZmVyZW5jZWRTZXJ2aWNlcyA9PSBudWxsKQotICAgewotICAgICByZWZlcmVuY2VkU2VydmljZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIEJ1c2luZXNzRW50aXR5IGJ1c2luZXNzRW50aXR5ID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpOwotICAgICBTdHJpbmcgYnVzaW5lc3NLZXkgPSBidXNpbmVzc0VudGl0eS5nZXRCdXNpbmVzc0tleSgpOwotICAgICBCdXNpbmVzc1NlcnZpY2VzIGJ1c2luZXNzU3ZjcyA9IGJ1c2luZXNzRW50aXR5LmdldEJ1c2luZXNzU2VydmljZXMoKTsKLSAgICAgaWYgKGJ1c2luZXNzU3ZjcyAhPSBudWxsKQotICAgICB7Ci0gICAgICAgVmVjdG9yIGJ1c2luZXNzU3ZjVmVjdG9yID0gYnVzaW5lc3NTdmNzLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpOwotICAgICAgIGZvciAoaW50IGk9MDtpPGJ1c2luZXNzU3ZjVmVjdG9yLnNpemUoKTtpKyspCi0gICAgICAgewotICAgICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJ1c1NlcnZpY2UgPSAoQnVzaW5lc3NTZXJ2aWNlKWJ1c2luZXNzU3ZjVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgIGlmICghYnVzU2VydmljZS5nZXRCdXNpbmVzc0tleSgpLmVxdWFscyhidXNpbmVzc0tleSkpCi0gICAgICAgICB7Ci0gICAgICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KGJ1c1NlcnZpY2UpOwotICAgICAgICAgICByZWZlcmVuY2VkU2VydmljZXMuYWRkRWxlbWVudChsaXN0RWxlbWVudCk7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9SRUZFUkVOQ0VEX1NFUlZJQ0VTLHJlZmVyZW5jZWRTZXJ2aWNlcyk7Ci0gICB9Ci0KLSAgIGZvciAoaW50IGk9MDtpPHJlZmVyZW5jZWRTZXJ2aWNlcy5zaXplKCk7aSsrKQotICAgewotICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClyZWZlcmVuY2VkU2VydmljZXMuZWxlbWVudEF0KGkpOwotICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgIGludCB0YXJnZXRUb29sSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRUb29sSWQoKTsKLSAgICAgaW50IHRhcmdldFZpZXdJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpOwotICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9SRUZFUkVOQ0VEX1NFUlZJQ0VTLGksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTLGZhbHNlKTsKLSAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgU3RyaW5nIG5hbWUgPSBicy5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBicy5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKTsKLSU+Ci0gICAgYWRkUmVzdWx0Um93KCJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNSZWZlcmVuY2VzIiw8JT10YXJnZXROb2RlSWQlPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbiklPiIpOwotPCUKLSAgIH0KLQotICAgVmVjdG9yIHNlcnZpY2VzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0VSVklDRVMpOwotICAgaWYgKHNlcnZpY2VzICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VzLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzZXJ2aWNlcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgaW50IHRhcmdldE5vZGVJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpOwotICAgICAgIGludCB0YXJnZXRUb29sSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRUb29sSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0Vmlld0lkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCk7Ci0gICAgICAgU3RyaW5nIHVybCA9IFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHRhcmdldE5vZGVJZCx0YXJnZXRUb29sSWQsdGFyZ2V0Vmlld0lkLHN1YlF1ZXJ5S2V5LFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0VSVklDRVMsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMsZmFsc2UpOwotICAgICAgIEJ1c2luZXNzU2VydmljZSBicyA9IChCdXNpbmVzc1NlcnZpY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgU3RyaW5nIG5hbWUgPSBicy5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGJzLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotJT4KLSAgICBhZGRSZXN1bHRSb3coIm1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1NlcnZpY2VzIiw8JT10YXJnZXROb2RlSWQlPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbiklPiIpOwotPCUKLSAgICAgfQotICAgfQotJT4KLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NSZWZlcmVuY2VUYWJsZSh0YWJsZUNvbnRhaW5lcklkLGlucHV0TmFtZSxmb3JtKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIGlucHV0cyA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoaW5wdXROYW1lLGlucHV0cy5pdGVtKDApLmNoZWNrZWQpKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVmZXJlbmNlVGFibGUoIm1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1JlZmVyZW5jZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLlJFRkVSRU5DRURfU0VSVklDRV9TRUxFQ1RfU1RBVEUlPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoIm1hbmFnZVJlZmVyZW5jZWRTZXJ2aWNlc1NlcnZpY2VzIiwiPCU9VURESUFjdGlvbklucHV0cy5OT0RFSURfU0VSVklDRSU+Iixmb3JtLGZhbHNlKTsKLSAgICAgIGZvcm0uc3VibWl0KCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc0FkZFNlcnZpY2VzKGZvcm0pCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSgibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzU2VydmljZXMiKTsKLSAgICBpZiAodGFibGUucm93cy5sZW5ndGggPT0gbnVtYmVyT2ZIZWFkZXJSb3dzKQotICAgICAgYWxlcnQoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX1NFUlZJQ0VTIikpJT4iKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLk1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTiU+LnZhbHVlID0gIjwlPVVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OX0FERCU+IjsKLSAgICAgIHByb2Nlc3NGb3JtKGZvcm0pOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdmVSZWZlcmVuY2VzKGZvcm0pCi0gIHsKLSAgICB2YXIgbnVtYmVyT2ZTZWxlY3Rpb25zID0gZ2V0TnVtYmVyT2ZTZWxlY3Rpb25zKCJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNSZWZlcmVuY2VzIik7Ci0gICAgaWYgKGdldE51bWJlck9mU2VsZWN0aW9ucygibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzUmVmZXJlbmNlcyIpID09IDApCi0gICAgICBhbGVydCgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fUkVGRVJFTkNFX1NFTEVDVEVEIikpJT4iKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLk1BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTX09QRVJBVElPTiU+LnZhbHVlID0gIjwlPVVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OX1JFTU9WRSU+IjsKLSAgICAgIHByb2Nlc3NGb3JtKGZvcm0pOwotICAgIH0KLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotICA8ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8ZGl2IGlkPSJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXMiPgotPCUKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ1ZGRpL2ltYWdlcy9yZWZlcmVuY2VkX3NlcnZpY2VzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX01BTkFHRV9SRUZFUkVOQ0VEX1NFUlZJQ0VTIik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9NYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJtYXJnaW4tdG9wOjA7Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVklPiI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VUJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0lPiI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfT1BFUkFUSU9OJT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9IjkwJSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTUFOQUdFX1JFRkVSRU5DRURfU0VSVklDRVNfREVTQyIpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICBTdHJpbmdbXSBwcm9qZWN0aW9uc1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9SRUZFUkVOQ0VEX1NFUlZJQ0VTIixCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCksU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTKSwibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1JFRkVSRU5DRURfU0VSVklDRVN9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNSZWZlcmVuY2VzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMocHJvamVjdGlvbnNTcGVjaWZpY0luZm8pOwotICAgc2VjdGlvbkhlYWRlckluZm8uZW5hYmxlRHluYW1pYyhmYWxzZSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBTdHJpbmdbXSBzZXJ2aWNlc1NwZWNpZmljSW5mbyA9IHsiRk9STV9PUFRJT05fU0VSVklDRVMiLEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMpLCJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXMiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0VSVklDRVN9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXNTZXJ2aWNlcyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKHNlcnZpY2VzU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgibWFuYWdlUmVmZXJlbmNlZFNlcnZpY2VzQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICA8dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MiBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fQUREX1NFUlZJQ0VTIiklPiIgb25DbGljaz0icHJvY2Vzc0FkZFNlcnZpY2VzKHRoaXMuZm9ybSkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fUkVNT1ZFX1JFRkVSRU5DRVMiKSU+IiBvbkNsaWNrPSJwcm9jZXNzUmVtb3ZlUmVmZXJlbmNlcyh0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvZm9ybT4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgc2V0RGVmYXVsdHMoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL09wZW5Qcml2YXRlUmVnaXN0cnlGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9PcGVuUHJpdmF0ZVJlZ2lzdHJ5Rm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNDQ3MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL09wZW5Qcml2YXRlUmVnaXN0cnlGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLVVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci1VRERJTWFpbk5vZGUgdWRkaU1haW5Ob2RlID0gKFVERElNYWluTm9kZSluYXZpZ2F0b3JNYW5hZ2VyLmdldFJvb3ROb2RlKCk7Ci1PcGVuUmVnaXN0cnlUb29sIG9wZW5SZWdpc3RyeVRvb2wgPSAoT3BlblJlZ2lzdHJ5VG9vbCkodWRkaU1haW5Ob2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gdG9JbnF1aXJ5VVJMKCkKLSAgewotICAgIHZhciBpbnB1dEhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJpdmF0ZVJlZ2lzdHJ5SG9zdCIpOwotICAgIHZhciBpbnB1dFBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJpdmF0ZVJlZ2lzdHJ5UG9ydCIpOwotICAgIHZhciBpbnB1dElucXVpcnlVUkwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJpdmF0ZVJlZ2lzdHJ5SW5xdWlyeVVSTCIpOwotICAgIHZhciBpbnB1dFB1Ymxpc2hVUkwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJpdmF0ZVJlZ2lzdHJ5UHVibGlzaFVSTCIpOwotICAgIGlucHV0SW5xdWlyeVVSTC52YWx1ZSA9ICJodHRwOi8vIiArIGlucHV0SG9zdC52YWx1ZSArICI6IiArIGlucHV0UG9ydC52YWx1ZSArICIvdWRkaXNvYXAvaW5xdWlyeWFwaSI7Ci0gICAgaW5wdXRQdWJsaXNoVVJMLnZhbHVlID0gImh0dHA6Ly8iICsgaW5wdXRIb3N0LnZhbHVlICsgIjoiICsgaW5wdXRQb3J0LnZhbHVlICsgIi91ZGRpc29hcC9wdWJsaXNoYXBpIjsKLSAgfQotPC9zY3JpcHQ+Ci08Zm9ybSBpZD0ib3BlblByaXZhdGVSZWdpc3RyeUZvcm0iIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvT3BlblJlZ2lzdHJ5QWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIGhhbmRsZVN1Ym1pdCh0aGlzKSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0icHJpdmF0ZVJlZ2lzdHJ5UHVibGlzaFVSTCIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5QVUJMSVNIX1VSTCU+Ij4KLSAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5VRERJX1VTRVJOQU1FJT4iIHZhbHVlPSJVTkFVVEhFTlRJQ0FURUQiPgotICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlVERElfUEFTU1dPUkQlPiIgdmFsdWU9IiI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgIDxsYWJlbCBmb3I9InByaXZhdGVSZWdpc3RyeU5hbWUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1JFR0lTVFJZX05BTUUiKSU+PC9sYWJlbD4KLSAgICAgICAgPCUKLSAgICAgICAgaWYgKCFvcGVuUmVnaXN0cnlUb29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUpKQotICAgICAgICB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZhdGVSZWdpc3RyeU5hbWUiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSU+IiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkRFRkFVTFRfUkVHSVNUUllfTkFNRV9XRUJTUEhFUkUiKSU+IiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgPGxhYmVsIGZvcj0icHJpdmF0ZVJlZ2lzdHJ5SG9zdCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfSE9TVCIpJT48L2xhYmVsPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2YXRlUmVnaXN0cnlIb3N0IiB2YWx1ZT0ibG9jYWxob3N0IiBvbmtleXVwPSJqYXZhc2NyaXB0OnRvSW5xdWlyeVVSTCgpIiBvbnBhc3RlPSJqYXZhc2NyaXB0OnRvSW5xdWlyeVVSTCgpIiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgPGxhYmVsIGZvcj0icHJpdmF0ZVJlZ2lzdHJ5UG9ydCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfUE9SVCIpJT48L2xhYmVsPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwcml2YXRlUmVnaXN0cnlQb3J0IiB2YWx1ZT0iOTA4MCIgb25rZXl1cD0iamF2YXNjcmlwdDp0b0lucXVpcnlVUkwoKSIgb25wYXN0ZT0iamF2YXNjcmlwdDp0b0lucXVpcnlVUkwoKSIgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgIDxsYWJlbCBmb3I9InByaXZhdGVSZWdpc3RyeUlucXVpcnlVUkwiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lOUVVJUllfVVJMIiklPjwvbGFiZWw+Ci0gICAgICAgIDwlCi0gICAgICAgIGlmICghb3BlblJlZ2lzdHJ5VG9vbC5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCkpCi0gICAgICAgIHsKLSAgICAgICAgJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0icHJpdmF0ZVJlZ2lzdHJ5SW5xdWlyeVVSTCIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCU+IiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icHJpdmF0ZVJlZ2lzdHJ5Q2F0ZWdvcmllcyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUyU+Ij48bGFiZWwgZm9yPSJwcml2YXRlUmVnaXN0cnlDYXRlZ29yaWVzIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9DSEVDS19VU0VSX0RFRklORURfQ0FURUdPUklFUyIpJT48L2xhYmVsPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Zvcm0+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdG9JbnF1aXJ5VVJMKCk7Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9PcGVuUmVnaXN0cnlGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9PcGVuUmVnaXN0cnlGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyMTZiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvT3BlblJlZ2lzdHJ5Rm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi1VRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLU5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotT3BlblJlZ2lzdHJ5VG9vbCBvcGVuUmVnaXN0cnlUb29sID0gKE9wZW5SZWdpc3RyeVRvb2wpKHVkZGlNYWluTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci1FbnVtZXJhdGlvbiBmYXZvcml0ZVJlZ2lzdHJ5RWxlbWVudHMgPSBvcGVuUmVnaXN0cnlUb29sLmdldEZhdm9yaXRlUmVnaXN0cnlFbGVtZW50cygpOwotVmVjdG9yIGZhdm9yaXRlUmVnaXN0cnlMaXN0ID0gbmV3IFZlY3RvcigpOwotd2hpbGUgKGZhdm9yaXRlUmVnaXN0cnlFbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgZmF2b3JpdGVSZWdpc3RyeUxpc3QuYWRkRWxlbWVudChmYXZvcml0ZVJlZ2lzdHJ5RWxlbWVudHMubmV4dEVsZW1lbnQoKSk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfT1BFTl9SRUdJU1RSWSIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgZnVuY3Rpb24gZmlsbEZhdm9yaXRlSW5mbyhmYXZvcml0ZVJlZ2lzdHJ5U2VsZWN0KQotICAgIHsKLSAgICAgIHZhciBzZWxlY3RlZEZhdm9yaXRlUmVnaXN0cnlJbmRleCA9IGZhdm9yaXRlUmVnaXN0cnlTZWxlY3Quc2VsZWN0ZWRJbmRleC0xOwotICAgICAgaWYgKHNlbGVjdGVkRmF2b3JpdGVSZWdpc3RyeUluZGV4ID49IDApCi0gICAgICB7Ci0gICAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm9wZW5SZWdpc3RyeUZvcm0iKTsKLSAgICAgICAgc3dpdGNoIChzZWxlY3RlZEZhdm9yaXRlUmVnaXN0cnlJbmRleCkKLSAgICAgICAgewotICAgICAgICAgIDwlCi0gICAgICAgICAgZm9yIChpbnQgaT0wO2k8ZmF2b3JpdGVSZWdpc3RyeUxpc3Quc2l6ZSgpO2krKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50IGZhdlJlZ0VsZW1lbnQgPSAoRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudClmYXZvcml0ZVJlZ2lzdHJ5TGlzdC5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgJT4KLSAgICAgICAgICAgIGNhc2UgPCU9aSU+OgotICAgICAgICAgICAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShmYXZSZWdFbGVtZW50LmdldE5hbWUoKSklPiI7Ci0gICAgICAgICAgICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShmYXZSZWdFbGVtZW50LmdldElucXVpcnlVUkwoKSklPiI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIDwlCi0gICAgICAgICAgfQotICAgICAgICAgICU+Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gICAgewotICAgICAgdmFyIGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3BlblJlZ2lzdHJ5Rm9ybSIpOwotICAgICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlJFR0lTVFJZX05BTUUlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylvcGVuUmVnaXN0cnlUb29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSkpJT4iOwotICAgICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpb3BlblJlZ2lzdHJ5VG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMKSklPiI7Ci0gICAgICBzaG93TWFpbkZvcm0oKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBzaG93TWFpbkZvcm0oKQotICAgIHsKLSAgICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgICAgaWYgKGxvYWRTY3JlZW5UYWJsZS5yb3dzLmxlbmd0aCA+IDApCi0gICAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiB0b2dnbGVSZWdpc3RyeVR5cGUoaXNQcml2YXRlUmVnaXN0cnkpCi0gICAgewotICAgICAgdmFyIG9wZW5SZWdpc3RyeUZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3BlblJlZ2lzdHJ5Rm9ybSIpOwotICAgICAgdmFyIG9wZW5Qcml2YXRlUmVnaXN0cnlGb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm9wZW5Qcml2YXRlUmVnaXN0cnlGb3JtIik7Ci0gICAgICBpZiAoaXNQcml2YXRlUmVnaXN0cnkpCi0gICAgICB7Ci0gICAgICAgIG9wZW5SZWdpc3RyeUZvcm0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgICAgb3BlblByaXZhdGVSZWdpc3RyeUZvcm0uc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvcGVuUmVnaXN0cnlGb3JtLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgICAgb3BlblByaXZhdGVSZWdpc3RyeUZvcm0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgIH0KLSAgICB9Ci0gIDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPGRpdiBpZD0ibWFpblNjcmVlbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICAgICAgPCUKLSAgICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ1ZGRpL2ltYWdlcy9vcGVuX3JlZ2lzdHJ5X2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX09QRU5fUkVHSVNUUlkiKTsKLSAgICAgICU+Ci0gICAgICA8JUAgaW5jbHVkZSBmaWxlPSIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICA8dGFibGU+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9PUEVOX1JFR0lTVFJZX0RFU0MiKSU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJyZWdpc3RyeVR5cGUiIG9uQ2xpY2s9ImphdmFzY3JpcHQ6dG9nZ2xlUmVnaXN0cnlUeXBlKHRoaXMuY2hlY2tlZCkiPjxsYWJlbCBmb3I9InJlZ2lzdHJ5VHlwZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSVNfV0VCU1BIRVJFX1VERElfUkVHSVNUUlkiKSU+PC9sYWJlbD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICAgIDxmb3JtIGlkPSJvcGVuUmVnaXN0cnlGb3JtIiBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL09wZW5SZWdpc3RyeUFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBoYW5kbGVTdWJtaXQodGhpcykiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiB2YWxpZ249ImJvdHRvbSIgbm93cmFwIGhlaWdodD0yNT4KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iZmF2b3JpdGVSZWdpc3RyeSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRkFWT1JJVEVfUkVHSVNUUlkiKSU+PC9sYWJlbD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgPHNlbGVjdCBpZD0iZmF2b3JpdGVSZWdpc3RyeSIgb25DaGFuZ2U9ImZpbGxGYXZvcml0ZUluZm8odGhpcykiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiIHNlbGVjdGVkPgotICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8ZmF2b3JpdGVSZWdpc3RyeUxpc3Quc2l6ZSgpO2krKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBGYXZvcml0ZXNVRERJUmVnaXN0cnlFbGVtZW50IGZhdlJlZ0VsZW1lbnQgPSAoRmF2b3JpdGVzVURESVJlZ2lzdHJ5RWxlbWVudClmYXZvcml0ZVJlZ2lzdHJ5TGlzdC5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPWZhdlJlZ0VsZW1lbnQuZ2V0TmFtZSgpJT4iPjwlPWZhdlJlZ0VsZW1lbnQuZ2V0TmFtZSgpJT4KLSAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfcmVnaXN0cnlfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRSIpJT48L2xhYmVsPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICBpZiAoIW9wZW5SZWdpc3RyeVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUkVHSVNUUllfTkFNRSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcmVnaXN0cnlfbmFtZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5SRUdJU1RSWV9OQU1FJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9pbnF1aXJ5X3VybCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSU5RVUlSWV9VUkwiKSU+PC9sYWJlbD4KLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgaWYgKCFvcGVuUmVnaXN0cnlUb29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLklOUVVJUllfVVJMKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9pbnF1aXJ5X3VybCIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5JTlFVSVJZX1VSTCU+IiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPC9mb3JtPgotICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIHNldERlZmF1bHRzKCk7Ci0gICAgICA8L3NjcmlwdD4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9PcGVuUHJpdmF0ZVJlZ2lzdHJ5Rm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC9kaXY+Ci0gIDwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1Byb2Nlc3NVRERJRnJhbWVzZXRzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUHJvY2Vzc1VERElGcmFtZXNldHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzZWRlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUHJvY2Vzc1VERElGcmFtZXNldHNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGZvcm1BY3Rpb24udG9TdHJpbmcoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowIj4KLSAgPGlucHV0IG5hbWU9IjwlPUFjdGlvbklucHV0cy5GUkFNRV9OQU1FJT4iIHR5cGU9ImhpZGRlbiIgdmFsdWU9IjwlPWZvcm1GcmFtZU5hbWUlPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCU+IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+Ij4KLTwvZm9ybT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdEZXRhaWxzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRGV0YWlsc0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzkzYTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdEZXRhaWxzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgRmF2b3JpdGVzUGVyc3BlY3RpdmUgZmF2UGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldEZhdm9yaXRlc1BlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIC8vIFRoZSBzZWxlY3RlZCBub2RlIG11c3QgYmUgYSByZWdpc3RyeSBub2RlLgotICAgTm9kZSByZWdpc3RyeU5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gcmVnaXN0cnlOb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKGN1cnJlbnRUb29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKSk7ICAgCi0gICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnaXN0cnlOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfUkVHSVNUUllfREVUQUlMUyIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL2RldGFpbHN0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvcmVzdW1lcHJveHlsb2FkcGFnZS5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHNldERlZmF1bHRzKCkKLSAgewotICAgIHZhciByZWdpc3RyeURldGFpbHNOYW1lVGFibGUgPSBnZXRUYWJsZSgicmVnaXN0cnlEZXRhaWxzTmFtZSIpOwotPCUKLSAgIFN0cmluZyBuYW1lID0gcmVnRWxlbWVudC5nZXROYW1lKCk7Ci0gICBib29sZWFuIGlzRXJyb3IgPSAhZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUkVHSVNUUllfTkFNRSk7ICAgCi0lPgotICAgIGFkZERldGFpbHNTaW5nbGVJdGVtUm93KCJyZWdpc3RyeURldGFpbHNOYW1lIixmYWxzZSk7Ci0gICAgc2V0RGV0YWlsc05hbWVTaW5nbGVJdGVtUm93KCJyZWdpc3RyeURldGFpbHNOYW1lIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUpJT4iKTsKLTwlCi0gICBpZiAoaXNFcnJvcikKLSAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHJlZ2lzdHJ5RGV0YWlsc05hbWVUYWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUKLSAgIH0KLSAgIAotICAgRW51bWVyYXRpb24gdXNlckRlZmluZWRDYXRlZ29yaWVzID0gcmVnRWxlbWVudC5nZXRVc2VyRGVmaW5lZENhdGVnb3JpZXMoKTsKLSAgIGJvb2xlYW4gY29udGFpbnNVc2VyRGVmaW5lZENhdGVnb3JpZXM7Ci0gICBpZiAodXNlckRlZmluZWRDYXRlZ29yaWVzICE9IG51bGwgJiYgdXNlckRlZmluZWRDYXRlZ29yaWVzLmhhc01vcmVFbGVtZW50cygpKQotICAgewotJT4KLSAgICB2YXIgcmVnaXN0cnlDYXRlZ29yaWVzVGFibGUgPSBnZXRUYWJsZSgicmVnaXN0cnlVc2VyRGVmaW5lZENhdGVnb3JpZXMiKTsKLTwlICAgCi0gICAgIGNvbnRhaW5zVXNlckRlZmluZWRDYXRlZ29yaWVzID0gdHJ1ZTsKLSAgICAgQXJyYXlMaXN0IHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIGRvCi0gICAgIHsKLSAgICAgICB1c2VyRGVmaW5lZENhdGVnb3JpZXNMaXN0LmFkZCh1c2VyRGVmaW5lZENhdGVnb3JpZXMubmV4dEVsZW1lbnQoKSk7Ci0gICAgIH0gd2hpbGUgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllcy5oYXNNb3JlRWxlbWVudHMoKSk7Ci0gICAgIENhdGVnb3J5TW9kZWxbXSB1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheSA9IG5ldyBDYXRlZ29yeU1vZGVsW3VzZXJEZWZpbmVkQ2F0ZWdvcmllc0xpc3Quc2l6ZSgpXTsKLSAgICAgdXNlckRlZmluZWRDYXRlZ29yaWVzTGlzdC50b0FycmF5KHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0FycmF5KTsKLSAgICAgUXVpY2tTb3J0LnNvcnQodXNlckRlZmluZWRDYXRlZ29yaWVzQXJyYXksMCx1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheS5sZW5ndGgtMSk7Ci0gICAgIFN0cmluZ0J1ZmZlciBmaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8dXNlckRlZmluZWRDYXRlZ29yaWVzQXJyYXkubGVuZ3RoO2krKykKLSAgICAgewotICAgICAgIG5hbWUgPSB1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheVtpXS5nZXREaXNwbGF5TmFtZSgpOwotICAgICAgIFN0cmluZyB0TW9kZWxLZXkgPSB1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheVtpXS5nZXRUTW9kZWxLZXkoKTsKLSAgICAgICBib29sZWFuIGNoZWNrZWQgPSB1c2VyRGVmaW5lZENhdGVnb3JpZXNBcnJheVtpXS5pc0NoZWNrZWQoKTsKLSAgICAgICBmaWxlTmFtZS5zZXRMZW5ndGgoMCk7Ci0gICAgICAgaWYgKHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0FycmF5W2ldLmlzRGF0YUxvYWRlZCgpKQotICAgICAgICAgZmlsZU5hbWUuYXBwZW5kKHVzZXJEZWZpbmVkQ2F0ZWdvcmllc0FycmF5W2ldLmdldENhdGVnb3J5S2V5KCkpLmFwcGVuZCgiLnR4dCIpOwotICAgICAgIGVsc2UKLSAgICAgICAgIGZpbGVOYW1lLmFwcGVuZChjb250cm9sbGVyLmdldE1lc3NhZ2UoIlRBQkxFX0JMQU5LX1BMQUNFSE9MREVSIikpOwotICAgICAgIGJvb2xlYW4gaGFzRXJyb3IgPSAhZm9ybVRvb2wuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuVVNFUl9ERUZJTkVEX0NBVEVHT1JJRVMsdE1vZGVsS2V5KTsKLSU+Ci0gICAgYWRkRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3coInJlZ2lzdHJ5VXNlckRlZmluZWRDYXRlZ29yaWVzIiwiPCU9dE1vZGVsS2V5JT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZSklPiIsPCU9Y2hlY2tlZCU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZmlsZU5hbWUudG9TdHJpbmcoKSklPiIsPCU9aGFzRXJyb3IlPik7Ci08JQotICAgICAgIGlmIChoYXNFcnJvcikKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhyZWdpc3RyeUNhdGVnb3JpZXNUYWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93cys8JT1pJT5dLCJlcnJhbnRSb3ciKTsKLTwlICAgICAgIAotICAgICAgIH0KLSAgICAgfQotICAgfQotICAgZWxzZQotICAgICBjb250YWluc1VzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IGZhbHNlOyAgIAotJT4gICAgICAgCi0gICAgc2hvd01haW5Gb3JtKCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNob3dNYWluRm9ybSgpCi0gIHsKLSAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICBpZiAobG9hZFNjcmVlblRhYmxlLnJvd3MubGVuZ3RoID4gMCkKLSAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHByb2Nlc3NGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NEZXRhaWxzU2luZ2xlSXRlbVRhYmxlKCJyZWdpc3RyeURldGFpbHNOYW1lIiwiPCU9VURESUFjdGlvbklucHV0cy5OQU1FX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1JFR0lTVFJZX05BTUUlPiIsZm9ybSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvVXBkYXRlUmVnaXN0cnlBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPgotICAgICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8ZGl2IGlkPSJtYWluU2NyZWVuIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1JFR0lTVFJZX0RFVEFJTFMiKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFVEFJTFNfRURJVEFCTEUiLHJlZ2lzdHJ5Tm9kZS5nZXROb2RlTmFtZSgpKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJyZWdpc3RyeURldGFpbHNOYW1lIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXModWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfTkFNRSIpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc1NpbmdsZUl0ZW1fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTlFVSVJZX1VSTCIpJT4KLSAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICA8JT1yZWdFbGVtZW50LmdldElucXVpcnlVUkwoKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08JQotICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSByZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKTsKLSAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocHVibGlzaFVSTCkpCi0gICB7Ci0lPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX1VSTCIpJT4KLSAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICA8JT1yZWdFbGVtZW50LmdldFB1Ymxpc2hVUkwoKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08JQotICAgfQotICAgCi0gICBpZiAoY29udGFpbnNVc2VyRGVmaW5lZENhdGVnb3JpZXMpCi0gICB7Ci0gICAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJyZWdpc3RyeVVzZXJEZWZpbmVkQ2F0ZWdvcmllcyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy91ZF9jYXRlZ29yaWVzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICB9Ci0gICBpZiAocmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICB7Ci0lPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VU0VSSUQiKSU+Ci0gICAgICAgICAgICA8L3RoPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgPCU9cmVnRWxlbWVudC5nZXRVc2VySWQoKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci08JQotICAgfQotICAgCi0gICBTdHJpbmcgcmVnaXN0cmF0aW9uVVJMID0gcmVnRWxlbWVudC5nZXRSZWdpc3RyYXRpb25VUkwoKTsKLSAgIGlmIChWYWxpZGF0b3IudmFsaWRhdGVVUkwocmVnaXN0cmF0aW9uVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgIDwlPWZhdlBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVHSVNUUllfVVJMIixyZWdpc3RyYXRpb25VUkwpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICB9Ci0lPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwvZGl2PiAgICAgIAotICAgIDwvZm9ybT4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgc2V0RGVmYXVsdHMoKTsKLSAgcmVzdW1lUHJveHlMb2FkUGFnZSgpOyAgCi08L3NjcmlwdD4gICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwN2QwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxkaXYgaWQ9ImZpbmRCdXNpbmVzc2VzQWR2YW5jZWQiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0ZpbmRCdXNpbmVzc2VzQWR2YW5jZWRGb3JtKHRoaXMpIj4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0dFVCU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUlPiI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRklORF9BRFZBTkNFRF9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9MzUgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImlucHV0X2ZpbmRfYnVzaW5lc3Nlc19hZHZhbmNlX293bmVkIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEJT4iIG9uQ2xpY2s9InRvZ2dsZUFkdmFuY2VkQXV0aGVudGljYXRpb25TZWN0aW9uKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT4sdGhpcy5jaGVja2VkKSI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfZmluZF9idXNpbmVzc2VzX2FkdmFuY2Vfb3duZWQiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX09XTkVEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZEJ1c2luZXNzZXNBZHZhbmNlZE5hbWVzIik7Ci0gICBTdHJpbmdbXSBuYW1lU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX05BTUVTIiwiRk9STV9MQUJFTF9OQU1FIixCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG5hbWVTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9sYW5ndWFnZUlucHV0X3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRJZGVudGlmaWVycyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9pZGVudGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQ2F0ZWdvcmllcyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBTdHJpbmdbXSBzaVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVMiLEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTKSwiZmluZEJ1c2luZXNzZXNBZHZhbmNlZCIsVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVN9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkU2VydmljZUludGVyZmFjZXMiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhzaVNwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWREaXNjb3ZlcnlVUkxzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMobmV3IEJvb2xlYW4oZmFsc2UpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGlzY292ZXJ5VVJMc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRmluZFF1YWxpZmllcnMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZmluZFF1YWxpZmllcnNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZEJ1c2luZXNzZXNBZHZhbmNlZENvbW1vbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hZHZhbmNlZENvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRCdXNpbmVzc2VzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxNDgzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08ZGl2IGlkPSJmaW5kQnVzaW5lc3NlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBuYW1lPSJmaW5kQnVzaW5lc3Nlc1N0eWxlIj4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU0VBUkNIX1RZUEUiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fZmluZF9idXNpbmVzc19zaW1wbGUiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTJT4iIG9uQ2xpY2s9InNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT4pIj48bGFiZWwgZm9yPSJyYWRpb19maW5kX2J1c2luZXNzX3NpbXBsZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU0lNUExFIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fZmluZF9idXNpbmVzc19hZHZhbmNlIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyU+IiBvbkNsaWNrPSJzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEJT4pIj48bGFiZWwgZm9yPSJyYWRpb19maW5kX2J1c2luZXNzX2FkdmFuY2UiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX0FEVkFOQ0VEIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fZmluZF9idXNpbmVzc191dWlkIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyU+IiBvbkNsaWNrPSJzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1VVSUQlPikiPjxsYWJlbCBmb3I9InJhZGlvX2ZpbmRfYnVzaW5lc3NfdXVpZCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fVVVJRCIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Zvcm0+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRCdXNpbmVzc1VVSUQiKTsKLSAgIFN0cmluZ1tdIG90aGVyUHJvcGVydGllcyA9IHsidWRkaS9hY3Rpb25zL1JlZ0ZpbmRCdXNpbmVzc1VVSURBY3Rpb25KU1AuanNwIixVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZLCJGT1JNX0xBQkVMX0ZJTkRfQlVTSU5FU1NfVVVJRF9ERVNDIn07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMob3RoZXJQcm9wZXJ0aWVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnRmluZFVVSURGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRCdXNpbmVzc2VzU2ltcGxlRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3ZTM0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAvLyBzZWxlY3RlZE5vZGUgY291bGQgYmUgdGhlIHJlZ2lzdHJ5IG9yIHF1ZXJ5IG5vZGVzLgotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9ImZpbmRCdXNpbmVzc2VzU2ltcGxlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnRmluZEJ1c2luZXNzZXNTaW1wbGVBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GSU5EX0JVU0lORVNTRVNfU0lNUExFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9maW5kX2J1c2luZXNzZXNfc2ltcGxlX25hbWUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4gPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9maW5kX2J1c2luZXNzZXNfc2ltcGxlX25hbWUiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzY2YxYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDcwNSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAvLyBzZWxlY3RlZE5vZGUgY291bGQgYmUgdGhlIHJlZ2lzdHJ5IG9yIHF1ZXJ5IG5vZGVzLgotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0lPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIFN0cmluZyBzdWJRdWVyeUtleSA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVkpOwotICAgc3ViUXVlcnlLZXlQcm9wZXJ0eS5zZXRTdWJRdWVyeUtleShzdWJRdWVyeUtleSk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTwlCi0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgTm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShzZWxlY3RlZE5vZGUpOwotICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1JFR0lTVFJZX0ZJTkQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGl0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciBzZWN0aW9uSWRzID0gWyJmaW5kQnVzaW5lc3NlcyIsImZpbmRTZXJ2aWNlcyIsImZpbmRTZXJ2aWNlSW50ZXJmYWNlcyJdOwotICB2YXIgZmluZEJ1c2luZXNzZXNTZWN0aW9uSWRzID0gWyJmaW5kQnVzaW5lc3Nlc1NpbXBsZSIsImZpbmRCdXNpbmVzc2VzQWR2YW5jZWQiLCJmaW5kQnVzaW5lc3NVVUlEIl07Ci0gIHZhciBmaW5kU2VydmljZXNTZWN0aW9uSWRzID0gWyJmaW5kU2VydmljZXNTaW1wbGUiLCJmaW5kU2VydmljZXNBZHZhbmNlZCIsImZpbmRTZXJ2aWNlVVVJRCJdOwotICB2YXIgZmluZFNlcnZpY2VJbnRlcmZhY2VzU2VjdGlvbklkcyA9IFsiZmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlIiwiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWQiLCJmaW5kU2VydmljZUludGVyZmFjZVVVSUQiXTsKLSAgdmFyIHN0eWxlRm9ybXMgPSBbImZpbmRCdXNpbmVzc2VzU3R5bGUiLCJmaW5kU2VydmljZXNTdHlsZSIsImZpbmRTZXJ2aWNlSW50ZXJmYWNlc1N0eWxlIl07Ci0gIHZhciBhdXRoZW50aWNhdGlvblNlY3Rpb25JZHMgPSBbImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIsImZpbmRTZXJ2aWNlc0FkdmFuY2VkQXV0aGVudGljYXRpb24iLCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEF1dGhlbnRpY2F0aW9uIl07Ci0KLSAgZnVuY3Rpb24gdmFsaWRhdGVRdWVyeU5hbWUoKQotICB7Ci08JQotICAgU3RyaW5nIHN1YlF1ZXJ5S2V5VmFsdWUgPSBzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCk7Ci0gICBib29sZWFuIGlzU3ViUXVlcnkgPSAoc3ViUXVlcnlLZXlWYWx1ZSAhPSBudWxsICYmIHN1YlF1ZXJ5S2V5VmFsdWUubGVuZ3RoKCkgPiAwKTsKLSU+ICAgCi0gICAgaWYgKDwlPWlzU3ViUXVlcnklPikKLSAgICB7Ci0gICAgICAvLyBTdWJxdWVyaWVzIG11c3QgaGF2ZSBhIG5hbWUgd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhhdCBvZiB0aGUgY3VycmVudCBxdWVyeSBvciB0aGUgY2xvc2VzdCBxdWVyeSBlbmNsb3NpbmcgdGhpcyBvYmplY3QuCi08JQotICAgU3RyaW5nIGN1cnJlbnRRdWVyeU5hbWUgPSAiIjsKLSAgIGlmIChzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBRdWVyeU5vZGUpCi0gICAgIGN1cnJlbnRRdWVyeU5hbWUgPSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgIGVsc2UgaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIEJ1c2luZXNzTm9kZSkKLSAgIHsKLSAgICAgTm9kZSBwYXJlbnROb2RlID0gc2VsZWN0ZWROb2RlLmdldFBhcmVudCgpOwotICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIFF1ZXJ5Tm9kZSkKLSAgICAgICBjdXJyZW50UXVlcnlOYW1lID0gcGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpOwotICAgfQotJT4gICAgCi0gICAgICB2YXIgcXVlcnlOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInF1ZXJ5TmFtZSIpLnZhbHVlOwotICAgICAgaWYgKHF1ZXJ5TmFtZSA9PSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGN1cnJlbnRRdWVyeU5hbWUpJT4iKQotICAgICAgewotICAgICAgICBhbGVydCgiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9RVUVSWV9OQU1FX0NPTkZMSUNUIiklPiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKCFoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCF2YWxpZGF0ZVF1ZXJ5TmFtZSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVklPi52YWx1ZSA9ICI8JT1zdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCklPiI7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUlPi52YWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxdWVyeU5hbWUiKS52YWx1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NGaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKHByb2Nlc3NGb3JtKGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWROYW1lcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc05hbWVGaW5kUXVhbGlmaWVycygiZmluZEJ1c2luZXNzZXNBZHZhbmNlZE5hbWVzIixmb3JtKTsKLSAgICAgIHByb2Nlc3NJZGVudGlmaWVyVGFibGUoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRJZGVudGlmaWVycyIsZm9ybSk7Ci0gICAgICBwcm9jZXNzQ2F0ZWdvcnlUYWJsZSgiZmluZEJ1c2luZXNzZXNBZHZhbmNlZENhdGVnb3JpZXMiLGZvcm0sdHJ1ZSk7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRTZXJ2aWNlSW50ZXJmYWNlcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuTk9ERUlEX1NFUlZJQ0VfSU5URVJGQUNFJT4iLGZvcm0sZmFsc2UpOwotICAgICAgcHJvY2Vzc0Rpc2NvdmVyeVVSTFRhYmxlKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRGlzY292ZXJ5VVJMcyIsZm9ybSk7Ci0gICAgICBwcm9jZXNzRmluZFF1YWxpZmllclRhYmxlKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRmluZFF1YWxpZmllcnMiLGZvcm0pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NGaW5kU2VydmljZXNBZHZhbmNlZEZvcm0oZm9ybSkKLSAgewotICAgIGlmIChwcm9jZXNzRm9ybShmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoImZpbmRTZXJ2aWNlc0FkdmFuY2VkQnVzaW5lc3MiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9CVVNJTkVTUyU+Iixmb3JtLGZhbHNlKTsKLSAgICAgIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUoImZpbmRTZXJ2aWNlc0FkdmFuY2VkTmFtZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUVfTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRSU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NOYW1lRmluZFF1YWxpZmllcnMoImZpbmRTZXJ2aWNlc0FkdmFuY2VkTmFtZXMiLGZvcm0pOwotICAgICAgcHJvY2Vzc0NhdGVnb3J5VGFibGUoImZpbmRTZXJ2aWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIsZm9ybSxmYWxzZSk7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoImZpbmRTZXJ2aWNlc0FkdmFuY2VkU2VydmljZUludGVyZmFjZXMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLk5PREVJRF9TRVJWSUNFX0lOVEVSRkFDRSU+Iixmb3JtLGZhbHNlKTsKLSAgICAgIHByb2Nlc3NGaW5kUXVhbGlmaWVyVGFibGUoImZpbmRTZXJ2aWNlc0FkdmFuY2VkRmluZFF1YWxpZmllcnMiLGZvcm0pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0oZm9ybSkKLSAgewotICAgIGlmIChwcm9jZXNzRm9ybShmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkU2VydmljZSIsIjwlPVVERElBY3Rpb25JbnB1dHMuTk9ERUlEX1NFUlZJQ0UlPiIsZm9ybSxmYWxzZSk7Ci0gICAgICBwcm9jZXNzTmFtZUZpbmRRdWFsaWZpZXJzKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZE5hbWUiLGZvcm0pOwotICAgICAgcHJvY2Vzc0lkZW50aWZpZXJUYWJsZSgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRJZGVudGlmaWVycyIsZm9ybSk7Ci0gICAgICBwcm9jZXNzQ2F0ZWdvcnlUYWJsZSgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRDYXRlZ29yaWVzIixmb3JtLGZhbHNlKTsKLSAgICAgIHByb2Nlc3NGaW5kUXVhbGlmaWVyVGFibGUoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRmluZFF1YWxpZmllcnMiLGZvcm0pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldERlZmF1bHRzKCkKLSAgewotICAgIC8vIFNldCB0aGUgcXVlcnkgbmFtZQotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxdWVyeU5hbWUiKS52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSkpJT4iOwotICAgIHZhciBzZWFyY2hGb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VhcmNoRm9yIik7Ci0gICAgc2VhcmNoRm9yLnNlbGVjdGVkSW5kZXggPSA8JT1mb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTSklPjsKLSAgICBzZXREZWZhdWx0c0ZvckZpbmRCdXNpbmVzc2VzRm9ybXMoKTsKLSAgICBzZXREZWZhdWx0c0ZvckZpbmRTZXJ2aWNlc0Zvcm1zKCk7Ci0gICAgc2V0RGVmYXVsdHNGb3JGaW5kU2VydmljZUludGVyZmFjZXNGb3JtcygpOwotICAgIHNob3dNYWluRm9ybShzZWFyY2hGb3IudmFsdWUpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMoYWR2YW5jZWRGb3JtLHF1ZXJ5SXRlbUluZGV4LGlzT3duZWRDaGVja2VkKQotICB7Ci08JQotICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKTsKLSU+Ci0gICAgYWR2YW5jZWRGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfT1dORUQlPi5jaGVja2VkID0gaXNPd25lZENoZWNrZWQ7Ci0gICAgYWR2YW5jZWRGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocHVibGlzaFVSTCklPiI7Ci0gICAgYWR2YW5jZWRGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJJZCklPiI7Ci0gICAgYWR2YW5jZWRGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocGFzc3dvcmQpJT4iOwotICAgIHRvZ2dsZUFkdmFuY2VkQXV0aGVudGljYXRpb25TZWN0aW9uKHF1ZXJ5SXRlbUluZGV4LGlzT3duZWRDaGVja2VkKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldEFkdmFuY2VkQ29tbW9uU2VjdGlvbkRlZmF1bHRzKGZvcm0sbWF4U2VhcmNoU2V0LG1heFJlc3VsdHMpCi0gIHsKLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1NFQVJDSF9TRVQlPi52YWx1ZSA9IG1heFNlYXJjaFNldDsKLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTUFYX1JFU1VMVFMlPi52YWx1ZSA9IG1heFJlc3VsdHM7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXREZWZhdWx0c0ZvckZpbmRCdXNpbmVzc2VzRm9ybXMoKQotICB7Ci0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmluZEJ1c2luZXNzZXMgZm9ybS4KLTwlCi0gICBTdHJpbmcgZmluZEJ1c2luZXNzZXNTdHlsZUluZGV4ID0gKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zW3N0eWxlRm9ybXNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPl1dLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyU+WzwlPWZpbmRCdXNpbmVzc2VzU3R5bGVJbmRleCU+XS5jaGVja2VkID0gdHJ1ZTsKLSAgICB2YXIgZmluZEJ1c2luZXNzZXNTaW1wbGVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZEJ1c2luZXNzZXNTZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT5dKTsKLSAgICB2YXIgZmluZEJ1c2luZXNzZXNTaW1wbGVGb3JtID0gZmluZEJ1c2luZXNzZXNTaW1wbGVTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBmaW5kQnVzaW5lc3Nlc1NpbXBsZUZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSkpJT4iOwotCi0gICAgLy8gQWR2YW5jZWQgZm9ybSBkZXRhaWxzLgotICAgIHZhciBmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbmRCdXNpbmVzc2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEJT5dKTsKLSAgICB2YXIgZmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0gPSBmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgdmFyIGlzT3duZWRDaGVja2VkID0gPCU9KGZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19PV05FRCkgIT0gbnVsbCklPjsKLSAgICBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRm9ybSw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+LGlzT3duZWRDaGVja2VkKTsKLTwlCi0gICBWZWN0b3IgYnVzTmFtZVZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKTsKLSAgIGlmIChidXNOYW1lVmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPGJ1c05hbWVWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIE5hbWUgbmFtZSA9IChOYW1lKWJ1c05hbWVWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRMYW5ndWFnZUlucHV0Um93KCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkTmFtZXMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiKSklPiIpOwotICAgIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncygiZmluZEJ1c2luZXNzZXNBZHZhbmNlZE5hbWVzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lLmdldExhbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShuYW1lLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotCi0gICBJZGVudGlmaWVyQmFnIGJ1c0lkQmFnID0gKElkZW50aWZpZXJCYWcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0lERU5USUZJRVJTKTsKLSAgIGlmIChidXNJZEJhZyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBidXNJZEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxrZXllZFJlZmVyZW5jZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2Upa2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRJZGVudGlmaWVyUm93KCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkSWRlbnRpZmllcnMiKTsKLSAgICBzZXRJZGVudGlmaWVyUm93U2V0dGluZ3MoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRJZGVudGlmaWVycyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0VE1vZGVsS2V5KCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5TmFtZSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleVZhbHVlKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLQotICAgQ2F0ZWdvcnlCYWcgYnVzQ2F0QmFnID0gKENhdGVnb3J5QmFnKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19DQVRFR09SSUVTKTsKLSAgIGlmIChidXNDYXRCYWcgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGtleWVkUmVmZXJlbmNlVmVjdG9yID0gYnVzQ2F0QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGtleWVkUmVmZXJlbmNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlrZXllZFJlZmVyZW5jZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZENhdGVnb3J5Um93KCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkQ2F0ZWdvcmllcyIpOwotICAgIHNldENhdGVnb3J5Um93U2V0dGluZ3MoImZpbmRCdXNpbmVzc2VzQWR2YW5jZWRDYXRlZ29yaWVzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotCi0gICBWZWN0b3IgYnVzU2VydmljZUludGVyZmFjZXMgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgVmVjdG9yIGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZKTsKLSAgIGlmIChidXNTZXJ2aWNlSW50ZXJmYWNlcyAhPSBudWxsKQotICAgewotICAgICBpZiAoYnVzU2VydmljZUludGVyZmFjZXNDb3B5ID09IG51bGwpCi0gICAgICAgYnVzU2VydmljZUludGVyZmFjZXNDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBlbHNlCi0gICAgICAgYnVzU2VydmljZUludGVyZmFjZXNDb3B5LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGJ1c1NlcnZpY2VJbnRlcmZhY2VzLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClidXNTZXJ2aWNlSW50ZXJmYWNlcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgaW50IHRhcmdldE5vZGVJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpOwotICAgICAgIGludCB0YXJnZXRUb29sSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRUb29sSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0Vmlld0lkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCk7Ci0gICAgICAgU3RyaW5nIHVybCA9IFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHRhcmdldE5vZGVJZCx0YXJnZXRUb29sSWQsdGFyZ2V0Vmlld0lkLHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFUyxpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMsZmFsc2UpOwotICAgICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weS5hZGRFbGVtZW50KGJ1c1NlcnZpY2VJbnRlcmZhY2VzLmVsZW1lbnRBdChpKSk7Ci0lPgotICAgIGFkZFJlc3VsdFJvdygiZmluZEJ1c2luZXNzZXNBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VzIiw8JT10YXJnZXROb2RlSWQlPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodE1vZGVsLmdldE5hbWVTdHJpbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh0TW9kZWwuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZLGJ1c1NlcnZpY2VJbnRlcmZhY2VzQ29weSk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIGJ1c1NlcnZpY2VJbnRlcmZhY2VzID0gbmV3IFZlY3RvcigpOwotICAgICBidXNTZXJ2aWNlSW50ZXJmYWNlc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19TRVJWSUNFX0lOVEVSRkFDRVMsYnVzU2VydmljZUludGVyZmFjZXMpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFksYnVzU2VydmljZUludGVyZmFjZXNDb3B5KTsKLSAgIH0KLQotICAgRGlzY292ZXJ5VVJMcyBidXNEaXNjb3ZlcnlVUkxzID0gKERpc2NvdmVyeVVSTHMpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMpOwotICAgaWYgKGJ1c0Rpc2NvdmVyeVVSTHMgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGRpc2NvdmVyeVVSTFZlY3RvciA9IGJ1c0Rpc2NvdmVyeVVSTHMuZ2V0RGlzY292ZXJ5VVJMVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGRpc2NvdmVyeVVSTFZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgRGlzY292ZXJ5VVJMIGRpc2NvdmVyeVVSTCA9IChEaXNjb3ZlcnlVUkwpZGlzY292ZXJ5VVJMVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkRGlzY292ZXJ5VVJMUm93KCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRGlzY292ZXJ5VVJMcyIpOwotICAgIHNldERpc2NvdmVyeVVSTFJvd1NldHRpbmdzKCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRGlzY292ZXJ5VVJMcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGlzY292ZXJ5VVJMLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotCi0gICBGaW5kUXVhbGlmaWVycyBidXNGaW5kUXVhbGlmaWVycyA9IChGaW5kUXVhbGlmaWVycylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRklORFFVQUxJRklFUlMpOwotICAgaWYgKGJ1c0ZpbmRRdWFsaWZpZXJzICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBmaW5kUXVhbGlmaWVyVmVjdG9yID0gYnVzRmluZFF1YWxpZmllcnMuZ2V0RmluZFF1YWxpZmllclZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxmaW5kUXVhbGlmaWVyVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBGaW5kUXVhbGlmaWVyIGZpbmRRdWFsaWZpZXIgPSAoRmluZFF1YWxpZmllcilmaW5kUXVhbGlmaWVyVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgc2V0RmluZFF1YWxpZmllcigiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGZpbmRRdWFsaWZpZXIuZ2V0VGV4dCgpKSU+IiwiZmluZEJ1c2luZXNzZXNBZHZhbmNlZE5hbWVzIiwiZmluZEJ1c2luZXNzZXNBZHZhbmNlZENhdGVnb3JpZXMiLCJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkRmluZFF1YWxpZmllcnMiKTsKLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci0gICAgc2V0QWR2YW5jZWRDb21tb25TZWN0aW9uRGVmYXVsdHMoZmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0sIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19NQVhfU0VBUkNIX1NFVCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTUFYX1JFU1VMVFMpKSU+Iik7Ci0KLSAgICAvLyBVVUlEIGZvcm0gZGV0YWlscy4KLSAgICB2YXIgZmluZEJ1c2luZXNzZXNVVUlEU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbmRCdXNpbmVzc2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1VVSUQlPl0pOwotICAgIHZhciBmaW5kQnVzaW5lc3Nlc1VVSURGb3JtID0gZmluZEJ1c2luZXNzZXNVVUlEU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgZmluZEJ1c2luZXNzZXNVVUlERm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfS0VZJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfQlVTSU5FU1NfS0VZKSklPiI7Ci0KLSAgICBzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPiw8JT1maW5kQnVzaW5lc3Nlc1N0eWxlSW5kZXglPik7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXREZWZhdWx0c0ZvckZpbmRTZXJ2aWNlc0Zvcm1zKCkKLSAgewotICAgIC8vIEluaXRpYWxpemUgdGhlIGZpbmRTZXJ2aWNlcyBmb3JtLgotPCUKLSAgIFN0cmluZyBmaW5kU2VydmljZXNTdHlsZUluZGV4ID0gKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1tzdHlsZUZvcm1zWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyU+XV0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyU+WzwlPWZpbmRTZXJ2aWNlc1N0eWxlSW5kZXglPl0uY2hlY2tlZCA9IHRydWU7Ci0gICAgdmFyIGZpbmRTZXJ2aWNlc1NpbXBsZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaW5kU2VydmljZXNTZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT5dKTsKLSAgICB2YXIgZmluZFNlcnZpY2VzU2ltcGxlRm9ybSA9IGZpbmRTZXJ2aWNlc1NpbXBsZVNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIGZpbmRTZXJ2aWNlc1NpbXBsZUZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUpKSU+IjsKLQotICAgIC8vIEFkdmFuY2VkIGZvcm0gZGV0YWlscy4KLSAgICB2YXIgZmluZFNlcnZpY2VzQWR2YW5jZWRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZFNlcnZpY2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEJT5dKTsKLSAgICB2YXIgZmluZFNlcnZpY2VzQWR2YW5jZWRGb3JtID0gZmluZFNlcnZpY2VzQWR2YW5jZWRTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICB2YXIgaXNPd25lZENoZWNrZWQgPSA8JT0oZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfT1dORUQpICE9IG51bGwpJT47Ci0gICAgc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMoZmluZFNlcnZpY2VzQWR2YW5jZWRGb3JtLDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyU+LGlzT3duZWRDaGVja2VkKTsKLTwlCi0gICBWZWN0b3Igc2VydmljZUJ1c2luZXNzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICBWZWN0b3Igc2VydmljZUJ1c2luZXNzQ29weSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSk7Ci0gICBpZiAoc2VydmljZUJ1c2luZXNzICE9IG51bGwpCi0gICB7Ci0gICAgIGlmIChzZXJ2aWNlQnVzaW5lc3NDb3B5ID09IG51bGwpCi0gICAgICAgc2VydmljZUJ1c2luZXNzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZWxzZQotICAgICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZUJ1c2luZXNzLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzZXJ2aWNlQnVzaW5lc3MuZWxlbWVudEF0KGkpOwotICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0VG9vbElkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0VG9vbElkKCk7Ci0gICAgICAgaW50IHRhcmdldFZpZXdJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpOwotICAgICAgIFN0cmluZyB1cmwgPSBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCxzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTLGksVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMsZmFsc2UpOwotICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gKEJ1c2luZXNzRW50aXR5KWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkuYWRkRWxlbWVudChzZXJ2aWNlQnVzaW5lc3MuZWxlbWVudEF0KGkpKTsKLSU+Ci0gICAgYWRkUmVzdWx0Um93KCJmaW5kU2VydmljZXNBZHZhbmNlZEJ1c2luZXNzIiw8JT10YXJnZXROb2RlSWQlPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoYmUuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShiZS5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKSklPiIpOwotPCUKLSAgICAgfQotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU19DT1BZLHNlcnZpY2VCdXNpbmVzc0NvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBzZXJ2aWNlQnVzaW5lc3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTLHNlcnZpY2VCdXNpbmVzcyk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTX0NPUFksc2VydmljZUJ1c2luZXNzQ29weSk7Ci0gICB9Ci0KLSAgIFZlY3RvciBzZXJ2aWNlTmFtZVZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgaWYgKHNlcnZpY2VOYW1lVmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VOYW1lVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlzZXJ2aWNlTmFtZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZExhbmd1YWdlSW5wdXRSb3coImZpbmRTZXJ2aWNlc0FkdmFuY2VkTmFtZXMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiKSklPiIpOwotICAgIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncygiZmluZFNlcnZpY2VzQWR2YW5jZWROYW1lcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRMYW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLQotICAgQ2F0ZWdvcnlCYWcgc2VydmljZUNhdEJhZyA9IChDYXRlZ29yeUJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9DQVRFR09SSUVTKTsKLSAgIGlmIChzZXJ2aWNlQ2F0QmFnICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBrZXllZFJlZmVyZW5jZVZlY3RvciA9IHNlcnZpY2VDYXRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8a2V5ZWRSZWZlcmVuY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWtleWVkUmVmZXJlbmNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkQ2F0ZWdvcnlSb3coImZpbmRTZXJ2aWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIpOwotICAgIHNldENhdGVnb3J5Um93U2V0dGluZ3MoImZpbmRTZXJ2aWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0VE1vZGVsS2V5KCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5TmFtZSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleVZhbHVlKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLQotICAgVmVjdG9yIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSAgIFZlY3RvciBzZXJ2aWNlU2VydmljZUludGVyZmFjZXNDb3B5ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSk7Ci0gICBpZiAoc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzICE9IG51bGwpCi0gICB7Ci0gICAgIGlmIChzZXJ2aWNlU2VydmljZUludGVyZmFjZXNDb3B5ID09IG51bGwpCi0gICAgICAgc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZWxzZQotICAgICAgIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZVNlcnZpY2VJbnRlcmZhY2VzLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzZXJ2aWNlU2VydmljZUludGVyZmFjZXMuZWxlbWVudEF0KGkpOwotICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0VG9vbElkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0VG9vbElkKCk7Ci0gICAgICAgaW50IHRhcmdldFZpZXdJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpOwotICAgICAgIFN0cmluZyB1cmwgPSBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCxzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyxpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMsZmFsc2UpOwotICAgICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkuYWRkRWxlbWVudChzZXJ2aWNlU2VydmljZUludGVyZmFjZXMuZWxlbWVudEF0KGkpKTsKLSU+Ci0gICAgYWRkUmVzdWx0Um93KCJmaW5kU2VydmljZXNBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VzIiw8JT10YXJnZXROb2RlSWQlPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodE1vZGVsLmdldE5hbWVTdHJpbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh0TW9kZWwuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTX0NPUFksc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzQ29weSk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgc2VydmljZVNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfU0VSVklDRV9JTlRFUkZBQ0VTLHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlcyk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFU19DT1BZLHNlcnZpY2VTZXJ2aWNlSW50ZXJmYWNlc0NvcHkpOwotICAgfQotCi0gICBGaW5kUXVhbGlmaWVycyBzZXJ2aWNlRmluZFF1YWxpZmllcnMgPSAoRmluZFF1YWxpZmllcnMpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfRklORFFVQUxJRklFUlMpOwotICAgaWYgKHNlcnZpY2VGaW5kUXVhbGlmaWVycyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3IgZmluZFF1YWxpZmllclZlY3RvciA9IHNlcnZpY2VGaW5kUXVhbGlmaWVycy5nZXRGaW5kUXVhbGlmaWVyVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGZpbmRRdWFsaWZpZXJWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIEZpbmRRdWFsaWZpZXIgZmluZFF1YWxpZmllciA9IChGaW5kUXVhbGlmaWVyKWZpbmRRdWFsaWZpZXJWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBzZXRGaW5kUXVhbGlmaWVyKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZmluZFF1YWxpZmllci5nZXRUZXh0KCkpJT4iLCJmaW5kU2VydmljZXNBZHZhbmNlZE5hbWVzIiwiZmluZFNlcnZpY2VzQWR2YW5jZWRDYXRlZ29yaWVzIiwiZmluZFNlcnZpY2VzQWR2YW5jZWRGaW5kUXVhbGlmaWVycyIpOwotPCUKLSAgICAgfQotICAgfQotJT4KLSAgICBzZXRBZHZhbmNlZENvbW1vblNlY3Rpb25EZWZhdWx0cyhmaW5kU2VydmljZXNBZHZhbmNlZEZvcm0sIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9TRUFSQ0hfU0VUKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX01BWF9SRVNVTFRTKSklPiIpOwotCi0gICAgLy8gVVVJRCBmb3JtIGRldGFpbHMuCi0gICAgdmFyIGZpbmRTZXJ2aWNlc1VVSURTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZFNlcnZpY2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1VVSUQlPl0pOwotICAgIHZhciBmaW5kU2VydmljZXNVVUlERm9ybSA9IGZpbmRTZXJ2aWNlc1VVSURTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBmaW5kU2VydmljZXNVVUlERm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfS0VZJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVkpKSU+IjsKLQotICAgIHNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiw8JT1maW5kU2VydmljZXNTdHlsZUluZGV4JT4pOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHNGb3JGaW5kU2VydmljZUludGVyZmFjZXNGb3JtcygpCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBmaW5kU2VydmljZUludGVyZmFjZXMgZm9ybS4KLTwlCi0gICBTdHJpbmcgZmluZFNlcnZpY2VJbnRlcmZhY2VzU3R5bGVJbmRleCA9IChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zW3N0eWxlRm9ybXNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+XV0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFX0lOVEVSRkFDRVMlPls8JT1maW5kU2VydmljZUludGVyZmFjZXNTdHlsZUluZGV4JT5dLmNoZWNrZWQgPSB0cnVlOwotICAgIHZhciBmaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZFNlcnZpY2VJbnRlcmZhY2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+XSk7Ci0gICAgdmFyIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZUZvcm0gPSBmaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBmaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpKSU+IjsKLQotICAgIC8vIEFkdmFuY2VkIGZvcm0gZGV0YWlscy4KLSAgICB2YXIgZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmluZFNlcnZpY2VJbnRlcmZhY2VzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEJT5dKTsKLSAgICB2YXIgZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtID0gZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLQotICAgIHZhciBpc093bmVkQ2hlY2tlZCA9IDwlPShmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfT1dORUQpICE9IG51bGwpJT47Ci0gICAgc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMoZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtLDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPixpc093bmVkQ2hlY2tlZCk7Ci0gICAgdmFyIGlzVXNlU2VydmljZUNoZWNrZWQgPSA8JT0oZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1VTRV9TRVJWSUNFKSAhPSBudWxsKSU+OwotICAgIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1VTRV9TRVJWSUNFJT4uY2hlY2tlZCA9IGlzVXNlU2VydmljZUNoZWNrZWQ7Ci0gICAgdG9nZ2xlRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZXJ2aWNlUGFyYW1ldGVycyhmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0pOwotICAgIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSkpJT4iOwotCi08JQotICAgVmVjdG9yIHNpU2VydmljZSA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1NFUlZJQ0UpOwotICAgVmVjdG9yIHNpU2VydmljZUNvcHkgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFX0NPUFkpOwotICAgaWYgKHNpU2VydmljZSAhPSBudWxsKQotICAgewotICAgICBpZiAoc2lTZXJ2aWNlQ29weSA9PSBudWxsKQotICAgICAgIHNpU2VydmljZUNvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGVsc2UKLSAgICAgICBzaVNlcnZpY2VDb3B5LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNpU2VydmljZS5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2lTZXJ2aWNlLmVsZW1lbnRBdChpKTsKLSAgICAgICBpbnQgdGFyZ2V0Tm9kZUlkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Tm9kZUlkKCk7Ci0gICAgICAgaW50IHRhcmdldFRvb2xJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFRvb2xJZCgpOwotICAgICAgIGludCB0YXJnZXRWaWV3SWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKTsKLSAgICAgICBTdHJpbmcgdXJsID0gU2VsZWN0U3ViUXVlcnlJdGVtQWN0aW9uLmdldEFjdGlvbkxpbmsodGFyZ2V0Tm9kZUlkLHRhcmdldFRvb2xJZCx0YXJnZXRWaWV3SWQsc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRSxpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyxmYWxzZSk7Ci0gICAgICAgQnVzaW5lc3NTZXJ2aWNlIGJzID0gKEJ1c2luZXNzU2VydmljZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBzaVNlcnZpY2VDb3B5LmFkZEVsZW1lbnQoc2lTZXJ2aWNlLmVsZW1lbnRBdChpKSk7Ci0lPgotICAgIGFkZFJlc3VsdFJvdygiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZXJ2aWNlIiw8JT10YXJnZXROb2RlSWQlPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShicy5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKSklPiIpOwotPCUKLSAgICAgfQotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfU0VSVklDRV9DT1BZLHNpU2VydmljZUNvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBzaVNlcnZpY2UgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIHNpU2VydmljZUNvcHkgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFLHNpU2VydmljZSk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFX0NPUFksc2lTZXJ2aWNlQ29weSk7Ci0gICB9Ci0KLSAgIElkZW50aWZpZXJCYWcgc2lJZEJhZyA9IChJZGVudGlmaWVyQmFnKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0gICBpZiAoc2lJZEJhZyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBzaUlkQmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGtleWVkUmVmZXJlbmNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlrZXllZFJlZmVyZW5jZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZElkZW50aWZpZXJSb3coImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkSWRlbnRpZmllcnMiKTsKLSAgICBzZXRJZGVudGlmaWVyUm93U2V0dGluZ3MoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkSWRlbnRpZmllcnMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0KLSAgIENhdGVnb3J5QmFnIHNpQ2F0QmFnID0gKENhdGVnb3J5QmFnKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTKTsKLSAgIGlmIChzaUNhdEJhZyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBzaUNhdEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxrZXllZFJlZmVyZW5jZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2Upa2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRDYXRlZ29yeVJvdygiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0gICAgc2V0Q2F0ZWdvcnlSb3dTZXR0aW5ncygiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRDYXRlZ29yaWVzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotCi0gICBGaW5kUXVhbGlmaWVycyBzaUZpbmRRdWFsaWZpZXJzID0gKEZpbmRRdWFsaWZpZXJzKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9GSU5EUVVBTElGSUVSUyk7Ci0gICBpZiAoc2lGaW5kUXVhbGlmaWVycyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3IgZmluZFF1YWxpZmllclZlY3RvciA9IHNpRmluZFF1YWxpZmllcnMuZ2V0RmluZFF1YWxpZmllclZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxmaW5kUXVhbGlmaWVyVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBGaW5kUXVhbGlmaWVyIGZpbmRRdWFsaWZpZXIgPSAoRmluZFF1YWxpZmllcilmaW5kUXVhbGlmaWVyVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgc2V0RmluZFF1YWxpZmllcigiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGZpbmRRdWFsaWZpZXIuZ2V0VGV4dCgpKSU+IiwiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWROYW1lIiwiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRDYXRlZ29yaWVzIiwiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGaW5kUXVhbGlmaWVycyIpOwotPCUKLSAgICAgfQotICAgfQotJT4KLSAgICBzZXRBZHZhbmNlZENvbW1vblNlY3Rpb25EZWZhdWx0cyhmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0sIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9NQVhfU0VBUkNIX1NFVCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTUFYX1JFU1VMVFMpKSU+Iik7Ci0KLSAgICAvLyBVVUlEIGZvcm0gZGV0YWlscy4KLSAgICB2YXIgZmluZFNlcnZpY2VJbnRlcmZhY2VzVVVJRFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaW5kU2VydmljZUludGVyZmFjZXNTZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfVVVJRCU+XSk7Ci0gICAgdmFyIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1VVSURGb3JtID0gZmluZFNlcnZpY2VJbnRlcmZhY2VzVVVJRFNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIGZpbmRTZXJ2aWNlSW50ZXJmYWNlc1VVSURGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9LRVklPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0lOVEVSRkFDRV9LRVkpKSU+IjsKLQotICAgIHNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4sPCU9ZmluZFNlcnZpY2VJbnRlcmZhY2VzU3R5bGVJbmRleCU+KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dNYWluRm9ybShzZWFyY2hGb3JWYWx1ZVN0cmluZykKLSAgewotICAgIGNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpOwotICAgIHZhciBxdWVyeUluZm9JdGVtTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxdWVyeUluZm9JdGVtTGlzdCIpOwotICAgIHZhciBzZWFyY2hGb3JJbmRleCA9IHBhcnNlSW50KHNlYXJjaEZvclZhbHVlU3RyaW5nKTsKLSAgICBmb3IgKHZhciBpPTA7aTxzZWN0aW9uSWRzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKGkgPT0gc2VhcmNoRm9ySW5kZXgpCi0gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlY3Rpb25JZHNbaV0pLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIGVsc2UKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VjdGlvbklkc1tpXSkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICB9Ci08JQotICAgaWYgKHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKS5sZW5ndGgoKSA8IDEpCi0gICB7Ci0lPgotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxdWVyeUluZm9JdGVtTGlzdCIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0lPgotICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgbG9hZFNjcmVlblRhYmxlLmRlbGV0ZVJvdygwKTsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dGaW5kRm9ybShxdWVyeUl0ZW1JbmRleCxzdHlsZSkKLSAgewotICAgIGNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpOwotICAgIHZhciBmaW5kU2VjdGlvbklkczsKLSAgICBzd2l0Y2ggKHF1ZXJ5SXRlbUluZGV4KQotICAgIHsKLSAgICAgIGNhc2UgPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPjoKLSAgICAgICAgZmluZFNlY3Rpb25JZHMgPSBmaW5kQnVzaW5lc3Nlc1NlY3Rpb25JZHM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPjoKLSAgICAgICAgZmluZFNlY3Rpb25JZHMgPSBmaW5kU2VydmljZXNTZWN0aW9uSWRzOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+OgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZmluZFNlY3Rpb25JZHMgPSBmaW5kU2VydmljZUludGVyZmFjZXNTZWN0aW9uSWRzOwotICAgIH0KLSAgICBmb3IgKHZhciBpPTA7aTxmaW5kU2VjdGlvbklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChpID09IHN0eWxlKQotICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaW5kU2VjdGlvbklkc1tpXSkuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgZWxzZQotICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaW5kU2VjdGlvbklkc1tpXSkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiB0b2dnbGVBZHZhbmNlZEF1dGhlbnRpY2F0aW9uU2VjdGlvbihxdWVyeUl0ZW1JbmRleCxpc0NoZWNrZWQpCi0gIHsKLSAgICBpZiAoaXNDaGVja2VkICYmIDwlPSFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSU+KQotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYXV0aGVudGljYXRpb25TZWN0aW9uSWRzW3F1ZXJ5SXRlbUluZGV4XSkuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIGVsc2UKLSAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGF1dGhlbnRpY2F0aW9uU2VjdGlvbklkc1txdWVyeUl0ZW1JbmRleF0pLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gIH0KLQotICBmdW5jdGlvbiB0b2dnbGVGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZFNlcnZpY2VQYXJhbWV0ZXJzKGZvcm0pCi0gIHsKLSAgICB2YXIgaXNVc2VTZXJ2aWNlQ2hlY2tlZCA9IGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9VU0VfU0VSVklDRSU+LmNoZWNrZWQ7Ci0gICAgdmFyIGlzT3duZWRDaGVja2VkID0gZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEJT4uY2hlY2tlZDsKLSAgICBpZiAoaXNVc2VTZXJ2aWNlQ2hlY2tlZCkKLSAgICB7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZXJ2aWNlU2VjdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZE93bmVkIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgIHRvZ2dsZUFkdmFuY2VkQXV0aGVudGljYXRpb25TZWN0aW9uKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPixmYWxzZSk7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWROYW1lRmluZFF1YWxpZmllcnNTZWN0aW9uIikuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZpbmRRdWFsaWZpZXJzU2VjdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZXJ2aWNlU2VjdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRPd25lZCIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIHRvZ2dsZUFkdmFuY2VkQXV0aGVudGljYXRpb25TZWN0aW9uKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPixpc093bmVkQ2hlY2tlZCk7Ci0gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWROYW1lRmluZFF1YWxpZmllcnNTZWN0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRmluZFF1YWxpZmllcnNTZWN0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIH0KLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iIG9uVW5sb2FkPSJjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKSI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAidWRkaS9pbWFnZXMvZmluZF9oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlOwotICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpOwotICAgaWYgKHN1YlF1ZXJ5S2V5ICE9IG51bGwgJiYgc3ViUXVlcnlLZXkubGVuZ3RoKCkgPiAwKQotICAgewotICAgICBpbnQgcXVlcnlJdGVtID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNKSk7Ci0gICAgIHN3aXRjaCAocXVlcnlJdGVtKQotICAgICB7Ci0gICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUzoKLSAgICAgICAgIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVUJRVUVSWSIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTRVMiKSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUzoKLSAgICAgICAgIHRpdGxlID0gdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TVUJRVUVSWSIsdWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VTIikpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICB0aXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1VCUVVFUlkiLHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFX0lOVEVSRkFDRVMiKSk7Ci0gICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgICAgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0ZJTkQiKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvdWRkaS9mb3Jtcy9maW5kZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICA8bGFiZWwgZm9yPSJxdWVyeU5hbWUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1FVRVJZX05BTUUiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD4gPGlucHV0IGlkPSJxdWVyeU5hbWUiIHR5cGU9InRleHQiIHZhbHVlPSI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkRFRkFVTFRfUVVFUllfTkFNRSIpKSU+IiBjbGFzcz0idGV4dGVudGVyIj4gPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8ZGl2IGlkPSJxdWVyeUluZm9JdGVtTGlzdCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiB2YWxpZ249Im1pZGRsZSIgbm93cmFwIGhlaWdodD00MD4KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0ic2VhcmNoRm9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRUFSQ0hfRk9SIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBub3dyYXAgaGVpZ2h0PTQwPgotICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJzZWFyY2hGb3IiIG9uQ2hhbmdlPSJzaG93TWFpbkZvcm0odGhpcy52YWx1ZSkiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQlVTSU5FU1NFUyIpJT4KLSAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VTIiklPgotICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFUyIpJT4KLSAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIHdpZHRoPSI5MCUiIGhlaWdodD00MD4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kQnVzaW5lc3Nlc0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlc0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWJhZDJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgLy8gc2VsZWN0ZWROb2RlIGNvdWxkIGJlIHRoZSByZWdpc3RyeSBvciBxdWVyeSBub2Rlcy4KLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIHByb2Nlc3NGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZvcm0odGhpcykiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VUJT4iPiAgICAKLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX05BTUUlPiI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+IDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZJTkRfQURWQU5DRURfREVTQyIpJT4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImlucHV0X2ZpbmRfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZV91c2Vfc2VydmljZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9VU0VfU0VSVklDRSU+IiBvbkNsaWNrPSJ0b2dnbGVGaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZFNlcnZpY2VQYXJhbWV0ZXJzKHRoaXMuZm9ybSkiPjxsYWJlbCBmb3I9ImlucHV0X2ZpbmRfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZV91c2Vfc2VydmljZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVVNFX1NFUlZJQ0UiKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBTdHJpbmdbXSBzZXJ2aWNlU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX1NFUlZJQ0UiLEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMpLCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZCIsVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZXJ2aWNlIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoc2VydmljZVNwZWNpZmljSW5mbyk7Ci0lPgotPGRpdiBpZD0iZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRTZXJ2aWNlU2VjdGlvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9kaXY+Ci0gICAgPGRpdiBpZD0iZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRPd25lZCI+Ci0gICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGhlaWdodD0zNSB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJpbnB1dF9maW5kX3NlcnZpY2VfaW50ZXJmYWNlX2FkdmFuY2Vfb3duZWQiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfT1dORUQlPiIgb25DbGljaz0idG9nZ2xlQWR2YW5jZWRBdXRoZW50aWNhdGlvblNlY3Rpb24oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+LHRoaXMuY2hlY2tlZCkiPgotICAgICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfZmluZF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlX293bmVkIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9PV05FRCIpJT48L2xhYmVsPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZGl2PgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGRpdiBpZD0iZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWROYW1lIj4KLSAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X2ZpbmRfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZWRfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfZmluZF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlZF9uYW1lIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci08ZGl2IGlkPSJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZE5hbWVGaW5kUXVhbGlmaWVyc1NlY3Rpb24iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL25hbWVzX2ZpbmRRdWFsaWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgotICAgIDwvZGl2PgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRJZGVudGlmaWVycyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9pZGVudGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZENhdGVnb3JpZXMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvY2F0ZWdvcmllc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZUludGVyZmFjZXNBZHZhbmNlZEZpbmRRdWFsaWZpZXJzIik7Ci0lPgotPGRpdiBpZD0iZmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGaW5kUXVhbGlmaWVyc1NlY3Rpb24iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2ZpbmRRdWFsaWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2FkdmFuY2VkQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZWQ5YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxkaXYgaWQ9ImZpbmRTZXJ2aWNlSW50ZXJmYWNlcyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBuYW1lPSJmaW5kU2VydmljZUludGVyZmFjZXNTdHlsZSI+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+IDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NFQVJDSF9UWVBFIiklPiA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9InJhZGlvX2ZpbmRfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyU+IiBvbkNsaWNrPSJzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT4pIj48bGFiZWwgZm9yPSJyYWRpb19maW5kX3NlcnZpY2VfaW50ZXJmYWNlX3NpbXBsZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU0lNUExFIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fZmluZF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyU+IiBvbkNsaWNrPSJzaG93RmluZEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQlPikiPjxsYWJlbCBmb3I9InJhZGlvX2ZpbmRfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fQURWQU5DRUQiKSU+PC9sYWJlbD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19maW5kX3NlcnZpY2VfaW50ZXJmYWNlX3V1aWQiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTJT4iIG9uQ2xpY2s9InNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9VVUlEJT4pIj48bGFiZWwgZm9yPSJyYWRpb19maW5kX3NlcnZpY2VfaW50ZXJmYWNlX3V1aWQiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX1VVSUQiKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9mb3JtPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc1NpbXBsZUZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRTZXJ2aWNlSW50ZXJmYWNlVVVJRCIpOwotICAgU3RyaW5nW10gb3RoZXJQcm9wZXJ0aWVzID0geyJ1ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VVVUlEQWN0aW9uSlNQLmpzcCIsVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSwiRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFX1VVSURfREVTQyJ9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG90aGVyUHJvcGVydGllcyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ0ZpbmRVVUlERm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1OTM0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VJbnRlcmZhY2VzU2ltcGxlRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgLy8gc2VsZWN0ZWROb2RlIGNvdWxkIGJlIHRoZSByZWdpc3RyeSBvciBxdWVyeSBub2Rlcy4KLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJmaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWdGaW5kU2VydmljZUludGVyZmFjZXNTaW1wbGVBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfS0VZJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfSU5URVJGQUNFU19TSU1QTEVfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X2ZpbmRfc2VydmljZV9pbnRlcmZhY2VzX3NpbXBsZV9uYW1lIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvbGFiZWw+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfZmluZF9zZXJ2aWNlX2ludGVyZmFjZXNfc2ltcGxlX25hbWUiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlc0FkdmFuY2VkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5NzZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08ZGl2IGlkPSJmaW5kU2VydmljZXNBZHZhbmNlZCI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnRmluZFNlcnZpY2VzQWR2YW5jZWRBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0ZpbmRTZXJ2aWNlc0FkdmFuY2VkRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVklPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQlPiI+ICAgIAotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX0lOSVRJQVRFRCU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9RVUVSWV9JVEVNJT4iPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfTkFNRSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9IjkwJSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9GSU5EX0FEVkFOQ0VEX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGhlaWdodD0zNSB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iaW5wdXRfZmluZF9zZXJ2aWNlc19hZHZhbmNlX293bmVkIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX09XTkVEJT4iIG9uQ2xpY2s9InRvZ2dsZUFkdmFuY2VkQXV0aGVudGljYXRpb25TZWN0aW9uKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyU+LHRoaXMuY2hlY2tlZCkiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X2ZpbmRfc2VydmljZXNfYWR2YW5jZV9vd25lZCI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfT1dORUQiKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRTZXJ2aWNlc0FkdmFuY2VkQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIFN0cmluZ1tdIGJ1c1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9CVVNJTkVTUyIsQm9vbGVhbi5GQUxTRS50b1N0cmluZygpLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSwiZmluZFNlcnZpY2VzQWR2YW5jZWQiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU307Ci0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRTZXJ2aWNlc0FkdmFuY2VkQnVzaW5lc3MiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhidXNTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZXNBZHZhbmNlZE5hbWVzIik7Ci0gICBTdHJpbmdbXSBuYW1lU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX05BTUVTIiwiRk9STV9MQUJFTF9OQU1FIixCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG5hbWVTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9sYW5ndWFnZUlucHV0X3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoImZpbmRTZXJ2aWNlc0FkdmFuY2VkQ2F0ZWdvcmllcyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBTdHJpbmdbXSBzaVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVMiLEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTKSwiZmluZFNlcnZpY2VzQWR2YW5jZWQiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVN9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZXNBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2VzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoc2lTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZXNBZHZhbmNlZEZpbmRRdWFsaWZpZXJzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2ZpbmRRdWFsaWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hZHZhbmNlZENvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlc0Zvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlc0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTRmMzkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08ZGl2IGlkPSJmaW5kU2VydmljZXMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gbmFtZT0iZmluZFNlcnZpY2VzU3R5bGUiPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRUFSQ0hfVFlQRSIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19maW5kX3NlcnZpY2Vfc2ltcGxlIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRVMlPiIgb25DbGljaz0ic2hvd0ZpbmRGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT4pIj48bGFiZWwgZm9yPSJyYWRpb19maW5kX3NlcnZpY2Vfc2ltcGxlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19TSU1QTEUiKSU+PC9sYWJlbD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19maW5kX3NlcnZpY2VfYWR2YW5jZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTJT4iIG9uQ2xpY2s9InNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEJT4pIj48bGFiZWwgZm9yPSJyYWRpb19maW5kX3NlcnZpY2VfYWR2YW5jZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fQURWQU5DRUQiKSU+PC9sYWJlbD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19maW5kX3NlcnZpY2VfdXVpZCIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTJT4iIG9uQ2xpY2s9InNob3dGaW5kRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1VVSUQlPikiPjxsYWJlbCBmb3I9InJhZGlvX2ZpbmRfc2VydmljZV91dWlkIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19VVUlEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZm9ybT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNTaW1wbGVGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNBZHZhbmNlZEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJmaW5kU2VydmljZVVVSUQiKTsKLSAgIFN0cmluZ1tdIG90aGVyUHJvcGVydGllcyA9IHsidWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlVVVJREFjdGlvbkpTUC5qc3AiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSwiRk9STV9MQUJFTF9GSU5EX1NFUlZJQ0VfVVVJRF9ERVNDIn07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMob3RoZXJQcm9wZXJ0aWVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnRmluZFVVSURGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGI3MjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdGaW5kU2VydmljZXNTaW1wbGVGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICAvLyBzZWxlY3RlZE5vZGUgY291bGQgYmUgdGhlIHJlZ2lzdHJ5IG9yIHF1ZXJ5IG5vZGVzLgotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9ImZpbmRTZXJ2aWNlc1NpbXBsZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlZ0ZpbmRTZXJ2aWNlc1NpbXBsZUFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVklPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZJTkRfU0VSVklDRVNfU0lNUExFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9maW5kX3NlcnZpY2VzX3NpbXBsZV9uYW1lIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvbGFiZWw+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4gPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9maW5kX3NlcnZpY2VzX3NpbXBsZV9uYW1lIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ0ZpbmRVVUlERm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFVVSURGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzOWRiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnRmluZFVVSURGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgLy8gc2VsZWN0ZWROb2RlIGNvdWxkIGJlIHRoZSByZWdpc3RyeSBvciBxdWVyeSBub2Rlcy4KLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSAgIAotICAgU3RyaW5nIGZvcm1Db250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdbXSBvdGhlclByb3BlcnRpZXMgPSAoU3RyaW5nW10pKHNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpKTsKLSAgIFN0cmluZyBhY3Rpb25MaW5rID0gKFN0cmluZylvdGhlclByb3BlcnRpZXNbMF07Ci0gICBTdHJpbmcgdXVpZEVudHJ5S2V5ID0gKFN0cmluZylvdGhlclByb3BlcnRpZXNbMV07Ci0gICBTdHJpbmcgZGVzY3JpcHRpb25LZXkgPSAoU3RyaW5nKW90aGVyUHJvcGVydGllc1syXTsKLSU+Ci08ZGl2IGlkPSI8JT1mb3JtQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChhY3Rpb25MaW5rKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9LRVklPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9OQU1FJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKGRlc2NyaXB0aW9uS2V5KSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSI8JT0oZm9ybUNvbnRhaW5lcklkKyJfaW5wdXRfdXVpZF9rZXkiKSU+Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VVUlEX0tFWSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQodXVpZEVudHJ5S2V5KSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iPCU9KGZvcm1Db250YWluZXJJZCsiX2lucHV0X3V1aWRfa2V5IiklPiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0tFWSU+IiBjbGFzcz0idGV4dGVudGVyIj4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGUxYTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic3ViUXVlcnlLZXlQcm9wZXJ0eSIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLlN1YlF1ZXJ5S2V5UHJvcGVydHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSk7Ci0lPgotPGRpdiBpZD0icHVibGlzaEJ1c2luZXNzQWR2YW5jZWQiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWdQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRGb3JtKHRoaXMpIj4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX0JVU0lORVNTX0FEVkFOQ0VEX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEF1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkTmFtZXMiKTsKLSAgIFN0cmluZ1tdIG5hbWVTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfTkFNRVMiLCJGT1JNX0xBQkVMX05BTUUiLFN0cmluZy52YWx1ZU9mKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTKSl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG5hbWVTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9sYW5ndWFnZUlucHV0X3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGVzY3JpcHRpb25zIik7Ci0gICBTdHJpbmdbXSBkZXNjU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OUyIsIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iLFN0cmluZy52YWx1ZU9mKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUykpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhkZXNjU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZElkZW50aWZpZXJzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2lkZW50aWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQ2F0ZWdvcmllcyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGlzY292ZXJ5VVJMcyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG5ldyBCb29sZWFuKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RJU0NPVkVSWVVSTFMpKSk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2Rpc2NvdmVyeVVSTHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgIAotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoQnVzaW5lc3NGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoQnVzaW5lc3NGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMzBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGRpdiBpZD0icHVibGlzaEJ1c2luZXNzIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIG5hbWU9InB1Ymxpc2hCdXNpbmVzc1N0eWxlIj4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUFVCTElTSF9GT1JNIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9InJhZGlvX3B1Ymxpc2hfYnVzaW5lc3Nfc2ltcGxlIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQlVTSU5FU1NFUyU+IiBvbkNsaWNrPSJzaG93UHVibGlzaEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+KSI+PGxhYmVsIGZvcj0icmFkaW9fcHVibGlzaF9idXNpbmVzc19zaW1wbGUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX1NJTVBMRSIpJT48L2xhYmVsPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9InJhZGlvX3B1Ymxpc2hfYnVzaW5lc3NfYWR2YW5jZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0JVU0lORVNTRVMlPiIgb25DbGljaz0ic2hvd1B1Ymxpc2hGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fcHVibGlzaF9idXNpbmVzc19hZHZhbmNlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19BRFZBTkNFRCIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Zvcm0+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzU2ltcGxlRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzQWR2YW5jZWRGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE5M2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoQnVzaW5lc3NTaW1wbGVGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hCdXNpbmVzc1NpbXBsZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hCdXNpbmVzc1NpbXBsZUFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBoYW5kbGVTdWJtaXQodGhpcykiPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfQlVTSU5FU1NfU0lNUExFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoQnVzaW5lc3NTaW1wbGVBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfcHVibGlzaF9idXNpbmVzc19zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X3B1Ymxpc2hfYnVzaW5lc3Nfc2ltcGxlX25hbWUiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX0JVU0lORVNTX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfcHVibGlzaF9idXNpbmVzc19zaW1wbGVfZGVzYyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4gPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9wdWJsaXNoX2J1c2luZXNzX3NpbXBsZV9kZXNjIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19ERVNDUklQVElPTiU+IiBjbGFzcz0idGV4dGVudGVyIj4gPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwNGM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTgzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgLy8gc2VsZWN0ZWROb2RlIG11c3QgYmUgYSByZWdpc3RyeSBub2RlLgotICAgTm9kZSByZWdOb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShyZWdOb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSU+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgU3RyaW5nIHN1YlF1ZXJ5S2V5ID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlNVQlFVRVJZX0tFWSk7Ci0gICBzdWJRdWVyeUtleVByb3BlcnR5LnNldFN1YlF1ZXJ5S2V5KHN1YlF1ZXJ5S2V5KTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPCUKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKChNdWx0aXBsZUZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSlmb3JtVG9vbCkuZ2V0Rm9ybVRvb2xQcm9wZXJ0aWVzKHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSk7Ci0gICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1JFR0lTVFJZX1BVQkxJU0giKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgc2VjdGlvbklkcyA9IFsicHVibGlzaEJ1c2luZXNzIiwicHVibGlzaFNlcnZpY2UiLCJwdWJsaXNoU2VydmljZUludGVyZmFjZSJdOwotICB2YXIgcHVibGlzaEJ1c2luZXNzU2VjdGlvbklkcyA9IFsicHVibGlzaEJ1c2luZXNzU2ltcGxlIiwicHVibGlzaEJ1c2luZXNzQWR2YW5jZWQiXTsKLSAgdmFyIHB1Ymxpc2hTZXJ2aWNlU2VjdGlvbklkcyA9IFsicHVibGlzaFNlcnZpY2VTaW1wbGUiLCJwdWJsaXNoU2VydmljZUFkdmFuY2VkIl07Ci0gIHZhciBwdWJsaXNoU2VydmljZUludGVyZmFjZVNlY3Rpb25JZHMgPSBbInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlIiwicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZCJdOwotICB2YXIgc3R5bGVGb3JtcyA9IFsicHVibGlzaEJ1c2luZXNzU3R5bGUiLCJwdWJsaXNoU2VydmljZVN0eWxlIiwicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTdHlsZSJdOwotCi0gIGZ1bmN0aW9uIHByb2Nlc3NQdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEZvcm0oZm9ybSkKLSAgewotICAgIGlmIChoYW5kbGVTdWJtaXQoZm9ybSkpCi0gICAgewotICAgICAgcHJvY2Vzc0xhbmd1YWdlSW5wdXRUYWJsZSgicHVibGlzaEJ1c2luZXNzQWR2YW5jZWROYW1lcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfTkFNRV9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0xhbmd1YWdlSW5wdXRUYWJsZSgicHVibGlzaEJ1c2luZXNzQWR2YW5jZWREZXNjcmlwdGlvbnMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0lkZW50aWZpZXJUYWJsZSgicHVibGlzaEJ1c2luZXNzQWR2YW5jZWRJZGVudGlmaWVycyIsZm9ybSk7Ci0gICAgICBwcm9jZXNzQ2F0ZWdvcnlUYWJsZSgicHVibGlzaEJ1c2luZXNzQWR2YW5jZWRDYXRlZ29yaWVzIixmb3JtLGZhbHNlKTsKLSAgICAgIHByb2Nlc3NEaXNjb3ZlcnlVUkxUYWJsZSgicHVibGlzaEJ1c2luZXNzQWR2YW5jZWREaXNjb3ZlcnlVUkxzIixmb3JtKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzUHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NSZXN1bHRUYWJsZSgicHVibGlzaFNlcnZpY2VTaW1wbGVCdXNpbmVzcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuTk9ERUlEX0JVU0lORVNTJT4iLGZvcm0sZmFsc2UpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NQdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybShmb3JtKQotICB7Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBwcm9jZXNzUmVzdWx0VGFibGUoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRCdXNpbmVzcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuTk9ERUlEX0JVU0lORVNTJT4iLGZvcm0sZmFsc2UpOwotICAgICAgcHJvY2Vzc1Jlc3VsdFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkU2VydmljZUludGVyZmFjZSIsIjwlPVVERElBY3Rpb25JbnB1dHMuTk9ERUlEX1NFUlZJQ0VfSU5URVJGQUNFJT4iLGZvcm0sZmFsc2UpOwotICAgICAgcHJvY2Vzc0xhbmd1YWdlSW5wdXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUlPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzTGFuZ3VhZ2VJbnB1dFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zIiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTiU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NDYXRlZ29yeVRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQ2F0ZWdvcmllcyIsZm9ybSxmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NMYW5ndWFnZUlucHV0VGFibGUoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWREZXNjcmlwdGlvbnMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0RFU0NSSVBUSU9OJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0lkZW50aWZpZXJUYWJsZSgicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZElkZW50aWZpZXJzIixmb3JtKTsKLSAgICAgIHByb2Nlc3NDYXRlZ29yeVRhYmxlKCJwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkQ2F0ZWdvcmllcyIsZm9ybSxmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci0gICAgdmFyIHB1Ymxpc2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHVibGlzaCIpOwotICAgIHB1Ymxpc2guc2VsZWN0ZWRJbmRleCA9IDwlPWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNKSU+OwotICAgIHNldERlZmF1bHRzRm9yUHVibGlzaEJ1c2luZXNzRm9ybXMoKTsKLSAgICBzZXREZWZhdWx0c0ZvclB1Ymxpc2hTZXJ2aWNlRm9ybXMoKTsKLSAgICBzZXREZWZhdWx0c0ZvclB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlRm9ybXMoKTsKLTwlCi0gICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgewotJT4KLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHVibGlzaEJ1c2luZXNzU2ltcGxlQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB1Ymxpc2hTZXJ2aWNlU2ltcGxlQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVBdXRoZW50aWNhdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEF1dGhlbnRpY2F0aW9uIikuc3R5bGUuZGlzcGxheSA9ICIiOwotPCUKLSAgIH0KLSU+Ci0gICAgc2hvd01haW5Gb3JtKHB1Ymxpc2gudmFsdWUpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMoZm9ybSkKLSAgewotPCUKLSAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgIFN0cmluZyB1c2VySWQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKTsKLSAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0lPgotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwdWJsaXNoVVJMKSU+IjsKLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJJZCklPiI7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHBhc3N3b3JkKSU+IjsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldERlZmF1bHRzRm9yUHVibGlzaEJ1c2luZXNzRm9ybXMoKQotICB7Ci0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcHVibGlzaEJ1c2luZXNzIGZvcm0uCi08JQotICAgU3RyaW5nIHB1Ymxpc2hCdXNpbmVzc1N0eWxlSW5kZXggPSAoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTKTsKLSU+Ci0gICAgZG9jdW1lbnQuZm9ybXNbc3R5bGVGb3Jtc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+XV0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9CVVNJTkVTU0VTJT5bPCU9cHVibGlzaEJ1c2luZXNzU3R5bGVJbmRleCU+XS5jaGVja2VkID0gdHJ1ZTsKLSAgICB2YXIgcHVibGlzaEJ1c2luZXNzU2ltcGxlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHB1Ymxpc2hCdXNpbmVzc1NlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUlPl0pOwotICAgIHZhciBwdWJsaXNoQnVzaW5lc3NTaW1wbGVGb3JtID0gcHVibGlzaEJ1c2luZXNzU2ltcGxlU2VjdGlvbi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpLml0ZW0oMCk7Ci0gICAgc2V0QXV0aGVudGljYXRpb25TZWN0aW9uRGVmYXVsdHMocHVibGlzaEJ1c2luZXNzU2ltcGxlRm9ybSk7Ci0gICAgcHVibGlzaEJ1c2luZXNzU2ltcGxlRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19OQU1FKSklPiI7Ci0gICAgcHVibGlzaEJ1c2luZXNzU2ltcGxlRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9CVVNJTkVTU19ERVNDUklQVElPTiU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfQlVTSU5FU1NfREVTQ1JJUFRJT04pKSU+IjsKLQotICAgIC8vIEFkdmFuY2VkIGZvcm0gZGV0YWlscy4KLSAgICB2YXIgcHVibGlzaEJ1c2luZXNzQWR2YW5jZWRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHVibGlzaEJ1c2luZXNzU2VjdGlvbklkc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX0FEVkFOQ0VEJT5dKTsKLSAgICB2YXIgcHVibGlzaEJ1c2luZXNzQWR2YW5jZWRGb3JtID0gcHVibGlzaEJ1c2luZXNzQWR2YW5jZWRTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZEZvcm0pOwotICAgIHZhciBwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZE5hbWVzVGFibGUgPSBnZXRUYWJsZSgicHVibGlzaEJ1c2luZXNzQWR2YW5jZWROYW1lcyIpOwotICAgIHZhciBwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERlc2NyaXB0aW9uc1RhYmxlID0gZ2V0VGFibGUoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGVzY3JpcHRpb25zIik7Ci0gICAgdmFyIHB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGlzY292ZXJ5VVJMc1RhYmxlID0gZ2V0VGFibGUoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGlzY292ZXJ5VVJMcyIpOwotPCUKLSAgIFZlY3RvciBidXNOYW1lVmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfTkFNRVMpOwotICAgaWYgKGJ1c05hbWVWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8YnVzTmFtZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTmFtZSBuYW1lID0gKE5hbWUpYnVzTmFtZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZExhbmd1YWdlSW5wdXRSb3coInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkTmFtZXMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiKSklPiIpOwotICAgIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncygicHVibGlzaEJ1c2luZXNzQWR2YW5jZWROYW1lcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRMYW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKCFmb3JtVG9vbFBJLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX05BTUVTLGkpKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkTmFtZXNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRyb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIFZlY3RvciBidXNEZXNjcmlwdGlvblZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0JVU0lORVNTX0RFU0NSSVBUSU9OUyk7Ci0gICBpZiAoYnVzRGVzY3JpcHRpb25WZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8YnVzRGVzY3JpcHRpb25WZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKERlc2NyaXB0aW9uKWJ1c0Rlc2NyaXB0aW9uVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkTGFuZ3VhZ2VJbnB1dFJvdygicHVibGlzaEJ1c2luZXNzQWR2YW5jZWREZXNjcmlwdGlvbnMiLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFIikpJT4iKTsKLSAgICBzZXRMYW5ndWFnZUlucHV0Um93U2V0dGluZ3MoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGVzY3JpcHRpb25zIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbi5nZXRMYW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24uZ2V0VGV4dCgpKSU+Iik7Ci08JQotICAgICAgIGlmICghZm9ybVRvb2xQSS5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ERVNDUklQVElPTlMsaSkpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3cocHVibGlzaEJ1c2luZXNzQWR2YW5jZWREZXNjcmlwdGlvbnNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRyb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIElkZW50aWZpZXJCYWcgYnVzSWRCYWcgPSAoSWRlbnRpZmllckJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfSURFTlRJRklFUlMpOwotICAgaWYgKGJ1c0lkQmFnICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBrZXllZFJlZmVyZW5jZVZlY3RvciA9IGJ1c0lkQmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGtleWVkUmVmZXJlbmNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlrZXllZFJlZmVyZW5jZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZElkZW50aWZpZXJSb3coInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkSWRlbnRpZmllcnMiKTsKLSAgICBzZXRJZGVudGlmaWVyUm93U2V0dGluZ3MoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkSWRlbnRpZmllcnMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0KLSAgIENhdGVnb3J5QmFnIGJ1c0NhdEJhZyA9IChDYXRlZ29yeUJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfQ0FURUdPUklFUyk7Ci0gICBpZiAoYnVzQ2F0QmFnICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBrZXllZFJlZmVyZW5jZVZlY3RvciA9IGJ1c0NhdEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxrZXllZFJlZmVyZW5jZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2Upa2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRDYXRlZ29yeVJvdygicHVibGlzaEJ1c2luZXNzQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0gICAgc2V0Q2F0ZWdvcnlSb3dTZXR0aW5ncygicHVibGlzaEJ1c2luZXNzQWR2YW5jZWRDYXRlZ29yaWVzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotICAKLSAgIERpc2NvdmVyeVVSTHMgZGlzY292ZXJ5VVJMcyA9IChEaXNjb3ZlcnlVUkxzKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9CVVNJTkVTU19ESVNDT1ZFUllVUkxTKTsKLSAgIGlmIChkaXNjb3ZlcnlVUkxzICE9IG51bGwpCi0gICB7Ci0gICAgIFZlY3RvciBkaXNjb3ZlcnlVUkxWZWN0b3IgPSBkaXNjb3ZlcnlVUkxzLmdldERpc2NvdmVyeVVSTFZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxkaXNjb3ZlcnlVUkxWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIERpc2NvdmVyeVVSTCBkaXNjb3ZlcnlVUkwgPSAoRGlzY292ZXJ5VVJMKWRpc2NvdmVyeVVSTFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZERpc2NvdmVyeVVSTFJvdygicHVibGlzaEJ1c2luZXNzQWR2YW5jZWREaXNjb3ZlcnlVUkxzIik7Ci0gICAgc2V0RGlzY292ZXJ5VVJMUm93U2V0dGluZ3MoInB1Ymxpc2hCdXNpbmVzc0FkdmFuY2VkRGlzY292ZXJ5VVJMcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGlzY292ZXJ5VVJMLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoIWZvcm1Ub29sUEkuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQlVTSU5FU1NfRElTQ09WRVJZVVJMUyxpKSkKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhwdWJsaXNoQnVzaW5lc3NBZHZhbmNlZERpc2NvdmVyeVVSTHNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRyb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0lPiAgICAgICAKLSAgICBzaG93UHVibGlzaEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPiw8JT1wdWJsaXNoQnVzaW5lc3NTdHlsZUluZGV4JT4pOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHNGb3JQdWJsaXNoU2VydmljZUZvcm1zKCkKLSAgewotPCUKLSAgIFN0cmluZyBwdWJsaXNoU2VydmljZVN0eWxlSW5kZXggPSAoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyk7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zW3N0eWxlRm9ybXNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT5dXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTJT5bPCU9cHVibGlzaFNlcnZpY2VTdHlsZUluZGV4JT5dLmNoZWNrZWQgPSB0cnVlOwotICAgIHZhciBwdWJsaXNoU2VydmljZVNpbXBsZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwdWJsaXNoU2VydmljZVNlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TSU1QTEUlPl0pOwotICAgIHZhciBwdWJsaXNoU2VydmljZVNpbXBsZUZvcm0gPSBwdWJsaXNoU2VydmljZVNpbXBsZVNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKHB1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybSk7Ci08JQotICAgVmVjdG9yIHNlcnZpY2VCdXNpbmVzcyA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTKTsKLSAgIFZlY3RvciBzZXJ2aWNlQnVzaW5lc3NDb3B5ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSk7Ci0gICBpZiAoc2VydmljZUJ1c2luZXNzICE9IG51bGwpCi0gICB7Ci0gICAgIGlmIChzZXJ2aWNlQnVzaW5lc3NDb3B5ID09IG51bGwpCi0gICAgICAgc2VydmljZUJ1c2luZXNzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZWxzZQotICAgICAgIHNlcnZpY2VCdXNpbmVzc0NvcHkucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZUJ1c2luZXNzLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBMaXN0RWxlbWVudCBsaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClzZXJ2aWNlQnVzaW5lc3MuZWxlbWVudEF0KGkpOwotICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0VG9vbElkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0VG9vbElkKCk7Ci0gICAgICAgaW50IHRhcmdldFZpZXdJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpOwotICAgICAgIFN0cmluZyB1cmwgPSBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCxzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTUyxpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTLGZhbHNlKTsKLSAgICAgICBCdXNpbmVzc0VudGl0eSBiZSA9IChCdXNpbmVzc0VudGl0eSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBzZXJ2aWNlQnVzaW5lc3NDb3B5LmFkZEVsZW1lbnQoc2VydmljZUJ1c2luZXNzLmVsZW1lbnRBdChpKSk7Ci0lPgotICAgIGFkZFJlc3VsdFJvdygicHVibGlzaFNlcnZpY2VTaW1wbGVCdXNpbmVzcyIsPCU9dGFyZ2V0Tm9kZUlkJT4sIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGJlLmdldERlZmF1bHROYW1lU3RyaW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoYmUuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTX0NPUFksc2VydmljZUJ1c2luZXNzQ29weSk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIHNlcnZpY2VCdXNpbmVzcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgc2VydmljZUJ1c2luZXNzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTLHNlcnZpY2VCdXNpbmVzcyk7Ci0gICAgIGZvcm1Ub29sUEkuc2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9CVVNJTkVTU19DT1BZLHNlcnZpY2VCdXNpbmVzc0NvcHkpOwotICAgfQotJT4KLTwlCi0gICBWZWN0b3Igc2VydmljZUludGVyZmFjZXMgPSAoVmVjdG9yKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyk7Ci0gICBWZWN0b3Igc2VydmljZUludGVyZmFjZXNDb3B5ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSk7Ci0gICBpZiAoc2VydmljZUludGVyZmFjZXMgIT0gbnVsbCkKLSAgIHsKLSAgICAgaWYgKHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9PSBudWxsKQotICAgICAgIHNlcnZpY2VJbnRlcmZhY2VzQ29weSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgZWxzZQotICAgICAgIHNlcnZpY2VJbnRlcmZhY2VzQ29weS5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlSW50ZXJmYWNlcy5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpc2VydmljZUludGVyZmFjZXMuZWxlbWVudEF0KGkpOwotICAgICAgIGludCB0YXJnZXROb2RlSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXROb2RlSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0VG9vbElkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0VG9vbElkKCk7Ci0gICAgICAgaW50IHRhcmdldFZpZXdJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpOwotICAgICAgIFN0cmluZyB1cmwgPSBTZWxlY3RTdWJRdWVyeUl0ZW1BY3Rpb24uZ2V0QWN0aW9uTGluayh0YXJnZXROb2RlSWQsdGFyZ2V0VG9vbElkLHRhcmdldFZpZXdJZCxzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCksVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1NFUlZJQ0VfSU5URVJGQUNFUyxpLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMsZmFsc2UpOwotICAgICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKWxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgICAgIHNlcnZpY2VJbnRlcmZhY2VzQ29weS5hZGRFbGVtZW50KHNlcnZpY2VJbnRlcmZhY2VzLmVsZW1lbnRBdChpKSk7Ci0lPgotICAgIGFkZFJlc3VsdFJvdygicHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlcnZpY2VJbnRlcmZhY2UiLDwlPXRhcmdldE5vZGVJZCU+LCI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodXJsKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh0TW9kZWwuZ2V0TmFtZVN0cmluZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHRNb2RlbC5nZXREZWZhdWx0RGVzY3JpcHRpb25TdHJpbmcoKSklPiIpOwotPCUKLSAgICAgfQotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSxzZXJ2aWNlSW50ZXJmYWNlc0NvcHkpOwotICAgfQotICAgZWxzZQotICAgewotICAgICBzZXJ2aWNlSW50ZXJmYWNlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgc2VydmljZUludGVyZmFjZXNDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMsc2VydmljZUludGVyZmFjZXMpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVNfQ09QWSxzZXJ2aWNlSW50ZXJmYWNlc0NvcHkpOwotICAgfQotJT4KLSAgICBwdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX1dTRExfVVJMKSklPiI7Ci0gICAgcHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfTkFNRSU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FKSklPiI7Ci0gICAgcHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfREVTQ1JJUFRJT04lPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfREVTQ1JJUFRJT04pKSU+IjsKLQotICAgIC8vIEFkdmFuY2VkIGZvcm0gZGV0YWlscy4KLSAgICB2YXIgcHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwdWJsaXNoU2VydmljZVNlY3Rpb25JZHNbPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+XSk7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtID0gcHVibGlzaFNlcnZpY2VBZHZhbmNlZFNlY3Rpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZvcm0iKS5pdGVtKDApOwotICAgIHNldEF1dGhlbnRpY2F0aW9uU2VjdGlvbkRlZmF1bHRzKHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtKTsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzVGFibGUgPSBnZXRUYWJsZSgicHVibGlzaFNlcnZpY2VBZHZhbmNlZE5hbWVzIik7Ci0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWREZXNjcmlwdGlvbnNUYWJsZSA9IGdldFRhYmxlKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zIik7Ci08JQotICAgc2VydmljZUJ1c2luZXNzID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyk7Ci0gICBzZXJ2aWNlQnVzaW5lc3NDb3B5ID0gKFZlY3Rvcilmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU19DT1BZKTsKLSAgIGlmIChzZXJ2aWNlQnVzaW5lc3MgIT0gbnVsbCkKLSAgIHsKLSAgICAgaWYgKHNlcnZpY2VCdXNpbmVzc0NvcHkgPT0gbnVsbCkKLSAgICAgICBzZXJ2aWNlQnVzaW5lc3NDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBlbHNlCi0gICAgICAgc2VydmljZUJ1c2luZXNzQ29weS5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlQnVzaW5lc3Muc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KXNlcnZpY2VCdXNpbmVzcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgaW50IHRhcmdldE5vZGVJZCA9IGxpc3RFbGVtZW50LmdldFRhcmdldE5vZGVJZCgpOwotICAgICAgIGludCB0YXJnZXRUb29sSWQgPSBsaXN0RWxlbWVudC5nZXRUYXJnZXRUb29sSWQoKTsKLSAgICAgICBpbnQgdGFyZ2V0Vmlld0lkID0gbGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCk7Ci0gICAgICAgU3RyaW5nIHVybCA9IFNlbGVjdFN1YlF1ZXJ5SXRlbUFjdGlvbi5nZXRBY3Rpb25MaW5rKHRhcmdldE5vZGVJZCx0YXJnZXRUb29sSWQsdGFyZ2V0Vmlld0lkLHN1YlF1ZXJ5S2V5UHJvcGVydHkuZ2V0U3ViUXVlcnlLZXkoKSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1MsaSxVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyxmYWxzZSk7Ci0gICAgICAgQnVzaW5lc3NFbnRpdHkgYmUgPSAoQnVzaW5lc3NFbnRpdHkpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgc2VydmljZUJ1c2luZXNzQ29weS5hZGRFbGVtZW50KHNlcnZpY2VCdXNpbmVzcy5lbGVtZW50QXQoaSkpOwotJT4KLSAgICBhZGRSZXN1bHRSb3coInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRCdXNpbmVzcyIsPCU9dGFyZ2V0Tm9kZUlkJT4sIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh1cmwpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGJlLmdldERlZmF1bHROYW1lU3RyaW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoYmUuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgICAgZm9ybVRvb2xQSS5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1NfQ09QWSxzZXJ2aWNlQnVzaW5lc3NDb3B5KTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgc2VydmljZUJ1c2luZXNzID0gbmV3IFZlY3RvcigpOwotICAgICBzZXJ2aWNlQnVzaW5lc3NDb3B5ID0gbmV3IFZlY3RvcigpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTUyxzZXJ2aWNlQnVzaW5lc3MpOwotICAgICBmb3JtVG9vbFBJLnNldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU19DT1BZLHNlcnZpY2VCdXNpbmVzc0NvcHkpOwotICAgfQotJT4KLSAgICBwdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCkpJT4iOwotPCUKLSAgIFZlY3RvciBzZXJ2aWNlTmFtZVZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpOwotICAgaWYgKHNlcnZpY2VOYW1lVmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPHNlcnZpY2VOYW1lVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlzZXJ2aWNlTmFtZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZExhbmd1YWdlSW5wdXRSb3coInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lcyIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX05BTUVfVEVYVF9WQUxVRSIpKSU+Iik7Ci0gICAgc2V0TGFuZ3VhZ2VJbnB1dFJvd1NldHRpbmdzKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUuZ2V0TGFuZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUuZ2V0VGV4dCgpKSU+Iik7Ci08JQotICAgICAgIGlmICghZm9ybVRvb2xQSS5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX05BTUVTLGkpKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWROYW1lc1RhYmxlLnJvd3NbPCU9aSU+K251bWJlck9mSGVhZGVyUm93c10sImVycmFudHJvdyIpOwotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgVmVjdG9yIHNlcnZpY2VEZXNjcmlwdGlvblZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfREVTQ1JJUFRJT05TKTsKLSAgIGlmIChzZXJ2aWNlRGVzY3JpcHRpb25WZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8c2VydmljZURlc2NyaXB0aW9uVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilzZXJ2aWNlRGVzY3JpcHRpb25WZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRMYW5ndWFnZUlucHV0Um93KCJwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfREVTQ1JJUFRJT05fVEVYVF9WQUxVRSIpKSU+Iik7Ci0gICAgc2V0TGFuZ3VhZ2VJbnB1dFJvd1NldHRpbmdzKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbi5nZXRMYW5nKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24uZ2V0VGV4dCgpKSU+Iik7Ci08JQotICAgICAgIGlmICghZm9ybVRvb2xQSS5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyxpKSkKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhwdWJsaXNoU2VydmljZUFkdmFuY2VkRGVzY3JpcHRpb25zVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50cm93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBDYXRlZ29yeUJhZyBzZXJ2aWNlQ2F0QmFnID0gKENhdGVnb3J5QmFnKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0NBVEVHT1JJRVMpOwotICAgaWYgKHNlcnZpY2VDYXRCYWcgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGtleWVkUmVmZXJlbmNlVmVjdG9yID0gc2VydmljZUNhdEJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpOwotICAgICBmb3IgKGludCBpPTA7aTxrZXllZFJlZmVyZW5jZVZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2Upa2V5ZWRSZWZlcmVuY2VWZWN0b3IuZWxlbWVudEF0KGkpOwotJT4KLSAgICBhZGRDYXRlZ29yeVJvdygicHVibGlzaFNlcnZpY2VBZHZhbmNlZENhdGVnb3JpZXMiKTsKLSAgICBzZXRDYXRlZ29yeVJvd1NldHRpbmdzKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQ2F0ZWdvcmllcyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0VE1vZGVsS2V5KCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5TmFtZSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleVZhbHVlKCkpJT4iKTsKLTwlCi0gICAgIH0KLSAgIH0KLSU+Ci0gICAgc2hvd1B1Ymxpc2hGb3JtKDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyU+LDwlPXB1Ymxpc2hTZXJ2aWNlU3R5bGVJbmRleCU+KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldERlZmF1bHRzRm9yUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VGb3JtcygpCi0gIHsKLTwlCi0gICBTdHJpbmcgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTdHlsZUluZGV4ID0gKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTKTsKLSU+Ci0gICAgZG9jdW1lbnQuZm9ybXNbc3R5bGVGb3Jtc1s8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT5dXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyU+WzwlPXB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU3R5bGVJbmRleCU+XS5jaGVja2VkID0gdHJ1ZTsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT5dKTsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVGb3JtID0gcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhwdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUZvcm0pOwotICAgIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlRm9ybS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKSklPiI7Ci0gICAgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVGb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpKSU+IjsKLSAgICBwdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT04lPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OKSklPiI7Ci0KLSAgICAvLyBBZHZhbmNlZCBmb3JtIGRldGFpbHMuCi0gICAgdmFyIHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTZWN0aW9uSWRzWzwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfQURWQU5DRUQlPl0pOwotICAgIHZhciBwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRm9ybSA9IHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRTZWN0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBzZXRBdXRoZW50aWNhdGlvblNlY3Rpb25EZWZhdWx0cyhwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRm9ybSk7Ci0gICAgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEZvcm0uPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKSklPiI7Ci0gICAgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpKSU+IjsKLSAgICB2YXIgcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZERlc2NyaXB0aW9uc1RhYmxlID0gZ2V0VGFibGUoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWREZXNjcmlwdGlvbnMiKTsKLTwlCi0gICBWZWN0b3Igc2lEZXNjcmlwdGlvblZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2xQSS5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OUyk7Ci0gICBpZiAoc2lEZXNjcmlwdGlvblZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxzaURlc2NyaXB0aW9uVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbilzaURlc2NyaXB0aW9uVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkTGFuZ3VhZ2VJbnB1dFJvdygicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0RFU0NSSVBUSU9OX1RFWFRfVkFMVUUiKSklPiIpOwotICAgIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIsPCU9aSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24uZ2V0TGFuZygpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoIWZvcm1Ub29sUEkuaXNSb3dJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TLGkpKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWREZXNjcmlwdGlvbnNUYWJsZS5yb3dzWzwlPWklPitudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRyb3ciKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgIElkZW50aWZpZXJCYWcgc2lJZEJhZyA9IChJZGVudGlmaWVyQmFnKWZvcm1Ub29sUEkuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0gICBpZiAoc2lJZEJhZyAhPSBudWxsKQotICAgewotICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VWZWN0b3IgPSBzaUlkQmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPGtleWVkUmVmZXJlbmNlVmVjdG9yLnNpemUoKTtpKyspCi0gICAgIHsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlrZXllZFJlZmVyZW5jZVZlY3Rvci5lbGVtZW50QXQoaSk7Ci0lPgotICAgIGFkZElkZW50aWZpZXJSb3coInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRJZGVudGlmaWVycyIpOwotICAgIHNldElkZW50aWZpZXJSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZElkZW50aWZpZXJzIiw8JT1pJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotCi0gICBDYXRlZ29yeUJhZyBzaUNhdEJhZyA9IChDYXRlZ29yeUJhZylmb3JtVG9vbFBJLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfQ0FURUdPUklFUyk7Ci0gICBpZiAoc2lDYXRCYWcgIT0gbnVsbCkKLSAgIHsKLSAgICAgVmVjdG9yIGtleWVkUmVmZXJlbmNlVmVjdG9yID0gc2lDYXRCYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8a2V5ZWRSZWZlcmVuY2VWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIEtleWVkUmVmZXJlbmNlIGtyID0gKEtleWVkUmVmZXJlbmNlKWtleWVkUmVmZXJlbmNlVmVjdG9yLmVsZW1lbnRBdChpKTsKLSU+Ci0gICAgYWRkQ2F0ZWdvcnlSb3coInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0gICAgc2V0Q2F0ZWdvcnlSb3dTZXR0aW5ncygicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZENhdGVnb3JpZXMiLDwlPWklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0lPgotICAgIHNob3dQdWJsaXNoRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4sPCU9cHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTdHlsZUluZGV4JT4pOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd01haW5Gb3JtKHB1Ymxpc2hWYWx1ZSkKLSAgewotICAgIGNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpOwotICAgIHZhciBwdWJsaXNoID0gcGFyc2VJbnQocHVibGlzaFZhbHVlKTsKLSAgICBmb3IgKHZhciBpPTA7aTxzZWN0aW9uSWRzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgaWYgKGkgPT0gcHVibGlzaCkKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VjdGlvbklkc1tpXSkuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgZWxzZQotICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWN0aW9uSWRzW2ldKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgIH0KLSAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICBpZiAobG9hZFNjcmVlblRhYmxlLnJvd3MubGVuZ3RoID4gMCkKLSAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93UHVibGlzaEZvcm0ocXVlcnlJdGVtSW5kZXgsc3R5bGUpCi0gIHsKLSAgICBjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKTsKLSAgICB2YXIgcHVibGlzaFNlY3Rpb25JZHM7Ci0gICAgc3dpdGNoIChxdWVyeUl0ZW1JbmRleCkKLSAgICB7Ci0gICAgICBjYXNlIDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTJT46Ci0gICAgICAgIHB1Ymxpc2hTZWN0aW9uSWRzID0gcHVibGlzaEJ1c2luZXNzU2VjdGlvbklkczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFUyU+OgotICAgICAgICBwdWJsaXNoU2VjdGlvbklkcyA9IHB1Ymxpc2hTZXJ2aWNlU2VjdGlvbklkczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPjoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHB1Ymxpc2hTZWN0aW9uSWRzID0gcHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTZWN0aW9uSWRzOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZm9yICh2YXIgaT0wO2k8cHVibGlzaFNlY3Rpb25JZHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAoaSA9PSBzdHlsZSkKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHVibGlzaFNlY3Rpb25JZHNbaV0pLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIGVsc2UKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHVibGlzaFNlY3Rpb25JZHNbaV0pLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgfQotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiIgb25VbmxvYWQ9ImNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpIj4KLSAgPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPGRpdiBpZD0ibWFpblNjcmVlbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotPCUKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ1ZGRpL2ltYWdlcy9wdWJsaXNoX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1BVQkxJU0giKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIHZhbGlnbj0ibWlkZGxlIiBub3dyYXA+Ci0gICAgICAgICAgICA8bGFiZWwgZm9yPSJwdWJsaXNoIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIG5vd3JhcD4KLSAgICAgICAgICAgIDxzZWxlY3QgaWQ9InB1Ymxpc2giIG9uQ2hhbmdlPSJzaG93TWFpbkZvcm0odGhpcy52YWx1ZSkiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0JVU0lORVNTIiklPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0UiKSU+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX1NFUlZJQ0VfSU5URVJGQUNFIiklPgotICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgPC9kaXY+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnUHVibGlzaEJ1c2luZXNzRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNmMwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWdQdWJsaXNoU2VydmljZUFkdmFuY2VkQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIHByb2Nlc3NQdWJsaXNoU2VydmljZUFkdmFuY2VkRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQlPiI+ICAKLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+ICAgIAotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX1FVRVJZX0lURU0lPiI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0FEVkFOQ0VEX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIGJvb2xlYW4gdGFibGVIYXNFcnJvcnMgPSAhZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0JVU0lORVNTKTsKLSAgIFN0cmluZ1tdIGJ1c1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9CVVNJTkVTUyIsKG5ldyBCb29sZWFuKHRhYmxlSGFzRXJyb3JzKSkudG9TdHJpbmcoKSxTdHJpbmcudmFsdWVPZihVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyksInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9CVVNJTkVTU307Ci0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRCdXNpbmVzcyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKGJ1c1NwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgbm93cmFwIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2Vfd3NkbF91cmwiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX1VSTCIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX1dTRExfVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBub3dyYXAgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5XU0RMQnJvd3NlcigncHVibGlzaFNlcnZpY2VBZHZhbmNlZCcsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFJT4pIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19CUk9XU0UiKSU+PC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9wdWJsaXNoX3NlcnZpY2VfYWR2YW5jZV93c2RsX3VybCIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPCUKLSAgIHRhYmxlSGFzRXJyb3JzID0gIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVMpOwotICAgU3RyaW5nW10gc2VydmljZUludGVyZmFjZVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRVMiLChuZXcgQm9vbGVhbih0YWJsZUhhc0Vycm9ycykpLnRvU3RyaW5nKCksU3RyaW5nLnZhbHVlT2YoVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyksInB1Ymxpc2hTZXJ2aWNlQWR2YW5jZWQiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9TRVJWSUNFX0lOVEVSRkFDRVN9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkU2VydmljZUludGVyZmFjZSIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKHNlcnZpY2VJbnRlcmZhY2VTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkTmFtZXMiKTsKLSAgIFN0cmluZ1tdIG5hbWVTcGVjaWZpY0luZm8gPSB7IkZPUk1fTEFCRUxfTkFNRVMiLCJGT1JNX0xBQkVMX05BTUUiLFN0cmluZy52YWx1ZU9mKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMobmFtZVNwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUykpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhkZXNjU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZUFkdmFuY2VkQ2F0ZWdvcmllcyIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmEzZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hTZXJ2aWNlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIG5hbWU9InB1Ymxpc2hTZXJ2aWNlU3R5bGUiPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX0ZPUk0iKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX3NpbXBsZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VTJT4iIG9uQ2xpY2s9InNob3dQdWJsaXNoRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRVMlPiw8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NJTVBMRSU+KSI+PGxhYmVsIGZvcj0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX3NpbXBsZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU0lNUExFIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2UiIGNsYXNzPSJyYWRpbyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9TRVJWSUNFUyU+IiBvbkNsaWNrPSJzaG93UHVibGlzaEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX2FkdmFuY2UiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1JBRElPX0FEVkFOQ0VEIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZm9ybT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlQWR2YW5jZWRGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZWNhNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJwdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBwcm9jZXNzUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZEZvcm0odGhpcykiPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MTAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfU0VSVklDRV9JTlRFUkZBQ0VfQURWQU5DRURfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZV93c2RsX3VybCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvbGFiZWw+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBub3dyYXAgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5XU0RMQnJvd3NlcigncHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZCcsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSU+KSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIiklPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlX3dzZGxfdXJsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPiIgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2VfYWR2YW5jZV9uYW1lIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvbGFiZWw+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNvbHNwYW49Mz4gPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX2FkdmFuY2VfbmFtZSIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZERlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoZGVzY1NwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgicHVibGlzaFNlcnZpY2VJbnRlcmZhY2VBZHZhbmNlZElkZW50aWZpZXJzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2lkZW50aWZpZXJzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlQWR2YW5jZWRDYXRlZ29yaWVzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTgyY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPgotPGRpdiBpZD0icHVibGlzaFNlcnZpY2VJbnRlcmZhY2UiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPGZvcm0gbmFtZT0icHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTdHlsZSI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfRk9STSIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJyYWRpb19wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX3NpbXBsZSIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX1NUWUxFX1NFUlZJQ0VfSU5URVJGQUNFUyU+IiBvbkNsaWNrPSJzaG93UHVibGlzaEZvcm0oPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VfSU5URVJGQUNFUyU+LDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0lNUExFJT4pIj48bGFiZWwgZm9yPSJyYWRpb19wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX3NpbXBsZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU0lNUExFIiklPjwvbGFiZWw+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlIiBjbGFzcz0icmFkaW8iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfU1RZTEVfU0VSVklDRV9JTlRFUkZBQ0VTJT4iIG9uQ2xpY2s9InNob3dQdWJsaXNoRm9ybSg8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTJT4sPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9TVFlMRV9BRFZBTkNFRCU+KSI+PGxhYmVsIGZvcj0icmFkaW9fcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9hZHZhbmNlIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19BRFZBTkNFRCIpJT48L2xhYmVsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Zvcm0+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VJbnRlcmZhY2VTaW1wbGVGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZUFkdmFuY2VkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZUZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjA2ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIGZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKWZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXMoc3ViUXVlcnlLZXlQcm9wZXJ0eS5nZXRTdWJRdWVyeUtleSgpKTsKLSU+Ci08ZGl2IGlkPSJwdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlZ1B1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIGhhbmRsZVN1Ym1pdCh0aGlzKSI+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUFVCTElTSF9TRVJWSUNFX0lOVEVSRkFDRV9TSU1QTEVfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInB1Ymxpc2hTZXJ2aWNlSW50ZXJmYWNlU2ltcGxlQXV0aGVudGljYXRpb24iKTsKLSU+ICAgICAgCi08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgCi0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIG5vd3JhcCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlX3dzZGxfdXJsIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9VUkwiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIG5vd3JhcCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbldTRExCcm93c2VyKCdwdWJsaXNoU2VydmljZUludGVyZmFjZVNpbXBsZScsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSU+KSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIiklPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9zaW1wbGVfd3NkbF91cmwiIG5hbWU9IjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+IiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTMgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSkpCi0gICB7Ci0lPgotICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPgotICAgICAgICA8L3RkPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlX25hbWUiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlX2Rlc2MiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIiklPjwvbGFiZWw+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zPiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2Vfc2ltcGxlX2Rlc2MiIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFU0NSSVBUSU9OJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4gICAgICAgICAgCi0gICAgPC90YWJsZT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPC9mb3JtPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNhZjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZWdQdWJsaXNoU2VydmljZVNpbXBsZUZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5S2V5UHJvcGVydHkiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS5TdWJRdWVyeUtleVByb3BlcnR5IiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gICBGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UgZm9ybVRvb2xQSSA9ICgoTXVsdGlwbGVGb3JtVG9vbFByb3BlcnRpZXNJbnRlcmZhY2UpZm9ybVRvb2wpLmdldEZvcm1Ub29sUHJvcGVydGllcyhzdWJRdWVyeUtleVByb3BlcnR5LmdldFN1YlF1ZXJ5S2V5KCkpOwotJT4KLTxkaXYgaWQ9InB1Ymxpc2hTZXJ2aWNlU2ltcGxlIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnMvUmVnUHVibGlzaFNlcnZpY2VTaW1wbGVBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc1B1Ymxpc2hTZXJ2aWNlU2ltcGxlRm9ybSh0aGlzKSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5TVUJRVUVSWV9HRVQlPiI+ICAKLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9JTklUSUFURUQlPiI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5ORVdfU1VCUVVFUllfUVVFUllfSVRFTSU+Ij4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9QVUJMSVNIX1NFUlZJQ0VfU0lNUExFX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZVNpbXBsZUF1dGhlbnRpY2F0aW9uIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBib29sZWFuIHRhYmxlSGFzRXJyb3JzID0gIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1MpOwotICAgU3RyaW5nW10gYnVzU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX0JVU0lORVNTIiwobmV3IEJvb2xlYW4odGFibGVIYXNFcnJvcnMpKS50b1N0cmluZygpLFN0cmluZy52YWx1ZU9mKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9CVVNJTkVTU0VTKSwicHVibGlzaFNlcnZpY2VTaW1wbGUiLFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfQlVTSU5FU1N9OwotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJwdWJsaXNoU2VydmljZVNpbXBsZUJ1c2luZXNzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoYnVzU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBub3dyYXAgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICA8bGFiZWwgZm9yPSJpbnB1dF9wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlX3dzZGxfdXJsIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9VUkwiKSU+PC9sYWJlbD4KLTwlCi0gICBpZiAoIWZvcm1Ub29sUEkuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfU0lNUExFX1NFUlZJQ0VfV1NETF9VUkwpKQotICAgewotJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIG5vd3JhcCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbldTRExCcm93c2VyKCdwdWJsaXNoU2VydmljZVNpbXBsZScsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFJT4pIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19CUk9XU0UiKSU+PC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+Ci0gICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF9wdWJsaXNoX3NlcnZpY2Vfc2ltcGxlX3dzZGxfdXJsIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwlPiIgY2xhc3M9InRleHRlbnRlciI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9zaW1wbGVfbmFtZSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L2xhYmVsPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9TSU1QTEVfU0VSVklDRV9OQU1FKSkKLSAgIHsKLSU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZV9uYW1lIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX05BTUUlPiIgY2xhc3M9InRleHRlbnRlciI+IDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3B1Ymxpc2hfc2VydmljZV9zaW1wbGVfZGVzYyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKSU+PC9sYWJlbD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPTM+IDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfcHVibGlzaF9zZXJ2aWNlX3NpbXBsZV9kZXNjIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0RFU0NSSVBUSU9OJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPiA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZXN1bHRzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvUmVzdWx0c0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzhkM2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9SZXN1bHRzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3MuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXRIb2xkZXIiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgc3ViUXVlcnlUcmFuc2ZlclRhcmdldEhvbGRlci5yZW1vdmVBbGxFbGVtZW50cygpOwotJT4KLTwvanNwOnVzZUJlYW4+ICAgCi08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgVHJlZUVsZW1lbnQgdHJlZUVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgc3ViUXVlcnlUcmFuc2ZlclRhcmdldCA9IG51bGw7Ci0gICBib29sZWFuIGhhc1RhcmdldCA9IGZhbHNlOwotICAgaWYgKHRyZWVFbGVtZW50IGluc3RhbmNlb2YgUXVlcnlFbGVtZW50KQotICAgewotICAgICBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0ID0gKFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQpdHJlZUVsZW1lbnQuZ2V0UHJvcGVydHlBc09iamVjdChVRERJTW9kZWxDb25zdGFudHMuU1VCUVVFUllfVFJBTlNGRVJfVEFSR0VUKTsKLSAgICAgaWYgKHN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgIT0gbnVsbCAmJiBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0LmdldFRhcmdldEZvcm1Ub29sKCkgIT0gbnVsbCkKLSAgICAgewotICAgICAgIHN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXRIb2xkZXIucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgICBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyLmFkZEVsZW1lbnQoc3ViUXVlcnlUcmFuc2ZlclRhcmdldCk7Ci0gICAgICAgaGFzVGFyZ2V0ID0gdHJ1ZTsKLSAgICAgfQotICAgfQotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1JFU1VMVFMiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9yZXN1bWVwcm94eWxvYWRwYWdlLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy9yZXN1bHRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLTwlCi0gICBWZWN0b3IgY2hpbGROb2RlcyA9IHNlbGVjdGVkTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICBmb3IgKGludCBpPTA7aTxjaGlsZE5vZGVzLnNpemUoKTtpKyspCi0gICB7Ci0gICAgIE5vZGUgY2hpbGROb2RlID0gKE5vZGUpY2hpbGROb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgIFN0cmluZyB1cmwgPSBTZWxlY3ROYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoY2hpbGROb2RlLmdldE5vZGVJZCgpLGZhbHNlKTsKLSAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBudWxsOwotICAgICBpZiAoY2hpbGROb2RlIGluc3RhbmNlb2YgQnVzaW5lc3NOb2RlKQotICAgICB7Ci0gICAgICAgQnVzaW5lc3NFbGVtZW50IGJ1c0VsZW1lbnQgPSAoQnVzaW5lc3NFbGVtZW50KWNoaWxkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgIEJ1c2luZXNzRW50aXR5IGJlID0gYnVzRWxlbWVudC5nZXRCdXNpbmVzc0VudGl0eSgpOwotICAgICAgIG5hbWUgPSBiZS5nZXREZWZhdWx0TmFtZVN0cmluZygpOwotICAgICAgIGRlc2NyaXB0aW9uID0gYmUuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgIH0KLSAgICAgZWxzZSBpZiAoY2hpbGROb2RlIGluc3RhbmNlb2YgU2VydmljZU5vZGUpCi0gICAgIHsKLSAgICAgICBTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IChTZXJ2aWNlRWxlbWVudCljaGlsZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICAgICBCdXNpbmVzc1NlcnZpY2UgYnMgPSBzZXJ2aWNlRWxlbWVudC5nZXRCdXNpbmVzc1NlcnZpY2UoKTsKLSAgICAgICBuYW1lID0gYnMuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKTsKLSAgICAgICBkZXNjcmlwdGlvbiA9IGJzLmdldERlZmF1bHREZXNjcmlwdGlvblN0cmluZygpOwotICAgICB9Ci0gICAgIGVsc2UgaWYgKGNoaWxkTm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VJbnRlcmZhY2VOb2RlKQotICAgICB7Ci0gICAgICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KWNoaWxkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICAgIFRNb2RlbCB0TW9kZWwgPSBzaUVsZW1lbnQuZ2V0VE1vZGVsKCk7Ci0gICAgICAgbmFtZSA9IHRNb2RlbC5nZXROYW1lU3RyaW5nKCk7Ci0gICAgICAgZGVzY3JpcHRpb24gPSB0TW9kZWwuZ2V0RGVmYXVsdERlc2NyaXB0aW9uU3RyaW5nKCk7Ci0gICAgIH0KLSU+Ci0gICAgYWRkUmVzdWx0Um93KCJSZXN1bHRzIiw8JT1jaGlsZE5vZGUuZ2V0Tm9kZUlkKCklPiwiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHVybCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShkZXNjcmlwdGlvbiklPiIpOwotPCUKLSAgIH0KLSU+Ci0gICAgdmFyIGxvYWRTY3JlZW5UYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkU2NyZWVuIik7Ci0gICAgaWYgKGxvYWRTY3JlZW5UYWJsZS5yb3dzLmxlbmd0aCA+IDApCi0gICAgICBsb2FkU2NyZWVuVGFibGUuZGVsZXRlUm93KDApOwotICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtYWluU2NyZWVuIikuc3R5bGUuZGlzcGxheSA9ICIiOwotICB9Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTxkaXYgaWQ9ImNvbnRlbnQiPgotICA8dGFibGUgaWQ9ImxvYWRTY3JlZW4iPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfTE9BRF9JTl9QUk9HUkVTUyIpJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPGRpdiBpZD0ibWFpblNjcmVlbiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotPCUKLSAgIFN0cmluZyB0aXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfUVVFUllfUkVTVUxUUyIpOwotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL3VkZGkvZm9ybXMvcmVzdWx0c2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDxmb3JtIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJtYXJnaW4tdG9wOjEwcHg7Ij4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgU3RyaW5nIHRhYmxlVGl0bGU7Ci0gICBpbnQgaXRlbVR5cGUgPSBJbnRlZ2VyLnBhcnNlSW50KHRyZWVFbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoVURESU1vZGVsQ29uc3RhbnRzLlFVRVJZX1RZUEUpKTsgICAKLSAgIHN3aXRjaCAoaXRlbVR5cGUpCi0gICB7Ci0gICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX0JVU0lORVNTRVM6Ci0gICAgICAgdGFibGVUaXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9CVVNJTkVTU0VTIik7Ci0gICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgVURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTOgotICAgICAgIHRhYmxlVGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fU0VSVklDRVMiKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fU0VSVklDRV9JTlRFUkZBQ0VTOgotICAgICBkZWZhdWx0OgotICAgICAgIHRhYmxlVGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fU0VSVklDRV9JTlRFUkZBQ0VTIik7Ci0gICB9Ci0gICBTdHJpbmdbXSBvdGhlclByb3BlcnRpZXMgPSB7dGFibGVUaXRsZSwiIn07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiUmVzdWx0cyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG90aGVyUHJvcGVydGllcyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL3Jlc3VsdHNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgPHRyPgotPCUKLSAgIGlmIChoYXNUYXJnZXQpCi0gICB7Ci0lPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9UUkFOU0ZFUiIpJT4iIG9uQ2xpY2s9InRyYW5zZmVyU2VsZWN0aW9ucygnUmVzdWx0cycsdGhpcy5mb3JtKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgPC90ZD4KLTwlCi0gICB9Ci0lPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9CVVRUT05fUkVGUkVTSCIpJT4iIG9uQ2xpY2s9InJlZnJlc2hTZWxlY3Rpb25zKCdSZXN1bHRzJyx0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9BRERfVE9fRkFWT1JJVEVTIiklPiIgb25DbGljaz0iYWRkU2VsZWN0aW9uc1RvRmF2b3JpdGVzKCdSZXN1bHRzJyx0aGlzLmZvcm0pIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgYWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9DTEVBUiIpJT4iIG9uQ2xpY2s9ImNsZWFyU2VsZWN0aW9ucygnUmVzdWx0cycsdGhpcy5mb3JtKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgotICAgIDwvZm9ybT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci0gIHJlc3VtZVByb3h5TG9hZFBhZ2UoKTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1NlcnZpY2VEZXRhaWxzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvU2VydmljZURldGFpbHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxZGQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvU2VydmljZURldGFpbHNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS51dGlsLlVkZGk0akhlbHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLmRhdGF0eXBlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCkoY3VycmVudFRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpKTsKLSAgIFNlcnZpY2VFbGVtZW50IHNlcnZpY2VFbGVtZW50ID0gKFNlcnZpY2VFbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgUmVnaXN0cnlOb2RlIHJlZ05vZGUgPSB1ZGRpTWFpbk5vZGUuZ2V0UmVnaXN0cnlOb2RlKHNlbGVjdGVkTm9kZSk7Ci0gICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1NFUlZJQ0VfREVUQUlMUyIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Jlc3VtZXByb3h5bG9hZHBhZ2UuanMiKSklPiI+Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL2RldGFpbHN0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHNldERlZmF1bHRzKCkKLSAgewotICAgIHZhciBzZXJ2aWNlRGV0YWlsc1dTRExVUkxUYWJsZSA9IGdldFRhYmxlKCJzZXJ2aWNlRGV0YWlsc1dTRExVUkwiKTsKLSAgICB2YXIgc2VydmljZURldGFpbHNOYW1lc1RhYmxlID0gZ2V0VGFibGUoInNlcnZpY2VEZXRhaWxzTmFtZXMiKTsKLSAgICB2YXIgc2VydmljZURldGFpbHNEZXNjcmlwdGlvbnNUYWJsZSA9IGdldFRhYmxlKCJzZXJ2aWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIpOwotPCUKLSAgIExpc3RFbGVtZW50IHdzZGxVUkxMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpOwotICAgU3RyaW5nIHdzZGxVUkwgPSBudWxsOwotICAgaWYgKHdzZGxVUkxMaXN0RWxlbWVudCA9PSBudWxsKQotICAgewotICAgICB0cnkKLSAgICAgewotICAgICAgIFVkZGk0akhlbHBlciB1ZGRpNGpIZWxwZXIgPSBuZXcgVWRkaTRqSGVscGVyKCk7Ci0gICAgICAgd3NkbFVSTCA9IHVkZGk0akhlbHBlci5nZXRXU0RMKHNlcnZpY2VFbGVtZW50LmdldEJ1c2luZXNzU2VydmljZSgpLCBzZXJ2aWNlRWxlbWVudC5nZXRSZWdpc3RyeUVsZW1lbnQoKS5nZXRQcm94eSgpKTsKLSAgICAgICB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0gICAgICAgaWYgKHdzZGxVUkwgPT0gbnVsbCkKLSAgICAgICAgIHdzZGxVUkwgPSAidGVtcC53c2RsIjsKLSAgICAgfQotICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgIHsKLSAgICAgICB3c2RsVVJMID0gIiI7Ci0gICAgICAgZm9ybVRvb2wuZmxhZ0Vycm9yKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9XU0RMX1VSTCk7Ci0gICAgIH0KLSAgICAgd3NkbFVSTExpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHdzZGxVUkwpOwotICAgICB3c2RsVVJMTGlzdEVsZW1lbnQuc2V0VGFyZ2V0Vmlld1Rvb2xJbmZvKC0xLC0xLDApOwotICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwsd3NkbFVSTExpc3RFbGVtZW50KTsKLSAgIH0KLSAgIGVsc2UKLSAgICAgd3NkbFVSTCA9IChTdHJpbmcpd3NkbFVSTExpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgYm9vbGVhbiBpc0Vycm9yID0gIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwpOwotICAgYm9vbGVhbiBpc05ld0l0ZW0gPSAod3NkbFVSTExpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0lPgotICAgIGFkZERldGFpbHNTaW5nbGVJdGVtUm93KCJzZXJ2aWNlRGV0YWlsc1dTRExVUkwiLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3coInNlcnZpY2VEZXRhaWxzV1NETFVSTCIsPCU9VURESUFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRSU+LCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUod3NkbFVSTCklPiIpOwotPCUKLSAgIGlmIChpc0Vycm9yKQotICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3coc2VydmljZURldGFpbHNXU0RMVVJMVGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3NdLCJlcnJhbnRSb3ciKTsKLTwlCi0gICB9Ci0KLSAgIFZlY3RvciBuYW1lSW5kZXhWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9OQU1FUyk7Ci0gICBpZiAobmFtZUluZGV4VmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPG5hbWVJbmRleFZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpbmFtZUluZGV4VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICBOYW1lIG5hbWUgPSAoTmFtZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBpc0Vycm9yID0gIWZvcm1Ub29sLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMsaSk7Ci0gICAgICAgaXNOZXdJdGVtID0gKGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0lPgotICAgIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93KCJzZXJ2aWNlRGV0YWlsc05hbWVzIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfTkFNRV9URVhUX1ZBTFVFIikpJT4iLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdygic2VydmljZURldGFpbHNOYW1lcyIsPCU9aSU+LDwlPWxpc3RFbGVtZW50LmdldFZpZXdJZCgpJT4sIjwlPW5hbWUuZ2V0TGFuZygpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUobmFtZS5nZXRUZXh0KCkpJT4iKTsKLTwlCi0gICAgICAgaWYgKGlzRXJyb3IpCi0gICAgICAgewotJT4KLSAgICBoaWdobGlnaHRFcnJhbnRSb3coc2VydmljZURldGFpbHNOYW1lc1RhYmxlLnJvd3NbPCU9aSU+K251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUKLSAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgVmVjdG9yIGRlc2NyaXB0aW9uSW5kZXhWZWN0b3IgPSAoVmVjdG9yKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9ERVNDUklQVElPTlMpOwotICAgaWYgKGRlc2NyaXB0aW9uSW5kZXhWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25JbmRleFZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZGVzY3JpcHRpb25JbmRleFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgaXNFcnJvciA9ICFmb3JtVG9vbC5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUyxpKTsKLSAgICAgICBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3coInNlcnZpY2VEZXRhaWxzRGVzY3JpcHRpb25zIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfREVTQ1JJUFRJT05fVEVYVF9WQUxVRSIpKSU+Iiw8JT1pc0Vycm9yfHxpc05ld0l0ZW0lPik7Ci0gICAgc2V0RGV0YWlsc0xhbmd1YWdlSW5wdXRSb3coInNlcnZpY2VEZXRhaWxzRGVzY3JpcHRpb25zIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9ZGVzY3JpcHRpb24uZ2V0TGFuZygpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoZGVzY3JpcHRpb24uZ2V0VGV4dCgpKSU+Iik7Ci08JQotICAgICAgIGlmIChpc0Vycm9yKQotICAgICAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHNlcnZpY2VEZXRhaWxzRGVzY3JpcHRpb25zVGFibGUucm93c1s8JT1pJT4rbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50Um93Iik7Ci08JQotICAgICAgIH0KLSAgICAgfQotICAgfQotCi0gICBWZWN0b3IgY2F0VmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyk7Ci0gICBpZiAoY2F0VmVjdG9yICE9IG51bGwpCi0gICB7Ci0gICAgIGZvciAoaW50IGk9MDtpPGNhdFZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpY2F0VmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBpc0Vycm9yID0gIWZvcm1Ub29sLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQ0FURUdPUklFUyxpKTsKLSAgICAgICBpc05ld0l0ZW0gPSAobGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93KCJzZXJ2aWNlRGV0YWlsc0NhdGVnb3JpZXMiLDwlPWlzRXJyb3J8fGlzTmV3SXRlbSU+KTsKLSAgICBzZXREZXRhaWxzQ2F0ZWdvcnlSb3coInNlcnZpY2VEZXRhaWxzQ2F0ZWdvcmllcyIsPCU9aSU+LDwlPWxpc3RFbGVtZW50LmdldFZpZXdJZCgpJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRUTW9kZWxLZXkoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlOYW1lKCkpJT4iLCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoa3IuZ2V0S2V5VmFsdWUoKSklPiIpOwotPCUKLSAgICAgfQotICAgfQotCi0gICAvLyBBdXRoZW50aWNhdGlvbi4KLSAgIGlmICghcmVnRWxlbWVudC5pc0xvZ2dlZEluKCkpCi0gICB7Ci0gICAgIFN0cmluZyBwdWJsaXNoVVJMID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMKTsKLSAgICAgU3RyaW5nIHVzZXJJZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQpOwotICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHB1Ymxpc2hVUkwpJT4iOwotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJJZCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShwYXNzd29yZCklPiI7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlcnZpY2VEZXRhaWxzQXV0aGVudGljYXRpb24iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci08JQotICAgfQotJT4KLQotICAgIHNob3dNYWluRm9ybSgpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd01haW5Gb3JtKCkKLSAgewotICAgIGNsb3NlQWxsVWRkaUNoaWxkV2luZG93cygpOwotICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgbG9hZFNjcmVlblRhYmxlLmRlbGV0ZVJvdygwKTsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NEZXRhaWxzU2luZ2xlSXRlbVRhYmxlKCJzZXJ2aWNlRGV0YWlsc1dTRExVUkwiLCI8JT1VRERJQWN0aW9uSW5wdXRzLldTRExfVVJMX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfV1NETF9VUkwlPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzRGV0YWlsc0xhbmd1YWdlSW5wdXRUYWJsZSgic2VydmljZURldGFpbHNOYW1lcyIsIjwlPVVERElBY3Rpb25JbnB1dHMuTkFNRV9NT0RJRklFRCU+IiwiPCU9VURESUFjdGlvbklucHV0cy5OQU1FX1ZJRVdJRCU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9OQU1FX0xBTkdVQUdFJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX05BTUUlPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzRGV0YWlsc0xhbmd1YWdlSW5wdXRUYWJsZSgic2VydmljZURldGFpbHNEZXNjcmlwdGlvbnMiLCI8JT1VRERJQWN0aW9uSW5wdXRzLkRFU0NSSVBUSU9OX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLkRFU0NSSVBUSU9OX1ZJRVdJRCU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTl9MQU5HVUFHRSU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ERVNDUklQVElPTiU+Iixmb3JtKTsKLSAgICAgIHByb2Nlc3NEZXRhaWxzQ2F0ZWdvcnlUYWJsZSgic2VydmljZURldGFpbHNDYXRlZ29yaWVzIixmb3JtKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIiBvblVubG9hZD0iY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCkiPgotICA8ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPgotICAgICAgPHRhYmxlIGlkPSJsb2FkU2NyZWVuIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0xPQURfSU5fUFJPR1JFU1MiKSU+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8ZGl2IGlkPSJtYWluU2NyZWVuIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICBTdHJpbmcgdGl0bGUgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NFUlZJQ0VfREVUQUlMUyIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSU+IiB2YWx1ZT0iPCU9Zm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX0JVU0lORVNTX0tFWSklPiI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfVVVJRF9TRVJWSUNFX0tFWSU+IiB2YWx1ZT0iPCU9Zm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfS0VZKSU+Ij4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVUQUlMU19FRElUQUJMRSIsc2VsZWN0ZWROb2RlLmdldE5vZGVOYW1lKCkpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVJWSUNFX0tFWSIpJT4KLSAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICA8JT1mb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1VVSURfU0VSVklDRV9LRVkpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInNlcnZpY2VEZXRhaWxzV1NETFVSTCIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX1VSTCIpKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc1NpbmdsZUl0ZW1fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgic2VydmljZURldGFpbHNOYW1lcyIpOwotICAgU3RyaW5nW10gbmFtZVNwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9OQU1FUyIsIkZPUk1fTEFCRUxfTkFNRSIsU3RyaW5nLnZhbHVlT2YoIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfTkFNRVMpKX07Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMobmFtZVNwZWNpZmljSW5mbyk7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2RldGFpbHNMYW5ndWFnZUlucHV0X3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInNlcnZpY2VEZXRhaWxzRGVzY3JpcHRpb25zIik7Ci0gICBTdHJpbmdbXSBkZXNjU3BlY2lmaWNJbmZvID0geyJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OUyIsIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iLFN0cmluZy52YWx1ZU9mKCFmb3JtVG9vbC5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0RFU0NSSVBUSU9OUykpfTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyhkZXNjU3BlY2lmaWNJbmZvKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0xhbmd1YWdlSW5wdXRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgic2VydmljZURldGFpbHNDYXRlZ29yaWVzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2RldGFpbHNDYXRlZ29yaWVzX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInNlcnZpY2VEZXRhaWxzQXV0aGVudGljYXRpb24iKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwvZGl2PgotICAgIDwvZm9ybT4KLSAgPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgc2V0RGVmYXVsdHMoKTsKLSAgcmVzdW1lUHJveHlMb2FkUGFnZSgpOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvU2VydmljZUludGVyZmFjZURldGFpbHNGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9TZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWI2NzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9TZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnV0aWwuVWRkaTRqSGVscGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGouZGF0YXR5cGUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgIEZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKShjdXJyZW50VG9vbE1hbmFnZXIuZ2V0U2VsZWN0ZWRUb29sKCkpOwotICAgU2VydmljZUludGVyZmFjZUVsZW1lbnQgc2lFbGVtZW50ID0gKFNlcnZpY2VJbnRlcmZhY2VFbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOyAgIAotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgUmVnaXN0cnlOb2RlIHJlZ05vZGUgPSB1ZGRpTWFpbk5vZGUuZ2V0UmVnaXN0cnlOb2RlKHNlbGVjdGVkTm9kZSk7Ci0gICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9IChSZWdpc3RyeUVsZW1lbnQpcmVnTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1NFUlZJQ0VfSU5URVJGQUNFX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9yZXN1bWVwcm94eWxvYWRwYWdlLmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy9kZXRhaWxzdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLSAgICB2YXIgc2VydmljZUludGVyZmFjZURldGFpbHNXU0RMVVJMVGFibGUgPSBnZXRUYWJsZSgic2VydmljZUludGVyZmFjZURldGFpbHNXU0RMVVJMIik7Ci0gICAgdmFyIHNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzTmFtZVRhYmxlID0gZ2V0VGFibGUoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzTmFtZSIpOwotICAgIHZhciBzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Rlc2NyaXB0aW9uc1RhYmxlID0gZ2V0VGFibGUoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzRGVzY3JpcHRpb25zIik7Ci0gICAgdmFyIHNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzSWRlbnRpZmllcnNUYWJsZSA9IGdldFRhYmxlKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0lkZW50aWZpZXJzIik7Ci0gICAgdmFyIHNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQ2F0ZWdvcmllc1RhYmxlID0gZ2V0VGFibGUoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQ2F0ZWdvcmllcyIpOwotPCUKLSAgIExpc3RFbGVtZW50IHdzZGxVUkxMaXN0RWxlbWVudCA9IChMaXN0RWxlbWVudClmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMKTsKLSAgIFN0cmluZyB3c2RsVVJMID0gbnVsbDsKLSAgIGlmICh3c2RsVVJMTGlzdEVsZW1lbnQgPT0gbnVsbCkKLSAgIHsKLSAgICAgdHJ5Ci0gICAgIHsKLSAgICAgICBVZGRpNGpIZWxwZXIgdWRkaTRqSGVscGVyID0gbmV3IFVkZGk0akhlbHBlcigpOwotICAgICAgIHdzZGxVUkwgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETChzaUVsZW1lbnQuZ2V0VE1vZGVsKCkpOwotICAgICAgIHVkZGk0akhlbHBlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsVVJMKTsKLSAgICAgICBpZiAod3NkbFVSTCA9PSBudWxsKQotICAgICAgICAgd3NkbFVSTCA9ICJ0ZW1wLndzZGwiOwotICAgICB9Ci0gICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgewotICAgICAgIHdzZGxVUkwgPSAiIjsKLSAgICAgICBmb3JtVG9vbC5mbGFnRXJyb3IoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICAgIH0KLSAgICAgd3NkbFVSTExpc3RFbGVtZW50ID0gbmV3IExpc3RFbGVtZW50KHdzZGxVUkwpOwotICAgICB3c2RsVVJMTGlzdEVsZW1lbnQuc2V0VGFyZ2V0Vmlld1Rvb2xJbmZvKC0xLC0xLDApOwotICAgICBmb3JtVG9vbC5zZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMLHdzZGxVUkxMaXN0RWxlbWVudCk7Ci0gICB9Ci0gICBlbHNlCi0gICAgIHdzZGxVUkwgPSAoU3RyaW5nKXdzZGxVUkxMaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgIGJvb2xlYW4gaXNFcnJvciA9ICFmb3JtVG9vbC5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9XU0RMX1VSTCk7Ci0gICBib29sZWFuIGlzTmV3SXRlbSA9ICh3c2RsVVJMTGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc1NpbmdsZUl0ZW1Sb3coInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzV1NETFVSTCIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvdygic2VydmljZUludGVyZmFjZURldGFpbHNXU0RMVVJMIiw8JT1BY3Rpb25JbnB1dHMuV1NETF9UWVBFX1NFUlZJQ0VfSU5URVJGQUNFJT4sIjwlPUhUTUxVdGlscy5KU01hbmdsZSh3c2RsVVJMKSU+Iik7Ci08JQotICAgaWYgKGlzRXJyb3IpCi0gICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1dTRExVUkxUYWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUgICAKLSAgIH0KLQotICAgTGlzdEVsZW1lbnQgbmFtZUxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfTkFNRSk7Ci0gICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpbmFtZUxpc3RFbGVtZW50LmdldE9iamVjdCgpOwotICAgaXNFcnJvciA9ICFmb3JtVG9vbC5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FKTsKLSAgIGlzTmV3SXRlbSA9IChuYW1lTGlzdEVsZW1lbnQuZ2V0VGFyZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKTsKLSU+Ci0gICAgYWRkRGV0YWlsc1NpbmdsZUl0ZW1Sb3coInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzTmFtZSIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNOYW1lU2luZ2xlSXRlbVJvdygic2VydmljZUludGVyZmFjZURldGFpbHNOYW1lIiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKG5hbWUpJT4iKTsKLTwlCi0gICBpZiAoaXNFcnJvcikKLSAgIHsKLSU+Ci0gICAgaGlnaGxpZ2h0RXJyYW50Um93KHNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzTmFtZVRhYmxlLnJvd3NbbnVtYmVyT2ZIZWFkZXJSb3dzXSwiZXJyYW50Um93Iik7Ci08JQotICAgfQotICAgCi0gICBWZWN0b3IgZGVzY3JpcHRpb25JbmRleFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMpOwotICAgaWYgKGRlc2NyaXB0aW9uSW5kZXhWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8ZGVzY3JpcHRpb25JbmRleFZlY3Rvci5zaXplKCk7aSsrKQotICAgICB7Ci0gICAgICAgTGlzdEVsZW1lbnQgbGlzdEVsZW1lbnQgPSAoTGlzdEVsZW1lbnQpZGVzY3JpcHRpb25JbmRleFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSAoRGVzY3JpcHRpb24pbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgaXNFcnJvciA9ICFmb3JtVG9vbC5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9ERVNDUklQVElPTlMsaSk7Ci0gICAgICAgaXNOZXdJdGVtID0gKGxpc3RFbGVtZW50LmdldFRhcmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCk7Ci0lPgotICAgIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93KCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIsIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0RFU0NSSVBUSU9OX1RFWFRfVkFMVUUiKSklPiIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNMYW5ndWFnZUlucHV0Um93KCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIsPCU9aSU+LDwlPWxpc3RFbGVtZW50LmdldFZpZXdJZCgpJT4sIjwlPWRlc2NyaXB0aW9uLmdldExhbmcoKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGRlc2NyaXB0aW9uLmdldFRleHQoKSklPiIpOwotPCUKLSAgICAgICBpZiAoaXNFcnJvcikKLSAgICAgICB7Ci0lPgotICAgIGhpZ2hsaWdodEVycmFudFJvdyhzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Rlc2NyaXB0aW9uc1RhYmxlLnJvd3NbPCU9aSU+K251bWJlck9mSGVhZGVyUm93c10sImVycmFudFJvdyIpOwotPCUgICAgICAgCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0gICAKLSAgIFZlY3RvciBpZFZlY3RvciA9IChWZWN0b3IpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9JREVOVElGSUVSUyk7Ci0gICBpZiAoaWRWZWN0b3IgIT0gbnVsbCkKLSAgIHsKLSAgICAgZm9yIChpbnQgaT0wO2k8aWRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWlkVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICBLZXllZFJlZmVyZW5jZSBrciA9IChLZXllZFJlZmVyZW5jZSlsaXN0RWxlbWVudC5nZXRPYmplY3QoKTsKLSAgICAgICBpc0Vycm9yID0gIWZvcm1Ub29sLmlzUm93SW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0lERU5USUZJRVJTLGkpOwotICAgICAgIGlzTmV3SXRlbSA9IChsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotJT4KLSAgICBhZGREZXRhaWxzSWRlbnRpZmllclJvdygic2VydmljZUludGVyZmFjZURldGFpbHNJZGVudGlmaWVycyIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNJZGVudGlmaWVyUm93KCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0lkZW50aWZpZXJzIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JSAgICAgICAKLSAgICAgfQotICAgfQotICAgCi0gICBWZWN0b3IgY2F0VmVjdG9yID0gKFZlY3Rvcilmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX0NBVEVHT1JJRVMpOwotICAgaWYgKGNhdFZlY3RvciAhPSBudWxsKQotICAgewotICAgICBmb3IgKGludCBpPTA7aTxjYXRWZWN0b3Iuc2l6ZSgpO2krKykKLSAgICAgewotICAgICAgIExpc3RFbGVtZW50IGxpc3RFbGVtZW50ID0gKExpc3RFbGVtZW50KWNhdFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSAoS2V5ZWRSZWZlcmVuY2UpbGlzdEVsZW1lbnQuZ2V0T2JqZWN0KCk7Ci0gICAgICAgaXNFcnJvciA9ICFmb3JtVG9vbC5pc1Jvd0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9DQVRFR09SSUVTLGkpOwotICAgICAgIGlzTmV3SXRlbSA9IChsaXN0RWxlbWVudC5nZXRUYXJnZXRWaWV3SWQoKSA9PSBBY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQpOwotJT4KLSAgICBhZGREZXRhaWxzQ2F0ZWdvcnlSb3coInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQ2F0ZWdvcmllcyIsPCU9aXNFcnJvcnx8aXNOZXdJdGVtJT4pOwotICAgIHNldERldGFpbHNDYXRlZ29yeVJvdygic2VydmljZUludGVyZmFjZURldGFpbHNDYXRlZ29yaWVzIiw8JT1pJT4sPCU9bGlzdEVsZW1lbnQuZ2V0Vmlld0lkKCklPiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldFRNb2RlbEtleSgpKSU+IiwiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGtyLmdldEtleU5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShrci5nZXRLZXlWYWx1ZSgpKSU+Iik7Ci08JQotICAgICB9Ci0gICB9Ci0gICAKLSAgIC8vIEF1dGhlbnRpY2F0aW9uLgotICAgaWYgKCFyZWdFbGVtZW50LmlzTG9nZ2VkSW4oKSkKLSAgIHsKLSAgICAgU3RyaW5nIHB1Ymxpc2hVUkwgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpOwotICAgICBTdHJpbmcgdXNlcklkID0gKFN0cmluZylmb3JtVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCk7Ci0gICAgIFN0cmluZyBwYXNzd29yZCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QQVNTV09SRCk7Ci0lPiAgIAotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUocHVibGlzaFVSTCklPiI7Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodXNlcklkKSU+IjsKLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHBhc3N3b3JkKSU+IjsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VydmljZUludGVyZmFjZURldGFpbHNBdXRoZW50aWNhdGlvbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsKLTwlCi0gICB9Ci0lPiAgCi0gICAgc2hvd01haW5Gb3JtKCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNob3dNYWluRm9ybSgpCi0gIHsKLSAgICBjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKTsKLSAgICB2YXIgbG9hZFNjcmVlblRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRTY3JlZW4iKTsKLSAgICBpZiAobG9hZFNjcmVlblRhYmxlLnJvd3MubGVuZ3RoID4gMCkKLSAgICAgIGxvYWRTY3JlZW5UYWJsZS5kZWxldGVSb3coMCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5TY3JlZW4iKS5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHByb2Nlc3NGb3JtKGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NEZXRhaWxzU2luZ2xlSXRlbVRhYmxlKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc1dTRExVUkwiLCI8JT1VRERJQWN0aW9uSW5wdXRzLldTRExfVVJMX01PRElGSUVEJT4iLCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX1dTRExfVVJMJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0RldGFpbHNTaW5nbGVJdGVtVGFibGUoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzTmFtZSIsIjwlPVVERElBY3Rpb25JbnB1dHMuTkFNRV9NT0RJRklFRCU+IiwiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9OQU1FJT4iLGZvcm0pOwotICAgICAgcHJvY2Vzc0RldGFpbHNMYW5ndWFnZUlucHV0VGFibGUoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzRGVzY3JpcHRpb25zIiwiPCU9VURESUFjdGlvbklucHV0cy5ERVNDUklQVElPTl9NT0RJRklFRCU+IiwiPCU9VURESUFjdGlvbklucHV0cy5ERVNDUklQVElPTl9WSUVXSUQlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT05fTEFOR1VBR0UlPiIsIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfREVTQ1JJUFRJT04lPiIsZm9ybSk7Ci0gICAgICBwcm9jZXNzRGV0YWlsc0lkZW50aWZpZXJUYWJsZSgic2VydmljZUludGVyZmFjZURldGFpbHNJZGVudGlmaWVycyIsZm9ybSk7Ci0gICAgICBwcm9jZXNzRGV0YWlsc0NhdGVnb3J5VGFibGUoInNlcnZpY2VJbnRlcmZhY2VEZXRhaWxzQ2F0ZWdvcmllcyIsZm9ybSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9ICAgCi08L3NjcmlwdD4gIAotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIiBvblVubG9hZD0iY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCkiPgotICA8ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1VwZGF0ZVNlcnZpY2VJbnRlcmZhY2VBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gcHJvY2Vzc0Zvcm0odGhpcykiPiAgCi0gICAgICA8dGFibGUgaWQ9ImxvYWRTY3JlZW4iPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfTE9BRF9JTl9QUk9HUkVTUyIpJT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICAgIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLTwlCi0gICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgIFN0cmluZyB0aXRsZSA9IHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU0VSVklDRV9JTlRFUkZBQ0VfREVUQUlMUyIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4gICAgICAKLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSU+IiB2YWx1ZT0iPCU9Zm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSklPiI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFVEFJTFNfRURJVEFCTEUiLHNlbGVjdGVkTm9kZS5nZXROb2RlTmFtZSgpKSU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+ICAgICAgICAKLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVJWSUNFX0lOVEVSRkFDRV9LRVkiKSU+Ci0gICAgICAgICAgICA8L3RoPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgPCU9Zm9ybVRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9VVUlEX1NFUlZJQ0VfSU5URVJGQUNFX0tFWSklPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgic2VydmljZUludGVyZmFjZURldGFpbHNXU0RMVVJMIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIikpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzU2luZ2xlSXRlbV90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc05hbWUiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIikpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzU2luZ2xlSXRlbV90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAgCi08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0Rlc2NyaXB0aW9ucyIpOwotICAgU3RyaW5nW10gZGVzY1NwZWNpZmljSW5mbyA9IHsiRk9STV9MQUJFTF9ERVNDUklQVElPTlMiLCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIixTdHJpbmcudmFsdWVPZighZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfU0VSVklDRV9JTlRFUkZBQ0VfREVTQ1JJUFRJT05TKSl9OwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKGRlc2NTcGVjaWZpY0luZm8pOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9kZXRhaWxzTGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0lkZW50aWZpZXJzIik7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL2Zvcm1zL2RldGFpbHNJZGVudGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJzZXJ2aWNlSW50ZXJmYWNlRGV0YWlsc0NhdGVnb3JpZXMiKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvZm9ybXMvZGV0YWlsc0NhdGVnb3JpZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPiAgIAotPCUKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgic2VydmljZUludGVyZmFjZURldGFpbHNBdXRoZW50aWNhdGlvbiIpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPC9kaXY+Ci0gICAgPC9mb3JtPgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotICByZXN1bWVQcm94eUxvYWRQYWdlKCk7ICAKLTwvc2NyaXB0PiAgICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVURESUltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDIyOGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtUHJvcGVydGllcyIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgU3RyaW5nIHdzZGxVUkw7Ci0gICAvLyBzZWxlY3RlZE5vZGUgc2hvdWxkIGJlIGVpdGhlciBhIHNlcnZpY2Ugb3IgYSBzZXJ2aWNlIGludGVyZmFjZSBub2RlLgotICAgaWYgKHNlbGVjdGVkTm9kZSBpbnN0YW5jZW9mIFNlcnZpY2VOb2RlKQotICAgewotICAgICBTZXJ2aWNlTm9kZSBzZXJ2aWNlTm9kZSA9IChTZXJ2aWNlTm9kZSlzZWxlY3RlZE5vZGU7Ci0gICAgIHdzZGxVUkwgPSBzZXJ2aWNlTm9kZS5nZXRXU0RMVVJMRnJvbURldGFpbHNUb29sKCk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgIFNlcnZpY2VJbnRlcmZhY2VOb2RlIHNpTm9kZSA9IChTZXJ2aWNlSW50ZXJmYWNlTm9kZSlzZWxlY3RlZE5vZGU7Ci0gICAgIHdzZGxVUkwgPSBzaU5vZGUuZ2V0V1NETFVSTEZyb21EZXRhaWxzVG9vbCgpOwotICAgfQotICAgZm9ybVByb3BlcnRpZXMucHV0KCJmb3JtQWN0aW9uTGluayIsInVkZGkvYWN0aW9ucy9VRERJSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcCIpOwotICAgZm9ybVByb3BlcnRpZXMucHV0KCJ3c2RsVVJMIix3c2RsVVJMKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9JbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1VERElMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmYTI1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVURESUxhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uTGluayIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtQWN0aW9uTGluay5hcHBlbmQoInVkZGkvYWN0aW9ucy9VRERJTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AiKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVW5wdWJsaXNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvVW5wdWJsaXNoRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MzAyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL1VucHVibGlzaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIFVERElNYWluTm9kZSB1ZGRpTWFpbk5vZGUgPSAoVURESU1haW5Ob2RlKW5hdmlnYXRvck1hbmFnZXIuZ2V0Um9vdE5vZGUoKTsKLSAgIFJlZ2lzdHJ5Tm9kZSByZWdOb2RlID0gdWRkaU1haW5Ob2RlLmdldFJlZ2lzdHJ5Tm9kZShuYXZpZ2F0b3JNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpKTsKLSAgIFJlZ2lzdHJ5RWxlbWVudCByZWdFbGVtZW50ID0gKFJlZ2lzdHJ5RWxlbWVudClyZWdOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAKLSAgIEZvcm1Ub29sIHVucHVibGlzaFRvb2wgPSAoRm9ybVRvb2wpKG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCkpOwotJT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfVU5QVUJMSVNIIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaXRhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzZXREZWZhdWx0cygpCi0gIHsKLTwlCi0gICBpZiAoIXJlZ0VsZW1lbnQuaXNMb2dnZWRJbigpKQotICAgewotJT4KLSAgICB2YXIgYXV0aGVudGljYXRpb25TZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInVucHVibGlzaEF1dGhlbnRpY2F0aW9uIik7Ci0gICAgYXV0aGVudGljYXRpb25TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmZvcm1zWzBdOwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCU+LnZhbHVlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKXVucHVibGlzaFRvb2wuZ2V0UHJvcGVydHkoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9QVUJMSVNIX1VSTCkpJT4iOwotICAgIGZvcm0uPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQlPi52YWx1ZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZyl1bnB1Ymxpc2hUb29sLmdldFByb3BlcnR5KFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfVVNFUklEKSklPiI7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEJT4udmFsdWUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpdW5wdWJsaXNoVG9vbC5nZXRQcm9wZXJ0eShVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BBU1NXT1JEKSklPiI7ICAgIAotPCUKLSAgIH0KLSU+Ci0gIH0KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIiBvblVubG9hZD0iY2xvc2VBbGxVZGRpQ2hpbGRXaW5kb3dzKCkiPgotICA8ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1VucHVibGlzaEFjdGlvbkpTUC5qc3AiKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgb25TdWJtaXQ9InJldHVybiBoYW5kbGVTdWJtaXQodGhpcykiPgotPCUKLSAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9IHVucHVibGlzaFRvb2wuZ2V0SGlnaGxpZ2h0ZWRJbWFnZUxpbmsoKTsKLSAgIFN0cmluZyB0aXRsZSA9IHVucHVibGlzaFRvb2wuZ2V0QWx0VGV4dCgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VTlBVQkxJU0hfREVTQyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoInVucHVibGlzaEF1dGhlbnRpY2F0aW9uIik7Ci0lPiAgICAgICAKLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9hdXRoZW50aWNhdGlvbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHNldERlZmF1bHRzKCk7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9hZHZhbmNlZENvbW1vbl90YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvYWR2YW5jZWRDb21tb25fdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmU4NTNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9hZHZhbmNlZENvbW1vbl90YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSBmb3JtVG9vbFBJID0gKEZvcm1Ub29sUHJvcGVydGllc0ludGVyZmFjZSkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGNvbHNwYW49MyBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01BWF9TRUFSQ0hfU0VUIiklPgotPCUKLSAgIGlmICghZm9ybVRvb2xQSS5pc0lucHV0VmFsaWQoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9NQVhfU0VBUkNIX1NFVCkpCi0gICB7Ci0lPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCBjb2xzcGFuPTM+Ci0gICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9NQVhfU0VBUkNIX1NFVCU+IiBjbGFzcz0ic210ZXh0ZW50ZXIiPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY29sc3Bhbj0zIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTUFYX1JFU1VMVFMiKSU+Ci08JQotICAgaWYgKCFmb3JtVG9vbFBJLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfSU5URVJGQUNFX01BWF9SRVNVTFRTKSkKLSAgIHsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICA8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGNvbHNwYW49Mz4KLSAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX01BWF9SRVNVTFRTJT4iIGNsYXNzPSJzbXRleHRlbnRlciI+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2F1dGhlbnRpY2F0aW9uX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1NTQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvYXV0aGVudGljYXRpb25fdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQWJzdHJhY3RVRERJRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuZGF0YW1vZGVsLlJlZ2lzdHJ5RWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuVHJlZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzdWJRdWVyeUtleVByb3BlcnR5IiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuU3ViUXVlcnlLZXlQcm9wZXJ0eSIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci1Ob2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLVRyZWVFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotRm9ybVRvb2wgZm9ybVRvb2wgPSAoRm9ybVRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci1TdHJpbmcgdXNlcm5hbWUgPSBudWxsOwotU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKLWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdFVERElFbGVtZW50KQotewotICBSZWdpc3RyeUVsZW1lbnQgcmVnRWxlbWVudCA9ICgoQWJzdHJhY3RVRERJRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldFJlZ2lzdHJ5RWxlbWVudCgpOwotICB1c2VybmFtZSA9IHJlZ0VsZW1lbnQuZ2V0VXNlcklkKCk7Ci0gIHBhc3N3b3JkID0gcmVnRWxlbWVudC5nZXRDcmVkKCk7Ci19Ci1pZiAodXNlcm5hbWUgPT0gbnVsbCkKLSAgdXNlcm5hbWUgPSAiIjsKLWlmIChwYXNzd29yZCA9PSBudWxsKQotICBwYXNzd29yZCA9ICIiOwotJT4KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iPgotICAgICAgICA8bGFiZWwgZm9yPSI8JT10YWJsZUNvbnRhaW5lcklkKyJfaW5wdXRfcHVibGlzaF91cmwiJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BVQkxJU0hfVVJMIiklPjwvbGFiZWw+Ci0gICAgICAgIDwlCi0gICAgICAgIGlmICghZm9ybVRvb2wuaXNJbnB1dFZhbGlkKFVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUFVCTElTSF9VUkwpKQotICAgICAgICB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iPCU9dGFibGVDb250YWluZXJJZCsiX2lucHV0X3B1Ymxpc2hfdXJsIiU+IiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1BVQkxJU0hfVVJMJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgPGxhYmVsIGZvcj0iPCU9dGFibGVDb250YWluZXJJZCsiX2lucHV0X3VzZXJfaWQiJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VTRVJJRCIpJT48L2xhYmVsPgotICAgICAgICA8JQotICAgICAgICBpZiAoIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1VTRVJJRCkpCi0gICAgICAgIHsKLSAgICAgICAgJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGlucHV0IHR5cGU9InRleHQiIGlkPSI8JT10YWJsZUNvbnRhaW5lcklkKyJfaW5wdXRfdXNlcl9pZCIlPiIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9VU0VSSUQlPiIgdmFsdWU9IjwlPXVzZXJuYW1lJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj48bGFiZWwgZm9yPSI8JT10YWJsZUNvbnRhaW5lcklkKyJfaW5wdXRfcGFzc3dvcmQiJT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BBU1NXT1JEIiklPjwvdGQ+PC9sYWJlbD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIGlkPSI8JT10YWJsZUNvbnRhaW5lcklkKyJfaW5wdXRfcGFzc3dvcmQiJT4iIG5hbWU9IjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfUEFTU1dPUkQlPiIgdmFsdWU9IjwlPXBhc3N3b3JkJT4iIGNsYXNzPSJ0ZXh0ZW50ZXIiPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2NhdGVnb3JpZXNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2NhdGVnb3JpZXNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWZiZWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9jYXRlZ29yaWVzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPiAKLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9DQVRFR09SSUVTIiklPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6YWRkQ2F0ZWdvcnlSb3coJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW1vdmVTZWxlY3RlZENhdGVnb3J5Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4gIAotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9DQVRFR09SWV9UWVBFIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9LRVlfTkFNRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfS0VZX1ZBTFVFIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUNUSU9OUyIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotICAgaWYgKHRhYmxlQ29udGFpbmVySWQuc3RhcnRzV2l0aCgiZmluZEJ1c2luZXNzZXMiKSkKLSAgIHsvLyBjb25kaXRpb24gdG8gdHVybiBvZmYgZm9yIGV2ZXJ5dGhpbmcgb3RoZXIgdGhhbiBmaW5kIGJ5IGJ1c2luZXNzIHNlYXJjaGVzLgotJT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MzAgdmFsaWduPSJjZW50ZXIiPgotICAgICAgICA8bGFiZWwgZm9yPSJidXNpbmVzc19jYXRlZ29yaWVzIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CVVNJTkVTU19DQVRFR09SSUVTIiklPjwvbGFiZWw+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImNlbnRlciI+Ci0gICAgICAgIDxzZWxlY3QgaWQ9ImJ1c2luZXNzX2NhdGVnb3JpZXMiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICA8b3B0aW9uPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9CVVNJTkVTU0VTX09OTFkiKSU+Ci0gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9RmluZFF1YWxpZmllci5zZXJ2aWNlU3Vic2V0JT4iPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9TRVJWSUNFU19PTkxZIiklPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPUZpbmRRdWFsaWZpZXIuY29tYmluZUNhdGVnb3J5QmFncyU+Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fQk9USCIpJT4KLSAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JSAgIAotICAgfQotJT4gICAgIAotPC9kaXY+ICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kZXRhaWxzQ2F0ZWdvcmllc190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0NhdGVnb3JpZXNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2E5MzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kZXRhaWxzQ2F0ZWdvcmllc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NBVEVHT1JJRVMiKSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGREZXRhaWxzQ2F0ZWdvcnlSb3coJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdHJ1ZSkiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbW92ZVNlbGVjdGVkRGV0YWlsc0NhdGVnb3J5Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRTZWxlY3RlZERldGFpbHNDYXRlZ29yeVJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2FuY2VsU2VsZWN0ZWREZXRhaWxzQ2F0ZWdvcnlSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19DQU5DRUwiKSU+PC9hPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ0FURUdPUllfVFlQRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfS0VZX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0tFWV9WQUxVRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FDVElPTlMiKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0Rpc2NvdmVyeVVSTHNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNEaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmMDJlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0Rpc2NvdmVyeVVSTHNfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIGJvb2xlYW4gaGFzRXJyb3JzID0gKChCb29sZWFuKXNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpKS5ib29sZWFuVmFsdWUoKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsKLSU+Ci08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4gIAotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RJU0NPVkVSWVVSTFMiKSU+PC9zdHJvbmc+Ci08JQotICAgaWYgKGhhc0Vycm9ycykKLSAgIHsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4gICAgICAKLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3coJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdHJ1ZSkiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbW92ZVNlbGVjdGVkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDplZGl0U2VsZWN0ZWREZXRhaWxzRGlzY292ZXJ5VVJMUm93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRURJVCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjYW5jZWxTZWxlY3RlZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19DQU5DRUwiKSU+PC9hPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RJU0NPVkVSWVVSTCIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FDVElPTlMiKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0lkZW50aWZpZXJzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kZXRhaWxzSWRlbnRpZmllcnNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4Y2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kZXRhaWxzSWRlbnRpZmllcnNfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsKLSU+Ci08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JREVOVElGSUVSUyIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZERldGFpbHNJZGVudGlmaWVyUm93KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRydWUpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW1vdmVTZWxlY3RlZERldGFpbHNJZGVudGlmaWVyUm93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRTZWxlY3RlZERldGFpbHNJZGVudGlmaWVyUm93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRURJVCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjYW5jZWxTZWxlY3RlZERldGFpbHNJZGVudGlmaWVyUm93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIiklPjwvYT4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lERU5USUZJRVJfVFlQRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfS0VZX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0tFWV9WQUxVRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FDVElPTlMiKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0xhbmd1YWdlSW5wdXRfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2RldGFpbHNMYW5ndWFnZUlucHV0X3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0ZjJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc0xhbmd1YWdlSW5wdXRfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ1tdIG90aGVyUHJvcGVydGllcyA9IChTdHJpbmdbXSlzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKTsKLSAgIFN0cmluZ1tdIHRpdGxlS2V5cyA9IHtvdGhlclByb3BlcnRpZXNbMF0sb3RoZXJQcm9wZXJ0aWVzWzFdfTsKLSAgIGJvb2xlYW4gaGFzRXJyb3JzID0gb3RoZXJQcm9wZXJ0aWVzWzJdLmVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7Ci0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxzdHJvbmc+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UodGl0bGVLZXlzWzBdKSU+PC9zdHJvbmc+Ci08JQotICAgaWYgKGhhc0Vycm9ycykKLSAgIHsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4gICAgICAKLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci08JQotICAgU3RyaW5nIHRleHRDb250cm9sVGl0bGVLZXk7Ci0gICBpZiAodGl0bGVLZXlzWzBdLmVxdWFscygiRk9STV9MQUJFTF9OQU1FUyIpKQotICAgICB0ZXh0Q29udHJvbFRpdGxlS2V5ID0gIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiOwotICAgZWxzZQotICAgICB0ZXh0Q29udHJvbFRpdGxlS2V5ID0gIkZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFIjsKLSU+ICAgICAgICAgCi0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UodGV4dENvbnRyb2xUaXRsZUtleSkpJT4nLHRydWUpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW1vdmVTZWxlY3RlZERldGFpbHNMYW5ndWFnZUlucHV0Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRTZWxlY3RlZERldGFpbHNMYW5ndWFnZUlucHV0Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRURJVCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjYW5jZWxTZWxlY3RlZERldGFpbHNMYW5ndWFnZUlucHV0Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEFOR1VBR0UiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHRpdGxlS2V5c1sxXSklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUNUSU9OUyIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kZXRhaWxzU2luZ2xlSXRlbV90YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZGV0YWlsc1NpbmdsZUl0ZW1fdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWM3Y2ZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kZXRhaWxzU2luZ2xlSXRlbV90YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nIGl0ZW1IZWFkZXIgPSAoU3RyaW5nKXNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpOwotJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9aXRlbUhlYWRlciU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BQ1RJT05TIiklPjwvdGg+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2Rpc2NvdmVyeVVSTHNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2Rpc2NvdmVyeVVSTHNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGVlYmM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9kaXNjb3ZlcnlVUkxzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBib29sZWFuIGhhc0Vycm9ycyA9ICgoQm9vbGVhbilzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKSkuYm9vbGVhblZhbHVlKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7Ci0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+ICAKLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ESVNDT1ZFUllVUkxTIiklPjwvc3Ryb25nPgotPCUKLSAgIGlmIChoYXNFcnJvcnMpCi0gICB7Ci0lPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotPCUKLSAgIH0KLSU+ICAgICAgICAgICAgICAgICAgCi0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGREaXNjb3ZlcnlVUkxSb3coJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW1vdmVTZWxlY3RlZFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RJU0NPVkVSWVVSTCIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9maW5kUXVhbGlmaWVyc190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZmluZFF1YWxpZmllcnNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjY2Y2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9maW5kUXVhbGlmaWVyc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy51ZGRpNGoudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7ICAgCi0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj48c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZJTkRRVUFMSUZJRVJTIiklPjwvc3Ryb25nPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PGxhYmVsIGZvcj0iY29tYmluZV9rZXlzIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9DT01CSU5FX0tFWVMiKSU+PC9sYWJlbD48L3RkPgotICAgICAgPHRkPgotICAgICAgICA8c2VsZWN0IGlkPSJjb21iaW5lX2tleXMiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1GaW5kUXVhbGlmaWVyLmFuZEFsbEtleXMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0FOREFMTEtFWVMiKSU+Ci0gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9RmluZFF1YWxpZmllci5vckFsbEtleXMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX09SQUxMS0VZUyIpJT4KLSAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1GaW5kUXVhbGlmaWVyLm9yTGlrZUtleXMlPiI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX09STElLRUtFWVMiKSU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZD48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TT1JUX0JZX05BTUUiKSU+PC90ZD4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0iYWR2YW5jZV9zb3J0X2J5X25hbWVfYXNjIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NPUlRfQllfTkFNRSU+IiB2YWx1ZT0iPCU9RmluZFF1YWxpZmllci5zb3J0QnlOYW1lQXNjJT4iIGNoZWNrZWQ+PGxhYmVsIGZvcj0iYWR2YW5jZV9zb3J0X2J5X25hbWVfYXNjIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19TT1JUX0FTQyIpJT48L2xhYmVsPgotICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIGlkPSJhZHZhbmNlX3NvcnRfYnlfbmFtZV9kZXNjIiBuYW1lPSI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NPUlRfQllfTkFNRSU+IiB2YWx1ZT0iPCU9RmluZFF1YWxpZmllci5zb3J0QnlOYW1lRGVzYyU+Ij48bGFiZWwgZm9yPSJhZHZhbmNlX3NvcnRfYnlfbmFtZV9kZXNjIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9SQURJT19TT1JUX0RFU0MiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU09SVF9CWV9EQVRFIiklPjwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgaWQ9ImFkdmFuY2Vfc29ydF9ieV9kYXRlX2FzYyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TT1JUX0JZX0RBVEUlPiIgdmFsdWU9IjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5RGF0ZUFzYyU+IiBjaGVja2VkPjxsYWJlbCBmb3I9ImFkdmFuY2Vfc29ydF9ieV9kYXRlX2FzYyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU09SVF9BU0MiKSU+PC9sYWJlbD4KLSAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBpZD0iYWR2YW5jZV9zb3J0X2J5X2RhdGVfZGVzYyIgbmFtZT0iPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TT1JUX0JZX0RBVEUlPiIgdmFsdWU9IjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5RGF0ZURlc2MlPiI+PGxhYmVsIGZvcj0iYWR2YW5jZV9zb3J0X2J5X2RhdGVfZGVzYyI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fUkFESU9fU09SVF9ERVNDIiklPjwvbGFiZWw+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9maW5kZm9ybWhlYWRlci5pbmMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvZmluZGZvcm1oZWFkZXIuaW5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Y5MDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9maW5kZm9ybWhlYWRlci5pbmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRpdGxlSW1hZ2VQYXRoKSklPiI+Ci0gICAgICA8c3Ryb25nPjwlPXRpdGxlJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICAgIDx0ZCB3aWR0aD0iKiI+Jm5ic3A7PC90ZD4KLTwlCi0gICBpbnQgY29sc3BhbiA9IDI7Ci0gICBpZiAoc3ViUXVlcnlLZXkgIT0gbnVsbCAmJiBzdWJRdWVyeUtleS5sZW5ndGgoKSA+IDApCi0gICB7Ci0gICAgIGludCBub2RlSWQgPSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCk7Ci0gICAgIGludCB0b29sSWQgPSBmb3JtVG9vbC5nZXRUb29sSWQoKTsKLSAgICAgaW50IHZpZXdJZCA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKTsKLSAgICAgaW50IHZpZXdUb29sSWQgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xJZCgpOwotICAgICBpbnQgY291bnQgPSAxOwotJT4KLSAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgIDxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RGaW5kVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCx0b29sSWQsdmlld0lkLHZpZXdUb29sSWQsIiIsZmFsc2UpKSklPiI+PCU9Y291bnQlPjwvYT4KLSAgICA8L3RkPgotPCUKLSAgICAgU3RyaW5nIGN1cnJlbnRTdWJRdWVyeUtleSA9IHN1YlF1ZXJ5S2V5OwotICAgICBpbnQgc2VwYXJhdG9yUG9zID0gLTE7Ci0gICAgIHdoaWxlICgoc2VwYXJhdG9yUG9zID0gY3VycmVudFN1YlF1ZXJ5S2V5LmluZGV4T2YoJzonKSkgIT0gLTEpCi0gICAgIHsKLSAgICAgICBjb3VudCsrOwotJT4KLSAgICA8dGQgYWxpZ249InJpZ2h0Ij4KLSAgICAgIDxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RGaW5kVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJZCx0b29sSWQsdmlld0lkLHZpZXdUb29sSWQsY3VycmVudFN1YlF1ZXJ5S2V5LnN1YnN0cmluZygwLHNlcGFyYXRvclBvcyksZmFsc2UpKSklPiI+PCU9Y291bnQlPjwvYT4KLSAgICA8L3RkPiAgICAgIAotPCUgICAKLSAgICAgICBjdXJyZW50U3ViUXVlcnlLZXkgPSBjdXJyZW50U3ViUXVlcnlLZXkuc3Vic3RyaW5nKHNlcGFyYXRvclBvcysxLGN1cnJlbnRTdWJRdWVyeUtleS5sZW5ndGgoKSk7Ci0gICAgIH0KLSAgICAgY29sc3BhbiArPSBjb3VudDsKLSAgIH0KLSU+ICAgIAotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMCBjb2xzcGFuPTwlPWNvbHNwYW4lPj4gPGltZyBoZWlnaHQ9MiB3aWR0aD0iMTAwJSIgYWxpZ249InRvcCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+Ij4gPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvaWRlbnRpZmllcnNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL2lkZW50aWZpZXJzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5OTVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvaWRlbnRpZmllcnNfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsgICAKLSU+Ci08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JREVOVElGSUVSUyIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZElkZW50aWZpZXJSb3coJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpyZW1vdmVTZWxlY3RlZFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySWQlPicpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+ICAKLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotICAgIAotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lERU5USUZJRVJfVFlQRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfS0VZX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0tFWV9WQUxVRSIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9sYW5ndWFnZUlucHV0X3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9sYW5ndWFnZUlucHV0X3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MzIxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvbGFuZ3VhZ2VJbnB1dF90YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nW10gb3RoZXJQcm9wZXJ0aWVzID0gKFN0cmluZ1tdKXNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpOwotICAgU3RyaW5nW10gdGl0bGVLZXlzID0ge290aGVyUHJvcGVydGllc1swXSxvdGhlclByb3BlcnRpZXNbMV19OwotICAgYm9vbGVhbiBoYXNFcnJvcnMgPSBvdGhlclByb3BlcnRpZXNbMl0uZXF1YWxzKEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLSAgIGJvb2xlYW4gaXNGaW5kID0gdGFibGVDb250YWluZXJJZC5zdGFydHNXaXRoKCJmaW5kIik7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7Ci0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxzdHJvbmc+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UodGl0bGVLZXlzWzBdKSU+PC9zdHJvbmc+Ci08JQotICAgaWYgKGhhc0Vycm9ycykKLSAgIHsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci08JQotICAgU3RyaW5nIHRleHRDb250cm9sVGl0bGVLZXk7Ci0gICBpZiAodGl0bGVLZXlzWzBdLmVxdWFscygiRk9STV9MQUJFTF9OQU1FUyIpKQotICAgICB0ZXh0Q29udHJvbFRpdGxlS2V5ID0gIkZPUk1fQ09OVFJPTF9USVRMRV9OQU1FX1RFWFRfVkFMVUUiOwotICAgZWxzZQotICAgICB0ZXh0Q29udHJvbFRpdGxlS2V5ID0gIkZPUk1fQ09OVFJPTF9USVRMRV9ERVNDUklQVElPTl9URVhUX1ZBTFVFIjsKLSU+ICAgICAgIAotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGRMYW5ndWFnZUlucHV0Um93KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UodGV4dENvbnRyb2xUaXRsZUtleSkpJT4nKSI+Ci0gICAgICAgIDwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPgotICAgICAgPC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MQU5HVUFHRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UodGl0bGVLZXlzWzFdKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUgCi0gICBpZiAoaXNGaW5kKQotICAgey8vIGNvbmRpdGlvbiB0byB0dXJuIG9mZiB3aGVuIHB1Ymxpc2hpbmcgdG8gY29tZS4KLSU+ICAgICAKLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9uYW1lc19maW5kUXVhbGlmaWVyc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgfQotJT4gICAgIAotPC9kaXY+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvbmFtZXNfZmluZFF1YWxpZmllcnNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL25hbWVzX2ZpbmRRdWFsaWZpZXJzX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNlZTY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvbmFtZXNfZmluZFF1YWxpZmllcnNfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy51ZGRpNGoudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJmaW5kX3F1YWxpZmllcl9leGFjdF9uYW1lX21hdGNoIiB2YWx1ZT0iPCU9RmluZFF1YWxpZmllci5leGFjdE5hbWVNYXRjaCU+Ij48bGFiZWwgZm9yPSJmaW5kX3F1YWxpZmllcl9leGFjdF9uYW1lX21hdGNoIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9FWEFDVF9OQU1FX01BVENIIiklPjwvbGFiZWw+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImZpbmRfcXVhbGlmaWVyX2Nhc2Vfc2Vuc2l0aXZlX21hdGNoIiB2YWx1ZT0iPCU9RmluZFF1YWxpZmllci5jYXNlU2Vuc2l0aXZlTWF0Y2glPiI+PGxhYmVsIGZvcj0iZmluZF9xdWFsaWZpZXJfY2FzZV9zZW5zaXRpdmVfbWF0Y2giPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NBU0VfU0VOU0lUSVZFX01BVENIIiklPjwvbGFiZWw+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvcmVzdWx0c190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvcmVzdWx0c190YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYjc4MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3Jlc3VsdHNfdGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklkID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ1tdIHNwZWNpZmljSW5mbyA9IChTdHJpbmdbXSlzZWN0aW9uSGVhZGVySW5mby5nZXRPdGhlclByb3BlcnRpZXMoKTsKLSAgIFN0cmluZyB0aXRsZSA9IHNwZWNpZmljSW5mb1swXTsKLSAgIFN0cmluZyBwYXJlbnRDb250YWluZXJJZCA9IHNwZWNpZmljSW5mb1sxXTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklkKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9NiBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT48YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklkJT4nLCc8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZS50b1N0cmluZygpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+PC90ZD4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT10aXRsZSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RFU0NSSVBUSU9OIiklPjwvdGg+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3Jlc3VsdHNmb3JtaGVhZGVyLmluYyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy9yZXN1bHRzZm9ybWhlYWRlci5pbmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzcwZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3Jlc3VsdHNmb3JtaGVhZGVyLmluYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh0aXRsZUltYWdlUGF0aCkpJT4iPgotICAgICAgPHN0cm9uZz48JT10aXRsZSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLTwlCi0gICBpbnQgY29sc3BhbiA9IDE7Ci0gICBpZiAoaGFzVGFyZ2V0KQotICAgewotICAgICBTdHJpbmcgcmV0dXJuTGluayA9IFRyYW5zZmVyU3ViUXVlcnlSZXN1bHRzQWN0aW9uLmdldEFjdGlvbkxpbmtGb3JSZXR1cm4oKTsKLSU+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iKiI+Jm5ic3A7PC90ZD4KLSAgICA8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQocmV0dXJuTGluaykpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1RBUkdFVCIpJT48L2E+Ci0gICAgPC90ZD4KLTwlCi0gICAgIGNvbHNwYW4gKz0gMjsKLSAgIH0KLSU+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIGNvbHNwYW49PCU9Y29sc3BhbiU+PiA8aW1nIGhlaWdodD0yIHdpZHRoPSIxMDAlIiBhbGlnbj0idG9wIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iPiA8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGNvbHNwYW49PCU9Y29sc3BhbiU+PgotPCUKLSAgIGlmIChoYXNUYXJnZXQpCi0gICB7Ci0lPgotPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU1VCUVVFUlkiKSU+Ci08JQotICAgfQotJT4KLTwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1FVRVJZIiklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3VkX2NhdGVnb3JpZXNfdGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3VkX2NhdGVnb3JpZXNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGZjMThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy91ZF9jYXRlZ29yaWVzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudWRkaTRqLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPiAKLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPHN0cm9uZz48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VU0VSX0RFRklORURfQ0FURUdPUklFUyIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRTZWxlY3RlZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRURJVCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjYW5jZWxTZWxlY3RlZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93cygnPCU9dGFibGVDb250YWluZXJJZCU+JykiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGhlaWdodD0xMD48aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMva2V5bGluZS5naWYiKSklPiIgaGVpZ2h0PTIgd2lkdGg9IjEwMCUiPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT10YWJsZUNvbnRhaW5lcklkJT4iIHN0eWxlPSJkaXNwbGF5OicnOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJZCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxNSUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BTUUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMCUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NIRUNLRUQiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSI3MCUiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0ZJTEUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIqIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUNUSU9OUyIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzUHVibGlzaGVyQXNzZXJ0aW9uc190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNQdWJsaXNoZXJBc3NlcnRpb25zX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlZmZkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvZm9ybXMvdWRkaU9iamVjdHNQdWJsaXNoZXJBc3NlcnRpb25zX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuQnVzaW5lc3NFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdbXSBzcGVjaWZpY0luZm8gPSAoU3RyaW5nW10pc2VjdGlvbkhlYWRlckluZm8uZ2V0T3RoZXJQcm9wZXJ0aWVzKCk7Ci0gICBTdHJpbmcgdGFibGVUaXRsZUtleSA9IHNwZWNpZmljSW5mb1swXTsKLSAgIGJvb2xlYW4gaGFzRXJyb3JzID0gc3BlY2lmaWNJbmZvWzFdLmVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0gICBTdHJpbmcgcXVlcnlJdGVtU3RyaW5nID0gc3BlY2lmaWNJbmZvWzJdOwotICAgU3RyaW5nIHBhcmVudENvbnRhaW5lcklkID0gc3BlY2lmaWNJbmZvWzNdOwotICAgU3RyaW5nIHRyYW5zZmVyVGFyZ2V0S2V5ID0gc3BlY2lmaWNJbmZvWzRdOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHRhYmxlVGl0bGVLZXkpJT48L3N0cm9uZz4KLTwlCi0gICBpZiAoaGFzRXJyb3JzKQotICAgewotJT4KLSAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPiAgICAgICAgIAotICAgIDwvdGQ+Ci08JQotICAgaWYgKHNlY3Rpb25IZWFkZXJJbmZvLmlzRHluYW1pYygpKQotICAgewotJT4gICAgICAgCi0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aW5pdGlhdGVTdWJRdWVyeSgnPCU9cGFyZW50Q29udGFpbmVySWQlPicsJzwlPXRyYW5zZmVyVGFyZ2V0S2V5JT4nLDwlPXF1ZXJ5SXRlbVN0cmluZyU+LHRydWUpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0dFVCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDppbml0aWF0ZVN1YlF1ZXJ5KCc8JT1wYXJlbnRDb250YWluZXJJZCU+JywnPCU9dHJhbnNmZXJUYXJnZXRLZXklPicsPCU9cXVlcnlJdGVtU3RyaW5nJT4sZmFsc2UpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0ZJTkQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci08JQotICAgfQotJT4gICAgICAgCi0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT0oKEJ1c2luZXNzRWxlbWVudCl1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRyZWVFbGVtZW50KCkpLmdldEJ1c2luZXNzRW50aXR5KCkuZ2V0RGVmYXVsdE5hbWVTdHJpbmcoKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RJUkVDVElPTiIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfREVTQ1JJUFRJT04iKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FTU0VSVElPTl9UWVBFIiklPjwvdGg+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9mb3Jtcy91ZGRpT2JqZWN0c190YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTA2MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2Zvcm1zL3VkZGlPYmplY3RzX3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdbXSBzcGVjaWZpY0luZm8gPSAoU3RyaW5nW10pc2VjdGlvbkhlYWRlckluZm8uZ2V0T3RoZXJQcm9wZXJ0aWVzKCk7Ci0gICBTdHJpbmcgdGFibGVUaXRsZUtleSA9IHNwZWNpZmljSW5mb1swXTsKLSAgIGJvb2xlYW4gaGFzRXJyb3JzID0gc3BlY2lmaWNJbmZvWzFdLmVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0gICBTdHJpbmcgcXVlcnlJdGVtU3RyaW5nID0gc3BlY2lmaWNJbmZvWzJdOwotICAgU3RyaW5nIHBhcmVudENvbnRhaW5lcklkID0gc3BlY2lmaWNJbmZvWzNdOwotICAgU3RyaW5nIHRyYW5zZmVyVGFyZ2V0S2V5ID0gc3BlY2lmaWNJbmZvWzRdOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKHRhYmxlVGl0bGVLZXkpJT48L3N0cm9uZz4KLTwlCi0gICBpZiAoaGFzRXJyb3JzKQotICAgewotJT4KLSAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLTwlCi0gICB9Ci0lPiAgICAgICAgIAotICAgIDwvdGQ+Ci08JQotICAgaWYgKHNlY3Rpb25IZWFkZXJJbmZvLmlzRHluYW1pYygpKQotICAgewotJT4gICAgICAgCi0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6aW5pdGlhdGVTdWJRdWVyeSgnPCU9cGFyZW50Q29udGFpbmVySWQlPicsJzwlPXRyYW5zZmVyVGFyZ2V0S2V5JT4nLDwlPXF1ZXJ5SXRlbVN0cmluZyU+LHRydWUpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0dFVCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDppbml0aWF0ZVN1YlF1ZXJ5KCc8JT1wYXJlbnRDb250YWluZXJJZCU+JywnPCU9dHJhbnNmZXJUYXJnZXRLZXklPicsPCU9cXVlcnlJdGVtU3RyaW5nJT4sZmFsc2UpIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0ZJTkQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6cmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklkJT4nKSI+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci08JQotICAgfQotJT4gICAgICAgCi0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySWQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ERVNDUklQVElPTiIpJT48L3RoPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3NfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2J1c2luZXNzX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZkOTRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3NfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q2YTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3Nlc19jbG9zZWRfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NWMwOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvYnVzaW5lc3Nlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzA0M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2J1c2luZXNzZXNfb3Blbl9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2J1c2luZXNzZXNfb3Blbl9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDdjZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9idXNpbmVzc2VzX29wZW5faGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9jYXRlZ29yeS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2NhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUxNGQ3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2NhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvZmluZF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvZmluZF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxOGQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2ZpbmRfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2ZpbmRfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9maW5kX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0MGEwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL2ZpbmRfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9vcGVuX3JlZ2lzdHJ5X2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9vcGVuX3JlZ2lzdHJ5X2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzUwNjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL29wZW5fcmVnaXN0cnlfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU2OTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvb3Blbl9yZWdpc3RyeV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3B1Ymxpc2hfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3B1Ymxpc2hfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDI2M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcHVibGlzaF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyY2VmMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcHVibGlzaF9zZXJ2aWNlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX3NlcnZpY2VfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODk0ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX3NlcnZpY2VfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3B1Ymxpc2hfc2VydmljZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3B1Ymxpc2hfc2VydmljZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWVhNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoZXJfYXNzZXJ0aW9uc19lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcHVibGlzaGVyX2Fzc2VydGlvbnNfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmY4NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoZXJfYXNzZXJ0aW9uc19lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcHVibGlzaGVyX2Fzc2VydGlvbnNfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoZXJfYXNzZXJ0aW9uc19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZTk5MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9wdWJsaXNoZXJfYXNzZXJ0aW9uc19oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9xdWVyaWVzX2Nsb3NlZF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczN2Q3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9xdWVyaWVzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1NTAwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcXVlcmllc19vcGVuX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcXVlcmllc19vcGVuX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZjYTE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJpZXNfb3Blbl9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3F1ZXJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcXVlcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjA3NjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcXVlcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9yZWZlcmVuY2VkX3NlcnZpY2VzX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9yZWZlcmVuY2VkX3NlcnZpY2VzX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWQ3OTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVmZXJlbmNlZF9zZXJ2aWNlc19lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVmZXJlbmNlZF9zZXJ2aWNlc19oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3JlZmVyZW5jZWRfc2VydmljZXNfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDE1MDZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVmZXJlbmNlZF9zZXJ2aWNlc19oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3JlZ2lzdHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVnaXN0cnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQzY2FlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvcmVnaXN0cnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9yZWdzdHJ5Y2F0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3JlZ3N0cnljYXRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ZDU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3JlZ3N0cnljYXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTY3MTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTMyNWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlX2ludGVyZmFjZXNfY2xvc2VkX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlX2ludGVyZmFjZXNfY2xvc2VkX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU0YTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19jbG9zZWRfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ5ODIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VfaW50ZXJmYWNlc19vcGVuX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX29wZW5faGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjYzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZV9pbnRlcmZhY2VzX29wZW5faGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlc19jbG9zZWRfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5OGY2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZXNfY2xvc2VkX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2NTQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX2Nsb3NlZF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX29wZW5fZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3NlcnZpY2VzX29wZW5fZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MmI0YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlc19vcGVuX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlc19vcGVuX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvc2VydmljZXNfb3Blbl9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODYwNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy9zZXJ2aWNlc19vcGVuX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MjJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9idXNfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9idXNfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTQxNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy91bnB1Ymxpc2hfYnVzX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy91bnB1Ymxpc2hfYnVzX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX2J1c19oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzBiMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy91bnB1Ymxpc2hfYnVzX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTRkZDNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGJkODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL2ltYWdlcy91bnB1Ymxpc2hfc2VydmljZV9pbnRlcmZhY2VfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYjE5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9pbWFnZXMvdW5wdWJsaXNoX3NlcnZpY2VfaW50ZXJmYWNlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3MTNlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvaW1hZ2VzL3VucHVibGlzaF9zZXJ2aWNlX2ludGVyZmFjZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOGZiYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL25hdmlnYXRvcl9jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuTkFWSUdBVE9SX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL25hdmlnYXRvcl90b29sYmFyLmpzcCIpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEVOVCU+IiB0aXRsZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvbmF2aWdhdG9yX2NvbnRlbnQuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL25hdmlnYXRvcl9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhMTkzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvbmF2aWdhdG9yX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3RyZWV2aWV3LmNzcyIpKSU+Ij4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci0gIDwvc2NyaXB0PgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy90cmVldmlldy5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08JQotICAgU3RyaW5nIHNlbGVjdGVkQW5jaG9yTmFtZSA9ICIiOwotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBpbnQgZm9jdXNlZE5vZGVJZCA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0Rm9jdXNlZE5vZGVJZCgpOwotICAgU3RyaW5nIGZvY3VzZWRBbmNob3JOYW1lID0gU3RyaW5nLnZhbHVlT2YoZm9jdXNlZE5vZGVJZCk7Ci0gICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpCi0gICB7Ci0gICAgIHNlbGVjdGVkQW5jaG9yTmFtZSA9IHNlbGVjdGVkTm9kZS5nZXRBbmNob3JOYW1lKCk7Ci0gICAgIGlmIChmb2N1c2VkTm9kZUlkID09IHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSkKLSAgICAgICBmb2N1c2VkQW5jaG9yTmFtZSA9IHNlbGVjdGVkQW5jaG9yTmFtZTsKLSAgIH0KLSU+Ci08Ym9keSBvbkxvYWQ9InNlbGYubG9jYXRpb24uaGFzaD0nIzwlPWZvY3VzZWRBbmNob3JOYW1lJT4nO3NldFNlbGVjdGVkQW5jaG9yTmFtZSgnPCU9c2VsZWN0ZWRBbmNob3JOYW1lJT4nKSIgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9InRyZWVjb250ZW50Ym9yZGVyIj4KLTwlPW5hdmlnYXRvck1hbmFnZXIucmVuZGVyVHJlZVZpZXcocmVzcG9uc2UpJT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL25hdmlnYXRvcl90b29sYmFyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9uYXZpZ2F0b3JfdG9vbGJhci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNmVjMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL25hdmlnYXRvcl90b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3VkZGkvc2NyaXB0cy91ZGRpZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJ1ZGRpL2FjdGlvbnMvUmVzaXplVURESUZyYW1lc0FjdGlvbkpTUC5qc3AiKTsKLSU+ICAKLTwvanNwOnVzZUJlYW4+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUZyYW1lTmFtZS5hcHBlbmQoVURESUZyYW1lTmFtZXMuTkFWSUdBVE9SX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9Qcm9jZXNzVURESUZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL25hdmlnYXRvci5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci08JQotICAgU3RyaW5nIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBudWxsOwotICAgaWYgKHVkZGlQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgZWxzZQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFIik7Ci0lPiAgICAgICAgCi0gICAgICAgIDx0ZCBpZD0iZG91YmxlY2xpY2tjb2x1bW4iIHRpdGxlPSI8JT1kb3VibGVDbGlja0NvbHVtblRpdGxlJT4iIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX05BVklHQVRPUiIpJT48L3RkPgotPCUKLSAgIFN0cmluZyBhbHRSZWZyZXNoID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfUkVGUkVTSCIpOwotICAgU3RyaW5nIGFsdENsZWFyID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfQ0xFQVIiKTsKLSU+ICAgCi0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL1JlZnJlc2hVRERJTm9kZUFjdGlvbkpTUC5qc3AiKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcykiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvcmVmcmVzaF9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIiBhbHQ9IjwlPWFsdFJlZnJlc2glPiIgdGl0bGU9IjwlPWFsdFJlZnJlc2glPiI+PC9hPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZUFjdGlvbkpTUC5qc3AiKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTYgb25Nb3VzZU92ZXI9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKSIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZW91dCh0aGlzKSIgb25Nb3VzZURvd249InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlZG93bih0aGlzKSIgb25Nb3VzZVVwPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiIGFsdD0iPCU9YWx0Q2xlYXIlPiIgdGl0bGU9IjwlPWFsdENsZWFyJT4iPjwvYT48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZmJiNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgcm93cz0iMzMsKiIgYm9yZGVyPTAgYmdjb2xvcj0iI0VDRTlEOCI+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5QUk9QRVJUSUVTX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPVVERElGcmFtZU5hbWVzLlBST1BFUlRJRVNfQ09OVEVOVCU+IiB0aXRsZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjE1YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3Byb3BlcnRpZXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTwlCi0gICBOb2RlTWFuYWdlciBuYXZpZ2F0b3JNYW5hZ2VyID0gdWRkaVBlcnNwZWN0aXZlLmdldE5hdmlnYXRvck1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROYXZpZ2F0b3JOb2RlID0gbmF2aWdhdG9yTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgIGlmIChzZWxlY3RlZE5hdmlnYXRvck5vZGUgIT0gbnVsbCkKLSAgIHsKLSAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXI7Ci0gICAgIGlmIChzZWxlY3RlZE5hdmlnYXRvck5vZGUuZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROYXZpZ2F0b3JOb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgIGVsc2UKLSAgICAgICB0b29sTWFuYWdlciA9IHNlbGVjdGVkTmF2aWdhdG9yTm9kZS5nZXRWaWV3VG9vbE1hbmFnZXIoKTsKLSAgICAgVG9vbCBzZWxlY3RlZFRvb2wgPSB0b29sTWFuYWdlci5nZXRTZWxlY3RlZFRvb2woKTsKLSAgICAgaWYgKHNlbGVjdGVkVG9vbCAhPSBudWxsICYmIHNlbGVjdGVkVG9vbC5nZXRUb29sVHlwZSgpICE9IFRvb2xUeXBlcy5BQ1RJT04pCi0gICAgIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgbG9jYXRpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChzZWxlY3RlZFRvb2wuZ2V0Rm9ybUxpbmsoKSkpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX0FDVElPTl9TRUxFQ1RFRCIpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi0gICAgIH0KLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19OT0RFX1NFTEVDVEVEIiklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3Byb3BlcnRpZXNfdG9vbGJhci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMDQ3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3Byb3BlcnRpZXNfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGlmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9InRvb2xiYXJib2R5bWFyZ2luIj4KLTxkaXYgaWQ9InRvb2xiYXJib3JkZXIiPgotICA8ZGl2IGlkPSJ0b29sYmFyIiBvbmRibGNsaWNrPSJwcm9jZXNzRnJhbWVzZXRTaXplcyhkb2N1bWVudC5mb3Jtc1swXSkiPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgZm9ybUFjdGlvbi5hcHBlbmQoInVkZGkvYWN0aW9ucy9SZXNpemVVRERJRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChVRERJRnJhbWVOYW1lcy5QUk9QRVJUSUVTX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9Qcm9jZXNzVURESUZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2FjdGlvbnMuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmICh1ZGRpUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgIHsKLSAgICAgaWYgKHVkZGlQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkuc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgfQotICAgaWYgKGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPT0gbnVsbCkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9BQ1RJT05TIiklPjwvdGQ+Ci08JQotICAgTm9kZU1hbmFnZXIgbmF2aWdhdG9yTWFuYWdlciA9IHVkZGlQZXJzcGVjdGl2ZS5nZXROYXZpZ2F0b3JNYW5hZ2VyKCk7Ci0gICBOb2RlIHNlbGVjdGVkTmF2aWdhdG9yTm9kZSA9IG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBpZiAoc2VsZWN0ZWROYXZpZ2F0b3JOb2RlICE9IG51bGwpCi0gICB7Ci0gICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyOwotICAgICBpZiAoc2VsZWN0ZWROYXZpZ2F0b3JOb2RlLmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICAgICB0b29sTWFuYWdlciA9IHNlbGVjdGVkTmF2aWdhdG9yTm9kZS5nZXRUb29sTWFuYWdlcigpOwotICAgICBlbHNlCi0gICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5hdmlnYXRvck5vZGUuZ2V0Vmlld1Rvb2xNYW5hZ2VyKCk7Ci0gICAgIGZvciAoaW50IGk9MDtpPHRvb2xNYW5hZ2VyLmdldE51bWJlck9mVG9vbHMoKTtpKyspCi0gICAgIHsKLSAgICAgICBUb29sIHRvb2wgPSAoVG9vbCl0b29sTWFuYWdlci5nZXRUb29sKGkpOwotJT4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PCU9dG9vbC5yZW5kZXJUb29sKHJlc3BvbnNlLGNvbnRyb2xsZXIpJT48L3RkPgotPCUKLSAgICAgfQotICAgfQotJT4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL2NicGFuZXMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvY2JwYW5lcy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMjcxOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvY2JwYW5lcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLioiICU+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgY2F0ZWdvcnlCcm93c2VyV2luZG93ID0gdG9wOwotICB2YXIgY2F0ZWdvcnlCcm93c2VyV2luZG93V29ya0FyZWEgPSB0b3AuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5DQVRFR09SSUVTX1dPUktBUkVBJT4iXTsKLSAgdmFyIGNhdGVnb3J5QnJvd3NlcldpbmRvd1Rvb2xiYXIgPSBjYXRlZ29yeUJyb3dzZXJXaW5kb3cuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5DQVRFR09SSUVTX1RPT0xCQVIlPiJdOwotICB2YXIgY2F0ZWdvcnlCcm93c2VyV2luZG93Q29udGVudCA9IGNhdGVnb3J5QnJvd3NlcldpbmRvdy5mcmFtZXNbIjwlPVVERElGcmFtZU5hbWVzLkNBVEVHT1JJRVNfQ09OVEVOVCU+Il07Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL2RldGFpbHN0YWJsZXMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvZGV0YWlsc3RhYmxlcy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzNhZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvZGV0YWlsc3RhYmxlcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGl0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdyh0YWJsZUNvbnRhaW5lcklkLHRleHRDb250cm9sVGl0bGUsaGFzRXJyb3IpCi0gIHsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi53aWR0aCA9ICI3MCUiOwotICAgIGNvbHVtbjMuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLQotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiPCU9QWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUJT4iKSk7IDwlLy8gdmlld0lkJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIiIpKTsgPCUvLyBvcmlnaW5hbCBsYW5ndWFnZSU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLCIiKSk7IDwlLy8gb3JpZ2luYWwgdGV4dCU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLHRleHRDb250cm9sVGl0bGUpKTsgPCUvLyBjb250cm9sIHRpdGxlJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsaGFzRXJyb3IpKTsgPCUvLyBtb2RlJT4KLSAgICBpZiAoaGFzRXJyb3IpCi0gICAgewotICAgICAgdmFyIGxhbmd1YWdlU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgICBsYW5ndWFnZVNlbGVjdC5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCI7Ci0gICAgICBwb3B1bGF0ZUxhbmd1YWdlU2VsZWN0KGxhbmd1YWdlU2VsZWN0KTsKLSAgICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQobGFuZ3VhZ2VTZWxlY3QpOwotICAgICAgCi0gICAgICB2YXIgdGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgIHRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgICAgdGV4dElucHV0LnRpdGxlID0gdGV4dENvbnRyb2xUaXRsZTsKLSAgICAgIGNvbHVtbjIuYXBwZW5kQ2hpbGQodGV4dElucHV0KTsKLSAgICAgIAotICAgICAgYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dSZW1vdmVBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMyx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMyx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgfQotICAgIAotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4zKTsKLSAgICAKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbikKLSAgewotICAgIGZvciAodmFyIGk9MDtpPGNvbHVtbi5jaGlsZE5vZGVzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgY29sdW1uLnJlbW92ZUNoaWxkKGNvbHVtbi5jaGlsZE5vZGVzW2ldKTsKLSAgICAgIGktLTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciByZW1vdmVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChyZW1vdmVMaW5rLCJyZW1vdmVEZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdyIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgcmVtb3ZlTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKHJlbW92ZUxpbmspOwotICB9Ci0KLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciBlZGl0TGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQoZWRpdExpbmssImVkaXREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvdyIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgZWRpdExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZWRpdExpbmspOyAgCi0gIH0gIAotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dDYW5jZWxBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIGNhbmNlbExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgc2V0SlNMaW5rUm93VGFyZ2V0KGNhbmNlbExpbmssImNhbmNlbERldGFpbHNMYW5ndWFnZUlucHV0Um93RWRpdCIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgY2FuY2VsTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGNhbmNlbExpbmspOwotICB9Ci0gIAotICBmdW5jdGlvbiBlZGl0RGV0YWlsc0xhbmd1YWdlSW5wdXRSb3codGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW3Jvd0luZGV4XTsKLSAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICAKLSAgICB2YXIgbGFuZ0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgIHZhciBpbnB1dFZhbHVlID0gY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlOwotICAgIHZhciB0ZXh0Q29udHJvbFRpdGxlID0gY29sdW1uMS5jaGlsZE5vZGVzWzNdLnZhbHVlOwotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPT0gInRydWUiKQotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIHJldHVybjsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPSB0cnVlOwotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XTsKLSAgICAKLSAgICB2YXIgbGFuZ3VhZ2VTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICBwb3B1bGF0ZUxhbmd1YWdlU2VsZWN0KGxhbmd1YWdlU2VsZWN0KTsKLSAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZChsYW5ndWFnZVNlbGVjdCxjb2x1bW4xQ29udHJvbCk7Ci0gICAgbGFuZ3VhZ2VTZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgIHNldExhbmd1YWdlU2VsZWN0KGxhbmd1YWdlU2VsZWN0LGxhbmdJZCk7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIHZhciB0ZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjIucmVwbGFjZUNoaWxkKHRleHRJbnB1dCxjb2x1bW4yQ29udHJvbCk7Ci0gICAgdGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgdGV4dElucHV0LnRpdGxlID0gdGV4dENvbnRyb2xUaXRsZTsKLSAgICB0ZXh0SW5wdXQudmFsdWUgPSBpbnB1dFZhbHVlOwotCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uMyk7Ci0gICAgYWRkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dDYW5jZWxBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMyxyb3dJbmRleCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNldERldGFpbHNMYW5ndWFnZUlucHV0Um93KHRhYmxlQ29udGFpbmVySWQsaW5kZXgsdmlld0lkLGxhbmdJZCxpbnB1dFZhbHVlKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3NbbnVtYmVyT2ZIZWFkZXJSb3dzK2luZGV4XTsKLSAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMF0udmFsdWUgPSB2aWV3SWQ7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlID0gbGFuZ0lkOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZSA9IGlucHV0VmFsdWU7Ci0gICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XTsKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICBzZXRMYW5ndWFnZVNlbGVjdChjb2x1bW4xQ29udHJvbCxsYW5nSWQpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YXIgdGVtcFNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgICAgcG9wdWxhdGVMYW5ndWFnZVNlbGVjdCh0ZW1wU2VsZWN0KTsKLSAgICAgIHZhciBsYW5ndWFnZSA9IHNldExhbmd1YWdlU2VsZWN0KHRlbXBTZWxlY3QsbGFuZ0lkKTsKLSAgICAgIGNvbHVtbjEucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGdldERlZmF1bHREaXNwbGF5U3RyaW5nKGxhbmd1YWdlKSksY29sdW1uMUNvbnRyb2wpOwotICAgIH0KLSAgICAKLSAgICB2YXIgY29sdW1uMkNvbnRyb2wgPSBjb2x1bW4yLmNoaWxkTm9kZXNbMF07Ci0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgY29sdW1uMkNvbnRyb2wudmFsdWUgPSBpbnB1dFZhbHVlOwotICAgIGVsc2UKLSAgICAgIGNvbHVtbjIucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGdldERlZmF1bHREaXNwbGF5U3RyaW5nKGlucHV0VmFsdWUpKSxjb2x1bW4yQ29udHJvbCkKLSAgfQotICAKLSAgZnVuY3Rpb24gcmVtb3ZlRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3codGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleCk7Ci0gICAgZml4RGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dMaW5rcyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgfQotICAgIAotICBmdW5jdGlvbiBjYW5jZWxEZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd0VkaXQodGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW3Jvd0luZGV4XTsKLSAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICAKLSAgICB2YXIgdmlld0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgIHZhciBsYW5nSWQgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWU7Ci0gICAgdmFyIGlucHV0VmFsdWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWU7Ci0gICAgdmFyIHJvd0FjdGlvbkxpbmtIcmVmID0gY29sdW1uMy5jaGlsZE5vZGVzW2NvbHVtbjMuY2hpbGROb2Rlcy5sZW5ndGgtMV0uaHJlZjsKLSAgICBpZiAocm93QWN0aW9uTGlua0hyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpjYW5jZWwiKSAhPSAwKQotICAgICAgcmV0dXJuOwotICAgICAgCi0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID0gZmFsc2U7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjFDb250cm9sID0gY29sdW1uMS5jaGlsZE5vZGVzWzVdOwotICAgIHZhciB0ZW1wU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgcG9wdWxhdGVMYW5ndWFnZVNlbGVjdCh0ZW1wU2VsZWN0KTsKLSAgICB2YXIgbGFuZ3VhZ2UgPSBzZXRMYW5ndWFnZVNlbGVjdCh0ZW1wU2VsZWN0LGxhbmdJZCk7Ci0gICAgY29sdW1uMS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZ2V0RGVmYXVsdERpc3BsYXlTdHJpbmcobGFuZ3VhZ2UpKSxjb2x1bW4xQ29udHJvbCk7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIGNvbHVtbjIucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGdldERlZmF1bHREaXNwbGF5U3RyaW5nKGlucHV0VmFsdWUpKSxjb2x1bW4yQ29udHJvbCk7Ci0KLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4zKTsKLSAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMyxyb3dJbmRleCk7Ci0gIH0KLQotICBmdW5jdGlvbiByZW1vdmVTZWxlY3RlZERldGFpbHNMYW5ndWFnZUlucHV0Um93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgcmVtb3ZlU2VsZWN0ZWRSb3dzKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZpeERldGFpbHNMYW5ndWFnZUlucHV0Um93TGlua3ModGFibGVDb250YWluZXJJZCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGZpeERldGFpbHNMYW5ndWFnZUlucHV0Um93TGlua3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIDwlLy8gRml4IHRoZSBsaW5rcyU+Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvdyA9IHRhYmxlLnJvd3NbaV07Ci0gICAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IGNvbHVtbnMuaXRlbSgwKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgCi0gICAgICBmb3IgKHZhciBqPTE7ajxjb2x1bW5zLmxlbmd0aDtqKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICAgIGNvbHVtbnMuaXRlbShqKS5jbGFzc05hbWUgPSAicm93Y29sb3IiOwotICAgICAgICBlbHNlCi0gICAgICAgICAgY29sdW1ucy5pdGVtKGopLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICAgIHZhciBsaW5rID0gY29sdW1uMy5jaGlsZE5vZGVzW2NvbHVtbjMuY2hpbGROb2Rlcy5sZW5ndGgtMV07Ci0gICAgICB2YXIgcmVtb3ZlTGluazsKLSAgICAgIGlmIChsaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpyZW1vdmUiKSA9PSAwKQotICAgICAgICByZW1vdmVMaW5rID0gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVtb3ZlTGluayA9IGZhbHNlOwotICAgICAgICAKLSAgICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjMpOyAgICAgICAgICAgIAotICAgICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgICAgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OnJlbW92ZSIpID09IDApCi0gICAgICAgIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjMsaSk7Ci0gICAgICBlbHNlIGlmIChsaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpjYW5jZWwiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzTGFuZ3VhZ2VJbnB1dFJvd0NhbmNlbEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4zLGkpOwotICAgICAgZWxzZSBpZiAobGluay5ocmVmLmluZGV4T2YoImphdmFzY3JpcHQ6ZWRpdCIpID09IDApCi0gICAgICAgIGFkZERldGFpbHNMYW5ndWFnZUlucHV0Um93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4zLGkpOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gZWRpdFNlbGVjdGVkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgZWRpdERldGFpbHNMYW5ndWFnZUlucHV0Um93KHRhYmxlQ29udGFpbmVySWQsaSk7Ci0gICAgfQotICB9Ci0gICAgCi0gIGZ1bmN0aW9uIGNhbmNlbFNlbGVjdGVkRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgY2FuY2VsRGV0YWlsc0xhbmd1YWdlSW5wdXRSb3dFZGl0KHRhYmxlQ29udGFpbmVySWQsaSk7Ci0gICAgfQotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzSWRlbnRpZmllclJvdyh0YWJsZUNvbnRhaW5lcklkLGhhc0Vycm9yKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLSAgICAKLSAgICBjb2x1bW4wLmNsYXNzTmFtZSA9ICJjaGVja2JveGNlbGxzIjsKLSAgICBjb2x1bW4xLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4xLndpZHRoID0gIjEwJSI7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi53aWR0aCA9ICI0MCUiOwotICAgIGNvbHVtbjMuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjMud2lkdGggPSAiNDAlIjsKLSAgICBjb2x1bW40LmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLQotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiPCU9QWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUJT4iKSk7IDwlLy8gdmlld0lkJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIiIpKTsgPCUvLyBvcmlnaW5hbCBrZXkgdHlwZSU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLCIiKSk7IDwlLy8gb3JpZ2luYWwga2V5IG5hbWUlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiIikpOyA8JS8vIG9yaWdpbmFsIGtleSB2YWx1ZSU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLGhhc0Vycm9yKSk7IDwlLy8gbW9kZSU+Ci0gICAgCi0gICAgdmFyIGlkZW50aWZpZXJUeXBlU2VsZWN0OwotICAgIHZhciBrZXlOYW1lVGV4dElucHV0OwotICAgIGlmIChoYXNFcnJvcikKLSAgICB7Ci0gICAgICBpZGVudGlmaWVyVHlwZVNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgICAgaWRlbnRpZmllclR5cGVTZWxlY3Qub25jaGFuZ2UgPSBoYW5kbGVJZGVudGlmaWVyQ2hhbmdlOwotICAgICAgcG9wdWxhdGVJZGVudGlmaWVyVHlwZVNlbGVjdChpZGVudGlmaWVyVHlwZVNlbGVjdCk7Ci0gICAgICBpZGVudGlmaWVyVHlwZVNlbGVjdC5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCI7Ci0gICAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGlkZW50aWZpZXJUeXBlU2VsZWN0KTsgICAgCi0gICAgCi0gICAgICBrZXlOYW1lVGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgIGtleU5hbWVUZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICAgIGtleU5hbWVUZXh0SW5wdXQudGl0bGUgPSAiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FIiklPiI7Ci0gICAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGtleU5hbWVUZXh0SW5wdXQpOwotCi0gICAgICB2YXIga2V5VmFsdWVUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAga2V5VmFsdWVUZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICAgIGtleVZhbHVlVGV4dElucHV0LnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfSURFTlRJRklFUl9LRVlfVkFMVUUiKSU+IjsKLSAgICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQoa2V5VmFsdWVUZXh0SW5wdXQpOyAgICAgIAotICAgICAgYWRkRGV0YWlsc0lkZW50aWZpZXJSb3dSZW1vdmVBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBhZGREZXRhaWxzSWRlbnRpZmllclJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgfQotICAgIAotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4zKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uNCk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gICAgaWYgKGhhc0Vycm9yKQotICAgICAga2V5TmFtZVRleHRJbnB1dC52YWx1ZSA9IGlkZW50aWZpZXJUeXBlU2VsZWN0Lm9wdGlvbnNbMF0udGV4dDsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNJZGVudGlmaWVyUm93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciByZW1vdmVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChyZW1vdmVMaW5rLCJyZW1vdmVEZXRhaWxzSWRlbnRpZmllclJvdyIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgcmVtb3ZlTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKHJlbW92ZUxpbmspOwotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzSWRlbnRpZmllclJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIGVkaXRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChlZGl0TGluaywiZWRpdERldGFpbHNJZGVudGlmaWVyUm93Iix0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KTsKLSAgICBlZGl0TGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRURJVCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChlZGl0TGluayk7Ci0gIH0gIAotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNJZGVudGlmaWVyUm93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciBjYW5jZWxMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChjYW5jZWxMaW5rLCJjYW5jZWxEZXRhaWxzSWRlbnRpZmllclJvd0VkaXQiLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGNhbmNlbExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0NBTkNFTCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChjYW5jZWxMaW5rKTsgIAotICB9Ci0KLSAgZnVuY3Rpb24gZWRpdERldGFpbHNJZGVudGlmaWVyUm93KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tyb3dJbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgdmFyIGNvbHVtbjQgPSBjb2x1bW5zLml0ZW0oNCk7Ci0gICAgCi0gICAgdmFyIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZSAgICAgCi0gICAgdmFyIGtleU5hbWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWU7Ci0gICAgdmFyIGtleVZhbHVlID0gY29sdW1uMS5jaGlsZE5vZGVzWzNdLnZhbHVlOwotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPT0gInRydWUiKQotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIHJldHVybjsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPSB0cnVlOwotICAgIAotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XTsKLSAgICB2YXIgaWRlbnRpZmllclR5cGVTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICBpZGVudGlmaWVyVHlwZVNlbGVjdC5vbmNoYW5nZSA9IGhhbmRsZUlkZW50aWZpZXJDaGFuZ2U7Ci0gICAgcG9wdWxhdGVJZGVudGlmaWVyVHlwZVNlbGVjdChpZGVudGlmaWVyVHlwZVNlbGVjdCk7Ci0gICAgY29sdW1uMS5yZXBsYWNlQ2hpbGQoaWRlbnRpZmllclR5cGVTZWxlY3QsY29sdW1uMUNvbnRyb2wpOwotICAgIGlkZW50aWZpZXJUeXBlU2VsZWN0LmNsYXNzTmFtZSA9ICJzZWxlY3RsaXN0IjsKLSAgICBzZXRUTW9kZWxLZXlTZWxlY3QoaWRlbnRpZmllclR5cGVTZWxlY3QsdE1vZGVsS2V5KTsgICAgCi0gICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIHZhciBrZXlOYW1lVGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4yLnJlcGxhY2VDaGlsZChrZXlOYW1lVGV4dElucHV0LGNvbHVtbjJDb250cm9sKTsKLSAgICBrZXlOYW1lVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAga2V5TmFtZVRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX05BTUUiKSU+IjsKLSAgICBrZXlOYW1lVGV4dElucHV0LnZhbHVlID0ga2V5TmFtZTsKLSAgICAKLSAgICB2YXIgY29sdW1uM0NvbnRyb2wgPSBjb2x1bW4zLmNoaWxkTm9kZXNbMF07Ci0gICAgdmFyIGtleVZhbHVlVGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4zLnJlcGxhY2VDaGlsZChrZXlWYWx1ZVRleHRJbnB1dCxjb2x1bW4zQ29udHJvbCk7Ci0gICAga2V5VmFsdWVUZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICBrZXlWYWx1ZVRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX1ZBTFVFIiklPiI7Ci0gICAga2V5VmFsdWVUZXh0SW5wdXQudmFsdWUgPSBrZXlWYWx1ZTsKLSAgIAotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjQpOwotICAgIAotICAgIGFkZERldGFpbHNJZGVudGlmaWVyUm93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQscm93SW5kZXgpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RGV0YWlsc0lkZW50aWZpZXJSb3codGFibGVDb250YWluZXJJZCxpbmRleCx2aWV3SWQsdE1vZGVsS2V5LGtleU5hbWUsa2V5VmFsdWUpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3MraW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgIHZhciBjb2x1bW4zID0gY29sdW1ucy5pdGVtKDMpOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZSA9IHZpZXdJZDsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWUgPSB0TW9kZWxLZXk7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlID0ga2V5TmFtZTsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbM10udmFsdWUgPSBrZXlWYWx1ZTsKLSAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID09ICJ0cnVlIik7Ci0gICAgdmFyIGNvbHVtbjFDb250cm9sID0gY29sdW1uMS5jaGlsZE5vZGVzWzVdOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIHNldFRNb2RlbEtleVNlbGVjdChjb2x1bW4xQ29udHJvbCx0TW9kZWxLZXkpOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YXIgdGVtcFNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgICAgcG9wdWxhdGVJZGVudGlmaWVyVHlwZVNlbGVjdCh0ZW1wU2VsZWN0KTsKLSAgICAgIHZhciB0TW9kZWxLZXlWYWx1ZSA9IHNldFRNb2RlbEtleVNlbGVjdCh0ZW1wU2VsZWN0LHRNb2RlbEtleSk7Ci0gICAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0TW9kZWxLZXlWYWx1ZSksY29sdW1uMUNvbnRyb2wpOwotICAgIH0KLSAgICAgICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIGNvbHVtbjJDb250cm9sLnZhbHVlID0ga2V5TmFtZTsKLSAgICBlbHNlCi0gICAgICBjb2x1bW4yLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShrZXlOYW1lKSxjb2x1bW4yQ29udHJvbCk7Ci0gICAgICAKLSAgICB2YXIgY29sdW1uM0NvbnRyb2wgPSBjb2x1bW4zLmNoaWxkTm9kZXNbMF07Ci0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgY29sdW1uM0NvbnRyb2wudmFsdWUgPSBrZXlWYWx1ZTsKLSAgICBlbHNlCi0gICAgICBjb2x1bW4zLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShrZXlWYWx1ZSksY29sdW1uM0NvbnRyb2wpOwotICB9Ci0KLSAgZnVuY3Rpb24gcmVtb3ZlRGV0YWlsc0lkZW50aWZpZXJSb3codGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleCk7Ci0gICAgZml4RGV0YWlsc0lkZW50aWZpZXJSb3dMaW5rcyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gY2FuY2VsRGV0YWlsc0lkZW50aWZpZXJSb3dFZGl0KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tyb3dJbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgdmFyIGNvbHVtbjQgPSBjb2x1bW5zLml0ZW0oNCk7Ci0gICAgCi0gICAgdmFyIHZpZXdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICB2YXIgdE1vZGVsS2V5ID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgIHZhciBrZXlOYW1lID0gY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlOwotICAgIHZhciBrZXlWYWx1ZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXS52YWx1ZTsKLSAgICB2YXIgcm93QWN0aW9uTGlua0hyZWYgPSBjb2x1bW40LmNoaWxkTm9kZXNbY29sdW1uNC5jaGlsZE5vZGVzLmxlbmd0aC0xXS5ocmVmOwotICAgIGlmIChyb3dBY3Rpb25MaW5rSHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmNhbmNlbCIpICE9IDApCi0gICAgICByZXR1cm47Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID0gZmFsc2U7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjFDb250cm9sID0gY29sdW1uMS5jaGlsZE5vZGVzWzVdOwotICAgIHZhciB0ZW1wU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgcG9wdWxhdGVJZGVudGlmaWVyVHlwZVNlbGVjdCh0ZW1wU2VsZWN0KTsKLSAgICB2YXIgdE1vZGVsS2V5VmFsdWUgPSBzZXRUTW9kZWxLZXlTZWxlY3QodGVtcFNlbGVjdCx0TW9kZWxLZXkpOwotICAgIGNvbHVtbjEucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRNb2RlbEtleVZhbHVlKSxjb2x1bW4xQ29udHJvbCk7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIGNvbHVtbjIucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleU5hbWUpLGNvbHVtbjJDb250cm9sKTsKLSAgICAKLSAgICB2YXIgY29sdW1uM0NvbnRyb2wgPSBjb2x1bW4zLmNoaWxkTm9kZXNbMF07Ci0gICAgY29sdW1uMy5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoa2V5VmFsdWUpLGNvbHVtbjNDb250cm9sKTsKLQotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjQpOwotICAgIGFkZERldGFpbHNJZGVudGlmaWVyUm93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW40LHJvd0luZGV4KTsKLSAgfQotICAKLSAgZnVuY3Rpb24gcmVtb3ZlU2VsZWN0ZWREZXRhaWxzSWRlbnRpZmllclJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHJlbW92ZVNlbGVjdGVkUm93cyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICA8JS8vIEZpeCB0aGUgbGlua3MlPgotICAgIGZpeERldGFpbHNJZGVudGlmaWVyUm93TGlua3ModGFibGVDb250YWluZXJJZCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGZpeERldGFpbHNJZGVudGlmaWVyUm93TGlua3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW2ldOwotICAgICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSBjb2x1bW5zLml0ZW0oMCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGZvciAodmFyIGo9MTtqPGNvbHVtbnMubGVuZ3RoO2orKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgICAgY29sdW1ucy5pdGVtKGopLmNsYXNzTmFtZSA9ICJyb3djb2xvciI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjb2x1bW5zLml0ZW0oaikuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgICAgfQotICAgICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgICB2YXIgdmlld0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgdmFyIGNvbHVtbjQgPSBjb2x1bW5zLml0ZW0oNCk7Ci0gICAgICB2YXIgbGluayA9IGNvbHVtbjQuY2hpbGROb2Rlc1tjb2x1bW40LmNoaWxkTm9kZXMubGVuZ3RoLTFdOwotICAgICAgdmFyIHJlbW92ZUxpbms7Ci0gICAgICBpZiAobGluay5ocmVmLmluZGV4T2YoImphdmFzY3JpcHQ6cmVtb3ZlIikgPT0gMCkKLSAgICAgICAgcmVtb3ZlTGluayA9IHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlbW92ZUxpbmsgPSBmYWxzZTsgICAgICAKLSAgICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjQpOwotICAgICAgCi0gICAgICBpZiAobGluay5ocmVmLmluZGV4T2YoImphdmFzY3JpcHQ6cmVtb3ZlIikgPT0gMCkKLSAgICAgICAgYWRkRGV0YWlsc0lkZW50aWZpZXJSb3dSZW1vdmVBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCxpKTsKLSAgICAgIGVsc2UgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmVkaXQiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzSWRlbnRpZmllclJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCxpKTsKLSAgICAgIGVsc2UgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmNhbmNlbCIpID09IDApCi0gICAgICAgIGFkZERldGFpbHNJZGVudGlmaWVyUm93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsaSk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIGZ1bmN0aW9uIGVkaXRTZWxlY3RlZERldGFpbHNJZGVudGlmaWVyUm93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGVkaXREZXRhaWxzSWRlbnRpZmllclJvdyh0YWJsZUNvbnRhaW5lcklkLGkpOwotICAgIH0gIAotICB9Ci0gIAotICBmdW5jdGlvbiBjYW5jZWxTZWxlY3RlZERldGFpbHNJZGVudGlmaWVyUm93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGNhbmNlbERldGFpbHNJZGVudGlmaWVyUm93RWRpdCh0YWJsZUNvbnRhaW5lcklkLGkpOwotICAgIH0gIAotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzQ2F0ZWdvcnlSb3codGFibGVDb250YWluZXJJZCxoYXNFcnJvcikKLSAgewotICAgIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIAotICAgIHZhciByb3dDaGVja2JveCA9IGNyZWF0ZVJvd0NoZWNrYm94KCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0gICAgCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMS53aWR0aCA9ICI1JSI7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi53aWR0aCA9ICI1NSUiOwotICAgIGNvbHVtbjMuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjMud2lkdGggPSAiMjUlIjsKLSAgICBjb2x1bW40LmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLQotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiPCU9QWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUJT4iKSk7IDwlLy8gdmlld0lkJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIiIpKTsgPCUvLyBvcmlnaW5hbCBrZXkgdHlwZSU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLCIiKSk7IDwlLy8gb3JpZ2luYWwga2V5IG5hbWUlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiIikpOyA8JS8vIG9yaWdpbmFsIGtleSB2YWx1ZSU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLGhhc0Vycm9yKSk7IDwlLy8gbW9kZSU+Ci0gICAgCi0gICAgaWYgKGhhc0Vycm9yKQotICAgIHsKLSAgICAgIHZhciBjYXRlZ29yeVR5cGVTZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKTsKLSAgICAgIHBvcHVsYXRlQ2F0ZWdvcnlUeXBlU2VsZWN0KGNhdGVnb3J5VHlwZVNlbGVjdCk7Ci0gICAgICBjYXRlZ29yeVR5cGVTZWxlY3QuY2xhc3NOYW1lID0gInNlbGVjdGxpc3QiOwotICAgICAgY29sdW1uMS5hcHBlbmRDaGlsZChjYXRlZ29yeVR5cGVTZWxlY3QpOwotICAgICAgCi0gICAgICB2YXIga2V5TmFtZVRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICBrZXlOYW1lVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgICBrZXlOYW1lVGV4dElucHV0LnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfS0VZX05BTUUiKSU+IjsKLSAgICAgIGNvbHVtbjIuYXBwZW5kQ2hpbGQoa2V5TmFtZVRleHRJbnB1dCk7Ci0gICAgICAKLSAgICAgIHZhciBrZXlWYWx1ZVRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICBrZXlWYWx1ZVRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgICAga2V5VmFsdWVUZXh0SW5wdXQudGl0bGUgPSAiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9LRVlfVkFMVUUiKSU+IjsKLSAgICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQoa2V5VmFsdWVUZXh0SW5wdXQpOwotICAgICAgYWRkQ2F0ZWdvcnlSb3dCcm93c2VMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSk7Ci0gICAgICBhZGREZXRhaWxzQ2F0ZWdvcnlSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsdGFibGUucm93cy5sZW5ndGgpOwotICAgIH0KLSAgICAgIAotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4zKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uNCk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7ICAgICAgCi0gIH0KLQotICBmdW5jdGlvbiBhZGREZXRhaWxzQ2F0ZWdvcnlSb3dDYW5jZWxBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIGNhbmNlbExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgc2V0SlNMaW5rUm93VGFyZ2V0KGNhbmNlbExpbmssImNhbmNlbERldGFpbHNDYXRlZ29yeVJvd0VkaXQiLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGNhbmNlbExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0NBTkNFTCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChjYW5jZWxMaW5rKTsgIAotICB9Ci0KLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0NhdGVnb3J5Um93QnJvd3NlQ2FuY2VsQWN0aW9uTGlua3ModGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICBhZGRDYXRlZ29yeVJvd0Jyb3dzZUxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTsKLSAgICBhZGREZXRhaWxzQ2F0ZWdvcnlSb3dDYW5jZWxBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNDYXRlZ29yeVJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIGVkaXRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChlZGl0TGluaywiZWRpdERldGFpbHNDYXRlZ29yeVJvdyIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgZWRpdExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZWRpdExpbmspOwotICB9Ci0KLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0NhdGVnb3J5Um93UmVtb3ZlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciByZW1vdmVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChyZW1vdmVMaW5rLCJyZW1vdmVEZXRhaWxzQ2F0ZWdvcnlSb3ciLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIHJlbW92ZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChyZW1vdmVMaW5rKTsgIAotICB9Ci0KLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0NhdGVnb3J5Um93QnJvd3NlUmVtb3ZlQWN0aW9uTGlua3ModGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICBhZGRDYXRlZ29yeVJvd0Jyb3dzZUxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTsKLSAgICBhZGREZXRhaWxzQ2F0ZWdvcnlSb3dSZW1vdmVBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uLHJvd0luZGV4KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGVkaXREZXRhaWxzQ2F0ZWdvcnlSb3codGFibGVDb250YWluZXJJZCxyb3dJbmRleCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW3Jvd0luZGV4XTsKLSAgICB2YXIgY29sdW1ucyA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICB2YXIgY29sdW1uNCA9IGNvbHVtbnMuaXRlbSg0KTsKLSAgICAKLSAgICB2YXIgdE1vZGVsS2V5ID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlCi0gICAgdmFyIGtleU5hbWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWU7Ci0gICAgdmFyIGtleVZhbHVlID0gY29sdW1uMS5jaGlsZE5vZGVzWzNdLnZhbHVlOwotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPT0gInRydWUiKQotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIHJldHVybjsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPSB0cnVlOwotICAgIAotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XTsKLSAgICB2YXIgY2F0ZWdvcnlUeXBlU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgcG9wdWxhdGVDYXRlZ29yeVR5cGVTZWxlY3QoY2F0ZWdvcnlUeXBlU2VsZWN0KTsKLSAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZChjYXRlZ29yeVR5cGVTZWxlY3QsY29sdW1uMUNvbnRyb2wpOwotICAgIGNhdGVnb3J5VHlwZVNlbGVjdC5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCI7Ci0gICAgc2V0VE1vZGVsS2V5U2VsZWN0KGNhdGVnb3J5VHlwZVNlbGVjdCx0TW9kZWxLZXkpOyAgICAKLSAgICAKLSAgICB2YXIgY29sdW1uMkNvbnRyb2wgPSBjb2x1bW4yLmNoaWxkTm9kZXNbMF07Ci0gICAgdmFyIGtleU5hbWVUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjIucmVwbGFjZUNoaWxkKGtleU5hbWVUZXh0SW5wdXQsY29sdW1uMkNvbnRyb2wpOwotICAgIGtleU5hbWVUZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICBrZXlOYW1lVGV4dElucHV0LnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfS0VZX05BTUUiKSU+IjsKLSAgICBrZXlOYW1lVGV4dElucHV0LnZhbHVlID0ga2V5TmFtZTsKLSAgICAKLSAgICB2YXIgY29sdW1uM0NvbnRyb2wgPSBjb2x1bW4zLmNoaWxkTm9kZXNbMF07Ci0gICAgdmFyIGtleVZhbHVlVGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4zLnJlcGxhY2VDaGlsZChrZXlWYWx1ZVRleHRJbnB1dCxjb2x1bW4zQ29udHJvbCk7Ci0gICAga2V5VmFsdWVUZXh0SW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICBrZXlWYWx1ZVRleHRJbnB1dC50aXRsZSA9ICI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0NBVEVHT1JZX0tFWV9WQUxVRSIpJT4iOwotICAgIGtleVZhbHVlVGV4dElucHV0LnZhbHVlID0ga2V5VmFsdWU7Ci0gICAgCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uNCk7Ci0gICAgCi0gICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93QnJvd3NlQ2FuY2VsQWN0aW9uTGlua3ModGFibGVDb250YWluZXJJZCxjb2x1bW40LHJvd0luZGV4KTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldERldGFpbHNDYXRlZ29yeVJvdyh0YWJsZUNvbnRhaW5lcklkLGluZGV4LHZpZXdJZCx0TW9kZWxLZXksa2V5TmFtZSxrZXlWYWx1ZSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93cytpbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlID0gdmlld0lkOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZSA9IHRNb2RlbEtleTsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWUgPSBrZXlOYW1lOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1szXS52YWx1ZSA9IGtleVZhbHVlOwotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbNF0udmFsdWUgPT0gInRydWUiKTsKLSAgICAKLSAgICB2YXIgY29sdW1uMUNvbnRyb2wgPSBjb2x1bW4xLmNoaWxkTm9kZXNbNV07Ci0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgc2V0VE1vZGVsS2V5U2VsZWN0KGNvbHVtbjFDb250cm9sLHRNb2RlbEtleSk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHZhciB0ZW1wU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgICBwb3B1bGF0ZUNhdGVnb3J5VHlwZVNlbGVjdCh0ZW1wU2VsZWN0KTsKLSAgICAgIHZhciB0TW9kZWxLZXlWYWx1ZSA9IHNldFRNb2RlbEtleVNlbGVjdCh0ZW1wU2VsZWN0LHRNb2RlbEtleSk7Ci0gICAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0TW9kZWxLZXlWYWx1ZSksY29sdW1uMUNvbnRyb2wpOwotICAgIH0KLSAgICAgICAgCi0gICAgdmFyIGNvbHVtbjJDb250cm9sID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIGNvbHVtbjJDb250cm9sLnZhbHVlID0ga2V5TmFtZTsKLSAgICBlbHNlCi0gICAgICBjb2x1bW4yLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShrZXlOYW1lKSxjb2x1bW4yQ29udHJvbCk7Ci0gICAgICAKLSAgICB2YXIgY29sdW1uM0NvbnRyb2wgPSBjb2x1bW4zLmNoaWxkTm9kZXNbMF07Ci0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgY29sdW1uM0NvbnRyb2wudmFsdWUgPSBrZXlWYWx1ZTsKLSAgICBlbHNlCi0gICAgICBjb2x1bW4zLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShrZXlWYWx1ZSksY29sdW1uM0NvbnRyb2wpOyAKLSAgfQotCi0gIGZ1bmN0aW9uIHJlbW92ZURldGFpbHNDYXRlZ29yeVJvdyh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdGFibGUuZGVsZXRlUm93KHJvd0luZGV4KTsKLSAgICBmaXhEZXRhaWxzQ2F0ZWdvcnlSb3dMaW5rcyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gY2FuY2VsRGV0YWlsc0NhdGVnb3J5Um93RWRpdCh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3Nbcm93SW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgIHZhciBjb2x1bW4zID0gY29sdW1ucy5pdGVtKDMpOwotICAgIHZhciBjb2x1bW40ID0gY29sdW1ucy5pdGVtKDQpOwotICAgIAotICAgIHZhciB2aWV3SWQgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgdmFyIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZTsKLSAgICB2YXIga2V5TmFtZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZTsKLSAgICB2YXIga2V5VmFsdWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbM10udmFsdWU7Ci0gICAgdmFyIHJvd0FjdGlvbkxpbmtIcmVmID0gY29sdW1uNC5jaGlsZE5vZGVzW2NvbHVtbjQuY2hpbGROb2Rlcy5sZW5ndGgtMV0uaHJlZjsKLSAgICBpZiAocm93QWN0aW9uTGlua0hyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpjYW5jZWwiKSAhPSAwKQotICAgICAgcmV0dXJuOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9IGZhbHNlOwotICAgIAotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XTsKLSAgICB2YXIgdGVtcFNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIHBvcHVsYXRlQ2F0ZWdvcnlUeXBlU2VsZWN0KHRlbXBTZWxlY3QpOwotICAgIHZhciB0TW9kZWxLZXlWYWx1ZSA9IHNldFRNb2RlbEtleVNlbGVjdCh0ZW1wU2VsZWN0LHRNb2RlbEtleSk7Ci0gICAgY29sdW1uMS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodE1vZGVsS2V5VmFsdWUpLGNvbHVtbjFDb250cm9sKTsKLSAgICAKLSAgICB2YXIgY29sdW1uMkNvbnRyb2wgPSBjb2x1bW4yLmNoaWxkTm9kZXNbMF07Ci0gICAgY29sdW1uMi5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoa2V5TmFtZSksY29sdW1uMkNvbnRyb2wpOwotICAgIAotICAgIHZhciBjb2x1bW4zQ29udHJvbCA9IGNvbHVtbjMuY2hpbGROb2Rlc1swXTsKLSAgICBjb2x1bW4zLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShrZXlWYWx1ZSksY29sdW1uM0NvbnRyb2wpOwotCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uNCk7ICAgIAotICAgIGFkZERldGFpbHNDYXRlZ29yeVJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCxyb3dJbmRleCk7Ci0gICAgaWYgKHJvd0luZGV4ID09IHRhcmdldENhdGVnb3J5Um93KQotICAgICAgY2xvc2VDYXRlZ29yeUJyb3dzZXIoKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gcmVtb3ZlU2VsZWN0ZWREZXRhaWxzQ2F0ZWdvcnlSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICByZW1vdmVTZWxlY3RlZFJvd3ModGFibGVDb250YWluZXJJZCk7Ci0gICAgPCUvLyBGaXggdGhlIGxpbmtzJT4KLSAgICBmaXhEZXRhaWxzQ2F0ZWdvcnlSb3dMaW5rcyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gZml4RGV0YWlsc0NhdGVnb3J5Um93TGlua3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW2ldOwotICAgICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSBjb2x1bW5zLml0ZW0oMCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGZvciAodmFyIGo9MTtqPGNvbHVtbnMubGVuZ3RoO2orKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgICAgY29sdW1ucy5pdGVtKGopLmNsYXNzTmFtZSA9ICJyb3djb2xvciI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjb2x1bW5zLml0ZW0oaikuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgICAgfQotICAgICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgICB2YXIgdmlld0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgdmFyIGNvbHVtbjQgPSBjb2x1bW5zLml0ZW0oNCk7Ci08JSAgICAgIAotICAgICAgLy8gQnJvd3NlLCBSZW1vdmUKLSAgICAgIC8vIEJyb3dzZSwgQ2FuY2VsCi0gICAgICAvLyBFZGl0Ci0gICAgICAvLyBCcm93c2UKLSU+ICAgICAgCi0gICAgICB2YXIgbGFzdExpbmsgPSBjb2x1bW40LmNoaWxkTm9kZXNbY29sdW1uNC5jaGlsZE5vZGVzLmxlbmd0aC0xXTsKLSAgICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjQpOwotICAgICAgaWYgKGxhc3RMaW5rLmhyZWYuaW5kZXhPZigiamF2YXNjcmlwdDpyZW1vdmUiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzQ2F0ZWdvcnlSb3dCcm93c2VSZW1vdmVBY3Rpb25MaW5rcyh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsaSk7Ci0gICAgICBlbHNlIGlmIChsYXN0TGluay5ocmVmLmluZGV4T2YoImphdmFzY3JpcHQ6Y2FuY2VsIikgPT0gMCkKLSAgICAgICAgYWRkRGV0YWlsc0NhdGVnb3J5Um93QnJvd3NlQ2FuY2VsQWN0aW9uTGlua3ModGFibGVDb250YWluZXJJZCxjb2x1bW40LGkpOwotICAgICAgZWxzZSBpZiAobGFzdExpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmVkaXQiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzQ2F0ZWdvcnlSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsaSk7Ci0gICAgICBlbHNlIGlmIChsYXN0TGluay5ocmVmLmluZGV4T2YoImphdmFzY3JpcHQ6b3BlbiIpID09IDApCi0gICAgICAgIGFkZENhdGVnb3J5Um93QnJvd3NlTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjQsaSk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIGZ1bmN0aW9uIGVkaXRTZWxlY3RlZERldGFpbHNDYXRlZ29yeVJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBlZGl0RGV0YWlsc0NhdGVnb3J5Um93KHRhYmxlQ29udGFpbmVySWQsaSk7Ci0gICAgfSAgCi0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbFNlbGVjdGVkRGV0YWlsc0NhdGVnb3J5Um93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGNhbmNlbERldGFpbHNDYXRlZ29yeVJvd0VkaXQodGFibGVDb250YWluZXJJZCxpKTsKLSAgICB9ICAKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3codGFibGVDb250YWluZXJJZCx0TW9kZWxLZXksY2F0ZWdvcnlOYW1lLGlzQ2hlY2tlZCxmaWxlTmFtZSxoYXNFcnJvcikKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4zID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMS53aWR0aCA9ICIxNSUiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIud2lkdGggPSAiMTAlIjsKLSAgICBjb2x1bW4zLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4zLndpZHRoID0gIjcwJSI7Ci0gICAgY29sdW1uNC5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLSAgICAKLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsZmlsZU5hbWUpKTsgIDwlLy8gb3JpZ2luYWwgZmlsZSBuYW1lJT4KLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsaGFzRXJyb3IpKTsgIDwlLy8gbW9kZSU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLHRNb2RlbEtleSkpOyA8JS8vIHRNb2RlbEtleSU+Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjYXRlZ29yeU5hbWUpKTsKLSAgICAKLSAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGlzQ2hlY2tlZCkpOwotICAgIAotICAgIGlmIChoYXNFcnJvcikKLSAgICB7Ci0gICAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfVE1PREVMX0tFWSU+Iix0TW9kZWxLZXkpKTsKLSAgICAgIHZhciBmaWxlSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgICAgZmlsZUlucHV0LnNldEF0dHJpYnV0ZSgibmFtZSIsIjwlPVVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfRklMRU5BTUUlPiIpOwotICAgICAgZmlsZUlucHV0LnNldEF0dHJpYnV0ZSgidHlwZSIsImZpbGUiKTsKLSAgICAgIGZpbGVJbnB1dC50aXRsZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9GSUxFIikpJT4iOwotICAgICAgZmlsZUlucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZWZpbGVicm93c2UiOwotICAgICAgY29sdW1uMy5hcHBlbmRDaGlsZChmaWxlSW5wdXQpOwotICAgICAgYWRkRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3dDYW5jZWxMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGZpbGVOYW1lKSk7Ci0gICAgICBhZGREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd0VkaXRMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCx0YWJsZS5yb3dzLmxlbmd0aCk7Ci0gICAgfQotICAgIAotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4zKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uNCk7Ci0gICAgCi0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93RWRpdExpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgZWRpdExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgc2V0SlNMaW5rUm93VGFyZ2V0KGVkaXRMaW5rLCJlZGl0RGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3ciLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGVkaXRMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19FRElUIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGVkaXRMaW5rKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gZWRpdERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tyb3dJbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7ICAgIAotICAgIHZhciBjb2x1bW4zID0gY29sdW1ucy5pdGVtKDMpOwotICAgIHZhciBjb2x1bW40ID0gY29sdW1ucy5pdGVtKDQpOwotICAgIAotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWUgPT0gInRydWUiKTsKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICByZXR1cm47Ci0gICAgdmFyIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZTsKLSAgICBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWUgPSB0cnVlOwotICAgIAotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjMpOwotICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5DQVRFR09SWV9UTU9ERUxfS0VZJT4iLHRNb2RlbEtleSkpOwotICAgIHZhciBmaWxlSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGZpbGVJbnB1dC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCI8JT1VRERJQWN0aW9uSW5wdXRzLkNBVEVHT1JZX0ZJTEVOQU1FJT4iKTsKLSAgICBmaWxlSW5wdXQuc2V0QXR0cmlidXRlKCJ0eXBlIiwiZmlsZSIpOwotICAgIGZpbGVJbnB1dC50aXRsZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9DQVRFR09SWV9GSUxFIikpJT4iOwotICAgIGZpbGVJbnB1dC5jbGFzc05hbWUgPSAidGFibGVmaWxlYnJvd3NlIjsKLSAgICBjb2x1bW4zLmFwcGVuZENoaWxkKGZpbGVJbnB1dCk7Ci0gICAgCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uNCk7Ci0gICAgCi0gICAgYWRkRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3dDYW5jZWxMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCxyb3dJbmRleCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93Q2FuY2VsTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciBjYW5jZWxMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChjYW5jZWxMaW5rLCJjYW5jZWxEZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd0VkaXQiLHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpOwotICAgIGNhbmNlbExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0NBTkNFTCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChjYW5jZWxMaW5rKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gY2FuY2VsRGV0YWlsc1VzZXJEZWZpbmVkQ2F0ZWdvcnlSb3dFZGl0KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tyb3dJbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjMgPSBjb2x1bW5zLml0ZW0oMyk7Ci0gICAgdmFyIGNvbHVtbjQgPSBjb2x1bW5zLml0ZW0oNCk7Ci0gICAgCi0gICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgIGlmICghZWRpdGFibGUpCi0gICAgICByZXR1cm47Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlID0gZmFsc2U7Ci0gICAgCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uMyk7Ci0gICAgY29sdW1uMy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2x1bW4xLmNoaWxkTm9kZXNbMF0udmFsdWUpKTsKLSAgICAKLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW40KTsKLSAgICAKLSAgICBhZGREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd0VkaXRMaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uNCxyb3dJbmRleCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGVkaXRTZWxlY3RlZERldGFpbHNVc2VyRGVmaW5lZENhdGVnb3J5Um93cyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGVkaXREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvdyh0YWJsZUNvbnRhaW5lcklkLGkpOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gY2FuY2VsU2VsZWN0ZWREZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBjYW5jZWxEZXRhaWxzVXNlckRlZmluZWRDYXRlZ29yeVJvd0VkaXQodGFibGVDb250YWluZXJJZCxpKTsKLSAgICB9Ci0gIH0gIAotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvdyh0YWJsZUNvbnRhaW5lcklkLGhhc0Vycm9yKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMS53aWR0aCA9ICI4NSUiOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIAotICAgIHZhciByb3dDaGVja2JveCA9IGNyZWF0ZVJvd0NoZWNrYm94KCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0gICAgCi0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLCI8JT1BY3Rpb25JbnB1dHMuVklFV0lEX0RFRkFVTFQlPiIpKTsgPCUvLyB2aWV3SWQlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIiwiIikpOyA8JS8vIG9yaWdpbmFsIERpc2NvdmVyeSBVUkwlPgotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiIixoYXNFcnJvcikpOyA8JS8vIG1vZGUlPgotICAgIGlmIChoYXNFcnJvcikKLSAgICB7Ci0gICAgICB2YXIgdGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgIHRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgICAgdGV4dElucHV0LnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfRElTQ09WRVJZX1VSTCIpJT4iOwotICAgICAgY29sdW1uMS5hcHBlbmRDaGlsZCh0ZXh0SW5wdXQpOwotICAgICAgYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd1JlbW92ZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4yLHRhYmxlLnJvd3MubGVuZ3RoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpKTsKLSAgICAgIGFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjIsdGFibGUucm93cy5sZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4yKTsKLSAgICAKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd1JlbW92ZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgcmVtb3ZlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQocmVtb3ZlTGluaywicmVtb3ZlRGV0YWlsc0Rpc2NvdmVyeVVSTFJvdyIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgcmVtb3ZlTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKHJlbW92ZUxpbmspOwotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzRGlzY292ZXJ5VVJMUm93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgZWRpdExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgc2V0SlNMaW5rUm93VGFyZ2V0KGVkaXRMaW5rLCJlZGl0RGV0YWlsc0Rpc2NvdmVyeVVSTFJvdyIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgZWRpdExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZWRpdExpbmspOwotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzRGlzY292ZXJ5VVJMUm93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbixyb3dJbmRleCkKLSAgewotICAgIHZhciBjYW5jZWxMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIHNldEpTTGlua1Jvd1RhcmdldChjYW5jZWxMaW5rLCJjYW5jZWxEZXRhaWxzRGlzY292ZXJ5VVJMUm93RWRpdCIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgY2FuY2VsTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGNhbmNlbExpbmspOwotICB9Ci0gIAotICBmdW5jdGlvbiBlZGl0RGV0YWlsc0Rpc2NvdmVyeVVSTFJvdyh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHJvdyA9IHRhYmxlLnJvd3Nbcm93SW5kZXhdOwotICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIAotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgIAotICAgIHZhciBkaXNjb3ZlcnlVUkwgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWU7Ci0gICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZSA9PSAidHJ1ZSIpCi0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgcmV0dXJuOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZSA9IHRydWU7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjFDb250cm9sID0gY29sdW1uMS5jaGlsZE5vZGVzWzNdOwotICAgIHZhciB0ZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjEucmVwbGFjZUNoaWxkKHRleHRJbnB1dCxjb2x1bW4xQ29udHJvbCk7Ci0gICAgdGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgdGV4dElucHV0LnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfRElTQ09WRVJZX1VSTCIpJT4iOwotICAgIHRleHRJbnB1dC52YWx1ZSA9IGRpc2NvdmVyeVVSTDsKLSAgICAKLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4yKTsKLSAgICBhZGREZXRhaWxzRGlzY292ZXJ5VVJMUm93Q2FuY2VsQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjIscm93SW5kZXgpOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXREZXRhaWxzRGlzY292ZXJ5VVJMUm93KHRhYmxlQ29udGFpbmVySWQsaW5kZXgsdmlld0lkLGRpc2NvdmVyeVVSTCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93cytpbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlID0gdmlld0lkOwotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1sxXS52YWx1ZSA9IGRpc2NvdmVyeVVSTDsKLSAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlID09ICJ0cnVlIik7Ci0gICAgdmFyIGNvbHVtbjFDb250cm9sID0gY29sdW1uMS5jaGlsZE5vZGVzWzNdOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIGNvbHVtbjFDb250cm9sLnZhbHVlID0gZGlzY292ZXJ5VVJMOwotICAgIGVsc2UKLSAgICAgIGNvbHVtbjEucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGdldERlZmF1bHREaXNwbGF5U3RyaW5nKGRpc2NvdmVyeVVSTCkpLGNvbHVtbjFDb250cm9sKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gcmVtb3ZlRGV0YWlsc0Rpc2NvdmVyeVVSTFJvdyh0YWJsZUNvbnRhaW5lcklkLHJvd0luZGV4KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdGFibGUuZGVsZXRlUm93KHJvd0luZGV4KTsKLSAgICBmaXhEZXRhaWxzRGlzY292ZXJ5VVJMUm93TGlua3ModGFibGVDb250YWluZXJJZCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbERldGFpbHNEaXNjb3ZlcnlVUkxSb3dFZGl0KHRhYmxlQ29udGFpbmVySWQscm93SW5kZXgpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tyb3dJbmRleF07Ci0gICAgdmFyIGNvbHVtbnMgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgCi0gICAgdmFyIHZpZXdJZCA9IGNvbHVtbjEuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICB2YXIgZGlzY292ZXJ5VVJMID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgIHZhciByb3dBY3Rpb25MaW5rSHJlZiA9IGNvbHVtbjIuY2hpbGROb2Rlc1tjb2x1bW4yLmNoaWxkTm9kZXMubGVuZ3RoLTFdLmhyZWY7Ci0gICAgaWYgKHJvd0FjdGlvbkxpbmtIcmVmLmluZGV4T2YoImphdmFzY3JpcHQ6Y2FuY2VsIikgIT0gMCkKLSAgICAgIHJldHVybjsKLSAgICAgIAotICAgIGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZSA9IGZhbHNlOwotICAgIAotICAgIHZhciBjb2x1bW4xQ29udHJvbCA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXTsKLSAgICBjb2x1bW4xLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShnZXREZWZhdWx0RGlzcGxheVN0cmluZyhkaXNjb3ZlcnlVUkwpKSxjb2x1bW4xQ29udHJvbCk7Ci0gICAgCi0gICAgcmVtb3ZlQ29sdW1uQ2hpbGRyZW4oY29sdW1uMik7Ci0gICAgYWRkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMixyb3dJbmRleCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHJlbW92ZVNlbGVjdGVkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHJlbW92ZVNlbGVjdGVkUm93cyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmaXhEZXRhaWxzRGlzY292ZXJ5VVJMUm93TGlua3ModGFibGVDb250YWluZXJJZCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGZpeERldGFpbHNEaXNjb3ZlcnlVUkxSb3dMaW5rcyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgPCUvLyBGaXggdGhlIGxpbmtzJT4KLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93ID0gdGFibGUucm93c1tpXTsKLSAgICAgIHZhciBjb2x1bW5zID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gY29sdW1ucy5pdGVtKDApLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICAKLSAgICAgIGZvciAodmFyIGo9MTtqPGNvbHVtbnMubGVuZ3RoO2orKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgICAgY29sdW1ucy5pdGVtKGopLmNsYXNzTmFtZSA9ICJyb3djb2xvciI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjb2x1bW5zLml0ZW0oaikuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgICAgfQotICAgICAgCi0gICAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICAgIHZhciBjb2x1bW4yID0gY29sdW1ucy5pdGVtKDIpOwotICAgICAgdmFyIGxpbmsgPSBjb2x1bW4yLmNoaWxkTm9kZXNbY29sdW1uMi5jaGlsZE5vZGVzLmxlbmd0aC0xXTsKLSAgICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjIpOwotICAgICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgICAgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OnJlbW92ZSIpID09IDApCi0gICAgICAgIGFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dSZW1vdmVBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMixpKTsKLSAgICAgIGVsc2UgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmNhbmNlbCIpID09IDApCi0gICAgICAgIGFkZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dDYW5jZWxBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMixpKTsKLSAgICAgIGVsc2UgaWYgKGxpbmsuaHJlZi5pbmRleE9mKCJqYXZhc2NyaXB0OmVkaXQiKSA9PSAwKQotICAgICAgICBhZGREZXRhaWxzRGlzY292ZXJ5VVJMUm93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4yLGkpOyAKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGVkaXRTZWxlY3RlZERldGFpbHNEaXNjb3ZlcnlVUkxSb3dzKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgZWRpdERldGFpbHNEaXNjb3ZlcnlVUkxSb3codGFibGVDb250YWluZXJJZCxpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbFNlbGVjdGVkRGV0YWlsc0Rpc2NvdmVyeVVSTFJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKTsKLSAgICAgIGlmIChyb3dDaGVja2JveC5jaGVja2VkKQotICAgICAgICBjYW5jZWxEZXRhaWxzRGlzY292ZXJ5VVJMUm93RWRpdCh0YWJsZUNvbnRhaW5lcklkLGkpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNTaW5nbGVJdGVtUm93KHRhYmxlQ29udGFpbmVySWQsaGFzRXJyb3IpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIAotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjAud2lkdGggPSAiOTAlIjsKLSAgICBjb2x1bW4xLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsIiIpKTsgPCUvLyBpdGVtIHZhbHVlJT4KLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIiIsaGFzRXJyb3IpKTsgPCUvLyBtb2RlJT4KLSAgICAKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIAotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvd0Jyb3dzZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCx3c2RsVHlwZSxjb2x1bW4pCi0gIHsKLSAgICB2YXIgYnJvd3NlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBicm93c2VMaW5rLmhyZWYgPSAiamF2YXNjcmlwdDpvcGVuV1NETEJyb3dzZXIoJ2NvbnRlbnRib3JkZXInLCIrd3NkbFR5cGUrIikiOwotICAgIGJyb3dzZUxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19CUk9XU0UiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoYnJvd3NlTGluayk7ICAgIAotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dCcm93c2VDYW5jZWxBY3Rpb25MaW5rcyh0YWJsZUNvbnRhaW5lcklkLHdzZGxUeXBlLGNvbHVtbikKLSAgewotICAgIGFkZERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvd0Jyb3dzZUFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCx3c2RsVHlwZSxjb2x1bW4pOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpKTsKLSAgICB2YXIgY2FuY2VsTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBjYW5jZWxMaW5rLmhyZWYgPSAiamF2YXNjcmlwdDpjYW5jZWxEZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dFZGl0KCciK3RhYmxlQ29udGFpbmVySWQrIicpIjsKLSAgICBjYW5jZWxMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19DQU5DRUwiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoY2FuY2VsTGluayk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGFkZERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uKQotICB7Ci0gICAgdmFyIGVkaXRMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwotICAgIGVkaXRMaW5rLmhyZWYgPSAiamF2YXNjcmlwdDplZGl0RGV0YWlsc1dTRExVUkxTaW5nbGVJdGVtUm93KCciK3RhYmxlQ29udGFpbmVySWQrIicpIjsKLSAgICBlZGl0TGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRURJVCIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChlZGl0TGluayk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNhbmNlbERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvd0VkaXQodGFibGVDb250YWluZXJJZCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3NdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHZhciBjb2x1bW4wID0gY29sdW1ucy5pdGVtKDApOwotICAgIHZhciBjb2x1bW4xID0gY29sdW1ucy5pdGVtKDEpOwotICAgIAotICAgIGNvbHVtbjAuY2hpbGROb2Rlc1syXS52YWx1ZSA9IGZhbHNlOwotICAgIAotICAgIHZhciBjb2x1bW4wQ29udHJvbCA9IGNvbHVtbjAuY2hpbGROb2Rlc1tjb2x1bW4wLmNoaWxkTm9kZXMubGVuZ3RoLTFdOwotICAgIGNvbHVtbjAucmVwbGFjZUNoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGdldFdTRExVUkxEaXNwbGF5KGNvbHVtbjAuY2hpbGROb2Rlc1swXS52YWx1ZSkpLGNvbHVtbjBDb250cm9sKTsKLSAgICAKLSAgICByZW1vdmVDb2x1bW5DaGlsZHJlbihjb2x1bW4xKTsKLSAgICAKLSAgICBhZGREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjEpOwotICB9Ci0gIAotICBmdW5jdGlvbiBlZGl0RGV0YWlsc1dTRExVUkxTaW5nbGVJdGVtUm93KHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgY29sdW1ucyA9IHRhYmxlLnJvd3NbbnVtYmVyT2ZIZWFkZXJSb3dzXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY29sdW1uMCA9IGNvbHVtbnMuaXRlbSgwKTsKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICAKLSAgICB2YXIgd3NkbFR5cGUgPSBjb2x1bW4wLmNoaWxkTm9kZXNbMV0udmFsdWU7Ci0gICAgY29sdW1uMC5jaGlsZE5vZGVzWzJdLnZhbHVlID0gdHJ1ZTsKLSAgICAKLSAgICB2YXIgY29sdW1uMENvbnRyb2wgPSBjb2x1bW4wLmNoaWxkTm9kZXNbY29sdW1uMC5jaGlsZE5vZGVzLmxlbmd0aC0xXTsKLSAgICB2YXIgd3NkbFVSTEVkaXRDb250cm9sID0gY3JlYXRlV1NETFVSTEVkaXRDb250cm9sKCk7Ci0gICAgY29sdW1uMC5yZXBsYWNlQ2hpbGQod3NkbFVSTEVkaXRDb250cm9sLGNvbHVtbjBDb250cm9sKTsKLSAgICB3c2RsVVJMRWRpdENvbnRyb2wuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICB3c2RsVVJMRWRpdENvbnRyb2wudmFsdWUgPSBnZXRXU0RMVVJMRGlzcGxheShjb2x1bW4wLmNoaWxkTm9kZXNbMF0udmFsdWUpOwotICAgIAotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjEpOwotICAgIAotICAgIGFkZERldGFpbHNXU0RMVVJMU2luZ2xlSXRlbVJvd0Jyb3dzZUNhbmNlbEFjdGlvbkxpbmtzKHRhYmxlQ29udGFpbmVySWQsd3NkbFR5cGUsY29sdW1uMSk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNyZWF0ZVdTRExVUkxFZGl0Q29udHJvbCgpCi0gIHsKLSAgICB2YXIgY29udHJvbDsKLSAgICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gICAgICBjb250cm9sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiPGlucHV0IG5hbWU9JzwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+Jz4iKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgY29udHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICBjb250cm9sLnNldEF0dHJpYnV0ZSgibmFtZSIsIjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XU0RMX1VSTCU+Iik7Ci0gICAgfQotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0gIAotICBmdW5jdGlvbiBnZXRXU0RMVVJMRGlzcGxheSh3c2RsVVJMKQotICB7Ci0gICAgaWYgKHdzZGxVUkwubGVuZ3RoIDwgMSkKLSAgICAgIHdzZGxVUkxEaXNwbGF5ID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9XU0RMX1VSTF9JU19VTlJFQUNIQUJMRSIpKSU+IjsKLSAgICBlbHNlCi0gICAgICB3c2RsVVJMRGlzcGxheSA9IHdzZGxVUkw7Ci0gICAgcmV0dXJuIHdzZGxVUkxEaXNwbGF5OwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3codGFibGVDb250YWluZXJJZCx3c2RsVHlwZSx3c2RsVVJMKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBjb2x1bW5zLml0ZW0oMCk7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0KLSAgICBjb2x1bW4wLmluc2VydEJlZm9yZShjcmVhdGVIaWRkZW5FbGVtZW50KCIiLHdzZGxUeXBlKSxjb2x1bW4wLmNoaWxkTm9kZXNbMV0pOwotICAgIHZhciBlZGl0YWJsZSA9IChjb2x1bW4wLmNoaWxkTm9kZXNbMl0udmFsdWUgPT0gInRydWUiKTsKLSAgICB2YXIgd3NkbFVSTERpc3BsYXkgPSBnZXRXU0RMVVJMRGlzcGxheSh3c2RsVVJMKTsKLSAgICBjb2x1bW4wLmNoaWxkTm9kZXNbMF0udmFsdWUgPSB3c2RsVVJMOwotICAgIAotICAgIHZhciBjb2x1bW4wQ29udHJvbDsgICAgCi0gICAgaWYgKGVkaXRhYmxlKQotICAgIHsKLSAgICAgIGNvbHVtbjBDb250cm9sID0gY3JlYXRlV1NETFVSTEVkaXRDb250cm9sKCk7Ci0gICAgICBjb2x1bW4wQ29udHJvbC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgICAgYWRkRGV0YWlsc1dTRExVUkxTaW5nbGVJdGVtUm93QnJvd3NlQWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLHdzZGxUeXBlLGNvbHVtbjEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29sdW1uMENvbnRyb2wgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh3c2RsVVJMRGlzcGxheSk7Ci0gICAgICBhZGREZXRhaWxzV1NETFVSTFNpbmdsZUl0ZW1Sb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjEpOwotICAgIH0KLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKGNvbHVtbjBDb250cm9sKTsKLSAgICBpZiAoZWRpdGFibGUpCi0gICAgICBjb2x1bW4wQ29udHJvbC52YWx1ZSA9IHdzZGxVUkxEaXNwbGF5OwotICB9Ci0gIAotICBmdW5jdGlvbiBhZGREZXRhaWxzTmFtZVNpbmdsZUl0ZW1Sb3dDYW5jZWxBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uKQotICB7Ci0gICAgdmFyIGNhbmNlbExpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgY2FuY2VsTGluay5ocmVmID0gImphdmFzY3JpcHQ6Y2FuY2VsRGV0YWlsc05hbWVTaW5nbGVJdGVtUm93RWRpdCgnIit0YWJsZUNvbnRhaW5lcklkKyInKSI7Ci0gICAgY2FuY2VsTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQ0FOQ0VMIikpJT4iKSk7Ci0gICAgY29sdW1uLmFwcGVuZENoaWxkKGNhbmNlbExpbmspOwotICB9Ci0KLSAgZnVuY3Rpb24gYWRkRGV0YWlsc05hbWVTaW5nbGVJdGVtUm93RWRpdEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4pICAKLSAgewotICAgIHZhciBlZGl0TGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBlZGl0TGluay5ocmVmID0gImphdmFzY3JpcHQ6ZWRpdERldGFpbHNOYW1lU2luZ2xlSXRlbVJvdygnIit0YWJsZUNvbnRhaW5lcklkKyInKSI7Ci0gICAgZWRpdExpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0VESVQiKSklPiIpKTsKLSAgICBjb2x1bW4uYXBwZW5kQ2hpbGQoZWRpdExpbmspOwotICB9Ci0gIAotICBmdW5jdGlvbiBlZGl0RGV0YWlsc05hbWVTaW5nbGVJdGVtUm93KHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgY29sdW1ucyA9IHRhYmxlLnJvd3NbbnVtYmVyT2ZIZWFkZXJSb3dzXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY29sdW1uMCA9IGNvbHVtbnMuaXRlbSgwKTsKLSAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICAKLSAgICBjb2x1bW4wLmNoaWxkTm9kZXNbMV0udmFsdWUgPSB0cnVlOwotICAgIAotICAgIHZhciBjb2x1bW4wQ29udHJvbCA9IGNvbHVtbjAuY2hpbGROb2Rlc1tjb2x1bW4wLmNoaWxkTm9kZXMubGVuZ3RoLTFdOwotICAgIHZhciB0ZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjAucmVwbGFjZUNoaWxkKHRleHRJbnB1dCxjb2x1bW4wQ29udHJvbCk7Ci0gICAgdGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgdGV4dElucHV0LnRpdGxlID0gIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfSU5QVVRfVEVYVF9WQUxVRSIpJT4iOwotICAgIHRleHRJbnB1dC52YWx1ZSA9IGNvbHVtbjAuY2hpbGROb2Rlc1swXS52YWx1ZTsKLQotICAgIHJlbW92ZUNvbHVtbkNoaWxkcmVuKGNvbHVtbjEpOwotICAgIAotICAgIGFkZERldGFpbHNOYW1lU2luZ2xlSXRlbVJvd0NhbmNlbEFjdGlvbkxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4xKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gY2FuY2VsRGV0YWlsc05hbWVTaW5nbGVJdGVtUm93RWRpdCh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBjb2x1bW5zLml0ZW0oMCk7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgCi0gICAgY29sdW1uMC5jaGlsZE5vZGVzWzFdLnZhbHVlID0gZmFsc2U7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjBDb250cm9sID0gY29sdW1uMC5jaGlsZE5vZGVzW2NvbHVtbjAuY2hpbGROb2Rlcy5sZW5ndGgtMV07Ci0gICAgY29sdW1uMC5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29sdW1uMC5jaGlsZE5vZGVzWzBdLnZhbHVlKSxjb2x1bW4wQ29udHJvbCk7Ci0gICAgCi0gICAgZm9yICh2YXIgaT0wO2k8Y29sdW1uMS5jaGlsZE5vZGVzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgY29sdW1uMS5yZW1vdmVDaGlsZChjb2x1bW4xLmNoaWxkTm9kZXNbaV0pOwotICAgICAgaS0tOwotICAgIH0KLSAgICBhZGREZXRhaWxzTmFtZVNpbmdsZUl0ZW1Sb3dFZGl0QWN0aW9uTGluayh0YWJsZUNvbnRhaW5lcklkLGNvbHVtbjEpOwotICB9Ci0gIAotICBmdW5jdGlvbiBzZXREZXRhaWxzTmFtZVNpbmdsZUl0ZW1Sb3codGFibGVDb250YWluZXJJZCxuYW1lKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBjb2x1bW5zLml0ZW0oMCk7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgCi0gICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjAuY2hpbGROb2Rlc1sxXS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgIGNvbHVtbjAuY2hpbGROb2Rlc1swXS52YWx1ZSA9IG5hbWU7Ci0gICAgCi0gICAgdmFyIGNvbHVtbjBDb250cm9sOwotICAgIGlmIChlZGl0YWJsZSkKLSAgICB7Ci0gICAgICBjb2x1bW4wQ29udHJvbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgICBjb2x1bW4wQ29udHJvbC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgICAgY29sdW1uMENvbnRyb2wudGl0bGUgPSAiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9JTlBVVF9URVhUX1ZBTFVFIiklPiI7Ci0gICAgICBjb2x1bW4wQ29udHJvbC52YWx1ZSA9IG5hbWU7Ci0gICAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BQ1RJT05TX05PTkUiKSU+IikpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY29sdW1uMENvbnRyb2wgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuYW1lKTsKLSAgICAgIGFkZERldGFpbHNOYW1lU2luZ2xlSXRlbVJvd0VkaXRBY3Rpb25MaW5rKHRhYmxlQ29udGFpbmVySWQsY29sdW1uMSk7Ci0gICAgfQotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQoY29sdW1uMENvbnRyb2wpOwotICB9Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzRGV0YWlsc0Rpc2NvdmVyeVVSTFRhYmxlKHRhYmxlQ29udGFpbmVySWQsbW9kaWZpZWROYW1lLHZpZXdJZE5hbWUsZGlzY292ZXJ5VVJMTmFtZSxmb3JtKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgICB2YXIgdmlld0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgICAgdmFyIGRpc2NvdmVyeVVSTDsKLSAgICAgIGlmIChlZGl0YWJsZSkKLSAgICAgICAgZGlzY292ZXJ5VVJMID0gY29sdW1uMS5jaGlsZE5vZGVzWzNdLnZhbHVlOwotICAgICAgZWxzZQotICAgICAgICBkaXNjb3ZlcnlVUkwgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWU7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQodmlld0lkTmFtZSx2aWV3SWQpKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudChkaXNjb3ZlcnlVUkxOYW1lLGRpc2NvdmVyeVVSTCkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KG1vZGlmaWVkTmFtZSxlZGl0YWJsZSkpOyAgICAgICAgCi0gICAgfQotICB9Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzRGV0YWlsc0xhbmd1YWdlSW5wdXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkLG1vZGlmaWVkTmFtZSx2aWV3SWROYW1lLGxhbmdJZE5hbWUsaW5wdXROYW1lLGZvcm0pCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgY29sdW1ucyA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICAgIHZhciB2aWV3SWQgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID09ICJ0cnVlIik7Ci0gICAgICB2YXIgbGFuZ0lkLGlucHV0VGV4dDsKLSAgICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIHsKLSAgICAgICAgbGFuZ0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzVdLnZhbHVlOwotICAgICAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICAgICAgaW5wdXRUZXh0ID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBsYW5nSWQgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMV0udmFsdWU7Ci0gICAgICAgIGlucHV0VGV4dCA9IGNvbHVtbjEuY2hpbGROb2Rlc1syXS52YWx1ZTsKLSAgICAgIH0KLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCh2aWV3SWROYW1lLHZpZXdJZCkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KGxhbmdJZE5hbWUsbGFuZ0lkKSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoaW5wdXROYW1lLGlucHV0VGV4dCkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KG1vZGlmaWVkTmFtZSxlZGl0YWJsZSkpOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gcHJvY2Vzc0RldGFpbHNJZGVudGlmaWVyVGFibGUodGFibGVDb250YWluZXJJZCxmb3JtKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgICB2YXIgdmlld0lkID0gY29sdW1uMS5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjEuY2hpbGROb2Rlc1s0XS52YWx1ZSA9PSAidHJ1ZSIpOwotICAgICAgdmFyIHRNb2RlbEtleSxpZEtleU5hbWUsaWRLZXlWYWx1ZTsKLSAgICAgIGlmIChlZGl0YWJsZSkKLSAgICAgIHsKLSAgICAgICAgdE1vZGVsS2V5ID0gY29sdW1uMS5jaGlsZE5vZGVzWzVdLnZhbHVlOwotICAgICAgICB2YXIgY29sdW1uMiA9IGNvbHVtbnMuaXRlbSgyKTsKLSAgICAgICAgaWRLZXlOYW1lID0gY29sdW1uMi5jaGlsZE5vZGVzWzBdLnZhbHVlOwotICAgICAgICB2YXIgY29sdW1uMyA9IGNvbHVtbnMuaXRlbSgzKTsKLSAgICAgICAgaWRLZXlWYWx1ZSA9IGNvbHVtbjMuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdE1vZGVsS2V5ID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgICAgICBpZEtleU5hbWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMl0udmFsdWU7Ci0gICAgICAgIGlkS2V5VmFsdWUgPSBjb2x1bW4xLmNoaWxkTm9kZXNbM10udmFsdWU7Ci0gICAgICB9Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuSURFTlRJRklFUl9WSUVXSUQlPiIsdmlld0lkKSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9UWVBFJT4iLHRNb2RlbEtleSkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfS0VZX05BTUUlPiIsaWRLZXlOYW1lKSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfVkFMVUUlPiIsaWRLZXlWYWx1ZSkpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLklERU5USUZJRVJfTU9ESUZJRUQlPiIsZWRpdGFibGUpKTsgICAgICAKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHByb2Nlc3NEZXRhaWxzQ2F0ZWdvcnlUYWJsZSh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgY29sdW1ucyA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgICB2YXIgY29sdW1uMSA9IGNvbHVtbnMuaXRlbSgxKTsKLSAgICAgIHZhciB2aWV3SWQgPSBjb2x1bW4xLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgICB2YXIgZWRpdGFibGUgPSAoY29sdW1uMS5jaGlsZE5vZGVzWzRdLnZhbHVlID09ICJ0cnVlIik7Ci0gICAgICB2YXIgdE1vZGVsS2V5LGNhdEtleU5hbWUsY2F0S2V5VmFsdWU7Ci0gICAgICBpZiAoZWRpdGFibGUpCi0gICAgICB7Ci0gICAgICAgIHRNb2RlbEtleSA9IGNvbHVtbjEuY2hpbGROb2Rlc1s1XS52YWx1ZTsKLSAgICAgICAgdmFyIGNvbHVtbjIgPSBjb2x1bW5zLml0ZW0oMik7Ci0gICAgICAgIGNhdEtleU5hbWUgPSBjb2x1bW4yLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgICAgIHZhciBjb2x1bW4zID0gY29sdW1ucy5pdGVtKDMpOwotICAgICAgICBjYXRLZXlWYWx1ZSA9IGNvbHVtbjMuY2hpbGROb2Rlc1swXS52YWx1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdE1vZGVsS2V5ID0gY29sdW1uMS5jaGlsZE5vZGVzWzFdLnZhbHVlOwotICAgICAgICBjYXRLZXlOYW1lID0gY29sdW1uMS5jaGlsZE5vZGVzWzJdLnZhbHVlOwotICAgICAgICBjYXRLZXlWYWx1ZSA9IGNvbHVtbjEuY2hpbGROb2Rlc1szXS52YWx1ZTsKLSAgICAgIH0KLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5DQVRFR09SWV9WSUVXSUQlPiIsdmlld0lkKSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfVFlQRSU+Iix0TW9kZWxLZXkpKTsKLSAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9DQVRFR09SWV9LRVlfTkFNRSU+IixjYXRLZXlOYW1lKSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX1ZBTFVFJT4iLGNhdEtleVZhbHVlKSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuQ0FURUdPUllfTU9ESUZJRUQlPiIsZWRpdGFibGUpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHByb2Nlc3NEZXRhaWxzU2luZ2xlSXRlbVRhYmxlKHRhYmxlQ29udGFpbmVySWQsbW9kaWZpZWROYW1lLGlucHV0TmFtZSxmb3JtKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBjb2x1bW5zLml0ZW0oMCk7Ci0gICAgdmFyIGNvbHVtbjEgPSBjb2x1bW5zLml0ZW0oMSk7Ci0gICAgdmFyIGVkaXRhYmxlID0gKGNvbHVtbjAuY2hpbGROb2Rlc1tjb2x1bW4wLmNoaWxkTm9kZXMubGVuZ3RoLTJdLnZhbHVlID09ICJ0cnVlIik7Ci0gICAgdmFyIGlucHV0VmFsdWU7Ci0gICAgaWYgKGVkaXRhYmxlKQotICAgICAgaW5wdXRWYWx1ZSA9IGNvbHVtbjAuY2hpbGROb2Rlc1tjb2x1bW4wLmNoaWxkTm9kZXMubGVuZ3RoLTFdLnZhbHVlOwotICAgIGVsc2UKLSAgICAgIGlucHV0VmFsdWUgPSBjb2x1bW4wLmNoaWxkTm9kZXNbMF0udmFsdWU7Ci0gICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KGlucHV0TmFtZSxpbnB1dFZhbHVlKSk7Ci0gICAgZm9ybS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KG1vZGlmaWVkTmFtZSxlZGl0YWJsZSkpOyAgICAKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy9yZXN1bHRzLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL3Jlc3VsdHMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI2NjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL3Jlc3VsdHMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXRIb2xkZXIiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9zY3JpcHRzL3VkZGl0YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGdldE51bWJlck9mU2VsZWN0aW9ucyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdmFyIG51bWJlclNlbGVjdGVkID0gMDsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgbnVtYmVyU2VsZWN0ZWQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG51bWJlclNlbGVjdGVkOwotICB9Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzUmVzdWx0Rm9ybSh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIHByb2Nlc3NSZXN1bHRUYWJsZSh0YWJsZUNvbnRhaW5lcklkLCI8JT1BY3Rpb25JbnB1dHMuTk9ERUlEJT4iLGZvcm0sdHJ1ZSk7Ci0gICAgICBmb3JtLnN1Ym1pdCgpOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb25zKHRhYmxlQ29udGFpbmVySWQsZm9ybSkKLSAgewotICAgIGZvcm0uYWN0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0NsZWFyTmF2aWdhdG9yTm9kZXNBY3Rpb25KU1AuanNwIikpJT4iOwotICAgIC8vIEVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBpdGVtIGlzIHNlbGVjdGVkLgotICAgIHZhciBudW1iZXJTZWxlY3RlZCA9IGdldE51bWJlck9mU2VsZWN0aW9ucyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBpZiAobnVtYmVyU2VsZWN0ZWQgPiAwKQotICAgICAgcHJvY2Vzc1Jlc3VsdEZvcm0odGFibGVDb250YWluZXJJZCxmb3JtKTsKLSAgICBlbHNlCi0gICAgICBhbGVydCgiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPiIpOwotICB9Ci0gIAotICBmdW5jdGlvbiByZWZyZXNoU2VsZWN0aW9ucyh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICBmb3JtLmFjdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9SZWZyZXNoVURESU5vZGVzQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgICAvLyBFbnN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgaXRlbSBpcyBzZWxlY3RlZC4KLSAgICB2YXIgbnVtYmVyU2VsZWN0ZWQgPSBnZXROdW1iZXJPZlNlbGVjdGlvbnModGFibGVDb250YWluZXJJZCk7Ci0gICAgaWYgKG51bWJlclNlbGVjdGVkID4gMCkKLSAgICAgIHByb2Nlc3NSZXN1bHRGb3JtKHRhYmxlQ29udGFpbmVySWQsZm9ybSk7Ci0gICAgZWxzZQotICAgICAgYWxlcnQoIjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRCIpJT4iKTsKLSAgfQotICAKLSAgZnVuY3Rpb24gYWRkU2VsZWN0aW9uc1RvRmF2b3JpdGVzKHRhYmxlQ29udGFpbmVySWQsZm9ybSkKLSAgewotICAgIGZvcm0uYWN0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgidWRkaS9hY3Rpb25zL0FkZEl0ZW1zVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwIikpJT4iOwotICAgIC8vIEVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBpdGVtIGlzIHNlbGVjdGVkLgotICAgIHZhciBudW1iZXJTZWxlY3RlZCA9IGdldE51bWJlck9mU2VsZWN0aW9ucyh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBpZiAobnVtYmVyU2VsZWN0ZWQgPiAwKQotICAgICAgcHJvY2Vzc1Jlc3VsdEZvcm0odGFibGVDb250YWluZXJJZCxmb3JtKTsKLSAgICBlbHNlCi0gICAgICBhbGVydCgiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPiIpOwotICB9Ci0gIAotPCUKLSAgIGlmIChzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0SG9sZGVyLnNpemUoKSA+IDApCi0gICB7Ci0gICAgIFN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXQgc3ViUXVlcnlUcmFuc2ZlclRhcmdldCA9IChTdWJRdWVyeVRyYW5zZmVyVGFyZ2V0KXN1YlF1ZXJ5VHJhbnNmZXJUYXJnZXRIb2xkZXIuZWxlbWVudEF0KDApOwotICAgICBTdHJpbmcgc3ViUXVlcnlLZXkgPSBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0LmdldFN1YlF1ZXJ5S2V5KCk7Ci0gICAgIGludCBsYXN0U2VwYXJhdG9yUG9zID0gc3ViUXVlcnlLZXkubGFzdEluZGV4T2YoJzonKTsKLSAgICAgU3RyaW5nIHRhcmdldFF1ZXJ5S2V5OwotICAgICBpZiAobGFzdFNlcGFyYXRvclBvcyA9PSAtMSkKLSAgICAgICB0YXJnZXRRdWVyeUtleSA9ICIiOwotICAgICBlbHNlCi0gICAgICAgdGFyZ2V0UXVlcnlLZXkgPSBzdWJRdWVyeUtleS5zdWJzdHJpbmcoMCxsYXN0U2VwYXJhdG9yUG9zKTsKLSAgICAgU3RyaW5nIHRhcmdldFByb3BlcnR5ID0gc3ViUXVlcnlLZXkuc3Vic3RyaW5nKGxhc3RTZXBhcmF0b3JQb3MrMSxzdWJRdWVyeUtleS5sZW5ndGgoKSk7Ci0lPiAgICAgCi0gIGZ1bmN0aW9uIHRyYW5zZmVyU2VsZWN0aW9ucyh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICBmb3JtLmFjdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvYWN0aW9ucy9UcmFuc2ZlclN1YlF1ZXJ5UmVzdWx0c0FjdGlvbkpTUC5qc3AiKSklPiI7Ci0gICAgLy8gRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGl0ZW0gaXMgc2VsZWN0ZWQuCi0gICAgdmFyIG51bWJlclNlbGVjdGVkID0gZ2V0TnVtYmVyT2ZTZWxlY3Rpb25zKHRhYmxlQ29udGFpbmVySWQpOwotICAgIGlmIChudW1iZXJTZWxlY3RlZCA+IDApCi0gICAgewotPCUKLSAgICAgaWYgKHRhcmdldFByb3BlcnR5LmVxdWFscyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX1NFUlZJQ0VfQlVTSU5FU1MpIHx8IHRhcmdldFByb3BlcnR5LmVxdWFscyhVRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1NJTVBMRV9TRVJWSUNFX0JVU0lORVNTKSB8fCB0YXJnZXRQcm9wZXJ0eS5lcXVhbHMoVURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9TRVJWSUNFX0lOVEVSRkFDRV9TRVJWSUNFKSkKLSAgICAgewotJT4KLSAgICAgIGlmIChudW1iZXJTZWxlY3RlZCAhPSAxKQotICAgICAgewotICAgICAgICBhbGVydCgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfU0lOR0xFX0lURU0iKSklPiIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLTwlCi0gICAgICAgRm9ybVRvb2wgdGFyZ2V0Rm9ybVRvb2wgPSBzdWJRdWVyeVRyYW5zZmVyVGFyZ2V0LmdldFRhcmdldEZvcm1Ub29sKCk7Ci0gICAgICAgRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlIHRhcmdldEZvcm1Ub29sUEkgPSAoKE11bHRpcGxlRm9ybVRvb2xQcm9wZXJ0aWVzSW50ZXJmYWNlKXRhcmdldEZvcm1Ub29sKS5nZXRGb3JtVG9vbFByb3BlcnRpZXModGFyZ2V0UXVlcnlLZXkpOwotICAgICAgIFZlY3RvciBzZXJ2aWNlQnVzaW5lc3MgPSAoVmVjdG9yKXRhcmdldEZvcm1Ub29sUEkuZ2V0UHJvcGVydHkodGFyZ2V0UHJvcGVydHkpOwotICAgICAgIGlmIChzZXJ2aWNlQnVzaW5lc3MgIT0gbnVsbCAmJiBzZXJ2aWNlQnVzaW5lc3Muc2l6ZSgpID4gMCkKLSAgICAgICB7Ci0lPgotICAgICAgaWYgKCFjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9JVEVNX1JFUExBQ0VNRU5UIikpJT4iKSkKLSAgICAgICAgcmV0dXJuOwotPCUKLSAgICAgICB9Ci0gICAgIH0KLSU+Ci0gICAgICBwcm9jZXNzUmVzdWx0Rm9ybSh0YWJsZUNvbnRhaW5lcklkLGZvcm0pOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBhbGVydCgiPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPiIpOwotICB9Ci08JQotICAgfQotJT4gICAgICAgCi08L3NjcmlwdD4gIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3NjcmlwdHMvdWRkaWZyYW1lc2V0cy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy91ZGRpZnJhbWVzZXRzLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyNGFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy91ZGRpZnJhbWVzZXRzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qIiAlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldCgpCi0gIHsKLSAgICByZXR1cm4gcGVyc3BlY3RpdmVDb250ZW50LmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuQUNUSU9OU19DT05UQUlORVIlPiJdLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFtZXNldCIpLml0ZW0oMCk7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzZXRTaXplcyhmcmFtZXNldFNpemVzRm9ybSkKLSAgewotICAgIHRvZ2dsZURvdWJsZUNsaWNrQ29sdW1uVGl0bGUoKTsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCU+LnZhbHVlID0gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQuY29sczsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPi52YWx1ZSA9IGFjdGlvbnNDb250YWluZXJGcmFtZXNldC5yb3dzOwotICAgIGZyYW1lc2V0U2l6ZXNGb3JtLnN1Ym1pdCgpOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy91ZGRpcGFuZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDg2NGNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL3VkZGlwYW5lcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdmFyIG5hdmlnYXRvckNvbnRhaW5lciA9IHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPVVERElGcmFtZU5hbWVzLk5BVklHQVRPUl9DT05UQUlORVIlPiJdOwotICB2YXIgbmF2aWdhdG9yVG9vbGJhciA9IG5hdmlnYXRvckNvbnRhaW5lci5mcmFtZXNbIjwlPVVERElGcmFtZU5hbWVzLk5BVklHQVRPUl9UT09MQkFSJT4iXTsKLSAgdmFyIG5hdmlnYXRvckNvbnRlbnQgPSBuYXZpZ2F0b3JDb250YWluZXIuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5OQVZJR0FUT1JfQ09OVEVOVCU+Il07Ci0gIHZhciBhY3Rpb25zQ29udGFpbmVyID0gcGVyc3BlY3RpdmVDb250ZW50LmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuQUNUSU9OU19DT05UQUlORVIlPiJdOwotICB2YXIgcHJvcGVydGllc0NvbnRhaW5lciA9IGFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5QUk9QRVJUSUVTX0NPTlRBSU5FUiU+Il07Ci0gIHZhciBwcm9wZXJ0aWVzVG9vbGJhciA9IHByb3BlcnRpZXNDb250YWluZXIuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5QUk9QRVJUSUVTX1RPT0xCQVIlPiJdOwotICB2YXIgcHJvcGVydGllc0NvbnRlbnQgPSBwcm9wZXJ0aWVzQ29udGFpbmVyLmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuUFJPUEVSVElFU19DT05URU5UJT4iXTsKLSAgdmFyIHN0YXR1c0NvbnRhaW5lciA9IGFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5TVEFUVVNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHN0YXR1c1Rvb2xiYXIgPSBzdGF0dXNDb250YWluZXIuZnJhbWVzWyI8JT1VRERJRnJhbWVOYW1lcy5TVEFUVVNfVE9PTEJBUiU+Il07Ci0gIHZhciBzdGF0dXNDb250ZW50ID0gc3RhdHVzQ29udGFpbmVyLmZyYW1lc1siPCU9VURESUZyYW1lTmFtZXMuU1RBVFVTX0NPTlRFTlQlPiJdOwotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc2NyaXB0cy91ZGRpdGFibGVzLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL3VkZGl0YWJsZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmIyNzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zY3JpcHRzL3VkZGl0YWJsZXMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODk0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnVkZGk0ai51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy93c2RsYnJvd3Nlci5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSBzZXNzaW9uLmdldElkKCk7Ci0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGVNYW5hZ2VyIG5hdmlnYXRvck1hbmFnZXIgPSB1ZGRpUGVyc3BlY3RpdmUuZ2V0TmF2aWdhdG9yTWFuYWdlcigpOwotICAgVURESU1haW5Ob2RlIHVkZGlNYWluTm9kZSA9IChVRERJTWFpbk5vZGUpbmF2aWdhdG9yTWFuYWdlci5nZXRSb290Tm9kZSgpOwotICAgUmVnaXN0cnlOb2RlIHJlZ05vZGUgPSB1ZGRpTWFpbk5vZGUuZ2V0UmVnaXN0cnlOb2RlKG5hdmlnYXRvck1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCkpOwotICAgUmVnaXN0cnlFbGVtZW50IHJlZ0VsZW1lbnQgPSAoUmVnaXN0cnlFbGVtZW50KXJlZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbW1vbkNhdGVnb3J5TW9kZWxzIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9ImFwcGxpY2F0aW9uIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgLy8gUmVxdWlyZXMgYnJvd3NlcmRldGVjdC5qcywgdGFibGVzLmpzcCAoZXhwbG9yZXIpCi0gIHZhciByb3dDaGVja2JveE5hbWUgPSAicm93Q2hlY2tib3hOYW1lIjsKLSAgdmFyIGNhdGVnb3J5V2luZG93OwotICB2YXIgY2F0ZWdvcnlXaW5kb3dDbG9zZWQgPSB0cnVlOwotICB2YXIgdGFyZ2V0Q2F0ZWdvcnlSb3cgPSAtMTsKLSAgdmFyIHRhcmdldENhdGVnb3J5S2V5TmFtZUVsZW1lbnQ7Ci0gIHZhciB0YXJnZXRDYXRlZ29yeUtleVZhbHVlRWxlbWVudDsKLSAgdmFyIGxhbmd1YWdlQXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgdmFyIGNhdGVnb3J5QXJyYXkgPSBuZXcgQXJyYXkoKTsKLSAgdmFyIHdpbGRjYXJkQ2F0ZWdvcnlCcm93c2VyVVJMUmUgPSAvKCUpLzsKLQotICBmdW5jdGlvbiBjbG9zZUFsbFVkZGlDaGlsZFdpbmRvd3MoKQotICB7Ci0gICAgY2xvc2VDYXRlZ29yeUJyb3dzZXIoKTsKLSAgICBjbG9zZVdTRExCcm93c2VyKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBMYW5ndWFnZShkaXNwbGF5TmFtZSxsYW5nSWQpCi0gIHsKLSAgICB0aGlzLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgdGhpcy5sYW5nSWQgPSBsYW5nSWQ7Ci0gIH0KLQotICBmdW5jdGlvbiBjb21wYXJlTGFuZ3VhZ2VEaXNwbGF5TmFtZXMoYSxiKQotICB7Ci0gICAgdmFyIHJlc3VsdCA9IGEuZGlzcGxheU5hbWUubG9jYWxlQ29tcGFyZShiLmRpc3BsYXlOYW1lKTsKLSAgICBpZiAocmVzdWx0IDwgMCkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlIGlmIChyZXN1bHQgPiAwKQotICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRUTW9kZWxLZXlTZWxlY3QoaXRlbVNlbGVjdCx0TW9kZWxLZXkpCi0gIHsKLSAgICBmb3IgKHZhciBpPTA7aTxpdGVtU2VsZWN0Lm9wdGlvbnMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAoaXRlbVNlbGVjdC5vcHRpb25zW2ldLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT0gdE1vZGVsS2V5LnRvTG93ZXJDYXNlKCkpCi0gICAgICB7Ci0gICAgICAgIGl0ZW1TZWxlY3Qub3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBpdGVtU2VsZWN0Lm9wdGlvbnNbaV0udGV4dDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRMYW5ndWFnZVNlbGVjdChsYW5ndWFnZVNlbGVjdCxsYW5ndWFnZVZhbHVlKQotICB7Ci0gICAgdmFyIHN0YXJ0OwotPCUKLSAgIC8vIENvbXBhcmUgd2l0aCB0aGUgZW1wdHkgc3RyaW5nIG9ubHkgaWYgdGhlIGxhbmd1YWdlVmFsdWUgaXMgdGhlIGVtcHR5IHN0cmluZy4KLSU+Ci0gICAgaWYgKGxhbmd1YWdlVmFsdWUubGVuZ3RoIDwgMSkKLSAgICAgIHN0YXJ0ID0gMDsKLSAgICBlbHNlCi0gICAgICBzdGFydCA9IDE7Ci0gICAgZm9yICh2YXIgaT1zdGFydDtpPGxhbmd1YWdlU2VsZWN0Lm9wdGlvbnMubGVuZ3RoO2krKykKLSAgICB7Ci08JQotICAgLy8gVXNlIGEgcmVndWxhciBleHByZXNzaW9uIHRvIGNoZWNrIGlmIGxhbmd1YWdlVmFsdWUgYmVnaW5zIHdpdGggYSBrZXkgd2hvc2UgaXRlbSBpcyBpbiB0aGUgcGljayBsaXN0LiBUaGlzIGVuYWJsZXMgIkVuZ2xpc2giIHRvIGJlIHNlbGVjdGVkCi0gICAvLyBmb3IgZW4teHh4IChkaWFsZWN0cykuCi0lPgotICAgICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAoIl4iK2xhbmd1YWdlU2VsZWN0Lm9wdGlvbnNbaV0udmFsdWUsImkiKTsKLSAgICAgIGlmIChyZWdFeHAudGVzdChsYW5ndWFnZVZhbHVlKSkKLSAgICAgIHsKLSAgICAgICAgbGFuZ3VhZ2VTZWxlY3Qub3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBsYW5ndWFnZVNlbGVjdC5vcHRpb25zW2ldLnRleHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcG9wdWxhdGVMYW5ndWFnZVNlbGVjdChsYW5ndWFnZVNlbGVjdCkKLSAgewotICAgIGlmIChsYW5ndWFnZUFycmF5Lmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCIiLCIiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0VOIikpJT4iLCJlbiIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQUEiKSklPiIsImFhIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9BQiIpKSU+IiwiYWIiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0FGIikpJT4iLCJhZiIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQU0iKSklPiIsImFtIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9BUiIpKSU+IiwiYXIiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0FTIikpJT4iLCJhcyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQVkiKSklPiIsImF5Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9BWiIpKSU+IiwiYXoiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0JBIikpJT4iLCJiYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQkUiKSklPiIsImJlIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9CRyIpKSU+IiwiYmciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0JIIikpJT4iLCJiaCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQkkiKSklPiIsImJpIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9CTiIpKSU+IiwiYm4iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0JPIikpJT4iLCJibyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQlIiKSklPiIsImJyIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9DQSIpKSU+IiwiY2EiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0NPIikpJT4iLCJjbyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfQ1oiKSklPiIsImN6Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9DWSIpKSU+IiwiY3kiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0RBIikpJT4iLCJkYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfREUiKSklPiIsImRlIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9EWiIpKSU+IiwiZHoiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0VMIikpJT4iLCJlbCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfRU8iKSklPiIsImVvIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9FUyIpKSU+IiwiZXMiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0VUIikpJT4iLCJldCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfRVUiKSklPiIsImV1Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9GQSIpKSU+IiwiZmEiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZJIikpJT4iLCJmaSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfRkoiKSklPiIsImZqIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9GTyIpKSU+IiwiZm8iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0ZSIikpJT4iLCJmciIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfRlkiKSklPiIsImZ5Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9HQSIpKSU+IiwiZ2EiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0dEIikpJT4iLCJnZCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfR0wiKSklPiIsImdsIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9HTiIpKSU+IiwiZ24iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0dVIikpJT4iLCJndSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSEEiKSklPiIsImhhIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9ISSIpKSU+IiwiaGkiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0hSIikpJT4iLCJociIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSFUiKSklPiIsImh1Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9IWSIpKSU+IiwiaHkiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0lBIikpJT4iLCJpYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSUUiKSklPiIsImllIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9JSyIpKSU+IiwiaWsiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0lOIikpJT4iLCJpbiIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSVMiKSklPiIsImlzIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9JVCIpKSU+IiwiaXQiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0lXIikpJT4iLCJpdyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfSkEiKSklPiIsImphIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9KSSIpKSU+IiwiamkiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0pXIikpJT4iLCJqdyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfS0EiKSklPiIsImthIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9LSyIpKSU+Iiwia2siKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0tMIikpJT4iLCJrbCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfS00iKSklPiIsImttIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9LTiIpKSU+Iiwia24iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0tPIikpJT4iLCJrbyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfS1MiKSklPiIsImtzIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9LVSIpKSU+Iiwia3UiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0tZIikpJT4iLCJreSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTEEiKSklPiIsImxhIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9MTiIpKSU+IiwibG4iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX0xPIikpJT4iLCJsbyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTFQiKSklPiIsImx0Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9MViIpKSU+IiwibHYiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX01HIikpJT4iLCJtZyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTUkiKSklPiIsIm1pIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9NSyIpKSU+IiwibWsiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX01MIikpJT4iLCJtbCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTU4iKSklPiIsIm1uIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9NTyIpKSU+IiwibW8iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX01SIikpJT4iLCJtciIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTVMiKSklPiIsIm1zIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9NVCIpKSU+IiwibXQiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX01ZIikpJT4iLCJteSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTkEiKSklPiIsIm5hIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9ORSIpKSU+IiwibmUiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX05MIikpJT4iLCJubCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfTk8iKSklPiIsIm5vIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9PQyIpKSU+Iiwib2MiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX09NIikpJT4iLCJvbSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfT1IiKSklPiIsIm9yIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9QQSIpKSU+IiwicGEiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1BMIikpJT4iLCJwbCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfUFMiKSklPiIsInBzIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9QVCIpKSU+IiwicHQiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1FVIikpJT4iLCJxdSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfUk0iKSklPiIsInJtIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9STiIpKSU+Iiwicm4iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1JPIikpJT4iLCJybyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfUlUiKSklPiIsInJ1Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9SVyIpKSU+IiwicnciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NBIikpJT4iLCJzYSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU0QiKSklPiIsInNkIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TRyIpKSU+Iiwic2ciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NIIikpJT4iLCJzaCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU0kiKSklPiIsInNpIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TSyIpKSU+Iiwic2siKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NMIikpJT4iLCJzbCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU00iKSklPiIsInNtIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TTiIpKSU+Iiwic24iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NPIikpJT4iLCJzbyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU1EiKSklPiIsInNxIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TUiIpKSU+Iiwic3IiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NTIikpJT4iLCJzcyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU1QiKSklPiIsInN0IikKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1NVIikpJT4iLCJzdSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfU1YiKSklPiIsInN2Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9TVyIpKSU+Iiwic3ciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1RBIikpJT4iLCJ0YSIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVEUiKSklPiIsInRlIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9URyIpKSU+IiwidGciKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1RIIikpJT4iLCJ0aCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVEkiKSklPiIsInRpIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9USyIpKSU+IiwidGsiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1RMIikpJT4iLCJ0bCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVE4iKSklPiIsInRuIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9UTyIpKSU+IiwidG8iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1RSIikpJT4iLCJ0ciIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVFMiKSklPiIsInRzIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9UVCIpKSU+IiwidHQiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1RXIikpJT4iLCJ0dyIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVUsiKSklPiIsInVrIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9VUiIpKSU+IiwidXIiKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1VaIikpJT4iLCJ1eiIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfVkkiKSklPiIsInZpIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9WTyIpKSU+Iiwidm8iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1dPIikpJT4iLCJ3byIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfWEgiKSklPiIsInhoIik7Ci0gICAgICBsYW5ndWFnZUFycmF5W2xhbmd1YWdlQXJyYXkubGVuZ3RoXSA9IG5ldyBMYW5ndWFnZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9MQU5HVUFHRV9ZTyIpKSU+IiwieW8iKTsKLSAgICAgIGxhbmd1YWdlQXJyYXlbbGFuZ3VhZ2VBcnJheS5sZW5ndGhdID0gbmV3IExhbmd1YWdlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0xBTkdVQUdFX1pIIikpJT4iLCJ6aCIpOwotICAgICAgbGFuZ3VhZ2VBcnJheVtsYW5ndWFnZUFycmF5Lmxlbmd0aF0gPSBuZXcgTGFuZ3VhZ2UoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9PUFRJT05fTEFOR1VBR0VfWlUiKSklPiIsInp1Iik7Ci0gICAgICBsYW5ndWFnZUFycmF5LnNvcnQoY29tcGFyZUxhbmd1YWdlRGlzcGxheU5hbWVzKTsKLSAgICB9Ci0KLSAgICBmb3IgKHZhciBpPTA7aTxsYW5ndWFnZUFycmF5Lmxlbmd0aDtpKyspCi0gICAgICBsYW5ndWFnZVNlbGVjdC5vcHRpb25zW2ldID0gbmV3IE9wdGlvbihsYW5ndWFnZUFycmF5W2ldLmRpc3BsYXlOYW1lLGxhbmd1YWdlQXJyYXlbaV0ubGFuZ0lkKTsKLSAgfQotCi0gIGZ1bmN0aW9uIHNldExhbmd1YWdlSW5wdXRSb3dTZXR0aW5ncyh0YWJsZUNvbnRhaW5lcklkLG5hbWVJbmRleCxsYW5ndWFnZVZhbHVlLG5hbWVUZXh0VmFsdWUpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3MrbmFtZUluZGV4XTsKLSAgICB2YXIgbGFuZ3VhZ2VTZWxlY3QgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlbGVjdCIpLml0ZW0oMCk7Ci0gICAgdmFyIG5hbWVUZXh0ID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMSk7Ci0gICAgc2V0TGFuZ3VhZ2VTZWxlY3QobGFuZ3VhZ2VTZWxlY3QsbGFuZ3VhZ2VWYWx1ZSk7Ci0gICAgbmFtZVRleHQudmFsdWUgPSBuYW1lVGV4dFZhbHVlOwotICB9Ci0KLSAgZnVuY3Rpb24gcmVtb3ZlU2VsZWN0ZWRDYXRlZ29yeVJvd3ModGFibGVDb250YWluZXJJZCkKLSAgewotICAgIC8vIENoZWNrIGlmIGFueSByb3dzIGFib3ZlIGFuZCBpbmNsdWRpbmcgdGhlIHRhcmdldENhdGVnb3J5Um93IGFyZSBzZWxlY3RlZC4KLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgbmV3VGFyZ2V0Q2F0ZWdvcnlSb3cgPSB0YXJnZXRDYXRlZ29yeVJvdzsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPD10YXJnZXRDYXRlZ29yeVJvdztpKyspCi0gICAgewotICAgICAgdmFyIHRhYmxlUm93ID0gdGFibGUucm93c1tpXTsKLSAgICAgIHZhciByb3dDaGVja2JveCA9IHRhYmxlUm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGkgPT0gdGFyZ2V0Q2F0ZWdvcnlSb3cpCi0gICAgICAgICAgbmV3VGFyZ2V0Q2F0ZWdvcnlSb3cgPSAtMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5ld1RhcmdldENhdGVnb3J5Um93LS07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChuZXdUYXJnZXRDYXRlZ29yeVJvdyA9PSAtMSkKLSAgICAgIGNsb3NlQ2F0ZWdvcnlCcm93c2VyKCk7Ci0gICAgdGFyZ2V0Q2F0ZWdvcnlSb3cgPSBuZXdUYXJnZXRDYXRlZ29yeVJvdzsKLSAgICByZW1vdmVTZWxlY3RlZFJvd3ModGFibGVDb250YWluZXJJZCk7Ci0gICAgLy8gRml4IHRoZSBicm93c2UuLi4gbGlua3MuCi0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIHRhYmxlUm93ID0gdGFibGUucm93c1tpXTsKLSAgICAgIHZhciBicm93c2VMaW5rID0gdGFibGVSb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKS5pdGVtKDApOwotICAgICAgc2V0SlNMaW5rUm93VGFyZ2V0KGJyb3dzZUxpbmssIm9wZW5DYXRlZ29yeUJyb3dzZXIiLHRhYmxlQ29udGFpbmVySWQsaSk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gYWRkTGFuZ3VhZ2VJbnB1dFJvdyh0YWJsZUNvbnRhaW5lcklkLHRleHRDb250cm9sVGl0bGUpCi0gIHsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotCi0gICAgdmFyIGxhbmd1YWdlU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgcG9wdWxhdGVMYW5ndWFnZVNlbGVjdChsYW5ndWFnZVNlbGVjdCk7Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChsYW5ndWFnZVNlbGVjdCk7Ci0KLSAgICB2YXIgdGV4dElucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4yLmFwcGVuZENoaWxkKHRleHRJbnB1dCk7Ci0KLSAgICBjb2x1bW4wLmNsYXNzTmFtZSA9ICJjaGVja2JveGNlbGxzIjsKLSAgICBsYW5ndWFnZVNlbGVjdC5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgdGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgdGV4dElucHV0LnRpdGxlID0gdGV4dENvbnRyb2xUaXRsZTsKLSAgICBjb2x1bW4yLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4yLndpZHRoID0gIjkwJSI7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMik7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRJZGVudGlmaWVyUm93U2V0dGluZ3ModGFibGVDb250YWluZXJJZCxpZGVudGlmaWVySW5kZXgsdE1vZGVsS2V5LGtleU5hbWUsa2V5VmFsdWUpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgcm93ID0gdGFibGUucm93c1tudW1iZXJPZkhlYWRlclJvd3MraWRlbnRpZmllckluZGV4XTsKLSAgICB2YXIgaWRlbnRpZmllclR5cGVTZWxlY3QgPSByb3cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlbGVjdCIpLml0ZW0oMCk7Ci0gICAgdmFyIHJvd0VsZW1lbnRDb2xsZWN0aW9uID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOwotICAgIHZhciBrZXlOYW1lVGV4dCA9IHJvd0VsZW1lbnRDb2xsZWN0aW9uLml0ZW0oMSk7Ci0gICAgdmFyIGtleVZhbHVlVGV4dCA9IHJvd0VsZW1lbnRDb2xsZWN0aW9uLml0ZW0oMik7Ci0gICAgc2V0VE1vZGVsS2V5U2VsZWN0KGlkZW50aWZpZXJUeXBlU2VsZWN0LHRNb2RlbEtleSk7Ci0gICAga2V5TmFtZVRleHQudmFsdWUgPSBrZXlOYW1lOwotICAgIGtleVZhbHVlVGV4dC52YWx1ZSA9IGtleVZhbHVlOwotICB9Ci0KLSAgZnVuY3Rpb24gcG9wdWxhdGVJZGVudGlmaWVyVHlwZVNlbGVjdChpZGVudGlmaWVyVHlwZVNlbGVjdCkKLSAgewotICAgIHZhciBjb3VudGVyID0gMDsKLSAgICBpZGVudGlmaWVyVHlwZVNlbGVjdC5vcHRpb25zW2NvdW50ZXIrK10gPSBuZXcgT3B0aW9uKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fT1BUSU9OX0lERU5USUZJRVJfRFVOUyIpKSU+IiwiPCU9VE1vZGVsLkRfVV9OX1NfVE1PREVMX0tFWSU+Iik7Ci0gICAgaWRlbnRpZmllclR5cGVTZWxlY3Qub3B0aW9uc1tjb3VudGVyKytdID0gbmV3IE9wdGlvbigiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX09QVElPTl9JREVOVElGSUVSX1RIT01BU19SRUdJU1RSWSIpKSU+IiwiPCU9VE1vZGVsLlRIT01BU19SRUdJU1RFUl9UTU9ERUxfS0VZJT4iKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGhhbmRsZUlkZW50aWZpZXJDaGFuZ2UoZSkKLSAgewotICAgIHZhciBpZGVudGlmaWVyU2VsZWN0OwotICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkKLSAgICAgIGlkZW50aWZpZXJTZWxlY3QgPSBldmVudC5zcmNFbGVtZW50OwotICAgIGVsc2UKLSAgICAgIGlkZW50aWZpZXJTZWxlY3QgPSBlLnRhcmdldDsKLSAgICB2YXIgY2VsbCA9IGlkZW50aWZpZXJTZWxlY3QucGFyZW50Tm9kZTsKLSAgICB2YXIgcm93ID0gY2VsbC5wYXJlbnROb2RlOwotICAgIHZhciBpbnB1dEVsZW1lbnRzID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOwotICAgIGZvciAodmFyIGk9MDtpPGlucHV0RWxlbWVudHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRFbGVtZW50cy5pdGVtKGkpLnR5cGUgPT0gInRleHQiKQotICAgICAgewotICAgICAgICBpbnB1dEVsZW1lbnRzLml0ZW0oaSkudmFsdWUgPSBpZGVudGlmaWVyU2VsZWN0Lm9wdGlvbnNbaWRlbnRpZmllclNlbGVjdC5zZWxlY3RlZEluZGV4XS50ZXh0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBhZGRJZGVudGlmaWVyUm93KHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBjb2x1bW4wLmFwcGVuZENoaWxkKHJvd0NoZWNrYm94KTsKLQotICAgIHZhciBrZXlUeXBlU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAga2V5VHlwZVNlbGVjdC5vbmNoYW5nZSA9IGhhbmRsZUlkZW50aWZpZXJDaGFuZ2U7Ci0gICAgcG9wdWxhdGVJZGVudGlmaWVyVHlwZVNlbGVjdChrZXlUeXBlU2VsZWN0KTsKLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGtleVR5cGVTZWxlY3QpOwotCi0gICAgdmFyIGtleU5hbWVUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjIuYXBwZW5kQ2hpbGQoa2V5TmFtZVRleHRJbnB1dCk7Ci0KLSAgICB2YXIga2V5VmFsdWVUZXh0SW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwotICAgIGNvbHVtbjMuYXBwZW5kQ2hpbGQoa2V5VmFsdWVUZXh0SW5wdXQpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAga2V5VHlwZVNlbGVjdC5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCIKLSAgICBjb2x1bW4xLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICBjb2x1bW4xLndpZHRoID0gIjUlIjsKLSAgICBrZXlOYW1lVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAga2V5TmFtZVRleHRJbnB1dC50aXRsZSA9ICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUodWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9JREVOVElGSUVSX0tFWV9OQU1FIikpJT4iOwotICAgIGNvbHVtbjIuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjIud2lkdGggPSAiNDAlIjsKLSAgICBrZXlWYWx1ZVRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIGtleVZhbHVlVGV4dElucHV0LnRpdGxlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0lERU5USUZJRVJfS0VZX1ZBTFVFIikpJT4iOwotICAgIGNvbHVtbjMuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjMud2lkdGggPSAiNTUlIjsKLQotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4zKTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgICBrZXlOYW1lVGV4dElucHV0LnZhbHVlID0ga2V5VHlwZVNlbGVjdC5vcHRpb25zWzBdLnRleHQ7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIENhdGVnb3J5KGRpc3BsYXlOYW1lLHRNb2RlbEtleSkKLSAgewotICAgIHRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLSAgICB0aGlzLnRNb2RlbEtleSA9IHRNb2RlbEtleTsKLSAgfQotCi0gIGZ1bmN0aW9uIGNvbXBhcmVDYXRlZ29yeURpc3BsYXlOYW1lcyhhLGIpCi0gIHsKLSAgICB2YXIgcmVzdWx0ID0gYS5kaXNwbGF5TmFtZS5sb2NhbGVDb21wYXJlKGIuZGlzcGxheU5hbWUpOwotICAgIGlmIChyZXN1bHQgPCAwKQotICAgICAgcmV0dXJuIC0xOwotICAgIGVsc2UgaWYgKHJlc3VsdCA+IDApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfSAgCi0KLSAgZnVuY3Rpb24gcG9wdWxhdGVDYXRlZ29yeVR5cGVTZWxlY3QoY2F0ZWdvcnlUeXBlU2VsZWN0KQotICB7Ci0gICAgaWYgKGNhdGVnb3J5QXJyYXkubGVuZ3RoID09IDApCi0gICAgewotPCUKLSAgIEVudW1lcmF0aW9uIGNvbW1vbkNhdGVnb3JpZXMgPSBjb21tb25DYXRlZ29yeU1vZGVscy5lbGVtZW50cygpOwotICAgd2hpbGUgKGNvbW1vbkNhdGVnb3JpZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICB7Ci0gICAgIENhdGVnb3J5TW9kZWwgY29tbW9uQ2F0ZWdvcnlNb2RlbCA9IChDYXRlZ29yeU1vZGVsKWNvbW1vbkNhdGVnb3JpZXMubmV4dEVsZW1lbnQoKTsKLSU+Ci0gICAgICBjYXRlZ29yeUFycmF5W2NhdGVnb3J5QXJyYXkubGVuZ3RoXSA9IG5ldyBDYXRlZ29yeSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbW1vbkNhdGVnb3J5TW9kZWwuZ2V0RGlzcGxheU5hbWUoKSklPiIsIjwlPWNvbW1vbkNhdGVnb3J5TW9kZWwuZ2V0VE1vZGVsS2V5KCklPiIpOwotPCUKLSAgIH0KLSAgIEVudW1lcmF0aW9uIHVzZXJEZWZpbmVkQ2F0ZWdvcmllcyA9IHJlZ0VsZW1lbnQuZ2V0VXNlckRlZmluZWRDYXRlZ29yaWVzKCk7Ci0gICBpZiAodXNlckRlZmluZWRDYXRlZ29yaWVzICE9IG51bGwpCi0gICB7Ci0gICAgIHdoaWxlICh1c2VyRGVmaW5lZENhdGVnb3JpZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgIHsKLSAgICAgICBDYXRlZ29yeU1vZGVsIHVzZXJEZWZpbmVkQ2F0ZWdvcnkgPSAoQ2F0ZWdvcnlNb2RlbCl1c2VyRGVmaW5lZENhdGVnb3JpZXMubmV4dEVsZW1lbnQoKTsKLSU+Ci0gICAgICBjYXRlZ29yeUFycmF5W2NhdGVnb3J5QXJyYXkubGVuZ3RoXSA9IG5ldyBDYXRlZ29yeSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2V0RGlzcGxheU5hbWUoKSklPiIsIjwlPXVzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2V0VE1vZGVsS2V5KCklPiIpOwotPCUKLSAgICAgfQotICAgfQotJT4KLSAgICAgIGNhdGVnb3J5QXJyYXkuc29ydChjb21wYXJlQ2F0ZWdvcnlEaXNwbGF5TmFtZXMpOwotICAgIH0KLSAgICAKLSAgICBmb3IgKHZhciBpPTA7aTxjYXRlZ29yeUFycmF5Lmxlbmd0aDtpKyspCi0gICAgICBjYXRlZ29yeVR5cGVTZWxlY3Qub3B0aW9uc1tpXSA9IG5ldyBPcHRpb24oY2F0ZWdvcnlBcnJheVtpXS5kaXNwbGF5TmFtZSxjYXRlZ29yeUFycmF5W2ldLnRNb2RlbEtleSk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRKU0xpbmtSb3dUYXJnZXQobGluayxqc0Z1bmN0aW9uLHRhYmxlQ29udGFpbmVySWQscm93KQotICB7Ci0gICAgbGluay5ocmVmID0gImphdmFzY3JpcHQ6Iitqc0Z1bmN0aW9uKyIoJyIrdGFibGVDb250YWluZXJJZCsiJywiK3JvdysiKSI7Ci0gIH0KLQotICBmdW5jdGlvbiBvcGVuQ2F0ZWdvcnlCcm93c2VyKHRhYmxlQ29udGFpbmVySWQscm93KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIGNhdGVnb3J5U2VsZWN0ID0gdGFibGUucm93c1tyb3ddLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKS5pdGVtKDApOwotICAgIHZhciBzZWxlY3RlZENhdGVnb3J5T3B0aW9uID0gY2F0ZWdvcnlTZWxlY3Qub3B0aW9uc1tjYXRlZ29yeVNlbGVjdC5vcHRpb25zLnNlbGVjdGVkSW5kZXhdOwotICAgIHZhciBjYXRlZ29yeVR5cGUgPSB0YWJsZS5yb3dzW3Jvd10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlbGVjdCIpLml0ZW0oMCkub3B0aW9ucy5zZWxlY3RlZEluZGV4OwotICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tyb3ddLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgIHRhcmdldENhdGVnb3J5Um93ID0gcm93OwotICAgIHRhcmdldENhdGVnb3J5S2V5TmFtZUVsZW1lbnQgPSBjb2x1bW5zLml0ZW0oMikuY2hpbGROb2Rlc1swXTsKLSAgICB0YXJnZXRDYXRlZ29yeUtleVZhbHVlRWxlbWVudCA9IGNvbHVtbnMuaXRlbSgzKS5jaGlsZE5vZGVzWzBdOwotICAgIHZhciBsaW5rID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuQ2F0ZWdvcnlCcm93c2VyQWN0aW9uLmdldFdpbGRDYXJkQWN0aW9uTGluayhzZXNzaW9uSWQpKSklPiI7Ci0gICAgY2F0ZWdvcnlXaW5kb3cgPSB3aW5kb3cub3BlbihsaW5rLnJlcGxhY2Uod2lsZGNhcmRDYXRlZ29yeUJyb3dzZXJVUkxSZSxzZWxlY3RlZENhdGVnb3J5T3B0aW9uLnZhbHVlKSwiY2F0ZWdvcnlXaW5kb3ciLCJoZWlnaHQ9MzAwLHdpZHRoPTMwMCxzdGF0dXM9eWVzLHNjcm9sbGJhcnM9eWVzLHJlc2l6YWJsZT15ZXMiKTsKLSAgICBpZiAoY2F0ZWdvcnlXaW5kb3cuZm9jdXMpCi0gICAgICBjYXRlZ29yeVdpbmRvdy5mb2N1cygpOwotICB9Ci0KLSAgZnVuY3Rpb24gY2xvc2VDYXRlZ29yeUJyb3dzZXIoKQotICB7Ci0gICAgaWYgKCFjYXRlZ29yeVdpbmRvd0Nsb3NlZCkKLSAgICAgIGNhdGVnb3J5V2luZG93LmNsb3NlKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXRDYXRlZ29yeVJvd1NldHRpbmdzKHRhYmxlQ29udGFpbmVySWQsY2F0ZWdvcnlJbmRleCx0TW9kZWxLZXksa2V5TmFtZSxrZXlWYWx1ZSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93cytjYXRlZ29yeUluZGV4XTsKLSAgICB2YXIgY2F0ZWdvcnlUeXBlU2VsZWN0ID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKS5pdGVtKDApOwotICAgIHZhciByb3dFbGVtZW50Q29sbGVjdGlvbiA9IHJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICB2YXIga2V5TmFtZVRleHQgPSByb3dFbGVtZW50Q29sbGVjdGlvbi5pdGVtKDEpOwotICAgIHZhciBrZXlWYWx1ZVRleHQgPSByb3dFbGVtZW50Q29sbGVjdGlvbi5pdGVtKDIpOwotICAgIHNldFRNb2RlbEtleVNlbGVjdChjYXRlZ29yeVR5cGVTZWxlY3QsdE1vZGVsS2V5KTsKLSAgICBrZXlOYW1lVGV4dC52YWx1ZSA9IGtleU5hbWU7Ci0gICAga2V5VmFsdWVUZXh0LnZhbHVlID0ga2V5VmFsdWU7Ci0gIH0KLQotICBmdW5jdGlvbiBhZGRDYXRlZ29yeVJvd0Jyb3dzZUxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW4scm93SW5kZXgpCi0gIHsKLSAgICB2YXIgYnJvd3NlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBzZXRKU0xpbmtSb3dUYXJnZXQoYnJvd3NlTGluaywib3BlbkNhdGVnb3J5QnJvd3NlciIsdGFibGVDb250YWluZXJJZCxyb3dJbmRleCk7Ci0gICAgYnJvd3NlTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0JST1dTRSIpKSU+IikpOwotICAgIGNvbHVtbi5hcHBlbmRDaGlsZChicm93c2VMaW5rKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZENhdGVnb3J5Um93KHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW40ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLQotICAgIHZhciByb3dDaGVja2JveCA9IGNyZWF0ZVJvd0NoZWNrYm94KCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0KLSAgICB2YXIgY2F0ZWdvcnlUeXBlU2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7Ci0gICAgcG9wdWxhdGVDYXRlZ29yeVR5cGVTZWxlY3QoY2F0ZWdvcnlUeXBlU2VsZWN0KTsKLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGNhdGVnb3J5VHlwZVNlbGVjdCk7Ci0KLSAgICB2YXIga2V5TmFtZVRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgY29sdW1uMi5hcHBlbmRDaGlsZChrZXlOYW1lVGV4dElucHV0KTsKLQotICAgIHZhciBrZXlWYWx1ZVRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgY29sdW1uMy5hcHBlbmRDaGlsZChrZXlWYWx1ZVRleHRJbnB1dCk7Ci0KLSAgICBhZGRDYXRlZ29yeVJvd0Jyb3dzZUxpbmsodGFibGVDb250YWluZXJJZCxjb2x1bW40LHRhYmxlLnJvd3MubGVuZ3RoKTsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNhdGVnb3J5VHlwZVNlbGVjdC5jbGFzc05hbWUgPSAic2VsZWN0bGlzdCI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMS53aWR0aCA9ICI1JSI7Ci0gICAga2V5TmFtZVRleHRJbnB1dC5jbGFzc05hbWUgPSAidGFibGV0ZXh0ZW50ZXIiOwotICAgIGtleU5hbWVUZXh0SW5wdXQudGl0bGUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfS0VZX05BTUUiKSklPiI7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi53aWR0aCA9ICI1NSUiOwotICAgIGtleVZhbHVlVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAga2V5VmFsdWVUZXh0SW5wdXQudGl0bGUgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfQ0FURUdPUllfS0VZX1ZBTFVFIikpJT4iOwotICAgIGNvbHVtbjMuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIGNvbHVtbjMud2lkdGggPSAiMjUlIjsKLSAgICBjb2x1bW40LmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLQotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjIpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4zKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uNCk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiBzZXREaXNjb3ZlcnlVUkxSb3dTZXR0aW5ncyh0YWJsZUNvbnRhaW5lcklkLGRpc2NvdmVyeVVSTEluZGV4LGRpc2NvdmVyeVVSTCkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciByb3cgPSB0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93cytkaXNjb3ZlcnlVUkxJbmRleF07Ci0gICAgdmFyIHJvd0VsZW1lbnRDb2xsZWN0aW9uID0gcm93LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOwotICAgIHZhciBkaXNjb3ZlcnlVUkxUZXh0SW5wdXQgPSByb3dFbGVtZW50Q29sbGVjdGlvbi5pdGVtKDEpOwotICAgIGRpc2NvdmVyeVVSTFRleHRJbnB1dC52YWx1ZSA9IGRpc2NvdmVyeVVSTDsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZERpc2NvdmVyeVVSTFJvdyh0YWJsZUNvbnRhaW5lcklkKQotICB7Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVEJPRFkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotCi0gICAgdmFyIGRpc2NvdmVyeVVSTFRleHRJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7Ci0gICAgY29sdW1uMS5hcHBlbmRDaGlsZChkaXNjb3ZlcnlVUkxUZXh0SW5wdXQpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgZGlzY292ZXJ5VVJMVGV4dElucHV0LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgZGlzY292ZXJ5VVJMVGV4dElucHV0LnRpdGxlID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZSh1ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0RJU0NPVkVSWV9VUkwiKSklPiI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMS53aWR0aCA9ICI5NSUiOwotCi0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGFkZFJlc3VsdFJvdyh0YWJsZUNvbnRhaW5lcklkLG5vZGVJZCx1cmwsbmFtZSxkZXNjcmlwdGlvbikKLSAgewotICAgIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLQotICAgIHZhciByb3dDaGVja2JveCA9IGNyZWF0ZVJvd0NoZWNrYm94KCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCIiLG5vZGVJZCkpOwotCi0gICAgdmFyIG5hbWVEZXRhaWxzTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTsKLSAgICBuYW1lRGV0YWlsc0xpbmsuaHJlZiA9IHVybDsKLSAgICBuYW1lRGV0YWlsc0xpbmsudGFyZ2V0ID0gIjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI7Ci0gICAgbmFtZURldGFpbHNMaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5hbWUpKTsKLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKG5hbWVEZXRhaWxzTGluayk7Ci0KLSAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGdldERlZmF1bHREaXNwbGF5U3RyaW5nKGRlc2NyaXB0aW9uKSkpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMS53aWR0aCA9ICI0OCUiOwotICAgIGNvbHVtbjIud2lkdGggPSAiNDglIjsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMCk7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjEpOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4yKTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGdldEZpbmRRdWFsaWZpZXJUYWJsZShjb250YWluZXJJZCkKLSAgewotICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJJZCk7Ci0gICAgcmV0dXJuIGNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGFibGUiKS5pdGVtKDEpOwotICB9Ci0KLSAgZnVuY3Rpb24gc2V0RmluZFF1YWxpZmllcihmaW5kUXVhbGlmaWVyLG5hbWVUYWJsZUNvbnRhaW5lcklkLGNhdGVnb3J5VGFibGVDb250YWluZXJJZCxmaW5kUXVhbGlmaWVyc1RhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICB2YXIgdHdpc3RPcGVuTmFtZXMgPSBmYWxzZTsKLSAgICB2YXIgdHdpc3RPcGVuQ2F0ZWdvcmllcyA9IGZhbHNlOwotICAgIHZhciB0d2lzdE9wZW5GaW5kUXVhbGlmaWVycyA9IGZhbHNlOwotCi0gICAgaWYgKGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIuZXhhY3ROYW1lTWF0Y2glPiIpCi0gICAgewotICAgICAgdmFyIGZxVGFibGUgPSBnZXRGaW5kUXVhbGlmaWVyVGFibGUobmFtZVRhYmxlQ29udGFpbmVySWQpOwotICAgICAgdmFyIGV4YWN0TmFtZU1hdGNoQ2hlY2tib3ggPSBmcVRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBleGFjdE5hbWVNYXRjaENoZWNrYm94LmNoZWNrZWQgPSB0cnVlOwotICAgICAgdHdpc3RPcGVuTmFtZXMgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlIGlmIChmaW5kUXVhbGlmaWVyID09ICI8JT1GaW5kUXVhbGlmaWVyLmNhc2VTZW5zaXRpdmVNYXRjaCU+IikKLSAgICB7Ci0gICAgICB2YXIgZnFUYWJsZSA9IGdldEZpbmRRdWFsaWZpZXJUYWJsZShuYW1lVGFibGVDb250YWluZXJJZCk7Ci0gICAgICB2YXIgY2FzZVNlbnNpdGl2ZU1hdGNoQ2hlY2tib3ggPSBmcVRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMSk7Ci0gICAgICBjYXNlU2Vuc2l0aXZlTWF0Y2hDaGVja2JveC5jaGVja2VkID0gdHJ1ZTsKLSAgICAgIHR3aXN0T3Blbk5hbWVzID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZmluZFF1YWxpZmllciA9PSAiPCU9RmluZFF1YWxpZmllci5zZXJ2aWNlU3Vic2V0JT4iIHx8IGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIuY29tYmluZUNhdGVnb3J5QmFncyU+IikKLSAgICB7Ci0gICAgICB2YXIgZnFUYWJsZSA9IGdldEZpbmRRdWFsaWZpZXJUYWJsZShjYXRlZ29yeVRhYmxlQ29udGFpbmVySWQpOwotICAgICAgdmFyIGNhdGVnb3J5U2VsZWN0ID0gZnFUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0IikuaXRlbSgwKTsKLSAgICAgIHNldFNlbGVjdChjYXRlZ29yeVNlbGVjdCxmaW5kUXVhbGlmaWVyKTsKLSAgICAgIHR3aXN0T3BlbkNhdGVnb3JpZXMgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlIGlmIChmaW5kUXVhbGlmaWVyID09ICI8JT1GaW5kUXVhbGlmaWVyLmFuZEFsbEtleXMlPiIgfHwgZmluZFF1YWxpZmllciA9PSAiPCU9RmluZFF1YWxpZmllci5vckFsbEtleXMlPiIgfHwgZmluZFF1YWxpZmllciA9PSAiPCU9RmluZFF1YWxpZmllci5vckxpa2VLZXlzJT4iKQotICAgIHsKLSAgICAgIHZhciBmcVRhYmxlID0gZ2V0VGFibGUoZmluZFF1YWxpZmllcnNUYWJsZUNvbnRhaW5lcklkKTsKLSAgICAgIHZhciBrZXlTZWxlY3QgPSBmcVRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKS5pdGVtKDApOwotICAgICAgc2V0U2VsZWN0KGtleVNlbGVjdCxmaW5kUXVhbGlmaWVyKTsKLSAgICAgIGlmIChmaW5kUXVhbGlmaWVyICE9ICI8JT1GaW5kUXVhbGlmaWVyLmFuZEFsbEtleXMlPiIpCi0gICAgICAgIHR3aXN0T3BlbkZpbmRRdWFsaWZpZXJzID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZmluZFF1YWxpZmllciA9PSAiPCU9RmluZFF1YWxpZmllci5zb3J0QnlOYW1lQXNjJT4iIHx8IGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5TmFtZURlc2MlPiIgfHwgZmluZFF1YWxpZmllciA9PSAiPCU9RmluZFF1YWxpZmllci5zb3J0QnlEYXRlQXNjJT4iIHx8IGZpbmRRdWFsaWZpZXIgPT0gIjwlPUZpbmRRdWFsaWZpZXIuc29ydEJ5RGF0ZURlc2MlPiIpCi0gICAgewotICAgICAgdmFyIGZxVGFibGUgPSBnZXRUYWJsZShmaW5kUXVhbGlmaWVyc1RhYmxlQ29udGFpbmVySWQpOwotICAgICAgdmFyIHNvcnRDb2xsZWN0aW9uID0gZnFUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICAgIGZvciAodmFyIGk9MDtpPHNvcnRDb2xsZWN0aW9uLmxlbmd0aDtpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChzb3J0Q29sbGVjdGlvbi5pdGVtKGkpLnZhbHVlID09IGZpbmRRdWFsaWZpZXIpCi0gICAgICAgICAgc29ydENvbGxlY3Rpb24uaXRlbShpKS5jaGVja2VkID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChmaW5kUXVhbGlmaWVyICE9ICI8JT1GaW5kUXVhbGlmaWVyLnNvcnRCeU5hbWVBc2MlPiIgJiYgZmluZFF1YWxpZmllciAhPSAiPCU9RmluZFF1YWxpZmllci5zb3J0QnlEYXRlQXNjJT4iKQotICAgICAgICB0d2lzdE9wZW5GaW5kUXVhbGlmaWVycyA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHR3aXN0T3Blbk5hbWVzKQotICAgICAgdHdpc3RPcGVuKG5hbWVUYWJsZUNvbnRhaW5lcklkKTsKLSAgICBpZiAodHdpc3RPcGVuQ2F0ZWdvcmllcykKLSAgICAgIHR3aXN0T3BlbihjYXRlZ29yeVRhYmxlQ29udGFpbmVySWQpOwotICAgIGlmICh0d2lzdE9wZW5GaW5kUXVhbGlmaWVycykKLSAgICAgIHR3aXN0T3BlbihmaW5kUXVhbGlmaWVyc1RhYmxlQ29udGFpbmVySWQpOwotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc0xhbmd1YWdlSW5wdXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkLGxhbmdWYXIsdGV4dFZhcixmb3JtKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIGxhbmd1YWdlU2VsZWN0cyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKTsKLSAgICB2YXIgdGV4dElucHV0cyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOwotICAgIGZvciAodmFyIGk9MDtpPGxhbmd1YWdlU2VsZWN0cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBoaWRkZW5MYW5ndWFnZVNlbGVjdCA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQobGFuZ1ZhcixsYW5ndWFnZVNlbGVjdHNbaV0udmFsdWUpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5MYW5ndWFnZVNlbGVjdCk7Ci0gICAgfQotCi0gICAgZm9yICh2YXIgaT0wO2k8dGV4dElucHV0cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmICh0ZXh0SW5wdXRzW2ldLnR5cGUgPT0gInRleHQiKQotICAgICAgewotICAgICAgICB2YXIgaGlkZGVuVGV4dElucHV0ID0gY3JlYXRlSGlkZGVuRWxlbWVudCh0ZXh0VmFyLHRleHRJbnB1dHNbaV0udmFsdWUpOwotICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGhpZGRlblRleHRJbnB1dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc05hbWVGaW5kUXVhbGlmaWVycyh0YWJsZUNvbnRhaW5lcklkLGZvcm0pCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRGaW5kUXVhbGlmaWVyVGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgdmFyIG5hbWVGaW5kUXVhbGlmaWVyQ2hlY2tib3hlcyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpOwotICAgIGZvciAodmFyIGk9MDtpPG5hbWVGaW5kUXVhbGlmaWVyQ2hlY2tib3hlcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBpdGVtID0gbmFtZUZpbmRRdWFsaWZpZXJDaGVja2JveGVzLml0ZW0oaSk7Ci0gICAgICBpZiAoaXRlbS5jaGVja2VkKQotICAgICAgewotICAgICAgICB2YXIgaGlkZGVuRmluZFF1YWxpZmllciA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRklORFFVQUxJRklFUiU+IixpdGVtLnZhbHVlKTsKLSAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5GaW5kUXVhbGlmaWVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzSWRlbnRpZmllclRhYmxlKHRhYmxlQ29udGFpbmVySWQsZm9ybSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBpZGVudGlmaWVyVHlwZVNlbGVjdHMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VsZWN0Iik7Ci0gICAgdmFyIHRleHRJbnB1dHMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICBmb3IgKHZhciBpPTA7aTxpZGVudGlmaWVyVHlwZVNlbGVjdHMubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgaGlkZGVuSWRlbnRpZmllclR5cGVTZWxlY3QgPSBjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0lERU5USUZJRVJfVFlQRSU+IixpZGVudGlmaWVyVHlwZVNlbGVjdHNbaV0udmFsdWUpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5JZGVudGlmaWVyVHlwZVNlbGVjdCk7Ci0gICAgfQotCi0gICAgdmFyIGlzS2V5TmFtZSA9IHRydWU7Ci0gICAgZm9yICh2YXIgaT0wO2k8dGV4dElucHV0cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmICh0ZXh0SW5wdXRzW2ldLnR5cGUgPT0gInRleHQiKQotICAgICAgewotICAgICAgICB2YXIgbmFtZTsKLSAgICAgICAgaWYgKGlzS2V5TmFtZSkKLSAgICAgICAgICBuYW1lID0gIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfSURFTlRJRklFUl9LRVlfTkFNRSU+IjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG5hbWUgPSAiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9JREVOVElGSUVSX0tFWV9WQUxVRSU+IjsKLSAgICAgICAgdmFyIGhpZGRlblRleHRJbnB1dCA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQobmFtZSx0ZXh0SW5wdXRzW2ldLnZhbHVlKTsKLSAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5UZXh0SW5wdXQpOwotICAgICAgICBpc0tleU5hbWUgPSAhaXNLZXlOYW1lOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHByb2Nlc3NDYXRlZ29yeVRhYmxlKHRhYmxlQ29udGFpbmVySWQsZm9ybSxpc0ZpbmRCdXNpbmVzcykKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBjYXRlZ29yeVR5cGVTZWxlY3RzID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNlbGVjdCIpOwotICAgIHZhciB0ZXh0SW5wdXRzID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgZm9yICh2YXIgaT0wO2k8Y2F0ZWdvcnlUeXBlU2VsZWN0cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBoaWRkZW5DYXRlZ29yeVR5cGVTZWxlY3QgPSBjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX0FEVkFOQ0VEX0NBVEVHT1JZX1RZUEUlPiIsY2F0ZWdvcnlUeXBlU2VsZWN0c1tpXS52YWx1ZSk7Ci0gICAgICBmb3JtLmFwcGVuZENoaWxkKGhpZGRlbkNhdGVnb3J5VHlwZVNlbGVjdCk7Ci0gICAgfQotCi0gICAgdmFyIGlzS2V5TmFtZSA9IHRydWU7Ci0gICAgZm9yICh2YXIgaT0wO2k8dGV4dElucHV0cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmICh0ZXh0SW5wdXRzW2ldLnR5cGUgPT0gInRleHQiKQotICAgICAgewotICAgICAgICB2YXIgbmFtZTsKLSAgICAgICAgaWYgKGlzS2V5TmFtZSkKLSAgICAgICAgICBuYW1lID0gIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX05BTUUlPiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuYW1lID0gIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfQ0FURUdPUllfS0VZX1ZBTFVFJT4iOwotICAgICAgICB2YXIgaGlkZGVuVGV4dElucHV0ID0gY3JlYXRlSGlkZGVuRWxlbWVudChuYW1lLHRleHRJbnB1dHNbaV0udmFsdWUpOwotICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGhpZGRlblRleHRJbnB1dCk7Ci0gICAgICAgIGlzS2V5TmFtZSA9ICFpc0tleU5hbWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlzRmluZEJ1c2luZXNzKQotICAgIHsKLSAgICAgIHRhYmxlID0gZ2V0RmluZFF1YWxpZmllclRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgdmFyIGNhdGVnb3J5RmluZFF1YWxpZmllciA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKS5pdGVtKDApOwotICAgICAgaWYgKGNhdGVnb3J5RmluZFF1YWxpZmllci5zZWxlY3RlZEluZGV4ICE9IDApCi0gICAgICB7Ci0gICAgICAgIHZhciBoaWRkZW5GaW5kUXVhbGlmaWVyID0gY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9GSU5EUVVBTElGSUVSJT4iLGNhdGVnb3J5RmluZFF1YWxpZmllci52YWx1ZSk7Ci0gICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuRmluZFF1YWxpZmllcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc0Rpc2NvdmVyeVVSTFRhYmxlKHRhYmxlQ29udGFpbmVySWQsZm9ybSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciB0ZXh0SW5wdXRzID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgZm9yICh2YXIgaT0wO2k8dGV4dElucHV0cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmICh0ZXh0SW5wdXRzW2ldLnR5cGUgPT0gInRleHQiKQotICAgICAgewotICAgICAgICB2YXIgaGlkZGVuVGV4dElucHV0ID0gY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9ESVNDT1ZFUllVUkwlPiIsdGV4dElucHV0c1tpXS52YWx1ZSk7Ci0gICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoaGlkZGVuVGV4dElucHV0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRmluZFF1YWxpZmllclRhYmxlKHRhYmxlQ29udGFpbmVySWQsZm9ybSkKLSAgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgIHZhciBmaW5kUXVhbGlmaWVyU2VsZWN0cyA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzZWxlY3QiKTsKLSAgICBmb3IgKHZhciBpPTA7aTxmaW5kUXVhbGlmaWVyU2VsZWN0cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBmaW5kUXVhbGlmaWVyU2VsZWN0ID0gZmluZFF1YWxpZmllclNlbGVjdHMuaXRlbShpKTsKLSAgICAgIHZhciBoaWRkZW5GaW5kUXVhbGlmaWVyID0gY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9BRFZBTkNFRF9GSU5EUVVBTElGSUVSJT4iLGZpbmRRdWFsaWZpZXJTZWxlY3QudmFsdWUpOwotICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5GaW5kUXVhbGlmaWVyKTsKLSAgICB9Ci0KLSAgICB2YXIgZmluZFF1YWxpZmllclNvcnRSYWRpb3MgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKTsKLSAgICBmb3IgKHZhciBpPTA7aTxmaW5kUXVhbGlmaWVyU29ydFJhZGlvcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChmaW5kUXVhbGlmaWVyU29ydFJhZGlvcy5pdGVtKGkpLmNoZWNrZWQpCi0gICAgICB7Ci0gICAgICAgIHZhciBoaWRkZW5Tb3J0RWxlbWVudCA9IGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfQURWQU5DRURfRklORFFVQUxJRklFUiU+IixmaW5kUXVhbGlmaWVyU29ydFJhZGlvcy5pdGVtKGkpLnZhbHVlKTsKLSAgICAgICAgZm9ybS5hcHBlbmRDaGlsZChoaWRkZW5Tb3J0RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gcHJvY2Vzc1Jlc3VsdFRhYmxlKHRhYmxlQ29udGFpbmVySWQsaW5wdXROYW1lLGZvcm0sc2VsZWN0ZWRPbmx5KQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJZCk7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIGlucHV0cyA9IHRhYmxlLnJvd3NbaV0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgICBpZiAoc2VsZWN0ZWRPbmx5KQotICAgICAgewotICAgICAgICBpZiAoaW5wdXRzLml0ZW0oMCkuY2hlY2tlZCkKLSAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoaW5wdXROYW1lLGlucHV0cy5pdGVtKDEpLnZhbHVlKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudChpbnB1dE5hbWUsaW5wdXRzLml0ZW0oMSkudmFsdWUpKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBpbml0aWF0ZVN1YlF1ZXJ5KGZvcm1Db250YWluZXJJZCxuZXdTdWJRdWVyeUtleSxxdWVyeUl0ZW0saXNHZXQpCi0gIHsKLSAgICBpZiAoaXNHZXQpCi0gICAgewotICAgICAgdmFyIGhhc0dldEl0ZW1zID0gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKHF1ZXJ5SXRlbSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSA8JT1VRERJQWN0aW9uSW5wdXRzLlFVRVJZX0lURU1fQlVTSU5FU1NFUyU+OgotICAgICAgICAgIGhhc0dldEl0ZW1zID0gPCU9cmVnTm9kZS5oYXNCdXNpbmVzcygpJT47Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgPCU9VURESUFjdGlvbklucHV0cy5RVUVSWV9JVEVNX1NFUlZJQ0VTJT46Ci0gICAgICAgICAgaGFzR2V0SXRlbXMgPSA8JT1yZWdOb2RlLmhhc1NlcnZpY2UoKSU+OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDwlPVVERElBY3Rpb25JbnB1dHMuUVVFUllfSVRFTV9TRVJWSUNFX0lOVEVSRkFDRVMlPjoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBoYXNHZXRJdGVtcyA9IDwlPXJlZ05vZGUuaGFzU2VydmljZUludGVyZmFjZSgpJT47Ci0gICAgICB9Ci0gICAgICBpZiAoIWhhc0dldEl0ZW1zKQotICAgICAgewotICAgICAgICBhbGVydCgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9fSVRFTVNfVE9fR0VUIikpJT4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICB2YXIgZm9ybUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1Db250YWluZXJJZCk7Ci0gICAgdmFyIGZvcm0gPSBmb3JtQ29udGFpbmVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIikuaXRlbSgwKTsKLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuU1VCUVVFUllfR0VUJT4udmFsdWUgPSBpc0dldDsKLSAgICBmb3JtLjwlPVVERElBY3Rpb25JbnB1dHMuTkVXX1NVQlFVRVJZX0lOSVRJQVRFRCU+LnZhbHVlID0gbmV3U3ViUXVlcnlLZXk7Ci0gICAgZm9ybS48JT1VRERJQWN0aW9uSW5wdXRzLk5FV19TVUJRVUVSWV9RVUVSWV9JVEVNJT4udmFsdWUgPSBxdWVyeUl0ZW07Ci0gICAgdmFyIG9rVG9TdWJtaXQgPSBmYWxzZTsKLSAgICBpZiAoZm9ybUNvbnRhaW5lcklkID09ICJmaW5kQnVzaW5lc3Nlc0FkdmFuY2VkIikKLSAgICAgIG9rVG9TdWJtaXQgPSBwcm9jZXNzRmluZEJ1c2luZXNzZXNBZHZhbmNlZEZvcm0oZm9ybSk7Ci0gICAgZWxzZSBpZiAoZm9ybUNvbnRhaW5lcklkID09ICJmaW5kU2VydmljZXNBZHZhbmNlZCIpCi0gICAgICBva1RvU3VibWl0ID0gcHJvY2Vzc0ZpbmRTZXJ2aWNlc0FkdmFuY2VkRm9ybShmb3JtKTsKLSAgICBlbHNlIGlmIChmb3JtQ29udGFpbmVySWQgPT0gImZpbmRTZXJ2aWNlSW50ZXJmYWNlc0FkdmFuY2VkIikKLSAgICAgIG9rVG9TdWJtaXQgPSBwcm9jZXNzRmluZFNlcnZpY2VJbnRlcmZhY2VzQWR2YW5jZWRGb3JtKGZvcm0pOwotICAgIGVsc2UgaWYgKGZvcm1Db250YWluZXJJZCA9PSAicHVibGlzaFNlcnZpY2VTaW1wbGUiKQotICAgICAgb2tUb1N1Ym1pdCA9IHByb2Nlc3NQdWJsaXNoU2VydmljZVNpbXBsZUZvcm0oZm9ybSk7Ci0gICAgZWxzZSBpZiAoZm9ybUNvbnRhaW5lcklkID09ICJwdWJsaXNoU2VydmljZUFkdmFuY2VkIikKLSAgICAgIG9rVG9TdWJtaXQgPSBwcm9jZXNzUHVibGlzaFNlcnZpY2VBZHZhbmNlZEZvcm0oZm9ybSk7Ci0gICAgZWxzZSBpZiAoZm9ybUNvbnRhaW5lcklkID09ICJwdWJsaXNoZXJBc3NlcnRpb25zIikKLSAgICAgIG9rVG9TdWJtaXQgPSBoYW5kbGVTdWJtaXQoZm9ybSk7Ci0gICAgZWxzZSBpZiAoZm9ybUNvbnRhaW5lcklkID09ICJtYW5hZ2VSZWZlcmVuY2VkU2VydmljZXMiKQotICAgICAgb2tUb1N1Ym1pdCA9IHByb2Nlc3NGb3JtKGZvcm0pOwotICAgIGlmIChva1RvU3VibWl0KQotICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc3RhdHVzX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc3RhdHVzX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODg4ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3N0YXR1c19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuU1RBVFVTX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL3N0YXR1c190b29sYmFyLmpzcCIpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci0gIDxmcmFtZSBuYW1lPSI8JT1VRERJRnJhbWVOYW1lcy5TVEFUVVNfQ09OVEVOVCU+IiB0aXRsZT0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc3RhdHVzX2NvbnRlbnQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3N0YXR1c19jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4ODhmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvc3RhdHVzX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFVERElQZXJzcGVjdGl2ZSB1ZGRpUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPHByZT4KLTwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5nZXRNZXNzYWdlc0Zyb21MaXN0KCklPgotICAgICAgICA8L3ByZT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3N0YXR1c190b29sYmFyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS9zdGF0dXNfdG9vbGJhci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZWE1OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci91ZGRpL3N0YXR1c190b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgVURESVBlcnNwZWN0aXZlIHVkZGlQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0VURESVBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9dWRkaVBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3Rvb2xiYXIuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii91ZGRpL3NjcmlwdHMvdWRkaWZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJ1ZGRpL2FjdGlvbnMvUmVzaXplVURESUZyYW1lc0FjdGlvbkpTUC5qc3AiKTsKLSU+ICAKLTwvanNwOnVzZUJlYW4+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUZyYW1lTmFtZS5hcHBlbmQoVURESUZyYW1lTmFtZXMuU1RBVFVTX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvdWRkaS9mb3Jtcy9Qcm9jZXNzVURESUZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3N0YXR1cy5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci08JQotICAgU3RyaW5nIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBudWxsOwotICAgaWYgKHVkZGlQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgewotICAgICBpZiAodWRkaVBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKS5lbmRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgfQotICAgaWYgKGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPT0gbnVsbCkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9TVEFUVVMiKSU+PC90ZD4KLTwlCi0gICBTdHJpbmcgYWx0Q2xlYXIgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9DTEVBUiIpOwotJT4gICAgICAgICAgIAotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iIHRhcmdldD0iPCU9VURESUZyYW1lTmFtZXMuU1RBVFVTX0NPTlRFTlQlPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRDbGVhciU+IiB0aXRsZT0iPCU9YWx0Q2xlYXIlPiI+PC9hPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3VkZGkvdWRkaV9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS91ZGRpX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjgxODUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvdWRkaS91ZGRpX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51ZGRpLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBVRERJUGVyc3BlY3RpdmUgdWRkaVBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRVRERJUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT11ZGRpUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfVURESV9QRVJTUEVDVElWRV9DT05URU5UIiklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgY29scz0iPCU9dWRkaVBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpJT4iIGJnY29sb3I9I0VDRTlEOD4KLSAgPGZyYW1lIG5hbWU9IjwlPVVERElGcmFtZU5hbWVzLk5BVklHQVRPUl9DT05UQUlORVIlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInVkZGkvbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AiKSklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotICA8ZnJhbWUgbmFtZT0iPCU9VURESUZyYW1lTmFtZXMuQUNUSU9OU19DT05UQUlORVIlPiIgdGl0bGU9IjwlPXVkZGlQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ1ZGRpL2FjdGlvbnNfY29udGFpbmVyLmpzcCIpKSU+IiBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTE+Ci08L2ZyYW1lc2V0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvQ2xlYXJXU0RMQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0NsZWFyV1NETEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNzU4ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvQ2xlYXJXU0RMQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuQ2xlYXJXU0RMQWN0aW9uIiU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1DbGVhcldTRExBY3Rpb24gYWN0aW9uID0gbmV3IENsZWFyV1NETEFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9DbGVhck5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvQ3JlYXRlSW5zdGFuY2VBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvQ3JlYXRlSW5zdGFuY2VBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjJjNTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0NyZWF0ZUluc3RhbmNlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETEZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLkZyYWdtZW50Q29uc3RhbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLkNyZWF0ZUluc3RhbmNlQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotICA8JQotICBDcmVhdGVJbnN0YW5jZUFjdGlvbiBhY3Rpb24gPSBuZXcgQ3JlYXRlSW5zdGFuY2VBY3Rpb24oY29udHJvbGxlcik7Ci0gIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0gIGFjdGlvbi5leGVjdXRlKCk7Ci0gICU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICA8L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9JbnZva2VXU0RMSHR0cEdldE9wZXJhdGlvbkZvcm1BY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIwMTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwR2V0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci0gIDwlCi0gIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgSW52b2tlV1NETEh0dHBHZXRPcGVyYXRpb25Gb3JtQWN0aW9uIGFjdGlvbiA9IG5ldyBJbnZva2VXU0RMSHR0cEdldE9wZXJhdGlvbkZvcm1BY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gIGJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0gIGlmIChpbnB1dHNWYWxpZCkKLSAgewotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgfQotICAlPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExIdHRwUG9zdE9wZXJhdGlvbkZvcm1BY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvSW52b2tlV1NETEh0dHBQb3N0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NGY1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvSW52b2tlV1NETEh0dHBQb3N0T3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci0gIDwlCi0gIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgSW52b2tlV1NETEh0dHBQb3N0T3BlcmF0aW9uRm9ybUFjdGlvbiBhY3Rpb24gPSBuZXcgSW52b2tlV1NETEh0dHBQb3N0T3BlcmF0aW9uRm9ybUFjdGlvbihjb250cm9sbGVyKTsKLQotICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgaWYgKGlucHV0c1ZhbGlkKQotICB7Ci0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotICB9Ci0gICU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgd3NkbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvSW52b2tlV1NETFNPQVBPcGVyYXRpb25Gb3JtQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uRm9ybUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzU0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvSW52b2tlV1NETFNPQVBPcGVyYXRpb25Gb3JtQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5NZXNzYWdlUXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMQWN0aW9uSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydC5IVFRQRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQuSFRUUFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuLm1pc2MuQkFTRTY0RGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UiJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotSW52b2tlV1NETFNPQVBPcGVyYXRpb25Gb3JtQWN0aW9uIGFjdGlvbiA9IG5ldyBJbnZva2VXU0RMU09BUE9wZXJhdGlvbkZvcm1BY3Rpb24oY29udHJvbGxlcik7Ci1TdHJpbmcgaHR0cEJhc2ljQXV0aERhdGEgPSByZXF1ZXN0LmdldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX0FVVEgpOwotaWYgKGh0dHBCYXNpY0F1dGhEYXRhICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aERhdGEubGVuZ3RoKCkgPiAwKQotewotICBpbnQgYmFzaWNJbmRleCA9IGh0dHBCYXNpY0F1dGhEYXRhLmluZGV4T2YoSFRUUFRyYW5zcG9ydC5CQVNJQyk7Ci0gIGlmIChiYXNpY0luZGV4ICE9IC0xKQotICB7Ci0gICAgQkFTRTY0RGVjb2RlciBkZWNvZGVyID0gbmV3IEJBU0U2NERlY29kZXIoKTsKLSAgICBodHRwQmFzaWNBdXRoRGF0YSA9IG5ldyBTdHJpbmcoZGVjb2Rlci5kZWNvZGVCdWZmZXIoaHR0cEJhc2ljQXV0aERhdGEuc3Vic3RyaW5nKGJhc2ljSW5kZXggKyBIVFRQVHJhbnNwb3J0LkJBU0lDLmxlbmd0aCgpICsgMSkpKTsKLSAgICBpbnQgY29sb25JbmRleCA9IGh0dHBCYXNpY0F1dGhEYXRhLmluZGV4T2YoSFRUUFRyYW5zcG9ydC5DT0xPTik7Ci0gICAgaWYgKGNvbG9uSW5kZXggIT0gLTEpCi0gICAgewotICAgICAgYWN0aW9uLmFkZFByb3BlcnR5KFdTRExBY3Rpb25JbnB1dHMuSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FLCBodHRwQmFzaWNBdXRoRGF0YS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCkpOwotICAgICAgYWN0aW9uLmFkZFByb3BlcnR5KFdTRExBY3Rpb25JbnB1dHMuSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JELCBodHRwQmFzaWNBdXRoRGF0YS5zdWJzdHJpbmcoY29sb25JbmRleCArIDEsIGh0dHBCYXNpY0F1dGhEYXRhLmxlbmd0aCgpKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci1pZiAoIWlucHV0c1ZhbGlkKQotewotJT4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPjwvc2NyaXB0PgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgPC9zY3JpcHQ+Ci0gICAgPC9ib2R5PgotICA8L2h0bWw+Ci08JQotfQotZWxzZQotewotICB0cnkKLSAgewotICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8aHRtbD4KLSAgICAgIDxoZWFkPgotICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+PC9zY3JpcHQ+Ci0gICAgICA8L2hlYWQ+Ci0gICAgICA8Ym9keT4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgd3NkbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICAgIDwlCi0gICAgICAgICAgaWYgKGFjdGlvblJlc3VsdCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgJT4KLSAgICAgICAgICAgIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Jlc3VsdF9jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICA8JQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICU+Ci0gICAgICAgICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgICAgPCUKLSAgICAgICAgICB9Ci0gICAgICAgICAgJT4KLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICA8L2JvZHk+Ci0gICAgPC9odG1sPgotPCUKLSAgfQotICBjYXRjaCAoSFRUUEV4Y2VwdGlvbiBodHRwZSkKLSAgewotICAgIGludCBjb2RlID0gaHR0cGUuZ2V0U3RhdHVzQ29kZSgpOwotICAgIGlmIChjb2RlID09IEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKQotICAgIHsKLSAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhjb2RlKTsKLSAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX0NPTlRFTlRfTEVOR1RILCBTdHJpbmcudmFsdWVPZigwKSk7Ci0gICAgICBTdHJpbmcgd3d3QXV0aERhdGEgPSBodHRwZS5nZXRIZWFkZXIoSFRUUFRyYW5zcG9ydC5IVFRQX0hFQURFUl9XV1dfQVVUSC50b0xvd2VyQ2FzZSgpKTsKLSAgICAgIGlmICh3d3dBdXRoRGF0YSA9PSBudWxsKQotICAgICAgICB3d3dBdXRoRGF0YSA9IGh0dHBlLmdldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX1dXV19BVVRIKTsKLSAgICAgIGlmICh3d3dBdXRoRGF0YSA9PSBudWxsKQotICAgICAgICB3d3dBdXRoRGF0YSA9IEhUVFBUcmFuc3BvcnQuQkFTSUM7Ci0gICAgICByZXNwb25zZS5zZXRIZWFkZXIoSFRUUFRyYW5zcG9ydC5IVFRQX0hFQURFUl9XV1dfQVVUSCwgd3d3QXV0aERhdGEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgICBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpOwotICAgICAgbWVzc2FnZVF1ZXVlLmFkZE1lc3NhZ2UoY29udHJvbGxlci5nZXRNZXNzYWdlKCJNU0dfRVJST1JfVU5FWFBFQ1RFRCIpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKFN0cmluZy52YWx1ZU9mKGNvZGUpKTsKLSAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKGh0dHBlLmdldFN0YXR1c01lc3NhZ2UoKSk7Ci0gICAgICAlPgotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICAgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+PC9zY3JpcHQ+Ci0gICAgICAgICAgPC9oZWFkPgotICAgICAgICAgIDxib2R5PgotICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICAgIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICAgICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgICAgICA8L3NjcmlwdD4KLSAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgIDwvaHRtbD4KLSAgICAgIDwlCi0gICAgfQotICB9Ci19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvSW52b2tlV1NETFNPQVBPcGVyYXRpb25Tb3VyY2VBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvSW52b2tlV1NETFNPQVBPcGVyYXRpb25Tb3VyY2VBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRmODcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL0ludm9rZVdTRExTT0FQT3BlcmF0aW9uU291cmNlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExBY3Rpb25JbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydC5IVFRQRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC50cmFuc3BvcnQuSFRUUFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuLm1pc2MuQkFTRTY0RGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuKiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1JbnZva2VXU0RMU09BUE9wZXJhdGlvblNvdXJjZUFjdGlvbiBhY3Rpb24gPSBuZXcgSW52b2tlV1NETFNPQVBPcGVyYXRpb25Tb3VyY2VBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYm9vbGVhbiBpbnB1dHNWYWxpZCA9IGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0gIAotaWYgKGFjdGlvbi53YXNTYXZlQXNTZWxlY3RlZCgpKQotewotICAvLyB3cml0ZSB0byBmaWxlIHN5c3RlbQotICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gIHJlc3BvbnNlLnNldEhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbiIsImF0dGFjaG1lbnQ7ZmlsZW5hbWU9IithY3Rpb24uZ2V0RGVmYXVsdFNhdmVBc0ZpbGVOYW1lKCkpOwotICBhY3Rpb24ud3JpdGVTb3VyY2VDb250ZW50KHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpKTsgICAgCi19Ci1lbHNlCi17Ci0gIGlmICghaW5wdXRzVmFsaWQpCi0gIHsKLSAgJT4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDxodG1sPgotICAgICAgPGhlYWQ+Ci0gICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij48L3NjcmlwdD4KLSAgICAgIDwvaGVhZD4KLSAgICAgIDxib2R5PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgIDwvc2NyaXB0PgotICAgICAgPC9ib2R5PgotICAgIDwvaHRtbD4KLSAgPCUKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpZiAoYWN0aW9uLndhc05ld0ZpbGVTZWxlY3RlZCgpKQotICAgIHsgICAgIAotICAlPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgIDxodG1sPgotICAgICAgICA8aGVhZD4KLSAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij48L3NjcmlwdD4KLSAgICAgICAgPC9oZWFkPgotICAgICAgICA8Ym9keT4KLSAgICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICAgICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICAgIDwvc2NyaXB0PgotICAgICAgICA8L2JvZHk+Ci0gICAgICA8L2h0bWw+Ci0gICAgPCUgICAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgaHR0cEJhc2ljQXV0aERhdGEgPSByZXF1ZXN0LmdldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX0FVVEgpOwotICAgICAgaWYgKGh0dHBCYXNpY0F1dGhEYXRhICE9IG51bGwgJiYgaHR0cEJhc2ljQXV0aERhdGEubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBpbnQgYmFzaWNJbmRleCA9IGh0dHBCYXNpY0F1dGhEYXRhLmluZGV4T2YoSFRUUFRyYW5zcG9ydC5CQVNJQyk7Ci0gICAgICAgIGlmIChiYXNpY0luZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgQkFTRTY0RGVjb2RlciBkZWNvZGVyID0gbmV3IEJBU0U2NERlY29kZXIoKTsKLSAgICAgICAgICBodHRwQmFzaWNBdXRoRGF0YSA9IG5ldyBTdHJpbmcoZGVjb2Rlci5kZWNvZGVCdWZmZXIoaHR0cEJhc2ljQXV0aERhdGEuc3Vic3RyaW5nKGJhc2ljSW5kZXggKyBIVFRQVHJhbnNwb3J0LkJBU0lDLmxlbmd0aCgpICsgMSkpKTsKLSAgICAgICAgICBpbnQgY29sb25JbmRleCA9IGh0dHBCYXNpY0F1dGhEYXRhLmluZGV4T2YoSFRUUFRyYW5zcG9ydC5DT0xPTik7Ci0gICAgICAgICAgaWYgKGNvbG9uSW5kZXggIT0gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWN0aW9uLmFkZFByb3BlcnR5KFdTRExBY3Rpb25JbnB1dHMuSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FLCBodHRwQmFzaWNBdXRoRGF0YS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCkpOwotICAgICAgICAgICAgYWN0aW9uLmFkZFByb3BlcnR5KFdTRExBY3Rpb25JbnB1dHMuSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JELCBodHRwQmFzaWNBdXRoRGF0YS5zdWJzdHJpbmcoY29sb25JbmRleCArIDEsIGh0dHBCYXNpY0F1dGhEYXRhLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICAgICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgICAlPgotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICA8aHRtbD4KLSAgICAgICAgICA8aGVhZD4KLSAgICAgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICAgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+PC9zY3JpcHQ+Ci0gICAgICAgICAgPC9oZWFkPgotICAgICAgICAgIDxib2R5PgotICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICAgIHdzZGxQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgaWYgKGFjdGlvblJlc3VsdCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Jlc3VsdF9jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgIDwvc2NyaXB0PgotICAgICAgICAgIDwvYm9keT4KLSAgICAgICAgPC9odG1sPgotPCUKLSAgICAgIH0KLSAgICAgIGNhdGNoIChIVFRQRXhjZXB0aW9uIGh0dHBlKQotICAgICAgewotICAgICAgICBpbnQgY29kZSA9IGh0dHBlLmdldFN0YXR1c0NvZGUoKTsKLSAgICAgICAgaWYgKGNvZGUgPT0gSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoY29kZSk7Ci0gICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKEhUVFBUcmFuc3BvcnQuSFRUUF9IRUFERVJfQ09OVEVOVF9MRU5HVEgsIFN0cmluZy52YWx1ZU9mKDApKTsKLSAgICAgICAgICBTdHJpbmcgd3d3QXV0aERhdGEgPSBodHRwZS5nZXRIZWFkZXIoSFRUUFRyYW5zcG9ydC5IVFRQX0hFQURFUl9XV1dfQVVUSC50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICBpZiAod3d3QXV0aERhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgIHd3d0F1dGhEYXRhID0gaHR0cGUuZ2V0SGVhZGVyKEhUVFBUcmFuc3BvcnQuSFRUUF9IRUFERVJfV1dXX0FVVEgpOwotICAgICAgICAgIGlmICh3d3dBdXRoRGF0YSA9PSBudWxsKQotICAgICAgICAgICAgd3d3QXV0aERhdGEgPSBIVFRQVHJhbnNwb3J0LkJBU0lDOwotICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcihIVFRQVHJhbnNwb3J0LkhUVFBfSEVBREVSX1dXV19BVVRILCB3d3dBdXRoRGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICAgICAgICAgTWVzc2FnZVF1ZXVlIG1lc3NhZ2VRdWV1ZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9VTkVYUEVDVEVEIikpOwotICAgICAgICAgIG1lc3NhZ2VRdWV1ZS5hZGRNZXNzYWdlKFN0cmluZy52YWx1ZU9mKGNvZGUpKTsKLSAgICAgICAgICBtZXNzYWdlUXVldWUuYWRkTWVzc2FnZShodHRwZS5nZXRTdGF0dXNNZXNzYWdlKCkpOwotICAgICAgICAgICU+Ci0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICAgICAgICA8aHRtbD4KLSAgICAgICAgICAgIDxoZWFkPgotICAgICAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgICAgICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+PC9zY3JpcHQ+Ci0gICAgICAgICAgICA8L2hlYWQ+Ci0gICAgICAgICAgICA8Ym9keT4KLSAgICAgICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICAgICAgd3NkbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICAgICAgICAgIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgICAgICA8L2JvZHk+Ci0gICAgICAgICAgPC9odG1sPgotICAgICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9PcGVuV1NETEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9PcGVuV1NETEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjY2RhNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvT3BlbldTRExBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5GcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLk9wZW5XU0RMQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgT3BlbldTRExBY3Rpb24gYWN0aW9uID0gbmV3IE9wZW5XU0RMQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICBib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgaWYgKCFpbnB1dHNWYWxpZCkgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgd3NkbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICA8L3NjcmlwdD4KLTwlCi0gIH0KLSAgZWxzZSB7Ci0gICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpIHsKLSAgICAgIHdzZGxOYXZpZ2F0b3JDb250ZW50LmxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9uYXZpZ2F0b3JfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICB3c2RsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iOwotICAgIH0KLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9SZWZyZXNoV1NETEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9SZWZyZXNoV1NETEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YzZkZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvUmVmcmVzaFdTRExBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuUmVmcmVzaFdTRExBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuQ2xlYXJXU0RMQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5XU0RMUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1SZWZyZXNoV1NETEFjdGlvbiBhY3Rpb24gPSBuZXcgUmVmcmVzaFdTRExBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIFRoZSBhY3Rpb24gbWF5IGJlIGV4ZWN1dGVkIHZpYSBwcm9ncmFtIGxpbmsuCi1ib29sZWFuIHBhcmFtc1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLWlmIChwYXJhbXNWYWxpZCkgewotICBpbnQgbm9kZUlEID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKWFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkuZ2V0KEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gIE5vZGUgd3NkbE5vZGUgPSBub2RlTWFuYWdlci5nZXROb2RlKG5vZGVJRCk7Ci0gIAotICAvLyBSdW4gdGhlIGFjdGlvbi4KLSAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotICAKLSAgaWYgKGFjdGlvblJlc3VsdCkgewotICAlPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpIHsKLSAgICAgIHdzZGxOYXZpZ2F0b3JDb250ZW50LmxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9uYXZpZ2F0b3JfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICB3c2RsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iOwotICAgIH0KLSAgPC9zY3JpcHQ+Ci0gIDwlCi0gIH0KLSAgZWxzZSB7Ci0gICU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGlmIChjb25maXJtKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUod3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9SRU1PVkVfV1NETF9OT0RFIiwgd3NkbE5vZGUuZ2V0Tm9kZU5hbWUoKSkpJT4iKSkKLSAgICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KENsZWFyV1NETEFjdGlvbi5nZXRBY3Rpb25MaW5rKG5vZGVJRCkpKSU+IjsKLSAgICBlbHNlIHsKLSAgICAgIHdzZGxQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICAgIHdzZGxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICB9Ci0gIDwvc2NyaXB0PgotICA8JQotICB9Ci19Ci0lPgotPC9oZWFkPgotPGJvZHk+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9SZXNpemVXU0RMRnJhbWVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1Jlc2l6ZVdTRExGcmFtZXNBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmU4ZGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1Jlc2l6ZVdTRExGcmFtZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gQ3JlYXRlIHRoZSBhY3Rpb24uCi0gICBSZXNpemVXU0RMRnJhbWVzQWN0aW9uIGFjdGlvbiA9IG5ldyBSZXNpemVXU0RMRnJhbWVzQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgCi0gICAvLyBQb3B1bGF0ZSB0aGUgYWN0aW9uIHdpdGggdGhlIHJlcXVlc3QgcHJvcGVydGllcy4KLSAgIGJvb2xlYW4gcmVzdWx0ID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RsZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIGlmIChyZXN1bHQpCi0gICB7Ci0gICAgIGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLSAgICAgCi0gICAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsgIAotICAgIHBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0LnNldEF0dHJpYnV0ZSgiY29scyIsIjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKSU+Iik7Ci0gICAgYWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0LnNldEF0dHJpYnV0ZSgicm93cyIsIjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCklPiIpOwotICB9Ci0gIGVsc2UKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcGVyc3BlY3RpdmVfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTwlCi0gICB9Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjE0NDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1NlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5TZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotU2VsZWN0V1NETE5hdmlnYXRvck5vZGVBY3Rpb24gYWN0aW9uID0gbmV3IFNlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLS8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0vLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLWJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvU2VsZWN0Tm9kZUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3NjQxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLlNlbGVjdFdTRExQcm9wZXJ0aWVzVG9vbEFjdGlvbiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotU2VsZWN0V1NETFByb3BlcnRpZXNUb29sQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RXU0RMUHJvcGVydGllc1Rvb2xBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9TZWxlY3ROb2RlVG9vbEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0RMQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDFjNzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N3aXRjaFBlcnNwZWN0aXZlRnJvbVdTRExBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbgotU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbiBhY3Rpb24gPSBuZXcgU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NETEFjdGlvbihjb250cm9sbGVyKTsKLSAgIAotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotICAgCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgIAotLy8gRGV0ZXJtaW5lIGlmIHRoZSBhY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSBoaXN0b3J5IGxpc3QuCi1ib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9zd2l0Y2hwZXJzcGVjdGl2ZS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Td2l0Y2hSZWFkT25seUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU3dpdGNoUmVhZE9ubHlGcmFnbWVudFZpZXdzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MDk3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Td2l0Y2hSZWFkT25seUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy5XU0RMRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZSIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLWlmICh3c2RsUGVyc3BlY3RpdmUuZ2V0U3RhdHVzQ29udGVudFR5cGUoKSA9PSBXU0RMUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX0ZPUk0pCi0gIHdzZGxQZXJzcGVjdGl2ZS5zZXRTdGF0dXNDb250ZW50VHlwZShXU0RMUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX1NPVVJDRSk7Ci1lbHNlCi0gIHdzZGxQZXJzcGVjdGl2ZS5zZXRTdGF0dXNDb250ZW50VHlwZShXU0RMUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX0ZPUk0pOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9yZXN1bHRfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9Td2l0Y2hXU0RMRGV0YWlsc1ZpZXdzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N3aXRjaFdTRExEZXRhaWxzVmlld3NBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODdkZjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N3aXRjaFdTRExEZXRhaWxzVmlld3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExGcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETERldGFpbHNUb29sIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSB3c2RsTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpOwotV1NETERldGFpbHNUb29sIHdzZGxEZXRhaWxzVG9vbCA9IChXU0RMRGV0YWlsc1Rvb2wpd3NkbE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLXdzZGxEZXRhaWxzVG9vbC50b2dnbGVWaWV3SWQoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgd3NkbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uQWJvcnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uQWJvcnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDA5MWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1N5bmNocm9uaXplRnJhZ21lbnRWaWV3c0FjdGlvbkFib3J0SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuV1NETEZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS5JbnZva2VXU0RMT3BlcmF0aW9uVG9vbCIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTwlCi1JbnZva2VXU0RMT3BlcmF0aW9uVG9vbCBpbnZva2VXU0RMT3BlcmF0aW9uVG9vbCA9IChJbnZva2VXU0RMT3BlcmF0aW9uVG9vbCljb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci1pZiAoaW52b2tlV1NETE9wZXJhdGlvblRvb2wuZ2V0RnJhZ21lbnRWaWV3SUQoKS5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfU09VUkNFX1RPX0ZPUk0pKQotICBpbnZva2VXU0RMT3BlcmF0aW9uVG9vbC5zZXRGcmFnbWVudFZpZXdJRChGcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX1NXSVRDSF9GT1JNX1RPX1NPVVJDRSk7Ci1lbHNlCi0gIGludm9rZVdTRExPcGVyYXRpb25Ub29sLnNldEZyYWdtZW50Vmlld0lEKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgd3NkbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci08L3NjcmlwdD4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1MjY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9TeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExGcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuRnJhZ21lbnRDb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbHBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPCUKLVN5bmNocm9uaXplRnJhZ21lbnRWaWV3c0FjdGlvbiBhY3Rpb24gPSBuZXcgU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uKGNvbnRyb2xsZXIpOwotYm9vbGVhbiBwYXJhbVZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLVN0cmluZyB2aWV3SUQgPSAoU3RyaW5nKWFjdGlvbi5nZXRQcm9wZXJ0eVRhYmxlKCkuZ2V0KEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfSUQpOwotYm9vbGVhbiBzb3VyY2VUb0Zvcm0gPSB2aWV3SUQuZXF1YWxzKEZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNKTsKLWlmIChzb3VyY2VUb0Zvcm0pIHsKLSAgaWYgKHBhcmFtVmFsaWQpIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBpZiAoIWNvbmZpcm0oIjwlPWNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1NZTkNfVklFV1MiKSU+IikpCi0gICAgICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL2FjdGlvbnMvU3luY2hyb25pemVGcmFnbWVudFZpZXdzQWN0aW9uQWJvcnRKU1AuanNwIikpJT4iOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBpZiAoIWNvbmZpcm0oIjwlPWNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX1NZTkNfVklFV1NfREVTUElURV9JTlZBTElEX1NPVVJDRV9DT05URU5UIiklPiIpKQotICAgICAgICBwZXJzcGVjdGl2ZVdvcmtBcmVhLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC9hY3Rpb25zL1N5bmNocm9uaXplRnJhZ21lbnRWaWV3c0FjdGlvbkFib3J0SlNQLmpzcCIpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLX0KLWFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHdzZGxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU4NmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1RvZ2dsZVdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1Ub2dnbGVXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbiBhY3Rpb24gPSBuZXcgVG9nZ2xlV1NETE5hdmlnYXRvck5vZGVBY3Rpb24oY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi1ib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9Ub2dnbGVOb2RlQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1VwZGF0ZVdTRExCaW5kaW5nQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1VwZGF0ZVdTRExCaW5kaW5nQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlNTI3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9VcGRhdGVXU0RMQmluZGluZ0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLldTRExGcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLkZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24iJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci08JQotICBVcGRhdGVXU0RMQmluZGluZ0FjdGlvbiBhY3Rpb24gPSBuZXcgVXBkYXRlV1NETEJpbmRpbmdBY3Rpb24oY29udHJvbGxlcik7Ci0gIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0gIGFjdGlvbi5leGVjdXRlKCk7Ci0lPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICB3c2RsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gIDwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1dTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNWFkYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLldTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbiIlPgotCi0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1XU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb24gYWN0aW9uID0gbmV3IFdTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB3c2RsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgd3NkbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMWYxNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETENoZWNrRmF2b3JpdGVFeGlzdHNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxib2R5PgotPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvYWN0aW9ucy9XU0RMQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPgotPCUKLUVudW1lcmF0aW9uIHBhcmFtTmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Ci13aGlsZSAocGFyYW1OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICBTdHJpbmcgcGFyYW1OYW1lID0gKFN0cmluZylwYXJhbU5hbWVzLm5leHRFbGVtZW50KCk7Ci0gIFN0cmluZ1tdIHBhcmFtVmFsdWVzID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMocGFyYW1OYW1lKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVZhbHVlcy5sZW5ndGg7IGkrKykgewotJT4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1wYXJhbU5hbWUlPiIgdmFsdWU9IjwlPXBhcmFtVmFsdWVzW2ldJT4iPgotPCUKLSAgfQotfQotJT4KLTwvZm9ybT4KLTwvYm9keT4KLTwvaHRtbD4KLQotPCUKLS8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLVdTRExBZGRUb0Zhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBuZXcgV1NETEFkZFRvRmF2b3JpdGVzQWN0aW9uKGNvbnRyb2xsZXIpOwotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotaWYgKGFjdGlvbi5mYXZvcml0ZUV4aXN0cygpKSB7Ci0lPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBpZiAoY29uZmlybSgiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX1FVRVNUSU9OX09WRVJXUklURV9GQVZPUklURVMiKSklPiIpKQotICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLWVsc2UgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvYWN0aW9ucy9XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZjAyZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1XU0RMSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbiBhY3Rpb24gPSBuZXcgV1NETEltcG9ydFdTRExUb0ZpbGVTeXN0ZW1BY3Rpb24oY29udHJvbGxlcik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMjM4MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy5XU0RMSW1wb3J0V1NETFRvV29ya2JlbmNoQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLVdTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IFdTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24oY29udHJvbGxlcik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2FjdGlvbnMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjg3NjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9hY3Rpb25zL1dTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLldTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi1XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbiBhY3Rpb24gPSBuZXcgV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb24oY29udHJvbGxlcik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvRnJhZ21lbnRzRm9ybVZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL0ZyYWdtZW50c0Zvcm1WaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyZDJlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvRnJhZ21lbnRzRm9ybVZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC54c2QuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci1ub2RlSUQuZGVsZXRlKDAsIG5vZGVJRC5sZW5ndGgoKSk7Ci1ub2RlSUQuYXBwZW5kKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSk7Ci1JbnZva2VXU0RMT3BlcmF0aW9uVG9vbCBpbnZva2VXU0RMT3BlcmF0aW9uVG9vbCA9IChJbnZva2VXU0RMT3BlcmF0aW9uVG9vbCkoc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSXRlcmF0b3IgaXQgPSBvcGVyRWxlbWVudC5nZXRPcmRlcmVkQm9keVBhcnRzKCkuaXRlcmF0b3IoKTsKLXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgUGFydCBwYXJ0ID0gKFBhcnQpaXQubmV4dCgpOwotICBJWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50KHBhcnQpOwotICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gIGZyYWdJRC5hcHBlbmQoZnJhZy5nZXRJRCgpKTsKLSAgJT4KLSAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWZyYWcuZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gIDwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL0ZyYWdtZW50c1NvYXBWaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9GcmFnbWVudHNTb2FwVmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTkwZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL0ZyYWdtZW50c1NvYXBWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudCkod3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCkuZ2V0VHJlZUVsZW1lbnQoKSk7Ci0gICBPcGVyYXRpb24gb3BlciA9IG9wZXJFbGVtZW50LmdldE9wZXJhdGlvbigpOwotICAgSXRlcmF0b3IgaXQgPSBvcGVyRWxlbWVudC5nZXRPcmRlcmVkQm9keVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgIFN0cmluZ0J1ZmZlciBzb3VyY2VDb250ZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgU3RyaW5nIGNhY2hlZFNvdXJjZUNvbnRlbnQgPSBvcGVyRWxlbWVudC5nZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX1NPVVJDRV9DT05URU5UKTsKLSAgIEhhc2h0YWJsZSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgIFNvYXBIZWxwZXIuYWRkRGVmYXVsdFNvYXBFbnZlbG9wZU5hbWVzcGFjZXMoc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUpOwotICAgaWYgKGNhY2hlZFNvdXJjZUNvbnRlbnQgIT0gbnVsbCkKLSAgIHsKLSAgICAgc291cmNlQ29udGVudC5hcHBlbmQoY2FjaGVkU291cmNlQ29udGVudCk7Ci0gICAgIFN0cmluZ1tdIG5zRGVjbGFyYXRpb25zID0gKFN0cmluZ1tdKW9wZXJFbGVtZW50LmdldFByb3BlcnR5QXNPYmplY3QoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfU09VUkNFX0NPTlRFTlRfTkFNRVNQQUNFKTsKLSAgICAgaWYgKG5zRGVjbGFyYXRpb25zICE9IG51bGwpCi0gICAgIHsKLSAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5zRGVjbGFyYXRpb25zLmxlbmd0aDsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIFN0cmluZ1tdIHByZWZpeF9ucyA9IFNvYXBIZWxwZXIuZGVjb2RlTmFtZXNwYWNlRGVjbGFyYXRpb24obnNEZWNsYXJhdGlvbnNbaV0pOwotICAgICAgICAgaWYgKCFzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5jb250YWlucyhwcmVmaXhfbnNbMV0pKQotICAgICAgICAgICBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5wdXQocHJlZml4X25zWzFdLCBwcmVmaXhfbnNbMF0pOwotICAgICAgIH0KLSAgICAgfQotICAgfQotICAgZWxzZQotICAgewotICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICB7Ci0gICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaXQubmV4dCgpOwotICAgICAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQocGFydCk7Ci0gICAgICAgRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gZnJhZy5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoIW9wZXJFbGVtZW50LmlzVXNlTGl0ZXJhbCgpLCBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSwgWE1MVXRpbHMuY3JlYXRlTmV3RG9jdW1lbnQobnVsbCkpOwotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspCi0gICAgICAgewotICAgICAgICAgc291cmNlQ29udGVudC5hcHBlbmQoWE1MVXRpbHMuc2VyaWFsaXplKGluc3RhbmNlRG9jdW1lbnRzW2ldLCB0cnVlKSk7Ci0gICAgICAgICBzb3VyY2VDb250ZW50LmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotICAgICAgIH0gICAgIAotICAgICB9Ci0gICB9Ci0KLSAgIEVudW1lcmF0aW9uIGVudW0gPSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5rZXlzKCk7Ci0gICB3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgIHsKLSAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpZW51bS5uZXh0RWxlbWVudCgpOwotICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZylzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5nZXQodXJpKTsKLSAgICAgU3RyaW5nIHZhbHVlID0gU29hcEhlbHBlci5lbmNvZGVOYW1lc3BhY2VEZWNsYXJhdGlvbihwcmVmaXgsIHVyaSk7Ci0gICAgICU+Ci0gICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUZyYWdtZW50Q29uc3RhbnRzLlNPVVJDRV9DT05URU5UX05BTUVTUEFDRSU+IiB2YWx1ZT0iPCU9dmFsdWUlPiI+Ci0gICAgIDwlCi0gICB9Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MzAgdmFsaWduPSJib3R0b20iIGNsYXNzPSJsYWJlbHMiPgotPCUKLSAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKTsKLSAgICBFbGVtZW50IHNvYXBFbnZlbG9wZUVsZW1lbnQgPSBTb2FwSGVscGVyLmNyZWF0ZVNvYXBFbnZlbG9wZUVsZW1lbnQoZG9jLHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlKTsKLSAgICBTdHJpbmdCdWZmZXIgaGVhZGVyID0gbmV3IFN0cmluZ0J1ZmZlcigiPCIpOwotICAgIGhlYWRlci5hcHBlbmQoc29hcEVudmVsb3BlRWxlbWVudC5nZXRUYWdOYW1lKCkpOwotICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gc29hcEVudmVsb3BlRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IG51bWJlck9mQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgaWYgKG51bWJlck9mQXR0cmlidXRlcyA9PSAwKQotICAgICAgaGVhZGVyLmFwcGVuZCgnPicpOwotJT4KLSAgICAgIDwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXMoaGVhZGVyLnRvU3RyaW5nKCkpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi0gICAgZm9yIChpbnQgaT0wO2k8bnVtYmVyT2ZBdHRyaWJ1dGVzO2krKykKLSAgICB7Ci0gICAgICBoZWFkZXIuc2V0TGVuZ3RoKDApOwotICAgICAgTm9kZSBhdHRyTm9kZSA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLSAgICAgIGhlYWRlci5hcHBlbmQoYXR0ck5vZGUuZ2V0Tm9kZU5hbWUoKSkuYXBwZW5kKCI9XCIiKS5hcHBlbmQoYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpLmFwcGVuZCgnXCInKTsKLSAgICAgIGlmIChpID09IG51bWJlck9mQXR0cmlidXRlcy0xKQotICAgICAgICBoZWFkZXIuYXBwZW5kKCc+Jyk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD04PgotICAgICAgPGltZyB3aWR0aD04IGhlaWdodD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzKGhlYWRlci50b1N0cmluZygpKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgIH0KLQotICAgIEVsZW1lbnQgc29hcEJvZHlFbGVtZW50ID0gU29hcEhlbHBlci5jcmVhdGVTb2FwQm9keUVsZW1lbnQoZG9jKTsKLSAgICBoZWFkZXIuc2V0TGVuZ3RoKDApOwotICAgIGhlYWRlci5hcHBlbmQoJzwnKS5hcHBlbmQoc29hcEJvZHlFbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0gICAgYXR0cmlidXRlcyA9IHNvYXBCb2R5RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgbnVtYmVyT2ZBdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICBpZiAobnVtYmVyT2ZBdHRyaWJ1dGVzID09IDApCi0gICAgICBoZWFkZXIuYXBwZW5kKCc+Jyk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD04PgotICAgICAgPGltZyB3aWR0aD04IGhlaWdodD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzKGhlYWRlci50b1N0cmluZygpKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgIGZvciAoaW50IGk9MDtpPG51bWJlck9mQXR0cmlidXRlcztpKyspCi0gICAgewotICAgICAgaGVhZGVyLnNldExlbmd0aCgwKTsKLSAgICAgIE5vZGUgYXR0ck5vZGUgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0gICAgICBoZWFkZXIuYXBwZW5kKGF0dHJOb2RlLmdldE5vZGVOYW1lKCkpLmFwcGVuZCgiPVwiIikuYXBwZW5kKGF0dHJOb2RlLmdldE5vZGVWYWx1ZSgpKS5hcHBlbmQoJ1wiJyk7Ci0gICAgICBpZiAoaSA9PSBudW1iZXJPZkF0dHJpYnV0ZXMtMSkKLSAgICAgICAgaGVhZGVyLmFwcGVuZCgnPicpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgd2lkdGg9MTY+Ci0gICAgICA8aW1nIHdpZHRoPTE2IGhlaWdodD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzKGhlYWRlci50b1N0cmluZygpKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGUKLTwlCi0gICAgfQotCi0gICAgRWxlbWVudCB3cmFwcGVyRWxlbWVudCA9IG51bGw7Ci0gICAgaWYgKCFvcGVyRWxlbWVudC5pc0RvY3VtZW50U3R5bGUoKSkKLSAgICB7Ci0gICAgICAvLyBNdXN0IGJlIFJQQyBzdHlsZS4KLSAgICAgIFN0cmluZyBlbmNvZGluZ05hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICAvKgotICAgICAgICogV1MtSTogSW4gYSBycGMtbGl0ZXJhbCBTT0FQIGJpbmRpbmcsIHRoZSBzZXJpYWxpemVkIGNoaWxkIGVsZW1lbnQgb2YgdGhlIAotICAgICAgICogc29hcDpCb2R5IGVsZW1lbnQgY29uc2lzdHMgb2YgYSB3cmFwcGVyIGVsZW1lbnQsIHdob3NlIG5hbWVzcGFjZSBpcyB0aGUgdmFsdWUgCi0gICAgICAgKiBvZiB0aGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBvZiB0aGUgc29hcGJpbmQ6Ym9keSBlbGVtZW50IGFuZCB3aG9zZSBsb2NhbCBuYW1lIGlzIAotICAgICAgICogZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gb3IgdGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiBzdWZmaXhlZCAKLSAgICAgICAqIHdpdGggIlJlc3BvbnNlIi4gVGhlIG5hbWVzcGFjZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQsIGFzIG9wcG9zZWQgdG8gYmVpbmcgCi0gICAgICAgKiBvcHRpb25hbCwgdG8gZW5zdXJlIHRoYXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBzb2FwOkJvZHkgZWxlbWVudCBhcmUgbmFtZXNwYWNlLQotICAgICAgICogcXVhbGlmaWVkLgotICAgICAgICovCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBvcGVyRWxlbWVudC5nZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdJbnB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBleHRFbGVtZW50cyA9IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGV4dEVsZW1lbnRzSXQgPSBleHRFbGVtZW50cy5pdGVyYXRvcigpOyBleHRFbGVtZW50c0l0Lmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtZW50c0l0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUEJvZHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gKChTT0FQQm9keSlleHRFbGVtZW50KS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBJZiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQgaXMgbm90IHNldCwgZ2V0IGl0IGZyb20gdGhlIG9wZXJhdGlvbiBlbGVtZW50Ci0gICAgICBpZiAoZW5jb2RpbmdOYW1lc3BhY2VVUkkgPT0gbnVsbCkKLSAgICAgICAgZW5jb2RpbmdOYW1lc3BhY2VVUkkgPSBvcGVyRWxlbWVudC5nZXRFbmNvZGluZ05hbWVzcGFjZSgpOwotICAgICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBvZiB0aGUgb3BlcmF0aW9uIGVsZW1lbnQgaXMgbm90IHNldCwgZ2V0IGl0IGZyb20gdGhlIGRlZmluaXRpb24gZWxlbWVudAotICAgICAgaWYgKGVuY29kaW5nTmFtZXNwYWNlVVJJID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IChXU0RMQmluZGluZ0VsZW1lbnQpb3BlckVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICBXU0RMU2VydmljZUVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSAoV1NETFNlcnZpY2VFbGVtZW50KWJpbmRpbmdFbGVtZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpc2VydmljZUVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudCgpOwotICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsRWxlbWVudC5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIGVuY29kaW5nTmFtZXNwYWNlVVJJID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgIH0KLSAgICAgIC8vIEdlbmVyYXRlIGFuIFJQQyBzdHlsZSB3cmFwcGVyIGVsZW1lbnQuCi0gICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZSA9IChvcGVyRWxlbWVudC5pc1VzZUxpdGVyYWwoKSA/IG51bGwgOiBvcGVyRWxlbWVudC5nZXRFbmNvZGluZ1N0eWxlKCkpOwotICAgICAgd3JhcHBlckVsZW1lbnQgPSBTb2FwSGVscGVyLmNyZWF0ZVJQQ1dyYXBwZXJFbGVtZW50KGRvYyxzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSxlbmNvZGluZ05hbWVzcGFjZVVSSSxvcGVyLmdldE5hbWUoKSxlbmNvZGluZ1N0eWxlKTsKLSAgICAgIGhlYWRlci5zZXRMZW5ndGgoMCk7Ci0gICAgICBoZWFkZXIuYXBwZW5kKCc8JykuYXBwZW5kKHdyYXBwZXJFbGVtZW50LmdldFRhZ05hbWUoKSk7Ci0gICAgICBhdHRyaWJ1dGVzID0gd3JhcHBlckVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgbnVtYmVyT2ZBdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgIGlmIChudW1iZXJPZkF0dHJpYnV0ZXMgPT0gMCkKLSAgICAgICAgaGVhZGVyLmFwcGVuZCgnPicpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgd2lkdGg9MTY+Ci0gICAgICA8aW1nIHdpZHRoPTE2IGhlaWdodD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzKGhlYWRlci50b1N0cmluZygpKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgICAgZm9yIChpbnQgaT0wO2k8bnVtYmVyT2ZBdHRyaWJ1dGVzO2krKykKLSAgICAgIHsKLSAgICAgICAgaGVhZGVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgTm9kZSBhdHRyTm9kZSA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKLSAgICAgICAgaGVhZGVyLmFwcGVuZChhdHRyTm9kZS5nZXROb2RlTmFtZSgpKS5hcHBlbmQoIj1cIiIpLmFwcGVuZChhdHRyTm9kZS5nZXROb2RlVmFsdWUoKSkuYXBwZW5kKCdcIicpOwotICAgICAgICBpZiAoaSA9PSBudW1iZXJPZkF0dHJpYnV0ZXMtMSkKLSAgICAgICAgICBoZWFkZXIuYXBwZW5kKCc+Jyk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0yND4KLSAgICAgIDxpbWcgd2lkdGg9MjQgaGVpZ2h0PTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXMoaGVhZGVyLnRvU3RyaW5nKCkpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi0gICAgICB9Ci0gICAgfQotCi0gICAgaW50IHNvdXJjZUNvbnRlbnRJbmRlbnRhdGlvbkltYWdlV2lkdGggPSAxNjsKLSAgICBpZiAod3JhcHBlckVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHNvdXJjZUNvbnRlbnRJbmRlbnRhdGlvbkltYWdlV2lkdGggKz0gODsKLSU+Ci08dGFibGUgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0zPgotICA8dHI+Ci0gICAgPHRkIHdpZHRoPTwlPXNvdXJjZUNvbnRlbnRJbmRlbnRhdGlvbkltYWdlV2lkdGglPj4KLSAgICAgIDxpbWcgd2lkdGg9PCU9c291cmNlQ29udGVudEluZGVudGF0aW9uSW1hZ2VXaWR0aCU+IGhlaWdodD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICA8L3RkPiAgICAKLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iPCU9V1NETEFjdGlvbklucHV0cy5TRUxFQ1RFRF9GSUxFJT4iIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NPQVBfRklMRSIpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0iY2VudGVyIiBhbGlnbj0ibGVmdCIgY2xhc3M9ImxhYmVscyIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzaG93TmV3RmlsZUNvbnRlbnRzKCkiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJCVVRUT05fTEFCRUxfTE9BRCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnNhdmVTb3VyY2VDb250ZW50KCkiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJCVVRUT05fTEFCRUxfU0FWRV9BUyIpJT48L2E+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0zPgotICA8dHI+Ci0gICAgPHRkIHdpZHRoPTwlPXNvdXJjZUNvbnRlbnRJbmRlbnRhdGlvbkltYWdlV2lkdGglPj4KLSAgICAgIDxpbWcgd2lkdGg9PCU9c291cmNlQ29udGVudEluZGVudGF0aW9uSW1hZ2VXaWR0aCU+IGhlaWdodD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dGV4dGFyZWEgaWQ9InNvYXBfYm9keV9jb250ZW50IiBuYW1lPSI8JT1GcmFnbWVudENvbnN0YW50cy5TT1VSQ0VfQ09OVEVOVCU+IiBjbGFzcz0iYmlndGV4dGFyZWFlbnRlciI+PCU9c291cmNlQ29udGVudC50b1N0cmluZygpJT48L3RleHRhcmVhPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgIGlmICh3cmFwcGVyRWxlbWVudCAhPSBudWxsKQotICAgewotICAgICBoZWFkZXIuc2V0TGVuZ3RoKDApOwotICAgICBoZWFkZXIuYXBwZW5kKCI8LyIpLmFwcGVuZCh3cmFwcGVyRWxlbWVudC5nZXRUYWdOYW1lKCkpLmFwcGVuZCgnPicpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgd2lkdGg9MTY+Ci0gICAgICA8aW1nIHdpZHRoPTE2IGhlaWdodD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzKGhlYWRlci50b1N0cmluZygpKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgfQotCi0gICBoZWFkZXIuc2V0TGVuZ3RoKDApOwotICAgaGVhZGVyLmFwcGVuZCgiPC8iKS5hcHBlbmQoc29hcEJvZHlFbGVtZW50LmdldFRhZ05hbWUoKSkuYXBwZW5kKCc+Jyk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTEgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD04PgotICAgICAgPGltZyB3aWR0aD04IGhlaWdodD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8JT1IVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzKGhlYWRlci50b1N0cmluZygpKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgaGVhZGVyLnNldExlbmd0aCgwKTsKLSAgIGhlYWRlci5hcHBlbmQoIjwvIikuYXBwZW5kKHNvYXBFbnZlbG9wZUVsZW1lbnQuZ2V0VGFnTmFtZSgpKS5hcHBlbmQoJz4nKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MSBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDwlPUhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXMoaGVhZGVyLnRvU3RyaW5nKCkpJT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9JbnZva2VXU0RMT3BlcmF0aW9uRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvSW52b2tlV1NETE9wZXJhdGlvbkZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Y3MjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9JbnZva2VXU0RMT3BlcmF0aW9uRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgSW52b2tlV1NETE9wZXJhdGlvblRvb2wgaW52b2tlV1NETE9wZXJhdGlvblRvb2wgPSAoSW52b2tlV1NETE9wZXJhdGlvblRvb2wpKHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKSk7Ci0gIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICBTdHJpbmcgZnJhZ21lbnRWaWV3SUQgPSBpbnZva2VXU0RMT3BlcmF0aW9uVG9vbC5nZXRGcmFnbWVudFZpZXdJRCgpOwotICBpbnQgb3BlcmF0aW9uVHlwZSA9IG9wZXJFbGVtZW50LmdldE9wZXJhdGlvblR5cGUoKTsKLSAgU3RyaW5nIGludm9rZVdTRExPcGVyYXRpb25VUkwgPSByZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoaW52b2tlV1NETE9wZXJhdGlvblRvb2wuZ2V0Rm9ybUFjdGlvbkxpbmsob3BlcmF0aW9uVHlwZSxmcmFnbWVudFZpZXdJRCkpKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9JTlZPS0VfV1NETF9PUEVSQVRJT04iKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy9mcmFnbWVudHRhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHNob3dOZXdGaWxlQ29udGVudHMoKQotICB7Ci0gICAgdmFyIGZvcm0gPSBkb2N1bWVudC5mb3Jtc1swXTsKLSAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgIHsKLSAgICAgIGZvcm0uPCU9V1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTiU+LnZhbHVlID0gIjwlPVdTRExBY3Rpb25JbnB1dHMuU1VCTUlTU0lPTl9BQ1RJT05fQlJPV1NFX0ZJTEUlPiI7Ci0gICAgICBmb3JtLnN1Ym1pdCgpOwotICAgICAgZm9ybS48JT1XU0RMQWN0aW9uSW5wdXRzLlNVQk1JU1NJT05fQUNUSU9OJT4udmFsdWUgPSAiPCU9aW52b2tlV1NETE9wZXJhdGlvblVSTCU+IjsKLSAgICAgIHJlc2V0U3VibWlzc2lvbigpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNhdmVTb3VyY2VDb250ZW50KCkKLSAgewotICAgIHZhciBmb3JtID0gZG9jdW1lbnQuZm9ybXNbMF07Ci0gICAgaWYgKGhhbmRsZVN1Ym1pdChmb3JtKSkKLSAgICB7Ci0gICAgICBmb3JtLjwlPVdTRExBY3Rpb25JbnB1dHMuU1VCTUlTU0lPTl9BQ1RJT04lPi52YWx1ZSA9ICI8JT1XU0RMQWN0aW9uSW5wdXRzLlNVQk1JU1NJT05fQUNUSU9OX1NBVkVfQVMlPiI7Ci0gICAgICBmb3JtLnN1Ym1pdCgpOwotICAgICAgZm9ybS48JT1XU0RMQWN0aW9uSW5wdXRzLlNVQk1JU1NJT05fQUNUSU9OJT4udmFsdWUgPSAiPCU9aW52b2tlV1NETE9wZXJhdGlvblVSTCU+IjsKLSAgICAgIHJlc2V0U3VibWlzc2lvbigpOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gY2xvc2VDaGlsZFdpbmRvd3MoKQotICB7Ci0gICAgY2xvc2VYU0RJbmZvRGlhbG9nKCk7Ci0gICAgY2xvc2VDYWxlbmRhckJyb3dzZXIoKTsKLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iIG9uVW5sb2FkPSJjbG9zZUNoaWxkV2luZG93cygpIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8Zm9ybSBhY3Rpb249IjwlPWludm9rZVdTRExPcGVyYXRpb25VUkwlPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI+Ci0gICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9V1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTiU+IiB2YWx1ZT0iPCU9V1NETEFjdGlvbklucHV0cy5TVUJNSVNTSU9OX0FDVElPTl9GT1JNJT4iPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzZGwvaW1hZ2VzL2ludm9rZV93c2RsX29wZXJhdGlvbl9oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfSU5WT0tFX1dTRExfT1BFUkFUSU9OIik7Ci0gICAgaWYgKG9wZXJhdGlvblR5cGUgPT0gV1NETE9wZXJhdGlvbkVsZW1lbnQuT1BFUkFUSU9OX1RZUEVfU09BUCkKLSAgICB7Ci0gICAgJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8aW1nIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHRpdGxlSW1hZ2VQYXRoKSklPiIgYWx0PSIiPgotICAgICAgPHN0cm9uZz48JT10aXRsZSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgd2lkdGg9IioiPiZuYnNwOzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJyaWdodCIgY2xhc3M9ImxhYmVscyI+Ci08JQotICAgaWYgKGZyYWdtZW50Vmlld0lELmVxdWFscyhGcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX1NXSVRDSF9GT1JNX1RPX1NPVVJDRSkpCi0gICB7Ci0lPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzeW5jaHJvbml6ZUZyYWdtZW50Vmlld3MoJzwlPUZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX1NPVVJDRV9UT19GT1JNJT4nKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1dJVENIX1RPX0ZPUk1fVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRk9STSIpJT48L2E+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6c3luY2hyb25pemVGcmFnbWVudFZpZXdzKCc8JT1GcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX1NXSVRDSF9GT1JNX1RPX1NPVVJDRSU+JykiIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NXSVRDSF9UT19TT1VSQ0VfVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfU09VUkNFIiklPjwvYT4KLTwlCi0gICB9Ci0lPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIGNvbHNwYW49Mz48aW1nIGhlaWdodD0yIHdpZHRoPSIxMDAlIiBhbGlnbj0idG9wIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotICAgIDwlCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIH0KLSAgICAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lOVk9LRV9XU0RMX09QRVJBVElPTl9ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9ImtleWxpbmVmaWVsZHNldCI+Ci0gICAgICAgICAgICA8bGVnZW5kIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICA8bGFiZWwgZm9yPSI8JT1XU0RMQWN0aW9uSW5wdXRzLkVORF9QT0lOVCU+Ij48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9FTkRfUE9JTlRTIiklPjwvbGFiZWw+Ci0gICAgICAgICAgICA8L2xlZ2VuZD4KLSAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0xMCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkPgotICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0iPCU9V1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQlPiIgbmFtZT0iPCU9V1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQlPiIgY2xhc3M9InNlbGVjdGxpc3QiPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICBXU0RMQmluZGluZ0VsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSAoV1NETEJpbmRpbmdFbGVtZW50KW9wZXJFbGVtZW50LmdldFBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZW5kUG9pbnRzID0gYmluZGluZ0VsZW1lbnQuZ2V0RW5kUG9pbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyRW5kUG9pbnQgPSBpbnZva2VXU0RMT3BlcmF0aW9uVG9vbC5nZXRFbmRQb2ludCgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZFBvaW50cy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPWVuZFBvaW50c1tpXSU+IiA8JWlmIChlbmRQb2ludHNbaV0uZXF1YWxzKGN1cnJFbmRQb2ludCkpIHslPnNlbGVjdGVkPCV9JT4+PCU9ZW5kUG9pbnRzW2ldJT4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgPC9maWVsZHNldD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8JQotICAgIGlmIChmcmFnbWVudFZpZXdJRC5lcXVhbHMoRnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfRk9STV9UT19TT1VSQ0UpKQotICAgIHsKLSAgICAlPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL2Zvcm1zL0ZyYWdtZW50c1NvYXBWaWV3LmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8JQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvRnJhZ21lbnRzRm9ybVZpZXcuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDwlCi0gICAgfQotICAgICU+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9zaW1wbGVDb21tb25fdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8L2Zvcm0+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9PcGVuV1NETEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL09wZW5XU0RMRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Y2Q4NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL09wZW5XU0RMRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkZvcm1Ub29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuV1NETFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICBGb3JtVG9vbCBmb3JtVG9vbCA9IChGb3JtVG9vbCl3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX09QRU5fV1NETCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXV0aWxzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy93c2RsYnJvd3Nlci5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iIG9uVW5sb2FkPSJjbG9zZVdTRExCcm93c2VyKCkiPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL2FjdGlvbnMvT3BlbldTRExBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG9uU3VibWl0PSJyZXR1cm4gaGFuZGxlU3VibWl0KHRoaXMpIj4KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ3c2RsL2ltYWdlcy9vcGVuX3dzZGxfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX09QRU5fV1NETCIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgICA8dGFibGU+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICA8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9PUEVOX1dTRExfREVTQyIpJT4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4gICAgICAgIAotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIG5vd3JhcD4KLSAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfd3NkbF91cmwiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX1VSTCIpJT48L2xhYmVsPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICBpZiAoIWZvcm1Ub29sLmlzSW5wdXRWYWxpZChBY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV1NETF9VUkwpKSB7Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLSAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBTdHJpbmcgd3NkbFVybCA9IChTdHJpbmcpZm9ybVRvb2wuZ2V0UHJvcGVydHkoQWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMKTsKLSAgICAgICAgICAgICAgaWYgKHdzZGxVcmwgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB3c2RsVXJsID0gIiI7Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgbm93cmFwPgotICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5XU0RMQnJvd3NlcignY29udGVudGJvcmRlcicsPCU9QWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFJT4pIj48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTElOS19CUk9XU0UiKSU+PC9hPgotICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDx0ZCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIGNvbHNwYW49Mz4KLSAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJpbnB1dF93c2RsX3VybCIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dTRExfVVJMJT4iIHZhbHVlPSI8JT13c2RsVXJsJT4iIHNpemU9IjUwIiBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8L2Zvcm0+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBjbG9zZVdTRExCcm93c2VyKCk7Ci08L3NjcmlwdD4gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1Byb2Nlc3NXU0RMRnJhbWVzZXRzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvUHJvY2Vzc1dTRExGcmFtZXNldHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1MmY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvUHJvY2Vzc1dTRExGcmFtZXNldHNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGZvcm1BY3Rpb24udG9TdHJpbmcoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowIj4KLSAgPGlucHV0IG5hbWU9IjwlPUFjdGlvbklucHV0cy5GUkFNRV9OQU1FJT4iIHR5cGU9ImhpZGRlbiIgdmFsdWU9IjwlPWZvcm1GcmFtZU5hbWUlPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1XU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCU+IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1XU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+Ij4KLTwvZm9ybT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9SZWFkT25seUZyYWdtZW50c0Zvcm1WaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9SZWFkT25seUZyYWdtZW50c0Zvcm1WaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhOGM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvUmVhZE9ubHlGcmFnbWVudHNGb3JtVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwueHNkLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LmltcGwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LndzZGwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JSEKLXByaXZhdGUgRWxlbWVudCBzb2FwUmVzcG9uc2VfID0gbnVsbDsKLQotcHJpdmF0ZSBFbGVtZW50W10gcGFyc2VTT0FQUmVzcG9uc2UoU09BUE1lc3NhZ2VRdWV1ZSBzb2FwTWVzc2FnZVF1ZXVlLCBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCkKLXsKLSAgU3RyaW5nIG1lc3NhZ2VzID0gc29hcE1lc3NhZ2VRdWV1ZS5nZXRNZXNzYWdlc0Zyb21MaXN0KCk7Ci0gIHRyeQotICB7Ci0gICAgc29hcFJlc3BvbnNlXyA9IFhNTFV0aWxzLnN0cmluZ1RvRWxlbWVudChtZXNzYWdlcywgdHJ1ZSk7Ci0gICAgTm9kZUxpc3QgbmwgPSBzb2FwUmVzcG9uc2VfLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoRnJhZ21lbnRDb25zdGFudHMuVVJJX1NPQVBfRU5WLCBGcmFnbWVudENvbnN0YW50cy5RTkFNRV9MT0NBTF9OQU1FX0JPRFkpOwotICAgIGlmIChubC5nZXRMZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgRWxlbWVudCBzb2FwQm9keSA9IChFbGVtZW50KW5sLml0ZW0oMCk7Ci0gICAgICBOb2RlTGlzdCBzb2FwRmF1bHQgPSBzb2FwQm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKEZyYWdtZW50Q29uc3RhbnRzLlVSSV9TT0FQX0VOViwgRnJhZ21lbnRDb25zdGFudHMuUU5BTUVfTE9DQUxfTkFNRV9GQVVMVCk7Ci0gICAgICBpZiAoc29hcEZhdWx0LmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50WzBdOwotICAgICAgTm9kZUxpc3QgaW5zdGFuY2VMaXN0OwotICAgICAgaWYgKG9wZXJFbGVtZW50LmlzRG9jdW1lbnRTdHlsZSgpKQotICAgICAgICBpbnN0YW5jZUxpc3QgPSBzb2FwQm9keS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIE5vZGVMaXN0IHJwY1dyYXBwZXIgPSBzb2FwQm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCIqIiwgb3BlckVsZW1lbnQuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICogSEFDSyAtIFNvbWUgb2YgdGhlIHdlYiBzZXJ2aWNlcyBvdXQgb24gdGhlIGludGVybmV0IGRvIG5vdAotICAgICAgICAqIHNldCB0aGVpciBSUEMgd3JhcHBlciBwcm9wZXJseS4gIEl0IHNob3VsZCBiZSBzZXQgdG8gdGhlIG91dHB1dAotICAgICAgICAqIG1lc3NhZ2UgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgb3BlcmF0aW9uLiAgVGhlIGhhY2sgaXMgdG8KLSAgICAgICAgKiBhc3N1bWUgdGhlIGZpcnN0IGVsZW1lbnQgaW5zaWRlIHRoZSBib2R5IGVsZW1lbnQgaXMgdGhlCi0gICAgICAgICogUlBDIHdyYXBwZXIuCi0gICAgICAgICovCi0gICAgICAgIGlmIChycGNXcmFwcGVyLmdldExlbmd0aCgpIDw9IDApCi0gICAgICAgICAgcnBjV3JhcHBlciA9IHNvYXBCb2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIioiLCAiKiIpOwotCi0gICAgICAgIGlmIChycGNXcmFwcGVyLmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgICBpbnN0YW5jZUxpc3QgPSBycGNXcmFwcGVyLml0ZW0oMCkuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZml4U09BUFJlc3BvbnNlKGluc3RhbmNlTGlzdCwgb3BlckVsZW1lbnQpOwotICAgIH0KLSAgfQotICBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICB0LnByaW50U3RhY2tUcmFjZSgpOwotICB9Ci0gIHJldHVybiBudWxsOwotfQotCi0vKgotKiBIQUNLIC0gVGhlIHJvb3QgZWxlbWVudCB0YWcgbmFtZSBvZiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLSogaXMgYW1iaWd1b3VzLiAgSXQgbGFuZHMgb24gYSB2ZXJ5IGdyZXkgYXJlYSBiZXR3ZWVuIHRoZSBTT0FQCi0qIHNwZWMgYW5kIHRoZSBXU0RMIHNwZWMuICBUaGUgdHdvIHNwZWNzIGRvIG5vdCBleHBsaWNpdGx5IGRlZmluZQotKiB0aGF0IHRoZSByb290IGVsZW1lbnQgdGFnIG5hbWUgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUKLSogV1NETCBwYXJ0LiAgVGhlIGhhY2sgaXMgdG8gdHJlYXQgZWxlbWVudHMgd2l0aCBkaWZmZXJlbnQgdGFnIG5hbWVzCi0qIGFzIGluc3RhbmNlcyBvZiB0aGUgV1NETCBwYXJ0LgotKi8KLXByaXZhdGUgRWxlbWVudFtdIGZpeFNPQVBSZXNwb25zZShOb2RlTGlzdCBpbnN0YW5jZUxpc3QsIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50KQotewotICBWZWN0b3IgaW5zdGFuY2VWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VMaXN0LmdldExlbmd0aCgpOyBpKyspCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gaW5zdGFuY2VMaXN0Lml0ZW0oaSk7Ci0gICAgaWYgKG9iamVjdCAhPSBudWxsICYmIChvYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KSkKLSAgICAgIGluc3RhbmNlVmVjdG9yLmFkZChvYmplY3QpOwotICB9Ci0gIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG5ldyBFbGVtZW50W2luc3RhbmNlVmVjdG9yLnNpemUoKV07Ci0gIE9wZXJhdGlvbiBvcGVyID0gb3BlckVsZW1lbnQuZ2V0T3BlcmF0aW9uKCk7Ci0gIE1hcCBwYXJ0c01hcCA9IG9wZXIuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpLmdldFBhcnRzKCk7Ci0gIGlmIChwYXJ0c01hcC5zaXplKCkgPT0gMSkKLSAgewotICAgIEl0ZXJhdG9yIGl0ID0gcGFydHNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICBJWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50KChQYXJ0KWl0Lm5leHQoKSwgZmFsc2UpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VWZWN0b3Iuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpaW5zdGFuY2VWZWN0b3IuZ2V0KGkpOwotICAgICAgaWYgKCFlbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHMoZnJhZy5nZXROYW1lKCkpKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2MgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KGZyYWcuZ2V0TmFtZSgpKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNoaWxkcmVuLml0ZW0oaikgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkcmVuLml0ZW0oaikpOwotICAgICAgICAgICAgLy8gV2hlbiB5b3UgYXBwZW5kIGEgbm9kZSBmcm9tIG9uZSBlbGVtZW50IHRvIGFub3RoZXIsCi0gICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgZWxlbWVudCB3aWxsIGxvc2UgaXRzIHJlZmVyZW5jZSB0byB0aGlzIG5vZGUsCi0gICAgICAgICAgICAvLyB0aGVyZWZvcmUsIHRoZSBzaXplIG9mIHRoZSBub2RlIGxpc3Qgd2lsbCBkZWNyZWFzZSBieSAxLgotICAgICAgICAgICAgai0tOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBhdHRyID0gYXR0cmlidXRlcy5pdGVtKGopOwotICAgICAgICAgIGlmIChhdHRyICE9IG51bGwgJiYgKGF0dHIgaW5zdGFuY2VvZiBBdHRyKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKWF0dHI7Ci0gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBhdHRyaWJ1dGUuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbnN0YW5jZURvY3VtZW50c1tpXSA9IGVsZW1lbnQ7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgICBpbnN0YW5jZVZlY3Rvci5jb3B5SW50byhpbnN0YW5jZURvY3VtZW50cyk7Ci0gIHJldHVybiBpbnN0YW5jZURvY3VtZW50czsKLX0KLSU+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLXdzZGxQZXJzcGVjdGl2ZS5zZXRTdGF0dXNDb250ZW50VHlwZShXU0RMUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX0ZPUk0pOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRPcGVyYXRpb25Ob2RlKCk7Ci1ub2RlSUQuZGVsZXRlKDAsIG5vZGVJRC5sZW5ndGgoKSk7Ci1ub2RlSUQuYXBwZW5kKG9wZXJOb2RlLmdldE5vZGVJZCgpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1PcGVyYXRpb24gb3BlciA9IG9wZXJFbGVtZW50LmdldE9wZXJhdGlvbigpOwotaWYgKG9wZXIuZ2V0T3V0cHV0KCkgPT0gbnVsbCkKLXsKLSU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICA8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OT1RISU5HX1RPX0RJU1BMQVlfSU5fRk9STV9WSUVXIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUKLX0KLWVsc2UKLXsKLSAgYm9vbGVhbiBjYWNoZWQgPSAoKEJvb2xlYW4pb3BlckVsZW1lbnQuZ2V0UHJvcGVydHlBc09iamVjdChXU0RMQWN0aW9uSW5wdXRzLlNPQVBfUkVTUE9OU0VfQ0FDSEVEKSkuYm9vbGVhblZhbHVlKCk7Ci0gIEVsZW1lbnRbXSBpbnN0YW5jZURvY3VtZW50cyA9IG51bGw7Ci0gIGlmICghY2FjaGVkKQotICB7Ci0gICAgU09BUE1lc3NhZ2VRdWV1ZSBzb2FwTWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldFNPQVBSZXNwb25zZVF1ZXVlKCk7Ci0gICAgaW5zdGFuY2VEb2N1bWVudHMgPSBwYXJzZVNPQVBSZXNwb25zZShzb2FwTWVzc2FnZVF1ZXVlLCBvcGVyRWxlbWVudCk7Ci0gIH0KLSAgaWYgKCFjYWNoZWQgJiYgaW5zdGFuY2VEb2N1bWVudHMgPT0gbnVsbCkKLSAgewotICAlPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TT0FQX1JFU1BPTlNFX0ZBSUxFRF9WQUxJREFUSU9OX0lOX0ZPUk1fVklFVyIpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPCUKLSAgfQotICBlbHNlIGlmICghY2FjaGVkICYmIGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aCA8PSAwKQotICB7Ci0gICU+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05PVEhJTkdfVE9fRElTUExBWV9JTl9GT1JNX1ZJRVciKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwlCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgTWFwIHBhcnRzTWFwID0gb3Blci5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkuZ2V0UGFydHMoKTsKLSAgICBJdGVyYXRvciBpdCA9IHBhcnRzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgSGFzaHRhYmxlIHVyaVJlZmVyZW5jZXMgPSBudWxsOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSVhTREZyYWdtZW50IGZyYWdtZW50ID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnQoKFBhcnQpaXQubmV4dCgpLCBmYWxzZSk7Ci0gICAgICBpZiAoIWNhY2hlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFvcGVyRWxlbWVudC5pc1VzZUxpdGVyYWwoKSAmJiAoZnJhZ21lbnQgaW5zdGFuY2VvZiBJU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50KSkKLSAgICAgICAgewotICAgICAgICAgIGlmICh1cmlSZWZlcmVuY2VzID09IG51bGwpCi0gICAgICAgICAgICB1cmlSZWZlcmVuY2VzID0gU09BUEVuY29kaW5nV3JhcHBlckZyYWdtZW50LnBhcnNlVVJJUmVmZXJlbmNlcyhzb2FwUmVzcG9uc2VfLCB0cnVlKTsKLSAgICAgICAgICAoKElTT0FQRW5jb2RpbmdXcmFwcGVyRnJhZ21lbnQpZnJhZ21lbnQpLnNldFVSSVJlZmVyZW5jZXModXJpUmVmZXJlbmNlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJhZ21lbnQuc2V0UGFyYW1ldGVyVmFsdWVzRnJvbUluc3RhbmNlRG9jdW1lbnRzKGluc3RhbmNlRG9jdW1lbnRzKTsKLSAgICAgIH0KLSAgICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICAgIGZyYWdJRC5hcHBlbmQoZnJhZ21lbnQuZ2V0SUQoKSk7Ci0gICAgICAlPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWZyYWdtZW50LmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8JQotICAgIH0KLSAgICBvcGVyRWxlbWVudC5zZXRQcm9wZXJ0eUFzT2JqZWN0KFdTRExBY3Rpb25JbnB1dHMuU09BUF9SRVNQT05TRV9DQUNIRUQsIG5ldyBCb29sZWFuKHRydWUpKTsKLSAgfQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9SZWFkT25seUZyYWdtZW50c1NvYXBWaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9SZWFkT25seUZyYWdtZW50c1NvYXBWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjMzY4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvUmVhZE9ubHlGcmFnbWVudHNTb2FwVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExPcGVyYXRpb25FbGVtZW50IiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotd3NkbFBlcnNwZWN0aXZlLnNldFN0YXR1c0NvbnRlbnRUeXBlKFdTRExQZXJzcGVjdGl2ZS5TVEFUVVNfQ09OVEVOVF9SRVNVTFRfU09VUkNFKTsKLU5vZGUgb3Blck5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0T3BlcmF0aW9uTm9kZSgpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLVN0cmluZyBzb2FwUmVxdWVzdFRhYmxlQ29udGFpbmVySWQgPSAiU09BUFJlcXVlc3QiOwotU3RyaW5nQnVmZmVyIHNvYXBSZXF1ZXN0VHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci1zb2FwUmVxdWVzdFR3aXN0SW1hZ2VOYW1lLmFwcGVuZChzb2FwUmVxdWVzdFRhYmxlQ29udGFpbmVySWQpOwotU3RyaW5nIHNvYXBSZXNwb25zZVRhYmxlQ29udGFpbmVySWQgPSAiU09BUFJlc3BvbnNlIjsKLVN0cmluZ0J1ZmZlciBzb2FwUmVzcG9uc2VUd2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLXNvYXBSZXNwb25zZVR3aXN0SW1hZ2VOYW1lLmFwcGVuZChzb2FwUmVzcG9uc2VUYWJsZUNvbnRhaW5lcklkKTsKLSU+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgc2VjdGlvbklkcyA9IFsiPCU9c29hcFJlcXVlc3RUYWJsZUNvbnRhaW5lcklkJT4iLCI8JT1zb2FwUmVzcG9uc2VUYWJsZUNvbnRhaW5lcklkJT4iXTsKLSAgZnVuY3Rpb24gdG9nZ2xlU09BUEVudmVsb3BlKHNvYXBFbnZlbG9wZVR5cGUsdHdpc3RJbWFnZU5hbWUpCi0gIHsKLTwlCi0gICAgLy8gSWYgYm90aCBlbnZlbG9wZXMgYXJlIGV4cGFuZGVkLCBlYWNoIHNob3VsZCBoYXZlIDUwJSBoZWlnaHQuIE90aGVyd2lzZSwgdGhlIHJlbWFpbmluZyBkaXNwbGF5ZWQgZW52ZWxvcGUgc2hvdWxkIGJlIHJlc2V0IHRvIDEwMCUgaGVpZ2h0LgotJT4KLSAgICB2YXIgc29hcFNlY3Rpb25JZCA9IHNlY3Rpb25JZHNbc29hcEVudmVsb3BlVHlwZV07Ci0gICAgdmFyIHNvYXBTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc29hcFNlY3Rpb25JZCk7Ci0gICAgdmFyIHNvYXBTZWN0aW9uVGFibGUgPSBnZXRUYWJsZShzb2FwU2VjdGlvbklkKTsKLSAgICB2YXIgb3RoZXJTb2FwU2VjdGlvbklkID0gc2VjdGlvbklkc1sxLXNvYXBFbnZlbG9wZVR5cGVdOwotICAgIHZhciBvdGhlclNvYXBTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3RoZXJTb2FwU2VjdGlvbklkKTsKLSAgICB2YXIgb3RoZXJTb2FwU2VjdGlvblRhYmxlID0gZ2V0VGFibGUob3RoZXJTb2FwU2VjdGlvbklkKTsKLSAgICBpZiAoc29hcFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9PSAibm9uZSIpCi0gICAgewotICAgICAgaWYgKG90aGVyU29hcFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9PSAiIikKLSAgICAgIHsKLSAgICAgICAgc29hcFNlY3Rpb25UYWJsZS5oZWlnaHQgPSAiNTAlIjsKLSAgICAgICAgb3RoZXJTb2FwU2VjdGlvblRhYmxlLmhlaWdodCA9ICI1MCUiOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBzb2FwU2VjdGlvblRhYmxlLmhlaWdodCA9ICIxMDAlIjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvdGhlclNvYXBTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPT0gIiIpCi0gICAgICAgIG90aGVyU29hcFNlY3Rpb25UYWJsZS5oZWlnaHQgPSAiMTAwJSI7Ci0gICAgfQotICAgIHR3aXN0KHNvYXBTZWN0aW9uSWQsdHdpc3RJbWFnZU5hbWUpOwotICB9Ci08L3NjcmlwdD4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0b2dnbGVTT0FQRW52ZWxvcGUoPCU9V1NETEFjdGlvbklucHV0cy5TT0FQX0VOVkVMT1BFX1RZUEVfUkVRVUVTVCU+LCc8JT1zb2FwUmVxdWVzdFR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXNvYXBSZXF1ZXN0VHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxzdHJvbmc+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfU09BUF9SRVFVRVNUX0VOVkVMT1BFIiklPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxkaXYgaWQ9IjwlPXNvYXBSZXF1ZXN0VGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lIj4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGhlaWdodD0iNTAlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxwYWRkaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8aWZyYW1lIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHdzZGxQZXJzcGVjdGl2ZS5nZXRTT0FQRW52ZWxvcGVYTUxMaW5rKFdTRExBY3Rpb25JbnB1dHMuU09BUF9FTlZFTE9QRV9UWVBFX1JFUVVFU1QpKSklPiIgd2lkdGg9Ijk1JSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHR3aXN0KCI8JT1zb2FwUmVxdWVzdFRhYmxlQ29udGFpbmVySWQlPiIsIjwlPXNvYXBSZXF1ZXN0VHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+Iik7Ci08L3NjcmlwdD4KLQotPCUKLWlmIChvcGVyRWxlbWVudC5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKSAhPSBudWxsKQotewotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dG9nZ2xlU09BUEVudmVsb3BlKDwlPVdTRExBY3Rpb25JbnB1dHMuU09BUF9FTlZFTE9QRV9UWVBFX1JFU1BPTlNFJT4sJzwlPXNvYXBSZXNwb25zZVR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXNvYXBSZXNwb25zZVR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICA8c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NPQVBfUkVTUE9OU0VfRU5WRUxPUEUiKSU+PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPGRpdiBpZD0iPCU9c29hcFJlc3BvbnNlVGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lIj4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGhlaWdodD0iNTAlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxwYWRkaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8aWZyYW1lIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KHdzZGxQZXJzcGVjdGl2ZS5nZXRTT0FQRW52ZWxvcGVYTUxMaW5rKFdTRExBY3Rpb25JbnB1dHMuU09BUF9FTlZFTE9QRV9UWVBFX1JFU1BPTlNFKSkpJT4iIHdpZHRoPSI5NSUiIGhlaWdodD0iMTAwJSI+PC9pZnJhbWU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0d2lzdCgiPCU9c29hcFJlc3BvbnNlVGFibGVDb250YWluZXJJZCU+IiwiPCU9c29hcFJlc3BvbnNlVHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+Iik7Ci08L3NjcmlwdD4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExCaW5kaW5nRGV0YWlsc0Zvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExCaW5kaW5nRGV0YWlsc0Zvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWFiZGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9XU0RMQmluZGluZ0RldGFpbHNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gIE5vZGUgYmluZGluZ05vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXRTZWxlY3RlZE5vZGUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9XU0RMX0JJTkRJTkdfREVUQUlMUyIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgcm93Q2hlY2tib3hOYW1lID0gInJvd0NoZWNrYm94TmFtZSI7Ci08L3NjcmlwdD4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy90YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm1zdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm11dGlscy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC9hY3Rpb25zL1VwZGF0ZVdTRExCaW5kaW5nQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIGhhbmRsZVN1Ym1pdCh0aGlzKSI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzZGwvaW1hZ2VzL29wZW5fd3NkbF9oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0JJTkRJTkdfREVUQUlMUyIpOwotICAgV1NETEJpbmRpbmdFbGVtZW50IHdzZGxCaW5kaW5nRWxlbWVudCA9IChXU0RMQmluZGluZ0VsZW1lbnQpYmluZGluZ05vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIFZlY3RvciBvcGVyYXRpb25Ob2RlcyA9IGJpbmRpbmdOb2RlLmdldENoaWxkTm9kZXMoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPWJpbmRpbmdOb2RlLmdldE5vZGVJZCgpJT4iPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JJTkRJTkdfREVUQUlMU19ERVNDIix3c2RsUGVyc3BlY3RpdmUuZ2V0QmluZGluZ1R5cGVTdHJpbmcod3NkbEJpbmRpbmdFbGVtZW50LmdldEJpbmRpbmdUeXBlKCkpKSU+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08JQotICAgU3RyaW5nIGRvY3VtZW50YXRpb24gPSB3c2RsQmluZGluZ0VsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9ET0NVTUVOVEFUSU9OKTsKLSAgIGlmIChkb2N1bWVudGF0aW9uLmxlbmd0aCgpID4gMCkKLSAgIHsKLSU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj48JT1kb2N1bWVudGF0aW9uJT48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0xMD4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi0gICB9Ci0KLSAgIHNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiT3BlcmF0aW9ucyIpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0T3RoZXJQcm9wZXJ0aWVzKG9wZXJhdGlvbk5vZGVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvb3BlcmF0aW9uc190YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICAgaWYgKG9wZXJhdGlvbk5vZGVzLnNpemUoKSA+IDApCi0gICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHR3aXN0KCJPcGVyYXRpb25zIiwieE9wZXJhdGlvbnMiKTsKLTwvc2NyaXB0PgotPCUKLSAgIH0KLQotICAgc2VjdGlvbkhlYWRlckluZm8uY2xlYXIoKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldENvbnRhaW5lcklkKCJFbmRwb2ludHMiKTsKLSAgIHNlY3Rpb25IZWFkZXJJbmZvLnNldE90aGVyUHJvcGVydGllcyh3c2RsQmluZGluZ0VsZW1lbnQpOwotJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvZW5kcG9pbnRfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgaWYgKHdzZGxCaW5kaW5nRWxlbWVudC5nZXRFbmRQb2ludHMoKS5sZW5ndGggPiAwKQotICB7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHR3aXN0T3BlbigiRW5kcG9pbnRzIik7Ci08L3NjcmlwdD4KLTwlCi0gIH0KLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2Zvcm0+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9XU0RMRGV0YWlsc0Zvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExEZXRhaWxzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOWZmMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExEZXRhaWxzRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgTm9kZSB3c2RsTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpOwotICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSB3c2RsTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgV1NETERldGFpbHNUb29sIHdzZGxEZXRhaWxzVG9vbCA9IChXU0RMRGV0YWlsc1Rvb2wpY3VycmVudFRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTRExfREVUQUlMUyIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy90YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBzd2l0Y2hXU0RMRGV0YWlsc1ZpZXcoKSB7Ci0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvYWN0aW9ucy9Td2l0Y2hXU0RMRGV0YWlsc1ZpZXdzQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzZGwvaW1hZ2VzL29wZW5fd3NkbF9oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0RMX0RFVEFJTFMiKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCh0aXRsZUltYWdlUGF0aCkpJT4iIGFsdD0iIj4KLSAgICAgIDxzdHJvbmc+PCU9dGl0bGUlPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIqIj4mbmJzcDs8L3RkPgotICAgIDx0ZCBhbGlnbj0icmlnaHQiIGNsYXNzPSJsYWJlbHMiPgotPCUKLSAgIGlmICh3c2RsRGV0YWlsc1Rvb2wuZ2V0Vmlld0lkKCkgPT0gV1NETERldGFpbHNUb29sLlNPVVJDRV9WSUVXX0lEKQotICAgeyAgICAgCi0lPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzd2l0Y2hXU0RMRGV0YWlsc1ZpZXcoKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1dJVENIX1RPX0ZPUk1fVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRk9STSIpJT48L2E+Ci08JQotICAgfQotICAgZWxzZQotICAgewotJT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6c3dpdGNoV1NETERldGFpbHNWaWV3KCkiIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1NXSVRDSF9UT19TT1VSQ0VfVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfU09VUkNFIiklPjwvYT4KLTwlCi0gICB9Ci0lPiAgIAotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIGNvbHNwYW49Mz48aW1nIGhlaWdodD0yIHdpZHRoPSIxMDAlIiBhbGlnbj0idG9wIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgaWYgKHdzZGxEZXRhaWxzVG9vbC5nZXRWaWV3SWQoKSA9PSBXU0RMRGV0YWlsc1Rvb2wuRk9STV9WSUVXX0lEKQotICB7Ci0lPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9mb3Jtcy9XU0RMRGV0YWlsc0Zvcm1WaWV3LmpzcCIgZmx1c2g9InRydWUiLz4KLTwlCi0gIH0KLSAgZWxzZQotICB7Ci0lPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBoZWlnaHQ9IjEwMCUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHBhZGRpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxpZnJhbWUgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIi93c2RsL2Zvcm1zL1dTRExEZXRhaWxzU291cmNlVmlldy5qc3AiKSklPiIgd2lkdGg9Ijk1JSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwlCi0gIH0KLSU+Ci08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNGb3JtVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNGb3JtVmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MjVjNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExEZXRhaWxzRm9ybVZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJzZWN0aW9uSGVhZGVySW5mbyIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5TZWN0aW9uSGVhZGVySW5mbyIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0RMX0RFVEFJTFNfREVTQyIpJT48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi1Ob2RlIHdzZGxOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWROb2RlKCk7Ci1XU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCl3c2RsTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotU3RyaW5nIGRvY3VtZW50YXRpb24gPSB3c2RsRWxlbWVudC5nZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX0RPQ1VNRU5UQVRJT04pOwotaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCAmJiBkb2N1bWVudGF0aW9uLmxlbmd0aCgpID4gMCkKLXsKLSU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBjbGFzcz0ibGFiZWxzIj48JT1kb2N1bWVudGF0aW9uJT48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlCi19Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvdGg+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjwlPXdzZGxFbGVtZW50LmdldFdzZGxVcmwoKSU+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTEwPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUgICAKLXNlY3Rpb25IZWFkZXJJbmZvLmNsZWFyKCk7Ci1zZWN0aW9uSGVhZGVySW5mby5zZXRDb250YWluZXJJZCgiU2VydmljZXMiKTsKLVZlY3RvciBzZXJ2aWNlTm9kZXMgPSB3c2RsTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci1zZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoc2VydmljZU5vZGVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvc2VydmljZXNfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0xMD4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTwlICAgCi1WZWN0b3IgYmluZGluZ05vZGVzID0gbmV3IFZlY3RvcigpOwotZm9yIChpbnQgaT0wO2k8c2VydmljZU5vZGVzLnNpemUoKTtpKyspCi17Ci0gIE5vZGUgc2VydmljZU5vZGUgPSAoTm9kZSlzZXJ2aWNlTm9kZXMuZWxlbWVudEF0KGkpOwotICBWZWN0b3Igc2VydmljZUJpbmRpbmdOb2RlcyA9IHNlcnZpY2VOb2RlLmdldENoaWxkTm9kZXMoKTsKLSAgZm9yIChpbnQgaj0wO2o8c2VydmljZUJpbmRpbmdOb2Rlcy5zaXplKCk7aisrKQotICB7Ci0gICAgTm9kZSBzZXJ2aWNlQmluZGluZ05vZGUgPSAoTm9kZSlzZXJ2aWNlQmluZGluZ05vZGVzLmVsZW1lbnRBdChqKTsKLSAgICBiaW5kaW5nTm9kZXMuYWRkRWxlbWVudChzZXJ2aWNlQmluZGluZ05vZGUpOwotICB9Ci19Ci1zZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoIkJpbmRpbmdzIik7Ci1zZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoYmluZGluZ05vZGVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvYmluZGluZ3NfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci08JQotaWYgKHNlcnZpY2VOb2Rlcy5zaXplKCkgPiAwKQotewotJT4KLSAgdHdpc3QoIlNlcnZpY2VzIiwieFNlcnZpY2VzIik7Ci08JQotfQotaWYgKGJpbmRpbmdOb2Rlcy5zaXplKCkgPiAwKQotewotJT4KLSAgdHdpc3QoIkJpbmRpbmdzIiwieEJpbmRpbmdzIik7Ci08JQotfQotJT4KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExEZXRhaWxzU291cmNlVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNTb3VyY2VWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwYTRiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETERldGFpbHNTb3VyY2VWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQveG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC53c2RsNGouV1NETEZhY3RvcnlJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEuaW8uKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC54bWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLmZhY3RvcnkuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLVdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NkbEVsZW1lbnQuZ2V0RGVmaW5pdGlvbigpOwotV1NETEZhY3Rvcnkgd3NkbEZhY3RvcnkgPSBuZXcgV1NETEZhY3RvcnlJbXBsKCk7Ci1XU0RMV3JpdGVyIHdzZGxXcml0ZXIgPSB3c2RsRmFjdG9yeS5uZXdXU0RMV3JpdGVyKCk7Ci1TdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotdHJ5Ci17Ci0gIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIHN0cmluZ1dyaXRlcik7Ci0gICU+Ci0gIDwlPXN0cmluZ1dyaXRlci50b1N0cmluZygpJT4KLSAgPCUKLX0KLWNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKQotewotICAlPgotICA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KLSAgPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExJbXBvcnRXU0RMVG9Xb3JrYmVuY2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkOWQ1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLldTRExQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLldTRExFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1Qcm9wZXJ0aWVzIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICBTdHJpbmcgd3NkbFVybCA9ICgoV1NETEVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCkpLmdldFdzZGxVcmwoKTsKLSAgIGZvcm1Qcm9wZXJ0aWVzLnB1dCgiZm9ybUFjdGlvbkxpbmsiLCJ3c2RsL2FjdGlvbnMvV1NETEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AiKTsKLSAgIGZvcm1Qcm9wZXJ0aWVzLnB1dCgid3NkbFVSTCIsd3NkbFVybCk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvSW1wb3J0V1NETEFuZFdTSUxUb1dvcmtiZW5jaEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkzZDgwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETExhdW5jaFdlYlNlcnZpY2VXaXphcmRGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uTGluayIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi1mb3JtQWN0aW9uTGluay5hcHBlbmQoIndzZGwvYWN0aW9ucy9XU0RMTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbkpTUC5qc3AiKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETFNlcnZpY2VEZXRhaWxzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvV1NETFNlcnZpY2VEZXRhaWxzRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlY2UzOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL1dTRExTZXJ2aWNlRGV0YWlsc0Zvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgTm9kZSBzZXJ2aWNlTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTRExfU0VSVklDRV9ERVRBSUxTIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3RhYmxlcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08JQotICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzZGwvaW1hZ2VzL29wZW5fd3NkbF9oaWdobGlnaHRlZC5naWYiOwotICAgU3RyaW5nIHRpdGxlID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0RMX1NFUlZJQ0VfREVUQUlMUyIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NFUlZJQ0VfREVUQUlMU19ERVNDIiklPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgIFdTRExTZXJ2aWNlRWxlbWVudCB3c2RsU2VydmljZUVsZW1lbnQgPSAoV1NETFNlcnZpY2VFbGVtZW50KXNlcnZpY2VOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IHdzZGxTZXJ2aWNlRWxlbWVudC5nZXRQcm9wZXJ0eUFzU3RyaW5nKFdTRExNb2RlbENvbnN0YW50cy5QUk9QX0RPQ1VNRU5UQVRJT04pOwotICAgaWYgKGRvY3VtZW50YXRpb24ubGVuZ3RoKCkgPiAwKQotICAgewotJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGNsYXNzPSJsYWJlbHMiPjwlPWRvY3VtZW50YXRpb24lPjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTEwPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPCUKLSAgIH0KLSAgIFZlY3RvciBiaW5kaW5nTm9kZXMgPSBzZXJ2aWNlTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5jbGVhcigpOwotICAgc2VjdGlvbkhlYWRlckluZm8uc2V0Q29udGFpbmVySWQoIkJpbmRpbmdzIik7Ci0gICBzZWN0aW9uSGVhZGVySW5mby5zZXRPdGhlclByb3BlcnRpZXMoYmluZGluZ05vZGVzKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvYmluZGluZ3NfdGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9kaXY+Ci08JQotICAgaWYgKGJpbmRpbmdOb2Rlcy5zaXplKCkgPiAwKQotICAgewotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0d2lzdCgiQmluZGluZ3MiLCJ4QmluZGluZ3MiKTsKLTwvc2NyaXB0PgotPCUKLSAgIH0KLSU+Ci08L3NjcmlwdD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9iaW5kaW5nc190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvYmluZGluZ3NfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTBjYTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9iaW5kaW5nc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICBTdHJpbmcgdGFibGVDb250YWluZXJJZCA9IHNlY3Rpb25IZWFkZXJJbmZvLmdldENvbnRhaW5lcklkKCk7Ci0gICBTdHJpbmdCdWZmZXIgdHdpc3RJbWFnZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCJ4Iik7Ci0gICB0d2lzdEltYWdlTmFtZS5hcHBlbmQodGFibGVDb250YWluZXJJZCk7Ci0lPgotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+PGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJZCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPjwvdGQ+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj48c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JJTkRJTkdTIiklPjwvc3Ryb25nPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiB3aWR0aD0iMjAlIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiB3aWR0aD0iMjAlIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9CSU5ESU5HX1RZUEUiKSU+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RPQ1VNRU5UQVRJT04iKSU+PC90aD4KLSAgICA8L3RyPgotPCUKLSAgIFZlY3RvciBiaW5kaW5nTm9kZXMgPSAoVmVjdG9yKXNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpOwotICAgZm9yIChpbnQgaT0wO2k8YmluZGluZ05vZGVzLnNpemUoKTtpKyspCi0gICB7Ci0gICAgIE5vZGUgYmluZGluZ05vZGUgPSAoTm9kZSliaW5kaW5nTm9kZXMuZWxlbWVudEF0KGkpOwotICAgICBXU0RMQmluZGluZ0VsZW1lbnQgd3NkbEJpbmRpbmdFbGVtZW50ID0gKFdTRExCaW5kaW5nRWxlbWVudCliaW5kaW5nTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgICBCaW5kaW5nIGJpbmRpbmcgPSB3c2RsQmluZGluZ0VsZW1lbnQuZ2V0QmluZGluZygpOwotJT4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RXU0RMTmF2aWdhdG9yTm9kZUFjdGlvbi5nZXRBY3Rpb25MaW5rKGJpbmRpbmdOb2RlLmdldE5vZGVJZCgpLGZhbHNlKSkpJT4iPjwlPWJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSU+PC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldEJpbmRpbmdUeXBlU3RyaW5nKHdzZGxCaW5kaW5nRWxlbWVudC5nZXRCaW5kaW5nVHlwZSgpKSU+PC90ZD4KLTwlCi0gICAgIFdTRExTZXJ2aWNlRWxlbWVudCB3c2RsU2VydmljZUVsZW1lbnQgPSAoV1NETFNlcnZpY2VFbGVtZW50KXdzZGxCaW5kaW5nRWxlbWVudC5nZXRQYXJlbnRFbGVtZW50KCk7Ci0gICAgIFN0cmluZyBkb2N1bWVudGF0aW9uID0gd3NkbFNlcnZpY2VFbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfRE9DVU1FTlRBVElPTik7Ci0gICAgIGlmIChkb2N1bWVudGF0aW9uLmxlbmd0aCgpIDwgMSkKLSAgICAgICBkb2N1bWVudGF0aW9uID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJUQUJMRV9CTEFOS19QTEFDRUhPTERFUiIpOyAgICAgCi0lPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT1kb2N1bWVudGF0aW9uJT48L3RkPgotICAgIDwvdHI+Ci08JQotICAgfQotJT4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL2VuZHBvaW50X3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9lbmRwb2ludF90YWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWM2ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2Zvcm1zL2VuZHBvaW50X3RhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ic2VjdGlvbkhlYWRlckluZm8iIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuU2VjdGlvbkhlYWRlckluZm8iIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gYWRkRW5kcG9pbnQodGFibGVDb250YWluZXJJRCwgaWQsIG5hbWUsIHZhbHVlLCBpc1JlbW92YWJsZSkKLSAgewotICAgIHR3aXN0T3Blbih0YWJsZUNvbnRhaW5lcklEKTsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikuaXRlbSgwKTsKLSAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICB2YXIgY29sdW1uMCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgdmFyIGNvbHVtbjEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotCi0gICAgdmFyIHJvd0NoZWNrYm94ID0gY3JlYXRlUm93Q2hlY2tib3goKTsKLSAgICBpZiAoIWlzUmVtb3ZhYmxlKQotICAgIHsKLSAgICAgIHJvd0NoZWNrYm94LmRpc2FibGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgY29sdW1uMC5hcHBlbmRDaGlsZChyb3dDaGVja2JveCk7Ci0KLSAgICB2YXIgZW5kUG9pbnQ7Ci0gICAgaWYgKGlzUmVtb3ZhYmxlKQotICAgIHsKLSAgICAgIGVuZFBvaW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICAgIGVuZFBvaW50LnR5cGUgPSAidGV4dCI7Ci0gICAgICBlbmRQb2ludC5pZCA9IGlkOwotICAgICAgZW5kUG9pbnQubmFtZSA9IG5hbWU7Ci0gICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgZW5kUG9pbnQudmFsdWUgPSB2YWx1ZTsKLSAgICAgIGVuZFBvaW50LmNsYXNzTmFtZSA9ICJ0YWJsZXRleHRlbnRlciI7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVuZFBvaW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoZW5kUG9pbnQpOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGhhbmRsZUVuZHBvaW50Q2hlY2tBbGxDbGljayh0YWJsZUNvbnRhaW5lcklkLGNoZWNrQWxsQ2hlY2tib3gpCi0gIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93cztpPHRhYmxlLnJvd3MubGVuZ3RoO2krKykKLSAgICB7Ci0gICAgICB2YXIgcm93Q2hlY2tib3hDZWxsID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKS5pdGVtKDApOwotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gcm93Q2hlY2tib3hDZWxsLmNoaWxkTm9kZXNbMF07Ci0gICAgICBpZiAoIXJvd0NoZWNrYm94LmRpc2FibGVkKQotICAgICAgewotICAgICAgICByb3dDaGVja2JveC5jaGVja2VkID0gY2hlY2tBbGxDaGVja2JveC5jaGVja2VkOwotICAgICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgICBoaWdobGlnaHRSb3codGFibGUucm93c1tpXSwicm93Y29sb3IiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGhpZ2hsaWdodFJvdyh0YWJsZS5yb3dzW2ldLCJ0YWJsZWNlbGxzIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci08L3NjcmlwdD4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gc2VjdGlvbkhlYWRlckluZm8uZ2V0Q29udGFpbmVySWQoKTsKLSAgIFN0cmluZ0J1ZmZlciB0d2lzdEltYWdlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoIngiKTsKLSAgIHR3aXN0SW1hZ2VOYW1lLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKTsgICAKLSAgIFdTRExCaW5kaW5nRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IChXU0RMQmluZGluZ0VsZW1lbnQpc2VjdGlvbkhlYWRlckluZm8uZ2V0T3RoZXJQcm9wZXJ0aWVzKCk7Ci0gICBTdHJpbmdbXSBlbmRwb2ludHMgPSBiaW5kaW5nRWxlbWVudC5nZXRFbmRQb2ludHMoKTsKLSAgIFN0cmluZyBhZGRyZXNzTG9jYXRpb24gPSAoKFdTRExTZXJ2aWNlRWxlbWVudCliaW5kaW5nRWxlbWVudC5nZXRQYXJlbnRFbGVtZW50KCkpLmdldEFkZHJlc3NMb2NhdGlvbihiaW5kaW5nRWxlbWVudC5nZXRCaW5kaW5nKCkpOyAgIAotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUudG9TdHJpbmcoKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0Y2xvc2VkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgIDxzdHJvbmc+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRU5EX1BPSU5UUyIpJT48L3N0cm9uZz4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZEVuZHBvaW50KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9V1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQlPicsICc8JT1XU0RMQWN0aW9uSW5wdXRzLkVORF9QT0lOVCU+JywgJzwlPWFkZHJlc3NMb2NhdGlvbiU+JywgdHJ1ZSkiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JykiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUVuZHBvaW50Q2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJRCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0VORF9QT0lOVFMiKSU+PC90aD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLTwlCi0gIGJvb2xlYW4gaXNEZWZhdWx0QWRkZWQgPSBmYWxzZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRwb2ludHMubGVuZ3RoOyBpKyspCi0gIHsKLSAgICBpZiAoZW5kcG9pbnRzW2ldLmVxdWFscyhhZGRyZXNzTG9jYXRpb24pICYmICFpc0RlZmF1bHRBZGRlZCkKLSAgICB7Ci0lPgotICAgIGFkZEVuZHBvaW50KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9V1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQlPicsICIiLCAnPCU9ZW5kcG9pbnRzW2ldJT4nLCBmYWxzZSk7Ci0gICAgCi08JQotICAgICAgaXNEZWZhdWx0QWRkZWQgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotJT4KLSAgICBhZGRFbmRwb2ludCgnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPVdTRExBY3Rpb25JbnB1dHMuRU5EX1BPSU5UJT4nLCAnPCU9V1NETEFjdGlvbklucHV0cy5FTkRfUE9JTlQlPicsICc8JT1lbmRwb2ludHNbaV0lPicsIHRydWUpOwotPCUKLSAgICB9Ci0gIH0KLSU+Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9vcGVyYXRpb25zX3RhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9vcGVyYXRpb25zX3RhYmxlLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiMTllMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvb3BlcmF0aW9uc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOyAgIAotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+PHN0cm9uZz48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9PUEVSQVRJT05TIiklPjwvc3Ryb25nPjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9dGFibGVDb250YWluZXJJZCU+IiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiB3aWR0aD0iMjAlIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9ET0NVTUVOVEFUSU9OIiklPjwvdGg+Ci0gICAgPC90cj4KLTwlCi0gICBWZWN0b3Igb3BlcmF0aW9uTm9kZXMgPSAoVmVjdG9yKXNlY3Rpb25IZWFkZXJJbmZvLmdldE90aGVyUHJvcGVydGllcygpOwotICAgZm9yIChpbnQgaT0wO2k8b3BlcmF0aW9uTm9kZXMuc2l6ZSgpO2krKykKLSAgIHsKLSAgICAgTm9kZSBvcGVyYXRpb25Ob2RlID0gKE5vZGUpb3BlcmF0aW9uTm9kZXMuZWxlbWVudEF0KGkpOwotICAgICBXU0RMT3BlcmF0aW9uRWxlbWVudCB3c2RsT3BlcmF0aW9uRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClvcGVyYXRpb25Ob2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsob3BlcmF0aW9uTm9kZS5nZXROb2RlSWQoKSxmYWxzZSkpKSU+Ij48JT13c2RsT3BlcmF0aW9uRWxlbWVudC5nZXRPcGVyYXRpb24oKS5nZXROYW1lKCklPjwvYT48L3RkPgotPCUgICAgIAotICAgICBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IHdzZGxPcGVyYXRpb25FbGVtZW50LmdldFByb3BlcnR5QXNTdHJpbmcoV1NETE1vZGVsQ29uc3RhbnRzLlBST1BfRE9DVU1FTlRBVElPTik7Ci0gICAgIGlmIChkb2N1bWVudGF0aW9uLmxlbmd0aCgpIDwgMSkKLSAgICAgICBkb2N1bWVudGF0aW9uID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJUQUJMRV9CTEFOS19QTEFDRUhPTERFUiIpOwotJT4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PCU9ZG9jdW1lbnRhdGlvbiU+PC90ZD4KLSAgICA8L3RyPgotPCUgICAKLSAgIH0gICAKLSU+Ci0gIDwvdGFibGU+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9zZXJ2aWNlc190YWJsZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZm9ybXMvc2VydmljZXNfdGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGM5OTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mb3Jtcy9zZXJ2aWNlc190YWJsZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9InNlY3Rpb25IZWFkZXJJbmZvIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLlNlY3Rpb25IZWFkZXJJbmZvIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgU3RyaW5nIHRhYmxlQ29udGFpbmVySWQgPSBzZWN0aW9uSGVhZGVySW5mby5nZXRDb250YWluZXJJZCgpOwotICAgU3RyaW5nQnVmZmVyIHR3aXN0SW1hZ2VOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigieCIpOwotICAgdHdpc3RJbWFnZU5hbWUuYXBwZW5kKHRhYmxlQ29udGFpbmVySWQpOyAgIAotJT4KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPjxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySWQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lLnRvU3RyaW5nKCklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT48L3RkPgotICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+PHN0cm9uZz48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TRVJWSUNFUyIpJT48L3N0cm9uZz48L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxkaXYgaWQ9IjwlPXRhYmxlQ29udGFpbmVySWQlPiIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgd2lkdGg9IjIwJSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3RoPgotICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRE9DVU1FTlRBVElPTiIpJT48L3RoPgotICAgIDwvdHI+Ci08JQotICAgVmVjdG9yIHNlcnZpY2VOb2RlcyA9IChWZWN0b3Ipc2VjdGlvbkhlYWRlckluZm8uZ2V0T3RoZXJQcm9wZXJ0aWVzKCk7Ci0gICBmb3IgKGludCBpPTA7aTxzZXJ2aWNlTm9kZXMuc2l6ZSgpO2krKykKLSAgIHsKLSAgICAgTm9kZSBzZXJ2aWNlTm9kZSA9IChOb2RlKXNlcnZpY2VOb2Rlcy5lbGVtZW50QXQoaSk7Ci0gICAgIFdTRExTZXJ2aWNlRWxlbWVudCB3c2RsU2VydmljZUVsZW1lbnQgPSAoV1NETFNlcnZpY2VFbGVtZW50KXNlcnZpY2VOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdFdTRExOYXZpZ2F0b3JOb2RlQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VydmljZU5vZGUuZ2V0Tm9kZUlkKCksZmFsc2UpKSklPiI+PCU9d3NkbFNlcnZpY2VFbGVtZW50LmdldFNlcnZpY2UoKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpJT48L2E+PC90ZD4KLTwlICAgICAKLSAgICAgU3RyaW5nIGRvY3VtZW50YXRpb24gPSB3c2RsU2VydmljZUVsZW1lbnQuZ2V0UHJvcGVydHlBc1N0cmluZyhXU0RMTW9kZWxDb25zdGFudHMuUFJPUF9ET0NVTUVOVEFUSU9OKTsKLSAgICAgaWYgKGRvY3VtZW50YXRpb24ubGVuZ3RoKCkgPCAxKQotICAgICAgIGRvY3VtZW50YXRpb24gPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIlRBQkxFX0JMQU5LX1BMQUNFSE9MREVSIik7Ci0lPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT1kb2N1bWVudGF0aW9uJT48L3RkPgotICAgIDwvdHI+Ci08JSAgIAotICAgfSAgIAotJT4KLSAgPC90YWJsZT4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheUZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvU09BUEVuY0FycmF5Rml4V0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4MDJiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvU09BUEVuY0FycmF5Rml4V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JU09BUEVuY0FycmF5RnJhZ21lbnQgZnJhZyA9IChJU09BUEVuY0FycmF5RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBTZXFGaXhXRnJhZ21lbnRKU1AuanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheVJGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvU09BUEVuY0FycmF5UkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4NDE0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvU09BUEVuY0FycmF5UkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlTT0FQRW5jQXJyYXlGcmFnbWVudCBmcmFnID0gKElTT0FQRW5jQXJyYXlGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySURCYXNlID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lQmFzZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEQmFzZSkudG9TdHJpbmcoKTsKLVN0cmluZ1tdIGdyb3VwSURzID0gZnJhZy5nZXRHcm91cElEcygpOwotZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cElEcy5sZW5ndGg7IGkrKykgewotJT4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1pICsgdGFibGVDb250YWluZXJJREJhc2UlPicsJzwlPWkgKyB0d2lzdEltYWdlTmFtZUJhc2UlPicpIj48aW1nIG5hbWU9IjwlPWkgKyB0d2lzdEltYWdlTmFtZUJhc2UlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgICA8JT1mcmFnLmdldE5hbWUoKSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxzcGFuIGlkPSI8JT1pICsgdGFibGVDb250YWluZXJJREJhc2UlPiI+Ci0gIDx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLTwlCi0gICAgSVhTREZyYWdtZW50W10gY2hpbGRGcmFnbWVudHMgPSBmcmFnLmdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGdyb3VwSURzW2ldKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkRnJhZ21lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ21lbnRzW2pdLmdldElEKCkpOwotJT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHdpZHRoPTE2PgotICAgICAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9Y2hpbGRGcmFnbWVudHNbal0uZ2V0UmVhZEZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci08JQotICAgIH0KLSU+Ci0gIDwvdGFibGU+Ci0gIDwvc3Bhbj4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheVJhbmdlV0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9TT0FQRW5jQXJyYXlSYW5nZVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMmE2OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1NPQVBFbmNBcnJheVJhbmdlV0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNER3JvdXBTZXFGcmFnbWVudCBmcmFnID0gKElYU0RHcm91cFNlcUZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKS50b1N0cmluZygpOwotU3RyaW5nIG5hbWVBbmNob3JJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLk5BTUVfQU5DSE9SX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLSU+Ci08YSBuYW1lPSI8JT1uYW1lQW5jaG9ySUQlPiIvPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZUluc3RhbmNlKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPiwgJzwlPWZyYWdJRCU+JywgJzwlPW5hbWVBbmNob3JJRCU+JykiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNoZWNrTWluT2NjdXJzQW5kUmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWluT2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJRCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9TT0FQX0VOQ19BUlJBWVMiKSU+PC90aD4KLSAgPC90cj4KLSAgPCUKLSAgU3RyaW5nW10gZ3JvdXBJRHMgPSBmcmFnLmdldEdyb3VwSURzKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJRHMubGVuZ3RoIHx8IGkgPCB4c2RDb25maWcuZ2V0TWluT2NjdXJzKCk7IGkrKykgewotICAgIFN0cmluZyBncm91cElEOwotICAgIGlmIChpIDwgZ3JvdXBJRHMubGVuZ3RoKQotICAgICAgZ3JvdXBJRCA9IGdyb3VwSURzW2ldOwotICAgIGVsc2UKLSAgICAgIGdyb3VwSUQgPSBmcmFnLmNyZWF0ZUdyb3VwU2VxSW5zdGFuY2UoKTsKLSAgICBJWFNERnJhZ21lbnRbXSBncm91cE1lbWJlckZyYWdtZW50cyA9IGZyYWcuZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRCk7Ci0gICU+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPgotICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVSb3dDaGVja2JveENsaWNrKCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9Z3JvdXBJRCU+Ij4KLSAgICAgIDwlCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZ3JvdXBNZW1iZXJGcmFnbWVudHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICAgICAgZnJhZ0lELmFwcGVuZChncm91cE1lbWJlckZyYWdtZW50c1tqXS5nZXRJRCgpKTsKLSAgICAgICU+Ci0gICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9Z3JvdXBNZW1iZXJGcmFnbWVudHNbal0uZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8JQotICAgICAgICB9Ci0gICAgICAlPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+Ci08L3NwYW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleEZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleEZpeFdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Nzc3NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhGaXhXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RDb21wbGV4RnJhZ21lbnQgZnJhZyA9IChJWFNEQ29tcGxleEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKS50b1N0cmluZygpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUlPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDwlCi0gIElYU0RGcmFnbWVudFtdIGNoaWxkRnJhZ3MgPSBmcmFnLmdldEFsbEZyYWdtZW50cygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsgaSsrKSB7Ci0gICAgSVhTREZyYWdtZW50IGNoaWxkRnJhZzsKLSAgICBTdHJpbmcgY2hpbGRGcmFnSUQ7Ci0gICAgaWYgKGkgPCBjaGlsZEZyYWdzLmxlbmd0aCkgewotICAgICAgY2hpbGRGcmFnID0gY2hpbGRGcmFnc1tpXTsKLSAgICAgIGNoaWxkRnJhZ0lEID0gY2hpbGRGcmFnLmdldElEKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY2hpbGRGcmFnSUQgPSBmcmFnLmNyZWF0ZUNvbXBsZXhJbnN0YW5jZSgpOwotICAgICAgY2hpbGRGcmFnID0gZnJhZy5nZXRGcmFnbWVudChjaGlsZEZyYWdJRCk7Ci0gICAgfQotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ0lEKTsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgIDxpbWcgd2lkdGg9MTYgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zcGFjZS5naWYiKSklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWNoaWxkRnJhZ0lEJT4iPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNoaWxkRnJhZy5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotICA8JQotICB9Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzI4MDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RDb21wbGV4UkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RDb21wbGV4RnJhZ21lbnQgZnJhZyA9IChJWFNEQ29tcGxleEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJREJhc2UgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWVCYXNlID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySURCYXNlKS50b1N0cmluZygpOwotSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGZyYWcuZ2V0QWxsRnJhZ21lbnRzKCk7Ci1mb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRnJhZ3MubGVuZ3RoOyBpKyspIHsKLSAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ3NbaV0uZ2V0SUQoKSk7Ci0lPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+JywnPCU9aSArIHR3aXN0SW1hZ2VOYW1lQmFzZSU+JykiPjxpbWcgbmFtZT0iPCU9aSArIHR3aXN0SW1hZ2VOYW1lQmFzZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgIDwlPWZyYWcuZ2V0TmFtZSgpJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPHNwYW4gaWQ9IjwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+Ij4KLSAgPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICAgIDx0cj4KLSAgICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgICAgPGltZyB3aWR0aD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaGlsZEZyYWdzW2ldLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDwvc3Bhbj4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRENvbXBsZXhSYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFJhbmdlV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmNWMxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEQ29tcGxleFJhbmdlV0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNEQ29tcGxleEZyYWdtZW50IGZyYWcgPSAoSVhTRENvbXBsZXhGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJRCkudG9TdHJpbmcoKTsKLVN0cmluZyBuYW1lQW5jaG9ySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5OQU1FX0FOQ0hPUl9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0lPgotPGEgbmFtZT0iPCU9bmFtZUFuY2hvcklEJT4iLz4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUlPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVJbnN0YW5jZSgnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4sICc8JT1mcmFnSUQlPicsICc8JT1uYW1lQW5jaG9ySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1pbk9jY3VycygpJT4pIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJyYW5nZWZyYWd0YWJsZSIgOiAiaW5uZXJyYW5nZWZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySUQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ09OVEVOVCIpJT48L3RoPgotICA8L3RyPgotICA8JQotICBJWFNERnJhZ21lbnRbXSBjaGlsZEZyYWdzID0gZnJhZy5nZXRBbGxGcmFnbWVudHMoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEZyYWdzLmxlbmd0aCB8fCBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSAgICBJWFNERnJhZ21lbnQgY2hpbGRGcmFnOwotICAgIFN0cmluZyBjaGlsZEZyYWdJRDsKLSAgICBpZiAoaSA8IGNoaWxkRnJhZ3MubGVuZ3RoKSB7Ci0gICAgICBjaGlsZEZyYWcgPSBjaGlsZEZyYWdzW2ldOwotICAgICAgY2hpbGRGcmFnSUQgPSBjaGlsZEZyYWcuZ2V0SUQoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjaGlsZEZyYWdJRCA9IGZyYWcuY3JlYXRlQ29tcGxleEluc3RhbmNlKCk7Ci0gICAgICBjaGlsZEZyYWcgPSBmcmFnLmdldEZyYWdtZW50KGNoaWxkRnJhZ0lEKTsKLSAgICB9Ci0gICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgIGZyYWdJRC5hcHBlbmQoY2hpbGRGcmFnSUQpOwotICAlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD4KLSAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlUm93Q2hlY2tib3hDbGljaygpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWNoaWxkRnJhZ0lEJT4iPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNoaWxkRnJhZy5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICA8L3RkPgotICA8L3RyPgotICA8JQotICB9Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRJbmZvRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYThhZDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnhzZC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlTGlzdCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJzZXNzaW9uSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JSEKLXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOU19MQU5HID0gInhtbDpsYW5nIjsKLXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1hNTE5TX0xBTkcgPSAiZW4tVVMiOwotJT4KLQotPCUKLUh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSUQudG9TdHJpbmcoKSk7Ci1Db250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEQ29tcG9uZW50IHhzZENvbXBvbmVudCA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKTsKLVhTREFubm90YXRpb24gYW5ub3RhdGlvbiA9IG51bGw7Ci1FTGlzdCBhcHBJbmZvTGlzdCA9IG51bGw7Ci1FTGlzdCBkb2NMaXN0ID0gbnVsbDsKLWlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RUeXBlRGVmaW5pdGlvbikKLSAgYW5ub3RhdGlvbiA9ICgoWFNEVHlwZURlZmluaXRpb24peHNkQ29tcG9uZW50KS5nZXRBbm5vdGF0aW9uKCk7Ci1lbHNlIGlmICh4c2RDb21wb25lbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gIGFubm90YXRpb24gPSAoKFhTREVsZW1lbnREZWNsYXJhdGlvbil4c2RDb21wb25lbnQpLmdldEFubm90YXRpb24oKTsKLWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgYXBwSW5mb0xpc3QgPSBhbm5vdGF0aW9uLmdldEFwcGxpY2F0aW9uSW5mb3JtYXRpb24oKTsKLSAgZG9jTGlzdCA9IGFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCk7Ci19Ci1TdHJpbmcgYXBwSW5mb0NvbnRhaW5lcklEID0gIjo6YXBwSW5mbyI7Ci1TdHJpbmcgeGFwcEluZm9Db250YWluZXJJRCA9ICJ4OjphcHBJbmZvIjsKLVN0cmluZyBkb2N1bWVudGF0aW9uQ29udGFpbmVySUQgPSAiOjpkb2N1bWVudGF0aW9uIjsKLVN0cmluZyB4ZG9jdW1lbnRhdGlvbkNvbnRhaW5lcklEID0gIng6OmRvY3VtZW50YXRpb24iOwotJT4KLQotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIHR3aXN0KHRhYmxlQ29udGFpbmVySWQsdHdpc3RJbWFnZU5hbWUpCi0gIHsKLSAgICB2YXIgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUNvbnRhaW5lcklkKTsKLSAgICB2YXIgdHdpc3RJbWFnZSA9IGRvY3VtZW50LmltYWdlc1t0d2lzdEltYWdlTmFtZV07Ci0gICAgaWYgKHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKQotICAgIHsKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICAgIHR3aXN0SW1hZ2Uuc3JjID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IjsKLSAgICAgIHR3aXN0SW1hZ2UuYWx0ID0gIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSklPiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgICAgdHdpc3RJbWFnZS5zcmMgPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iOwotICAgICAgdHdpc3RJbWFnZS5hbHQgPSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX0NMT1NFRCIpKSU+IjsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiB0d2lzdENsb3NlKHRhYmxlQ29udGFpbmVySWQpCi0gIHsKLSAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJZCkuc3R5bGUuZGlzcGxheSA9PSAiIikKLSAgICAgIHR3aXN0KHRhYmxlQ29udGFpbmVySWQsIngiK3RhYmxlQ29udGFpbmVySWQpOwotICB9Ci08L3NjcmlwdD4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1hcHBJbmZvQ29udGFpbmVySUQlPicsJzwlPXhhcHBJbmZvQ29udGFpbmVySUQlPicpIj48aW1nIG5hbWU9IjwlPXhhcHBJbmZvQ29udGFpbmVySUQlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgIDxzdHJvbmc+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfWFNEX0FQUExJQ0FUSU9OX0lORk9STUFUSU9OIiklPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPWFwcEluZm9Db250YWluZXJJRCU+Ij4KLTx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xBTkdVQUdFIiklPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgd2lkdGg9IjEwMCUiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1hTRF9BUFBMSUNBVElPTl9JTkZPUk1BVElPTiIpJT48L3RoPgotICA8L3RyPgotICA8JQotICBib29sZWFuIG9wZW5BcHBJbmZvVGFibGUgPSBmYWxzZTsKLSAgaWYgKGFwcEluZm9MaXN0ICE9IG51bGwpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcEluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICBFbGVtZW50IGUgPSAoRWxlbWVudClhcHBJbmZvTGlzdC5nZXQoaSk7Ci0gICAgICBTdHJpbmcgYXBwSW5mb0xhbmcgPSBlLmdldEF0dHJpYnV0ZShYTUxOU19MQU5HKTsKLSAgICAgIFN0cmluZyBhcHBJbmZvVGV4dCA9IG51bGw7Ci0gICAgICBOb2RlTGlzdCBubCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBubC5nZXRMZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgIGlmIChubC5pdGVtKGopLmdldE5vZGVUeXBlKCkgPT0gb3JnLnczYy5kb20uTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICBhcHBJbmZvVGV4dCA9IG5sLml0ZW0oaikuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChhcHBJbmZvVGV4dCAhPSBudWxsKQotICAgICAgeyAKLSAgICAgICAgb3BlbkFwcEluZm9UYWJsZSA9IHRydWU7Ci0gICAgICAgIGlmIChhcHBJbmZvVGV4dC50cmltKCkubGVuZ3RoKCkgPCAxKQotICAgICAgICAgIGFwcEluZm9UZXh0ID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJUQUJMRV9CTEFOS19QTEFDRUhPTERFUiIpOwotICAlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT0oKGFwcEluZm9MYW5nICE9IG51bGwgJiYgYXBwSW5mb0xhbmcubGVuZ3RoKCkgPiAwKSA/IGFwcEluZm9MYW5nIDogREVGQVVMVF9YTUxOU19MQU5HKSU+PC90ZD4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjwlPWFwcEluZm9UZXh0JT48L3RkPgotICA8L3RyPgotICA8JQotICAgICAgfQotICAgIH0KLSAgfQotICAlPgotPC90YWJsZT4KLTwvc3Bhbj4KLTwlCi1pZiAoIW9wZW5BcHBJbmZvVGFibGUpIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdHdpc3RDbG9zZSgnPCU9YXBwSW5mb0NvbnRhaW5lcklEJT4nKTsKLTwvc2NyaXB0PgotPCUKLX0KLSU+Ci0KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZG9jdW1lbnRhdGlvbkNvbnRhaW5lcklEJT4nLCc8JT14ZG9jdW1lbnRhdGlvbkNvbnRhaW5lcklEJT4nKSI+PGltZyBuYW1lPSI8JT14ZG9jdW1lbnRhdGlvbkNvbnRhaW5lcklEJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICA8c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1hTRF9ET0NVTUVOVEFUSU9OIiklPjwvc3Ryb25nPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPWRvY3VtZW50YXRpb25Db250YWluZXJJRCU+Ij4KLTx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xBTkdVQUdFIiklPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgd2lkdGg9IjEwMCUiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1hTRF9ET0NVTUVOVEFUSU9OIiklPjwvdGg+Ci0gIDwvdHI+Ci0gIDwlCi0gIGJvb2xlYW4gb3BlbkRvY1RhYmxlID0gZmFsc2U7Ci0gIGlmIChkb2NMaXN0ICE9IG51bGwpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY0xpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgIEVsZW1lbnQgZSA9IChFbGVtZW50KWRvY0xpc3QuZ2V0KGkpOwotICAgICAgU3RyaW5nIGRvY0xhbmcgPSBlLmdldEF0dHJpYnV0ZShYTUxOU19MQU5HKTsKLSAgICAgIFN0cmluZyBkb2NUZXh0ID0gbnVsbDsKLSAgICAgIE5vZGVMaXN0IG5sID0gZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG5sLmdldExlbmd0aCgpOyBqKyspIHsKLSAgICAgICAgaWYgKG5sLml0ZW0oaikuZ2V0Tm9kZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5Ob2RlLlRFWFRfTk9ERSkgewotICAgICAgICAgIGRvY1RleHQgPSBubC5pdGVtKGopLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgICBpZiAoZG9jVGV4dCAhPSBudWxsKQotICAgICAgewotICAgICAgICBvcGVuRG9jVGFibGUgPSB0cnVlOwotICAgICAgICBpZiAoZG9jVGV4dC50cmltKCkubGVuZ3RoKCkgPCAxKQotICAgICAgICAgIGRvY1RleHQgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIlRBQkxFX0JMQU5LX1BMQUNFSE9MREVSIik7Ci0gICU+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPjwlPSgoZG9jTGFuZyAhPSBudWxsICYmIGRvY0xhbmcubGVuZ3RoKCkgPiAwKSA/IGRvY0xhbmcgOiBERUZBVUxUX1hNTE5TX0xBTkcpJT48L3RkPgotICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PCU9ZG9jVGV4dCU+PC90ZD4KLSAgPC90cj4KLSAgPCUKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgJT4KLTwvdGFibGU+Ci08L3NwYW4+Ci08JQotaWYgKCFvcGVuRG9jVGFibGUpIHsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgdHdpc3RDbG9zZSgnPCU9ZG9jdW1lbnRhdGlvbkNvbnRhaW5lcklEJT4nKTsKLTwvc2NyaXB0PgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdFJGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVmYXVsdFJGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDY5NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgueG1sLnJwYy5OYW1lc3BhY2VDb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5IYXNodGFibGUiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIG9wZXJOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClvcGVyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotSGFzaHRhYmxlIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotLy8gVE9ETzogUmVwbGFjZSAiU09BUC1FTlYiIGJ5IE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TT0FQX0VOVkVMT1BFICg9InNvYXBlbnYiKQotc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KE5hbWVzcGFjZUNvbnN0YW50cy5OU1VSSV9TT0FQX0VOVkVMT1BFLCJTT0FQLUVOViIpOwotc29hcEVudmVsb3BlTmFtZXNwYWNlVGFibGUucHV0KE5hbWVzcGFjZUNvbnN0YW50cy5OU1VSSV9TQ0hFTUFfWFNJLE5hbWVzcGFjZUNvbnN0YW50cy5OU1BSRUZJWF9TQ0hFTUFfWFNJKTsKLXNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChOYW1lc3BhY2VDb25zdGFudHMuTlNVUklfU0NIRU1BX1hTRCxOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU0NIRU1BX1hTRCk7Ci1FbGVtZW50W10gaW5zdGFuY2VEb2N1bWVudHMgPSBmcmFnLmdlbkluc3RhbmNlRG9jdW1lbnRzRnJvbVBhcmFtZXRlclZhbHVlcyghb3BlckVsZW1lbnQuaXNVc2VMaXRlcmFsKCksIHNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLCBYTUxVdGlscy5jcmVhdGVOZXdEb2N1bWVudChudWxsKSk7Ci1TdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci1mb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gIGlmIChpbnN0YW5jZURvY3VtZW50c1tpXSA9PSBudWxsKQotICAgIGNvbnRpbnVlOwotICBzYi5hcHBlbmQoWE1MVXRpbHMuc2VyaWFsaXplKGluc3RhbmNlRG9jdW1lbnRzW2ldLCB0cnVlKSk7Ci0gIHNiLmFwcGVuZChIVE1MVXRpbHMuTElORV9TRVBBUkFUT1IpOwotfQotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGxhYmVsIGZvcj0iPCU9ZnJhZy5nZXRJRCgpJT4iPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2xhYmVsPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPHRleHRhcmVhIGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJ0ZXh0YXJlYWVudGVyIiByZWFkb25seT48JT1zYi50b1N0cmluZygpJT48L3RleHRhcmVhPgotPCUKLSAgICAgIC8qCi0gICAgICBTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgdXJsLmFwcGVuZChyZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIi93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRYTUwuanNwPyIpKSk7Ci0gICAgICB1cmwuYXBwZW5kKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpLmFwcGVuZCgiPSIpLmFwcGVuZChmcmFnSUQpLmFwcGVuZCgiJiIpOwotICAgICAgdXJsLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoIj0iKS5hcHBlbmQobm9kZUlEKS5hcHBlbmQoIiYiKTsKLSAgICAgIHVybC5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCI9IikuYXBwZW5kKHNlc3Npb24uZ2V0SWQoKSk7Ci0gICAgICAqLwotJT4KLSAgICAgIDwhLS0KLSAgICAgIDxpZnJhbWUgc3JjPSIiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjE1MHB4Ij48L2lmcmFtZT4KLSAgICAgIC0tPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRYTUwuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRSRnJhZ21lbnRYTUwuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWEwMTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0UkZyYWdtZW50WE1MLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L3htbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnhzZC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcueG1sLnNheC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcueG1sLnNheC5oZWxwZXJzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnhtbC5ycGMuTmFtZXNwYWNlQ29uc3RhbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC4qIiAlPgotPCUKLVN0cmluZyBmcmFnSUQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihXU0RMQWN0aW9uSW5wdXRzLkZSQUdNRU5UX0lEKTsKLVN0cmluZyBub2RlSUQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLVN0cmluZyBzZXNzaW9uSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLUh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgb3Blck5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlEKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClvcGVyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lEKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLUhhc2h0YWJsZSBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLS8vIFRPRE86IFJlcGxhY2UgIlNPQVAtRU5WIiBieSBOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU09BUF9FTlZFTE9QRSAoPSJzb2FwZW52IikKLXNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChOYW1lc3BhY2VDb25zdGFudHMuTlNVUklfU09BUF9FTlZFTE9QRSwiU09BUC1FTlYiKTsKLXNvYXBFbnZlbG9wZU5hbWVzcGFjZVRhYmxlLnB1dChOYW1lc3BhY2VDb25zdGFudHMuTlNVUklfU0NIRU1BX1hTSSxOYW1lc3BhY2VDb25zdGFudHMuTlNQUkVGSVhfU0NIRU1BX1hTSSk7Ci1zb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZS5wdXQoTmFtZXNwYWNlQ29uc3RhbnRzLk5TVVJJX1NDSEVNQV9YU0QsTmFtZXNwYWNlQ29uc3RhbnRzLk5TUFJFRklYX1NDSEVNQV9YU0QpOwotRWxlbWVudFtdIGluc3RhbmNlRG9jdW1lbnRzID0gbmV3IEVsZW1lbnRbMF07Ci1TdHJpbmdCdWZmZXIgc2IgPSBudWxsOwotdHJ5Ci17Ci0gIGluc3RhbmNlRG9jdW1lbnRzID0gZnJhZy5nZW5JbnN0YW5jZURvY3VtZW50c0Zyb21QYXJhbWV0ZXJWYWx1ZXMoIW9wZXJFbGVtZW50LmlzVXNlTGl0ZXJhbCgpLCBzb2FwRW52ZWxvcGVOYW1lc3BhY2VUYWJsZSwgWE1MVXRpbHMuY3JlYXRlTmV3RG9jdW1lbnQobnVsbCkpOwotICBpZiAoaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoID09IDEpCi0gIHsKLSAgICBieXRlW10gYiA9IFhNTFV0aWxzLnNlcmlhbGl6ZShpbnN0YW5jZURvY3VtZW50c1swXSwgdHJ1ZSkuZ2V0Qnl0ZXMoSFRNTFV0aWxzLlVURjhfRU5DT0RJTkcpOwotICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYik7Ci0gICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIHNheEZhY3Rvcnkuc2V0VmFsaWRhdGluZyh0cnVlKTsKLSAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4RmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICBzYXhQYXJzZXIucGFyc2UoYmFpcywKLSAgICAgIG5ldyBEZWZhdWx0SGFuZGxlcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgYmFpcy5jbG9zZSgpOwotICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihuZXcgU3RyaW5nKGIpKTsKLSAgfQotfQotY2F0Y2ggKFRocm93YWJsZSB0KQotewotfQotaWYgKHNiID09IG51bGwpCi17Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9ZnJhZy5nZXROYW1lKCklPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0gIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICByZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sOyBjaGFyc2V0PVVURi04Iik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zdGFuY2VEb2N1bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAoaW5zdGFuY2VEb2N1bWVudHNbaV0gPT0gbnVsbCkKLSAgICAgIGNvbnRpbnVlOwotICAgIHNiLmFwcGVuZChIVE1MVXRpbHMuY2hhcmFjdGVyc1RvSFRNTEVudGl0aWVzKFhNTFV0aWxzLnNlcmlhbGl6ZShpbnN0YW5jZURvY3VtZW50c1tpXSwgdHJ1ZSkpKTsKLSAgfQotJT4KLTwlPXNiLnRvU3RyaW5nKCklPgotPC9ib2R5PgotPC9odG1sPgotPCUKLX0KLWVsc2UKLXsKLSU+Ci08JT1zYi50b1N0cmluZygpJT4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlZmF1bHRXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGEyZjdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyBwYXJhbSA9IGZyYWcuZ2V0UGFyYW1ldGVyVmFsdWUoZnJhZy5nZXRJRCgpLCAwKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxsYWJlbCBmb3I9IjwlPWZyYWcuZ2V0SUQoKSU+Ij48YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT48L2xhYmVsPgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgPCUKLSAgICAgIGlmICghZnJhZy52YWxpZGF0ZUFsbFBhcmFtZXRlclZhbHVlcygpKSB7Ci0gICAgICAlPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgPCUKLSAgICAgIH0KLSAgICAgICU+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRkPgotICAgICAgPHRleHRhcmVhIGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJ0ZXh0YXJlYWVudGVyIj48JT0oKHBhcmFtICE9IG51bGwpID8gcGFyYW0gOiAiIiklPjwvdGV4dGFyZWE+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvblJGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvblJGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOTMxZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlbGVnYXRpb25SRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgb3Blck5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERGVsZWdhdGlvbkZyYWdtZW50IHdyYXBwZXJGcmFnbWVudCA9IChJWFNERGVsZWdhdGlvbkZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1JWFNERnJhZ21lbnQgZGVsZWdhdGlvbkZyYWdtZW50ID0gd3JhcHBlckZyYWdtZW50LmdldFhTRERlbGVnYXRpb25GcmFnbWVudCgpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gd3JhcHBlckZyYWdtZW50LmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1mcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci1mcmFnSUQuYXBwZW5kKGRlbGVnYXRpb25GcmFnbWVudC5nZXRJRCgpKTsKLSU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9ZGVsZWdhdGlvbkZyYWdtZW50LmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvbldGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERGVsZWdhdGlvbldGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDYwN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRERlbGVnYXRpb25XRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0REZWxlZ2F0aW9uRnJhZ21lbnQgd3JhcHBlckZyYWdtZW50ID0gKElYU0REZWxlZ2F0aW9uRnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLUlYU0RGcmFnbWVudCBkZWxlZ2F0aW9uRnJhZ21lbnQgPSB3cmFwcGVyRnJhZ21lbnQuZ2V0WFNERGVsZWdhdGlvbkZyYWdtZW50KCk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSB3cmFwcGVyRnJhZ21lbnQuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLWZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLWZyYWdJRC5hcHBlbmQoZGVsZWdhdGlvbkZyYWdtZW50LmdldElEKCkpOwotJT4KLTx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1kZWxlZ2F0aW9uRnJhZ21lbnQuZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERW1wdHlSRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREVtcHR5UkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzY2VlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNERW1wdHlSRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREVtcHR5V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RFbXB0eVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YTQ5NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREVtcHR5V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1pbnQgbWluT2NjdXJzID0geHNkQ29uZmlnLmdldE1pbk9jY3VycygpOwotaW50IG1heE9jY3VycyA9IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsKLWlmIChtaW5PY2N1cnMgPT0gbWF4T2NjdXJzKSB7Ci0lPgotPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1tYXhPY2N1cnMlPiIvPgotPCUKLX0gZWxzZSB7Ci0gIFN0cmluZ1tdIHBhcmFtcyA9IGZyYWcuZ2V0UGFyYW1ldGVyVmFsdWVzKGZyYWcuZ2V0SUQoKSk7Ci0lPgotICA8dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8bGFiZWwgZm9yPSI8JT1mcmFnLmdldElEKCklPiI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfT0NDVVJBTkNFIiklPiZuYnNwOzxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlblhTREluZm9EaWFsb2coJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb24uZ2V0SWQoKSxzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksZnJhZ0lELnRvU3RyaW5nKCkpKSklPicpIj48JT1mcmFnLmdldE5hbWUoKSU+PC9hPjwvbGFiZWw+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgPCUKLSAgICAgIGlmIChtYXhPY2N1cnMgIT0gRnJhZ21lbnRDb25zdGFudHMuVU5CT1VOREVEKSB7Ci0gICAgICAlPgotICAgICAgICA8c2VsZWN0IGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgPCUKLSAgICAgICAgZm9yIChpbnQgaSA9IG1pbk9jY3VyczsgaSA8PSBtYXhPY2N1cnM7IGkrKykgewotICAgICAgICAlPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPWklPiIgPCUgaWYgKHBhcmFtcyAhPSBudWxsICYmIGkgPT0gcGFyYW1zLmxlbmd0aCkgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT1pJT4KLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwlCi0gICAgICB9IGVsc2UgewotICAgICAgJT4KLSAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT0oKHBhcmFtcyAhPSBudWxsKSA/IFN0cmluZy52YWx1ZU9mKHBhcmFtcy5sZW5ndGgpIDogIiIpJT4iIGNsYXNzPSJ0YWJsZXRleHRlbnRlciI+Ci0gICAgICA8JQotICAgICAgICBpZiAoIWZyYWcudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKSkgewotICAgICAgICAlPgotICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cEFsbFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBBbGxXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTkwMjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cEFsbFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNER3JvdXBBbGxGcmFnbWVudCBmcmFnID0gKElYU0RHcm91cEFsbEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1ib29sZWFuIGVuYWJsZUdyb3VwID0gKHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSA+IDAgfHwgZnJhZy5nZXRHcm91cElEcygpLmxlbmd0aCA+IDApOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJRCkudG9TdHJpbmcoKTsKLVN0cmluZyBncm91cElEID0gZnJhZy5nZXRHcm91cEFsbEluc3RhbmNlKCk7Ci1TdHJpbmcgZ3JvdXBDaGVja2JveElEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuWFNEX0FMTF9HUk9VUF9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgZ3JvdXBNZW1iZXJSYWRpb0lEID0gKG5ldyBTdHJpbmdCdWZmZXIoZ3JvdXBDaGVja2JveElEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLSU+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gaW5pdEdyb3VwQWxsKHRhYmxlQ29udGFpbmVySUQsIHR3aXN0SW1hZ2VOYW1lLCBmcmFnSUQsIGdyb3VwSUQsIGdyb3VwQ2hlY2tib3hJRCwgZW5hYmxlKSB7Ci0gICAgdmFyIGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ3JvdXBDaGVja2JveElEKTsKLSAgICBjaGVja2JveC5jaGVja2VkID0gZW5hYmxlOwotICAgIGVuYWJsZUdyb3VwQWxsKHRhYmxlQ29udGFpbmVySUQsIHR3aXN0SW1hZ2VOYW1lLCBmcmFnSUQsIGdyb3VwSUQsIGNoZWNrYm94KTsKLSAgfQotCi0gIGZ1bmN0aW9uIGVuYWJsZUdyb3VwQWxsKHRhYmxlQ29udGFpbmVySUQsIHR3aXN0SW1hZ2VOYW1lLCBmcmFnSUQsIGdyb3VwSUQsIGNoZWNrYm94KSB7Ci0gICAgdmFyIHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIGNoZWNrYm94VGFibGUgPSBjaGVja2JveC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTsKLSAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkgewotICAgICAgaWYgKHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT0gIm5vbmUiKQotICAgICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklELCB0d2lzdEltYWdlTmFtZSk7Ci0gICAgICBjaGVja2JveC5uYW1lID0gZnJhZ0lEOwotICAgICAgY2hlY2tib3gudmFsdWUgPSBncm91cElEOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmICh0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09ICIiKQotICAgICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklELCB0d2lzdEltYWdlTmFtZSk7Ci0gICAgICBjaGVja2JveC5uYW1lID0gIiI7Ci0gICAgICBjaGVja2JveC52YWx1ZSA9ICIiOwotICAgIH0KLSAgICB2YXIgdGRzID0gY2hlY2tib3hUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICB2YXIgY2hlY2tib3hDZWxsSW5kZXggPSBjaGVja2JveC5wYXJlbnROb2RlLmNlbGxJbmRleDsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRkcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKGkgPT0gY2hlY2tib3hDZWxsSW5kZXggfHwgY2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgdGRzLml0ZW0oaSkuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgZWxzZQotICAgICAgICB0ZHMuaXRlbShpKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIGdyb3VwQWxsT3JkZXJpbmdNb3ZlVXAodGFibGVDb250YWluZXJJRCkgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIGlmICh0YWJsZS5yb3dzW251bWJlck9mSGVhZGVyUm93c10uY2VsbHNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKS5jaGVja2VkKSB7Ci0gICAgICBhbGVydCgnPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTU9WRV9GSVJTVF9FTEVNRU5UX1VQIiklPicpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKHZhciBpID0gbnVtYmVyT2ZIZWFkZXJSb3dzICsgMTsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmICh0YWJsZS5yb3dzW2ldLmNlbGxzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCkuY2hlY2tlZCkgewotICAgICAgICBzd2FwUm93cyh0YWJsZSwgaS0xLCBpKTsKLSAgICAgICAgdGFibGUucm93c1tpLTFdLmNlbGxzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCkuY2hlY2tlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgYWxlcnQoJzwlPWNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCkuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQiKSU+Jyk7Ci0gIH0KLQotICBmdW5jdGlvbiBncm91cEFsbE9yZGVyaW5nTW92ZURvd24odGFibGVDb250YWluZXJJRCkgewotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIGlmICh0YWJsZS5yb3dzW3RhYmxlLnJvd3MubGVuZ3RoIC0gMV0uY2VsbHNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IikuaXRlbSgwKS5jaGVja2VkKSB7Ci0gICAgICBhbGVydCgnPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9DQU5OT1RfTU9WRV9MQVNUX0VMRU1FTlRfRE9XTiIpJT4nKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yICh2YXIgaSA9IG51bWJlck9mSGVhZGVyUm93czsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoIC0gMTsgaSsrKSB7Ci0gICAgICBpZiAodGFibGUucm93c1tpXS5jZWxsc1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApLmNoZWNrZWQpIHsKLSAgICAgICAgc3dhcFJvd3ModGFibGUsIGksIGkrMSk7Ci0gICAgICAgIHRhYmxlLnJvd3NbaSsxXS5jZWxsc1swXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApLmNoZWNrZWQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGFsZXJ0KCc8JT1jb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT1RISU5HX1NFTEVDVEVEIiklPicpOwotICB9Ci0KLSAgPCUKLSAgLy8gcm93SW5kZXgxIG11c3QgYmUgc21hbGxlciB0aGFuIHJvd0luZGV4MiBpbiBvcmRlciB0byB3b3JrCi0gICU+Ci0gIGZ1bmN0aW9uIHN3YXBSb3dzKHRhYmxlLCByb3dJbmRleDEsIHJvd0luZGV4MikgewotICAgIHZhciByb3cxQ2hpbGROb2RlcyA9IGNsb25lQXJyYXkodGFibGUucm93c1tyb3dJbmRleDFdLmNoaWxkTm9kZXMpOwotICAgIHZhciByb3cyQ2hpbGROb2RlcyA9IGNsb25lQXJyYXkodGFibGUucm93c1tyb3dJbmRleDJdLmNoaWxkTm9kZXMpOwotICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleDIpOwotICAgIHRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleDEpOwotICAgIHZhciByb3cxID0gdGFibGUuaW5zZXJ0Um93KHJvd0luZGV4MSk7Ci0gICAgdmFyIHJvdzIgPSB0YWJsZS5pbnNlcnRSb3cocm93SW5kZXgyKTsKLSAgICBhcHBlbmRUb1Jvdyhyb3cxLCByb3cyQ2hpbGROb2Rlcyk7Ci0gICAgYXBwZW5kVG9Sb3cocm93Miwgcm93MUNoaWxkTm9kZXMpOwotICB9Ci0KLSAgZnVuY3Rpb24gY2xvbmVBcnJheShvbGRBcnJheSkgewotICAgIHZhciBhcnJheUNsb25lID0gbmV3IEFycmF5KCk7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgYXJyYXlDbG9uZVtpXSA9IG9sZEFycmF5W2ldLmNsb25lTm9kZSh0cnVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFycmF5Q2xvbmU7Ci0gIH0KLQotICBmdW5jdGlvbiBhcHBlbmRUb1Jvdyhyb3csIG5vZGVzQXJyYXkpIHsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgIHJvdy5hcHBlbmRDaGlsZChub2Rlc0FycmF5W2ldKTsKLSAgICB9Ci0gIH0KLTwvc2NyaXB0PgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDwlCi0gICAgaWYgKHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSA+IDApIHsKLSAgICAlPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9Z3JvdXBJRCU+Ij4KLSAgICA8JQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAlPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSI8JT1ncm91cENoZWNrYm94SUQlPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1ncm91cElEJT4iIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX0VOQUJMRV9ESVNBQkxFX0dST1VQIiklPiIgb25DbGljaz0iamF2YXNjcmlwdDplbmFibGVHcm91cEFsbCgnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPXR3aXN0SW1hZ2VOYW1lJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCAnPCU9Z3JvdXBJRCU+JywgdGhpcykiIGNoZWNrZWQ+PGxhYmVsIGZvcj0iPCU9Z3JvdXBDaGVja2JveElEJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0VOQUJMRV9ESVNBQkxFX0dST1VQIiklPjwvbGFiZWw+Ci0gICAgPC90ZD4KLSAgICA8JQotICAgIH0KLSAgICAlPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Omdyb3VwQWxsT3JkZXJpbmdNb3ZlVXAoJzwlPXRhYmxlQ29udGFpbmVySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9VUCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpncm91cEFsbE9yZGVyaW5nTW92ZURvd24oJzwlPXRhYmxlQ29udGFpbmVySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9HUk9VUF9BTExfT1JERVJJTkdfTU9WRV9ET1dOIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiB3aWR0aD0xMD48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0VMRU1FTlRTIiklPjwvdGg+Ci0gIDwvdHI+Ci0gIDwlCi0gIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGdyb3VwTWVtYmVyRnJhZ21lbnRzW2ldLmdldElEKCkpOwotICAlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgY2xhc3M9InJhZGlvIiBuYW1lPSI8JT1ncm91cE1lbWJlclJhZGlvSUQlPiIgdmFsdWU9IjwlPWZyYWdJRC50b1N0cmluZygpJT4iIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9FTEVNRU5UX0lOX0dST1VQIiklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWdyb3VwSUQlPiIgdmFsdWU9IjwlPWZyYWdJRC50b1N0cmluZygpJT4iPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWdyb3VwTWVtYmVyRnJhZ21lbnRzW2ldLmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+Ci08L3NwYW4+Ci08JQotaWYgKCFlbmFibGVHcm91cCkgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgaW5pdEdyb3VwQWxsKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9dHdpc3RJbWFnZU5hbWUlPicsICc8JT1mcmFnLmdldElEKCklPicsICc8JT1ncm91cElEJT4nLCAnPCU9Z3JvdXBDaGVja2JveElEJT4nLCA8JT1lbmFibGVHcm91cCU+KTsKLSAgPC9zY3JpcHQ+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZUZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBDaG9pY2VGaXhXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRjZjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZUZpeFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gY2hvb3NlKHNlbGVjdCkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciB0YWJsZUNvbnRhaW5lcklEID0gJzwlPUZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEJT4nOwotICAgICAgdGFibGVDb250YWluZXJJRCArPSBzZWxlY3Qub3B0aW9ucyhpKS52YWx1ZTsKLSAgICAgIHNob3dUYWJsZSh0YWJsZUNvbnRhaW5lcklELCBzZWxlY3Qub3B0aW9ucyhpKS5zZWxlY3RlZCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1RhYmxlKHRhYmxlQ29udGFpbmVySUQsIHNob3cpIHsKLSAgICB2YXIgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICBpZiAoc2hvdykKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICBlbHNlCi0gICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICB9Ci08L3NjcmlwdD4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREdyb3VwQ2hvaWNlRnJhZ21lbnQgZnJhZyA9IChJWFNER3JvdXBDaG9pY2VGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotJT4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQ0hPSUNFUyIpJT48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRUxFTUVOVFMiKSU+PC90aD4KLSAgPC90cj4KLTwlCi0gIFhTRFBhcnRpY2xlW10gY2hvaWNlcyA9IGZyYWcuZ2V0Q2hvaWNlcygpOwotICBTdHJpbmdbXSBncm91cElEcyA9IGZyYWcuZ2V0R3JvdXBJRHMoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB4c2RDb25maWcuZ2V0TWF4T2NjdXJzKCk7IGkrKykgewotICAgIFN0cmluZyBncm91cElEOwotICAgIGludCBjaG9pY2VJbmRleDsKLSAgICBpZiAoaSA8IGdyb3VwSURzLmxlbmd0aCkgewotICAgICAgZ3JvdXBJRCA9IGdyb3VwSURzW2ldOwotICAgICAgY2hvaWNlSW5kZXggPSBmcmFnLmdldENob2ljZUluZGV4KGdyb3VwSUQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGdyb3VwSUQgPSBmcmFnLmNyZWF0ZUdyb3VwQ2hvaWNlSW5zdGFuY2UoMCk7Ci0gICAgICBjaG9pY2VJbmRleCA9IDA7Ci0gICAgfQotICAgIElYU0RGcmFnbWVudFtdIGNob2ljZUZyYWdzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSU+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1ncm91cElEJT4iPgotICAgICAgICA8c2VsZWN0IGlkPSI8JT1ncm91cElEJT4iIG5hbWU9IjwlPWdyb3VwSUQlPiIgb25DaGFuZ2U9ImphdmFzY3JpcHQ6Y2hvb3NlKHRoaXMpIiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQ0hPSUNFUyIpJT4iPgotPCUKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNob2ljZUZyYWdzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pY2hvaWNlRnJhZ3Nbal0uZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKS5nZXRYU0RDb21wb25lbnQoKTsKLSAgICAgICAgICAgIGlmIChqID09IGNob2ljZUluZGV4KSB7Ci0lPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1jaG9pY2VGcmFnc1tqXS5nZXRJRCgpJT4iIHNlbGVjdGVkPjwlPXhzZEVsZW1lbnQuZ2V0UU5hbWUoKSU+Ci08JQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0lPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1jaG9pY2VGcmFnc1tqXS5nZXRJRCgpJT4iPjwlPXhzZEVsZW1lbnQuZ2V0UU5hbWUoKSU+Ci08JQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci08JQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNob2ljZUZyYWdzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgICAgICAgIGZyYWdJRC5hcHBlbmQoY2hvaWNlRnJhZ3Nbal0uZ2V0SUQoKSk7Ci0gICAgICAgICAgU3RyaW5nIGNob2ljZUZyYWdUYWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoY2hvaWNlRnJhZ3Nbal0uZ2V0SUQoKSkudG9TdHJpbmcoKTsKLSU+Ci0gICAgICAgICAgPHNwYW4gaWQ9IjwlPWNob2ljZUZyYWdUYWJsZUNvbnRhaW5lcklEJT4iPgotICAgICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWNob2ljZUZyYWdzW2pdLmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgICAgICAgIDwvc3Bhbj4KLSAgICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHNob3dUYWJsZSgnPCU9Y2hvaWNlRnJhZ1RhYmxlQ29udGFpbmVySUQlPicsIDwlPShqID09IGNob2ljZUluZGV4KSU+KTsKLSAgICAgICAgICA8L3NjcmlwdD4KLTwlCi0gICAgICAgIH0KLSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci08JQotICB9Ci0lPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBDaG9pY2VSRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTRjYzFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgb3Blck5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNER3JvdXBDaG9pY2VGcmFnbWVudCBmcmFnID0gKElYU0RHcm91cENob2ljZUZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJREJhc2UgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWVCYXNlID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySURCYXNlKS50b1N0cmluZygpOwotU3RyaW5nW10gZ3JvdXBJRHMgPSBmcmFnLmdldEdyb3VwSURzKCk7Ci1pZiAoZ3JvdXBJRHMubGVuZ3RoID09IDEpIHsKLSAgaW50IGNob2ljZUluZGV4ID0gZnJhZy5nZXRDaG9pY2VJbmRleChncm91cElEc1swXSk7Ci0gIElYU0RGcmFnbWVudCBjaG9pY2VGcmFnID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEc1swXSlbY2hvaWNlSW5kZXhdOwotICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gIGZyYWdJRC5hcHBlbmQoY2hvaWNlRnJhZy5nZXRJRCgpKTsKLSU+Ci0gIDx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaG9pY2VGcmFnLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotfQotZWxzZSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJRHMubGVuZ3RoOyBpKyspIHsKLSAgICBpbnQgY2hvaWNlSW5kZXggPSBmcmFnLmdldENob2ljZUluZGV4KGdyb3VwSURzW2ldKTsKLSAgICBJWFNERnJhZ21lbnQgY2hvaWNlRnJhZyA9IGZyYWcuZ2V0R3JvdXBNZW1iZXJGcmFnbWVudHMoZ3JvdXBJRHNbaV0pW2Nob2ljZUluZGV4XTsKLSAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgZnJhZ0lELmFwcGVuZChjaG9pY2VGcmFnLmdldElEKCkpOwotJT4KLSAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPWkgKyB0YWJsZUNvbnRhaW5lcklEQmFzZSU+JywnPCU9aSArIHR3aXN0SW1hZ2VOYW1lQmFzZSU+JykiPjxpbWcgbmFtZT0iPCU9aSArIHR3aXN0SW1hZ2VOYW1lQmFzZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0dST1VQX05VTUJFUiIsIFN0cmluZy52YWx1ZU9mKGkgKyAxKSklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxzcGFuIGlkPSI8JT1pICsgdGFibGVDb250YWluZXJJREJhc2UlPiI+Ci0gICAgPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICAgICAgPHRyPgotICAgICAgICA8dGQgd2lkdGg9MTY+Ci0gICAgICAgICAgPGltZyB3aWR0aD0xNiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3NwYWNlLmdpZiIpKSU+Ij4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaG9pY2VGcmFnLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPC9zcGFuPgotPCUKLSAgfQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJhbmdlV0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cENob2ljZVJhbmdlV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NzRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBDaG9pY2VSYW5nZVdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gY2hvb3NlKHNlbGVjdCkgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciB0YWJsZUNvbnRhaW5lcklEID0gJzwlPUZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEJT4nOwotICAgICAgdGFibGVDb250YWluZXJJRCArPSBzZWxlY3Qub3B0aW9ucyhpKS52YWx1ZTsKLSAgICAgIHNob3dUYWJsZSh0YWJsZUNvbnRhaW5lcklELCBzZWxlY3Qub3B0aW9ucyhpKS5zZWxlY3RlZCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1RhYmxlKHRhYmxlQ29udGFpbmVySUQsIHNob3cpIHsKLSAgICB2YXIgdGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICBpZiAoc2hvdykKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKLSAgICBlbHNlCi0gICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICB9Ci08L3NjcmlwdD4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREdyb3VwQ2hvaWNlRnJhZ21lbnQgZnJhZyA9IChJWFNER3JvdXBDaG9pY2VGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJRCkudG9TdHJpbmcoKTsKLVN0cmluZyBuYW1lQW5jaG9ySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5OQU1FX0FOQ0hPUl9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0lPgotPGEgbmFtZT0iPCU9bmFtZUFuY2hvcklEJT4iLz4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9dGFibGVDb250YWluZXJJRCU+JywnPCU9dHdpc3RJbWFnZU5hbWUlPicpIj48aW1nIG5hbWU9IjwlPXR3aXN0SW1hZ2VOYW1lJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjcmVhdGVJbnN0YW5jZSgnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4sICc8JT1mcmFnSUQlPicsICc8JT1uYW1lQW5jaG9ySUQlPicpIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1pbk9jY3VycygpJT4pIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJyYW5nZWZyYWd0YWJsZSIgOiAiaW5uZXJyYW5nZWZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySUQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciIgbm93cmFwPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0NIT0lDRVMiKSU+PC90aD4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiB3aWR0aD0iMTAwJSIgbm93cmFwPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0VMRU1FTlRTIiklPjwvdGg+Ci0gIDwvdHI+Ci08JQotICBYU0RQYXJ0aWNsZVtdIGNob2ljZXMgPSBmcmFnLmdldENob2ljZXMoKTsKLSAgU3RyaW5nW10gZ3JvdXBJRHMgPSBmcmFnLmdldEdyb3VwSURzKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJRHMubGVuZ3RoIHx8IGkgPCB4c2RDb25maWcuZ2V0TWluT2NjdXJzKCk7IGkrKykgewotICAgIFN0cmluZyBncm91cElEOwotICAgIGludCBjaG9pY2VJbmRleDsKLSAgICBpZiAoaSA8IGdyb3VwSURzLmxlbmd0aCkgewotICAgICAgZ3JvdXBJRCA9IGdyb3VwSURzW2ldOwotICAgICAgY2hvaWNlSW5kZXggPSBmcmFnLmdldENob2ljZUluZGV4KGdyb3VwSUQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGdyb3VwSUQgPSBmcmFnLmNyZWF0ZUdyb3VwQ2hvaWNlSW5zdGFuY2UoMCk7Ci0gICAgICBjaG9pY2VJbmRleCA9IDA7Ci0gICAgfQotICAgIElYU0RGcmFnbWVudFtdIGNob2ljZUZyYWdzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSU+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD4KLSAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVSb3dDaGVja2JveENsaWNrKCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9Z3JvdXBJRCU+Ij4KLSAgICAgICAgPHNlbGVjdCBpZD0iPCU9Z3JvdXBJRCU+IiBuYW1lPSI8JT1ncm91cElEJT4iIG9uQ2hhbmdlPSJqYXZhc2NyaXB0OmNob29zZSh0aGlzKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0NIT0lDRVMiKSU+Ij4KLTwlCi0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaG9pY2VGcmFncy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnQgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKWNob2ljZUZyYWdzW2pdLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCkuZ2V0WFNEQ29tcG9uZW50KCk7Ci0gICAgICAgICAgICBpZiAoaiA9PSBjaG9pY2VJbmRleCkgewotJT4KLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9Y2hvaWNlRnJhZ3Nbal0uZ2V0SUQoKSU+IiBzZWxlY3RlZD48JT14c2RFbGVtZW50LmdldFFOYW1lKCklPgotPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotJT4KLSAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9Y2hvaWNlRnJhZ3Nbal0uZ2V0SUQoKSU+Ij48JT14c2RFbGVtZW50LmdldFFOYW1lKCklPgotPCUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0lPgotICAgICAgICA8L3NlbGVjdD4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotPCUKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaG9pY2VGcmFncy5sZW5ndGg7IGorKykgewotICAgICAgICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICAgICAgICBmcmFnSUQuYXBwZW5kKGNob2ljZUZyYWdzW2pdLmdldElEKCkpOwotICAgICAgICAgIFN0cmluZyBjaG9pY2VGcmFnVGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGNob2ljZUZyYWdzW2pdLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0lPgotICAgICAgICAgIDxzcGFuIGlkPSI8JT1jaG9pY2VGcmFnVGFibGVDb250YWluZXJJRCU+Ij4KLSAgICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaG9pY2VGcmFnc1tqXS5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgICAgICA8L3NwYW4+Ci0gICAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgICAgICBzaG93VGFibGUoJzwlPWNob2ljZUZyYWdUYWJsZUNvbnRhaW5lcklEJT4nLCA8JT0oaiA9PSBjaG9pY2VJbmRleCklPik7Ci0gICAgICAgICAgPC9zY3JpcHQ+Ci08JQotICAgICAgICB9Ci0lPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotPCUKLSAgfQotJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBSRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREdyb3VwUkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkN2RiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBSRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIG9wZXJOb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClvcGVyTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREdyb3VwRnJhZ21lbnQgZnJhZyA9IChJWFNER3JvdXBGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySURCYXNlID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lQmFzZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEQmFzZSkudG9TdHJpbmcoKTsKLVN0cmluZ1tdIGdyb3VwSURzID0gZnJhZy5nZXRHcm91cElEcygpOwotaWYgKGdyb3VwSURzLmxlbmd0aCA9PSAxKSB7Ci0gIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEc1swXSk7Ci0lPgotICA8dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci08JQotICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgIGZyYWdJRC5hcHBlbmQoZ3JvdXBNZW1iZXJGcmFnbWVudHNbaV0uZ2V0SUQoKSk7Ci0lPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWdyb3VwTWVtYmVyRnJhZ21lbnRzW2ldLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci08JQotICB9Ci0lPgotICA8L3RhYmxlPgotPCUKLX0KLWVsc2UgewotICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwSURzLmxlbmd0aDsgaSsrKSB7Ci0gICAgSVhTREZyYWdtZW50W10gZ3JvdXBNZW1iZXJGcmFnbWVudHMgPSBmcmFnLmdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGdyb3VwSURzW2ldKTsKLSU+Ci0gICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1pICsgdGFibGVDb250YWluZXJJREJhc2UlPicsJzwlPWkgKyB0d2lzdEltYWdlTmFtZUJhc2UlPicpIj48aW1nIG5hbWU9IjwlPWkgKyB0d2lzdEltYWdlTmFtZUJhc2UlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgICAgICA8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9HUk9VUF9OVU1CRVIiLCBTdHJpbmcudmFsdWVPZihpICsgMSkpJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8c3BhbiBpZD0iPCU9aSArIHRhYmxlQ29udGFpbmVySURCYXNlJT4iPgotICAgIDx0YWJsZSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gImZpeGZyYWd0YWJsZSIgOiAiaW5uZXJmaXhmcmFndGFibGUiKSU+Ij4KLTwlCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgICAgZnJhZ0lELmFwcGVuZChncm91cE1lbWJlckZyYWdtZW50c1tqXS5nZXRJRCgpKTsKLSU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB3aWR0aD0xNj4KLSAgICAgICAgICA8aW1nIHdpZHRoPTE2IHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvc3BhY2UuZ2lmIikpJT4iPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWdyb3VwTWVtYmVyRnJhZ21lbnRzW2pdLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotPCUKLSAgICB9Ci0lPgotICAgIDwvdGFibGU+Ci0gICAgPC9zcGFuPgotPCUKLSAgfQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cFNlcUZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBTZXFGaXhXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ4MWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cFNlcUZpeFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREdyb3VwU2VxRnJhZ21lbnQgZnJhZyA9IChJWFNER3JvdXBTZXFGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotU3RyaW5nW10gZ3JvdXBJRHMgPSBmcmFnLmdldEdyb3VwSURzKCk7Ci1mb3IgKGludCBpID0gMDsgaSA8IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsgaSsrKSB7Ci0gIFN0cmluZyBncm91cElEOwotICBpZiAoaSA8IGdyb3VwSURzLmxlbmd0aCkKLSAgICBncm91cElEID0gZ3JvdXBJRHNbaV07Ci0gIGVsc2UKLSAgICBncm91cElEID0gZnJhZy5jcmVhdGVHcm91cFNlcUluc3RhbmNlKCk7Ci0gIElYU0RGcmFnbWVudFtdIGdyb3VwTWVtYmVyRnJhZ21lbnRzID0gZnJhZy5nZXRHcm91cE1lbWJlckZyYWdtZW50cyhncm91cElEKTsKLSU+Ci0gIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9Z3JvdXBJRCU+Ij4KLSAgPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotPCUKLSAgZm9yIChpbnQgaiA9IDA7IGogPCBncm91cE1lbWJlckZyYWdtZW50cy5sZW5ndGg7IGorKykgewotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGdyb3VwTWVtYmVyRnJhZ21lbnRzW2pdLmdldElEKCkpOwotJT4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1ncm91cE1lbWJlckZyYWdtZW50c1tqXS5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLTwlCi0gIH0KLSU+Ci0gIDwvdGFibGU+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cFNlcVJhbmdlV0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RHcm91cFNlcVJhbmdlV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzOTU0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNER3JvdXBTZXFSYW5nZVdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RHcm91cFNlcUZyYWdtZW50IGZyYWcgPSAoSVhTREdyb3VwU2VxRnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgbmFtZUFuY2hvcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuTkFNRV9BTkNIT1JfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotJT4KLTxhIG5hbWU9IjwlPW5hbWVBbmNob3JJRCU+Ii8+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlSW5zdGFuY2UoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+LCAnPCU9ZnJhZ0lEJT4nLCAnPCU9bmFtZUFuY2hvcklEJT4nKSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2hlY2tNaW5PY2N1cnNBbmRSZW1vdmVTZWxlY3RlZFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSU+KSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT10YWJsZUNvbnRhaW5lcklEJT4iPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAicmFuZ2VmcmFndGFibGUiIDogImlubmVycmFuZ2VmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0VMRU1FTlRTIiklPjwvdGg+Ci0gIDwvdHI+Ci0gIDwlCi0gIFN0cmluZ1tdIGdyb3VwSURzID0gZnJhZy5nZXRHcm91cElEcygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGdyb3VwSURzLmxlbmd0aCB8fCBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSAgICBTdHJpbmcgZ3JvdXBJRDsKLSAgICBpZiAoaSA8IGdyb3VwSURzLmxlbmd0aCkKLSAgICAgIGdyb3VwSUQgPSBncm91cElEc1tpXTsKLSAgICBlbHNlCi0gICAgICBncm91cElEID0gZnJhZy5jcmVhdGVHcm91cFNlcUluc3RhbmNlKCk7Ci0gICAgSVhTREZyYWdtZW50W10gZ3JvdXBNZW1iZXJGcmFnbWVudHMgPSBmcmFnLmdldEdyb3VwTWVtYmVyRnJhZ21lbnRzKGdyb3VwSUQpOwotICAlPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD4KLSAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlUm93Q2hlY2tib3hDbGljaygpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgdmFsdWU9IjwlPWdyb3VwSUQlPiI+Ci0gICAgICA8JQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdyb3VwTWVtYmVyRnJhZ21lbnRzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgZnJhZ0lELmRlbGV0ZSgwLCBmcmFnSUQubGVuZ3RoKCkpOwotICAgICAgICAgIGZyYWdJRC5hcHBlbmQoZ3JvdXBNZW1iZXJGcmFnbWVudHNbal0uZ2V0SUQoKSk7Ci0gICAgICAlPgotICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9IjwlPWdyb3VwTWVtYmVyRnJhZ21lbnRzW2pdLmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgICAgPCUKLSAgICAgICAgfQotICAgICAgJT4KLSAgICA8L3RkPgotICA8L3RyPgotICA8JQotICB9Ci0gICU+Ci08L3RhYmxlPgotPC9zcGFuPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREluZm9EaWFsb2cuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREluZm9EaWFsb2cuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmM4NmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RJbmZvRGlhbG9nLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuKiIgJT4KLQotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLSAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyBub2RlSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuTk9ERUlEKTsKLSAgIFN0cmluZyBmcmFnbWVudElkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoV1NETEFjdGlvbklucHV0cy5GUkFHTUVOVF9JRCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+Ci0gICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlRJVExFX1hTRF9JTkZPUk1BVElPTl9ESUFMT0ciKSU+Ci0gIDwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgcm93cz0iMzMsKiIgYm9yZGVyPTAgYmdjb2xvcj0iI0VDRTlEOCI+Ci08JQotICAgU3RyaW5nQnVmZmVyIGxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsL2ZyYWdtZW50L1hTREluZm9fdG9vbGJhci5qc3A/Iik7Ci0gICBsaW5rLmFwcGVuZChBY3Rpb25JbnB1dHMuU0VTU0lPTklEKS5hcHBlbmQoJz0nKS5hcHBlbmQoc2Vzc2lvbklkKTsKLSAgIGxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKEFjdGlvbklucHV0cy5OT0RFSUQpLmFwcGVuZCgnPScpLmFwcGVuZChub2RlSWQpOwotICAgbGluay5hcHBlbmQoJyYnKS5hcHBlbmQoV1NETEFjdGlvbklucHV0cy5GUkFHTUVOVF9JRCkuYXBwZW5kKCc9JykuYXBwZW5kKGZyYWdtZW50SWQpOwotJT4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLlhTRF9JTkZPX1RPT0xCQVIlPiIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChsaW5rLnRvU3RyaW5nKCkpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08JSAgICAgIAotICAgbGluay5zZXRMZW5ndGgoMCk7Ci0gICBsaW5rLmFwcGVuZCgid3NkbC9mcmFnbWVudC9YU0RJbmZvX2NvbnRlbnQuanNwPyIpOwotICAgbGluay5hcHBlbmQoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkuYXBwZW5kKCc9JykuYXBwZW5kKHNlc3Npb25JZCk7Ci0gICBsaW5rLmFwcGVuZCgnJicpLmFwcGVuZChBY3Rpb25JbnB1dHMuTk9ERUlEKS5hcHBlbmQoJz0nKS5hcHBlbmQobm9kZUlkKTsKLSAgIGxpbmsuYXBwZW5kKCcmJykuYXBwZW5kKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpLmFwcGVuZCgnPScpLmFwcGVuZChmcmFnbWVudElkKTsKLSU+ICAKLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLlhTRF9JTkZPX0NPTlRFTlQlPiIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX0NPTlRFTlQiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChsaW5rLnRvU3RyaW5nKCkpKSU+IiBub3Jlc2l6ZSBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0wIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREluZm9fY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNESW5mb19jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4Zjg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNESW5mb19jb250ZW50LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9InNlc3Npb25JRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgc2Vzc2lvbklELmFwcGVuZChyZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKSk7Ci0gICBmcmFnSUQuYXBwZW5kKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpKTsKLQotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JRC50b1N0cmluZygpKTsKLSAgIENvbnRyb2xsZXIgY29udHJvbGxlciA9IChDb250cm9sbGVyKWN1cnJlbnRTZXNzaW9uLmdldEF0dHJpYnV0ZSgiY29udHJvbGxlciIpOwotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICBub2RlSUQuYXBwZW5kKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci0gICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci08anNwOmluY2x1ZGUgcGFnZT0iPCU9ZnJhZy5nZXRJbmZvcm1hdGlvbkZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTREluZm9fdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNESW5mb190b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlNzRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNESW5mb190b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTwlCi0gICBTdHJpbmcgc2Vzc2lvbklkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCk7Ci0gICBIdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLlNFU1NJT05JRCkpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5OT0RFSUQpKSk7Ci0gICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIElYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFdTRExBY3Rpb25JbnB1dHMuRlJBR01FTlRfSUQpKTsgICAKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfWFNEX0lORk9STUFUSU9OX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBvblVubG9hZD0idG9wLm9wZW5lci54c2RJbmZvRGlhbG9nQ2xvc2VkPXRydWUiIGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciI+Ci0gICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBoZWlnaHQ9MjUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGJvcmRlcj0wPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvd3NkbC5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1mcmFnLmdldE5hbWUoKSU+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB0b3Aub3BlbmVyLnhzZEluZm9EaWFsb2dDbG9zZWQgPSBmYWxzZTsKLTwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4V0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNEYXRlVGltZUZpeFdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzkxZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lRml4V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnhzZC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotU3RyaW5nIGZyYWdJRFN0cmluZyA9IGZyYWdJRC50b1N0cmluZygpOwotSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilmcmFnLmdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci1YU0RUeXBlRGVmaW5pdGlvbiB4c2RCdWlsdEluVHlwZSA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5yZXNvbHZlVG9YU0RCdWlsdEluVHlwZURlZmluaXRpb24oc2ltcGxlVHlwZSk7Ci0lPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8bGFiZWwgZm9yPSI8JT1mcmFnSURTdHJpbmclPiI+PGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+PC9sYWJlbD4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8JT0oeHNkQnVpbHRJblR5cGUgIT0gbnVsbCA/IHhzZEJ1aWx0SW5UeXBlLmdldE5hbWUoKSA6IHNpbXBsZVR5cGUuZ2V0TmFtZSgpKSU+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8JQotICAgICAgaWYgKCFmcmFnLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKGZyYWdJRFN0cmluZykpIHsKLSAgICAgICU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICA8JQotICAgICAgfQotICAgICAgJT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDwlCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkQ29uZmlnLmdldE1heE9jY3VycygpOyBpKyspIHsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCB3aWR0aD0iNjAlIj4KLSAgICAgIDwlCi0gICAgICBTdHJpbmcgdmFsdWUgPSBmcmFnLmdldFBhcmFtZXRlclZhbHVlKGZyYWcuZ2V0SUQoKSwgaSk7Ci0gICAgICAlPgotICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZ0lEU3RyaW5nJT4iIHZhbHVlPSI8JT0oKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiAiIiklPiIgc2l6ZT0iNTAiIGNsYXNzPSJ0YWJsZXRleHRlbnRlciI+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5DYWxlbmRhckJyb3dzZXIoPCU9cmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEUpJT4sJ2NvbnRlbnRib3JkZXInLCc8JT1mcmFnSURTdHJpbmclPicsPCU9aSU+KSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjMwJSI+Jm5ic3A7PC90ZD4gICAgCi0gIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVSYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRGF0ZVRpbWVSYW5nZVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODJkZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0RhdGVUaW1lUmFuZ2VXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnhzZC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTREZyYWdtZW50IGZyYWcgPSBvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotWFNEU2ltcGxlVHlwZURlZmluaXRpb24gc2ltcGxlVHlwZSA9IChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbilmcmFnLmdldFhTRFR5cGVEZWZpbml0aW9uKCk7Ci1YU0RUeXBlRGVmaW5pdGlvbiB4c2RCdWlsdEluVHlwZSA9IFhTRFR5cGVEZWZpbml0aW9uVXRpbC5yZXNvbHZlVG9YU0RCdWlsdEluVHlwZURlZmluaXRpb24oc2ltcGxlVHlwZSk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKS50b1N0cmluZygpOwotaW50IGNhbGVuZGFyVHlwZSA9IEludGVnZXIucGFyc2VJbnQocmVxdWVzdC5nZXRQYXJhbWV0ZXIoQWN0aW9uSW5wdXRzLkNBTEVOREFSX1RZUEUpKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxsYWJlbCBmb3I9IjwlPWZyYWcuZ2V0SUQoKSU+Ij48YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT48L2xhYmVsPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDwlPSh4c2RCdWlsdEluVHlwZSAhPSBudWxsID8geHNkQnVpbHRJblR5cGUuZ2V0TmFtZSgpIDogc2ltcGxlVHlwZS5nZXROYW1lKCkpJT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmFkZFNpbXBsZUF0b21pY0RhdGVUaW1lUm93cyg8JT1jYWxlbmRhclR5cGUlPiwnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgbnVsbCwgPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4pIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkRGF0ZVRpbWVSb3dzKDwlPWNhbGVuZGFyVHlwZSU+LCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLDwlPXhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSU+KSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgPCUKLSAgICAgIGlmICghZnJhZy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhmcmFnLmdldElEKCkpKSB7Ci0gICAgICAlPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgPCUKLSAgICAgIH0KLSAgICAgICU+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHNwYW4gaWQ9IjwlPXRhYmxlQ29udGFpbmVySUQlPiI+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJyYW5nZWZyYWd0YWJsZSIgOiAiaW5uZXJyYW5nZWZyYWd0YWJsZSIpJT4iPgotICA8dHI+Ci0gICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPXRhYmxlQ29udGFpbmVySUQlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgPHRoIHdpZHRoPSI5MCUiIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVkFMVUVTIiklPjwvdGg+Ci0gICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FDVElPTlMiKSU+PC90aD4KLSAgPC90cj4KLTwvdGFibGU+Ci08L3NwYW4+Ci08JQotU3RyaW5nW10gdmFsdWVzID0gZnJhZy5nZXRQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKTsKLWludCBpID0gMDsKLWlmICh2YWx1ZXMgIT0gbnVsbCkgewotICBmb3IgKCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBhZGRTaW1wbGVBdG9taWNEYXRlVGltZVJvd3MoPCU9Y2FsZW5kYXJUeXBlJT4sIjwlPXRhYmxlQ29udGFpbmVySUQlPiIsIjwlPWZyYWcuZ2V0SUQoKSU+IiwiPCU9ZnJhZy5nZXRJRCgpJT4iLCI8JT12YWx1ZXNbaV0lPiIsPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4pOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotfQotZm9yICggOyBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGFkZFNpbXBsZUF0b21pY0RhdGVUaW1lUm93cyg8JT1jYWxlbmRhclR5cGUlPiwiPCU9dGFibGVDb250YWluZXJJRCU+IiwiPCU9ZnJhZy5nZXRJRCgpJT4iLCI8JT1mcmFnLmdldElEKCklPiIsbnVsbCw8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPik7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLSU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRW51bUZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRW51bUZpeFdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMDkyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0VudW1GaXhXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotICAgTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLSAgIFdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotICAgWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50IGZyYWcgPSAoWFNEU2ltcGxlQXRvbWljRW51bUZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci0gICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgIFhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSU+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxsYWJlbCBmb3I9IjwlPWZyYWcuZ2V0SUQoKSU+Ij48YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT48L2xhYmVsPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDwlPSh4c2RCdWlsdEluVHlwZSAhPSBudWxsID8geHNkQnVpbHRJblR5cGUuZ2V0TmFtZSgpIDogc2ltcGxlVHlwZS5nZXROYW1lKCkpJT4KLSAgICA8L3RkPgotICAgIDx0ZD4KLTwlCi0gICBpZiAoIWZyYWcudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKSkKLSAgIHsKLSU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci08JQotICAgfQotJT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci08JQotICAgT3B0aW9uVmVjdG9yIG9wdGlvblZlY3RvciA9IGZyYWcuZ2V0T3B0aW9uVmVjdG9yKCk7Ci0gICBmb3IgKGludCBpID0gMDsgaSA8IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsgaSsrKQotICAgewotJT4KLSAgPHRyPgotICAgIDx0ZD4KLTwlCi0gICAgIFN0cmluZyBzZWxlY3RlZFZhbHVlID0gZnJhZy5nZXRQYXJhbWV0ZXJWYWx1ZShmcmFnLmdldElEKCksIGkpOwotJT4KLSAgICAgIDxzZWxlY3QgaWQ9IjwlPWZyYWcuZ2V0SUQoKSU+IiBuYW1lPSI8JT1mcmFnLmdldElEKCklPiIgY2xhc3M9InNlbGVjdGxpc3QiPgotPCUgICAgICAgICAgICAgIAotICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9wdGlvblZlY3Rvci5zaXplKCk7IGorKykKLSAgICAgewotICAgICAgIFN0cmluZyBkaXNwbGF5VmFsdWUgPSBvcHRpb25WZWN0b3IuZ2V0RGlzcGxheVZhbHVlKGopOwotICAgICAgIFN0cmluZyB2YWx1ZSA9IG9wdGlvblZlY3Rvci5nZXRWYWx1ZShqKTsKLSAgICAgICBpZiAodmFsdWUuZXF1YWxzKHNlbGVjdGVkVmFsdWUpKQotICAgICAgIHsKLSU+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPXZhbHVlJT4iIHNlbGVjdGVkPjwlPWRpc3BsYXlWYWx1ZSU+Ci08JQotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotJT4KLSAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9dmFsdWUlPiI+PCU9ZGlzcGxheVZhbHVlJT4KLTwlCi0gICAgICAgfQotICAgICB9Ci0lPgotICAgICAgPC9zZWxlY3Q+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwlCi0gICB9Ci0gICU+Ci08L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0VudW1SYW5nZVdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4M2I4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRW51bVJhbmdlV0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC5pbXBsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIE5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci0gICBXU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgIFhTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudCBmcmFnID0gKFhTRFNpbXBsZUF0b21pY0VudW1GcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotICAgT3B0aW9uVmVjdG9yIG9wdGlvblZlY3RvciA9IGZyYWcuZ2V0T3B0aW9uVmVjdG9yKCk7Ci0gICBYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci0gICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLSAgIFhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLSAgIFN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotICAgU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci0gICBTdHJpbmcgb3B0aW9uc0NvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuWFNEX0FUT01JQ19FTlVNX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLSU+Ci08c3BhbiBpZD0iPCU9b3B0aW9uc0NvbnRhaW5lcklEJT4iPgotPCUKLSAgIGZvciAoaW50IGogPSAwOyBqIDwgb3B0aW9uVmVjdG9yLnNpemUoKTsgaisrKSB7Ci0lPgotICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPW9wdGlvbnNDb250YWluZXJJRCU+IiB2YWx1ZT0iPCU9b3B0aW9uVmVjdG9yLmdldERpc3BsYXlWYWx1ZShqKSU+Ij4KLSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1vcHRpb25zQ29udGFpbmVySUQlPiIgdmFsdWU9IjwlPW9wdGlvblZlY3Rvci5nZXRWYWx1ZShqKSU+Ij4KLTwlCi0gICB9Ci0lPgotPC9zcGFuPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGFkZFNpbXBsZUF0b21pY0VudW1Sb3dzKHRhYmxlQ29udGFpbmVySUQsIG9wdGlvbnNDb250YWluZXJJRCwgaWQsIG5hbWUsIHZhbHVlLCBtYXhPY2N1cnMpIHsKLSAgICBpZiAoY2hlY2tNYXhPY2N1cnNSZWFjaGVkKHRhYmxlQ29udGFpbmVySUQsIG1heE9jY3VycykpCi0gICAgICByZXR1cm47Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotCi0gICAgdmFyIHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpOwotICAgIGNvbHVtbjEuYXBwZW5kQ2hpbGQoc2VsZWN0KTsKLSAgICBzZWxlY3QuaWQgPSBpZDsKLSAgICBzZWxlY3QubmFtZSA9IG5hbWU7Ci0gICAgc2VsZWN0LmNsYXNzTmFtZSA9ICJzZWxlY3RsaXN0IjsKLSAgICB2YXIgb3B0aW9ucyA9IGdldE9wdGlvbnMob3B0aW9uc0NvbnRhaW5lcklEKTsKLSAgICB2YXIgaW5kZXggPSAwOwotICAgIGZvciAodmFyIGsgPSAwOyBrIDwgb3B0aW9ucy5sZW5ndGg7IGsgKz0gMikgewotICAgICAgc2VsZWN0Lm9wdGlvbnNbaW5kZXhdID0gbmV3IE9wdGlvbihvcHRpb25zW2tdLnZhbHVlLG9wdGlvbnNbaysxXS52YWx1ZSk7Ci0gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA9PSBvcHRpb25zW2srMV0udmFsdWUpCi0gICAgICAgIHNlbGVjdC5vcHRpb25zW2luZGV4XS5zZWxlY3RlZCA9IHRydWU7Ci0gICAgICBpbmRleCsrOwotICAgIH0KLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLQotICBmdW5jdGlvbiBnZXRPcHRpb25zKG9wdGlvbnNDb250YWluZXJJRCkgewotICAgIHZhciBvcHRpb25zQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3B0aW9uc0NvbnRhaW5lcklEKTsKLSAgICB2YXIgb3B0aW9ucyA9IG9wdGlvbnNDb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0Iik7Ci0gICAgcmV0dXJuIG9wdGlvbnM7Ci0gIH0KLTwvc2NyaXB0PgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8bGFiZWwgZm9yPSI8JT1mcmFnLmdldElEKCklPiI+PGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+PC9sYWJlbD4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8JT0oeHNkQnVpbHRJblR5cGUgIT0gbnVsbCA/IHhzZEJ1aWx0SW5UeXBlLmdldE5hbWUoKSA6IHNpbXBsZVR5cGUuZ2V0TmFtZSgpKSU+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGRTaW1wbGVBdG9taWNFbnVtUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPW9wdGlvbnNDb250YWluZXJJRCU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgbnVsbCwgPCU9eHNkQ29uZmlnLmdldE1heE9jY3VycygpJT4pIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX0FERCIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgPCU9eHNkQ29uZmlnLmdldE1pbk9jY3VycygpJT4pIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1JFTU9WRSIpJT48L2E+Ci0gICAgPC90ZD4KLSAgICA8dGQ+Ci0gICAgICA8JQotICAgICAgaWYgKCFmcmFnLnZhbGlkYXRlUGFyYW1ldGVyVmFsdWVzKGZyYWcuZ2V0SUQoKSkpIHsKLSAgICAgICU+Ci0gICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICA8JQotICAgICAgfQotICAgICAgJT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJRCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9WQUxVRVMiKSU+PC90aD4KLSAgPC90cj4KLTwvdGFibGU+Ci08L3NwYW4+Ci08JQotU3RyaW5nW10gdmFsdWVzID0gZnJhZy5nZXRQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKTsKLWludCBpID0gMDsKLWlmICh2YWx1ZXMgIT0gbnVsbCkgewotICBmb3IgKCA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBhZGRTaW1wbGVBdG9taWNFbnVtUm93cygnPCU9dGFibGVDb250YWluZXJJRCU+JywgJzwlPW9wdGlvbnNDb250YWluZXJJRCU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgJzwlPWZyYWcuZ2V0SUQoKSU+JywgJzwlPXZhbHVlc1tpXSU+JywgJzwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+Jyk7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci19Ci1mb3IgKCA7IGkgPCB4c2RDb25maWcuZ2V0TWluT2NjdXJzKCk7IGkrKykgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgYWRkU2ltcGxlQXRvbWljRW51bVJvd3MoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsICc8JT1vcHRpb25zQ29udGFpbmVySUQlPicsICc8JT1mcmFnLmdldElEKCklPicsICc8JT1mcmFnLmdldElEKCklPicsIG51bGwsICc8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPicpOwotICA8L3NjcmlwdD4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY0ZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRml4V0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NjAxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljRml4V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuaW1wbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZnJhZy5nZXRYU0RUeXBlRGVmaW5pdGlvbigpOwotWFNEVHlwZURlZmluaXRpb24geHNkQnVpbHRJblR5cGUgPSBYU0RUeXBlRGVmaW5pdGlvblV0aWwucmVzb2x2ZVRvWFNEQnVpbHRJblR5cGVEZWZpbml0aW9uKHNpbXBsZVR5cGUpOwotJT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGxhYmVsIGZvcj0iPCU9ZnJhZy5nZXRJRCgpJT4iPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlblhTREluZm9EaWFsb2coJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb24uZ2V0SWQoKSxzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksZnJhZ0lELnRvU3RyaW5nKCkpKSklPicpIj48JT1mcmFnLmdldE5hbWUoKSU+PC9hPjwvbGFiZWw+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPCU9KHhzZEJ1aWx0SW5UeXBlICE9IG51bGwgPyB4c2RCdWlsdEluVHlwZS5nZXROYW1lKCkgOiBzaW1wbGVUeXBlLmdldE5hbWUoKSklPgotICAgIDwvdGQ+Ci0gICAgPHRkPgotICAgICAgPCUKLSAgICAgIGlmICghZnJhZy52YWxpZGF0ZVBhcmFtZXRlclZhbHVlcyhmcmFnLmdldElEKCkpKSB7Ci0gICAgICAlPgotICAgICAgPCU9SFRNTFV0aWxzLnJlZEFzdGVyaXNrKCklPgotICAgICAgPCUKLSAgICAgIH0KLSAgICAgICU+Ci0gICAgPC90ZD4KLSAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotICA8JQotICBmb3IgKGludCBpID0gMDsgaSA8IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsgaSsrKSB7Ci0gICU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8JQotICAgICAgU3RyaW5nIHZhbHVlID0gZnJhZy5nZXRQYXJhbWV0ZXJWYWx1ZShmcmFnLmdldElEKCksIGkpOwotICAgICAgJT4KLSAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iPCU9ZnJhZy5nZXRJRCgpJT4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9KCh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogIiIpJT4iIHNpemU9IjUwIiBjbGFzcz0idGFibGV0ZXh0ZW50ZXIiPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljSW5mb0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmNlZmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVBdG9taWNJbmZvRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0ic2Vzc2lvbklEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi1IdHRwU2Vzc2lvbiBjdXJyZW50U2Vzc2lvbiA9IChIdHRwU2Vzc2lvbilhcHBsaWNhdGlvbi5nZXRBdHRyaWJ1dGUoc2Vzc2lvbklELnRvU3RyaW5nKCkpOwotQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgc2VsZWN0ZWROb2RlID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCkuZ2V0Tm9kZShJbnRlZ2VyLnBhcnNlSW50KG5vZGVJRC50b1N0cmluZygpKSk7Ci1XU0RMT3BlcmF0aW9uRWxlbWVudCBvcGVyRWxlbWVudCA9IChXU0RMT3BlcmF0aW9uRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RGcmFnbWVudCBmcmFnID0gb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHNpbXBsZVR5cGUgPSAoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpLmdldFhTRENvbXBvbmVudCgpOwotCi1pbnQgbWluTGVuZ3RoID0gLTE7Ci1pbnQgbWF4TGVuZ3RoID0gLTE7Ci1WZWN0b3IgcGF0dGVyblZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLVN0cmluZyB3aGl0ZVNwYWNlID0gbnVsbDsKLWJvb2xlYW4gbWluRXhjbHVzaXZlID0gdHJ1ZTsKLU9iamVjdCBtaW4gPSBudWxsOwotYm9vbGVhbiBtYXhFeGNsdXNpdmUgPSB0cnVlOwotT2JqZWN0IG1heCA9IG51bGw7Ci1pbnQgdG90YWxEaWdpdHMgPSAtMTsKLWludCBmcmFjdGlvbkRpZ2l0cyA9IC0xOwotCi1YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBjdXJyVHlwZSA9IHNpbXBsZVR5cGU7Ci13aGlsZSAoIVhTRFR5cGVEZWZpbml0aW9uVXRpbC5pc1Jvb3RUeXBlRGVmaW5pdGlvbihjdXJyVHlwZSkpIHsKLSAgLy8gbWluTGVuZ3RoCi0gIGlmIChtaW5MZW5ndGggPCAwKSB7Ci0gICAgWFNETGVuZ3RoRmFjZXQgeHNkTGVuZ3RoRmFjZXQgPSBjdXJyVHlwZS5nZXRMZW5ndGhGYWNldCgpOwotICAgIFhTRE1pbkxlbmd0aEZhY2V0IHhzZE1pbkxlbmd0aEZhY2V0ID0gY3VyclR5cGUuZ2V0TWluTGVuZ3RoRmFjZXQoKTsKLSAgICAvLyBwb3J0IHRvIG9yZy5lY2xpcHNlLnhzZAotICAgIGlmICh4c2RMZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgbWluTGVuZ3RoID0geHNkTGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICBlbHNlIGlmICh4c2RNaW5MZW5ndGhGYWNldCAhPSBudWxsKQotICAgICAgbWluTGVuZ3RoID0geHNkTWluTGVuZ3RoRmFjZXQuZ2V0VmFsdWUoKTsKLSAgfQotICAvLyBtYXhMZW5ndGgKLSAgaWYgKG1heExlbmd0aCA8IDApIHsKLSAgICBYU0RMZW5ndGhGYWNldCB4c2RMZW5ndGhGYWNldCA9IGN1cnJUeXBlLmdldExlbmd0aEZhY2V0KCk7Ci0gICAgWFNETWF4TGVuZ3RoRmFjZXQgeHNkTWF4TGVuZ3RoRmFjZXQgPSBjdXJyVHlwZS5nZXRNYXhMZW5ndGhGYWNldCgpOwotICAgIC8vIHBvcnQgdG8gb3JnLmVjbGlwc2UueHNkCi0gICAgaWYgKHhzZExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICBtYXhMZW5ndGggPSB4c2RMZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICAgIGVsc2UgaWYgKHhzZE1heExlbmd0aEZhY2V0ICE9IG51bGwpCi0gICAgICBtYXhMZW5ndGggPSB4c2RNYXhMZW5ndGhGYWNldC5nZXRWYWx1ZSgpOwotICB9Ci0gIC8vIHBhdHRlcm5WZWN0b3IKLSAgRUxpc3QgeHNkUGF0dGVybkZhY2V0cyA9IGN1cnJUeXBlLmdldFBhdHRlcm5GYWNldHMoKTsKLSAgaWYgKHhzZFBhdHRlcm5GYWNldHMgIT0gbnVsbCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgeHNkUGF0dGVybkZhY2V0cy5zaXplKCk7IGkrKykgewotICAgICAgWFNEUGF0dGVybkZhY2V0IHhzZFBhdHRlcm5GYWNldCA9IChYU0RQYXR0ZXJuRmFjZXQpeHNkUGF0dGVybkZhY2V0cy5nZXQoaSk7Ci0gICAgICBFTGlzdCBwYXR0ZXJucyA9IHhzZFBhdHRlcm5GYWNldC5nZXRWYWx1ZSgpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXR0ZXJucy5zaXplKCk7IGorKykgewotICAgICAgICBwYXR0ZXJuVmVjdG9yLmFkZChwYXR0ZXJucy5nZXQoaikpOwotICAgICAgfQotICAgIH0KLSAgfQotICAvLyB3aGl0ZVNwYWNlCi0gIGlmICh3aGl0ZVNwYWNlID09IG51bGwpIHsKLSAgICBYU0RXaGl0ZVNwYWNlRmFjZXQgeHNkV2hpdGVTcGFjZUZhY2V0ID0gY3VyclR5cGUuZ2V0V2hpdGVTcGFjZUZhY2V0KCk7Ci0gICAgLy8gcG9ydCB0byBvcmcuZWNsaXBzZS54c2QKLSAgICBpZiAoeHNkV2hpdGVTcGFjZUZhY2V0ICE9IG51bGwpCi0gICAgICB3aGl0ZVNwYWNlID0geHNkV2hpdGVTcGFjZUZhY2V0LmdldFZhbHVlKCkuZ2V0TmFtZSgpOwotICB9Ci0gIC8vIG1pbiBpbi9leGNsdXNpdmUKLSAgaWYgKG1pbiA9PSBudWxsICkgewotICAgIFhTRE1pbkV4Y2x1c2l2ZUZhY2V0IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0ID0gY3VyclR5cGUuZ2V0TWluRXhjbHVzaXZlRmFjZXQoKTsKLSAgICBYU0RNaW5JbmNsdXNpdmVGYWNldCB4c2RNaW5JbmNsdXNpdmVGYWNldCA9IGN1cnJUeXBlLmdldE1pbkluY2x1c2l2ZUZhY2V0KCk7Ci0gICAgaWYgKHhzZE1pbkV4Y2x1c2l2ZUZhY2V0ICE9IG51bGwpIHsKLSAgICAgIG1pbiA9IHhzZE1pbkV4Y2x1c2l2ZUZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICBtaW5FeGNsdXNpdmUgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlIGlmICh4c2RNaW5JbmNsdXNpdmVGYWNldCAhPSBudWxsKSB7Ci0gICAgICBtaW4gPSB4c2RNaW5JbmNsdXNpdmVGYWNldC5nZXRWYWx1ZSgpOwotICAgICAgbWluRXhjbHVzaXZlID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIC8vIG1heCBpbi9leGNsdXNpdmUKLSAgaWYgKG1heCA9PSBudWxsKSB7Ci0gICAgWFNETWF4RXhjbHVzaXZlRmFjZXQgeHNkTWF4RXhjbHVzaXZlRmFjZXQgPSBjdXJyVHlwZS5nZXRNYXhFeGNsdXNpdmVGYWNldCgpOwotICAgIFhTRE1heEluY2x1c2l2ZUZhY2V0IHhzZE1heEluY2x1c2l2ZUZhY2V0ID0gY3VyclR5cGUuZ2V0TWF4SW5jbHVzaXZlRmFjZXQoKTsKLSAgICBpZiAoeHNkTWF4RXhjbHVzaXZlRmFjZXQgIT0gbnVsbCkgewotICAgICAgbWF4ID0geHNkTWF4RXhjbHVzaXZlRmFjZXQuZ2V0VmFsdWUoKTsKLSAgICAgIG1heEV4Y2x1c2l2ZSA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKHhzZE1heEluY2x1c2l2ZUZhY2V0ICE9IG51bGwpIHsKLSAgICAgIG1heCA9IHhzZE1heEluY2x1c2l2ZUZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICBtYXhFeGNsdXNpdmUgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgLy8gdG90YWxEaWdpdHMKLSAgaWYgKHRvdGFsRGlnaXRzIDwgMCkgewotICAgIFhTRFRvdGFsRGlnaXRzRmFjZXQgeHNkVG90YWxEaWdpdHNGYWNldCA9IGN1cnJUeXBlLmdldFRvdGFsRGlnaXRzRmFjZXQoKTsKLSAgICBpZiAoeHNkVG90YWxEaWdpdHNGYWNldCAhPSBudWxsKQotICAgICAgdG90YWxEaWdpdHMgPSB4c2RUb3RhbERpZ2l0c0ZhY2V0LmdldFZhbHVlKCk7Ci0gIH0KLSAgLy8gZnJhY3Rpb25EaWdpdHMKLSAgaWYgKGZyYWN0aW9uRGlnaXRzIDwgMCkgewotICAgIFhTREZyYWN0aW9uRGlnaXRzRmFjZXQgeHNkRnJhY3Rpb25EaWdpdHNGYWNldCA9IGN1cnJUeXBlLmdldEZyYWN0aW9uRGlnaXRzRmFjZXQoKTsKLSAgICBpZiAoeHNkRnJhY3Rpb25EaWdpdHNGYWNldCAhPSBudWxsKQotICAgICAgZnJhY3Rpb25EaWdpdHMgPSB4c2RGcmFjdGlvbkRpZ2l0c0ZhY2V0LmdldFZhbHVlKCk7Ci0gIH0KLSAgLy8gd2FsayB0byBiYXNlIHR5cGUKLSAgY3VyclR5cGUgPSBjdXJyVHlwZS5nZXRCYXNlVHlwZURlZmluaXRpb24oKTsKLX0KLSU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9mcmFnbWVudC9YU0REZWZhdWx0SW5mb0ZyYWdtZW50SlNQLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPHRhYmxlPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQkFTRV9UWVBFIiklPgotICAgIDwvdGg+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgPCU9WFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKS5nZXROYW1lKCklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08JQotU3RyaW5nIG1pbkxlbmd0aFN0cmluZyA9IChtaW5MZW5ndGggPCAwKSA/IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VOQk9VTkRFRCIpIDogU3RyaW5nLnZhbHVlT2YobWluTGVuZ3RoKTsKLVN0cmluZyBtYXhMZW5ndGhTdHJpbmcgPSAobWF4TGVuZ3RoIDwgMCkgPyB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VTkJPVU5ERUQiKSA6IFN0cmluZy52YWx1ZU9mKG1heExlbmd0aCk7Ci1TdHJpbmdbXSBsZW5ndGhWYWx1ZXMgPSB7bWluTGVuZ3RoU3RyaW5nLCBtYXhMZW5ndGhTdHJpbmd9OwotaWYgKG1pbkxlbmd0aCA+PSAwIHx8IG1heExlbmd0aCA+PSAwKSB7Ci0lPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEVOR1RIIiklPgotICAgICAgPC90aD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xFTkdUSF9WQUxVRSIsIGxlbmd0aFZhbHVlcyklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUKLX0KLSU+Ci0KLTwlCi1pZiAocGF0dGVyblZlY3Rvci5zaXplKCkgPiAwKSB7Ci0gIFN0cmluZyBwYXR0ZXJuQ29udGFpbmVySUQgPSAiOjpwYXR0ZXJuIjsKLSAgU3RyaW5nIHhwYXR0ZXJuQ29udGFpbmVySUQgPSAieDo6cGF0dGVybiI7Ci0lPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9cGF0dGVybkNvbnRhaW5lcklEJT4nLCc8JT14cGF0dGVybkNvbnRhaW5lcklEJT4nKSI+PGltZyBuYW1lPSI8JT14cGF0dGVybkNvbnRhaW5lcklEJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RvcGVuZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfT1BFTkVEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgICA8c3Ryb25nPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1BBVFRFUk4iKSU+PC9zdHJvbmc+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxzcGFuIGlkPSI8JT1wYXR0ZXJuQ29udGFpbmVySUQlPiI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUEFUVEVSTiIpJT4KLSAgICAgIDwvdGg+Ci0gICAgPC90cj4KLSAgICA8JQotICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcGF0dGVyblZlY3Rvci5zaXplKCk7IGsrKykgewotICAgICU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgPCU9KFN0cmluZylwYXR0ZXJuVmVjdG9yLmdldChrKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwlCi0gICAgfQotICAgICU+Ci0gIDwvdGFibGU+Ci0gIDwvc3Bhbj4KLTwlCi19Ci0lPgotCi08JQotaWYgKHdoaXRlU3BhY2UgIT0gbnVsbCkgewotJT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dISVRFU1BBQ0UiKSU+Ci0gICAgICA8L3RoPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgPCU9d2hpdGVTcGFjZSU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotfQotJT4KLQotPCUKLVN0cmluZyBsb3dlckJvdW5kOwotaWYgKG1pbkV4Y2x1c2l2ZSkKLSAgbG93ZXJCb3VuZCA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01JTl9FWENMVVNJVkUiLCAobWluID09IG51bGwpID8gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5CT1VOREVEIikgOiBtaW4udG9TdHJpbmcoKSk7Ci1lbHNlCi0gIGxvd2VyQm91bmQgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9NSU5fSU5DTFVTSVZFIiwgKG1pbiA9PSBudWxsKSA/IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VOQk9VTkRFRCIpIDogbWluLnRvU3RyaW5nKCkpOwotU3RyaW5nIHVwcGVyQm91bmQ7Ci1pZiAobWF4RXhjbHVzaXZlKQotICB1cHBlckJvdW5kID0gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTUFYX0VYQ0xVU0lWRSIsIChtYXggPT0gbnVsbCkgPyB3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VTkJPVU5ERUQiKSA6IG1heC50b1N0cmluZygpKTsKLWVsc2UKLSAgdXBwZXJCb3VuZCA9IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX01BWF9JTkNMVVNJVkUiLCAobWF4ID09IG51bGwpID8gd3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5CT1VOREVEIikgOiBtYXgudG9TdHJpbmcoKSk7Ci1pZiAobWluICE9IG51bGwgfHwgbWF4ICE9IG51bGwpIHsKLSU+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQgaGVpZ2h0PTIwPiZuYnNwOzwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgIDx0cj4KLSAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICA8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SQU5HRV9PRl9WQUxVRVMiKSU+Ci0gICAgICA8L3RoPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgPCU9bG93ZXJCb3VuZCArIHVwcGVyQm91bmQlPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUKLX0KLSU+Ci0KLTwlCi1pZiAodG90YWxEaWdpdHMgPj0gMCkgewotJT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBoZWlnaHQ9MjA+Jm5ic3A7PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgPHRyPgotICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgIDwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1RPVEFMX0RJR0lUUyIpJT4KLSAgICAgIDwvdGg+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICA8JT10b3RhbERpZ2l0cyU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08JQotfQotJT4KLQotPCUKLWlmIChmcmFjdGlvbkRpZ2l0cyA+PSAwKSB7Ci0lPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkIGhlaWdodD0yMD4mbmJzcDs8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICA8dHI+Ci0gICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRlJBQ1RJT05fRElHSVRTIiklPgotICAgICAgPC90aD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgIDwlPWZyYWN0aW9uRGlnaXRzJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY1JGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkZDRiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUkZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQudXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS54c2QuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgb3Blck5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLVhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLVN0cmluZ1tdIGxhYmVsQXJncyA9IHtmcmFnLmdldE5hbWUoKSwgKHhzZEJ1aWx0SW5UeXBlICE9IG51bGwgPyB4c2RCdWlsdEluVHlwZS5nZXROYW1lKCkgOiBzaW1wbGVUeXBlLmdldE5hbWUoKSl9OwotU3RyaW5nW10gcGFyYW1zID0gZnJhZy5nZXRQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKTsKLSU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggaWQ9IjwlPWZyYWcuZ2V0SUQoKSU+IiBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BVE9NSUNfTkFNRV9UWVBFIiwgbGFiZWxBcmdzKSU+Ci0gICAgPC90aD4KLSAgICA8dGQgaGVhZGVycz0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB3aWR0aD0iMTAwJSIgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8JT0oKHBhcmFtcyAhPSBudWxsICYmIHBhcmFtcy5sZW5ndGggPiAwKSA/IEhUTUxVdGlscy5jaGFyYWN0ZXJzVG9IVE1MRW50aXRpZXMocGFyYW1zWzBdKSA6IHdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05VTEwiKSklPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci0gIDwlCi0gIGlmIChwYXJhbXMgIT0gbnVsbCkgewotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgJT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD48L3RkPgotICAgICAgICA8dGQgaGVhZGVycz0iPCU9ZnJhZy5nZXRJRCgpJT4iIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB3aWR0aD0iMTAwJSIgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICAgICAgPCU9SFRNTFV0aWxzLmNoYXJhY3RlcnNUb0hUTUxFbnRpdGllcyhwYXJhbXNbaV0pJT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPCUKLSAgICB9Ci0gIH0KLSAgJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUmFuZ2VXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUF0b21pY1JhbmdlV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzOWU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlQXRvbWljUmFuZ2VXRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNERnJhZ21lbnQgZnJhZyA9IG9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlID0gKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKWZyYWcuZ2V0WFNEVHlwZURlZmluaXRpb24oKTsKLVhTRFR5cGVEZWZpbml0aW9uIHhzZEJ1aWx0SW5UeXBlID0gWFNEVHlwZURlZmluaXRpb25VdGlsLnJlc29sdmVUb1hTREJ1aWx0SW5UeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGFkZFNpbXBsZUF0b21pY1Jvd3ModGFibGVDb250YWluZXJJRCwgaWQsIG5hbWUsIHZhbHVlLCBtYXhPY2N1cnMpIHsKLSAgICBpZiAoY2hlY2tNYXhPY2N1cnNSZWFjaGVkKHRhYmxlQ29udGFpbmVySUQsIG1heE9jY3VycykpCi0gICAgICByZXR1cm47Ci0gICAgdHdpc3RPcGVuKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIHZhciB0YWJsZUJvZHkgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5pdGVtKDApOwotICAgIHZhciBuZXdSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpOwotICAgIHZhciBjb2x1bW4wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotCi0gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGlucHV0KTsKLSAgICBpbnB1dC50eXBlID0gInRleHQiOwotICAgIGlucHV0LmlkID0gaWQ7Ci0gICAgaW5wdXQubmFtZSA9IG5hbWU7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoID4gMCkKLSAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7Ci0gICAgaW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLQotICAgIGNvbHVtbjAuY2xhc3NOYW1lID0gImNoZWNrYm94Y2VsbHMiOwotICAgIGNvbHVtbjEuY2xhc3NOYW1lID0gInRhYmxlY2VsbHMiOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4wKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMSk7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0KLTwvc2NyaXB0PgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8bGFiZWwgZm9yPSI8JT1mcmFnLmdldElEKCklPiI+PGEgaHJlZj0iamF2YXNjcmlwdDpvcGVuWFNESW5mb0RpYWxvZygnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5YU0RJbmZvRGlhbG9nQWN0aW9uLmdldEFjdGlvbkxpbmsoc2Vzc2lvbi5nZXRJZCgpLHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSxmcmFnSUQudG9TdHJpbmcoKSkpKSU+JykiPjwlPWZyYWcuZ2V0TmFtZSgpJT48L2E+PC9sYWJlbD4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8JT0oeHNkQnVpbHRJblR5cGUgIT0gbnVsbCA/IHhzZEJ1aWx0SW5UeXBlLmdldE5hbWUoKSA6IHNpbXBsZVR5cGUuZ2V0TmFtZSgpKSU+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwPgotICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDphZGRTaW1wbGVBdG9taWNSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCAnPCU9ZnJhZy5nZXRJRCgpJT4nLCBudWxsLCA8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNoZWNrTWluT2NjdXJzQW5kUmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWluT2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZD4KLSAgICAgIDwlCi0gICAgICBpZiAoIWZyYWcudmFsaWRhdGVQYXJhbWV0ZXJWYWx1ZXMoZnJhZy5nZXRJRCgpKSkgewotICAgICAgJT4KLSAgICAgIDwlPUhUTUxVdGlscy5yZWRBc3RlcmlzaygpJT4KLSAgICAgIDwlCi0gICAgICB9Ci0gICAgICAlPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT10YWJsZUNvbnRhaW5lcklEJT4iPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAicmFuZ2VmcmFndGFibGUiIDogImlubmVycmFuZ2VmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1ZBTFVFUyIpJT48L3RoPgotICA8L3RyPgotPC90YWJsZT4KLTwvc3Bhbj4KLTwlCi1TdHJpbmdbXSB2YWx1ZXMgPSBmcmFnLmdldFBhcmFtZXRlclZhbHVlcyhmcmFnLmdldElEKCkpOwotaW50IGkgPSAwOwotaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0gIGZvciAoIDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIGFkZFNpbXBsZUF0b21pY1Jvd3MoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsICc8JT1mcmFnLmdldElEKCklPicsICc8JT1mcmFnLmdldElEKCklPicsICc8JT12YWx1ZXNbaV0lPicsICc8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPicpOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotfQotZm9yICggOyBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIGFkZFNpbXBsZUF0b21pY1Jvd3MoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsICc8JT1mcmFnLmdldElEKCklPicsICc8JT1mcmFnLmdldElEKCklPicsIG51bGwsICc8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPicpOwotICA8L3NjcmlwdD4KLTwlCi19Ci0lPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RGaXhXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RGaXhXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWMyMzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVMaXN0Rml4V0ZyYWdtZW50SlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNEU2ltcGxlTGlzdEZyYWdtZW50IGZyYWcgPSAoSVhTRFNpbXBsZUxpc3RGcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGZyYWcuZ2V0QWxsRnJhZ21lbnRzKCk7Ci0lPgotPHRhYmxlIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAiZml4ZnJhZ3RhYmxlIiA6ICJpbm5lcmZpeGZyYWd0YWJsZSIpJT4iPgotPCUKLWZvciAoaW50IGkgPSAwOyBpIDwgeHNkQ29uZmlnLmdldE1heE9jY3VycygpOyBpKyspIHsKLSAgSVhTREZyYWdtZW50IGNoaWxkRnJhZzsKLSAgU3RyaW5nIGNoaWxkRnJhZ0lEOwotICBpZiAoaSA8IGNoaWxkRnJhZ3MubGVuZ3RoKSB7Ci0gICAgY2hpbGRGcmFnID0gY2hpbGRGcmFnc1tpXTsKLSAgICBjaGlsZEZyYWdJRCA9IGNoaWxkRnJhZy5nZXRJRCgpOwotICB9Ci0gIGVsc2UgewotICAgIGNoaWxkRnJhZ0lEID0gZnJhZy5jcmVhdGVMaXN0SW5zdGFuY2UoKTsKLSAgICBjaGlsZEZyYWcgPSBmcmFnLmdldEZyYWdtZW50KGNoaWxkRnJhZ0lEKTsKLSAgfQotICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gIGZyYWdJRC5hcHBlbmQoY2hpbGRGcmFnSUQpOwotJT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPWZyYWcuZ2V0SUQoKSU+IiB2YWx1ZT0iPCU9Y2hpbGRGcmFnSUQlPiI+Ci0gICAgICA8anNwOmluY2x1ZGUgcGFnZT0iPCU9Y2hpbGRGcmFnLmdldFdyaXRlRnJhZ21lbnQoKSU+IiBmbHVzaD0idHJ1ZSIvPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08JQotfQotJT4KLTwvdGFibGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdFJGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlTGlzdFJGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjg2MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RSRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBvcGVyTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpb3Blck5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLUlYU0RTaW1wbGVMaXN0RnJhZ21lbnQgZnJhZyA9IChJWFNEU2ltcGxlTGlzdEZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1JWFNERnJhZ21lbnRbXSBjaGlsZEZyYWdzID0gZnJhZy5nZXRBbGxGcmFnbWVudHMoKTsKLSU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci08JQotZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEZyYWdzLmxlbmd0aDsgaSsrKSB7Ci0gIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgZnJhZ0lELmFwcGVuZChjaGlsZEZyYWdzW2ldLmdldElEKCkpOwotJT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaGlsZEZyYWdzW2ldLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwlCi19Ci0lPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVMaXN0UmFuZ2VXRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RSYW5nZVdGcmFnbWVudEpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2MyZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZUxpc3RSYW5nZVdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTRFNpbXBsZUxpc3RGcmFnbWVudCBmcmFnID0gKElYU0RTaW1wbGVMaXN0RnJhZ21lbnQpb3BlckVsZW1lbnQuZ2V0RnJhZ21lbnRCeUlEKGZyYWdJRC50b1N0cmluZygpKTsKLVhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uIHhzZENvbmZpZyA9IGZyYWcuZ2V0WFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24oKTsKLVN0cmluZyB0YWJsZUNvbnRhaW5lcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotU3RyaW5nIHR3aXN0SW1hZ2VOYW1lID0gKG5ldyBTdHJpbmdCdWZmZXIoIngiKSkuYXBwZW5kKHRhYmxlQ29udGFpbmVySUQpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgbmFtZUFuY2hvcklEID0gKG5ldyBTdHJpbmdCdWZmZXIoRnJhZ21lbnRDb25zdGFudHMuTkFNRV9BTkNIT1JfSUQpKS5hcHBlbmQoZnJhZy5nZXRJRCgpKS50b1N0cmluZygpOwotJT4KLTxhIG5hbWU9IjwlPW5hbWVBbmNob3JJRCU+Ii8+Ci08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICA8dHI+Ci0gICAgPHRkIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dHdpc3QoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsJzwlPXR3aXN0SW1hZ2VOYW1lJT4nKSI+PGltZyBuYW1lPSI8JT10d2lzdEltYWdlTmFtZSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3R3aXN0b3BlbmVkLmdpZiIpKSU+IiBhbHQ9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1RXSVNUX09QRU5FRCIpJT4iIGNsYXNzPSJ0d2lzdCI+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlblhTREluZm9EaWFsb2coJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChPcGVuWFNESW5mb0RpYWxvZ0FjdGlvbi5nZXRBY3Rpb25MaW5rKHNlc3Npb24uZ2V0SWQoKSxzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksZnJhZ0lELnRvU3RyaW5nKCkpKSklPicpIj48JT1mcmFnLmdldE5hbWUoKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y3JlYXRlSW5zdGFuY2UoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKSU+LCAnPCU9ZnJhZ0lEJT4nLCAnPCU9bmFtZUFuY2hvcklEJT4nKSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19BREQiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcD4KLSAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6Y2hlY2tNaW5PY2N1cnNBbmRSZW1vdmVTZWxlY3RlZFJvd3MoJzwlPXRhYmxlQ29udGFpbmVySUQlPicsIDwlPXhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKSU+KSI+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTElOS19SRU1PVkUiKSU+PC9hPgotICAgIDwvdGQ+Ci0gICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxzcGFuIGlkPSI8JT10YWJsZUNvbnRhaW5lcklEJT4iPgotPHRhYmxlIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0iPCU9KHhzZENvbmZpZy5nZXRJc1dTRExQYXJ0KCkgPyAicmFuZ2VmcmFndGFibGUiIDogImlubmVycmFuZ2VmcmFndGFibGUiKSU+Ij4KLSAgPHRyPgotICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJoYW5kbGVDaGVja0FsbENsaWNrKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xJU1RfSVRFTVMiKSU+PC90aD4KLSAgPC90cj4KLSAgPCUKLSAgSVhTREZyYWdtZW50W10gY2hpbGRGcmFncyA9IGZyYWcuZ2V0QWxsRnJhZ21lbnRzKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRGcmFncy5sZW5ndGggfHwgaSA8IHhzZENvbmZpZy5nZXRNaW5PY2N1cnMoKTsgaSsrKSB7Ci0gICAgSVhTREZyYWdtZW50IGNoaWxkRnJhZzsKLSAgICBTdHJpbmcgY2hpbGRGcmFnSUQ7Ci0gICAgaWYgKGkgPCBjaGlsZEZyYWdzLmxlbmd0aCkgewotICAgICAgY2hpbGRGcmFnID0gY2hpbGRGcmFnc1tpXTsKLSAgICAgIGNoaWxkRnJhZ0lEID0gY2hpbGRGcmFnLmdldElEKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgY2hpbGRGcmFnSUQgPSBmcmFnLmNyZWF0ZUxpc3RJbnN0YW5jZSgpOwotICAgICAgY2hpbGRGcmFnID0gZnJhZy5nZXRGcmFnbWVudChjaGlsZEZyYWdJRCk7Ci0gICAgfQotICAgIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgICBmcmFnSUQuYXBwZW5kKGNoaWxkRnJhZ0lEKTsKLSAgJT4KLSAgPHRyPgotICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+Ci0gICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9ImhhbmRsZVJvd0NoZWNrYm94Q2xpY2soKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+Ci0gICAgPC90ZD4KLSAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIHZhbHVlPSI8JT1jaGlsZEZyYWdJRCU+Ij4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaGlsZEZyYWcuZ2V0V3JpdGVGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLSAgPCUKLSAgfQotICAlPgotPC90YWJsZT4KLTwvc3Bhbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvbkZpeFdGcmFnbWVudEpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVW5pb25GaXhXRnJhZ21lbnRKU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDA3YmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvbkZpeFdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZnJhZ21lbnQuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UueHNkLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJmcmFnSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJub2RlSUQiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotCi08JQotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IHdzZGxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldE5vZGUoSW50ZWdlci5wYXJzZUludChub2RlSUQudG9TdHJpbmcoKSkpOwotV1NETE9wZXJhdGlvbkVsZW1lbnQgb3BlckVsZW1lbnQgPSAoV1NETE9wZXJhdGlvbkVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNEU2ltcGxlVW5pb25GcmFnbWVudCBmcmFnID0gKElYU0RTaW1wbGVVbmlvbkZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1TdHJpbmcgdGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKGZyYWcuZ2V0SUQoKSkudG9TdHJpbmcoKTsKLVN0cmluZyB0d2lzdEltYWdlTmFtZSA9IChuZXcgU3RyaW5nQnVmZmVyKCJ4IikpLmFwcGVuZCh0YWJsZUNvbnRhaW5lcklEKS50b1N0cmluZygpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBjaGFuZ2VVbmlvbk1lbWJlclR5cGUoc2VsZWN0KSB7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3Qub3B0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIHRhYmxlQ29udGFpbmVySUQgPSAnPCU9RnJhZ21lbnRDb25zdGFudHMuVEFCTEVfSUQlPic7Ci0gICAgICB0YWJsZUNvbnRhaW5lcklEICs9IHNlbGVjdC5vcHRpb25zKGkpLnZhbHVlOwotICAgICAgc2hvd1RhYmxlKHRhYmxlQ29udGFpbmVySUQsIHNlbGVjdC5vcHRpb25zKGkpLnNlbGVjdGVkKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93VGFibGUodGFibGVDb250YWluZXJJRCwgc2hvdykgewotICAgIHZhciB0YWJsZUNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhYmxlQ29udGFpbmVySUQpOwotICAgIGlmIChzaG93KQotICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIGVsc2UKLSAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gIH0KLTwvc2NyaXB0PgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5JT05fVFlQRSIpJT48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5JT05fTUVNQkVSUyIpJT48L3RoPgotICA8L3RyPgotICA8JQotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbltdIG1lbWJlclR5cGVzID0gZnJhZy5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgSVhTREZyYWdtZW50W10gbWVtYmVyRnJhZ3MgPSBmcmFnLmdldEFsbEZyYWdtZW50cygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHhzZENvbmZpZy5nZXRNYXhPY2N1cnMoKTsgaSsrKSB7Ci0gICAgaW50IHR5cGVTZWxlY3Rpb25JbmRleCA9IDA7Ci0gICAgU3RyaW5nW10gbmV3TWVtYmVyRnJhZ0lEcyA9IG5ldyBTdHJpbmdbbWVtYmVyVHlwZXMubGVuZ3RoXTsKLSAgICBJWFNERnJhZ21lbnRbXSBuZXdNZW1iZXJGcmFncyA9IG5ldyBJWFNERnJhZ21lbnRbbWVtYmVyVHlwZXMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IG1lbWJlclR5cGVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICBpZiAoaSA8IG1lbWJlckZyYWdzLmxlbmd0aCAmJiBtZW1iZXJGcmFnc1tpXS5nZXRYU0RUeXBlRGVmaW5pdGlvbigpLmdldFFOYW1lKCkuZXF1YWxzKG1lbWJlclR5cGVzW2pdLmdldFFOYW1lKCkpKSB7Ci0gICAgICAgIG5ld01lbWJlckZyYWdJRHNbal0gPSBtZW1iZXJGcmFnc1tpXS5nZXRJRCgpOwotICAgICAgICBuZXdNZW1iZXJGcmFnc1tqXSA9IG1lbWJlckZyYWdzW2ldOwotICAgICAgICB0eXBlU2VsZWN0aW9uSW5kZXggPSBqOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIG5ld01lbWJlckZyYWdJRHNbal0gPSBmcmFnLmNyZWF0ZVVuaW9uSW5zdGFuY2Uoaik7Ci0gICAgICAgIG5ld01lbWJlckZyYWdzW2pdID0gZnJhZy5nZXRGcmFnbWVudChuZXdNZW1iZXJGcmFnSURzW2pdKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgJT4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICA8c2VsZWN0IGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIG9uQ2hhbmdlPSJqYXZhc2NyaXB0OmNoYW5nZVVuaW9uTWVtYmVyVHlwZSh0aGlzKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1VOSU9OX1RZUEUiKSU+Ij4KLSAgICAgICAgICA8JQotICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgIGlmIChrID09IHR5cGVTZWxlY3Rpb25JbmRleCkgewotICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1uZXdNZW1iZXJGcmFnSURzW2tdJT4iIHNlbGVjdGVkPjwlPW1lbWJlclR5cGVzW2tdLmdldFFOYW1lKCklPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPW5ld01lbWJlckZyYWdJRHNba10lPiI+PCU9bWVtYmVyVHlwZXNba10uZ2V0UU5hbWUoKSU+Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgICU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgIDwlCi0gICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBsKyspIHsKLSAgICAgICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICAgICAgZnJhZ0lELmFwcGVuZChuZXdNZW1iZXJGcmFnSURzW2xdKTsKLSAgICAgICAgICBTdHJpbmcgbWVtYmVyVGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKG5ld01lbWJlckZyYWdzW2xdLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICU+Ci0gICAgICAgIDxzcGFuIGlkPSI8JT1tZW1iZXJUYWJsZUNvbnRhaW5lcklEJT4iPgotICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1uZXdNZW1iZXJGcmFnc1tsXS5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgICAgPC9zcGFuPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICBzaG93VGFibGUoJzwlPW1lbWJlclRhYmxlQ29udGFpbmVySUQlPicsIDwlPShsID09IHR5cGVTZWxlY3Rpb25JbmRleCklPik7Ci0gICAgICAgIDwvc2NyaXB0PgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+Ci08L3NwYW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVW5pb25SRnJhZ21lbnRKU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ZyYWdtZW50L1hTRFNpbXBsZVVuaW9uUkZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2MWZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVW5pb25SRnJhZ21lbnRKU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5mcmFnbWVudC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImZyYWdJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5vZGVJRCIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci0KLTwlCi1XU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLU5vZGUgb3Blck5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KW9wZXJOb2RlLmdldFRyZWVFbGVtZW50KCk7Ci1JWFNEU2ltcGxlVW5pb25GcmFnbWVudCBmcmFnID0gKElYU0RTaW1wbGVVbmlvbkZyYWdtZW50KW9wZXJFbGVtZW50LmdldEZyYWdtZW50QnlJRChmcmFnSUQudG9TdHJpbmcoKSk7Ci1YU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbiB4c2RDb25maWcgPSBmcmFnLmdldFhTRFRvRnJhZ21lbnRDb25maWd1cmF0aW9uKCk7Ci1JWFNERnJhZ21lbnRbXSBjaGlsZEZyYWdzID0gZnJhZy5nZXRBbGxGcmFnbWVudHMoKTsKLSU+Ci08dGFibGUgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wIGNsYXNzPSI8JT0oeHNkQ29uZmlnLmdldElzV1NETFBhcnQoKSA/ICJmaXhmcmFndGFibGUiIDogImlubmVyZml4ZnJhZ3RhYmxlIiklPiI+Ci08JQotZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEZyYWdzLmxlbmd0aDsgaSsrKSB7Ci0gIGZyYWdJRC5kZWxldGUoMCwgZnJhZ0lELmxlbmd0aCgpKTsKLSAgZnJhZ0lELmFwcGVuZChjaGlsZEZyYWdzW2ldLmdldElEKCkpOwotJT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1jaGlsZEZyYWdzW2ldLmdldFJlYWRGcmFnbWVudCgpJT4iIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwlCi19Ci0lPgotPC90YWJsZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvblJhbmdlV0ZyYWdtZW50SlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9mcmFnbWVudC9YU0RTaW1wbGVVbmlvblJhbmdlV0ZyYWdtZW50SlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxMzM4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvZnJhZ21lbnQvWFNEU2ltcGxlVW5pb25SYW5nZVdGcmFnbWVudEpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmZyYWdtZW50LiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnhzZC4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iZnJhZ0lEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibm9kZUlEIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLQotPCUKLVdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotTm9kZSBzZWxlY3RlZE5vZGUgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKS5nZXROb2RlKEludGVnZXIucGFyc2VJbnQobm9kZUlELnRvU3RyaW5nKCkpKTsKLVdTRExPcGVyYXRpb25FbGVtZW50IG9wZXJFbGVtZW50ID0gKFdTRExPcGVyYXRpb25FbGVtZW50KXNlbGVjdGVkTm9kZS5nZXRUcmVlRWxlbWVudCgpOwotSVhTRFNpbXBsZVVuaW9uRnJhZ21lbnQgZnJhZyA9IChJWFNEU2ltcGxlVW5pb25GcmFnbWVudClvcGVyRWxlbWVudC5nZXRGcmFnbWVudEJ5SUQoZnJhZ0lELnRvU3RyaW5nKCkpOwotWFNEVG9GcmFnbWVudENvbmZpZ3VyYXRpb24geHNkQ29uZmlnID0gZnJhZy5nZXRYU0RUb0ZyYWdtZW50Q29uZmlndXJhdGlvbigpOwotU3RyaW5nIHRhYmxlQ29udGFpbmVySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci1TdHJpbmcgdHdpc3RJbWFnZU5hbWUgPSAobmV3IFN0cmluZ0J1ZmZlcigieCIpKS5hcHBlbmQodGFibGVDb250YWluZXJJRCkudG9TdHJpbmcoKTsKLVN0cmluZyBuYW1lQW5jaG9ySUQgPSAobmV3IFN0cmluZ0J1ZmZlcihGcmFnbWVudENvbnN0YW50cy5OQU1FX0FOQ0hPUl9JRCkpLmFwcGVuZChmcmFnLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0lPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIGZ1bmN0aW9uIGNoYW5nZVVuaW9uTWVtYmVyVHlwZShzZWxlY3QpIHsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGVjdC5vcHRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgdGFibGVDb250YWluZXJJRCA9ICc8JT1GcmFnbWVudENvbnN0YW50cy5UQUJMRV9JRCU+JzsKLSAgICAgIHRhYmxlQ29udGFpbmVySUQgKz0gc2VsZWN0Lm9wdGlvbnMoaSkudmFsdWU7Ci0gICAgICBzaG93VGFibGUodGFibGVDb250YWluZXJJRCwgc2VsZWN0Lm9wdGlvbnMoaSkuc2VsZWN0ZWQpOwotICAgIH0KLSAgfQotCi0gIGZ1bmN0aW9uIHNob3dUYWJsZSh0YWJsZUNvbnRhaW5lcklELCBzaG93KSB7Ci0gICAgdmFyIHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJRCk7Ci0gICAgaWYgKHNob3cpCi0gICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgZWxzZQotICAgICAgdGFibGVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLSAgfQotPC9zY3JpcHQ+Ci08YSBuYW1lPSI8JT1uYW1lQW5jaG9ySUQlPiIvPgotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgPHRyPgotICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCc8JT10d2lzdEltYWdlTmFtZSU+JykiPjxpbWcgbmFtZT0iPCU9dHdpc3RJbWFnZU5hbWUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdG9wZW5lZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9PUEVORUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0Om9wZW5YU0RJbmZvRGlhbG9nKCc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoT3BlblhTREluZm9EaWFsb2dBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uLmdldElkKCksc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLGZyYWdJRC50b1N0cmluZygpKSkpJT4nKSI+PCU9ZnJhZy5nZXROYW1lKCklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNyZWF0ZUluc3RhbmNlKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWF4T2NjdXJzKCklPiwgJzwlPWZyYWdJRCU+JywgJzwlPW5hbWVBbmNob3JJRCU+JykiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQUREIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXA+Ci0gICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OmNoZWNrTWluT2NjdXJzQW5kUmVtb3ZlU2VsZWN0ZWRSb3dzKCc8JT10YWJsZUNvbnRhaW5lcklEJT4nLCA8JT14c2RDb25maWcuZ2V0TWluT2NjdXJzKCklPikiPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfUkVNT1ZFIiklPjwvYT4KLSAgICA8L3RkPgotICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci08c3BhbiBpZD0iPCU9dGFibGVDb250YWluZXJJRCU+Ij4KLTx0YWJsZSBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9IjwlPSh4c2RDb25maWcuZ2V0SXNXU0RMUGFydCgpID8gInJhbmdlZnJhZ3RhYmxlIiA6ICJpbm5lcnJhbmdlZnJhZ3RhYmxlIiklPiI+Ci0gIDx0cj4KLSAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9dGFibGVDb250YWluZXJJRCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5JT05fVFlQRSIpJT48L3RoPgotICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIiBub3dyYXA+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5JT05fTUVNQkVSUyIpJT48L3RoPgotICA8L3RyPgotICA8JQotICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbltdIG1lbWJlclR5cGVzID0gZnJhZy5nZXRNZW1iZXJUeXBlRGVmaW5pdGlvbnMoKTsKLSAgSVhTREZyYWdtZW50W10gbWVtYmVyRnJhZ3MgPSBmcmFnLmdldEFsbEZyYWdtZW50cygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlckZyYWdzLmxlbmd0aCB8fCBpIDwgeHNkQ29uZmlnLmdldE1pbk9jY3VycygpOyBpKyspIHsKLSAgICBpbnQgdHlwZVNlbGVjdGlvbkluZGV4ID0gMDsKLSAgICBTdHJpbmdbXSBuZXdNZW1iZXJGcmFnSURzID0gbmV3IFN0cmluZ1ttZW1iZXJUeXBlcy5sZW5ndGhdOwotICAgIElYU0RGcmFnbWVudFtdIG5ld01lbWJlckZyYWdzID0gbmV3IElYU0RGcmFnbWVudFttZW1iZXJUeXBlcy5sZW5ndGhdOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgIGlmIChpIDwgbWVtYmVyRnJhZ3MubGVuZ3RoICYmIG1lbWJlckZyYWdzW2ldLmdldFhTRFR5cGVEZWZpbml0aW9uKCkuZ2V0UU5hbWUoKS5lcXVhbHMobWVtYmVyVHlwZXNbal0uZ2V0UU5hbWUoKSkpIHsKLSAgICAgICAgbmV3TWVtYmVyRnJhZ0lEc1tqXSA9IG1lbWJlckZyYWdzW2ldLmdldElEKCk7Ci0gICAgICAgIG5ld01lbWJlckZyYWdzW2pdID0gbWVtYmVyRnJhZ3NbaV07Ci0gICAgICAgIHR5cGVTZWxlY3Rpb25JbmRleCA9IGo7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgbmV3TWVtYmVyRnJhZ0lEc1tqXSA9IGZyYWcuY3JlYXRlVW5pb25JbnN0YW5jZShqKTsKLSAgICAgICAgbmV3TWVtYmVyRnJhZ3Nbal0gPSBmcmFnLmdldEZyYWdtZW50KG5ld01lbWJlckZyYWdJRHNbal0pOwotICAgICAgfQotICAgIH0KLSAgICAlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0iaGFuZGxlUm93Q2hlY2tib3hDbGljaygpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICA8c2VsZWN0IGlkPSI8JT1mcmFnLmdldElEKCklPiIgbmFtZT0iPCU9ZnJhZy5nZXRJRCgpJT4iIG9uQ2hhbmdlPSJqYXZhc2NyaXB0OmNoYW5nZVVuaW9uTWVtYmVyVHlwZSh0aGlzKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1VOSU9OX1RZUEUiKSU+Ij4KLSAgICAgICAgICA8JQotICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBrKyspIHsKLSAgICAgICAgICAgIGlmIChrID09IHR5cGVTZWxlY3Rpb25JbmRleCkgewotICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1uZXdNZW1iZXJGcmFnSURzW2tdJT4iIHNlbGVjdGVkPjwlPW1lbWJlclR5cGVzW2tdLmdldFFOYW1lKCklPgotICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPW5ld01lbWJlckZyYWdJRHNba10lPiI+PCU9bWVtYmVyVHlwZXNba10uZ2V0UU5hbWUoKSU+Ci0gICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgICU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgIDwlCi0gICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbWVtYmVyVHlwZXMubGVuZ3RoOyBsKyspIHsKLSAgICAgICAgICBmcmFnSUQuZGVsZXRlKDAsIGZyYWdJRC5sZW5ndGgoKSk7Ci0gICAgICAgICAgZnJhZ0lELmFwcGVuZChuZXdNZW1iZXJGcmFnSURzW2xdKTsKLSAgICAgICAgICBTdHJpbmcgbWVtYmVyVGFibGVDb250YWluZXJJRCA9IChuZXcgU3RyaW5nQnVmZmVyKEZyYWdtZW50Q29uc3RhbnRzLlRBQkxFX0lEKSkuYXBwZW5kKG5ld01lbWJlckZyYWdzW2xdLmdldElEKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICU+Ci0gICAgICAgIDxzcGFuIGlkPSI8JT1tZW1iZXJUYWJsZUNvbnRhaW5lcklEJT4iPgotICAgICAgICAgIDxqc3A6aW5jbHVkZSBwYWdlPSI8JT1uZXdNZW1iZXJGcmFnc1tsXS5nZXRXcml0ZUZyYWdtZW50KCklPiIgZmx1c2g9InRydWUiLz4KLSAgICAgICAgPC9zcGFuPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICBzaG93VGFibGUoJzwlPW1lbWJlclRhYmxlQ29udGFpbmVySUQlPicsIDwlPShsID09IHR5cGVTZWxlY3Rpb25JbmRleCklPik7Ci0gICAgICAgIDwvc2NyaXB0PgotICAgICAgICA8JQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvdGFibGU+Ci08L3NwYW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL2ludm9rZV93c2RsX29wZXJhdGlvbl9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvaW52b2tlX3dzZGxfb3BlcmF0aW9uX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjA1NTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvaW52b2tlX3dzZGxfb3BlcmF0aW9uX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9pbnZva2Vfd3NkbF9vcGVyYXRpb25faGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9pbnZva2Vfd3NkbF9vcGVyYXRpb25faGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2ZjNDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvaW52b2tlX3dzZGxfb3BlcmF0aW9uX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvb3Blbl93c2RsX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9vcGVuX3dzZGxfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZmE4MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9vcGVuX3dzZGxfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL29wZW5fd3NkbF9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL29wZW5fd3NkbF9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NTViYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy9vcGVuX3dzZGxfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL2ltYWdlcy93c2RsX2JpbmRpbmdfbm9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL3dzZGxfYmluZGluZ19ub2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzODZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL3dzZGxfYmluZGluZ19ub2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvd3NkbF9vcGVyYXRpb25fbm9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL3dzZGxfb3BlcmF0aW9uX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjExYmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvd3NkbF9vcGVyYXRpb25fbm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvaW1hZ2VzL3dzZGxfc2VydmljZV9ub2RlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvd3NkbF9zZXJ2aWNlX25vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQwOGJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9pbWFnZXMvd3NkbF9zZXJ2aWNlX25vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3NjcmlwdHMvZnJhZ21lbnR0YWJsZXMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3NjcmlwdHMvZnJhZ21lbnR0YWJsZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZiODVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zY3JpcHRzL2ZyYWdtZW50dGFibGVzLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy90YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL2Zvcm11dGlscy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvY2FsZW5kYXJicm93c2VyLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLQotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4KLQotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHZhciB4c2RJbmZvRGlhbG9nOwotICB2YXIgeHNkSW5mb0RpYWxvZ0Nsb3NlZCA9IHRydWU7Ci0gIHZhciByb3dDaGVja2JveE5hbWUgPSAicm93Q2hlY2tib3hOYW1lIjsKLSAgdmFyIHVuYm91bmRlZCA9IDwlPUZyYWdtZW50Q29uc3RhbnRzLlVOQk9VTkRFRCU+OwotCi0gIGZ1bmN0aW9uIGNoZWNrTWF4T2NjdXJzUmVhY2hlZCh0YWJsZUNvbnRhaW5lcklELCBtYXhPY2N1cnMpIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICBpZiAobWF4T2NjdXJzICE9IHVuYm91bmRlZCAmJiAodGFibGUucm93cy5sZW5ndGggLSBudW1iZXJPZkhlYWRlclJvd3MpID49IG1heE9jY3VycykgewotICAgICAgYWxlcnQoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX01BWF9PQ0NVUlNfVklPTEFUSU9OIikpJT4iKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmdW5jdGlvbiBjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkUm93cyh0YWJsZUNvbnRhaW5lcklELCBtaW5PY2N1cnMpIHsKLSAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICB2YXIgcm93c0xlbmd0aCA9IHRhYmxlLnJvd3MubGVuZ3RoIC0gbnVtYmVyT2ZIZWFkZXJSb3dzOwotICAgIHZhciBjaGVja2VkUm93cyA9IDA7Ci0gICAgZm9yICh2YXIgaSA9IG51bWJlck9mSGVhZGVyUm93czsgaSA8IHRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciB0YWJsZVJvdyA9IHRhYmxlLnJvd3NbaV07Ci0gICAgICB2YXIgcm93Q2hlY2tib3ggPSB0YWJsZVJvdy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpCi0gICAgICAgIGNoZWNrZWRSb3dzKys7Ci0gICAgfQotICAgIGlmIChjaGVja2VkUm93cyA9PSAwKQotICAgICAgYWxlcnQoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PVEhJTkdfU0VMRUNURUQiKSklPiIpOwotICAgIGVsc2UgaWYgKChyb3dzTGVuZ3RoIC0gY2hlY2tlZFJvd3MpIDwgbWluT2NjdXJzKQotICAgICAgYWxlcnQoIjwlPUhUTUxVdGlscy5KU01hbmdsZSh3c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX01JTl9PQ0NVUlNfVklPTEFUSU9OIikpJT4iKTsKLSAgICBlbHNlCi0gICAgICByZW1vdmVTZWxlY3RlZFJvd3ModGFibGVDb250YWluZXJJRCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGNoZWNrTWluT2NjdXJzQW5kUmVtb3ZlU2VsZWN0ZWREYXRlVGltZVJvd3MoY2FsZW5kYXJUeXBlLHRhYmxlQ29udGFpbmVySUQsbWluT2NjdXJzKQotICB7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIG5ld0NhbGVuZGFyVGFyZ2V0Um93ID0gY2FsZW5kYXJUYXJnZXRSb3c7Ci0gICAgZm9yICh2YXIgaT1udW1iZXJPZkhlYWRlclJvd3M7aTx0YWJsZS5yb3dzLmxlbmd0aDtpKyspCi0gICAgewotICAgICAgdmFyIGNvbHVtbnMgPSB0YWJsZS5yb3dzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpOwotICAgICAgdmFyIHJvd0NoZWNrYm94ID0gY29sdW1ucy5pdGVtKDApLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLml0ZW0oMCk7Ci0gICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGktbnVtYmVyT2ZIZWFkZXJSb3dzID09IGNhbGVuZGFyVGFyZ2V0Um93KQotICAgICAgICAgIG5ld0NhbGVuZGFyVGFyZ2V0Um93ID0gLTE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBuZXdDYWxlbmRhclRhcmdldFJvdy0tOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobmV3Q2FsZW5kYXJUYXJnZXRSb3cgPT0gLTEpCi0gICAgICBjbG9zZUNhbGVuZGFyQnJvd3NlcigpOwotICAgIGNhbGVuZGFyVGFyZ2V0Um93ID0gbmV3Q2FsZW5kYXJUYXJnZXRSb3c7Ci0gICAgICAKLSAgICBjaGVja01pbk9jY3Vyc0FuZFJlbW92ZVNlbGVjdGVkUm93cyh0YWJsZUNvbnRhaW5lcklELG1pbk9jY3Vycyk7Ci08JQotICAgLy8gRml4IHRoZSBicm93c2UuLi4gbGlua3MuCi0lPgotICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgIGZvciAodmFyIGk9bnVtYmVyT2ZIZWFkZXJSb3dzO2k8dGFibGUucm93cy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIHZhciBjb2x1bW5zID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKTsKLSAgICAgIHZhciBkYXRlVGltZVRleHRGaWVsZCA9IGNvbHVtbnMuaXRlbSgxKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKS5pdGVtKDApOwotICAgICAgc2V0RGF0ZVRpbWVCcm93c2VMaW5rSHJlZihjb2x1bW5zLml0ZW0oMikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKS5pdGVtKDApLGNhbGVuZGFyVHlwZSxkYXRlVGltZVRleHRGaWVsZC5uYW1lLGktbnVtYmVyT2ZIZWFkZXJSb3dzKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSh0YWJsZUNvbnRhaW5lcklELCBtYXhPY2N1cnMsIGZyYWdtZW50SUQsIG5hbWVBbmNob3JJRCkgewotICAgIGlmIChjaGVja01heE9jY3Vyc1JlYWNoZWQodGFibGVDb250YWluZXJJRCwgbWF4T2NjdXJzKSkKLSAgICAgIHJldHVybjsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIG5ld0NvbHVtbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgbmV3Q29sdW1uLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPUZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX0lEJT4iLCBmcmFnbWVudElEKSk7Ci0gICAgbmV3Q29sdW1uLmFwcGVuZENoaWxkKGNyZWF0ZUhpZGRlbkVsZW1lbnQoIjwlPUZyYWdtZW50Q29uc3RhbnRzLk5BTUVfQU5DSE9SX0lEJT4iLCBuYW1lQW5jaG9ySUQpKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQobmV3Q29sdW1uKTsKLSAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgICB2YXIgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmb3JtIik7Ci0gICAgZm9ybVswXS5hY3Rpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL2FjdGlvbnMvQ3JlYXRlSW5zdGFuY2VBY3Rpb25KU1AuanNwIikpJT4iOwotICAgIGZvcm1bMF0uc3VibWl0KCk7Ci0gIH0KLQotICBmdW5jdGlvbiBvcGVuWFNESW5mb0RpYWxvZyhsaW5rKSB7Ci0gICAgeHNkSW5mb0RpYWxvZyA9IHdpbmRvdy5vcGVuKGxpbmssICJYU0RJbmZvcm1hdGlvbkRpYWxvZyIsICJoZWlnaHQ9NTAwLHdpZHRoPTUwMCxzY3JvbGxiYXJzPW5vLHJlc2l6YWJsZT15ZXMiKTsKLSAgICBpZiAoeHNkSW5mb0RpYWxvZy5mb2N1cykKLSAgICAgIHhzZEluZm9EaWFsb2cuZm9jdXMoKTsKLSAgfQotCi0gIGZ1bmN0aW9uIGNsb3NlWFNESW5mb0RpYWxvZygpCi0gIHsKLSAgICBpZiAoIXhzZEluZm9EaWFsb2dDbG9zZWQpCi0gICAgICB4c2RJbmZvRGlhbG9nLmNsb3NlKCk7Ci0gIH0KLQotICBmdW5jdGlvbiBzeW5jaHJvbml6ZUZyYWdtZW50Vmlld3Modmlld0lEKSB7Ci0gICAgdmFyIGZvcm0gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZm9ybSIpOwotICAgIGlmICh2aWV3SUQgPT0gIjwlPUZyYWdtZW50Q29uc3RhbnRzLkZSQUdNRU5UX1ZJRVdfU1dJVENIX0ZPUk1fVE9fU09VUkNFJT4iKQotICAgICAgZm9ybVswXS5hcHBlbmRDaGlsZChjcmVhdGVIaWRkZW5FbGVtZW50KCI8JT1GcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX0lEJT4iLCI8JT1GcmFnbWVudENvbnN0YW50cy5GUkFHTUVOVF9WSUVXX1NXSVRDSF9GT1JNX1RPX1NPVVJDRSU+IikpOwotICAgIGVsc2UKLSAgICAgIGZvcm1bMF0uYXBwZW5kQ2hpbGQoY3JlYXRlSGlkZGVuRWxlbWVudCgiPCU9RnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19JRCU+IiwiPCU9RnJhZ21lbnRDb25zdGFudHMuRlJBR01FTlRfVklFV19TV0lUQ0hfU09VUkNFX1RPX0ZPUk0lPiIpKTsKLSAgICBmb3JtWzBdLmFjdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzZGwvYWN0aW9ucy9TeW5jaHJvbml6ZUZyYWdtZW50Vmlld3NBY3Rpb25KU1AuanNwIikpJT4iOwotICAgIGZvcm1bMF0uc3VibWl0KCk7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIGFkZFNpbXBsZUF0b21pY0RhdGVUaW1lUm93cyhjYWxlbmRhclR5cGUsdGFibGVDb250YWluZXJJRCxpZCxuYW1lLHZhbHVlLG1heE9jY3VycykgewotICAgIGlmIChjaGVja01heE9jY3Vyc1JlYWNoZWQodGFibGVDb250YWluZXJJRCwgbWF4T2NjdXJzKSkKLSAgICAgIHJldHVybjsKLSAgICB0d2lzdE9wZW4odGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIHRhYmxlID0gZ2V0VGFibGUodGFibGVDb250YWluZXJJRCk7Ci0gICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLml0ZW0oMCk7Ci0gICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgdmFyIGNvbHVtbjAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgIHZhciBjb2x1bW4xID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLSAgICB2YXIgY29sdW1uMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0KLSAgICB2YXIgcm93Q2hlY2tib3ggPSBjcmVhdGVSb3dDaGVja2JveCgpOwotICAgIGNvbHVtbjAuYXBwZW5kQ2hpbGQocm93Q2hlY2tib3gpOwotCi0gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKLSAgICBpbnB1dC50eXBlID0gInRleHQiOwotICAgIGlucHV0LmlkID0gaWQ7Ci0gICAgaW5wdXQubmFtZSA9IG5hbWU7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoID4gMCkKLSAgICAgIGlucHV0LnZhbHVlID0gdmFsdWU7Ci0gICAgaW5wdXQuY2xhc3NOYW1lID0gInRhYmxldGV4dGVudGVyIjsKLSAgICBjb2x1bW4xLmFwcGVuZENoaWxkKGlucHV0KTsKLSAgICAKLSAgICBjb2x1bW4yLmFwcGVuZENoaWxkKGNyZWF0ZURhdGVUaW1lQnJvd3NlTGluayhjYWxlbmRhclR5cGUsbmFtZSx0YWJsZS5yb3dzLmxlbmd0aC0xKSk7Ci0gICAgY29sdW1uMi53aWR0aCA9ICI5MCUiOwotCi0gICAgY29sdW1uMC5jbGFzc05hbWUgPSAiY2hlY2tib3hjZWxscyI7Ci0gICAgY29sdW1uMS5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgY29sdW1uMi5jbGFzc05hbWUgPSAidGFibGVjZWxscyI7Ci0gICAgbmV3Um93LmFwcGVuZENoaWxkKGNvbHVtbjApOwotICAgIG5ld1Jvdy5hcHBlbmRDaGlsZChjb2x1bW4xKTsKLSAgICBuZXdSb3cuYXBwZW5kQ2hpbGQoY29sdW1uMik7Ci0gICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gIH0gIAotICAKLSAgZnVuY3Rpb24gY3JlYXRlRGF0ZVRpbWVCcm93c2VMaW5rKGNhbGVuZGFyVHlwZSxuYW1lLHBvc2l0aW9uKQotICB7Ci0gICAgdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Ci0gICAgc2V0RGF0ZVRpbWVCcm93c2VMaW5rSHJlZihsaW5rLGNhbGVuZGFyVHlwZSxuYW1lLHBvc2l0aW9uKTsKLSAgICBsaW5rLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoY29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xJTktfQlJPV1NFIikpJT4iKSk7Ci0gICAgcmV0dXJuIGxpbms7Ci0gIH0KLSAgCi0gIGZ1bmN0aW9uIHNldERhdGVUaW1lQnJvd3NlTGlua0hyZWYobGluayxjYWxlbmRhclR5cGUsbmFtZSxwb3NpdGlvbikKLSAgewotICAgIGxpbmsuaHJlZiA9ICJqYXZhc2NyaXB0Om9wZW5DYWxlbmRhckJyb3dzZXIoIitjYWxlbmRhclR5cGUrIiwnY29udGVudGJvcmRlcicsJyIrbmFtZSsiJywiK3Bvc2l0aW9uKyIpIjsKLSAgICByZXR1cm4gbGluazsKLSAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy93c2RsZnJhbWVzZXRzLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zY3JpcHRzL3dzZGxmcmFtZXNldHMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGMzODQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zY3JpcHRzL3dzZGxmcmFtZXNldHMuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0KCkKLSAgewotICAgIHJldHVybiBwZXJzcGVjdGl2ZUNvbnRlbnQuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX0FDVElPTlNfQ09OVEFJTkVSJT4iXS5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZnJhbWVzZXQiKS5pdGVtKDApOwotICB9Ci0gIAotICBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzZXRTaXplcyhmcmFtZXNldFNpemVzRm9ybSkKLSAgewotICAgIHRvZ2dsZURvdWJsZUNsaWNrQ29sdW1uVGl0bGUoKTsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1XU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCU+LnZhbHVlID0gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQuY29sczsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1XU0RMQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPi52YWx1ZSA9IGFjdGlvbnNDb250YWluZXJGcmFtZXNldC5yb3dzOwotICAgIGZyYW1lc2V0U2l6ZXNGb3JtLnN1Ym1pdCgpOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvc2NyaXB0cy93c2RscGFuZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUwOWMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zY3JpcHRzL3dzZGxwYW5lcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgd3NkbE5hdmlnYXRvckNvbnRhaW5lciA9IHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPVdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX0NPTlRBSU5FUiU+Il07Ci0gIHZhciB3c2RsTmF2aWdhdG9yVG9vbGJhciA9IHdzZGxOYXZpZ2F0b3JDb250YWluZXIuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX05BVklHQVRPUl9UT09MQkFSJT4iXTsKLSAgdmFyIHdzZGxOYXZpZ2F0b3JDb250ZW50ID0gd3NkbE5hdmlnYXRvckNvbnRhaW5lci5mcmFtZXNbIjwlPVdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX0NPTlRFTlQlPiJdOwotICB2YXIgd3NkbEFjdGlvbnNDb250YWluZXIgPSBwZXJzcGVjdGl2ZUNvbnRlbnQuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX0FDVElPTlNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHdzZGxQcm9wZXJ0aWVzQ29udGFpbmVyID0gd3NkbEFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX1BST1BFUlRJRVNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHdzZGxQcm9wZXJ0aWVzVG9vbGJhciA9IHdzZGxQcm9wZXJ0aWVzQ29udGFpbmVyLmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX1RPT0xCQVIlPiJdOwotICB2YXIgd3NkbFByb3BlcnRpZXNDb250ZW50ID0gd3NkbFByb3BlcnRpZXNDb250YWluZXIuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX1BST1BFUlRJRVNfQ09OVEVOVCU+Il07Ci0gIHZhciB3c2RsU3RhdHVzQ29udGFpbmVyID0gd3NkbEFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX1NUQVRVU19DT05UQUlORVIlPiJdOwotICB2YXIgd3NkbFN0YXR1c1Rvb2xiYXIgPSB3c2RsU3RhdHVzQ29udGFpbmVyLmZyYW1lc1siPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfVE9PTEJBUiU+Il07Ci0gIHZhciB3c2RsU3RhdHVzQ29udGVudCA9IHdzZGxTdGF0dXNDb250YWluZXIuZnJhbWVzWyI8JT1XU0RMRnJhbWVOYW1lcy5XU0RMX1NUQVRVU19DT05URU5UJT4iXTsKLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3NvYXBfZW52ZWxvcGVfeG1sLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC9zb2FwX2VudmVsb3BlX3htbC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmVlMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3NvYXBfZW52ZWxvcGVfeG1sLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQveG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLWludCBzb2FwRW52ZWxvcGVUeXBlID0gSW50ZWdlci5wYXJzZUludChyZXF1ZXN0LmdldFBhcmFtZXRlcihXU0RMQWN0aW9uSW5wdXRzLlNPQVBfRU5WRUxPUEVfVFlQRSkpOwotV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci1TT0FQTWVzc2FnZVF1ZXVlIHNvYXBNZXNzYWdlUXVldWU7Ci1zd2l0Y2ggKHNvYXBFbnZlbG9wZVR5cGUpCi17Ci0gIGNhc2UgV1NETEFjdGlvbklucHV0cy5TT0FQX0VOVkVMT1BFX1RZUEVfUkVRVUVTVDoKLSAgICBzb2FwTWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldFNPQVBSZXF1ZXN0UXVldWUoKTsKLSAgICBicmVhazsKLSAgY2FzZSBXU0RMQWN0aW9uSW5wdXRzLlNPQVBfRU5WRUxPUEVfVFlQRV9SRVNQT05TRToKLSAgZGVmYXVsdDoKLSAgICBzb2FwTWVzc2FnZVF1ZXVlID0gd3NkbFBlcnNwZWN0aXZlLmdldFNPQVBSZXNwb25zZVF1ZXVlKCk7Ci0gICAgYnJlYWs7Ci19Ci1TdHJpbmcgbWVzc2FnZXMgPSBzb2FwTWVzc2FnZVF1ZXVlLmdldE1lc3NhZ2VzRnJvbUxpc3QoKTsKLSU+Ci08JT1tZXNzYWdlcyU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzNkMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfYWN0aW9uc19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfQUNUSU9OU19DT05UQUlORVIiKSU+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzZGxfcHJvcGVydGllc19jb250YWluZXIuanNwIiklPiIgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MSBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX3N0YXR1c19jb250YWluZXIuanNwIiklPiIgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MSBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX25hdmlnYXRvcl9jb250YWluZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MjBkZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIzMywqIiBib3JkZXI9MCBiZ2NvbG9yPSIjRUNFOUQ4Ij4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfVE9PTEJBUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX25hdmlnYXRvcl90b29sYmFyLmpzcCIpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPVdTRExGcmFtZU5hbWVzLldTRExfTkFWSUdBVE9SX0NPTlRFTlQlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX25hdmlnYXRvcl9jb250ZW50LmpzcCIpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9uYXZpZ2F0b3JfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9uYXZpZ2F0b3JfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2Q4MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfbmF2aWdhdG9yX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0lPiAgICAgIAotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9OQVZJR0FUT1JfQ09OVEVOVCIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3RyZWV2aWV3LmNzcyIpKSU+Ij4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9icm93c2VyZGV0ZWN0LmpzIikpJT4iPgotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3RyZWV2aWV3LmpzIikpJT4iPgotICAgIDwvc2NyaXB0PgotPC9oZWFkPgotPCUKLSAgICBTdHJpbmcgc2VsZWN0ZWRBbmNob3JOYW1lID0gIiI7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgaW50IGZvY3VzZWROb2RlSWQgPSBub2RlTWFuYWdlci5nZXRGb2N1c2VkTm9kZUlkKCk7Ci0gICAgU3RyaW5nIGZvY3VzZWRBbmNob3JOYW1lID0gU3RyaW5nLnZhbHVlT2YoZm9jdXNlZE5vZGVJZCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLSAgICAgICAgc2VsZWN0ZWRBbmNob3JOYW1lID0gc2VsZWN0ZWROb2RlLmdldEFuY2hvck5hbWUoKTsKLSAgICAgICAgaWYgKGZvY3VzZWROb2RlSWQgPT0gc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpKQotICAgICAgICAgICAgZm9jdXNlZEFuY2hvck5hbWUgPSBzZWxlY3RlZEFuY2hvck5hbWU7Ci0gICAgfQotJT4KLTxib2R5IG9uTG9hZD0ic2VsZi5sb2NhdGlvbi5oYXNoPScjPCU9Zm9jdXNlZEFuY2hvck5hbWUlPic7c2V0U2VsZWN0ZWRBbmNob3JOYW1lKCc8JT1zZWxlY3RlZEFuY2hvck5hbWUlPicpIiBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotICAgIDxkaXYgaWQ9InRyZWVjb250ZW50Ym9yZGVyIj4KLSAgICAgICAgPCU9bm9kZU1hbmFnZXIucmVuZGVyVHJlZVZpZXcocmVzcG9uc2UpJT4KLSAgICA8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX25hdmlnYXRvcl90b29sYmFyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX25hdmlnYXRvcl90b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiNzA1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9uYXZpZ2F0b3JfdG9vbGJhci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3Rvb2xiYXIuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbGZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci08L3NjcmlwdD4gIAotPC9oZWFkPgotPGJvZHkgY2xhc3M9InRvb2xiYXJib2R5bWFyZ2luIj4KLTxkaXYgaWQ9InRvb2xiYXJib3JkZXIiPgotICA8ZGl2IGlkPSJ0b29sYmFyIiBvbmRibGNsaWNrPSJwcm9jZXNzRnJhbWVzZXRTaXplcyhkb2N1bWVudC5mb3Jtc1swXSkiPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgZm9ybUFjdGlvbi5hcHBlbmQoIndzZGwvYWN0aW9ucy9SZXNpemVXU0RMRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChXU0RMRnJhbWVOYW1lcy5XU0RMX05BVklHQVRPUl9DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvUHJvY2Vzc1dTRExGcmFtZXNldHNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0yNSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9uYXZpZ2F0b3IuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmICh3c2RsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKTsKLSAgIGVsc2UKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9OQVZJR0FUT1IiKSU+PC90ZD4KLTwlCi0gICBTdHJpbmcgYWx0UmVmcmVzaCA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1JFRlJFU0giKTsKLSAgIFN0cmluZyBhbHRDbGVhciA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0NMRUFSIik7Ci0lPiAgICAgICAgICAgCi0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NkbC9hY3Rpb25zL1JlZnJlc2hXU0RMQWN0aW9uSlNQLmpzcCIpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2IG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKSIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiIGFsdD0iPCU9YWx0UmVmcmVzaCU+IiB0aXRsZT0iPCU9YWx0UmVmcmVzaCU+Ij48L2E+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL2FjdGlvbnMvQ2xlYXJXU0RMQWN0aW9uSlNQLmpzcCIpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRDbGVhciU+IiB0aXRsZT0iPCU9YWx0Q2xlYXIlPiI+PC9hPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBhOThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgY29scz0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpJT4iIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9OQVZJR0FUT1JfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2RsX25hdmlnYXRvcl9jb250YWluZXIuanNwIiklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9BQ1RJT05TX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzZGxfYWN0aW9uc19jb250YWluZXIuanNwIiklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4ZTIzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NkbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX0NPTlRFTlQlPiIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmIyNTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3Byb3BlcnRpZXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTwlCi0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyOwotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sTWFuYWdlcigpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRUb29sICE9IG51bGwgJiYgc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikgewotICAgICAgICAlPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIGxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoc2VsZWN0ZWRUb29sLmdldEZvcm1MaW5rKCkpKSU+IjsKLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19BQ1RJT05fU0VMRUNURUQiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0gICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfcHJvcGVydGllc190b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyMWQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3Rvb2xiYXIuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2RsL3NjcmlwdHMvd3NkbGZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJ3c2RsL2FjdGlvbnMvUmVzaXplV1NETEZyYW1lc0FjdGlvbkpTUC5qc3AiKTsKLSU+ICAKLTwvanNwOnVzZUJlYW4+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUZyYW1lTmFtZS5hcHBlbmQoV1NETEZyYW1lTmFtZXMuV1NETF9QUk9QRVJUSUVTX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9mb3Jtcy9Qcm9jZXNzV1NETEZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2FjdGlvbnMuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmICh3c2RsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgIHsKLSAgICAgaWYgKHdzZGxQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkuc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgfQotICAgaWYgKGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPT0gbnVsbCkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9BQ1RJT05TIiklPjwvdGQ+Ci08JQotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NkbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLSAgICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXI7Ci0gICAgICAgIGlmIChzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPHRvb2xNYW5hZ2VyLmdldE51bWJlck9mVG9vbHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUb29sIHRvb2wgPSAoVG9vbCl0b29sTWFuYWdlci5nZXRUb29sKGkpOwotICAgICAgICAgICAgJT4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PCU9dG9vbC5yZW5kZXJUb29sKHJlc3BvbnNlLGNvbnRyb2xsZXIpJT48L3RkPgotICAgICAgICAgICAgPCUKLSAgICAgICAgfQotICAgIH0KLSU+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9yZXN1bHRfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9yZXN1bHRfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjMwZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfcmVzdWx0X2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIGludCB2aWV3SUQgPSB3c2RsUGVyc3BlY3RpdmUuZ2V0U3RhdHVzQ29udGVudFR5cGUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvdGFibGVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9wYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgZnVuY3Rpb24gc3dpdGNoUmVhZE9ubHlGcmFnbWVudHNWaWV3KCkgewotICAgIHBlcnNwZWN0aXZlV29ya0FyZWEubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL2FjdGlvbnMvU3dpdGNoUmVhZE9ubHlGcmFnbWVudFZpZXdzQWN0aW9uSlNQLmpzcCIpKSU+IjsKLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGFsaWduPSJyaWdodCIgY2xhc3M9ImxhYmVscyI+Ci08JQotICAgICAgICBpZiAodmlld0lEID09IHdzZGxQZXJzcGVjdGl2ZS5TVEFUVVNfQ09OVEVOVF9SRVNVTFRfU09VUkNFKQotICAgICAgICB7ICAgICAKLSU+Ci0gICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpzd2l0Y2hSZWFkT25seUZyYWdtZW50c1ZpZXcoKSIgdGl0bGU9IjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfU1dJVENIX1RPX0ZPUk1fVklFVyIpJT4iPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xJTktfRk9STSIpJT48L2E+Ci08JQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotJT4KLSAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnN3aXRjaFJlYWRPbmx5RnJhZ21lbnRzVmlldygpIiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9TV0lUQ0hfVE9fU09VUkNFX1ZJRVciKSU+Ij48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MSU5LX1NPVVJDRSIpJT48L2E+Ci08JQotICAgICAgICB9Ci0lPiAgIAotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPCUKLSAgaWYgKHZpZXdJRCA9PSB3c2RsUGVyc3BlY3RpdmUuU1RBVFVTX0NPTlRFTlRfUkVTVUxUX1NPVVJDRSkKLSAgewotJT4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvUmVhZE9ubHlGcmFnbWVudHNTb2FwVmlldy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICB9Ci0gIGVsc2UKLSAgewotJT4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvUmVhZE9ubHlGcmFnbWVudHNGb3JtVmlldy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9zdGF0dXNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDNhY2VmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0RMUGVyc3BlY3RpdmUgd3NkbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0RMUGVyc3BlY3RpdmUoKTsKLSAgIFN0cmluZyBzdGF0dXNDb250ZW50U3JjID0gIndzZGxfc3RhdHVzX2NvbnRlbnQuanNwIjsKLSAgIHN3aXRjaCAod3NkbFBlcnNwZWN0aXZlLmdldFN0YXR1c0NvbnRlbnRUeXBlKCkpCi0gICB7Ci0gICAgIGNhc2UgV1NETFBlcnNwZWN0aXZlLlNUQVRVU19DT05URU5UX1JFU1VMVF9GT1JNOgotICAgICAgIHN0YXR1c0NvbnRlbnRTcmMgPSAid3NkbF9yZXN1bHRfY29udGVudC5qc3AiOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIFdTRExQZXJzcGVjdGl2ZS5TVEFUVVNfQ09OVEVOVF9SRVNVTFRfU09VUkNFOgotICAgICAJc3RhdHVzQ29udGVudFNyYyA9ICJ3c2RsX3Jlc3VsdF9jb250ZW50LmpzcCI7Ci0gICAgIAlicmVhazsKLSAgIH0KLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2RsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfVE9PTEJBUiU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzZGxfc3RhdHVzX3Rvb2xiYXIuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfQ09OVEVOVCU+IiB0aXRsZT0iPCU9d3NkbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoc3RhdHVzQ29udGVudFNyYyklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c19jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzZTc2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGwvd3NkbF9zdGF0dXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzZGwucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NETFBlcnNwZWN0aXZlIHdzZGxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NETFBlcnNwZWN0aXZlKCk7Ci0gICB3c2RsUGVyc3BlY3RpdmUuc2V0U3RhdHVzQ29udGVudFR5cGUoV1NETFBlcnNwZWN0aXZlLlNUQVRVU19DT05URU5UX0RFRkFVTFQpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfQ09OVEVOVCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPHByZT4KLTwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlUXVldWUoKS5nZXRNZXNzYWdlc0Zyb21MaXN0KCklPgotICAgICAgICA8L3ByZT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfc3RhdHVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsL3dzZGxfc3RhdHVzX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGRjNzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbC93c2RsX3N0YXR1c190b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NkbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTRExQZXJzcGVjdGl2ZSB3c2RsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTRExQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzZGxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NkbC9zY3JpcHRzL3dzZGxmcmFtZXNldHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9InRvb2xiYXJib2R5bWFyZ2luIj4KLTxkaXYgaWQ9InRvb2xiYXJib3JkZXIiPgotICA8ZGl2IGlkPSJ0b29sYmFyIiBvbmRibGNsaWNrPSJwcm9jZXNzRnJhbWVzZXRTaXplcyhkb2N1bWVudC5mb3Jtc1swXSkiPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgZm9ybUFjdGlvbi5hcHBlbmQoIndzZGwvYWN0aW9ucy9SZXNpemVXU0RMRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChXU0RMRnJhbWVOYW1lcy5XU0RMX1NUQVRVU19DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzZGwvZm9ybXMvUHJvY2Vzc1dTRExGcmFtZXNldHNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0yNSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zdGF0dXMuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmICh3c2RsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgIHsKLSAgICAgaWYgKHdzZGxQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKTsKLSAgIH0KLSAgIGlmIChkb3VibGVDbGlja0NvbHVtblRpdGxlID09IG51bGwpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkUiKTsKLSU+ICAgICAgICAKLSAgICAgICAgPHRkIGlkPSJkb3VibGVjbGlja2NvbHVtbiIgdGl0bGU9IjwlPWRvdWJsZUNsaWNrQ29sdW1uVGl0bGUlPiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfU1RBVFVTIiklPjwvdGQ+Ci08JQotICAgU3RyaW5nIGFsdENsZWFyID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfQ0xFQVIiKTsKLSU+ICAgICAgICAgICAKLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2RsL3dzZGxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iIHRhcmdldD0iPCU9V1NETEZyYW1lTmFtZXMuV1NETF9TVEFUVVNfQ09OVEVOVCU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2IG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcykiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIiBhbHQ9IjwlPWFsdENsZWFyJT4iIHRpdGxlPSI8JT1hbHRDbGVhciU+Ij48L2E+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbF9icm93c2VyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbF9icm93c2VyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2YmY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGxfYnJvd3Nlci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuKiIgJT4KLQotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLSAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICBTdHJpbmcgd3NkbFR5cGVTdHJpbmcgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuV1NETF9UWVBFKTsKLSAgIGludCB3c2RsVHlwZSA9IEFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0U7Ci0gICB0cnkKLSAgIHsKLSAgICAgd3NkbFR5cGUgPSBJbnRlZ2VyLnBhcnNlSW50KHdzZGxUeXBlU3RyaW5nKTsKLSAgIH0KLSAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgIHsKLSAgIH0KLSAgIGNvbnRyb2xsZXIuc2V0V1NETFR5cGUod3NkbFR5cGUpOwotJT4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPgotPCUKLSAgIFN0cmluZyB3c2RsU291cmNlOwotICAgaWYgKHdzZGxUeXBlID09IEFjdGlvbklucHV0cy5XU0RMX1RZUEVfU0VSVklDRV9JTlRFUkZBQ0UpCi0gICAgIHdzZGxTb3VyY2UgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRVMiKTsKLSAgIGVsc2UKLSAgICAgd3NkbFNvdXJjZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiV1NETF9UWVBFX1NFUlZJQ0VTIik7Ci0gICAgIAotICAgU3RyaW5nQnVmZmVyIHNlc3Npb25JZFBhcmFtID0gbmV3IFN0cmluZ0J1ZmZlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLSAgIHNlc3Npb25JZFBhcmFtLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotICAgCi0gICBTdHJpbmdCdWZmZXIgdG9vbGJhckxpbmsgPSBuZXcgU3RyaW5nQnVmZmVyKCJ3c2RsX3Rvb2xiYXIuanNwPyIpOwotICAgdG9vbGJhckxpbmsuYXBwZW5kKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpLmFwcGVuZCgnPScpLmFwcGVuZChzZXNzaW9uSWQpOwotJT4KLSAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIlRJVExFX1dTRExfQlJPV1NFUiIsd3NkbFNvdXJjZSklPgotICA8L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9RnJhbWVOYW1lcy5XU0RMX1RPT0xCQVIlPiIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfV1NETF9UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQodG9vbGJhckxpbmsudG9TdHJpbmcoKSkpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLSAgPGZyYW1lIG5hbWU9IjwlPUZyYW1lTmFtZXMuV1NETF9DT05URU5UJT4iIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1dTRExfQ09OVEVOVCIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFByb3h5TG9hZFBhZ2VBY3Rpb24uZ2V0QWN0aW9uTGluayhzZXNzaW9uSWQsIndzZGxfY29udGVudC5qc3AiKSkpJT4iIG5vcmVzaXplIHNjcm9sbGluZz0ibm8iIGZyYW1lYm9yZGVyPTAgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGxfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZGxfY29udGVudC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTY3NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnVkZGkudXRpbC5VZGRpNGpIZWxwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5mYXZvcml0ZXMucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmZhdm9yaXRlcy5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53c2RsLmV4dGVuc2lvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgud3NkbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5uZXQuKiIgJT4KLQotPCUKLSAgIFN0cmluZyBzZXNzaW9uSWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihBY3Rpb25JbnB1dHMuU0VTU0lPTklEKTsKLSAgIEh0dHBTZXNzaW9uIGN1cnJlbnRTZXNzaW9uID0gKEh0dHBTZXNzaW9uKWFwcGxpY2F0aW9uLmdldEF0dHJpYnV0ZShzZXNzaW9uSWQpOwotICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gKENvbnRyb2xsZXIpY3VycmVudFNlc3Npb24uZ2V0QXR0cmlidXRlKCJjb250cm9sbGVyIik7Ci0gICBpbnQgd3NkbFR5cGUgPSBjb250cm9sbGVyLmdldFdTRExUeXBlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICA8dGl0bGU+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9XU0RMX0NPTlRFTlQiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgic2NyaXB0cy9yZXN1bWVwcm94eWxvYWRwYWdlLmpzIikpJT4iPgotPC9zY3JpcHQ+ICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgc2VjdGlvbklkcyA9IFsid29ya2JlbmNoIiwiZmF2b3JpdGVzIl07Ci0gIGZ1bmN0aW9uIGZpbGxXZWJQcm9qZWN0cygpCi0gIHsKLSAgICB2YXIgeCA9IDA7Ci08JQotICAgewotICAgICBJV29ya3NwYWNlUm9vdCBpV29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBpV29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0cygpOwotICAgICBmb3IgKGludCBpPTA7aTxwcm9qZWN0cy5sZW5ndGg7aSsrKQotICAgICB7Ci0gICAgICAgaWYgKCFwcm9qZWN0c1tpXS5pc09wZW4oKSkKLSAgICAgICAgIGNvbnRpbnVlOwotLy8gVE9ETzogU3R1YmJlZCBvdXQgZm9sbG93aW5nIGxpbmUgdG8gcmVtb3ZlIHVud2FudGVkIGRlcGVuZGVuY3kKLS8vIG9uIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlscy4KLS8vIFRoaXMgZW50aXJlIEpTUCB3aWxsIGJlIHJld3JpdHRlbiBpbiBNNSB0byB1c2UgdGhlIG5ldyBXU0ZpbmRlciBGL3cuCi0vLyAgICAgaWYgKFJlc291cmNlVXRpbHMuaXNXZWJQcm9qZWN0KHByb2plY3RzW2ldKSkKLSAgICAgICB7Ci0lPgotICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5QUk9KRUNUJT4ub3B0aW9uc1t4KytdID0gbmV3IE9wdGlvbigiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHByb2plY3RzW2ldLmdldE5hbWUoKSklPiIsIjwlPUhUTUxVdGlscy5KU01hbmdsZShwcm9qZWN0c1tpXS5nZXROYW1lKCkpJT4iKTsKLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0lPgotICAgIGlmIChkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuUFJPSkVDVCU+Lm9wdGlvbnMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuUFJPSkVDVCU+Lm9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlOwotICAgICAgZmlsbFdTRExGaWxlcyhkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuUFJPSkVDVCU+Lm9wdGlvbnNbMF0udmFsdWUpOwotICAgIH0KLSAgfQotCi08JSEgcHJpdmF0ZSBWZWN0b3Igd3NkbFVSTHNfID0gbmV3IFZlY3RvcigpOyAlPgotCi0gIGZ1bmN0aW9uIGZpbGxXU0RMRmlsZXMoc2VsZWN0ZWRXZWJQcm9qZWN0TmFtZSkKLSAgewotICAgIHZhciBjdXJyZW50TnVtYmVyT2ZPcHRpb25zID0gZG9jdW1lbnQuZm9ybXNbMF0uPCU9QWN0aW9uSW5wdXRzLlFVRVJZX0lOUFVUX1dFQlBST0pFQ1RfV1NETF9VUkwlPi5vcHRpb25zLmxlbmd0aDsKLSAgICBmb3IgKHZhciBpPTA7aTxjdXJyZW50TnVtYmVyT2ZPcHRpb25zO2krKykKLSAgICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4ub3B0aW9uc1swXSA9IG51bGw7Ci08JQotICAgewotLy8gVE9ETzogU3R1YmJlZCBvdXQgZm9sbG93aW5nIGxpbmUgdG8gcmVtb3ZlIHVud2FudGVkIGRlcGVuZGVuY3kKLS8vIG9uIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi53c2ZpbmRlci5XU0ZpbmRlclJlZ2lzdHJ5LgotLy8gVGhpcyBlbnRpcmUgSlNQIHdpbGwgYmUgcmV3cml0dGVuIGluIE01IHRvIHVzZSB0aGUgbmV3IFdTRmluZGVyIEYvdy4KLS8vICAgTGlzdCB3cyA9IFdTRmluZGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRXZWJTZXJ2aWNlcygpOwotICAgICBMaXN0IHdzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLSAgICAgSVdvcmtzcGFjZVJvb3QgaVdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gaVdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdHMoKTsKLSAgICAgZm9yIChpbnQgaT0wO2k8cHJvamVjdHMubGVuZ3RoO2krKykKLSAgICAgewotICAgICAgIGlmICghcHJvamVjdHNbaV0uaXNPcGVuKCkpCi0gICAgICAgICBjb250aW51ZTsKLS8vIFRPRE86IFN0dWJiZWQgb3V0IGZvbGxvd2luZyBsaW5lIHRvIHJlbW92ZSB1bndhbnRlZCBkZXBlbmRlbmN5Ci0vLyBvbiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHMuCi0vLyBUaGlzIGVudGlyZSBKU1Agd2lsbCBiZSByZXdyaXR0ZW4gaW4gTTUgdG8gdXNlIHRoZSBuZXcgV1NGaW5kZXIgRi93LgotLy8gICAgIGlmIChSZXNvdXJjZVV0aWxzLmlzV2ViUHJvamVjdChwcm9qZWN0c1tpXSkpCi0gICAgICAgewotJT4KLSAgICBpZiAoc2VsZWN0ZWRXZWJQcm9qZWN0TmFtZSA9PSAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKHByb2plY3RzW2ldLmdldE5hbWUoKSklPiIpCi0gICAgewotICAgICAgdmFyIHg9MDsKLTwlCi0gICAgICAgICB0cnkKLSAgICAgICAgIHsKLSAgICAgICAgICAgLy9JQmFzZVdlYk5hdHVyZSB3ZWJOYXR1cmUgPSAoSUJhc2VXZWJOYXR1cmUpcHJvamVjdHNbaV0uZ2V0TmF0dXJlKElXZWJOYXR1cmVDb25zdGFudHMuSjJFRV9OQVRVUkVfSUQpOwotICAgICAgICAgICBTdHJpbmcgY29udGV4dFJvb3QgPSBudWxsOy8vd2ViTmF0dXJlLmdldENvbnRleHRSb290KCk7Ci0gICAgICAgICAgIHdzZGxVUkxzXy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gd3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgewotICAgICAgICAgICAgIFN0cmluZyB3c2RsID0gaXQubmV4dCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgU3RyaW5nIGZpbGUgPSAobmV3IFVSTCh3c2RsKSkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgIGludCBjb250ZXh0Um9vdExlbiA9IGNvbnRleHRSb290Lmxlbmd0aCgpOwotICAgICAgICAgICAgIGlmIChmaWxlLmxlbmd0aCgpID4gY29udGV4dFJvb3RMZW4gJiYgY29udGV4dFJvb3QuZXF1YWxzKGZpbGUuc3Vic3RyaW5nKDEsIGNvbnRleHRSb290TGVuKzEpKSAmJiAoZmlsZS5sZW5ndGgoKSA8IGNvbnRleHRSb290TGVuKzIgfHwgZmlsZS5jaGFyQXQoY29udGV4dFJvb3RMZW4rMSkgPT0gJy8nKSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB3c2RsVVJMc18uYWRkKHdzZGwpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAod3NkbFR5cGUgPT0gQWN0aW9uSW5wdXRzLldTRExfVFlQRV9TRVJWSUNFX0lOVEVSRkFDRSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3c2RsRm9sZGVyID0gbnVsbDsvL3dlYk5hdHVyZS5nZXRSb290UHVibGlzaGFibGVGb2xkZXIoKS5nZXRGdWxsUGF0aCgpLmFwcGVuZCgid3NkbCIpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgcHJvamVjdHNbaV0uYWNjZXB0KG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBJUGF0aCByZXNvdXJjZUZ1bGxQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXh0ID0gcmVzb3VyY2VGdWxsUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKGV4dCAhPSBudWxsICYmIGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJ3c2RsIikgJiYgcmVzb3VyY2VGdWxsUGF0aC50b1N0cmluZygpLnN0YXJ0c1dpdGgod3NkbEZvbGRlcikpCi0gICAgICAgICAgICAgICAgICAgewotLy8gVE9ETzogU3R1YmJlZCBvdXQgZm9sbG93aW5nIGxpbmVzIHRvIHJlbW92ZSB1bndhbnRlZCBkZXBlbmRlbmN5Ci0vLyBvbiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHMuCi0vLyBUaGlzIGVudGlyZSBKU1Agd2lsbCBiZSByZXdyaXR0ZW4gaW4gTTUgdG8gdXNlIHRoZSBuZXcgV1NGaW5kZXIgRi93LgotLy8gICAgICAgICAgICAgICAgICAgU3RyaW5nIHdzZGwgPSBSZXNvdXJjZVV0aWxzLmdldFVSTEZyb21QYXRoKHJlc291cmNlRnVsbFBhdGgsIG51bGwsIG51bGwpOwotLy8gICAgICAgICAgICAgICAgICAgaWYgKCF3c2RsVVJMc18uY29udGFpbnMod3NkbCkpCi0vLyAgICAgICAgICAgICAgICAgICAgIHdzZGxVUkxzXy5hZGQod3NkbCk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgIFVkZGk0akhlbHBlciB1ZGRpNGpIZWxwZXIgPSBuZXcgVWRkaTRqSGVscGVyKCk7Ci0gICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHdzZGxVUkxzXy5zaXplKCk7IGluZGV4KyspCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgRGVmaW5pdGlvbiB3c2RsRG9jdW1lbnQgPSB1ZGRpNGpIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSTHNfLmdldChpbmRleCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICBpZiAoIXVkZGk0akhlbHBlci5pc1NlcnZpY2VJbnRlcmZhY2Uod3NkbERvY3VtZW50KSAmJiAhdWRkaTRqSGVscGVyLmlzU2VydmljZUludGVyZmFjZVdpdGhCaW5kaW5nc09ubHkod3NkbERvY3VtZW50KSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgd3NkbFVSTHNfLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgIGluZGV4LS07Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB3c2RsVVJMc18uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLSAgICAgICAgICAgewotICAgICAgICAgICAgIFN0cmluZyB3c2RsID0gSFRNTFV0aWxzLkpTTWFuZ2xlKGl0Lm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAlPgotICAgICAgICAgICAgIGRvY3VtZW50LmZvcm1zWzBdLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4ub3B0aW9uc1t4KytdID0gbmV3IE9wdGlvbigiPCU9d3NkbCU+IiwiPCU9d3NkbCU+Iik7Ci0gICAgICAgICAgICAgPCUKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpCi0gICAgICAgICB7Ci0gICAgICAgICB9Ci0lPgotICAgIH0KLTwlCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci0lPgotICB9Ci0gIAotICBmdW5jdGlvbiBmaWxsRmF2b3JpdGVXU0RMRmlsZXMoKQotICB7Ci0gICAgdmFyIHggPSAwOwotPCUKLSAgIEZhdm9yaXRlc1BlcnNwZWN0aXZlIGZhdm9yaXRlc1BlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRGYXZvcml0ZXNQZXJzcGVjdGl2ZSgpOwotICAgTm9kZU1hbmFnZXIgZmF2b3JpdGVzTm9kZU1hbmFnZXIgPSBmYXZvcml0ZXNQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgVHJlZUVsZW1lbnQgZmF2b3JpdGVzTWFpbkVsZW1lbnQgPSBmYXZvcml0ZXNOb2RlTWFuYWdlci5nZXRSb290Tm9kZSgpLmdldFRyZWVFbGVtZW50KCk7Ci0gICBUcmVlRWxlbWVudCBmYXZvcml0ZVdTRExTZXJ2aWNlc0VsZW1lbnQgPSAoVHJlZUVsZW1lbnQpKGZhdm9yaXRlc01haW5FbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfRk9MREVSX05PREUpLm5leHRFbGVtZW50KCkpOwotICAgRW51bWVyYXRpb24gZmF2b3JpdGVXU0RMU2VydmljZUVsZW1lbnRzID0gZmF2b3JpdGVXU0RMU2VydmljZXNFbGVtZW50LmdldEVsZW1lbnRzKEZhdm9yaXRlc01vZGVsQ29uc3RhbnRzLlJFTF9XU0RMX1NFUlZJQ0VfTk9ERSk7Ci0gICB3aGlsZSAoZmF2b3JpdGVXU0RMU2VydmljZUVsZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKQotICAgewotICAgICBGYXZvcml0ZXNXU0RMU2VydmljZUVsZW1lbnQgZmF2b3JpdGVXU0RMU2VydmljZUVsZW1lbnQgPSAoRmF2b3JpdGVzV1NETFNlcnZpY2VFbGVtZW50KWZhdm9yaXRlV1NETFNlcnZpY2VFbGVtZW50cy5uZXh0RWxlbWVudCgpOwotICAgICBTdHJpbmcgdXJsID0gSFRNTFV0aWxzLkpTTWFuZ2xlKChmYXZvcml0ZVdTRExTZXJ2aWNlRWxlbWVudC5nZXRTZXJ2aWNlKCkuZ2V0RGVzY3JpcHRpb25zKCkpWzBdLmdldExvY2F0aW9uKCkpOwotJT4KLSAgICBkb2N1bWVudC5mb3Jtc1swXS48JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfRkFWT1JJVEVfV1NETF9VUkwlPi5vcHRpb25zW3grK10gPSBuZXcgT3B0aW9uKCI8JT11cmwlPiIsIjwlPXVybCU+Iik7Ci08JSAgICAgCi0gICB9Ci0lPiAgCi0gIH0KLSAgCi0gIGZ1bmN0aW9uIHRvZ2dsZUZvcm0oZm9ybUluZGV4KQotICB7Ci0gICAgZm9yICh2YXIgaT0wO2k8c2VjdGlvbklkcy5sZW5ndGg7aSsrKQotICAgIHsKLSAgICAgIGlmIChpID09IGZvcm1JbmRleCkKLSAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VjdGlvbklkc1tpXSkuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgICAgZWxzZQotICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzZWN0aW9uSWRzW2ldKS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwotICAgIH0KLSAgfQotICAKLSAgZnVuY3Rpb24gc2V0RGVmYXVsdHMoKQotICB7Ci0gICAgZmlsbFdlYlByb2plY3RzKCk7Ci0gICAgZmlsbEZhdm9yaXRlV1NETEZpbGVzKCk7Ci0gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VjdGlvbklkc1swXSkuc3R5bGUuZGlzcGxheSA9ICIiOwotICAgIHZhciBsb2FkU2NyZWVuVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibG9hZFNjcmVlbiIpOwotICAgIGlmIChsb2FkU2NyZWVuVGFibGUucm93cy5sZW5ndGggPiAwKQotICAgICAgbG9hZFNjcmVlblRhYmxlLmRlbGV0ZVJvdygwKTsKLSAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpblNjcmVlbiIpLnN0eWxlLmRpc3BsYXkgPSAiIjsgICAgICAKLSAgfQotPC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci0gIDxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDx0YWJsZSBpZD0ibG9hZFNjcmVlbiI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19MT0FEX0lOX1BST0dSRVNTIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxkaXYgaWQ9Im1haW5TY3JlZW4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KLSAgICAgIDxmb3JtIHN0eWxlPSJtYXJnaW4tdG9wOjAiPgotPCUKLSAgIGlmICh3c2RsVHlwZSA9PSBBY3Rpb25JbnB1dHMuV1NETF9UWVBFX1NFUlZJQ0UpCi0gICB7Ci0lPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPiA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9TT1VSQ0UiKSU+IDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGQ+ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ic2VsZWN0RnJvbSIgb25DbGljaz0idG9nZ2xlRm9ybSgwKSIgY2hlY2tlZD48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9TT1VSQ0VfV0VCUFJPSkVDVFMiKSU+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0ic2VsZWN0RnJvbSIgb25DbGljaz0idG9nZ2xlRm9ybSgxKSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfU09VUkNFX0ZBVk9SSVRFUyIpJT4KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLTwlICAgICAgICAgICAgICAKLSAgIH0KLSU+ICAgICAgICAgICAgICAKLSAgICAgICAgPGRpdiBpZD0id29ya2JlbmNoIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gICAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dFQl9QUk9KRUNUIiklPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQgbm93cmFwPgotICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlBST0pFQ1QlPiIgb25DaGFuZ2U9ImZpbGxXU0RMRmlsZXModGhpcy52YWx1ZSkiIGNsYXNzPSJzZWxlY3RsaXN0Ij4KLSAgICAgICAgICAgICAgICA8L3NlbGVjdD4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9SRUZSRVNIIiklPiIgb25DbGljaz0iZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKCkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0xMCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfV0VCUFJPSkVDVF9XU0RMX1VSTCU+IiBjbGFzcz0ic2VsZWN0bGlzdCI+Ci0gICAgICAgICAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgbm93cmFwIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9HTyIpJT4iIG9uQ2xpY2s9InRvcC5vcGVuZXIudGFyZ2V0V1NETFVSTEVsZW1lbnQudmFsdWU9dGhpcy5mb3JtLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9XRUJQUk9KRUNUX1dTRExfVVJMJT4udmFsdWU7dG9wLmNsb3NlKCkiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIiBub3dyYXAgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQlVUVE9OX0NBTkNFTCIpJT4iIG9uQ2xpY2s9InRvcC5jbG9zZSgpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RhYmxlPgotICAgICAgICA8L2Rpdj4KLSAgICAgICAgPGRpdiBpZD0iZmF2b3JpdGVzIiBzdHlsZT0iZGlzcGxheTpub25lOyI+Ci0gICAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgY2xhc3M9ImxhYmVscyI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfVVJMIiklPjwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuUVVFUllfSU5QVVRfRkFWT1JJVEVfV1NETF9VUkwlPiIgY2xhc3M9InNlbGVjdGxpc3QiPgotICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdGFibGU+Ci0gICAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgbm93cmFwIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9HTyIpJT4iIG9uQ2xpY2s9InRvcC5vcGVuZXIudGFyZ2V0V1NETFVSTEVsZW1lbnQudmFsdWU9dGhpcy5mb3JtLjwlPUFjdGlvbklucHV0cy5RVUVSWV9JTlBVVF9GQVZPUklURV9XU0RMX1VSTCU+LnZhbHVlO3RvcC5jbG9zZSgpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgPHRkIGhlaWdodD0zMCB2YWxpZ249ImJvdHRvbSIgbm93cmFwIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0JVVFRPTl9DQU5DRUwiKSU+IiBvbkNsaWNrPSJ0b3AuY2xvc2UoKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgPC90YWJsZT4gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotICAgICAgPC9mb3JtPgotICAgIDwvZGl2PgotICA8L2Rpdj4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBzZXREZWZhdWx0cygpOwotICByZXN1bWVQcm94eUxvYWRQYWdlKCk7Ci08L3NjcmlwdD4gIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2RsX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGNjYzU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NkbF90b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08JQotICAgU3RyaW5nIHNlc3Npb25JZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKEFjdGlvbklucHV0cy5TRVNTSU9OSUQpOwotICAgSHR0cFNlc3Npb24gY3VycmVudFNlc3Npb24gPSAoSHR0cFNlc3Npb24pYXBwbGljYXRpb24uZ2V0QXR0cmlidXRlKHNlc3Npb25JZCk7Ci0gICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSAoQ29udHJvbGxlciljdXJyZW50U2Vzc2lvbi5nZXRBdHRyaWJ1dGUoImNvbnRyb2xsZXIiKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1dTRExfVE9PTEJBUiIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy90b29sYmFyLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IG9uVW5sb2FkPSJ0b3Aub3BlbmVyLndzZGxXaW5kb3dDbG9zZWQ9dHJ1ZSIgY2xhc3M9InRvb2xiYXJib2R5bWFyZ2luIj4KLTxkaXYgaWQ9InRvb2xiYXJib3JkZXIiPgotICA8ZGl2IGlkPSJ0b29sYmFyIj4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0yNSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy93c2RsLmdpZiIpKSU+IiB3aWR0aD0xNiBoZWlnaHQ9MTY+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX1dTRExfQlJPV1NFUiIpJT48L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICA8L2Rpdj4KLTwvZGl2PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gIHRvcC5vcGVuZXIud3NkbFdpbmRvd0Nsb3NlZCA9IGZhbHNlOwotPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZXhwbG9yZXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2V4cGxvcmVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwYWE4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzZXhwbG9yZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5VUkxVdGlscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkVudW1lcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLioiJT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBmdW5jdGlvbiBpbml0V2luZG93TmFtZShuYW1lKQotICAgIHsKLSAgICAgIHdpbmRvdy5uYW1lID0gbmFtZTsKLSAgICB9Ci0gIDwvc2NyaXB0PgotICA8JQotICBTdHJpbmcgc2Vzc2lvbklkID0gc2Vzc2lvbi5nZXRJZCgpOwotICAlPgotICA8anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iPgotICAgIDwlCi0gICAgLy8gQWRkIHRoZSBzZXNzaW9uIHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBhbGxvd3MgdXMgdG8gcmVzdXJyZWN0IHRoZSBzZXNzaW9uIGV2ZW4gaWYgdGhlIGJyb3dzZXIgY2hvb3NlcyBub3QgdG8gcGFydGljaXBhdGUuCi0gICAgYXBwbGljYXRpb24uc2V0QXR0cmlidXRlKHNlc3Npb25JZCxzZXNzaW9uKTsKLQotICAgIGlmIChzZXNzaW9uLmdldE1heEluYWN0aXZlSW50ZXJ2YWwoKSA+IDApCi0gICAgICBzZXNzaW9uLnNldE1heEluYWN0aXZlSW50ZXJ2YWwoLTEpOwotCi0gICAgLy8gTGF1bmNoT3B0aW9uTWFuYWdlciAoYmVsb3cpIGhhbmRsZXMgbW9zdCBvcHRpb25zLAotICAgIC8vIGJ1dCBuZWVkIHRvIGdldCBzdGF0ZSBhbmQgaW5zdGFsbCBsb2NhdGlvbnMgZWFybGllciwKLSAgICAvLyBzcGVjaWZpY2FsbHkgYmVmb3JlIGNvbnRyb2xsZXIuaW5pdCgpLgotICAgIEVudW1lcmF0aW9uIHBhcmFtTmFtZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Ci0gICAgd2hpbGUgKHBhcmFtTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpOwotICAgICAgU3RyaW5nW10gcGFyYW1WYWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbU5hbWUpOwotICAgICAgaWYgKHBhcmFtVmFsdWVzICE9IG51bGwgJiYgcGFyYW1WYWx1ZXMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGRlY29kZWRQYXJhbU5hbWUgPSBVUkxVdGlscy5kZWNvZGUocGFyYW1OYW1lKTsKLSAgICAgICAgaWYgKGRlY29kZWRQYXJhbU5hbWUuZXF1YWxzKExhdW5jaE9wdGlvbnMuREVGQVVMVF9GQVZPUklURVNfTE9DQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgY29udHJvbGxlci5zZXREZWZhdWx0RmF2b3JpdGVzTG9jYXRpb24ocGFyYW1WYWx1ZXNbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGRlY29kZWRQYXJhbU5hbWUuZXF1YWxzKExhdW5jaE9wdGlvbnMuU1RBVEVfTE9DQVRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgY29udHJvbGxlci5zZXRTdGF0ZUxvY2F0aW9uKHBhcmFtVmFsdWVzWzBdKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIGNvbnRyb2xsZXIuaW5pdCgpCi0gICAgY29udHJvbGxlci5pbml0KHNlc3Npb25JZCxhcHBsaWNhdGlvbixyZXF1ZXN0LmdldENvbnRleHRQYXRoKCkpOwotICAgICU+Ci0gIDwvanNwOnVzZUJlYW4+Ci0gIDwlCi0gIC8vIHByZWxvYWQgZnJvbSBMYXVuY2hPcHRpb25NYW5hZ2VyCi0gIFN0cmluZyBrZXkgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihVUkxVdGlscy5lbmNvZGUoV1NFeHBsb3JlckNvbnRleHQuSUQpKTsKLSAgaWYgKGtleSAhPSBudWxsICYmIGtleS5sZW5ndGgoKSA+IDApCi0gIHsKLSAgICBMYXVuY2hPcHRpb25zTWFuYWdlciBtYW5hZ2VyID0gTGF1bmNoT3B0aW9uc01hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICBtYW5hZ2VyLm1hbmFnZShrZXksIHNlc3Npb25JZCwgYXBwbGljYXRpb24pOwotICB9Ci0gICU+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvYWN0aW9uZW5naW5lLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiVElUTEVfV1NFWFBMT1JFUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPCUKLS8vIHJlc2V0IHBlcnNwZWN0aXZlIGNvbnRlbnQgdG8gYmxhbmsKLWNvbnRyb2xsZXIuZW5hYmxlUGVyc3BlY3RpdmVDb250ZW50QmxhbmsodHJ1ZSk7Ci0lPgotPGZyYW1lc2V0IHJvd3M9IjAsMzUsKiIgYm9yZGVyPTAgb25sb2FkPSJqYXZhc2NyaXB0OmluaXRXaW5kb3dOYW1lKCc8JT1GcmFtZU5hbWVzLldJTkRPV19OQU1FX1dTRVhQTE9SRVJfSlNQJT4nKSI+Ci0gIDxmcmFtZSBuYW1lPSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BFUlNQRUNUSVZFX1dPUktBUkVBIiklPiIgZnJhbWVib3JkZXI9MCBub3Jlc2l6ZT4KLSAgPGZyYW1lIG5hbWU9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfVE9PTEJBUiU+IiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QRVJTUEVDVElWRV9UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInBlcnNwZWN0aXZlX3Rvb2xiYXIuanNwIikpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBub3Jlc2l6ZT4KLSAgPGZyYW1lIG5hbWU9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfQ09OVEVOVCU+IiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QRVJTUEVDVElWRV9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInBlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTAgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MD4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9DbGVhck5vZGVDb25maXJtSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL0NsZWFyTm9kZUNvbmZpcm1KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWE1MmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL0NsZWFyTm9kZUNvbmZpcm1KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQ2xlYXJXU0lMQWN0aW9uIiU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICAgIGlmIChjb25maXJtKCI8JT1jb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19DT05GSVJNX1JFTU9WRV9OT0RFIiwgY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldE5vZGVOYW1lKCkpJT4iKSkgewotICAgICAgICAgICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQ2xlYXJXU0lMQWN0aW9uLmdldEFjdGlvbkxpbmsoY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldE5vZGVJZCgpKSkpJT4iOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgd3NpbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICAgICAgd3NpbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICB9Ci0gICAgPC9zY3JpcHQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9DbGVhcldTSUxBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiYjEzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9DbGVhcldTSUxBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udWRkaS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5DbGVhcldTSUxBY3Rpb24iJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICAgQ2xlYXJXU0lMQWN0aW9uIGFjdGlvbiA9IG5ldyBDbGVhcldTSUxBY3Rpb24oY29udHJvbGxlcik7Ci0KLSAgICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9DbGVhck5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvSW1wb3J0V1NETFRvRmlsZVN5c3RlbUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1Yjk0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5pby4qIiAlPgotCi0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICBJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uIGFjdGlvbiA9IG5ldyBJbXBvcnRXU0RMVG9GaWxlU3lzdGVtQWN0aW9uKGNvbnRyb2xsZXIpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL0ltcG9ydFRvRmlsZVN5c3RlbUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9JbXBvcnRXU0lMVG9GaWxlU3lzdGVtQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL0ltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWRjZDhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL0ltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLioiICU+Ci0KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gIEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb24gYWN0aW9uID0gbmV3IEltcG9ydFdTSUxUb0ZpbGVTeXN0ZW1BY3Rpb24oY29udHJvbGxlcik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvSW1wb3J0VG9GaWxlU3lzdGVtQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL09wZW5XU0lMQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL09wZW5XU0lMQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3NDAyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9PcGVuV1NJTEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci0gIDwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHk+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotT3BlbldTSUxBY3Rpb24gYWN0aW9uID0gbmV3IE9wZW5XU0lMQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWJvb2xlYW4gaW5wdXRzVmFsaWQgPSBhY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotaWYgKCFpbnB1dHNWYWxpZCkgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgd3NpbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgd3NpbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICA8L3NjcmlwdD4KLTwlCi19Ci1lbHNlIHsKLSAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSAgaWYgKGFjdGlvblJlc3VsdCkgewotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIGlmIChpc01pY3Jvc29mdEludGVybmV0RXhwbG9yZXIoKSkgewotICAgICAgICB3c2lsTmF2aWdhdG9yQ29udGVudC5sb2NhdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICB3c2lsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotICBlbHNlIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICB3c2lsUHJvcGVydGllc0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLX0KLSU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9PcGVuV1NJTExpbmtBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvT3BlbldTSUxMaW5rQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhNDAxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9PcGVuV1NJTExpbmtBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuT3BlbldTSUxMaW5rQWN0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLSAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1PcGVuV1NJTExpbmtBY3Rpb24gYWN0aW9uID0gbmV3IE9wZW5XU0lMTGlua0FjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1ib29sZWFuIGlucHV0c1ZhbGlkID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLWlmICghaW5wdXRzVmFsaWQpIHsKLSU+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIHdzaWxQcm9wZXJ0aWVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgPC9zY3JpcHQ+Ci08JQotfQotZWxzZSB7Ci0gIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gIGlmIChhY3Rpb25SZXN1bHQpIHsKLSU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpIHsKLSAgICAgICAgd3NpbE5hdmlnYXRvckNvbnRlbnQubG9jYXRpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX25hdmlnYXRvcl9jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgd3NpbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgICAgICB3c2lsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHBlcnNwZWN0aXZlQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCIpKSU+IjsKLSAgICA8L3NjcmlwdD4KLTwlCi0gIH0KLSAgZWxzZSB7Ci0lPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgd3NpbFByb3BlcnRpZXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgICB3c2lsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci19Ci0lPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvUmVmcmVzaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxMWE3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuV3NpbEZyYW1lTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5BY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLioiJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICAgQWN0aW9uIGFjdGlvbiA9IFJlZnJlc2hBY3Rpb24ubmV3QWN0aW9uKHJlcXVlc3QsIGNvbnRyb2xsZXIpOwotCi0gICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keT4KLSAgICA8JQotICAgIGlmICghYWN0aW9uUmVzdWx0KSB7Ci0gICAgICAgIGlmIChhY3Rpb24gaW5zdGFuY2VvZiBSZWZyZXNoV1NJTEFjdGlvbikgewotICAgICAgICAlPgotICAgICAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL2FjdGlvbnMvQ2xlYXJOb2RlQ29uZmlybUpTUC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgICAgICB3c2lsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICAgICAgICAgICAgd3NpbFN0YXR1c0NvbnRlbnQubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iOwotICAgICAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgJT4KLSAgICA8JQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAlPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHdzaWxQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICAgICAgICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgPCUKLSAgICB9Ci0gICAgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1Jlc2l6ZVdTSUxGcmFtZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvUmVzaXplV1NJTEZyYW1lc0FjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYTQ5NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvUmVzaXplV1NJTEZyYW1lc0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgLy8gQ3JlYXRlIHRoZSBhY3Rpb24uCi0gICBSZXNpemVXU0lMRnJhbWVzQWN0aW9uIGFjdGlvbiA9IG5ldyBSZXNpemVXU0lMRnJhbWVzQWN0aW9uKGNvbnRyb2xsZXIpOwotICAgCi0gICAvLyBQb3B1bGF0ZSB0aGUgYWN0aW9uIHdpdGggdGhlIHJlcXVlc3QgcHJvcGVydGllcy4KLSAgIGJvb2xlYW4gcmVzdWx0ID0gYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotPCUKLSAgIGlmIChyZXN1bHQpCi0gICB7Ci0gICAgIGFjdGlvbi5leGVjdXRlKGZhbHNlKTsKLSAgICAgCi0gICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBpZiAoaXNNaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyKCkpCi0gIHsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBwZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldC5zZXRBdHRyaWJ1dGUoImNvbHMiLCI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiIpOwotICAgIGFjdGlvbnNDb250YWluZXJGcmFtZXNldC5zZXRBdHRyaWJ1dGUoInJvd3MiLCI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0QWN0aW9uc0NvbnRhaW5lckZyYW1lc2V0Um93cygpJT4iKTsKLSAgfQotICBlbHNlCi0gICAgcGVyc3BlY3RpdmVDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwIikpJT4iOwotPC9zY3JpcHQ+Ci08JQotICAgfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxOb2RlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5NGM4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9TZWxlY3RXU0lMTm9kZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmFjdGlvbnMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxOb2RlQWN0aW9uIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAgLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotICAgIFNlbGVjdFdTSUxOb2RlQWN0aW9uIGFjdGlvbiA9IG5ldyBTZWxlY3RXU0lMTm9kZUFjdGlvbihjb250cm9sbGVyKTsKLQotICAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgIGFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLSAgICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0KLSAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLSAgICBib29sZWFuIGlzQWRkZWRUb0hpc3RvcnkgPSBhY3Rpb24uaXNBZGRlZFRvSGlzdG9yeSgpOwotJT4KLTwlQCBpbmNsdWRlIGZpbGU9Ii9hY3Rpb25zL1NlbGVjdE5vZGVBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTFRvb2xBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvU2VsZWN0V1NJTFRvb2xBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzhkZmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1NlbGVjdFdTSUxUb29sQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuU2VsZWN0V1NJTFRvb2xBY3Rpb24iICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi0gICAgU2VsZWN0V1NJTFRvb2xBY3Rpb24gYWN0aW9uID0gbmV3IFNlbGVjdFdTSUxUb29sQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0gICAgLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi0gICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAgIC8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotICAgIGJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotICAgIC8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotICAgIGJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvU2VsZWN0Tm9kZVRvb2xBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvU3dpdGNoUGVyc3BlY3RpdmVGcm9tV1NJTEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0lMQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMDdiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Td2l0Y2hQZXJzcGVjdGl2ZUZyb21XU0lMQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICAvLyBQcmVwYXJlIHRoZSBhY3Rpb24KLSAgIFN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTSUxBY3Rpb24gYWN0aW9uID0gbmV3IFN3aXRjaFBlcnNwZWN0aXZlRnJvbVdTSUxBY3Rpb24oY29udHJvbGxlcik7Ci0gICAKLSAgIC8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotICAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgIAotICAgLy8gUnVuIHRoZSBhY3Rpb24gYW5kIG9idGFpbiB0aGUgcmV0dXJuIGNvZGUgKGZhaWwvc3VjY2VzcykuCi0gICBib29sZWFuIGFjdGlvblJlc3VsdCA9IGFjdGlvbi5leGVjdXRlKCk7Ci0gICAKLSAgIC8vIERldGVybWluZSBpZiB0aGUgYWN0aW9uIHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeSBsaXN0LgotICAgYm9vbGVhbiBpc0FkZGVkVG9IaXN0b3J5ID0gYWN0aW9uLmlzQWRkZWRUb0hpc3RvcnkoKTsKLSU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvc3dpdGNocGVyc3BlY3RpdmUuanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9XU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1MzEzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9XU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9JbXBvcnRUb1dvcmtiZW5jaEFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEFkZFRvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwYzAxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9GYXZvcml0ZXNBY3Rpb25KU1AuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy5GcmFtZU5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uIiU+Ci0KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1BZGRUb0Zhdm9yaXRlc0FjdGlvbiBhY3Rpb24gPSBBZGRUb0Zhdm9yaXRlc0FjdGlvbi5uZXdBY3Rpb24ocmVxdWVzdCwgY29udHJvbGxlcik7Ci0KLS8vIExvYWQgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBhY3Rpb24gZnJvbSB0aGUgc2VydmxldCByZXF1ZXN0LgotYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotLy8gUnVuIHRoZSBhY3Rpb24KLWFjdGlvbi5leGVjdXRlKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIHdzaWxQcm9wZXJ0aWVzQ29udGFpbmVyLmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCIpKSU+IjsKLSAgICB3c2lsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gIDwvc2NyaXB0PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxBZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZTVhZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvcGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsUGFuZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHk+Ci0gIDwlCi0gIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgQWN0aW9uIGFjdGlvbiA9IEFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLm5ld0FjdGlvbihyZXF1ZXN0LCBjb250cm9sbGVyKTsKLQotICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLQotICAvLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLSAgYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0gIGlmIChhY3Rpb25SZXN1bHQpCi0gIHsKLSAgICBjb250cm9sbGVyLmdldFVERElQZXJzcGVjdGl2ZSgpLmdldE5hdmlnYXRvck1hbmFnZXIoKS5tYWtlU2VsZWN0ZWROb2RlVmlzaWJsZSgpOwotICAlPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1VEREksZmFsc2UpKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwlCi0gIH0KLSAgZWxzZQotICB7Ci0gICU+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgICB3c2lsUHJvcGVydGllc0NvbnRhaW5lci5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSklPiI7Ci0gICAgICB3c2lsU3RhdHVzQ29udGVudC5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvd3NpbF9zdGF0dXNfY29udGVudC5qc3AiKSklPiI7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwlCi0gIH0KLSAgJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJjNjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy5TaG93UGVyc3BlY3RpdmVBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy5Xc2lsRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24iJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08Ym9keT4KLTwlCi0vLyBQcmVwYXJlIHRoZSBhY3Rpb24uCi1Xc2lsQWRkVG9XU0RMUGVyc3BlY3RpdmVBY3Rpb24gYWN0aW9uID0gbmV3IFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbihjb250cm9sbGVyKTsKLQotLy8gTG9hZCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGFjdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IHJlcXVlc3QuCi1hY3Rpb24ucG9wdWxhdGVQcm9wZXJ0eVRhYmxlKHJlcXVlc3QpOwotCi0vLyBSdW4gdGhlIGFjdGlvbiBhbmQgb2J0YWluIHRoZSByZXR1cm4gY29kZSAoZmFpbC9zdWNjZXNzKS4KLWJvb2xlYW4gYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmV4ZWN1dGUoKTsKLQotaWYgKGFjdGlvblJlc3VsdCkgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgcGVyc3BlY3RpdmVXb3JrQXJlYS5sb2NhdGlvbiA9ICI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2hvd1BlcnNwZWN0aXZlQWN0aW9uLmdldEFjdGlvbkxpbmsoQWN0aW9uSW5wdXRzLlBFUlNQRUNUSVZFX1dTREwsZmFsc2UpKSklPiI7Ci0gIDwvc2NyaXB0PgotPCUKLX0KLWVsc2UgewotJT4KLSAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgd3NpbFByb3BlcnRpZXNDb250YWluZXIubG9jYXRpb24gPSAiPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfcHJvcGVydGllc19jb250YWluZXIuanNwIikpJT4iOwotICAgIHdzaWxTdGF0dXNDb250ZW50LmxvY2F0aW9uID0gIjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCIpKSU+IjsKLSAgPC9zY3JpcHQ+Ci08JQotfQotJT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxDaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxDaGVja0Zhdm9yaXRlRXhpc3RzQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiZDcxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsQ2hlY2tGYXZvcml0ZUV4aXN0c0FjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCSAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkVudW1lcmF0aW9uIiU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLQotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGJvZHk+Ci0gIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL2FjdGlvbnMvV3NpbEFkZFRvRmF2b3JpdGVzQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij4KLTwlCi0gICAgRW51bWVyYXRpb24gcGFyYW1OYW1lcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLSAgICB3aGlsZSAocGFyYW1OYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpcGFyYW1OYW1lcy5uZXh0RWxlbWVudCgpOwotICAgICAgU3RyaW5nW10gcGFyYW1WYWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbU5hbWUpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVZhbHVlcy5sZW5ndGg7IGkrKykgewotJT4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9cGFyYW1OYW1lJT4iIHZhbHVlPSI8JT1wYXJhbVZhbHVlc1tpXSU+Ij4KLTwlCi0gICAgICB9Ci0gICAgfQotJT4KLSAgPC9mb3JtPgotPC9ib2R5PgotPC9odG1sPgotPCUKLWlmIChyZXF1ZXN0LmdldFBhcmFtZXRlcihXc2lsQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OKSA9PSBudWxsKSB7Ci0gIC8vIFByZXBhcmUgdGhlIGFjdGlvbi4KLSAgQWRkVG9GYXZvcml0ZXNBY3Rpb24gYWN0aW9uID0gQWRkVG9GYXZvcml0ZXNBY3Rpb24ubmV3QWN0aW9uKHJlcXVlc3QsIGNvbnRyb2xsZXIpOwotICAvLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLSAgYWN0aW9uLnBvcHVsYXRlUHJvcGVydHlUYWJsZShyZXF1ZXN0KTsKLSAgaWYgKGFjdGlvbi5mYXZvcml0ZUV4aXN0cygpKSB7Ci0lPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgaWYgKGNvbmZpcm0oIjwlPUhUTUxVdGlscy5KU01hbmdsZShjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpLmdldE1lc3NhZ2UoIk1TR19RVUVTVElPTl9PVkVSV1JJVEVfRkFWT1JJVEVTIikpJT4iKSkKLSAgICAgICAgZG9jdW1lbnQuZm9ybXNbMF0uc3VibWl0KCk7Ci0gICAgPC9zY3JpcHQ+Ci08JQotICB9Ci0gIGVsc2UgewotJT4KLSAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgIGRvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOwotICAgIDwvc2NyaXB0PgotPCUKLSAgfQotfQotZWxzZSB7Ci0lPgotICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBkb2N1bWVudC5mb3Jtc1swXS5zdWJtaXQoKTsKLSAgPC9zY3JpcHQ+Ci08JQotfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYWFjNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IFdzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hBY3Rpb24oY29udHJvbGxlcik7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvSW1wb3J0VG9Xb3JrYmVuY2hBY3Rpb24uaW5jIiAlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2FjdGlvbnMvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODRjODM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uSlNQLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uIGFjdGlvbiA9IG5ldyBXc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEFjdGlvbihjb250cm9sbGVyKTsKLSU+Ci08JUAgaW5jbHVkZSBmaWxlPSIvYWN0aW9ucy9MYXVuY2hXZWJTZXJ2aWNlV2l6YXJkQWN0aW9uLmluYyIgJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxUb2dnbGVOb2RlQWN0aW9uSlNQLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9hY3Rpb25zL1dzaWxUb2dnbGVOb2RlQWN0aW9uSlNQLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyY2RiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvYWN0aW9ucy9Xc2lsVG9nZ2xlTm9kZUFjdGlvbkpTUC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uYWN0aW9ucy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotLy8gUHJlcGFyZSB0aGUgYWN0aW9uLgotV3NpbFRvZ2dsZU5vZGVBY3Rpb24gYWN0aW9uID0gbmV3IFdzaWxUb2dnbGVOb2RlQWN0aW9uKGNvbnRyb2xsZXIpOwotCi0vLyBMb2FkIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aW9uIGZyb20gdGhlIHNlcnZsZXQgcmVxdWVzdC4KLWFjdGlvbi5wb3B1bGF0ZVByb3BlcnR5VGFibGUocmVxdWVzdCk7Ci0KLS8vIFJ1biB0aGUgYWN0aW9uIGFuZCBvYnRhaW4gdGhlIHJldHVybiBjb2RlIChmYWlsL3N1Y2Nlc3MpLgotYm9vbGVhbiBhY3Rpb25SZXN1bHQgPSBhY3Rpb24uZXhlY3V0ZSgpOwotCi0vLyBEZXRlcm1pbmUgaWYgdGhlIGFjdGlvbiB3YXMgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4KLWJvb2xlYW4gaXNBZGRlZFRvSGlzdG9yeSA9IGFjdGlvbi5pc0FkZGVkVG9IaXN0b3J5KCk7Ci0lPgotPCVAIGluY2x1ZGUgZmlsZT0iL2FjdGlvbnMvVG9nZ2xlTm9kZUFjdGlvbi5pbmMiICU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvT3BlbldTSUxGb3JtLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9PcGVuV1NJTEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODc0Mzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9PcGVuV1NJTEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuRnJhbWVOYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Gb3JtVG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi1XU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLUZvcm1Ub29sIGZvcm1Ub29sID0gKEZvcm1Ub29sKXdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZSgpLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sKCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fVElUTEVfT1BFTl9XU0lMIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFBhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3Jtc3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC9hY3Rpb25zL09wZW5XU0lMQWN0aW9uSlNQLmpzcCIpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBvblN1Ym1pdD0icmV0dXJuIGhhbmRsZVN1Ym1pdCh0aGlzKSI+Ci0gIDwlCi0gIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJ3c2lsL2ltYWdlcy9vcGVuX3dzaWxfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgU3RyaW5nIHRpdGxlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9PUEVOX1dTSUwiKTsKLSAgJT4KLSAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgIDwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX09QRU5fV1NJTF9ERVNDIiklPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPiAgICAgICAgCi0gIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD0yNSB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgIDxsYWJlbCBmb3I9ImlucHV0X3dzaWxfdXJsIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiV1NJTF9VUkwiKSU+PC9sYWJlbD4KLSAgICAgICAgPCUKLSAgICAgICAgaWYgKCFmb3JtVG9vbC5pc0lucHV0VmFsaWQoV3NpbEFjdGlvbklucHV0cy5XU0lMX1VSTCkpIHsKLSAgICAgICAgJT4KLSAgICAgICAgICA8JT1IVE1MVXRpbHMucmVkQXN0ZXJpc2soKSU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHdzaWxVUkwgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9VUkwpOwotICAgICAgICBpZiAod3NpbFVSTCA9PSBudWxsKQotICAgICAgICAgIHdzaWxVUkwgPSAiIjsKLSAgICAgICAgJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5wdXRfd3NpbF91cmwiIG5hbWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuV1NJTF9VUkwlPiIgdmFsdWU9IjwlPXdzaWxVUkwlPiIgc2l6ZT0iNTAiIGNsYXNzPSJ0ZXh0ZW50ZXIiPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8JQotICBTdHJpbmcgaW5zcGVjdGlvblR5cGVTdHJpbmcgPSAoU3RyaW5nKWZvcm1Ub29sLmdldFByb3BlcnR5KFdzaWxBY3Rpb25JbnB1dHMuV1NJTF9JTlNQRUNUSU9OX1RZUEUpOwotICBpbnQgaW5zcGVjdGlvblR5cGUgPSBXc2lsQWN0aW9uSW5wdXRzLldTSUxfREVUQUlMUzsKLSAgaWYgKGluc3BlY3Rpb25UeXBlU3RyaW5nICE9IG51bGwpCi0gICAgaW5zcGVjdGlvblR5cGUgPSBJbnRlZ2VyLnBhcnNlSW50KGluc3BlY3Rpb25UeXBlU3RyaW5nKTsKLSAgJT4KLSAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9ImxhYmVscyIgaGVpZ2h0PTMwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgPGxhYmVsIGZvcj0iaW5zcGVjdGlvbl90eXBlIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9DSE9PU0VfV1NJTF9JTlNQRUNUSU9OX1RZUEUiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJib3R0b20iPgotICAgICAgICA8c2VsZWN0IGlkPSJpbnNwZWN0aW9uX3R5cGUiIG5hbWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuV1NJTF9JTlNQRUNUSU9OX1RZUEUlPiIgY2xhc3M9InNlbGVjdGxpc3QiPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuV1NJTF9ERVRBSUxTJT4iIDwlIGlmIChpbnNwZWN0aW9uVHlwZSA9PSBXc2lsQWN0aW9uSW5wdXRzLldTSUxfREVUQUlMUykgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9XU0lMIiklPgotICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPVdzaWxBY3Rpb25JbnB1dHMuV1NETF9TRVJWSUNFUyU+IiA8JSBpZiAoaW5zcGVjdGlvblR5cGUgPT0gV3NpbEFjdGlvbklucHV0cy5XU0RMX1NFUlZJQ0VTKSB7ICU+c2VsZWN0ZWQ8JSB9ICU+PjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1dTRExfU0VSVklDRSIpJT4KLSAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLlVERElfU0VSVklDRVMlPiIgPCUgaWYgKGluc3BlY3Rpb25UeXBlID09IFdzaWxBY3Rpb25JbnB1dHMuVURESV9TRVJWSUNFUykgeyAlPnNlbGVjdGVkPCUgfSAlPj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VRERJX1NFUlZJQ0UiKSU+Ci0gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9V3NpbEFjdGlvbklucHV0cy5VRERJX0JVU0lORVNTRVMlPiIgPCUgaWYgKGluc3BlY3Rpb25UeXBlID09IFdzaWxBY3Rpb25JbnB1dHMuVURESV9CVVNJTkVTU0VTKSB7ICU+c2VsZWN0ZWQ8JSB9ICU+PjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VERElfQlVTSU5FU1MiKSU+Ci0gICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPCU9V3NpbEFjdGlvbklucHV0cy5XU0lMX0xJTktTJT4iIDwlIGlmIChpbnNwZWN0aW9uVHlwZSA9PSBXc2lsQWN0aW9uSW5wdXRzLldTSUxfTElOS1MpIHsgJT5zZWxlY3RlZDwlIH0gJT4+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NJTF9MSU5LUyIpJT4KLSAgICAgICAgPC9zZWxlY3Q+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL3NpbXBsZUNvbW1vbl90YWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDwvZm9ybT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1Byb2Nlc3NXU0lMRnJhbWVzZXRzRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvUHJvY2Vzc1dTSUxGcmFtZXNldHNGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyZTZkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvUHJvY2Vzc1dTSUxGcmFtZXNldHNGb3JtLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiLz4KLTxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KGZvcm1BY3Rpb24udG9TdHJpbmcoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJtYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowIj4KLSAgPGlucHV0IG5hbWU9IjwlPUFjdGlvbklucHV0cy5GUkFNRV9OQU1FJT4iIHR5cGU9ImhpZGRlbiIgdmFsdWU9IjwlPWZvcm1GcmFtZU5hbWUlPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCU+IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCklPiI+Ci0gIDxpbnB1dCBuYW1lPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldEFjdGlvbnNDb250YWluZXJGcmFtZXNldFJvd3MoKSU+Ij4KLTwvZm9ybT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9VZGRpQnVzaW5lc3NEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvVWRkaUJ1c2luZXNzRGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOThiOWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9VZGRpQnVzaW5lc3NEZXRhaWxzUGFnZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvVURESVBlcnNwZWN0aXZlQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5SZWZyZXNoQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iYWJzdHJhY3RMYW5ncyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0cyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgaW50IHZpZXdJRCA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IG51bGw7Ci0gICAgU3RyaW5nIGJ1c2luZXNzS2V5ID0gbnVsbDsKLSAgICBTdHJpbmcgZGlzY292ZXJ5VVJMID0gbnVsbDsKLSAgICBXc2lsVWRkaUJ1c2luZXNzRWxlbWVudCBsaW5rID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsVURESUxpbmtzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgbGluayA9IChXc2lsVWRkaUJ1c2luZXNzRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgaWYgKGxpbmsgIT0gbnVsbCkgewotICAgICAgICAgICAgYWJzdHJhY3RzLmFkZEFsbChsaW5rLmdldExpbmtBYnN0cmFjdHMoKSk7Ci0gICAgICAgICAgICBhYnN0cmFjdExhbmdzLmFkZEFsbChsaW5rLmdldExpbmtBYnN0cmFjdExhbmdzKCkpOwotICAgICAgICAgICAgaW5xdWlyeUFQSSA9IGxpbmsuZ2V0VURESUxpbmtJbnF1aXJ5QVBJKCk7Ci0gICAgICAgICAgICBidXNpbmVzc0tleSA9IGxpbmsuZ2V0VURESUxpbmtCdXNpbmVzc0tleSgpOwotICAgICAgICAgICAgZGlzY292ZXJ5VVJMID0gbGluay5nZXRVRERJTGlua0Rpc2NvdmVyeVVSTCgpOwotICAgICAgICB9Ci0gICAgfQotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9VRERJX0JVU0lORVNTX0RFVEFJTFMiKSU+PC90aXRsZT4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPGZvcm0gYWN0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoQWRkVG9GYXZvcml0ZXNBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPgotCi0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1VERElfTElOS19ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCAmJiBsaW5rICE9IG51bGwpIHsKLSAgICAlPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuTk9ERUlEJT4iIHZhbHVlPSI8JT1zZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCklPiI+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5WSUVXSUQlPiIgdmFsdWU9IjwlPXZpZXdJRCU+Ij4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lOUVVJUllfQVBJIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPSgoaW5xdWlyeUFQSSAhPSBudWxsKSA/IGlucXVpcnlBUEkgOiB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQSIpKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0JVU0lORVNTX0tFWSIpJT4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT0oKGJ1c2luZXNzS2V5ICE9IG51bGwpID8gYnVzaW5lc3NLZXkgOiB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQSIpKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0RJU0NPVkVSWV9VUkwiKSU+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9KChkaXNjb3ZlcnlVUkwgIT0gbnVsbCkgPyBkaXNjb3ZlcnlVUkwgOiB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQSIpKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEFic3RyYWN0VGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi0gICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvVWRkaVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvVWRkaVNlcnZpY2VEZXRhaWxzUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODMwM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1VkZGlTZXJ2aWNlRGV0YWlsc1BhZ2UuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5BZGRUb1VERElQZXJzcGVjdGl2ZUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZSIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9Im5hbWVMYW5ncyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9Im5hbWVzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYWJzdHJhY3RMYW5ncyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0cyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgaW50IHZpZXdJRCA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBTdHJpbmcgaW5xdWlyeUFQSSA9IG51bGw7Ci0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSBudWxsOwotICAgIFN0cmluZyBkaXNjb3ZlcnlVUkwgPSBudWxsOwotICAgIFdzaWxTZXJ2aWNlRWxlbWVudCBzZXJ2aWNlID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsVURESVNlcnZpY2VzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgc2VydmljZSA9IChXc2lsU2VydmljZUVsZW1lbnQpbGUuZ2V0T2JqZWN0KCk7Ci0gICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5hbWVzLmFkZEFsbChzZXJ2aWNlLmdldFNlcnZpY2VOYW1lcygpKTsKLSAgICAgICAgICAgIG5hbWVMYW5ncy5hZGRBbGwoc2VydmljZS5nZXRTZXJ2aWNlTmFtZUxhbmdzKCkpOwotICAgICAgICAgICAgYWJzdHJhY3RzLmFkZEFsbChzZXJ2aWNlLmdldFNlcnZpY2VBYnN0cmFjdHMoKSk7Ci0gICAgICAgICAgICBhYnN0cmFjdExhbmdzLmFkZEFsbChzZXJ2aWNlLmdldFNlcnZpY2VBYnN0cmFjdExhbmdzKCkpOwotICAgICAgICAgICAgaW5xdWlyeUFQSSA9ICgoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClzZXJ2aWNlKS5nZXRVRERJU2VydmljZUlucXVpcnlBUEkoKTsKLSAgICAgICAgICAgIHNlcnZpY2VLZXkgPSAoKFdzaWxVZGRpU2VydmljZUVsZW1lbnQpc2VydmljZSkuZ2V0VURESVNlcnZpY2VLZXkoKTsKLSAgICAgICAgICAgIGRpc2NvdmVyeVVSTCA9ICgoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClzZXJ2aWNlKS5nZXRVRERJU2VydmljZURpc2NvdmVyeVVSTCgpOwotICAgICAgICB9Ci0gICAgfQotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9VRERJX1NFUlZJQ0VfREVUQUlMUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxGb3JtU3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NJTF9TRVJWSUNFX0RFVEFJTFMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50ICYmIHNlcnZpY2UgIT0gbnVsbCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IiB2YWx1ZT0iPCU9dmlld0lEJT4iPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTlFVSVJZX0FQSSIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT0oKGlucXVpcnlBUEkgIT0gbnVsbCkgPyBpbnF1aXJ5QVBJIDogd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkEiKSklPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDxicj4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1NFUlZJQ0VfS0VZIiklPjwvc3Ryb25nPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPSgoc2VydmljZUtleSAhPSBudWxsKSA/IHNlcnZpY2VLZXkgOiB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQSIpKSU+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGJyPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJzaW5nbGVoZWFkZXJjb2xvciIgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfRElTQ09WRVJZX1VSTCIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT0oKGRpc2NvdmVyeVVSTCAhPSBudWxsKSA/IGRpc2NvdmVyeVVSTCA6IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX05BIikpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsTmFtZVRhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLQotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsQWJzdHJhY3RUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9XU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoRm9ybS5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV1NJTEltcG9ydFdTSUxUb1dvcmtiZW5jaEZvcm0uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODYzZjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9XU0lMSW1wb3J0V1NJTFRvV29ya2JlbmNoRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi1XU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLU5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci1Ob2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotV3NpbEVsZW1lbnQgd3NpbEVsZW1lbnQgPSAoV3NpbEVsZW1lbnQpc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9JTVBPUlRfVE9fV09SS0JFTkNIIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICA8anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gIDxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy9mb3JtdXRpbHMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgid3NpbC9hY3Rpb25zL1dTSUxJbXBvcnRXU0lMVG9Xb3JrYmVuY2hBY3Rpb25KU1AuanNwIikpJT4iIG1ldGhvZD0icG9zdCIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgotICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuSU1QT1JUX0ZJTEUlPiIgdmFsdWU9IjwlPUFjdGlvbklucHV0cy5JTVBPUlRfRklMRSU+Ij4KLSAgPCUKLSAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9pbXBvcnRfdG9fd29ya2JlbmNoX2hpZ2hsaWdodGVkLmdpZiI7Ci0gIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBVExfSU1QT1JUX1dTSUxfVE9fV09SS0JFTkNIIik7Ci0gICU+Ci0gIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JTVBPUlRfV1NJTF9UT19XT1JLQkVOQ0hfREVTQyIpJT4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIiBoZWlnaHQ9NDAgdmFsaWduPSJjZW50ZXIiPgotICAgICAgICA8bGFiZWwgZm9yPSJzZWxlY3Rfd29ya2JlbmNoX3Byb2plY3RfbmFtZSI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJXT1JLQkVOQ0hfUFJPSkVDVF9OQU1FIiklPjwvbGFiZWw+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiIGhlaWdodD00MCB2YWxpZ249ImNlbnRlciIgbm93cmFwPgotICAgICAgICA8JQotICAgICAgICBJV29ya3NwYWNlUm9vdCBpV29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBpV29ya3NwYWNlUm9vdC5nZXRQcm9qZWN0cygpOwotICAgICAgICAlPgotICAgICAgICA8c2VsZWN0IGlkPSJzZWxlY3Rfd29ya2JlbmNoX3Byb2plY3RfbmFtZSIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLldPUktCRU5DSF9QUk9KRUNUX05BTUUlPiIgY2xhc3M9InNlbGVjdGxpc3QiPgotICAgICAgICA8JQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFwcm9qZWN0c1tpXS5pc09wZW4oKSkKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0gICAgICAgICU+Ci0gICAgICAgIDxvcHRpb24gdmFsdWU9IjwlPXByb2plY3ROYW1lJT4iPjwlPXByb2plY3ROYW1lJT4KLSAgICAgICAgPCUKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICB9Ci0gICAgICAgICU+Ci0gICAgICAgIDwvc2VsZWN0PgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgIDx0ZD4KLSAgICAgICAgPGxhYmVsIGZvcj0iaW5wdXRfaW1wb3J0ZWRfd3NpbF9maWxlX25hbWUiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiV1NJTF9GSUxFX05BTUUiKSU+PC9sYWJlbD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgaGVpZ2h0PTEwIHZhbGlnbj0iYm90dG9tIiB3aWR0aD0iNjAlIj4KLTwlCi0gU3RyaW5nIHdzaWxGaWxlTmFtZSA9ICJ0ZW1wLndzaWwiOwotIFN0cmluZyB3c2lsVVJMID0gd3NpbEVsZW1lbnQuZ2V0V3NpbFVybCgpOwotIGlmICh3c2lsVVJMLmVuZHNXaXRoKCIud3NpbCIpKQotIHsKLSAgIGludCBsYXN0U2VwYXJhdG9yUG9zID0gTWF0aC5tYXgod3NpbFVSTC5sYXN0SW5kZXhPZigiLyIpLCB3c2lsVVJMLmxhc3RJbmRleE9mKCJcXCIpKTsKLSAgIGlmIChsYXN0U2VwYXJhdG9yUG9zID4gMCkKLSAgICAgd3NpbEZpbGVOYW1lID0gd3NpbFVSTC5zdWJzdHJpbmcobGFzdFNlcGFyYXRvclBvcysxLCB3c2lsVVJMLmxlbmd0aCgpKTsKLSB9Ci0lPiAgIAotICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImlucHV0X2ltcG9ydGVkX3dzaWxfZmlsZV9uYW1lIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuSU1QT1JURURfRklMRV9OQU1FJT4iIHZhbHVlPSI8JT13c2lsRmlsZU5hbWUlPiIgc2l6ZT01MCBjbGFzcz0idGV4dGVudGVyIj4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvc2ltcGxlQ29tbW9uX3RhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4gICAgCi0gIDwvZm9ybT4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzZGxTZXJ2aWNlRGV0YWlsc1BhZ2UuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzZGxTZXJ2aWNlRGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjgwNzQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9Xc2RsU2VydmljZURldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5BZGRUb0Zhdm9yaXRlc0FjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUud3NpbC5RTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24iICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJuYW1lTGFuZ3MiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJuYW1lcyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0TGFuZ3MiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJhYnN0cmFjdHMiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPCUKLSAgICBTdHJpbmcgYmluZGluZ1RhYmxlID0gImJpbmRpbmdUYWJsZSI7Ci0gICAgU3RyaW5nIHhiaW5kaW5nVGFibGUgPSAieGJpbmRpbmdUYWJsZSI7Ci0KLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID1jb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUb29sTWFuYWdlciBjdXJyZW50VG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Q3VycmVudFRvb2xNYW5hZ2VyKCk7Ci0gICAgaW50IHZpZXdJRCA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBXc2lsU2VydmljZUVsZW1lbnQgc2VydmljZSA9IG51bGw7Ci0gICAgU3RyaW5nIHdzZGxVUkwgPSBudWxsOwotICAgIFZlY3RvciB3c2RsQmluZGluZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KSB7Ci0gICAgICAgIExpc3RFbGVtZW50IGxlID0gKChXc2lsRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFdTRExTZXJ2aWNlcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJRCk7Ci0gICAgICAgIHNlcnZpY2UgPSAoV3NpbFNlcnZpY2VFbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBuYW1lcy5hZGRBbGwoc2VydmljZS5nZXRTZXJ2aWNlTmFtZXMoKSk7Ci0gICAgICAgICAgICBuYW1lTGFuZ3MuYWRkQWxsKHNlcnZpY2UuZ2V0U2VydmljZU5hbWVMYW5ncygpKTsKLSAgICAgICAgICAgIGFic3RyYWN0cy5hZGRBbGwoc2VydmljZS5nZXRTZXJ2aWNlQWJzdHJhY3RzKCkpOwotICAgICAgICAgICAgYWJzdHJhY3RMYW5ncy5hZGRBbGwoc2VydmljZS5nZXRTZXJ2aWNlQWJzdHJhY3RMYW5ncygpKTsKLSAgICAgICAgICAgIHdzZGxVUkwgPSAoKFdzaWxXc2RsU2VydmljZUVsZW1lbnQpc2VydmljZSkuZ2V0V1NETFNlcnZpY2VVUkwoKTsKLSAgICAgICAgICAgIHdzZGxCaW5kaW5ncyA9ICgoV3NpbFdzZGxTZXJ2aWNlRWxlbWVudClzZXJ2aWNlKS5nZXRXU0RMQmluZGluZygpOwotICAgICAgICB9Ci0gICAgfQotJT4KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICAgIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9USVRMRV9XU0RMX1NFUlZJQ0VfREVUQUlMUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij4KLQotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gImltYWdlcy9kZXRhaWxzX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9XU0lMX1NFUlZJQ0VfREVUQUlMUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPCUKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQgJiYgc2VydmljZSAhPSBudWxsKSB7Ci0gICAgJT4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLk5PREVJRCU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuVklFV0lEJT4iIHZhbHVlPSI8JT12aWV3SUQlPiI+Ci0KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0ic2luZ2xlaGVhZGVyY29sb3IiIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VSTCIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiPgotICAgICAgICAgICAgICAgICAgICA8JT13c2RsVVJMJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsTmFtZVRhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLQotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsQWJzdHJhY3RUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1iaW5kaW5nVGFibGUlPicsJzwlPXhiaW5kaW5nVGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhiaW5kaW5nVGFibGUlPiIgc3JjPSIvd3NleHBsb3Jlci9pbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9CSU5ESU5HUyIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSIvd3NleHBsb3Jlci9pbWFnZXMva2V5bGluZS5naWYiIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8ZGl2IGlkPSI8JT1iaW5kaW5nVGFibGUlPiI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FU1BBQ0VfVVJJIiklPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTE9DQUxfTkFNRSIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gd3NkbEJpbmRpbmdzLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFFOYW1lIHFuYW1lID0gKFFOYW1lKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjwlPXFuYW1lLmdldE5hbWVzcGFjZVVSSSgpJT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48JT1xbmFtZS5nZXRMb2NhbE5hbWUoKSU+PC90ZD4KLSAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgfQotICAgICAgICAgICAgJT4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgdHdpc3RJbml0KCc8JT1iaW5kaW5nVGFibGUlPicsJzwlPXhiaW5kaW5nVGFibGUlPicpOwotICAgICAgICA8L3NjcmlwdD4KLQotPGpzcDp1c2VCZWFuIGlkPSJjdXJyZW50VG9vbE1hbmFnZXJIYXNoIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgY3VycmVudFRvb2xNYW5hZ2VySGFzaC5wdXQoQWN0aW9uSW5wdXRzLkNVUlJFTlRfVE9PTF9NQU5BR0VSLGN1cnJlbnRUb29sTWFuYWdlcik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvb3RoZXJBY3Rpb25zLmpzcCIgZmx1c2g9InRydWUiLz4KLQotICAgICAgICA8JQotICAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9Xc2lsRGV0YWlsc1BhZ2UuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxEZXRhaWxzUGFnZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZWNkYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxEZXRhaWxzUGFnZS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLlRyZWVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuV3NpbEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZFRvRmF2b3JpdGVzQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5SZWZyZXNoQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkVudW1lcmF0aW9uIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0iYWJzdHJhY3RMYW5ncyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0cyIgY2xhc3M9ImphdmEudXRpbC5WZWN0b3IiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08JQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPWNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIFRvb2xNYW5hZ2VyIGN1cnJlbnRUb29sTWFuYWdlciA9IHNlbGVjdGVkTm9kZS5nZXRDdXJyZW50VG9vbE1hbmFnZXIoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBXc2lsRWxlbWVudCB3c2lsRWxlbWVudCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KSB7Ci0gICAgICAgIHdzaWxFbGVtZW50ID0gKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudDsKLSAgICAgICAgYWJzdHJhY3RzLmFkZEFsbCh3c2lsRWxlbWVudC5nZXRXU0lMQWJzdHJhY3RzKCkpOwotICAgICAgICBhYnN0cmFjdExhbmdzLmFkZEFsbCh3c2lsRWxlbWVudC5nZXRXU0lMQWJzdHJhY3RMYW5ncygpKTsKLSAgICB9Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTSUxfREVUQUlMUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxGb3JtU3VibWl0LmpzcCIgZmx1c2g9InRydWUiLz4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+Ci0KLSAgICA8JQotICAgIFN0cmluZyB0aXRsZUltYWdlUGF0aCA9ICJpbWFnZXMvZGV0YWlsc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfV1NJTF9ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IiB2YWx1ZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUJT4iPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VUkwiKSU+PC9zdHJvbmc+Ci0gICAgICAgICAgICAgICAgPC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj4KLSAgICAgICAgICAgICAgICAgICAgPCU9d3NpbEVsZW1lbnQuZ2V0V3NpbFVybCgpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsQWJzdHJhY3RUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY3VycmVudFRvb2xNYW5hZ2VySGFzaCIgY2xhc3M9ImphdmEudXRpbC5IYXNodGFibGUiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGN1cnJlbnRUb29sTWFuYWdlckhhc2gucHV0KEFjdGlvbklucHV0cy5DVVJSRU5UX1RPT0xfTUFOQUdFUixjdXJyZW50VG9vbE1hbmFnZXIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL2Zvcm1zL290aGVyQWN0aW9ucy5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0KLSAgICA8JQotICAgIH0KLSAgICAlPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxJbXBvcnRXU0RMVG9Xb3JrYmVuY2hGb3JtLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhZmY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvZm9ybXMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEZvcm0uanNwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qIiAlPgotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgVG9vbCBzZWxlY3RlZFRvb2wgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2woKTsKLSU+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1Qcm9wZXJ0aWVzIiBjbGFzcz0iamF2YS51dGlsLkhhc2h0YWJsZSIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RXU0RMU2VydmljZXNUb29sKQotICB7Ci0gICAgaW50IHZpZXdJZCA9IHNlbGVjdGVkTm9kZS5nZXRWaWV3SWQoKTsKLSAgICBXc2lsRWxlbWVudCB3c2lsRWxlbWVudCA9IChXc2lsRWxlbWVudClzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSAgICBMaXN0RWxlbWVudCBsZSA9IHdzaWxFbGVtZW50LmdldEFsbFdTRExTZXJ2aWNlcygpLmdldEVsZW1lbnRXaXRoVmlld0lkKHZpZXdJZCk7Ci0gICAgV3NpbFdzZGxTZXJ2aWNlRWxlbWVudCB3c2lsV3NkbFNlcnZpY2VFbGVtZW50ID0gKFdzaWxXc2RsU2VydmljZUVsZW1lbnQpbGUuZ2V0T2JqZWN0KCk7Ci0gICAgZm9ybVByb3BlcnRpZXMucHV0KCJ3c2RsVVJMIix3c2lsV3NkbFNlcnZpY2VFbGVtZW50LmdldFdTRExTZXJ2aWNlVVJMKCkpOwotICB9Ci0gIGZvcm1Qcm9wZXJ0aWVzLnB1dCgiZm9ybUFjdGlvbkxpbmsiLCJ3c2lsL2FjdGlvbnMvV3NpbEltcG9ydFdTRExUb1dvcmtiZW5jaEFjdGlvbkpTUC5qc3AiKTsKLSU+ICAgCi08L2pzcDp1c2VCZWFuPgotPCUKLSAgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RXU0RMU2VydmljZXNUb29sKQotICB7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9JbXBvcnRXU0RMQW5kV1NJTFRvV29ya2JlbmNoRm9ybS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08JQotICB9Ci0gIGVsc2UgaWYgKHNlbGVjdGVkVG9vbCBpbnN0YW5jZW9mIExpc3RVRERJU2VydmljZXNUb29sKQotICB7Ci0lPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9JbXBvcnRUb1dvcmtiZW5jaEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotPCUKLSAgfQotJT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9Xc2lsTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OTE5NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxMYXVuY2hXZWJTZXJ2aWNlV2l6YXJkRm9ybS5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbkxpbmsiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUFjdGlvbkxpbmsuYXBwZW5kKCJ3c2lsL2FjdGlvbnMvV3NpbExhdW5jaFdlYlNlcnZpY2VXaXphcmRBY3Rpb25KU1AuanNwIik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvZm9ybXMvTGF1bmNoV2ViU2VydmljZVdpemFyZEZvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxMaW5rRGV0YWlsc1BhZ2UuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2Zvcm1zL1dzaWxMaW5rRGV0YWlsc1BhZ2UuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRiN2VjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9mb3Jtcy9Xc2lsTGlua0RldGFpbHNQYWdlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPGpzcDp1c2VCZWFuIGlkPSJhYnN0cmFjdExhbmdzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0iYWJzdHJhY3RzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTwlCi0gICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9Y29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVG9vbE1hbmFnZXIgY3VycmVudFRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldEN1cnJlbnRUb29sTWFuYWdlcigpOwotICAgIGludCB2aWV3SUQgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0gICAgV3NpbFdzaWxMaW5rRWxlbWVudCBsaW5rID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgV3NpbEVsZW1lbnQpIHsKLSAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsV1NJTExpbmtzKCkuZ2V0RWxlbWVudFdpdGhWaWV3SWQodmlld0lEKTsKLSAgICAgICAgbGluayA9IChXc2lsV3NpbExpbmtFbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgICAgICBpZiAobGluayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhYnN0cmFjdExhbmdzLmFkZEFsbChsaW5rLmdldExpbmtBYnN0cmFjdExhbmdzKCkpOwotICAgICAgICAgICAgYWJzdHJhY3RzLmFkZEFsbChsaW5rLmdldExpbmtBYnN0cmFjdHMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX1RJVExFX1dTSUxfTElOS19ERVRBSUxTIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3Mvd2luZG93cy5jc3MiKSklPiI+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAiaW1hZ2VzL2RldGFpbHNfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX1dTSUxfTElOS19ERVRBSUxTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCAmJiBsaW5rICE9IG51bGwpIHsKLSAgICAlPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9InNpbmdsZWhlYWRlcmNvbG9yIiBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVVJMIiklPgotICAgICAgICAgICAgICAgIDwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+Ci0gICAgICAgICAgICAgICAgICAgIDwlPWxpbmsuZ2V0V1NJTExpbmtMb2NhdGlvbigpJT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsQWJzdHJhY3RUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImN1cnJlbnRUb29sTWFuYWdlckhhc2giIGNsYXNzPSJqYXZhLnV0aWwuSGFzaHRhYmxlIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBjdXJyZW50VG9vbE1hbmFnZXJIYXNoLnB1dChBY3Rpb25JbnB1dHMuQ1VSUkVOVF9UT09MX01BTkFHRVIsY3VycmVudFRvb2xNYW5hZ2VyKTsKLSU+Ci08L2pzcDp1c2VCZWFuPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii9mb3Jtcy9vdGhlckFjdGlvbnMuanNwIiBmbHVzaD0idHJ1ZSIvPiAgICAgICAgCi0KLSAgICA8JQotICAgIH0KLSAgICAlPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2FkZF90b19VRERJX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1ZDE5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2FkZF90b19VRERJX3BlcnNwZWN0aXZlX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9hZGRfdG9fVURESV9wZXJzcGVjdGl2ZV9oaWdobGlnaHRlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2FkZF90b19VRERJX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhM2RkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2FkZF90b19VRERJX3BlcnNwZWN0aXZlX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9VRERJX3NlcnZpY2VfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfVURESV9zZXJ2aWNlX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzUxZGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9VRERJX3NlcnZpY2VfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfVURESV9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9VRERJX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UxMzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9VRERJX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1dTRExfc2VydmljZV9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfZW5hYmxlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYzAyODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1dTRExfc2VydmljZV9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0RMX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1dTRExfc2VydmljZV9oaWdobGlnaHRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGM4ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1dTRExfc2VydmljZV9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfV1NJTF9lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0lMX2VuYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmEwOTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0lMX2VuYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1dTSUxfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X1dTSUxfaGlnaGxpZ2h0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzRiYmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9XU0lMX2hpZ2hsaWdodGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9idXNpbmVzc19lbmFibGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvbGlzdF9idXNpbmVzc19lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxZTM3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfZW5hYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9saXN0X2J1c2luZXNzX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxYjk3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL2xpc3RfYnVzaW5lc3NfaGlnaGxpZ2h0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy9vcGVuX3dzaWxfZW5hYmxlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL29wZW5fd3NpbF9lbmFibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5Y2M2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL29wZW5fd3NpbF9lbmFibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvb3Blbl93c2lsX2hpZ2hsaWdodGVkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9pbWFnZXMvb3Blbl93c2lsX2hpZ2hsaWdodGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNzc1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL29wZW5fd3NpbF9oaWdobGlnaHRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL3dzaWxfbm9kZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvaW1hZ2VzL3dzaWxfbm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNTkxNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL2ltYWdlcy93c2lsX25vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbEFic3RyYWN0VGFibGUuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbEFic3RyYWN0VGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgzMjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxBYnN0cmFjdFRhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLldTSUxQZXJzcGVjdGl2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLkhUTUxVdGlscyIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOnVzZUJlYW4gaWQ9ImFic3RyYWN0TGFuZ3MiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotPGpzcDp1c2VCZWFuIGlkPSJhYnN0cmFjdHMiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08JQotU3RyaW5nIGFic3RyYWN0VGFibGUgPSAiYWJzdHJhY3RUYWJsZSI7Ci1TdHJpbmcgeGFic3RyYWN0VGFibGUgPSAieGFic3RyYWN0VGFibGUiOwotU3RyaW5nIHNob3dBbGxBYnN0cmFjdElEID0gInNob3dBbGxBYnN0cmFjdElEIjsKLVdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPWNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBmdW5jdGlvbiBzaG93QWJzdHJhY3QodGFibGVDb250YWluZXJJRCkgewotICAgICAgICB2YXIgdGFibGUgPSBnZXRUYWJsZSh0YWJsZUNvbnRhaW5lcklEKTsKLSAgICAgICAgdmFyIHRhYmxlQm9keSA9IHRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJUQk9EWSIpLml0ZW0oMCk7Ci0gICAgICAgIHZhciBoaWRkZW5JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCc8JT1zaG93QWxsQWJzdHJhY3RJRCU+Jyk7Ci0gICAgICAgIDwlCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWJzdHJhY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgIGFkZFJvd1RvQWJzdHJhY3RUYWJsZSh0YWJsZUJvZHksCi0gICAgICAgICAgICAgICAiPCU9SFRNTFV0aWxzLkpTTWFuZ2xlKChTdHJpbmcpYWJzdHJhY3RMYW5ncy5lbGVtZW50QXQoaSkpJT4iLAotICAgICAgICAgICAgICAgIjwlPUhUTUxVdGlscy5KU01hbmdsZSgoU3RyaW5nKWFic3RyYWN0cy5lbGVtZW50QXQoaSkpJT4iKTsKLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotICAgIH0KLQotICAgIGZ1bmN0aW9uIGFkZFJvd1RvQWJzdHJhY3RUYWJsZSh0YWJsZUJvZHksIGxhbmcsIGFic3QpIHsKLSAgICAgICAgdmFyIG5ld1JvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7Ci0gICAgICAgIGFkZEtleVZhbHVlVG9Sb3cobmV3Um93LCBsYW5nLCBhYnN0KTsKLSAgICAgICAgdGFibGVCb2R5LmFwcGVuZENoaWxkKG5ld1Jvdyk7Ci0gICAgfQotPC9zY3JpcHQ+Ci0KLTx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgPHRyPgotICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9YWJzdHJhY3RUYWJsZSU+JywnPCU9eGFic3RyYWN0VGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhhYnN0cmFjdFRhYmxlJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FCU1RSQUNUIiklPjwvc3Ryb25nPgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotCi08dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPgotCi08ZGl2IGlkPSI8JT1hYnN0cmFjdFRhYmxlJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEFOR1VBR0UiKSU+PC90aD4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BQlNUUkFDVCIpJT48L3RoPgotICAgICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci08L2Rpdj4KLQotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgc2hvd0Fic3RyYWN0KCc8JT1hYnN0cmFjdFRhYmxlJT4nKTsKLSAgICB0d2lzdEluaXQoJzwlPWFic3RyYWN0VGFibGUlPicsJzwlPXhhYnN0cmFjdFRhYmxlJT4nKTsKLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI1ZjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxGb3JtU3VibWl0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3NjcmlwdHMvZm9ybXN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0gICAgZnVuY3Rpb24gaXNTb21ldGhpbmdTZWxlY3RlZCh0YWJsZUNvbnRhaW5lcklkKSB7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93czsgaTx0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgcm93Q2hlY2tib3hDZWxsID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKS5pdGVtKDApOwotICAgICAgICAgICAgdmFyIHJvd0NoZWNrYm94ID0gcm93Q2hlY2tib3hDZWxsLmNoaWxkTm9kZXNbMF07Ci0gICAgICAgICAgICBpZiAocm93Q2hlY2tib3guY2hlY2tlZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhbGVydCgiPCU9Y29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKS5nZXRNZXNzYWdlKCJNU0dfRVJST1JfTk9USElOR19TRUxFQ1RFRCIpJT4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZ1bmN0aW9uIHNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCh0YWJsZUNvbnRhaW5lcklkLCBmb3JtLCBsb2NhdGlvbikgewotICAgICAgICBpZiAoaXNTb21ldGhpbmdTZWxlY3RlZCh0YWJsZUNvbnRhaW5lcklkKSkKLSAgICAgICAgICAgIHNldExvY2F0aW9uQW5kU3VibWl0KGZvcm0sIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBzZXRMb2NhdGlvbkFuZFN1Ym1pdChmb3JtLCBsb2NhdGlvbikgewotICAgICAgICBpZiAoaGFuZGxlU3VibWl0KGZvcm0pKQotICAgICAgICB7Ci0gICAgICAgICAgZm9ybS5hY3Rpb24gPSBsb2NhdGlvbjsKLSAgICAgICAgICBmb3JtLnN1Ym1pdCgpOwotICAgICAgICB9Ci0gICAgfQotPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvc2NyaXB0cy93c2lsTmFtZVRhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxOYW1lVGFibGUuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjI4ODdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxOYW1lVGFibGUuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuSFRNTFV0aWxzIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6dXNlQmVhbiBpZD0ibmFtZUxhbmdzIiBjbGFzcz0iamF2YS51dGlsLlZlY3RvciIgc2NvcGU9InJlcXVlc3QiLz4KLTxqc3A6dXNlQmVhbiBpZD0ibmFtZXMiIGNsYXNzPSJqYXZhLnV0aWwuVmVjdG9yIiBzY29wZT0icmVxdWVzdCIvPgotCi08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsVGFibGUuanNwIiBmbHVzaD0idHJ1ZSIvPgotCi08JQotU3RyaW5nIG5hbWVUYWJsZSA9ICJuYW1lVGFibGUiOwotU3RyaW5nIHhuYW1lVGFibGUgPSAieG5hbWVUYWJsZSI7Ci1TdHJpbmcgc2hvd0FsbE5hbWVJRCA9ICJzaG93QWxsTmFtZUlEIjsKLVdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPWNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBmdW5jdGlvbiBzaG93TmFtZSh0YWJsZUNvbnRhaW5lcklEKSB7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySUQpOwotICAgICAgICB2YXIgdGFibGVCb2R5ID0gdGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlRCT0RZIikuaXRlbSgwKTsKLSAgICAgICAgdmFyIGhpZGRlbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJzwlPXNob3dBbGxOYW1lSUQlPicpOwotICAgICAgICA8JQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICU+Ci0gICAgICAgICAgIGFkZFJvd1RvTmFtZVRhYmxlKHRhYmxlQm9keSwKLSAgICAgICAgICAgICAgICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZyluYW1lTGFuZ3MuZWxlbWVudEF0KGkpKSU+IiwKLSAgICAgICAgICAgICAgICI8JT1IVE1MVXRpbHMuSlNNYW5nbGUoKFN0cmluZyluYW1lcy5lbGVtZW50QXQoaSkpJT4iKTsKLSAgICAgICAgPCUKLSAgICAgICAgfQotICAgICAgICAlPgotICAgIH0KLQotICAgIGZ1bmN0aW9uIGFkZFJvd1RvTmFtZVRhYmxlKHRhYmxlQm9keSwgbGFuZywgbmFtZSkgewotICAgICAgICB2YXIgbmV3Um93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLSAgICAgICAgYWRkS2V5VmFsdWVUb1JvdyhuZXdSb3csIGxhbmcsIG5hbWUpOwotICAgICAgICB0YWJsZUJvZHkuYXBwZW5kQ2hpbGQobmV3Um93KTsKLSAgICB9Ci08L3NjcmlwdD4KLQotPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgd2lkdGg9MTE+Ci0gICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1uYW1lVGFibGUlPicsJzwlPXhuYW1lVGFibGUlPicpIj48aW1nIG5hbWU9IjwlPXhuYW1lVGFibGUlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICAgIDxzdHJvbmc+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTkFNRSIpJT48L3N0cm9uZz4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLQotPHRhYmxlIHdpZHRoPSI5NSUiIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MD4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLQotPGRpdiBpZD0iPCU9bmFtZVRhYmxlJT4iPgotICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTEFOR1VBR0UiKSU+PC90aD4KLSAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiIHdpZHRoPSIxMDAlIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9OQU1FIiklPjwvdGg+Ci0gICAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLTwvZGl2PgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICBzaG93TmFtZSgnPCU9bmFtZVRhYmxlJT4nKTsKLSAgICB0d2lzdEluaXQoJzwlPW5hbWVUYWJsZSU+JywnPCU9eG5hbWVUYWJsZSU+Jyk7Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvc2NyaXB0cy93c2lsUGFuZXMuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2M1YjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxQYW5lcy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICB2YXIgd3NpbE5hdmlnYXRvckNvbnRhaW5lciA9IHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfTkFWSUdBVE9SX0NPTlRBSU5FUiU+Il07Ci0gIHZhciB3c2lsTmF2aWdhdG9yVG9vbGJhciA9IHdzaWxOYXZpZ2F0b3JDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX05BVklHQVRPUl9UT09MQkFSJT4iXTsKLSAgdmFyIHdzaWxOYXZpZ2F0b3JDb250ZW50ID0gd3NpbE5hdmlnYXRvckNvbnRhaW5lci5mcmFtZXNbIjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfTkFWSUdBVE9SX0NPTlRFTlQlPiJdOwotICB2YXIgd3NpbEFjdGlvbnNDb250YWluZXIgPSBwZXJzcGVjdGl2ZUNvbnRlbnQuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX0FDVElPTlNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHdzaWxQcm9wZXJ0aWVzQ29udGFpbmVyID0gd3NpbEFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1BST1BFUlRJRVNfQ09OVEFJTkVSJT4iXTsKLSAgdmFyIHdzaWxQcm9wZXJ0aWVzVG9vbGJhciA9IHdzaWxQcm9wZXJ0aWVzQ29udGFpbmVyLmZyYW1lc1siPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9QUk9QRVJUSUVTX1RPT0xCQVIlPiJdOwotICB2YXIgd3NpbFByb3BlcnRpZXNDb250ZW50ID0gd3NpbFByb3BlcnRpZXNDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1BST1BFUlRJRVNfQ09OVEVOVCU+Il07Ci0gIHZhciB3c2lsU3RhdHVzQ29udGFpbmVyID0gd3NpbEFjdGlvbnNDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1NUQVRVU19DT05UQUlORVIlPiJdOwotICB2YXIgd3NpbFN0YXR1c1Rvb2xiYXIgPSB3c2lsU3RhdHVzQ29udGFpbmVyLmZyYW1lc1siPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9TVEFUVVNfVE9PTEJBUiU+Il07Ci0gIHZhciB3c2lsU3RhdHVzQ29udGVudCA9IHdzaWxTdGF0dXNDb250YWluZXIuZnJhbWVzWyI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1NUQVRVU19DT05URU5UJT4iXTsKLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbFRhYmxlLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxUYWJsZS5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTEyNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbFRhYmxlLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvc2NyaXB0cy90YWJsZXMuanNwIiBmbHVzaD0idHJ1ZSIvPgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvYnJvd3NlcmRldGVjdC5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0KLSAgICBmdW5jdGlvbiB3c2lsSGFuZGxlQ2hlY2tBbGxDbGljayh0YWJsZUNvbnRhaW5lcklkLCBjaGVja0FsbENoZWNrYm94KSB7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICBmb3IgKHZhciBpPW51bWJlck9mSGVhZGVyUm93czsgaTx0YWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YXIgcm93Q2hlY2tib3hDZWxsID0gdGFibGUucm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKS5pdGVtKDApOwotICAgICAgICAgICAgdmFyIHJvd0NoZWNrYm94ID0gcm93Q2hlY2tib3hDZWxsLmNoaWxkTm9kZXNbMF07Ci0gICAgICAgICAgICByb3dDaGVja2JveC5jaGVja2VkID0gY2hlY2tBbGxDaGVja2JveC5jaGVja2VkOwotICAgICAgICAgICAgaWYgKHJvd0NoZWNrYm94LmNoZWNrZWQpIHsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRSb3codGFibGUucm93c1tpXSwicm93Y29sb3IiKTsKLSAgICAgICAgICAgICAgICByb3dDaGVja2JveC5uYW1lID0gIjwlPUFjdGlvbklucHV0cy5WSUVXSUQlPiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBoaWdobGlnaHRSb3codGFibGUucm93c1tpXSwidGFibGVjZWxscyIpOwotICAgICAgICAgICAgICAgIHJvd0NoZWNrYm94Lm5hbWUgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZ1bmN0aW9uIHZhbGlkYXRlQ2hlY2tCb3hJbnB1dChjaGVja2JveCwgaXNDaGVja2VkKSB7Ci0gICAgICAgIGlmIChpc0NoZWNrZWQpIHsKLSAgICAgICAgICAgIGNoZWNrYm94Lm5hbWUgPSAiPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNoZWNrYm94Lm5hbWUgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBoYW5kbGVSb3dDaGVja2JveENsaWNrKCk7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gdHdpc3RJbml0KHRhYmxlQ29udGFpbmVySWQsdHdpc3RJbWFnZU5hbWUpIHsKLSAgICAgICAgdmFyIHRhYmxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFibGVDb250YWluZXJJZCk7Ci0gICAgICAgIHZhciB0YWJsZSA9IGdldFRhYmxlKHRhYmxlQ29udGFpbmVySWQpOwotICAgICAgICBpZiAodGFibGUucm93cy5sZW5ndGggPiBudW1iZXJPZkhlYWRlclJvd3MpIHsKLSAgICAgICAgICAgIHRhYmxlQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7Ci0gICAgICAgICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklkLCB0d2lzdEltYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0YWJsZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIiI7Ci0gICAgICAgICAgICB0d2lzdCh0YWJsZUNvbnRhaW5lcklkLCB0d2lzdEltYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBhZGRLZXlWYWx1ZVRvUm93KHJvdywga2V5LCB2YWx1ZSkgewotICAgICAgICB2YXIga2V5VGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGtleSk7Ci0gICAgICAgIHZhciB2YWx1ZVRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0gICAgICAgIHZhciBuZXdDb2wgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwotICAgICAgICB2YXIgbmV3Q29sMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ci0gICAgICAgIG5ld0NvbC5hcHBlbmRDaGlsZChrZXlUZXh0KTsKLSAgICAgICAgbmV3Q29sLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAgICAgbmV3Q29sMi5hcHBlbmRDaGlsZCh2YWx1ZVRleHQpOwotICAgICAgICBuZXdDb2wyLmNsYXNzTmFtZSA9ICJ0YWJsZWNlbGxzIjsKLSAgICAgICAgcm93LmFwcGVuZENoaWxkKG5ld0NvbCk7Ci0gICAgICAgIHJvdy5hcHBlbmRDaGlsZChuZXdDb2wyKTsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiBjbGVhclRhYmxlKHRhYmxlQm9keSwgbnVtSGVhZGVyKSB7Ci0gICAgICAgIGZvcih2YXIgaSA9IG51bUhlYWRlcjsgaSA8IHRhYmxlQm9keS5yb3dzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0YWJsZUJvZHkuZGVsZXRlUm93KGkpOwotICAgICAgICAgICAgaS0tOwotICAgICAgICB9Ci0gICAgfQotCi08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC9zY3JpcHRzL3dzaWxmcmFtZXNldHMuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbGZyYW1lc2V0cy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MjY3M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3NjcmlwdHMvd3NpbGZyYW1lc2V0cy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiIgJT4KLQotPGpzcDppbmNsdWRlIHBhZ2U9Ii9zY3JpcHRzL3BhbmVzLmpzcCIgZmx1c2g9InRydWUiLz4KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICBmdW5jdGlvbiBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKQotICB7Ci0gICAgcmV0dXJuIHBlcnNwZWN0aXZlQ29udGVudC5mcmFtZXNbIjwlPVdzaWxGcmFtZU5hbWVzLldTSUxfQUNUSU9OU19DT05UQUlORVIlPiJdLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFtZXNldCIpLml0ZW0oMCk7Ci0gIH0KLQotICBmdW5jdGlvbiBwcm9jZXNzRnJhbWVzZXRTaXplcyhmcmFtZXNldFNpemVzRm9ybSkKLSAgewotICAgIHRvZ2dsZURvdWJsZUNsaWNrQ29sdW1uVGl0bGUoKTsKLSAgICB2YXIgcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQgPSBnZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldCgpOwotICAgIHZhciBhY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQgPSBnZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXQoKTsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1Xc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX0NPTFNfUEVSU1BFQ1RJVkVfQ09OVEVOVCU+LnZhbHVlID0gcGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXQuY29sczsKLSAgICBmcmFtZXNldFNpemVzRm9ybS48JT1Xc2lsQWN0aW9uSW5wdXRzLkZSQU1FU0VUX1JPV1NfQUNUSU9OU19DT05UQUlORVIlPi52YWx1ZSA9IGFjdGlvbnNDb250YWluZXJGcmFtZXNldC5yb3dzOwotICAgIGZyYW1lc2V0U2l6ZXNGb3JtLnN1Ym1pdCgpOwotICB9Ci08L3NjcmlwdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9VZGRpQnVzaW5lc3NWaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9VZGRpQnVzaW5lc3NWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiOTNiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvdmlld3MvVWRkaUJ1c2luZXNzVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLkFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlJlZnJlc2hBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZVRERJQnVzaW5lc3NMaXN0ID0gImRpdlVERElCdXNpbmVzc0xpc3QiOwotICAgIFN0cmluZyB4ZGl2VURESUJ1c2luZXNzTGlzdCA9ICJ4ZGl2VURESUJ1c2luZXNzTGlzdCI7Ci0KLSAgICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXROb2RlTWFuYWdlcigpOwotICAgIE5vZGUgc2VsZWN0ZWROb2RlID0gbm9kZU1hbmFnZXIuZ2V0U2VsZWN0ZWROb2RlKCk7Ci0gICAgVHJlZUVsZW1lbnQgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWROb2RlLmdldFRyZWVFbGVtZW50KCk7Ci0lPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gICAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJWSUVXX1RJVExFX1VERElfQlVTSU5FU1NFUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Jlc3VtZXByb3h5bG9hZHBhZ2UuanMiKSklPiI+Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFRhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAid3NpbC9pbWFnZXMvbGlzdF9idXNpbmVzc19oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9VRERJX0xJTktTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MSVNUX1VERElfQlVTSU5FU1NFU19ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDsiPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KSB7Ci0gICAgJT4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLk5PREVJRCU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OJT4iIHZhbHVlPSIxIj4KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1kaXZVRERJQnVzaW5lc3NMaXN0JT4nLCc8JT14ZGl2VURESUJ1c2luZXNzTGlzdCU+JykiPjxpbWcgbmFtZT0iPCU9eGRpdlVERElCdXNpbmVzc0xpc3QlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjAgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVURESV9CVVNJTkVTUyIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9ZGl2VURESUJ1c2luZXNzTGlzdCU+Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJ3c2lsSGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9ZGl2VURESUJ1c2luZXNzTGlzdCU+Jyx0aGlzKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9BTExfQ0hFQ0tfQk9YIiklPiI+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9JVEVNX05VTUJFUiIpJT48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VERElfQlVTSU5FU1NfTkFNRSIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgTGlzdE1hbmFnZXIgdWRkaUxpbmtzID0gKChXc2lsRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFVERElMaW5rcygpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB1ZGRpTGlua3MuZ2V0TGlzdEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGl0ZW1OdW0gPSAxOwotICAgICAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAJc29ydGVkVmVjdG9yLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgICBRdWlja1NvcnQuc29ydChzb3J0ZWRWZWN0b3IpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3RFbGVtZW50IGxlID0gKExpc3RFbGVtZW50KXNvcnRlZFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50IHVkZGlMaW5rID0gKFdzaWxVZGRpQnVzaW5lc3NFbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHVkZGlMaW5rLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giICBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuVklFV0lEJT4iIHZhbHVlPSI8JT1sZS5nZXRWaWV3SWQoKSU+IiBvbkNsaWNrPSJ2YWxpZGF0ZUNoZWNrQm94SW5wdXQodGhpcywgdGhpcy5jaGVja2VkKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAlPgotCSAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBsZS5nZXRWaWV3SWQoKSwgMCwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPVN0cmluZy52YWx1ZU9mKGl0ZW1OdW0pJT48L2E+PC90ZD4KLSAgICAgICAJICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyI+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBsZS5nZXRWaWV3SWQoKSwgMCwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPW5hbWUlPjwvYT48L3RkPgotICAgICAgIAkgICAgICAgICAgPCUKLSAgICAgICAJICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgJT4KLQkgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjwlPVN0cmluZy52YWx1ZU9mKGl0ZW1OdW0pJT48L3RkPgotICAgICAgIAkgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VTkFWQUlMQUJMRV9VRERJX0JVU0lORVNTIiklPiZuYnNwOzwlPXVkZGlMaW5rLmdldFVERElMaW5rQnVzaW5lc3NLZXkoKSU+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICBpdGVtTnVtKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgJT4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgdHdpc3RJbml0KCc8JT1kaXZVRERJQnVzaW5lc3NMaXN0JT4nLCc8JT14ZGl2VURESUJ1c2luZXNzTGlzdCU+Jyk7Ci0gICAgICAgIDwvc2NyaXB0PgotCi0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BRERfVE9fVURESV9QRVJTUEVDVElWRSIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2VURESUJ1c2luZXNzTGlzdCU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZEJ1c2luZXNzVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FERF9UT19GQVZPUklURVMiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdlVERElCdXNpbmVzc0xpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfUkVGUkVTSCIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2VURESUJ1c2luZXNzTGlzdCU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFJlZnJlc2hBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgbm93cmFwIHdpZHRoPSI5MCUiPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgIHJlc3VtZVByb3h5TG9hZFBhZ2UoKTsKLTwvc2NyaXB0PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvdmlld3MvVWRkaVNlcnZpY2VzVmlldy5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvdmlld3MvVWRkaVNlcnZpY2VzVmlldy5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTQ4ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1VkZGlTZXJ2aWNlc1ZpZXcuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJqYXZhLnV0aWwuVmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLkVudW1lcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnV0aWwuUXVpY2tTb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0uZGF0YW1vZGVsLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLlNlbGVjdFdTSUxUb29sQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5BZGRUb0Zhdm9yaXRlc0FjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkU2VydmljZVRvVURESVBlcnNwZWN0aXZlQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5SZWZyZXNoQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS5XU0lMUGVyc3BlY3RpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5kYXRhbW9kZWwuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgIFN0cmluZyBkaXZVRERJU2VydmljZUxpc3QgPSAiZGl2VURESVNlcnZpY2VMaXN0IjsKLSAgICBTdHJpbmcgeGRpdlVERElTZXJ2aWNlTGlzdCA9ICJ4ZGl2VURESVNlcnZpY2VMaXN0IjsKLQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlZJRVdfVElUTEVfVURESV9TRVJWSUNFUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Jlc3VtZXByb3h5bG9hZHBhZ2UuanMiKSklPiI+Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbFRhYmxlLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsRm9ybVN1Ym1pdC5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci08L2hlYWQ+Ci08Ym9keSBjbGFzcz0iY29udGVudGJvZHltYXJnaW4iPgotPGRpdiBpZD0iY29udGVudGJvcmRlciI+Ci0gICAgPCUKLSAgICBTdHJpbmcgdGl0bGVJbWFnZVBhdGggPSAid3NpbC9pbWFnZXMvbGlzdF9VRERJX3NlcnZpY2VfaGlnaGxpZ2h0ZWQuZ2lmIjsKLSAgICBTdHJpbmcgdGl0bGUgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiQUxUX0xJU1RfVURESV9TRVJWSUNFUyIpOwotICAgICU+Ci0gICAgPCVAIGluY2x1ZGUgZmlsZSA9ICIvZm9ybXMvZm9ybWhlYWRlci5pbmMiICU+Ci0gICAgPHRhYmxlPgotICAgICAgPHRyPgotICAgICAgICA8dGQgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfTElTVF9VRERJX1NFUlZJQ0VTX0RFU0MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+ICAgIAotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+IiBtZXRob2Q9InBvc3QiIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+IiBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyI+Ci0KLSAgICA8JQotICAgIGlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBXc2lsRWxlbWVudCkgewotICAgICU+Ci0gICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IjwlPUFjdGlvbklucHV0cy5OT0RFSUQlPiIgdmFsdWU9IjwlPXNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSU+Ij4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9V3NpbEFjdGlvbklucHV0cy5NVUxUSVBMRV9MSU5LX0FDVElPTiU+IiB2YWx1ZT0iMSI+Ci0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz02IGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD0yMCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIG5vd3JhcCB3aWR0aD0xMT4KLSAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp0d2lzdCgnPCU9ZGl2VURESVNlcnZpY2VMaXN0JT4nLCc8JT14ZGl2VURESVNlcnZpY2VMaXN0JT4nKSI+PGltZyBuYW1lPSI8JT14ZGl2VURESVNlcnZpY2VMaXN0JT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvdHdpc3RjbG9zZWQuZ2lmIikpJT4iIGFsdD0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfVFdJU1RfQ0xPU0VEIiklPiIgY2xhc3M9InR3aXN0Ij48L2E+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTIwIHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX1VERElfU0VSVklDRSIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9ZGl2VURESVNlcnZpY2VMaXN0JT4iPgotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgY2VsbHBhZGRpbmc9MyBjZWxsc3BhY2luZz0wIGNsYXNzPSJ0YWJsZWJvcmRlciI+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG9uQ2xpY2s9IndzaWxIYW5kbGVDaGVja0FsbENsaWNrKCc8JT1kaXZVRERJU2VydmljZUxpc3QlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSVRFTV9OVU1CRVIiKSU+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VRERJX1NFUlZJQ0VfTkFNRSIpJT48L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgIDwlCi0gICAgICAgICAgICAgICAgTGlzdE1hbmFnZXIgdWRkaVNlcnZpY2VzID0gKChXc2lsRWxlbWVudClzZWxlY3RlZEVsZW1lbnQpLmdldEFsbFVERElTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSB1ZGRpU2VydmljZXMuZ2V0TGlzdEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgaW50IGl0ZW1OdW0gPSAxOwotICAgICAgICAgICAgICAgIFZlY3RvciBzb3J0ZWRWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAJc29ydGVkVmVjdG9yLmFkZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgIAkgIH0KLSAgICAgICAgICAgICAgICBRdWlja1NvcnQuc29ydChzb3J0ZWRWZWN0b3IpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkVmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3RFbGVtZW50IGxlID0gKExpc3RFbGVtZW50KXNvcnRlZFZlY3Rvci5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIFdzaWxVZGRpU2VydmljZUVsZW1lbnQgdWRkaVNlcnZpY2UgPSAoV3NpbFVkZGlTZXJ2aWNlRWxlbWVudClsZS5nZXRPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB1ZGRpU2VydmljZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLlZJRVdJRCU+IiB2YWx1ZT0iPCU9bGUuZ2V0Vmlld0lkKCklPiIgb25DbGljaz0idmFsaWRhdGVDaGVja0JveElucHV0KHRoaXMsIHRoaXMuY2hlY2tlZCkiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfUk9XX0NIRUNLX0JPWCIpJT4iPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgICAgIAk8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoU2VsZWN0V1NJTFRvb2xBY3Rpb24uZ2V0QWN0aW9uTGluayhzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCksIHNlbGVjdGVkTm9kZS5nZXRUb29sTWFuYWdlcigpLmdldFNlbGVjdGVkVG9vbElkKCksIGxlLmdldFZpZXdJZCgpLCAwLCBmYWxzZSkpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PCU9U3RyaW5nLnZhbHVlT2YoaXRlbU51bSklPjwvYT48L3RkPgotCSAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgbGUuZ2V0Vmlld0lkKCksIDAsIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1uYW1lJT48L2E+PC90ZD4KLQkgICAgICAgICAgICAgICAgIDwlCi0JICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAJPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PCU9U3RyaW5nLnZhbHVlT2YoaXRlbU51bSklPjwvdGQ+Ci0JCQkJPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVU5BVkFJTEFCTEVfVURESV9TRVJWSUNFIiklPiZuYnNwOzwlPXVkZGlTZXJ2aWNlLmdldFVERElTZXJ2aWNlS2V5KCklPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgaXRlbU51bSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2VURESVNlcnZpY2VMaXN0JT4nLCc8JT14ZGl2VURESVNlcnZpY2VMaXN0JT4nKTsKLSAgICAgICAgPC9zY3JpcHQ+Ci0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FERF9UT19VRERJX1BFUlNQRUNUSVZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZVRERJU2VydmljZUxpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRTZXJ2aWNlVG9VRERJUGVyc3BlY3RpdmVBY3Rpb24uZ2V0QmFzZUFjdGlvbkxpbmsoKSkpJT4nKSIgY2xhc3M9ImJ1dHRvbiI+Ci0gICAgICAgICAgICAgICAgPC90ZD4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FERF9UT19GQVZPUklURVMiKSU+IiBvbkNsaWNrPSJzZXRGb3JtTG9jYXRpb25BbmRTdWJtaXQoJzwlPWRpdlVERElTZXJ2aWNlTGlzdCU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KEFkZFRvRmF2b3JpdGVzQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9SRUZSRVNIIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZVRERJU2VydmljZUxpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChSZWZyZXNoQWN0aW9uLmdldEJhc2VBY3Rpb25MaW5rKCkpKSU+JykiIGNsYXNzPSJidXR0b24iPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICAgICAgPHRkIG5vd3JhcCB3aWR0aD0iOTAlIj4mbmJzcDs8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgIDwlCi0gICAgfQotJT4KLTwvZGl2PgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICByZXN1bWVQcm94eUxvYWRQYWdlKCk7Ci08L3NjcmlwdD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1dzZGxTZXJ2aWNlc1ZpZXcuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3ZpZXdzL1dzZGxTZXJ2aWNlc1ZpZXcuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI5Yzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9Xc2RsU2VydmljZXNWaWV3LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0iamF2YS51dGlsLlZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5FbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS51dGlsLlF1aWNrU29ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmRhdGFtb2RlbC4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuQWRkVG9GYXZvcml0ZXNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5hY3Rpb25zLldzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICBTdHJpbmcgZGl2V1NETExpc3QgPSAiZGl2V1NETExpc3QiOwotICAgIFN0cmluZyB4ZGl2V1NETExpc3QgPSAieGRpdldTRExMaXN0IjsKLQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlZJRVdfVElUTEVfV1NETF9TRVJWSUNFUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzaWwvaW1hZ2VzL2xpc3RfV1NETF9zZXJ2aWNlX2hpZ2hsaWdodGVkLmdpZiI7Ci0gICAgU3RyaW5nIHRpdGxlID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9MSVNUX1dTRExfU0VSVklDRVMiKTsKLSAgICAlPgotICAgIDwlQCBpbmNsdWRlIGZpbGUgPSAiL2Zvcm1zL2Zvcm1oZWFkZXIuaW5jIiAlPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIGNsYXNzPSJsYWJlbHMiPgotICAgICAgICAgIDwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0xJU1RfV1NETF9TRVJWSUNFU19ERVNDIiklPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPiAgICAKLSAgICA8Zm9ybSBhY3Rpb249IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDsiPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KSB7Ci0gICAgJT4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLk5PREVJRCU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OJT4iIHZhbHVlPSIxIj4KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1kaXZXU0RMTGlzdCU+JywnPCU9eGRpdldTRExMaXN0JT4nKSI+PGltZyBuYW1lPSI8JT14ZGl2V1NETExpc3QlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NETF9TRVJWSUNFIiklPjwvc3Ryb25nPgotICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICA8L3RhYmxlPgotCi0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBib3JkZXI9MCBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBoZWlnaHQ9MTA+PGltZyBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2tleWxpbmUuZ2lmIikpJT4iIGhlaWdodD0yIHdpZHRoPSIxMDAlIj48L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8ZGl2IGlkPSI8JT1kaXZXU0RMTGlzdCU+Ij4KLSAgICAgICAgPHRhYmxlIHdpZHRoPSI5NSUiIGNlbGxwYWRkaW5nPTMgY2VsbHNwYWNpbmc9MCBjbGFzcz0idGFibGVib3JkZXIiPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iY2hlY2tib3hjZWxscyIgd2lkdGg9MTA+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBvbkNsaWNrPSJ3c2lsSGFuZGxlQ2hlY2tBbGxDbGljaygnPCU9ZGl2V1NETExpc3QlPicsdGhpcykiIHRpdGxlPSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkZPUk1fQ09OVFJPTF9USVRMRV9TRUxFQ1RfQUxMX0NIRUNLX0JPWCIpJT4iPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfSVRFTV9OVU1CRVIiKSU+PC90aD4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlcmNvbG9yIj48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9VUkwiKSU+PC90aD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgIExpc3RNYW5hZ2VyIHdzZGxTZXJ2aWNlcyA9ICgoV3NpbEVsZW1lbnQpc2VsZWN0ZWRFbGVtZW50KS5nZXRBbGxXU0RMU2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gd3NkbFNlcnZpY2VzLmdldExpc3RFbGVtZW50cygpOwotICAgICAgICAgICAgICAgIGludCBpdGVtTnVtID0gMTsKLSAgICAgICAgICAgICAgICBWZWN0b3Igc29ydGVkVmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgCXNvcnRlZFZlY3Rvci5hZGQoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAJICB9Ci0gICAgICAgICAgICAgICAgUXVpY2tTb3J0LnNvcnQoc29ydGVkVmVjdG9yKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvcnRlZFZlY3Rvci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBMaXN0RWxlbWVudCBsZSA9IChMaXN0RWxlbWVudClzb3J0ZWRWZWN0b3IuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgICBXc2lsV3NkbFNlcnZpY2VFbGVtZW50IHdzZGxTZXJ2aWNlID0gKFdzaWxXc2RsU2VydmljZUVsZW1lbnQpbGUuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyB3c2RsVVJMID0gd3NkbFNlcnZpY2UuZ2V0V1NETFNlcnZpY2VVUkwoKTsKLSAgICAgICAgICAgICAgICAgICAgJT4KLSAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjaGVja2JveGNlbGxzIiB3aWR0aD0xMD48aW5wdXQgdHlwZT0iY2hlY2tib3giICBuYW1lPSI8JT1BY3Rpb25JbnB1dHMuVklFV0lEJT4iIHZhbHVlPSI8JT1sZS5nZXRWaWV3SWQoKSU+IiBvbkNsaWNrPSJ2YWxpZGF0ZUNoZWNrQm94SW5wdXQodGhpcywgdGhpcy5jaGVja2VkKSIgdGl0bGU9IjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiRk9STV9DT05UUk9MX1RJVExFX1NFTEVDVF9ST1dfQ0hFQ0tfQk9YIiklPiI+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjxhIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChTZWxlY3RXU0lMVG9vbEFjdGlvbi5nZXRBY3Rpb25MaW5rKHNlbGVjdGVkTm9kZS5nZXROb2RlSWQoKSwgc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCkuZ2V0U2VsZWN0ZWRUb29sSWQoKSwgbGUuZ2V0Vmlld0lkKCksIDAsIGZhbHNlKSkpJT4iIHRhcmdldD0iPCU9RnJhbWVOYW1lcy5QRVJTUEVDVElWRV9XT1JLQVJFQSU+Ij48JT1TdHJpbmcudmFsdWVPZihpdGVtTnVtKSU+PC9hPjwvdGQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9InRhYmxlY2VsbHMiIG5vd3JhcD48JT13c2RsVVJMJT48L3RkPgotICAgICAgICAgICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgICAgICAgICA8JQotICAgICAgICAgICAgICAgICAgICBpdGVtTnVtKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgJT4KLSAgICAgICAgPC90YWJsZT4KLSAgICAgICAgPC9kaXY+Ci0gICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgotICAgICAgICAgICAgdHdpc3RJbml0KCc8JT1kaXZXU0RMTGlzdCU+JywnPCU9eGRpdldTRExMaXN0JT4nKTsKLSAgICAgICAgPC9zY3JpcHQ+Ci0KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTIgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTQwIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0FERF9UT19XU0RMX1BFUlNQRUNUSVZFIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZXU0RMTGlzdCU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFdzaWxBZGRUb1dTRExQZXJzcGVjdGl2ZUFjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9NDAgdmFsaWduPSJib3R0b20iPgotICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfQUREX1RPX0ZBVk9SSVRFUyIpJT4iIG9uQ2xpY2s9InNldEZvcm1Mb2NhdGlvbkFuZFN1Ym1pdCgnPCU9ZGl2V1NETExpc3QlPicsIHRoaXMuZm9ybSwgJzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dChBZGRUb0Zhdm9yaXRlc0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9Xc2lsTGlua3NWaWV3LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC92aWV3cy9Xc2lsTGlua3NWaWV3LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1MzIzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvdmlld3MvV3NpbExpbmtzVmlldy5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9ImphdmEudXRpbC5WZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuRW51bWVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0udXRpbC5RdWlja1NvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5kYXRhbW9kZWwuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuV1NJTFBlcnNwZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuYWN0aW9ucy5TZWxlY3RXU0lMVG9vbEFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmFjdGlvbnMuT3BlbldTSUxMaW5rQWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuZGF0YW1vZGVsLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgICBTdHJpbmcgZGl2V1NJTExpc3QgPSAiZGl2V1NJTExpc3QiOwotICAgIFN0cmluZyB4ZGl2V1NJTExpc3QgPSAieGRpdldTSUxMaXN0IjsKLQotICAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBUcmVlRWxlbWVudCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZE5vZGUuZ2V0VHJlZUVsZW1lbnQoKTsKLSU+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIlZJRVdfVElUTEVfV1NJTF9MSU5LUyIpJT48L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9zY3JpcHRzL3dzaWxUYWJsZS5qc3AiIGZsdXNoPSJ0cnVlIi8+Ci0gICAgPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbEZvcm1TdWJtaXQuanNwIiBmbHVzaD0idHJ1ZSIvPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICAgIDwlCi0gICAgU3RyaW5nIHRpdGxlSW1hZ2VQYXRoID0gIndzaWwvaW1hZ2VzL2xpc3RfV1NJTF9oaWdobGlnaHRlZC5naWYiOwotICAgIFN0cmluZyB0aXRsZSA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfTElTVF9XU0lMX0xJTktTIik7Ci0gICAgJT4KLSAgICA8JUAgaW5jbHVkZSBmaWxlID0gIi9mb3Jtcy9mb3JtaGVhZGVyLmluYyIgJT4KLSAgICA8dGFibGU+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjbGFzcz0ibGFiZWxzIj4KLSAgICAgICAgICA8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9MSVNUX1dTSUxfTElOS1MiKSU+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+ICAgIAotICAgIDxmb3JtIGFjdGlvbj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5XU0lMTGlua0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPiIgbWV0aG9kPSJwb3N0IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiIgc3R5bGU9Im1hcmdpbi10b3A6MTBweDsiPgotICAgIDwlCi0gICAgaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIFdzaWxFbGVtZW50KSB7Ci0gICAgJT4KLSAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iPCU9QWN0aW9uSW5wdXRzLk5PREVJRCU+IiB2YWx1ZT0iPCU9c2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpJT4iPgotICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSI8JT1Xc2lsQWN0aW9uSW5wdXRzLk1VTFRJUExFX0xJTktfQUNUSU9OJT4iIHZhbHVlPSIxIj4KLSAgICAgICAgPHRhYmxlIGJvcmRlcj0wIGNlbGxwYWRkaW5nPTYgY2VsbHNwYWNpbmc9MD4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PTI1IHZhbGlnbj0iYm90dG9tIiBhbGlnbj0ibGVmdCIgbm93cmFwIHdpZHRoPTExPgotICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnR3aXN0KCc8JT1kaXZXU0lMTGlzdCU+JywnPCU9eGRpdldTSUxMaXN0JT4nKSI+PGltZyBuYW1lPSI8JT14ZGl2V1NJTExpc3QlPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy90d2lzdGNsb3NlZC5naWYiKSklPiIgYWx0PSI8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9UV0lTVF9DTE9TRUQiKSU+IiBjbGFzcz0idHdpc3QiPjwvYT4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9MjUgdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBub3dyYXAgY2xhc3M9ImxhYmVscyI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfV1NJTF9MSU5LUyIpJT48L3N0cm9uZz4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQotICAgICAgICA8dGFibGUgd2lkdGg9Ijk1JSIgYm9yZGVyPTAgY2VsbHBhZGRpbmc9MCBjZWxsc3BhY2luZz0wPgotICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgaGVpZ2h0PTEwPjxpbWcgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9rZXlsaW5lLmdpZiIpKSU+IiBoZWlnaHQ9MiB3aWR0aD0iMTAwJSI+PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICAgICAgPGRpdiBpZD0iPCU9ZGl2V1NJTExpc3QlPiI+Ci0gICAgICAgIDx0YWJsZSB3aWR0aD0iOTUlIiBjZWxscGFkZGluZz0zIGNlbGxzcGFjaW5nPTAgY2xhc3M9InRhYmxlYm9yZGVyIj4KLSAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgb25DbGljaz0id3NpbEhhbmRsZUNoZWNrQWxsQ2xpY2soJzwlPWRpdldTSUxMaXN0JT4nLHRoaXMpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX0FMTF9DSEVDS19CT1giKSU+Ij48L3RoPgotICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyY29sb3IiPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGT1JNX0xBQkVMX0lURU1fTlVNQkVSIiklPjwvdGg+Ci0gICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXJjb2xvciI+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZPUk1fTEFCRUxfVVJMIiklPjwvdGg+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICBMaXN0TWFuYWdlciB3c2lsTGlua3MgPSAoKFdzaWxFbGVtZW50KXNlbGVjdGVkRWxlbWVudCkuZ2V0QWxsV1NJTExpbmtzKCk7Ci0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IHdzaWxMaW5rcy5nZXRMaXN0RWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBpbnQgaXRlbU51bSA9IDE7Ci0gICAgICAgICAgICAgICAgVmVjdG9yIHNvcnRlZFZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIAlzb3J0ZWRWZWN0b3IuYWRkKGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgCSAgfQotICAgICAgICAgICAgICAgIFF1aWNrU29ydC5zb3J0KHNvcnRlZFZlY3Rvcik7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWRWZWN0b3Iuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdEVsZW1lbnQgbGUgPSAoTGlzdEVsZW1lbnQpc29ydGVkVmVjdG9yLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgV3NpbFdzaWxMaW5rRWxlbWVudCB3c2lsTGluayA9IChXc2lsV3NpbExpbmtFbGVtZW50KWxlLmdldE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gd3NpbExpbmsuZ2V0V1NJTExpbmtMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAlPgotICAgICAgICAgICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNoZWNrYm94Y2VsbHMiIHdpZHRoPTEwPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgIG5hbWU9IjwlPUFjdGlvbklucHV0cy5WSUVXSUQlPiIgdmFsdWU9IjwlPWxlLmdldFZpZXdJZCgpJT4iIG9uQ2xpY2s9InZhbGlkYXRlQ2hlY2tCb3hJbnB1dCh0aGlzLCB0aGlzLmNoZWNrZWQpIiB0aXRsZT0iPCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJGT1JNX0NPTlRST0xfVElUTEVfU0VMRUNUX1JPV19DSEVDS19CT1giKSU+Ij48L3RkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0YWJsZWNlbGxzIiBub3dyYXA+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KFNlbGVjdFdTSUxUb29sQWN0aW9uLmdldEFjdGlvbkxpbmsoc2VsZWN0ZWROb2RlLmdldE5vZGVJZCgpLCBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKS5nZXRTZWxlY3RlZFRvb2xJZCgpLCBsZS5nZXRWaWV3SWQoKSwgMCwgZmFsc2UpKSklPiIgdGFyZ2V0PSI8JT1GcmFtZU5hbWVzLlBFUlNQRUNUSVZFX1dPUktBUkVBJT4iPjwlPVN0cmluZy52YWx1ZU9mKGl0ZW1OdW0pJT48L2E+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0idGFibGVjZWxscyIgbm93cmFwPjwlPXVybCU+PC90ZD4KLSAgICAgICAgICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICAgICAgICAgICAgPCUKLSAgICAgICAgICAgICAgICAgICAgaXRlbU51bSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICU+Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICAgIDwvZGl2PgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIHR3aXN0SW5pdCgnPCU9ZGl2V1NJTExpc3QlPicsJzwlPXhkaXZXU0lMTGlzdCU+Jyk7Ci0gICAgICAgIDwvc2NyaXB0PgotCi0gICAgICAgIDx0YWJsZSBib3JkZXI9MCBjZWxscGFkZGluZz0yIGNlbGxzcGFjaW5nPTA+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgICAgPHRkIGhlaWdodD00MCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRk9STV9MQUJFTF9BRERfVE9fTkFWSUdBVE9SIiklPiIgb25DbGljaz0ic2V0Rm9ybUxvY2F0aW9uQW5kU3VibWl0KCc8JT1kaXZXU0lMTGlzdCU+JywgdGhpcy5mb3JtLCAnPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KE9wZW5XU0lMTGlua0FjdGlvbi5nZXRCYXNlQWN0aW9uTGluaygpKSklPicpIiBjbGFzcz0iYnV0dG9uIj4KLSAgICAgICAgICAgICAgICA8L3RkPgotICAgICAgICAgICAgICAgIDx0ZCBub3dyYXAgd2lkdGg9IjkwJSI+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgIDwvdHI+Ci0gICAgICAgIDwvdGFibGU+Ci0KLSAgICA8JQotICAgIH0KLSU+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX2FjdGlvbnNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX2FjdGlvbnNfY29udGFpbmVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjZWNjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9hY3Rpb25zX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9BQ1RJT05TX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCklPiIgYmdjb2xvcj0iI0VDRTlEOCI+Ci0gIDxmcmFtZSBuYW1lPSI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1BST1BFUlRJRVNfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19DT05UQUlORVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AiKSU+IiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci0gIDxmcmFtZSBuYW1lPSI8JT1Xc2lsRnJhbWVOYW1lcy5XU0lMX1NUQVRVU19DT05UQUlORVIlPiIgdGl0bGU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9TVEFUVVNfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfc3RhdHVzX2NvbnRhaW5lci5qc3AiKSU+IiBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xIG1hcmdpbndpZHRoPTAgbWFyZ2luaGVpZ2h0PTA+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfbmF2aWdhdG9yX2NvbnRhaW5lci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9uYXZpZ2F0b3JfY29udGFpbmVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiYTI2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9uYXZpZ2F0b3JfY29udGFpbmVyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9OQVZJR0FUT1JfVE9PTEJBUiU+IiB0aXRsZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfbmF2aWdhdG9yX3Rvb2xiYXIuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9OQVZJR0FUT1JfQ09OVEVOVCU+IiB0aXRsZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfbmF2aWdhdG9yX2NvbnRlbnQuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX25hdmlnYXRvcl9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX25hdmlnYXRvcl9jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyMGQyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9uYXZpZ2F0b3JfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgICAgCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX05BVklHQVRPUl9DT05URU5UIiklPjwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdHJlZXZpZXcuY3NzIikpJT4iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL2Jyb3dzZXJkZXRlY3QuanMiKSklPiI+Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdHJlZXZpZXcuanMiKSklPiI+Ci0gICAgPC9zY3JpcHQ+Ci08L2hlYWQ+Ci08JQotICAgIFN0cmluZyBzZWxlY3RlZEFuY2hvck5hbWUgPSAiIjsKLSAgICBOb2RlTWFuYWdlciBub2RlTWFuYWdlciA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCkuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBpbnQgZm9jdXNlZE5vZGVJZCA9IG5vZGVNYW5hZ2VyLmdldEZvY3VzZWROb2RlSWQoKTsKLSAgICBTdHJpbmcgZm9jdXNlZEFuY2hvck5hbWUgPSBTdHJpbmcudmFsdWVPZihmb2N1c2VkTm9kZUlkKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkgewotICAgICAgICBzZWxlY3RlZEFuY2hvck5hbWUgPSBzZWxlY3RlZE5vZGUuZ2V0QW5jaG9yTmFtZSgpOwotICAgICAgICBpZiAoZm9jdXNlZE5vZGVJZCA9PSBzZWxlY3RlZE5vZGUuZ2V0Tm9kZUlkKCkpCi0gICAgICAgICAgICBmb2N1c2VkQW5jaG9yTmFtZSA9IHNlbGVjdGVkQW5jaG9yTmFtZTsKLSAgICB9Ci0lPgotPGJvZHkgb25Mb2FkPSJzZWxmLmxvY2F0aW9uLmhhc2g9JyM8JT1mb2N1c2VkQW5jaG9yTmFtZSU+JztzZXRTZWxlY3RlZEFuY2hvck5hbWUoJzwlPXNlbGVjdGVkQW5jaG9yTmFtZSU+JykiIGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci0gICAgPGRpdiBpZD0idHJlZWNvbnRlbnRib3JkZXIiPgotICAgICAgICA8JT1ub2RlTWFuYWdlci5yZW5kZXJUcmVlVmlldyhyZXNwb25zZSklPgotICAgIDwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfbmF2aWdhdG9yX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfbmF2aWdhdG9yX3Rvb2xiYXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzY5Y2Q1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX25hdmlnYXRvcl90b29sYmFyLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTwlCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0lPgotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5wZXJzcGVjdGl2ZS4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ud3NpbC5jb25zdGFudHMuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4gIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PiAgCi08L2hlYWQ+Ci08Ym9keSBjbGFzcz0idG9vbGJhcmJvZHltYXJnaW4iPgotPGRpdiBpZD0idG9vbGJhcmJvcmRlciI+Ci0gIDxkaXYgaWQ9InRvb2xiYXIiIG9uZGJsY2xpY2s9InByb2Nlc3NGcmFtZXNldFNpemVzKGRvY3VtZW50LmZvcm1zWzBdKSI+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1BY3Rpb24iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICBmb3JtQWN0aW9uLmFwcGVuZCgid3NpbC9hY3Rpb25zL1Jlc2l6ZVdTSUxGcmFtZXNBY3Rpb25KU1AuanNwIik7Ci0lPiAgCi08L2pzcDp1c2VCZWFuPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtRnJhbWVOYW1lIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgIGZvcm1GcmFtZU5hbWUuYXBwZW5kKFdzaWxGcmFtZU5hbWVzLldTSUxfTkFWSUdBVE9SX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9mb3Jtcy9Qcm9jZXNzV1NJTEZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL25hdmlnYXRvci5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2PjwvdGQ+Ci08JQotICAgU3RyaW5nIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBudWxsOwotICAgaWYgKHdzaWxQZXJzcGVjdGl2ZS5nZXRQZXJzcGVjdGl2ZUNvbnRlbnRGcmFtZXNldENvbHMoKS5zdGFydHNXaXRoKCIxMDAlIikpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgZWxzZQotICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX01BWElNSVpFIik7Ci0lPiAgICAgICAgCi0gICAgICAgIDx0ZCBpZD0iZG91YmxlY2xpY2tjb2x1bW4iIHRpdGxlPSI8JT1kb3VibGVDbGlja0NvbHVtblRpdGxlJT4iIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCIgd2lkdGg9IioiIGhlaWdodD0yNSBub3dyYXAgY2xhc3M9InRleHQiPjwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX05BVklHQVRPUiIpJT48L3RkPgotPCUKLSAgIFN0cmluZyBhbHRSZWZyZXNoID0gd3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkFMVF9SRUZSRVNIX1dTSUwiKTsKLSAgIFN0cmluZyBhbHRDbGVhciA9IHdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJBTFRfQ0xFQVJfV1NJTCIpOwotJT4gICAgICAgICAgIAotICAgICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHdpZHRoPTI1IGhlaWdodD0yNT48YSBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoIndzaWwvYWN0aW9ucy9SZWZyZXNoQWN0aW9uSlNQLmpzcCIpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfZW5hYmxlZC5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2IG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL3JlZnJlc2hfaGlnaGxpZ2h0ZWQuZ2lmIikpJT4nO21vdXNlb3Zlcih0aGlzKSIgb25Nb3VzZU91dD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9yZWZyZXNoX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNldXAodGhpcykiIGFsdD0iPCU9YWx0UmVmcmVzaCU+IiB0aXRsZT0iPCU9YWx0UmVmcmVzaCU+Ij48L2E+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL2FjdGlvbnMvQ2xlYXJXU0lMQWN0aW9uSlNQLmpzcCIpKSU+IiB0YXJnZXQ9IjwlPUZyYW1lTmFtZXMuUEVSU1BFQ1RJVkVfV09SS0FSRUElPiI+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNiBvbk1vdXNlT3Zlcj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2VvdmVyKHRoaXMpIiBvbk1vdXNlT3V0PSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2VuYWJsZWQuZ2lmIikpJT4nO21vdXNlb3V0KHRoaXMpIiBvbk1vdXNlRG93bj0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9oaWdobGlnaHRlZC5naWYiKSklPic7bW91c2Vkb3duKHRoaXMpIiBvbk1vdXNlVXA9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2V1cCh0aGlzKSIgYWx0PSI8JT1hbHRDbGVhciU+IiB0aXRsZT0iPCU9YWx0Q2xlYXIlPiI+PC9hPjwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wZXJzcGVjdGl2ZV9jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2E0MmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3BlcnNwZWN0aXZlX2NvbnRlbnQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgY29scz0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldFBlcnNwZWN0aXZlQ29udGVudEZyYW1lc2V0Q29scygpJT4iIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9OQVZJR0FUT1JfQ09OVEFJTkVSJT4iIHRpdGxlPSI8JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfTkFWSUdBVE9SX0NPTlRBSU5FUiIpJT4iIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKCJ3c2lsX25hdmlnYXRvcl9jb250YWluZXIuanNwIiklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9BQ1RJT05TX0NPTlRBSU5FUiU+IiB0aXRsZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX0FDVElPTlNfQ09OVEFJTkVSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfYWN0aW9uc19jb250YWluZXIuanNwIiklPiIgbWFyZ2lud2lkdGg9MCBtYXJnaW5oZWlnaHQ9MCBzY3JvbGxpbmc9Im5vIiBmcmFtZWJvcmRlcj0xPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGFpbmVyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzNmU1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRhaW5lci5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwuY29uc3RhbnRzLioiICU+Ci0KLTxqc3A6dXNlQmVhbiBpZD0iY29udHJvbGxlciIgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS5wZXJzcGVjdGl2ZS5Db250cm9sbGVyIiBzY29wZT0ic2Vzc2lvbiIvPgotPCUKLSAgIFdTSUxQZXJzcGVjdGl2ZSB3c2lsUGVyc3BlY3RpdmUgPSBjb250cm9sbGVyLmdldFdTSUxQZXJzcGVjdGl2ZSgpOwotJT4gICAKLTxodG1sPgotPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLSAgPHRpdGxlPjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9QUk9QRVJUSUVTX1RPT0xCQVIlPiIgdGl0bGU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX1RPT0xCQVIiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NpbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9QUk9QRVJUSUVTX0NPTlRFTlQlPiIgdGl0bGU9IjwlPXdzaWxQZXJzcGVjdGl2ZS5nZXRNZXNzYWdlKCJGUkFNRV9USVRMRV9QUk9QRVJUSUVTX0NPTlRFTlQiKSU+IiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTCgid3NpbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGVudC5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX2NvbnRlbnQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc0YTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3Byb3BlcnRpZXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1BST1BFUlRJRVNfQ09OVEVOVCIpJT48L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImNzcy93aW5kb3dzLmNzcyIpKSU+Ij4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJjb250ZW50Ym9keW1hcmdpbiI+Ci08ZGl2IGlkPSJjb250ZW50Ym9yZGVyIj4KLTwlCi0gICAgTm9kZU1hbmFnZXIgbm9kZU1hbmFnZXIgPSB3c2lsUGVyc3BlY3RpdmUuZ2V0Tm9kZU1hbmFnZXIoKTsKLSAgICBOb2RlIHNlbGVjdGVkTm9kZSA9IG5vZGVNYW5hZ2VyLmdldFNlbGVjdGVkTm9kZSgpOwotICAgIGlmIChzZWxlY3RlZE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAgIFRvb2xNYW5hZ2VyIHRvb2xNYW5hZ2VyOwotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlLmdldFZpZXdJZCgpID09IEFjdGlvbklucHV0cy5WSUVXSURfREVGQVVMVCkKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFRvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRvb2xNYW5hZ2VyID0gc2VsZWN0ZWROb2RlLmdldFZpZXdUb29sTWFuYWdlcigpOwotICAgICAgICBUb29sIHNlbGVjdGVkVG9vbCA9IHRvb2xNYW5hZ2VyLmdldFNlbGVjdGVkVG9vbCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRUb29sICE9IG51bGwgJiYgc2VsZWN0ZWRUb29sLmdldFRvb2xUeXBlKCkgIT0gVG9vbFR5cGVzLkFDVElPTikgewotICAgICAgICAlPgotICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KLSAgICAgICAgICAgIGxvY2F0aW9uPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoc2VsZWN0ZWRUb29sLmdldEZvcm1MaW5rKCkpKSU+IjsKLSAgICAgICAgPC9zY3JpcHQ+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICU+Ci08dGFibGU+Ci0gIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIk1TR19FUlJPUl9OT19BQ1RJT05fU0VMRUNURUQiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0gICAgICAgIDwlCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgJT4KLTx0YWJsZT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDwlPWNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiTVNHX0VSUk9SX05PX05PREVfU0VMRUNURUQiKSU+Ci0gICAgPC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0gICAgPCUKLSAgICB9Ci0lPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfcHJvcGVydGllc190b29sYmFyLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4NzYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9wcm9wZXJ0aWVzX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfUFJPUEVSVElFU19UT09MQkFSIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3Rvb2xiYXIuY3NzIikpJT4iPgotPGpzcDppbmNsdWRlIHBhZ2U9Ii93c2lsL3NjcmlwdHMvd3NpbGZyYW1lc2V0cy5qc3AiIGZsdXNoPSJ0cnVlIi8+ICAKLTxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJzY3JpcHRzL3Rvb2xiYXIuanMiKSklPiI+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IGNsYXNzPSJ0b29sYmFyYm9keW1hcmdpbiI+Ci08ZGl2IGlkPSJ0b29sYmFyYm9yZGVyIj4KLSAgPGRpdiBpZD0idG9vbGJhciIgb25kYmxjbGljaz0icHJvY2Vzc0ZyYW1lc2V0U2l6ZXMoZG9jdW1lbnQuZm9ybXNbMF0pIj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUFjdGlvbiIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gIGZvcm1BY3Rpb24uYXBwZW5kKCJ3c2lsL2FjdGlvbnMvUmVzaXplV1NJTEZyYW1lc0FjdGlvbkpTUC5qc3AiKTsKLSU+ICAKLTwvanNwOnVzZUJlYW4+Ci08anNwOnVzZUJlYW4gaWQ9ImZvcm1GcmFtZU5hbWUiIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIiBzY29wZT0icmVxdWVzdCI+Ci08JQotICAgZm9ybUZyYW1lTmFtZS5hcHBlbmQoV3NpbEZyYW1lTmFtZXMuV1NJTF9QUk9QRVJUSUVTX0NPTlRBSU5FUik7Ci0lPgotPC9qc3A6dXNlQmVhbj4KLTxqc3A6aW5jbHVkZSBwYWdlPSIvd3NpbC9mb3Jtcy9Qcm9jZXNzV1NJTEZyYW1lc2V0c0Zvcm0uanNwIiBmbHVzaD0idHJ1ZSIvPgotICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgaGVpZ2h0PTI1IGNlbGxwYWRkaW5nPTAgY2VsbHNwYWNpbmc9MCBib3JkZXI9MD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGltZyBjbGFzcz0ibm9ybWFsIiBzcmM9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2FjdGlvbnMuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmICh3c2lsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgIHsKLSAgICAgaWYgKHdzaWxQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkuc3RhcnRzV2l0aCgiMTAwJSIpKQotICAgICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fUkVTVE9SRSIpOwotICAgfQotICAgaWYgKGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPT0gbnVsbCkKLSAgICAgZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSA9IGNvbnRyb2xsZXIuZ2V0TWVzc2FnZSgiQUxUX0RPVUJMRV9DTElDS19UT19NQVhJTUlaRSIpOwotJT4gICAgICAgIAotICAgICAgICA8dGQgaWQ9ImRvdWJsZWNsaWNrY29sdW1uIiB0aXRsZT0iPCU9ZG91YmxlQ2xpY2tDb2x1bW5UaXRsZSU+IiB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImxlZnQiIHdpZHRoPSIqIiBoZWlnaHQ9MjUgbm93cmFwIGNsYXNzPSJ0ZXh0Ij48JT1jb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9BQ1RJT05TIiklPjwvdGQ+Ci08JQotICAgIE5vZGVNYW5hZ2VyIG5vZGVNYW5hZ2VyID0gd3NpbFBlcnNwZWN0aXZlLmdldE5vZGVNYW5hZ2VyKCk7Ci0gICAgTm9kZSBzZWxlY3RlZE5vZGUgPSBub2RlTWFuYWdlci5nZXRTZWxlY3RlZE5vZGUoKTsKLSAgICBpZiAoc2VsZWN0ZWROb2RlICE9IG51bGwpIHsKLSAgICAgICAgVG9vbE1hbmFnZXIgdG9vbE1hbmFnZXI7Ci0gICAgICAgIGlmIChzZWxlY3RlZE5vZGUuZ2V0Vmlld0lkKCkgPT0gQWN0aW9uSW5wdXRzLlZJRVdJRF9ERUZBVUxUKQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0VG9vbE1hbmFnZXIoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdG9vbE1hbmFnZXIgPSBzZWxlY3RlZE5vZGUuZ2V0Vmlld1Rvb2xNYW5hZ2VyKCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPHRvb2xNYW5hZ2VyLmdldE51bWJlck9mVG9vbHMoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUb29sIHRvb2wgPSAoVG9vbCl0b29sTWFuYWdlci5nZXRUb29sKGkpOwotICAgICAgICAgICAgJT4KLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PCU9dG9vbC5yZW5kZXJUb29sKHJlc3BvbnNlLGNvbnRyb2xsZXIpJT48L3RkPgotICAgICAgICAgICAgPCUKLSAgICAgICAgfQotICAgIH0KLSU+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9zdGF0dXNfY29udGFpbmVyLmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3N0YXR1c19jb250YWluZXIuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDgzNGM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3N0YXR1c19jb250YWluZXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX0NPTlRBSU5FUiIpJT48L3RpdGxlPgotPC9oZWFkPgotPGZyYW1lc2V0IHJvd3M9IjMzLCoiIGJvcmRlcj0wIGJnY29sb3I9IiNFQ0U5RDgiPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9TVEFUVVNfVE9PTEJBUiU+IiB0aXRsZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19UT09MQkFSIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfc3RhdHVzX3Rvb2xiYXIuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotICA8ZnJhbWUgbmFtZT0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9TVEFUVVNfQ09OVEVOVCU+IiB0aXRsZT0iPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPiIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoIndzaWxfc3RhdHVzX2NvbnRlbnQuanNwIiklPiIgbm9yZXNpemUgc2Nyb2xsaW5nPSJubyIgZnJhbWVib3JkZXI9MCBtYXJnaW53aWR0aD0wIG1hcmdpbmhlaWdodD0wPgotPC9mcmFtZXNldD4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3dzZXhwbG9yZXIvd3NpbC93c2lsX3N0YXR1c19jb250ZW50LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiNzE5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9zdGF0dXNfY29udGVudC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08JQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotJT4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiIGltcG9ydD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLndzaWwucGVyc3BlY3RpdmUuKiIgJT4KLQotPGpzcDp1c2VCZWFuIGlkPSJjb250cm9sbGVyIiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4cGxvcmVyLnBsYXRmb3JtLnBlcnNwZWN0aXZlLkNvbnRyb2xsZXIiIHNjb3BlPSJzZXNzaW9uIi8+Ci08JQotICAgV1NJTFBlcnNwZWN0aXZlIHdzaWxQZXJzcGVjdGl2ZSA9IGNvbnRyb2xsZXIuZ2V0V1NJTFBlcnNwZWN0aXZlKCk7Ci0lPiAgIAotPGh0bWw+Ci08aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotICA8dGl0bGU+PCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2UoIkZSQU1FX1RJVExFX1NUQVRVU19DT05URU5UIiklPjwvdGl0bGU+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IjwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiY3NzL3dpbmRvd3MuY3NzIikpJT4iPgotPC9oZWFkPgotPGJvZHkgY2xhc3M9ImNvbnRlbnRib2R5bWFyZ2luIj4KLTxkaXYgaWQ9ImNvbnRlbnRib3JkZXIiPgotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRkPgotICAgICAgICA8cHJlPgotPCU9d3NpbFBlcnNwZWN0aXZlLmdldE1lc3NhZ2VRdWV1ZSgpLmdldE1lc3NhZ2VzRnJvbUxpc3QoKSU+Ci0gICAgICAgIDwvcHJlPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9zdGF0dXNfdG9vbGJhci5qc3AgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci93c2V4cGxvcmVyL3dzaWwvd3NpbF9zdGF0dXNfdG9vbGJhci5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMmQ0ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvd3NleHBsb3Jlci93c2lsL3dzaWxfc3RhdHVzX3Rvb2xiYXIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPCUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSU+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiBpbXBvcnQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLnBlcnNwZWN0aXZlLiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2lsLmNvbnN0YW50cy4qIiAlPgotCi08anNwOnVzZUJlYW4gaWQ9ImNvbnRyb2xsZXIiIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGxhdGZvcm0ucGVyc3BlY3RpdmUuQ29udHJvbGxlciIgc2NvcGU9InNlc3Npb24iLz4KLTwlCi0gICBXU0lMUGVyc3BlY3RpdmUgd3NpbFBlcnNwZWN0aXZlID0gY29udHJvbGxlci5nZXRXU0lMUGVyc3BlY3RpdmUoKTsKLSU+ICAgCi08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0gIDx0aXRsZT48JT13c2lsUGVyc3BlY3RpdmUuZ2V0TWVzc2FnZSgiRlJBTUVfVElUTEVfU1RBVFVTX1RPT0xCQVIiKSU+PC90aXRsZT4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJjc3MvdG9vbGJhci5jc3MiKSklPiI+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvc2NyaXB0cy93c2lsZnJhbWVzZXRzLmpzcCIgZmx1c2g9InRydWUiLz4gIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoInNjcmlwdHMvdG9vbGJhci5qcyIpKSU+Ij4KLTwvc2NyaXB0PgotPC9oZWFkPgotPGJvZHkgY2xhc3M9InRvb2xiYXJib2R5bWFyZ2luIj4KLTxkaXYgaWQ9InRvb2xiYXJib3JkZXIiPgotICA8ZGl2IGlkPSJ0b29sYmFyIiBvbmRibGNsaWNrPSJwcm9jZXNzRnJhbWVzZXRTaXplcyhkb2N1bWVudC5mb3Jtc1swXSkiPgotPGpzcDp1c2VCZWFuIGlkPSJmb3JtQWN0aW9uIiBjbGFzcz0iamF2YS5sYW5nLlN0cmluZ0J1ZmZlciIgc2NvcGU9InJlcXVlc3QiPgotPCUKLSAgZm9ybUFjdGlvbi5hcHBlbmQoIndzaWwvYWN0aW9ucy9SZXNpemVXU0lMRnJhbWVzQWN0aW9uSlNQLmpzcCIpOwotJT4gIAotPC9qc3A6dXNlQmVhbj4KLTxqc3A6dXNlQmVhbiBpZD0iZm9ybUZyYW1lTmFtZSIgY2xhc3M9ImphdmEubGFuZy5TdHJpbmdCdWZmZXIiIHNjb3BlPSJyZXF1ZXN0Ij4KLTwlCi0gICBmb3JtRnJhbWVOYW1lLmFwcGVuZChXc2lsRnJhbWVOYW1lcy5XU0lMX1NUQVRVU19DT05UQUlORVIpOwotJT4KLTwvanNwOnVzZUJlYW4+Ci08anNwOmluY2x1ZGUgcGFnZT0iL3dzaWwvZm9ybXMvUHJvY2Vzc1dTSUxGcmFtZXNldHNGb3JtLmpzcCIgZmx1c2g9InRydWUiLz4KLSAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0yNSBjZWxscGFkZGluZz0wIGNlbGxzcGFjaW5nPTAgYm9yZGVyPTA+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgd2lkdGg9MjUgaGVpZ2h0PTI1PjxpbWcgY2xhc3M9Im5vcm1hbCIgc3JjPSI8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9zdGF0dXMuZ2lmIikpJT4iIHdpZHRoPTE2IGhlaWdodD0xNj48L3RkPgotPCUKLSAgIFN0cmluZyBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gbnVsbDsKLSAgIGlmICh3c2lsUGVyc3BlY3RpdmUuZ2V0UGVyc3BlY3RpdmVDb250ZW50RnJhbWVzZXRDb2xzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgIHsKLSAgICAgaWYgKHdzaWxQZXJzcGVjdGl2ZS5nZXRBY3Rpb25zQ29udGFpbmVyRnJhbWVzZXRSb3dzKCkuZW5kc1dpdGgoIjEwMCUiKSkKLSAgICAgICBkb3VibGVDbGlja0NvbHVtblRpdGxlID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfRE9VQkxFX0NMSUNLX1RPX1JFU1RPUkUiKTsKLSAgIH0KLSAgIGlmIChkb3VibGVDbGlja0NvbHVtblRpdGxlID09IG51bGwpCi0gICAgIGRvdWJsZUNsaWNrQ29sdW1uVGl0bGUgPSBjb250cm9sbGVyLmdldE1lc3NhZ2UoIkFMVF9ET1VCTEVfQ0xJQ0tfVE9fTUFYSU1JWkUiKTsKLSU+ICAgICAgICAKLSAgICAgICAgPHRkIGlkPSJkb3VibGVjbGlja2NvbHVtbiIgdGl0bGU9IjwlPWRvdWJsZUNsaWNrQ29sdW1uVGl0bGUlPiIgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJsZWZ0IiB3aWR0aD0iKiIgaGVpZ2h0PTI1IG5vd3JhcCBjbGFzcz0idGV4dCI+PCU9Y29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfU1RBVFVTIiklPjwvdGQ+Ci08JQotICAgU3RyaW5nIGFsdENsZWFyID0gY29udHJvbGxlci5nZXRNZXNzYWdlKCJBTFRfQ0xFQVIiKTsKLSU+ICAgICAgICAgICAKLSAgICAgICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiB3aWR0aD0yNSBoZWlnaHQ9MjU+PGEgaHJlZj0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJ3c2lsL3dzaWxfc3RhdHVzX2NvbnRlbnQuanNwIikpJT4iIHRhcmdldD0iPCU9V3NpbEZyYW1lTmFtZXMuV1NJTF9TVEFUVVNfQ09OVEVOVCU+Ij48aW1nIGNsYXNzPSJub3JtYWwiIHNyYz0iPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPiIgd2lkdGg9MTYgaGVpZ2h0PTE2IG9uTW91c2VPdmVyPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZW92ZXIodGhpcykiIG9uTW91c2VPdXQ9InNyYz0nPCU9cmVzcG9uc2UuZW5jb2RlVVJMKGNvbnRyb2xsZXIuZ2V0UGF0aFdpdGhDb250ZXh0KCJpbWFnZXMvY2xlYXJfZW5hYmxlZC5naWYiKSklPic7bW91c2VvdXQodGhpcykiIG9uTW91c2VEb3duPSJzcmM9JzwlPXJlc3BvbnNlLmVuY29kZVVSTChjb250cm9sbGVyLmdldFBhdGhXaXRoQ29udGV4dCgiaW1hZ2VzL2NsZWFyX2hpZ2hsaWdodGVkLmdpZiIpKSU+Jzttb3VzZWRvd24odGhpcykiIG9uTW91c2VVcD0ic3JjPSc8JT1yZXNwb25zZS5lbmNvZGVVUkwoY29udHJvbGxlci5nZXRQYXRoV2l0aENvbnRleHQoImltYWdlcy9jbGVhcl9lbmFibGVkLmdpZiIpKSU+Jzttb3VzZXVwKHRoaXMpIiBhbHQ9IjwlPWFsdENsZWFyJT4iIHRpdGxlPSI8JT1hbHRDbGVhciU+Ij48L2E+PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4MDJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi13c3VpLmphcgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTQ4N2QyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOGMwZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53cy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHdzdWkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC51aS53c3J0LAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4sCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLndzdC53cy51aQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLAotIG9yZy5lY2xpcHNlLndzdC53cwotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Q2MzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1zb3VyY2Uud3N1aS5qYXIgPSBzcmMvCi1vdXRwdXQud3N1aS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHdzdWkuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMDgzZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgVUkKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1QTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1dTST1XUy1JIENvbXBsaWFuY2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1OWQwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAJPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUExVR0lOX05FV19DQVRFR09SWV9OQU1FX1dTIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5XZWJTZXJ2aWNlc1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIAotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX1dTSSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLldTSUNvbXBsaWFuY2VQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLldTSUNvbXBsaWFuY2VQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBuYW1lPSIlUFJFRkVSRU5DRV9DQVRFR09SWV9XU0kiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzLldTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzLldTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgbmFtZT0ibmF0dXJlIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbmFtZT0iJVBSRUZFUkVOQ0VfQ0FURUdPUllfV1NJIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJvcGVydGllcy5XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJvcGVydGllcy5XU0lDb21wbGlhbmNlUHJvcGVydHlQYWdlIj4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG5hbWU9Im5hdHVyZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLSAgICAgICAgIDwvZmlsdGVyPgotICAgICAgPC9wYWdlPgotCi0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC91aS93c3J0L0lPYmplY3RTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC91aS93c3J0L0lPYmplY3RTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmUwNTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdWkvd3NydC9JT2JqZWN0U2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwudWkud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JU2VsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RTZWxlY3RvciB7Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbCk7Ci0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCk7Ci0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCk7Ci0JcHVibGljIFN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbCk7Ci0JcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3BsdWdpbi9XU1VJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3BsdWdpbi9XU1VJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Zjc3OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wbHVnaW4vV1NVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQVBDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJU1NCUENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLS8qKgotKiBUaGlzIGlzIHRoZSBwbHVnaW4gY2xhc3MgZm9yIHRoZSBXZWIgU2VydmljZXMgcGx1Z2luLgotKiA8cD4KLSogVGhpcyBwbHVnaW4gY29udGFpbnMgdGhlIGdyYXBoaWMgdXNlciBpbnRlcmZhY2UgdG8gdGhlCi0qIFdlYiBTZXJ2aWNlcyBydW50aW1lIGZvdW5kIGluIG9yZy5lY2xpcHNlLmpzdC53cy4KLSovCi1wdWJsaWMgY2xhc3MgV1NVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQkvLyBDb3B5cmlnaHQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPQotCQkiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gLyoqCi0gKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgZGVzY3JpcHRvciBvZiB0aGlzIHBsdWdpbiBpbiBwbHVnaW4ueG1sLgotICovCi0gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzLnVpIjsKLQotIC8qKgotICogVGhlIHJlZmVyZW5jZSB0byB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLgotICovCi0gcHJpdmF0ZSBzdGF0aWMgV1NVSVBsdWdpbiBpbnN0YW5jZV87Ci0KLSBwcml2YXRlIFBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dCB3c2lTU0JQQ29udGV4dF87Ci0gcHJpdmF0ZSBQZXJzaXN0ZW50V1NJQVBDb250ZXh0IHdzaUFQQ29udGV4dF87Ci0gcHJpdmF0ZSBMb2cgbG9nXzsKLSAKLSAvKioKLSAgKiBDb25zdHJ1Y3RzIGEgcnVudGltZSBwbHVnaW4gb2JqZWN0IGZvciB0aGlzIHBsdWdpbi4KLSAgKi8KLSBwdWJsaWMgV1NVSVBsdWdpbigpIHsKLQlzdXBlcigpOwotCWluc3RhbmNlXyA9IHRoaXM7Ci0gfQotCi0gLyoqCi0gKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uIEVxdWl2YWxlbnQgdG8gY2FsbGluZwotICogKFdTVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS53c3Qud3MudWkiKTsKLSAqIEByZXR1cm4gVGhlIFdTVUlQbHVnaW4gc2luZ2xldG9uLgotICovCi0gc3RhdGljIHB1YmxpYyBXU1VJUGx1Z2luIGdldEluc3RhbmNlKCkgewotICAgcmV0dXJuIGluc3RhbmNlXzsKLSB9Ci0KLQkvKioKLQkgKiBHZXQgV1NJIENvbnRleHQKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0V1NJU1NCUENvbnRleHQgb3IgZ2V0V1NJQVBDb250ZXh0IGluc3RlYWQKLQkgKiAKLQkgKi8gCi0gcHVibGljIFBlcnNpc3RlbnRXU0lDb250ZXh0IGdldFdTSUNvbnRleHQoKSAKLSAJeyAvLyBkZWZhdWx0aW5nIHRvIGdldCBXU0kgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlIGNvbnRleHQKLSAJICByZXR1cm4gZ2V0V1NJU1NCUENvbnRleHQoKTsKLSAJfQotIAotIC8qKgotCSAqIEdldCBXU0kgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlIENvbnRleHQKLQkgKiAKLQkgKi8gCi0gcHVibGljIFBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dCBnZXRXU0lTU0JQQ29udGV4dCgpIAotCXsKLQkgIGlmICh3c2lTU0JQQ29udGV4dF8gPT0gbnVsbCkKLQkgIAl7Ci0JICAJCXdzaVNTQlBDb250ZXh0XyA9IG5ldyBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQoKTsKLQkgIAkJd3NpU1NCUENvbnRleHRfLmxvYWQoKTsKLQkgIAl9Ci0JICByZXR1cm4gd3NpU1NCUENvbnRleHRfOwotCX0KLSAKLSAvKioKLQkgKiBHZXQgV1NJIEF0dGFjaG1lbnQgUHJvZmlsZSBDb250ZXh0Ci0JICogCi0JICovIAotIHB1YmxpYyBQZXJzaXN0ZW50V1NJQVBDb250ZXh0IGdldFdTSUFQQ29udGV4dCgpIAotCXsKLQkgIGlmICh3c2lBUENvbnRleHRfID09IG51bGwpCi0JICAJewotCSAgCQl3c2lBUENvbnRleHRfID0gbmV3IFBlcnNpc3RlbnRXU0lBUENvbnRleHQoKTsKLQkgIAkJd3NpQVBDb250ZXh0Xy5sb2FkKCk7Ci0JICAJfQotCSAgcmV0dXJuIHdzaUFQQ29udGV4dF87Ci0JfQotCi0gLyoqCi0gKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHN0cmluZyBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbQotICogdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuCi0gKiBAcGFyYW0ga2V5IFRoZSBtZXNzYWdlIGtleSBzdHJpbmcgcHJlZml4ZWQgYnkgYSAiJSIgc3ltYm9sLgotICogVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4gbXVzdCBiZSBvZiB0aGUgZm9ybSAiJUtFWSIKLSAqIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLSAqIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0gKiBAcmV0dXJuIFRoZSBsb2NhbGUtc3BlY2lmaWMgbWVzc2FnZS4KLSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIGtleSkgCi0JewotCSAgICBNZXNzYWdlVXRpbHMgbXNnVXRpbHMgPSBuZXcgTWVzc2FnZVV0aWxzKCAib3JnLmVjbGlwc2UuanN0LndzLnVpLnBsdWdpbiIsIGluc3RhbmNlXyApOwotCSAgICAKLQkgICAgaWYoIGtleS5zdGFydHNXaXRoKCIlIikpCi0JICAgIHsKLQkgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKCAxLCBrZXkubGVuZ3RoKCkgKTsKLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIG1zZ1V0aWxzLmdldE1lc3NhZ2Uoa2V5KTsKLSAgIH0KLQotIC8qKgotICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20KLSAqIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvciB0aGUgYXBwcm9wcmlhdGUgbG9jYWxlLgotICogU3Vic3RpdHV0aW9uIHNlcXVlbmNlcyBpbiB0aGUgbWVzc2FnZSBzdHJpbmcKLSAqIGFyZSByZXBsYWNlZCBieSB0aGUgZ2l2ZW4gYXJyYXkgb2Ygc3Vic3RpdHV0aW9uIG9iamVjdHMgKHdoaWNoCi0gKiBhcmUgbW9zdCBmcmVxdWVudGx5IHN0cmluZ3MpLiBTZWUgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgZm9yCi0gKiBmdXJ0aGVyIGRldGFpbHMgb24gc3Vic3RpdHV0aW9uLgotICogQHBhcmFtIGtleSBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4KLSAqIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiCi0gKiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0gKiBmb3JtOiAiS0VZID0gdmFsdWUiLgotICogQHBhcmFtIGFyZ3MgVGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMgZm9yIHRoZSBtZXNzYWdlCi0gKiBhcyByZXF1aXJlZCBieSB0aGUgbWVzc2FnZSBpbiBwbHVnaW4ucHJvcGVydGllcyBhbmQKLSAqIGJ5IHRoZSBydWxlcyBvZiBjbGFzcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC4KLSAqIEByZXR1cm4gVGhlIGxvY2FsZS1zcGVjaWZpYyBtZXNzYWdlLgotICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksIGFyZ3MpOwotIH0KLQotIC8qKgotICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgcmVzb3VyY2UKLSAqIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbCBsb2NhdGlvbi4KLSAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJVVJMIGluc3RhbGxVUkwgPSBpbnN0YW5jZV8uZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJCVVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgbmFtZSk7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaW1hZ2VVUkwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICByZXR1cm4gbnVsbDsKLSAgIH0KLSB9Ci0KLSBwdWJsaWMgU3RyaW5nIGdldFBsdWdpblN0YXRlTG9jYXRpb24oKSB7Ci0gICByZXR1cm4gUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbih0aGlzKS50b09TU3RyaW5nKCk7Ci0gfQotCi0gcHVibGljIFN0cmluZyBnZXRQbHVnaW5JbnN0YWxsTG9jYXRpb24oKSB7Ci0gICB0cnkgewotICAgICByZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShnZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpKS5nZXRGaWxlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9XZWJTZXJ2aWNlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1dlYlNlcnZpY2VzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlZTZiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1dlYlNlcnZpY2VzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFRoZSBXZWJTZXJ2aWNlc1ByZWZlcmVuY2VQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0vKioKLSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIFNXVCBjb250cm9sIGZvciB0aGUgY3VzdG9taXplZCBib2R5IAotICogb2YgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIHBhcmVudCBjb21wb3NpdGUuCi0gKiA8cD4KLSAqIFRoaXMgZnJhbWV3b3JrIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNvbmNyZXRlCi0gKiBzdWJjbGFzc2VzLgotICogPC9wPgotICoKLSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0gKi8KLXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSBwYXJlbnQpIHsKLQlyZXR1cm4gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLX0KLS8qKgotICogRG8gYW55IGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJ5IHRoZSBkZXNrdG9wLiBCeSBkZWZhdWx0IGRvIG5vdGhpbmcuCi0gKi8KLXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCBkZXNrdG9wKSB7fQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJQVBDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJQVBDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZjA0ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUFQQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFdTSUFQQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRXU0lDb250ZXh0Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9XU0lfQVBfQ09NUExJQU5DRSA9ICJub25XU0lBUENvbXBsaWFuY2UiOwotCi1wdWJsaWMgUGVyc2lzdGVudFdTSUFQQ29udGV4dCAoKSAKLXsKLQlzdXBlcigpOwotCW5vbl93c2lfY29tcGxpYW5jZSA9IE5PTl9XU0lfQVBfQ09NUExJQU5DRTsKLQluYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoV1NVSVBsdWdpbi5JRCAsIG5vbl93c2lfY29tcGxpYW5jZSk7Ci0Jd3NpV2FybmluZ18gPSAiV1NJX0FQX1dBUk5JTkciOwotCXdzaUVycm9yXyA9ICJXU0lfQVBfRVJST1IiOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlICgpCi17Ci0JU3RyaW5nIHByb3BlcnR5ID0gZ2V0VmFsdWVBc1N0cmluZyhub25fd3NpX2NvbXBsaWFuY2UpOwotCS8vIGRlZmF1bHQgdG8gSWdub3JlIGlmIG5vIGluaXQgaGFzIGJlZW4gZG9uZSBmcm9tIGluaSBmaWxlCi0JaWYgKHByb3BlcnR5ID09IG51bGwgfHwgcHJvcGVydHkuZXF1YWxzKCIiKSkgewotCQlzZXRWYWx1ZSggbm9uX3dzaV9jb21wbGlhbmNlLCBJR05PUkVfTk9OX1dTSSk7Ci0JCXJldHVybiBJR05PUkVfTk9OX1dTSTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gcHJvcGVydHk7Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFdTSUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlYjlhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5lY2xpcHNlLkVjbGlwc2VMb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkxvZzsKLQotCi0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50V1NJQ29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUF9OT05fV1NJID0gIjAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5fTk9OX1dTSSA9ICIxIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfTk9OX1dTSSA9ICIyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xMT1dfV1NJX1BSRUZFUkVOQ0UgPSAiMyI7Ci0KLQlwcm90ZWN0ZWQgUXVhbGlmaWVkTmFtZSBuYW1lID0gbnVsbDsgLy8gc2V0IGluIHN1YmNsYXNzCi0JcHJvdGVjdGVkIFN0cmluZyBub25fd3NpX2NvbXBsaWFuY2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9XU0lfU1NCUF9DT01QTElBTkNFID0gIm5vbldTSVNTQlBDb21wbGlhbmNlIjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHdzaVdhcm5pbmdfOyAvLyBzZXQgaW4gc3ViY2xhc3MKLQlwcm90ZWN0ZWQgU3RyaW5nIHdzaUVycm9yXzsgLy8gc2V0IGluIHN1YmNsYXNzCi0KLXB1YmxpYyBQZXJzaXN0ZW50V1NJQ29udGV4dCAoKSAKLXsKLQlzdXBlciggIFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSk7Ci0JCi0vLyAgTk9URTogIG5hbWUsIHdzaVdhcm5pbmdfIGFuZCB3c2lFcnJvcl8gc2hvdWxkIGJlIHNldCBpbiB0aGUgc3ViY2xhc3Nlcy4gIFRoaXMgaXMgcHJvdmlkaW5nIGRlZmF1bHRpbmcgb25seS4KLQlub25fd3NpX2NvbXBsaWFuY2UgPSBOT05fV1NJX1NTQlBfQ09NUExJQU5DRTsKLQluYW1lID0gbmV3IFF1YWxpZmllZE5hbWUoV1NVSVBsdWdpbi5JRCAsIG5vbl93c2lfY29tcGxpYW5jZSk7Ci0Jd3NpV2FybmluZ18gPSAiV1NJX1NTQlBfV0FSTklORyI7Ci0Jd3NpRXJyb3JfID0gIldTSV9TU0JQX0VSUk9SIjsKLX0KLQotcHVibGljIHZvaWQgbG9hZCgpIAotewotCS8vIGxldCB0aGUgZGVmYXVsdCBiZSByZWFkIGZyb20gcGx1Z2luX2Nvc3RvbWl6YXRpb24uaW5pIGZpbGUKLQkvLyBzZXREZWZhdWx0KG5vbl93c2lfY29tcGxpYW5jZSwgV0FSTl9OT05fV1NJKTsKLX0KLQotLy8gdG8gYmUgdXNlZCBvbmx5IGJ5IHRoZSBwcmVmZXJlbmNlIHBhZ2UKLXB1YmxpYyB2b2lkIHVwZGF0ZVdTSUNvbXBsaWFuY2VzICggU3RyaW5nIHZhbHVlKQotewotIAkJc2V0VmFsdWUoIG5vbl93c2lfY29tcGxpYW5jZSwgdmFsdWUpOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlICgpCi17Ci0JU3RyaW5nIHByb3BlcnR5ID0gZ2V0VmFsdWVBc1N0cmluZyhub25fd3NpX2NvbXBsaWFuY2UpOwotLy8JIGRlZmF1bHQgdG8gSWdub3JlIGlmIG5vIGluaXQgaGFzIGJlZW4gZG9uZSBmcm9tIGluaSBmaWxlCi0JaWYgKHByb3BlcnR5ID09IG51bGwgfHwgcHJvcGVydHkuZXF1YWxzKCIiKSkgewotCQlzZXRWYWx1ZSggbm9uX3dzaV9jb21wbGlhbmNlLCBJR05PUkVfTk9OX1dTSSk7Ci0JCXJldHVybiBJR05PUkVfTk9OX1dTSTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gcHJvcGVydHk7Ci19Ci0KLXB1YmxpYyBib29sZWFuIFN0b3BOb25XU0lDb21wbGlhbmNlcygpCi17Ci0JIHJldHVybiBTVE9QX05PTl9XU0kuZXF1YWxzKGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCkpOwotfQotCi1wdWJsaWMgYm9vbGVhbiBXYXJuTm9uV1NJQ29tcGxpYW5jZXMoKQotewotCSByZXR1cm4gV0FSTl9OT05fV1NJLmVxdWFscyhnZXRQZXJzaXN0ZW50V1NJQ29tcGxpYW5jZSgpKTsKLX0KLQotcHVibGljIGJvb2xlYW4gSWdub3JlTm9uV1NJQ29tcGxpYW5jZXMoKQotewotCSByZXR1cm4gSUdOT1JFX05PTl9XU0kuZXF1YWxzKGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCkpOwotfQotCi0vLyB0byBiZSB1c2VkIG9ubHkgYnkgdGhlIHByb3BlcnR5IHBhZ2UKLXB1YmxpYyB2b2lkIHVwZGF0ZVByb2plY3RXU0lDb21wbGlhbmNlcyAoIElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2YWx1ZSkKLXsKLSAgICB0cnkgewotCQlwcm9qZWN0LnNldFBlcnNpc3RlbnRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gc3VjaCBQcm9qZWN0Iik7Ci0gICAgCUxvZyBsb2cgPSBuZXcgRWNsaXBzZUxvZygpOwotICAgIAlsb2cubG9nKExvZy5JTkZPLCA1MDg0LCB0aGlzLCAidXBkYXRlUHJvamVjdFdTSUNvbXBsaWFuY2VzIiwgIk5vIHN1Y2ggUHJvamVjdCAiK3Byb2plY3QpOwotICAgIH0KLX0KLQotcHVibGljIGJvb2xlYW4gcHJvamVjdFN0b3BOb25XU0lDb21wbGlhbmNlcyhJUHJvamVjdCBwcm9qZWN0KQotewotIAlyZXR1cm4gU1RPUF9OT05fV1NJLmVxdWFscyhnZXRQcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5KHByb2plY3QpKTsgICAgCi19Ci0KLXB1YmxpYyBib29sZWFuIHByb2plY3RXYXJuTm9uV1NJQ29tcGxpYW5jZXMoSVByb2plY3QgcHJvamVjdCkKLXsKLSAJcmV0dXJuIFdBUk5fTk9OX1dTSS5lcXVhbHMoZ2V0UHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eShwcm9qZWN0KSk7ICAgIAotfQotCi1wdWJsaWMgYm9vbGVhbiBwcm9qZWN0SWdub3JlTm9uV1NJQ29tcGxpYW5jZXMoSVByb2plY3QgcHJvamVjdCkKLXsKLSAJcmV0dXJuIElHTk9SRV9OT05fV1NJLmVxdWFscyhnZXRQcm9qZWN0UGVyc2lzdGVudFByb3BlcnR5KHByb2plY3QpKTsgICAgCi19Ci0KLQotLy8gdG8gYmUgdXNlZCBvbmx5IGJ5IHRoZSBwcm9wZXJ0eSBwYWdlCi1wdWJsaWMgYm9vbGVhbiBwcm9qZWN0Rm9sbG93V1NJUHJlZmVyYW5jZShJUHJvamVjdCBwcm9qZWN0KQotewotICAgIHRyeSB7Ci0gCVN0cmluZyBwcm9wZXJ0eSA9IHByb2plY3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KG5hbWUpOwotICAgIHJldHVybiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5lcXVhbHMoIiIpIHx8IHByb3BlcnR5LmVxdWFscyhGT0xMT1dfV1NJX1BSRUZFUkVOQ0UpKTsKLSAgICAJfQotICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpICAgICB7Ci0gICAgCXJldHVybiB0cnVlOwotICAgICB9ICAgICAKLX0KLQotcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdFBlcnNpc3RlbnRQcm9wZXJ0eShJUHJvamVjdCBwcm9qZWN0KQotewotCVN0cmluZyBwcm9wZXJ0eSA9IGdldFByb2plY3RXU0lDb21wbGlhbmNlKHByb2plY3QpOwotCWlmIChwcm9wZXJ0eS5lcXVhbHMoRk9MTE9XX1dTSV9QUkVGRVJFTkNFKSkgewotCQlwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCk7Ci0JfQotCXJldHVybiBwcm9wZXJ0eTsKLSB9Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UoSVByb2plY3QgcHJvamVjdCkKLXsKLSAgdHJ5IHsKLSAgICAgCVN0cmluZyBwcm9wZXJ0eSA9IHByb2plY3QuZ2V0UGVyc2lzdGVudFByb3BlcnR5KG5hbWUpOwotICAgICAJaWYgKHByb3BlcnR5ID09IG51bGwgfHwgcHJvcGVydHkuZXF1YWxzKCIiKSkKLSAgICAgCXsKLSAgICAgCQlwcm9wZXJ0eSA9IEZPTExPV19XU0lfUFJFRkVSRU5DRTsKLSAgICAgCX0KLSAgICAgCXJldHVybiBwcm9wZXJ0eTsKLSAgICAgfQotICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSAgICAgewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHN1Y2ggUHJvamVjdCIpOwotICAgIAlyZXR1cm4gZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKTsKLSAgICAgfSAgICAgCi19Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0V2FybmluZygpCi17Ci0JcmV0dXJuIHdzaVdhcm5pbmdfOwotfQotCi1wdWJsaWMgU3RyaW5nIGdldEVycm9yKCkKLXsKLQlyZXR1cm4gd3NpRXJyb3JfOwotfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50V1NJU1NCUENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lTU0JQQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGI0MzJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRXU0lTU0JQQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0IGV4dGVuZHMgUGVyc2lzdGVudFdTSUNvbnRleHQKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX1dTSV9TU0JQX0NPTVBMSUFOQ0UgPSAibm9uV1NJU1NCUENvbXBsaWFuY2UiOwotCi1wdWJsaWMgUGVyc2lzdGVudFdTSVNTQlBDb250ZXh0ICgpIAotewotCXN1cGVyKCk7Ci0Jbm9uX3dzaV9jb21wbGlhbmNlID0gTk9OX1dTSV9TU0JQX0NPTVBMSUFOQ0U7Ci0JbmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKFdTVUlQbHVnaW4uSUQgLCBub25fd3NpX2NvbXBsaWFuY2UpOwotCXdzaVdhcm5pbmdfID0gIldTSV9TU0JQX1dBUk5JTkciOwotCXdzaUVycm9yXyA9ICJXU0lfU1NCUF9FUlJPUiI7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3ByZWZlcmVuY2VzL1dTSUNvbXBsaWFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvV1NJQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZWM5YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvV1NJQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotCi0KLQotcHVibGljIGNsYXNzIFdTSUNvbXBsaWFuY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLCBTZWxlY3Rpb25MaXN0ZW5lcgotCi17Ci0gIHByaXZhdGUgTWVzc2FnZVV0aWxzIG1zZ1V0aWxzXzsKLQkgIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDEgZm9yIHRoZSBXUy1JIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9QQUdFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDAiOwotICAvLwotCi0gIHByaXZhdGUgTGFiZWwgd3NpX3NzYnBfTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHdzaV9zc2JwX1R5cGVzXzsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMSBmb3IgdGhlIHN0b3AgV1MtSSBTU0JQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX1NUT1BfTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDAxIjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDAyIGZvciB0aGUgd2FybiBXUy1JIFNTQlAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fV0FSTl9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDIiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDMgZm9yIHRoZSBpZ25vcmUgV1MtSSBTU0JQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9TU0JQX0NPTUJPX0lHTk9SRV9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDMiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDQgZm9yIHRoZSBXUy1JIFNTQlAgdHlwZSBjb21ibyBib3ggb24gdGhlIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fVFlQRSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA0IjsKLSAgCi0gIHByaXZhdGUgTGFiZWwgd3NpX2FwX0xhYmVsXzsKLSAgcHJpdmF0ZSBDb21ibyB3c2lfYXBfVHlwZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBXU0kwMDA1IGZvciB0aGUgc3RvcCBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19TVE9QX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwNSI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNiBmb3IgdGhlIHdhcm4gV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfQVBfQ09NQk9fV0FSTl9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDYiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDcgZm9yIHRoZSBpZ25vcmUgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfQVBfQ09NQk9fSUdOT1JFX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwNyI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwOCBmb3IgdGhlIFdTLUkgQVAgdHlwZSBjb21ibyBib3ggb24gdGhlIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1RZUEUgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwOCI7Ci0gICAgCi0gIHByaXZhdGUgaW50IHNhdmVkU1NCUFNldHRpbmdfID0gLTE7Ci0KLQotIC8qKgotICAgKiBDcmVhdGVzIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyBvbiBkZW1hbmQuCi0gICAqICAgQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHN1cGVycGFyZW50KQotICB7Ci0gIAlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2Uud3N0LndzLnVpIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotICAgIAotICAgIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkKLSAgICBDb21wb3NpdGUgICBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKCBzdXBlcnBhcmVudCwgU1dULk5PTkUgKTsJCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0KCBsYXlvdXQgKTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX1BBR0UiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCxJTkZPUE9QX1BXU0lfUEFHRSk7Ci0KLSAgICBHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBnbC5udW1Db2x1bW5zID0gMjsKLSAgICBnbC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGdsLm1hcmdpbldpZHRoID0gMDsKLQotICAgIENvbXBvc2l0ZSB3c2lfQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSAocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgd3NpX0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ2wpOwotICAgIHdzaV9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIAotICAgIHdzaV9hcF9MYWJlbF8gPSBuZXcgTGFiZWwod3NpX0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHdzaV9hcF9MYWJlbF8uc2V0VGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiTEFCRUxfV1NJX0FQIikpOwotICAgIHdzaV9hcF9MYWJlbF8uc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9BUF9MQUJFTCIpKTsKLSAgICB3c2lfYXBfVHlwZXNfID0gbmV3IENvbWJvKHdzaV9Db21wb3NpdGUsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfQVBfQ09NQk8iKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHdzaV9hcF9UeXBlc18sSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1RZUEUpOwotICAgIAotICAgIHdzaV9hcF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJTVE9QX05PTl9XU0kiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIldBUk5fTk9OX1dTSSIpKTsKLSAgICB3c2lfYXBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX05PTl9XU0kiKSk7Ci0gICAgCi0gICAgd3NpX2FwX1R5cGVzXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICB3c2lfc3NicF9MYWJlbF8gPSBuZXcgTGFiZWwod3NpX0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHdzaV9zc2JwX0xhYmVsXy5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9XU0lfU1NCUCIpKTsKLSAgICB3c2lfc3NicF9MYWJlbF8uc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9TU0JQX0xBQkVMIikpOwotICAgIHdzaV9zc2JwX1R5cGVzXyA9IG5ldyBDb21ibyh3c2lfQ29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICB3c2lfc3NicF9UeXBlc18uc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9TU0JQX0NPTUJPIikpOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh3c2lfc3NicF9UeXBlc18sSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fVFlQRSk7Ci0gICAgCi0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiU1RPUF9OT05fV1NJIikpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIldBUk5fTk9OX1dTSSIpKTsKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTk9OX1dTSSIpKTsKLSAgCi0gICAgaW5pdGlhbGl6ZVZhbHVlcygpOwotICAgIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzdXBlcnBhcmVudCk7ICAgIAotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0KLQotICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbiggQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQgKQotICB7Ci0gICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPICk7Ci0gICAgYnV0dG9uLnNldFRleHQoIHRleHQgKTsKLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIERvZXMgYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGRlZmF1bHQgYnV0dG9uIGhhcyBiZWVuIHByZXNzZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKQotICB7Ci0gICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgaW5pdGlhbGl6ZURlZmF1bHRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogRG8gYW55dGhpbmcgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIE9LIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKiAgQHJldHVybiB3aGV0aGVyIGl0IGlzIG9rYXkgdG8gY2xvc2UgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLSAgewotICAgIHN0b3JlVmFsdWVzKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKQotICB7Ci0gICAgcGVyZm9ybU9rKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpICAgeyB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIC8vIGZvcmNlIFdTSSBjb21wbGlhbmNlIGJ5IGRlZmF1bHQKLSAgICAKLSAgICB3c2lfc3NicF9UeXBlc18uc2VsZWN0KHdzaV9zc2JwX1R5cGVzXy5pbmRleE9mKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTk9OX1dTSSIpKSk7Ci0gICAgaW50IGFwU2VsZWN0aW9uID0gd3NpX2FwX1R5cGVzXy5pbmRleE9mKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTk9OX1dTSSIpKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNlbGVjdChhcFNlbGVjdGlvbik7Ci0gICAgc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsgIC8vIGRvIG5vdCByZXN0b3JlIHNhdmVkIFNTQlAgc2V0dGluZwotICAgIHByb2Nlc3NBUFNlbGVjdGlvbihhcFNlbGVjdGlvbik7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpCi0gIHsKLSAgICAKLQlTdHJpbmcgV1NJVGV4dCA9IGdldFdTSVNlbGVjdGlvbihXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNlbGVjdCh3c2lfc3NicF9UeXBlc18uaW5kZXhPZihXU0lUZXh0KSk7Ci0gICAgCi0gICAgaW50IGFwU2VsZWN0aW9uID0gd3NpX2FwX1R5cGVzXy5pbmRleE9mKGdldFdTSVNlbGVjdGlvbihXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJQVBDb250ZXh0KCkpKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNlbGVjdChhcFNlbGVjdGlvbik7Ci0gICAgc2F2ZWRTU0JQU2V0dGluZ18gPSAtMTsgIC8vIGRvIG5vdCByZXN0b3JlIHNhdmVkIFNTQlAgc2V0dGluZwotICAgIHByb2Nlc3NBUFNlbGVjdGlvbihhcFNlbGVjdGlvbik7Ci0gICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0V1NJU2VsZWN0aW9uKFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpCi0gIHsKLSAgICAKLSAgICBTdHJpbmcgV1NJdmFsdWUgPSBjb250ZXh0LmdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCk7Ci0gICAgU3RyaW5nIFdTSVRleHQgPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiV0FSTl9OT05fV1NJIik7Ci0gICAgaWYgKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSS5lcXVhbHMoV1NJdmFsdWUpKSB7Ci0JCVdTSVRleHQgPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiU1RPUF9OT05fV1NJIik7Ci0JfSBlbHNlIGlmIChQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSS5lcXVhbHMoV1NJdmFsdWUpKSB7Ci0JCVdTSVRleHQgPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX05PTl9XU0kiKTsKLQl9Ci0JcmV0dXJuIFdTSVRleHQ7Ci0gIH0KLSAgLyoqCi0gICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkKLSAgewotICAJdXBkYXRlV1NJQ29udGV4dCh3c2lfc3NicF9UeXBlc18uZ2V0U2VsZWN0aW9uSW5kZXgoKSwgV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCkpOwotICAJdXBkYXRlV1NJQ29udGV4dCh3c2lfYXBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCksIFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lBUENvbnRleHQoKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVXU0lDb250ZXh0KGludCBzZWxlY3Rpb25JbmRleCwgUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkKLSAgewotICAgIC8vIGdldCB0aGUgcGVyc2lzdGVudCBjb250ZXh0IGZyb20gdGhlIHBsdWdpbgotICAgIAotICAgIFN0cmluZyB2YWx1ZT1udWxsOwotICAgIHN3aXRjaCAoc2VsZWN0aW9uSW5kZXgpIHsKLSAgICAJY2FzZSAwOgotICAgIAkJdmFsdWUgPSBQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0k7Ci0gICAgCQlicmVhazsKLSAgICAJY2FzZSAxOgotICAgIAkJdmFsdWUgPSBQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0k7Ci0gICAgCQlicmVhazsKLSAgICAJY2FzZSAyOgotICAgIAkJdmFsdWUgPSBQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSTsJCQotICAgIAkJYnJlYWs7Ci0gICAgfQotICAgIGNvbnRleHQudXBkYXRlV1NJQ29tcGxpYW5jZXModmFsdWUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gIAkKLSAgCXByb2Nlc3NBUFNlbGVjdGlvbiggd3NpX2FwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpICk7Ci0gIAkKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvY2Vzc0FQU2VsZWN0aW9uKGludCBzZWxlY3Rpb24pIHsKLSAgCWlmIChzZWxlY3Rpb24gPT0gMikgeyAvLyByZXNldCBTU0JQIHRvIGRlZmF1bHQgaWYgQVAgaXMgaWdub3JlCi0gIAkJd3NpX3NzYnBfVHlwZXNfLnNldEVuYWJsZWQodHJ1ZSk7Ci0gIAkJaWYgKHNhdmVkU1NCUFNldHRpbmdfICE9IC0xKSAgewotICAJCQkvLyByZXN0b3JlIHNhdmVkIFNTQlAgc2V0dGluZywgaWYgYW55Ci0gIAkJCXdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qoc2F2ZWRTU0JQU2V0dGluZ18pOwotICAJCQlzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOwotICAJCX0KLSAgCX0gZWxzZSB7IC8vIHNldCBTU0JQIHRvIGZvbGxvdyBBUCBzZXR0aW5nIGlmIFNUT1Agb3IgV0FSTiBjaG9zZW4KLSAgCQlpZiAoc2F2ZWRTU0JQU2V0dGluZ18gPT0gLTEpICB7ICAvLyBTU0JQIHNldHRpbmcgbm90IHNhdmVkCi0gIAkJCXNhdmVkU1NCUFNldHRpbmdfID0gd3NpX3NzYnBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gIAkJfQotICAJCXdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qoc2VsZWN0aW9uKTsKLSAgCQl3c2lfc3NicF9UeXBlc18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gIAkJCi0gIAl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC91aS93c2kvcHJlZmVyZW5jZXMvV1NJQ29tcGxpYW5jZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9XU0lDb21wbGlhbmNlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlMDdkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcmVmZXJlbmNlcy9XU0lDb21wbGlhbmNlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5NZXNzYWdlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBXU0lDb21wbGlhbmNlVXRpbHMKLXsKLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJR05PUkVfSUQgPTA7Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUdOT1JFX0FMTF9JRCA9MTsKLXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQU5DRUxfSUQgPTI7Ci0KLXByaXZhdGUgc3RhdGljIE1lc3NhZ2VVdGlscyBtc2dVdGlsc187Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIGdldFdTSVNldmVyaXR5IChJUHJvamVjdCBwcm9qZWN0LCBQZXJzaXN0ZW50V1NJQ29udGV4dCBjb250ZXh0KSBpbnN0ZWFkCi0gKiBAcGFyYW0gcHJvamVjdAotICogQHJldHVybiBpbnQKLSAqLwotcHVibGljIHN0YXRpYyBpbnQgZ2V0V1NJU2V2ZXJpdHkgKElQcm9qZWN0IHByb2plY3QpCi17Ci0JcmV0dXJuIGdldFdTSVNldmVyaXR5IChwcm9qZWN0LCBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJU1NCUENvbnRleHQoKSk7Ci19Ci0vKioKLSAqIEBwYXJhbSBwcm9qZWN0Ci0gKiBAcGFyYW0gY29udGV4dAotICogQHJldHVybgotICovCi1wdWJsaWMgc3RhdGljIGludCBnZXRXU0lTZXZlcml0eSAoSVByb2plY3QgcHJvamVjdCwgUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkKLXsKLQlpZiAoY29udGV4dC5wcm9qZWN0U3RvcE5vbldTSUNvbXBsaWFuY2VzKHByb2plY3QpKQotCQlyZXR1cm4gU3RhdHVzLkVSUk9SOwotCWVsc2UgaWYgKGNvbnRleHQucHJvamVjdFdhcm5Ob25XU0lDb21wbGlhbmNlcyhwcm9qZWN0KSkKLQkJcmV0dXJuIFN0YXR1cy5XQVJOSU5HOwotCWVsc2UKLQkJcmV0dXJuIFN0YXR1cy5JTkZPOwotfQotCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSBjaGVja1dTSUNvbXBsaWFuY2UgKCBTdGF0dXNIYW5kbGVyIG1vbml0b3IsIFN0YXR1c1tdIHN0YXR1cywgSVByb2plY3QgcHJvamVjdCwgUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkgaW5zdGVhZAotICogQHBhcmFtIG1vbml0b3IgU3RhdHVzSGFuZGxlcgotICogQHBhcmFtIHN0YXR1cyBTdGF0dXNbXQotICogQHBhcmFtIHByb2plY3QgSVByb2plY3QKLSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRvIGNvbnRpbnVlCi0gKi8KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1dTSUNvbXBsaWFuY2UgKCBTdGF0dXNIYW5kbGVyIG1vbml0b3IsIFN0YXR1c1tdIHN0YXR1cywgSVByb2plY3QgcHJvamVjdCkKLXsJLy8gY2hlY2sgZm9yIFNTQlAgYnkgZGVmYXVsdAotCXJldHVybiBjaGVja1dTSUNvbXBsaWFuY2UgKCBtb25pdG9yLCBzdGF0dXMsIHByb2plY3QsIFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpKTsKLX0KLS8qKgotICogQHBhcmFtIG1vbml0b3IgU3RhdHVzSGFuZGxlcgotICogQHBhcmFtIHN0YXR1cyBTdGF0dXNbXQotICogQHBhcmFtIHByb2plY3QgSVByb2plY3QKLSAqIEBwYXJhbSBjb250ZXh0IFBlcnNpc3RlbnRXU0lDb250ZXh0Ci0gKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiB0byBjb250aW51ZQotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tXU0lDb21wbGlhbmNlICggU3RhdHVzSGFuZGxlciBtb25pdG9yLCBTdGF0dXNbXSBzdGF0dXMsIElQcm9qZWN0IHByb2plY3QsIFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpCi17Ci0JU3RyaW5nIHBsdWdpbklkID0gIm9yZy5lY2xpcHNlLndzdC53cy51aSI7Ci0JbXNnVXRpbHNfID0gbmV3IE1lc3NhZ2VVdGlscyhwbHVnaW5JZCArICIucGx1Z2luIiwgV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpKTsgCi0JCi0gIAlpZiAoY29udGV4dC5wcm9qZWN0U3RvcE5vbldTSUNvbXBsaWFuY2VzKHByb2plY3QpKQotICAJCXsKLSAgCQkJLy8gZW1pdCBhbiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm4gZmFsc2UKLSAgCQkJU2ltcGxlU3RhdHVzIHN0YXR1c18gPSBuZXcgU2ltcGxlU3RhdHVzKFdTVUlQbHVnaW4uSUQsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKGNvbnRleHQuZ2V0RXJyb3IoKSksIFN0YXR1cy5FUlJPUik7Ci0gIAkJCS8vIGFkZGluZyBhbGwgbWVzc2FnZXMgZnJvbSBXU0kgSW5jb21wbGlhbmNlcwotICAJCQlmb3IgKGludCBpID0gMDsgaTwgc3RhdHVzLmxlbmd0aDsgaSsrKQotCSAgCQkJc3RhdHVzXy5hZGRDaGlsZChzdGF0dXNbaV0pOyAJCQkKLQkJCW1vbml0b3IucmVwb3J0RXJyb3Ioc3RhdHVzXyk7Ci0gIAkJCXJldHVybiBmYWxzZTsKLSAgCQl9Ci0gIAllbHNlIGlmIChjb250ZXh0LnByb2plY3RXYXJuTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0gIAkJewotICAJCQkvLyBnaXZlIGEgd2FybmluZyBtZXNzYWdlIHdpdGggdGhlIG9wdGlvbnMgdG8gc3RvcCwgaWdub3JlIHRoaXMgb25lLCBvciBpZ25vcmUgYWxsIGNvbWluZyBtZXNzYWdlcwotICAJCQlTaW1wbGVTdGF0dXMgc3RhdHVzXyA9IG5ldyBTaW1wbGVTdGF0dXMoV1NVSVBsdWdpbi5JRCwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoY29udGV4dC5nZXRXYXJuaW5nKCkpLCBTdGF0dXMuV0FSTklORyk7Ci0gIAkJCS8vIGFkZGluZyBhbGwgbWVzc2FnZXMgZnJvbSBXU0kgSW5jb21wbGlhbmNlcwotICAJCQlmb3IgKGludCBpID0gMDsgaTwgc3RhdHVzLmxlbmd0aDsgaSsrKQotCSAgCQkJc3RhdHVzXy5hZGRDaGlsZChzdGF0dXNbaV0pOwotCi0gIAkJCUNob2ljZSBpZ25vcmVDaG9pY2UgPSBuZXcgQ2hvaWNlKCdJJywgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIklHTk9SRV9MQUJFTCIpLCBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX0RFU0NSSVBUSU9OIikpOwotICAJCQlDaG9pY2UgaWdub3JlQWxsQ2hvaWNlID0gbmV3IENob2ljZSgnQScsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfQUxMX0xBQkVMIiksIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfQUxMX0RFU0NSSVBUSU9OIikpOwotICAJCQlDaG9pY2UgY2FuY2VsQ2hvaWNlID0gbmV3IENob2ljZSgnQycsIG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJDQU5DRUxfTEFCRUwiKSwgbXNnVXRpbHNfLmdldE1lc3NhZ2UoIkNBTkNFTF9ERVNDUklQVElPTiIpKTsKLSAgCQkJQ2hvaWNlIHJlc3VsdCA9IG1vbml0b3IucmVwb3J0KHN0YXR1c18sIG5ldyBDaG9pY2VbXXtpZ25vcmVDaG9pY2UsIGlnbm9yZUFsbENob2ljZSwgY2FuY2VsQ2hvaWNlfSk7Ci0gIAkJCQotICAJCQkvLyBpZiB0aGUgdXNlciBjbG9zZXMgdGhlIG1lc3NhZ2UgYm94IG9yIHNlbGVjdHMgaWdub3JlIGNvbnRpbnVlCi0gIAkJCWlmIChyZXN1bHQgPT0gbnVsbCB8fCAocmVzdWx0LmdldExhYmVsKCkuZXF1YWxzKGlnbm9yZUNob2ljZS5nZXRMYWJlbCgpKSkpCi0gICAgICAgIAkJCXJldHVybiB0cnVlOwotICAJCQkvLyBpZiB0aGUgdXNlciBzZWxlY3RzIGlnbm9yZSBhbGwsIGNoYW5nZSB0aGUgcHJlZmVyZW5jZQotCSAgICAgICAgZWxzZSAgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhpZ25vcmVBbGxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0JICAgICAgICAJewotCSAgICAgICAgCQljb250ZXh0LnVwZGF0ZVByb2plY3RXU0lDb21wbGlhbmNlcyhwcm9qZWN0LCBQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSSk7Ci0JICAgICAgICAJCXJldHVybiB0cnVlOwotCSAgICAgICAgCX0KLQkJCS8vIGlmIHRoZSB1c2VyIHNlbGVjdHMgdG8gY2FuY2VsICwgZG8gbm90IGNvbnRpbnVlIHdpdGggdGhlIGNvbW1hbmQKLSAgICAgICAgCWVsc2UgaWYgKHJlc3VsdC5nZXRMYWJlbCgpLmVxdWFscyhjYW5jZWxDaG9pY2UuZ2V0TGFiZWwoKSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0gIAkJfQotICByZXR1cm4gdHJ1ZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3VpL3dzaS9wcm9wZXJ0aWVzL1dTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3Byb3BlcnRpZXMvV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2U2ZmY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvdWkvd3NpL3Byb3BlcnRpZXMvV1NJQ29tcGxpYW5jZVByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uTWVzc2FnZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFdTSUNvbXBsaWFuY2VQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotewotICAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMgbXNnVXRpbHNfOwotCSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMSBmb3IgdGhlIFdTLUkgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1BBR0UgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwMCI7Ci0gIC8vCi0KLSAgcHJpdmF0ZSBMYWJlbCB3c2lfc3NicF9MYWJlbF87Ci0gIHByaXZhdGUgQ29tYm8gd3NpX3NzYnBfVHlwZXNfOwotICAKLSAgLypDT05URVhUX0lEIFBXU0kwMDAxIGZvciB0aGUgc3RvcCBXUy1JIFNTQlAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fU1RPUF9OT05fV1NJID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDEiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDIgZm9yIHRoZSB3YXJuIFdTLUkgU1NCUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19XQVJOX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwMiI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwMyBmb3IgdGhlIGlnbm9yZSBXUy1JIFNTQlAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fSUdOT1JFX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwMyI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNCBmb3IgdGhlIFdTLUkgU1NCUCB0eXBlIGNvbWJvIGJveCBvbiB0aGUgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfU1NCUF9DT01CT19UWVBFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDQiOwotICAKLSAgcHJpdmF0ZSBMYWJlbCB3c2lfYXBfTGFiZWxfOwotICBwcml2YXRlIENvbWJvIHdzaV9hcF9UeXBlc187Ci0gIAotICAvKkNPTlRFWFRfSUQgUFdTSTAwMDUgZm9yIHRoZSBzdG9wIFdTLUkgQVAgTm9uIGNvbXBsaWFuY2UgUHJlZmVyZW5jZSBQYWdlKi8KLSAgcHJpdmF0ZSBTdHJpbmcgSU5GT1BPUF9QV1NJX0FQX0NPTUJPX1NUT1BfTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA1IjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA2IGZvciB0aGUgd2FybiBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19XQVJOX05PTl9XU0kgPSBXU1VJUGx1Z2luLklEICsgIi5QV1NJMDAwNiI7Ci0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwNyBmb3IgdGhlIGlnbm9yZSBXUy1JIEFQIE5vbiBjb21wbGlhbmNlIFByZWZlcmVuY2UgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BfUFdTSV9BUF9DT01CT19JR05PUkVfTk9OX1dTSSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA3IjsKLSAgLypDT05URVhUX0lEIFBXU0kwMDA4IGZvciB0aGUgV1MtSSBBUCB0eXBlIGNvbWJvIGJveCBvbiB0aGUgV1MtSSBBUCBOb24gY29tcGxpYW5jZSBQcmVmZXJlbmNlIFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QX1BXU0lfQVBfQ09NQk9fVFlQRSA9IFdTVUlQbHVnaW4uSUQgKyAiLlBXU0kwMDA4IjsKLSAgCi0gIC8qQ09OVEVYVF9JRCBQV1NJMDAwOSBmb3IgdGhlIFdTLUkgZm9sbG93IHByZWZlcmVuY2UgcmFkaW8gYnV0dG9uIHRoZSBXUy1JIFNTQlAgY29tcGxpYW5jZSBwcm9qZWN0IHByb3BlcnR5IFBhZ2UqLwotICBwcml2YXRlIFN0cmluZyBJTkZPUE9QUF9QV1NJX1JBRElPX0ZPTExPV19XU0lfU1NCUF9QUkVGRVJFTkNFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMDkiOwotICAvKkNPTlRFWFRfSUQgUFdTSTAwMTAgZm9yIHRoZSBXUy1JIGZvbGxvdyBwcmVmZXJlbmNlIHJhZGlvIGJ1dHRvbiB0aGUgV1MtSSBBUCBjb21wbGlhbmNlIHByb2plY3QgcHJvcGVydHkgUGFnZSovCi0gIHByaXZhdGUgU3RyaW5nIElORk9QT1BQX1BXU0lfUkFESU9fRk9MTE9XX1dTSV9BUF9QUkVGRVJFTkNFID0gV1NVSVBsdWdpbi5JRCArICIuUFdTSTAwMTAiOwotCi0gIHByaXZhdGUgaW50IHNhdmVkU1NCUFNldHRpbmdfID0gLTE7Ci0gIAotIC8qKgotICAgKiBDcmVhdGVzIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyBvbiBkZW1hbmQuCi0gICAqICAgQHBhcmFtIHBhcmVudCAgdGhlIHBhcmVudCBmb3IgdGhlIHByZWZlcmVuY2UgcGFnZQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHN1cGVycGFyZW50KQotICB7Ci0gIAlTdHJpbmcgICAgICAgcGx1Z2luSWQgPSAib3JnLmVjbGlwc2Uud3N0LndzLnVpIjsKLSAgICBtc2dVdGlsc18gPSBuZXcgTWVzc2FnZVV0aWxzKCBwbHVnaW5JZCArICIucGx1Z2luIiwgdGhpcyApOwotCQotICAgIElXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLSAgICAKLSAgICBDb21wb3NpdGUgICBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKCBzdXBlcnBhcmVudCwgU1dULk5PTkUgKTsJCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0KCBsYXlvdXQgKTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIHBhcmVudC5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX1BBR0UiKSk7Ci0gICAgaGVscFN5c3RlbS5zZXRIZWxwKHBhcmVudCwgSU5GT1BPUF9QV1NJX1BBR0UpOwotCi0gICAgR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgZ2wubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBnbC5tYXJnaW5XaWR0aCA9IDA7Ci0KLSAgICBDb21wb3NpdGUgd3NpX0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUgKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHdzaV9Db21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLSAgICB3c2lfQ29tcG9zaXRlLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICAgICAgCi0gICAgd3NpX2FwX0xhYmVsXyA9IG5ldyBMYWJlbCh3c2lfQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgd3NpX2FwX0xhYmVsXy5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9XU0lfQVAiKSk7Ci0gICAgd3NpX2FwX0xhYmVsXy5zZXRUb29sVGlwVGV4dChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiVE9PTFRJUF9QV1NJX0FQX0xBQkVMIikpOwotICAgIHdzaV9hcF9UeXBlc18gPSBuZXcgQ29tYm8od3NpX0NvbXBvc2l0ZSwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotICAgIHdzaV9hcF9UeXBlc18uc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9BUF9DT01CTyIpKTsKLSAgICB3c2lfYXBfVHlwZXNfLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMICkgKTsKLSAgICBoZWxwU3lzdGVtLnNldEhlbHAod3NpX2FwX1R5cGVzXyxJTkZPUE9QX1BXU0lfQVBfQ09NQk9fVFlQRSk7Ci0gICAgCi0gICAgd3NpX2FwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlNUT1BfTk9OX1dTSSIpKTsKLSAgICB3c2lfYXBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiV0FSTl9OT05fV1NJIikpOwotICAgIHdzaV9hcF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTk9OX1dTSSIpKTsKLSAgICB3c2lfYXBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiRk9MTE9XX1dTSV9QUkVGRVJFTkNFIikpOwotCi0gICAgd3NpX2FwX1R5cGVzXy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICB3c2lfc3NicF9MYWJlbF8gPSBuZXcgTGFiZWwod3NpX0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIHdzaV9zc2JwX0xhYmVsXy5zZXRUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJMQUJFTF9XU0lfU1NCUCIpKTsKLSAgICB3c2lfc3NicF9MYWJlbF8uc2V0VG9vbFRpcFRleHQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIlRPT0xUSVBfUFdTSV9TU0JQX0xBQkVMIikpOwotICAgIHdzaV9zc2JwX1R5cGVzXyA9IG5ldyBDb21ibyh3c2lfQ29tcG9zaXRlLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0gICAgd3NpX3NzYnBfVHlwZXNfLnNldFRvb2xUaXBUZXh0KG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJUT09MVElQX1BXU0lfU1NCUF9DT01CTyIpKTsKLSAgICB3c2lfc3NicF9UeXBlc18uc2V0TGF5b3V0RGF0YSggbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgKSApOwotICAgIGhlbHBTeXN0ZW0uc2V0SGVscCh3c2lfc3NicF9UeXBlc18sSU5GT1BPUF9QV1NJX1NTQlBfQ09NQk9fVFlQRSk7Ci0gICAgCi0gICAgd3NpX3NzYnBfVHlwZXNfLmFkZChtc2dVdGlsc18uZ2V0TWVzc2FnZSgiU1RPUF9OT05fV1NJIikpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5hZGQobXNnVXRpbHNfLmdldE1lc3NhZ2UoIldBUk5fTk9OX1dTSSIpKTsKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJJR05PUkVfTk9OX1dTSSIpKTsKLSAgICB3c2lfc3NicF9UeXBlc18uYWRkKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJGT0xMT1dfV1NJX1BSRUZFUkVOQ0UiKSk7Ci0KLSAgICBpbml0aWFsaXplVmFsdWVzKCk7Ci0gICAgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cuYXBwbHlEaWFsb2dGb250KHN1cGVycGFyZW50KTsgICAgCi0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotIAotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBrZXkpIAotICB7Ci0gIAkJcmV0dXJuIFdTVUlQbHVnaW4uZ2V0TWVzc2FnZShrZXkpOwotICB9Ci0KLSAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0ICkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5SQURJTyApOwotICAgIGJ1dHRvbi5zZXRUZXh0KCB0ZXh0ICk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIC8qKgotICAgKiBEb2VzIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBkZWZhdWx0IGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkKLSAgewotICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIGluaXRpYWxpemVEZWZhdWx0cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICogIEByZXR1cm4gd2hldGhlciBpdCBpcyBva2F5IHRvIGNsb3NlIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpCi0gIHsKLSAgICBzdG9yZVZhbHVlcygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkKLSAgewotICAgIHBlcmZvcm1PaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgSVdvcmtiZW5jaFByb3BlcnR5UGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgICB7IAotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMKLSAgICogaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkKLSAgewotICAgIHdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qod3NpX3NzYnBfVHlwZXNfLmluZGV4T2YobXNnVXRpbHNfLmdldE1lc3NhZ2UoIkZPTExPV19XU0lfUFJFRkVSRU5DRSIpKSk7Ci0gICAgaW50IGFwU2VsZWN0aW9uID0gd3NpX2FwX1R5cGVzXy5pbmRleE9mKG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJGT0xMT1dfV1NJX1BSRUZFUkVOQ0UiKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZWxlY3QoYXBTZWxlY3Rpb24pOwotICAgIHNhdmVkU1NCUFNldHRpbmdfID0gLTE7ICAvLyBkbyBub3QgcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcKLSAgICBwcm9jZXNzQVBTZWxlY3Rpb24oYXBTZWxlY3Rpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotICAJU3RyaW5nIFdTSVRleHQgPSBnZXRXU0lTZWxlY3Rpb24oV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSVNTQlBDb250ZXh0KCkpOwotICAgIHdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qod3NpX3NzYnBfVHlwZXNfLmluZGV4T2YoV1NJVGV4dCkpOwotICAgIAotICAgIGludCBhcFNlbGVjdGlvbiA9IHdzaV9hcF9UeXBlc18uaW5kZXhPZihnZXRXU0lTZWxlY3Rpb24oV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTSUFQQ29udGV4dCgpKSk7Ci0gICAgd3NpX2FwX1R5cGVzXy5zZWxlY3QoYXBTZWxlY3Rpb24pOwotICAgIHNhdmVkU1NCUFNldHRpbmdfID0gLTE7ICAvLyBkbyBub3QgcmVzdG9yZSBzYXZlZCBTU0JQIHNldHRpbmcKLSAgICBwcm9jZXNzQVBTZWxlY3Rpb24oYXBTZWxlY3Rpb24pOwotCX0KLQotICBwcml2YXRlIFN0cmluZyBnZXRXU0lTZWxlY3Rpb24oUGVyc2lzdGVudFdTSUNvbnRleHQgY29udGV4dCkKLSAgewotICAgIAotICAJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RWxlbWVudCgpOwotICAJU3RyaW5nIFdTSXZhbHVlID0gY29udGV4dC5nZXRQcm9qZWN0V1NJQ29tcGxpYW5jZShwcm9qZWN0KTsKLQlTdHJpbmcgV1NJVGV4dCA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJGT0xMT1dfV1NJX1BSRUZFUkVOQ0UiKTsKLQlpZiAoUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJLmVxdWFscyhXU0l2YWx1ZSkpIHsKLQkJV1NJVGV4dCA9IG1zZ1V0aWxzXy5nZXRNZXNzYWdlKCJTVE9QX05PTl9XU0kiKTsKLQl9IGVsc2UgaWYgKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSS5lcXVhbHMoV1NJdmFsdWUpKSB7Ci0JCVdTSVRleHQgPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiV0FSTl9OT05fV1NJIik7Ci0JfSBlbHNlIGlmIChQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSS5lcXVhbHMoV1NJdmFsdWUpKSB7Ci0JCVdTSVRleHQgPSBtc2dVdGlsc18uZ2V0TWVzc2FnZSgiSUdOT1JFX05PTl9XU0kiKTsKLQl9Ci0JcmV0dXJuIFdTSVRleHQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpCi0gIHsKLSAgCXVwZGF0ZVdTSUNvbnRleHQod3NpX3NzYnBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCksIFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpKTsKLSAgCXVwZGF0ZVdTSUNvbnRleHQod3NpX2FwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpLCBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJQVBDb250ZXh0KCkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdXBkYXRlV1NJQ29udGV4dChpbnQgc2VsZWN0aW9uSW5kZXgsIFBlcnNpc3RlbnRXU0lDb250ZXh0IGNvbnRleHQpCi0gIHsgICAgCi0gIAlTdHJpbmcgdmFsdWUgPSBQZXJzaXN0ZW50V1NJQ29udGV4dC5GT0xMT1dfV1NJX1BSRUZFUkVOQ0U7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RWxlbWVudCgpOwotICAgIAotICAgIHN3aXRjaCAoc2VsZWN0aW9uSW5kZXgpIHsKLSAgICAJY2FzZSAwOgotICAgIAkJdmFsdWUgPSBQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0k7Ci0gICAgCQlicmVhazsKLSAgICAJY2FzZSAxOgotICAgIAkJdmFsdWUgPSBQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0k7Ci0gICAgCQlicmVhazsKLSAgICAJY2FzZSAyOgotICAgIAkJdmFsdWUgPSBQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSTsJCQotICAgIAkJYnJlYWs7Ci0gICAgCWNhc2UgMzoKLSAgICAJCXZhbHVlID0gUGVyc2lzdGVudFdTSUNvbnRleHQuRk9MTE9XX1dTSV9QUkVGRVJFTkNFOwkJCi0gICAgCQlicmVhazsKLSAgICB9Ci0gICAgY29udGV4dC51cGRhdGVQcm9qZWN0V1NJQ29tcGxpYW5jZXMocHJvamVjdCwgdmFsdWUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gIAkKLSAgCXByb2Nlc3NBUFNlbGVjdGlvbiggd3NpX2FwX1R5cGVzXy5nZXRTZWxlY3Rpb25JbmRleCgpICk7Ci0gIAkKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcHJvY2Vzc0FQU2VsZWN0aW9uKGludCBzZWxlY3Rpb24pIHsKLSAgCWlmIChzZWxlY3Rpb24gPT0gMikgeyAvLyByZXNldCBTU0JQIHRvIGRlZmF1bHQgaWYgQVAgaXMgaWdub3JlCi0gIAkJd3NpX3NzYnBfVHlwZXNfLnNldEVuYWJsZWQodHJ1ZSk7Ci0gIAkJaWYgKHNhdmVkU1NCUFNldHRpbmdfICE9IC0xKSAgewotICAJCQkvLyByZXN0b3JlIHNhdmVkIFNTQlAgc2V0dGluZywgaWYgYW55Ci0gIAkJCXdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qoc2F2ZWRTU0JQU2V0dGluZ18pOwotICAJCQlzYXZlZFNTQlBTZXR0aW5nXyA9IC0xOwotICAJCX0KLSAgCX0gZWxzZSB7IC8vIHNldCBTU0JQIHRvIGZvbGxvdyBBUCBzZXR0aW5nIGlmIFNUT1Agb3IgV0FSTiBjaG9zZW4KLSAgCQlpZiAoc2F2ZWRTU0JQU2V0dGluZ18gPT0gLTEpICB7ICAvLyBTU0JQIHNldHRpbmcgbm90IHNhdmVkCi0gIAkJCXNhdmVkU1NCUFNldHRpbmdfID0gd3NpX3NzYnBfVHlwZXNfLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gIAkJfQotICAJCXdzaV9zc2JwX1R5cGVzXy5zZWxlY3Qoc2VsZWN0aW9uKTsKLSAgCQl3c2lfc3NicF9UeXBlc18uc2V0RW5hYmxlZChmYWxzZSk7Ci0gIAkJCi0gIAl9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvdWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3VpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjM0N2M3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvdWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMgVUkKLVBMVUdJTl9WRU5ET1I9RWNsaXBzZS5vcmcKLVBMVUdJTl9ERVNDPVwKLVRoZSBXZWIgc2VydmljZXMgR1VJIHBsdWdpbiBkZWxpdmVycyB0aGUgZ3JhcGhpY2FsIFwKLXVzZXIgaW50ZXJmYWNlIHRvIHRoZSBXZWIgc2VydmljZXMgZnVuY3Rpb24gaW4gdGhlIFdTVCBzdWJwcm9qZWN0LgotCi1QTFVHSU5fTkVXX0NBVEVHT1JZX05BTUVfV1M9V2ViIFNlcnZpY2VzCi0KLQotIwotIyAgV1MtSSBQcmVmZXJlbmNlIHBhZ2VzCi0jCi0jIFdTLUkgQ29tcGxpYW5jZSBQYWdlCi0jCi1QUkVGRVJFTkNFX0NBVEVHT1JZX1dTST1XUy1JIENvbXBsaWFuY2UKLVNUT1BfTk9OX1dTST1SZXF1aXJlIGNvbXBsaWFuY2UKLVdBUk5fTk9OX1dTST1TdWdnZXN0IGNvbXBsaWFuY2UKLUlHTk9SRV9OT05fV1NJPUlnbm9yZSBjb21wbGlhbmNlCi1GT0xMT1dfV1NJX1BSRUZFUkVOQ0U9Rm9sbG93IFByZWZlcmVuY2UKLQotVE9PTFRJUF9QV1NJX1BBR0U9V2ViIFNlcnZpY2VzIEludGVyb3BlcmFiaWxpdHkKLVRPT0xUSVBfUFdTSV9SQURJT19TVE9QX05PTl9XU0k9U3RvcCBhbmQgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGlmIHlvdSBtYWtlIGEgY2hvaWNlIHRoYXQgZG9lcyBub3QgY29tcGx5IHdpdGggV1MtSS4KLVRPT0xUSVBfUFdTSV9SQURJT19XQVJOSU5HX05PTl9XU0k9UHJvZHVjZSBhIHdhcm5pbmcgbWVzc2FnZSBpZiB5b3UgbWFrZSBhIGNob2ljZSB0aGF0IGRvZXMgbm90IGNvbXBseSB3aXRoIFdTLUkuCi1UT09MVElQX1BXU0lfUkFESU9fSUdOT1JFX05PTl9XU0k9U2lsZW50bHkgYWxsb3cgY2hvaWNlcyB0aGF0IGRvIG5vdCBjb21wbHkgd2l0aCBXUy1JLgotVE9PTFRJUF9QV1NJX1JBRElPX0ZPTExPV19XU0lfUFJFRkVSRU5DRT1Qcm9qZWN0IHdvdWxkIHVzZSBXUy1JIGNvbXBsaWFuY2UgbGV2ZWwgc2V0IGluIFdvcmtzcGFjZSBQcmVmZXJlbmNlLgotCi1MQUJFTF9XU0lfU1NCUD1XUy1JIFNTQlAgY29tcGxpYW5jZSBsZXZlbAotVE9PTFRJUF9QV1NJX1NTQlBfTEFCRUw9V1MtSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUgY29tcGxpYW5jZSBsZXZlbAotVE9PTFRJUF9QV1NJX1NTQlBfQ09NQk89Q2hvb3NlIHRoZSBXUy1JIFNpbXBsZSBTT0FQIEJpbmRpbmcgUHJvZmlsZSBjb21wbGlhbmNlIGxldmVsCi0KLUxBQkVMX1dTSV9BUD1XUy1JIEFQIGNvbXBsaWFuY2UgbGV2ZWwKLVRPT0xUSVBfUFdTSV9BUF9MQUJFTD1XUy1JIEF0dGFjaG1lbnQgUHJvZmlsZSBjb21wbGlhbmNlIGxldmVsCi1UT09MVElQX1BXU0lfQVBfQ09NQk89Q2hvb3NlIHRoZSBXUy1JIEF0dGFjaG1lbnQgUHJvZmlsZSBjb21wbGlhbmNlIGxldmVsCi0KLQotIwotIwlXUy1JIENvbXBsaWFuY2UgTWVzc2FnZXMKLSMKLVdTSV9TU0JQX0VSUk9SPVlvdSBoYXZlIG1hZGUgYSBjaG9pY2UgdGhhdCBtYXkgcmVzdWx0IGluIGEgV2ViIHNlcnZpY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBTaW1wbGUgU09BUCBCaW5kaW5nIFByb2ZpbGUuIFlvdXIgY3VycmVudCBXZWIgc2VydmljZXMgcHJlZmVyZW5jZSBpcyBzZXQgdG8gcmVxdWlyZSBjb21wbGlhbmNlIHdpdGggV1MtSSBTU0JQLgotV1NJX1NTQlBfV0FSTklORz1Zb3UgaGF2ZSBtYWRlIGEgY2hvaWNlIHRoYXQgbWF5IHJlc3VsdCBpbiBhIFdlYiBzZXJ2aWNlIHRoYXQgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlLiBEbyB5b3Ugd2lzaCB0byBpZ25vcmUgdGhpcyB3YXJuaW5nIGFuZCBjb250aW51ZT8KLVdTSV9TU0JQX0lOQ09NUExJQU5UX1JVTlRJTUU9VGhlIHNlbGVjdGVkIFdlYiBTZXJ2aWNlIHJ1bnRpbWUgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgU2ltcGxlIFNPQVAgQmluZGluZyBQcm9maWxlLgotV1NJX0FQX0VSUk9SPVlvdSBoYXZlIG1hZGUgYSBjaG9pY2UgdGhhdCBtYXkgcmVzdWx0IGluIGEgV2ViIHNlcnZpY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBBdHRhY2htZW50IFByb2ZpbGUuIFlvdXIgY3VycmVudCBXZWIgc2VydmljZXMgcHJlZmVyZW5jZSBpcyBzZXQgdG8gcmVxdWlyZSBjb21wbGlhbmNlIHdpdGggV1MtSSBBUC4KLVdTSV9BUF9XQVJOSU5HPVlvdSBoYXZlIG1hZGUgYSBjaG9pY2UgdGhhdCBtYXkgcmVzdWx0IGluIGEgV2ViIHNlcnZpY2UgdGhhdCBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgV1MtSSBBdHRhY2htZW50IFByb2ZpbGUuIERvIHlvdSB3aXNoIHRvIGlnbm9yZSB0aGlzIHdhcm5pbmcgYW5kIGNvbnRpbnVlPwotV1NJX0FQX0lOQ09NUExJQU5UX1JVTlRJTUU9VGhlIHNlbGVjdGVkIFdlYiBTZXJ2aWNlIHJ1bnRpbWUgZG9lcyBub3QgY29tcGx5IHdpdGggdGhlIFdTLUkgQXR0YWNobWVudCBQcm9maWxlLgotSUdOT1JFX0xBQkVMPUlnbm9yZQotSUdOT1JFX0RFU0NSSVBUSU9OPUlnbm9yZSB0aGUgV1MtSSBub24tY29tcGxpYW5jZSBhbmQgY29udGludWUKLUlHTk9SRV9BTExfTEFCRUw9SWdub3JlIEFsbAotSUdOT1JFX0FMTF9ERVNDUklQVElPTj1BbHdheXMgaWdub3JlIHRoZSBXUy1JIG5vbi1jb21wbGlhbmNlIGFuZCBjb250aW51ZQotQ0FOQ0VMX0xBQkVMPUNhbmNlbAotVEFTS19MQUJFTF9XU0lfTk9OQ09NUExJQU5UPUNoZWNrIGZvciBXU0kgQ29tcGxpYW5jZQotVEFTS19ERVNDX1dTSV9OT05DT01QTElBTlQ9Q2hlY2sgZm9yIFdTSSBDb21wbGlhbmNlCi1DQU5DRUxfREVTQ1JJUFRJT049Q2FuY2VsCi1OT1RfT0s9Q2Fubm90IGNvbnRpbnVlIGR1ZSB0byBXUy1JIG5vbi1jb21wbGlhbmNlCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg1ODUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd3MuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDk0ZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzNhZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53cwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB3cy5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnMsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vbml0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbiwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydCwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NpbCwKLSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb24sCi0gb3JnLndzZGw0aiwKLSBvcmcuYXBhY2hlLndzaWw0agotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTlmMjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS53cy5qYXIgPSBzcmMvCi1vdXRwdXQud3MuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3cy5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjNGZkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzIj4KLSAgIDxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPgotICAgPC9jb21wb25lbnQtZGVwZW5kcz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cyIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MucGFyc2VyIiBmcmFnbWVudD0iZmFsc2UiLz4KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53cy51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS5heGlzMTEiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS53c2lsNGoiIGZyYWdtZW50PSJmYWxzZSIvPgotICAgPHBsdWdpbiBpZD0ib3JnLnVkZGk0aiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzJkOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1XZWIgU2VydmljZXMKLVBMVUdJTl9QUk9WSURFUj1FY2xpcHNlLm9yZwotCi1NU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1I9SVdBQjAwMDFFIFVuYWJsZSB0byBtb25pdG9yIHBvcnQgezB9IG9mIHsxfS4KLQotIyBDdXJyZW50bHkga25vd24gcHVibGljIFVEREkgcmVnaXN0cmllcwotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTT1JQk0gVURESSBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX0lCTV9URVNUPUlCTSBVRERJIFRlc3QgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlQ9TWljcm9zb2Z0IFVEREkgUmVnaXN0cnkKLVBVQkxJQ1VERElSRUdJU1RSWVRZUEVfTkFNRV9NSUNST1NPRlRfVEVTVD1NaWNyb3NvZnQgVURESSBUZXN0IFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQPVNBUCBVRERJIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfU0FQX1RFU1Q9U0FQIFVEREkgVGVzdCBSZWdpc3RyeQotUFVCTElDVURESVJFR0lTVFJZVFlQRV9OQU1FX1hNRVRIT0RTPVhNZXRob2RzIFJlZ2lzdHJ5Ci1QVUJMSUNVRERJUkVHSVNUUllUWVBFX05BTUVfTlRUQ09NTT1OVFQgQ29tbXVuaWNhdGlvbnMgUmVnaXN0cnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTUzNzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNDb25uZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY0Nvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4Y2FhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNDb25uZWN0aW9uIGltcGxlbWVudHMgQ29ubmVjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgUmVsIGZSZWw7Ci0gIHByaXZhdGUgRWxlbWVudCBmRWxlbWVudDsKLSAgcHJpdmF0ZSBDb25uZWN0aW9uIGZPcHBvc2luZ0Nvbm5lY3Rpb247Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUQk9VTkQgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkJPVU5EID0gMTsKLQotICBwdWJsaWMgc3RhdGljIENvbm5lY3Rpb25bXSBjcmVhdGVQYWlyICggUmVsIG91dGJvdW5kUmVsLCBFbGVtZW50IHRhcmdldEVsZW1lbnQsIFJlbCBpbmJvdW5kUmVsLCBFbGVtZW50IHNvdXJjZUVsZW1lbnQgKQotICB7Ci0gICAgQmFzaWNDb25uZWN0aW9uIG91dGJvdW5kQ29ubmVjdGlvbiA9IG5ldyBCYXNpY0Nvbm5lY3Rpb24ob3V0Ym91bmRSZWwsdGFyZ2V0RWxlbWVudCk7Ci0gICAgQmFzaWNDb25uZWN0aW9uIGluYm91bmRDb25uZWN0aW9uID0gbmV3IEJhc2ljQ29ubmVjdGlvbihpbmJvdW5kUmVsLHNvdXJjZUVsZW1lbnQpOwotICAgIG91dGJvdW5kQ29ubmVjdGlvbi5mT3Bwb3NpbmdDb25uZWN0aW9uID0gaW5ib3VuZENvbm5lY3Rpb247Ci0gICAgaW5ib3VuZENvbm5lY3Rpb24uZk9wcG9zaW5nQ29ubmVjdGlvbiA9IG91dGJvdW5kQ29ubmVjdGlvbjsKLSAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25bXSB7b3V0Ym91bmRDb25uZWN0aW9uLGluYm91bmRDb25uZWN0aW9ufTsKLSAgfQotCi0gIHB1YmxpYyBCYXNpY0Nvbm5lY3Rpb24gKCBSZWwgcmVsLCBFbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgZlJlbCA9IHJlbDsKLSAgICBmRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgZk9wcG9zaW5nQ29ubmVjdGlvbiA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgUmVsIGdldFJlbCAoKQotICB7Ci0gICAgcmV0dXJuIGZSZWw7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRPcHBvc2luZ0Nvbm5lY3Rpb24gKCkKLSAgewotICAgIHJldHVybiBmT3Bwb3NpbmdDb25uZWN0aW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50LmdldE5hbWUoKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmQwOGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEJhc2ljRWxlbWVudCBpbXBsZW1lbnRzIEVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIFN0cmluZyBmTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgZk1VSUQ7Ci0gIHByaXZhdGUgTW9kZWwgZk1vZGVsOwotICBwcml2YXRlIEhhc2h0YWJsZSBmUmVsczsKLSAgcHJpdmF0ZSBIYXNodGFibGUgZlByb3BlcnRpZXM7Ci0gIHByaXZhdGUgVmVjdG9yIGZMaXN0ZW5lcnM7Ci0KLSAgcHVibGljIEJhc2ljRWxlbWVudCAoIFN0cmluZyBuYW1lLCBNb2RlbCBtb2RlbCApCi0gIHsKLSAgICBmTmFtZSA9IG5hbWU7Ci0gICAgc2V0TVVJRChtb2RlbC5tYWtlTVVJRChuYW1lKSk7Ci0gICAgbW9kZWwuYWRkRWxlbWVudCh0aGlzKTsKLSAgICBmTW9kZWwgPSBtb2RlbDsKLSAgICBmUmVscyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmTGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotICAgIGZQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGZQcm9wZXJ0aWVzLnB1dChQcm9wZXJ0eS5OQU1FLG5ldyBCYXNpY1Byb3BlcnR5KFByb3BlcnR5Lk5BTUUsZk5hbWUpKTsKLSAgfQotCi0gIHB1YmxpYyBCYXNpY0VsZW1lbnQgKCBTdHJpbmcgbmFtZSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lLCBTdHJpbmcgaW5ib3VuZFJlbE5hbWUgKQotICB7Ci0gICAgdGhpcyhuYW1lLGVsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0gICAgY29ubmVjdChlbGVtZW50LG91dGJvdW5kUmVsTmFtZSxpbmJvdW5kUmVsTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyA8Y29kZT5FbGVtZW50PC9jb2RlPgotICAqIG9mIHRoZSBzYW1lIGNsYXNzIGFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIG1vZGVsLAotICAqIGJ1dCB3aXRoIG5vIFByb3BlcnRpZXMsIFJlbHMgb3IgTGlzdGVuZXJzIGV4Y2VwdCBmb3IKLSAgKiB0aGUge0BsaW5rIFByb3BlcnR5I05BTUUgTkFNRX0gcHJvcGVydHkuCi0gICogQHJldHVybiBPYmplY3QgQSBuZXcgRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgc2hhbGxvd0Nsb25lICgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEJhc2ljRWxlbWVudChmTmFtZSxmTW9kZWwpOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgPGNvZGU+RWxlbWVudDwvY29kZT4KLSAgKiBvZiB0aGUgc2FtZSBjbGFzcyBhbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBtb2RlbAotICAqIGFuZCB3aXRoIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgRWxlbWVudCdzIFByb3BlcnRpZXMuCi0gICogVGhlIFJlbHMgYW5kIExpc3RlbmVycyBhcmUgbm90IGNsb25lZC4KLSAgKiBAcmV0dXJuIEVsZW1lbnQgQSBuZXcgRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIGZpbmFsIEVsZW1lbnQgZGVlcENsb25lICgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBzaGFsbG93Q2xvbmUoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZ2V0UHJvcGVydGllcygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIFByb3BlcnR5IG5ld1Byb3BlcnR5ID0gKFByb3BlcnR5KXByb3BlcnR5LnNoYWxsb3dDbG9uZSgpOwotICAgICAgbmV3RWxlbWVudC5zZXRQcm9wZXJ0eShuZXdQcm9wZXJ0eSk7Ci0gICAgfQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICogTW9kZWwtVmlldy1Db250cm9sbGVyOiBBbGwgcHJvcGVydHkgY2hhbmdlcyB0byB0aGUgbW9kZWwKLSAgKiAoc3VjaCBhcyB0aG9zZSBtYWRlIGJ5IGEgd2l6YXJkIGluIHRoZSByb2xlIG9mIGEgQ29udHJvbGxlcikKLSAgKiBzaG91bGQgeWllbGQgZXZlbnRzIHRvIHdoaWNoIGFuIGludGVyZXN0ZWQgcGFydHkgY2FuIGxpc3RlbgotICAqIChzdWNoIGFzIGEgd2l6YXJkIGluIHRoZSByb2xlIG9mIGEgVmlld2VyKS4KLSAgKiBAcGFyYW0gdG1sIFRoZSBsaXN0ZW5lciB0byBhZGQuCi0gICovCi0gIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyICggRWxlbWVudExpc3RlbmVyIGxpc3RlbmVyICkKLSAgewotICAgIGZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyBNb2RlbCBnZXRNb2RlbCAoKQotICB7Ci0gICAgcmV0dXJuIGZNb2RlbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQgKCkKLSAgewotICAgIHJldHVybiAoZk1vZGVsICE9IG51bGwgJiYgZk1vZGVsLmNvbnRhaW5zRWxlbWVudCh0aGlzKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmUgKCkKLSAgewotICAgIHJldHVybiBmTW9kZWwucmVtb3ZlRWxlbWVudCh0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBmTmFtZSA9IG5hbWU7Ci0gICAgZlByb3BlcnRpZXMucHV0KFByb3BlcnR5Lk5BTUUsbmV3IEJhc2ljUHJvcGVydHkoUHJvcGVydHkuTkFNRSxmTmFtZSkpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gZk5hbWU7Ci0gIH0KLQotICAvKgotICAqIFRoZSBnZXR0ZXIgZm9yIHRoZSBNVUlECi0gICogVGhlIE1VSUQgaXMgdGhlIE1vZGVsIFVuaXF1ZSBJZGVudGlmaWVyLCBtYWRlIGZyb20gdGhlIG5hbWUgYW5kIGFuCi0gICogYXBwZW5kZWQgdW5pcXVlIG51bWJlciAKLSAgKiBAcmV0dXJuIFN0cmluZyBhIHVuaXF1ZSBpZCBmb3IgdGhpcyBlbGVtZW50IHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGUgbW9kZWwgCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TVVJRCgpCi0gIHsKLSAgICByZXR1cm4gZk1VSUQ7Ci0gIH0KLQotICAvKgotICAqCi0gICoKLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJJRCgpCi0gIHsKLSAgICBTdHJpbmcgbnVtYmVyID0gZ2V0TVVJRCgpLnN1YnN0cmluZyhnZXROYW1lKCkubGVuZ3RoKCkpOyAgCi0gICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQobnVtYmVyKTsKLSAgfQotCi0gIC8qCi0gICogU2V0IHRoZSBNVUlEIHdoaWNoIHdhcyBtYWRlIGJ5IHRoZSBtb2RlbAotICAqIFNob3VsZCBvbmx5IGJlIHNldHRhYmxlIHdpdGhpbiB0aGlzIGVsZW1lbnQKLSAgKiBTZXQgb25jZSB1cG9uIGNyZWF0aW9uLCB5b3UgY2FuIGNoYW5nZSB0aGUgbmFtZQotICAqIGJ1dCB0aGUgaWQgd2lsbCByZW1haW4gY29uc3RhbnQuCi0gICovCi0gIHByaXZhdGUgdm9pZCBzZXRNVUlEKFN0cmluZyBNVUlEKQotICB7Ci0gICAgZk1VSUQgPSBNVUlEOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5ICggUHJvcGVydHkgcHJvcGVydHkgKQotICB7Ci0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTsKLSAgICBQcm9wZXJ0eSBvbGRQcm9wZXJ0eSA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgZlByb3BlcnRpZXMucHV0KHByb3BlcnR5TmFtZSxwcm9wZXJ0eSk7Ci0gICAgaWYgKG9sZFByb3BlcnR5ID09IG51bGwpCi0gICAgewotICAgICAgUHJvcGVydHlBZGRFdmVudCBldmVudCA9IG5ldyBQcm9wZXJ0eUFkZEV2ZW50KHRoaXMscHJvcGVydHkpOwotICAgICAgRW51bWVyYXRpb24gZSA9IGZMaXN0ZW5lcnMuZWxlbWVudHMoKTsKLSAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICAoKEVsZW1lbnRMaXN0ZW5lcillLm5leHRFbGVtZW50KCkpLnByb3BlcnR5QWRkZWQoZXZlbnQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgT2JqZWN0IG9sZFZhbHVlID0gb2xkUHJvcGVydHkuZ2V0VmFsdWUoKTsKLSAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0gICAgICBpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpCi0gICAgICB7Ci0gICAgICAgIGlmIChvbGRWYWx1ZSA9PSBudWxsIHx8IG5ld1ZhbHVlID09IG51bGwgfHwgKCFvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSkKLSAgICAgICAgewotICAgICAgICAgIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLHByb3BlcnR5LG9sZFByb3BlcnR5KTsKLSAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gZkxpc3RlbmVycy5lbGVtZW50cygpOwotICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoRWxlbWVudExpc3RlbmVyKWUubmV4dEVsZW1lbnQoKSkucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcGVydHkuTkFNRSkpIGZOYW1lID0gcHJvcGVydHkuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlBc09iamVjdCAoIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUgKQotICB7Ci0gICAgc2V0UHJvcGVydHkobmV3IEJhc2ljUHJvcGVydHkobmFtZSx2YWx1ZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlBc1N0cmluZyAoIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUgKQotICB7Ci0gICAgc2V0UHJvcGVydHkobmV3IEJhc2ljUHJvcGVydHkobmFtZSx2YWx1ZSkpOwotICB9Ci0KLSAgcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5ICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgcmV0dXJuIChQcm9wZXJ0eSlmUHJvcGVydGllcy5nZXQobmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFByb3BlcnR5KG5hbWUpOwotICAgIHJldHVybiAocHJvcGVydHkgPT0gbnVsbCA/IG51bGwgOiBwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlBc1N0cmluZyAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIFByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UHJvcGVydHkobmFtZSk7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eSA9PSBudWxsID8gbnVsbCA6IHByb3BlcnR5LmdldFZhbHVlQXNTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydGllcyAoKQotICB7Ci0gICAgcmV0dXJuIGZQcm9wZXJ0aWVzLmVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0ICggRWxlbWVudCB0YXJnZXRFbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lLCBTdHJpbmcgaW5ib3VuZFJlbE5hbWUgKQotICB7Ci0gICAgaWYgKGZNb2RlbCA9PSBudWxsIHx8IGZNb2RlbCAhPSB0YXJnZXRFbGVtZW50LmdldE1vZGVsKCkpIHJldHVybiBmYWxzZTsKLQotICAgIEVsZW1lbnQgc291cmNlRWxlbWVudCA9IHRoaXM7Ci0gICAgUmVsIG91dGJvdW5kUmVsID0gc291cmNlRWxlbWVudC5nZXRSZWwob3V0Ym91bmRSZWxOYW1lKTsKLSAgICBSZWwgaW5ib3VuZFJlbCA9IHRhcmdldEVsZW1lbnQuZ2V0UmVsKGluYm91bmRSZWxOYW1lKTsKLSAgICBDb25uZWN0aW9uW10gcGFpciA9IEJhc2ljQ29ubmVjdGlvbi5jcmVhdGVQYWlyKG91dGJvdW5kUmVsLHRhcmdldEVsZW1lbnQsaW5ib3VuZFJlbCxzb3VyY2VFbGVtZW50KTsKLSAgICBvdXRib3VuZFJlbC5hZGRDb25uZWN0aW9uKHBhaXJbQmFzaWNDb25uZWN0aW9uLk9VVEJPVU5EXSk7Ci0gICAgaW5ib3VuZFJlbC5hZGRDb25uZWN0aW9uKHBhaXJbQmFzaWNDb25uZWN0aW9uLklOQk9VTkRdKTsKLSAgICBSZWxBZGRFdmVudCBldmVudCA9IG5ldyBSZWxBZGRFdmVudChwYWlyKTsKLSAgICBFbnVtZXJhdGlvbiBlU291cmNlID0gZ2V0TGlzdGVuZXJzKCk7Ci0gICAgRW51bWVyYXRpb24gZVRhcmdldCA9IHRhcmdldEVsZW1lbnQuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgd2hpbGUgKGVTb3VyY2UuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgKChFbGVtZW50TGlzdGVuZXIpZVNvdXJjZS5uZXh0RWxlbWVudCgpKS5yZWxBZGRlZChldmVudCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKGVUYXJnZXQuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgKChFbGVtZW50TGlzdGVuZXIpZVRhcmdldC5uZXh0RWxlbWVudCgpKS5yZWxBZGRlZChldmVudCk7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QgKCBFbGVtZW50IHRhcmdldEVsZW1lbnQsIFN0cmluZyBvdXRib3VuZFJlbE5hbWUgKQotICB7Ci0gICAgcmV0dXJuIGRpc2Nvbm5lY3QodGFyZ2V0RWxlbWVudCxnZXRSZWwob3V0Ym91bmRSZWxOYW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0UmVsICggU3RyaW5nIG91dGJvdW5kUmVsTmFtZSApCi0gIHsKLSAgICByZXR1cm4gZGlzY29ubmVjdFJlbChnZXRSZWwob3V0Ym91bmRSZWxOYW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0QWxsICgpCi0gIHsKLSAgICBpZiAoZk1vZGVsID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZlJlbHMuZWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBSZWwgcmVsID0gKFJlbCllLm5leHRFbGVtZW50KCk7Ci0gICAgICBkaXNjb25uZWN0UmVsKHJlbCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEVsZW1lbnRzICggU3RyaW5nIHJlbE5hbWUgKQotICB7Ci0gICAgcmV0dXJuIGdldFJlbChyZWxOYW1lKS5nZXRUYXJnZXRFbGVtZW50cygpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkVsZW1lbnRzICggU3RyaW5nIHJlbE5hbWUgKQotICB7Ci0gICAgcmV0dXJuIGdldFJlbChyZWxOYW1lKS5nZXROdW1iZXJPZlRhcmdldEVsZW1lbnRzKCk7Ci0gIH0KLQotICBwdWJsaWMgUmVsIGdldFJlbCAoIFN0cmluZyByZWxOYW1lICkKLSAgewotICAgIFJlbCByZWwgPSAoUmVsKWZSZWxzLmdldChyZWxOYW1lKTsKLSAgICBpZiAocmVsID09IG51bGwpCi0gICAgewotICAgICAgcmVsID0gbmV3IEJhc2ljUmVsKHJlbE5hbWUsdGhpcyk7Ci0gICAgICBmUmVscy5wdXQocmVsTmFtZSxyZWwpOwotICAgIH0KLSAgICByZXR1cm4gcmVsOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFJlbHMgKCkKLSAgewotICAgIHJldHVybiBmUmVscy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldExpc3RlbmVycygpCi0gIHsKLSAgICByZXR1cm4gZkxpc3RlbmVycy5lbGVtZW50cygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gZGlzY29ubmVjdCAoIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgUmVsIG91dGJvdW5kUmVsICkKLSAgewotICAgIGlmIChmTW9kZWwgPT0gbnVsbCB8fCBmTW9kZWwgIT0gdGFyZ2V0RWxlbWVudC5nZXRNb2RlbCgpIHx8IG91dGJvdW5kUmVsID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBDb25uZWN0aW9uIG91dGJvdW5kQ29ubmVjdGlvbiA9IG91dGJvdW5kUmVsLmdldENvbm5lY3Rpb25Ubyh0YXJnZXRFbGVtZW50KTsKLSAgICBpZiAob3V0Ym91bmRDb25uZWN0aW9uID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBDb25uZWN0aW9uIGluYm91bmRDb25uZWN0aW9uID0gb3V0Ym91bmRDb25uZWN0aW9uLmdldE9wcG9zaW5nQ29ubmVjdGlvbigpOwotICAgIFJlbFJlbW92ZUV2ZW50IGV2ZW50ID0gbmV3IFJlbFJlbW92ZUV2ZW50KG5ldyBDb25uZWN0aW9uIFtdIHtvdXRib3VuZENvbm5lY3Rpb24saW5ib3VuZENvbm5lY3Rpb259KTsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBmTGlzdGVuZXJzLmVsZW1lbnRzKCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgKChFbGVtZW50TGlzdGVuZXIpZS5uZXh0RWxlbWVudCgpKS5yZWxSZW1vdmVkKGV2ZW50KTsKLSAgICAgIH0KLQotICAgIEVudW1lcmF0aW9uIGVUYXJnZXQgPSB0YXJnZXRFbGVtZW50LmdldExpc3RlbmVycygpOwotICAgIHdoaWxlIChlVGFyZ2V0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgICgoRWxlbWVudExpc3RlbmVyKWVUYXJnZXQubmV4dEVsZW1lbnQoKSkucmVsUmVtb3ZlZChldmVudCk7Ci0gICAgfQotCi0gICAgUmVsIGluYm91bmRSZWwgPSBpbmJvdW5kQ29ubmVjdGlvbi5nZXRSZWwoKTsKLSAgICBib29sZWFuIGRvbmUgPSBvdXRib3VuZFJlbC5yZW1vdmVDb25uZWN0aW9uKG91dGJvdW5kQ29ubmVjdGlvbik7Ci0gICAgaW5ib3VuZFJlbC5yZW1vdmVDb25uZWN0aW9uKGluYm91bmRDb25uZWN0aW9uKTsKLSAgICByZXR1cm4gZG9uZTsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGRpc2Nvbm5lY3RSZWwgKCBSZWwgb3V0Ym91bmRSZWwgKQotICB7Ci0gICAgaWYgKGZNb2RlbCA9PSBudWxsIHx8IG91dGJvdW5kUmVsID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICBFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgRWxlbWVudFtvdXRib3VuZFJlbC5nZXROdW1iZXJPZlRhcmdldEVsZW1lbnRzKCldOwotICAgIGludCBpID0gMDsKLSAgICBFbnVtZXJhdGlvbiBlID0gb3V0Ym91bmRSZWwuZ2V0VGFyZ2V0RWxlbWVudHMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBlbGVtZW50c1tpKytdID0gKEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgIH0KLSAgICB3aGlsZSAoaS0tID4gMCkKLSAgICB7Ci0gICAgICBkaXNjb25uZWN0KGVsZW1lbnRzW2ldLG91dGJvdW5kUmVsKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Jhc2ljTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzYjQzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgQmFzaWNNb2RlbCBpbXBsZW1lbnRzIE1vZGVsCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0gIHByaXZhdGUgSGFzaHRhYmxlIGZFbGVtZW50czsKLSAgcHJpdmF0ZSBFbGVtZW50IGZSb290OwotICAvL1RoaXMgaXMgdXNlZCBieSB0aGUgTVVJRAotICBwcml2YXRlIGludCBmVW5pcXVlTnVtYmVyQ291bnRlcjsKLQotICBwdWJsaWMgQmFzaWNNb2RlbCAoIFN0cmluZyBuYW1lICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmRWxlbWVudHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgZlJvb3QgPSBudWxsOwotICAgIGZVbmlxdWVOdW1iZXJDb3VudGVyID0gMDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUgKCBTdHJpbmcgbmFtZSApCi0gIHsKLSAgICBmTmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCkKLSAgewotICAgIHJldHVybiBmTmFtZTsKLSAgfQotCi0KLSAgLyoKLSAgKiBzaW1wbGUgY291bnRlciB0aGF0IGluY3JlbWVudHMgZWFjaCBjYWxsIAotICAqLwotICBwdWJsaWMgaW50IGdldFVuaXF1ZU51bWJlcigpCi0gIHsKLSAgICBmVW5pcXVlTnVtYmVyQ291bnRlcisrOwotICAgIHJldHVybiBmVW5pcXVlTnVtYmVyQ291bnRlcjsKLSAgfQotCi0gIC8qCi0gICogVGhpcyB3aWxsIHVzZSBhIHVuaXF1ZSBudW1iZXIgYW5kIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBuYW1lIAotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSBvZiB0aGUgZWxlbWVudAotICAqIEByZXR1cm4gU3RyaW5nIE1VSUQKLSAgKi8KLSAgcHVibGljIFN0cmluZyBtYWtlTVVJRChTdHJpbmcgbmFtZSkKLSAgewotICAgIFN0cmluZyBudW0gPSBTdHJpbmcudmFsdWVPZihnZXRVbmlxdWVOdW1iZXIoKSk7Ci0gICAgU3RyaW5nIG11aWQgPSBuYW1lICsgbnVtOwotICAgIHJldHVybiBtdWlkOwotICB9Ci0KLQotICBwdWJsaWMgYm9vbGVhbiBzZXRSb290RWxlbWVudCAoIEVsZW1lbnQgcm9vdCApCi0gIHsKLSAgICBpZiAocm9vdC5nZXRNb2RlbCgpID09IG51bGwpCi0gICAgICBhZGRFbGVtZW50KHJvb3QpOwotICAgIGVsc2UgaWYgKHJvb3QuZ2V0TW9kZWwoKSAhPSB0aGlzKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGZSb290ID0gcm9vdDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGdldFJvb3RFbGVtZW50ICgpCi0gIHsKLSAgICBpZiAoZlJvb3QgPT0gbnVsbCkgZlJvb3QgPSBnZXRGaXJzdEVsZW1lbnQoKTsKLSAgICByZXR1cm4gZlJvb3Q7Ci0gIH0KLQotCi0gIC8qKgotICAqIEdldCB0aGUgZWxlbWVudHMgdGhhdCBoYXZlIHRoaXMgbmFtZQotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCAKLSAgKiBAcmV0dXJuIFZlY3RvciBhIHZlY3RvciBvZiBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBuYW1lCi0gICogVGhlc2UgZWxlbWVudHMgbWF5IGJlIG9mIGRpZmZlcmVudCB0eXBlcwotICAqKi8KLQotICBwdWJsaWMgVmVjdG9yIGdldEVsZW1lbnRzQnlOYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgVmVjdG9yIHZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLSAgICBFbnVtZXJhdGlvbiBlID0gZkVsZW1lbnRzLmtleXMoKTsKLSAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSl7Ci0gICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpZS5uZXh0RWxlbWVudCgpOwotICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHZlY3Rvci5hZGRFbGVtZW50KGVsZW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gdmVjdG9yOwotICB9Ci0KLSAKLQotICBwdWJsaWMgYm9vbGVhbiBhZGRFbGVtZW50ICggRWxlbWVudCBlbGVtZW50ICkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE1vZGVsKCkgIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgIGZFbGVtZW50cy5wdXQoZWxlbWVudCxlbGVtZW50KTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TW9kZWwoKSAhPSB0aGlzKSByZXR1cm4gZmFsc2U7Ci0gICAgZWxlbWVudC5kaXNjb25uZWN0QWxsKCk7Ci0gICAgaWYgKGZSb290ID09IGVsZW1lbnQpIGZSb290ID0gbnVsbDsKLSAgICByZXR1cm4gKGZFbGVtZW50cy5yZW1vdmUoZWxlbWVudCkgPT0gZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudHMuZWxlbWVudHMoKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50cy5zaXplKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKQotICB7Ci0gICAgcmV0dXJuIGZFbGVtZW50cy5jb250YWlucyhlbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgRWxlbWVudCBnZXRGaXJzdEVsZW1lbnQgKCkKLSAgewotICAgIEVudW1lcmF0aW9uIGUgPSBnZXRFbGVtZW50cygpOwotICAgIHJldHVybiAoZS5oYXNNb3JlRWxlbWVudHMoKSA/IChFbGVtZW50KWUubmV4dEVsZW1lbnQoKSA6IG51bGwpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyAoKQotICB7Ci0gICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1Byb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NjFhODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY1Byb3BlcnR5IGltcGxlbWVudHMgUHJvcGVydHkKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICBwcml2YXRlIFN0cmluZyBmTmFtZTsKLSAgcHJpdmF0ZSBPYmplY3QgZlZhbHVlOwotCi0gIHB1YmxpYyBCYXNpY1Byb3BlcnR5ICggU3RyaW5nIG5hbWUgKQotICB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIEJhc2ljUHJvcGVydHkgKCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmVmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAqIFJldHVybnMgYSBzaGFsbG93IGNsb25lIG9mIHRoaXMgPGNvZGU+UHJvcGVydHk8L2NvZGU+LgotICAqIFByb3BlcnR5IGtleSBhbmQgdmFsdWUgcmVmZXJlbmNlcyBhcmUgY2xvbmVkLAotICAqIGJ1dCB0aGUgdmFsdWUgb2JqZWN0cyB0aGVtc2VsdmVzIGFyZSBub3QgY2xvbmVkLgotICAqIEByZXR1cm4gUHJvcGVydHkgQSBuZXcgUHJvcGVydHkuCi0gICovCi0gIHB1YmxpYyBQcm9wZXJ0eSBzaGFsbG93Q2xvbmUgKCkKLSAgewotICAgIHJldHVybiBuZXcgQmFzaWNQcm9wZXJ0eShmTmFtZSxmVmFsdWUpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gZk5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZSAoIE9iamVjdCB2YWx1ZSApCi0gIHsKLSAgICBmVmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUgKCkKLSAgewotICAgIHJldHVybiBmVmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRWYWx1ZUFzU3RyaW5nICggU3RyaW5nIHZhbHVlICkKLSAgewotICAgIGZWYWx1ZSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZUFzU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gKGZWYWx1ZSAhPSBudWxsID8gZlZhbHVlLnRvU3RyaW5nKCkgOiBudWxsKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1JlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQmFzaWNSZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzMzZmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9CYXNpY1JlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCYXNpY1JlbCBpbXBsZW1lbnRzIFJlbAotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIEVsZW1lbnQgZlNvdXJjZUVsZW1lbnQ7Ci0gIHByaXZhdGUgVmVjdG9yIGZDb25uZWN0aW9uczsKLQotICBwdWJsaWMgQmFzaWNSZWwgKCBTdHJpbmcgbmFtZSwgRWxlbWVudCBzb3VyY2VFbGVtZW50ICkKLSAgewotICAgIGZOYW1lID0gbmFtZTsKLSAgICBmU291cmNlRWxlbWVudCA9IHNvdXJjZUVsZW1lbnQ7Ci0gICAgZkNvbm5lY3Rpb25zID0gbmV3IFZlY3RvcigpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpCi0gIHsKLSAgICByZXR1cm4gZk5hbWU7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBnZXRTb3VyY2VFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZlNvdXJjZUVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0VGFyZ2V0RWxlbWVudHMgKCkKLSAgewotICAgIHJldHVybiBuZXcgRWxlbWVudEVudW1lcmF0aW9uKGZDb25uZWN0aW9ucy5lbGVtZW50cygpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZUYXJnZXRFbGVtZW50cyAoKQotICB7Ci0gICAgcmV0dXJuIGZDb25uZWN0aW9ucy5zaXplKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0aW9uICggQ29ubmVjdGlvbiBjb25uZWN0aW9uICkKLSAgewotICAgIGZDb25uZWN0aW9ucy5hZGRFbGVtZW50KGNvbm5lY3Rpb24pOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29ubmVjdGlvbiAoIENvbm5lY3Rpb24gY29ubmVjdGlvbiApCi0gIHsKLSAgICByZXR1cm4gZkNvbm5lY3Rpb25zLnJlbW92ZUVsZW1lbnQoY29ubmVjdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uVG8gKCBFbGVtZW50IHRhcmdldEVsZW1lbnQgKQotICB7Ci0gICAgRW51bWVyYXRpb24gZSA9IGZDb25uZWN0aW9ucy5lbGVtZW50cygpOwotICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIENvbm5lY3Rpb24gYyA9IChDb25uZWN0aW9uKWUubmV4dEVsZW1lbnQoKTsKLSAgICAgIGlmIChjLmdldEVsZW1lbnQoKSA9PSB0YXJnZXRFbGVtZW50KSByZXR1cm4gYzsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpCi0gIHsKLSAgICByZXR1cm4gZ2V0TmFtZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBFbGVtZW50RW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbgotICB7Ci0gICAgcHJpdmF0ZSBFbnVtZXJhdGlvbiBmQ29ubmVjdGlvbkVudW1lcmF0aW9uOwotCi0gICAgcHVibGljIEVsZW1lbnRFbnVtZXJhdGlvbiAoIEVudW1lcmF0aW9uIGNvbm5lY3Rpb25FbnVtZXJhdGlvbiApCi0gICAgewotICAgICAgZkNvbm5lY3Rpb25FbnVtZXJhdGlvbiA9IGNvbm5lY3Rpb25FbnVtZXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMgKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZkNvbm5lY3Rpb25FbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50ICgpCi0gICAgewotICAgICAgcmV0dXJuICgoQ29ubmVjdGlvbilmQ29ubmVjdGlvbkVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpLmdldEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQ29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDYyNzBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIGEgY29ubmVjdGlvbiB0aGF0IHRpZXMgYSBSZWwgdG8gYSBOb2RlLgotKiBOb3JtYWxseSBDb25uZWN0aW9uIG9iamVjdHMgYXJlIG1hbnVmYWN0dXJlZCBhbmQgbWFuYWdlZCB3aXRoaW4gdGhlCi0qIGRlcml2ZWQgY2xhc3NlcyBvZiB0aGUgTW9kZWwgZnJhbWV3b3JrLCBhbmQgYXJlIG5vdCBtYW5pcHVsYXRlZCBieQotKiB0aGUgY2FsbGVyIGRpcmVjdGx5LgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIFJlbCB0aGF0IG93bnMgdGhpcyBjb25uZWN0aW9uLgotICAqIEByZXR1cm4gUmVsIFRoZSBSZWwgdGhhdCBvd25zIHRoaXMgY29ubmVjdGlvbi4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIG51bGwsIHRoYXQgaXMsIGEgQ29ubmVjdGlvbgotICAqIGNhbm5vdCBleGlzdCB3aXRob3V0IGEgUmVsIHRvIG93biBpdC4KLSAgKi8KLSAgcHVibGljIFJlbCBnZXRSZWwgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgTm9kZSB0aGF0IHRoaXMgY29ubmVjdGlvbiBwb2ludHMgdG8uCi0gICogQHJldHVybiBOb2RlIFRoZSBOb2RlIHRoaXMgY29ubmVjdGlvbiBwb2ludHMgdG8uCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLCB0aGF0IGlzLCBhIENvbm5lY3Rpb24KLSAgKiBjYW5ub3QgZXhpc3Qgd2l0aG91dCBhIE5vZGUgdG8gcG9pbnQgdG8uCi0gICovCi0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgb3Bwb3NpbmcgY29ubmVjdGlvbiB0byB0aGlzIGNvbm5lY3Rpb24uCi0gICogQ29ubmVjdGlvbiBvYmplY3RzIGFsd2F5cyBleGlzdCBpbiBwYWlycywgdGhhdCBpcywKLSAgKiBpZiBub2RlICJQYXJlbnQiIGhhcyBhIHJlbGF0aW9uc2hpcCBuYW1lZCAiQ2hpbGRyZW4iCi0gICogY29udGFpbmluZyBhIGNvbm5lY3Rpb24gdG8gbm9kZSAiQ2hpbGQiLCB0aGVuIHRoZXJlCi0gICogbXVzdCBleGlzdCBhbiBvcHBvc2luZyBjb25uZWN0aW9uIGZyb20gIkNoaWxkIiB0bwotICAqICJQYXJlbnQiIGluIHNvbWUgcmVsYXRpb25zaGlwIG9mICJDaGlsZCIgKGZvciBleGFtcGxlLAotICAqIGluIGEgcmVsYXRpb25zaGlwIGNhbGxlZCAiUGFyZW50cyIpLgotICAqIEByZXR1cm4gQ29ubmVjdGlvbiBUaGUgb3Bwb3NpbmcgY29ubmVjdGlvbi4KLSAgKiBBcyBhIGdlbmVyYWwgcnVsZSwgdGhpcyBtZXRob2Qgc2hvdWxkIG5ldmVyIHJldHVybiBudWxsLgotICAqIEl0IG1heSBvbmx5IHJldHVybiBudWxsIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlIHBhaXIKLSAgKiBvZiBjb25uZWN0aW9ucy4KLSAgKi8KLSAgcHVibGljIENvbm5lY3Rpb24gZ2V0T3Bwb3NpbmdDb25uZWN0aW9uICgpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzcyMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIGVsZW1lbnRzIHRoYXQgY2FuIGJlIG1hbmFnZWQgYnkgYSBNb2RlbC4KLSogRXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLCBhIHNldCBvZiBwcm9wZXJ0aWVzLCBhbmQgYSBzZXQgb2YgcmVsYXRpb25zaGlwcwotKiB0byBvdGhlciBlbGVtZW50cy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyA8Y29kZT5FbGVtZW50PC9jb2RlPgotICAqIG9mIHRoZSBzYW1lIGNsYXNzIGFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIG1vZGVsLAotICAqIGJ1dCB3aXRoIG5vIFByb3BlcnRpZXMsIFJlbHMgb3IgTGlzdGVuZXJzIGV4Y2VwdCBmb3IKLSAgKiB0aGUge0BsaW5rIFByb3BlcnR5I05BTUUgTkFNRX0gcHJvcGVydHkuCi0gICogQHJldHVybiBPYmplY3QgQSBuZXcgRWxlbWVudC4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgc2hhbGxvd0Nsb25lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIDxjb2RlPkVsZW1lbnQ8L2NvZGU+Ci0gICogb2YgdGhlIHNhbWUgY2xhc3MgYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbW9kZWwKLSAgKiBhbmQgd2l0aCBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIEVsZW1lbnQncyBQcm9wZXJ0aWVzLgotICAqIFRoZSBSZWxzIGFuZCBMaXN0ZW5lcnMgYXJlIG5vdCBjbG9uZWQuCi0gICogQHJldHVybiBFbGVtZW50IEEgbmV3IEVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBFbGVtZW50IGRlZXBDbG9uZSAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGlzIGVsZW1lbnQgYmVsb25ncyB0bywgb3IgbnVsbCBpZiB0aGUgZWxlbWVudAotICAqIGhhcyBub3QgYmVlbiBhZGRlZCB0byBhIG1vZGVsLiBTZWUgYWxzbyB7QGxpbmsgI2lzVmFsaWQgaXNWYWxpZCgpfS4KLSAgKiBAcmV0dXJuIE1vZGVsIFRoZSBtb2RlbCB0aGlzIGVsZW1lbnQgYmVsb25ncyB0bywgb3IgbnVsbCBpZiBub25lLgotICAqLwotICBwdWJsaWMgTW9kZWwgZ2V0TW9kZWwgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgZWxlbWVudCBiZWxvbmdzIHRvIGEgbW9kZWwuCi0gICogU2VlIGFsc28ge0BsaW5rICNnZXRNb2RlbCBnZXRNb2RlbCgpfS4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBhbmQgb25seSBpZiB0aGlzIGVsZW1lbnQgYmVsb25ncyB0byBhIG1vZGVsLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkICgpOwotCi0gIC8qKgotICAqIFJlbW92ZXMgdGhpcyBlbGVtZW50IGZyb20gdGhlIG1vZGVsIHRvIHdoaWNoIGl0IGN1cnJlbnRseSBiZWxvbmdzLgotICAqIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QsIHtAbGluayAjZ2V0TW9kZWwgZ2V0TW9kZWwoKX0gd2lsbCByZXR1cm4KLSAgKiBudWxsIGFuZCB7QGxpbmsgI2lzVmFsaWQgaXNWYWxpZCgpfSB3aWxsIHJldHVybiBmYWxzZS4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgZWxlbWVudCB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZnJvbQotICAqIGl0cyBtb2RlbC4gVGhpcyBtZXRob2QgcmV0dXJucyBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBiZWxvbmcKLSAgKiB0byBhbnkgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZSAoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudCBhbmQgdXBkYXRlcyB0aGUgIm5hbWUiIHByb3BlcnR5LgotICAqIEV2ZXJ5IGVsZW1lbnQgaW5jbHVkZXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIChzZWUgUHJvcGVydHkuTkFNRSkKLSAgKiB3aG9zZSB2YWx1ZSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgcGFzc2VkIGludG8gc2V0TmFtZSgpLgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZSAoIFN0cmluZyBuYW1lICk7Ci0KLSAgLyoqCi0gICoKLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIgKCBFbGVtZW50TGlzdGVuZXIgbGlzdGVuZXIgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotICAvKioKLSAgKiBBZGRzIG9yIHNldHMgYSBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQuCi0gICogUHJvcGVydGllcyBzZXQgdXNpbmcgdGhpcyBtZXRob2QgY2FuIGJlIHJldHJpZXZlZCB1c2luZyBlaXRoZXIKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5IGdldFByb3BlcnR5KCl9IG9yCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eUFzT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QoKX0uCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfS4KLSAgKiBBbnkgcHJldmlvdXMgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIHJlcGxhY2VkLgotICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gc2V0LgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eSAoIFByb3BlcnR5IHByb3BlcnR5ICk7Ci0KLSAgLyoqCi0gICogQWRkcyBvciBzZXRzIGEgcHJvcGVydHkgb2YgdGhpcyBlbGVtZW50LgotICAqIFByb3BlcnRpZXMgc2V0IHVzaW5nIHRoaXMgbWV0aG9kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgZWl0aGVyCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eSBnZXRQcm9wZXJ0eSgpfSBvcgotICAqIHtAbGluayAjZ2V0UHJvcGVydHlBc09iamVjdCBnZXRQcm9wZXJ0eUFzT2JqZWN0KCl9LgotICAqIEV2ZXJ5IGVsZW1lbnQgaW5jbHVkZXMgYSBwcm9wZXJ0eSBjYWxsZWQgIm5hbWUiIChzZWUgUHJvcGVydHkuTkFNRSkKLSAgKiB3aG9zZSB2YWx1ZSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgcGFzc2VkIGludG8ge0BsaW5rICNzZXROYW1lIHNldE5hbWUoKX0uCi0gICogQW55IHByZXZpb3VzIHByb3BlcnR5IHdpdGggdGhlIHNhbWUgbmFtZSBpcyByZXBsYWNlZC4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgotICAqIEBwYXJhbSB2YWx1ZSBUaGUgT2JqZWN0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5QXNPYmplY3QgKCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlICk7Ci0KLSAgLyoqCi0gICogQWRkcyBvciBzZXRzIGEgU3RyaW5nIHByb3BlcnR5IG9mIHRoaXMgZWxlbWVudC4KLSAgKiBQcm9wZXJ0aWVzIHNldCB1c2luZyB0aGlzIG1ldGhvZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIGVpdGhlcgotICAqIHtAbGluayAjZ2V0UHJvcGVydHkgZ2V0UHJvcGVydHkoKX0sCi0gICoge0BsaW5rICNnZXRQcm9wZXJ0eUFzT2JqZWN0IGdldFByb3BlcnR5QXNPYmplY3QoKX0gb3IKLSAgKiB7QGxpbmsgI2dldFByb3BlcnR5QXNTdHJpbmcgZ2V0UHJvcGVydHlBc1N0cmluZygpfS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEFueSBwcmV2aW91cyBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgcmVwbGFjZWQuCi0gICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KLSAgKiBAcGFyYW0gdmFsdWUgVGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUFzU3RyaW5nICggU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfS4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0dXJuLgotICAqIEByZXR1cm4gUHJvcGVydHkgVGhlIHByb3BlcnR5LCBvciBudWxsIGlmIG5vbmUuCi0gICovCi0gIHB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eSAoIFN0cmluZyBuYW1lICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgT2JqZWN0IHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgb3IgbnVsbAotICAqIGlmIHRoZXJlIGlzIG5vbmUuCi0gICogRXZlcnkgZWxlbWVudCBpbmNsdWRlcyBhIHByb3BlcnR5IGNhbGxlZCAibmFtZSIgKHNlZSBQcm9wZXJ0eS5OQU1FKQotICAqIHdob3NlIHZhbHVlIGlzIHRoZSBzYW1lIHN0cmluZyBhcyBwYXNzZWQgaW50byB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfS4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmV0dXJuLgotICAqIEByZXR1cm4gT2JqZWN0IFRoZSBwcm9wZXJ0eSB2YWx1ZSBhcyBhbiBPYmplY3QsIG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eUFzT2JqZWN0ICggU3RyaW5nIG5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgb2YgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBvciBudWxsCi0gICogaWYgdGhlcmUgaXMgbm9uZS4KLSAgKiBFdmVyeSBlbGVtZW50IGluY2x1ZGVzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiAoc2VlIFByb3BlcnR5Lk5BTUUpCi0gICogd2hvc2UgdmFsdWUgaXMgdGhlIHNhbWUgc3RyaW5nIGFzIHBhc3NlZCBpbnRvIHtAbGluayAjc2V0TmFtZSBzZXROYW1lKCl9LgotICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXR1cm4uCi0gICogQHJldHVybiBTdHJpbmcgVGhlIHByb3BlcnR5IHZhbHVlIGFzIGEgU3RyaW5nLCBvciBudWxsIGlmIG5vbmUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlBc1N0cmluZyAoIFN0cmluZyBuYW1lICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiB0aGlzIGVsZW1lbnQuCi0gICogVGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IG9uZSBwcm9wZXJ0eSB0aGF0IGNhcnJpZXMgdGhlCi0gICogbmFtZSBvZiB0aGlzIGVsZW1lbnQgKHNlZSB7QGxpbmsgI3NldE5hbWUgc2V0TmFtZSgpfSkuCi0gICogQHJldHVybiBFbnVtZXJhdGlvbiBBbiBlbnVtZXJhdGlvbiBvZiBhbGwgcHJvcGVydGllcyBvZiB0aGlzIGVsZW1lbnQuCi0gICovCi0gIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRQcm9wZXJ0aWVzICgpOwotCi0gIC8qKgotICAqIENyZWF0ZXMgYSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgZWxlbWVudCBhbmQgYW5vdGhlci4KLSAgKiBCb3RoIHJlbGF0aW9uc2hpcHMgYXJlIGlkZW50aWZpZWQgYnkgbmFtZXMuIFRoZSBuYW1lcyBvZiBhbGwgdGhlCi0gICogb3V0Ym91bmQgcmVsYXRpb25zaGlwcyBvZiBhIGVsZW1lbnQgbXVzdCBiZSBtdXR1YWxseSB1bmlxdWUuCi0gICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gY29ubmVjdCB0by4KLSAgKiBAcGFyYW0gb3V0Ym91bmRSZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgdG8gY29udGFpbiB0aGUKLSAgKiBjb25uZWN0aW9uIHRvIHRoZSBlbGVtZW50LgotICAqIEBwYXJhbSBpbmJvdW5kUmVsTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIHRvIGNvbnRhaW4gdGhlCi0gICogaW52ZXJzZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhpcyBlbGVtZW50LgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIEJvdGggZWxlbWVudHMgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgbW9kZWwsIG90aGVyIGZhbHNlIGlzIHJldHVybmVkLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0ICggRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lLCBTdHJpbmcgaW5ib3VuZFJlbE5hbWUgKTsKLQotICAvKioKLSAgKiBEaXNtYW50bGVzIHRoZSBjb25uZWN0aW9uIHRvIGFub3RoZXIgZWxlbWVudCBpbiBhIGdpdmVuIHJlbGF0aW9uc2hpcC4KLSAgKiBUaGUgaW52ZXJzZSBjb25uZWN0aW9uIGlzIGFsc28gYXV0b21hdGljYWxseSBkaXNtYW50bGVkLgotICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGRpc2Nvbm5lY3QgZnJvbS4KLSAgKiBAcGFyYW0gb3V0Ym91bmRSZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgY29udGFpbmluZwotICAqIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBlbGVtZW50LgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIEJvdGggZWxlbWVudHMgbXVzdCBiZWxvbmcgdG8gdGhlIHNhbWUgbW9kZWwsIG90aGVyIGZhbHNlIGlzIHJldHVybmVkLgotICAqIElmIHRoZSBlbGVtZW50cyBhcmUgbm90IGNvbm5lY3RlZCB0aHJvdWdoIHRoZSBnaXZlbiByZWxhdGlvbnNoaXAsIHRoZW4KLSAgKiBmYWxzZSBpcyByZXR1cm5lZC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdCAoIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG91dGJvdW5kUmVsTmFtZSApOwotCi0gIC8qKgotICAqIERpc21hbnRsZXMgdGhlIGNvbm5lY3Rpb24gdG8gYWxsIGVsZW1lbnRzIGluIHRoZSBnaXZlbiByZWxhdGlvbnNoaXAuCi0gICogVGhlIGludmVyc2UgY29ubmVjdGlvbnMgYXJlIGFsc28gYXV0b21hdGljYWxseSBkaXNtYW50bGVkLgotICAqIEBwYXJhbSBvdXRib3VuZFJlbE5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiBhbGwgY29ubmVjdGlvbnMgYXJlIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgYmVsb25nIHRvIGEgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3RSZWwgKCBTdHJpbmcgb3V0Ym91bmRSZWxOYW1lICk7Ci0KLSAgLyoqCi0gICogRGlzbWFudGxlcyBhbGwgY29ubmVjdGlvbnMgZnJvbSB0aGlzIGVsZW1lbnQuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgYWxsIGNvbm5lY3Rpb25zIGFyZSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KLSAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGJlbG9uZyB0byBhIG1vZGVsLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0QWxsICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIGVsZW1lbnRzCi0gICogY29ubmVjdGVkIHRocnUgdGhlIGdpdmVuIHJlbGF0aW9uc2hpcC4KLSAgKiBAcGFyYW0gcmVsTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gVGhlIGVsZW1lbnRzIGluIHRoZSByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RWxlbWVudHMgKCBTdHJpbmcgcmVsTmFtZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gcmVsYXRpb25zaGlwLgotICAqIEBwYXJhbSByZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBpbnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcmVsYXRpb25zaGlwLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KLSAgKi8KLQotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TGlzdGVuZXJzKCk7Ci0KLSAgcHVibGljIGludCBnZXROdW1iZXJPZkVsZW1lbnRzICggU3RyaW5nIHJlbE5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSByZWxhdGlvbnNoaXAgb2JqZWN0IG9mIHRoZSBnaXZlbiBuYW1lLgotICAqIEBwYXJhbSByZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gICogQHJldHVybiBpbnQgVGhlIHJlbGF0aW9uc2hpcC4gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqIEluIG90aGVyIHdvcmRzLCBhbnkgcmVmZXJlbmNlIHRvIGEgcmVsYXRpb25zaGlwIG5hbWUgYXV0b21hdGljYWxseQotICAqIGJyaW5ncyBhIGNvcnJlc3BvbmRpbmcgUmVsIG9iamVjdCBpbnRvIGV4aXN0ZW5jZS4gQ2FyZWxlc3MgbmFtaW5nCi0gICogbWF5IHJlc3VsdCBpbiB0aGUge0BsaW5rICNnZXRSZWxzIGdldFJlbHMoKX0gbWV0aG9kIHJldHVybmluZyBhbiBlbnVtZXJhdGlvbiBvZgotICAqIG1vcmUgcmVsYXRpb25zaGlwcyB0aGFuIHdvdWxkIGJlIG1lYW5pbmdmdWwsIGVmZmljaWVudCBvciB1c2VmdWwuCi0gICovCi0gIHB1YmxpYyBSZWwgZ2V0UmVsICggU3RyaW5nIHJlbE5hbWUgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBrbm93biByZWxhdGlvbnNoaXBzLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gVGhlIG91dGJvdW5kIHJlbGF0aW9uc2hpcHMgb2YgdGhlIGVsZW1lbnQuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UmVscyAoKTsKLQotCi0gIC8qCi0gICogVGhlcmUgaXMgYSBuZWVkIHNvbWV0aW1lcyBmb3IgZWFjaCBlbGVtZW50IGluIGEgbW9kZWwgdG8gaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyLgotICAqIE5vcm1hbGx5IHRoaXMgd291bGQgYmUgbGVmdCB0byBhIG5hbWUsIGJ1dCBzaW5jZSB0aGUgZWxlbWVudCBtYWtlciBnaXZlcyBpdCBpdHMgbmFtZQotICAqIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQgYSBtb2RlbCBjb3VsZCBoYXZlIHR3byBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUuIElmIHRoZXkgCi0gICogYXJlIHRoZSBzYW1lIGVsZW1lbnQgdHlwZSB0aGVuIHRoZXJlIHdvdWxkIGJlIG5vIHdheSB0byBkaWZmZXJlbmNpYXRlIGJldHdlZW4gdGhlIHR3by4KLSAgKiBUaGUgZm9sbG93aW5nIGdldHRlciBhbmQgc2V0dGVyIHdpbGwgcHJvdmlkZSBhIHVuaXF1ZSBpZGVudGlmaWVyLiBUaGlzIGlkZW50aWZpZXIgd2lsbCBiZSBrbm93biAKLSAgKiBhcyB0aGUgbXVpZCBvciBNb2RlbCBVbmlxdWUgSWRlbnRpZmllci4gVW5saWtlIGEgdXVpZCBpdCB3aWxsIG9ubHkgYmUgYXNzdXJlZCB1bmlxdWVuZXNzIAotICAqIHdpdGhpbiBpdHMgb3duIG1vZGVsLiBUaGUgaW50ZW50aW9uIGlzIHRvIHVzZSBhIHVuaXF1ZSBudW1iZXIgYXBwZW5kZWQgdG8gdGhlIGVuZCAKLSAgKiBvZiB0aGUgbmFtZS4KLSAgKiBUaGUgZm9sbG93aW5nIGlzIHRoZSBnZXR0ZXIKLSAgKiBAcmV0dXJuIFN0cmluZyB0aGUgdW5pcXVlIGlkZW50aWZpZXIKLSAgKi8KLQotICBwdWJsaWMgU3RyaW5nIGdldE1VSUQoKTsKLSAgCi0gIAotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0VsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMGNmZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB3aGVyZSB3ZSBzdG9yZSBhbGwgdGhlIHN0YXRlIGRhdGEgdGhhdCB2YXJpb3VzIFVJcwotKiAoc3VjaCBhcyB0aGUgTmV3V1NETENyZWF0aW9uV2l6YXJkKSBjYXB0dXJlIGZyb20gdGhlIHVzZXIKLSogYW5kIHRoZW4gbmVlZCB0byBwcm9jZXNzLgotKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIEVsZW1lbnRMaXN0ZW5lcgotewotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgdmFsdWUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5QWRkZWQgKCBQcm9wZXJ0eUFkZEV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpbiB0aGUgbW9kZWwgY2hhbmdlcy4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSwgb2xkIHZhbHVlCi0gICogYW5kIG5ldyB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkICggUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCApCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaW4gdGhlIG1vZGVsIGlzIHJlbW92ZWQuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIG9sZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkICggUHJvcGVydHlSZW1vdmVFdmVudCBldmVudCApCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcmVsQWRkZWQgKCBSZWxBZGRFdmVudCBldmVudCApCi0gIHsKLSAgfQotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcmVsUmVtb3ZlZCAoIFJlbFJlbW92ZUV2ZW50IGV2ZW50ICkKLSAgewotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL0VsZW1lbnRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODE5ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvRWxlbWVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIFRoaXMgaXMgd2hlcmUgd2Ugc3RvcmUgYWxsIHRoZSBzdGF0ZSBkYXRhIHRoYXQgdmFyaW91cyBVSXMKLSogKHN1Y2ggYXMgdGhlIE5ld1dTRExDcmVhdGlvbldpemFyZCkgY2FwdHVyZSBmcm9tIHRoZSB1c2VyCi0qIGFuZCB0aGVuIG5lZWQgdG8gcHJvY2Vzcy4KLSovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRMaXN0ZW5lcgotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5IGFuZCB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgcHJvcGVydHlBZGRlZCAoIFByb3BlcnR5QWRkRXZlbnQgZXZlbnQgKTsKLQotICAvKioKLSAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGluIHRoZSBtb2RlbCBjaGFuZ2VzLgotICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgY29udGFpbmluZyB0aGUgbW9kZWwsIHByb3BlcnR5LCBvbGQgdmFsdWUKLSAgKiBhbmQgbmV3IHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQgKCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ICk7Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpbiB0aGUgbW9kZWwgaXMgcmVtb3ZlZC4KLSAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1vZGVsLCBwcm9wZXJ0eSBhbmQgb2xkIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQgKCBQcm9wZXJ0eVJlbW92ZUV2ZW50IGV2ZW50ICk7Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCByZWxBZGRlZCAoIFJlbEFkZEV2ZW50IGV2ZW50ICk7Ci0KLSAgLyoqCi0gICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBpcyBhZGRlZCB0byB0aGUgbW9kZWwuCi0gICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCBjb250YWluaW5nIHRoZSBtb2RlbCwgcHJvcGVydHkgYW5kIHZhbHVlLgotICAqLwotICBwdWJsaWMgdm9pZCByZWxSZW1vdmVkICggUmVsUmVtb3ZlRXZlbnQgZXZlbnQgKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjI5N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIGEgc2ltcGxlIGRhdGEgbW9kZWwgY29uc2lzdGluZyBvZgotKiBhIG5ldHdvcmsgb2YgbmFtZWQgbm9kZXMgKGNsYXNzIE5vZGUpLiBFdmVyeSBub2RlIGNhcnJpZXMgYSBzZXQKLSogb2YgbmFtZWQgcHJvcGVydGllcyAoY2xhc3MgUHJvcGVydHkpLiBOb2RlcyBhcmUgaW50ZXJyZWxhdGVkIGJ5Ci0qIHJlbGF0aW9uc2hpcHMgKGNsYXNzIFJlbCkgYW5kIGNvbm5lY3Rpb25zIChjbGFzcyBDb25uZWN0aW9uKS4KLSogRWFjaCBNb2RlbCBrZWVwcyBhIHJlZ2lzdHJ5IG9mIGFsbCBvZiBpdHMgbm9kZXMsIGFuZCBrZWVwcyBhCi0qIHJlZmVyZW5jZSB0byBvbmUgInJvb3QiIG5vZGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHN0YXJ0aW5nCi0qIHBvaW50IGZvciBuYXZpZ2F0aW9uLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWwKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtb2RlbC4KLSAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kZWwuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUgKCBTdHJpbmcgbmFtZSApOwotCi0gIC8qKgotICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIG1vZGVsLgotICAqIEByZXR1cm4gU3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtb2RlbC4gVGhpcyBtdXN0IG5vdCBiZSBudWxsLgotICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUgKCk7Ci0KLSAgLyoqCi0gICogU2V0cyBhIG5vZGUgYXMgdGhlIHJvb3Qgb2YgdGhlIG1vZGVsLiBJZiB0aGUgbm9kZSBkb2VzIG5vdAotICAqIGJlbG9uZyB0byBhIG1vZGVsLCB0aGVuIGl0IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkuIElmIHRoZQotICAqIG5vZGUgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIgbW9kZWwsIHRoZW4gdGhlIHJvb3Qgbm9kZQotICAqIGlzIG5vdCBzZXQgYW5kIG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAqIEBwYXJhbSByb290IFRoZSBub2RlIHRvIHNldCBhcyB0aGUgcm9vdC4gVGhlIG5vZGUgbXVzdAotICAqIGJlbG9uZyBlaXRoZXIgdG8gdGhpcyBtb2RlbCBvciB0byBubyBtb2RlbC4gVGhpcyBtdXN0Ci0gICogbm90IGJlIG51bGwuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgdGhlIG5vZGUgd2FzIHNldCBhcyB0aGUgcm9vdC4KLSAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmIHRoZSBnaXZlbiBub2RlIGFscmVhZHkgYmVsb25ncwotICAqIHRvIGFub3RoZXIgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHNldFJvb3RFbGVtZW50ICggRWxlbWVudCByb290ICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgcm9vdCBub2RlLiBUaGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyBhIG5vZGUKLSAgKiBleGNlcHQgb24gYW4gZW1wdHkgTW9kZWwuIElmIHNldFJvb3ROb2RlKCkgaGFzIG5vdCBiZWVuCi0gICogY2FsbGVkLCBvciBpZiB0aGUgbGFzdCByb290IG5vZGUgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbW9kZWwsCi0gICogdGhlbiB0aGUgbWV0aG9kIHdpbGwgc2VsZWN0IGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IG5vZGUgYXMKLSAgKiB0aGUgcm9vdC4gVGhpcyBtZXRob2Qgd2lsbCBjb25zaXN0ZW50bHkgcmV0dXJuIHRoZSBzYW1lIG5vZGUKLSAgKiB1bnRpbCBlaXRoZXIKLSAgKiAoYSkgc2V0Um9vdE5vZGUoKSBpcyBjYWxsZWQgd2l0aCBhIGRpZmZlcmVudCBub2RlIG9yCi0gICogKGIpIHJlbW92ZU5vZGUoKSBpcyBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIG1vZGVsLgotICAqIEByZXR1cm4gTm9kZSBUaGUgY3VycmVudCByb290IG5vZGUsIG9yIG51bGwgaWYgdGhlIG1vZGVsIGlzIGVtcHR5LgotICAqLwotCi0gIHB1YmxpYyBFbGVtZW50IGdldFJvb3RFbGVtZW50ICgpOwotCi0gIC8qKgotICAqIEdldCB0aGUgZWxlbWVudHMgdGhhdCBoYXZlIHRoaXMgbmFtZQotICAqIEBwYXJhbSBTdHJpbmcgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCAKLSAgKiBAcmV0dXJuIFZlY3RvciBhIHZlY3RvciBvZiBlbGVtZW50cyB0aGF0IGhhdmUgdGhpcyBuYW1lCi0gICogVGhlc2UgZWxlbWVudHMgbWF5IGJlIG9mIGRpZmZlcmVudCB0eXBlcwotICAqKi8KLQotICBwdWJsaWMgVmVjdG9yIGdldEVsZW1lbnRzQnlOYW1lKFN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgKiBBZGRzIGEgbm9kZSB0byB0aGUgbW9kZWwuIElmIHRoZSBub2RlIGFscmVhZHkgYmVsb25ncyB0byBhbm90aGVyCi0gICogbW9kZWwgdGhlbiBpdCB3aWxsIG5vdCBiZSBhZGRlZC4KLSAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBhZGQuIFRoaXMgbXVzdCBub3QgYmUgbnVsbC4KLSAgKiBAcmV0dXJuIGJvb2xlYW4gVHJ1ZSBpZiB0aGUgbm9kZSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5LgotICAqIFRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIG5vZGUgYWxyZWFkeSBiZWxvbmdzIHRvCi0gICogdGhlIGN1cnJlbnQgbW9kZWwgb3IgdG8gYW5vdGhlciBtb2RlbC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gYWRkRWxlbWVudCAoIEVsZW1lbnQgZWxlbWVudCApOwotCi0gIC8qKgotICAqIFJlbW92ZXMgYSBub2RlIGZyb20gdGhlIG1vZGVsLgotICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIHJlbW92ZS4gVGhpcyBtdXN0IG5vdCBiZSBudWxsLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBub2RlIHdhcyByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KLSAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlIGlmIHRoZSBnaXZlbiBub2RlIGRvZXMgbm90IGJlbG9uZwotICAqIHRvIHRoaXMgbW9kZWwuCi0gICovCi0gIHB1YmxpYyBib29sZWFuIHJlbW92ZUVsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCBub2RlcyBpbiB0aGUgbW9kZWwgYW5kIGluIG5vCi0gICogcGFydGljdWxhciBvcmRlciwKLSAgKiBAcmV0dXJuIEVudW1lcmF0aW9uIEFuIGVudW1lcmF0aW9uIG9mIGFsbCBub2RlcyBpbiB0aGUgbW9kZWwuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLgotICAqLwotICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0RWxlbWVudHMgKCk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBtb2RlbC4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBtb2RlbC4KLSAgKiBUaGlzIG1ldGhvZCBuZXZlciByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUuCi0gICovCi0gIHB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZFbGVtZW50cyAoKTsKLQotICAvKioKLSAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgbW9kZWwgY29udGFpbnMgdGhlIGdpdmVuIG5vZGUuCi0gICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gY2hlY2sgZm9yLiBUaGlzIG11c3Qgbm90IGJlIG51bGwuCi0gICogQHJldHVybiBib29sZWFuIFRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBub2RlLgotICAqLwotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0VsZW1lbnQgKCBFbGVtZW50IGVsZW1lbnQgKTsKLQotICAvKgotICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm92aWRlIHRoZSBuZXh0IG51bWJlciBpbiB0aGUgcXVldWUgZm9yIHRoZSBNVUlECi0gICoKLSAgKi8KLSAgcHVibGljIGludCBnZXRVbmlxdWVOdW1iZXIoKTsKLQotICAvKgotICAqIGhlcmVzIHdoYXQgd2UgY2FsbCBmcm9tIHRoZSBlbGVtZW50Ci0gICovCi0gIHB1YmxpYyBTdHJpbmcgbWFrZU1VSUQoU3RyaW5nIG5hbWUpOwotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzkzYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogVGhpcyBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIHByb3BlcnRpZXMgb2YgYSBOb2RlLgotKiBFdmVyeSBwcm9wZXJ0eSBoYXMgYW4gaW1tdXRhYmxlIG5hbWUgYW5kIGEgdmFsdWUgb2YgdHlwZSBPYmplY3QuCi0qLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eQotewotCi0gIC8vIENvcHlyaWdodAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAqIEV2ZXJ5IE5vZGUgaGFzIGEgcHJvcGVydHkgY2FsbGVkICJuYW1lIiB0aGF0IGlzIGVxdWl2YWxlbnQKLSAgKiB0byBhbmQga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBOb2RlLmdldE5hbWUoKSBhbmQgTm9kZS5zZXROYW1lKCkuCi0gICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhpcyA8Y29kZT5Qcm9wZXJ0eTwvY29kZT4uCi0gICogUHJvcGVydHkga2V5IGFuZCB2YWx1ZSByZWZlcmVuY2VzIGFyZSBjbG9uZWQsCi0gICogYnV0IHRoZSB2YWx1ZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCi0gICogQHJldHVybiBQcm9wZXJ0eSBBIG5ldyBQcm9wZXJ0eS4KLSAgKi8KLSAgcHVibGljIFByb3BlcnR5IHNoYWxsb3dDbG9uZSAoKTsKLQotICAvKioKLSAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbm9kZS4KLSAgKiBAcmV0dXJuIFN0cmluZyBUaGUgbmFtZSBvZiB0aGlzIG5vZGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSAoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LgotICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LiBBbnkgcHJldmlvdXMgdmFsdWUgaXMgcmVwbGFjZWQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbHVlICggT2JqZWN0IHZhbHVlICk7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgKiBAcmV0dXJuIE9iamVjdCBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSwgcG9zc2libHkgbnVsbC4KLSAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSAoKTsKLQotICAvKioKLSAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGFzIGEgc3RyaW5nLgotICAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHNldC4gQW55IHByZXZpb3VzIHZhbHVlIGlzIHJlcGxhY2VkLgotICAqIFRoZSB0eXBlIG9mIHRoZSBwcmV2aW91cyB2YWx1ZSwgaWYgYW55LCBpcyBvZiBubyBjb25zZXF1ZW5jZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsdWVBc1N0cmluZyAoIFN0cmluZyB2YWx1ZSApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYXMgYSBzdHJpbmcuCi0gICogQHJldHVybiBTdHJpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYXMgYSBzdHJpbmcsIHBvc3NpYmx5IG51bGwuCi0gICogSWYgdGhlIHNldCB2YWx1ZSBpcyBhbiBhcmJpdHJhcnkgT2JqZWN0LCB0aGVuIE9iamVjdC50b1N0cmluZygpIGlzCi0gICogcmV0dXJuZWQuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVBc1N0cmluZyAoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5QWRkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5QWRkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJmYzA1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eUFkZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIENhcnJpZXMgZGF0YSByZWxldmFudCB0byB3aGVuIGEgcHJvcGVydHkgaXMgYWRkZWQgdG8gdGhlIG1vZGVsLgotKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUFkZEV2ZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIG1vZGVsIHRoZSBjaGFuZ2VkLgotICAqLwotICBwcm90ZWN0ZWQgQmFzaWNFbGVtZW50IGZFbGVtZW50OwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZQcm9wZXJ0eTsKLQotIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlBZGRFdmVudCAoIEJhc2ljRWxlbWVudCBlbGVtZW50LCBQcm9wZXJ0eSBwcm9wZXJ0eSkKLSAgewotICAgIGZFbGVtZW50ID0gZWxlbWVudDsKLSAgICBmUHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQgKHRoYXQgcHJvZHVjZWQgdGhpcyBldmVudCkuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgQmFzaWNFbGVtZW50IGdldEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKi8KLSAgcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5ICgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnR5OwotICB9Ci0KLSAgCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkZTdjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmRhdGFtb2RlbDsKLQotLyoqCi0qIENhcnJpZXMgZGF0YSByZWxldmFudCB0byB3aGVuIGEgcHJvcGVydHkgaXMgY2hhbmdlZCBpbiB0aGUgbW9kZWwuCi0qLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBCYXNpY0VsZW1lbnQgZkVsZW1lbnQ7Ci0KLSAgLyoqCi0gICogVGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZQcm9wZXJ0eTsKLQotICAvKioKLSAgKiBUaGUgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICovCi0gIHByb3RlY3RlZCBQcm9wZXJ0eSBmT2xkUHJvcGVydHk7Ci0KLSAgIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgotICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLgotICAgKi8KLSAgcHVibGljIFByb3BlcnR5Q2hhbmdlRXZlbnQgKCBCYXNpY0VsZW1lbnQgZWxlbWVudCAsIFByb3BlcnR5IHByb3BlcnR5LCBQcm9wZXJ0eSBvbGRQcm9wZXJ0eSApCi0gIHsKLSAgICBmRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgZlByb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAgZk9sZFByb3BlcnR5ID0gb2xkUHJvcGVydHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgdGhhdCBjaGFuZ2VkICh0aGF0IHByb2R1Y2VkIHRoaXMgZXZlbnQpLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKi8KLSAgcHVibGljIEJhc2ljRWxlbWVudCBnZXRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLgotICAgKi8KLSAgcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5ICgpCi0gIHsKLSAgICByZXR1cm4gZlByb3BlcnR5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1vZGVsIHByb3BlcnR5J3Mgb2xkIHZhbHVlLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgcHJvcGVydHkncyBvbGQgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHkgZ2V0T2xkUHJvcGVydHkgKCkKLSAgewotICAgIHJldHVybiBmT2xkUHJvcGVydHk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlSZW1vdmVFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUHJvcGVydHlSZW1vdmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQ2OGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1Byb3BlcnR5UmVtb3ZlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZGF0YW1vZGVsOwotCi0vKioKLSogQ2FycmllcyBkYXRhIHJlbGV2YW50IHRvIHdoZW4gYSBwcm9wZXJ0eSBpcyByZW1vdmVkIGZyb20gdGhlIG1vZGVsLgotKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVJlbW92ZUV2ZW50Ci17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogVGhlIG1vZGVsIHRoZSBjaGFuZ2VkLgotICAqLwotICBwcm90ZWN0ZWQgQmFzaWNFbGVtZW50IGZFbGVtZW50OwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyByZW1vdmVkLgotICAqLwotICBwcm90ZWN0ZWQgUHJvcGVydHkgZlByb3BlcnR5OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdGhhdCB3YXMgcmVtb3ZlZC4KLSAgICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0eSdzIHZhbHVlLgotICAgKi8KLSAgcHVibGljIFByb3BlcnR5UmVtb3ZlRXZlbnQgKCBCYXNpY0VsZW1lbnQgZWxlbWVudCwgUHJvcGVydHkgcHJvcGVydHkpCi0gIHsKLSAgICBmRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgZlByb3BlcnR5ID0gcHJvcGVydHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgdGhhdCBjaGFuZ2VkICh0aGF0IHByb2R1Y2VkIHRoaXMgZXZlbnQpLgotICAgKiBAcmV0dXJuIFRpbnlNb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKi8KLSAgcHVibGljIEJhc2ljRWxlbWVudCBnZXRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZkVsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbW9kZWwgcHJvcGVydHkgdGhhdCB3YXMgcmVtb3ZlZC4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIHByb3BlcnR5IHRoYXQgd2FzIHJlbW92ZWQuCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkgKCkKLSAgewotICAgIHJldHVybiBmUHJvcGVydHk7Ci0gIH0KLQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9SZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFhNmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLS8qKgotKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBjbGFzcyBmb3IgcmVsYXRpb25zaGlwcyBpbiBhIE1vZGVsLgotKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsCi17Ci0KLSAgLy8gQ29weXJpZ2h0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAwLCAyMDAyLiI7Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHJlbGF0aW9uc2hpcC4gUmVsYXRpb25zaGlwIG5hbWVzCi0gICogY2Fubm90IGJlIGNoYW5nZWQuCi0gICogQHJldHVybiBTdHJpbmcgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcC4KLSAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG5vZGUgdGhhdCBvd25zIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gTm9kZSBUaGUgbm9kZSB0aGF0IG93bnMgdGhpcyByZWxhdGlvbnNoaXAuCi0gICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsLCB0aGF0IGlzLCByZWxhdGlvbnNoaXBzCi0gICogY2Fubm90IGV4aXN0IGluIHRoZSBhYnNlbmNlIG9mIGEgbm9kZS4KLSAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0U291cmNlRWxlbWVudCgpOwotCi0gIC8qKgotICAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIG5vZGVzIGluIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIEByZXR1cm4gRW51bWVyYXRpb24gVGhlIG5vZGVzIGluIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbC4KLSAgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldFRhcmdldEVsZW1lbnRzICgpOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGlzIHJlbGF0aW9uc2hpcC4KLSAgKiBAcmV0dXJuIGludCBUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoaXMgcmVsYXRpb25zaGlwLgotICAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KLSAgKi8KLSAgcHVibGljIGludCBnZXROdW1iZXJPZlRhcmdldEVsZW1lbnRzICgpOwotCi0gIC8qKgotICAqIEFkZHMgYSBjb25uZWN0aW9uIHRvIHRoaXMgcmVsYXRpb25zaGlwLiBUaGlzIG1ldGhvZCBpcwotICAqIGludGVuZGVkIGZvciB1c2UgYnkgZGVyaXZhdGlvbnMgb2YgdGhlIE1vZGVsIGZyYW1ld29yaywKLSAgKiBub3QgYnkgdXNlcnMgb2YgdGhlIGZyYW1ld29yay4gQ29ubmVjdGlvbiBvYmplY3RzIHNob3VsZAotICAqIG9ubHkgYmUgY29uc3RydWN0ZWQsIGFkZGVkLCByZW1vdmVkIGFuZCByZXRyaWV2ZWQgYnkKLSAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIE5vZGUgYW5kIFJlbCBpbnRlcmZhY2VzLgotICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIGFkZC4KLSAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvbiAoIENvbm5lY3Rpb24gY29ubmVjdGlvbiApOwotCi0gIC8qKgotICAqIFJlbW92ZXMgYSBjb25uZWN0aW9uIGZyb20gdGhpcyByZWxhdGlvbnNoaXAuIFRoaXMgbWV0aG9kIGlzCi0gICogaW50ZW5kZWQgZm9yIHVzZSBieSBkZXJpdmF0aW9ucyBvZiB0aGUgTW9kZWwgZnJhbWV3b3JrLAotICAqIG5vdCBieSB1c2VycyBvZiB0aGUgZnJhbWV3b3JrLiBDb25uZWN0aW9uIG9iamVjdHMgc2hvdWxkCi0gICogb25seSBiZSBjb25zdHJ1Y3RlZCwgYWRkZWQsIHJlbW92ZWQgYW5kIHJldHJpZXZlZCBieQotICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgTm9kZSBhbmQgUmVsIGludGVyZmFjZXMuCi0gICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24gdG8gcmVtb3ZlLgotICAqIEByZXR1cm4gYm9vbGVhbiBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC4KLSAgKi8KLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29ubmVjdGlvbiAoIENvbm5lY3Rpb24gY29ubmVjdGlvbiApOwotCi0gIC8qKgotICAqIFJldHVybnMgdGhlIENvbm5lY3Rpb24gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gdGFyZ2V0IG5vZGUuCi0gICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSBkZXJpdmF0aW9ucyBvZiB0aGUgTW9kZWwKLSAgKiBmcmFtZXdvcmssIG5vdCBieSB1c2VycyBvZiB0aGUgZnJhbWV3b3JrLiBDb25uZWN0aW9uIG9iamVjdHMKLSAgKiBzaG91bGQgb25seSBiZSBjb25zdHJ1Y3RlZCwgYWRkZWQsIHJlbW92ZWQgYW5kIHJldHJpZXZlZCBieQotICAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgTm9kZSBhbmQgUmVsIGludGVyZmFjZXMuCi0gICogQHBhcmFtIHRhcmdldE5vZGUgVGhlIG5vZGUgdG8gZmluZCB0aGUgQ29ubmVjdGlvbiB0by4KLSAgKiBAcmV0dXJuIENvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24sIG9yIG51bGwgaWYgbm9uZS4KLSAgKi8KLSAgcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvblRvICggRWxlbWVudCB0YXJnZXRFbGVtZW50ICk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbEFkZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2RhdGFtb2RlbC9SZWxBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWExMGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbEFkZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBDYXJyaWVzIGRhdGEgcmVsZXZhbnQgdG8gd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSovCi1wdWJsaWMgY2xhc3MgUmVsQWRkRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uIGZPdXRCb3VuZDsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uIGZJbkJvdW5kOwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZQcm9wZXJ0eTsKLQotIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUmVsQWRkRXZlbnQgKENvbm5lY3Rpb25bXSBwYWlyKQotICB7Ci0gICAgIGZPdXRCb3VuZCA9IHBhaXJbQmFzaWNDb25uZWN0aW9uLk9VVEJPVU5EXTsKLSAgICAgZkluQm91bmQgPSBwYWlyW0Jhc2ljQ29ubmVjdGlvbi5JTkJPVU5EXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBvdXRib3VuZCBjb25uZWN0aW9uIHRoYXQgY2hhbmdlZCAKLSAgKiovCi0gIHB1YmxpYyBDb25uZWN0aW9uIGdldE91dEJvdW5kQ29ubmVjdGlvbiAoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbCBuYW1lIAotICAqKi8KLSAgcHVibGljIFN0cmluZyBnZXRPdXRCb3VuZFJlbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZC5nZXRSZWwoKS5nZXROYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwKLSAgKiovCi0gIHB1YmxpYyBSZWwgZ2V0T3V0Qm91bmRSZWwoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZC5nZXRSZWwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbCBuYW1lIAotICAqKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbkJvdW5kUmVsTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQuZ2V0UmVsKCkuZ2V0TmFtZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsCi0gICoqLwotICBwdWJsaWMgUmVsIGdldEluQm91bmRSZWwoKQotICB7Ci0gICAgcmV0dXJuIGZJbkJvdW5kLmdldFJlbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG91dGJvdW5kIGVsZW1lbnQgdGhhdCBjaGFuZ2VkIAotICAqKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0UGFyZW50RWxlbWVudCAoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZC5nZXRFbGVtZW50KCk7Ci0gIH0KLQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluYm91bmQgY29ubmVjdGlvbiB0aGF0IGNoYW5nZWQgCi0gICoqLwotICBwdWJsaWMgRWxlbWVudCBnZXRDaGlsZEVsZW1lbnQgKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRFbGVtZW50KCk7Ci0gIH0KLQotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsUmVtb3ZlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZGF0YW1vZGVsL1JlbFJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZmE0ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9kYXRhbW9kZWwvUmVsUmVtb3ZlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5kYXRhbW9kZWw7Ci0KLS8qKgotKiBDYXJyaWVzIGRhdGEgcmVsZXZhbnQgdG8gd2hlbiBhIHByb3BlcnR5IGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KLSovCi1wdWJsaWMgY2xhc3MgUmVsUmVtb3ZlRXZlbnQKLXsKLQotICAvLyBDb3B5cmlnaHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDAsIDIwMDIuIjsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uIGZPdXRCb3VuZDsKLQotICAvKioKLSAgKiBUaGUgbW9kZWwgdGhlIGNoYW5nZWQuCi0gICovCi0gIHByb3RlY3RlZCBDb25uZWN0aW9uIGZJbkJvdW5kOwotCi0gIC8qKgotICAqIFRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgKi8KLSAgcHJvdGVjdGVkIFByb3BlcnR5IGZQcm9wZXJ0eTsKLQotIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgdGhhdCBjaGFuZ2VkLgotICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5J3MgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgUmVsUmVtb3ZlRXZlbnQgKENvbm5lY3Rpb25bXSBwYWlyKQotICB7Ci0gICAgIGZPdXRCb3VuZCA9IHBhaXJbQmFzaWNDb25uZWN0aW9uLk9VVEJPVU5EXTsKLSAgICAgZkluQm91bmQgPSBwYWlyW0Jhc2ljQ29ubmVjdGlvbi5JTkJPVU5EXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGNoYW5nZWQgKHRoYXQgcHJvZHVjZWQgdGhpcyBldmVudCkuCi0gICAqIEByZXR1cm4gVGlueU1vZGVsIFRoZSBtb2RlbCB0aGF0IGNoYW5nZWQuCi0gICAqLwotICBwdWJsaWMgQ29ubmVjdGlvbiBnZXRPdXRCb3VuZCAoKQotICB7Ci0gICAgcmV0dXJuIGZPdXRCb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtb2RlbCBwcm9wZXJ0eSB0aGF0IHdhcyBhZGRlZC4KLSAgICogQHJldHVybiBUaW55TW9kZWwgVGhlIHByb3BlcnR5IHRoYXQgd2FzIGFkZGVkLgotICAgKi8KLSAgcHVibGljIENvbm5lY3Rpb24gZ2V0SW5Cb3VuZCAoKQotICB7Ci0gICAgcmV0dXJuIGZJbkJvdW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsIG5hbWUgCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIGdldE91dEJvdW5kUmVsTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldFJlbCgpLmdldE5hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFuZ2VkIHJlbAotICAqKi8KLSAgcHVibGljIFJlbCBnZXRPdXRCb3VuZFJlbCgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldFJlbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYW5nZWQgcmVsIG5hbWUgCi0gICoqLwotICBwdWJsaWMgU3RyaW5nIGdldEluQm91bmRSZWxOYW1lKCkKLSAgewotICAgIHJldHVybiBmSW5Cb3VuZC5nZXRSZWwoKS5nZXROYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhbmdlZCByZWwKLSAgKiovCi0gIHB1YmxpYyBSZWwgZ2V0SW5Cb3VuZFJlbCgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQuZ2V0UmVsKCk7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG91dGJvdW5kIGVsZW1lbnQgdGhhdCBjaGFuZ2VkIAotICAqKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0T3V0Qm91bmRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZk91dEJvdW5kLmdldEVsZW1lbnQoKTsKLSAgfQotCi0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5ib3VuZCBjb25uZWN0aW9uIHRoYXQgY2hhbmdlZCAKLSAgKiovCi0gIHB1YmxpYyBFbGVtZW50IGdldEluYm91bmRFbGVtZW50ICgpCi0gIHsKLSAgICByZXR1cm4gZkluQm91bmQuZ2V0RWxlbWVudCgpOwotICB9Ci0gIAotCi0gIAotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9BYnN0cmFjdENsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQWJzdHJhY3RDbGllbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ3M2JmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9BYnN0cmFjdENsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5mcmFnbWVudC5Db21tYW5kRmFjdG9yeUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklXZWJTZXJ2aWNlQ2xpZW50OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDbGllbnRGcmFnbWVudCBleHRlbmRzIENvbW1hbmRGYWN0b3J5RnJhZ21lbnQKLXsKLSAgcHJvdGVjdGVkIElXZWJTZXJ2aWNlQ2xpZW50IHdlYlNlcnZpY2VDbGllbnRfOwotICBwcm90ZWN0ZWQgRW52aXJvbm1lbnQgICAgICAgZW52aXJvbm1lbnRfOwotICBwcm90ZWN0ZWQgSUNvbnRleHQgICAgICAgICAgY29udGV4dF87Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uICAgICAgICBzZWxlY3Rpb25fOwotICBwcm90ZWN0ZWQgU3RyaW5nICAgICAgICAgICAgcHJvamVjdF87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICAgICAgICBtb2R1bGVfOwotICBwcm90ZWN0ZWQgU3RyaW5nICAgICAgICAgICAgZWFyUHJvamVjdF87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICAgICAgICBlYXJfOwotICAgIAotICBwdWJsaWMgQWJzdHJhY3RDbGllbnRGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQoIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgZnJhZ21lbnQgKQotICB7Ci0Jc3VwZXIoIGZyYWdtZW50ICk7IAotCQotCXdlYlNlcnZpY2VDbGllbnRfID0gZnJhZ21lbnQud2ViU2VydmljZUNsaWVudF87Ci0JZW52aXJvbm1lbnRfICAgICAgPSBmcmFnbWVudC5lbnZpcm9ubWVudF87Ci0JY29udGV4dF8gICAgICAgICAgPSBmcmFnbWVudC5jb250ZXh0XzsKLQlzZWxlY3Rpb25fICAgICAgICA9IGZyYWdtZW50LnNlbGVjdGlvbl87Ci0JbW9kdWxlXyAgICAgICAgICAgPSBmcmFnbWVudC5tb2R1bGVfOwotCWVhcl8gICAgICAgICAgICAgID0gZnJhZ21lbnQuZWFyXzsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRXZWJTZXJ2aWNlKCBJV2ViU2VydmljZUNsaWVudCB3ZWJTZXJ2aWNlICkKLSAgewotCXdlYlNlcnZpY2VDbGllbnRfID0gd2ViU2VydmljZTsgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoIEVudmlyb25tZW50IGVudmlyb25tZW50ICkKLSAgewotCWVudmlyb25tZW50XyA9IGVudmlyb25tZW50OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRDb250ZXh0KCBJQ29udGV4dCBjb250ZXh0ICkKLSAgewkgIAotCWNvbnRleHRfID0gY29udGV4dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKCBJU2VsZWN0aW9uIHNlbGVjdGlvbiApCi0gIHsKLQlzZWxlY3Rpb25fID0gc2VsZWN0aW9uOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFByb2plY3QoIFN0cmluZyBwcm9qZWN0KQotICB7Ci0gICAgcHJvamVjdF8gPSBwcm9qZWN0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoIFN0cmluZyBtb2R1bGUgKQotICB7Ci0JbW9kdWxlXyA9IG1vZHVsZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWFyUHJvamVjdChTdHJpbmcgZWFyUHJvamVjdCkKLSAgewotICAgIGVhclByb2plY3RfID0gZWFyUHJvamVjdDsgIAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXIoIFN0cmluZyBlYXIgKQotICB7Ci0JZWFyXyA9IGVhcjsgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9BYnN0cmFjdFNlcnZpY2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmEyYzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9BYnN0cmFjdFNlcnZpY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZnJhZ21lbnQuQ29tbWFuZEZhY3RvcnlGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydC5JV2ViU2VydmljZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmljZUZyYWdtZW50IGV4dGVuZHMgQ29tbWFuZEZhY3RvcnlGcmFnbWVudAotewotICBwcm90ZWN0ZWQgSVdlYlNlcnZpY2Ugd2ViU2VydmljZV87Ci0gIHByb3RlY3RlZCBFbnZpcm9ubWVudCBlbnZpcm9ubWVudF87Ci0gIHByb3RlY3RlZCBJQ29udGV4dCAgICBjb250ZXh0XzsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gIHNlbGVjdGlvbl87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICBwcm9qZWN0XzsKLSAgcHJvdGVjdGVkIFN0cmluZyAgICAgIG1vZHVsZV87Ci0gIHByb3RlY3RlZCBTdHJpbmcgICAgICBlYXJQcm9qZWN0XzsKLSAgcHJvdGVjdGVkIFN0cmluZyAgICAgIGVhcl87Ci0gICAgCi0gIHB1YmxpYyBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFic3RyYWN0U2VydmljZUZyYWdtZW50KCBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgCi0JCi0Jd2ViU2VydmljZV8gID0gZnJhZ21lbnQud2ViU2VydmljZV87Ci0JZW52aXJvbm1lbnRfID0gZnJhZ21lbnQuZW52aXJvbm1lbnRfOwotCWNvbnRleHRfICAgICA9IGZyYWdtZW50LmNvbnRleHRfOwotCXNlbGVjdGlvbl8gICA9IGZyYWdtZW50LnNlbGVjdGlvbl87Ci0JbW9kdWxlXyAgICAgID0gZnJhZ21lbnQubW9kdWxlXzsKLQllYXJfICAgICAgICAgPSBmcmFnbWVudC5lYXJfOwotICB9Ci0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2UoIElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgKQotICB7Ci0Jd2ViU2VydmljZV8gPSB3ZWJTZXJ2aWNlOyAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFbnZpcm9ubWVudCggRW52aXJvbm1lbnQgZW52aXJvbm1lbnQgKQotICB7Ci0JZW52aXJvbm1lbnRfID0gZW52aXJvbm1lbnQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbnRleHQoIElDb250ZXh0IGNvbnRleHQgKQotICB7CSAgCi0JY29udGV4dF8gPSBjb250ZXh0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oIElTZWxlY3Rpb24gc2VsZWN0aW9uICkKLSAgewotCXNlbGVjdGlvbl8gPSBzZWxlY3Rpb247ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UHJvamVjdCggU3RyaW5nIHByb2plY3QpCi0gIHsKLSAgICBwcm9qZWN0XyA9IHByb2plY3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1vZHVsZSggU3RyaW5nIG1vZHVsZSApCi0gIHsKLQltb2R1bGVfID0gbW9kdWxlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFYXJQcm9qZWN0KFN0cmluZyBlYXJQcm9qZWN0KQotICB7Ci0gICAgZWFyUHJvamVjdF8gPSBlYXJQcm9qZWN0OyAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEVhciggU3RyaW5nIGVhciApCi0gIHsKLQllYXJfID0gZWFyOyAgCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Bc3NlbWJsZUNsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQXNzZW1ibGVDbGllbnRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDg4NzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Bc3NlbWJsZUNsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQXNzZW1ibGVDbGllbnRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBBc3NlbWJsZUNsaWVudEZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgQXNzZW1ibGVDbGllbnRGcmFnbWVudCggQXNzZW1ibGVDbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IEFzc2VtYmxlQ2xpZW50RnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VDbGllbnRfID09IG51bGwgKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VDbGllbnRfLmFzc2VtYmxlKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBwcm9qZWN0XywgbW9kdWxlXywgZWFyUHJvamVjdF8sIGVhcl8gKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvQXNzZW1ibGVTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Bc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDU1MDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9Bc3NlbWJsZVNlcnZpY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEFzc2VtYmxlU2VydmljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEFzc2VtYmxlU2VydmljZUZyYWdtZW50KCBBc3NlbWJsZVNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IEFzc2VtYmxlU2VydmljZUZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlXyA9PSBudWxsICkKLQl7Ci0JICBmYWN0b3J5ID0gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBuZXcgVmVjdG9yKCkgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZhY3RvcnkgPSB3ZWJTZXJ2aWNlXy5hc3NlbWJsZSggZW52aXJvbm1lbnRfLCBjb250ZXh0Xywgc2VsZWN0aW9uXywgcHJvamVjdF8sIG1vZHVsZV8sIGVhclByb2plY3RfLCBlYXJfICk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RlcGxveUNsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95Q2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ZDRmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95Q2xpZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEZXBsb3lDbGllbnRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBEZXBsb3lDbGllbnRGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlcGxveUNsaWVudEZyYWdtZW50KCBEZXBsb3lDbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IERlcGxveUNsaWVudEZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlQ2xpZW50XyA9PSBudWxsICkKLQl7Ci0JICBmYWN0b3J5ID0gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBuZXcgVmVjdG9yKCkgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZhY3RvcnkgPSB3ZWJTZXJ2aWNlQ2xpZW50Xy5kZXBsb3koIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIHByb2plY3RfLCBtb2R1bGVfLCBlYXJQcm9qZWN0XywgZWFyXyApOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXBsb3lTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXBsb3lTZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzOGNmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGVwbG95U2VydmljZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRGVwbG95U2VydmljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBEZXBsb3lTZXJ2aWNlRnJhZ21lbnQoIERlcGxveVNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IERlcGxveVNlcnZpY2VGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZV8gPT0gbnVsbCApCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8uZGVwbG95KCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBwcm9qZWN0XywgbW9kdWxlXywgZWFyUHJvamVjdF8sIGVhcl8gKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGV2ZWxvcENsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvRGV2ZWxvcENsaWVudEZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNDU0MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RldmVsb3BDbGllbnRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIERldmVsb3BDbGllbnRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBEZXZlbG9wQ2xpZW50RnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBEZXZlbG9wQ2xpZW50RnJhZ21lbnQoIERldmVsb3BDbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IERldmVsb3BDbGllbnRGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZUNsaWVudF8gPT0gbnVsbCApCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZUNsaWVudF8uZGV2ZWxvcCggZW52aXJvbm1lbnRfLCBjb250ZXh0Xywgc2VsZWN0aW9uXywgcHJvamVjdF8sIG1vZHVsZV8sIGVhclByb2plY3RfLCBlYXJfICk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RldmVsb3BTZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9EZXZlbG9wU2VydmljZUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTQ4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0RldmVsb3BTZXJ2aWNlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBEZXZlbG9wU2VydmljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBEZXZlbG9wU2VydmljZUZyYWdtZW50KCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGV2ZWxvcFNlcnZpY2VGcmFnbWVudCggRGV2ZWxvcFNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IERldmVsb3BTZXJ2aWNlRnJhZ21lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZ2V0SUNvbW1hbmRGYWN0b3J5KCkgCi0gIHsKLQlJQ29tbWFuZEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCi0JaWYoIHdlYlNlcnZpY2VfID09IG51bGwgKQotCXsKLQkgIGZhY3RvcnkgPSBuZXcgU2ltcGxlQ29tbWFuZEZhY3RvcnkoIG5ldyBWZWN0b3IoKSApOwotCX0KLQllbHNlCi0JewotCSAgZmFjdG9yeSA9IHdlYlNlcnZpY2VfLmRldmVsb3AoIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIHByb2plY3RfLCBtb2R1bGVfLCBlYXJQcm9qZWN0XywgZWFyXyApOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnN0YWxsQ2xpZW50RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9JbnN0YWxsQ2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyMjI3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvSW5zdGFsbENsaWVudEZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENsaWVudEZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RDbGllbnRGcmFnbWVudCAKLXsKLSAgcHVibGljIEluc3RhbGxDbGllbnRGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEluc3RhbGxDbGllbnRGcmFnbWVudCggSW5zdGFsbENsaWVudEZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotCXJldHVybiBuZXcgSW5zdGFsbENsaWVudEZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlQ2xpZW50XyA9PSBudWxsICkKLQl7Ci0JICBmYWN0b3J5ID0gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBuZXcgVmVjdG9yKCkgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZhY3RvcnkgPSB3ZWJTZXJ2aWNlQ2xpZW50Xy5pbnN0YWxsKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBwcm9qZWN0XywgbW9kdWxlXywgZWFyUHJvamVjdF8sIGVhcl8gKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL0luc3RhbGxTZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNzc0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvSW5zdGFsbFNlcnZpY2VGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VGcmFnbWVudCAKLXsKLSAgcHVibGljIEluc3RhbGxTZXJ2aWNlRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJbnN0YWxsU2VydmljZUZyYWdtZW50KCBJbnN0YWxsU2VydmljZUZyYWdtZW50IGZyYWdtZW50ICkKLSAgewotCXN1cGVyKCBmcmFnbWVudCApOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBPYmplY3QgY2xvbmUoKSAKLSAgewotCXJldHVybiBuZXcgSW5zdGFsbFNlcnZpY2VGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZV8gPT0gbnVsbCApCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8uaW5zdGFsbCggZW52aXJvbm1lbnRfLCBjb250ZXh0Xywgc2VsZWN0aW9uXywgcHJvamVjdF8sIG1vZHVsZV8sIGVhclByb2plY3RfLCBlYXJfICk7CQotCX0KLQkKLQlyZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHRlbnNpb25zL1J1bkNsaWVudEZyYWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvUnVuQ2xpZW50RnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1YmZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvUnVuQ2xpZW50RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXh0ZW5zaW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuU2ltcGxlQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSdW5DbGllbnRGcmFnbWVudCBleHRlbmRzIEFic3RyYWN0Q2xpZW50RnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBSdW5DbGllbnRGcmFnbWVudCgpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFJ1bkNsaWVudEZyYWdtZW50KCBSdW5DbGllbnRGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IFJ1bkNsaWVudEZyYWdtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdldElDb21tYW5kRmFjdG9yeSgpIAotICB7Ci0JSUNvbW1hbmRGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQotCWlmKCB3ZWJTZXJ2aWNlQ2xpZW50XyA9PSBudWxsICkKLQl7Ci0JICBmYWN0b3J5ID0gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KCBuZXcgVmVjdG9yKCkgKTsKLQl9Ci0JZWxzZQotCXsKLQkgIGZhY3RvcnkgPSB3ZWJTZXJ2aWNlQ2xpZW50Xy5ydW4oIGVudmlyb25tZW50XywgY29udGV4dF8sIHNlbGVjdGlvbl8sIHByb2plY3RfLCBtb2R1bGVfLCBlYXJQcm9qZWN0XywgZWFyXyApOwkKLQl9Ci0JCi0JcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9SdW5TZXJ2aWNlRnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXh0ZW5zaW9ucy9SdW5TZXJ2aWNlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0ZWE5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4dGVuc2lvbnMvUnVuU2VydmljZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLmV4dGVuc2lvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUnVuU2VydmljZUZyYWdtZW50IGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRnJhZ21lbnQgCi17Ci0gIHB1YmxpYyBSdW5TZXJ2aWNlRnJhZ21lbnQoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBSdW5TZXJ2aWNlRnJhZ21lbnQoIFJ1blNlcnZpY2VGcmFnbWVudCBmcmFnbWVudCApCi0gIHsKLQlzdXBlciggZnJhZ21lbnQgKTsgIAotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgCi0gIHsKLQlyZXR1cm4gbmV3IFJ1blNlcnZpY2VGcmFnbWVudCgpOwotICB9Ci0KLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBnZXRJQ29tbWFuZEZhY3RvcnkoKSAKLSAgewotCUlDb21tYW5kRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkKLQlpZiggd2ViU2VydmljZV8gPT0gbnVsbCApCi0JewotCSAgZmFjdG9yeSA9IG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeSggbmV3IFZlY3RvcigpICk7Ci0JfQotCWVsc2UKLQl7Ci0JICBmYWN0b3J5ID0gd2ViU2VydmljZV8ucnVuKCBlbnZpcm9ubWVudF8sIGNvbnRleHRfLCBzZWxlY3Rpb25fLCBwcm9qZWN0XywgbW9kdWxlXywgZWFyUHJvamVjdF8sIGVhcl8gKTsJCi0JfQotCQotCXJldHVybiBmYWN0b3J5OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL21vbml0b3IvR2V0TW9uaXRvckNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9uaXRvci9HZXRNb25pdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmViNjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvbW9uaXRvci9HZXRNb25pdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLm1vbml0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5TaW1wbGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vbml0b3JXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk1vbml0b3JDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNvY2tldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBhcnNlci53c2lsLldlYlNlcnZpY2VzUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wbHVnaW4uV1NQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBHZXRNb25pdG9yQ29tbWFuZCBleHRlbmRzIFNpbXBsZUNvbW1hbmQgewotCXByaXZhdGUgYm9vbGVhbiBtb25pdG9yU2VydmljZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjcmVhdGU7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgd3NkbFVSSTsKLQotCXByaXZhdGUgTGlzdCBlbmRwb2ludHM7Ci0KLQlwdWJsaWMgR2V0TW9uaXRvckNvbW1hbmQoKSB7Ci0JCXN1cGVyKAotCQkJCSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uR2V0TW9uaXRvckNvbW1hbmQiLAotCQkJCSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uR2V0TW9uaXRvckNvbW1hbmQiKTsKLQkJbW9uaXRvclNlcnZpY2UgPSB0cnVlOwotCQljcmVhdGUgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnYpIHsKLQkJZW5kcG9pbnRzID0gbmV3IFZlY3RvcigpOwotCQlpZiAobW9uaXRvclNlcnZpY2UgJiYgd2ViU2VydmljZXNQYXJzZXIgIT0gbnVsbCAmJiB3c2RsVVJJICE9IG51bGwKLQkJCQkmJiB3c2RsVVJJLmxlbmd0aCgpID4gMCkgewotCQkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd2ViU2VydmljZXNQYXJzZXIKLQkJCQkJLmdldFdTRExEZWZpbml0aW9uKHdzZGxVUkkpOwotCQkJaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJCU1hcCBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIHNlcnZpY2VzSXQgPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBzZXJ2aWNlc0l0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZXNJdC5uZXh0KCk7Ci0JCQkJCU1hcCBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBwb3J0c0l0ID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgcG9ydHNJdAotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlQb3J0IHdzZGxQb3J0ID0gKFBvcnQpIHBvcnRzSXQubmV4dCgpOwotCQkJCQkJTGlzdCBleHRFbGVtZW50cyA9IHdzZGxQb3J0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBleHRFbGVtZW50c0l0ID0gZXh0RWxlbWVudHMuaXRlcmF0b3IoKTsgZXh0RWxlbWVudHNJdAotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1lbnRzSXQKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJU3RyaW5nIGVuZHBvaW50ID0gbnVsbDsKLQkJCQkJCQlVUkwgZW5kcG9pbnRVUkwgPSBudWxsOwotCQkJCQkJCWlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0JCQkJCQkJCWVuZHBvaW50ID0gKChTT0FQQWRkcmVzcykgZXh0RWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCQllbHNlIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgSFRUUEFkZHJlc3MpCi0JCQkJCQkJCWVuZHBvaW50ID0gKChIVFRQQWRkcmVzcykgZXh0RWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCQlpZiAoZW5kcG9pbnQgIT0gbnVsbCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJZW5kcG9pbnRVUkwgPSBuZXcgVVJMKGVuZHBvaW50KTsKLQkJCQkJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGVuZHBvaW50VVJMICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIHByb3RvY29sID0gZW5kcG9pbnRVUkwuZ2V0UHJvdG9jb2woKTsKLQkJCQkJCQkJU3RyaW5nIGhvc3QgPSBlbmRwb2ludFVSTC5nZXRIb3N0KCk7Ci0JCQkJCQkJCWludCBwb3J0ID0gZW5kcG9pbnRVUkwuZ2V0UG9ydCgpOwotCQkJCQkJCQlpZiAocG9ydCA9PSAtMSkgewotCQkJCQkJCQkJaWYgKCJodHRwIi5lcXVhbHNJZ25vcmVDYXNlKHByb3RvY29sKSkKLQkJCQkJCQkJCQlwb3J0ID0gODA7Ci0JCQkJCQkJCQllbHNlIGlmICgiaHR0cHMiLmVxdWFsc0lnbm9yZUNhc2UocHJvdG9jb2wpKQotCQkJCQkJCQkJCXBvcnQgPSA0NDM7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHByb3RvY29sICE9IG51bGwKLQkJCQkJCQkJCQkmJiBwcm90b2NvbC5zdGFydHNXaXRoKCJodHRwIikKLQkJCQkJCQkJCQkmJiBob3N0ICE9IG51bGwgJiYgaG9zdC5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJCQkmJiBwb3J0ICE9IC0xKSB7Ci0JCQkJCQkJCQlJTW9uaXRvciBtID0gbnVsbDsKLQkJCQkJCQkJCUlNb25pdG9yW10gbW9uaXRvcnMgPSBNb25pdG9yQ29yZQotCQkJCQkJCQkJCQkuZ2V0TW9uaXRvcnMoKTsKLQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9uaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQlpZiAoaG9zdC5lcXVhbHNJZ25vcmVDYXNlKG1vbml0b3JzW2ldCi0JCQkJCQkJCQkJCQkuZ2V0UmVtb3RlSG9zdCgpKQotCQkJCQkJCQkJCQkJJiYgcG9ydCA9PSBtb25pdG9yc1tpXQotCQkJCQkJCQkJCQkJCQkuZ2V0UmVtb3RlUG9ydCgpKSB7Ci0JCQkJCQkJCQkJCW0gPSBtb25pdG9yc1tpXTsKLQkJCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKG0gPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCQkJCQkJCQlpbnQgbW9uaXRvcmVkUG9ydCA9IFNvY2tldFV0aWwKLQkJCQkJCQkJCQkJCS5maW5kVW51c2VkUG9ydCg1MDAwLCAxNTAwMCk7Ci0JCQkJCQkJCQkJSU1vbml0b3JXb3JraW5nQ29weSBtb25pdG9yV29ya2luZ0NvcHkgPSBNb25pdG9yQ29yZQotCQkJCQkJCQkJCQkJLmNyZWF0ZU1vbml0b3IoKTsKLQkJCQkJCQkJCQltb25pdG9yV29ya2luZ0NvcHkKLQkJCQkJCQkJCQkJCS5zZXRMb2NhbFBvcnQobW9uaXRvcmVkUG9ydCk7Ci0JCQkJCQkJCQkJbW9uaXRvcldvcmtpbmdDb3B5LnNldFJlbW90ZUhvc3QoaG9zdCk7Ci0JCQkJCQkJCQkJbW9uaXRvcldvcmtpbmdDb3B5LnNldFJlbW90ZVBvcnQocG9ydCk7Ci0JCQkJCQkJCQkJbW9uaXRvcldvcmtpbmdDb3B5LnNldFByb3RvY29sKCJIVFRQIik7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJbSA9IG1vbml0b3JXb3JraW5nQ29weS5zYXZlKCk7Ci0JCQkJCQkJCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJCQkJCQkJU3RhdHVzIHdhcm5pbmcgPSBuZXcgU2ltcGxlU3RhdHVzKAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS53c3Qud3MiLAotCQkJCQkJCQkJCQkJCVdTUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKAotCQkJCQkJCQkJCQkJCQkJCQkiTVNHX0VSUk9SX1VOQUJMRV9UT19TVEFSVF9NT05JVE9SIiwKLQkJCQkJCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQkJCQkJCQlTdHJpbmcKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS52YWx1ZU9mKHBvcnQpLAotCQkJCQkJCQkJCQkJCQkJCQkJCWVuZHBvaW50IH0pLAotCQkJCQkJCQkJCQkJCVN0YXR1cy5XQVJOSU5HLCB0KTsKLQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCWlmIChlbnYgIT0gbnVsbCkKLQkJCQkJCQkJCQkJCQllbnYuZ2V0U3RhdHVzSGFuZGxlcigpCi0JCQkJCQkJCQkJCQkJCQkucmVwb3J0KHdhcm5pbmcpOwotCQkJCQkJCQkJCQl9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gc2UpIHsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChtICE9IG51bGwpIHsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlpZiAoIW0uaXNSdW5uaW5nKCkpCi0JCQkJCQkJCQkJCQltLnN0YXJ0KCk7Ci0JCQkJCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJCQkJCQkJCQkJZW5kcG9pbnRVUkwuZ2V0UHJvdG9jb2woKSk7Ci0JCQkJCQkJCQkJCXNiLmFwcGVuZCgiOi8vbG9jYWxob3N0OiIpOwotCQkJCQkJCQkJCQlzYi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YobQotCQkJCQkJCQkJCQkJCS5nZXRMb2NhbFBvcnQoKSkpOwotCQkJCQkJCQkJCQlzYi5hcHBlbmQoZW5kcG9pbnRVUkwuZ2V0RmlsZSgpKTsKLQkJCQkJCQkJCQkJZW5kcG9pbnRzLmFkZChzYi50b1N0cmluZygpKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCQkJCQkJCQlTdGF0dXMgd2FybmluZyA9IG5ldyBTaW1wbGVTdGF0dXMoCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLndzdC53cyIsCi0JCQkJCQkJCQkJCQkJV1NQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoCi0JCQkJCQkJCQkJCQkJCQkJCSJNU0dfRVJST1JfVU5BQkxFX1RPX1NUQVJUX01PTklUT1IiLAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLnZhbHVlT2YocG9ydCksCi0JCQkJCQkJCQkJCQkJCQkJCQkJZW5kcG9pbnQgfSksCi0JCQkJCQkJCQkJCQkJU3RhdHVzLldBUk5JTkcsIHQpOwotCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJaWYgKGVudiAhPSBudWxsKQotCQkJCQkJCQkJCQkJCWVudi5nZXRTdGF0dXNIYW5kbGVyKCkKLQkJCQkJCQkJCQkJCQkJCS5yZXBvcnQod2FybmluZyk7Ci0JCQkJCQkJCQkJCX0gY2F0Y2ggKFN0YXR1c0V4Y2VwdGlvbiBzZSkgewotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb25pdG9yU2VydmljZShib29sZWFuIG1vbml0b3JTZXJ2aWNlKSB7Ci0JCXRoaXMubW9uaXRvclNlcnZpY2UgPSBtb25pdG9yU2VydmljZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VzUGFyc2VyKFdlYlNlcnZpY2VzUGFyc2VyIHdlYlNlcnZpY2VzUGFyc2VyKSB7Ci0JCXRoaXMud2ViU2VydmljZXNQYXJzZXIgPSB3ZWJTZXJ2aWNlc1BhcnNlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsVVJJKFN0cmluZyB3c2RsVVJJKSB7Ci0JCXRoaXMud3NkbFVSSSA9IHdzZGxVUkk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlKGJvb2xlYW4gY3JlYXRlKSB7Ci0JCXRoaXMuY3JlYXRlID0gY3JlYXRlOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEVuZHBvaW50cygpIHsKLQkJcmV0dXJuIGVuZHBvaW50czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wbHVnaW4vV1NQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcGx1Z2luL1dTUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTNhYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wbHVnaW4vV1NQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdTUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgV1NQbHVnaW4gcGx1Z2luOwotCi0JLy8gUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFdTUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXU1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdAotCSAqIGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gV1NQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLCBvciAna2V5JyBpZiBub3QKLQkgKiBmb3VuZC4gUmVwbGFjZXMgc3Vic3RpdHV0aW9uIHZhcmlhYmxlcyBpbiB0aGUgbWVzc2FnZSBieSBvYmplY3RzIGluICdhcmdzJy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRSZXNvdXJjZVN0cmluZyhrZXkpLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZQotCQkJCQkJLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LndzLldTUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1MGNmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYlNlcnZpY2UgaW1wbGVtZW50cyBJV2ViU2VydmljZSB7Ci0JCi0JcHJpdmF0ZSBXZWJTZXJ2aWNlSW5mbyBpbmZvOwotCi0JcHVibGljIEFic3RyYWN0V2ViU2VydmljZShXZWJTZXJ2aWNlSW5mbyBpbmZvKSB7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JfQotCQotCi0JcHVibGljIFdlYlNlcnZpY2VJbmZvIGdldFdlYlNlcnZpY2VJbmZvKCkgewotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLQkJCVN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcik7Ci0JCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGRlcGxveShFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBlYXIpOwotCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBkZXZlbG9wKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLSAgICAgIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcik7Ci0JCQotCi0JcHVibGljIGFic3RyYWN0IElDb21tYW5kRmFjdG9yeSBpbnN0YWxsKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLSAgICAgIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcik7Ci0JCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IHJ1bihFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsCi0gICAgICBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBlYXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZUNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0Fic3RyYWN0V2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDFmNDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViU2VydmljZUNsaWVudCBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlQ2xpZW50IHsKLQkKLQlwcml2YXRlIFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm87Ci0KLQlwdWJsaWMgQWJzdHJhY3RXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pIHsKLQkJdGhpcy5pbmZvID0gaW5mbzsKLQl9Ci0JCi0KLQlwdWJsaWMgV2ViU2VydmljZUNsaWVudEluZm8gZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKSB7Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotICAgICAgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLSAgICAgIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcik7Ci0JCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotICAgICAgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKTsKLQkJCi0KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLAotICAgICAgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKTsKLQkKLQotCXB1YmxpYyBhYnN0cmFjdCBJQ29tbWFuZEZhY3RvcnkgcnVuKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwKLSAgICAgIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcik7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjIyNjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9BYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdlYlNlcnZpY2VSdW50aW1lIGltcGxlbWVudHMgSVdlYlNlcnZpY2VSdW50aW1lIHsKLQotCXB1YmxpYyBhYnN0cmFjdCBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKFdlYlNlcnZpY2VJbmZvIGluZm8pOwotCS8qKgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJV2ViU2VydmljZUNsaWVudCBnZXRXZWJTZXJ2aWNlQ2xpZW50KFdlYlNlcnZpY2VDbGllbnRJbmZvIGluZm8pOwotCS8qKgotCSAqLwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYW5ub3VuY2UoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSkKLQl7Ci0JCS8vVE9ETyBwcm92aWRlIGEgYm9pbGVyLXBsYXRlIGFubm91bmNlIGltcGxlbWVudGF0aW9uLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ2YTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZXh0IHsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRBc3NlbWJsZSgpOwotCQotCXB1YmxpYyBib29sZWFuIGdldENoZWNrT3V0RmlsZXMoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnQoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRDcmVhdGVGb2xkZXJzKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVwbG95KCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcCgpOwotCQotCXB1YmxpYyBib29sZWFuIGdldEluc3RhbGwoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRPdmVyV3JpdGVGaWxlcygpOwotCQotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2goKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBnZXRSdW4oKTsKLQkKLQlwdWJsaWMgV2ViU2VydmljZVNjZW5hcmlvIGdldFNjZW5hcmlvKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0VGVzdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVNlbGVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lTZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MmYxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVNlbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElTZWxlY3Rpb24gewotCQotCU9iamVjdFtdIGdldFNlbGVjdGlvbigpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZhMTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlSW5mbyBnZXRXZWJTZXJ2aWNlSW5mbygpOwotCQotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgYXNzZW1ibGUoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgaW5zdGFsbChFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgbW9kdWxlLCBTdHJpbmcgZWFyUHJvamVjdCwgU3RyaW5nIGVhcik7Ci0JcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBlYXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlQ2xpZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzOThhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlQ2xpZW50IHsKLQkKLQkvKioKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZUNsaWVudEluZm8gZ2V0V2ViU2VydmljZUNsaWVudEluZm8oKTsKLQkKLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKTsKLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKTsKLQlwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIG1vZHVsZSwgU3RyaW5nIGVhclByb2plY3QsIFN0cmluZyBlYXIpOwotCXB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgcnVuKEVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyBtb2R1bGUsIFN0cmluZyBlYXJQcm9qZWN0LCBTdHJpbmcgZWFyKTsJCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9JV2ViU2VydmljZVB1Ymxpc2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlUHVibGlzaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmI3ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlUHVibGlzaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5FbnZpcm9ubWVudDsKLQotcHVibGljIGludGVyZmFjZSBJV2ViU2VydmljZVB1Ymxpc2hlciB7Ci0JCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBwdWJsaXNoKEVudmlyb25tZW50IGVudiwgSVdlYlNlcnZpY2Ugd3MpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VSdW50aW1lLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VSdW50aW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjg3M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLklDb21tYW5kRmFjdG9yeTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlUnVudGltZSB7Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIElXZWJTZXJ2aWNlIGdldFdlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbyk7Ci0JLyoqCi0JICovCi0JcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbyk7Ci0JLyoqCi0JICovCi0JcHVibGljIElDb21tYW5kRmFjdG9yeSBhbm5vdW5jZShJV2ViU2VydmljZSB3ZWJTZXJ2aWNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L0lXZWJTZXJ2aWNlVGVzdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1ZGFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvSVdlYlNlcnZpY2VUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5JQ29tbWFuZEZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VUZXN0ZXIgewotICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGdlbmVyYXRlKFRlc3RJbmZvIHRlc3RJbmZvKTsKLSAgcHVibGljIElDb21tYW5kRmFjdG9yeSBsYXVuY2goVGVzdEluZm8gdGVzdEluZm8pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1Rlc3RJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvVGVzdEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjNDNiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvVGVzdEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5zZWxlY3Rpb24uQm9vbGVhblNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLS8qKgotICogVGhpcyBob2xkcyBpbmZvIHRoYXQgY29tZXMgZnJvbSB1c2VyIGlucHV0IG9yIHNvbWUgY2FsY3VsYXRpb25zIHRoYXQgCi0gKiB3aGljaCBtaWdodCBiZSB1c2VmdWwgdG8gYW55IHRlc3QgZXh0ZW5kZXJzCi0gKi8KLQotcHVibGljIGNsYXNzIFRlc3RJbmZvIHsKLSAgcHJpdmF0ZSBTdHJpbmcganNwRm9sZGVyOwotICBwcml2YXRlIFN0cmluZyBnZW5lcmF0aW9uTW9kdWxlOwotICBwcml2YXRlIFN0cmluZyBnZW5lcmF0aW9uUHJvamVjdDsKLSAgcHJpdmF0ZSBTdHJpbmcgc2VydmljZVByb2plY3Q7Ci0gIHByaXZhdGUgU3RyaW5nIHByb3h5QmVhbjsKLSAgcHJpdmF0ZSBTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2Q7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFByb2plY3Q7Ci0gIHByaXZhdGUgQm9vbGVhblNlbGVjdGlvbltdIG1ldGhvZHM7Ci0gIHByaXZhdGUgU3RyaW5nIHNlcnZpY2VTZXJ2ZXJUeXBlSUQ7Ci0gIHByaXZhdGUgU3RyaW5nIGNsaWVudFNlcnZlclR5cGVJRDsKLSAgcHJpdmF0ZSBJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcjsKLSAgcHJpdmF0ZSBJU2VydmVyIGNsaWVudEV4aXN0aW5nU2VydmVyOwotICBwcml2YXRlIExpc3QgZW5kcG9pbnRzOwotICBwcml2YXRlIFN0cmluZyB3c2RsU2VydmljZVVSTDsKLSAgCi0KLSAgLyoqCi0gICogVGhpcyBpcyB0aGUgZm9sZGVyIHRoZSB1c2VyIGhhcyBjaG9zZW4gdG8gZ2VuZXJhdGUgYW55IGpzcHMgCi0gICogQHBhcmFtIGpzcEZvbGRlcgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRKc3BGb2xkZXIoU3RyaW5nIGpzcEZvbGRlcil7Ci0JdGhpcy5qc3BGb2xkZXIgPSBqc3BGb2xkZXI7ICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRKc3BGb2xkZXIoKXsKLSAgICByZXR1cm4ganNwRm9sZGVyOyAgCi0gIH0KLSAgCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIHByb2plY3QgdGhlIHVzZXIgaGFzIGNob3NlbiB0byBnZW5lcmF0ZSBhcnRpZmFjdHMgdG8gIAotICAqIEBwYXJhbSBnZW5lcmF0aW9uUHJvamVjdAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0aW9uUHJvamVjdChTdHJpbmcgZ2VuZXJhdGlvblByb2plY3QpewotICAgIHRoaXMuZ2VuZXJhdGlvblByb2plY3QgPSBnZW5lcmF0aW9uUHJvamVjdDsJICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRHZW5lcmF0aW9uUHJvamVjdCgpewotICAgIHJldHVybiBnZW5lcmF0aW9uUHJvamVjdDsJICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIE1vZHVsZSB0aGUgdXNlciBoYXMgY2hvc2VuIHRvIGdlbmVyYXRlIGFydGlmYWN0cyB0byAgCi0gICAqIEBwYXJhbSBnZW5lcmF0aW9uTW9kdWxlCi0gICAqLwotICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGlvbk1vZHVsZShTdHJpbmcgZ2VuZXJhdGlvbk1vZHVsZSl7Ci0gICAgIHRoaXMuZ2VuZXJhdGlvbk1vZHVsZSA9IGdlbmVyYXRpb25Nb2R1bGU7CSAgCi0gICB9Ci0gICAKLSAgIHB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdGlvbk1vZHVsZSgpewotICAgICByZXR1cm4gZ2VuZXJhdGlvbk1vZHVsZTsJICAKLSAgIH0KLSAgCi0gIC8qKgotICAqIFRoZSBwcm94eSBiZWFuIHdhcyBnZW5lcmF0ZWQgYnkgdXMgdGhpcyBpcyB0aGUgbmFtZSBvZiBpdCAgCi0gICogQHBhcmFtIHByb3h5QmVhbgotICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eUJlYW4oU3RyaW5nIHByb3h5QmVhbil7Ci0gICAgdGhpcy5wcm94eUJlYW4gPSBwcm94eUJlYW47CSAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHlCZWFuKCl7Ci0gICAgcmV0dXJuIHByb3h5QmVhbjsJICAKLSAgfQotCSAgCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIFNldEVuZHBvaW50TWV0aG9kICAgCi0gICogQHBhcmFtIAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXRFbmRwb2ludE1ldGhvZChTdHJpbmcgc2V0RW5kcG9pbnRNZXRob2QpewotCXRoaXMuc2V0RW5kcG9pbnRNZXRob2QgPSBzZXRFbmRwb2ludE1ldGhvZDsgIAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFNldEVuZHBvaW50TWV0aG9kKCl7Ci0gICAgcmV0dXJuIHNldEVuZHBvaW50TWV0aG9kOyAgCi0gIH0KLSAgCi0gIC8qKgotICAqIFRoZSBjbGllbnRQcm9qZWN0IGNvbnRhaW5zIHRoZSBjbGllbnQgYXJ0aWZhY3RzIGluY2x1ZGluZyB0aGUgCi0gICogZ2VuZXJhdGVkIHByb3h5IGJlYW4gICAKLSAgKiBAcGFyYW0gY2xpZW50UHJvamVjdCBTdHJpbmcKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50UHJvamVjdChTdHJpbmcgY2xpZW50UHJvamVjdCl7Ci0gICAgdGhpcy5jbGllbnRQcm9qZWN0ID0gY2xpZW50UHJvamVjdDsJICAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRDbGllbnRQcm9qZWN0KCl7Ci0gICAgcmV0dXJuIGNsaWVudFByb2plY3Q7CSAgCi0gIH0KLQkgIAotICAvKioKLSAgKiBUaGVzZSBhcmUgbWV0aG9kcyBvbiB0aGUgcHJveHliZWFuIHRoZSB1c2VyIGhhcyBjaGVja2VkIG9uZXMgCi0gICogdGhleSB3YW50IGluY2x1ZGVkIGluIHRoZSB0ZXN0IGNsaWVudCAgICAgCi0gICogQHBhcmFtIG1ldGhvZHMKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhCb29sZWFuU2VsZWN0aW9uW10gbWV0aG9kcyl7Ci0JdGhpcy5tZXRob2RzID0gbWV0aG9kczsgIAotICB9Ci0gIAotICBwdWJsaWMgQm9vbGVhblNlbGVjdGlvbltdIGdldE1ldGhvZHMoKXsKLSAgICByZXR1cm4gbWV0aG9kczsgIAotICB9Ci0gIAotICAvKioKLSAgKiBJZiB0aGUgY29tbWFuZCBuZWVkcyBhIHNlcnZlciB0aGlzIGlzIHRoZSBjaG9zZW4gCi0gICogY2xpZW50IHNlcnZlcklECi0gICogQHBhcmFtIHNhbXBsZVNlcnZlclR5cGVJRAotICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlU2VydmVyVHlwZUlEKFN0cmluZyBzZXJ2aWNlU2VydmVyVHlwZUlEKXsKLSAgICB0aGlzLnNlcnZpY2VTZXJ2ZXJUeXBlSUQgPSBzZXJ2aWNlU2VydmVyVHlwZUlEOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZVNlcnZlclR5cGVJRCgpewotICAgIHJldHVybiBzZXJ2aWNlU2VydmVyVHlwZUlEOyAgCi0gIH0KLSAgCi0gIC8qKgotICAqIElmIHRoZSBjb21tYW5kIG5lZWRzIGEgc2VydmVyIHRoaXMgaXMgdGhlIGNob3NlbiAKLSAgKiBjbGllbnQgc2VydmVySUQKLSAgKiBAcGFyYW0gc2FtcGxlU2VydmVyVHlwZUlECi0gICovCi0gICBwdWJsaWMgdm9pZCBzZXRDbGllbnRTZXJ2ZXJUeXBlSUQoU3RyaW5nIGNsaWVudFNlcnZlclR5cGVJRCl7Ci0gICAgIHRoaXMuY2xpZW50U2VydmVyVHlwZUlEID0gY2xpZW50U2VydmVyVHlwZUlEOyAgCi0gICB9Ci0gICAKLSAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xpZW50U2VydmVyVHlwZUlEKCl7Ci0gICAgIHJldHVybiBjbGllbnRTZXJ2ZXJUeXBlSUQ7ICAKLSAgIH0KLQkgIAotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBJU2VydmVyIGlmIHJlcXVpcmVkCi0gICogQHBhcmFtIHNhbXBsZUV4aXN0aW5nU2VydmVyCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VFeGlzdGluZ1NlcnZlcihJU2VydmVyIHNlcnZpY2VFeGlzdGluZ1NlcnZlcil7Ci0JdGhpcy5zZXJ2aWNlRXhpc3RpbmdTZXJ2ZXIgPSBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7ICAgCi0gIH0KLSAgCi0gIHB1YmxpYyBJU2VydmVyIGdldFNlcnZpY2VFeGlzdGluZ1NlcnZlcigpewotICAgIHJldHVybiBzZXJ2aWNlRXhpc3RpbmdTZXJ2ZXI7ICAgCi0gIH0KLSAgCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIElTZXJ2ZXIgaWYgcmVxdWlyZWQKLSAgKiBAcGFyYW0gc2FtcGxlRXhpc3RpbmdTZXJ2ZXIKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXIoSVNlcnZlciBjbGllbnRFeGlzdGluZ1NlcnZlcil7Ci0gICAgdGhpcy5jbGllbnRFeGlzdGluZ1NlcnZlciA9IGNsaWVudEV4aXN0aW5nU2VydmVyOyAgIAotICB9Ci0gICAKLSAgcHVibGljIElTZXJ2ZXIgZ2V0Q2xpZW50RXhpc3RpbmdTZXJ2ZXIoKXsKLSAgICByZXR1cm4gY2xpZW50RXhpc3RpbmdTZXJ2ZXI7ICAgCi0gIH0KLSAgIAotICAvKioKLSAgKiBUaGlzIGlzIHRoZSBlbmRwb2ludHMgaWYgbW9uaXRvciBzZXJ2aWNlIGlzIGVuYWJsZWQKLSAgKiBAcGFyYW0gZW5kcG9pbnRzCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldEVuZHBvaW50KExpc3QgZW5kcG9pbnRzKXsKLQl0aGlzLmVuZHBvaW50cyA9IGVuZHBvaW50czsgIAotICB9Ci0gIHB1YmxpYyBMaXN0IGdldEVuZHBvaW50KCl7Ci0gICAgcmV0dXJuIGVuZHBvaW50czsgIAotICB9IAotCi0gIC8qKgotICAqIFRoaXMgaXMgdGhlIHByb2plY3QgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aAotICAqIHdzZGwKLSAgKiBAcGFyYW0gc2VydmljZVByb2plY3QKLSAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZVByb2plY3QoU3RyaW5nIHNlcnZpY2VQcm9qZWN0KXsKLSAgICB0aGlzLnNlcnZpY2VQcm9qZWN0ID0gc2VydmljZVByb2plY3Q7ICAgIAkgIAotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlUHJvamVjdCgpewotICAgIHJldHVybiBzZXJ2aWNlUHJvamVjdDsKLSAgfQotCi0gIC8qKgotICAqIFdTREwgVVJMCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFdzZGxTZXJ2aWNlVVJMKFN0cmluZyB3c2RsU2VydmljZVVSTCl7Ci0JdGhpcy53c2RsU2VydmljZVVSTCA9IHdzZGxTZXJ2aWNlVVJMOyAgCi0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbFNlcnZpY2VVUkwoKXsKLSAgICByZXR1cm4gd3NkbFNlcnZpY2VVUkw7ICAKLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlQ2xpZW50SW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VDbGllbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Yjc3OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VDbGllbnRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByb3Zpc2lvbmFsLndzcnQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQ2xpZW50SW5mbyB7Ci0KLQlwcml2YXRlIFdlYlNlcnZpY2VTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmxldExldmVsOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBqMmVlTGV2ZWw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckZhY3RvcnlJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmVySW5zdGFuY2VJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgd2ViU2VydmljZVJ1bnRpbWVJZDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgd3NkbFVSTDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaW1wbFVSTDsKLQkKLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJbXBsVVJMKCkgewotCQlyZXR1cm4gaW1wbFVSTDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SW1wbFVSTChqYXZhLmxhbmcuU3RyaW5nIGltcGxVUkwpIHsKLQkJdGhpcy5pbXBsVVJMID0gaW1wbFVSTDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SjJlZUxldmVsKCkgewotCQlyZXR1cm4gajJlZUxldmVsOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRKMmVlTGV2ZWwoamF2YS5sYW5nLlN0cmluZyBsZXZlbCkgewotCQlqMmVlTGV2ZWwgPSBsZXZlbDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmVyRmFjdG9yeUlkKCkgewotCQlyZXR1cm4gc2VydmVyRmFjdG9yeUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpIHsKLQkJdGhpcy5zZXJ2ZXJGYWN0b3J5SWQgPSBzZXJ2ZXJGYWN0b3J5SWQ7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNlcnZlckluc3RhbmNlSWQoKSB7Ci0JCXJldHVybiBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJJbnN0YW5jZUlkKGphdmEubGFuZy5TdHJpbmcgc2VydmVySW5zdGFuY2VJZCkgewotCQl0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2bGV0TGV2ZWwoKSB7Ci0JCXJldHVybiBzZXJ2bGV0TGV2ZWw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNlcnZsZXRMZXZlbChqYXZhLmxhbmcuU3RyaW5nIHNlcnZsZXRMZXZlbCkgewotCQl0aGlzLnNlcnZsZXRMZXZlbCA9IHNlcnZsZXRMZXZlbDsKLQl9Ci0JcHVibGljIFdlYlNlcnZpY2VTdGF0ZSBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShXZWJTZXJ2aWNlU3RhdGUgc3RhdGUpIHsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRXZWJTZXJ2aWNlUnVudGltZUlkKCkgewotCQlyZXR1cm4gd2ViU2VydmljZVJ1bnRpbWVJZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0V2ViU2VydmljZVJ1bnRpbWVJZChqYXZhLmxhbmcuU3RyaW5nIHdlYlNlcnZpY2VSdW50aW1lSWQpIHsKLQkJdGhpcy53ZWJTZXJ2aWNlUnVudGltZUlkID0gd2ViU2VydmljZVJ1bnRpbWVJZDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0V3NkbFVSTCgpIHsKLQkJcmV0dXJuIHdzZGxVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFdzZGxVUkwoamF2YS5sYW5nLlN0cmluZyB3c2RsVVJMKSB7Ci0JCXRoaXMud3NkbFVSTCA9IHdzZGxVUkw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9wcm92aXNpb25hbC93c3J0L1dlYlNlcnZpY2VJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1N2MyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJvdmlzaW9uYWwud3NydDsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VJbmZvIHsKLQotCXByaXZhdGUgV2ViU2VydmljZVN0YXRlIHN0YXRlOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzZXJ2bGV0TGV2ZWw7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGoyZWVMZXZlbDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgc2VydmVyRmFjdG9yeUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyB3c2RsVVJMOwotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBlbmRQb2ludFVSTDsKLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgaW1wbFVSTDsKLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRFbmRQb2ludFVSTCgpCi0JewotCQlyZXR1cm4gZW5kUG9pbnRVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEVuZFBvaW50VVJMKGphdmEubGFuZy5TdHJpbmcgZW5kUG9pbnRVUkwpCi0JewotCQl0aGlzLmVuZFBvaW50VVJMID0gZW5kUG9pbnRVUkw7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEltcGxVUkwoKQotCXsKLQkJcmV0dXJuIGltcGxVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEltcGxVUkwoamF2YS5sYW5nLlN0cmluZyBpbXBsVVJMKQotCXsKLQkJdGhpcy5pbXBsVVJMID0gaW1wbFVSTDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SjJlZUxldmVsKCkKLQl7Ci0JCXJldHVybiBqMmVlTGV2ZWw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEoyZWVMZXZlbChqYXZhLmxhbmcuU3RyaW5nIGxldmVsKQotCXsKLQkJajJlZUxldmVsID0gbGV2ZWw7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNlcnZlckZhY3RvcnlJZCgpCi0JewotCQlyZXR1cm4gc2VydmVyRmFjdG9yeUlkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJGYWN0b3J5SWQoamF2YS5sYW5nLlN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQpCi0JewotCQl0aGlzLnNlcnZlckZhY3RvcnlJZCA9IHNlcnZlckZhY3RvcnlJZDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VydmVySW5zdGFuY2VJZCgpCi0JewotCQlyZXR1cm4gc2VydmVySW5zdGFuY2VJZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2VydmVySW5zdGFuY2VJZChqYXZhLmxhbmcuU3RyaW5nIHNlcnZlckluc3RhbmNlSWQpCi0JewotCQl0aGlzLnNlcnZlckluc3RhbmNlSWQgPSBzZXJ2ZXJJbnN0YW5jZUlkOwotCX0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTZXJ2bGV0TGV2ZWwoKQotCXsKLQkJcmV0dXJuIHNlcnZsZXRMZXZlbDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2VydmxldExldmVsKGphdmEubGFuZy5TdHJpbmcgc2VydmxldExldmVsKQotCXsKLQkJdGhpcy5zZXJ2bGV0TGV2ZWwgPSBzZXJ2bGV0TGV2ZWw7Ci0JfQotCXB1YmxpYyBXZWJTZXJ2aWNlU3RhdGUgZ2V0U3RhdGUoKQotCXsKLQkJcmV0dXJuIHN0YXRlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShXZWJTZXJ2aWNlU3RhdGUgc3RhdGUpCi0JewotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JfQotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFdlYlNlcnZpY2VSdW50aW1lSWQoKQotCXsKLQkJcmV0dXJuIHdlYlNlcnZpY2VSdW50aW1lSWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFdlYlNlcnZpY2VSdW50aW1lSWQoamF2YS5sYW5nLlN0cmluZyB3ZWJTZXJ2aWNlUnVudGltZUlkKQotCXsKLQkJdGhpcy53ZWJTZXJ2aWNlUnVudGltZUlkID0gd2ViU2VydmljZVJ1bnRpbWVJZDsKLQl9Ci0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0V3NkbFVSTCgpCi0JewotCQlyZXR1cm4gd3NkbFVSTDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0V3NkbFVSTChqYXZhLmxhbmcuU3RyaW5nIHdzZGxVUkwpCi0JewotCQl0aGlzLndzZGxVUkwgPSB3c2RsVVJMOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU2NlbmFyaW8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU2NlbmFyaW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4ODJmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZVNjZW5hcmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlU2NlbmFyaW8gZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01VUCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUERPV04gPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlQgPSAyOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9UVE9NVVBfTEFCRUwgPSAiQk9UVE9NVVBfTEFCRUwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BET1dOX0xBQkVMID0gIlRPUERPV05fTEFCRUwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfTEFCRUwgPSAiQ0xJRU5UX0xBQkVMIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVNjZW5hcmlvIEJPVFRPTVVQX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVNjZW5hcmlvKEJPVFRPTVVQLCAiQk9UVE9NVVAiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU2NlbmFyaW8gVE9QRE9XTl9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTY2VuYXJpbyhUT1BET1dOLCAiVE9QRE9XTiIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTY2VuYXJpbyBDTElFTlRfTElURVJBTCA9IG5ldyBXZWJTZXJ2aWNlU2NlbmFyaW8oQ0xJRU5ULCAiQ0xJRU5UIik7Ci0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU2NlbmFyaW9bXSBWQUxVRVNfQVJSQVkgPQotICAgIG5ldyBXZWJTZXJ2aWNlU2NlbmFyaW9bXQotICAgIHsKLQkgIEJPVFRPTVVQX0xJVEVSQUwsCi0JICBUT1BET1dOX0xJVEVSQUwsCi0JICBDTElFTlRfTElURVJBTCwKLSAgICB9OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTY2VuYXJpbyBnZXQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU2NlbmFyaW8gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVNjZW5hcmlvIGdldChpbnQgdmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKHZhbHVlKQotICAgIHsKLSAgICAgIGNhc2UgQk9UVE9NVVA6IHJldHVybiBCT1RUT01VUF9MSVRFUkFMOwotICAgICAgY2FzZSBUT1BET1dOOiByZXR1cm4gVE9QRE9XTl9MSVRFUkFMOwotICAgICAgY2FzZSBDTElFTlQ6IHJldHVybiBDTElFTlRfTElURVJBTDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7CQotICB9Ci0KLSAgLyoqCi0gICAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByaXZhdGUgV2ViU2VydmljZVNjZW5hcmlvKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcih2YWx1ZSwgbmFtZSk7Ci0gIH0KLSAgCi0KLX0gLy9XZWJTZXJ2aWNlU2NlbmFyaW8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvcHJvdmlzaW9uYWwvd3NydC9XZWJTZXJ2aWNlU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEzZWRhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3Byb3Zpc2lvbmFsL3dzcnQvV2ViU2VydmljZVN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTZXJ2aWNlU3RhdGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWRUxPUEVEID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTRU1CTEVEID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVQTE9ZRUQgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNUQUxMRUQgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HID0gNTsKLSAgCi0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZSBVTktOT1dOX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKFVOS05PV04sICJVTktOT1dOIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlIERFVkVMT1BFRF9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTdGF0ZShERVZFTE9QRUQsICJERVZFTE9QRUQiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU3RhdGUgQVNTRU1CTEVEX0xJVEVSQUwgPSBuZXcgV2ViU2VydmljZVN0YXRlKEFTU0VNQkxFRCwgIkFTU0VNQkxFRCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZSBERVBMT1lFRF9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTdGF0ZShERVBMT1lFRCwgIkRFUExPWUVEIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV2ViU2VydmljZVN0YXRlIElOU1RBTExFRF9MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTdGF0ZShJTlNUQUxMRUQsICJJTlNUQUxMRUQiKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBXZWJTZXJ2aWNlU3RhdGUgUlVOTklOR19MSVRFUkFMID0gbmV3IFdlYlNlcnZpY2VTdGF0ZShSVU5OSU5HLCAiUlVOTklORyIpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFdlYlNlcnZpY2VTdGF0ZVtdIFZBTFVFU19BUlJBWSA9Ci0gICAgbmV3IFdlYlNlcnZpY2VTdGF0ZVtdCi0gICAgewotCSAgVU5LTk9XTl9MSVRFUkFMLAotCSAgREVWRUxPUEVEX0xJVEVSQUwsCi0JICBBU1NFTUJMRURfTElURVJBTCwKLQkgIERFUExPWUVEX0xJVEVSQUwsCi0JICBJTlNUQUxMRURfTElURVJBTCwKLQkgIFJVTk5JTkdfTElURVJBTCwKLSAgICB9OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQotICBwdWJsaWMgc3RhdGljIFdlYlNlcnZpY2VTdGF0ZSBnZXQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLSAgICB7Ci0gICAgICBXZWJTZXJ2aWNlU3RhdGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgV2ViU2VydmljZVN0YXRlIGdldChpbnQgdmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKHZhbHVlKQotICAgIHsKLSAgICAgIGNhc2UgVU5LTk9XTjogcmV0dXJuIFVOS05PV05fTElURVJBTDsKLSAgICAgIGNhc2UgREVWRUxPUEVEOiByZXR1cm4gREVWRUxPUEVEX0xJVEVSQUw7Ci0gICAgICBjYXNlIEFTU0VNQkxFRDogcmV0dXJuIEFTU0VNQkxFRF9MSVRFUkFMOwotCSAgY2FzZSBERVBMT1lFRDogcmV0dXJuIERFUExPWUVEX0xJVEVSQUw7Ci0JICBjYXNlIElOU1RBTExFRDogcmV0dXJuIElOU1RBTExFRF9MSVRFUkFMOwotCSAgY2FzZSBSVU5OSU5HOiByZXR1cm4gUlVOTklOR19MSVRFUkFMOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsJCi0gIH0KLQotICAvKioKLSAgICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJpdmF0ZSBXZWJTZXJ2aWNlU3RhdGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKHZhbHVlLCBuYW1lKTsKLSAgfQotCi19IC8vV2ViU2VydmljZVN0YXRlCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NpbC9BZGRXU0RMVG9XU0lMQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2lsL0FkZFdTRExUb1dTSUxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOTBjZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3Mvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC93c2lsL0FkZFdTRExUb1dTSUxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuQWJzdHJhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5JbnNwZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuV1NJTERvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5XU0lMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24uRXh0ZW5zaW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLndzZGwuSW1wbGVtZW50ZWRCaW5kaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLlJlZmVyZW5jZWRTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUud3NpbC54bWwuWE1MV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS51cmkuVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLnVyaS5VUklGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5JbGxlZ2FsQXJndW1lbnRzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV1dXQXV0aGVudGljYXRpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5XZWJTZXJ2aWNlc1BhcnNlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEFkZFdTRExUb1dTSUxDb21tYW5kIGV4dGVuZHMgU2ltcGxlQ29tbWFuZAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfV1NJTCA9ICItd3NpbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19XU0RMID0gIi13c2RsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX1JFU09MVkVfV1NETCA9ICItcmVzb2x2ZXdzZGwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FID0gIi1odHRwdXNlcm5hbWUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdfSFRUUF9CQVNJQ19BVVRIX1BBU1NXT1JEID0gIi1odHRwcGFzc3dvcmQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuQWRkV1NETFRvV1NJTENvbW1hbmQiOwotICBwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc0J1bmRsZV87Ci0gIHByaXZhdGUgV1dXQXV0aGVudGljYXRpb25IYW5kbGVyIHd3d0F1dGhIYW5kbGVyXzsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBhcmdzXzsKLSAgcHJpdmF0ZSBTdHJpbmcgd3NpbF87Ci0gIHByaXZhdGUgQXJyYXlMaXN0IHdzZGxzXzsKLSAgcHJpdmF0ZSBib29sZWFuIHJlc29sdmVXU0RMXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFVzZXJuYW1lXzsKLSAgcHJpdmF0ZSBTdHJpbmcgaHR0cFBhc3N3b3JkXzsKLQotICBwdWJsaWMgQWRkV1NETFRvV1NJTENvbW1hbmQoKQotICB7Ci0gICAgc3VwZXIoIm9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wYXJzZXIud3NpbC5BZGRXU0RMVG9XU0lMQ29tbWFuZCIsICJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuQWRkV1NETFRvV1NJTENvbW1hbmQiKTsKLSAgICByZXNCdW5kbGVfID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwud3NpbCIpOwotICAgIHd3d0F1dGhIYW5kbGVyXyA9IG51bGw7Ci0gICAgYXJnc18gPSBuZXcgU3RyaW5nWzBdOwotICAgIGNsZWFyUGFyc2VkQXJncygpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNsZWFyUGFyc2VkQXJncygpCi0gIHsKLSAgICB3c2lsXyA9IG51bGw7Ci0gICAgaWYgKHdzZGxzXyA9PSBudWxsKQotICAgICAgd3NkbHNfID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGVsc2UKLSAgICAgIHdzZGxzXy5jbGVhcigpOwotICAgIHJlc29sdmVXU0RMXyA9IGZhbHNlOwotICAgIGh0dHBVc2VybmFtZV8gPSBudWxsOwotICAgIGh0dHBQYXNzd29yZF8gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEV4ZWN1dGVzIHRoZSBDb21tYW5kLgotICAgKiAKLSAgICogQHBhcmFtIGVudmlyb25tZW50Ci0gICAqICAgICAgICAgICAgVGhlIGVudmlyb25tZW50LiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIEEgPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgZGVncmVlIHRvIHdoaWNoIHRoZQotICAgKiAgICAgICAgIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4gQSB2YWx1ZCBvZiA8Y29kZT5udWxsPC9jb2RlPiwKLSAgICogICAgICAgICBvciBhIFN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgbGVzcyB0aGFuIDxjb2RlPlN0YXR1cy5FUlJPUjwvY29kZT4KLSAgICogICAgICAgICBzaWduaWZpZXMgc3VjY2Vzcy4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgZXhlY3V0ZShFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIFVSSUZhY3RvcnkgdXJpRmFjdG9yeSA9IGVudmlyb25tZW50LmdldFVSSUZhY3RvcnkoKTsKLSAgICAvLyBQYXJzZSBhcmd1bWVudHMKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwYXJzZUFyZ3VtZW50cygpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50c0V4Y2VwdGlvbiBpYWUpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfSUxMRUdBTF9BUkdVTUVOVFMiKSwgU3RhdHVzLkVSUk9SLCBpYWUpOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfSU5WQUxJRF9BUkdVTUVOVFMiKSwgU3RhdHVzLkVSUk9SLCBlKTsKLSAgICB9Ci0gICAgLy8gQ3JlYXRlIG5ldyBXU0lMIGRvY3VtZW50Ci0gICAgV1NJTERvY3VtZW50IHdzaWxEb2N1bWVudCA9IG51bGw7Ci0gICAgVVJMIHdzaWxVUkwgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIHdzaWxEb2N1bWVudCA9IFdTSUxEb2N1bWVudC5uZXdJbnN0YW5jZSgpOwotICAgICAgd3NpbFVSTCA9IG5ldyBVUkwod3NpbF8pOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX0lOVkFMSURfV1NJTF9VUkkiKSwgU3RhdHVzLkVSUk9SLCBtdXJsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChXU0lMRXhjZXB0aW9uIHdzaWxlKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OIiksIFN0YXR1cy5FUlJPUiwgd3NpbGUpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBSZWFkIFdTSUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbSBpcyA9IHVyaUZhY3RvcnkubmV3VVJJKHdzaWxVUkwpLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3NpbERvY3VtZW50LnJlYWQobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7Ci0gICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChVUklFeGNlcHRpb24gdXJpZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTiIpLCBTdGF0dXMuRVJST1IsIHVyaWUpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OIiksIFN0YXR1cy5FUlJPUiwgaW9lKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTSUxFeGNlcHRpb24gd3NpbGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04iKSwgU3RhdHVzLkVSUk9SLCB3c2lsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIGludGVybmFsRXhlY3V0ZQotICAgIFN0cmluZyBodHRwVXNlcm5hbWUgPSBudWxsOwotICAgIFN0cmluZyBodHRwUGFzc3dvcmQgPSBudWxsOwotICAgIGlmICh3c2Rsc18uc2l6ZSgpID09IDEgJiYgaHR0cFVzZXJuYW1lXyAhPSBudWxsICYmIGh0dHBQYXNzd29yZF8gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBodHRwVXNlcm5hbWUgPSBodHRwVXNlcm5hbWVfOwotICAgICAgaHR0cFBhc3N3b3JkID0gaHR0cFBhc3N3b3JkXzsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdCA9IHdzZGxzXy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyB3c2RsID0gKFN0cmluZykgaXQubmV4dCgpOwotICAgICAgU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc3RhdHVzID0gaW50ZXJuYWxFeGVjdXRlKGVudmlyb25tZW50LCB3c2lsRG9jdW1lbnQsIHBsYXRmb3JtMkZpbGUodXJpRmFjdG9yeSwgd3NpbF8pLCB3c2RsLCBodHRwVXNlcm5hbWUsIGh0dHBQYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoV1dXQXV0aGVudGljYXRpb25FeGNlcHRpb24gd3d3YWUpCi0gICAgICB7Ci0gICAgICAgIGlmICh3d3dBdXRoSGFuZGxlcl8gIT0gbnVsbCAmJiBodHRwVXNlcm5hbWUgPT0gbnVsbCAmJiBodHRwUGFzc3dvcmQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHd3d0F1dGhIYW5kbGVyXy5oYW5kbGVXV1dBdXRoZW50aWNhdGlvbih3d3dhZSk7Ci0gICAgICAgICAgU3RyaW5nIGhhbmRsZXJVc2VybmFtZSA9IHd3d0F1dGhIYW5kbGVyXy5nZXRVc2VybmFtZSgpOwotICAgICAgICAgIFN0cmluZyBoYW5kbGVyUGFzc3dvcmQgPSB3d3dBdXRoSGFuZGxlcl8uZ2V0UGFzc3dvcmQoKTsKLSAgICAgICAgICBpZiAoaGFuZGxlclVzZXJuYW1lICE9IG51bGwgJiYgaGFuZGxlclBhc3N3b3JkICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0YXR1cyA9IGludGVybmFsRXhlY3V0ZShlbnZpcm9ubWVudCwgd3NpbERvY3VtZW50LCBwbGF0Zm9ybTJGaWxlKHVyaUZhY3RvcnksIHdzaWxfKSwgd3NkbCwgaGFuZGxlclVzZXJuYW1lLCBoYW5kbGVyUGFzc3dvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFdXV0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHd3d2FlMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RhdHVzIHd3d2FlU3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTlJFU09MVkFCTEVfV1NETCIpLCBTdGF0dXMuRVJST1IsIHd3d2FlMi5nZXRJT0V4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHd3d2FlU3RhdHVzKTsKLSAgICAgICAgICAgICAgcmV0dXJuIHd3d2FlU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdGF0dXMgcyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5SRVNPTFZBQkxFX1dTREwiKSwgU3RhdHVzLkVSUk9SLCB3d3dhZS5nZXRJT0V4Y2VwdGlvbigpKTsKLSAgICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Iocyk7Ci0gICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIFdyaXRlIFdTSUwKLSAgICB0cnkKLSAgICB7Ci0gICAgICBYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IFhNTFdyaXRlcigpOwotICAgICAgT3V0cHV0U3RyZWFtIG9zID0gdXJpRmFjdG9yeS5uZXdVUkkod3NpbFVSTCkuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBpZiAob3MgIT0gbnVsbCkKLSAgICAgICAgeG1sV3JpdGVyLndyaXRlRG9jdW1lbnQod3NpbERvY3VtZW50LCBvcyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotICAgICAgb3MuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVSSUV4Y2VwdGlvbiB1cmllKQotICAgIHsKLSAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1dSSVRFX1dTSUwiKSwgU3RhdHVzLkVSUk9SLCB1cmllKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9XUklURV9XU0lMIiksIFN0YXR1cy5FUlJPUiwgaW9lKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTSUxFeGNlcHRpb24gd3NpbGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfV1JJVEVfV1NJTCIpLCBTdGF0dXMuRVJST1IsIHdzaWxlKTsKLSAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoaWQsICIiLCBTdGF0dXMuT0ssIG51bGwpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdGF0dXMgaW50ZXJuYWxFeGVjdXRlKEVudmlyb25tZW50IGVudmlyb25tZW50LCBXU0lMRG9jdW1lbnQgd3NpbERvY3VtZW50LCBTdHJpbmcgd3NpbCwgU3RyaW5nIHdzZGwsIFN0cmluZyBodHRwVXNlcm5hbWUsIFN0cmluZyBodHRwUGFzc3dvcmQpIHRocm93cyBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICBBcnJheUxpc3Qgd3NkbFNlcnZpY2UgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgQXJyYXlMaXN0IHdzZGxCaW5kaW5nID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChyZXNvbHZlV1NETF8pCi0gICAgewotICAgICAgLy8gUGFyc2UgV1NETAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24gPSBwYXJzZVdTREwod3NkbCwgd3NkbFNlcnZpY2UsIHdzZGxCaW5kaW5nLCBodHRwVXNlcm5hbWUsIGh0dHBQYXNzd29yZCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKQotICAgICAgewotICAgICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9JTlZBTElEX1dTRExfVVJJIiksIFN0YXR1cy5FUlJPUiwgbXVybGUpOwotICAgICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VOUkVTT0xWQUJMRV9XU0RMIiksIFN0YXR1cy5FUlJPUiwgaW9lKTsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBwY2UpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX1VORVhQRUNURURfRVhDRVBUSU9OIiksIFN0YXR1cy5FUlJPUiwgcGNlKTsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIHNheGUpCi0gICAgICB7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKGlkLCByZXNCdW5kbGVfLmdldFN0cmluZygiTVNHX0VSUk9SX01BTEZPUk1FRF9XU0RMIiksIFN0YXR1cy5FUlJPUiwgc2F4ZSk7Ci0gICAgICAgIGVudmlyb25tZW50LmdldFN0YXR1c0hhbmRsZXIoKS5yZXBvcnRFcnJvcihzdGF0dXMpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICAvLyBBZGQgV1NETCB0byBXU0lMCi0gICAgdHJ5Ci0gICAgewotICAgICAgSW5zcGVjdGlvbiBpbnNwZWN0aW9uID0gd3NpbERvY3VtZW50LmdldEluc3BlY3Rpb24oKTsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHdzaWxEb2N1bWVudC5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBFbGVtZW50IGRvY3VtZW50YXRpb24gPSBkZWZpbml0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICAgIEFic3RyYWN0IHNlcnZpY2VBYnN0cmFjdCA9IHdzaWxEb2N1bWVudC5jcmVhdGVBYnN0cmFjdCgpOwotICAgICAgICBzZXJ2aWNlQWJzdHJhY3Quc2V0VGV4dChFbGVtZW50MlN0cmluZyhkb2N1bWVudGF0aW9uKSk7Ci0gICAgICAgIHNlcnZpY2UuYWRkQWJzdHJhY3Qoc2VydmljZUFic3RyYWN0KTsKLSAgICAgIH0KLSAgICAgIERlc2NyaXB0aW9uIGRlc2MgPSB3c2lsRG9jdW1lbnQuY3JlYXRlRGVzY3JpcHRpb24oKTsKLSAgICAgIGRlc2Muc2V0UmVmZXJlbmNlZE5hbWVzcGFjZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0RMKTsKLSAgICAgIGRlc2Muc2V0TG9jYXRpb24oZ2V0UmVsYXRpdmVVUkkod3NpbCwgd3NkbCkpOwotICAgICAgRXh0ZW5zaW9uQnVpbGRlciBleHRCdWlsZGVyID0gd3NpbERvY3VtZW50LmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0QnVpbGRlcihXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwpOwotICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCB8fCBlbmRwb2ludFByZXNlbnQoZGVmaW5pdGlvbikpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB3c2RsU2VydmljZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChSZWZlcmVuY2UpIGV4dEJ1aWxkZXIuY3JlYXRlRWxlbWVudChuZXcgUU5hbWUoV1NETENvbnN0YW50cy5OU19VUklfV1NJTF9XU0RMLCBXU0RMQ29uc3RhbnRzLkVMRU1fUkVGRVJFTkNFKSk7Ci0gICAgICAgICAgcmVmZXJlbmNlLnNldEVuZHBvaW50UHJlc2VudChuZXcgQm9vbGVhbih0cnVlKSk7Ci0gICAgICAgICAgUmVmZXJlbmNlZFNlcnZpY2UgcmVmU2VydmljZSA9IChSZWZlcmVuY2VkU2VydmljZSkgZXh0QnVpbGRlci5jcmVhdGVFbGVtZW50KG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLk5TX1VSSV9XU0lMX1dTREwsIFdTRExDb25zdGFudHMuRUxFTV9SRUZfU0VSVklDRSkpOwotICAgICAgICAgIHJlZlNlcnZpY2Uuc2V0UmVmZXJlbmNlZFNlcnZpY2VOYW1lKChRTmFtZSkgaXQubmV4dCgpKTsKLSAgICAgICAgICByZWZlcmVuY2Uuc2V0UmVmZXJlbmNlZFNlcnZpY2UocmVmU2VydmljZSk7Ci0gICAgICAgICAgZGVzYy5zZXRFeHRlbnNpb25FbGVtZW50KHJlZmVyZW5jZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChSZWZlcmVuY2UpIGV4dEJ1aWxkZXIuY3JlYXRlRWxlbWVudChuZXcgUU5hbWUoV1NETENvbnN0YW50cy5OU19VUklfV1NJTF9XU0RMLCBXU0RMQ29uc3RhbnRzLkVMRU1fUkVGRVJFTkNFKSk7Ci0gICAgICAgIHJlZmVyZW5jZS5zZXRFbmRwb2ludFByZXNlbnQobmV3IEJvb2xlYW4oZmFsc2UpKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHdzZGxCaW5kaW5nLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBJbXBsZW1lbnRlZEJpbmRpbmcgYmluZGluZyA9IChJbXBsZW1lbnRlZEJpbmRpbmcpIGV4dEJ1aWxkZXIuY3JlYXRlRWxlbWVudChuZXcgUU5hbWUoV1NETENvbnN0YW50cy5OU19VUklfV1NJTF9XU0RMLCBXU0RMQ29uc3RhbnRzLkVMRU1fSU1QTF9CSU5ESU5HKSk7Ci0gICAgICAgICAgYmluZGluZy5zZXRCaW5kaW5nTmFtZSgoUU5hbWUpIGl0Lm5leHQoKSk7Ci0gICAgICAgICAgcmVmZXJlbmNlLmFkZEltcGxlbWVudGVkQmluZGluZyhiaW5kaW5nKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2VydmljZS5hZGREZXNjcmlwdGlvbihkZXNjKTsKLSAgICAgIGluc3BlY3Rpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFdTSUxFeGNlcHRpb24gd3NpbGUpCi0gICAgewotICAgICAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoaWQsIHJlc0J1bmRsZV8uZ2V0U3RyaW5nKCJNU0dfRVJST1JfVU5FWFBFQ1RFRF9FWENFUFRJT04iKSwgU3RhdHVzLkVSUk9SLCB3c2lsZSk7Ci0gICAgICBlbnZpcm9ubWVudC5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKLSAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cyhpZCwgcmVzQnVuZGxlXy5nZXRTdHJpbmcoIk1TR19FUlJPUl9VTkVYUEVDVEVEX0VYQ0VQVElPTiIpLCBTdGF0dXMuRVJST1IsIHQpOwotICAgICAgZW52aXJvbm1lbnQuZ2V0U3RhdHVzSGFuZGxlcigpLnJlcG9ydEVycm9yKHN0YXR1cyk7Ci0gICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFNpbXBsZVN0YXR1cyhpZCwgIiIsIFN0YXR1cy5PSywgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiwgYW5kIG9ubHkgaWYsIHRoZSBDb21tYW5kJ3MgPGNvZGU+dW5kbzwvY29kZT4KLSAgICogbWV0aG9kIGlzIHN1cHBvcnRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgQ29tbWFuZCBzdXBwb3J0cyBiZWluZyB1bmRvbmUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZG9hYmxlKCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBVbmRvZXMgdGhlIENvbW1hbmQuCi0gICAqIAotICAgKiBAcGFyYW0gZW52aXJvbm1lbnQKLSAgICogICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQuIE11c3Qgbm90IGJlIG51bGwuCi0gICAqIEByZXR1cm4gQSA8Y29kZT5TdGF0dXM8L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlCi0gICAqICAgICAgICAgPGNvZGU+dW5kbzwvY29kZT4gbWV0aG9kIHdhcyBzdWNjZXNzZnVsLiBBIHZhbHVkIG9mIDxjb2RlPm51bGw8L2NvZGU+LAotICAgKiAgICAgICAgIG9yIGEgU3RhdHVzIHdpdGggYSBzZXZlcml0eSBvZiBsZXNzIHRoYW4gPGNvZGU+U3RhdHVzLkVSUk9SPC9jb2RlPgotICAgKiAgICAgICAgIHNpZ25pZmllcyBzdWNjZXNzLgotICAgKi8KLSAgcHVibGljIFN0YXR1cyB1bmRvKEVudmlyb25tZW50IGVudmlyb25tZW50KQotICB7Ci0gICAgcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoaWQsICIiLCBTdGF0dXMuT0ssIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlLWV4ZWN1dGVzIHRoZSBDb21tYW5kLgotICAgKiAKLSAgICogQHBhcmFtIGVudmlyb25tZW50Ci0gICAqICAgICAgICAgICAgVGhlIGVudmlyb25tZW50LiBNdXN0IG5vdCBiZSBudWxsLgotICAgKiBAcmV0dXJuIEEgPGNvZGU+U3RhdHVzPC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUgZGVncmVlIHRvIHdoaWNoIHRoZQotICAgKiAgICAgICAgIDxjb2RlPnJlZG88L2NvZGU+IG1ldGhvZCB3YXMgc3VjY2Vzc2Z1bC4gQSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiwKLSAgICogICAgICAgICBvciBhIFN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgbGVzcyB0aGVuIDxjb2RlPlN0YXR1cy5FUlJPUjwvY29kZT4KLSAgICogICAgICAgICBzaWduaWZpZXMgc3VjY2Vzcy4KLSAgICovCi0gIHB1YmxpYyBTdGF0dXMgcmVkbyhFbnZpcm9ubWVudCBlbnZpcm9ubWVudCkKLSAgewotICAgIHJldHVybiBleGVjdXRlKGVudmlyb25tZW50KTsKLSAgfQotCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBwYXJzZVdTREwoU3RyaW5nIHdzZGwsIEFycmF5TGlzdCB3c2RsU2VydmljZSwgQXJyYXlMaXN0IHdzZGxCaW5kaW5nLCBTdHJpbmcgaHR0cFVzZXJuYW1lLCBTdHJpbmcgaHR0cFBhc3N3b3JkKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBXV1dBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgV2ViU2VydmljZXNQYXJzZXIgd3NQYXJzZXIgPSBuZXcgV2ViU2VydmljZXNQYXJzZXIod3NkbCk7Ci0gICAgaWYgKGh0dHBVc2VybmFtZSAhPSBudWxsICYmIGh0dHBQYXNzd29yZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdzUGFyc2VyLnNldEhUVFBCYXNpY0F1dGhVc2VybmFtZShodHRwVXNlcm5hbWUpOwotICAgICAgd3NQYXJzZXIuc2V0SFRUUEJhc2ljQXV0aFBhc3N3b3JkKGh0dHBQYXNzd29yZCk7Ci0gICAgfQotICAgIHdzUGFyc2VyLnBhcnNlKFdlYlNlcnZpY2VzUGFyc2VyLlBBUlNFX05PTkUpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzUGFyc2VyLmdldFdTRExEZWZpbml0aW9uKHdzZGwpOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIHNlcnZpY2VzID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHNlcnZpY2VzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0gICAgICAgIHdzZGxTZXJ2aWNlLmFkZChwYXJzZVFOYW1lKChqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lKSBpdC5uZXh0KCkpKTsKLSAgICAgIE1hcCBiaW5kaW5ncyA9IGRlZmluaXRpb24uZ2V0QmluZGluZ3MoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBiaW5kaW5ncy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICB3c2RsQmluZGluZy5hZGQocGFyc2VRTmFtZSgoamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSkgaXQubmV4dCgpKSk7Ci0gICAgfQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGVuZHBvaW50UHJlc2VudChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICByZXR1cm4gKGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS5zaXplKCkgPiAwKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBcmd1bWVudHMoKQotICB7Ci0gICAgcmV0dXJuIGFyZ3NfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBhcmdzXyA9IGFyZ3M7Ci0gIH0KLQotICBwdWJsaWMgV1dXQXV0aGVudGljYXRpb25IYW5kbGVyIGdldFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlcigpCi0gIHsKLSAgICByZXR1cm4gd3d3QXV0aEhhbmRsZXJfOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V1dXQXV0aGVudGljYXRpb25IYW5kbGVyKFdXV0F1dGhlbnRpY2F0aW9uSGFuZGxlciB3d3dBdXRoSGFuZGxlcikKLSAgewotICAgIHd3d0F1dGhIYW5kbGVyXyA9IHd3d0F1dGhIYW5kbGVyOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlQXJndW1lbnRzKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24KLSAgewotICAgIGNsZWFyUGFyc2VkQXJncygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc18ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKEFSR19XU0lMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHdzaWxfID0gYXJnc19bKytpXTsKLSAgICAgIGVsc2UgaWYgKEFSR19XU0RMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHdzZGxzXy5hZGQoYXJnc19bKytpXSk7Ci0gICAgICBlbHNlIGlmIChBUkdfUkVTT0xWRV9XU0RMLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIHJlc29sdmVXU0RMXyA9IHRydWU7Ci0gICAgICBlbHNlIGlmIChBUkdfSFRUUF9CQVNJQ19BVVRIX1VTRVJOQU1FLmVxdWFscyhhcmdzX1tpXSkpCi0gICAgICAgIGh0dHBVc2VybmFtZV8gPSBhcmdzX1srK2ldOwotICAgICAgZWxzZSBpZiAoQVJHX0hUVFBfQkFTSUNfQVVUSF9QQVNTV09SRC5lcXVhbHMoYXJnc19baV0pKQotICAgICAgICBodHRwUGFzc3dvcmRfID0gYXJnc19bKytpXTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudHNFeGNlcHRpb24oYXJnc19baV0pOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgUU5hbWUgcGFyc2VRTmFtZShTdHJpbmcgcW5hbWVTdHJpbmcpCi0gIHsKLSAgICBpbnQgY29sb25JbmRleCA9IHFuYW1lU3RyaW5nLmluZGV4T2YoJzonKTsKLSAgICBTdHJpbmcgbnMgPSAoY29sb25JbmRleCAhPSAtMSkgPyBxbmFtZVN0cmluZy5zdWJzdHJpbmcoMCwgY29sb25JbmRleCkgOiAiIjsKLSAgICBTdHJpbmcgbG9jYWxwYXJ0ID0gKGNvbG9uSW5kZXggIT0gLTEpID8gcW5hbWVTdHJpbmcuc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxLCBxbmFtZVN0cmluZy5sZW5ndGgoKSkgOiBxbmFtZVN0cmluZzsKLSAgICByZXR1cm4gbmV3IFFOYW1lKG5zLCBsb2NhbHBhcnQpOwotICB9Ci0KLSAgcHJpdmF0ZSBRTmFtZSBwYXJzZVFOYW1lKGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUgcW5hbWUpCi0gIHsKLSAgICByZXR1cm4gbmV3IFFOYW1lKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBFbGVtZW50MlN0cmluZyhFbGVtZW50IGUpIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVswXTsKLSAgICBpZiAoZSAhPSBudWxsKQotICAgIHsKLSAgICAgIERPTVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGUpOwotICAgICAgVHJhbnNmb3JtZXIgc2VyaWFsaXplciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICBzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgIHNlcmlhbGl6ZXIudHJhbnNmb3JtKGRvbVNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICBiYW9zLmNsb3NlKCk7Ci0gICAgICBiID0gYmFvcy50b0J5dGVBcnJheSgpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cmluZyhiKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHBsYXRmb3JtMkZpbGUoVVJJRmFjdG9yeSB1cmlGYWN0b3J5LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIHVyaUZhY3RvcnkubmV3VVJJKHVyaSkuYXNGaWxlKCkudG9VUkwoKS50b1N0cmluZygpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgY2hhciBGV0RfU0xBU0ggPSAnLyc7Ci0gIHByaXZhdGUgZmluYWwgY2hhciBCV0RfU0xBU0ggPSAnXFwnOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXJlbnREaXIgPSAiLi4vIjsKLQotICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVVSSShTdHJpbmcgYmFzZVVSSSwgU3RyaW5nIHRhcmdldFVSSSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyBiYXNlVVJJQ29weSA9IGJhc2VVUkkucmVwbGFjZShCV0RfU0xBU0gsIEZXRF9TTEFTSCk7Ci0gICAgICBTdHJpbmcgdGFyZ2V0VVJJQ29weSA9IHRhcmdldFVSSS5yZXBsYWNlKEJXRF9TTEFTSCwgRldEX1NMQVNIKTsKLSAgICAgIGludCBtYXRjaGluZ0luZGV4ID0gLTE7Ci0gICAgICBpbnQgaW5kZXggPSB0YXJnZXRVUklDb3B5LmluZGV4T2YoRldEX1NMQVNIKTsKLSAgICAgIHdoaWxlIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGJhc2VVUklDb3B5LnN0YXJ0c1dpdGgodGFyZ2V0VVJJQ29weS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXRjaGluZ0luZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgaW5kZXggPSB0YXJnZXRVUklDb3B5LmluZGV4T2YoRldEX1NMQVNILCBpbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChtYXRjaGluZ0luZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBpbnQgc2xhc2hDb3VudCA9IC0xOwotICAgICAgICBpbnQgZnJvbUluZGV4ID0gbWF0Y2hpbmdJbmRleDsKLSAgICAgICAgd2hpbGUgKGZyb21JbmRleCAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHNsYXNoQ291bnQrKzsKLSAgICAgICAgICBmcm9tSW5kZXggPSBiYXNlVVJJQ29weS5pbmRleE9mKEZXRF9TTEFTSCwgZnJvbUluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlbGF0aXZlVVJJID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNsYXNoQ291bnQ7IGkrKykKLSAgICAgICAgICByZWxhdGl2ZVVSSS5hcHBlbmQocGFyZW50RGlyKTsKLSAgICAgICAgcmVsYXRpdmVVUkkuYXBwZW5kKHRhcmdldFVSSS5zdWJzdHJpbmcobWF0Y2hpbmdJbmRleCArIDEsIHRhcmdldFVSSS5sZW5ndGgoKSkpOwotICAgICAgICByZXR1cm4gcmVsYXRpdmVVUkkudG9TdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldFVSSTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9TaW1wbGVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL3dzcnQvU2ltcGxlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTA2MjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvd3NydC9TaW1wbGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5wcm92aXNpb25hbC53c3J0LldlYlNlcnZpY2VTY2VuYXJpbzsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbnRleHQgaW1wbGVtZW50cyBJQ29udGV4dCB7Ci0KLQlib29sZWFuIGRldmVsb3A7Ci0JYm9vbGVhbiBhc3NlbWJsZTsKLQlib29sZWFuIGRlcGxveTsKLQlib29sZWFuIGluc3RhbGw7Ci0JYm9vbGVhbiBydW47Ci0JYm9vbGVhbiBjbGllbnQ7Ci0JYm9vbGVhbiB0ZXN0OwotCWJvb2xlYW4gcHVibGlzaDsKLQkKLQlXZWJTZXJ2aWNlU2NlbmFyaW8gc2NlbmFyaW87Ci0JCi0JYm9vbGVhbiBvdmVyd3JpdGVGaWxlczsKLQlib29sZWFuIGNyZWF0ZUZvbGRlcnM7Ci0JYm9vbGVhbiBjaGVja091dEZpbGVzOwotCQotCQotCQotCQotCXB1YmxpYyBTaW1wbGVDb250ZXh0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBTaW1wbGVDb250ZXh0KGJvb2xlYW4gZGV2ZWxvcCwgYm9vbGVhbiBhc3NlbWJsZSwgYm9vbGVhbiBkZXBsb3ksIGJvb2xlYW4gaW5zdGFsbCwgYm9vbGVhbiBydW4sIGJvb2xlYW4gY2xpZW50LCBib29sZWFuIHRlc3QsIGJvb2xlYW4gcHVibGlzaCwgV2ViU2VydmljZVNjZW5hcmlvIHNjZW5hcmlvLCBib29sZWFuIG92ZXJ3cml0ZUZpbGVzLCBib29sZWFuIGZvbGRlcnMsIGJvb2xlYW4gY2hlY2tPdXRGaWxlcykgewotCQlzdXBlcigpOwkJCi0JCXRoaXMuZGV2ZWxvcCA9IGRldmVsb3A7Ci0JCXRoaXMuYXNzZW1ibGUgPSBhc3NlbWJsZTsKLQkJdGhpcy5kZXBsb3kgPSBkZXBsb3k7Ci0JCXRoaXMuaW5zdGFsbCA9IGluc3RhbGw7Ci0JCXRoaXMucnVuID0gcnVuOwotCQl0aGlzLmNsaWVudCA9IGNsaWVudDsKLQkJdGhpcy50ZXN0ID0gdGVzdDsKLQkJdGhpcy5wdWJsaXNoID0gcHVibGlzaDsKLQkJdGhpcy5zY2VuYXJpbyA9IHNjZW5hcmlvOwotCQl0aGlzLm92ZXJ3cml0ZUZpbGVzID0gb3ZlcndyaXRlRmlsZXM7Ci0JCXRoaXMuY3JlYXRlRm9sZGVycyA9IGZvbGRlcnM7Ci0JCXRoaXMuY2hlY2tPdXRGaWxlcyA9IGNoZWNrT3V0RmlsZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldEFzc2VtYmxlKCkgewotCQlyZXR1cm4gYXNzZW1ibGU7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEFzc2VtYmxlKGJvb2xlYW4gYXNzZW1ibGUpIHsKLQkJdGhpcy5hc3NlbWJsZSA9IGFzc2VtYmxlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRDaGVja091dEZpbGVzKCkgewotCQlyZXR1cm4gY2hlY2tPdXRGaWxlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q2hlY2tPdXRGaWxlcyhib29sZWFuIGNoZWNrT3V0RmlsZXMpIHsKLQkJdGhpcy5jaGVja091dEZpbGVzID0gY2hlY2tPdXRGaWxlczsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0Q2xpZW50KCkgewotCQlyZXR1cm4gY2xpZW50OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDbGllbnQoYm9vbGVhbiBjbGllbnQpIHsKLQkJdGhpcy5jbGllbnQgPSBjbGllbnQ7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldENyZWF0ZUZvbGRlcnMoKSB7Ci0JCXJldHVybiBjcmVhdGVGb2xkZXJzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVGb2xkZXJzKGJvb2xlYW4gY3JlYXRlRm9sZGVycykgewotCQl0aGlzLmNyZWF0ZUZvbGRlcnMgPSBjcmVhdGVGb2xkZXJzOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZXBsb3koKSB7Ci0JCXJldHVybiBkZXBsb3k7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERlcGxveShib29sZWFuIGRlcGxveSkgewotCQl0aGlzLmRlcGxveSA9IGRlcGxveTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0RGV2ZWxvcCgpIHsKLQkJcmV0dXJuIGRldmVsb3A7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERldmVsb3AoYm9vbGVhbiBkZXZlbG9wKSB7Ci0JCXRoaXMuZGV2ZWxvcCA9IGRldmVsb3A7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldEluc3RhbGwoKSB7Ci0JCXJldHVybiBpbnN0YWxsOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsKGJvb2xlYW4gaW5zdGFsbCkgewotCQl0aGlzLmluc3RhbGwgPSBpbnN0YWxsOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRPdmVyV3JpdGVGaWxlcygpIHsKLQkJcmV0dXJuIG92ZXJ3cml0ZUZpbGVzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRPdmVyV3JpdGVGaWxlcyhib29sZWFuIG92ZXJ3cml0ZUZpbGVzKSB7Ci0JCXRoaXMub3ZlcndyaXRlRmlsZXMgPSBvdmVyd3JpdGVGaWxlczsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2g7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2goYm9vbGVhbiBwdWJsaXNoKSB7Ci0JCXRoaXMucHVibGlzaCA9IHB1Ymxpc2g7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFJ1bigpIHsKLQkJcmV0dXJuIHJ1bjsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UnVuKGJvb2xlYW4gcnVuKSB7Ci0JCXRoaXMucnVuID0gcnVuOwotCX0KLQlwdWJsaWMgV2ViU2VydmljZVNjZW5hcmlvIGdldFNjZW5hcmlvKCkgewotCQlyZXR1cm4gc2NlbmFyaW87Ci0JfQotCXB1YmxpYyB2b2lkIHNldFNjZW5hcmlvKFdlYlNlcnZpY2VTY2VuYXJpbyBzY2VuYXJpbykgewotCQl0aGlzLnNjZW5hcmlvID0gc2NlbmFyaW87Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldFRlc3QoKSB7Ci0JCXJldHVybiB0ZXN0OwotCX0KLQlwdWJsaWMgdm9pZCBzZXRUZXN0KGJvb2xlYW4gdGVzdCkgewotCQl0aGlzLnRlc3QgPSB0ZXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTNmMjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLXdzZGxlZGl0b3IuamFyCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LndzZGwudWlfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhNGRkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzZGwudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NmEwZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfVUlfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogd3NkbGVkaXRvci5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tcGF0aWJpbGl0eS5QbHVnaW5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlciwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cGFydHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBvbGljaWVzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llcywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLm1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmljb25zLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm5zZWRpdCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudHlwZXN5c3RlbSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWksCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VycywKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvciwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHMsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5ncmFwaC5lZGl0cGFydHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5nZWYsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWksCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWksCi0gb3JnLmVjbGlwc2UueHNkLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS53c3QueHNkLnVpLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLAotIG9yZy53c2RsNGoKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCi1QbHVnaW4tQ2xhc3M6IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0ZWNiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgd3NkbGVkaXRvci5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IHdzZGxlZGl0b3IuamFyCi1zb3VyY2Uud3NkbGVkaXRvci5qYXIgPSBzcmMvCi1vdXRwdXQud3NkbGVkaXRvci5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy9yZWxvYWRncmFtbWFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0YzljYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3JlbG9hZGdyYW1tYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9pY29ucy92YWxpZGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvd3NkbF9maWxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL2ljb25zL3dzZGxfZmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWIxZjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvaWNvbnMvd3NkbF9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1ZDMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hCi0hIFBsdWdpbgotIQotX1VJX1BMVUdJTl9OQU1FICAgICAgICAgICAgID0gV1NETCBFZGl0b3IKLV9VSV9FRElUT1JfTkFNRSAgICAgICAgICAgICA9IFdTREwgRWRpdG9yCi1fVUlfV1NETF9MQUJFTCAgICAgICAgICAgICAgPSBXU0RMIEZpbGVzCi0KLQotX1VJX0hJREVfQklORElOR1MgICAgICAgICAgID0gSGlkZSBCaW5kaW5ncwotX1VJX0JBQ0tfVE8gICAgICAgICAgICAgICAgID0gQmFjayB0byB7MH0KLV9VSV9CQUNLICAgICAgICAgICAgICAgICAgICA9IEJhY2sgdG8gUHJldmlvdXMgVmlldwotCi0hIE5ldyBwcm9wZXJ0eSB0YWJzCi1fVUlfTEFCRUxfR0VORVJBTCAgICAgICA9IEdlbmVyYWwKLV9VSV9MQUJFTF9PVEhFUiAgICAgICAgID0gT3RoZXIKLV9VSV9MQUJFTF9BVFRSSUJVVEVTICAgID0gQXR0cmlidXRlcwotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04gPSBEb2N1bWVudGF0aW9uCi1fVUlfTEFCRUxfRkFDRVRTICAgICAgICA9IEZhY2V0cwotX1VJX0xBQkVMX0VOVU1FUkFUSU9OUyAgPSBFbnVtZXJhdGlvbnMKLV9VSV9MQUJFTF9OQU1FU1BBQ0UgICAgID0gTmFtZXNwYWNlCi0KLSEgU2VjdGlvbiB0aXRsZSBmb3Igb3RoZXIgYXR0cmlidXRlcwotX1VJX1NFQ1RJT05fQURWQU5DRURfQVRUUklCVVRFUyAgID0gQWR2YW5jZWQKLQotIQotISBXb3JrYm9vayBQYWdlcwotIQotX1VJX1RBQl9TT1VSQ0UgPSBTb3VyY2UKLV9VSV9UQUJfR1JBUEggID0gR3JhcGgKLQotX1VJX0FERF9FWFRFTlNJQklMSVRZX0VMRU1FTlQgICAgPSBBZGQgRXh0ZW5zaWJpbGl0eSBFbGVtZW50Ci1fVUlfQ1JFQVRFX1dTRExfRE9DVU1FTlRBVElPTiAgICA9IENyZWF0ZSBXU0RMIERvY3VtZW50YXRpb24KLV9VSV9GT0xERVJfTk9UX0NSRUFURUQgICAgICAgICAgID0gRm9sZGVyIG5vdCBjcmVhdGVkCi1fVUlfQ1JFQVRJTkdfRE9DVU1FTlRBVElPTiAgICAgICA9IENyZWF0aW5nIERvY3VtZW50YXRpb24KLV9VSV9MQUJFTF9DUkVBVEVfRk9MREVSX0ZPUl9ET0NTID0gQ3JlYXRlIGEgbmV3IGZvbGRlciBmb3IgdGhlIGh0bWwgZG9jdW1lbnRhdGlvbiBmaWxlcwotX1VJX0xBQkVMX0NSRUFUSU5HX0hUTUxfRklMRVMgICAgPSBDcmVhdGluZyBIVE1MIGZpbGVzCi1fVUlfTEFCRUxfTkVXX0ZPTERFUiAgICAgICAgICAgICA9IE5ldyBmb2xkZXIKLQotX1VJX0FDVElPTl9BREQgICAgICAgICAgICAgPSBBZGQKLV9VSV9BQ1RJT05fQ09QWSAgICAgICAgICAgID0gQ29weQotX1VJX0FDVElPTl9QQVNURSAgICAgICAgICAgPSBQYXN0ZQotX1VJX0FDVElPTl9ERUxFVEUgICAgICAgICAgPSBEZWxldGUKLV9VSV9BQ1RJT05fTVVMVElQTEVfREVMRVRFID0gTXVsdGlwbGUgRGVsZXRlCi1fVUlfQUNUSU9OX1JFTkFNRSAgICAgICAgICA9IFJlbmFtZQotCi1fVUlfTEFCRUxfQklORElOR19XSVpBUkQgPSBCaW5kaW5nIFdpemFyZAotX1VJX0FDVElPTl9HRU5FUkFURV9IVE1MX0RPQ1VNRU5UQVRJT04gPSBHZW5lcmF0ZSBIVE1MIERvY3VtZW50YXRpb24gZm9yIHRoaXMgV1NETCBkb2N1bWVudAotX1VJX0FDVElPTl9WQUxJREFURV9XU0RMX0RPQ1VNRU5UID0gVmFsaWRhdGUgV1NETCBEb2N1bWVudAotCi1fVUlfQUNUSU9OX0FERF9DSElMRCAgICAgICAgPSBBZGQgQ2hpbGQKLV9VSV9BQ1RJT05fU0VUX0JJTkRJTkcgICAgICA9IFNldCBCaW5kaW5nCi1fVUlfQUNUSU9OX1NFVF9QT1JUVFlQRSAgICAgPSBTZXQgUG9ydFR5cGUKLV9VSV9BQ1RJT05fU0VUX01FU1NBR0UgICAgICA9IFNldCBNZXNzYWdlCi1fVUlfQUNUSU9OX1NFVF9FTEVNRU5UICAgICAgPSBTZXQgRWxlbWVudAotX1VJX0FDVElPTl9TRVRfVFlQRSAgICAgICAgID0gU2V0IFR5cGUKLV9VSV9MQUJFTF9CSU5ESU5HX09QRVJBVElPTiA9IEJpbmRpbmcgT3BlcmF0aW9uCi1fVUlfQUNUSU9OX05FV19NRVNTQUdFICAgICAgPSBOZXcgTWVzc2FnZS4uLgotX1VJX0FDVElPTl9ORVdfU0VSVklDRSAgICAgID0gTmV3IFNlcnZpY2UKLV9VSV9BQ1RJT05fTkVXX1BPUlRUWVBFICAgICA9IE5ldyBQb3J0VHlwZS4uLgotX1VJX0FDVElPTl9ORVdfQklORElORyAgICAgID0gTmV3IEJpbmRpbmcuLi4KLV9VSV9BQ1RJT05fTkVXX1BPUlQgICAgICAgICA9IE5ldyBQb3J0Ci1fVUlfQUNUSU9OX05FV19PUEVSQVRJT04gICAgPSBOZXcgT3BlcmF0aW9uCi1fVUlfQUNUSU9OX05FV19GQVVMVCAgICAgICAgPSBOZXcgRmF1bHQKLV9VSV9BQ1RJT05fTkVXX1BBUlQgICAgICAgICA9IE5ldyBQYXJ0Ci1fVUlfQUNUSU9OX05FV19FTEVNRU5UICAgICAgPSBOZXcgRWxlbWVudC4uLgotX1VJX0FDVElPTl9ORVdfQ09NUExFWF9UWVBFID0gTmV3IENvbXBsZXggVHlwZS4uLgotX1VJX0FDVElPTl9ORVdfU0lNUExFX1RZUEUgID0gTmV3IFNpbXBsZSBUeXBlLi4uCi0KLV9VSV9MQUJFTF9ORVdfQklORElORyAgICAgID0gTmV3IEJpbmRpbmcKLV9VSV9MQUJFTF9ORVdfUE9SVFRZUEUgICAgID0gTmV3IFBvcnRUeXBlCi1fVUlfTEFCRUxfTkVXX01FU1NBR0UgICAgICA9IE5ldyBNZXNzYWdlCi1fVUlfTEFCRUxfTkVXX0VMRU1FTlQgICAgICA9IE5ldyBFbGVtZW50Ci1fVUlfTEFCRUxfTkVXX0NPTVBMRVhfVFlQRSA9IE5ldyBDb21wbGV4IFR5cGUKLV9VSV9MQUJFTF9ORVdfU0lNUExFX1RZUEUgID0gTmV3IFNpbXBsZSBUeXBlCi0KLV9VSV9BQ1RJT05fRVhJU1RJTkdfQklORElORyAgPSBFeGlzdGluZyBCaW5kaW5nLi4uCi1fVUlfQUNUSU9OX0VYSVNUSU5HX1BPUlRUWVBFID0gRXhpc3RpbmcgUG9ydFR5cGUuLi4KLV9VSV9BQ1RJT05fRVhJU1RJTkdfTUVTU0FHRSAgPSBFeGlzdGluZyBNZXNzYWdlLi4uCi1fVUlfQUNUSU9OX0VYSVNUSU5HX0VMRU1FTlQgID0gRXhpc3RpbmcgRWxlbWVudC4uLgotX1VJX0FDVElPTl9FWElTVElOR19UWVBFICAgICA9IEV4aXN0aW5nIFR5cGUuLi4KLQotX1VJX0FDVElPTl9BRERfSU1QT1JUICAgICAgICAgICAgPSBBZGQgSW1wb3J0Ci1fVUlfQUNUSU9OX0FERF9TQ0hFTUEgICAgICAgICAgICA9IEFkZCBTY2hlbWEKLV9VSV9BQ1RJT05fQUREX1NFUlZJQ0UgICAgICAgICAgID0gQWRkIFNlcnZpY2UKLV9VSV9BQ1RJT05fQUREX0JJTkRJTkcgICAgICAgICAgID0gQWRkIEJpbmRpbmcKLV9VSV9BQ1RJT05fQUREX09QRVJBVElPTiAgICAgICAgID0gQWRkIE9wZXJhdGlvbgotX1VJX0FDVElPTl9BRERfQklORElOR19PUEVSQVRJT04gPSBBZGQgQmluZGluZyBPcGVyYXRpb24KLV9VSV9BQ1RJT05fQUREX1BBUlQgICAgICAgICAgICAgID0gQWRkIFBhcnQKLV9VSV9BQ1RJT05fQUREX1BPUlQgICAgICAgICAgICAgID0gQWRkIFBvcnQKLV9VSV9BQ1RJT05fQUREX1BPUlRUWVBFICAgICAgICAgID0gQWRkIFBvcnRUeXBlCi1fVUlfQUNUSU9OX0FERF9NRVNTQUdFICAgICAgICAgICA9IEFkZCBNZXNzYWdlCi1fVUlfQUNUSU9OX0FERF9JTlBVVCAgICAgICAgICAgICA9IEFkZCBJbnB1dAotX1VJX0FDVElPTl9BRERfT1VUUFVUICAgICAgICAgICAgPSBBZGQgT3V0cHV0Ci1fVUlfQUNUSU9OX0FERF9GQVVMVCAgICAgICAgICAgICA9IEFkZCBGYXVsdAotCi1fVUlfTEFCRUxfREVGSU5JVElPTiA9IERlZmluaXRpb24KLV9VSV9MQUJFTF9CSU5ESU5HICAgID0gQmluZGluZwotX1VJX0xBQkVMX0lOUFVUICAgICAgPSBJbnB1dAotX1VJX0xBQkVMX09VVFBVVCAgICAgPSBPdXRwdXQKLV9VSV9MQUJFTF9GQVVMVCAgICAgID0gRmF1bHQKLV9VSV9MQUJFTF9NRVNTQUdFICAgID0gTWVzc2FnZQotX1VJX0xBQkVMX1BPUlQgICAgICAgPSBQb3J0Ci1fVUlfTEFCRUxfUE9SVFRZUEUgICA9IFBvcnRUeXBlCi1fVUlfTEFCRUxfU0VSVklDRSAgICA9IFNlcnZpY2UKLV9VSV9MQUJFTF9FTEVNRU5UUyAgID0gRWxlbWVudHMKLV9VSV9MQUJFTF9UWVBFUyAgICAgID0gVHlwZXMKLV9VSV9MQUJFTF9OQU1FICAgICAgID0gTmFtZQotX1VJX0xBQkVMX09QRVJBVElPTiAgPSBPcGVyYXRpb24KLV9VSV9MQUJFTF9FTEVNRU5UICAgID0gRWxlbWVudAotX1VJX0xBQkVMX1RZUEUgICAgICAgPSBUeXBlCi0KLV9VSV9MQUJFTF9NQVRDSElOR19CSU5ESU5HUyAgPSBNYXRjaGluZyBCaW5kaW5nczoKLV9VSV9MQUJFTF9NQVRDSElOR19QT1JUVFlQRVMgPSBNYXRjaGluZyBQb3J0VHlwZXM6Ci1fVUlfTEFCRUxfTUFUQ0hJTkdfTUVTU0FHRVMgID0gTWF0Y2hpbmcgTWVzc2FnZXM6Ci1fVUlfTEFCRUxfTUFUQ0hJTkdfVFlQRVMgICAgID0gTWF0Y2hpbmcgVHlwZXM6Ci1fVUlfTEFCRUxfTUFUQ0hJTkdfRUxFTUVOVFMgID0gTWF0Y2hpbmcgRWxlbWVudHM6Ci0KLV9VSV9MQUJFTF9ORVdfQ09NUE9ORU5UICA9IE5ldyBDb21wb25lbnQKLQotX1VJX0xBQkVMX1JFQURfT05MWSAgICAgPSByZWFkLW9ubHkKLQotISBOb3RlIHRvIHRyYW5zbGF0b3JzOiBrZWVwIHRoZSBvbmUgY2hhcmFjdGVyIHNwYWNlIGFuZCBjb2xvbiBhZnRlciB0aGUgdHJhbnNsYXRpb24gb2YgVmlldwotX1VJX01FTlVfVklFVyAgICAgICAgID0gVmlldyA6Ci1fVUlfTEFCRUxfWFNEX0NPTVBPTkVOVFMgPSBYU0QgQ29tcG9uZW50cwotCi1fVUlfTEFCRUxfVU5LTk9XTl9PQkpFQ1QgPSBVbmtub3duIE9iamVjdAotX1VJX0xBQkVMX1VOS05PV05fTk9ERSAgID0gVW5rbm93biBOb2RlCi1fVUlfTEFCRUxfVklFV19OT1RfQVZBSUxBQkxFID0gVmlldyBub3QgYXZhaWxhYmxlIGZvciBzZWxlY3RlZCBvYmplY3QKLQotX1VJX0xBQkVMX1BPUlRfV19DT0xPTiAgICAgPSBQb3J0IDogCi1fVUlfTEFCRUxfUE9SVFRZUEVfV19DT0xPTiA9IFBvcnRUeXBlIDogCi1fVUlfTEFCRUxfU0VSVklDRV9XX0NPTE9OICA9IFNlcnZpY2UgOiAKLV9VSV9MQUJFTF9VTktOT1dOICA9IFVua25vd24gOiAKLV9VSV9MQUJFTF9WSUVXX0JZX1NFUlZJQ0UgPSBWaWV3IEJ5IDogU2VydmljZQotCi1fVUlfRk9MREVSX0lNUE9SVFMgPSBJbXBvcnRzCi1fVUlfRk9MREVSX01FU1NBR0VTPSBNZXNzYWdlcwotX1VJX0ZPTERFUl9TRVJWSUNFUyA9IFNlcnZpY2VzCi1fVUlfRk9MREVSX0JJTkRJTkdTID0gQmluZGluZ3MKLV9VSV9GT0xERVJfUE9SVFRZUEVTID0gUG9ydCBUeXBlcwotX1VJX0ZPTERFUl9UWVBFUyAgICAgPSBUeXBlcwotX1VJX0ZPTERFUl9FWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRXh0ZW5zaWJsaXR5IEVsZW1lbnRzCi1fVUlfRk9MREVSX0RFRklOSVRJT04gPSBEZWZpbml0aW9uCi0KLV9VSV9MQUJFTF9OT05FID0gKG5vbmUpCi1fVUlfTUVOVUJBUl9HRU5FUkFURV9CSU5ESU5HID0gR2VuZXJhdGUgQmluZGluZwotCi1fVUlfTEFCRUxfSFRUUF9CSU5ESU5HX09QVElPTlMgPSBIVFRQIEJpbmRpbmcgT3B0aW9ucwotCi1fVUlfU09NRV9FTEVNRU5UX05BTUUgPSBzb21lLWVsZW1lbnQtbmFtZQotCi1fVUlfTEFCRUxfQklORElOR19JTlBVVCAgID0gQmluZGluZyBJbnB1dAotX1VJX0xBQkVMX0JJTkRJTkdfT1VUUFVUICA9IEJpbmRpbmcgT3V0cHV0Ci1fVUlfTEFCRUxfQklORElOR19GQVVMVCAgID0gQmluZGluZyBGYXVsdAotCi1fVUlfTEFCRUxfQklORElOR19PUEVSQVRJT04gPSBCaW5kaW5nIE9wZXJhdGlvbgotCi1fVUlfTEFCRUxfVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQgPSBVbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudAotCi1fVUlfTEFCRUxfSU1QT1JUID0gSW1wb3J0Ci1fVUlfTEFCRUxfTkFNRVNQQUNFID0gTmFtZXNwYWNlCi1fVUlfTEFCRUxfUFJFRklYID0gUHJlZml4Ci1fVUlfTEFCRUxfTE9DQVRJT04gPSBMb2NhdGlvbgotX1VJX1RJVExFX1NFTEVDVCA9IFNlbGVjdAotX1VJX1RJVExFX1NFTEVDVF9GSUxFID0gU2VsZWN0IEZpbGUKLV9VSV9ERVNDUklQVElPTl9TRUxFQ1RfV1NETF9PUl9YU0QgPSBTZWxlY3QgYSBXU0RMIG9yIFhTRCBmaWxlIHRvIGltcG9ydC4KLQotX1VJX0xBQkVMX1BBUkFNRVRFUl9PUkRFUiA9IFBhcmFtZXRlciBPcmRlcgotX1VJX0xBQkVMX1BBUlQgPSBQYXJ0Ci1fVUlfTEFCRUxfUkVGRVJFTkNFX0tJTkQgPSBSZWZlcmVuY2Uga2luZDoKLV9VSV9MQUJFTF9PVkVSVklFVyA9IE92ZXJ2aWV3Ci1fVUlfTEFCRUxfVklFV19OT1RfSU1QTEVNRU5URUQgPSBUaGlzIHZpZXcgaXMgbm90IHlldCBpbXBsZW1lbnRlZC4KLV9VSV9MQUJFTF9CSU5ESU5HX1ZJRVcgPSBCaW5kaW5nIFZpZXcKLV9VSV9MQUJFTF9ET0NVTUVOVElPTiA9IERvY3VtZW50YXRpb24KLV9VSV9MQUJFTF9QUk9QRVJUWSA9IFByb3BlcnR5Ci1fVUlfTEFCRUxfVkFMVUUgPSBWYWx1ZQotCi1fVUlfQlVUVE9OX05FVyAgICA9IE5ldy4uLgotX1VJX0JVVFRPTl9JTVBPUlQgPSBJbXBvcnQuLi4KLQotX1VJX0JVVFRPTl9DUkVBVEVfQVNTT0NJQVRFRF9CSU5ESU5HUyA9IENyZWF0ZSBhc3NvY2lhdGVkIGJpbmRpbmdzCi1fVUlfVElUTEVfR0VORVJBVEVfQklORElOR19XSVpBUkQgPSBHZW5lcmF0ZSBCaW5kaW5nIFdpemFyZAotCi1fVUlfTEFCRUxfTkFNRVNQQUNFX1VSSVNfVE9fQkVfSU5DTFVERUQgPSBOYW1lc3BhY2UgVVJJcyB0byBiZSBpbmNsdWRlZAotX1VJX0FDVElPTl9BREQgPSBBZGQKLQotX1VJX1RJVExFX1NFTEVDVF9XU0RMX0ZJTEUgPSBTZWxlY3QgV1NETCBGaWxlCi1fVUlfREVTQ1JJUFRJT05fU0VMRUNUX1dTRExfRklMRV9UT19JTVBPUlQgPSBTZWxlY3QgYSBXU0RMIGZpbGUgdG8gaW1wb3J0Ci0KLV9VSV9USVRMRV9TUEVDSUZZX0JJTkRJTkcgPSBTcGVjaWZ5IEJpbmRpbmcKLV9VSV9USVRMRV9TUEVDSUZZX1RZUEUgPSBTcGVjaWZ5IFR5cGUKLV9VSV9USVRMRV9TUEVDSUZZX0VMRU1FTlQgPSBTcGVjaWZ5IEVsZW1lbnQKLV9VSV9USVRMRV9TUEVDSUZZX01FU1NBR0UgPSBTcGVjaWZ5IE1lc3NhZ2UKLV9VSV9USVRMRV9TUEVDSUZZX1BPUlRUWVBFID0gU3BlY2lmeSBQb3J0IFR5cGUKLQotX1VJX1RJVExFX1NQRUNJRllfQklORElOR19ERVRBSUxTID0gU3BlY2lmeSBCaW5kaW5nIERldGFpbHMKLV9VSV9MQUJFTF9TUEVDSUZZX0JJTkRJTkdfREVUQUlMU19ERVNDID0gU3BlY2lmeSB0aGUgZGV0YWlscyBvZiB0aGUgYmluZGluZyB5b3Ugd2lzaCB0byBnZW5lcmF0ZS4KLQotISBUcmFuc2xhdG9yczogTGVhdmUgdGhlIHswfSBhcyBpcwotX1VJX1JBRElPX1NFTEVDVF9FWElTVElORyAgPSBTZWxlY3QgYW4gZXhpc3RpbmcgezB9Ci1fVUlfUkFESU9fQ1JFQVRFX05FVyAgICAgICA9IENyZWF0ZSBhIG5ldyB7MH0KLV9VSV9SQURJT19JTVBPUlRfRlJPTV9GSUxFID0gSW1wb3J0IHswfSBmcm9tIGEgZmlsZQotX1VJX0xBQkVMX05BTUVfT0ZfSVRFTSAgICAgPSBOYW1lIG9mIHswfToKLQotISBUcmFuc2xhdG9yczogTGVhdmUgdGhlIHswfSBhcyBpcwotX1VJX0RFU0NSSVBUSU9OX0NIT09TRV9GUk9NX0VYSVNUSU5HID0gQ2hvb3NlIHswfSBmcm9tIHRoZSBsaXN0Ci1fVUlfREVTQ1JJUFRJT05fUFJPVklERV9OQU1FID0gUHJvdmlkZSBhIG5hbWUgb2YgdGhlIHswfSB0byBjcmVhdGUKLV9VSV9ERVNDUklQVElPTl9JTVBPUlRfRklMRSA9IFNlbGVjdCBhIGZpbGUgYW5kIHRoZW4gY2hvb3NlIHRoZSB7MH0KLV9VSV9IRUxQID0gSGVscAotX1VJX0xBQkVMX0ZJTEUgPSBGaWxlOgotX1VJX0JVVFRPTl9CUk9XU0UgPSBCcm93c2UuLi4KLQotX1VJX1RJVExFX05FV19XU0RMX0ZJTEUgPSBOZXcgV1NETCBGaWxlCi1fVUlfVElUTEVfT1BUSU9OUyAgICAgICA9IE9wdGlvbnMKLQotX1VJX0RFU0NSSVBUSU9OX1NQRUNJRllfQklORElOR19QQUdFID0gRGVzY3JpcHRpb24gb2YgU3BlY2lmeSBCaW5kaW5nIFBhZ2UKLV9VSV9SQURJT19HRU5FUkFURV9DT05URU5UID0gR2VuZXJhdGUgY29udGVudCBmb3IgYW4gZXhpc3RpbmcgYmluZGluZwotX1VJX1JBRElPX0dFTkVSQVRFX05FV19CSU5ESU5HID0gR2VuZXJhdGUgYSBuZXcgYmluZGluZwotX1VJX0xBQkVMX0JJTkRJTkdfTkFNRSA9IE5hbWU6Ci1fVUlfTEFCRUxfQklORElOR19QUk9UT0NPTCA9IFByb3RvY29sOgotX1VJX0NIRUNLQk9YX09WRVJXUklURSA9IE92ZXJ3cml0ZSBleGlzdGluZyBiaW5kaW5nIGluZm9ybWF0aW9uCi1fVUlfTEFCRUxfU09BUF9CSU5ESU5HX09QVElPTlMgPSBTT0FQIEJpbmRpbmcgT3B0aW9ucwotX1VJX1JBRElPX0RPQ1VNRU5UX0xJVEVSQUwgPSBkb2N1bWVudCBsaXRlcmFsCi1fVUlfUkFESU9fUlBDX0xJVEVSQUwgPSBycGMgbGl0ZXJhbAotX1VJX1JBRElPX1JQQ19FTkNPREVEID0gcnBjIGVuY29kZWQKLQotX1VJX0RFU0NSSVBUSU9OX05FV19XU0RMX0ZJTEUgPSBTcGVjaWZ5IHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgbmV3IFdTREwgZmlsZS4KLV9VSV9MQUJFTF9UQVJHRVRfTkFNRVNQQUNFID0gVGFyZ2V0IG5hbWVzcGFjZToKLV9VSV9MQUJFTF9QUkVGSVhfV0lUSF9DT0xPTiA9IFByZWZpeDoKLV9VSV9MQUJFTF9ERUZJTklUSU9OX05BTUUgICA9IERlZmluaXRpb24gbmFtZToKLV9VSV9MQUJFTF9DUkVBVEVfTkVXX1dTRExfRklMRSA9IENyZWF0ZSBhIG5ldyBXU0RMIEZpbGUKLV9VSV9MQUJFTF9DUkVBVEVfV1NETF9TS0VMRVRPTiA9IENyZWF0ZSBXU0RMIFNrZWxldG9uCi1fVUlfTEFCRUxfTkVXX0NBVEVHT1JZX05BTUVfV1MgPSBXZWIgU2VydmljZXMKLQotISBUcmFuc2xhdG9yczogTGVhdmUgdGhlIHswfSBhcyBpcwotX1VJX0VSUk9SX05BTUVTUEFDRV9JTlZBTElEID0gVGhlIHRhcmdldCBuYW1lc3BhY2UgaXMgaW52YWxpZAotX1VJX0VSUk9SX1BSRUZJWF9JU19JTlZBTElEID0gUHJlZml4IHswfSBpcyBpbnZhbGlkCi1fVUlfRVJST1JfUFJFRklYX0lTX0FfRFVQTElDQVRFID0gUHJlZml4IHswfSBpcyBhIGR1cGxpY2F0ZQotX1VJX0VSUk9SX01PUkVfVEhBTl9PTkVfUFJFRklYX0lTX0JMQU5LID0gTW9yZSB0aGFuIG9uZSBwcmVmaXggaXMgYmxhbmsKLV9VSV9FUlJPUl9GSUxFX01VU1RfRU5EX1dJVEhfV1NETCA9IEVycm9yOiBGaWxlIG11c3QgZW5kIHdpdGggd3NkbAotX1VJX0VSUk9SX0ZJTEVfQUxSRUFEWV9FWElTVFMgPSBGaWxlIGFscmVhZHkgZXhpc3RzOiB7MH0KLQotX1VJX0VSUk9SX0lOVkFMSURfV1NETCA9IEludmFsaWQgV1NETAotX1VJX0VSUk9SX0lOVkFMSURfV1NETF9ERVNDID0gVGhlIFdTREwgRmlsZSBpcyBpbnZhbGlkLiAgRml4IGVycm9ycyBhbmQgdGhlbiByZXRyeSB0aGlzIGFjdGlvbi4KLV9VSV9FUlJPUl9FUlJPUiAgICAgICAgICAgICA9IEVycm9yCi1fVUlfRVJST1JfRk9MREVSX05PVF9DUkVBVEVEICA9IEZvbGRlciBub3QgY3JlYXRlZC4KLV9VSV9FUlJPUl9DUkVBVElOR19IVE1MX0ZJTEVTID0gRXJyb3IgY3JlYXRpbmcgSFRNTCBmaWxlcy4KLQotX1VJX0VSUk9SX0lNUE9SVF9FUlJPUiAgICAgID0gSW1wb3J0IEVycm9yCi1fVUlfRVJST1JfSU1QT1JUSU5HX0lUU0VMRiAgPSBUaGlzIGZpbGUgaXMgYXR0ZW1wdGluZyB0byBpbXBvcnQgaXRzZWxmLiAgQ2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW1wb3J0LgotCi0KLV9VSV9VU0VfV1MtSV9TVFlMRV9TQ0hFTUFfSU1QT1JUICAgICAgID0gVXNlIFdTLUkgc3R5bGUgc2NoZW1hIGltcG9ydAotX1VJX0JJTkRJTkdfV0laQVJEICAgICAgICAgICAgICAgICAgICAgPSBCaW5kaW5nIFdpemFyZAotX1VJX1NQRUNJRllfQklORElOR19ERVRBSUxTX0xBQkVMICAgICAgPSBTcGVjaWZ5IHRoZSBkZXRhaWxzIG9mIHRoZSBiaW5kaW5nIHRoYXQgd2lsbCBiZSBjcmVhdGVkCi1fVUlfUE9SVF9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICA9IFBvcnQgVHlwZQotX1VJX1BPUlRfV0laQVJEICAgICAgICAgICAgICAgICAgICAgICAgPSBQb3J0IFdpemFyZAotX1VJX1NQRUNJRllfUE9SVF9ERVRBSUxTICAgICAgICAgICAgICAgPSBTcGVjaWZ5IFBvcnQgRGV0YWlscwotX1VJX1NQRUNJRllfUE9SVF9ERVRBSUxTX1RPX0JFX0NSRUFURUQgPSBTcGVjaWZ5IHRoZSBkZXRhaWxzIG9mIHRoZSBwb3J0IHRoYXQgd2lsbCBiZSBjcmVhdGVkCi1fVUlfQklORElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEJpbmRpbmcKLV9VSV9OQU1FU1BBQ0VTICAgICAgICAgICAgICAgICAgICAgICAgID0gTmFtZXNwYWNlcwotX1VJX0VESVRfTkFNRVNQQUNFUyAgICAgICAgICAgICAgICAgICAgPSBFZGl0IE5hbWVzcGFjZXMuLi4KLV9VSV9TRUxFQ1RfUkVHSVNURVJFRF9OQU1FU1BBQ0VTICAgICAgID0gU2VsZWN0IEZyb20gUmVnaXN0ZXJlZCBOYW1lc3BhY2VzCi1fVUlfU1BFQ0lGWV9ORVdfTkFNRVNQQUNFICAgICAgICAgICAgICA9IFNwZWNpZnkgTmV3IE5hbWVzcGFjZQotX1VJX1NFTEVDVF9OQU1FU1BBQ0VfVE9fQUREICAgICAgICAgICAgPSBTZWxlY3QgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgdG8gYWRkLgotX1VJX0VOVEVSX1JFUV9QUkVGSVhfQU5EX05BTUVTUEFDRSAgICAgPSBFbnRlciB0aGUgcmVxdWlyZWQgcHJlZml4IGFuZCBuYW1lc3BhY2UgVVJJIGZvciB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgotX1VJX1RBUkdFVF9OQU1FU1BBQ0UgICAgICAgICAgICAgICAgICAgPSBUYXJnZXQgTmFtZXNwYWNlCi1fVUlfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OUyAgICAgICAgICAgICA9IE5hbWVzcGFjZSBEZWNsYXJhdGlvbnMKLV9VSV9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQWRkLi4uCi1fVUlfQUREX05BTUVTUEFDRV9ERUNMQVJBVElPTlNfVElUTEUgICA9IEFkZCBOYW1lc3BhY2UgRGVjbGFyYXRpb25zCi1fVUlfU09BUF9QT1JUX0RFVEFJTFMgICAgICAgICAgICAgICAgICA9IFNPQVAgUG9ydCBEZXRhaWxzCi1fVUlfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICA9IExvY2F0aW9uOgotX1VJX0hUVFBfUE9SVF9ERVRBSUxTICAgICAgICAgICAgICAgICAgPSBIVFRQIFBvcnQgRGV0YWlscwotX1VJX0VESVRfTkFNRVNQQUNFU19ESUFMT0dfVElUTEUgICAgICAgPSBFZGl0IE5hbWVzcGFjZXMKLV9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRCAgICAgICAgICAgICAgID0gRGVwZW5kZW5jaWVzIENoYW5nZWQKLV9VSV9ERVBFTkRFTkNJRVNfQ0hBTkdFRF9SRUZSRVNIICAgICAgID0gT25lIG9yIG1vcmUgZGVwZW5kZW5jaWVzIGhhdmUgY2hhbmdlZC4gIERvIHlvdSB3YW50IHRvIHJlZnJlc2ggdGhlIGVkaXRvciB0byByZWZsZWN0IHRoZXNlIGNoYW5nZXM/Ci1fVUlfUkVMT0FEX0RFUEVOREVOQ0lFUyAgICAgICAgICAgICAgICA9IFJlbG9hZCBEZXBlbmRlbmNpZXMKLV9VSV9VTlNQRUNJRklFRCAgICAgICAgICAgICAgICAgICAgICAgID0gKHVuc3BlY2lmaWVkKQotX1VJX05PX0lNUE9SVF9TUEVDSUZJRUQgICAgICAgICAgICAgICAgPSAobm8gaW1wb3J0IGxvY2F0aW9uIHNwZWNpZmllZCkKLV9VSV9HRU5FUkFURV9CSU5ESU5HX0NPTlRFTlQgICAgICAgICAgID0gR2VuZXJhdGUgQmluZGluZyBDb250ZW50Li4uCi1fVUlfT1BFTl9JTVBPUlQgICAgICAgICAgICAgICAgICAgICAgICA9IE9wZW4gSW1wb3J0Ci0KLV9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFID0gRGVmYXVsdCBUYXJnZXQgTmFtZXNwYWNlOgotX1VJX1BSRUZfUEFHRV9BVVRPX1JFR0VORVJBVEVfQklORElORyAgPSBSZWdlbmVyYXRlIEJpbmRpbmcgb24gc2F2ZQotX1VJX1BSRUZfUEFHRV9DUkVBVElOR19GSUxFUwkJICAgPSBDcmVhdGluZyBmaWxlcwotCi1fVUlfQ1JFQVRFX01FU1NBR0VfQ0hFQ0tCT1hfTEFCRUwgICAgICAgPSBDcmVhdGUgZGVmYXVsdCBtZXNzYWdlcwotX1VJX0RFTEVURV9BU1NPQ0lBVEVEX01TR19BTkRfUEFSVFMgICAgID0gRGVsZXRlIGFzc29jaWF0ZWQgTWVzc2FnZXMgYW5kIFBhcnRzCi1fVUlfREVMRVRFX09QRVJBVElPTl9USVRMRSAgICAgICAgICAgICAgPSBEZWxldGUgT3BlcmF0aW9uCi1fVUlfTEFCRUxfV0FSTklOR19EVVBMSUNBVEVfTkFNRV9FWElTVFMgPSBXYXJuaW5nOiBkdXBsaWNhdGUgbmFtZSBhbHJlYWR5IGV4aXN0cwotCi1fV0FSTl9OQU1FX0hBU19TUEFDRSAgICAgICAgID0gSVdBWDE0MDJXIE5hbWUgZmllbGQgY2Fubm90IGNvbnRhaW4gYSBzcGFjZQotX1dBUk5fTkFNRV9JTlZBTElEX0ZJUlNUICAgICAgPSBJV0FYMTQwM1cgRmlyc3QgY2hhcmFjdGVyIGluIG5hbWUgZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyAoJ18nLCAnOicsICdsZXR0ZXInKQotX1dBUk5fTkFNRV9NVVNUX0NPTlRBSU5fQVRfTEVBU1RfT05FX0NIQVIgPSBJV0FYMTQxNVcgTmFtZSBmaWVsZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcgotX1dBUk5fTkFNRV9JTlZBTElEX0NIQVIgICAgICAgPSBJV0FYMTQwNFcgTmFtZSBmaWVsZCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlciAoJwotX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCAgID0gJykKLQotISBDb3BpZWQgZnJvbSBzc2UKLTIzY29uY2F0X0VYQ189UmVzb3VyY2UgezB9IGRvZXMgbm90IGV4aXN0LgotMzJjb25jYXRfRVhDXz1FZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9Ci1Bbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGVuIGluaXRpYWxpemluZyB0aGUgaW5wdXQgZm9yIHRoZSB0aGUgZWRpdG9yJ3Mgc291cmNlIHBhZ2UuCi0hIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSEgVHJhbnNsYXRvcnMgOiBwbGVhc2UgZG9uJ3QgdHJhbnNsYXRlIGFueSBzdHJpbmcgYmVsb3cgdGhpcyBsaW5lIAotISAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0hIF9ERUJVR19VUERBVEVfUE9MSUNZID0gMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkZWM2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iJV9VSV9FRElUT1JfTkFNRSIKLSAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICBpY29uPSJpY29ucy93c2RsX2ZpbGVfb2JqLmdpZiIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9IndzZGwiICAgICAgICAgICAKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMQWN0aW9uQmFyQ29udHJpYnV0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvciI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPiAgICAKLQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW50ZXJuYWxFZGl0b3JFeHRlbnNpb25zIiBuYW1lPSJJbnRlcm5hbCBFZGl0b3IgRXh0ZW5zaW9ucyIvPiAgCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMiIG5hbWU9IkV4dGVuc2liaWxpdHkgSXRlbSBUcmVlIFByb3ZpZGVycyIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0icHJvcGVydHlTb3VyY2VQcm92aWRlciIgbmFtZT0iUHJvcGVydHkgU291cmNlIFByb3ZpZGVycyIvPgotICAgCi0gICA8IS0tIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gc3VwbGVtZW50IFdTREwgMS4xIHNjaGVtYXMgaW4gb3JkZXIgdG8gICAtLT4KLSAgIDwhLS0gY29uc3RyYWluIHRoZSBleHRlbnNpYmxpdHkgZWxlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCBhdCB0aGUgJ3dzZGwnIGxldmVsIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIiIG5hbWU9IkV4dGVuc2libGl0eSBFbGVtZW50IEZpbHRlciIvPiAgIAotCi0gIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyIiBuYW1lPSJQcm9wZXJ0eSBEZXNjcmlwdG9yIFByb3ZpZGVyIi8+ICAgCi0gICAgICAgIAotICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZXRhaWxzVmlld2VyUHJvdmlkZXJzIiBuYW1lPSJEZXRhaWxzIFZpZXdlciBQcm92aWRlcnMiLz4gICAgCi0gICAgICAgICAgIAotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMiPgotICAgICAgPGV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMuaHR0cCIKLSAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICAgICAgICBsYWJlbFByb3ZpZGVyQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuSFRUUExhYmVsUHJvdmlkZXIiPiAgICAgICAgIAotICAgICAgPC9leHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgICAgICAgCi0KLSAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzLnNvYXAiCi0gICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLSAgICAgICAgbGFiZWxQcm92aWRlckNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lLlNPQVBMYWJlbFByb3ZpZGVyIj4gICAgICAgICAKLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgICAgICAgICAgIAotCi0KLQotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciI+Ci0gICAgICA8ZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIKLSAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLlNvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciI+Ci0gICAgICA8ZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIKLSAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLkh0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXI+Ci0gICA8L2V4dGVuc2lvbj4gICAKLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5leHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciI+Ci0gICAgICA8ZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIKLSAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyLk1pbWVFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIj4KLSAgICAgIDwvZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXI+Ci0gICA8L2V4dGVuc2lvbj4gICAgCi0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIiPgotICAgICAgPGV4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyCi0gICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXIuWFNERXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciI+Ci0gICAgICA8L2V4dGVuc2liaWxpdHlFbGVtZW50RmlsdGVyPgotICAgPC9leHRlbnNpb24+ICAgICAgCi0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICA8Y2F0ZWdvcnkKLSAgICAgCWlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3IgotICAgICAJbmFtZT0iJV9VSV9MQUJFTF9ORVdfQ0FURUdPUllfTkFNRV9XUyIvPgotICAgICA8d2l6YXJkCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpIgotICAgICAgIG5hbWU9IldTREwiCi0gICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHMuTmV3V1NETFdpemFyZCIKLSAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldyIKLSAgICAgICBpY29uPSJpY29ucy93c2RsX2ZpbGVfb2JqLmdpZiI+Ci0gICAgICAgPGRlc2NyaXB0aW9uPiVfVUlfTEFCRUxfQ1JFQVRFX05FV19XU0RMX0ZJTEU8L2Rlc2NyaXB0aW9uPgotICAgICAgIDxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4gCi0gICAgIDwvd2l6YXJkPgotCi0gICAgIDx3aXphcmQKLSAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkiCi0gICAgICAgbmFtZT0iV1NETCIKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdXU0RMV2l6YXJkIgotICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuWE1MQ2F0ZWdvcnkiCi0gICAgICAgaWNvbj0iaWNvbnMvd3NkbF9maWxlX29iai5naWYiPgotICAgICAgIDxkZXNjcmlwdGlvbj4lX1VJX0xBQkVMX0NSRUFURV9ORVdfV1NETF9GSUxFPC9kZXNjcmlwdGlvbj4KLSAgICAgICA8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+IAotICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPiAKLSAgIDxlZGl0b3JDb250cmlidXRpb24gCi0gICAgICBpZD0ib3JnLmVjbGlwc2UudWkuYXJ0aWNsZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbi5lZGl0b3IyIiAKLSAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yIj4KLQotICAgICAgPG1lbnUKLSAgICAgICAgIGlkPSJXU0RMRWRpdG9yIgotICAgICAgICAgbGFiZWw9IiVfVUlfRURJVE9SX05BTUUiCi0gICAgICAgICBwYXRoPSJhZGRpdGlvbnMiPgotICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJncm91cDEiLz4KLSAgICAgIDwvbWVudT4KLSAgICAgCi0gICAgICA8YWN0aW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuYWN0aW9ucy5SZWxvYWREZXBlbmRlbmNpZXNBY3Rpb25EZWxlZ2F0ZSIgCi0gICAgICAgICBsYWJlbD0iJV9VSV9SRUxPQURfREVQRU5ERU5DSUVTIgotICAgICAgICAgaWNvbj0iaWNvbnMvcmVsb2FkZ3JhbW1hci5naWYiIAotICAgICAgICAgdG9vbHRpcD0iUmVsb2FkIERlcGVuZGVuY2llcyIKLSAgICAgICAgIG1lbnViYXJQYXRoPSJXU0RMRWRpdG9yL2dyb3VwMSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlbG9hZERlcGVuZGVuY2llc0FjdGlvbkRlbGVnYXRlIj4gCi0gICAgICA8L2FjdGlvbj4gIAotICAgICAgICAgCi0gICAgICA8IS0tCi0gICAgICA8YWN0aW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5WYWxpZGF0ZUFjdGlvbkRlbGVnYXRlIiAKLSAgICAgICAgIGxhYmVsPSIlX1VJX0FDVElPTl9WQUxJREFURV9XU0RMX0RPQ1VNRU5UIiAKLSAgICAgICAgIGljb249Imljb25zL3ZhbGlkYXRlLmdpZiIgCi0gICAgICAgICB0b29sdGlwPSIlX1VJX0FDVElPTl9WQUxJREFURV9XU0RMX0RPQ1VNRU5UIgotICAgICAgICAgbWVudWJhclBhdGg9IldTRExFZGl0b3IvZ3JvdXAxIgotICAgICAgICAgdG9vbGJhclBhdGg9IiVOb3JtYWwvV1NETEVkaXRvciIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlZhbGlkYXRlQWN0aW9uRGVsZWdhdGUiPiAKLSAgICAgIDwvYWN0aW9uPiAgICAgIAotICAgICAgLS0+Ci0gICAgICAgICAgICAgICAgIAotICAgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgotPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCTwhLS0gcGxhY2UgZXZlcnl0aGluZyBpbiAiV2ViIGFuZCBYTUwiIC0tPgotICAgICAgPHBhZ2UKLQkJCW5hbWU9IiVfVUlfV1NETF9MQUJFTCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETFByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETFByZWZlcmVuY2VQYWdlIgotICAgICAgLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5kZWRjb25maWd1cmF0aW9uIj4KLSAgICAgIDwhLS0gYWRkIHByZWZlcmVuY2UgcGFnZXMgdG8gdGhlIGNvbnRleHQgbWVudSBhY3Rpb24gKElEIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZGVjbGFyZWQgInBhdGgiIGFib3ZlKSAtLT4KLSAgICAgIDxkZWZpbml0aW9uCi0gICAgICAJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLSAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIHRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvci5zb3VyY2UiIC8+Ci08IS0tCi0gICAgICA8cHJvcGVydHlzaGVldGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLldTRExQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIHRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETFRleHRFZGl0b3IiPgotICAgICAgPC9wcm9wZXJ0eXNoZWV0Y29uZmlndXJhdGlvbj4KLS0tPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMucHJvcGVydHlDb250cmlidXRvciI+Ci0gICAgICA8cHJvcGVydHlDb250cmlidXRvcgotICAgICAgICAgICAgdHlwZU1hcHBlcj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLldTRExUeXBlTWFwcGVyIgotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETFRleHRFZGl0b3IiCi0gICAgICAgICAgICBzZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uV1NETFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIiCi0gICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uV1NETExhYmVsUHJvdmlkZXIiPgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJnZW5lcmFsIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0ibmFtZXNwYWNlIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0ib3RoZXIiPgotICAgICAgICAgPC9wcm9wZXJ0eUNhdGVnb3J5PgotICAgICAgICAgPHByb3BlcnR5Q2F0ZWdvcnkKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJhdHRyaWJ1dGVzIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZW51bWVyYXRpb25zIj4KLSAgICAgICAgIDwvcHJvcGVydHlDYXRlZ29yeT4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZG9jdW1lbnRhdGlvbiI+Ci0gICAgICAgICA8L3Byb3BlcnR5Q2F0ZWdvcnk+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImZhY2V0cyI+Ci0gICAgICAgICA8L3Byb3BlcnR5Q2F0ZWdvcnk+Ci0gICAgICA8L3Byb3BlcnR5Q29udHJpYnV0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMucHJvcGVydHlUYWJzIj4KLSAgICAgIDxwcm9wZXJ0eVRhYnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExUZXh0RWRpdG9yIj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfR0VORVJBTCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJnZW5lcmFsIgotICAgICAgICAgICAgICAgaWQ9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9OQU1FU1BBQ0UiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0ibmFtZXNwYWNlIgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9ImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLm5hbWVzcGFjZSI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9PVEhFUiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLm90aGVyIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0FUVFJJQlVURVMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmF0dHJpYnV0ZXMiPgotICAgICAgICAgPC9wcm9wZXJ0eVRhYj4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfRU5VTUVSQVRJT05TIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVudW1lcmF0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmVudW1lcmF0aW9ucyI+Ci0gICAgICAgICA8L3Byb3BlcnR5VGFiPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0iY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5kb2N1bWVudGF0aW9uIj4KLSAgICAgICAgIDwvcHJvcGVydHlUYWI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1NFQ1RJT05fQURWQU5DRURfQVRUUklCVVRFUyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJmYWNldHMiCi0gICAgICAgICAgICAgICBpZD0iY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5mYWNldHMiPgotICAgICAgICAgPC9wcm9wZXJ0eVRhYj4KLSAgICAgIDwvcHJvcGVydHlUYWJzPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWxFZGl0b3JFeHRlbnNpb25zIj4KLSAgICAgPGludGVybmFsRWRpdG9yRXh0ZW5zaW9uIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuWFNERXh0ZW5zaW9uIi8+Ci0gIDwvZXh0ZW5zaW9uPiAgCi0KLSAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzIj4KLSAgICAgIDxleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuZXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJzLnhzZCIKLSAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgICAgICAgICAgICAKLSAgICAgICAgbGFiZWxQcm92aWRlckNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuWFNETGFiZWxQcm92aWRlciI+Ci0gICAgICA8L2V4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0gICAgCi0gICAgPCEtLSBpbnRpYWxpemUgd3NkbCBzb3VyY2UgdmFsaWRhdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+IAotICAgICAgPHZhbGlkYXRvcgotICAgICAgICAgICAgc2NvcGU9InRvdGFsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnJlY29uY2lsZXIuRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvcldTREwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVjb25jaWxlci5EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETCI+Ci0gIAkgICAgIDxjb250ZW50VHlwZUlkZW50aWZpZXIgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLndzZGxzb3VyY2UiPgotICAgICAgICAgICAgPHBhcnRpdGlvblR5cGUKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIj4KLSAgICAgICAgICAgIDwvcGFydGl0aW9uVHlwZT4KLSAgICAgICAgIDwvY29udGVudFR5cGVJZGVudGlmaWVyPiAgICAgICAKLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8IS0tIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gYXVnbWVudCB0aGUgTW9kZWxRdWVyeSB0byBwcm92aWRlIFdTREwgc3BlY2lmaWMgZ3VpZGVkIGVkaXRpbmcgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsUXVlcnlFeHRlbnNpb25zIj4KLQkJPG1vZGVsUXVlcnlFeHRlbnNpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50ZXh0LldTRExNb2RlbFF1ZXJ5RXh0ZW5zaW9uIgotCQkJY29udGVudFR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLndzZGxzb3VyY2UiPgotCQk8L21vZGVsUXVlcnlFeHRlbnNpb24+Ci0JPC9leHRlbnNpb24+ICAgCi08L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNzI4YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmF2aWdhdGlvbkxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLldTRExNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETEdyYXBoVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5XU0RMRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lLkV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZS5Nb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZS5Nb2RlbEFkYXB0ZXJMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnRleHQuV1NETE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMuV1NETERldGFpbHNWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy5XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8vIHB1YmxpYyBjbGFzcyBXU0RMRWRpdG9yIGV4dGVuZHMgU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0IGltcGxlbWVudHMKLS8vIElOYXZpZ2F0aW9uTG9jYXRpb25Qcm92aWRlcgotcHVibGljIGNsYXNzIFdTRExFZGl0b3IgZXh0ZW5kcyBXU0RMTXVsdGlQYWdlRWRpdG9yUGFydCBpbXBsZW1lbnRzIElOYXZpZ2F0aW9uTG9jYXRpb25Qcm92aWRlcgotewotICBwcm90ZWN0ZWQgRXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlciBleHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyOwotICBwcm90ZWN0ZWQgV1NETFRleHRFZGl0b3IgdGV4dEVkaXRvcjsKLSAgcHJvdGVjdGVkIFdTRExHcmFwaFZpZXdlciBncmFwaFZpZXdlcjsKLSAgcHJvdGVjdGVkIFdTRExEZXRhaWxzVmlld2VyIGRldGFpbHNWaWV3ZXI7Ci0gIHByb3RlY3RlZCBXU0RMU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyOwotICBwcm90ZWN0ZWQgU2FzaEZvcm0gc2FzaEZvcm07Ci0gIGludCBncmFwaFBhZ2VJbmRleDsKLSAgcHJvdGVjdGVkIFdTRExNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyOwotICBwcm90ZWN0ZWQgV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlciByZXNvdXJjZUNoYW5nZUhhbmRsZXI7Ci0gIC8vIFVzZWQgZm9yIEN1dCwgQ29weSwgUGFzdGUgYWN0aW9ucy4gVGhpcyBhY3RzIGFzIGEgY29weSwgY3V0LCBwYXN0ZQotICAvLyBjbGlwYm9hcmQKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IGNsaXBib2FyZEVsZW1lbnQ7Ci0KLSAgcHVibGljIFdTRExFZGl0b3IoKQotICB7Ci0gICAgc2VsZWN0aW9uTWFuYWdlciA9IG5ldyBXU0RMU2VsZWN0aW9uTWFuYWdlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICBpZiAocGFnZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBwYWdlLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwYXJ0SW5pdEV4Y2VwdGlvbikKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGtleSA9PSBJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpCi0gICAgewotICAgICAgcmVzdWx0ID0gc2VsZWN0aW9uTWFuYWdlcjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICB7Ci0gICAgLy8gY2FsbCB0aGUgZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcidzIGlucHV0Q2hhbmdlZCBtZXRob2QgYSBudWxsIHZpZXdlcgotICAgIC8vIHNvIHRoYXQgdGhlIG91dGxpbmUncyBjb250ZW50cHJvdmlkZXIvYWRhcHRlcnMgZG9uJ3QgYXR0ZW1wdCB0byB1cGRhdGUKLSAgICAvLyB0aGUgdmlld2VyCi0gICAgLy8gYWZ0ZXIgdGhlIGVkaXRvciBjbG9zZXMKLSAgICBleHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyLmlucHV0Q2hhbmdlZChudWxsLCBudWxsLCBudWxsKTsKLSAgICBpZiAocmVzb3VyY2VDaGFuZ2VIYW5kbGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmRpc3Bvc2UoKTsKLSAgICB9Ci0gICAgc3VwZXIuZGlzcG9zZSgpOwotICB9Ci0KLSAgcHVibGljIFdTRExTZWxlY3Rpb25NYW5hZ2VyIGdldFNlbGVjdGlvbk1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIHNlbGVjdGlvbk1hbmFnZXI7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlciBnZXRFeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyKCkKLSAgewotICAgIGlmIChleHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyID09IG51bGwpCi0gICAgewotICAgICAgZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlciA9IG5ldyBFeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gZXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcjsKLSAgfQotCi0gIHB1YmxpYyBXU0RMVGV4dEVkaXRvciBnZXRXU0RMVGV4dEVkaXRvcigpCi0gIHsKLSAgICByZXR1cm4gdGV4dEVkaXRvcjsKLSAgfQotCi0gIHB1YmxpYyBXU0RMR3JhcGhWaWV3ZXIgZ2V0R3JhcGhWaWV3ZXIoKQotICB7Ci0gICAgcmV0dXJuIGdyYXBoVmlld2VyOwotICB9Ci0KLSAgcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0U3RydWN0dXJlZE1vZGVsKCkKLSAgewotICAgIHJldHVybiB0ZXh0RWRpdG9yLmdldE1vZGVsKCk7Ci0gIH0KLQotICBwdWJsaWMgRG9jdW1lbnQgZ2V0WE1MRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuICgoSURPTU1vZGVsKSB0ZXh0RWRpdG9yLmdldE1vZGVsKCkpLmdldERvY3VtZW50KCk7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBtb2RlbEFkYXB0ZXIgIT0gbnVsbCA/IG1vZGVsQWRhcHRlci5nZXREZWZpbml0aW9uKCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHBhZ2VzIG9mIHRoaXMgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqIDxwPgotICAgKiBTdWJjbGFzc2VzIG9mIDxjb2RlPk11bHRpUGFnZUVkaXRvcjwvY29kZT4gbXVzdCBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gICAqIDwvcD4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhZ2VzKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChyZXNvdXJjZUNoYW5nZUhhbmRsZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2VDaGFuZ2VIYW5kbGVyID0gbmV3IFdTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIHJlc291cmNlQ2hhbmdlSGFuZGxlci5hdHRhY2goKTsKLSAgICAgIH0KLSAgICAgIGNyZWF0ZVNvdXJjZVBhZ2UoKTsKLSAgICAgIGFkZFNvdXJjZVBhZ2UoKTsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgd3NkbCBtb2RlbAotICAgICAgLy8KLSAgICAgIGxvb2t1cE9yQ3JlYXRlV1NETE1vZGVsKCk7Ci0gICAgICBjcmVhdGVBbmRBZGRHcmFwaFBhZ2UoKTsKLSAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBwYWdlIGFuZCBzZXQgdGhlIGFjdGl2ZSBwYWdlIHRvIHNob3cKLSAgICAgIGludCBwYWdlSW5kZXhUb1Nob3cgPSBnZXREZWZhdWx0UGFnZUluZGV4KCk7Ci0gICAgICBzZXRBY3RpdmVQYWdlKHBhZ2VJbmRleFRvU2hvdyk7Ci0gICAgICBnZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldERlZmluaXRpb24oKSkpOwotICAgIH0KLSAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIkFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuMV9FUlJPUl8iKSk7IC8vJE5PTi1OTFMtMSQgPSAiQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBpbnB1dCBmb3IgdGhlIHRoZSBlZGl0b3IncyBzb3VyY2UgcGFnZS4iCi0gICAgfQotICAgIC8vIFRPRE86IGFkZCBhIGNhdGNoIGJsb2NrIGhlcmUgZm9yIGFueSBleGNlcHRpb24gdGhlIGRlc2lnbiBwYWdlIHRocm93cyBhbmQKLSAgICAvLyBjb252ZXJ0IGl0IGludG8gYSBtb3JlIGluZm9ybWF0aXZlIG1lc3NhZ2UuCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBsb29rdXBPckNyZWF0ZVdTRExNb2RlbCgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBnZXRNb2RlbCgpKS5nZXREb2N1bWVudCgpOwotICAgICAgaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikKLSAgICAgIHsKLSAgICAgICAgSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLSAgICAgICAgbW9kZWxBZGFwdGVyID0gKFdTRExNb2RlbEFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoV1NETE1vZGVsQWRhcHRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChtb2RlbEFkYXB0ZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG1vZGVsQWRhcHRlciA9IG5ldyBXU0RMTW9kZWxBZGFwdGVyKCk7Ci0gICAgICAgICAgbm90aWZpZXIuYWRkQWRhcHRlcihtb2RlbEFkYXB0ZXIpOwotICAgICAgICAgIG1vZGVsQWRhcHRlci5jcmVhdGVEZWZpbml0aW9uKGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFBhZ2VJbmRleCgpCi0gIHsKLSAgICBpZiAoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRQYWdlKCkuZXF1YWxzKFdTRExFZGl0b3JQbHVnaW4uR1JBUEhfUEFHRSkpCi0gICAgewotICAgICAgaWYgKGdyYXBoUGFnZUluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICByZXR1cm4gZ3JhcGhQYWdlSW5kZXg7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzb3VyY2VQYWdlSW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5XU0RMTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVUZXh0RWRpdG9yKCkKLSAgICovCi0gIHByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBjcmVhdGVUZXh0RWRpdG9yKCkKLSAgewotICAgIHRleHRFZGl0b3IgPSBuZXcgV1NETFRleHRFZGl0b3IodGhpcyk7Ci0gICAgcmV0dXJuIHRleHRFZGl0b3I7Ci0gIH0KLQotICAvKioKLSAgICogY3JlYXRlIG91ciBvd24KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLmNyZWF0ZVNvdXJjZVBhZ2UoKTsKLSAgICB0ZXh0RWRpdG9yID0gKFdTRExUZXh0RWRpdG9yKSBnZXRUZXh0RWRpdG9yKCk7Ci0gIH0KLSAgaW50IHNvdXJjZVBhZ2VJbmRleCA9IC0xOwotCi0gIC8qKgotICAgKiBBZGRzIHRoZSBzb3VyY2UgcGFnZSBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VQYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0gIHsKLSAgICBzb3VyY2VQYWdlSW5kZXggPSBhZGRQYWdlKHRleHRFZGl0b3IsIGdldEVkaXRvcklucHV0KCkpOwotICAgIHNldFBhZ2VUZXh0KHNvdXJjZVBhZ2VJbmRleCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKTsKLSAgICAvLyBkZWZlY3QgMjIzMDQzIC4uLiBkbyB0ZXh0RWRpdG9yLnNldE1vZGVsKCkgaGVyZSBpbnN0ZWFkIG9mIGluCi0gICAgLy8gY3JlYXRlU291cmNlUGFnZSgpCi0gICAgdGV4dEVkaXRvci5zZXRNb2RlbCgoSUZpbGVFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSk7Ci0gICAgLy8gdGhlIHVwZGF0ZXMgY3JpdGljYWwsIHRvIGdldCB2aWV3ZXIgc2VsZWN0aW9uIG1hbmFnZXIgYW5kIGhpZ2hsaWdodGluZyB0bwotICAgIC8vIHdvcmsKLSAgICB0ZXh0RWRpdG9yLnVwZGF0ZSgpOwotICB9Ci0gIGludFtdIHdlaWdodHM7Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzaWduV2VpZ2h0cyhpbnRbXSB3ZWlnaHRzLCBib29sZWFuIHVwZGF0ZVNvdXJjZURlc2lnbikKLSAgewotICAgIHRoaXMud2VpZ2h0cyA9IHdlaWdodHM7Ci0gICAgaWYgKHVwZGF0ZVNvdXJjZURlc2lnbikKLSAgICB7Ci0gICAgICBzYXNoRm9ybS5zZXRXZWlnaHRzKHdlaWdodHMpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IGFyZykKLSAgewotICAgIHN1cGVyLnBhZ2VDaGFuZ2UoYXJnKTsKLSAgICBpZiAoZ2V0UGFnZVRleHQoYXJnKS5lcXVhbHMoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX1NPVVJDRSIpKSkgLy8gVFJBTlNMQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAhCi0gICAgewotICAgICAgLy8gdXBkYXRlIHRoZSBpbnB1dAotICAgIH0KLSAgICBlbHNlIGlmIChnZXRQYWdlVGV4dChhcmcpLmVxdWFscyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9UQUJfR1JBUEgiKSkpIC8vIFRSQU5TTEFURQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICEKLSAgICB7Ci0gICAgICAvLyB1cGRhdGUgdGhlIGlucHV0Ci0gICAgfQotICB9Ci0gIHN0YXRpYyBwcml2YXRlIENvbG9yIGRpdmlkZXJDb2xvcjsKLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgZ3JhcGggcGFnZSBhbmQgYWRkcyBpdCB0byB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBbmRBZGRHcmFwaFBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24KLSAgewotICAgIC8vIGNyZWF0ZSB0aGUgZ3JhcGggcGFnZQotICAgIHNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKGdldENvbnRhaW5lcigpLCBTV1QuQk9SREVSKTsKLSAgICBzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICBzYXNoRm9ybS5zZXRPcmllbnRhdGlvbihTV1QuVkVSVElDQUwpOwotICAgIGludFtdIHdlaWdodHMgPSB7OCwgM307Ci0gICAgZ3JhcGhQYWdlSW5kZXggPSBhZGRQYWdlKHNhc2hGb3JtKTsKLSAgICBzZXRQYWdlVGV4dChncmFwaFBhZ2VJbmRleCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVEFCX0dSQVBIIikpOwotICAgIC8vIGNyZWF0ZSB0aGUgZ3JhcGggdmlld2VyCi0gICAgZ3JhcGhWaWV3ZXIgPSBuZXcgV1NETEdyYXBoVmlld2VyKHRoaXMpOwotICAgIGdyYXBoVmlld2VyLmNyZWF0ZUNvbnRyb2woc2FzaEZvcm0pOwotICAgIC8vIGRldGFpbHNWaWV3ZXIgPSBuZXcgV1NETERldGFpbHNWaWV3ZXIodGhpcyk7Ci0gICAgLy8gZGV0YWlsc1ZpZXdlci5jcmVhdGVDb250cm9sKHNhc2hGb3JtKTsKLSAgICAvLwotICAgIC8vIHNhc2hGb3JtLnNldFdlaWdodHMod2VpZ2h0cyk7Ci0gICAgaWYgKGRpdmlkZXJDb2xvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGRpdmlkZXJDb2xvciA9IG5ldyBDb2xvcihnZXRDb250YWluZXIoKS5nZXREaXNwbGF5KCksIDE0MywgMTQxLCAxMzgpOwotICAgIH0KLSAgICBnZXRDb250YWluZXIoKS5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkKLSAgICB7Ci0gICAgICAvKioKLSAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyI3BhaW50Q29udHJvbChQYWludEV2ZW50KQotICAgICAgICovCi0gICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKQotICAgICAgewotICAgICAgICBPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLSAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLSAgICAgICAgewotICAgICAgICAgIENvbXBvc2l0ZSBjb21wID0gKENvbXBvc2l0ZSkgc291cmNlOwotICAgICAgICAgIFJlY3RhbmdsZSBib3VuZGFyeSA9IGNvbXAuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgIGUuZ2Muc2V0Rm9yZWdyb3VuZChkaXZpZGVyQ29sb3IpOwotICAgICAgICAgIGUuZ2MuZHJhd0xpbmUoYm91bmRhcnkueCwgYm91bmRhcnkueSwgYm91bmRhcnkueCArIGJvdW5kYXJ5LndpZHRoLCBib3VuZGFyeS55KTsKLSAgICAgICAgICBzZXREZXNpZ25XZWlnaHRzKHNhc2hGb3JtLmdldFdlaWdodHMoKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkKLSAgewotICAgIHN1cGVyLnNldEZvY3VzKCk7Ci0gICAgaW50IGFjdGl2ZVBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0gICAgaWYgKGFjdGl2ZVBhZ2UgPT0gc291cmNlUGFnZUluZGV4KQotICAgIHsKLSAgICAgIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zZXREZWZhdWx0UGFnZShXU0RMRWRpdG9yUGx1Z2luLlNPVVJDRV9QQUdFKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zZXREZWZhdWx0UGFnZShXU0RMRWRpdG9yUGx1Z2luLkdSQVBIX1BBR0UpOwotICAgIH0KLSAgfQotICAvLwotICAvLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWx0SW5XU0RMRWRpdG9yRXh0ZW5zaW9uIGltcGxlbWVudHMgV1NETEVkaXRvckV4dGVuc2lvbgotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25UeXBlU3VwcG9ydGVkKGludCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IE9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSIHx8IHR5cGUgPT0gT1VUTElORV9MQUJFTF9QUk9WSURFUiB8fCB0eXBlID09IEVESVRfUEFSVF9GQUNUT1JZIHx8IHR5cGUgPT0gREVUQUlMU19WSUVXRVJfUFJPVklERVIgfHwgdHlwZSA9PSBNRU5VX0FDVElPTl9DT05UUklCVVRPUgotICAgICAgICAgIHx8IHR5cGUgPT0gTk9ERV9SRUNPTkNJTEVSIHx8IHR5cGUgPT0gTk9ERV9BU1NPQ0lBVElPTl9QUk9WSURFUjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICByZXR1cm4gKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50ICYmICEob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpKSB8fCAob2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbk9iamVjdChpbnQgdHlwZSwgV1NETEVkaXRvciB3c2RsRWRpdG9yKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgc3dpdGNoICh0eXBlKQotICAgICAgewotICAgICAgICBjYXNlIE9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSIDogewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIoV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBPVVRMSU5FX0xBQkVMX1BST1ZJREVSIDogewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBNb2RlbEFkYXB0ZXJMYWJlbFByb3ZpZGVyKFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgREVUQUlMU19WSUVXRVJfUFJPVklERVIgOiB7Ci0gICAgICAgICAgcmVzdWx0ID0gbmV3IFdTRExEZXRhaWxzVmlld2VyUHJvdmlkZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SIDogewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBXU0RMTWVudUFjdGlvbkNvbnRyaWJ1dG9yKHdzZGxFZGl0b3IpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTk9ERV9BU1NPQ0lBVElPTl9QUk9WSURFUiA6IHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgV1NETE5vZGVBc3NvY2lhdGlvblByb3ZpZGVyKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFRElUX1BBUlRfRkFDVE9SWSA6IHsKLSAgICAgICAgICByZXN1bHQgPSBuZXcgV1NETEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbG9hZERlcGVuZGVuY2llcygpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRHcmFwaFZpZXdlcigpLmdldENvbXBvbmVudFZpZXdlcigpLnNldFByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZCh0cnVlKTsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb24oKTsKLSAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFdTRExSZXNvdXJjZVV0aWwucmVsb2FkRGlyZWN0aXZlcyhkZWZpbml0aW9uKTsKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC51cGRhdGVCaW5kaW5nUmVmZXJlbmNlcyhkZWZpbml0aW9uKTsKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC51cGRhdGVQb3J0VHlwZVJlZmVyZW5jZXMoZGVmaW5pdGlvbik7Ci0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwudXBkYXRlTWVzc2FnZVJlZmVyZW5jZXMoZGVmaW5pdGlvbik7Ci0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwudXBkYXRlU2NoZW1hUmVmZXJlbmNlcyhkZWZpbml0aW9uKTsKLSAgICAgICAgLy8gdGhlIGxpbmUgYmVsb3cgc2ltcGx5IGNhdXNlcyBhIG5vdGlmaWNhdGlvbiBpbiBvcmRlciB0byB1cGRhdGUgb3VyCi0gICAgICAgIC8vIHZpZXdzCi0gICAgICAgIC8vCi0gICAgICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZGVmaW5pdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIGdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCkuc2V0UHJlc2VydmVFeHBhbnNpb25FbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvcGVuT25TZWxlY3Rpb24oU3RyaW5nIHNwZWNpZmljYXRpb24pCi0gIHsKLSAgICBFT2JqZWN0IGVPYmplY3QgPSBnZXREZWZpbml0aW9uKCkuZVJlc291cmNlKCkuZ2V0RU9iamVjdChzcGVjaWZpY2F0aW9uKTsKLSAgICBpZiAoZU9iamVjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZU9iamVjdCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBJTmF2aWdhdGlvbkxvY2F0aW9uIGNyZWF0ZUVtcHR5TmF2aWdhdGlvbkxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBuZXcgSW50ZXJuYWxUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uKHRleHRFZGl0b3IsIGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBJTmF2aWdhdGlvbkxvY2F0aW9uIGNyZWF0ZU5hdmlnYXRpb25Mb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbmV3IEludGVybmFsVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbih0ZXh0RWRpdG9yLCB0cnVlKTsKLSAgfQotICBzdGF0aWMgY2xhc3MgSW50ZXJuYWxUZXh0U2VsZWN0aW9uTmF2aWdhdGlvbkxvY2F0aW9uIGV4dGVuZHMgVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbgotICB7Ci0gICAgcHVibGljIEludGVybmFsVGV4dFNlbGVjdGlvbk5hdmlnYXRpb25Mb2NhdGlvbihJVGV4dEVkaXRvciBwYXJ0LCBib29sZWFuIGluaXRpYWxpemUpCi0gICAgewotICAgICAgc3VwZXIocGFydCwgaW5pdGlhbGl6ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKQotICAgIHsKLSAgICAgIElFZGl0b3JQYXJ0IHBhcnQgPSBzdXBlci5nZXRFZGl0b3JQYXJ0KCk7Ci0gICAgICBpZiAocGFydCBpbnN0YW5jZW9mIFdTRExFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHBhcnQgPSAoKFdTRExFZGl0b3IpIHBhcnQpLmdldFRleHRFZGl0b3IoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwYXJ0OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCi0gICAgewotICAgICAgSUVkaXRvclBhcnQgcGFydCA9IGdldEVkaXRvclBhcnQoKTsKLSAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgV1NETFRleHRFZGl0b3IpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoKFdTRExUZXh0RWRpdG9yKSBwYXJ0KS5nZXRXU0RMRWRpdG9yKCkuZ2V0VGl0bGUoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRleHQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBlbGVtZW50IGN1cnJlbnRseSBvbiB0aGUgY29weSwgY3V0LCBwYXN0ZSBjbGlwYm9hcmQKLSAgcHVibGljIFdTRExFbGVtZW50IGdldENsaXBib2FyZENvbnRlbnRzKCkKLSAgewotICAgIHJldHVybiBjbGlwYm9hcmRFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xpcGJvYXJkQ29udGVudHMoV1NETEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGNsaXBib2FyZEVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMjVhMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIFdTRExFZGl0b3JQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIC8vLCBJUGx1Z2luSGVscGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFHRSA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kZWZhdWx0cGFnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGhwYWdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1BBR0UgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc291cmNlcGFnZSI7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWFNEX0VESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueHNkLnVpLlhTREVkaXRvciI7IAotICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cuZXhhbXBsZS5vcmciOwotICAKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUFJPTVBUID0gMDsKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfSUdOT1JFID0gMTsKLSAgcHVibGljIHN0YXRpYyBpbnQgREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEID0gMjsKLQotICBwcm90ZWN0ZWQgc3RhdGljIFdTRExFZGl0b3JQbHVnaW4gaW5zdGFuY2U7Ci0gIC8vICBwcm90ZWN0ZWQgWE1MU2NoZW1hUGFja2FnZSB4bWxzY2hlbWFQYWNrYWdlOwotLy8gIHByaXZhdGUgc3RhdGljIE1zZ0xvZ2dlciBteU1zZ0xvZ2dlcjsKLQotICBwcml2YXRlIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSB3c2RsRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIHByaXZhdGUgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeTsKLSAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5IHRyZWVQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnk7Ci0gIHByaXZhdGUgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICBwcml2YXRlIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBkZXRhaWxzVmlld2VyUHJvdmlkZXJSZWdpc3RyeTsgIAotICAvL3ByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBncmF5ZWRJbWFnZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJpdmF0ZSBpbnQgZGVwZW5kZW5jaWVzQ2hhbmdlZFBvbGljeSA9IERFUEVOREVDSUVTX0NIQU5HRURfUE9MSUNZX1JFTE9BRDsKLQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNvdXJjZXMgaGVscGVyLgotICAgKi8KLQotICBwdWJsaWMgV1NETEVkaXRvclBsdWdpbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICB7Ci0gICAgc3VwZXIoZGVzY3JpcHRvcik7Ci0gICAgaW5zdGFuY2UgPSB0aGlzOwotCi0gICAgLy8gVE9ETy4uLiByZW1vdmUgdGhpcyBjb2RlIHdoZW4gd2UgYWRkICdkZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5JwotICAgIC8vIHRvIGFuIGVkaXRvciBwcmVmZXJlbmNlcyBwYWdlCi0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IGdldFdTRExTdHJpbmcoIl9ERUJVR19VUERBVEVfUE9MSUNZIik7Ci0gICAgICBpbnQgcG9saWN5ID0gSW50ZWdlci5wYXJzZUludChzdHJpbmcpOwotICAgICAgaWYgKHBvbGljeSA+PSAwICYmIHBvbGljeSA8PSBERVBFTkRFQ0lFU19DSEFOR0VEX1BPTElDWV9SRUxPQUQpCi0gICAgICB7Ci0gICAgICAgIGRlcGVuZGVuY2llc0NoYW5nZWRQb2xpY3kgPSBwb2xpY3k7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSBnZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKHdzZGxFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHdzZGxFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSA9IG5ldyBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgIG5ldyBJbnRlcm5hbEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKHdzZGxFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSkucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGdldERldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5KCkKLSAgewotICAgIGlmIChkZXRhaWxzVmlld2VyUHJvdmlkZXJSZWdpc3RyeSA9PSBudWxsKQotICAgIHsKLQkgIGRldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5ID0gbmV3IE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IERldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKGRldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRldGFpbHNWaWV3ZXJQcm92aWRlclJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyUmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeSA9IG5ldyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgIG5ldyBFbGVtZW50Q29udGVudEZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKGV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXJSZWdpc3RyeSkucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiBleHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeSBnZXRFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5KCkKLSAgewotICAgIGlmICh0cmVlUHJvdmlkZXJSZWdpc3RyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRyZWVQcm92aWRlclJlZ2lzdHJ5ID0gbmV3IEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkoKTsKLSAgICAgIG5ldyBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKHRyZWVQcm92aWRlclJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyZWVQcm92aWRlclJlZ2lzdHJ5OwotICB9Ci0KLSAgcHVibGljIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5KCkKLSAgewotICAgIGlmIChwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeSA9IG5ldyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICAgIG5ldyBQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKHByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlclJlZ2lzdHJ5KCkKLSAgewotICAgIGlmIChwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnkgPSBuZXcgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgICBuZXcgUHJvcGVydHlTb3VyY2VQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKHByb3BlcnR5U291cmNlUHJvdmlkZXJSZWdpc3RyeSkucmVhZFJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IGdldFByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5KCkKLSAgewotICAgIGlmIChwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5ID0gbmV3IE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgICAgbmV3IFByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5KHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgSW5zdGFsbCBVUkwKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJMIGdldEluc3RhbGxVUkwoKQotICB7Ci0gICAgcmV0dXJuIGdldEluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gZ2V0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKCkuZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBhcmcwKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFdTRExTdHJpbmcoa2V5KSwgbmV3IE9iamVjdCBbXSB7IGFyZzAgfSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgcmVzb3VyY2Ugc3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU3RyaW5nKFN0cmluZyBrZXksIFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRXU0RMU3RyaW5nKGtleSksIG5ldyBPYmplY3QgW10geyBhcmcwLCBhcmcxIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgcGx1Z2luIHBoeXNpY2FsIGRpcmVjdG9yeSBsb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRQbHVnaW5Mb2NhdGlvbigpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUGF0aCBpbnN0YWxsUGF0aCA9IG5ldyBQYXRoKGdldEluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgU3RyaW5nIGluc3RhbGxTdHIgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoaW5zdGFsbFBhdGgudG9TdHJpbmcoKSkpLmdldEZpbGUoKTsKLSAgICAgIHJldHVybiBuZXcgUGF0aChpbnN0YWxsU3RyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIldTRExFZGl0b3JQbHVnaW4uZ2V0UGx1Z2luTG9jYXRpb24oKSBleGNlcHRpb24uLiIgKyBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGltYWdlRGVzY3JpcHRvckNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgaW50ZXJuYWxHZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkKLSAgewotICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXQoa2V5KTsKLSAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpCi0gICAgewotICAgICAgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsIGtleSk7Ci0gICAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGltYWdlRGVzY3JpcHRvckNhY2hlLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmludGVybmFsR2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKQotICB7Ci0gICAgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0SW1hZ2VSZWdpc3RyeSgpOwotICAgIAotICAgIGlmIChpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShnZXRDbGFzcygpLCBpY29uTmFtZSkpOwotICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXksIGJvb2xlYW4gaXNHcmF5ZWQpCi0gICAgeyAKLSAgICAgIEltYWdlIGltYWdlID0gbnVsbDsKLSAgICAgIGlmICghaXNHcmF5ZWQpCi0gICAgICB7Ci0gICAgICAgIGltYWdlID0gc3VwZXIuZ2V0SW1hZ2Uoa2V5KTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbWFnZSA9IChJbWFnZSlncmF5ZWRJbWFnZU1hcC5nZXQoa2V5KTsKLSAgICAgICAgaWYgKGltYWdlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbWFnZSBjb2xvckltYWdlID0gc3VwZXIuZ2V0SW1hZ2Uoa2V5KTsKLSAgICAgICAgICBpZiAoY29sb3JJbWFnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBjb2xvckltYWdlLCBTV1QuSU1BR0VfR1JBWSk7Ly9TV1QuSU1BR0VfRElTQUJMRSk7Ci0gICAgICAgICAgICBncmF5ZWRJbWFnZU1hcC5wdXQoa2V5LCBpbWFnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfQotICAqLwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSBmb3IgdGhpcyBwbHVnaW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1ldGFEYXRhRGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExFZGl0b3JQbHVnaW4gZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkKLSAgewotICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKCkKLSAgewotICAgIHJldHVybiBnZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkKLSAgewotICAgIHN1cGVyLmluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoc3RvcmUpOwotICAgIHN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9QQUdFLCBHUkFQSF9QQUdFKTsKLSAgICAKLSAgICAvLyBXU0RMUHJlZmVyZW5jZVBhZ2UgcHJlZnMKLSAgICBzdG9yZS5zZXREZWZhdWx0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSwgREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFKTsKLSAgICBzdG9yZS5zZXREZWZhdWx0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9BVVRPX1JFR0VORVJBVEVfQklORElORyIpLCB0cnVlKTsKLSAgICAvLyBEbyB3ZSBuZWVkIHRoaXMgcHJlZmVyZW5jZSBiZWxvdz8gIExvb2sgYXQgV1NETFByZWZlcmVuY2VQYWdlLmphdmEKLS8vICAgIHN0b3JlLnNldERlZmF1bHQoIkRlZnVhbHQgTG9jYXRpb246IiwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIHNldERlZmF1bHRQYWdlCi0gICAqIFNldCB0aGUgZGVmYXVsdCBwYWdlIHRvIG9wZW4gd2hlbiB0aGUgZWRpdG9yIHN0YXJ0cy4gTWFpbnRhaW5zIHRoZSBzdGF0ZQotICAgKiB3aGVuIFdTQUQgaXMgc2h1dGRvd24gYW5kIHJlc3RhcnRlZC4KLSAgICogQHBhcmFtIHBhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRQYWdlKFN0cmluZyBwYWdlKQotICB7Ci0gICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoREVGQVVMVF9QQUdFLCBwYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhERUZBVUxUX1BBR0UpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXREZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5KCkKLSAgewotICAgIC8vcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChERVBFTkRFQ0lFU19DSEFOR0VEX1BPTElDWSk7Ci0gICAgcmV0dXJuIGRlcGVuZGVuY2llc0NoYW5nZWRQb2xpY3k7Ci0gIH0KLX0KLQotY2xhc3MgQmFzZVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSI7Ci0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KFN0cmluZyBleHRlbnNpb25Qb2ludElkKQotICB7Ci0gICAgSVBsdWdpblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50SWQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgfQotfQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIHBsdWdpbiBtYW5pZmVzdHMgYW5kIHJlZ2lzdGVycyBlYWNoIGludGVybmFsIGVkaXRvciBleHRlbnNpb24KLSAqLwotY2xhc3MgSW50ZXJuYWxFZGl0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlciBleHRlbmRzIEJhc2VSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiaW50ZXJuYWxFZGl0b3JFeHRlbnNpb25zIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiaW50ZXJuYWxFZGl0b3JFeHRlbnNpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOwotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCi0gIHB1YmxpYyBJbnRlcm5hbEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkKLSAgewotICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBzdXBlci5yZWFkUmVnaXN0cnkoRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkRWxlbWVudCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotICAgIHsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkNsc0xvYWRlciA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbigpLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICByZWdpc3RyeS5hZGQocGx1Z2luQ2xzTG9hZGVyLCBjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogCi0gKi8KLWFic3RyYWN0IGNsYXNzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlciBleHRlbmRzIEJhc2VSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRV9TUEFDRSA9ICJuYW1lc3BhY2UiOwotICBwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvblBvaW50SWQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGFnTmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGF0dHJpYnV0ZU5hbWVzOwotICBwcm90ZWN0ZWQgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeTsKLQotICBwcml2YXRlIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCwgU3RyaW5nIHRhZ05hbWUsIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzLmV4dGVuc2lvblBvaW50SWQgPSBleHRlbnNpb25Qb2ludElkOwotICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7Ci0gICAgdGhpcy5uc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgPSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIH0KLQotICBwdWJsaWMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyKFN0cmluZyBleHRlbnNpb25Qb2ludElkLCBTdHJpbmcgdGFnTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICB0aGlzKGV4dGVuc2lvblBvaW50SWQsIHRhZ05hbWUsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgYXR0cmlidXRlTmFtZXMgPSBuZXcgU3RyaW5nWzFdOwotICAgIGF0dHJpYnV0ZU5hbWVzWzBdID0gYXR0cmlidXRlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQsIFN0cmluZyB0YWdOYW1lLCBTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lcywgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHRoaXMoZXh0ZW5zaW9uUG9pbnRJZCwgdGFnTmFtZSwgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICB0aGlzLmF0dHJpYnV0ZU5hbWVzID0gYXR0cmlidXRlTmFtZXM7Ci0gIH0KLSAgLyoqCi0gICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZFJlZ2lzdHJ5KCkKLSAgewotICAgIHN1cGVyLnJlYWRSZWdpc3RyeShleHRlbnNpb25Qb2ludElkKTsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkRWxlbWVudCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0gICAgewotICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FX1NQQUNFKTsKLSAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NzTG9hZGVyID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWVzLmxlbmd0aCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWVzWzBdKTsKLSAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5LnB1dChuYW1lc3BhY2UsIGNsYXNzTmFtZSwgcGx1Z2luQ2xhc3NzTG9hZGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlTmFtZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lc1tpXTsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtYXAucHV0KGF0dHJpYnV0ZU5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeS5wdXQobmFtZXNwYWNlLCBtYXAsIHBsdWdpbkNsYXNzc0xvYWRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBleHRlbnNpYmlsaXR5IGl0ZW0gdHJlZSBwcm92aWRlcgotICovCi1jbGFzcyBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5UmVhZGVyIGV4dGVuZHMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcnMiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJleHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlciI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVRUX05BTUVTID0geyAibGFiZWxQcm92aWRlckNsYXNzIiwgImNvbnRlbnRQcm92aWRlckNsYXNzIiB9OwotCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5UmVhZGVyKE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSBuc0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkpCi0gIHsKLSAgICBzdXBlcihFWFRFTlNJT05fUE9JTlRfSUQsIFRBR19OQU1FLCBBVFRfTkFNRVMsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gIH0KLX0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgRWxlbWVudENvbnRlbnRGaWx0ZXJFeHRlbnNpb25SZWdpc3RyeVJlYWRlciBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiZXh0ZW5zaWJpbGl0eUVsZW1lbnRGaWx0ZXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJleHRlbnNpYmlsaXR5RWxlbWVudEZpbHRlciI7Ci0KLSAgcHVibGljIEVsZW1lbnRDb250ZW50RmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHN1cGVyKEVYVEVOU0lPTl9QT0lOVF9JRCwgVEFHX05BTUUsICJjbGFzcyIsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gIH0KLX0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAicHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJwcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlciI7Ci0KLSAgcHVibGljIFByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIoTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHN1cGVyKEVYVEVOU0lPTl9QT0lOVF9JRCwgVEFHX05BTUUsICJjbGFzcyIsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotICB9Ci19Ci0KLWNsYXNzIFByb3BlcnR5U291cmNlUHJvdmlkZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAicHJvcGVydHlTb3VyY2VQcm92aWRlciI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gInByb3BlcnR5U291cmNlUHJvdmlkZXIiOwotCi0gIHB1YmxpYyBQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyUmVnaXN0cnlSZWFkZXIoTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5IG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSkKLSAgewotICAgIHN1cGVyKEVYVEVOU0lPTl9QT0lOVF9JRCwgVEFHX05BTUUsICJjbGFzcyIsIG5zS2V5ZWRFeHRlbnNpb25SZWdpc3RyeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlYWRFbGVtZW50KGVsZW1lbnQpOwotICB9Ci19Ci0KLWNsYXNzIFByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlclJlZ2lzdHJ5IGV4dGVuZHMgTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIiOwotCi0gIHB1YmxpYyBQcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJSZWdpc3RyeShOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgc3VwZXIoRVhURU5TSU9OX1BPSU5UX0lELCBUQUdfTkFNRSwgImNsYXNzIiwgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIucmVhZEVsZW1lbnQoZWxlbWVudCk7Ci0gIH0KLX0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgRGV0YWlsc1ZpZXdlclByb3ZpZGVyUmVnaXN0cnlSZWFkZXIgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImRldGFpbHNWaWV3ZXJQcm92aWRlcnMiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkFNRSA9ICJkZXRhaWxzVmlld2VyUHJvdmlkZXIiOwotCi0gIHB1YmxpYyBEZXRhaWxzVmlld2VyUHJvdmlkZXJSZWdpc3RyeVJlYWRlcihOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgc3VwZXIoRVhURU5TSU9OX1BPSU5UX0lELCBUQUdfTkFNRSwgImNsYXNzIiwgbnNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgc3VwZXIucmVhZEVsZW1lbnQoZWxlbWVudCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMRWRpdG9yUmVzb3VyY2VDaGFuZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzc5OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgV1NETEVkaXRvclJlc291cmNlQ2hhbmdlSGFuZGxlcgotewotICBwcm90ZWN0ZWQgV1NETEVkaXRvciB3c2RsRWRpdG9yOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwZGF0ZVJlcXVpcmVkOwotICBwcm90ZWN0ZWQgSW50ZXJuYWxSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBJbnRlcm5hbFBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXI7Ci0KLSAgcHVibGljIFdTRExFZGl0b3JSZXNvdXJjZUNoYW5nZUhhbmRsZXIoV1NETEVkaXRvciB3c2RsRWRpdG9yKQotICB7Ci0gICAgdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsKLSAgICByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IEludGVybmFsUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIHBhcnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbFBhcnRMaXN0ZW5lcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYXR0YWNoKCkKLSAgewotICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotICAgIHdzZGxFZGl0b3IuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotICAgIHdzZGxFZGl0b3IuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTWFwIGNvbXB1dGVEZXBlbmRlbmN5TWFwKCkKLSAgewotICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpOwotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZGVmaW5pdGlvbi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSlpLm5leHQoKTsKLSAgICAgIGlmIChyZXNvdXJjZSAhPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLSAgICAgICAgaWYgKG1hcC5nZXQodXJpKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbWFwLnB1dCh1cmksIHVyaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZWxvYWQoKQotICB7Ci0gIAlib29sZWFuIGRvUmVsb2FkID0gZmFsc2U7ICAJCi0JaW50IHBvbGljeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5KCk7Ci0JCi0gIAlpZiAocG9saWN5ID09IFdTRExFZGl0b3JQbHVnaW4uREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUFJPTVBUKQotICAJewotCQlkb1JlbG9hZCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHdzZGxFZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0RFUEVOREVOQ0lFU19DSEFOR0VEIiksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0RFUEVOREVOQ0lFU19DSEFOR0VEX1JFRlJFU0giKSk7ICAJCi0gIAl9Ci0gIAllbHNlIGlmIChwb2xpY3kgPT0gV1NETEVkaXRvclBsdWdpbi5ERVBFTkRFQ0lFU19DSEFOR0VEX1BPTElDWV9SRUxPQUQpCi0gIAl7Ci0gIAkJZG9SZWxvYWQgPSB0cnVlOwotICAJfQotICAJCi0gICAgaWYgKGRvUmVsb2FkKQotICAgIHsgICAgCi0gICAgICB3c2RsRWRpdG9yLnJlbG9hZERlcGVuZGVuY2llcygpOwotICAgIH0gIAotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmluZ1RvUmVzb3VyY2VDaGFuZ2VzKCkKLSAgewotICAJaW50IHBvbGljeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREZXBlbmRlbmNpZXNDaGFuZ2VkUG9saWN5KCk7Ci0gIAlyZXR1cm4gcG9saWN5ID09IFdTRExFZGl0b3JQbHVnaW4uREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUFJPTVBUIHx8Ci0gIAkJICAgcG9saWN5ID09IFdTRExFZGl0b3JQbHVnaW4uREVQRU5ERUNJRVNfQ0hBTkdFRF9QT0xJQ1lfUkVMT0FEOwotICB9Ci0KLQotICBjbGFzcyBJbnRlcm5hbFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzUGVuZGluZyA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBpbnQgY291bnQgPSAwOwotCi0gICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KQotICAgIHsgICAgICAJCi0gICAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICAgIAkgICAgIAkKLSAgICAgIGlmIChkaXNwbGF5ICE9IG51bGwgJiYgaXNMaXN0ZW5pbmdUb1Jlc291cmNlQ2hhbmdlcygpICYmICFpc1VwZGF0ZVJlcXVpcmVkKQotICAgICAgewotICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKQotICAgICAgICB7Ci0gICAgICAgICAgSVJlc291cmNlRGVsdGFbXSBkZWx0YXMgPSBldmVudC5nZXREZWx0YSgpLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVsdGFzW2ldLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNQZW5kaW5nKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzUGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBkaXNwbGF5LnRpbWVyRXhlYygyMDAwLCBuZXcgVGltZXJFdmVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotICAgICAgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFsaXN0LmNvbnRhaW5zKHJlc291cmNlKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHJlc291cmNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgY2xhc3MgVGltZXJFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0gICAgewotICAgICAgcHVibGljIFRpbWVyRXZlbnQoKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiTmV3VGltZXJFdmVudCgiICsgd3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkuZVJlc291cmNlKCkuZ2V0VVJJKCkgKyAiKSAiICsgY291bnQpOyAgICAgIAkKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKWkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBwbGF0Zm9ybVBhdGggPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBNYXAgZGVwZW5kZW5jeU1hcCA9IGNvbXB1dGVEZXBlbmRlbmN5TWFwKCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKWkubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBwbGF0Zm9ybVBhdGggPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgaWYgKGRlcGVuZGVuY3lNYXAuZ2V0KHBsYXRmb3JtUGF0aCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc1VwZGF0ZVJlcXVpcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmICh3c2RsRWRpdG9yLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKSA9PSB3c2RsRWRpdG9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc1VwZGF0ZVJlcXVpcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIHBlcmZvcm1SZWxvYWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpc1BlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBJbnRlcm5hbFBhcnRMaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgICBpZiAocGFydCA9PSB3c2RsRWRpdG9yKQotICAgICAgeyAgICAgCi0gICAgICAgIGlmIChpc1VwZGF0ZVJlcXVpcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgaXNVcGRhdGVSZXF1aXJlZCA9IGZhbHNlOwotICAgICAgICAgIHBlcmZvcm1SZWxvYWQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpCi0gICAgewotICAgIH0KLSAgfQotCi0KLX0KLQotLyoKLWNsYXNzIERlcGVuZGVuY3lWaXNpdG9yCi17Ci0JcHVibGljIHZvaWQgdmlzaXRJbXBvcnQoSW1wb3J0IHRoZUltcG9ydCkKLQl7Ci0JCWlmICh0aGVJbXBvcnQuZ2V0RURlZmluaXRpb24oKSAhPSBudWxsKQotCQl7Ci0JCQl2aXNpdERlZmluaXRpb24odGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRoZUltcG9ydC5nZXRFU2NoZW1hKCkgIT0gbnVsbCkKLQkJewotCQkJdmlzaXRTY2hlbWEodGhlSW1wb3J0LmdldEVTY2hlbWEoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZShYU0RTY2hlbWFEaXJlY3RpdmUgZGlyZWN0aXZlKQotCXsKLQkJWFNEU2NoZW1hIHJlZmVyZW5jZWRTY2hlbWEgPSBkaXJlY3RpdmUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKLQkJaWYgKHJlZmVyZW5jZWRTY2hlbWEgIT0gbnVsbCkKLQkJewotCQkJdmlzaXRTY2hlbWEocmVmZXJlbmNlZFNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotCXsKLQkJaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLQkJewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQl2aXNpdEltcG9ydCgoSW1wb3J0KWkubmV4dCgpKTsKLQkJCX0KLQkJCVR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLQkJCWlmICh0eXBlcyAhPSBudWxsKQotCQkJewotCi0JCQkJZm9yIChJdGVyYXRvciBpID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0JCQkJCXsKLQkJCQkJCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbzsKLQkJCQkJCWlmIChlLmdldEVYU0RTY2hlbWEoKSAhPSBudWxsKQotCQkJCQkJewotCQkJCQkJCXZpc2l0U2NoZW1hKGUuZ2V0RVhTRFNjaGVtYSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0JewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCXsKLQkJCU9iamVjdCBvID0gaS5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYURpcmVjdGl2ZSkKLQkJCXsKLQkJCQl2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZSgoWFNEU2NoZW1hRGlyZWN0aXZlKW8pOwotCQkJfQotCQl9Ci0JfQotfQotCi1jbGFzcyBSZWxvYWREZXBlbmRlbmN5VmlzaXRvciBleHRlbmRzIERlcGVuZGVuY3lWaXNpdG9yCi17Ci0JcHVibGljIHZvaWQgdmlzaXRJbXBvcnQoSW1wb3J0IHRoZUltcG9ydCkKLQl7Ci0JCUNvbXBvbmVudEhhbmRsZXIgaGFuZGxlciA9IFdTRExSZWNvbmNpbGVyLmdldFJlY29uY2lsZXIodGhlSW1wb3J0KTsKLQkJRWxlbWVudCBlbGVtZW50ID0gV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHRoZUltcG9ydCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgaGFuZGxlciAhPSBudWxsKQotCQl7Ci0JCQloYW5kbGVyLnJlY29uY2lsZSh3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSwgdGhlSW1wb3J0LCBlbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0WFNEU2NoZW1hRGlyZWN0aXZlKFhTRFNjaGVtYURpcmVjdGl2ZSBkaXJlY3RpdmUpCi0JewotCi0JfQotfSovClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETE11bHRpUGFnZUVkaXRvclBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2EwMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETE11bHRpUGFnZUVkaXRvclBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5Tb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuU3RydWN0dXJlZFRleHRFZGl0b3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWUuWE1MRWRpdG9yTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTXVsdGlQYWdlRWRpdG9yUGFydCBleHRlbmRzIE11bHRpUGFnZUVkaXRvclBhcnQgaW1wbGVtZW50cyBJUHJvcGVydHlMaXN0ZW5lcgotewotCi0JICAvKioKLQkgICAqIAotCSAgICovCi0JICBwdWJsaWMgV1NETE11bHRpUGFnZUVkaXRvclBhcnQoKQotCSAgewotCSAgICBzdXBlcigpOwotCSAgfQotCSAgCi0JICAvKioKLQkgICAqIEludGVybmFsIHBhcnQgYWN0aXZhdGlvbiBsaXN0ZW5lcgotCSAgICovCi0JICBjbGFzcyBQYXJ0TGlzdGVuZXIgZXh0ZW5kcyBTaGVsbEFkYXB0ZXIgaW1wbGVtZW50cyBJUGFydExpc3RlbmVyIHsKLQkgICAgcHJpdmF0ZSBJV29ya2JlbmNoUGFydCBmQWN0aXZlUGFydDsKLQkgICAgcHJpdmF0ZSBib29sZWFuIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCi0JICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkgewotCi0JICAgICAgaWYgKGZJc0hhbmRsaW5nQWN0aXZhdGlvbikKLQkgICAgICAgIHJldHVybjsKLQotCSAgICAgIGlmIChmQWN0aXZlUGFydCA9PSBXU0RMTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzKSB7Ci0JICAgICAgICBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotCSAgICAgICAgdHJ5IHsKLQkgICAgICAgICAgc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgZmluYWxseSB7Ci0JICAgICAgICAgIGZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCi0JICAgIC8qKgotCSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCkKLQkgICAgICovCi0JICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCSAgICAgIGZBY3RpdmVQYXJ0ID0gcGFydDsKLQkgICAgICBoYW5kbGVBY3RpdmF0aW9uKCk7Ci0JICAgIH0KLQotCSAgICAvKioKLQkgICAgICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkgICAgfQotCi0JICAgIC8qKgotCSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydENsb3NlZChJV29ya2JlbmNoUGFydCkKLQkgICAgICovCi0JICAgIHB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCSAgICB9Ci0KLQkgICAgLyoqCi0JICAgICAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCSAgICAgIGZBY3RpdmVQYXJ0ID0gbnVsbDsKLQkgICAgfQotCi0JICAgIC8qKgotCSAgICAgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCkKLQkgICAgICovCi0JICAgIHB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCSAgICB9Ci0KLQkgICAgLyoKLQkgICAgICogQHNlZSBTaGVsbExpc3RlbmVyI3NoZWxsQWN0aXZhdGVkKFNoZWxsRXZlbnQpCi0JICAgICAqLwotCSAgICBwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGUpIHsKLQkgICAgICBoYW5kbGVBY3RpdmF0aW9uKCk7Ci0JICAgIH0KLQkgIH0KLQotCSAgY2xhc3MgVGV4dElucHV0TGlzdGVuZXIgaW1wbGVtZW50cyBJVGV4dElucHV0TGlzdGVuZXIgewotCSAgICBwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCSAgICB9Ci0KLQkgICAgcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkgICAgfQotCSAgfQotCi0JICAvKiogVGhlIHNvdXJjZSBwYWdlIGluZGV4LiAqLwotCSAgcHJpdmF0ZSBpbnQgZlNvdXJjZVBhZ2VJbmRleDsKLQkgIC8qKiBUaGUgdGV4dCBlZGl0b3IuICovCi0JICBwcml2YXRlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGZUZXh0RWRpdG9yOwotCi0JICBwcml2YXRlIFBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXI7Ci0KLQotCSAgLyoKLQkgICAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgdG8gbWFrZSBmaXJlUHJvcGVydHlDaGFuZ2VkIGFjY2Vzc2JpYmxlIGZyb20gc29tZQotCSAgICogKGFub25vbW91cykgaW5uZXIgY2xhc3Nlcy4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgX2ZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgcHJvcGVydHkpIHsKLQkgICAgc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5KTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBBZGRzIHRoZSBzb3VyY2UgcGFnZSBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIGFkZFNvdXJjZVBhZ2UoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCSAgICB0cnkgewotCSAgICAgIGZTb3VyY2VQYWdlSW5kZXggPSBhZGRQYWdlKGZUZXh0RWRpdG9yLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkgICAgICBzZXRQYWdlVGV4dChmU291cmNlUGFnZUluZGV4LCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9UQUJfU09VUkNFIikpOyAvLyROT04tTkxTLTEkCi0JICAgICAgLy8gdGhlIHVwZGF0ZSdzIGNyaXRpY2FsLCB0byBnZXQgdmlld2VyIHNlbGVjdGlvbiBtYW5hZ2VyIGFuZAotCSAgICAgIC8vIGhpZ2hsaWdodGluZyB0byB3b3JrCi0JICAgICAgZlRleHRFZGl0b3IudXBkYXRlKCk7Ci0JICAKLQkgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9USVRMRSk7Ci0JICAKLQkgICAgICAvLyBDaGFuZ2VzIHRvIHRoZSBUZXh0IFZpZXdlcidzIGRvY3VtZW50IGluc3RhbmNlIHNob3VsZCBhbHNvIGZvcmNlIGFuCi0JICAgICAgLy8gaW5wdXQgcmVmcmVzaAotCSAgICAgIGZUZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5hZGRUZXh0SW5wdXRMaXN0ZW5lcihuZXcgVGV4dElucHV0TGlzdGVuZXIoKSk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCSAgICAgIC8vIGRpc3Bvc2UgZWRpdG9yCi0JICAgICAgZGlzcG9zZSgpOwotCi0JICAgICAgdGhyb3cgbmV3IFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXyIpKTsgLy8kTk9OLU5MUy0xJAotCSAgICB9Ci0JICB9Ci0KLQotCSAgLyogKG5vbi1KYXZhZG9jKQotCSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjY3JlYXRlUGFnZXMoKQotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JICAgICAgLy8gc291cmNlIHBhZ2UgTVVTVCBiZSBjcmVhdGVkIGJlZm9yZSBkZXNpZ24gcGFnZSwgbm93Ci0JICAgICAgY3JlYXRlU291cmNlUGFnZSgpOwotCSAgICAgIGFkZFNvdXJjZVBhZ2UoKTsKLQkgICAgICBzZXRBY3RpdmVQYWdlKCk7Ci0KLQkgICAgLy8gZnV0dXJlX1RPRE86IGFkZCBhIGNhdGNoIGJsb2NrIGhlcmUgZm9yIGFueSBleGNlcHRpb24gdGhlIGRlc2lnbgotCSAgICAvLyBwYWdlIHRocm93cyBhbmQgY29udmVydCBpdCBpbnRvIGEgbW9yZSBpbmZvcm1hdGl2ZSBtZXNzYWdlLgotCSAgICB9Ci0JICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JICAgIH0KLQkgIH0KLQotCSAgLyoqCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVTaXRlKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAgICovCi0JICBwcm90ZWN0ZWQgSUVkaXRvclNpdGUgY3JlYXRlU2l0ZShJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkgICAgSUVkaXRvclNpdGUgc2l0ZSA9IG51bGw7Ci0JICAgIGlmIChlZGl0b3IgPT0gZlRleHRFZGl0b3IpIHsKLQkgICAgICBzaXRlID0gbmV3IE11bHRpUGFnZUVkaXRvclNpdGUodGhpcywgZWRpdG9yKSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlI2dldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkKLQkgICAgICAgICAqLwotCSAgICAgICAgcHVibGljIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkgICAgICAgICAgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gc3VwZXIuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkgICAgICAgICAgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIG11bHRpQ29udHJpYnV0b3IgPSBXU0RMTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotLy8JICAgICAgICAgIGlmIChtdWx0aUNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLS8vCSAgICAgICAgICAgIGNvbnRyaWJ1dG9yID0gKChYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgbXVsdGlDb250cmlidXRvcikuc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3I7Ci0vLwkgICAgICAgICAgfQotCSAgICAgICAgICByZXR1cm4gY29udHJpYnV0b3I7Ci0JICAgICAgICB9Ci0JICAgICAgfTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgICBzaXRlID0gc3VwZXIuY3JlYXRlU2l0ZShlZGl0b3IpOwotCSAgICB9Ci0JICAgIHJldHVybiBzaXRlOwotCSAgfQotCi0JICAvKioKLQkgICAqIENyZWF0ZXMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JICAgIGZUZXh0RWRpdG9yID0gY3JlYXRlVGV4dEVkaXRvcigpOwotCSAgICBmVGV4dEVkaXRvci5zZXRFZGl0b3JQYXJ0KHRoaXMpOwotCi0JICAgIC8vIFNldCB0aGUgU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBub3cgc28gdGhlIHRleHQgZWRpdG9yIHdvbid0IHVzZQotCSAgICAvLyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZpcnN0Ci0JICAgIC8vIGFuZCBzd2l0Y2ggdG8gdGhlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBsYXRlci4KLQkgICAgLy8gRE1XIHJlbW92ZWQgc2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbiAzLzI2LzIwMDMgc2luY2UgYWRkZWQKLQkgICAgLy8gY3JlYXRlUGFydENvbnRyb2wgdG8gb3VyIHRleHQgZWRpdG9yLgotCSAgICAvLyBmVGV4dEVkaXRvci5zZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JICAgIGZUZXh0RWRpdG9yLmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcyk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogTWV0aG9kIGNyZWF0ZVRleHRFZGl0b3IuCi0JICAgKiAKLQkgICAqIEByZXR1cm4gU3RydWN0dXJlZFRleHRFZGl0b3IKLQkgICAqLwotCSAgcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0RWRpdG9yIGNyZWF0ZVRleHRFZGl0b3IoKSB7Ci0JICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFRleHRFZGl0b3JYTUwoKTsKLQkgIH0KLQotCSAgcHVibGljIHZvaWQgZGlzcG9zZSgpCi0JICB7Ci0JICAgIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCSAgICB3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkgICAgd2luZG93LmdldFNoZWxsKCkucmVtb3ZlU2hlbGxMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0JICAgIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JICAgIGlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JICAgICAgZlRleHRFZGl0b3IucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkgICAgfQotCi0JICAgIC8vIG1vdmVkIHRvIGxhc3Qgd2hlbiBhZGRlZCB3aW5kb3cgLi4uIHNlZW1zIGxpa2UKLQkgICAgLy8gd2UnZCBiZSBpbiBkYW5nZXIgb2YgbG9zaW5nIHNvbWUgZGF0YSwgbGlrZSBzaXRlLAotCSAgICAvLyBvciBzb21ldGhpbmcuCi0JICAgIHN1cGVyLmRpc3Bvc2UoKTsKLQkgIH0KLQotCSAgLyoKLQkgICAqIChub24tSmF2YWRvYykgU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yLiA8cD4gU3ViY2xhc3NlcyBtdXN0Ci0JICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXBsZW1lbnQgdGhlIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUgZm9yIGFuCi0JICAgKiBlZGl0b3IuIEZvciBncmVhdGVyIGRldGFpbHMsIHNlZSA8Y29kZT4gSUVkaXRvclBhcnQgPC9jb2RlPjwvcD4KLQkgICAqIAotCSAgICogQHNlZSBJRWRpdG9yUGFydAotCSAgICovCi0JICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JICAgIGZUZXh0RWRpdG9yLmRvU2F2ZShtb25pdG9yKTsKLQkgICAgLy8gICAgLy8gdGhpcyBpcyBhIHRlbXBvcmFyeSB3YXkgdG8gZm9yY2UgdmFsaWRhdGlvbi4KLQkgICAgLy8gICAgLy8gd2hlbiB0aGUgdmFsaWRhdG9yIGlzIGEgd29ya2JlbmNoIGJ1aWxkZXIsIHRoZSBmb2xsb3dpbmcgbGluZXMKLQkgICAgLy8gY2FuIGJlIHJlbW92ZWQKLQkgICAgLy8gICAgaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkKLQkgICAgLy8gICAgICBmRGVzaWduVmlld2VyLnNhdmVPY2N1cnJlZCgpOwotCi0JICB9Ci0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGVkaXRvciB0byBhbm90aGVyIG9iamVjdC4gPHA+Ci0JICAgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wbGVtZW50IHRoZSBvcGVuLXNhdmUtY2xvc2UKLQkgICAqIGxpZmVjeWNsZSBmb3IgYW4gZWRpdG9yLiBGb3IgZ3JlYXRlciBkZXRhaWxzLCBzZWUgPGNvZGU+IElFZGl0b3JQYXJ0Ci0JICAgKiA8L2NvZGU+PC9wPgotCSAgICogCi0JICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCSAgICBmVGV4dEVkaXRvci5kb1NhdmVBcygpOwotCSAgICAvLyAyNTM2MTkKLQkgICAgLy8gZm9sbG93aW5nIHVzZWQgdG8gYmUgZXhlY3V0ZWQgaGVyZSwgYnV0IGlzCi0JICAgIC8vIG5vdyBjYWxsZWQgImJhY2siIGZyb20gdGV4dCBlZGl0b3IgKHNpbmNlCi0JICAgIC8vIG11bGl0aXBsZSBwYXRocyB0byB0aGUgcGVyZm9ybVNhdmVBcyBpbiBTdHJ1Y3R1cmVkVGV4dEVkaXRvci4KLQkgICAgLy9kb1NhdmVBc0ZvclN0cnVjdHVyZWRUZXh0TXVsaXRQYWdlUGFydCgpOwotCSAgfQotCi0JCXByaXZhdGUgdm9pZCBlZGl0b3JJbnB1dElzQWNjZXB0YWJsZShJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJLy8gdmVyaWZ5IHRoYXQgaXQgY2FuIGJlIG9wZW5lZAotCQkJCUNvcmVFeGNlcHRpb25bXSBjb3JlRXhjZXB0aW9uQXJyYXkgPSBuZXcgQ29yZUV4Y2VwdGlvblsxXTsKLQkJCQlpZiAoZmlsZURvZXNOb3RFeGlzdCgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQsIGNvcmVFeGNlcHRpb25BcnJheSkpIHsKLQkJCQkJQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uID0gY29yZUV4Y2VwdGlvbkFycmF5WzBdOwotCQkJCQlpZiAoY29yZUV4Y2VwdGlvbi5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVJlc291cmNlU3RhdHVzLkZBSUxFRF9SRUFEX0xPQ0FMKSB7Ci0JCQkJCQkvLyBJJ20gYXNzdW1pbmcgdGhpcyBpcyBhbHdheXMgJ2RvZXMgbm90IGV4aXN0JwotCQkJCQkJLy8gd2UnbGwgcmVmcmVzaCBsb2NhbCBnbyBtaW1pYyBiZWhhdmlvciBvZiBkZWZhdWx0Ci0JCQkJCQkvLyBlZGl0b3IsIHdoZXJlIHRoZQotCQkJCQkJLy8gdHJvdWJsZXNvbWUgZmlsZSBpcyByZWZyZXNoZWQgKGFuZCB3aWxsIGNhdXNlIGl0IHRvCi0JCQkJCQkvLyAnZGlzYXBwZWFyJyBmcm9tIE5hdmlnYXRvci4KLQkJCQkJCXRyeSB7Ci0JCQkJCQkJKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJCQkJLy8gdmVyeSB1bmxpa2VseQotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oY2UpOwotCQkJCQkJfQotCQkJCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE5MUy5iaW5kKFhNTEVkaXRvck1lc3NhZ2VzLlJlc291cmNlX19kb2VzX25vdF9leGlzdCwgKG5ldyBPYmplY3RbXXtpbnB1dC5nZXROYW1lKCl9KSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdGhyb3cgbmV3IFBhcnRJbml0RXhjZXB0aW9uKE5MUy5iaW5kKFhNTEVkaXRvck1lc3NhZ2VzLkVkaXRvcl9jb3VsZF9ub3RfYmVfb3BlbiwgKG5ldyBPYmplY3RbXXtpbnB1dC5nZXROYW1lKCl9KSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMgPSAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0Q29udGVudHMoKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIG5vU3RvcmFnZUV4YykgewotCQkJCX0KLQkJCQlpZiAoY29udGVudHMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oTkxTLmJpbmQoWE1MRWRpdG9yTWVzc2FnZXMuRWRpdG9yX2NvdWxkX25vdF9iZV9vcGVuLCAobmV3IE9iamVjdFtde2lucHV0LmdldE5hbWUoKX0pKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkgIC8vICB2b2lkIGRvU2F2ZUFzRm9yU3RydWN0dXJlZFRleHRNdWxpdFBhZ2VQYXJ0KCkgewotCSAgLy8gICAgc2V0UGFnZVRleHQoZ2V0QWN0aXZlUGFnZSgpLCBmVGV4dEVkaXRvci5nZXRUaXRsZSgpKTsKLQkgIC8vICAgIHNldElucHV0KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCSAgLy8gICAgaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkgewotCSAgLy8gICAgICAvL2ZEZXNpZ25WaWV3ZXIuc2V0RWRpdG9ySW5wdXQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JICAvLyAgICAgIGZEZXNpZ25WaWV3ZXIuc2V0TW9kZWwoZ2V0TW9kZWwoKSk7Ci0JICAvLyAgICAgIGZEZXNpZ25WaWV3ZXIuc2F2ZUFzT2NjdXJyZWQoKTsKLQkgIC8vICAgIH0KLQkgIC8vICAgIC8vIGV2ZW4gdGhvdWdoIHdlJ3ZlIHNldCB0aXRsZSBldGMuLCBzZXZlcmFsIHRpbWVzIGFscmVhZHkhCi0JICAvLyAgICAvLyBvbmx5IG5vdyBpcyBhbGwgcHJlcGFyZWQgZm9yIGl0LgotCSAgLy8gICAgZmlyZVByb3BlcnR5Q2hhbmdlKElXb3JrYmVuY2hQYXJ0LlBST1BfVElUTEUpOwotCSAgLy8gICAgZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCSAgLy8gIH0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIEluaXRpYWxpemVzIHRoZSBlZGl0b3IgcGFydCB3aXRoIGEgc2l0ZSBhbmQgaW5wdXQuIDxwPgotCSAgICogU3ViY2xhc3NlcyBvZiA8Y29kZT4gRWRpdG9yUGFydCA8L2NvZGU+IG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAgICogV2l0aGluIHRoZSBpbXBsZW1lbnRhdGlvbiBzdWJjbGFzc2VzIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGUgaW5wdXQgdHlwZQotCSAgICogaXMgYWNjZXB0YWJsZSBhbmQgdGhlbiBzYXZlIHRoZSBzaXRlIGFuZCBpbnB1dC4gSGVyZSBpcyBzYW1wbGUgY29kZToKLQkgICAqIDwvcD48cHJlPiBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpKSB0aHJvdyBuZXcKLQkgICAqIFBhcnRJbml0RXhjZXB0aW9uKCJJbnZhbGlkIElucHV0OiBNdXN0IGJlIElGaWxlRWRpdG9ySW5wdXQiKTsKLQkgICAqIHNldFNpdGUoc2l0ZSk7IHNldElucHV0KGVkaXRvcklucHV0KTsgPC9wcmU+Ci0JICAgKi8KLQkgIHByb3RlY3RlZCBib29sZWFuIGZpbGVEb2VzTm90RXhpc3QoSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCwgVGhyb3dhYmxlW10gY29yZUV4Y2VwdGlvbikgewotCSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCSAgICBJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0JICAgIGlmICgoIShpbnB1dC5leGlzdHMoKSkpIHx8ICghKGlucHV0LmdldEZpbGUoKS5leGlzdHMoKSkpKSB7Ci0JICAgICAgcmVzdWx0ID0gdHJ1ZTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgICB0cnkgewotCSAgICAgICAgaW5TdHJlYW0gPSBpbnB1dC5nZXRGaWxlKCkuZ2V0Q29udGVudHModHJ1ZSk7Ci0JICAgICAgfQotCSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIC8vIHZlcnkgbGlrZWx5IHRvIGJlIGZpbGUgbm90IGZvdW5kCi0JICAgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICAgICAgY29yZUV4Y2VwdGlvblswXSA9IGU7Ci0JICAgICAgfQotCSAgICAgIGZpbmFsbHkgewotCSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKLQkgICAgICAgICAgdHJ5IHsKLQkgICAgICAgICAgICBpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgIH0KLQkgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIHJldHVybiByZXN1bHQ7Ci0JICB9Ci0KLQkgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0KLQkgICAgICAvLyBETVc6IEknbSBidWxsZXQtcHJvb2ZpbmcgdGhpcyBiZWNhdXNlCi0JICAgICAgLy8gaXRzIGJlZW4gcmVwb3J0ZWQgKG9uIDQuMDMgdmVyc2lvbikgYSBudWxsIHBvaW50ZXIgc29tZXRpbWVzCi0JICAgICAgLy8gaGFwcGVucyBoZXJlIG9uIHN0YXJ0dXAsIHdoZW4gYW4gZWRpdG9yIGhhcyBiZWVuIGxlZnQKLQkgICAgICAvLyBvcGVuIHdoZW4gd29ya2JlbmNoIHNodXRkb3duLgotCSAgICAgIGlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JICAgICAgICByZXN1bHQgPSBmVGV4dEVkaXRvci5nZXRBZGFwdGVyKGtleSk7Ci0JICAgICAgfQotCSAgICByZXR1cm4gcmVzdWx0OwotCSAgfQotCi0JcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQkgIAotCSAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JICAgIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCSAgICBpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkKLQkgICAgICBtb2RlbCA9IGZUZXh0RWRpdG9yLmdldE1vZGVsKCk7Ci0JICAgIHJldHVybiBtb2RlbDsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCSAgfQotCi0JICBwdWJsaWMgU3RydWN0dXJlZFRleHRFZGl0b3IgZ2V0VGV4dEVkaXRvcigpIHsKLQkgICAgcmV0dXJuIGZUZXh0RWRpdG9yOwotCSAgfQotCi0JICAvKgotCSAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhcnQuCi0JICAgKi8KLQkgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JICAgIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0JICAgIGlmIChnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkgewotCSAgICAgIGlmIChnZXRFZGl0b3JJbnB1dCgpICE9IG51bGwpIHsKLQkgICAgICAgIHRpdGxlID0gZ2V0RWRpdG9ySW5wdXQoKS5nZXROYW1lKCk7Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIGVsc2UgewotCSAgICAgIHRpdGxlID0gZ2V0VGV4dEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JICAgIH0KLQkgICAgaWYgKHRpdGxlID09IG51bGwpIHsKLQkgICAgICB0aXRsZSA9IGdldFBhcnROYW1lKCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHRpdGxlOwotCSAgfQotCi0JICAvKgotCSAgICogKG5vbi1KYXZhZG9jKSBTZXRzIHRoZSBjdXJzb3IgYW5kIHNlbGVjdGlvbiBzdGF0ZSBmb3IgdGhpcyBlZGl0b3IgdG8KLQkgICAqIHRoZSBwYXNzYWdlIGRlZmluZWQgYnkgdGhlIGdpdmVuIG1hcmtlci4gPHA+IFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAgICogRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlIDxjb2RlPiBJRWRpdG9yUGFydCA8L2NvZGU+PC9wPgotCSAgICogCi0JICAgKiBAc2VlIElFZGl0b3JQYXJ0Ci0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkgICAgLy8gKHBhKSAyMDAyMDIxNyB0aGlzIHdhcyBudWxsIHdoZW4gb3BlbmluZyBhbiBlZGl0b3IgdGhhdCB3YXMKLQkgICAgLy8gYWxyZWFkeSBvcGVuCi0JICAgIGlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JICAgICAgSUdvdG9NYXJrZXIgbWFya2VyR290b2VyID0gKElHb3RvTWFya2VyKSBmVGV4dEVkaXRvci5nZXRBZGFwdGVyKElHb3RvTWFya2VyLmNsYXNzKTsKLQkgICAgICBtYXJrZXJHb3RvZXIuZ290b01hcmtlcihtYXJrZXIpOwotCSAgICB9Ci0JICB9Ci0KLQkgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCSAgICBlZGl0b3JJbnB1dElzQWNjZXB0YWJsZShpbnB1dCk7Ci0JICAgIHRyeSB7Ci0JICAgICAgc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JICAgICAgaWYgKHBhcnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JICAgICAgICBwYXJ0TGlzdGVuZXIgPSBuZXcgUGFydExpc3RlbmVyKCk7Ci0JICAgICAgfQotCSAgICAgIC8vZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RuZXIpOwotCSAgICAgIC8vIHdlIHdhbnQgdG8gbGlzdGVuIGZvciBvdXIgb3duIGFjdGl2YXRpb24KLQkgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQkgICAgICB3aW5kb3cuZ2V0UGFydFNlcnZpY2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkgICAgICB3aW5kb3cuZ2V0U2hlbGwoKS5hZGRTaGVsbExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTb3VyY2VFZGl0aW5nUnVudGltZUV4Y2VwdGlvbikgewotCSAgICAgICAgVGhyb3dhYmxlIHQgPSAoKFNvdXJjZUVkaXRpbmdSdW50aW1lRXhjZXB0aW9uKSBlKS5nZXRPcmlnaW5hbEV4Y2VwdGlvbigpOwotCSAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odCk7Ci0JICAgICAgICAgIC8vIGZpbGUgbm90IGZvdW5kCi0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICAgIHNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JICB9Ci0KLQkgIC8qCi0JICAgKiAobm9uLUphdmFkb2MpIFJldHVybnMgd2hldGhlciB0aGUgInNhdmUgYXMiIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgYnkKLQkgICAqIHRoaXMgZWRpdG9yLiA8cD4gU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCB0aGUKLQkgICAqIG9wZW4tc2F2ZS1jbG9zZSBsaWZlY3ljbGUgZm9yIGFuIGVkaXRvci4gRm9yIGdyZWF0ZXIgZGV0YWlscywgc2VlCi0JICAgKiA8Y29kZT4gSUVkaXRvclBhcnQgPC9jb2RlPjwvcD4KLQkgICAqIAotCSAgICogQHNlZSBJRWRpdG9yUGFydAotCSAgICovCi0JICBwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JICAgIHJldHVybiBmVGV4dEVkaXRvciAhPSBudWxsICYmIGZUZXh0RWRpdG9yLmlzU2F2ZUFzQWxsb3dlZCgpOwotCSAgfQotCi0JICAvKgotCSAgICogKG5vbi1KYXZhZG9jKSBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZWRpdG9yIHNob3VsZCBiZQotCSAgICogc2F2ZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGNsb3NlZC4gPHA+IFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+IHRydWUKLQkgICAqIDwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGVkaXRvciBpcyBkaXJ0eSAoIDxjb2RlPiBpc0RpcnR5IDwvY29kZT4gKS4KLQkgICAqIDwvcD4KLQkgICAqLwotCSAgcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkgICAgLy8gb3ZlcnJpZGluZyBzdXBlciBjbGFzcyBzaW5jZSBpdCBkb2VzIGEgbG93bHkgaXNEaXJ0eSEKLQkgICAgaWYgKGZUZXh0RWRpdG9yICE9IG51bGwpCi0JICAgICAgcmV0dXJuIGZUZXh0RWRpdG9yLmlzU2F2ZU9uQ2xvc2VOZWVkZWQoKTsKLQkgICAgcmV0dXJuIGlzRGlydHkoKTsKLQkgIH0KLQotCSAgLyoqCi0JICAgKiBOb3RpZmllcyB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yIHRoYXQgdGhlIHBhZ2Ugd2l0aCB0aGUgZ2l2ZW4gaWQgaGFzCi0JICAgKiBiZWVuIGFjdGl2YXRlZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIGRpZmZlcmVudAotCSAgICogdGFiLgotCSAgICogCi0JICAgKiBAcGFyYW0gbmV3UGFnZUluZGV4Ci0JICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgYWN0aXZhdGVkIHBhZ2UKLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JICAgIHN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQotCSAgICBzYXZlTGFzdEFjdGl2ZVBhZ2VJbmRleChuZXdQYWdlSW5kZXgpOwotCSAgfQotCi0JICAvKioKLQkgICAqIFBvc3RzIHRoZSB1cGRhdGUgY29kZSAiYmVoaW5kIiB0aGUgcnVubmluZyBvcGVyYXRpb24uCi0JICAgKi8KLQkgIHByb3RlY3RlZCB2b2lkIHBvc3RPbkRpc3BsYXlRdWUoUnVubmFibGUgcnVubmFibGUpIHsKLQkgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCSAgICBJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7Ci0JICAgIGlmICh3aW5kb3dzICE9IG51bGwgJiYgd2luZG93cy5sZW5ndGggPiAwKSB7Ci0JICAgICAgRGlzcGxheSBkaXNwbGF5ID0gd2luZG93c1swXS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLQkgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHJ1bm5hYmxlLnJ1bigpOwotCSAgfQotCi0JICAvKioKLQkgICAqIEluZGljYXRlcyB0aGF0IGEgcHJvcGVydHkgaGFzIGNoYW5nZWQuCi0JICAgKiAKLQkgICAqIEBwYXJhbSBzb3VyY2UKLQkgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBoYXMgY2hhbmdlZAotCSAgICogQHBhcmFtIHByb3BJZAotCSAgICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIHByb3BlcnR5IHdoaWNoIGhhcyBjaGFuZ2VkOyBwcm9wZXJ0eSBpZHMgYXJlCi0JICAgKiAgICAgICAgICAgIGdlbmVyYWxseSBkZWZpbmVkIGFzIGNvbnN0YW50cyBvbiB0aGUgc291cmNlIGNsYXNzCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcElkKSB7Ci0JICAgIHN3aXRjaCAocHJvcElkKSB7Ci0JICAgICAgLy8gaGFkIHRvIGltcGxlbWVudCBpbnB1dCBjaGFuZ2VkICJsaXN0ZW5lciIgc28gdGhhdAotCSAgICAgIC8vIHN0cnVjdXRlZFRleHQgY291bGQgdGVsbCBpdCBjb250YWluaW5nIGVkaXRvciB0aGF0Ci0JICAgICAgLy8gdGhlIGlucHV0IGhhcyBjaGFuZ2UsIHdoZW4gYSAncmVzb3VyY2UgbW92ZWQnIGV2ZW50IGlzCi0JICAgICAgLy8gZm91bmQuCi0JICAgICAgY2FzZSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUIDoKLQkgICAgICBjYXNlIElFZGl0b3JQYXJ0LlBST1BfRElSVFkgOiB7Ci0JICAgICAgICBpZiAoc291cmNlID09IGZUZXh0RWRpdG9yKSB7Ci0JICAgICAgICAgIGlmIChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpIHsKLQkgICAgICAgICAgICBzZXRJbnB1dChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkgICAgICAgICAgICAvLyB0aXRsZSBzaG91bGQgYWx3YXlzIGNoYW5nZSB3aGVuIGlucHV0IGNoYW5nZXMuCi0JICAgICAgICAgICAgLy8gY3JlYXRlIHJ1bm5hYmxlIGZvciBmb2xsb3dpbmcgcG9zdCBjYWxsCi0JICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JICAgICAgICAgICAgICAgIF9maXJlUHJvcGVydHlDaGFuZ2UoSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSk7Ci0JICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfTsKLQkgICAgICAgICAgICAvLyBVcGRhdGUgaXMganVzdCB0byBwb3N0IHRoaW5ncyBvbiB0aGUgZGlzcGxheSBxdWV1ZQotCSAgICAgICAgICAgIC8vICh0aHJlYWQpLiBXZSBoYXZlIHRvIGRvIHRoaXMgdG8gZ2V0IHRoZSBkaXJ0eQotCSAgICAgICAgICAgIC8vIHByb3BlcnR5IHRvIGdldCB1cGRhdGVkIGFmdGVyIG90aGVyIHRoaW5ncyBvbiB0aGUKLQkgICAgICAgICAgICAvLyBxdWV1ZSBhcmUgZXhlY3V0ZWQuCi0JICAgICAgICAgICAgcG9zdE9uRGlzcGxheVF1ZShydW5uYWJsZSk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgICBjYXNlIElXb3JrYmVuY2hQYXJ0LlBST1BfVElUTEUgOiB7Ci0JICAgICAgICAvLyB1cGRhdGUgdGhlIGlucHV0IGlmIHRoZSB0aXRsZSBpcyBjaGFuZ2VkCi0JICAgICAgICBpZiAoc291cmNlID09IGZUZXh0RWRpdG9yKSB7Ci0JICAgICAgICAgIGlmIChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpIHsKLQkgICAgICAgICAgICBzZXRJbnB1dChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICAgYnJlYWs7Ci0JICAgICAgfQotCSAgICAgIGRlZmF1bHQgOiB7Ci0JICAgICAgICAvLyBwcm9wYWdhdGUgY2hhbmdlcy4gSXMgdGhpcyBuZWVkZWQ/IEFuc3dlcjogWWVzLgotCSAgICAgICAgaWYgKHNvdXJjZSA9PSBmVGV4dEVkaXRvcikgewotCSAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UocHJvcElkKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgfQotCi0JICB9Ci0KLQkgIHByb3RlY3RlZCB2b2lkIHNhZmVseVNhbml0eUNoZWNrU3RhdGUoKSB7Ci0JICAgIC8vIElmIHdlJ3JlIGNhbGxlZCBiZWZvcmUgZWRpdG9yIGlzIGNyZWF0ZWQsIHNpbXBseSBpZ25vcmUgc2luY2Ugd2UKLQkgICAgLy8gZGVsZWdhdGUgdGhpcyBmdW5jdGlvbiB0byBvdXIgZW1iZWRkZWQgVGV4dEVkaXRvcgotCSAgICBpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0JICAgICAgcmV0dXJuOwotCi0JICAgIGdldFRleHRFZGl0b3IoKS5zYWZlbHlTYW5pdHlDaGVja1N0YXRlKGdldEVkaXRvcklucHV0KCkpOwotCi0JICB9Ci0KLQkgIHByb3RlY3RlZCB2b2lkIHNhdmVMYXN0QWN0aXZlUGFnZUluZGV4KGludCBuZXdQYWdlSW5kZXgpIHsKLQkgICAgLy8gc2F2ZSB0aGUgbGFzdCBhY3RpdmUgcGFnZSBpbmRleCB0byBwcmVmZXJlbmNlIG1hbmFnZXIKLQkgICAgZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSVhNTFByZWZlcmVuY2VOYW1lcy5MQVNUX0FDVElWRV9QQUdFLCBuZXdQYWdlSW5kZXgpOwotCSAgfQotCi0JICAvKioKLQkgICAqIFNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcGFnZS4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgc2V0QWN0aXZlUGFnZSgpIHsKLQkgICAgLy8gcmV0cmlldmUgdGhlIGxhc3QgYWN0aXZlIHBhZ2UgaW5kZXggZnJvbSBwcmVmZXJlbmNlIG1hbmFnZXIKLQkgICAgaW50IGFjdGl2ZVBhZ2VJbmRleCA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChJWE1MUHJlZmVyZW5jZU5hbWVzLkxBU1RfQUNUSVZFX1BBR0UpOwotCi0JICAgIC8vIFdlIGNoZWNrIHRoaXMgcmFuZ2Ugc2luY2Ugc29tZW9uZSBjb3VsZCBoYW5kIGVkaXQgdGhlIFhNTAotCSAgICAvLyBwcmVmZXJlbmNlIGZpbGUgdG8gYW4gaW52YWxpZCB2YWx1ZSAuLi4gd2hpY2ggSSBrbm93IGZyb20KLQkgICAgLy8gZXhwZXJpZW5jZSA6KCAuLi4gaWYgdGhleSBkbywgd2UnbGwgcmVzZXQgdG8gZGVmYXVsdCBhbmQgY29udGludWUKLQkgICAgLy8gcmF0aGVyIHRoYW4gdGhyb3cgYW4gYXNzZXJ0aW9uIGVycm9yIGluIHRoZSBzZXRBY3RpdmVQYWdlKGludCkKLQkgICAgLy8gbWV0aG9kLgotCSAgICBpZiAoYWN0aXZlUGFnZUluZGV4IDwgMCB8fCBhY3RpdmVQYWdlSW5kZXggPj0gZ2V0UGFnZUNvdW50KCkpIHsKLQkgICAgICBhY3RpdmVQYWdlSW5kZXggPSBmU291cmNlUGFnZUluZGV4OwotCSAgICB9Ci0JICAgIHNldEFjdGl2ZVBhZ2UoYWN0aXZlUGFnZUluZGV4KTsKLQkgIH0KLQotCSAgLyoKLQkgICAqIChub24tSmF2YWRvYykKLQkgICAqIAotCSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAgICovCi0JICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkgICAgLy8gSWYgZHJpdmVuIGZyb20gdGhlIFNvdXJjZSBwYWdlLCBpdCdzICJtb2RlbCIgbWF5IG5vdCBiZSB1cCB0byBkYXRlCi0JICAgIC8vIHdpdGggdGhlIGlucHV0IGp1c3QgeWV0LiBXZSdsbCByZWx5IG9uIGxhdGVyIG5vdGlmaWNhdGlvbiBmcm9tIHRoZQotCSAgICAvLyBUZXh0Vmlld2VyIHRvIHNldCB1cyBzdHJhaWdodAotCSAgICBzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0JICAgIHNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JICB9Ci0KLQkgIC8qKgotCSAgICogSUV4dGVuZGVkTWFya3VwRWRpdG9yIG1ldGhvZAotCSAgICovCi0JICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoU2hlbGwgY29udGV4dCkgewotCSAgICBpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpCi0JICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgV1NETEVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIElTdGF0dXMuSU5GTywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkgICAgcmV0dXJuIGdldFRleHRFZGl0b3IoKS52YWxpZGF0ZUVkaXQoY29udGV4dCk7Ci0JICB9Ci0JICAKLQl9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMU2VsZWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvV1NETFNlbGVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhNGQ4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMU2VsZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotcHVibGljIGNsYXNzIFdTRExTZWxlY3Rpb25NYW5hZ2VyIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyLCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17ICAgICAgIAotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0gIHByb3RlY3RlZCBib29sZWFuIGVuYWJsZU5vdGlmeSA9IHRydWU7Ci0KLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uLCBJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlKQotICB7ICAKLSAgICBpZiAoZW5hYmxlTm90aWZ5KQotICAgIHsKLSAgICAgIGN1cnJlbnRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gICAgICBlbmFibGVOb3RpZnkgPSBmYWxzZTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNvdXJjZSwgc2VsZWN0aW9uKTsKLSAgICAgICAgTGlzdCBjb3B5T2ZMaXN0ZW5lckxpc3QgPSBuZXcgQXJyYXlMaXN0KGxpc3RlbmVyTGlzdCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvcHlPZkxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgICAgIGxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGVuYWJsZU5vdGlmeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9ICAgICAgCi0KLSAgLy8gIGltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRoaXMpOwotICB9Ci0KLSAgcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgCi0gIHsKLSAgICByZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgfSAKLSAgCi0gIC8vIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotICAvLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoZW5hYmxlTm90aWZ5KQotICAgIHsKLSAgICAgIHNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0gICAgfQotICB9Ci19ICAgICAgICAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExUZXh0RWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9XU0RMVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjcyNWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL1dTRExUZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50cy5JTm9kZVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHMuTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CaW5kaW5nR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmUuV1NETENvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuT3Blbk9uU2VsZWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFRleHRFZGl0b3IgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBpbXBsZW1lbnRzIElOb2RlU2VsZWN0aW9uTGlzdGVuZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yCi17Ci0gIHByb3RlY3RlZCBXU0RMRWRpdG9yIHdzZGxFZGl0b3I7Ci0gIHByb3RlY3RlZCBXU0RMQ29udGVudE91dGxpbmVQYWdlIG91dGxpbmVQYWdlOwotICBwcm90ZWN0ZWQgV1NETFNlbGVjdGlvbk1hbmFnZXIgd3NkbFNlbGVjdGlvbk1hbmFnZXI7Ci0gIHByb3RlY3RlZCBJbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgPSBuZXcgSW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcigpOwotCi0gIHB1YmxpYyBXU0RMVGV4dEVkaXRvcihXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsKLSAgICB0aGlzLndzZGxFZGl0b3IgPSB3c2RsRWRpdG9yOwotICAgIHdzZGxTZWxlY3Rpb25NYW5hZ2VyID0gd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCk7Ci0gICAgd3NkbFNlbGVjdGlvbk1hbmFnZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGFyZzApCi0gIHsKLSAgICBzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChhcmcwKTsKLSAgICBhZGRPcGVuT25TZWxlY3Rpb25MaXN0ZW5lcigpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkT3Blbk9uU2VsZWN0aW9uTGlzdGVuZXIoKQotICB7Ci0gICAgS2V5QWRhcHRlciBrZXlBZGFwdGVyID0gbmV3IEtleUFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGFyZzApCi0gICAgICB7Ci0gICAgICAgIGlmIChhcmcwLmtleUNvZGUgPT0gU1dULkYzKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBsaXN0ID0gZ2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcigpLmdldFNlbGVjdGVkTm9kZXMoKTsKLSAgICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBsaXN0LmdldCgwKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPcGVuT25TZWxlY3Rpb25IZWxwZXIgaGVscGVyID0gbmV3IE9wZW5PblNlbGVjdGlvbkhlbHBlcih3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSk7ICAgCi0gICAgICAgICAgICAgIGhlbHBlci5vcGVuRWRpdG9yKChOb2RlKW9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgICBnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLmFkZEtleUxpc3RlbmVyKGtleUFkYXB0ZXIpOwotICB9Ci0KLSAgIAotICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgcmVxdWlyZWQpCi0gIHsKLQkJaWYgKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkKLQkJewotCQkgIHJldHVybiBnZXRDb250ZW50T3V0bGluZVBhZ2UoKTsKLQkJfSAgICAKLQkJaWYgKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKQotCQl7Ci0JCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlID09IG51bGwgfHwgZlByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKSA9PSBudWxsIHx8IGZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJewotLy8JCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlIFdTREwgUHJvcGVydHkgU2hlZXQiKTsKLS8vICAgICAgICBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjZmcgPSBjcmVhdGVQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpOwotLy8gICAgICAgIGlmIChjZmcgIT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlmIChjZmcgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24pCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICgoU3RydWN0dXJlZFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKSBjZmcpLnNldEVkaXRvcih0aGlzKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSgpOwotLy8gICAgICAgICAgICBwcm9wZXJ0eVNoZWV0UGFnZS5zZXRDb25maWd1cmF0aW9uKGNmZyk7Ci0vLyAgICAgICAgICAgIHByb3BlcnR5U2hlZXRQYWdlLnNldE1vZGVsKGdldE1vZGVsKCkpOwotLy8gICAgICAgICAgICBmUHJvcGVydHlTaGVldFBhZ2UgPSBwcm9wZXJ0eVNoZWV0UGFnZTsKLS8vICAgICAgICB9Ci0KLS8vICAJICAgIGZQcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBXU0RMUHJvcGVydHlTaGVldFBhZ2UoZ2V0TW9kZWwoKSwgZ2V0RWRpdG9yUGFydCgpKTsKLS8vICAJICAgICgoV1NETFByb3BlcnR5U2hlZXRQYWdlKSBmUHJvcGVydHlTaGVldFBhZ2UpLnNldFNlbGVjdGlvbk1hbmFnZXIoZ2V0V1NETEVkaXRvcigpLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7IC8vZ2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcigpKTsKLS8vLy8JICAJICAoKFdTRExQcm9wZXJ0eVNoZWV0UGFnZSkgZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKChXU0RMUHJvcGVydHlTaGVldFBhZ2UpIGZQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0vLyAgCSAgICAoKFdTRExQcm9wZXJ0eVNoZWV0UGFnZSlmUHJvcGVydHlTaGVldFBhZ2UpLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEV4dGVuc2libGVQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKGdldFdTRExFZGl0b3IoKSkpOwotLy8vLyAgCSAgICBnZXRXU0RMRWRpdG9yKCkuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigoV1NETFByb3BlcnR5U2hlZXRQYWdlKWZQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0KLSAgCSAgICBmUHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKHRoaXMsIGdldFdTRExFZGl0b3IoKSk7Ci0gIAkgICAgKChXU0RMVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpZlByb3BlcnR5U2hlZXRQYWdlKS5zZXRTZWxlY3Rpb25NYW5hZ2VyKGdldFdTRExFZGl0b3IoKS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotCi0JCQl9Ci0JCQlyZXR1cm4gZlByb3BlcnR5U2hlZXRQYWdlOwotCQl9Ci0JCi0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcm9wZXJ0eUNhdGVnb3JpZXMoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJnZW5lcmFsIiwgIm5hbWVzcGFjZSIsICJvdGhlciIsICJhdHRyaWJ1dGVzIiwgImRvY3VtZW50YXRpb24iLCAiZmFjZXRzIiB9OwotICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciNnZXRDb250cmlidXRvcklkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKQotCXsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExUZXh0RWRpdG9yIjsKLQkvLwkgcmV0dXJuIGdldFNpdGUoKS5nZXRJZCgpOwotICB9Ci0gIAotICAvKgotICAgKiBAc2VlIFN0cnVjdHVyZWRUZXh0RWRpdG9yI2dldENvbnRlbnRPdXRsaW5lUGFnZSgpCi0gICAqLwotICBwdWJsaWMgSUNvbnRlbnRPdXRsaW5lUGFnZSBnZXRDb250ZW50T3V0bGluZVBhZ2UoKQotICB7Ci0gICAgaWYgKChvdXRsaW5lUGFnZSA9PSBudWxsKSB8fCBvdXRsaW5lUGFnZS5nZXRDb250cm9sKCkgPT0gbnVsbCB8fCAob3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkpCi0gICAgewotICAgICAgb3V0bGluZVBhZ2UgPSBuZXcgV1NETENvbnRlbnRPdXRsaW5lUGFnZSh3c2RsRWRpdG9yKTsKLSAgICAgIG91dGxpbmVQYWdlLnNldENvbnRlbnRQcm92aWRlcih3c2RsRWRpdG9yLmdldEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIoKSk7Ci0gICAgICBvdXRsaW5lUGFnZS5zZXRMYWJlbFByb3ZpZGVyKHdzZGxFZGl0b3IuZ2V0RXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlcigpKTsKLSAgICAgIG91dGxpbmVQYWdlLnNldE1vZGVsKHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsgLy9YTUxEb2N1bWVudCgpKTsKLQotICAgICAgZ2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcigpLmFkZE5vZGVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAgIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGdldFZpZXdlclNlbGVjdGlvbk1hbmFnZXIoKSk7Ci0gICAgICBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyLnNldEV2ZW50U291cmNlKG91dGxpbmVQYWdlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG91dGxpbmVQYWdlOwotICB9Ci0KLSAgcHVibGljIFdTRExFZGl0b3IgZ2V0V1NETEVkaXRvcigpCi0gIHsKLSAgICByZXR1cm4gKFdTRExFZGl0b3IpZ2V0RWRpdG9yUGFydCgpOwotICB9Ci0KLSAgLy8gdXNlZCB0byBtYXAgc2VsZWN0aW9ucyBmcm9tIHRoZSBvdXRsaW5lIHZpZXcgdG8gdGhlIHNvdXJjZSB2aWV3Ci0gIC8vIHRoaXMgY2xhc3MgdGhpbmtzIG9mIHNlbGVjdGlvbnMgaW4gdGVybXMgb2YgRE9NIGVsZW1lbnQKLSAgY2xhc3MgSW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IG51bGw7Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgewotICAgICAgICBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KG9iamVjdCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHRoZSB0ZXh0IGVkaXRvciBjYW4gb25seSBhY2NlcHQgc2VkIG5vZGVzIQotICAgICAgLy8KLSAgICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkpCi0gICAgICB7Ci0gICAgICAgIG5vZGUgPSBudWxsOwotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBoZXJlIHdlIGNvbnZlcnQgdGhlIG1vZGVsIHNlbGVjdGlvbiB0byBhIG5vZGUgc2VsZWN0aW9uIHJlcSdkIGZvciB0aGUgc291cmNlIHZpZXcKLSAgICAvLwotICAgIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5vZGVTZWxlY3Rpb25DaGFuZ2VkKE5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICAvLyBoZXJlIHdlIGNvbnZlcnQgYW4gbm9kZSBzZWxlY2l0b24gdG8gYSBtb2RlbCBzZWxlY3Rpb24gYXMgcmVxJ2QgYnkgdGhlIG90aGVyIHZpZXdzCi0gICAgLy8KLSAgICBpZiAoIWV2ZW50LmdldFNvdXJjZSgpLmVxdWFscyhpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICAgICAgTGlzdCBsaXN0ID0gZXZlbnQuZ2V0U2VsZWN0ZWROb2RlcygpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWkubmV4dCgpOwotICAgICAgICBpZiAobm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0JICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCSAgICAgICAgewotCSAgICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLQkgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICB9Ci0JICAgICAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgZWxlbWVudCA9ICgoQXR0cilub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkgICAgICAgICAgYnJlYWs7Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgT2JqZWN0IG8gPSBlbGVtZW50OwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpLCBlbGVtZW50KTsKLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvID0gbW9kZWxPYmplY3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3NkbFNlbGVjdGlvbk1hbmFnZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG8pLCBpbnRlcm5hbFNlbGVjdGlvblByb3ZpZGVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgd3NkbFNlbGVjdGlvbk1hbmFnZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCksIGludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgICBzdXBlci51cGRhdGUoKTsKLSAgICBpZiAob3V0bGluZVBhZ2UgIT0gbnVsbCkKLSAgICAgIG91dGxpbmVQYWdlLnNldE1vZGVsKGdldE1vZGVsKCkpOwotICB9Ci0gIAotICAvKgotICAgKiBXZSBvdmVycmlkZSB0aGlzIG1ldGhvZCBzbyB3ZSBjYW4gaG9vayBpbiBvdXIgYXV0b21hdGljIEJpbmRpbmcgZ2VuZXJhdGlvbi4KLSAgICogV2Ugd2lsbCBnZW5lcmF0ZSB0aGUgQmluZGluZyBhZnRlciBhIHNhdmUgaXMgZXhlY3V0ZWQgKElmIHRoaXMgcHJlZmVyZW5jZQotICAgKiBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICB0cnl7Ci0JICBpZiAoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfQVVUT19SRUdFTkVSQVRFX0JJTkRJTkciKSkpIHsKLQkJICBJdGVyYXRvciBiaW5kaW5nc0l0ID0gd3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkuZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsKLQkJICB3aGlsZSAoYmluZGluZ3NJdC5oYXNOZXh0KCkpIHsKLQkJCSAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdzSXQubmV4dCgpOwotCQkJICBCaW5kaW5nR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBCaW5kaW5nR2VuZXJhdG9yKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBiaW5kaW5nKTsKLQkJCSAgZ2VuZXJhdG9yLmdlbmVyYXRlQmluZGluZygpOwotCQkgIH0KLQotCQkgIC8vIExpdHRsZSBoYWNrIHRvICdyZWRyYXcnIGNvbm5lY3RpbmcgbGluZXMgaW4gdGhlIGdyYXBoIHZpZXdlcgotCQkgIFN0cmluZyBsb2NhbFBhcnQgPSB3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkgIFN0cmluZyBuYW1lc3BhY2UgPSB3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCQkgIHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpLnNldFFOYW1lKG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsUGFydCkpOwotCSAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotCSAgc3VwZXIuZG9TYXZlKG1vbml0b3IpOwotICB9Ci0KLSAgcHVibGljIEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIgZ2V0SW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQlyZXR1cm4gaW50ZXJuYWxTZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFRU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFRU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJiNWQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7IAotICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMU3dpdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5NZW51QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuWE1MQ29tbW9uUmVzb3VyY2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLyoqCi0gKiBUT0RPLi4uIHRoZXJlIGFyZSBsaWtlbHkgc2V2ZXJhbCBwbGFjZXMgd2hlcmUgd2UgY2FuIHJlZmFjdG9yIGNvZGUgZnJvbSAgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlcgotICovCi1wdWJsaWMgY2xhc3MgQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJTWVudUFjdGlvbkNvbnRyaWJ1dG9yCi17ICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgTWVudUJ1aWxkZXIgbWVudUJ1aWxkZXIgPSBuZXcgTWVudUJ1aWxkZXIoKTsKLQotICBwdWJsaWMgdm9pZCBjb250cmlidXRlTWVudUFjdGlvbnMoZmluYWwgSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSwgT2JqZWN0IG9iamVjdCkKLSAgewotICAgIGJvb2xlYW4gaXNTdWJtZW51UmVxdWlyZWQgPSBmYWxzZTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsgICAgIAotICAgICAgV1NETFN3aXRjaCB3c2RsU3dpdGNoID0gbmV3IFdTRExTd2l0Y2goKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0JICAgICAgfQotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCSAgICAgIH0gCi0gCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgICAgIHsgICAgICAKLSAgICAgICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotCSAgICAgIH0gICAgICAgICAgIAotICAgICAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgcG9ydCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgICAgfSAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgIAl7Ci0gICAgICAJCWlmIChnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEFjdGlvbnModW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnQoKSkuc2l6ZSgpID4gMCkKLSAgICAgIAkJeyAgICAgIAkJCi0gICAgICAJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgICAgCQl9Ci0gICAgICAJCWVsc2UKLSAgICAgIAkJewotICAgICAgCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgICAJCX0KLSAgICAgIAl9Ci0gICAgICB9OyAgICAgICAgCi0gICAgICBpc1N1Ym1lbnVSZXF1aXJlZCA9IHdzZGxTd2l0Y2guZG9Td2l0Y2goKFdTRExFbGVtZW50KW9iamVjdCkgIT0gbnVsbDsKLSAgICAgIGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qob2JqZWN0KTsgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIFdTRExHcm91cE9iamVjdCBncm91cE9iamVjdCA9IChXU0RMR3JvdXBPYmplY3Qpb2JqZWN0OwotICAgICAKLSAgICAgIHN3aXRjaCAoZ3JvdXBPYmplY3QuZ2V0VHlwZSgpKQotICAgICAgeyAgIAotICAgICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5FWFRFTlNJQklMSVRZX0VMRU1FTlRTX0dST1VQIDogCi0gICAgICAgIHsKLSAgICAgICAgICBpc1N1Ym1lbnVSZXF1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChncm91cE9iamVjdC5nZXREZWZpbml0aW9uKCkpOyAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAgIAotICAgIH0KLQotICAgIGlmIChpc1N1Ym1lbnVSZXF1aXJlZCkKLSAgICB7Ci0gICAgICBNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FERF9FWFRFTlNJQklMSVRZX0VMRU1FTlQiKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAvLyBoZXJlIEknbSBhdHRlbXB0aW5nIHRvIGFkZCB0aGUgbWVudSBpdGVtIGluIGEgJ2dvb2QnIHBsYWNlIGluIHRoZSBleGlzaXRpbmcgbWVudQotICAgICAgLy8gdG9kbyBhZGQgbWVudSBncm91cHMgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIHRoaXMgdGVzdAotICAgICAgLy8KLS8vICAgICAgaWYgKG1lbnUuZmluZCgiYWRkY2hpbGQiKSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgIAltZW51Lmluc2VydEFmdGVyKCJhZGRjaGlsZCIsIHN1Ym1lbnUpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UKLS8vICAgICAgewotLy8gICAgICAJbWVudS5hZGQoc3VibWVudSk7Ci0vLyAgICAgIH0JIAotICAgIAltZW51LmFkZChzdWJtZW51KTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgICAgewotICAgICAgICBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudEFjdGlvbnMoc3VibWVudSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgIAotICAgIE1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAKLSAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRBY3Rpb25IZWxwZXIobWVudSwgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBY3Rpb25zKGVsZW1lbnQpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50QWN0aW9ucyhFbGVtZW50IGVsZW1lbnQpIHsKLSAgICBMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vIGFkZCBpbnNlcnQgY2hpbGQgbm9kZSBhY3Rpb25zCi0gICAgICAvLwotICAgICAgaW50IGljID0gTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTOwotICAgICAgaW50IHZjID0gTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1Q7Ci0KLSAgICAgIG1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhlbGVtZW50LCBlZCwgLTEsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFjdGlvbkxpc3Q7Ci0gIH0KLSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQWN0aW9uSGVscGVyKElNZW51TWFuYWdlciBtZW51LCBMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGFjdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtb2RlbFF1ZXJ5QWN0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24paS5uZXh0KCk7Ci0gICAgICBDTU5vZGUgY21ub2RlID0gYWN0aW9uLmdldENNTm9kZSgpOwotICAgICAgaWYgKGNtbm9kZSAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBib29sZWFuIGlzT3RoZXJOYW1lc3BhY2UgPSBmYWxzZTsKLSAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpY21ub2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7Ci0gICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpICAgICAgICAgIAotICAgICAgICB7ICAgICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgCi0gICAgICAgICAgaXNPdGhlck5hbWVzcGFjZSA9IG5hbWVzcGFjZVVSSSAhPSBudWxsICYmICFuYW1lc3BhY2VVUkkuZXF1YWxzKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc090aGVyTmFtZXNwYWNlKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGNtTm9kZVR5cGUgPSBjbW5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgICAgICBpZiAoYWN0aW9uLmdldEtpbmQoKSA9PSBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCkKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgc3dpdGNoIChjbU5vZGVUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOgotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWN0aW9uTGlzdC5hZGQobmV3IEFkZE5vZGVBY3Rpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKWNtbm9kZSwgYWN0aW9uLmdldFBhcmVudCgpLCBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfSAgIAotICAgIH0gIAotICAgIG1lbnVCdWlsZGVyLnBvcHVsYXRlTWVudShtZW51LCBhY3Rpb25MaXN0LCBmYWxzZSk7Ci0gIH0gICAKLQotICAvKioKLSAgICogQWRkTm9kZUFjdGlvbgotICAgKi8KLSAgcHVibGljIGNsYXNzIEFkZE5vZGVBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbgotICB7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHVuZG9EZXNjcmlwdGlvbjsgCi0gICAgcHJvdGVjdGVkIENNTm9kZSBjbW5vZGU7Ci0gICAgcHJvdGVjdGVkIGludCBpbmRleDsKLSAgICBwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0KLQotICAgIHB1YmxpYyBBZGROb2RlQWN0aW9uKENNTm9kZSBjbW5vZGUsIE5vZGUgcGFyZW50LCAgaW50IGluZGV4KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMuY21ub2RlID0gY21ub2RlOwotICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHRleHQgPSBnZXRMYWJlbChwYXJlbnQsIGNtbm9kZSk7Ci0gICAgICBzZXRUZXh0KHRleHQpOyAgICAgCi0gICAgICBkZXNjcmlwdGlvbiA9IHRleHQ7Ci0gICAgICB1bmRvRGVzY3JpcHRpb24gPSBYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9NRU5VX0FERCIpICsgIiAiICsgdGV4dDsKLSAgICAgIC8vc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpKTsgCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYWJlbChOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gIj8iICsgY21ub2RlICsgIj8iOwotICAgICAgaWYgKGNtbm9kZSAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGNtbm9kZSwgcGFyZW50LCBudWxsKTsgICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7ICAgCi0gICAgfSAgCi0KLSAgICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gdW5kb0Rlc2NyaXB0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgYmVnaW5SZWNvcmRpbmcoKTsKLQotICAgICAgaWYgKGNtbm9kZSAhPSBudWxsICYmIHBhcmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudClwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOyAgICAgICAgCi0KLSAgICAgICAgRE9NQ29udGVudEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBET01Db250ZW50QnVpbGRlckltcGwoZG9jdW1lbnQpOyAKLSAgICAgICAgYnVpbGRlci5zZXRQcm9wZXJ0eShET01Db250ZW50QnVpbGRlci5QUk9QRVJUWV9CVUlMRF9CTEFOS19URVhUX05PREVTLCBCb29sZWFuLlRSVUUpOwotICAgICAgICBidWlsZGVyLnNldEJ1aWxkUG9saWN5KERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCk7Ci0gICAgICAgIGJ1aWxkZXIuYnVpbGQocGFyZW50LCBjbW5vZGUpOwotICAgICAgICBpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBidWlsZGVyLmdldFJlc3VsdCgpLCBpbmRleCwgdHJ1ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGVuZFJlY29yZGluZygpOwotICAgIH0gCi0KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnROb2Rlc0F0SW5kZXgoTm9kZSBwYXJlbnQsIExpc3QgbGlzdCwgaW50IGluZGV4LCBib29sZWFuIGZvcm1hdCkKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgewotICAgICAgICBpbmRleCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgICAgfQotICAgICAgTm9kZSByZWZDaGlsZCA9IChpbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpKSA/IG5vZGVMaXN0Lml0ZW0oaW5kZXgpIDogbnVsbDsKLSAgICAKLSAgICAgIC8vIGhlcmUgd2UgY29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgdGhlIHByZXZpb3VzIG5vZGUgaXMgYSAnd2hpdGUgc3BhY2UnIFRleHQgbm9kZQotICAgICAgLy8gd2Ugc2hvdWxkIHJlYWxseSBkbyB0aGUgaW5zZXJ0IGJlZm9yZSB0aGlzIG5vZGUKLSAgICAgIC8vCi0gICAgICBpbnQgcHJldkluZGV4ID0gaW5kZXggLSAxOwotICAgICAgTm9kZSBwcmV2Q2hpbGQgPSAocHJldkluZGV4IDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpID8gbm9kZUxpc3QuaXRlbShwcmV2SW5kZXgpIDogbnVsbDsKLQkgICAgaWYgKGlzV2hpdGVzcGFjZVRleHROb2RlKHByZXZDaGlsZCkpIAotICAgICAgewotCSAgCSAgcmVmQ2hpbGQgPSBwcmV2Q2hpbGQ7Ci0JICAgIH0KLSAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTm9kZSBuZXdOb2RlID0gKE5vZGUpaS5uZXh0KCk7Ci0gICAgCi0gICAgICAgIGlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KXBhcmVudDsKLSAgICAgICAgICBwYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoKEF0dHIpbmV3Tm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZDaGlsZCk7Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOb2RlIG5ld05vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgICAgaWYgKGZvcm1hdCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJICAgICAgRm9ybWF0UHJvY2Vzc29yWE1MIGZvcm1hdFByb2Nlc3NvclhNTCA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLQkJICAgICAgZm9ybWF0UHJvY2Vzc29yWE1MLmZvcm1hdE5vZGUoKElET01Ob2RlKW5ld05vZGUpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgCi0JICAgIC8vc2V0Vmlld2VyU2VsZWN0aW9uKGxpc3QpOwotICAgIH0gICAKLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzV2hpdGVzcGFjZVRleHROb2RlKE5vZGUgbm9kZSkgCi0gICAgewotCSAgICByZXR1cm4gKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApOwotICAgIH0gCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhMWY2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEFkZEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIE5vZGUgcGFyZW50Tm9kZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5vZGVOYW1lOwotCXByb3RlY3RlZCBFbGVtZW50IG5ld0VsZW1lbnQ7Ci0JcHJvdGVjdGVkIE5vZGUgcmVsYXRpdmVOb2RlID0gbnVsbDsKLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQlwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb21wdXRlVG9wTGV2ZWxSZWZDaGlsZDsKLQotCXByb3RlY3RlZCBib29sZWFuIHNlbGVjdE5ld2x5Q3JlYXRlZE9iamVjdCA9IHRydWU7IC8vIFdlIHNob3VsZCBub3QgYmUKLQkJCQkJCQkJCQkJCQkJLy8gc2VsZWN0aW5nIHRoZQotCQkJCQkJCQkJCQkJCQkvLyBvYmplY3QgaW4gdGhlCi0JCQkJCQkJCQkJCQkJCS8vIGFjdGlvbi4uLi4uIFRPRE8KLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0LCBTdHJpbmcgaW1hZ2VEZXNjcmlwdG9yS2V5LCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBub2RlTmFtZSkgewotCQlzZXRUZXh0KHRleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoV1NETEVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yS2V5KSk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMubm9kZU5hbWUgPSBub2RlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgQWRkRWxlbWVudEFjdGlvbihTdHJpbmcgdGV4dCwgU3RyaW5nIGltYWdlRGVzY3JpcHRvcktleSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCXNldFRleHQodGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihXU0RMRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3JLZXkpKTsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMubm9kZU5hbWUgPSBsb2NhbE5hbWU7Ci0JfQotCi0JcHVibGljIEFkZEVsZW1lbnRBY3Rpb24oU3RyaW5nIHRleHQsIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkgewotCQlzZXRUZXh0KHRleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IobnVsbCk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl0aGlzLm5vZGVOYW1lID0gbG9jYWxOYW1lOwotCX0KLQotCXB1YmxpYyBBZGRFbGVtZW50QWN0aW9uKE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSwgTm9kZSByZWxhdGl2ZU5vZGUpIHsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMubm9kZU5hbWUgPSBsb2NhbE5hbWU7Ci0JCXRoaXMucmVsYXRpdmVOb2RlID0gcmVsYXRpdmVOb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKGJvb2xlYW4gaXNFbmFibGVkKSB7Ci0JCWNvbXB1dGVUb3BMZXZlbFJlZkNoaWxkID0gaXNFbmFibGVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotCQl0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2coKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJYm9vbGVhbiBvayA9IHNob3dEaWFsb2coKTsKLQkJaWYgKG9rKSB7Ci0JCQliZWdpblJlY29yZGluZygpOwotCQkJcGVyZm9ybUFkZEVsZW1lbnQoKTsKLQkJCWVuZFJlY29yZGluZygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7Ci0JCWlmIChwYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCW5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KG5vZGVOYW1lKTsKLQkJCWFkZEF0dHJpYnV0ZXMobmV3RWxlbWVudCk7Ci0JCQlpZiAocmVsYXRpdmVOb2RlID09IG51bGwgJiYgY29tcHV0ZVRvcExldmVsUmVmQ2hpbGQpIHsKLQkJCQlyZWxhdGl2ZU5vZGUgPSBjb21wdXRlVG9wTGV2ZWxSZWZDaGlsZChuZXdFbGVtZW50KTsKLQkJCX0KLQotCQkJaWYgKHJlbGF0aXZlTm9kZSA9PSBudWxsKSB7Ci0JCQkJcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0VsZW1lbnQsIHJlbGF0aXZlTm9kZSk7Ci0JCQl9Ci0JCQkvLyBmb3JtYXQocGFyZW50Tm9kZSk7Ci0JCQlmb3JtYXQobmV3RWxlbWVudCk7Ci0JCQkvLyBVZ2x5Li4uLi4gV2Ugc2hvdWxkIG5vdCBiZSBzZWxlY3RpbmcgdGhlIG9iamVjdCBpbiB0aGUgZ3JhcGgKLQkJCS8vIHZpZXcgaW4gdGhlIEFjdGlvbi4KLQkJCS8vIFRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgb3V0LiBXZSBhZGQgdGhpcyBib29sZWFuIGNoZWNrCi0JCQkvLyBiZWNhdXNlIFdTRExTZXRUeXBlRGlhbG9nLmphdmEKLQkJCS8vIHVzZXMgQWRkSW1wb3J0QWN0aW9uLmphdmEgYnV0IHdlIHNob3VsZCBub3QgYmUgc2VsZWN0aW5nIHRoZQotCQkJLy8gbmV3bHkgY3JlYXRlZCBpbXBvcnQuLi4uCi0JCQlpZiAoc2VsZWN0TmV3bHlDcmVhdGVkT2JqZWN0KSB7Ci0JCQkJc2VsZWN0T2JqZWN0Rm9yTmV3RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gVWdseS4uLi4uIFdlIHNob3VsZCBub3QgYmUgc2VsZWN0aW5nIHRoZSBvYmplY3QgaW4gdGhlIGdyYXBoIHZpZXcgaW4KLQkvLyB0aGUgQWN0aW9uLgotCS8vIFRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgb3V0LiBXZSBhZGQgdGhpcyBib29sZWFuIGNoZWNrIGJlY2F1c2UKLQkvLyBXU0RMU2V0VHlwZURpYWxvZy5qYXZhCi0JLy8gdXNlcyBBZGRJbXBvcnRBY3Rpb24uamF2YSBidXQgd2Ugc2hvdWxkIG5vdCBiZSBzZWxlY3RpbmcgdGhlIG5ld2x5Ci0JLy8gY3JlYXRlZCBpbXBvcnQuLi4uCi0JLy8gV2Ugc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGNhbGxpbmcgcnVuKCkKLQlwdWJsaWMgdm9pZCBzZWxlY3RPYmplY3RGb3JOZXdFbGVtZW50KGJvb2xlYW4gc2VsZWN0KSB7Ci0JCXNlbGVjdE5ld2x5Q3JlYXRlZE9iamVjdCA9IHNlbGVjdDsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50Tm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBkb2N1bWVudDsKLQkJfQotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREIik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBub2RlTmFtZSkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudE5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JCUVsZW1lbnQgZWxlbWVudCA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocHJlZml4ICsgIjoiICsgbm9kZU5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUKLQkJCUZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCQlmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpIHBhcmVudE5vZGUpOwotCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBnZXREZWZpbml0aW9uRWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKLQkJRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IG51bGw7Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmIChXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGVsZW1lbnQpID09IFdTRExDb25zdGFudHMuREVGSU5JVElPTikgewotCQkJCQlkZWZpbml0aW9uRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmaW5pdGlvbkVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0TmV3RWxlbWVudCgpIHsKLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3RPYmplY3RGb3JOZXdFbGVtZW50KCkgewotCQlpZiAoZWRpdG9yUGFydCA9PSBudWxsKSB7Ci0JCQllZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJfQotCQlpZiAoZWRpdG9yUGFydCAhPSBudWxsICYmIGRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iamVjdCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChkZWZpbml0aW9uLCBuZXdFbGVtZW50KTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGVkaXRvclBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3RPYmplY3QoV1NETEVsZW1lbnQgb2JqZWN0KSB7Ci0JCWlmIChlZGl0b3JQYXJ0ID09IG51bGwpIHsKLQkJCWVkaXRvclBhcnQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQl9Ci0JCWlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBzaG93RGlhbG9nSGVscGVyKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lLCBMaXN0IHVzZWROYW1lcykgewotCQlTdHJpbmcgcmVzdWx0ID0gZGVmYXVsdE5hbWU7Ci0JCU5ld0NvbXBvbmVudERpYWxvZyBkaWFsb2cgPSBuZXcgTmV3Q29tcG9uZW50RGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgdGl0bGUsIGRlZmF1bHROYW1lLCB1c2VkTmFtZXMpOwotCQlpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotCQlpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJcmVzdWx0ID0gZGlhbG9nLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBjb21wdXRlVG9wTGV2ZWxSZWZDaGlsZChOb2RlIG5vZGVUb0FkZCkgewotCQlOb2RlIHJlc3VsdCA9IG51bGw7Ci0JCWludCBhID0gZ2V0UHJlY2VkZW5jZShub2RlVG9BZGQpOwotCi0JCWZvciAoTm9kZSBub2RlID0gcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWludCBiID0gZ2V0UHJlY2VkZW5jZShub2RlKTsKLQkJCQlpZiAoYiA+IGEpIHsKLQkJCQkJcmVzdWx0ID0gbm9kZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmaW5pdGlvblN0dWIoKSB7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkvLyBDcmVhdGUgdGhlIERlZmluaXRpb25zIGVsZW1lbnQgd2l0aCBwcm9wZXIgbmFtZXNwYWNlCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0JCQkJY2hhclNldCA9ICJVVEYtOCI7Ci0JCQl9Ci0JCQlkb2N1bWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oInhtbCIsICJ2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiICsgY2hhclNldCArICJcIiIpKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIndzZGw6ZGVmaW5pdGlvbnMiKTsKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKHJvb3QpOwotCi0JCQkvLyBBZGQgdmFyaW91cyBuYW1lc3BhY2UgYXR0cmlidXRlcyBoZXJlLgotCQkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnNvYXAiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIpOwotCQkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnRucyIsIGdldERlZmF1bHROYW1lc3BhY2UoKSk7Ci0JCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6d3NkbCIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIpOwotCQkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotCQkJcm9vdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBnZXRGaWxlTmFtZSgpKTsKLQkJCXJvb3Quc2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCBnZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCi0JCQlkZWZpbml0aW9uLnNldEVsZW1lbnQocm9vdCk7Ci0JCQlwYXJlbnROb2RlID0gcm9vdDsKLQkJCXByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoKSB7Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1BSRUZfUEFHRV9ERUZBVUxUX1RBUkdFVF9OQU1FU1BBQ0UiKSk7Ci0JCWlmICghbmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpIHsKLQkJCW5hbWVzcGFjZSA9IG5hbWVzcGFjZS5jb25jYXQoIi8iKTsKLQkJfQotCi0JCW5hbWVzcGFjZSArPSBnZXRGaWxlTmFtZSgpICsgIi8iOwotCi0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCVN0cmluZyBmaWxlTG9jYXRpb24gPSBkZWZpbml0aW9uLmdldExvY2F0aW9uKCk7Ci0JCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZUxvY2F0aW9uKTsKLQkJcmV0dXJuIGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIHByZWNlZGVuY2VNYXAgPSBjcmVhdGVQcmVjZWRlbmNlTWFwKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRQcmVjZWRlbmNlKE5vZGUgbm9kZSkgewotCQlpbnQgcmVzdWx0ID0gMjsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IG5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0JCWlmIChsb2NhbE5hbWUgIT0gbnVsbCkgewotCQkJSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIHByZWNlZGVuY2VNYXAuZ2V0KGxvY2FsTmFtZSk7Ci0JCQlpZiAoaW50ZWdlciAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gaW50ZWdlci5pbnRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBIYXNoTWFwIGNyZWF0ZVByZWNlZGVuY2VNYXAoKSB7Ci0JCUhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoMSkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoMykpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlRZUEVTX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig0KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuTUVTU0FHRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNSkpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNikpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLkJJTkRJTkdfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDcpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5TRVJWSUNFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig4KSk7Ci0JCXJldHVybiBoYXNoTWFwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkZWUyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWRkRWxlbWVudERlY2xhcmF0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0JcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeDsKLQkKLQlwdWJsaWMgQWRkRWxlbWVudERlY2xhcmF0aW9uQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHN1Z2dlc3RlZFByZWZpeCkKLQl7Ci0JCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLnByZWZpeCA9IHN1Z2dlc3RlZFByZWZpeDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCVN0cmluZyBleGlzdGluZ1ByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KG5hbWVzcGFjZSk7Ci0JCWlmIChleGlzdGluZ1ByZWZpeCAhPSBudWxsKQotCQl7Ci0JCQlwcmVmaXggPSBleGlzdGluZ1ByZWZpeDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByZWZpeCA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlUHJlZml4KGRlZmluaXRpb24sIHByZWZpeCk7Ci0JCQlFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotCQkJaWYgKGRlZmluaXRpb25FbGVtZW50ICE9IG51bGwpCi0JCQl7Ci0JCQkJZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgcHJlZml4LCBuYW1lc3BhY2UpOwotCQkJfQkJCQotCQl9CQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQotCXsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEltcG9ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRJbXBvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4NTM1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEltcG9ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQWRkSW1wb3J0QWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXg7Ci0KLSAgcHVibGljIEFkZEltcG9ydEFjdGlvbihJRWRpdG9yUGFydCBwYXJ0LCBEZWZpbml0aW9uIGRlZmluaXRpb24sIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCkKLSAgewotCXRoaXMocGFydCwgZGVmaW5pdGlvbiwgcGFyZW50Tm9kZSwgcHJlZml4LCBudWxsLCBudWxsKTsKLSAgfQotICAKLSAgcHVibGljIEFkZEltcG9ydEFjdGlvbihJRWRpdG9yUGFydCBwYXJ0LCBEZWZpbml0aW9uIGRlZmluaXRpb24sIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTVBPUlQiKSwgImljb25zL2ltcG9ydF9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAiaW1wb3J0Iik7Ci0JICBzZXREZWZpbml0aW9uKGRlZmluaXRpb24pOwotCSAgc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0JICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkgIHNldEVkaXRvclBhcnQocGFydCk7Ci0JICAKLQkgIGlmIChwYXJ0IGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotCSAgCWRvY3VtZW50ID0gKChXU0RMRWRpdG9yKSBwYXJ0KS5nZXRYTUxEb2N1bWVudCgpOwotCSAgfQotICB9Ci0gICAgICAgIAotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyBub2RlTmFtZSkKLSAgewotICAJaWYgKGVsZW1lbnREZWNsYXJhdGlvbk5hbWVzcGFjZVByZWZpeCAhPSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsKQotICAJeyAKLSAgICAJRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICAJaWYgKGRlZmluaXRpb25FbGVtZW50ICE9IG51bGwpCi0gICAgCXsgICAgCi0JICAJICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBlbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZSk7Ci0gICAgCX0gICAgICAJCi0gIAl9Ci0gIAlyZXR1cm4gc3VwZXIuY3JlYXRlRWxlbWVudChub2RlTmFtZSk7ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4KFN0cmluZyBuc1ByZWZpeCkKLSAgewotICAJdGhpcy5lbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXggPSBuc1ByZWZpeDsKLSAgfQotICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlICE9IG51bGwgPyBuYW1lc3BhY2UgOiAiIik7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoImxvY2F0aW9uIiwgbG9jYXRpb24gIT0gbnVsbCA/IGxvY2F0aW9uIDogIiIpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgcHVibGljIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7Ci0gIAlpZiAocGFyZW50Tm9kZSA9PSBudWxsIHx8IChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA9PSAwKSkgewotICAJCWNyZWF0ZURlZmluaXRpb25TdHViKCk7Ci0gIAl9Ci0gIAkKLSAgCXN1cGVyLnBlcmZvcm1BZGRFbGVtZW50KCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZE1lc3NhZ2VVSUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRNZXNzYWdlVUlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjYzJjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZE1lc3NhZ2VVSUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZE1lc3NhZ2VDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0cy5OZXdDb21wb25lbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZE1lc3NhZ2VVSUFjdGlvbiBleHRlbmRzIFdTRExFbGVtZW50VUlBY3Rpb24KLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gIHByaXZhdGUgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgCi0gIHB1YmxpYyBBZGRNZXNzYWdlVUlBY3Rpb24KLSAgCShEZWZpbml0aW9uIGRlZmluaXRpb24sIAotICAgICBTdHJpbmcgbmFtZSwgCi0gICAgIGJvb2xlYW4gY3JlYXRlUGFydCkKLSAgewotICAgIHN1cGVyCi0gICAgCShuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbixuYW1lLGNyZWF0ZVBhcnQpLCAKLSAgICAJIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BREQiKSwgCi0gICAgCSBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfRUxFTUVOVF9UQUcsIAotICAgIAkgV1NETEVkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL21lc3NhZ2Vfb2JqLmdpZiIpKTsKLSAgICAKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLQkgIG5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGRlZmluaXRpb24sIG5hbWUpOwotCSAgbmFtZSA9IHNob3dEaWFsb2dIZWxwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX05FV19NRVNTQUdFIiksIG5hbWUpOwotCSAgcmV0dXJuIG5hbWUgIT0gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBzaG93RGlhbG9nSGVscGVyKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lKQotICB7ICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IGRlZmF1bHROYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE5ld0NvbXBvbmVudERpYWxvZyBkaWFsb2cgPSBuZXcgTmV3Q29tcG9uZW50RGlhbG9nKFdTRExFZGl0b3JQbHVnaW4uZ2V0U2hlbGwoKSwgdGl0bGUsIGRlZmF1bHROYW1lKTsKLSAgICBpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgIGlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRpYWxvZy5nZXROYW1lKCk7ICAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfSAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0gIAotICBwcm90ZWN0ZWQgdm9pZCBwcmVSdW4oKQotICB7Ci0gICAgKChBZGRNZXNzYWdlQ29tbWFuZClzdXBlci5tb2RlbEFjdGlvbikuc2V0TG9jYWxOYW1lKG5hbWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IGdldE93bmVyKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzUyZTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotcHVibGljIGNsYXNzIEFkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgRWxlbWVudCBvd25lckVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBuYW1lc3BhY2VOYW1lczsKLSAgcHJvdGVjdGVkIFN0cmluZ1tdIHByZWZlcnJlZFByZWZpeGVzOwotCi0gIHB1YmxpYyBBZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNBY3Rpb24oRWxlbWVudCBvd25lckVsZW1lbnQsIFN0cmluZ1tdIG5hbWVzcGFjZU5hbWVzLCBTdHJpbmdbXSBwcmVmZXJyZWRQcmVmaXhlcykKLSAgewotICAgIHRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotICAgIHRoaXMubmFtZXNwYWNlTmFtZXMgPSBuYW1lc3BhY2VOYW1lczsKLSAgICB0aGlzLnByZWZlcnJlZFByZWZpeGVzID0gcHJlZmVycmVkUHJlZml4ZXM7Ci0gIH0KLQotICBwdWJsaWMgQWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zQWN0aW9uKEVsZW1lbnQgb3duZXJFbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlTmFtZSwgU3RyaW5nIHByZWZlcnJlZFByZWZpeCkKLSAgewotICAgIHRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotICAgIG5hbWVzcGFjZU5hbWVzID0gbmV3IFN0cmluZ1sxXTsKLSAgICBuYW1lc3BhY2VOYW1lc1swXSA9IG5hbWVzcGFjZU5hbWU7Ci0KLSAgICBwcmVmZXJyZWRQcmVmaXhlcyA9IG5ldyBTdHJpbmdbMV07Ci0gICAgcHJlZmVycmVkUHJlZml4ZXNbMF0gPSBwcmVmZXJyZWRQcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaWYgKG93bmVyRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIE5hbWVkTm9kZU1hcCBtYXAgPSBvd25lckVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgSGFzaHRhYmxlIHByZWZpeFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgICBpbnQgbWFwTGVuZ3RoID0gbWFwLmdldExlbmd0aCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBMZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQXR0ciBhdHRyaWJ1dGUgPSAoQXR0cikgbWFwLml0ZW0oaSk7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuc3RhcnRzV2l0aCgieG1sbnM6IikpCi0gICAgICAgIHsKLSAgICAgICAgICB0YWJsZS5wdXQoYXR0cmlidXRlLmdldFZhbHVlKCksIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgICAgcHJlZml4VGFibGUucHV0KGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDYpLCBCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJ4bWxucyIpKQotICAgICAgICB7Ci0gICAgICAgICAgdGFibGUucHV0KGF0dHJpYnV0ZS5nZXRWYWx1ZSgpLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgIHByZWZpeFRhYmxlLnB1dCgiIiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZU5hbWVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gbmFtZXNwYWNlTmFtZXNbaV07Ci0gICAgICAgIGlmICh0YWJsZS5nZXQobmFtZXNwYWNlKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChpIDwgcHJlZmVycmVkUHJlZml4ZXMubGVuZ3RoKSA/IHByZWZlcnJlZFByZWZpeGVzW2ldIDogInAwIjsKLSAgICAgICAgICBpZiAocHJlZml4VGFibGUuZ2V0KHByZWZpeCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmaXggPSBjb21wdXRlVW5pcXVlUHJlZml4KCJwIiwgcHJlZml4VGFibGUpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gcHJlZml4Lmxlbmd0aCgpID4gMCA/ICJ4bWxuczoiICsgcHJlZml4IDogInhtbG5zIjsKLSAgICAgICAgICBvd25lckVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIG5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVVbmlxdWVQcmVmaXgoU3RyaW5nIGJhc2UsIEhhc2h0YWJsZSB0YWJsZSkKLSAgewotICAgIGludCBpID0gMDsKLSAgICBTdHJpbmcgcHJlZml4ID0gYmFzZTsKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBpZiAodGFibGUuZ2V0KHByZWZpeCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGJhc2UgKyBpOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXg7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFdTSVNjaGVtYUltcG9ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyYzZhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZFdTSVNjaGVtYUltcG9ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIEFkZFdTSVNjaGVtYUltcG9ydEFjdGlvbiBleHRlbmRzIEJhc2VOb2RlQWN0aW9uCi17Ci0gICAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudDsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uOwotICAgIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudERlY2xhcmF0aW9uTmFtZXNwYWNlUHJlZml4OwotCi0gICAgcHVibGljIEFkZFdTSVNjaGVtYUltcG9ydEFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbikKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgICAgIGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBOb2RlIGdldE5vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlZmluaXRpb25FbGVtZW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0gICAgewotICAgIAlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTVBPUlQiKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRPckNyZWF0ZVR5cGVzRWxlbWVudCgpCi0gICAgewotICAgICAgICBFbGVtZW50IHR5cGVzRWxlbWVudCA9IG51bGw7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uLmdldFR5cGVzKCkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlZmluaXRpb25FbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWRkRWxlbWVudEFjdGlvbiBhZGRUeXBlc0FjdGlvbiA9IG5ldyBBZGRFbGVtZW50QWN0aW9uKCIiLCAiaWNvbnMveHNkX29iai5naWYiLCBkZWZpbml0aW9uRWxlbWVudCwgZGVmaW5pdGlvbkVsZW1lbnQuZ2V0UHJlZml4KCksICJ0eXBlcyIpOwotICAgICAgICAgICAgICAgIGFkZFR5cGVzQWN0aW9uLnNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICAgICAgICAgICAgICAgIGFkZFR5cGVzQWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgICAgIHR5cGVzRWxlbWVudCA9IGFkZFR5cGVzQWN0aW9uLmdldE5ld0VsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBmb3JtYXQodHlwZXNFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHR5cGVzRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uLmdldFR5cGVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0eXBlc0VsZW1lbnQ7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBFbGVtZW50IGdldEltcG9ydEhvbGRlckVsZW1lbnQoRWxlbWVudCB0eXBlc0VsZW1lbnQpIHsKLSAgICAJRWxlbWVudCBpbXBvcnRIb2xkZXJFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSB0eXBlc0VsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotICAgICAgICAgICAgICAgIGlmICgic2NoZW1hIi5lcXVhbHMoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSkgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIpID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbXBvcnRIb2xkZXJFbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gaW1wb3J0SG9sZGVyRWxlbWVudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWxlbWVudCBnZXRPckNyZWF0ZUltcG9ydEhvbGRlckVsZW1lbnQoRWxlbWVudCB0eXBlc0VsZW1lbnQpCi0gICAgewotICAgICAgICBFbGVtZW50IGltcG9ydEhvbGRlckVsZW1lbnQgPSBnZXRJbXBvcnRIb2xkZXJFbGVtZW50KHR5cGVzRWxlbWVudCk7Ci0gICAgICAgIGlmIChpbXBvcnRIb2xkZXJFbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWRkSW1wb3J0SG9sZGVyQWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oIiIsICJpY29ucy94c2Rfb2JqLmdpZiIsIHR5cGVzRWxlbWVudCwgInhzZCIsICJzY2hlbWEiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzZCIsIFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBhZGRJbXBvcnRIb2xkZXJBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICBpbXBvcnRIb2xkZXJFbGVtZW50ID0gYWRkSW1wb3J0SG9sZGVyQWN0aW9uLmdldE5ld0VsZW1lbnQoKTsKLSAgICAgICAgICAgIGZvcm1hdChpbXBvcnRIb2xkZXJFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW1wb3J0SG9sZGVyRWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBhZGQgdGhlIGltcG9ydCBpZiBpdCdzIGFscmVhZHkgdGhlcmUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbXBvcnROb3RBbHJlYWR5RXhpc3RzKCkgewotICAgIAlib29sZWFuIG5vdEV4aXN0cyA9IHRydWU7Ci0gICAgCQotICAgIAlpZiAoZGVmaW5pdGlvbi5nZXRUeXBlcygpICE9IG51bGwpIHsKLSAgICAJCUVsZW1lbnQgdHlwZXNFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24uZ2V0VHlwZXMoKSk7Ci0gICAgCQlFbGVtZW50IHNjaGVtYUVsZW1lbnQgPSBnZXRJbXBvcnRIb2xkZXJFbGVtZW50KHR5cGVzRWxlbWVudCk7Ci0KLSAgICAJCWlmIChzY2hlbWFFbGVtZW50ICE9IG51bGwpIHsKLSAgICAJCQkvLyBDb2xsZWN0IGNoaWxkcmVuCi0gICAgCQkJTm9kZSBub2RlID0gc2NoZW1hRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0gICAgCQkJamF2YS51dGlsLlZlY3RvciBzY2hlbWFDaGlsZHJlbiA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotICAgIAkJCQlOb2RlIGNoaWxkID0gbm9kZTsKLQkJCQkJCi0gICAgCQkJCWlmICghKGNoaWxkIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRleHRJbXBsKSkgewotICAgIAkJCQkJc2NoZW1hQ2hpbGRyZW4uYWRkRWxlbWVudChjaGlsZCk7Ci0gICAgCQkJCX0KLQkJCQkJCi0gICAgCQkJCXdoaWxlIChjaGlsZC5nZXROZXh0U2libGluZygpICE9IG51bGwpIHsKLSAgICAJCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAJCQkJCWlmICghKGNoaWxkIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRleHRJbXBsKSkgewotICAgIAkJCQkJCXNjaGVtYUNoaWxkcmVuLmFkZEVsZW1lbnQoY2hpbGQpOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0KLSAgICAJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNjaGVtYUNoaWxkcmVuLnNpemUoKTsgaW5kZXgrKykgewotICAgIAkJCQkJRWxlbWVudCBzY2hlbWFDaGlsZCA9IChFbGVtZW50KSBzY2hlbWFDaGlsZHJlbi5lbGVtZW50QXQoaW5kZXgpOwotICAgIAkJCQkJU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gc2NoZW1hQ2hpbGQuZ2V0QXR0cmlidXRlKCJzY2hlbWFMb2NhdGlvbiIpOwotICAgIAkJCQkJU3RyaW5nIHNjaGVtYU5hbWVzcGFjZSA9IHNjaGVtYUNoaWxkLmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7Ci0JCQkJCi0gICAgCQkJCQlpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiBuYW1lc3BhY2UgIT0gbnVsbCAmJgotICAgIAkJCQkJCQlzY2hlbWFMb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pICYmIHNjaGVtYU5hbWVzcGFjZS5lcXVhbHMobmFtZXNwYWNlKSkgewotICAgIAkJCQkJCW5vdEV4aXN0cyA9IGZhbHNlOwotICAgIAkJCQkJCWJyZWFrOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCQotICAgIAlyZXR1cm4gbm90RXhpc3RzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgICBpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCAmJiBpbXBvcnROb3RBbHJlYWR5RXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJlZ2luUmVjb3JkaW5nKCk7Ci0gICAgICAgICAgICBwZXJmb3JtQWRkRWxlbWVudCgpOwotICAgICAgICAgICAgZW5kUmVjb3JkaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgdHlwZXNFbGVtZW50ID0gZ2V0T3JDcmVhdGVUeXBlc0VsZW1lbnQoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgaW1wb3J0SG9sZGVyRWxlbWVudCA9IGdldE9yQ3JlYXRlSW1wb3J0SG9sZGVyRWxlbWVudCh0eXBlc0VsZW1lbnQpOwotCi0gICAgICAgICAgICBBZGRFbGVtZW50QWN0aW9uIGFkZEltcG9ydEFjdGlvbiA9IG5ldyBBZGRFbGVtZW50QWN0aW9uKCIiLCAiaWNvbnMveHNkX29iai5naWYiLCBpbXBvcnRIb2xkZXJFbGVtZW50LCBpbXBvcnRIb2xkZXJFbGVtZW50LmdldFByZWZpeCgpLCAiaW1wb3J0IikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgic2NoZW1hTG9jYXRpb24iLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGFkZEltcG9ydEFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGFkZEltcG9ydEFjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgICBmb3JtYXQobmV3RWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXgoU3RyaW5nIG5zUHJlZml4KQotICAgIHsKLSAgICAgICAgdGhpcy5lbGVtZW50RGVjbGFyYXRpb25OYW1lc3BhY2VQcmVmaXggPSBuc1ByZWZpeDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZm9ybWF0KE5vZGUgcGFyZW50Tm9kZSkKLSAgICB7Ci0gICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZvcm1hdCBzZWxlY3RlZCBub2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgRm9ybWF0UHJvY2Vzc29yWE1MIGZvcm1hdFByb2Nlc3NvclhNTCA9IG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLSAgICAgICAgICAgIGZvcm1hdFByb2Nlc3NvclhNTC5mb3JtYXROb2RlKChJRE9NTm9kZSlwYXJlbnROb2RlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQmFzZU5vZGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQmFzZU5vZGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmYzhkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7IAotICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlTm9kZUFjdGlvbiBleHRlbmRzIEFjdGlvbgoteyAKLSAgcHVibGljIGFic3RyYWN0IE5vZGUgZ2V0Tm9kZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpOwotCi0gIHB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKCkKLSAgeyAgICAKLSAgICBOb2RlIG5vZGUgPSBnZXROb2RlKCk7ICAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7ICAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBOb2RlIG5vZGUgPSBnZXROb2RlKCk7IAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgIAotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ29weUdsb2JhbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5R2xvYmFsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDVmZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5R2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQ29weUdsb2JhbEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gIAlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLSAgCXByaXZhdGUgV1NETEVsZW1lbnQgc2VsZWN0aW9uOwotICAJCi0gIAlwdWJsaWMgQ29weUdsb2JhbEFjdGlvbihXU0RMRWxlbWVudCBzZWxlY3Rpb24sIElFZGl0b3JQYXJ0IGVkaXRvcikgewotICAJCXNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0NPUFkiKSk7Ci0gIAkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIAkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0gIAkJc2V0RW5hYmxlZFN0YXRlKCk7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotICAJCQkoKFdTRExFZGl0b3IpIGVkaXRvcikuc2V0Q2xpcGJvYXJkQ29udGVudHMoc2VsZWN0aW9uKTsKLSAgCQkJCi0gIAkJCSgoV1NETEVkaXRvcikgZWRpdG9yKS5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotICAJCX0KLSAgCX0KLSAgCQotICAJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKFdTRExFbGVtZW50IG5ld1NlbGVjdGlvbikgewotICAJCXNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLSAgCQlzZXRFbmFibGVkU3RhdGUoKTsKLSAgCX0KLSAgCQotICAJcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZFN0YXRlKCkgewotICAJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCQkJc2V0RW5hYmxlZCh0cnVlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkgIAkJc2V0RW5hYmxlZChmYWxzZSk7Ci0gIAkJfQotICAJfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5V1NETEVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvQ29weVdTRExFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2Q4YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db3B5V1NETEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPcGVyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLldTRExFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuV1NETFRyZWVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qCi0gKiBDbGFzcyB3aGljaCBjb3BpZXMgYSBXU0RMRWxlbWVudCBhbmQgaXQncyAnY2hpbGRyZW4nIGVsZW1lbnRzLgotICogRm9yIGV4YW1wbGUsIGEgY29weSBjb21tYW5kIG9uIGEgT3BlcmF0aW9uIHdpbGwgcmVzdWx0IGluIGEgY29weQotICogb2YgdGhlIG9wZXJhdGlvbiBhbmQgaXQncyBpbnB1dC9vdXRwdXQvZmF1bHRzLCBhbmQgaXQncyBtZXNzYWdlCi0gKiBhbmQgcGFydHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5V1NETEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBXU0RMRHJhZ0FjdGlvbiB7Ci0JV1NETEVsZW1lbnQgZWxlbWVudCwgcGFyZW50OwotCU5vZGUgcGFyZW50Tm9kZTsKLQlXU0RMRWxlbWVudENvbW1hbmQgd3NkbEVsZW1lbnRDb21tYW5kOwotCUVkaXRQYXJ0Vmlld2VyIGVkaXRQYXJ0Vmlld2VyOwotCQotCS8qCi0JICogIGVsZW1lbnQgPSBUaGUgV1NETEVsZW1lbnQgYmVpbmcgY29waWVkCi0JICogIHBhcmVudCA9IFRoZSBQYXJlbnQgb2YgdGhlICduZXcnIFdTRExFbGVtZW50Ci0JICogIHBhcmVudE5vZGUgPSBFbGVtZW50SW1wbCAoZm9yIHVuZG8pCi0JICovCQotCXB1YmxpYyBDb3B5V1NETEVsZW1lbnRBY3Rpb24oRWRpdFBhcnRWaWV3ZXIgZWRpdFBhcnRWaWV3ZXIsIFdTRExFbGVtZW50IGVsZW1lbnQsIFdTRExFbGVtZW50IHBhcmVudCwgTm9kZSBwYXJlbnROb2RlKSB7Ci0JCXNldFRleHQoIkNvcHkgV1NETEVsZW1lbnQiKTsgIC8vIERvIG5vdCBUcmFuc2xhdGUgVGhpcwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwkKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7Ci0JCXRoaXMuZWRpdFBhcnRWaWV3ZXIgPSBlZGl0UGFydFZpZXdlcjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pewotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgUG9ydFR5cGUpIHsKLQkJCQlQb3J0VHlwZSBwdCA9IChQb3J0VHlwZSkgcGFyZW50OwotCQkJCU9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIGVsZW1lbnQ7Ci0JCQkJd3NkbEVsZW1lbnRDb21tYW5kICA9IG5ldyBBZGRPcGVyYXRpb25Db21tYW5kKHB0LCBvcCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVPcGVyYXRpb25OYW1lKHB0LCBvcC5nZXROYW1lKCkpLCB0cnVlKTsJCQotCQkJfQotCQl9Ci0JCS8qCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlUmVmZXJlbmNlKSB7Ci0JCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElucHV0KSB7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0JCQkKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRmF1bHQpIHsKLQkJCQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7Ci0JCQkKLQkJfQotCQkqLwotCQkKLQkJaWYgKHdzZGxFbGVtZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh3c2RsRWxlbWVudENvbW1hbmQgPT0gbnVsbCkgewotCQkJaWYgKGNhbkV4ZWN1dGUoKSkgewotCQkJCXJ1bkNvbW1hbmQoKTsKLQkJCX0KLQkJfQotCQkgZWxzZSB7Ci0JCSAJcnVuQ29tbWFuZCgpOwotCQkgfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcnVuQ29tbWFuZCgpIHsKLQkgCXRoaXMuYmVnaW5SZWNvcmRpbmcoKTsKLQkJd3NkbEVsZW1lbnRDb21tYW5kLnJ1bigpOwotCQlzZWxlY3RXU0RMRWxlbWVudCh3c2RsRWxlbWVudENvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKSk7Ci0JCXRoaXMuZW5kUmVjb3JkaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3RXU0RMRWxlbWVudChXU0RMRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIFNlbGVjdCB0aGUgbmV3bHkgY3JlYXRlZCBlbGVtZW50Ci0JICAgIC8vIEV4cGFuZCBhbGwgdGhlIGFzc29jaWF0ZWQgZWxlbWVudHMgJ2JlbG93JyB0aGUgZ2l2ZW4gZWxlbWVudAotCSAgICBNYXAgZWRpdFBhcnRNYXAgPSBlZGl0UGFydFZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCk7Ci0JICAgIFdTRExUcmVlTm9kZUVkaXRQYXJ0IHdzZGxFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgZWRpdFBhcnRNYXAuZ2V0KGVsZW1lbnQpOwotCSAgICBpZiAod3NkbEVkaXRQYXJ0ICE9IG51bGwpIHsKLQkgICAgCWVkaXRQYXJ0Vmlld2VyLnNlbGVjdCh3c2RsRWRpdFBhcnQpOwotCQkgICAgZXhwYW5kRWRpdFBhcnRzKGVsZW1lbnQsIHRydWUpOwotCSAgICB9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBleHBhbmRFZGl0UGFydHMoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gZXhwYW5kQ2hpbGRyZW4pIHsKLQkgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCSAgICAJTWFwIGVkaXRQYXJ0TWFwID0gZWRpdFBhcnRWaWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpOwotCSAgICAJV1NETFRyZWVOb2RlRWRpdFBhcnQgd3NkbEVkaXRQYXJ0ID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBlZGl0UGFydE1hcC5nZXQoZWxlbWVudCk7Ci0JCQl3c2RsRWRpdFBhcnQuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQkKLQkJCWlmIChleHBhbmRDaGlsZHJlbikgewotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gV1NETEVkaXRvclV0aWwuZ2V0TW9kZWxHcmFwaFZpZXdDaGlsZHJlbihlbGVtZW50KS5pdGVyYXRvcigpOwotCQkJCQotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJZXhwYW5kRWRpdFBhcnRzKGl0ZXJhdG9yLm5leHQoKSwgZXhwYW5kQ2hpbGRyZW4pOwotCQkJCX0KLQkJCX0KLQkgICAgfQotCX0KLQkKLQkvLyBJbmhlcml0ZWQgY2xhc3NlcyBmcm9tIEJhc2VOb2RlQWN0aW9uCi0JICBwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCSAgCXJldHVybiBwYXJlbnROb2RlOwotCSAgfQotCSAgCi0JICBwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkgIAlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0NPUFkiKTsKLQkgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZURvY0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NyZWF0ZURvY0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNGI5YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DcmVhdGVEb2NBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZvbGRlck1haW5QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVEb2NBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlCi17Ci0gIHByb3RlY3RlZCBJRmlsZSBpRmlsZTsKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgV1NETEVESVRPUl9ET0NHRU5fUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRvY2dlbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfV1NETF9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRlLndzZGwiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJvdGVjdGVkIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBudWxsOwotCi0gIHB1YmxpYyBDcmVhdGVEb2NBY3Rpb25EZWxlZ2F0ZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoSUZpbGUgaUZpbGUpCi0gIHsKLSAgICB0aGlzLmlGaWxlID0gaUZpbGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0vLyBUT0RPOiBVbmNvbW1lbnQgd2hlbiB2YWxpZGF0aW9uIGlzIGNoZWNrZWQgaW50byBjb3JvbmEgICAgCi0vLyAgICBJU2hhcmVkU2VydmljZSB2YWxpZGF0ZVNoYXJlZFNlcnZpY2UgPSBFeHRlbnNpb25QbHVnaW4uZ2V0U2hhcmVkU2VydmljZSgiVmFsaWRhdGVXU0RMU2hhcmVkU2VydmljZSIpOyAvLyROT04tTkxTLTEkCi0vLyAgICBTeXN0ZW0ub3V0LnByaW50bG4odmFsaWRhdGVTaGFyZWRTZXJ2aWNlKTsKLS8vICAgIGlmICh2YWxpZGF0ZVNoYXJlZFNlcnZpY2UgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgdHJ5Ci0vLyAgICAgIHsKLS8vICAgICAgICBCb29sZWFuIHJjID0gKEJvb2xlYW4pIHZhbGlkYXRlU2hhcmVkU2VydmljZS5ydW4oaUZpbGUpOwotLy8gICAgICAgIGlmIChyYy5ib29sZWFuVmFsdWUoKSkKLS8vICAgICAgICB7Ci0gICAgICAgICAgTmV3V1NETERvY0ZvbGRlcldpemFyZCB3aXogPSBuZXcgTmV3V1NETERvY0ZvbGRlcldpemFyZCgpOwotICAgICAgICAgIE5ld1dTRExEb2NEaWFsb2cgZGxnID0gbmV3IE5ld1dTRExEb2NEaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB3aXopOwotICAgICAgICAgIGRsZy5vcGVuKCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9JTlZBTElEX1dTREwiKSwgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgICAgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfSU5WQUxJRF9XU0RMX0RFU0MiKSk7IC8vJE5PTi1OTFMtMSQKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotLy8gICAgICB7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgIkVycm9yIiwgLy8kTk9OLU5MUy0xJAotLy8gICAgICAiQ2Fubm90IGZpbmQgdmFsaWRhdG9yIik7IC8vJE5PTi1OTFMtMSQKLS8vICAgIH0KLSAgfQotCi0gIGNsYXNzIEdlbkhUTUxPcGVyYXRpb24gZXh0ZW5kcyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24KLSAgewotICAgIElGaWxlIGlGaWxlOwotICAgIFN0cmluZyBvdXRwdXRMb2NhdGlvbjsKLSAgICBwdWJsaWMgR2VuSFRNTE9wZXJhdGlvbihJRmlsZSBpRmlsZSkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgICAgdGhpcy5pRmlsZSA9IGlGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dExvY2F0aW9uKFN0cmluZyBvdXRwdXRMb2NhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLm91dHB1dExvY2F0aW9uID0gb3V0cHV0TG9jYXRpb247Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotICAgIAkvKgotICAgICAgbW9uaXRvci5iZWdpblRhc2soV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQ1JFQVRJTkdfSFRNTF9GSUxFUyIpLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0gICAgICBXU0RMRG9jIGRvYyA9IG5ldyBXU0RMRG9jKG5ldyBXU0RMRG9jRmlsZVdyaXRlcigpKTsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFBsdWdpbiBwbHVnaW4gPSBQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRvY2dlbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIElQYXRoIGluc3RhbGxQYXRoID0gbmV3IFBhdGgocGx1Z2luLmdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCkudG9FeHRlcm5hbEZvcm0oKSkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKTsKLSAgICAgICAgU3RyaW5nIGluc3RhbGxTdHIgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoaW5zdGFsbFBhdGgudG9TdHJpbmcoKSkpLmdldEZpbGUoKTsKLSAgICAgICAgUGF0aCBkb2NnZW5QYXRoID0gbmV3IFBhdGgoaW5zdGFsbFN0cik7Ci0KLSAgICAgICAgZG9jLnNldFRlbXBsYXRlTG9jYXRpb24oZG9jZ2VuUGF0aC50b09TU3RyaW5nKCkgKyAidGVtcGxhdGUiICsgRmlsZS5zZXBhcmF0b3IpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRvYy5zZXRPcHRpb25zKGlGaWxlLmdldFJhd0xvY2F0aW9uKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKSwgb3V0cHV0TG9jYXRpb24sICIiKTsKLQotICAgICAgICBkb2MuYWRkRmlsZShpRmlsZS5nZXROYW1lKCkpOwotICAgICAgICBkb2MuZG9CdWlsZFN0ZXAoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsgCi0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgfQotICAgICAgKi8KLSAgICB9Ci0gIH0KLQotICBjbGFzcyBXU0RMRG9jTmV3Rm9sZGVyTWFpblBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGb2xkZXJNYWluUGFnZQotICB7Ci0gICAgcHVibGljIFdTRExEb2NOZXdGb2xkZXJNYWluUGFnZShTdHJpbmcgcGFnZU5hbWUpCi0gICAgewotICAgICAgc3VwZXIocGFnZU5hbWUsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlGaWxlKSk7Ci0gICAgICBzZXREZXNjcmlwdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9DUkVBVEVfRk9MREVSX0ZPUl9ET0NTIikpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci0KLSAgY2xhc3MgTmV3V1NETERvY0ZvbGRlcldpemFyZCBleHRlbmRzIFdpemFyZAotICB7Ci0gICAgSUZvbGRlciBmb2xkZXI7Ci0KLSAgICBwcml2YXRlIFdTRExEb2NOZXdGb2xkZXJNYWluUGFnZSBuZXdGb2xkZXJQYWdlOwotCi0gICAgcHVibGljIE5ld1dTRExEb2NGb2xkZXJXaXphcmQoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgICB7Ci0gICAgICBmb2xkZXIgPSBuZXdGb2xkZXJQYWdlLmNyZWF0ZU5ld0ZvbGRlcigpOwotICAgICAgaWYgKGZvbGRlciA9PSBudWxsKQotICAgICAgewotICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX0VSUk9SIiksIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfRk9MREVSX05PVF9DUkVBVEVEIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgR2VuSFRNTE9wZXJhdGlvbiBvcCA9IG5ldyBHZW5IVE1MT3BlcmF0aW9uKGlGaWxlKTsKLSAgICAgIG9wLnNldE91dHB1dExvY2F0aW9uKGZvbGRlci5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBvcC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0gICAgICAgIC8vIHJlZnJlc2ggZm9sZGVyIGFuZCBvcGVuIGluZGV4Lmh0bWwgaW4gd2ViIGJyb3dzZXIKLSAgICAgICAgZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotICAgICAgICBTdHJpbmcgaW5kZXhIdG1sRmlsZSA9IGZvbGRlci5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImluZGV4Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIElGaWxlIGluZGV4SHRtbElGaWxlID0gZ2V0V29ya3NwYWNlRmlsZUZyb21Mb2NhbExvY2F0aW9uKGluZGV4SHRtbEZpbGUpOwotICAgICAgICBpZiAoaW5kZXhIdG1sSUZpbGUgIT0gbnVsbCAmJiBpbmRleEh0bWxJRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldmVhbFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbmRleEh0bWxJRmlsZSkpOwotICAgICAgICAgIAotICAgICAgICAgIG9wZW5FZGl0b3IoaW5kZXhIdG1sSUZpbGUsICJvcmcuZWNsaXBzZS53ZWJicm93c2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9FUlJPUiIpLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfQ1JFQVRJTkdfSFRNTF9GSUxFUyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkKLSAgICAgIHsKLSAgICAgICAgLy8gICAgICAgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHJldmVhbFNlbGVjdGlvbihmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotICAgICAgICBmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgZmluYWwgSVdvcmtiZW5jaFBhcnQgZm9jdXNQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0gICAgICAgIGlmIChmb2N1c1BhcnQgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotICAgICAgICB7Ci0gICAgICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjCi0gICAgICAgICAgKG5ldyBSdW5uYWJsZSgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICgoSVNldFNlbGVjdGlvblRhcmdldClmb2N1c1BhcnQpLnNlbGVjdFJldmVhbChzZWxlY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgaUZpbGUsIGZpbmFsIFN0cmluZyBlZGl0b3JJZCkKLSAgICB7Ci0gICAgICBpZiAoaUZpbGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0gICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYwotICAgICAgICAobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChpRmlsZSksIGVkaXRvcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBCMkJHVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoIkV4Y2VwdGlvbiBlbmNvdW50ZXJlZCB3aGVuIGF0dGVtcHRpbmcgdG8gb3BlbiBmaWxlOiAiICsgaUZpbGUgKyAiXG5cbiIgKyBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElGaWxlIGdldFdvcmtzcGFjZUZpbGVGcm9tTG9jYWxMb2NhdGlvbihTdHJpbmcgZmlsZU5hbWUpCi0gICAgewotICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICBpZiAod29ya3NwYWNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElGaWxlIGlGaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZU5hbWUpKTsKLSAgICAgICAgaWYgKGlGaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gaUZpbGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gICAgewotICAgICAgbmV3Rm9sZGVyUGFnZSA9IG5ldyBXU0RMRG9jTmV3Rm9sZGVyTWFpblBhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkVXX0ZPTERFUiIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYWRkUGFnZShuZXdGb2xkZXJQYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKQotICAgIHsKLSAgICAgIGlmIChuZXdGb2xkZXJQYWdlLmlzUGFnZUNvbXBsZXRlKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBJRm9sZGVyIGdldEZvbGRlcigpCi0gICAgewotICAgICAgcmV0dXJuIGZvbGRlcjsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBOZXdXU0RMRG9jRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nCi0gIHsKLSAgICBwdWJsaWMgTmV3V1NETERvY0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVdpemFyZCBuZXdXaXphcmQpCi0gICAgewotICAgICAgc3VwZXIocGFyZW50U2hlbGwsIG5ld1dpemFyZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpCi0gIHsKLSAgICBlZGl0b3JQYXJ0ID0gdGFyZ2V0RWRpdG9yOwotICAgIGlGaWxlID0gbnVsbDsKLSAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIElFZGl0b3JJbnB1dCBpbnB1dCA9IHRhcmdldEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkKLSAgICAgIHsKLSAgICAgICAgaUZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YjA2MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIEJhc2VOb2RlQWN0aW9uIHsKLQkgcHJvdGVjdGVkIExpc3QgbGlzdDsKLQkgcHJvdGVjdGVkIFN0cmluZyBkZWxldGVTdHJpbmcgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikgKyAiICI7IC8vJE5PTi1OTFMtMSQKLS8vCSBwcml2YXRlIE9iamVjdCBvYmplY3Q7Ci0vLwkgcHJpdmF0ZSBOb2RlIG5vZGU7Ci0JCi0JcHVibGljIERlbGV0ZUFjdGlvbihPYmplY3Qgb2JqZWN0LCBOb2RlIG5vZGUpIHsKLQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOyAgLy8kTk9OLU5MUy0xJAotCSAgICBsaXN0ID0gbmV3IFZlY3RvcigpOwotCSAgICBsaXN0LmFkZChvYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgRGVsZXRlQWN0aW9uKExpc3QgZGVsZXRlTGlzdCkgewotCQlzZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSk7ICAvLyROT04tTkxTLTEkCi0JICAgIGxpc3QgPSBkZWxldGVMaXN0OwotCX0KLQotCXByaXZhdGUgVmVjdG9yIGdldFJlZmVyZW5jZWRNZXNzYWdlcyhPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCVZlY3RvciBtZXNzYWdlcyA9IG5ldyBWZWN0b3IoKTsKLQkJbWVzc2FnZXMuYWRkQWxsKGdldE1lc3NhZ2VzKG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkpKTsKLQkJCi0JCWlmIChvcGVyYXRpb24uZ2V0RUlucHV0KCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0RUlucHV0KCkuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKQotCQkJbWVzc2FnZXMuYWRkRWxlbWVudChvcGVyYXRpb24uZ2V0RUlucHV0KCkuZ2V0RU1lc3NhZ2UoKSk7Ci0JCWlmIChvcGVyYXRpb24uZ2V0RU91dHB1dCgpICE9IG51bGwgJiYgb3BlcmF0aW9uLmdldEVPdXRwdXQoKS5nZXRFTWVzc2FnZSgpICE9IG51bGwpCi0JCQltZXNzYWdlcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkuZ2V0RU1lc3NhZ2UoKSk7Ci0JCQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gV2Ugd2FudCB0byBkZWxldGUgT3BlcmF0aW9ucyBmaXJzdC4gIFNvIHdlIG5lZWQgdG8gc29ydCB0aGUgbGlzdAotCQlMaXN0IHNvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KGxpc3Quc2l6ZSgpKTsKLQkJSXRlcmF0b3IgbGlzdEl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotCQkKLQkJd2hpbGUgKGxpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCB1bnNvcnRlZE9iamVjdCA9IGxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAodW5zb3J0ZWRPYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLQkJCQlzb3J0ZWRMaXN0LmFkZCgwLCB1bnNvcnRlZE9iamVjdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3J0ZWRMaXN0LmFkZCh1bnNvcnRlZE9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU5vZGUgcmVjb3JkaW5nTm9kZSA9IG51bGw7Ci0JCWlmIChzb3J0ZWRMaXN0LnNpemUoKSA+IDEpIHsKLQkJCXJlY29yZGluZ05vZGUgPSBnZXRFbGVtZW50KHNvcnRlZExpc3QuZ2V0KDApKTsKLQkJCWJlZ2luUmVjb3JkaW5nKHJlY29yZGluZ05vZGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9NVUxUSVBMRV9ERUxFVEUiKSk7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc29ydGVkTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0JCQkJZGVsZXRlT3BlcmF0aW9uKChPcGVyYXRpb24pIG9iamVjdCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0JCQkJZGVsZXRlUGFydCgoUGFydCkgb2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCURlbGV0ZU5vZGVBY3Rpb24gZGVsZXRlTm9kZUFjdGlvbiA9IG5ldyBEZWxldGVOb2RlQWN0aW9uKGdldEVsZW1lbnQob2JqZWN0KSk7Ci0JCQkJZGVsZXRlTm9kZUFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJlY29yZGluZ05vZGUgIT0gbnVsbCkgewotCQkJZW5kUmVjb3JkaW5nKHJlY29yZGluZ05vZGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgVmVjdG9yIGdldE1lc3NhZ2VzKExpc3QgZmF1bHRzKSB7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBpdCA9IGZhdWx0cy5pdGVyYXRvcigpOwotCQkKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0Lm5leHQoKTsKLQkJCWlmIChmYXVsdC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQl2LmFkZEVsZW1lbnQoZmF1bHQuZ2V0RU1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkKLQlwcml2YXRlIFZlY3RvciBnZXRQYXJ0cyhWZWN0b3IgbWVzc2FnZXMpIHsKLQkJVmVjdG9yIHBhcnRzID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBpdCA9IG1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0JCQotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgaXQubmV4dCgpOwotCQkJCi0JCQlpZiAobWVzc2FnZS5nZXRFUGFydHMoKSAhPSBudWxsKSB7Ci0JCQkJcGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcGFydHM7Ci0JfQotCQotCXB1YmxpYyBOb2RlIGdldE5vZGUoKQotCXsKLQkgIHJldHVybiBsaXN0LnNpemUoKSA+IDAgPyAoTm9kZSkgZ2V0RWxlbWVudChsaXN0LmdldCgwKSkgOiBudWxsOwotCX0gCi0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0JewotCSAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVsZXRlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJRGVsZXRlT3BlcmF0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBEZWxldGVPcGVyYXRpb25EaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQkgICAgaW50IHJldHVybkNvZGUgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotCSAgICAKLQkgICAgaWYgKHJldHVybkNvZGUgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCSAgICAJaWYgKGRpYWxvZy5kZWxldGVNZXNzYWdlc0FuZFBhcnRzKCkpIHsKLQkgICAgCQkvLyBHZXQgYWxsIGFzc29jaWF0ZWQgbWVzc2FnZXMKLQkgICAgCQlWZWN0b3IgbWVzc2FnZXMgPSBnZXRSZWZlcmVuY2VkTWVzc2FnZXMob3BlcmF0aW9uKTsKLQkgICAgCQkKLQkgICAgCQkvLyBEZXRlcm1pbmUgd2hpY2ggTWVzc2FnZXMgYXJlIHJlZmVyZW5jZWQgZnJvbSAnb3V0c2lkZScgdGhpcyBvcGVyYXRpb24KLQkgICAgCQlWZWN0b3IgcmVmZXJlbmNlZE1lc3NhZ2VzID0gbmV3IFZlY3RvcigpOwotCSAgICAJCWlmIChvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVQb3J0VHlwZXMoKSAhPSBudWxsKSB7Ci0JICAgIAkJCUl0ZXJhdG9yIHBvcnRUeXBlSXRlcmF0b3IgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVQb3J0VHlwZXMoKS5pdGVyYXRvcigpOwotCSAgICAJCQlWZWN0b3Igb3BlcmF0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLQkgICAgCQkJCi0JICAgIAkJCXdoaWxlIChwb3J0VHlwZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCSAgICAJCQkJUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpIHBvcnRUeXBlSXRlcmF0b3IubmV4dCgpOwotCSAgICAJCQkJCi0JICAgIAkJCQlpZiAocG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKSAhPSBudWxsKSB7Ci0JICAgIAkJCQkJSXRlcmF0b3Igb3BlcmF0aW9uSXRlcmF0b3IgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JICAgIAkJCQkJd2hpbGUgKG9wZXJhdGlvbkl0ZXJhdG9yLmhhc05leHQoKSkgewotCSAgICAJCQkJCQlPcGVyYXRpb24gbmV4dE9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG9wZXJhdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQkgICAgCQkJCQkJaWYgKCFuZXh0T3BlcmF0aW9uLmVxdWFscyhvcGVyYXRpb24pKQotCSAgICAJCQkJCQkJb3BlcmF0aW9ucy5hZGQobmV4dE9wZXJhdGlvbik7Ci0JICAgIAkJCQkJfQotCSAgICAJCQkJfQotCSAgICAJCQl9Ci0JICAgIAkJCQotCSAgICAJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgb3BlcmF0aW9ucy5zaXplKCk7IGluZGV4KyspIHsKLQkgICAgCQkJCXJlZmVyZW5jZWRNZXNzYWdlcy5hZGRBbGwoZ2V0UmVmZXJlbmNlZE1lc3NhZ2VzKChPcGVyYXRpb24pIG9wZXJhdGlvbnMuZWxlbWVudEF0KGluZGV4KSkpOwotCSAgICAJCQl9Ci0JICAgIAkJCi0JICAgIAkJCS8vIEZpbHRlciB3aGljaCBNZXNzYWdlcyBuZWVkIHRvIGJlIGRlbGV0ZWQKLQkgICAgCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1lc3NhZ2VzLnNpemUoKTsgaW5kZXgrKykgewotCSAgICAJCQkJaW50IGZvdW5kSW5kZXggPSByZWZlcmVuY2VkTWVzc2FnZXMuaW5kZXhPZihtZXNzYWdlcy5lbGVtZW50QXQoaW5kZXgpKTsKLQkgICAgCQkJCQotCSAgICAJCQkJaWYgKGZvdW5kSW5kZXggIT0gLTEpIHsKLQkgICAgCQkJCQkvLyBNZXNzYWdlIGlzIHJlZmVyZW5jZWQgZWxzZXdoZXJlLiAgRG8gbm90IGRlbGV0ZQotCSAgICAJCQkJCW1lc3NhZ2VzLnJlbW92ZShpbmRleCk7Ci0JICAgIAkJCQl9Ci0JICAgIAkJCX0KLQkgICAgCQl9Ci0JICAgIAkJCi0JICAgIAkJLy8gR2V0IGFsbCBhc3NvY2lhdGVkIHBhcnRzCi0JICAgIAkJVmVjdG9yIHBhcnRzID0gZ2V0UGFydHMobWVzc2FnZXMpOwotCSAgICAJCQotCSAgICAJCS8vIFJlbW92ZSBvdXIgbGlzdCBvZiBNZXNzYWdlcyBhbmQgUGFydHMKLQkgICAgCQlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgb3BlcmF0aW9uLmVDb250YWluZXIoKTsKLQkgICAgCQlOb2RlIHJlY29yZGluZ05vZGUgPSBwb3J0VHlwZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0RWxlbWVudCgpOwotCSAgICAJCWJlZ2luUmVjb3JkaW5nKHJlY29yZGluZ05vZGUsIGRlbGV0ZVN0cmluZyArIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX09QRVJBVElPTiIpKTsKLQkgICAgCQkKLQkgICAgCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JICAgIAkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBtZXNzYWdlcy5lbGVtZW50QXQoaW5kZXgpOwotCSAgICAJCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgbWVzc2FnZS5lQ29udGFpbmVyKCk7Ci0JICAgIAkJCWRlZmluaXRpb24uZ2V0RU1lc3NhZ2VzKCkucmVtb3ZlKG1lc3NhZ2UpOwotCSAgICAJCX0KLQotCSAgICAJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBwYXJ0cy5zaXplKCk7IGluZGV4KyspIHsKLQkgICAgCQkJUGFydCBwYXJ0ID0gKFBhcnQpIHBhcnRzLmVsZW1lbnRBdChpbmRleCk7Ci0JICAgIAkJCU1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBwYXJ0LmVDb250YWluZXIoKTsKLQkgICAgCQkJbWVzc2FnZS5nZXRFUGFydHMoKS5yZW1vdmUocGFydCk7Ci0JICAgIAkJfQotCSAgICAJCQotCSAgICAJCS8vIERlbGV0ZSB0aGUgT3BlcmF0aW9uCi0JICAgIAkJcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5yZW1vdmUob3BlcmF0aW9uKTsKLQotCSAgICAJCWVuZFJlY29yZGluZyhyZWNvcmRpbmdOb2RlKTsKLQkgICAgCX0KLQkgICAgCWVsc2UgewotCSAgICAJCS8vIE9ubHkgZGVsZXRlIHRoZSBPcGVyYXRpb24KLQkgICAgCQlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgb3BlcmF0aW9uLmVDb250YWluZXIoKTsKLQkgICAgCQlOb2RlIHJlY29yZGluZ05vZGUgPSBwb3J0VHlwZS5nZXRFbGVtZW50KCk7Ci0JICAgIAkJCi0JICAgIAkJYmVnaW5SZWNvcmRpbmcocmVjb3JkaW5nTm9kZSwgZGVsZXRlU3RyaW5nICsgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfT1BFUkFUSU9OIikpOyAvLyBUcmFuc2xhdGUgdGhpcyEhIQotCSAgICAJCXBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkucmVtb3ZlKG9wZXJhdGlvbik7Ci0JICAgIAkJZW5kUmVjb3JkaW5nKHJlY29yZGluZ05vZGUpOwotCSAgICAJfQotCSAgICB9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkZWxldGVQYXJ0KFBhcnQgcGFydCkgewotCQlNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgcGFydC5lQ29udGFpbmVyKCk7Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCWJlZ2luUmVjb3JkaW5nKG1lc3NhZ2UuZ2V0RWxlbWVudCgpLCBkZWxldGVTdHJpbmcgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QQVJUIikpOwotCQkJbWVzc2FnZS5nZXRFUGFydHMoKS5yZW1vdmUocGFydCk7Ci0JCQllbmRSZWNvcmRpbmcobWVzc2FnZS5nZXRFbGVtZW50KCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgRWxlbWVudCBnZXRFbGVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB7Ci0JCQllbGVtZW50ID0gKChXU0RMRWxlbWVudCkgb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hKSB7Ci0JCQllbGVtZW50ID0gKChYU0RTY2hlbWEpIG9iamVjdCkuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBiZWdpbiByZWNvcmRpbmcgY2hhbmdlcy4KLQkgKiBUaGlzIHNob3VsZCBldmVudHVhbGx5IHJlcGxhY2UgQmFzZU5vZGVBY3Rpb24uYmVnaW5SZWNvcmRpbmcoKQotCSAqIHdoZW4gYWxsIGRlbGV0ZXMgYXJlIG1vZGVsIGRyaXZlbi4KLQkgKi8KLQkgIHByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZyhOb2RlIG5vZGUsIFN0cmluZyB1bmRvRGVzY3JpcHRpb24pCi0JICB7ICAgIAotCSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotCSAgICB7Ci0JICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIHVuZG9EZXNjcmlwdGlvbik7ICAKLQkgICAgfQotCSAgfQotCi0JLyoKLQkgKiBUaGUgZm9sbG93aW5nIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB0byBiZWdpbiByZWNvcmRpbmcgY2hhbmdlcy4KLQkgKiBUaGlzIHNob3VsZCBldmVudHVhbGx5IHJlcGxhY2UgQmFzZU5vZGVBY3Rpb24uYmVnaW5SZWNvcmRpbmcoKQotCSAqIHdoZW4gYWxsIGRlbGV0ZXMgYXJlIG1vZGVsIGRyaXZlbi4KLQkgKi8KLQkgIHB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhOb2RlIG5vZGUpCi0JICB7Ci0JICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0JICAgIHsKLQkgICAgICAoKElET01Ob2RlKW5vZGUpLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgCi0JICAgIH0KLQkgIH0KLQkKLQlwcml2YXRlIGNsYXNzIERlbGV0ZU9wZXJhdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyewotCQlwcml2YXRlIEJ1dHRvbiBjaGVja0J1dHRvbiA9IG51bGw7Ci0JCXByaXZhdGUgYm9vbGVhbiBkZWxldGVNZXNzYWdlc0FuZFBhcnRzID0gdHJ1ZTsKLQkJcHJpdmF0ZSBTdHJpbmcgb3BlcmF0aW9uTmFtZTsKLQkJIAotCQlwdWJsaWMgRGVsZXRlT3BlcmF0aW9uRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoc2hlbGwpOwotCQkJb3BlcmF0aW9uTmFtZSA9IG5hbWU7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgCi0JCSAgewotCQkgICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQkgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0KLQkJICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkgICAgR3JpZERhdGEgZ2RGaWxsPSBuZXcgR3JpZERhdGEoKTsKLQkJICAgIGdkRmlsbC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQkgICAgZ2RGaWxsLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JCSAgICBnZEZpbGwudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0JCSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZEZpbGwpOwotCi0JCSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJICAgIGxhYmVsLnNldFRleHQob3BlcmF0aW9uTmFtZSk7Ci0vLwkJICAgIGxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfT1BFUkFUSU9OIikgKyAiICIgKyBvcGVyYXRpb25OYW1lKTsKLQkJICAgIEdyaWREYXRhIGxhYmVsRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkgICAgbGFiZWxEYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJICAgIAotCQkgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShsYWJlbERhdGEpOwotCQkgICAgCi0JCSAgICBMYWJlbCBlbXB0eUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkgICAgR3JpZERhdGEgZW1wdHlEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCSAgICBlbXB0eURhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkgICAgZW1wdHlMYWJlbC5zZXRMYXlvdXREYXRhKGVtcHR5RGF0YSk7Ci0KLQkJICAgIGNoZWNrQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCSAgICBjaGVja0J1dHRvbi5zZXRTZWxlY3Rpb24oZGVsZXRlTWVzc2FnZXNBbmRQYXJ0cyk7Ci0JCSAgICBjaGVja0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJICAgIExhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJICAgIG5hbWVMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0RFTEVURV9BU1NPQ0lBVEVEX01TR19BTkRfUEFSVFMiKSk7Ci0JCSAgICAKLQkJICAgIHJldHVybiBkaWFsb2dBcmVhOwotCQkgIH0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGRlbGV0ZU1lc3NhZ2VzQW5kUGFydHMoKSB7Ci0JCQlyZXR1cm4gZGVsZXRlTWVzc2FnZXNBbmRQYXJ0czsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpICB7fQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpICB7Ci0JCQlpZiAoZS53aWRnZXQgPT0gY2hlY2tCdXR0b24pIHsKLQkJCQlpZiAoY2hlY2tCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJZGVsZXRlTWVzc2FnZXNBbmRQYXJ0cyA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWxldGVNZXNzYWdlc0FuZFBhcnRzID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkgewotCQkJY3JlYXRlKCk7Ci0JCSAgICBnZXRTaGVsbCgpLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfREVMRVRFX09QRVJBVElPTl9USVRMRSIpKTsKLQkJICAgIHNldEJsb2NrT25PcGVuKHRydWUpOwotCQkgICAgcmV0dXJuIG9wZW4oKTsKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUludGVyZmFjZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVJbnRlcmZhY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2NDI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZUludGVyZmFjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRGVsZXRlSW50ZXJmYWNlQWN0aW9uIHsKLQotCXB1YmxpYyB2b2lkIHNldERlbGV0ZUxpc3QoTGlzdCBsaXN0KTsKLQkKLQlwdWJsaWMgdm9pZCBydW4oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlTm9kZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVOb2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZTI5MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9EZWxldGVOb2RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7IAotICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERlbGV0ZU5vZGVBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbgoteyAKLSAgcHJvdGVjdGVkIExpc3QgbGlzdDsKLQotICBwdWJsaWMgRGVsZXRlTm9kZUFjdGlvbihOb2RlIG5vZGUpCi0gIHsKLSAgICBzZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSk7ICAvLyROT04tTkxTLTEkCi0gICAgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBsaXN0LmFkZChub2RlKTsKLSAgfSAgICAKLSAgCi0gIHB1YmxpYyBEZWxldGVOb2RlQWN0aW9uKExpc3Qgbm9kZUxpc3QpCi0gIHsKLSAgICBzZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSk7ICAvLyROT04tTkxTLTEkCi0gICAgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBJdGVyYXRvciBpdCA9IG5vZGVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgIAlsaXN0LmFkZChpdC5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiZWdpblJlY29yZGluZygpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIE5vZGUgbm9kZSA9IChOb2RlKWkubmV4dCgpOwotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgICAgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cilub2RlOwotICAgICAgICBhdHRyLmdldE93bmVyRWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICBOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIE5vZGUgcHJldmlvdXNTaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwgJiYgaXNXaGl0ZXNwYWNlVGV4dE5vZGUocHJldmlvdXNTaWJsaW5nKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQocHJldmlvdXNTaWJsaW5nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgIAotCi0gICAgZW5kUmVjb3JkaW5nKCk7Ci0gIH0gICAKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1doaXRlc3BhY2VUZXh0Tm9kZShOb2RlIG5vZGUpIAotICB7Ci0JICByZXR1cm4gKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApOwotICB9ICAgIAotCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGxpc3Quc2l6ZSgpID4gMCA/IChOb2RlKWxpc3QuZ2V0KDApIDogbnVsbDsKLSAgfSAKLQotICBwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURSIpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0RlbGV0ZVdTRExBbmRYU0RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlV1NETEFuZFhTREFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzFiMGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRGVsZXRlV1NETEFuZFhTREFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgZGVsZXRlIHdpdGggdGhlIFdTREwgRWRpdG9yJ3MgZ3JhcGggdmlldy4gIHRoZSBvYmplY3QgZm9yCi0gKiBkZWxldGlvbiBjb3VsZCBiZSBhIFdTREwgJ29iamVjdCcgb3IgYW4gWFNEICdvYmplY3QnLiAgV2UgbmVlZCB0byBtYWtlIHRoaXMKLSAqIGRpc3RpbmN0aW9uIGJlY2F1c2Ugd2UgaGF2ZSB0d28gZGlmZmVyZW50IERlbGV0ZSBjbGFzc2VzLiAgT25lIHRvIGhhbmRsZQotICogV1NETCBhbmQgYW5vdGhlciB0byBoYW5kbGUgWFNELgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlV1NETEFuZFhTREFjdGlvbiBleHRlbmRzIEJhc2VOb2RlQWN0aW9uIHsKLQlMaXN0IGxpc3Q7Ci0JTm9kZSByZWNvcmRpbmdOb2RlOwotCVdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLQotCXB1YmxpYyBEZWxldGVXU0RMQW5kWFNEQWN0aW9uKExpc3QgZGVsZXRlTGlzdCwgTm9kZSByZWNvcmRpbmdOb2RlLCBXU0RMRWRpdG9yIHdzZGxFZGl0b3IpIHsKLQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOwotCQlsaXN0ID0gZGVsZXRlTGlzdDsKLQkJdGhpcy5yZWNvcmRpbmdOb2RlID0gcmVjb3JkaW5nTm9kZTsKLQkJdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJTGlzdCB3c2RsRGVsZXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB4c2REZWxldGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIHsKLQkJCQl3c2RsRGVsZXRlTGlzdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXhzZERlbGV0ZUxpc3QuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU9iamVjdCBuZXdTZWxlY3Rpb24gPSBudWxsOwotCQlPYmplY3QgdG9wTGV2ZWxPYmplY3QgPSBudWxsOwotCQlpZiAod3NkbERlbGV0ZUxpc3Quc2l6ZSgpID4gMCB8fCB4c2REZWxldGVMaXN0LnNpemUoKSA+IDApCi0JCXsJCi0JCQl0cnkKLQkJCXsKLQkJCWJlZ2luUmVjb3JkaW5nKCk7CQotCQkJCQotCQkKLQkJLy8gRGVsZXRlIFdTREwgb2JqZWN0cwotCQlpZiAod3NkbERlbGV0ZUxpc3Quc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IHdzZGxPYmplY3QgPSB3c2RsRGVsZXRlTGlzdC5nZXQoMCk7Ci0JCQlpZiAod3NkbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB7Ci0JCQkJbmV3U2VsZWN0aW9uID0gKChXU0RMRWxlbWVudCkgd3NkbE9iamVjdCkuZUNvbnRhaW5lcigpOwotCQkJCXRvcExldmVsT2JqZWN0ID0gZ2V0VG9wTGV2ZWxXU0RMT2JqZWN0KChXU0RMRWxlbWVudCkgd3NkbE9iamVjdCk7Ci0JCQl9Ci0JCQkKLQkJCURlbGV0ZUFjdGlvbiB3c2RsRGVsZXRlID0gbmV3IERlbGV0ZUFjdGlvbih3c2RsRGVsZXRlTGlzdCk7Ci0JCQl3c2RsRGVsZXRlLnJ1bigpOwotCQl9Ci0JCQotCQkvLyBEZWxldGUgWFNEIG9iamVjdHMKLQkJaWYgKHhzZERlbGV0ZUxpc3Quc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IHhzZE9iamVjdCA9IHhzZERlbGV0ZUxpc3QuZ2V0KDApOwotCQkJaWYgKHhzZE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0JCQkJbmV3U2VsZWN0aW9uID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgeHNkT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJCQl0b3BMZXZlbE9iamVjdCA9IGdldFRvcExldmVsWFNET2JqZWN0KChYU0RDb25jcmV0ZUNvbXBvbmVudCkgeHNkT2JqZWN0KTsKLQkJCX0KLQkJCQotCQkJRGVsZXRlSW50ZXJmYWNlQWN0aW9uIHhzZERlbGV0ZSA9IChEZWxldGVJbnRlcmZhY2VBY3Rpb24pIGdldFhTRERlbGV0ZSgpOwotCQkJeHNkRGVsZXRlLnNldERlbGV0ZUxpc3QoeHNkRGVsZXRlTGlzdCk7Ci0JCQl4c2REZWxldGUucnVuKCk7Ci0JCQkvLyBIYWNrIHRvIGZvcmNlIGEgcmVmcmVzaCBvZiBhbGwgY29tcG9uZW50cyBvZiB0aGUgR3JhcGggVmlldy4gIFRoaXMgaXMgbmVlZGVkCi0JCQkvLyBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UgZGVsZXRlIGEgWFNEIEVsZW1lbnQgKFZpZXcgaW5wdXQgPT0gRGVmaW5pdGlvbikuICBUaGUgWFNECi0JCQkvLyBFbGVtZW50IEVkaXRQYXJ0IHZpc3VhbCB3b3VsZCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSB2aWV3LgotCQkJd3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkuc2V0UU5hbWUod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkuZ2V0UU5hbWUoKSk7Ci0JCX0KLQkJCX0KLQkJCWZpbmFsbHkKLQkJCXsKLQkJCSAgZW5kUmVjb3JkaW5nKCk7Ci0JCQl9Ci0JCQkvLyBNYWtlIG91ciBzZWxlY3Rpb24gYWZ0ZXIgb3VyIERlbGV0aW9ucwotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcil3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKTsKLQkJICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotCQkgICAgewotCQkgICAgCWlmIChuZXdTZWxlY3Rpb24gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24gPSAoKFhTRFBhcnRpY2xlKSBuZXdTZWxlY3Rpb24pLmdldENvbnRhaW5lcigpOwotCSAgICAgICAgICAgIH0KLQkgICAgCQkKLQkJICAgIAlpZiAobmV3U2VsZWN0aW9uID09IG51bGwpIHsKLQkJICAgIAkJbmV3U2VsZWN0aW9uID0gZ2V0TmV3U2VsZWN0aW9uKCk7Ci0JCSAgICAJfQotCQkgICAgCWlmIChuZXdTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkgICAgCQkvLyBXZSBoYXZlIGEgbmV3U2VsZWN0aW9uLCBidXQgaXQgbWF5IGFsc28gYmUgZGVsZXRlZCBieSB0aGUgdXNlci4gIEluIHRoaXMgY2FzZSwgc2VsZWN0IHRoZSB0b3AgbGV2ZWwgb2JqZWN0Ci0JCSAgICAJCWlmIChsaXN0LmNvbnRhaW5zKG5ld1NlbGVjdGlvbikgJiYgdG9wTGV2ZWxPYmplY3QgIT0gbnVsbCkgewotCQkgICAgCQkJbmV3U2VsZWN0aW9uID0gdG9wTGV2ZWxPYmplY3Q7Ci0JCSAgICAJCX0KLQotCQkgICAgCQlzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKSk7Ci0JCSAgICAJfQotCQkgICAgfQotCQl9Ci0JfQotCQotCXB1YmxpYyBOb2RlIGdldE5vZGUoKQotCXsKLQkgIHJldHVybiByZWNvcmRpbmdOb2RlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLQl7Ci0JICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0WFNERGVsZXRlKCkgewotCQlXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uTUVOVV9BQ1RJT05fQ09OVFJJQlVUT1IpOwotCSAgICBPYmplY3QgeHNkRGVsZXRlID0gbnVsbDsKLQkgICAgCi0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkgICAgewotLy8JICAgIAl4c2REZWxldGUgPSBleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLlhTRF9ERUxFVEVfQUNUSU9OLCB3c2RsRWRpdG9yKTsKLQkgICAgCXhzZERlbGV0ZSA9IGV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uWFNEX0RFTEVURV9BQ1RJT04sIG51bGwpOwotCSAgICAJaWYgKHhzZERlbGV0ZSAhPSBudWxsKSB7Ci0JICAgIAkJYnJlYWs7Ci0JICAgIAl9Ci0JICAgIH0JICAgIAotCSAgICAKLQkgICAgcmV0dXJuIHhzZERlbGV0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0TmV3U2VsZWN0aW9uKCkgewotCQkvLyBIYWNrIHVzaW5nIHdzZGxlZGl0b3IuLi4uICBUaGlzIHNpdHVhdGlvbiBvY2N1cnMgd2hlbiB3ZSBkZWxldGUgdGhlIFNjaGVtYSBmcm9tIHRoZSBUeXBlcyBncm91cC4uLi4gIFdlCi0JCS8vIHVzdWFsbHkgZ2V0IHRoZSBjb250YWluZXIgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkLi4uIGhvd2V2ZXIsIGluIHRoaXMgc2l0dWF0aW9uLCB0aGUgY29udGFpbmVyIHdvdWxkCi0JCS8vIGJlIG51bGwgYmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWQgaXMgYSBTY2hlbWEuLi4uLi4KLQkJT2JqZWN0IHNlbGVjdGlvbjsKLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbiA9IHdzZGxFZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJc2VsZWN0aW9uID0gd3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZWxlY3Rpb24gPSB3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKTsKLQkJfQotCQkKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIFdTRExFbGVtZW50IGdldFRvcExldmVsV1NETE9iamVjdChXU0RMRWxlbWVudCBlbGVtZW50KSB7Ci0JCVdTRExFbGVtZW50IHRvcE9iamVjdCA9IChXU0RMRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQotCQl3aGlsZSAodG9wT2JqZWN0ICE9IG51bGwgJiYgISh0b3BPYmplY3QgaW5zdGFuY2VvZiBEZWZpbml0aW9uKSkgewotCQkJdG9wT2JqZWN0ID0gKFdTRExFbGVtZW50KSB0b3BPYmplY3QuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcmV0dXJuIHRvcE9iamVjdDsKLQl9Ci0JCi0JcHJpdmF0ZSBYU0RDb25jcmV0ZUNvbXBvbmVudCBnZXRUb3BMZXZlbFhTRE9iamVjdChYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJWFNEQ29uY3JldGVDb21wb25lbnQgdG9wT2JqZWN0ID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotCQkKLQkJd2hpbGUgKHRvcE9iamVjdCAhPSBudWxsICYmICEodG9wT2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hKSkgewotCQkJdG9wT2JqZWN0ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KSB0b3BPYmplY3QuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcmV0dXJuIHRvcE9iamVjdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0TmFtZXNwYWNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzRiZTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdE5hbWVzcGFjZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5uc2VkaXQuRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSW5mb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgRWRpdE5hbWVzcGFjZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICBwdWJsaWMgRWRpdE5hbWVzcGFjZXNBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FRElUX05BTUVTUEFDRVMiKSk7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBET01OYW1lc3BhY2VJbmZvTWFuYWdlciBuYW1lc3BhY2VJbmZvTWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTWFuYWdlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLSAgICAgIExpc3Qgb2xkTmFtZXNwYWNlSW5mb0xpc3QgPSBOYW1lc3BhY2VJbmZvLmNsb25lTmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCi0gICAgICAvLyBoZXJlIHdlIHN0b3JlIGEgY29weSBvZiB0aGUgb2xkIGluZm8gZm9yIGVhY2ggTmFtZXNwYWNlSW5mbwotICAgICAgLy8gdGhpcyBpbmZvIHdpbGwgYmUgdXNlZCBpbiBjcmVhdGVQcmVmaXhNYXBwaW5nKCkgdG8gZmlndXJlIG91dCBob3cgdG8gdXBkYXRlIHRoZSBkb2N1bWVudCAKLSAgICAgIC8vIGluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZXMKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgICBOYW1lc3BhY2VJbmZvIG9sZENvcHkgPSBuZXcgTmFtZXNwYWNlSW5mbyhpbmZvKTsKLSAgICAgICAgaW5mby5zZXRQcm9wZXJ0eSgib2xkQ29weSIsIG9sZENvcHkpOwotICAgICAgfQotCi0JICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSk7Ci0gICAgICBFZGl0TmFtZXNwYWNlc0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZXNEaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCAgcGF0aCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRURJVF9OQU1FU1BBQ0VTX0RJQUxPR19USVRMRSIpLCBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgICBpbnQgcmMgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgICB7ICAgICAgCQotCQllbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgZGlhbG9nLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJCi0gICAgICAgIExpc3QgbmV3SW5mb0xpc3QgPSBkaWFsb2cuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIucmVtb3ZlTmFtZXNwYWNlSW5mbyhlbGVtZW50KTsKLSAgICAgICAgbmFtZXNwYWNlSW5mb01hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhlbGVtZW50LCBuZXdJbmZvTGlzdCwgZmFsc2UpOwotCi0vKgotICAgICAgICAvLyBzZWUgaWYgd2UgbmVlZCB0byByZW5hbWUgYW55IHByZWZpeGVzCi0gICAgICAgIE1hcCBwcmVmaXhNYXBwaW5nID0gY3JlYXRlUHJlZml4TWFwcGluZyhvbGROYW1lc3BhY2VJbmZvTGlzdCwgbmFtZXNwYWNlSW5mb0xpc3QpOwotICAgICAgICBpZiAocHJlZml4TWFwcGluZy5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgLy9tYW5hZ2VyLmdldE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0gICAgICAgICAgUmVwbGFjZVByZWZpeEFjdGlvbiByZXBsYWNlUHJlZml4QWN0aW9uID0gbmV3IFJlcGxhY2VQcmVmaXhBY3Rpb24oZWxlbWVudCwgcHJlZml4TWFwcGluZyk7Ci0gICAgICAgICAgcmVwbGFjZVByZWZpeEFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAvL21hbmFnZXIuZ2V0TW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLSAgICAgICAgfQotKi8gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBNYXAgY3JlYXRlUHJlZml4TWFwcGluZyhMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkKLSAgewotICAgIE1hcCBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgICBIYXNodGFibGUgb2xkVVJJVG9QcmVmaXhUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0gICAgICBvbGRVUklUb1ByZWZpeFRhYmxlLnB1dChvbGRJbmZvLnVyaSwgb2xkSW5mbyk7Ci0gICAgfQotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBuZXdJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotICAgICAgTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIG9sZFVSSVRvUHJlZml4VGFibGUuZ2V0KG5ld0luZm8udXJpICE9IG51bGwgPyBuZXdJbmZvLnVyaSA6ICIiKTsKLQotICAgICAgLy8gaWYgb2xkSW5mbyBpcyBub24gbnVsbCAuLi4gdGhlcmUncyBhIG1hdGNoaW5nIFVSSSBpbiB0aGUgb2xkIHNldAotICAgICAgLy8gd2UgY2FuIHVzZSBpdHMgcHJlZml4IHRvIGRldGVtaW5lIG91dCBtYXBwaW5nCi0gICAgICAvLwotICAgICAgLy8gaWYgb2xkSW5mbyBpcyBudWxsIC4uLiAgd2UgdXNlIHRoZSAnb2xkQ29weScgd2Ugc3Rhc2hlZCBhd2F5IAotICAgICAgLy8gYXNzdW1pbmcgdGhhdCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBVUkkgYW5kIHRoZSBwcmVmaXgKLSAgICAgIGlmIChvbGRJbmZvID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmV3SW5mby5nZXRQcm9wZXJ0eSgib2xkQ29weSIpOwotICAgICAgfQotCi0gICAgICBpZiAob2xkSW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV3UHJlZml4ID0gbmV3SW5mby5wcmVmaXggIT0gbnVsbCA/IG5ld0luZm8ucHJlZml4IDogIiI7Ci0gICAgICAgIFN0cmluZyBvbGRQcmVmaXggPSBvbGRJbmZvLnByZWZpeCAhPSBudWxsID8gb2xkSW5mby5wcmVmaXggOiAiIjsKLSAgICAgICAgaWYgKCFvbGRQcmVmaXguZXF1YWxzKG5ld1ByZWZpeCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXAucHV0KG9sZFByZWZpeCwgbmV3UHJlZml4KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0V4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDIwZGI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOyAgICAgICAgICAgICAgICAgICAgICAgIAotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSU1lbnVBY3Rpb25Db250cmlidXRvcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJvdGVjdGVkIElNZW51QWN0aW9uQ29udHJpYnV0b3JbXSBtZW51QWN0aW9uQ29udHJpYnV0b3JzOyAgCi0KLSAgcHVibGljIEV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IoV1NETEVkaXRvciB3c2RsRWRpdG9yKQotICB7Ci0gICAgdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsgCi0KLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSByZWdpc3RyeS5nZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucyhXU0RMRWRpdG9yRXh0ZW5zaW9uLk1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SKTsKLSAgICBtZW51QWN0aW9uQ29udHJpYnV0b3JzID0gbmV3IElNZW51QWN0aW9uQ29udHJpYnV0b3JbZXh0ZW5zaW9ucy5sZW5ndGhdOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51QWN0aW9uQ29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIG1lbnVBY3Rpb25Db250cmlidXRvcnNbaV0gPSAoSU1lbnVBY3Rpb25Db250cmlidXRvcilleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SLCB3c2RsRWRpdG9yKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBjb250cmlidXRlTWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1hbmFnZXIsIE5vZGUgbm9kZSwgT2JqZWN0IG9iamVjdCkKLSAgeyAgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZW51QWN0aW9uQ29udHJpYnV0b3JzLmxlbmd0aDsgaSsrKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKG1lbnVBY3Rpb25Db250cmlidXRvcnNbaV0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVudUFjdGlvbkNvbnRyaWJ1dG9yc1tpXS5jb250cmlidXRlTWVudUFjdGlvbnMobWFuYWdlciwgbm9kZSwgb2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4Njk1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL0lEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQlwdWJsaWMgdm9pZCBpbml0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zKElBY3Rpb25CYXJzIGJhcnMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUGFzdGVHbG9iYWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUGFzdGVHbG9iYWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyNDljNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1Bhc3RlR2xvYmFsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFBhc3RlR2xvYmFsQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGVkaXRvcjsKLQlwcml2YXRlIFdTRExFbGVtZW50IHNlbGVjdGlvbjsKLQlwcml2YXRlIE5vZGUgc2VsZWN0aW9uTm9kZTsKLQkKLQlwdWJsaWMgUGFzdGVHbG9iYWxBY3Rpb24oV1NETEVsZW1lbnQgc2VsZWN0aW9uLCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUEFTVEUiKSk7ICAvLyBUcmFuc2xhdGUgVGhpcwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JCXNlbGVjdGlvbk5vZGUgPSBzZWxlY3Rpb24uZ2V0RWxlbWVudCgpOwotCQlzZXRFbmFibGVkU3RhdGUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgV1NETEVkaXRvcikgewotCQkJV1NETEVkaXRvciB3c2RsRWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvcjsKLQkJCUNvcHlXU0RMRWxlbWVudEFjdGlvbiBjb3B5QWN0aW9uID0gbmV3IENvcHlXU0RMRWxlbWVudEFjdGlvbih3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCksIHdzZGxFZGl0b3IuZ2V0Q2xpcGJvYXJkQ29udGVudHMoKSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25Ob2RlKTsKLQkJCWNvcHlBY3Rpb24ucnVuKCk7Ci0JCX0KLQl9Ci0JCi0gIAlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oV1NETEVsZW1lbnQgbmV3U2VsZWN0aW9uKSB7Ci0gIAkJc2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotICAJCXNldEVuYWJsZWRTdGF0ZSgpOwotICAJfQotICAJCi0gIAlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkU3RhdGUoKSB7Ci0gIAkJV1NETEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gIAkJaWYgKChwYXJlbnRFbGVtZW50ID0gc2hvd1Bhc3RlQWN0aW9uKChXU0RMRWxlbWVudCkgc2VsZWN0aW9uLCBlZGl0b3IpKSAhPSBudWxsKSB7Ci0gIAkJCXNlbGVjdGlvbiA9IHBhcmVudEVsZW1lbnQ7Ci0gIAkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCQlzZXRFbmFibGVkKGZhbHNlKTsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCSBwcml2YXRlIFdTRExFbGVtZW50IHNob3dQYXN0ZUFjdGlvbihXU0RMRWxlbWVudCBlbGVtZW50LCBJRWRpdG9yUGFydCBlUGFydCkgewotICAJICAJV1NETEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IG51bGw7Ci0gIAkgIAkKLSAgCSAgCWlmIChlUGFydCBpbnN0YW5jZW9mIFdTRExFZGl0b3IpIHsKLSAgCSAgCQlXU0RMRWxlbWVudCBjbGlwYm9hcmRFbGVtZW50ID0gKChXU0RMRWRpdG9yKSBlUGFydCkuZ2V0Q2xpcGJvYXJkQ29udGVudHMoKTsKLSAgCSAgCQkKLSAgCSAgCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gIAkgIAkJCWlmIChjbGlwYm9hcmRFbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkgIAkJCQlwYXJlbnRFbGVtZW50ID0gZWxlbWVudDsKLSAgCSAgCQkJfQotICAJICAJCX0KLSAgCSAgCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJICAJCQlpZiAoY2xpcGJvYXJkRWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJICAJCQkJcGFyZW50RWxlbWVudCA9IChXU0RMRWxlbWVudCkgKChPcGVyYXRpb24pIGVsZW1lbnQpLmVDb250YWluZXIoKTsKLSAgCSAgCQkJfQotICAJICAJCX0KLSAgCSAgCX0KLSAgCSAgCQotICAJICAJcmV0dXJuIHBhcmVudEVsZW1lbnQ7Ci0gIAkgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwNDYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbG9hZERlcGVuZGVuY2llc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgUmVsb2FkRGVwZW5kZW5jaWVzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZQotewotCXByaXZhdGUgV1NETEVkaXRvciB3c2RsRWRpdG9yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpCi0JewotCQl3c2RsRWRpdG9yID0gKHRhcmdldEVkaXRvciBpbnN0YW5jZW9mIFdTRExFZGl0b3IpID8gKFdTRExFZGl0b3IpdGFyZ2V0RWRpdG9yIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0JewotCQlpZiAod3NkbEVkaXRvciAhPSBudWxsKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQl3c2RsRWRpdG9yLnJlbG9hZERlcGVuZGVuY2llcygpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlYTQxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsgCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpc2l0b3IuQmluZGluZ1JlbmFtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvci5NZXNzYWdlUmVuYW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yLlBvcnRUeXBlUmVuYW1lcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVBY3Rpb24gLy9leHRlbmRzIEJhc2VOb2RlQWN0aW9uIGltcGxlbWVudHMgUnVubmFibGUKLXsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbE9iamVjdDsgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIG5ld05hbWU7Ci0gIHByb3RlY3RlZCBOb2RlIG5vZGU7ICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIFJlbmFtZUFjdGlvbihPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyBuZXdOYW1lKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLm1vZGVsT2JqZWN0ID0gbW9kZWxPYmplY3Q7Ci0gICAgdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLSAgICB0aGlzLm5vZGUgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldE5vZGVGb3JPYmplY3QobW9kZWxPYmplY3QpOwotICB9ICAgICAgCi0KLSAgLyoKLSAgcHVibGljIE5vZGUgZ2V0Tm9kZSgpCi0gIHsKLSAgICByZXR1cm4gbm9kZTsKLSAgfQotICAqLwotCi0gIC8qCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUkVOQU1FIik7ICAvLyROT04tTkxTLTEkCi0gIH0KLSAgKi8KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKSAKLSAgICB7Ci0gICAgICByZW5hbWVPcGVyYXRpb25IZWxwZXIoKE9wZXJhdGlvbiltb2RlbE9iamVjdCk7Ci0gICAgfSAgCi0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgIG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICByZW5hbWVJT0ZIZWxwZXIoKFdTRExFbGVtZW50KW1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbmFtZU1vZGVsT2JqZWN0SGVscGVyKG1vZGVsT2JqZWN0LCBuZXdOYW1lKTsKLSAgICB9Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgdGhlTmV3TmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7IAotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCB0aGVOZXdOYW1lKTsKLSAgICB9ICAgIAotCi0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgTWVzc2FnZSkKLSAgICB7Ci0gICAgICBNZXNzYWdlUmVuYW1lciByZW5hbWVyID0gbmV3IE1lc3NhZ2VSZW5hbWVyKChNZXNzYWdlKW1vZGVsT2JqZWN0LCB0aGVOZXdOYW1lKTsKLSAgICAgIHJlbmFtZXIudmlzaXRCaW5kaW5ncygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFBvcnRUeXBlKQotICAgIHsKLSAgICAgIFBvcnRUeXBlUmVuYW1lciByZW5hbWVyID0gbmV3IFBvcnRUeXBlUmVuYW1lcigoUG9ydFR5cGUpbW9kZWxPYmplY3QsIHRoZU5ld05hbWUpOwotICAgICAgcmVuYW1lci52aXNpdEJpbmRpbmdzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZykKLSAgICB7Ci0gICAgICBCaW5kaW5nUmVuYW1lciByZW5hbWVyID0gbmV3IEJpbmRpbmdSZW5hbWVyKChCaW5kaW5nKW1vZGVsT2JqZWN0LCB0aGVOZXdOYW1lKTsKLSAgICAgIHJlbmFtZXIudmlzaXRTZXJ2aWNlcygpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbmFtZU9wZXJhdGlvbkhlbHBlcihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIob3BlcmF0aW9uLCBuZXdOYW1lKTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVuYW1lSU9GSGVscGVyKFdTRExFbGVtZW50IG9iamVjdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvYmplY3QuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOyAKLSAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBsaXN0ID0gbnVsbDsKLQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dCkKLSAgICB7Ci0gICAgICBsaXN0ID0gdXRpbC5nZXRCaW5kaW5nSW5wdXRzKChJbnB1dClvYmplY3QpOwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBPdXRwdXQpCi0gICAgewotICAgICAgbGlzdCA9IHV0aWwuZ2V0QmluZGluZ091dHB1dHMoKE91dHB1dClvYmplY3QpOwotICAgIH0KLSAgICBlbHNlIC8vIGZhdWx0Ci0gICAgewotICAgICAgbGlzdCA9IHV0aWwuZ2V0QmluZGluZ0ZhdWx0cygoRmF1bHQpb2JqZWN0KTsKLSAgICB9Ci0gICAgICAKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGJpbmRpbmdPYmplY3QgPSBpLm5leHQoKTsKLSAgICAgICAgcmVuYW1lTW9kZWxPYmplY3RIZWxwZXIoYmluZGluZ09iamVjdCwgbmV3TmFtZSk7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLQotICAgIHJlbmFtZU1vZGVsT2JqZWN0SGVscGVyKG9iamVjdCwgbmV3TmFtZSk7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmMzVlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MuSW52b2tlU2V0RGlhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotCi1wdWJsaWMgY2xhc3MgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2luZDsKLQotICBwdWJsaWMgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24oCi0gICAgU3RyaW5nIHRleHQsCi0gICAgTm9kZSBwYXJlbnROb2RlLAotICAgIFN0cmluZyBwcmVmaXgsCi0gICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICBPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBwYXJlbnROb2RlLCBwcmVmaXgsIGxvY2FsTmFtZSk7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OyAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZUtpbmQoU3RyaW5nIGtpbmQpCi0gIHsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKQotICB7Ci0gICAgSW52b2tlU2V0RGlhbG9nIGRpYWxvZyA9IG5ldyBJbnZva2VTZXREaWFsb2coKTsKLSAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsKLSAgICAgIGRpYWxvZy5zZXRSZWZlcmVuY2VLaW5kKGtpbmQpOwotICAgIH0KLSAgICBkaWFsb2cucnVuKGlucHV0LCBlZGl0b3JQYXJ0KTsKLSAgICAKLSAgICAvLyBXZSBzaG91bGRuJ3Qga25vdyBhYm91dCB0aGUgZWRpdG9yIGluIHRoaXMgY2xhc3MKLSAgICBXU0RMRWRpdG9yIGVkaXRvciA9IChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGlucHV0KSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0TmV3Q29tcG9uZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NldE5ld0NvbXBvbmVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzc1ZTQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU2V0TmV3Q29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CaW5kaW5nR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRNZXNzYWdlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5XU0RMRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHMuTmV3Q29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKgotICogVE9ETzogTmVlZCB0byBjbGVhbiB1cCB0aGlzIGNsYXNzLi4uLiBXZSBwcm9iYWJseSBkb24ndCB1c2UgcXVpdGUgYSBmZXcgb2YgdGhlc2UKLSAqIG1ldGhvZHMvaW5zdGFuY2UgdmFyaWFibGVzLgotICovCi1wdWJsaWMgY2xhc3MgU2V0TmV3Q29tcG9uZW50QWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBPYmplY3QgaW5wdXQ7Ci0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICBwcm90ZWN0ZWQgU3RyaW5nIGtpbmQ7Ci0gIHByaXZhdGUgU3RyaW5nIHR5cGVLaW5kID0gImNvbXBsZXgiOyAgICAgIC8vIFRPRE86IFJlZmFjdG9yIGNvZGUgdG8gaGFuZGxlIHRoaXMgYmV0dGVyCi0KLSAgcHVibGljIFNldE5ld0NvbXBvbmVudEFjdGlvbigKLSAgICBTdHJpbmcgdGV4dCwKLSAgICBOb2RlIHBhcmVudE5vZGUsCi0gICAgU3RyaW5nIHByZWZpeCwKLSAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgIE9iamVjdCBpbnB1dCkKLSAgewotICAgIHN1cGVyKHRleHQsIHBhcmVudE5vZGUsIHByZWZpeCwgbG9jYWxOYW1lKTsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7IAotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlS2luZChTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVLaW5kKFN0cmluZyB0eXBlS2luZCkKLSAgewotICAgICAgdGhpcy50eXBlS2luZCA9IHR5cGVLaW5kOwotICB9Ci0KLSAgLy8gVE9ETzogQ2xlYW4gdXAgbmV4dCBtZXRob2RzIGJlbG93ISEhCi0gIHByaXZhdGUgV1NETEVsZW1lbnRDb21tYW5kIGNvbW1hbmQ7Ci0gIHByaXZhdGUgU3RyaW5nIG5ld0RpYWxvZ1RpdGxlID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkVXX0NPTVBPTkVOVCIpOwotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKQotICB7Ci0gICAgU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotICAgIFN0cmluZyBkZWZhdWx0TmFtZSA9IGdldERlZmF1bHROYW1lKCk7Ci0gICAgTmV3Q29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdDb21wb25lbnREaWFsb2coc2hlbGwsIG5ld0RpYWxvZ1RpdGxlLCBkZWZhdWx0TmFtZSwgZ2V0VXNlZE5hbWVzKCkpOwotCi0gICAgaW50IGRpYWxvZ0NvZGUgPSBkaWFsb2cuY3JlYXRlQW5kT3BlbigpOwotICAgIAotICAgIGlmIChkaWFsb2dDb2RlID09IFdpbmRvdy5PSykgewotICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQb3J0KSB7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFBvcnQpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IGRpYWxvZy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRPRE86IFdlIHNob3VsZCBiZSBzbWFydGVyIGluIGNob29zaW5nIHNvbWUgZGVmYXVsdCBvcHRpb25zL3NldHRpbmdzIGZvciBnZW5lcmF0aW5nIGEgbmV3IEJpbmRpbmcKLS8vICAgICAgICAgICAgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yID0gbmV3IEJpbmRpbmdHZW5lcmF0b3IoZGVmaW5pdGlvbik7Ci0vLyAgICAgICAgICAgIGJpbmRpbmdHZW5lcmF0b3Iuc2V0TmFtZShuZXdOYW1lKTsKLS8vICAgICAgICAgICAgYmluZGluZ0dlbmVyYXRvci5zZXRQcm90b2NvbCgiU09BUCIpOwotLy8gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLmdlbmVyYXRlKCk7Ci0JCQlCaW5kaW5nR2VuZXJhdG9yIGJpbmRpbmdHZW5lcmF0b3IgPSBuZXcgQmluZGluZ0dlbmVyYXRvcihkZWZpbml0aW9uLCBudWxsLCBTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSk7Ci0JCQliaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUobmV3TmFtZSk7Ci0JCQliaW5kaW5nR2VuZXJhdG9yLmdlbmVyYXRlQmluZGluZygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIGl0ZW1QcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICBpZiAoaXRlbVByZWZpeCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGl0ZW1QcmVmaXggPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCB3c2RsRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdCgoV1NETEVsZW1lbnQpIGlucHV0KTsKLSAgICAgICAgICB3c2RsRWxlbWVudC5zZXRBdHRyaWJ1dGUoImJpbmRpbmciLCBpdGVtUHJlZml4Lmxlbmd0aCgpID09IDAgPyBuZXdOYW1lIDogaXRlbVByZWZpeCArICI6IiArIG5ld05hbWUpOyAgICAgCi0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBCaW5kaW5nKSB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKEJpbmRpbmcpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IGRpYWxvZy5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbkVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgICAgICAgICAvLyBVc2UgQWRkTWVzc2FnZUFjdGlvbiBpbiBXU0RMTWVudUFjdGlvbkNvbnRyaWJ1dG9yCi0gICAgICAgICAgICBBZGRFbGVtZW50QWN0aW9uIGFkZFBvcnRUeXBlQWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oIiIsICJpY29ucy9tZXNzYWdlX29iai5naWYiLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAicG9ydFR5cGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgICAgIGFkZFBvcnRUeXBlQWN0aW9uLnNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICAgICAgICAgICAgYWRkUG9ydFR5cGVBY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IG5ld01lc3NhZ2UgPSBhZGRQb3J0VHlwZUFjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgICAgICAgICBuZXdNZXNzYWdlLnNldEF0dHJpYnV0ZSgibmFtZSIsIG5ld05hbWUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAvLyBuZWVkIHRvIGdldCB0aGUgcHJlZml4IGZvciB0aGUgaXRlbQotICAgICAgICAgICAgLy8gY291bGQgZ2V0IGxpc3Qgb2YgdXBkYXRlZCBtZXNzYWdlcyBhbmQgdGhlbiBzZWxlY3QgYnV0IGN1cnJlbnRseSB3ZSBvbmx5IGhhdmUgdGhlIGxvY2FsIG5hbWUKLSAgICAgICAgICAgIFN0cmluZyBpdGVtUHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBpZiAoaXRlbVByZWZpeCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpdGVtUHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZVZhbHVlID0gaXRlbVByZWZpeC5sZW5ndGgoKSA9PSAwID8gbmV3TmFtZSA6IGl0ZW1QcmVmaXggKyAiOiIgKyBuZXdOYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICAgICAgLy8gU2V0IHRoZSBjb21wb25lbnQKLSAgICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIHBvcnRUeXBlVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgd3NkbEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoKFdTRExFbGVtZW50KSBpbnB1dCk7Ci0gICAgICAgICAgICAgICAgd3NkbEVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgcG9ydFR5cGVWYWx1ZSk7Ci0gICAgICAgICAgICB9IAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSW5wdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBPdXRwdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBGYXVsdCkgewotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChNZXNzYWdlUmVmZXJlbmNlKSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nIG5ld05hbWUgPSBkaWFsb2cuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBBZGRNZXNzYWdlQ29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkTWVzc2FnZUNvbW1hbmQoZGVmaW5pdGlvbiwgbmV3TmFtZSk7Ci0gICAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7Ci0gICAgICAgICAgICBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX1RZUEVfT1JfREVGSU5JVElPTiA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmdldFBhcnRJbmZvKG1lc3NhZ2UpOyAKLSAgICAgICAgICAgIENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZVBhcnQobWVzc2FnZSk7Ci0KLSAgICAgICAgICAvLyBuZWVkIHRvIGdldCB0aGUgcHJlZml4IGZvciB0aGUgaXRlbQotICAgICAgICAgIC8vIGNvdWxkIGdldCBsaXN0IG9mIHVwZGF0ZWQgbWVzc2FnZXMgYW5kIHRoZW4gc2VsZWN0IGJ1dCBjdXJyZW50bHkgd2Ugb25seSBoYXZlIHRoZSBsb2NhbCBuYW1lCi0gICAgICAgICAgU3RyaW5nIGl0ZW1QcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICBpZiAoaXRlbVByZWZpeCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGl0ZW1QcmVmaXggPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IHdzZGxFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KChXU0RMRWxlbWVudCkgaW5wdXQpOwotICAgICAgICAgIHdzZGxFbGVtZW50LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsIGl0ZW1QcmVmaXgubGVuZ3RoKCkgPT0gMCA/IG5ld05hbWUgOiBpdGVtUHJlZml4ICsgIjoiICsgbmV3TmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUGFydCkgewotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChQYXJ0KSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgU3RyaW5nIHJlZmVyZW5jaW5nUHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbmV3TmFtZSA9IGRpYWxvZy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChraW5kLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkgewotICAgICAgICAgICAgICAgIGlmICh0eXBlS2luZC5lcXVhbHNJZ25vcmVDYXNlKCJjb21wbGV4IikpIHsKLSAgICAgICAgICAgICAgICAgICAgKChBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmlzQ29tcGxleFR5cGUodHJ1ZSk7ICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKChBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmlzQ29tcGxleFR5cGUoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgKChBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQpIGNvbW1hbmQpLnJ1bihuZXdOYW1lKTsKLSAgICAgICAgICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZSgoUGFydCkgaW5wdXQsIHRydWUsIHJlZmVyZW5jaW5nUHJlZml4LmVxdWFscygiIikgPyBuZXdOYW1lIDogcmVmZXJlbmNpbmdQcmVmaXggKyAiOiIgKyBuZXdOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiZWxlbWVudCIpKSB7Ci0gICAgICAgICAgICAgICAgKChBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKSBjb21tYW5kKS5ydW4obmV3TmFtZSk7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UoKFBhcnQpIGlucHV0LCBmYWxzZSwgcmVmZXJlbmNpbmdQcmVmaXguZXF1YWxzKCIiKSA/IG5ld05hbWUgOiByZWZlcmVuY2luZ1ByZWZpeCArICI6IiArIG5ld05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBXZSBzaG91bGRuJ3Qga25vdyBhYm91dCB0aGUgZWRpdG9yIGluIHRoaXMgY2xhc3MKLSAgICAgIFdTRExFZGl0b3IgZWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICBlZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbnB1dCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWROYW1lcygpIHsKLSAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFBvcnQpIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFBvcnQpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIE5hbWVVdGlsLmdldFVzZWRCaW5kaW5nTmFtZXMoZGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKEJpbmRpbmcpIGlucHV0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgcmV0dXJuIE5hbWVVdGlsLmdldFVzZWRQb3J0VHlwZU5hbWVzKGRlZmluaXRpb24pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJbnB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIE91dHB1dCB8fCBpbnB1dCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0gICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChNZXNzYWdlUmVmZXJlbmNlKSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgIHJldHVybiBOYW1lVXRpbC5nZXRVc2VkTWVzc2FnZU5hbWVzKGRlZmluaXRpb24pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0gICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChQYXJ0KSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgIGlmIChraW5kLmVxdWFsc0lnbm9yZUNhc2UoImVsZW1lbnQiKSkgewotICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoZGVmaW5pdGlvbiwgIk5ld0VsZW1lbnQiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBYU0RTY2hlbWEgcGFyZW50U2NoZW1hID0gKChBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKSBjb21tYW5kKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHJldHVybiBnZXRVc2VkRWxlbWVudE5hbWVzKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKGtpbmQuZXF1YWxzSWdub3JlQ2FzZSgidHlwZSIpKSB7Ci0gICAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBuZXcgQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kKGRlZmluaXRpb24sICJOZXdUeXBlIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgWFNEU2NoZW1hIHBhcmVudFNjaGVtYSA9ICgoQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kKSBjb21tYW5kKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIExpc3QgdXNlZE5hbWVzOwotICAgICAgICAgICAgICBpZiAodHlwZUtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiY29tcGxleCIpKSB7Ci0gICAgICAgICAgICAgICAgICB1c2VkTmFtZXMgPSBnZXRVc2VkQ29tcGxleFR5cGVOYW1lcyhwYXJlbnRTY2hlbWEpOyAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHVzZWROYW1lcyA9IGdldFVzZWRTaW1wbGVUeXBlTmFtZXMocGFyZW50U2NoZW1hKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIHVzZWROYW1lczsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiAobmV3IEFycmF5TGlzdCgpKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUG9ydCkgewotICAgICAgICAgIG5ld0RpYWxvZ1RpdGxlID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkVXX0JJTkRJTkciKTsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgIERlZmluaXRpb24gZGVmID0gKChQb3J0KSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgIHJldHVybiBOYW1lVXRpbC5nZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdCaW5kaW5nIiwgTmFtZVV0aWwuZ2V0VXNlZEJpbmRpbmdOYW1lcyhkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQmluZGluZykgewotICAgICAgICAgIG5ld0RpYWxvZ1RpdGxlID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkVXX1BPUlRUWVBFIik7ICAgICAgIC8vIFRPRE86IFVnbHkgSGFjay4uLiByZW1vdmUKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9ICgoQmluZGluZykgaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICByZXR1cm4gTmFtZVV0aWwuZ2V0VW5pcXVlTmFtZUhlbHBlcigiTmV3UG9ydFR5cGUiLCBOYW1lVXRpbC5nZXRVc2VkUG9ydFR5cGVOYW1lcyhkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSW5wdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBPdXRwdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBGYXVsdCkgewotICAgICAgICAgIG5ld0RpYWxvZ1RpdGxlID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkVXX01FU1NBR0UiKTsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgIERlZmluaXRpb24gZGVmID0gKChNZXNzYWdlUmVmZXJlbmNlKSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgIHJldHVybiBOYW1lVXRpbC5nZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdNZXNzYWdlIiwgTmFtZVV0aWwuZ2V0VXNlZE1lc3NhZ2VOYW1lcyhkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUGFydCkgewotICAgICAgICAgIERlZmluaXRpb24gZGVmID0gKChQYXJ0KSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgICAgIAotICAgICAgICAgIGlmIChraW5kLmVxdWFsc0lnbm9yZUNhc2UoImVsZW1lbnQiKSkgewotICAgICAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05FV19FTEVNRU5UIik7ICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBjb21tYW5kID0gbmV3IEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoZGVmLCAiTmV3RWxlbWVudCIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBwYXJlbnRTY2hlbWEgPSAoKEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQpIGNvbW1hbmQpLmdldFNjaGVtYSgpOwotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgTGlzdCB1c2VkTmFtZXMgPSBnZXRVc2VkRWxlbWVudE5hbWVzKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgIHJldHVybiBOYW1lVXRpbC5nZXRVbmlxdWVOYW1lSGVscGVyKCJOZXdFbGVtZW50IiwgdXNlZE5hbWVzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoa2luZC5lcXVhbHNJZ25vcmVDYXNlKCJ0eXBlIikpIHsKLSAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IG5ldyBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoZGVmLCAiTmV3VHlwZSIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBwYXJlbnRTY2hlbWEgPSAoKEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCkgY29tbWFuZCkuZ2V0U2NoZW1hKCk7Ci0KLSAgICAgICAgICAgICAgU3RyaW5nIG5ld0l0ZW1OYW1lID0gIk5ld0NvbXBsZXhUeXBlIjsKLSAgICAgICAgICAgICAgTGlzdCB1c2VkTmFtZXMgPSBudWxsOwotICAgICAgICAgICAgICBpZiAodHlwZUtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiY29tcGxleCIpKSB7Ci0gICAgICAgICAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05FV19DT01QTEVYX1RZUEUiKTsgICAgICAgLy8gVE9ETzogVWdseSBIYWNrLi4uIHJlbW92ZQotICAgICAgICAgICAgICAgICAgdXNlZE5hbWVzID0gZ2V0VXNlZENvbXBsZXhUeXBlTmFtZXMocGFyZW50U2NoZW1hKTsgICAgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICBuZXdEaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05FV19TSU1QTEVfVFlQRSIpOyAgICAgICAvLyBUT0RPOiBVZ2x5IEhhY2suLi4gcmVtb3ZlCi0gICAgICAgICAgICAgICAgICB1c2VkTmFtZXMgPSBnZXRVc2VkU2ltcGxlVHlwZU5hbWVzKHBhcmVudFNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICBuZXdJdGVtTmFtZSA9ICJOZXdTaW1wbGVUeXBlIjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgcmV0dXJuIG5ld0l0ZW1OYW1lID0gTmFtZVV0aWwuZ2V0VW5pcXVlTmFtZUhlbHBlcihuZXdJdGVtTmFtZSwgdXNlZE5hbWVzKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiAiTmV3Q29tcG9uZW50IjsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRTaW1wbGVUeXBlTmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIHR5cGVzSXQgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIHR5cGVzSXQubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgICAgICAgbmFtZXNMaXN0LmFkZCh0eXBlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gbmFtZXNMaXN0OwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0VXNlZENvbXBsZXhUeXBlTmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIHR5cGVzSXQgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGUgPSAoWFNEVHlwZURlZmluaXRpb24pIHR5cGVzSXQubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgIG5hbWVzTGlzdC5hZGQodHlwZS5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIG5hbWVzTGlzdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldFVzZWRFbGVtZW50TmFtZXMoWFNEU2NoZW1hIHNjaGVtYSkgewotICAgICAgTGlzdCBuYW1lc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAKLSAgICAgIEl0ZXJhdG9yIGVsZW1lbnRzSXQgPSBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZWxlbWVudHNJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzSXQubmV4dCgpOwotICAgICAgICAgIG5hbWVzTGlzdC5hZGQoZWxlbWVudC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gbmFtZXNMaXN0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TbWFydFJlbmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9TbWFydFJlbmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E3MjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU21hcnRSZW5hbWVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgcmVuYW1lcyAncmVsYXRlZCcgV1NETEVsZW1lbnRzLiAgVGhlIHNjZW5hcmlvIGlzIGFzIGZvbGxvd3M6Ci0gKiBUaGUgdXNlciByZW5hbWVzIGEgV1NETEVsZW1lbnQgaW4gdGhlIGVkaXRvciwgc2F5IGEgTWVzc2FnZS4gIFRoaXMgY2xhc3MKLSAqIHdpbGwgZmluZCB0aGUgJ3JlbGF0ZWQnIGVsZW1lbnRzIHRvIHRoaXMgTWVzc2FnZSBhbmQgcmVuYW1lIHRoZW0gYXMgd2VsbC4KLSAqIEl0IHdpbGwgb25seSByZW5hbWUgYSAncmVsYXRlZCcgZWxlbWVudCBpZiB0aGUgZWxlbWVudCBuYW1lIChvciBwYXJ0IG9mIGl0KQotICogaXMgZ2VuZXJhdGVkLgotICogCi0gKiBTZWUgTmFtZVV0aWwuamF2YQotICovCi1wdWJsaWMgY2xhc3MgU21hcnRSZW5hbWVBY3Rpb24gZXh0ZW5kcyBCYXNlTm9kZUFjdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQlwcm90ZWN0ZWQgT2JqZWN0IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBuZXdOYW1lOwotCXByaXZhdGUgTGlzdCBtZXNzYWdlUmVmZXJlbmNlczsgLy8gVGhpcyB2YXJpYWJsZSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgbWV0aG9kIGdldEFsbE1lc3NhZ2VSZWZlcmVuY2VzKCkKLQlwcm90ZWN0ZWQgTm9kZSBub2RlOyAgIAotCQotCXB1YmxpYyBTbWFydFJlbmFtZUFjdGlvbihPYmplY3QgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc2V0VGV4dCgiU21hcnQgUmVuYW1lIEFjdGlvbiIpOyAvLyBEbyBub3QgdHJhbnNsYXRlCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JICAgIHRoaXMubm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkgICByZXR1cm4gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUkVOQU1FIik7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlSZW5hbWVBY3Rpb24gcmVuYW1lcjsKLQkJU3RyaW5nIG9sZE5hbWU7Ci0JCQotCQliZWdpblJlY29yZGluZygpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGVsZW1lbnQ7Ci0JCQlvbGROYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBSZW5hbWUgT3BlcmF0aW9uIAotCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ob3BlcmF0aW9uLCBuZXdOYW1lKTsKLQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkKLQkJCS8vIFJlbmFtZSBJbnB1dAotCQkJSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0JCQkvKgotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaXNJbnB1dE91dHB1dE5hbWVHZW5lcmF0ZWQob2xkTmFtZSwgaW5wdXQuZ2V0TmFtZSgpKSkgewotCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKGlucHV0LCBuZXdOYW1lKTsKLQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJLy8gUmVuYW1lIE91dHB1dAotCQkJT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0JCQkvKgotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIGlzSW5wdXRPdXRwdXROYW1lR2VuZXJhdGVkKG9sZE5hbWUsIG91dHB1dC5nZXROYW1lKCkpKSB7Ci0JCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24ob3V0cHV0LCBuZXdOYW1lKTsKLQkJCQlyZW5hbWVyLnJ1bigpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJLy8gUmVuYW1lIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCQkJTWVzc2FnZSBtc2c7Ci0KLQkJCS8vIElucHV0Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQltc2cgPSBpbnB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCi0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCW9sZE1lc3NhZ2VOYW1lID0gbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkJCQotCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgIlJlcXVlc3QiKSkgewotCQkJCQkJcmVuYW1lTWVzc2FnZUhlbHBlcihtc2csIGNvbXB1dGVOZXdNZXNzYWdlTmFtZShtc2csIG9sZE5hbWUsIG5ld05hbWUpKTsKLQkJCQkJCQotCQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJCXJlbmFtZVBhcnRzSGVscGVyKG1zZy5nZXRFUGFydHMoKSwgb2xkTWVzc2FnZU5hbWUsIG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCB0cnVlKTsJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIE91dHB1dAotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCW1zZyA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJCQotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQkKLQkJCQkJaWYgKGlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob2xkTWVzc2FnZU5hbWUsIG9sZE5hbWUsICJSZXNwb25zZSIpKSB7Ci0JCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkJCi0JCQkJCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gRmF1bHRzCi0JCQlMaXN0IGZhdWx0cyA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCk7Ci0JCQlpZiAoZmF1bHRzICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdCA9IGZhdWx0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0Lm5leHQoKTsKLQkJCQkJbXNnID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLQkJCQkJU3RyaW5nIG9sZE1lc3NhZ2VOYW1lID0gIiI7Ci0KLQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQkJCi0JCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgZmF1bHQuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElucHV0KSB7Ci0JCQlJbnB1dCBpbnB1dCA9IChJbnB1dCkgZWxlbWVudDsKLQkJCW9sZE5hbWUgPSBpbnB1dC5nZXROYW1lKCk7Ci0JCQlpZiAob2xkTmFtZSA9PSBudWxsKSB7Ci0JCQkJb2xkTmFtZSA9ICIiOwotCQkJfQotCQkJCi0JCQlpZiAob2xkTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWlucHV0LnNldE5hbWUobmV3TmFtZSk7Ci0KLS8vCQkJIFJlbmFtZSBNZXNzYWdlcyBhbmQgUGFydHMKLQkJCU1lc3NhZ2UgbXNnOwotCQkJCi0JCQkvLyBJbnB1dAotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJbXNnID0gaW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLQkJCQlTdHJpbmcgb2xkTWVzc2FnZU5hbWUgPSAiIjsKLQkJCQkKLQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJb2xkTWVzc2FnZU5hbWUgPSBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQkJCi0JCQkJCWlmIChpc01lc3NhZ2VOYW1lR2VuZXJhdGVkKG9sZE1lc3NhZ2VOYW1lLCBvbGROYW1lLCAiUmVxdWVzdCIpKSB7Ci0JCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkJCi0JCQkJCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0JCQlPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgZWxlbWVudDsKLQkJCW9sZE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotCQkJaWYgKG9sZE5hbWUgPT0gbnVsbCkgewotCQkJCW9sZE5hbWUgPSAiIjsKLQkJCX0KLQkJCQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlvdXRwdXQuc2V0TmFtZShuZXdOYW1lKTsKLQotLy8JCQkgUmVuYW1lIE1lc3NhZ2VzIGFuZCBQYXJ0cwotCQkJTWVzc2FnZSBtc2c7Ci0JCQkKLQkJCS8vIE91dHB1dAotCQkJaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCW1zZyA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotCQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb2xkTmFtZSwgIlJlc3BvbnNlIikpIHsKLQkJCQkJCXJlbmFtZU1lc3NhZ2VIZWxwZXIobXNnLCBjb21wdXRlTmV3TWVzc2FnZU5hbWUobXNnLCBvbGROYW1lLCBuZXdOYW1lKSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChtc2cuZ2V0RVBhcnRzKCkgIT0gbnVsbCkKLQkJCQkJCQlyZW5hbWVQYXJ0c0hlbHBlcihtc2cuZ2V0RVBhcnRzKCksIG9sZE1lc3NhZ2VOYW1lLCBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0JCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgZWxlbWVudDsKLQkJCU1lc3NhZ2UgbXNnID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLQkJCVN0cmluZyBvbGRNZXNzYWdlTmFtZSA9ICIiOwotCQkJb2xkTmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLQkJCQotCQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQkvLyBSZW5hbWUgdGhlIEZhdWx0Ci0JCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihmYXVsdCwgbmV3TmFtZSk7Ci0JCQlyZW5hbWVyLnJ1bigpOwotCi0JCQkvLyBSZW5hbWUgdGhlIE1lc3NhZ2UgYW5kIFBhcnRzCi0JCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQlvbGRNZXNzYWdlTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCQotCQkJCU9wZXJhdGlvbiBvcCA9IChPcGVyYXRpb24pIGZhdWx0LmVDb250YWluZXIoKTsKLQkJCQlpZiAoaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvbGRNZXNzYWdlTmFtZSwgb3AuZ2V0TmFtZSgpLCBvbGROYW1lKSkgewotCQkJCQlyZW5hbWVNZXNzYWdlSGVscGVyKG1zZywgY29tcHV0ZU5ld01lc3NhZ2VOYW1lKG1zZywgb2xkTmFtZSwgbmV3TmFtZSkpOwotCQkJCQkKLQkJCQkJaWYgKG1zZy5nZXRFUGFydHMoKSAhPSBudWxsKQotCQkJCQkJcmVuYW1lRmF1bHRQYXJ0cyhtc2cuZ2V0RVBhcnRzKCksIG9wLmdldE5hbWUoKSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7Ci0JCQlNZXNzYWdlIG1zZyA9IChNZXNzYWdlKSBlbGVtZW50OwotCQkJb2xkTmFtZSA9IG1zZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJU3RyaW5nIG9sZE1lc3NhZ2VOYW1lID0gbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkKLQkJCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJcmVuYW1lTWVzc2FnZUhlbHBlcihtc2csIGNvbXB1dGVOZXdNZXNzYWdlTmFtZShtc2csIG9sZE5hbWUsIG5ld05hbWUpKTsKLQkJCQkJCi0JCQlpZiAobXNnLmdldEVQYXJ0cygpICE9IG51bGwpCi0JCQkJcmVuYW1lUGFydHNIZWxwZXIobXNnLmdldEVQYXJ0cygpLCBvbGRNZXNzYWdlTmFtZSwgbXNnLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCksIHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQYXJ0KSB7Ci0JCQlQYXJ0IHBhcnQgPSAoUGFydCkgZWxlbWVudDsKLQkJCVN0cmluZyBvbGRQYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotCQkJCi0JCQlpZiAob2xkUGFydE5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihlbGVtZW50LCBuZXdOYW1lKTsKLQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkKLS8vCQkJUmVuYW1lIEVsZW1lbnRzCi0JCQlyZW5hbWVYU0RFbGVtZW50KHBhcnQsIG9sZFBhcnROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydCkgewotCQkJUG9ydCBwb3J0ID0gKFBvcnQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgb2xkUG9ydE5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLQkJCQotCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24oZWxlbWVudCwgbmV3TmFtZSk7Ci0JCQlyZW5hbWVyLnJ1bigpOwotCi0vLwkJCVJlbmFtZSBCaW5kaW5nCi0JCQlCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0JCQlpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMob2xkUG9ydE5hbWUpKSB7Ci0JCQkJcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24oYmluZGluZywgbmV3TmFtZSk7CQotCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQl9Ci0JCX0KLQkJZW5kUmVjb3JkaW5nKCk7Ci0JfQotCQotCS8vIGJvb2xlYW4gaXNJbnB1dE91dHB1dCBzaG91bGQgYmUgc2V0IHRvIHRydWUgaWYgdGhlIHBhcnQgaXMgYW4gSW5wdXQgb3IgT3V0cHV0LgotCS8vIFNldCBmYWxzZSBpZiB0aGUgcGFydCBpcyBhIEZhdWx0LgotCXByaXZhdGUgdm9pZCByZW5hbWVQYXJ0c0hlbHBlcihMaXN0IHBhcnRzTGlzdCwgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZywgYm9vbGVhbiBpc0lucHV0T3V0cHV0KSB7Ci0JCVJlbmFtZUFjdGlvbiByZW5hbWVyOwotCQkKLQkJaWYgKHBhcnRzTGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBwSXQgPSBwYXJ0c0xpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChwSXQuaGFzTmV4dCgpKSB7Ci0JCQkJUGFydCBwYXJ0ID0gKFBhcnQpIHBJdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9sZFBhcnROYW1lID0gcGFydC5nZXROYW1lKCk7Ci0JCQkJCi0JCQkJaWYgKGlzUGFydE5hbWVHZW5lcmF0ZWQob2xkUGFydE5hbWUsIG9sZFN1YlN0cmluZykpIHsKLQkJCQkJU3RyaW5nIG5ld1BhcnROYW1lOwotCQkJCQlpZiAoaXNJbnB1dE91dHB1dCkgewotCQkJCQkJbmV3UGFydE5hbWUgPSBjb21wdXRlTmV3UGFydE5hbWUocGFydCwgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbmV3UGFydE5hbWUgPSBjb21wdXRlTmV3RmF1bHRQYXJ0TmFtZShwYXJ0LCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJlbmFtZXIgPSBuZXcgUmVuYW1lQWN0aW9uKHBhcnQsIG5ld1BhcnROYW1lKTsKLQkJCQkJcmVuYW1lci5ydW4oKTsKLQkJCQkJCi0JCQkJCS8vIFJlbmFtZSBFbGVtZW50cwotCQkJCQlyZW5hbWVYU0RFbGVtZW50KHBhcnQsIG9sZFBhcnROYW1lLCBuZXdQYXJ0TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBQYXJ0IG5hbWUgd2hlbiB0aGUgRmF1bHQgbmFtZSBpcyBjaGFuZ2VkLiAgT25seQotCS8vIGNoYW5nZSB0aGUgUGFydCBuYW1lIGlmIHRoZSBwYXJ0IG5hbWUgaXMgYSBnZW5lcmF0ZWQgbmFtZS4KLQkvLyBDb21wYXJlIHRvIHJlbmFtZVBhcnRzSGVscGVyKCkuICBUaGUgcmVuYW1lUGFydHNIZWxwZXIoKSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBGYXVsdAotCS8vIGhhcyBOT1QgYmVlbiByZW5hbWVkLCByYXRoZXIsIGl0IGlzIHRyaWdnZXJlZCBieSBzb21lIG90aGVyIG5hbWluZyAoZXguIE9wZXJhdGlvbgotCS8vIHJlbmFtaW5nKS4gIEl0IHdpbGwgdXBkYXQgSW5wdXQvT3V0cHV0LCBBTkQgRmF1bHQgUGFydHMuCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZUZhdWx0UGFydHMoTGlzdCBwYXJ0c0xpc3QsIFN0cmluZyBiYXNlTmFtZSwgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZykgewotCQlSZW5hbWVBY3Rpb24gcmVuYW1lcjsKLQkJCi0JCWlmIChwYXJ0c0xpc3QgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgcEl0ID0gcGFydHNMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAocEl0Lmhhc05leHQoKSkgewotCQkJCVBhcnQgcGFydCA9IChQYXJ0KSBwSXQubmV4dCgpOwotCQkJCVN0cmluZyBvbGRQYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotCQkJCQotCQkJCWlmIChpc1BhcnROYW1lR2VuZXJhdGVkKG9sZFBhcnROYW1lLCBiYXNlTmFtZSwgb2xkU3ViU3RyaW5nKSkgewotCQkJCQlTdHJpbmcgbmV3UGFydE5hbWU7Ci0JCQkJCW5ld1BhcnROYW1lID0gY29tcHV0ZU5ld0ZhdWx0UGFydE5hbWUocGFydCwgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcpOwotCQkJCQlyZW5hbWVyID0gbmV3IFJlbmFtZUFjdGlvbihwYXJ0LCBuZXdQYXJ0TmFtZSk7Ci0JCQkJCXJlbmFtZXIucnVuKCk7Ci0JCQkJCQotCQkJCQkvLyBSZW5hbWUgRWxlbWVudHMKLQkJCQkJcmVuYW1lWFNERWxlbWVudChwYXJ0LCBvbGRQYXJ0TmFtZSwgbmV3UGFydE5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBjb21wdXRlTmV3TWVzc2FnZU5hbWUoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgb2xkU3ViU3RyaW5nLCBTdHJpbmcgbmV3U3ViU3RyaW5nKSB7Ci0JCVN0cmluZyBzdHJpbmcgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCXJldHVybiByZXBsYWNlU2VjdGlvbldpdGhTdWJTdHJpbmcoc3RyaW5nLCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZywgMCk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZU5ld0ZhdWx0TWVzc2FnZU5hbWUoTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgb2xkU3ViU3RyaW5nLCBTdHJpbmcgbmV3U3ViU3RyaW5nKSB7Ci0JCVN0cmluZyBzdHJpbmcgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCXJldHVybiByZXBsYWNlU2VjdGlvbldpdGhTdWJTdHJpbmcoc3RyaW5nLCBvbGRTdWJTdHJpbmcsIG5ld1N1YlN0cmluZywgMSk7CQkKLQl9Ci0JCi0JLy8gTWV0aG9kIGZvciBJbnB1dCwgT3V0cHV0LCBhbmQgRmF1bHQgUGFydHMKLQkvLyBTZWUgY29tcHV0ZU5ld0ZhdWx0UGFydE5hbWUoKSBmb3IgY29tcGFyaXNvbgotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVOZXdQYXJ0TmFtZShQYXJ0IHBhcnQsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJU3RyaW5nIHN0cmluZyA9IHBhcnQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDApOwkJCi0JfQotCQotCS8vIE1ldGhvZCBmb3IgRmF1bHQgUGFydHMKLQkvLyBUaGlzIG1ldGhvZCBiZWhhdmVzIGluIHRoZSBleGFjdCBzYW1lIHdheSBhcyBjb21wdXRlTmV3UGFydE5hbWUoKSBleGNlcHQgaXQgc3RhcnRzIHNlYXJjaGluZyBmb3IgYSBtYXRjaAotCS8vIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlcnMgd2hvIHdpc2ggdG8gcmVuYW1lIGEgZ2VuZXJhdGVkIChGYXVsdCkgcGFydAotCS8vIHdoZXJlIHRoZSBGYXVsdCBuYW1lIGhhcyBjaGFuZ2VkLiAgV2Ugc3RhcnQgb3VyIHNlYXJjaCBhZnRlciB0aGUgZmlyc3QgY2hhcmFjdGVyIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBuYW1lCi0JLy8gb2YgdGhlIHBhcnQgaXMgYnVpbHQgYnkgYXBwZW5kaW5nIHRoZSBGYXVsdCBuYW1lIGFmdGVyIHRoZSBPcGVyYXRpb24gbmFtZS4KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlTmV3RmF1bHRQYXJ0TmFtZShQYXJ0IHBhcnQsIFN0cmluZyBvbGRTdWJTdHJpbmcsIFN0cmluZyBuZXdTdWJTdHJpbmcpIHsKLQkJU3RyaW5nIHN0cmluZyA9IHBhcnQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gcmVwbGFjZVNlY3Rpb25XaXRoU3ViU3RyaW5nKHN0cmluZywgb2xkU3ViU3RyaW5nLCBuZXdTdWJTdHJpbmcsIDEpOwkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VTZWN0aW9uV2l0aFN1YlN0cmluZyhTdHJpbmcgZnVsbFN0cmluZywgU3RyaW5nIG9sZFN1YlN0cmluZywgU3RyaW5nIG5ld1N1YlN0cmluZywgaW50IHN0YXJ0U2VhcmNoSW5kZXgpIHsKLQkJU3RyaW5nQnVmZmVyIGZ1bGxTQiA9IG5ldyBTdHJpbmdCdWZmZXIoZnVsbFN0cmluZyk7Ci0JCWludCBpbmRleCA9IGZ1bGxTQi5pbmRleE9mKG9sZFN1YlN0cmluZywgc3RhcnRTZWFyY2hJbmRleCk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQlyZXR1cm4gZnVsbFNCLnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgb2xkU3ViU3RyaW5nLmxlbmd0aCgpLCBuZXdTdWJTdHJpbmcpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsKLQl9Ci0KLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21tb25OYW1lR2VuZXJhdG9yQ2hlY2soU3RyaW5nIHRhcmdldE5hbWUsIFN0cmluZyBiYXNlTmFtZSwgU3RyaW5nIGFwcGVuZE5hbWUpIHsKLQkJLy8gRmlyc3QgY3JpdGVyaWEgaXMgdGFyZ2V0TmFtZSBtdXN0IHN0YXJ0IHdpdGggdGhlIGJhc2VOYW1lCi0JCWlmICghdGFyZ2V0TmFtZS5zdGFydHNXaXRoKGJhc2VOYW1lKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlpZiAoYXBwZW5kTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBTZWNvbmQgY3JpdGVyaWEuICBUaGUgYXBwZW5kZWQgbmFtZSBtdXN0IGJlIGluIHRoZSB0YXJnZXROYW1lIGFuZCBiZWdpbiByaWdodAotCQkJLy8gYWZ0ZXIgdGhlIGJhc2VOYW1lIGxvY2F0aW9uCi0JCQlpZiAoIXRhcmdldE5hbWUuc3RhcnRzV2l0aChhcHBlbmROYW1lLCBiYXNlTmFtZS5sZW5ndGgoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQkKLQkJLy8gVGhpcmQgY3JpdGVyaWEgKGlmIG5lY2Vzc2FyeSkuICBJZiBiYXNlTmFtZSArIGFwcGVuZE5hbWUgaXMgc2hvcnRlciB0aGFuIHRhcmdldE5hbWUsCi0JCS8vIHRoZW4gdGhlcmUgbXVzdCBiZSAnZXh0cmEnIGNoYXJhY3RlcnMgYXQgdGhlIGVuZCBvZiB0YXJnZXROYW1lLiAgVGhlc2UgY2hhcmFjdGVycyBtdXN0Ci0JCS8vIG1ha2UgdXAgYW4gaW50ZWdlci4gIElmIG5vdCwgaXQgaXMgbm90IGEgZ2VuZXJhdGVkIHN0cmluZy4KLQkJaW50IHN1Ykxlbmd0aCA9IGJhc2VOYW1lLmxlbmd0aCgpICsgYXBwZW5kTmFtZS5sZW5ndGgoKTsKLQkJaWYgKHRhcmdldE5hbWUubGVuZ3RoKCkgPiBzdWJMZW5ndGgpIHsKLQkJCS8vIFdlIGhhdmUgJ2V4dHJhJyBjaGFyYWN0ZXJzCi0JCQlTdHJpbmcgZXh0cmFzID0gdGFyZ2V0TmFtZS5zdWJzdHJpbmcoc3ViTGVuZ3RoKTsKLQkJCQotCQkJaWYoIWlzRGlnaXQoZXh0cmFzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNPcGVyYXRpb25OYW1lR2VuZXJhdGVkKFN0cmluZyBvcE5hbWUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBvcE5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChTdHJpbmcgbXNnTmFtZSwgU3RyaW5nIGJhc2VOYW1lLCBTdHJpbmcgYXBwZW5kTmFtZSkgewotCQlyZXR1cm4gY29tbW9uTmFtZUdlbmVyYXRvckNoZWNrKG1zZ05hbWUsIGJhc2VOYW1lLCBhcHBlbmROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5wdXRPdXRwdXROYW1lR2VuZXJhdGVkKFN0cmluZyBpbk91dE5hbWUsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBpbk91dE5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGYXVsdE5hbWVHZW5lcmF0ZWQoU3RyaW5nIGZhdWx0TmFtZSwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZhdWx0TmFtZS5lcXVhbHMobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhcnROYW1lR2VuZXJhdGVkKFN0cmluZyBwYXJ0TmFtZSwgU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCXJldHVybiBjb21tb25OYW1lR2VuZXJhdG9yQ2hlY2socGFydE5hbWUsIGJhc2VOYW1lLCAiIik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnROYW1lR2VuZXJhdGVkKFN0cmluZyBwYXJ0TmFtZSwgU3RyaW5nIGJhc2VOYW1lLCBTdHJpbmcgYXBwZW5kTmFtZSkgewotCQlyZXR1cm4gY29tbW9uTmFtZUdlbmVyYXRvckNoZWNrKHBhcnROYW1lLCBiYXNlTmFtZSwgYXBwZW5kTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWdpdChTdHJpbmcgc3RyaW5nKSB7Ci0JCWJvb2xlYW4gclZhbHVlID0gdHJ1ZTsKLQkJY2hhcltdIGNoYXJzID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjaGFycy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzRGlnaXQoY2hhcnNbaW5kZXhdKSkgewotCQkJCXJWYWx1ZSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gclZhbHVlOwotCX0KLQkKLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhaWQgaW4gcmVuYW1pbmcgYSBtZXNzYWdlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZU1lc3NhZ2VIZWxwZXIoTWVzc2FnZSBtc2csIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUxpc3QgbWVzc2FnZVJlZnMgPSBnZXRSZWZlcmVuY2luZ01lc3NhZ2VSZWZlcmVuY2VzKG1zZywgZ2V0QWxsTWVzc2FnZVJlZmVyZW5jZXMoKSk7Ci0JCQotCQlSZW5hbWVBY3Rpb24gcmVuYW1lciA9IG5ldyBSZW5hbWVBY3Rpb24obXNnLCBuZXdOYW1lKTsKLQkJcmVuYW1lci5ydW4oKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlID0gKE1lc3NhZ2VSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1lc3NhZ2VSZWZlcmVuY2Uuc2V0RU1lc3NhZ2UobXNnKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0UmVmZXJlbmNpbmdNZXNzYWdlUmVmZXJlbmNlcyhNZXNzYWdlIG1zZywgTGlzdCBtZXNzYWdlUmVmcykgewotCQlWZWN0b3IgcmVmZXJlbmNlc1ZlY3RvciA9IG5ldyBWZWN0b3IoKTsKLQkJUU5hbWUgbWVzc2FnZVFOYW1lID0gbXNnLmdldFFOYW1lKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZVJlZnMuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZmVyZW5jZSA9IChNZXNzYWdlUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobWVzc2FnZVJlZmVyZW5jZS5nZXRFTWVzc2FnZSgpICE9IG51bGwgJiYgbWVzc2FnZVFOYW1lLmVxdWFscyhtZXNzYWdlUmVmZXJlbmNlLmdldEVNZXNzYWdlKCkuZ2V0UU5hbWUoKSkpIHsKLQkJCQlyZWZlcmVuY2VzVmVjdG9yLmFkZEVsZW1lbnQobWVzc2FnZVJlZmVyZW5jZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZWZlcmVuY2VzVmVjdG9yOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QWxsTWVzc2FnZVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChtZXNzYWdlUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlUmVmZXJlbmNlcyA9IG5ldyBWZWN0b3IoKTsKLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIGVsZW1lbnQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQkJCUxpc3QgcG9ydFR5cGVzID0gZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCk7Ci0JCQotCQkJaWYgKHBvcnRUeXBlcyAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgcG9ydFR5cGVJdGVyYXRvciA9IHBvcnRUeXBlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChwb3J0VHlwZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlMaXN0IG9wZXJhdGlvbnNMaXN0ID0gKChQb3J0VHlwZSkgcG9ydFR5cGVJdGVyYXRvci5uZXh0KCkpLmdldEVPcGVyYXRpb25zKCk7Ci0JCQkJCQotCQkJCQlpZiAob3BlcmF0aW9uc0xpc3QgIT0gbnVsbCkgewotCQkJCQkJSXRlcmF0b3Igb3BlcmF0aW9uc0l0ZXJhdG9yID0gb3BlcmF0aW9uc0xpc3QuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlIChvcGVyYXRpb25zSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJbWVzc2FnZVJlZmVyZW5jZXMuYWRkQWxsKGdldEFsbE1lc3NhZ2VSZWZlcmVuY2VzKChPcGVyYXRpb24pIG9wZXJhdGlvbnNJdGVyYXRvci5uZXh0KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG1lc3NhZ2VSZWZlcmVuY2VzOwotCX0KLQkKLQlwcml2YXRlIFZlY3RvciBnZXRBbGxNZXNzYWdlUmVmZXJlbmNlcyhPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCVZlY3RvciBpb2ZzID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBpdCA9IG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJaW9mcy5hZGRFbGVtZW50KGl0Lm5leHQoKSk7Ci0JCX0KLQkJCi0JCWlmIChpb2ZzID09IG51bGwpCi0JCQlpb2ZzID0gbmV3IFZlY3RvcigpOwotCQkKLQkJaWYgKG9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKQotCQkJaW9mcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFSW5wdXQoKSk7Ci0JCQotCQlpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotCQkJaW9mcy5hZGRFbGVtZW50KG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotCQkKLQkJcmV0dXJuIGlvZnM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW5hbWVYU0RFbGVtZW50KFBhcnQgcGFydCwgU3RyaW5nIG9sZFhTRE5hbWUsIFN0cmluZyBuZXdYU0ROYW1lKSB7Ci0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSBwYXJ0LmdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotCQlpZiAoZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwgJiYgb2xkWFNETmFtZS5lcXVhbHMoZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKSkpIHsKLQkJCXJlbmFtZUVsZW1lbnREZWNsYXJhdGlvbkhlbHBlcihlbGVtZW50RGVjbGFyYXRpb24sIG9sZFhTRE5hbWUsIG5ld1hTRE5hbWUpOwotCQkJCi0JCQkvLyBIZXJlIHdlIHJlbmFtZSB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JCQkvLwotCQkJUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUocGFydC5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBuZXdYU0ROYW1lKTsKLQkJCXBhcnQuc2V0RWxlbWVudE5hbWUocW5hbWUpOwkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW5hbWVFbGVtZW50RGVjbGFyYXRpb25IZWxwZXIoWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiwgU3RyaW5nIG9sZFhTRE5hbWUsIFN0cmluZyBuZXdYU0ROYW1lKSB7Ci0JCWlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCAmJiBlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhvbGRYU0ROYW1lKSkgewotCQkJZWxlbWVudERlY2xhcmF0aW9uLnNldE5hbWUobmV3WFNETmFtZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTZlMTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExNdWx0aVBhZ2VFZGl0b3JQYXJ0OwotCi1wdWJsaWMgY2xhc3MgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBpbXBsZW1lbnRzIElFeHRlbmRlZENvbnRyaWJ1dG9yIHsKLQotCXByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgPSBudWxsOwotCXByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Igc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgPSBudWxsOwotCXByb3RlY3RlZCBXU0RMTXVsdGlQYWdlRWRpdG9yUGFydCBtdWx0aVBhZ2VFZGl0b3IgPSBudWxsOwotCi0JLy8gRWRpdG9yRXh0ZW5zaW9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJRXh0ZW5kZWRDb250cmlidXRvciBleHRlbmRlZENvbnRyaWJ1dG9yOwotCi0JcHVibGljIFNvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCi0JCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcigpOwotCi0JCS8vIFJlYWQgYWN0aW9uIGV4dGVuc2lvbnMuCi0JCUV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpOwotCQlleHRlbmRlZENvbnRyaWJ1dG9yID0gYnVpbGRlci5yZWFkQWN0aW9uRXh0ZW5zaW9ucyhFRElUT1JfSUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMpOwotCi0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCWluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihhY3Rpb25CYXJzKTsKLQkJCWluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihhY3Rpb25CYXJzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKQotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKQotCQkJZXh0ZW5kZWRDb250cmlidXRvci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0KLQkJYWRkVG9NZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciNjb250cmlidXRlVG9Qb3B1cE1lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCi0JCWFkZFRvUG9wdXBNZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLQkJYWRkVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKQotCQkJZXh0ZW5kZWRDb250cmlidXRvci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJYWRkVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciN1cGRhdGVUb29sYmFyQWN0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbGJhckFjdGlvbnMoKSB7Ci0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQkvLyBzYXZlIG11bHRpUGFnZUVkaXRvciBiZWZvcmUgY2FsbGluZyBzdXBlci5zZXRBY3RpdmVFZGl0b3IodGFyZ2V0RWRpdG9yKQotCQkvLyBzdXBlci5zZXRBY3RpdmVFZGl0b3Igd2lsbCBjYWxsIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKQotCQkvLyBtdWx0aVBhZ2VFZGl0b3IgaXMgbmVlZGVkIGluIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKQotCQlpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgV1NETE11bHRpUGFnZUVkaXRvclBhcnQpCi0JCQltdWx0aVBhZ2VFZGl0b3IgPSAoV1NETE11bHRpUGFnZUVkaXRvclBhcnQpIHRhcmdldEVkaXRvcjsKLQotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IodGFyZ2V0RWRpdG9yKTsKLQotCQl1cGRhdGVUb29sYmFyQWN0aW9ucygpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcih0YXJnZXRFZGl0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCS8vIFRoaXMgY29udHJpYnV0b3IgaXMgZGVzaWduZWQgZm9yIFN0cnVjdHVyZWRUZXh0TXVsdGlQYWdlRWRpdG9yUGFydC4KLQkJLy8gVG8gc2FmZS1ndWFyZCB0aGlzIGZyb20gcHJvYmxlbXMgY2F1c2VkIGJ5IHVuZXhwZWN0ZWQgdXNhZ2UgYnkgb3RoZXIgZWRpdG9ycywgdGhlIGZvbGxvd2luZwotCQkvLyBjaGVjayBpcyBhZGRlZC4KLQkJaWYgKG11bHRpUGFnZUVkaXRvciAhPSBudWxsKSB7Ci0JCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwgJiYgYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRFZGl0b3IpCi0JCQkJYWN0aXZhdGVTb3VyY2VQYWdlKGFjdGl2ZUVkaXRvcik7Ci0JCQllbHNlCi0JCQkJYWN0aXZhdGVEZXNpZ25QYWdlKGFjdGl2ZUVkaXRvcik7Ci0JCX0KLQotCQl1cGRhdGVUb29sYmFyQWN0aW9ucygpOwotCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBtZW51IGJhciBhbmQgdG9vbCBiYXIKLQkJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGVEZXNpZ25QYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJLy8gaWYgZGVzaWduIHBhZ2UgaXMgbm90IHJlYWxseSBhbiBJRWRpdG9yUGFydCwgYWN0aXZlRWRpdG9yID09IG51bGwsIHNvIHBhc3MgaW4gbXVsdGlQYWdlRWRpdG9yIGluc3RlYWQgKGQyODI0MTQpCi0JCQlpZiAoYWN0aXZlRWRpdG9yID09IG51bGwpIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJfQotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlU291cmNlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwgJiYgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQl9Ci0KLQkJaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwgJiYgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCQkJKChJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yKS5zZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Tb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YjZiZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Tb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotCi0vKioKLSAqIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGZvciBtdWx0aSBwYWdlIGVkaXRvcidzIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yLgotICoKLSAqIFVzZSBXU0RMRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNpbmdsZSBwYWdlIGVkaXRvcgotICogKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZXh0ZW5kcyBBY3Rpb25Db250cmlidXRvclhNTCB7Ci0KLQlwcml2YXRlIElBY3Rpb25CYXJzIGZCYXJzOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FsbHM6Ci0JICogPHVsPgotCSAqICA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvTWVudTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgbWVudSBtYW5hZ2VyPC9saT4KLQkgKiAgPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb1Rvb2xCYXI8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIHRvb2wgYmFyCi0JICogICAgbWFuYWdlcjwvbGk+Ci0JICogIDxsaT48Y29kZT5jb250cmlidXRlVG9TdGF0dXNMaW5lPC9jb2RlPiB3aXRoIDxjb2RlPmJhcnM8L2NvZGU+JyBzdGF0dXMgbGluZQotCSAqICAgIG1hbmFnZXI8L2xpPgotCSAqIDwvdWw+Ci0JICogVGhlIGdpdmVuIGFjdGlvbiBiYXJzIGFyZSBhbHNvIHJlbWVtYmVyZWQgYW5kIG1hZGUgYWNjZXNzaWJsZSB2aWEgCi0JICogPGNvZGU+Z2V0QWN0aW9uQmFyczwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGJhcnMgdGhlIGFjdGlvbiBiYXJzCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzKSB7Ci0JCWZCYXJzID0gYmFyczsKLQkJY29udHJpYnV0ZVRvTWVudShiYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCQljb250cmlidXRlVG9Ub29sQmFyKGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JCWNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoYmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgY29udHJpYnV0b3IncyBhY3Rpb24gYmFycy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGFjdGlvbiBiYXJzCi0JICovCi0JcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7Ci0JCXJldHVybiBmQmFyczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmE2NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Hcm91cE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMVGV4dEVkaXRvcjsKLQotcHVibGljIGNsYXNzIFdTRExBY3Rpb25CYXJDb250cmlidXRvciBleHRlbmRzIFNvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yCi17Ci0gIHByb3RlY3RlZCBXU0RMVGV4dEVkaXRvciB0ZXh0RWRpdG9yOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NETEFjdGlvbkJhckNvbnRyaWJ1dG9yLgotICAgKi8KLSAgcHVibGljIFdTRExBY3Rpb25CYXJDb250cmlidXRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpCi0gIHsKLSAgICBzdXBlci5zZXRBY3RpdmVQYWdlKGFjdGl2ZUVkaXRvcik7Ci0KLSAgICAvLyBhbHdheXMgZW5hYmxlIHVuZG8vcmVkbyByZWdhcmRsZXNzIG9mIHdoaWNoIHBhZ2Ugd2UncmUgb24uICBUaGUgdW5kby9yZWRvIGNvbWVzIGZyb20gdGhlIGVkaXRvcgotICAgIC8vICAgIAotICAgIHVwZGF0ZUFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE8sIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8sIHRydWUpOwotICAgIHVwZGF0ZUFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlJFRE8sIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8sIHRydWUpOwotCi0gICAgLy8gdHVybiB0aGVzZSBvZmYgc28gdGhhdCB0aGUgYWN0aW9uaGFuZGxlciB3aWxsIGhhbmRsZSBpdCBmb3IgdXMKLSAgICAvLwotICAgIC8vdXBkYXRlQWN0aW9uKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ1VULCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DVVQsIGZhbHNlKTsKLSAgICAvL3VwZGF0ZUFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNPUFksIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNPUFksIGZhbHNlKTsKLSAgICAvL3VwZGF0ZUFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlBBU1RFLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5QQVNURSwgZmFsc2UpOwotCi0gICAgZ2V0QWN0aW9uQmFycygpLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGlvbihTdHJpbmcgZ2xvYmFsQWN0aW9uSWQsIFN0cmluZyB0ZXh0RWRpdG9yQWN0aW9uSWQsIGJvb2xlYW4gZW5hYmxlKQotICB7Ci0gICAgZ2V0QWN0aW9uQmFycygpLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoZ2xvYmFsQWN0aW9uSWQsIGVuYWJsZSA/IGdldEFjdGlvbih0ZXh0RWRpdG9yLCB0ZXh0RWRpdG9yQWN0aW9uSWQpIDogbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWN0aW9uIHJlZ2lzdGVkIHdpdGggdGhlIGdpdmVuIHRleHQgZWRpdG9yLgotICAgKiBAcmV0dXJuIElBY3Rpb24gb3IgbnVsbCBpZiBlZGl0b3IgaXMgbnVsbC4KLSAgICovCi0gIHByb3RlY3RlZCBJQWN0aW9uIGdldEFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIFN0cmluZyBhY3Rpb25JRCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiAoZWRpdG9yID09IG51bGwgPyBudWxsIDogZWRpdG9yLmdldEFjdGlvbihhY3Rpb25JRCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKQotICB7Ci0gICAgc3VwZXIuYWRkVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLSAgICB0b29sQmFyTWFuYWdlci5hZGQobmV3IEdyb3VwTWFya2VyKCJXU0RMRWRpdG9yIikpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKQotICB7Ci0gICAgc3VwZXIuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0gICAgdGV4dEVkaXRvciA9IG51bGw7Ci0gICAgaWYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIFdTRExFZGl0b3IpCi0gICAgewotICAgICAgdGV4dEVkaXRvciA9ICgoV1NETEVkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRXU0RMVGV4dEVkaXRvcigpOwotICAgIH0KLSAgICAKLSAgICB1cGRhdGVBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5VTkRPLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPLCB0cnVlKTsKLSAgICB1cGRhdGVBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5SRURPLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SRURPLCB0cnVlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDI1MTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETERyYWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuV1NETFRyZWVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExEcmFnQWN0aW9uIGV4dGVuZHMgQmFzZU5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBXU0RMVHJlZU5vZGVFZGl0UGFydCBtb3ZpbmdDaGlsZEVkaXRQYXJ0OwotCXByb3RlY3RlZCBQb2ludCBwb2ludGVyTG9jYXRpb247Ci0JCi0JLyoKLQkgKiBTdWItY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlydW4oKTsKLQl9Ci0JCi0JLyoKLQkgKiBTdWItY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoKLQkgKiBTdWItY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogU3ViLWNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldEZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnUmVvcmRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ1Jlb3JkZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzOTNmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnUmVvcmRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLk9wZXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5XU0RMQ29tcG9uZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5XU0RMVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMRHJhZ1Jlb3JkZXJBY3Rpb24gZXh0ZW5kcyBXU0RMRHJhZ0FjdGlvbgotewotICBwcm90ZWN0ZWQgV1NETEVkaXRvciB3c2RsRWRpdG9yOwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgbW92aW5nQ2hpbGQ7Ci0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCBuZXdQYXJlbnQ7Ci0gIHByb3RlY3RlZCBXU0RMVHJlZU5vZGVFZGl0UGFydCBsZWZ0U2libGluZ0VkaXRQYXJ0OwotICBwcm90ZWN0ZWQgV1NETFRyZWVOb2RlRWRpdFBhcnQgcmlnaHRTaWJsaW5nRWRpdFBhcnQ7Ci0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCBsZWZ0U2liRWxlbWVudDsKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IHJpZ2h0U2liRWxlbWVudDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuTmV2ZXJFeGVjdXRlID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgV1NETERyYWdSZW9yZGVyQWN0aW9uKFdTRExUcmVlTm9kZUVkaXRQYXJ0IG1vdmluZ0NoaWxkRWRpdFBhcnQsIEVkaXRQYXJ0IHBvaW50ZXJFZGl0UGFydCwgUG9pbnQgcG9pbnRlckxvY2F0aW9uKSB7Ci0gIAl0aGlzLm1vdmluZ0NoaWxkRWRpdFBhcnQgPSBtb3ZpbmdDaGlsZEVkaXRQYXJ0OwotICAJdGhpcy5wb2ludGVyTG9jYXRpb24gPSBwb2ludGVyTG9jYXRpb247Ci0KLQlFZGl0UGFydCBwb3NzaWJsZVBhcmVudCA9IGdldFBhcmVudEVkaXRQYXJ0KHBvaW50ZXJFZGl0UGFydCk7Ci0JCi0JaWYgKCEocG9zc2libGVQYXJlbnQgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCkpIHsKLQkJY2FuTmV2ZXJFeGVjdXRlID0gdHJ1ZTsKLQkJcmV0dXJuOwotCX0KLSAgCQotCVdTRExUcmVlTm9kZUVkaXRQYXJ0IHRhcmdldFBhcmVudEVkaXRQYXJ0ID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBwb3NzaWJsZVBhcmVudDsKLQl3c2RsRWRpdG9yID0gKChXU0RMQ29tcG9uZW50Vmlld2VyKSBwb3NzaWJsZVBhcmVudC5nZXRWaWV3ZXIoKSkuZ2V0V1NETEVkaXRvcigpOwotCQotCWlmIChwb2ludGVyRWRpdFBhcnQuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkvLyBTb3J0IHRoZSBzaWJsaW5ncyAoYW5kIGl0c2VsZikKLQkJTGlzdCB0YXJnZXRFZGl0UGFydFNpYmxpbmdzID0gcG9pbnRlckVkaXRQYXJ0LmdldFBhcmVudCgpLmdldENoaWxkcmVuKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGFyZ2V0RWRpdFBhcnRTaWJsaW5ncywgbmV3IFZlcnRpY2FsRWRpdFBhcnRDb21wYXJhdG9yKCkpOwotICAKLQkJLy8gR2V0ICdsZWZ0JyBhbmQgJ3JpZ2h0JyBzaWJsaW5ncwotCQlsZWZ0U2libGluZ0VkaXRQYXJ0ID0gZ2V0VmVydGljYWxMZWZ0U2libGluZyh0YXJnZXRFZGl0UGFydFNpYmxpbmdzLCBtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyTG9jYXRpb24pOwotCQlyaWdodFNpYmxpbmdFZGl0UGFydCA9IGdldFZlcnRpY2FsUmlnaHRTaWJsaW5nKHRhcmdldEVkaXRQYXJ0U2libGluZ3MsIG1vdmluZ0NoaWxkRWRpdFBhcnQsIHBvaW50ZXJMb2NhdGlvbik7ICAgICAgICAgICAJCi0KLQkJaWYgKG1vdmluZ0NoaWxkRWRpdFBhcnQgIT0gbnVsbCkKLQkJCW1vdmluZ0NoaWxkID0gKFdTRExFbGVtZW50KSBtb3ZpbmdDaGlsZEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmIChsZWZ0U2libGluZ0VkaXRQYXJ0ICE9IG51bGwpCi0JCQlsZWZ0U2liRWxlbWVudCA9IChXU0RMRWxlbWVudCkgbGVmdFNpYmxpbmdFZGl0UGFydC5nZXRNb2RlbCgpOwotCQlpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkKLQkJCXJpZ2h0U2liRWxlbWVudCA9IChXU0RMRWxlbWVudCkgcmlnaHRTaWJsaW5nRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCi0JCW5ld1BhcmVudCA9IChXU0RMRWxlbWVudCkgdGFyZ2V0UGFyZW50RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQl9Ci0JZWxzZSB7Ci0JCW5ld1BhcmVudCA9IChXU0RMRWxlbWVudCkgdGFyZ2V0UGFyZW50RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJbGVmdFNpYkVsZW1lbnQgPSBudWxsOwotCQlyaWdodFNpYkVsZW1lbnQ9IG51bGw7Ci0JfQotICB9Ci0gICAgICAgICAgICAKLSAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgaWYgKGNhbk5ldmVyRXhlY3V0ZSB8fCBuZXdQYXJlbnQgPT0gbnVsbCB8fCBtb3ZpbmdDaGlsZCA9PSBudWxsKSB7Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG1vdmluZ0NoaWxkIGluc3RhbmNlb2YgSW5wdXQpIHsKLSAgICAJaWYgKCEobGVmdFNpYkVsZW1lbnQgaW5zdGFuY2VvZiBGYXVsdCkgJiYgbmV3UGFyZW50LmVxdWFscyhtb3ZpbmdDaGlsZC5lQ29udGFpbmVyKCkpKSB7Ci0gICAgCQlyZXN1bHQgPSB0cnVlOwotICAgIAl9Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vdmluZ0NoaWxkIGluc3RhbmNlb2YgT3V0cHV0KSB7Ci0gICAgCWlmICghKGxlZnRTaWJFbGVtZW50IGluc3RhbmNlb2YgRmF1bHQpICYmIG5ld1BhcmVudC5lcXVhbHMobW92aW5nQ2hpbGQuZUNvbnRhaW5lcigpKSkgewotICAgIAkJcmVzdWx0ID0gdHJ1ZTsKLSAgICAJfQotICAgIH0KLSAgICBlbHNlIGlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIFBhcnQpIHsKLSAgICAJaWYgKG5ld1BhcmVudCBpbnN0YW5jZW9mIE1lc3NhZ2UgJiYgbmV3UGFyZW50LmVxdWFscyhtb3ZpbmdDaGlsZC5lQ29udGFpbmVyKCkpKSB7Ci0gICAgCQlyZXN1bHQgPSB0cnVlOwotICAgIAl9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgCi0KLQotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyAgICBiZWdpblJlY29yZGluZygpOwotICAJaWYgKGNhbkV4ZWN1dGUoKSkgewotICAJCWlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIElucHV0KSB7Ci0gIAkJCUlucHV0IGlucHV0ID0gKElucHV0KSBtb3ZpbmdDaGlsZDsKLSAgCQkJT3BlcmF0aW9uSW1wbCBvcGVyYXRpb24gPSAoT3BlcmF0aW9uSW1wbCkgaW5wdXQuZUNvbnRhaW5lcigpOwotICAJCQkKLSAgCQkJaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgPT0gbnVsbCkgewotICAJCQkJLy8gSW5wdXQvT3V0cHV0IHN0eWxlCi0gIAkJCQlzZXRJbnB1dE91dHB1dE9yZGVyKG9wZXJhdGlvbiwgdHJ1ZSk7Ci0gIAkJCX0KLSAgCQkJZWxzZSB7Ci0gIAkJCQkvLyBPdXRwdXQvSW5wdXQgc3R5bGUKLSAgCQkJCXNldElucHV0T3V0cHV0T3JkZXIob3BlcmF0aW9uLCBmYWxzZSk7Ci0gIAkJCX0KLSAgCQl9Ci0gIAkJZWxzZSBpZiAobW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBPdXRwdXQpIHsKLSAJCQlPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgbW92aW5nQ2hpbGQ7Ci0gIAkJCU9wZXJhdGlvbkltcGwgb3BlcmF0aW9uID0gKE9wZXJhdGlvbkltcGwpIG91dHB1dC5lQ29udGFpbmVyKCk7Ci0gIAkJCQotICAJCQlpZiAobGVmdFNpYmxpbmdFZGl0UGFydCA9PSBudWxsKSB7Ci0gIAkJCQkvLyBPdXRwdXQvSW5wdXQgc3R5bGUKLSAgCQkJCXNldElucHV0T3V0cHV0T3JkZXIob3BlcmF0aW9uLCBmYWxzZSk7Ci0gIAkJCX0KLSAgCQkJZWxzZSB7Ci0gIAkJCQkvLyBJbnB1dC9PdXRwdXQgc3R5bGUKLSAgCQkJCXNldElucHV0T3V0cHV0T3JkZXIob3BlcmF0aW9uLCB0cnVlKTsKLSAgCQkJfQotICAJCX0KLSAgCQllbHNlIGlmIChtb3ZpbmdDaGlsZCBpbnN0YW5jZW9mIFBhcnQpIHsKLSAgCQkJTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG5ld1BhcmVudDsKLSAgCQkJTGlzdCBwYXJ0cyA9IG1lc3NhZ2UuZ2V0RVBhcnRzKCk7Ci0KLSAgCQkJcGFydHMucmVtb3ZlKG1vdmluZ0NoaWxkKTsKLQotICAJCQlpbnQgbGVmdEluZGV4ID0gLTEsIHJpZ2h0SW5kZXggPSAtMTsKLSAgCQkJaWYgKGxlZnRTaWJFbGVtZW50ICE9IG51bGwpIHsKLSAgCQkJCWxlZnRJbmRleCA9IHBhcnRzLmluZGV4T2YobGVmdFNpYkVsZW1lbnQpOwotICAJCQl9Ci0gIAkJCWlmIChyaWdodFNpYkVsZW1lbnQgIT0gbnVsbCkgewotICAJCQkJcmlnaHRJbmRleCA9IHBhcnRzLmluZGV4T2YocmlnaHRTaWJFbGVtZW50KTsKLSAgCQkJfQotCi0gIAkJCWlmIChsZWZ0SW5kZXggPT0gLTEpIHsKLSAgCQkJCS8vIEFkZCBtb3ZpbmcgY2hpbGQgdG8gdGhlIGZyb250Ci0gIAkJCQlwYXJ0cy5hZGQoMCwgbW92aW5nQ2hpbGQpOyAgCQkJCQotICAJCQl9Ci0gIAkJCWVsc2UgaWYgKHJpZ2h0SW5kZXggPT0gLTEpIHsKLSAgCQkJCS8vIEFkZCBtb3ZpbmcgY2hpbGQgdG8gdGhlIGVuZAotICAJCQkJcGFydHMuYWRkKG1vdmluZ0NoaWxkKTsKLSAgCQkJfQotICAJCQllbHNlIHsKLSAgCQkJCS8vIEFkZCBtb3ZpbmcgY2hpbGQgYWZ0ZXIgdGhlIG9jY3VyZW5jZSBvZiB0aGUgbGVmdCBzaWJsaW5nCi0gIAkJCQlwYXJ0cy5hZGQobGVmdEluZGV4ICsgMSwgbW92aW5nQ2hpbGQpOwotICAJCQl9Ci0gIAkJfQotICAJCXdzZGxFZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb3ZpbmdDaGlsZCkpOwotICAJfQotLy8gICAgZW5kUmVjb3JkaW5nKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldEZlZWRiYWNrRmlndXJlKCkgewotICAJSUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0gICAgaWYgKGZlZWRiYWNrRmlndXJlID09IG51bGwgJiYgbW92aW5nQ2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFdTRExUcmVlTm9kZUVkaXRQYXJ0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGZlZWRiYWNrRmlndXJlID0gbmV3IFBvbHlsaW5lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gIHBvbHlMaW5lLnNldExpbmVTdHlsZShHcmFwaGljcy5MSU5FX0RBU0hET1QpOyAgICAgIAotICAgICAgKChQb2x5bGluZSlmZWVkYmFja0ZpZ3VyZSkuc2V0TGluZVdpZHRoKDIpOwkKLSAgICAgIGRyYXdMaW5lcygoUG9seWxpbmUpIGZlZWRiYWNrRmlndXJlKTsKLSAgICB9Ci0gICAgCi0gIAlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0gIH0KLQotICAvKiBSZXR1cm4gYSBQb2ludExpc3Qgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGFkZCBhIGZlZWRiYWNrIGZpZ3VyZS4gIFRoZSBmZWVkYmFjayBmaWd1cmUgd2lsbCBiZSBhCi0gICAqIFBvbHlsaW5lIGNvbXBvc2VkIG9mIHRoZSBQb2ludHMgaW4gdGhlIFBvaW50TGlzdAotICAgKi8KLSAgcHJpdmF0ZSBQb2ludExpc3QgZHJhd0xpbmVzKFBvbHlsaW5lIHBvbHlMaW5lKSB7Ci0gICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IG5ldyBQb2ludExpc3QoKTsgCi0gICAgCi0gICAgaWYgKGxlZnRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkgewotICAgIAlSZWN0YW5nbGUgbGVmdFJlY3RhbmdsZSA9IGxlZnRTaWJsaW5nRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JICAgCWludCB4Q29vcmQgPSBsZWZ0UmVjdGFuZ2xlLnggKyAxNTsKLQkgIAlpbnQgeUNvb3JkID0gbGVmdFJlY3RhbmdsZS55OwotCSAgIAlpbnQgaGVpZ2h0ID0gbGVmdFJlY3RhbmdsZS5oZWlnaHQ7Ci0JICAgCWludCB3aWR0aCA9IGxlZnRSZWN0YW5nbGUud2lkdGggLSAxNTsKLQotCSAgIAkvLyBEcmF3IGxlZnQgZW5kIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0ICsgMywgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQgLSAzKTsKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0IC0gMywgeENvb3JkLCB5Q29vcmQgKyBoZWlnaHQpOwotCSAgIAkKLQkgICAJLy8gRHJhdyBob3Jpem9udGFsIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCwgeUNvb3JkICsgaGVpZ2h0LCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgaGVpZ2h0KTsKLQkgICAJCi0JICAgCS8vIERyYXcgcmlnaHQgZW5kIGxpbmUKLQkgICAJYWRkTGluZVRvUG9seWxpbmUocG9seUxpbmUsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQgKyBoZWlnaHQgLSAzKTsKLQkgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCArIGhlaWdodCArIDMpOyAgIAkKLSAgICB9Ci0gICAgZWxzZSBpZiAocmlnaHRTaWJsaW5nRWRpdFBhcnQgIT0gbnVsbCkgewotICAgIAlSZWN0YW5nbGUgcmlnaHRSZWN0YW5nbGUgPSByaWdodFNpYmxpbmdFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICAJaW50IHhDb29yZCA9IHJpZ2h0UmVjdGFuZ2xlLnggKyAxNTsKLSAgICAJaW50IHlDb29yZCA9IHJpZ2h0UmVjdGFuZ2xlLnk7Ci0gICAJCWludCBoZWlnaHQgPSByaWdodFJlY3RhbmdsZS5oZWlnaHQ7Ci0gICAJCWludCB3aWR0aCA9IHJpZ2h0UmVjdGFuZ2xlLndpZHRoIC0gMTU7CQotCi0gICAJCS8vIERyYXcgbGVmdCBlbmQgbGluZQotCSAgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgKyAzLCB4Q29vcmQsIHlDb29yZCAtIDMpOwotCSAgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQgLSAzLCB4Q29vcmQsIHlDb29yZCk7Ci0JICAgCQotCSAgIAkvLyBEcmF3IGhvcml6b250YWwgbGluZQotCSAgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkLCB5Q29vcmQsIHhDb29yZCArIHdpZHRoLCB5Q29vcmQpOwotCSAgIAkKLQkgICAJLy8gRHJhdyByaWdodCBlbmQgbGluZQotCSAgIAlhZGRMaW5lVG9Qb2x5bGluZShwb2x5TGluZSwgeENvb3JkICsgd2lkdGgsIHlDb29yZCwgeENvb3JkICsgd2lkdGgsIHlDb29yZCAtIDMpOwotCSAgCWFkZExpbmVUb1BvbHlsaW5lKHBvbHlMaW5lLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkLCB4Q29vcmQgKyB3aWR0aCwgeUNvb3JkICsgMyk7ICAgCi0gICAgfQotCi0gICAgcmV0dXJuIHBvaW50TGlzdDsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0gIAotICBwcm90ZWN0ZWQgUG9seWxpbmUgYWRkTGluZVRvUG9seWxpbmUoUG9seWxpbmUgcG9seWxpbmUsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotCXBvbHlsaW5lLmFkZFBvaW50KG5ldyBQb2ludCh4MSwgeTEpKTsKLQlwb2x5bGluZS5hZGRQb2ludChuZXcgUG9pbnQoeDIsIHkyKSk7Ci0KLQlyZXR1cm4gcG9seWxpbmU7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIC8qCi0gICAqIFByZS1jb25kaXRpb246IFRoZSBMaXN0IHNpYmxpbmdzIHNob3VsZCBiZSBzb3J0ZWQgYnkgaXQncyB5LWNvb3JkaW5hdGUgCi0gICAqLwotICBwcml2YXRlIFdTRExUcmVlTm9kZUVkaXRQYXJ0IGdldFZlcnRpY2FsUmlnaHRTaWJsaW5nKExpc3Qgc2libGluZ3MsIFdTRExUcmVlTm9kZUVkaXRQYXJ0IG1vdmluZ0VkaXRQYXJ0LCBQb2ludCBwb2ludGVyTG9jYXRpb24pIHsKLSAgCVdTRExUcmVlTm9kZUVkaXRQYXJ0IHJpZ2h0U2libGluZyA9IG51bGw7Ci0gIAlpbnQgcG9pbnRlcllMb2NhdGlvbiA9IHBvaW50ZXJMb2NhdGlvbi55OwotCi0gIAlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2libGluZ3Muc2l6ZSgpOyBpbmRleCsrKSB7Ci0gIAkJV1NETFRyZWVOb2RlRWRpdFBhcnQgc2libGluZyA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgc2libGluZ3MuZ2V0KGluZGV4KTsKLSAgCQlpbnQgc2libGluZ1lMb2NhdGlvbiA9IHNpYmxpbmcuZ2V0U2VsZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCkueTsKLQotICAJCWlmIChzaWJsaW5nWUxvY2F0aW9uID4gcG9pbnRlcllMb2NhdGlvbikgewotICAJCQlyaWdodFNpYmxpbmcgPSBzaWJsaW5nOwotICAJCQlicmVhazsKLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiByaWdodFNpYmxpbmc7Ci0gIH0KLQotICAvKgotICAgKiBQcmUtY29uZGl0aW9uOiBUaGUgTGlzdCBzaWJsaW5ncyBzaG91bGQgYmUgc29ydGVkIGJ5IGl0J3MgeS1jb29yZGluYXRlIAotICAgKi8KLSAgcHJpdmF0ZSBXU0RMVHJlZU5vZGVFZGl0UGFydCBnZXRWZXJ0aWNhbExlZnRTaWJsaW5nKExpc3Qgc2libGluZ3MsIFdTRExUcmVlTm9kZUVkaXRQYXJ0IG1vdmluZ0VkaXRQYXJ0LCBQb2ludCBwb2ludGVyTG9jYXRpb24pIHsKLSAgCVdTRExUcmVlTm9kZUVkaXRQYXJ0IGxlZnRTaWJsaW5nID0gbnVsbDsKLSAgCWludCBwb2ludGVyWUxvY2F0aW9uID0gcG9pbnRlckxvY2F0aW9uLnk7Ci0KLSAgCWludCBpbmRleDsKLSAgCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNpYmxpbmdzLnNpemUoKTsgaW5kZXgrKykgewotICAJCVdTRExUcmVlTm9kZUVkaXRQYXJ0IHNpYmxpbmcgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCk7Ci0gIAkJaW50IHNpYmxpbmdZTG9jYXRpb24gPSBzaWJsaW5nLmdldFNlbGVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpLnk7Ci0gIAkgIAkKLSAgCQlpZiAoc2libGluZ1lMb2NhdGlvbiA+IHBvaW50ZXJZTG9jYXRpb24pIHsKLSAgCQkJaWYgKGluZGV4ID4gMCkgewotICAJCQkJbGVmdFNpYmxpbmcgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotICAJCQl9Ci0KLSAgCQkJYnJlYWs7Ci0gIAkJfQotICAJfQotCi0gIAlpZiAoaW5kZXggPT0gc2libGluZ3Muc2l6ZSgpKSB7Ci0gIAkJbGVmdFNpYmxpbmcgPSAoV1NETFRyZWVOb2RlRWRpdFBhcnQpIHNpYmxpbmdzLmdldChpbmRleCAtIDEpOwotICAJfQotCi0gIAlyZXR1cm4gbGVmdFNpYmxpbmc7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFZGl0UGFydCBnZXRQYXJlbnRFZGl0UGFydChFZGl0UGFydCB0YXJnZXQpCi0gIHsKLSAgCXJldHVybiB0YXJnZXQuZ2V0UGFyZW50KCk7Ci0gIH0KLSAgCi0gIC8vIGJvb2xlYW4gaW5wdXRGaXJzdCA9IHRydWUgaWYgdGhlIElucHV0IGlzIHRoZSBmaXJzdCBpbiB0aGUgb3JkZXIgb2YgSW5wdXQgYW5kIE91dHB1dAotICBwcml2YXRlIHZvaWQgc2V0SW5wdXRPdXRwdXRPcmRlcihPcGVyYXRpb25JbXBsIG9wZXJhdGlvbiwgYm9vbGVhbiBpbnB1dEZpcnN0KSB7Ci0gIAkvLyBXZSBuZWVkIHRvIGRldGVybWluZSBtb3JlIGluZm8gYmVmb3JlIHdlIGNhbiBzZXQgdGhlIHN0eWxlCQotICAJaWYgKGlucHV0Rmlyc3QgJiYgb3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLSAgCQkvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBPdXRwdXQKLSAgCQlpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKSB7Ci0gIAkJCS8vIE9yZGVyIGlzOiBJbnB1dCwgT3V0cHV0Ci0vKiAgCQkJCi0gIAkJCU5vZGUgb3BlcmF0aW9uTm9kZSA9IG9wZXJhdGlvbi5nZXRFbGVtZW50KCk7CQkKLSAgCQkJTm9kZUxpc3QgY2hpbGROb2RlTGlzdCA9IG9wZXJhdGlvbk5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAJCQkKLSAgCQkJTm9kZSBpbnB1dE5vZGUgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCkuZ2V0RWxlbWVudCgpOwotICAJCQlOb2RlIG91dHB1dE5vZGUgPSBvcGVyYXRpb24uZ2V0RU91dHB1dCgpLmdldEVsZW1lbnQoKTsKLSAgCQkJCi0gIAkJCU5vZGUgaW5wdXRUZXh0Tm9kZSA9IGlucHV0Tm9kZS5nZXROZXh0U2libGluZygpOwotICAJCQlOb2RlIG91dHB1dFRleHROb2RlID0gb3V0cHV0Tm9kZS5nZXROZXh0U2libGluZygpOwotICAJCQkKLSAgCQkJaW50IGlucHV0Tm9kZUluZGV4ID0gZ2V0Tm9kZUluZGV4KGNoaWxkTm9kZUxpc3QsIGlucHV0Tm9kZSk7Ci0gIAkJCWludCBvdXRwdXROb2RlSW5kZXggPSBnZXROb2RlSW5kZXgoY2hpbGROb2RlTGlzdCwgb3V0cHV0Tm9kZSk7Ci0gIAkJCQotICAJCQlpZiAoaW5wdXROb2RlSW5kZXggPiBvdXRwdXROb2RlSW5kZXgpIHsKLSAgCQkJCS8vIFdlIG5lZWQgdG8gc3dhcCBJbnB1dCBhbmQgT3V0cHV0Ci0gIAkJCQlvcGVyYXRpb25Ob2RlLnJlbW92ZUNoaWxkKGlucHV0Tm9kZSk7Ci0gIAkJCQlvcGVyYXRpb25Ob2RlLnJlbW92ZUNoaWxkKG91dHB1dE5vZGUpOwotICAJCQkJCi0gIAkJCQlvcGVyYXRpb25Ob2RlLmluc2VydEJlZm9yZShpbnB1dE5vZGUsIG91dHB1dFRleHROb2RlKTsKLSAgCQkJCW9wZXJhdGlvbk5vZGUuaW5zZXJ0QmVmb3JlKG91dHB1dE5vZGUsIGlucHV0VGV4dE5vZGUpOwotICAJCQl9Ci0qLyAgCQkJCi0gIAkJCQotICAJCQlzZXRPcGVyYXRpb25TdHlsZShvcGVyYXRpb24sIE9wZXJhdGlvblR5cGUuUkVRVUVTVF9SRVNQT05TRSk7Ci0gIAkJfQotICAJCS8qCi0gIAkJZWxzZSB7Ci0gIAkJCS8vIE9yZGVyIGlzOiBJbnB1dAotICAJCQlzZXRPcGVyYXRpb25TdHlsZShvcGVyYXRpb24sIE9wZXJhdGlvblR5cGUuT05FX1dBWSk7Ci0gIAkJfQotICAJCSovCi0gIAl9Ci0gIAllbHNlIGlmIChvcGVyYXRpb24uZ2V0RU91dHB1dCgpICE9IG51bGwpIHsKLSAgCQkvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBJbnB1dAotICAJCWlmIChvcGVyYXRpb24uZ2V0RUlucHV0KCkgIT0gbnVsbCkgewotICAJCQkvLyBPcmRlciBpczogT3V0cHV0LCBJbnB1dAotLyogIAkJCQotICAJCQlOb2RlIG9wZXJhdGlvbk5vZGUgPSBvcGVyYXRpb24uZ2V0RWxlbWVudCgpOwkJCi0gIAkJCU5vZGVMaXN0IGNoaWxkTm9kZUxpc3QgPSBvcGVyYXRpb25Ob2RlLmdldENoaWxkTm9kZXMoKTsKLSAgCQkJCi0gIAkJCU5vZGUgaW5wdXROb2RlID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpLmdldEVsZW1lbnQoKTsKLSAgCQkJTm9kZSBvdXRwdXROb2RlID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKS5nZXRFbGVtZW50KCk7Ci0gIAkJCQotICAJCQlOb2RlIGlucHV0VGV4dE5vZGUgPSBpbnB1dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgCQkJTm9kZSBvdXRwdXRUZXh0Tm9kZSA9IG91dHB1dE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLSAgCQkJCi0gIAkJCWludCBpbnB1dE5vZGVJbmRleCA9IGdldE5vZGVJbmRleChjaGlsZE5vZGVMaXN0LCBpbnB1dE5vZGUpOwotICAJCQlpbnQgb3V0cHV0Tm9kZUluZGV4ID0gZ2V0Tm9kZUluZGV4KGNoaWxkTm9kZUxpc3QsIG91dHB1dE5vZGUpOwotICAJCQkKLSAgCQkJaWYgKG91dHB1dE5vZGVJbmRleCA+IGlucHV0Tm9kZUluZGV4KSB7Ci0gIAkJCQkvLyBXZSBuZWVkIHRvIHN3YXAgSW5wdXQgYW5kIE91dHB1dAotICAJCQkJb3BlcmF0aW9uTm9kZS5yZW1vdmVDaGlsZChpbnB1dE5vZGUpOwotICAJCQkJb3BlcmF0aW9uTm9kZS5yZW1vdmVDaGlsZChvdXRwdXROb2RlKTsKLQotICAJCQkJb3BlcmF0aW9uTm9kZS5pbnNlcnRCZWZvcmUoaW5wdXROb2RlLCBvdXRwdXRUZXh0Tm9kZSk7Ci0gIAkJCQlvcGVyYXRpb25Ob2RlLmluc2VydEJlZm9yZShvdXRwdXROb2RlLCBpbnB1dFRleHROb2RlKTsKLSAgCQkJfQotKi8gIAkJCQotICAJCQlzZXRPcGVyYXRpb25TdHlsZShvcGVyYXRpb24sIE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRSk7Ci0gIAkJfQotICAJCS8qCi0gIAkJZWxzZSB7Ci0gIAkJCS8vIE9yZGVyIGlzOiBPdXRwdXQKLSAgCQkJc2V0T3BlcmF0aW9uU3R5bGUob3BlcmF0aW9uLCBPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTik7Ci0gIAkJfQotICAJCSovCi0gIAl9Ci0gIH0KLQotLyoKLSAqIHJldHVybiAtMSBpZiBub2RlIGlzIG5vdCBmb3VuZCBpbiB0aGUgZ2l2ZW4gbm9kZUxpc3QKLSAqLwotCXByaXZhdGUgaW50IGdldE5vZGVJbmRleChOb2RlTGlzdCBub2RlTGlzdCwgTm9kZSBub2RlKSB7Ci0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlIChpbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpICYmICEobm9kZUxpc3QuaXRlbShpbmRleCkuZXF1YWxzKG5vZGUpKSkgewotCQkJaW5kZXgrKzsKLQkJfQotCQkKLQkJaWYgKGluZGV4ID49IG5vZGVMaXN0LmdldExlbmd0aCgpKSB7Ci0JCQlpbmRleCA9IC0xOwotCQl9Ci0JCQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNldE9wZXJhdGlvblN0eWxlKE9wZXJhdGlvbkltcGwgb3BlcmF0aW9uLCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUpIHsKLSAgCS8vIElmIHRoZXJlIGlzIG5vIHN0eWxlIHRvIGJlZ2luIHdpdGgsIGRvbid0IHNldCBvbmUgbm93Ci0gIAlpZiAob3BlcmF0aW9uLmdldFN0eWxlKCkgPT0gbnVsbCkgewotICAJCXJldHVybjsKLSAgCX0KLSAgCQotICAJb3BlcmF0aW9uLnNldFN0eWxlKG9wZXJhdGlvblR5cGUpOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIFZlcnRpY2FsRWRpdFBhcnRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0gIAkKLSAgCXB1YmxpYyBWZXJ0aWNhbEVkaXRQYXJ0Q29tcGFyYXRvcigpIHsKLSAgCX0KLSAgCQotICAJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBwYXJ0MSwgT2JqZWN0IHBhcnQyKSB7Ci0gIAkJaW50IGNvbXBhcmVWYWx1ZSA9IDA7Ci0KLSAgCQlpZiAocGFydDEgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCAmJiBwYXJ0MiBpbnN0YW5jZW9mIFdTRExUcmVlTm9kZUVkaXRQYXJ0KSB7Ci0gIAkJCVdTRExUcmVlTm9kZUVkaXRQYXJ0IGVkaXRQYXJ0MSA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgcGFydDE7Ci0gIAkJCVdTRExUcmVlTm9kZUVkaXRQYXJ0IGVkaXRQYXJ0MiA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgcGFydDI7Ci0gIAkJCQotICAJCQlpbnQgZWRpdFBhcnQxWSA9IGVkaXRQYXJ0MS5nZXRTZWxlY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55OwotICAJCQlpbnQgZWRpdFBhcnQyWSA9IGVkaXRQYXJ0Mi5nZXRTZWxlY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKS55OwotICAJCQkKLSAgCQkJSW50ZWdlciBpbnRlZ2VyUGFydDEgPSBuZXcgSW50ZWdlcihlZGl0UGFydDFZKTsKLSAgCQkJSW50ZWdlciBpbnRlZ2VyUGFydDIgPSBuZXcgSW50ZWdlcihlZGl0UGFydDJZKTsKLSAgCQkJCi0gIAkJCWNvbXBhcmVWYWx1ZSA9IGludGVnZXJQYXJ0MS5jb21wYXJlVG8oaW50ZWdlclBhcnQyKTsKLSAgCQl9Ci0KLSAgCQlyZXR1cm4gY29tcGFyZVZhbHVlOwotICAJfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnU2V0TWVzc2FnZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRHJhZ1NldE1lc3NhZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhN2Q0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExEcmFnU2V0TWVzc2FnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5XU0RMQ29tcG9uZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5Hcm91cEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5XU0RMVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSUNvbm5lY3RlZEZpZ3VyZTsKLQotcHVibGljIGNsYXNzIFdTRExEcmFnU2V0TWVzc2FnZUFjdGlvbiBleHRlbmRzIFdTRExEcmFnQWN0aW9uIHsKLQlwcm90ZWN0ZWQgRWRpdFBhcnQgcG9pbnRlckVkaXRQYXJ0OwotCXByb3RlY3RlZCBXU0RMRWxlbWVudCBtb3ZpbmdDaGlsZDsKLQlwcm90ZWN0ZWQgV1NETEVsZW1lbnQgcG9pbnRlck1vZGVsRWxlbWVudDsKLQkKLQlwdWJsaWMgV1NETERyYWdTZXRNZXNzYWdlQWN0aW9uKFdTRExUcmVlTm9kZUVkaXRQYXJ0IG1vdmluZ0NoaWxkRWRpdFBhcnQsIEVkaXRQYXJ0IHBvaW50ZXJFZGl0UGFydCwgUG9pbnQgcG9pbnRlckxvY2F0aW9uKSB7Ci0JCXRoaXMubW92aW5nQ2hpbGRFZGl0UGFydCA9IG1vdmluZ0NoaWxkRWRpdFBhcnQ7Ci0JCXRoaXMucG9pbnRlckVkaXRQYXJ0ID0gcG9pbnRlckVkaXRQYXJ0OwotCQl0aGlzLnBvaW50ZXJMb2NhdGlvbiA9IHBvaW50ZXJMb2NhdGlvbjsKLQkJCi0JCW1vdmluZ0NoaWxkID0gKFdTRExFbGVtZW50KSBtb3ZpbmdDaGlsZEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCXBvaW50ZXJNb2RlbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIHBvaW50ZXJFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkKLQkJLy8gQWxsb3cgdGhlIHVzZXIgdG8gaG92ZXIgb3ZlciBhIFBhcnQgKG9mIGEgTWVzc2FnZSkgdG8gc2V0IHRoZSBNZXNzYWdlCi0JCWlmIChwb2ludGVyTW9kZWxFbGVtZW50IGluc3RhbmNlb2YgUGFydCkgewotCQkJdGhpcy5wb2ludGVyRWRpdFBhcnQgPSBwb2ludGVyRWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQlwb2ludGVyTW9kZWxFbGVtZW50ID0gKFdTRExFbGVtZW50KSB0aGlzLnBvaW50ZXJFZGl0UGFydC5nZXRNb2RlbCgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCSAgICBpZiAocG9pbnRlck1vZGVsRWxlbWVudCA9PSBudWxsIHx8IG1vdmluZ0NoaWxkID09IG51bGwpIHsKLQkgICAgCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgICAKLQkgICAgaWYgKG1vdmluZ0NoaWxkIGluc3RhbmNlb2YgSW5wdXQgfHwgbW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBPdXRwdXQgfHwgbW92aW5nQ2hpbGQgaW5zdGFuY2VvZiBGYXVsdCkgewotCSAgICAJaWYgKHBvaW50ZXJNb2RlbEVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7Ci0JICAgIAkJcmVzdWx0ID0gdHJ1ZTsKLQkgICAgCX0KLQkgICAgfQotCi0JICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGNhbkV4ZWN1dGUoKSkgewotCQkJTWVzc2FnZVJlZmVyZW5jZSBtZXNzYWdlUmVmZXJlbmNlID0gKE1lc3NhZ2VSZWZlcmVuY2UpIG1vdmluZ0NoaWxkOwotCQkJbWVzc2FnZVJlZmVyZW5jZS5zZXRFTWVzc2FnZSgoTWVzc2FnZSkgcG9pbnRlck1vZGVsRWxlbWVudCk7Ci0JCQkoKFdTRExFbGVtZW50SW1wbCkgbWVzc2FnZVJlZmVyZW5jZSkudXBkYXRlRWxlbWVudCh0cnVlKTsKLQkJCQotCQkJV1NETEVkaXRvciB3c2RsRWRpdG9yID0gKChXU0RMQ29tcG9uZW50Vmlld2VyKSBwb2ludGVyRWRpdFBhcnQuZ2V0Vmlld2VyKCkpLmdldFdTRExFZGl0b3IoKTsKLQkJCXdzZGxFZGl0b3IuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtb3ZpbmdDaGlsZCkpOwotCQl9Ci0JfQotCi0JcHVibGljIElGaWd1cmUgZ2V0RmVlZGJhY2tGaWd1cmUoKSB7Ci0JCVBvbHlsaW5lIHBvbHlmaWd1cmUgPSBuZXcgUG9seWxpbmUoKTsKLQkJR3JvdXBFZGl0UGFydCBsZWZ0R3JvdXBFZGl0UGFydCA9IGdldEdyb3VwRWRpdFBhcnQobW92aW5nQ2hpbGRFZGl0UGFydCk7Ci0JCUdyb3VwRWRpdFBhcnQgcmlnaHRHcm91cEVkaXRQYXJ0ID0gZ2V0R3JvdXBFZGl0UGFydChwb2ludGVyRWRpdFBhcnQpOwotCQlpbnQgbXggPSByaWdodEdyb3VwRWRpdFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCAtIDU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gCi0gICAgICAgIGRyYXdMaW5lKHBvbHlmaWd1cmUsIGxlZnRHcm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24uZ2V0RmlndXJlKCksICgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcG9pbnRlckVkaXRQYXJ0KS5nZXRGaWd1cmUoKSwgbXgpOwotCQkKLQkJcmV0dXJuIHBvbHlmaWd1cmU7Ci0JfQotCQotCSAgcHJvdGVjdGVkIHZvaWQgZHJhd0xpbmUoUG9seWxpbmUgZmVlZGJhY2tGaWd1cmUsIElGaWd1cmUgYSwgSUZpZ3VyZSBiLCBpbnQgbXgpCi0JICB7Ci0JICAgICAgICBSZWN0YW5nbGUgcjEgPSBnZXRDb25uZWN0aW9uQm91bmRzKGEpOwotCSAgICAgICAgUmVjdGFuZ2xlIHIyID0gZ2V0Q29ubmVjdGlvbkJvdW5kcyhiKTsKLQkgICAgICAgIGludCB4MSA9IHIxLnggKyByMS53aWR0aDsKLQkgICAgICAgIGludCB5MSA9IHIxLnkgKyByMS5oZWlnaHQgLyAyOwotCSAgICAgICAgaW50IHgyID0gcjIueCAtIDE7Ci0JICAgICAgICBpbnQgeTIgPSByMi55ICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAgICAgICAgLy8gZHJhdyBob3Jpem9udGFsIGxpbmUKLQkgICAgICAgCWFkZExpbmVUb1BvbHlsaW5lKGZlZWRiYWNrRmlndXJlLCB4MSwgeTEsIG14LCB5MSk7Ci0KLQkgICAgICAgIC8vIGRyYXcgaG9yaXpvbnRhbCBsaW5lCi0JICAgICAgIAlhZGRMaW5lVG9Qb2x5bGluZShmZWVkYmFja0ZpZ3VyZSwgbXgsIHkyLCB4MiAtIDEsIHkyKTsKLQotCSAgICAgICAgLy8gZHJhdyB0aGUgYXJyb3cgaGVhZAotCSAgICAgICAJYWRkTGluZVRvUG9seWxpbmUoZmVlZGJhY2tGaWd1cmUsIHgyIC0gMSwgeTIsIHgyIC0gNCwgeTIgLSAzKTsKLQkgICAgICAgCWFkZExpbmVUb1BvbHlsaW5lKGZlZWRiYWNrRmlndXJlLCB4MiAtIDEsIHkyLCB4MiAtIDQsIHkyICsgMyk7Ci0JICB9Ci0KLQkgIHByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0Q29ubmVjdGlvbkJvdW5kcyhJRmlndXJlIGZpZ3VyZSkKLQkgIHsgICAgICAgICAgICAgICAgIAotCSAgICBSZWN0YW5nbGUgciA9IG51bGw7Ci0JICAgIGlmIChmaWd1cmUgaW5zdGFuY2VvZiBJQ29ubmVjdGVkRmlndXJlKQotCSAgICB7Ci0JICAgICAgSUNvbm5lY3RlZEZpZ3VyZSBjb25uZWN0ZWRGaWd1cmUgPSAoSUNvbm5lY3RlZEZpZ3VyZSlmaWd1cmU7Ci0JICAgICAgciA9IGNvbm5lY3RlZEZpZ3VyZS5nZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgciA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLQkgICAgfQotCSAgICByZXR1cm4gcjsgCi0JICB9ICAgICAgICAgICAgICAgICAgICAgIAotCSAgCi0JICBwcm90ZWN0ZWQgUG9seWxpbmUgYWRkTGluZVRvUG9seWxpbmUoUG9seWxpbmUgcG9seWxpbmUsIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikgewotICAgICAgCXBvbHlsaW5lLmFkZFBvaW50KG5ldyBQb2ludCh4MSwgeTEpKTsKLSAgICAgIAlwb2x5bGluZS5hZGRQb2ludChuZXcgUG9pbnQoeDIsIHkyKSk7Ci0gICAgICAJcG9seWxpbmUuc2V0TGluZVdpZHRoKDEpOwotICAgICAgCS8vcG9seWxpbmUuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfRE9UKTsKLSAgICAgIAkKLSAgICAgIAlyZXR1cm4gcG9seWxpbmU7Ci0JICB9Ci0JICAKLQkgIHByaXZhdGUgR3JvdXBFZGl0UGFydCBnZXRHcm91cEVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JICAJRWRpdFBhcnQgcGFyZW50UGFydCA9IGVkaXRQYXJ0LmdldFBhcmVudCgpOwotCSAgCQotCSAgCWlmIChwYXJlbnRQYXJ0ID09IG51bGwpIHsKLQkgIAkJcmV0dXJuIG51bGw7Ci0JICAJfQotCSAgCWlmICghKHBhcmVudFBhcnQgaW5zdGFuY2VvZiBHcm91cEVkaXRQYXJ0KSkgewotCSAgCQlwYXJlbnRQYXJ0ID0gZ2V0R3JvdXBFZGl0UGFydChwYXJlbnRQYXJ0KTsKLQkgIAl9Ci0JICAJCi0JICAJcmV0dXJuIChHcm91cEVkaXRQYXJ0KSBwYXJlbnRQYXJ0OwotCSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETEVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4MGU3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLldTRExFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzLk5ld0NvbXBvbmVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExFbGVtZW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBXU0RMRWxlbWVudENvbW1hbmQgbW9kZWxDb21tYW5kOwotICBwcml2YXRlIFN0cmluZyB1bmRvRGVzY3JpcHRpb247Ci0gIHByaXZhdGUgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudEFjdGlvbgotICAJKFdTRExFbGVtZW50Q29tbWFuZCBjb21tYW5kLAotICAJIFN0cmluZyB1bmRvRGVzY3JpcHRpb24sCi0gIAkgU3RyaW5nIGxhYmVsLAotICAJIEltYWdlRGVzY3JpcHRvciBpbWFnZSkKLSAgewotICAgIHN1cGVyKGxhYmVsLGltYWdlKTsKLSAgICBtb2RlbENvbW1hbmQgPSBjb21tYW5kOwotICAgIHRoaXMudW5kb0Rlc2NyaXB0aW9uID0gdW5kb0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiB1bmRvRGVzY3JpcHRpb247Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgZ2V0T3duZXIoKTsKLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIHNob3dEaWFsb2coKTsKLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBib29sZWFuIG9rID0gc2hvd0RpYWxvZygpOwotICAgIGlmIChvaykKLSAgICB7Ci0JICAgIHByZVJ1bigpOwotCSAgICBtb2RlbENvbW1hbmQucnVuKCk7Ci0JICAgIGZvcm1hdCgpOwotCSAgICBzZWxlY3RPYmplY3QoKTsKLQkgICAgcG9zdFJ1bigpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcHJlUnVuKCkKLSAgewotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwb3N0UnVuKCkKLSAgewotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKCkKLSAgeyAgICAKLSAgICBOb2RlIG5vZGUgPSBudWxsOwotICAgIGlmIChnZXRPd25lcigpICE9IG51bGwpCi0gICAgICBub2RlID0gZ2V0T3duZXIoKS5nZXRFbGVtZW50KCk7IAotICAgIAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIGdldFVuZG9EZXNjcmlwdGlvbigpKTsgIAotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmRSZWNvcmRpbmcoKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBOb2RlIG5vZGUgPSBudWxsOwotICAgIGlmIChnZXRPd25lcigpICE9IG51bGwpCi0gICAgICBub2RlID0gZ2V0T3duZXIoKS5nZXRFbGVtZW50KCk7IAotICAgIAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBtb2RlbENvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGZvcm1hdCgpCi0gIHsKLSAgICBOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotICAgIGlmIChnZXRPd25lcigpICE9IG51bGwpCi0gICAgICBwYXJlbnROb2RlID0gZ2V0T3duZXIoKS5nZXRFbGVtZW50KCk7IAotICAgIAotICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIAotICAgIHsKLQkJICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICBmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpcGFyZW50Tm9kZSk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2VsZWN0T2JqZWN0KCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgZ2V0T3duZXIoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRXU0RMRWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKWVkaXRvclBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfSAgIAotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIHNob3dEaWFsb2dIZWxwZXIoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVmYXVsdE5hbWUpCi0gIHsgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gZGVmYXVsdE5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTmV3Q29tcG9uZW50RGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdDb21wb25lbnREaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB0aXRsZSwgZGVmYXVsdE5hbWUpOwotICAgIGludCByYyA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0gICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGlhbG9nLmdldE5hbWUoKTsgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMRWxlbWVudFVJQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExFbGVtZW50VUlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkOTVjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExFbGVtZW50VUlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuV1NETEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETEVsZW1lbnRVSUFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnRDb21tYW5kIG1vZGVsQWN0aW9uOwotICBwcml2YXRlIFN0cmluZyB1bmRvRGVzY3JpcHRpb247Ci0gIHByaXZhdGUgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudFVJQWN0aW9uCi0gIAkoV1NETEVsZW1lbnRDb21tYW5kIGFjdGlvbiwKLSAgCSBTdHJpbmcgdW5kb0Rlc2NyaXB0aW9uLAotICAJIFN0cmluZyBsYWJlbCwKLSAgCSBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpCi0gIHsKLSAgICBzdXBlcihsYWJlbCxpbWFnZSk7Ci0gICAgbW9kZWxBY3Rpb24gPSBhY3Rpb247Ci0gICAgdGhpcy51bmRvRGVzY3JpcHRpb24gPSB1bmRvRGVzY3JpcHRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHVuZG9EZXNjcmlwdGlvbjsKLSAgfQotCi0gIHByaXZhdGUgTm9kZSBnZXRPd25lck5vZGUoKQotICB7Ci0gICAgaWYgKGdldE93bmVyKCkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBnZXRPd25lcigpLmdldEVsZW1lbnQoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBXU0RMRWxlbWVudCBnZXRPd25lcigpOwotICAKLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0RpYWxvZygpOwotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGJvb2xlYW4gb2sgPSBzaG93RGlhbG9nKCk7Ci0gICAgaWYgKG9rKQotICAgIHsKLQkgICAgcHJlUnVuKCk7Ci0JICAgIG1vZGVsQWN0aW9uLnJ1bigpOwotCSAgICBmb3JtYXQoKTsKLQkgICAgc2VsZWN0T2JqZWN0KCk7Ci0JICAgIHBvc3RSdW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHByZVJ1bigpCi0gIHsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcG9zdFJ1bigpCi0gIHsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZygpCi0gIHsgICAgCi0gICAgTm9kZSBub2RlID0gZ2V0T3duZXJOb2RlKCk7ICAKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBnZXRVbmRvRGVzY3JpcHRpb24oKSk7ICAKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW5kUmVjb3JkaW5nKCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgTm9kZSBub2RlID0gZ2V0T3duZXJOb2RlKCk7IAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgIAotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBtb2RlbEFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgZm9ybWF0KCkKLSAgewotICAgIE5vZGUgcGFyZW50Tm9kZSA9IGdldE93bmVyTm9kZSgpOwotICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIAotICAgIHsKLQkJICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICBmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpcGFyZW50Tm9kZSk7ICAgICAgCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc2VsZWN0T2JqZWN0KCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIGlmIChlZGl0b3JQYXJ0ICE9IG51bGwgJiYgZ2V0T3duZXIoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvYmplY3QgPSBnZXRXU0RMRWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKWVkaXRvclBhcnQuZ2V0QWRhcHRlcihJU2VsZWN0aW9uUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHNlbGVjdGlvblByb3ZpZGVyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3QpKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfSAgIAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETE1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDAxZGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2FjdGlvbnMvV1NETE1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMU3dpdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRJbnB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkTWVzc2FnZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkT3BlcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JTWVudUFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5XU0RMVHJlZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHMuTmV3Q29tcG9uZW50RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHMuTmV3Q29tcG9uZW50V2l0aENoaWxkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHMuQmluZGluZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzLlBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFdTRExNZW51QWN0aW9uQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJTWVudUFjdGlvbkNvbnRyaWJ1dG9yCi17Ci0gIHByb3RlY3RlZCBBZGRFRU1lbnVBY3Rpb25Db250cmlidXRvciBhZGRFRU1lbnVBY3Rpb25Db250cmlidXRvcjsKLSAgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLQotICBwdWJsaWMgV1NETE1lbnVBY3Rpb25Db250cmlidXRvcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgYWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IgPSBuZXcgQWRkRUVNZW51QWN0aW9uQ29udHJpYnV0b3IoKTsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGNyZWF0ZUxpc3QoQWN0aW9uIGFjdGlvbikKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChhY3Rpb24pOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotCXByaXZhdGUgY2xhc3MgT3BlblNjaGVtYU9uU2VsZWN0aW9uSGVscGVyIGV4dGVuZHMgQWN0aW9uIHsKLQkJT2JqZWN0IG9iamVjdDsKLQkJCi0JCXB1YmxpYyBPcGVuU2NoZW1hT25TZWxlY3Rpb25IZWxwZXIoT2JqZWN0IG9iamVjdCkgewotCQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9PUEVOX0lNUE9SVCIpKTsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW1wb3J0KSB7Ci0JCQkJU3RyaW5nIGxvY2F0aW9uID0gKChJbXBvcnQpIG9iamVjdCkuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkKLQkJCQlpZiAobG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi50cmltKCkuZXF1YWxzKCIiKSkKLQkJCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIG9iamVjdCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCQkJb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5PcGVuT25TZWxlY3Rpb25IZWxwZXIgaGVscGVyID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuT3Blbk9uU2VsZWN0aW9uSGVscGVyKGRlZmluaXRpb24pOwotCQkgICAgaGVscGVyLm9wZW5FZGl0b3IoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBvYmplY3QpOwotCQl9Ci0JfQotCi0gIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVNZW51QWN0aW9ucyhmaW5hbCBJTWVudU1hbmFnZXIgbWVudSwgZmluYWwgTm9kZSBub2RlLCBPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgZmluYWwgSU1lbnVNYW5hZ2VyIGFkZE1lbnU7Ci0gICAgYm9vbGVhbiBhZGRFZGl0QWN0aW9uID0gZmFsc2U7Ci0gICAgZmluYWwgYm9vbGVhbiBpc0VkaXRhYmxlID0gKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSk7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50ICYmIG5vZGUgIT0gbnVsbCAmJiBpc0VkaXRhYmxlKQotICAgIHsKLSAgICAgIGFkZEVkaXRBY3Rpb24gPSB0cnVlOwotICAgICAgYWRkTWVudSA9IG5ldyBNZW51TWFuYWdlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NISUxEIiksICJhZGRjaGlsZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIG1lbnUuYWRkKGFkZE1lbnUpOwotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChXU0RMRWxlbWVudCkgb2JqZWN0KS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0KLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbXBvcnQpIHsKLSAgICAgIAltZW51LmFkZChuZXcgT3BlblNjaGVtYU9uU2VsZWN0aW9uSGVscGVyKG9iamVjdCkpOwotICAgICAgfQotICAgICAgCi0gICAgICBXU0RMU3dpdGNoIHdzZGxTd2l0Y2ggPSBuZXcgV1NETFN3aXRjaCgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRWRpdGFibGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEJpbmRpbmdPcGVyYXRpb25BY3Rpb24obm9kZSwgIk5ld0JpbmRpbmdPcGVyYXRpb24iLCBwcmVmaXgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgbWVudS5hZGQoY3JlYXRlU2V0UG9ydFR5cGVNZW51KGJpbmRpbmcsIGlzRWRpdGFibGUpKTsKLSAgICAgICAgICBtZW51LmFkZChuZXcgR2VuZXJhdGVCaW5kaW5nQ29udGVudEFjdGlvbihiaW5kaW5nLCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VkaXRhYmxlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRCaW5kaW5nSW5wdXRBY3Rpb24oZWRpdG9yUGFydCwgbm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkQmluZGluZ091dHB1dEFjdGlvbihlZGl0b3JQYXJ0LCBub2RlLCBwcmVmaXgpKTsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRCaW5kaW5nRmF1bHRBY3Rpb24obm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgbWVudS5hZGQobmV3IEVkaXROYW1lc3BhY2VzQWN0aW9uKGRlZmluaXRpb24pKTsKLSAgICAgICAgICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgICAgCQotICAgICAgICAgIGlmIChpc0VkaXRhYmxlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRNZXNzYWdlQWN0aW9uKGRlZmluaXRpb24sIG51bGwsIG5vZGUsIHByZWZpeCwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkU2VydmljZUFjdGlvbihkZWZpbml0aW9uLCBudWxsLCBub2RlLCBwcmVmaXgsICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0WE1MRG9jdW1lbnQoKSkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZFBvcnRUeXBlQWN0aW9uKGRlZmluaXRpb24sIG51bGwsIG5vZGUsIHByZWZpeCwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkQmluZGluZ0FjdGlvbihkZWZpbml0aW9uLCAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldFhNTERvY3VtZW50KCkpKTsvLywgbnVsbCwgbm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkSW1wb3J0QWN0aW9uKGVkaXRvclBhcnQsIGRlZmluaXRpb24sIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IGZhdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgbWVudS5hZGQoY3JlYXRlU2V0TWVzc2FnZU1lbnUoZmF1bHQsIGlzRWRpdGFibGUpKTsKLSAgICAgICAgICAvL21lbnUuYWRkKGNyZWF0ZUFkZEJpbmRpbmdNZW51Rm9ySU9GKGZhdWx0KSk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBpbnB1dCkKLSAgICAgICAgewotICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldE1lc3NhZ2VNZW51KGlucHV0LCBpc0VkaXRhYmxlKSk7Ci0gICAgICAgICAgLy9tZW51LmFkZChjcmVhdGVBZGRCaW5kaW5nTWVudUZvcklPRihpbnB1dCkpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gICAgICAgIHsKLSAgICAgICAgICBtZW51LmFkZChjcmVhdGVTZXRNZXNzYWdlTWVudShvdXRwdXQsIGlzRWRpdGFibGUpKTsKLSAgICAgICAgICAvL21lbnUuYWRkKGNyZWF0ZUFkZEJpbmRpbmdNZW51Rm9ySU9GKG91dHB1dCkpOwotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkUGFydEFjdGlvbihlZGl0b3JQYXJ0LCBtZXNzYWdlLCBub2RlLCBwcmVmaXgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VPcGVyYXRpb24oT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0VkaXRhYmxlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRJbnB1dEFjdGlvbihlZGl0b3JQYXJ0LCBub2RlLCBvcGVyYXRpb24sIHByZWZpeCkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZE91dHB1dEFjdGlvbihlZGl0b3JQYXJ0LCBub2RlLCBvcGVyYXRpb24sIHByZWZpeCkpOwotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZEZhdWx0QWN0aW9uKGVkaXRvclBhcnQsIG5vZGUsIG9wZXJhdGlvbiwgcHJlZml4KSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vbWVudS5hZGQoY3JlYXRlQWRkQmluZGluZ01lbnVGb3JPcGVyYXRpb24ob3BlcmF0aW9uKSk7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VQYXJ0KFBhcnQgcGFydCkKLSAgICAgICAgewotICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldFBhcnRNZW51KHBhcnQsIChFbGVtZW50KSBub2RlLCAiZWxlbWVudCIsIGlzRWRpdGFibGUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIG1lbnUuYWRkKGNyZWF0ZVNldFBhcnRNZW51KHBhcnQsIChFbGVtZW50KSBub2RlLCAidHlwZSIsIGlzRWRpdGFibGUpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IHBvcnQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQoY3JlYXRlU2V0QmluZGluZ01lbnUocG9ydCwgKEVsZW1lbnQpIG5vZGUsIGlzRWRpdGFibGUpKTsKLSAgICAgICAgICAgIGlmIChwb3J0LmdldEVCaW5kaW5nKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVudS5hZGQoY3JlYXRlU2V0UG9ydFR5cGVNZW51KHBvcnQuZ2V0RUJpbmRpbmcoKSwgaXNFZGl0YWJsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzRWRpdGFibGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZE9wZXJhdGlvbkFjdGlvbihlZGl0b3JQYXJ0LCBwb3J0VHlwZSwgbm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlU2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNFZGl0YWJsZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkUG9ydEFjdGlvbihzZXJ2aWNlKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9wdWJsaWMgT2JqZWN0IGNhc2VUeXBlcyhUeXBlcyB0eXBlcykKLSAgICAgICAgLy97ICAgCi0gICAgICAgIC8vICByZXR1cm4gY3JlYXRlVHlwZXNBZGFwdGVyKCk7Ci0gICAgICAgIC8vIH0gCi0gICAgICB9OwotICAgICAgd3NkbFN3aXRjaC5kb1N3aXRjaCgoV1NETEVsZW1lbnQpIG9iamVjdCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICB7Ci0gICAgICBhZGRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfQ0hJTEQiKSwgImFkZGNoaWxkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgbWVudS5hZGQoYWRkTWVudSk7Ci0gICAgICAKLSAgICAgIFdTRExHcm91cE9iamVjdCBncm91cE9iamVjdCA9IChXU0RMR3JvdXBPYmplY3QpIG9iamVjdDsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdyb3VwT2JqZWN0LmdldERlZmluaXRpb24oKTsKLQotICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLQotICAgICAgLy9mb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAvL3sgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIC8vICBBY3Rpb24gYWN0aW9uID0gKEFjdGlvbilpLm5leHQoKTsKLSAgICAgIC8vICBtYW5hZ2VyLmFkZChhY3Rpb24pOyAKLSAgICAgIC8vfQotCi0gICAgICBzd2l0Y2ggKGdyb3VwT2JqZWN0LmdldFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRNZXNzYWdlQWN0aW9uKGdyb3VwT2JqZWN0LmdldERlZmluaXRpb24oKSwgbnVsbCwgbm9kZSwgcHJlZml4LCAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldFhNTERvY3VtZW50KCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuU0VSVklDRVNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRTZXJ2aWNlQWN0aW9uKGdyb3VwT2JqZWN0LmdldERlZmluaXRpb24oKSwgbnVsbCwgbm9kZSwgcHJlZml4LCAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldFhNTERvY3VtZW50KCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuUE9SVF9UWVBFU19HUk9VUCA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWVudS5hZGQobmV3IEFkZFBvcnRUeXBlQWN0aW9uKGdyb3VwT2JqZWN0LmdldERlZmluaXRpb24oKSwgbnVsbCwgbm9kZSwgcHJlZml4LCAoKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpLmdldFhNTERvY3VtZW50KCkpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuQklORElOR1NfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1lbnUuYWRkKG5ldyBBZGRCaW5kaW5nQWN0aW9uKGdyb3VwT2JqZWN0LmdldERlZmluaXRpb24oKSwgKChXU0RMRWRpdG9yKSBlZGl0b3JQYXJ0KS5nZXRYTUxEb2N1bWVudCgpKSk7Ly8sIG51bGwsIG5vZGUsIHByZWZpeCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5JTVBPUlRTX0dST1VQIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZW51LmFkZChuZXcgQWRkSW1wb3J0QWN0aW9uKGVkaXRvclBhcnQsIGdyb3VwT2JqZWN0LmdldERlZmluaXRpb24oKSwgbm9kZSwgcHJlZml4KSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAKLSAgIAlhZGRFRU1lbnVBY3Rpb25Db250cmlidXRvci5jb250cmlidXRlTWVudUFjdGlvbnMobWVudSwgbm9kZSwgb2JqZWN0KTsKLQotICAgIG1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQgJiYgbm9kZSAhPSBudWxsICYmIGFkZEVkaXRBY3Rpb24gJiYgbm9kZSAhPSBudWxsICYmIGlzRWRpdGFibGUpCi0gICAgewotICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDdXJyZW50bHksIG9ubHkgYWxsb3cgQ29weSBhbmQgUGFzdGUgb24gT3BlcmF0aW9ucwotICAgIAlpZiAob2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gICAgCQkvLyBBZGQgQ3V0LCBDb3B5IEFjdGlvbnMKLSAgICAJCS8vIE5vdGU6ICBUaGUgQ3V0LCBDb3B5LCBQYXN0ZSBBY3Rpb25zIGFyZSBNb2RlbCBEcml2ZW4uICBUaGUgRGVsZXRlIEFjdGlvbiBpcyBzdGlsbAotICAgIAkJLy8gY3VycmVudGx5IERPTSBkcml2ZW4uCi0gICAgCQkvLyAgICAgIG1lbnUuYWRkKG5ldyBDdXRBY3Rpb24oKFdTRExFbGVtZW50KSBvYmplY3QsIGVkaXRvclBhcnQpKTsKLSAgIAkJIAltZW51LmFkZChuZXcgQ29weUdsb2JhbEFjdGlvbigoV1NETEVsZW1lbnQpIG9iamVjdCwgZWRpdG9yUGFydCkpOwotICAgIAl9Ci0KLSAgIAkgCUFjdGlvbiBwYXN0ZUFjdGlvbiA9IG5ldyBQYXN0ZUdsb2JhbEFjdGlvbigoV1NETEVsZW1lbnQpIG9iamVjdCwgZWRpdG9yUGFydCk7Ci0gICAJIAlpZiAocGFzdGVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLSAgIAkgCQltZW51LmFkZChwYXN0ZUFjdGlvbik7Ci0gICAJIAl9Ci0gICAJIAkKLQkgCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEN1cnJlbnRseSwgb25seSBhbGxvdyBDb3B5IGFuZCBQYXN0ZSBvbiBPcGVyYXRpb25zCi0JCQotCQkvLyBHZXQgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgZWxlbWVudHMuICBVc2UgdGhpcyBsaXN0IGZvciB0aGUgRGVsZXRlQWN0aW9uLgkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbkxpc3QgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0U2VsZWN0aW9uTWFuYWdlcigpLmdldFNlbGVjdGlvbigpOwkKLQkJQWN0aW9uIGRlbGV0ZUF0aW9uID0gbmV3IERlbGV0ZVdTRExBbmRYU0RBY3Rpb24oc2VsZWN0aW9uTGlzdC50b0xpc3QoKSwgbm9kZSwgKFdTRExFZGl0b3IpIGVkaXRvclBhcnQpOwotCQltZW51LmFkZChkZWxldGVBdGlvbik7Ci0JCWRlbGV0ZUF0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0gICAgfQotICAgIAotICAgIC8vIEFsbG93IFJlbmFtZSB0aHJvdWdoIGEgZGlhbG9nIG1lY2hhbmlzbS4uLi4uICBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4KLSAgICAvLyBkaXJlY3QgZWRpdGluZyBpcyByZWFkeQotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCAmJiBpc0VkaXRhYmxlKSB7Ci0gICAgCVJlbmFtZURpYWxvZ0FjdGlvbiByZW5hbWVEaWFsb2cgPSBuZXcgUmVuYW1lRGlhbG9nQWN0aW9uKChXU0RMRWxlbWVudCkgb2JqZWN0KTsKLSAgICAJaWYgKHJlbmFtZURpYWxvZy5zaG93UmVuYW1lRGlhbG9nKCkpCi0gICAgCQltZW51LmFkZChyZW5hbWVEaWFsb2cpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVBZGRCaW5kaW5nTWVudUZvck9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKSAKLSAgewotICAgIE1lbnVNYW5hZ2VyIHN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoIkFkZCBCaW5kaW5nIik7ICAgICAgICAgICAgICAgICAgICAKLSAgCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsgCi0gICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gIAotICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAob3BlcmF0aW9uTmFtZSAhPSBudWxsKQotICAgIHsgICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1dGlsLmdldEJpbmRpbmdzKG9wZXJhdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpaS5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBtYXRjaGluZ0JpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilqLm5leHQoKTsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZS5lcXVhbHMoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsgCi0gICAgICAgICAgICBtYXRjaGluZ0JpbmRpbmdPcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgCi0gIAotICAgICAgICBpZiAobWF0Y2hpbmdCaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgRWxlbWVudCBiaW5kaW5nRWxlbWVudCA9IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChiaW5kaW5nKTsKLSAgICAgICAgICBzdWJNZW51LmFkZChuZXcgQWRkQmluZGluZ09wZXJhdGlvbkFjdGlvbihiaW5kaW5nRWxlbWVudCwgb3BlcmF0aW9uLCBwcmVmaXgpKTsKLSAgICAgICAgfSAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN1Yk1lbnU7Ci0gIH0qLwotCi0gIC8qCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVBZGRCaW5kaW5nTWVudUZvcklPRihXU0RMRWxlbWVudCBpb2YpIAotICB7Ci0gICAgTWVudU1hbmFnZXIgc3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcigiQWRkIEJpbmRpbmciKTsgICAgICAgICAgICAgICAgICAgIAotICAKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBpb2YuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOyAKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbilpb2YuZUNvbnRhaW5lcigpOwotICAKLSAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChkZWZpbml0aW9uKTsKLSAgCi0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1dGlsLmdldEJpbmRpbmdzKG9wZXJhdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpaS5uZXh0KCk7Ci0gIAotICAgICAgICBib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbilqLm5leHQoKTsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZS5lcXVhbHMoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhc05hbWUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgCi0gIAotICAgICAgICBpZiAoIWhhc05hbWUpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gVE9ETy4uLiBzaG91bGQgd2UgYWRkIHRoZSBvcGVyYXRpb24gdG8gYWxsIG9mIHRoZSBiaW5kaW5ncz8KLSAgICAgICAgICAvLwotICAgICAgICAgIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgICAgICAgc3ViTWVudS5hZGQobmV3IEFkZEJpbmRpbmdPcGVyYXRpb25BY3Rpb24oYmluZGluZ0VsZW1lbnQsIG9wZXJhdGlvbk5hbWUpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3ViTWVudTsKLSAgfQotICAqLwotCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVTZXRCaW5kaW5nTWVudShQb3J0IHBvcnQsIEVsZW1lbnQgcG9ydEVsZW1lbnQsIGJvb2xlYW4gaXNFZGl0YWJsZSkKLSAgewotICAgIE1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX1NFVF9CSU5ESU5HIikpOwotCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcG9ydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLSAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotCi0gICAgU2V0TmV3Q29tcG9uZW50QWN0aW9uIHNldE5ld0FjdGlvbiA9IG5ldyBTZXROZXdDb21wb25lbnRBY3Rpb24oV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX05FV19CSU5ESU5HIiksIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJiaW5kaW5nIiwgcG9ydCk7Ci0gICAgc2V0TmV3QWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICBzZXROZXdBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICBzdWJtZW51LmFkZChzZXROZXdBY3Rpb24pOyAgICAgCi0gICAgCi0gICAgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24gYWN0aW9uID0gbmV3IFNldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9FWElTVElOR19CSU5ESU5HIiksIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJiaW5kaW5nIiwgcG9ydCk7Ci0gICAgYWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICBhY3Rpb24uc2V0RW5hYmxlZChpc0VkaXRhYmxlKTsKLSAgICBzdWJtZW51LmFkZChhY3Rpb24pOwotICAgIAotICAgIHJldHVybiBzdWJtZW51OwotICB9Ci0KLSAgcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZVNldFBvcnRUeXBlTWVudShCaW5kaW5nIGJpbmRpbmcsIGJvb2xlYW4gaXNFZGl0YWJsZSkKLSAgeyAgICAgIAotICAgIE1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX1NFVF9QT1JUVFlQRSIpKTsKLQotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLQkgIAotICAgICAgU2V0TmV3Q29tcG9uZW50QWN0aW9uIHNldE5ld0FjdGlvbiA9IG5ldyBTZXROZXdDb21wb25lbnRBY3Rpb24oV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX05FV19QT1JUVFlQRSIpLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAicG9ydFR5cGUiLCBiaW5kaW5nKTsKLSAgICAgIHNldE5ld0FjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICBzZXROZXdBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHN1Ym1lbnUuYWRkKHNldE5ld0FjdGlvbik7ICAgICAgCi0KLSAgICAgIFNldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBTZXRFeGlzdGluZ0NvbXBvbmVudEFjdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fRVhJU1RJTkdfUE9SVFRZUEUiKSwgZGVmaW5pdGlvbkVsZW1lbnQsIHByZWZpeCwgInBvcnRUeXBlIiwgYmluZGluZyk7Ci0gICAgICBhY3Rpb24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgICAgYWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7ICAgICAgCi0gICAgICBzdWJtZW51LmFkZChhY3Rpb24pOwotICAgIH0KLSAgICByZXR1cm4gc3VibWVudTsKLSAgfQotCi0gIHByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVTZXRNZXNzYWdlTWVudShXU0RMRWxlbWVudCB3c2RsRWxlbWVudCwgYm9vbGVhbiBpc0VkaXRhYmxlKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NkbEVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0gICAgRWxlbWVudCByZWZlcmVuY2luZ0VsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qod3NkbEVsZW1lbnQpOwotCQotICAgIE1lbnVNYW5hZ2VyIHN1Ym1lbnUgPSBuZXcgTWVudU1hbmFnZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX1NFVF9NRVNTQUdFIikpOwotICAgIGlmIChkZWZpbml0aW9uRWxlbWVudCAhPSBudWxsICYmIHJlZmVyZW5jaW5nRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAKLSAgICAgIFNldE5ld0NvbXBvbmVudEFjdGlvbiBzZXROZXdBY3Rpb24gPSBuZXcgU2V0TmV3Q29tcG9uZW50QWN0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfTUVTU0FHRSIpLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAibWVzc2FnZSIsIHdzZGxFbGVtZW50KTsKLSAgICAgIHNldE5ld0FjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICBzZXROZXdBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHN1Ym1lbnUuYWRkKHNldE5ld0FjdGlvbik7ICAKLSAgICAgIAotICAgICAgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24gYWN0aW9uID0gbmV3IFNldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9FWElTVElOR19NRVNTQUdFIiksIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJtZXNzYWdlIiwgd3NkbEVsZW1lbnQpOwotICAgICAgYWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIGFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUpOwotICAgICAgc3VibWVudS5hZGQoYWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHN1Ym1lbnU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlU2V0UGFydE1lbnUoUGFydCBwYXJ0LCBFbGVtZW50IHBvcnRFbGVtZW50LCBTdHJpbmcgcmVmZXJlbmNlS2luZCwgYm9vbGVhbiBpc0VkaXRhYmxlKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLSAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotCi0gICAgU3RyaW5nIGFjdGlvbk5hbWU7Ci0gICAgTWVudU1hbmFnZXIgc3VibWVudSA9IG51bGw7Ci0gICAgaWYgKHJlZmVyZW5jZUtpbmQuZXF1YWxzSWdub3JlQ2FzZSgiZWxlbWVudCIpKSAvLyBOT04gTkxTCi0gICAgewotICAgICAgYWN0aW9uTmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9FWElTVElOR19FTEVNRU5UIik7Ci0gICAgICBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9TRVRfRUxFTUVOVCIpKTsKLQkgIAotICAgICAgU2V0TmV3Q29tcG9uZW50QWN0aW9uIHNldE5ld0VsZW1lbnRBY3Rpb24gPSBuZXcgU2V0TmV3Q29tcG9uZW50QWN0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfRUxFTUVOVCIpLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiZWxlbWVudCIsIHBhcnQpOwotICAgICAgc2V0TmV3RWxlbWVudEFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICBzZXROZXdFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICBzZXROZXdFbGVtZW50QWN0aW9uLnNldFJlZmVyZW5jZUtpbmQocmVmZXJlbmNlS2luZCk7Ci0gICAgICBzdWJtZW51LmFkZChzZXROZXdFbGVtZW50QWN0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGFjdGlvbk5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fRVhJU1RJTkdfVFlQRSIpOwotICAgICAgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fU0VUX1RZUEUiKSk7Ci0gICAgICAKLSAgICAgIFNldE5ld0NvbXBvbmVudEFjdGlvbiBzZXROZXdDb21wbGV4QWN0aW9uID0gbmV3IFNldE5ld0NvbXBvbmVudEFjdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX0NPTVBMRVhfVFlQRSIpLCBkZWZpbml0aW9uRWxlbWVudCwgcHJlZml4LCAiY29tcGxleCB0eXBlIiwgcGFydCk7Ci0gICAgICBzZXROZXdDb21wbGV4QWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0UmVmZXJlbmNlS2luZChyZWZlcmVuY2VLaW5kKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0VHlwZUtpbmQoImNvbXBsZXgiKTsKLSAgICAgIEltYWdlIGltYWdlID0gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RDb21wbGV4VHlwZS5naWYiKTsKLSAgICAgIHNldE5ld0NvbXBsZXhBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UoaW1hZ2UpKTsKLSAgICAgIHN1Ym1lbnUuYWRkKHNldE5ld0NvbXBsZXhBY3Rpb24pOwotICAgICAgCi0gICAgICBTZXROZXdDb21wb25lbnRBY3Rpb24gc2V0TmV3U2ltcGxlQWN0aW9uID0gbmV3IFNldE5ld0NvbXBvbmVudEFjdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX1NJTVBMRV9UWVBFIiksIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsICJzaW1wbGUgdHlwZSIsIHBhcnQpOwotICAgICAgc2V0TmV3U2ltcGxlQWN0aW9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgICAgIHNldE5ld1NpbXBsZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgc2V0TmV3U2ltcGxlQWN0aW9uLnNldFJlZmVyZW5jZUtpbmQocmVmZXJlbmNlS2luZCk7Ci0gICAgICBzZXROZXdTaW1wbGVBY3Rpb24uc2V0VHlwZUtpbmQoInNpbXBsZSIpOwotICAgICAgaW1hZ2UgPSBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNESW1hZ2UoImljb25zL1hTRFNpbXBsZVR5cGUuZ2lmIik7Ci0gICAgICBzZXROZXdTaW1wbGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tSW1hZ2UoaW1hZ2UpKTsKLQotICAgICAgc3VibWVudS5hZGQoc2V0TmV3U2ltcGxlQWN0aW9uKTsgCi0gICAgfQotCi0gICAgCi0gICAgU2V0RXhpc3RpbmdDb21wb25lbnRBY3Rpb24gYWN0aW9uID0gbmV3IFNldEV4aXN0aW5nQ29tcG9uZW50QWN0aW9uKGFjdGlvbk5hbWUsIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsIGFjdGlvbk5hbWUsIHBhcnQpOwotICAgIGFjdGlvbi5zZXRSZWZlcmVuY2VLaW5kKHJlZmVyZW5jZUtpbmQpOwotICAgIGFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgYWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSk7Ci0gICAgc3VibWVudS5hZGQoYWN0aW9uKTsKLSAgICAKLSAgICByZXR1cm4gc3VibWVudTsKLSAgfQotICAKLSAgcHJpdmF0ZSBXU0RMRWxlbWVudCBzaG93UGFzdGVBY3Rpb24oV1NETEVsZW1lbnQgZWxlbWVudCwgSUVkaXRvclBhcnQgZVBhcnQpIHsKLSAgCVdTRExFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBudWxsOwotICAJCi0gIAlpZiAoZVBhcnQgaW5zdGFuY2VvZiBXU0RMRWRpdG9yKSB7Ci0gIAkJV1NETEVsZW1lbnQgY2xpcGJvYXJkRWxlbWVudCA9ICgoV1NETEVkaXRvcikgZVBhcnQpLmdldENsaXBib2FyZENvbnRlbnRzKCk7Ci0gIAkJCi0gIAkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQb3J0VHlwZSkgewotICAJCQlpZiAoY2xpcGJvYXJkRWxlbWVudCBpbnN0YW5jZW9mIE9wZXJhdGlvbikgewotICAJCQkJcGFyZW50RWxlbWVudCA9IGVsZW1lbnQ7Ci0gIAkJCX0KLSAgCQl9Ci0gIAkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCQkJaWYgKGNsaXBib2FyZEVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgCQkJCXBhcmVudEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpICgoT3BlcmF0aW9uKSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0gIAkJCX0KLSAgCQl9Ci0gIAl9Ci0gIAkKLSAgCXJldHVybiBwYXJlbnRFbGVtZW50OwotICB9Ci19Ci0KLWNsYXNzIEFkZEJpbmRpbmdPcGVyYXRpb25BY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBvcGVyYXRpb247Ci0KLSAgcHVibGljIEFkZEJpbmRpbmdPcGVyYXRpb25BY3Rpb24oTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIC8vIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BREQiKSArICIgIiArIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkdfT1BFUkFUSU9OIiksICJpY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJvcGVyYXRpb24iKTsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0JJTkRJTkdfT1BFUkFUSU9OIiksICJpY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJvcGVyYXRpb24iKTsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIEFkZEJpbmRpbmdPcGVyYXRpb25BY3Rpb24oTm9kZSBwYXJlbnROb2RlLCBPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgdGhpcyhwYXJlbnROb2RlLCBvcGVyYXRpb24uZ2V0TmFtZSgpLCBwcmVmaXgpOwotICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKQotICB7Ci0gICAgc3VwZXIucGVyZm9ybUFkZEVsZW1lbnQoKTsKLQotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAob3BlcmF0aW9uLmdldElucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmV3IEFkZEJpbmRpbmdJbnB1dEFjdGlvbihlZGl0b3JQYXJ0LCBuZXdFbGVtZW50LCBwcmVmaXgpLnJ1bigpOwotICAgICAgfQotICAgICAgaWYgKG9wZXJhdGlvbi5nZXRPdXRwdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuZXcgQWRkQmluZGluZ091dHB1dEFjdGlvbihlZGl0b3JQYXJ0LCBuZXdFbGVtZW50LCBwcmVmaXgpLnJ1bigpOwotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgICAgbmV3IEFkZEJpbmRpbmdGYXVsdEFjdGlvbihuZXdFbGVtZW50LCBmYXVsdCwgcHJlZml4KS5ydW4oKTsKLSAgICAgIH0KLSAgICAgIGZvcm1hdChvcGVyYXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICB9Ci0gIH0KLX0KLQotCi1jbGFzcyBBZGRPcGVyYXRpb25BY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9ICJOZXdPcGVyYXRpb24iOwotICBwcm90ZWN0ZWQgUG9ydFR5cGUgcG9ydFR5cGU7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZVN1YkNvbXBvbmVudHMgPSBmYWxzZTsKLQotICBwdWJsaWMgQWRkT3BlcmF0aW9uQWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIFBvcnRUeXBlIHBvcnRUeXBlLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX09QRVJBVElPTiIpLCAiaWNvbnMvb3BlcmF0aW9uX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJvcGVyYXRpb24iKTsKLSAgICBzZXRFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotICAgIHNldERlZmluaXRpb24ocG9ydFR5cGUuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICB0aGlzLnBvcnRUeXBlID0gcG9ydFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzaG93RGlhbG9nKCkKLSAgewotICAgIG5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU9wZXJhdGlvbk5hbWUocG9ydFR5cGUpOwotICAgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfT1BFUkFUSU9OIiksIG5hbWUsIE5hbWVVdGlsLmdldFVzZWRPcGVyYXRpb25OYW1lcyhwb3J0VHlwZSkpOwotICAgIHJldHVybiBuYW1lICE9IG51bGw7Ci0gIH0KLQotLy8gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotLy8gIHsKLS8vICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0vLyAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkKLSAgewotICAJaWYgKGNyZWF0ZVN1YkNvbXBvbmVudHMpIHsKLSAgCSAgCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLm9wZXJhdGlvbk5hbWUgPSBuYW1lOwotICAJICAJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5nZXRQYXJ0SW5mbyhwb3J0VHlwZSk7Ci0gIAkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU9wZXJhdGlvbihwb3J0VHlwZSk7Ci0gIAkJZm9ybWF0KG9wZXJhdGlvbi5nZXRFbGVtZW50KCkpOyAgCQkKLSAgCQlzZWxlY3RPYmplY3Qob3BlcmF0aW9uKTsKLSAgCQlleHBhbmRFZGl0UGFydHMob3BlcmF0aW9uLHRydWUpOwotICAJfQotICAJZWxzZSB7Ci0gIAkJRGVmaW5pdGlvbiBkZWYgPSBwb3J0VHlwZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7CQotCQkKLSAgCQkvLyBBZGQgT3BlcmF0aW9uCi0gIAkJQWRkT3BlcmF0aW9uQ29tbWFuZCBvcEFjdGlvbiA9IG5ldyBBZGRPcGVyYXRpb25Db21tYW5kKHBvcnRUeXBlLCBuYW1lKTsKLQkJb3BBY3Rpb24ucnVuKCk7Ci0JCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcEFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotCQkKLQkJLy8gQWRkIE91dHB1dAotICAJCUFkZE91dHB1dENvbW1hbmQgb3V0QWN0aW9uID0gbmV3IEFkZE91dHB1dENvbW1hbmQob3BlcmF0aW9uLCBOYW1lVXRpbC5idWlsZFVuaXF1ZUlucHV0TmFtZShwb3J0VHlwZSwgb3BlcmF0aW9uLmdldE5hbWUoKSwgIiIpKTsKLSAgCQlvdXRBY3Rpb24ucnVuKCk7Ci0gIAkJCi0JCS8vIEFkZCBJbnB1dAotCQlBZGRJbnB1dENvbW1hbmQgaW5BY3Rpb24gPSBuZXcgQWRkSW5wdXRDb21tYW5kKG9wZXJhdGlvbiwgTmFtZVV0aWwuYnVpbGRVbmlxdWVPdXRwdXROYW1lKHBvcnRUeXBlLCBvcGVyYXRpb24uZ2V0TmFtZSgpLCAiIikpOwotICAJCWluQWN0aW9uLnJ1bigpOwotCi0gIAkJZm9ybWF0KG9wZXJhdGlvbi5nZXRFbGVtZW50KCkpOwotCi0gCSAgCXNlbGVjdE9iamVjdChvcGVyYXRpb24pOwotIAkgIAlleHBhbmRFZGl0UGFydHMob3BlcmF0aW9uLCB0cnVlKTsKLSAgCX0KLSAgfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZEVkaXRQYXJ0cyhPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBleHBhbmRDaGlsZHJlbikgewotCSAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JICAgIAlFZGl0UGFydFZpZXdlciBlZGl0UGFydFZpZXdlciA9ICgoV1NETEVkaXRvcikgZWRpdG9yUGFydCkuZ2V0R3JhcGhWaWV3ZXIoKS5nZXRDb21wb25lbnRWaWV3ZXIoKTsKLQkgICAgCU1hcCBlZGl0UGFydE1hcCA9IGVkaXRQYXJ0Vmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKTsKLQkgICAgCVdTRExUcmVlTm9kZUVkaXRQYXJ0IHdzZGxFZGl0UGFydCA9IChXU0RMVHJlZU5vZGVFZGl0UGFydCkgZWRpdFBhcnRNYXAuZ2V0KGVsZW1lbnQpOwotCQkJd3NkbEVkaXRQYXJ0LnNldEV4cGFuZGVkKHRydWUpOwotCQkJCi0JCQlpZiAoZXhwYW5kQ2hpbGRyZW4pIHsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IFdTRExFZGl0b3JVdGlsLmdldE1vZGVsR3JhcGhWaWV3Q2hpbGRyZW4oZWxlbWVudCkuaXRlcmF0b3IoKTsKLQkJCQkKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWV4cGFuZEVkaXRQYXJ0cyhpdGVyYXRvci5uZXh0KCksIGV4cGFuZENoaWxkcmVuKTsKLQkJCQl9Ci0JCQl9Ci0JICAgIH0KLQl9Ci0KLSAgcHVibGljIFN0cmluZyBzaG93RGlhbG9nSGVscGVyKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lLCBMaXN0IHVzZWROYW1lcykKLSAgeyAgIAotICAgIFN0cmluZyByZXN1bHQgPSBkZWZhdWx0TmFtZTsgCi0gICAgTmV3Q29tcG9uZW50V2l0aENoaWxkRGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCB0aXRsZSwgZGVmYXVsdE5hbWUsIHVzZWROYW1lcyk7Ci0gICAgaW50IHJjID0gZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLSAgICBpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkaWFsb2cuZ2V0TmFtZSgpOyAgCi0gICAgICBjcmVhdGVTdWJDb21wb25lbnRzID0gZGlhbG9nLmNyZWF0ZVN1YkNvbXBvbmVudHMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfSAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotYWJzdHJhY3QgY2xhc3MgQWRkSU9GQWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLQotICBwdWJsaWMgQWRkSU9GQWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIFN0cmluZyB0ZXh0LCBTdHJpbmcgaW1hZ2VEZXNjcmlwdG9yS2V5LCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBzdXBlcih0ZXh0LCBpbWFnZURlc2NyaXB0b3JLZXksIHBhcmVudE5vZGUsIHByZWZpeCwgbG9jYWxOYW1lKTsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICBzZXRFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotICAgIHNldERlZmluaXRpb24ob3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudFRvQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQpOwotCi0gIC8qCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiLCAiIik7Ci0gIH0KLSAgKi8KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpCi0gIHsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB1dGlsLmdldEJpbmRpbmdPcGVyYXRpb25zKG9wZXJhdGlvbikuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgIEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybUFkZEVsZW1lbnRUb0JpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbiwgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmb3JtYXQob3BlcmF0aW9uLmdldEVsZW1lbnQoKSk7Ci0gICAgfQotICB9Ci19Ci0KLWNsYXNzIEFkZElucHV0QWN0aW9uIGV4dGVuZHMgQWRkSU9GQWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRJbnB1dEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBOb2RlIHBhcmVudE5vZGUsIE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihlZGl0b3JQYXJ0LCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lOUFVUIiksICJpY29ucy9pbnB1dF9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAiaW5wdXQiLCBvcGVyYXRpb24pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnRUb0JpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50KQotICB7Ci0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXcgQWRkQmluZGluZ0lucHV0QWN0aW9uKGVkaXRvclBhcnQsIGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBwcmVmaXgpLnJ1bigpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7Ci0gIAlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgKChXU0RMRWxlbWVudEltcGwpIG9wZXJhdGlvbikuZ2V0Q29udGFpbmVyKCk7Ci0gIAlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX1RZUEVfT1JfREVGSU5JVElPTiA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmdldFBhcnRJbmZvKHBvcnRUeXBlKTsKLSAgCUlucHV0IGlucHV0ID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlSW5wdXQocG9ydFR5cGUsIG9wZXJhdGlvbiwgbnVsbCk7IAotICAJZm9ybWF0KGlucHV0LmdldEVsZW1lbnQoKSk7Ci0gIAlzZWxlY3RPYmplY3QoaW5wdXQpOwotICB9Ci19Ci0KLWNsYXNzIEFkZE91dHB1dEFjdGlvbiBleHRlbmRzIEFkZElPRkFjdGlvbgotewotICBwdWJsaWMgQWRkT3V0cHV0QWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIE5vZGUgcGFyZW50Tm9kZSwgT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHN1cGVyKGVkaXRvclBhcnQsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfT1VUUFVUIiksICJpY29ucy9vdXRwdXRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgIm91dHB1dCIsIG9wZXJhdGlvbik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudFRvQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQpCi0gIHsKLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXcgQWRkQmluZGluZ091dHB1dEFjdGlvbihlZGl0b3JQYXJ0LCBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCwgcHJlZml4KS5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BZGRFbGVtZW50KCkgewotICAJLy8gRGV0ZXJtaW5lIFBhcnQgaW5mbwotICAJUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpICgoV1NETEVsZW1lbnRJbXBsKSBvcGVyYXRpb24pLmdldENvbnRhaW5lcigpOwotICAJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5nZXRQYXJ0SW5mbyhwb3J0VHlwZSk7Ci0gIAlPdXRwdXQgb3V0cHV0ID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlT3V0cHV0KHBvcnRUeXBlLCBvcGVyYXRpb24pOyAKLSAgCWZvcm1hdChvdXRwdXQuZ2V0RWxlbWVudCgpKTsKLSAgCXNlbGVjdE9iamVjdChvdXRwdXQpOwotICB9Ci19Ci0KLWNsYXNzIEFkZEZhdWx0QWN0aW9uIGV4dGVuZHMgQWRkSU9GQWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9ICJOZXdGYXVsdCI7Ci0gIHB1YmxpYyBBZGRGYXVsdEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBOb2RlIHBhcmVudE5vZGUsIE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihlZGl0b3JQYXJ0LCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0ZBVUxUIiksICJpY29ucy9mYXVsdF9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAiZmF1bHQiLCBvcGVyYXRpb24pOwotICAgIG5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZUZhdWx0TmFtZShvcGVyYXRpb24pOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLSAgICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVGYXVsdE5hbWUob3BlcmF0aW9uKTsKLSAgICBuYW1lID0gc2hvd0RpYWxvZ0hlbHBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fTkVXX0ZBVUxUIiksIG5hbWUsIE5hbWVVdGlsLmdldFVzZWRGYXVsdE5hbWVzKG9wZXJhdGlvbikpOwotICAgIHJldHVybiBuYW1lICE9IG51bGw7Ci0gIH0KLQotICAvKgotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgewotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgIiIpOwotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0gIH0KLSAgKi8KLQotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudFRvQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQpCi0gIHsKLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHQobmFtZSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuZXcgQWRkQmluZGluZ0ZhdWx0QWN0aW9uKGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBwcmVmaXgpLnJ1bigpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7Ci0gIAlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5mYXVsdE5hbWUgPSBuYW1lOwotICAJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5nZXRQYXJ0SW5mbyhvcGVyYXRpb24pOwotICAJRmF1bHQgZmF1bHQgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVGYXVsdChvcGVyYXRpb24pOwotICAJZm9ybWF0KGZhdWx0LmdldEVsZW1lbnQoKSk7ICAJCi0gIAlzZWxlY3RPYmplY3QoZmF1bHQpOwotICB9Ci19Ci0KLWNsYXNzIEFkZEJpbmRpbmdJbnB1dEFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgcHVibGljIEFkZEJpbmRpbmdJbnB1dEFjdGlvbihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0LCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0lOUFVUIiksICJpY29ucy9pbnB1dF9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAiaW5wdXQiKTsKLSAgICBzZXRFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotICB9Ci19Ci0KLWNsYXNzIEFkZEJpbmRpbmdPdXRwdXRBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHB1YmxpYyBBZGRCaW5kaW5nT3V0cHV0QWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfT1VUUFVUIiksICJpY29ucy9vdXRwdXRfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgIm91dHB1dCIpOwotICAgIHNldEVkaXRvclBhcnQoZWRpdG9yUGFydCk7Ci0gIH0KLX0KLQotY2xhc3MgQWRkQmluZGluZ0ZhdWx0QWN0aW9uIGV4dGVuZHMgQWRkRWxlbWVudEFjdGlvbgotewotICBwcm90ZWN0ZWQgRmF1bHQgZmF1bHQ7Ci0KLSAgcHVibGljIEFkZEJpbmRpbmdGYXVsdEFjdGlvbihOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0ZBVUxUIiksICJpY29ucy9mYXVsdF9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAiZmF1bHQiKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRCaW5kaW5nRmF1bHRBY3Rpb24oTm9kZSBwYXJlbnROb2RlLCBGYXVsdCBmYXVsdCwgU3RyaW5nIHByZWZpeCkKLSAgewotICAgIHRoaXMocGFyZW50Tm9kZSwgcHJlZml4KTsKLSAgICB0aGlzLmZhdWx0ID0gZmF1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVzKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgewotICAgIGlmIChmYXVsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgIk5ld0ZhdWx0Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIGZhdWx0LmdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci19Ci0KLWNsYXNzIEFkZE1lc3NhZ2VBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotICBwdWJsaWMgQWRkTWVzc2FnZUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX01FU1NBR0UiKSwgImljb25zL21lc3NhZ2Vfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgIm1lc3NhZ2UiKTsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgQWRkTWVzc2FnZUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9NRVNTQUdFIiksICJpY29ucy9tZXNzYWdlX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJtZXNzYWdlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gICAgc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKQotICB7Ci0gICAgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUoZGVmaW5pdGlvbiwgbmFtZSk7Ci0gICAgbmFtZSA9IHNob3dEaWFsb2dIZWxwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX05FV19NRVNTQUdFIiksIG5hbWUsIE5hbWVVdGlsLmdldFVzZWRNZXNzYWdlTmFtZXMoZGVmaW5pdGlvbikpOwotICAgIHJldHVybiBuYW1lICE9IG51bGw7Ci0gIH0KLQotLy8gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotLy8gIHsKLS8vICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSk7Ci0vLyAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFkZEVsZW1lbnQoKSB7Ci0gIAlOb2RlTGlzdCBsaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAJaWYgKHBhcmVudE5vZGUgPT0gbnVsbHx8IGxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkgewotICAJCWNyZWF0ZURlZmluaXRpb25TdHViKCk7Ci0gIAl9Ci0gIAkKLSAgCUFkZE1lc3NhZ2VDb21tYW5kIGFjdGlvbiA9IG5ldyBBZGRNZXNzYWdlQ29tbWFuZChkZWZpbml0aW9uLCBuYW1lKTsKLQlhY3Rpb24ucnVuKCk7Ci0JTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZVBhcnQobWVzc2FnZSk7Ci0JZm9ybWF0KG1lc3NhZ2UuZ2V0RWxlbWVudCgpKTsKLQlzZWxlY3RPYmplY3QobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLX0KLQotY2xhc3MgQWRkUGFydEFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIE1lc3NhZ2UgbWVzc2FnZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gIHB1YmxpYyBBZGRQYXJ0QWN0aW9uKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIE1lc3NhZ2UgbWVzc2FnZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9QQVJUIiksICJpY29ucy9wYXJ0X29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJwYXJ0Iik7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICBzZXRFZGl0b3JQYXJ0KGVkaXRvclBhcnQpOwotICAgIHNldERlZmluaXRpb24obWVzc2FnZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLSAgICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQYXJ0TmFtZShtZXNzYWdlLCBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfUEFSVCIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkUGFydE5hbWVzKG1lc3NhZ2UpKTsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotICAgIFN0cmluZyB4c2RQcmVmaXggPSBtZXNzYWdlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSSk7Ci0gICAgaWYgKHhzZFByZWZpeCA9PSBudWxsKQotICAgIHsKLSAgICAJRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChtZXNzYWdlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7ICAgIAkKLSAgICAgICAgbmV3IEFkZE5hbWVzcGFjZURlY2xhcmF0aW9uc0FjdGlvbihkZWZpbml0aW9uRWxlbWVudCwgV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSSwgInhzZCIpLnJ1bigpOwotCQl4c2RQcmVmaXggPSBtZXNzYWdlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSSk7Ci0gICAgfQotCQkJCi0gICAgU3RyaW5nIGRlZmF1bHRUeXBlTmFtZSA9ICJzdHJpbmciOwotICAgIGlmICh4c2RQcmVmaXggIT0gbnVsbCAmJiB4c2RQcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIGRlZmF1bHRUeXBlTmFtZSA9IHhzZFByZWZpeCArICI6IiArIGRlZmF1bHRUeXBlTmFtZTsKLSAgICB9Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBkZWZhdWx0VHlwZU5hbWUpOwotICB9Ci19Ci0KLWNsYXNzIEFkZFNlcnZpY2VBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICBwdWJsaWMgQWRkU2VydmljZUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1NFUlZJQ0UiKSwgImljb25zL3NlcnZpY2Vfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgInNlcnZpY2UiKTsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgQWRkU2VydmljZUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBwcmVmaXgsIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TRVJWSUNFIiksICJpY29ucy9zZXJ2aWNlX29iai5naWYiLCBwYXJlbnROb2RlLCBwcmVmaXgsICJzZXJ2aWNlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuc2V0RGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0gICAgc2V0Q29tcHV0ZVRvcExldmVsUmVmQ2hpbGQodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBzaG93RGlhbG9nKCkKLSAgewotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlU2VydmljZU5hbWUoZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIG5hbWUgPSBzaG93RGlhbG9nSGVscGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9ORVdfU0VSVklDRSIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkU2VydmljZU5hbWVzKGRlZmluaXRpb24pKTsKLSAgICByZXR1cm4gbmFtZSAhPSBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlcyhFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpIHsgIAkKLSAgCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gIAlpZiAocGFyZW50Tm9kZSA9PSBudWxsIHx8IGxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkgewotICAJCWNyZWF0ZURlZmluaXRpb25TdHViKCk7Ci0gIAl9Ci0gIAkKLSAgCXN1cGVyLnBlcmZvcm1BZGRFbGVtZW50KCk7Ci0gIH0KLX0KLQotY2xhc3MgQWRkUG9ydFR5cGVBY3Rpb24gZXh0ZW5kcyBBZGRFbGVtZW50QWN0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICBwdWJsaWMgQWRkUG9ydFR5cGVBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9QT1JUVFlQRSIpLCAiaWNvbnMvcG9ydHR5cGVfb2JqLmdpZiIsIHBhcmVudE5vZGUsIHByZWZpeCwgInBvcnRUeXBlIik7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHNldENvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKHRydWUpOwotICB9Ci0KLSAgcHVibGljIEFkZFBvcnRUeXBlQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWUsIE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIHByZWZpeCwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICBzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1BPUlRUWVBFIiksICJpY29ucy9wb3J0dHlwZV9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcHJlZml4LCAicG9ydFR5cGUiKTsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgdGhpcy5zZXREZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgICBzZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCh0cnVlKTsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLSAgICBuYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQb3J0VHlwZU5hbWUoZGVmaW5pdGlvbiwgbmFtZSk7Ci0gICAgbmFtZSA9IHNob3dEaWFsb2dIZWxwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX05FV19QT1JUVFlQRSIpLCBuYW1lLCBOYW1lVXRpbC5nZXRVc2VkUG9ydFR5cGVOYW1lcyhkZWZpbml0aW9uKSk7Ci0gICAgcmV0dXJuIG5hbWUgIT0gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7Ci0gICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQWRkRWxlbWVudCgpIHsKLSAgCU5vZGVMaXN0IGxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gIAlpZiAocGFyZW50Tm9kZSA9PSBudWxsIHx8IGxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkgewotICAJCWNyZWF0ZURlZmluaXRpb25TdHViKCk7Ci0gIAl9Ci0gIAkKLSAgCXN1cGVyLnBlcmZvcm1BZGRFbGVtZW50KCk7Ci0gIH0KLX0KLQotY2xhc3MgQWRkQmluZGluZ0FjdGlvbiBleHRlbmRzIEFjdGlvbgotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLSAgcHVibGljIEFkZEJpbmRpbmdBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfQklORElORyIpLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NETEVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL2JpbmRpbmdfb2JqLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotICAgIC8vc2V0VG9vbFRpcFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HX1dJWkFSRCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIEJpbmRpbmdXaXphcmQgd2l6YXJkID0gbmV3IEJpbmRpbmdXaXphcmQoZGVmaW5pdGlvbiwgZG9jdW1lbnQpOwotICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0gICAgd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotCi0gICAgaW50IHJlc3VsdCA9IHdpemFyZERpYWxvZy5vcGVuKCk7Ci0KLSAgICBpZiAocmVzdWx0ID09IFdpbmRvdy5PSykKLSAgICB7Ci0gICAgICAvL3RvZG8uLi4gICAgICAKLSAgICB9Ci0gIH0KLX0KLQotY2xhc3MgQWRkUG9ydEFjdGlvbiBleHRlbmRzIEFjdGlvbgotewotCXByb3RlY3RlZCBTZXJ2aWNlIHNlcnZpY2U7Ci0KLQlwdWJsaWMgQWRkUG9ydEFjdGlvbihTZXJ2aWNlIHNlcnZpY2UpCi0JewotCQlzdXBlcihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX1BPUlQiKSwgSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21GaWxlKFdTRExFZGl0b3JQbHVnaW4uY2xhc3MsICJpY29ucy9iaW5kaW5nX29iai5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy9zZXRUb29sVGlwVGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkdfV0laQVJEIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCVBvcnRXaXphcmQgd2l6YXJkID0gbmV3IFBvcnRXaXphcmQoc2VydmljZSk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQotCQlpbnQgcmVzdWx0ID0gd2l6YXJkRGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spCi0JCXsKLQkJCS8vdG9kby4uLiAgICAgIAotCQl9Ci0JfQotfQotCi1jbGFzcyBHZW5lcmF0ZUJpbmRpbmdDb250ZW50QWN0aW9uIGV4dGVuZHMgQWN0aW9uCi17Ci0JcHJvdGVjdGVkIEJpbmRpbmcgYmluZGluZzsKLQlwdWJsaWMgR2VuZXJhdGVCaW5kaW5nQ29udGVudEFjdGlvbihCaW5kaW5nIGJpbmRpbmcsIGJvb2xlYW4gaXNFZGl0YWJsZSkKLQl7Ci0JCXN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0dFTkVSQVRFX0JJTkRJTkdfQ09OVEVOVCIpKTsKLQkJdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLQkJc2V0RW5hYmxlZChpc0VkaXRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkKLQl7Ci0JCUJpbmRpbmdXaXphcmQgd2l6YXJkID0gbmV3IEJpbmRpbmdXaXphcmQoYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGJpbmRpbmcsIEJpbmRpbmdXaXphcmQuS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcpOwotCQl3aXphcmQuc2V0QmluZGluZ05hbWUoQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXROYW1lKGJpbmRpbmcpKTsKLQkJd2l6YXJkLnNldFBvcnRUeXBlTmFtZShDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldFBvcnRUeXBlUmVmZXJlbmNlKGJpbmRpbmcpKTsKLQkJV2l6YXJkRGlhbG9nIHdpemFyZERpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJd2l6YXJkRGlhbG9nLmNyZWF0ZSgpOwotCQl3aXphcmREaWFsb2cub3BlbigpOwkKLQl9Ci19Ci0KLS8vVGhpcyBpcyBhIHRlbXBvcmFyeSBjbGFzcyB0byBhbGxvdyByZW5hbWluZy4gIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdoZW4gZGlyZWN0Ci0vL3JlbmFtaW5nIGlzIHJlYWR5Ci1jbGFzcyBSZW5hbWVEaWFsb2dBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgV1NETEVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0TmFtZSA9ICJOZXdOYW1lIjsKLQlwcml2YXRlIExpc3QgdXNlZE5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiB1c2VTbWFydFJlbmFtZSA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBzaG93RGlhbG9nID0gZmFsc2U7Ci0JCi0JcHVibGljIFJlbmFtZURpYWxvZ0FjdGlvbihXU0RMRWxlbWVudCBzZWxlY3Rpb24pIHsKLQkJc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fUkVOQU1FIikpOwotCQllbGVtZW50ID0gc2VsZWN0aW9uOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU3RyaW5nIHJlc3VsdDsKLQotCQlOZXdDb21wb25lbnREaWFsb2cgZGlhbG9nID0gbmV3IE5ld0NvbXBvbmVudERpYWxvZyhXU0RMRWRpdG9yUGx1Z2luLmdldFNoZWxsKCksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9SRU5BTUUiKSwgZGVmYXVsdE5hbWUsIHVzZWROYW1lcyk7Ci0JCWludCByYyA9IGRpYWxvZy5jcmVhdGVBbmRPcGVuKCk7Ci0JCWlmIChyYyA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotCQl7Ci0JCSAgcmVzdWx0ID0gZGlhbG9nLmdldE5hbWUoKTsKLQkJICBpZiAodXNlU21hcnRSZW5hbWUpIHsKLQkJICAJU21hcnRSZW5hbWVBY3Rpb24gc21hcnRSZW5hbWUgPSBuZXcgU21hcnRSZW5hbWVBY3Rpb24oZWxlbWVudCwgcmVzdWx0KTsJCi0JCSAgCXNtYXJ0UmVuYW1lLnJ1bigpOwotCQkgIH0KLQkJICBlbHNlIHsKLQkJICAJUmVuYW1lQWN0aW9uIHJlbmFtZSA9IG5ldyBSZW5hbWVBY3Rpb24oZWxlbWVudCwgcmVzdWx0KTsKLQkJICAJcmVuYW1lLnJ1bigpOwotCQkgIH0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZhdWx0KSB7Ci0JCQl1c2VkTmFtZXMgPSBOYW1lVXRpbC5nZXRVc2VkRmF1bHROYW1lcygoT3BlcmF0aW9uKSAoKEZhdWx0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkpOwotCQkJZGVmYXVsdE5hbWUgPSAoKEZhdWx0KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7Ci0JCQl1c2VkTmFtZXMgPSBOYW1lVXRpbC5nZXRVc2VkTWVzc2FnZU5hbWVzKGVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLQkJCWRlZmF1bHROYW1lID0gKChNZXNzYWdlKSBlbGVtZW50KS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJCi0JCQlzaG93RGlhbG9nID0gdHJ1ZTsKLQkJCXVzZVNtYXJ0UmVuYW1lID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0JCQl1c2VkTmFtZXMgPSBOYW1lVXRpbC5nZXRVc2VkT3BlcmF0aW9uTmFtZXMoKFBvcnRUeXBlKSAoKE9wZXJhdGlvbikgZWxlbWVudCkuZUNvbnRhaW5lcigpKTsJCQotCQkJZGVmYXVsdE5hbWUgPSAoKE9wZXJhdGlvbikgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCi0JCQlzaG93RGlhbG9nID0gdHJ1ZTsKLQkJCXVzZVNtYXJ0UmVuYW1lID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFydCkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZFBhcnROYW1lcygoTWVzc2FnZSkgKChQYXJ0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkpOwkJCQotCQkJZGVmYXVsdE5hbWUgPSAoKFBhcnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQotCQkJc2hvd0RpYWxvZyA9IHRydWU7Ci0JCQl1c2VTbWFydFJlbmFtZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0JCQl1c2VkTmFtZXMgPSBOYW1lVXRpbC5nZXRVc2VkUG9ydFR5cGVOYW1lcyhlbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCQlkZWZhdWx0TmFtZSA9ICgoUG9ydFR5cGUpIGVsZW1lbnQpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSBmYWxzZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydCkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZFBvcnROYW1lcygoU2VydmljZSkgKChQb3J0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkpOwotCQkJZGVmYXVsdE5hbWUgPSAoKFBvcnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQotCQkJc2hvd0RpYWxvZyA9IHRydWU7Ci0JCQl1c2VTbWFydFJlbmFtZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLQkJCXVzZWROYW1lcyA9IE5hbWVVdGlsLmdldFVzZWRCaW5kaW5nTmFtZXMoZWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwkJCQotCQkJZGVmYXVsdE5hbWUgPSAoKEJpbmRpbmcpIGVsZW1lbnQpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0JCQkKLQkJCXNob3dEaWFsb2cgPSB0cnVlOwotCQkJdXNlU21hcnRSZW5hbWUgPSBmYWxzZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmljZSkgewotCQkJdXNlZE5hbWVzID0gTmFtZVV0aWwuZ2V0VXNlZFNlcnZpY2VOYW1lcyhlbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0JCQlkZWZhdWx0TmFtZSA9ICgoU2VydmljZSkgZWxlbWVudCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJCQotCQkJc2hvd0RpYWxvZyA9IHRydWU7Ci0JCQl1c2VTbWFydFJlbmFtZSA9IGZhbHNlOwotCQl9Ci0JCXVzZWROYW1lcy5yZW1vdmUoZGVmYXVsdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG93UmVuYW1lRGlhbG9nKCkgewotCQlyZXR1cm4gc2hvd0RpYWxvZzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0RMTWVudUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExNZW51TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxYzIzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9hY3Rpb25zL1dTRExNZW51TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgV1NETE1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIKLXsgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBFeHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci0KLSAgcHVibGljIFdTRExNZW51TGlzdGVuZXIoV1NETEVkaXRvciBlZGl0b3IsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHN1cGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5leHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IEV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IoZWRpdG9yKTsKLSAgICB0aGlzLnNlbGVjdGlvblByb3ZpZGVyID0gc2VsZWN0aW9uUHJvdmlkZXI7ICAgICAgICAgICAgICAKLSAgfQotICAgICAgCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0ZWRPYmplY3QoKQotICB7ICAgICAgCi0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsgICAgCi0gICAgcmV0dXJuIHNlbGVjdGlvbi5pc0VtcHR5KCkgPyBudWxsIDogKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOyAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPYmplY3Qgb2JqZWN0ID0gZ2V0U2VsZWN0ZWRPYmplY3QoKTsKLSAgICBOb2RlIG5vZGUgPSBudWxsOwotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKQotICAgIHsKLSAgICAgIG5vZGUgPSAoTm9kZSlvYmplY3Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIG5vZGUgPSAoKFdTRExFbGVtZW50KW9iamVjdCkuZ2V0RWxlbWVudCgpOyAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIG5vZGUgPSAgKChXU0RMR3JvdXBPYmplY3Qpb2JqZWN0KS5nZXREZWZpbml0aW9uKCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICBleHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVNZW51QWN0aW9ucyhtYW5hZ2VyLCBub2RlLCBvYmplY3QpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTgxN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRCaW5kaW5nQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lOwotICBwcml2YXRlIEJpbmRpbmcgYmluZGluZzsKLSAKLSAgcHVibGljIEFkZEJpbmRpbmdDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLQkJIFN0cmluZyBsb2NhbE5hbWUpCi0JewotCSAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotCX0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiaW5kaW5nID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICBiaW5kaW5nLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLGxvY2FsTmFtZSkpOwotICAgIGJpbmRpbmcuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZEJpbmRpbmcoYmluZGluZyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdGYXVsdENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdGYXVsdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlMDJhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRCaW5kaW5nRmF1bHRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRCaW5kaW5nRmF1bHRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQ7Ci0gIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLSAgU3RyaW5nIG5hbWU7Ci0gIAotICBwdWJsaWMgQWRkQmluZGluZ0ZhdWx0Q29tbWFuZChCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24sIFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nT3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGJpbmRpbmdGYXVsdCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICBiaW5kaW5nRmF1bHQuc2V0TmFtZShuYW1lKTsgCi0gICAgYmluZGluZ0ZhdWx0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uYWRkQmluZGluZ0ZhdWx0KChCaW5kaW5nRmF1bHQpYmluZGluZ0ZhdWx0KTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBiaW5kaW5nRmF1bHQ7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ0lucHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ0lucHV0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzAzYjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdJbnB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEJpbmRpbmdJbnB1dENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dDsKLSAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uOwotICBTdHJpbmcgbmFtZTsKLSAgCi0gIHB1YmxpYyBBZGRCaW5kaW5nSW5wdXRDb21tYW5kKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdPcGVyYXRpb24gPSBiaW5kaW5nT3BlcmF0aW9uOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgYmluZGluZ0lucHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdJbnB1dCgpOwotICAgIGJpbmRpbmdJbnB1dC5zZXROYW1lKG5hbWUpOyAKLSAgICBiaW5kaW5nSW5wdXQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihiaW5kaW5nT3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dCliaW5kaW5nSW5wdXQpOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ09wZXJhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPcGVyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTBmOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ09wZXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkQmluZGluZ09wZXJhdGlvbkNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBCaW5kaW5nIGJpbmRpbmc7Ci0gIAotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIFN0cmluZyBiaW5kaW5nSW5wdXROYW1lID0gIiI7Ci0gIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdPdXRwdXROYW1lID0gIiI7Ci0gIHByaXZhdGUgU3RyaW5nIGJpbmRpbmdGYXVsdE5hbWUgPSIiOwotICAKLSAgcHJpdmF0ZSBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlQmluZGluZ0lucHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVCaW5kaW5nT3V0cHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVCaW5kaW5nRmF1bHQgPSBmYWxzZTsKLSAgCi0gIHB1YmxpYyBBZGRCaW5kaW5nT3BlcmF0aW9uQ29tbWFuZChCaW5kaW5nIGJpbmRpbmcsU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBBZGRCaW5kaW5nT3BlcmF0aW9uQ29tbWFuZAotICAgIChCaW5kaW5nIGJpbmRpbmcsICAKLSAgICAgU3RyaW5nIG5hbWUsCi0gICAgIGJvb2xlYW4gY3JlYXRlQmluZGluZ0lucHV0LAotICAgICBib29sZWFuIGNyZWF0ZUJpbmRpbmdPdXRwdXQsCi0gICAgIGJvb2xlYW4gY3JlYXRlQmluZGluZ0ZhdWx0KQotICB7Ci0gICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuY3JlYXRlQmluZGluZ0lucHV0ID0gY3JlYXRlQmluZGluZ0lucHV0OwotICAgIHRoaXMuY3JlYXRlQmluZGluZ091dHB1dCA9IGNyZWF0ZUJpbmRpbmdPdXRwdXQ7Ci0gICAgdGhpcy5jcmVhdGVCaW5kaW5nRmF1bHQgPSBjcmVhdGVCaW5kaW5nRmF1bHQ7Ci0gIH0KLSAgICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGJpbmRpbmdPcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShuYW1lKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEVuY2xvc2luZ0RlZmluaXRpb24oYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIGJpbmRpbmcuYWRkQmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLQotICAgIFdTRExFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICBpZiAoY3JlYXRlQmluZGluZ0lucHV0KQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkQmluZGluZ0lucHV0Q29tbWFuZChiaW5kaW5nT3BlcmF0aW9uLGJpbmRpbmdJbnB1dE5hbWUpOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICB9Ci0KLSAgICBpZiAoY3JlYXRlQmluZGluZ091dHB1dCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IEFkZEJpbmRpbmdPdXRwdXRDb21tYW5kKGJpbmRpbmdPcGVyYXRpb24sYmluZGluZ091dHB1dE5hbWUpOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICB9Ci0KLSAgICBpZiAoY3JlYXRlQmluZGluZ0ZhdWx0KQotICAgIHsKLSAgICAgIGNvbW1hbmQgPSBuZXcgQWRkQmluZGluZ0ZhdWx0Q29tbWFuZChiaW5kaW5nT3BlcmF0aW9uLGJpbmRpbmdGYXVsdE5hbWUpOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdJbnB1dE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLmJpbmRpbmdJbnB1dE5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nT3V0cHV0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZ091dHB1dE5hbWUgPSBuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nRmF1bHROYW1lKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5iaW5kaW5nRmF1bHROYW1lID0gbmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ091dHB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEJpbmRpbmdPdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODZiNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkQmluZGluZ091dHB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRCaW5kaW5nT3V0cHV0Q29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQ7Ci0gIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLSAgU3RyaW5nIG5hbWU7Ci0gIAotICBwdWJsaWMgQWRkQmluZGluZ091dHB1dENvbW1hbmQoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMuYmluZGluZ09wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBiaW5kaW5nT3V0cHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICBiaW5kaW5nT3V0cHV0LnNldE5hbWUobmFtZSk7IAotICAgIGJpbmRpbmdPdXRwdXQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihiaW5kaW5nT3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nT3V0cHV0KChCaW5kaW5nT3V0cHV0KWJpbmRpbmdPdXRwdXQpOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdPdXRwdXQ7Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkRmF1bHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRGYXVsdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhMDZiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRGYXVsdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuU21hcnRSZW5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkRmF1bHRDb21tYW5kIGV4dGVuZHMgQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQKLXsKLSAgcHJpdmF0ZSBGYXVsdCBvcmlnaW5hbEZhdWx0OwotICAKLSAgcHVibGljIEFkZEZhdWx0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRGYXVsdENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlTWVzc2FnZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lLGNyZWF0ZU1lc3NhZ2UpOwotICB9Ci0gIAotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBhIEZhdWx0IGJhc2VkIG9uIHRoZSBnaXZlbiBGYXVsdC4gIEluIGVzc2VuY2UsIHRoaXMgd2lsbAotICAgKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBnaXZlbiBGYXVsdC4KLSAgICovCi0gIHB1YmxpYyBBZGRGYXVsdENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgRmF1bHQgb3JpZ2luYWxGYXVsdCwgU3RyaW5nIG5hbWUpIHsKLSAgCXN1cGVyKG9wZXJhdGlvbiwgbmFtZSwgZmFsc2UpOwotICAJCi0gIAl0aGlzLm9yaWdpbmFsRmF1bHQgPSBvcmlnaW5hbEZhdWx0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgbWVzc2FnZVJlZmVyZW5jZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGYXVsdCgpOwotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0TmFtZShuYW1lKTsgCi0gICAgbWVzc2FnZVJlZmVyZW5jZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIG9wZXJhdGlvbi5hZGRGYXVsdCgoRmF1bHQpbWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgCi0gICAgLy8gIFRCRCAtIGFkZCBiaW5kaW5nIGZhdWx0Ci0KLSAgICBpZiAob3JpZ2luYWxGYXVsdCA9PSBudWxsKSB7Ci0gICAgCWlmIChjcmVhdGVNZXNzYWdlKQotICAgIAkJY3JlYXRlTWVzc2FnZSgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAJLy8gRG8gbmVjZXNzYXJ5IGNvcHlpbmcgb2YgZGF0YSBmcm9tIG9yaWdpbmFsIEZhdWx0IHRvIG5ldyBGYXVsdAotICAgIAlpZiAob3JpZ2luYWxGYXVsdC5nZXRFTWVzc2FnZSgpICE9IG51bGwpIHsKLSAgICAJCVN0cmluZyBvcmlnaW5hbE1zZ05hbWUgPSBvcmlnaW5hbEZhdWx0LmdldEVNZXNzYWdlKCkuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAJCQotICAgIAkJYm9vbGVhbiBnZW5lZCA9IGZhbHNlOwotICAgIAkJaWYgKG9yaWdpbmFsRmF1bHQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgIAkJCWdlbmVkID0gU21hcnRSZW5hbWVBY3Rpb24uaXNNZXNzYWdlTmFtZUdlbmVyYXRlZChvcmlnaW5hbE1zZ05hbWUsICgoT3BlcmF0aW9uKSBvcmlnaW5hbEZhdWx0LmVDb250YWluZXIoKSkuZ2V0TmFtZSgpLCAiIik7Ci0gICAgCQkKLSAgICAJCVN0cmluZyBuZXdNc2dOYW1lID0gIiI7Ci0gICAgCQlpZiAoZ2VuZWQpIHsKLSAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBtZXNzYWdlUmVmZXJlbmNlKTsKLSAgICAJCX0KLSAgICAJCWVsc2UgewotICAgIAkJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgCQkJTWVzc2FnZSB0TWVzc2FnZSA9IG9yaWdpbmFsRmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLSAgICAJCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCB0TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAJCX0KLSAgICAJCQotICAgIAkJY3JlYXRlTWVzc2FnZShvcmlnaW5hbEZhdWx0LCBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIG1lc3NhZ2VSZWZlcmVuY2UpKTsKLSAgICAJfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkSW1wb3J0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkSW1wb3J0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmM0ZWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZEltcG9ydENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZEltcG9ydENvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0gIHByaXZhdGUgSW1wb3J0IGltcG9ydEVsZW1lbnQ7Ci0gIAotICBwdWJsaWMgQWRkSW1wb3J0Q29tbWFuZAotICAJKERlZmluaXRpb24gZGVmaW5pdGlvbiwgIAotICAJIFN0cmluZyBuYW1lc3BhY2UsCi0gIAkgU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpbXBvcnRFbGVtZW50ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUltcG9ydCgpOwotICAgIGltcG9ydEVsZW1lbnQuc2V0TmFtZXNwYWNlVVJJKG5hbWVzcGFjZSk7Ci0gICAgaW1wb3J0RWxlbWVudC5zZXRMb2NhdGlvblVSSShsb2NhdGlvbik7Ci0gICAgaW1wb3J0RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkSW1wb3J0KGltcG9ydEVsZW1lbnQpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZElucHV0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkSW5wdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzNiNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkSW5wdXRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuTmFtZVV0aWw7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZElucHV0Q29tbWFuZCBleHRlbmRzIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kCi17Ci0gIHByaXZhdGUgSW5wdXQgb3JpZ2luYWxJbnB1dDsKLQkKLSAgcHVibGljIEFkZElucHV0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBBZGRJbnB1dENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlTWVzc2FnZSkKLSAgewotICAgIHN1cGVyKG9wZXJhdGlvbixuYW1lLGNyZWF0ZU1lc3NhZ2UpOwotICB9Ci0gIAotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBhbiBJbnB1dCBiYXNlZCBvbiB0aGUgZ2l2ZW4gSW5wdXQuICBJbiBlc3NlbmNlLCB0aGlzIHdpbGwKLSAgICogY3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gSW5wdXQuCi0gICAqLwotICBwdWJsaWMgQWRkSW5wdXRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIElucHV0IG9yaWdpbmFsSW5wdXQsIFN0cmluZyBuYW1lKSB7Ci0gIAlzdXBlcihvcGVyYXRpb24sIG5hbWUsIGZhbHNlKTsKLSAgCQotICAJdGhpcy5vcmlnaW5hbElucHV0ID0gb3JpZ2luYWxJbnB1dDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG1lc3NhZ2VSZWZlcmVuY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5wdXQoKTsKLSAgLy8gIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0TmFtZShuYW1lKTsgCi0gICAgbWVzc2FnZVJlZmVyZW5jZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIG9wZXJhdGlvbi5zZXRJbnB1dCgoSW5wdXQpbWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgCi0gICAgLy8gVEJEIC0gYWRkIGJpbmRpbmcgaW5wdXQgCi0gICAgCi0gICAgaWYgKG9yaWdpbmFsSW5wdXQgPT0gbnVsbCkgewotICAgIAlpZiAoY3JlYXRlTWVzc2FnZSkKLSAgICAJCWNyZWF0ZU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCS8vIERvIG5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSBvcmlnaW5hbCBJbnB1dCB0byBuZXcgSW5wdXQKLSAgICAJaWYgKG9yaWdpbmFsSW5wdXQuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0gICAgCQlTdHJpbmcgb3JpZ2luYWxNc2dOYW1lID0gb3JpZ2luYWxJbnB1dC5nZXRFTWVzc2FnZSgpLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgCQkKLSAgICAJCWJvb2xlYW4gZ2VuZWQgPSBmYWxzZTsKLSAgICAJCWlmIChvcmlnaW5hbElucHV0LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLSAgICAJCQlnZW5lZCA9IFNtYXJ0UmVuYW1lQWN0aW9uLmlzTWVzc2FnZU5hbWVHZW5lcmF0ZWQob3JpZ2luYWxNc2dOYW1lLCAoKE9wZXJhdGlvbikgb3JpZ2luYWxJbnB1dC5lQ29udGFpbmVyKCkpLmdldE5hbWUoKSwgIlJlcXVlc3QiKTsKLSAgICAJCQotICAgIAkJU3RyaW5nIG5ld01zZ05hbWUgPSAiIjsKLSAgICAJCWlmIChnZW5lZCkgewotICAgIAkJCW5ld01zZ05hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIG1lc3NhZ2VSZWZlcmVuY2UpOwotICAgIAkJfQotICAgIAkJZWxzZSB7Ci0gICAgCQkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAJCQlNZXNzYWdlIHRNZXNzYWdlID0gb3JpZ2luYWxJbnB1dC5nZXRFTWVzc2FnZSgpOwotICAgIAkJCW5ld01zZ05hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKGRlZmluaXRpb24sIHRNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIAkJfQotCi0gICAgCQljcmVhdGVNZXNzYWdlKG9yaWdpbmFsSW5wdXQsIG5ld01zZ05hbWUpOwotICAgIAl9Ci0gICAgfQotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkTWVzc2FnZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE1lc3NhZ2VDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzk3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkTWVzc2FnZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuU21hcnRSZW5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZE1lc3NhZ2VDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gIHByaXZhdGUgTWVzc2FnZSBtZXNzYWdlOwotICBwcml2YXRlIE1lc3NhZ2Ugb3JpZ2luYWxNZXNzYWdlOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZVBhcnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQVJUX05BTUUgPSAiTmV3UGFydCI7Ci0gIAotICBwdWJsaWMgQWRkTWVzc2FnZUNvbW1hbmQKLSAgCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLSAgCSBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgfQotICAKLSAgcHVibGljIEFkZE1lc3NhZ2VDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sIAotCQkgU3RyaW5nIGxvY2FsTmFtZSwKLQkJIGJvb2xlYW4gY3JlYXRlUGFydCkKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JICB0aGlzLmNyZWF0ZVBhcnQgPSBjcmVhdGVQYXJ0OwotCX0KLSAgCi0gIC8qCi0gICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIGEgTWVzc2FnZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gTWVzc2FnZS4gIEluIGVzc2VuY2UsIHRoaXMgd2lsbAotICAgKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBnaXZlbiBNZXNzYWdlLgotICAgKi8KLSAgcHVibGljIEFkZE1lc3NhZ2VDb21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTWVzc2FnZSBvcmlnaW5hbE1lc3NhZ2UsIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gY29weVBhcnQpIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCXRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotCXRoaXMuY3JlYXRlUGFydCA9IGNvcHlQYXJ0OwotICAJdGhpcy5vcmlnaW5hbE1lc3NhZ2UgPSBvcmlnaW5hbE1lc3NhZ2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBtZXNzYWdlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBtZXNzYWdlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLGxvY2FsTmFtZSkpOwotICAgIG1lc3NhZ2Uuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgCi0gICAgaWYgKG9yaWdpbmFsTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgCWlmIChjcmVhdGVQYXJ0KQotICAgIAl7Ci0gICAgCQlBZGRQYXJ0Q29tbWFuZCBjb21tYW5kID0gCi0gICAgCQkJbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsREVGQVVMVF9QQVJUX05BTUUsV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwic3RyaW5nIix0cnVlKTsKLSAgICAJCWNvbW1hbmQucnVuKCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCWlmIChvcmlnaW5hbE1lc3NhZ2UuZ2V0RVBhcnRzKCkgIT0gbnVsbCkgewotICAgIAkJSXRlcmF0b3IgaXQgPSBvcmlnaW5hbE1lc3NhZ2UuZ2V0RVBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAJCQotICAgIAkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgIAkJCVBhcnQgcGFydCA9IChQYXJ0KSBpdC5uZXh0KCk7Ci0gICAgCQkJQWRkUGFydENvbW1hbmQgY29tbWFuZDsKLSAgICAJCQlpZiAoU21hcnRSZW5hbWVBY3Rpb24uaXNQYXJ0TmFtZUdlbmVyYXRlZChwYXJ0LmdldE5hbWUoKSwgb3JpZ2luYWxNZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKQotICAgIAkJCQljb21tYW5kID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIHBhcnQsIE5hbWVVdGlsLmJ1aWxkVW5pcXVlUGFydE5hbWUobWVzc2FnZSwgbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKSk7CQotICAgIAkJCWVsc2UKLSAgICAJCQkJY29tbWFuZCA9IG5ldyBBZGRQYXJ0Q29tbWFuZChtZXNzYWdlLCBwYXJ0LCBwYXJ0LmdldE5hbWUoKSk7Ci0gICAgCQkJCi0gICAgCQkJCi0gICAgCQkJY29tbWFuZC5ydW4oKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubG9jYWxOYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRNZXNzYWdlUmVmZXJlbmNlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkTWVzc2FnZVJlZmVyZW5jZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjMTFlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRNZXNzYWdlUmVmZXJlbmNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VSZWZlcmVuY2UgbWVzc2FnZVJlZmVyZW5jZTsKLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBvcGVyYXRpb247Ci0gIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UgPSBmYWxzZTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9NRVNTQUdFX05BTUUgPSAiTmV3TWVzc2FnZSI7Ci0KLSAgcHVibGljIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgfQotICAKLSAgcHVibGljIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZU1lc3NhZ2UpCi0gIHsKLSAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuY3JlYXRlTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNZXNzYWdlKCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG9wZXJhdGlvbi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgQWRkTWVzc2FnZUNvbW1hbmQgY29tbWFuZCA9IAotICAgICAgbmV3IEFkZE1lc3NhZ2VDb21tYW5kKGRlZmluaXRpb24sREVGQVVMVF9NRVNTQUdFX05BTUUsY3JlYXRlTWVzc2FnZSk7ICAgICAgCi0gICAgY29tbWFuZC5ydW4oKTsKLSAgICBtZXNzYWdlUmVmZXJlbmNlLnNldEVNZXNzYWdlKChNZXNzYWdlKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIE92ZXJsb2FkZWQgY3JlYXRlTWVzc2FnZShhcmcpIG1ldGhvZC4gIFNpbWlsYXIgdG8gdG8gY3JlYXRlTWVzc2FnZSgpIGJ1dCB0YWtlcyBpbiBhIE1lc3NhZ2VSZWZlcmVuY2UuCi0gICAqIE1ldGhvZCB1c2VkIHRvIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIE1lc3NhZ2UgKGNvbnRhaW5lZCBpbiB0aGUgcGFzc2VkIGluIE1lc3NhZ2VSZWZlcmVuY2UpLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWVzc2FnZShNZXNzYWdlUmVmZXJlbmNlIG9yaWdpbmFsTVJlZiwgU3RyaW5nIG5ld01lc3NhZ2VSZWZOYW1lKSB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBNZXNzYWdlIHRNZXNzYWdlID0gb3JpZ2luYWxNUmVmLmdldEVNZXNzYWdlKCk7Ci0gICAgQWRkTWVzc2FnZUNvbW1hbmQgY29tbWFuZCA9IAotICAgICAgbmV3IEFkZE1lc3NhZ2VDb21tYW5kKGRlZmluaXRpb24sIHRNZXNzYWdlLCBuZXdNZXNzYWdlUmVmTmFtZSwgdHJ1ZSk7Ci0gICAgY29tbWFuZC5ydW4oKTsKLSAgICBtZXNzYWdlUmVmZXJlbmNlLnNldEVNZXNzYWdlKChNZXNzYWdlKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZVJlZmVyZW5jZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE9wZXJhdGlvbkNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZE9wZXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1OWZjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPcGVyYXRpb25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkT3BlcmF0aW9uQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIFBvcnRUeXBlIHBvcnRUeXBlOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIE9wZXJhdGlvbiBvcGVyYXRpb247Ci0gIHByaXZhdGUgT3BlcmF0aW9uIG9yaWdpbmFsT3BlcmF0aW9uOwotICBwcml2YXRlIGJvb2xlYW4gY29weUluT3V0RmF1bHQ7Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlSW5wdXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZU91dHB1dCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gY3JlYXRlRmF1bHQgPSBmYWxzZTsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfSU5QVVRfTkFNRSA9ICIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX09VVFBVVF9OQU1FID0gIiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRkFVTFRfRkFVTFRfTkFNRSA9ICIiOwotICAKLSAgcHVibGljIEFkZE9wZXJhdGlvbkNvbW1hbmQKLQkJKFBvcnRUeXBlIHBvcnRUeXBlLCAgCi0JCSBTdHJpbmcgbmFtZSkKLQl7Ci0JICB0aGlzLnBvcnRUeXBlID0gcG9ydFR5cGU7Ci0JICB0aGlzLm5hbWUgPSBuYW1lOwotCX0KLSAgCi0gIHB1YmxpYyBBZGRPcGVyYXRpb25Db21tYW5kCi0JCShQb3J0VHlwZSBwb3J0VHlwZSwgIAotCQkgU3RyaW5nIG5hbWUsCi0JCSBib29sZWFuIGNyZWF0ZUlucHV0LAotCQkgYm9vbGVhbiBjcmVhdGVPdXRwdXQsCi0JCSBib29sZWFuIGNyZWF0ZUZhdWx0KQotCXsKLQkgIHRoaXMucG9ydFR5cGUgPSBwb3J0VHlwZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JICB0aGlzLmNyZWF0ZUlucHV0ID0gY3JlYXRlSW5wdXQ7Ci0JICB0aGlzLmNyZWF0ZU91dHB1dCA9IGNyZWF0ZU91dHB1dDsKLQkgIHRoaXMuY3JlYXRlRmF1bHQgPSBjcmVhdGVGYXVsdDsKLQl9Ci0gIAotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBhbiBPcGVyYXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIE9wZXJhdGlvbi4gIEluIGVzc2VuY2UsIHRoaXMgd2lsbAotICAgKiBjcmVhdGUgYSBjb3B5IG9mIHRoZSBnaXZlbiBPcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgQWRkT3BlcmF0aW9uQ29tbWFuZChQb3J0VHlwZSBwb3J0VHlwZSwgT3BlcmF0aW9uIG9yaWdpbmFsT3BlcmF0aW9uLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjb3B5SW5PdXRGYXVsdCkgewotICAJdGhpcy5wb3J0VHlwZSA9IHBvcnRUeXBlOwotICAJdGhpcy5vcmlnaW5hbE9wZXJhdGlvbiA9IG9yaWdpbmFsT3BlcmF0aW9uOwotICAJdGhpcy5uYW1lID0gbmFtZTsKLSAgCXRoaXMuY29weUluT3V0RmF1bHQgPSBjb3B5SW5PdXRGYXVsdDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIG9wZXJhdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcGVyYXRpb24oKTsKLSAgICBvcGVyYXRpb24uc2V0TmFtZShuYW1lKTsKLSAgICBvcGVyYXRpb24uc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihwb3J0VHlwZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgIHBvcnRUeXBlLmFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwotCi0gICAgaWYgKG9yaWdpbmFsT3BlcmF0aW9uID09IG51bGwpIHsgICAgCi0gICAgCVdTRExFbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbnVsbDsKLSAgICAJaWYgKGNyZWF0ZUlucHV0KQotICAgIAl7Ci0gICAgCQljb21tYW5kID0gbmV3IEFkZElucHV0Q29tbWFuZChvcGVyYXRpb24sREVGQVVMVF9JTlBVVF9OQU1FLHRydWUpOwotICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAJfQotICAgIAotICAgIAlpZiAoY3JlYXRlT3V0cHV0KQotICAgIAl7Ci0gICAgCQljb21tYW5kID0gbmV3IEFkZE91dHB1dENvbW1hbmQob3BlcmF0aW9uLERFRkFVTFRfT1VUUFVUX05BTUUsdHJ1ZSk7Ci0gICAgCQljb21tYW5kLnJ1bigpOwotICAgIAl9Ci0gICAgCi0gICAgCWlmIChjcmVhdGVGYXVsdCkKLSAgICAJewotICAgIAkJY29tbWFuZCA9IG5ldyBBZGRGYXVsdENvbW1hbmQob3BlcmF0aW9uLERFRkFVTFRfRkFVTFRfTkFNRSx0cnVlKTsKLSAgICAJCWNvbW1hbmQucnVuKCk7Ci0gICAgCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCS8vIERvIG5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSBvcmlnaW5hbCBvcGVyYXRpb24gdG8gbmV3IG9wZXJhdGlvbgotICAgIAkvLyBQYXJhbWF0ZXIgb3JkZXJpbmc/IERvY3VtZW50YXRpb24/ICBUaGlzIHBhcnQgc3RpbGwgbmVlZHMgdG8gYmUgd29ya2VkIG9uICAgIAkKLSAgICAJLy8gQ29weSAna2lkcycgaWYgbmVjZXNzYXJ5Ci0gICAgCWlmIChjb3B5SW5PdXRGYXVsdCkgewotICAgIAkJV1NETEVsZW1lbnRDb21tYW5kIGNvbW1hbmQgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgCWlmIChvcmlnaW5hbE9wZXJhdGlvbi5nZXRFT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgCXsKLSAgICAgICAgCQlPdXRwdXQgb3V0cHV0ID0gb3JpZ2luYWxPcGVyYXRpb24uZ2V0RU91dHB1dCgpOwotICAgICAgICAJCWNvbW1hbmQgPSBuZXcgQWRkT3V0cHV0Q29tbWFuZChvcGVyYXRpb24sIG91dHB1dCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVPdXRwdXROYW1lKHBvcnRUeXBlLCBvcGVyYXRpb24uZ2V0TmFtZSgpLCAiIikpOwotICAgICAgICAJCWNvbW1hbmQucnVuKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAkKLSAgICAgICAgCWlmIChvcmlnaW5hbE9wZXJhdGlvbi5nZXRFSW5wdXQoKSAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCUlucHV0IGlucHV0ID0gb3JpZ2luYWxPcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgICAgIAkJY29tbWFuZCA9IG5ldyBBZGRJbnB1dENvbW1hbmQob3BlcmF0aW9uLCBpbnB1dCwgTmFtZVV0aWwuYnVpbGRVbmlxdWVJbnB1dE5hbWUocG9ydFR5cGUsIG9wZXJhdGlvbi5nZXROYW1lKCksICIiKSk7Ci0gICAgICAgIAkJY29tbWFuZC5ydW4oKTsKLSAgICAgICAgCX0KLSAgICAgICAgCi0gICAgICAgIAlpZiAob3JpZ2luYWxPcGVyYXRpb24uZ2V0RUZhdWx0cygpICE9IG51bGwpCi0gICAgICAgIAl7Ci0gICAgICAgIAkJSXRlcmF0b3IgaXQgPSBvcmlnaW5hbE9wZXJhdGlvbi5nZXRFRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpdC5uZXh0KCk7Ci0gICAgICAgIAkJCWNvbW1hbmQgPSBuZXcgQWRkRmF1bHRDb21tYW5kKG9wZXJhdGlvbiwgZmF1bHQsIE5hbWVVdGlsLmJ1aWxkVW5pcXVlRmF1bHROYW1lKG9yaWdpbmFsT3BlcmF0aW9uLCBmYXVsdC5nZXROYW1lKCkpKTsKLSAgICAgICAgCQkJY29tbWFuZC5ydW4oKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgCQkKLSAgICAJfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPdXRwdXRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRPdXRwdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTdjNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkT3V0cHV0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuU21hcnRSZW5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkT3V0cHV0Q29tbWFuZCBleHRlbmRzIEFkZE1lc3NhZ2VSZWZlcmVuY2VDb21tYW5kCi17Ci0gIHByaXZhdGUgT3V0cHV0IG9yaWdpbmFsT3V0cHV0OwotICAKLSAgcHVibGljIEFkZE91dHB1dENvbW1hbmQoT3BlcmF0aW9uIG9wZXJhdGlvbiwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihvcGVyYXRpb24sbmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgQWRkT3V0cHV0Q29tbWFuZChPcGVyYXRpb24gb3BlcmF0aW9uLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGVNZXNzYWdlKQotICB7Ci0gICAgc3VwZXIob3BlcmF0aW9uLG5hbWUsY3JlYXRlTWVzc2FnZSk7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gY3JlYXRlIGFuIE91dHB1dCBiYXNlZCBvbiB0aGUgZ2l2ZW4gT3V0cHV0LiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIE91dHB1dC4KLSAgICovCi0gIHB1YmxpYyBBZGRPdXRwdXRDb21tYW5kKE9wZXJhdGlvbiBvcGVyYXRpb24sIE91dHB1dCBvcmlnaW5hbE91dHB1dCwgU3RyaW5nIG5hbWUpIHsKLSAgCXN1cGVyKG9wZXJhdGlvbiwgbmFtZSwgZmFsc2UpOwotICAJCi0gIAl0aGlzLm9yaWdpbmFsT3V0cHV0ID0gb3JpZ2luYWxPdXRwdXQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBtZXNzYWdlUmVmZXJlbmNlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dHB1dCgpOwotLy8gICAgbWVzc2FnZVJlZmVyZW5jZS5zZXROYW1lKG5hbWUpOwotICAgIG1lc3NhZ2VSZWZlcmVuY2Uuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBvcGVyYXRpb24uc2V0T3V0cHV0KChPdXRwdXQpbWVzc2FnZVJlZmVyZW5jZSk7Ci0gICAgCi0gICAgLy8gIFRCRCAtIGFkZCBiaW5kaW5nIG91dHB1dCAKLSAgICAKLSAgICBpZiAob3JpZ2luYWxPdXRwdXQgPT0gbnVsbCkgewotICAgIAlpZiAoY3JlYXRlTWVzc2FnZSkKLSAgICAJCWNyZWF0ZU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCS8vIERvIG5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSBvcmlnaW5hbCBPdXRwdXQgdG8gbmV3IE91dHB1dAotICAgIAlpZiAob3JpZ2luYWxPdXRwdXQuZ2V0RU1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0gICAgCQlTdHJpbmcgb3JpZ2luYWxNc2dOYW1lID0gb3JpZ2luYWxPdXRwdXQuZ2V0RU1lc3NhZ2UoKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkKLQkJYm9vbGVhbiBnZW5lZCA9IGZhbHNlOwotCQlpZiAob3JpZ2luYWxPdXRwdXQuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgT3BlcmF0aW9uKQotCQkJZ2VuZWQgPSBTbWFydFJlbmFtZUFjdGlvbi5pc01lc3NhZ2VOYW1lR2VuZXJhdGVkKG9yaWdpbmFsTXNnTmFtZSwgKChPcGVyYXRpb24pIG9yaWdpbmFsT3V0cHV0LmVDb250YWluZXIoKSkuZ2V0TmFtZSgpLCAiUmVzcG9uc2UiKTsKLQkJCi0JCVN0cmluZyBuZXdNc2dOYW1lID0gIiI7Ci0JCWlmIChnZW5lZCkgewotCQkJbmV3TXNnTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUob3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSwgbWVzc2FnZVJlZmVyZW5jZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCQkJTWVzc2FnZSB0TWVzc2FnZSA9IG9yaWdpbmFsT3V0cHV0LmdldEVNZXNzYWdlKCk7Ci0JCQluZXdNc2dOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShkZWZpbml0aW9uLCB0TWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQkJfQotCQkKLSAgICAJY3JlYXRlTWVzc2FnZShvcmlnaW5hbE91dHB1dCwgbmV3TXNnTmFtZSk7Ci0gICAgCX0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBhcnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQYXJ0Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWQ5ZDY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBhcnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlBhcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRQYXJ0Q29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIE1lc3NhZ2UgbWVzc2FnZTsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgcHJpdmF0ZSBQYXJ0IHBhcnQ7Ci0gIHByaXZhdGUgUGFydCBvcmlnaW5hbFBhcnQ7Ci0gIAotICBwcml2YXRlIFFOYW1lIHR5cGVPckVsZW1lbnROYW1lOwotICBwcml2YXRlIGJvb2xlYW4gdXNlVHlwZSA9IHRydWU7Ci0KLSAgcHVibGljIEFkZFBhcnRDb21tYW5kCi0JCShNZXNzYWdlIG1lc3NhZ2UsCi0JCSBTdHJpbmcgbmFtZSkKLQl7Ci0JICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCSAgdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0gIAotICBwdWJsaWMgQWRkUGFydENvbW1hbmQKLQkJKE1lc3NhZ2UgbWVzc2FnZSwKLQkJIFN0cmluZyBuYW1lLAotCQkgU3RyaW5nIG5hbWVzcGFjZSwKLQkJIFN0cmluZyBsb2NhbE5hbWUsCi0JCSBib29sZWFuIHVzZVR5cGUpCi0JewotCSAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JICB0aGlzLnVzZVR5cGUgPSB1c2VUeXBlOwotCSAgdHlwZU9yRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLGxvY2FsTmFtZSk7Ci0JfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB0byBjcmVhdGUgYSBQYXJ0IGJhc2VkIG9uIHRoZSBnaXZlbiBQYXJ0LiAgSW4gZXNzZW5jZSwgdGhpcyB3aWxsCi0gICAqIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGdpdmVuIFBhcnQuCi0gICAqLwotICBwdWJsaWMgQWRkUGFydENvbW1hbmQKLQkoTWVzc2FnZSBtZXNzYWdlLAotCSBQYXJ0IG9yaWdpbmFsUGFydCwKLQkgU3RyaW5nIG5hbWUpCi0gIHsKLSAgCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIAl0aGlzLm5hbWUgPSBuYW1lOwotICAJdGhpcy5vcmlnaW5hbFBhcnQgPSBvcmlnaW5hbFBhcnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIEFkZFBhcnRDb21tYW5kCi0JCShNZXNzYWdlIG1lc3NhZ2UsCi0JCSBTdHJpbmcgbmFtZSwKLQkJIFN0cmluZyBuYW1lc3BhY2UsCi0JCSBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQkgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JICB0aGlzLm5hbWUgPSBuYW1lOwotCSAgdHlwZU9yRWxlbWVudE5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLGxvY2FsTmFtZSk7Ci0JfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gcGFydDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIGlmICh0eXBlT3JFbGVtZW50TmFtZSA9PSBudWxsKQotICAgICAgdHlwZU9yRWxlbWVudE5hbWUgPSBjcmVhdGVEZWZhdWx0VHlwZU5hbWUoKTsKLSAgICAKLSAgICAvLyBBZGQgbmFtZXNwYWNlIHRvIHRoZSBEZWZpbml0aW9ucyBpZiBpdCBpcyBub3QgdGhlcmUgeWV0LgotICAgIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKCk7Ci0gICAgCi0gICAgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgcGFydC5zZXROYW1lKG5hbWUpOwotICAgIAotICAgIGlmIChvcmlnaW5hbFBhcnQgPT0gbnVsbCkgewotICAgIAlpZiAodXNlVHlwZSkKLSAgICAJCXBhcnQuc2V0VHlwZU5hbWUodHlwZU9yRWxlbWVudE5hbWUpOwotICAgIAllbHNlCi0gICAgCQlwYXJ0LnNldEVsZW1lbnROYW1lKHR5cGVPckVsZW1lbnROYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCWlmIChvcmlnaW5hbFBhcnQuZ2V0VHlwZU5hbWUoKSAhPSBudWxsKQotICAgIAkJcGFydC5zZXRUeXBlTmFtZShvcmlnaW5hbFBhcnQuZ2V0VHlwZU5hbWUoKSk7Ci0KLSAgICAJU3RyaW5nIG5ld0VsZW1lbnROYW1lID0gbnVsbDsKLSAgICAJaWYgKG9yaWdpbmFsUGFydC5nZXRFbGVtZW50TmFtZSgpICE9IG51bGwpIHsKLSAgICAJCQotICAgIAkJYm9vbGVhbiBjcmVhdGVOZXdFbGVtZW50ID0gdHJ1ZTsKLSAgICAJCWlmIChvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkgIT0gbnVsbCAmJiBvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgICAgCQlpZiAoIShvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSURPTU5vZGUpKSB7Ci0gICAgICAgIAkJCWNyZWF0ZU5ld0VsZW1lbnQgPSBmYWxzZTsKLSAgICAgICAgCQl9ICAgICAgICAJCQotICAgIAkJfQotICAgIAkJCi0gICAgCQlpZiAoY3JlYXRlTmV3RWxlbWVudCkgewotICAgIAkJCW5ld0VsZW1lbnROYW1lID0gZ2V0TmV3TmFtZUhlbHBlcihuYW1lLCBvcmlnaW5hbFBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBmYWxzZSk7Ci0gICAgCQkJcGFydC5zZXRFbGVtZW50TmFtZShuZXcgUU5hbWUob3JpZ2luYWxQYXJ0LmdldEVsZW1lbnROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCksIG5ld0VsZW1lbnROYW1lKSk7Ci0JCi0gICAgCQkJaWYgKG9yaWdpbmFsUGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgIAkJCQlpZiAobmV3RWxlbWVudE5hbWUgPT0gbnVsbCkgewotICAgIAkJCQkJbmV3RWxlbWVudE5hbWUgPSBnZXROZXdOYW1lSGVscGVyKG5hbWUsIG9yaWdpbmFsUGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIGZhbHNlKTsKLSAgICAJCQkJfQotICAgIAkJCi0gICAgCQkJCUFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQgZWxlbWVudEFjdGlvbiA9IG5ldyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kKG9yaWdpbmFsUGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIG5ld0VsZW1lbnROYW1lKTsKLSAgICAJCQkJZWxlbWVudEFjdGlvbi5ydW4oKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCQllbHNlIHsKLSAgICAJCQlwYXJ0LnNldEVsZW1lbnROYW1lKG5ldyBRTmFtZShvcmlnaW5hbFBhcnQuZ2V0RWxlbWVudE5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgb3JpZ2luYWxQYXJ0LmdldEVsZW1lbnROYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICAJCi0gICAgcGFydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG1lc3NhZ2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAoKFBhcnRJbXBsKXBhcnQpLnJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOyAKLSAgICBtZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBhZGROYW1lc3BhY2VEZWNsYXJhdGlvbigpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBtZXNzYWdlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoIWRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpLmNvbnRhaW5zVmFsdWUodHlwZU9yRWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgIHsKLSAgICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJwIix0eXBlT3JFbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAoKFdTRExFbGVtZW50SW1wbClkZWZpbml0aW9uKS51cGRhdGVFbGVtZW50KGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgUU5hbWUgY3JlYXRlRGVmYXVsdFR5cGVOYW1lKCkKLSAgewotICAgIFFOYW1lIHFuYW1lID0gbmV3IFFOYW1lKFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsInN0cmluZyIpOwotICAgIHJldHVybiBxbmFtZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV3TmFtZUhlbHBlcihTdHJpbmcgYmFzZSwgRGVmaW5pdGlvbiBkZWYsIGJvb2xlYW4gaXNUeXBlKQotICB7IAotICAgIFN0cmluZyBuYW1lID0gYmFzZTsgICAgCi0gICAgaW50IGNvdW50ID0gMDsKLQotICAgIC8vIFVnbHkuLi4uICBSZWRvIHRoaXMuLi4KLSAgICAvLyBHZXQgYSBsaXN0IG9mIEVsZW1lbnRzLi4uCi0gICAgTGlzdCBlbGVtZW50TGlzdCA9IG51bGw7Ci0gICAgaWYgKGRlZi5nZXRFVHlwZXMoKSAhPSBudWxsKSB7Ci0gICAgCUxpc3QgeHNkc0xpc3QgPSBkZWYuZ2V0RVR5cGVzKCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIAlpZiAoeHNkc0xpc3QgIT0gbnVsbCkgewotICAgIAkJSXRlcmF0b3IgeHNkc0l0ZXJhdG9yID0geHNkc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAJCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHhzZEVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHhzZHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgCQlYU0RTY2hlbWEgc2NoZW1hID0geHNkRWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICAJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotICAgIAkJCWVsZW1lbnRMaXN0ID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICAKLSAgICBpZiAoZWxlbWVudExpc3QgIT0gbnVsbCkgewotICAgIAlpbnQgaW5kZXggPSAwOwotICAgIAl3aGlsZSAoaW5kZXggPCBlbGVtZW50TGlzdC5zaXplKCkpIHsKLSAgICAJCVhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbGFyYXRpb24gPSAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50TGlzdC5nZXQoaW5kZXgpOwotICAgIAkJCi0gICAgCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudERlY2xhcmF0aW9uLmdldE5hbWUoKSkpIHsKLSAgICAJCQljb3VudCsrOwotICAgIAkJCW5hbWUgPSBuYW1lICsgY291bnQ7Ci0gICAgCQkJaW5kZXggPSAwOwotICAgIAkJfQotICAgIAkJZWxzZSB7Ci0gICAgCQkJaW5kZXgrKzsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLQotICAgIHJldHVybiBuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUG9ydENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY0N2M1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQb3J0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFBvcnRDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlOwotICBwcml2YXRlIFN0cmluZyBuYW1lOwotICBwcml2YXRlIFBvcnQgcG9ydDsKLSAgCi0gIHB1YmxpYyBBZGRQb3J0Q29tbWFuZAotCQkoU2VydmljZSBzZXJ2aWNlLAotCQkgU3RyaW5nIG5hbWUpCi0JewotCSAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkgIHRoaXMubmFtZSA9IG5hbWU7Ci0JfQotICAKLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gcG9ydDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBwb3J0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnQoKTsKLSAgICBwb3J0LnNldE5hbWUobmFtZSk7Ci0gICAgcG9ydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHNlcnZpY2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICBzZXJ2aWNlLmFkZFBvcnQocG9ydCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBvcnRUeXBlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUG9ydFR5cGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjRkNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUG9ydFR5cGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFBvcnRUeXBlQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxOYW1lOwotICBwcml2YXRlIFBvcnRUeXBlIHBvcnRUeXBlOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZU9wZXJhdGlvbiA9IGZhbHNlOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBERUZBVUxUX09QRVJBVElPTl9OQU1FID0gIk5ld09wZXJhdGlvbiI7Ci0KLSAgcHVibGljIEFkZFBvcnRUeXBlQ29tbWFuZAotCQkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAgCi0JCSBTdHJpbmcgbG9jYWxOYW1lKQotCXsKLQkgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLQl9Ci0KLSAgcHVibGljIEFkZFBvcnRUeXBlQ29tbWFuZAotCQkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAKLQkJIFN0cmluZyBsb2NhbE5hbWUsCi0JCSBib29sZWFuIGNyZWF0ZU9wZXJhdGlvbikKLQl7Ci0JICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotCSAgdGhpcy5sb2NhbE5hbWUgPSBsb2NhbE5hbWU7Ci0JICB0aGlzLmNyZWF0ZU9wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbjsKLQl9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLldTRExFbGVtZW50QWN0aW9uI2dldFdTRExFbGVtZW50KCkKLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gcG9ydFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgcG9ydFR5cGUgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydFR5cGUoKTsKLSAgICBwb3J0VHlwZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSxsb2NhbE5hbWUpKTsKLSAgICBwb3J0VHlwZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgIAotICAgIGlmIChjcmVhdGVPcGVyYXRpb24pCi0gICAgewotICAgICAgQWRkT3BlcmF0aW9uQ29tbWFuZCBjb21tYW5kID0gCi0gICAgICAgIG5ldyBBZGRPcGVyYXRpb25Db21tYW5kKHBvcnRUeXBlLERFRkFVTFRfT1BFUkFUSU9OX05BTUUsdHJ1ZSx0cnVlLGZhbHNlKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBsb2NhbE5hbWUgPSBuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRTZXJ2aWNlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkU2VydmljZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmZWQ0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRTZXJ2aWNlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFNlcnZpY2VDb21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyBsb2NhbE5hbWU7Ci0gIHByaXZhdGUgU2VydmljZSBzZXJ2aWNlOwotICAKLSAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZVBvcnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREVGQVVMVF9QT1JUX05BTUUgPSAiTmV3UG9ydCI7Ci0KLSAgcHVibGljIEFkZFNlcnZpY2VDb21tYW5kCi0JCShEZWZpbml0aW9uIGRlZmluaXRpb24sICAKLQkJIFN0cmluZyBsb2NhbE5hbWUpCi0JewotCSAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotCX0KLQotCXB1YmxpYyBBZGRTZXJ2aWNlQ29tbWFuZAotCQkoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCAKLQkJIFN0cmluZyBsb2NhbE5hbWUsCi0JCSBib29sZWFuIGNyZWF0ZVBvcnQpCi0JewotCSAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQkgIHRoaXMubG9jYWxOYW1lID0gbG9jYWxOYW1lOwotCSAgdGhpcy5jcmVhdGVQb3J0ID0gY3JlYXRlUG9ydDsKLQl9Ci0KLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHNlcnZpY2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZSgpOwotICAgIHNlcnZpY2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksbG9jYWxOYW1lKSk7Ci0gICAgc2VydmljZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAKLSAgICBpZiAoY3JlYXRlUG9ydCkKLSAgICB7Ci0gICAgICBBZGRQb3J0Q29tbWFuZCBjb21tYW5kID0gCi0gICAgICAgIG5ldyBBZGRQb3J0Q29tbWFuZChzZXJ2aWNlLERFRkFVTFRfUE9SVF9OQU1FKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRMb2NhbE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBsb2NhbE5hbWUgPSBuYW1lOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRUeXBlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFR5cGVzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTY4ZmQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFR5cGVzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci0KLS8vIERlZmluaXRpb24gbXVzdCBub3QgaGF2ZSAidHlwZXMiIGVsZW1lbnQgdG8gcnVuIHRoaXMgY29tbWFuZC4KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRUeXBlc0NvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgVHlwZXMgdHlwZXM7Ci0gIAotICBwdWJsaWMgQWRkVHlwZXNDb21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gIAlpZiAoKHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSkgIT0gbnVsbCkKLSAgICAgIHJldHVybjsgLy8gInR5cGVzIiBhbHJlYWR5IGV4aXN0cy4KLSAgCQotICAgIHR5cGVzID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVzKCk7Ci0gICAgdHlwZXMuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICBkZWZpbml0aW9uLnNldFR5cGVzKHR5cGVzKTsKLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiB0eXBlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjMzNTJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQWRkVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Q29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50OwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2VVUkk7Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2FsTmFtZTsKLSAgcHJpdmF0ZSBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIHByaXZhdGUgTWFwIHByb3BlcnRpZXM7Ci0gCi0gIHB1YmxpYyBBZGRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb21tYW5kCi0gICAgKEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50LCAKLSAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIHRoaXMuZXh0ZW5zaWJsZUVsZW1lbnQgPSBleHRlbnNpYmxlRWxlbWVudDsKLSAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgfQotICAKLSAgcHVibGljIEFkZFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudENvbW1hbmQKLSAgICAoRXh0ZW5zaWJsZUVsZW1lbnQgZXh0ZW5zaWJsZUVsZW1lbnQsIAotICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJLAotICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICBNYXAgcHJvcGVydGllcykKLSAgewotICAgIHRoaXMuZXh0ZW5zaWJsZUVsZW1lbnQgPSBleHRlbnNpYmxlRWxlbWVudDsKLSAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGV4dGVuc2liaWxpdHlFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAJZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gIAlleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbGVtZW50VHlwZShuZXcgUU5hbWUobmFtZXNwYWNlVVJJLGxvY2FsTmFtZSkpOwotICAJCi0gICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHByb3BlcnRpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAJZW50cnkgPSAoTWFwLkVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIAlTdHJpbmcgYXR0cmlidXRlID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLSAgICAgIAlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7ICAgICAgCQotICAgICAgCSgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbClleHRlbnNpYmlsaXR5RWxlbWVudCkuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSx2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAJZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihleHRlbnNpYmxlRWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAJZXh0ZW5zaWJsZUVsZW1lbnQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOWYxNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLQotLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBYU0RFbGVtZW50RGVjbGFyYXRpb24gaW4gdGhlIHRhcmdldE5hbWVzcGFjZS4KLXB1YmxpYyBmaW5hbCBjbGFzcyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kIGV4dGVuZHMgV1NETEVsZW1lbnRDb21tYW5kCi17Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIHByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lOwotICBwcml2YXRlIFhTRFNjaGVtYSBzY2hlbWE7Ci0gIAotICAvKioKLSAgICogVE9ETzoKLSAgICogV2UgaGF2ZSBhIHBvdGVudGlhbCBwcm9ibGVtIGhlcmUuLi4uICBXaGF0IGlmIHRoZSBkZWZpbml0aW9uIHRhcmdldG5hbWVzcGFjZSBpcyBudWxsLi4uLgotICAgKi8KLSAgcHVibGljIEFkZFhTREVsZW1lbnREZWNsYXJhdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBVc2UgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgICovCi0gIHB1YmxpYyBBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kCi0gICAgKERlZmluaXRpb24gZGVmaW5pdGlvbiwgCi0gICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIAotICAgICBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIHRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gZ2V0U2NoZW1hKCk7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gCi0gICAgICBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICBlbGVtZW50RGVjbC5zZXROYW1lKGVsZW1lbnROYW1lKTsKLSAgICAKLSAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzaW1wbGVUeXBlRGVmaW5pdGlvbiA9IGdldFhTRFN0cmluZ1R5cGUoeHNkU2NoZW1hKTsKLSAgICBlbGVtZW50RGVjbC5zZXRUeXBlRGVmaW5pdGlvbihzaW1wbGVUeXBlRGVmaW5pdGlvbik7ICAgIAotICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZChlbGVtZW50RGVjbCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgbmV3RWxlbWVudE5hbWUpIHsKLSAgCWVsZW1lbnROYW1lID0gbmV3RWxlbWVudE5hbWU7Ci0gIAlydW4oKTsKLSAgfQotICAKLSAgLyoKLSAgICogU3BlY2lmeSB3aGljaCBTY2hlbWEgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIFR5cGUuCi0gICAqIENhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGNhbGxpbmcgcnVuKCkuICBPdGhlcndpc2UgaXQgd2lsbCB1c2UgdGhlIGZpcnN0Ci0gICAqIFNjaGVtYSBpdCBmaW5kcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKSB7Ci0gIAl0aGlzLnNjaGVtYSA9IHNjaGVtYTsKLSAgfQotICAKLSAgLyoKLSAgICogUmV0dXJuIHRoZSBTY2hlbWEgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGUKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkgewotICAJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0gIAkJcmV0dXJuIGdldFhTRFNjaGVtYSh0YXJnZXROYW1lc3BhY2UpOwotICAJfQotICAJZWxzZSB7Ci0gIAkJcmV0dXJuIHNjaGVtYTsKLSAgCX0KLSAgfQotICAKLSAgcHJpdmF0ZSBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBnZXRYU0RTdHJpbmdUeXBlKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYSgpLnJlc29sdmVTaW1wbGVUeXBlRGVmaW5pdGlvbigic3RyaW5nIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgWFNEU2NoZW1hIGdldFhTRFNjaGVtYShTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLSAgICAKLSAgICAvLyBEbyB3ZSBoYXZlIGEgc2NoZW1hIGFscmVhZHk/Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRUeXBlcygpLmdldFNjaGVtYXModGFyZ2V0TmFtZXNwYWNlKS5pdGVyYXRvcigpOwotICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgeHNkU2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7IC8vIEdldCB0aGUgZmlyc3Qgb25lLgotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsJICAgIAotICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNjaGVtYSBiZWNhdXNlIHRoZXJlJ3Mgbm9uZS4KLSAgICAgIEFkZFhTRFNjaGVtYUNvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRYU0RTY2hlbWFDb21tYW5kKGRlZmluaXRpb24sdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCljb21tYW5kLmdldFdTRExFbGVtZW50KCkpLmdldFNjaGVtYSgpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBUeXBlcyBnZXRUeXBlcygpCi0gIHsKLSAgICAvLyBUeXBlcyBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldC4KLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcylkZWZpbml0aW9uLmdldFR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgICByZXR1cm4gdHlwZXM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEFkZFR5cGVzQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFR5cGVzQ29tbWFuZChkZWZpbml0aW9uKTsKLSAgICAgIGNvbW1hbmQucnVuKCk7Ci0gICAgICByZXR1cm4gKFR5cGVzKWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFhTRFNjaGVtYUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFhTRFNjaGVtYUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiZDFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RTY2hlbWFDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIEFkZFhTRFNjaGVtYUNvbW1hbmQgZXh0ZW5kcyBXU0RMRWxlbWVudENvbW1hbmQKLXsKLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIHByaXZhdGUgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgCi0gIHB1YmxpYyBBZGRYU0RTY2hlbWFDb21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICB9Ci0gIAotICBwdWJsaWMgQWRkWFNEU2NoZW1hQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0YXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oKQotICB7ICAgIAotICAgIGV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hKCk7Ci0gICAgeHNkU2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCJ4c2QiKTsKLSAgICB4c2RTY2hlbWEuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgLy8gQ2hvb3NlIHRoZSBwcmVmaXggQ2hvb3NlIHRoZSBwcmVmaXggdXNlZCBmb3IgdGhpcyBzY2hlbWEncyBuYW1lc3BhY2UgYW5kIHRoZSBzY2hlbWEgZm9yIHNjaGVtYSdzIG5hbWVzcGFjZS4KLSAgICAvLyAgICAKLSAgICBqYXZhLnV0aWwuTWFwIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAgPSB4c2RTY2hlbWEuZ2V0UU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCgpOwotLy8gICAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcC5wdXQoInAiLCB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0Ci0JICAoeHNkU2NoZW1hLmdldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCksb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAKLSAgICAvLyBUQkQgLSBDaGVjayBpZiBtdWx0aXBsZSBzY2hlbWFzIHdpdGggdGhlIHNhbWUgdGFyZ2V0TmFtZXNwYWNlIGNhbiBjby1leGlzdC4KLSAgICBUeXBlcyB0eXBlcyA9IGdldFR5cGVzKCk7Ci0gICAgdHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICB9Ci0KLSAgcHJpdmF0ZSBUeXBlcyBnZXRUeXBlcygpCi0gIHsKLSAgICAvLyBUeXBlcyBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotICAgIFR5cGVzIHR5cGVzID0gKFR5cGVzKWRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgIHJldHVybiB0eXBlczsKLSAgICBlbHNlCi0gICAgewotICAgICAgQWRkVHlwZXNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkVHlwZXNDb21tYW5kKGRlZmluaXRpb24pOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICAgIHJldHVybiAoVHlwZXMpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwNDYzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBYU0RUeXBlRGVmaW5pdGlvbiBpbiB0aGUgdGFyZ2V0TmFtZXNwYWNlLgotcHVibGljIGZpbmFsIGNsYXNzIEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZCBleHRlbmRzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlOwotICBwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLSAgcHJpdmF0ZSBYU0RTY2hlbWEgc2NoZW1hOwotICBwcml2YXRlIGJvb2xlYW4gaXNDb21wbGV4VHlwZSA9IHRydWU7Ci0gIAotICAvKioKLSAgICogVE9ETzoKLSAgICogV2UgaGF2ZSBhIHBvdGVudGlhbCBwcm9ibGVtIGhlcmUuLi4uICBXaGF0IGlmIHRoZSBkZWZpbml0aW9uIHRhcmdldG5hbWVzcGFjZSBpcyBudWxsLi4uLgotICAgKi8KLSAgcHVibGljIEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIHRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgfQotICAKLSAgcHVibGljIEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSwgYm9vbGVhbiBpc0NvbXBsZXhUeXBlKQotICB7Ci0gIAl0aGlzKGRlZmluaXRpb24sIHR5cGVOYW1lKTsKLSAgCXRoaXMuaXNDb21wbGV4VHlwZSA9IGlzQ29tcGxleFR5cGU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBVc2UgQWRkWFNEVHlwZURlZmluaXRpb25Db21tYW5kKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHR5cGVOYW1lKQotICAgKi8KLSAgcHVibGljIEFkZFhTRFR5cGVEZWZpbml0aW9uQ29tbWFuZAotICAgIChEZWZpbml0aW9uIGRlZmluaXRpb24sIAotICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgICBTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIHRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBnZXRTY2hlbWEoKTsKLSAgICBYU0ROYW1lZENvbXBvbmVudCB0eXBlRGVmOwotICAgIAotICAgIGlmIChpc0NvbXBsZXhUeXBlKSB7Ci0gICAgCXR5cGVEZWYgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgCXR5cGVEZWYgPSBYU0RGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLSAgICAKLSAgICB0eXBlRGVmLnNldE5hbWUodHlwZU5hbWUpOwotICAgIHhzZFNjaGVtYS5nZXRDb250ZW50cygpLmFkZCh0eXBlRGVmKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcnVuKFN0cmluZyBuZXdUeXBlTmFtZSkgewotICAJdHlwZU5hbWUgPSBuZXdUeXBlTmFtZTsKLSAgCXJ1bigpOwotICB9Ci0gIAotICAvKgotICAgKiBTcGVjaWZpeSBpZiB3ZSBzaG91bGQgY3JlYXRlIGEgY29tcGxleCBvciBzaW1wbGUgdHlwZS4gIFRoaXMgc2hvdWxkIHNob3VsZCBiZQotICAgKiBjYWxsZWQgYmVmb3JlIHJ1bigpLgotICAgKiBPdmVycmlkZXMgdGhlIHZhbHVlIHNldCB3aGVuIHRoZSBjb25zdHJ1Y3RvcgotICAgKiBBZGRYU0RUeXBlRGVmaW5pdGlvbkNvbW1hbmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgdHlwZU5hbWUsIGJvb2xlYW4gaXNDb21wbGV4VHlwZSkKLSAgICogaXMgdXNlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGlzQ29tcGxleFR5cGUoYm9vbGVhbiBpc0NvbXBsZXhUeXBlKSB7Ci0gIAl0aGlzLmlzQ29tcGxleFR5cGUgPSBpc0NvbXBsZXhUeXBlOwotICB9Ci0gIAotICAvKgotICAgKiBTcGVjaWZ5IHdoaWNoIFNjaGVtYSB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgVHlwZS4KLSAgICogQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgY2FsbGluZyBydW4oKS4gIE90aGVyd2lzZSBpdCB3aWxsIHVzZSB0aGUgZmlyc3QKLSAgICogU2NoZW1hIGl0IGZpbmRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpIHsKLSAgCXRoaXMuc2NoZW1hID0gc2NoZW1hOwotICB9Ci0gIAotICAvKgotICAgKiBSZXR1cm4gdGhlIFNjaGVtYSB1c2VkIHRvIGNyZWF0ZSB0aGUgVHlwZQotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKSB7Ci0gIAlpZiAoc2NoZW1hID09IG51bGwpIHsKLSAgCQlyZXR1cm4gZ2V0WFNEU2NoZW1hKHRhcmdldE5hbWVzcGFjZSk7Ci0gIAl9Ci0gIAllbHNlIHsKLSAgCQlyZXR1cm4gc2NoZW1hOwotICAJfQotICB9Ci0KLSAgcHJpdmF0ZSBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICAgIAotICAgIC8vIERvIHdlIGhhdmUgYSBzY2hlbWEgYWxyZWFkeT8KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldFR5cGVzKCkuZ2V0U2NoZW1hcyh0YXJnZXROYW1lc3BhY2UpLml0ZXJhdG9yKCk7Ci0gICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICB4c2RTY2hlbWEgPSAoWFNEU2NoZW1hKWl0ZXJhdG9yLm5leHQoKTsgLy8gR2V0IHRoZSBmaXJzdCBvbmUuCi0gICAgICByZXR1cm4geHNkU2NoZW1hOwotICAgIH0KLSAgICBlbHNlCi0gICAgewkgICAgCi0gICAgICAvLyBDcmVhdGUgYSBuZXcgc2NoZW1hIGJlY2F1c2UgdGhlcmUncyBub25lLgotICAgICAgQWRkWFNEU2NoZW1hQ29tbWFuZCBjb21tYW5kID0gbmV3IEFkZFhTRFNjaGVtYUNvbW1hbmQoZGVmaW5pdGlvbix0YXJnZXROYW1lc3BhY2UpOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICAgIHJldHVybiAoKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KWNvbW1hbmQuZ2V0V1NETEVsZW1lbnQoKSkuZ2V0U2NoZW1hKCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFR5cGVzIGdldFR5cGVzKCkKLSAgewotICAgIC8vIFR5cGVzIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0LgotICAgIFR5cGVzIHR5cGVzID0gKFR5cGVzKWRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgIHJldHVybiB0eXBlczsKLSAgICBlbHNlCi0gICAgewotICAgICAgQWRkVHlwZXNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWRkVHlwZXNDb21tYW5kKGRlZmluaXRpb24pOwotICAgICAgY29tbWFuZC5ydW4oKTsKLSAgICAgIHJldHVybiAoVHlwZXMpY29tbWFuZC5nZXRXU0RMRWxlbWVudCgpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29tbWFuZHMvV1NETEVsZW1lbnRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9XU0RMRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjOWMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb21tYW5kcy9XU0RMRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExFbGVtZW50Q29tbWFuZAotewotICBwdWJsaWMgYWJzdHJhY3QgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKTsKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNiZmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvQ29udGVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOyAgCi0gICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0b3IKLXsgICAgICAgIAotCQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERSRVNTX0xPQ0FUSU9OID0gImh0dHA6Ly90ZW1wdXJpLm9yZy8iOyAgCi0gIHB1YmxpYyB2b2lkIGluaXQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBPYmplY3QgZ2VuZXJhdG9yLCBPYmplY3RbXSBvcHRpb25zKTsKLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCk7Ci0gIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXMoKTsKLQotICAvLyBnZW5lcmF0ZXMgdGhlICdhZGRyZXNzJyBleHRlbnNpYmxpdHkgZWxlbWVudCBmb3IgYSBwb3J0Ci0gIC8vCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KTsKLSAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChFbGVtZW50IGJpbmRpbmdFbGVtZW50LCBQb3J0VHlwZSBwb3J0VHlwZSk7Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uQ29udGVudChFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCBPcGVyYXRpb24gb3BlcmF0aW9uKTsKLSAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ0lucHV0RWxlbWVudCwgSW5wdXQgaW5wdXQpOyAgICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ091dHB1dEVsZW1lbnQsIE91dHB1dCBvdXRwdXQpOwotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChFbGVtZW50IGJpbmRpbmdGYXVsdEVsZW1lbnQsIEZhdWx0IGZhdWx0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0h0dHBDb250ZW50R2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL0h0dHBDb250ZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGY3OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci9IdHRwQ29udGVudEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEh0dHBDb250ZW50R2VuZXJhdG9yIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvcgotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bvc3Q7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYWRkcmVzc0xvY2F0aW9uID0gQ29udGVudEdlbmVyYXRvci5BRERSRVNTX0xPQ0FUSU9OOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gcmVxdWlyZWROYW1lc3BhY2VzID0geyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB9OwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIHByZWZlcnJlZE5hbWVzcGFjZVByZWZpeGVzID0geyAibWltZSIsICJodHRwIiB9OwotCi0gIHB1YmxpYyB2b2lkIGluaXQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBPYmplY3QgZ2VuZXJhdG9yLCBPYmplY3RbXSBvcHRpb25zKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLQotICAgIGlmIChvcHRpb25zICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zWzBdICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEJvb2xlYW4gaXNQb3N0T3B0aW9uID0gKEJvb2xlYW4pIG9wdGlvbnNbMF07Ci0gICAgICAgIGlzUG9zdCA9IGlzUG9zdE9wdGlvbi5ib29sZWFuVmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1sxXSAhPSBudWxsKQotICAgICAgewotICAgICAgICBhZGRyZXNzTG9jYXRpb24gPSAoU3RyaW5nKSBvcHRpb25zWzFdOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXF1aXJlZE5hbWVzcGFjZXMoKQotICB7Ci0gICAgcmV0dXJuIHJlcXVpcmVkTmFtZXNwYWNlczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcmVmZXJyZWROYW1lc3BhY2VQcmVmaXhlcygpCi0gIHsKLSAgICByZXR1cm4gcHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvcnRDb250ZW50KEVsZW1lbnQgcG9ydEVsZW1lbnQsIFBvcnQgcG9ydCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQocG9ydEVsZW1lbnQsICJodHRwIiwgImFkZHJlc3MiKTsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibG9jYXRpb24iLCBhZGRyZXNzTG9jYXRpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChFbGVtZW50IGJpbmRpbmdFbGVtZW50LCBQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0VsZW1lbnQsICJodHRwIiwgImJpbmRpbmciKTsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidmVyYiIsIGlzUG9zdCA/ICJQT1NUIiA6ICJHRVQiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ09wZXJhdGlvbkNvbnRlbnQoRWxlbWVudCBiaW5kaW5nT3BlcmF0aW9uRWxlbWVudCwgT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsICJodHRwIiwgIm9wZXJhdGlvbiIpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsICIvIiArIG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ0lucHV0RWxlbWVudCwgSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBpZiAoaXNQb3N0KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0lucHV0RWxlbWVudCwgIm1pbWUiLCAiY29udGVudCIpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGJpbmRpbmdJbnB1dEVsZW1lbnQsICJodHRwIiwgInVybEVuY29kZWQiKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ091dHB1dEVsZW1lbnQsIE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGJpbmRpbmdPdXRwdXRFbGVtZW50LCAibWltZSIsICJjb250ZW50Iik7Ci0gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC94bWwiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChFbGVtZW50IGJpbmRpbmdGYXVsdEVsZW1lbnQsIEZhdWx0IGZhdWx0KQotICB7Ci0gICAgLy9UT0RPISEKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IHByZWZpeCAhPSBudWxsID8gKHByZWZpeCArICI6IiArIGVsZW1lbnROYW1lKSA6IGVsZW1lbnROYW1lOwotICAgIEVsZW1lbnQgcmVzdWx0ID0gcGFyZW50RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChuYW1lKTsKLSAgICBwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViZjUyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL1NvYXBDb250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yOyAgCi0gICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFNvYXBDb250ZW50R2VuZXJhdG9yIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvcgoteyAKLSAgcHJpdmF0ZSBmaW5hbCBpbnQgRE9DVU1FTlRfTElURVJBTCA9IDE7Ci0gIHByaXZhdGUgZmluYWwgaW50IFJQQ19MSVRFUkFMICAgICAgPSAyOwotICBwcml2YXRlIGZpbmFsIGludCBSUENfRU5DT0RFRCAgICAgID0gMzsKLQotICBwcm90ZWN0ZWQgaW50IGJpbmRpbmdPcHRpb24gPSBET0NVTUVOVF9MSVRFUkFMOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVZhbHVlID0gIiI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYWRkcmVzc0xvY2F0aW9uID0gQ29udGVudEdlbmVyYXRvci5BRERSRVNTX0xPQ0FUSU9OOyAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIHJlcXVpcmVkTmFtZXNwYWNlcyA9IHsiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyJ9OwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZ1tdIHByZWZlcnJlZE5hbWVzcGFjZVByZWZpeGVzID0geyJzb2FwIn07Ci0KLQotICBwdWJsaWMgdm9pZCBpbml0KERlZmluaXRpb24gZGVmaW5pdGlvbiwgT2JqZWN0IGdlbmVyYXRvciwgT2JqZWN0W10gb3B0aW9ucykKLSAgeyAgICAgICAgICAgICAgCi0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3B0aW9uID0gY29tcHV0ZUJpbmRpbmdPcHRpb24ob3B0aW9ucyk7Ci0KLSAgICAgIGlmIChvcHRpb25zLmxlbmd0aCA+IDEgJiYgb3B0aW9uc1sxXSAhPSBudWxsKQotICAgICAgewotICAgICAgCWFkZHJlc3NMb2NhdGlvbiA9IChTdHJpbmcpb3B0aW9uc1sxXTsKLSAgICAgIH0gIAotICAgIH0KLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZVZhbHVlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICB9IAotICB9Ci0gIAotICBwcml2YXRlIGludCBjb21wdXRlQmluZGluZ09wdGlvbihPYmplY3RbXSBvcHRpb25zKSB7Ci0gIAlpbnQgb3B0aW9uID0gRE9DVU1FTlRfTElURVJBTDsKLSAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnNbMF0gIT0gbnVsbCkKLSAgICB7Ci0JCWJvb2xlYW4gaXNEb2N1bWVudExpdGVyYWxPcHRpb24gPSAoKEJvb2xlYW4pb3B0aW9uc1swXSkuYm9vbGVhblZhbHVlKCk7Ci0JCWlmIChpc0RvY3VtZW50TGl0ZXJhbE9wdGlvbikKLQkJCW9wdGlvbiA9ICBET0NVTUVOVF9MSVRFUkFMOwotCQllbHNlCi0JCQlvcHRpb24gPSBSUENfRU5DT0RFRDsJCQotCQkKLSAgICAJaWYgKG9wdGlvbnMubGVuZ3RoID49IDMgJiYgb3B0aW9uc1syXSAhPSBudWxsKSB7Ci0gICAgCQkvLyBFeHRyYSBpbmZvIHNlbnQgaW4KLSAgICAJCWlmICgoKEJvb2xlYW4pb3B0aW9uc1syXSkuYm9vbGVhblZhbHVlKCkpCi0gICAgCQkJb3B0aW9uID0gUlBDX0xJVEVSQUw7Ci0gICAgCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3B0aW9uOwotICB9Ci0gICAgIAotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCkKLSAgewotICAgIHJldHVybiByZXF1aXJlZE5hbWVzcGFjZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQcmVmZXJyZWROYW1lc3BhY2VQcmVmaXhlcygpCi0gIHsKLSAgICByZXR1cm4gcHJlZmVycmVkTmFtZXNwYWNlUHJlZml4ZXM7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoRWxlbWVudCBwb3J0RWxlbWVudCwgUG9ydCBwb3J0KQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gY3JlYXRlRWxlbWVudChwb3J0RWxlbWVudCwgInNvYXAiLCAiYWRkcmVzcyIpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGFkZHJlc3NMb2NhdGlvbik7ICAgICAKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChFbGVtZW50IGJpbmRpbmdFbGVtZW50LCBQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0VsZW1lbnQsICJzb2FwIiwgImJpbmRpbmciKTsKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAoYmluZGluZ09wdGlvbiA9PSBET0NVTUVOVF9MSVRFUkFMKSA/ICJkb2N1bWVudCIgOiAicnBjIik7IAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0cmFuc3BvcnQiLCAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGJpbmRpbmdPcGVyYXRpb25FbGVtZW50LCAic29hcCIsICJvcGVyYXRpb24iKTsKLSAgICAKLSAgICBTdHJpbmcgc29hcEFjdGlvblZhbHVlID0gbmFtZXNwYWNlVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmICghc29hcEFjdGlvblZhbHVlLmVuZHNXaXRoKCIvIikpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIHNvYXBBY3Rpb25WYWx1ZSArPSAiLyI7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHNvYXBBY3Rpb25WYWx1ZSArPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJzb2FwQWN0aW9uIiwgc29hcEFjdGlvblZhbHVlKTsKLSAgfSAgCi0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEVsZW1lbnQgYmluZGluZ0lucHV0RWxlbWVudCwgSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBnZW5lcmF0ZVNvYXBCb2R5KGJpbmRpbmdJbnB1dEVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChFbGVtZW50IGJpbmRpbmdPdXRwdXRFbGVtZW50LCBPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgZ2VuZXJhdGVTb2FwQm9keShiaW5kaW5nT3V0cHV0RWxlbWVudCk7Ci0gIH0gICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdGYXVsdENvbnRlbnQoRWxlbWVudCBiaW5kaW5nRmF1bHRFbGVtZW50LCBGYXVsdCBmYXVsdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ0ZhdWx0RWxlbWVudCwgInNvYXAiLCAiZmF1bHQiKTsgICAgICAKLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIGZhdWx0LmdldE5hbWUoKSk7IAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ1c2UiLCAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkgPyAiZW5jb2RlZCIgOiAibGl0ZXJhbCIpOwotICAgIGlmIChiaW5kaW5nT3B0aW9uID09IFJQQ19FTkNPREVEKQotICAgIHsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJlbmNvZGluZ1N0eWxlIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlVmFsdWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChiaW5kaW5nT3B0aW9uID09IFJQQ19MSVRFUkFMKSB7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCBuYW1lc3BhY2VWYWx1ZSk7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVNvYXBCb2R5KEVsZW1lbnQgcGFyZW50RWxlbWVudCkKLSAgeyAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBzb2FwQWN0aW9uVmFsdWUgPSAiIjsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNvYXBBY3Rpb25WYWx1ZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfSAgICAKLQotICAgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQocGFyZW50RWxlbWVudCwgInNvYXAiLCAiYm9keSIpOyAgICAgIAotICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ1c2UiLCAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkgPyAiZW5jb2RlZCIgOiAibGl0ZXJhbCIpOyAKLSAgICBpZiAoYmluZGluZ09wdGlvbiA9PSBSUENfRU5DT0RFRCkKLSAgICB7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiZW5jb2RpbmdTdHlsZSIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsIG5hbWVzcGFjZVZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYmluZGluZ09wdGlvbiA9PSBSUENfTElURVJBTCkgewotICAgIAllbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZXNwYWNlIiwgbmFtZXNwYWNlVmFsdWUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRWxlbWVudCBwYXJlbnRFbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KG5hbWUpOwotICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL0NvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2E0MGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWk7ICAKLSAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CYXNlR2VuZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBpbml0KEJhc2VHZW5lcmF0b3IgYmFzZUdlbmVyYXRvcik7ICAgICAgICAgICAgIAotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7Ci0gIHB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpOwotICAKLSAgLy8gVE9ETyBjYW4gdGhpcyBnbyBpbnRvIGluaXQ/Ci0gIC8vCi0gIHB1YmxpYyB2b2lkIHNldE9wdGlvbnNPbkdlbmVyYXRvcigpOwotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUFwcGxpY2FibGUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL0h0dHBCaW5kaW5nT3B0aW9uc1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvSHR0cEJpbmRpbmdPcHRpb25zUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTM1NWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvSHR0cEJpbmRpbmdPcHRpb25zUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5nZW5lcmF0b3IuSFRUUENvbnRlbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkJhc2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEh0dHBCaW5kaW5nT3B0aW9uc1BhZ2UgaW1wbGVtZW50cyBDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBCdXR0b24gZ2V0QnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIHBvc3RCdXR0b247Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29udHJvbDsKLSAgcHJvdGVjdGVkIEJhc2VHZW5lcmF0b3IgZ2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgSFRUUENvbnRlbnRHZW5lcmF0b3IgaHR0cEdlbmVyYXRvcjsKLQotICBwdWJsaWMgSHR0cEJpbmRpbmdPcHRpb25zUGFnZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoQmFzZUdlbmVyYXRvciBnZW5lcmF0b3IpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLQlpZiAoZ2VuZXJhdG9yLmdldENvbnRlbnRHZW5lcmF0b3IoKSBpbnN0YW5jZW9mIEhUVFBDb250ZW50R2VuZXJhdG9yKSB7Ci0JCWh0dHBHZW5lcmF0b3IgPSAoSFRUUENvbnRlbnRHZW5lcmF0b3IpIGdlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCk7Ci0JfQotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb250cm9sID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgIAotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0hUVFBfQklORElOR19PUFRJT05TIikpOwotCi0gICAgZ2V0QnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotICAgIGdldEJ1dHRvbi5zZXRUZXh0KCJIVFRQIEdFVCIpOwotICAgIGdldEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0KLSAgICBwb3N0QnV0dG9uID0gbmV3IEJ1dHRvbihjb250cm9sLCBTV1QuUkFESU8pOwotICAgIHBvc3RCdXR0b24uc2V0VGV4dCgiSFRUUCBQT1NUIik7Ci0KLSAgICBpZiAoZ2VuZXJhdG9yLmdldE5hbWUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdlbmVyYXRvci5nZXREZWZpbml0aW9uKCk7Ci0gICAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBnZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBkZWZpbml0aW9uLmdldEJpbmRpbmcocW5hbWUpOwotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgaWYgKGVlTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGVlKTsKLSAgICAgICAgICBTdHJpbmcgdmVyYiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJiIik7Ci0gICAgICAgICAgaWYgKCJQT1NUIi5lcXVhbHModmVyYikpCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2V0QnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICBwb3N0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwb3N0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQljb21wdXRlT3B0aW9ucygpOwotCQotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0gIAotICBwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JICByZXR1cm4gY29udHJvbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNPdmVyd3JpdGVBcHBsaWNhYmxlKCkKLSAgewotICAJcmV0dXJuIHRydWU7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0JY29tcHV0ZU9wdGlvbnMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVPcHRpb25zKCkKLSAgewotCSAgaWYgKGdlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCkgaW5zdGFuY2VvZiBIVFRQQ29udGVudEdlbmVyYXRvcikgewotCQkgIEhUVFBDb250ZW50R2VuZXJhdG9yIGh0dHBHZW5lcmF0b3IgPSAoSFRUUENvbnRlbnRHZW5lcmF0b3IpIGdlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCk7Ci0KLQkJICBpZiAocG9zdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJICBodHRwR2VuZXJhdG9yLnNldFZlcmIoSFRUUENvbnRlbnRHZW5lcmF0b3IuVkVSQl9QT1NUKTsKLQkJICB9CSAgCi0JCSAgZWxzZSBpZiAoZ2V0QnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkgIGh0dHBHZW5lcmF0b3Iuc2V0VmVyYihIVFRQQ29udGVudEdlbmVyYXRvci5WRVJCX0dFVCk7Ci0JCSAgfQotCSAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zT25HZW5lcmF0b3IoKSB7Ci0JICBjb21wdXRlT3B0aW9ucygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvSHR0cFBvcnRPcHRpb25zUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZWEyN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9IdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5nZW5lcmF0b3IuSFRUUENvbnRlbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkJhc2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgSHR0cFBvcnRPcHRpb25zUGFnZSBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSwgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgYWRkcmVzc0ZpZWxkOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBCYXNlR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICBwdWJsaWMgSHR0cFBvcnRPcHRpb25zUGFnZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoQmFzZUdlbmVyYXRvciBnZW5lcmF0b3IpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29udHJvbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBjb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBMYWJlbCBvcHRpb25zSGVhZGluZyA9IG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSk7Ci0gICAgb3B0aW9uc0hlYWRpbmcuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9IVFRQX1BPUlRfREVUQUlMUyIpKTsKLQotICAgIENvbXBvc2l0ZSBuYW1lVmFsdWVHcm91cCA9IG5ldyBDb21wb3NpdGUoY29udHJvbCwgU1dULk5PTkUpOwotICAgIG5hbWVWYWx1ZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0MiA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBsYXlvdXQyLm1hcmdpbldpZHRoID0gMDsKLSAgICBuYW1lVmFsdWVHcm91cC5zZXRMYXlvdXQobGF5b3V0Mik7Ci0KLSAgICBMYWJlbCBhZGRyZXNzTGFiZWwgPSBuZXcgTGFiZWwobmFtZVZhbHVlR3JvdXAsIFNXVC5OT05FKTsKLSAgICBhZGRyZXNzTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MT0NBVElPTiIpICsgIiAiKTsKLSAgICBhZGRyZXNzRmllbGQgPSBuZXcgVGV4dChuYW1lVmFsdWVHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgYWRkcmVzc0ZpZWxkLnNldFRleHQoImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLSAgICBhZGRyZXNzRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgYWRkcmVzc0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUFwcGxpY2FibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICB7Ci0JICBjb21wdXRlT3B0aW9ucygpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY29tcHV0ZU9wdGlvbnMoKSB7Ci0JaWYgKGdlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCkgaW5zdGFuY2VvZiBIVFRQQ29udGVudEdlbmVyYXRvcikgewotCQkoKEhUVFBDb250ZW50R2VuZXJhdG9yKSBnZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpKS5zZXRBZGRyZXNzTG9jYXRpb24oYWRkcmVzc0ZpZWxkLmdldFRleHQoKSk7Ci0JfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3B0aW9uc09uR2VuZXJhdG9yKCkgewotCSAgY29tcHV0ZU9wdGlvbnMoKTsKLSAgfQotICAKLSAgcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgewotCSAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2NvbnRlbnRnZW5lcmF0b3IvdWkvU29hcEJpbmRpbmdPcHRpb25zUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9Tb2FwQmluZGluZ09wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTMyZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9Tb2FwQmluZGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb250ZW50Z2VuZXJhdG9yLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmdlbmVyYXRvci5TT0FQQ29udGVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuQmFzZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgU29hcEJpbmRpbmdPcHRpb25zUGFnZSBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBkb2NMaXRlcmFsOwotICBwcm90ZWN0ZWQgQnV0dG9uIHJwY0xpdGVyYWw7Ci0gIHByb3RlY3RlZCBCdXR0b24gcnBjRW5jb2RlZDsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotICBwcm90ZWN0ZWQgQmFzZUdlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgcHVibGljIFNvYXBCaW5kaW5nT3B0aW9uc1BhZ2UoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0KEJhc2VHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICB7Ci0gICAgdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGNvbnRyb2wuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udHJvbCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHNlcGFyYXRvci5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIExhYmVsIG9wdGlvbnNIZWFkaW5nID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5OT05FKTsKLSAgICBvcHRpb25zSGVhZGluZy5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1NPQVBfQklORElOR19PUFRJT05TIikpOwotCi0gICAgZG9jTGl0ZXJhbCA9IG5ldyBCdXR0b24oY29udHJvbCwgU1dULlJBRElPKTsKLSAgICBkb2NMaXRlcmFsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUkFESU9fRE9DVU1FTlRfTElURVJBTCIpKTsKLSAgICBkb2NMaXRlcmFsLnNldFNlbGVjdGlvbih0cnVlKTsKLQotICAgIHJwY0xpdGVyYWwgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5SQURJTyk7Ci0gICAgcnBjTGl0ZXJhbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1JBRElPX1JQQ19MSVRFUkFMIikpOwotICAgIAotICAgIHJwY0VuY29kZWQgPSBuZXcgQnV0dG9uKGNvbnRyb2wsIFNXVC5SQURJTyk7Ci0gICAgcnBjRW5jb2RlZC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1JBRElPX1JQQ19FTkNPREVEIikpOwotCi0gICAgaWYgKGdlbmVyYXRvci5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZW5lcmF0b3IuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZ2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKTsKLQotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgaWYgKGVlTGlzdC5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7Ci0KLSAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZWUpOwotICAgICAgICAgIFN0cmluZyBzdHlsZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJzdHlsZSIpOwotICAgICAgICAgIAotICAgICAgICAgIGlmICgicnBjIi5lcXVhbHMoc3R5bGUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRyeSB0byBkZXRlcm1pbmUgaWYgaXQncyBSUEMgTGl0ZXJhbCBvciBSUEMgRW5jb2RlZAotICAgICAgICAgIAlTdHJpbmcgdXNlID0gImVuY29kZWQiOwotICAgICAgICAgIAlMaXN0IG9wZXJhdGlvbnMgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgICAgIAlpZiAob3BlcmF0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgCQllbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAJCUJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wZXJhdGlvbnMuZ2V0KDApOwotICAgICAgICAgIAkJaWYgKG9wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkgIT0gbnVsbCAmJiBvcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgCQkJT2JqZWN0IG9iamVjdCA9IG9wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmdldCgwKTsKLSAgICAgICAgICAJCQllbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KG9iamVjdCk7Ci0gICAgICAgICAgCQl9Ci0gICAgICAgICAgCQllbHNlIGlmIChvcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgCQkJT2JqZWN0IG9iamVjdCA9IG9wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5nZXQoMCk7Ci0gICAgICAgICAgCQkJZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvYmplY3QpOwotICAgICAgICAgIAkJfQotICAgICAgICAgIAkJZWxzZSBpZiAob3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgIAkJCUJpbmRpbmdGYXVsdCBmYXVsdCA9IChCaW5kaW5nRmF1bHQpIG9wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpLmdldCgwKTsKLSAgICAgICAgICAJCQlMaXN0IGZhdWx0RUUgPSBmYXVsdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAJCQkKLSAgICAgICAgICAJCQlpZiAoZmF1bHRFRS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgCQkJCWVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZmF1bHRFRS5nZXQoMCkpOwotICAgICAgICAgIAkJCX0KLSAgICAgICAgICAJCX0KLSAgICAgICAgICAJCQotICAgICAgICAgIAkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgIAkJCXVzZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ1c2UiKTsKLSAgICAgICAgICAJCX0KLSAgICAgICAgICAJfQotICAgICAgICAgIAkKLSAgICAgICAgICAJaWYgKHVzZSAhPSBudWxsICYmICJsaXRlcmFsIi5lcXVhbHModXNlKSkgewotICAgICAgICAgIAkJZG9jTGl0ZXJhbC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgIAkJcnBjTGl0ZXJhbC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgCQlycGNFbmNvZGVkLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgCX0KLSAgICAgICAgICAJZWxzZSB7ICAgICAgICAgIAkKLSAgICAgICAgICAJCWRvY0xpdGVyYWwuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAJCXJwY0xpdGVyYWwuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgICAJCXJwY0VuY29kZWQuc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgIAl9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZG9jTGl0ZXJhbC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICBycGNMaXRlcmFsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIHJwY0VuY29kZWQuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgY29tcHV0ZU9wdGlvbnMoKTsKLQotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgewotCSAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzT3ZlcndyaXRlQXBwbGljYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gICAgY29tcHV0ZU9wdGlvbnMoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVPcHRpb25zKCkKLSAgewotCSAgaWYgKGdlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCkgaW5zdGFuY2VvZiBTT0FQQ29udGVudEdlbmVyYXRvcikgewotCQkgIFNPQVBDb250ZW50R2VuZXJhdG9yIHNvYXBHZW5lcmF0b3IgPSAoU09BUENvbnRlbnRHZW5lcmF0b3IpIGdlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCk7Ci0JCSAgaWYgKGRvY0xpdGVyYWwuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCSAgc29hcEdlbmVyYXRvci5zZXRTdHlsZShTT0FQQ29udGVudEdlbmVyYXRvci5TVFlMRV9ET0NVTUVOVCk7Ci0JCQkgIHNvYXBHZW5lcmF0b3Iuc2V0VXNlKFNPQVBDb250ZW50R2VuZXJhdG9yLlVTRV9MSVRFUkFMKTsKLQkJICB9CSAgCi0JCSAgZWxzZSBpZiAocnBjTGl0ZXJhbC5nZXRTZWxlY3Rpb24oKSkgewotCQkJICBzb2FwR2VuZXJhdG9yLnNldFN0eWxlKFNPQVBDb250ZW50R2VuZXJhdG9yLlNUWUxFX1JQQyk7Ci0JCQkgIHNvYXBHZW5lcmF0b3Iuc2V0VXNlKFNPQVBDb250ZW50R2VuZXJhdG9yLlVTRV9MSVRFUkFMKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAocnBjRW5jb2RlZC5nZXRTZWxlY3Rpb24oKSkgewotCQkJICBzb2FwR2VuZXJhdG9yLnNldFN0eWxlKFNPQVBDb250ZW50R2VuZXJhdG9yLlNUWUxFX1JQQyk7Ci0JCQkgIHNvYXBHZW5lcmF0b3Iuc2V0VXNlKFNPQVBDb250ZW50R2VuZXJhdG9yLlVTRV9FTkNPREVEKTsKLQkJICB9Ci0JICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE9wdGlvbnNPbkdlbmVyYXRvcigpIHsKLQkgIGNvbXB1dGVPcHRpb25zKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvY29udGVudGdlbmVyYXRvci91aS9Tb2FwUG9ydE9wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3Mzk0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9jb250ZW50Z2VuZXJhdG9yL3VpL1NvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5nZW5lcmF0b3IuU09BUENvbnRlbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkJhc2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgU29hcFBvcnRPcHRpb25zUGFnZSBpbXBsZW1lbnRzIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSwgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgYWRkcmVzc0ZpZWxkOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2w7Ci0gIHByb3RlY3RlZCBCYXNlR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICBwdWJsaWMgU29hcFBvcnRPcHRpb25zUGFnZSgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluaXQoQmFzZUdlbmVyYXRvciBnZW5lcmF0b3IpCi0gIHsKLSAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLSAgfQotCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29udHJvbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgY29udHJvbC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBjb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKGNvbnRyb2wsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBMYWJlbCBvcHRpb25zSGVhZGluZyA9IG5ldyBMYWJlbChjb250cm9sLCBTV1QuTk9ORSk7Ci0gICAgb3B0aW9uc0hlYWRpbmcuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9TT0FQX1BPUlRfREVUQUlMUyIpKTsKLQotICAgIENvbXBvc2l0ZSBuYW1lVmFsdWVHcm91cCA9IG5ldyBDb21wb3NpdGUoY29udHJvbCwgU1dULk5PTkUpOwotICAgIG5hbWVWYWx1ZUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0MiA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICBsYXlvdXQyLm1hcmdpbldpZHRoID0gMDsKLSAgICBuYW1lVmFsdWVHcm91cC5zZXRMYXlvdXQobGF5b3V0Mik7Ci0KLSAgICBMYWJlbCBhZGRyZXNzTGFiZWwgPSBuZXcgTGFiZWwobmFtZVZhbHVlR3JvdXAsIFNXVC5OT05FKTsKLSAgICBhZGRyZXNzTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MT0NBVElPTiIpICsgIiAiKTsKLSAgICBhZGRyZXNzRmllbGQgPSBuZXcgVGV4dChuYW1lVmFsdWVHcm91cCwgU1dULkJPUkRFUik7Ci0gICAgYWRkcmVzc0ZpZWxkLnNldFRleHQoImh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKLSAgICBhZGRyZXNzRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgYWRkcmVzc0ZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc092ZXJ3cml0ZUFwcGxpY2FibGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICB7Ci0JICBjb21wdXRlT3B0aW9ucygpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY29tcHV0ZU9wdGlvbnMoKSB7Ci0JaWYgKGdlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCkgaW5zdGFuY2VvZiBTT0FQQ29udGVudEdlbmVyYXRvcikgewotCQkoKFNPQVBDb250ZW50R2VuZXJhdG9yKSBnZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpKS5zZXRBZGRyZXNzTG9jYXRpb24oYWRkcmVzc0ZpZWxkLmdldFRleHQoKSk7Ci0JfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRPcHRpb25zT25HZW5lcmF0b3IoKSB7Ci0JICBjb21wdXRlT3B0aW9ucygpOwotICB9Ci0gIAotICBwdWJsaWMgQ29tcG9zaXRlIGdldENvbnRyb2woKSB7Ci0JICByZXR1cm4gY29udHJvbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL0ltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5NmNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL0ltcG9ydEFkZFJlc291cmNlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci0KLXB1YmxpYyBjbGFzcyBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvcgotewotICBWZWN0b3IgaW1wb3J0ZWRGaWxlczsKLQotICBJbXBvcnRBZGRSZXNvdXJjZUxpc3RlbmVyKCkKLSAgewotICAgIGltcG9ydGVkRmlsZXMgPSBuZXcgVmVjdG9yKCk7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBJUmVzb3VyY2VEZWx0YSByZXNvdXJjZURlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAocmVzb3VyY2VEZWx0YSAhPSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgcmVzb3VyY2VEZWx0YS5hY2NlcHQodGhpcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0vLyAgICAgIEIyQkdVSVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZSgiRXhjZXB0aW9uIGNhdWdodCBkdXJpbmcgcmVzb3VyY2UgY2hhbmdlIiArIGUpOwotLy8gICAgICBCMkJHVUlQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGVDdXJyZW50VGhyZWFkKCk7IAotICAgIH0gICAgICAKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKQotICB7Ci0gICAgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkKLSAgICB7Ci0gICAgICBpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICAgICAgaW1wb3J0ZWRGaWxlcy5hZGQoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0SW1wb3J0ZWRGaWxlcygpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0ZWRGaWxlczsKLSAgfQotICAgIAotICAvLyBUaGlzIHJldHVybnMgdGhlIGZpcnN0IGltcG9ydGVkIGZpbGUgaW4gdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgZmlsZXMKLSAgcHVibGljIElGaWxlIGdldEltcG9ydGVkRmlsZSgpCi0gIHsKLSAgICBpZiAoaW1wb3J0ZWRGaWxlcy5pc0VtcHR5KCkgPT0gZmFsc2UpIAotICAgICAgcmV0dXJuIChJRmlsZSlpbXBvcnRlZEZpbGVzLmZpcnN0RWxlbWVudCgpOwotICAKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbnZva2VTZXREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvSW52b2tlU2V0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYWE3YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy9JbnZva2VTZXREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLldTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5XU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5XU0RMU2V0Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEludm9rZVNldERpYWxvZwotewotICBTdHJpbmcga2luZDsKLSAgU3RyaW5nIG5ld1ZhbHVlID0gIiI7Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VLaW5kKFN0cmluZyBraW5kKQotICB7Ci0gICAgdGhpcy5raW5kID0ga2luZDsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3VmFsdWU7IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBydW4oT2JqZWN0IGlucHV0LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgICBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0gICAgICBTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0gICAgICBJRmlsZSBpRmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExFbGVtZW50KSBpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgU3RyaW5nIHByb3BlcnR5ID0gIiI7Ci0gICAgICBMaXN0IGxvb2t1cFBhdGhzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgICAgIAotICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgICBTdHJpbmcgZGlhbG9nVGl0bGUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TUEVDSUZZX1BPUlRUWVBFIik7Ci0gICAgICAgIAotICAgICAgICBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyKGlGaWxlLCBkZWZpbml0aW9uLCBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSk7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgcHJvdmlkZXIpOwotICAgICAgICBwcm92aWRlci5zZXREaWFsb2coZGlhbG9nKTsKLSAgICAgICAgcHJvcGVydHkgPSAidHlwZSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NQRUNJRllfQklORElORyIpOwotICAgICAgICAKLSAgICAgICAgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihpRmlsZSwgZGVmaW5pdGlvbiwgV1NETENvbnN0YW50cy5CSU5ESU5HKTsKLSAgICAgICAgZGlhbG9nID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgICAgIHByb3ZpZGVyLnNldERpYWxvZyhkaWFsb2cpOwotICAgICAgICBwcm9wZXJ0eSA9ICJiaW5kaW5nIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsKLSAgICAgICAgTGlzdCB2YWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotICAgICAgICB2YWxpZEV4dGVuc2lvbnMuYWRkKCJ3c2RsIik7Ci0gICAgICAgIHZhbGlkRXh0ZW5zaW9ucy5hZGQoInhzZCIpOwotICAgICAgICBsb29rdXBQYXRocyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0gICAgICAgIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0gICAgICAgIGlmIChraW5kLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkgewotICAgICAgICAgICAgcHJvcGVydHkgPSAiIjsgCi0gICAgICAgICAgICBTdHJpbmcgZGlhbG9nVGl0bGUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TUEVDSUZZX1RZUEUiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyKGlGaWxlLCBkZWZpbml0aW9uLCBXU0RMQ29uc3RhbnRzLlRZUEUsIHZhbGlkRXh0ZW5zaW9ucyk7Ci0gICAgICAgICAgICBkaWFsb2cgPSBuZXcgV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhzaGVsbCwgZGlhbG9nVGl0bGUsIHByb3ZpZGVyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByb3BlcnR5ID0gIiI7IAotICAgICAgICAgICAgU3RyaW5nIGRpYWxvZ1RpdGxlID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU1BFQ0lGWV9FTEVNRU5UIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByb3ZpZGVyID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihpRmlsZSwgZGVmaW5pdGlvbiwgV1NETENvbnN0YW50cy5FTEVNRU5ULCB2YWxpZEV4dGVuc2lvbnMpOwotICAgICAgICAgICAgZGlhbG9nID0gbmV3IFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdmlkZXIuc2V0RGlhbG9nKGRpYWxvZyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSW5wdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBPdXRwdXQgfHwgaW5wdXQgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NQRUNJRllfTUVTU0FHRSIpOwotCi0gICAgICAgIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIoaUZpbGUsIGRlZmluaXRpb24sIFdTRExDb25zdGFudHMuTUVTU0FHRSk7Ci0gICAgICAgIGRpYWxvZyA9IG5ldyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nKHNoZWxsLCBkaWFsb2dUaXRsZSwgcHJvdmlkZXIpOyAgIAotICAgICAgICBwcm92aWRlci5zZXREaWFsb2coZGlhbG9nKTsKLSAgICAgICAgcHJvcGVydHkgPSAibWVzc2FnZSI7Ci0gICAgfQotCi0gICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLQotICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICBXU0RMU2V0Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IG5ldyBXU0RMU2V0Q29tcG9uZW50SGVscGVyKGlGaWxlLCBkZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKGtpbmQgIT0gbnVsbCAmJiBraW5kLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkgewotICAgICAgICAgICAgaGVscGVyLnNldFhTRFR5cGVDb21wb25lbnQoKFBhcnQpIGlucHV0LCBkaWFsb2cuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGtpbmQgIT0gbnVsbCAmJiBraW5kLmVxdWFsc0lnbm9yZUNhc2UoImVsZW1lbnQiKSl7Ci0gICAgICAgICAgICBoZWxwZXIuc2V0WFNERWxlbWVudENvbXBvbmVudCgoUGFydCkgaW5wdXQsIGRpYWxvZy5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBoZWxwZXIuc2V0V1NETENvbXBvbmVudCgoV1NETEVsZW1lbnQpIGlucHV0LCBwcm9wZXJ0eSwgZGlhbG9nLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0gCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50RmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzUwMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54bWwuWE1MQ29tcG9uZW50RmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy54bWwuWE1MUXVpY2tTY2FuOwotCi1wdWJsaWMgY2xhc3MgV1NETENvbXBvbmVudEZpbmRlciBleHRlbmRzIFhNTENvbXBvbmVudEZpbmRlciB7Ci0gICAgTGlzdCBsb29rdXBUYWdQYXRoczsKLSAgICAKLSAgICBwdWJsaWMgV1NETENvbXBvbmVudEZpbmRlcihMaXN0IHRhZ1BhdGhzKSB7Ci0gICAgICAgIGxvb2t1cFRhZ1BhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBsb29rdXBUYWdQYXRocy5hZGRBbGwodGFnUGF0aHMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdCBnZXRXb3JrYmVuY2hSZXNvdXJjZUNvbXBvbmVudHMoaW50IHNjb3BlKSB7Ci0gICAgICAgIExpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBmaWxlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBjdXJyZW50IGZpbGUgd2UncmUgd29ya2luZyBvbi4KLSAgICAgICAgaWYgKGN1cnJlbnRJRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBleGNsdWRlRmlsZXMuYWRkKGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEZpbmQgZmlsZXMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYSBzcGVjaWZpZWQgaW4gTGlzdCBleHRlbnNpb25zIGFuZAotICAgICAgICAvLyBMaXN0IGV4Y2x1ZGVGaWxlcy4KLSAgICAgICAgc3dpdGNoIChzY29wZSkgewotICAgICAgICBjYXNlIEVOQ0xPU0lOR19QUk9KRUNUX1NDT1BFOgotICAgICAgICAgICAgZmlsZVBhdGhzID0gZ2V0RW5jbG9zaW5nUHJvamVjdEZpbGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIEVOVElSRV9XT1JLU1BBQ0VfU0NPUEU6Ci0gICAgICAgICAgICBmaWxlUGF0aHMgPSBnZXRXb3Jrc3BhY2VGaWxlcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBTZWFyY2ggZm9yIHRoZSBjb21wb25lbnRzIGluIGVhY2ggb2YgdGhlIGZpbGVzIHNwZWNpZmllZCBpbiB0aGUgcGF0aC4KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBTdHJpbmdbXSBuYW1lQXR0ciA9IG5ldyBTdHJpbmdbMV07Ci0gICAgICAgIG5hbWVBdHRyWzBdID0gIm5hbWUiOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lQXR0cik7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5hbWVBdHRyKTsKLSAgICAgICAgYXR0cmlidXRlcy5hZGQobmFtZUF0dHIpOwotICAgICAgICBhdHRyaWJ1dGVzLmFkZChuYW1lQXR0cik7Ci0KLSAgICAgICAgSXRlcmF0b3IgcGF0aHNJdGVyYXRvciA9IGZpbGVQYXRocy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocGF0aHNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLS8vICAgICAgICAgICBTdHJpbmcgc3RyaW5nUGF0aCA9ICgoUGF0aCkgcGF0aHNJdGVyYXRvci5uZXh0KCkpLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgU3RyaW5nIHN0cmluZ1BhdGggPSAoKFBhdGgpIHBhdGhzSXRlcmF0b3IubmV4dCgpKS50b1N0cmluZygpOwotICAgICAgICAgICBjb21wb25lbnRzLmFkZEFsbChYTUxRdWlja1NjYW4uZ2V0VGFnSW5mbyhzdHJpbmdQYXRoLCBsb29rdXBUYWdQYXRocywgYXR0cmlidXRlcykpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tcG9uZW50czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU2NDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLmNvbW1vbi5JQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25EaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgWE1MQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nIHsKLQkKLSAgICBwdWJsaWMgV1NETENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBJQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoc2hlbGwsIGRpYWxvZ1RpdGxlLCBwcm92aWRlcik7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZGlhbG9ncy90eXBlcy9XU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGExZmVmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5JbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklUeXBlU3lzdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudHlwZXN5c3RlbS5FeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlcy5jb21tb24uSUNvbXBvbmVudExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmRpYWxvZ3MudHlwZXMueG1sLlhNTENvbXBvbmVudFNwZWNpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlhTRERPTUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW1wb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMQ29tcG9uZW50U2VsZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTFRfSU5fVFlQRSA9ICJCVUlMVF9JTl9UWVBFIjsKLSAgICAKLSAgICBwcml2YXRlIFdTRExDb21wb25lbnRGaW5kZXIgd3NkbENvbXBvbmVudEZpbmRlcjsKLSAgICBwcml2YXRlIFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nOwotICAgIHByaXZhdGUgV1NETENvbXBvbmVudExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLSAgICBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgICBwcml2YXRlIExpc3QgbG9va3VwVGFnUGF0aHM7Ci0gICAgcHJpdmF0ZSBpbnQga2luZDsKLSAgICAKLSAgICAvKgotICAgICAqIFRha2VzIGluIHRoZSBJRmlsZSB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcuCi0gICAgICovCi0gICAgcHVibGljIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihJRmlsZSBmaWxlLCBEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCBraW5kKSB7Ci0gICAgCXRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICAgIExpc3QgdmFsaWRFeHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgICAgICB2YWxpZEV4dC5hZGQoIndzZGwiKTsKLSAgICAgICAgdGhpcy5sb29rdXBUYWdQYXRocyA9IGdldExvb2t1cFRhZ1BhdGgoKTsKLSAgICAgICAgd3NkbENvbXBvbmVudEZpbmRlciA9IG5ldyBXU0RMQ29tcG9uZW50RmluZGVyKGxvb2t1cFRhZ1BhdGhzKTsKLSAgICAgICAgd3NkbENvbXBvbmVudEZpbmRlci5zZXRGaWxlKGZpbGUpOwotICAgICAgICB3c2RsQ29tcG9uZW50RmluZGVyLnNldFZhbGlkRXh0ZW5zaW9ucyh2YWxpZEV4dCk7Ci0gICAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gICAgICAgIGxhYmVsUHJvdmlkZXIgPSBuZXcgV1NETENvbXBvbmVudExhYmVsUHJvdmlkZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0TG9va3VwVGFnUGF0aCgpCi0gICAgeyAgICAJCi0gICAgCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9iaW5kaW5nIik7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIFdTRExDb25zdGFudHMuUE9SVF9UWVBFIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9wb3J0VHlwZSIpOwotCQkJYnJlYWs7Ci0JCX0JCi0JCWNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLQkJewotCQkJbGlzdC5hZGQoIi9kZWZpbml0aW9ucy9tZXNzYWdlIik7Ci0JCQlicmVhazsKLQkJfSAgIAotCQljYXNlIFdTRExDb25zdGFudHMuVFlQRSA6Ci0JCXsKLQkJCWxpc3QuYWRkKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKTsKLQkJCWxpc3QuYWRkKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2NvbXBsZXhUeXBlIik7Ci0JCQlsaXN0LmFkZCgiL3NjaGVtYS9jb21wbGV4VHlwZSIpOwotCQkJbGlzdC5hZGQoIi9zY2hlbWEvc2ltcGxlVHlwZSIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBXU0RMQ29uc3RhbnRzLkVMRU1FTlQgOgotCQl7Ci0JCQlsaXN0LmFkZCgiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9lbGVtZW50Iik7Ci0JCQlsaXN0LmFkZCgiL3NjaGVtYS9lbGVtZW50Iik7Ci0JCQlicmVhazsKLQkJfQotCQl9ICAgIAkKLSAgICAJcmV0dXJuIGxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIFdTRExDb21wb25lbnRTZWxlY3Rpb25Qcm92aWRlcihJRmlsZSBmaWxlLCBEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCBraW5kLCBMaXN0IHZhbGlkRXh0KSB7Ci0gICAgICAgIHRoaXMoZmlsZSwgZGVmaW5pdGlvbiwga2luZCk7Ci0gICAgICAgIHdzZGxDb21wb25lbnRGaW5kZXIuc2V0VmFsaWRFeHRlbnNpb25zKHZhbGlkRXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGlhbG9nKFdTRExDb21wb25lbnRTZWxlY3Rpb25EaWFsb2cgZGlhbG9nKSB7Ci0gICAgICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXU0RMQ29tcG9uZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBMaXN0IGlucHV0Q29tcG9uZW50cywgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBpbnB1dENvbXBvbmVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSAoV1NETEVsZW1lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKHRhZ1BhdGgpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgICAgICAgICBzcGVjLnNldFRhcmdldE5hbWVzcGFjZSh3c2RsRWxlbWVudC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24od3NkbEVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24obm9ybWFsaXplZEZpbGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGREYXRhSXRlbVRvVHJlZU5vZGUobGlzdCwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMoSUNvbXBvbmVudExpc3QgbGlzdCwgTGlzdCBpbnB1dENvbXBvbmVudHMsIFN0cmluZyB0YWdQYXRoKSB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gaW5wdXRDb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFhTRE5hbWVkQ29tcG9uZW50IHhzZEVsZW1lbnQgPSAoWFNETmFtZWRDb21wb25lbnQpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKHRhZ1BhdGgpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIHhzZEVsZW1lbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHNwZWMuc2V0VGFyZ2V0TmFtZXNwYWNlKHhzZEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oeHNkRWxlbWVudC5nZXRTY2hlbWEoKS5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIHNwZWMuc2V0RmlsZUxvY2F0aW9uKG5vcm1hbGl6ZWRGaWxlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkRGF0YUl0ZW1Ub1RyZWVOb2RlKGxpc3QsIHNwZWMpOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBnZXRDb21wb25lbnRzKElDb21wb25lbnRMaXN0IGxpc3QsIGJvb2xlYW4gcXVpY2spIHsKLSAgICAgICAgaWYgKHF1aWNrKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciB0YWdzID0gbG9va3VwVGFnUGF0aHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlICh0YWdzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGdldENvbXBvbmVudHNRdWljayhsaXN0LCAoU3RyaW5nKSB0YWdzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGNvbXBvbmVudHMgZnJvbSB3b3Jrc3BhY2UgbG9jYXRpb25zCi0gICAgICAgICAgICBTdHJpbmcgc2NvcGUgPSAiIjsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNjb3BlID0gZGlhbG9nLmdldFNlYXJjaFNjb3BlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIExpc3QgY29tcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NvcGUuZXF1YWxzKFhNTENvbXBvbmVudFNlbGVjdGlvbkRpYWxvZy5TQ09QRV9FTkNMT1NJTkdfUFJPSkVDVCkpIHsKLSAgICAgICAgICAgICAgICBjb21wcyA9IHdzZGxDb21wb25lbnRGaW5kZXIuZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKFhNTENvbXBvbmVudEZpbmRlci5FTkNMT1NJTkdfUFJPSkVDVF9TQ09QRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzY29wZS5lcXVhbHMoWE1MQ29tcG9uZW50U2VsZWN0aW9uRGlhbG9nLlNDT1BFX1dPUktTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wcyA9IHdzZGxDb21wb25lbnRGaW5kZXIuZ2V0V29ya2JlbmNoUmVzb3VyY2VDb21wb25lbnRzKFhNTENvbXBvbmVudEZpbmRlci5FTlRJUkVfV09SS1NQQUNFX1NDT1BFKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSXRlcmF0b3IgY29tcHNJdCA9IGNvbXBzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY29tcHNJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIGl0ZW0gPSAoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgY29tcHNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgYWRkRGF0YUl0ZW1Ub1RyZWVOb2RlKGxpc3QsIGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBnZXRDb21wb25lbnRzUXVpY2soSUNvbXBvbmVudExpc3QgbGlzdCwgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAgICAgLy8gR3JhYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgZmlsZQotICAgICAgICBpZiAodGFnUGF0aC5lcXVhbHMoIi9kZWZpbml0aW9ucy9iaW5kaW5nIikpIHsKLSAgICAgICAgICAgIC8vIEdyYWIgZXhwbGljdGx5IGRlZmluZWQgY29tcG9uZW50cwotICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKSwgdGFnUGF0aCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdyYWIgZGlyZWN0bHkgaW1wb3J0ZWQgY29tcG9uZW50cwotICAgICAgICAgICAgSXRlcmF0b3IgaW1wb3J0c0l0ID0gZ2V0V1NETEZpbGVJbXBvcnRzKGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKSkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpbXBvcnRzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSW1wb3J0IGltcG9ydEl0ZW0gPSAoSW1wb3J0KSBpbXBvcnRzSXQubmV4dCgpOwotICAgICAgICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0RGVmaW5pdGlvbiA9IGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBMaXN0IGltcG9ydGVkQ29tcG9uZW50cyA9IGltcG9ydERlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgaW1wb3J0ZWRDb21wb25lbnRzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0YWdQYXRoLmVxdWFscygiL2RlZmluaXRpb25zL3BvcnRUeXBlIikpIHsKLSAgICAgICAgICAgIC8vIEdyYWIgZXhwbGljdGx5IGRlZmluZWQgY29tcG9uZW50cwotICAgICAgICAgICAgY3JlYXRlV1NETENvbXBvbmVudE9iamVjdHMobGlzdCwgZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCksIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHcmFiIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydHNJdCA9IGdldFdTRExGaWxlSW1wb3J0cyhkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRlZENvbXBvbmVudHMgPSBpbXBvcnREZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjcmVhdGVXU0RMQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBpbXBvcnRlZENvbXBvbmVudHMsIHRhZ1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvbWVzc2FnZSIpKSB7Ci0gICAgICAgICAgICAvLyBHcmFiIGV4cGxpY3RseSBkZWZpbmVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIGNyZWF0ZVdTRExDb21wb25lbnRPYmplY3RzKGxpc3QsIGRlZmluaXRpb24uZ2V0RU1lc3NhZ2VzKCksIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBHcmFiIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydHNJdCA9IGdldFdTRExGaWxlSW1wb3J0cyhkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaW1wb3J0c0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0c0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRlZENvbXBvbmVudHMgPSBpbXBvcnREZWZpbml0aW9uLmdldEVNZXNzYWdlcygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNyZWF0ZVdTRExDb21wb25lbnRPYmplY3RzKGxpc3QsIGltcG9ydGVkQ29tcG9uZW50cywgdGFnUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9kZWZpbml0aW9ucy90eXBlcy9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lVHlwZXNPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lVHlwZXNPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2VsZW1lbnQiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNERWxlbWVudE9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgICAgICBjcmVhdGVSZWd1bGFySW1wb3J0WFNERWxlbWVudE9iamVjdHMobGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvY29tcGxleFR5cGUiKSkgewotICAgICAgICAgICAgY3JlYXRlWFNESW5saW5lV3JhcHBlclR5cGVPYmplY3RzKGxpc3QsIHRhZ1BhdGgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjcmVhdGVYU0RCdWlsdEluVHlwZU9iamVjdHMobGlzdCk7Ci0gICAgICAgICAgICBjcmVhdGVSZWd1bGFySW1wb3J0WFNEVHlwZU9iamVjdHMobGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvc2ltcGxlVHlwZSIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyVHlwZU9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGFnUGF0aC5lcXVhbHMoIi9zY2hlbWEvZWxlbWVudCIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyRWxlbWVudE9iamVjdHMobGlzdCwgdGFnUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0IGdldFdTRExGaWxlSW1wb3J0cyhMaXN0IHdzZGxJbXBvcnRzKSB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSB3c2RsSW1wb3J0cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBJbXBvcnRJbXBsIGltcG9ydEl0ZW0gPSAoSW1wb3J0SW1wbCkgaXQubmV4dCgpOwotICAgICAgICAgICAgaW1wb3J0SXRlbS5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsgICAgICAgICAgLy8gTG9hZCBpZiBuZWNlc3NhcnkKLSAgICAgICAgICAgIGlmIChpbXBvcnRJdGVtLmdldEVTY2hlbWEoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoaW1wb3J0SXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlWFNEQnVpbHRJblR5cGVPYmplY3RzKElDb21wb25lbnRMaXN0IGxpc3QpIHsgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYnVpbHRJbiA9IFhTRERPTUhlbHBlci5kYXRhVHlwZVtpXVswXTsKLSAgICAgICAgICAgIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYyA9IG5ldyBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKEJVSUxUX0lOX1RZUEUpOyAKLSAgICAgICAgICAgIHNwZWMuYWRkQXR0cmlidXRlSW5mbygibmFtZSIsIGJ1aWx0SW4pOwotICAgICAgICAgICAgc3BlYy5zZXRUYXJnZXROYW1lc3BhY2UoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLQotLy8gICAgICAgICAgICBTdHJpbmcgbm9ybWFsaXplZEZpbGUgPSBnZXROb3JtYWxpemVkTG9jYXRpb24oZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKTsKLS8vICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24obm9ybWFsaXplZEZpbGUpOwotICAgICAgICAgICAgc3BlYy5zZXRGaWxlTG9jYXRpb24oIkJ1aWx0LWluIik7ICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBhZGREYXRhSXRlbVRvVHJlZU5vZGUobGlzdCwgc3BlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZ3VsYXJJbXBvcnRYU0RUeXBlT2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0KSB7Ci0gICAgICAgIC8vIEhhbmRsZSByZWd1bGFyIGltcG9ydHMoeHNkIGFuZCB3c2RsKS4KLSAgICAgICAgSXRlcmF0b3IgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW1wb3J0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0cy5uZXh0KCk7Ci0gICAgICAgICAgICAoKEltcG9ydEltcGwpIGltcG9ydEl0ZW0pLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotICAgICAgICAgICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXhQYXRoID0gIiI7Ci0gICAgICAgICAgICBTdHJpbmcgc2ltcGxlUGF0aCA9ICIiOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBpcyBhIHhzZCBmaWxlCi0gICAgICAgICAgICAgICAgc2NoZW1hcy5hZGQoaW1wb3J0SXRlbS5nZXRFU2NoZW1hKCkpOwotICAgICAgICAgICAgICAgIGNvbXBsZXhQYXRoID0gIi9zY2hlbWEvY29tcGxleFR5cGUiOwotICAgICAgICAgICAgICAgIHNpbXBsZVBhdGggPSAiL3NjaGVtYS9zaW1wbGVUeXBlIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW1wb3J0IGlzIGEgd3NkbCBmaWxlCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW1wb3J0SXRlbS5nZXRFRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgSXRlcmF0b3Igc2NoZW1hSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCSAgICAgICAgICAgICAgICB3aGlsZSAoc2NoZW1hSXQuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlZUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHNjaGVtYUl0Lm5leHQoKTsKLQkgICAgICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKGVlRWxlbWVudC5nZXRTY2hlbWEoKSk7Ci0JICAgICAgICAgICAgICAgICAgICBjb21wbGV4UGF0aCA9ICIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2NvbXBsZXhUeXBlIjsKLQkgICAgICAgICAgICAgICAgICAgIHNpbXBsZVBhdGggPSAiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9zaW1wbGVUeXBlIjsKLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNjaGVtYXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNjaGVtYUl0ID0gc2NoZW1hcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChzY2hlbWFJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgdHlwZXNJdCA9ICgoWFNEU2NoZW1hKSBzY2hlbWFJdC5uZXh0KCkpLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgY29tcGxleExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Qgc2ltcGxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHR5cGVzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY29tcG9uZW50ID0gdHlwZXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleExpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZUxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwgY29tcGxleExpc3QsIGNvbXBsZXhQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlWFNEQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBzaW1wbGVMaXN0LCBzaW1wbGVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZ3VsYXJJbXBvcnRYU0RFbGVtZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0KSB7Ci0gICAgICAgIC8vIEhhbmRsZSByZWd1bGFyIGltcG9ydHMoeHNkIGFuZCB3c2RsKS4KLSAgICAgICAgSXRlcmF0b3IgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW1wb3J0cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIEltcG9ydCBpbXBvcnRJdGVtID0gKEltcG9ydCkgaW1wb3J0cy5uZXh0KCk7Ci0gICAgICAgICAgICAoKEltcG9ydEltcGwpIGltcG9ydEl0ZW0pLmltcG9ydERlZmluaXRpb25PclNjaGVtYSgpOwotICAgICAgICAgICAgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBJbXBvcnQgaXMgYSB4c2QgZmlsZQotICAgICAgICAgICAgICAgIHNjaGVtYXMuYWRkKGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpKTsKLSAgICAgICAgICAgICAgICBwYXRoID0gIi9zY2hlbWEvZWxlbWVudCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEltcG9ydCBpcyBhIHdzZGwgZmlsZQotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGltcG9ydEl0ZW0uZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHNjaGVtYUl0ID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkgICAgICAgICAgICAgICAgd2hpbGUgKHNjaGVtYUl0Lmhhc05leHQoKSkgewotCSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWVFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBzY2hlbWFJdC5uZXh0KCk7Ci0JICAgICAgICAgICAgICAgICAgICBzY2hlbWFzLmFkZChlZUVsZW1lbnQuZ2V0U2NoZW1hKCkpOwotCSAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL2VsZW1lbnQiOwotCSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoc2NoZW1hcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Igc2NoZW1hSXQgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNjaGVtYUl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBMaXN0IGVsZW1lbnRMaXN0ID0gKChYU0RTY2hlbWEpIHNjaGVtYUl0Lm5leHQoKSkuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVYU0RDb21wb25lbnRPYmplY3RzKGxpc3QsIGVsZW1lbnRMaXN0LCBwYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVhTRElubGluZVR5cGVzT2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBTdHJpbmcgdGFnUGF0aCkgewotICAgICAgICAvLyBIYW5kbGUgaW5saW5lIHNjaGVtYXMKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgICAgICBJdGVyYXRvciBpbmxpbmVTY2hlbWFzSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW5saW5lU2NoZW1hc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGlubGluZVNjaGVtYXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCAmJiAhc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdCBrZWVwVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIHR5cGVJdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IHVud2FudGVkIFR5cGVzCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YWdQYXRoLmVxdWFscygiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9jb21wbGV4VHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHlwZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB0eXBlID0gdHlwZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHR5cGUpLmdldFNjaGVtYSgpLmVxdWFscyhzY2hlbWEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRhZ1BhdGguZXF1YWxzKCIvZGVmaW5pdGlvbnMvdHlwZXMvc2NoZW1hL3NpbXBsZVR5cGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHR5cGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdHlwZSA9IHR5cGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgdHlwZSkuZ2V0U2NoZW1hKCkuZXF1YWxzKHNjaGVtYSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwga2VlcFR5cGVzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYU0RFbGVtZW50T2JqZWN0cyhJQ29tcG9uZW50TGlzdCBsaXN0LCBTdHJpbmcgdGFnUGF0aCkgewotICAgIAlpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgICAgIEl0ZXJhdG9yIGlubGluZVNjaGVtYXNJdCA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbmxpbmVTY2hlbWFzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgaW5saW5lU2NoZW1hc0l0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdCBrZWVwRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBpZiAoc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwgJiYgIXNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgZWxlbWVudEl0ID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50SXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgbG9vayBmb3IgZWxlbWVudHMgZXhwbGljaXRseSBkZWZpbmVkIGluIHRoZSBTY2hlbWEgKG5vdCB0aHJvdWdoIGltcG9ydHMpLgotICAgICAgICAgICAgICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4c2RFbGVtZW50LmdldFNjaGVtYSgpLmVxdWFscyhzY2hlbWEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZWVwRWxlbWVudHMuYWRkKHhzZEVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNyZWF0ZVhTRENvbXBvbmVudE9iamVjdHMobGlzdCwga2VlcEVsZW1lbnRzLCB0YWdQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlWFNESW5saW5lV3JhcHBlclR5cGVPYmplY3RzKElDb21wb25lbnRMaXN0IGxpc3QsIFN0cmluZyB0YWdQYXRoKSB7Ci0gICAgICAgIC8vIEhhbmRsZSBpbmxpbmUgc2NoZW1hcwotICAgIAlpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJCi0gICAgICAgIEl0ZXJhdG9yIGlubGluZVNjaGVtYXNJdCA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbmxpbmVTY2hlbWFzSXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgaW5saW5lU2NoZW1hc0l0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsIHx8IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCBrZWVwVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgTGlzdCBpbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhTRFNjaGVtYUNvbnRlbnQgY29udGVudCA9IChYU0RTY2hlbWFDb250ZW50KSBjb250ZW50cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZChjb250ZW50KTsgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaW1wb3J0SXRlcmF0b3IgPSBpbXBvcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGltcG9ydEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBYU0RJbXBvcnQgaW1wb3J0T2JqZWN0ID0gKFhTREltcG9ydCkgaW1wb3J0SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWEgaW1wb3J0U2NoZW1hID0gKChYU0RJbXBvcnRJbXBsKSBpbXBvcnRPYmplY3QpLmltcG9ydFNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciB0eXBlc0l0ID0gaW1wb3J0U2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHR5cGVPYmplY3QgPSB0eXBlc0l0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQYXRoLmVxdWFscygiL3NjaGVtYS9jb21wbGV4VHlwZSIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU9iamVjdCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YWdQYXRoLmVxdWFscygiL3NjaGVtYS9zaW1wbGVUeXBlIikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPYmplY3QgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBUeXBlcy5hZGQodHlwZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY3JlYXRlWFNEQ29tcG9uZW50T2JqZWN0cyhsaXN0LCBrZWVwVHlwZXMsIHRhZ1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVYU0RJbmxpbmVXcmFwcGVyRWxlbWVudE9iamVjdHMoSUNvbXBvbmVudExpc3QgbGlzdCwgU3RyaW5nIHRhZ1BhdGgpIHsKLSAgICAJaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCQotICAgICAgICBJdGVyYXRvciBpbmxpbmVTY2hlbWFzSXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW5saW5lU2NoZW1hc0l0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGlubGluZVNjaGVtYXNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGNvbnRlbnRzID0gc2NoZW1hLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBMaXN0IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnRzLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgY29udGVudHMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0cy5hZGQoY29udGVudCk7ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGltcG9ydEl0ZXJhdG9yID0gaW1wb3J0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpbXBvcnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNESW1wb3J0IGltcG9ydE9iamVjdCA9IChYU0RJbXBvcnQpIGltcG9ydEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hIGltcG9ydFNjaGVtYSA9ICgoWFNESW1wb3J0SW1wbCkgaW1wb3J0T2JqZWN0KS5pbXBvcnRTY2hlbWEoKTsKLQotICAgICAgICAgICAgICAgICAgICBjcmVhdGVYU0RDb21wb25lbnRPYmplY3RzKGxpc3QsIGltcG9ydFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCksIHRhZ1BhdGgpOyAgICAKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgICBwcml2YXRlIElUeXBlU3lzdGVtUHJvdmlkZXIgZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKCkgewotICAgICAgICAgICAgSVR5cGVTeXN0ZW1Qcm92aWRlciBwcm92aWRlciA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0VHlwZVN5c3RlbVByb3ZpZGVyKGRlZmluaXRpb24pOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcikgewotICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gKEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIpIHByb3ZpZGVyOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7Ci0gICAgICB9Ci0KLSAgICAKLSAgCi0gICAgcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyOwotICAgIH0gICAgCi0gICAgCi0JcHVibGljIFN0cmluZyBnZXRMaXN0VGl0bGUoKSB7Ci0KLQkJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX01BVENISU5HX0JJTkRJTkdTIik7Ci0JCX0KLQkJY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0JCXsKLQkJCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9NQVRDSElOR19QT1JUVFlQRVMiKTsKLQkJfQkKLQkJY2FzZSBXU0RMQ29uc3RhbnRzLk1FU1NBR0UgOgotCQl7Ci0JCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUFUQ0hJTkdfTUVTU0FHRVMiKTsKLQkJfSAgIAotCQljYXNlIFdTRExDb25zdGFudHMuVFlQRSA6Ci0JCXsKLQkJCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9NQVRDSElOR19UWVBFUyIpOwotCQl9Ci0JCWNhc2UgV1NETENvbnN0YW50cy5FTEVNRU5UIDoKLQkJewotCQkJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX01BVENISU5HX0VMRU1FTlRTIik7Ci0JCX0KLQkJfSAgICAJCi0JCXJldHVybiBudWxsOwkgICAKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVGaWVsZFRpdGxlKCkgewotCQlTdHJpbmcgbmFtZVN0cmluZyA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUUiKSArICI6IjsKLQkJc3dpdGNoIChraW5kKQotCQl7Ci0JCWNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLQkJewotCQkJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkciKSArICIgIiArIG5hbWVTdHJpbmc7Ci0JCX0KLQkJY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0JCXsKLQkJCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QT1JUVFlQRSIpICsgIiAiICsgbmFtZVN0cmluZzsKLQkJfQkKLQkJY2FzZSBXU0RMQ29uc3RhbnRzLk1FU1NBR0UgOgotCQl7Ci0JCQlyZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpICsgIiAiICsgbmFtZVN0cmluZzsKLQkJfSAgIAotCQljYXNlIFdTRExDb25zdGFudHMuVFlQRSA6Ci0JCXsKLQkJCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFIikgKyAiICIgKyBuYW1lU3RyaW5nOwotCQl9Ci0JCWNhc2UgV1NETENvbnN0YW50cy5FTEVNRU5UIDoKLQkJewotCQkJcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSArICIgIiArIG5hbWVTdHJpbmc7Ci0JCX0KLQkJfSAgICAJCi0JCXJldHVybiBudWxsOwkgICAKLQl9Ci0gICAgcHVibGljIGNsYXNzIFdTRExDb21wb25lbnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgWE1MQ29tcG9uZW50U2VsZWN0aW9uTGFiZWxQcm92aWRlciB7Ci0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgWE1MQ29tcG9uZW50VHJlZU9iamVjdCBzcGVjaWZpY2F0aW9uID0gKFhNTENvbXBvbmVudFRyZWVPYmplY3QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMgPSAoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbikgc3BlY2lmaWNhdGlvbi5nZXRYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uKCkuZ2V0KDApOwotICAgICAgICAgICAgaWYgKHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiL2RlZmluaXRpb25zL2JpbmRpbmciKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2JpbmRpbmdfb2JqLmdpZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvZGVmaW5pdGlvbnMvcG9ydFR5cGUiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3BvcnRfb2JqLmdpZiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvZGVmaW5pdGlvbnMvbWVzc2FnZSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvbWVzc2FnZV9vYmouZ2lmIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoIi9kZWZpbml0aW9ucy90eXBlcy9zY2hlbWEvY29tcGxleFR5cGUiKSB8fAotICAgICAgICAgICAgICAgICAgICAgc3BlYy5nZXRUYWdQYXRoKCkuZXF1YWxzKCIvc2NoZW1hL2NvbXBsZXhUeXBlIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RDb21wbGV4VHlwZS5naWYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9zaW1wbGVUeXBlIikgfHwKLSAgICAgICAgICAgICAgICAgICAgIHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiL3NjaGVtYS9zaW1wbGVUeXBlIikgfHwKLSAgICAgICAgICAgICAgICAgICAgIHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiQlVJTFRfSU5fVFlQRSIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNEU2ltcGxlVHlwZS5naWYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiL2RlZmluaXRpb25zL3R5cGVzL3NjaGVtYS9lbGVtZW50IikgfHwKLSAgICAgICAgICAgICAgICAgICAgIHNwZWMuZ2V0VGFnUGF0aCgpLmVxdWFscygiL3NjaGVtYS9lbGVtZW50IikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gWFNERWRpdG9yUGx1Z2luLmdldFhTREltYWdlKCJpY29ucy9YU0RFbGVtZW50LmdpZiIpOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9kaWFsb2dzL3R5cGVzL1dTRExTZXRDb21wb25lbnRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETFNldENvbXBvbmVudEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTc1NWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2RpYWxvZ3MvdHlwZXMvV1NETFNldENvbXBvbmVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy50eXBlczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEVsZW1lbnREZWNsYXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZEltcG9ydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkFkZFdTSVNjaGVtYUltcG9ydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5kaWFsb2dzLnR5cGVzLnhtbC5YTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFNldENvbXBvbmVudEhlbHBlciB7Ci0gICAgcHJpdmF0ZSBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gICAgcHJpdmF0ZSBJRmlsZSBjdXJyZW50SUZpbGU7Ci0gICAgCi0gICAgcHVibGljIFdTRExTZXRDb21wb25lbnRIZWxwZXIoSUZpbGUgaUZpbGUsIERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgICAgICBjdXJyZW50SUZpbGUgPSBpRmlsZTsKLSAgICAgICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0V1NETENvbXBvbmVudChXU0RMRWxlbWVudCBpbnB1dEVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgIGFkZEltcG9ydElmTmVjZXNzYXJ5KHNwZWMpOwotICAgICAgICBTdHJpbmcgY29tcG9uZW50T2JqZWN0ID0gZ2V0UHJlZml4ZWRDb21wb25lbnROYW1lKHNwZWMpOwotCi0gICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgd3NkbEVsZW1lbnQgPSBpbnB1dEVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gZGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICB3c2RsRWxlbWVudC5zZXRBdHRyaWJ1dGUocHJvcGVydHksIGNvbXBvbmVudE9iamVjdCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFhTRFR5cGVDb21wb25lbnQoUGFydCBwYXJ0LCBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpIHsKLSAgICAgICAgaWYgKCFzcGVjLmdldFRhZ1BhdGgoKS5lcXVhbHMoV1NETENvbXBvbmVudFNlbGVjdGlvblByb3ZpZGVyLkJVSUxUX0lOX1RZUEUpKSB7Ci0gICAgICAgICAgICBhZGRJbXBvcnRJZk5lY2Vzc2FyeShzcGVjKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY29tcG9uZW50T2JqZWN0ID0gZ2V0UHJlZml4ZWRDb21wb25lbnROYW1lKHNwZWMpOwotICAgICAgICAKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5zZXRDb21wb25lbnRSZWZlcmVuY2UoKFBhcnQpIHBhcnQsIHRydWUsIGNvbXBvbmVudE9iamVjdCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFhTREVsZW1lbnRDb21wb25lbnQoUGFydCBwYXJ0LCBYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpIHsKLSAgICAgICAgYWRkSW1wb3J0SWZOZWNlc3Nhcnkoc3BlYyk7Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRPYmplY3QgPSBnZXRQcmVmaXhlZENvbXBvbmVudE5hbWUoc3BlYyk7Ci0gICAgICAgIAotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZSgoUGFydCkgcGFydCwgZmFsc2UsIGNvbXBvbmVudE9iamVjdCk7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBwcmVmaXhlZCBjb21wb25lbnQgbmFtZSBkZXNjcmliZWQgYnkgdGhlIGdpdmVuCi0gICAgICogWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhlZENvbXBvbmVudE5hbWUoWE1MQ29tcG9uZW50U3BlY2lmaWNhdGlvbiBzcGVjKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgc3BlYy5nZXRBdHRyaWJ1dGVJbmZvKCJuYW1lIik7Ci0gICAgICAgIExpc3QgcHJlZml4ZXMgPSBnZXRQcmVmaXhlcyhkZWZpbml0aW9uLCBzcGVjLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgaWYgKHByZWZpeGVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG5hbWUgPSBwcmVmaXhlcy5nZXQoMCkgKyAiOiIgKyBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9ICAgICAgICAgCi0gICAgICAgICAgCi0gICAgcHJpdmF0ZSBMaXN0IGdldFByZWZpeGVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSkgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIE1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHRoZU5hbWVzcGFjZSA9IChTdHJpbmcpIG1hcC5nZXQocHJlZml4KTsKLSAgICAgICAgICAgIGlmICh0aGVOYW1lc3BhY2UgIT0gbnVsbCAmJiB0aGVOYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZSkpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRJbXBvcnRJZk5lY2Vzc2FyeShYTUxDb21wb25lbnRTcGVjaWZpY2F0aW9uIHNwZWMpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayBpdHNlbGYKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRGaWxlTG9jYXRpb24gPSBjdXJyZW50SUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotICAgICAgICBpZiAoY3VycmVudEZpbGVMb2NhdGlvbi5lcXVhbHMoc3BlYy5nZXRGaWxlTG9jYXRpb24oKSkpIHsKLSAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBDaGVjayByZWd1bGFyIEltcG9ydHMKLSAgICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7Ci0gICAgICAgICAgICBJdGVyYXRvciBpbXBvcnRzSXQgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKGltcG9ydHNJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0TG9jYXRpb24gPSAiIjsKLSAgICAgICAgICAgICAgICBJbXBvcnQgaW1wb3J0SXRlbSA9IChJbXBvcnQpIGltcG9ydHNJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGltcG9ydEl0ZW0uZ2V0RVNjaGVtYSgpOwotICAgICAgICAgICAgICAgICAgICBpbXBvcnRMb2NhdGlvbiA9IGdldE5vcm1hbGl6ZWRMb2NhdGlvbihzY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIGltcG9ydERlZmluaXRpb24gPSBpbXBvcnRJdGVtLmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydExvY2F0aW9uID0gZ2V0Tm9ybWFsaXplZExvY2F0aW9uKGltcG9ydERlZmluaXRpb24uZ2V0TG9jYXRpb24oKSk7IAotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAKLSAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TG9jYXRpb24uZXF1YWxzKHNwZWMuZ2V0RmlsZUxvY2F0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIENoZWNrIGlubGluZSBTY2hlbWFzCi0gICAgICAgIGlmICghZm91bmRNYXRjaCkgewotICAgICAgICAgICAgTGlzdCBpbXBvcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkgICAgICAgICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWVFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JICAgICAgICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBlZUVsZW1lbnQuZ2V0U2NoZW1hKCk7Ci0JICAgICAgICAgICAgICAgIGlmIChzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKCIiKSkgeyAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBjb250ZW50cyA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0JICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY29udGVudHMuaGFzTmV4dCgpKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgWFNEU2NoZW1hQ29udGVudCBjb250ZW50ID0gKFhTRFNjaGVtYUNvbnRlbnQpIGNvbnRlbnRzLm5leHQoKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzLmFkZChjb250ZW50KTsgICAgICAgICAgICAgCi0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBJdGVyYXRvciBpbXBvcnRJdCA9IGltcG9ydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpbXBvcnRJdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBYU0RJbXBvcnQgaW1wb3J0SXRlbSA9IChYU0RJbXBvcnQpIGltcG9ydEl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSBpbXBvcnRJdGVtLmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkU3RyaW5nID0gcmVzb2x2ZWRTY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wb3J0TG9jYXRpb24gPSBnZXROb3JtYWxpemVkTG9jYXRpb24ocmVzb2x2ZWRTdHJpbmcpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChpbXBvcnRMb2NhdGlvbi5lcXVhbHMoc3BlYy5nZXRGaWxlTG9jYXRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7Ci0gICAgICAgICAgICBib29sZWFuIHdzaVN0eWxlSW1wb3J0ID0gaXNYU0RTY2hlbWFGaWxlKHNwZWMpOwotICAgICAgICAgICAgaWYgKHdzaVN0eWxlSW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgQWRkRWxlbWVudERlY2xhcmF0aW9uQWN0aW9uIGFjdGlvbiA9IG5ldyBBZGRFbGVtZW50RGVjbGFyYXRpb25BY3Rpb24oZGVmaW5pdGlvbiwgc3BlYy5nZXRUYXJnZXROYW1lc3BhY2UoKSwgInhzZCIpOwotICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oKTsKLSAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkobmV3IFBhdGgoc3BlYy5nZXRGaWxlTG9jYXRpb24oKSksIGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICBBZGRXU0lTY2hlbWFJbXBvcnRBY3Rpb24gYWRkSW1wb3J0ID0gbmV3IEFkZFdTSVNjaGVtYUltcG9ydEFjdGlvbihkZWZpbml0aW9uLCBzcGVjLmdldFRhcmdldE5hbWVzcGFjZSgpLCBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgYWRkSW1wb3J0LnJ1bigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1NlbGVjdGVkRmlsZUxvYyA9IHNwZWMuZ2V0RmlsZUxvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRGaWxlTG9jID0gZ2V0Tm9ybWFsaXplZExvY2F0aW9uKGRlZmluaXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlTG9jID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlUmVsYXRpdmVVUkkobmV3U2VsZWN0ZWRGaWxlTG9jLCBjdXJyZW50RmlsZUxvYywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzcGVjLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEFkZEltcG9ydEFjdGlvbiBhZGRJbXBvcnRBY3Rpb24gPSBuZXcgQWRkSW1wb3J0QWN0aW9uKG51bGwsIGRlZmluaXRpb24sIGRlZmluaXRpb25FbGVtZW50LCBwcmVmaXgsIG5hbWVzcGFjZSwgcmVsYXRpdmVMb2MpOwotICAgICAgICAgICAgICAgIGFkZEltcG9ydEFjdGlvbi5ydW4oKTsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlUHJlZml4ID0gZ2V0VW5pcXVlUHJlZml4KGRlZmluaXRpb24sIHByZWZpeCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgdW5pcXVlUHJlZml4LCBuYW1lc3BhY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8qCi0gICAgICogVHJ5IHRvIGRldGVybWluZSBpZiB0aGUgcGFzc2VkIGluIFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gcmVmZXJzIHRvCi0gICAgICogYW4gWFNEIG9yIFdTREwgZmlsZS4gIElmIGl0J3MgYW4gWFNELCByZXR1cm4gdHJ1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNYU0RTY2hlbWFGaWxlKFhNTENvbXBvbmVudFNwZWNpZmljYXRpb24gc3BlYykgewotICAgICAgICBTdHJpbmcgZmlsZUxvY2F0aW9uID0gc3BlYy5nZXRGaWxlTG9jYXRpb24oKTsKLSAgICAgICAgaW50IHBlcmlvZEluZGV4ID0gZmlsZUxvY2F0aW9uLmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgIAotICAgICAgICBpZiAocGVyaW9kSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gZmlsZUxvY2F0aW9uLnN1YnN0cmluZyhwZXJpb2RJbmRleCArIDEpOwotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ4c2QiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVQcmVmaXgoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgaW5pdFByZWZpeCkgewotICAgICAgU3RyaW5nIHVuaXF1ZVByZWZpeDsKLSAgICAgIE1hcCBtYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQotICAgICAgaWYgKGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlKGluaXRQcmVmaXgpID09IG51bGwpIHsKLSAgICAgICAgdW5pcXVlUHJlZml4ID0gaW5pdFByZWZpeDsKLSAgICAgIH0KLSAgICAgIGVsc2Ugey8vIGlmIHVzZWQsIHRoZW4gdHJ5IHRvIGNyZWF0ZSBhIHVuaXF1ZSBvbmUKLSAgICAgICAgU3RyaW5nIHRlbXBQcmVmaXggPSBpbml0UHJlZml4OwotICAgICAgICBpbnQgaSA9IDE7Ci0gICAgICAgIHdoaWxlKG1hcC5jb250YWluc0tleSh0ZW1wUHJlZml4ICsgaSkpIHsKLSAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgdW5pcXVlUHJlZml4ID0gdGVtcFByZWZpeCArIGk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdW5pcXVlUHJlZml4OyAgICAKLSAgICB9IAotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldE5vcm1hbGl6ZWRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIFVSTCByZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLSAgICAgICAgICAgIGxvY2F0aW9uID0gcmVzb2x2ZWRVUkwuZ2V0UGF0aCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOyAKLSAgICAgIH0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjY0MjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggZXh0ZW5zaWJpbGl0eSBpdGVtIHRyZWUgcHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyUmVnaXN0cnkgZXh0ZW5kcyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfUFJPVklERVJfUFJPUEVSVFkgPSAibGFiZWxQcm92aWRlckNsYXNzIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QUk9WSURFUl9QUk9QRVJUWSA9ICJjb250ZW50UHJvdmlkZXJDbGFzcyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVRUX05BTUVTID0geyAibGFiZWxQcm92aWRlckNsYXNzIiwgImNvbnRlbnRQcm92aWRlckNsYXNzIiB9OwotCi0gIHB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZXR1cm4gKElMYWJlbFByb3ZpZGVyKSBnZXRQcm9wZXJ0eShuYW1lc3BhY2UsIExBQkVMX1BST1ZJREVSX1BST1BFUlRZKTsKLSAgfQotCi0gIHB1YmxpYyBJVHJlZUNoaWxkUHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZXR1cm4gKElUcmVlQ2hpbGRQcm92aWRlcikgZ2V0UHJvcGVydHkobmFtZXNwYWNlLCBDT05URU5UX1BST1ZJREVSX1BST1BFUlRZKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lEZXRhaWxzVmlld2VyUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JRGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZjQ3NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lEZXRhaWxzVmlld2VyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgT2JqZWN0IGdldFZpZXdlcktleShPYmplY3QgbW9kZWxPYmplY3QpOwotICBwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihPYmplY3QgbW9kZWxPYmplY3QsIENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JRWRpdFBhcnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFZGl0UGFydFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYzgyMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFZGl0UGFydFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGludGVyZmFjZSBJRWRpdFBhcnRQcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWFuYWdlciwgTm9kZSBub2RlLCBPYmplY3Qgb2JqZWN0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmZjkxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU1lbnVBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1lbnVBY3Rpb25Db250cmlidXRvcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWFuYWdlciwgTm9kZSBub2RlLCBPYmplY3Qgb2JqZWN0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU1vZGVsUXVlcnlDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lNb2RlbFF1ZXJ5Q29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVkOWE3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU1vZGVsUXVlcnlDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotICAgICAgICAgICAgICAgICAgIAotLy8gTm90ZSB0aGlzIGNsYXNzIHdpbGwgbGlrZWx5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB3aGVuIHRoZSBNb2RlbFF1ZXJ5J3MgZXh0ZW5zaW9uIG1lY2hhbmlzbSBpcyB1cGRhdGVkCi0vLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxRdWVyeUNvbnRyaWJ1dG9yCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgc2V0TW9kZWwoSURPTU1vZGVsIHhtbE1vZGVsKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOTU2Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lOb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChPYmplY3QgcGFyZW50TW9kZWxPYmplY3QsIEVsZW1lbnRbXSBlbGVtZW50Q2hhaW4sIGludCBzdGFydCwgaW50W10gZW5kKTsKLSAgcHVibGljIE5vZGUgZ2V0Tm9kZShPYmplY3QgbW9kZWxPYmplY3QpOyAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU5vZGVSZWNvbmNpbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSU5vZGVSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Y2ZlYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lOb2RlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVSZWNvbmNpbGVyCi17Ci0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoT2JqZWN0IG1vZGVsT2JqZWN0LCBFbGVtZW50IGVsZW1lbnQsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JVHJlZUNoaWxkUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JVHJlZUNoaWxkUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjMzgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSVRyZWVDaGlsZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFsbG93cyBleHRlbnNpb24gd3JpdGVycyB0byBwcm92aWRlIHNwZWNpYWxpemUgdHJlZSBjb250ZW50IGJlaGF2aW91ci4KLSAqIEl0IGlzIGludGVuZGVkIHRvIGJlaGF2ZSBzaW1pbGFyIHRvIHRoZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyLgotICogVGhlIG1ham9yIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGNsYXNzIGlzIHNpbXBsaWZpZWQgc28gdGhhdCBvbmx5IG9uZSBtZXRob2QgaXMgaW52b2x2ZWQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KSAgCQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUcmVlQ2hpbGRQcm92aWRlcgotewotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vSVR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzAwZWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUeXBlU3lzdGVtUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9UWVBFID0gMHgwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMVF9JTl9UWVBFID0gMHgxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSX0RFRklORURfU0lNUExFX1RZUEUgPSAweDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVJfREVGSU5FRF9DT01QTEVYX1RZUEUgPSAweDQ7Ci0KLSAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpOwotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVFbGVtZW50TmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKTsgIAotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUeXBlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFhTRFNjaGVtYSBzY2hlbWEsIGludCB0eXBlTmFtZUNhdGVnb3J5KTsKLSAgcHVibGljIGludCBnZXRDYXRlZ29yeUZvclR5cGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHR5cGVOYW1lKTsKLSAgcHVibGljIExpc3QgZ2V0UHJlZml4ZWROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9OU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9OU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNiN2VhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vTlNLZXllZEV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotcHVibGljIGNsYXNzIE5TS2V5ZWRFeHRlbnNpb25SZWdpc3RyeQotewotICBwcm90ZWN0ZWQgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0xPQURJTkdfRVJST1IgPSAiUExVR0lOX0xPQURJTkdfRVJST1IiOwotCi0gIHB1YmxpYyBOU0tleWVkRXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gIHsKLSAgICBFeHRlbnNpb25JbmZvIGluZm8gPSAoRXh0ZW5zaW9uSW5mbykgbWFwLmdldChuYW1lc3BhY2VVUkkpOwotICAgIGlmIChpbmZvID09IG51bGwpCi0gICAgewotICAgICAgaW5mbyA9IG5ldyBTaW5nbGVQcm9wZXJ0eUV4dGVuc2lvbkluZm8oY2xhc3NOYW1lLCBjbGFzc0xvYWRlcik7Ci0gICAgICBtYXAucHV0KG5hbWVzcGFjZVVSSSwgaW5mbyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcHV0KFN0cmluZyBuYW1lc3BhY2VVUkksIEhhc2hNYXAgcHJvcGVydHlUb0NsYXNzTmFtZU1hcCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gIHsKLSAgICBFeHRlbnNpb25JbmZvIGluZm8gPSAoRXh0ZW5zaW9uSW5mbykgbWFwLmdldChuYW1lc3BhY2VVUkkpOwotICAgIGlmIChpbmZvID09IG51bGwpCi0gICAgewotICAgICAgaW5mbyA9IG5ldyBNdWx0aVByb3BlcnR5RXh0ZW5zaW9uSW5mbyhwcm9wZXJ0eVRvQ2xhc3NOYW1lTWFwLCBjbGFzc0xvYWRlcik7Ci0gICAgICBtYXAucHV0KG5hbWVzcGFjZVVSSSwgaW5mbyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIAotICAgKiBAZGVwcmVjYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgcmV0dXJuIGluZm8gIT0gbnVsbCA/IGluZm8uZ2V0T2JqZWN0KCIiKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIEV4dGVuc2lvbkluZm8gaW5mbyA9IChFeHRlbnNpb25JbmZvKSBtYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gICAgcmV0dXJuIGluZm8gIT0gbnVsbCA/IGluZm8uZ2V0T2JqZWN0KHByb3BlcnR5KSA6IG51bGw7Ci0gIH0KLQotICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIEV4dGVuc2lvbkluZm8KLSAgewotICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQotICAgIHB1YmxpYyBFeHRlbnNpb25JbmZvKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICAgIHsKLSAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgcHJvcGVydHkpOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBTaW5nbGVQcm9wZXJ0eUV4dGVuc2lvbkluZm8gZXh0ZW5kcyBFeHRlbnNpb25JbmZvCi0gIHsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9iamVjdDsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvcjsKLQotICAgIHB1YmxpYyBTaW5nbGVQcm9wZXJ0eUV4dGVuc2lvbkluZm8oU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gICAgewotICAgICAgc3VwZXIoY2xhc3NMb2FkZXIpOwotICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSA6IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLSAgICAgICAgICBvYmplY3QgPSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIG9iamVjdCA9IFBMVUdJTl9MT0FESU5HX0VSUk9SOwotICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBvYmplY3QgIT0gUExVR0lOX0xPQURJTkdfRVJST1IgPyBvYmplY3QgOiBudWxsOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgTXVsdGlQcm9wZXJ0eUV4dGVuc2lvbkluZm8gZXh0ZW5kcyBFeHRlbnNpb25JbmZvCi0gIHsKLSAgICBwcm90ZWN0ZWQgSGFzaE1hcCBwcm9wZXJ0eVRvQ2xhc3NOYW1lVGFibGU7Ci0gICAgcHJvdGVjdGVkIEhhc2hNYXAgcHJvcGVydHlUb09iamVjdFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyBNdWx0aVByb3BlcnR5RXh0ZW5zaW9uSW5mbyhIYXNoTWFwIHByb3BlcnRUb0NsYXNzTmFtZVRhYmxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLSAgICB7Ci0gICAgICBzdXBlcihjbGFzc0xvYWRlcik7Ci0gICAgICB0aGlzLnByb3BlcnR5VG9DbGFzc05hbWVUYWJsZSA9IHByb3BlcnRUb0NsYXNzTmFtZVRhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0eVRvQ2xhc3NOYW1lVGFibGUuZ2V0KHByb3BlcnR5KTsKLSAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcHJvcGVydHlUb09iamVjdFRhYmxlLmdldChwcm9wZXJ0eSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDogQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgcmVzdWx0ID0gdGhlQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHByb3BlcnR5VG9PYmplY3RUYWJsZS5wdXQocHJvcGVydHksIHJlc3VsdCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0eVRvT2JqZWN0VGFibGUucHV0KHByb3BlcnR5LCBQTFVHSU5fTE9BRElOR19FUlJPUik7Ci0gICAgICAgICAgICByZXN1bHQgPSBQTFVHSU5fTE9BRElOR19FUlJPUjsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0JICByZXR1cm4gcmVzdWx0ICE9IFBMVUdJTl9MT0FESU5HX0VSUk9SID8gcmVzdWx0IDogbnVsbDsgICAgICAKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vV1NETEVkaXRvckV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL1dTRExFZGl0b3JFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiYWY2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vV1NETEVkaXRvckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExFZGl0b3JFeHRlbnNpb24KLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUTElORV9UUkVFX0NPTlRFTlRfUFJPVklERVIgPSAxOyAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVExJTkVfTEFCRUxfUFJPVklERVIgPSAyOyAgICAgICAgICAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SID0gMzsgICAgICAgICAgLy8gbm9kZQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVRBSUxTX1ZJRVdFUl9QUk9WSURFUiA9IDQ7ICAgICAgICAgIC8vIG5vZGUKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFRElUX1BBUlRfRkFDVE9SWSA9IDU7ICAgICAgICAgICAgICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWVNURU1fUFJPVklERVIgPSA2OyAgICAgICAgICAgICAvLyByZXEnZCBmb3IgdHlwZSBzeXN0ZW0gZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PREVfUkVDT05DSUxFUiA9IDc7ICAgICAgICAgICAgICAgICAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0RFX0FTU09DSUFUSU9OX1BST1ZJREVSID0gODsgICAgICAgIC8vIHJlcSdkIGZvciBtb2RlbCBiYXNlZCBleHQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUVVFUllfQ09OVFJJQlVUT1IgPSA5OyAgICAgICAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU09VUkNFX1BST1ZJREVSID0gMTA7ICAgICAgICAvLyByZXEnZCBmb3IgbW9kZWwgYmFzZWQgZXh0Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1NFQ1RJT05fREVTQ1JJUFRPUl9QUk9WSURFUiA9IDExOyAgLy8gcmVxJ2QgZm9yIG1vZGVsIGJhc2VkIGV4dAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYU0RfREVMRVRFX0FDVElPTiA9IDEyOwotICAKLSAgYm9vbGVhbiBpc0V4dGVuc2lvblR5cGVTdXBwb3J0ZWQoaW50IHR5cGUpOwotICBib29sZWFuIGlzQXBwbGljYWJsZShPYmplY3QgbW9kZWxPYmplY3QpOwotICBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KGludCB0eXBlLCBXU0RMRWRpdG9yIHdzZGxFZGl0b3IpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2V4dGVuc2lvbi9XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlMjQzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9leHRlbnNpb24vV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLQotcHVibGljIGNsYXNzIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeQoteyAgICAgICAgICAgICAgICAgICAKLSAgLy9wcm90ZWN0ZWQgTGlzdCBjbGFzc05hbWVDbGFzc0xvYWRlclBhaXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAvL3Byb3RlY3RlZCBIYXNoTWFwIHRyZWVQcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7IAotICBwcm90ZWN0ZWQgTGlzdCByZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICBwdWJsaWMgV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCkKLSAgewotICAgIGFkZChuZXcgV1NETEVkaXRvci5CdWlsdEluV1NETEVkaXRvckV4dGVuc2lvbigpKTsKLSAgfSAgICAgICAgICAgIAotCi0gIC8vcHVibGljIEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyIGdldEV4dGVuc2liaWxpdHlJdGVtVHJlZVByb3ZpZGVyKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIC8vewotICAvLyAgcmV0dXJuIChFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlcil0cmVlUHJvdmlkZXJNYXAuZ2V0KG5hbWVzcGFjZVVSSSk7Ci0gIC8vfQotCi0gIC8vcHVibGljIHZvaWQgcHV0RXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIoU3RyaW5nIG5hbWVzcGFjZVVSSSwgRXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXIgdHJlZVByb3ZpZGVyKQotICAvL3sKLSAgLy8gIHRyZWVQcm92aWRlck1hcC5wdXQobmFtZXNwYWNlVVJJLCB0cmVlUHJvdmlkZXIpOwotICAvL30KLSAgCi0gIHB1YmxpYyBMaXN0IGdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVnaXN0ZXJlZEV4dGVuc2lvbkxpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIFdTRExFZGl0b3JFeHRlbnNpb24gZ2V0QXBwbGljYWJsZUV4dGVuc2lvbihpbnQgdHlwZSwgT2JqZWN0IG9iamVjdCkKLSAgeyAKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uIHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFdTRExFZGl0b3JFeHRlbnNpb24gZXh0ZW5zaW9uID0gKFdTRExFZGl0b3JFeHRlbnNpb24paS5uZXh0KCk7Ci0gICAgICBpZiAoZXh0ZW5zaW9uLmlzRXh0ZW5zaW9uVHlwZVN1cHBvcnRlZCh0eXBlKSAmJiBleHRlbnNpb24uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7IAotICAgICAgICByZXN1bHQgPSBleHRlbnNpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgV1NETEVkaXRvckV4dGVuc2lvbltdIGdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKGludCB0eXBlKQotICB7IAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgV1NETEVkaXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoV1NETEVkaXRvckV4dGVuc2lvbilpLm5leHQoKTsKLSAgICAgIGlmIChleHRlbnNpb24uaXNFeHRlbnNpb25UeXBlU3VwcG9ydGVkKHR5cGUpKQotICAgICAgeyAKLSAgICAgICAgbGlzdC5hZGQoZXh0ZW5zaW9uKTsKLSAgICAgIH0KLSAgICB9IAotCi0gICAgV1NETEVkaXRvckV4dGVuc2lvbltdIHJlc3VsdCA9IG5ldyBXU0RMRWRpdG9yRXh0ZW5zaW9uW2xpc3Quc2l6ZSgpXTsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7IAotICAgICAgV1NETEVkaXRvckV4dGVuc2lvbiBleHRlbnNpb24gPSAoV1NETEVkaXRvckV4dGVuc2lvbilpLm5leHQoKTsKLSAgICAgIHJlc3VsdFtjb3VudF0gPSBleHRlbnNpb247Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLSAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgYWRkQXNGaXJzdChXU0RMRWRpdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbikKLSAgeyAgICAgICAgICAgICAgIAotICAgIGdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKCkuYWRkKDAsIGV4dGVuc2lvbik7Ci0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgYWRkKFdTRExFZGl0b3JFeHRlbnNpb24gZXh0ZW5zaW9uKQotICB7ICAgICAgICAgICAgICAgCi0gICAgZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoKS5hZGQoZXh0ZW5zaW9uKTsKLSAgfSAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBhZGQoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIFN0cmluZyBjbGFzc05hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciBkZWZlcmVkIGluc3RhbnRpYXRpb24gb2YgV1NETEVkaXRvckV4dGVuc2lvbnMgICAgICAgICAKLSAgICB0cnkKLSAgICB7ICAgICAgIAotICAgICAgQ2xhc3MgdGhlQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0gICAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChXU0RMRWRpdG9yRXh0ZW5zaW9uKXRoZUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICByZWdpc3RlcmVkRXh0ZW5zaW9uTGlzdC5hZGQoZXh0ZW5zaW9uKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL0V4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiZjBkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXI7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgCi17Ci0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250ZXh0KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSk7ICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9IdHRwRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL0h0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTI1OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL0h0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEh0dHBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIGltcGxlbWVudHMgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcgoteyAgCi0gIHB1YmxpYyBIdHRwRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcigpCi0gIHsKLSAgfSAgCQotCQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkQ29udGV4dChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQlpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJiaW5kaW5nIikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYmluZGluZyIpOyAJICAKLQl9CSAgCi0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJvcGVyYXRpb24iKTsgCi0JfQotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiaW5wdXQiKSB8fCAKLQkgICAgICAgICBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoIm91dHB1dCIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImJvZHkiKSB8fCAKLQkgICAgICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoImhlYWRlciIpOyAJICAKLQl9CQotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiZmF1bHQiKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJmYXVsdCIpOyAJICAKLQl9Ci0JZWxzZSBpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJwb3J0IikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiYWRkcmVzcyIpOyAJICAKLQl9CQotICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL01pbWVFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhNzAxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9maWx0ZXIvTWltZUV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE1pbWVFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyIGltcGxlbWVudHMgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcgoteyAgIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9OQU1FU1BBQ0VfVVJJPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIjsKLSAgcHVibGljIE1pbWVFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyKCkKLSAgewotICB9ICAJCi0JCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250ZXh0KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotICAgIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSA9IHBhcmVudEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lc3BhY2UgPSBwYXJlbnRFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCi0gIAlpZiAoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkuZXF1YWxzKHBhcmVudEVsZW1lbnROYW1lc3BhY2UpKQotICAJewotICAgIAlpZiAocGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJpbnB1dCIpIHx8IHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygib3V0cHV0IikpCi0gICAgCXsKLSAgICAJICAJcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiY29udGVudCIpIHx8Ci0JCQkJICAgICBsb2NhbE5hbWUuZXF1YWxzKCJtdWx0aXBhcnRSZWxhdGVkIikgfHwKLQkJCQkgICAgIGxvY2FsTmFtZS5lcXVhbHMoIm1pbWVYbWwiKTsgICAgCSAgCQotICAgIAl9Ci0gIAl9Ci0gIAllbHNlIGlmIChNSU1FX05BTUVTUEFDRV9VUkkuZXF1YWxzKHBhcmVudEVsZW1lbnROYW1lc3BhY2UpKQotICAJewotCQlyZXN1bHQgPSB0cnVlOwkJCQkKLSAgCX0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9Tb2FwRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1NvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZmU5NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1NvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmZpbHRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBTb2FwRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBpbXBsZW1lbnRzIEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIKLXsgICAKLSAgcHVibGljIFNvYXBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyKCkKLSAgewotICB9ICAJCi0JCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250ZXh0KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotICAgIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSA9IHBhcmVudEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygiYmluZGluZyIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImJpbmRpbmciKTsgCSAgCi0JfQkgIAotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygib3BlcmF0aW9uIikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygib3BlcmF0aW9uIik7IAotCX0KLQllbHNlIGlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImlucHV0IikgfHwgCi0JICAgICAgICAgcGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvdXRwdXQiKSkKLQl7Ci0JICByZXN1bHQgPSBsb2NhbE5hbWUuZXF1YWxzKCJib2R5IikgfHwgCi0JICAgICAgICAgICBsb2NhbE5hbWUuZXF1YWxzKCJoZWFkZXIiKTsgCSAgCi0JfQkKLQllbHNlIGlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImZhdWx0IikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygiZmF1bHQiKTsgCSAgCi0JfQotCWVsc2UgaWYgKHBhcmVudEVsZW1lbnROYW1lLmVxdWFscygicG9ydCIpKQotCXsKLQkgIHJlc3VsdCA9IGxvY2FsTmFtZS5lcXVhbHMoImFkZHJlc3MiKTsgCSAgCi0JfQkKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1hTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ZpbHRlci9YU0RFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZDNhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZmlsdGVyL1hTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZmlsdGVyOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFhTREV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyCi17ICAgCi0gIHB1YmxpYyBYU0RFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyKCkKLSAgewotICB9ICAJCi0JCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRDb250ZXh0KEVsZW1lbnQgcGFyZW50RWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUgPSBwYXJlbnRFbGVtZW50LmdldExvY2FsTmFtZSgpOwotCWlmIChwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoInR5cGVzIikpCi0JewotCSAgcmVzdWx0ID0gbG9jYWxOYW1lLmVxdWFscygic2NoZW1hIik7IAkgIAotCX0JICAJCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvSW50ZXJhY3RvckhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBhcnRzL0ludGVyYWN0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwOWMxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cGFydHMvSW50ZXJhY3RvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSW50ZXJhY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSUV4cGFuZGFibGU7Ci0KLSAgICAgICAgICAgICAgICAgCi0vLyBob29rcyB1cCBhbiBpbnRlcmFjdG9yIHdpdGggYW4gZWRpdCBwYXJ0IGFuZCB0aGUgZmlndXJlIHRoYXQgbmVlZHMgdG8gYmUgZXhwYW5kZWQgYW5kIGNvbGxhcHNlZAotLy8KLXB1YmxpYyBjbGFzcyBJbnRlcmFjdG9ySGVscGVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIG5lZWRUb1BlcmZvcm1EZWZhdWx0RXhwYW5zaW9uID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGVkaXRQYXJ0OyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgSW50ZXJhY3RvciBpbnRlcmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJRXhwYW5kYWJsZSBleHBhbmRhYmxlOwotCi0gIHB1YmxpYyBJbnRlcmFjdG9ySGVscGVyKEVkaXRQYXJ0IGVkaXRQYXJ0LCBJbnRlcmFjdG9yIGludGVyYWN0b3IsIElFeHBhbmRhYmxlIGV4cGFuZGFibGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsKLSAgICB0aGlzLmludGVyYWN0b3IgPSBpbnRlcmFjdG9yOwotICAgIHRoaXMuZXhwYW5kYWJsZSA9IGV4cGFuZGFibGU7Ci0gICAgaW50ZXJhY3Rvci5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotICAgIGV4cGFuZGFibGUuc2V0RXhwYW5kZWQoaW50ZXJhY3Rvci5pc0V4cGFuZGVkKCkpOwotICB9ICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoYm9vbGVhbiBpc0V4cGFuZGVkKQotICB7Ci0gICAgaW50ZXJhY3Rvci5zZXRFeHBhbmRlZChpc0V4cGFuZGVkKTsKLSAgICBpbnRlcmFjdG9yRXhwYW5zaW9uQ2hhbmdlZChpc0V4cGFuZGVkKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaW50ZXJhY3RvckV4cGFuc2lvbkNoYW5nZWQoYm9vbGVhbiBpc0ludGVyYWN0b3JFeHBhbmRlZCkKLSAgeyAKLSAgICBleHBhbmRhYmxlLnNldEV4cGFuZGVkKGlzSW50ZXJhY3RvckV4cGFuZGVkKTsKLSAgICBleHBhbmRhYmxlLnNldFZpc2libGUoaXNJbnRlcmFjdG9yRXhwYW5kZWQpOwotCi0gICAgZWRpdFBhcnQucmVmcmVzaCgpOwotCi0gICAgRWRpdFBhcnQgcm9vdCA9IGVkaXRQYXJ0LmdldFJvb3QoKTsKLSAgICBpZiAocm9vdCBpbnN0YW5jZW9mIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIElGaWd1cmUgcm9vdEZpZ3VyZSA9ICgoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClyb290KS5nZXRGaWd1cmUoKTsKLSAgICAgIGludmFsaWRhdGVBbGwocm9vdEZpZ3VyZSk7Ci0gICAgICByb290RmlndXJlLnZhbGlkYXRlKCk7Ci0gICAgICByb290RmlndXJlLnJlcGFpbnQoKTsKLSAgICB9ICAgICAgCi0gIH0KLQotICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGludmFsaWRhdGVBbGwoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgICBmaWd1cmUuaW52YWxpZGF0ZSgpOyAgIAotICAgIExheW91dE1hbmFnZXIgbWFuYWdlciA9IGZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gICAgaWYgKG1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBtYW5hZ2VyLmludmFsaWRhdGUoKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZmlndXJlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBpbnZhbGlkYXRlQWxsKGNoaWxkKTsKLSAgICB9Ci0gIH0gCi0gICAgIAotCi0gIC8vIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lcgotICAvLwotICBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrZWQoTW91c2VFdmVudCBtZSkgCi0gIHsgICAgICAKLSAgfQotIAotICBwdWJsaWMgdm9pZCBtb3VzZVByZXNzZWQoTW91c2VFdmVudCBtZSkKLSAgeyAgICAgIAotICAgIGJvb2xlYW4gbmV3RXhwYW5zaW9uU3RhdGUgPSAhaW50ZXJhY3Rvci5pc0V4cGFuZGVkKCk7Ci0gICAgaW50ZXJhY3Rvci5zZXRFeHBhbmRlZChuZXdFeHBhbnNpb25TdGF0ZSk7Ci0gICAgaW50ZXJhY3RvckV4cGFuc2lvbkNoYW5nZWQobmV3RXhwYW5zaW9uU3RhdGUpOwotICB9Ci0gCi0gIHB1YmxpYyB2b2lkIG1vdXNlUmVsZWFzZWQoTW91c2VFdmVudCBtZSkgIAotICB7IAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBhcnRzL011bHRpQ29udGVudFBhbmVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBhcnRzL011bHRpQ29udGVudFBhbmVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTUxNzlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwYXJ0cy9NdWx0aUNvbnRlbnRQYW5lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aUNvbnRlbnRQYW5lRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBJRmlndXJlW10gY29udGVudFBhbmVzOwotICBwcm90ZWN0ZWQgaW50W10gY29udGVudFBhbmVJbmRleEFkanVzdG1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJRmlndXJlW10gaW5pdENvbnRlbnRQYW5lcygpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBudWxsOwotICB9ICAgIAotCi0gIHByb3RlY3RlZCBpbnQgZ2V0Q29udGVudFBhbmUoT2JqZWN0IG1vZGVsKQotICB7ICAKLSAgICByZXR1cm4gMDsKLSAgfQotICAgIAotICBwcm90ZWN0ZWQgTGlzdCBzb3J0QnlDb250ZW50UGFuZShMaXN0IGxpc3QpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9ICAKLQotCi0gIHByb3RlY3RlZCB2b2lkIHNldEZpZ3VyZShJRmlndXJlIGZpZ3VyZSkKLSAgewotCSAgc3VwZXIuc2V0RmlndXJlKGZpZ3VyZSk7Ci0gICAgY29udGVudFBhbmVzID0gaW5pdENvbnRlbnRQYW5lcygpOyAgIAotICAgIGlmIChjb250ZW50UGFuZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb250ZW50UGFuZUluZGV4QWRqdXN0bWVudCA9IG5ldyBpbnRbY29udGVudFBhbmVzLmxlbmd0aF07Ci0gICAgfQotICB9ICAgICAgICAKLSAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudFBhbmVJbmZvSW5kZXhBZGp1c3RtZW50KExpc3QgbGlzdCkKLSAgeyAKLSAgICBpbnQgaW5kZXggPSAwOyAgCi0gICAgaW50IGxpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0KLSAgICBmb3IgKGludCAgaiA9IDA7IGogPCBjb250ZW50UGFuZXMubGVuZ3RoOyBqKyspCi0gICAgeyAKLSAgICAgIGNvbnRlbnRQYW5lSW5kZXhBZGp1c3RtZW50W2pdID0gaW5kZXg7Ci0gICAgICB3aGlsZSAoaW5kZXggPCBsaXN0U2l6ZSkKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICBPYmplY3QgbW9kZWwgPSBsaXN0LmdldChpbmRleCk7Ci0gICAgICAgIGlmIChnZXRDb250ZW50UGFuZShtb2RlbCkgIT0gaikKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGNvbnRlbnRQYW5lcyAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3Qgc29ydGVkTGlzdCA9IHNvcnRCeUNvbnRlbnRQYW5lKGdldE1vZGVsQ2hpbGRyZW4oKSk7Ci0gICAgICB1cGRhdGVDb250ZW50UGFuZUluZm9JbmRleEFkanVzdG1lbnQoc29ydGVkTGlzdCk7Ci0gICAgfQotICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KQotICB7ICAgICAgICAgICAgICAgIAotICAgIGlmIChjb250ZW50UGFuZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaiA9IGdldENvbnRlbnRQYW5lKGNoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0gICAgICBpZiAoY29udGVudFBhbmVJbmRleEFkanVzdG1lbnQubGVuZ3RoID4gaikKLSAgICAgIHsKLSAgICAgICAgaW50IGFkanVzdGVkSW5kZXggPSBpbmRleCAtIGNvbnRlbnRQYW5lSW5kZXhBZGp1c3RtZW50W2pdOwotICAgICAgICBpZiAoYWRqdXN0ZWRJbmRleCA+PSAwKQotICAgICAgICB7Ci0gIAkgICAgICBJRmlndXJlIGNoaWxkID0gKChHcmFwaGljYWxFZGl0UGFydCljaGlsZEVkaXRQYXJ0KS5nZXRGaWd1cmUoKTsKLSAgCSAgICAgIGNvbnRlbnRQYW5lc1tqXS5hZGQoY2hpbGQsIGFkanVzdGVkSW5kZXgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIGluZGV4KTsKLSAgICB9Ci0gIH0KLQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoY29udGVudFBhbmVzICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGogPSBnZXRDb250ZW50UGFuZShjaGlsZEVkaXRQYXJ0LmdldE1vZGVsKCkpOwotICAgICAgSUZpZ3VyZSBjaGlsZCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpY2hpbGRFZGl0UGFydCkuZ2V0RmlndXJlKCk7Ci0gICAgICBjb250ZW50UGFuZXNbal0ucmVtb3ZlKGNoaWxkKTsgIAotICAgIH0gICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlb3JkZXJDaGlsZChFZGl0UGFydCBlZGl0cGFydCwgaW50IGluZGV4KQotICB7Ci0gICAgcmVtb3ZlQ2hpbGRWaXN1YWwoZWRpdHBhcnQpOwotICAgIExpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotICAgIGNoaWxkcmVuLnJlbW92ZShlZGl0cGFydCk7Ci0gICAgY2hpbGRyZW4uYWRkKGluZGV4LCBlZGl0cGFydCk7Ci0gICAgYWRkQ2hpbGRWaXN1YWwoZWRpdHBhcnQsIGluZGV4KTsKLSAgfQotfSAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBvbGljaWVzL0lEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2VkaXRwb2xpY2llcy9JRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTg0ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBvbGljaWVzL0lEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBvbGljaWVzOwotICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIElEaXJlY3RFZGl0UG9saWN5RGVsZWdhdGUKLXsgICAgICAgCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KENlbGxFZGl0b3IgY2VsbEVkaXRvcik7ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cG9saWNpZXMvVGV4dENlbGxFZGl0b3JNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9lZGl0cG9saWNpZXMvVGV4dENlbGxFZGl0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWM3MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZWRpdHBvbGljaWVzL1RleHRDZWxsRWRpdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cG9saWNpZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGV4dENlbGxFZGl0b3JNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgaW1wbGVtZW50cyBJRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlCi17Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgVGV4dENlbGxFZGl0b3JNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwJTGFiZWwgbGFiZWwpCi0gIHsKLQkgIHN1cGVyKHNvdXJjZSwgVGV4dENlbGxFZGl0b3IuY2xhc3MsIG5ldyBJbnRlcm5hbENlbGxFZGl0b3JMb2NhdG9yKGxhYmVsKSk7Ci0gICAgdGhpcy5sYWJlbCA9IGxhYmVsOyAgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIAlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGxhYmVsLmdldFRleHQoKTsKLSAgCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLSAgCVRleHQgdGV4dCA9IChUZXh0KWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0gIAl0ZXh0LnNldEZvbnQobGFiZWwuZ2V0Rm9udCgpKTsKLSAgICB0ZXh0LnNldEZvcmVncm91bmQobGFiZWwuZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotICAgIHRleHQuc2V0QmFja2dyb3VuZChsYWJlbC5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gIAl0ZXh0LnNlbGVjdEFsbCgpOwotICB9CSAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtTW9kaWZ5KFN0cmluZyB2YWx1ZSk7Ci0gICAgCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0KLSAgICBwdWJsaWMgSW50ZXJuYWxDZWxsRWRpdG9yTG9jYXRvcihMYWJlbCBsYWJlbCkKLSAgICB7Ci0gICAgICB0aGlzLmxhYmVsID0gbGFiZWw7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgCi0gICAgewotICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpY2VsbGVkaXRvci5nZXRDb250cm9sKCk7ICAKLQkgICAgUG9pbnQgc2VsID0gdGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkgICAgUG9pbnQgcHJlZiA9IHRleHQuY29tcHV0ZVNpemUoLTEsIC0xKTsKLQkgICAgUmVjdGFuZ2xlIHJlY3QgPSBsYWJlbC5nZXRUZXh0Qm91bmRzKCkuZ2V0Q29weSgpOwotCSAgICBsYWJlbC50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCSAgICB0ZXh0LnNldEJvdW5kcyhyZWN0LngtNCwgcmVjdC55LTEsIHByZWYueCsxLCBwcmVmLnkrMSk7CQotCSAgICB0ZXh0LnNldFNlbGVjdGlvbigwKTsKLQkgICAgdGV4dC5zZXRTZWxlY3Rpb24oc2VsKTsgCi0gICAgfQotICB9ICAgIAotCi0gIC8vIGltcGxlbWVudHMgRGlyZWN0RWRpdFBvbGljeURlbGVnYXRlCi0gIC8vIAotICBwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdChDZWxsRWRpdG9yIGNlbGxFZGl0b3IpCi0gIHsKLSAgICBwZXJmb3JtTW9kaWZ5KChTdHJpbmcpY2VsbEVkaXRvci5nZXRWYWx1ZSgpKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvQ2VudGVyTGF5b3V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9nZWYvdXRpbC9maWd1cmVzL0NlbnRlckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE5Zjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvQ2VudGVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotCi0vKioKLSAqIEZpZ3VyZXMgdXNpbmcgdGhlIFN0YWNrTGF5b3V0IGFzIHRoZWlyIGxheW91dCBtYW5hZ2VyIGhhdmUKLSAqIHRoZWlyIGNoaWxkcmVuIHBsYWNlZCBvbiB0b3Agb2Ygb25lIGFub3RoZXIuIE9yZGVyIG9mIAotICogcGxhY2VtZW50IGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBjaGlsZHJlbgotICogd2VyZSBhZGRlZCwgZmlyc3QgY2hpbGQgYWRkZWQgcGxhY2VkIG9uIHRoZSBib3R0b20uCi0gKi8KLXB1YmxpYyBjbGFzcyBDZW50ZXJMYXlvdXQJZXh0ZW5kcyBBYnN0cmFjdExheW91dAoteyAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05NRU5UX1RPUCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSUdOTUVOVF9DRU5URVIgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTk1FTlRfQk9UVE9NID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgaW50IHNwYWNpbmc7Ci0gIHByb3RlY3RlZCBpbnQgdmVydGljYWxBbGlnbm1lbnQgPSBBTElHTk1FTlRfQ0VOVEVSOwotICAKLSAgcHVibGljIENlbnRlckxheW91dCgpe30KLSAgcHVibGljIENlbnRlckxheW91dChpbnQgc3BhY2luZyl7IHRoaXMuc3BhY2luZyA9IHNwYWNpbmc7IH0KLSAgCi0gCi0gIC8qKgotICAgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBwcmVmZXJyZWQgc2l6ZSBvZiB0aGUgaW5wdXQgY29udGFpbmVyLgotICAgKiBUaGlzIGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGNoaWxkIG9mIHRoZSBjb250YWluZXIsIGFzIGFsbAotICAgKiBvdGhlciBjaGlsZHJlbiBmaXQgaW50byB0aGlzIHNpemUuCi0gICAqCi0gICAqIEBwYXJhbSBmaWd1cmUgIENvbnRhaW5lciBmaWd1cmUgZm9yIHdoaWNoIHByZWZlcnJlZCBzaXplIGlzIHJlcXVpcmVkLgotICAgKiBAcmV0dXJuICBUaGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGlucHV0IGZpZ3VyZS4KLSAgICogQHNpbmNlIDIuMAotICAgKi8KLS8vICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUpCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShJRmlndXJlIGZpZ3VyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICB7Ci0gIAlEaW1lbnNpb24gZCA9IGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKGZpZ3VyZSk7Ci0vLyAgCWQuZXhwYW5kKGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRXaWR0aCgpLAotLy8gIAkgICAgICAgICBmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCkpOwotICAgIGQuZXhwYW5kKHdpZHRoLCBoZWlnaHQpOwotICAJZC51bmlvbihnZXRCb3JkZXJQcmVmZXJyZWRTaXplKGZpZ3VyZSkpOwotICAJcmV0dXJuIGQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBEaW1lbnNpb24gY2FsY3VsYXRlUHJlZmVycmVkQ2xpZW50QXJlYVNpemUoSUZpZ3VyZSBmaWd1cmUpCi0gIHsKLSAgCURpbWVuc2lvbiBkID0gbmV3IERpbWVuc2lvbigpOwotICAJTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotICAJZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gIAkJSUZpZ3VyZSBjaGlsZCA9IChJRmlndXJlKWkubmV4dCgpOwotICAgICAgRGltZW5zaW9uIGNoaWxkU2l6ZSA9IGNoaWxkLmdldFByZWZlcnJlZFNpemUoKTsKLSAgICAgIGQuaGVpZ2h0ICs9IGNoaWxkU2l6ZS5oZWlnaHQ7Ci0gICAgICBkLndpZHRoID0gTWF0aC5tYXgoY2hpbGRTaXplLndpZHRoLCBkLndpZHRoKTsKLSAgCX0JICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgY2hpbGRyZW5TaXplID0gY2hpbGRyZW4uc2l6ZSgpOyAgICAgICAKLSAgICBpZiAoY2hpbGRyZW5TaXplID4gMCkKLSAgICB7Ci0gICAgICBkLmhlaWdodCArPSBzcGFjaW5nICogY2hpbGRyZW4uc2l6ZSgpIC0gMTsKLSAgICB9Ci0gIAlyZXR1cm4gZDsKLSAgfQotICAKLSAgLyoKLSAgICogUmV0dXJucyB0aGUgbWluaW11bSBzaXplIHJlcXVpcmVkIGJ5IHRoZSBpbnB1dCBjb250YWluZXIuCi0gICAqIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgY2hpbGQgb2YgdGhlIGNvbnRhaW5lciwgYXMgYWxsCi0gICAqIG90aGVyIGNoaWxkcmVuIGZpdCBpbnRvIHRoaXMgc2l6ZS4KLSAgICovCi0gIC8vIFRPRE8gR0VGIFBPUlQKLSAgcHVibGljIERpbWVuc2lvbiBnZXRNaW5pbXVtU2l6ZShJRmlndXJlIGZpZ3VyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICB7Ci0gIAlEaW1lbnNpb24gZCA9IG5ldyBEaW1lbnNpb24oKTsKLSAgCUxpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgCUlGaWd1cmUgY2hpbGQ7Ci0gIAlmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykKLSAgICB7Ci0gIAkJY2hpbGQgPSAoSUZpZ3VyZSljaGlsZHJlbi5nZXQoaSk7Ci0gIAkJZC51bmlvbihjaGlsZC5nZXRNaW5pbXVtU2l6ZSgpKTsKLSAgCX0KLSAgCWQuZXhwYW5kKGZpZ3VyZS5nZXRJbnNldHMoKS5nZXRXaWR0aCgpLCBmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0SGVpZ2h0KCkpOwotICAJcmV0dXJuIGQ7Ci0gIH0KLSAgLy8gVE9ETyBHRUYgUE9SVAotICBwdWJsaWMgRGltZW5zaW9uIGdldFByZWZlcnJlZFNpemUoSUZpZ3VyZSBmaWd1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgewotICAJcmV0dXJuIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoZmlndXJlLCBmaWd1cmUuZ2V0SW5zZXRzKCkuZ2V0V2lkdGgoKSwgZmlndXJlLmdldEluc2V0cygpLmdldEhlaWdodCgpKTsKLSAgfQotICAKLSAgCi0gIHB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGZpZ3VyZSkKLSAgewotICAJUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Q2xpZW50QXJlYSgpOwotICAJTGlzdCBjaGlsZHJlbiA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotICAgIAotICAgIERpbWVuc2lvbiBwcmVmZXJyZWRDbGllbnRBcmVhU2l6ZSA9IGNhbGN1bGF0ZVByZWZlcnJlZENsaWVudEFyZWFTaXplKGZpZ3VyZSk7Ci0gIAotICAgIGludCB4ID0gci54ICsgKHIud2lkdGggLSBwcmVmZXJyZWRDbGllbnRBcmVhU2l6ZS53aWR0aCkgLyAyOwotICAgIGludCB5ID0gMDsKLSAgCi0gICAgc3dpdGNoIChnZXRWZXJ0aWNhbEFsaWdubWVudCgpKQotICAgIHsKLSAgICAgIGNhc2UgQUxJR05NRU5UX1RPUCA6ICAKLSAgICAgIHsKLSAgICAgICAgeSA9IHIueTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEFMSUdOTUVOVF9DRU5URVIgOgotICAgICAgewotICAgICAgICB5ID0gci55ICsgKHIuaGVpZ2h0IC0gcHJlZmVycmVkQ2xpZW50QXJlYVNpemUuaGVpZ2h0KSAvIDI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBBTElHTk1FTlRfQk9UVE9NIDoKLSAgICAgIHsKLSAgICAgICAgeSA9IHIueSArIChyLmhlaWdodCAtIHByZWZlcnJlZENsaWVudEFyZWFTaXplLmhlaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAgICAgCi0gIAlmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgCQlJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBEaW1lbnNpb24gY2hpbGRTaXplID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZSgpOwotICAJCWNoaWxkLnNldEJvdW5kcyhuZXcgUmVjdGFuZ2xlKHgsIHksIGNoaWxkU2l6ZS53aWR0aCwgY2hpbGRTaXplLmhlaWdodCkpOwotICAgICAgeSArPSBjaGlsZFNpemUuaGVpZ2h0ICsgc3BhY2luZzsKLSAgCX0KLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSB2ZXJ0aWNhbEFsaWdubWVudCBUaGUgdmVydGljYWxBbGlnbm1lbnQgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmVydGljYWxBbGlnbm1lbnQoaW50IHZlcnRpY2FsQWxpZ25tZW50KQotICB7Ci0gICAgdGhpcy52ZXJ0aWNhbEFsaWdubWVudCA9IHZlcnRpY2FsQWxpZ25tZW50OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgaW50IGdldFZlcnRpY2FsQWxpZ25tZW50KCkKLSAgewotICAgIHJldHVybiB2ZXJ0aWNhbEFsaWdubWVudDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSUdyYXBoTm9kZUZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9JR3JhcGhOb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOWQ4NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9JR3JhcGhOb2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXM7Ci0gICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElHcmFwaE5vZGVGaWd1cmUgZXh0ZW5kcyBJRmlndXJlCi17ICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBfQ09OTkVDVElPTiA9IDE7IAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET1dOX0NPTk5FQ1RJT04gPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUZUX0NPTk5FQ1RJT04gPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9DT05ORUNUSU9OID0gNDsKLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRTZWxlY3Rpb25GaWd1cmUoKTsKLSAgcHVibGljIElGaWd1cmUgZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpOwotICBwdWJsaWMgTGlzdCBnZXRDb25uZWN0ZWRGaWd1cmVzKGludCB0eXBlKTsKLSAgcHVibGljIGludCBnZXRDb25uZWN0aW9uVHlwZSgpOyAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRDb25uZWN0ZWRGaWd1cmUoSUdyYXBoTm9kZUZpZ3VyZSBmaWd1cmUpOwotICBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0ZWRGaWd1cmUoSUdyYXBoTm9kZUZpZ3VyZSBmaWd1cmUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvSW50ZXJhY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9JbnRlcmFjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjdjMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9JbnRlcmFjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXM7Ci0gICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogSW50ZXJhY3RvciB0aGUgKy8tIGNvbnRyb2wgY29tbW9ubHkgZm91bmQgaW4gdHJlZXMKLSAqLwotcHVibGljIGNsYXNzIEludGVyYWN0b3IgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHBhbmRlZDsKLQotICBwdWJsaWMgSW50ZXJhY3RvcigpCi0gIHsKLSAgICBzdXBlcigpOyAKLSAgICBzZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oOSwgOSkpOyAgICAgICAgICAgICAgIAotICB9ICAKLQotICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGlzRXhwYW5kZWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuaXNFeHBhbmRlZCA9IGlzRXhwYW5kZWQ7Ci0gICAgcmVwYWludCgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNFeHBhbmRlZCgpCi0gIHsKLSAgICByZXR1cm4gaXNFeHBhbmRlZDsKLSAgfQotICAgIAotICBwcm90ZWN0ZWQgdm9pZCBmaWxsU2hhcGUoR3JhcGhpY3MgZykKLSAgewotICAgIHN1cGVyLmZpbGxTaGFwZShnKTsKLSAgICBSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IG14ID0gci54ICsgci53aWR0aCAvIDI7Ci0gICAgaW50IG15ID0gci55ICsgci5oZWlnaHQgLyAyOyAgICAKLSAgICBpbnQgcyA9IDI7ICAgICAgIAotICAgIGcuZHJhd0xpbmUoci54ICsgcywgbXksIHIueCArIHIud2lkdGggLSBzIC0gMSwgbXkpOyAKLSAgICBpZiAoIWlzRXhwYW5kZWQpCi0gICAgewotICAgICAgZy5kcmF3TGluZShteCwgci55ICsgcywgbXgsIHIueSArIHIuaGVpZ2h0IC0gcyAtMSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ2VmL3V0aWwvZmlndXJlcy9Sb3VuZGVkTGluZUJvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWJmYWQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dlZi91dGlsL2ZpZ3VyZXMvUm91bmRlZExpbmVCb3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlczsKLSAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotcHVibGljIGNsYXNzIFJvdW5kZWRMaW5lQm9yZGVyIGV4dGVuZHMgTGluZUJvcmRlcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgaW50IGFyY0xlbmd0aDsgICAKLSAgcHJvdGVjdGVkIGludCBsaW5lU3R5bGUgPSBHcmFwaGljcy5MSU5FX1NPTElEOwotCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihDb2xvciBjLCBpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgpCi0gIHsKLQkgIHN1cGVyKGMsIHdpZHRoKTsgICAgIAotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICB9Ci0KLSAgcHVibGljIFJvdW5kZWRMaW5lQm9yZGVyKGludCB3aWR0aCwgaW50IGFyY0xlbmd0aCkKLSAgewotCSAgc3VwZXIod2lkdGgpOyAgICAgCi0gICAgdGhpcy5hcmNMZW5ndGggPSBhcmNMZW5ndGg7Ci0gIH0KLSAgCi0gIHB1YmxpYyBSb3VuZGVkTGluZUJvcmRlcihDb2xvciBjLCBpbnQgd2lkdGgsIGludCBhcmNMZW5ndGgsIGludCBsaW5lU3R5bGUpCi0gIHsKLSAgICBzdXBlcihjLCB3aWR0aCk7Ci0gICAgdGhpcy5hcmNMZW5ndGggPSBhcmNMZW5ndGg7Ci0gICAgdGhpcy5saW5lU3R5bGUgPSBsaW5lU3R5bGU7Ci0gIH0KLQotICBwdWJsaWMgUm91bmRlZExpbmVCb3JkZXIoaW50IHdpZHRoLCBpbnQgYXJjTGVuZ3RoLCBpbnQgbGluZVN0eWxlKQotICB7Ci0gICAgc3VwZXIod2lkdGgpOwotICAgIHRoaXMuYXJjTGVuZ3RoID0gYXJjTGVuZ3RoOwotICAgIHRoaXMubGluZVN0eWxlID0gbGluZVN0eWxlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFpbnQoSUZpZ3VyZSBmaWd1cmUsIEdyYXBoaWNzIGdyYXBoaWNzLCBJbnNldHMgaW5zZXRzKQotICB7Ci0JICB0ZW1wUmVjdC5zZXRCb3VuZHMoZ2V0UGFpbnRSZWN0YW5nbGUoZmlndXJlLCBpbnNldHMpKTsKLSAgICBpbnQgd2lkdGggPSBnZXRXaWR0aCgpOwotICAgIENvbG9yIGNvbG9yID0gZ2V0Q29sb3IoKTsKLSAgCWlmICh3aWR0aCUyID09IDEpCi0gICAgewotCQkgIHRlbXBSZWN0LndpZHRoLS07Ci0JCSAgdGVtcFJlY3QuaGVpZ2h0LS07Ci0JICB9Ci0JICB0ZW1wUmVjdC5zaHJpbmsod2lkdGgvMix3aWR0aC8yKTsKLQkgIGdyYXBoaWNzLnNldExpbmVXaWR0aCh3aWR0aCk7Ci0gICAgZ3JhcGhpY3Muc2V0TGluZVN0eWxlKGxpbmVTdHlsZSk7Ci0JICBpZiAoY29sb3IgIT0gbnVsbCkKLQkJICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCSAgZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdGFuZ2xlKHRlbXBSZWN0LCBhcmNMZW5ndGgsIGFyY0xlbmd0aCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0ZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvRmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjFkZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvRmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJhbmdlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLXB1YmxpYyBjbGFzcyBGaWd1cmVDYW52YXNLZXlib2FyZEhhbmRsZXIgZXh0ZW5kcyBLZXlBZGFwdGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhfU0NST0xMX0lOQ1JFTUVOVCA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZfU0NST0xMX0lOQ1JFTUVOVCA9IDMwOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgRmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyLgotICAgKi8KLSAgcHVibGljIEZpZ3VyZUNhbnZhc0tleWJvYXJkSGFuZGxlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICB7Ci0gICAgV2lkZ2V0IHcgPSBlLndpZGdldDsKLSAgICBpZiAodyBpbnN0YW5jZW9mIEZpZ3VyZUNhbnZhcykKLSAgICB7Ci0gICAgICBwcm9jZXNzS2V5KGUua2V5Q29kZSwgKEZpZ3VyZUNhbnZhcyl3KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHJvY2Vzc0tleShpbnQga2V5Q29kZSwgRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcykKLSAgewotICAgIHN3aXRjaCAoa2V5Q29kZSkKLSAgICB7Ci0gICAgICBjYXNlIFNXVC5BUlJPV19ET1dOIDoKLSAgICAgICAgc2Nyb2xsVmVydGljYWwoZmlndXJlQ2FudmFzLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTV1QuQVJST1dfVVAgOgotICAgICAgICBzY3JvbGxWZXJ0aWNhbChmaWd1cmVDYW52YXMsIHRydWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULkFSUk9XX0xFRlQgOgotICAgICAgICBzY3JvbGxIb3Jpem9udGFsKGZpZ3VyZUNhbnZhcywgdHJ1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTV1QuQVJST1dfUklHSFQgOgotICAgICAgICBzY3JvbGxIb3Jpem9udGFsKGZpZ3VyZUNhbnZhcywgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1dULlBBR0VfVVAgOgotICAgICAgICBzY3JvbGxQYWdlKGZpZ3VyZUNhbnZhcywgdHJ1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTV1QuUEFHRV9ET1dOIDoKLSAgICAgICAgc2Nyb2xsUGFnZShmaWd1cmVDYW52YXMsIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KFJhbmdlTW9kZWwgbW9kZWwsIGludCB2YWx1ZSkKLSAgewotICAgIHZhbHVlID0gTWF0aC5tYXgobW9kZWwuZ2V0TWluaW11bSgpLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIE1hdGgubWluKG1vZGVsLmdldE1heGltdW0oKSAtIG1vZGVsLmdldEV4dGVudCgpLCB2YWx1ZSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2Nyb2xsVmVydGljYWwoRmlndXJlQ2FudmFzIGZpZ3VyZUNhbnZhcywgYm9vbGVhbiB1cCkKLSAgewotICAgIFBvaW50IGxvY2F0aW9uID0gZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0Vmlld0xvY2F0aW9uKCk7Ci0gICAgaW50IHZPZmZzZXQgPSB1cCA/IC1WX1NDUk9MTF9JTkNSRU1FTlQgOiBWX1NDUk9MTF9JTkNSRU1FTlQ7Ci0gICAgaW50IHggPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0SG9yaXpvbnRhbFJhbmdlTW9kZWwoKSwgbG9jYXRpb24ueCk7Ci0gICAgaW50IHkgPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0VmVydGljYWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLnkgKyB2T2Zmc2V0KTsKLSAgICBmaWd1cmVDYW52YXMuc2Nyb2xsU21vb3RoVG8oeCwgeSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2Nyb2xsSG9yaXpvbnRhbChGaWd1cmVDYW52YXMgZmlndXJlQ2FudmFzLCBib29sZWFuIGxlZnQpCi0gIHsKLSAgICBQb2ludCBsb2NhdGlvbiA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZpZXdMb2NhdGlvbigpOwotICAgIGludCBoT2Zmc2V0ID0gbGVmdCA/IC1IX1NDUk9MTF9JTkNSRU1FTlQgOiBIX1NDUk9MTF9JTkNSRU1FTlQ7Ci0gICAgaW50IHggPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0SG9yaXpvbnRhbFJhbmdlTW9kZWwoKSwgbG9jYXRpb24ueCArIGhPZmZzZXQpOwotICAgIGludCB5ID0gdmVyaWZ5U2Nyb2xsQmFyT2Zmc2V0KGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLCBsb2NhdGlvbi55KTsKLSAgICBmaWd1cmVDYW52YXMuc2Nyb2xsU21vb3RoVG8oeCwgeSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2Nyb2xsUGFnZShGaWd1cmVDYW52YXMgZmlndXJlQ2FudmFzLCBib29sZWFuIHVwKQotICB7Ci0gICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBmaWd1cmVDYW52YXMuZ2V0Q2xpZW50QXJlYSgpOwotICAgIGludCBpbmNyZW1lbnQgPSB1cCA/IC1jbGllbnRBcmVhLmhlaWdodCA6IGNsaWVudEFyZWEuaGVpZ2h0OwotICAgIFBvaW50IGxvY2F0aW9uID0gZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0Vmlld0xvY2F0aW9uKCk7Ci0gICAgaW50IHggPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0SG9yaXpvbnRhbFJhbmdlTW9kZWwoKSwgbG9jYXRpb24ueCk7Ci0gICAgaW50IHkgPSB2ZXJpZnlTY3JvbGxCYXJPZmZzZXQoZmlndXJlQ2FudmFzLmdldFZpZXdwb3J0KCkuZ2V0VmVydGljYWxSYW5nZU1vZGVsKCksIGxvY2F0aW9uLnkgKyBpbmNyZW1lbnQpOwotICAgIGZpZ3VyZUNhbnZhcy5zY3JvbGxTbW9vdGhUbyh4LCB5KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvR3JhcGhWaWV3VG9vbEJhci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvR3JhcGhWaWV3VG9vbEJhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGVjMmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoVmlld1Rvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci0KLSAKLXB1YmxpYyBjbGFzcyBHcmFwaFZpZXdUb29sQmFyIGV4dGVuZHMgVmlld0Zvcm0KLXsKLSAgICBUb29sQmFyIGdyYXBoVG9vbEJhcjsgIC8vIHRoZSB0b29sYmFyIGF0IHRoZSB0b3Agb2YgdGhlIGdyYXBoIHZpZXcKLSAgICAvL1Rvb2xJdGVtIHRvb2xJdGVtOyAgIC8vIHRoZSB2aWV3IHRvb2wgaXRlbQotICAgIENvbXBvc2l0ZSBmcmFtZUJhcjsgIC8vIFRoZSBjb21wb3NpdGUgdGhhdCBjb250YWlucyB0aGUgdG9vbGJhcgotICAgIFdTRExFZGl0b3IgZWRpdG9yOyAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgVG9vbEl0ZW0gc2hvd0JpbmRpbmdzQnV0dG9uOyAgIC8vIHRoZSB2aWV3IHRvb2wgaXRlbSAgIAotICAgIFRvb2xJdGVtIGJhY2tCdXR0b247Ci0KLSAgICBwdWJsaWMgR3JhcGhWaWV3VG9vbEJhcihXU0RMRWRpdG9yIHdzZGxFZGl0b3IsIENvbXBvc2l0ZSBjLCBpbnQgc3R5bGUpCi0gICAgewotICAgICAgc3VwZXIoYywgc3R5bGUpOwotICAgICAgdGhpcy5lZGl0b3IgPSB3c2RsRWRpdG9yOwotICAgICAgZnJhbWVCYXIgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgIC8qCi0gICAgICBDTGFiZWwgbGFiZWwgPSBuZXcgQ0xhYmVsKGZyYW1lQmFyLCBTV1QuTk9ORSk7Ci0gICAgICBsYWJlbC5zZXRUZXh0KCJWaWV3IDoiKTsKLSAgICAgICovCi0gICAgICBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQgZnJhbWVMYXlvdXQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0KCk7Ci0gICAgICBmcmFtZUxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgIGZyYW1lTGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLSAgICAgIGZyYW1lTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICAgIGZyYW1lTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7ICAgICAKLQotICAgICAgZnJhbWVCYXIuc2V0TGF5b3V0KGZyYW1lTGF5b3V0KTsKLSAgICAgIAotICAgICAgZ3JhcGhUb29sQmFyID0gbmV3IFRvb2xCYXIoZnJhbWVCYXIsIFNXVC5GTEFUKTsKLSAgICAgIGdyYXBoVG9vbEJhci5hZGRUcmF2ZXJzZUxpc3RlbmVyKG5ldyBUcmF2ZXJzZUxpc3RlbmVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQga2V5VHJhdmVyc2VkKFRyYXZlcnNlRXZlbnQgZSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChlLmRldGFpbCA9PSBTV1QuVFJBVkVSU0VfTU5FTU9OSUMpCi0gICAgICAgICAgIGUuZG9pdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgICAgICAgICAgCi0KLSAgICAgIGJhY2tCdXR0b24gPSBuZXcgVG9vbEl0ZW0oZ3JhcGhUb29sQmFyLCBTV1QuUFVTSCk7Ci0gICAgICBiYWNrQnV0dG9uLnNldEltYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYmFjay5naWYiKSk7Ci0gICAgICAvLyBiYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JBQ0tfVE8iLCAiRGVmaW5pdGlvbiIpKTsKLSAgICAgIGJhY2tCdXR0b24uc2V0VG9vbFRpcFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQkFDSyIpKTsKLSAgICAgIGJhY2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICBiYWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXIoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IG9iamVjdCA9IGVkaXRvci5nZXRHcmFwaFZpZXdlcigpLmdldENvbXBvbmVudFZpZXdlcigpLmdldElucHV0KCk7Ci0gICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRJbnB1dChlZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gTmVlZCB0byBjb21tb24gdGhpcyB1cCB3aXRoIHhzZGVkaXRvcidzIEJhY2tBY3Rpb24gY29kZQotICAgICAgICAgICAgWFNEU2NoZW1hIHhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZmxhZyA9IHRydWU7Ci0gICAgICAgICAgICB3aGlsZSAoZmxhZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTGlzdCBsaXN0ID0geHNkU2NoZW1hLmdldFJlZmVyZW5jaW5nRGlyZWN0aXZlcygpOwotICAgICAgICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNEU2NoZW1hRGlyZWN0aXZlIHhzZFNjaGVtYURpcmVjdGl2ZSA9IChYU0RTY2hlbWFEaXJlY3RpdmUpbGlzdC5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHhzZFNjaGVtYURpcmVjdGl2ZS5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHhzZFNjaGVtYSA9IHhzZFNjaGVtYURpcmVjdGl2ZS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVkaXRvci5nZXRHcmFwaFZpZXdlcigpLnNldElucHV0KHhzZFNjaGVtYSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlZGl0b3IuZ2V0R3JhcGhWaWV3ZXIoKS5zZXRJbnB1dChlZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOyAKLQotICAgICAgLy8gaGFjayB0byBtYWtlIHRoZSBidXR0b24gbG9vayBsaWtlIGEgdG9nZ2xlIGJ1dHRvbi4gIFNXVC5UT0dHTEUgaXMgbm90IGFuIGFsbG93ZWQgc3R5bGUKLSAgICAgIC8vIGZvciBhIFRvb2xJdGVtLCBidXQgU1dULlJBRElPIGlzLiAgU1dULlJBRElPIG1ha2VzIGl0IGxvb2sgbGlrZSBhIHRvZ2dsZS4uLi4uLi4KLSAgICAgIHNob3dCaW5kaW5nc0J1dHRvbiA9IG5ldyBUb29sSXRlbShncmFwaFRvb2xCYXIsIFNXVC5SQURJTyk7Ci0gICAgICBzaG93QmluZGluZ3NCdXR0b24uc2V0SW1hZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9oaWRlYmluZGluZy5naWYiKSk7Ci0gICAgICBzaG93QmluZGluZ3NCdXR0b24uc2V0VG9vbFRpcFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfSElERV9CSU5ESU5HUyIpKTsgCi0gICAgICBzaG93QmluZGluZ3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgICB7Ci0gICAgICAJcHJpdmF0ZSBib29sZWFuIGN1cnJlbnRseVNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAJCi0gICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBWaWV3TW9kZSB2bSA9IFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldFZpZXdNb2RlKChEZWZpbml0aW9uKWVkaXRvci5nZXREZWZpbml0aW9uKCkpOwotICAgICAgICAgIHZtLnNldEJpbmRpbmdWaXNpYmxlKCF2bS5pc0JpbmRpbmdWaXNpYmxlKCkpOwotICAgICAgICAgIAotICAgICAgICAgIC8vIGhhY2sgdG8gbWFrZSB0aGUgYnV0dG9uIGxvb2sgbGlrZSBhIHRvZ2dsZSBidXR0b24KLSAgICAgICAgICBUb29sSXRlbSBpdGVtID0gKFRvb2xJdGVtKSBlLndpZGdldDsKLSAgICAgICAgICBpZiAoY3VycmVudGx5U2VsZWN0ZWQpIHsKLSAgICAgICAgICAJaXRlbS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgIAljdXJyZW50bHlTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAJY3VycmVudGx5U2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7IAotCi0gICAgICBzZXRUb3BMZWZ0KGZyYW1lQmFyKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0QmFja0J1dHRvbkVuYWJsZWQoYm9vbGVhbiBzdGF0ZSkKLSAgICB7Ci0gICAgICBiYWNrQnV0dG9uLnNldEVuYWJsZWQoc3RhdGUpOwotICAgIH0KLQotICAgIAotLy8gICAgcHVibGljIHZvaWQgdXBkYXRlSG92ZXJIZWxwKE9iamVjdCBvYmplY3QpCi0vLyAgICB7Ci0vLyAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpCi0vLyAgICAgIHsKLS8vICAgICAgICBiYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JBQ0tfVE8iLCAiRGVmaW5pdGlvbiIpKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLS8vICAgICAgewotLy8gICAgICAgIGJhY2tCdXR0b24uc2V0VG9vbFRpcFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQkFDS19UTyIsICJYTUwgU2NoZW1hIikpOwotLy8gICAgICB9Ci0vLyAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvR3JhcGhpY3NDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL0dyYXBoaWNzQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzBlYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvR3JhcGhpY3NDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gb2YgY29sb3IgYW5kIGZvbnQgcmVsYXRlZCBjb25zdGFudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhpY3NDb25zdGFudHMgCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZ3JvdXBCb3JkZXJDb2xvciAgICAgICAgPSBuZXcgQ29sb3IobnVsbCwgMTE4LCAxMzQsIDE2NCk7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZ3JvdXBIZWFkZXJDb2xvciAgICAgICAgPSBuZXcgQ29sb3IobnVsbCwgMjMyLCAyNDAsIDI0OCk7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBlbGVtZW50Qm9yZGVyQ29sb3IgICAgICA9IG5ldyBDb2xvcihudWxsLCAxMjAsIDE1MiwgMTg0KTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciBlbGVtZW50QmFja2dyb3VuZENvbG9yICA9IG5ldyBDb2xvcihudWxsLCAyMzIsIDI0MCwgMjQ4KTsgIAotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGVsZW1lbnRMYWJlbENvbG9yICAgICAgID0gbmV3IENvbG9yKG51bGwsICA4MCwgMTAyLCAxNDQpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIHJlYWRPbmx5Qm9yZGVyQ29sb3IgICAgID0gbmV3IENvbG9yKG51bGwsIDE2NCwgMTY0LCAxNjQpOyAKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciByZWQgICAgICAgICAgICAgICAgICAgICA9IG5ldyBDb2xvcihudWxsLCAyNTUsICAgMCwgICAwKTsgCi0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciByZWFkT25seUJhY2tncm91bmRDb2xvciA9IENvbG9yQ29uc3RhbnRzLndoaXRlOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9udCAgc21hbGxCb2xkRm9udCAgICAgICAgICAgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIlRhaG9tYSIsIDgsIFNXVC5CT0xEKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBGb250ICBtZWRpdW1Gb250ICAgICAgICAgICAgICA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiVGFob21hIiwgMTAsIFNXVC5OT05FKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBGb250ICBtZWRpdW1Cb2xkRm9udCAgICAgICAgICA9IG5ldyBGb250KERpc3BsYXkuZ2V0Q3VycmVudCgpLCAiVGFob21hIiwgMTAsIFNXVC5CT0xEKTsgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvVmlld01vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL1ZpZXdNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzVkYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvVmlld01vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFZpZXdNb2RlIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HICAgICA9ICAgMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRSAgICAgPSAgIDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlRfVFlQRSAgID0gICAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFICAgICA9ICAgNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRVMgICAgICAgPSAgIDU7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19ERVNDUklQVElPTiAgICAgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfREVTQ1JJUFRJT04gICAgID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX1RZUEVfREVTQ1JJUFRJT04gICA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BPUlRUWVBFIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfREVTQ1JJUFRJT04gICAgID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfU0VSVklDRSIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFU19ERVNDUklQVElPTiAgICAgICA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1RZUEVTIik7Ci0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0JpbmRpbmdWaXNpYmxlID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIGludCBtb2RlID0gU0VSVklDRTsKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIHB1YmxpYyBWaWV3TW9kZSgpCi0gIHsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmdWaXNpYmxlKGJvb2xlYW4gaXNWaXNpYmxlKQotICB7Ci0gICAgaWYgKGlzQmluZGluZ1Zpc2libGUgIT0gaXNWaXNpYmxlKQotICAgIHsKLSAgICAgIGlzQmluZGluZ1Zpc2libGUgPSBpc1Zpc2libGU7Ci0gICAgICBmaXJlQ2hhbmdlTm90aWZpY2F0aW9uKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNCaW5kaW5nVmlzaWJsZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gaXNCaW5kaW5nVmlzaWJsZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE1vZGVGb3JEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsgICAgICAgICAgICAgICAKLSAgICBpbnQgcmVzdWx0ID0gU0VSVklDRTsKLSAgICBpZiAoZGVzY3JpcHRpb24uZXF1YWxzKEJJTkRJTkdfREVTQ1JJUFRJT04pKQotICAgIHsgICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IEJJTkRJTkc7IAotICAgIH0KLSAgICBlbHNlIGlmIChkZXNjcmlwdGlvbi5lcXVhbHMoTUVTU0FHRV9ERVNDUklQVElPTikpCi0gICAgeyAgICAgICAgCi0gICAgICByZXN1bHQgPSBNRVNTQUdFOwotICAgIH0KLSAgICBlbHNlIGlmIChkZXNjcmlwdGlvbi5lcXVhbHMoUE9SVF9UWVBFX0RFU0NSSVBUSU9OKSkKLSAgICB7IAotICAgICAgcmVzdWx0ID0gUE9SVF9UWVBFOwotICAgIH0KLSAgICBlbHNlIGlmIChkZXNjcmlwdGlvbi5lcXVhbHMoU0VSVklDRV9ERVNDUklQVElPTikpCi0gICAgeyAgICAKLSAgICAgIHJlc3VsdCA9IFNFUlZJQ0U7Ci0gICAgfQotICAgIGVsc2UgaWYgKGRlc2NyaXB0aW9uLmVxdWFscyhUWVBFU19ERVNDUklQVElPTikpCi0gICAgeyAgCi0gICAgICByZXN1bHQgPSBUWVBFUzsKLSAgICB9ICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdGlvbkZvck1vZGUoaW50IG1vZGUpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gU0VSVklDRV9ERVNDUklQVElPTjsKLSAgICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgICAgY2FzZSBCSU5ESU5HIDoKLSAgICAgIHsgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IEJJTkRJTkdfREVTQ1JJUFRJT047Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBNRVNTQUdFIDogCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBNRVNTQUdFX0RFU0NSSVBUSU9OOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUE9SVF9UWVBFIDogCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBQT1JUX1RZUEVfREVTQ1JJUFRJT047Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTRVJWSUNFIDogCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBTRVJWSUNFX0RFU0NSSVBUSU9OOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgVFlQRVMgOiAgCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBUWVBFU19ERVNDUklQVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB2aWV3TW9kZUNoYW5nZWQoVmlld01vZGUgbW9kZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNb2RlKGludCBtb2RlKQotICB7Ci0gICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICBmaXJlQ2hhbmdlTm90aWZpY2F0aW9uKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRNb2RlKFN0cmluZyBkZXNjcmlwdGlvbikKLSAgewotICAgIHRoaXMubW9kZSA9IGdldE1vZGVGb3JEZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbigpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRNb2RlKCkKLSAgewotICAgIHJldHVybiBtb2RlOwotICB9IAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TW9kZURlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXREZXNjcmlwdGlvbkZvck1vZGUobW9kZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlmICghbGlzdGVuZXJMaXN0LmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICB7IAotICAgICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgfSAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBmaXJlQ2hhbmdlTm90aWZpY2F0aW9uKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIExpc3RlbmVyIGxpc3RlbmVyID0gKExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIudmlld01vZGVDaGFuZ2VkKHRoaXMpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL1dTRExDb21wb25lbnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL1dTRExDb21wb25lbnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4ZWZlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9XU0RMQ29tcG9uZW50Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLlNlbGVjdGlvblRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuRXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNlbnRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXMuTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSUNvbm5lY3Rpb25SZW5kZXJpbmdWaWV3ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdTRExDb21wb25lbnRWaWV3ZXIgZXh0ZW5kcyBTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgaW1wbGVtZW50cyBJQ29ubmVjdGlvblJlbmRlcmluZ1ZpZXdlcgotewotICBwcm90ZWN0ZWQgRWRpdERvbWFpbiBlZGl0RG9tYWluOwotICBwcm90ZWN0ZWQgV1NETEVkaXRvciBlZGl0b3I7Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgbWVudVNlbGVjdGlvblByb3ZpZGVyOwotICBwcm90ZWN0ZWQgQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0IGNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydDsKLSAgcHJvdGVjdGVkIENvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUgY29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQ7Ci0KLSAgcHVibGljIFdTRExDb21wb25lbnRWaWV3ZXIoV1NETEVkaXRvciBlZGl0b3IsIElTZWxlY3Rpb25Qcm92aWRlciBtZW51U2VsZWN0aW9uUHJvdmlkZXIpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHRoaXMuZWRpdG9yID0gZWRpdG9yOwotICAgIHRoaXMubWVudVNlbGVjdGlvblByb3ZpZGVyID0gbWVudVNlbGVjdGlvblByb3ZpZGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJlc2VydmVFeHBhbnNpb25FbmFibGVkKGJvb2xlYW4gaXNQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQpCi0gIHsKLSAgICB0aGlzLmlzUHJlc2VydmVFeHBhbnNpb25FbmFibGVkID0gaXNQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlcnZlRXhwYW5zaW9uRW5hYmxlZCgpCi0gIHsKLSAgICByZXR1cm4gaXNQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQ7Ci0gIH0KLQotICBwdWJsaWMgQ29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZSBnZXRDb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlKCkKLSAgewotICAgIHJldHVybiBjb25uZWN0aW9uUmVuZGVyaW5nRmlndXJlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gY29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgY29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0LnNldElucHV0KG9iamVjdCk7Ci0gICAgCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgewotICAgICAgZWRpdG9yLmdldEdyYXBoVmlld2VyKCkuc2V0QmFja0J1dHRvbkVuYWJsZWQoZmFsc2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWRpdG9yLmdldEdyYXBoVmlld2VyKCkuc2V0QmFja0J1dHRvbkVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8vIHRvZG8uLiByZXZpc2l0IHRoaXMgdG8gdW5kZXJzdGFuZCB3aHkgd2UgZG9uJ3QgZ2V0IGEgc2V0IGlucHV0Ci0gICAgLy8gd2hlbiBkcmlsbGluZyBkb3duIGludG8gYSBzY2hlbWEgZWxlbWVudCBvciB0eXBlCi0gICAgLy8KLSAgICBpbnQgbGF5b3V0QWxpZ25tZW50ID0gKG9iamVjdCBpbnN0YW5jZW9mIERlZmluaXRpb24pID8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENlbnRlckxheW91dC5BTElHTk1FTlRfVE9QIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudGVyTGF5b3V0LkFMSUdOTUVOVF9DRU5URVI7Ci0gICAgCi0gICAgU2NhbGFibGVSb290RWRpdFBhcnQgZ3JhcGhpY2FsUm9vdEVkaXRQYXJ0ID0gKFNjYWxhYmxlUm9vdEVkaXRQYXJ0KWdldFJvb3RFZGl0UGFydCgpOwotICAgIENlbnRlckxheW91dCBjZW50ZXJMYXlvdXQgPSAoQ2VudGVyTGF5b3V0KWdyYXBoaWNhbFJvb3RFZGl0UGFydC5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKS5nZXRMYXlvdXRNYW5hZ2VyKCk7Ci0gICAgY2VudGVyTGF5b3V0LnNldFZlcnRpY2FsQWxpZ25tZW50KGxheW91dEFsaWdubWVudCk7Ci0gIH0KLQotICAvL3B1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3Qgb2JqZWN0KQotICAvL3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvL30KLQotICBwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbCgpCi0gIHsKLSAgICBzdXBlci5ob29rQ29udHJvbCgpOwotCi0gICAgZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMud2hpdGUpOwotCi0gICAgZWRpdERvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbihudWxsKTsKLSAgICAoKERlZmF1bHRFZGl0RG9tYWluKWVkaXREb21haW4pLnNldERlZmF1bHRUb29sKG5ldyBTZWxlY3Rpb25Ub29sKCkpOwotICAgIGVkaXREb21haW4ubG9hZERlZmF1bHRUb29sKCk7Ci0gICAgZWRpdERvbWFpbi5hZGRWaWV3ZXIodGhpcyk7Ci0KLSAgICBjb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgPSBuZXcgQ29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0KCk7Ci0KLSAgICBLZXlBZGFwdGVyIGtleUxpc3RlbmVyID0gbmV3IEtleUFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpCi0gICAgICB7ICAgCQotICAgICAgICBpZiAoZS5rZXlDb2RlID09IFNXVC5GMykKLSAgICAgICAgewotICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgICAgICAgICAgewotCQkJICBPcGVuT25TZWxlY3Rpb25IZWxwZXIgaGVscGVyID0gbmV3IE9wZW5PblNlbGVjdGlvbkhlbHBlcihlZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgICAgaGVscGVyLm9wZW5FZGl0b3IoKEVPYmplY3Qpb2JqZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgZ2V0Q29udHJvbCgpLmFkZEtleUxpc3RlbmVyKGtleUxpc3RlbmVyKTsKLQotICAgIHNldENvbnRlbnRzKGNvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCk7Ci0gICAgLy9nZXRGaWd1cmVDYW52YXMoKS5hZGRLZXlMaXN0ZW5lcihuZXcgRmlndXJlQ2FudmFzS2V5Ym9hcmRIYW5kbGVyKGVkaXRvcikpOwotICAgIGdldFJvb3RFZGl0UGFydCgpLmFjdGl2YXRlKCk7Ci0KLSAgICBjb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuc2V0SW5wdXQoZWRpdG9yLmdldERlZmluaXRpb24oKSk7Ci0KLSAgICBTY2FsYWJsZVJvb3RFZGl0UGFydCBncmFwaGljYWxSb290RWRpdFBhcnQgPSAoU2NhbGFibGVSb290RWRpdFBhcnQpZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0KLSAgICAvLyBzZXQgdGhlIGxheW91dCBmb3IgdGhlIHByaW1hcnkgbGF5ZXIgc28gdGhhdCB0aGUgY2hpbGRyZW4gYXJlIGFsd2F5cyBjZW50ZXJlZAotICAgIC8vCi0gICAgQ2VudGVyTGF5b3V0IGNlbnRlckxheW91dCA9IG5ldyBDZW50ZXJMYXlvdXQoKTsKLSAgICBjZW50ZXJMYXlvdXQuc2V0VmVydGljYWxBbGlnbm1lbnQoQ2VudGVyTGF5b3V0LkFMSUdOTUVOVF9UT1ApOwotICAgIGdyYXBoaWNhbFJvb3RFZGl0UGFydC5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKS5zZXRMYXlvdXRNYW5hZ2VyKGNlbnRlckxheW91dCk7IC8vbmV3IENvbnRhaW5lckxheW91dCgpKTsvLwotCi0gICAgc2V0Q29udGV4dE1lbnUobmV3IEludGVybmFsQ29udGV4dE1lbnVQcm92aWRlcih0aGlzLCBlZGl0b3IpKTsKLQotICAgIC8vIGFkZCB0aGUgQ29ubmVjdGlvbkZpZ3VyZSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgZHJhd2luZyBhbGwgb2YgdGhlIGxpbmVzIGluIHRoZSB2aWV3Ci0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgIAotICAgIElGaWd1cmUgZmlndXJlID0gZ3JhcGhpY2FsUm9vdEVkaXRQYXJ0LmdldExheWVyKExheWVyQ29uc3RhbnRzLkNPTk5FQ1RJT05fTEFZRVIpOwotICAgIGZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQotICAgIGZpbmFsIE15Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlciBjb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyID0gbmV3IE15Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlcih0aGlzKTsKLQotICAgIGNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUgPSBuZXcgQ29ubmVjdGlvblJlbmRlcmluZ0ZpZ3VyZShncmFwaGljYWxSb290RWRpdFBhcnQuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUikpCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKQotICAgICAgewotICAgICAgICBzdXBlci5maWxsU2hhcGUoZ3JhcGhpY3MpOwotICAgICAgICBjb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyLmZpbGxTaGFwZUhlbHBlcihncmFwaGljcyk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBmaWd1cmUuYWRkKGNvbm5lY3Rpb25SZW5kZXJpbmdGaWd1cmUpOwotICAgIGZpZ3VyZS52YWxpZGF0ZSgpOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVkaXRvciBnZXRXU0RMRWRpdG9yKCkgewotICAJcmV0dXJuIGVkaXRvcjsKLSAgfQotCi0gIHB1YmxpYyBjbGFzcyBJbnRlcm5hbENvbnRleHRNZW51UHJvdmlkZXIgZXh0ZW5kcyBDb250ZXh0TWVudVByb3ZpZGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgRWRpdFBhcnRWaWV3ZXIgdmlld2VyOwotICAgIHByb3RlY3RlZCBFeHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci0KLSAgICBwdWJsaWMgSW50ZXJuYWxDb250ZXh0TWVudVByb3ZpZGVyKEVkaXRQYXJ0Vmlld2VyIHZpZXdlciwgV1NETEVkaXRvciBlZGl0b3IpCi0gICAgewotICAgICAgc3VwZXIodmlld2VyKTsKLSAgICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgICAgZXh0ZW5zaWJsZU1lbnVBY3Rpb25Db250cmlidXRvciA9IG5ldyBFeHRlbnNpYmxlTWVudUFjdGlvbkNvbnRyaWJ1dG9yKGVkaXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYnVpbGRDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBnZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpbGlzdC5nZXQoMCk7Ci0gICAgICAgIE9iamVjdCBvYmplY3QgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCi0gICAgICAgIC8vaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgUHJvcGVydHlFZGl0UGFydCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICBvYmplY3QgPSAoKFByb3BlcnR5RWRpdFBhcnQpZWRpdFBhcnQpLmdldE93bmVyTW9kZWwoKTsKLSAgICAgICAgLy99ICAgICAgICAgICAgICAgCi0KLSAgICAgICAgaWYgKG9iamVjdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBub2RlID0gKChXU0RMRWxlbWVudClvYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5vZGUgPSAoKFdTRExHcm91cE9iamVjdClvYmplY3QpLmdldERlZmluaXRpb24oKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGV4dGVuc2libGVNZW51QWN0aW9uQ29udHJpYnV0b3IuY29udHJpYnV0ZU1lbnVBY3Rpb25zKG1lbnUsIG5vZGUsIG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL1dTRExHcmFwaFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvV1NETEdyYXBoVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGQ1NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvV1NETEdyYXBoVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5Db3B5R2xvYmFsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuRGVsZXRlV1NETEFuZFhTREFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlBhc3RlR2xvYmFsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5Db21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkdyb3VwRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLlRyZWVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RNb2RlbEdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdTRExHcmFwaFZpZXdlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIENvbnRyb2wgY29tcG9uZW50Vmlld2VyQ29udHJvbDsgCi0gIHByb3RlY3RlZCBXU0RMQ29tcG9uZW50Vmlld2VyIGNvbXBvbmVudFZpZXdlcjsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvciBlZGl0b3I7ICAKLSAgcHJvdGVjdGVkIEludGVybmFsU2VsZWN0aW9uQWRhcHRlciBpbnRlcm5hbFNlbGVjdGlvbkFkYXB0ZXIgPSBuZXcgSW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyKCk7Ci0KLSAgR3JhcGhWaWV3VG9vbEJhciBmb3JtOyAgLy8gVG9vbCBiYXIgdmlldyBmb3JtCi0gIAotICBwdWJsaWMgV1NETEdyYXBoVmlld2VyKFdTRExFZGl0b3IgZWRpdG9yKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsgICAgICAgICAgICAgICAgIAotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsgICAgICAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Qcm92aWRlcigpCi0gIHsKLSAgICByZXR1cm4gaW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyOwotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgY29tcG9uZW50Vmlld2VyID0gbmV3IFdTRExDb21wb25lbnRWaWV3ZXIoZWRpdG9yLCBudWxsKTsKLQotICAgIGNvbXBvbmVudFZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoaW50ZXJuYWxTZWxlY3Rpb25BZGFwdGVyKTsKLSAgICBpbnRlcm5hbFNlbGVjdGlvbkFkYXB0ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotCi0gICAgZm9ybSA9IG5ldyBHcmFwaFZpZXdUb29sQmFyKGVkaXRvciwgcGFyZW50LCBTV1QuTk9ORSk7Ci0KLSAgICBjb21wb25lbnRWaWV3ZXJDb250cm9sID0gY29tcG9uZW50Vmlld2VyLmNyZWF0ZUNvbnRyb2woZm9ybSk7Ci0gICAgZm9ybS5zZXRDb250ZW50KGNvbXBvbmVudFZpZXdlckNvbnRyb2wpOwotCi0gICAgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgY29tcG9uZW50Vmlld2VyQ29udHJvbC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgCQlpZiAoZS5jaGFyYWN0ZXIgPT0gU1dULkRFTCkgewotICAgIAkJCUxpc3Qgc2VsZWN0aW9ucyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuZ2V0U2VsZWN0aW9uKCkpLnRvTGlzdCgpOwotICAgICAgIAkJCURlbGV0ZVdTRExBbmRYU0RBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IERlbGV0ZVdTRExBbmRYU0RBY3Rpb24oc2VsZWN0aW9ucywgZWRpdG9yLmdldERlZmluaXRpb24oKS5nZXRFbGVtZW50KCksIGVkaXRvcik7Ci0gICAgICAgCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotICAgIAkJfQotICAgIAl9ICAgIAkKLSAgICB9KTsKLSAgICAKLSAgICByZXR1cm4gY29tcG9uZW50Vmlld2VyQ29udHJvbDsgCi0gIH0KLQotICBwdWJsaWMgV1NETENvbXBvbmVudFZpZXdlciBnZXRDb21wb25lbnRWaWV3ZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBvbmVudFZpZXdlcjsKLSAgfQotCi0KLSAgTm9kZSBpbnB1dE5vZGU7ICAgIAotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgY29tcG9uZW50Vmlld2VyLnNldElucHV0KG9iamVjdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEJhY2tCdXR0b25FbmFibGVkKGJvb2xlYW4gc3RhdGUpCi0gIHsKLSAgICBmb3JtLnNldEJhY2tCdXR0b25FbmFibGVkKHN0YXRlKTsKLSAgfQotCi0gIC8vcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpCi0gIC8vfSAgICAgICAgICAgIAotCi0gICAgCi0gIC8vIHRoaXMgaXMgY2FsbGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhlIHNlbGVjdGlvbiBtYW5hZ2VyCi0gIC8vCi0KLQotICAKLSAgcHJvdGVjdGVkIE9iamVjdCBnZXRJbnB1dENvbXBvbmVudEZvck5vZGUoTm9kZSBub2RlKSAgIAotICB7Ci0gICAgLy8gVE9ETy4uLiBsb2dpYyB0byBnZXQgV1NETEVsZW1lbnQgb3Igb3RoZXIgb2JqZWN0IChlLmcuIFhTRCBvciBleHRlbnNpb24gZm9yIHRoZSBOb2RlKQotICAgIC8vIFRPRE8uLi4gY29uc2lkZXIgY2FzZSB3aGVyZSB0aGUgbW9kZWwgaXMgc2ltcGx5IGEgY2h1bmsgb2YgRE9NCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgIAotICBwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbkNvbXBvbmVudEZvck5vZGUoTm9kZSBub2RlKSAgIAotICB7Ci0gICAgLy8gVE9ETy4uLiBsb2dpYyB0byBnZXQgV1NETEVsZW1lbnQgb3Igb3RoZXIgb2JqZWN0IChlLmcuIFhTRCBvciBleHRlbnNpb24gZm9yIHRoZSBOb2RlKQotICAgIC8vIFRPRE8uLi4gY29uc2lkZXIgY2FzZSB3aGVyZSB0aGUgbW9kZWwgaXMgc2ltcGx5IGEgY2h1bmsgb2YgRE9NCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIGNsYXNzIEludGVybmFsU2VsZWN0aW9uQWRhcHRlciBleHRlbmRzIFNlbGVjdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEZvck90aGVyTW9kZWwoT2JqZWN0IG9iamVjdCkKLSAgICB7ICAgICAgICAgICAgCi0gICAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCkKLSAgICAgIHsgICAgICAgCi0gICAgICAgIC8vIGZpeCBmb3IgZGVmZWN0IDQyOTQgLi4uIHRoaXMgdGVzdCBwcmV2ZW50cyBzZWxlY3Rpb24gZnJvbSBjaGFuZ2luZwotICAgICAgICAvLyB3aGVuIGEgY29tcG9uZW50IGlzIHJlbmFtZWQgd2hpY2ggaW5kaXJlY3RseSBjYXVzZXMgaXQgdG8gYmUgcmVtb3ZlZCBhbmQKLSAgICAgICAgLy8gcmUtYWRkZWQgZnJvbSB0aGUgJ3NvcnRlZCcgbGlzdAotICAgICAgICAvLwotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQpKQotICAgICAgICB7ICAKLSAgICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClvYmplY3Q7Ci0gICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gIAotCi0gICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7IAotICAgIH0gIAotICB9Ci0gICAgCi0gIC8vIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgc2VsZWN0aW9uIGNoYW5nZXMgd2l0aGluIHRoZSBzZWxlY3Rpb24gbWFuYWdlcgotICAvLwotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgCi0gIHsgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiV1NETEdyYXBoVmlld2VyLnNlbGVjdGlvbkNoYW5nZWQoICIgKyBldmVudC5nZXRTb3VyY2UoKSArICIpIik7Ci0gIAkKLSAgCSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25PYmplY3QgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IHNlbGVjdGlvbk9iamVjdC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpIHsKLSAgICAgCUVsZW1lbnQgbm9kZSA9ICgoV1NETEVsZW1lbnQpIG1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICBib29sZWFuIGlzRWRpdGFibGUgPSAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKTsKLSAgICAgICAgIAotICAgICAJQWN0aW9uIGNvcHlBY3Rpb24gPSBuZXcgQ29weUdsb2JhbEFjdGlvbigoV1NETEVsZW1lbnQpIG1vZGVsT2JqZWN0LCBlZGl0b3IpOwotICAgICAJQWN0aW9uIHBhc3RlQWN0aW9uID0gbmV3IFBhc3RlR2xvYmFsQWN0aW9uKChXU0RMRWxlbWVudCkgbW9kZWxPYmplY3QsIGVkaXRvcik7Ci0gCQkKLSAJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLSAJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgY29weUFjdGlvbik7Ci0gCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLCBwYXN0ZUFjdGlvbik7Ci0gCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLSAJCQotIAkJaWYgKCFpc0VkaXRhYmxlKSB7Ci0gCQkJY29weUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAJCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAJCX0KLSAgICAgfQotCi0gICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpICE9IGludGVybmFsU2VsZWN0aW9uQWRhcHRlciAmJiBldmVudC5nZXRTb3VyY2UoKSAhPSAoKFdTRExUZXh0RWRpdG9yKWVkaXRvci5nZXRUZXh0RWRpdG9yKCkpLmdldEludGVybmFsU2VsZWN0aW9uUHJvdmlkZXIoKSkKLSAgICB7ICAgCi0gICAgICBib29sZWFuIGlzRW1wdHlTZWxlY3Rpb25SZXF1aXJlZCA9IHRydWU7Ci0gICAgICBpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICBPYmplY3QgbW9kZWwgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEVkaXRQYXJ0KGNvbXBvbmVudFZpZXdlci5nZXRSb290RWRpdFBhcnQoKSwgbW9kZWwpOwotICAgICAgICAgIGlmIChlZGl0UGFydCA9PSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBlZGl0UGFydCA9IGV4cGFuZFRvUmV2ZWFsKGNvbXBvbmVudFZpZXdlci5nZXRSb290RWRpdFBhcnQoKSwgbW9kZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgCWlmIChtb2RlbCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KSB7Ci0gICAgICAgICAgCQltb2RlbCA9IGdldFRvcExldmVsQ29tcG9uZW50KChYU0RDb25jcmV0ZUNvbXBvbmVudCkgbW9kZWwpOwotICAgICAgICAgIAkJCi0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgWFNERWxlbWVudERlY2xhcmF0aW9uIHx8Ci0JCQkJCW1vZGVsIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHx8Ci0JCQkJCW1vZGVsIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24gfHwKLQkJCQkJbW9kZWwgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIHsKLQkJCQkJCWNvbXBvbmVudFZpZXdlci5zZXRJbnB1dChtb2RlbCk7Ci0JCQkJfQotICAgICAgICAgICAgfQotICAgICAgICAgIAllbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdTRExFbGVtZW50IHx8IG1vZGVsIGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KSB7Ci0gICAgICAgICAgCQkvLyBXZSBuZWVkIHRvIHN3aXRjaCB0aGUgb3V0cHV0IHRvIERlZmluaXRpb24KLSAgICAgICAgICAJCWNvbXBvbmVudFZpZXdlci5zZXRJbnB1dChlZGl0b3IuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAJCWVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnQoY29tcG9uZW50Vmlld2VyLmdldFJvb3RFZGl0UGFydCgpLCBtb2RlbCk7Ci0gICAgICAgICAgCQlpZiAoZWRpdFBhcnQgPT0gbnVsbCkKLSAgICAgICAgICAJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgCQkJZWRpdFBhcnQgPSBleHBhbmRUb1JldmVhbChjb21wb25lbnRWaWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCksIG1vZGVsKTsKLSAgICAgICAgICAJCX0KLSAgICAgICAgICAJfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBiYWQgaGFjayB0byBjb252ZXJ0IHhzZCBlZGl0b3IgY2F0ZWdvcnkgdG8geHNkIG9iamVjdAotICAgICAgICAgICAgICAvLyBzZWUgYWxzbyBXU0RMVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UKLSAgICAgICAgICAgICAgTm9kZSBub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KG1vZGVsKTsKLSAgICAgICAgICAgICAgT2JqZWN0IG8gPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZWRpdG9yLmdldERlZmluaXRpb24oKSwgKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudClvKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICBjb21wb25lbnRWaWV3ZXIuc2V0SW5wdXQob2JqKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc0VtcHR5U2VsZWN0aW9uUmVxdWlyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGNvbXBvbmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdFBhcnQpKTsKLSAgICAgICAgICAgIHNjcm9sbEludG9WaWV3KGVkaXRQYXJ0KTsKLSAgICAgICAgICB9ICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc0VtcHR5U2VsZWN0aW9uUmVxdWlyZWQpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgWFNEQ29uY3JldGVDb21wb25lbnQgZ2V0VG9wTGV2ZWxDb21wb25lbnQoWFNEQ29uY3JldGVDb21wb25lbnQgY29tcG9uZW50KQotICB7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgcHJldiA9IGNvbXBvbmVudDsKLSAgICBYU0RDb25jcmV0ZUNvbXBvbmVudCBjb250YWluZXIgPSBjb21wb25lbnQ7Ci0gICAgd2hpbGUgKCBjb250YWluZXIgIT0gbnVsbCAmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIFhTRFNjaGVtYSkpCi0gICAgewotICAgICAgcHJldiA9IGNvbnRhaW5lcjsgICAgIAotICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLmdldENvbnRhaW5lcigpOwotICAgIH0KLSAgICByZXR1cm4gY29udGFpbmVyICE9IG51bGwgPyBwcmV2IDogbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBnZXRFZGl0UGFydChFZGl0UGFydCBlZGl0UGFydCwgT2JqZWN0IG1vZGVsKSAgCi0gIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICBFZGl0UGFydCByZXN1bHQgPSBudWxsOwotICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpID09IG1vZGVsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVkaXRQYXJ0OyAgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RWRpdFBhcnQoKEVkaXRQYXJ0KWkubmV4dCgpLCBtb2RlbCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBFZGl0UGFydCBleHBhbmRUb1JldmVhbChFZGl0UGFydCBlZGl0UGFydCwgT2JqZWN0IG1vZGVsKQotICB7ICAgCi0gICAgLy8gaGVyZSB3ZSBjcmVhdGUgdGhlIHBhcmVudCBsaXN0Ci0gICAgLy8KLSAgICBMaXN0IHBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChPYmplY3QgbyA9IG1vZGVsOyBvICE9IG51bGw7IG8gPSBnZXRQYXJlbnQobykpCi0gICAgewotICAgICAgcGFyZW50TGlzdC5hZGQoMCwgbyk7Ci0gICAgfSAgICAgICAgICAgICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IGV4cGFuZFRvUmV2ZWFsSGVscGVyKGVkaXRQYXJ0LCBwYXJlbnRMaXN0LCAwKTsgICAgCi0gICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAKLQotCi0gIHB1YmxpYyBFZGl0UGFydCBleHBhbmRUb1JldmVhbEhlbHBlcihFZGl0UGFydCBlZGl0UGFydCwgTGlzdCBwYXJlbnRMaXN0LCBpbnQgaW5kZXgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IHBhcmVudExpc3RTaXplID0gIHBhcmVudExpc3Quc2l6ZSgpOwotICAgIE9iamVjdCBtb2RlbCA9IGluZGV4IDwgcGFyZW50TGlzdFNpemUgPyBwYXJlbnRMaXN0LmdldChpbmRleCkgOiBudWxsOwotICAgIGlmIChtb2RlbCAhPSBudWxsICYmIGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgeyAKLSAgICAgIC8vIHNlYXJjaCBlZGl0cGFydCBhbmQgaXRzIGRlc2NlbmRhbnRzIHRvIGZpbmQgYSBtYXRjaCBmb3IgdGhpcyBtb2RlbCBvYmplY3QKLSAgICAgIC8vCi0gICAgICByZXN1bHQgPSBnZXRFZGl0UGFydChlZGl0UGFydCwgbW9kZWwpOyAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWRpdFBhcnQoIiArIGluZGV4ICsgIiwgIiArIG1vZGVsICsgIikgPSAiICsgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGluZGV4IDwgKHBhcmVudExpc3RTaXplIC0gMSkpCi0gICAgICB7Ci0gICAgICAgIC8vIHdlJ3ZlIGZvdW5kIHRoZSBlZGl0UGFydCBmb3IgdGhlIGl0ZW0gaW4gdGhlIHBhcmVudExpc3QgCi0gICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5leHQgaXRlbSAKLSAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFRyZWVOb2RlRWRpdFBhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFRyZWVOb2RlRWRpdFBhcnQpcmVzdWx0KS5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGV4cGFuZFRvUmV2ZWFsSGVscGVyKHJlc3VsdCwgcGFyZW50TGlzdCwgaW5kZXggKyAxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAgIAotICAgIAotICBwcm90ZWN0ZWQgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbW9kZWwpCi0gIHsgCi0gICAgT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICBwYXJlbnQgPSAoKEVPYmplY3QpbW9kZWwpLmVDb250YWluZXIoKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBwYXJlbnQ7Ci0gIH0gICAgIAotCi0KLSAgcHVibGljIHZvaWQgc2Nyb2xsSW50b1ZpZXcoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0ID0gKEdyb3VwRWRpdFBhcnQpcGFyZW50OwotICAgICAgICBncm91cEVkaXRQYXJ0LnNjcm9sbFRvUmV2ZWFsRWRpdFBhcnQoZWRpdFBhcnQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0Fic3RyYWN0Q29ubmVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4NGFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExTd2l0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBBYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyIGltcGxlbWVudHMgSUNvbm5lY3Rpb25NYW5hZ2VyCi17ICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1BBR0FURV9GT1JXQVJEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEFHQVRFX0JBQ0sgICAgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RFRCAgICAgICAgICA9IDI7Ci0KLSAgcHJvdGVjdGVkIEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydDsKLQotICBwdWJsaWMgQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlcihHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQpCi0gIHsKLSAgICB0aGlzLmdyb3VwRWRpdFBhcnQgPSBncm91cEVkaXRQYXJ0OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExTd2l0Y2ggY3JlYXRlU3dpdGNoKGludCBzZWxlY3Rpb25UeXBlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMU3dpdGNoKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9wYWdhdGVGb3J3YXJkKE9iamVjdCBtb2RlbCkKLSAgeyAgCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgewotICAgICAgV1NETFN3aXRjaCB0aGVTd2l0Y2ggPSBjcmVhdGVTd2l0Y2goUFJPUEFHQVRFX0ZPUldBUkQpOwotICAgICAgdGhlU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KW1vZGVsKTsgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNjcm9sbFRvUmV2ZWFsSW5wdXRDb25uZWN0aW9uKCk7Ci0gICAgfSAgICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVtb3ZlQ29ubmVjdGlvbnMoKTsKLSAgICB9Ci0gICAgcHJvcGFnYXRlRm9yd2FyZFRvTmV4dChtb2RlbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcm9wYWdhdGVCYWNrKE9iamVjdCBtb2RlbCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBXU0RMU3dpdGNoIHRoZVN3aXRjaCA9IGNyZWF0ZVN3aXRjaChQUk9QQUdBVEVfQkFDSyk7Ci0gICAgICB0aGVTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpbW9kZWwpOyAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zY3JvbGxUb1JldmVhbE91dHB1dENvbm5lY3Rpb24oKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlbW92ZUNvbm5lY3Rpb25zKCk7Ci0gICAgfQotICAgIHByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKG1vZGVsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkTW9kZWxPYmplY3QoT2JqZWN0IG1vZGVsKQotICB7ICAKLQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOb2RlKQotCXsKLSAgICAJTm9kZSBub2RlID0gKE5vZGUpbW9kZWw7Ci0JCS8vRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ3JvdXBFZGl0UGFydC5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIHdoaWxlKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgCi0gICAgCSAgaWYgKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhub2RlLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAJICB7Ci0gICAgCQlicmVhazsKLSAgICAJICB9ICAKLSAgICAJICBlbHNlCi0gICAgCSAgewotICAgIAkgIAlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgCSAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAJbW9kZWwgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoIGdyb3VwRWRpdFBhcnQuZ2V0RGVmaW5pdGlvbigpLCAoRWxlbWVudClub2RlKTsKLSAgICAgICAgfSAgCi0JfQotCSAgCQotICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIFdTRExTd2l0Y2ggdGhlU3dpdGNoID0gY3JlYXRlU3dpdGNoKFNFTEVDVEVEKTsKLSAgICAgIHRoZVN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCltb2RlbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHJlbW92ZUNvbm5lY3Rpb25zKCk7Ci0gICAgfQotICAgIHByb3BhZ2F0ZUZvcndhcmRUb05leHQobW9kZWwpOwotICAgIHByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKG1vZGVsKTsKLSAgfSAKLQotIAotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb25uZWN0aW9ucygpCi0gIHsKLSAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChudWxsKTsKLSAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICB9Ci0gICAgIAotICBwcm90ZWN0ZWQgdm9pZCBwcm9wYWdhdGVGb3J3YXJkVG9OZXh0KE9iamVjdCBtb2RlbCkKLSAgewotICAgIEdyb3VwRWRpdFBhcnQgZ3JvdXAgPSBncm91cEVkaXRQYXJ0LmdldE5leHQoKTsKLSAgICBpZiAoZ3JvdXAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXIgPSBncm91cC5nZXRDb25uZWN0aW9uTWFuYWdlcigpOwotICAgICAgaWYgKGNvbm5lY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyLnByb3BhZ2F0ZUZvcndhcmQobW9kZWwpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKE9iamVjdCBtb2RlbCkKLSAgewotICAgIEdyb3VwRWRpdFBhcnQgZ3JvdXAgPSBncm91cEVkaXRQYXJ0LmdldFByZXZpb3VzKCk7Ci0gICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbm5lY3Rpb25NYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyID0gZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKTsKLSAgICAgIGlmIChjb25uZWN0aW9uTWFuYWdlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb25uZWN0aW9uTWFuYWdlci5wcm9wYWdhdGVCYWNrKG1vZGVsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBCaW5kaW5nIGdldEVuY2xvc2luZ0JpbmRpbmcoRU9iamVjdCBvYmplY3QpCi0gIHsgCi0gICAgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQmluZGluZykKLSAgICB7ICAgICAKLSAgICAgIGJpbmRpbmcgPSAoQmluZGluZylvYmplY3Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdPcGVyYXRpb24pCi0gICAgeyAgICAgCi0gICAgICBiaW5kaW5nID0gKEJpbmRpbmcpb2JqZWN0LmVDb250YWluZXIoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0IHx8Ci0gICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCB8fAotICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICBiaW5kaW5nID0gKEJpbmRpbmcpb2JqZWN0LmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7Ci0gICAgfQotICAgIHJldHVybiBiaW5kaW5nOwotICB9ICAgCi0KLSAgcHJvdGVjdGVkIFBvcnRUeXBlIGdldEVuY2xvc2luZ1BvcnRUeXBlKEVPYmplY3Qgb2JqZWN0KQotICB7IAotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgIHsgICAgIAotICAgICAgcG9ydFR5cGUgPSAoUG9ydFR5cGUpb2JqZWN0LmVDb250YWluZXIoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSW5wdXQgfHwKLSAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgCQotICAgICAgcG9ydFR5cGUgPSBvYmplY3QuZUNvbnRhaW5lcigpICE9IG51bGwgPyAoUG9ydFR5cGUpb2JqZWN0LmVDb250YWluZXIoKS5lQ29udGFpbmVyKCkgOiBudWxsOwotICAgIH0gCi0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0gICAgewotICAgICAgcG9ydFR5cGUgPSAoUG9ydFR5cGUpb2JqZWN0OwkKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBwb3J0VHlwZTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBnZXRFbmNsb3NpbmdPcGVyYXRpb24oRU9iamVjdCBvYmplY3QpCi0gIHsgCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE9wZXJhdGlvbikKLSAgICB7ICAgICAKLSAgICAgIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pb2JqZWN0OwotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnB1dCB8fAotICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIE91dHB1dCB8fAotICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pb2JqZWN0LmVDb250YWluZXIoKTsKLSAgICB9IAkgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfSAKLQkKLSAgcHJvdGVjdGVkIEVPYmplY3QgZ2V0TWVzc2FnZVJlZmVyZW5jZShFT2JqZWN0IG9iamVjdCkKLSAgeyAgICAgIAotICAgIHJldHVybiAob2JqZWN0IGluc3RhbmNlb2YgSW5wdXQgfHwKLSAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIE91dHB1dCB8fAotICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgRmF1bHQpID8gb2JqZWN0IDogbnVsbDsgIAotICB9CQotfSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0JpbmRpbmdzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0JpbmRpbmdzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWNlMzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9CaW5kaW5nc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIEJpbmRpbmdzR3JvdXBDb25uZWN0aW9uTWFuYWdlciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbk1hbmFnZXIKLXsgCi0gIHB1YmxpYyBCaW5kaW5nc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIoR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0KQotICB7Ci0gICAgc3VwZXIoZ3JvdXBFZGl0UGFydCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIAotICBjbGFzcyBJbnRlcm5hbFdTRExTd2l0Y2ggZXh0ZW5kcyBXU0RMU3dpdGNoCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChncm91cEVkaXRQYXJ0LmdldERlZmluaXRpb24oKSk7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoYmluZGluZyk7ICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmcpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZyk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gIAotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gICAgeyAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ0ZhdWx0KSk7IAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdGYXVsdCkpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZ0ZhdWx0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nSW5wdXQpKTsgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ0lucHV0KSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nSW5wdXQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ09wZXJhdGlvbikpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdPcGVyYXRpb24pKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nT3V0cHV0KSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ0JpbmRpbmcoYmluZGluZ091dHB1dCkpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZ091dHB1dCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBmYXVsdCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZUludGVyZmFjZUhlbHBlcihmYXVsdCk7IAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUlucHV0KElucHV0IGlucHV0KQotICAgIHsgCi0gICAgICAgICAgICAgICAgCi0gICAgICBoYW5kbGVJbnRlcmZhY2VIZWxwZXIoaW5wdXQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAKLSAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZU9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKSAKLSAgICB7ICAgICAgCi0gICAgICBoYW5kbGVJbnRlcmZhY2VIZWxwZXIob3BlcmF0aW9uKTsgICAgIAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9Ci0gICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gICAgeyAgCi0gICAgICBoYW5kbGVJbnRlcmZhY2VIZWxwZXIob3V0cHV0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZUludGVyZmFjZUhlbHBlcihwb3J0VHlwZSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gIAotCi0gICAgcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IHBvcnQpCi0gICAgeyAgICAgICAgICAKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGJpbmRpbmcpOyAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZyk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChiaW5kaW5nKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgQmluZGluZyBnZXRQcmV2aW91c01hdGNoaW5nQmluZGluZyhQb3J0VHlwZSBwb3J0VHlwZSkKLSAgICB7Ci0gICAgICBCaW5kaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBPYmplY3QgcHJldmlvdXNDb250ZXh0ID0gZ3JvdXBFZGl0UGFydC5nZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKTsKLSAgICAgIGlmIChwcmV2aW91c0NvbnRleHQgPT0gbnVsbCkgICAgICAKLSAgICAgIHsKLSAgICAgICAgcHJldmlvdXNDb250ZXh0ID0gZ3JvdXBFZGl0UGFydC5nZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoKTsKLSAgICAgIH0KLSAgICAgIGlmIChwcmV2aW91c0NvbnRleHQgaW5zdGFuY2VvZiBFT2JqZWN0KSAKLSAgICAgIHsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gZ2V0RW5jbG9zaW5nQmluZGluZygoRU9iamVjdClwcmV2aW91c0NvbnRleHQpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsICYmIGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCkgPT0gcG9ydFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBiaW5kaW5nOyAgCi0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUludGVyZmFjZUhlbHBlcihFT2JqZWN0IGludGVyZmFjZU9iamVjdCkKLSAgICB7ICAgCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBnZXRFbmNsb3NpbmdQb3J0VHlwZShpbnRlcmZhY2VPYmplY3QpOwotICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgYmluZGluZyA9IGdldFByZXZpb3VzTWF0Y2hpbmdCaW5kaW5nKHBvcnRUeXBlKTsgICAgIAotICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgTGlzdCBsaXN0ID0gdXRpbC5nZXRCaW5kaW5ncyhwb3J0VHlwZSk7Ci0gICAgICAgICAgYmluZGluZyA9IGxpc3Quc2l6ZSgpID4gMCA/IChCaW5kaW5nKWxpc3QuZ2V0KDApIDogbnVsbDsgIAotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChiaW5kaW5nKTsgICAKLSAgICAgICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGJpbmRpbmcpOyAgICAgCi0gICAgICAgICAgRU9iamVjdCBiaW5kaW5nT2JqZWN0ID0gdXRpbC5nZXRCaW5kaW5nT2JqZWN0KGludGVyZmFjZU9iamVjdCwgYmluZGluZyk7Ci0gICAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoYmluZGluZ09iamVjdCk7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChiaW5kaW5nID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRlZmF1bHRDYXNlKG51bGwpOwotICAgICAgfQotICAgIH0gICAKLSAgfSAgICAKLSAgICAKLSAgcHJvdGVjdGVkIFdTRExTd2l0Y2ggY3JlYXRlU3dpdGNoKGludCBzZWxlY3Rpb25UeXBlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBJbnRlcm5hbFdTRExTd2l0Y2goKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcHJvcGFnYXRlQmFja1RvUHJldmlvdXMoT2JqZWN0IG1vZGVsKQotICB7ICAgCi0gICAgc3VwZXIucHJvcGFnYXRlQmFja1RvUHJldmlvdXMoZ3JvdXBFZGl0UGFydC5nZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpKTsKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0NvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0NvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE0MTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Db21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBhbmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cGFydHMuQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckxheW91dDsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydAoteyAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE1FU1NBR0VfUExBQ0VfSE9MREVSID0gIk1FU1NBR0VfUExBQ0VfSE9MREVSIjsKLSAgcHJvdGVjdGVkIE9iamVjdCBpbnB1dDsgCi0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IG5ld0lucHV0KQotICB7Ci0gICAgaW5wdXQgPSBuZXdJbnB1dDsgIAotICAgIHNldE1vZGVsKGlucHV0KTsKLSAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsKLSAgICBQYW5lbCBwYW5lbCA9IG5ldyBQYW5lbCgpOwotICAgIHBhbmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDMwLCAzMCwgMzAsIDMwKSk7Ci0gICAgLy9wYW5lbC5zZXRCYWNrZ3JvdW5kQ29sb3IoR3JhcGhpY3NDb25zdGFudHMucmVkKTsKLSAgICAKLSAgICBDb250YWluZXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnRhaW5lckxheW91dCgpOwotICAgIGxheW91dC5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICBwYW5lbC5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0gICAgcmV0dXJuIHBhbmVsOwotICB9IAotICAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gbnVsbDsKLSAgICBpZiAobW9kZWwgPT0gTUVTU0FHRV9QTEFDRV9IT0xERVIpCi0gICAgewotICAgICAgZWRpdFBhcnQgPSBuZXcgTm90QXZhaWxhYmxlTWVzc2FnZUVkaXRQYXJ0KCk7Ci0gICAgICBlZGl0UGFydC5zZXRNb2RlbChtb2RlbCk7Ci0gICAgfSAKLSAgICBlbHNlCi0gICAgewotICAgICAgZWRpdFBhcnQgPSBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdFBhcnQodGhpcywgbW9kZWwpOwotICAgIH0KLSAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gIH0gIAotICAKLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgCi0gIHsgICAKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0LmFkZChpbnB1dCk7Ci0gICAgfSAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdC5hZGQoTUVTU0FHRV9QTEFDRV9IT0xERVIpOwotICAgIH0gICAgICAgCi0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAocHJvcGVydHkgPT0gTW9kZWxBZGFwdGVyLkNISUxEUkVOX1BST1BFUlRZKQotICAgIHsKLSAgICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBNb2RlbEFkYXB0ZXIuREVUQUlMX1BST1BFUlRZKQotICAgIHsgCi0gICAgICByZWZyZXNoVmlzdWFscygpOyAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICAgICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvRGVmaW5pdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3Y2Y4NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RlZmluaXRpb25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLlJvdW5kZWRMaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk9wZW5PblNlbGVjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkZpbGxMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBEZWZpbml0aW9uRWRpdFBhcnQgZXh0ZW5kcyBXU0RMRWRpdFBhcnQgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIC8vLCBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0gIHByb3RlY3RlZCBDb250YWluZXJGaWd1cmUgb3V0bGluZWQ7Ci0KLSAgcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSByaWdodENvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIHRvcENvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIG1pZGRsZUNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIGJvdHRvbUNvbnRlbnRQYW5lOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFID0gIlNFTEVDVEVEX0VESVRfUEFSVF9SRUZFUkVOQ0UiOwotCi0gIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkKLSAgewotICAgIHN1cGVyLmFjdGl2YXRlKCk7Ci0gICAgZ2V0Vmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0gIC8qKiAKLSAgICogQXBhcnQgZnJvbSB0aGUgZGVhY3RpdmF0aW9uIGRvbmUgaW4gc3VwZXIsIHRoZSBzb3VyY2UKLSAgICogYW5kIHRhcmdldCBjb25uZWN0aW9ucyBhcmUgZGVhY3RpdmF0ZWQsIGFuZCB0aGUgdmlzdWFsCi0gICAqIHBhcnQgb2YgdGhlIHRoaXMgaXMgcmVtb3ZlZC4KLSAgICoKLSAgICogQHNlZSAjYWN0aXZhdGUoKSAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKQotICB7Ci0gICAgZ2V0Vmlld2VyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlW10gaW5pdENvbnRlbnRQYW5lcygpCi0gIHsKLSAgICBJRmlndXJlW10gY29udGVudFBhbmVzID0gbmV3IElGaWd1cmVbNF07Ci0gICAgY29udGVudFBhbmVzWzBdID0gcmlnaHRDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbMV0gPSB0b3BDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbMl0gPSBtaWRkbGVDb250ZW50UGFuZTsKLSAgICBjb250ZW50UGFuZXNbM10gPSBib3R0b21Db250ZW50UGFuZTsKLSAgICByZXR1cm4gY29udGVudFBhbmVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIGludCBnZXRDb250ZW50UGFuZShPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLQotICAgIGlmIChtb2RlbCA9PSBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIFdTRExHcm91cE9iamVjdCBncm91cE9iamVjdCA9IChXU0RMR3JvdXBPYmplY3QpbW9kZWw7Ci0gICAgICBzd2l0Y2ggKGdyb3VwT2JqZWN0LmdldFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCA6Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlRZUEVTX0dST1VQIDoKLSAgICAgICAgICAvL2Nhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkJJTkRJTkdTX0dST1VQIDoKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVAgOgotICAgICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5QT1JUX1RZUEVTX0dST1VQIDoKLSAgICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuU0VSVklDRVNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVAgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBudWxsOwotICAgIGlmIChtb2RlbCA9PSBTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gbmV3IFBhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQoKTsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudCh0aGlzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gc3VwZXIuY3JlYXRlQ2hpbGQobW9kZWwpOwotICAgIH0KLSAgICByZXR1cm4gZWRpdFBhcnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgQ29udGFpbmVyRmlndXJlIG91dGVyID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIENvbnRhaW5lckxheW91dCBhbmNob3JlZExheW91dCA9IG5ldyBDb250YWluZXJMYXlvdXQoKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBpbnQgYWxpZ25GaWd1cmUoSUZpZ3VyZSBwYXJlbnQsIElGaWd1cmUgY2hpbGQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoY2hpbGQgPT0gb3V0bGluZWQpID8gMCA6IC0xOwotICAgICAgfQotICAgIH07Ci0gICAgb3V0ZXIuc2V0TGF5b3V0TWFuYWdlcihhbmNob3JlZExheW91dCk7Ci0gICAgLyoKLSAgICBDb250YWluZXJGaWd1cmUgb3V0ZXIgPSBuZXcgQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUodGhpcykKLSAgICB7Ci0gICAgICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkUGFydEVkaXRQYXJ0ICE9IG51bGwgPyBzZWxlY3RlZFBhcnRFZGl0UGFydC5nZXRGaWd1cmUoKSA6IHRoaXM7Ci0gICAgICB9ICAgICAgICAgICAgICAgCi0gICAgfTsqLwotICAgIG91dGVyLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwodHJ1ZSk7Ci0gICAgLy9vdXRlci5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCAyMCwgMCwgMCkpOwotCi0gICAgb3V0bGluZWQgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0ZXIuYWRkKG91dGxpbmVkKTsKLSAgICAvL291dGxpbmVkLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIG91dGxpbmVkLnNldExheW91dE1hbmFnZXIobmV3IEZpbGxMYXlvdXQoKSk7Ci0gICAgb3V0bGluZWQuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcigxLCA2KSk7Ci0gICAgb3V0bGluZWQuc2V0Rm9yZWdyb3VuZENvbG9yKGdyb3VwQm9yZGVyQ29sb3IpOwotCi0gICAgQ29udGFpbmVyRmlndXJlIHJpZ2h0UGFuZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICByaWdodFBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgMCwgMCwgMzAwKSk7Ci0gICAgcmlnaHRQYW5lLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIG91dGVyLmFkZChyaWdodFBhbmUpOwotCi0gICAgLy9SZWN0YW5nbGVGaWd1cmUgc3BhY2VyID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotICAgIC8vcmlnaHRQYW5lLmFkZChzcGFjZXIpOwotICAgIC8vc3BhY2VyLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbig0NTAsIDIwMCkpOwotCi0gICAgcmlnaHRDb250ZW50UGFuZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICByaWdodFBhbmUuYWRkKHJpZ2h0Q29udGVudFBhbmUpOwotICAgIHJpZ2h0Q29udGVudFBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMTUsIDIwLCAxNSwgMTUpKTsKLQotICAgIENvbnRhaW5lckZpZ3VyZSBsYWJlbEhvbGRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBvdXRsaW5lZC5hZGQobGFiZWxIb2xkZXIpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLSAgICBsYWJlbEhvbGRlci5hZGQobGFiZWwpOwotICAgIGxhYmVsLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIsIDUsIDAsIDUpKTsKLSAgICBsYWJlbC5zZXRGb250KG1lZGl1bUZvbnQpOwotICAgIGxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfREVGSU5JVElPTiIpKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgdG9wQ29udGVudFBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0bGluZWQuYWRkKHRvcENvbnRlbnRQYW5lKTsKLQotICAgIEZpbGxMYXlvdXQgZmlsbExheW91dCA9IG5ldyBGaWxsTGF5b3V0KDE1KTsKLSAgICBmaWxsTGF5b3V0LnNldEhvcml6b250YWwodHJ1ZSk7Ci0gICAgdG9wQ29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihmaWxsTGF5b3V0KTsKLSAgICB0b3BDb250ZW50UGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigxMCwgMTAsIDEwLCAxMCkpOwotCi0gICAgbWlkZGxlQ29udGVudFBhbmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gICAgb3V0bGluZWQuYWRkKG1pZGRsZUNvbnRlbnRQYW5lKTsKLSAgICBmaWxsTGF5b3V0ID0gbmV3IEZpbGxMYXlvdXQoMTUpOwotICAgIGZpbGxMYXlvdXQuc2V0SG9yaXpvbnRhbCh0cnVlKTsKLSAgICBtaWRkbGVDb250ZW50UGFuZS5zZXRMYXlvdXRNYW5hZ2VyKGZpbGxMYXlvdXQpOwotICAgIG1pZGRsZUNvbnRlbnRQYW5lLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsIDEwLCAxMCwgMTApKTsKLQotICAgIGJvdHRvbUNvbnRlbnRQYW5lID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIG91dGxpbmVkLmFkZChib3R0b21Db250ZW50UGFuZSk7Ci0gICAgYm90dG9tQ29udGVudFBhbmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBib3R0b21Db250ZW50UGFuZS5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigwLCAxMCwgMTAsIDEwKSk7Ci0KLSAgICByZXR1cm4gb3V0ZXI7Ci0gIH0KLQotICAvL3B1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkKLSAgLy97Ci0gIC8vICByZXR1cm4gY29udGVudFBhbmU7Ci0gIC8vfSAgIAotICBwdWJsaWMgUGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCBnZXRQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KCkKLSAgewotICAgIFBhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydClpLm5leHQoKTsKLSAgICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpID09IFNFTEVDVEVEX0VESVRfUEFSVF9SRUZFUkVOQ0UpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBHcm91cEVkaXRQYXJ0IGdldEdyb3VwRWRpdFBhcnQoaW50IHR5cGUpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0ID0gKEdyb3VwRWRpdFBhcnQpbzsKLSAgICAgICAgaWYgKGdyb3VwRWRpdFBhcnQuZ2V0VHlwZSgpID09IHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBncm91cEVkaXRQYXJ0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChTRUxFQ1RFRF9FRElUX1BBUlRfUkVGRVJFTkNFKTsKLSAgICBsaXN0LmFkZEFsbChzdXBlci5nZXRNb2RlbENoaWxkcmVuKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlT3BlblJlcXVlc3QoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQgPSBudWxsOwotICAgIGlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgSW1wb3J0KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbilnZXRNb2RlbCgpOwotICAgICAgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIoZGVmaW5pdGlvbik7Ci0gICAgICBoZWxwZXIub3BlbkVkaXRvcih0aGVJbXBvcnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSAoRWRpdFBhcnQpZWRpdFBhcnQuZ2V0UGFyZW50KCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBHcm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXBFZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KXBhcmVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZ3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgewotICAgICAgICBHcm91cEVkaXRQYXJ0IG5leHRHcm91cEVkaXRQYXJ0ID0gZ3JvdXBFZGl0UGFydC5nZXROZXh0KCk7Ci0gICAgICAgIGlmIChuZXh0R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG5leHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbiBpbnN0YW5jZW9mIFRyZWVOb2RlRWRpdFBhcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgKChUcmVlTm9kZUVkaXRQYXJ0KSAobmV4dEdyb3VwRWRpdFBhcnQuaW5wdXRDb25uZWN0aW9uKSkuc2V0RXhwYW5kZWQodHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEdyb3VwRWRpdFBhcnQgcHJldkdyb3VwRWRpdFBhcnQgPSBncm91cEVkaXRQYXJ0LmdldFByZXZpb3VzKCk7Ci0gICAgICAgIGlmIChwcmV2R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHByZXZHcm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24gaW5zdGFuY2VvZiBUcmVlTm9kZUVkaXRQYXJ0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgICgoVHJlZU5vZGVFZGl0UGFydCkgKHByZXZHcm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24pKS5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHVwZGF0ZUNvbm5lY3Rpb25zKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gIHsKLSAgICB1cGRhdGVDb25uZWN0aW9ucygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlQ29ubmVjdGlvbnMoKQotICB7Ci0gICAgLy8gdG9kbyAgICAgICAgIAotICAgIGlmIChpc0FjdGl2ZSgpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBmaW5hbCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHNlbGVjdGVkRWRpdFBhcnQgPSBnZXRTZWxlY3RlZEVkaXRQYXJ0KGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBncm91cCA9IGdldENvbnRhaW5pbmdHcm91cChzZWxlY3RlZEVkaXRQYXJ0KTsKLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwgJiYgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3RlZE1vZGVsT2JqZWN0KHNlbGVjdGVkRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIWlzQW5jZXN0b3IoZ2V0UGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCgpLCBzZWxlY3RlZEVkaXRQYXJ0KSkKLSAgICAgICAgewotICAgICAgICAgIGdyb3VwID0gZ2V0R3JvdXBFZGl0UGFydChXU0RMR3JvdXBPYmplY3QuUE9SVF9UWVBFU19HUk9VUCk7Ci0gICAgICAgICAgZ3JvdXAuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3RlZE1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0Q29udGFpbmluZ0dyb3VwKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsKLSAgICBHcm91cEVkaXRQYXJ0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkKLSAgICB7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEdyb3VwRWRpdFBhcnQpcGFyZW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBHcm91cEVkaXRQYXJ0IGdldE5leHRHcm91cEVkaXRQYXJ0KEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydCkKLSAgewotICAgIEdyb3VwRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBHcm91cEVkaXRQYXJ0IHByZXYgPSBudWxsOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEdyb3VwRWRpdFBhcnQpCi0gICAgICB7Ci0gICAgICAgIEdyb3VwRWRpdFBhcnQgZWRpdFBhcnQgPSAoR3JvdXBFZGl0UGFydClvOwotICAgICAgICBpZiAocHJldiA9PSBncm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZWRpdFBhcnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGVkaXRQYXJ0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgZ2V0UHJldmlvdXNHcm91cEVkaXRQYXJ0KEdyb3VwRWRpdFBhcnQgZ3JvdXBFZGl0UGFydCkKLSAgewotICAgIEdyb3VwRWRpdFBhcnQgcHJldiA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgR3JvdXBFZGl0UGFydCBlZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KW87Ci0gICAgICAgIGlmIChlZGl0UGFydCA9PSBncm91cEVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGVkaXRQYXJ0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJldjsKLSAgfQotCi0gIHByb3RlY3RlZCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldFNlbGVjdGVkRWRpdFBhcnQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBPYmplY3QgZmlyc3QgPSBzLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkKLSAgICAgIHsKLSAgICAgICAgZWRpdFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClmaXJzdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIHN1cGVyLnJlZnJlc2hDaGlsZHJlbigpOwotICAgIHVwZGF0ZUNvbm5lY3Rpb25zKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FuY2VzdG9yKEVkaXRQYXJ0IGFuY2VzdG9yLCBFZGl0UGFydCBjaGlsZCkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGFuY2VzdG9yICE9IG51bGwgJiYgY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEVkaXRQYXJ0IGVkaXRQYXJ0ID0gY2hpbGQ7IGVkaXRQYXJ0ICE9IG51bGw7IGVkaXRQYXJ0ID0gZWRpdFBhcnQuZ2V0UGFyZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlZGl0UGFydCA9PSBhbmNlc3RvcikKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9EcmlsbERvd25FZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RyaWxsRG93bkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjA3YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0RyaWxsRG93bkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkxvY2F0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotCi1wdWJsaWMgY2xhc3MgRHJpbGxEb3duRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBMYWJlbCBkcmlsbERvd25CdXR0b25MYWJlbDsgCi0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDsgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENvbnRhaW5lckZpZ3VyZSBmaWd1cmUgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7ICAKLSAgICBkcmlsbERvd25CdXR0b25MYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGRyaWxsRG93bkJ1dHRvbkxhYmVsLnNldEljb24oV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9mb3J3YXJkLmdpZiIpKTsKLSAgICBmaWd1cmUuYWRkKGRyaWxsRG93bkJ1dHRvbkxhYmVsKTsKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVU5LTk9XTiIpKTsKLSAgICAKLS8vICBldmlsIGhhY2sgdG8gcHJvdmlkZSB1bmRlcmxpbmVzCi0gICAgYm9vbGVhbiBpc0xpbnV4ID0gamF2YS5pby5GaWxlLnNlcGFyYXRvci5lcXVhbHMoIi8iKTsKLSAgICBpZiAoIWlzTGludXgpCi0gICAgewotICAgICAgRm9udCB1bmRlcmxpbmVGb250ID0gbmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJUYWhvbWEiLCA4LCBTV1QuTk9ORSk7IAotICAgICAgRm9udERhdGEgb2xkRGF0YSA9IHVuZGVybGluZUZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLSAgICAgIEZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKG9sZERhdGEuZ2V0TmFtZSgpLCBvbGREYXRhLmdldEhlaWdodCgpLCBTV1QuTk9ORSk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETy4uLiBjbGVhbiB0aGlzIGF3ZnVsIGNvZGUgdXAuLi4gd2Ugc2VlbSB0byBiZSBsZWFraW5nIGhlcmUgdG9vCi0gICAgICAgIC8vIHdlIGNhbid0IGNhbGwgdGhpcyBkaXJlY3RseSBzaW5jZSB0aGUgbWV0aG9kcyBhcmUgT1MgZGVwZW5kYW50Ci0gICAgICAgIC8vIGZvbnREYXRhLmRhdGEubGZVbmRlcmxpbmUgPSAxCi0gICAgICAgIC8vIHNvIGluc3RlYWQgd2UgdXNlIHJlZmxlY3Rpb24KLSAgICAgICAgT2JqZWN0IGRhdGEgPSBmb250RGF0YS5nZXRDbGFzcygpLmdldEZpZWxkKCJkYXRhIikuZ2V0KGZvbnREYXRhKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkYXRhIiArIGRhdGEuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgIGRhdGEuZ2V0Q2xhc3MoKS5nZXRGaWVsZCgibGZVbmRlcmxpbmUiKS5zZXRCeXRlKGRhdGEsIChieXRlKTEpOwotICAgICAgICBGb250IGZvbnQgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgZm9udERhdGEpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZvbnQpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7ICAgIAotICAgICAgfQotICAgIH0KLSAgICBmaWd1cmUuYWRkKGxhYmVsKTsKLSAgICAKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAgIAotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgCi0gIHsKLSAgCURyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgcG9saWN5ID0gbmV3IERyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3koKTsKLSAgICBpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBwb2xpY3kpOyAgICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KQotICB7ICAKLQkgIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCB8fAotICAgICAgICByZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9PUEVOKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpCi0gICAgICB7Ci0gICAgICAgIExvY2F0aW9uUmVxdWVzdCBsb2NhdGlvblJlcXVlc3QgPSAoTG9jYXRpb25SZXF1ZXN0KXJlcXVlc3Q7Ci0gICAgICAgIFBvaW50IHAgPSBsb2NhdGlvblJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChoaXRUZXN0KGRyaWxsRG93bkJ1dHRvbkxhYmVsLCBwKSB8fCBoaXRUZXN0KGxhYmVsLCBwKSkKLSAgICAgICAgewotICAJCSAgICBwZXJmb3JtRHJpbGxEb3duQWN0aW9uKCk7Ci0gICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfSAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkgCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0gCi0KLSAgcHVibGljIGJvb2xlYW4gaGl0VGVzdChJRmlndXJlIHRhcmdldCwgUG9pbnQgbG9jYXRpb24pCi0gIHsKLSAgICBSZWN0YW5nbGUgYiA9IHRhcmdldC5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0gICAgdGFyZ2V0LnRyYW5zbGF0ZVRvQWJzb2x1dGUoYik7ICAKLSAgICByZXR1cm4gYi5jb250YWlucyhsb2NhdGlvbik7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EcmlsbERvd25BY3Rpb24oKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7Ci0gICAgICAgICgoV1NETENvbXBvbmVudFZpZXdlcilnZXRWaWV3ZXIoKSkuc2V0SW5wdXQoZ2V0TW9kZWwoKSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotICB9Ci0gIAotICBwcml2YXRlIGNsYXNzIERyaWxsRG93bkVkaXRQYXJ0U2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kgZXh0ZW5kcyBTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSB7Ci0gIAkgcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpCi0gIAkgIHsgICAgICAgICAgICAgIAotICAJICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsgIAotICAJICAKLSAgCSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkKLSAgCSAgICB7Ci0gIAkgICAgICBHcmFwaGljYWxFZGl0UGFydCBncmFwaGljYWxFZGl0UGFydCA9IChHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydDsKLSAgCSAgICAgIElGaWd1cmUgZmlndXJlID0gZ3JhcGhpY2FsRWRpdFBhcnQuZ2V0RmlndXJlKCk7Ci0KLSAgCSAgICAgIE1vdmVIYW5kbGVMb2NhdG9yIGxvYyA9IG5ldyBNb3ZlSGFuZGxlTG9jYXRvcihmaWd1cmUpOyAgICAKLSAgCSAgICAgIE1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKGdyYXBoaWNhbEVkaXRQYXJ0LCBsb2MpOyAgICAgCi0gIAkgICAgICBsaXN0LmFkZChtb3ZlSGFuZGxlKTsKLSAgCSAgICB9Ci0KLSAgCSAgICByZXR1cm4gbGlzdDsKLSAgCSAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0V4dGVuc2libGVFZGl0UGFydEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9FeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYWFmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0V4dGVuc2libGVFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnlbXSBlZGl0UGFydEZhY3RvcmllczsKLQotICBwcm90ZWN0ZWQgc3RhdGljIEV4dGVuc2libGVFZGl0UGFydEZhY3RvcnkgaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgCi0gICAgICBpbnN0YW5jZSA9IG5ldyBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uRURJVF9QQVJUX0ZBQ1RPUlkpOyAKLSAgICBlZGl0UGFydEZhY3RvcmllcyA9IG5ldyBFZGl0UGFydEZhY3RvcnlbZXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZWRpdFBhcnRGYWN0b3JpZXNbaV0gPSAoRWRpdFBhcnRGYWN0b3J5KWV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uRURJVF9QQVJUX0ZBQ1RPUlksIG51bGwpOwotICAgIH0KLSAgfSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBnZXRBcHBsaWNhYmxlRWRpdFBhcnRGYWN0b3J5KE9iamVjdCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEVkaXRQYXJ0RmFjdG9yeSByZXN1bHQgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uc1tpXS5pc0FwcGxpY2FibGUob2JqZWN0KSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICA9IGVkaXRQYXJ0RmFjdG9yaWVzW2ldOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAJYm9vbGVhbiBiID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IHBhcmVudCwgT2JqZWN0IG1vZGVsKQotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgRWRpdFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSA9IGdldEFwcGxpY2FibGVFZGl0UGFydEZhY3RvcnkobW9kZWwpOwotICAgIGlmIChmYWN0b3J5ICE9IG51bGwpICAgCi0gICAgewotICAgICAgcmVzdWx0ID0gZmFjdG9yeS5jcmVhdGVFZGl0UGFydChwYXJlbnQsIG1vZGVsKTsKLSAgICB9ICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFVua25vd25PYmplY3RFZGl0UGFydCgpOwotICAgICAgcmVzdWx0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIHJlc3VsdC5zZXRQYXJlbnQocGFyZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Hcm91cEVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvR3JvdXBFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmYwNWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Hcm91cEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TY3JvbGxQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5WaWV3cG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVmlld3BvcnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuUm91bmRlZExpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuRmlsbExheW91dDsKLQotcHVibGljIGNsYXNzIEdyb3VwRWRpdFBhcnQgZXh0ZW5kcyBXU0RMRWRpdFBhcnQKLXsKLSAgcHJvdGVjdGVkIFNjcm9sbFBhbmUgc2Nyb2xscGFuZTsKLSAgcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCi0gIHByb3RlY3RlZCBPYmplY3QgZW1waGFzaXplZE1vZGVsT2JqZWN0OwotICBwcm90ZWN0ZWQgT2JqZWN0IGlucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0OwotICBwcm90ZWN0ZWQgT2JqZWN0IG91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdDsKLQotICBwdWJsaWMgV1NETFRyZWVOb2RlRWRpdFBhcnQgZW1waGFzaXplZEVkaXRQYXJ0OwotICBwdWJsaWMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBpbnB1dENvbm5lY3Rpb247Ci0gIHB1YmxpYyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IG91dHB1dENvbm5lY3Rpb247Ci0KLSAgcHVibGljIEdyb3VwRWRpdFBhcnQgbmV4dEdyb3VwRWRpdFBhcnQ7Ci0gIHB1YmxpYyBJQ29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXI7Ci0KLSAgcHJvdGVjdGVkIEludGVybmFsRmlndXJlTGlzdGVuZXIgZmlndXJlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxGaWd1cmVMaXN0ZW5lcigpOwotCi0gIGNsYXNzIEludGVybmFsRmlndXJlTGlzdGVuZXIgaW1wbGVtZW50cyBGaWd1cmVMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgZmlndXJlTW92ZWQoSUZpZ3VyZSBzb3VyY2UpCi0gICAgewotICAgICAgU2NhbGFibGVSb290RWRpdFBhcnQgcm9vdCA9IChTY2FsYWJsZVJvb3RFZGl0UGFydClnZXRWaWV3ZXIoKS5nZXRSb290RWRpdFBhcnQoKTsKLSAgICAgIHJvb3QuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuQ09OTkVDVElPTl9MQVlFUikucmVwYWludCgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KCkKLSAgewotICAgIHJldHVybiBlbXBoYXNpemVkTW9kZWxPYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiAoKFdTRExHcm91cE9iamVjdClnZXRNb2RlbCgpKS5nZXREZWZpbml0aW9uKCk7Ci0gIH0KLQotICAvL3Byb3RlY3RlZCB2b2lkIHNldEVtcGhhc2l6ZWRPYmplY3QoRWRpdFBhcnQgZWRpdFBhcnQpCi0gIC8veyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvLyAgVW5rbm93bk9iamVjdEVkaXRQYXJ0IGVwID0gbnVsbDsKLSAgLy8gIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFVua25vd25PYmplY3RFZGl0UGFydCkKLSAgLy8gIHsKLSAgLy8gICBlcCA9IChVbmtub3duT2JqZWN0RWRpdFBhcnQpZWRpdFBhcnQ7Ci0gIC8vICB9Ci0gIC8vCi0gIC8vICBpZiAoZW1waGFzaXplZEVkaXRQYXJ0ICE9IG51bGwpCi0gIC8vICB7Ci0gIC8vICAgIGVtcGhhc2l6ZWRFZGl0UGFydC5zZXRFbXBoYXNpemVkKGZhbHNlKTsKLSAgLy8gIH0KLSAgLy8gIGlmIChlcCAhPSBudWxsKQotICAvLyAgewotICAvLyAgICBlbXBoYXNpemVkRWRpdFBhcnQgPSBlcDsKLSAgLy8gICAgZW1waGFzaXplZEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWQodHJ1ZSk7Ci0gIC8vICB9Ci0gIC8vfSAgCi0KLSAgcHVibGljIHZvaWQgc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KE9iamVjdCBtb2RlbCkKLSAgewotICAgIGVtcGhhc2l6ZWRNb2RlbE9iamVjdCA9IG1vZGVsOwotCi0gICAgaWYgKGVtcGhhc2l6ZWRFZGl0UGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIGVtcGhhc2l6ZWRFZGl0UGFydC5zZXRFbXBoYXNpemVkKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldE1hdGNoaW5nQ2hpbGRFZGl0UGFydChtb2RlbCk7Ci0gICAgZW1waGFzaXplZEVkaXRQYXJ0ID0gKGVkaXRQYXJ0IGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQpID8gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KWVkaXRQYXJ0IDogbnVsbDsKLQotICAgIGlmIChlbXBoYXNpemVkRWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbXBoYXNpemVkRWRpdFBhcnQuc2V0RW1waGFzaXplZCh0cnVlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzY3JvbGxUb1JldmVhbEVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7Ci0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkKLSAgICB7Ci0gICAgICBzY3JvbGxUb0VkaXRQYXJ0KChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzY3JvbGxUb1JldmVhbElucHV0Q29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAoaW5wdXRDb25uZWN0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgc2Nyb2xsVG9FZGl0UGFydChpbnB1dENvbm5lY3Rpb24pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNjcm9sbFRvUmV2ZWFsT3V0cHV0Q29ubmVjdGlvbigpCi0gIHsKLSAgICBpZiAob3V0cHV0Q29ubmVjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHNjcm9sbFRvRWRpdFBhcnQob3V0cHV0Q29ubmVjdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgaW5wdXRDb25uZWN0aW9uID0gZ2V0TWF0Y2hpbmdDaGlsZEVkaXRQYXJ0KG1vZGVsKTsKLSAgICBpbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCA9IG1vZGVsOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gaW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Q7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpCi0gIHsKLSAgICByZXR1cm4gb3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KE9iamVjdCBtb2RlbCkKLSAgewotICAgIG91dHB1dENvbm5lY3Rpb24gPSBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQobW9kZWwpOwotICAgIG91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCA9IG1vZGVsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29ubmVjdGlvbk1hbmFnZXIoKQotICB7Ci0gICAgc3dpdGNoIChnZXRUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVAgOgotICAgICAgICB7Ci0gICAgICAgICAgY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgTWVzc2FnZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyKHRoaXMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5TRVJWSUNFU19HUk9VUCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBjb25uZWN0aW9uTWFuYWdlciA9IG5ldyBTZXJ2aWNlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIodGhpcyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LkJJTkRJTkdTX0dST1VQIDoKLSAgICAgICAgewotICAgICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IEJpbmRpbmdzR3JvdXBDb25uZWN0aW9uTWFuYWdlcih0aGlzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuUE9SVF9UWVBFU19HUk9VUCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBjb25uZWN0aW9uTWFuYWdlciA9IG5ldyBQb3J0VHlwZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyKHRoaXMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIElDb25uZWN0aW9uTWFuYWdlciBnZXRDb25uZWN0aW9uTWFuYWdlcigpCi0gIHsKLSAgICByZXR1cm4gY29ubmVjdGlvbk1hbmFnZXI7Ci0gIH0KLQotICBwdWJsaWMgQ29udGFpbmVyRmlndXJlIG91dGVyUGFuZTsKLQotICBwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7Ci0gICAgY3JlYXRlQ29ubmVjdGlvbk1hbmFnZXIoKTsKLQotICAgIG91dGVyUGFuZSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBvdXRlclBhbmUuc2V0Qm9yZGVyKG5ldyBSb3VuZGVkTGluZUJvcmRlcigxLCA2KSk7Ci0gICAgb3V0ZXJQYW5lLnNldEZvcmVncm91bmRDb2xvcihncm91cEJvcmRlckNvbG9yKTsKLQotICAgIENvbnRhaW5lckZpZ3VyZSByID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIC8vci5zZXRDb3JuZXJEaW1lbnNpb25zKG5ldyBEaW1lbnNpb24oNCwgNCkpOyAgIAotICAgIHIuc2V0T3V0bGluZShmYWxzZSk7Ci0gICAgci5zZXRNaW5pbXVtU2l6ZShuZXcgRGltZW5zaW9uKDAsIDApKTsKLQotICAgIHIuc2V0RmlsbCh0cnVlKTsKLQotICAgIHIuc2V0QmFja2dyb3VuZENvbG9yKGdyb3VwSGVhZGVyQ29sb3IpOwotICAgIG91dGVyUGFuZS5hZGQocik7Ci0KLSAgICAvL0NvbnRhaW5lckZpZ3VyZSBsYWJlbEhvbGRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vbGFiZWxIb2xkZXIuYWRkKGxhYmVsKTsKLSAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgbGFiZWwuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMiwgNCwgMiwgNCkpOwotICAgIHIuYWRkKGxhYmVsKTsgLy9Ib2xkZXIpOwotCi0gICAgUmVjdGFuZ2xlRmlndXJlIGxpbmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0gICAgbGluZS5zZXRQcmVmZXJyZWRTaXplKDIwLCAxKTsKLSAgICBvdXRlclBhbmUuYWRkKGxpbmUpOwotCi0gICAgaW50IG1pbkhlaWdodCA9IDI1MDsKLSAgICBzd2l0Y2ggKGdldFR5cGUoKSkKLSAgICB7Ci0gICAgCWNhc2UgV1NETEdyb3VwT2JqZWN0LklNUE9SVFNfR1JPVVAgOgotCQljYXNlIFdTRExHcm91cE9iamVjdC5UWVBFU19HUk9VUCA6Ci0JCXsKLQkJCW1pbkhlaWdodCA9IDUwOwotCQkJYnJlYWs7CQotCQl9Ci0JCWNhc2UgV1NETEdyb3VwT2JqZWN0LkVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVAgOgotCQl7Ci0JCQltaW5IZWlnaHQgPSAxNTA7Ci0JCQlicmVhazsKLQkJfQotICAgIH0KLQotCWZpbmFsIGludCB0aGVNaW5IZWlnaHQgPSBtaW5IZWlnaHQ7Ci0gICAgRmlsbExheW91dCBvdXRlckxheW91dCA9IG5ldyBGaWxsTGF5b3V0KCkKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVByZWZlcnJlZFNpemUoSUZpZ3VyZSBwYXJlbnQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICAgIHsKLSAgICAgICAgRGltZW5zaW9uIGQgPSBzdXBlci5jYWxjdWxhdGVQcmVmZXJyZWRTaXplKHBhcmVudCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGQudW5pb24obmV3IERpbWVuc2lvbigxMDAsIHRoZU1pbkhlaWdodCkpOwotICAgICAgICByZXR1cm4gZDsKLSAgICAgIH0KLSAgICB9OwotICAgIG91dGVyTGF5b3V0LnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIC8vbGF5b3V0LnNldFNwYWNpbmcoNSk7Ci0gICAgb3V0ZXJQYW5lLnNldExheW91dE1hbmFnZXIob3V0ZXJMYXlvdXQpOwotCi0gICAgc2Nyb2xscGFuZSA9IG5ldyBTY3JvbGxQYW5lKCk7Ci0gICAgc2Nyb2xscGFuZS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIHNjcm9sbHBhbmUuc2V0VmVydGljYWxTY3JvbGxCYXJWaXNpYmlsaXR5KFNjcm9sbFBhbmUuQVVUT01BVElDKTsgLy9TY3JvbGxQYW5lLkFMV0FZUyk7Ci0gICAgb3V0ZXJQYW5lLmFkZChzY3JvbGxwYW5lKTsKLQotICAgIENvbnRhaW5lckZpZ3VyZSBwYW5lID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIHBhbmUuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoNSwgOCwgNSwgOCkpOwotICAgIENvbnRhaW5lckxheW91dCBsYXlvdXQgPSBuZXcgQ29udGFpbmVyTGF5b3V0KCk7Ci0gICAgbGF5b3V0LnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIGxheW91dC5zZXRTcGFjaW5nKDApOwotICAgIHBhbmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCi0gICAgVmlld3BvcnQgdmlld3BvcnQgPSBuZXcgVmlld3BvcnQoKTsKLSAgICB2aWV3cG9ydC5zZXRDb250ZW50c1RyYWNrc0hlaWdodCh0cnVlKTsKLSAgICBWaWV3cG9ydExheW91dCB2aWV3cG9ydExheW91dCA9IG5ldyBWaWV3cG9ydExheW91dCgpCi0gICAgewotICAgICAgcHJvdGVjdGVkIERpbWVuc2lvbiBjYWxjdWxhdGVQcmVmZXJyZWRTaXplKElGaWd1cmUgcGFyZW50LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi0gICAgICB7Ci0gICAgICAgIERpbWVuc2lvbiBkID0gc3VwZXIuY2FsY3VsYXRlUHJlZmVycmVkU2l6ZShwYXJlbnQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBkLmhlaWdodCA9IE1hdGgubWluKGQuaGVpZ2h0LCB0aGVNaW5IZWlnaHQgLSAyNSk7IC8vZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLmhlaWdodCk7Ci0gICAgICAgIHJldHVybiBkOwotICAgICAgfQotICAgIH07Ci0gICAgdmlld3BvcnQuc2V0TGF5b3V0TWFuYWdlcih2aWV3cG9ydExheW91dCk7Ci0KLSAgICBzY3JvbGxwYW5lLnNldFZpZXdwb3J0KHZpZXdwb3J0KTsKLSAgICBzY3JvbGxwYW5lLnNldENvbnRlbnRzKHBhbmUpOwotICAgIHBhbmUuYWRkRmlndXJlTGlzdGVuZXIoZmlndXJlTGlzdGVuZXIpOwotCi0gICAgcmV0dXJuIG91dGVyUGFuZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKGdldE1vZGVsKCkpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgbGFiZWwuc2V0VGV4dCgoU3RyaW5nKWFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwgTW9kZWxBZGFwdGVyLkxBQkVMX1BST1BFUlRZKSk7Ci0gICAgICAvL2xhYmVsLnNldEljb24oKEltYWdlKWFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwgTW9kZWxBZGFwdGVyLklNQUdFX1BST1BFUlRZKSk7Ci0gICAgfQotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gc2Nyb2xscGFuZS5nZXRDb250ZW50cygpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2Nyb2xsVG9FZGl0UGFydChmaW5hbCBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0KQotICB7Ci0gICAgUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgc2Nyb2xsVG9FZGl0UGFydEhlbHBlcih0YXJnZXRFZGl0UGFydCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzY3JvbGxUb0VkaXRQYXJ0SGVscGVyKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQpCi0gIHsKLSAgICBpZiAodGFyZ2V0RWRpdFBhcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBSZWN0YW5nbGUgcjEgPSB0YXJnZXRFZGl0UGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICAgIFJlY3RhbmdsZSByMiA9IGdldENvbnRlbnRQYW5lKCkuZ2V0Qm91bmRzKCk7Ci0gICAgICBzY3JvbGxwYW5lLnNjcm9sbFZlcnRpY2FsVG8oKHIxLnkgLSByMi55KSAtIHNjcm9sbHBhbmUuZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gMik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0TWF0Y2hpbmdDaGlsZEVkaXRQYXJ0KE9iamVjdCBtb2RlbCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXREZWZpbml0aW9uKCk7Ci0gICAgZm9yIChPYmplY3QgbyA9IG1vZGVsOyBvICE9IG51bGwgJiYgIShvIGluc3RhbmNlb2YgRGVmaW5pdGlvbik7IG8gPSBnZXRQYXJlbnQobykpCi0gICAgewotICAgICAgbGlzdC5hZGQoMCwgbyk7Ci0gICAgfQotICAgIHJldHVybiBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQodGhpcywgbGlzdCwgMCwgdHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBPYmplY3QgcGFyZW50ID0gbnVsbDsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIHBhcmVudCA9ICgoRU9iamVjdCltb2RlbCkuZUNvbnRhaW5lcigpOwotICAgIH0KLSAgICByZXR1cm4gcGFyZW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0TWF0Y2hpbmdDaGlsZEVkaXRQYXJ0KEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQsIExpc3QgbGlzdCwgaW50IGluZGV4LCBib29sZWFuIGdldFVuZXhwYW5kZWRQYXJlbnQpCi0gIHsKLSAgICBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJlc3VsdCA9IChnZXRVbmV4cGFuZGVkUGFyZW50ICYmIGVkaXRQYXJ0ICE9IHRoaXMpID8gZWRpdFBhcnQgOiBudWxsOwotICAgIE9iamVjdCBtb2RlbCA9IGxpc3Quc2l6ZSgpID4gaW5kZXggPyBsaXN0LmdldChpbmRleCkgOiBudWxsOwotICAgIGlmIChtb2RlbCAhPSBudWxsICYmIGVkaXRQYXJ0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydClpLm5leHQoKTsKLSAgICAgICAgaWYgKGNoaWxkLmdldE1vZGVsKCkgPT0gbW9kZWwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBjaGlsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZXgrKzsKLSAgICAgIGlmIChpbmRleCA8IGxpc3Quc2l6ZSgpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRNYXRjaGluZ0NoaWxkRWRpdFBhcnQocmVzdWx0LCBsaXN0LCBpbmRleCwgZ2V0VW5leHBhbmRlZFBhcmVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuICgoV1NETEdyb3VwT2JqZWN0KWdldE1vZGVsKCkpLmdldFR5cGUoKTsKLSAgfQotCi0gIHB1YmxpYyBHcm91cEVkaXRQYXJ0IGdldE5leHQoKQotICB7Ci0gICAgcmV0dXJuICgoRGVmaW5pdGlvbkVkaXRQYXJ0KWdldFBhcmVudCgpKS5nZXROZXh0R3JvdXBFZGl0UGFydCh0aGlzKTsKLSAgfQotCi0gIHB1YmxpYyBHcm91cEVkaXRQYXJ0IGdldFByZXZpb3VzKCkKLSAgewotICAgIHJldHVybiAoKERlZmluaXRpb25FZGl0UGFydClnZXRQYXJlbnQoKSkuZ2V0UHJldmlvdXNHcm91cEVkaXRQYXJ0KHRoaXMpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9yZWZyZXNoQ2hpbGRyZW4oKQotICB7Ci0gICAgaW50IGk7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0gICAgT2JqZWN0IG1vZGVsOwotCi0gICAgTWFwIG1vZGVsVG9FZGl0UGFydCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgZWRpdFBhcnQgPSAoRWRpdFBhcnQpY2hpbGRyZW4uZ2V0KGkpOwotICAgICAgbW9kZWxUb0VkaXRQYXJ0LnB1dChlZGl0UGFydC5nZXRNb2RlbCgpLCBlZGl0UGFydCk7Ci0gICAgfQotCi0gICAgTGlzdCBtb2RlbE9iamVjdHMgPSBnZXRNb2RlbENoaWxkcmVuKCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbW9kZWxPYmplY3RzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIG1vZGVsID0gbW9kZWxPYmplY3RzLmdldChpKTsKLQotICAgICAgLy9EbyBhIHF1aWNrIGNoZWNrIHRvIHNlZSBpZiBlZGl0UGFydFtpXSA9PSBtb2RlbFtpXQotICAgICAgaWYgKGkgPCBjaGlsZHJlbi5zaXplKCkpCi0gICAgICB7Ci0gICAgICAgIGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpKTsKLSAgICAgICAgT2JqZWN0IGVkaXRQYXJ0TW9kZWwgPSBlZGl0UGFydC5nZXRNb2RlbCgpOwotICAgICAgICBpZiAoZWRpdFBhcnRNb2RlbCA9PSBtb2RlbCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGVkaXRQYXJ0TW9kZWwuZ2V0Q2xhc3MoKSA9PSBtb2RlbC5nZXRDbGFzcygpKQotICAgICAgICB7Ci0gICAgICAgICAgbW9kZWxUb0VkaXRQYXJ0LnJlbW92ZShlZGl0UGFydE1vZGVsKTsKLQotICAgICAgICAgIGlmIChpc0FjdGl2ZSgpKQotICAgICAgICAgICAgZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCi0gICAgICAgICAgZWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotCi0gICAgICAgICAgaWYgKGlzQWN0aXZlKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZWRpdFBhcnQuYWN0aXZhdGUoKTsKLSAgICAgICAgICAgIGVkaXRQYXJ0LnJlZnJlc2goKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy9Mb29rIHRvIHNlZSBpZiB0aGUgRWRpdFBhcnQgaXMgYWxyZWFkeSBhcm91bmQgYnV0IGluIHRoZSB3cm9uZyBsb2NhdGlvbgotICAgICAgZWRpdFBhcnQgPSAoRWRpdFBhcnQpbW9kZWxUb0VkaXRQYXJ0LmdldChtb2RlbCk7Ci0KLSAgICAgIGlmIChlZGl0UGFydCAhPSBudWxsKQotICAgICAgICByZW9yZGVyQ2hpbGQoZWRpdFBhcnQsIGkpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL0FuIGVkaXRwYXJ0IGZvciB0aGlzIG1vZGVsIGRvZXNuJ3QgZXhpc3QgeWV0LiAgQ3JlYXRlIGFuZCBpbnNlcnQgb25lLgotICAgICAgICBlZGl0UGFydCA9IGNyZWF0ZUNoaWxkKG1vZGVsKTsKLSAgICAgICAgYWRkQ2hpbGQoZWRpdFBhcnQsIGkpOwotICAgICAgfQotICAgIH0KLSAgICBMaXN0IHRyYXNoID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspCi0gICAgICB0cmFzaC5hZGQoY2hpbGRyZW4uZ2V0KGkpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdHJhc2guc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgRWRpdFBhcnQgZXAgPSAoRWRpdFBhcnQpdHJhc2guZ2V0KGkpOwotICAgICAgcmVtb3ZlQ2hpbGQoZXApOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbigpCi0gIHsKLSAgICBib29sZWFuIHJldXNlQ2hpbGRyZW4gPSBmYWxzZTsKLSAgICBpZiAoZ2V0Vmlld2VyKCkgaW5zdGFuY2VvZiBXU0RMQ29tcG9uZW50Vmlld2VyKQotICAgIHsKLSAgICAgIFdTRExDb21wb25lbnRWaWV3ZXIgd3NkbENvbXBvbmVudFZpZXdlciA9IChXU0RMQ29tcG9uZW50Vmlld2VyKWdldFZpZXdlcigpOwotICAgICAgcmV1c2VDaGlsZHJlbiA9IHdzZGxDb21wb25lbnRWaWV3ZXIuaXNQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQoKTsKLSAgICB9Ci0KLSAgICBpZiAocmV1c2VDaGlsZHJlbikKLSAgICB7Ci0gICAgICBfcmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvSUNvbm5lY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvSUNvbm5lY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMGQwYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL0lDb25uZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3Rpb25NYW5hZ2VyCi17IAotICBwdWJsaWMgdm9pZCBwcm9wYWdhdGVGb3J3YXJkKE9iamVjdCBtb2RlbCk7Ci0gIHB1YmxpYyB2b2lkIHByb3BhZ2F0ZUJhY2soT2JqZWN0IG1vZGVsKTsKLSAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRNb2RlbE9iamVjdChPYmplY3QgbW9kZWwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JRmVlZGJhY2tIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvSUZlZWRiYWNrSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFjMmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9JRmVlZGJhY2tIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLQotcHVibGljIGludGVyZmFjZSBJRmVlZGJhY2tIYW5kbGVyCi17Ci0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCk7Ci0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCk7Ci19ICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTWVzc2FnZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTWVzc2FnZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMTQ1NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL01lc3NhZ2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExTd2l0Y2g7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIE1lc3NhZ2VzR3JvdXBDb25uZWN0aW9uTWFuYWdlciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbk1hbmFnZXIKLXsgCi0gIHB1YmxpYyBNZXNzYWdlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIoR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0KQotICB7Ci0gICAgc3VwZXIoZ3JvdXBFZGl0UGFydCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgCi0gIGNsYXNzIEludGVybmFsV1NETFN3aXRjaCBleHRlbmRzIFdTRExTd2l0Y2gKLSAgeyAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IGZhdWx0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChmYXVsdC5nZXRFTWVzc2FnZSgpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZmF1bHQuZ2V0RU1lc3NhZ2UoKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRGaXJzdFBhcnQoZmF1bHQuZ2V0RU1lc3NhZ2UoKSkpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUlucHV0KElucHV0IGlucHV0KQotICAgIHsgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChpbnB1dC5nZXRFTWVzc2FnZSgpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoaW5wdXQuZ2V0RU1lc3NhZ2UoKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRGaXJzdFBhcnQoaW5wdXQuZ2V0RU1lc3NhZ2UoKSkpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICAgIHsgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QobWVzc2FnZSk7ICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobWVzc2FnZSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRGaXJzdFBhcnQobWVzc2FnZSkpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb3V0cHV0KQotICAgIHsgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3Qob3V0cHV0LmdldEVNZXNzYWdlKCkpOyAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG91dHB1dC5nZXRFTWVzc2FnZSgpKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGdldEZpcnN0UGFydChvdXRwdXQuZ2V0RU1lc3NhZ2UoKSkpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VQYXJ0KFBhcnQgcGFydCkKLSAgICB7ICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KHBhcnQuZUNvbnRhaW5lcigpKTsgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChwYXJ0LmVDb250YWluZXIoKSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChwYXJ0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAKLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChudWxsKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgIAotCi0gICAgcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpCi0gICAgewotICAgICAgT2JqZWN0IHJlc3VsdCA9IHN1cGVyLmRvU3dpdGNoKHRoZUVPYmplY3QpOwotICAgICAgKChEZWZpbml0aW9uRWRpdFBhcnQpZ3JvdXBFZGl0UGFydC5nZXRQYXJlbnQoKSkuZ2V0UGFydFJlZmVyZW5jZVNlY3Rpb25FZGl0UGFydCgpLnNldElucHV0KGdyb3VwRWRpdFBhcnQuZ2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KCkpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgV1NETFN3aXRjaCBjcmVhdGVTd2l0Y2goaW50IHNlbGVjdGlvblR5cGUpCi0gIHsKLSAgICByZXR1cm4gbmV3IEludGVybmFsV1NETFN3aXRjaCgpOwotICB9ICAgCi0KLSAgcHJvdGVjdGVkIFBhcnQgZ2V0Rmlyc3RQYXJ0KE1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAgICAgICAgICAgCi0gICAgUGFydCByZXN1bHQgPSBudWxsOwotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgeyAgICAKLSAgICAgIExpc3QgcGFydHMgPSBtZXNzYWdlLmdldEVQYXJ0cygpOwotICAgICAgcmVzdWx0ID0gKHBhcnRzLnNpemUoKSA+IDApID8gKFBhcnQpcGFydHMuZ2V0KDApIDogbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcHJvcGFnYXRlQmFja1RvUHJldmlvdXMoT2JqZWN0IG1vZGVsKQotICB7ICAJCi0gIAltb2RlbCA9IChtb2RlbCBpbnN0YW5jZW9mIFBhcnQpID8oKFBhcnQpbW9kZWwpLmVDb250YWluZXIoKSA6IG1vZGVsOyAKLSAgICBzdXBlci5wcm9wYWdhdGVCYWNrVG9QcmV2aW91cyhtb2RlbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTm90QXZhaWxhYmxlTWVzc2FnZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvTm90QXZhaWxhYmxlTWVzc2FnZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGE1MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL05vdEF2YWlsYWJsZU1lc3NhZ2VFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBOb3RBdmFpbGFibGVNZXNzYWdlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IAoteyAgICAgICAgICAgIAotICBwdWJsaWMgTm90QXZhaWxhYmxlTWVzc2FnZUVkaXRQYXJ0KCkKLSAgewotICB9ICAgCi0gIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1ZJRVdfTk9UX0FWQUlMQUJMRSIpKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0gICAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gIH0gICAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsgIAotICB9ICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1BhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9QYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjhkZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1BhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuQ29udGFpbmVyRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIFBhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIKLXsgCi0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDb250YWluZXJGaWd1cmUgb3V0ZXIgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7IAotICAgIHJldHVybiBvdXRlcjsKLSAgfSAKLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihpbnB1dCwgdGhpcyk7Ci0JICByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihkZWZpbml0aW9uLCB0aGlzKTsKLSAgICB9Ci0gICAgaW5wdXQgPSBvYmplY3Q7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoaW5wdXQsIHRoaXMpOwotCSAgZGVmaW5pdGlvbiA9IGdldFBhcmVudCgpICE9IG51bGwgPyAoRGVmaW5pdGlvbilnZXRQYXJlbnQoKS5nZXRNb2RlbCgpIDogbnVsbDsKLSAgICAgIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKGRlZmluaXRpb24sIHRoaXMpOwotICAgIH0KLSAgICByZWZyZXNoKCk7Ci0gICAgZ2V0RmlndXJlKCkucmVwYWludCgpOwotICB9Ci0gIAotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSAKLQkgIHsgICAgICAgCi0JCSAgaWYgKGlucHV0ICE9IG51bGwpCi0JCSAgeyAJCi0JICAgICAgICByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihpbnB1dCwgdGhpcyk7Ci0JICAgICAgICByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihkZWZpbml0aW9uLCB0aGlzKTsKLQkJICB9ICAKLQkJCXN1cGVyLmRlYWN0aXZhdGUoKTsgCi0JCX0gIAotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSAKLSAgeyAKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClpbnB1dDsKLSAgICAgIE9iamVjdCBjb21wb25lbnQgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpIAotICAgICAgewotICAgICAgICAvLyBUT0RPLi4uIGknbSBwdWxsaW5nIGEgZmFzdCBvbmUgaGVyZS4uLi4gd2Ugc2hvdWxkIGNhbGwgdGhlIGV4dGVuc2lvbgotICAgICAgICAvLyB0byBzZWUgaWYgaGUgd2FudHMgdG8gc2hvdyBhIGNoaWxkIGhlcmUKLSAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChjb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRoaXMgaXMgYmVmb3JlIHRoZSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzZGwgbW9kZWwKLSAgICAgICAgLy8gd2hlcmUgaXQgaGFuZGxlZCBET00gbm9kZXMKLSAgICAgICAgLy8gY29tcG9uZW50ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIGlmIChlZCAhPSBudWxsICYmIGVkLmdldENvbnRhaW5lcigpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChlZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSAKLSAgewotICB9ICAgICAgIAotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpIAotICB7Ci0gICAgcmV0dXJuIGdldEVkaXRQYXJ0RmFjdG9yeSgpLmNyZWF0ZUVkaXRQYXJ0KHRoaXMsIG1vZGVsKTsKLSAgfSAKLQotICBwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlciBnZXRNb2RlbEFkYXB0ZXIoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICB9IAotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihPYmplY3QgbW9kZWxPYmplY3QsIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9ICAKLQotfSAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Qb3J0VHlwZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvUG9ydFR5cGVzR3JvdXBDb25uZWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjUyMGUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Qb3J0VHlwZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBQb3J0VHlwZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uTWFuYWdlcgoteyAKLSAgcHVibGljIFBvcnRUeXBlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIoR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0KQotICB7Ci0gICAgc3VwZXIoZ3JvdXBFZGl0UGFydCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIAotICBjbGFzcyBJbnRlcm5hbFdTRExTd2l0Y2ggZXh0ZW5kcyBXU0RMU3dpdGNoCi0gIHsgICAgICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQmluZGluZ0dyb3VwU2hvd2luZygpCi0gICAgewotICAgICAgR3JvdXBFZGl0UGFydCBwcmV2R3JvdXBFZGl0UGFydCA9IGdyb3VwRWRpdFBhcnQuZ2V0UHJldmlvdXMoKTsKLSAgICAgIHJldHVybiBwcmV2R3JvdXBFZGl0UGFydCAgIT0gbnVsbCAmJiBwcmV2R3JvdXBFZGl0UGFydC5nZXRUeXBlKCkgPT0gV1NETEdyb3VwT2JqZWN0LkJJTkRJTkdTX0dST1VQOwotICAgIH0gCi0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE9iamVjdCBwb3J0VHlwZSA9IGdldFBvcnRUeXBlRm9yQmluZGluZ09iamVjdChiaW5kaW5nKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KHBvcnRUeXBlKTsgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QocG9ydFR5cGUpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gIAotCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldFBvcnRUeXBlRm9yQmluZGluZ09iamVjdChiaW5kaW5nRmF1bHQpKTsKLSAgICAgIEZhdWx0IGZhdWx0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlRmF1bHQoYmluZGluZ0ZhdWx0KTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZmF1bHQpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZmF1bHQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpCi0gICAgeyAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldFBvcnRUeXBlRm9yQmluZGluZ09iamVjdChiaW5kaW5nSW5wdXQpKTsgCi0gICAgICBJbnB1dCBpbnB1dCA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZUlucHV0KGJpbmRpbmdJbnB1dCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGlucHV0KTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGlucHV0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRQb3J0VHlwZUZvckJpbmRpbmdPYmplY3QoYmluZGluZ09wZXJhdGlvbikpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbikpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0KQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChnZXRQb3J0VHlwZUZvckJpbmRpbmdPYmplY3QoYmluZGluZ091dHB1dCkpOwotICAgICAgT3V0cHV0IG91dHB1dCA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZU91dHB1dChiaW5kaW5nT3V0cHV0KTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3V0cHV0KTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG91dHB1dCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBmYXVsdCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nUG9ydFR5cGUoZmF1bHQpKTsgICAKLSAgICAgIGlmIChpc0JpbmRpbmdHcm91cFNob3dpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChmYXVsdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nUG9ydFR5cGUoZmF1bHQpKTsKLSAgICAgIH0KLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGZhdWx0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAKLSAgICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBpbnB1dCkKLSAgICB7ICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nUG9ydFR5cGUoaW5wdXQpKTsgICAKLSAgICAgIGlmIChpc0JpbmRpbmdHcm91cFNob3dpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChpbnB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nUG9ydFR5cGUoaW5wdXQpKTsKLSAgICAgIH0KLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KGlucHV0KTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgCi0gICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gICAgewotICAgICAgT2JqZWN0IHByZXZpb3VzQ29udGV4dCA9IGdyb3VwRWRpdFBhcnQuZ2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KCk7Ci0gICAgICBpZiAocHJldmlvdXNDb250ZXh0ID09IG51bGwpICAgICAgCi0gICAgICB7Ci0gICAgICAgIHByZXZpb3VzQ29udGV4dCA9IGdyb3VwRWRpdFBhcnQuZ2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIEVPYmplY3QgbWVzc2FnZVJlZmVyZW5jZSA9IG51bGw7ICAgICAgCi0gICAgICBpZiAocHJldmlvdXNDb250ZXh0ID09IG51bGwgfHwgcHJldmlvdXNDb250ZXh0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICAgIHsKLSAgICAgIG1lc3NhZ2VSZWZlcmVuY2UgPSBnZXRNZXNzYWdlUmVmZXJlbmNlKG1lc3NhZ2UsIChFT2JqZWN0KXByZXZpb3VzQ29udGV4dCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtZXNzYWdlUmVmZXJlbmNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGRvU3dpdGNoKG1lc3NhZ2VSZWZlcmVuY2UpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgZGVmYXVsdENhc2UobnVsbCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gIAotICAgICAgICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pIAotICAgIHsgICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KGdldEVuY2xvc2luZ1BvcnRUeXBlKG9wZXJhdGlvbikpOwotICAgICAgaWYgKGlzQmluZGluZ0dyb3VwU2hvd2luZygpKQotICAgICAgewotICAgICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG9wZXJhdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3BlcmF0aW9uKSk7Ci0gICAgICB9Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsgICAgICAKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb3V0cHV0KQotICAgIHsgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3V0cHV0KSk7ICAgCi0gICAgICBpZiAoaXNCaW5kaW5nR3JvdXBTaG93aW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0SW5wdXRDb25uZWN0aW9uTW9kZWxPYmplY3Qob3V0cHV0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChnZXRFbmNsb3NpbmdQb3J0VHlwZShvdXRwdXQpKTsKLSAgICAgIH0KLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG91dHB1dCk7ICAKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgIHsgCi0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChwb3J0VHlwZSk7IAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChwb3J0VHlwZSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgcG9ydCkKLSAgICB7ICAgICAgICAgIAotICAgICAgQmluZGluZyBiaW5kaW5nID0gcG9ydC5nZXRFQmluZGluZygpOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nICE9IG51bGwgPyBiaW5kaW5nLmdldEVQb3J0VHlwZSgpIDogbnVsbDsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KHBvcnRUeXBlKTsgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChwb3J0VHlwZSk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldE91dHB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdChudWxsKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldElucHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QobnVsbCk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgV1NETFN3aXRjaCBjcmVhdGVTd2l0Y2goaW50IHNlbGVjdGlvblR5cGUpCi0gIHsKLSAgICByZXR1cm4gbmV3IEludGVybmFsV1NETFN3aXRjaCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFBvcnRUeXBlIGdldFBvcnRUeXBlRm9yQmluZGluZ09iamVjdChFT2JqZWN0IG9iamVjdCkKLSAgeyAKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRFbmNsb3NpbmdCaW5kaW5nKG9iamVjdCk7Ci0gICAgcmV0dXJuIGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gIH0gICAKLSAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBwcm9wYWdhdGVGb3J3YXJkKE9iamVjdCBtb2RlbCkKLSAgeyAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICBXU0RMU3dpdGNoIHRoZVN3aXRjaCA9IGNyZWF0ZVN3aXRjaChQUk9QQUdBVEVfRk9SV0FSRCk7Ci0gICAgICB0aGVTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpbW9kZWwpOyAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2Nyb2xsVG9SZXZlYWxJbnB1dENvbm5lY3Rpb24oKTsKLSAgICB9ICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZW1vdmVDb25uZWN0aW9ucygpOwotICAgIH0KLQotICAgIE9iamVjdCBvID0gZ3JvdXBFZGl0UGFydC5nZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKTsKLSAgICBwcm9wYWdhdGVGb3J3YXJkVG9OZXh0KG8gIT0gbnVsbCA/IG8gOiBtb2RlbCk7IAotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBwcm9wYWdhdGVCYWNrVG9QcmV2aW91cyhPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBtb2RlbCA9IChtb2RlbCBpbnN0YW5jZW9mIE1lc3NhZ2UpID8gZ3JvdXBFZGl0UGFydC5nZXRJbnB1dENvbm5lY3Rpb25Nb2RlbE9iamVjdCgpIDogbW9kZWw7IAotICAgIHN1cGVyLnByb3BhZ2F0ZUJhY2tUb1ByZXZpb3VzKG1vZGVsKTsKLSAgfSAKLSAgCi0KLSAgcHJvdGVjdGVkIE1lc3NhZ2UgZ2V0UmVmZXJlbmNlZE1lc3NhZ2UoRU9iamVjdCBvKQotICB7ICAgICAgCi0gICAgTWVzc2FnZSByZXN1bHQgPSBudWxsOwotICAgIGlmIChvIGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChJbnB1dClvKS5nZXRFTWVzc2FnZSgpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBPdXRwdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChPdXRwdXQpbykuZ2V0RU1lc3NhZ2UoKTsKLSAgICB9ICAKLSAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgRmF1bHQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChGYXVsdClvKS5nZXRFTWVzc2FnZSgpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hdGNoaW5nTWVzc2FnZVJlZmVyZW5jZShFT2JqZWN0IG1lc3NhZ2VSZWZlcmVuY2UsIE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIE1lc3NhZ2UgbSA9IGdldFJlZmVyZW5jZWRNZXNzYWdlKG1lc3NhZ2VSZWZlcmVuY2UpOwotICAgIHJldHVybiAobSAhPSBudWxsKSAmJiAobSA9PSBtZXNzYWdlUmVmZXJlbmNlKTsKLSAgfQotICAKLSAgcHVibGljIEVPYmplY3QgZ2V0TWVzc2FnZVJlZmVyZW5jZShNZXNzYWdlIG1lc3NhZ2UsIEVPYmplY3QgcHJldkNvbnRleHQpCi0gIHsKLSAgICBFT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIAotICAgIFBvcnRUeXBlIHByZXZQb3J0VHlwZSA9IGdldEVuY2xvc2luZ1BvcnRUeXBlKHByZXZDb250ZXh0KTsKLSAgICBPcGVyYXRpb24gcHJldk9wZXJhdGlvbiA9IGdldEVuY2xvc2luZ09wZXJhdGlvbihwcmV2Q29udGV4dCk7ICAKLSAgICBFT2JqZWN0IHByZXZNZXNzYWdlUmVmZXJlbmNlID0gZ2V0TWVzc2FnZVJlZmVyZW5jZShwcmV2Q29udGV4dCk7Ci0gICAgCi0gICAgaWYgKHByZXZQb3J0VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldE1lc3NhZ2VSZWZlcmVuY2UobWVzc2FnZSwgcHJldlBvcnRUeXBlLCBwcmV2T3BlcmF0aW9uLCBwcmV2TWVzc2FnZVJlZmVyZW5jZSk7ICAKLSAgICB9ICAgCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsgICAgCi0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBncm91cEVkaXRQYXJ0LmdldERlZmluaXRpb24oKTsKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gdXRpbC5nZXRQb3J0VHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSlpLm5leHQoKTsgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBnZXRNZXNzYWdlUmVmZXJlbmNlKG1lc3NhZ2UsIHBvcnRUeXBlLCBudWxsLCBudWxsKTsgIAotICAgICAgICAKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIEVPYmplY3QgZ2V0TWVzc2FnZVJlZmVyZW5jZShNZXNzYWdlIG1lc3NhZ2UsIFBvcnRUeXBlIHBvcnRUeXBlLCBPcGVyYXRpb24gcHJldk9wZXJhdGlvbiwgRU9iamVjdCBwcmV2TWVzc2FnZVJlZmVyZW5jZSkKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAocHJldk1lc3NhZ2VSZWZlcmVuY2UgIT0gbnVsbCAmJiBpc01hdGNoaW5nTWVzc2FnZVJlZmVyZW5jZShwcmV2TWVzc2FnZVJlZmVyZW5jZSwgbWVzc2FnZSkpIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHByZXZNZXNzYWdlUmVmZXJlbmNlOwotICAgIH0KLSAgICAgIAotICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBwcmV2T3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0TWVzc2FnZVJlZmVyZW5jZShtZXNzYWdlLCBwcmV2T3BlcmF0aW9uKTsgICAgICAgCi0gICAgfQotICAgICAgICAgICAgCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgeyAKLSAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIHJlc3VsdCA9IGdldE1lc3NhZ2VSZWZlcmVuY2UobWVzc2FnZSwgb3BlcmF0aW9uKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7IAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgIAotICB9IAotICAKLSAgcHVibGljIEVPYmplY3QgZ2V0TWVzc2FnZVJlZmVyZW5jZShNZXNzYWdlIG1lc3NhZ2UsIE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBFT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7IAotICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0LmdldE1lc3NhZ2UoKSA9PSBtZXNzYWdlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlucHV0OwotICAgIH0KLSAgICBlbHNlIGlmIChvdXRwdXQgIT0gbnVsbCAmJiBvdXRwdXQuZ2V0TWVzc2FnZSgpID09IG1lc3NhZ2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gb3V0cHV0OwotICAgIH0KLSAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KWkubmV4dCgpOwotICAgICAgICBpZiAoZmF1bHQuZ2V0TWVzc2FnZSgpID09IG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBmYXVsdDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgICAgICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9TZXJ2aWNlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9TZXJ2aWNlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NTQzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvU2VydmljZXNHcm91cENvbm5lY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExTd2l0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBTZXJ2aWNlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3Rpb25NYW5hZ2VyCi17ICAgCi0gIHB1YmxpYyBTZXJ2aWNlc0dyb3VwQ29ubmVjdGlvbk1hbmFnZXIoR3JvdXBFZGl0UGFydCBncm91cEVkaXRQYXJ0KQotICB7Ci0gICAgc3VwZXIoZ3JvdXBFZGl0UGFydCk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIEludGVybmFsV1NETFN3aXRjaCBleHRlbmRzIFdTRExTd2l0Y2gKLSAgewotICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICBoYW5kbGVCaW5kaW5nSGVscGVyKGJpbmRpbmcpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgCi0KLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkKLSAgICB7ICAgIAotICAgICAgaGFuZGxlQmluZGluZ0hlbHBlcihnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdGYXVsdCkpOyAKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpCi0gICAgeyAgICAKLSAgICAgIGhhbmRsZUJpbmRpbmdIZWxwZXIoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nSW5wdXQpKTsgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaGFuZGxlQmluZGluZ0hlbHBlcihnZXRFbmNsb3NpbmdCaW5kaW5nKGJpbmRpbmdPcGVyYXRpb24pKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfQotICAgICAgCi0gICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIGhhbmRsZUJpbmRpbmdIZWxwZXIoZ2V0RW5jbG9zaW5nQmluZGluZyhiaW5kaW5nT3V0cHV0KSk7Ci0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0gICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IGZhdWx0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBoYW5kbGVQb3J0VHlwZUhlbHBlcihnZXRFbmNsb3NpbmdQb3J0VHlwZShmYXVsdCkpOyAgIAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9IAotICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZUlucHV0KElucHV0IGlucHV0KQotICAgIHsgICAgICAgCi0gICAgICBoYW5kbGVQb3J0VHlwZUhlbHBlcihnZXRFbmNsb3NpbmdQb3J0VHlwZShpbnB1dCkpOyAgIAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAKLSAgICAgICAgICAgIAotICAgIHB1YmxpYyBPYmplY3QgY2FzZU9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKSAKLSAgICB7ICAgICAgCi0gICAgICBoYW5kbGVQb3J0VHlwZUhlbHBlcihnZXRFbmNsb3NpbmdQb3J0VHlwZShvcGVyYXRpb24pKTsgICAgCi0gICAgICByZXR1cm4gQm9vbGVhbi5UUlVFOwotICAgIH0KLSAgICAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGNhc2VPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgICB7ICAKLSAgICAgIGhhbmRsZVBvcnRUeXBlSGVscGVyKGdldEVuY2xvc2luZ1BvcnRUeXBlKG91dHB1dCkpOyAgIAotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAKLQotICAgCXB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBwb3J0KQotICAgIHsgICAgICAgICAgIAotICAgICAgZ3JvdXBFZGl0UGFydC5zZXRFbXBoYXNpemVkTW9kZWxPYmplY3QocG9ydCk7ICAgICAKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBvcnQpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgCi0KLSAgIAlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIGhhbmRsZVBvcnRUeXBlSGVscGVyKHBvcnRUeXBlKTsKLSAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7Ci0gICAgfSAgICAgICAgICAKLSAgICAgICAgCi0gICAJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgICB7Ci0gICAgICBncm91cEVkaXRQYXJ0LnNldEVtcGhhc2l6ZWRNb2RlbE9iamVjdChudWxsKTsKLSAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KG51bGwpOwotICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICB9ICAgICAgICAgIAotCi0gICAgLy8KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQb3J0VHlwZUhlbHBlcihQb3J0VHlwZSBwb3J0VHlwZSkKLSAgICB7ICAgICAgIAotICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgICB7IAotICAgICAgICBQb3J0IHBvcnQgPSBudWxsOyAgIAotICAgICAgICBPYmplY3QgcHJldmlvdXNDb250ZXh0ID0gZ3JvdXBFZGl0UGFydC5nZXRPdXRwdXRDb25uZWN0aW9uTW9kZWxPYmplY3QoKTsKLSAgICAgICAgaWYgKHByZXZpb3VzQ29udGV4dCA9PSBudWxsKSAgICAgIAotICAgICAgICB7Ci0gICAgICAgICAgcHJldmlvdXNDb250ZXh0ID0gZ3JvdXBFZGl0UGFydC5nZXRFbXBoYXNpemVkTW9kZWxPYmplY3QoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocHJldmlvdXNDb250ZXh0IGluc3RhbmNlb2YgUG9ydCkKLSAgICAgICAgewotICAgICAgICAgIFBvcnQgcHJldmlvdXNQb3J0ID0gKFBvcnQpcHJldmlvdXNDb250ZXh0OwotICAgICAgICAgIGlmIChwcmV2aW91c1BvcnQuZ2V0RUJpbmRpbmcoKSAhPSBudWxsICYmIHByZXZpb3VzUG9ydC5nZXRFQmluZGluZygpLmdldEVQb3J0VHlwZSgpID09IHBvcnRUeXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvcnQgPSBwcmV2aW91c1BvcnQ7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIGlmIChwb3J0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChncm91cEVkaXRQYXJ0LmdldERlZmluaXRpb24oKSk7ICAgICAgICAgICAKLSAgICAgICAgICBMaXN0IGxpc3QgPSB1dGlsLmdldFBvcnRzRm9yUG9ydFR5cGUocG9ydFR5cGUpOyAgICAgICAgICAKLSAgICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvcnQgPSAoUG9ydClsaXN0LmdldCgwKTsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KHBvcnQpOyAgICAgCi0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBvcnQpOwotICAgICAgfSAKLSAgICB9ICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVCaW5kaW5nSGVscGVyKEJpbmRpbmcgYmluZGluZykKLSAgICB7ICAgICAgIAotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZ3JvdXBFZGl0UGFydC5nZXREZWZpbml0aW9uKCkpOwotICAgICAgICBMaXN0IGxpc3QgPSB1dGlsLmdldFBvcnRzRm9yQmluZGluZyhiaW5kaW5nKTsKLSAgICAgICAgUG9ydCBwb3J0ID0gbnVsbDsKLSAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHBvcnQgPSAoUG9ydClsaXN0LmdldCgwKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0RW1waGFzaXplZE1vZGVsT2JqZWN0KHBvcnQpOyAgICAgCi0gICAgICAgIGdyb3VwRWRpdFBhcnQuc2V0T3V0cHV0Q29ubmVjdGlvbk1vZGVsT2JqZWN0KHBvcnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBXU0RMU3dpdGNoIGNyZWF0ZVN3aXRjaChpbnQgc2VsZWN0aW9uVHlwZSkKLSAgewotICAgIHJldHVybiBuZXcgSW50ZXJuYWxXU0RMU3dpdGNoKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvVHJlZU5vZGVFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1RyZWVOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2NmFhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvVHJlZU5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0cy5JbnRlcmFjdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLkdyYXBoaWNzQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLldTRExDb21wb25lbnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLldTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlcy5UcmVlTm9kZUNvbnRlbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlTm9kZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyLCBHcmFwaGljc0NvbnN0YW50cywgSUZlZWRiYWNrSGFuZGxlcgotewotICBwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDI7Ci0gIHByb3RlY3RlZCBDb250YWluZXJGaWd1cmUgbGFiZWxIb2xkZXIgPSBuZXcgQ29udGFpbmVyRmlndXJlKCk7Ci0gIHByb3RlY3RlZCBUcmVlTm9kZUNvbnRlbnRGaWd1cmUgY29udGVudEZpZ3VyZTsKLSAgcHJvdGVjdGVkIEludGVyYWN0b3JIZWxwZXIgaW50ZXJhY3RvckhlbHBlcjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0KLSAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICB7Ci0gICAgc3VwZXIuYWN0aXZhdGUoKTsKLSAgICBhZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihnZXRNb2RlbCgpLCB0aGlzKTsKLSAgICAvL3ZpZXdlciA9IGdldFZpZXdlcigpOwotICB9Ci0KLSAgaW50IHJlbW92ZU5vdGlmeUNvdW50ID0gMDsKLQotICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZnkoKQotICB7Ci0gICAgcmVtb3ZlTm90aWZ5Q291bnQrKzsKLSAgICBpZiAocmVtb3ZlTm90aWZ5Q291bnQgPT0gMSkKLSAgICB7Ci0gICAgICBzdXBlci5yZW1vdmVOb3RpZnkoKTsKLSAgICB9Ci0gIH0KLQotICAvKiogCi0gICAqIEFwYXJ0IGZyb20gdGhlIGRlYWN0aXZhdGlvbiBkb25lIGluIHN1cGVyLCB0aGUgc291cmNlCi0gICAqIGFuZCB0YXJnZXQgY29ubmVjdGlvbnMgYXJlIGRlYWN0aXZhdGVkLCBhbmQgdGhlIHZpc3VhbAotICAgKiBwYXJ0IG9mIHRoZSB0aGlzIGlzIHJlbW92ZWQuCi0gICAqCi0gICAqIEBzZWUgI2FjdGl2YXRlKCkgCi0gICAqLwotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotICAgIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKGdldE1vZGVsKCksIHRoaXMpOwotICAgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpCi0gIHsKLSAgICAvL1NlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBwb2xpY3kgPSBuZXcgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgLy9pbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBwb2xpY3kpOwotCi0gICAgU2VsZWN0aW9uRWRpdFBvbGljeSBmZWVkQmFja1NlbGVjdGlvbkVkaXRQb2xpY3kgPSBuZXcgV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCgpOwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIGZlZWRCYWNrU2VsZWN0aW9uRWRpdFBvbGljeSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlQ2hpbGQoT2JqZWN0IG1vZGVsKQotICB7Ci0gICAgcmV0dXJuIGdldEVkaXRQYXJ0RmFjdG9yeSgpLmNyZWF0ZUVkaXRQYXJ0KHRoaXMsIG1vZGVsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAocHJvcGVydHkgPT0gTW9kZWxBZGFwdGVyLkNISUxEUkVOX1BST1BFUlRZKQotICAgIHsKLSAgICAgIHJlZnJlc2hDaGlsZHJlbigpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PSBNb2RlbEFkYXB0ZXIuREVUQUlMX1BST1BFUlRZKQotICAgIHsKLSAgICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICAgIHJlZnJlc2hWaXN1YWxzKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgewotICAgIGNyZWF0ZUNvbnRlbnRGaWd1cmUoKTsKLSAgICBjcmVhdGVGaWd1cmVDb250ZW50KCk7Ci0gICAgcmV0dXJuIGNvbnRlbnRGaWd1cmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50RmlndXJlKCkKLSAgewotICAgIGNvbnRlbnRGaWd1cmUgPSBuZXcgVHJlZU5vZGVDb250ZW50RmlndXJlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWd1cmVDb250ZW50KCkKLSAgewotICAgIC8vIGFkZCBhIGJpdCBvZiBzcGFjZSBiZXR3ZWVuIHRoZSBpbnRlcmFjdG9yIGFuZCBpY29uCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgCi0gICAgUmVjdGFuZ2xlRmlndXJlIHNwYWNlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotICAgIHNwYWNlLnNldFZpc2libGUoZmFsc2UpOwotICAgIHNwYWNlLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbigzLCAzKSk7Ci0gICAgY29udGVudEZpZ3VyZS5nZXRJY29uQXJlYSgpLmFkZChzcGFjZSk7Ci0KLSAgICBsYWJlbEhvbGRlciA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICBsYWJlbEhvbGRlci5zZXRGaWxsKHRydWUpOwotICAgIGNvbnRlbnRGaWd1cmUuZ2V0SWNvbkFyZWEoKS5hZGQobGFiZWxIb2xkZXIpOwotCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVU5LTk9XTl9PQkpFQ1QiKSk7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLSAgICBsYWJlbEhvbGRlci5hZGQobGFiZWwpOwotCi0gICAgaW50ZXJhY3RvckhlbHBlciA9IG5ldyBJbnRlcmFjdG9ySGVscGVyKHRoaXMsIGNvbnRlbnRGaWd1cmUuZ2V0SW50ZXJhY3RvcigpLCBjb250ZW50RmlndXJlLmdldElubmVyQ29udGVudEFyZWEoKSk7Ci0gIH0KLQotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudEZpZ3VyZS5nZXRJbm5lckNvbnRlbnRBcmVhKCk7Ci0gIH0KLQotICBwdWJsaWMgQ29sb3IgY29tcHV0ZUxhYmVsQ29sb3IoKQotICB7Ci0gICAgQ29sb3IgY29sb3IgPSBDb2xvckNvbnN0YW50cy5ibGFjazsKLSAgICBpZiAoaXNTZWxlY3RlZCkKLSAgICB7Ci0gICAgICBjb2xvciA9IENvbG9yQ29uc3RhbnRzLndoaXRlOwotICAgIH0KLSAgICBlbHNlIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbG9yID0gQ29sb3JDb25zdGFudHMuZ3JheTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbG9yOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIoZ2V0TW9kZWwoKSk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpc1JlYWRPbmx5ID0gQm9vbGVhbi5UUlVFLmVxdWFscyhhZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksICJpc1JlYWRPbmx5IikpOwotICAgICAgbGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbXB1dGVMYWJlbENvbG9yKCkpOwotICAgICAgbGFiZWwuc2V0VGV4dCgoU3RyaW5nKWFkYXB0ZXIuZ2V0UHJvcGVydHkoZ2V0TW9kZWwoKSwgTW9kZWxBZGFwdGVyLkxBQkVMX1BST1BFUlRZKSk7Ci0gICAgICBsYWJlbC5zZXRJY29uKChJbWFnZSlhZGFwdGVyLmdldFByb3BlcnR5KGdldE1vZGVsKCksIE1vZGVsQWRhcHRlci5JTUFHRV9QUk9QRVJUWSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9VTktOT1dOX05PREUiKSArIGdldE1vZGVsKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfcmVmcmVzaENoaWxkcmVuKCkKLSAgewotICAgIGludCBpOwotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0OwotICAgIE9iamVjdCBtb2RlbDsKLQotICAgIE1hcCBtb2RlbFRvRWRpdFBhcnQgPSBuZXcgSGFzaE1hcCgpOwotICAgIExpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KWNoaWxkcmVuLmdldChpKTsKLSAgICAgIG1vZGVsVG9FZGl0UGFydC5wdXQoZWRpdFBhcnQuZ2V0TW9kZWwoKSwgZWRpdFBhcnQpOwotICAgIH0KLQotICAgIExpc3QgbW9kZWxPYmplY3RzID0gZ2V0TW9kZWxDaGlsZHJlbigpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1vZGVsT2JqZWN0cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBtb2RlbCA9IG1vZGVsT2JqZWN0cy5nZXQoaSk7Ci0KLSAgICAgIC8vRG8gYSBxdWljayBjaGVjayB0byBzZWUgaWYgZWRpdFBhcnRbaV0gPT0gbW9kZWxbaV0KLSAgICAgIGlmIChpIDwgY2hpbGRyZW4uc2l6ZSgpKQotICAgICAgewotICAgICAgICBlZGl0UGFydCA9IChFZGl0UGFydCljaGlsZHJlbi5nZXQoaSk7Ci0gICAgICAgIE9iamVjdCBlZGl0UGFydE1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0TW9kZWwgPT0gbW9kZWwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlZGl0UGFydE1vZGVsLmdldENsYXNzKCkgPT0gbW9kZWwuZ2V0Q2xhc3MoKSkKLSAgICAgICAgewotICAgICAgICAgIG1vZGVsVG9FZGl0UGFydC5yZW1vdmUoZWRpdFBhcnRNb2RlbCk7Ci0KLSAgICAgICAgICBpZiAoaXNBY3RpdmUoKSkKLSAgICAgICAgICAgIGVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQotICAgICAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLQotICAgICAgICAgIGlmIChpc0FjdGl2ZSgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVkaXRQYXJ0LmFjdGl2YXRlKCk7Ci0gICAgICAgICAgICBlZGl0UGFydC5yZWZyZXNoKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vTG9vayB0byBzZWUgaWYgdGhlIEVkaXRQYXJ0IGlzIGFscmVhZHkgYXJvdW5kIGJ1dCBpbiB0aGUgd3JvbmcgbG9jYXRpb24KLSAgICAgIGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KW1vZGVsVG9FZGl0UGFydC5nZXQobW9kZWwpOwotCi0gICAgICBpZiAoZWRpdFBhcnQgIT0gbnVsbCkKLSAgICAgICAgcmVvcmRlckNoaWxkKGVkaXRQYXJ0LCBpKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy9BbiBlZGl0cGFydCBmb3IgdGhpcyBtb2RlbCBkb2Vzbid0IGV4aXN0IHlldC4gIENyZWF0ZSBhbmQgaW5zZXJ0IG9uZS4KLSAgICAgICAgZWRpdFBhcnQgPSBjcmVhdGVDaGlsZChtb2RlbCk7Ci0gICAgICAgIGFkZENoaWxkKGVkaXRQYXJ0LCBpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgTGlzdCB0cmFzaCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKQotICAgICAgdHJhc2guYWRkKGNoaWxkcmVuLmdldChpKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHRyYXNoLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIEVkaXRQYXJ0IGVwID0gKEVkaXRQYXJ0KXRyYXNoLmdldChpKTsKLSAgICAgIHJlbW92ZUNoaWxkKGVwKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oKQotICB7Ci0KLSAgICBib29sZWFuIHJldXNlQ2hpbGRyZW4gPSBmYWxzZTsKLSAgICBpZiAoZ2V0Vmlld2VyKCkgaW5zdGFuY2VvZiBXU0RMQ29tcG9uZW50Vmlld2VyKQotICAgIHsKLSAgICAgIFdTRExDb21wb25lbnRWaWV3ZXIgd3NkbENvbXBvbmVudFZpZXdlciA9IChXU0RMQ29tcG9uZW50Vmlld2VyKWdldFZpZXdlcigpOwotICAgICAgcmV1c2VDaGlsZHJlbiA9IHdzZGxDb21wb25lbnRWaWV3ZXIuaXNQcmVzZXJ2ZUV4cGFuc2lvbkVuYWJsZWQoKTsKLSAgICB9Ci0KLSAgICBpZiAocmV1c2VDaGlsZHJlbikKLSAgICB7Ci0gICAgICBfcmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5yZWZyZXNoQ2hpbGRyZW4oKTsKLSAgICB9Ci0KLSAgICBjb250ZW50RmlndXJlLmdldEludGVyYWN0b3IoKS5zZXRWaXNpYmxlKGhhc0NoaWxkcmVuKCkpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpCi0gIHsKLSAgICByZXR1cm4gY29udGVudEZpZ3VyZS5nZXRJbnRlcmFjdG9yKCkuaXNFeHBhbmRlZCgpID8gZ2V0TW9kZWxDaGlsZHJlbkhlbHBlcigpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW5IZWxwZXIoKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBudWxsOwotICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIoZ2V0TW9kZWwoKSk7Ci0gICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChMaXN0KW1vZGVsQWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuQ0hJTERSRU5fUFJPUEVSVFkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKQotICB7Ci0gICAgcmV0dXJuIGdldE1vZGVsQ2hpbGRyZW5IZWxwZXIoKS5zaXplKCkgPiAwOwotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IE1vZGVsQWRhcHRlciBnZXRNb2RlbEFkYXB0ZXIoT2JqZWN0IG1vZGVsKTsKLQotICBwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGdldEVkaXRQYXJ0RmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gRXh0ZW5zaWJsZUVkaXRQYXJ0RmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0TW9kZWxBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRGZWVkYmFjaygpCi0gIHsKLSAgICBpc1NlbGVjdGVkID0gdHJ1ZTsKLSAgICBsYWJlbEhvbGRlci5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotICAgIGxhYmVsLnNldEZvcmVncm91bmRDb2xvcihjb21wdXRlTGFiZWxDb2xvcigpKTsKLSAgICBsYWJlbEhvbGRlci5zZXRGaWxsKHRydWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlRmVlZGJhY2soKQotICB7Ci0gICAgaXNTZWxlY3RlZCA9IGZhbHNlOwotICAgIGxhYmVsSG9sZGVyLnNldEJhY2tncm91bmRDb2xvcihudWxsKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29tcHV0ZUxhYmVsQ29sb3IoKSk7Ci0gICAgbGFiZWxIb2xkZXIuc2V0RmlsbChmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0V4cGFuZGVkKCkKLSAgewotICAgIHJldHVybiBjb250ZW50RmlndXJlLmdldEludGVyYWN0b3IoKS5pc0V4cGFuZGVkKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGFyZykKLSAgewotICAgIGludGVyYWN0b3JIZWxwZXIuc2V0RXhwYW5kZWQoYXJnKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Vbmtub3duT2JqZWN0RWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9Vbmtub3duT2JqZWN0RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1NGZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvVW5rbm93bk9iamVjdEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBVbmtub3duT2JqZWN0RWRpdFBhcnQgZXh0ZW5kcyBUcmVlTm9kZUVkaXRQYXJ0Ci17Ci0gIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXIgZ2V0TW9kZWxBZGFwdGVyKE9iamVjdCBtb2RlbCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMRWRpdFBhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4NzJhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvV1NETEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwYXJ0cy5NdWx0aUNvbnRlbnRQYW5lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguR3JhcGhpY3NDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTRExFZGl0UGFydCBleHRlbmRzIE11bHRpQ29udGVudFBhbmVFZGl0UGFydCBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyLCBHcmFwaGljc0NvbnN0YW50cwotewotCS8qKgotCSAqIEFjdGl2YXRlcyB0aGUgPGNvZGU+RWRpdFBhcnQ8L2NvZGU+IGJ5IHNldHRpbmcgdGhlCi0JICogYXBwcm9wcmlhdGUgZmxhZ3MsIGFuZCBhY3RpdmF0aW5nIGl0cyBjaGlsZHJlbi4KLQkgKiBhY3RpdmF0aW9uIHNpZ25hbHMgdG8gdGhlIEVkaXRQYXJ0IHRoYXQgaXMgc2hvdWxkIHN0YXJ0IG9ic2VydmluZwotCSAqIGl0J3MgbW9kZWwsIGFuZCB0aGF0IGlzIHNob3VsZCBzdXBwb3J0IGVkaXRpbmcgYXQgdGhpcyB0aW1lLgotCSAqIEFuIEVkaXRQYXJ0IHdpbGwgaGF2ZSBhIHBhcmVudCBwcmlvciB0byBhY3RpdmlhdGlvbi4KLQkgKiBAc2VlICNkZWFjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIAotICB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7ICAgICAgICAgCi0gICAgYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoZ2V0TW9kZWwoKSwgdGhpcyk7ICAgCi0JfQotCS8qKiAKLQkgKiBBcGFydCBmcm9tIHRoZSBkZWFjdGl2YXRpb24gZG9uZSBpbiBzdXBlciwgdGhlIHNvdXJjZQotCSAqIGFuZCB0YXJnZXQgY29ubmVjdGlvbnMgYXJlIGRlYWN0aXZhdGVkLCBhbmQgdGhlIHZpc3VhbAotCSAqIHBhcnQgb2YgdGhlIHRoaXMgaXMgcmVtb3ZlZC4KLQkgKgotCSAqIEBzZWUgI2FjdGl2YXRlKCkgCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIAotICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihnZXRNb2RlbCgpLCB0aGlzKTsgCi0JCXN1cGVyLmRlYWN0aXZhdGUoKTsgCi0JfSAgIAotICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSAKLSAgewotICAgIFNlbGVjdGlvbkVkaXRQb2xpY3kgcG9saWN5ID0gbmV3IFNlbGVjdGlvbkVkaXRQb2xpY3koKQotICAgIHsgICAgICAgIAotICAgICAgcHJvdGVjdGVkICB2b2lkIGhpZGVTZWxlY3Rpb24oKSAKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7Ci0gICAgICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAoKElGZWVkYmFja0hhbmRsZXIpZWRpdFBhcnQpLnJlbW92ZUZlZWRiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkICB2b2lkIHNob3dTZWxlY3Rpb24oKSAgCi0gICAgICB7IAotICAgICAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICAgICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUZlZWRiYWNrSGFuZGxlcikKLSAgICAgICAgewotICAgICAgICAgICgoSUZlZWRiYWNrSGFuZGxlcillZGl0UGFydCkuYWRkRmVlZGJhY2soKTsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgICAgICAKLSAgICB9OwotICAgIGluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuU0VMRUNUSU9OX0ZFRURCQUNLX1JPTEUsIHBvbGljeSk7ICAgICAgICAgICAKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUNoaWxkKE9iamVjdCBtb2RlbCkgCi0gIHsKLSAgICByZXR1cm4gZ2V0RWRpdFBhcnRGYWN0b3J5KCkuY3JlYXRlRWRpdFBhcnQodGhpcywgbW9kZWwpOwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChwcm9wZXJ0eSA9PSBNb2RlbEFkYXB0ZXIuQ0hJTERSRU5fUFJPUEVSVFkpCi0gICAgewotICAgICAgcmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5ID09IE1vZGVsQWRhcHRlci5ERVRBSUxfUFJPUEVSVFkpCi0gICAgeyAKLSAgICAgIHJlZnJlc2hWaXN1YWxzKCk7IAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVmcmVzaENoaWxkcmVuKCk7Ci0gICAgICByZWZyZXNoVmlzdWFscygpOwotICAgIH0KLSAgfSAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7ICAgCi0gICAgTGlzdCByZXN1bHQgPSBudWxsOwotICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIoZ2V0TW9kZWwoKSk7Ci0gICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IChMaXN0KW1vZGVsQWRhcHRlci5nZXRQcm9wZXJ0eShnZXRNb2RlbCgpLCBNb2RlbEFkYXB0ZXIuQ0hJTERSRU5fUFJPUEVSVFkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9IAotCi0gIHByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgZ2V0RWRpdFBhcnRGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBFeHRlbnNpYmxlRWRpdFBhcnRGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlciBnZXRNb2RlbEFkYXB0ZXIoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgLy8gVE9ETyA6IHBvcnQgY2hlY2sKLSAgICByZXR1cm4gV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihtb2RlbE9iamVjdCk7Ci0vLyAgICByZXR1cm4gV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeS5FY29yZVV0aWwuZ2V0QWRhcHRlcihnZXRXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZUFkYXB0ZXJzKCksbW9kZWxPYmplY3QpOwotICB9IAotCi0gIHByb3RlY3RlZCB2b2lkIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldE1vZGVsQWRhcHRlcihtb2RlbE9iamVjdCk7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihPYmplY3QgbW9kZWxPYmplY3QsIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRNb2RlbEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9ICAKLQotICBwdWJsaWMgYm9vbGVhbiBoaXRUZXN0KElGaWd1cmUgdGFyZ2V0LCBQb2ludCBsb2NhdGlvbikKLSAgewotICAgIFJlY3RhbmdsZSBiID0gdGFyZ2V0LmdldEJvdW5kcygpLmdldENvcHkoKTsKLSAgICB0YXJnZXQudHJhbnNsYXRlVG9BYnNvbHV0ZShiKTsgIAotICAgIHJldHVybiBiLmNvbnRhaW5zKGxvY2F0aW9uKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMRWRpdFBhcnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvV1NETEVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU0YTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwYXJ0cy9XU0RMRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMU3dpdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExHcm91cE9iamVjdDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETEVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeQoteyAKLSAgcHJvdGVjdGVkIHN0YXRpYyBXU0RMRWRpdFBhcnRGYWN0b3J5IGluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIFdTRExFZGl0UGFydEZhY3RvcnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaW5zdGFuY2UgPSBuZXcgV1NETEVkaXRQYXJ0RmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgICAgICAgICAgCi0KLQotICBwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoZmluYWwgRWRpdFBhcnQgcGFyZW50LCBPYmplY3QgbW9kZWwpCi0gIHsgICAgICAgICAgICAgCi0gICAgICBXU0RMU3dpdGNoIHdzZGxTd2l0Y2ggPSBuZXcgV1NETFN3aXRjaCgpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IHdzZGxFbGVtZW50KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIG5ldyBXU0RMVHJlZU5vZGVFZGl0UGFydCgpOwotCSAgICB9ICAgCi0gICAgICAgCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gbmV3IERlZmluaXRpb25FZGl0UGFydCgpOwotCSAgICB9ICAKLQkJCQkKLQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLQkJewotCSAgICAgICByZXR1cm4gbmV3IFdTRExUcmVlTm9kZUVkaXRQYXJ0KCk7Ci0JCX0KLSAgICAgIH07Ci0JIAotCSAgCi0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBudWxsOyAgICAgICAJCi0gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICB7Ci0gICAgICBlZGl0UGFydCA9IChFZGl0UGFydCl3c2RsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KW1vZGVsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgewotICAgICAgZWRpdFBhcnQgPSBuZXcgR3JvdXBFZGl0UGFydCgpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgaWYgKGVkaXRQYXJ0ICE9IG51bGwpICAgCi0gICAgewotICAgICAgZWRpdFBhcnQuc2V0TW9kZWwobW9kZWwpOwotICAgICAgZWRpdFBhcnQuc2V0UGFyZW50KHBhcmVudCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgICAgCi0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNhbid0IGNyZWF0ZSBlZGl0UGFydCBmb3IgIiArIG1vZGVsKTsKLSAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBhcnRzL1dTRExUcmVlTm9kZUVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvV1NETFRyZWVOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjOTMzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cGFydHMvV1NETFRyZWVOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLldTRExEcmFnQW5kRHJvcEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzLldTRExHcmFwaE5vZGVEcmFnVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXMuV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzLlRyZWVOb2RlQ29udGVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMVHJlZU5vZGVFZGl0UGFydCBleHRlbmRzIFRyZWVOb2RlRWRpdFBhcnQKLXsgCi0gIHByb3RlY3RlZCBMYWJlbCBsYWJlbDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0VtcGhhc2l6ZWQgPSBmYWxzZTsgIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sb3IgZW1waGFzaXNDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyMzgsIDIzOCwgMjM4KTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb2xvciBsYWJlbDJGb3JlZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IobnVsbCwgODIsIDgyLCAxNTgpOyAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sb3IgbGFiZWwyRm9yZWdyb3VuZENvbG9yU2VsZWN0ZWQgPSBuZXcgQ29sb3IobnVsbCwgMTgyLCAxODIsIDI1NSk7Ci0KLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlciBnZXRNb2RlbEFkYXB0ZXIoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudEZpZ3VyZSgpCi0gIHsKLQljb250ZW50RmlndXJlID0gbmV3IFRyZWVOb2RlQ29udGVudEZpZ3VyZSgpCi0JewotCSAgcHVibGljIElGaWd1cmUgZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpCi0JICB7ICAJCi0gIAkgICAgcmV0dXJuIGlzVG9wTGV2ZWwoKSA/IG91dGxpbmVkQXJlYSA6IGljb25BcmVhOwotCSAgfSAgIAkgIAotCX07ICAgICAgCi0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzVG9wTGV2ZWwoKQotICB7Ci0gICAgcmV0dXJuIGdldFBhcmVudCgpIGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydDsKLSAgfQotCQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWd1cmVDb250ZW50KCkKLSAgeyAgICAgICAgICAgICAgICAgIAotICAgIHN1cGVyLmNyZWF0ZUZpZ3VyZUNvbnRlbnQoKTsKLSAgICAgIAotICAgIGlmIChnZXRNb2RlbCgpIGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICBsYWJlbDIgPSBuZXcgTGFiZWwoKTsKLSAgICAgIGxhYmVsSG9sZGVyLmFkZChsYWJlbDIpOwotICAgICAgbGFiZWwyLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsIDUsIDAsIDApKTsKLSAgICAgIGxhYmVsMi5zZXRGb3JlZ3JvdW5kQ29sb3IobGFiZWwyRm9yZWdyb3VuZENvbG9yKTsKLSAgICB9Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBzZXRFbXBoYXNpemVkKGJvb2xlYW4gaXNFbXBoYXNpemVkKQotICB7Ci0gICAgdGhpcy5pc0VtcGhhc2l6ZWQgPSBpc0VtcGhhc2l6ZWQ7Ci0gICAgcmVmcmVzaFZpc3VhbHMoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRW1waGFzaXMoKQotICB7Ci0gICAgYm9vbGVhbiBpc0VtcGhhc2lzU2hvd2luZyA9IGlzRW1waGFzaXplZCAmJiAoIWlzU2VsZWN0ZWQgfHwgZ2V0TW9kZWxDaGlsZHJlbigpLnNpemUoKSA+IDApOwotICAgIGlmIChpc0VtcGhhc2lzU2hvd2luZykKLSAgICB7ICAgICAgICAgICAgICAKLSAgICAgIGNvbnRlbnRGaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCkuc2V0QmFja2dyb3VuZENvbG9yKGVtcGhhc2lzQ29sb3IpOyAKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBjb250ZW50RmlndXJlLmdldE91dGxpbmVkQXJlYSgpLnNldEZpbGwoaXNFbXBoYXNpc1Nob3dpbmcpOwotICAgIGNvbnRlbnRGaWd1cmUuZ2V0T3V0bGluZWRBcmVhKCkuc2V0T3V0bGluZWQoaXNFbXBoYXNpc1Nob3dpbmcpOyAgICAKLSAgICBjb250ZW50RmlndXJlLnNldEZvcmVncm91bmRDb2xvcihlbGVtZW50Qm9yZGVyQ29sb3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVmcmVzaFZpc3VhbHMoKQotICB7ICAgCi0gICAgdXBkYXRlRW1waGFzaXMoKTsKLQotICAgIHN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0gICAKLSAgICBpZiAobGFiZWwyICE9IG51bGwpCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpZ2V0TW9kZWwoKTsKLQkgIC8vU3RyaW5nIGxhYmVsID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5pc1R5cGUocGFydCkgPyAidHlwZSIgOiAiZWxlbWVudCI7Ci0JICBTdHJpbmcgdmFsdWUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldFBhcnRSZWZlcmVuY2VWYWx1ZShwYXJ0KTsgIAotICAgICAgbGFiZWwyLnNldFRleHQoIigiICsgdmFsdWUgKyAiKSIpOwotICAgIH0KLSAgfSAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkKLSAgeyAgCi0gICAgaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX09QRU4pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGZvciAoRWRpdFBhcnQgcGFyZW50ID0gKEVkaXRQYXJ0KWdldFBhcmVudCgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpKQotICAgICAgewotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRGVmaW5pdGlvbkVkaXRQYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgKChEZWZpbml0aW9uRWRpdFBhcnQpcGFyZW50KS5oYW5kbGVPcGVuUmVxdWVzdCh0aGlzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0gICAgLy9lbHNlIGlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCkKLSAgICAvL3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gIHBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0gICAgLy99Ci0gIH0gICAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZEZlZWRiYWNrKCkKLSAgeyAgICAKLSAgICBzdXBlci5hZGRGZWVkYmFjaygpOwotICAgIGlmIChsYWJlbDIgIT0gbnVsbCkgICAgICAgIAotICAgIHsKLSAgICAgIGxhYmVsMi5zZXRGb3JlZ3JvdW5kQ29sb3IobGFiZWwyRm9yZWdyb3VuZENvbG9yU2VsZWN0ZWQpOwotICAgIH0gICAgCi0gICAgdXBkYXRlRW1waGFzaXMoKTsKLSAgfSAgIAotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUZlZWRiYWNrKCkKLSAgeyAKLSAgICBzdXBlci5yZW1vdmVGZWVkYmFjaygpOwotICAgIGlmIChsYWJlbDIgIT0gbnVsbCkgICAgICAgIAotICAgIHsKLSAgICAgIGxhYmVsMi5zZXRGb3JlZ3JvdW5kQ29sb3IobGFiZWwyRm9yZWdyb3VuZENvbG9yKTsKLSAgICB9Ci0gICAgdXBkYXRlRW1waGFzaXMoKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkKLSAgeyAKLSAgICBzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLSAgICBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSA9IG5ldyBXU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsKCk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwgbmV3IFdTRExEcmFnQW5kRHJvcEVkaXRQb2xpY3koZ2V0Vmlld2VyKCksIHNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5KSk7Ci0gICAgaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpOwotICB9ICAKLSAgCi0gIFdTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0KLSAgcHVibGljIElGaWd1cmUgZ2V0U2VsZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBnZXRGaWd1cmUoKTsKLSAgfQotCi0gIHB1YmxpYyBEcmFnVHJhY2tlciBnZXREcmFnVHJhY2tlcihSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgICByZXR1cm4gbmV3IFdTRExHcmFwaE5vZGVEcmFnVHJhY2tlcigoRWRpdFBhcnQpdGhpcyk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvRWRpdFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9FZGl0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWJjYjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9FZGl0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucmVjb25jaWxlci5XU0RMVG9ET01FbGVtZW50VXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRWRpdFV0aWwKLXsKLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFBvc3NpYmxlUHJvcGVydHlWYWx1ZXMoT2JqZWN0IG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbnVsbDsKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBQb3J0KQotICAgIHsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KW1vZGVsOyAgIAotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwocG9ydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgbGlzdCA9IHV0aWwuZ2V0QmluZGluZ05hbWVzKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQmluZGluZykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZyltb2RlbDsgICAKLSAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGJpbmRpbmcuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgIGxpc3QgPSB1dGlsLmdldFBvcnRUeXBlTmFtZXMoKTsKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydCltb2RlbDsgICAgCi0gICAgICBib29sZWFuIGlzVHlwZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuaXNUeXBlKHBhcnQpOwotICAgICAgbGlzdCA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0Q29tcG9uZW50TmFtZUxpc3QocGFydCwgaXNUeXBlKTsKLSAgICB9IAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgSW5wdXQgfHwKLSAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIE91dHB1dCB8fAotICAgICAgICAgICAgIG1vZGVsIGluc3RhbmNlb2YgRmF1bHQpCi0gICAgeyAKLSAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KW1vZGVsOyAgIAotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwod3NkbEVsZW1lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgIGxpc3QgPSB1dGlsLmdldE1lc3NhZ2VOYW1lcygpOwotICAgIH0gCi0KLSAgICBpZiAobGlzdCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGxpc3QuYWRkKCJBIik7Ci0gICAgICBsaXN0LmFkZCgiQiIpOwotICAgICAgbGlzdC5hZGQoIkMiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgeyAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KW1vZGVsOyAKLSAgICAgIGJvb2xlYW4gaXNUeXBlID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5pc1R5cGUocGFydCk7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIHZhbHVlKTsKLSAgICB9IAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KW1vZGVsKS5nZXRFbGVtZW50KCk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiYmluZGluZyIsIHZhbHVlKTsKLSAgICB9IAotICAgIGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgQmluZGluZykKLSAgICB7IAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCB2YWx1ZSk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsgCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KW1vZGVsKS5nZXRFbGVtZW50KCk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibWVzc2FnZSIsIHZhbHVlKTsKLSAgICB9IAotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoV1NETEVsZW1lbnQpbW9kZWwpLmdldEVsZW1lbnQoKTsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHByb3BlcnR5TmFtZSk7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFBvcnQpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChXU0RMRWxlbWVudCltb2RlbCkuZ2V0RWxlbWVudCgpOwotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImJpbmRpbmciKTsKLSAgICB9ICAgCi0gICAgZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBCaW5kaW5nKQotICAgIHsgCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KW1vZGVsKS5nZXRFbGVtZW50KCk7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOwotICAgIH0gICAKLSAgICBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElucHV0IHx8Ci0gICAgICAgICAgICAgbW9kZWwgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsgCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KW1vZGVsKS5nZXRFbGVtZW50KCk7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibWVzc2FnZSIpOwotICAgIH0gICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmFtZShPYmplY3QgbW9kZWwsIFN0cmluZyB2YWx1ZSkKLSAgeyAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KW1vZGVsKS5nZXRFbGVtZW50KCk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsIHZhbHVlKTsKLSAgICB9ICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9OYW1lRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9OYW1lRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxOTk1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvTmFtZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLlNtYXJ0UmVuYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdlZi51dGlsLmVkaXRwb2xpY2llcy5UZXh0Q2VsbEVkaXRvck1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lRGlyZWN0RWRpdE1hbmFnZXIgZXh0ZW5kcyBUZXh0Q2VsbEVkaXRvck1hbmFnZXIKLXsKLSAgcHJvdGVjdGVkIE9iamVjdCBtb2RlbDsKLQotICBwdWJsaWMgTmFtZURpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgTGFiZWwgbGFiZWwsIE9iamVjdCBtb2RlbCkKLSAgewotICAgIHN1cGVyKHNvdXJjZSwgbGFiZWwpOyAgCi0gICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGVyZm9ybU1vZGlmeShmaW5hbCBTdHJpbmcgdmFsdWUpCi0gIHsgICAgICAgICAgCi0gICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBTbWFydFJlbmFtZUFjdGlvbihtb2RlbCwgdmFsdWUpKTsKLSAgfSAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9XU0RMRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzk5YmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9XU0RMRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVDYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5Db3B5V1NETEVsZW1lbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5XU0RMRHJhZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLldTRExEcmFnUmVvcmRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLldTRExEcmFnU2V0TWVzc2FnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuV1NETFRyZWVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCAvL0Fic3RyYWN0Q29tbWFuZAoteyAKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsgICAgCi0gIHByb3RlY3RlZCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3Q7Ci0gIHByb3RlY3RlZCBQb2ludCBsb2NhdGlvbjsKLSAgcHJvdGVjdGVkIFdTRExEcmFnQWN0aW9uIGRyYWdBY3Rpb247ICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FeGVjdXRlID0gZmFsc2U7Ci0KLSAgcHVibGljIFdTRExEcmFnQW5kRHJvcENvbW1hbmQoRWRpdFBhcnRWaWV3ZXIgdmlld2VyLCBDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgCWJvb2xlYW4gY29uc3RydWN0b3IgPSBmYWxzZTsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7Ci0KLSAgICBsb2NhdGlvbiA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsgICAKLSAgICBFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IHZpZXdlci5maW5kT2JqZWN0QXQobG9jYXRpb24pOyAKLQotICAgIC8vIE9ubHkgc3VwcG9ydCBkcmFnIGFuZCBkcm9wIGZvciBXU0RMVHJlZU5vZGVFZGl0UGFydAotICAJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQpIHsKLSAgCQlXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgCQlpZiAod3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLSAgCQkJKChHcmFwaGljYWxFZGl0UGFydCl2aWV3ZXIuZ2V0Um9vdEVkaXRQYXJ0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jYXRpb24pOwotICAJCQlSZWN0YW5nbGUgdGFyZ2V0UmVjdGFuZ2xlOyAKLSAgCQkJV1NETFRyZWVOb2RlRWRpdFBhcnQgdGFyZ2V0UGFyZW50RWRpdFBhcnQ7Ci0gIAkJCVdTRExUcmVlTm9kZUVkaXRQYXJ0IG1vdmluZ0NoaWxkRWRpdFBhcnQ7Ci0gIAkJCVZlY3RvciBkcmFnQWN0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLQotICAJCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkuZXF1YWxzKFJlcXVlc3RDb25zdGFudHMuUkVRX0FERCkpICB7IC8vIFRoaXMgcmVhbGx5IHNob3VsZG4ndCBiZSBSRVFfQURELi4uLgotICAJCQkJTGlzdCBsaXN0ID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLSAgCQkJCWlmIChsaXN0LnNpemUoKSA8PSAwKSB7Ci0gIAkJCQkJY2FuRXhlY3V0ZSA9IGZhbHNlOwotICAJCQkJCXJldHVybjsKLSAgCQkJCX0KLSAgICAgICAgICAgIAotICAJCQkJLy8gR3JhYmJpbmcgdGhlIGZpc3Qgc2VsZWN0aW9uCi0gIAkJCQltb3ZpbmdDaGlsZEVkaXRQYXJ0ID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBsaXN0LmdldCgwKTsKLSAgCQkJCU9iamVjdCBtb2RlbCA9IG1vdmluZ0NoaWxkRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLSAgCQkJCUVkaXRQYXJ0IHBvaW50ZXJFZGl0UGFydCA9IHZpZXdlci5maW5kT2JqZWN0QXQobG9jYXRpb24pOwotIAotICAJCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSW5wdXQgfHwgbW9kZWwgaW5zdGFuY2VvZiBPdXRwdXQpIHsKLSAgCQkJCQlkcmFnQWN0aW9ucy5hZGQobmV3IFdTRExEcmFnUmVvcmRlckFjdGlvbihtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyRWRpdFBhcnQsIGdldFBvaW50ZXJMb2NhdGlvbihsb2NhdGlvbikpKTsKLSAgCQkJCQlkcmFnQWN0aW9ucy5hZGQobmV3IFdTRExEcmFnU2V0TWVzc2FnZUFjdGlvbihtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyRWRpdFBhcnQsIGxvY2F0aW9uKSk7Ci0gIAkJCQl9Ci0gIAkJCQllbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFBhcnQpIHsKLSAgCQkJCQlkcmFnQWN0aW9ucy5hZGQobmV3IFdTRExEcmFnUmVvcmRlckFjdGlvbihtb3ZpbmdDaGlsZEVkaXRQYXJ0LCBwb2ludGVyRWRpdFBhcnQsIGdldFBvaW50ZXJMb2NhdGlvbihsb2NhdGlvbikpKTsgICAgIAotICAJCQkJfQotICAJCQkJZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBGYXVsdCkgewotICAJCQkJCWRyYWdBY3Rpb25zLmFkZChuZXcgV1NETERyYWdTZXRNZXNzYWdlQWN0aW9uKG1vdmluZ0NoaWxkRWRpdFBhcnQsIHBvaW50ZXJFZGl0UGFydCwgbG9jYXRpb24pKTsKLSAgCQkJCX0gICAgICAgICAgICAKLSAgCQkJfQotICAJCQllbHNlIGlmIChyZXF1ZXN0LmdldFR5cGUoKS5lcXVhbHMoUmVxdWVzdENvbnN0YW50cy5SRVFfQ0xPTkUpKSB7Ci0gIAkJCQlMaXN0IGxpc3QgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotICAJCQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkKLSAgCQkJCXsKLSAgCQkJCQkvLyBHcmFiYmluZyB0aGUgZmlzdCBzZWxlY3Rpb24KLSAgCQkJCQltb3ZpbmdDaGlsZEVkaXRQYXJ0ID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KSBsaXN0LmdldCgwKTsKLSAgICAgICAgICAgICAKLSAgCQkJCQlkcmFnQWN0aW9ucy5hZGQobmV3IENvcHlXU0RMRWxlbWVudEFjdGlvbih2aWV3ZXIsCi0gICAgICAgICAgICAgCQkJCQkJCQkJCQkgIChXU0RMRWxlbWVudCkgbW92aW5nQ2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpLAotICAgICAgICAgICAgIAkJCQkJCQkJCQkgICAgICAoV1NETEVsZW1lbnQpIHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCksCi0JCQkJCQkJCQkJCQkJCSAgbnVsbCkpOwotICAJCQkJfQotICAJCQl9Ci0gICAgICAgIAotICAJCQlJdGVyYXRvciBpdCA9IGRyYWdBY3Rpb25zLml0ZXJhdG9yKCk7Ci0gIAkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgCQkJCWRyYWdBY3Rpb24gPSAoV1NETERyYWdBY3Rpb24pIGl0Lm5leHQoKTsKLSAgCQkJCWNhbkV4ZWN1dGUgPSBkcmFnQWN0aW9uLmNhbkV4ZWN1dGUoKTsKLSAgCQkJCWlmIChjYW5FeGVjdXRlKQotICAJCQkJCWJyZWFrOwotICAJCQl9Ci0gIAkJfQotICAJfQotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkKLSAgeyAKLSAgICByZXR1cm4gY2FuRXhlY3V0ZTsKLSAgfSAgICAgCi0gIAotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgIGlmIChjYW5FeGVjdXRlKQotICAgIHsgCi0gICAgICBkcmFnQWN0aW9uLnJ1bigpOyAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBJRmlndXJlIGdldEZlZWRiYWNrRmlndXJlKCkgewotICAJaWYgKGRyYWdBY3Rpb24gIT0gbnVsbCkgewotICAJCXJldHVybiBkcmFnQWN0aW9uLmdldEZlZWRiYWNrRmlndXJlKCk7Ci0gIAl9Ci0gIAllbHNlIHsKLSAgCQlyZXR1cm4gbnVsbDsKLSAgCX0KLSAgfQotICAKLSAgLyoKLSAgICogVGhpcyBtZXRob2QgY29tcGVuc2F0ZXMgZm9yIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbgotICAgKi8KLSAgcHJpdmF0ZSBQb2ludCBnZXRQb2ludGVyTG9jYXRpb24oUG9pbnQgb3JpZ1BvaW50ZXJMb2NhdGlvbikgewotICAJIFBvaW50IGNvbXBlbnNhdGVkTG9jYXRpb24gPSBvcmlnUG9pbnRlckxvY2F0aW9uOwotICAJIEZpZ3VyZUNhbnZhcyBmaWd1cmVDYW52YXMgPSAoRmlndXJlQ2FudmFzKSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotICAgICBpbnQgeU9mZnNldCA9IGZpZ3VyZUNhbnZhcy5nZXRWaWV3cG9ydCgpLmdldFZlcnRpY2FsUmFuZ2VNb2RlbCgpLmdldFZhbHVlKCk7Ci0gICAgIGNvbXBlbnNhdGVkTG9jYXRpb24ueSA9IGNvbXBlbnNhdGVkTG9jYXRpb24ueSArIHlPZmZzZXQ7Ci0gICAgIAotICAgICByZXR1cm4gY29tcGVuc2F0ZWRMb2NhdGlvbjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9XU0RMRHJhZ0FuZERyb3BFZGl0UG9saWN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETERyYWdBbmREcm9wRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRkZGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9XU0RMRHJhZ0FuZERyb3BFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLQotcHVibGljIGNsYXNzIFdTRExEcmFnQW5kRHJvcEVkaXRQb2xpY3kgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkdyYXBoaWNhbEVkaXRQb2xpY3kKLXsgCi0gIHByb3RlY3RlZCBFZGl0UGFydFZpZXdlciB2aWV3ZXI7ICAgIAotICBwcm90ZWN0ZWQgV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbCBzZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeTsKLQotICBwdWJsaWMgV1NETERyYWdBbmREcm9wRWRpdFBvbGljeShFZGl0UGFydFZpZXdlciB2aWV3ZXIsIFdTRExTZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeUltcGwgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kpCi0gIHsKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICB0aGlzLnNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5ID0gc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXEpCi0gIHsKLQkgIHJldHVybiB0cnVlOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCi0gIHB1YmxpYyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkKLSAgewotICAgIFdTRExEcmFnQW5kRHJvcENvbW1hbmQgY29tbWFuZCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ2hhbmdlQm91bmRzUmVxdWVzdCkKLSAgICB7Ci0gICAgICBjb21tYW5kID0gbmV3IFdTRExEcmFnQW5kRHJvcENvbW1hbmQodmlld2VyLCAoQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0KTsgIAotICAgICAgc2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kuc2V0RHJhZ0FuZERyb3BDb21tYW5kKGNvbW1hbmQpOwotICAgIH0gCi0gICAgcmV0dXJuIGNvbW1hbmQ7ICAgICAgICAgICAgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETEdyYXBoTm9kZURyYWdUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETEdyYXBoTm9kZURyYWdUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MmI5MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZWRpdHBvbGljaWVzL1dTRExHcmFwaE5vZGVEcmFnVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRyYWdFZGl0UGFydHNUcmFja2VyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLXB1YmxpYyBjbGFzcyBXU0RMR3JhcGhOb2RlRHJhZ1RyYWNrZXIgZXh0ZW5kcyBEcmFnRWRpdFBhcnRzVHJhY2tlciAKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBFZGl0UGFydCBlZGl0UGFydDsgCi0gICAgICAgICAgIAotICBwdWJsaWMgV1NETEdyYXBoTm9kZURyYWdUcmFja2VyKEVkaXRQYXJ0IGVkaXRQYXJ0KQotICB7Ci0gICAgc3VwZXIoZWRpdFBhcnQpOwotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsKLSAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29tbWFuZCgpIAotICB7IAotCSAgUmVxdWVzdCByZXF1ZXN0ID0gZ2V0VGFyZ2V0UmVxdWVzdCgpOwotICAgIHJldHVybiBlZGl0UGFydC5nZXRDb21tYW5kKHJlcXVlc3QpOyAKLSAgfQotfSAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9XU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9lZGl0cG9saWNpZXMvV1NETFNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDM4ZDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2VkaXRwb2xpY2llcy9XU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTW92ZUhhbmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuSUZlZWRiYWNrSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5lZGl0cGFydHMuV1NETFRyZWVOb2RlRWRpdFBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3lJbXBsCWV4dGVuZHMgU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kKLXsKLSAgcHJvdGVjdGVkIElGaWd1cmUgZmVlZGJhY2s7Ci0gIHByb3RlY3RlZCBSZWN0YW5nbGUgb3JpZ2luYWxMb2NhdGlvbjsKLSAgcHJvdGVjdGVkIFdTRExEcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kOwotCi0gIHByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKQotICB7ICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7ICAKLQotICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KQotICAgIHsKLSAgICAgIEdyYXBoaWNhbEVkaXRQYXJ0IGdyYXBoaWNhbEVkaXRQYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgSUZpZ3VyZSBmaWd1cmUgPSAoZ3JhcGhpY2FsRWRpdFBhcnQgaW5zdGFuY2VvZiBXU0RMVHJlZU5vZGVFZGl0UGFydCkgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChXU0RMVHJlZU5vZGVFZGl0UGFydClncmFwaGljYWxFZGl0UGFydCkuZ2V0U2VsZWN0aW9uRmlndXJlKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljYWxFZGl0UGFydC5nZXRGaWd1cmUoKTsKLSAgIAotICAgICAgTW92ZUhhbmRsZUxvY2F0b3IgbG9jID0gbmV3IE1vdmVIYW5kbGVMb2NhdG9yKGZpZ3VyZSk7ICAgIAotICAgICAgTW92ZUhhbmRsZSBtb3ZlSGFuZGxlID0gbmV3IE1vdmVIYW5kbGUoZ3JhcGhpY2FsRWRpdFBhcnQsIGxvYyk7ICAgICAKLSAgICAgIGxpc3QuYWRkKG1vdmVIYW5kbGUpOwotICAgIH0KLQotICAgIHJldHVybiBsaXN0OwotICB9ICAgCi0gIAotCi0gIHB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpCi0gIHsgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCSAgaWYgKFJFUV9NT1ZFLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpCi0gICAgeyAgCi0JCSAgcmVzdWx0ID0gZmFsc2U7IC8vIHJldHVybiBmYWxzZSB0byBkaXNhYmxlIG1vdmUgZm9yIG5vdyAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkgICAgcmVzdWx0ID0gc3VwZXIudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcXVlc3QpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotCi0gIHB1YmxpYyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbnVsbDsgIAotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RHJhZ0FuZERyb3BDb21tYW5kKFdTRExEcmFnQW5kRHJvcENvbW1hbmQgZHJhZ0FuZERyb3BDb21tYW5kKQotICB7Ci0gICAgdGhpcy5kcmFnQW5kRHJvcENvbW1hbmQgPSBkcmFnQW5kRHJvcENvbW1hbmQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgZ2V0TW92ZUNvbW1hbmQoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSAKLSAgewotCSAgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXEgPSBuZXcgQ2hhbmdlQm91bmRzUmVxdWVzdChSRVFfTU9WRV9DSElMRFJFTik7Ci0JICByZXEuc2V0RWRpdFBhcnRzKGdldEhvc3QoKSk7Ci0JCi0JICByZXEuc2V0TW92ZURlbHRhKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCSAgcmVxLnNldFNpemVEZWx0YShyZXF1ZXN0LmdldFNpemVEZWx0YSgpKTsKLQkgIHJlcS5zZXRMb2NhdGlvbihyZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCi0JICByZXR1cm4gZ2V0SG9zdCgpLmdldFBhcmVudCgpLmdldENvbW1hbmQocmVxKTsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBzaG93U291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KQotICB7Ci0gIAllcmFzZUNoYW5nZUJvdW5kc0ZlZWRiYWNrKG51bGwpOwotICAJCi0gIAlpZiAoZHJhZ0FuZERyb3BDb21tYW5kICE9IG51bGwgJiYgZHJhZ0FuZERyb3BDb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCSAgaWYgKFJFUV9NT1ZFLmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkgfHwgUkVRX0FERC5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKSB7Ci0JCSAgc2hvd01vdmVDaGFuZ2VCb3VuZHNGZWVkYmFjaygoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdCk7Ci0JICB9Ci0JICBlbHNlIGlmIChSRVFfQ0xPTkUuZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCSAgCSAgc2hvd0NvcHlDaGFuZ2VCb3VuZHNGZWVkYmFjaygoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdCk7Ci0JICB9Ci0gIAl9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzaG93TW92ZUNoYW5nZUJvdW5kc0ZlZWRiYWNrKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkKLSAgewotICAJaWYgKGRyYWdBbmREcm9wQ29tbWFuZCAhPSBudWxsICYmIGRyYWdBbmREcm9wQ29tbWFuZC5nZXRGZWVkYmFja0ZpZ3VyZSgpICE9IG51bGwpIHsKLSAgCQlmZWVkYmFjayA9IGRyYWdBbmREcm9wQ29tbWFuZC5nZXRGZWVkYmFja0ZpZ3VyZSgpOwotICAJCWFkZEZlZWRiYWNrKGZlZWRiYWNrKTsKLSAgCX0KLSAgfSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgc2hvd0NvcHlDaGFuZ2VCb3VuZHNGZWVkYmFjayhDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpCi0gIHsKLSAgCS8qCi0gIAlJRmlndXJlIHAgPSBnZXREcmFnU291cmNlRmVlZGJhY2tGaWd1cmUoKTsKLSAgCVJlY3RhbmdsZSByID0gb3JpZ2luYWxMb2NhdGlvbi5nZXRUcmFuc2xhdGVkKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotICAJRGltZW5zaW9uIHJlc2l6ZSA9IHJlcXVlc3QuZ2V0U2l6ZURlbHRhKCk7Ci0gIAlyLndpZHRoICs9IHJlc2l6ZS53aWR0aDsKLSAgCXIuaGVpZ2h0Kz0gcmVzaXplLmhlaWdodDsKLSAgCi0gIAkoKEdyYXBoaWNhbEVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLSAgCXAudHJhbnNsYXRlVG9SZWxhdGl2ZShyKTsKLSAgICAgICAgICAgICAgICAKLSAgICBSZWN0YW5nbGUgcEJvdW5kcyA9IHIuZ2V0Q29weSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGlmIChkcmFnQW5kRHJvcENvbW1hbmQgIT0gbnVsbCAmJiBkcmFnQW5kRHJvcENvbW1hbmQuY2FuRXhlY3V0ZSgpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGludCBzaXplID0gcmVxdWVzdC5nZXRFZGl0UGFydHMoKS5zaXplKCk7Ci0gICAgICBpZiAoc2l6ZSA+IDAgJiYgcmVxdWVzdC5nZXRFZGl0UGFydHMoKS5nZXQoc2l6ZSAtIDEpID09IGdldEhvc3QoKSkKLSAgICAgIHsgICAgICAgICAKLSAgICAgICAgUG9pbnRMaXN0IHBvaW50TGlzdCA9IGRyYWdBbmREcm9wQ29tbWFuZC5nZXRDb25uZWN0aW9uUG9pbnRzKHIpOwotICAgICAgICBpZiAocG9pbnRMaXN0ICE9IG51bGwgJiYgcG9pbnRMaXN0LnNpemUoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBwb2x5TGluZS5zZXRQb2ludHMocG9pbnRMaXN0KTsKLSAgICAgICAgICAKLSAgICAgICAgICBQb2ludCBmaXJzdFBvaW50ID0gcG9pbnRMaXN0LmdldEZpcnN0UG9pbnQoKTsKLSAgICAgICAgICBpZiAoZmlyc3RQb2ludCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBCb3VuZHMgPSBwQm91bmRzLmdldFVuaW9uKG5ldyBSZWN0YW5nbGUoZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnksIDEsIDEpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcC5zZXRCb3VuZHMocEJvdW5kcyk7Ci0gICAgZ2hvc3RTaGFwZS5zZXRCb3VuZHMocik7Ci0gIAlwLnZhbGlkYXRlKCk7Ci0gIAkqLwotICB9ICAgICAgICAKLS8qCi0gIHByb3RlY3RlZCBJRmlndXJlIGdldERyYWdTb3VyY2VGZWVkYmFja0ZpZ3VyZSgpIAotICB7Ci0gICAgRWRpdFBhcnQgZWRpdFBhcnQgPSBnZXRIb3N0KCk7IAotICAgIGlmIChmZWVkYmFjayA9PSBudWxsICYmIGVkaXRQYXJ0IGluc3RhbmNlb2YgV1NETFRyZWVOb2RlRWRpdFBhcnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgV1NETFRyZWVOb2RlRWRpdFBhcnQgYmFzZUVkaXRQYXJ0ID0gKFdTRExUcmVlTm9kZUVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgb3JpZ2luYWxMb2NhdGlvbiA9IG5ldyBSZWN0YW5nbGUoYmFzZUVkaXRQYXJ0LmdldFNlbGVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLSAgICAgIGZlZWRiYWNrID0gY3JlYXRlRHJhZ1NvdXJjZUZlZWRiYWNrRmlndXJlKGJhc2VFZGl0UGFydC5nZXRTZWxlY3Rpb25GaWd1cmUoKSk7Ci0JfQotCXJldHVybiBmZWVkYmFjazsKLSAgfQotCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZURyYWdTb3VyY2VGZWVkYmFja0ZpZ3VyZShJRmlndXJlIGRyYWdnZWRGaWd1cmUpCi0gIHsgIAkKLSAgCVBvbHlsaW5lIHBvbHlMaW5lID0gbmV3IFBvbHlsaW5lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAotLy8gICAgcG9seUxpbmUuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfREFTSERPVCk7ICAgICAgCi0gICAgcG9seUxpbmUuc2V0TGluZVdpZHRoKDEpOwotICAgIGFkZEZlZWRiYWNrKHBvbHlMaW5lKTsKLQkJCQotICAJcmV0dXJuIHBvbHlMaW5lOwotCX0gCi0JKi8KLQotICBwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkKLSAgewotCSAgaWYgKGZlZWRiYWNrICE9IG51bGwpCi0gICAgewotCQkgIHJlbW92ZUZlZWRiYWNrKGZlZWRiYWNrKTsKLQkJICBmZWVkYmFjayA9IG51bGw7Ci0JICB9Ci0JICBoaWRlRm9jdXMoKTsKLQkgIHN1cGVyLmRlYWN0aXZhdGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBFcmFzZSBmZWVkYmFjayBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlY2VpdmVyIG9iamVjdCBpcyAKLSAgICogYmVpbmcgZHJhZ2dlZC4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgZHJhZyBpcwotICAgKiBjb21wbGV0ZWQgb3IgY2FuY2VsbGVkIG9uIHRoZSByZWNlaXZlciBvYmplY3QuCi0gICAqIEBwYXJhbSBkcmFnVHJhY2tlciBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRHJhZ1RyYWNrZXIgVGhlIGRyYWcgdHJhY2tlciBvZiB0aGUgdG9vbCBwZXJmb3JtaW5nIHRoZSBkcmFnLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZXJhc2VDaGFuZ2VCb3VuZHNGZWVkYmFjayhDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIAotICB7Ci0JICBpZiAoZmVlZGJhY2sgIT0gbnVsbCkgCi0gICAgewkJICAgICAgCi0JCSAgcmVtb3ZlRmVlZGJhY2soZmVlZGJhY2spOwotCSAgfQotCSAgZmVlZGJhY2sgPSBudWxsOwotCSAgb3JpZ2luYWxMb2NhdGlvbiA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogRXJhc2UgZmVlZGJhY2sgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNlaXZlciBvYmplY3QgaXMgCi0gICAqIGJlaW5nIGRyYWdnZWQuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGRyYWcgaXMKLSAgICogY29tcGxldGVkIG9yIGNhbmNlbGxlZCBvbiB0aGUgcmVjZWl2ZXIgb2JqZWN0LgotICAgKiBAcGFyYW0gZHJhZ1RyYWNrZXIgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRyYWdUcmFja2VyIFRoZSBkcmFnIHRyYWNrZXIgb2YgdGhlIHRvb2wgcGVyZm9ybWluZyB0aGUgZHJhZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSAKLSAgewotICAgIGlmIChSRVFfTU9WRS5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpIHx8ICBSRVFfQURELmVxdWFscyhyZXF1ZXN0LmdldFR5cGUoKSkpCi0gICAgewotCQkgIGVyYXNlQ2hhbmdlQm91bmRzRmVlZGJhY2soKENoYW5nZUJvdW5kc1JlcXVlc3QpcmVxdWVzdCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IGdldEhvc3QoKTsKLSAgICBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBJRmVlZGJhY2tIYW5kbGVyKQotICAgIHsKLSAgICAgICgoSUZlZWRiYWNrSGFuZGxlcillZGl0UGFydCkucmVtb3ZlRmVlZGJhY2soKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkKLSAgewotICAgIEVkaXRQYXJ0IGVkaXRQYXJ0ID0gZ2V0SG9zdCgpOwotICAgIGlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElGZWVkYmFja0hhbmRsZXIpCi0gICAgewotICAgICAgKChJRmVlZGJhY2tIYW5kbGVyKWVkaXRQYXJ0KS5hZGRGZWVkYmFjaygpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvRXhwYW5kYWJsZUdyYXBoTm9kZUNvbnRlbnRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvRXhwYW5kYWJsZUdyYXBoTm9kZUNvbnRlbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyMGRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0V4cGFuZGFibGVHcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5JbnRlcmFjdG9yOwotCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAKLQotLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgfCBFeHBhbmRhYmxlR3JhcGhOb2RlQ29udGVudEZpZ3VyZSAgICAgICAgIHwKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICB8Ci0vLyAgfCAgIHwgdmVydGljYWxHcm91cCAgICAgICAgICAgICAgICAgIHwgICAgIHwKLS8vICB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAotLy8gIHwgICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICB8ICAgICB8Ci0vLyAgfCAgIHwgfCBob3Jpem9udGFsR3JvdXAgICAgICAgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCB8IG91dGxpbmVkQXJlYSAgICAgIHwgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgfCB8WytdaWNvbkFyZWEgICAgfCB8ICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCB8IC0tLS0tLS0tLS0tLS0tLS0tIHwgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IHwgLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IHwgfCB8IGlubmVyQ29udGVudCAgfCB8ICAgICB8ICB8ICAgICB8Ci0vLyAgfCAgIHwgfCB8IC0tLS0tLS0tLS0tLS0tLS0tIHwgICAgIHwgIHwgICAgIHwKLS8vICB8ICAgfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgfCAgfCAgICAgfAotLy8gIHwgICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICB8ICAgICB8Ci0vLyAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKLS8vICB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgfAotLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBjbGFzcyBFeHBhbmRhYmxlR3JhcGhOb2RlQ29udGVudEZpZ3VyZSBleHRlbmRzIEdyYXBoTm9kZUNvbnRlbnRGaWd1cmUKLXsgICAKLSAgcHJvdGVjdGVkIEludGVyYWN0b3IgaW50ZXJhY3RvcjsgCi0gIC8vcHJvdGVjdGVkIENvbnRhaW5lckZpZ3VyZSBvY2N1cmVuY2VBcmVhOyAgCi0gCi0gIHB1YmxpYyBFeHBhbmRhYmxlR3JhcGhOb2RlQ29udGVudEZpZ3VyZSgpCi0gIHsKLSAgICBzdXBlcigpOyAgICAKLSAgfSAgICAgIAotICAKLSAgcHVibGljIEludGVyYWN0b3IgZ2V0SW50ZXJhY3RvcigpCi0gIHsKLSAgICByZXR1cm4gaW50ZXJhY3RvcjsKLSAgfSAKLQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAKLSAgICAvL2NyZWF0ZVByZWNlZWRpbmdTcGFjZSh0aGlzKTsgICAgICAgICAgIAotICAgIGNyZWF0ZVZlcnRpY2FsR3JvdXAodGhpcyk7Ci0gICAgY3JlYXRlT3V0bGluZWRBcmVhKHZlcnRpY2FsR3JvdXApOyAgIAotICAgIGNyZWF0ZUludGVyYWN0b3IoaWNvbkFyZWEpOwotICAgIGlubmVyQ29udGVudEFyZWEuc2V0Qm9yZGVyKG5ldyBNYXJnaW5Cb3JkZXIoMCwgMTAsIDAsIDApKTsKLSAgICAvL2NyZWF0ZU9jY3VyZW5jZUFyZWEodmVydGljYWxHcm91cCk7ICAgCi0gIH0KLSAgCi0gICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUludGVyYWN0b3IoSUZpZ3VyZSBwYXJlbnQpCi0gIHsKLSAgICBpbnRlcmFjdG9yID0gbmV3IEludGVyYWN0b3IoKTsKLSAgICBpbnRlcmFjdG9yLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsIDAsIDAsIDUpKTsKLSAgICBpbnRlcmFjdG9yLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0gICAgaW50ZXJhY3Rvci5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOyAKLSAgICBwYXJlbnQuYWRkKGludGVyYWN0b3IpOwotICB9IAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcmVjZWVkaW5nU3BhY2UoSUZpZ3VyZSBwYXJlbnQpCi0gIHsKLSAgICAvLyBjcmVhdGUgYSBzbWFsbCBzcGFjZQotICAgIFJlY3RhbmdsZUZpZ3VyZSBzcGFjZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLSAgICBzcGFjZS5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICBzcGFjZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24oMTAsIDEwKSk7Ci0gICAgcGFyZW50LmFkZChzcGFjZSk7ICAKLSAgfSAgCi0gIAotCi0gIC8vcHJvdGVjdGVkIHZvaWQgY3JlYXRlT2NjdXJlbmNlQXJlYShJRmlndXJlIHBhcmVudCkKLSAgLy97Ci0gIC8vICBvY2N1cmVuY2VBcmVhID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOyAgICAgICAgICAgICAKLSAgLy8gIHBhcmVudC5hZGQob2NjdXJlbmNlQXJlYSk7Ci0gIC8vfSAgICAgICAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9HcmFwaE5vZGVDb250ZW50RmlndXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0dyYXBoTm9kZUNvbnRlbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRhZjVhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL0dyYXBoTm9kZUNvbnRlbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5maWd1cmVzLkNvbnRhaW5lckZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdlZi51dGlsLmZpZ3VyZXMuSUNvbm5lY3RlZEZpZ3VyZTsKLSAgICAgICAgICAgICAgCi0KLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICB8IEdyYXBoTm9kZUNvbnRlbnRGaWd1cmUgICAgIHwKLS8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIHwKLS8vICB8IHwgdmVydGljYWwgZ3JvdXAgICAgICAgIHwgIHwKLS8vICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgIHwKLS8vICB8IHwgfCBvdXRsaW5lZCBhcmVhICAgICB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCB8IGljb24gYXJlYSAgICAgfCB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgfCB8IGlubmVyIGNvbnRlbnQgfCB8IHwgIHwKLS8vICB8IHwgfCAtLS0tLS0tLS0tLS0tLS0tLSB8IHwgIHwKLS8vICB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgIHwKLS8vICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIHwKLS8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcHVibGljIGNsYXNzIEdyYXBoTm9kZUNvbnRlbnRGaWd1cmUgZXh0ZW5kcyBDb250YWluZXJGaWd1cmUgaW1wbGVtZW50cyBJQ29ubmVjdGVkRmlndXJlCi17ICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDb250YWluZXJGaWd1cmUgdmVydGljYWxHcm91cDsgCi0gIHByb3RlY3RlZCBDb250YWluZXJGaWd1cmUgb3V0bGluZWRBcmVhOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIGljb25BcmVhOwotICBwcm90ZWN0ZWQgQ29udGFpbmVyRmlndXJlIGlubmVyQ29udGVudEFyZWE7IAotICAgICAgICAgCi0gIHB1YmxpYyBHcmFwaE5vZGVDb250ZW50RmlndXJlKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNyZWF0ZUZpZ3VyZSgpOyAgICAgICAgICAgICAgICAgICAgCi0gIH0gICAgICAKLSAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWd1cmUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy9nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKHRydWUpOwotICAgIC8vc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBjcmVhdGVWZXJ0aWNhbEdyb3VwKHRoaXMpOwotICAgIGNyZWF0ZU91dGxpbmVkQXJlYSh2ZXJ0aWNhbEdyb3VwKTsgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJ0aWNhbEdyb3VwKElGaWd1cmUgcGFyZW50KQotICB7Ci0gICAgdmVydGljYWxHcm91cCA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICB2ZXJ0aWNhbEdyb3VwLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwoZmFsc2UpOwotICAgIC8vL3ZlcnRpY2FsR3JvdXAuc2V0TGF5b3V0TWFuYWdlcihuZXcgRmlsbExheW91dCgpKTsKLSAgICBwYXJlbnQuYWRkKHZlcnRpY2FsR3JvdXApOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3V0bGluZWRBcmVhKElGaWd1cmUgcGFyZW50KQotICB7IAotICAgIG91dGxpbmVkQXJlYSA9IG5ldyBDb250YWluZXJGaWd1cmUoKTsKLSAgICAvL291dGxpbmVkQXJlYS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIG91dGxpbmVkQXJlYS5nZXRDb250YWluZXJMYXlvdXQoKS5zZXRIb3Jpem9udGFsKGZhbHNlKTsKLSAgICBwYXJlbnQuYWRkKG91dGxpbmVkQXJlYSk7ICAgICAgCi0gICAgIAotICAgIGljb25BcmVhID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIGljb25BcmVhLmdldENvbnRhaW5lckxheW91dCgpLnNldEhvcml6b250YWwodHJ1ZSk7Ci0gICAgb3V0bGluZWRBcmVhLmFkZChpY29uQXJlYSk7Ci0KLSAgICBpbm5lckNvbnRlbnRBcmVhID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOwotICAgIC8vaW5uZXJDb250ZW50QXJlYS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBGaWxsTGF5b3V0KCkpOwotICAgIGlubmVyQ29udGVudEFyZWEuZ2V0Q29udGFpbmVyTGF5b3V0KCkuc2V0SG9yaXpvbnRhbChmYWxzZSk7Ci0gICAgb3V0bGluZWRBcmVhLmFkZChpbm5lckNvbnRlbnRBcmVhKTsgIAotICB9ICAgCi0KLSAgcHVibGljIENvbnRhaW5lckZpZ3VyZSBnZXRJY29uQXJlYSgpCi0gIHsKLSAgICByZXR1cm4gaWNvbkFyZWE7Ci0gIH0KLQotICBwdWJsaWMgQ29udGFpbmVyRmlndXJlIGdldE91dGxpbmVkQXJlYSgpCi0gIHsKLSAgICByZXR1cm4gb3V0bGluZWRBcmVhOwotICB9Ci0KLSAgcHVibGljIENvbnRhaW5lckZpZ3VyZSBnZXRJbm5lckNvbnRlbnRBcmVhKCkKLSAgewotICAgIHJldHVybiBpbm5lckNvbnRlbnRBcmVhOwotICB9IAotCi0gIHB1YmxpYyBJRmlndXJlIGdldENvbm5lY3Rpb25GaWd1cmUoKQotICB7Ci0gICAgcmV0dXJuIG91dGxpbmVkQXJlYTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9maWd1cmVzL015Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjg1MzdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5maWd1cmVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5EZWZpbml0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkdyb3VwRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLlBhcnRSZWZlcmVuY2VTZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5JQ29ubmVjdGVkRmlndXJlOwotICAgICAgICAgICAgICAKLQotcHVibGljIGNsYXNzIE15Q29ubmVjdGlvblJlbmRlcmluZ0hlbHBlciAvL2ltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc091dGxpbmVkID0gdHJ1ZTsKLSAgcHJvdGVjdGVkIEVkaXRQYXJ0Vmlld2VyIHZpZXdlcjsKLQotICBwdWJsaWMgTXlDb25uZWN0aW9uUmVuZGVyaW5nSGVscGVyKEVkaXRQYXJ0Vmlld2VyIHZpZXdlcikKLSAgewotICAgIHRoaXMudmlld2VyID0gdmlld2VyOyAgICAKLSAgICAvL3ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgLy9zZXRGb2N1c1RyYXZlcnNhYmxlKGZhbHNlKTsgCi0gICAgLy9zZXRFbmFibGVkKGZhbHNlKTsgCi0gIH0gICAgICAKLSAgCi0gIC8vcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIAotICAvL3sKLSAgLy99Ci0gICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgZmlsbFNoYXBlSGVscGVyKEdyYXBoaWNzIGdyYXBoaWNzKQotICB7IAotICAgIGRyYXdMaW5lcyhncmFwaGljcywgdmlld2VyLmdldFJvb3RFZGl0UGFydCgpKTsgICAgCi0gIH0KLSAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0Q29ubmVjdGlvbkJvdW5kcyhJRmlndXJlIGZpZ3VyZSkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgUmVjdGFuZ2xlIHIgPSBudWxsOwotICAgIGlmIChmaWd1cmUgaW5zdGFuY2VvZiBJQ29ubmVjdGVkRmlndXJlKQotICAgIHsKLSAgICAgIElDb25uZWN0ZWRGaWd1cmUgY29ubmVjdGVkRmlndXJlID0gKElDb25uZWN0ZWRGaWd1cmUpZmlndXJlOwotICAgICAgciA9IGNvbm5lY3RlZEZpZ3VyZS5nZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByID0gZmlndXJlLmdldEJvdW5kcygpOwotICAgIH0KLSAgICByZXR1cm4gcjsgCi0gIH0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgZmluYWwgc3RhdGljIGludCBET1RURURfTElORV9IRUlHSFQgPSAyMDsKLSAgcHJvdGVjdGVkIGludCBnZXRDbGlwcGVkWShpbnQgeSwgUmVjdGFuZ2xlIGJvdW5kcykKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChib3VuZHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoeSA8IGJvdW5kcy55KQotICAgICAgewotICAgICAgICB5ID0gYm91bmRzLnk7Ci0gICAgICB9ICAgICAKLSAgICAgIGlmICh5ICA+IChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpKQotICAgICAgewotICAgICAgICB5ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0OyAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHk7Ci0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgZHJhd0xpbmUoR3JhcGhpY3MgZ3JhcGhpY3MsIElGaWd1cmUgYSwgSUZpZ3VyZSBiLCBpbnQgbXgsIFJlY3RhbmdsZSBib3VuZHMpCi0gIHsKLSAgICAgICAgUmVjdGFuZ2xlIHIxID0gZ2V0Q29ubmVjdGlvbkJvdW5kcyhhKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIyID0gZ2V0Q29ubmVjdGlvbkJvdW5kcyhiKTsKLSAgICAgICAgaW50IHgxID0gcjEueCArIHIxLndpZHRoOwotICAgICAgICBpbnQgeTEgPSByMS55ICsgcjEuaGVpZ2h0IC8gMjsKLSAgICAgICAgaW50IHgyID0gcjIueCAtIDE7Ci0gICAgICAgIGludCB5MiA9IHIyLnkgKyByMi5oZWlnaHQgLyAyOwotICAgICAgICAgIAotICAgICAgICBpbnQgY2xpcHBlZFkxID0gZ2V0Q2xpcHBlZFkoeTEsIGJvdW5kcyk7Ci0gICAgICAgIGludCBjbGlwcGVkWTIgPSBnZXRDbGlwcGVkWSh5MiwgYm91bmRzKTsKLQotICAgICAgICBncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCi0gICAgICAgIGlmIChjbGlwcGVkWTEgPT0geTEgfHwgY2xpcHBlZFkyID09IHkyKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBpZiAoY2xpcHBlZFkxID09IHkxKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIGRyYXcgaG9yaXpvbnRhbCBsaW5lCi0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIG14LCB5MSk7IAotICAgICAgICAgIH0KLSAgICAgICAKLSAgICAgICAgICBpZiAoY2xpcHBlZFkyID09IHkyKQotICAgICAgICAgIHsgICAgICAgIAotICAgICAgICAgICAgLy8gZHJhdyBob3Jpem9udGFsIGxpbmUKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCB5MiwgeDIgLSAxLCB5Mik7ICAgIAotCi0gICAgICAgICAgICAvLyBkcmF3IHRoZSBhcnJvdyBoZWFkCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUoeDIgLSAxLCB5MiwgeDIgLSA0LCB5MiAtIDMpOyAKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgyIC0gMSwgeTIsIHgyIC0gNCwgeTIgKyAzKTsgCi0gICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIAotICAgICAgICAgIC8vIGRyYXcgdGhlIHZlcnRpY2FsIGxpbmUgaW5jbHVkaW5nIGRvdHRlZCBlbmRzCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpbnQgbG93Q2xpcHBlZFkgPSBNYXRoLm1pbihjbGlwcGVkWTEsIGNsaXBwZWRZMik7Ci0gICAgICAgICAgaW50IGhpZ2hDbGlwcGVkWSA9IE1hdGgubWF4KGNsaXBwZWRZMSwgY2xpcHBlZFkyKTsKLSAgICAgICAgICBpbnQgbG93WSA9IE1hdGgubWluKHkxLCB5Mik7Ci0gICAgICAgICAgaW50IGhpZ2hZID0gTWF0aC5tYXgoeTEsIHkyKTsKLSAgICAgICAgICAgIAotICAgICAgICAgIGlmIChsb3dZID09IGxvd0NsaXBwZWRZICYmIGhpZ2hZID09IGhpZ2hDbGlwcGVkWSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShteCwgbG93Q2xpcHBlZFksIG14LCBoaWdoQ2xpcHBlZFkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgeyAKLSAgICAgICAgICAgIGludCBkb3R0ZWRMaW5lTGVuZ3RoID0gTWF0aC5taW4oRE9UVEVEX0xJTkVfSEVJR0hULCAoaGlnaFkgLSBsb3dZKS8zKTsKLSAgICAgICAgICAgIGlmIChsb3dZICE9IGxvd0NsaXBwZWRZKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9ET1QpOwotICAgICAgICAgICAgICBpbnQgZG90dGVkWSA9IGxvd0NsaXBwZWRZICsgZG90dGVkTGluZUxlbmd0aDsKLSAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0xpbmUobXgsIGxvd0NsaXBwZWRZLCBteCwgZG90dGVkWSk7IAotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCBkb3R0ZWRZLCBteCwgaGlnaENsaXBwZWRZKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8vaWYgKGhpZ2hZICE9IGhpZ2hDbGlwcGVkWSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZ3JhcGhpY3Muc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfRE9UKTsKLSAgICAgICAgICAgICAgaW50IGRvdHRlZFkgPSBoaWdoQ2xpcHBlZFkgLSBkb3R0ZWRMaW5lTGVuZ3RoOwotICAgICAgICAgICAgICBncmFwaGljcy5kcmF3TGluZShteCwgaGlnaENsaXBwZWRZLCBteCwgZG90dGVkWSk7IAotICAgICAgICAgICAgICBncmFwaGljcy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0gICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKG14LCBkb3R0ZWRZLCBteCwgbG93Q2xpcHBlZFkpOyAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGRyYXdMaW5lcyhHcmFwaGljcyBncmFwaGljcywgRWRpdFBhcnQgZWRpdFBhcnQpCi0gIHsgCi0gICAgaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgR3JvdXBFZGl0UGFydCkKLSAgICB7IAotICAgICAgR3JvdXBFZGl0UGFydCBsZWZ0R3JvdXBFZGl0UGFydCA9IChHcm91cEVkaXRQYXJ0KWVkaXRQYXJ0OwotICAgICAgR3JvdXBFZGl0UGFydCByaWdodEdyb3VwRWRpdFBhcnQgPSBsZWZ0R3JvdXBFZGl0UGFydC5nZXROZXh0KCk7Ci0KLSAgICAgIGlmIChsZWZ0R3JvdXBFZGl0UGFydCAhPSBudWxsICYmIHJpZ2h0R3JvdXBFZGl0UGFydCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGlmIChsZWZ0R3JvdXBFZGl0UGFydC5vdXRwdXRDb25uZWN0aW9uICE9IG51bGwgJiYgcmlnaHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG14ID0gcmlnaHRHcm91cEVkaXRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnggLSA1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgUmVjdGFuZ2xlIGwgPSBsZWZ0R3JvdXBFZGl0UGFydC5vdXRlclBhbmUuZ2V0Qm91bmRzKCk7Ci0gICAgICAgICAgUmVjdGFuZ2xlIHIgPSBsZWZ0R3JvdXBFZGl0UGFydC5vdXRlclBhbmUuZ2V0Qm91bmRzKCk7Ci0KLSAgICAgICAgICAvLyBoZXJlIHdlIGNvbXB1dGUgdGhlIHVuaW9uIG9mIHRoZSBncm91cCBib3VuZHMuLi4gcmVjdGFuZ2xlLnVuaW9uKCkgZG9lc24ndCBzZWVtIHRvIHdvcmsKLSAgICAgICAgICAvLwotICAgICAgICAgIGludCB1eDEgPSBNYXRoLm1pbihsLngsIHIueCk7IAotICAgICAgICAgIGludCB1eTEgPSBNYXRoLm1pbihsLnksIHIueSk7ICAgICAgIAotICAgICAgICAgIGludCB1eDIgPSBNYXRoLm1heChsLnggKyBsLndpZHRoLCByLnggKyByLndpZHRoKTsKLSAgICAgICAgICBpbnQgdXkyID0gTWF0aC5tYXgobC55ICsgbC5oZWlnaHQsIHIueSArIHIuaGVpZ2h0KTsKLSAgICAgICAgICBSZWN0YW5nbGUgYm91bmRzID0gbmV3IFJlY3RhbmdsZSh1eDEsIHV5MSwgdXgyIC0gdXgxLCB1eTIgLSB1eTEpOyAgICAgICAKLSAgICAgICAgICBkcmF3TGluZShncmFwaGljcywgbGVmdEdyb3VwRWRpdFBhcnQub3V0cHV0Q29ubmVjdGlvbi5nZXRGaWd1cmUoKSwgcmlnaHRHcm91cEVkaXRQYXJ0LmlucHV0Q29ubmVjdGlvbi5nZXRGaWd1cmUoKSwgbXgsIGJvdW5kcyk7ICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfSAgCi0gICAgZWxzZSBpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBQYXJ0UmVmZXJlbmNlU2VjdGlvbkVkaXRQYXJ0KQotICAgIHsKLSAgICAgIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKSA/IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KWVkaXRQYXJ0LmdldENoaWxkcmVuKCkuZ2V0KDApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsOwotICAgICAgaWYgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIERlZmluaXRpb25FZGl0UGFydCBkZWYgPSAoRGVmaW5pdGlvbkVkaXRQYXJ0KWVkaXRQYXJ0LmdldFBhcmVudCgpOwotICAgICAgICBHcm91cEVkaXRQYXJ0IGdyb3VwRWRpdFBhcnQgPSBkZWYuZ2V0R3JvdXBFZGl0UGFydChXU0RMR3JvdXBPYmplY3QuTUVTU0FHRVNfR1JPVVApOwotICAgICAgICBpZiAoZ3JvdXBFZGl0UGFydCAhPSBudWxsICYmIGdyb3VwRWRpdFBhcnQub3V0cHV0Q29ubmVjdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IG14ID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCAtIDEyOwotICAgICAgICAgIGRyYXdMaW5lKGdyYXBoaWNzLCBncm91cEVkaXRQYXJ0Lm91dHB1dENvbm5lY3Rpb24uZ2V0RmlndXJlKCksIGNoaWxkLmdldEZpZ3VyZSgpLCBteCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVkaXRQYXJ0LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgRWRpdFBhcnQgY2hpbGQgPSAoRWRpdFBhcnQpaS5uZXh0KCk7Ci0gICAgICAgIGRyYXdMaW5lcyhncmFwaGljcywgY2hpbGQpOwotICAgICAgfQotICAgIH0gCi0gIH0gICAgCi19ICAgICAKLQotLyoKLSAgICAvKgotICAgIExpc3QgY2hpbGRyZW4gPSBmaWd1cmUuZ2V0Q2hpbGRyZW4oKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIElGaWd1cmUgY2hpbGQgPSAoSUZpZ3VyZSlpLm5leHQoKTsKLSAgICAgIGRyYXdMaW5lcyhncmFwaGljcywgY2hpbGQpOyAgICAKLSAgICB9ICovIAotICAgICAgLyogIAotICAgICAgTGlzdCBjb25uZWN0ZWRGaWd1cmVzID0gZ3JhcGhOb2RlRmlndXJlLmdldENvbm5lY3RlZEZpZ3VyZXMoSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlLlJJR0hUX0NPTk5FQ1RJT04pOwotICAgICAgaW50IGNvbm5lY3RlZEZpZ3VyZXNTaXplID0gY29ubmVjdGVkRmlndXJlcy5zaXplKCk7ICAgICAgICAgICAgICAKLQotICAgICAgaWYgKGNvbm5lY3RlZEZpZ3VyZXNTaXplID4gMCkgCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGZpcnN0R3JhcGhOb2RlRmlndXJlID0gKElDb25uZWN0ZWRFZGl0UGFydEZpZ3VyZSljb25uZWN0ZWRGaWd1cmVzLmdldCgwKTsKLSAgICAgICAgUmVjdGFuZ2xlIHIgPSBncmFwaE5vZGVGaWd1cmUuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLmdldEJvdW5kcygpOyAgICAKLSAgICAgICAgICAKLSAgICAgICAgaW50IHgxID0gci54ICsgci53aWR0aDsKLSAgICAgICAgaW50IHkxID0gci55ICsgci5oZWlnaHQvMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGludCBzdGFydE9mQ2hpbGRCb3ggPSBmaXJzdEdyYXBoTm9kZUZpZ3VyZS5nZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLSAgICAgICAgaW50IHgyID0geDEgKyAoc3RhcnRPZkNoaWxkQm94IC0geDEpIC8gMzsKLSAgICAgICAgaW50IHkyID0geTE7Ci0gICAgICAKLSAgICAgICAgaWYgKGNvbm5lY3RlZEZpZ3VyZXNTaXplID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHN0YXJ0T2ZDaGlsZEJveCwgeTIpOyAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLy8gKGNvbm5lY3RlZEZpZ3VyZXMubGVuZ3RoID4gMSkKLSAgICAgICAgeyAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MSwgeTEsIHgyLCB5Mik7Ci0KLSAgICAgICAgICBpbnQgbWluWSA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgIGludCBtYXhZID0gLTE7Ci0KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25uZWN0ZWRGaWd1cmVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgSUNvbm5lY3RlZEVkaXRQYXJ0RmlndXJlIGNvbm5lY3RlZEZpZ3VyZSA9IChJQ29ubmVjdGVkRWRpdFBhcnRGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICAgICAgICBSZWN0YW5nbGUgY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlID0gY29ubmVjdGVkRmlndXJlLmdldENvbm5lY3Rpb25GaWd1cmUoKS5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgIGludCB5ID0gY2hpbGRDb25uZWN0aW9uUmVjdGFuZ2xlLnkgKyBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUuaGVpZ2h0IC8gMjsKLSAgICAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTsKLSAgICAgICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTsKLSAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdMaW5lKHgyLCB5LCBjaGlsZENvbm5lY3Rpb25SZWN0YW5nbGUueCwgeSk7Ci0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBncmFwaGljcy5kcmF3TGluZSh4MiwgbWluWSwgeDIsIG1heFkpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0gICAgICAgICAgICAKLQotICAgIC8vYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdHJ1ZTsKLSAgICBMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBJRmlndXJlIGNoaWxkID0gKElGaWd1cmUpaS5uZXh0KCk7Ci0gICAgICBkcmF3TGluZXMoZ3JhcGhpY3MsIGNoaWxkKTsKLSAgICB9Ci0qLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9UcmVlTm9kZUNvbnRlbnRGaWd1cmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL2ZpZ3VyZXMvVHJlZU5vZGVDb250ZW50RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOGI3OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvZ3JhcGgvZmlndXJlcy9UcmVlTm9kZUNvbnRlbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZmlndXJlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLSAgICAgICAgICAgICAgCi0KLXB1YmxpYyBjbGFzcyBUcmVlTm9kZUNvbnRlbnRGaWd1cmUgZXh0ZW5kcyBFeHBhbmRhYmxlR3JhcGhOb2RlQ29udGVudEZpZ3VyZQoteyAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPdXRsaW5lZEFyZWEoSUZpZ3VyZSBwYXJlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIuY3JlYXRlT3V0bGluZWRBcmVhKHBhcmVudCk7Ci0gICAgb3V0bGluZWRBcmVhLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDAsMiwwLDIpKTsgCi0gIH0gICAgCi0gIAotICBwdWJsaWMgSUZpZ3VyZSBnZXRDb25uZWN0aW9uRmlndXJlKCkKLSAgewotICAgIHJldHVybiBvdXRsaW5lZEFyZWE7Ci0gIH0gICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL1dTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2dyYXBoL21vZGVsL1dTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNmNlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9ncmFwaC9tb2RlbC9XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguVmlld01vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkKLXsgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSB3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2U7Ci0KLSAgcHVibGljIHN0YXRpYyBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5IGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKQotICB7ICAgICAgICAgICAgICAgIAotICAgIGlmICh3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2RsR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5SW5zdGFuY2UgPSBuZXcgV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeUluc3RhbmNlOwotICB9ICAKLSAgCi0gIHByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IEdyYXBoQWRhcHRlckZhY3RvcnkoKTsKLSAgfSAgCi0KLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVuc2liaWxpdHlFbGVtZW50Q29uc2lkZXJlZENoaWxkKCkKLSAgLy97Ci0gIC8vICByZXR1cm4gZmFsc2U7Ci0gIC8vfQotICAgICAgICAKLQotICAvLyBUaGVyZSBhcmUgbWFueSBhZGFwdGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmYWN0b3J5LiAgRWFjaCBET00gTm9kZSBoYXMgaXRzIG93biBhZGFwdGVyLgotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdTRExBZGFwdGVyRmFjdG9yeUltcGwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlZmluaXRpb25BZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICB9IAotICAgIAotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoQmluZGluZ0FkYXB0ZXIoKTsKLSAgICB9IAotCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFydEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgR3JhcGhQYXJ0QWRhcHRlcigpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0QWRhcHRlcigpCi0gICAgLy97Ci0gICAgLy8gIHJldHVybiBuZXcgR3JhcGhQb3J0QWRhcHRlcigpOwotICAgIC8vfQotCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyYXBoUG9ydFR5cGVBZGFwdGVyKCk7Ci0gICAgfQotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVJbnB1dEFkYXB0ZXIoKQotICAgIC8vewotICAgIC8vICByZXR1cm4gbmV3IEdyYXBoSW5wdXRBZGFwdGVyKCk7Ci0gICAgLy99IAotCi0gICAgLy9wdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRwdXRBZGFwdGVyKCkKLSAgICAvL3sKLSAgICAvLyAgcmV0dXJuIG5ldyBHcmFwaE91dHB1dEFkYXB0ZXIoKTsKLSAgICAvL30gICAKLQotICAgIC8vcHVibGljIEFkYXB0ZXIgY3JlYXRlRmF1bHRBZGFwdGVyKCkKLSAgICAvL3sKLSAgICAvLyAgcmV0dXJuIG5ldyBHcmFwaEZhdWx0QWRhcHRlcigpOwotICAgIC8vfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlc0FkYXB0ZXIoKSAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiBuZXcgR3JhcGhUeXBlc0FkYXB0ZXIoKTsKLSAgICB9Ci0gIH0gICAgICAKLQotICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBHcmFwaERlZmluaXRpb25BZGFwdGVyIGV4dGVuZHMgRGVmaW5pdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBWaWV3TW9kZS5MaXN0ZW5lcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBWaWV3TW9kZSB2aWV3TW9kZSA9IG5ldyBWaWV3TW9kZSgpOyAgCi0gCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7ICAgCi0gICAgICB2aWV3TW9kZS5hZGRMaXN0ZW5lcih0aGlzKTsgICAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDApKTsKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDEpKTsgIAotICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoNSkpOwotICAgICAgaWYgKHZpZXdNb2RlLmlzQmluZGluZ1Zpc2libGUoKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoNCkpOwotICAgICAgfSAKLSAgICAgIGxpc3QuYWRkKHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuZ2V0KDMpKTsgIAotICAgICAgbGlzdC5hZGQocGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5nZXQoMikpOyAgCi0gICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzR3JvdXAuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChleHRlbnNpYmlsaXR5RWxlbWVudHNHcm91cCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsgICAgICAKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdmlld01vZGVDaGFuZ2VkKFZpZXdNb2RlIG1vZGUpCi0gICAgewotICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlZEhlbHBlcigpOwotICAgIH0gICAgCi0KLSAgICBwdWJsaWMgVmlld01vZGUgZ2V0Vmlld01vZGUoKQotICAgIHsKLSAgICAgIHJldHVybiB2aWV3TW9kZTsKLSAgICB9ICAgIAotCi0gICAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlckZhY3RvcnkgZ2V0TW9kZWxBZGFwdGVyRmFjdG9yeSgpCi0gICAgewotICAgICAgcmV0dXJuIGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICB9Ci0gIH0KLQotCi0KLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhCaW5kaW5nQWRhcHRlciBleHRlbmRzIEJpbmRpbmdBZGFwdGVyCi0gIHsgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgCi0gICAgICBpZiAoYmluZGluZy5nZXRQb3J0VHlwZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ki8gIAotICB9Ci0gICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhQYXJ0QWRhcHRlciBleHRlbmRzIFBhcnRBZGFwdGVyCi0gIHsgLyogIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgIE9iamVjdCBjb21wb25lbnQgPSBwYXJ0LmdldFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE8uLi4gaSdtIHB1bGxpbmcgYSBmYXN0IG9uZSBoZXJlLi4uLiB3ZSBzaG91bGQgY2FsbCB0aGUgZXh0ZW5zaW9uCi0gICAgICAgIC8vIHRvIHNlZSBpZiBoZSB3YW50cyB0byBzaG93IGEgY2hpbGQgaGVyZQotICAgICAgICBpZiAoY29tcG9uZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSovICAgCi0gIH0KLSAgICAKLSAgcHJvdGVjdGVkIGNsYXNzIEdyYXBoUG9ydFR5cGVBZGFwdGVyIGV4dGVuZHMgUG9ydFR5cGVBZGFwdGVyCi0gIHsgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImJpbmRpbmdzIikpCi0gICAgICB7ICAgIAotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwgPSBuZXcgQ29tcG9uZW50UmVmZXJlbmNlVXRpbChwb3J0VHlwZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICByZXN1bHQgPSB1dGlsLmdldEJpbmRpbmdzKHBvcnRUeXBlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkobW9kZWxPYmplY3QsIHByb3BlcnR5TmFtZSk7Ci0gICAgICB9ICAgCi0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gIAotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEdyYXBoUG9ydEFkYXB0ZXIgZXh0ZW5kcyBQb3J0QWRhcHRlciBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0gICAgCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylwb3J0LmdldEJpbmRpbmcoKTsKLQotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoYmluZGluZyk7Ci0gICAgICB9Ci0gICAgIAotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gcHJvcGFnYXRlIGNoYW5nZXMgdG8gdGhlIGJpbmRpbmcgb2JqZWN0Ci0gICAgLy8KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQocG9ydCwgbnVsbCk7Ci0gICAgfQotICB9ICAgCi0gICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhJbnB1dEFkYXB0ZXIgZXh0ZW5kcyBJbnB1dEFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChpbnB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoaW5wdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGlucHV0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdCA9IHV0aWwuZ2V0QmluZGluZ0lucHV0cyhpbnB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgCi0gIH0KLQotCi0gIHByb3RlY3RlZCBjbGFzcyBHcmFwaE91dHB1dEFkYXB0ZXIgZXh0ZW5kcyBPdXRwdXRBZGFwdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBpZiAob3V0cHV0LmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChvdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKG91dHB1dC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICByZXN1bHQgPSB1dGlsLmdldEJpbmRpbmdPdXRwdXRzKG91dHB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhGYXVsdEFkYXB0ZXIgZXh0ZW5kcyBGYXVsdEFkYXB0ZXIKLSAgewotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGlmIChmYXVsdC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoZmF1bHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0gICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAKLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsgICAgICAgICAgIAotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYmluZGluZ3MiKSkKLSAgICAgIHsgICAgCi0gICAgICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGZhdWx0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdCA9IHV0aWwuZ2V0QmluZGluZ0ZhdWx0cyhmYXVsdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KG1vZGVsT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOwotICAgICAgfSAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAgICAKLQotICBwdWJsaWMgY2xhc3MgR3JhcGhUeXBlc0FkYXB0ZXIgZXh0ZW5kcyBUeXBlc0FkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgcyA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudClvOwotICAgICAgICAgIE9iamVjdCBzY2hlbWEgPSBzLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZChzY2hlbWEpOwotICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbGlzdC5hZGQobyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAvKgotICBwcm90ZWN0ZWQgY2xhc3MgR3JhcGhCaW5kaW5nQWRhcHRlciBleHRlbmRzIEJpbmRpbmdBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgIAotICAgICAgaWYgKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nLmdldFBvcnRUeXBlKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgCi0gIH0qLwotCi0gIC8vIGNvbnZlbmllbmNlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKG1vZGVsT2JqZWN0KTsKLS8vICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gRWNvcmVVdGlsLmdldEFkYXB0ZXIoZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmVBZGFwdGVycygpLG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfSAgICAKLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIoT2JqZWN0IG1vZGVsT2JqZWN0LCBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9IAotCi0gIHB1YmxpYyBzdGF0aWMgVmlld01vZGUgZ2V0Vmlld01vZGUoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgR3JhcGhEZWZpbml0aW9uQWRhcHRlciBhZGFwdGVyID0gKEdyYXBoRGVmaW5pdGlvbkFkYXB0ZXIpZ2V0V1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIoZGVmaW5pdGlvbik7Ci0gICAgcmV0dXJuIGFkYXB0ZXIuZ2V0Vmlld01vZGUoKTsKLSAgfSAgICAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmFjay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMWEyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRpbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2JpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk2ZTJmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9iaW5kaW5naGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZmU1NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYmluZGluZ2hlYWRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDAyZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvYnJvd3NlYnV0dG9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2NvbXBsZXh0eXBlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9jb21wbGV4dHlwZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdmODUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2NvbXBsZXh0eXBlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9lbGVtZW50X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9lbGVtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDVmMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZXJyb3JfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZXJyb3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2Vycm9yX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZhdWx0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjI4MTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9maWxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTdhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZmxkcl9lbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mbGRyX2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxYzEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9mbGRyX2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ZvcndhcmQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjY5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9oaWRlYmluZGluZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9oaWRlYmluZGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDZjZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaGlkZWJpbmRpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBhZGRyZXNzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjBjMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBiaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwYmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI4ZWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHBiaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwb3BlcmF0aW9uX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9odHRwb3BlcmF0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDA0MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cG9wZXJhdGlvbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHB1cmxlbmNvZGVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNTA1MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2h0dHB1cmxyZXBsYWNlbWVudF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzU4N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ltcG9ydF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzI3NWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2ltcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvaW1wb3J0aGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwMGNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbXBvcnRoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2lucHV0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9pbnB1dF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZiMzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL2lucHV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9tZXNzYWdlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9tZXNzYWdlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2U0ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZWhlYWRlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbWVzc2FnZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmE3MTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL21lc3NhZ2VoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL25hbWVzcGFjZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlM2YyNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9uYW1lc3BhY2VkZWNsX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9uYW1lc3BhY2VkZWNsX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzlkMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmFtZXNwYWNlZGVjbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmV3X3dzZGxfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL25ld193c2RsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDg3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvbmV3X3dzZGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL29wZXJhdGlvbl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MThhMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vcGVyYXRpb25iaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzg2YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X25vLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF9uby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YjlmOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X25vLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDkxOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvb3V0cHV0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9vdXRwdXRfeWVzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF95ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL291dHB1dF95ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcGFnZV9iYW5uZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcGFnZV9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjMGIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhZ2VfYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhcnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BhcnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxOWRmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wYXJ0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OTQ5OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzI1Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcG9ydHR5cGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlaGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wb3J0dHlwZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjYzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BvcnR0eXBlaGVhZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRjbXBseHBsdHlwX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRjbXBseHBsdHlwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiODY2NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0Y21wbHhwbHR5cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0ZWxlbXRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydGVsZW10X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmQxMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvcHJ0ZWxlbXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydHNtcGx0eXBfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3BydHNtcGx0eXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmYzdjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9wcnRzbXBsdHlwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zZXJ2aWNlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTZiM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZWhlYWRlcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc2VydmljZWhlYWRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ4MTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NlcnZpY2VoZWFkZXJfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NpbXBsZXR5cGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NpbXBsZXR5cGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1ZGJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zaW1wbGV0eXBlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNDI2ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhZGRyZXNzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODBiYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGFkZHJlc3Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhdHRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBhdHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiMzY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYXR0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYmluZGluZ19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZjZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJvZHlfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBib2R5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZDAxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGJvZHlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGZhdWx0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NmIxZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MmVhM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGhlYWRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvc29hcGhlYWRlcmZhdWx0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwZTE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBvcGVyYXRpb25fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3NvYXBvcGVyYXRpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMTkxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy9zb2Fwb3BlcmF0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy90eXBlc19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdHlwZXNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNmY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy90eXBlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdmFsaWRhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvdmFsaWRhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjM0N2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL2ljb25zL3dzZGxfZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvd3NkbF9maWxlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjFmOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMvd3NkbF9maWxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2RfZmlsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX2ZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkY2ZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2RfZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvaWNvbnMveHNkX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkY2ZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9pY29ucy94c2Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTNlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsQWRhcHRlcgoteyAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTl9QUk9QRVJUWSA9ICJDSElMRFJFTl9QUk9QRVJUWSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1BST1BFUlRZID0gIkxBQkVMX1BST1BFUlRZIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfUFJPUEVSVFkgPSAiSU1BR0VfUFJPUEVSVFkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfUFJPUEVSVFkgPSAiREVUQUlMX1BST1BFUlRZIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsKTsKLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTW9kZWxBZGFwdGVyTGlzdGVuZXIgbCk7Ci0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKTsgCi0gIHB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG1vZGVsT2JqZWN0LCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIwZGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxBZGFwdGVyRmFjdG9yeQotewotICBwdWJsaWMgTW9kZWxBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IG8pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9Nb2RlbEFkYXB0ZXJMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNlODUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL01vZGVsQWRhcHRlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsQWRhcHRlckxpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9XU0RMR3JvdXBPYmplY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExHcm91cE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDlhYmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL21vZGVsL1dTRExHcm91cE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLQotCi0gIAotLy8gTm90ZSB0aGF0IHRoZSBUWVBFU19HUk9VUCBncm91cCBpcyBqdXN0IGEgcGxhY2UgaG9sZGVyLiAgSWYgdGhlIFR5cGVzIG9iZWpjdCBhY3R1YWxseSBleGlzdHMgCi0vLyBmb3IgdGhlIHJvb3QgV1NETCBkb2N1bWVudCwgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhpcyBtb2RlbCBncm91cAotLy8KLXB1YmxpYyBjbGFzcyBXU0RMR3JvdXBPYmplY3QgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXIKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUU19HUk9VUCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VTX0dST1VQID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRVNfR1JPVVAgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUX1RZUEVTX0dST1VQID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklORElOR1NfR1JPVVAgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFU19HUk9VUCA9IDY7ICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUCA9IDc7Ci0gICAgICAgICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgcHJvdGVjdGVkIGludCB0eXBlOyAgICAgICAKLSAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICBwcm90ZWN0ZWQgTW9kZWxBZGFwdGVyRmFjdG9yeSBtb2RlbEFkYXB0ZXJGYWN0b3J5OwotCi0gIHB1YmxpYyBXU0RMR3JvdXBPYmplY3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBpbnQgdHlwZSkKLSAgewotICAgIHRoaXMoZGVmaW5pdGlvbiwgdHlwZSwgbnVsbCk7Ci0gIH0gIAotCi0gIHB1YmxpYyBXU0RMR3JvdXBPYmplY3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBpbnQgdHlwZSwgTW9kZWxBZGFwdGVyRmFjdG9yeSBtb2RlbEFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgICB0aGlzLnR5cGUgPSB0eXBlOyAgICAgICAgCi0gICAgdGhpcy5tb2RlbEFkYXB0ZXJGYWN0b3J5ID0gbW9kZWxBZGFwdGVyRmFjdG9yeTsKLSAgfQotICAgICAKLSAgcHVibGljIERlZmluaXRpb24gZ2V0UGFyZW50KCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9ICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfSAgICAgICAgICAgICAgIAotCi0KLSAgcHVibGljIGludCBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiB0eXBlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpCi0gIHsgICAgICAgICAgICAKLSAgICBTdHJpbmcgbmFtZSA9ICIiOwotICAgIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIElNUE9SVFNfR1JPVVAgOgotICAgICAgeyAgICAgICAgICAgCi0gICAgICAgIG5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9GT0xERVJfSU1QT1JUUyIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTUVTU0FHRVNfR1JPVVAgOgotICAgICAgeyAgICAKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9NRVNTQUdFUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTRVJWSUNFU19HUk9VUCA6Ci0gICAgICB7Ci0gICAgICAgIG5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9GT0xERVJfU0VSVklDRVMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQklORElOR1NfR1JPVVAgOgotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgbmFtZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0ZPTERFUl9CSU5ESU5HUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAKLSAgICAgIGNhc2UgUE9SVF9UWVBFU19HUk9VUCA6Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBuYW1lID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRk9MREVSX1BPUlRUWVBFUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgICBjYXNlIFRZUEVTX0dST1VQIDoKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9GT0xERVJfVFlQRVMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0gCi0gICAgICBjYXNlIEVYVEVOU0lCSUxJVFlfRUxFTUVOVFNfR1JPVVA6Ci0gICAgICB7Ci0gICAgICAgIG5hbWUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9GT0xERVJfRVhURU5TSUJJTElUWV9FTEVNRU5UUyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gIAotICAgIHJldHVybiBuYW1lOwotICB9ICAgIAotICAgICAgICAgCi0KLSAgcHVibGljIEltYWdlIGdldEltYWdlKCkKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBJbWFnZSBpbWFnZSA9IG51bGw7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgSU1QT1JUU19HUk9VUCA6Ci0gICAgICB7ICAgIAotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvaW1wb3J0aGVhZGVyX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTUVTU0FHRVNfR1JPVVAgOgotICAgICAgeyAgICAKLSAgICAgICAgaW1hZ2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL21lc3NhZ2VoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBTRVJWSUNFU19HUk9VUCA6Ci0gICAgICB7Ci0gICAgICAgIGltYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9zZXJ2aWNlaGVhZGVyX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUE9SVF9UWVBFU19HUk9VUCA6Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcG9ydHR5cGVoZWFkZXJfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBCSU5ESU5HU19HUk9VUCA6Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYmluZGluZ2hlYWRlcl9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgIAotICAgICAgY2FzZSBUWVBFU19HUk9VUCA6Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvdHlwZXNfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJyZWFrOwotICAgICAgfSAKLSAgICAgIGNhc2UgRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUDoKLSAgICAgIHsKLSAgICAgICAgaW1hZ2UgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2ZsZHJfZWwuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgcmV0dXJuIGltYWdlOwotICB9ICAgCi0KLQotICAvLyBpbXBsZW1lbnQgTW9kZWxBZGFwdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGlmICghbGlzdGVuZXJMaXN0LmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICB7Ci0gICAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgICB9Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9IAotCi0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3QgbW9kZWxPYmplY3QsIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsgICAgICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ0hJTERSRU5fUFJPUEVSVFkpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldENoaWxkcmVuKCk7ICAgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMQUJFTF9QUk9QRVJUWSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0TGFiZWwoKTsgICAgICAKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU1BR0VfUFJPUEVSVFkpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEltYWdlKCk7ICAgICAgCi0gICAgfSAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChPYmplY3Qgbm90aWZpZXIsIFN0cmluZyBwcm9wZXJ0eSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdCAuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lciA9IChNb2RlbEFkYXB0ZXJMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChub3RpZmllciwgcHJvcGVydHkpOwotICAgIH0KLSAgfSAKLSAgIAotCi0gIHB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkKLSAgewotICAgIExpc3QgbGlzdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgICAgICAgICAgIAotICAgIENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCA9IG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGRlZmluaXRpb24pOwotICAgIHN3aXRjaCAoZ2V0VHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LklNUE9SVFNfR1JPVVAgOiAKLSAgICAgIHsgICAKLSAgICAgICAgbGlzdCA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5NRVNTQUdFU19HUk9VUCA6IAotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSBzb3J0TWVzc2FnZXModXRpbC5nZXRNZXNzYWdlcygpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSB1dGlsLmdldE1lc3NhZ2VzKCk7Ci0gICAgICAgIH0gIAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETEdyb3VwT2JqZWN0LlNFUlZJQ0VTX0dST1VQIDogCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSB1dGlsLmdldFNlcnZpY2VzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuUE9SVF9UWVBFU19HUk9VUCA6IAotICAgICAgeyAgICAgICAKLSAgICAgICAgbGlzdCA9IHV0aWwuZ2V0UG9ydFR5cGVzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBXU0RMR3JvdXBPYmplY3QuQklORElOR1NfR1JPVVAgOiAKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IHV0aWwuZ2V0QmluZGluZ3MoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5UWVBFU19HUk9VUCA6IAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBPYmplY3QgdHlwZXMgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpOwotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgIGxpc3QgPSAoTGlzdCltb2RlbEFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIodHlwZXMpLmdldFByb3BlcnR5KHR5cGVzLCBNb2RlbEFkYXB0ZXIuQ0hJTERSRU5fUFJPUEVSVFkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgICAgCi0gICAgICBjYXNlIFdTRExHcm91cE9iamVjdC5FWFRFTlNJQklMSVRZX0VMRU1FTlRTX0dST1VQOgotICAgICAgewotICAgICAgICBsaXN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKGRlZmluaXRpb24pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBpbml0aWFsU29ydChMaXN0IGlucHV0TGlzdCkgewotICAJTGlzdCBtZXNzYWdlR3JvdXBzID0gbmV3IEFycmF5TGlzdCgpOwotICAJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnB1dExpc3QuaXRlcmF0b3IoKTsKLSAgCQotICAJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAJCU1lc3NhZ2UgbmV3TWVzc2FnZSA9IChNZXNzYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0gIAkJCi0gIAkJYm9vbGVhbiBtZXNzYWdlQWRkZWQgPSBmYWxzZTsKLSAgCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZUdyb3Vwcy5zaXplKCk7IGluZGV4KyspIHsKLSAgCQkJTWVzc2FnZUdyb3VwIG1lc3NhZ2VJdGVtID0gKE1lc3NhZ2VHcm91cCkgbWVzc2FnZUdyb3Vwcy5nZXQoaW5kZXgpOwotICAJCQkKLSAgCQkJaWYobWVzc2FnZUl0ZW0uYWRkTWVzc2FnZShuZXdNZXNzYWdlKSkgewotICAJCQkJbWVzc2FnZUFkZGVkID0gdHJ1ZTsKLSAgCQkJCWJyZWFrOwotICAJCQl9Ci0gIAkJfQotICAJCQotICAJCS8vIERvIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IE1lc3NhZ2VHcm91cCBvYmplY3Q/Ci0gIAkJaWYgKCFtZXNzYWdlQWRkZWQpIHsKLSAgCQkJTWVzc2FnZUdyb3VwIG1zR3JvdXAgPSBuZXcgTWVzc2FnZUdyb3VwKG5ld01lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0JCQltc0dyb3VwLmFkZE1lc3NhZ2UobmV3TWVzc2FnZSk7Ci0gIAkJCW1lc3NhZ2VHcm91cHMuYWRkKG1zR3JvdXApOwotICAJCX0KLSAgCX0KLQotICAJcmV0dXJuIG1lc3NhZ2VHcm91cHM7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBidWlsZE1lc3NhZ2VMaXN0KExpc3QgbGlzdCkgewotICAJTGlzdCBzb3J0ZWRNZXNzYWdlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCQotICAJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gIAkJTWVzc2FnZUdyb3VwIG1Hcm91cCA9IChNZXNzYWdlR3JvdXApIGl0ZXJhdG9yLm5leHQoKTsKLSAgCQlzb3J0ZWRNZXNzYWdlTGlzdC5hZGRBbGwobUdyb3VwLmdldE1lc3NhZ2VzKCkpOwotICAJfQotICAJCi0gIAlyZXR1cm4gc29ydGVkTWVzc2FnZUxpc3Q7Ci0gIH0KLQotICBwcml2YXRlIExpc3Qgc29ydE1lc3NhZ2VzKExpc3QgaW5wdXRMaXN0KSB7Ci0gIAlMaXN0IHNvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlzb3J0ZWRMaXN0LmFkZEFsbChpbnB1dExpc3QpOwotICAJCi0gIAkvLyBHZXQgYSBzb3J0ZWQgbGlzdCBvZiBNZXNzYWdlR3JvdXBzCi0gIAlzb3J0ZWRMaXN0ID0gaW5pdGlhbFNvcnQoaW5wdXRMaXN0KTsKLQotICAJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLSAgCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgCQkJU3RyaW5nIG5hbWUxID0gKChNZXNzYWdlR3JvdXApIG8xKS5nZXRCYXNlTmFtZSgpOwotICAJCQlTdHJpbmcgbmFtZTIgPSAoKE1lc3NhZ2VHcm91cCkgbzIpLmdldEJhc2VOYW1lKCk7Ci0gIAkJCQotICAJCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lMik7Ci0gICAgICAJfSAgCQotICAJfSk7Ci0gIAkKLSAgCXNvcnRlZExpc3QgPSBidWlsZE1lc3NhZ2VMaXN0KHNvcnRlZExpc3QpOwotICAJcmV0dXJuIHNvcnRlZExpc3Q7Ci0gIH0KLSAgCi0gIHByaXZhdGUgY2xhc3MgTWVzc2FnZUdyb3VwIHsKLSAgCXByaXZhdGUgU3RyaW5nIGJhc2VOYW1lOwotICAJcHJpdmF0ZSBWZWN0b3IgbWVzc2FnZXM7Ci0gIAkKLSAgCXB1YmxpYyBNZXNzYWdlR3JvdXAoU3RyaW5nIG5hbWUpIHsKLSAgCQl0aGlzLmJhc2VOYW1lID0gY29tcHV0ZUJhc2VOYW1lKG5hbWUpOwotICAJCW1lc3NhZ2VzID0gbmV3IFZlY3RvcigpOwotICAJfQotICAJCi0gIAlwdWJsaWMgYm9vbGVhbiBhZGRNZXNzYWdlKE1lc3NhZ2UgbmV3TWVzc2FnZSkgewotICAJCS8vIGRvIGNoZWNrIGlmIGl0IGJlbG9uZ3MgaGVyZT8uLi4uLi4KLSAgCQlTdHJpbmcgbmV3TWVzc2FnZUJhc2VOYW1lID0gY29tcHV0ZUJhc2VOYW1lKG5ld01lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gIAkJCi0gIAkJaWYgKG5ld01lc3NhZ2VCYXNlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKGdldEJhc2VOYW1lKCkpKSB7Ci0gIAkJCWFkZFRvU29ydGVkTGlzdChuZXdNZXNzYWdlKTsKLSAgCQkJCi0gIAkJCXJldHVybiB0cnVlOwotICAJCX0KLSAgCQkKLSAgCQlyZXR1cm4gZmFsc2U7Ci0gIAl9Ci0gIAkKLSAgCXB1YmxpYyBWZWN0b3IgZ2V0TWVzc2FnZXMoKSB7Ci0gIAkJcmV0dXJuIG1lc3NhZ2VzOwotICAJfQotICAJCi0gIAlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewotICAJCXJldHVybiBiYXNlTmFtZTsKLSAgCX0KLSAgCQotICAJcHJpdmF0ZSBpbnQgZ2V0Rmlyc3RJbnN0YW5jZShTdHJpbmcgc3ViU3RyaW5nKSB7Ci0gIAkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1lc3NhZ2VzLnNpemUoKTsgaW5kZXgrKykgewotICAJCQlNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgbWVzc2FnZXMuZ2V0KGluZGV4KTsKLSAgCQkJU3RyaW5nIG1lc3NhZ2VOYW1lID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAJCQkKLSAgCQkJaWYgKG1lc3NhZ2VOYW1lLmluZGV4T2Yoc3ViU3RyaW5nLCAxKSA+IDApIHsKLSAgCQkJCXJldHVybiBpbmRleDsKLSAgCQkJfQotICAJCX0KLSAgCQkgIAkJCi0gIAkJcmV0dXJuIC0xOwotICAJfQotICAJCi0gIAlwcml2YXRlIHZvaWQgYWRkVG9Tb3J0ZWRMaXN0KE1lc3NhZ2UgbWVzc2FnZSkgewotICAJCS8vIFdlIG5lZWQgdG8gYWRkIHRoZSBuZXcgTWVzc2FnZSBpbiB0aGUgcmlnaHQgcG9zaXRpb24KLSAgCQlpbnQgaW5kZXggPSAtMTsKLSAgCQlTdHJpbmcgbmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgCQlpZiAobmFtZS5pbmRleE9mKCJSZXF1ZXN0IiwgMSkgPiAwKSB7Ci0gIAkJCS8vIEFkZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiAnUmVzcG9uc2UnCi0gIAkJCWluZGV4ID0gZ2V0Rmlyc3RJbnN0YW5jZSgiUmVzcG9uc2UiKTsKLSAgCQl9Ci0gIAkJZWxzZSBpZiAobmFtZS5pbmRleE9mKCJSZXNwb25zZSIsIDEpID4gMCkgewotICAJCQkvLyBBZGQgYWZ0ZXIgZmlyc3QgaW5zdGFuY2Ugb2YgJ1JlcXVlc3QnCi0gIAkJCWluZGV4ID0gZ2V0Rmlyc3RJbnN0YW5jZSgiUmVxdWVzdCIpOwotICAJCQlpZiAoaW5kZXggPj0gMCkKLSAgCQkJCWluZGV4Kys7Ci0gIAkJfQotICAJCQotICAJCWlmIChpbmRleCA+PSAwKSB7Ci0gIAkJCW1lc3NhZ2VzLmFkZChpbmRleCwgbWVzc2FnZSk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7Ci0gIAkJfQotICAJfQotICAJCi0gIAlwcml2YXRlIFN0cmluZyBjb21wdXRlQmFzZU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgCQlpbnQgcmVzUmVxSW5kZXggPSBuYW1lLmluZGV4T2YoIlJlcXVlc3QiLCAxKTsKLSAgCQlpbnQgcmVzUmVxTGVuZ3RoOwotICAJCWlmIChyZXNSZXFJbmRleCA9PSAtMSkgewotICAJCQlyZXNSZXFJbmRleCA9IG5hbWUuaW5kZXhPZigiUmVzcG9uc2UiLCAxKTsKLSAgCQkJcmVzUmVxTGVuZ3RoID0gIlJlc3BvbnNlIi5sZW5ndGgoKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJCXJlc1JlcUxlbmd0aCA9ICJSZXF1ZXN0Ii5sZW5ndGgoKTsKLSAgCQl9Ci0gIAkJCQkKLSAgCQkvLyBEaWQgd2UgZXZlbiBmaW5kIGEgUmVxdWVzdC9SZXNwb25zZSBpbiBib3RoIHN0cmluZ3M/Ci0gIAkJaWYgKHJlc1JlcUluZGV4ICE9IC0xKSB7Ci0gIAkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCByZXNSZXFJbmRleCkgKyBuYW1lLnN1YnN0cmluZyhyZXNSZXFJbmRleCArIHJlc1JlcUxlbmd0aCwgbmFtZS5sZW5ndGgoKSk7Ci0gIAkJfQotICAJCWVsc2UgeyAgCQkKLSAgCQkJcmV0dXJuIG5hbWU7Ci0gIAkJfQotICAJfQotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbW9kZWwvV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4NjU3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9tb2RlbC9XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsOwotICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLk9wZXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMU3dpdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklUcmVlQ2hpbGRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgTW9kZWxBZGFwdGVyRmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NETE1vZGVsQWRhcHRlckZhY3Rvcnkgd3NkbE1vZGVsQWRhcHRlckZhY3RvcnlJbnN0YW5jZTsKLQotICBwdWJsaWMgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgYWRhcHRlckZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpOwotICB9ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzRXh0ZW5zaWJpbGl0eUVsZW1lbnRDb25zaWRlcmVkQ2hpbGQoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRFeHRlbnNpYmxpdHlFbGVtZW50Q2hpbGRyZW4oTGlzdCBsaXN0LCBFeHRlbnNpYmxlRWxlbWVudCBleHRlbnNpYmxlRWxlbWVudCkKLSAgewotICAgIGlmIChpc0V4dGVuc2liaWxpdHlFbGVtZW50Q29uc2lkZXJlZENoaWxkKCkpCi0gICAgewotICAgICAgLy9saXN0LmFkZEFsbChXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXMoZXh0ZW5zaWJsZUVsZW1lbnQpKTsKLSAgICAgIGxpc3QuYWRkQWxsKFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnROb2RlcyhleHRlbnNpYmxlRWxlbWVudCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkgZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKQotICB7ICAgICAgICAgICAgICAgIAotICAgIGlmICh3c2RsTW9kZWxBZGFwdGVyRmFjdG9yeUluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgd3NkbE1vZGVsQWRhcHRlckZhY3RvcnlJbnN0YW5jZSA9IG5ldyBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gd3NkbE1vZGVsQWRhcHRlckZhY3RvcnlJbnN0YW5jZTsKLSAgfSAgCi0gICAgCi0KLSAgcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkKLSAgewotICAgIHJldHVybiBuZXcgV1NETEFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotICB9ICAgICAgICAgICAgCi0KLQotICBwdWJsaWMgTW9kZWxBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IG8pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLSAgICBpZiAobyBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSAgICAgICAgICAgICAgICAgICAgIAotICAgIHsKLSAgICAgIGFkYXB0ZXIgPSAoTW9kZWxBZGFwdGVyKWFkYXB0ZXJGYWN0b3J5LmFkYXB0KChXU0RMRWxlbWVudClvLCBhZGFwdGVyRmFjdG9yeSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBhZGFwdGVyID0gKFdTRExHcm91cE9iamVjdClvOwotICAgIH0KLSAgICByZXR1cm4gYWRhcHRlcjsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHB1YmxpYyBjbGFzcyBXU0RMQWRhcHRlckZhY3RvcnlJbXBsIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi0gIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBXU0RMU3dpdGNoIHdzZGxTd2l0Y2ggPSBuZXcgV1NETFN3aXRjaCgpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IHdzZGxFbGVtZW50KQotICAgICAgICB7ICAgCi0gICAgICAgICAgLy8gbm90ZSB0aGF0IHRoZSBXU0RMU3dpdGNoIGRvZXNuJ3QgaGFuZGxlIAotICAgICAgICAgIC8vIGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudCB3aGVuIHRoZSBvYmplY3QKLSAgICAgICAgICAvLyBjb21lcyBmcm9tIGFub3RoZXIgcGFja2FnZS4uLiB0aGF0IHdoeQotICAgICAgICAgIC8vIHdlIGhhdmUgYW4gaW5zdGFuY2VvZiBjaGVjayBoZXJlCi0JCSAgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0JCSAgewkKLQkJCXJldHVybiBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsgIAotCQkgIH0KLQkJICBlbHNlCi0JCSAgewkgIAotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpOwotCQkgIH0JCi0JICAgIH0gICAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCk7Ci0JICAgICAgfSAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdGYXVsdEFkYXB0ZXIoKTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0lucHV0QWRhcHRlcigpOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nT3V0cHV0QWRhcHRlcigpOwotCSAgICAgIH0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gCi0gCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkgICAgICB9ICAgICAgICAgICAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IGZhdWx0KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUZhdWx0QWRhcHRlcigpOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VJbXBvcnQoSW1wb3J0IGkpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlSW1wb3J0QWRhcHRlcigpOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBpbnB1dCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVJbnB1dEFkYXB0ZXIoKTsKLQkgICAgICB9IAkKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb3V0cHV0KQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZU91dHB1dEFkYXB0ZXIoKTsKLQkgICAgICB9IAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKTsKLQkgICAgICB9ICAgICAgIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gCi0KLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VQYXJ0KFBhcnQgcGFydCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVQYXJ0QWRhcHRlcigpOwotCSAgICAgIH0gIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IHBvcnQpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlUG9ydEFkYXB0ZXIoKTsKLQkgICAgICB9ICAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZVBvcnRUeXBlQWRhcHRlcigpOwotCSAgICAgIH0gIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlU2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlU2VydmljZUFkYXB0ZXIoKTsKLQkgICAgICB9ICAKLQotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZVR5cGVzKFR5cGVzIHR5cGVzKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZVR5cGVzQWRhcHRlcigpOwotCSAgICB9IAotICAgICAgICAKLQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLQkJewotCQkgIC8vIG5vdGUgdGhhdCB0aGUgV1NETFN3aXRjaCBkb2Vzbid0IGhhbmRsZSAKLSAgICAgICAgICAvLyBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQgd2hlbiB0aGUgb2JqZWN0Ci0gICAgICAgICAgLy8gY29tZXMgZnJvbSBhbm90aGVyIHBhY2thZ2UuLi4gdGhhdCB3aHkKLSAgICAgICAgICAvLyB3ZSBoYXZlIGFuIGluc3RhbmNlb2YgY2hlY2sgaGVyZQotCQkgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0JCSAgIHsJICAgCi0JICAgICAgICAgcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkgICB9Ci0JCSAgIGVsc2UKLQkJICAgewotCQkJIHJldHVybiBudWxsOwotCQkgICB9CSAgIAotICAgICAgICB9Ci0gICAgICB9OyAgIAotCi0gICAgICBPYmplY3QgbyA9IHdzZGxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQotCi0gICAgICBBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIEFkYXB0ZXIpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCAgPSAoQWRhcHRlcilvOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkaWQgbm90IGNyZWF0ZSBhZGFwdGVyIGZvciB0YXJnZXQgOiAiICsgdGFyZ2V0KTsKLSAgICAgICAgVGhyZWFkLmR1bXBTdGFjaygpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgV1NETEVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nQWRhcHRlcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nQWRhcHRlcigpOwotICAgIH0gICAKLQotIAkgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdGYXVsdEFkYXB0ZXIoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nRmF1bHRBZGFwdGVyKCk7Ci0gICAgfSAgICAgICAgICAgCi0KLSAJICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nSW5wdXRBZGFwdGVyKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJldHVybiBuZXcgQmluZGluZ0lucHV0QWRhcHRlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdPdXRwdXRBZGFwdGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEJpbmRpbmdPdXRwdXRBZGFwdGVyKCk7Ci0JICB9IAotICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCkKLSAgICB7ICAgICAKLSAgICAgIHJldHVybiBuZXcgQmluZGluZ09wZXJhdGlvbkFkYXB0ZXIoKTsKLSAgICB9Ci0gICAgICAgICAgCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWZpbml0aW9uQWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IERlZmluaXRpb25BZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZhdWx0QWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IEZhdWx0QWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbXBvcnRBZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgSW1wb3J0QWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbnB1dEFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBJbnB1dEFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZUFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBNZXNzYWdlQWRhcHRlcigpOwotCSAgfQotCi0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU9wZXJhdGlvbkFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBPcGVyYXRpb25BZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dHB1dEFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBPdXRwdXRBZGFwdGVyKCk7Ci0JICB9Ci0KLSAgCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhcnRBZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgUGFydEFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydEFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBQb3J0QWRhcHRlcigpOwotCSAgfQotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0VHlwZUFkYXB0ZXIoKSAKLSAgICB7Ci0JCSAgcmV0dXJuIG5ldyBQb3J0VHlwZUFkYXB0ZXIoKTsKLQkgIH0KLQotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUFkYXB0ZXIoKSAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLQkJICByZXR1cm4gbmV3IFNlcnZpY2VBZGFwdGVyKCk7Ci0JICB9IAotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlc0FkYXB0ZXIoKSAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAKLQkJICByZXR1cm4gbmV3IFR5cGVzQWRhcHRlcigpOwotCSAgfSAKLSAgICAKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgfQotCi0JCi0gICAgLy8gY29udmVuaWVuY2UgbWV0aG9kCi0gICAgLy8KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQpCi0gICAgewotICAgICAgcmV0dXJuIGFkYXB0KHRhcmdldCwgdGhpcyk7Ci0gICAgfQotICB9Ci0gICAgCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBXU0RMRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlcgotICB7ICAgCi0gICAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0KLSAgICBwdWJsaWMgV1NETEVsZW1lbnRBZGFwdGVyKCkKLSAgICB7Ci0gICAgfSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IGFkYXB0ZXJGYWN0b3J5OwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGlmICghbGlzdGVuZXJMaXN0LmNvbnRhaW5zKGxpc3RlbmVyKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgICB9ICAKLSAgICB9ICAKLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICAgIGlmIChsaXN0ZW5lckxpc3QuY29udGFpbnMobGlzdGVuZXIpKQotICAgICAgewotICAgICAgICBsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICAgIH0KLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZChPYmplY3Qgbm90aWZpZXIsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7ICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOyAgICAgICAgICAgICAgIAotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBNb2RlbEFkYXB0ZXJMaXN0ZW5lciBsaXN0ZW5lciA9IChNb2RlbEFkYXB0ZXJMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGdldFRhcmdldCgpLCBwcm9wZXJ0eSk7Ci0gICAgICB9Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgIT0gTm90aWZpY2F0aW9uLlJFU09MVkUpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlZChtc2cuZ2V0Tm90aWZpZXIoKSwgbnVsbCk7Ci0gICAgICB9Ci0gICAgfSAgCi0KLSAgICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KE9iamVjdCBtb2RlbE9iamVjdCwgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ0hJTERSRU5fUFJPUEVSVFkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXRDaGlsZHJlbigpOyAgICAgIAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExBQkVMX1BST1BFUlRZKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0TGFiZWwoKTsgICAgICAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTUFHRV9QUk9QRVJUWSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldEltYWdlKCk7Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiZXh0ZW5zaWJpbGl0eUVsZW1lbnRzIikpCi0gICAgICB7IAotICAgICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBFeHRlbnNpYmxlRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnROb2RlcygoRXh0ZW5zaWJsZUVsZW1lbnQpbW9kZWxPYmplY3QpOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaXNSZWFkT25seSIpKQotICAgICAgewotICAgICAgCUVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdCh0YXJnZXQpOyAKLSAgICAgCSAgcmVzdWx0ID0gKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgPyBCb29sZWFuLkZBTFNFIDogQm9vbGVhbi5UUlVFOyAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSAKLQotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiAidG9kbyI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotICAKLQotICBwcm90ZWN0ZWQgY2xhc3MgQmluZGluZ0FkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgQmluZGluZyBiaW5kaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5iaW5kaW5nID0gKEJpbmRpbmcpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgICAgICAgICAgICAKLSAgICAgIGFkZEV4dGVuc2libGl0eUVsZW1lbnRDaGlsZHJlbihsaXN0LCBiaW5kaW5nKTsKLSAgICAgIExpc3Qgb3BlcmF0aW9uc0xpc3QgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgTGlzdCB0ZW1wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRlbXBMaXN0LmFkZEFsbChvcGVyYXRpb25zTGlzdCk7Ci0gICAgICAKLSAgICAgIENvbGxlY3Rpb25zLnNvcnQodGVtcExpc3QsIG5ldyBDb21wYXJhdG9yKCkgewotICAgIAlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICAJCVN0cmluZyBzMSA9ICgoQmluZGluZ09wZXJhdGlvbikgbzEpLmdldE5hbWUoKTsKLSAgICAJCVN0cmluZyBzMiA9ICgoQmluZGluZ09wZXJhdGlvbikgbzIpLmdldE5hbWUoKTsKLSAgICAJCQotICAgIAkJaWYgKHMxID09IG51bGwpIHsKLSAgICAJCQlzMSA9ICIiOwotICAgIAkJfQotICAgIAkJaWYgKHMyID09IG51bGwpIHsKLSAgICAJCQlzMiA9ICIiOwotICAgIAkJfQotICAgIAkJCi0gICAgCQlib29sZWFuIGJvbyA9IHRydWU7Ci0gICAgICAJCXJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLSAgICAgIAl9Ci0gICAgICB9KTsKLSAgICAgIAotICAgICAgbGlzdC5hZGRBbGwodGVtcExpc3QpOwotICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2JpbmRpbmdfb2JqLmdpZiIpOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9ICAKLSAgICAKLQotICBwcm90ZWN0ZWQgY2xhc3MgQmluZGluZ0ZhdWx0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5iaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAKLSAgICAgIGFkZEV4dGVuc2libGl0eUVsZW1lbnRDaGlsZHJlbihsaXN0LCBiaW5kaW5nRmF1bHQpOwotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfSAgICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvZmF1bHRfb2JqLmdpZiIpOwotICAgIH0gICAgICAgICAgICAgICAKLSAgfSAKLQotCi0gIHByb3RlY3RlZCBjbGFzcyBCaW5kaW5nSW5wdXRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLmJpbmRpbmdJbnB1dCA9IChCaW5kaW5nSW5wdXQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgIAotICAgICAgYWRkRXh0ZW5zaWJsaXR5RWxlbWVudENoaWxkcmVuKGxpc3QsIGJpbmRpbmdJbnB1dCk7Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuICJpbnB1dCI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9pbnB1dF9vYmouZ2lmIik7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gIAotCi0gCi0gIHByb3RlY3RlZCBjbGFzcyBCaW5kaW5nT3V0cHV0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLmJpbmRpbmdPdXRwdXQgPSAoQmluZGluZ091dHB1dCluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgCi0gICAgICBhZGRFeHRlbnNpYmxpdHlFbGVtZW50Q2hpbGRyZW4obGlzdCwgYmluZGluZ091dHB1dCk7Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuICJvdXRwdXQiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3V0cHV0X29iai5naWYiKTsKLSAgICB9ICAgIAotICB9ICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBCaW5kaW5nT3BlcmF0aW9uQWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLmJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbiluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIAotICAgICAgYWRkRXh0ZW5zaWJsaXR5RWxlbWVudENoaWxkcmVuKGxpc3QsIGJpbmRpbmdPcGVyYXRpb24pOyAKLQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBsaXN0LmFkZEFsbChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkpOwotICAgICAgCi0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAgICAKLSAgICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3BlcmF0aW9uYmluZGluZ19vYmouZ2lmIik7Ci0gICAgfSAgICAgICAgICAgICAgIAotICB9ICAKLQotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3Q7Ci0gICAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLQotICAgIHByb3RlY3RlZCBXU0RMR3JvdXBPYmplY3QgdHlwZXNHcm91cDsKLSAgICBwcm90ZWN0ZWQgV1NETEdyb3VwT2JqZWN0IGV4dGVuc2liaWxpdHlFbGVtZW50c0dyb3VwOwotICAgIHByb3RlY3RlZCBUeXBlcyB0eXBlczsgCi0gICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5kZWZpbml0aW9uID0gKERlZmluaXRpb24pbmV3VGFyZ2V0OwotICAgICAKLSAgICAgIC8vIHRoaXMgZ3JvdXAgaXMgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgY2hpbGQgbGlzdCBkeW5hbWljYWxseQotICAgICAgLy8gZGVwZW5kYW50IG9uIHRoZSBwcmVzZW5jZSBvZiBhbiAnYWN0dWFsJyB0eXBlcyBlbGVtZW50Ci0gICAgICAvLwotICAgICAgdHlwZXNHcm91cCA9IG5ldyBXU0RMR3JvdXBPYmplY3QoZGVmaW5pdGlvbiwgV1NETEdyb3VwT2JqZWN0LlRZUEVTX0dST1VQLCBnZXRNb2RlbEFkYXB0ZXJGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gdGhlc2UgZ3JvdXBzIGFsd2F5cyBleGlzdCBpbiB0aGUgY2hpbGQgbGlzdCAgICAgIAotICAgICAgLy8KLSAgICAgIHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAgICAgIAotICAgICAgcGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5hZGQobmV3IFdTRExHcm91cE9iamVjdChkZWZpbml0aW9uLCBXU0RMR3JvdXBPYmplY3QuSU1QT1JUU19HUk9VUCkpOwotICAgICAgcGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5hZGQodHlwZXNHcm91cCk7ICAKLSAgICAgIHBlcm1hbmVudFdTRExHcm91cE9iamVjdExpc3QuYWRkKG5ldyBXU0RMR3JvdXBPYmplY3QoZGVmaW5pdGlvbiwgV1NETEdyb3VwT2JqZWN0Lk1FU1NBR0VTX0dST1VQKSk7Ci0gICAgICBwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0LmFkZChuZXcgV1NETEdyb3VwT2JqZWN0KGRlZmluaXRpb24sIFdTRExHcm91cE9iamVjdC5QT1JUX1RZUEVTX0dST1VQKSk7Ci0gICAgICBwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0LmFkZChuZXcgV1NETEdyb3VwT2JqZWN0KGRlZmluaXRpb24sIFdTRExHcm91cE9iamVjdC5CSU5ESU5HU19HUk9VUCkpOwotICAgICAgcGVybWFuZW50V1NETEdyb3VwT2JqZWN0TGlzdC5hZGQobmV3IFdTRExHcm91cE9iamVjdChkZWZpbml0aW9uLCBXU0RMR3JvdXBPYmplY3QuU0VSVklDRVNfR1JPVVApKTsKLSAgICAgIC8vIHdlIG9ubHkgYWRkIHRoaXMgZ3JvdXAgd2hlbiBpdCBoYXMgY29udGVudAotICAgICAgLy8KLSAgICAgIGV4dGVuc2liaWxpdHlFbGVtZW50c0dyb3VwID0gbmV3IFdTRExHcm91cE9iamVjdChkZWZpbml0aW9uLCBXU0RMR3JvdXBPYmplY3QuRVhURU5TSUJJTElUWV9FTEVNRU5UU19HUk9VUCk7Ci0KLSAgICAgIHVwZGF0ZVR5cGVzKCk7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChwZXJtYW5lbnRXU0RMR3JvdXBPYmplY3RMaXN0KTsgICAKLSAgICAgIC8vaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50c0dyb3VwLmdldENoaWxkcmVuKCkuc2l6ZSgpID4gMCkKLSAgICAgIC8vewotICAgICAgbGlzdC5hZGQoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzR3JvdXApOwotICAgICAgLy99Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpCi0gICAgeyAgICAgCi0gICAgICBpZiAobXNnLmdldEV2ZW50VHlwZSgpICE9IE5vdGlmaWNhdGlvbi5SRVNPTFZFKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB1cGRhdGVUeXBlcygpOwotICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VkSGVscGVyKCk7ICAgCi0gICAgICB9Ci0gICAgfSAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUeXBlcygpCi0gICAgewotICAgICAgaWYgKHR5cGVzICE9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCkpCi0gICAgICB7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlTW9kZWxBZGFwdGVyTGlzdGVuZXIodHlwZXMsIHRoaXMpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgdHlwZXMgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpOwotICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKHR5cGVzLCB0aGlzKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZEhlbHBlcigpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlZChnZXRUYXJnZXQoKSwgbnVsbCk7Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGkubmV4dCgpKTsKLSAgICAgICAgYWRhcHRlci5maXJlUHJvcGVydHlDaGFuZ2VkKGFkYXB0ZXIsIG51bGwpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0gCi0KLSAgICAvLyBwcm9wYWdhdGUgY2hhbmdlcyB0byAndHlwZXMnIG9iamVjdAotICAgIC8vCi0gICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICB0eXBlc0dyb3VwLmZpcmVQcm9wZXJ0eUNoYW5nZWQodHlwZXNHcm91cCwgcHJvcGVydHkpOwotICAgIH0gCi0KLSAgICBwcm90ZWN0ZWQgTW9kZWxBZGFwdGVyRmFjdG9yeSBnZXRNb2RlbEFkYXB0ZXJGYWN0b3J5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZGVmaW5pdGlvbi5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotIAotCi0gIHByb3RlY3RlZCBjbGFzcyBGYXVsdEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgRmF1bHQgZmF1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuZmF1bHQgPSAoRmF1bHQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvZmF1bHRfb2JqLmdpZiIpOwotICAgIH0gICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIGZhdWx0LmdldE5hbWUoKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gIH0gICAKLSAgICAgIAotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBJbXBvcnRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIEltcG9ydCB0aGVJbXBvcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLnRoZUltcG9ydCA9IChJbXBvcnQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2ltcG9ydF9vYmouZ2lmIik7Ci0gICAgfSAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gdGhlSW1wb3J0LmdldExvY2F0aW9uVVJJKCk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAJcmVzdWx0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTk9fSU1QT1JUX1NQRUNJRklFRCIpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAgICAgICAgICAgCi0gIH0gCi0KLQotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgSW5wdXRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIElucHV0IGlucHV0OwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5pbnB1dCA9IChJbnB1dCluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvaW5wdXRfb2JqLmdpZiIpOwotICAgIH0gICAKLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuICJpbnB1dCI7Ci0gICAgfSAgICAgICAgICAgICAgIAotICB9ICAgIAotCi0gICAKLSAKLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIE1lc3NhZ2VBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMubWVzc2FnZSA9IChNZXNzYWdlKW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgbGlzdC5hZGRBbGwobWVzc2FnZS5nZXRFUGFydHMoKSk7Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIGlmIChtZXNzYWdlLmdldFFOYW1lKCkgPT0gbnVsbCkgcmV0dXJuICIiOyAvLyByZXZpc2l0Li4uaXQgc2hvdWxkbid0IGJlIG51bGwgCi0gICAgICByZXR1cm4gbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgIAotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvbWVzc2FnZV9vYmouZ2lmIik7Ci0gICAgfQotICB9Ci0KLQotICAvLwotICAvLwotICAvLwotICBwcm90ZWN0ZWQgY2xhc3MgT3V0cHV0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBPdXRwdXQgb3V0cHV0OwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIAotICAgIHsKLSAgICAgIHN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotICAgICAgdGhpcy5vdXRwdXQgPSAoT3V0cHV0KW5ld1RhcmdldDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuICJvdXRwdXQiOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3V0cHV0X29iai5naWYiKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAgCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIE9wZXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMub3BlcmF0aW9uID0gKE9wZXJhdGlvbiluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIElucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpOwotICAgICAgT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgICAKLSAgICAgIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSA9ICgoT3BlcmF0aW9uSW1wbCkgb3BlcmF0aW9uKS5nZXRTdHlsZSgpOwotICAgICAgaWYgKG9wZXJhdGlvblR5cGUgIT0gbnVsbCkgewotICAgICAgCWlmIChvcGVyYXRpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpICYmIGlucHV0ICE9IG51bGwgJiYgb3V0cHV0ICE9IG51bGwpIHsKLSAgICAgIAkJLy8gSW5wdXQsIE91dHB1dAotICAgICAgCQlsaXN0LmFkZChpbnB1dCk7Ci0gICAgICAJCWxpc3QuYWRkKG91dHB1dCk7Ci0gICAgICAJfQotICAgICAgCWVsc2UgaWYgKG9wZXJhdGlvblR5cGUuZXF1YWxzKE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRSkgJiYgaW5wdXQgIT0gbnVsbCAmJiBvdXRwdXQgIT0gbnVsbCkgewotICAgICAgCQkvLyBPdXRwdXQsIElucHV0Ci0gICAgICAJCWxpc3QuYWRkKG91dHB1dCk7Ci0gICAgICAJCWxpc3QuYWRkKGlucHV0KTsKLSAgICAgIAl9Ci0gICAgICAJZWxzZSBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5PTkVfV0FZKSAmJiBpbnB1dCAhPSBudWxsKSB7Ci0gICAgICAJCS8vIElucHV0Ci0gICAgICAJCWxpc3QuYWRkKGlucHV0KTsKLSAgICAgIAl9Ci0gICAgICAJZWxzZSBpZiAob3BlcmF0aW9uVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04pICYmIG91dHB1dCAhPSBudWxsKSB7Ci0gICAgICAJCS8vT3V0cHV0Ci0gICAgICAJCWxpc3QuYWRkKG91dHB1dCk7Ci0gICAgICAJfQotICAgICAgfQotICAgICAgbGlzdC5hZGRBbGwob3BlcmF0aW9uLmdldEZhdWx0cygpLnZhbHVlcygpKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgICAgCi0JcHJpdmF0ZSBpbnQgZ2V0Tm9kZUluZGV4KE5vZGVMaXN0IG5vZGVMaXN0LCBOb2RlIG5vZGUpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJd2hpbGUgKGluZGV4IDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgJiYgIShub2RlTGlzdC5pdGVtKGluZGV4KS5lcXVhbHMobm9kZSkpKSB7Ci0JCQlpbmRleCsrOwotCQl9Ci0JCQotCQlpZiAoaW5kZXggPj0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpIHsKLQkJCWluZGV4ID0gLTE7Ci0JCX0KLQkJCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBvcGVyYXRpb24uZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3BlcmF0aW9uX29iai5naWYiKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gIH0gIAotICAgCi0KLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHJvdGVjdGVkIGNsYXNzIFBhcnRBZGFwdGVyIGV4dGVuZHMgV1NETEVsZW1lbnRBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFBhcnQgcGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMucGFydCA9IChQYXJ0KW5ld1RhcmdldDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgewotICAgICAgcmV0dXJuIHBhcnQuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvcGFydF9vYmouZ2lmIik7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gICAgIAotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBQb3J0QWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlciBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFBvcnQgcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMucG9ydCA9IChQb3J0KW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWwoKQotICAgIHsgIAotICAgICAgcmV0dXJuIHBvcnQuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJpY29ucy9wb3J0X29iai5naWYiKTsKLSAgICB9ICAgIAotCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXMocG9ydCk7ICAKLSAgICB9Ci0gICAgLy8gcHJvcGFnYXRlIGNoYW5nZXMgdG8gdGhlIGJpbmRpbmcgb2JqZWN0Ci0gICAgLy8KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQocG9ydCwgcHJvcGVydHkpOwotICAgIH0KLSAgfSAKLSAgICAgCi0gIHByb3RlY3RlZCBjbGFzcyBFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBFeHRlbnNpYmlsaXR5RWxlbWVudCBlZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMuZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgIE5vZGUgbm9kZSA9IChOb2RlKSBlZS5nZXRFbGVtZW50KCk7Ci0KLSAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBnZXRFeHRlbnNpYmlsaXR5TGFiZWxQcm92aWRlcihub2RlKTsKLSAgICAgIGlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChub2RlKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBJbWFnZSBpbWFnZSA9IG51bGw7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgZWUuZ2V0RWxlbWVudCgpOwotCi0gICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gZ2V0RXh0ZW5zaWJpbGl0eUxhYmVsUHJvdmlkZXIobm9kZSk7Ci0gICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uobm9kZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbWFnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBpbWFnZSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvZWxlbWVudF9vYmouZ2lmIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaW1hZ2U7Ci0gICAgfSAgICAKLQotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBudWxsOwkgIAotCSAgLy9UT0RPLi4uIHdlIG5lZWQgdG8gcHVzaCBnZXRDaGlsZHJlbiBkb3duIHRoZSBFeHRlbnNpYmxpdHlFbGVtZW50Ci0JICAvLyBmb3Igbm93IGxldCdzIGp1c3QgY2FzdCB0byBVbmtvd25FeHRlbnNpYmxpdHlFbGVtZW50Ci0JICBpZiAoZWUgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCllZSkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBsaXN0OyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQoZWUsIHByb3BlcnR5KTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGdldEV4dGVuc2liaWxpdHlMYWJlbFByb3ZpZGVyKE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICBJTGFiZWxQcm92aWRlciByZXN1bHQgPSBudWxsOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmlsaXR5SXRlbVRyZWVQcm92aWRlclJlZ2lzdHJ5KCkuZ2V0TGFiZWxQcm92aWRlcihuYW1lc3BhY2VVUkkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElUcmVlQ2hpbGRQcm92aWRlciBnZXRFeHRlbnNpYmlsaXR5Q29udGVudFByb3ZpZGVyKE5vZGUgbm9kZSkKLSAgICB7Ci0gICAgICBJVHJlZUNoaWxkUHJvdmlkZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJpbGl0eUl0ZW1UcmVlUHJvdmlkZXJSZWdpc3RyeSgpLmdldENvbnRlbnRQcm92aWRlcihuYW1lc3BhY2VVUkkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzUmVhZE9ubHkoKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfSAKLQotCi0gIC8vCi0gIC8vCi0gIC8vCi0gIHByb3RlY3RlZCBjbGFzcyBQb3J0VHlwZUFkYXB0ZXIgZXh0ZW5kcyBXU0RMRWxlbWVudEFkYXB0ZXIKLSAgeyAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgUG9ydFR5cGUgcG9ydFR5cGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLnBvcnRUeXBlID0gKFBvcnRUeXBlKW5ld1RhcmdldDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbigpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgbGlzdC5hZGRBbGwocG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpKTsKLSAgICAgIAotICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgQ29tcGFyYXRvcigpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvMU5hbWUgPSAoKE9wZXJhdGlvbikgbzEpLmdldE5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgbzJOYW1lID0gKChPcGVyYXRpb24pIG8yKS5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG8xTmFtZSA9PSBudWxsKSBvMU5hbWUgPSAiIjsKLSAgICAgICAgICBpZiAobzJOYW1lID09IG51bGwpIG8yTmFtZSA9ICIiOwotICAgICAgICAgIHJldHVybiAobzFOYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UobzJOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgcmV0dXJuIGxpc3Q7IAotICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3BvcnR0eXBlX29iai5naWYiKTsKLSAgICB9Ci0gIH0gCi0gICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBTZXJ2aWNlQWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7ICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBTZXJ2aWNlIHNlcnZpY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgCi0gICAgewotICAgICAgc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0gICAgICB0aGlzLnNlcnZpY2UgPSAoU2VydmljZSluZXdUYXJnZXQ7Ci0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGxpc3QuYWRkQWxsKHNlcnZpY2UuZ2V0RVBvcnRzKCkpOwotICAgICAgcmV0dXJuIGxpc3Q7IAotICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvc2VydmljZV9vYmouZ2lmIik7Ci0gICAgfSAgIAotICB9IAotICAgICAKLSAgLy8KLSAgLy8KLSAgLy8KLSAgcHVibGljIGNsYXNzIFR5cGVzQWRhcHRlciBleHRlbmRzIFdTRExFbGVtZW50QWRhcHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIFR5cGVzIHR5cGVzOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSAKLSAgICB7Ci0gICAgICBzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLSAgICAgIHRoaXMudHlwZXMgPSAoVHlwZXMpbmV3VGFyZ2V0OwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuKCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7ICAKLSAgICAgIGxpc3QuYWRkQWxsKFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnROb2Rlcyh0eXBlcykpOwotICAgICAgcmV0dXJuIGxpc3Q7IAotICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbCgpCi0gICAgeyAgCi0gICAgICByZXR1cm4gIlR5cGVzIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL3R5cGVzX29iai5naWYiKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKE9iamVjdCBtb2RlbE9iamVjdCwgTW9kZWxBZGFwdGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihtb2RlbE9iamVjdCk7Ci0vLyAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGdldFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZUFkYXB0ZXJzKCksbW9kZWxPYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgICAgYWRhcHRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotICB9ICAgIAotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihPYmplY3QgbW9kZWxPYmplY3QsIE1vZGVsQWRhcHRlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBnZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmdldEFkYXB0ZXIobW9kZWxPYmplY3QpOwotLy8gICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBFY29yZVV0aWwuZ2V0QWRhcHRlcihnZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmVBZGFwdGVycygpLG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLSAgfSAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL25zZWRpdC9FZGl0TmFtZXNwYWNlc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbnNlZGl0L0VkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTM2ZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvbnNlZGl0L0VkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdC5Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgRWRpdE5hbWVzcGFjZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cKLXsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0OwotICBwcm90ZWN0ZWQgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sOwotICBwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLSAgLy8gIHByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLSAgLy8gIHByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlOyAgCi0KLSAgLy9wcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0KLSAgcHVibGljIEVkaXROYW1lc3BhY2VzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgdGl0bGUsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsIExpc3QgbmFtZXNwYWNlTGlzdCkKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICB0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotICAgIHNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0gICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIHRoaXMudGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIHRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VMaXN0OwotICB9Ci0KLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICAgIGNyZWF0ZSgpOwotICAgIGdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgcmV0dXJuIG9wZW4oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgIHVwZGF0ZUVycm9yTWVzc2FnZSgpOwotICAgIHJldHVybiBjb250cm9sOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgIGVkaXRXU0RMTmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyhkaWFsb2dBcmVhLCByZXNvdXJjZUxvY2F0aW9uKTsKLSAgICBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOwotCi0gICAgcmV0dXJuIGRpYWxvZ0FyZWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIHsKLSAgICB1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkKLSAgewotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgIC8qCi0gICAgU3RyaW5nIG5hbWUgPSBuYW1lRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgZXJyb3JNZXNzYWdlID0gY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yTWVzc2FnZSA9ICIiOwotICAgIH0qLwotCi0gICAgLy9lcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOwotICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpCi0gIHsKLSAgICBpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLSAgICB7Ci0gICAgICB0YXJnZXROYW1lc3BhY2UgPSBlZGl0V1NETE5hbWVzcGFjZXNDb250cm9sLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvRXh0ZW5zaWJsZU91dGxpbmVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9FeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxY2E2NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9FeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVPdXRsaW5lUHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSB0cmVlQ29udGVudFByb3ZpZGVyRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyW10gdHJlZUNvbnRlbnRQcm92aWRlcnM7Ci0KLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSBsYWJlbFByb3ZpZGVyRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyW10gbGFiZWxQcm92aWRlcnM7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IHt9OwotCi0gIHB1YmxpYyBFeHRlbnNpYmxlT3V0bGluZVByb3ZpZGVyKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgewotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0KLSAgICB0cmVlQ29udGVudFByb3ZpZGVyRXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uT1VUTElORV9UUkVFX0NPTlRFTlRfUFJPVklERVIpOyAKLSAgICB0cmVlQ29udGVudFByb3ZpZGVycyA9IG5ldyBJVHJlZUNvbnRlbnRQcm92aWRlclt0cmVlQ29udGVudFByb3ZpZGVyRXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyZWVDb250ZW50UHJvdmlkZXJzW2ldID0gKElUcmVlQ29udGVudFByb3ZpZGVyKXRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSLCB3c2RsRWRpdG9yKTsKLSAgICB9Ci0KLSAgICBsYWJlbFByb3ZpZGVyRXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uT1VUTElORV9MQUJFTF9QUk9WSURFUik7IAotICAgIGxhYmVsUHJvdmlkZXJzID0gbmV3IElMYWJlbFByb3ZpZGVyW2xhYmVsUHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbGFiZWxQcm92aWRlcnNbaV0gPSAoSUxhYmVsUHJvdmlkZXIpbGFiZWxQcm92aWRlckV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uT1VUTElORV9MQUJFTF9QUk9WSURFUiwgd3NkbEVkaXRvcik7Ci0gICAgfQotICB9Ci0gICAgICAKLSAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldEFwcGxpY2FibGVUcmVlQ29udGVudFByb3ZpZGVyKE9iamVjdCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWVDb250ZW50UHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0cmVlQ29udGVudFByb3ZpZGVyRXh0ZW5zaW9uc1tpXS5pc0FwcGxpY2FibGUob2JqZWN0KSkKLSAgICAgIHsKLSAgICAgICAgcHJvdmlkZXIgPSB0cmVlQ29udGVudFByb3ZpZGVyc1tpXTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvdmlkZXI7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBnZXRBcHBsaWNhYmxlTGFiZWxQcm92aWRlcihPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zW2ldLmlzQXBwbGljYWJsZShvYmplY3QpKQotICAgICAgewotICAgICAgICBwcm92aWRlciA9IGxhYmVsUHJvdmlkZXJzW2ldOwotICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm92aWRlcjsKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLSAgLy8KLSAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSAKLSAgeyAKLSAgICBJVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGdldEFwcGxpY2FibGVUcmVlQ29udGVudFByb3ZpZGVyKHBhcmVudEVsZW1lbnQpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50cyAiICsgcHJvdmlkZXIpOwotICAgIHJldHVybiBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCkgOiBFTVBUWV9BUlJBWTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlVHJlZUNvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLSAgICByZXR1cm4gcHJvdmlkZXIgIT0gbnVsbCA/IHByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkKLSAgewotICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0QXBwbGljYWJsZVRyZWVDb250ZW50UHJvdmlkZXIoZWxlbWVudCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KSA6IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpICAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlVHJlZUNvbnRlbnRQcm92aWRlcihpbnB1dEVsZW1lbnQpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50cyAiICsgcHJvdmlkZXIpOwotICAgIHJldHVybiBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KSA6IEVNUFRZX0FSUkFZOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpICAKLSAgewotICAgIC8vIFRPRE8uLi4gY2FsbCBkaXNwb3NlIGRpc3Bvc2UgdGhlIGNyZWF0ZWQgbGFiZWwgYW5kIGNvbnRlbnQgcHJvdmlkZXJzCi0gIH0KLQotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyZWVDb250ZW50UHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHRyZWVDb250ZW50UHJvdmlkZXJzW2ldLmlucHV0Q2hhbmdlZCh2aWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7Ci0gICAgfQotICB9ICAgICAgICAgICAgICAgICAKLQotICAvLyBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyICAKLSAgLy8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSAKLSAgeyAKLSAgICBJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IGdldEFwcGxpY2FibGVMYWJlbFByb3ZpZGVyKGVsZW1lbnQpOwotICAgIHJldHVybiBwcm92aWRlciAhPSBudWxsID8gcHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCkgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSAgCi0gIHsgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsgICAgICAgCi0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IGdldEFwcGxpY2FibGVMYWJlbFByb3ZpZGVyKGVsZW1lbnQpOwotICAgICAgcmVzdWx0ID0gcHJvdmlkZXIgIT0gbnVsbCA/IHByb3ZpZGVyLmdldFRleHQoZWxlbWVudCkgOiAoZWxlbWVudC50b1N0cmluZygpICsgIm5vUHJvdmlkZXJGb3JDbGFzcz0iICsgZWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOwotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSAKLSAgeyAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvSFRUUExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvSFRUUExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmZTRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL0hUVFBMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBIVFRQTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREUkVTUyAgICAgICAgID0gImFkZHJlc3MiOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCSU5ESU5HICAgICAgICAgPSAiYmluZGluZyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRVJBVElPTiAgICAgICA9ICJvcGVyYXRpb24iOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBVUkxfRU5DT0RFRCAgICAgPSAidXJsRW5jb2RlZCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTF9SRVBMQUNFTUVOVCA9ICJ1cmxSZXBsYWNlbWVudCI7Ci0KLSAgcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEhUVFBMYWJlbFByb3ZpZGVyKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgbWFwLnB1dChBRERSRVNTLCAiaWNvbnMvaHR0cGFkZHJlc3Nfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoQklORElORywgImljb25zL2h0dHBiaW5kaW5nX29iai5naWYiKTsKLSAgICBtYXAucHV0KE9QRVJBVElPTiwgImljb25zL2h0dHBvcGVyYXRpb25fb2JqLmdpZiIpOyAgICAKLSAgICBtYXAucHV0KFVSTF9FTkNPREVELCAiaWNvbnMvaHR0cHVybGVuY29kZWRfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoVVJMX1JFUExBQ0VNRU5ULCAiaWNvbnMvaHR0cHVybHJlcGxhY2VtZW50X29iai5naWYiKTsKLSAgfQotCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSAKLSAgeyAgICAKLSAgICBOb2RlIG5vZGUgPSAoTm9kZSlvYmplY3Q7Ci0gICAgU3RyaW5nIGltYWdlTmFtZSA9IChTdHJpbmcpbWFwLmdldChub2RlLmdldExvY2FsTmFtZSgpKTsgICAgICAgCi0gICAgcmV0dXJuIGltYWdlTmFtZSAhPSBudWxsID8gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlTmFtZSkgOiBudWxsOyAKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpICAKLSAgewotICAgIE5vZGUgbm9kZSA9IChOb2RlKW9iamVjdDsKLSAgICByZXR1cm4gbm9kZS5nZXROb2RlTmFtZSgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9Nb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvTW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjhhYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9Nb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgTW9kZWxBZGFwdGVyTGlzdGVuZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0gIHByb3RlY3RlZCBNb2RlbEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0gIHB1YmxpYyBNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIoTW9kZWxBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OyAgCi0gIH0KLSAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIGF0dGFjaExpc3RlbmVyKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIob2JqZWN0KTsKLS8vIFRPRE86IHBvcnQgY2hlY2sKLS8vICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gRWNvcmVVdGlsLmdldEFkYXB0ZXIoYWRhcHRlckZhY3RvcnkuZUFkYXB0ZXJzKCksb2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICB9IAotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsgICAgICAgICAgICAgCi0gICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKQotICAgICAgewotICAgICAgICAoKFN0cnVjdHVyZWRWaWV3ZXIpdmlld2VyKS5yZWZyZXNoKG9iamVjdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7ICAgICAKLSAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50T2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGF0dGFjaExpc3RlbmVyKHBhcmVudE9iamVjdCk7Ci0KLSAgICBMaXN0IGxpc3QgPSBudWxsOwotLy8gVE9ETzogcG9ydCBjaGVjayAgICAKLSAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwYXJlbnRPYmplY3QpOwotLy8gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IEVjb3JlVXRpbC5nZXRBZGFwdGVyKGFkYXB0ZXJGYWN0b3J5LmVBZGFwdGVycygpLHBhcmVudE9iamVjdCk7Ci0gICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QgPSAoTGlzdCltb2RlbEFkYXB0ZXIuZ2V0UHJvcGVydHkocGFyZW50T2JqZWN0LCBNb2RlbEFkYXB0ZXIuQ0hJTERSRU5fUFJPUEVSVFkpOyAgICAgCi0gICAgfQotICAgIGxpc3QgPSAgbGlzdCAhPSBudWxsID8gbGlzdCA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpCi0gIHsKLSAgICBPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOwotICAgIHJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDA7ICAgCi0gIH0KLQotICAvKgotICAgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgeyAKLSAgICB2aWV3ZXIgPSBudWxsOwotICB9Ci0gIAotICAvKgotICAgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpCi0gIHsgICAgICAgICAgICAgICAKLSAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgfSAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9Nb2RlbEFkYXB0ZXJMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMGM3NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvb3V0bGluZS9Nb2RlbEFkYXB0ZXJMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmU7Ci0gICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckZhY3Rvcnk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxBZGFwdGVyTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLSAgcHVibGljIE1vZGVsQWRhcHRlckxhYmVsUHJvdmlkZXIoTW9kZWxBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotICB9Ci0KLSAKLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBJbWFnZSByZXN1bHQgPSBudWxsOyAgICAgICAgICAgCi0vLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIob2JqZWN0KTsKLS8vICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBFY29yZVV0aWwuZ2V0QWRhcHRlcihhZGFwdGVyRmFjdG9yeS5lQWRhcHRlcnMoKSxvYmplY3QpOwotICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoSW1hZ2UpbW9kZWxBZGFwdGVyLmdldFByb3BlcnR5KG9iamVjdCwgTW9kZWxBZGFwdGVyLklNQUdFX1BST1BFUlRZKTsgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0gICAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7ICAgICAgICAgICAgICAgCi0vLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgTW9kZWxBZGFwdGVyIG1vZGVsQWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIob2JqZWN0KTsKLS8vICAgIE1vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSBFY29yZVV0aWwuZ2V0QWRhcHRlcihhZGFwdGVyRmFjdG9yeS5lQWRhcHRlcnMoKSxvYmplY3QpOwotICAgIGlmIChtb2RlbEFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IChTdHJpbmcpbW9kZWxBZGFwdGVyLmdldFByb3BlcnR5KG9iamVjdCwgTW9kZWxBZGFwdGVyLkxBQkVMX1BST1BFUlRZKTsgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvU09BUExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvU09BUExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0YTNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL1NPQVBMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgU09BUExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREUkVTUyAgICAgID0gImFkZHJlc3MiOwotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCT0RZICAgICAgICAgPSAiYm9keSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEJJTkRJTkcgICAgICA9ICJiaW5kaW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkFVTFQgICAgICAgID0gImZhdWx0IjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBREVSICAgICAgID0gImhlYWRlciI7IAotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBIRUFERVJfRkFVTFQgPSAiaGVhZGVyZmF1bHQiOyAKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1BFUkFUSU9OICAgID0gIm9wZXJhdGlvbiI7Ci0KLSAgcHJvdGVjdGVkIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFNPQVBMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIG1hcC5wdXQoQUREUkVTUywgImljb25zL3NvYXBhZGRyZXNzX29iai5naWYiKTsKLSAgICBtYXAucHV0KEJJTkRJTkcsICJpY29ucy9zb2FwYmluZGluZ19vYmouZ2lmIik7Ci0gICAgbWFwLnB1dChCT0RZLCAiaWNvbnMvc29hcGJvZHlfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoRkFVTFQsICJpY29ucy9zb2FwZmF1bHRfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoSEVBREVSLCAiaWNvbnMvc29hcGhlYWRlcl9vYmouZ2lmIik7Ci0gICAgbWFwLnB1dChIRUFERVJfRkFVTFQsICJpY29ucy9zb2FwaGVhZGVyZmF1bHRfb2JqLmdpZiIpOwotICAgIG1hcC5wdXQoT1BFUkFUSU9OLCAiaWNvbnMvc29hcG9wZXJhdGlvbl9vYmouZ2lmIik7Ci0gIH0KLQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgCi0gIHsgICAgCi0gICAgTm9kZSBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIFN0cmluZyBpbWFnZU5hbWUgPSAoU3RyaW5nKW1hcC5nZXQobm9kZS5nZXRMb2NhbE5hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gIShub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpOyAgCi0JICByZXR1cm4gaW1hZ2VOYW1lICE9IG51bGwgPyBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKSA6IG51bGw7IAotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgIAotICB7Ci0gICAgTm9kZSBub2RlID0gKE5vZGUpb2JqZWN0OwotICAgIHJldHVybiBub2RlLmdldE5vZGVOYW1lKCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9vdXRsaW5lL1dTRExDb250ZW50T3V0bGluZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvV1NETENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2QyZmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL291dGxpbmUvV1NETENvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLldTRExNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5PcGVuT25TZWxlY3Rpb25IZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIFdTRExDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvciB3c2RsRWRpdG9yOwotCXByb3RlY3RlZCBpbnQgbGV2ZWwgPSAwOyAgCi0gIHByb3RlY3RlZCBPYmplY3QgbW9kZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLSAgcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBXU0RMU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyOwotICBwcm90ZWN0ZWQgU2VsZWN0aW9uTWFuYWdlclNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbk1hbmFnZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLSAgcHJvdGVjdGVkIFRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB0cmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVHJlZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgICAgIAotICBwdWJsaWMgV1NETENvbnRlbnRPdXRsaW5lUGFnZShXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLndzZGxFZGl0b3IgPSB3c2RsRWRpdG9yOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBjb250ZW50UHJvdmlkZXI7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLSAgewotICAgIHRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLy8gZXhwb3NlCi0gIHB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldFRyZWVWaWV3ZXIoKTsKLSAgfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOyAgICAgICAgICAgICAgICAgCi0KLQkJZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlnZXRUcmVlVmlld2VyKCkuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuc2V0SW5wdXQobW9kZWwpOwotICAgIGdldFRyZWVWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgCi0gICAgS2V5QWRhcHRlciBrZXlMaXN0ZW5lciA9IG5ldyBLZXlBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKQotICAgICAgeyAgIAkKLSAgICAgICAgaWYgKGUua2V5Q29kZSA9PSBTV1QuRjMpCi0gICAgICAgIHsKLSAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvbk1hbmFnZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLSAgICAgICAgICAgIHsKLQkJCSAgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGhlbHBlciA9IG5ldyBPcGVuT25TZWxlY3Rpb25IZWxwZXIod3NkbEVkaXRvci5nZXREZWZpbml0aW9uKCkpOwotICAgICAgICAgICAgICBoZWxwZXIub3BlbkVkaXRvcigoRU9iamVjdClvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0gICAgZ2V0VHJlZVZpZXdlcigpLmdldFRyZWUoKS5hZGRLZXlMaXN0ZW5lcihrZXlMaXN0ZW5lcik7Ci0KLSAgICBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI3BvcHVwIik7Ly8kTk9OLU5MUy0xJAotICAgIG1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLSAgICBNZW51IG1lbnUgPSBtZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpKTsKLSAgICBnZXRUcmVlVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0gICAgCi0gICAgV1NETE1lbnVMaXN0ZW5lciBtZW51TGlzdGVuZXIgPSBuZXcgV1NETE1lbnVMaXN0ZW5lcih3c2RsRWRpdG9yLCB3c2RsRWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKSk7Ly8sIChYU0RUZXh0RWRpdG9yKWZUZXh0RWRpdG9yKTsKLSAgICBtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobWVudUxpc3RlbmVyKTsKLQotICAgIHNldFNlbGVjdGlvbk1hbmFnZXIod3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotCX0KLQotCi0gIHB1YmxpYyB2b2lkIHNldE1vZGVsKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBtb2RlbCA9IG9iamVjdDsKLSAgfQotCi0JCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kVG9MZXZlbChpbnQgaSkgCi0gIHsKLQkJbGV2ZWwgPSBpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCB2YWx1ZSkgCi0gIHsKLQkJZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KHZhbHVlKTsKLQkgCWdldFRyZWVWaWV3ZXIoKS5leHBhbmRUb0xldmVsKGxldmVsKTsKLQl9ICAKLQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbk1hbmFnZXIoV1NETFNlbGVjdGlvbk1hbmFnZXIgbmV3U2VsZWN0aW9uTWFuYWdlcikKLSAgeyAKLSAgICBUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7Ci0KLSAgICAvLyBkaXNjb25uZWN0IGZyb20gb2xkIG9uZQotICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBzZWxlY3Rpb25NYW5hZ2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOyAgCi0gICAgICB0cmVlVmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLQotICAgIHNlbGVjdGlvbk1hbmFnZXIgPSBuZXdTZWxlY3Rpb25NYW5hZ2VyOwotCi0gICAgLy8gY29ubmVjdCB0byBuZXcgb25lCi0gICAgaWYgKHNlbGVjdGlvbk1hbmFnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25NYW5hZ2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOyAgCi0gICAgICB0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLSAgfSAgICAKLQotICBjbGFzcyBTZWxlY3Rpb25NYW5hZ2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICAgIHsgICAgICAgICAKLSAgICAgIGlmIChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpICE9IGdldFRyZWVWaWV3ZXIoKSkKLSAgICAgIHsKLSAgICAgICAgZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotCi0gIGNsYXNzIFRyZWVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSAgCi0gICAgeyAKLSAgICAgIGlmIChzZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICAgICAgewotICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgICAgIE9iamVjdCBvID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgCi0gICAgICAgICAgLy8gVE9ETyAuLi4gCi0gICAgICAgICAgLy8gd2UgbmVlZCB0byBpbXBsZW1lbnQgYSBzZWxlY3Rpb25NYW5hZ2VyTWFwcGluZyBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAvLyBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuIHNwZWNpZnkgaG93IHRoZXknZCBsaWtlIHRvIG1hcCB2aWV3IG9iamVjdHMgCi0gICAgICAgICAgLy8gdG8gc2VsZWN0aW9uIG9iamVjdHMKLSAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgICAgICAgIHsgIAotLy8gICAgICAgICAgICB0cnkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudCh3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSwgKEVsZW1lbnQpbyk7Ci0vLyAgICAgICAgICAgICAgaWYgKG1vZGVsT2JqZWN0ICE9IG51bGwgJiYgIShtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkpCi0vLyAgICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgICAgbyA9IG1vZGVsT2JqZWN0OwotLy8gICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWxlY3Rpb25NYW5hZ2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvKSwgZ2V0VHJlZVZpZXdlcigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNlbGVjdGlvbk1hbmFnZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCksIGdldFRyZWVWaWV3ZXIoKSk7Ci0gICAgICAgICAgfSAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4OGVlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQWJzdHJhY3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5XU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uIGltcGxlbWVudHMgSVNlY3Rpb24sIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIKLXsKLQlwcml2YXRlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBXU0RMRWxlbWVudCBlbGVtZW50OwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotICBwcm90ZWN0ZWQgaW50IHJpZ2h0TWFyZ2luU3BhY2U7Ci0gIHByb3RlY3RlZCBpbnQgdGFibGVNaW5pbXVtV2lkdGggPSA1MDsKLQkKLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0gIHsKLSAgICBjcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmdldFdpZGdldEZhY3RvcnkoKSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgYUZhY3RvcnkpCi0gIHsKLQkJdGhpcy5mYWN0b3J5ID0gYUZhY3Rvcnk7Ci0gICAgR0MgZ2MgPSBuZXcgR0MocGFyZW50KTsKLSAgICBQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KCIgIC4uLiAgIik7IC8vJE5PTi1OTFMtMSQKLSAgICByaWdodE1hcmdpblNwYWNlID0gZXh0ZW50Lng7Ci0gICAgZ2MuZGlzcG9zZSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCi0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotCQl7Ci0JCSAgdGhpcy5lbGVtZW50ID0gKFdTRExFbGVtZW50KWlucHV0OwotICAgICAgTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSBXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5LmdldFdTRExHcmFwaE1vZGVsQWRhcHRlckZhY3RvcnkoKS5nZXRBZGFwdGVyKGlucHV0KTsKLSAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlzUmVhZE9ubHkgPSBCb29sZWFuLlRSVUUuZXF1YWxzKGFkYXB0ZXIuZ2V0UHJvcGVydHkoaW5wdXQsICJpc1JlYWRPbmx5IikpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0JCX0KLQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0JCXsKLQkJICB0aGlzLmVsZW1lbnQgPSAoKFdTRExHcm91cE9iamVjdClpbnB1dCkuZ2V0RGVmaW5pdGlvbigpOwotCQl9Ci0JCXJlZnJlc2goKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jYWJvdXRUb0JlU2hvd24oKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWJvdXRUb0JlU2hvd24oKQotICB7Ci0JCXJlZnJlc2goKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jYWJvdXRUb0JlSGlkZGVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFib3V0VG9CZUhpZGRlbigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZGlzcG9zZSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbiNnZXRNaW5pbXVtSGVpZ2h0KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TWluaW11bUhlaWdodCgpCi0gIHsKLSAgICByZXR1cm4gU1dULkRFRkFVTFQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jcmVmcmVzaCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIGlmIChpc1JlYWRPbmx5KQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5zZXRFbmFibGVkKHRydWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gIAotCS8qKgotCSAqIEdldCB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICogQHJldHVybiB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICovCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpCi0JewotICAgIHJlZnJlc2goKTsKLQl9Ci0KLQkKLSAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLSAgCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICBnZXRFbGVtZW50KCkgIT0gbnVsbCAmJgotICAgICAgICAhaXNJbkRvSGFuZGxlKSAKLSAgICB7Ci0gICAgICBpc0luRG9IYW5kbGUgPSB0cnVlOwotICAgICAgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0gICAgICBpc0luRG9IYW5kbGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmCi0gICAgICAgIGdldEVsZW1lbnQoKSAhPSBudWxsICYmCi0gICAgICAgICFpc0luRG9IYW5kbGUpIAotICAgIHsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0gICAgICBkb1dpZGdldFNlbGVjdGVkKGUpOwotICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBib29sZWFuIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICogQHJldHVybiB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyRW5hYmxlZCgpIAotICB7Ci0gICAgcmV0dXJuIGxpc3RlbmVyRW5hYmxlZDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGxpc3RlbmVyRW5hYmxlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuICB2KSAKLSAgewotICAgIHRoaXMubGlzdGVuZXJFbmFibGVkID0gdjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgIWlzSW5Eb0hhbmRsZSkgCi0gICAgewotICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgIHN0YXJ0RGVsYXllZEV2ZW50KGV2ZW50KTsKLSAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgIH0gLy8gZW5kIG9mIGlmICgpCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIERlbGF5ZWRFdmVudCBkZWxheWVkVGFzazsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHN0YXJ0RGVsYXllZEV2ZW50KEV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZGVsYXllZFRhc2sgPT0gbnVsbCB8fAotICAgICAgZGVsYXllZFRhc2suZ2V0RXZlbnQoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLGRlbGF5ZWRUYXNrKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEV2ZW50IGRlbGF5ZWRFdmVudCA9IGRlbGF5ZWRUYXNrLmdldEV2ZW50KCk7Ci0gICAgICAKLSAgICAgIGlmIChlLndpZGdldCA9PSBkZWxheWVkRXZlbnQud2lkZ2V0ICYmCi0gICAgICAgIGUudHlwZSA9PSBkZWxheWVkRXZlbnQudHlwZSkKLSAgICAgIHsKLSAgICAgICAgLy8gc2FtZSBldmVudCwganVzdCBkaWZmZXJlbnQgZGF0YSwgZGVsYXkgbmV3IGV2ZW50Ci0gICAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KG51bGwpOwotICAgICAgfQotICAgICAgZGVsYXllZFRhc2sgPSBuZXcgRGVsYXllZEV2ZW50KCk7Ci0gICAgICBkZWxheWVkVGFzay5zZXRFdmVudChlKTsKLSAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLnRpbWVyRXhlYyg1MDAsZGVsYXllZFRhc2spOwotICAgIH0KLSAgfQotICAKLSAgY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUKLSAgewotICAgIHByb3RlY3RlZCBFdmVudCBldmVudDsKLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgUnVubmFibGUjcnVuKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgIHsKLSAgICAgIGlmIChldmVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpc0luRG9IYW5kbGUgPSB0cnVlOwotICAgICAgICBkb0hhbmRsZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgICAgIGV2ZW50ID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZXZlbnQuCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgRXZlbnQgZ2V0RXZlbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBldmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBldmVudC4KLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50KEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKLSAgICB9Ci0KLSAgfQotCi0gIGJvb2xlYW4gaXNJbkRvSGFuZGxlOwotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBvZiBpc0luRG9IYW5kbGUuCi0gICAqIEByZXR1cm4gdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJbkRvSGFuZGxlKCkgCi0gIHsKLSAgICByZXR1cm4gaXNJbkRvSGFuZGxlOwotICB9Ci0KLSAgCi0gIHN0YXRpYyBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkKLSAgewotICAgIElXb3JrYmVuY2ggd29ya2JlbmNoID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpOwotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCi0gICAgcmV0dXJuIGVkaXRvclBhcnQ7Ci0gIH0KLQotICBzdGF0aWMgcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7IAotICAgIElTdGF0dXNMaW5lTWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLSAgICAgIHJlc3VsdCA9IGNvbnRyaWJ1dG9yLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgRG9jdW1lbnRJbXBsIGdldERvY3VtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHJldHVybiAoRG9jdW1lbnRJbXBsKSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgZ2V0RG9jdW1lbnQoZWxlbWVudCkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBkZXNjcmlwdGlvbik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBEb2N1bWVudEltcGwgZG9jID0gKERvY3VtZW50SW1wbCkgZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0gICAgCi0gICAgZG9jLmdldE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOyAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMjQ3MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEZpbHRlcigpCi0gICAqLwotICBwdWJsaWMgSVR5cGVNYXBwZXIgZ2V0RmlsdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChXU0RMRWxlbWVudC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCB8fCBvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRBZnRlclNlY3Rpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBZnRlclNlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudGF0aW9uU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2ZlMWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Eb2N1bWVudGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuQWRkRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50YXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQotCVRleHQgZG9jVGV4dDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JICBzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJCi0JCWRvY1RleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTVVMVEkgfCBTV1QuTk9ORSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7IC8vJE5PTi1OTFMtMSQKLSAgICBkb2NUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOyAgCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkb2NUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotICAgIHN1cGVyLnJlZnJlc2goKTsKLSAgICBpZiAoZG9jVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkgIGRvY1RleHQuc2V0VGV4dCgiIik7Ci0JICBpZiAoZ2V0RWxlbWVudCgpICE9IG51bGwpCi0JICB7Ci0JICAgIEVsZW1lbnQgZG9jTm9kZSA9IGdldEVsZW1lbnQoKS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCSAgICBpZiAoZG9jTm9kZSAhPSBudWxsKQotCSAgICB7Ci0gICAgICAgIE5vZGUgdGV4dE5vZGUgPSBkb2NOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgaWYgKHRleHROb2RlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgZG9jVmFsdWUgPSB0ZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICBpZiAoZG9jVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkb2NUZXh0LnNldFRleHQoZG9jVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCSAgICB9Ci0JICB9Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0JewotCSAgaWYgKGV2ZW50LndpZGdldCA9PSBkb2NUZXh0KQotCSAgewotCSAgICBTdHJpbmcgdmFsdWUgPSBkb2NUZXh0LmdldFRleHQoKTsKLQkgICAgaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgRWxlbWVudCBkb2NOb2RlID0gZ2V0RWxlbWVudCgpLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JICAgICAgaWYgKGRvY05vZGUgIT0gbnVsbCkKLQkgICAgICB7Ci0gICAgICAgICAgTm9kZSB0ZXh0Tm9kZSA9IGRvY05vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgIGlmICh0ZXh0Tm9kZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRleHROb2RlLnNldE5vZGVWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY05vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgICAgICBvcmcudzNjLmRvbS5UZXh0IG5ld1RleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpOwotICAgICAgICAgICAgICBkb2NOb2RlLmFwcGVuZENoaWxkKG5ld1RleHROb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0JICAgICAgfQotCSAgICAgIGVsc2UKLQkgICAgICB7Ci0JICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudCgpOwotICAgICAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWN0aW9uID0gbmV3IEFkZEVsZW1lbnRBY3Rpb24oZWxlbWVudCwgZWxlbWVudC5nZXRQcmVmaXgoKSwgImRvY3VtZW50YXRpb24iLCBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBhY3Rpb24ucnVuKCk7Ci0gICAgICAgICAgRWxlbWVudCBuZXdEb2N1bWVudGF0aW9uID0gYWN0aW9uLmdldE5ld0VsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5ld0RvY3VtZW50YXRpb24uZ2V0T3duZXJEb2N1bWVudCgpOwotICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQgbmV3VGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0gICAgICAgICAgbmV3RG9jdW1lbnRhdGlvbi5hcHBlbmRDaGlsZChuZXdUZXh0Tm9kZSk7Ci0gICAgICAgICAgZ2V0RWxlbWVudCgpLnNldERvY3VtZW50YXRpb25FbGVtZW50KG5ld0RvY3VtZW50YXRpb24pOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRhdGlvblNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRhdGlvblNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwN2EzODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50YXRpb25TZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBEb2N1bWVudGF0aW9uU2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudGF0aW9uU2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWN0aW9uLmRvY3VtZW50YXRpb24iOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiBuZXcgRG9jdW1lbnRhdGlvblNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmRvY3VtZW50YXRpb24iOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0V4dGVuc2liaWxpdHlFbGVtZW50U2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FeHRlbnNpYmlsaXR5RWxlbWVudFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmVlYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0V4dGVuc2liaWxpdHlFbGVtZW50U2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotcHVibGljIGNsYXNzIEV4dGVuc2liaWxpdHlFbGVtZW50U2VjdGlvbkRlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25EZXNjcmlwdG9yIGltcGxlbWVudHMgSVNlY3Rpb25EZXNjcmlwdG9yCi17Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudFNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICB7Ci0gICAgcmV0dXJuICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5zZWN0aW9uLmV4dGVuc2liaWxpdHllbGVtZW50IjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICByZXR1cm4gbmV3IEV4dGVuc2libGl0eUVsZW1lbnRTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEFmdGVyU2VjdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0V4dGVuc2libGl0eUVsZW1lbnRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRXh0ZW5zaWJsaXR5RWxlbWVudFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2NDZlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRXh0ZW5zaWJsaXR5RWxlbWVudFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLkV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5BdHRyaWJ1dGVzVGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxpdHlFbGVtZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiBpbXBsZW1lbnRzIE1vZGVsQWRhcHRlckxpc3RlbmVyCi17Ci0gIEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyIHZpZXdlcjsKLSAgcHJvdGVjdGVkIEF0dHJpYnV0ZXNUYWJsZSBhdHRyaWJ1dGVzVGFibGU7Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQotCQljb21wb3NpdGUgPQlnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkKLS8vCQl2aWV3ZXIgPSBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIoY29tcG9zaXRlLCBnZXRBY3RpdmVFZGl0b3IoKSwgdHJ1ZSk7Ci0JCWF0dHJpYnV0ZXNUYWJsZSA9IG5ldyBBdHRyaWJ1dGVzVGFibGUoZ2V0QWN0aXZlRWRpdG9yKCksIGNvbXBvc2l0ZSk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlhdHRyaWJ1dGVzVGFibGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0vLwkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQkKLSAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpKQotICAgIHsKLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0gICAgICByZWZyZXNoKCk7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9ICAKLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgYXR0cmlidXRlc1RhYmxlLnNldElucHV0KGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCkpOwotCi0gICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgIHsgCi0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgeyAgICAgICAgICAgCi0gICAgICAgIGlmICghYXR0cmlidXRlc1RhYmxlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyaWJ1dGVzVGFibGUucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsgICAgICAgICAgICAgICAKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0lQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0lQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWYxZTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyIAotewotICAvL3B1YmxpYyB2b2lkIGluaXQoSUVkaXRvclBhcnQgZWRpdG9yKTsgIAotICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoSUVkaXRvclBhcnQgZWRpdG9yLCBFbGVtZW50IG93bmVyRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWVzcGFjZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ltcG9ydFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JbXBvcnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDc3YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ltcG9ydFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5YTUxRdWlja1NjYW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEltcG9ydFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZXNwYWNlVGV4dCwgcHJlZml4VGV4dCwgbG9jYXRpb25UZXh0OwotICBwcml2YXRlIFN0cmluZyBvbGRQcmVmaXhWYWx1ZTsKLSAgQnV0dG9uIGJ1dHRvbjsKLSAgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhOwotCi0JCW5hbWVzcGFjZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQluYW1lc3BhY2VUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLS8vCQluYW1lc3BhY2VUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLXJpZ2h0TWFyZ2luU3BhY2UgLSBJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDTGFiZWwgbmFtZXNwYWNlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRVNQQUNFIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVzcGFjZVRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZXNwYWNlVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCW5hbWVzcGFjZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcHJlZml4VGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJcHJlZml4VGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXByZWZpeFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lc3BhY2VUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXByZWZpeFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDTGFiZWwgcHJlZml4TGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYIikpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHJlZml4VGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCXByZWZpeExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbG9jYXRpb25UZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJbG9jYXRpb25UZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLS8vCQlsb2NhdGlvblRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJQ0xhYmVsIGxvY2F0aW9uTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobG9jYXRpb25UZXh0LCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxvY2F0aW9uVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0gICAgYnV0dG9uLnNldEltYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvYnJvd3NlYnV0dG9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChsb2NhdGlvblRleHQsIDAsIFNXVC5DRU5URVIpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChidXR0b24sIDApOwotICAgIGRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHByZWZpeFRleHQsICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLSAgICBsb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOyAgCi0JICBPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotICAgIGJvb2xlYW4gcmVmcmVzaFByZWZpeFRleHQgPSB0cnVlOwotICAgIGJvb2xlYW4gcmVmcmVzaExvY2F0aW9uVGV4dCA9IHRydWU7Ci0gICAgYm9vbGVhbiByZWZyZXNoTmFtZXNwYWNlVGV4dCA9IHRydWU7Ci0gICAgaWYgKHByZWZpeFRleHQuaXNGb2N1c0NvbnRyb2woKSkKLSAgICB7Ci0gICAgICByZWZyZXNoUHJlZml4VGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobG9jYXRpb25UZXh0LmlzRm9jdXNDb250cm9sKCkpCi0gICAgewotICAgICAgcmVmcmVzaExvY2F0aW9uVGV4dCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobmFtZXNwYWNlVGV4dC5pc0ZvY3VzQ29udHJvbCgpKQotICAgIHsKLSAgICAgIHJlZnJlc2hOYW1lc3BhY2VUZXh0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChyZWZyZXNoUHJlZml4VGV4dCkKLSAgICB7Ci0gICAgICBwcmVmaXhUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIGlmIChyZWZyZXNoTG9jYXRpb25UZXh0KQotICAgIHsKLSAgICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBpZiAocmVmcmVzaE5hbWVzcGFjZVRleHQpCi0gICAgewotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQkgIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnQpCi0JICB7Ci0JICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoSW1wb3J0KW9iaikuZ2V0RWxlbWVudCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHJlZnJlc2hMb2NhdGlvblRleHQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvblZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgCSAgICBsb2NhdGlvblRleHQuc2V0VGV4dChsb2NhdGlvblZhbHVlICE9IG51bGwgPyBsb2NhdGlvblZhbHVlIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBuYW1lc3BhY2VWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHJlZnJlc2hOYW1lc3BhY2VUZXh0KQotICAgICAgewotICAgICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQobmFtZXNwYWNlVmFsdWUgIT0gbnVsbCA/IG5hbWVzcGFjZVZhbHVlIDogIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChyZWZyZXNoUHJlZml4VGV4dCkKLSAgICAgIHsKLSAgCSAgICBTdHJpbmcgcHJlZml4ID0gKChJbXBvcnQpb2JqKS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0UHJlZml4KG5hbWVzcGFjZVZhbHVlKTsKLSAgCSAgICBwcmVmaXhUZXh0LnNldFRleHQocHJlZml4ICE9IG51bGwgPyBwcmVmaXggOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLQkgIH0KLQlvbGRQcmVmaXhWYWx1ZSA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JICAgIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCAmJiBsb2NhdGlvblRleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCAmJiBuYW1lc3BhY2VUZXh0LmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsgICAgCQotCSAgICAJT2JqZWN0IGlucHV0ID0gZ2V0RWxlbWVudCgpOwotCSAgICAgICAgSW1wb3J0IGltcG9ydE9iaiA9IChJbXBvcnQpaW5wdXQ7Ci0JICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGltcG9ydEVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW1wb3J0T2JqKTsKLQkgICAgICAgIE1hcCBuYW1lc3BhY2VzTWFwID0gaW1wb3J0T2JqLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXROYW1lc3BhY2VzKCk7Ci0KLQkgICAgICAgIGlmIChuYW1lc3BhY2VzTWFwLmNvbnRhaW5zS2V5KHByZWZpeFRleHQuZ2V0VGV4dCgpKSkgewotCSAgICAgICAgCS8vIFdlIHNob3VsZCBhZGQgZXJyb3IgbWVzc2FnZXMuLi4uLi4uLi4KLQkgLy8gICAgICAgICAgIHNldEVycm9yTWVzc2FnZShYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfRVJST1JfTEFCRUxfUFJFRklYX0VYSVNUUyIpKTsKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UgewotCSAgICAgICAgICAgIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBpbXBvcnRPYmouZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldEVsZW1lbnQoKTsKLQkgICAgICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInhtbG5zOiIrb2xkUHJlZml4VmFsdWUpOwotCSAgICAgICAgICAgIGRlZmluaXRpb25FbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeFRleHQuZ2V0VGV4dCgpLCBuYW1lc3BhY2VUZXh0LmdldFRleHQoKSk7Ci0KLS8vCSAgICAgICAgICAgIGNsZWFyRXJyb3JNZXNzYWdlKCk7Ci0JICAgICAgICAgICAgb2xkUHJlZml4VmFsdWUgPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCX0KLQkKLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBidXR0b24pCi0gICAgewotICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgaW5wdXQgPSBnZXRFbGVtZW50KCk7Ci0gICAgICAgIAotICAgICAgICAgICByZXNvdXJjZVNldCA9ICgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpaW5wdXQpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0KLSAgICAgICAgICAgV1NETEVkaXRvciBlZGl0b3IgPSAoV1NETEVkaXRvcillZGl0b3JQYXJ0OwotICAgICAgICAgICBJRmlsZSBjdXJyZW50V1NETEZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVEaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCBudWxsLCB0cnVlKTsKLSAgICAgICAgICAgU3RyaW5nIFtdIGZpbHRlcnMgPSB7ICJ4c2QiLCAid3NkbCIgfTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBJRmlsZSBbXSBleGNsdWRlZEZpbGVzID0geyBjdXJyZW50V1NETEZpbGUgfTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIGRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlcnMsIGV4Y2x1ZGVkRmlsZXMpOwotICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU0VMRUNUIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9TRUxFQ1RfRklMRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVNDUklQVElPTl9TRUxFQ1RfV1NETF9PUl9YU0QiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgaW50IHJjID0gZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgaWYgKHJjID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBJRmlsZSBzZWxlY3RlZEZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgLy9pZiAoc2VsZWN0ZWRGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLmVxdWFscyhjdXJyZW50V1NETEZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpKQotICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgIC8vICBTeXN0ZW0ub3V0LnByaW50bG4oIlNBTUUgRklMRToiICsgY3VycmVudFdTRExGaWxlLmdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgIC8vfQotCi0gICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5jb21wdXRlUmVsYXRpdmVVUkkoc2VsZWN0ZWRGaWxlLCBjdXJyZW50V1NETEZpbGUsIHRydWUpOwotCi0gICAgICAgICAgICAgSW1wb3J0IGltcG9ydE9iaiA9IChJbXBvcnQpaW5wdXQ7Ci0gICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGltcG9ydE9iaik7Ci0gICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaW1wb3J0T2JqLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGRlZmluaXRpb24pOwotICAgICAgICAgICAgIAotICAgICAgICAgICAgIFN0cmluZyBpbXBvcnRUYXJnZXROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlUHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgCi0gICAgIAkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHNlbGVjdGVkRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOyAgICAgIAotCi0gICAgIAkJLy8gbm90ZSB0aGF0IHRoZSBnZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEgd29ya3MgZm9yIGJvdGggc2NoZW1hIGFuZCB3c2RsIGZpbGVzCi0gICAgIAkJLy8gSSBzaG91bGQgY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgY29udmVuaWVuY2UgbWV0aG9kCi0gICAgICAgICAgICAgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlID0gIFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEodXJpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgaWYgKHByZWZpeC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVuaXF1ZVByZWZpeCA9IGdldFVuaXF1ZVByZWZpeChkZWZpbml0aW9uLCB1cmkuZmlsZUV4dGVuc2lvbigpKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHVuaXF1ZVByZWZpeCA9IHByZWZpeDsgCi0gICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgaWYgKGltcG9ydFRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgKGltcG9ydFRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIGltcG9ydFRhcmdldE5hbWVzcGFjZS50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuOyAgLy8gd2hhdCB0byBkbyB3aXRoIG5vIG5hbWVzcGFjZSBkb2NzPwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lc3BhY2UiLCBpbXBvcnRUYXJnZXROYW1lc3BhY2UpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICBkZWZpbml0aW9uRWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyB1bmlxdWVQcmVmaXgsIGltcG9ydFRhcmdldE5hbWVzcGFjZSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChpbXBvcnRUYXJnZXROYW1lc3BhY2UpOwotICAgICAgICAgICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uKTsKLSAgICAgICAgICAgICBwcmVmaXhUZXh0LnNldFRleHQodW5pcXVlUHJlZml4KTsKLSAgICAgICAgICAgfQotCi0gICAgICAgIHJlZnJlc2goKTsKLSAgICB9Ci0gIH0KLQkKLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZVByZWZpeChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBpbml0UHJlZml4KQotICB7Ci0gICAgU3RyaW5nIHVuaXF1ZVByZWZpeDsKLSAgICBNYXAgbWFwID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0KLSAgICBpZiAoZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UoaW5pdFByZWZpeCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB1bmlxdWVQcmVmaXggPSBpbml0UHJlZml4OwotICAgIH0KLSAgICBlbHNlIC8vIGlmIHVzZWQsIHRoZW4gdHJ5IHRvIGNyZWF0ZSBhIHVuaXF1ZSBvbmUKLSAgICB7Ci0gICAgICBTdHJpbmcgdGVtcFByZWZpeCA9IGluaXRQcmVmaXg7Ci0gICAgICBpbnQgaSA9IDE7Ci0gICAgICB3aGlsZShtYXAuY29udGFpbnNLZXkodGVtcFByZWZpeCArIGkpKQotICAgICAgewotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgICB1bmlxdWVQcmVmaXggPSB0ZW1wUHJlZml4ICsgaTsKLSAgICB9Ci0gICAgcmV0dXJuIHVuaXF1ZVByZWZpeDsgICAgCi0gIH0gCi0gIAotICBwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9JbXBvcnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ltcG9ydFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNmE3MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0ltcG9ydFNlY3Rpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLQotcHVibGljIGNsYXNzIEltcG9ydFNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICBJbXBvcnRTZWN0aW9uIGltcG9ydFNlY3Rpb247Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBJbXBvcnRTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIGltcG9ydFNlY3Rpb24gPSBuZXcgSW1wb3J0U2VjdGlvbigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24uaW1wb3J0IjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoSW1wb3J0LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBpbXBvcnRTZWN0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgaW1wb3J0U2VjdGlvbi5zZXRFZGl0b3JQYXJ0KHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbXBvcnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5uYW1lIjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjUyM2YyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5TbWFydFJlbmFtZUFjdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgTmFtZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLQotCVRleHQgbmFtZVRleHQ7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkKLQl7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCWNvbXBvc2l0ZSA9CWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCQlGb3JtRGF0YSBkYXRhOwotCQkKLQotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlDTGFiZWwgbmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUUiKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKQotCXsKLSAgICBzdXBlci5yZWZyZXNoKCk7Ci0gICAgaWYgKG5hbWVUZXh0LmlzRm9jdXNDb250cm9sKCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCSAgbmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkgIGlmIChnZXRFbGVtZW50KCkgIT0gbnVsbCkKLQkgIHsKLQkgICAgaWYgKGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCkhPSBudWxsKQotCSAgICB7Ci0JICAgICAgU3RyaW5nIG5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgaWYgKG5hbWU9PW51bGwpIG5hbWU9IiI7Ci0JICAgICAgbmFtZVRleHQuc2V0VGV4dChuYW1lKTsKLQkgICAgfQotCSAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0JCi0gIHB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQgJiYgIW5hbWVUZXh0LmlzRGlzcG9zZWQoKSkgewotICAgICAgICBTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIE9iamVjdCB3c2RsRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBEZWZpbml0aW9uKSB7Ci0gICAgICAgIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gZGVmaW5pdGlvbi5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAJZGVmaW5pdGlvbi5zZXRRTmFtZShuZXcgUU5hbWUodXJpLCBuZXdWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgU2VydmljZSkgeyAgICAgICAgCi0gICAgICAgIAlTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gc2VydmljZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOyAKLSAgICAgICAgCXNlcnZpY2Uuc2V0UU5hbWUobmV3IFFOYW1lKHVyaSwgbmV3VmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIFBvcnQpIHsKLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotLy8gICAgICAgIAkoKFBvcnQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIEJpbmRpbmcpIHsKLSAgICAgICAgCUJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSB3c2RsRWxlbWVudDsKLSAgICAgICAgCVN0cmluZyB1cmkgPSBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIAliaW5kaW5nLnNldFFOYW1lKG5ldyBRTmFtZSh1cmksIG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKSB7Ci0gICAgICAgIAkJKChCaW5kaW5nT3BlcmF0aW9uKSB3c2RsRWxlbWVudCkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpIHsKLSAgICAgICAgCWlmKCgoQmluZGluZ0lucHV0KSB3c2RsRWxlbWVudCkuZ2V0TmFtZSgpID09IG51bGwgJiYgbmV3VmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCXJldHVybjsKLSAgICAgICAgCQotICAgICAgICAJKChCaW5kaW5nSW5wdXQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpIHsKLSAgICAgICAgCWlmICgoKEJpbmRpbmdPdXRwdXQpIHdzZGxFbGVtZW50KS5nZXROYW1lKCkgPT0gbnVsbCAmJiBuZXdWYWx1ZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIAkJcmV0dXJuOwotICAgICAgICAJCi0gICAgICAgIAkoKEJpbmRpbmdPdXRwdXQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgewotICAgICAgICAJKChCaW5kaW5nRmF1bHQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gICAgICAgIAlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgCXBvcnRUeXBlLnNldFFOYW1lKG5ldyBRTmFtZSh1cmksIG5ld1ZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAod3NkbEVsZW1lbnQgaW5zdGFuY2VvZiBPcGVyYXRpb24pIHsKLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotLy8gICAgICAgIAkoKE9wZXJhdGlvbikgd3NkbEVsZW1lbnQpLnNldE5hbWUobmV3VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZVJlZmVyZW5jZSkgewotICAgICAgICAJaWYgKCgoTWVzc2FnZVJlZmVyZW5jZSkgd3NkbEVsZW1lbnQpLmdldE5hbWUoKSA9PSBudWxsICYmIG5ld1ZhbHVlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCQlyZXR1cm47Ci0gICAgICAgIAkKLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotLy8gICAgICAgIAkoKE1lc3NhZ2VSZWZlcmVuY2UpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh3c2RsRWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKLS8qCi0gICAgICAgIAlNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgd3NkbEVsZW1lbnQ7Ci0gICAgICAgIAlTdHJpbmcgdXJpID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAJbWVzc2FnZS5zZXRRTmFtZShuZXcgUU5hbWUodXJpLCBuZXdWYWx1ZSkpOwotICAgICAgICAJKi8KLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHdzZGxFbGVtZW50IGluc3RhbmNlb2YgUGFydCkgewotLy8gICAgICAgIAkoKFBhcnQpIHdzZGxFbGVtZW50KS5zZXROYW1lKG5ld1ZhbHVlKTsKLSAgICAgICAgCW5ldyBTbWFydFJlbmFtZUFjdGlvbih3c2RsRWxlbWVudCwgbmV3VmFsdWUpLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZVNlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOTA4NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIE5hbWVTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ubmFtZSI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJbnB1dFR5cGVzKCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldElucHV0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFdTRExFbGVtZW50LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiBuZXcgTmFtZVNlY3Rpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFRhcmdldFRhYigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldFRhYigpCi0gIHsKLSAgICByZXR1cm4gImNvbS5pYm0ueG1sd2Vic2VydmljZXMuZ2VuZXJhbCI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNhcHBsaWVzVG8ob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGFwcGxpZXNUbyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIE9iamVjdCBvYmplY3QgPSBudWxsOwotICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgIG9iamVjdCA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQgJiYgCi0gICAgICAgICAgIShvYmplY3QgaW5zdGFuY2VvZiBFeHRlbnNpYmlsaXR5RWxlbWVudCkgJiYKLSAgICAgICAgICAhKG9iamVjdCBpbnN0YW5jZW9mIEltcG9ydCkpCi0gICAgICB7Ci0gICAgICAJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB7Ci0gICAgICAJCURlZmluaXRpb24gZGVmaW5pdGlvbiA9ICgoV1NETEVsZW1lbnQpIG9iamVjdCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgCQlpZiAoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkgIT0gbnVsbCAmJiAhKG9iamVjdCBpbnN0YW5jZW9mIERlZmluaXRpb24pKSB7Ci0gICAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgICAgIAkJfQotICAgICAgCQkKLSAgICAgIAkJcmV0dXJuIGZhbHNlOwotICAgICAgCX0KLSAgICAgIAkvKgotICAgICAgCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkgewotICAgICAgCQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExHcm91cE9iamVjdCkgb2JqZWN0KS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAJCWlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgICAgIAkJfQotICAgICAgCQkKLSAgICAgIAkJcmV0dXJuIGZhbHNlOwotICAgICAgCX0KLSAgICAgIAkqLwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVzcGFjZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODU2NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVzcGFjZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkVkaXROYW1lc3BhY2VzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdC5Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbk5hbWVzcGFjZUluZm9UYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0gIHByb3RlY3RlZCBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nIGVkaXRXU0RMTmFtZXNwYWNlc0NvbnRyb2w7Ci0gIHByb3RlY3RlZCBCdXR0b24gYnV0dG9uOwotICAKLSAgVGV4dCBuYW1lVGV4dDsKLSAgVGV4dCBwcmVmaXhUZXh0OwotICBUZXh0IHRhcmdldE5hbWVzcGFjZVRleHQ7Ci0gIHByb3RlY3RlZCBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUgdGFibGVWaWV3ZXI7Ci0gIHByaXZhdGUgYm9vbGVhbiBoYW5kbGluZ0V2ZW50OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQotCQkvLyBuYW1lCi0JCUNMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRSIpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCQluYW1lVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBwcmVmaXgKLQkJQ0xhYmVsIHByZWZpeExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BSRUZJWCIpICsgIjoiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmaXhUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0YXJnZXRuYW1lc3BhY2UKLQkJQ0xhYmVsIHRhcmdldE5hbWVzcGFjZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGFyZ2V0TmFtZXNwYWNlVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQWR2YW5jZWQgYnV0dG9uCi0JCWJ1dHRvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9TRUNUSU9OX0FEVkFOQ0VEX0FUVFJJQlVURVMiKSArICIuLi4iLCBTV1QuUFVTSCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCQotCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8gTGFiZWxzCi0JCS8vIG5hbWUgbGF5b3V0Ci0JCUZvcm1EYXRhIGRhdGFOYW1lTGFiZWwgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YU5hbWVMYWJlbC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhTmFtZUxhYmVsKTsKLQotCQkvLyBwcmVmaXggbGF5b3V0Ci0JCUZvcm1EYXRhIGRhdGFQcmVmaXhMYWJlbCA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhUHJlZml4TGFiZWwubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YVByZWZpeExhYmVsLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHJlZml4TGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhUHJlZml4TGFiZWwpOwotCi0JCS8vIHRhcmdldE5hbWVzcGFjZUxhYmVsIGxheW91dAotCQlGb3JtRGF0YSBkYXRhdG5zTGFiZWwgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YXRuc0xhYmVsLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgZGF0YXRuc0xhYmVsLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHRhcmdldE5hbWVzcGFjZVRleHQsIDApOwotCQlkYXRhdG5zTGFiZWwudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHRhcmdldE5hbWVzcGFjZVRleHQsIDAsIFNXVC5DRU5URVIpOwotCQl0YXJnZXROYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGF0bnNMYWJlbCk7Ci0JCQotCi0JCS8vLy8vLy8vLy8vLy8vLy8vLy8vLyBUZXh0IEZpZWxkcwotCQkvLyBuYW1lIHRleHQgZmllbGQKLQkJRm9ybURhdGEgZGF0YU5hbWVUZXh0ID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGFOYW1lVGV4dC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDExNSk7Ci0JCWRhdGFOYW1lVGV4dC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGFOYW1lVGV4dC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YU5hbWVUZXh0KTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gcHJlZml4IHRleHQgZmllbGQKLQkJRm9ybURhdGEgZGF0YVByZWZpeFRleHQgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YVByZWZpeFRleHQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMTUpOwotCQlkYXRhUHJlZml4VGV4dC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGFQcmVmaXhUZXh0LnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lVGV4dCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlwcmVmaXhUZXh0LnNldExheW91dERhdGEoZGF0YVByZWZpeFRleHQpOwotCQlwcmVmaXhUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIHRhcmdldG5hbWVzcGFjZSB0ZXh0IGZpZWxkCi0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDExNSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwcmVmaXhUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXRhcmdldE5hbWVzcGFjZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFyZ2V0TmFtZXNwYWNlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJCi0JCS8vIEFkdmFuY2VkIGJ1dHRvbiBsYXlvdXQKLQkJRm9ybURhdGEgZGF0YUJ1dHRvbiA9IG5ldyBGb3JtRGF0YSgpOwotLy8JCWRhdGFCdXR0b24ubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlICsgMik7Ci0JCWRhdGFCdXR0b24ucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSAtIElUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhQnV0dG9uLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXJnZXROYW1lc3BhY2VUZXh0LCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0vLwkJZGF0YUJ1dHRvbi50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFyZ2V0TmFtZXNwYWNlVGV4dCwgMCwgU1dULkNFTlRFUik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGFCdXR0b24pOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkKLQl7Ci0JCWhhbmRsaW5nRXZlbnQgPSB0cnVlOwotCSAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lVGV4dCkgewotCSAgCU9iamVjdCBvYmogPSBnZXRFbGVtZW50KCk7Ci0JICAJaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLQkgIAkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIG9iajsKLQkgIAkJU3RyaW5nIHVyaSA9IGRlZmluaXRpb24uZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQkgIAkJZGVmaW5pdGlvbi5zZXRRTmFtZShuZXcgUU5hbWUodXJpLCBuYW1lVGV4dC5nZXRUZXh0KCkpKTsKLQkgIAl9Ci0JICB9Ci0JICBlbHNlIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCkgewotCSAgCU9iamVjdCBvYmogPSBnZXRFbGVtZW50KCk7Ci0JICAJaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pIHsKLQkgIAkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIG9iajsKLQkgIAkJU3RyaW5nIHVyaSA9IGRlZmluaXRpb24uZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLQotCSAgCQlFbGVtZW50IGVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLQkgIAkJCi0JICAJCS8vIFJlbW92ZSB0aGUgb2xkIHByZWZpeAotCSAgCQlTdHJpbmcgb2xkUHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JICAJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJ4bWxuczoiK29sZFByZWZpeCk7IAotCSAgCQkKLQkgIAkJLy8gU2V0IHRoZSBuZXcgcHJlZml4Ci0JICAJICAJZWxlbWVudC5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXhUZXh0LmdldFRleHQoKSwgZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JICAJfQotCSAgfQotCSAgZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHRhcmdldE5hbWVzcGFjZVRleHQpCi0JICB7Ci0JCSAgT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoKTsKLQkJICBpZiAob2JqIGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLQkJICB7Ci0JCSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbilvYmo7Ci0JCSAgICBTdHJpbmcgbmV3VmFsdWUgPSB0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKTsKLQkJICAgIFN0cmluZyBwcmVmaXggPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJICAgIGRlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKG5ld1ZhbHVlKTsKLQkJICAgIGRlZmluaXRpb24uZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwgbmV3VmFsdWUpOwotCQkgIH0KLQkgIH0KLQkgIGhhbmRsaW5nRXZlbnQgPSBmYWxzZTsJCQotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCi0gICAgaWYgKHRhcmdldE5hbWVzcGFjZVRleHQuaXNGb2N1c0NvbnRyb2woKSB8fCBoYW5kbGluZ0V2ZW50KQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0JICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOyAgCi0JICBPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotCSAgaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0JICB7Ci0JICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKW9iajsKLQkgICAgU3RyaW5nIHRhcmdldE5TID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkgICAgCi0JCS8vIHNldCB0YXJnZXRuYW1lc3BhY2UgZmllbGQgYW5kIHByZWZpeCBmaWVsZAotCSAgICBpZiAodGFyZ2V0TlMgIT0gbnVsbCkKLQkgICAgewotCSAgICAJdGFyZ2V0TmFtZXNwYWNlVGV4dC5zZXRUZXh0KHRhcmdldE5TKTsKLQkgICAgCQotCSAgICAJRWxlbWVudCBlbGVtZW50ID0gZGVmaW5pdGlvbi5nZXRFbGVtZW50KCk7Ci0KLSAgICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IGRlZmluaXRpb24uZ2V0UHJlZml4KHRhcmdldE5TKTsKLSAgICAgICAgaWYgKG5ld1ByZWZpeCA9PSBudWxsKSBuZXdQcmVmaXggPSAiIjsKLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgY29kZQotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gIAkgICAgCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKTsgaW5kZXgrKykgewotICAJICAgIAkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuaXRlbShpbmRleCk7Ci0gIAkgICAgCQlTdHJpbmcgbmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotICAJICAgIAkJU3RyaW5nIG5vZGVOYW1lID0gYXR0ci5nZXROb2RlTmFtZSgpOwotICAJICAgIAkJU3RyaW5nIG5zVmFsdWUgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotICAJICAgIAkJaWYgKG5zVmFsdWUuZXF1YWxzKHRhcmdldE5TKSkgewotICAJICAgIAkJCWlmIChub2RlTmFtZS5pbmRleE9mKCI6IikgIT0gLTEpIHsKLSAgCSAgICAJCQkJU3RyaW5nIHhtbG5zU3RyaW5nID0gbm9kZU5hbWUuc3Vic3RyaW5nKDAsIG5vZGVOYW1lLmluZGV4T2YoIjoiKSk7Ci0gIAkgICAgCQkJCQotICAJICAgIAkJCQlpZiAoeG1sbnNTdHJpbmcuZXF1YWxzKCJ4bWxucyIpKSB7Ci0gIAkgICAgCSAgICAJCQluZXdQcmVmaXggPSBhdHRyLmdldExvY2FsTmFtZSgpOwotICAJICAgIAkgICAgCQkJYnJlYWs7Ci0gIAkgICAgCQkJCX0KLSAgCSAgICAJCQl9Ci0gIAkgICAgCQl9Ci0gIAkgICAgCX0KLSAgICAgICAgfQotCSAgICAJcHJlZml4VGV4dC5zZXRUZXh0KG5ld1ByZWZpeCk7ICAgICAKLQkgICAgfQotCSAgfQotCSAgCi0JICAvLyBzZXQgbmFtZSBmaWVsZAotCSAgaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsKQotCSAgewotCSAgICBpZiAoZ2V0RWxlbWVudCgpLmdldEVsZW1lbnQoKSE9IG51bGwpCi0JICAgIHsKLQkgICAgICBTdHJpbmcgbmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICBpZiAobmFtZT09bnVsbCkgbmFtZT0iIjsKLQkgICAgICBuYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotCSAgICB9Ci0JICB9Ci0KLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCQotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgaWYgKGUud2lkZ2V0ID09IGJ1dHRvbikKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKW9iajsKLSAgICAgICAgRWRpdE5hbWVzcGFjZXNBY3Rpb24gYWN0aW9uID0gbmV3IEVkaXROYW1lc3BhY2VzQWN0aW9uKGRlZmluaXRpb24pOwotICAgICAgCWFjdGlvbi5ydW4oKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmFtZXNwYWNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU5MzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VTZWN0aW9uRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkRlc2NyaXB0b3IgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3IKLXsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIE5hbWVzcGFjZVNlY3Rpb25EZXNjcmlwdG9yKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5uYW1lc3BhY2UiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChXU0RMR3JvdXBPYmplY3QuY2xhc3MpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0U2VjdGlvbkNsYXNzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbiBnZXRTZWN0aW9uQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBOYW1lc3BhY2VTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICBvYmplY3QgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICAgIHsKLSAgICAgIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoKFdTRExHcm91cE9iamVjdCkgb2JqZWN0KS5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAJaWYgKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpICE9IG51bGwpIHsKLSAgICAgIAkJcmV0dXJuIHRydWU7Ci0gICAgICAJfQotICAgICAgCQotICAgICAgCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24pIHsKLSAgICAgIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgb2JqZWN0OwotICAgICAgCWlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0gICAgICAJCXJldHVybiB0cnVlOwotICAgICAgCX0KLSAgICAgIAkKLSAgICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldEFmdGVyU2VjdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXJ0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhcnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTM2YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhcnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmRpYWxvZ3MuSW52b2tlU2V0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgUGFydFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24KLXsKLSAgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsKLQlDQ29tYm8gcmVmZXJlbmNlS2luZENvbWJvOwotICBDTGFiZWwgY29tcG9uZW50TmFtZUxhYmVsOwotICBCdXR0b24gYnV0dG9uOwotICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQgKEV2ZW50IGV2ZW50KQotCXsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsgIAotICAgICAgaWYgKGV2ZW50LndpZGdldCA9PSByZWZlcmVuY2VLaW5kQ29tYm8pCi0gICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaXNUeXBlID0gcmVmZXJlbmNlS2luZENvbWJvLmdldFRleHQoKS5lcXVhbHMoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZSgoUGFydClnZXRFbGVtZW50KCksIGlzVHlwZSwgbnVsbCk7Ci0gICAgICAgIHJlZnJlc2goKTsKLSAgICAgIH0gCi0gICAgfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KQotCXsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJY29tcG9zaXRlID0JZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJRm9ybURhdGEgZGF0YTsKLQotCQlyZWZlcmVuY2VLaW5kQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSk7Ci0JCXJlZmVyZW5jZUtpbmRDb21iby5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCQlyZWZlcmVuY2VLaW5kQ29tYm8uYWRkKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVmZXJlbmNlS2luZENvbWJvLmFkZChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0KLQkJQ0xhYmVsIHZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUkVGRVJFTkNFX0tJTkQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVmZXJlbmNlS2luZENvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHJlZmVyZW5jZUtpbmRDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgY29tcG9uZW50TmFtZUxhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tcG9uZW50TmFtZUNvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCWNvbXBvbmVudE5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLSAgICBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgIGJ1dHRvbi5zZXRJbWFnZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSArIDIpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLSAgICBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0gICAgZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDEwMCk7Ci0gICAgZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC1yaWdodE1hcmdpblNwYWNlIC0gSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0gICAgZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0gICAgcmVmZXJlbmNlS2luZENvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnV0dG9uLCAwKTsKLSAgICBkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChyZWZlcmVuY2VLaW5kQ29tYm8sICtJVGFiYmVkUHJvcGVydHlDb25zdGFudHMuVlNQQUNFKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJlZmVyZW5jZUtpbmRDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkKLQl7Ci0gICAgc3VwZXIucmVmcmVzaCgpOwotCSAgcmVmZXJlbmNlS2luZENvbWJvLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCQlpZiAoKChQYXJ0KWdldEVsZW1lbnQoKSkuZ2V0VHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotCQl7Ci0JCSAgcmVmZXJlbmNlS2luZENvbWJvLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJewotCQkgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLSAgICB0cnkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClnZXRFbGVtZW50KCk7Ci0gICAgICBib29sZWFuIGlzVHlwZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuaXNUeXBlKHBhcnQpOwotICAgICAgU3RyaW5nIHZhbHVlID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRQYXJ0Q29tcG9uZW50UmVmZXJlbmNlKHBhcnQpOwotCi0gICAgICAvLyB1cGRhdGUgdGhlIGNvbWJvLWJveCBjb250ZW50Ci0gICAgICAvLwotICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnJlbW92ZUFsbCgpOyAKLSAgICAgIExpc3QgY29tcExpc3QgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldENvbXBvbmVudE5hbWVMaXN0KHBhcnQsIGlzVHlwZSk7Ci0gICAgICBpZiAoY29tcExpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICBjb21wTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZCgoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgICAKLSAgICAgIGlmIChpc1R5cGUpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZWZlcmVuY2VLaW5kQ29tYm8uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbXBvbmVudE5hbWVMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1RZUEUiKSArICI6Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotLy8gICAgICAgIGJ1dHRvbi5zZXRSZWZlcmVuY2VLaW5kKCJ0eXBlIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbXBvbmVudE5hbWVMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSArICI6Iik7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5zZXRUZXh0KHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLS8vICAgICAgICBidXR0b24uc2V0UmVmZXJlbmNlS2luZCgiZWxlbWVudCIpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyAgICAgIGJ1dHRvbi5zZXRJbnB1dChpbnB1dCk7Ci0vLyAgICAgIGJ1dHRvbi5zZXRFZGl0b3IoZWRpdG9yUGFydCk7Ci0gICAgICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gIAkJcmVmZXJlbmNlS2luZENvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotICAgIH0KLQl9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBQYXJ0IHBhcnQgPSAoUGFydClnZXRFbGVtZW50KCk7Ci0gICAgYm9vbGVhbiBpc1R5cGUgPSByZWZlcmVuY2VLaW5kQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9UWVBFIikpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGUud2lkZ2V0ID09IGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCkpOwotICAgICAgcmVmcmVzaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlLndpZGdldCA9PSBidXR0b24pCi0gICAgewotICAgICAgICBJbnZva2VTZXREaWFsb2cgZGlhbG9nID0gbmV3IEludm9rZVNldERpYWxvZygpOwotICAgICAgICAgIAotICAgICAgICBpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgUGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgZGlhbG9nLnNldFJlZmVyZW5jZUtpbmQocmVmZXJlbmNlS2luZENvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGlhbG9nLnNldFJlZmVyZW5jZUtpbmQocmVmZXJlbmNlS2luZENvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgIGRpYWxvZy5ydW4oZ2V0RWxlbWVudCgpLCBlZGl0b3JQYXJ0KTsKLSAgICAgICAgCi0gICAgICAgIFdTRExFZGl0b3IgZWRpdG9yID0gKFdTRExFZGl0b3IpIGVkaXRvclBhcnQ7Ci0gICAgICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldEVsZW1lbnQoKSkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhcnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1BhcnRTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGIxMzFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9QYXJ0U2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLQotCi1wdWJsaWMgY2xhc3MgUGFydFNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICBQYXJ0U2VjdGlvbiBwYXJ0U2VjdGlvbjsKLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFBhcnRTZWN0aW9uRGVzY3JpcHRvcigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHBhcnRTZWN0aW9uID0gbmV3IFBhcnRTZWN0aW9uKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5wYXJ0IjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldElucHV0VHlwZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0SW5wdXRUeXBlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoUGFydC5jbGFzcyk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRTZWN0aW9uQ2xhc3MoKQotICAgKi8KLSAgcHVibGljIElTZWN0aW9uIGdldFNlY3Rpb25DbGFzcygpCi0gIHsKLSAgICByZXR1cm4gcGFydFNlY3Rpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRUYXJnZXRUYWIoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXRUYWIoKQotICB7Ci0gICAgcmV0dXJuICJjb20uaWJtLnhtbHdlYnNlcnZpY2VzLmdlbmVyYWwiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjYXBwbGllc1RvKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBhcHBsaWVzVG8oSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBwYXJ0U2VjdGlvbi5zZXRFZGl0b3JQYXJ0KHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJ0KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEFmdGVyU2VjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gIm9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnNlY3Rpb24ubmFtZSI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1JlZmVyZW5jZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmIzZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1JlZmVyZW5jZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZGlhbG9ncy5JbnZva2VTZXREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5Db21wb25lbnROYW1lQ29tYm9IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbgotewotICBwcm90ZWN0ZWQgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsgCi0gIHByb3RlY3RlZCBDb21wb25lbnROYW1lQ29tYm9IZWxwZXIgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotICBCdXR0b24gYnV0dG9uOwotICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICBDTGFiZWwgbWVzc2FnZUxhYmVsOwotICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0JewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQljb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLSAgICAKLSAgICBtZXNzYWdlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBidXR0b24gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIKTsgLy8kTk9OLU5MUy0xJAotICAgIGJ1dHRvbi5zZXRJbWFnZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tcG9uZW50TmFtZUNvbWJvLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbXBvbmVudE5hbWVDb21ibywgMCwgU1dULkNFTlRFUik7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtcmlnaHRNYXJnaW5TcGFjZSArIDIpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY29tcG9uZW50TmFtZUNvbWJvLCAwLCBTV1QuQ0VOVEVSKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotICAgIGRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAxMDApOwotICAgIGRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYnV0dG9uLCAwKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpCi0JewotICAgIHN1cGVyLnJlZnJlc2goKTsKLQkgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAKLQkgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkgIE9iamVjdCBvYmogPSBnZXRFbGVtZW50KCk7Ci0JICBpZiAob2JqIGluc3RhbmNlb2YgTWVzc2FnZVJlZmVyZW5jZSkKLQkgIHsKLQkgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpKTsgLy8kTk9OLU5MUy0xJAotCSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLQkgICAgewotCSAgICAgIHByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gdXRpbC5nZXRNZXNzYWdlTmFtZXMoKTsKLQkgICAgICB9Ci0KLQkgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotCSAgICAgIHsKLQkgICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFOwotCSAgICAgIH0KLQkgICAgfTsKLQotCSAgfQotCSAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQmluZGluZykKLQkgIHsKLQkgICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyID0gbmV3IENvbXBvbmVudE5hbWVDb21ib0hlbHBlcihjb21wb25lbnROYW1lQ29tYm8pCi0JICAgIHsKLQkgICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0JICAgICAgewotCSAgICAgICAgcmV0dXJuIHV0aWwuZ2V0UG9ydFR5cGVOYW1lcygpOwotCSAgICAgIH0KLQotCSAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpCi0JICAgICAgewotCSAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEU7Ci0JICAgICAgfQotCSAgICB9OwotCi0JICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BPUlRUWVBFIikpOyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQb3J0KQotCSAgewotCSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLQkgICAgewotCSAgICAgIHByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gdXRpbC5nZXRCaW5kaW5nTmFtZXMoKTsKLQkgICAgICB9Ci0KLQkgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQotCSAgICAgIHsKLQkgICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLkJJTkRJTkdfQVRUUklCVVRFOwotCSAgICAgIH0KLQkgICAgfTsKLQkgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElORyIpKTsgLy8kTk9OLU5MUy0xJAotCSAgfQotCSAgCi0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLnVwZGF0ZShnZXRFbGVtZW50KCkpOwotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYnV0dG9uKQotICAgIHsKLSAgICAgICAgSW52b2tlU2V0RGlhbG9nIGRpYWxvZyA9IG5ldyBJbnZva2VTZXREaWFsb2coKTsKLSAgICAgICAgZGlhbG9nLnJ1bihnZXRFbGVtZW50KCksIGVkaXRvclBhcnQpOwotICAgICAgICAKLSAgICAgICAgV1NETEVkaXRvciBlZGl0b3IgPSAoV1NETEVkaXRvcikgZWRpdG9yUGFydDsKLSAgICAgICAgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZ2V0RWxlbWVudCgpKSk7Ci0gICAgfQotICB9Ci0JCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICB7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLmhhbmRsZUV2ZW50SGVscGVyKGdldEVsZW1lbnQoKS5nZXRFbGVtZW50KCksIGV2ZW50KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yUGFydChJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI2YmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9SZWZlcmVuY2VTZWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci0KLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZVNlY3Rpb25EZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uRGVzY3JpcHRvciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvcgotewotICBSZWZlcmVuY2VTZWN0aW9uIHJlZmVyZW5jZVNlY3Rpb247Ci0gIAotICAvKioKLSAgICogCi0gICAqLwotICBwdWJsaWMgUmVmZXJlbmNlU2VjdGlvbkRlc2NyaXB0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0aGlzLnJlZmVyZW5jZVNlY3Rpb24gPSBuZXcgUmVmZXJlbmNlU2VjdGlvbigpOyAKLSAgfQotCi0KLSAgLyoqCi0gICAqIAotICAgKi8KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5yZWZlcmVuY2UiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0SW5wdXRUeXBlcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbnB1dFR5cGVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChNZXNzYWdlUmVmZXJlbmNlLmNsYXNzKTsKLSAgICBsaXN0LmFkZChCaW5kaW5nLmNsYXNzKTsKLSAgICBsaXN0LmFkZChQb3J0LmNsYXNzKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2dldFNlY3Rpb25DbGFzcygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb24gZ2V0U2VjdGlvbkNsYXNzKCkKLSAgewotICAgIHJldHVybiByZWZlcmVuY2VTZWN0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3IjZ2V0VGFyZ2V0VGFiKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0VGFiKCkKLSAgewotICAgIHJldHVybiAiY29tLmlibS54bWx3ZWJzZXJ2aWNlcy5nZW5lcmFsIjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yI2FwcGxpZXNUbyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gYXBwbGllc1RvKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgcmVmZXJlbmNlU2VjdGlvbi5zZXRFZGl0b3JQYXJ0KHBhcnQuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSk7Ci0gICAgT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotICAgICAgb2JqZWN0ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlUmVmZXJlbmNlIHx8IG9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmcgfHwgb2JqZWN0IGluc3RhbmNlb2YgUG9ydCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QWZ0ZXJTZWN0aW9uKCkKLSAgewotICAgIHJldHVybiAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuc2VjdGlvbi5uYW1lIjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVGV4dENoYW5nZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1RleHRDaGFuZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0ZWQxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vVGV4dENoYW5nZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRleHRDaGFuZ2VIZWxwZXIgbm90aWZpZXMgdGhlIGxpc3RuZXIgb2YgdGV4dCBsaWZlY3ljbGUgZXZlbnRzIAotICogb24gYmVoYWxmIG9mIHRoZSB3aWRnZXQocykgaXQgbGlzdGVucyB0by4gCi0gKiAKLSAqIEBhdXRob3IgQW50aG9ueSBIdW50ZXIgCi0gKiA8YSBocmVmPSJtYWlsdG86YW50aG9ueWhAY2EuaWJtLmNvbSI+YW50aG9ueWhAY2EuaWJtLmNvbTwvYT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRleHRDaGFuZ2VIZWxwZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5vblVzZXJDaGFuZ2U7Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgc3RhcnQgb2YgYSBwcm9ncmFtbWF0aWMgY2hhbmdlIHRvIHRoZSB3aWRnZXQgY29udGVudHMuCi0JICogQ2xpZW50cyBtdXN0IGNhbGwgc3RhcnROb25Vc2VyQ2hhbmdlKCkgYmVmb3JlIGRpcmVjdGx5IHNldHRpbmcgCi0JICogdGhlIHdpZGdldCBjb250ZW50cyB0byBhdm9pZCB1bndhbnRlZCBsaWZlY3ljbGUgZXZlbnRzLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgcHJvZ3JhbW1hdGljIGNoYW5nZSBpcyAKLQkgKiBhbHJlYWR5IGluIHByb2dyZXNzLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0Tm9uVXNlckNoYW5nZSgpIHsKLQkJaWYgKG5vblVzZXJDaGFuZ2UpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBhbHJlYWR5IHN0YXJ0ZWQgYSBub24gdXNlciBjaGFuZ2UiKTsvLyROT04tTkxTLTEkCi0JCW5vblVzZXJDaGFuZ2UgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENsaWVudHMgd2hvIGNhbGwgc3RhcnROb25Vc2VyQ2hhbmdlKCkgc2hvdWxkIGNhbGwgCi0JICogZmluaXNoTm9uVXNlckNoYW5nZSgpIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdGhlIGNoYW5nZSBpcyBkb25lLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIGNoYW5nZSBpcyBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5pc2hOb25Vc2VyQ2hhbmdlKCkgewotCQlpZiAoIW5vblVzZXJDaGFuZ2UpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBhcmUgbm90IGluIGEgbm9uIHVzZXIgY2hhbmdlIik7Ly8kTk9OLU5MUy0xJAotCQlub25Vc2VyQ2hhbmdlID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGEgcHJvZ3JhbW1hdGljIGNoYW5nZSBpcyBpbiBwcm9ncmVzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vblVzZXJDaGFuZ2UoKSB7Ci0JCXJldHVybiBub25Vc2VyQ2hhbmdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQljYXNlIFNXVC5LZXlEb3duIDoKLQkJCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5DUikKLQkJCQkJdGV4dENoYW5nZWQoKENvbnRyb2wpZXZlbnQud2lkZ2V0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1dULkZvY3VzT3V0IDoKLQkJCQl0ZXh0Q2hhbmdlZCgoQ29udHJvbClldmVudC53aWRnZXQpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWJzdHJhY3QgbWV0aG9kIG5vdGlmaWVkIHdoZW4gYSB0ZXh0IGZpZWxkIGhhcyBiZWVuIGNoYW5nZWQuCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0ZXh0Q2hhbmdlZChDb250cm9sIGNvbnRyb2wpOwotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoaXMgaGVscGVyIHdpdGggdGhlIGdpdmVuIGNvbnRyb2wgdG8gbGlzdGVuIGZvciBldmVudHMKLQkgKiB3aGljaCBpbmRpY2F0ZSB0aGF0IGEgY2hhbmdlIGlzIGluIHByb2dyZXNzIChvciBkb25lKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydExpc3RlbmluZ1RvKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIHRoaXMgaGVscGVyIHdpdGggdGhlIGdpdmVuIGNvbnRyb2wgdG8gbGlzdGVuIGZvciB0aGUKLQkgKiBFbnRlciBrZXkuICBXaGVuIEVudGVyIGlzIHByZXNzZWQsIHRoZSBjaGFuZ2UgaXMgY29uc2lkZXJlZCBkb25lIAotCSAqICh0aGlzIGlzIG9ubHkgYXBwcm9wcmlhdGUgZm9yIHNpbmdsZS1saW5lIFRleHQgd2lkZ2V0cykuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdGb3JFbnRlcihDb250cm9sIGNvbnRyb2wpIHsKLQkJLy8gTk9URTogS2V5RG93biByYXRoZXIgdGhhbiBLZXlVcCwgYmVjYXVzZSBvZiBzaW1pbGFyIHVzYWdlIGluIENDb21iby4gCi0JCWNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULktleURvd24sIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIHRoaXMgaGVscGVyIGZyb20gYSBjb250cm9sIHByZXZpb3VzbHkgcGFzc2VkIHRvCi0JICogc3RhcnRMaXN0ZW5pbmdUbygpIGFuZC9vciBzdGFydExpc3RlbmluZ0ZvckVudGVyKCkuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLnJlbW92ZUxpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JCWNvbnRyb2wucmVtb3ZlTGlzdGVuZXIoU1dULktleURvd24sIHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZDllNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGgubW9kZWwuV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIE1vZGVsQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLQlwcml2YXRlIFdTRExUeXBlTWFwcGVyIHR5cGVNYXBwZXI7Ci0JCi0gIHByb3RlY3RlZCBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gbGFiZWxQcm92aWRlckV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBMYWJlbFByb3ZpZGVyW10gbGFiZWxQcm92aWRlcnM7Ci0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFdTRExMYWJlbFByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdHlwZU1hcHBlciA9IG5ldyBXU0RMVHlwZU1hcHBlcigpOwotICAgIGVkaXRvclBhcnQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0gICAgbGFiZWxQcm92aWRlckV4dGVuc2lvbnMgPSByZWdpc3RyeS5nZXRSZWdpc3RlcmVkRXh0ZW5zaW9ucyhXU0RMRWRpdG9yRXh0ZW5zaW9uLk9VVExJTkVfTEFCRUxfUFJPVklERVIpOyAKLSAgICBsYWJlbFByb3ZpZGVycyA9IG5ldyBMYWJlbFByb3ZpZGVyW2xhYmVsUHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbGFiZWxQcm92aWRlcnNbaV0gPSAoTGFiZWxQcm92aWRlcilsYWJlbFByb3ZpZGVyRXh0ZW5zaW9uc1tpXS5jcmVhdGVFeHRlbnNpb25PYmplY3QoV1NETEVkaXRvckV4dGVuc2lvbi5PVVRMSU5FX0xBQkVMX1BST1ZJREVSLCAoV1NETEVkaXRvcillZGl0b3JQYXJ0KTsKLSAgICB9Ci0gIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KQotCXsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gICAgSW1hZ2UgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgIAotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBzZWxlY3RlZCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbilvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgc2VsZWN0ZWQgID0gdHlwZU1hcHBlci5yZW1hcE9iamVjdChzZWxlY3RlZCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVsUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBsYWJlbFByb3ZpZGVyc1tpXS5nZXRJbWFnZShzZWxlY3RlZCk7Ci0gICAgICAgIGlmIChyZXN1bHQhPW51bGwpCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotLy8gICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihzZWxlY3RlZCk7Ci0vLyAgICAgICAgaWYgKG1vZGVsQWRhcHRlciAhPSBudWxsKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHJlc3VsdCA9IChJbWFnZSltb2RlbEFkYXB0ZXIuZ2V0UHJvcGVydHkoc2VsZWN0ZWQsIE1vZGVsQWRhcHRlci5JTUFHRV9QUk9QRVJUWSk7ICAgICAKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KQotCXsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiAiTm8gaXRlbXMgc2VsZWN0ZWQiOy8vJE5PTi1OTFMtMSQKLQkJfQotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIE9iamVjdCBzZWxlY3RlZCA9IG51bGw7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgc2VsZWN0ZWQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgIHNlbGVjdGVkICA9IHR5cGVNYXBwZXIucmVtYXBPYmplY3Qoc2VsZWN0ZWQpOwotICAgICAgCi0gICAgICAvLyBPdmVycmlkZSBvdXRsaW5lIHByb3ZpZGVyJ3MgZ2V0VGV4dCBmb3IgV1NETEVsZW1lbnRzCi0gICAgICBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgIHsKLSAgICAgIAlpZiAoKChXU0RMRWxlbWVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpID09IG51bGwpIHsKLSAgICAgIAkJcmV0dXJuICIiOwotICAgICAgCX0KLSAgICAgICAgYm9vbGVhbiBpc1JlYWRPbmx5ID0gZmFsc2U7Ci0gICAgICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gV1NETEdyYXBoTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMR3JhcGhNb2RlbEFkYXB0ZXJGYWN0b3J5KCkuZ2V0QWRhcHRlcihzZWxlY3RlZCk7Ci0gICAgICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpc1JlYWRPbmx5ID0gQm9vbGVhbi5UUlVFLmVxdWFscyhhZGFwdGVyLmdldFByb3BlcnR5KHNlbGVjdGVkLCAiaXNSZWFkT25seSIpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNSZWFkT25seSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICgoV1NETEVsZW1lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSArICIgKCIgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUFEX09OTFkiKSArICIpIjsgICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gKChXU0RMRWxlbWVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgewotICAgICAgICAvLyBPdmVycmlkZSBmb3IgWFNEIENvbXBvbmVudHMKLSAgICAgICAKLSAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKChYU0RDb25jcmV0ZUNvbXBvbmVudClzZWxlY3RlZCkuZ2V0RWxlbWVudCgpLmdldExvY2FsTmFtZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICgoWFNEQ29uY3JldGVDb21wb25lbnQpc2VsZWN0ZWQpLmdldEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKSArICIgKCIgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUFEX09OTFkiKSArICIpIjsgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAiKCIgKyBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUFEX09OTFkiKSArICIpIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICAvLyBvdGhlcndpc2UgZ2V0IGl0IGZyb20gdGhlIGV4dGVuc2lvbnMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxQcm92aWRlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGxhYmVsUHJvdmlkZXJzW2ldLmdldFRleHQoc2VsZWN0ZWQpOwotICAgICAgICBpZiAocmVzdWx0IT1udWxsKQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGV4dFNlbGVjdGlvbikKLSAgICB7Ci0gICAgfQotICAgIAotCi0gICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgYSBtdWx0aXBsZSBvYmplY3Qgc2VsZWN0aW9uIGhhcyBiZWVuIHBhc3NlZCB0byB0aGUgCi0JICogbGFiZWwgcHJvdmlkZXIuIElmIHRoZSBvYmplY3RzIGlzIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24sIHNlZSBpZiAKLQkgKiBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgdGhlIHNhbWUgYW5kIGlmIHNvLCB3ZSB3YW50Ci0JICogdG8gcHJvdmlkZSBsYWJlbHMgZm9yIHRoZSBjb21tb24gc2VsZWN0ZWQgZWxlbWVudC4KLQkgKiBAcGFyYW0gb2JqZWN0cyBhIHNpbmdsZSBvYmplY3Qgb3IgYSBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLQkgKiBAcGFyYW0gbXVsdGlwbGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgdHJ1ZSBpZiB0aGVyZSBpcyBtdWx0aXBsZQotCSAqIHVuZXF1YWwgc2VsZWN0ZWQgZWxlbWVudHMgaW4gYSBJU3RydWN0dXJlZFNlbGVjdGlvbi4KLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgdG8gZ2V0IGxhYmVscyBmb3IuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0T2JqZWN0KE9iamVjdCBvYmplY3RzLCBib29sZWFuIG11bHRpcGxlW10pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChvYmplY3RzKTsKLQkJT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vV1NETFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2QxNjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlciBpbXBsZW1lbnRzIElTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyRXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyW10gcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyczsKLQotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGxhYmVsUHJvdmlkZXJFeHRlbnNpb25zOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSB7fTsKLSAgCi0gIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFdTRExTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgLy8gVE9ETyBDaGVjayB0aGlzCi0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIjZ2V0U2VjdGlvbkRlc2NyaXB0b3JzKCkKLSAgICovCi0gIHB1YmxpYyBJU2VjdGlvbkRlc2NyaXB0b3JbXSBnZXRTZWN0aW9uRGVzY3JpcHRvcnMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIAotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0KLSAgICBwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJFeHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5QUk9QRVJUWV9TRUNUSU9OX0RFU0NSSVBUT1JfUFJPVklERVIpOyAKLSAgICBwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJzID0gbmV3IElTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyW3Byb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlckV4dGVuc2lvbnMubGVuZ3RoXTsgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0eVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHByb3BlcnR5U2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcnNbaV0gPSAoSVNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIpcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyRXh0ZW5zaW9uc1tpXS5jcmVhdGVFeHRlbnNpb25PYmplY3QoV1NETEVkaXRvckV4dGVuc2lvbi5QUk9QRVJUWV9TRUNUSU9OX0RFU0NSSVBUT1JfUFJPVklERVIsIChXU0RMRWRpdG9yKWVkaXRvclBhcnQpOwotICAgICAgCi0gICAgICBJU2VjdGlvbkRlc2NyaXB0b3IgW10gZXh0ZW5zaW9uU2VjdGlvbkRlc2NyaXB0b3JzID0gcHJvcGVydHlTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyc1tpXS5nZXRTZWN0aW9uRGVzY3JpcHRvcnMoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0ZW5zaW9uU2VjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChleHRlbnNpb25TZWN0aW9uRGVzY3JpcHRvcnNbal0pOwotICAgICAgfQotICAgIH0KLQotICAgIAotICAgIGxpc3QuYWRkKG5ldyBOYW1lU2VjdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgbGlzdC5hZGQobmV3IFBhcnRTZWN0aW9uRGVzY3JpcHRvcigpKTsKLSAgICBsaXN0LmFkZChuZXcgRG9jdW1lbnRhdGlvblNlY3Rpb25EZXNjcmlwdG9yKCkpOwotICAgIGxpc3QuYWRkKG5ldyBSZWZlcmVuY2VTZWN0aW9uRGVzY3JpcHRvcigpKTsKLSAgICBsaXN0LmFkZChuZXcgTmFtZXNwYWNlU2VjdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgbGlzdC5hZGQobmV3IEV4dGVuc2liaWxpdHlFbGVtZW50U2VjdGlvbkRlc2NyaXB0b3IoKSk7Ci0gICAgbGlzdC5hZGQobmV3IEltcG9ydFNlY3Rpb25EZXNjcmlwdG9yKCkpOwotICAgIAotCQlJU2VjdGlvbkRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBJU2VjdGlvbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCSAgbGlzdC50b0FycmF5KGRlc2NyaXB0b3JzKTsKLQotICAgIHJldHVybiBkZXNjcmlwdG9yczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU3MDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnZpZXcuZXZlbnRzLklOb2RlU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50cy5Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETFNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLk1vZGVsQWRhcHRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLm1vZGVsLldTRExNb2RlbEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJTm9kZVNlbGVjdGlvbkxpc3RlbmVyLCBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgotewotICBwcml2YXRlIFdTRExTZWxlY3Rpb25NYW5hZ2VyIGZWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyOwotICBwcml2YXRlIFdTRExFZGl0b3Igd3NkbEVkaXRvcjsKLSAgcHJpdmF0ZSBPYmplY3QgY3VycmVudE9iamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IKLSAgICovCi0gIHB1YmxpYyBXU0RMVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciwgV1NETEVkaXRvciBlZGl0b3IpCi0gIHsKLSAgICBzdXBlcih0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKTsKLSAgICB0aGlzLndzZGxFZGl0b3IgPSBlZGl0b3I7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAJd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpKSk7Ci0gIH0KLSAgCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uTWFuYWdlcihXU0RMU2VsZWN0aW9uTWFuYWdlciB2aWV3ZXJTZWxlY3Rpb25NYW5hZ2VyKSB7Ci0JCS8vIGRpc2Nvbm5lY3QgZnJvbSBvbGQgb25lCi0JCWlmIChmVmlld2VyU2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uTWFuYWdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlmVmlld2VyU2VsZWN0aW9uTWFuYWdlciA9IHZpZXdlclNlbGVjdGlvbk1hbmFnZXI7Ci0KLQkJLy8gY29ubmVjdCB0byBuZXcgb25lCi0JCWlmIChmVmlld2VyU2VsZWN0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmVmlld2VyU2VsZWN0aW9uTWFuYWdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0JewotCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJc2VsZWN0aW9uQ2hhbmdlZChnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkgICAgLy9zdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlUGFydCgpLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0gIAotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgLy8gb3ZlcnJpZGUgZm9yIGNhdGVnb3J5Ci0gICAgaWYgKHNlbGVjdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAgewotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0gICAgICAgIGlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBPYmplY3Qgb2JqID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgTm9kZSBub2RlID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXROb2RlRm9yT2JqZWN0KG9iaik7Ci0gICAgICAgIE9iamVjdCBvID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KHdzZGxFZGl0b3IuZ2V0RGVmaW5pdGlvbigpLCAoRWxlbWVudClub2RlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGJhZCBoYWNrIHRvIGdldCBzY2hlbWEgZnJvbSBjYXRlZ29yeQotICAgICAgICAvLyB1bnRpbCB3ZSBwcm92aWRlIGEgYmV0dGVyIG1lY2hhbmlzbSAoc2VsZWN0aW9uIG1hbmFnZXIgZXh0ZW5zaW9uKQotICAgICAgICAvLyBzZWUgYWxzbyBXU0RMR3JhcGhWaWV3ZXIKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIG9iaiA9ICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqKTsKLSAgICAgICAgfSAKLSAgICAgIAkKLSAgICAgICAgYXR0YWNoTGlzdGVuZXIobyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUZXh0U2VsZWN0aW9uKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHN1cGVyLnNlbGVjdGlvbkNoYW5nZWQod3NkbEVkaXRvci5nZXRFZGl0b3JQYXJ0KCksIHNlbGVjdGlvbik7ICAgLy8gZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOyAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoTGlzdGVuZXIoT2JqZWN0IG9iamVjdCkKLSAgewotICAJV1NETE1vZGVsQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpOwotICAgIE1vZGVsQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihvYmplY3QpOwotICAgIGlmIChhZGFwdGVyICE9IG51bGwpCi0gICAgewotICAgIAkvLyByZW1vdmUgbGlzdGVuZXIgZnJvbSB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBvYmplY3QKLSAgICAJcmVtb3ZlTGlzdGVuZXIoY3VycmVudE9iamVjdCk7Ci0gICAgCQotICAgIAkvLyBhZGQgbGlzdGVuZXIgdG8gdGhlIG5ld2x5IHNlbGVjdGVkIG9iamVjdAotICAgIAlhZGFwdGVyLmFkZExpc3RlbmVyKHRoaXMpOwotICAgIAljdXJyZW50T2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLSAgfSAKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUxpc3RlbmVyKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgCVdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKTsKLSAgICBNb2RlbEFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIob2JqZWN0KTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0gICAgICBjdXJyZW50T2JqZWN0ID0gbnVsbDsKLSAgICB9Ci0gIH0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkaXNjb25uZWN0IGZyb20gdGhlIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIKLQkJaWYgKGZWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZWaWV3ZXJTZWxlY3Rpb25NYW5hZ2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQkKLQkJLy8gZGlzY29ubmVjdCBsaXN0ZW5lciBmcm9tIHRoZSBjdXJyZW50IG9iamVjdAotCQlpZiAoY3VycmVudE9iamVjdCAhPSBudWxsKSB7Ci0JCQlyZW1vdmVMaXN0ZW5lcihjdXJyZW50T2JqZWN0KTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0uc3NlLmVkaXRvci52aWV3LmV2ZW50cy5JTm9kZVNlbGVjdGlvbkxpc3RlbmVyI25vZGVTZWxlY3Rpb25DaGFuZ2VkKGNvbS5pYm0uc3NlLmVkaXRvci52aWV3LmV2ZW50cy5Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgbm9kZVNlbGVjdGlvbkNoYW5nZWQoTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gIAlpZiAoZ2V0Q3VycmVudFRhYigpICE9IG51bGwpIHsKLSAgCQlyZWZyZXNoKCk7Ci0gIAl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9XU0RMVHlwZU1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExUeXBlTWFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZWQwNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1dTRExUeXBlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVHlwZU1hcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMVHlwZU1hcHBlciBpbXBsZW1lbnRzIElUeXBlTWFwcGVyCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVR5cGVNYXBwZXIjcmVtYXBUeXBlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLSAgICovCi0gIHB1YmxpYyBDbGFzcyByZW1hcFR5cGUoT2JqZWN0IG9iamVjdCwgQ2xhc3MgZWZmZWN0aXZlVHlwZSkKLSAgewotCQlDbGFzcyB0eXBlID0gZWZmZWN0aXZlVHlwZTsKLQkJCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpIHsKLQkJCXR5cGUgPSAoKFdTRExHcm91cE9iamVjdCkgb2JqZWN0KS5nZXREZWZpbml0aW9uKCkuZ2V0Q2xhc3MoKTsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IHJlbWFwT2JqZWN0KE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBPYmplY3QgdHlwZSA9IG9iamVjdDsKLSAgICAKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgIHsKLSAgICAgIHR5cGUgPSAoKFdTRExHcm91cE9iamVjdCkgb2JqZWN0KS5nZXREZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiB0eXBlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JXU0RMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JXU0RMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTE3MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVjb25jaWxlci9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JXU0RMIGV4dGVuZHMgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotewotCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBWQUxJREFUT1JfQ0xBU1MgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlLlZhbGlkYXRvciI7IAotCi0gIHB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yV1NETCgpCi0gIHsgc3VwZXIoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0RGVsZWdhdGVWYWxpZGF0b3IoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgIFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciByZWdpc3RyeSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLSAgICAgIHJldHVybiByZWdpc3RyeS5nZXRWYWxpZGF0b3IoVkFMSURBVE9SX0NMQVNTKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgLy8KLSAgICB9IAotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0V4dGVuc2libGVOb2RlUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvcmVjb25jaWxlci9FeHRlbnNpYmxlTm9kZVJlY29uY2lsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhMDc1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL0V4dGVuc2libGVOb2RlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU5vZGVSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLS8vIFRPRE8uLiB3ZSBzaG91bGQgcHJvYmFibHkgYmUga2V5aW5nIG9mZiBvZiB0aGUgbm9kZSdzIHFuYW1lIChwZXJoYXBzIHN1cHBvcnRpbmcgJ251bGwnIGFzIGEgd2lsZCBjYXJkIGZvciBsb2NhbCBuYW1lcykgCi0vLyBpbiBvcmRlciB0byBjb21wdXRlIGFuIGFwcGxpY2FibGUgcmVjb25jaWxlcgotLy8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlTm9kZVJlY29uY2lsZXIKLXsgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJTm9kZVJlY29uY2lsZXJbXSByZWNvbmNpbGVyczsKLQotICBwdWJsaWMgRXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uTk9ERV9SRUNPTkNJTEVSKTsgCi0gICAgcmVjb25jaWxlcnMgPSBuZXcgSU5vZGVSZWNvbmNpbGVyW2V4dGVuc2lvbnMubGVuZ3RoXTsgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlY29uY2lsZXJzW2ldID0gKElOb2RlUmVjb25jaWxlcilleHRlbnNpb25zW2ldLmNyZWF0ZUV4dGVuc2lvbk9iamVjdChXU0RMRWRpdG9yRXh0ZW5zaW9uLk5PREVfUkVDT05DSUxFUiwgbnVsbCk7Ci0gICAgfQotICB9ICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIElOb2RlUmVjb25jaWxlciBnZXRBcHBsaWNhYmxlTm9kZVJlY29uY2lsZXIoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElOb2RlUmVjb25jaWxlciByZWNvbmNpbGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHJlY29uY2lsZXIgPSByZWNvbmNpbGVyc1tpXTsKLSAgICAgICAgaWYgKHJlY29uY2lsZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWNvbmNpbGVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChPYmplY3QgbW9kZWxPYmplY3QsIEVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpICAgICAgICAgICAgIAotICB7Ci0gICAgSU5vZGVSZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBnZXRBcHBsaWNhYmxlTm9kZVJlY29uY2lsZXIobW9kZWxPYmplY3QpOwotICAgIGlmIChyZWNvbmNpbGVyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHJlY29uY2lsZXIubm90aWZ5Q2hhbmdlZChtb2RlbE9iamVjdCwgZWxlbWVudCwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlY29uY2lsZXIvU0VERG9jdW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC9yZWNvbmNpbGVyL1NFRERvY3VtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2JhNGMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3JlY29uY2lsZXIvU0VERG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyOyAgICAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBTRUREb2N1bWVudEFkYXB0ZXIKLXsKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsgICAKLSAgcHJvdGVjdGVkIEV4dGVuc2libGVOb2RlUmVjb25jaWxlciBleHRlbnNpYmxlTm9kZVJlY29uY2lsZXI7Ci0gIAotICBwdWJsaWMgU0VERG9jdW1lbnRBZGFwdGVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgeyAgICAgICAgICAgCi0gICAgdGhpcy5kb2N1bWVudCA9IChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgPyAoKElET01Nb2RlbCltb2RlbCkuZ2V0RG9jdW1lbnQoKSA6IG51bGw7ICAgICAKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMuZXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyID0gbmV3IEV4dGVuc2libGVOb2RlUmVjb25jaWxlcigpOwotICAgIG5ldyBNeURvY3VtZW50QWRhcHRlcihkb2N1bWVudCk7Ci0gIH0gIAotIAotCi0gIGNsYXNzIE15RG9jdW1lbnRBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRBZGFwdGVyCi0gIHsKLS8vICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGVmaW5pdGlvbiA9IHRydWU7Ci0gICAgCi0gICAgTXlEb2N1bWVudEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgewotICAgICAgc3VwZXIoZG9jdW1lbnQpOwotICAgIH0gICAKLSAgICAgICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpCi0gICAgICB7Ci0gICAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0KLSAgICAgICAgICAvLyBTZWUgQnVnIDUzNjYKLSAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN5bmMgdXAgdGhlIE1vZGVsIGFuZCB0aGUgRE9NCi0gICAgICAgICAgRWxlbWVudCBuZXdEb2N1bWVudEVsZW1lbnQgPSAoRWxlbWVudCluZXdWYWx1ZTsKLSAgICAgICAgICBTdHJpbmcgd3NkbFByZWZpeCA9IG5ld0RvY3VtZW50RWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgICBpZiAod3NkbFByZWZpeCA9PSBudWxsKSB3c2RsUHJlZml4ID0gIiI7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2Uod3NkbFByZWZpeCk7Ci0gICAgICAgICAgaWYgKG5zICE9IG51bGwgJiYgbnMuZXF1YWxzKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKQotICAgICAgICAgICAgICYmIG5ld0RvY3VtZW50RWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoV1NETENvbnN0YW50cy5ERUZJTklUSU9OX0VMRU1FTlRfVEFHKSkgLy8gJiYKLSAgICAgICAgICAgICAvLyAhaXNWYWxpZERlZmluaXRpb24pCi0gICAgICAgICAgewotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKiBTZXR0aW5nIG5ldyBkZWZpbml0aW9uIik7Ci0gICAgICAgICAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQobmV3RG9jdW1lbnRFbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgCi0gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHJlY29uY2lsaW5nIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYnkgb25lIG9mIHRoZXNlIG5vdGlmaWNhdGlvbnMgCi0gICAgICAgIC8vIChBREQgYW5kIFJFTU9WRSBub3RpZmljYXRpb25zIGFyZSBvbWl0dGVkKQotICAgICAgICAvLwotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFOiAKLSAgICAgICAgY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEOgotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEOgotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChub3RpZmllciBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVjb25jaWxlTW9kZWxPYmplY3RGb3JFbGVtZW50KChFbGVtZW50KW5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChub3RpZmllciBpbnN0YW5jZW9mIERvY3VtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KW5vdGlmaWVyOwotICAgICAgICAgICAgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCA9IG51bGw7ICAgICAgICAgIAotCi0gICAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgICAgICAgICBpZiAoV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShlbGVtZW50KSA9PSBXU0RMQ29uc3RhbnRzLkRFRklOSVRJT04pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQgPSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETy4uLiByZXZpc2l0IGRlZmluaXRpb24ucmVtb3ZlQWxsQ29udGVudCgpIGFuZCB3aG8gc2hvdWxkIGNhbGwgdGhpcz8KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICBpc1ZhbGlkRGVmaW5pdGlvbiA9IHRydWU7Ci0vLyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWQUxJRCBERUZJTklUSU9OIEVMRU1FTlQiKTsKLSAgICAgICAgICAgICAgKChEZWZpbml0aW9uSW1wbClkZWZpbml0aW9uKS5lbGVtZW50Q2hhbmdlZChkZWZpbml0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTlZBTElEIERFRklOSVRJT04gRUxFTUVOVCIpOwotLy8gICAgICAgICAgICAgIGlzVmFsaWREZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbENvbnRlbnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVNb2RlbE9iamVjdEZvckVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgZWxlbWVudCk7ICAKLSAgICAgIGlmIChtb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZWUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKW1vZGVsT2JqZWN0OwotICAgICAgICAgICgoWFNEU2NoZW1hSW1wbCllZS5nZXRTY2hlbWEoKSkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgICAgZWUuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7ICAgICAgICAgICAgCi0gICAgICAgIH0JCQotICAgICAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKW1vZGVsT2JqZWN0KS5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgICAgZXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyLm5vdGlmeUNoYW5nZWQobW9kZWxPYmplY3QsIGVsZW1lbnQsIGV2ZW50VHlwZSwgZmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7ICAgICAKLSAgICAgICAgfQotICAgICAgfSAJICAKLSAgICB9ICAgCi0gIH0KLSAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLy8gQW4gYWJzdHJhY3QgYWRhcHRlciB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgYSBuZXcgTm9kZSBhcmUgYWxzbyBhZGFwdGVkCi0gIC8vCi0gIGFic3RyYWN0IGNsYXNzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgewotICAgICAgKChJTm9kZU5vdGlmaWVyKWRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotCi0gICAgICBmb3IgKE5vZGUgY2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdCgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIAotICAgIHB1YmxpYyB2b2lkIGFkYXB0KEVsZW1lbnQgZWxlbWVudCkKLSAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKElOb2RlTm90aWZpZXIpZWxlbWVudCkuZ2V0RXhpc3RpbmdBZGFwdGVyKHRoaXMpID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgICgoSU5vZGVOb3RpZmllcillbGVtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotICAgICAgICAKLSAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBhZGFwdCgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSB0aGlzOwotICAgIH0KLSAgCi0gICAgYWJzdHJhY3QgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCk7ICAKLSAgfQotfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90ZXh0L1dTRExNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmMzYjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnR5cGVzeXN0ZW0uRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgV1NETE1vZGVsQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlcgotewotICBwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxBZGFwdGVyLmNsYXNzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKQotICB7Ci0gIH0KLQotICBwdWJsaWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uKEVsZW1lbnQgZWxlbWVudCkKLSAgeyAgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgSURPTU5vZGUgZG9tTm9kZSA9IChJRE9NTm9kZSllbGVtZW50OwotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsKLSAgICAgICAgICAKLSAgICAgIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgCi0gICAgICByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFdTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gVE9ETy4uIC5yZXZpc3QgdGhlIGJlc3QgYXBwcm9hY2ggdG8gb2J0YWluIGEgVVJJIGZyb20gdGhlIFNTRSBtb2RlbAotICAgICAgLy8KLSAgICAgIFVSSSB1cmkgPSBudWxsOwotICAgICAgaWYgKGJhc2VMb2NhdGlvbi5zdGFydHNXaXRoKCIvIikpCi0gICAgICB7Ci0gICAgICAgIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGJhc2VMb2NhdGlvbik7Ci0gICAgICB9ICAgICAgICAgICAgCi0gICAgICAKLSAgICAgIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgICAgZGVmaW5pdGlvbi5zZXREb2N1bWVudEJhc2VVUkkodXJpLnRvU3RyaW5nKCkpOwotICAgICAgZGVmaW5pdGlvbi5zZXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgCi0gICAgICBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCByZXNvdXJjZUZhY3RvcnkgPSBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKTsKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOyAgICAgICAKLSAgICAgIHJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRlZmluaXRpb24pOwotICAgICAgcmVzb3VyY2Uuc2V0TW9kaWZpZWQoZmFsc2UpOyAgICAKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsgICAgCi0gICAgICAgICAgICAgICAgIAotICAgICAgLy8gYXR0YWNoIGFuIGFkYXB0ZXIgdG8ga2VlcCB0aGUgV1NETCBtb2RlbCBhbmQgRE9NIGluIHN5bmMKLSAgICAgIC8vCi0gICAgICBuZXcgV1NETE1vZGVsUmVjb25jaWxlQWRhcHRlcihlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgZGVmaW5pdGlvbik7Ci0KLSAgICAgIC8vIFRPRE8uLi4gQ1MgOiByZXZpc2l0IHRoaXMgbGluZQotICAgICAgLy8gY3VycmVudGx5IHRoaXMgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSAndHlwZScgc3lzdGVtIHdpdGggdGhlIGRlZmluaXRpb24gICAgICAKLSAgICAgIC8vIEkgc3VzcGVjdCB0aGF0IHRoaXMgY291bGQgYmUgbWFkZSBhIHdob2xlIGxvdCBtb3JlIHNpbXBsZQotICAgICAgLy8KLSAgICAgIFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuc2V0VHlwZVN5c3RlbVByb3ZpZGVyKGRlZmluaXRpb24sIG5ldyBFeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyKCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETE1vZGVsUXVlcnlFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3RleHQvV1NETE1vZGVsUXVlcnlFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkM2ZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90ZXh0L1dTRExNb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5maWx0ZXIuRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC50ZXh0LlhTRE1vZGVsUXVlcnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdTRExNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGV4dGVuZHMgWFNETW9kZWxRdWVyeUV4dGVuc2lvbgotewotICBwdWJsaWMgV1NETE1vZGVsUXVlcnlFeHRlbnNpb24oKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcmVudEVsZW1lbnRNZXNzYWdlUmVmZXJlbmNlKFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSkKLSAgewotICAgIHJldHVybiBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImlucHV0IikgfHwgcGFyZW50RWxlbWVudE5hbWUuZXF1YWxzKCJvdXRwdXQiKSB8fCBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoImZhdWx0Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01lc3NhZ2VSZWZlcmVuY2UoU3RyaW5nIGVsZW1lbnROYW1lKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnROYW1lLmVxdWFscygiYm9keSIpIHx8IGVsZW1lbnROYW1lLmVxdWFscygiaGVhZGVyIikgfHwgZWxlbWVudE5hbWUuZXF1YWxzKCJmYXVsdCIpIHx8IGVsZW1lbnROYW1lLmVxdWFscygidXJsUmVwbGFjZW1lbnQiKSB8fCBlbGVtZW50TmFtZS5lcXVhbHMoInVybEVuY29kZWQiKTsKLSAgfQotCi0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGVDaGlsZEVsZW1lbnQoTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotICAgICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkgPSBwYXJlbnROb2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50Tm9kZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIC8vIG9ubHkgZmlsdGVyIGNoaWxkcmVuIGZvciAnbm9uLXNjaGVtYScgZWxlbWVudHMKLSAgICAgIC8vICAgICAgCi0gICAgICBpZiAoIVdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkuZXF1YWxzKHBhcmVudEVsZW1lbnROYW1lc3BhY2VVUkkpKQotICAgICAgewotICAgICAgICBpZiAocGFyZW50RWxlbWVudE5hbWUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBuYW1lc3BhY2UgYXJlIG9uZSB0aGF0IGFsd2F5cyBzaG91bGQgYmUgZmlsdGVyZWQgb3V0ICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBmb3Igbm93IHRoaXMgaXMgaGFyZGNvZGVkCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGV4Y2x1ZGUgc29hcC1lbmMgZWxlbWVudHMKLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChuYW1lc3BhY2UuZXF1YWxzKFdTRExDb25zdGFudHMuWFNEX05BTUVTUEFDRV9VUkkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBlY2xpcHNlIGFsbCBzY2hlbWEgZWxlbWVudHMsIGV4Y2VwdCBmb3IgJ3NjaGVtYScgd2l0aGluZyB3c2RsIHR5cGVzIGVsZW1lbnRzIAotICAgICAgICAgICAgICByZXN1bHQgPSBwYXJlbnRFbGVtZW50TmFtZS5lcXVhbHMoInR5cGVzIikgJiYgbmFtZS5lcXVhbHMoInNjaGVtYSIpOwotICAgICAgICAgICAgfSAgIAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBUT0RPLi4gd2Ugc2hvdWxkIGludmVzdGlnYXRlIHJlbW92aW5nIHRoZSAgRXh0ZW5zaWJsaXR5RWxlbWVudEZpbHRlciBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IHRoaXMgYmUgYSBNb2RlbFF1ZXJ5RXh0ZW5zaW9uIGRlZmluZWQgb24gdGhlIGV4dGVuc2lvbiBsYW5ndWFnZXM/Ci0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIgZmlsdGVyID0gKEV4dGVuc2libGl0eUVsZW1lbnRGaWx0ZXIpIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRFeHRlbnNpYmxpdHlFbGVtZW50RmlsdGVyUmVnaXN0cnkoKS5nZXQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmlsdGVyLmlzVmFsaWRDb250ZXh0KGVsZW1lbnQsIG5hbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0QXR0cmlidXRlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBpZiAoV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwobG9va3VwT3JDcmVhdGVEZWZpbml0aW9uKGVsZW1lbnQpKTsKLSAgICAgIFN0cmluZyBjdXJyZW50RWxlbWVudE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotICAgICAgTm9kZSBwYXJlbnROb2RlID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICBTdHJpbmcgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUgIT0gbnVsbCA/IHBhcmVudE5vZGUuZ2V0TG9jYWxOYW1lKCkgOiAiIjsKLSAgICAgIGlmIChjaGVja05hbWUobmFtZSwgIm1lc3NhZ2UiKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGRBbGwodXRpbC5nZXRNZXNzYWdlTmFtZXMoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgImJpbmRpbmciKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGRBbGwodXRpbC5nZXRCaW5kaW5nTmFtZXMoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgInR5cGUiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJiaW5kaW5nIikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldFBvcnRUeXBlTmFtZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY2hlY2tOYW1lKGN1cnJlbnRFbGVtZW50TmFtZSwgInBhcnQiKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkQWxsKHV0aWwuZ2V0Q29tcG9uZW50TmFtZUxpc3QodHJ1ZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGVja05hbWUobmFtZSwgImVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoZWNrTmFtZShjdXJyZW50RWxlbWVudE5hbWUsICJwYXJ0IikpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZEFsbCh1dGlsLmdldENvbXBvbmVudE5hbWVMaXN0KGZhbHNlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotICAgICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZVZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOwotICAgIH0KLSAgfQotCi0gIAotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGxvb2t1cE9yQ3JlYXRlU2NoZW1hRm9yRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgCi0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbG9va3VwT3JDcmVhdGVEZWZpbml0aW9uKGVsZW1lbnQpOwotICAgIE9iamVjdCBvID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KGRlZmluaXRpb24sIGVsZW1lbnQpOwotICAgIGlmIChvIGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgc2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgfSAKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0gIAotICAKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gbG9va3VwT3JDcmVhdGVEZWZpbml0aW9uKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKQotICAgIHsKLSAgICAgIElOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQ7Ci0gICAgICBXU0RMTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSAoV1NETE1vZGVsQWRhcHRlcikgbm90aWZpZXIuZ2V0QWRhcHRlckZvcihXU0RMTW9kZWxBZGFwdGVyLmNsYXNzKTsKLSAgICAgIGlmIChhZGFwdGVyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGFkYXB0ZXIgPSBuZXcgV1NETE1vZGVsQWRhcHRlcigpOwotICAgICAgICBub3RpZmllci5hZGRBZGFwdGVyKGFkYXB0ZXIpOwotICAgICAgICBhZGFwdGVyLmNyZWF0ZURlZmluaXRpb24oZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgfQotICAgICAgZGVmaW5pdGlvbiA9IGFkYXB0ZXIuZ2V0RGVmaW5pdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgCi0gIHByb3RlY3RlZCBUeXBlc0hlbHBlciBnZXRUeXBlc0hlbHBlcihmaW5hbCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBYU0RTY2hlbWEgc2NoZW1hID0gbG9va3VwT3JDcmVhdGVTY2hlbWFGb3JFbGVtZW50KGVsZW1lbnQpOwotICAgIHJldHVybiBuZXcgVHlwZXNIZWxwZXIoc2NoZW1hKQotICAgIHsKLSAgICAgIC8vIFRPRE8uLi4gaXQgc2VlbXMgYXMgdGhvdWdoIHRoZSBtb2RlbCBpcyBub3QgY29ycmVjdGx5Ci0gICAgICAvLyBtYWludGluZyB0aGUgbGlzdCBvZiBwcmVmaXhlcyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UKLSAgICAgIC8vIG11c3QgYmUgYSBidWchCi0gICAgICAvLwotICAgICAgcHJvdGVjdGVkIExpc3QgZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gc3VwZXIuZ2V0UHJlZml4ZXNGb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbG9va3VwT3JDcmVhdGVEZWZpbml0aW9uKGVsZW1lbnQpOwotICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICBNYXAgbWFwID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKSBtYXAuZ2V0KHByZWZpeCk7Ci0gICAgICAgICAgICBpZiAobnMgIT0gbnVsbCAmJiBucy5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFsaXN0LmNvbnRhaW5zKHByZWZpeCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChwcmVmaXgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgICAgfSAgICAgICAKLSAgICB9OyAgICAKLSAgfSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdGV4dC9XU0RMTW9kZWxSZWNvbmNpbGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90ZXh0L1dTRExNb2RlbFJlY29uY2lsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkZjFhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC90ZXh0L1dTRExNb2RlbFJlY29uY2lsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5yZWNvbmNpbGVyLkV4dGVuc2libGVOb2RlUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotY2xhc3MgV1NETE1vZGVsUmVjb25jaWxlQWRhcHRlciBleHRlbmRzIERvY3VtZW50QWRhcHRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247ICAgCi0gIHByb3RlY3RlZCBFeHRlbnNpYmxlTm9kZVJlY29uY2lsZXIgZXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyOwotCi0gIHB1YmxpYyBXU0RMTW9kZWxSZWNvbmNpbGVBZGFwdGVyKERvY3VtZW50IGRvY3VtZW50LCBEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsgICAgICAgICAgIAotICAgIHN1cGVyKGRvY3VtZW50KTsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMuZXh0ZW5zaWJsZU5vZGVSZWNvbmNpbGVyID0gbmV3IEV4dGVuc2libGVOb2RlUmVjb25jaWxlcigpOwotICB9IAotICAgCi0gICAgIAotICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREKQotICAgIHsKLSAgICAgIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIGFkYXB0KChFbGVtZW50KW5ld1ZhbHVlKTsKLQotICAgICAgICAvLyBTZWUgQnVnIDUzNjYKLSAgICAgICAgLy8gV2UgbmVlZCB0byBzeW5jIHVwIHRoZSBNb2RlbCBhbmQgdGhlIERPTQotICAgICAgICBFbGVtZW50IG5ld0RvY3VtZW50RWxlbWVudCA9IChFbGVtZW50KW5ld1ZhbHVlOwotICAgICAgICBTdHJpbmcgd3NkbFByZWZpeCA9IG5ld0RvY3VtZW50RWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgICAgaWYgKHdzZGxQcmVmaXggPT0gbnVsbCkgd3NkbFByZWZpeCA9ICIiOwotICAgICAgICBTdHJpbmcgbnMgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZSh3c2RsUHJlZml4KTsKLSAgICAgICAgaWYgKG5zICE9IG51bGwgJiYgbnMuZXF1YWxzKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKQotICAgICAgICAgICAmJiBuZXdEb2N1bWVudEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFdTRExDb25zdGFudHMuREVGSU5JVElPTl9FTEVNRU5UX1RBRykpIC8vICYmCi0gICAgICAgICAgIC8vICFpc1ZhbGlkRGVmaW5pdGlvbikKLSAgICAgICAgewotLy8gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiogU2V0dGluZyBuZXcgZGVmaW5pdGlvbiIpOwotICAgICAgICAgIGRlZmluaXRpb24uc2V0RWxlbWVudChuZXdEb2N1bWVudEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotCi0gICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgeyAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gd2UgbWFrZSB0aGUgYXNzdW1wdGlvbiB0aGF0IHJlY29uY2lsaW5nIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYnkgb25lIG9mIHRoZXNlIG5vdGlmaWNhdGlvbnMgCi0gICAgICAvLyAoQUREIGFuZCBSRU1PVkUgbm90aWZpY2F0aW9ucyBhcmUgb21pdHRlZCkKLSAgICAgIC8vCi0gICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFOiAKLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRDoKLSAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQ6Ci0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgcmVjb25jaWxlTW9kZWxPYmplY3RGb3JFbGVtZW50KChFbGVtZW50KW5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgRG9jdW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IChEb2N1bWVudClub3RpZmllcjsKLSAgICAgICAgICBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50ID0gbnVsbDsgICAgICAgICAgCi0KLSAgICAgICAgICBmb3IgKE5vZGUgbm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICAgICAgICAgIGlmIChXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGVsZW1lbnQpID09IFdTRExDb25zdGFudHMuREVGSU5JVElPTikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlZmluaXRpb25FbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgIAotICAgICAgICAgIC8vIFRPRE8uLi4gcmV2aXNpdCBkZWZpbml0aW9uLnJlbW92ZUFsbENvbnRlbnQoKSBhbmQgd2hvIHNob3VsZCBjYWxsIHRoaXM/Ci0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAoZGVmaW5pdGlvbkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlzVmFsaWREZWZpbml0aW9uID0gdHJ1ZTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWQUxJRCBERUZJTklUSU9OIEVMRU1FTlQiKTsKLSAgICAgICAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikuZWxlbWVudENoYW5nZWQoZGVmaW5pdGlvbkVsZW1lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklOVkFMSUQgREVGSU5JVElPTiBFTEVNRU5UIik7Ci0vLyAgICAgICAgICAgIGlzVmFsaWREZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgICAgICAgICAoKERlZmluaXRpb25JbXBsKWRlZmluaXRpb24pLnJlbW92ZUFsbCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAKLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbENvbnRlbnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgcmVjb25jaWxlTW9kZWxPYmplY3RGb3JFbGVtZW50KEVsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgZWxlbWVudCk7ICAKLSAgICBpZiAobW9kZWxPYmplY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBlZSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpbW9kZWxPYmplY3Q7Ci0gICAgICAgICgoWFNEU2NoZW1hSW1wbCllZS5nZXRTY2hlbWEoKSkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICAgIGVlLmVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQpOyAgICAgICAgICAgIAotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudEltcGwpCi0gICAgICB7Ci0gICAgICAgICgoV1NETEVsZW1lbnRJbXBsKW1vZGVsT2JqZWN0KS5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgICB7Ci0gICAgICAgICgoWFNEQ29uY3JldGVDb21wb25lbnQpbW9kZWxPYmplY3QpLmVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQpOwotICAgICAgICBleHRlbnNpYmxlTm9kZVJlY29uY2lsZXIubm90aWZ5Q2hhbmdlZChtb2RlbE9iamVjdCwgZWxlbWVudCwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsgICAgIAotICAgICAgfQotICAgIH0gICAgIAotICB9ICAgCi19Ci0KLQotYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnRBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyCi17Ci0gIERvY3VtZW50IGRvY3VtZW50OwotICAKLSAgcHVibGljIERvY3VtZW50QWRhcHRlcihEb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgICAoKElOb2RlTm90aWZpZXIpZG9jdW1lbnQpLmFkZEFkYXB0ZXIodGhpcyk7Ci0gICAgYWRhcHQoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRhcHQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKCgoSU5vZGVOb3RpZmllcillbGVtZW50KS5nZXRFeGlzdGluZ0FkYXB0ZXIodGhpcykgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAoKElOb2RlTm90aWZpZXIpZWxlbWVudCkuYWRkQWRhcHRlcih0aGlzKTsKLQotICAgICAgZm9yIChOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICBhZGFwdCgoRWxlbWVudCljaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIHR5cGUgPT0gdGhpczsKLSAgfQotCi0gIGFic3RyYWN0IHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQKLSAgICAoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3R5cGVzeXN0ZW0vRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdHlwZXN5c3RlbS9FeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmM1NGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdHlwZXN5c3RlbS9FeHRlbnNpYmxlVHlwZVN5c3RlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnR5cGVzeXN0ZW07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVUeXBlU3lzdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVHlwZVN5c3RlbVByb3ZpZGVyCi17Ci0gIHByb3RlY3RlZCBXU0RMRWRpdG9yRXh0ZW5zaW9uW10gZXh0ZW5zaW9uczsKLSAgcHJvdGVjdGVkIElUeXBlU3lzdGVtUHJvdmlkZXJbXSB0eXBlU3lzdGVtUHJvdmlkZXJzOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSB7fTsKLQotICBwdWJsaWMgRXh0ZW5zaWJsZVR5cGVTeXN0ZW1Qcm92aWRlcigpCi0gIHsKLSAgICBXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5KCk7IAotCi0gICAgZXh0ZW5zaW9ucyA9IHJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRFeHRlbnNpb25zKFdTRExFZGl0b3JFeHRlbnNpb24uVFlQRV9TWVNURU1fUFJPVklERVIpOyAKLSAgICB0eXBlU3lzdGVtUHJvdmlkZXJzID0gbmV3IElUeXBlU3lzdGVtUHJvdmlkZXJbZXh0ZW5zaW9ucy5sZW5ndGhdOyAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgdHlwZVN5c3RlbVByb3ZpZGVyc1tpXSA9IChJVHlwZVN5c3RlbVByb3ZpZGVyKWV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uVFlQRV9TWVNURU1fUFJPVklERVIsIG51bGwpOwotICAgIH0KLSAgfSAgICAgICAgICAKLSAgICAgICAgCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVR5cGVOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIGludCB0eXBlTmFtZUNhdGVnb3J5KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVN5c3RlbVByb3ZpZGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldEF2YWlsYWJsZVR5cGVOYW1lcyhkZWZpbml0aW9uLCB0eXBlTmFtZUNhdGVnb3J5KSk7Ci0gICAgfSAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUeXBlcyhEZWZpbml0aW9uIGRlZmluaXRpb24sIFhTRFNjaGVtYSBzY2hlbWEsIGludCB0eXBlTmFtZUNhdGVnb3J5KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVN5c3RlbVByb3ZpZGVycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldEF2YWlsYWJsZVR5cGVzKGRlZmluaXRpb24sIHNjaGVtYSwgdHlwZU5hbWVDYXRlZ29yeSkpOwotICAgIH0gICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUVsZW1lbnROYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU3lzdGVtUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGxpc3QuYWRkQWxsKHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0QXZhaWxhYmxlRWxlbWVudE5hbWVzKGRlZmluaXRpb24pKTsKLSAgICB9ICAgICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Q2F0ZWdvcnlGb3JUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIGludCByZXN1bHQgPSBVTktOT1dOX1RZUEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlU3lzdGVtUHJvdmlkZXJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHR5cGVTeXN0ZW1Qcm92aWRlcnNbaV0uZ2V0Q2F0ZWdvcnlGb3JUeXBlTmFtZShkZWZpbml0aW9uLCB0eXBlTmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IFVOS05PV05fVFlQRSkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKSB7Ci0gIAkgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVTeXN0ZW1Qcm92aWRlcnMubGVuZ3RoOyBpKyspCi0gICAgIHsKLSAgICAgICBsaXN0LmFkZEFsbCh0eXBlU3lzdGVtUHJvdmlkZXJzW2ldLmdldFByZWZpeGVkTmFtZXMoZGVmaW5pdGlvbiwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpKTsKLSAgICAgfSAgICAgCi0gICAgIHJldHVybiBsaXN0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9Db21wb25lbnRSZWZlcmVuY2VVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudFJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNTFhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NvbXBvbmVudFJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5JbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JVHlwZVN5c3RlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENvbXBvbmVudFJlZmVyZW5jZVV0aWwKLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gcm9vdERlZmluaXRpb247Ci0KLSAgcHVibGljIENvbXBvbmVudFJlZmVyZW5jZVV0aWwoRGVmaW5pdGlvbiByb290RGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMucm9vdERlZmluaXRpb24gPSByb290RGVmaW5pdGlvbjsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0VxdWFsKFN0cmluZyBhLCBTdHJpbmcgYikKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKGEgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBhLmVxdWFscyhiKSB8fCAoYS5sZW5ndGgoKSA9PSAwICYmIGIgPT0gbnVsbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoYiA9PSBudWxsIHx8IGIubGVuZ3RoKCkgPT0gMCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNFcXVhbElucHV0TmFtZShPcGVyYXRpb24gb3BlcmF0aW9uLCBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIElucHV0IG9wZXJhdGlvbklucHV0ID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpOwotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nT3BlcmF0aW9uSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKTsKLQotICAgIGlmIChvcGVyYXRpb25JbnB1dCAhPSBudWxsICYmIGJpbmRpbmdPcGVyYXRpb25JbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzRXF1YWwob3BlcmF0aW9uSW5wdXQuZ2V0TmFtZSgpLCBiaW5kaW5nT3BlcmF0aW9uSW5wdXQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob3BlcmF0aW9uSW5wdXQgPT0gbnVsbCAmJiBiaW5kaW5nT3BlcmF0aW9uSW5wdXQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRXF1YWxPdXRwdXROYW1lKE9wZXJhdGlvbiBvcGVyYXRpb24sIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgT3V0cHV0IG9wZXJhdGlvbk91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3BlcmF0aW9uT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpOwotCi0gICAgaWYgKG9wZXJhdGlvbk91dHB1dCAhPSBudWxsICYmIGJpbmRpbmdPcGVyYXRpb25PdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpc0VxdWFsKG9wZXJhdGlvbk91dHB1dC5nZXROYW1lKCksIGJpbmRpbmdPcGVyYXRpb25PdXRwdXQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAob3BlcmF0aW9uT3V0cHV0ID09IG51bGwgJiYgYmluZGluZ09wZXJhdGlvbk91dHB1dCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ0JpbmRpbmcoT3BlcmF0aW9uIG9wZXJhdGlvbiwgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIGlzRXF1YWwob3BlcmF0aW9uLmdldE5hbWUoKSwgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpICYmIGlzRXF1YWxJbnB1dE5hbWUob3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uKSAmJiBpc0VxdWFsT3V0cHV0TmFtZShvcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb24pOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UG9ydHNGb3JQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGoubmV4dCgpOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwgJiYgYmluZGluZy5nZXRFUG9ydFR5cGUoKSA9PSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHBvcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0UG9ydHNGb3JCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRTZXJ2aWNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGoubmV4dCgpOwotICAgICAgICBpZiAocG9ydC5nZXRFQmluZGluZygpID09IGJpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChwb3J0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdPcGVyYXRpb25zKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBvcGVyYXRpb24uZ2V0TmFtZSgpOwotCi0gICAgaWYgKG9wZXJhdGlvbk5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGdldEVuY2xvc2luZ1BvcnRUeXBlKG9wZXJhdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCaW5kaW5ncyhwb3J0VHlwZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uLCBiaW5kaW5nKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gZ2V0QmluZGluZ09wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uLCBCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgai5uZXh0KCk7Ci0gICAgICBpZiAoaXNNYXRjaGluZ0JpbmRpbmcob3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gYmluZGluZ09wZXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0lucHV0IGdldEJpbmRpbmdJbnB1dChJbnB1dCBpbnB1dCwgQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbigoT3BlcmF0aW9uKSBpbnB1dC5lQ29udGFpbmVyKCksIGJpbmRpbmcpOwotICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uICE9IG51bGwgPyBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRCaW5kaW5nT3V0cHV0KE91dHB1dCBvdXRwdXQsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oKE9wZXJhdGlvbikgb3V0cHV0LmVDb250YWluZXIoKSwgYmluZGluZyk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCA/IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgQmluZGluZ0ZhdWx0IGdldEJpbmRpbmdGYXVsdChGYXVsdCBmYXVsdCwgQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgQmluZGluZ0ZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICBpZiAoZmF1bHROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZ2V0QmluZGluZ09wZXJhdGlvbigoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCksIGJpbmRpbmcpOwotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEJpbmRpbmdGYXVsdCkgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHQoZmF1bHROYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBFT2JqZWN0IGdldEJpbmRpbmdPYmplY3QoRU9iamVjdCBpbnRlcmZhY2VPYmplY3QsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEVPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0QmluZGluZ0lucHV0KChJbnB1dCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEJpbmRpbmdPdXRwdXQoKE91dHB1dCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgRmF1bHQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0QmluZGluZ0ZhdWx0KChGYXVsdCkgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEJpbmRpbmdPcGVyYXRpb24oKE9wZXJhdGlvbikgaW50ZXJmYWNlT2JqZWN0LCBiaW5kaW5nKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW50ZXJmYWNlT2JqZWN0IGluc3RhbmNlb2YgUG9ydFR5cGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gYmluZGluZzsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdJbnB1dHMoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBvcGVyYXRpb25zID0gZ2V0QmluZGluZ09wZXJhdGlvbnMoKE9wZXJhdGlvbikgaW5wdXQuZUNvbnRhaW5lcigpKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nT3V0cHV0cyhPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvdXRwdXQuZUNvbnRhaW5lcigpOwotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IG9wZXJhdGlvbnMgPSBnZXRCaW5kaW5nT3BlcmF0aW9ucyhvcGVyYXRpb24pOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nRmF1bHRzKEZhdWx0IGZhdWx0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIFN0cmluZyBmYXVsdE5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0gICAgaWYgKGZhdWx0TmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBmYXVsdC5lQ29udGFpbmVyKCk7Ci0gICAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IGdldEJpbmRpbmdPcGVyYXRpb25zKG9wZXJhdGlvbik7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdGYXVsdChmYXVsdE5hbWUpOwotICAgICAgICAgIGlmIChiaW5kaW5nRmF1bHQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LmFkZChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBnZXRFbmNsb3NpbmdQb3J0VHlwZShPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIChQb3J0VHlwZSkgb3BlcmF0aW9uLmVDb250YWluZXIoKTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdzKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICByZXR1cm4gZ2V0QmluZGluZ3MoZ2V0RW5jbG9zaW5nUG9ydFR5cGUob3BlcmF0aW9uKSk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5ncyhQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBkZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgai5uZXh0KCk7Ci0gICAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsIHx8IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSA9PSBwb3J0VHlwZSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKGJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ3NXaXRob3V0T3BlcmF0aW9uKFBvcnRUeXBlIHBvcnRUeXBlLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKHBvcnRUeXBlKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGkubmV4dCgpOwotICAgICAgICBib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBqLm5leHQoKTsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZS5lcXVhbHMoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhhc05hbWUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghaGFzTmFtZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hZGQoYmluZGluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEJpbmRpbmdzKCkKLSAgewotICAgIHJldHVybiBnZXRCaW5kaW5ncygoUG9ydFR5cGUpIG51bGwpOwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0QmluZGluZ05hbWVzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKGJpbmRpbmcuZ2V0UU5hbWUoKSkpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFBvcnRUeXBlTmFtZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgai5uZXh0KCk7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGdldFByZWZpeGVkTmFtZXMocG9ydFR5cGUuZ2V0UU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFNlcnZpY2VzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXREZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgaS5uZXh0KCk7Ci0gICAgICBsaXN0LmFkZEFsbChkZWZpbml0aW9uLmdldEVTZXJ2aWNlcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRQb3J0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSk7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgZ2V0VHlwZXMoKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgIGlmIChkZWZpbml0aW9uLmdldEVUeXBlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldE1lc3NhZ2VOYW1lcygpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gZGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGoubmV4dCgpOwotICAgICAgICBsaXN0LmFkZEFsbChnZXRQcmVmaXhlZE5hbWVzKG1lc3NhZ2UuZ2V0UU5hbWUoKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldERlZmluaXRpb25zKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBhZGREZWZpbml0aW9uKHJvb3REZWZpbml0aW9uLCBsaXN0KTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAtLSB3ZSBzaG91bGQgYWx3YXlzIHVzZSBnZXRQcmVmaXhlZE5hbWVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeGVkTmFtZShRTmFtZSBxbmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gcm9vdERlZmluaXRpb24uZ2V0UHJlZml4KHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IHByZWZpeCArICI6IiArIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoUU5hbWUgcW5hbWUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHJvb3REZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChTdHJpbmcpIG1hcC5nZXQocHJlZml4KTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmIG5hbWVzcGFjZS5lcXVhbHMocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gcHJlZml4ICsgIjoiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkgOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHFuYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICAgIGxpc3QuYWRkKG5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkRGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIExpc3QgbGlzdCkKLSAgewotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoZGVmaW5pdGlvbik7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBJbXBvcnRJbXBsIHRoZUltcG9ydCA9IChJbXBvcnRJbXBsKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKHRoZUltcG9ydC5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwgJiYgIXRoZUltcG9ydC5nZXRMb2NhdGlvblVSSSgpLmVuZHNXaXRoKCJ4c2QiKSkKLSAgICAgICAgewotICAgICAgICAgIHRoZUltcG9ydC5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsJIAotICAgICAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gKERlZmluaXRpb24pIHRoZUltcG9ydC5nZXRFRGVmaW5pdGlvbigpOwotICAgICAgICAgIGlmIChpbXBvcnRlZERlZmluaXRpb24gIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhpbXBvcnRlZERlZmluaXRpb24pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZERlZmluaXRpb24oaW1wb3J0ZWREZWZpbml0aW9uLCBsaXN0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0VHlwZVJlZmVyZW5jZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBvcnRUeXBlUmVmZXJlbmNlKEJpbmRpbmcgYmluZGluZywgU3RyaW5nIHBvcnRUeXBlKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGJpbmRpbmcpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInR5cGUiLCBwb3J0VHlwZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QmluZGluZ1JlZmVyZW5jZShQb3J0IHBvcnQpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocG9ydCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiYmluZGluZyIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoYmluZGluZyk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRQb3J0VHlwZVJlZmVyZW5jZVFOYW1lKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIFFOYW1lIHJlc3VsdCA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gYmluZGluZy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIHByZWZpeGVkTmFtZSA9IGdldFBvcnRUeXBlUmVmZXJlbmNlKGJpbmRpbmcpOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yVXRpbC5jcmVhdGVRTmFtZShkZWZpbml0aW9uLCBwcmVmaXhlZE5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRCaW5kaW5nUmVmZXJlbmNlUU5hbWUoUG9ydCBwb3J0KQotICB7Ci0gICAgUU5hbWUgcmVzdWx0ID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBwb3J0LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0QmluZGluZ1JlZmVyZW5jZShwb3J0KTsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclV0aWwuY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgcHJlZml4ZWROYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZWZlcmVuY2UoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihpbnB1dCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlUmVmZXJlbmNlKE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlZmVyZW5jZShGYXVsdCBmYXVsdCkKLSAgewotICAgIHJldHVybiBnZXRNZXNzYWdlUmVmZXJlbmNlSGVscGVyKGZhdWx0KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUU5hbWUgZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKElucHV0IGlucHV0KQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihpbnB1dCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZShPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBnZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWUoRmF1bHQgZmF1bHQpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lSGVscGVyKGZhdWx0KTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VSZWZlcmVuY2VIZWxwZXIoV1NETEVsZW1lbnQgbykKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvKTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJtZXNzYWdlIik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFFOYW1lIGdldE1lc3NhZ2VSZWZlcmVuY2VRTmFtZUhlbHBlcihXU0RMRWxlbWVudCBvKQotICB7Ci0gICAgUU5hbWUgcmVzdWx0ID0gbnVsbDsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBvLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBTdHJpbmcgcHJlZml4ZWROYW1lID0gZ2V0TWVzc2FnZVJlZmVyZW5jZUhlbHBlcihvKTsKLSAgICBpZiAocHJlZml4ZWROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclV0aWwuY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgcHJlZml4ZWROYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVQb3J0VHlwZVJlZmVyZW5jZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UG9ydFR5cGVSZWZlcmVuY2VRTmFtZShiaW5kaW5nKTsKLQotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAocW5hbWUgIT0gbnVsbCkgPyAoUG9ydFR5cGUpIGRlZmluaXRpb24uZ2V0UG9ydFR5cGUocW5hbWUpIDogbnVsbDsKLQotICAgICAgaWYgKGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSAhPSBwb3J0VHlwZSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5zZXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUJpbmRpbmdSZWZlcmVuY2VzKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGkubmV4dCgpOwotICAgICAgZm9yIChJdGVyYXRvciBqID0gc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBqLm5leHQoKTsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldEJpbmRpbmdSZWZlcmVuY2VRTmFtZShwb3J0KTsKLQotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAocW5hbWUgIT0gbnVsbCkgPyAoQmluZGluZykgZGVmaW5pdGlvbi5nZXRCaW5kaW5nKHFuYW1lKSA6IG51bGw7Ci0KLSAgICAgICAgaWYgKHBvcnQuZ2V0QmluZGluZygpICE9IGJpbmRpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICBwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlTWVzc2FnZVJlZmVyZW5jZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgLy8gZm9yIGVhY2ggcG9ydCB0eXBlCi0gICAgLy8KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldFBvcnRUeXBlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgaS5uZXh0KCk7Ci0KLSAgICAgIC8vIGZvciBlYWNoIG9wZXJhdGlvbgotICAgICAgLy8KLSAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgai5uZXh0KCk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIElucHV0Ci0gICAgICAgIC8vCi0gICAgICAgIElucHV0IGlucHV0ID0gKElucHV0KSBvcGVyYXRpb24uZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKGlucHV0KTsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAocW5hbWUgIT0gbnVsbCkgPyAoTWVzc2FnZSkgZGVmaW5pdGlvbi5nZXRNZXNzYWdlKHFuYW1lKSA6IG51bGw7Ci0gICAgICAgICAgaWYgKGlucHV0LmdldE1lc3NhZ2UoKSAhPSBtZXNzYWdlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIE91dHB1dAotICAgICAgICAvLwotICAgICAgICBPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCkgb3BlcmF0aW9uLmdldE91dHB1dCgpOwotICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxbmFtZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0TWVzc2FnZVJlZmVyZW5jZVFOYW1lKG91dHB1dCk7Ci0gICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKHFuYW1lICE9IG51bGwpID8gKE1lc3NhZ2UpIGRlZmluaXRpb24uZ2V0TWVzc2FnZShxbmFtZSkgOiBudWxsOwotICAgICAgICAgIGlmIChvdXRwdXQuZ2V0TWVzc2FnZSgpICE9IG1lc3NhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaGFuZGxlIEZhdWx0cwotICAgICAgICAvLwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGsgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGsuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBrLm5leHQoKTsKLQotICAgICAgICAgIFFOYW1lIHFuYW1lID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRNZXNzYWdlUmVmZXJlbmNlUU5hbWUoZmF1bHQpOwotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChxbmFtZSAhPSBudWxsKSA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UocW5hbWUpIDogbnVsbDsKLSAgICAgICAgICBpZiAoZmF1bHQuZ2V0TWVzc2FnZSgpICE9IG1lc3NhZ2UpCi0gICAgICAgICAgewotICAgICAgICAgICAgZmF1bHQuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlU2NoZW1hUmVmZXJlbmNlcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgaS5uZXh0KCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGogPSBtZXNzYWdlLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGoubmV4dCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocGFydCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAoKFdTRExFbGVtZW50SW1wbClwYXJ0KS5lbGVtZW50Q2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uIGdldE9wZXJhdGlvbihQb3J0VHlwZSBwb3J0VHlwZSwgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGkubmV4dCgpOwotICAgICAgaWYgKGlzTWF0Y2hpbmdCaW5kaW5nKG9wZXJhdGlvbiwgYmluZGluZ09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG9wZXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlT3BlcmF0aW9uUmVmZXJlbmNlKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb21wdXRlT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotICAgIGlmIChvcGVyYXRpb24gIT0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKSkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KGJvb2xlYW4gaXNUeXBlKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICAgIElUeXBlU3lzdGVtUHJvdmlkZXIgdHlwZVN5c3RlbVByb3ZpZGVyID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlU3lzdGVtUHJvdmlkZXIocm9vdERlZmluaXRpb24pOwotICAgIGlmICh0eXBlU3lzdGVtUHJvdmlkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpc1R5cGUgPyB0eXBlU3lzdGVtUHJvdmlkZXIuZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKHJvb3REZWZpbml0aW9uLCAwKSA6IHR5cGVTeXN0ZW1Qcm92aWRlci5nZXRBdmFpbGFibGVFbGVtZW50TmFtZXMocm9vdERlZmluaXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KFBhcnQgcGFydCwgYm9vbGVhbiBpc1R5cGUpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgSVR5cGVTeXN0ZW1Qcm92aWRlciB0eXBlU3lzdGVtUHJvdmlkZXIgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVTeXN0ZW1Qcm92aWRlcihkZWZpbml0aW9uKTsKLSAgICBpZiAodHlwZVN5c3RlbVByb3ZpZGVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNUeXBlID8gdHlwZVN5c3RlbVByb3ZpZGVyLmdldEF2YWlsYWJsZVR5cGVOYW1lcyhkZWZpbml0aW9uLCAwKSA6IHR5cGVTeXN0ZW1Qcm92aWRlci5nZXRBdmFpbGFibGVFbGVtZW50TmFtZXMoZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUeXBlKFBhcnQgcGFydCkKLSAgewotICAgIC8vRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHBhcnQpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IHBhcnQuZ2V0RWxlbWVudCgpOwotICAgIHJldHVybiAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcnRDb21wb25lbnRSZWZlcmVuY2UoUGFydCBwYXJ0KQotICB7Ci0gICAgLy9FbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QocGFydCk7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gcGFydC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgewotICAgICAgcmVzdWx0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBvbmVudFJlZmVyZW5jZShQYXJ0IHBhcnQsIGJvb2xlYW4gaXNUeXBlLCBTdHJpbmcgY29tcG9uZW50TmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwYXJ0KTsKLSAgICBTdHJpbmcgbmV3QXR0cmlidXRlID0gaXNUeXBlID8gInR5cGUiIDogImVsZW1lbnQiOwotICAgIFN0cmluZyBvbGRBdHRyaWJ1dGUgPSBpc1R5cGUgPyAiZWxlbWVudCIgOiAidHlwZSI7Ci0gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUob2xkQXR0cmlidXRlKTsKLQotICAgIFN0cmluZyB2YWx1ZSA9IGNvbXBvbmVudE5hbWUgIT0gbnVsbCA/IGNvbXBvbmVudE5hbWUgOiBlbGVtZW50LmdldEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUpOwotCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGlzVHlwZSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHhzZFByZWZpeCA9IHBhcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldFByZWZpeChXU0RMQ29uc3RhbnRzLlhTRF9OQU1FU1BBQ0VfVVJJKTsKLSAgICAgICAgdmFsdWUgPSAic3RyaW5nIjsKLSAgICAgICAgaWYgKHhzZFByZWZpeCAhPSBudWxsICYmIHhzZFByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IHhzZFByZWZpeCArICI6IiArIHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IGdldENvbXBvbmVudE5hbWVMaXN0KHBhcnQsIGlzVHlwZSk7Ci0gICAgICAgIHZhbHVlID0gbGlzdC5zaXplKCkgPiAwID8gKFN0cmluZykgbGlzdC5nZXQoMCkgOiAic29tZS1lbGVtZW50LW5hbWUiOwotICAgICAgfQotICAgIH0KLSAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuZXdBdHRyaWJ1dGUsIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uIGNvbXB1dGVPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgT3BlcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdPcGVyYXRpb24uZUNvbnRhaW5lcigpOwotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKSBiaW5kaW5nLmdldFBvcnRUeXBlKCk7Ci0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0T3BlcmF0aW9uKHBvcnRUeXBlLCBiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSW5wdXQgY29tcHV0ZUlucHV0KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gY29tcHV0ZU9wZXJhdGlvbigoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ0lucHV0LmVDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbiAhPSBudWxsID8gb3BlcmF0aW9uLmdldEVJbnB1dCgpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgT3V0cHV0IGNvbXB1dGVPdXRwdXQoQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0KQotICB7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGNvbXB1dGVPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPdXRwdXQuZUNvbnRhaW5lcigpKTsKLSAgICByZXR1cm4gb3BlcmF0aW9uICE9IG51bGwgPyBvcGVyYXRpb24uZ2V0RU91dHB1dCgpIDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgRmF1bHQgY29tcHV0ZUZhdWx0KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gIHsKLSAgICBGYXVsdCByZXN1bHQgPSBudWxsOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBjb21wdXRlT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nRmF1bHQuZUNvbnRhaW5lcigpKTsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEZhdWx0IGZhdWx0ID0gKEZhdWx0KSBpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKGZhdWx0TmFtZSAhPSBudWxsICYmIGZhdWx0TmFtZS5lcXVhbHMoYmluZGluZ0ZhdWx0LmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBmYXVsdDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFydFJlZmVyZW5jZVZhbHVlKFBhcnQgcGFydCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChwYXJ0KTsKLSAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0eXBlIikpCi0gICAgICB7ICAgICAgCQkKLSAgICAgICAgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoImVsZW1lbnQiKSkKLSAgICAgIHsgIAotICAgICAgICB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJlbGVtZW50Iik7Ci0gICAgICB9ICAgICAgICAgCi0gICAgfSAgCi0gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICIiOwotICB9Ci0KLSAgcHVibGljIE9wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLSAgICBOb2RlIHBhcmVudCA9IGJpbmRpbmdPcGVyYXRpb25Db250ZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KHJvb3REZWZpbml0aW9uLCAoRWxlbWVudCkgcGFyZW50KTsKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKQotICAgICAgewotICAgICAgICBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24pIG9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvcGVyYXRpb247Ci0gIH0KLQotICBwdWJsaWMgTWVzc2FnZSBnZXRCaW5kaW5nT3BlcmF0aW9uSW5wdXRNZXNzYWdlKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpCi0gIHsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBnZXRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb25Db250ZW50KTsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgcHVibGljIE1lc3NhZ2UgZ2V0QmluZGluZ09wZXJhdGlvbk91dHB1dE1lc3NhZ2UoRWxlbWVudCBiaW5kaW5nT3BlcmF0aW9uQ29udGVudCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGdldEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbkNvbnRlbnQpOwotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsKLSAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZSA9IG91dHB1dC5nZXRFTWVzc2FnZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVSZWxhdGl2ZVVSSShJRmlsZSByZWZlcmVuY2VkTG9jYXRpb24sIElGaWxlIGJhc2VMb2NhdGlvbiwgYm9vbGVhbiBlbmFibGVJRVN0eWxlUmVmZXJlbmNlcykKLSAgewotICAgIC8vIFRPRE8uLi4gd2UgbmVlZCBzb21lIGV4dGVuc2lvbiB0byBhbGxvdyBJRSBmb2xrcyB0byBwbHVnaW4gbG9naWMgdG8gY3JlYXRlIGFuICdJRScgc3R5bGUgcGF0aAotICAgIC8vIFRPRE8uLi4gY29uc2lkZXIgdXNpbmcgVVJJIGNsYXNzIGluIEVNRiAKLSAgICByZXR1cm4gVVJJSGVscGVyLmdldFJlbGF0aXZlVVJJKHJlZmVyZW5jZWRMb2NhdGlvbi5nZXRMb2NhdGlvbigpLCBiYXNlTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVSZWxhdGl2ZVVSSShTdHJpbmcgcmVmZXJlbmNlZExvY2F0aW9uLCBTdHJpbmcgYmFzZUxvY2F0aW9uLCBib29sZWFuIGVuYWJsZUlFU3R5bGVSZWZlcmVuY2VzKQotICB7Ci0gICAgLy8gVE9ETy4uLiB3ZSBuZWVkIHNvbWUgZXh0ZW5zaW9uIHRvIGFsbG93IElFIGZvbGtzIHRvIHBsdWdpbiBsb2dpYyB0byBjcmVhdGUgYW4gJ0lFJyBzdHlsZSBwYXRoCi0gICAgLy8gVE9ETy4uLiBjb25zaWRlciB1c2luZyBVUkkgY2xhc3MgaW4gRU1GIAotICAgIHJldHVybiBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkocmVmZXJlbmNlZExvY2F0aW9uLCBiYXNlTG9jYXRpb24pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NyZWF0ZVdTRExFbGVtZW50SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL0NyZWF0ZVdTRExFbGVtZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OWQ0MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9DcmVhdGVXU0RMRWxlbWVudEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VSZWZlcmVuY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZEJpbmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZEZhdWx0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRJbnB1dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkTWVzc2FnZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29tbWFuZHMuQWRkT3BlcmF0aW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRPdXRwdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFBhcnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFBvcnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFBvcnRUeXBlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRTZXJ2aWNlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVXU0RMRWxlbWVudEhlbHBlciB7Ci0JLy8gQ29uc3RhbnRzIHVzZWQgZm9yIGdldHRpbmcgUGFydCBpbmZvcm1hdGlvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfSU5GT19FTEVNRU5UX0RFQ0xBUkFUSU9OID0gIkVMRU1FTlRfREVDTEFSQVRJT04iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfSU5GT19UWVBFX0RFRklOSVRJT04gICAgID0gIlRZUEVfREVGSU5JVElPTiI7Ci0KLQkvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBzaG91bGQgYmUgc2V0IGlmIGEgbmFtZSBvdGhlciB0aGFuIHRoZSBjb21wdXRlZCBuYW1lIGlzIHRvIGJlIHVzZWQuCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBvcnROYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kaW5nTmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcG9ydFR5cGVOYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVyYXRpb25OYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnB1dE5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dHB1dE5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhdWx0TmFtZSA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVzc2FnZU5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnROYW1lID0gbnVsbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQVJUX1RZUEVfT1JfREVGSU5JVElPTiA9IFBBUlRfSU5GT19UWVBFX0RFRklOSVRJT047Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIENSRUFURV9ET1dOX1RPX1BBUlQgPSB0cnVlOwotCQkKLS8qCi0gKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgY3JlYXRlcyB0aGUgJ3NwZWNpZmllZCcgKGJ5IGNhbGxpbmcgYSBjZXJ0YWluIG1ldGhvZCkgV1NETEVsZW1lbnQKLSAqIGFuZCBpdCdzICdjaGlsZHJlbicgYWxsIHRoZSB3YXkgdG8gdGhlIFBvcnRUeXBlIGxldmVsLgotICovCi0JcHVibGljIHN0YXRpYyBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotCQkJc2VydmljZU5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZVNlcnZpY2VOYW1lKGRlZmluaXRpb24pOwkJCi0JCQotCQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5wb3J0VHlwZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLQkJCi0JICAgIEFkZFNlcnZpY2VDb21tYW5kIGFkZFNlcnZpY2UgPSBuZXcgQWRkU2VydmljZUNvbW1hbmQoZGVmaW5pdGlvbiwgc2VydmljZU5hbWUsIGZhbHNlKTsKLQkgICAgYWRkU2VydmljZS5ydW4oKTsKLQkgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIGFkZFNlcnZpY2UuZ2V0V1NETEVsZW1lbnQoKTsKLQkgICAgUG9ydCBwb3J0ID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlUG9ydChzZXJ2aWNlKTsKLSAgCQkKLQkgICAgcmV0dXJuIHNlcnZpY2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUG9ydCBjcmVhdGVQb3J0KFNlcnZpY2Ugc2VydmljZSkgewotCQlpZiAocG9ydE5hbWUgPT0gbnVsbCB8fCBwb3J0TmFtZS50cmltKCkuZXF1YWxzKCIiKSkKLQkJCXBvcnROYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVQb3J0TmFtZShzZXJ2aWNlLCBudWxsKTsKLQkJCi0JICAgIEFkZFBvcnRDb21tYW5kIGFkZFBvcnQgPSBuZXcgQWRkUG9ydENvbW1hbmQoc2VydmljZSwgcG9ydE5hbWUpOwotCSAgICBhZGRQb3J0LnJ1bigpOwotCSAgICBQb3J0IHBvcnQgPSAoUG9ydCkgYWRkUG9ydC5nZXRXU0RMRWxlbWVudCgpOwotCQlCaW5kaW5nIGJpbmRpbmcgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVCaW5kaW5nKHBvcnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBwb3J0KTsKLQotCQlwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0JCQotCSAgICByZXR1cm4gcG9ydDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBQb3J0IHBvcnQpIHsKLQkJYmluZGluZ05hbWUgPSBwb3J0LmdldE5hbWUoKTsKLQkJaWYgKGJpbmRpbmdOYW1lID09IG51bGwgfHwgYmluZGluZ05hbWUudHJpbSgpLmVxdWFscygiIikpCi0JCQliaW5kaW5nTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlQmluZGluZ05hbWUoZGVmaW5pdGlvbiwgbnVsbCk7Ci0JCQotCQlBZGRCaW5kaW5nQ29tbWFuZCBhZGRCaW5kaW5nID0gbmV3IEFkZEJpbmRpbmdDb21tYW5kKGRlZmluaXRpb24sIGJpbmRpbmdOYW1lKTsKLQkJYWRkQmluZGluZy5ydW4oKTsKLQkJQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGFkZEJpbmRpbmcuZ2V0V1NETEVsZW1lbnQoKTsKLQkJUG9ydFR5cGUgcG9ydFR5cGUgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVQb3J0VHlwZShiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0KLQkJYmluZGluZy5zZXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0JCQotCQlyZXR1cm4gYmluZGluZzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBQb3J0VHlwZSBjcmVhdGVQb3J0VHlwZShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJaWYgKHBvcnRUeXBlTmFtZSA9PSBudWxsIHx8IHBvcnRUeXBlTmFtZS50cmltKCkuZXF1YWxzKCIiKSkKLQkJCXBvcnRUeXBlTmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlUG9ydFR5cGVOYW1lKGRlZmluaXRpb24sICJQb3J0VHlwZSIpOwotCQkKLQkJQWRkUG9ydFR5cGVDb21tYW5kIGFkZFBvcnRUeXBlQ29tbWFuZCA9IG5ldyBBZGRQb3J0VHlwZUNvbW1hbmQoZGVmaW5pdGlvbiwgcG9ydFR5cGVOYW1lKTsKLQkJYWRkUG9ydFR5cGVDb21tYW5kLnJ1bigpOwotCQlQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgYWRkUG9ydFR5cGVDb21tYW5kLmdldFdTRExFbGVtZW50KCk7Ci0KLQkJaWYgKENSRUFURV9ET1dOX1RPX1BBUlQpIHsKLQkJCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU9wZXJhdGlvbihwb3J0VHlwZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBwb3J0VHlwZTsKLQl9Ci0KLQkKLS8qCi0gKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgY3JlYXRlcyB0aGUgJ3NwZWNpZmllZCcgKGJ5IGNhbGxpbmcgYSBjZXJ0YWluIG1ldGhvZCkgV1NETEVsZW1lbnQKLSAqIGFuZCBpdCdzICdjaGlsZHJlbicgYWxsIHRoZSB3YXkgdG8gdGhlIFBhcnQgbGV2ZWwuCi0gKi8JCi0gIAlwdWJsaWMgc3RhdGljIE9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oUG9ydFR5cGUgcG9ydFR5cGUpIHsKLSAgCQlpZiAob3BlcmF0aW9uTmFtZSA9PSBudWxsIHx8IG9wZXJhdGlvbk5hbWUudHJpbSgpLmVxdWFscygiIikpCi0gIAkJCW9wZXJhdGlvbk5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZU9wZXJhdGlvbk5hbWUocG9ydFR5cGUpOwotICAJCQotICAJCURlZmluaXRpb24gZGVmID0gcG9ydFR5cGUuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwkKLQkJQWRkT3BlcmF0aW9uQ29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkT3BlcmF0aW9uQ29tbWFuZChwb3J0VHlwZSwgb3BlcmF0aW9uTmFtZSk7Ci0JCWFjdGlvbi5ydW4oKTsKLQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIGFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotICAJCU91dHB1dCBvdXRwdXQgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVPdXRwdXQocG9ydFR5cGUsIG9wZXJhdGlvbik7Ci0JCUlucHV0IGlucHV0ID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlSW5wdXQocG9ydFR5cGUsIG9wZXJhdGlvbiwgbnVsbCk7Ci0KLS8vICAJCSgoUG9ydFR5cGVJbXBsKSBwb3J0VHlwZSkudXBkYXRlRWxlbWVudChmYWxzZSk7Ci0gICAJCXJldHVybiBvcGVyYXRpb247Ci0gIAl9Ci0KLSAgCXB1YmxpYyBzdGF0aWMgSW5wdXQgY3JlYXRlSW5wdXQoUG9ydFR5cGUgcG9ydFR5cGUsIE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBpbnB1dE5hbWUpIHsKLSAgCQlpZiAoaW5wdXROYW1lID09IG51bGwgfHwgaW5wdXROYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotICAJICAJCWlucHV0TmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlSW5wdXROYW1lKHBvcnRUeXBlLCBvcGVyYXRpb24uZ2V0TmFtZSgpLCAiIik7Ci0gIAkJCi0gIAkJRGVmaW5pdGlvbiBkZWYgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAJCUFkZElucHV0Q29tbWFuZCBhY3Rpb24gPSBuZXcgQWRkSW5wdXRDb21tYW5kKG9wZXJhdGlvbiwgaW5wdXROYW1lKTsKLSAgCQlhY3Rpb24ucnVuKCk7Ci0gIAkJSW5wdXQgaW5wdXQgPSAoSW5wdXQpIGFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOyAKLSAgCQlNZXNzYWdlIG1lc3MgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVNZXNzYWdlKGlucHV0KTsKLSAgCQlpbnB1dC5zZXRNZXNzYWdlKG1lc3MpOwotICAJCQkgIAkJCi0gIAkJcmV0dXJuIGlucHV0OwotICAJfQotICAJCQkgIAkKLSAgCXB1YmxpYyBzdGF0aWMgT3V0cHV0IGNyZWF0ZU91dHB1dChQb3J0VHlwZSBwb3J0VHlwZSwgT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAJCWlmIChvdXRwdXROYW1lID09IG51bGwgfHwgb3V0cHV0TmFtZS50cmltKCkuZXF1YWxzKCIiKSkKLSAgCSAgCQlvdXRwdXROYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVPdXRwdXROYW1lKHBvcnRUeXBlLCBvcGVyYXRpb24uZ2V0TmFtZSgpLCAiIik7Ci0gIAkJCi0gIAkJRGVmaW5pdGlvbiBkZWYgPSBvcGVyYXRpb24uZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAJCUFkZE91dHB1dENvbW1hbmQgYWN0aW9uID0gbmV3IEFkZE91dHB1dENvbW1hbmQob3BlcmF0aW9uLCBvdXRwdXROYW1lKTsKLSAgCQlhY3Rpb24ucnVuKCk7Ci0gIAkJT3V0cHV0IG91dHB1dCA9IChPdXRwdXQpIGFjdGlvbi5nZXRXU0RMRWxlbWVudCgpOwotICAJCU1lc3NhZ2UgbWVzcyA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZU1lc3NhZ2Uob3V0cHV0KTsKLSAgCQlvdXRwdXQuc2V0TWVzc2FnZShtZXNzKTsJCi0gIAkJCSAgCQkKLSAgCQlyZXR1cm4gb3V0cHV0OwotICAJfQotICAJCQkgIAkKLSAgCXB1YmxpYyBzdGF0aWMgRmF1bHQgY3JlYXRlRmF1bHQoT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAJCWlmIChmYXVsdE5hbWUgPT0gbnVsbCB8fCBmYXVsdE5hbWUudHJpbSgpLmVxdWFscygiIikpIAotCSAgCQlmYXVsdE5hbWUgPSBOYW1lVXRpbC5idWlsZFVuaXF1ZUZhdWx0TmFtZShvcGVyYXRpb24pOwotICAJCQotICAJCURlZmluaXRpb24gZGVmID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgCQlBZGRGYXVsdENvbW1hbmQgYWN0aW9uID0gbmV3IEFkZEZhdWx0Q29tbWFuZChvcGVyYXRpb24sIGZhdWx0TmFtZSk7Ci0gIAkJYWN0aW9uLnJ1bigpOwotICAJCUZhdWx0IGZhdWx0ID0gKEZhdWx0KSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgCQlNZXNzYWdlIG1lc3MgPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5jcmVhdGVNZXNzYWdlKGZhdWx0KTsKLSAgCQlmYXVsdC5zZXRNZXNzYWdlKG1lc3MpOwotICAJCSAJCQotICAJCXJldHVybiBmYXVsdDsKLSAgCX0KLSAgCQkJICAJCi0gIAlwdWJsaWMgc3RhdGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShNZXNzYWdlUmVmZXJlbmNlIGlvZikgewotICAJCWlmIChtZXNzYWdlTmFtZSA9PSBudWxsIHx8IG1lc3NhZ2VOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKQotICAJICAJCW1lc3NhZ2VOYW1lID0gTmFtZVV0aWwuYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShpb2YuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLCBpb2YpOwotLy8JICAJCW1lc3NhZ2VOYW1lID0gTmFtZVV0aWwuYnVpbGRNZXNzYWdlTmFtZShpb2YuZ2V0TmFtZSgpKTsKLSAgCQkKLSAgCQlEZWZpbml0aW9uIGRlZiA9IGlvZi5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gIAkJQWRkTWVzc2FnZUNvbW1hbmQgYWN0aW9uID0gbmV3IEFkZE1lc3NhZ2VDb21tYW5kKGRlZiwgbWVzc2FnZU5hbWUpOwotICAJCWFjdGlvbi5ydW4oKTsKLSAgCQlNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgYWN0aW9uLmdldFdTRExFbGVtZW50KCk7Ci0gIAkJUGFydCBwYXJ0ID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuY3JlYXRlUGFydChtZXNzYWdlKTsKLSAgCQlFbGVtZW50IHBhcmVudE5vZGUgPSBtZXNzYWdlLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIAotICAgICAgewotCQkgICAgLy8gZm9ybWF0IHNlbGVjdGVkIG5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICAgIGZvcm1hdFByb2Nlc3NvclhNTC5mb3JtYXROb2RlKChJRE9NTm9kZSlwYXJlbnROb2RlKTsKLSAgICAgIH0KLSAgCQkKLSAgCQltZXNzYWdlTmFtZSA9IG51bGw7Ci0gIAkJcmV0dXJuIG1lc3NhZ2U7Ci0gIAl9Ci0gIAkJCSAgCQotICAJcHVibGljIHN0YXRpYyBQYXJ0IGNyZWF0ZVBhcnQoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gIAkJRGVmaW5pdGlvbiBkZWYgPSBtZXNzYWdlLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgCQlTdHJpbmcgbmFtZSA9IE5hbWVVdGlsLmJ1aWxkVW5pcXVlUGFydE5hbWUobWVzc2FnZSwgbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgCQlBZGRQYXJ0Q29tbWFuZCBhY3Rpb24gPSBudWxsOwotICAJCQotICAJCWlmIChQQVJUX1RZUEVfT1JfREVGSU5JVElPTiA9PSBQQVJUX0lORk9fVFlQRV9ERUZJTklUSU9OKSB7Ci0gIAkJCWFjdGlvbiA9IG5ldyBBZGRQYXJ0Q29tbWFuZChtZXNzYWdlLCBuYW1lLCBXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCAic3RyaW5nIiwgdHJ1ZSk7Ci0gIAkJfQotICAJCWVsc2UgaWYgKFBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID09IFBBUlRfSU5GT19FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7ICAJCQkKLSAgCQkJLy9hY3Rpb24gPSBuZXcgQWRkUGFydENvbW1hbmQobWVzc2FnZSwgbmFtZSwgV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwgInN0cmluZyIsIHRydWUpOwotICAJCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBnZXROZXdOYW1lSGVscGVyKG5hbWUsIGRlZiwgZmFsc2UpOwotICAJCQlBZGRYU0RFbGVtZW50RGVjbGFyYXRpb25Db21tYW5kIGVsZW1lbnRBY3Rpb24gPSBuZXcgQWRkWFNERWxlbWVudERlY2xhcmF0aW9uQ29tbWFuZChkZWYsIGVsZW1lbnROYW1lKTsKLSAgCQkJZWxlbWVudEFjdGlvbi5ydW4oKTsKLSAgCQkJYWN0aW9uID0gbmV3IEFkZFBhcnRDb21tYW5kKG1lc3NhZ2UsIG5hbWUsIGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgZWxlbWVudE5hbWUsIGZhbHNlKTsKLSAgCQl9Ci0KLSAgCQlhY3Rpb24ucnVuKCk7Ci0gIAkJCi0gIAkJcmV0dXJuIChQYXJ0KSBhY3Rpb24uZ2V0V1NETEVsZW1lbnQoKTsKLSAgCX0JCi0KLSAgCS8qCi0gIAkgKiBVc2VkIHRvIGRldGVybWluZSBhIG5hbWUgZm9yIGFuIEVsZW1lbnQKLSAgCSAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXdOYW1lSGVscGVyKFN0cmluZyBiYXNlLCBEZWZpbml0aW9uIGRlZiwgYm9vbGVhbiBpc1R5cGUpCi0gICAgeyAKLSAgICAgIFN0cmluZyBuYW1lID0gYmFzZTsgICAgCi0gICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICAvLyBVZ2x5Li4uLiAgUmVkbyB0aGlzLi4uCi0gICAgICAvLyBHZXQgYSBsaXN0IG9mIEVsZW1lbnRzLi4uCi0gICAgICBMaXN0IGVsZW1lbnRMaXN0ID0gbnVsbDsKLSAgICAgIGlmIChkZWYuZ2V0RVR5cGVzKCkgIT0gbnVsbCkgewotICAgICAgCUxpc3QgeHNkc0xpc3QgPSBkZWYuZ2V0RVR5cGVzKCkuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgCWlmICh4c2RzTGlzdCAhPSBudWxsKSB7Ci0gICAgICAJCUl0ZXJhdG9yIHhzZHNJdGVyYXRvciA9IHhzZHNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAJCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHhzZEVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHhzZHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAJCVhTRFNjaGVtYSBzY2hlbWEgPSB4c2RFbGVtZW50LmdldFNjaGVtYSgpOwotICAgICAgCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLSAgICAgIAkJCWVsZW1lbnRMaXN0ID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLSAgICAgIAkJfQotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVsZW1lbnRMaXN0ICE9IG51bGwpIHsKLSAgICAgIAlpbnQgaW5kZXggPSAwOwotICAgICAgCXdoaWxlIChpbmRleCA8IGVsZW1lbnRMaXN0LnNpemUoKSkgewotICAgICAgCQlYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudExpc3QuZ2V0KGluZGV4KTsKLSAgICAgIAkJCi0gICAgICAJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpKSkgewotICAgICAgCQkJY291bnQrKzsKLSAgICAgIAkJCW5hbWUgPSBuYW1lICsgY291bnQ7Ci0gICAgICAJCQlpbmRleCA9IDA7Ci0gICAgICAJCX0KLSAgICAgIAkJZWxzZSB7Ci0gICAgICAJCQlpbmRleCsrOwotICAgICAgCQl9Ci0gICAgICAJfQotICAgICAgfQotCi0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgCS8qCi0gIAkgKiBSZXR1cm4gdGhlIHR5cGUgb2YgUGFydCB0aGlzIFdTRExFbGVtZW50IHNob3VsZCBoYXZlIChFbGVtZW50IHZzIFR5cGUpLiAgVG8gZGV0ZXJtaW5lIHRoaXMsIHdlIGZpbHRlciB1cCB0byB0aGUgJ3BhcmVudCcgUG9ydFR5cGUKLSAgCSAqIGFuZCBnbyBkb3duIHRvIHRoZSBmaXJzdCBQYXJ0IHdlIGVuY291bnRlciBhbmQgY2hlY2sgdGhlIHR5cGUgaXQgaGFzLiAgSWYgdGhpcyBmYWlscywgZGVmYXVsdCB0byBUeXBlLgotICAJICovCi0gIAkgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcnRJbmZvKFdTRExFbGVtZW50IGVsZW1lbnQpIHsKLSAgCSAgCVN0cmluZyBwYXJ0SW5mbyA9IG51bGw7Ci0gIAkgIAkKLSAgCSAgCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUG9ydFR5cGUpIHsKLSAgCSAgCQlwYXJ0SW5mbyA9IGdldFBhcnRJbmZvKChQb3J0VHlwZSkgZWxlbWVudCk7Ci0gIAkgIAl9Ci0gIAkgIAllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkgIAkJcGFydEluZm8gPSBnZXRQYXJ0SW5mbygoKFdTRExFbGVtZW50SW1wbCkgZWxlbWVudCkuZ2V0Q29udGFpbmVyKCkpOwotICAJICAJfQotICAJICAJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2VJbXBsKSB7Ci0gIAkgIAkJcGFydEluZm8gPSBnZXRQYXJ0SW5mbygoKFdTRExFbGVtZW50SW1wbCkgZWxlbWVudCkuZ2V0Q29udGFpbmVyKCkpOwotICAJICAJfQotCi0gIAkgIAlpZiAocGFydEluZm8gPT0gbnVsbCkgewotICAJICAJCXBhcnRJbmZvID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTjsKLSAgCSAgCX0KLSAgCSAgCQotICAJICAJcmV0dXJuIHBhcnRJbmZvOyAgCQotICAJICB9Ci0gIAkgIAotICAJICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGFydEluZm8oUG9ydFR5cGUgcG9ydFR5cGUpIHsKLSAgCSAgCVN0cmluZyBwYXJ0SW5mbyA9IG51bGw7Ci0gIAkgIAkKLSAgCSAgCWlmIChwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkgIT0gbnVsbCkgewotICAJICAJCUl0ZXJhdG9yIG9wZXJhdGlvbkl0ID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gIAkgIAkJd2hpbGUgKG9wZXJhdGlvbkl0Lmhhc05leHQoKSkgewotICAJICAJCQlPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25JdC5uZXh0KCk7Ci0KLSAgCSAgCQkJaWYgKG9wLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLSAgCSAgCQkJCXBhcnRJbmZvID0gZ2V0TWVzc2FnZVJlZlBhcnRJbmZvKChNZXNzYWdlUmVmZXJlbmNlSW1wbCkgb3AuZ2V0RUlucHV0KCkpOwotICAJICAJCQl9Ci0gIAkgIAkKLSAgCSAgCQkJaWYgKHBhcnRJbmZvID09IG51bGwgJiYgb3AuZ2V0RU91dHB1dCgpICE9IG51bGwpIHsKLSAgCSAgCQkJCXBhcnRJbmZvID0gZ2V0TWVzc2FnZVJlZlBhcnRJbmZvKChNZXNzYWdlUmVmZXJlbmNlSW1wbCkgb3AuZ2V0RU91dHB1dCgpKTsKLSAgCSAgCQkJfQotICAJICAJCi0gIAkgIAkJCWlmIChvcC5nZXRFRmF1bHRzKCkgIT0gbnVsbCkgewotICAJICAJCQkJSXRlcmF0b3IgZmF1bHRJdCA9IG9wLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOwotICAJICAJCQkJd2hpbGUgKHBhcnRJbmZvID09IG51bGwgJiYgZmF1bHRJdC5oYXNOZXh0KCkpIHsKLSAgCSAgCQkJCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgZmF1bHRJdC5uZXh0KCk7Ci0gIAkgIAkJCQkJcGFydEluZm8gPSBnZXRNZXNzYWdlUmVmUGFydEluZm8oKE1lc3NhZ2VSZWZlcmVuY2VJbXBsKSBmYXVsdCk7Ci0gIAkgIAkJCQl9Ci0gIAkgIAkJCX0KLSAgCSAgCSAgCSAgCQotICAJICAJCQlpZiAocGFydEluZm8gIT0gbnVsbCkKLSAgCSAgCQkJCWJyZWFrOwotICAJICAJCX0KLSAgCSAgCX0KLQotICAJICAJcmV0dXJuIHBhcnRJbmZvOwotICAJICB9Ci0gIAkgIAotICAJICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZVJlZlBhcnRJbmZvKE1lc3NhZ2VSZWZlcmVuY2VJbXBsIGlvZikgewotICAJICAJU3RyaW5nIHBhcnRJbmZvID0gbnVsbDsKLSAgCSAgCQotICAJICAJaWYgKGlvZi5nZXRFTWVzc2FnZSgpICE9IG51bGwgJiYgaW9mLmdldEVNZXNzYWdlKCkuZ2V0RVBhcnRzKCkgIT0gbnVsbCkgewotICAJICAJCUl0ZXJhdG9yIHBhcnRJdCA9IGlvZi5nZXRFTWVzc2FnZSgpLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gIAkgIAkKLSAgCSAgCQl3aGlsZSAocGFydEluZm8gPT0gbnVsbCAmJiBwYXJ0SXQuaGFzTmV4dCgpKSB7Ci0gIAkgIAkJCVBhcnQgcGFydCA9IChQYXJ0KSBwYXJ0SXQubmV4dCgpOwotICAJICAJCQotICAJICAJCQlpZiAocGFydC5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpIHsKLSAgCSAgCQkJCXBhcnRJbmZvID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTjsKLSAgCSAgCQkJfQotICAJICAJCQllbHNlIGlmIChwYXJ0LmdldEVsZW1lbnREZWNsYXJhdGlvbigpICE9IG51bGwpIHsKLSAgCSAgCQkJCXBhcnRJbmZvID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9JTkZPX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gIAkgIAkJCX0KLSAgCSAgCQl9Ci0gIAkgIAl9Ci0gIAkgIAkKLSAgCSAgCXJldHVybiBwYXJ0SW5mbzsKLSAgCSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9OYW1lVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9OYW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzc4YzhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvTmFtZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLQotcHVibGljIGNsYXNzIE5hbWVVdGlsCi17Ci0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBmYXVsdCBpbiB0aGUgb3BlcmF0aW9uLgotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVGYXVsdE5hbWUoT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAJcmV0dXJuIGJ1aWxkVW5pcXVlRmF1bHROYW1lKG9wZXJhdGlvbiwgIk5ld0ZhdWx0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlRmF1bHROYW1lKE9wZXJhdGlvbiBvcGVyYXRpb24sIFN0cmluZyBiYXNlTmFtZSkgewotICAJaWYgKGJhc2VOYW1lID09IG51bGwpCi0gIAkJYmFzZU5hbWUgPSAiTmV3RmF1bHQiOwotICAJCi0gIAlMaXN0IG5hbWVzID0gZ2V0VXNlZEZhdWx0TmFtZXMob3BlcmF0aW9uKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKGJhc2VOYW1lLCBuYW1lcyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbmFtZSB3aGljaCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgaW5wdXQgaW4gdGhlIHBvcnRUeXBlLiAgUmV0dXJuZWQgbmFtZSB3aWxsIGJlIG9mIHRoZSBmb3JtOgotICAgKiA8b3BlcmF0aW9uTmFtZT4gKyA8ZW5kaW5nPiBbKyB1bmlxdWUgSW50ZWdlcl0KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlSW5wdXROYW1lKFBvcnRUeXBlIHBvcnRUeXBlLCBTdHJpbmcgb3BlcmF0aW9uTmFtZSwgU3RyaW5nIGVuZGluZykKLSAgewotICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICBTdHJpbmcgY2FuZGlkYXRlID0gb3BlcmF0aW9uTmFtZSArIGVuZGluZzsKLQotICAgIGludCBpID0gMDsKLQotICAgIC8vIGxvb3AgdW50aWwgd2UgZmluZCBhIHVuaXF1ZSBuYW1lICh0aGUgbmFtZSB3aWxsIGNvbnNpc3Qgb2YgdGhlIG9wZXJhdGlvbk5hbWUgKyBlbmRpbmcgKyBhbiBpbnRlZ2VyKQotICAgIHdoaWxlIChuYW1lID09IG51bGwpCi0gICAgewotICAgICAgYm9vbGVhbiB1bmlxdWUgPSB0cnVlOwotCi0gICAgICAvLyBkZXRlcm1pbmUgaWYgdGhpcyBjb21iaW5hdGlvbiBpcyB1bmlxdWUgd2l0aGluIHRoZSBjdXJyZW50IHBvcnR0eXBlCi0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCkgJiYgdW5pcXVlOykKLSAgICAgIHsKLSAgICAgICAgT3BlcmF0aW9uIGN1cnJlbnQgPSAoT3BlcmF0aW9uKSBpdC5uZXh0KCk7Ci0gICAgICAgIC8vIFRPRE8gOiBwb3J0IGNoZWNrCi0gICAgICAgIC8vIG9sZCAgaWYoY3VycmVudC5pc1NldEVJbnB1dCgpICYmIGN1cnJlbnQuZ2V0RUlucHV0KCkuaXNTZXROYW1lKCkpIHsKLSAgICAgICAgaWYgKGN1cnJlbnQuZ2V0RUlucHV0KCkgIT0gbnVsbCAmJiBjdXJyZW50LmdldEVJbnB1dCgpLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0RUlucHV0KCkuZ2V0TmFtZSgpLmVxdWFscyhjYW5kaWRhdGUpKQotICAgICAgICAgICAgdW5pcXVlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICh1bmlxdWUpCi0gICAgICAgIG5hbWUgPSBjYW5kaWRhdGU7Ci0gICAgICBlbHNlCi0gICAgICAgIGNhbmRpZGF0ZSA9IG9wZXJhdGlvbk5hbWUgKyBlbmRpbmcgKyBpOwotICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBtZXNzYWdlIGluIHRoZSBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVNZXNzYWdlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VOYW1lID0gIk5ld01lc3NhZ2UiOwotICAgIH0KLQotICAgIExpc3QgbmFtZXMgPSBnZXRVc2VkTWVzc2FnZU5hbWVzKGRlZmluaXRpb24pOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBvcGVyYXRpb24gaW4gdGhlIHBvcnQgdHlwZS4KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlT3BlcmF0aW9uTmFtZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAJcmV0dXJuIGJ1aWxkVW5pcXVlT3BlcmF0aW9uTmFtZShwb3J0VHlwZSwgIk5ld09wZXJhdGlvbiIpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZU9wZXJhdGlvbk5hbWUoUG9ydFR5cGUgcG9ydFR5cGUsIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAJaWYgKGJhc2VOYW1lID09IG51bGwpIHsKLSAgCQliYXNlTmFtZSA9ICJOZXdPcGVyYXRpb24iOwotICAJfQotCi0gIAlMaXN0IG5hbWVzID0gZ2V0VXNlZE9wZXJhdGlvbk5hbWVzKHBvcnRUeXBlKTsKLQotICAgIC8vIE5vdyBzZWFyY2ggdGhlIGxpc3QgdW50aWwgd2UgZmluZCBhbiB1bnVzZWQgbmFtZQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKGJhc2VOYW1lLCBuYW1lcyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbmFtZSB3aGljaCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgb3V0cHV0IGluIHRoZSBwb3J0VHlwZS4gIFJldHVybmVkIG5hbWUgd2lsbCBiZSBvZiB0aGUgZm9ybToKLSAgICogPG9wZXJhdGlvbk5hbWU+ICsgPGVuZGluZz4gWysgdW5pcXVlIEludGVnZXJdCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZU91dHB1dE5hbWUoUG9ydFR5cGUgcG9ydFR5cGUsIFN0cmluZyBvcGVyYXRpb25OYW1lLCBTdHJpbmcgZW5kaW5nKQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIFN0cmluZyBjYW5kaWRhdGUgPSBvcGVyYXRpb25OYW1lICsgZW5kaW5nOwotCi0gICAgaW50IGkgPSAwOwotCi0gICAgLy8gbG9vcCB1bnRpbCB3ZSBmaW5kIGEgdW5pcXVlIG5hbWUgKHRoZSBuYW1lIHdpbGwgY29uc2lzdCBvZiB0aGUgb3BlcmF0aW9uTmFtZSArIGVuZGluZyArIGFuIGludGVnZXIpCi0gICAgd2hpbGUgKG5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBib29sZWFuIHVuaXF1ZSA9IHRydWU7Ci0KLSAgICAgIC8vIGRldGVybWluZSBpZiB0aGlzIGNvbWJpbmF0aW9uIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGN1cnJlbnQgcG9ydHR5cGUJCQkKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKSAmJiB1bmlxdWU7KQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gY3VycmVudCA9IChPcGVyYXRpb24pIGl0Lm5leHQoKTsKLSAgICAgICAgLy8gVE9ETzogcG9ydCBjaGVjawotICAgICAgICAvLyBvbGQJCQkJaWYoY3VycmVudC5pc1NldEVPdXRwdXQoKSAmJiBjdXJyZW50LmdldEVPdXRwdXQoKS5pc1NldE5hbWUoKSkgewotICAgICAgICBpZiAoY3VycmVudC5nZXRFT3V0cHV0KCkgIT0gbnVsbCAmJiBjdXJyZW50LmdldEVPdXRwdXQoKS5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChjdXJyZW50LmdldEVPdXRwdXQoKS5nZXROYW1lKCkuZXF1YWxzKGNhbmRpZGF0ZSkpCi0gICAgICAgICAgICB1bmlxdWUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHVuaXF1ZSkKLSAgICAgICAgbmFtZSA9IGNhbmRpZGF0ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgY2FuZGlkYXRlID0gb3BlcmF0aW9uTmFtZSArIGVuZGluZyArIGk7Ci0gICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIG5hbWUgd2hpY2ggaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIHBhcnQgaW4gdGhlIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVBhcnROYW1lKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAJTGlzdCBuYW1lcyA9IGdldFVzZWRQYXJ0TmFtZXMobWVzc2FnZSk7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcigiTmV3UGFydCIsIG5hbWVzKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVQYXJ0TmFtZShNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAJaWYgKGJhc2VOYW1lID09IG51bGwpCi0gIAl7Ci0gIAkJYmFzZU5hbWUgPSAiTmV3UGFydCI7Ci0gIAl9Ci0gIAkKLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkUGFydE5hbWVzKG1lc3NhZ2UpOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBwb3J0IHR5cGUgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVBvcnRUeXBlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VOYW1lID0gIk5ld1BvcnRUeXBlIjsKLSAgICB9Ci0KLSAgICBMaXN0IG5hbWVzID0gZ2V0VXNlZFBvcnRUeXBlTmFtZXMoZGVmaW5pdGlvbik7Ci0KLSAgICAvLyBOb3cgc2VhcmNoIHRoZSBsaXN0IHVudGlsIHdlIGZpbmQgYW4gdW51c2VkIG5hbWUKLSAgICByZXR1cm4gZ2V0VW5pcXVlTmFtZUhlbHBlcihiYXNlTmFtZSwgbmFtZXMpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlTmFtZUhlbHBlcihTdHJpbmcgYmFzZU5hbWUsIExpc3QgbmFtZXMpCi0gIHsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IGJhc2VOYW1lOwotICAgIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIGlmICghbmFtZXMuY29udGFpbnMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaSsrOwotICAgICAgbmFtZSA9IGJhc2VOYW1lICsgaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBuYW1lIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IGFueSBvdGhlciBzZXJ2aWNlIGluIHRoZSBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVTZXJ2aWNlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgCUxpc3QgbmFtZXMgPSBnZXRVc2VkU2VydmljZU5hbWVzKGRlZmluaXRpb24pOwotCi0gICAgLy8gTm93IHNlYXJjaCB0aGUgbGlzdCB1bnRpbCB3ZSBmaW5kIGFuIHVudXNlZCBuYW1lCi0gICAgcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoIk5ld1NlcnZpY2UiLCBuYW1lcyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbmFtZSB3aGljaCBpcyBub3QgdXNlZCBieSBhbnkgb3RoZXIgYmluZGluZyBpbiB0aGUgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVW5pcXVlQmluZGluZ05hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgYmFzZU5hbWUpCi0gIHsKLSAgICBpZiAoYmFzZU5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBiYXNlTmFtZSA9ICJOZXdCaW5kaW5nIjsKLSAgICB9Ci0KLSAgICBMaXN0IG5hbWVzID0gZ2V0VXNlZEJpbmRpbmdOYW1lcyhkZWZpbml0aW9uKTsKLQotICAgIHJldHVybiBnZXRVbmlxdWVOYW1lSGVscGVyKGJhc2VOYW1lLCBuYW1lcyk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZVByZWZpeChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBiYXNlUHJlZml4KQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IGJhc2VQcmVmaXg7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlKHByZWZpeCkgIT0gbnVsbDsgaSsrKQotICAgIHsKLSAgICAgIHByZWZpeCA9IGJhc2VQcmVmaXggKyBpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRVbmlxdWVQb3J0TmFtZShTZXJ2aWNlIHNlcnZpY2UsIFN0cmluZyBiYXNlTmFtZSkKLSAgewotICAgIGlmIChiYXNlTmFtZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGJhc2VOYW1lID0gIk5ld1BvcnQiOwotICAgIH0KLSAgCi0gICAgTGlzdCBuYW1lcyA9IGdldFVzZWRQb3J0TmFtZXMoc2VydmljZSk7Ci0gICAgCi0JcmV0dXJuIGdldFVuaXF1ZU5hbWVIZWxwZXIoYmFzZU5hbWUsIG5hbWVzKTsKLSAgfQotCQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFVuaXF1ZU1lc3NhZ2VOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgTWVzc2FnZVJlZmVyZW5jZSBtZXNzUmVmKQotICB7ICAgCi0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIGlmIChtZXNzUmVmIGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgbmFtZSA9IGNyZWF0ZU9wZXJhdGlvbk5hbWUobWVzc1JlZiwgIlJlcXVlc3QiKTsgICAgCi0gICAgfQotICAgIGVsc2UgaWYgKG1lc3NSZWYgaW5zdGFuY2VvZiBPdXRwdXQpCi0gICAgewotICAgICAgbmFtZSA9IGNyZWF0ZU9wZXJhdGlvbk5hbWUobWVzc1JlZiwgIlJlc3BvbnNlIik7IAotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzUmVmIGluc3RhbmNlb2YgRmF1bHQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmcgZmF1bHROYW1lID0gKChGYXVsdCkgbWVzc1JlZikuZ2V0TmFtZSgpOwotICAgICAgaWYgKGZhdWx0TmFtZSA9PSBudWxsIHx8IGZhdWx0TmFtZS5sZW5ndGgoKSA9PSAwKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBmYXVsdE5hbWUgPSAiRmF1bHQiOwotICAgICAgfQotICAgICAgbmFtZSA9IGNyZWF0ZU9wZXJhdGlvbk5hbWUobWVzc1JlZiwgZmF1bHROYW1lKTsgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcmV0dXJuIE5hbWVVdGlsLmJ1aWxkVW5pcXVlTWVzc2FnZU5hbWUoZGVmaW5pdGlvbiwgbmFtZSk7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VXNlZEZhdWx0TmFtZXMoT3BlcmF0aW9uIG9wZXJhdGlvbikgewotICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBvcGVyYXRpb24uZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBuYW1lcy5hZGQoZmF1bHQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldFVzZWRPcGVyYXRpb25OYW1lcyhQb3J0VHlwZSBwb3J0VHlwZSkgewotICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBpLm5leHQoKTsKLSAgICAgIG5hbWVzLmFkZChvcC5nZXROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkUGFydE5hbWVzKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtZXNzYWdlLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgaS5uZXh0KCk7Ci0gICAgICBuYW1lcy5hZGQocGFydC5nZXROYW1lKCkpOwotICAgIH0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VXNlZFBvcnRUeXBlTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgaS5uZXh0KCk7Ci0gICAgICAvLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgICAvLwkJCWlmIChwb3J0VHlwZS5pc1NldFFOYW1lKCkpCi0gICAgICBpZiAocG9ydFR5cGUuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lcy5hZGQocG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgICAKLSAgfQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0VXNlZFNlcnZpY2VOYW1lcyhEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgICAvLyBGaXJzdCBidWlsZCBhIGxpc3Qgb2YgbmFtZXMgYWxyZWFkeSB1c2VkCi0gICAgQXJyYXlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBpLm5leHQoKTsKLSAgICAgIC8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIC8vIAkJaWYoc2VydmljZS5pc1NldFFOYW1lKCkpCi0gICAgICBpZiAoc2VydmljZS5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgICAgIG5hbWVzLmFkZChzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gbmFtZXM7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkTWVzc2FnZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVNZXNzYWdlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1zZyA9IChNZXNzYWdlKSBpLm5leHQoKTsKLSAgICAgIC8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIGlmIChtc2cuZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgICAvLwkJCWlmKG1zZy5pc1NldFFOYW1lKCkpCi0gICAgICAgIG5hbWVzLmFkZChtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkQmluZGluZ05hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbikgewotICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgaS5uZXh0KCk7Ci0gICAgICAvLyBUT0RPOiBwb3J0IGNoZWNrCi0gICAgICAvLwkJCWlmIChiaW5kaW5nLmlzU2V0UU5hbWUoKSkKLSAgICAgIGlmIChiaW5kaW5nLmdldFFOYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXMuYWRkKGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuYW1lczsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRVc2VkUG9ydE5hbWVzKFNlcnZpY2Ugc2VydmljZSkgewotICAgIC8vIEZpcnN0IGJ1aWxkIGEgbGlzdCBvZiBuYW1lcyBhbHJlYWR5IHVzZWQKLSAgICBBcnJheUxpc3QgbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIGkubmV4dCgpOwotCi0gICAgICBpZiAocG9ydC5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXMuYWRkKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG5hbWVzOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlT3BlcmF0aW9uTmFtZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgc3VmZml4KQotICB7ICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgewotICAgICAgRU9iamVjdCBwYXJlbnQgPSAoKEVPYmplY3Qpb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoKE9wZXJhdGlvbilwYXJlbnQpLmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICB9IAotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgKz0gc3VmZml4OwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL05vZGVBc3NvY2lhdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvTm9kZUFzc29jaWF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDRjOWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvTm9kZUFzc29jaWF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JTm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLldTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyCi17ICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvckV4dGVuc2lvbltdIGV4dGVuc2lvbnM7Ci0gIHByb3RlY3RlZCBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXJbXSBwcm92aWRlcnM7Ci0KLSAgcHVibGljIE5vZGVBc3NvY2lhdGlvbk1hbmFnZXIoKQotICB7ICAgICAgICAgICAgIAotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBleHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5OT0RFX0FTU09DSUFUSU9OX1BST1ZJREVSKTsgCi0gICAgcHJvdmlkZXJzID0gbmV3IElOb2RlQXNzb2NpYXRpb25Qcm92aWRlcltleHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBwcm92aWRlcnNbaV0gPSAoSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyKWV4dGVuc2lvbnNbaV0uY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KFdTRExFZGl0b3JFeHRlbnNpb24uTk9ERV9BU1NPQ0lBVElPTl9QUk9WSURFUiwgbnVsbCk7Ci0gICAgfQotICB9ICAgICAgICAKLQotICBwcm90ZWN0ZWQgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIGdldEFwcGljYWJsZVByb3ZpZGVyKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uc1tpXS5pc0FwcGxpY2FibGUob2JqZWN0KSkKLSAgICAgIHsKLSAgICAgICAgcHJvdmlkZXIgPSBwcm92aWRlcnNbaV07Ci0gICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb3ZpZGVyOwotICB9Ci0gICAgICAgIAotCi0gIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3RGb3JOb2RlKE9iamVjdCByb290T2JqZWN0LCBFbGVtZW50IHRhcmdldE5vZGUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGludCBjdXJyZW50SW5kZXggPSAwOwotCi0gICAgRWxlbWVudFtdIGVsZW1lbnRDaGFpbiA9IGdldFBhcmVudEVsZW1lbnRDaGFpbigoRWxlbWVudCl0YXJnZXROb2RlKTsKLQotICAgIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlciBwID0gZ2V0QXBwaWNhYmxlUHJvdmlkZXIocm9vdE9iamVjdCk7Ci0gICAgaWYgKHAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOb2RlIHJvb3RPYmplY3ROb2RlID0gcC5nZXROb2RlKHJvb3RPYmplY3QpOwotCi0gICAgICB3aGlsZSAoY3VycmVudEluZGV4IDwgZWxlbWVudENoYWluLmxlbmd0aCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBlID0gZWxlbWVudENoYWluW2N1cnJlbnRJbmRleF07Ci0gICAgICAgIGlmIChlID09IHJvb3RPYmplY3ROb2RlKQotICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgIGN1cnJlbnRJbmRleCsrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnRJbmRleCsrOwotICAgICAgfQotICAgIH0KLSAgICAgICAgICAgICAKLSAgICBPYmplY3QgY3VycmVudE9iamVjdCA9IHJvb3RPYmplY3Q7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IGVuZFtdID0gbmV3IGludFsxXTsKLQotICAgIHdoaWxlIChjdXJyZW50SW5kZXggPCBlbGVtZW50Q2hhaW4ubGVuZ3RoKQotICAgIHsgICAgICAgICAgICAgICAKLSAgICAgIHAgPSBnZXRBcHBpY2FibGVQcm92aWRlcihjdXJyZW50T2JqZWN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVuZFswXSA9IGVsZW1lbnRDaGFpbi5sZW5ndGg7Ci0gICAgICAgIGN1cnJlbnRPYmplY3QgPSBwLmdldE1vZGVsT2JqZWN0KGN1cnJlbnRPYmplY3QsIGVsZW1lbnRDaGFpbiwgY3VycmVudEluZGV4LCBlbmQpOwotICAgICAgICAKLSAgICAgICAgaWYgKGN1cnJlbnRPYmplY3QgPT0gbnVsbCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAvLyBmYWlsdXJlCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY3VycmVudEluZGV4ID0gTWF0aC5tYXgoZW5kWzBdLCBjdXJyZW50SW5kZXggKyAxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgICAgICAgICAKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IAotICAgIH0gICAgIAotCi0gICAgcmV0dXJuIChjdXJyZW50SW5kZXggPT0gZWxlbWVudENoYWluLmxlbmd0aCkgPyBjdXJyZW50T2JqZWN0IDogbnVsbDsKLSAgfSAgCi0gICAgICAgICAgIAotCi0gIHB1YmxpYyBOb2RlIGdldE5vZGUoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7ICAgICAgICAgIAotICAgIE5vZGUgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE5vZGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gKE5vZGUpbW9kZWxPYmplY3Q7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBJTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIgcCA9IGdldEFwcGljYWJsZVByb3ZpZGVyKG1vZGVsT2JqZWN0KTsgICAgICAgICAgICAgICAKLSAgICAgIGlmIChwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHAuZ2V0Tm9kZShtb2RlbE9iamVjdCk7Ci0gICAgICB9Ci0gICAgfSAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAKLQotICBwcm90ZWN0ZWQgRWxlbWVudFtdIGdldFBhcmVudEVsZW1lbnRDaGFpbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgwLCBlbGVtZW50KTsKLSAgICAgIE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgZWxlbWVudCA9IChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSA/IChFbGVtZW50KW5vZGUgOiBudWxsOyAgICAKLSAgICB9ICAgICAgICAgICAgICAgIAotCi0gICAgaW50IGxpc3RTaXplID0gbGlzdC5zaXplKCk7Ci0gICAgRWxlbWVudFtdIHJlc3VsdCA9IG5ldyBFbGVtZW50W2xpc3RTaXplXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspCi0gICAgewotICAgICAgcmVzdWx0W2ldID0gKEVsZW1lbnQpbGlzdC5nZXQoaSk7Ci0gICAgfSAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9PcGVuT25TZWxlY3Rpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvT3Blbk9uU2VsZWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDYyZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9PcGVuT25TZWxlY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5hdmlnYXRpb25Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5JbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFN3aXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgT3Blbk9uU2VsZWN0aW9uSGVscGVyIGV4dGVuZHMgV1NETFN3aXRjaAotewotICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIEF0dHIgYXR0ciA9IG51bGw7Ci0gIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgcHVibGljIE9wZW5PblNlbGVjdGlvbkhlbHBlcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgb3BlbkVkaXRvcihFT2JqZWN0IGVPYmplY3QpCi0gIHsKLSAgICBTdHJpbmdbXSBhcnJheSA9IGNvbXB1dGVTcGVjaWZpY2F0aW9uKGVPYmplY3QpOwotICAgIGlmIChhcnJheSAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wZW5FZGl0b3IoYXJyYXlbMF0sIGFycmF5WzFdKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvcGVuRWRpdG9yKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZ1tdIGFycmF5ID0gY29tcHV0ZVNwZWNpZmljYXRpb24obm9kZSk7Ci0gICAgaWYgKGFycmF5ICE9IG51bGwpCi0gICAgewotICAgICAgb3BlbkVkaXRvcihhcnJheVswXSwgYXJyYXlbMV0pOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG9wZW5FZGl0b3IoU3RyaW5nIHJlc291cmNlLCBTdHJpbmcgc3BlYykKLSAgewotICAgIFN0cmluZyBwYXR0ZXJuID0gInBsYXRmb3JtOi9yZXNvdXJjZSI7Ci0gICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2Uuc3RhcnRzV2l0aChwYXR0ZXJuKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgocmVzb3VyY2Uuc3Vic3RyaW5nKHBhdHRlcm4ubGVuZ3RoKCkpKTsKLSAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQotICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCAmJgotICAgICAgICAgICAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKQotICAgICAgICB7ICAKLQkJCSAgICBJTmF2aWdhdGlvbkxvY2F0aW9uIGN1cnJlbnQgPSB3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkuZ2V0Q3VycmVudExvY2F0aW9uKCk7Ci0gICAgICAgIAl3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkubWFya0xvY2F0aW9uKGVkaXRvclBhcnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZXNvdXJjZS5lbmRzV2l0aCgieHNkIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVkaXRvclBhcnQgPSB3b3JrYmVuY2hQYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgV1NETEVkaXRvclBsdWdpbi5YU0RfRURJVE9SX0lEKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBhbHJlYWR5IGluIHRoZSB3c2RsZWRpdG9yCi0JCQkgICAgICAgIGVkaXRvclBhcnQgPSAgd29ya2JlbmNoUGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksIGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGluaXRFeCkKLSAJCQkJCXsKLSAJCQkJCX0KLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzIHRoZUNsYXNzID0gZWRpdG9yUGFydC5nZXRDbGFzcygpOwotICAgICAgICBDbGFzc1tdIG1ldGhvZEFyZ3MgPSB7IFN0cmluZy5jbGFzcyB9OwotICAgICAgICBNZXRob2QgbWV0aG9kID0gdGhlQ2xhc3MuZ2V0TWV0aG9kKCJvcGVuT25TZWxlY3Rpb24iLCBtZXRob2RBcmdzKTsKLSAgICAgICAgT2JqZWN0IGFyZ3NbXSA9IHsgc3BlYyB9OwotICAgICAgICBtZXRob2QuaW52b2tlKGVkaXRvclBhcnQsIGFyZ3MpOwotICAgICAgICB3b3JrYmVuY2hQYWdlLmdldE5hdmlnYXRpb25IaXN0b3J5KCkubWFya0xvY2F0aW9uKGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmdbXSBjb21wdXRlU3BlY2lmaWNhdGlvbihFT2JqZWN0IGVPYmplY3QpCi0gIHsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotICAgIE9iamVjdCByZWZlcmVuY2VkT2JqZWN0ID0gZG9Td2l0Y2goZU9iamVjdCk7Ci0gICAgaWYgKHJlZmVyZW5jZWRPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotICAgIHsKLSAgICAgIEVPYmplY3QgcmVmZXJlbmNlZEVPYmplY3QgPSAoRU9iamVjdClyZWZlcmVuY2VkT2JqZWN0OwotICAgICAgaWYgKHJlZmVyZW5jZWRFT2JqZWN0ICE9IGVPYmplY3QgfHwgCi0gICAgICAgICByZWZlcmVuY2VkRU9iamVjdC5lUmVzb3VyY2UoKSAhPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpKQotICAgICAgeyAgICAgICAgCi0gICAgICAKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gcmVmZXJlbmNlZEVPYmplY3QuZVJlc291cmNlKCk7Ci0gICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICAgICAgcmVzdWx0WzBdID0gcmVzb3VyY2UuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLSAgICAgICAgcmVzdWx0WzFdID0gcmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQocmVmZXJlbmNlZEVPYmplY3QpOwotICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFN0cmluZ1tdIGNvbXB1dGVTcGVjaWZpY2F0aW9uKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgIGF0dHIgPSAoQXR0cilub2RlOwotICAgICAgICAgIGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgZWxlbWVudCA9IChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSA/IChFbGVtZW50KXBhcmVudCA6IG51bGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5maW5kTW9kZWxPYmplY3RGb3JFbGVtZW50KGRlZmluaXRpb24sIGVsZW1lbnQpOwotICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGNvbXB1dGVTcGVjaWZpY2F0aW9uKChFT2JqZWN0KW9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBiaW5kaW5nOwotICAgIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlUGFydChQYXJ0IHBhcnQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gcGFydDsKLSAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChpc01hdGNoaW5nQXR0cmlidXRlKFdTRExDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEUpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFydC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgPT0gZGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSBwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkgIT0gbnVsbCA/IChPYmplY3QpcGFydC5nZXRUeXBlRGVmaW5pdGlvbigpIDogKE9iamVjdClwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IHBvcnQ7Ci0gICAgaWYgKGlzTWF0Y2hpbmdBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5CSU5ESU5HX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gcG9ydC5nZXRFQmluZGluZygpOwotCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBmYXVsdDsKLSAgICBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmYXVsdC5nZXRNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBpbnB1dDsKLSAgICBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBvdXRwdXQ7Ci0KLSAgICBpZiAoaXNNYXRjaGluZ0F0dHJpYnV0ZShXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBvdXRwdXQuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBjYXNlSW1wb3J0KEltcG9ydCB0aGVJbXBvcnQpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gdGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRoZUltcG9ydC5nZXRFU2NoZW1hKCk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIE5lZWQgdG8gcmVzb2x2ZSBpbXBvcnRzIGJlY2F1c2UgdGhlIG1vZGVsIGRvZXNuJ3QgYXV0b21hdGljYWxseQotICAgICAgICAvLyBkbyBpdCBmb3IgdXMKLSAgICAgICAgKChJbXBvcnRJbXBsKXRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICAgIHJlc3VsdCA9IHRoZUltcG9ydC5nZXRFU2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIHJldHVybiB3c2RsRWxlbWVudDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc01hdGNoaW5nQXR0cmlidXRlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiBhdHRyICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKGF0dHIuZ2V0TmFtZSgpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1JlZmVyZW5jZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvUmVmZXJlbmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjYwN2VmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvUmVmZXJlbmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLSAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExTd2l0Y2g7Ci0KLQotcHVibGljIGNsYXNzIFJlZmVyZW5jZU1hbmFnZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBzdGF0aWMgSW50ZXJuYWxBZGFwdGVyRmFjdG9yeSBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5ID0gbmV3IEludGVybmFsQWRhcHRlckZhY3RvcnkoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBiaW5kaW5nc0NoYW5nZWQoIE9wZXJhdGlvbiBvcGVyYXRpb24pOwotICB9ICAgICAKLQotICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGFwdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgaW50ZXJuYWxBZGFwdGVyRmFjdG9yeS5hZGFwdChkZWZpbml0aW9uKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpaS5uZXh0KCk7Ci0gICAgICBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5LmFkYXB0QmluZGluZyhiaW5kaW5nKTsKLSAgICB9Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQmluZGluZ0xpc3RlbmVyKE9wZXJhdGlvbiBvcGVyYXRpb24sIExpc3RlbmVyIGxpc3RlbmVyKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBPcGVyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoT3BlcmF0aW9uQWRhcHRlcilpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9wZXJhdGlvbik7Ci0gICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGFwdGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsgCi0gICAgfQotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQmluZGluZ0xpc3RlbmVyKE9wZXJhdGlvbiBvcGVyYXRpb24sIExpc3RlbmVyIGxpc3RlbmVyKQotICB7IAotICAgIE9wZXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChPcGVyYXRpb25BZGFwdGVyKWludGVybmFsQWRhcHRlckZhY3RvcnkuYWRhcHQob3BlcmF0aW9uKTsKLSAgICBpZiAoYWRhcHRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkYXB0ZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOyAKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmlyZU5vdGlmaWNhdGlvbkZvclBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgLy8gZ2V0IHRoZSBhZGFwdGVyIGZvciBlYWNoIG9wZXJhdGlvbiBhbmQgbm90aWZ5IGxpc3RlbmVycwotICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgIGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JPcGVyYXRpb24oKE9wZXJhdGlvbilpLm5leHQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmlyZU5vdGlmaWNhdGlvbkZvck9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChPcGVyYXRpb25BZGFwdGVyKWludGVybmFsQWRhcHRlckZhY3RvcnkuYWRhcHQob3BlcmF0aW9uKTsKLSAgICAgIGFkYXB0ZXIuZmlyZUJpbmRpbmdzQ2hhbmdlZCgpOwotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi0gIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBXU0RMU3dpdGNoIHdzZGxTd2l0Y2ggPSBuZXcgV1NETFN3aXRjaCgpCi0gICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgCXB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICAgICAgICB7ICAgCi0gICAgICAgICAgcmV0dXJuIGNyZWF0ZUJpbmRpbmdBZGFwdGVyKCk7Ci0JICAgICAgfQotCi0gCSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0KQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0ZhdWx0QWRhcHRlcigpOwotICAgICAgICB9ICAgCi0KLQkgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gCi0gICAKLSAgICAgIAlwdWJsaWMgT2JqZWN0IGNhc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgICAgICAgeyAgIAotICAgICAgICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gIAotCi0gICAgICAJcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gICAgICAgIHsgICAKLSAgICAgICAgICByZXR1cm4gY3JlYXRlT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9OyAgIAotCi0gICAgICBPYmplY3QgbyA9IHdzZGxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQotICAgICAgQWRhcHRlciByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBZGFwdGVyKQotICAgICAgewotICAgICAgICByZXN1bHQgID0gKEFkYXB0ZXIpbzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZGlkIG5vdCBjcmVhdGUgYWRhcHRlciBmb3IgdGFyZ2V0IDogIiArIHRhcmdldCk7Ci0gICAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlQWRhcHRlcigiICsgdGFyZ2V0ICsgIikgIiArIHJlc3VsdCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0FkYXB0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQmluZGluZ0FkYXB0ZXIoKTsKLSAgICB9ICAgICAgICAKLQotIAkgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJpbmRpbmdGYXVsdEFkYXB0ZXIoKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nRmF1bHRBZGFwdGVyKCk7Ci0gICAgfSAgICAgCi0KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpCi0gICAgeyAgICAgCi0gICAgICByZXR1cm4gbmV3IEJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgfSAgICAgIAotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWZpbml0aW9uQWRhcHRlcigpIAotICAgIHsKLQkJICByZXR1cm4gbmV3IERlZmluaXRpb25BZGFwdGVyKCk7Ci0JICB9IAotCi0gIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVPcGVyYXRpb25BZGFwdGVyKCkgCi0gICAgewotCQkgIHJldHVybiBuZXcgT3BlcmF0aW9uQWRhcHRlcigpOwotCSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQpCi0gICAgewotICAgICAgcmV0dXJuIHRhcmdldCAhPSBudWxsID8gYWRhcHQodGFyZ2V0LCBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5KSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRhcHRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgICAgIAotICAgIHsKLSAgICAgIGFkYXB0KGJpbmRpbmcpOyAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIGFkYXB0KGJpbmRpbmdPcGVyYXRpb24pOyAgICAKLSAgICAgICAgZm9yIChJdGVyYXRvciBqID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdClqLm5leHQoKTsKLSAgICAgICAgICBhZGFwdChiaW5kaW5nRmF1bHQpOyAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgfSAgCi0gIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQmFzZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbAotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBpbnRlcm5hbEFkYXB0ZXJGYWN0b3J5OwotICAgIH0gICAKLQotICAgIHB1YmxpYyBXU0RMUGFja2FnZSBnZXRQYWNrYWdlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgfQotCi0gICAgCi0gIC8vIERlZmluaXRpb25BZGFwdGVyCi0gIC8vCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRGVmaW5pdGlvbkFkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSA9PSBnZXRQYWNrYWdlKCkuZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgT2JqZWN0IG5ld1ZhbHVlID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0gICAgICAgIHN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREOgotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGhhbmRsZUFkZCgoQmluZGluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBuZXdWYWx1ZXMgPSAoKENvbGxlY3Rpb24pbmV3VmFsdWUpLml0ZXJhdG9yKCk7ICBuZXdWYWx1ZXMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZUFkZCgoQmluZGluZyluZXdWYWx1ZXMubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9ICAgIAotICAgIH0gICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkKEJpbmRpbmcgYmluZGluZykKLSAgICB7ICAKLSAgICAgIGludGVybmFsQWRhcHRlckZhY3RvcnkuYWRhcHRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotICAgICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICB9ICAgICAKLSAgICAgICAgICAKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmluZGluZ0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlcgotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7IAotICAgICAgaWYgKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSA9PSBnZXRQYWNrYWdlKCkuZ2V0QmluZGluZ19FUG9ydFR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gZmlyZU5vdGlmY2F0aW9uIGZvciBhbGwgb2YgdGhlIG9wZXJhdGlvbiBvZiB0aGUgb2xkIGFuZCBuZXcgcG9ydFR5cGUKLSAgICAgICAgZmlyZU5vdGlmaWNhdGlvbkZvclBvcnRUeXBlKChQb3J0VHlwZSltc2cuZ2V0TmV3VmFsdWUoKSk7Ci0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JQb3J0VHlwZSgoUG9ydFR5cGUpbXNnLmdldE9sZFZhbHVlKCkpOwotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgZWxzZSBpZiAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSltc2cuZ2V0RmVhdHVyZSgpID09IGdldFBhY2thZ2UoKS5nZXRCaW5kaW5nX0VCaW5kaW5nT3BlcmF0aW9ucygpKQotICAgICAgewotICAgICAgICAvLyBmaXJlTm90aWZjYXRpb24gZm9yIGFsbCBvcGVyYXRpb25zIHRoYXQgd2VyZSBhZGRlZCBvciByZW1vdmVkCi0gICAgICAgIE9iamVjdCBuZXdWYWx1ZSA9IG1zZy5nZXROZXdWYWx1ZSgpOwotICAgICAgICBPYmplY3Qgb2xkVmFsdWUgPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLSAgICAgICAgc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBoYW5kbGVBZGQoKEJpbmRpbmdPcGVyYXRpb24pbmV3VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbmV3VmFsdWVzID0gKChDb2xsZWN0aW9uKW5ld1ZhbHVlKS5pdGVyYXRvcigpOyAgbmV3VmFsdWVzLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBoYW5kbGVBZGQoKEJpbmRpbmdPcGVyYXRpb24pbmV3VmFsdWVzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAgICAgIAotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgoQmluZGluZ09wZXJhdGlvbilvbGRWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBvbGRWYWx1ZXMgPSAoKENvbGxlY3Rpb24pb2xkVmFsdWUpLml0ZXJhdG9yKCk7ICBvbGRWYWx1ZXMuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgoQmluZGluZ09wZXJhdGlvbilvbGRWYWx1ZXMubmV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfSAgICAKLQotICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZChCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gICAgewotICAgICAgaW50ZXJuYWxBZGFwdGVyRmFjdG9yeS5hZGFwdChiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmaXJlTm90aWZpY2F0aW9uRm9yT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgIH0KLSAgICB9ICAgCi0gIH0gICAgICAgCi0gIAotCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBCaW5kaW5nT3BlcmF0aW9uQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKWdldFRhcmdldCgpOwotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZU9wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGZpcmVOb3RpZmljYXRpb25Gb3JPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICB9ICAgICAgICAgICAgICAgIAotICB9Ci0gIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmluZGluZ0ZhdWx0QWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KWdldFRhcmdldCgpOwotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pYmluZGluZ0ZhdWx0LmVDb250YWluZXIoKTsKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmNvbXB1dGVPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBmaXJlTm90aWZpY2F0aW9uRm9yT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgfSAgICAgICAgICAgICAgICAKLSAgfSAKLSAgCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBPcGVyYXRpb25BZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgCi0gIHsgICAgIAotICAgIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gICAgcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgZmlyZUJpbmRpbmdzQ2hhbmdlZCgpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKWdldFRhcmdldCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIgPSAoTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICAgIGxpc3RlbmVyLmJpbmRpbmdzQ2hhbmdlZChvcGVyYXRpb24pOwotICAgICAgfQotICAgIH0gICAgICAgICAKLSAgfSAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvU2VsZWN0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMWZkYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBoZWxwIHN5bmNyb25pemUgc2VsZWN0aW9ucyBiZXR3ZWVuIHR3byBtb2RlbHMuCi0vLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIKLXsgCi0gIHByb3RlY3RlZCBMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLSAgcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBldmVudFNvdXJjZTsKLQotICBwdWJsaWMgdm9pZCBzZXRFdmVudFNvdXJjZShJU2VsZWN0aW9uUHJvdmlkZXIgZXZlbnRTb3VyY2UpCi0gIHsKLSAgICB0aGlzLmV2ZW50U291cmNlID0gZXZlbnRTb3VyY2U7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICB9ICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSAKLSAgewotICAgIHJldHVybiBzZWxlY3Rpb247Ci0gIH0gICAgCi0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNwZWNpYWxpemVkIHRvIHJldHVybiB0aGUgY29ycmVjdCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgJ290aGVyJyBtb2RlbAotICAgKi8KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3RGb3JPdGhlck1vZGVsKE9iamVjdCBvYmplY3QpOwotCi0gICAgCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIG1vZGVsU2VsZWN0aW9uKSAgCi0gIHsgCi0gICAgTGlzdCBvdGhlck1vZGVsT2JqZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAobW9kZWxTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKW1vZGVsU2VsZWN0aW9uKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbW9kZWxPYmplY3QgPSBpLm5leHQoKTsgCi0gICAgICAgIE9iamVjdCBvdGhlck1vZGVsT2JqZWN0ID0gZ2V0T2JqZWN0Rm9yT3RoZXJNb2RlbChtb2RlbE9iamVjdCk7ICAgICAgIAotICAgICAgICBpZiAob3RoZXJNb2RlbE9iamVjdCAhPSBudWxsKQotICAgICAgICB7IAotICAgICAgICAgIG90aGVyTW9kZWxPYmplY3RMaXN0LmFkZChvdGhlck1vZGVsT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAKLSAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIG5vZGVTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvdGhlck1vZGVsT2JqZWN0TGlzdCk7Ci0gICAgc2VsZWN0aW9uID0gbm9kZVNlbGVjdGlvbjsKLSAgICBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KGV2ZW50U291cmNlICE9IG51bGwgPyBldmVudFNvdXJjZSA6IHRoaXMsIG5vZGVTZWxlY3Rpb24pOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKWkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9WYWxpZGF0ZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9WYWxpZGF0ZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDNjMjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvVmFsaWRhdGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZUhlbHBlcgotewotICAvLyBYTUwgTGFuZyBjYW4gaGF2ZSBtYW55IGRpZmZlcmVudCB2YWxpZCBmb3JtYXRzCi0gIC8vIDEpIHh4ICAgICAgaWUuIGVuLCBmciwgZGUKLSAgLy8gMikgeHgteHggICBpZS4gZW4tVVMsIGVuLUZSCi0gIC8vIDMpIEkteHggICAgaWUuIEktZW4KLSAgLy8gNCkgWC14eCAgICBpZS4gWC1lbgotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1hNTExhbmcoU3RyaW5nIGxhbmcpCi0gIHsKLSAgICBpZiAobGFuZy5sZW5ndGgoKSA9PSAwKSAKLSAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIGlmIChsYW5nLmxlbmd0aCgpID09IDEpIAotICAgIHsKLSAgICAgIGNoYXIgY2gwID0gbGFuZy5jaGFyQXQoMCk7Ci0gICAgICBpZiAoKGNoMCA+PSAnYScgJiYgY2gwIDw9ICd6JykgfHwgKGNoMCA+PSAnQScgJiYgY2gwIDw9ICdaJykpCi0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTEFOR19UT09fU0hPUlQiKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2gwICsgCi0gICAgICAgIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfTkFNRV9JTlZBTElEX0NIQVJfRU5EIik7ICAgICAgICAgIAotICAgIH0KLSAgICAKLSAgICBpbnQgb2Zmc2V0OwotCi0gICAgY2hhciBjaDAgPSBsYW5nLmNoYXJBdCgwKTsKLSAgICBpZiAobGFuZy5jaGFyQXQoMSkgPT0gJy0nKSAKLSAgICB7Ci0gICAgICBpZiAoY2gwID09ICdpJyB8fCBjaDAgPT0gJ0knIHx8IGNoMCA9PSAneCcgfHwgY2gwID09ICdYJykgCi0gICAgICAgIG9mZnNldCA9IDE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0NIQVIiKSArIGNoMCArIAotICAgICAgICBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgY2hhciBjaDEgPSBsYW5nLmNoYXJBdCgxKTsKLSAgICAgIGlmICgoY2gwID49ICdhJyAmJiBjaDAgPD0gJ3onKSB8fCAoY2gwID49ICdBJyAmJiBjaDAgPD0gJ1onKSkKLSAgICAgICAgaWYgKChjaDEgPj0gJ2EnICYmIGNoMSA8PSAneicpIHx8IChjaDEgPj0gJ0EnICYmIGNoMSA8PSAnWicpKQotICAgICAgICAgIG9mZnNldCA9IDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaDEgKyAKLSAgICAgICAgICBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaDAgKyAKLSAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsKLSAgICB9Ci0KLSAgICBpZiAobGFuZy5sZW5ndGgoKSA+IG9mZnNldCkgCi0gICAgewotICAgICAgY2hhciBjaCA9IGxhbmcuY2hhckF0KG9mZnNldCsrKTsKLSAgICAgIGlmIChjaCAhPSAnLScpIAotICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0hZUEhFTl9ORUVERUQiKSArIEludGVnZXIudG9TdHJpbmcob2Zmc2V0LTEpOyAgICAgICAgCi0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICB3aGlsZSAodHJ1ZSkgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2ggPT0gJy0nKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobGFuZy5sZW5ndGgoKSA9PSBvZmZzZXQpIAotICAgICAgICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0hZUEhFTl9FTkRJTkciKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY2ggPSBsYW5nLmNoYXJBdChvZmZzZXQrKyk7Ci0gICAgICAgICAgICBpZiAoKGNoIDwgJ2EnIHx8IGNoID4gJ3onKSAmJiAoY2ggPCAnQScgfHwgY2ggPiAnWicpKSAKLSAgICAgICAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9OQU1FX0lOVkFMSURfQ0hBUiIpICsgY2ggKyAKLSAgICAgICAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGxhbmcubGVuZ3RoKCkgPT0gb2Zmc2V0KQotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgaWYgKChjaCA8ICdhJyB8fCBjaCA+ICd6JykgJiYgKGNoIDwgJ0EnIHx8IGNoID4gJ1onKSkgCi0gICAgICAgICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaCArIAotICAgICAgICAgICAgVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9OQU1FX0lOVkFMSURfQ0hBUl9FTkQiKTsgICAgICAgICAgICAgCi0gICAgICAgICAgZWxzZSBpZiAobGFuZy5sZW5ndGgoKSA9PSBvZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICBjaCA9IGxhbmcuY2hhckF0KG9mZnNldCsrKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBtaW4gdmFsdWUgaXMgY29ycmVjdC4KLSAgICogQSBtaW5pbXVtIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCA8IG1heFZhbHVlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBpc1ZhbGlkTWluVmFsdWUoU3RyaW5nIG1pblZhbHVlLCBTdHJpbmcgbWF4VmFsdWUpCi0gIHsKLSAgICBpbnQgbWluOwotCi0gICAgaWYgKG1pblZhbHVlID09IG51bGwgfHwgbWluVmFsdWUuZXF1YWxzKCIiKSkKLSAgICB7Ci0gICAgICAvLyBOb3RoaW5nIHRvIGNoZWNrCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBtaW4gPSBJbnRlZ2VyLnBhcnNlSW50KG1pblZhbHVlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9NSU5fTk9UX1BPU0lUSVZFIik7Ci0gICAgfQotCi0gICAgaWYgKG1pbiA8IDApIAotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX01JTl9OT1RfUE9TSVRJVkUiKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpbnQgbWF4ID0gSW50ZWdlci5wYXJzZUludChtYXhWYWx1ZSk7Ci0gICAgICBpZiAobWluID4gbWF4KSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfRVJST1JfTUlOX1ZBTFVFIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgLy8gTWF4IGlzIG5vdCBhY2N1cmF0ZS4gRG9uJ3QgY29tcGFyZSBpdC4KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYXggdmFsdWUgaXMgY29ycmVjdC4KLSAgICogQSBtYXhpbXVtIHZhbHVlIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCA+IG1pblZhbHVlCi0gICAqCi0gICAqIEl0IGNhbiBhbHNvIGJlIHNldCB0aGUgc3RyaW5nICJ1bmJvdW5kZWQiCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBpc1ZhbGlkTWF4VmFsdWUoU3RyaW5nIG1heFZhbHVlLCBTdHJpbmcgbWluVmFsdWUpCi0gIHsKLSAgICBpbnQgbWF4OwotCi0gICAgaWYgKG1heFZhbHVlID09IG51bGwgfHwgbWF4VmFsdWUuZXF1YWxzKCIiKSkgCi0gICAgewotICAgICAgLy8gTm90aGluZyB0byBjaGVjawotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaWYgKG1heFZhbHVlLmVxdWFscygidW5ib3VuZGVkIikpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgbWF4ID0gSW50ZWdlci5wYXJzZUludChtYXhWYWx1ZSk7Ci0gICAgfQotICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfRVJST1JfTUFYX05PVF9QT1NJVElWRSIpOwotICAgIH0KLQotICAgIGlmIChtYXggPCAwKSAKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9NQVhfTk9UX1BPU0lUSVZFIik7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IG1pbiA9IEludGVnZXIucGFyc2VJbnQobWluVmFsdWUpOwotICAgICAgaWYgKG1heCA8IG1pbikgCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX0VSUk9SX01BWF9WQUxVRSIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIC8vIE1pbiBpcyBub3QgYWNjdXJhdGUuIERvbid0IGNvbXBhcmUgaXQuCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBuYW1lIGNvbmZvcm1zIHRvIHRoZSBYTUwgc3BlYwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tYTUxOYW1lKFN0cmluZyBuYW1lLCBib29sZWFuIGFsbG93RW50aXR5UmVmKQotICB7Ci0gICAgaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0gICAgY2hhciBjaGFyYWN0ZXI7Ci0KLSAgICBpZiAobGVuZ3RoID09IDApIAotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfTVVTVF9DT05UQUlOX0FUX0xFQVNUX09ORV9DSEFSIik7Ci0gICAgfQotICAgIAotICAgIGlmIChuYW1lLmluZGV4T2YoIiAiKSA+PSAwKQotICAgIHsKLSAgICAgIHJldHVybihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfSEFTX1NQQUNFIikpOwotICAgIH0KLQotICAgIGludCBpbmRleCA9IDA7Ci0gICAgaWYgKGxlbmd0aCA+IDAgJiYKLSAgICAgICAgbmFtZS5jaGFyQXQoMCkgPT0gJyUnKQotICAgIHsKLSAgICAgIGlmIChhbGxvd0VudGl0eVJlZikgCi0gICAgICB7Ci0gICAgICAgIC8vIHNraXAgb3ZlciB0aGUgZmlyc3QgY2hhcmFjdGVyIAotICAgICAgICBpbmRleCsrOwotICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1dBUk5fTkFNRV9JTlZBTElEX0ZJUlNUIik7Ci0gICAgICB9IC8vIGVuZCBvZiBlbHNlCi0gICAgfQotICAgIAotICAgIGZvcig7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGNoYXJhY3RlciA9IG5hbWUuY2hhckF0KGluZGV4KTsKLQotICAgICAgaWYoaW5kZXggPT0gMCkKLSAgICAgIHsKLSAgICAgICAgaWYoICFpc1hNTE5hbWVTdGFydChjaGFyYWN0ZXIpICkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9GSVJTVCIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmKCFpc1hNTE5hbWVDaGFyKGNoYXJhY3RlcikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKGluZGV4ID09IGxlbmd0aCAtIDEpICYmIC8vY2hlY2sgaWYgdGhlIGxhc3QgY2hhcmFjdGVyIGlzIGEgJzsnCi0gICAgICAgICAgICAgIGFsbG93RW50aXR5UmVmICYmCi0gICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAnOycpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gd2UncmUgc3RpbGwgb2sgdGhlbgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfSAvLyBlbmQgb2YgaWYgKCkKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9XQVJOX05BTUVfSU5WQUxJRF9DSEFSIikgKyBjaGFyYWN0ZXIgKyAKLSAgICAgICAgICAgIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX05BTUVfSU5WQUxJRF9DSEFSX0VORCIpOwotICAgICAgICAgIH0gLy8gZW5kIG9mIGVsc2UKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgbmFtZSBjb25mb3JtcyB0byB0aGUgWE1MIHNwZWMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrWE1MTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBjaGVja1hNTE5hbWUobmFtZSwgZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIGlzWE1MTmFtZVN0YXJ0Ci0gICAqKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1hNTE5hbWVTdGFydChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA9PSAnXycgfHwgY2ggPT0gJzonIHx8IENoYXJhY3Rlci5pc0xldHRlcihjaCkgKTsKLSAgfQotCi0gIC8qKgotICAgKiBpc1hNTE5hbWVDaGFyCi0gICAqKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1hNTE5hbWVDaGFyKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJ18nIHx8IGNoID09ICc6Jyk7Ci0gIH0KLQotICAvKioKLSAgICogaXNYTUxQcmVmaXhTdGFydAotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxQcmVmaXhTdGFydChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA9PSAnXycgfHwgQ2hhcmFjdGVyLmlzTGV0dGVyKGNoKSApOwotICB9Ci0KLSAgLyoqCi0gICAqIGlzWE1MUHJlZml4Q2hhcgotICAgKiovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYTUxQcmVmaXhDaGFyKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJ18nKTsKLSAgfQotCi0gIC8qKgotICAgKiBwYXJzZUVsZW1lbnRUZXh0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUVsZW1lbnRUZXh0KFN0cmluZyB0ZXh0KQotICB7Ci0gICAgaWYgKHRleHQuaW5kZXhPZignPCcpICE9IC0xIHx8IHRleHQuaW5kZXhPZignPicpICE9IC0xKQotICAgIHsKLSAgICAgIHJldHVybiBVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fRUxFTUVOVF9JTlZBTElEX0NIQVIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VBdHRyaWJ1dGVWYWx1ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VBdHRyaWJ1dGVWYWx1ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUuaW5kZXhPZignIicpICE9IC0xIHx8IHZhbHVlLmluZGV4T2YoJzwnKSAhPSAtMSB8fCB2YWx1ZS5pbmRleE9mKCc+JykgIT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9BVFRSSUJVVEVfSU5WQUxJRF9DSEFSIik7Ci0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogcGFyc2VBREFUQVNlY3Rpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlQ0RBVEFTZWN0aW9uKFN0cmluZyBzZWN0aW9uKQotICB7Ci0gICAgaWYgKHNlY3Rpb24uaW5kZXhPZigiXV0+IikgIT0gLTEpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9DREFUQV9JTlZBTElEX1NUUklORyIpOwotCi0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIHBhcnNlUHJvY2Vzc2lpbmdJbnN0cnVjdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EYXRhKFN0cmluZyBkYXRhKQotICB7Ci0gICAgaWYgKGRhdGEuaW5kZXhPZigiPz4iKSAhPSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX1BST0NFU1NJTkdfSU5WQUxJRF9TVFJJTkciKTsKLQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBwYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvblRhcmdldAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25UYXJnZXQoU3RyaW5nIHRhcmdldCkKLSAgewotICAgIGlmICh0YXJnZXQubGVuZ3RoKCkgPT0gMyAmJiAodGFyZ2V0LmluZGV4T2YoIlhNTCIpICE9IC0xIHx8IHRhcmdldC5pbmRleE9mKCJYTWwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigiWG1MIikgIT0gLTEgfHwKLSAgICAgICAgdGFyZ2V0LmluZGV4T2YoInhNTCIpICE9IC0xIHx8IHRhcmdldC5pbmRleE9mKCJYbWwiKSAhPSAtMSB8fCB0YXJnZXQuaW5kZXhPZigieE1sIikgIT0gLTEgfHwKLSAgICAgICAgdGFyZ2V0LmluZGV4T2YoInhtTCIpICE9IC0xIHx8IHRhcmdldC5pbmRleE9mKCJ4bWwiKSAhPSAtMSkpCi0gICAgewotICAgICAgcmV0dXJuIFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTl9QUk9DRVNTSU5HX1RBUkdFVF9JTlZBTElEX1NUUklORyIpOwotCi0gICAgfQotICAgIHJldHVybiBjaGVja1hNTE5hbWUodGFyZ2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBwYXJzQ29tbWVudAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyc2VDb21tZW50KFN0cmluZyBjb21tZW50KQotICB7Ci0gICAgaWYgKGNvbW1lbnQuaW5kZXhPZigiLS0iKSAhPSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm4gVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9XQVJOX0NPTU1FTlRfSU5WQUxJRF9TVFJJTkciKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgcHJlZml4IGNvbmZvcm1zIHRvIHRoZSBYTUwgc3BlYwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tYTUxQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgewotICAgIGludCBsZW5ndGggPSBwcmVmaXgubGVuZ3RoKCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBjaGFyIGNoYXJhY3RlcjsKLSAgICAKLSAgICBpZiAocHJlZml4LmluZGV4T2YoIiAiKSA+PSAwKQotICAgIHsKLSAgICAgIHJldHVybihVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1dBUk5fUFJFRklYX0hBU19TUEFDRSIpKTsKLSAgICB9Ci0gICAgCi0gICAgZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGNoYXJhY3RlciA9IHByZWZpeC5jaGFyQXQoaW5kZXgpOwotCi0gICAgICBpZighaXNYTUxQcmVmaXhDaGFyKGNoYXJhY3RlcikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJfV0FSTl9QUkVGSVhfSU5WQUxJRF9DSEFSIiwgU3RyaW5nLnZhbHVlT2YoY2hhcmFjdGVyKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMRWRpdG9yVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODIxYjk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETEVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSVR5cGVTeXN0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETEVkaXRvclV0aWwgZXh0ZW5kcyBXU0RMQ29uc3RhbnRzCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgV1NETEVkaXRvclV0aWwgaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBOb2RlQXNzb2NpYXRpb25NYW5hZ2VyIG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIgPSBuZXcgTm9kZUFzc29jaWF0aW9uTWFuYWdlcigpOwotCi0gIHByb3RlY3RlZCBIYXNoTWFwIGVsZW1lbnROYW1lVG9UeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICBwdWJsaWMgc3RhdGljIFdTRExFZGl0b3JVdGlsIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IFdTRExFZGl0b3JVdGlsKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIHB1YmxpYyBXU0RMRWRpdG9yVXRpbCgpCi0gIHsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoQklORElOR19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoQklORElORykpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChERUZJTklUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihERUZJTklUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKERPQ1VNRU5UQVRJT04pKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoRkFVTFRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKEZBVUxUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KElNUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoSU1QT1JUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KElOUFVUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihJTlBVVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChNRVNTQUdFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihNRVNTQUdFKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KE9QRVJBVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoT1BFUkFUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KE9VVFBVVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoT1VUUFVUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFBBUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBBUlQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoUE9SVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoUE9SVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChQT1JUX1RZUEVfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBPUlRfVFlQRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChTRVJWSUNFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihTRVJWSUNFKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFRZUEVTX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihUWVBFUykpOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRXU0RMVHlwZShFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0KLSAgICBJbnRlZ2VyIGludGVnZXIgPSAoSW50ZWdlcillbGVtZW50TmFtZVRvVHlwZU1hcC5nZXQoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgaWYgKGludGVnZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpbnRlZ2VyLmludFZhbHVlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTGlzdCBnZXRQYXJlbnRFbGVtZW50Q2hhaW4oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHdoaWxlIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQoMCwgZWxlbWVudCk7Ci0gICAgICBOb2RlIG5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGVsZW1lbnQgPSAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudClub2RlIDogbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBFbGVtZW50IHRhcmdldEVsZW1lbnQpCi0gIHsKLSAgICBPYmplY3QgbyA9IG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIuZ2V0TW9kZWxPYmplY3RGb3JOb2RlKGRlZmluaXRpb24sIHRhcmdldEVsZW1lbnQpOwotICAgIHJldHVybiBvOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEZvck9iamVjdChPYmplY3QgbykKLSAgewotICAgIHJldHVybiAoKG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50KW8pLmdldEVsZW1lbnQoKTsKLSAgfQotCi0gIHB1YmxpYyBOb2RlIGdldE5vZGVGb3JPYmplY3QoT2JqZWN0IG8pCi0gIHsKLSAgICByZXR1cm4gbm9kZUFzc29jaWF0aW9uTWFuYWdlci5nZXROb2RlKG8pOwotICB9Ci0KLSAgLy8gUHJvdmlkZSBhIG1hcHBpbmcgYmV0d2VlbiBEZWZpbml0aW9ucyBhbmQgSVR5cGVTeXN0ZW1Qcm92aWRlcnMKLSAgcHJpdmF0ZSBIYXNodGFibGUgdHlwZVN5c3RlbVByb3ZpZGVycyA9IG5ldyBIYXNodGFibGUoKTsKLSAgCi0gIHB1YmxpYyBJVHlwZVN5c3RlbVByb3ZpZGVyIGdldFR5cGVTeXN0ZW1Qcm92aWRlcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICByZXR1cm4gKElUeXBlU3lzdGVtUHJvdmlkZXIpdHlwZVN5c3RlbVByb3ZpZGVycy5nZXQoZGVmaW5pdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRUeXBlU3lzdGVtUHJvdmlkZXIoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBJVHlwZVN5c3RlbVByb3ZpZGVyIHR5cGVTeXN0ZW1Qcm92aWRlcikKLSAgewotICAgIHR5cGVTeXN0ZW1Qcm92aWRlcnMucHV0KGRlZmluaXRpb24sdHlwZVN5c3RlbVByb3ZpZGVyKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUU5hbWUgY3JlYXRlUU5hbWUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgcHJlZml4ZWROYW1lKQotICB7Ci0gICAgUU5hbWUgcW5hbWUgPSBudWxsOwotICAgIGlmIChwcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgaW5kZXggPSBwcmVmaXhlZE5hbWUuaW5kZXhPZigiOiIpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IChpbmRleCA9PSAtMSkgPyBudWxsIDogcHJlZml4ZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZShwcmVmaXgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gcHJlZml4ZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgIHFuYW1lID0gbmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcW5hbWU7Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudE5vZGVzKEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50KQotICB7Ci0gICAgLy8gRm9yIFR5cGVzLCBJIG5lZWQgdG8gZ2V0IGFsbCB0aGUgc2NoZW1hcwotICAgIGlmIChleHRlbnNpYmxlRWxlbWVudCBpbnN0YW5jZW9mIFR5cGVzKQotICAgIHsKLSAgICAgIFR5cGVzIHhzZEVFID0gKFR5cGVzKWV4dGVuc2libGVFbGVtZW50OwotICAgICAgcmV0dXJuIHhzZEVFLmdldFNjaGVtYXMoKTsKLSAgICB9Ci0gICAgLyoKLSAgICBMaXN0IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IGdldEVsZW1lbnRGb3JPYmplY3QoZXh0ZW5zaWJsZUVsZW1lbnQpOwotICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwpCi0gICAgewotCi0gICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGNoaWxkTGlzdC5hZGQobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgICB9Ci0gICAgICBIYXNoTWFwIGV4dGVuc2libGVFbGVtZW50VGFibGUgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudEZvck9iamVjdChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBleHRlbnNpYmxlRWxlbWVudFRhYmxlLnB1dChlbGVtZW50LCBlbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChJdGVyYXRvciBpID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGV4dGVuc2libGVFbGVtZW50VGFibGUuZ2V0KG8pID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGlsZExpc3Q7Ci0gICAgKi8KLSAgICByZXR1cm4gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICB9Ci0KLSAgLyoKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgJ2NoaWxkcmVuJyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IG1vZGVsIChXU0RMRWxlbWVudCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kZWxHcmFwaFZpZXdDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0gIAlMaXN0IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCQotICAJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBvcnRUeXBlKSB7Ci0gIAkJUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpIG9iamVjdDsKLSAgICAgICAgY2hpbGRMaXN0LmFkZEFsbChwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkpOwotICAJfQotICAJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3BlcmF0aW9uKSB7Ci0gIAkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG9iamVjdDsKLSAgCQkKLSAgCQlpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpIHsKLSAgCQkJY2hpbGRMaXN0LmFkZChvcGVyYXRpb24uZ2V0RUlucHV0KCkpOwotICAJCX0KLSAgCQlpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKSB7Ci0gIAkJCWNoaWxkTGlzdC5hZGQob3BlcmF0aW9uLmdldEVPdXRwdXQoKSk7Ci0gIAkJfQotICAJCWNoaWxkTGlzdC5hZGRBbGwob3BlcmF0aW9uLmdldEZhdWx0cygpLnZhbHVlcygpKTsKLSAgCX0KLSAgCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2VSZWZlcmVuY2UpIHsKLSAgCQlNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWZlcmVuY2UgPSAoTWVzc2FnZVJlZmVyZW5jZSkgb2JqZWN0OwotICAJCWNoaWxkTGlzdC5hZGQobWVzc2FnZVJlZmVyZW5jZS5nZXRFTWVzc2FnZSgpKTsKLSAgCX0gIAkKLSAgCQotICAJcmV0dXJuIGNoaWxkTGlzdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDcyNGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExNb2RlbExvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwKLXsKLSAgcHJvdGVjdGVkIEN1c3RvbVdTRExNb2RlbExvY2F0b3IgY3VzdG9tV1NETE1vZGVsTG9jYXRvciA9IG5ldyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yKCk7Ci0gIAotICBjbGFzcyBDdXN0b21XU0RMTW9kZWxMb2NhdG9yIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBXU0RMTW9kZWxMb2NhdG9yCi0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIHJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBuYW1lc3BhY2UsIGxvY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiB0eXBlID09IFdTRExNb2RlbExvY2F0b3IuY2xhc3M7Ci0gIH0KLQotICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICB7Ci0gICAgcmV0dXJuIGN1c3RvbVdTRExNb2RlbExvY2F0b3I7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9XU0RMTm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2YjM4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOyAgICAgIAotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklOb2RlQXNzb2NpYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RDb21wb25lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFdTRExOb2RlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElOb2RlQXNzb2NpYXRpb25Qcm92aWRlcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoT2JqZWN0IHBhcmVudE1vZGVsT2JqZWN0LCBFbGVtZW50W10gZWxlbWVudENoYWluLCBpbnQgc3RhcnQsIGludFtdIGVuZCkKLSAgeyAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IGN1cnJlbnRPYmplY3QgPSBwYXJlbnRNb2RlbE9iamVjdDsKLSAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbGVtZW50Q2hhaW4ubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgT2JqZWN0IG8gPSBnZXRNb2RlbE9iamVjdEhlbHBlcihjdXJyZW50T2JqZWN0LCBlbGVtZW50Q2hhaW5baV0pOwotICAgICAgaWYgKG8gPT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICBlbmRbMF0gPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICBjdXJyZW50T2JqZWN0ID0gbzsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIGN1cnJlbnRPYmplY3QgIT0gcGFyZW50TW9kZWxPYmplY3QgPyBjdXJyZW50T2JqZWN0IDogbnVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgcHVibGljIE5vZGUgZ2V0Tm9kZShPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgIHJldHVybiAoKFdTRExFbGVtZW50SW1wbCltb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBudWxsOwotICB9Ci0gICAgICAKLSAgcHJvdGVjdGVkIE9iamVjdCBnZXRNb2RlbE9iamVjdEhlbHBlcihPYmplY3QgcGFyZW50T2JqZWN0LCBFbGVtZW50IGVsZW1lbnROb2RlKQotICB7ICAgICAgICAgIAotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBjaGlsZENvbXBvbmVudExpc3QgPSAoKFdTRExFbGVtZW50SW1wbCkgcGFyZW50T2JqZWN0KS5nZXRNb2RlbE9iamVjdHMocGFyZW50T2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRDb21wb25lbnRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0KLSAgICAgIGlmIChvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgV1NETEVsZW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudCA9ICgoV1NETEVsZW1lbnRJbXBsKW8pLmdldEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvIGluc3RhbmNlb2YgWFNEQ29tcG9uZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIGVsZW1lbnQgPSAoKFhTRENvbXBvbmVudEltcGwpbykuZ2V0RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLQkJCWlmIChlbGVtZW50ID09IGVsZW1lbnROb2RlKQotCQkJewotCQkJCXJlc3VsdCA9IG87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLSAgfQotfSAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWU5MDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgV1NETFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLSAgcHVibGljIFdTRExQcmVmZXJlbmNlUGFnZSgpCi0gIHsKLSAgICBzdXBlcihGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlLkZMQVQpOwotICAgIHNldFByZWZlcmVuY2VTdG9yZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLSAgewotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkKLSAgewotICAgIENvbXBvc2l0ZSBwYXJlbnQgPSBnZXRGaWVsZEVkaXRvclBhcmVudCgpOwotCUdyaWRMYXlvdXQgcGFyZW50TGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQlwYXJlbnRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCXBhcmVudC5zZXRMYXlvdXQocGFyZW50TGF5b3V0KTsKLQkKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksIHNvbWUgY29udGV4dCBpZCBoZXJlKTsgCi0KLQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgZ3JvdXAuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfQ1JFQVRJTkdfRklMRVMiKSk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZ3JvdXAsIFNXVC5OVUxMKTsKLSAgICBHcmlkRGF0YSBkYXRhMSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGExLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhMS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhMS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhMSk7Ci0JCi0JU3RyaW5nIG5hbWVzcGFjZUxhYmVsID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUFJFRl9QQUdFX0RFRkFVTFRfVEFSR0VUX05BTUVTUEFDRSIpOyAKLSAgICBTdHJpbmdGaWVsZEVkaXRvciB0YXJnZXROYW1lc3BhY2UgPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IobmFtZXNwYWNlTGFiZWwsIG5hbWVzcGFjZUxhYmVsLCBjb21wb3NpdGUpOyAvLyBFeHRlcm5hbGl6ZQotICAgIEdyaWRMYXlvdXQgY29tcG9zaXRlTGF5b3V0ID0gKEdyaWRMYXlvdXQpY29tcG9zaXRlLmdldExheW91dCgpOwotICAgIGNvbXBvc2l0ZUxheW91dC5tYXJnaW5XaWR0aCA9IDU7ICAgLy8gRGVmYXVsdCB2YWx1ZQotICAgIGNvbXBvc2l0ZUxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBhZGRGaWVsZCh0YXJnZXROYW1lc3BhY2UpOwotICAgIHRhcmdldE5hbWVzcGFjZS5zZXRGb2N1cygpOwotCQotCVN0cmluZyBnZW5lcmF0ZUxhYmVsID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUFJFRl9QQUdFX0FVVE9fUkVHRU5FUkFURV9CSU5ESU5HIik7Ci0JQm9vbGVhbkZpZWxkRWRpdG9yIGdlbmVyYXRlQmluZGluZ09uU2F2ZSA9IG5ldyBCb29sZWFuRmllbGRFZGl0b3IoZ2VuZXJhdGVMYWJlbCwgZ2VuZXJhdGVMYWJlbCwgcGFyZW50KTsKLQlhZGRGaWVsZChnZW5lcmF0ZUJpbmRpbmdPblNhdmUpOwotCi0gICAgLyogRG8gd2UgbmVlZCB0aGlzIHByZWZlcmVuY2UgYmVsb3c/ICBJZiBzbywgY2hhbmdlIFdTRExFZGl0b3JQbHVnaW4uamF2YSBhbmQgdXNlIHRoaXMgcHJlZmVyZW5jZSBpbjoKLSAgICAgICBIdHRwQ29udGVudEdlbmVyYXRvci5qYXZhCi0gICAgICAgU29hcENvbnRlbnRHZW5lcmF0b3IuamF2YQotICAgICAgIFNvYXBQb3J0T3B0aW9uc1BhZ2UuamF2YQotICAgICovCi0vLyAgICBIdHRwUG9ydE9wdGlvbnNQYWdlLmphdmEgICAgU3RyaW5nRmllbGRFZGl0b3IgbG9jYXRpb24gPSBuZXcgU3RyaW5nRmllbGRFZGl0b3IoIkRlZnVhbHQgTG9jYXRpb246IiwgIkRlZmF1bHQgTG9jYXRpb246IiwgZWRpdG9yR3JvdXAxKTsgLy8gRXh0ZXJuYWxpemUKLS8vICAgIGFkZEZpZWxkKGxvY2F0aW9uKTsgICAgCi0gICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1dTRExSZXNvdXJjZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFJlc291cmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjFkZDE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvV1NETFJlc291cmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFEaXJlY3RpdmU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFJlc291cmNlVXRpbAotewotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVsb2FkRGlyZWN0aXZlcyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBSZXNvdXJjZSByb290UmVzb3VyY2UgPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpOwotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcm9vdFJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgaWYgKHJlc291cmNlICE9IHJvb3RSZXNvdXJjZSkKLSAgICAgIHsKLSAgICAgICAgLy8gIFRPRE8uLi4gY29uc2lkZXIgdW5sb2FkaW5nIHRoZSByZXNvdXJjZXMgIAkKLSAgICAgICAgLy8gIHJlc291cmNlLnVubG9hZCgpOwkJICAgICAgCi0gICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFJlbG9hZERpcmVjdGl2ZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZWxvYWREaXJlY3RpdmVWaXNpdG9yKCk7Ci0gICAgdmlzaXRvci52aXNpdERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgUmVsb2FkRGlyZWN0aXZlVmlzaXRvcgotICB7Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgdGhlSW1wb3J0KQotICAgIHsKLSAgICAgIC8vIGZvcmNlIHRoZSBpbXBvcnQgdG8gcmVsb2FkCi0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QodGhlSW1wb3J0KTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgICgoV1NETEVsZW1lbnRJbXBsKXRoZUltcG9ydCkuZWxlbWVudENoYW5nZWQoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0RTY2hlbWFEaXJlY3RpdmUoWFNEU2NoZW1hRGlyZWN0aXZlIGRpcmVjdGl2ZSkKLSAgICB7Ci0gICAgICAvLyBmb3JjZSB0aGUgc2NoZW1hIGRpcmVjdGl2ZSB0byByZWxvYWQKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRpcmVjdGl2ZS5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBkaXJlY3RpdmUuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0SW1wb3J0KChJbXBvcnQpIGkubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0KLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBvOwotICAgICAgICAgICAgICBpZiAoZS5nZXRTY2hlbWEoKSAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlzaXRTY2hlbWEoZS5nZXRTY2hlbWEoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNjaGVtYShYU0RTY2hlbWEgc2NoZW1hKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpLm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFEaXJlY3RpdmUpCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTRFNjaGVtYURpcmVjdGl2ZSgoWFNEU2NoZW1hRGlyZWN0aXZlKSBvKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFVSSVJlc29sdmVyIGltcGxlbWVudHMgV1NETE1vZGVsTG9jYXRvcgotICB7Ci0gICAgLy9JZFJlc29sdmVyIGlkUmVzb2x2ZXIgPSBuZXcgSWRSZXNvbHZlckltcGwobnVsbCwgdHJ1ZSk7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0KLSAgICBJbnRlcm5hbFVSSVJlc29sdmVyKCkKLSAgICB7ICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotICAgIHsKLSAgICAgIFN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZSwgbG9jYXRpb24pOwotCi0gICAgICAvLyBoZXJlJ3MgYW4gdWdseSBoYWNrLi4uIFBsYXRmb3JtLnJlc29sdmUoKSByZXR1cm5zIFdpbmRvd3MgZmlsZXMgd2l0aCB0aGUgcGF0dGVybiAiZmlsZTpEOi9oZWxsby54c2QiCi0gICAgICAvLyBidXQgRU1GJ3MgVVJJIGNsYXNzIGV4cGVjdHMgYSBwYXR0ZXJuIGxpa2UgdGhpcyAiZmlsZTovLy9EOi9oZWxsby54c2QiCi0gICAgICAvLyAgICAgICAgCi0gICAgICBpZiAocmVzb2x2ZWRMb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotCQlTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6IjsgICAgICAJCi0gICAgICAgIGlmIChyZXNvbHZlZExvY2F0aW9uLnN0YXJ0c1dpdGgoZmlsZVByb3RvY29sKSAmJiAhcmVzb2x2ZWRMb2NhdGlvbi5zdGFydHNXaXRoKGZpbGVQcm90b2NvbCArICIvIikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZWRMb2NhdGlvbi5zdWJzdHJpbmcoZmlsZVByb3RvY29sLmxlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXNvbHZlZExvY2F0aW9uID0gVVJJSGVscGVyLmFkZEltcGxpZWRGaWxlUHJvdG9jb2wocmVzb2x2ZWRMb2NhdGlvbik7Ci0gICAgICB9Ci0gICAgICAvLyBlbmQgdWdseSBoYWNrCi0gICAgICByZXR1cm4gcmVzb2x2ZWRMb2NhdGlvbjsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hNTFF1aWNrU2Nhbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YTUxRdWlja1NjYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YzMzhiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hNTFF1aWNrU2Nhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxRdWlja1NjYW4KLXsgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgIHJlc3VsdCA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoaW5wdXRTdHJlYW0pOyAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsgICAgICAKLSAgICB9ICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKElucHV0U3RyZWFtIGlucHV0KQotICB7ICAKLSAgICBUYXJnZXROYW1lc3BhY2VVUklDb250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxRdWlja1NjYW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgLy8gTGluZSBiZWxvdyBpcyBhIGhhY2sgdG8gZ2V0IFhNTFJlYWRlciB3b3JraW5nCi0gICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAJWE1MUmVhZGVyIHJlYWRlciA9IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKLSAgICAJcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotICAgIAlyZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7ICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotICAgIH0KLSAgICByZXR1cm4gaGFuZGxlci50YXJnZXROYW1lc3BhY2VVUkk7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotICB7ICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlVVJJOwotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSAgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsgICAgICAgICAgICAKLSAgICAgIGlmIChsb2NhbE5hbWUuZXF1YWxzKCJzY2hlbWEiKSB8fCBsb2NhbE5hbWUuZXF1YWxzKCJkZWZpbml0aW9ucyIpKQotICAgICAgeyAgICAgICAgICAgICAgIAotICAgICAgICBpbnQgbkF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyaWJ1dGVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSkuZXF1YWxzKCJ0YXJnZXROYW1lc3BhY2UiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VVUkkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvLyB0b2RvIHRoZXJlJ3MgYSBpY2Ugd2F5IHRvIGRvIHRoaXMgSSdtIHN1cmUgICAgCi0gICAgICAvLyBoZXJlIEkgaW50ZW50aWFsbHkgY2F1c2UgYW4gZXhjZXB0aW9uLi4uIAotICAgICAgU3RyaW5nIHggPSBudWxsOwotICAgICAgeC5sZW5ndGgoKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiOWFlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2YTJlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcgotewotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVNjaGVtYUxvY2F0aW9uKFhTRFNjaGVtYSB4c2RTY2hlbWEsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBzY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7ICAgICAgCi0gICAgICBTdHJpbmcgcmVzdWx0ID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlVVJJLCBzY2hlbWFMb2NhdGlvblVSSSk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgIAlyZXN1bHQgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICB9Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgIAlyZXN1bHQgPSAiIjsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXRwZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZUhlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvRmxhdFBhZ2VIZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxYWRhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZUhlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRmxhdFBhZ2VIZWFkZXIgZXh0ZW5kcyBDYW52YXMgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAKLXsKLQlwcml2YXRlIEltYWdlIGJhY2tncm91bmRJbWFnZTsgIAotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBJbWFnZSBidXR0b25JbWFnZTsKLQlwcml2YXRlIENvbG9yIGltYWdlQmFja2dyb3VuZENvbG9yOwotCXByaXZhdGUgQ29sb3IgdGV4dEZvcmVncm91bmRDb2xvcjsKLQlwcml2YXRlIGludCB0ZXh0SE1hcmdpbiA9IDEwOwotCXByaXZhdGUgaW50IHRleHRWTWFyZ2luID0gNTsKLQlwcml2YXRlIEZvbnQgaGVhZGVyRm9udDsKLQlwcml2YXRlIGludCB3aWR0aEhpbnQ7Ci0KLQlwcml2YXRlIExpc3QgbGlzdGVuZXJzOwotCXByaXZhdGUgaW50IGJ1dHRvbkltYWdlWDsKLQlwcml2YXRlIGludCBidXR0b25JbWFnZVk7Ci0JCi0gIC8vIFVzYWdlOiAKLSAgLy8gICAgU2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuRmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUZsYXRQYWdlSGVhZGVyKCkgCi0gIC8vICAgIG1ldGhvZHMuCi0gIC8vCi0gIC8vICBFeCkKLSAgLy8gIENvbXBvc2l0ZSBwYXJlbnQgPSAuLi4gOwotICAvLyAgSW1hZ2UgaW1hZ2UgPSAuLi4gOwotICAvLyAgTGF5b3V0IGxheW91dCA9IC4uLiA7Ci0gIC8vICBTdHJpbmcgdGl0bGUgPSAuLi4gOwotICAvLyAgV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gLi4uIDsKLSAgLy8KLSAgLy8gIGhlYWRlciA9IG5ldyBGbGF0UGFnZUhlYWRlcihwYXJlbnQsU1dULk5PTkUpOwotICAvLyAgaGVhZGVyLnNldExheW91dChsYXlvdXQpOwotICAvLyAgaGVhZGVyLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSk7Ci0gIC8vICBoZWFkZXIuc2V0VGV4dCh0aXRsZSk7Ci0gIC8vICBDb21wb3NpdGUgZm9ybVBhcmVudCA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGhlYWRlcik7Ci0gIC8vICAKLSAgLy8gIEdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotICAvLyAgZ2wubnVtQ29sdW1ucyA9IDE7Ci0gIC8vICBmb3JtUGFyZW50LnNldExheW91dChnbCk7Ci0gIC8vICBmb3JtUGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAvLwotCXB1YmxpYyBGbGF0UGFnZUhlYWRlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIAotICB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQkKLQkJLy8gVGhlIGRlZmF1bHQgaW1hZ2UgYmFja2dyb3VuZCBjb2xvciBpcyB3aGl0ZQotCQkvLyBUaGUgZGVmYXVsdCB0ZXh0IGZvcmVrZ3JvdW5kIGNvbG9yIGlzIGJsYWNrCi0JCWltYWdlQmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOwotCQl0ZXh0Rm9yZWdyb3VuZENvbG9yID0gbmV3IENvbG9yKG51bGwsIDAsIDAsIDApOwotCQlzZXRCYWNrZ3JvdW5kKGltYWdlQmFja2dyb3VuZENvbG9yKTsKLQkJCi0JCS8vIFRoZSBkZWZhdWx0IHRleHQgZm9udCBpcyBIZWFkZXIgZm9udAotCQloZWFkZXJGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpOwotCQkKLQkJLy8gTmVlZCB0byBkaXNwb3NlIHRoZSBDb2xvcgotCQlhZGREaXNwb3NlTGlzdGVuZXIKLSAgICAgIChuZXcgRGlzcG9zZUxpc3RlbmVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgCi0gICAgICAgICAgewotCQkJCSAgICBGbGF0UGFnZUhlYWRlci50aGlzLndpZGdldERpc3Bvc2VkKGUpOwotCQkJICAgIH0KLQkJICAgIH0gCi0gICAgICApOwotCQkgCi0JCS8vIG5lZWQgdG8gcGFpbnQKLQkJYWRkUGFpbnRMaXN0ZW5lcgotICAgICAgKG5ldyBQYWludExpc3RlbmVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSAKLSAgICAgICAgICB7Ci0JCQkgICAgICBGbGF0UGFnZUhlYWRlci50aGlzLnBhaW50Q29udHJvbChlKTsKLQkJCSAgICB9Ci0JCSAgICB9Ci0gICAgICApOwotCi0JCS8vIGNyZWF0ZSBhIGxpc3Qgb2YgbGlzdGVuZXJzCi0JCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBhZGQgYSBtb3VzZSBsaXN0ZW5lcgotCQl0aGlzLmFkZE1vdXNlTGlzdGVuZXIKLSAgICAgIChuZXcgTW91c2VBZGFwdGVyKCkgCi0gICAgICAgIHsKLQkJCSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBldmVudCkgCi0gICAgICAgICAgewotCQkJCSAgICBoYW5kbGVNb3VzZURvd24oZXZlbnQpOwotCQkJICAgIH0KLQkJICAgIH0KLSAgICAgICk7CQotCQkKLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0JfSAgCi0KLQkvLyBDb21wdXRlIHNpemUgb2YgdGhlIHdpZGdldAotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSAKLSAgewotCQl3aWR0aEhpbnQgPSB3SGludDsKLQkJaW50IHdpZHRoID0gZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQlpbnQgaGVpZ2h0ID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSAhPSBudWxsKSAKLSAgICB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gYmFja2dyb3VuZEltYWdlLmdldEJvdW5kcygpOwotCQkJaGVpZ2h0ID0gYm91bmRzLmhlaWdodDsKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsKSAKLSAgICB7Ci0JCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsKLQkJCWludCB0ZXh0V2lkdGggPSBnZXRUZXh0V2lkdGgoZ2MpOwotCQkJaW50IHRleHRIZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KGdjKTsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgdGV4dEhlaWdodCk7Ci0JCX0KLQkJaWYgKGJ1dHRvbkltYWdlICE9IG51bGwpIAotICAgIHsgCi0JCQlSZWN0YW5nbGUgYm91bmRzID0gYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlpZiAoaGVpZ2h0IDwgYm91bmRzLmhlaWdodCkKLQkJCQloZWlnaHQgPSBib3VuZHMuaGVpZ2h0OwotCQl9Ci0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkgd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKSBoZWlnaHQgPSBoSGludDsgICAgICAgICAgCi0JCXJldHVybiBuZXcgUG9pbnQod2lkdGggKyAyLCBoZWlnaHQgKyAyKTsgICAgIAotCX0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSAKLSAgewotCQlHQyBnYyA9IGUuZ2M7Ci0JCWludCBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KGdjKTsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSAhPSBudWxsKSAKLSAgICB7Ci0JCQlSZWN0YW5nbGUgaW1hZ2VCb3VuZHMgPSBiYWNrZ3JvdW5kSW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQlpbnQgeSA9IDA7Ci0JCQlpbnQgeCA9IDA7Ci0KLQkJCWlmIChpbWFnZUJhY2tncm91bmRDb2xvciAhPSBudWxsKSAKLSAgICAgIHsKLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGltYWdlQmFja2dyb3VuZENvbG9yKTsKLQkJCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGltYWdlQm91bmRzLndpZHRoLCBpbWFnZUJvdW5kcy5oZWlnaHQpOwotCQkJfQotCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgICB7Ci0JCQkJZ2MuZHJhd0ltYWdlKGJhY2tncm91bmRJbWFnZSwgeCwgeSk7Ci0JCQl9Ci0JCQlpZiAodGV4dEZvcmVncm91bmRDb2xvciAhPSBudWxsKQotCQkJCWdjLnNldEZvcmVncm91bmQodGV4dEZvcmVncm91bmRDb2xvcik7Ci0JCQlnYy5zZXRGb250KGhlYWRlckZvbnQpOwotLy8JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7CQotCQkJZ2MuZHJhd1RleHQodGV4dCwgdGV4dEhNYXJnaW4sIHRleHRWTWFyZ2luLCB0cnVlKTsKLQkJCWlmIChidXR0b25JbWFnZSAhPSBudWxsKSAKLSAgICAgIHsKLQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZ2V0UGFyZW50KCkuZ2V0Q2xpZW50QXJlYSgpOwotCQkJCVJlY3RhbmdsZSBidXR0b25Cb3VuZHMgPSBidXR0b25JbWFnZS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgcCA9IHBhcmVudEJvdW5kcy54ICsgcGFyZW50Qm91bmRzLndpZHRoOwotCQkJCWJ1dHRvbkltYWdlWCA9IHAgLSBidXR0b25Cb3VuZHMud2lkdGggLSA0OwotCQkJCWJ1dHRvbkltYWdlWSA9IDQ7Ci0JCQkJZ2MuZHJhd0ltYWdlKGJ1dHRvbkltYWdlLCBidXR0b25JbWFnZVgsIGJ1dHRvbkltYWdlWSk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgCi0gIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotICAgICAgIAotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSAKLSAgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU1vdXNlRG93bihNb3VzZUV2ZW50IGV2ZW50KSAKLSAgewotCQlpZiAoYnV0dG9uSW1hZ2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gY2hla2MgaWYgdGhlIEJ1dHRvbiBpbWFnZSBpcyBjbGlja2VkCi0JCWludCB4ID0gZXZlbnQueDsKLQkJaW50IHkgPSBldmVudC55OwotCQlpZiAoeCA8IGJ1dHRvbkltYWdlWCB8fCB4ID4gYnV0dG9uSW1hZ2VYICsgYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCkud2lkdGgpIAotICAgIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoeSA8IGJ1dHRvbkltYWdlWSB8fCB5ID4gYnV0dG9uSW1hZ2VZICsgYnV0dG9uSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAKLSAgICB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWludCBzaXplID0gbGlzdGVuZXJzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIAotICAgIHsKLQkJCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKFNlbGVjdGlvbkxpc3RlbmVyKWxpc3RlbmVycy5nZXQoaSk7Ci0JCQlsaXN0ZW5lci53aWRnZXRTZWxlY3RlZChudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgCi0gIHsKLQkJaWYgKGltYWdlQmFja2dyb3VuZENvbG9yICE9IG51bGwpIGltYWdlQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJaWYgKHRleHRGb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgdGV4dEZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCWlmIChiYWNrZ3JvdW5kSW1hZ2UgIT0gbnVsbCkgYmFja2dyb3VuZEltYWdlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLy8gZ2V0dGVycyBhbmQgc2V0dGVycwotCXB1YmxpYyBJbWFnZSBnZXRCYWNrZ3JvdW5kSW1hZ2UoKSAKLSAgewotCQlyZXR1cm4gYmFja2dyb3VuZEltYWdlOwotCX0KLSAgICAgIAotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRJbWFnZShJbWFnZSBiYWNrZ3JvdW5kSW1hZ2UpIAotICB7Ci0JCXRoaXMuYmFja2dyb3VuZEltYWdlID0gYmFja2dyb3VuZEltYWdlOwotCQlyZWRyYXcoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0QnV0dG9uSW1hZ2UoKSAKLSAgewotCQlyZXR1cm4gYnV0dG9uSW1hZ2U7Ci0JfQotICAgICAgCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uSW1hZ2UoSW1hZ2UgYnV0dG9uSW1hZ2UpIAotICB7Ci0JCXRoaXMuYnV0dG9uSW1hZ2UgPSBidXR0b25JbWFnZTsKLQkJcmVkcmF3KCk7Ci0JfQotICAgICAgCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgCi0gIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotICAgICAgCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgCi0gIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJcmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VGV4dEhNYXJnaW4oKSAKLSAgewotCQlyZXR1cm4gdGV4dEhNYXJnaW47Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRleHRITWFyZ2luKGludCB0ZXh0SE1hcmdpbikgCi0gIHsKLQkJdGhpcy50ZXh0SE1hcmdpbiA9IHRleHRITWFyZ2luOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFRleHRWTWFyZ2luKCkgCi0gIHsKLQkJcmV0dXJuIHRleHRWTWFyZ2luOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXh0Vk1hcmdpbihpbnQgdGV4dFZNYXJnaW4pIAotICB7Ci0JCXRoaXMudGV4dFZNYXJnaW4gPSB0ZXh0Vk1hcmdpbjsKLQl9Ci0JCi0JcHVibGljIENvbG9yIGdldEltYWdlQmFja2dyb3VuZENvbG9yKCkgCi0gIHsKLQkJcmV0dXJuIGltYWdlQmFja2dyb3VuZENvbG9yOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbWFnZUJhY2tncm91bmRDb2xvcihDb2xvciBpbWFnZUJhY2tncm91bmRDb2xvcikgCi0gIHsKLQkJaWYgKGltYWdlQmFja2dyb3VuZENvbG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuaW1hZ2VCYWNrZ3JvdW5kQ29sb3IgPSBpbWFnZUJhY2tncm91bmRDb2xvcjsKLQkJcmVkcmF3KCk7Ci0JfQotCQotCXB1YmxpYyBDb2xvciBnZXRUZXh0Rm9yZWdyb3VuZENvbG9yKCkgCi0gIHsKLQkJcmV0dXJuIHRleHRGb3JlZ3JvdW5kQ29sb3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRleHRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgdGV4dEZvcmVncm91bmRDb2xvcikgCi0gIHsKLQkJaWYgKHRleHRGb3JlZ3JvdW5kQ29sb3IgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy50ZXh0Rm9yZWdyb3VuZENvbG9yID0gdGV4dEZvcmVncm91bmRDb2xvcjsKLQkJcmVkcmF3KCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dEhlaWdodChHQyBnYykgCi0gIHsKLQkJaW50IGltYWdlSGVpZ2h0ID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSE9IG51bGwgJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgewotCQkJaW1hZ2VIZWlnaHQgPSBiYWNrZ3JvdW5kSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQl9Ci0JCWdjLnNldEZvbnQoaGVhZGVyRm9udCk7Ci0vLwkJZ2Muc2V0Rm9udChnZXRGb250KCkpOwotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWludCBmb250SGVpZ2h0ID0gZm0uZ2V0SGVpZ2h0KCk7Ci0JCWludCBoZWlnaHQgPSAgZm9udEhlaWdodCArIHRleHRWTWFyZ2luICsgdGV4dFZNYXJnaW47Ci0JCXJldHVybiBNYXRoLm1heChoZWlnaHQsIGltYWdlSGVpZ2h0KTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRUZXh0V2lkdGgoR0MgZ2MpIAotICB7Ci0JCWludCBpbWFnZVdpZHRoID0gMDsKLQkJaWYgKGJhY2tncm91bmRJbWFnZSE9IG51bGwgJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpPT1mYWxzZSkgCi0gICAgewotCQkJaW1hZ2VXaWR0aCA9IGJhY2tncm91bmRJbWFnZS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJfQotCQlnYy5zZXRGb250KGhlYWRlckZvbnQpOwotLy8JCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsKLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlpbnQgZm9udFdpZHRoID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICsgNTsKLQkJaW50IHdpZHRoID0gIGZvbnRXaWR0aCAqIHRleHQubGVuZ3RoKCkgKyB0ZXh0SE1hcmdpbiArIHRleHRITWFyZ2luOwotCQlyZXR1cm4gTWF0aC5tYXgod2lkdGgsIGltYWdlV2lkdGgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSAKLSAgewotLy8JCVdpZGdldCBzb3VyY2UgPSBlLndpZGdldDsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIAotICB7Ci0JCWlmKGV2ZW50LmdldFByb3BlcnR5KCkgPT0gSkZhY2VSZXNvdXJjZXMuSEVBREVSX0ZPTlQgJiYgdGhpcy5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpCi0JCXsKLQkJCWhlYWRlckZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuSEVBREVSX0ZPTlQpOwotCQkJdGhpcy5sYXlvdXQodHJ1ZSk7Ci0JCQl0aGlzLnJlZHJhdygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvRmxhdFBhZ2VTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4YzMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9GbGF0UGFnZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8vcHVibGljIGFic3RyYWN0IGNsYXNzIEZvcm1TZWN0aW9uIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIsIElNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxhdFBhZ2VTZWN0aW9uIGV4dGVuZHMgVmlld0Zvcm0gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gMTsKLS8vCXByaXZhdGUgUERFRm9ybVBhZ2UgZm9ybVBhZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgaGVhZGVyQ29sb3JLZXkgPSBXaWRnZXRGYWN0b3J5LkRFRkFVTFRfSEVBREVSX0NPTE9SOwotCXByaXZhdGUgU3RyaW5nIGhlYWRlclRleHQ7Ci0JcHJpdmF0ZSBDb250cm9sIGNsaWVudDsKLQlwcm90ZWN0ZWQgTGFiZWwgaGVhZGVyOwotCXByb3RlY3RlZCBDb250cm9sIHNlcGFyYXRvcjsKLS8vCXByaXZhdGUgU2VjdGlvbkNoYW5nZU1hbmFnZXIgc2VjdGlvbk1hbmFnZXI7Ci0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBkaXJ0eTsKLQlwcm90ZWN0ZWQgTGFiZWwgZGVzY3JpcHRpb25MYWJlbDsKLQlwcml2YXRlIFRvZ2dsZUNvbnRyb2wgdG9nZ2xlOwotCXByaXZhdGUgYm9vbGVhbiByZWFkT25seTsKLQlwcml2YXRlIGJvb2xlYW4gdGl0bGVBc0h5cGVybGluazsKLQlwcml2YXRlIGJvb2xlYW4gYWRkU2VwYXJhdG9yPXRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0aW9uUGFpbnRlZD10cnVlOwotCXByaXZhdGUgYm9vbGVhbiBoZWFkZXJQYWludGVkPXRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbGxhcHNhYmxlPWZhbHNlOwotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7Ci0JCi0JCi0vKgotICogVGhpcyBpcyBhIHNwZWNpYWwgbGF5b3V0IGZvciB0aGUgc2VjdGlvbi4gQm90aCB0aGUKLSAqIGhlYWRlciBhbmQgdGhlIGRlc2NyaXB0aW9uIGxhYmVscyB3aWxsIHdyYXAgYW5kCi0gKiB0aGV5IHdpbGwgdXNlIGNsaWVudCdzIHNpemUgdG8gY2FsY3VsYXRlIG5lZWRlZAotICogaGVpZ2h0LiBUaGlzIGtpbmQgb2YgYmVoYXZpb3VyIGlzIG5vdCBwb3NzaWJsZQotICogd2l0aCBzdG9jayBncmlkIGxheW91dC4KLSAqLwotY2xhc3MgU2VjdGlvbkxheW91dCBleHRlbmRzIExheW91dCB7Ci0JaW50IHZzcGFjaW5nID0gMzsKLQlpbnQgc2VwSGVpZ2h0ID0gMjsKLQotCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGZsdXNoKSB7Ci0JCWludCB3aWR0aCA9IDA7Ci0JCWludCBoZWlnaHQgPSAwOwotCQlpbnQgY3dpZHRoID0gMDsKLQkJaW50IGNvbGxhcHNlZEhlaWdodCA9IDA7Ci0JCi0JCWlmICh3SGludCAhPSBTV1QuREVGQVVMVCkKLQkJICAgd2lkdGggPSB3SGludDsKLQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJaGVpZ2h0ID0gaEhpbnQ7Ci0KLQkJY3dpZHRoID0gd2lkdGg7Ci0JCQkJCi0JCWlmIChjbGllbnQgIT0gbnVsbCkgewotCQkJUG9pbnQgY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQlpZiAod2lkdGggPT0gMCkgewotCQkJCXdpZHRoID0gY3NpemUueDsKLQkJCQljd2lkdGggPSB3aWR0aDsKLQkJCX0KLQkJCWlmIChoZWlnaHQ9PTApIGhlaWdodCA9IGNzaXplLnk7Ci0JCX0KLQkJCi0JCVBvaW50IHRvZ2dsZVNpemUgPSBudWxsOwotCQkKLQkJaWYgKGNvbGxhcHNhYmxlICYmIHRvZ2dsZSE9bnVsbCkgCi0JCSAgICB0b2dnbGVTaXplID0gdG9nZ2xlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOwotCQkKLQkJaWYgKGhIaW50PT0gU1dULkRFRkFVTFQgJiYgaGVhZGVyUGFpbnRlZCAmJiBoZWFkZXIhPW51bGwpIHsKLQkJCWludCBod2lkdGggPSBjd2lkdGg7Ci0JCQlpZiAodG9nZ2xlU2l6ZSE9bnVsbCkKLQkJCSAgIGh3aWR0aCA9IGN3aWR0aCAtIHRvZ2dsZVNpemUueCAtIDU7Ci0JCQlQb2ludCBoc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQloZWlnaHQgKz0gaHNpemUueTsKLQkJCWNvbGxhcHNlZEhlaWdodCA9IGhzaXplLnk7Ci0JCQloZWlnaHQgKz0gdnNwYWNpbmc7Ci0JCX0KLQkJCi0JCWlmIChoSGludD09U1dULkRFRkFVTFQgJiYgYWRkU2VwYXJhdG9yKSB7Ci0JCQloZWlnaHQgKz0gc2VwSGVpZ2h0OwotCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOwotCQkJY29sbGFwc2VkSGVpZ2h0ICs9IHZzcGFjaW5nICsgc2VwSGVpZ2h0OwotCQl9Ci0JCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCAmJiBkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkgewotCQkJUG9pbnQgZHNpemUgPSBkZXNjcmlwdGlvbkxhYmVsLmNvbXB1dGVTaXplKGN3aWR0aCwgU1dULkRFRkFVTFQsIGZsdXNoKTsKLQkJCWhlaWdodCArPSBkc2l6ZS55OwotCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOwotCQl9Ci0JCWlmICh0b2dnbGUhPW51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkvLyBjb2xsYXBzZWQgc3RhdGUKLQkJCWhlaWdodCA9IGNvbGxhcHNlZEhlaWdodDsKLQkJfQotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBmbHVzaCkgewotCQlpbnQgd2lkdGggPSBwYXJlbnQuZ2V0Q2xpZW50QXJlYSgpLndpZHRoOwotCQlpbnQgaGVpZ2h0ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS5oZWlnaHQ7Ci0JCWludCB5ID0gMDsKLQkJUG9pbnQgdG9nZ2xlU2l6ZT1udWxsOwotCQkKLQkJaWYgKGNvbGxhcHNhYmxlKSB7Ci0JCQl0b2dnbGVTaXplID0gdG9nZ2xlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOwotCQl9Ci0KLQkJaWYgKGhlYWRlclBhaW50ZWQgJiYgaGVhZGVyIT1udWxsKSB7Ci0JCQlQb2ludCBoc2l6ZTsKLQkJCQotCQkJaWYgKHRpdGxlQXNIeXBlcmxpbmspIHsKLQkJCQloc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoKTsKLQkJCQloZWFkZXIuc2V0Qm91bmRzKDAsIHksIGhzaXplLngsIGhzaXplLnkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IGF2YWlsYWJsZVdpZHRoID0gd2lkdGg7Ci0JCQkJaWYgKHRvZ2dsZVNpemUhPW51bGwpCi0JCQkJICAgYXZhaWxhYmxlV2lkdGggPSB3aWR0aCAtIHRvZ2dsZVNpemUueCAtIDU7Ci0JCQkJaHNpemUgPSBoZWFkZXIuY29tcHV0ZVNpemUoYXZhaWxhYmxlV2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0KLSAgICAgICAgaW50IGh4ID0gMDsKLQkJICAgCWlmICh0b2dnbGUhPW51bGwpIHsKLQkgICAJCQlpbnQgdHkgPSB5ICsgaHNpemUueSAtIHRvZ2dsZVNpemUueTsgLy8gKyB2c3BhY2luZzsKLQkJICAgCSAgdG9nZ2xlLnNldEJvdW5kcygwLCB0eSwgdG9nZ2xlU2l6ZS54LCB0b2dnbGVTaXplLnkpOwotICAgICAgICAgIGh4ID0gdG9nZ2xlU2l6ZS54OwotCQkgICAJfQotCQkJICBoZWFkZXIuc2V0Qm91bmRzKGh4LCB5LCBhdmFpbGFibGVXaWR0aCwgaHNpemUueSk7Ci0JCQl9Ci0JCQl5ICs9IGhzaXplLnkgKyB2c3BhY2luZzsKLQkJfQotCQlpZiAoYWRkU2VwYXJhdG9yICYmIHNlcGFyYXRvciE9bnVsbCkgewotCQkJc2VwYXJhdG9yLnNldEJvdW5kcygwLCB5LCB3aWR0aCwgMik7Ci0JCQl5ICs9IHNlcEhlaWdodCArIHZzcGFjaW5nOwotCQl9Ci0JCWlmICh0b2dnbGUhPW51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbkxhYmVsIT1udWxsKSB7Ci0JCQlQb2ludCBkc2l6ZSA9IGRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7Ci0JCQlkZXNjcmlwdGlvbkxhYmVsLnNldEJvdW5kcygwLCB5LCB3aWR0aCwgZHNpemUueSk7Ci0JCQl5ICs9IGRzaXplLnkgKyB2c3BhY2luZzsKLQkJfQotCQlpZiAoY2xpZW50IT1udWxsKSB7Ci0JCQljbGllbnQuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCBoZWlnaHQgLSB5KTsKLQkJfQotCX0KLX0KLQkKLQkKLXB1YmxpYyBGbGF0UGFnZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCS8vIERlc2NyaXB0aW9uIGNhdXNlcyBwcm9ibGVtcyByZSB3b3JkIHdyYXBwaW5nCi0JLy8gYW5kIGNhdXNlcyBiYWQgbGF5b3V0IGluIHNjaGVtYSBhbmQKLQkvLyBjb21wb25lbnQgZWRpdG9ycyB3aGVuIGluIE1vdGlmIC0gdHVybmluZyBvZmYKLQkKLQlzdXBlcihwYXJlbnQsIFNXVC5GTEFUKTsKLQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpKSB7Ci0JCWRlc2NyaXB0aW9uUGFpbnRlZCA9IGZhbHNlOwotCX0KLQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLX0KLXB1YmxpYyB2b2lkIGNvbW1pdENoYW5nZXMoYm9vbGVhbiBvblNhdmUpIHsKLX0KLXB1YmxpYyBhYnN0cmFjdCBDb21wb3NpdGUgY3JlYXRlQ2xpZW50KENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3RvcnkgZmFjdG9yeSk7Ci1wdWJsaWMgZmluYWwgQ29udHJvbCBjcmVhdGVDb250cm9sKAotCUNvbXBvc2l0ZSBwYXJlbnQsCi0JV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JQ29tcG9zaXRlIHNlY3Rpb24gPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCVNlY3Rpb25MYXlvdXQgc2xheW91dCA9IG5ldyBTZWN0aW9uTGF5b3V0KCk7Ci0Jc2VjdGlvbi5zZXRMYXlvdXQoc2xheW91dCk7Ci0Jc2VjdGlvbi5zZXREYXRhKHRoaXMpOwotCi0JR3JpZERhdGEgZ2Q7Ci0JaWYgKGhlYWRlclBhaW50ZWQpIHsKLQkJQ29sb3IgaGVhZGVyQ29sb3IgPSBmYWN0b3J5LmdldENvbG9yKGdldEhlYWRlckNvbG9yS2V5KCkpOwotCQloZWFkZXIgPSBmYWN0b3J5LmNyZWF0ZUhlYWRpbmdMYWJlbChzZWN0aW9uLCBnZXRIZWFkZXJUZXh0KCksIGhlYWRlckNvbG9yLCBTV1QuV1JBUCk7Ci0JCWlmICh0aXRsZUFzSHlwZXJsaW5rKSB7Ci0JCQlmYWN0b3J5LnR1cm5JbnRvSHlwZXJsaW5rKGhlYWRlciwgbmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChDb250cm9sIGxhYmVsKSB7Ci0JCQkJCXRpdGxlQWN0aXZhdGVkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKGNvbGxhcHNhYmxlKSB7Ci0JCQl0b2dnbGUgPSBuZXcgVG9nZ2xlQ29udHJvbChzZWN0aW9uLCBTV1QuTlVMTCk7Ci0JCQl0b2dnbGUuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJCXRvZ2dsZS5zZXRBY3RpdmVEZWNvcmF0aW9uQ29sb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDb2xvcigpKTsKLQkJCXRvZ2dsZS5zZXREZWNvcmF0aW9uQ29sb3IoZmFjdG9yeS5nZXRDb2xvcihXaWRnZXRGYWN0b3J5LkNPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IpKTsKLQkJCXRvZ2dsZS5zZXRBY3RpdmVDdXJzb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7Ci0JCQl0b2dnbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkKLQkJCQkJYm9vbGVhbiBjb2xsYXBzZWQgPSB0b2dnbGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXJlZmxvdygpOwotCQkJCQlpZiAoZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkKLQkJCQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0VmlzaWJsZSghY29sbGFwc2VkKTsKLQkJCQkJaWYgKGNsaWVudCE9bnVsbCkKLQkJCQkJCWNsaWVudC5zZXRWaXNpYmxlKCFjb2xsYXBzZWQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0KLQlpZiAoYWRkU2VwYXJhdG9yKSB7Ci0gICAgICAgIC8vc2VwYXJhdG9yID0gZmFjdG9yeS5jcmVhdGVTZXBhcmF0b3Ioc2VjdGlvbiwgU1dULkhPUklaT05UQUwpOwotCQlzZXBhcmF0b3IgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQl9Ci0JCi0JaWYgKGRlc2NyaXB0aW9uUGFpbnRlZCAmJiBkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCWRlc2NyaXB0aW9uTGFiZWwgPSBmYWN0b3J5LmNyZWF0ZUxhYmVsKHNlY3Rpb24sIGRlc2NyaXB0aW9uLCBTV1QuV1JBUCk7Ci0JfQotCWNsaWVudCA9IGNyZWF0ZUNsaWVudChzZWN0aW9uLCBmYWN0b3J5KTsKLQlzZWN0aW9uLnNldERhdGEodGhpcyk7Ci0JY29udHJvbCA9IHNlY3Rpb247Ci0JcmV0dXJuIHNlY3Rpb247Ci19Ci0KLXByb3RlY3RlZCB2b2lkIHJlZmxvdygpIHsKLQljb250cm9sLmxheW91dCh0cnVlKTsKLQljb250cm9sLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQotICBXaWRnZXQgZ3JhbmRQYXJlbnQgPSBjb250cm9sLmdldFBhcmVudCgpLmdldFBhcmVudCgpOwotICBpZiAoZ3JhbmRQYXJlbnQgIT0gbnVsbCAmJiBncmFuZFBhcmVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkKLQkgICgoQ29tcG9zaXRlKWdyYW5kUGFyZW50KS5sYXlvdXQodHJ1ZSk7Ci0vKgotCVNlY3Rpb25Gb3JtIGZvcm0gPSBmb3JtUGFnZS5nZXRGb3JtKCk7Ci0JaWYgKGZvcm0gaW5zdGFuY2VvZiBTY3JvbGxhYmxlU2VjdGlvbkZvcm0pIHsKLQkJKChTY3JvbGxhYmxlU2VjdGlvbkZvcm0pZm9ybSkudXBkYXRlU2Nyb2xsQmFycygpOwotCX0KLSovCi19Ci0KLXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIGxhYmVsLCBmYWN0b3J5LCAxKTsKLX0KLXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBXaWRnZXRGYWN0b3J5IGZhY3RvcnksIGludCBzcGFuKSB7Ci0JZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsKLQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIik7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlnZC5ob3Jpem9udGFsU3Bhbj1zcGFuOwotCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcmV0dXJuIHRleHQ7Ci19Ci1wcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3RvcnkgZmFjdG9yeSwgaW50IHNwYW4pIHsKLQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIik7Ci0JR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQlnZC5ob3Jpem9udGFsU3Bhbj1zcGFuOwotCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JcmV0dXJuIHRleHQ7Ci19Ci1wdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCUpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCXN1cGVyLmRpc3Bvc2UoKTsKLX0KLXB1YmxpYyB2b2lkIGRvR2xvYmFsQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkge30KLXB1YmxpYyB2b2lkIGV4cGFuZFRvKE9iamVjdCBvYmplY3QpIHt9Ci0vKgotcHVibGljIGZpbmFsIHZvaWQgZmlyZUNoYW5nZU5vdGlmaWNhdGlvbihpbnQgY2hhbmdlVHlwZSwgT2JqZWN0IGNoYW5nZU9iamVjdCkgewotCWlmIChzZWN0aW9uTWFuYWdlciA9PSBudWxsKQotCQlyZXR1cm47Ci0Jc2VjdGlvbk1hbmFnZXIuZGlzcGF0Y2hOb3RpZmljYXRpb24odGhpcywgY2hhbmdlVHlwZSwgY2hhbmdlT2JqZWN0KTsKLX0KLXB1YmxpYyBmaW5hbCB2b2lkIGZpcmVTZWxlY3Rpb25Ob3RpZmljYXRpb24oT2JqZWN0IGNoYW5nZU9iamVjdCkgewotCWZpcmVDaGFuZ2VOb3RpZmljYXRpb24oU0VMRUNUSU9OLCBjaGFuZ2VPYmplY3QpOwotfQotKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCXJldHVybiBkZXNjcmlwdGlvbjsKLX0KLS8qCi1wdWJsaWMgUERFRm9ybVBhZ2UgZ2V0Rm9ybVBhZ2UoKSB7Ci0JcmV0dXJuIGZvcm1QYWdlOwotfQotKi8KLQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyQ29sb3JLZXkoKSB7Ci0JcmV0dXJuIGhlYWRlckNvbG9yS2V5OwotfQotcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0SGVhZGVyVGV4dCgpIHsKLQlyZXR1cm4gaGVhZGVyVGV4dDsKLX0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IGlucHV0KSB7fQotCi1wdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCXJldHVybiBkaXJ0eTsKLX0KLQotcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQlyZXR1cm4gcmVhZE9ubHk7Ci19Ci1wdWJsaWMgYm9vbGVhbiBpc1RpdGxlQXNIeXBlcmxpbmsoKSB7Ci0JcmV0dXJuIHRpdGxlQXNIeXBlcmxpbms7Ci19Ci0vKgotcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElNb2RlbENoYW5nZWRFdmVudCBlKSB7Ci19Ci0qLwotcHVibGljIHZvaWQgc2VjdGlvbkNoYW5nZWQoRmxhdFBhZ2VTZWN0aW9uIHNvdXJjZSwgaW50IGNoYW5nZVR5cGUsIE9iamVjdCBjaGFuZ2VPYmplY3QpIHt9Ci1wdWJsaWMgdm9pZCBzZXRBZGRTZXBhcmF0b3IoYm9vbGVhbiBuZXdBZGRTZXBhcmF0b3IpIHsKLQlhZGRTZXBhcmF0b3IgPSBuZXdBZGRTZXBhcmF0b3I7Ci19Ci0KLQotcHJpdmF0ZSBTdHJpbmcgdHJpbU5ld0xpbmVzKFN0cmluZyB0ZXh0KSB7Ci0JU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JZm9yIChpbnQgaT0wOyBpPHRleHQubGVuZ3RoKCk7IGkrKykgewotCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJaWYgKGM9PSdcbicpCi0JCSAgIGJ1ZmYuYXBwZW5kKCcgJyk7Ci0JCWVsc2UKLQkJICAgYnVmZi5hcHBlbmQoYyk7Ci0JfQotCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci19Ci0JCi1wdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKSB7Ci0JLy8gd2Ugd2lsbCB0cmltIHRoZSBuZXcgbGluZXMgc28gdGhhdCB3ZSBjYW4KLQkvLyB1c2UgbGF5b3V0LWJhc2VkIHdvcmQgd3JhcHBpbmcgaW5zdGVhZAotCS8vIG9mIGhhcmQtY29kZWQgb25lCi0JZGVzY3JpcHRpb24gPSB0cmltTmV3TGluZXMobmV3RGVzY3JpcHRpb24pOwotCS8vZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQlpZiAoZGVzY3JpcHRpb25MYWJlbCE9bnVsbCkgZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KG5ld0Rlc2NyaXB0aW9uKTsKLX0KLXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uUGFpbnRlZChib29sZWFuIG5ld0Rlc2NyaXB0aW9uUGFpbnRlZCkgewotCWRlc2NyaXB0aW9uUGFpbnRlZCA9IG5ld0Rlc2NyaXB0aW9uUGFpbnRlZDsKLX0KLXB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gbmV3RGlydHkpIHsKLQlkaXJ0eSA9IG5ld0RpcnR5OwotfQotLyoKLXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotfQotKi8KLXB1YmxpYyB2b2lkIHNldEhlYWRlckNvbG9yS2V5KGphdmEubGFuZy5TdHJpbmcgbmV3SGVhZGVyQ29sb3JLZXkpIHsKLQloZWFkZXJDb2xvcktleSA9IG5ld0hlYWRlckNvbG9yS2V5OwotfQotcHVibGljIHZvaWQgc2V0SGVhZGVyUGFpbnRlZChib29sZWFuIG5ld0hlYWRlclBhaW50ZWQpIHsKLQloZWFkZXJQYWludGVkID0gbmV3SGVhZGVyUGFpbnRlZDsKLX0KLXB1YmxpYyB2b2lkIHNldEhlYWRlclRleHQoamF2YS5sYW5nLlN0cmluZyBuZXdIZWFkZXJUZXh0KSB7Ci0JaGVhZGVyVGV4dCA9IG5ld0hlYWRlclRleHQ7Ci0JaWYgKGhlYWRlciE9bnVsbCkgaGVhZGVyLnNldFRleHQoaGVhZGVyVGV4dCk7Ci19Ci0vKgotdm9pZCBzZXRNYW5hZ2VyKFNlY3Rpb25DaGFuZ2VNYW5hZ2VyIG1hbmFnZXIpIHsKLQl0aGlzLnNlY3Rpb25NYW5hZ2VyID0gbWFuYWdlcjsKLX0KLSovCi1wdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JcmVhZE9ubHkgPSBuZXdSZWFkT25seTsKLX0KLXB1YmxpYyB2b2lkIHNldFRpdGxlQXNIeXBlcmxpbmsoYm9vbGVhbiBuZXdUaXRsZUFzSHlwZXJsaW5rKSB7Ci0JdGl0bGVBc0h5cGVybGluayA9IG5ld1RpdGxlQXNIeXBlcmxpbms7Ci19Ci1wdWJsaWMgdm9pZCB0aXRsZUFjdGl2YXRlZCgpIHsKLX0KLS8qCi1wdWJsaWMgdm9pZCB1cGRhdGUoKSB7fQotKi8KLQotcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBhcmcwKSB7Ci0JaWYgKGNvbnRyb2whPW51bGwgJiYgaGVhZGVyIT1udWxsKSB7Ci0JICBpZiAoIWhlYWRlci5pc0Rpc3Bvc2VkKCkpCi0JCWhlYWRlci5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JICBpZiAoIWNvbnRyb2wuaXNEaXNwb3NlZCgpKQotCQljb250cm9sLmxheW91dCh0cnVlKTsKLQl9Ci19Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbGxhcHNhYmxlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDb2xsYXBzYWJsZSgpIHsKLQkJcmV0dXJuIGNvbGxhcHNhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbGxhcHNhYmxlLgotCSAqIEBwYXJhbSBjb2xsYXBzYWJsZSBUaGUgY29sbGFwc2FibGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGFwc2FibGUoYm9vbGVhbiBjb2xsYXBzYWJsZSkgewotCQl0aGlzLmNvbGxhcHNhYmxlID0gY29sbGFwc2FibGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTJiYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSHlwZXJsaW5rQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aTsKLQotcHVibGljIGNsYXNzIEh5cGVybGlua0FkYXB0ZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXJ7Ci0KLXB1YmxpYyBIeXBlcmxpbmtBZGFwdGVyKCkgewotICAgIHN1cGVyKCk7Ci19Ci1wdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQotcHVibGljIHZvaWQgbGlua0VudGVyZWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCBsaW5rTGFiZWwpIHt9Ci1wdWJsaWMgdm9pZCBsaW5rRXhpdGVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9IeXBlcmxpbmtIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDNjMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSHlwZXJsaW5rSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLXB1YmxpYyBjbGFzcyBIeXBlcmxpbmtIYW5kbGVyIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciwgTW91c2VUcmFja0xpc3RlbmVyLCBQYWludExpc3RlbmVyIHsKLQotICAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FX05FVkVSID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFUkxJTkVfUk9MTE9WRVIgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9BTFdBWVMgPSAzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ3Vyc29yIGh5cGVybGlua0N1cnNvcjsKLSAgICBwcml2YXRlIHN0YXRpYyBDdXJzb3IgYnVzeUN1cnNvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaHlwZXJsaW5rQ3Vyc29yVXNlZD10cnVlOwotICAgIHByaXZhdGUgaW50IGh5cGVybGlua1VuZGVybGluZU1vZGU9VU5ERVJMSU5FX0FMV0FZUzsKLSAgICBwcml2YXRlIENvbG9yIGJhY2tncm91bmQ7Ci0gICAgcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kOwotICAgIHByaXZhdGUgQ29sb3IgYWN0aXZlQmFja2dyb3VuZDsKLSAgICBwcml2YXRlIENvbG9yIGFjdGl2ZUZvcmVncm91bmQ7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgaHlwZXJsaW5rTGlzdGVuZXJzOwotICAgIHByaXZhdGUgQ29udHJvbCBsYXN0TGluazsKLQotcHVibGljIEh5cGVybGlua0hhbmRsZXIoKSB7Ci0gICAgaHlwZXJsaW5rTGlzdGVuZXJzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChoeXBlcmxpbmtDdXJzb3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBoeXBlcmxpbmtDdXJzb3IgPSBuZXcgQ3Vyc29yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBTV1QuQ1VSU09SX0hBTkQpOwotICAgICAgYnVzeUN1cnNvciA9IG5ldyBDdXJzb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5DVVJTT1JfV0FJVCk7Ci0gICAgfQotfQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICBoeXBlcmxpbmtDdXJzb3IuZGlzcG9zZSgpOwotICAgIGJ1c3lDdXJzb3IuZGlzcG9zZSgpOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRBY3RpdmVCYWNrZ3JvdW5kKCkgewotICAgIHJldHVybiBhY3RpdmVCYWNrZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRBY3RpdmVGb3JlZ3JvdW5kKCkgewotICAgIHJldHVybiBhY3RpdmVGb3JlZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBnZXRCYWNrZ3JvdW5kKCkgewotICAgIHJldHVybiBiYWNrZ3JvdW5kOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3IgZ2V0QnVzeUN1cnNvcigpIHsKLSAgICByZXR1cm4gYnVzeUN1cnNvcjsKLX0KLXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgZ2V0Rm9yZWdyb3VuZCgpIHsKLSAgICByZXR1cm4gZm9yZWdyb3VuZDsKLX0KLXB1YmxpYyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yIGdldEh5cGVybGlua0N1cnNvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rQ3Vyc29yOwotfQotcHVibGljIGludCBnZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCkgewotICAgIHJldHVybiBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlOwotfQotcHVibGljIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgZ2V0TGFzdExpbmsoKSB7Ci0gICAgcmV0dXJuIGxhc3RMaW5rOwotfQotcHVibGljIGJvb2xlYW4gaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkgewotICAgIHJldHVybiBoeXBlcmxpbmtDdXJzb3JVc2VkOwotfQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotICAgICAgICB9Ci1wdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0gICAgaWYgKGUuYnV0dG9uID09IDEpCi0gICAgICAgIHJldHVybjsKLSAgICBsYXN0TGluayA9IChDb250cm9sKWUud2lkZ2V0OwotfQotcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7Ci0gICAgaWYgKGlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpKQotICAgICAgICBjb250cm9sLnNldEN1cnNvcihoeXBlcmxpbmtDdXJzb3IpOwotICAgIGlmIChhY3RpdmVCYWNrZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0QmFja2dyb3VuZChhY3RpdmVCYWNrZ3JvdW5kKTsKLSAgICBpZiAoYWN0aXZlRm9yZWdyb3VuZCAhPSBudWxsKQotICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoYWN0aXZlRm9yZWdyb3VuZCk7Ci0gICAgaWYgKGh5cGVybGlua1VuZGVybGluZU1vZGU9PVVOREVSTElORV9ST0xMT1ZFUikgdW5kZXJsaW5lKGNvbnRyb2wsIHRydWUpOyAgICAKLQotICAgIElIeXBlcmxpbmtMaXN0ZW5lciBhY3Rpb24gPQotICAgICAgICAoSUh5cGVybGlua0xpc3RlbmVyKSBoeXBlcmxpbmtMaXN0ZW5lcnMuZ2V0KGNvbnRyb2wpOwotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uLmxpbmtFbnRlcmVkKGNvbnRyb2wpOwotfQotcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgewotICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlLndpZGdldDsKLSAgICBpZiAoaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkpCi0gICAgICAgIGNvbnRyb2wuc2V0Q3Vyc29yKG51bGwpOwotICAgIGlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlPT1VTkRFUkxJTkVfUk9MTE9WRVIpCi0gICAgICAgIHVuZGVybGluZShjb250cm9sLCBmYWxzZSk7Ci0gICAgaWYgKGJhY2tncm91bmQgIT0gbnVsbCkKLSAgICAgICAgY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotICAgIGlmIChmb3JlZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLSAgICBJSHlwZXJsaW5rTGlzdGVuZXIgYWN0aW9uID0KLSAgICAgICAgKElIeXBlcmxpbmtMaXN0ZW5lcikgaHlwZXJsaW5rTGlzdGVuZXJzLmdldChjb250cm9sKTsKLSAgICBpZiAoYWN0aW9uICE9IG51bGwpCi0gICAgICAgIGFjdGlvbi5saW5rRXhpdGVkKGNvbnRyb2wpOwotfQotICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgewotICAgICAgICB9Ci1wdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotICAgIGlmIChlLmJ1dHRvbiAhPSAxKQotICAgICAgICByZXR1cm47Ci0gICAgSUh5cGVybGlua0xpc3RlbmVyIGFjdGlvbiA9Ci0gICAgICAgIChJSHlwZXJsaW5rTGlzdGVuZXIpIGh5cGVybGlua0xpc3RlbmVycy5nZXQoZS53aWRnZXQpOwotICAgIGlmIChhY3Rpb24gIT0gbnVsbCkgewotICAgICAgICBDb250cm9sIGMgPSAoQ29udHJvbCkgZS53aWRnZXQ7Ci0gICAgICAgIGMuc2V0Q3Vyc29yKGJ1c3lDdXJzb3IpOwotICAgICAgICBhY3Rpb24ubGlua0FjdGl2YXRlZChjKTsKLSAgICAgICAgaWYgKCFjLmlzRGlzcG9zZWQoKSkgCi0gICAgICAgICAgIGMuc2V0Q3Vyc29yKGlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpP2h5cGVybGlua0N1cnNvcjpudWxsKTsKLSAgICB9Ci19Ci1wdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0gICAgQ29udHJvbCBsYWJlbCA9IChDb250cm9sKSBlLndpZGdldDsKLSAgICBpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfQUxXQVlTKQotICAgICAgICBIeXBlcmxpbmtIYW5kbGVyLnVuZGVybGluZShsYWJlbCwgdHJ1ZSk7Ci19Ci1wdWJsaWMgdm9pZCByZWdpc3Rlckh5cGVybGluayhDb250cm9sIGNvbnRyb2wsIElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGlmIChiYWNrZ3JvdW5kICE9IG51bGwpCi0gICAgICAgIGNvbnRyb2wuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLSAgICBpZiAoZm9yZWdyb3VuZCAhPSBudWxsKQotICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7Ci0gICAgY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotICAgIGNvbnRyb2wuYWRkTW91c2VUcmFja0xpc3RlbmVyKHRoaXMpOwotICAgIGlmIChoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID09IFVOREVSTElORV9BTFdBWVMpCi0gICAgICAgIGNvbnRyb2wuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICBoeXBlcmxpbmtMaXN0ZW5lcnMucHV0KGNvbnRyb2wsIGxpc3RlbmVyKTsKLSAgICByZW1vdmVEaXNwb3NlZExpbmtzKCk7Ci19Ci1wcml2YXRlIHZvaWQgcmVtb3ZlRGlzcG9zZWRMaW5rcygpIHsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGtleXMgPSBoeXBlcmxpbmtMaXN0ZW5lcnMua2V5cygpOyBrZXlzLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICBDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbClrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb250cm9sLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgaHlwZXJsaW5rTGlzdGVuZXJzLnJlbW92ZShjb250cm9sKTsKLSAgICAgICAgfQotICAgIH0KLX0KLXB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIGh5cGVybGlua0xpc3RlbmVycy5jbGVhcigpOwotfQotcHVibGljIHZvaWQgc2V0QWN0aXZlQmFja2dyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QWN0aXZlQmFja2dyb3VuZCkgewotICAgIGFjdGl2ZUJhY2tncm91bmQgPSBuZXdBY3RpdmVCYWNrZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0QWN0aXZlRm9yZWdyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QWN0aXZlRm9yZWdyb3VuZCkgewotICAgIGFjdGl2ZUZvcmVncm91bmQgPSBuZXdBY3RpdmVGb3JlZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3QmFja2dyb3VuZCkgewotICAgIGJhY2tncm91bmQgPSBuZXdCYWNrZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgbmV3Rm9yZWdyb3VuZCkgewotICAgIGZvcmVncm91bmQgPSBuZXdGb3JlZ3JvdW5kOwotfQotcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQ3Vyc29yVXNlZChib29sZWFuIG5ld0h5cGVybGlua0N1cnNvclVzZWQpIHsKLSAgICBoeXBlcmxpbmtDdXJzb3JVc2VkID0gbmV3SHlwZXJsaW5rQ3Vyc29yVXNlZDsKLX0KLXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1VuZGVybGluZU1vZGUoaW50IG5ld0h5cGVybGlua1VuZGVybGluZU1vZGUpIHsKLSAgICBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID0gbmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZTsKLX0KLXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlcmxpbmUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGluc2lkZSkgewotICAgIGlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCkpCi0gICAgICAgIHJldHVybjsKLSAgICBDb21wb3NpdGUgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLSAgICBSZWN0YW5nbGUgYm91bmRzID0gY29udHJvbC5nZXRCb3VuZHMoKTsKLSAgICBHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotICAgIENvbG9yIGNvbG9yID0gaW5zaWRlPyBjb250cm9sLmdldEZvcmVncm91bmQoKSA6IGNvbnRyb2wuZ2V0QmFja2dyb3VuZCgpOwotICAgIGdjLnNldEZvcmVncm91bmQoY29sb3IpOwotICAgIGludCB5ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0OwotICAgIGdjLmRyYXdMaW5lKGJvdW5kcy54LCB5LCBib3VuZHMueCtib3VuZHMud2lkdGgsIHkpOwotICAgIGdjLmRpc3Bvc2UoKTsKLX0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL0lIeXBlcmxpbmtMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSUh5cGVybGlua0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZGZiYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvSUh5cGVybGlua0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuZmxhdHVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotcHVibGljIGludGVyZmFjZSBJSHlwZXJsaW5rTGlzdGVuZXIgewotCi0gIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rTGFiZWwpOwotICBwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChDb250cm9sIGxpbmtMYWJlbCk7Ci0gIHB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rTGFiZWwpOwotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9Ub2dnbGVDb250cm9sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9Ub2dnbGVDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MmNmMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC9mbGF0dWkvVG9nZ2xlQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHlwZWRMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFRvZ2dsZUNvbnRyb2wgZXh0ZW5kcyBDYW52YXMgewotICBwcml2YXRlIGJvb2xlYW4gZkNvbGxhcHNlZDsKLSAgcHJpdmF0ZSBDb2xvciBmRGVjb3JhdGlvbkNvbG9yOwotICBwcml2YXRlIENvbG9yIGZBY3RpdmVDb2xvcjsKLSAgcHJpdmF0ZSBDdXJzb3IgZkFjdGl2ZUN1cnNvcjsKLSAgcHJpdmF0ZSBib29sZWFuIGZIYXNGb2N1czsKLSAgcHJpdmF0ZSBib29sZWFuIGZIb3ZlciA9IGZhbHNlOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFSR0lOX1dJRFRIID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BUkdJTl9IRUlHSFQgPSAyOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDg7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVYUEFOREVEX1BPSU5UUyA9IHsgMCwgMiwgOCwgMiwgNCwgNiB9OyAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ09MTEFQU0VEX1BPSU5UUyA9IHsgMiwgMCwgMiwgOCwgNiwgNCB9OyAKLSAgcHJpdmF0ZSBpbnQgZk11bHRpcGxpZXIgPSAyOwotICBwcml2YXRlIGludCBmSGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7ICAKLQotICAvKiBhY2Nlc3NpYmlsaXR5ICovCi0gIHByaXZhdGUgU3RyaW5nIGZOYW1lOwotICBwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0KLSAgcHVibGljIFRvZ2dsZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgaW5pdEFjY2Vzc2libGUoKTsKLQotICAgIGFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7Ci0gICAgICAgIHBhaW50KGUpOwotICAgICAgfQotICAgIH0pOwotICAgIGFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24pOwotICAgICAgfQotICAgIH0pOwotICAgIGFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgIGlmIChlLmNoYXJhY3RlciA9PSAnXHInIHx8IGUuY2hhcmFjdGVyID09ICcgJykgewotICAgICAgICAgIC8vIEFjdGl2YXRpb24KLSAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgICBhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLSAgICAgICAgaWYgKGUuZGV0YWlsICE9IFNXVC5UUkFWRVJTRV9SRVRVUk4pCi0gICAgICAgICAgZS5kb2l0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBhZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0xpc3RlbmVyKCkgewotICAgICAgcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0gICAgICAgIGlmICghZkhhc0ZvY3VzKSB7Ci0gICAgICAgICAgZkhhc0ZvY3VzID0gdHJ1ZTsKLSAgICAgICAgICByZWRyYXcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotICAgICAgICBpZiAoZkhhc0ZvY3VzKSB7Ci0gICAgICAgICAgZkhhc0ZvY3VzID0gZmFsc2U7Ci0gICAgICAgICAgcmVkcmF3KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICBmQ29sbGFwc2VkID0gIWZDb2xsYXBzZWQ7Ci0gICAgICAgIHJlZHJhdygpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgYWRkTW91c2VUcmFja0xpc3RlbmVyKG5ldyBNb3VzZVRyYWNrQWRhcHRlcigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7Ci0gICAgICAgIGZIb3ZlciA9IHRydWU7Ci0gICAgICAgIGlmIChmQWN0aXZlQ3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgc2V0Q3Vyc29yKGZBY3RpdmVDdXJzb3IpOwotICAgICAgICByZWRyYXcoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgZkhvdmVyID0gZmFsc2U7Ci0gICAgICAgIGlmIChmQWN0aXZlQ3Vyc29yICE9IG51bGwpCi0gICAgICAgICAgc2V0Q3Vyc29yKG51bGwpOwotICAgICAgICByZWRyYXcoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgY2hlY2tXaWRnZXQoKTsKLSAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgIGFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBUeXBlZExpc3RlbmVyKGxpc3RlbmVyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWNvcmF0aW9uQ29sb3IoQ29sb3IgZGVjb3JhdGlvbkNvbG9yKSB7Ci0gICAgdGhpcy5mRGVjb3JhdGlvbkNvbG9yID0gZGVjb3JhdGlvbkNvbG9yOwotICB9Ci0KLSAgcHVibGljIENvbG9yIGdldERlY29yYXRpb25Db2xvcigpIHsKLSAgICByZXR1cm4gZkRlY29yYXRpb25Db2xvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZURlY29yYXRpb25Db2xvcihDb2xvciBhY3RpdmVDb2xvcikgewotICAgIHRoaXMuZkFjdGl2ZUNvbG9yID0gYWN0aXZlQ29sb3I7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIGNoZWNrV2lkZ2V0KCk7Ci0gICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICByZW1vdmVMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVDdXJzb3IoQ3Vyc29yIGFjdGl2ZUN1cnNvcikgewotICAgIHRoaXMuZkFjdGl2ZUN1cnNvciA9IGFjdGl2ZUN1cnNvcjsKLSAgfQotCi0gIHB1YmxpYyBDb2xvciBnZXRBY3RpdmVEZWNvcmF0aW9uQ29sb3IoKSB7Ci0gICAgcmV0dXJuIGZBY3RpdmVDb2xvcjsKLSAgfQotCi0gIHB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7Ci0KLSAgICByZXR1cm4gbmV3IFBvaW50KCh3SGludCAhPSBTV1QuREVGQVVMVCA/IHdIaW50IDogZkhlaWdodCArIDIgKiBNQVJHSU5fV0lEVEgpLCAoaEhpbnQgIT0gU1dULkRFRkFVTFQgPyBoSGludCA6IGZIZWlnaHQgKyAyICogTUFSR0lOX0hFSUdIVCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0gICAgR0MgZ2MgPSBlLmdjOwotICAgIFBvaW50IHNpemUgPSBnZXRTaXplKCk7Ci0gICAgZ2Muc2V0Rm9udChnZXRGb250KCkpOwotICAgIHBhaW50KGdjKTsKLSAgICBpZiAoZkhhc0ZvY3VzKSB7Ci0gICAgICBnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0gICAgICBnYy5kcmF3Rm9jdXMoMCwgMCwgc2l6ZS54LCBzaXplLnkpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgU2VsZWN0YWJsZUNvbnRyb2wjcGFpbnQoR0MpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwYWludChHQyBnYykgewotICAgIGlmIChmSG92ZXIgJiYgZkFjdGl2ZUNvbG9yICE9IG51bGwpCi0gICAgICBnYy5zZXRCYWNrZ3JvdW5kKGZBY3RpdmVDb2xvcik7Ci0gICAgZWxzZSBpZiAoZkRlY29yYXRpb25Db2xvciAhPSBudWxsKQotICAgICAgZ2Muc2V0QmFja2dyb3VuZChmRGVjb3JhdGlvbkNvbG9yKTsKLSAgICBlbHNlCi0gICAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7Ci0gICAgUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsKLSAgICBnYy5maWxsUG9seWdvbih0cmFuc2xhdGUoKGZDb2xsYXBzZWQgPyBDT0xMQVBTRURfUE9JTlRTIDogRVhQQU5ERURfUE9JTlRTKSwgKChzaXplLnggLSBmSGVpZ2h0KSAvIDIpLCAoKHNpemUueSAtIGZIZWlnaHQpIC8gMikpKTsKLSAgICBnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7Ci0gIH0KLQotICBwcml2YXRlIGludFtdIHRyYW5zbGF0ZShpbnRbXSBkYXRhLCBpbnQgeCwgaW50IHkpIHsKLSAgICBpbnRbXSB0YXJnZXQgPSBuZXcgaW50W2RhdGEubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDIpIHsKLSAgICAgIHRhcmdldFtpXSA9IGRhdGFbaV0qZkhlaWdodC9ERUZBVUxUX0hFSUdIVCArIHg7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMikgewotICAgICAgdGFyZ2V0W2ldID0gZGF0YVtpXSpmSGVpZ2h0L0RFRkFVTFRfSEVJR0hUICsgeTsKLSAgICB9Ci0gICAgcmV0dXJuIHRhcmdldDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCB5KSB7Ci0gICAgZkhlaWdodCA9IHk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUpIHsKLSAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudCgpOwotICAgIGV2ZW50LnR5cGUgPSBldmVudFR5cGU7Ci0gICAgZXZlbnQud2lkZ2V0ID0gdGhpczsKLSAgICBub3RpZnlMaXN0ZW5lcnMoZXZlbnRUeXBlLCBldmVudCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRTZWxlY3Rpb24oKSB7Ci0gICAgcmV0dXJuIGZDb2xsYXBzZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oYm9vbGVhbiBzZWxlY3Rpb24pIHsKLSAgICB0aGlzLmZDb2xsYXBzZWQgPSBzZWxlY3Rpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgZk5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdEFjY2Vzc2libGUoKSB7Ci0gICAgZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUFkYXB0ZXIoKSB7Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgZS5yZXN1bHQgPSBmTmFtZTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZ2V0RGVzY3JpcHRpb24oQWNjZXNzaWJsZUV2ZW50IGUpIHsKLSAgICAgICAgZS5yZXN1bHQgPSBmRGVzY3JpcHRpb247Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBnZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotCi0gICAgICBwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7Ci0gICAgICAgIFBvaW50IHB0ID0gdG9EaXNwbGF5KG5ldyBQb2ludChsb2NhdGlvbi54LCBsb2NhdGlvbi55KSk7Ci0gICAgICAgIGUueCA9IHB0Lng7Ci0gICAgICAgIGUueSA9IHB0Lnk7Ci0gICAgICAgIGUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsKLSAgICAgICAgZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgIGUuZGV0YWlsID0gMDsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgZS5kZXRhaWwgPSBBQ0MuUk9MRV9UUkVFOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBnZXRTdGF0ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgZS5kZXRhaWwgPSBmQ29sbGFwc2VkID8gQUNDLlNUQVRFX0NPTExBUFNFRCA6IEFDQy5TVEFURV9FWFBBTkRFRDsKLSAgICAgIH0KLQotICAgIH0pOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvZmxhdHVpL1dpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZiZDYwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL2ZsYXR1aS9XaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVmlld0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIFdpZGdldEZhY3RvcnkgewkKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9IRUFERVJfQ09MT1IgPSAiX19kZWZhdWx0X19oZWFkZXJfXyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0JBQ0tHUk9VTkQgPSAiX19iZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0JPUkRFUiA9ICJfX2JvcmRlciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IgPSAiX19jb21wU2VwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfSFlQRVJMSU5LPSJfX2h5cGVybGluayI7Ci0gICAgCi0gIHByaXZhdGUgSGFzaHRhYmxlIGNvbG9yUmVnaXN0cnkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByaXZhdGUgQ29sb3IgYmFja2dyb3VuZENvbG9yOwotICBwcml2YXRlIENvbG9yIGNsaWVudEFyZWFDb2xvcjsKLSAgcHJpdmF0ZSBLZXlMaXN0ZW5lciBkZWxldGVMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBDb2xvciBmb3JlZ3JvdW5kQ29sb3I7Ci0gIHByaXZhdGUgQ29sb3IgZlJlYWRPbmx5Q29sb3I7Ci0gIHByaXZhdGUgRGlzcGxheSBmRGlzcGxheTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX1NUWUxFID0gU1dULk5PTkU7Ci0gIHByaXZhdGUgQm9yZGVyUGFpbnRlciBib3JkZXJQYWludGVyOwotICBwcml2YXRlIENvbG9yIGJvcmRlckNvbG9yOwotICBwcml2YXRlIEh5cGVybGlua0hhbmRsZXIgaHlwZXJsaW5rSGFuZGxlcjsKLSAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZkJhbm5lcjsKLSAgCi0KLSAgY2xhc3MgQm9yZGVyUGFpbnRlciBpbXBsZW1lbnRzIFBhaW50TGlzdGVuZXIgewotICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotICAgICAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGV2ZW50LndpZGdldDsKLSAgICAgICAgICAgIENvbnRyb2xbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIENvbnRyb2wgYyA9IGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIC8vaWYgKGMuaXNFbmFibGVkKCk9PWZhbHNlKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFRleHQKLSAgICAgICAgICAgICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIENhbnZhcwotICAgICAgICAgICAgICAgICAgICB8fCBjIGluc3RhbmNlb2YgQ0NvbWJvKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBiID0gYy5nZXRCb3VuZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgR0MgZ2MgPSBldmVudC5nYzsKLSAgICAgICAgICAgICAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChjLmdldEJhY2tncm91bmQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMSwgYi53aWR0aCArIDEsIGIuaGVpZ2h0ICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAyLCBiLnkgLSAyLCBiLndpZHRoICsgMywgYi5oZWlnaHQgKyAzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIFRhYmxlCi0gICAgICAgICAgICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBUcmVlCi0gICAgICAgICAgICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBUYWJsZVRyZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgICAgICBHQyBnYyA9IGV2ZW50LmdjOwotICAgICAgICAgICAgICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgLy9nYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOwotICAgICAgICAgICAgICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueC0xLCBiLnktMSwgYi53aWR0aCsyLCBiLmhlaWdodCsyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotcHVibGljIFdpZGdldEZhY3RvcnkoKSB7Ci0gCWZEaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0gICAgaW5pdGlhbGl6ZSgpOwotfQotCi1wdWJsaWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0gICAgaW50IGZsYXRTdHlsZSA9IEJPUkRFUl9TVFlMRSA9PSBTV1QuQk9SREVSID8gU1dULk5VTEwgOiBTV1QuRkxBVDsKLSAgICAvL2ludCBmbGF0U3R5bGUgPSBTV1QuTlVMTDsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsKLSAgICBidXR0b24uc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIGJ1dHRvbi5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgaWYgKHRleHQhPW51bGwpIGJ1dHRvbi5zZXRUZXh0KHRleHQpOwotICAgIHJldHVybiBidXR0b247Ci19Ci1wdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLX0KLXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgc3R5bGUpOwotICAgIGNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLX0KLXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBjb21wb3NpdGUuc2V0QmFja2dyb3VuZChnZXRDb2xvcihDT0xPUl9DT01QT1NJVEVfU0VQQVJBVE9SKSk7Ci0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLX0KLXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19OT05FKTsKLQlncm91cC5zZXRUZXh0KHRleHQpOwotICAgIGdyb3VwLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICBncm91cC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0JcmV0dXJuIGdyb3VwOwotfQotcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgQ29sb3IgYmcpIHsKLSAgICByZXR1cm4gY3JlYXRlSGVhZGluZ0xhYmVsKHBhcmVudCwgdGV4dCwgYmcsIFNXVC5OT05FKTsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVIZWFkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIENvbG9yIGJnLCBpbnQgc3R5bGUpIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsKLSAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotICAgIGxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgbGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoSkZhY2VSZXNvdXJjZXMuQkFOTkVSX0ZPTlQpKTsKLSAgICByZXR1cm4gbGFiZWw7Ci19Ci1wdWJsaWMgTGFiZWwgY3JlYXRlSHlwZXJsaW5rTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgIHJldHVybiBjcmVhdGVIeXBlcmxpbmtMYWJlbChwYXJlbnQsIHRleHQsIGxpc3RlbmVyLCBTV1QuTlVMTCk7Ci19Ci1wdWJsaWMgTGFiZWwgY3JlYXRlSHlwZXJsaW5rTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIElIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lciwgaW50IHN0eWxlKSB7Ci0gICAgTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIHN0eWxlKTsKLSAgICB0dXJuSW50b0h5cGVybGluayhsYWJlbCwgbGlzdGVuZXIpOwotICAgIHJldHVybiBsYWJlbDsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotICAgIHJldHVybiBjcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5OT05FKTsKLX0KLXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBzdHlsZSk7Ci0gICAgaWYgKHRleHQhPW51bGwpIGxhYmVsLnNldFRleHQodGV4dCk7Ci0gICAgbGFiZWwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgIGxhYmVsLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICByZXR1cm4gbGFiZWw7Ci19Ci1wdWJsaWMgTGFiZWwgY3JlYXRlU2VwYXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IHN0eWxlKTsKLSAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0gICAgbGFiZWwuc2V0Rm9yZWdyb3VuZChib3JkZXJDb2xvcik7Ci0gICAgcmV0dXJuIGxhYmVsOwotfQotcHVibGljIFNjcm9sbGVkQ29tcG9zaXRlIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlIChDb21wb3NpdGUgcGFyZW50KSB7Ci0JU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsZWRjb21wb3NpdGUgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgIHNjcm9sbGVkY29tcG9zaXRlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICBzY3JvbGxlZGNvbXBvc2l0ZS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgcmV0dXJuIHNjcm9sbGVkY29tcG9zaXRlOwotfQotcHVibGljIFRhYmxlIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgQk9SREVSX1NUWUxFIHwgc3R5bGUpOwotICAgIHRhYmxlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLSAgICB0YWJsZS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgLy9ob29rRGVsZXRlTGlzdGVuZXIodGFibGUpOwotICAgIHJldHVybiB0YWJsZTsKLX0KLXB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZVRleHQocGFyZW50LCB2YWx1ZSwgQk9SREVSX1NUWUxFIHwgU1dULlNJTkdMRSk7Ci19Ci1wdWJsaWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB2YWx1ZSwgaW50IHN0eWxlKSB7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBzdHlsZSk7Ci0gICAgdGV4dC5zZXRUZXh0KHZhbHVlKTsKLSAgICB0ZXh0LnNldEJhY2tncm91bmQoY2xpZW50QXJlYUNvbG9yKTsKLSAgICB0ZXh0LnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICBpZiAoKHN0eWxlICYgU1dULlJFQURfT05MWSkgIT0gMCkKLSAgICAJdGV4dC5zZXRGb3JlZ3JvdW5kKGZSZWFkT25seUNvbG9yKTsKLSAgICByZXR1cm4gdGV4dDsKLX0KLXB1YmxpYyBUcmVlIGNyZWF0ZVRyZWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgVHJlZSB0cmVlID0gbmV3IFRyZWUocGFyZW50LCBCT1JERVJfU1RZTEUgfCBzdHlsZSk7Ci0gICAgdHJlZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0gICAgdHJlZS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgLy9ob29rRGVsZXRlTGlzdGVuZXIodHJlZSk7Ci0gICAgcmV0dXJuIHRyZWU7Ci19Ci0vKiAKLXByaXZhdGUgdm9pZCBkZWxldGVLZXlQcmVzc2VkKFdpZGdldCB3aWRnZXQpIHsKLSAgICBpZiAoISh3aWRnZXQgaW5zdGFuY2VvZiBDb250cm9sKSkgcmV0dXJuOwotICAgIENvbnRyb2wgY29udHJvbCA9IChDb250cm9sKXdpZGdldDsKLSAgICBmb3IgKENvbnRyb2wgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsKLSAgICAgICAgcGFyZW50ICE9IG51bGw7Ci0gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKSkgewotICAgICAgICBpZiAocGFyZW50LmdldERhdGEoKSBpbnN0YW5jZW9mIEZvcm1TZWN0aW9uKSB7Ci0gICAgICAgICAgICBGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBwYXJlbnQuZ2V0RGF0YSgpOwotICAgICAgICAgICAgc2VjdGlvbi5kb0dsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkRFTEVURSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLSovCi1wdWJsaWMgVmlld0Zvcm0gY3JlYXRlVmlld0Zvcm0oQ29tcG9zaXRlIHBhcmVudCkgewotCVZpZXdGb3JtIHZpZXdGb3JtID0gbmV3IFZpZXdGb3JtKHBhcmVudCwgU1dULk5VTEwpOwotICAgIHZpZXdGb3JtLnNldEJhY2tncm91bmQoY2xpZW50QXJlYUNvbG9yKTsKLSAgICB2aWV3Rm9ybS5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgcmV0dXJuIHZpZXdGb3JtOwotfQotcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICBFbnVtZXJhdGlvbiBjb2xvcnM9IGNvbG9yUmVnaXN0cnkuZWxlbWVudHMoKTsKLSAgICB3aGlsZSAoY29sb3JzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgIENvbG9yIGMgPSAoQ29sb3IpY29sb3JzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGMuZGlzcG9zZSgpOwotICAgIH0KLSAgICBoeXBlcmxpbmtIYW5kbGVyLmRpc3Bvc2UoKTsKLSAgICBjb2xvclJlZ2lzdHJ5PW51bGw7Ci0gICAgaWYgKGZCYW5uZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmQmFubmVyLmRpc3Bvc2UoKTsKLSAgICAgIGZCYW5uZXIgPSBudWxsOwotICAgIH0KLX0KLXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kQ29sb3IoKSB7Ci0gICAgcmV0dXJuIGJhY2tncm91bmRDb2xvcjsKLX0KLXB1YmxpYyBJbWFnZSBnZXRCYW5uZXIoKSB7Ci0gIGlmIChmQmFubmVyID09IG51bGwpCi0gIHsKLSAgICB0cnkgewotICAgICAgZkJhbm5lciA9IChJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKChXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKSksICJpY29uc1xmb3JtX2Jhbm5lci5naWYiKSkpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZWQgSW1hZ2UhISEhICIpOwotICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiEhISEgIiArIGUpOwotICAgIH0KLSAgfQotICByZXR1cm4gZkJhbm5lcjsKLX0KLXB1YmxpYyBDb2xvciBnZXRCb3JkZXJDb2xvcigpIHsKLSAgICByZXR1cm4gYm9yZGVyQ29sb3I7Ci19Ci1wdWJsaWMgQ3Vyc29yIGdldEJ1c3lDdXJzb3IoKSB7Ci0gICAgcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0QnVzeUN1cnNvcigpOwotfQotcHVibGljIENvbG9yIGdldENsaWVudEFyZWFDb2xvcigpIHsKLSAgICByZXR1cm4gY2xpZW50QXJlYUNvbG9yOwotfQotcHVibGljIENvbG9yIGdldENvbG9yKFN0cmluZyBrZXkpIHsKLSAgICByZXR1cm4gKENvbG9yKWNvbG9yUmVnaXN0cnkuZ2V0KGtleSk7Ci19Ci1wdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZENvbG9yKCkgewotICAgIHJldHVybiBmb3JlZ3JvdW5kQ29sb3I7Ci19Ci1wdWJsaWMgQ29sb3IgZ2V0SHlwZXJsaW5rQ29sb3IoKSB7Ci0gICAgcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0Rm9yZWdyb3VuZCgpOwotfQotcHVibGljIEN1cnNvciBnZXRIeXBlcmxpbmtDdXJzb3IoKSB7Ci0gICAgcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0SHlwZXJsaW5rQ3Vyc29yKCk7Ci19Ci1wdWJsaWMgQ29sb3IgZ2V0SHlwZXJsaW5rSG92ZXJDb2xvcigpIHsKLSAgICByZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRBY3RpdmVGb3JlZ3JvdW5kKCk7Ci19Ci1wdWJsaWMgaW50IGdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKSB7Ci0gICAgcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgpOwotfQotLyoKLXB1YmxpYyB2b2lkIGhvb2tEZWxldGVMaXN0ZW5lcihDb250cm9sIGNvbnRyb2wpIHsKLSAgICBpZiAoZGVsZXRlTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICBkZWxldGVMaXN0ZW5lciA9IG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5jaGFyYWN0ZXIgPT0gU1dULkRFTCAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZWxldGVLZXlQcmVzc2VkKGV2ZW50LndpZGdldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLSAgICBjb250cm9sLmFkZEtleUxpc3RlbmVyKGRlbGV0ZUxpc3RlbmVyKTsKLX0KLSovCi0gIHByaXZhdGUgdm9pZCBpbml0U3RhdGljQ29sb3JzKCkKLSAgewotICAgIGlmIChjb2xvclJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgY29sb3JSZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIHJlZ2lzdGVyQ29sb3IoQ09MT1JfQkFDS0dST1VORCwgMHhmZiwgMHhmZSwgMHhmOSk7Ci0gICAgICByZWdpc3RlckNvbG9yKENPTE9SX0JPUkRFUiwgMTk1LCAxOTEsIDE3OSk7Ci0gICAgICByZWdpc3RlckNvbG9yKENPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IsIDE1MiwgMTcwLCAyMDMpOwotICAgICAgcmVnaXN0ZXJDb2xvcihERUZBVUxUX0hFQURFUl9DT0xPUiwgMHg0OCwgMHg3MCwgMHg5OCk7Ci0gICAgICByZWdpc3RlckNvbG9yKENPTE9SX0hZUEVSTElOSywgMCwgMCwgMTUzKTsKLSAgICB9Ci0gIH0KLQotcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgY2xpZW50QXJlYUNvbG9yID0gZkRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgZlJlYWRPbmx5Q29sb3IgPSBmRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfREFSS19HUkFZKTsKLSAgICBpbml0U3RhdGljQ29sb3JzKCk7Ci0gICAgYmFja2dyb3VuZENvbG9yID0gY2xpZW50QXJlYUNvbG9yOwotICAgIGJvcmRlckNvbG9yID0gZ2V0Q29sb3IoQ09MT1JfQk9SREVSKTsKLSAgICBmb3JlZ3JvdW5kQ29sb3IgPSBmRGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLSAgICBoeXBlcmxpbmtIYW5kbGVyID0gbmV3IEh5cGVybGlua0hhbmRsZXIoKTsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnNldEZvcmVncm91bmQoZ2V0Q29sb3IoQ09MT1JfSFlQRVJMSU5LKSk7Ci0gICAgaHlwZXJsaW5rSGFuZGxlci5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci19Ci1wdWJsaWMgdm9pZCBwYWludEJvcmRlcnNGb3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIGlmIChCT1JERVJfU1RZTEUgPT0gU1dULkJPUkRFUikgcmV0dXJuOwotICAgIGlmIChib3JkZXJQYWludGVyPT1udWxsKSBib3JkZXJQYWludGVyID0gbmV3IEJvcmRlclBhaW50ZXIoKTsKLSAgICBwYXJlbnQuYWRkUGFpbnRMaXN0ZW5lcihib3JkZXJQYWludGVyKTsKLX0KLXB1YmxpYyBDb2xvciByZWdpc3RlckNvbG9yKFN0cmluZyBrZXksIGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgICBDb2xvciBjID0gbmV3IENvbG9yKGZEaXNwbGF5LCByLCBnLCBiKTsKLSAgICBjb2xvclJlZ2lzdHJ5LnB1dChrZXksIGMpOwotICAgIHJldHVybiBjOwotfQotCi1wdWJsaWMgdm9pZCBzZXRDbGllbnRBcmVhQ29sb3IoQ29sb3IgY29sb3IpCi17Ci0gIGNsaWVudEFyZWFDb2xvciA9IGNvbG9yOwotICBiYWNrZ3JvdW5kQ29sb3IgPSBjbGllbnRBcmVhQ29sb3I7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0NvbG9yKENvbG9yIGNvbG9yKSB7Ci0gICAgaHlwZXJsaW5rSGFuZGxlci5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLX0KLXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0hvdmVyQ29sb3Iob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIGhvdmVyQ29sb3IpIHsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnNldEFjdGl2ZUZvcmVncm91bmQoaG92ZXJDb2xvcik7Ci19Ci1wdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKGludCBuZXdIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKSB7Ci0gICAgaHlwZXJsaW5rSGFuZGxlci5zZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKG5ld0h5cGVybGlua1VuZGVybGluZU1vZGUpOwotfQotcHVibGljIHZvaWQgdHVybkludG9IeXBlcmxpbmsoQ29udHJvbCBjb250cm9sLCBJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICBoeXBlcmxpbmtIYW5kbGVyLnJlZ2lzdGVySHlwZXJsaW5rKGNvbnRyb2wsIGxpc3RlbmVyKTsKLX0KLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvdWkvQmFzZURlc2lnbldpbmRvdy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9CYXNlRGVzaWduV2luZG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYzRhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9CYXNlRGVzaWduV2luZG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQmFzZURlc2lnbldpbmRvdyBleHRlbmRzIFZpZXdlcgotewotICBwcml2YXRlIEZvbnQgZm9udDsKLQotICBwcm90ZWN0ZWQgU2Nyb2xsZWRDb21wb3NpdGUgbWFpblVJQ29tcG9uZW50OwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbnRyb2xzQ29udGFpbmVyOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHBhZ2VDb21wbGV0ZSA9IHRydWU7Ci0gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7Ci0KLSAgcHJpdmF0ZSBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZTsKLQotICBwdWJsaWMgQmFzZURlc2lnbldpbmRvdyhJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZSkKLSAgewotICAgIHRoaXMuc3RhdHVzTGluZSA9IHN0YXR1c0xpbmU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRTdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lKQotICB7Ci0gICAgdGhpcy5zdGF0dXNMaW5lID0gc3RhdHVzTGluZTsKLSAgfQotCi0gIHByb3RlY3RlZCBJU3RhdHVzTGluZU1hbmFnZXIgZ2V0U3RhdHVzTGluZSgpCi0gIHsKLSAgICBpZiAoc3RhdHVzTGluZSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vc3RhdHVzTGluZSA9IFdvcmtiZW5jaFV0aWxpdHkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQotICAgICAgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgCi0gICAgICB0cnkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IChFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcillZGl0b3JQYXJ0LmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotICAgICAgICBzdGF0dXNMaW5lID0gY29udHJpYnV0b3IuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9ICAKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1c0xpbmU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkKLSAgewotICAgIGlmICh0aGlzLmlucHV0ICE9IGlucHV0KSAKLSAgICB7Ci0gICAgICBzZXRFcnJvck1lc3NhZ2UoIiIpOwotICAgIH0KLSAgICAKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gIH0KLQotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZWFsKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEEgZGVzaWduIHZpZXcgdGhhdCBoYXMgYSBtYWluIGFyZWEgZm9yIGNvbnRyb2xzLCBhbmQgYSBtZXNzYWdlIGxpbmUgYXQKLSAgICogdGhlIGJvdHRvbQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGVzaWduUGFuZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykKLSAgewotICAgIEdyaWREYXRhIGdkOwotCi0gICAgLy8gQ3JlYXRlIHRoZSBtYWluIFVJIGNvbnRhaW5lcgotICAgIG1haW5VSUNvbXBvbmVudD0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICAgICAgewotICAgICAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgICAgICBpZiAodmlzaWJsZSA9PSBmYWxzZSAmJiAhY3VycmVudE1lc3NhZ2UuZXF1YWxzKCIiKSkKLSAgICAgICAgewotICAgICAgICAgIHNob3dNZXNzYWdlSW5TdGF0dXNMaW5lKHZpc2libGUgPT0gdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotCi0vLyAgICBtYWluVUlDb21wb25lbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLSAgICBjb250cm9sc0NvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUobWFpblVJQ29tcG9uZW50LCBTV1QuTk9ORSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbnRyb2xzQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29udHJvbHNDb250YWluZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICAvLyBUT0RPOiBSZW1vdmUgYWJvdmUgbGluZSBhbmQgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgdHdvIHdoZW4gWFNERWRpdG9yIHZpZXdzCi0gICAgLy8gYXJlIHJld3JpdHRlbi4gIEFsc28gcmVmZXIgZG8gcmVsYXRlZCBUT0RPIGluIERUREVkaXRvcidzIEJhc2VXaW5kb3cuCi0gICAgLy8gRmxhdFZpZXdVdGlsaXR5IGZsYXRWaWV3VXRpbGl0eSA9IG5ldyBGbGF0Vmlld1V0aWxpdHkoKTsKLSAgICAvLyBjb250cm9sc0NvbnRhaW5lciA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUobWFpblVJQ29tcG9uZW50LCBudW1Db2x1bW5zKTsKLQotICAgIG1haW5VSUNvbXBvbmVudC5zZXRDb250ZW50KGNvbnRyb2xzQ29udGFpbmVyKTsKLQotICAgIHJldHVybiBtYWluVUlDb21wb25lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTY3JvbGxDb21wb3NpdGUoKQotICB7Ci0gICAgUG9pbnQgcCA9IGNvbnRyb2xzQ29udGFpbmVyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0gICAgbWFpblVJQ29tcG9uZW50LnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0gICAgbWFpblVJQ29tcG9uZW50LnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotICAgIG1haW5VSUNvbXBvbmVudC5zZXRNaW5TaXplKHApOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sc0NvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbHNDb250YWluZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29tcGxldGUgc3RhdGUgb2YgdGhlIHBhZ2UuCi0gICAqIElmIGZhbHNlLCB0aGVuIGNsaWVudCBpcyBub3QgYWxsb3dlZCB0byBtb3ZlIHRvIG5leHQgcGFnZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UGFnZUNvbXBsZXRlKGJvb2xlYW4gY29tcGxldGUpCi0gIHsKLSAgICBwYWdlQ29tcGxldGU9IGNvbXBsZXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgcGFnZSBpcyBjb21wbGV0ZSBvciBub3QuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpCi0gIHsKLSAgICByZXR1cm4gcGFnZUNvbXBsZXRlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudE1lc3NhZ2UgPSAiIjsKLSAgcHJvdGVjdGVkIHZvaWQgc2hvd01lc3NhZ2VJblN0YXR1c0xpbmUoYm9vbGVhbiBzaG93KQotICB7Ci0gICAgaWYgKGdldFN0YXR1c0xpbmUoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChzaG93KSAKLSAgICB7Ci0gICAgICBnZXRTdGF0dXNMaW5lKCkuc2V0RXJyb3JNZXNzYWdlKGN1cnJlbnRNZXNzYWdlKTsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICBnZXRTdGF0dXNMaW5lKCkuc2V0RXJyb3JNZXNzYWdlKCIiKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgZ2V0U3RhdHVzTGluZSgpLnVwZGF0ZShmYWxzZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXRzIHRoZSBtZXNzYWdlIGxpbmUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBjdXJyZW50TWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgaWYgKGdldFN0YXR1c0xpbmUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGdldFN0YXR1c0xpbmUoKS5zZXRFcnJvck1lc3NhZ2UoY3VycmVudE1lc3NhZ2UpOwotICAgICAgZ2V0U3RhdHVzTGluZSgpLnVwZGF0ZShmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENsZWFycyBhIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhck1lc3NhZ2UoKQotICB7Ci0gICAgY3VycmVudE1lc3NhZ2UgPSAiIjsKLSAgICBpZiAoZ2V0U3RhdHVzTGluZSgpICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0U3RhdHVzTGluZSgpLnNldEVycm9yTWVzc2FnZShjdXJyZW50TWVzc2FnZSk7Ci0gICAgICBnZXRTdGF0dXNMaW5lKCkudXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBzZXRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbGVhckVycm9yTWVzc2FnZSgpCi0gIHsKLSAgICBjbGVhck1lc3NhZ2UoKTsKLSAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gY3VycmVudE1lc3NhZ2U7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9Cb3JkZXJQYWludGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL3VpL0JvcmRlclBhaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiZGViNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC91dGlsL3VpL0JvcmRlclBhaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UYWJsZVRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci0KLXB1YmxpYyBjbGFzcyBCb3JkZXJQYWludGVyIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lcgotewotICBDb2xvciBiYWNrZ3JvdW5kQ29sb3IsIGZvcmVncm91bmRDb2xvcjsKLSAgc3RhdGljIENvbG9yIGJvcmRlckNvbG9yOwotCi0gIHB1YmxpYyBCb3JkZXJQYWludGVyKCkKLSAgewotICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgIGlmIChib3JkZXJDb2xvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGJvcmRlckNvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAxOTUsIDE5MSwgMTc5KTsgIAkKLSAgICB9Ci0gICAgYmFja2dyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLSAgICBmb3JlZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwkKLSAgfQotCQotICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBldmVudC53aWRnZXQ7Ci0gICAgQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBDb250cm9sIGMgPSBjaGlsZHJlbltpXTsKLSAgICAgIGlmIChjLmlzRW5hYmxlZCgpPT1mYWxzZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBUZXh0Ci0gICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIENhbnZhcwotICAgICAgICAgIHx8IGMgaW5zdGFuY2VvZiBMaXN0Ci0gICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIENDb21ibykKLSAgICAgICAgewotICAgICAgICAgIFJlY3RhbmdsZSBiID0gYy5nZXRCb3VuZHMoKTsKLSAgICAgICAgICBHQyBnYyA9IGV2ZW50LmdjOwotICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLS8vICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDEsIGIueSAtIDEsIGIud2lkdGggKyAxLCBiLmhlaWdodCArIDEpOwotICAgICAgICAgIGdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IpOwotICAgICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMiwgYi55IC0gMiwgYi53aWR0aCArIDMsIGIuaGVpZ2h0ICsgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoYyBpbnN0YW5jZW9mIFRleHQKLS8vICAgICAgICB8fCBjIGluc3RhbmNlb2YgQ2FudmFzCi0gICAgICAgIHx8IGMgaW5zdGFuY2VvZiBMaXN0Ci0gICAgICAgIHx8IGMgaW5zdGFuY2VvZiBDQ29tYm8pCi0gICAgICB7Ci0gICAgICAgIFJlY3RhbmdsZSBiID0gYy5nZXRCb3VuZHMoKTsKLSAgICAgICAgR0MgZ2MgPSBldmVudC5nYzsKLSAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDEsIGIueSAtIDEsIGIud2lkdGggKyAxLCBiLmhlaWdodCArIDEpOwotICAgICAgICBnYy5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgICAgIGdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMiwgYi55IC0gMiwgYi53aWR0aCArIDMsIGIuaGVpZ2h0ICsgMyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjIGluc3RhbmNlb2YgVGFibGUKLSAgICAgICAgfHwgYyBpbnN0YW5jZW9mIFRyZWUKLSAgICAgICAgfHwgYyBpbnN0YW5jZW9mIFRhYmxlVHJlZSkgewotICAgICAgICBSZWN0YW5nbGUgYiA9IGMuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIEdDIGdjID0gZXZlbnQuZ2M7Ci0gICAgICAgIGdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsKLSAgICAgICAgLy9nYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOwotICAgICAgICBnYy5kcmF3UmVjdGFuZ2xlKGIueC0xLCBiLnktMSwgYi53aWR0aCsyLCBiLmhlaWdodCsyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9GbGF0Vmlld1V0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3V0aWwvdWkvRmxhdFZpZXdVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmExMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdXRpbC91aS9GbGF0Vmlld1V0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aS5GbGF0UGFnZUhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aS5XaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRmxhdFZpZXdVdGlsaXR5IGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lcgotewotICBDb2xvciBiYWNrZ3JvdW5kQ29sb3IsIGZvcmVncm91bmRDb2xvcjsKLSAgQ29sb3IgY29tYm9CYWNrZ3JvdW5kQ29sb3IsIGNvbWJvRGlzYWJsZWRDb2xvcjsKLSAgc3RhdGljIENvbG9yIGJvcmRlckNvbG9yOwotCi0gIC8vIEFkZGVkIGZvciBjcmVhdGVGbGF0UGFnZUhlYWRlcigpCi0gIHByaXZhdGUgYm9vbGVhbiBoZWFkaW5nVmlzaWJsZT10cnVlOwotICBwcml2YXRlIEltYWdlIGhlYWRpbmdJbWFnZSA9IG51bGw7Ci0gIHByaXZhdGUgQ29tcG9zaXRlIGhlYWRlckNvbnRyb2wgPSBudWxsOwotICBwcml2YXRlIGludCBUSVRMRV9WTUFSR0lOID0gNTsKLSAgcHJpdmF0ZSBGbGF0UGFnZUhlYWRlciBmbGF0UGFnZUhlYWRlciA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBLZXlib2FyZEhhbmRsZXIga2V5Ym9hcmRIYW5kbGVyOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhfU0NST0xMX0lOQ1JFTUVOVCA9IDU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZfU0NST0xMX0lOQ1JFTUVOVCA9IDY0OwotICAKLSAgLy8gdGhpcyBkZWZhdWx0cyB0byB0aGUgZmxhdCBzdHlsZSwgYnV0IHVzZXJzIGNhbiBjaGFuZ2UgaXQgaWYgdGhleSB3aXNoCi0gIHByaXZhdGUgaW50IGZsYXRTdHlsZSA9IFNXVC5GTEFUOwotICBwcml2YXRlIGludCBib3JkZXIgPSAwOwotCi0gIHB1YmxpYyBGbGF0Vmlld1V0aWxpdHkoKQotICB7IAotICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgIGlmIChib3JkZXJDb2xvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGJvcmRlckNvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAxOTUsIDE5MSwgMTc5KTsgIAkKLSAgICB9Ci0gICAgYmFja2dyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLSAgICBmb3JlZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotICAgIGNvbWJvQmFja2dyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLSAgICBjb21ib0Rpc2FibGVkQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7Ci0gICAga2V5Ym9hcmRIYW5kbGVyID0gbmV3IEtleWJvYXJkSGFuZGxlcigpOwotICB9Ci0gIAotICBwdWJsaWMgRmxhdFZpZXdVdGlsaXR5KGJvb2xlYW4gaXNGbGF0KQotICB7Ci0gICAgdGhpcygpOwotICAgIAotICAgIHNldEZsYXQoaXNGbGF0KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmxhdChib29sZWFuIGZsYXQpCi0gIHsKLSAgICBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLSAgICBpZiAoZmxhdCkKLSAgICB7Ci0gICAgICBmbGF0U3R5bGUgPSBTV1QuRkxBVDsKLSAgICAgIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0gICAgICBmb3JlZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOyAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmbGF0U3R5bGUgPSAwOwotICAgICAgYm9yZGVyID0gU1dULkJPUkRFUjsKLSAgICAgIGJhY2tncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9CQUNLR1JPVU5EKTsKLSAgICAgIGZvcmVncm91bmRDb2xvciA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9GT1JFR1JPVU5EKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldENvbG9yKENvbnRyb2wgYykKLSAgewotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgYy5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkKLSAgewotICAgIENvbnRyb2wgYyA9IChDb250cm9sKSBldmVudC53aWRnZXQ7Ci0gICAgaWYgKGMuaXNFbmFibGVkKCk9PWZhbHNlKQotICAgIHsKLSAgICAgIGlmIChjIGluc3RhbmNlb2YgVGV4dAotLy8gICAgICB8fCBjIGluc3RhbmNlb2YgQ2FudmFzCi0gICAgICAgICAgfHwgYyBpbnN0YW5jZW9mIExpc3QKLSAgICAgICAgICB8fCBjIGluc3RhbmNlb2YgQ0NvbWJvKQotICAgICAgewotICAgICAgICBSZWN0YW5nbGUgYiA9IGMuZ2V0UGFyZW50KCkuZ2V0Qm91bmRzKCk7Ci0gICAgICAgIEdDIGdjID0gZXZlbnQuZ2M7Ci0gICAgICAgIGdjLnNldEZvcmVncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLS8vICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsKLSAgICAgICAgZ2Muc2V0Rm9yZWdyb3VuZChib3JkZXJDb2xvcik7Ci0vLyAgICAgICAgZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAyLCBiLnkgLSAyLCBiLndpZHRoICsgMywgYi5oZWlnaHQgKyAzKTsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAKLQotICAgIC8vIERlZmVjdCAyNTI4OTEgOiB0aGlzIGNhdXNlcyBzb21lIG1ham9yIHByb2JsZW1zIG9uIExpbnV4IEdUSwotICAgIC8vIFRoaXMgbG9va3MgcmF0aGVyIGRvZGd5IGluIGFueSBjYXNlIHNpbmNlIGFuIGN5Y2xpYyBwYWludGluZyBiZWhhdmlvdXIKLSAgICAvLyBpcyBsaWtlbHkgb2NjdXJpbmcgaGVyZQotICAgIC8vaWYgKGMuZ2V0UGFyZW50KCkgIT0gbnVsbCkKLSAgICAvL3sKLSAgICAvLyAgYy5nZXRQYXJlbnQoKS5yZWRyYXcoKTsKLSAgICAvL30KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEZvbnQgZm9udDsKLQotICBwdWJsaWMgc3RhdGljIEZvbnQgZ2V0Rm9udCgpCi0gIHsKLSAgICBpZiAoZm9udCA9PSBudWxsKQotICAgIHsKLSAgICAgIGZvbnQgPSBuZXcgRm9udChEaXNwbGF5LmdldEN1cnJlbnQoKSwgIm1zIHNhbnMgc2VyaWYiLCA4LCBTV1QuTk9STUFMKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZvbnQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9udChGb250IG5ld0ZvbnQpCi0gIHsKLSAgICBmb250ID0gbmV3Rm9udDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbXApCi0gIHsKLSAgICAvLyBkZXByZWNhdGVkLiAgUmVtb3ZlIGxhdGVyCi0gIH0KLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVNpbXBsZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlKTsKLSAgICBjb21wb3NpdGUuc2V0Rm9udChnZXRGb250KCkpOwotICAgIHNldENvbG9yKGNvbXBvc2l0ZSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUgfCBmbGF0U3R5bGUpOwotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBzZXRDb2xvcihjb21wb3NpdGUpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgY29tcG9zaXRlLmFkZFBhaW50TGlzdGVuZXIobmV3IEJvcmRlclBhaW50ZXIoKSk7Ci0gICAgfQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucywgYm9vbGVhbiBob3Jpem9udGFsRmlsbCkKLSAgewotICAgIGlmICghaG9yaXpvbnRhbEZpbGwpCi0gICAgewotICAgICAgY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgbnVtQ29sdW1ucyk7Ci0gICAgfQotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSB8IGZsYXRTdHlsZSk7Ci0gICAgY29tcG9zaXRlLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgc2V0Q29sb3IoY29tcG9zaXRlKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIH0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGJvb2xlYW4gaG9yaXpvbnRhbEZpbGwsIGJvb2xlYW4gdmVydGljYWxGaWxsKQotICB7Ci0gICAgaWYgKCFob3Jpem9udGFsRmlsbCAmJiAhdmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIG51bUNvbHVtbnMpOwotICAgIH0KLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUgfCBmbGF0U3R5bGUpOwotICAgIGNvbXBvc2l0ZS5zZXRGb250KGdldEZvbnQoKSk7Ci0KLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgc2V0Q29sb3IoY29tcG9zaXRlKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGNvbXBvc2l0ZS5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIH0KLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0KLSAgcHVibGljIFNhc2hGb3JtIGNyZWF0ZVNhc2hGb3JtKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkKLSAgewotICAgIFNhc2hGb3JtIHNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUpOwotICAgIHNldENvbG9yKHNhc2hGb3JtKTsKLSAgICByZXR1cm4gc2FzaEZvcm07Ci0gIH0KLQotICBwdWJsaWMgUGFnZUJvb2sgY3JlYXRlUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotICB7Ci0gICAgUGFnZUJvb2sgcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSk7Ci0gICAgc2V0Q29sb3IocGFnZUJvb2spOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgcGFnZUJvb2suYWRkUGFpbnRMaXN0ZW5lcihuZXcgQm9yZGVyUGFpbnRlcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhZ2VCb29rOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgQ29sb3IgYmcpIHsKLSAgICByZXR1cm4gY3JlYXRlSGVhZGluZ0xhYmVsKHBhcmVudCwgdGV4dCwgYmcsIFNXVC5OT05FKTsKLSAgfQotICBwdWJsaWMgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBDb2xvciBiZywgaW50IHN0eWxlKSB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBzdHlsZSk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICBzZXRDb2xvcihsYWJlbCk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBsYWJlbC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7Ci0gICAgfQotICAgIGxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KEpGYWNlUmVzb3VyY2VzLkJBTk5FUl9GT05UKSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGNyZWF0ZUhvcml6b250YWxGaWxsZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IGhvcml6b250YWxTcGFuKQotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCB8IGZsYXRTdHlsZSk7Ci0gICAgc2V0Q29sb3IobGFiZWwpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBsYWJlbHMuCi0gICAqLwotICBwdWJsaWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgdGV4dCkKLSAgewotICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUgfCBmbGF0U3R5bGUpOwotICAgIHNldENvbG9yKGxhYmVsKTsKLSAgICBsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLQotICBwdWJsaWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpCi0gIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUIHwgZmxhdFN0eWxlKTsKLSAgICBzZXRDb2xvcihsYWJlbCk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0KLSAgcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgYWxpZ25tZW50KQotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCB8IGZsYXRTdHlsZSk7Ci0gICAgbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLSAgICBzZXRDb2xvcihsYWJlbCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IGFsaWdubWVudDsKLSAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjcmVhdGluZyBidXR0b25zLgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkKLSAgewotICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0ggfCBmbGF0U3R5bGUpOwotICAgIGJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLSAgICBzZXRDb2xvcihidXR0b24pOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGJ1dHRvbi5hZGRLZXlMaXN0ZW5lcihrZXlib2FyZEhhbmRsZXIpOwotCi0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIHB1YmxpYyBUYWJsZSBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IGZsYXRTdHlsZSk7Ci0gICAgc2V0Q29sb3IodGFibGUpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHJhZGlvIGJ1dHRvbgotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyB8IGZsYXRTdHlsZSk7Ci0gICAgYnV0dG9uLnNldFRleHQobGFiZWwpOwotICAgIHNldENvbG9yKGJ1dHRvbik7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgYnV0dG9uLmFkZEtleUxpc3RlbmVyKGtleWJvYXJkSGFuZGxlcik7Ci0KLSAgICByZXR1cm4gYnV0dG9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGNyZWF0aW5nIGNoZWNrIGJveAotICAgKi8KLSAgcHVibGljIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpCi0gIHsKLSAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyB8IGZsYXRTdHlsZSk7Ci0gICAgYnV0dG9uLnNldFRleHQobGFiZWwpOwotICAgIHNldENvbG9yKGJ1dHRvbik7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotCi0gIHB1YmxpYyBDb21ibyBjcmVhdGVDb21ib0JveChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNvbWJvQm94KHBhcmVudCwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBpc1JlYWRPbmx5KQotICB7Ci0gICAgaW50IHN0eWxlID0gaXNSZWFkT25seSA9PSB0cnVlID8gU1dULlJFQURfT05MWSA6IFNXVC5EUk9QX0RPV047Ci0KLSAgICBDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIHN0eWxlIHwgZmxhdFN0eWxlIHwgYm9yZGVyKTsKLSAgICBzZXRDb2xvcihjb21ibyk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBjb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIHJldHVybiBjb21ibzsKLSAgfQotCi0gIHB1YmxpYyBDQ29tYm8gY3JlYXRlQ0NvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICByZXR1cm4gY3JlYXRlQ0NvbWJvQm94KHBhcmVudCwgdHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgQ0NvbWJvIGNyZWF0ZUNDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGlzUmVhZE9ubHkpCi0gIHsKLSAgICBpbnQgc3R5bGUgPSBpc1JlYWRPbmx5ID09IHRydWUgPyBTV1QuUkVBRF9PTkxZIDogU1dULkRST1BfRE9XTjsKLQotICAgIENDb21ibyBjb21ibyA9IG5ldyBDQ29tYm8ocGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgLy8gc2V0Q29sb3IoY29tYm8pOwotICAgIC8vIEFsd2F5cyB1c2UgTGlzdCBCYWNrZ3JvdW5kCi0gICAgY29tYm8uc2V0QmFja2dyb3VuZChjb21ib0JhY2tncm91bmRDb2xvcik7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBjb21iby5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLyogICAKLSAgICAgICAvLyBEZWZlY3QgMjUyODkxIDogSSdtIG5vdCBzdXJlIGlmIHRoaXMgY29kZSB3aWxsIGFsc28gY2F1c2UgcHJvYmxlbXMgb24gTGludXggR1RLCi0gICAgICAgLy8gQnV0IHNpbmNlIGl0cyBwb3RlbnRpYWxseSBjeWNsaWMgLi4uIEknbSBjb21tZW50aW5nIGl0IG91dCBmb3Igbm93Ci0gICAgICAgY29tYm8uYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpCi0gICAgICAgewotICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KQotICAgICAgIHsKLSAgICAgICBDb250cm9sIGMgPSAoQ29udHJvbCkgZXZlbnQud2lkZ2V0OwotICAgICAgIGlmIChjLmlzRW5hYmxlZCgpPT10cnVlKQotICAgICAgIHsKLSAgICAgICBjLnNldEJhY2tncm91bmQoY29tYm9CYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgIGMuc2V0QmFja2dyb3VuZChjb21ib0Rpc2FibGVkQ29sb3IpOyAKLSAgICAgICB9Ci0gICAgICAgZmluYWwgQ29udHJvbCBjb24gPSBjOwotICAgICAgIFJ1bm5hYmxlIGRlbGF5ZWRVcGRhdGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgIHsKLSAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgIHsKLSAgICAgICBpZiAoY29uICE9IG51bGwpCi0gICAgICAgewotICAgICAgIGlmICghY29uLmlzRGlzcG9zZWQoKSkgIC8vIGl0IGdldHMgZGlzcG9zZWQKLSAgICAgICB7Ci0gICAgICAgY29uLnJlZHJhdygpOwotICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgfQotICAgICAgIH07Ci0gICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotICAgICAgIH0KLSAgICAgICB9KTsqLwotICAgIH0KLSAgICByZXR1cm4gY29tYm87Ci0gIH0KLQotICBwdWJsaWMgTGlzdCBjcmVhdGVMaXN0Qm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aCwgYm9vbGVhbiBpc011bHRpU2VsZWN0KQotICB7Ci0gICAgaW50IHN0eWxlID0gaXNNdWx0aVNlbGVjdCA/IFNXVC5NVUxUSSA6IFNXVC5TSU5HTEU7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBzdHlsZSAgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKGxpc3QpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLSAgICBsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIExpc3QgY3JlYXRlTGlzdEJveChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGgsIGJvb2xlYW4gaXNNdWx0aVNlbGVjdCwgYm9vbGVhbiB2ZXJ0aWNhbEZpbGwpCi0gIHsKLSAgICBpbnQgc3R5bGUgPSBpc011bHRpU2VsZWN0ID8gU1dULk1VTFRJIDogU1dULlNJTkdMRTsKLSAgICBMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIHN0eWxlICB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IobGlzdCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdmVydGljYWxGaWxsOwotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgbGlzdC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgbGlzdC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUxpc3RCb3goQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IExpc3QocGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IobGlzdCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLSAgICBsaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIFRleHQgY3JlYXRlVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBmbGF0U3R5bGUgfCBib3JkZXIpOwotICAgIHNldENvbG9yKHRleHQpOwotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICB0ZXh0LmFkZEtleUxpc3RlbmVyKGtleWJvYXJkSGFuZGxlcik7Ci0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICBwdWJsaWMgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgZmxhdFN0eWxlIHwgYm9yZGVyKTsKLSAgICBzZXRDb2xvcih0ZXh0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGlmIChmbGF0U3R5bGUgPT0gU1dULkZMQVQpCi0gICAgewotICAgICAgdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotICAgIH0KLSAgICB0ZXh0LmFkZEtleUxpc3RlbmVyKGtleWJvYXJkSGFuZGxlcik7Ci0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICBwdWJsaWMgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgc3R5bGUpCi0gIHsKLSAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIHN0eWxlIHwgU1dULlNJTkdMRSB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IodGV4dCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IHdpZHRoOwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHRleHQuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICAvKioKLSAgICogPGNvZGU+Y3JlYXRlV3JhcHBlZE11bHRpVGV4dEZpZWxkPC9jb2RlPiBjcmVhdGVzIGEgd3JhcHBlZCBtdWx0aXRleHQgZmllbGQKLSAgICoKLSAgICogQHBhcmFtIHBhcmVudCBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdmFsdWUKLSAgICogQHBhcmFtIHdpZHRoIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUKLSAgICogQHBhcmFtIG51bUxpbmVzIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUgcmVwcmVzZW50aW5nIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGhlaWdodAotICAgKiBAcGFyYW0gdmVydGljYWxGaWxsIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLSAgICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IHZhbHVlCi0gICAqLwotICBwdWJsaWMgVGV4dCBjcmVhdGVXcmFwcGVkTXVsdGlUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgbnVtTGluZXMsIGJvb2xlYW4gdmVydGljYWxGaWxsKQotICB7Ci0gICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IodGV4dCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBpZiAodmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgfQotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgRm9udERhdGFbXSBmb250RGF0YSA9IGdldEZvbnQoKS5nZXRGb250RGF0YSgpOwotICAgIC8vIGhhY2sgZm9yIG5vdyB3aGVyZSBvbiBXaW5kb3dzLCBvbmx5IDEgZm9udGRhdGEgZXhpc3RzCi0gICAgZGF0YS5oZWlnaHRIaW50ID0gbnVtTGluZXMgKiBmb250RGF0YVswXS5nZXRIZWlnaHQoKTsKLSAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgaWYgKGZsYXRTdHlsZSA9PSBTV1QuRkxBVCkKLSAgICB7Ci0gICAgICB0ZXh0LmFkZFBhaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0ZXh0OwotICB9Ci0KLSAgcHVibGljIFRleHQgY3JlYXRlTXVsdGlUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IodGV4dCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBpZiAodmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgfQotICAgIGRhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0gICAgZGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHRleHQuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICBwdWJsaWMgVGV4dCBjcmVhdGVNdWx0aVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIFRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULk1VTFRJIHwgIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IGZsYXRTdHlsZSB8IGJvcmRlcik7Ci0gICAgc2V0Q29sb3IodGV4dCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBpZiAodmVydGljYWxGaWxsKQotICAgIHsKLSAgICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0gICAgfQotICAgIHRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIHRleHQuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRleHQ7Ci0gIH0KLQotICBwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIFN0cmluZyB0ZXh0LCBib29sZWFuIHZlcnRpY2FsRmlsbCkKLSAgewotICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULlNIQURPV19FVENIRURfSU4gIHwgZmxhdFN0eWxlKTsKLSAgICBncm91cC5zZXRUZXh0KHRleHQpOwotICAgIHNldENvbG9yKGdyb3VwKTsKLQotICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0KLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGdyb3VwLmFkZFBhaW50TGlzdGVuZXIobmV3IEJvcmRlclBhaW50ZXIoKSk7Ci0gICAgfQotICAgIHJldHVybiBncm91cDsKLSAgfQotCi0gIHB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucywgU3RyaW5nIHRleHQsIGJvb2xlYW4gdmVydGljYWxGaWxsLCBpbnQgYWxpZ25tZW50KQotICB7Ci0gICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuU0hBRE9XX0VUQ0hFRF9JTiB8IGZsYXRTdHlsZSk7Ci0gICAgZ3JvdXAuc2V0VGV4dCh0ZXh0KTsKLSAgICBzZXRDb2xvcihncm91cCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7Ci0gICAgaWYgKHZlcnRpY2FsRmlsbCkKLSAgICB7Ci0gICAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIH0KLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBpZiAoZmxhdFN0eWxlID09IFNXVC5GTEFUKQotICAgIHsKLSAgICAgIGdyb3VwLmFkZFBhaW50TGlzdGVuZXIobmV3IEJvcmRlclBhaW50ZXIoKSk7Ci0gICAgfQotICAgIHJldHVybiBncm91cDsKLSAgfQotCi0gIHB1YmxpYyBMYWJlbCBjcmVhdGVWZXJ0aWNhbEZpbGxlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgdmVydGljYWxTcGFuKQotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCB8IGZsYXRTdHlsZSk7Ci0gICAgbGFiZWwuc2V0Rm9udChnZXRGb250KCkpOwotICAgIHNldENvbG9yKGxhYmVsKTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS52ZXJ0aWNhbFNwYW4gPSB2ZXJ0aWNhbFNwYW47Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHJldHVybiBsYWJlbDsKLSAgfQotCi0gIC8vCi0gIC8vIEZsYXRQYWdlSGVhZGVyCi0gIC8vCi0KLSAgLy8gVGhpcyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBiYWNrZ3JvdW5kIGltYWdlLgotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUZsYXRQYWdlSGVhZGVyCi0gIChDb21wb3NpdGUgcGFyZW50LAotICAgICAgU3RyaW5nIHRpdGxlKQotICB7Ci0gICAgSW1hZ2UgYmdJbWFnZSA9IGNyZWF0ZURlZmF1bHRJbWFnZSgpOwotICAgIHJldHVybiBjcmVhdGVGbGF0UGFnZUhlYWRlcihwYXJlbnQsYmdJbWFnZSx0aXRsZSk7Ci0gIH0KLQotICAvLyBQcm92aWRlIHlvdXIgb3duIGJhY2tncm91bmQgaW1hZ2UuCi0gIHB1YmxpYyBDb21wb3NpdGUgY3JlYXRlRmxhdFBhZ2VIZWFkZXIKLSAgKENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICBJbWFnZSBiZ0ltYWdlLAotICAgICAgU3RyaW5nIHRpdGxlKQotICB7Ci0gICAgRmxhdFBhZ2VIZWFkZXIgaGVhZGVyID0gbmV3IEZsYXRQYWdlSGVhZGVyKHBhcmVudCxTV1QuTk9ORSk7Ci0gICAgaGVhZGVyLnNldExheW91dChuZXcgUGFnZUxheW91dCgpKTsKLSAgICBoZWFkZXIuc2V0QmFja2dyb3VuZEltYWdlKGJnSW1hZ2UpOwotICAgIGhlYWRlci5zZXRUZXh0KHRpdGxlKTsKLSAgICBXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgV2lkZ2V0RmFjdG9yeSgpOwotICAgIENvbXBvc2l0ZSBmb3JtUGFyZW50ID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUoaGVhZGVyKTsKLSAgICAvL0NvbXBvc2l0ZSBmb3JtUGFyZW50ID0gY3JlYXRlQ29tcG9zaXRlKGhlYWRlciwxKTsKLSAgICBjcmVhdGVQYWdlQ29udGVudChmb3JtUGFyZW50KTsKLSAgICBoZWFkZXJDb250cm9sID0gaGVhZGVyOyAvLyB0aGlzIGlzIHVzZWQgaW4gZ2V0VGl0bGVIZWlnaHQoKQotICAgIHJldHVybiBmb3JtUGFyZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlRmxhdFBhZ2VIZWFkZXJUaXRsZShTdHJpbmcgdGl0bGUpCi0gIHsKLSAgICAoKEZsYXRQYWdlSGVhZGVyKWhlYWRlckNvbnRyb2wpLnNldFRleHQodGl0bGUpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhZ2VDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICB9Ci0KLSAgY2xhc3MgUGFnZUxheW91dCBleHRlbmRzIExheW91dCAKLSAgewotICAgIHByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBmbHVzaENhY2hlKSAKLSAgICB7Ci0gICAgICBpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0gICAgICAgIHJldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsKLSAgICAgIGludCB4ID0gMDsKLSAgICAgIENvbnRyb2wgY2xpZW50ID0gY29tcG9zaXRlLmdldENoaWxkcmVuKClbMF07Ci0gICAgICBQb2ludCBjc2l6ZSA9IGNsaWVudC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoQ2FjaGUpOwotICAgICAgaWYgKGhlYWRpbmdWaXNpYmxlKSBjc2l6ZS55ICs9IGdldFRpdGxlSGVpZ2h0KCk7Ci0gICAgICAKLSAgICAgIHJldHVybiBjc2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgCi0gICAgewotICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgQ29udHJvbCBjbGllbnQgPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXTsKLSAgICAgIGludCB0aGVpZ2h0ID0gaGVhZGluZ1Zpc2libGUgPyBnZXRUaXRsZUhlaWdodCgpIDogMDsKLSAgICAgIGNsaWVudC5zZXRCb3VuZHMoY2xpZW50QXJlYS54LCBjbGllbnRBcmVhLnkgKyB0aGVpZ2h0LCBjbGllbnRBcmVhLndpZHRoLCBjbGllbnRBcmVhLmhlaWdodCAtIHRoZWlnaHQpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IGdldFRpdGxlSGVpZ2h0KCkgCi0gIHsKLSAgICBpbnQgaW1hZ2VIZWlnaHQgPSAwOwotICAgIC8vIE5vdGUgLSBGaW5kIG91dCB3aHkgaGVhZGluZ0ltYWdlIGlzIGFsd2F5cyBudWxsLgotICAgIGlmIChoZWFkaW5nSW1hZ2UgIT0gbnVsbCAmJiBTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIm1vdGlmIikgPT0gZmFsc2UpIAotICAgICAgaW1hZ2VIZWlnaHQgPSBoZWFkaW5nSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCi0gICAgR0MgZ2MgPSBuZXcgR0MoaGVhZGVyQ29udHJvbCk7Ci0gICAgZ2Muc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRIZWFkZXJGb250KCkpOwotICAgIEZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLSAgICBpbnQgZm9udEhlaWdodCA9IGZtLmdldEhlaWdodCgpOwotICAgIGdjLmRpc3Bvc2UoKTsKLQotICAgIGludCBoZWlnaHQgPSBmb250SGVpZ2h0ICsgVElUTEVfVk1BUkdJTiArIFRJVExFX1ZNQVJHSU47Ci0gICAgcmV0dXJuIE1hdGgubWF4KGhlaWdodCxpbWFnZUhlaWdodCk7Ci0gIH0KLQotCi0gIHByaXZhdGUgSW1hZ2UgY3JlYXRlRGVmYXVsdEltYWdlKCkKLSAgewotICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUKLSAgICAoV1NETEVkaXRvclBsdWdpbi5jbGFzcywKLSAgICAgICAgImljb25zL3BhZ2VfYmFubmVyLmdpZiIpLmNyZWF0ZUltYWdlKCk7Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGJhY2tncm91bmRDb2xvci4KLSAgICogQHJldHVybiBDb2xvcgotICAgKi8KLSAgcHVibGljIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpCi0gIHsKLSAgICByZXR1cm4gYmFja2dyb3VuZENvbG9yOwotICB9Ci0gIAotICBwdWJsaWMgY2xhc3MgS2V5Ym9hcmRIYW5kbGVyIGV4dGVuZHMgS2V5QWRhcHRlcgotICB7Ci0gICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKQotICAgIHsKLSAgICAgIFdpZGdldCB3ID0gZS53aWRnZXQ7Ci0gICAgICBpZiAodyBpbnN0YW5jZW9mIENvbnRyb2wpCi0gICAgICB7Ci0gICAgICAgIHByb2Nlc3NLZXkoZS5rZXlDb2RlLCAoQ29udHJvbCkgdyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNjcm9sbFZlcnRpY2FsKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBib29sZWFuIHVwKQotICAgIHsKLSAgICAgIHNjcm9sbChzY29tcCwgMCwgdXAgPyAtVl9TQ1JPTExfSU5DUkVNRU5UIDogVl9TQ1JPTExfSU5DUkVNRU5UKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2Nyb2xsSG9yaXpvbnRhbChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgYm9vbGVhbiBsZWZ0KQotICAgIHsKLSAgICAgIHNjcm9sbChzY29tcCwgbGVmdCA/IC1IX1NDUk9MTF9JTkNSRU1FTlQgOiBIX1NDUk9MTF9JTkNSRU1FTlQsIDApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzY3JvbGxQYWdlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBib29sZWFuIHVwKQotICAgIHsKLSAgICAgIFBvaW50IG9yaWdpbiA9IHNjb21wLmdldE9yaWdpbigpOwotICAgICAgUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBzY29tcC5nZXRDbGllbnRBcmVhKCk7Ci0gICAgICBpbnQgaW5jcmVtZW50ID0gdXAgPyAtY2xpZW50QXJlYS5oZWlnaHQgOiBjbGllbnRBcmVhLmhlaWdodDsKLSAgICAgIHNjcm9sbChzY29tcCwgMCwgaW5jcmVtZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2Nyb2xsKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQpCi0gICAgewotICAgICAgUG9pbnQgb3JpZ2luID0gc2NvbXAuZ2V0T3JpZ2luKCk7Ci0gICAgICBQb2ludCBjb250ZW50U2l6ZSA9IHNjb21wLmdldENvbnRlbnQoKS5nZXRTaXplKCk7Ci0gICAgICBpbnQgeG9yaWdpbiA9IG9yaWdpbi54ICsgeG9mZnNldDsKLSAgICAgIGludCB5b3JpZ2luID0gb3JpZ2luLnkgKyB5b2Zmc2V0OwotICAgICAgeG9yaWdpbiA9IE1hdGgubWF4KHhvcmlnaW4sIDApOwotICAgICAgeG9yaWdpbiA9IE1hdGgubWluKHhvcmlnaW4sIGNvbnRlbnRTaXplLnggLSAxKTsKLSAgICAgIHlvcmlnaW4gPSBNYXRoLm1heCh5b3JpZ2luLCAwKTsKLSAgICAgIHlvcmlnaW4gPSBNYXRoLm1pbih5b3JpZ2luLCBjb250ZW50U2l6ZS55IC0gMSk7Ci0gICAgICBzY29tcC5zZXRPcmlnaW4oeG9yaWdpbiwgeW9yaWdpbik7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTY3JvbGxlZENvbXBvc2l0ZSBnZXRTY3JvbGxlZENvbXBvc2l0ZShDb250cm9sIGMpCi0gICAgewotICAgICAgQ29tcG9zaXRlIHBhcmVudCA9IGMuZ2V0UGFyZW50KCk7Ci0gICAgICAKLSAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIChTY3JvbGxlZENvbXBvc2l0ZSkgcGFyZW50OwotICAgICAgICB9Ci0gICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzS2V5KGludCBrZXlDb2RlLCBDb250cm9sIGMpCi0gICAgewotICAgICAgU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAgPSBnZXRTY3JvbGxlZENvbXBvc2l0ZShjKTsKLSAgICAgIGlmIChzY29tcCAhPSBudWxsKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKGtleUNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBTV1QuQVJST1dfRE9XTiA6Ci0gICAgICAgICAgc2Nyb2xsVmVydGljYWwoc2NvbXAsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTV1QuQVJST1dfVVAgOgotICAgICAgICAgIHNjcm9sbFZlcnRpY2FsKHNjb21wLCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTV1QuQVJST1dfTEVGVCA6Ci0gICAgICAgICAgc2Nyb2xsSG9yaXpvbnRhbChzY29tcCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1dULkFSUk9XX1JJR0hUIDoKLSAgICAgICAgICBzY3JvbGxIb3Jpem9udGFsKHNjb21wLCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1dULlBBR0VfVVAgOgotICAgICAgICAgIHNjcm9sbFBhZ2Uoc2NvbXAsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNXVC5QQUdFX0RPV04gOgotICAgICAgICAgIHNjcm9sbFBhZ2Uoc2NvbXAsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CYXNlVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyZjAyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0Jhc2VWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLnVpLkJhc2VEZXNpZ25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC51aS5Cb3JkZXJQYWludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwudWkuRmxhdFZpZXdVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVmlld2VyIGV4dGVuZHMgQmFzZURlc2lnbldpbmRvdyBpbXBsZW1lbnRzIExpc3RlbmVyLCBTZWxlY3Rpb25MaXN0ZW5lcgotewotLy8gIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7IAotCi0gIC8vIGZvciB1c2UgaW4gc3ViY2xhc3NlcwotICBwcm90ZWN0ZWQgRmxhdFZpZXdVdGlsaXR5IGZsYXRWaWV3VXRpbGl0eSA9IG5ldyBGbGF0Vmlld1V0aWxpdHkodHJ1ZSk7Ci0KLSAgcHVibGljIEJhc2VWaWV3ZXIoSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmUpCi0gIHsKLSAgICBzdXBlcihzdGF0dXNMaW5lKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGlucHV0OwotICB9Ci0KLSAgLy8gZ2V0cyBjYWxsZWQgb25seSBpZiB3ZSBjdXJyZW50bHkgYXJlIG5vdCBoYW5kbGluZyBhbiBldmVudAotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBkb1NldElucHV0KE9iamVjdCBpbnB1dCk7Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciNzZXRJbnB1dChPYmplY3QpCi0gICAqLwotICBzdGF0aWMgT2JqZWN0IG9sZElucHV0ID0gbnVsbDsKLSAgTW9kZWxBZGFwdGVyTGlzdGVuZXIgb2xkTW9kZWxBZGFwdGVyTGlzdGVuZXIgPSBudWxsOwotCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkKLSAgewotICAgIHN1cGVyLnNldElucHV0KGlucHV0KTsKLQotICAgIGRvU2V0SW5wdXQoaW5wdXQpOwotLyoKLSAgICBpZiAoIWlzSW5Eb0hhbmRsZSgpICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotICAgIHsKLSAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBpbnB1dDsKLSAgICAgIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICBkb1NldElucHV0KG9iaik7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0KLSovCi0gIH0KLQotCi0gIGJvb2xlYW4gbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLSAgLyoqCi0gICAqIEdldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotICAgKiBAcmV0dXJuIHZhbHVlIG9mIGxpc3RlbmVyRW5hYmxlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJFbmFibGVkKCkgCi0gIHsKLSAgICByZXR1cm4gbGlzdGVuZXJFbmFibGVkOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSB2YWx1ZSBvZiBsaXN0ZW5lckVuYWJsZWQuCi0gICAqIEBwYXJhbSB2ICBWYWx1ZSB0byBhc3NpZ24gdG8gbGlzdGVuZXJFbmFibGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGlzdGVuZXJFbmFibGVkKGJvb2xlYW4gIHYpIAotICB7Ci0gICAgdGhpcy5saXN0ZW5lckVuYWJsZWQgPSB2OwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkKLSAgewotICAgIGlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmCi0gICAgICAgIGdldElucHV0KCkgIT0gbnVsbCAmJgotICAgICAgICAhaXNJbkRvSGFuZGxlKSAKLSAgICB7Ci0gICAgICBpc0luRG9IYW5kbGUgPSB0cnVlOwotICAgICAgc3RhcnREZWxheWVkRXZlbnQoZXZlbnQpOwotICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgfSAvLyBlbmQgb2YgaWYgKCkKLSAgfQotCi0gIGFic3RyYWN0IHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpOwotICBhYnN0cmFjdCBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0gIHByb3RlY3RlZCBEZWxheWVkRXZlbnQgZGVsYXllZFRhc2s7Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzdGFydERlbGF5ZWRFdmVudChFdmVudCBlKQotICB7Ci0gICAgaWYgKGRlbGF5ZWRUYXNrID09IG51bGwgfHwKLSAgICAgIGRlbGF5ZWRUYXNrLmdldEV2ZW50KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCxkZWxheWVkVGFzayk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBFdmVudCBkZWxheWVkRXZlbnQgPSBkZWxheWVkVGFzay5nZXRFdmVudCgpOwotICAgICAgCi0gICAgICBpZiAoZS53aWRnZXQgPT0gZGVsYXllZEV2ZW50LndpZGdldCAmJgotICAgICAgICBlLnR5cGUgPT0gZGVsYXllZEV2ZW50LnR5cGUpCi0gICAgICB7Ci0gICAgICAgIC8vIHNhbWUgZXZlbnQsIGp1c3QgZGlmZmVyZW50IGRhdGEsIGRlbGF5IG5ldyBldmVudAotICAgICAgICBkZWxheWVkVGFzay5zZXRFdmVudChudWxsKTsKLSAgICAgIH0KLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLGRlbGF5ZWRUYXNrKTsKLSAgICB9Ci0gIH0KLSAgCi0gIGNsYXNzIERlbGF5ZWRFdmVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlCi0gIHsKLSAgICBwcm90ZWN0ZWQgRXZlbnQgZXZlbnQ7Ci0gICAgCi0gICAgLyoKLSAgICAgKiBAc2VlIFJ1bm5hYmxlI3J1bigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBpZiAoZXZlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgICAgZG9IYW5kbGVFdmVudChldmVudCk7Ci0gICAgICAgIGlzSW5Eb0hhbmRsZSA9IGZhbHNlOwotICAgICAgICBldmVudCA9IG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGV2ZW50LgotICAgICAqIEByZXR1cm4gUmV0dXJucyBhIEV2ZW50Ci0gICAgICovCi0gICAgcHVibGljIEV2ZW50IGdldEV2ZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZXZlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZXZlbnQuCi0gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFdmVudChFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0gICAgfQotCi0gIH0KLQotCi0gIGJvb2xlYW4gaXNJbkRvSGFuZGxlOwotICAvKioKLSAgICogR2V0IHRoZSB2YWx1ZSBvZiBpc0luRG9IYW5kbGUuCi0gICAqIEByZXR1cm4gdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJbkRvSGFuZGxlKCkgCi0gIHsKLSAgICByZXR1cm4gaXNJbkRvSGFuZGxlOwotICB9Ci0KLSAgLyoKLSAgICogQHNlZSBWaWV3ZXIjZ2V0Q29udHJvbCgpCi0gICAqLwotICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkKLSAgewotICAgIHJldHVybiBtYWluVUlDb21wb25lbnQ7Ci0gIH0KLQotCi0gIC8qCi0gICAqIEBzZWUgQmFzZURlc2lnbldpbmRvdyNjcmVhdGVEZXNpZ25QYW5lKENvbXBvc2l0ZSwgaW50KQotICAgKi8KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGVzaWduUGFuZShDb21wb3NpdGUgYXJnMCwgaW50IGFyZzEpCi0gIHsKLSAgICBDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVEZXNpZ25QYW5lKGFyZzAsIGFyZzEpOwotICAgIAotICAgIENvbXBvc2l0ZSBjbGllbnQgPSBzdXBlci5nZXRDb250cm9sc0NvbnRhaW5lcigpOwotICAgIAotICAgIGNsaWVudC5hZGRQYWludExpc3RlbmVyKG5ldyBCb3JkZXJQYWludGVyKCkpOwotICAgIAotICAgIGNsaWVudC5zZXRCYWNrZ3JvdW5kKG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwyNTUsMjU1LDI1NSkpOwotCi0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotCi0gIHB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVmcmVzaCgpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiByZXZlYWwpIAotICB7Ci0gIH0KLSAgIAotICAKLS8vICBwdWJsaWMgYWJzdHJhY3QgQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKCkKLSAgewotICAgIHJldHVybiAoTm9kZSkgZ2V0SW5wdXQoKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLSAgCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAge30KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICBnZXRJbnB1dCgpICE9IG51bGwgJiYKLSAgICAgICAgIWlzSW5Eb0hhbmRsZSkgCi0gICAgewotICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOwotICAgICAgaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSAmJgotICAgICAgICBnZXRJbnB1dCgpICE9IG51bGwgJiYKLSAgICAgICAgIWlzSW5Eb0hhbmRsZSkgCi0gICAgewotICAgICAgaXNJbkRvSGFuZGxlID0gdHJ1ZTsKLSAgICAgIGRvV2lkZ2V0U2VsZWN0ZWQoZSk7Ci0gICAgICBpc0luRG9IYW5kbGUgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwdWJsaWMgTm9kZSBnZXRDaGlsZE5vZGUoRWxlbWVudCBwYXJlbnQsIFN0cmluZyBjaGlsZE5hbWUpCi0gIHsKLSAgICBOb2RlTGlzdCBsaXN0ID0gbnVsbDsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgfQotICAgCi0gICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgLy8gUGVyZm9ybWFuY2UgaXNzdWUgcGVyaGFwcz8KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBpZiAobGlzdC5pdGVtKGkpIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChsaXN0Lml0ZW0oaSkuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGxpc3QuaXRlbShpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBFbGVtZW50IHBlcmZvcm1BZGRFbGVtZW50KE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQocGFyZW50Tm9kZSwgbmFtZXNwYWNlTmFtZSwgbG9jYWxOYW1lKTsKLSAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7ICAgICAgIAotICAgICAgZm9ybWF0KHBhcmVudE5vZGUpOwotICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gICAgfSAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KE5vZGUgcGFyZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudE5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9jYWxOYW1lKTsKLSAgICByZXR1cm4gZWxlbWVudDsgICAKLSAgfSAgIAotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50LCBTdHJpbmcgYXR0ciwgU3RyaW5nIHZhbHVlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIsIHZhbHVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGZvcm1hdChOb2RlIHBhcmVudE5vZGUpCi0gIHsKLSAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSAKLSAgICB7Ci0gICAgICAvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3JYTUwgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0gICAgICBmb3JtYXRQcm9jZXNzb3JYTUwuZm9ybWF0Tm9kZSgoSURPTU5vZGUpcGFyZW50Tm9kZSk7Ci0gICAgfQotICB9Ci0gIAotICBzdGF0aWMgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpCi0gIHsKLSAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKTsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQotICAgIHJldHVybiBlZGl0b3JQYXJ0OwotICB9Ci0gIAotICBzdGF0aWMgcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7IAotICAgIElTdGF0dXNMaW5lTWFuYWdlciByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpZWRpdG9yUGFydC5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLSAgICAgIHJlc3VsdCA9IGNvbnRyaWJ1dG9yLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nSW5wdXRPdXRwdXRGYXVsdFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nSW5wdXRPdXRwdXRGYXVsdFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzdkMzk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ0lucHV0T3V0cHV0RmF1bHRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEJpbmRpbmdJbnB1dE91dHB1dEZhdWx0Vmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEJpbmRpbmdJbnB1dE91dHB1dEZhdWx0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgeyAKLSAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkdfSU5QVVQiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkdfT1VUUFVUIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0JJTkRJTkdfRkFVTFQiKTsKLSAgICB9ICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvQmluZGluZ09wZXJhdGlvblZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nT3BlcmF0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDMzN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nT3BlcmF0aW9uVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEJpbmRpbmdPcGVyYXRpb25WaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvblZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgICAgCi0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElOR19PUEVSQVRJT04iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9CaW5kaW5nVmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0JpbmRpbmdWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExZmFmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0JpbmRpbmdWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkNvbXBvbmVudE5hbWVDb21ib0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuSW52b2tlRGlhbG9nQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1ZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyIAoteyAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87ICAgICAgCi0gIHByb3RlY3RlZCBDb21wb25lbnROYW1lQ29tYm9IZWxwZXIgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotICBJbnZva2VEaWFsb2dCdXR0b24gYnV0dG9uOwotCi0gIHB1YmxpYyBCaW5kaW5nVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAgICAKLSAgfSAKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkKLSAgewotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9CSU5ESU5HIik7ICAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIHBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIucG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24ocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAKLSAgICBMYWJlbCBwb3J0VHlwZUxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUE9SVFRZUEUiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIGNvbXBvbmVudE5hbWVDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY29tcG9zaXRlKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBjb21wb25lbnROYW1lQ29tYm9IZWxwZXIgPSBuZXcgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKGNvbXBvbmVudE5hbWVDb21ibykKLSAgICB7Ci0gICAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb21wb25lbnROYW1lTGlzdChDb21wb25lbnRSZWZlcmVuY2VVdGlsIHV0aWwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB1dGlsLmdldFBvcnRUeXBlTmFtZXMoKTsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEU7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGJ1dHRvbiA9IG5ldyBJbnZva2VEaWFsb2dCdXR0b24oY29tcG9zaXRlLCBnZXRJbnB1dCgpKTsKLSAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfSAgCi0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHN1cGVyLnVwZGF0ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLnVwZGF0ZShpbnB1dCk7Ci0gICAgYnV0dG9uLnNldElucHV0KGlucHV0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUV2ZW50SGVscGVyKEVsZW1lbnQgZWxlbWVudCwgRXZlbnQgZXZlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlci5oYW5kbGVFdmVudEhlbHBlcihlbGVtZW50LCBldmVudCk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLmhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRGVmaW5pdGlvblZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZpbml0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2VjZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9EZWZpbml0aW9uVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5FZGl0TmFtZXNwYWNlc0FjdGlvbjsKLQotcHVibGljIGNsYXNzIERlZmluaXRpb25WaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIERlZmluaXRpb25WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7IAotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9ERUZJTklUSU9OIik7IC8vJE5PTi1OTFMtMSQKLSAgfSAgCi0gICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLnBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKHBhcmVudCk7Ci0JICBMYWJlbCBsYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX05BTUVTUEFDRVMiKSk7IC8vJE5PTi1OTFMtMSQKLSAgCUJ1dHRvbiBidXR0b24gPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlUHVzaEJ1dHRvbihjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VESVRfTkFNRVNQQUNFUyIpKTsKLQkgIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkKLSAgICB7Ci0gICAgCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAJeyAgICAJCQotICAgIAl9Ci0gICAgCQotICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkKLSAgICAJewotCQkgIEVkaXROYW1lc3BhY2VzQWN0aW9uIGFjdGlvbiA9IG5ldyBFZGl0TmFtZXNwYWNlc0FjdGlvbigoRGVmaW5pdGlvbilnZXRJbnB1dCgpKTsJCQkJCQotCQkgIGFjdGlvbi5ydW4oKTsJCi0gICAgCX0JCi0gICAgfTsKLSAgICBidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAJcmV0dXJuIGNvbXBvc2l0ZTsJCi0gIH0JICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRW1wdHlWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRW1wdHlWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlMjU0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0VtcHR5Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotCi1wdWJsaWMgY2xhc3MgRW1wdHlWaWV3ZXIgZXh0ZW5kcyBCYXNlVmlld2VyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotCi0gIHB1YmxpYyBFbXB0eVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpCi0gIHsKLSAgICBzdXBlcihnZXRTdGF0dXNMaW5lTWFuYWdlcihnZXRBY3RpdmVFZGl0b3IoKSkpOwotICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIGNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBjb250cm9sLnNldExheW91dChsYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgCi0gIH0KLQotICAvKgotICAgKiBAc2VlIEJhc2VXaW5kb3cjZG9IYW5kbGVFdmVudChFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsKLSAgICB9Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzYTE3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5Nb2RlbEFkYXB0ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMTW9kZWxBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuQXR0cmlidXRlc1RhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmlsaXR5RWxlbWVudFZpZXdlciBleHRlbmRzIEJhc2VWaWV3ZXIgaW1wbGVtZW50cyBNb2RlbEFkYXB0ZXJMaXN0ZW5lcgoteyAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOyAgIAotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsgICAKLSAgcHJvdGVjdGVkIEF0dHJpYnV0ZXNUYWJsZSBhdHRyaWJ1dGVzVGFibGU7Ci0gIGJvb2xlYW4gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzID0gZmFsc2U7Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKGdldFN0YXR1c0xpbmVNYW5hZ2VyKGVkaXRvclBhcnQpKTsgICAgCi0gICAgdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsgICAgICAgICAgICAgICAgICAKLQotICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsgICAKLSAgfQotICAKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIGJvb2xlYW4gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzKQotICB7Ci0gICAgc3VwZXIoZ2V0U3RhdHVzTGluZU1hbmFnZXIoZWRpdG9yUGFydCkpOyAgICAKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OyAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuaXNGb3JUYWJiZWRQcm9wZXJ0aWVzID0gaXNGb3JUYWJiZWRQcm9wZXJ0aWVzOwotICAgIGlmIChpc0ZvclRhYmJlZFByb3BlcnRpZXMpCi0gICAgewotICAgICAgY3JlYXRlQ29udHJvbEZvclRhYmJlZFByb3BlcnR5U2hlZXQocGFyZW50KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICB9Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsgCi0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoKFdTRExFbGVtZW50KWlucHV0KS5nZXRFbGVtZW50KCk7Ci0gICAgICByZXN1bHQgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1VOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UIik7IC8vJE5PTi1OTFMtMSQgCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAKLSAgCi0gIC8vIFRPRE8uLi4gbW92ZSB0aGlzIG1ldGhvZCBkb3duIHRvIEJhc2VWaWV3ZXIhCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xGb3JUYWJiZWRQcm9wZXJ0eVNoZWV0KENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgCi0gICAgYXR0cmlidXRlc1RhYmxlID0gbmV3IEF0dHJpYnV0ZXNUYWJsZShlZGl0b3JQYXJ0LCBwYXJlbnQpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgCi0gICAgY29udHJvbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCAxLCB0cnVlKTsgICAKLQkgIGNvbnRyb2wuc2V0QmFja2dyb3VuZCAobmV3IENvbG9yKG51bGwsMjU1LDAsMCkpOwotCSAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotCSAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JICBnZC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLQkgIGdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCSAgCi0gICAgY29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCljb250cm9sLmdldExheW91dCgpOwotICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVGbGF0UGFnZUhlYWRlcihjb250cm9sLCAiIik7Ci0KLSAgICBDb21wb3NpdGUgYyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoY29udHJvbCwgMSwgdHJ1ZSk7Ci0gICAgR3JpZERhdGEgY0dEPSBuZXcgR3JpZERhdGEoKTsKLSAgICBjR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBjR0QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBjR0QudmVydGljYWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgY0dELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotICAgIAotICAgIGMuc2V0TGF5b3V0RGF0YShjR0QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGF0dHJpYnV0ZXNUYWJsZSA9IG5ldyBBdHRyaWJ1dGVzVGFibGUoZWRpdG9yUGFydCwgYyk7Ci0KLSAgICBHcmlkRGF0YSBhdHRyaWJ1dGVzVGFibGVHRD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgYXR0cmlidXRlc1RhYmxlR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBhdHRyaWJ1dGVzVGFibGVHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGF0dHJpYnV0ZXNUYWJsZUdELnZlcnRpY2FsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGF0dHJpYnV0ZXNUYWJsZUdELmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlPSB0cnVlOwotCi0gICAgYXR0cmlidXRlc1RhYmxlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGF0dHJpYnV0ZXNUYWJsZUdEKTsKLSAgfSAgCi0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfSAKLSAgIAotCi0gIHB1YmxpYyB2b2lkIGRvU2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgaWYgKCFpc0ZvclRhYmJlZFByb3BlcnRpZXMpCi0gICAgewotICAgICAgZmxhdFZpZXdVdGlsaXR5LnVwZGF0ZUZsYXRQYWdlSGVhZGVyVGl0bGUoZ2V0SGVhZGluZ1RleHQoKSk7Ci0gICAgfQotICAgIHNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIAotICAgIGF0dHJpYnV0ZXNUYWJsZS5zZXRJbnB1dCgoKFdTRExFbGVtZW50KWlucHV0KS5nZXRFbGVtZW50KCkpOwotIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQotICAgIGlmIChvbGRJbnB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIFdTRExNb2RlbEFkYXB0ZXJGYWN0b3J5LnJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKG9sZElucHV0LCB0aGlzKTsKLSAgICB9Ci0gICAgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuYWRkTW9kZWxBZGFwdGVyTGlzdGVuZXIoaW5wdXQsIHRoaXMpOwotCi0gICAgb2xkSW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgdXBkYXRlKCk7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgeyAKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICB7ICAgICAgICAgICAKLSAgICAgICAgaWYgKCFhdHRyaWJ1dGVzVGFibGUuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGF0dHJpYnV0ZXNUYWJsZS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OyAgICAgICAgICAgICAgIAotICAgIERpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0V4dGVuc2libGVEZXRhaWxzVmlld2VyUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzYwNTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSURldGFpbHNWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uV1NETEVkaXRvckV4dGVuc2lvblJlZ2lzdHJ5OwotCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJsZURldGFpbHNWaWV3ZXJQcm92aWRlciBpbXBsZW1lbnRzIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3JFeHRlbnNpb25bXSBleHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSURldGFpbHNWaWV3ZXJQcm92aWRlcltdIGRldGFpbHNWaWV3ZXJQcm92aWRlcnM7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IHt9OwotCi0gIHB1YmxpYyBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyKFdTRExFZGl0b3Igd3NkbEVkaXRvcikKLSAgeyAgCQotICAgIFdTRExFZGl0b3JFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0RMRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKTsgCi0KLSAgICBleHRlbnNpb25zID0gcmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoV1NETEVkaXRvckV4dGVuc2lvbi5ERVRBSUxTX1ZJRVdFUl9QUk9WSURFUik7IAotICAgIGRldGFpbHNWaWV3ZXJQcm92aWRlcnMgPSBuZXcgSURldGFpbHNWaWV3ZXJQcm92aWRlcltleHRlbnNpb25zLmxlbmd0aF07IAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBkZXRhaWxzVmlld2VyUHJvdmlkZXJzW2ldID0gKElEZXRhaWxzVmlld2VyUHJvdmlkZXIpZXh0ZW5zaW9uc1tpXS5jcmVhdGVFeHRlbnNpb25PYmplY3QoV1NETEVkaXRvckV4dGVuc2lvbi5ERVRBSUxTX1ZJRVdFUl9QUk9WSURFUiwgd3NkbEVkaXRvcik7Ci0gICAgfQotICB9ICAgICAgICAgIAotICAgICAgCi0KLSAgcHJvdGVjdGVkIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgZ2V0QXBwbGljYWJsZURldGFpbHNQcm92aWRlcihPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBJRGV0YWlsc1ZpZXdlclByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4dGVuc2lvbnNbaV0uaXNBcHBsaWNhYmxlKG9iamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHByb3ZpZGVyID0gZGV0YWlsc1ZpZXdlclByb3ZpZGVyc1tpXTsKLSAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvdmlkZXI7Ci0gIH0KLSAgIAotICAKLSAgcHVibGljIE9iamVjdCBnZXRWaWV3ZXJLZXkoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlRGV0YWlsc1Byb3ZpZGVyKG9iamVjdCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5nZXRWaWV3ZXJLZXkob2JqZWN0KSA6IG51bGw7Ci0gIH0KLSAgCi0KLSAgcHVibGljIFZpZXdlciBjcmVhdGVWaWV3ZXIoT2JqZWN0IG9iamVjdCwgQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIElEZXRhaWxzVmlld2VyUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBcHBsaWNhYmxlRGV0YWlsc1Byb3ZpZGVyKG9iamVjdCk7Ci0gICAgcmV0dXJuIHByb3ZpZGVyICE9IG51bGwgPyBwcm92aWRlci5jcmVhdGVWaWV3ZXIob2JqZWN0LCBwYXJlbnQsIGVkaXRvclBhcnQpIDogbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1wb3J0Vmlld2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0ltcG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTViYjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW1wb3J0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5YTUxRdWlja1NjYW47Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBJbXBvcnRWaWV3ZXIgZXh0ZW5kcyBCYXNlVmlld2VyIGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgZWRpdG9yUGFydDsKLSAgCi0gIHByb3RlY3RlZCBUZXh0IG5hbWVzcGFjZVRleHQ7Ci0gIHByb3RlY3RlZCBUZXh0IHByZWZpeFRleHQ7Ci0gIHByb3RlY3RlZCBUZXh0IGxvY2F0aW9uVGV4dDsKLSAgQnV0dG9uIHNlbGVjdEJ1dHRvbjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEltcG9ydFZpZXdlci4KLSAgICogQHBhcmFtIHBhcmVudAotICAgKiBAcGFyYW0gZWRpdG9yUGFydAotICAgKi8KLSAgcHVibGljIEltcG9ydFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIoZ2V0U3RhdHVzTGluZU1hbmFnZXIoZWRpdG9yUGFydCkpOwotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0gICAgY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMuTmFtZWRDb21wb25lbnRWaWV3ZXIjZ2V0SGVhZGluZ1RleHQoKQotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfSU1QT1JUIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAKLSAgICBjb250cm9sID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEsIHRydWUpOyAgICAgICAgICAgICAgICAgCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCljb250cm9sLmdldExheW91dCgpOwotICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlRmxhdFBhZ2VIZWFkZXIoY29udHJvbCwgZ2V0SGVhZGluZ1RleHQoKSk7Ci0KLSAgICBDb21wb3NpdGUgYyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoY29udHJvbCwgMSwgdHJ1ZSk7Ci0KLSAgICBMYWJlbCBib2d1cyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjLCAwLCAiIik7Ci0gICAgR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICAKLSAgICBib2d1cy5zZXRMYXlvdXREYXRhKGdkKTsKLQotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKGMsIDIsIHRydWUpOyAKLSAgICBHcmlkTGF5b3V0IGxheW91dDIgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dDIubWFrZUNvbHVtbnNFcXVhbFdpZHRoICA9IGZhbHNlOwotICAgIGxheW91dDIubnVtQ29sdW1ucyA9IDM7Ci0gICAgbGF5b3V0Mi5tYXJnaW5IZWlnaHQgPSAzOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0Mik7Ci0KLSAgICBMYWJlbCBuYW1lc3BhY2VMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDAsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZVRleHQgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlVGV4dEZpZWxkKGNvbXBvc2l0ZSk7Ci0gICAgbmFtZXNwYWNlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgIC8vIHBsYWNlIGhvbGRlcgotICAgIENvbnRyb2wgY29uPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCAiIik7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgY29uLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgTGFiZWwgcHJlZml4TGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QUkVGSVgiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBwcmVmaXhUZXh0ID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZVRleHRGaWVsZChjb21wb3NpdGUpOwotICAgIHByZWZpeFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSx0aGlzKTsKLSAgICBwcmVmaXhUZXh0LnNldEVuYWJsZWQoZmFsc2UpOyAgICAKLQotICAgIC8vIHBsYWNlIGhvbGRlcgotICAgIENvbnRyb2wgY29uMj0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgIiIpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGNvbjIuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICBMYWJlbCBsb2NhdGlvbkxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTE9DQVRJT04iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBsb2NhdGlvblRleHQgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlVGV4dEZpZWxkKGNvbXBvc2l0ZSk7Ci0gICAgbG9jYXRpb25UZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgc2VsZWN0QnV0dG9uID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZVB1c2hCdXR0b24oY29tcG9zaXRlLCAiLi4uIik7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLSAgICBzZWxlY3RCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgc2VsZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBkb1NldElucHV0KE9iamVjdCBpbnB1dCkKLSAgeyAgICAKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdHJ5Ci0gICAgeyAgICAgICAgICAKLSAgICAgIE5vZGUgbm9kZSA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0Tm9kZUZvck9iamVjdChpbnB1dCk7Ci0gICAgICB1cGRhdGUoKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBpZiAob2xkSW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpLnJlbW92ZU1vZGVsQWRhcHRlckxpc3RlbmVyKG9sZElucHV0LCB0aGlzKTsKLSAgICB9Ci0KLSAgICBXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeS5nZXRXU0RMTW9kZWxBZGFwdGVyRmFjdG9yeSgpLmFkZE1vZGVsQWRhcHRlckxpc3RlbmVyKGlucHV0LCB0aGlzKTsKLSAgICBvbGRJbnB1dCA9IGlucHV0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXZlbnRIZWxwZXIoRWxlbWVudCBlbGVtZW50LCBFdmVudCBldmVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChldmVudC50eXBlID09IFNXVC5Nb2RpZnkpCi0gICAgeyAgCi0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9ICgoV1NETEVsZW1lbnQpaW5wdXQpLmdldEVsZW1lbnQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmbGF0Vmlld1V0aWxpdHkudXBkYXRlRmxhdFBhZ2VIZWFkZXJUaXRsZShnZXRIZWFkaW5nVGV4dCgpKTsKLSAgICBwcmVmaXhUZXh0LnNldFRleHQoIiIpOwotICAgIGxvY2F0aW9uVGV4dC5zZXRUZXh0KCIiKTsKLSAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwotICAgIG5hbWVzcGFjZVRleHQuZ2V0UGFyZW50KCkubGF5b3V0KCk7ICAgIAotICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgU3RyaW5nIGxvY2F0aW9uVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibG9jYXRpb24iKTsKLSAgICBsb2NhdGlvblRleHQuc2V0VGV4dChsb2NhdGlvblZhbHVlICE9IG51bGwgPyBsb2NhdGlvblZhbHVlIDogIiIpOyAgCi0KLSAgICBTdHJpbmcgbmFtZXNwYWNlVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7Ci0gICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KG5hbWVzcGFjZVZhbHVlICE9IG51bGwgPyBuYW1lc3BhY2VWYWx1ZSA6ICIiKTsKLSAgICAKLSAgICBTdHJpbmcgcHJlZml4ID0gKChJbXBvcnQpaW5wdXQpLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRQcmVmaXgobmFtZXNwYWNlVmFsdWUpOwotICAgIHByZWZpeFRleHQuc2V0VGV4dChwcmVmaXggIT0gbnVsbCA/IHByZWZpeCA6ICIiKTsKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIEJhc2VXaW5kb3cjZG9IYW5kbGVFdmVudChFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLS8vICAgIGlmIChldmVudC53aWRnZXQgPT0gcHJlZml4VGV4dCkKLS8vICAgIHsKLS8vICAgICAgU3RyaW5nIG5ld1ByZWZpeCA9IHByZWZpeFRleHQuZ2V0VGV4dCgpOwotLy8gICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gVmFsaWRhdGVIZWxwZXIuY2hlY2tYTUxQcmVmaXgobmV3UHJlZml4KTsKLS8vICAgIAotLy8gICAgICBpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0vLyAgICAgIHsKLS8vICAgICAgICBJbXBvcnQgaW1wb3J0T2JqID0gKEltcG9ydClpbnB1dDsKLS8vICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50IGltcG9ydEVsZW1lbnQgPSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW1wb3J0T2JqKTsKLS8vICAgICAgICAKLS8vICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBpbXBvcnRPYmouZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotLy8gICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0vLyAgCi0vLyAgICAgICAgU3RyaW5nIG5zRnJvbU1vZGVsID0gaW1wb3J0T2JqLmdldE5hbWVzcGFjZVVSSSgpOwotLy8gICAgICAgIFN0cmluZyBuc0Zyb21ET00gPSBpbXBvcnRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7Ci0vLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5zRnJvbU1vZGVsKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obnNGcm9tRE9NKTsKLS8vICAKLS8vICAgICAgICBTdHJpbmcgb2xkUHJlZml4ID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgobnNGcm9tTW9kZWwpOwotLy8gICAgICAgIGRlZmluaXRpb25FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgieG1sbnM6IiArIG9sZFByZWZpeCk7Ci0vLyAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgbmV3UHJlZml4LCBuc0Zyb21Nb2RlbCk7Ci0vLyAgICAgIH0KLS8vICAgIH0KLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkpCi0gICAgewotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLSAgICAgIHVwZGF0ZSgpOwotICAgICAgc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gc2VsZWN0QnV0dG9uKQotICAgIHsKLSAgICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbnVsbDsKLS8vIFRPRE86IHBvcnQgY2hlY2sKLSAgICAgIHJlc291cmNlU2V0ID0gKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdClpbnB1dCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotICAgICAgV1NETEVkaXRvciBlZGl0b3IgPSAoV1NETEVkaXRvcillZGl0b3JQYXJ0OwotICAgICAgSUZpbGUgY3VycmVudFdTRExGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICAKLSAgICAgIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVEaWFsb2coV1NETEVkaXRvclBsdWdpbi5nZXRTaGVsbCgpLCBudWxsLCB0cnVlKTsKLSAgICAgIFN0cmluZyBbXSBmaWx0ZXJzID0geyAieHNkIiwgIndzZGwiIH07Ci0gICAgICBJRmlsZSBbXSBleGNsdWRlZEZpbGVzID0geyBjdXJyZW50V1NETEZpbGUgfTsKLSAgICAgIAotICAgICAgZGlhbG9nLmFkZEZpbHRlckV4dGVuc2lvbnMoZmlsdGVycywgZXhjbHVkZWRGaWxlcyk7Ci0gICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NFTEVDVCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgZGlhbG9nLnNldFRpdGxlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NFTEVDVF9GSUxFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBkaWFsb2cuc2V0TWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9ERVNDUklQVElPTl9TRUxFQ1RfV1NETF9PUl9YU0QiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGludCByYyA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICBpZiAocmMgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLSAgICAgIHsKLSAgICAgICAgSUZpbGUgc2VsZWN0ZWRGaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy9pZiAoc2VsZWN0ZWRGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLmVxdWFscyhjdXJyZW50V1NETEZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbigiU0FNRSBGSUxFOiIgKyBjdXJyZW50V1NETEZpbGUuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIC8vfQotCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuY29tcHV0ZVJlbGF0aXZlVVJJKHNlbGVjdGVkRmlsZSwgY3VycmVudFdTRExGaWxlLCB0cnVlKTsKLQotICAgICAgICBJbXBvcnQgaW1wb3J0T2JqID0gKEltcG9ydClpbnB1dDsKLSAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudCBpbXBvcnRFbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGltcG9ydE9iaik7Ci0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGltcG9ydE9iai5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoZGVmaW5pdGlvbik7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBwcmVmaXhUZXh0LmdldFRleHQoKTsKLSAgICAgICAgU3RyaW5nIHVuaXF1ZVByZWZpeCA9ICIiOwotICAgICAgCi0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShzZWxlY3RlZEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsgICAgICAKLQotCQkvLyBub3RlIHRoYXQgdGhlIGdldFRhcmdldE5hbWVzcGFjZVVSSUZvclNjaGVtYSB3b3JrcyBmb3IgYm90aCBzY2hlbWEgYW5kIHdzZGwgZmlsZXMKLQkJLy8gSSBzaG91bGQgY2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgY29udmVuaWVuY2UgbWV0aG9kCi0gICAgICAgIGltcG9ydFRhcmdldE5hbWVzcGFjZSA9ICBYTUxRdWlja1NjYW4uZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKHVyaS50b1N0cmluZygpKTsKLQotICAgICAgICBpZiAocHJlZml4LnRyaW0oKS5lcXVhbHMoIiIpKQotICAgICAgICB7Ci0gICAgICAgICAgdW5pcXVlUHJlZml4ID0gZ2V0VW5pcXVlUHJlZml4KGRlZmluaXRpb24sIHVyaS5maWxlRXh0ZW5zaW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHVuaXF1ZVByZWZpeCA9IHByZWZpeDsgCi0gICAgICAgIH0KLSAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGlmIChpbXBvcnRUYXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fAotICAgICAgICAgICAoaW1wb3J0VGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgJiYgaW1wb3J0VGFyZ2V0TmFtZXNwYWNlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybjsgIC8vIHdoYXQgdG8gZG8gd2l0aCBubyBuYW1lc3BhY2UgZG9jcz8KLSAgICAgICAgfQotCi0gICAgICAgIGltcG9ydEVsZW1lbnQuc2V0QXR0cmlidXRlKCJsb2NhdGlvbiIsIGxvY2F0aW9uKTsKLSAgICAgICAgaW1wb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsIGltcG9ydFRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgZGVmaW5pdGlvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxuczoiICsgdW5pcXVlUHJlZml4LCBpbXBvcnRUYXJnZXROYW1lc3BhY2UpOwotCi0gICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChpbXBvcnRUYXJnZXROYW1lc3BhY2UpOwotICAgICAgICBsb2NhdGlvblRleHQuc2V0VGV4dChsb2NhdGlvbik7Ci0gICAgICAgIHByZWZpeFRleHQuc2V0VGV4dCh1bmlxdWVQcmVmaXgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFVuaXF1ZVByZWZpeChEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBpbml0UHJlZml4KQotICB7Ci0gICAgU3RyaW5nIHVuaXF1ZVByZWZpeDsKLSAgICBNYXAgbWFwID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0KLSAgICBpZiAoZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UoaW5pdFByZWZpeCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB1bmlxdWVQcmVmaXggPSBpbml0UHJlZml4OwotICAgIH0KLSAgICBlbHNlIC8vIGlmIHVzZWQsIHRoZW4gdHJ5IHRvIGNyZWF0ZSBhIHVuaXF1ZSBvbmUKLSAgICB7Ci0gICAgICBTdHJpbmcgdGVtcFByZWZpeCA9IGluaXRQcmVmaXg7Ci0gICAgICBpbnQgaSA9IDE7Ci0gICAgICB3aGlsZShtYXAuY29udGFpbnNLZXkodGVtcFByZWZpeCArIGkpKQotICAgICAgewotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgICB1bmlxdWVQcmVmaXggPSB0ZW1wUHJlZml4ICsgaTsKLSAgICB9Ci0gICAgcmV0dXJuIHVuaXF1ZVByZWZpeDsgICAgCi0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL0lucHV0T3V0cHV0RmF1bHRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5wdXRPdXRwdXRGYXVsdFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTdmN2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvSW5wdXRPdXRwdXRGYXVsdFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5Db21wb25lbnRSZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5Db21wb25lbnROYW1lQ29tYm9IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkludm9rZURpYWxvZ0J1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIElucHV0T3V0cHV0RmF1bHRWaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87IAotICBwcm90ZWN0ZWQgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlcjsKLSAgSW52b2tlRGlhbG9nQnV0dG9uIGJ1dHRvbjsKLQotICBwdWJsaWMgSW5wdXRPdXRwdXRGYXVsdFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgICAgCi0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsgCi0gICAgU3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSW5wdXQpCi0gICAgewotICAgICAgcmVzdWx0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfSU5QVVQiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIE91dHB1dCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9PVVRQVVQiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0ZBVUxUIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9ICAgICAgICAgICAgICAgICAKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdEV4dGVuc2libGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBwb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLnBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgTGFiZWwgbWVzc2FnZUxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTUVTU0FHRSIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgY29tcG9uZW50TmFtZUNvbWJvID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNDb21ib0JveChjb21wb3NpdGUpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsgICAgICAKLQotICAgIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlciA9IG5ldyBDb21wb25lbnROYW1lQ29tYm9IZWxwZXIoY29tcG9uZW50TmFtZUNvbWJvKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHV0aWwuZ2V0TWVzc2FnZU5hbWVzKCk7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLk1FU1NBR0VfQVRUUklCVVRFOwotICAgICAgfQotICAgIH07Ci0KLSAgICBidXR0b24gPSBuZXcgSW52b2tlRGlhbG9nQnV0dG9uKGNvbXBvc2l0ZSwgZ2V0SW5wdXQoKSk7Ci0gICAgYnV0dG9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgICBzdXBlci51cGRhdGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlci51cGRhdGUoaW5wdXQpOwotICAgIGJ1dHRvbi5zZXRJbnB1dChpbnB1dCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIuaGFuZGxlRXZlbnRIZWxwZXIoZWxlbWVudCwgZXZlbnQpOwotICAgIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlci5oYW5kbGVFdmVudEhlbHBlcihlbGVtZW50LCBldmVudCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL01lc3NhZ2VWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvTWVzc2FnZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYThlMGM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvTWVzc2FnZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VWaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIE1lc3NhZ2VWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7IAotICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9NRVNTQUdFIik7IC8vJE5PTi1OTFMtMSQKLSAgfSAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9OYW1lZENvbXBvbmVudFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9OYW1lZENvbXBvbmVudFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzMwMmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvTmFtZWRDb21wb25lbnRWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuU21hcnRSZW5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuTW9kZWxBZGFwdGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETE1vZGVsQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWRDb21wb25lbnRWaWV3ZXIgZXh0ZW5kcyBCYXNlVmlld2VyIGltcGxlbWVudHMgTW9kZWxBZGFwdGVyTGlzdGVuZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotICBwcm90ZWN0ZWQgVGV4dCBuYW1lRmllbGQ7ICAKLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0KLSAgcHVibGljIE5hbWVkQ29tcG9uZW50Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICBzdXBlcihnZXRTdGF0dXNMaW5lTWFuYWdlcihlZGl0b3JQYXJ0KSk7ICAgIAotICAgIHRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7ICAgICAgICAgICAgICAgICAgCi0KLSAgICBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpOyAgCi0KLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBwb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gIAlDb21wb3NpdGUgZ3JvdXAgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMiwgdHJ1ZSk7Ci0gCQotICAJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgQ29tcG9zaXRlIG5hbWVGaWVsZENvbXBvc2l0ZSA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoZ3JvdXAsIDIsIHRydWUpOwotCSgoR3JpZExheW91dCluYW1lRmllbGRDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpbldpZHRoID0gMDsKLSAgICAoKEdyaWRMYXlvdXQpbmFtZUZpZWxkQ29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5IZWlnaHQgPSAwOyAJCi0JIAotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoICA9IGZhbHNlOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNDsKLSAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCi0gICAgbmFtZUZpZWxkQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOyAgICAgIAotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotICAgIG5hbWVGaWVsZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCi0gICAgTGFiZWwgbmFtZUxhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKG5hbWVGaWVsZENvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVGaWVsZCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVUZXh0RmllbGQobmFtZUZpZWxkQ29tcG9zaXRlKTsgIAotICAgIG5hbWVGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsgIAotICAgIAotICAgIC8vIHBsYWNlIGhvbGRlcgotICAgIENvbnRyb2wgYyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChuYW1lRmllbGRDb21wb3NpdGUsIDAsICIiKTsKLSAgICBjLnNldEJhY2tncm91bmQobmV3IENvbG9yKG51bGwsIDAsIDI1NSwgMTAwKSk7Ci0gICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IDA7Ci0gICAgZ2Qud2lkdGhIaW50ID0gMDsKLSAgICBjLnNldExheW91dERhdGEoZ2QpOwotICAgIAkKLSAgICByZXR1cm4gbmFtZUZpZWxkQ29tcG9zaXRlOwotICB9IAotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAKLQlTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5CT1JERVIpOwotCXNhc2hGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCWNvbnRyb2wgPSBzYXNoRm9ybTsKLQlzYXNoRm9ybS5zZXRPcmllbnRhdGlvbihTV1QuSE9SSVpPTlRBTCk7Ci0JCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoc2FzaEZvcm0sIDEsIHRydWUpOyAgICAgICAgCi0JY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpY29tcG9zaXRlLmdldExheW91dCgpOwotICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgIGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVGbGF0UGFnZUhlYWRlcihjb21wb3NpdGUsIGdldEhlYWRpbmdUZXh0KCkpOwotICAgICAgIAotICAgIHBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0gICAgCi0JVGFiYmVkVmlld2VyIHRhYmJlZFZpZXdlciA9IG5ldyBUYWJiZWRWaWV3ZXIoKFdTRExFZGl0b3IpZWRpdG9yUGFydCk7Ci0KLQlDb250cm9sIGMgPSB0YWJiZWRWaWV3ZXIuY3JlYXRlQ29udHJvbChzYXNoRm9ybSk7Ci0JYy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsgIAkgICAgIAkKLSAgfQotICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgZG9TZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsgICAgCi0gICAgc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRyeQotICAgIHsgICAgICAgICAgCi0gICAgICBOb2RlIG5vZGUgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldE5vZGVGb3JPYmplY3QoaW5wdXQpOwotICAgICAgdXBkYXRlKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgaWYgKG9sZElucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKS5yZW1vdmVNb2RlbEFkYXB0ZXJMaXN0ZW5lcihvbGRJbnB1dCwgdGhpcyk7Ci0gICAgfQotCi0gICAgV1NETE1vZGVsQWRhcHRlckZhY3RvcnkuZ2V0V1NETE1vZGVsQWRhcHRlckZhY3RvcnkoKS5hZGRNb2RlbEFkYXB0ZXJMaXN0ZW5lcihpbnB1dCwgdGhpcyk7Ci0gICAgb2xkSW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KWlucHV0KS5nZXRFbGVtZW50KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmbGF0Vmlld1V0aWxpdHkudXBkYXRlRmxhdFBhZ2VIZWFkZXJUaXRsZShnZXRIZWFkaW5nVGV4dCgpKTsKLQotICAgIG5hbWVGaWVsZC5zZXRUZXh0KCIiKTsKLSAgICBTdHJpbmcgbmFtZVZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSk7Ci0gICAgbmFtZUZpZWxkLnNldFRleHQobmFtZVZhbHVlICE9IG51bGwgPyBuYW1lVmFsdWUgOiAiIik7ICAKLSAgfQotCi0gIHB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKQotICB7Ci0gICAgcmV0dXJuIGNvbnRyb2w7Ci0gIH0KLQotICAvKgotICAgKiBAc2VlIEJhc2VXaW5kb3cjZG9IYW5kbGVFdmVudChFdmVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLSAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChpbnB1dCk7Ci0gICAgaGFuZGxlRXZlbnRIZWxwZXIoZWxlbWVudCwgZXZlbnQpOyAgIAotICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgfSAgICAgICAgICAgICAKLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsgIAotICAgICAgaWYgKGV2ZW50LndpZGdldCA9PSBuYW1lRmllbGQpCi0gICAgICB7IAotICAgICAgICBuZXcgU21hcnRSZW5hbWVBY3Rpb24oaW5wdXQsIG5hbWVGaWVsZC5nZXRUZXh0KCkpLnJ1bigpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpCi0gIHsKLSAgICBpZiAoaXNMaXN0ZW5lckVuYWJsZWQoKSkKLSAgICB7Ci0gICAgICBzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotICAgICAgaWYgKCFjb250cm9sLmlzRGlzcG9zZWQoKSkKLSAgICAgIHsgICAgICAKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgICB9ICAKLSAgICAgIHNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL09wZXJhdGlvblZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9PcGVyYXRpb25WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5ZWE1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL09wZXJhdGlvblZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uVmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIE9wZXJhdGlvblZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgICAgCi0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfT1BFUkFUSU9OIik7ICAvLyROT04tTkxTLTEkCi0gIH0gIAotCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5wb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgIAotICAgIExhYmVsIHBhcmFtZXRlck9yZGVyTGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAwLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9QQVJBTUVURVJfT1JERVIiKSk7ICAvLyROT04tTkxTLTEkCi0gICAgVGV4dCBwYXJhbWV0ZXJPcmRlckZpZWxkID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZVRleHRGaWVsZChjb21wb3NpdGUpOyAgCi0gICAgcGFyYW1ldGVyT3JkZXJGaWVsZC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy9CdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5GTEFUKTsKLSAgICAvL2J1dHRvbi5zZXRUZXh0KCIuLi4iKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUGFydFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9QYXJ0Vmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODkwZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9QYXJ0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzLkludm9rZURpYWxvZ0J1dHRvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgUGFydFZpZXdlciBleHRlbmRzIE5hbWVkQ29tcG9uZW50Vmlld2VyCi17ICAgCi0gIHByb3RlY3RlZCBDQ29tYm8gY29tcG9uZW50TmFtZUNvbWJvOwotICBwcm90ZWN0ZWQgQ0NvbWJvIHJlZmVyZW5jZUtpbmRDb21ibzsgCi0gIHByb3RlY3RlZCBMYWJlbCBjb21wb25lbnROYW1lTGFiZWw7Ci0gIEludm9rZURpYWxvZ0J1dHRvbiBidXR0b247Ci0vLyAgQnV0dG9uIGltcG9ydEJ1dHRvbjsKLSAgCi0KLSAgcHVibGljIFBhcnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BBUlQiKTsgIC8vJE5PTi1OTFMtMSQKLSAgfSAKLQotICBwdWJsaWMgYm9vbGVhbiBpc09iamVjdEV4dGVuc2libGUoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCBDb21wb3NpdGUgcG9wdWxhdGVQcmltYXJ5RGV0YWlsc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5wb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihwYXJlbnQpOwotICAgICAKLSAgICBMYWJlbCBjb21wb25lbnRUeXBlTGFiZWwgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9SRUZFUkVOQ0VfS0lORCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHJlZmVyZW5jZUtpbmRDb21ibyA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDQ29tYm9Cb3goY29tcG9zaXRlKTsKLSAgICByZWZlcmVuY2VLaW5kQ29tYm8uYWRkKCJlbGVtZW50Iik7Ci0gICAgcmVmZXJlbmNlS2luZENvbWJvLmFkZCgidHlwZSIpOwotICAgIHJlZmVyZW5jZUtpbmRDb21iby5zZXRUZXh0KCJ0eXBlIik7Ci0gICAgcmVmZXJlbmNlS2luZENvbWJvLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0gICAgTGFiZWwgcGggPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7IAotICAgIAotICAgIGNvbXBvbmVudE5hbWVMYWJlbCA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0VMRU1FTlQiKSk7ICAgLy8kTk9OLU5MUy0xJAotCi0gICAgY29tcG9uZW50TmFtZUNvbWJvID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNDb21ib0JveChjb21wb3NpdGUpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLSAgICBjb21wb25lbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLSAgICBidXR0b24gPSBuZXcgSW52b2tlRGlhbG9nQnV0dG9uKGNvbXBvc2l0ZSwgZ2V0SW5wdXQoKSk7Ci0gICAgCi0gICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgfSAgCi0gICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KWlucHV0OwotICAgICAgYm9vbGVhbiBpc1R5cGUgPSBDb21wb25lbnRSZWZlcmVuY2VVdGlsLmlzVHlwZShwYXJ0KTsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IENvbXBvbmVudFJlZmVyZW5jZVV0aWwuZ2V0UGFydENvbXBvbmVudFJlZmVyZW5jZShwYXJ0KTsKLQotICAgICAgLy8gdXBkYXRlIHRoZSBjb21iby1ib3ggY29udGVudAotICAgICAgLy8KLSAgICAgIGNvbXBvbmVudE5hbWVDb21iby5yZW1vdmVBbGwoKTsgCi0gICAgICBMaXN0IGNvbXBMaXN0ID0gQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXRDb21wb25lbnROYW1lTGlzdChwYXJ0LCBpc1R5cGUpOwotICAgICAgaWYgKGNvbXBMaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAgY29tcExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGQoKFN0cmluZylpdGVyYXRvci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgCi0gICAgICBpZiAoaXNUeXBlKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVmZXJlbmNlS2luZENvbWJvLnNldFRleHQoInR5cGUiKTsKLSAgICAgICAgY29tcG9uZW50TmFtZUxhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfVFlQRSIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOwotICAgICAgICBidXR0b24uc2V0UmVmZXJlbmNlS2luZCgidHlwZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZWZlcmVuY2VLaW5kQ29tYm8uc2V0VGV4dCgiZWxlbWVudCIpOwotICAgICAgICBjb21wb25lbnROYW1lTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9FTEVNRU5UIikpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb21wb25lbnROYW1lQ29tYm8uc2V0VGV4dCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiAiIik7Ci0gICAgICAgIGJ1dHRvbi5zZXRSZWZlcmVuY2VLaW5kKCJlbGVtZW50Iik7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGJ1dHRvbi5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICBidXR0b24uc2V0RWRpdG9yKGVkaXRvclBhcnQpOwotICAgICAgc3VwZXIudXBkYXRlKCk7ICAKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9ICAgICAgIAotICAgICAgCi0gICAgIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFdmVudEhlbHBlcihFbGVtZW50IGVsZW1lbnQsIEV2ZW50IGV2ZW50KQotICB7ICAKLSAgICBzdXBlci5oYW5kbGVFdmVudEhlbHBlcihlbGVtZW50LCBldmVudCk7Ci0gICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULk1vZGlmeSkKLSAgICB7ICAKLSAgICAgIGlmIChldmVudC53aWRnZXQgPT0gcmVmZXJlbmNlS2luZENvbWJvKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBUT0RPLi4uIEkgaGF2ZSBubyBpZGVhIHdoeSB3ZSBuZWVkIHRvIHVzZSBhIGRlbGF5ZWQgcnVubmFibGUgdG8gZ2V0IAotICAgICAgICAvLyB1cGRhdGluZyB3b3JraW5nIHByb3Blcmx5IC4uLi4gdGhpcyBpcyBzb21ldGhpbmcgd2UgbmVlZCB0byByZXZpc2l0Ci0gICAgICAgIERlbGF5ZWRSZW5hbWVSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBEZWxheWVkUmVuYW1lUnVubmFibGUoKFBhcnQpaW5wdXQpOwotICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOyAgCi0gICAgICB9IAotICAgIH0KLSAgfSAgICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBEZWxheWVkUmVuYW1lUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBQYXJ0IHBhcnQ7Ci0KLSAgICBEZWxheWVkUmVuYW1lUnVubmFibGUoUGFydCBwYXJ0KQotICAgIHsKLSAgICAgIHRoaXMucGFydCA9IHBhcnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgICAgICAgICAgICAgICAgICAKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBib29sZWFuIGlzVHlwZSA9IHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJ0eXBlIik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIG51bGwpOyAgICAKLSAgICB9Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGRvV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgewotICAgIGlmIChlLndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpaW5wdXQ7Ci0gICAgICBib29sZWFuIGlzVHlwZSA9IHJlZmVyZW5jZUtpbmRDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJ0eXBlIik7Ci0gICAgICBDb21wb25lbnRSZWZlcmVuY2VVdGlsLnNldENvbXBvbmVudFJlZmVyZW5jZShwYXJ0LCBpc1R5cGUsIGNvbXBvbmVudE5hbWVDb21iby5nZXRUZXh0KCkpOyAgICAgICAgICAKLSAgICB9Ci0gIH0gCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0VHlwZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9Qb3J0VHlwZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVmZGZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFR5cGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVWaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgUG9ydFR5cGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BPUlRUWVBFIik7IC8vJE5PTi1OTFMtMSQKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzT2JqZWN0RXh0ZW5zaWJsZSgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1BvcnRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZThhODNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvUG9ydFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHMuQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0cy5JbnZva2VEaWFsb2dCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQb3J0Vmlld2VyIGV4dGVuZHMgTmFtZWRDb21wb25lbnRWaWV3ZXIgCi17ICAKLSAgcHJvdGVjdGVkIENDb21ibyBjb21wb25lbnROYW1lQ29tYm87ICAgICAKLSAgcHJvdGVjdGVkIENvbXBvbmVudE5hbWVDb21ib0hlbHBlciBjb21wb25lbnROYW1lQ29tYm9IZWxwZXI7Ci0gIEludm9rZURpYWxvZ0J1dHRvbiBidXR0b247Ci0KLSAgcHVibGljIFBvcnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLSAgewotICAgIHN1cGVyKHBhcmVudCwgZWRpdG9yUGFydCk7ICAgIAotICB9IAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZGluZ1RleHQoKQotICB7Ci0gICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BPUlQiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBwb3B1bGF0ZVByaW1hcnlEZXRhaWxzU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLnBvcHVsYXRlUHJpbWFyeURldGFpbHNTZWN0aW9uKHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgTGFiZWwgYmluZGluZ0xhYmVsID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElORyIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgY29tcG9uZW50TmFtZUNvbWJvID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNDb21ib0JveChjb21wb3NpdGUpOwotICAgIGNvbXBvbmVudE5hbWVDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsgICAKLQotICAgIGNvbXBvbmVudE5hbWVDb21ib0hlbHBlciA9IG5ldyBDb21wb25lbnROYW1lQ29tYm9IZWxwZXIoY29tcG9uZW50TmFtZUNvbWJvKQotICAgIHsKLSAgICAgIHByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudE5hbWVMaXN0KENvbXBvbmVudFJlZmVyZW5jZVV0aWwgdXRpbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHV0aWwuZ2V0QmluZGluZ05hbWVzKCk7Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBXU0RMQ29uc3RhbnRzLkJJTkRJTkdfQVRUUklCVVRFOwotICAgICAgfQotICAgIH07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBidXR0b24gPSBuZXcgSW52b2tlRGlhbG9nQnV0dG9uKGNvbXBvc2l0ZSwgZ2V0SW5wdXQoKSk7Ci0gICAgYnV0dG9uLnNldEVkaXRvcihlZGl0b3JQYXJ0KTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHN1cGVyLnVwZGF0ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLnVwZGF0ZShpbnB1dCk7Ci0gICAgYnV0dG9uLnNldElucHV0KGlucHV0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZUV2ZW50SGVscGVyKEVsZW1lbnQgZWxlbWVudCwgRXZlbnQgZXZlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzdXBlci5oYW5kbGVFdmVudEhlbHBlcihlbGVtZW50LCBldmVudCk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvSGVscGVyLmhhbmRsZUV2ZW50SGVscGVyKGVsZW1lbnQsIGV2ZW50KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvU2VydmljZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2aWNlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYjIzY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9TZXJ2aWNlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VWaWV3ZXIgZXh0ZW5kcyBOYW1lZENvbXBvbmVudFZpZXdlciAKLXsgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgU2VydmljZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KQotICB7Ci0gICAgc3VwZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgICAgCi0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfU0VSVklDRSIpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmJlZFZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9UYWJiZWRWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjZjMyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1RhYmJlZFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2VyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuV1NETEVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUYWJiZWRWaWV3ZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgV1NETEVkaXRvciBlZGl0b3I7Ci0gIHByb3RlY3RlZCBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLSAgcHJvdGVjdGVkIFRleHQgZG9jdW1lbnRhdGlvbkZpZWxkOwotICBwcm90ZWN0ZWQgRG9jdW1lbnRhdGlvbkxpc3RlbmVyIGRvY3VtZW50YXRpb25MaXN0ZW5lcjsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbGlzdGVuZXJFbmFibGVkOwotCi0gIHB1YmxpYyBUYWJiZWRWaWV3ZXIoV1NETEVkaXRvciBlZGl0b3IpCi0gIHsKLSAgICB0aGlzLmVkaXRvciA9IGVkaXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gICAgIAotCi0gIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgeyAKLSAgICB0YWJGb2xkZXIgPSBuZXcgQ1RhYkZvbGRlcihwYXJlbnQsIDApOwotCi0gICAgQ1RhYkl0ZW0gdGFiID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotICAgIHRhYi5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0RPQ1VNRU5USU9OIikpOyAvLyROT04tTkxTLTEkCi0gICAgZG9jdW1lbnRhdGlvbkZpZWxkID0gbmV3IFRleHQodGFiRm9sZGVyLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuV1JBUCk7Ci0gICAgdGFiLnNldENvbnRyb2woZG9jdW1lbnRhdGlvbkZpZWxkKTsKLSAgICB0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKHRhYik7Ci0gICAgCi0gICAgZG9jdW1lbnRhdGlvbkxpc3RlbmVyID0gbmV3IERvY3VtZW50YXRpb25MaXN0ZW5lcigpOwotICAgIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0gICAgZG9jdW1lbnRhdGlvbkZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKGRvY3VtZW50YXRpb25MaXN0ZW5lcik7Ci0gICAgCi0gICAgZWRpdG9yLmdldFNlbGVjdGlvbk1hbmFnZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLSAgICByZXR1cm4gdGFiRm9sZGVyOwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgbGlzdGVuZXJFbmFibGVkID0gZmFsc2U7Ci0gICAgZG9jdW1lbnRhdGlvbkxpc3RlbmVyLnNldElucHV0KG9iamVjdCk7Ci0gICAgZG9jdW1lbnRhdGlvbkZpZWxkLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgZG9jdW1lbnRhdGlvbkZpZWxkLnNldFRleHQoIiIpOwotICAgIAotICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb21wb25lbnQgfHwgIShvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkpCi0gICAgewotICAgICAgZG9jdW1lbnRhdGlvbkZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qob2JqZWN0KTsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscygiZG9jdW1lbnRhdGlvbiIpKQotICAgICAgewotICAgICAgICBkb2N1bWVudGF0aW9uRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgTm9kZSBkb2NOb2RlID0gZ2V0Q2hpbGROb2RlKGVsZW1lbnQsIGVsZW1lbnQuZ2V0UHJlZml4KCksICJkb2N1bWVudGF0aW9uIik7Ci0gICAgICBpZiAoZG9jTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBOb2RlIHRleHROb2RlID0gZG9jTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIGlmICh0ZXh0Tm9kZSAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIFN0cmluZyB0ZXh0Tm9kZVZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgZG9jdW1lbnRhdGlvbkZpZWxkLnNldFRleHQodGV4dE5vZGVWYWx1ZSAhPSBudWxsID8gdGV4dE5vZGVWYWx1ZSA6ICIiKTsgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLS8vIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBkZWZlY3QgaW4gdGhlIG1vZGVsLi4uaXQgZG9lc24ndCByZXR1cm4KLS8vIHRoZSBkb2N1bWVudGF0aW9uRWxlbWVudCBldmVuIHRob3VnaCBpdCBleGlzdHMKLS8vICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLS8vICAgIHsKLS8vICAgICAgV1NETEVsZW1lbnQgZWxlbSA9IChXU0RMRWxlbWVudClvYmplY3Q7Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZWxlbSA9ICIgKyBlbGVtKTsKLS8vCi0vLyAgICAgIGlmIChlbGVtICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBFbGVtZW50IGRvYyA9IGVsZW0uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvY05vZGUgPSAiICsgZG9jKTsKLS8vICAgICAgICBpZiAoZG9jICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgTm9kZSB0ZXh0Tm9kZSA9IGRvYy5nZXRGaXJzdENoaWxkKCk7Ci0vLyAgICAgICAgICBpZiAodGV4dE5vZGUgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZpZWxkLnNldFRleHQodGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgfQotICB9Ci0gICAKLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpICAKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0SW5wdXQobyk7IAotICAgICAgfQotICAgIH0KLSAgfSAgIAotCi0gIHB1YmxpYyBOb2RlIGdldENoaWxkTm9kZShFbGVtZW50IHBhcmVudCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGNoaWxkTmFtZSkKLSAgewotICAgIE5vZGVMaXN0IGxpc3QgPSBudWxsOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICB9Ci0gICAgU3RyaW5nIHRhcmdldE5hbWU7Ci0gICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgdGFyZ2V0TmFtZSA9IHByZWZpeCArICI6IiArIGNoaWxkTmFtZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRhcmdldE5hbWUgPSBjaGlsZE5hbWU7Ci0gICAgfSAgCi0gICAKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgaWYgKGxpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBQZXJmb3JtYW5jZSBpc3N1ZSBwZXJoYXBzPwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChsaXN0Lml0ZW0oaSkgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGxpc3QuaXRlbShpKS5nZXROb2RlTmFtZSgpLmVxdWFscyh0YXJnZXROYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVtKGkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0KLQotICBjbGFzcyBEb2N1bWVudGF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotICB7Ci0gICAgT2JqZWN0IG9iamVjdDsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KE1vZGlmeUV2ZW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgICB7Ci0gICAgICBpZiAobGlzdGVuZXJFbmFibGVkKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgZG9jTm9kZSA9IGdldENoaWxkTm9kZShlbGVtZW50LCBlbGVtZW50LmdldFByZWZpeCgpLCAiZG9jdW1lbnRhdGlvbiIpOwotICAgICAgICAgIGlmIChkb2NOb2RlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgTm9kZSB0ZXh0Tm9kZSA9IGRvY05vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgaWYgKHRleHROb2RlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRleHROb2RlLnNldE5vZGVWYWx1ZShkb2N1bWVudGF0aW9uRmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGRvY3VtZW50YXRpb25GaWVsZC5nZXRUZXh0KCkgIT0gbnVsbCAmJiBkb2N1bWVudGF0aW9uRmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZG9jTm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgICAgICAgb3JnLnczYy5kb20uVGV4dCBuZXdUZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRvY3VtZW50YXRpb25GaWVsZC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIGRvY05vZGUuYXBwZW5kQ2hpbGQobmV3VGV4dE5vZGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBZGRFbGVtZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBBZGRFbGVtZW50QWN0aW9uKGVsZW1lbnQsIGVsZW1lbnQuZ2V0UHJlZml4KCksICJkb2N1bWVudGF0aW9uIiwgZWxlbWVudC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgICAgICAgYWN0aW9uLnJ1bigpOwotICAgICAgICAgICAgRWxlbWVudCBuZXdEb2N1bWVudGF0aW9uID0gYWN0aW9uLmdldE5ld0VsZW1lbnQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXdEb2N1bWVudGF0aW9uLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQgbmV3VGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkb2N1bWVudGF0aW9uRmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgIG5ld0RvY3VtZW50YXRpb24uYXBwZW5kQ2hpbGQobmV3VGV4dE5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotICAgICAgICAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvV1NETERldGFpbHNWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvV1NETERldGFpbHNWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjOGQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL1dTRExEZXRhaWxzVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwubW9kZWwuV1NETEdyb3VwT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGNsYXNzIFdTRExEZXRhaWxzVmlld2VyIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFdTRExFZGl0b3IgZWRpdG9yOwotICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNsaWVudDsgIAotICBwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0gIHByb3RlY3RlZCBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyIGRldGFpbHNWaWV3ZXJQcm92aWRlcjsgIAotICBwcm90ZWN0ZWQgSGFzaE1hcCB2aWV3ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZX1ZJRVdFUl9LRVkgPSAiRU1QVFlfVklFV0VSX0tFWSI7Ci0gIHByb3RlY3RlZCBWaWV3ZXIgZW1wdHlWaWV3ZXI7Ci0KLSAgcHVibGljIFdTRExEZXRhaWxzVmlld2VyKFdTRExFZGl0b3IgZWRpdG9yKQotICB7Ci0gICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGRldGFpbHNWaWV3ZXJQcm92aWRlciA9IG5ldyBFeHRlbnNpYmxlRGV0YWlsc1ZpZXdlclByb3ZpZGVyKGVkaXRvcik7ICAgIAotICAgIGVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotICB9Ci0gIAotICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjbGllbnQgPSBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIDApOwotCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIGVtcHR5Vmlld2VyID0gbmV3IEVtcHR5Vmlld2VyKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgdmlld2VyTWFwLnB1dChFTVBUWV9WSUVXRVJfS0VZLCBlbXB0eVZpZXdlcik7Ci0gICAgcGFnZUJvb2suc2hvd1BhZ2UoZW1wdHlWaWV3ZXIuZ2V0Q29udHJvbCgpKTsKLSAgICByZXR1cm4gY2xpZW50OwotICB9ICAKLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3Qgb2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdHJ5Ci0gICAgewotICAgICAgT2JqZWN0IGtleSA9IGRldGFpbHNWaWV3ZXJQcm92aWRlci5nZXRWaWV3ZXJLZXkob2JqZWN0KTsgIAotICAgICAgCi0gICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IEVNUFRZX1ZJRVdFUl9LRVk7Ci0gICAgICB9Ci0gICAgICBWaWV3ZXIgdmlld2VyID0gKFZpZXdlcil2aWV3ZXJNYXAuZ2V0KGtleSk7Ci0gICAgICBpZiAodmlld2VyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IGRldGFpbHNWaWV3ZXJQcm92aWRlci5jcmVhdGVWaWV3ZXIob2JqZWN0LCBwYWdlQm9vaywgZWRpdG9yKTsKLSAgICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlld2VyTWFwLnB1dChrZXksIHZpZXdlcik7Ci0gICAgICAgICAgaWYgKHZpZXdlciBpbnN0YW5jZW9mIE9wZXJhdGlvblZpZXdlcikKLSAgICAgICAgICB7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHZpZXdlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBzY2hlbWEgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpb2JqZWN0OwotICAgICAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBzY2hlbWEuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZpZXdlci5zZXRJbnB1dCh4c2RTY2hlbWEuZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmlld2VyLnNldElucHV0KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2Uodmlld2VyLmdldENvbnRyb2woKSk7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICBpZiAobyBpbnN0YW5jZW9mIFdTRExHcm91cE9iamVjdCkKLSAgICAgIHsKLSAgICAgIAlvID0gKChXU0RMR3JvdXBPYmplY3QpbykuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgc2V0SW5wdXQobyk7ICAgICAgIAotICAgIH0KLSAgfSAgIAotfQotICAgICAgICAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvV1NETERldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmFmMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy9XU0RMRGV0YWlsc1ZpZXdlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JRGV0YWlsc1ZpZXdlclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgV1NETERldGFpbHNWaWV3ZXJQcm92aWRlciBpbXBsZW1lbnRzIElEZXRhaWxzVmlld2VyUHJvdmlkZXIKLXsKLSAgcHVibGljIE9iamVjdCBnZXRWaWV3ZXJLZXkoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7ICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyB0b2RvLi4uLiB1c2UgYSBzd2l0Y2gKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJtZXNzYWdlIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJiaW5kaW5nIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJiaW5kaW5nT3BlcmF0aW9uIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgewotICAgICAgcmVzdWx0ID0gIm9wZXJhdGlvbiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICByZXN1bHQgPSAiZGVmaW5pdGlvbiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgUGFydCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicGFydCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgUG9ydCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicG9ydCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgSW5wdXQgfHwgCi0gICAgICAgICAgICAgbW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPdXRwdXQgfHwKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJpbnB1dE91dHB1dEZhdWx0IjsKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0IHx8IAotICAgICAgICAgICAgIG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCB8fCAKLSAgICAgICAgICAgICBtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgCi0gICAgewotICAgICAgcmVzdWx0ID0gImJpbmRpbmdJbnB1dE91dHB1dEZhdWx0IjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAicG9ydFR5cGUiOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFNlcnZpY2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gInNlcnZpY2UiOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJleHRlbnNpYmlsaXR5RWxlbWVudCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgSW1wb3J0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJpbXBvcnQiOyAKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICJlbXB0eSI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQotICBwdWJsaWMgVmlld2VyIGNyZWF0ZVZpZXdlcihPYmplY3QgbW9kZWxPYmplY3QsIENvbXBvc2l0ZSBwYXJlbnQsIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBWaWV3ZXIgdmlld2VyID0gbnVsbDsKLSAgICBPYmplY3Qga2V5ID0gZ2V0Vmlld2VyS2V5KG1vZGVsT2JqZWN0KTsKLSAgICBpZiAoa2V5ICE9IG51bGwpICAgICAKLSAgICB7Ci0gICAgICBpZiAoa2V5LmVxdWFscygibWVzc2FnZSIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgTWVzc2FnZVZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOyAKLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJiaW5kaW5nIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBCaW5kaW5nVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJkZWZpbml0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBEZWZpbml0aW9uVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiYmluZGluZ09wZXJhdGlvbiIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgQmluZGluZ09wZXJhdGlvblZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygib3BlcmF0aW9uIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBPcGVyYXRpb25WaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoInBhcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IFBhcnRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoInBvcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IFBvcnRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGtleS5lcXVhbHMoImlucHV0T3V0cHV0RmF1bHQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IElucHV0T3V0cHV0RmF1bHRWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgCi0gICAgICB9ICAgIAotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiYmluZGluZ0lucHV0T3V0cHV0RmF1bHQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEJpbmRpbmdJbnB1dE91dHB1dEZhdWx0Vmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfSAgICAgICAgCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJzZXJ2aWNlIikpCi0gICAgICB7Ci0gICAgICAgIHZpZXdlciA9IG5ldyBTZXJ2aWNlVmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfQotICAgICAgZWxzZSBpZiAoa2V5LmVxdWFscygiZXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50Vmlld2VyKHBhcmVudCwgZWRpdG9yUGFydCk7IAotICAgICAgfSAgCi0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJwb3J0VHlwZSIpKQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgUG9ydFR5cGVWaWV3ZXIocGFyZW50LCBlZGl0b3JQYXJ0KTsgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChrZXkuZXF1YWxzKCJpbXBvcnQiKSkKLSAgICAgIHsKLSAgICAgICAgdmlld2VyID0gbmV3IEltcG9ydFZpZXdlcihwYXJlbnQsIGVkaXRvclBhcnQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2aWV3ZXIgPSBuZXcgRW1wdHlWaWV3ZXIocGFyZW50LCAwKTsgCi0gICAgICB9Ci0gICAgfSAgIAotICAgIHJldHVybiB2aWV3ZXI7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQXR0cmlidXRlc1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQXR0cmlidXRlc1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NjE2MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0F0dHJpYnV0ZXNUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZXNUYWJsZSBleHRlbmRzIFRhYmxlVmlld2VyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1BST1BFUlRZIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9WQUxVRSIpOyAvLyROT04tTkxTLTEkCi0KLSAgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzID0ge1BST1BFUlRZLCBWQUxVRX07Ci0gIHByb3RlY3RlZCBQcm9wZXJ0eVRhYmxlUHJvdmlkZXIgdGFibGVQcm92aWRlciA9IG5ldyBQcm9wZXJ0eVRhYmxlUHJvdmlkZXIodGhpcyk7Ci0gIHByb3RlY3RlZCBDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yOwotICAvL3Byb3RlY3RlZCBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IgY29tYm9DZWxsRWRpdG9yOwotICBwcm90ZWN0ZWQgSVByb3BlcnR5U291cmNlIHByb3BlcnR5U291cmNlOwotICAKLQotICBwdWJsaWMgQXR0cmlidXRlc1RhYmxlKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBzdXBlcihuZXcgVGFibGUocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkgfCBTV1QuRkxBVCkpOyAgIAotICAJdGhpcy5lZGl0b3JQYXJ0ID0gZWRpdG9yUGFydDsgICAgICAgICAgICAgICAKLSAgICBnZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICBnZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7ICAKLSAgICAKLSAgICBzZXRDb250ZW50UHJvdmlkZXIodGFibGVQcm92aWRlcik7Ci0gICAgc2V0TGFiZWxQcm92aWRlcih0YWJsZVByb3ZpZGVyKTsKLSAgICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihnZXRUYWJsZSgpLCBTV1QuTk9ORSwgaSk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLSAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgIH0gICAgICAKLQotICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOyAKLSAgICBDb2x1bW5XZWlnaHREYXRhIGRhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg0MCwgNDAsIHRydWUpOwotICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEpOwotICAgIAotICAgIENvbHVtbldlaWdodERhdGEgZGF0YTIgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4MCwgODAsIHRydWUpOwotICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKGRhdGEyKTsgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgIAotICAgIHRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKGdldFRhYmxlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAJcmVzZXRDZWxsRWRpdG9ycygpOwkgICAgCi0KLSAgICBzZXRDZWxsTW9kaWZpZXIodGhpcyk7ICAgIAotICB9ICAKLSAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBob29rQ29udHJvbChDb250cm9sIGNvbnRyb2wpIHsKLSAgCS8vIHdlIG5lZWQgdG8gaG9vayB1cCBvdXIgb3duIG1vdXNlIGxpc3RlbmVyIGZpcnN0Ci0gIAkvLyBzbyB0aGF0IHdlIGNhbiB1cGRhdGUgdGhlIGNlbGxFZGl0b3JzIGJlZm9yZQotICAJLy8gdGhlICdpbnRlcm5hbCcgbGlzdGVuZXIgdHJpZXMgdG8gZ2V0IGhvbGQgb2YgdGhlbQotCVRhYmxlIHRhYmxlQ29udHJvbCA9IChUYWJsZSljb250cm9sOwotCSAgdGFibGVDb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl1cGRhdGVDZWxsRWRpdG9ycygpOwotCQkgIH0KLQkgIH0pOwkgIAkgIAkKLQkgIHN1cGVyLmhvb2tDb250cm9sKGNvbnRyb2wpOwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAvLyBJQ2VsbE1vZGlmaWVyCi0gIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIHByb3BlcnR5LmVxdWFscyhWQUxVRSk7Ci0gIH0gIAotCi0gIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgewotICAgIGludCBjb2x1bW4gPSAwOwotICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoY29sdW1uUHJvcGVydGllc1swXSkpCi0gICAgewotICAgICAgY29sdW1uID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKGNvbHVtblByb3BlcnRpZXNbMV0pKQotICAgIHsKLSAgICAgIGNvbHVtbiA9IDE7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gdGFibGVQcm92aWRlci5nZXRDb2x1bW5UZXh0KGVsZW1lbnQsIGNvbHVtbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKQotICB7ICAKLSAgCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSllbGVtZW50OwotCUlQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpaXRlbS5nZXREYXRhKCk7Ci0JCQotCS8vIGlmIHRoZSBuZXcgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCB2YWx1ZSwgdGhlIHVzZXIgaGFzIG9ubHkgY2xpY2tlZAotCS8vIG9uIHRoZSBjZWxsIGluIHRoZSBjb3Vyc2Ugb2YgJ2Jyb3dzaW5nJyAuLi4gc28gZG9uJ3QgZWRpdCB0aGUgdmFsdWUKLQlPYmplY3Qgb2xkVmFsdWUgPSBnZXRWYWx1ZShwcm9wZXJ0eURlc2NyaXB0b3IsIHByb3BlcnR5KTsJCi0JaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIAotCXsJCi0JCS8vIHdlIGFzc3VtZSB0aGUgdmFsdWUgaXMgZW1wdHkgdGhhdCB0aGUgYXR0cmlidXRlIHNob3VsZCBiZSByZW1vdmVkCi0JCS8vIHRvZG8uLi4gd2UgcHJvYmFibHkgbmVlZCB0byBsb29rIGF0IHRoaXMgaW4gbW9yZSBkZXRhaWwKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKXZhbHVlKS5sZW5ndGgoKSA9PSAwKQotCQl7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0JCSAgCQotCQlwcm9wZXJ0eVNvdXJjZS5zZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5RGVzY3JpcHRvci5nZXRJZCgpLCB2YWx1ZSk7ICAgCi0JCXJlZnJlc2goaXRlbS5nZXREYXRhKCkpOwotCX0JICAJCQotICB9IAotICAgCi0gICAKLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2VsbEVkaXRvcnMoKQotICB7ICAgICAgICAgICAgICAgIAotCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yWzJdOwotCWNlbGxFZGl0b3JzWzBdID0gdGV4dENlbGxFZGl0b3I7Ci0JY2VsbEVkaXRvcnNbMV0gPSB0ZXh0Q2VsbEVkaXRvcjsKLQotCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWdldElucHV0KCk7Ci0gICAgICAJIAotCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcm9wZXJ0eURlc2NyaXB0b3JzID0gcHJvcGVydHlTb3VyY2UuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCWludCBpbmRleCA9IGdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHByb3BlcnR5RGVzY3JpcHRvcnMubGVuZ3RoKQotCXsKLQkgIENlbGxFZGl0b3JbXSBvbGRDZWxsRWRpdG9ycyA9IGdldENlbGxFZGl0b3JzKCk7Ci0JICBDZWxsRWRpdG9yIG9sZENlbGxFZGl0b3IgPSAob2xkQ2VsbEVkaXRvcnMubGVuZ3RoID4gMSkgPyBvbGRDZWxsRWRpdG9yc1sxXSA6IG51bGw7Ci0JICBpZiAob2xkQ2VsbEVkaXRvciAhPSBudWxsICYmIG9sZENlbGxFZGl0b3IgIT0gdGV4dENlbGxFZGl0b3IpCi0JICB7Ci0JICAgb2xkQ2VsbEVkaXRvci5kZWFjdGl2YXRlKCk7Ci0JICAgb2xkQ2VsbEVkaXRvci5kaXNwb3NlKCk7Ci0JICB9Ci0JICBjZWxsRWRpdG9yc1sxXSA9IHByb3BlcnR5RGVzY3JpcHRvcnNbaW5kZXhdLmNyZWF0ZVByb3BlcnR5RWRpdG9yKGdldFRhYmxlKCkpOyAgICAgCi0JfSAgCi0Jc2V0Q2VsbEVkaXRvcnMoY2VsbEVkaXRvcnMpOyAgICAgCi0gIH0KLSAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIFN0cmluZ1tdIGdldFN0cmluZ0FycmF5KExpc3QgbGlzdCkKLSAgewotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHJlc3VsdFtpXSA9IChTdHJpbmcpbGlzdC5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCB2b2lkIHJlc2V0Q2VsbEVkaXRvcnMoKQotICB7Ci0JQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbMl07Ci0JY2VsbEVkaXRvcnNbMF0gPSB0ZXh0Q2VsbEVkaXRvcjsKLQljZWxsRWRpdG9yc1sxXSA9IHRleHRDZWxsRWRpdG9yOwotCXNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsgIAotICB9Ci0KLQotICBjbGFzcyBQcm9wZXJ0eVRhYmxlUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciwgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIKLSAgeyAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBUYWJsZVZpZXdlciB2aWV3ZXI7Ci0KLSAgICBQcm9wZXJ0eVRhYmxlUHJvdmlkZXIoVGFibGVWaWV3ZXIgdmlld2VyKQotICAgIHsKLSAgICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgIAotICAgIHsKLQkgIHJlc2V0Q2VsbEVkaXRvcnMoKTsJCSAgICAJCi0gICAgICBpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkKLSAgICAgIHsgICAgICAKLQkgICAgICBwcm9wZXJ0eVNvdXJjZSA9IG5ldyBFeHRlbnNpYmxlUHJvcGVydHlTb3VyY2UoZWRpdG9yUGFydCwgKElET01FbGVtZW50KW5ld0lucHV0KTsKLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAJcHJvcGVydHlTb3VyY2UgPSBuZXcgUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZShlZGl0b3JQYXJ0LCAoRWxlbWVudCluZXdJbnB1dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAJcHJvcGVydHlTb3VyY2UgPSBudWxsOwotICAgICAgfSAgIAkKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLSAgICB7ICAKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0gICAgICAKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgbywgaW50IGNvbHVtbkluZGV4KSAgCi0gICAgeyAKLQkgIElQcm9wZXJ0eURlc2NyaXB0b3IgcHJvcGVydHlEZXNjcmlwdG9yID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpbzsJCi0gICAgICByZXR1cm4gKGNvbHVtbkluZGV4ID09IDApID8gcHJvcGVydHlEZXNjcmlwdG9yLmdldElkKCkudG9TdHJpbmcoKSA6IHByb3BlcnR5U291cmNlLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHlEZXNjcmlwdG9yLmdldElkKCkpLnRvU3RyaW5nKCk7Ci0gICAgfSAgCi0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG8pCi0gICAgeyAgICAgICAgIAotICAgCSAgT2JqZWN0W10gcmVzdWx0ID0gcHJvcGVydHlTb3VyY2UuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgCSAgLy8gRm9yIHNvbWUgc3RyYW5nZSByZXNvbiB0aGUgVmlld2VyU29ydGVyIGRvZXNuJ3Qgc2VlbSB0byBiZSB3b3JraW5nIGZvciB0aGlzIHRhYmxlCi0gICAJICAvLyBBcyBhIHdvcmthcm91bmQgd2Ugc29ydCB0aGVtIGluIHRoaXMgbWV0aG9kIGJlZm9yZSByZXR1cm5pbmcgdGhlbSB0byB0aGUgdmlld2VyCi0gICAJICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApCi0gICAJICB7Ci0gICAJICAJQXJyYXlzLnNvcnQocmVzdWx0LCBuZXcgSW50ZXJuYWxDb21wYXJhdG9yKCkpOwotICAgCSAgfQotICAgCSAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLSAgCi0gIGNsYXNzIEludGVybmFsQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IKLSAgewotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZTEsIE9iamVjdCBlMikgCi0JewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHAxID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpZTE7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgcDIgPSAoSVByb3BlcnR5RGVzY3JpcHRvcillMjsKLQkJU3RyaW5nIHAxTmFtZSA9IHAxLmdldERpc3BsYXlOYW1lKCk7Ci0JCVN0cmluZyBwMk5hbWUgPSBwMi5nZXREaXNwbGF5TmFtZSgpOwotCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKHAxLmdldERpc3BsYXlOYW1lKCksIHAyLmdldERpc3BsYXlOYW1lKCkpOwotCX0gIAkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0NvbXBvbmVudE5hbWVDb21ib0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL0NvbXBvbmVudE5hbWVDb21ib0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjRjZTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9Db21wb25lbnROYW1lQ29tYm9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlld2Vycy53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8vIEEgY29udmVuaWVuY2UgY2xhc3MKLS8vCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyCi17ICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgQ0NvbWJvIGNvbXBvbmVudE5hbWVDb21ibzsKLQotICBwdWJsaWMgQ29tcG9uZW50TmFtZUNvbWJvSGVscGVyKENDb21ibyBjb21wb25lbnROYW1lQ29tYm8pCi0gIHsKLSAgICB0aGlzLmNvbXBvbmVudE5hbWVDb21ibyA9IGNvbXBvbmVudE5hbWVDb21ibzsKLSAgfSAgICAgICAKLQotICBwdWJsaWMgdm9pZCB1cGRhdGUoT2JqZWN0IGlucHV0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBFbGVtZW50IGVsZW1lbnQgPSAoKFdTRExFbGVtZW50KWlucHV0KS5nZXRFbGVtZW50KCk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0gICAgY29tcG9uZW50TmFtZUNvbWJvLnNldFRleHQodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOwotCi0gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKChXU0RMRWxlbWVudClpbnB1dCkuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgQ29tcG9uZW50UmVmZXJlbmNlVXRpbCBjb21wb25lbnRSZWZlcmVuY2VVdGlsID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwoZGVmaW5pdGlvbik7Ci0gICAgICBqYXZhLnV0aWwuTGlzdCBsaXN0ID0gZ2V0Q29tcG9uZW50TmFtZUxpc3QoY29tcG9uZW50UmVmZXJlbmNlVXRpbCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50TmFtZUNvbWJvLmFkZCgoU3RyaW5nKWl0ZXIubmV4dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50SGVscGVyKEVsZW1lbnQgZWxlbWVudCwgRXZlbnQgZXZlbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTV1QuTW9kaWZ5KQotICAgIHsgIAotICAgICAgaWYgKGV2ZW50LndpZGdldCA9PSBjb21wb25lbnROYW1lQ29tYm8pCi0gICAgICB7Ci0gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGdldEF0dHJpYnV0ZU5hbWUoKSwgY29tcG9uZW50TmFtZUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IExpc3QgZ2V0Q29tcG9uZW50TmFtZUxpc3QoQ29tcG9uZW50UmVmZXJlbmNlVXRpbCB1dGlsKTsKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvQ29tcG9uZW50c1NlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9Db21wb25lbnRzU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzIyNWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9Db21wb25lbnRzU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLmZsYXR1aS5GbGF0UGFnZVNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5mbGF0dWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLnVpLkZsYXRWaWV3VXRpbGl0eTsKLQotcHVibGljIGNsYXNzIENvbXBvbmVudHNTZWN0aW9uIGV4dGVuZHMgRmxhdFBhZ2VTZWN0aW9uCi17Ci0gIHByb3RlY3RlZCBDQ29tYm8gbmFtZXNDb21ibzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBuZXdCdXR0b247Ci0gIHByb3RlY3RlZCBCdXR0b24gaW1wb3J0QnV0dG9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotICAgIAotICBwdWJsaWMgQ29tcG9uZW50c1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgRmxhdFZpZXdVdGlsaXR5IGZsYXRWaWV3VXRpbGl0eSwgU3RyaW5nIHRpdGxlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMocGFyZW50LCB0aXRsZSk7Ci0KLSAgICBXaWRnZXRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgV2lkZ2V0RmFjdG9yeSgpOwotICAgIGZhY3Rvcnkuc2V0Q2xpZW50QXJlYUNvbG9yKGZsYXRWaWV3VXRpbGl0eS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0KLSAgICBDb250cm9sIHNlY3Rpb24gPSBjcmVhdGVDb250cm9sKHRoaXMsIGZhY3RvcnkpOwotICAgIHNldENvbnRlbnQoc2VjdGlvbik7Ci0KLSAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBzZXRMYXlvdXREYXRhKGdyaWREYXRhKTsgICAgICAgIAotICB9Ci0KLQotICBwdWJsaWMgQ29tcG9uZW50c1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgICBzZXRDb2xsYXBzYWJsZSh0cnVlKTsKLSAgICBzZXRIZWFkZXJUZXh0KHRpdGxlKTsKLSAgICBzZXRBZGRTZXBhcmF0b3IodHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gICAgICAgICAKLQotICBwdWJsaWMgQ0NvbWJvIGdldE5hbWVzQ29tYm8oKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzQ29tYm87Ci0gIH0KLSAgCi0gIHB1YmxpYyBCdXR0b24gZ2V0TmV3TWVzc2FnZUJ1dHRvbigpCi0gIHsKLSAgICAgcmV0dXJuIG5ld0J1dHRvbjsKLSAgfQotCi0gIHB1YmxpYyBCdXR0b24gZ2V0SW1wb3J0TWVzc2FnZUJ1dHRvbigpCi0gIHsKLSAgICAgcmV0dXJuIGltcG9ydEJ1dHRvbjsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgRmxhdFBhZ2VTZWN0aW9uI2NyZWF0ZUNsaWVudChDb21wb3NpdGUsIFdpZGdldEZhY3RvcnkpCi0gICAqLwotICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNsaWVudChDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IGZhY3RvcnkpCi0gIHsKLSAgICBGbGF0Vmlld1V0aWxpdHkgZmxhdFZpZXdVdGlsaXR5ID0gbmV3IEZsYXRWaWV3VXRpbGl0eSh0cnVlKTsKLQotICAgIENvbXBvc2l0ZSBjbGllbnQgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLSAgICBuYW1lc0NvbWJvID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNDb21ib0JveChjbGllbnQpOwotICAgICAgICAgICAgICAgICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IGZsYXRWaWV3VXRpbGl0eS5jcmVhdGVDb21wb3NpdGUoY2xpZW50LCAzLCB0cnVlKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dClidXR0b25Db21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDM7Ci0gICAgZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSAzOwotICAgIGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICAKLSAgICBMYWJlbCBmaWxsZXIgPSBmbGF0Vmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGxlcihidXR0b25Db21wb3NpdGUsIDEpOwotICAgIEdyaWREYXRhIGdkID0gKEdyaWREYXRhKWZpbGxlci5nZXRMYXlvdXREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgbmV3QnV0dG9uID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9CVVRUT05fTkVXIikpOyAvLyROT04tTkxTLTEkCi0gICAgaW1wb3J0QnV0dG9uID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZVB1c2hCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9CVVRUT05fSU1QT1JUIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICByZXR1cm4gY2xpZW50OwotICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9FeHRlbnNpYmxlUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9FeHRlbnNpYmxlUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlOWRjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0czsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLklQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEV4dGVuc2libGVQcm9wZXJ0eVNvdXJjZSBleHRlbmRzIFhNTFByb3BlcnR5U291cmNlQWRhcHRlcgotewotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCXByaXZhdGUgSU5vZGVOb3RpZmllciBub2RlTm90aWZpZXI7Ci0JCQkKLQlwdWJsaWMgRXh0ZW5zaWJsZVByb3BlcnR5U291cmNlKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQsIElOb2RlTm90aWZpZXIgdGFyZ2V0KSAKLQl7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXRoaXMuZWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0JCXRoaXMubm9kZU5vdGlmaWVyID0gdGFyZ2V0OwotICAJfQotICAJCi0gIAkKLSAgCSAgICAKLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgCi0JewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7CQkKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpYXR0ckRlY2wuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLQkJewotCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgIAotCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotCQkJewotCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3JQcm92aWRlciBwcm92aWRlciA9IChJUHJvcGVydHlEZXNjcmlwdG9yUHJvdmlkZXIpV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByb3BlcnR5RGVzY3JpcHRvclByb3ZpZGVyUmVnaXN0cnkoKS5nZXQobmFtZXNwYWNlVVJJKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJICByZXN1bHQgPSBwcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IoZWRpdG9yUGFydCwgKEVsZW1lbnQpIG5vZGVOb3RpZmllciwgbmFtZXNwYWNlVVJJLCBhdHRyRGVjbC5nZXROb2RlTmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQl7Ci0JCSAgcmVzdWx0ID0gc3VwZXIuY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwkJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9JbnZva2VEaWFsb2dCdXR0b24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3ZpZXdlcnMvd2lkZ2V0cy9JbnZva2VEaWFsb2dCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIxOTA2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvSW52b2tlRGlhbG9nQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnZpZXdlcnMud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5kaWFsb2dzLkludm9rZVNldERpYWxvZzsKLQotLy8gaW5zdGVhZCBvZiB1c2luZyBhIEJ1dHRvbiBkaXJlY3RseSAod2hpY2ggY2F1c2VzIHNpemluZy9sYXlvdXQgcHJvYmxlbXMpCi0vLyB3ZSB1c2UgdGhpcyBjbGFzcwotcHVibGljIGNsYXNzIEludm9rZURpYWxvZ0J1dHRvbiBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi17IAotICBwcm90ZWN0ZWQgQnV0dG9uIGJ1dHRvbjsKLSAgcHJvdGVjdGVkIE9iamVjdCBpbnB1dDsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0gIHByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotICBwcm90ZWN0ZWQgU3RyaW5nIGtpbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEludm9rZURpYWxvZ0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBPYmplY3QgaW5wdXQpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLmlucHV0ID0gaW5wdXQ7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLSAgICBzZXRMYXlvdXREYXRhKGdkKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBzZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIGJ1dHRvbiA9IG5ldyBCdXR0b24odGhpcywgU1dULk5PTkUpOwotICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIGdkLmhlaWdodEhpbnQgPSAxNzsKLSAgICBnZC53aWR0aEhpbnQgPSAyNDsKLSAgICBidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgYnV0dG9uLnNldFRleHQoIi4uLiIpOwotICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQnV0dG9uIGdldEJ1dHRvbigpIAotICB7Ci0gICAgcmV0dXJuIGJ1dHRvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KQotICB7Ci0gICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpCi0gIHsKLSAgICB0aGlzLmVkaXRvclBhcnQgPSBlZGl0b3JQYXJ0OyAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlS2luZChTdHJpbmcga2luZCkKLSAgewotICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gYnV0dG9uKQotICAgIHsKLSAgICAgIEludm9rZVNldERpYWxvZyBkaWFsb2cgPSBuZXcgSW52b2tlU2V0RGlhbG9nKCk7Ci0gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQYXJ0KQotICAgICAgewotICAgICAgICBkaWFsb2cuc2V0UmVmZXJlbmNlS2luZChraW5kKTsKLSAgICAgIH0KLSAgICAgIGRpYWxvZy5ydW4oaW5wdXQsIGVkaXRvclBhcnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7Ci0gICAgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlld2Vycy93aWRnZXRzL1JlYWRPbmx5UHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0OGM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aWV3ZXJzL3dpZGdldHMvUmVhZE9ubHlQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLXB1YmxpYyBjbGFzcyBSZWFkT25seVByb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlCi17Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLQotICAgIHB1YmxpYyBSZWFkT25seVByb3BlcnR5U291cmNlKElFZGl0b3JQYXJ0IGVkaXRQYXJ0LCBFbGVtZW50IGVsZW1lbnQpCi0gICAgewotICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKQotICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBOYW1lZE5vZGVNYXAgbWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGludCBtYXBMZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBtYXAuaXRlbShpKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgSVByb3BlcnR5RGVzY3JpcHRvcltdIHJlc3VsdCA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLSAgICAgICAgbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkKLSAgICB7Ci0gICAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoaWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKChTdHJpbmcpIGlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCwgT2JqZWN0IHZhbHVlKQotICAgIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL0Jhc2VSZW5hbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL0Jhc2VSZW5hbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmQ5NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CYXNlUmVuYW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZW5hbWVyIGV4dGVuZHMgV1NETFZpc2l0b3IKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuZXdOYW1lOwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgZ2xvYmFsQ29tcG9uZW50OwotICAKLSAgcHVibGljIEJhc2VSZW5hbWVyKFdTRExFbGVtZW50IGdsb2JhbENvbXBvbmVudCwgU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBzdXBlcihnbG9iYWxDb21wb25lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICB0aGlzLmdsb2JhbENvbXBvbmVudCA9IGdsb2JhbENvbXBvbmVudDsKLSAgICB0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldE5ld1FOYW1lKCkKLSAgewotICAgIFN0cmluZyBxTmFtZSA9IG51bGw7Ci0gICAgaWYgKG5ld05hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnbG9iYWxDb21wb25lbnQuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgcU5hbWUgPSBkZWZpbml0aW9uLmdldFByZWZpeChkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgIHFOYW1lICs9ICI6IiArIG5ld05hbWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBxTmFtZSA9IG5ld05hbWU7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBxTmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CaW5kaW5nUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9CaW5kaW5nUmVuYW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVjZjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3Zpc2l0b3IvQmluZGluZ1JlbmFtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nUmVuYW1lciBleHRlbmRzIEJhc2VSZW5hbWVyCi17Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQmluZGluZ1JlbmFtZXIuCi0gICAqIEBwYXJhbSBnbG9iYWxDb21wb25lbnQKLSAgICogQHBhcmFtIG5ld05hbWUKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nUmVuYW1lcihXU0RMRWxlbWVudCBnbG9iYWxDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgc3VwZXIoZ2xvYmFsQ29tcG9uZW50LCBuZXdOYW1lKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIHN1cGVyLnZpc2l0UG9ydChwb3J0KTsKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEVCaW5kaW5nKCk7Ci0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMoYmluZGluZykpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KHBvcnQpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImJpbmRpbmciLCBnZXROZXdRTmFtZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL01lc3NhZ2VSZW5hbWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL01lc3NhZ2VSZW5hbWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMGQyMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9NZXNzYWdlUmVuYW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5XU0RMRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVJlbmFtZXIgZXh0ZW5kcyBCYXNlUmVuYW1lcgotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIE1lc3NhZ2VSZW5hbWVyLgotICAgKiBAcGFyYW0gZ2xvYmFsQ29tcG9uZW50Ci0gICAqIEBwYXJhbSBuZXdOYW1lCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVJlbmFtZXIoV1NETEVsZW1lbnQgZ2xvYmFsQ29tcG9uZW50LCBTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIHN1cGVyKGdsb2JhbENvbXBvbmVudCwgbmV3TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KQotICB7Ci0gICAgc3VwZXIudmlzaXRJbnB1dChpbnB1dCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gaW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBpZiAoZ2xvYmFsQ29tcG9uZW50LmVxdWFscyhtZXNzYWdlKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRGb3JPYmplY3QoaW5wdXQpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiLCBnZXROZXdRTmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgc3VwZXIudmlzaXRPdXRwdXQob3V0cHV0KTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBpZiAoZ2xvYmFsQ29tcG9uZW50LmVxdWFscyhvdXRwdXQpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChvdXRwdXQpOwotICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiLCBnZXROZXdRTmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KQotICB7Ci0gICAgc3VwZXIudmlzaXRGYXVsdChmYXVsdCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gZmF1bHQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBpZiAoZ2xvYmFsQ29tcG9uZW50LmVxdWFscyhmYXVsdCkpCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gV1NETEVkaXRvclV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRFbGVtZW50Rm9yT2JqZWN0KGZhdWx0KTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgZ2V0TmV3UU5hbWUoKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL1BvcnRUeXBlUmVuYW1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9Qb3J0VHlwZVJlbmFtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0ZDAyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL1BvcnRUeXBlUmVuYW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aXNpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBQb3J0VHlwZVJlbmFtZXIgZXh0ZW5kcyBCYXNlUmVuYW1lcgotewotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFBvcnRUeXBlUmVuYW1lci4KLSAgICogQHBhcmFtIGdsb2JhbENvbXBvbmVudAotICAgKiBAcGFyYW0gbmV3TmFtZQotICAgKi8KLSAgcHVibGljIFBvcnRUeXBlUmVuYW1lcihXU0RMRWxlbWVudCBnbG9iYWxDb21wb25lbnQsIFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgc3VwZXIoZ2xvYmFsQ29tcG9uZW50LCBuZXdOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBzdXBlci52aXNpdEJpbmRpbmcoYmluZGluZyk7Ci0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotCi0gICAgaWYgKGdsb2JhbENvbXBvbmVudC5lcXVhbHMocG9ydFR5cGUpKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChiaW5kaW5nKTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgZ2V0TmV3UU5hbWUoKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL1dTRExWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC92aXNpdG9yL1dTRExWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNmQ3OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvdmlzaXRvci9XU0RMVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudmlzaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXU0RMVmlzaXRvcgotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCi0KLSAgcHVibGljIFdTRExWaXNpdG9yKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCB2aXNpdERlZmluaXRpb24oKQotICB7Ci0gICAgdmlzaXRCaW5kaW5ncygpOwotICAgIHZpc2l0TWVzc2FnZXMoKTsKLSAgICB2aXNpdFBvcnRUeXBlcygpOwotICAgIHZpc2l0U2VydmljZXMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QmluZGluZ3MoKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0TWVzc2FnZXMoKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlZmluaXRpb24uZ2V0RU1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRNZXNzYWdlKG1lc3NhZ2UpOyAKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UG9ydFR5cGVzKCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2VydmljZXMoKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRTZXJ2aWNlKHNlcnZpY2UpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgfQotCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOyAKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRPcGVyYXRpb24ob3BlcmF0aW9uKTsgCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKTsKLSAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nT3V0cHV0KCk7ICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUlucHV0KCk7Ci0gICAgT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0gICAgCi0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgdmlzaXRJbnB1dChpbnB1dCk7Ci0gICAgfQotICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdE91dHB1dChvdXRwdXQpOwotICAgIH0KLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAoZmF1bHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRGYXVsdChmYXVsdCk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IHBhcnQuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0TWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWVzc2FnZS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBQYXJ0IHBhcnQgPSAoUGFydClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdFBhcnQocGFydCk7Ci0gICAgfQotICB9ICAKLQotICBwdWJsaWMgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KQotICB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gaW5wdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0TWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gb3V0cHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGZhdWx0LmdldEVNZXNzYWdlKCk7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB2aXNpdE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNlcnZpY2UuZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRQb3J0KHBvcnQpOwotICAgIH0KLSAgICAKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdDb21wb25lbnREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1OTViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL05ld0NvbXBvbmVudERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmV3Q29tcG9uZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIKLXsKLSAgcHJvdGVjdGVkIFRleHQgbmFtZUZpZWxkOyAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0gIHByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLSAgcHJvdGVjdGVkIExpc3QgdXNlZE5hbWVzOwotCi0gIHB1YmxpYyBOZXdDb21wb25lbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lKSAKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLSAgICBzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotICAgIG5hbWUgPSBkZWZhdWx0TmFtZTsgICAgICAKLSAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBOZXdDb21wb25lbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lLCBMaXN0IHVzZWROYW1lcykgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLSAgICBuYW1lID0gZGVmYXVsdE5hbWU7ICAgICAgCi0gICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgIHRoaXMudXNlZE5hbWVzID0gdXNlZE5hbWVzOwotICB9Ci0KLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICAgIGNyZWF0ZSgpOwotICAgIGdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgcmV0dXJuIG9wZW4oKTsKLSAgfQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpICAKLSAgewotICAgIENvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgbmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLSAgICBuYW1lRmllbGQuc2VsZWN0QWxsKCk7ICAKLSAgICB1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIG9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0gICAgY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZENvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICB9ICAKLQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBnZEZpbGw9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkRmlsbC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkRmlsbC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGdkRmlsbC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ2RGaWxsKTsKLQotICAgIExhYmVsIG5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBuYW1lTGFiZWwuc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9OQU1FIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICBuYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBnZD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGdkLndpZHRoSGludCA9IDIwMDsKLSAgICBuYW1lRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgbmFtZUZpZWxkLnNldFRleHQobmFtZSk7Ci0gICAgbmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0gICAgY3JlYXRlRXh0ZW5kZWRDb250ZW50KGRpYWxvZ0FyZWEpOwotCi0gICAgLy8gZXJyb3IgbWVzc2FnZQotICAgIGVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLSAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KCJlcnJvciBtZXNzYWdlIGdvZXMgaGVyZSIpOyAgICAgICAgIAotICAgIEdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkMi5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkMi5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGdkMi53aWR0aEhpbnQgPSAyMDA7Ci0gICAgZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZDIpOyAgICAgICAgICAKLS8vICAgIENvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLS8vICAgIGVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCi0gICAgcmV0dXJuIGRpYWxvZ0FyZWE7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLSAgfSAgICAgICAgCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKFN0cmluZyBuYW1lKQotICB7Ci0gIAlpZiAodXNlZE5hbWVzID09IG51bGwpCi0gIAkJcmV0dXJuIG51bGw7Ci0gIAkKLSAgCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdXNlZE5hbWVzLml0ZXJhdG9yKCk7Ci0gIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gIAkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpKSB7Ci0gIAkJCXJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9XQVJOSU5HX0RVUExJQ0FURV9OQU1FX0VYSVNUUyIpOwotICAJCX0KLSAgCX0KLSAgCQotICAJcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2UoKQotICB7ICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZSA9IG5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGVycm9yTWVzc2FnZSA9IGNvbXB1dGVFcnJvck1lc3NhZ2UobmFtZSk7Ci0gICAgfSAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvck1lc3NhZ2UgPSAiIjsKLSAgICB9ICAKLSAgICBlcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KGVycm9yTWVzc2FnZSAhPSBudWxsID8gZXJyb3JNZXNzYWdlIDogIiIpOwotLy8gICAgb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIAotICB7Ci0gICAgaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpCi0gICAgewotICAgICAgbmFtZSA9IG5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0gICAgfQotICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpZGdldHMvTmV3Q29tcG9uZW50V2l0aENoaWxkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL05ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzUwOTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpZGdldHMvTmV3Q29tcG9uZW50V2l0aENoaWxkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgZXh0ZW5kcyBOZXdDb21wb25lbnREaWFsb2cgdG8gYWxsb3cgYWRkaXRpb25hbCB3aWRnZXRzLiAgTW9yZQotICogc3BlY2lmaWNhbGx5LCB0aGUgJ2NyZWF0ZSBzdWItY29tcG9uZW50cycgY2hlY2tib3gKLSAqLwotcHVibGljIGNsYXNzIE5ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZyBleHRlbmRzIE5ld0NvbXBvbmVudERpYWxvZyB7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVNZXNzYWdlQ2hlY2tCb3g7Ci0JcHJpdmF0ZSBib29sZWFuIGNyZWF0ZU1lc3NhZ2VCb29sZWFuOwotCi0JcHVibGljIE5ld0NvbXBvbmVudFdpdGhDaGlsZERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVmYXVsdE5hbWUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIHRpdGxlLCBkZWZhdWx0TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBOZXdDb21wb25lbnRXaXRoQ2hpbGREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlZmF1bHROYW1lLCBMaXN0IHVzZWROYW1lcykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgdGl0bGUsIGRlZmF1bHROYW1lLCB1c2VkTmFtZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZENvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2hpbGQgPSBuZXcgQ29tcG9zaXRlIChwYXJlbnQsIFNXVC5OT05FKTsKLQkgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCSAgICBjaGlsZC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JICAgIGNyZWF0ZU1lc3NhZ2VDaGVja0JveCA9IG5ldyBCdXR0b24oY2hpbGQsIFNXVC5DSEVDSyk7Ci0JICAgIGNyZWF0ZU1lc3NhZ2VDaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JICAgIGNyZWF0ZU1lc3NhZ2VDaGVja0JveC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0NSRUFURV9NRVNTQUdFX0NIRUNLQk9YX0xBQkVMIikpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZVN1YkNvbXBvbmVudHMoKSB7Ci0JCXJldHVybiBjcmVhdGVNZXNzYWdlQm9vbGVhbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWNyZWF0ZU1lc3NhZ2VCb29sZWFuID0gY3JlYXRlTWVzc2FnZUNoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpZGdldHMvUHJvdG9jb2xDb21wb25lbnRDb250cm9sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3RvY29sQ29tcG9uZW50Q29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODJiMDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpZGdldHMvUHJvdG9jb2xDb21wb25lbnRDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CYXNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5Db250ZW50R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5leHRlbnNpb24uQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvdG9jb2xDb21wb25lbnRDb250cm9sIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBCYXNlR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICBwcm90ZWN0ZWQgVGV4dCBjb21wb25lbnROYW1lRmllbGQ7Ci0gIHByb3RlY3RlZCBDb21ibyByZWZOYW1lQ29tYm87Ci0gIHByb3RlY3RlZCBCdXR0b24gcmVmQnJvd3NlQnV0dG9uOwotICBwcm90ZWN0ZWQgQ29tYm8gcHJvdG9jb2xDb21ibzsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBvdmVyd3JpdGVCdXR0b247Ci0gIHByb3RlY3RlZCBQYWdlQm9vayBwYWdlQm9vazsKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBlbXB0eVNldHRpbmdzUGFnZTsKLSAgcHJvdGVjdGVkIE1hcCBwYWdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAvLyBMaXN0IG9mIENvbnRlbnRHZW5lcmF0b3JzIGZvciBlYWNoIFByb3RvY29sIGZvdW5kIGluIHByb3RvY29sQ29tYm8KLSAgcHJvdGVjdGVkIExpc3QgY29udGVudEdlbmVyYXRvcnM7Ci0gIAotICAvL3Byb3RlY3RlZCBib29sZWFuIGlzQmluZGluZ0NvbXBvbmVudCA9IHRydWU7Ci0gIC8vcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXdDb21wb25lbnQgPSB0cnVlOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVmTmFtZTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIFVOU1BFQ0lGSUVEID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVU5TUEVDSUZJRUQiKTsKLSAgLy9wcm90ZWN0ZWQgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yOwotCi0gIHB1YmxpYyBQcm90b2NvbENvbXBvbmVudENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgQmFzZUdlbmVyYXRvciBnZW5lcmF0b3IsIGJvb2xlYW4gc2hvd092ZXJ3cml0ZUJ1dHRvbikKLSAgewotICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCWNvbnRlbnRHZW5lcmF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0gICAgc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgc2V0TGF5b3V0RGF0YShjcmVhdGVHcmlkRGF0YSh0cnVlLCAxKSk7Ci0KLSAgICBDb21wb3NpdGUgbGFiZWxWYWx1ZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotICAgIGxhYmVsVmFsdWVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0gICAgbGFiZWxWYWx1ZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKGZhbHNlLCAxKSk7Ci0KLSAgICAvLyByb3cgMQotICAgIC8vCi0gICAgTGFiZWwgY29tcG9uZW50TmFtZUxhYmVsID0gbmV3IExhYmVsKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBjb21wb25lbnROYW1lTGFiZWwuc2V0VGV4dChnZXRDb21wb25lbnROYW1lTGFiZWxUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICBjb21wb25lbnROYW1lRmllbGQgPSBuZXcgVGV4dChsYWJlbFZhbHVlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLSAgICBHcmlkRGF0YSBnZE5hbWU9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkTmFtZS5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkTmFtZS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGNvbXBvbmVudE5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkTmFtZSk7Ci0gICAgY29tcG9uZW50TmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotICAgIC8vY3JlYXRlUGxhY2VIb2xkZXIobGFiZWxWYWx1ZUNvbXBvc2l0ZSk7Ci0KLSAgICAvLyByb3cgMgotICAgIC8vCi0gICAgTGFiZWwgcmVmTmFtZUxhYmVsID0gbmV3IExhYmVsKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICByZWZOYW1lTGFiZWwuc2V0VGV4dChnZXRSZWZOYW1lTGFiZWxUZXh0KCkpOyAvLyROT04tTkxTLTEkCQotICAgIHJlZk5hbWVDb21ibyA9IG5ldyBDb21ibyhsYWJlbFZhbHVlQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLSAgICBHcmlkRGF0YSBnZFJlZk5hbWU9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkUmVmTmFtZS5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkUmVmTmFtZS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIHJlZk5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdkUmVmTmFtZSk7Ci0gICAgcmVmTmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0gICAgLy9yZWZCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAvL3JlZkJyb3dzZUJ1dHRvbi5zZXRUZXh0KCIgIC4uLiAgIik7Ci0gICAgLy9HcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIC8vZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotICAgIC8vZ2QuaGVpZ2h0SGludCA9IDE3OwotICAgIC8vZ2Qud2lkdGhIaW50ID0gMjQ7Ci0gICAgLy9yZWZCcm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgLy9yZWZCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgLy9jcmVhdGVQbGFjZUhvbGRlcihsYWJlbFZhbHVlQ29tcG9zaXRlKTsKLQotICAgIC8vIHJvdyAzCi0gICAgLy8KLSAgICBMYWJlbCBwcm90b2NvbExhYmVsID0gbmV3IExhYmVsKGxhYmVsVmFsdWVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBwcm90b2NvbExhYmVsLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElOR19QUk9UT0NPTCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHByb3RvY29sQ29tYm8gPSBuZXcgQ29tYm8obGFiZWxWYWx1ZUNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0gICAgR3JpZERhdGEgZ2RQcm90b2NvbD0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2RQcm90b2NvbC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkUHJvdG9jb2wuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLSAgICBwcm90b2NvbENvbWJvLnNldExheW91dERhdGEoZ2RQcm90b2NvbCk7Ci0gICAgcHJvdG9jb2xDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLSAgICAvL2NyZWF0ZVBsYWNlSG9sZGVyKGxhYmVsVmFsdWVDb21wb3NpdGUpOwotCi0gICAgLy8gb3B0aW9uYWwgb3ZlcndyaXRlIGJ1dHRvbgotICAgIC8vCi0gICAgaWYgKHNob3dPdmVyd3JpdGVCdXR0b24pCi0gICAgewotICAgICAgb3ZlcndyaXRlQnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotICAgICAgb3ZlcndyaXRlQnV0dG9uLnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQ0hFQ0tCT1hfT1ZFUldSSVRFIikpOyAvLyROT04tTkxTLTEkCi0gICAgICBvdmVyd3JpdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLy8gcHJvdG9jb2wgc3BlY2lmaWMgc2V0dGluZ3MKLSAgICAvLwotICAgIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMsIFNXVC5OT05FKTsKLSAgICBHcmlkRGF0YSBnZEZpbGw9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkRmlsbC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGdkRmlsbC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGdkRmlsbC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBnZEZpbGwuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgcGFnZUJvb2suc2V0TGF5b3V0RGF0YShnZEZpbGwpOwotCi0gICAgZW1wdHlTZXR0aW5nc1BhZ2UgPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgewotICAgICAgTGFiZWwgcGxhY2VIb2xkZXIgPSBuZXcgTGFiZWwoZW1wdHlTZXR0aW5nc1BhZ2UsIFNXVC5OT05FKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBpbml0RmllbGRzKCkKLSAgewotICAgIC8vIHByaW1lIHRoZSBmaWVsZHMKLSAgICAvLwotICAgIGNvbXBvbmVudE5hbWVGaWVsZC5zZXRUZXh0KGdldERlZmF1bHROYW1lKCkpOwotICAgIHVwZGF0ZVJlZk5hbWVDb21ibygpOwotICAgIHVwZGF0ZVByb3RvY29sQ29tYm8oKTsKLSAgICB1cGRhdGVQYWdlQm9vayhnZW5lcmF0b3IuZ2V0UHJvdG9jb2woKSk7Ci0gIH0KLQotICBwdWJsaWMgVGV4dCBnZXRDb21wb25lbnROYW1lRmllbGQoKQotICB7Ci0gICAgcmV0dXJuIGNvbXBvbmVudE5hbWVGaWVsZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZUxhYmVsVGV4dCgpCi0gIHsKLSAgICByZXR1cm4gIk5hbWUiOwotICB9Ci0KLSAgcHJpdmF0ZSBHcmlkRGF0YSBjcmVhdGVHcmlkRGF0YShib29sZWFuIGJvdGgsIGludCBzcGFuKQotICB7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoYm90aCA/IEdyaWREYXRhLkZJTExfQk9USCA6IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotICAgIHJldHVybiBnZDsKLSAgfQotCi0gIHByaXZhdGUgQ29udHJvbCBjcmVhdGVQbGFjZUhvbGRlcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgcmV0dXJuIGxhYmVsOwotICB9Ci0gIHB1YmxpYyBCYXNlR2VuZXJhdG9yIGdldEdlbmVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gZ2VuZXJhdG9yOwotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICAvLwotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KQotICB7Ci0gICAgaWYgKGV2ZW50LndpZGdldCA9PSBvdmVyd3JpdGVCdXR0b24gJiYgb3ZlcndyaXRlQnV0dG9uICE9IG51bGwpCi0gICAgewotICAgICAgZ2V0R2VuZXJhdG9yKCkuc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSByZWZOYW1lQ29tYm8pCi0gICAgewotICAgICAgaW50IGluZGV4ID0gcmVmTmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBTdHJpbmcgcmVmTmFtZSA9IHJlZk5hbWVDb21iby5nZXRJdGVtKGluZGV4KTsKLQkgIGlmIChyZWZOYW1lLmVxdWFscyhVTlNQRUNJRklFRCkpIHsKLQkgICAgICBnZXRHZW5lcmF0b3IoKS5zZXRSZWZOYW1lKCIiKTsKLQkgIH0KLQkgIGVsc2UgewotCSAgICAgIGdldEdlbmVyYXRvcigpLnNldFJlZk5hbWUocmVmTmFtZSk7Ci0JICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBwcm90b2NvbENvbWJvKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHByb3RvY29sQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgIFN0cmluZyBwcm90b2NvbCA9IChpbmRleCAhPSAtMSkgPyBwcm90b2NvbENvbWJvLmdldEl0ZW0oaW5kZXgpIDogbnVsbDsKLQkgIGdldEdlbmVyYXRvcigpLnNldENvbnRlbnRHZW5lcmF0b3IoKENvbnRlbnRHZW5lcmF0b3IpIGNvbnRlbnRHZW5lcmF0b3JzLmdldChpbmRleCkpOwotICAgICAgdXBkYXRlUGFnZUJvb2socHJvdG9jb2wpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU19PVkVSV1JJVEVfQVBQTElDQUJMRSA9ICJJU19PVkVSV1JJVEVfQVBQTElDQUJMRSI7Ci0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhZ2VCb29rKFN0cmluZyBwcm90b2NvbCkKLSAgewotICAgIGlmIChwcm90b2NvbCAhPSBudWxsKQotICAgIHsKLQkgIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSBwYWdlID0gKENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSkgcGFnZU1hcC5nZXQocHJvdG9jb2wpOwotICAgICAgaWYgKHBhZ2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFnZSA9IGNyZWF0ZUNvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZShwcm90b2NvbCk7Ci0KLSAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhZ2UuaW5pdChnZXRHZW5lcmF0b3IoKSk7Ci0gICAgICAgICAgQ29udHJvbCBjb250cm9sID0gcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VCb29rKTsKLSAgICAgICAgICBjb250cm9sLnNldERhdGEoSVNfT1ZFUldSSVRFX0FQUExJQ0FCTEUsIG5ldyBCb29sZWFuKHBhZ2UuaXNPdmVyd3JpdGVBcHBsaWNhYmxlKCkpKTsKLSAgICAgICAgICBwYWdlTWFwLnB1dChwcm90b2NvbCwgcGFnZSk7Ci0gICAgICAgIH0KLQotLy8gICAgICAgIGlmIChwYWdlICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcGFnZU1hcC5wdXQocHJvdG9jb2wsIHBhZ2UpOwotLy8gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgYm9vbGVhbiBlbmFibGVPdmVyd3JpdGVCdXR0b24gPSB0cnVlOwotICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKG92ZXJ3cml0ZUJ1dHRvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQm9vbGVhbiBkYXRhID0gKEJvb2xlYW4pIHBhZ2UuZ2V0Q29udHJvbCgpLmdldERhdGEoSVNfT1ZFUldSSVRFX0FQUExJQ0FCTEUpOwotICAgICAgICAgIGVuYWJsZU92ZXJ3cml0ZUJ1dHRvbiA9IGRhdGEgPT0gbnVsbCB8fCBkYXRhLmVxdWFscyhCb29sZWFuLlRSVUUpOwotICAgICAgICB9Ci0gICAgICAgIHBhZ2VCb29rLnNob3dQYWdlKHBhZ2UuZ2V0Q29udHJvbCgpKTsKLSAgICAgICAgcGFnZUJvb2subGF5b3V0KCk7Ci0gICAgICAgIHBhZ2VCb29rLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkKLQkJcGFnZS5zZXRPcHRpb25zT25HZW5lcmF0b3IoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2UoZW1wdHlTZXR0aW5nc1BhZ2UpOwotICAgICAgfQotCi0gICAgICBpZiAob3ZlcndyaXRlQnV0dG9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChlbmFibGVPdmVyd3JpdGVCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICBvdmVyd3JpdGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICBvdmVyd3JpdGVCdXR0b24uc2V0U2VsZWN0aW9uKGdlbmVyYXRvci5nZXRPdmVyd3JpdGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb3ZlcndyaXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm90b2NvbENvbWJvKCkKLSAgewotICAgIHByb3RvY29sQ29tYm8ucmVtb3ZlQWxsKCk7Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoVU5TUEVDSUZJRUQpOwotLy8gICAgbGlzdC5hZGRBbGwoV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeSgpLmdldEJpbmRpbmdFeHRlbnNpb25OYW1lcygpKTsKLQlsaXN0LmFkZEFsbChDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0QmluZGluZ0V4dGVuc2lvbk5hbWVzKCkpOwotCQotICAgIFN0cmluZyBwcm90b2NvbFRleHQgPSBnZW5lcmF0b3IuZ2V0UHJvdG9jb2woKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFN0cmluZyBwcm90b2NvbCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgcHJvdG9jb2xDb21iby5hZGQocHJvdG9jb2wpOwotCSAgCi0JICBpZiAocHJvdG9jb2wuZXF1YWxzKFVOU1BFQ0lGSUVEKSkgewotCQkgIGNvbnRlbnRHZW5lcmF0b3JzLmFkZChudWxsKTsKLQkgIH0KLQkgIGVsc2UgewotCQkgIENvbnRlbnRHZW5lcmF0b3IgZ2VuID0gQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEdlbmVyYXRvckNsYXNzRnJvbU5hbWUocHJvdG9jb2wpOwotCQkgIGNvbnRlbnRHZW5lcmF0b3JzLmFkZChnZW4pOyAgCi0JICB9Ci0gICAgfQotCi0gICAgaWYgKHByb3RvY29sVGV4dCA9PSBudWxsICYmIHByb3RvY29sQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgIHsKLSAgICAgIHByb3RvY29sVGV4dCA9IHByb3RvY29sQ29tYm8uZ2V0SXRlbSgwKTsKLS8vICAgICAgZ2VuZXJhdG9yLnNldFByb3RvY29sKCFVTlNQRUNJRklFRC5lcXVhbHMocHJvdG9jb2xUZXh0KSA/IHByb3RvY29sVGV4dCA6IG51bGwpOwotICAgIH0KLSAgICBwcm90b2NvbENvbWJvLnNldFRleHQocHJvdG9jb2xUZXh0KTsKLQotCUNvbnRlbnRHZW5lcmF0b3IgZ2VuID0gQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEdlbmVyYXRvckNsYXNzRnJvbU5hbWUocHJvdG9jb2xUZXh0KTsKLQlnZW5lcmF0b3Iuc2V0Q29udGVudEdlbmVyYXRvcihnZW4pOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVmTmFtZUNvbWJvKCkKLSAgewotICAgIHJlZk5hbWVDb21iby5yZW1vdmVBbGwoKTsKLQotICAgIHJlZk5hbWVDb21iby5hZGQoVU5TUEVDSUZJRUQpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldFJlZk5hbWVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHJlZk5hbWVDb21iby5hZGQoKFN0cmluZykgaS5uZXh0KCkpOwotICAgIH0KLQotICAgIGlmIChyZWZOYW1lQ29tYm8uZ2V0SXRlbUNvdW50KCkgPiAwKQotICAgIHsKLSAgICAgIFN0cmluZyByZWZUZXh0ID0gZ2VuZXJhdG9yLmdldFJlZk5hbWUoKTsKLSAgICAgIHJlZk5hbWVDb21iby5zZXRUZXh0KHJlZlRleHQgIT0gbnVsbCA/IHJlZlRleHQgOiBVTlNQRUNJRklFRCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKQotICB7Ci0gICAgZ2VuZXJhdG9yLnNldE5hbWUoY29tcG9uZW50TmFtZUZpZWxkLmdldFRleHQoKSk7Ci0gIH0KLQotICBwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRSZWZOYW1lcygpOwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFJlZk5hbWVMYWJlbFRleHQoKTsKLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0TmFtZSgpOwotICBwdWJsaWMgYWJzdHJhY3QgQ29udGVudEdlbmVyYXRvck9wdGlvbnNQYWdlIGNyZWF0ZUNvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZShTdHJpbmcgcHJvdG9jb2wpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9CaW5kaW5nV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL0JpbmRpbmdXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhZjYyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL0JpbmRpbmdXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CaW5kaW5nR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5Db250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5IdHRwQmluZGluZ09wdGlvbnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmNvbnRlbnRnZW5lcmF0b3IudWkuU29hcEJpbmRpbmdPcHRpb25zUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwudXRpbC5OYW1lVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aWRnZXRzLlByb3RvY29sQ29tcG9uZW50Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQmluZGluZ1dpemFyZCBleHRlbmRzIFdpemFyZAotewotICBwcm90ZWN0ZWQgQmluZGluZ0dlbmVyYXRvciBiaW5kaW5nR2VuZXJhdG9yOwotICBwcm90ZWN0ZWQgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlIHNwZWNpZnlCaW5kaW5nUGFnZTsKLQotICBwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBpbnQga2luZDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX05FV19CSU5ESU5HID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcgPSAyOwotCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIAotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHdoZW4gYXJlIGNyZWF0aW5nIGEgYnJhbmQgbmV3IEJpbmRpbmcKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nV2l6YXJkKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHRoaXMoZGVmaW5pdGlvbiwgbnVsbCwgS0lORF9ORVdfQklORElORyk7Ci0gIH0KLQotICAvKgotICAgKiBDb25zdHJ1Y3RvciB1c2VkIHdoZW4gYXJlIGNyZWF0aW5nIGEgYnJhbmQgbmV3IEJpbmRpbmcKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nV2l6YXJkKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsKLSAgICB0aGlzKGRlZmluaXRpb24sIG51bGwsIEtJTkRfTkVXX0JJTkRJTkcpOwotICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgfQotICAKLSAgLyoKLSAgICogQ29uc3RydWN0b3IgdXNlZCB3aGVuIHRoZXJlIGlzIGFuIGV4aXN0aW5nIEJpbmRpbmcgd2Ugd2lzaCB0byBtb2RpZnkvcmVnZW5lcmF0ZQotICAgKi8KLSAgcHVibGljIEJpbmRpbmdXaXphcmQoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBCaW5kaW5nIGJpbmRpbmcsIGludCBraW5kKQotICB7Ci0gICAgc3VwZXIoKTsKLQl0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICAgIHRoaXMua2luZCA9IGtpbmQ7CQotCWJpbmRpbmdHZW5lcmF0b3IgPSBuZXcgQmluZGluZ0dlbmVyYXRvcihkZWZpbml0aW9uLCBiaW5kaW5nKTsKLQotICAgIHNldFdpbmRvd1RpdGxlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0JJTkRJTkdfV0laQVJEIikpOyAvLyROT04tTkxTLTEkCi0gICAgLy9zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NETEVkaXRvclBsdWdpbi5jbGFzcywgImljb25zL05ld1hNTC5naWYiKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nTmFtZShTdHJpbmcgYmluZGluZ05hbWUpCi0gIHsKLSAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBiaW5kaW5nTmFtZSk7Ci0gICAgYmluZGluZ0dlbmVyYXRvci5zZXROYW1lKGJpbmRpbmdOYW1lKTsKLS8qCi0gCS8vIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBkZWZpbml0aW9uLmdldEJpbmRpbmcocW5hbWUpOwotCWlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotCSAgTGlzdCBlZUxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGlmIChlZUxpc3Quc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7Ci0gICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IFdTRExFZGl0b3JVdGlsLmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudEZvck9iamVjdChlZSk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Gb3JOYW1lc3BhY2UobmFtZXNwYWNlKTsKLQotICAgICAgICAgIGlmIChleHRlbnNpb24gIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiaW5kaW5nR2VuZXJhdG9yLnNldFByb3RvY29sKGV4dGVuc2lvbi5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAqLwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UG9ydFR5cGVOYW1lKFN0cmluZyBwb3J0VHlwZU5hbWUpCi0gIHsKLSAgICBiaW5kaW5nR2VuZXJhdG9yLnNldFJlZk5hbWUocG9ydFR5cGVOYW1lKTsKLSAgfQotCi0gIHB1YmxpYyBCaW5kaW5nR2VuZXJhdG9yIGdldEJpbmRpbmdHZW5lcmF0b3IoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdHZW5lcmF0b3I7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRydWUgaWYgd2l6YXJkIHNldHVwIGlzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2V0dXAoKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gIHsKLSAgICBzcGVjaWZ5QmluZGluZ1BhZ2UgPSBuZXcgQmluZGluZ1dpemFyZE9wdGlvbnNQYWdlKCk7Ci0gICAgYWRkUGFnZShzcGVjaWZ5QmluZGluZ1BhZ2UpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgCWJvb2xlYW4gcmVjb3JkaW5nU3RhcnRlZCA9IGZhbHNlOwotICAJaWYgKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpID09IG51bGwgfHwgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID09IDApKSB7Ci0gIAkJcmVjb3JkaW5nU3RhcnRlZCA9IHRydWU7Ci0gIAkJYmVnaW5SZWNvcmRpbmcoKTsKLSAgCQkKLSAgCQkvLyBDcmVhdGUgdGhlIERlZmluaXRpb25zIGVsZW1lbnQgd2l0aCBwcm9wZXIgbmFtZXNwYWNlCi0gIAkgICAgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gIAkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0gIAkgICAgaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKQotICAJICAgIHsKLSAgCSAgICAJY2hhclNldCA9ICJVVEYtOCI7Ci0gIAkgICAgfQotICAJICAgIGRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgInZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBjaGFyU2V0ICsgIlwiIikpOwotICAJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIndzZGw6ZGVmaW5pdGlvbnMiKTsgIAkJCi0gIAkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdCk7Ci0KLSAgCQkvLyBBZGQgdmFyaW91cyBuYW1lc3BhY2UgYXR0cmlidXRlcyBoZXJlLiAKLSAgCQlyb290LnNldEF0dHJpYnV0ZSgieG1sbnM6c29hcCIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIik7Ci0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnRucyIsIGdldERlZmF1bHROYW1lc3BhY2UoZGVmaW5pdGlvbikpOwotICAJCXJvb3Quc2V0QXR0cmlidXRlKCJ4bWxuczp3c2RsIiwgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIik7Ci0gIAkJcm9vdC5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzZCIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIpOwotICAJCXJvb3Quc2V0QXR0cmlidXRlKCJuYW1lIiwgZ2V0RmlsZU5hbWUoZGVmaW5pdGlvbikpOwotICAJCXJvb3Quc2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCBnZXREZWZhdWx0TmFtZXNwYWNlKGRlZmluaXRpb24pKTsKLQotICAJCWRlZmluaXRpb24uc2V0RWxlbWVudChyb290KTsJCi0gIAl9Ci0KLQkvLyBHZW5lcmF0ZS9yZS1nZW5lcmF0ZSB0aGUgQmluZGluZwotICAgIHRyeQotICAgIHsKLQkJQmluZGluZyBiaW5kaW5nID0gYmluZGluZ0dlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmcoKTsKLQkJCi0gICAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gKElTZWxlY3Rpb25Qcm92aWRlcikgZWRpdG9yUGFydC5nZXRBZGFwdGVyKElTZWxlY3Rpb25Qcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGJpbmRpbmcpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBmaW5hbGx5IHsKLSAgICAJaWYgKHJlY29yZGluZ1N0YXJ0ZWQpCi0gICAgCQllbmRSZWNvcmRpbmcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZShEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFIikpOwotICAgIGlmICghbmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpIHsKLSAgICAJbmFtZXNwYWNlID0gbmFtZXNwYWNlLmNvbmNhdCgiLyIpOwotICAgIH0KLSAgICAKLSAgICBuYW1lc3BhY2UgKz0gZ2V0RmlsZU5hbWUoZGVmaW5pdGlvbikgKyAiLyI7Ci0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRGaWxlTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgICBTdHJpbmcgZmlsZUxvY2F0aW9uID0gZGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpOwotICAJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChmaWxlTG9jYXRpb24pOwotICAJcmV0dXJuIGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZygpIHsKLSAgICBOb2RlIG5vZGUgPSBkb2N1bWVudDsKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotICAgIHsKLSAgICAgICgoSURPTU5vZGUpbm9kZSkuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0JJTkRJTkciKSk7ICAKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBlbmRSZWNvcmRpbmcoKSB7Ci0gICAgTm9kZSBub2RlID0gZG9jdW1lbnQ7IAotICAgIGlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpCi0gICAgewotICAgICAgKChJRE9NTm9kZSlub2RlKS5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsgIAotICAgIH0KLSAgfQotCi0gIGNsYXNzIEJpbmRpbmdXaXphcmRPcHRpb25zUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UKLSAgewotICAgIHByb3RlY3RlZCBQcm90b2NvbENvbXBvbmVudENvbnRyb2wgcHJvdG9jb2xDb21wb25lbnRDb250cm9sOwotCi0gICAgcHVibGljIEJpbmRpbmdXaXphcmRPcHRpb25zUGFnZSgpCi0gICAgewotICAgICAgc3VwZXIoIlNwZWNpZnlCaW5kaW5nUGFnZSIpOwotICAgICAgc2V0VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfU1BFQ0lGWV9CSU5ESU5HX0RFVEFJTFMiKSk7Ci0gICAgICBzZXREZXNjcmlwdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9TUEVDSUZZX0JJTkRJTkdfREVUQUlMU19MQUJFTCIpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQmluZGluZ0dlbmVyYXRvciBnZXRCaW5kaW5nR2VuZXJhdG9yKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKChCaW5kaW5nV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0QmluZGluZ0dlbmVyYXRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICBQcm90b2NvbENvbXBvbmVudENvbnRyb2wgcHJvdG9jb2xDb21wb25lbnRDb250cm9sID0gbmV3IEJpbmRpbmdQcm90b2NvbENvbXBvbmVudENvbnRyb2wocGFyZW50LCBiaW5kaW5nR2VuZXJhdG9yLCBmYWxzZSk7Ci0vLyAgICAgIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2wgPSBuZXcgQmluZGluZ1Byb3RvY29sQ29tcG9uZW50Q29udHJvbChwYXJlbnQsIGJpbmRpbmdHZW5lcmF0b3IsIGtpbmQgPT0gS0lORF9SRUdFTkVSQVRFX0JJTkRJTkcpOwkgIAotICAgICAgcHJvdG9jb2xDb21wb25lbnRDb250cm9sLmluaXRGaWVsZHMoKTsKLSAgICAgIHNldENvbnRyb2wocHJvdG9jb2xDb21wb25lbnRDb250cm9sKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJpbmRpbmdQcm90b2NvbENvbXBvbmVudENvbnRyb2wgZXh0ZW5kcyBQcm90b2NvbENvbXBvbmVudENvbnRyb2wKLSAgewotICAgIHB1YmxpYyBCaW5kaW5nUHJvdG9jb2xDb21wb25lbnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEJpbmRpbmdHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICAgIHsKLSAgICAgIHRoaXMocGFyZW50LCBnZW5lcmF0b3IsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmluZGluZ1Byb3RvY29sQ29tcG9uZW50Q29udHJvbChDb21wb3NpdGUgcGFyZW50LCBCaW5kaW5nR2VuZXJhdG9yIGdlbmVyYXRvciwgYm9vbGVhbiBzaG93T3ZlcndyaXRlQnV0dG9uKQotICAgIHsKLSAgICAgIHN1cGVyKHBhcmVudCwgZ2VuZXJhdG9yLCBzaG93T3ZlcndyaXRlQnV0dG9uKTsKLQotICAgICAgaWYgKGdlbmVyYXRvci5nZXROYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50TmFtZUZpZWxkLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZk5hbWVMYWJlbFRleHQoKQotICAgIHsKLSAgICAgIHJldHVybiBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QT1JUX1RZUEUiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRSZWZOYW1lcygpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRSZWZlcmVuY2VVdGlsKGdlbmVyYXRvci5nZXREZWZpbml0aW9uKCkpLmdldFBvcnRUeXBlTmFtZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgYmluZGluZ05hbWUgPSBnZW5lcmF0b3IuZ2V0TmFtZSgpOwotICAgICAgcmV0dXJuIGJpbmRpbmdOYW1lICE9IG51bGwgPyBiaW5kaW5nTmFtZSA6IE5hbWVVdGlsLmJ1aWxkVW5pcXVlQmluZGluZ05hbWUoZ2VuZXJhdG9yLmdldERlZmluaXRpb24oKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSBjcmVhdGVDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UoU3RyaW5nIHByb3RvY29sKQotICAgIHsKLSAgICAgIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSBvcHRpb25zUGFnZSA9IG51bGw7Ci0JICBTdHJpbmcgcHJvdG9jb2xTZWxlY3Rpb24gPSBwcm90b2NvbENvbWJvLmdldEl0ZW0ocHJvdG9jb2xDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkgIGlmIChwcm90b2NvbFNlbGVjdGlvbi5lcXVhbHMoIlNPQVAiKSkgewotCQkgIG9wdGlvbnNQYWdlID0gbmV3IFNvYXBCaW5kaW5nT3B0aW9uc1BhZ2UoKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHByb3RvY29sU2VsZWN0aW9uLmVxdWFscygiSFRUUCIpKSB7Ci0JCSAgb3B0aW9uc1BhZ2UgPSBuZXcgSHR0cEJpbmRpbmdPcHRpb25zUGFnZSgpOwotCSAgfQotLy8gICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uKHByb3RvY29sKTsKLS8vICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgb3B0aW9uc1BhZ2UgPSBleHRlbnNpb24uY3JlYXRlQmluZGluZ0NvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSgpOwotLy8gICAgICB9Ci0gICAgICByZXR1cm4gb3B0aW9uc1BhZ2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05hbWVzcGFjZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05hbWVzcGFjZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTQ3ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuTmF2aWdhYmxlVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdE5hbWVzcGFjZUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLlVwZGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25SZXNvdXJjZXM7Ci0gCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlVGFibGUgZXh0ZW5kcyBDb21wb3NpdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSSA9IFhNTENvbW1vblJlc291cmNlcy5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYIik7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERSA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX1NFTEVDVCIpOyAvLyROT04tTkxTLTEkCi0gICAgCi0gIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IFZlY3RvcigpOwotICBwcm90ZWN0ZWQgTGlzdCBjaGVja2VkTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJvdGVjdGVkIE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyIHRhYmxlVmlld2VyOyAgICAKLSAgcHJvdGVjdGVkIEJ1dHRvbiBhZGRCdXR0b247Ci0KLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXI7Ci0gIHByb3RlY3RlZCBVcGRhdGVMaXN0ZW5lciB1cGRhdGVMaXN0ZW5lcjsgICAKLSAgcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247ICAKLSAgcHJvdGVjdGVkIGludCB2aXNpYmxlUm93cyA9IC0xOyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGR1bW15Um93c1JlbW92ZWQgPSBmYWxzZTsKLSAgVGFibGUgdGFibGU7Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsgIAotICAgIHRoaXMocGFyZW50LCAtMSwgLTEsIC0xKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTmFtZXNwYWNlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzKQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIC0xLCAtMSwgdmlzaWJsZVJvd3MpOwotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50KQotICB7Ci0gICAgdGhpcyhwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgLTEpOwotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgdmlzaWJsZVJvd3MpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBzZXRMYXlvdXQoY3JlYXRlR3JpZExheW91dCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBHcmlkRGF0YSBmaWxsR0Q9IG5ldyBHcmlkRGF0YSgpOwotICAgIGZpbGxHRC5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotICAgIGZpbGxHRC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIGZpbGxHRC52ZXJ0aWNhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBmaWxsR0QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2U9IHRydWU7Ci0gICAgCi0gICAgc2V0TGF5b3V0RGF0YShmaWxsR0QpOyAgICAgICAgICAgICAKLSAgICAKLSAgICBHcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotICAgIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX05BTUVTUEFDRV9VUklTX1RPX0JFX0lOQ0xVREVEIikpOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsgICAKLSAgICBHcmlkRGF0YSBnZCA9IGZpbGxHRDsKLSAgICBpZiAod2lkdGhIaW50ICE9IC0xKQotICAgIHsKLSAgICAgIGdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLSAgICB9ICAgCi0gICAgaWYgKGhlaWdodEhpbnQgIT0gLTEpCi0gICAgewotICAgICAgZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0gICAgfQotICAgIG5hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXREYXRhKGdkKTsgCi0gICAgLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAobmFtZXNwYWNlSW5mb0dyb3VwLCBuZXcgQ29udHJvbENvbnRleHRDb21wdXRlcihuYW1lc3BhY2VJbmZvR3JvdXAsIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTENfTkFNRVNQQUNFX0dST1VQKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZ1tdIHRpdGxlQXJyYXkgPSB7SU5DTFVERSwgUFJFRklYLCBOQU1FU1BBQ0VfVVJJfTsKLQotICAgIHRhYmxlID0gbmV3IFRhYmxlKG5hbWVzcGFjZUluZm9Hcm91cCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICB0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgIAotICAgIHRhYmxlLnNldExheW91dERhdGEoZmlsbEdEKTsKLSAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgdGFibGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKQotICAgICAgewotICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7Ci0gICAgICAgIGlmIChpdGVtICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgICAgaWYgKG9iaiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSAoVGFibGVFbGVtZW50KW9iajsKLSAgICAgICAgICAgIFRhYmxlQ29sdW1uIGNvbCA9IHRhYmxlLmdldENvbHVtbigwKTsKLSAgICAgICAgICAgIGlmIChlLnggPCBjb2wuZ2V0V2lkdGgoKSkgLy8gaWYgdGhlIHBvaW50IGZhbGxzIHdpdGhpbiB0aGUgU2VsZWN0IGNvbHVtbiB0aGVuIHBlcmZvcm0gY2hlY2svdW5jaGVjawotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFN0YXRlID0gaG9sZGVyLmdldENoZWNrZWQoKTsKLSAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZS5lcXVhbHMoInRydWUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaG9sZGVyLnNldENoZWNrZWQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjaGVja2VkTGlzdC5zZXQoaG9sZGVyLmdldEluZGV4KCksICJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U3RhdGUuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgidHJ1ZSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGNoZWNrZWRMaXN0LnNldChob2xkZXIuZ2V0SW5kZXgoKSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIHRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICB0YWJsZVZpZXdlciA9IG5ldyBOYW1lc3BhY2VOYXZpZ2FibGVUYWJsZVZpZXdlcih0YWJsZSk7Ci0gICAgcHJvdmlkZXIgPSBuZXcgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcigpOwotICAgIHRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7ICAgCi0gICAgdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0gICAgdGFibGVWaWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyh0aXRsZUFycmF5KTsKLSAgICB0YWJsZVZpZXdlci5zZXRDZWxsTW9kaWZpZXIobmV3IE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50W10gd2lkdGhBcnJheSA9IHsxMCwgMjAsIDUwfTsKLSAgICBUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsgIAotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aXRsZUFycmF5Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0gICAgICBjb2x1bW4uc2V0VGV4dCh0aXRsZUFycmF5W2ldKTsKLSAgICAgIGNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotICAgICAgbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEod2lkdGhBcnJheVtpXSwgdHJ1ZSkpOwotICAgIH0gICAgICAgICAKLSAgICB0aGlzLnZpc2libGVSb3dzID0gdmlzaWJsZVJvd3M7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aXNpYmxlUm93czsgaSsrKQotICAgIHsKLSAgICAgIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOyAKLSAgICAgIGl0ZW0uc2V0VGV4dCgiIyMjIyMjIyIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIHRhYmxlLnNldExheW91dChsYXlvdXQpOyAgCi0gICAgCi0gICAgQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbdGl0bGVBcnJheS5sZW5ndGhdOwotICAgIGNlbGxFZGl0b3JzWzBdID0gbmV3IE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IodGFibGUpOwotICAgIGNlbGxFZGl0b3JzWzFdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLSAgICB0YWJsZVZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0KLS8vICAgIGNyZWF0ZUJ1dHRvbnMobmFtZXNwYWNlSW5mb0dyb3VwKTsgICAgICAgICAgICAKLQotICAgIGluaXRpYWxpemUoKTsgICAgCi0gIH0gICAgCi0KLSAgcHVibGljIHZvaWQgc2V0VXBkYXRlTGlzdGVuZXIoVXBkYXRlTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIpCi0gIHsKLSAgICB0aGlzLnVwZGF0ZUxpc3RlbmVyID0gdXBkYXRlTGlzdGVuZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IG5hbWVzcGFjZUluZm9MaXN0KQotICB7ICAgIAotICAgIHRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgICB1cGRhdGUoKTsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotICB9ICAKLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VDaGVja2VkTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gY2hlY2tlZExpc3Q7Ci0gIH0gIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gKChOYW1lc3BhY2VJbmZvKShuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkpKS5wcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHJlc291cmNlTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotICB9Ci0KLSAgcHVibGljIEdyaWRMYXlvdXQgY3JlYXRlR3JpZExheW91dCgpCi0gIHsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgIGdyaWRMYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotICAgIHJldHVybiBncmlkTGF5b3V0OwotICB9Ci0gICAgCi0gIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKQotICB7Ci0gICAgLy8gYmV0dGVyIHdheSB0byBkbyB0aGlzLi4uLgotICAgIE5hbWVzcGFjZUluZm8gaW5mbzEgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm8xLnByZWZpeCA9ICJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm8xLnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzEpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvMiA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzIucHJlZml4ID0gInNvYXAiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzIudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8yKTsKLSAgICBjaGVja2VkTGlzdC5hZGQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBOYW1lc3BhY2VJbmZvIGluZm8zID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBpbmZvMy5wcmVmaXggPSAiaHR0cCI7ICAvLyROT04tTkxTLTEkCi0gICAgaW5mbzMudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8zKTsKLSAgICBjaGVja2VkTGlzdC5hZGQoImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBOYW1lc3BhY2VJbmZvIGluZm80ID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBpbmZvNC5wcmVmaXggPSAibWltZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvNC51cmkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzQpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzUgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm81LnByZWZpeCA9ICJzb2FwZW5jIjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm81LnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzUpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzYgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm82LnByZWZpeCA9ICJzb2FwZW52IjsgLy8kTk9OLU5MUy0xJAotICAgIGluZm82LnVyaSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7IC8vJE5PTi1OTFMtMSQKLSAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbzYpOwotICAgIGNoZWNrZWRMaXN0LmFkZCgiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotICAgIE5hbWVzcGFjZUluZm8gaW5mbzcgPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotICAgIGluZm83LnByZWZpeCA9ICJ4c2kiOyAvLyROT04tTkxTLTEkCi0gICAgaW5mbzcudXJpID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIG5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvNyk7Ci0gICAgY2hlY2tlZExpc3QuYWRkKCJmYWxzZSIpOyAvLyROT04tTkxTLTEkCi0gICAgTmFtZXNwYWNlSW5mbyBpbmZvOCA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgaW5mbzgucHJlZml4ID0gInhzZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbmZvOC51cmkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0gICAgbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm84KTsKLSAgICBjaGVja2VkTGlzdC5hZGQoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgIHVwZGF0ZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgR3JpZERhdGEgaEZpbGxHRCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGhGaWxsR0QuaG9yaXpvbnRhbEFsaWdubWVudD0gR3JpZERhdGEuRklMTDsKLSAgICBoRmlsbEdELmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0gICAgCi0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEoaEZpbGxHRCk7Ci0gICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLSAgICBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotICAgIAotICAgIEJ1dHRvbiBoaWRkZW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGhpZGRlbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBoaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgaGlkZGVuQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsgIAotICAgICAgICBpZiAoZS53aWRnZXQgPT0gYWRkQnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybU5ldygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsgICAKLSAgICAKLSAgICAvLyBjcmVhdGUgYSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgdGhyZWUgYnV0dG9ucwotICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoaEZpbGxHRCk7Ci0gICAgR3JpZExheW91dCBidXR0b25HcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBidXR0b25HcmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgIGJ1dHRvbkdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkdyaWRMYXlvdXQpOwotCi0gICAgLy8gYWRkIHRoZSBOZXcgYnV0dG9uCi0gICAgLy8KLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0gICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBhZGRCdXR0b24uc2V0VGV4dChXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9BQ1RJT05fQUREIikpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZ2QpOy8vVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0gICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBlcmZvcm1OZXcoKQotICB7Ci0gICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBpbnZva2VEaWFsb2coWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiIpLCBpbmZvKTsgLy8kTk9OLU5MUy0xJAotICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IERpYWxvZy5PSykKLSAgICB7Ci0gICAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgICBjaGVja2VkTGlzdC5hZGQoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLSAgICB9Ci0gIH0gCi0gICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykKLSAgewotICAgIFNoZWxsIHNoZWxsID0gWE1MQ29tbW9uUmVzb3VyY2VzLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLSAgICBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coc2hlbGwsIGluZm8pOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0gICAgZGlhbG9nLm9wZW4oKTsgICAgICAKLSAgICByZXR1cm4gZGlhbG9nOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKQotICB7Ci0gICAgUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgIHsKLSAgICAgICAgdXBkYXRlKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0KLSAgICBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLSAgICB9Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0VGFyZ2V0TmFtZXNwYWNlSW5mbygpCi0gIHsKLSAgICByZXR1cm4gKG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwgJiYgbmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkgPyAKLSAgICAgICAgICAgKE5hbWVzcGFjZUluZm8pbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApIDoKLSAgICAgICAgICAgbnVsbDsKLSAgfSAgICAKLQotICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgdXBkYXRlKCkKLSAgewotICAgIHVwZGF0ZUhlbHBlcihuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCB1cGRhdGVIZWxwZXIoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHZpc2libGVSb3dzICE9IC0xICYmICFkdW1teVJvd3NSZW1vdmVkKQotICAgIHsKLS8vICAgICAgZHVtbXlSb3dzUmVtb3ZlZCA9IHRydWU7Ci0vLyAgICAgIHRhYmxlVmlld2VyLmdldFRhYmxlKCkucmVtb3ZlQWxsKCk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotICAgIGlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvciBleHRlbmRzIENoZWNrYm94Q2VsbEVkaXRvciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyBOYW1lc3BhY2VJbmZvQ2hlY2tib3hDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpCi0gICAgewotICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWN0aXZhdGUoKQotICAgIHsKLSAgICAgICBzdXBlci5hY3RpdmF0ZSgpOwotICAgICAgIGRlYWN0aXZhdGUoKTsKLSAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRGb2N1c0NvbnRyb2woKS5yZWRyYXcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSAgIAotICAgIHsgICAgICAKLSAgICAgIGlmICh0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9ICAgIAotICAgIHB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7fQotICAgIHB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7fQotCi0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIgaW1wbGVtZW50cyBJQ2VsbE1vZGlmaWVyCi0gIHsKLSAgICBwdWJsaWMgTmFtZXNwYWNlSW5mb0NlbGxNb2RpZmllcigpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KQotICAgIHsKLSAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuZXF1YWxzKFBSRUZJWCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBpbnQgY29sdW1uID0gMDsKLSAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICB7Ci0gICAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoUFJFRklYKSkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhOQU1FU1BBQ0VfVVJJKSkKLSAgICAgIHsKLSAgICAgICAgY29sdW1uID0gMjsKLSAgICAgIH0KLQotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwcm92aWRlci5nZXRDb2x1bW5UZXh0KGVsZW1lbnQsIGNvbHVtbik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpCi0gICAgewotICAgICAgVGFibGVJdGVtIGl0ZW0gPSAoVGFibGVJdGVtKWVsZW1lbnQ7Ci0gICAgICBpZiAoaXRlbSAhPSBudWxsKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0gICAgICAgIGlmIChvYmogIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFRhYmxlRWxlbWVudCBob2xkZXIgPSAoVGFibGVFbGVtZW50KW9iajsKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBob2xkZXIuZ2V0TmFtZXNwYWNlSW5mbygpOwotICAgICAgICAgIGlmIChwcm9wZXJ0eS5lcXVhbHMoSU5DTFVERSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgidHJ1ZSIpOwotICAgICAgICAgICAgICAgIGNoZWNrZWRMaXN0LnNldChob2xkZXIuZ2V0SW5kZXgoKSwgInRydWUiKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBob2xkZXIuc2V0Q2hlY2tlZCgiZmFsc2UiKTsKLSAgICAgICAgICAgICAgICBjaGVja2VkTGlzdC5zZXQoaG9sZGVyLmdldEluZGV4KCksICJmYWxzZSIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmVxdWFscyhQUkVGSVgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluZm8ucHJlZml4ID0gKChTdHJpbmcpdmFsdWUpLnRyaW0oKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBSdW5uYWJsZSBkZWxheWVkVXBkYXRlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgICBEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoZGVsYXllZFVwZGF0ZSk7Ci0gICAgICAgICAgaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXBkYXRlTGlzdGVuZXIudXBkYXRlT2NjdXJlZCh0aGlzLCBuYW1lc3BhY2VJbmZvTGlzdCk7Ci0gICAgICAgICAgfQotCi0vLyAgICAgICAgICBwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBjbGFzcyBUYWJsZUVsZW1lbnQKLSAgewotICAgIE5hbWVzcGFjZUluZm8gaW5mbzsKLSAgICBpbnQgaW5kZXg7Ci0gICAgU3RyaW5nIGNoZWNrZWQgPSAidHJ1ZSI7Ci0gICAgCi0gICAgVGFibGVFbGVtZW50KE5hbWVzcGFjZUluZm8gaW5mbywgaW50IGluZGV4KQotICAgIHsKLSAgICAgIHRoaXMuaW5mbyA9IGluZm87Ci0gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm8oKQotICAgIHsKLSAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hlY2tlZCgpCi0gICAgewotICAgICAgcmV0dXJuIGNoZWNrZWQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoU3RyaW5nIGNoZWNrZWQpCi0gICAgewotICAgICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotICB7Ci0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKW5hbWVzcGFjZUluZm9MaXN0LmdldChpKTsKLSAgICAgICAgVGFibGVFbGVtZW50IGhvbGRlciA9IG5ldyBUYWJsZUVsZW1lbnQoaW5mbywgaSk7Ci0gICAgICAgIGhvbGRlci5zZXRDaGVja2VkKChTdHJpbmcpY2hlY2tlZExpc3QuZ2V0KGkpKTsKLSAgICAgICAgdi5hZGQoaG9sZGVyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikKLSAgICB7Ci0gICAgICBUYWJsZUVsZW1lbnQgaG9sZGVyID0gKFRhYmxlRWxlbWVudClvYmplY3Q7Ci0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBob2xkZXIuZ2V0TmFtZXNwYWNlSW5mbygpOwotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBzd2l0Y2ggKGNvbHVtbikKLSAgICAgIHsKLSAgICAgICAgY2FzZSAxOiB7IHJlc3VsdCA9IGluZm8ucHJlZml4OyBicmVhazsgfQotICAgICAgICBjYXNlIDI6IHsgcmVzdWx0ID0gaW5mby51cmk7IGJyZWFrOyB9Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC50cmltKCkgOiAiIjsKLSAgICAgIGlmIChyZXN1bHQuZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIDI6IAotICAgICAgICAgIHsgCi0gICAgICAgICAgICByZXN1bHQgPSBYTUxDb21tb25SZXNvdXJjZXMuZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9OT19OQU1FU1BBQ0VfTkFNRSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgYnJlYWs7IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLS8vICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRQcmVmaXgoKQotLy8gICAgewotLy8gICAgICBTdHJpbmcgZGVmYXVsdFByZWZpeCA9ICJwIjsKLS8vICAgICAgaWYgKG5hbWVzcGFjZUluZm9MaXN0ID09IG51bGwpCi0vLyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0vLwotLy8gICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLS8vICAgICAgZm9yIChpbnQgaT0wOyBpPG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKQotLy8gICAgICB7Ci0vLyAgICAgICAgTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbyluYW1lc3BhY2VJbmZvTGlzdC5nZXQoaSk7Ci0vLyAgICAgICAgaWYgKG5zaW5mby5wcmVmaXggIT0gbnVsbCkKLS8vICAgICAgICAgIHYuYWRkRWxlbWVudChuc2luZm8ucHJlZml4KTsKLS8vICAgICAgfQotLy8KLS8vICAgICAgaWYgKHYuY29udGFpbnMoZGVmYXVsdFByZWZpeCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmcgcyA9IGRlZmF1bHRQcmVmaXg7Ci0vLyAgICAgICAgZm9yIChpbnQgaj0wOyB2LmNvbnRhaW5zKHMpOyBqKyspCi0vLyAgICAgICAgewotLy8gICAgICAgICAgcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotLy8gICAgICAgIH0KLS8vICAgICAgICByZXR1cm4gczsKLS8vICAgICAgfQotLy8gICAgICBlbHNlCi0vLyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0vLyAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KQotICAgIHsKLSAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSAgLy8gT3V0cHV0IENvbHVtbgotICAgICAgewotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgVGFibGVFbGVtZW50IGhvbGRlciA9IChUYWJsZUVsZW1lbnQpIG9iamVjdDsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gaG9sZGVyLmdldENoZWNrZWQoKTsKLSAgICAgICAgICBpZiAocmVzdWx0LmVxdWFscygidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3V0cHV0X3llcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSgiaWNvbnMvb3V0cHV0X25vLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgTmFtZXNwYWNlTmF2aWdhYmxlVGFibGVWaWV3ZXIgZXh0ZW5kcyBOYXZpZ2FibGVUYWJsZVZpZXdlcgotICB7Ci0gICAgcHVibGljIE5hbWVzcGFjZU5hdmlnYWJsZVRhYmxlVmlld2VyKFRhYmxlIHBhcmVudCkKLSAgICB7Ci0gICAgICBzdXBlcihwYXJlbnQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdXU0RMV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1dTRExXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1ODU4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1dTRExXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuZ2VuZXJhdG9yLkhUVFBDb250ZW50R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmdlbmVyYXRvci5TT0FQQ29udGVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5CaW5kaW5nR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLkNyZWF0ZVdTRExFbGVtZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuRE9NVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIE5ld1dTRExXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIFdTRExOZXdGaWxlUGFnZSBuZXdGaWxlUGFnZTsKLQlwcml2YXRlIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2Ugb3B0aW9uc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBOZXdXU0RMV2l6YXJkLgotCSAqLwotCXB1YmxpYyBOZXdXU0RMV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSUZpbGUgZmlsZSA9IG5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgewotCQkJY2hhclNldCA9ICJVVEYtOCI7Ci0JCX0KLQotCQlTdHJpbmcgd3NkbFByZWZpeCA9ICJ3c2RsIjsKLQkJVmVjdG9yIG5hbWVzcGFjZXMgPSBvcHRpb25zUGFnZS5nZXROYW1lc3BhY2VJbmZvKCk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9IG9wdGlvbnNQYWdlLmdldFByZWZpeCgpOwotCQlTdHJpbmcgZGVmaW5pdGlvbk5hbWUgPSBvcHRpb25zUGFnZS5nZXREZWZpbml0aW9uTmFtZSgpOwotCi0JCVVSSSB1cmkyID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlXU0RMUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpIHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioud3NkbCIpKTsKLQkJcmVzb3VyY2Uuc2V0VVJJKHVyaTIpOwotCQkKLQkJV1NETEZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgV1NETEZhY3RvcnlJbXBsKCk7Ci0JCURlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbkltcGwpIGZhY3RvcnkuY3JlYXRlRGVmaW5pdGlvbigpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkZWZpbml0aW9uKTsKLQkJCi0JCWRlZmluaXRpb24uc2V0VGFyZ2V0TmFtZXNwYWNlKG9wdGlvbnNQYWdlLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLQkJZGVmaW5pdGlvbi5zZXRMb2NhdGlvbihmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCWRlZmluaXRpb24uc2V0RW5jb2RpbmcoY2hhclNldCk7Ci0JCWRlZmluaXRpb24uc2V0UU5hbWUobmV3IFFOYW1lKHdzZGxQcmVmaXgsIGRlZmluaXRpb25OYW1lKSk7Ci0JCWRlZmluaXRpb24uYWRkTmFtZXNwYWNlKHByZWZpeCwgb3B0aW9uc1BhZ2UuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5zaXplKCk7IGkrKykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZXMuZ2V0KGkpOwotCi0JCQlpZiAoaW5mby5wcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoaW5mby5wcmVmaXgsIGluZm8udXJpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRlZmluaXRpb24uYWRkTmFtZXNwYWNlKG51bGwsIGluZm8udXJpKTsKLQkJCX0KLQkJfQotCQkvLyBUT0RPIDogY3MuLi4gd2h5IGRvIHdlIG5lZWQgdGhpcz8gIHRoZXNlIGNhbGxzIGFyZSBldmlsIQotCQlkZWZpbml0aW9uLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlpZiAob3B0aW9uc1BhZ2UuZ2V0Q3JlYXRlU2tlbGV0b25Cb29sZWFuKCkpIHsKLQkJCQlpZiAob3B0aW9uc1BhZ2UuaXNTb2FwRG9jTGl0ZXJhbFByb3RvY29sKCkpIHsKLQkJCQkJQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9UWVBFX09SX0RFRklOSVRJT04gPSBDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5QQVJUX0lORk9fRUxFTUVOVF9ERUNMQVJBVElPTjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLlBBUlRfVFlQRV9PUl9ERUZJTklUSU9OID0gQ3JlYXRlV1NETEVsZW1lbnRIZWxwZXIuUEFSVF9JTkZPX1RZUEVfREVGSU5JVElPTjsKLQkJCQl9Ci0KLQkJCQlDcmVhdGVXU0RMRWxlbWVudEhlbHBlci5zZXJ2aWNlTmFtZSA9IGRlZmluaXRpb25OYW1lOwotCQkJCUNyZWF0ZVdTRExFbGVtZW50SGVscGVyLnBvcnROYW1lID0gZGVmaW5pdGlvbk5hbWUgKyBvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpOwotCQkJCVNlcnZpY2Ugc2VydmljZSA9IENyZWF0ZVdTRExFbGVtZW50SGVscGVyLmNyZWF0ZVNlcnZpY2UoZGVmaW5pdGlvbik7Ci0KLQotCQkJCS8vIEdlbmVyYXRlIEJpbmRpbmcKLQkJCQlJdGVyYXRvciBiaW5kaW5nSXQgPSBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLml0ZXJhdG9yKCk7Ci0JCQkJQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLQkJCQlpZiAoYmluZGluZ0l0Lmhhc05leHQoKSkgewotCQkJCQliaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdJdC5uZXh0KCk7Ci0JCQkJfQotCQkJCUJpbmRpbmdHZW5lcmF0b3IgYmluZGluZ0dlbmVyYXRvciA9IG5ldyBCaW5kaW5nR2VuZXJhdG9yKGRlZmluaXRpb24sIGJpbmRpbmcsIFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJKTsKLQkJCQlQb3J0IHBvcnQgPSAoUG9ydCkgc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQliaW5kaW5nR2VuZXJhdG9yLnNldE5hbWUoQ29tcG9uZW50UmVmZXJlbmNlVXRpbC5nZXROYW1lKHBvcnQuZ2V0RUJpbmRpbmcoKSkpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3Iuc2V0UmVmTmFtZShDb21wb25lbnRSZWZlcmVuY2VVdGlsLmdldFBvcnRUeXBlUmVmZXJlbmNlKHBvcnQuZ2V0RUJpbmRpbmcoKSkpOwotCQkJCWJpbmRpbmdHZW5lcmF0b3Iuc2V0T3ZlcndyaXRlKHRydWUpOwotCQkJCQotCQkJCWlmIChvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpLmVxdWFscygiU09BUCIpKSB7Ci0JCQkJCVN0cmluZyBuYW1lc3BhY2UgPSBTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSTsKLQkJCQkJYmluZGluZ0dlbmVyYXRvci5zZXRDb250ZW50R2VuZXJhdG9yKEJpbmRpbmdHZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcihuYW1lc3BhY2UpKTsKLQotCQkJCQlTT0FQQ29udGVudEdlbmVyYXRvciBzb2FwR2VuID0gKFNPQVBDb250ZW50R2VuZXJhdG9yKSBiaW5kaW5nR2VuZXJhdG9yLmdldENvbnRlbnRHZW5lcmF0b3IoKTsKLQkJCQkJQm9vbGVhbiBib29sZWFuVmFsdWUgPSAoQm9vbGVhbikgb3B0aW9uc1BhZ2UuZ2V0UHJvdG9jb2xPcHRpb25zKClbMF07Ci0JCQkJCUJvb2xlYW4gYm9vbGVhblZhbHVlMiA9IChCb29sZWFuKSBvcHRpb25zUGFnZS5nZXRQcm90b2NvbE9wdGlvbnMoKVsyXTsKLQkJCQkJaWYgKGJvb2xlYW5WYWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJLy8gRG9jdW1lbnQgTGl0ZXJhbAotCQkJCQkJc29hcEdlbi5zZXRTdHlsZShTT0FQQ29udGVudEdlbmVyYXRvci5TVFlMRV9ET0NVTUVOVCk7Ci0JCQkJCQlzb2FwR2VuLnNldFVzZShTT0FQQ29udGVudEdlbmVyYXRvci5VU0VfTElURVJBTCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoYm9vbGVhblZhbHVlMi5ib29sZWFuVmFsdWUoKSl7Ci0JCQkJCQkvLyBSUEMgTGl0ZXJhbAotCQkJCQkJc29hcEdlbi5zZXRTdHlsZShTT0FQQ29udGVudEdlbmVyYXRvci5TVFlMRV9SUEMpOwotCQkJCQkJc29hcEdlbi5zZXRVc2UoU09BUENvbnRlbnRHZW5lcmF0b3IuVVNFX0xJVEVSQUwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gUlBDIEVuY29kZWQKLQkJCQkJCXNvYXBHZW4uc2V0U3R5bGUoU09BUENvbnRlbnRHZW5lcmF0b3IuU1RZTEVfUlBDKTsKLQkJCQkJCXNvYXBHZW4uc2V0VXNlKFNPQVBDb250ZW50R2VuZXJhdG9yLlVTRV9FTkNPREVEKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChvcHRpb25zUGFnZS5nZXRQcm90b2NvbCgpLmVxdWFscygiSFRUUCIpKSB7Ci0JCQkJCVN0cmluZyBuYW1lc3BhY2UgPSBIVFRQQ29uc3RhbnRzLkhUVFBfTkFNRVNQQUNFX1VSSTsKLQkJCQkJYmluZGluZ0dlbmVyYXRvci5zZXRDb250ZW50R2VuZXJhdG9yKEJpbmRpbmdHZW5lcmF0b3IuZ2V0Q29udGVudEdlbmVyYXRvcihuYW1lc3BhY2UpKTsKLQotCQkJCQlCb29sZWFuIGJvb2xlYW5WYWx1ZSA9IChCb29sZWFuKSBvcHRpb25zUGFnZS5nZXRQcm90b2NvbE9wdGlvbnMoKVswXTsKLQkJCQkJaWYgKGJvb2xlYW5WYWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJLy8gUG9zdAotCQkJCQkJKChIVFRQQ29udGVudEdlbmVyYXRvcikgYmluZGluZ0dlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCkpLnNldFZlcmIoSFRUUENvbnRlbnRHZW5lcmF0b3IuVkVSQl9QT1NUKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIEdldAotCQkJCQkJKChIVFRQQ29udGVudEdlbmVyYXRvcikgYmluZGluZ0dlbmVyYXRvci5nZXRDb250ZW50R2VuZXJhdG9yKCkpLnNldFZlcmIoSFRUUENvbnRlbnRHZW5lcmF0b3IuVkVSQl9HRVQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWJpbmRpbmdHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nKCk7Ci0JCQkJYmluZGluZ0dlbmVyYXRvci5nZW5lcmF0ZVBvcnRDb250ZW50KCk7CQkJCQotCQkJfQotCQkJcmVzb3VyY2Uuc2F2ZShudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5Db3VsZCBub3Qgd3JpdGUgbmV3IFdTREwgZmlsZSBpbiBXU0RMIFdpemFyZDogIiArIGUpOwotCQl9Ci0KLQkJLyoKLQkJICogaWYgKGZpbGUgIT0gbnVsbCkgeyBmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldwotCQkgKiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbGUpOyBpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsgSVdvcmtiZW5jaAotCQkgKiB3b3JrYmVuY2ggPSBVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7IGZpbmFsCi0JCSAqIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0KLQkJICogd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOyBmaW5hbCBJV29ya2JlbmNoUGFydAotCQkgKiBmb2N1c1BhcnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsgaWYKLQkJICogKGZvY3VzUGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpIHsKLQkJICogRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjIChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJICogKChJU2V0U2VsZWN0aW9uVGFyZ2V0KWZvY3VzUGFydCkuc2VsZWN0UmV2ZWFsKHNlbGVjdGlvbik7IH0gfSk7IH0gfSB9Ci0JCSAqLwotCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCi0JCS8vIE5lZWQgbmV3IGljb24KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NETEVkaXRvci5jbGFzcywgImljb25zL25ld193c2RsX3dpei5naWYiKSk7Ci0JCXRoaXMuc2V0V2luZG93VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfTkVXX1dTRExfRklMRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQluZXdGaWxlUGFnZSA9IG5ldyBXU0RMTmV3RmlsZVBhZ2Uoc2VsZWN0aW9uKTsKLQkJb3B0aW9uc1BhZ2UgPSBuZXcgV1NETE5ld0ZpbGVPcHRpb25zUGFnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9USVRMRV9PUFRJT05TIiksIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX1RJVExFX09QVElPTlMiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhZGRQYWdlKG5ld0ZpbGVQYWdlKTsKLQkJYWRkUGFnZShvcHRpb25zUGFnZSk7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldE5ld0ZpbGVQYXRoKCkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBuZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlyZXR1cm4gZmlsZU5hbWUgIT0gbnVsbCA/IG5ldyBQYXRoKGZpbGVOYW1lKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAobmV3RmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKSAmJiBvcHRpb25zUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0KLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoaUZpbGUpLCAib3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvciIpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gQjJCR1VJUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJFeGNlcHRpb24KLQkJCQkJCS8vIGVuY291bnRlcmVkIHdoZW4gYXR0ZW1wdGluZyB0byBvcGVuIGZpbGU6ICIgKyBpRmlsZQotCQkJCQkJLy8gKyAiXG5cbiIgKyBleCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yIGV4dGVuZHMgQ01WaXNpdG9yIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BVFRSSUJVVEVTID0gTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfQ0hJTERfTk9ERVMgPSBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTID0gTW9kZWxRdWVyeS5JTkNMVURFX1NFUVVFTkNFX0dST1VQUzsKLQotCQlwdWJsaWMgSGFzaHRhYmxlIGNoaWxkTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwdWJsaWMgSGFzaHRhYmxlIGF0dHJpYnV0ZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwdWJsaWMgRWxlbWVudCByb290RWxlbWVudDsKLQkJcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RFbGVtZW50RGVjbGFyYXRpb247Ci0JCXB1YmxpYyBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0JCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVTZXF1ZW5jZUdyb3VwczsKLQkJcHVibGljIERPTVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkJcHVibGljIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoRWxlbWVudCByb290RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50OwotCQkJdGhpcy5yb290RWxlbWVudERlY2xhcmF0aW9uID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsKLQkJCXZhbGlkYXRvciA9IG5ldyBET01WYWxpZGF0b3IoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5KENNTm9kZSBjbU5vZGUpIHsKLQkJCVN0cmluZyBrZXkgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KSBjbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLQkJCWlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZXNwYWNlVVJJID0gKFN0cmluZykgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOwotCQkJCWlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkgewotCQkJCQlrZXkgPSAiWyIgKyBuYW1lc3BhY2VVUkkgKyAiXSIgKyBrZXk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGtleTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGNvbXB1dGVBdmFpbGFibGVDb250ZW50KGludCBpbmNsdWRlT3B0aW9ucykgewotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJCWludCBjb250ZW50VHlwZSA9IHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQkJCWluY2x1ZGVTZXF1ZW5jZUdyb3VwcyA9ICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX1NFUVVFTkNFX0dST1VQUykgIT0gMCk7Ci0JCQl2aXNpdENNTm9kZShyb290RWxlbWVudERlY2xhcmF0aW9uKTsKLQotCQkJaWYgKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfQVRUUklCVVRFUykgIT0gMCkgewotCQkJCXYuYWRkQWxsKGF0dHJpYnV0ZVRhYmxlLnZhbHVlcygpKTsKLQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIG5pbGxhYmxlQXR0cmlidXRlID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uaWxsYWJsZSIpOwotCQkJCWlmIChuaWxsYWJsZUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJCXYuYWRkKG5pbGxhYmxlQXR0cmlidXRlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0NISUxEX05PREVTKSAhPSAwKSB7Ci0JCQkJaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpIHsKLQkJCQkJdi5hZGRBbGwoY2hpbGROb2RlVGFibGUudmFsdWVzKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpIHsKLQkJCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIHJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsKLQkJCQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJCQl2LmFkZCgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKSB7Ci0JCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSByb290RWxlbWVudERlY2xhcmF0aW9uLmdldERhdGFUeXBlKCk7Ci0JCQkJCWlmIChkYXRhVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQl2LmFkZChkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdjsKLQkJfQotCi0JCS8qCi0JCSAqIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KSB7IFN0cmluZyB1cmkgPQotCQkgKiBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyBMaXN0IGxpc3QgPQotCQkgKiBnZXRDTURvY3VtZW50TGlzdChyb290RWxlbWVudCwgcm9vdEVsZW1lbnREZWNsYXJhdGlvbiwgdXJpKTsgZm9yCi0JCSAqIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJICogQ01Eb2N1bWVudCBjbWRvY3VtZW50ID0gKENNRG9jdW1lbnQpaXRlcmF0b3IubmV4dCgpOyBpZiAoY21kb2N1bWVudCAhPQotCQkgKiBudWxsKSB7IENNTmFtZWROb2RlTWFwIG1hcCA9IGNtZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsgaW50IHNpemUgPQotCQkgKiBtYXAuZ2V0TGVuZ3RoKCk7IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7IENNTm9kZSBlZCA9Ci0JCSAqIG1hcC5pdGVtKGkpOwotCQkgKiAKLQkJICogY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsgfSB9IH0gfQotCQkgKi8KLQkJcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJCXN1cGVyLnZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhZCk7Ci0JCQlhdHRyaWJ1dGVUYWJsZS5wdXQoYWQuZ2V0Tm9kZU5hbWUoKSwgYWQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQkJaWYgKGVkID09IHJvb3RFbGVtZW50RGVjbGFyYXRpb24gJiYgIWlzUm9vdFZpc2l0ZWQpIHsKLQkJCQlpc1Jvb3RWaXNpdGVkID0gdHJ1ZTsKLQkJCQlzdXBlci52aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKGVkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghQm9vbGVhbi5UUlVFLmVxdWFscyhlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKSkpIHsKLQkJCQkJY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsKLQkJCQl9Ci0KLQkJCQlDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwID0gKENNTm9kZUxpc3QpIGVkLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOwotCQkJCWlmIChzdWJzdGl0dXRpb25Hcm91cCAhPSBudWxsKSB7Ci0JCQkJCWhhbmRsZVN1YnN0aXR1dGlvbkdyb3VwKHN1YnN0aXR1dGlvbkdyb3VwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTdWJzdGl0dXRpb25Hcm91cChDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwKSB7Ci0JCQlpbnQgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGggPSBzdWJzdGl0dXRpb25Hcm91cC5nZXRMZW5ndGgoKTsKLQkJCWlmIChzdWJzdGl0dXRpb25Hcm91cExlbmd0aCA+IDEpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YnN0aXR1dGlvbkdyb3VwTGVuZ3RoOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGVkID0gc3Vic3RpdHV0aW9uR3JvdXAuaXRlbShpKTsKLQkJCQkJaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgewotCQkJCQkJY2hpbGROb2RlVGFibGUucHV0KGdldEtleShlZCksIGVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKSB7Ci0JCQlpZiAoaW5jbHVkZVNlcXVlbmNlR3JvdXBzKSB7Ci0JCQkJaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5TRVFVRU5DRSAmJiBncm91cC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAxICYmIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KGdyb3VwKSkgewotCQkJCQljaGlsZE5vZGVUYWJsZS5wdXQoZ3JvdXAsIGdyb3VwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZXNSZXF1aXJlZENvbnRlbnQoQ01Hcm91cCBncm91cCkgewotCQkJTGlzdCBsaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGdyb3VwKTsKLQkJCXJldHVybiBsaXN0LnNpemUoKSA+IDE7Ci0JCX0KLQotCQlwdWJsaWMgRE9NVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJCXJldHVybiB2YWxpZGF0b3I7Ci0JCX0KLQl9IC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaGVyZQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9Qb3J0V2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1BvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjZjNjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1BvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5Qb3J0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5Db250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuY29udGVudGdlbmVyYXRvci51aS5Tb2FwQmluZGluZ09wdGlvbnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuQ29tcG9uZW50UmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLk5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpZGdldHMuUHJvdG9jb2xDb21wb25lbnRDb250cm9sOwotCi1wdWJsaWMgY2xhc3MgUG9ydFdpemFyZCBleHRlbmRzIFdpemFyZAotewotICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTVFlMRV9ORVdfQklORElORyA9IDE7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX0VYSVNUSU5HX0JJTkRJTkcgPSAxIDw8IDE7Ci0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFNUWUxFX0RFRkFVTFQgPSBTVFlMRV9ORVdfQklORElORyB8IFNUWUxFX0VYSVNUSU5HX0JJTkRJTkc7Ci0KLSAgcHJvdGVjdGVkIFBvcnRHZW5lcmF0b3IgcG9ydEdlbmVyYXRvcjsKLSAgcHJvdGVjdGVkIFBvcnRXaXphcmRPcHRpb25zUGFnZSBzcGVjaWZ5QmluZGluZ1BhZ2U7Ci0gIHByb3RlY3RlZCBpbnQgc3R5bGU7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBQb3J0V2l6YXJkLgotICAgKi8KLSAgcHVibGljIFBvcnRXaXphcmQoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgdGhpcyhzZXJ2aWNlLCAwKTsKLSAgfQotCi0gIHB1YmxpYyBQb3J0V2l6YXJkKFNlcnZpY2Ugc2VydmljZSwgaW50IHN0eWxlKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBwb3J0R2VuZXJhdG9yID0gbmV3IFBvcnRHZW5lcmF0b3Ioc2VydmljZSk7Ci0gICAgc2V0V2luZG93VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUE9SVF9XSVpBUkQiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAvL3NldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShXU0RMRWRpdG9yUGx1Z2luLmNsYXNzLCAiaWNvbnMvTmV3WE1MLmdpZiIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB3aXphcmQgc2V0dXAgaXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBzZXR1cCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkKLSAgewotICAgIHNwZWNpZnlCaW5kaW5nUGFnZSA9IG5ldyBQb3J0V2l6YXJkT3B0aW9uc1BhZ2Uoc3R5bGUpOwotICAgIGFkZFBhZ2Uoc3BlY2lmeUJpbmRpbmdQYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IHBvcnRHZW5lcmF0b3IuZ2VuZXJhdGVQb3J0KCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAob2JqZWN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotICAgICAgICBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIgPSAoSVNlbGVjdGlvblByb3ZpZGVyKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvblByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjbGFzcyBQb3J0V2l6YXJkT3B0aW9uc1BhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi0gIHsKLQotICAgIHByb3RlY3RlZCBQcm90b2NvbENvbXBvbmVudENvbnRyb2wgcHJvdG9jb2xDb21wb25lbnRDb250cm9sOwotCi0gICAgcHVibGljIFBvcnRXaXphcmRPcHRpb25zUGFnZShpbnQgc3R5bGUpCi0gICAgewotICAgICAgc3VwZXIoIlNwZWNpZnlQb3J0UGFnZSIpOwotICAgICAgc2V0VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfU1BFQ0lGWV9QT1JUX0RFVEFJTFMiKSk7Ci0gICAgICBzZXREZXNjcmlwdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9TUEVDSUZZX1BPUlRfREVUQUlMU19UT19CRV9DUkVBVEVEIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBQb3J0R2VuZXJhdG9yIGdldEdlbmVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIHBvcnRHZW5lcmF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIFByb3RvY29sQ29tcG9uZW50Q29udHJvbCBwcm90b2NvbENvbXBvbmVudENvbnRyb2wgPSBuZXcgUG9ydFByb3RvY29sQ29tcG9uZW50Q29udHJvbChwYXJlbnQsIHBvcnRHZW5lcmF0b3IpOwotICAgICAgcHJvdG9jb2xDb21wb25lbnRDb250cm9sLmluaXRGaWVsZHMoKTsKLSAgICAgIHNldENvbnRyb2wocHJvdG9jb2xDb21wb25lbnRDb250cm9sKTsKLSAgICB9Ci0gIH0KLQotICBjbGFzcyBQb3J0UHJvdG9jb2xDb21wb25lbnRDb250cm9sIGV4dGVuZHMgUHJvdG9jb2xDb21wb25lbnRDb250cm9sCi0gIHsKLQotICAgIHB1YmxpYyBQb3J0UHJvdG9jb2xDb21wb25lbnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIFBvcnRHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICAgIHsKLSAgICAgIHN1cGVyKHBhcmVudCwgZ2VuZXJhdG9yLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWZOYW1lTGFiZWxUZXh0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQklORElORyIpOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFJlZk5hbWVzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IENvbXBvbmVudFJlZmVyZW5jZVV0aWwocG9ydEdlbmVyYXRvci5nZXREZWZpbml0aW9uKCkpLmdldEJpbmRpbmdOYW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKQotICAgIHsKLSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHBvcnRHZW5lcmF0b3IuZ2V0U2VydmljZSgpOwotICAgICAgcmV0dXJuIE5hbWVVdGlsLmJ1aWxkVW5pcXVlUG9ydE5hbWUoc2VydmljZSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSBjcmVhdGVDb250ZW50R2VuZXJhdG9yT3B0aW9uc1BhZ2UoU3RyaW5nIHByb3RvY29sKQotICAgIHsKLSAgICAgIENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSBvcHRpb25zUGFnZSA9IG51bGw7CSAgCi0JICBTdHJpbmcgcHJvdG9jb2xTZWxlY3Rpb24gPSBwcm90b2NvbENvbWJvLmdldEl0ZW0ocHJvdG9jb2xDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkgIGlmIChwcm90b2NvbFNlbGVjdGlvbi5lcXVhbHMoIlNPQVAiKSkgewotCQkgIG9wdGlvbnNQYWdlID0gbmV3IFNvYXBCaW5kaW5nT3B0aW9uc1BhZ2UoKTsKLQkgIH0KLQkgIGVsc2UgaWYgKHByb3RvY29sU2VsZWN0aW9uLmVxdWFscygiSFRUUCIpKSB7Ci0JCSAgb3B0aW9uc1BhZ2UgPSBuZXcgU29hcEJpbmRpbmdPcHRpb25zUGFnZSgpOwotCSAgfQkgIAotLy8gICAgICBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IFdTRExFZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uKHByb3RvY29sKTsKLS8vICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgb3B0aW9uc1BhZ2UgPSBleHRlbnNpb24uY3JlYXRlUG9ydENvbnRlbnRHZW5lcmF0b3JPcHRpb25zUGFnZSgpOwotLy8gICAgICB9Ci0gICAgICByZXR1cm4gb3B0aW9uc1BhZ2U7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwvd2l6YXJkcy9XU0RMTmV3RmlsZU9wdGlvbnNQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1dTRExOZXdGaWxlT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2MWVkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1dTRExOZXdGaWxlT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnV0aWwuVmFsaWRhdGVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLlVwZGF0ZUxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgV1NETE5ld0ZpbGVPcHRpb25zUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgVXBkYXRlTGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIHByb3RlY3RlZCBUZXh0IHRhcmdldE5hbWVzcGFjZVRleHQ7Ci0gIHByb3RlY3RlZCBUZXh0IHByZWZpeFRleHQ7Ci0gIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVBvcnRPcEZpZWxkQm9vbGVhbiA9IHRydWU7Ci0gIAotICBwcm90ZWN0ZWQgUGFnZUJvb2sgcHJvdG9jb2xQYWdlQm9vazsKLSAgcHJvdGVjdGVkIENvbWJvIHByb3RvY29sQ29tYm87Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgc29hcFBhZ2U7Ci0gIHByb3RlY3RlZCBDb21wb3NpdGUgaHR0cFBhZ2U7Ci0gIHByb3RlY3RlZCBCdXR0b24gZG9jTGl0UmFkaW87Ci0gIHByb3RlY3RlZCBCdXR0b24gcnBjTGl0UmFkaW87Ci0gIHByb3RlY3RlZCBCdXR0b24gcnBjRW5jUmFkaW87Ci0gIHByb3RlY3RlZCBCdXR0b24gaHR0cEdldFJhZGlvOwotICBwcm90ZWN0ZWQgQnV0dG9uIGh0dHBQb3N0UmFkaW87Ci0gIAotLy8gIHByaXZhdGUgQmluZGluZ0dlbmVyYXRvciBnZW5lcmF0b3I7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlLgotICAgKiBAcGFyYW0gcGFnZU5hbWUKLSAgICovCi0gIHB1YmxpYyBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlKFN0cmluZyBwYWdlTmFtZSkKLSAgewotICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgfQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTRExOZXdGaWxlT3B0aW9uc1BhZ2UuCi0gICAqIEBwYXJhbSBwYWdlTmFtZQotICAgKiBAcGFyYW0gdGl0bGUKLSAgICogQHBhcmFtIHRpdGxlSW1hZ2UKLSAgICovCi0gIHB1YmxpYyBXU0RMTmV3RmlsZU9wdGlvbnNQYWdlKFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHRpdGxlLCBJbWFnZURlc2NyaXB0b3IgdGl0bGVJbWFnZSkKLSAgewotICAgIHN1cGVyKHBhZ2VOYW1lLCB0aXRsZSwgdGl0bGVJbWFnZSk7Ci0gICAgc2V0RGVzY3JpcHRpb24oV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfREVTQ1JJUFRJT05fTkVXX1dTRExfRklMRSIpKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgYmFzZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgV29ya2JlbmNoSGVscC5zZXRIZWxwKGJhc2UsIFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0hFTFAiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBiYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotICAgIC8vICBHcm91cCB3c2RsR3JvdXAgPSBWaWV3VXRpbGl0eS5jcmVhdGVHcm91cChiYXNlLCAyLCAiV1NETCIsIGZhbHNlKTsKLSAgICBDb21wb3NpdGUgd3NkbEdyb3VwID0gbmV3IENvbXBvc2l0ZShiYXNlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICB3c2RsR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB3c2RsR3JvdXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAKLSAgICBHcmlkRGF0YSBnZCA9IChHcmlkRGF0YSl3c2RsR3JvdXAuZ2V0TGF5b3V0RGF0YSgpOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0gICAgTGFiZWwgdGFyZ2V0TmFtZXNwYWNlID0gbmV3IExhYmVsKHdzZGxHcm91cCwgU1dULkxFRlQpOwotICAgIHRhcmdldE5hbWVzcGFjZS5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX1RBUkdFVF9OQU1FU1BBQ0UiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICBHcmlkRGF0YSBuc0RhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBuc0RhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdGFyZ2V0TmFtZXNwYWNlLnNldExheW91dERhdGEobnNEYXRhKTsKLSAgICAKLSAgICB0YXJnZXROYW1lc3BhY2VUZXh0ID0gbmV3IFRleHQod3NkbEdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgdGV4dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICB0ZXh0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICB0ZXh0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICB0ZXh0RGF0YS53aWR0aEhpbnQgPSAxMDsKLSAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEodGV4dERhdGEpOwotICAgIAotICAgIHRhcmdldE5hbWVzcGFjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0KLSAgICBMYWJlbCBwcmVmaXggPSBuZXcgTGFiZWwod3NkbEdyb3VwLCBTV1QuTEVGVCk7Ci0gICAgcHJlZml4LnNldFRleHQoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfUFJFRklYX1dJVEhfQ09MT04iKSk7IC8vJE5PTi1OTFMtMSRcCi0KLSAgICBHcmlkRGF0YSBwcmVmaXhEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgcHJlZml4RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwcmVmaXguc2V0TGF5b3V0RGF0YShwcmVmaXhEYXRhKTsKLSAgICAKLSAgICBwcmVmaXhUZXh0ID0gbmV3IFRleHQod3NkbEdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgR3JpZERhdGEgcHJlZml4VGV4dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBwcmVmaXhUZXh0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBwcmVmaXhUZXh0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBwcmVmaXhUZXh0RGF0YS53aWR0aEhpbnQgPSAxMDsKLSAgICBwcmVmaXhUZXh0LnNldExheW91dERhdGEocHJlZml4VGV4dERhdGEpOwotCi0gICAgcHJlZml4VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLSAgICAKLSAgICAvLyAgICBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSBYTUxDYXRhbG9nUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5sb29rdXBPckNyZWF0ZVhNTENhdGFsb2coImRlZmF1bHQiKTsKLSAgICAvLyAgICBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBjYXRhbG9nID0gbmV3IFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKGJhc2UsIHhtbENhdGFsb2cpOwotCi0vLyAgRGV0ZXJtaW5lIGlmIHRoZSB1c2VyIHdpc2hlcyB0byBjcmVhdGUgYSBza2VsZXRvbiBXU0RMLiAgSWYgeWVzLCBwcmVzZW50IHRoZSB1c2VyIHdpdGggaW5wdXQgZmllbGRzLgotICAgIGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGJhc2UsIFNXVC5DSEVDSyk7Ci0gICAgY3JlYXRlU2tlbGV0b25DaGVja0JveC5zZXRUZXh0KFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0NSRUFURV9XU0RMX1NLRUxFVE9OIikpOwotICAgIGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIAotICAgIHdzZGxTa2VsZXRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShiYXNlLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQyID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQyLm51bUNvbHVtbnMgPSAyOwotICAgIHdzZGxTa2VsZXRvbkdyb3VwLnNldExheW91dChsYXlvdXQyKTsKLQotICAgIEdyaWREYXRhIGRhdGEyID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YTIudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEyLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIHdzZGxTa2VsZXRvbkdyb3VwLnNldExheW91dERhdGEoZGF0YTIpOwotCi0gICBjcmVhdGVMYWJlbCh3c2RsU2tlbGV0b25Hcm91cCwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfQklORElOR19QUk9UT0NPTCIpKTsKLSAgIHByb3RvY29sQ29tYm8gPSBuZXcgQ29tYm8od3NkbFNrZWxldG9uR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotICAgR3JpZERhdGEgZGF0YUMgPSBuZXcgR3JpZERhdGEoKTsKLSAgIGRhdGFDLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgZGF0YUMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICBwcm90b2NvbENvbWJvLnNldExheW91dERhdGEoZGF0YUMpOwotICAgcHJvdG9jb2xDb21iby5hZGQoU09BUF9QUk9UT0NPTCk7Ci0gICBwcm90b2NvbENvbWJvLmFkZChIVFRQX1BST1RPQ09MKTsKLSAgIHByb3RvY29sQ29tYm8uc2VsZWN0KDApOwotICAgcHJvdG9jb2xDb21iby5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLSAgIAotICAgc2VwTGFiZWwgPSBuZXcgTGFiZWwoYmFzZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLSAgIEdyaWREYXRhIHNlcERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgIHNlcERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBzZXBEYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgc2VwTGFiZWwuc2V0TGF5b3V0RGF0YShzZXBEYXRhKTsKLSAgIAotICAgCi0gICAvLyBDcmVhdGUgUGFnZUJvb2sgYW5kIHBhZ2VzL2NvbnRyb2xzIGZvciB0aGUgUGFnZUJvb2sKLSAgIHByb3RvY29sUGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soYmFzZSwgU1dULk5PTkUpOwotCi0gICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFNvYXAgUGFnZQotICAgc29hcFBhZ2UgPSBuZXcgQ29tcG9zaXRlKHByb3RvY29sUGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgIEdyaWRMYXlvdXQgcGJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgc29hcFBhZ2Uuc2V0TGF5b3V0KHBiTGF5b3V0KTsKLQotICAgR3JpZERhdGEgcGJEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICBwYkRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgcGJEYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgc29hcFBhZ2Uuc2V0TGF5b3V0RGF0YShwYkRhdGEpOwotCi0gICBjcmVhdGVMYWJlbChzb2FwUGFnZSwgV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfTEFCRUxfU09BUF9CSU5ESU5HX09QVElPTlMiKSk7Ci0gICBkb2NMaXRSYWRpbyA9IG5ldyBCdXR0b24oc29hcFBhZ2UsIFNXVC5SQURJTyk7Ci0gICBycGNMaXRSYWRpbyA9IG5ldyBCdXR0b24oc29hcFBhZ2UsIFNXVC5SQURJTyk7Ci0gICBycGNFbmNSYWRpbyA9IG5ldyBCdXR0b24oc29hcFBhZ2UsIFNXVC5SQURJTyk7Ci0gICBkb2NMaXRSYWRpby5zZXRUZXh0KFNPQVBfRE9DVU1FTlRfTElURVJBTCk7Ci0gICBycGNMaXRSYWRpby5zZXRUZXh0KFNPQVBfUlBDX0xJVEVSQUwpOwotICAgcnBjRW5jUmFkaW8uc2V0VGV4dChTT0FQX1JQQ19FTkNPREVEKTsKLSAgIGRvY0xpdFJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgIAotICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBIdHRwIFBhZ2UKLSAgIGh0dHBQYWdlID0gbmV3IENvbXBvc2l0ZShwcm90b2NvbFBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0gICBwYkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICBodHRwUGFnZS5zZXRMYXlvdXQocGJMYXlvdXQpOwotCi0gICBwYkRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgIHBiRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBwYkRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICBodHRwUGFnZS5zZXRMYXlvdXREYXRhKHBiRGF0YSk7Ci0gICAKLSAgIGNyZWF0ZUxhYmVsKGh0dHBQYWdlLCBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9MQUJFTF9IVFRQX0JJTkRJTkdfT1BUSU9OUyIpKTsgLy8gQWxyZWFkeSBFeHRlcm5hbGl6ZWQKLSAgIGh0dHBHZXRSYWRpbyA9IG5ldyBCdXR0b24oaHR0cFBhZ2UsIFNXVC5SQURJTyk7Ci0gICBodHRwUG9zdFJhZGlvID0gbmV3IEJ1dHRvbihodHRwUGFnZSwgU1dULlJBRElPKTsKLSAgIGh0dHBHZXRSYWRpby5zZXRUZXh0KEhUVFBfR0VUKTsKLSAgIGh0dHBQb3N0UmFkaW8uc2V0VGV4dChIVFRQX1BPU1QpOwotICAgaHR0cEdldFJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgIAotICAgd3NkbFNrZWxldG9uR3JvdXAuc2V0VmlzaWJsZSh0cnVlKTsKLSAgIHNlcExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0gICBwcm90b2NvbFBhZ2VCb29rLnNob3dQYWdlKHNvYXBQYWdlKTsKLSAgIHByb3RvY29sUGFnZUJvb2suc2V0VmlzaWJsZSh0cnVlKTsKLSAgIAotICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQWRkIFNlbGVjdGlvbiBMaXN0ZW5lcnMKLSAgIGNyZWF0ZVNrZWxldG9uQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAKLS8vICAgQmluZGluZ1Byb3RvY29sQ29tcG9uZW50Q29udHJvbCBjb21wb25lbnQgPSBuZXcgQmluZGluZ1Byb3RvY29sQ29tcG9uZW50Q29udHJvbChiYXNlLCBnZW5lcmF0b3IsIGZhbHNlKTsKLS8vICAgY29tcG9uZW50LmluaXRGaWVsZHMoKTsKLSAgIAotICAgIHNldENvbnRyb2woYmFzZSk7Ci0gIH0KLQotICBwcml2YXRlIE5ld1dTRExXaXphcmQgZ2V0TmV3V1NETFdpemFyZCgpCi0gIHsKLSAgICByZXR1cm4gKE5ld1dTRExXaXphcmQpZ2V0V2l6YXJkKCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBjb21wdXRlRGVmYXVsdERlZmluaXRpb25OYW1lKCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gIkRlZmF1bHROYW1lIjsKLSAgICBJUGF0aCBwYXRoID0gZ2V0TmV3V1NETFdpemFyZCgpLmdldE5ld0ZpbGVQYXRoKCk7Ci0gICAgaWYgKHBhdGggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKS50b1N0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVEZWZhdWx0TmFtZXNwYWNlTmFtZSgpCi0gIHsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gV1NETEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9QUkVGX1BBR0VfREVGQVVMVF9UQVJHRVRfTkFNRVNQQUNFIikpOwotICAgIGlmICghbmFtZXNwYWNlLmVuZHNXaXRoKCIvIikpIHsKLSAgICAJbmFtZXNwYWNlID0gbmFtZXNwYWNlLmNvbmNhdCgiLyIpOwotICAgIH0KLSAgICAKLSAgICBJUGF0aCBwYXRoID0gZ2V0TmV3V1NETFdpemFyZCgpLmdldE5ld0ZpbGVQYXRoKCk7Ci0gICAgaWYgKHBhdGggIT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgKz0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkudG9TdHJpbmcoKSArICIvIjsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKQotICB7Ci0gICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQotICAgIGlmICh2aXNpYmxlKQotICAgIHsKLSAgICAgIC8vIHByaW1lIHRoZSBmaWVsZHMgICAgCi0gICAgICB0YXJnZXROYW1lc3BhY2VUZXh0LnNldFRleHQoY29tcHV0ZURlZmF1bHROYW1lc3BhY2VOYW1lKCkpOwotICAgICAgcHJlZml4VGV4dC5zZXRUZXh0KCJ0bnMiKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gcHJlZml4VGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREZWZpbml0aW9uTmFtZSgpCi0gIHsKLSAgCXJldHVybiBjb21wdXRlRGVmYXVsdERlZmluaXRpb25OYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gdGFyZ2V0TmFtZXNwYWNlVGV4dCkKLSAgICB7Ci0gICAgICBzdGFydERlbGF5ZWRFdmVudChlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZS53aWRnZXQgPT0gcHJlZml4VGV4dCkKLSAgICB7Ci0gICAgICBzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0gICAgfQotCWVsc2UgaWYgKGUud2lkZ2V0ID09IHByb3RvY29sQ29tYm8pIHsKLQkJLy8gVXBkYXRlIHdoYXQgcGFnZS9jb250cm9sIHdlIHNob3cgaW4gdGhlIFBhZ2VCb29rCi0JCWlmIChwcm90b2NvbENvbWJvLmdldFRleHQoKS5lcXVhbHMoIlNPQVAiKSkgewotCQkJcHJvdG9jb2xQYWdlQm9vay5zaG93UGFnZShzb2FwUGFnZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvdG9jb2xDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJIVFRQIikpIHsKLQkJCXByb3RvY29sUGFnZUJvb2suc2hvd1BhZ2UoaHR0cFBhZ2UpOwotCQl9Ci0JfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlT2NjdXJlZChPYmplY3QgYXJnMSwgT2JqZWN0IGFyZzIpCi0gIHsKLSAgICBzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpCi0gIHsKLSAgICBib29sZWFuIHJlYWR5ID0gdHJ1ZTsKLQotICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLQotICAgIC8vIHNvIHRoYXQgdGhlIHBhZ2UgZG9lc24ndCBpbW1lZGlhdGVseSBzaG93IHVwIHdpdGggYW4gZXJyb3IKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlVGV4dC5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpCi0gICAgewotICAgICAgaWYgKHJlYWR5KQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCF2YWxpZGF0ZVRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2VUZXh0LmdldFRleHQoKSkpCi0gICAgewotICAgICAgcmVhZHkgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlYWR5OwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQcmVmaXgoU3RyaW5nIHByZWZpeCkKLSAgewotICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTFByZWZpeChwcmVmaXgpOwotCi0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVhNTE5hbWUoU3RyaW5nIHhtbE5hbWUpCi0gIHsKLSAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gVmFsaWRhdGVIZWxwZXIuY2hlY2tYTUxOYW1lKHhtbE5hbWUpOwotCi0gICAgaWYgKGVycm9yTWVzc2FnZSA9PSBudWxsIHx8IGVycm9yTWVzc2FnZS5sZW5ndGgoKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBzZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVRhcmdldE5hbWVzcGFjZShTdHJpbmcgbnMpCi0gIHsKLSAgICBib29sZWFuIHRlc3QgPSB0cnVlOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSSSB0ZXN0VVJJID0gbmV3IFVSSShucyk7Ci0gICAgICAvLyAgICAgIGlmICghdGVzdFVSSS5pc0dlbmVyaWNVUkkoKSkKLSAgICAgIC8vICAgICAgewotICAgICAgLy8gICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX05BTUVTUEFDRV9JTlZBTElEIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyAgICAgICAgdGVzdCA9IGZhbHNlOwotICAgICAgLy8gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLwkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBWYWxpZGF0ZUhlbHBlci5jaGVja1hNTE5hbWUobnMpOwotICAgICAgLy8JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgfHwgZXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgICAvLwkJCXsKLSAgICAgIC8vCQkJCXRlc3QgPSB0cnVlOwotICAgICAgLy8JCQl9Ci0gICAgICAvLwkJCWVsc2UKLSAgICAgIC8vCQkJewotICAgICAgc2V0RXJyb3JNZXNzYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX05BTUVTUEFDRV9JTlZBTElEIikpOyAvLyROT04tTkxTLTEkCi0gICAgICB0ZXN0ID0gZmFsc2U7Ci0gICAgICAvLwkJCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gdGVzdDsKLSAgfQotCi0gIC8qCi0gIHByaXZhdGUgYm9vbGVhbiBhcmVQcmVmaXhlc1VuaXF1ZUFuZFZhbGlkKCkKLSAgewotICAgIGphdmEudXRpbC5MaXN0IGluZm9MaXN0ID0gbmFtZXNwYWNlSW5mby5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotICAgIGphdmEudXRpbC5MaXN0IGNoZWNrZWRMaXN0ID0gbmFtZXNwYWNlSW5mby5nZXROYW1lc3BhY2VDaGVja2VkTGlzdCgpOwotCi0gICAgVmVjdG9yIHByZWZpeExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgYm9vbGVhbiB0ZXN0ID0gdHJ1ZTsKLSAgICBib29sZWFuIGlzT25lQmxhbmsgPSBmYWxzZTsKLQotICAgIFN0cmluZyBjdXJyZW50UHJlZml4ID0gcHJlZml4VGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgIGlmIChjdXJyZW50UHJlZml4Lmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgaXNPbmVCbGFuayA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdGVQcmVmaXgoY3VycmVudFByZWZpeCkpCi0gICAgICB7Ci0gICAgICAgIHByZWZpeExpc3QuYWRkKGN1cnJlbnRQcmVmaXgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfUFJFRklYX0lTX0lOVkFMSUQiLCBjdXJyZW50UHJlZml4KSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mb0xpc3Quc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paW5mb0xpc3QuZ2V0KGkpOwotICAgICAgaWYgKCgoU3RyaW5nKWNoZWNrZWRMaXN0LmdldChpKSkuZXF1YWxzKCJ0cnVlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGFQcmVmaXggPSBpbmZvLnByZWZpeC50cmltKCk7Ci0gICAgICAgIGlmIChhUHJlZml4Lmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghcHJlZml4TGlzdC5jb250YWlucyhhUHJlZml4KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsaWRhdGVQcmVmaXgoYVByZWZpeCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByZWZpeExpc3QuYWRkKGFQcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfUFJFRklYX0lTX0lOVkFMSUQiLCBpbmZvLnByZWZpeCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIHRlc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfUFJFRklYX0lTX0FfRFVQTElDQVRFIiwgaW5mby5wcmVmaXgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdGVzdCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNPbmVCbGFuaykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpc09uZUJsYW5rID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9FUlJPUl9NT1JFX1RIQU5fT05FX1BSRUZJWF9JU19CTEFOSyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdGVzdCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0ZXN0OwotICB9Ci0gICovCi0KLSAgcHJvdGVjdGVkIERlbGF5ZWRFdmVudCBkZWxheWVkVGFzazsKLSAgcHJvdGVjdGVkIHZvaWQgc3RhcnREZWxheWVkRXZlbnQoTW9kaWZ5RXZlbnQgZSkKLSAgewotICAgIGlmIChkZWxheWVkVGFzayA9PSBudWxsIHx8IGRlbGF5ZWRUYXNrLmdldEV2ZW50KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWxheWVkVGFzayA9IG5ldyBEZWxheWVkRXZlbnQoKTsKLSAgICAgIGRlbGF5ZWRUYXNrLnNldEV2ZW50KGUpOwotICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkudGltZXJFeGVjKDUwMCwgZGVsYXllZFRhc2spOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTW9kaWZ5RXZlbnQgZGVsYXllZEV2ZW50ID0gZGVsYXllZFRhc2suZ2V0RXZlbnQoKTsKLQotICAgICAgaWYgKGUud2lkZ2V0ID09IGRlbGF5ZWRFdmVudC53aWRnZXQpCi0gICAgICB7Ci0gICAgICAgIC8vIHNhbWUgZXZlbnQsIGp1c3QgZGlmZmVyZW50IGRhdGEsIGRlbGF5IG5ldyBldmVudAotICAgICAgICBkZWxheWVkVGFzay5zZXRFdmVudChudWxsKTsKLSAgICAgIH0KLSAgICAgIGRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotICAgICAgZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0gICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgRGVsYXllZEV2ZW50IGltcGxlbWVudHMgUnVubmFibGUKLSAgewotICAgIHByb3RlY3RlZCBNb2RpZnlFdmVudCBldmVudDsKLQotICAgIC8qCi0gICAgICogQHNlZSBSdW5uYWJsZSNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgewotICAgICAgaWYgKGV2ZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgICAgICAgZXZlbnQgPSBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNb2RpZnlFdmVudCBnZXRFdmVudCgpCi0gICAgewotICAgICAgcmV0dXJuIGV2ZW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50KE1vZGlmeUV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICB9Ci0KLSAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAJIGlmIChlLndpZGdldCA9PSBjcmVhdGVTa2VsZXRvbkNoZWNrQm94KSB7Ci0gIAkgCWlmIChjcmVhdGVTa2VsZXRvbkNoZWNrQm94LmdldFNlbGVjdGlvbigpKSB7Ci0gIAkgCQl3c2RsU2tlbGV0b25Hcm91cC5zZXRWaXNpYmxlKHRydWUpOwotICAJIAkJc2VwTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLSAgCSAJCXByb3RvY29sUGFnZUJvb2suc2V0VmlzaWJsZSh0cnVlKTsKLSAgCSAJfQotICAJIAllbHNlIHsKLSAgCSAJCXdzZGxTa2VsZXRvbkdyb3VwLnNldFZpc2libGUoZmFsc2UpOwotICAJIAkJc2VwTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gIAkgCQlwcm90b2NvbFBhZ2VCb29rLnNldFZpc2libGUoZmFsc2UpOwotICAJIAl9Ci0gIAkgfQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9QUk9UT0NPTCA9ICJTT0FQIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiSFRUUCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX1JQQ19FTkNPREVEID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUkFESU9fUlBDX0VOQ09ERUQiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfUlBDX0xJVEVSQUwgPSBXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9SQURJT19SUENfTElURVJBTCIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9ET0NVTUVOVF9MSVRFUkFMID0gV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfUkFESU9fRE9DVU1FTlRfTElURVJBTCIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9QT1NUID0gIkhUVFAgUE9TVCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0dFVCA9ICJIVFRQIEdFVCI7Ci0KLSAgQ29tcG9zaXRlIHdzZGxTa2VsZXRvbkdyb3VwOwotICBCdXR0b24gY3JlYXRlU2tlbGV0b25DaGVja0JveDsKLSAgCi0gIExhYmVsIHNlcExhYmVsOwotICAKLSAgcHJpdmF0ZSBUZXh0IGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgY29tcCkgewotICAgIFRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQoY29tcCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIEdyaWREYXRhIHRleHREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgdGV4dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgdGV4dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgdGV4dERhdGEud2lkdGhIaW50ID0gMTA7Ci0gICAgdGV4dEZpZWxkLnNldExheW91dERhdGEodGV4dERhdGEpOwotCi0gIAlyZXR1cm4gdGV4dEZpZWxkOwotICB9Ci0gIAotICBwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb21wLCBTdHJpbmcgbGFiZWxTdHJpbmcpIHsKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTEVGVCk7Ci0gICAgbGFiZWwuc2V0VGV4dChsYWJlbFN0cmluZyk7Ci0gICAgR3JpZERhdGEgbnNEYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgbnNEYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEobnNEYXRhKTsKLSAgICAKLSAgICByZXR1cm4gbGFiZWw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgY29tcG9zaXRlLnNldEZvbnQobmV3IEZvbnQoRGlzcGxheS5nZXRDdXJyZW50KCksICJtcyBzYW5zIHNlcmlmIiwgOCwgU1dULk5PUk1BTCkpOwotCi0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICByZXR1cm4gY29tcG9zaXRlOwotICB9Ci0gIAotICBwdWJsaWMgVmVjdG9yIGdldE5hbWVzcGFjZUluZm8oKSB7Ci0JCVZlY3RvciBuYW1lc3BhY2VzID0gbmV3IFZlY3RvcigpOwotICAJCQotICAJCS8vIEFkZCBEZWZhdWx0IE5hbWVzcGFjZXMKLQkJTmFtZXNwYWNlSW5mbyBpbmZvMSA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCWluZm8xLnByZWZpeCA9ICJ3c2RsIjsKLQkJaW5mbzEudXJpID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIjsKLQkJbmFtZXNwYWNlcy5hZGRFbGVtZW50KGluZm8xKTsKLQkJCi0JCU5hbWVzcGFjZUluZm8gaW5mbzggPSBuZXcgTmFtZXNwYWNlSW5mbygpOwotCQlpbmZvOC5wcmVmaXggPSAieHNkIjsKLQkJaW5mbzgudXJpID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQkJbmFtZXNwYWNlcy5hZGRFbGVtZW50KGluZm84KTsKLQkJCi0JCXJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBnZXRDcmVhdGVTa2VsZXRvbkJvb2xlYW4oKSB7Ci0gIAlyZXR1cm4gY3JlYXRlU2tlbGV0b25DaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKLSAgCXJldHVybiBwcm90b2NvbENvbWJvLmdldFRleHQoKTsKLSAgfQotICAKLSAgcHVibGljIE9iamVjdFtdIGdldFByb3RvY29sT3B0aW9ucygpIHsKLSAgCU9iamVjdCBib29sW10gPSBuZXcgQm9vbGVhblszXTsKLSAgCWlmIChwcm90b2NvbENvbWJvLmdldFRleHQoKS5lcXVhbHMoU09BUF9QUk9UT0NPTCkpIHsKLSAgCQlpZiAoZG9jTGl0UmFkaW8uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgCQkJYm9vbFswXSA9IG5ldyBCb29sZWFuKHRydWUpOwotICAJCX0KLSAgCQllbHNlIHsKLSAgCQkJYm9vbFswXSA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLSAgCQl9Ci0gIAkJCi0gIAkJaWYgKHJwY0xpdFJhZGlvLmdldFNlbGVjdGlvbigpKSB7Ci0gIAkJCWJvb2xbMl0gPSBuZXcgQm9vbGVhbih0cnVlKTsKLSAgCQl9Ci0gIAkJZWxzZSB7Ci0gIAkJCWJvb2xbMl0gPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0gIAkJfQotICAJfQotICAJZWxzZSBpZiAocHJvdG9jb2xDb21iby5nZXRUZXh0KCkuZXF1YWxzKEhUVFBfUFJPVE9DT0wpKXsKLSAgCQlpZiAoaHR0cEdldFJhZGlvLmdldFNlbGVjdGlvbigpKSB7Ci0gIAkJCWJvb2xbMF0gPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0gIAkJfQotICAJCWVsc2UgewotICAJCQlib29sWzBdID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0gIAkJfQotICAJfQotICAJCi0gIAlyZXR1cm4gYm9vbDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNTb2FwRG9jTGl0ZXJhbFByb3RvY29sKCkgewotICAJaWYgKGdldFByb3RvY29sKCkuZXF1YWxzKFNPQVBfUFJPVE9DT0wpICYmIGRvY0xpdFJhZGlvLmdldFNlbGVjdGlvbigpKSB7Ci0gIAkJcmV0dXJuIHRydWU7Ci0gIAl9Ci0gIAllbHNlIHsKLSAgCQlyZXR1cm4gZmFsc2U7Ci0gIAl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC93aXphcmRzL1dTRExOZXdGaWxlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2Q4ZTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3dpemFyZHMvV1NETE5ld0ZpbGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuV1NETEVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIFdTRExOZXdGaWxlUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UKLXsKLSAgcHVibGljIFdTRExOZXdGaWxlUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIAotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfTkVXX1dTRExfRklMRSIpLCBzZWxlY3Rpb24pOyAvLyROT04tTkxTLTEkCi0gICAgc2V0VGl0bGUoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfVElUTEVfTkVXX1dTRExfRklMRSIpKTsgLy8kTk9OLU5MUy0xJAotICAgIHNldERlc2NyaXB0aW9uKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0xBQkVMX0NSRUFURV9ORVdfV1NETF9GSUxFIikpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgLy8gaW5oZXJpdCBkZWZhdWx0IGNvbnRhaW5lciBhbmQgbmFtZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMKLSAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgdGhpcy5zZXRGaWxlTmFtZShjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkpOwotCi0gICAgc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkKLSAgewotICAgIFBhdGggbmV3TmFtZSA9IG5ldyBQYXRoKGdldEZpbGVOYW1lKCkpOwotICAgIFN0cmluZyBmdWxsRmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotICAgIFN0cmluZyBleHRlbnNpb24gPSBuZXdOYW1lLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwgfHwgIWV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJ3c2RsIikpICAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0VSUk9SX0ZJTEVfTVVTVF9FTkRfV0lUSF9XU0RMIikpOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIH0KLQotICAgIC8vIGNoZWNrIGZvciBmaWxlIHNob3VsZCBiZSBjYXNlIGluc2Vuc2l0aXZlCi0gICAgU3RyaW5nIHNhbWVOYW1lID0gZXhpc3RzRmlsZUFueUNhc2UoZnVsbEZpbGVOYW1lKTsKLSAgICBpZiAoc2FtZU5hbWUgIT0gbnVsbCkgCi0gICAgewotICAgICAgIFN0cmluZyBxdWFsaWZpZWRGaWxlTmFtZSA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGZ1bGxGaWxlTmFtZTsKLSAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyIsICBzYW1lTmFtZSkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIAotICAgIHJldHVybiBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdE5hbWUgPSAiTmV3V1NETEZpbGUiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmcgZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLndzZGwiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zID0geyAiKi53c2RsIn07IC8vJE5PTi1OTFMtMSQKLQotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIFN0cmluZyBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0gICAgSVBhdGggY29udGFpbmVyRnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgIGlmIChjb250YWluZXJGdWxsUGF0aCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdoaWxlICh0cnVlKQotICAgICAgewotICAgICAgICBJUGF0aCBwYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLSAgICAgICAgLy8gaWYgKFdvcmtiZW5jaFV0aWxpdHkuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmV4aXN0cyhwYXRoKSkKLSAgICAgICAgaWYgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKHBhdGgpKQotICAgICAgICB7Ci0gICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgY291bnQgKyBkZWZhdWx0RmlsZUV4dGVuc2lvbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmlsZU5hbWU7Ci0gIH0KLQotICAvLyByZXR1cm5zIHRydWUgaWYgZmlsZSBvZiBzcGVjaWZpZWQgbmFtZSBleGlzdHMgaW4gYW55IGNhc2UgZm9yIHNlbGVjdGVkIGNvbnRhaW5lcgotICBwcm90ZWN0ZWQgU3RyaW5nIGV4aXN0c0ZpbGVBbnlDYXNlKFN0cmluZyBmaWxlTmFtZSkKLSAgewotICAgIGlmICggKGdldENvbnRhaW5lckZ1bGxQYXRoKCkgIT0gbnVsbCkgJiYgKGdldENvbnRhaW5lckZ1bGxQYXRoKCkuaXNFbXB0eSgpID09IGZhbHNlKQotICAgICAgICAgICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKQotICAgIHsKLSAgICAgIC8vbG9vayB0aHJvdWdoIGFsbCByZXNvdXJjZXMgYXQgdGhlIHNwZWNpZmllZCBjb250YWluZXIgLSBjb21wYXJlIGluIHVwcGVyIGNhc2UKLSAgICAgIElSZXNvdXJjZSBwYXJlbnQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICAgIHsKLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGFyZW50OwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotICAgICAgICAgIFN0cmluZyBlbnRlcmVkRmlsZVVwcGVyID0gZmlsZU5hbWUudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VVcHBlck5hbWUgPSBtZW1iZXJzW2ldLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlVXBwZXJOYW1lLmVxdWFscyhlbnRlcmVkRmlsZVVwcGVyKSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyc1tpXS5nZXROYW1lKCk7ICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRERldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRERldGFpbHNWaWV3ZXJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzM2MDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0REZXRhaWxzVmlld2VyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLQotCi0KLXB1YmxpYyBjbGFzcyBYU0REZXRhaWxzVmlld2VyUHJvdmlkZXIgLy8gaW1wbGVtZW50cyBJRGV0YWlsc1ZpZXdlclByb3ZpZGVyCi17Ci0vLyAgcHVibGljIE9iamVjdCBnZXRWaWV3ZXJLZXkoT2JqZWN0IG1vZGVsT2JqZWN0KQotLy8gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vICAgIE9iamVjdCByZXN1bHQgPSBudWxsOyAgIAotLy8KLS8vICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotLy8gICAgewotLy8gICAgICBFbGVtZW50IGlucHV0ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpOwotLy8KLS8vICAgICAgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImVsZW1lbnQiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRUxFTUVOVF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiZWxlbWVudFJlZiI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0vLyAgICAgICAgICAgICAgICBpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkNIT0lDRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0vLyAgICAgICAgICAgICAgICBpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFMTF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInNlcXVlbmNlQ2hvaWNlQWxsIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImF0dHJpYnV0ZSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImF0dHJpYnV0ZVJlZiI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImF0dHJpYnV0ZUdyb3VwIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCB0cnVlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJhdHRyaWJ1dGVHcm91cFJlZiI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5OT1RBVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gIm5vdGF0aW9uIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiZ3JvdXAiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImdyb3VwUmVmIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInNjaGVtYSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImNvbXBsZXhUeXBlIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJkb2N1bWVudGF0aW9uIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJhcHBJbmZvIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClpbnB1dDsKLS8vICAgICAgICAgIFhTRERPTUhlbHBlciB4c2RET01IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0vLyAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChwYXJlbnRFbGVtZW50KTsKLS8vICAgICAgICAgIGlmIChkZXJpdmVkQnlOb2RlICE9IG51bGwpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIGlmIChpbnB1dEVxdWFscyhkZXJpdmVkQnlOb2RlLCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgICAgICAgewotLy8gICAgICAgICAgICAgIHJlc3VsdCA9ICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhkZXJpdmVkQnlOb2RlLCBYU0RDb25zdGFudHMuRVhURU5TSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICByZXN1bHQgPSAic2ltcGxlQ29udGVudCI7Ci0vLyAgICAgICAgICAgIH0KLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcmVzdWx0ID0gInhzZCI7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRWxlbWVudCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClpbnB1dDsKLS8vICAgICAgICAgIFhTRERPTUhlbHBlciB4c2RET01IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0vLyAgICAgICAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChwYXJlbnRFbGVtZW50KTsKLS8vICAgICAgICAgIGlmIChkZXJpdmVkQnlOb2RlICE9IG51bGwpCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJlc3VsdCA9ICJzaW1wbGVDb250ZW50IjsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIGVsc2UKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcmVzdWx0ID0gInhzZCI7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuSU5DTFVERV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImluY2x1ZGVYU0QiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuSU1QT1JUX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiaW1wb3J0WFNEIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlJFREVGSU5FX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAicmVkZWZpbmUiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gInNpbXBsZUJhc2UiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuVU5JT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJzaW1wbGVCYXNlIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSBnZXRLZXlGb3JSZXN0cmljdFdpbmRvdyhpbnB1dCk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoWFNERE9NSGVscGVyLmlzRmFjZXQoaW5wdXQpKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIE5vZGUgcGFyZW50RWxlbWVudCA9ICgoRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50Tm9kZSgpOwotLy8gICAgICAgICAgaWYgKGlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5SRVNUUklDVElPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXN1bHQgPSBnZXRLZXlGb3JSZXN0cmljdFdpbmRvdyhpbnB1dCk7Ci0vLyAgICAgICAgICB9IAotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkVYVEVOU0lPTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIE5vZGUgcGFyZW50RWxlbWVudCA9ICgoRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50Tm9kZSgpOwotLy8gICAgICAgICAgaWYgKGlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXN1bHQgPSAic2ltcGxlQ29udGVudCI7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhwYXJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICByZXN1bHQgPSAic2ltcGxlQ29udGVudCI7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgICBlbHNlCi0vLyAgICAgICAgICB7Ci0vLyAgICAgICAgICAgIHJlc3VsdCA9ICJ4c2QiOyAgICAgICAgICAgIAotLy8gICAgICAgICAgfQotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlBBVFRFUk5fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJwYXR0ZXJuIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkVOVU1FUkFUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAiZW51bSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BTllfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJhbnlFbGVtZW50IjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFOWUFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotLy8gICAgICB7Ci0vLyAgICAgICAgcmVzdWx0ID0gImFueUF0dHJpYnV0ZSI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5VTklRVUVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJ1bmlxdWUiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuS0VZUkVGX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAia2V5UmVmIjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlNFTEVDVE9SX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXN1bHQgPSAic2VsZWN0b3IiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRklFTERfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJmaWVsZCI7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5LRVlfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJrZXkiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UKLS8vICAgICAgewotLy8gICAgICAgIHJlc3VsdCA9ICJ4c2QiOwotLy8gICAgICB9ICAgICAgCi0vLyAgICB9ICAKLS8vICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0vLyAgICB7Ci0vLyAgICAgIHJlc3VsdCA9ICJzY2hlbWEiOwotLy8gICAgfQotLy8KLS8vICAgIHJldHVybiByZXN1bHQ7Ci0vLyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS8vCi0vLwotLy8gIHB1YmxpYyBWaWV3ZXIgY3JlYXRlVmlld2VyKE9iamVjdCBtb2RlbE9iamVjdCwgQ29tcG9zaXRlIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCkKLS8vICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLyAgICBWaWV3ZXIgdmlld2VyID0gbnVsbDsKLS8vCi0vLyAgICAKLS8vICAgIERlc2lnblZpZXdlciBkZXNpZ25WaWV3ZXIgPSBuZXcgRGVzaWduVmlld2VyKGVkaXRvclBhcnQpOwotLy8gICAgZGVzaWduVmlld2VyLnNldENvbnRyb2wocGFyZW50KTsgICAgCi0vLyAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLS8vICAgIHsKLS8vICAgICAgRWxlbWVudCBlbGVtID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudCltb2RlbE9iamVjdCkuZ2V0RWxlbWVudCgpOwotLy8gICAgICB2aWV3ZXIgPSBkZXNpZ25WaWV3ZXIuY3JlYXRlVmlld2VyKGVsZW0pOwotLy8vL1RPRE8gcG9ydAotLy8vLyAgICAgICgoQmFzZVdpbmRvdyl2aWV3ZXIpLnNldE1vZGVsT2JqZWN0KG1vZGVsT2JqZWN0KTsKLS8vLy8gICAgICB2aWV3ZXIuc2V0SW5wdXQoZWxlbSk7Ci0vLyAgICB9Ci0vLyAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotLy8gICAgewotLy8gICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBzY2hlbWEgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbW9kZWxPYmplY3Q7Ci0vLyAgICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBzY2hlbWEuZ2V0U2NoZW1hKCk7Ci0vLyAgICAgIEVsZW1lbnQgZWxlbSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0vLyAgICAgIHZpZXdlciA9IGRlc2lnblZpZXdlci5jcmVhdGVWaWV3ZXIoZWxlbSk7Ci0vLy8vVE9ETyBwb3J0Ci0vLy8vICAgICAgKChCYXNlV2luZG93KXZpZXdlcikuc2V0TW9kZWxPYmplY3QobW9kZWxPYmplY3QpOwotLy8vLyAgICAgIHZpZXdlci5zZXRJbnB1dChlbGVtKTsgICAgICAKLS8vICAgIH0KLS8vICAgIHJldHVybiB2aWV3ZXI7Ci0vLyAgfQotLy8KLS8vICBwcm90ZWN0ZWQgYm9vbGVhbiBpbnB1dEVxdWFscyhPYmplY3QgaW5wdXQsIFN0cmluZyB0YWduYW1lLCBib29sZWFuIGlzUmVmKQotLy8gIHsKLS8vICAgIHJldHVybiBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoaW5wdXQsIHRhZ25hbWUsIGlzUmVmKTsKLS8vICB9Ci0vLwotLy8gIHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5Rm9yUmVzdHJpY3RXaW5kb3coT2JqZWN0IGlucHV0KQotLy8gIHsKLS8vICAgIC8vIHNwZWNpYWwgY2FzZSB3aGVyZSBTaW1wbGVUeXBlIHJlc3RyaWN0aW9uIGlzIGRpZmZlcmVudCB0aGFuIFNpbXBsZUNvbnRlbnQgcmVzdHJpY3Rpb24KLS8vCi0vLyAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0vLyAgICB7Ci0vLyAgICAgIE5vZGUgcGFyZW50RWxlbWVudCA9ICgoRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50Tm9kZSgpOwotLy8gICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50RWxlbWVudCwgWFNEQ29uc3RhbnRzLlNJTVBMRVRZUEVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJldHVybiAic2ltcGxlUmVzdHJpY3QiOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudEVsZW1lbnQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICByZXR1cm4gInNpbXBsZVJlc3RyaWN0IjsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhwYXJlbnRFbGVtZW50LCBYU0RDb25zdGFudHMuQ09NUExFWENPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLS8vICAgICAgewotLy8gICAgICAgIHJldHVybiAic2ltcGxlQ29udGVudCI7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICAgIHJldHVybiAieHNkIjsKLS8vICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhODQwZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTREV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0vLyBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyOwotLy8gaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotLy8gaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5XU0RMRWRpdG9yRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLlhTREVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLm1vZGVsLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuQ2F0ZWdvcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbmNyZXRlQ29tcG9uZW50OwotCi0KLS8vCi0vLwotcHVibGljIGNsYXNzIFhTREV4dGVuc2lvbiBpbXBsZW1lbnRzIFdTRExFZGl0b3JFeHRlbnNpb24KLXsKLSAgWFNETW9kZWxBZGFwdGVyRmFjdG9yeUltcGwgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeTsKLSAgWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLSAgCi0gIHB1YmxpYyBYU0RFeHRlbnNpb24oKQotICB7Ci0gICAgeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSA9IG5ldyBYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotICAgIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciA9IG5ldyBYU0RBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uVHlwZVN1cHBvcnRlZChpbnQgdHlwZSkKLSAgewotICAgIHJldHVybiAKLSAgICAgICAgICAgLy9DUyBjb21tZW50IHRoZXNlIG91dCB1bnRpbCB0aGUgcG9ydCBpcyBjb21wbGV0ZQotICAgICAgICAgICB0eXBlID09IE9VVExJTkVfVFJFRV9DT05URU5UX1BST1ZJREVSIHx8IAotICAgICAgICAgICB0eXBlID09IE9VVExJTkVfTEFCRUxfUFJPVklERVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBQUk9QRVJUWV9TT1VSQ0VfUFJPVklERVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBQUk9QRVJUWV9TRUNUSU9OX0RFU0NSSVBUT1JfUFJPVklERVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBNRU5VX0FDVElPTl9DT05UUklCVVRPUiB8fAotICAgICAgICAgICB0eXBlID09IERFVEFJTFNfVklFV0VSX1BST1ZJREVSIHx8Ci0gICAgICAgICAgIHR5cGUgPT0gRURJVF9QQVJUX0ZBQ1RPUlkgfHwgCi0gICAgICAgICAgIHR5cGUgPT0gVFlQRV9TWVNURU1fUFJPVklERVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBOT0RFX1JFQ09OQ0lMRVIgfHwKLSAgICAgICAgICAgdHlwZSA9PSBOT0RFX0FTU09DSUFUSU9OX1BST1ZJREVSIHx8Ci0gICAgICAgICAgIHR5cGUgPT0gTU9ERUxfUVVFUllfQ09OVFJJQlVUT1I7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc0FwcGxpY2FibGUoT2JqZWN0IG9iamVjdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiAob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgfHwgCi0gICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCB8fAotICAgICAgICAgICAgb2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyIHx8Ci0gICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeSk7Ci0gICAgICAgICAgICAvLyB8fCBvYmplY3QgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXIpOwotICB9IAotCi0gIHB1YmxpYyBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uT2JqZWN0KGludCB0eXBlLCBXU0RMRWRpdG9yIHdzZGxFZGl0b3IpCi0gIHsKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKLSAgICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgICAgY2FzZSBPVVRMSU5FX1RSRUVfQ09OVEVOVF9QUk9WSURFUiA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBYU0RNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIoeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7IAotLy8gICAgICAgIHJlc3VsdCA9IG5ldyBYU0RNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgLy8gcmVzdWx0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKFhTREV4dGVuc2lvblBsdWdpbi5nZXRYU0RTZW1hbnRpY0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgT1VUTElORV9MQUJFTF9QUk9WSURFUiA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBYU0RMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcik7Ci0gICAgICAgIC8vIHJlc3VsdCA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoWFNERXh0ZW5zaW9uUGx1Z2luLmdldFhTRFNlbWFudGljSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBERVRBSUxTX1ZJRVdFUl9QUk9WSURFUiA6Ci0gICAgICB7Ci0gICAgICAgIC8vIHJlc3VsdCA9IG5ldyBYU0REZXRhaWxzVmlld2VyUHJvdmlkZXIoKTsKLSAgICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE1FTlVfQUNUSU9OX0NPTlRSSUJVVE9SIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTRE1lbnVBY3Rpb25Db250cmlidXRvcih3c2RsRWRpdG9yKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFRZUEVfU1lTVEVNX1BST1ZJREVSIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTRFR5cGVTeXN0ZW1Qcm92aWRlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gICAgCi0gICAgICBjYXNlIEVESVRfUEFSVF9GQUNUT1JZIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTREV4dGVuc2lvbkVkaXRQYXJ0RmFjdG9yeSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTk9ERV9SRUNPTkNJTEVSIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTRE5vZGVSZWNvbmNpbGVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgIAotICAgICAgY2FzZSBOT0RFX0FTU09DSUFUSU9OX1BST1ZJREVSIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IFhTRE5vZGVBc3NvY2lhdGlvblByb3ZpZGVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSAgCi0gICAgICBjYXNlIE1PREVMX1FVRVJZX0NPTlRSSUJVVE9SIDoKLSAgICAgIHsKLSAgICAgICAgLy9yZXN1bHQgPSBuZXcgWFNETW9kZWxRdWVyeUNvbnRyaWJ1dG9yKHdzZGxFZGl0b3IpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUFJPUEVSVFlfU09VUkNFX1BST1ZJREVSOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgUFJPUEVSVFlfU0VDVElPTl9ERVNDUklQVE9SX1BST1ZJREVSOgotICAgICAgewotICAgICAgICByZXN1bHQgPSBuZXcgWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgWFNEX0RFTEVURV9BQ1RJT046Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IG5ldyBEZWxldGVBY3Rpb24oWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9ERUxFVEUiKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb25FZGl0UGFydEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RFeHRlbnNpb25FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNTBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNERXh0ZW5zaW9uRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmdyYXBoLmVkaXRwYXJ0cy5YU0RTY2hlbWFEcmlsbERvd25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmdyYXBoLmVkaXRwYXJ0cy5YU0RFZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIFhTREV4dGVuc2lvbkVkaXRQYXJ0RmFjdG9yeSBleHRlbmRzIFhTREVkaXRQYXJ0RmFjdG9yeQotewotICBwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgcGFyZW50LCBPYmplY3QgbW9kZWwpCi0gIHsKLSAgICBFZGl0UGFydCBlZGl0UGFydCA9IG51bGw7Ci0gICAgICAgICAgICAKLSAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBYU0RTY2hlbWEgJiYgcGFyZW50LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXU0RMR3JvdXBPYmplY3QpCi0gICAgeyAgICAgICAgIAotICAgICAgZWRpdFBhcnQgPSBuZXcgWFNEU2NoZW1hRHJpbGxEb3duRWRpdFBhcnQoKTsKLSAgICAgIGVkaXRQYXJ0LnNldE1vZGVsKG1vZGVsKTsKLSAgICAgIGVkaXRQYXJ0LnNldFBhcmVudChwYXJlbnQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZWRpdFBhcnQgPSBzdXBlci5jcmVhdGVFZGl0UGFydChwYXJlbnQsIG1vZGVsKTsKLSAgICB9Ci0gCi0gICAgcmV0dXJuIGVkaXRQYXJ0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRExhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YjExMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvdmlkZXIuWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotCi0vKioKLSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgWFNETGFiZWxQcm92aWRlciBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIG9uZSBpbiBYU0RFZGl0b3IuCi0gKiBUaGlzIHByb3ZpZGVyIG9ubHkgbmVlZHMgdG8gaGFuZGxlIG5vZGVzIGluIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZS4KLSAqIE90aGVyIFhNTCBub2RlcyAoaW5jbHVkaW5nIGNvbW1lbnRzLCBQSXMgZXRjKSBnZXQgaGFuZGxlZCBieSB0aGUgJ21haW4nIHByb3ZpZGVyLgotICovCi1wdWJsaWMgY2xhc3MgWFNETGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLXsKLSAgWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSUxhYmVsUHJvdmlkZXJDbGFzcyA9IElMYWJlbFByb3ZpZGVyLmNsYXNzOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBYU0RMYWJlbFByb3ZpZGVyLgotICAgKi8KLSAgcHVibGljIFhTRExhYmVsUHJvdmlkZXIoWFNEQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcikKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgdGhpcy5hZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgPSBhZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0gIH0KLSAgCi0gIC8qCi0gICAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQotICAgKi8KLSAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBhZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gIH0KLSAgICAKLSAgLyoKLSAgICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkKLSAgewotICAgIC8vIG92ZXJyaWRlIHRleHQgZm9yIHhzZCBzY2hlbWEKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFhTRFNjaGVtYSkKLSAgICB7Ci0gICAgICByZXR1cm4gKChYU0RTY2hlbWEpZWxlbWVudCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgCS8vIFdlIGRvbid0IGNhbGwgImFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpIiBiZWNhdXNlIGl0IHdpbGwgcmV0dXJuIGEgb2JqZWN0LnRvU3RyaW5nKCkgaWYKLSAgICAJLy8gdGhlcmUgaXMgbm8gbGFiZWxQcm92aWRlci4uLi4gIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgdGhpcyAnZ2FyYmFnZScgaW5mbyB0byB0aGUgdXNlci4gICAgCQotICAgIAlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5nZXRBZGFwdGVyRmFjdG9yeSgpOwotICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gKElMYWJlbFByb3ZpZGVyKWFkYXB0ZXJGYWN0b3J5LmFkYXB0KGVsZW1lbnQsIElMYWJlbFByb3ZpZGVyQ2xhc3MpOwotICAgICAgICBTdHJpbmcgdGV4dCA9ICIiOwotICAgICAgICBpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgIAl0ZXh0ID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gdGV4dDsKLSAgICB9Ci0gIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNZW51QWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhZjVhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETWVudUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLldTRExFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklNZW51QWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguV1NETENvbXBvbmVudFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5tb2RlbC5XU0RMR3JvdXBPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmFjdGlvbnMuQWRkU2NoZW1hQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5hY3Rpb25zLkJhY2tBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNETWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVFbGVtZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuYWN0aW9ucy5DcmVhdGVHcm91cEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLmFjdGlvbnMuRE9NQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZWRpdHBhcnRzLkFic3RyYWN0Q29tcG9uZW50Vmlld2VyUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLlRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBYU0RNZW51QWN0aW9uQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJTWVudUFjdGlvbkNvbnRyaWJ1dG9yCi17Ci0gIEVsZW1lbnQgY3VyckVsZW1lbnQ7Ci0gIERvY3VtZW50IGN1cnJEb2N1bWVudDsKLSAgWFNEU2NoZW1hIHhzZFNjaGVtYTsKLS8vICBwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIGlTZWxlY3Rpb25Qcm92aWRlcjsKLSAgV1NETEVkaXRvciB3c2RsRWRpdG9yOwotCi0gIHB1YmxpYyBYU0RNZW51QWN0aW9uQ29udHJpYnV0b3IoV1NETEVkaXRvciB3c2RsRWRpdG9yKQotICB7Ci0gICAgdGhpcy53c2RsRWRpdG9yID0gd3NkbEVkaXRvcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWFuYWdlciwgTm9kZSBub2RlLCBPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgWFNETWVudUV4dGVuc2lvbkxpc3RlbmVyIHhzZE1lbnVMaXN0ZW5lciA9IG5ldyBYU0RNZW51RXh0ZW5zaW9uTGlzdGVuZXIod3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkpOwotICAgIHhzZE1lbnVMaXN0ZW5lci5jb250cmlidXRlTWVudUFjdGlvbnMobWFuYWdlciwgbm9kZSwgb2JqZWN0KTsKLSAgfQotCi0gIGNsYXNzIFhTRE1lbnVFeHRlbnNpb25MaXN0ZW5lciBleHRlbmRzIFhTRE1lbnVMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIFhTRE1lbnVFeHRlbnNpb25MaXN0ZW5lcihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIpCi0gICAgewotICAgICAgc3VwZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVNZW51QWN0aW9ucyhJTWVudU1hbmFnZXIgbWFuYWdlciwgTm9kZSBub2RlLCBPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIHVwZGF0ZVhTRFNjaGVtYSgpOwotICAgICAgQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgZWRpdFBhcnQgPSAoQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQpd3NkbEVkaXRvci5nZXRHcmFwaFZpZXdlcigpLmdldENvbXBvbmVudFZpZXdlcigpLmdldFJvb3RFZGl0UGFydCgpLmdldENvbnRlbnRzKCk7Ci0vLyAgICBpU2VsZWN0aW9uUHJvdmlkZXIgPSAoKFdTRExDb250ZW50T3V0bGluZVBhZ2UpKHdzZGxFZGl0b3IuZ2V0V1NETFRleHRFZGl0b3IoKS5nZXRDb250ZW50T3V0bGluZVBhZ2UoKSkpLmdldFRyZWVWaWV3ZXIoKTsKLSAgICAgIEVkaXRQYXJ0IGZvY3VzRWRpdFBhcnQgPSB3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkuZ2V0Q29tcG9uZW50Vmlld2VyKCkuZ2V0Rm9jdXNFZGl0UGFydCgpOwotCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgV1NETEdyb3VwT2JqZWN0KQotICAgICAgewotICAgICAgICBXU0RMR3JvdXBPYmplY3QgZ3JvdXAgPSAoV1NETEdyb3VwT2JqZWN0KW9iamVjdDsKLSAgICAgICAgaWYgKGdyb3VwLmdldFR5cGUoKSA9PSBXU0RMR3JvdXBPYmplY3QuVFlQRVNfR1JPVVApCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIHR5cGVzRXhpc3QgPSBncm91cC5nZXRQYXJlbnQoKS5nZXRUeXBlcygpICE9IG51bGw7Ci0gICAgICAgICAgCi0gICAgICAgICAgRWxlbWVudCB0eXBlc0VsZW1lbnQgPSBudWxsOwotICAgICAgICAgIGlmICh0eXBlc0V4aXN0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFR5cGVzIHR5cGVzID0gZ3JvdXAuZ2V0UGFyZW50KCkuZ2V0RVR5cGVzKCk7Ci0gICAgICAgICAgICB0eXBlc0VsZW1lbnQgPSB0eXBlcy5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGVkaXRQYXJ0LmdldFZpZXdlcigpIGluc3RhbmNlb2YgV1NETENvbXBvbmVudFZpZXdlcikgewotICAgICAgICAgICAgICBXU0RMQ29tcG9uZW50Vmlld2VyIHdzZGxDb21wb25lbnRWaWV3ZXIgPSAoV1NETENvbXBvbmVudFZpZXdlcikgZWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0gICAgICAgICAgICAgIGRvY3VtZW50ID0gd3NkbENvbXBvbmVudFZpZXdlci5nZXRXU0RMRWRpdG9yKCkuZ2V0WE1MRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWFuYWdlci5hZGQobmV3IEFkZFNjaGVtYUFjdGlvbihncm91cC5nZXREZWZpbml0aW9uKCksIChFbGVtZW50KW5vZGUsIHR5cGVzRWxlbWVudCwgZG9jdW1lbnQpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gCi0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUeXBlcykKLSAgICAgIHsKLSAgICAgICAgLy8gSU1lbnVNYW5hZ2VyIG1lbnUgPSBtYW5hZ2VyLmZpbmRNZW51VXNpbmdQYXRoKCJhZGRjaGlsZCIpOwotCi0gICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBUeXBlcyB0eXBlcyA9IChUeXBlcylvYmplY3Q7Ci0gICAgICAgICAgbWFuYWdlci5hZGQobmV3IEFkZFNjaGVtYUFjdGlvbih0eXBlcy5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCksIChFbGVtZW50KW5vZGUpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoeHNkU2NoZW1hID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgQXJyYXlMaXN0IGF0dHJpYnV0ZXMgPSBudWxsOwotICAgICAgTm9kZSByZWxhdGl2ZU5vZGUgPSBudWxsOwotICAgICAgCi0gICAgICBCYWNrQWN0aW9uIGJhY2tBY3Rpb247Ci0gICAgICAKLSAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEgfHwgZm9jdXNFZGl0UGFydCBpbnN0YW5jZW9mIFRvcExldmVsQ29tcG9uZW50RWRpdFBhcnQgfHwgb2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIGJhY2tBY3Rpb24gPSBuZXcgQmFja0FjdGlvbihXU0RMRWRpdG9yUGx1Z2luLmdldFdTRExTdHJpbmcoIl9VSV9CQUNLX1RPIiwgIkRlZmluaXRpb24iKSk7Ci0gICAgICAgIGJhY2tBY3Rpb24uc2V0RGVmaW5pdGlvbih3c2RsRWRpdG9yLmdldERlZmluaXRpb24oKSk7Ci0gICAgICAgIGJhY2tBY3Rpb24uc2V0U2VsZWN0aW9uUHJvdmlkZXIoc2VsZWN0aW9uUHJvdmlkZXIpOwotICAgICAgICBiYWNrQWN0aW9uLnNldFJvb3RFZGl0UGFydChlZGl0UGFydCk7Ci0gICAgICAgIGJhY2tBY3Rpb24uc2V0R3JhcGhWaWV3ZXIod3NkbEVkaXRvci5nZXRHcmFwaFZpZXdlcigpKTsKLSAgICAgICAgbWFuYWdlci5hZGQoYmFja0FjdGlvbik7Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgIHsKLSAgICAgICAgYmFja0FjdGlvbiA9IG5ldyBCYWNrQWN0aW9uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQkFDS19UT19TQ0hFTUFfVklFVyIpKTsKLSAgICAgICAgLy8gYmFja0FjdGlvbi5zZXRYU0RTY2hlbWEoKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3QpLmdldFNjaGVtYSgpKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRYU0RTY2hlbWEoeHNkU2NoZW1hKTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRTZWxlY3Rpb25Qcm92aWRlcihzZWxlY3Rpb25Qcm92aWRlcik7Ci0gICAgICAgIGJhY2tBY3Rpb24uc2V0Um9vdEVkaXRQYXJ0KGVkaXRQYXJ0KTsKLSAgICAgICAgYmFja0FjdGlvbi5zZXRHcmFwaFZpZXdlcih3c2RsRWRpdG9yLmdldEdyYXBoVmlld2VyKCkpOwotICAgICAgICBtYW5hZ2VyLmFkZChiYWNrQWN0aW9uKTsKLSAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ1M6IEknbSByZW1vdmluZyB0aGUgJ29iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQnIGNhc2UgZnJvbSB0aGlzIHRlc3QKLSAgICAgIC8vIGZvciBub3cgdGhlIG1lbnUgYWN0aW9ucyBhcmUgZHJpdmVuIGZyb20gJ21vZGVsJyBvYmplY3RzCi0gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQgfHwgKG9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBwYXJlbnQ7Ci0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkKLSAgICAgICAgewotICAgICAgICAgIHBhcmVudCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3QpLmdldFNjaGVtYSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICAgIHBhcmVudCA9IChFbGVtZW50KW9iamVjdDsgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBzY2hlbWEgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpb2JqZWN0OwotICAgICAgICAgIHhzZFNjaGVtYSA9IHNjaGVtYS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICAgIHBhcmVudCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjdXJyRWxlbWVudCA9IHBhcmVudDsKLSAgICAgICAgY3VyckRvY3VtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgCi0vLyAgICAgICAgaWYgKCEoY3VyckRvY3VtZW50IGluc3RhbmNlb2YgRG9jdW1lbnRJbXBsKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICByZXR1cm47Ci0vLyAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYWRkQ29udGV4dEl0ZW1zKG1hbmFnZXIsIGN1cnJFbGVtZW50LCBudWxsKTsKLQotICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWEpIHx8Ci0gICAgICAgICAgIAkob2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hICYmICEod3NkbEVkaXRvci5nZXRHcmFwaFZpZXdlcigpLmdldENvbXBvbmVudFZpZXdlcigpLmdldElucHV0KCkgaW5zdGFuY2VvZiBYU0RTY2hlbWEpKSkgewotICAgICAgICAgICAJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9ucyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgd3NkbEVkaXRvci5nZXRTZWxlY3Rpb25NYW5hZ2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgIAltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICAgICAJb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5EZWxldGVXU0RMQW5kWFNEQWN0aW9uIGRlbGV0ZVdTRExBbmRYU0RBY3Rpb24gPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuYWN0aW9ucy5EZWxldGVXU0RMQW5kWFNEQWN0aW9uKHNlbGVjdGlvbnMudG9MaXN0KCksIGN1cnJFbGVtZW50LCB3c2RsRWRpdG9yKTsKLSAgICAgICAgICAgCWRlbGV0ZVdTRExBbmRYU0RBY3Rpb24uc2V0RW5hYmxlZCghaXNSZWFkT25seSk7Ci0gICAgICAgICAgIAltYW5hZ2VyLmFkZChkZWxldGVXU0RMQW5kWFNEQWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnkKLSAgICAgICAgICAgIHx8IG9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5QWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgaW50IGdyb3VwVHlwZSA9IC0xOwotCi0gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeSkKLSAgICAgICAgewotICAgICAgICAgIENhdGVnb3J5IGNnID0gKENhdGVnb3J5KW9iamVjdDsKLSAgICAgICAgICB4c2RTY2hlbWEgPSBjZy5nZXRYU0RTY2hlbWEoKTsKLSAgICAgICAgICBncm91cFR5cGUgPSBjZy5nZXRHcm91cFR5cGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAvLyBDYXRlZ29yeUFkYXB0ZXIKLSAgICAgICAgewotICAgICAgICAgIENhdGVnb3J5QWRhcHRlciBjYXRlZ29yeSA9IChDYXRlZ29yeUFkYXB0ZXIpb2JqZWN0OwotICAgICAgICAgIGdyb3VwVHlwZSA9IGNhdGVnb3J5LmdldEdyb3VwVHlwZSgpOwotICAgICAgICAgIHhzZFNjaGVtYSA9IGNhdGVnb3J5LmdldFhTRFNjaGVtYSgpOwotICAgICAgICB9Ci0gICAgICAgIEVsZW1lbnQgcGFyZW50ID0geHNkU2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgICAgY3VyckVsZW1lbnQgPSBwYXJlbnQ7Ci0gICAgICAgIGN1cnJEb2N1bWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgIHN3aXRjaCAoZ3JvdXBUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5UWVBFUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5ld0dsb2JhbFR5cGVOYW1lKCJDb21wbGV4VHlwZSIpKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQ09NUExFWFRZUEVfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0NPTVBMRVhfVFlQRSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pYWN0aW9uKS5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmV3R2xvYmFsVHlwZU5hbWUoIlNpbXBsZVR5cGUiKSkpOwotICAgICAgICAgICAgQWN0aW9uIGFjdGlvbjIgPSBhZGRDcmVhdGVTaW1wbGVUeXBlQWN0aW9uKG1hbmFnZXIsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TSU1QTEVfVFlQRSIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICAoKENyZWF0ZUVsZW1lbnRBY3Rpb24pYWN0aW9uMikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5FTEVNRU5UUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0dsb2JhbE5hbWUoWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsICJHbG9iYWxFbGVtZW50IikpKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRCdWlsdEluU3RyaW5nUU5hbWUoKSkpOwotICAgICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkVMRU1FTlRfRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX0VMRU1FTlQiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKWFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBDYXRlZ29yeS5HUk9VUFM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgIkdyb3VwIikpKTsKLSAgICAgICAgICAgIENyZWF0ZUdyb3VwQWN0aW9uIGdyb3VwQWN0aW9uID0gYWRkQ3JlYXRlR3JvdXBBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9HUk9VUCIpLCBhdHRyaWJ1dGVzLCBwYXJlbnQsIHJlbGF0aXZlTm9kZSk7Ci0gICAgICAgICAgICBncm91cEFjdGlvbi5zZXRJc0dsb2JhbCh0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIENhdGVnb3J5LkFUVFJJQlVURVM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsICJHbG9iYWxBdHRyaWJ1dGUiKSkpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIGdldEJ1aWx0SW5TdHJpbmdRTmFtZSgpKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuQVRUUklCVVRFX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9HTE9CQUxfQVRUUklCVVRFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbilhY3Rpb24pLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnkuQVRUUklCVVRFX0dST1VQUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgYXR0cmlidXRlcy5hZGQobmV3IERPTUF0dHJpYnV0ZShYU0RDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0dsb2JhbE5hbWUoWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCAiQXR0cmlidXRlR3JvdXAiKSkpOwotICAgICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVfR1JPVVAiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgKChDcmVhdGVFbGVtZW50QWN0aW9uKWFjdGlvbikuc2V0SXNHbG9iYWwodHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsgCi0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnkuTk9UQVRJT05TOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmFkZChuZXcgRE9NQXR0cmlidXRlKFhTRENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdHbG9iYWxOYW1lKFhTRENvbnN0YW50cy5OT1RBVElPTl9FTEVNRU5UX1RBRywgIk5vdGF0aW9uIikpKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlBVQkxJQ19BVFRSSUJVVEUsICIiKSk7Ci0gICAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuTk9UQVRJT05fRUxFTUVOVF9UQUcsIFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fQUREX05PVEFUSU9OIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgICgoQ3JlYXRlRWxlbWVudEFjdGlvbilhY3Rpb24pLnNldElzR2xvYmFsKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgQ2F0ZWdvcnkuRElSRUNUSVZFUzoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGIgPSB0cnVlOwotICAgICAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgTm9kZSBlZmZlY3RpdmVSZWxhdGl2ZU5vZGUgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgJiYgYjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLklOQ0xVREVfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpY2hpbGQsIFhTRENvbnN0YW50cy5JTVBPUlRfRUxFTUVOVF9UQUcsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoKEVsZW1lbnQpY2hpbGQsIFhTRENvbnN0YW50cy5SRURFRklORV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgIFhTRERPTUhlbHBlci5pbnB1dEVxdWFscygoRWxlbWVudCljaGlsZCwgWFNEQ29uc3RhbnRzLkFOTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlZmZlY3RpdmVSZWxhdGl2ZU5vZGUgPSBjaGlsZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbGF0aXZlTm9kZSA9IGVmZmVjdGl2ZVJlbGF0aXZlTm9kZSAhPSBudWxsID8gZWZmZWN0aXZlUmVsYXRpdmVOb2RlLmdldE5leHRTaWJsaW5nKCkgOiBudWxsOwotICAgICAgICAgICAgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKG5ldyBET01BdHRyaWJ1dGUoWFNEQ29uc3RhbnRzLlNDSEVNQUxPQ0FUSU9OX0FUVFJJQlVURSwgIiIpKTsKLQotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuSU5DTFVERV9FTEVNRU5UX1RBRyxYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTkNMVURFIiksIGF0dHJpYnV0ZXMsIHBhcmVudCwgcmVsYXRpdmVOb2RlKTsKLSAgICAgICAgICAgIGFkZENyZWF0ZUVsZW1lbnRBY3Rpb24obWFuYWdlciwgWFNEQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRyxYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9JTVBPUlQiKSwgbnVsbCwgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgYWRkQ3JlYXRlRWxlbWVudEFjdGlvbihtYW5hZ2VyLCBYU0RDb25zdGFudHMuUkVERUZJTkVfRUxFTUVOVF9UQUcsWFNERWRpdG9yUGx1Z2luLmdldFhTRFN0cmluZygiX1VJX0FDVElPTl9BRERfUkVERUZJTkUiKSwgYXR0cmlidXRlcywgcGFyZW50LCByZWxhdGl2ZU5vZGUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgCi0KLSAgICBwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZVJlc291cmNlKCkKLSAgICB7Ci0gIC8vLy8vIFdTREwgVE9ETwotICAvLyAgICBpZiAoZ2V0RWRpdG9yKCkgIT0gbnVsbCkKLSAgLy8gICAgICByZXR1cm4gZ2V0RWRpdG9yKCkuZ2V0RmlsZVJlc291cmNlKCk7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLS8vICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U2VsZWN0ZWRFbGVtZW50KCkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuIGN1cnJFbGVtZW50OwotLy8gICAgfQotCi0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYSBnZXRYU0RTY2hlbWEoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gICAgfQotICAKLSAgICBwcm90ZWN0ZWQgSURPTU1vZGVsIGdldFhNTE1vZGVsKCkKLSAgICB7Ci0gICAgICBpZiAoY3VyckVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGN1cnJFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERvY3VtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIERvY3VtZW50SW1wbCB4bWxEb2MgPSAoRG9jdW1lbnRJbXBsKSBjdXJyRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgcmV0dXJuIHhtbERvYy5nZXRNb2RlbCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RNb2RlbEFkYXB0ZXJDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzMzBiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyLlhTRENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyLlhTRE1vZGVsQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotCi1wdWJsaWMgY2xhc3MgWFNETW9kZWxBZGFwdGVyQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgWFNEQ29udGVudFByb3ZpZGVyCi17ICAKLSAgcHVibGljIFhTRE1vZGVsQWRhcHRlckNvbnRlbnRQcm92aWRlcihYU0RNb2RlbEFkYXB0ZXJGYWN0b3J5SW1wbCB4c2RNb2RlbEFkYXB0ZXJGYWN0b3J5KQotICB7Ci0gICAgc3VwZXIoeHNkTW9kZWxBZGFwdGVyRmFjdG9yeSk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudE9iamVjdCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBudWxsOwotCi0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgeHNkQ29tcCA9IG51bGw7Ci0gICAgaWYgKHBhcmVudE9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KXBhcmVudE9iamVjdDsKLSAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB4c2RDb21wID0geHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4oeHNkQ29tcCk7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRPYmplY3QpOyAgICAKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNETm9kZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTM2N2ZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmV4dGVuc2lvbi5JTm9kZUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5ncmFwaC5tb2RlbC5DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3ZpZGVyLkNhdGVnb3J5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWNsYXNzIFhTRE5vZGVBc3NvY2lhdGlvblByb3ZpZGVyIGltcGxlbWVudHMgSU5vZGVBc3NvY2lhdGlvblByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChPYmplY3QgcGFyZW50TW9kZWxPYmplY3QsIEVsZW1lbnRbXSBlbGVtZW50Q2hhaW4sIGludCBzdGFydCwgaW50W10gZW5kKQotICB7ICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHBhcmVudE1vZGVsT2JqZWN0IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpcGFyZW50TW9kZWxPYmplY3Q7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0U2NoZW1hKCk7Ci0gICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgIAotICAgICAgICBFbGVtZW50IHRhcmdldEVsZW1lbnQgPSBlbGVtZW50Q2hhaW5bZWxlbWVudENoYWluLmxlbmd0aCAtIDFdOwotICAgICAgICByZXN1bHQgPSBzY2hlbWEuZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudCh0YXJnZXRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50TW9kZWxPYmplY3QgaW5zdGFuY2VvZiBDYXRlZ29yeUFkYXB0ZXIpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChDYXRlZ29yeUFkYXB0ZXIpcGFyZW50TW9kZWxPYmplY3QpLmdldFhTRFNjaGVtYSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnRNb2RlbE9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQ2F0ZWdvcnkpcGFyZW50TW9kZWxPYmplY3QpLmdldFhTRFNjaGVtYSgpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBnZXROb2RlKE9iamVjdCBtb2RlbE9iamVjdCkKLSAgeyAgICAgICAgCi0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KW1vZGVsT2JqZWN0OwotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGV4dGVuc2liaWxpdHlFbGVtZW50LmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgewotICAgICAgICBub2RlID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9ICAgICAgICAKLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIG5vZGUgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQ2F0ZWdvcnlBZGFwdGVyKQotICAgIHsKLSAgICAgIG5vZGUgPSAoKENhdGVnb3J5QWRhcHRlciltb2RlbE9iamVjdCkuZ2V0WFNEU2NoZW1hKCkuZ2V0RWxlbWVudCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIENhdGVnb3J5KQotICAgIHsKLSAgICAgIG5vZGUgPSAoKENhdGVnb3J5KW1vZGVsT2JqZWN0KS5nZXRYU0RTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBub2RlOwotICB9ICAgICAgCi19IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0ROb2RlUmVjb25jaWxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRE5vZGVSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTc3YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRE5vZGVSZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5leHRlbnNpb24uSU5vZGVSZWNvbmNpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBYU0ROb2RlUmVjb25jaWxlciBpbXBsZW1lbnRzIElOb2RlUmVjb25jaWxlcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoT2JqZWN0IG1vZGVsT2JqZWN0LCBFbGVtZW50IGVsZW1lbnQsIGludCBldmVudFR5cGUsIE9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgWFNEQ29uY3JldGVDb21wb25lbnQpCi0gICAgewotICAgICAgY29tcG9uZW50ID0gKFhTRENvbmNyZXRlQ29tcG9uZW50KW1vZGVsT2JqZWN0OwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsgICAgICAgICAgIAotICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbW9kZWxPYmplY3Q7Ci0gICAgICBjb21wb25lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRTY2hlbWEoKTsKLSAgICB9ICAgCi0KLSAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgewotICAgICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0U6Ci0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBjb21wb25lbnQuZWxlbWVudEF0dHJpYnV0ZXNDaGFuZ2VkKGVsZW1lbnQpOyAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQ6Ci0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBjb21wb25lbnQuZWxlbWVudENvbnRlbnRzQ2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEOgotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnRDaGFuZ2VkKGVsZW1lbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFByb3BlcnR5U291cmNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmZjM2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEUHJvcGVydHlTb3VyY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5BbnlBdHRyaWJ1dGVQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuQW55RWxlbWVudFByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5BcHBJbmZvUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkF0dHJpYnV0ZUdyb3VwUmVmUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkF0dHJpYnV0ZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5CYXNlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkNvbXBsZXhUeXBlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkRvY3VtZW50YXRpb25Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuRWxlbWVudFByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5FbnVtZXJhdGlvblByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5Hcm91cFJlZlByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5JbXBvcnRQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuSW5jbHVkZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5LZXlyZWZQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuTW9kZWxHcm91cFByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5OYW1lUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLk5vdGF0aW9uUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlBhdHRlcm5Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuU2NoZW1hUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLlNpbXBsZUNvbnRlbnRQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuU2ltcGxlUmVzdHJpY3RQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuU2ltcGxlVHlwZUxpc3RQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuU2ltcGxlVHlwZVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwucHJvcGVydGllcy5TaW1wbGVUeXBlVW5pb25Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuWFBhdGhQcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnV0aWwuWFNERE9NSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYU0RQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIjZ2V0UHJvcGVydHlTb3VyY2UoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkKLSAgewotLy8gVXNpbmcgWFNEJ3MgaXRlbSBwcm92aWRlcnMKLS8vICAgIFhTREl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gWFNERXh0ZW5zaW9uUGx1Z2luLmdldFhTREl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0vLyAgIAotLy8gICAgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSBpdGVtUHJvcGVydHlTb3VyY2UgPQotLy8gICAgICAoSUl0ZW1Qcm9wZXJ0eVNvdXJjZSkKLS8vICAgICAgICAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCAmJiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKSA9PSBudWxsID8KLS8vICAgICAgICAgIG51bGwgOgotLy8gICAgICAgICAgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKSk7Ci0vLyAgICByZXR1cm4gCi0vLyAgICBpdGVtUHJvcGVydHlTb3VyY2UgIT0gbnVsbCA/ICBjcmVhdGVQcm9wZXJ0eVNvdXJjZShvYmplY3QsIGl0ZW1Qcm9wZXJ0eVNvdXJjZSkgOiBudWxsOwotICAgIAotICAgIGlmIChvYmplY3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgCi0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIG9iamVjdCA9ICgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpb2JqZWN0KS5nZXRTY2hlbWEoKTsKLSAgICB9Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhTRENvbmNyZXRlQ29tcG9uZW50KQotICAgIHsKLSAgICAgIEJhc2VQcm9wZXJ0eVNvdXJjZSBicHMgPSAoQmFzZVByb3BlcnR5U291cmNlKWdldFhTRFByb3BlcnR5U291cmNlKG9iamVjdCk7Ci0gICAgICBFbGVtZW50IGlucHV0ID0gKChYU0RDb25jcmV0ZUNvbXBvbmVudClvYmplY3QpLmdldEVsZW1lbnQoKTsKLSAgICAgIGJwcy5zZXRJbnB1dChpbnB1dCk7Ci0gICAgICByZXR1cm4gYnBzOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBJUHJvcGVydHlTb3VyY2UgY3JlYXRlUHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSBpdGVtUHJvcGVydHlTb3VyY2UpCi0gIHsKLSAgICByZXR1cm4gbmV3IFByb3BlcnR5U291cmNlKG9iamVjdCwgaXRlbVByb3BlcnR5U291cmNlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaW5wdXRFcXVhbHMoT2JqZWN0IGlucHV0LCBTdHJpbmcgdGFnbmFtZSwgYm9vbGVhbiBpc1JlZikKLSAgewotICAgIHJldHVybiBYU0RET01IZWxwZXIuaW5wdXRFcXVhbHMoaW5wdXQsIHRhZ25hbWUsIGlzUmVmKTsKLSAgfQotCi0gIGJvb2xlYW4gc2hvd1BhcmVudCA9IGZhbHNlOwotICAKLSAgLy8gVE9ETzogV2Ugc2hvdWxkIHVzZSBhZGFwdGVycyB0byBkbyB0aGlzLiAgRG8gYXMgd2UgY29tcGxldGUgJ21vZGVsJy1iYXNlZCBwb3J0Ci0gIHB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0WFNEUHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iamVjdCkuZ2V0U2NoZW1hKCk7Ci0gICAgRWxlbWVudCBpbnB1dCA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0KLSAgICBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBFbGVtZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5FTEVNRU5UX0VMRU1FTlRfVEFHLCB0cnVlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEdyb3VwUmVmUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TRVFVRU5DRV9FTEVNRU5UX1RBRywgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgIGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuQ0hPSUNFX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BTExfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IE1vZGVsR3JvdXBQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFUVFJJQlVURUdST1VQX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBOYW1lUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BVFRSSUJVVEVHUk9VUF9FTEVNRU5UX1RBRywgdHJ1ZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVHcm91cFJlZlByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuTk9UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IE5vdGF0aW9uUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUeXBlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5HUk9VUF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgTmFtZVByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuR1JPVVBfRUxFTUVOVF9UQUcsIHRydWUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgR3JvdXBSZWZQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2NoZW1hUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5DT01QTEVYVFlQRV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQ29tcGxleFR5cGVQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IERvY3VtZW50YXRpb25Qcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFQUElORk9fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEFwcEluZm9Qcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlNJTVBMRUNPTlRFTlRfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgcGFyZW50ID0gKEVsZW1lbnQpaW5wdXQ7Ci0gICAgICAgIFhTRERPTUhlbHBlciB4c2RET01IZWxwZXIgPSBuZXcgWFNERE9NSGVscGVyKCk7Ci0gICAgICAgIEVsZW1lbnQgZGVyaXZlZEJ5Tm9kZSA9IHhzZERPTUhlbHBlci5nZXREZXJpdmVkQnlFbGVtZW50KHBhcmVudCk7Ci0gICAgICAgIGlmIChkZXJpdmVkQnlOb2RlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW5wdXRFcXVhbHMoZGVyaXZlZEJ5Tm9kZSwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkgfHwgCi0gICAgICAgICAgICAgIGlucHV0RXF1YWxzKGRlcml2ZWRCeU5vZGUsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbnRlbnRQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KWlucHV0OwotICAgICAgICBYU0RET01IZWxwZXIgeHNkRE9NSGVscGVyID0gbmV3IFhTRERPTUhlbHBlcigpOwotICAgICAgICBFbGVtZW50IGRlcml2ZWRCeU5vZGUgPSB4c2RET01IZWxwZXIuZ2V0RGVyaXZlZEJ5RWxlbWVudChwYXJlbnQpOwotICAgICAgICBpZiAoZGVyaXZlZEJ5Tm9kZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb250ZW50UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLklOQ0xVREVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0vLyAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBYU0RFZGl0b3IpCi0vLyAgICAgIHsKLS8vICAgICAgICBJRmlsZSBpbnB1dEZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpZWRpdG9yLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKTsKLSAgICAgICAgSUZpbGUgaW5wdXRGaWxlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBJbmNsdWRlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hLCBpbnB1dEZpbGUpOwotLy8gICAgICB9Ci0vLyAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLklNUE9SVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLS8vICAgICAgaWYgKGVkaXRvciBpbnN0YW5jZW9mIFhTREVkaXRvcikKLS8vICAgICAgewotLy8gICAgICAgIElGaWxlIGlucHV0RmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCllZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpOwotICAgICAgSUZpbGUgaW5wdXRGaWxlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIG5ldyBJbXBvcnRQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEsIGlucHV0RmlsZSk7Ci0vLyAgICAgIH0KLS8vICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUkVERUZJTkVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0vLyAgICAgIGlmIChlZGl0b3IgaW5zdGFuY2VvZiBYU0RFZGl0b3IpCi0vLyAgICAgICB7Ci0vLyAgICAgICAgSUZpbGUgaW5wdXRGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KWVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0gICAgICBJRmlsZSBpbnB1dEZpbGUgPSBudWxsOwotICAgICAgICByZXR1cm4gbmV3IEluY2x1ZGVQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEsIGlucHV0RmlsZSk7Ci0vLyAgICAgIH0KLS8vICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuTElTVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU2ltcGxlVHlwZUxpc3RQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlVOSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUeXBlVW5pb25Qcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLlJFU1RSSUNUSU9OX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIGNyZWF0ZVJlc3RyaWN0V2luZG93KGlucHV0LCB4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RET01IZWxwZXIuaXNGYWNldChpbnB1dCkpCi0gICAgewotICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBOb2RlIHBhcmVudCA9ICgoRWxlbWVudClpbnB1dCkuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICBpZiAoaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuUkVTVFJJQ1RJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBjcmVhdGVSZXN0cmljdFdpbmRvdyhpbnB1dCwgeHNkU2NoZW1hKTsKLSAgICAgICAgfSAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5FWFRFTlNJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgcGFyZW50ID0gKChFbGVtZW50KWlucHV0KS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIGlmIChpbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5DT01QTEVYQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpCi0gICAgICAgICAgICB8fCBpbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5TSU1QTEVDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzaG93UGFyZW50ID0gdHJ1ZTsKLSAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbnRlbnRQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuUEFUVEVSTl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgUGF0dGVyblByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuRU5VTUVSQVRJT05fRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEVudW1lcmF0aW9uUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5BTllfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEFueUVsZW1lbnRQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkFOWUFUVFJJQlVURV9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgQW55QXR0cmlidXRlUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5VTklRVUVfRUxFTUVOVF9UQUcsIGZhbHNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IE5hbWVQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLktFWVJFRl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgS2V5cmVmUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMoaW5wdXQsIFhTRENvbnN0YW50cy5TRUxFQ1RPUl9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWFBhdGhQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dEVxdWFscyhpbnB1dCwgWFNEQ29uc3RhbnRzLkZJRUxEX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBYUGF0aFByb3BlcnR5U291cmNlKHhzZFNjaGVtYSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKGlucHV0LCBYU0RDb25zdGFudHMuS0VZX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBOYW1lUHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIElQcm9wZXJ0eVNvdXJjZSBjcmVhdGVSZXN0cmljdFdpbmRvdyhPYmplY3QgaW5wdXQsIFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICAvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgU2ltcGxlVHlwZSByZXN0cmljdGlvbiBpcyBkaWZmZXJlbnQgdGhhbiBTaW1wbGVDb250ZW50IHJlc3RyaWN0aW9uCi0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgTm9kZSBwYXJlbnQgPSAoKEVsZW1lbnQpaW5wdXQpLmdldFBhcmVudE5vZGUoKTsKLSAgICAgIGlmIChpbnB1dEVxdWFscyhwYXJlbnQsIFhTRENvbnN0YW50cy5TSU1QTEVUWVBFX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlUmVzdHJpY3RQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoaW5wdXRFcXVhbHMocGFyZW50LCBYU0RDb25zdGFudHMuU0lNUExFQ09OVEVOVF9FTEVNRU5UX1RBRywgZmFsc2UpKQotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVJlc3RyaWN0UHJvcGVydHlTb3VyY2UoeHNkU2NoZW1hKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGlucHV0RXF1YWxzKHBhcmVudCwgWFNEQ29uc3RhbnRzLkNPTVBMRVhDT05URU5UX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIHNob3dQYXJlbnQgPSB0cnVlOwotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbnRlbnRQcm9wZXJ0eVNvdXJjZSh4c2RTY2hlbWEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI1ZjVhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFhTRFNlY3Rpb25EZXNjcmlwdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBJU2VjdGlvbkRlc2NyaXB0b3JQcm92aWRlcgotewotICBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5YU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyIGRlc2NyaXB0b3I7Ci0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBYU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gICAgZGVzY3JpcHRvciA9IG5ldyBvcmcuZWNsaXBzZS53c3QueHNkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5YU0RTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uRGVzY3JpcHRvclByb3ZpZGVyI2dldFNlY3Rpb25EZXNjcmlwdG9ycygpCi0gICAqLwotICBwdWJsaWMgSVNlY3Rpb25EZXNjcmlwdG9yW10gZ2V0U2VjdGlvbkRlc2NyaXB0b3JzKCkKLSAgewotICAgIHJldHVybiBkZXNjcmlwdG9yLmdldFNlY3Rpb25EZXNjcmlwdG9ycygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvWFNEVGVtcERldGFpbHNWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RUZW1wRGV0YWlsc1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjAxZWY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RUZW1wRGV0YWlsc1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC52aWV3ZXJzLkJhc2VWaWV3ZXI7Ci0gICAgICAgCi0KLXB1YmxpYyBjbGFzcyBYU0RUZW1wRGV0YWlsc1ZpZXdlciBleHRlbmRzIEJhc2VWaWV3ZXIKLXsgICAKLSAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotCi0gIHB1YmxpYyBYU0RUZW1wRGV0YWlsc1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KQotICB7IAotICAgIHN1cGVyKG51bGwpOwotICAgIGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgfQotICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgZG9TZXRJbnB1dChPYmplY3QgaW5wdXQpCi0gIHsgICAgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBjb250cm9sID0gZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEsIHRydWUpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgZmxhdFZpZXdVdGlsaXR5LmNyZWF0ZUZsYXRQYWdlSGVhZGVyKGNvbnRyb2wsICJYU0RWaWV3ZXIiKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkKLSAgewotICB9Ci0KLSAgcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpCi0gIHsKLSAgICByZXR1cm4gY29udHJvbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpCi0gIHsKLQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL1hTRFR5cGVTeXN0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDI4MjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9YU0RUeXBlU3lzdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklUeXBlU3lzdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETmFtZWRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNESW1wb3J0SW1wbDsKLQotLy8KLS8vCi1wdWJsaWMgY2xhc3MgWFNEVHlwZVN5c3RlbVByb3ZpZGVyIGltcGxlbWVudHMgSVR5cGVTeXN0ZW1Qcm92aWRlcgotewotICAgIHB1YmxpYyBMaXN0IGdldFByZWZpeGVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIG5hbWVzcGFjZSkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTWFwIG1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdGhlTmFtZXNwYWNlID0gKFN0cmluZykgbWFwLmdldChwcmVmaXgpOwotICAgICAgICAgICAgaWYgKHRoZU5hbWVzcGFjZSAhPSBudWxsICYmIHRoZU5hbWVzcGFjZS5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChwcmVmaXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldFByZWZpeGVkTmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRQcmVmaXhlcyhkZWZpbml0aW9uLCBuYW1lc3BhY2UpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUgOiBsb2NhbE5hbWU7Ci0gICAgICAgICAgICBsaXN0LmFkZChuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGROYW1lZENvbXBvbmVudHMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBMaXN0IGxpc3QsIExpc3QgbmFtZWRDb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZWRDb21wb25lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgWFNETmFtZWRDb21wb25lbnQgY29tcG9uZW50ID0gKFhTRE5hbWVkQ29tcG9uZW50KSBpLm5leHQoKTsKLSAgICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFByZWZpeGVkTmFtZXMoZGVmaW5pdGlvbiwgY29tcG9uZW50LmdldFRhcmdldE5hbWVzcGFjZSgpLCBjb21wb25lbnQuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0V1NJU3R5bGVJbXBvcnRzKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gICAgewotICAgICAgICBpZiAoeHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnRJbXBsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWFNESW1wb3J0SW1wbCB4c2RJbXBvcnQgPSAoWFNESW1wb3J0SW1wbCkgY29udGVudDsKLQkJCQkJWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpeHNkSW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7CQkJCQkKLQkJCQkJaWYgKHNjaGVtYSA9PSBudWxsKQotCQkJCQl7Ci0JCQkJCQlzY2hlbWEgPSB4c2RJbXBvcnQuaW1wb3J0U2NoZW1hKCk7Ci0JCQkJCX0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVHlwZU5hbWVzKERlZmluaXRpb24gZGVmaW5pdGlvbiwgaW50IHR5cGVOYW1lQ2F0ZWdvcnkpCi0gICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAodHlwZU5hbWVDYXRlZ29yeSA9PSBJVHlwZVN5c3RlbVByb3ZpZGVyLkJVSUxUX0lOX1RZUEUpIHsKLSAgICAgICAgCWxpc3QgPSBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdChkZWZpbml0aW9uKTsgICAgICAgIAkKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgCVR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICAgICAgCWlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICAJewotICAgICAgICAJCWZvciAoSXRlcmF0b3IgaSA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIAkJewotICAgICAgICAJCQlPYmplY3QgbyA9IGkubmV4dCgpOwotICAgICAgICAJCQlpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAJCQl7Ci0gICAgICAgIAkJCQlYU0RTY2hlbWEgc2NoZW1hID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIAkJCQlpZiAoc2NoZW1hICE9IG51bGwpCi0gICAgICAgIAkJCQl7Ci0gICAgICAgIAkJCQkJaW5pdFdTSVN0eWxlSW1wb3J0cyhzY2hlbWEpOwotICAgICAgICAJCQkJCWFkZE5hbWVkQ29tcG9uZW50cyhkZWZpbml0aW9uLCBsaXN0LCBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkpOwotICAgICAgICAJCQkJfQotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICAKLSAgICAgICAgCWZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIAl7Ci0gICAgICAgIAkJSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIGkubmV4dCgpOwotICAgICAgICAJCVhTRFNjaGVtYSBzY2hlbWEgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgICAJCWlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgCQl7Ci0gICAgICAgIAkJCWFkZE5hbWVkQ29tcG9uZW50cyhkZWZpbml0aW9uLCBsaXN0LCBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCkpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCWxpc3QuYWRkQWxsKGdldEJ1aWx0SW5UeXBlTmFtZXNMaXN0KGRlZmluaXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICAKLQkJcmV0dXJuIGxpc3Q7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVHlwZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBYU0RTY2hlbWEgc2NoZW1hLCBpbnQgdHlwZU5hbWVDYXRlZ29yeSkKLSAgICB7Ci0gICAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCBrZWVwVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIHR5cGVJdGVyYXRvciA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAvLyBGaWx0ZXIgb3V0IHVud2FudGVkIFR5cGVzCi0gICAgICAgIGlmICh0eXBlTmFtZUNhdGVnb3J5ID09IElUeXBlU3lzdGVtUHJvdmlkZXIuVVNFUl9ERUZJTkVEX0NPTVBMRVhfVFlQRSkgewotICAgICAgICAJd2hpbGUgKHR5cGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgCQlPYmplY3QgdHlwZSA9IHR5cGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIAkJaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pIHsKLSAgICAgICAgCQkJa2VlcFR5cGVzLmFkZCh0eXBlKTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodHlwZU5hbWVDYXRlZ29yeSA9PSBJVHlwZVN5c3RlbVByb3ZpZGVyLlVTRVJfREVGSU5FRF9TSU1QTEVfVFlQRSkgewotICAgICAgICAJd2hpbGUgKHR5cGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgCQlPYmplY3QgdHlwZSA9IHR5cGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIAkJaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgewotICAgICAgICAJCQlrZWVwVHlwZXMuYWRkKHR5cGUpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy9hZGROYW1lZENvbXBvbmVudHMoZGVmaW5pdGlvbiwgbGlzdCwga2VlcFR5cGVzKTsgICAgICAgIAotICAgICAgICAvL3JldHVybiBsaXN0OwotICAgICAgICByZXR1cm4ga2VlcFR5cGVzOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRCdWlsdEluVHlwZU5hbWVzTGlzdChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgewotICAgICAgICBMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IHByZWZpeGVzID0gZ2V0UHJlZml4ZXMoZGVmaW5pdGlvbiwgV1NETENvbnN0YW50cy5YU0RfTkFNRVNQQUNFX1VSSSk7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwcmVmaXhlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgWFNERE9NSGVscGVyLmRhdGFUeXBlLmxlbmd0aDsgaisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IFhTRERPTUhlbHBlci5kYXRhVHlwZVtqXVswXTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyBwcmVmaXggKyAiOiIgKyBsb2NhbE5hbWUgOiBsb2NhbE5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1zLmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLSAgICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVFbGVtZW50TmFtZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoKFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KSBvKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0JCQkJCQlpbml0V1NJU3R5bGVJbXBvcnRzKHNjaGVtYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGROYW1lZENvbXBvbmVudHMoZGVmaW5pdGlvbiwgbGlzdCwgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZE5hbWVkQ29tcG9uZW50cyhkZWZpbml0aW9uLCBsaXN0LCBzY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgcHVibGljIGludCBnZXRDYXRlZ29yeUZvclR5cGVOYW1lKERlZmluaXRpb24gZGVmaW5pdGlvbiwgU3RyaW5nIHR5cGVOYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0FkZFNjaGVtYUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvQWRkU2NoZW1hQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMzdiM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvQWRkU2NoZW1hQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLmFjdGlvbnMuQWRkRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEFkZFNjaGVtYUFjdGlvbiBleHRlbmRzIEFkZEVsZW1lbnRBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZVR5cGVzRWxlbWVudCA9IGZhbHNlOwotCi0gIHB1YmxpYyBBZGRTY2hlbWFBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50KQotICB7Ci0gICAgdGhpcyhkZWZpbml0aW9uLCBkZWZpbml0aW9uRWxlbWVudCwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIEFkZFNjaGVtYUFjdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIEVsZW1lbnQgZGVmaW5pdGlvbkVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlVHlwZXNFbGVtZW50KQotICB7Ci0gICAgc3VwZXIoV1NETEVkaXRvclBsdWdpbi5nZXRXU0RMU3RyaW5nKCJfVUlfQUNUSU9OX0FERF9TQ0hFTUEiKSwgImljb25zL3hzZF9vYmouZ2lmIiwgZGVmaW5pdGlvbkVsZW1lbnQsICJ4c2Q6c2NoZW1hIik7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmNyZWF0ZVR5cGVzRWxlbWVudCA9IGNyZWF0ZVR5cGVzRWxlbWVudDsKLSAgICB0YXJnZXROYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOyAgICAKLSAgfQotCi0gIHB1YmxpYyBBZGRTY2hlbWFBY3Rpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBFbGVtZW50IGRlZmluaXRpb25FbGVtZW50LCBFbGVtZW50IHR5cGVzRWxlbWVudCkKLSAgewotICAgIHN1cGVyKFdTRExFZGl0b3JQbHVnaW4uZ2V0V1NETFN0cmluZygiX1VJX0FDVElPTl9BRERfU0NIRU1BIiksICJpY29ucy94c2Rfb2JqLmdpZiIsIGRlZmluaXRpb25FbGVtZW50LCAieHNkOnNjaGVtYSIpOyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHR5cGVzRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHBhcmVudE5vZGUgPSAgdHlwZXNFbGVtZW50OwotICAgICAgdGhpcy5jcmVhdGVUeXBlc0VsZW1lbnQgPSBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRoaXMuY3JlYXRlVHlwZXNFbGVtZW50ID0gdHJ1ZTsgICAgICAKLSAgICB9Ci0gICAgdGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsgICAgCi0gIH0KLQotICBwdWJsaWMgQWRkU2NoZW1hQWN0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbiwgRWxlbWVudCBkZWZpbml0aW9uRWxlbWVudCwgRWxlbWVudCB0eXBlc0VsZW1lbnQsIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gIAl0aGlzKGRlZmluaXRpb24sIGRlZmluaXRpb25FbGVtZW50LCB0eXBlc0VsZW1lbnQpOwotICAJdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgCXRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0RpYWxvZygpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZXMoRWxlbWVudCBuZXdFbGVtZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgieG1sbnM6eHNkIiwgWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICBuZXdFbGVtZW50LnNldEF0dHJpYnV0ZSgiZWxlbWVudEZvcm1EZWZhdWx0IiwgInF1YWxpZmllZCIpOwotICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLCB0YXJnZXROYW1lc3BhY2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAJYmVnaW5SZWNvcmRpbmcoKTsKLSAgCWlmIChwYXJlbnROb2RlID09IG51bGwgfHwgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID09IDApKSB7Ci0gIAkJY3JlYXRlRGVmaW5pdGlvblN0dWIoKTsKLSAgCQlwcmVmaXggPSBudWxsOwotICAJCXRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gIAl9Ci0gIAkKLSAgICBpZiAoY3JlYXRlVHlwZXNFbGVtZW50KQotICAgIHsKLSAgICAgIEFkZEVsZW1lbnRBY3Rpb24gYWRkVHlwZXNBY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbigiIiwgImljb25zL3hzZF9vYmouZ2lmIiwgcGFyZW50Tm9kZSwgcGFyZW50Tm9kZS5nZXRQcmVmaXgoKSwgInR5cGVzIik7Ci0gICAgICBhZGRUeXBlc0FjdGlvbi5zZXRDb21wdXRlVG9wTGV2ZWxSZWZDaGlsZCh0cnVlKTsKLSAgICAgIGFkZFR5cGVzQWN0aW9uLnJ1bigpOwotICAgICAgcGFyZW50Tm9kZSA9ICBhZGRUeXBlc0FjdGlvbi5nZXROZXdFbGVtZW50KCk7Ci0gICAgfSAKLSAgICBzdXBlci5ydW4oKTsKLSAgICBlbmRSZWNvcmRpbmcoKTsKLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvYWN0aW9ucy9CYWNrQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvYWN0aW9ucy9CYWNrQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTc5MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvQmFja0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwueHNkLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5ncmFwaC5XU0RMR3JhcGhWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5nZWYudXRpbC5lZGl0cGFydHMuQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotcHVibGljIGNsYXNzIEJhY2tBY3Rpb24gZXh0ZW5kcyBBY3Rpb24KLXsKLSAgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIFdTRExHcmFwaFZpZXdlciBncmFwaFZpZXdlcjsKLSAgCi0gIC8qKgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICovCi0gIHB1YmxpYyBCYWNrQWN0aW9uKFN0cmluZyB0ZXh0KQotICB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHRleHQKLSAgICogQHBhcmFtIGltYWdlCi0gICAqLwotICBwdWJsaWMgQmFja0FjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKQotICB7Ci0gICAgc3VwZXIodGV4dCwgaW1hZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSB0ZXh0Ci0gICAqIEBwYXJhbSBzdHlsZQotICAgKi8KLSAgcHVibGljIEJhY2tBY3Rpb24oU3RyaW5nIHRleHQsIGludCBzdHlsZSkKLSAgewotICAgIHN1cGVyKHRleHQsIHN0eWxlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblByb3ZpZGVyKElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlcikKLSAgewotICAgIHRoaXMuc2VsZWN0aW9uUHJvdmlkZXIgPSBzZWxlY3Rpb25Qcm92aWRlcjsKLSAgfQotICAKLSAgQWJzdHJhY3RDb21wb25lbnRWaWV3ZXJSb290RWRpdFBhcnQgZWRpdFBhcnQ7Ci0gIHB1YmxpYyB2b2lkIHNldFJvb3RFZGl0UGFydChBYnN0cmFjdENvbXBvbmVudFZpZXdlclJvb3RFZGl0UGFydCBlZGl0UGFydCkKLSAgewotICAgIHRoaXMuZWRpdFBhcnQgPSBlZGl0UGFydDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0WFNEU2NoZW1hKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gIHsKLSAgICB0aGlzLnhzZFNjaGVtYSA9IHhzZFNjaGVtYTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0R3JhcGhWaWV3ZXIoV1NETEdyYXBoVmlld2VyIGdyYXBoVmlld2VyKQotICB7Ci0gICAgdGhpcy5ncmFwaFZpZXdlciA9IGdyYXBoVmlld2VyOwotICB9Ci0gIAotICAvKgotICAgKiBAc2VlIElBY3Rpb24jcnVuKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bigpCi0gIHsKLSAgICBpZiAoeHNkU2NoZW1hICE9IG51bGwpCi0gICAgewotICAgICAgU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih4c2RTY2hlbWEpOwotICAgICAgc2VsZWN0aW9uUHJvdmlkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0gICAgICAvLyBlZGl0UGFydC5zZXRJbnB1dCh4c2RTY2hlbWEpOwotICAgICAgZ3JhcGhWaWV3ZXIuc2V0SW5wdXQoeHNkU2NoZW1hKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGVmaW5pdGlvbik7Ci0gICAgICBzZWxlY3Rpb25Qcm92aWRlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLSAgICAgIC8vIGVkaXRQYXJ0LnNldElucHV0KGRlZmluaXRpb24pOwotICAgICAgZ3JhcGhWaWV3ZXIuc2V0SW5wdXQoZGVmaW5pdGlvbik7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGU0ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5hY3Rpb25zLkRlbGV0ZUludGVyZmFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC51dGlsLldTRExFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5YU0RFZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC5yZWZhY3Rvci5kZWxldGUuQmFzZUdsb2JhbENsZWFudXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC51aS5pbnRlcm5hbC51dGlsLlR5cGVzSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwudXRpbC5YU0RET01IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uY3JldGVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW5jbHVkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUmVkZWZpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hRGlyZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLy8gU2hvdWxkIHRyeSB0byB1c2UgeHNkZWRpdG9yJ3MgZGVsZXRlIGFjdGlvbi4uLi4KLQotcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIERlbGV0ZUludGVyZmFjZUFjdGlvbgotewotICBYU0RTY2hlbWEgeHNkU2NoZW1hOwotICBEZWZpbml0aW9uIGRlZmluaXRpb247Ci0gIExpc3QgZGVsZXRlTGlzdDsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlQWN0aW9uLgotICAgKiBAcGFyYW0gdGV4dAotICAgKi8KLSAgcHVibGljIERlbGV0ZUFjdGlvbihTdHJpbmcgdGV4dCkKLSAgewotICAgIHN1cGVyKFhTREVkaXRvclBsdWdpbi5nZXRYU0RTdHJpbmcoIl9VSV9BQ1RJT05fREVMRVRFIikpOwotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRTY2hlbWEoKQotICB7Ci0gICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKQotICB7Ci0gICAgdGhpcy54c2RTY2hlbWEgPSB4c2RTY2hlbWE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXREZWxldGVMaXN0KExpc3QgbGlzdCkgewotICAJZGVsZXRlTGlzdCA9IGxpc3Q7Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldERlbGV0ZUxpc3QoKSB7Ci0gIAlyZXR1cm4gZGVsZXRlTGlzdDsKLSAgfQotCi0gIC8qCi0gICAqIEBzZWUgSUFjdGlvbiNydW4oKQotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIExpc3Qgc2VsZWN0aW9ucyA9IGdldERlbGV0ZUxpc3QoKTsKLSAgICAKLSAgICBpZiAoc2VsZWN0aW9ucy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9ucy5pdGVyYXRvcigpOwotICAgIERvY3VtZW50SW1wbCBkb2MgPSBudWxsOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IG5vZGU7Ci0gICAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgbm9kZSA9IChFbGVtZW50KW9iajsKLSAgICAgICAgT2JqZWN0IGVsZW0gPSBXU0RMRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpLmZpbmRNb2RlbE9iamVjdEZvckVsZW1lbnQoZGVmaW5pdGlvbiwgbm9kZSk7Ci0gICAgICAgIGlmIChlbGVtIGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgICB7Ci0gICAgICAgICAgeHNkU2NoZW1hID0gKChYU0RDb21wb25lbnQpZWxlbSkuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgWFNEQ29tcG9uZW50KQotICAgICAgewotICAgICAgICBub2RlID0gKChYU0RDb21wb25lbnQpb2JqKS5nZXRFbGVtZW50KCk7Ci0gICAgICAgIHhzZFNjaGVtYSA9ICgoWFNEQ29tcG9uZW50KW9iaikuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgewotICAgICAgCW5vZGUgPSAoKFhTRENvbmNyZXRlQ29tcG9uZW50KW9iaikuZ2V0RWxlbWVudCgpOwotICAgICAgCXhzZFNjaGVtYSA9ICgoWFNEQ29uY3JldGVDb21wb25lbnQpb2JqKS5nZXRTY2hlbWEoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOyAKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICBpZiAoIVhTRERPTUhlbHBlci5pbnB1dEVxdWFscyhub2RlLCBYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHLCBmYWxzZSkpCi0gICAgICB7Ci0gICAgICAgIAotICAgICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkb2MgPSAoRG9jdW1lbnRJbXBsKSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICBkb2MuZ2V0TW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBYU0RFZGl0b3JQbHVnaW4uZ2V0WFNEU3RyaW5nKCJfVUlfQUNUSU9OX0RFTEVURV9OT0RFUyIpKTsKLSAgICAgICAgfQotICAKLSAgICAgICAgYm9vbGVhbiByZWZyZXNoID0gY2xlYW51cFJlZmVyZW5jZXMobm9kZSk7Ci0gICAgICAgIFhTRERPTUhlbHBlci5yZW1vdmVOb2RlQW5kV2hpdGVzcGFjZShub2RlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFdvcmthcm91bmQgdG8gcmVzZXQgaW5jbHVkZWQgZWxlbWVudHMgaW4gWFNEIG1vZGVsCi0gICAgICAgIGlmIChyZWZyZXNoKQotICAgICAgICB7Ci0vLyBUT0RPCi0vLyAgICAgICAgICBnZXRFZGl0b3IoKS5yZXBhcnNlU2NoZW1hKCk7Ci0vLyAgICAgICAgICBnZXRFZGl0b3IoKS5nZXRHcmFwaFZpZXdlcigpLnNldFNjaGVtYShnZXRFZGl0b3IoKS5nZXRYU0RTY2hlbWEoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIGRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhbnVwUmVmZXJlbmNlcyhOb2RlIGRlbGV0ZWROb2RlKQotICB7Ci0gICAgYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7Ci0gICAgWFNEQ29uY3JldGVDb21wb25lbnQgY29tcCA9IGdldFNjaGVtYSgpLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoZGVsZXRlZE5vZGUpOwotICAgIAotICAgIGlmIChjb21wIGluc3RhbmNlb2YgWFNESW5jbHVkZSB8fAotICAgICAgICBjb21wIGluc3RhbmNlb2YgWFNESW1wb3J0IHx8Ci0gICAgICAgIGNvbXAgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWEgPSAoKFhTRFNjaGVtYURpcmVjdGl2ZSljb21wKS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgWFNEU2NoZW1hIHJlZmVyZW5jZWRTY2hlbWEgPSBudWxsOwotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJbmNsdWRlKQotICAgICAgewotICAgICAgICByZWZlcmVuY2VkU2NoZW1hID0gKChYU0RJbmNsdWRlKWNvbXApLmdldEluY29ycG9yYXRlZFNjaGVtYSgpOwotICAgICAgICByZWZyZXNoID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RSZWRlZmluZSkKLSAgICAgIHsKLSAgICAgICAgcmVmZXJlbmNlZFNjaGVtYSA9ICgoWFNEUmVkZWZpbmUpY29tcCkuZ2V0SW5jb3Jwb3JhdGVkU2NoZW1hKCk7Ci0gICAgICAgIHJlZnJlc2ggPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICAgIHsKLSAgICAgICAgIHJlZmVyZW5jZWRTY2hlbWEgPSAoKFhTREltcG9ydCljb21wKS5nZXRSZXNvbHZlZFNjaGVtYSgpOwotICAgICAgfQotCi0gICAgICBpZiAocmVmZXJlbmNlZFNjaGVtYSAhPSBudWxsKQotICAgICAgewotLy8gICAgICAgIFhTREV4dGVybmFsRmlsZUNsZWFudXAgY2xlYW5IZWxwZXIgPSBuZXcgWFNERXh0ZXJuYWxGaWxlQ2xlYW51cChyZWZlcmVuY2VkU2NoZW1hKTsKLS8vICAgICAgICBjbGVhbkhlbHBlci52aXNpdFNjaGVtYShnZXRTY2hlbWEoKSk7Ci0vLyAgICAgICAgLy8gcG9wdWxhdGUgbWVzc2FnZXMKLS8vLy8gVE9ETwotLy8vLyAgICAgICAgZ2V0RWRpdG9yKCkuY3JlYXRlVGFza3NJblRhc2tMaXN0KGNsZWFuSGVscGVyLmdldE1lc3NhZ2VzKCkpOwotICAgICAgfQotICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICB7Ci0gICAgICAgIFR5cGVzSGVscGVyIHR5cGVzSGVscGVyID0gbmV3IFR5cGVzSGVscGVyKGdldFNjaGVtYSgpKTsKLSAgICAgICAgdHlwZXNIZWxwZXIudXBkYXRlTWFwQWZ0ZXJEZWxldGUoKFhTREltcG9ydCljb21wKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZ2V0U2NoZW1hKCkuZXF1YWxzKGNvbXAuZ2V0Q29udGFpbmVyKCkpKQotICAgIHsKLSAgICAgIEJhc2VHbG9iYWxDbGVhbnVwIGNsZWFuSGVscGVyID0gbnVsbDsKLSAgIC8vICAgT25seSBuZWVkIHRvIGNsZWFuIHVwIHJlZmVyZW5jZXMgaWYgdGhlIGNvbXBvbmVudCBiZWluZyBkZWxldGVkIGlzIGdsb2JhbCBzY29wZWQKLS8vICAgICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlciA9IG5ldyBHbG9iYWxFbGVtZW50Q2xlYW51cChjb21wKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNETW9kZWxHcm91cERlZmluaXRpb24pCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlciA9IG5ldyBHbG9iYWxHcm91cENsZWFudXAoY29tcCk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTRFR5cGVEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsU2ltcGxlT3JDb21wbGV4VHlwZUNsZWFudXAoY29tcCk7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoY29tcCBpbnN0YW5jZW9mIFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsQXR0cmlidXRlQ2xlYW51cChjb21wKTsKLS8vICAgICAgfQotLy8gICAgICBlbHNlIGlmIChjb21wIGluc3RhbmNlb2YgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKQotLy8gICAgICB7Ci0vLyAgICAgICAgY2xlYW5IZWxwZXIgPSBuZXcgR2xvYmFsQXR0cmlidXRlR3JvdXBDbGVhbnVwKGNvbXApOwotLy8gICAgICB9Ci0vLyAgICAgIAotLy8gICAgICAKLS8vICAgICAgaWYgKGNsZWFuSGVscGVyICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICBjbGVhbkhlbHBlci52aXNpdFNjaGVtYShnZXRTY2hlbWEoKSk7Ci0vLyAgICAgICAgLy8gcG9wdWxhdGUgbWVzc2FnZXMKLS8vLy8gVE9ETwotLy8vLyAgICAgICAgZ2V0RWRpdG9yKCkuY3JlYXRlVGFza3NJblRhc2tMaXN0KGNsZWFuSGVscGVyLmdldE1lc3NhZ2VzKCkpOwotLy8gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZWZyZXNoOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYURyaWxsRG93bkVkaXRQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC91aS9pbnRlcm5hbC94c2QvZ3JhcGgvZWRpdHBhcnRzL1hTRFNjaGVtYURyaWxsRG93bkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNmFjZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2dyYXBoL2VkaXRwYXJ0cy9YU0RTY2hlbWFEcmlsbERvd25FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC54c2QuZ3JhcGguZWRpdHBhcnRzOwotICAgICAgICAgCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudWkuaW50ZXJuYWwuZ3JhcGguZWRpdHBhcnRzLkRyaWxsRG93bkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuWFNERWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYURyaWxsRG93bkVkaXRQYXJ0IGV4dGVuZHMgRHJpbGxEb3duRWRpdFBhcnQgCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgSUZpZ3VyZSBmaWd1cmUgPSBzdXBlci5jcmVhdGVGaWd1cmUoKTsKLSAgICBsYWJlbC5zZXRJY29uKFhTREVkaXRvclBsdWdpbi5nZXRYU0RJbWFnZSgiaWNvbnMvWFNERmlsZS5naWYiKSk7Ci0gICAgcmV0dXJuIGZpZ3VyZTsKLSAgfSAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWdldE1vZGVsKCk7Ci0gICAgU3RyaW5nIG5zID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpICE9IG51bGwgPyBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgOiAiIjsKLSAgICBsYWJlbC5zZXRUZXh0KG5zKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3VpL2ludGVybmFsL3hzZC9ncmFwaC9lZGl0cGFydHMvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRFZGl0UGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2dyYXBoL2VkaXRwYXJ0cy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDI0NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdWkvaW50ZXJuYWwveHNkL2dyYXBoL2VkaXRwYXJ0cy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnVpLmludGVybmFsLnhzZC5ncmFwaC5lZGl0cGFydHM7Ci0gICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QudWkuaW50ZXJuYWwuZ2VmLnV0aWwuZmlndXJlcy5Db250YWluZXJGaWd1cmU7Ci0KLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgcHVibGljIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RWRpdFBhcnQoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpCi0gIHsKLSAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICB9Ci0KLSAgcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDb250YWluZXJGaWd1cmUgZmlndXJlID0gbmV3IENvbnRhaW5lckZpZ3VyZSgpOyAgICAKLSAgICByZXR1cm4gZmlndXJlOwotICB9ICAgIAotCi0gIHByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVDaGlsZChPYmplY3QgbW9kZWwpIAotICB7Ci0gICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlRWRpdFBhcnQodGhpcywgbW9kZWwpOwotICB9ICAgICAgCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIAotICB7IAotICAgIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZ2V0TW9kZWwoKTsKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICByZXN1bHQuYWRkKGUuZ2V0U2NoZW1hKCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgCi0gIHsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDY5NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvd3NkbHZhbGlkYXRldWkiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjL3dzZGx2YWxpZGF0ZSI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmIxY2U0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXdzZGx2YWxpZGF0ZS5qYXIKLXdzZGx2YWxpZGF0ZXVpLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTkwYzM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb248L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWEzZDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb247IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB3c2RsdmFsaWRhdGV1aS5qYXIsCi0gd3NkbHZhbGlkYXRlLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlLlZhbGlkYXRlV1NETFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJV9QUk9WSURFUl9OQU1FCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiAuLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlciwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50LAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLnRleHQsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLmh0dHAsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEubWltZSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5zb2FwLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5hcGFjaGUuYW50LAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy53c2RsNGosCi0gb3JnLmFwYWNoZS54ZXJjZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotUGx1Z2luLUNsYXNzOiBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVmFsaWRhdGVXU0RMUGx1Z2luCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNhMjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gd3NkbHZhbGlkYXRlLmphcixcCi0gICAgICAgICAgICAgICB3c2RsdmFsaWRhdGV1aS5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBvdXRwdXQud3NkbHZhbGlkYXRlLmphciA9IGJpbi8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2Uud3NkbHZhbGlkYXRlLmphciA9IHNyYy93c2RsdmFsaWRhdGUvCi1zb3VyY2Uud3NkbHZhbGlkYXRldWkuamFyID0gc3JjL3dzZGx2YWxpZGF0ZXVpLwotamFycy5jb21waWxlLm9yZGVyID0gd3NkbHZhbGlkYXRlLmphcixcCi0gICAgICAgICAgICAgICAgICAgICB3c2RsdmFsaWRhdGV1aS5qYXIKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL2V4dHZhbGlkYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvZXh0dmFsaWRhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZGQwNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvZXh0dmFsaWRhdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgaWQ9ImV4dHZhbGlkYXRvciIgbmFtZT0iV1NETCBFeHRlbnNpb24gVmFsaWRhdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEFuIGV4dGVuc2lvbiBwb2ludCB0byBhbGxvdyBwbHVnZ2luIGluIGV4dGVuc2lvbiB2YWxpZGF0b3JzIHRvIHJ1biBwb3N0IFdTREwgdmFsaWRhdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0dmFsaWRhdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHR2YWxpZGF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2VidW5kbGUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC91cmlyZXNvbHZlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2QvdXJpcmVzb2x2ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4NjRkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC91cmlyZXNvbHZlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgaWQ9InVyaXJlc29sdmVyIiBuYW1lPSJXU0RMIFVSSSBSZXNvbHZlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ1cmlyZXNvbHZlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idXJpcmVzb2x2ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3dzZGwxMXZhbGlkYXRvci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2Qvd3NkbDExdmFsaWRhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzN2JiOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2V4c2Qvd3NkbDExdmFsaWRhdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgaWQ9IndzZGwxMXZhbGlkYXRvciIgbmFtZT0iV1NETCAxLjEgRXh0ZW5zaW9uIFZhbGlkYXRvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3c2RsMTF2YWxpZGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndzZGwxMXZhbGlkYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZWJ1bmRsZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3htbGNhdGFsb2cuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9leHNkL3htbGNhdGFsb2cuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlNDliMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vZXhzZC94bWxjYXRhbG9nLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIgaWQ9InhtbGNhdGFsb2ciIG5hbWU9IldTREwgWE1MIENhdGFsb2ciLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVudGl0eSIvPgotICAgICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzY2hlbWFkaXIiLz4KLSAgICAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZW50aXR5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHVibGljSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNjaGVtYWRpciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2xpYi8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkyZjBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9saWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSouamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4M2VkOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24KLSEtLSBUb29sIE5hbWUKLQotX1BMVUdJTl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gV1NETCBWYWxpZGF0b3IKLV9QUk9WSURFUl9OQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVjbGlwc2Uub3JnCi0KLSEtLSBVSSBNZW51IEl0ZW0KLV9VSV9NRU5VX1ZBTElEQVRFX1dTREwgICAgICAgICAgICAgICAgICAgICA9IFZhbGlkYXRlIFdTREwgRmlsZQotX1VJX1dTRExfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgICAgICAgID0gV1NETCBWYWxpZGF0b3IKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwZTZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8IS0tIFdTREwgZXh0ZW5zaW9uIHZhbGlkYXRvci4gVGhpcyBpcyBhbiBleHRlbnNpb24gdGhhdCB3aWxsIHJ1bgotICAgICAgICBhZnRlciBXU0RMIHZhbGlkYXRpb24gaWYgV1NETCB2YWxpZGF0aW9uIGlzIHN1Y2Nlc3NmdWwuICAtLT4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImV4dHZhbGlkYXRvciIgbmFtZT0iV1NETCBFeHRlbnNpb24gVmFsaWRhdG9yIiBzY2hlbWE9ImV4c2QvZXh0dmFsaWRhdG9yLmV4c2QiLz4KLSAgIAotICAgPCEtLSBXU0RMIDEuMSB2YWxpZGF0b3IgZXh0ZW5zaW9uLiBUbyBwcm92aWRlIGEgbmFtZXNwYWNlIHNwZWNpZmljIFdTREwgMS4xCi0gICAgICAgIHZhbGlkYXRvci4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ3c2RsMTF2YWxpZGF0b3IiIG5hbWU9IldTREwgMS4xIEV4dGVuc2lvbiBWYWxpZGF0b3IiIHNjaGVtYT0iZXhzZC93c2RsMTF2YWxpZGF0b3IuZXhzZCIvPgotICAgCi0gICA8IS0tIEFuIGV4dGVuc2lvbiB0byBhZGQgWE1MIGNhdGFsb2cgZW50cmllcyB0byB0aGUgV1NETCB2YWxpZGF0b3IuCi0gICAgICAgIE1hbnkgZW50aXJlcyBjYW4gYmUgYWRkZWQgYXMgc2VlbiBiZWxvdy4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IG5hbWU9IldTREwgWE1MIENhdGFsb2ciIGlkPSJ4bWxjYXRhbG9nIiBzY2hlbWE9ImV4c2QveG1sY2F0YWxvZy5leHNkIi8+Ci0KLSAgIDwhLS0gQW4gZXh0ZW5zaW9uIHRvIGFkZCBhIFVSSSByZXNvbHZlciB0byB0aGUgV1NETCB2YWxpZGF0b3IuIFVSSSByZXNvbHZlcnMKLSAgICAgICAgYXJlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgbG9jYXRpb24gb2YgaW1wb3J0ZWQgZG9jdW1lbnRzIHN1Y2ggYXMgV1NETCBhbmQKLSAgICAgICAgWFNEIHRocm91Z2ggdGhlIFdTREwgYW5kIHNjaGVtYSBpbXBvcnQgbWVjaGFuaXNtcy4gCi0gICAgICAgIFRoaXMgaXMgaG93IHRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQuCi0gICAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUudXJpcmVzb2x2ZXIiPgotICAgICAgICAgIDx1cmlyZXNvbHZlciBjbGFzcz0iZnVsbCBuYW1lIG9mIHlvdXIgY2xhc3MiLz4KLSAgICAgICAgPC9leHRlbnNpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBuYW1lPSJXU0RMIFVSSSBSZXNvbHZlciIgaWQ9InVyaXJlc29sdmVyIiBzY2hlbWE9ImV4c2QvdXJpcmVzb2x2ZXIuZXhzZCIvPgotCi0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDwhLS0gU2V0IHRoZSBWYWxpZGF0ZSBXU0RMIEZpbGUgY29udGV4dCBtZW51IGl0ZW0uIFRoaXMgICAgIC0tPgotICAgPCEtLSBtZW51IGl0ZW0gc2hvdWxkIGJlIHJlbW92ZWQgb25jZSB0aGUgdmFsaWRhdGlvbiAgICAgICAgLS0+Ci0gICA8IS0tIGZyYW1ld29yayBpcyBtb2RpZmllZCB0byBjcmVhdGUgdGhlIGl0ZW0uICAgICAgICAgICAgICAtLT4KLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi53c2RsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24ud3NkbGFjdGlvbiI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9NRU5VX1ZBTElEQVRFX1dTREwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlLlZhbGlkYXRlV1NETEFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVmFsaWRhdGVXU0RMQWN0aW9uRGVsZWdhdGUiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDwhLS0gU2V0IHRoZSBYTUwgQ2F0YWxvZyBlbnRyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgPCEtLSBUaGVzZSBlbnRyaWVzIGFyZSBjb21tZW50ZWQgb3V0IHVudGlsIHN1Y2ggdGltZSBhcyAgICAgLS0+Ci0gICA8IS0tIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBpbmNsdWRlIHRoZW0gaW4gdGhpcyBwbHVnaW4uICAtLT4KLSAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgPCEtLWV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi54bWxjYXRhbG9nIi0tPgotICAgICA8IS0tZW50aXR5Ci0gICAgICAgcHVibGljSWQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLSAgICAgICBsb2NhdGlvbj0ieHNkL3dzZGwueHNkIiAvLS0+Ci0gICAgIDwhLS1lbnRpdHkKLSAgICAgICBwdWJsaWNJZD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgCi0gICAgICAgbG9jYXRpb249InhzZC9odHRwLnhzZCIgLy0tPgotICAgICA8IS0tZW50aXR5Ci0gICAgICAgcHVibGljSWQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgICAgIGxvY2F0aW9uPSJ4c2Qvc29hcC54c2QiIC8tLT4KLSAgICAgPCEtLWVudGl0eQotICAgICAgIHB1YmxpY0lkPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiAKLSAgICAgICBsb2NhdGlvbj0ieHNkL3dzZGwtbWltZS54c2QiIC8tLT4KLSAgICAgPCEtLWVudGl0eSAKLSAgICAgICBwdWJsaWNJZD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIAotICAgICAgIGxvY2F0aW9uPSJ4c2Qvc29hcGVuYy54c2QiIC8tLT4KLSAgICAgPCEtLSBUaGUgeG1sLXNvYXAgZG9lcyBub3QgZXhpc3QgYnV0IGlzIHVzZWQgaW4gY2VydGFpbiBkb2N1bWVudHMuCi0gICAgICAgICAgSXQgaXMgaW5jbHVkZWQgaGVyZSBzbyB0aGUgdmFsaWRhdG9yIHdpbGwgcmVjb2duaXplIGl0LiAtLT4KLSAgICAgPCEtLWVudGl0eQotICAgICAgIHB1YmxpY0lkPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIAotICAgICAgIGxvY2F0aW9uPSJ4c2QveG1sLXNvYXAueHNkIiAvLS0+Ci0gICA8IS0tL2V4dGVuc2lvbi0tPgotICAgCi0gICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDwhLS0gQW4gZXh0ZW5zaW9uIGZvciBhZGRpbmcgdGhlIFVSSSByZXNvbHZlciBmcm9tICAgICAgICAgIC0tPgotICAgPCEtLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyIHRvIHRoZSBXU0RMICAgICAgICAgLS0+Ci0gICA8IS0tIHZhbGlkYXRvci4JCQkJCQkJCQkJCSAgIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnVyaXJlc29sdmVyIj4KLSAgICAgPHVyaXJlc29sdmVyIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2UuVVJJUmVzb2x2ZXJXcmFwcGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8IS0tIEFuIGV4dGVuc2lvbiBmb3IgYWRkaW5nIHRoZSBXU0RMIHZhbGlkYXRvciB0byB0aGUgICAgICAtLT4KLSAgIDwhLS0gdmFsaWRhdGlvbiBmcmFtZXdvcmsuIAkJCQkJCSAgICAgICAgICAgLS0+CQkJCQkJCQkJCSAgIC0tPgotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0id3NkbFZhbGlkYXRvciIKLSAgICAgICAgIG5hbWU9IiVfVUlfV1NETF9WQUxJREFUT1IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxoZWxwZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5IZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlLlZhbGlkYXRvciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvdmFsaWRhdG9yPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzJjYTdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotLyoqCi0gKiBTZXQgY29uc3RhbnRzIHRoYXQgdGhlIHZhbGlkYXRvciBtYWtlcyB1c2Ugb2YuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29uc3RhbnRzCi17Ci0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIHByb3BlcnRpZXMgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFdTRExfVkFMSURBVE9SX1BST1BFUlRJRVNfRklMRSA9ICJ2YWxpZGF0ZXdzZGwiOwotCi0gIC8qKgotICAgKiBUaGUgU09BUCAxLjEgbmFtZXNwYWNlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfU09BUDExID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotCi0gIC8qKgotICAgKiBUaGUgSFRUUCBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19IVFRQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iOwotCi0gIC8qKgotICAgKiBUaGUgTUlNRSBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19NSU1FID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db250cm9sbGVyVmFsaWRhdGlvbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udHJvbGxlclZhbGlkYXRpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjRkNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9Db250cm9sbGVyVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciB0aGUgdmFsaWRhdGlvbiBpbmZvIHRoYXQgYWxsb3dzIGZvciBzdGFydGluZyBhbmQKLSAqIGNvbXBsZXRpbmcgV1NETCBhbmQgV1MtSSB2YWxpZGF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRyb2xsZXJWYWxpZGF0aW9uSW5mbyBleHRlbmRzIElWYWxpZGF0aW9uSW5mbwotewotICAKLSAgLyoqCi0gICAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBzdGVwcyB0byBjb21wbGV0ZSBXU0RMIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb21wbGV0ZVdTRExWYWxpZGF0aW9uKCk7Ci0gIAotLy8gIC8qKgotLy8gICAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBzdGVwcyB0byBjb21wbGV0ZSBXUy1JIFdTREwgdmFsaWRhdGlvbi4KLS8vICAgKi8KLS8vICBwdWJsaWMgdm9pZCBjb21wbGV0ZVdTSVZhbGlkYXRpb24oKTsKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiZmIyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHZlcjsKLQotCi0vKioKLSAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uSW5mbyBleHRlbmRzIElWYWxpZGF0aW9uUmVwb3J0Ci17Ci0gIAotICAvKioKLSAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgZmlsZS4gKFVzZXMgdGhlIFVSSSBmcm9tIHRoaXMgdmFsaWRhdGlvbiBpbmZvIG9iamVjdC4pCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgaW4gdGhlIGZpbGUuCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4pOwotICAKLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgZm9yIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVycm9yIGluIHRoZSBmaWxlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVycm9yIGluIHRoZSBmaWxlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZXJyb3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmkpOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhpcyBmaWxlLiAoVXNlcyB0aGUgVVJJIGZyb20gdGhpcyB2YWxpZGF0aW9uIGluZm8gb2JqZWN0LikKLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgd2FybmluZyBpbiB0aGUgZmlsZS4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uKTsKLSAgCi0gIC8qKgotICAgKiBBZGQgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHdhcm5pbmcuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nIGluIHRoZSBmaWxlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIHdhcm5pbmcgaW4gdGhlIGZpbGUuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlcnJvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKTsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFVSSSByZXNvbHZlciBpbiB1c2UgZm9yIHRoaXMgdmFsaWRhdGlvbi4gVGhlIFVSSSByZXNvbHZlcgotICAgKiByZXR1cm5lZCBpcyBhY3R1YWxseSBhIFVSSSByZXNvbHZlciBoYW5kbGVyIHRoYXQgd2lsbCAKLSAgICogaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBVUkkgcmVzb2x2ZXJzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIHJlc29sdmVyIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgSVVSSVJlc29sdmVyIGdldFVSSVJlc29sdmVyKCk7Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgdGhlIGF0dHJpYnV0ZQotICAgKiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCwgcmV0dXJuIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGJlaW5nIHJlcXVlc3RlZC4KLSAgICogQHJldHVybiBUaGUgYXR0cmlidXRlIHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgaGFzIGJlZW4gcmVnaXN0ZXJlZCwgbnVsbCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9JVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1YTlhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSB2YWxpZGF0aW9uIG1lc3NhZ2UuIEEgdmFsaWRhdGlvbiBtZXNzYWdlIGNvbnRhaW5zIGluZm9ybWF0aW9uCi0gKiBmb3IgdGhlIG1lc3NhZ2UsIGl0cyBzZXZlcml0eSBhbmQgd2hlcmUgaXQncyBsb2NhdGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uTWVzc2FnZQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgRVJST1JfTUVTU0FHRV9NQVBfUVVBTElGSUVEX05BTUUgPSBuZXcgUXVhbGlmaWVkTmFtZSgib3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZSIsICJlcnJvck1lc3NhZ2VNYXAiKTsKLSAgLyoqCi0gICAqIFNldmVyaXR5IGVycm9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VWX0VSUk9SID0gMDsKLSAgLyoqCi0gICAqIFNldmVyaXR5IHdhcm5pbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZfV0FSTklORyA9IDE7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgVVJJIGZvciB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBtZXNzYWdlIGZvciB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UgZm9yIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBzZXZlcml0eSBvZiB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHNldmVyaXR5IG9mIHRoaXMgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRTZXZlcml0eSgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgbGluZSB3aGVyZSB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbGluZSB3aGVyZSB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBjb2x1bW4gd2hlcmUgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNvbHVtbiB3aGVyZSB0aGlzIHZhbGlkYXRpb24gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW4oKTsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25SZXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkNGJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lWYWxpZGF0aW9uUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSBXU0RMIHZhbGlkYXRpb24gcmVwb3J0LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uUmVwb3J0Ci17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoZSByZXBvcnQgcmVmZXJzIHRvLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIGZvciB0aGUgZmlsZSB0aGUgcmVwb3J0IHJlZmVycyB0by4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZmlsZSBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIFdTREwgc3BlY2lmaWNhdGlvbi4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZSBpcyBXU0RMIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dTRExWYWxpZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgSVZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBlcnJvcnMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBhcmUgZXJyb3JzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKTsKLSAgCi0gIHB1YmxpYyBIYXNoTWFwIGdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVdTRExWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvSVdTRExWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3OGU5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL0lXU0RMVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uLlZhbGlkYXRlV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZm9yIGEgV1NETCB2YWxpZGF0b3IuIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSB0b3AgbGV2ZWwgdmFsaWRhdG9yIAotICogY29tcG9uZW50IHN1Y2ggYXMgYSBXU0RMIDEuMSB2YWxpZGF0b3IsIFdTREwgMS4yIHZhbGlkYXRvciBvciBXUy1JIEJhc2ljIFByb2ZpbGUgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXU0RMVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIGRvbU1vZGVsIEEgRE9NIG1vZGVsIG9mIHRoZSBmaWxlIHRvIGJlIHZhbGlkYXRlZC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgdmFsaWRhdGlvbiB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZC4KLSAgICogQHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKERvY3VtZW50IGRvbU1vZGVsLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbykgdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogc2V0UmVzb3VyY2VCdW5kbGUKLSAgICogU2V0IHRoZSBSZXNvdXJjZUJ1bmRsZSBmb3IgdGhpcyB2YWxpZGF0b3IuIEFsbG93cyB0aGUgdXNlIG9mIGRpZmZlcmVuY2UgCi0gICAqIFJlc291cmNlQnVuZGxlcyBmb3IgZGlmZmVyZW50IHZhbGlkYXRvcnMuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4MGI2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25Db250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRXJyb3JSZXBvcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uLlZhbGlkYXRlV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLkFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLkRlZmF1bHRYTUxWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuSVhNTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5MaW5lTnVtYmVyRE9NUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeXBvaW50IHRvIHRoZSBXU0RMIFZhbGlkYXRvci4gVGhlIGNvbnRyb2xsZXIgaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSByZWFkZXIsIHRoZSBYTUwgY29uZm9ybWFuY2UgY2hlY2ssIHRoZSBXU0RMCi0gKiB2YWxpZGF0aW9uIGFuZCB0aGUgV1MtSSB2YWxpZGF0aW9uIGlmIHNlbGVjdGVkLiBUaGUgY29udHJvbGxlciBjb250YWlucyBhbnkKLSAqIGVycm9ycyBhbmQgd2FybmluZ3MgZ2VuZXJhdGVkIGFzIHdlbGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uQ29udHJvbGxlcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FUlJPUl9QUk9CTEVNX1dTRExfVkFMSURBVE9SID0gIl9FUlJPUl9QUk9CTEVNX1dTRExfVkFMSURBVE9SIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fV1NETF9WQUxJREFUT1IgPSAiX0VSUk9SX05PX1dTRExfVkFMSURBVE9SIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfUFJPQkxFTV9FWFRfVkFMSURBVE9SID0gIl9FUlJPUl9QUk9CTEVNX0VYVF9WQUxJREFUT1IiOwotCi0gIHByb3RlY3RlZCBWYWxpZGF0b3JSZWdpc3RyeSB2ZXI7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZTsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyOwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLy9wcm90ZWN0ZWQgU3RyaW5nIHdzZGxOYW1lc3BhY2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgUmVzb3VyY2VCdW5kbGUgbmVlZHMgdG8gYmUgc2V0IHNvIGl0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHJlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSByYgotICAgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25Db250cm9sbGVyKFJlc291cmNlQnVuZGxlIHJiLCBVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJlc291cmNlYnVuZGxlKTsKLSAgICB0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0KLSAgICB2ZXIgPSBWYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIHRoZSBhdHRyaWJ1dGVzIHNwZWNpZmllZCB0byB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBhdHRyaWJ1dGVzIFRoZSBhdHRyaWJ1dGVzIHRvIGFkZCB0byB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoSGFzaHRhYmxlIGF0dHJpYnV0ZXMpCi0gIHsKLSAgCXRoaXMuYXR0cmlidXRlcy5wdXRBbGwoYXR0cmlidXRlcyk7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFdTREwgZmlsZS4gQ2hlY2sgdGhlIGZpbGUgZm9yIFhNTCBjb25mb3JtYW5jZS4gSWYgaXQgaXMgWE1MCi0gICAqIGNvbmZvcm1hbnQsIHJlYWQgdGhlIGZpbGUgYW5kIGNoZWNrIGl0IGZvciBXU0RMIGNvbmZvcm1hbmNlLiBJZiBpdCBpcyBXU0RMCi0gICAqIGNvbmZvcm1hbnQgYW5kIFdTLUkgY29uZm9ybWFuY2UgaXMgc2V0IHRvIHN1Z2dlc3Qgb3IgcmVxdWlyZSwgY2hlY2sgdGhlCi0gICAqIGZpbGUgZm9yIFdTLUkgY29uZm9ybWFuY2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqICAgICAgICAgICAgVGhlIHVyaSB3aGVyZSB0aGUgV1NETCBkb2N1bWVudCBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gd3NpTGV2ZWwKLSAgICogICAgICAgICAgICBUaGUgbGV2ZWwgb2YgV1MtSSBjb25mb3JtYW5jZSB0byB1c2UgZm9yIHZhbGlkYXRpb24uCi0gICAqIEByZXR1cm4gQSB2YWxpZGF0aW9uIHJlcG9ydCB3aXRoIHRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoZSBmaWxlLgotICAgKi8KLS8vICBwdWJsaWMgSVZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLS8vICB7IHJldHVybiB2YWxpZGF0ZSh1cmksIG51bGwpOwotLy8gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlIHdpdGggdGhlIHN0cmVhbS4gVGhpcyBtZXRob2Qgd2lsbCBydW4gdGhlIGNoZWNrIG9mIHRoZSAKLSAgICogV1NETCBkb2N1bWVudC4gVGhlIHZhbGlkYXRpb24gaXMgYnJva2VuIHVwIGludG8gdGhyZWUgc3RhZ2VzOiBYTUwgY29uZm9ybWFuY2UsCi0gICAqIFdTREwgc2VtYW50aWMsIGFuZCBwb3N0IHZhbGlkYXRpb24uCi0gICAqIAotICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBXU0RMIGRvY3VtZW50IHRvIGJlIHZhbGlkYXRlZC4KLSAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUgY29udGVudHMgb2YgdGhlIFdTREwgZG9jdW1lbnQgdG8gYmUgdmFsaWRhdGVkLgotICogQHJldHVybiBBIHZhbGlkYXRpb24gcmVwb3J0IHdpdGggdGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGZpbGUuCi0gKi8KLSAgcHVibGljIElWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgCi0gICAgSW5wdXRTdHJlYW0geG1sVmFsaWRhdGVTdHJlYW0gPSBudWxsOwotICAgIElucHV0U3RyZWFtIHdzZGxWYWxpZGF0ZVN0cmVhbSA9IG51bGw7Ci0gICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0gICAgeyAvL2NvcHkgdGhlIGlucHV0U3RyZWFtIHNvIHdlIGNhbiB1c2UgaXQgbW9yZSB0aGFuIG9uY2UKLSAgICAgIFN0cmluZyBjb250ZW50cyA9IGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICAgIHhtbFZhbGlkYXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzLmdldEJ5dGVzKCkpOwotICAgICAgd3NkbFZhbGlkYXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzLmdldEJ5dGVzKCkpOwotICAgIH0KLSAgICAKLSAgICBDb250cm9sbGVyVmFsaWRhdGlvbkluZm8gdmFsSW5mbyA9IG5ldyBWYWxpZGF0aW9uSW5mb0ltcGwodXJpLCBtZXNzYWdlZ2VuZXJhdG9yKTsKLSAgICAoKFZhbGlkYXRpb25JbmZvSW1wbCl2YWxJbmZvKS5zZXRVUklSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gICAgKChWYWxpZGF0aW9uSW5mb0ltcGwpdmFsSW5mbykuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQotICAgIGlmICh2YWxpZGF0ZVhNTCh2YWxJbmZvLCB4bWxWYWxpZGF0ZVN0cmVhbSkpCi0gICAgewotICAgICAgRG9jdW1lbnQgd3NkbGRvYyA9IGdldERvY3VtZW50KHVyaSwgd3NkbFZhbGlkYXRlU3RyZWFtKTsKLSAgICAgIFN0cmluZyB3c2RsbnMgPSBnZXRXU0RMTmFtZXNwYWNlKHdzZGxkb2MpOwotICAgICAgaWYgKHZhbGlkYXRlV1NETCh3c2RsZG9jLCB2YWxJbmZvLCB3c2RsbnMpKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUV4dGVuc2lvblZhbGlkYXRvcnMod3NkbGRvYywgdmFsSW5mbywgd3NkbG5zKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChJVmFsaWRhdGlvblJlcG9ydCl2YWxJbmZvOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGZvciBYTUwgY29uZm9ybWFuY2UuCi0JICogQHBhcmFtIHZhbEluZm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZhbGlkYXRpb24KLSAgICogQHBhcmFtIGlucHV0U3RyZWFtIHRoZSBpbnB1dFN0cmVhbSB0byB2YWxpZGF0ZQotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgY29uZm9ybWFudCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVYTUwoQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIHZhbEluZm8sIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgSVhNTFZhbGlkYXRvciB4bWxWYWxpZGF0b3IgPSBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFhNTFZhbGlkYXRvcigpOwotICAgIHhtbFZhbGlkYXRvci5zZXRVUklSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gICAgeG1sVmFsaWRhdG9yLnNldEZpbGUodmFsSW5mby5nZXRGaWxlVVJJKCkpOwotICAgIGlmICh4bWxWYWxpZGF0b3IgaW5zdGFuY2VvZiBEZWZhdWx0WE1MVmFsaWRhdG9yKQotICAgIHsKLSAgICAgICAgKChEZWZhdWx0WE1MVmFsaWRhdG9yKXhtbFZhbGlkYXRvcikuc2V0SW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgIH0KLSAgICAvL3htbFZhbGlkYXRvci5zZXRWYWxpZGF0aW9uSW5mbyh2YWxJbmZvKTsKLSAgICB4bWxWYWxpZGF0b3IucnVuKCk7Ci0gICAgLy8gaWYgdGhlcmUgYXJlIG5vIHhtbCBjb25mb3JtYW5jZSBwcm9ibGVtcyBnbyBvbiB0byBjaGVjayB0aGUgd3NkbCBzdHVmZgotICAgIGlmICh4bWxWYWxpZGF0b3IuaGFzRXJyb3JzKCkpCi0gICAgewotICAgICAgLy8gdGVtcCBoYW5kbGluZyBvZiBYTUwgZXJyb3JzIHVudGlsIHZhbGlkYXRvciBpcyB1cGRhdGVkLgotICAgICAgTGlzdCBlcnJvcnMgPSB4bWxWYWxpZGF0b3IuZ2V0RXJyb3JzKCk7Ci0gICAgICBJdGVyYXRvciBlcnJvcnNJdGVyID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZXJyb3JzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIElWYWxpZGF0aW9uTWVzc2FnZSB2YWxNZXMgPSAoSVZhbGlkYXRpb25NZXNzYWdlKWVycm9yc0l0ZXIubmV4dCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKHZhbE1lcyBpbnN0YW5jZW9mIFZhbGlkYXRpb25NZXNzYWdlSW1wbCAmJiB2YWxJbmZvIGluc3RhbmNlb2YgVmFsaWRhdGlvbkluZm9JbXBsKQotICAgICAgICB7ICAgU3RyaW5nIGVycm9yS2V5ID0gKChWYWxpZGF0aW9uTWVzc2FnZUltcGwpdmFsTWVzKS5nZXRFcnJvcktleSgpOwotICAgICAgICAgICAgT2JqZWN0W10gbWVzc2FnZUFyZ3MgPSAoKFZhbGlkYXRpb25NZXNzYWdlSW1wbCl2YWxNZXMpLmdldE1lc3NhZ2VBcmd1bWVudHMoKTsKLSAgICAgICAgICAgICgoVmFsaWRhdGlvbkluZm9JbXBsKXZhbEluZm8pLmFkZEVycm9yKHZhbE1lcy5nZXRNZXNzYWdlKCksIHZhbE1lcy5nZXRMaW5lKCksIHZhbE1lcy5nZXRDb2x1bW4oKSwgdmFsTWVzLmdldFVSSSgpLCBlcnJvcktleSwgbWVzc2FnZUFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcih2YWxNZXMuZ2V0TWVzc2FnZSgpLCB2YWxNZXMuZ2V0TGluZSgpLCB2YWxNZXMuZ2V0Q29sdW1uKCksIHZhbE1lcy5nZXRVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy93c2RsTmFtZXNwYWNlID0geG1sVmFsaWRhdG9yLmdldFdTRExOYW1lc3BhY2UoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGZvciBYTUwgY29uZm9ybWFuY2UuCi0JICogQHBhcmFtIHZhbEluZm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZhbGlkYXRpb24KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIGNvbmZvcm1hbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlWE1MKENvbnRyb2xsZXJWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7IHJldHVybiB2YWxpZGF0ZVhNTCh2YWxJbmZvLCBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlLiBTZXQgdGhlIGVycm9ycyBhbmQgd2FybmluZyBhcHByb3ByaWF0ZWx5LgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxkb2MgQSBXM0MgZG9jdW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsTmFtZXNwYWNlIFRoZSBXU0RMIG5hbWVzcGFjZSB0byB2YWxpZGF0ZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVdTREwoRG9jdW1lbnQgd3NkbGRvYywgQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIHZhbEluZm8sIFN0cmluZyB3c2RsTmFtZXNwYWNlKQotICB7Ci0gICAgV1NETFZhbGlkYXRvckRlbGVnYXRlW10gd3NkbFZhbHMgPSB2ZXIucXVlcnlWYWxpZGF0b3JSZWdpc3RyeSh3c2RsTmFtZXNwYWNlLCBWYWxpZGF0b3JSZWdpc3RyeS5XU0RMX1ZBTElEQVRPUik7Ci0gICAgaWYgKHdzZGxWYWxzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsVmFscy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgV1NETFZhbGlkYXRvckRlbGVnYXRlIHdzZGx2YWxkZWwgPSB3c2RsVmFsc1tpXTsKLSAgICAgICAgSVdTRExWYWxpZGF0b3Igd3NkbFZhbCA9IHdzZGx2YWxkZWwuZ2V0VmFsaWRhdG9yKCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGwgdmFsaWRhdG9yIGlzbid0IG51bGwsIHZhbGlkYXRlLgotICAgICAgICBpZiAod3NkbFZhbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgd3NkbFZhbC52YWxpZGF0ZSh3c2RsZG9jLCB2YWxJbmZvKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFZhbGlkYXRlV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX1BST0JMRU1fV1NETF9WQUxJREFUT1IsIHdzZGxOYW1lc3BhY2UpLCAxLCAxLCB2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZSB2YWxpZGF0b3IgaXMgbnVsbCBhbmQgdGhlIG5hbWVzcGFjZSBpc24ndCBjcmVhdGUgYW4gZXJyb3IuCi0gICAgICAgIC8vIElmIHRoZSBuYW1lc3BhY2UgaXMgbnVsbCB0aGUgZmlsZSBpcyBlbXB0eSAoYW5kIHRoZSBYTUwgdmFsaWRhdG9yCi0gICAgICAgIC8vIGhhcyBsZXQgaXQgZ28pCi0gICAgICAgIC8vIHNvIGl0IGlzIHZhbGlkIGJ1dCBkb2VzIG5vdCBuZWVkIHRvIGJlIHZhbGlkYXRlZC4KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19XU0RMX1ZBTElEQVRPUiwgd3NkbE5hbWVzcGFjZSksCi0gICAgICAgICAgICAxLAotICAgICAgICAgICAgMSwKLSAgICAgICAgICAgIHZhbEluZm8uZ2V0RmlsZVVSSSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBObyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQuCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX1dTRExfVkFMSURBVE9SLCB3c2RsTmFtZXNwYWNlKSwgMSwgMSwgdmFsSW5mby5nZXRGaWxlVVJJKCkpOwotICAgIH0KLSAgICB2YWxJbmZvLmNvbXBsZXRlV1NETFZhbGlkYXRpb24oKTsKLQotICAgIHJldHVybiB2YWxJbmZvLmlzV1NETFZhbGlkKCk7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFdTREwgZmlsZSB3aXRoIHRoZSBleHRlbnNpb24gdmFsaWRhdG9yLiBTZXQgdGhlIGVycm9ycyBhbmQgd2FybmluZyBhcHByb3ByaWF0ZWx5LgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxkb2MgQSBXM0MgZG9jdW1lbnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsTmFtZXNwYWNlIFRoZSBXU0RMIG5hbWVzcGFjZSB0byB2YWxpZGF0ZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUV4dGVuc2lvblZhbGlkYXRvcnMoRG9jdW1lbnQgd3NkbGRvYywgQ29udHJvbGxlclZhbGlkYXRpb25JbmZvIHZhbEluZm8sIFN0cmluZyB3c2RsTmFtZXNwYWNlKQotICB7Ci0gICAgV1NETFZhbGlkYXRvckRlbGVnYXRlW10gZXh0VmFscyA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KHdzZGxOYW1lc3BhY2UsIFZhbGlkYXRvclJlZ2lzdHJ5LkVYVF9WQUxJREFUT1IpOwotICAgIGlmKGV4dFZhbHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgbnVtdmFscyA9IGV4dFZhbHMubGVuZ3RoOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bXZhbHM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgV1NETFZhbGlkYXRvckRlbGVnYXRlIGV4dHZhbGRlbCA9IGV4dFZhbHNbaV07Ci0gICAgICAgIElXU0RMVmFsaWRhdG9yIGV4dHZhbCA9IGV4dHZhbGRlbC5nZXRWYWxpZGF0b3IoKTsKLSAgICAgICAgaWYoZXh0dmFsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgZXh0dmFsLnZhbGlkYXRlKHdzZGxkb2MsIHZhbEluZm8pOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaChUaHJvd2FibGUgIHQpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9QUk9CTEVNX0VYVF9WQUxJREFUT1IsICBleHR2YWxkZWwuZ2V0VmFsaWRhdG9yQ2xhc3NOYW1lKCksIHdzZGxOYW1lc3BhY2UpLCAxLCAxLCB2YWxJbmZvLmdldEZpbGVVUkkoKSk7Ci0gICAgICAgICAgICAvLyBUaGlzIGVycm9yIHNob3VsZCBiZSBsb2dnZWQgYW5kIG5vdCBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgUmVzb3VyY2VCdW5kbGUgZm9yIHRoaXMgVmFsaWRhdG9yTWFuYWdlci4KLSAgICogCi0gICAqIEBwYXJhbSByYgotICAgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAgKiBAc2VlICNnZXRSZXNvdXJjZUJ1bmRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICByZXNvdXJjZWJ1bmRsZSA9IHJiOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgUmVzb3VyY2VCdW5kbGUgZm9yIHRoaXMgVmFsaWRhdGlvbkNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBidW5kbGUgc2V0IGZvciB0aGlzIFZhbGlkYXRpb25Db250cm9sbGVyLgotICAgKiBAc2VlICNzZXRSZXNvdXJjZUJ1bmRsZQotICAgKi8KLSAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCBhIERPTSBkb2N1bWVudCByZXByZXNlbnRhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIHVyaSBvZiB0aGUgZmlsZSB0byByZWFkCi0gICAqIEByZXR1cm4gVGhlIERPTSBtb2RlbCBvZiB0aGUgV1NETCBkb2N1bWVudCBvciBudWxsIGlmIHRoZSBkb2N1bWVudCBjYW4ndCBiZSByZWFkLgotICAgKi8KLSAgcHJpdmF0ZSBEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIENhdGNoIGEgcHJlbWF0dXJlIEVPRiBlcnJvciB0byBhbGxvdyBlbXB0eSBXU0RMIGZpbGVzIHRvIGJlIGNvbnNpZGVyZWQgdmFsaWQuCi0gICAgICBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24oKQotICAgICAgewotICAgICAgICBwcm90ZWN0ZWQgWE1MRXJyb3JSZXBvcnRlciBjcmVhdGVFcnJvclJlcG9ydGVyKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWE1MRXJyb3JSZXBvcnRlcigpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzLCBzaG9ydCBzZXZlcml0eSkgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBib29sZWFuIHJlcG9ydEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoIlByZW1hdHVyZUVPRiIpKQotICAgICAgICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1cGVyLnJlcG9ydEVycm9yKGRvbWFpbiwga2V5LCBhcmd1bWVudHMsIHNldmVyaXR5KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICAKLSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbnVsbDsKLSAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotICAgICAgeyAvL3RoZW4gd2Ugd2FudCB0byBjcmVhdGUgYSBET00gZnJvbSB0aGUgaW5wdXRzdHJlYW0KLSAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgfQotICAgICAgCi0gICAgICBET01QYXJzZXIgYnVpbGRlciA9IG5ldyBMaW5lTnVtYmVyRE9NUGFyc2VyKGNvbmZpZ3VyYXRpb24pOwotICAgICAgYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmdldERvY3VtZW50KCk7Ci0KLSAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbih0KTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgU3RyaW5nIGdldFdTRExOYW1lc3BhY2UoRG9jdW1lbnQgZG9jKQotICB7Ci0gICAgU3RyaW5nIHdzZGxucyA9IG51bGw7Ci0gICAgaWYoZG9jICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBkZWZpbml0aW9ucyA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIGlmKGRlZmluaXRpb25zLmdldExvY2FsTmFtZSgpLmVxdWFscygiZGVmaW5pdGlvbnMiKSkKLSAgICAgIHsKLSAgICAgICAgd3NkbG5zID0gZGVmaW5pdGlvbnMuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB3c2RsbnM7Ci0gIH0KLSAgCi0gIAotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY3JlYXRlU3RyaW5nRm9ySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICAvLyBIZXJlIHdlIGFyZSByZWFkaW5nIHRoZSBmaWxlIGFuZCBzdG9yaW5nIHRvIGEgc3RyaW5nYnVmZmVyLgotICAgIFN0cmluZ0J1ZmZlciBmaWxlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKTsKLSAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dFJlYWRlcik7Ci0gICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsxMDI0XTsKLSAgICAgIGludCBudW1iZXJSZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotICAgICAgd2hpbGUgKG51bWJlclJlYWQgIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGZpbGVTdHJpbmcuYXBwZW5kKGNoYXJzLCAwLCBudW1iZXJSZWFkKTsKLSAgICAgICAgbnVtYmVyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLSAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVTdHJpbmcudG9TdHJpbmcoKTsKLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkluZm9JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25JbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjExOTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkluZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHZhbGlkYXRpb24gaW5mbyBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW5mb0ltcGwgaW1wbGVtZW50cyBJVmFsaWRhdGlvblJlcG9ydCwgQ29udHJvbGxlclZhbGlkYXRpb25JbmZvCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCA9IHRydWU7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9XQVJOX05PX1ZBTERJQVRPUiA9ICJfV0FSTl9OT19WQUxESUFUT1IiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSA9ICJfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRSI7Ci0gIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpbmdfZmlsZV91cmkgPSBudWxsOwotICBwcml2YXRlIFVSTCB2YWxpZGF0aW5nX2ZpbGVfdXJsID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIHdzZGxWYWxpZCA9IGZhbHNlOwotICBwcml2YXRlIExpc3QgbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgTGlzdCBzY2hlbWFzID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIExpc3QgbnNOb1ZhbHMgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIGhhc2Vycm9ycyA9IGZhbHNlOwotICBwcml2YXRlIEhhc2hNYXAgbmVzdGVkTWVzc2FnZXMgPSBuZXcgSGFzaE1hcCgpOwotICBwcml2YXRlIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyID0gbnVsbDsKLSAgcHJpdmF0ZSBIYXNodGFibGUgYXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpCi0gICAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSBmb3IgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbkluZm9JbXBsKFN0cmluZyB1cmksIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcikKLSAgewotICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VyaSA9IHVyaTsKLSAgICBpZih1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmkgPSB1cmkucmVwbGFjZUFsbCgiJTIwIiwiICIpOwotICAgICAgdGhpcy52YWxpZGF0aW5nX2ZpbGVfdXJpID0gdXJpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgICB0aGlzLm1lc3NhZ2VnZW5lcmF0b3IgPSBtZXNzYWdlZ2VuZXJhdG9yOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQjZ2V0RmlsZVVSSSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZpbGVVUkkoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRpbmdfZmlsZV91cmk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0I2lzV1NETFZhbGlkKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETFZhbGlkKCkKLSAgewotICAgIHJldHVybiB3c2RsVmFsaWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbyNhZGRFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotICAgKiAgICAgIGludCwgaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uKQotICB7Ci0gICAgYWRkRXJyb3IobWVzc2FnZSwgbGluZSwgY29sdW1uLCB2YWxpZGF0aW5nX2ZpbGVfdXJpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm8jYWRkRXJyb3IoamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBpbnQsIGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGlmKGFkZE1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIFZhbGlkYXRpb25NZXNzYWdlSW1wbC5TRVZfRVJST1IpKQotICAgIHsKLSAgICAgIGhhc2Vycm9ycyA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBTdHJpbmcgZXJyb3JLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsKLSAgICBpZihhZGRNZXNzYWdlKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBWYWxpZGF0aW9uTWVzc2FnZUltcGwuU0VWX0VSUk9SLCBlcnJvcktleSwgbWVzc2FnZUFyZ3VtZW50cykpCi0gICAgewotICAgICAgaGFzZXJyb3JzID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbyNhZGRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbikKLSAgewotICAgIGFkZFdhcm5pbmcobWVzc2FnZSwgbGluZSwgY29sdW1uLCB2YWxpZGF0aW5nX2ZpbGVfdXJpKTsKLSAgfQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbyNhZGRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsCi0gICAqICAgICAgaW50LCBpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZE1lc3NhZ2UobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIFZhbGlkYXRpb25NZXNzYWdlSW1wbC5TRVZfV0FSTklORyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoZSBsaXN0LiBBIG1lc3NhZ2UgbWF5IG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdCBpbiAKLSAgICogY2VydGFpbiBjaXJjdW1zdGFuY2VzIHN1Y2ggYXMgd2hlbiB0aGUgVVJJIGlzIGludmFsaWQgb3IgdGhlIG1lc3NhZ2UgCi0gICAqIGlzIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIGFibGUgdG8gYmUgYWRkZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgICByZXR1cm4gdGhpcy5hZGRNZXNzYWdlKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBzZXZlcml0eSwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoZSBsaXN0LiBBIG1lc3NhZ2UgbWF5IG5vdCBiZSBhZGRlZCB0byB0aGUgbGlzdCBpbiAKLSAgICogY2VydGFpbiBjaXJjdW1zdGFuY2VzIHN1Y2ggYXMgd2hlbiB0aGUgVVJJIGlzIGludmFsaWQgb3IgdGhlIG1lc3NhZ2UgCi0gICAqIGlzIG51bGwuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gZXJyb3JLZXkgVGhlIFhlcmNlcyBFcnJvciBLZXkKLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgVGhlIFhlcmNlcyBhcmd1bWVudHMgdXNlZCB0byBjcmVhdGUgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBtZXNzYWdlIHdhcyBhYmxlIHRvIGJlIGFkZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIGludCBzZXZlcml0eSwgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7Ci0gICAgYm9vbGVhbiBzdWNjZXNzZnVsbHlBZGRlZCA9IGZhbHNlOwotICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIG51bGwgdGhlcmUgaXMgbm90aGluZyB0byByZXBvcnQuCi0gICAgaWYobWVzc2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBzdWNjZXNzZnVsbHlBZGRlZDsKLSAgICB9Ci0gICAgU3RyaW5nIGVycm9yVVJJID0gdXJpOwotICAgIFVSTCBlcnJvclVSTCA9IG51bGw7Ci0gICAgaWYgKGVycm9yVVJJICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVycm9yVVJJID0gZXJyb3JVUkkucmVwbGFjZUFsbCgiJTIwIiwgIiAiKTsKLSAgICAgICAgZXJyb3JVUkwgPSBuZXcgVVJMKGVycm9yVVJJKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgLy9lcnJvclVSSSA9IG5vcm1hbGl6ZVVSSShlcnJvclVSSSk7Ci0gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICBlcnJvclVSSSA9IHZhbGlkYXRpbmdfZmlsZV91cmk7Ci0vLyAgICAgIGVycm9yVVJMID0gdmFsaWRhdGluZ19maWxlX3VybDsKLS8vICAgIH0KLSAgICAvL2Jvb2xlYW4gZG9EaWFsb2cgPSB0cnVlOwotICAgIGlmIChlcnJvclVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1Y2Nlc3NmdWxseUFkZGVkID0gdHJ1ZTsKLSAgICAgIC8vIEFkZCB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdCBpZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBvZmYgb3IKLSAgICAgIC8vIHRoaXMgbWVzc2FnZSBpcyBmb3IgdGhlIGN1cnJlbnQgZmlsZS4KLSAgICAgIGlmICghV1JBUFBFUl9FUlJPUl9TVVBQT1JUX0VOQUJMRUQgfHwgdmFsaWRhdGluZ19maWxlX3VybC5zYW1lRmlsZShlcnJvclVSTCkpCi0gICAgICB7Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsIHZhbG1lcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZUltcGwobWVzc2FnZSwgbGluZSwKLSAgICAgICAgICAgIGNvbHVtbiwgc2V2ZXJpdHksIHVyaSwgZXJyb3JLZXksIG1lc3NhZ2VBcmd1bWVudHMpOwotICAgICAgICBtZXNzYWdlcy5hZGQodmFsbWVzKTsKLSAgICAgIH0KLSAgICAgIC8vIElmIG5lc3RlZCBlcnJvciBzdXBwb3J0IGlzIGVuYWJsZWQgY3JlYXRlIGEgbmVzdGVkIGVycm9yLgotICAgICAgZWxzZSBpZiAoV1JBUFBFUl9FUlJPUl9TVVBQT1JUX0VOQUJMRUQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXN0ZWR1cmkgPSBlcnJvclVSTC50b0V4dGVybmFsRm9ybSgpOwotICAgICAgICBWYWxpZGF0aW9uTWVzc2FnZUltcGwgbmVzdGVkbWVzcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZUltcGwobWVzc2FnZSwgbGluZSwKLSAgICAgICAgICAgIGNvbHVtbiwgc2V2ZXJpdHksIG5lc3RlZHVyaSk7Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsIGNvbnRhaW5lciA9IChWYWxpZGF0aW9uTWVzc2FnZUltcGwpIG5lc3RlZE1lc3NhZ2VzLmdldChuZXN0ZWR1cmkpOwotICAgICAgICBpZihjb250YWluZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIEluaXRpYWxseSBzZXQgdGhlIG5lc3RlZCBlcnJvciB0byBhIHdhcm5pbmcuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNoYW5nZWQKLSAgICAgICAgICAvLyB0byBhbiBlcnJvciBpZiBhIG5lc3RlZCBtZXNzYWdlIGhhcyBhIHNldmVyaXR5IG9mIGVycm9yLgotICAgICAgICAgIGNvbnRhaW5lciA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZUltcGwobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UsIG5lc3RlZHVyaSksIDEsIDAsIElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORywgbmVzdGVkdXJpKTsKLSAgICAgICAgICBuZXN0ZWRNZXNzYWdlcy5wdXQobmVzdGVkdXJpLCBjb250YWluZXIpOwotICAgICAgICAgIG1lc3NhZ2VzLmFkZChjb250YWluZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRhaW5lci5hZGROZXN0ZWRNZXNzYWdlKG5lc3RlZG1lc3MpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNzZnVsbHlBZGRlZDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQjZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkKLSAgICovCi0gIHB1YmxpYyBJVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIChJVmFsaWRhdGlvbk1lc3NhZ2VbXSltZXNzYWdlcy50b0FycmF5KG5ldyBJVmFsaWRhdGlvbk1lc3NhZ2VbbWVzc2FnZXMuc2l6ZSgpXSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbyNhZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZVdpdGhOb1ZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgLy8gSWYgdGhlIGxpc3QgZG9lc24ndCBhbHJlYWR5IGNvbnRhaW4gdGhpcyBuYW1lc3BhY2UsIGFkZCBpdCB0byB0aGUgbGlzdAotICAgIC8vIGFuZCBjcmVhdGUgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAgaWYgKCFuc05vVmFscy5jb250YWlucyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIG5zTm9WYWxzLmFkZChuYW1lc3BhY2UpOwotICAgICAgYWRkV2FybmluZyhtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfV0FSTl9OT19WQUxESUFUT1IsIG5hbWVzcGFjZSksIDEsIDApOwotCi0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRyb2xsZXJWYWxpZGF0aW9uSW5mbyNjb21wbGV0ZVdTRExWYWxpZGF0aW9uKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXBsZXRlV1NETFZhbGlkYXRpb24oKQotICB7Ci0gICAgaWYgKGhhc2Vycm9ycykKLSAgICB7Ci0gICAgICB3c2RsVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdzZGxWYWxpZCA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblJlcG9ydCNoYXNFcnJvcnMoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkKLSAgewotICAgIHJldHVybiBoYXNlcnJvcnM7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnQjZ2V0TmVzdGVkTWVzc2FnZXMoKQotICAgKi8KLSAgcHVibGljIEhhc2hNYXAgZ2V0TmVzdGVkTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIG5lc3RlZE1lc3NhZ2VzOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAJdGhpcy51cmlSZXNvbHZlciA9IHVyaVJlc29sdmVyOwotICB9Ci0gIAotICBwdWJsaWMgSVVSSVJlc29sdmVyIGdldFVSSVJlc29sdmVyKCkKLSAgewotICAJcmV0dXJuIHVyaVJlc29sdmVyOwotICB9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLlZhbGlkYXRpb25JbmZvI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSAKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzLmdldChuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhIYXNodGFibGUgYXR0cmlidXRlcykKLQl7Ci0JCXRoaXMuYXR0cmlidXRlcy5wdXRBbGwoYXR0cmlidXRlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uTWVzc2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbk1lc3NhZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhN2ZjMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uTWVzc2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLS8qKgotICogQSB2YWxpZGF0aW9uIG1lc3NhZ2UgaXMgY3JlYXRlZCB3aGVuIHRoZXJlIGlzIGluZm9ybWF0aW9uIHRvIHJlcG9ydCBmcm9tCi0gKiB2YWxpZGF0aW5nIGEgV1NETCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlSW1wbCBpbXBsZW1lbnRzIElWYWxpZGF0aW9uTWVzc2FnZQotewotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBpbnQgbGluZU51bWJlcjsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW5OdW1iZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpOwotICBwcm90ZWN0ZWQgaW50IHNldmVyaXR5ID0gU0VWX0VSUk9SOwotICBwcm90ZWN0ZWQgTGlzdCBuZXN0ZWRFcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZXJyb3JLZXkgPSBudWxsOwotICBwcm90ZWN0ZWQgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3BsYXllZC4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIHdoZXJlIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIEBkZXByZWNhdGVkIFVzZSBjb250cnVjdG9yIHdpdGggVVJJIHBhcmFtZXRlci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZUltcGwoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBpbnQgc2V2ZXJpdHkpCi0gIHsKLSAgICB0aGlzKG1lc3NhZ2UsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgc2V2ZXJpdHksIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBBbGxvd3Mgc3BlY2lmeWluZyBhIHVyaSBmb3IgdGhlIHJlZmVyZW5jZSB0aGF0IHRoZSBtZXNzYWdlIHJlZmVycyB0by4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIHdoZXJlIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbiB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIHJlZmVyZW5jZSBmaWxlIGZvciB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZUltcGwoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBpbnQgc2V2ZXJpdHksIFN0cmluZyB1cmkpCi0gIHsKLSAgICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBzZXZlcml0eSwgdXJpLCBudWxsLCBudWxsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBBbGxvd3Mgc3BlY2lmeWluZyBhIHVyaSBmb3IgdGhlIHJlZmVyZW5jZSB0aGF0IHRoZSBtZXNzYWdlIHJlZmVycyB0by4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIHdoZXJlIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBkaXNwbGF5ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbiB3aGVyZSB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZGlzcGxheWVkLgotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIHJlZmVyZW5jZSBmaWxlIGZvciB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGVycm9yS2V5IFRoZSBYZXJjZXMgRXJyb3Iga2V5Ci0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIFRoZSB2YWx1ZXMgdXNlZCB0byAiZmlsbCBpbiB0aGUgYmxhbmtzIiBvZiBhIFhlcmNlcyBlcnJvciBNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlciwgaW50IHNldmVyaXR5LCBTdHJpbmcgdXJpLCBTdHJpbmcgZXJyb3JLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgdGhpcy5jb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7Ci0gICAgdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotICAgIHRoaXMudXJpID0gdXJpOwotICAgIHRoaXMuZXJyb3JLZXkgPSBlcnJvcktleTsKLSAgICB0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgY29sdW1uIG51bWJlciB3aGVyZSB0aGUgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW4oKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsaW5lIG51bWJlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldExpbmUoKQotICB7Ci0gICAgcmV0dXJuIGxpbmVOdW1iZXI7Ci0gIH0KLQotICAvKioKLSAgICogcmV0dXJucyB0aGUgdXJpIG9mIHRoZSByZWZlcmVuY2UgZmlsZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHVyaSBvZiB0aGUgcmVzb3VyY2UgdGhhdCB0aGUgbWVzc2FnZSByZWZlcnMgdG8uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlI2dldFNldmVyaXR5KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKQotICB7Ci0gICAgcmV0dXJuIHNldmVyaXR5OwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShpbnQgc2V2ZXJpdHkpCi0gIHsKLSAgICBpZihzZXZlcml0eSA9PSBTRVZfRVJST1IgfHwgc2V2ZXJpdHkgPT0gU0VWX1dBUk5JTkcpCi0gICAgewotICAgICAgdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZSB0byBhZGQgYXMgYSBuZXN0ZWQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoSVZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlKQotICB7Ci0gICAgaWYgKG5lc3RlZEVycm9ycyA9PSBudWxsKQotICAgIHsKLSAgICAgIG5lc3RlZEVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0gICAgbmVzdGVkRXJyb3JzLmFkZCh2YWxpZGF0aW9uTWVzc2FnZSk7Ci0gICAgaW50IHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpOwotICAgIGlmKHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPT0gU0VWX0VSUk9SKQotICAgIHsKLSAgICAgIHNldFNldmVyaXR5KFNFVl9FUlJPUik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkRXJyb3JzICE9IG51bGwgPyBuZXN0ZWRFcnJvcnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0gIC8qKgotICAgKiBAcmV0dXJuIHRoZSBlcnJvciBrZXkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JLZXkoKQotICB7Ci0gICAgcmV0dXJuIGVycm9yS2V5OwotICB9Ci0gIAotICAvKioKLSAgICogQHBhcmFtIGVycm9yS2V5IHRoZSBlcnJvciBrZXkgdG8gc2V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvcktleShTdHJpbmcgZXJyb3JLZXkpCi0gIHsKLSAgICB0aGlzLmVycm9yS2V5ID0gZXJyb3JLZXk7Ci0gIH0KLSAgLyoqCi0gICAqIEByZXR1cm4gdGhlIFhlcmNlcyBtZXNzYWdlIGFyZ3VtZW50cyB1c2VkIHRvICJmaWxsIGluIHRoZSBibGFua3MiIG9mIHRoZSBtZXNzYWdlcwotICAgKi8KLSAgcHVibGljIE9iamVjdFtdIGdldE1lc3NhZ2VBcmd1bWVudHMoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VBcmd1bWVudHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyY2E3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotLyoqCi0gKiBBIHJlZ2lzdHJ5IG9mIElXU0RMVmFsaWRhdG9yIHZhbGlkYXRvcnMuIFRoaXMgaG9sZHMgdGhlIHRvcCBsZXZlbCBXU0RMIGFuZCBXUy1JIHZhbGlkYXRvcnMuCi0gKiBWYWxpZGF0b3JzIGFyZSByZWdpc3RlcmVkIGJ5IHRoZSBuYW1lc3BhY2UgdGhleSB2YWxpZGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5Ci17Ci0gIC8qKgotICAgKiBUaGUgV1NETCB2YWxpZGF0b3IgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBXU0RMX1ZBTElEQVRPUiA9IG5ldyBJbnRlZ2VyKDApOwotICAvKioKLSAgICogVGhlIFdTLUkgdmFsaWRhdG9yIHR5cGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIEludGVnZXIgRVhUX1ZBTElEQVRPUiA9IG5ldyBJbnRlZ2VyKDEpOwotICBwcm90ZWN0ZWQgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IHZlckluc3RhbmNlOwotICAvKgotICAgIFRoaXMgaXMgYSBNYXAgb2YgTWFwcy4gVGhlIHRvcC1sZXZlbCBNYXAgaXMga2V5ZWQgYnkgKENsYXNzKXBhcmVudFR5cGUsCi0gICAgYW5kIHRoZSBpbm5lciBNYXBzIGFyZSBrZXllZCBieSAoUU5hbWUpZWxlbWVudFR5cGUuCi0gICAgVGhpcyBpZGVhIGlzIHRoZSBzYW1lIGFzIGlzIGRvbmUgaW4gV1NETDRKCi0gICovCi0gIHByb3RlY3RlZCBNYXAgdmFsaWRhdG9yUmVnID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHByb3RlY3RlZCBJdGVyYXRvciBkZWZhdWx0VmFsaWRhdG9ySXRlcmF0b3I7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFZhbGlkYXRvclJlZ2lzdHJ5KCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoZSByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoZSByZWdpc3RyeS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKHZlckluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgdmVySW5zdGFuY2UgPSBuZXcgVmFsaWRhdG9yUmVnaXN0cnkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHZlckluc3RhbmNlOwotICB9Ci0gIC8qKgotICAgKiBSZWdpc3RlciB0aGlzIHZhbGlkYXRvciBvZiB0aGUgZ2l2ZW4gdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciB2YWxpZGF0ZXMuCi0gICAqIEBwYXJhbSB2YWxEZWxlZ2F0ZSBUaGUgdmFsaWRhdG9yIGRlbGVnYXRlIHRvIHJlZ2lzdGVyLgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlclZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlLCBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgdmFsRGVsZWdhdGUsIEludGVnZXIgdHlwZSkKLSAgewotICAgIC8vIGFsbG93IHRoZSBudWxsIG5hbWVzcGFjZSBidXQgbWFrZSBpdCB0aGUgZW1wdHkgc3RyaW5nCi0gICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5hbWVzcGFjZSA9ICIiOwotICAgIH0KLQotICAgIC8vIGdldCB0aGUgaGFzdGFibGUgZm9yIHRoZSB0eXBlIG9mIHZhbGlkYXRvciB3ZSB3YW50Ci0gICAgSGFzaHRhYmxlIHR5cGVWYWxpZGF0b3JSZWcgPSAoSGFzaHRhYmxlKXZhbGlkYXRvclJlZy5nZXQodHlwZSk7Ci0gICAgLy8gaWYgaXQncyBudWxsIGlmIG1lYW5zIHdlIGhhdmVuJ3QgZGVmaW5lZCB0aGlzIHR5cGUgb2YgdmFsaWRhdG9yIHlldAotICAgIGlmICh0eXBlVmFsaWRhdG9yUmVnID09IG51bGwpCi0gICAgewotICAgICAgdHlwZVZhbGlkYXRvclJlZyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgIHZhbGlkYXRvclJlZy5wdXQodHlwZSwgdHlwZVZhbGlkYXRvclJlZyk7Ci0gICAgfQotICAgIAotICAgICAgTGlzdCBuYW1lc3BhY2V2YWxzID0gKExpc3QpdHlwZVZhbGlkYXRvclJlZy5nZXQobmFtZXNwYWNlKTsKLSAgICAgIGlmKG5hbWVzcGFjZXZhbHMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNldmFscyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgdHlwZVZhbGlkYXRvclJlZy5wdXQobmFtZXNwYWNlLCBuYW1lc3BhY2V2YWxzKTsKLSAgICAgIH0KLSAgICAgIG5hbWVzcGFjZXZhbHMuYWRkKHZhbERlbGVnYXRlKTsKLQotICB9Ci0gIC8qKgotICAgKiBBc2sgZm9yIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlLiBJZiBub25lIGlzIGZvdW5kCi0gICAqIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgdmFsaWRhdG9yIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLgotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB2YWxpZGF0b3IgdGhhdCBpcyBiZWluZyByZXF1ZXN0ZWQuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgdmFsaWRhdG9yIGRlbGVnYXRlcyBpZiBhdCBsZWFzdCBvbmUgaXMgcmVnaXN0ZXJlZCwgbnVsbCBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRvckRlbGVnYXRlW10gcXVlcnlWYWxpZGF0b3JSZWdpc3RyeShTdHJpbmcgbmFtZXNwYWNlLCBJbnRlZ2VyIHR5cGUpCi0gIHsKLSAgICBJV1NETFZhbGlkYXRvciB3c2RsdmFsID0gbnVsbDsKLSAgICAvLyBpZiB0aGUgbmFtZXNwYWNlIGlzIG51bGwgYWxsb3cgaXQgYW5kIHRyZWF0IGl0IGFzIHRoZSBlbXB0eSBzdHJpbmcKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7Ci0gICAgfQotICAgIEhhc2h0YWJsZSB0eXBlVmFsaWRhdG9yUmVnID0gKEhhc2h0YWJsZSl2YWxpZGF0b3JSZWcuZ2V0KHR5cGUpOwotICAgIGlmICh0eXBlVmFsaWRhdG9yUmVnID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICB9Ci0KLSAgICBMaXN0IHZhbGRlbHMgPSAoTGlzdCl0eXBlVmFsaWRhdG9yUmVnLmdldChuYW1lc3BhY2UpOwotICAgIGlmKHZhbGRlbHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gKFdTRExWYWxpZGF0b3JEZWxlZ2F0ZVtdKXZhbGRlbHMudG9BcnJheShuZXcgV1NETFZhbGlkYXRvckRlbGVnYXRlW3ZhbGRlbHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGEgdmFsaWRhdG9yIHJlZ2lzdGVyZWQgb2YgdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRvciByZWdpc3RlcmVkIGZvciB0aGUgbmFtZXNwYWNlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZWdpc3RlcmVkVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UsIEludGVnZXIgdHlwZSkKLSAgewotICAgIGlmIChxdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KG5hbWVzcGFjZSwgdHlwZSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL1dTRExWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvV1NETFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTMxNzA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvV1NETFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExQmFzaWNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExVmFsaWRhdG9yQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5odHRwLkhUVFBWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEubWltZS5NSU1FVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnNvYXAuU09BUFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2QuSW5saW5lU2NoZW1hVmFsaWRhdG9yOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBBbiBtYWluIFdTREwgdmFsaWRhdG9yIGNsYXNzLiBUaGUgV1NETCB2YWxpZGF0b3IgdmFsaWRhdGVzIFdTREwgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRvcgotewotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURBVE9SX1JFU09VUkNFX0JVTkRMRSA9ICJ2YWxpZGF0ZXdzZGwiOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURBVE9SX0hUVFBfUkVTT1VSQ0VfQlVORExFID0gInZhbGlkYXRld3NkbGh0dHAiOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURBVE9SX1NPQVBfUkVTT1VSQ0VfQlVORExFID0gInZhbGlkYXRld3NkbHNvYXAiOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkFMSURBVE9SX01JTUVfUkVTT1VSQ0VfQlVORExFID0gInZhbGlkYXRld3NkbG1pbWUiOwotICBwcml2YXRlIFZhbGlkYXRpb25Db250cm9sbGVyIHZhbGlkYXRpb25Db250cm9sbGVyOwotICBwcml2YXRlIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyOwotICBwcml2YXRlIEhhc2h0YWJsZSBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3IoKQotICB7Ci0gICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoVkFMSURBVE9SX1JFU09VUkNFX0JVTkRMRSk7Ci0gICAgdXJpUmVzb2x2ZXIgPSBuZXcgVVJJUmVzb2x2ZXIoKTsKLSAgICB2YWxpZGF0aW9uQ29udHJvbGxlciA9IG5ldyBWYWxpZGF0aW9uQ29udHJvbGxlcihyYiwgdXJpUmVzb2x2ZXIpOwotICAgIAotICAgIC8vUmVnaXN0ZXIgdGhlIGRlZmF1bHQgdmFsaWRhdG9ycy4KLSAgICBWYWxpZGF0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0gICAgLy8gUmVnaXN0ZXIgdGhlIFdTREwgMS4xIHZhbGlkYXRvciBjb250cm9sbGVyIGFuZCB2YWxpZGF0b3JzLgotICAgIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUoV1NETDExVmFsaWRhdG9yQ29udHJvbGxlci5jbGFzcy5nZXROYW1lKCksIFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgcmVnaXN0cnkucmVnaXN0ZXJWYWxpZGF0b3IoQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCBkZWxlZ2F0ZSwgVmFsaWRhdG9yUmVnaXN0cnkuV1NETF9WQUxJREFUT1IpOwotICAgIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlMSA9IG5ldyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZShXU0RMMTFCYXNpY1ZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCksIFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgCi0gICAgZGVsZWdhdGUxID0gbmV3IFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKEhUVFBWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpLCBWQUxJREFUT1JfSFRUUF9SRVNPVVJDRV9CVU5ETEUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3Iob3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25zdGFudHMuTlNfSFRUUCwgZGVsZWdhdGUxKTsKLSAgICBkZWxlZ2F0ZTEgPSBuZXcgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUoU09BUFZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCksIFZBTElEQVRPUl9TT0FQX1JFU09VUkNFX0JVTkRMRSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICByZWdpc3RlcldTREwxMVZhbGlkYXRvcihvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50cy5OU19TT0FQMTEsIGRlbGVnYXRlMSk7Ci0gICAgZGVsZWdhdGUxID0gbmV3IFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKE1JTUVWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpLCBWQUxJREFUT1JfTUlNRV9SRVNPVVJDRV9CVU5ETEUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3Iob3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25zdGFudHMuTlNfTUlNRSwgZGVsZWdhdGUxKTsKLSAgIAotICAgIC8vIFRoZSBXU0RMIDEuMSBzY2hlbWEgdmFsaWRhdG9yIGlzIGEgc3BlY2lhbCBjYXNlIGFzIGl0IGlzIHJlZ2lzdGVyZWQgZm9yIHRocmVlIG5hbWVzcGFjZXMuCi0gICAgZGVsZWdhdGUxID0gbmV3IFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKElubGluZVNjaGVtYVZhbGlkYXRvci5jbGFzcy5nZXROYW1lKCksIFZBTElEQVRPUl9SRVNPVVJDRV9CVU5ETEUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgcmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSwgZGVsZWdhdGUxKTsKLSAgICByZWdpc3RlcldTREwxMVZhbGlkYXRvcihDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwLCBkZWxlZ2F0ZTEpOwotICAgIHJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEsIGRlbGVnYXRlMSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEByZXR1cm4gQSB2YWxpZGF0aW9uIHJlcG9ydCBzdW1tYXJpemluZyB0aGUgcmVzdWx0cyBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBJVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpKQotICB7Ci0gICByZXR1cm4gdmFsaWRhdGUodXJpLCBudWxsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBWYWxpZGF0ZSB0aGUgaW5wdXRTdHJlYW0KLSAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24gb2YgdGhlIFdTREwgZmlsZSBiZWluZyB2YWxpZGF0ZWQKLSAgICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSBzdHJlYW0gdG8gdmFsaWRhdGUKLSAgICogQHJldHVybiBBIFZhbGlkYXRpb24gcmVwb3J0IHN1bW1hcml6aW5nIHRoZSByZXN1bHRzIG9mIHRoZSB2YWxpZGF0aW9uCi0gICAqLwotICBwdWJsaWMgSVZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICBpZih1cmkgPT0gbnVsbCkgCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB2YWxpZGF0aW9uQ29udHJvbGxlci5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgIHJldHVybiB2YWxpZGF0aW9uQ29udHJvbGxlci52YWxpZGF0ZSh1cmksIGlucHV0U3RyZWFtKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIFVSSSByZXNvbHZlciB0byB0aGUgV1NETCB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSByZXNvbHZlciB0byBhZGQgdG8gdGhlIFdTREwgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVVJJUmVzb2x2ZXIoSVVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gIAl0aGlzLnVyaVJlc29sdmVyLmFkZFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCBhbiBhdHRyaWJ1dGUgb24gdGhlIHZhbGlkYXRvci4gQW4gYXR0cmlidXRlIGlzCi0gICAqIGRlZmluZWQgYnkgYSBuYW1lIGFuZCBhIHZhbHVlIHBhaXIuIEFuIGF0dHJpYnV0ZSBtYXkKLSAgICogYmUgZGVmaW5lZCBmb3IgYW55IHZhbGlkYXRvciwgYnVpbHQgaW4gb3IgYW4gZXh0ZW5zaW9uLgotICAgKiBFeHRlbnNpb24gdmFsaWRhdG9ycyBjYW4gcHJvYmUgdGhlIGF0dHJpYnV0ZXMgc2V0IG9uCi0gICAqIHRoZSBXU0RMIHZhbGlkYXRvciB0byBjdXN0b21pemUgdGhlIHdheSBpbiB3aGljaCB0aGV5Ci0gICAqIHZhbGlkYXRlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBpZGVudGlmaWVyLgotICAgKiBAcGFyYW0gdmFsdWUgVGhlIGF0dHJpYnV0ZSBpdHNlbGYuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgewotICAJYXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotICB9Ci0gIAotICAvKioKLSAgICogUmVnaXN0ZXIgYW4gZXh0ZW5zaW9uIFdTREwgdmFsaWRhdG9yIGRlbGVnYXRlIHdpdGggdGhpcyB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciB2YWxpZGF0ZXMgZm9yLiBUaGlzIGlzIHRoZSBXU0RMIG5hbWVzcGFjZS4KLSAgICogQHBhcmFtIGRlbGVnYXRlIFRoZSBkZWxlZ2F0ZSB0aGF0IGhvbGRzIHRoZSB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWdpc3RlcldTRExFeHRlbnNpb25WYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETFZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlKQotICB7Ci0gICAgVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclZhbGlkYXRvcihuYW1lc3BhY2UsIGRlbGVnYXRlLCBWYWxpZGF0b3JSZWdpc3RyeS5FWFRfVkFMSURBVE9SKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGEgV1NETCAxLjEgdmFsaWRhdG9yIGRlbGVnYXRlIHdpdGggdGhpcyB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciB2YWxpZGF0ZXMgZm9yLgotICAgKiBAcGFyYW0gZGVsZWdhdGUgVGhlIGRlbGVnYXRlIHRoYXQgaG9sZHMgdGhlIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UsIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlKQotICB7Ci0gICAgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclZhbGlkYXRvcihuYW1lc3BhY2UsIGRlbGVnYXRlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvV1NETFZhbGlkYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNDA3NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0KLS8qKgotICogQSBkZWxlZ2F0ZSBob2xkcyBhIHZhbGlkYXRvcidzIGluZm9ybWF0aW9uIGFuZCBjYW4gaW5zdGFudGlhdGUgaXQKLSAqIHdoZW4gcmVxdWVzdGVkIHRvLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRvckRlbGVnYXRlCi17Ci0gIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlQnVuZGxlID0gbnVsbDsKLSAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7Ci0gIHByaXZhdGUgSVdTRExWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgZGVsZWdhdGUgZm9yIGEgdmFsaWRhdG9yIGJ5IGl0cyBjbGFzcyBuYW1lIGFuZCByZXNvdXJjZSBidW5kbGUgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRvckRlbGVnYXRlKFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUsIFN0cmluZyByZXNvdXJjZUJ1bmRsZSkKLSAgewotICAgIHRoaXMudmFsaWRhdG9yQ2xhc3NuYW1lID0gdmFsaWRhdG9yQ2xhc3NuYW1lOwotICAgIHRoaXMucmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUsIHJlc291cmNlIGJ1bmRsZSBuYW1lIGFuZCAKLSAgICogYSBjbGFzcyBsb2FkZXIgdG8gbG9hZCB0aGUgdmFsaWRhdG9yIGFuZCBidW5kbGUuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3NuYW1lIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgY2xhc3MuCi0gICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGJhc2UgcmVzb3VyY2UgYnVuZGxlLgotICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgVGhlIGNsYXNzIGxvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgdmFsaWRhdG9yIGFuZCBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRvckRlbGVnYXRlKFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUsIFN0cmluZyByZXNvdXJjZUJ1bmRsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gIHsKLSAgICB0aGlzKHZhbGlkYXRvckNsYXNzbmFtZSwgcmVzb3VyY2VCdW5kbGUpOwotICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgaW4gdGhpcyBkZWxlZ2F0ZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFdTREwgdmFsaWRhdG9yIHNwZWNpZmllZCBieSB0aGlzIGRlbGVnYXRlLgotICAgKi8KLSAgcHVibGljIElXU0RMVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpCi0gIHsKLSAgICBpZiAodmFsaWRhdG9yID09IG51bGwpCi0gICAgIHsKLSAgICAgIGlmKGNsYXNzTG9hZGVyID09IG51bGwpCi0gICAgICAgewotICAgICAgICBjbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgIH0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcyA9Ci0gICAgICAgIGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3NuYW1lKSA6IENsYXNzLmZvck5hbWUodmFsaWRhdG9yQ2xhc3NuYW1lKTsKLQotICAgICAgICB2YWxpZGF0b3IgPSAoSVdTRExWYWxpZGF0b3IpdmFsaWRhdG9yQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICBSZXNvdXJjZUJ1bmRsZSB2YWxpZGF0b3JCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2VCdW5kbGUsIExvY2FsZS5nZXREZWZhdWx0KCksIGNsYXNzTG9hZGVyKTsKLSAgICAgICAgIHZhbGlkYXRvci5zZXRSZXNvdXJjZUJ1bmRsZSh2YWxpZGF0b3JCdW5kbGUpOwotICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIGxvZ2dpbmcKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgfQotICAgICAgY2F0Y2goVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbGlkYXRvcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdmFsaWRhdG9yIGNsYXNzIG5hbWUuCi0gICAqIEByZXR1cm4gVGhlIHZhbGlkYXRvciBjbGFzcyBuYW1lLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzc05hbWUoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRvckNsYXNzbmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9leGNlcHRpb24vVmFsaWRhdGVXU0RMRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2V4Y2VwdGlvbi9WYWxpZGF0ZVdTRExFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkMWI0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL2V4Y2VwdGlvbi9WYWxpZGF0ZVdTRExFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uOwotCi0vKioKLSAqIEN1c3RvbSBleGNlcHRpb24gZm9yIFdTREwgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotCS8qKgotICAgKiBSZXF1aXJlZCBzZXJpYWwgdmVyc2lvbiB1aWQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTRExFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0JewotCSAgc3VwZXIobWVzc2FnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9JVVJJUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvSVVSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OWI3NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9JVVJJUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgdGhlIFdTREwgdmFsaWRhdG9yJ3MgVVJJIHJlc29sdmVyIG1lY2hhbmlzbS4gVGhlIFVSSSByZXNvbHZlcgotICogaXMgdXNlZCB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiBhbiBlbnRpdHkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVSSVJlc29sdmVyCi17Ci0gLyoqCi0gICogUmVzb2x2ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGVudGl0eSBkZXNjcmliZWQgYnkgdGhlIHB1YmxpY0lkIGFuZCBzeXN0ZW1JZC4KLSAgKiAKLSAgKiBAcGFyYW0gYmFzZUxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdGhhdCBjb250YWlucyB0aGUgdXJpLgotICAqIEBwYXJhbSBwdWJsaWNJZCBBbiBvcHRpb25hbCBwdWJsaWMgaWRlbnRpZmllciAoaS5lLiBuYW1lc3BhY2UgbmFtZSksIG9yIG51bGwgaWYgbm9uZS4KLSAgKiBAcGFyYW0gc3lzdGVtSWQgQW4gYWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJJLCBvciBudWxsIGlmIG5vbmUuCi0gICogQHJldHVybiBBbiBhYnNvbHV0ZSBVUkkgZm9yIHRoZSByZXNvdXJjZS4KLSAgKi8KLSAgcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkNjAwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1haW4gVVJJIHJlc29sdmVyIHRoYXQgY2FsbHMgb3V0IHRvIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZAotICogZXh0ZXJuYWwgVVJJIHJlc29sdmVycyB0byBsb2NhdGUgYW4gZW50aXR5LiBJZiBub25lIG9mIHRoZSBleHRlcm5hbCByZXNvbHZlcnMKLSAqIGNhbiBsb2NhdGUgdGhlIGVudGl0eSB0aGUgcmVzb2x2ZXIgd2lsbCBhc2sgdGhlIGludGVybmFsIFdTREwgdmFsaWRhdG9yIFhNTAotICogY2F0YWxvZyB0byByZXNvbHZlIHRoZSBsb2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFVSSVJlc29sdmVyIGltcGxlbWVudHMgSVVSSVJlc29sdmVyLCBYTUxFbnRpdHlSZXNvbHZlcgotewotICBwcml2YXRlIExpc3QgZXh0VVJJUmVzb2x2ZXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuIAotICAgKi8KLSAgcHVibGljIFVSSVJlc29sdmVyKCkKLSAgewotICB9Ci0KLQotICAvKioKLSAgICogQWRkIGFuIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIKLSAgICogICAgICAgICAgVGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRVUklSZXNvbHZlcihJVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgICBleHRVUklSZXNvbHZlcnNMaXN0LmFkZCh1cmlSZXNvbHZlcik7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyI3Jlc29sdmUoamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgSXRlcmF0b3IgcmVzb2x2ZXJJdGVyID0gZXh0VVJJUmVzb2x2ZXJzTGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlKHJlc29sdmVySXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSVVSSVJlc29sdmVyIHJlc29sdmVyID0gKElVUklSZXNvbHZlcilyZXNvbHZlckl0ZXIubmV4dCgpOwotICAgICAgaWYgKHJlc29sdmVyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5lcXVhbHMoc3lzdGVtSWQpKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBoYXZlbid0IGJlZW4gYWJsZSB0byBsb2NhdGUgdGhlIHJlc3VsdCB5ZXQgYXNrIHRoZSBpbnRlcm5hbCBYTUwKLSAgICAvLyBjYXRhbG9nLgotICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiAocHVibGljSWQgIT0gbnVsbCB8fCBzeXN0ZW1JZCAhPSBudWxsKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBYTUxDYXRhbG9nLmdldEluc3RhbmNlKCkucmVzb2x2ZUVudGl0eUxvY2F0aW9uKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgfQotICAgIGlmKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICBub3JtYWxpemUoYmFzZUxvY2F0aW9uLCBzeXN0ZW1JZCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwdWJsaWNJZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRQdWJsaWNJZCgpOwotICAgIFN0cmluZyBzeXN0ZW1JZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRMaXRlcmFsU3lzdGVtSWQoKTsKLSAgICBpZiAocHVibGljSWQgPT0gbnVsbCB8fCBwdWJsaWNJZC5lcXVhbHMoIiIpKQotICAgIHsKLSAgICAgIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBTdHJpbmcgcmVzdWx0ID0gcmVzb2x2ZShyZXNvdXJjZUlkZW50aWZpZXIuZ2V0QmFzZVN5c3RlbUlkKCksIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgWE1MSW5wdXRTb3VyY2UgeG1sSW5wdXRTb3VyY2UgPSBudWxsOwotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwocmVzdWx0KTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICB4bWxJbnB1dFNvdXJjZSA9IG5ldyBYTUxJbnB1dFNvdXJjZShwdWJsaWNJZCwgcmVzdWx0LCByZXN1bHQsIGlzLCBudWxsKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB4bWxJbnB1dFNvdXJjZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIE5vcm1hbGl6ZSB0aGUgc3lzdGVtSWQuIE1ha2UgaXQgYWJzb2x1dGUgd2l0aCByZXNwZWN0IHRvIHRoZQotICAgKiBiYXNlTG9jYXRpb24gaWYgbmVjZXNzYXJ5LgotICAgKiAKLSAgICogQHBhcmFtIGJhc2VMb2NhdGlvbiBUaGUgYmFzZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4KLSAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBzeXN0ZW0gaWQgb2YgdGhlIGZpbGUuCi0gICAqIEByZXR1cm4gQSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIHN5c3RlbSBpZC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAJaWYoc3lzdGVtSWQgPT0gbnVsbCkKLSAgCXsKLSAgCSAgcmV0dXJuIHN5c3RlbUlkOwotICAJfQotICAJLy8gVHJ5IHRvIGZpbmQgYSBzY2hlbWUgaW4gdGhlIHN5c3RlbUlkLgotICAJaW50IHNjaGVtYUxvYyA9IHN5c3RlbUlkLmluZGV4T2YoJzonKTsKLSAgCWlmKHNjaGVtYUxvYyAhPSAtMSAmJiBzeXN0ZW1JZC5jaGFyQXQoc2NoZW1hTG9jKzEpID09ICcvJykKLSAgCXsKLSAgCSAgLy8gQSBzY2hlbWUgaGFzIGJlZW4gZm91bmQuIFRoZSBzeXN0ZW1JZCBpcyBhbgotICAJICAvLyBhYnNvbHV0ZSBsb2NhdGlvbiBzbyByZXR1cm4gaXQuCi0gIAkgIHJldHVybiBzeXN0ZW1JZDsKLSAgCX0KLSAgCWlmKGJhc2VMb2NhdGlvbiA9PSBudWxsKQotICAJewotICAJICByZXR1cm4gYmFzZUxvY2F0aW9uOwotICAJfQotICAJCi0gIAlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIAkKLSAgCS8vIEVuc3VyZSBhbGwgc2xhc2hlcyBpbiB0aGUgbG9jYXRpb25zIGFyZSAvLgotICAJYmFzZUxvY2F0aW9uID0gYmFzZUxvY2F0aW9uLnJlcGxhY2UoJ1xcJywnLycpOwotICAJc3lzdGVtSWQgPSBzeXN0ZW1JZC5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgCQotICAJLy8gUmVtb3ZlIHRoZSB0cmFpbGluZyBzZWN0aW9uIG9mIHRoZSBiYXNlTG9jYXRpb24uCi0JaW50IGxhc3RTbGFzaCA9IGJhc2VMb2NhdGlvbi5sYXN0SW5kZXhPZignLycpOwotICAJU3RyaW5nIHRlbXByZXN1bHQgPSBiYXNlTG9jYXRpb24uc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCsxKTsKLSAgCQotICAJaWYoc3lzdGVtSWQuc3RhcnRzV2l0aCgiLyIpKQotICAJewotICAJICBzeXN0ZW1JZCA9IHN5c3RlbUlkLnN1YnN0cmluZygxKTsKLSAgCX0KLSAgCQotICAJLy8gSm9pbiB0aGUgYmFzZSBsb2NhdGlvbiB3aXRoIHRoZSBzeXN0ZW1pZAotICAJdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQgKyBzeXN0ZW1JZDsKLSAgCQotICAJLy8gV2hpbGUgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIHN0YXJ0cyB3aXRoIGEgLi4vIG9yIC4vIGNoYW5nZQotICAJLy8gdGhlIHJlc3VsdCBhbmQgdGhlIHJlbGF0aXZlIGxvY2F0aW9uLgotICAJaW50IGxvYzsKLSAgCXdoaWxlKChsb2MgPSB0ZW1wcmVzdWx0Lmxhc3RJbmRleE9mKCIuLyIpKSAhPSAtMSkKLSAgCXsKLSAgCSAgcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcobG9jICsgMikgKyByZXN1bHQ7Ci0gIAkgIGlmKHRlbXByZXN1bHQuY2hhckF0KGxvYyAtIDEpID09ICcuJykKLSAgCSAgewotICAJICAJaWYodGVtcHJlc3VsdC5jaGFyQXQobG9jIC0gMikgPT0gJy8nKQotICAJICAJewotICAJICAJICBTdHJpbmcgdGVtcCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIGxvYyAtIDIpOwotICAJICAJICBpbnQgbG9jMiA9IHRlbXAubGFzdEluZGV4T2YoJy8nKTsKLSAgCSAgCSAgaWYobG9jMiA9PSAtMSkKLSAgCSAgCSAgewotICAJICAJICAJLy8gSWYgdGhlcmUgaXMgbm8gb3RoZXIgLyBiZWZvcmUgdGhpcyB0aGUgVVJMIG11c3Qgc3RhcnQgd2l0aCBzY2hlbWU6Ly4uLwotICAJICAJICAJcmVzdWx0ID0gIi4uLyIgKyByZXN1bHQ7Ci0gIAkgIAkgIAl0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jIC0gMSk7Ci0gIAkgIAkgIH0KLSAgCSAgCSAgZWxzZQotICAJICAJICB7Ci0gIAkgIAkgIAkvLyBSZW1vdmUgdGhlIHNlY3Rpb24gdGhhdCBjb21lcyBiZWZvcmUgdGhpcyBvbmUgZnJvbSB0ZW1wcmVzdWx0IHVubGVzcyBpdCdzIC4uLy4KLSAgCSAgCSAgICB0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jIC0gMSk7Ci0gIAkgIAkgICAgaW50IG51bVNlY3RzVG9SZW1vdmUgPSAxOwotICAJICAJICAgIAotICAJICAJICAgIHdoaWxlKHRlbXByZXN1bHQuZW5kc1dpdGgoIi4vIikpCi0gIAkgIAkgICAgewotICAJICAJICAgICAgaW50IHRlbXByZXNsZW4gPSB0ZW1wcmVzdWx0Lmxlbmd0aCgpOwotICAJICAJICAgICAgaWYodGVtcHJlc2xlbiA+IDIgJiYgdGVtcHJlc3VsdC5jaGFyQXQodGVtcHJlc2xlbiAtMykgPT0gJy4nKQotICAJICAJICAgICAgewotICAJICAJICAgICAgCWlmKHRlbXByZXNsZW4gPiAzICYmIHRlbXByZXN1bHQuY2hhckF0KHRlbXByZXNsZW4gLSA0KSA9PSAnLycpCi0gIAkgIAkgICAgICAJewotICAJICAJICAgICAgCSAgbnVtU2VjdHNUb1JlbW92ZSsrOwotICAJICAJICAgICAgCSAgdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIHRlbXByZXN1bHQubGVuZ3RoKCkgLTMpOwotICAJICAJICAgICAgICB9Ci0gIAkgIAkgICAgICAJZWxzZQotICAJICAJICAgICAgCXsKLSAgCSAgCSAgICAgIAkgIGJyZWFrOwotICAJICAJICAgICAgCX0KLSAgCSAgCSAgICAgIH0KLSAgCSAgCSAgICAgIGVsc2UKLSAgCSAgCSAgICAgIHsKLSAgCSAgCSAgICAgIAlpZih0ZW1wcmVzdWx0LmNoYXJBdCh0ZW1wcmVzdWx0Lmxlbmd0aCgpIC0yKSA9PSAnLycpCi0gIAkgIAkgICAgICAJewotICAJICAJICAgICAgCSAgdGVtcHJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsIHRlbXByZXN1bHQubGVuZ3RoKCkgLTIpOwotICAJICAJICAgICAgCX0KLSAgCSAgCSAgICAgIAllbHNlCi0gIAkgIAkgICAgICAJewotICAJICAJICAgICAgCSAgYnJlYWs7Ci0gIAkgIAkgICAgICAJfQotICAJICAJICAgICAgfQotICAJICAJICAgIH0KLSAgCSAgCSAgICAvLyBSZW1vdmUgdGhlIHNlY3Rpb25zLgotICAJICAJICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1TZWN0c1RvUmVtb3ZlOyBpKyspCi0gIAkgIAkgICAgewotICAJICAJICAgICAgU3RyaW5nIHRlbXAyID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCx0ZW1wcmVzdWx0Lmxlbmd0aCgpLTEpOwotICAJICAJICAgICAgaW50IGxvYzMgPSB0ZW1wMi5sYXN0SW5kZXhPZignLycpOwotICAJICAJICAgICAgaWYobG9jMyA9PSAtMSkKLSAgCSAgCSAgICAgIHsKLSAgCSAgCSAgICAgIAlicmVhazsKLSAgCSAgCSAgICAgIH0KLSAgCSAgCSAgICAgIHRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MzKzEpOwotICAJICAJICAgIH0KLSAgCSAgCSAgfSAKLSAgCSAgCX0KLSAgCSAgCWVsc2UKLSAgCSAgCXsKLSAgCSAgCSAgLy8gVGhlIFVSSSBpcyBvZiB0aGUgZm9ybSBmaWxlOi8vc29tZWRpci4uLyBzbyBjb3B5IGl0IGFzIGlzCi0gIAkgIAkgIFN0cmluZyB0ZW1wID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jIC0gMSk7Ci0JICAJICBpbnQgbG9jMiA9IHRlbXAubGFzdEluZGV4T2YoJy8nKTsKLQkgIAkgIGlmKGxvYzIgPT0gLTEpCi0JICAJICB7Ci0JICAJICAJLy8gVGhlIFVSSSBtdXN0IGxvb2sgbGlrZSBmaWxlOi4uLyBvciAuLi8gc28gY29weSBvdmVyIHRoZSB3aG9sZSB0ZW1wcmVzdWx0LgotCSAgCSAgCXJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKDAsbG9jKzIpICsgcmVzdWx0OwotCSAgCSAgCXRlbXByZXN1bHQgPSAiIjsKLQkgIAkgIH0KLQkgIAkgIGVsc2UKLQkgIAkgIHsKLQkgIAkgIAkvLyBDb3B5IG92ZXIgdGhlIHdob2xlIHNvbWVkaXIuLi8KLQkgIAkgIAlyZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZyhsb2MyICsgMSwgdGVtcHJlc3VsdC5sZW5ndGgoKSk7Ci0JICAJICAgIHRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MyKzEpOwotCSAgCSAgfQotICAJICAJfQotICAJICB9Ci0gIAkgIGVsc2UKLSAgCSAgewotICAJICAgIGlmKHRlbXByZXN1bHQuY2hhckF0KGxvYyAtMSApID09ICcvJykKLQkgIAl7Ci0gIAkgIAkgIC8vIFJlc3VsdCBpcyBvZiB0aGUgZm9ybSBmaWxlOi8vc29tZXRoaW5nLy4vc29tZXRoaW5nIHNvIHJlbW92ZSB0aGUgLi8KLSAgCSAgICAgIHRlbXByZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLGxvYyk7Ci0JICAJfQotICAJICAgIGVsc2UKLSAgCSAgICB7Ci0gIAkgICAgICAvLyBSZXN1bHQgVVJJIGlzIG9mIGZvcm0gZmlsZTovL3NvbWVkaXIuLyBzbyBjb3B5IG92ZXIgdGhlIHdob2xlIHNlY3Rpb24uCi0gICAgCSAgU3RyaW5nIHRlbXAgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MgLSAxKTsKLSAgCSAgCSAgaW50IGxvYzIgPSB0ZW1wLmxhc3RJbmRleE9mKCcvJyk7Ci0gIAkgIAkgIGlmKGxvYzIgPT0gLTEpCi0gIAkgIAkgIHsKLSAgCSAgCSAgCS8vIFRoZSBVUkkgbXVzdCBsb29rIGxpa2UgZmlsZTouLyBvciAuLyBzbyBjb3B5IG92ZXIgdGhlIHdob2xlIHRlbXByZXN1bHQuCi0gIAkgIAkgIAlyZXN1bHQgPSB0ZW1wcmVzdWx0LnN1YnN0cmluZygwLCBsb2MpICsgcmVzdWx0OwotICAJICAJICAJdGVtcHJlc3VsdCA9ICIiOwotICAJICAJICB9Ci0gIAkgIAkgIGVsc2UKLSAgCSAgCSAgewotICAJICAJICAJLy8gQ29weSBvdmVyIHRoZSB3aG9sZSBzb21lZGlyLi8KLSAgCSAgCSAgCXJlc3VsdCA9IHRlbXByZXN1bHQuc3Vic3RyaW5nKGxvYzIgKyAxLCB0ZW1wcmVzdWx0Lmxlbmd0aCgpKTsKLSAgCSAgCSAgICB0ZW1wcmVzdWx0ID0gdGVtcHJlc3VsdC5zdWJzdHJpbmcoMCwgbG9jMisxKTsKLSAgCSAgCSAgfQotICAJICAgIH0KLSAgCSAgfQotICAJfQotICAJcmVzdWx0ID0gdGVtcHJlc3VsdCArIHJlc3VsdDsKLSAgCXJldHVybiByZXN1bHQ7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMmU2Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC9yZXNvbHZlci9VUklSZXNvbHZlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlcjsKLQotCi0vKioKLSAqIEEgZGVsZWdhdGUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICovCi1wdWJsaWMgY2xhc3MgVVJJUmVzb2x2ZXJEZWxlZ2F0ZQotewotICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7Ci0gIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXI7Ci0gIHByaXZhdGUgSVVSSVJlc29sdmVyIHJlc29sdmVyID0gbnVsbDsKLSAgCi0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gY2xhc3NuYW1lIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBVUkkgcmVzb2x2ZXIuCi0gICAqIEBwYXJhbSBjbGFzc2xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSBVUkkgcmVzb2x2ZXIuCi0gICAqLwotICBwdWJsaWMgVVJJUmVzb2x2ZXJEZWxlZ2F0ZShTdHJpbmcgY2xhc3NuYW1lLCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikKLSAgewotICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICAgIHRoaXMuY2xhc3Nsb2FkZXIgPSBjbGFzc2xvYWRlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgVVJJIHJlc29sdmVyIGRlc2NyaWJlZCBieSB0aGlzIGRlbGVnYXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIHJlc29sdmVyIGRlc2NyaWJlZCBieSB0aGlzIGRlbGVnYXRlLgotICAgKi8KLSAgcHVibGljIElVUklSZXNvbHZlciBnZXRVUklSZXNvbHZlcigpCi0gIHsKLSAgICBpZihyZXNvbHZlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICByZXNvbHZlciA9IChJVVJJUmVzb2x2ZXIpY2xhc3Nsb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHJlc29sdmVyID0gKElVUklSZXNvbHZlcilnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzbmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZTIpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzb2x2ZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdXRpbC9FcnJvck1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdXRpbC9FcnJvck1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiZGMwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3V0aWwvRXJyb3JNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBBIGNsYXNzIHRvIGhvbGQgdmFsaWRhdGlvbiBtZXNzYWdlcy4gSW4gdGhpcyBjYXNlIGFuIGVycm9yIG1lc3NhZ2UgaXMgYSBnZW5lcmljCi0gKiB0ZXJtIGZvciBhbnkga2luZCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvck1lc3NhZ2UKLXsKLSAgcHJpdmF0ZSBpbnQgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgc2V2ZXJpdHk7Ci0gIHByaXZhdGUgU3RyaW5nIGVycm9yU3RyaW5nLCB1cmk7Ci0gIHByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gLTE7Ci0gIHByaXZhdGUgaW50IGVuZE9mZnNldCA9IC0xOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBFcnJvck1lc3NhZ2UoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgbWVzc2FnZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldEVycm9yTWVzc2FnZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBlcnJvcikKLSAgewotICAgIGVycm9yU3RyaW5nID0gZXJyb3I7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiBAc2VlICNnZXRTZXZlcml0eQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KQotICB7Ci0gICAgdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlIHVzaW5nIHN0cmluZyBuYW1lcyBmb3IgdGhlIHNldmVyaXR5LgotICAgKiAKLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNldmVyaXR5LgotICAgKiBAc2VlICNnZXRTZXZlcml0eQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoU3RyaW5nIHNldmVyaXR5KQotICB7Ci0gICAgaWYgKHNldmVyaXR5LmVxdWFscygid2FybmluZyIpKQotICAgIHsKLSAgICAgIHRoaXMuc2V2ZXJpdHkgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmIChzZXZlcml0eS5lcXVhbHMoImVycm9yIikpCi0gICAgewotICAgICAgdGhpcy5zZXZlcml0eSA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNldmVyaXR5LmVxdWFscygiZmF0YWwiKSkKLSAgICB7Ci0gICAgICB0aGlzLnNldmVyaXR5ID0gMjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgaXMgbG9jYXRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBpcyBsb2NhdGVkLgotICAgKiBAc2VlICNnZXRFcnJvckxpbmUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yTGluZShpbnQgbGluZSkKLSAgewotICAgIGVycm9yTGluZSA9IGxpbmU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29sdW1uIHdoZXJlIHRoZSBlcnJvciBpcyBsb2NhdGVkLgotICAgKiAKLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHdoZXJlIHRoZSBlcnJvciBpcyBsb2NhdGVkLgotICAgKiBAc2VlICNnZXRFcnJvckNvbHVtbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JDb2x1bW4oaW50IGNvbHVtbikKLSAgewotICAgIGVycm9yQ29sdW1uID0gY29sdW1uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBlcnJvciBtZXNzYWdlLgotICAgKiBAc2VlICNzZXRFcnJvck1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBlcnJvclN0cmluZzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzZXZlcml0eSBvZiB0aGUgZXJyb3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzZXZlcml0eSBvZiB0aGUgZXJyb3IuCi0gICAqIEBzZWUgI3NldFNldmVyaXR5Ci0gICAqLwotICBwdWJsaWMgaW50IGdldFNldmVyaXR5KCkKLSAgewotICAgIHJldHVybiBzZXZlcml0eTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAc2VlICNzZXRFcnJvckxpbmUKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RXJyb3JMaW5lKCkKLSAgewotICAgIHJldHVybiBlcnJvckxpbmU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAqIEBzZWUgI3NldEVycm9yQ29sdW1uCi0gICAqLwotICBwdWJsaWMgaW50IGdldEVycm9yQ29sdW1uKCkKLSAgewotICAgIHJldHVybiBlcnJvckNvbHVtbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzdGFydCBvZmZzZXQuCi0gICAqIAotICAgKiBAcGFyYW0gc3RhcnQgVGhlIHN0YXJ0IG9mZnNldC4KLSAgICogQHNlZSAjZ2V0RXJyb3JTdGFydE9mZnNldAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXJyb3JTdGFydE9mZnNldChpbnQgc3RhcnQpCi0gIHsKLSAgICBzdGFydE9mZnNldCA9IHN0YXJ0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVycm9yIHN0YXJ0IG9mZnNldC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVycm9yIHN0YXJ0IG9mZnNldC4KLSAgICogQHNlZSAjc2V0RXJyb3JTdGFydE9mZnNldAotICAgKi8KLSAgcHVibGljIGludCBnZXRFcnJvclN0YXJ0T2Zmc2V0KCkKLSAgewotICAgIHJldHVybiBzdGFydE9mZnNldDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlbmQgb2Zmc2V0LgotICAgKiAKLSAgICogQHBhcmFtIGVuZCBUaGUgZW5kIG9mZnNldC4KLSAgICogQHNlZSAjZ2V0RXJyb3JFbmRPZmZzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVycm9yRW5kT2Zmc2V0KGludCBlbmQpCi0gIHsKLSAgICBlbmRPZmZzZXQgPSBlbmQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXJyb3IgZW5kIG9mZnNldC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVycm9yIGVuZCBvZmZzZXQuCi0gICAqIEBzZWUgI3NldEVycm9yRW5kT2Zmc2V0Ci0gICAqLwotICBwdWJsaWMgaW50IGdldEVycm9yRW5kT2Zmc2V0KCkKLSAgewotICAgIHJldHVybiBlbmRPZmZzZXQ7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIG5ldyBsaW5lIG90IHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG5ld0xpbmUgVGhlIG5ldyBsaW5lIHRvIGFkZCB0byB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5ld0Vycm9yTWVzc2FnZUxpbmUoU3RyaW5nIG5ld0xpbmUpCi0gIHsKLSAgICBlcnJvclN0cmluZyArPSAiXG4iICsgbmV3TGluZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgVVJJIG9mIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIHNldC4KLSAgICovCi0gCi0gIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgdGhpcy51cmkgPSB1cmk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFVSSSBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkKLSAgewotICAgIHJldHVybiB1cmk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdXRpbC9NZXNzYWdlR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3V0aWwvTWVzc2FnZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjc4Y2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdXRpbC9NZXNzYWdlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqIEEgY29udmVuaWVuY2UgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCByZXNvdXJjZXMgaW4gYSByZXNvdXJjZSBidW5kbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlR2VuZXJhdG9yCi17Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byB3b3JrIHdpdGguCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUdlbmVyYXRvcihSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gIH0KLQotICAvKioKLSAgKiBTZXQgdGhlIHJlc291cmNlYnVuZGxlIHRvIHRoZSBvbmUgc3BlY2lmaWVkLgotICAqIAotICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldC4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICByZXNvdXJjZWJ1bmRsZSA9IHJiOwotICB9Ci0KLSAgLyoqCi0gICogR2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4ga2V5LgotICAqIAotICAqIEBwYXJhbSBrZXkgVGhlIGtleSBmb3IgdGhlIHJlc291cmNlLgotICAqIEByZXR1cm4gVGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBkb2VzIG9uZSBzdWJzdGl0dXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSByZXNvdXJjZS4KLSAgICogQHBhcmFtIHMxIFRoZSBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHJldHVybiBUaGUgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkKLSAgewotICAgIHJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtdIHsgczEgfSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBkb2VzIHR3byBzdWJzdGl0dXRpb25zLgotICAgKiAKLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSBzMSBUaGUgZmlyc3Qgc3Vic3RpdHV0aW9uIHRvIHBlcmZvcm0uCi0gICAqIEBwYXJhbSBzMiBUaGUgc2Vjb25kIHN1YnN0aXR1dGlvbiB0byBwZXJmb3JtLgotICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIpCi0gIHsKLSAgICByZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXSB7IHMxLCBzMiB9KTsKLSAgfQotCi0gIC8qKgotICAgKiAgR2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBkb2VzIHRocmVlIHN1YnN0aXR1dGlvbnMuCi0gICAqIAotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSByZXNvdXJjZS4KLSAgICogQHBhcmFtIHMxIFRoZSBmaXJzdCBzdWJzdGl0dXRpb24gdG8gcGVyZm9ybS4KLSAgICogQHBhcmFtIHMyIFRoZSBzZWNvbmQgc3Vic3RpdHV0aW9uIHRvIHBlcmZvcm0uCi0gICAqIEBwYXJhbSBzMyBUaGUgdGhpcmQgc3Vic3RpdHV0aW9uIHRvIHBlcmZvcm0uCi0gICAqIEByZXR1cm4gVGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3QgczEsIE9iamVjdCBzMiwgT2JqZWN0IHMzKQotICB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W10geyBzMSwgczIsIHMzIH0pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JV1NETDExVmFsaWRhdGlvbkluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzI0NDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgV1NETCAxLjEgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4gVXNlcyBhbiBleGlzdGluZwotICogdmFsaWRhdGlvbiBpbmZvIG9iamVjdCBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byBzZXQgYW5kIHJldHJpZXZlCi0gKiBzY2hlbWFzIGFuZCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBzZXR0aW5nIGVycm9ycyB3aXRoIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdTREwxMVZhbGlkYXRpb25JbmZvCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVUkkgb2YgdGhlIGZpbGUgYmVpbmcgdmFsaWRhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIG9mIHRoZSBmaWxlIGJlaW5nIHZhbGlkYXRlZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSB0byB0aGUgbGlzdCBvZiBzY2hlbWFzIGF2YWlsYWJsZSBmb3IgdGhpcyBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHhzTW9kZWwgVGhlIHNjaGVtYSB0byBhZGQgdG8gdGhlIGxpc3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTY2hlbWEoWFNNb2RlbCB4c01vZGVsKTsKLSAgCi0gIC8qKgotICAgKiBHZXQgYW4gYXJyYXkgb2YgYWxsIHRoZSBzY2hlbWFzIGF2YWlsYWJsZSBmb3IgdGhpcyBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHJldHVybiBBbiBhcnJheSBvZiBhbGwgdGhlIHNjaGVtYXMgYXZhaWxhYmxlIGZvciB0aGlzIFdTREwgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgWFNNb2RlbFtdIGdldFNjaGVtYXMoKTsKLSAgCi0gIC8qKgotICAgKiBDbGVhciBhbGwgdGhlIHN0b3JlZCBzY2hlbWFzLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXJTY2hlbWFzKCk7Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBlbGVtZW50IGxvY2F0aW9ucyBoYXNodGFibGUuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudExvY2F0aW9ucyBUaGUgaGFzaHRhYmxlIHRvIHNldCB3aXRoIHRoZSBlbGVtZW50IGxvY2F0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRMb2NhdGlvbnMoSGFzaHRhYmxlIGVsZW1lbnRMb2NhdGlvbnMpOwotICAKLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCBlcnJvciBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciB0byBhZGQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBvYmplY3QgdG8gYWRkIHRoZSBlcnJvciBmb3IuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGVsZW1lbnQpOwotICAKLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCBlcnJvciBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciB0byBhZGQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBvYmplY3QgdG8gYWRkIHRoZSBlcnJvciBmb3IuCi0gICAqIEBwYXJhbSBlcnJvcktleSBUaGUgZXJyb3Iga2V5IGZvciB0aGlzIG1lc3NhZ2UKLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgVGhlIHN0cmluZ3MgdXNlZCB0byBjcmVhdGUgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cyk7Ci0gIAotICAvKioKLSAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UgYXQgdGhlIGdpdmVuIGxpbmUgYW5kIGNvbHVtbi4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciB0byBhZGQuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGVycm9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKTsKLSAgCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgd2FybmluZyBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSB3YXJuaW5nIHRvIGFkZC4KLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIG9iamVjdCB0byBhZGQgdGhlIHdhcm5pbmcgZm9yLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGVsZW1lbnQpOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHdhcm5pbmcgbWVzc2FnZSBhdCB0aGUgZ2l2ZW4gbGluZSBhbmQgY29sdW1uLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHdhcm5pbmcgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgd2FybmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKTsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFVSSSByZXNvbHZlciBpbiB1c2UgZm9yIHRoaXMgdmFsaWRhdGlvbi4gVGhlIFVSSSByZXNvbHZlcgotICAgKiByZXR1cm5lZCBpcyBhY3R1YWxseSBhIFVSSSByZXNvbHZlciBoYW5kbGVyIHRoYXQgd2lsbCAKLSAgICogaXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBVUkkgcmVzb2x2ZXJzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgVVJJIHJlc29sdmVyIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgSVVSSVJlc29sdmVyIGdldFVSSVJlc29sdmVyKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0lXU0RMMTFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiZDJlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9JV1NETDExVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIHZhbGlkYXRvciBwbHVnZ2VkIGludG8gdGhlIFdTREwgMS4xIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJV1NETDExVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBjdXJyZW50IHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcmVzb3VyY2UgYnVuZGxlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0ltcG9ydEhvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSW1wb3J0SG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZWI1MDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvSW1wb3J0SG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLkVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2QuWFNEVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLkFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLklYTUxWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZ1Jlc29sdmVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET01VdGlsczsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuUU5hbWVVdGlsczsKLQotLyoqCi0gKiBBIGNsYXNzIHRvIGhvbGQgYW5kIHBhcnNlIGFuIGltcG9ydCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0SG9sZGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZQotewotICBwcml2YXRlIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAgCi0gIHByaXZhdGUgV1NETERvY3VtZW50IGltcG9ydGluZ1dTRExEb2MgPSBudWxsOwotICBwcml2YXRlIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQgPSBudWxsOwotICBwcml2YXRlIERlZmluaXRpb24gaW1wb3J0aW5nRGVmID0gbnVsbDsKLSAgcHJpdmF0ZSBFbGVtZW50IGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGNvbnRleHRVUkkgPSBudWxsOwotICBwcml2YXRlIGludCBkZXB0aDsKLSAgcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotICBwcml2YXRlIExpc3Qgc2NoZW1hcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzV1NETEZpbGVJbXBvcnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gaW1wb3J0SW52YWxpZCA9IGZhbHNlOwotICBwcml2YXRlIEltcG9ydCBpbXBvcnREZWYgPSBudWxsOwotICBwcml2YXRlIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxpbmZvOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBpbXBvcnQuCi0gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGltcG9ydC4KLSAgICogQHBhcmFtIGNvbnRleHRVUkkgVGhlIGNvbnRleHQgVVJJIGZvciByZXNvbHZpbmcgdGhlIGltcG9ydCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIHdzZGxEb2MgVGhlIFdTRExEb2N1bWVudCB0aGF0IGNvbnRhaW5zIHRoZSBpbXBvcnQuCi0gICAqIEBwYXJhbSBkZXB0aCBUaGUgZGVwdGggb2YgdGhlIGltcG9ydC4KLSAgICogQHBhcmFtIGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQgVGhlIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBpbXBvcnQgaW4gdGhlIGVuY2Fwc3VsYXRpbmcgV1NETERvY3VtZW50LgotICAgKiBAcGFyYW0gbWVzc2FnZWdlbmVyYXRvciBBIG1lc3NhZ2VnZW5lcmF0b3IgZm9yIG9idGFpbmluZyBzdHJpbmdzLgotICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgV1NETDExVmFsaWRhdGlvbkluZm8gZm9yIHJlcG9ydGluZyBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyBJbXBvcnRIb2xkZXIoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgY29udGV4dFVSSSwgV1NETERvY3VtZW50IGltcG9ydGluZ1dTRExEb2MsIGludCBkZXB0aCwgRWxlbWVudCBpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50LCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3IsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICB7Ci0gICAgdGhpcy5tZXNzYWdlZ2VuZXJhdG9yID0gbWVzc2FnZWdlbmVyYXRvcjsKLSAgICB0aGlzLnZhbGluZm8gPSB2YWxpbmZvOwotICAgIHRoaXMuaW1wb3J0aW5nV1NETERvYyA9IGltcG9ydGluZ1dTRExEb2M7Ci0gICAgaWYoaW1wb3J0aW5nV1NETERvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIHRoaXMuaW1wb3J0aW5nRGVmID0gaW1wb3J0aW5nV1NETERvYy5nZXREZWZpbml0aW9uKCk7Ci0gICAgfQotICAgIHRoaXMuaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCA9IGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQ7Ci0gICAgdGhpcy5kZXB0aCA9IGRlcHRoOwotICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICAKLSAgICAvLyAgQWxsb3cgV1NETCBpbXBvcnRzIHRvIGhhdmUgbm8gbG9jYXRpb24gYXR0cmlidXRlIGV2ZW4gdGhvdWdoIGl0IGlzIHJlcXVpcmVkLgotICAgIC8vIFNjaGVtYSB3aWxsIG5vcm1hbGx5IGNhdGNoIHRoZSBwcm9ibGVtIGJ1dCB0aGlzIGFsbG93cyB1c2VycyB0byBvdmVycmlkZSB0aGUKLSAgICAvLyBzY2hlbWEgYW5kIGhhdmUgdGhlIHZhbGlkYXRvciBydW4uCi0gICAgaWYgKHRoaXMubG9jYXRpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aGlzLmxvY2F0aW9uID0gbmFtZXNwYWNlOwotICAgIH0KLSAgICB0aGlzLmNvbnRleHRVUkkgPSBjb250ZXh0VVJJOwotICAgIAotICAgIHRoaXMubG9jYXRpb24gPSB0aGlzLmxvY2F0aW9uLnJlcGxhY2UoJ1xcJywnLycpOwotICAgIFN0cmluZyBjbGFzc3BhdGhVUkkgPSB2YWxpbmZvLmdldFVSSVJlc29sdmVyKCkucmVzb2x2ZSh0aGlzLmNvbnRleHRVUkksIHRoaXMubmFtZXNwYWNlLCB0aGlzLmxvY2F0aW9uKTsKLSAgICBpZihjbGFzc3BhdGhVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aGlzLmxvY2F0aW9uID0gY2xhc3NwYXRoVVJJOwotICAgICAgdGhpcy5jb250ZXh0VVJJID0gbnVsbDsKLSAgICB9IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkKLSAgewotICAgIEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBkb2N1bWVudEVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGlmKGRvY3VtZW50RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgCSAgLy8gSGFuZGxlIFdTREwgaW1wb3J0cy4KLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUywgZG9jdW1lbnRFbGVtZW50KSkKLSAgICAgIHsKLSAgICAgICAgaWYoaXNYTUxWYWxpZCh0aGlzLmxvY2F0aW9uKSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCA9IG5ldyBXU0RMRG9jdW1lbnQodGhpcy5sb2NhdGlvbiwgZG9jdW1lbnRFbGVtZW50LCB0aGlzLmRlcHRoLCB0aGlzLm1lc3NhZ2VnZW5lcmF0b3IsIHRoaXMudmFsaW5mbyk7Ci0gICAgICAgICAgICBjcmVhdGVXU0RMSW1wb3J0KHdzZGxEb2N1bWVudCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2YWxpbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfVU5BQkxFX1RPX0lNUE9SVF9CQURfTE9DQVRJT04iLCAiJyIgKyBpbXBvcnREZWYuZ2V0TG9jYXRpb25VUkkoKSArICInIiksIGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gSGFuZGxlIHNjaGVtYSBpbXBvcnRzLgotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fWFNEXzIwMDEsIGRvY3VtZW50RWxlbWVudCkpCi0gICAgICB7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNYTUxWYWxpZChTdHJpbmcgdXJpKQotICB7Ci0gICAgSVhNTFZhbGlkYXRvciB4bWxWYWxpZGF0b3IgPSBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFhNTFZhbGlkYXRvcigpOwotICAgIHhtbFZhbGlkYXRvci5zZXRGaWxlKHVyaSk7Ci0gICAgLy94bWxWYWxpZGF0b3Iuc2V0VmFsaWRhdGlvbkluZm8odmFsSW5mbyk7Ci0gICAgeG1sVmFsaWRhdG9yLnJ1bigpOwotICAgIC8vIGlmIHRoZXJlIGFyZSBubyB4bWwgY29uZm9ybWFuY2UgcHJvYmxlbXMgZ28gb24gdG8gY2hlY2sgdGhlIHdzZGwgc3R1ZmYKLSAgICBpZiAoeG1sVmFsaWRhdG9yLmhhc0Vycm9ycygpKQotICAgIHsKLSAgICAgIC8vIHRlbXAgaGFuZGxpbmcgb2YgWE1MIGVycm9ycyB1bnRpbCB2YWxpZGF0b3IgaXMgdXBkYXRlZC4KLSAgICAgIExpc3QgZXJyb3JzID0geG1sVmFsaWRhdG9yLmdldEVycm9ycygpOwotICAgICAgSXRlcmF0b3IgZXJyb3JzSXRlciA9IGVycm9ycy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGVycm9yc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBJVmFsaWRhdGlvbk1lc3NhZ2UgdmFsTWVzID0gKElWYWxpZGF0aW9uTWVzc2FnZSllcnJvcnNJdGVyLm5leHQoKTsKLSAgICAgICAgdmFsaW5mby5hZGRFcnJvcih2YWxNZXMuZ2V0TWVzc2FnZSgpLCB2YWxNZXMuZ2V0TGluZSgpLCB2YWxNZXMuZ2V0Q29sdW1uKCksIHZhbE1lcy5nZXRVUkkoKSk7Ci0gICAgICB9Ci0gICAgICBpbXBvcnRJbnZhbGlkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGltcG9ydGluZyBXU0RMRG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbXBvcnRpbmcgV1NETERvY3VtZW50LgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudCBnZXRJbXBvcnRpbmdEb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0aW5nV1NETERvYzsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgV1NETCBkb2N1bWVudCB0aGlzIGltcG9ydCByZXByZXNlbnRzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgV1NETCBkb2N1bWVudCB0aGlzIGltcG9ydCByZXByZXNlbnRzLgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudCBnZXRXU0RMRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxEb2N1bWVudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbmFtZXNwYWNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjb250ZXh0IFVSSS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNvbnRleHQgVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0VVJJKCkKLSAgewotICAgIHJldHVybiBjb250ZXh0VVJJOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBkZXB0aCBpbiB0aGUgV1NETCB0cmVlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZGVwdGggaW4gdGhlIFdTREwgdHJlZS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RGVwdGgoKQotICB7Ci0gICAgcmV0dXJuIGRlcHRoOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjb250YWluaW5nIGRlZmludGlvbnMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNvbnRhaW5pbmcgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldEltcG9ydGluZ0RlZmluaXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydGluZ0RlZjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZWxlbWVudCBmb3IgdGhpcyBpbXBvcnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBlbGVtZW50IGZvciB0aGlzIGltcG9ydC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIGlmKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZWxlbWVudDsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIGxvY2F0aW9uVVJJID0gbG9jYXRpb247Ci0gICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZTsKLSAgICAvL0ltcG9ydCBpbXBvcnREZWYgPSBpbXBvcnRpbmdEZWYuY3JlYXRlSW1wb3J0KCk7Ci0gICAgCi0gICAgLy8gIEFsbG93IGxvY2F0aW5nIFdTREwgZG9jdW1lbnRzIHVzaW5nIGFueSByZWdpc3RlcmVkIFVSSSByZXNvbHZlci4KLSAgICAvL1N0cmluZyBjbGFzc3BhdGhVUkkgPSBVUklSZXNvbHZlci5nZXRJbnN0YW5jZSgpLnJlc29sdmUoY29udGV4dFVSSSwgbmFtZXNwYWNlVVJJLCBsb2NhdGlvblVSSSk7Ci0vLyAgICBpZiAoIWNsYXNzcGF0aFVSSS5lcXVhbHMobG9jYXRpb25VUkkpKQotLy8gICAgewotLy8gICAgICBsb2NhdGlvblVSSSA9IGNsYXNzcGF0aFVSSTsKLS8vICAgICAgY29udGV4dFVSSSA9IG51bGw7Ci0vLyAgICB9Ci0gICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgaWYgKGxvY2F0aW9uVVJJICE9IG51bGwpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIC8vU3RyaW5nIGNvbnRleHRVUkkgPSBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgICAgICAgLy9EZWZpbml0aW9uIGltcG9ydGVkRGVmID0gbnVsbDsKLSAgICAgICAgICAKLSAgICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG51bGw7Ci0gICAgICAgICAgVVJMIHVybCA9IG51bGw7Ci0KLSAgICAgICAgICAKLSAgICAgICAgICAgIFVSTCBjb250ZXh0VVJMID0gKGNvbnRleHRVUkkgIT0gbnVsbCkgPyBTdHJpbmdVdGlscy5nZXRVUkwobnVsbCwgY29udGV4dFVSSSkgOiBudWxsOwotCi0gICAgICAgICAgICB1cmwgPSBTdHJpbmdVdGlscy5nZXRVUkwoY29udGV4dFVSTCwgbG9jYXRpb25VUkkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBIYW5kbGUgZmlsZTovLyB1cmxzLiBUaGUgY29ycmVjdCBmb3JtYXQgc2hvdWxkIGJlIGZpbGU6Ly8vIG9yIGZpbGU6Ly4KLSAgICAgICAgICAgIFN0cmluZyB1cmxBdXRob3JpdHkgPSB1cmwuZ2V0QXV0aG9yaXR5KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdXJsUHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKTsKLSAgICAgICAgICAgIGlmKHVybEF1dGhvcml0eSAhPW51bGwgJiYgdXJsUHJvdG9jb2wuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpICYmICF1cmxBdXRob3JpdHkuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsUHJvdG9jb2wsIiIsIi8iICsgdXJsQXV0aG9yaXR5ICsgdXJsLmdldEZpbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyB1cmxTdHJpbmcgPSB1cmwudG9TdHJpbmcoKTsKLQkJCS8vIFRlc3QgZm9yIGNhc2Ugc2Vuc2l0aXZpdHkgb24gbG9jYWwgZmlsZXMuCi0JCQlpZih1cmxTdHJpbmcuc3RhcnRzV2l0aCgiZmlsZToiKSkKLQkJCXsKLQkJCSAgRmlsZSB0ZXN0ZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQkJICBTdHJpbmcgdGVzdGZpbGVTdHJpbmcgPSB0ZXN0ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCSAgRmlsZSBjYW5vbmljYWxmaWxlID0gdGVzdGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJICBTdHJpbmcgY2Fub25pY2FsZmlsZVN0cmluZyA9IGNhbm9uaWNhbGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgICAgICAgaWYgKCF0ZXN0ZmlsZVN0cmluZy5lcXVhbHMoY2Fub25pY2FsZmlsZVN0cmluZykpCi0gICAgICAgICAgICAgIHsKLQkJCQlpZiAoIVN0cmluZy52YWx1ZU9mKHRlc3RmaWxlU3RyaW5nLmNoYXJBdCgwKSkuZXF1YWxzSWdub3JlQ2FzZQotCQkJCSAgICAoU3RyaW5nLnZhbHVlT2YoY2Fub25pY2FsZmlsZVN0cmluZy5jaGFyQXQoMCkpKQotCQkJCSAgICB8fCAhdGVzdGZpbGVTdHJpbmcuc3Vic3RyaW5nKDEsdGVzdGZpbGVTdHJpbmcubGVuZ3RoKCkpLmVxdWFscwotCQkJCQkoY2Fub25pY2FsZmlsZVN0cmluZy5zdWJzdHJpbmcoMSxjYW5vbmljYWxmaWxlU3RyaW5nLmxlbmd0aCgpKSkpCi0JCQkJewotICAgICAgICAgICAgICAgICAgdXJsU3RyaW5nID0gIiI7Ci0gICAgICAgICAgICAgICAgICB1cmwgPSBudWxsOwotCQkJCX0KLSAgICAgICAgICAgICAgfQotCQkJfQotCQkJCi0JCQlpZih1cmwgIT0gbnVsbCkKLQkJCXsKLQkJCSAgdHJ5Ci0JCQkgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBTdHJpbmdVdGlscy5nZXRDb250ZW50QXNSZWFkZXIodXJsKTsKLQkJCSAgfQotCQkJICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotCQkJICB7Ci0JCQkgICAgLy8gTm8gbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLiBUaGUgZXJyb3Igd2lsbCBiZSBoYW5kbGVkIGJlbG93LgotCQkJICB9Ci0JCQl9Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbnB1dFNvdXJjZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBHZXQgdGhlIGFjdHVhbCBsb2NhdGlvbiBmcm9tIHRoZSBlbGVtZW50LgotICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsTG9jYXRpb24gPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoaW1wb3J0aW5nRG9jSW1wb3J0RWxlbWVudCwgQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04pOwotICAgICAgICAgICAgICBpZihhY3R1YWxMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIAlhY3R1YWxMb2NhdGlvbiA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50LCAic2NoZW1hTG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZihhY3R1YWxMb2NhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIAlhY3R1YWxMb2NhdGlvbiA9IG5hbWVzcGFjZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpbXBvcnRpbmdXU0RMRG9jLmFkZFJlYWRlcldhcm5pbmcoCi0gICAgICAgICAgICAgICAgICBpbXBvcnRpbmdEZWYsCi0gICAgICAgICAgICAgICAgICBpbXBvcnRpbmdEb2NJbXBvcnRFbGVtZW50LAotICAgICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9VTkFCTEVfVE9fSU1QT1JUX0JBRF9MT0NBVElPTiIsICInIiArIGFjdHVhbExvY2F0aW9uICsgIiciKSk7Ci0gICAgICAgICAgICAgIGltcG9ydEludmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIC8vIFRPRE86IG1vZGlmeSB0aGUgcmVhZGVyIGVycm9yIHRvIHNob3cgaW4gYWxsIHRoZSBjb3JyZWN0IGxvY2F0aW9ucy4KLSAgICAgICAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwKLSAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGxvY2F0ZSBpbXBvcnRlZCBkb2N1bWVudCAiCi0gICAgICAgICAgICAgICAgICArICJhdCAnIgotICAgICAgICAgICAgICAgICAgKyBsb2NhdGlvblVSSQotICAgICAgICAgICAgICAgICAgKyAiJyIKLSAgICAgICAgICAgICAgICAgICsgKGNvbnRleHRVUkkgPT0gbnVsbCA/ICIuIiA6ICIsIHJlbGF0aXZlIHRvICciICsgY29udGV4dFVSSSArICInLiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZG9jID0gV1NETFJlYWRlckltcGwuZ2V0RG9jdW1lbnQoaW5wdXRTb3VyY2UsIGxvY2F0aW9uVVJJKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gVGhlIEZpbGUgaXMgaW52YWxpZCBhbmQgY2Fubm90IGJlIHJlYWQuIAotICAgICAgICAgICAgICAvLyBQZXJmb3JtIFhNTCB2YWxpZGF0aW9uLgotICAgICAgICAgICAgICBpc1hNTFZhbGlkKGxvY2F0aW9uVVJJKTsKLS8vICAgICAgICAgICAgICBpbXBvcnRpbmdXU0RMRG9jLmFkZFJlYWRlckVycm9yKAotLy8gICAgICAgICAgICAgICAgICBpbXBvcnRpbmdEZWYsCi0vLyAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsCi0vLyAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfVU5BQkxFX1RPX0lNUE9SVF9JTlZBTElEIiwgIiciICsgbG9jYXRpb24gKyAiJyIpKTsKLSAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsZW1lbnQgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZighUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fREVGSU5JVElPTlMsIGVsZW1lbnQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpc1dTRExGaWxlSW1wb3J0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgaGFzIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgaW1wb3J0IGVsZW1lbnQgc3RhdGVzLgotICAgICAgICAgICAgU3RyaW5nIGltcG9ydFRhcmdldE5TID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICBpZighaW1wb3J0VGFyZ2V0TlMuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGltcG9ydGluZ1dTRExEb2MuYWRkUmVhZGVyV2FybmluZygKLSAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RlZiwKLSAgICAgICAgICAgICAgICAgIGltcG9ydGluZ0RvY0ltcG9ydEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1dBUk5fV1JPTkdfTlNfT05fSU1QT1JUIiwgIiciICsgbmFtZXNwYWNlICsgIiciLCAiJyIgKyBpbXBvcnRUYXJnZXROUyArICInIikpOwotICAgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgaW1wb3J0SW52YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZihyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAge30KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbXBvcnQgZWxlbWVudCBmb3IgYSBXU0RMIGltcG9ydCBvZiBhIFdTREwgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFRoZSBkb2N1bWVudCBvZiB0aGUgaW1wb3J0LgotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGltcG9ydCBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEltcG9ydCBjcmVhdGVXU0RMSW1wb3J0KFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gIHsKLSAgICBpZihpbXBvcnREZWYgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1wb3J0RGVmOwotICAgIH0KLSAgICBpbXBvcnREZWYgPSBnZXROZXdJbXBvcnQoKTsKLSAgCi0gICAgaWYgKGltcG9ydERlZiAhPSBudWxsKQotICAgIHsKLSAgICAgIGltcG9ydERlZi5zZXREZWZpbml0aW9uKHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9uKCkpOwotICAgICAgc2NoZW1hcy5hZGRBbGwod3NkbERvY3VtZW50LmdldFNjaGVtYXMoKSk7Ci0gICAgICBpbXBvcnRpbmdXU0RMRG9jLmFkZFNjaGVtYXMoc2NoZW1hcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGltcG9ydERlZjsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbXBvcnQgZWxlbWVudCBmb3IgYSBXU0RMIGltcG9ydCBvZiBhIHNjaGVtYSBpbXBvcnQgb2YgYSBzY2hlbWEgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGltcG9ydCBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEltcG9ydCBjcmVhdGVYU0RJbXBvcnQoKQotICB7Ci0gICAgaWYoaW1wb3J0RGVmICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGltcG9ydERlZjsKLSAgICB9Ci0gICAgaW1wb3J0RGVmID0gZ2V0TmV3SW1wb3J0KCk7Ci0gICAgWFNEVmFsaWRhdG9yIHhzZHZhbGlkYXRvciA9IG5ldyBYU0RWYWxpZGF0b3IoKTsKLQotICAgIHhzZHZhbGlkYXRvci52YWxpZGF0ZShsb2NhdGlvbiwgWE1MQ2F0YWxvZ1Jlc29sdmVyLmdldEluc3RhbmNlKCkpOwotICAgIGlmICh4c2R2YWxpZGF0b3IuaXNWYWxpZCgpKQotICAgIHsKLSAgICAgIFhTTW9kZWwgc2NoZW1hID0geHNkdmFsaWRhdG9yLmdldFhTTW9kZWwoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2NoZW1hcy5hZGQoc2NoZW1hKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgLy8gYWRkUmVhZGVyV2FybmluZygKLS8vICAgICAgICBkZWYsCi0vLyAgICAgICAgaW1wb3J0RGVmLAotLy8gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfVU5BQkxFX1RPX0lNUE9SVF9JTlZBTElEIiwgIiciICsgaW1wb3J0RGVmLmdldExvY2F0aW9uVVJJKCkgKyAiJyIpKTsKLSAgICAgIEl0ZXJhdG9yIGVycm9ycyA9IHhzZHZhbGlkYXRvci5nZXRFcnJvcnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGVycm9ycy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEVycm9yTWVzc2FnZSBlcnIgPSAoRXJyb3JNZXNzYWdlKSBlcnJvcnMubmV4dCgpOwotICAgICAgICBTdHJpbmcgdXJpID0gZXJyLmdldFVSSSgpOwotICAgICAgICBpbnQgbGluZSA9IGVyci5nZXRFcnJvckxpbmUoKTsKLSAgICAgICAgU3RyaW5nIGVycm1lc3MgPSBlcnIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0gICAgICAgIHZhbGluZm8uYWRkRXJyb3IoZXJybWVzcywgbGluZSwgZXJyLmdldEVycm9yQ29sdW1uKCksIHVyaSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGltcG9ydGluZ1dTRExEb2MuYWRkU2NoZW1hcyhzY2hlbWFzKTsKLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBpbXBvcnQgZWxlbWVudCBpZiBpdCBoYXMgYmVlbiBjcmVhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgaW1wb3J0IGVsZW1lbnQgaWYgaXQgaGFzIGJlZW4gY3JlYXRlZCBvciBudWxsLgotICAgKi8KLSAgcHVibGljIEltcG9ydCBnZXRJbXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydERlZjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCBhIG5ldyBpbXBvcnQgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gQSBuZXcgaW1wb3J0IGVsZW1lbnQuCi0gICAqLwotICBwcml2YXRlIEltcG9ydCBnZXROZXdJbXBvcnQoKQotICB7Ci0gICAgaWYoaW1wb3J0SW52YWxpZCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgSW1wb3J0IGltcG9ydERlZiA9IGltcG9ydGluZ0RlZi5jcmVhdGVJbXBvcnQoKTsgCi0gICAgCi0gICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGltcG9ydERlZi5zZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlKTsKLSAgICB9Ci0KLSAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbXBvcnREZWYuc2V0TG9jYXRpb25VUkkobG9jYXRpb24pOwotICAgIH0KLSAgICAKLSAgICBpZihlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChlbGVtZW50KTsKLQotICAgICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgICAgewotICAgICAgICAgIGltcG9ydERlZi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGltcG9ydERlZjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgc2NoZW1hcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaW1wb3J0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2NoZW1hcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaW1wb3J0LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGltcG9ydCBpbXBvcnRzIGEgV1NETCBkb2N1bWVudCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgaW1wb3J0IGltcG9ydHMgYSBXU0RMIGRvY3VtZW50LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1dTRExGaWxlSW1wb3J0KCkKLSAgewotICAgIHJldHVybiBpc1dTRExGaWxlSW1wb3J0OwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQotICB7Ci0gICAgaWYob2JqLmdldENsYXNzKCkgPT0gSW1wb3J0SG9sZGVyLmNsYXNzKQotICAgIHsKLSAgICAgIEltcG9ydEhvbGRlciBvdGhlckltcG9ydCA9IChJbXBvcnRIb2xkZXIpb2JqOwotICAgICAgCi0gICAgICBpZihnZXROYW1lc3BhY2UoKS5lcXVhbHMob3RoZXJJbXBvcnQuZ2V0TmFtZXNwYWNlKCkpICYmIGdldExvY2F0aW9uKCkuZXF1YWxzKG90aGVySW1wb3J0LmdldExvY2F0aW9uKCkpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb2JqKQotICB7Ci0gICAgaWYob2JqID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIAotICAgIEltcG9ydEhvbGRlciBvdGhlckltcG9ydCA9IChJbXBvcnRIb2xkZXIpb2JqOwotICAgICAgCi0gICAgcmV0dXJuIChnZXROYW1lc3BhY2UoKStnZXRMb2NhdGlvbigpKS5jb21wYXJlVG8oKG90aGVySW1wb3J0LmdldE5hbWVzcGFjZSgpK290aGVySW1wb3J0LmdldExvY2F0aW9uKCkpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbWVzc2FnZWdlbmVyYXRvciBmb3IgdGhlIGltcG9ydCBob2xkZXIuCi0gICAqIAotICAgKiBAcGFyYW0gbWcgVGhlIG1lc3NhZ2UgZ2VuZXJhdG9yIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VHZW5lcmF0b3IoTWVzc2FnZUdlbmVyYXRvciBtZykKLSAgewotICAgIG1lc3NhZ2VnZW5lcmF0b3IgPSBtZzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybiB0cnVlIGlmIHRoZSBpbXBvcnQgaXMgaW52YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBpbXBvcnQgaXMgaW52YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJbXBvcnRJbnZhbGlkKCkKLSAgewotICAgIHJldHVybiBpbXBvcnRJbnZhbGlkOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvTG9jYXRpb25Ib2xkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL0xvY2F0aW9uSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZWYzMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvTG9jYXRpb25Ib2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotLyoqCi0gKiBIb2xkcyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQgaW4gYSBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIExvY2F0aW9uSG9sZGVyCi17Ci0gIHByaXZhdGUgaW50IGxpbmU7Ci0gIHByaXZhdGUgaW50IGNvbHVtbjsKLSAgcHJpdmF0ZSBTdHJpbmcgdXJpOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbnVtYmVyLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbnVtYmVyLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIExvY2F0aW9uSG9sZGVyKGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgdGhpcy5saW5lID0gbGluZTsKLSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLSAgICB0aGlzLnVyaSA9IHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGluZSBudW1iZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZSgpCi0gIHsKLSAgICByZXR1cm4gbGluZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgY29sdW1uIG51bWJlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGNvbHVtbiBudW1iZXIuCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbigpCi0gIHsKLSAgICByZXR1cm4gY29sdW1uOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBmaWxlIFVSSS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGZpbGUgVVJJLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvUmVhZGVyRXJyb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1JlYWRlckVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YjRlNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvUmVhZGVyRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotLyoqCi0gKiBIb2xkcyBhbiBlcnJvciBjcmVhdGVkIHdoZW4gcmVhZGluZyBhIFdTREwgZG9jdW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkZXJFcnJvcgotewotICBwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudE9iamVjdDsgLy8gdGhlIG9iamVjdCBvZiB0aGUgcGFyZW50IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IKLSAgcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7IC8vIHRoZSBvYmplY3QgdGhlIGVycm9yIGlzIGFzc29jaWF0ZWQgd2l0aAotICBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yOyAvLyB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QgCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudE9iamVjdCB0aGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yCi0gICAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvcgotICAgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yCi0gICAqLwotICBwdWJsaWMgUmVhZGVyRXJyb3IoT2JqZWN0IHBhcmVudE9iamVjdCwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIGVycm9yKQotICB7Ci0gICAgdGhpcy5wYXJlbnRPYmplY3QgPSBwYXJlbnRPYmplY3Q7Ci0gICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgdGhpcy5lcnJvciA9IGVycm9yOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvci4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvcgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRQYXJlbnRPYmplY3QoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudE9iamVjdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkKLSAgewotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKQotICB7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvVmFsaWRhdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1NjRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0vKioKLSAqIEEgcmVnaXN0cnkgdG8gaG9sZCBhbGwgdGhlIFdTREwgMS4xIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JSZWdpc3RyeQotewotCi0gIHByb3RlY3RlZCBzdGF0aWMgVmFsaWRhdG9yUmVnaXN0cnkgdmVySW5zdGFuY2U7Ci0KLSAgcHJvdGVjdGVkIE1hcCB2YWxpZGF0b3JSZWcgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFZhbGlkYXRvclJlZ2lzdHJ5KCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGlzIHJlZ2lzdHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAodmVySW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB2ZXJJbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JSZWdpc3RyeSgpOwotICAgIH0KLSAgICByZXR1cm4gdmVySW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhpcyB2YWxpZGF0b3IgZGVsZWdhdGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRoZSB2YWxpZGF0b3IgaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgKiBAcGFyYW0gdmFsRGVsZWdhdGUgVGhlIHZhbGlkYXRvciBkZWxlZ2F0ZSB0byByZWdpc3Rlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UsIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlIHZhbERlbGVnYXRlKQotICB7Ci0gICAgLy8gYWxsb3cgdGhlIG51bGwgbmFtZXNwYWNlIGJ1dCBtYWtlIGl0IHRoZSBlbXB0eSBzdHJpbmcKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSB2YWxpZGF0b3IgdG8gdGhlIGhhc2h0YWJsZQotICAgIHZhbGlkYXRvclJlZy5wdXQobmFtZXNwYWNlLCB2YWxEZWxlZ2F0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQXNrIGZvciB0aGUgdmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWVzcGFjZS4gSWYgbm9uZSBpcyBmb3VuZAotICAgKiByZXR1cm4gbnVsbC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgdmFsaWRhdG9yLgotICAgKiBAcmV0dXJuIFRoZSBXU0RMIDEuMSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgSVdTREwxMVZhbGlkYXRvciBxdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICAvLyBpZiB0aGUgbmFtZXNwYWNlIGlzIG51bGwgYWxsb3cgaXQgYW5kIHRyZWF0IGl0IGFzIHRoZSBlbXB0eSBzdHJpbmcKLSAgICBpZiAobmFtZXNwYWNlID09IG51bGwpCi0gICAgewotICAgICAgbmFtZXNwYWNlID0gIiI7Ci0gICAgfQotICAgIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gKFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKXZhbGlkYXRvclJlZy5nZXQobmFtZXNwYWNlKTsKLSAgICBpZihkZWxlZ2F0ZSAhPSBudWxsKQotICAgIHsgIAotICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFZhbGlkYXRvcigpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCB0ZWxscyB3aGV0aGVyIGEgdmFsaWRhdG9yIGZvciBhIGdpdmVuIG5hbWVzcGFjZSBpcyByZWdpc3RlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRvIGNoZWNrLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgYSB2YWxpZGF0b3IgcmVnaXN0ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVnaXN0ZXJlZFZhbGlkYXRvcihTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgaWYgKHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkobmFtZXNwYWNlKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMUJhc2ljVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFCYXNpY1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZkNjQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMUJhc2ljVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkLlNjaGVtYUF0dHJpYnV0ZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZC5YU0RWYWxpZGF0b3I7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotLyoqCi0gKiBWYWxpZGF0ZSB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiBhIFdTREwgMS4xIERvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgV1NETDExQmFzaWNWYWxpZGF0b3IgaW1wbGVtZW50cyBJV1NETDExVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFU19GRUFUVVJFX0lEID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0ZFQVRVUkVfSUQgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNDSEVNQV9WQUxJREFUSU9OX0ZFQVRVUkVfSUQgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQ0hFTUFfRlVMTF9DSEVDS0lOR19GRUFUVVJFX0lEID0KLSAgICAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hLWZ1bGwtY2hlY2tpbmciOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIENPTlRJTlVFX0FGVEVSX0ZBVEFMX0VSUk9SX0lEID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9jb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU09BUF9FTkNPRElOR19VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOwotICAKLSAgLy8gRXJyb3IgYW5kIFdhcm5pbmcgS2V5cwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUE9SVF9OQU1FX05PVF9VTklRVUUgPSAiX1BPUlRfTkFNRV9OT1RfVU5JUVVFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX05PX0JJTkRJTkdfRk9SX1BPUlQgPSAiX05PX0JJTkRJTkdfRk9SX1BPUlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfTk9fQUREUkVTU19QT1JUID0gIl9OT19BRERSRVNTX1BPUlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfTU9SRV9USEVOX09ORV9BRERSRVNTX1BPUlQgPSAiX01PUkVfVEhFTl9PTkVfQUREUkVTU19QT1JUIjsgLy9UT0RPIHNob3VsZCBiZSBfTU9SRV9USEFOX09ORV9BRERSRVNTX1BPUlQsIG5vdCBUSEVOCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9QT1JUVFlQRV9VTkRFRklORURfRk9SX0JJTkRJTkcgPSAiX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9PUEVSQVRJT05fVU5ERUZJTkVEX0ZPUl9QT1JUVFlQRSA9ICJfT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfT1BFUkFUSU9OX05PX0lOUFVUX09SX09VVFBVVCA9ICJfT1BFUkFUSU9OX05PX0lOUFVUX09SX09VVFBVVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9JTlBVVF9OQU1FX05PVF9VTklRVUUgPSAiX0lOUFVUX05BTUVfTk9UX1VOSVFVRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfSU5QVVQgPSAiX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9JTlBVVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9PVVRQVVRfTkFNRV9OT1RfVU5JUVVFID0gIl9PVVRQVVRfTkFNRV9OT1RfVU5JUVVFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9PVVRQVVQgPSAiX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9PVVRQVVQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfTUVTU0FHRV9VTkRFRklORURfRk9SX0ZBVUxUID0gIl9NRVNTQUdFX1VOREVGSU5FRF9GT1JfRkFVTFQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUEFSVF9OT19FTEVNRU5UX09SX1RZUEUgPSAiX1BBUlRfTk9fRUxFTUVOVF9PUl9UWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1BBUlRfQk9USF9FTEVNRU5UX0FORF9UWVBFID0gIl9QQVJUX0JPVEhfRUxFTUVOVF9BTkRfVFlQRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9QQVJUX0lOVkFMSURfRUxFTUVOVCA9ICJfUEFSVF9JTlZBTElEX0VMRU1FTlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfUEFSVF9JTlZBTElEX1RZUEUgPSAiX1BBUlRfSU5WQUxJRF9UWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9QQVJUID0gIl9XQVJOX1NPQVBFTkNfSU1QT1JURURfUEFSVCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgRUxFTUVOVCA9IDA7Ci0gIHByaXZhdGUgZmluYWwgaW50IFRZUEUgPSAxOwotICAKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVRVUVTVCA9ICJSZXF1ZXN0IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBRVU9URSA9ICInIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7Ci0gIAotCi0gIC8vcHJvdGVjdGVkIFdTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIgdmFsaWRhdG9yY29udHJvbGxlcjsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIC8vdGhpcy52YWxpZGF0b3Jjb250cm9sbGVyID0gdmFsaWRhdG9yY29udHJvbGxlcjsKLSAgICAvL3NldERlZmF1bHRSZXNvdXJjZUJ1bmRsZUlmTmVlZGVkKHZhbGlkYXRvcmNvbnRyb2xsZXIpOwotICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSAoRGVmaW5pdGlvbillbGVtZW50OwotICAgIC8vdmFsaWRhdGVUeXBlcyh3c2RsRGVmaW5pdGlvbiwgdmFsSW5mbyk7Ci0gICAgdmFsaWRhdGVTZXJ2aWNlcyh3c2RsRGVmaW5pdGlvbiwgdmFsSW5mbyk7Ci0gICAgdmFsaWRhdGVCaW5kaW5ncyh3c2RsRGVmaW5pdGlvbiwgdmFsSW5mbyk7Ci0gICAgdmFsaWRhdGVQb3J0VHlwZXMod3NkbERlZmluaXRpb24sIHZhbEluZm8pOwotICAgIHZhbGlkYXRlTWVzc2FnZXMod3NkbERlZmluaXRpb24sIHZhbEluZm8pOwotCi0gIH0KLQotICAvKioKLSAgICogVGFrZXMgYSBsaXN0IG9mIEV4dGVuc2liaWxpdHlFbGVtZW50cyBhbmQgY2hlY2tzIGlmIHRoZXJlJ3MgYSB2YWxpZGF0b3IgCi0gICAqIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGVsZW1lbnQgYW5kIGlmIHNvIGNhbGxzIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBlbGVtZW50cy4KLSAgICogQHBhcmFtIGV4dGVuc2liaWxpdHlFbGVtZW50cyBUaGUgbGlzdCBvZiBlbGVtZW50cyB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHZhbGlkYXRvcmNvbnRyb2xsZXIgVGhlIHZhbGlkYXRvciBjb250cm9sbGVyLgotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb24gVGhlIGRlZm5pbnRpb25zIGVsZW1lbnQgZm9yIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdCgKLSAgICBMaXN0IHBhcmVudHMsCi0gICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMsCi0gICAgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBWYWxpZGF0b3JSZWdpc3RyeSB2ZXIgPSBWYWxpZGF0b3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotICAgIEl0ZXJhdG9yIGV4dEVsZW1zID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGV4dEVsZW1zLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1zLm5leHQoKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBJV1NETDExVmFsaWRhdG9yIHZhbCA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KG5hbWVzcGFjZSk7Ci0gICAgICBpZiAodmFsICE9IG51bGwpCi0gICAgICAgewotICAgICAgICB2YWwudmFsaWRhdGUoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0vLyAgICAgIGVsc2UKLS8vICAgICAgIHsKLS8vICAgICAgICB2YWxJbmZvLmFkZE5hbWVzcGFjZVdpdGhOb1ZhbGlkYXRvcihuYW1lc3BhY2UpOwotLy8gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoZSByZXNvdXJjZWJ1bmRsZSBoYXNuJ3QgYmVlbiBzZXQsIHNldCBpdCB0byB0aGUgb25lIHJlZ2lzdGVyZWQgd2l0aCB0aGUgVmFsaWRhdG9yQ29udHJvbGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciB0byBnZXQgdGhlIHJlc291cmNlIGJ1bmRsZSBmcm9tLgotICAgKi8KLSAgLy8gIHByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZXNvdXJjZUJ1bmRsZUlmTmVlZGVkKFdTREwxMVZhbGlkYXRvckNvbnRyb2xsZXIgdmFsaWRhdG9yY29udHJvbGxlcikKLSAgLy8gIHsKLSAgLy8gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLSAgLy8gICAgewotICAvLyAgICAgIHNldFJlc291cmNlQnVuZGxlKHZhbGlkYXRvcmNvbnRyb2xsZXIuZ2V0UmVzb3VyY2VCdW5kbGUoKSk7Ci0gIC8vICAgIH0KLSAgLy8gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSByZXNvdXJjZWJ1bmRsZSB0byB0aGUgb25lIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSByYiBUaGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNldC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCB0aGUgVHlwZXMgZWxlbWVudCBpcyBjb3JyZWN0LiAKLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmcm9tIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICAgKi8KLQotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVR5cGVzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSB3c2RsRGVmaW5pdGlvbi5nZXRUeXBlcygpOwotICAgIC8vIGVuc3VyZSB0aGF0IHR5cGVzIGlzIGRlZmluZWQKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBMaXN0IHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBwYXJlbnRzLmFkZCh3c2RsRGVmaW5pdGlvbik7Ci0gICAgICBPYmplY3QgZXh0ZW5zaWJsZUVsZW1lbnRzW10gPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS50b0FycmF5KCk7Ci0gICAgICBwYXJlbnRzLmFkZCgwLCB0eXBlcyk7Ci0gICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIGFsbCBvZiB0aGUgZGVjbGFyZWQgc2VydmljZXMgZm9yIHRoZSBkZWZpbml0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNlcnZpY2VzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgaWYgKHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2VzKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBPYmplY3Qgc2VydmljZXNbXSA9IHdzZGxEZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkudG9BcnJheSgpOwotICAgIExpc3QgcGFyZW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwYXJlbnRzLmFkZCh3c2RsRGVmaW5pdGlvbik7Ci0gICAgSGFzaHRhYmxlIGFsbFBvcnRzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgLy9UT0RPOiBjaGVjayB0aGF0IHBvcnRzIGluIG90aGVyIGltcG9ydGVkIGZpbGVzIGRvbid0IGNvbmZsaWN0IHdpdGggcG9ydHMgaW4gdGhpcyBvbmUKLSAgICAvLyAgICAvLyByZWdpc3RlciBhbGwgb2YgdGhlIGltcG9ydGVkIHBvcnRzCi0gICAgLy8gICAgSXRlcmF0b3IgaW1wb3J0cyA9IHdzZGxEZWZpbml0aW9uLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIC8vICAgIHdoaWxlKGltcG9ydHMuaGFzTmV4dCgpKQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgIEl0ZXJhdG9yIGltcHNlcnZpY2VzID0gKChJbXBvcnQpaW1wb3J0cy5uZXh0KCkpLmdldERlZmluaXRpb24oKS5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gICAgICB3aGlsZShpbXBzZXJ2aWNlcy5oYXNOZXh0KCkpCi0gICAgLy8gICAgICB7Ci0gICAgLy8gICAgICAgIEl0ZXJhdG9yIGltcHBvcnRzID0gKChTZXJ2aWNlKWltcHNlcnZpY2VzLm5leHQoKSkuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIC8vICAgICAgICB3aGlsZShpbXBwb3J0cy5oYXNOZXh0KCkpCi0gICAgLy8gICAgICAgIHsKLSAgICAvLyAgICAgICAgICBQb3J0IHRlbXBQID0gKFBvcnQpaW1wcG9ydHMubmV4dCgpOwotICAgIC8vICAgICAgICAgIGFsbFBvcnRzLnB1dCh0ZW1wUC5nZXROYW1lKCksdGVtcFApOwkKLSAgICAvLyAgICAgICAgfQotICAgIC8vICAgICAgfQotICAgIC8vICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFNlcnZpY2UgcyA9IChTZXJ2aWNlKXNlcnZpY2VzW2ldOwotICAgICAgcGFyZW50cy5hZGQoMCwgcyk7Ci0gICAgICBPYmplY3QgcG9ydHNbXSA9IHMuZ2V0UG9ydHMoKS52YWx1ZXMoKS50b0FycmF5KCk7Ci0gICAgICBIYXNoU2V0IHBvcnRJbnB1dHMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgSGFzaFNldCBwb3J0T3V0cHV0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IHBvcnRzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBQb3J0IHAgPSAoUG9ydClwb3J0c1tqXTsKLSAgICAgICAgcGFyZW50cy5hZGQoMCwgcCk7Ci0gICAgICAgIC8vIGEgUG9ydCBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgZW50aXJlIFdEU0wgZG9jdW1lbnQKLSAgICAgICAgaWYgKGFsbFBvcnRzLmNvbnRhaW5zKHAuZ2V0TmFtZSgpKSkKLSAgICAgICAgeyAgU3RyaW5nW10gYXJncyA9IHtwLmdldE5hbWUoKX07Ci0gICAgICAgICAgCi0gICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfUE9SVF9OQU1FX05PVF9VTklRVUUsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBfUE9SVF9OQU1FX05PVF9VTklRVUUsIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFsbFBvcnRzLnB1dChwLmdldE5hbWUoKSwgcCk7Ci0KLSAgICAgICAgICAvLyBnZXQgdGhlIGJpbmRpbmcgZm9yIHRoaXMgcG9ydCBhbmQgc2VlIGlmIHRoZSBQb3J0VHlwZSBmb3IgdGhlIGJpbmRpbmcKLSAgICAgICAgICAvLyBpcyBkZWZpbmVkCi0gICAgICAgICAgaWYgKHAuZ2V0QmluZGluZygpID09IG51bGwgfHwgcC5nZXRCaW5kaW5nKCkuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ05hbWUgPSBFTVBUWV9TVFJJTkc7Ci0gICAgICAgICAgICBpZiAocC5nZXRCaW5kaW5nKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmluZGluZ05hbWUgPSBwLmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGFyZ3NbXSA9IHtwLmdldE5hbWUoKX07Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTk9fQklORElOR19GT1JfUE9SVCwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUsIFFVT1RFICsgYmluZGluZ05hbWUgKyBRVU9URSksCi0gICAgICAgICAgICAgIHAsIF9OT19CSU5ESU5HX0ZPUl9QT1JULCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRoYXQgdGhlIG91dHB1dCBvZiBvbmUgcG9ydCBpc24ndCB0aGUgaW5wdXQgb2YgYW5vdGhlciBhbmQgdmljZSB2ZXJzYQotICAgICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGUgcG9ydAotICAgICAgICAgICAgLy8gdGhlcmUgY2FuIG9ubHkgYmUgb25lIGFuZCBtdXN0IGJlIG9uZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgZGVmaW5lZCBmb3IgYSBwb3J0Ci0gICAgICAgICAgICBMaXN0IGV4dGVsZW1zID0gcC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAgIGlmIChleHRlbGVtcy5zaXplKCkgPCAxKQotICAgICAgICAgICAgeyBTdHJpbmcgYXJnc1tdPSB7cC5nZXROYW1lKCl9OwotICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9OT19BRERSRVNTX1BPUlQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgIHAsIF9OT19BRERSRVNTX1BPUlQsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZWxlbXMuc2l6ZSgpID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDE7IGsgPCBleHRlbGVtcy5zaXplKCk7IGsrKykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7cC5nZXROYW1lKCl9OwotICAgICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTU9SRV9USEVOX09ORV9BRERSRVNTX1BPUlQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgIGV4dGVsZW1zLmdldChrKSwgX01PUkVfVEhFTl9PTkVfQUREUkVTU19QT1JULCBhcmdzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgcC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICB9Ci0gICAgICAvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciB0aGUgc2VydmljZQotICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIGJpbmRpbmdzIHJlZmVyIHRvIHZhbGlkIFBvcnRUeXBlcyBhbmQgYWxsIG9mIHRoZSBvcGVyYXRpb25zCi0gIC8vIGluIGEgZ2l2ZW4gYmluZGluZyByZWZlciB0byBhIGRlZmluZWQgb3BlcmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZwotICAvLyBQb3J0VHlwZS4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCaW5kaW5ncyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIGlmICh3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgT2JqZWN0IGJpbmRpbmdzW10gPSB3c2RsRGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpLnZhbHVlcygpLnRvQXJyYXkoKTsKLSAgICBMaXN0IHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcGFyZW50cy5hZGQod3NkbERlZmluaXRpb24pOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgQmluZGluZyBiID0gKEJpbmRpbmcpYmluZGluZ3NbaV07Ci0gICAgICBwYXJlbnRzLmFkZCgwLCBiKTsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYi5nZXRQb3J0VHlwZSgpOwotCi0gICAgICBpZiAocG9ydFR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAvLyB0aGUgUG9ydFR5cGUgaXMgbm90IGRlZmluZWQgc28gZG9uJ3QgYm90aGVyIGNoZWNraW5nIHRoZSBvcGVyYXRpb25zCi0gICAgICBpZiAocG9ydFR5cGUuaXNVbmRlZmluZWQoKSkKLSAgICAgIHsgU3RyaW5nW10gYXJncyA9IHtwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCBiLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCl9OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORywKLSAgICAgICAgICAgIFFVT1RFICsgYXJnc1swXSArIFFVT1RFLAotICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzFdICsgUVVPVEUpLAotICAgICAgICAgIGIsIF9QT1JUVFlQRV9VTkRFRklORURfRk9SX0JJTkRJTkcsIGFyZ3MpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyB0aGUgUG9ydFR5cGUgaXMgZGVmaW5lZCBzbyBub3cgd2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBvcGVyYXRpb25zIGFyZSBkZWZpbmVkCi0gICAgICAgIE9iamVjdCBiaW5kaW5nT3BlcmF0aW9uc1tdID0gYi5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLnRvQXJyYXkoKTsKLQotICAgICAgICAvLyBjaGVjayBpZiB0aGUgb3BlcmF0aW9uIGlzIGRlZmluZWQgZm9yIGVhY2ggQmluZGluZ09wZXJhdGlvbgotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGJpbmRpbmdPcGVyYXRpb25zLmxlbmd0aDsgaysrKQotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBibyA9IChCaW5kaW5nT3BlcmF0aW9uKWJpbmRpbmdPcGVyYXRpb25zW2tdOwotICAgICAgICAgIHBhcmVudHMuYWRkKDAsIGJvKTsKLSAgICAgICAgICBpZiAoYm8uZ2V0T3BlcmF0aW9uKCkgPT0gbnVsbCB8fCBiby5nZXRPcGVyYXRpb24oKS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7Yi5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpLCBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpfTsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgIF9PUEVSQVRJT05fVU5ERUZJTkVEX0ZPUl9QT1JUVFlQRSwKLSAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSwKLSAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMV0gKyBRVU9URSksCi0gICAgICAgICAgICAgIGJvLCBfT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUsIGFyZ3MpOwotICAgICAgICAgICAgLy8gbmljZSBpZGVhIHRvIGFkZCBzdWdnZXN0aW9ucyB0byBvdGhlciBlbGVtZW50cyB0byBmaXggdGhlIGVycm9yCi0gICAgICAgICAgICAvLyBidXQgaXQgZG9lc24ndCB3b3JrIHdpdGggbXVsdGlwZSBmaWxlcyBsaWtlIHRoaXMKLSAgICAgICAgICAgIC8vYWRkVmFsaWRhdGlvbk1lc3NhZ2Uod2FybmluZ0xpc3QscG9ydFR5cGUscG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICJEZWZpbmUgYW4gb3BlcmF0aW9uIGhlcmUgdG8gY29ycmVzcG9uZCB3aXRoIHRoZSBvcGVyYXRpb24gaW46ICIgKyBiby5nZXROYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyB0YWtlIGNhcmUgb2YgYWxsIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiwgYmluZGluZyBpbnB1dHMsIG91dHB1dHMgYW5kIGZhdWx0cwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBCaW5kaW5nSW5wdXQgYmlucHV0ID0gYm8uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgICAgICBpZiAoYmlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBhcmVudHMuYWRkKDAsIGJpbnB1dCk7Ci0gICAgICAgICAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIGJpbmRpbmcgb3BlcmF0aW9uIGlucHV0Ci0gICAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KAotICAgICAgICAgICAgICAgIHBhcmVudHMsCi0gICAgICAgICAgICAgICAgYm8uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgdmFsSW5mbyk7Ci0gICAgICAgICAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQmluZGluZ091dHB1dCBib3V0cHV0ID0gYm8uZ2V0QmluZGluZ091dHB1dCgpOwotICAgICAgICAgICAgaWYgKGJvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFyZW50cy5hZGQoMCwgYm91dHB1dCk7Ci0gICAgICAgICAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIGJpbmRpbmcgb3BlcmF0aW9uIG91dHB1dAotICAgICAgICAgICAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdCgKLSAgICAgICAgICAgICAgICBwYXJlbnRzLAotICAgICAgICAgICAgICAgIGJvLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICB2YWxJbmZvKTsKLSAgICAgICAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBubyBpbnB1dCBvciBvdXRwdXQgaGFzIGJlZW4gZGVmaW5lZCBmb3IgdGhlIG9wZXJhdGlvbgotICAgICAgICAgICAgaWYgKGJpbnB1dCA9PSBudWxsICYmIGJvdXRwdXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsgU3RyaW5nW10gYXJncyA9IHsgYm8uZ2V0TmFtZSgpIH07Ci0gICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICBibywgX09QRVJBVElPTl9OT19JTlBVVF9PUl9PVVRQVVQsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyBmb3IgZWFjaCBiaW5kaW5nIG9wZXJhdGlvbiBmYXVsdAotICAgICAgICAgICAgSXRlcmF0b3IgZmF1bHRzID0gYm8uZ2V0QmluZGluZ0ZhdWx0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZmF1bHRzLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQmluZGluZ0ZhdWx0IGJmID0gKEJpbmRpbmdGYXVsdClmYXVsdHMubmV4dCgpOwotICAgICAgICAgICAgICBwYXJlbnRzLmFkZCgwLCBiZik7Ci0gICAgICAgICAgICAgIHZhbGlkYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRMaXN0KHBhcmVudHMsIGJmLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB2YWxJbmZvKTsKLSAgICAgICAgICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIGJpbmRpbmcgb3BlcmF0aW9uCi0gICAgICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgYm8uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHZhbEluZm8pOwotICAgICAgICAgIHBhcmVudHMucmVtb3ZlKDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciB0aGUgYmluZGluZwotICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgYi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7Ci0gICAgICBwYXJlbnRzLnJlbW92ZSgwKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB0aGF0IGFsbCBvZiB0aGUgUG9ydFR5cGVzIGhhdmUgdmFsaWQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZWlyCi0gIC8vIG9wZXJhdGlvbiBpbnB1dCwgb3V0cHV0IGFuZCBmYXVsdCB0eXBlcy4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQb3J0VHlwZXMoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBpZiAod3NkbERlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBPYmplY3QgcG9ydHR5cGVzW10gPSB3c2RsRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKS52YWx1ZXMoKS50b0FycmF5KCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvcnR0eXBlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwID0gKFBvcnRUeXBlKXBvcnR0eXBlc1tpXTsKLSAgICAgIE9iamVjdCBvcGVyYXRpb25zW10gPSBwLmdldE9wZXJhdGlvbnMoKS50b0FycmF5KCk7Ci0gICAgICBMaXN0IGluQW5kT3V0TmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9wZXJhdGlvbnMubGVuZ3RoOyBqKyspCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBvID0gKE9wZXJhdGlvbilvcGVyYXRpb25zW2pdOwotICAgICAgICBpZiAobyA9PSBudWxsIHx8IG8uaXNVbmRlZmluZWQoKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbWVzc2FnZXMgYXJlIGRlZmluZWQgZm9yIHRoZSBpbnB1dCwgb3V0cHV0IGFuZCBmYXVsdHMKLSAgICAgICAgTWVzc2FnZSBtOwotICAgICAgICBJbnB1dCBpbnB1dCA9IG8uZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgaW5wdXROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotICAgICAgICAgIC8vIGlmIHRoZSBuYW1lIGlzbid0IGRlZmluZWQgaXQgZGVmYXVsdHMgdG8gdGhpcwotICAgICAgICAgIGlmIChpbnB1dE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dE5hbWUgPSBvLmdldE5hbWUoKSArIFJFUVVFU1Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpbkFuZE91dE5hbWVzLmNvbnRhaW5zKGlucHV0TmFtZSkpCi0gICAgICAgICAgeyBTdHJpbmdbXSBhcmdzID0ge2lucHV0TmFtZSwgcC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpIH07Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICBfSU5QVVRfTkFNRV9OT1RfVU5JUVVFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1swXSArIFFVT1RFLAotICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1sxXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgaW5wdXQsIF9JTlBVVF9OQU1FX05PVF9VTklRVUUsIGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5BbmRPdXROYW1lcy5hZGQoaW5wdXROYW1lKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtID0gaW5wdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzTmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIFFOYW1lIG1lc3NRTmFtZSA9IG0uZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChtZXNzUU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzc05hbWUgPSBtZXNzUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0ge21lc3NOYW1lfTsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9JTlBVVCwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgIGlucHV0LCBfTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVULCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgT3V0cHV0IG91dHB1dCA9IG8uZ2V0T3V0cHV0KCk7Ci0gICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAvLyBpZiB0aGUgbmFtZSBpc24ndCBkZWZpbmVkIGl0IGRlZmF1bHRzIHRvIHRoaXMKLSAgICAgICAgICBpZiAob3V0cHV0TmFtZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dE5hbWUgPSBvLmdldE5hbWUoKSArIFJFU1BPTlNFOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChpbkFuZE91dE5hbWVzLmNvbnRhaW5zKG91dHB1dE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7b3V0cHV0TmFtZSwgcC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpfTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgX09VVFBVVF9OQU1FX05PVF9VTklRVUUsCi0gICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUsCi0gICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzFdICsgUVVPVEUpLAotICAgICAgICAgICAgICBvdXRwdXQsIF9PVVRQVVRfTkFNRV9OT1RfVU5JUVVFLCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGluQW5kT3V0TmFtZXMuYWRkKG91dHB1dE5hbWUpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG0gPSBvdXRwdXQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzTmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICAgICAgICAgIFFOYW1lIG1lc3NRTmFtZSA9IG0uZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGlmIChtZXNzUU5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzc05hbWUgPSBtZXNzUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0ge21lc3NOYW1lfTsKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9PVVRQVVQsIFFVT1RFICsgYXJnc1swXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICBvdXRwdXQsIF9NRVNTQUdFX1VOREVGSU5FRF9GT1JfT1VUUFVULCBhcmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBPYmplY3QgZmF1bHRzW10gPSBvLmdldEZhdWx0cygpLnZhbHVlcygpLnRvQXJyYXkoKTsKLQotICAgICAgICAvL0xpc3QgZmF1bHROYW1lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBmYXVsdHMubGVuZ3RoOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICBGYXVsdCBmID0gKEZhdWx0KWZhdWx0c1trXTsKLSAgICAgICAgICBtID0gZi5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NOYW1lID0gRU1QVFlfU1RSSU5HOwotICAgICAgICAgICAgUU5hbWUgbWVzc1FOYW1lID0gbS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgaWYgKG1lc3NRTmFtZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtZXNzTmFtZSA9IG1lc3NRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBhcmdzW10gPSB7bWVzc05hbWV9OwotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfTUVTU0FHRV9VTkRFRklORURfRk9SX0ZBVUxULCBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSksCi0gICAgICAgICAgICAgICAgZiwgX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCwgYXJncyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgYWxsIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50IGFyZSB2YWxpZC4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXNzYWdlcyhEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIGlmICh3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgSXRlcmF0b3IgbWVzc2FnZXMgPSB3c2RsRGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICB3aGlsZSAobWVzc2FnZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbSA9IChNZXNzYWdlKW1lc3NhZ2VzLm5leHQoKTsKLSAgICAgIGlmICghbS5pc1VuZGVmaW5lZCgpKQotICAgICAgewotICAgICAgICAvLyBpZiB0aGUgbWVzc2FnZSBoYXMgYSBwYXJ0IChhbmQgaXQgZG9lc24ndCBoYXZlIHRvKQotICAgICAgICAvLyBlbnN1cmUgZWFjaCBtZXNzYWdlIHBhcnQgaGFzIGVpdGhlciBhbiBlbGVtZW50IG9yIGEgdHlwZQotICAgICAgICBpZiAoIW0uZ2V0UGFydHMoKS5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBwYXJ0cyA9IG0uZ2V0UGFydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgUGFydCBwID0gKFBhcnQpcGFydHMubmV4dCgpOwotICAgICAgICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPSBwLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICBRTmFtZSB0eXBlTmFtZSA9IHAuZ2V0VHlwZU5hbWUoKTsKLSAgICAgICAgICAgIE1hcCBleHRBdHRzID0gcC5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAvLyBUT0RPOlRoaXMgd2lsbCBoYXZlIHRvIGJlIGV4dGVuZGVkIGFzIHBhcnRzIGNhbiBoYXZlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgICAgICAgIC8vZW5zdXJlIHRoZSBwYXJ0IGhhcyBhIHR5cGUgb3IgYW4gZWxlbWVudCBkZWZpbmVkCi0gICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUgPT0gbnVsbCAmJiB0eXBlTmFtZSA9PSBudWxsICYmIChleHRBdHRzID09IG51bGwgfHwgZXh0QXR0cy5pc0VtcHR5KCkpKQotICAgICAgICAgICAgeyBTdHJpbmdbXSBhcmdzID0geyBwLmdldE5hbWUoKX07Ci0gICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1BBUlRfTk9fRUxFTUVOVF9PUl9UWVBFLCBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSksCi0gICAgICAgICAgICAgICAgICBwLCBfUEFSVF9OT19FTEVNRU5UX09SX1RZUEUsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9oZXJlIHRoZSBwYXJ0IGhhcyBib3RoIHRoZSBlbGVtZW50IGFuZCB0eXBlIGRlZmluZWQgYW5kIGl0IGNhbiBvbmx5IGhhdmUgb25lIGRlZmluZWQJCi0gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50TmFtZSAhPSBudWxsICYmIHR5cGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7IFN0cmluZ1tdIGFyZ3MgPSB7cC5nZXROYW1lKCl9OwotICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9QQVJUX0JPVEhfRUxFTUVOVF9BTkRfVFlQRSwgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgcCwgX1BBUlRfQk9USF9FTEVNRU5UX0FORF9UWVBFLCBhcmdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghY2hlY2tQYXJ0Q29uc3RpdHVlbnQoZWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgZWxlbWVudE5hbWUuZ2V0TG9jYWxQYXJ0KCksCi0gICAgICAgICAgICAgICAgRUxFTUVOVCwKLSAgICAgICAgICAgICAgICBwLAotICAgICAgICAgICAgICAgIHZhbEluZm8pKQotICAgICAgICAgICAgICB7IFN0cmluZ1tdIGFyZ3MgPSB7cC5nZXROYW1lKCksIGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpfTsKLSAgICAgICAgICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIF9QQVJUX0lOVkFMSURfRUxFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzBdICsgUVVPVEUsCi0gICAgICAgICAgICAgICAgICAgIFFVT1RFICsgYXJnc1sxXSArIFFVT1RFKSwKLSAgICAgICAgICAgICAgICAgIHAsIF9QQVJUX0lOVkFMSURfRUxFTUVOVCwgYXJncyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIHR5cGUgaXRzZWxmIGlzIGRlZmluZWQgcHJvcGVybHkKLSAgICAgICAgICAgICAgaWYgKCFjaGVja1BhcnRDb25zdGl0dWVudCh0eXBlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgdHlwZU5hbWUuZ2V0TG9jYWxQYXJ0KCksIFRZUEUsIHAsIHZhbEluZm8pKQotICAgICAgICAgICAgICB7IFN0cmluZ1tdIGFyZ3MgPSB7cC5nZXROYW1lKCksIHR5cGVOYW1lLmdldExvY2FsUGFydCgpIH07IAotICAgICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgX1BBUlRfSU5WQUxJRF9UWVBFLAotICAgICAgICAgICAgICAgICAgICBRVU9URSArIGFyZ3NbMF0gKyBRVU9URSwKLSAgICAgICAgICAgICAgICAgICAgUVVPVEUgKyBhcmdzWzFdICsgUVVPVEUpLAotICAgICAgICAgICAgICAgICAgcCwgX1BBUlRfSU5WQUxJRF9UWVBFLCBhcmdzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBpcyBkZWZpbmVkIGluIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBwYXJ0LiAgQSBwYXJ0IGlzIGFuCi0gICAqIEVMRU1FTlQgb3IgYSBUWVBFLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0byBjaGVjay4KLSAgICogQHBhcmFtIHBhcnQgVGhlIHBhcnQgdG8gY2hlY2ssIGVpdGhlciBFTEVNRU5UIG9yIFRZUEUuCi0gICAqIEBwYXJhbSBwYXJ0T2JqZWN0IFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBwYXJ0LgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBhcnQgZWxlbWVudCBvZiB0eXBlIGlzIGRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrUGFydENvbnN0aXR1ZW50KAotICAgIFN0cmluZyBuYW1lc3BhY2UsCi0gICAgU3RyaW5nIG5hbWUsCi0gICAgaW50IHBhcnQsCi0gICAgUGFydCBwYXJ0T2JqZWN0LAotICAgIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0KLSAgICBib29sZWFuIHBhcnR2YWxpZCA9IGZhbHNlOwotICAgIC8vIEZpcnN0IHRha2UgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlIGl0J3MgZnJvbSB0aGUgc2NoZW1hIG5hbWVzcGFjZS4KLSAgICAvLyBUaGUgMTk5OSwgMjAwMCBhbmQgMjAwMSBzY2hlbWEgbmFtZXNwYWNlcyBhcmUgYWxsIGFjY2VwdGVkLgotICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEpCi0gICAgICB8fCBuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpCi0gICAgICB8fCBuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotICAgIHsKLSAgICAgIFNjaGVtYUF0dHJpYnV0ZVRhYmxlIHhzZFRhYmxlID0gbmV3IFNjaGVtYUF0dHJpYnV0ZVRhYmxlKCk7Ci0gICAgICBpZiAoeHNkVGFibGUuY29udGFpbnNTeW1ib2wobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHBhcnR2YWxpZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGNoZWNrIGlubGluZSBhbmQgaW1wb3J0ZWQgc2NoZW1hCi0gICAgZWxzZQotICAgIHsKLSAgICAgIFhTTW9kZWxbXSBzY2hlbWFzID0gdmFsSW5mby5nZXRTY2hlbWFzKCk7Ci0gICAgICBpbnQgbnVtU2NoZW1hcyA9IHNjaGVtYXMubGVuZ3RoOwotICAgICAgLy9JdGVyYXRvciBzY2hlbWFzSXRlciA9IHNjaGVtYXMuaXRlcmF0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2NoZW1hczsgaSsrKQotICAgICAgewotICAgICAgICBYU01vZGVsIHNjaGVtYSA9IHNjaGVtYXNbaV07Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChwYXJ0ID09IEVMRU1FTlQgJiYgc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbihuYW1lLCBuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChwYXJ0ID09IFRZUEUgJiYgc2NoZW1hLmdldFR5cGVEZWZpbml0aW9uKG5hbWUsIG5hbWVzcGFjZSkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIElmIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IGltcG9ydGVkIGRvIHNvCi0JLy8gbm93LgotICAgIC8vIEFsbG93IHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSB0byBiZSBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIGJ1dCBtYXJrCi0JLy8gaXQgYXMgYSB3YXJuaW5nLgotICAgIGlmICghcGFydHZhbGlkICYmIG5hbWVzcGFjZS5lcXVhbHMoU09BUF9FTkNPRElOR19VUkkpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBYU0RWYWxpZGF0b3IgeHNkVmFsID0gbmV3IFhTRFZhbGlkYXRvcigpOwotICAgICAgICBTdHJpbmcgc29hcEVuYyA9IHZhbEluZm8uZ2V0VVJJUmVzb2x2ZXIoKS5yZXNvbHZlKG51bGwsIFNPQVBfRU5DT0RJTkdfVVJJLCBudWxsKTsKLSAgICAgICAgaWYoc29hcEVuYyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgeHNkVmFsLnZhbGlkYXRlKHNvYXBFbmMsIG51bGwpOwotICAgICAgICAgIC8vIHNhbml0eSBjaGVjayBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nCi0gICAgICAgICAgaWYgKHhzZFZhbC5pc1ZhbGlkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNNb2RlbCB4c01vZGVsID0geHNkVmFsLmdldFhTTW9kZWwoKTsKLQotICAgICAgICAgICAgaWYgKHBhcnQgPT0gRUxFTUVOVCAmJiB4c01vZGVsLmdldEVsZW1lbnREZWNsYXJhdGlvbihuYW1lLCBuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBhcnR2YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYXJ0ID09IFRZUEUgJiYgeHNNb2RlbC5nZXRUeXBlRGVmaW5pdGlvbihuYW1lLCBuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBhcnR2YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWxJbmZvLmFkZFdhcm5pbmcobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9QQVJULCBRVU9URSArIG5hbWUgKyBRVU9URSksIHBhcnRPYmplY3QpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvL1RPRE86IGxvZyB0aGUgZXJyb3IgbWVzc2FnZQotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBhcnR2YWxpZDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0aW9uSW5mb0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRpb25JbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTM3NzliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMVZhbGlkYXRpb25JbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uSW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gaW1wbGVtZW5hdGlvbiBvZiBXU0RMMTFWYWxpZGF0aW9uSW5mby4KLSAqLwotcHVibGljIGNsYXNzIFdTREwxMVZhbGlkYXRpb25JbmZvSW1wbCBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0aW9uSW5mbwotewotICBwcml2YXRlIElWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbnVsbDsKLSAgcHJpdmF0ZSBIYXNodGFibGUgZWxlbWVudGxvY2F0aW9ucyA9IG51bGw7Ci0gIHByaXZhdGUgTGlzdCBzY2hlbWFzID0gbmV3IFZlY3RvcigpOwotICAKLSAgcHVibGljIFdTREwxMVZhbGlkYXRpb25JbmZvSW1wbChJVmFsaWRhdGlvbkluZm8gdmFsaW5mbykKLSAgewotICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gIH0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvI2dldEZpbGVVUkkoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCkKLSAgewotICAgIHJldHVybiB2YWxpbmZvLmdldEZpbGVVUkkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRTY2hlbWEob3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShYU01vZGVsIHhzTW9kZWwpCi0gIHsKLSAgICBpZiAoeHNNb2RlbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHNjaGVtYXMuYWRkKHhzTW9kZWwpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvI2dldFNjaGVtYXMoKQotICAgKi8KLSAgcHVibGljIFhTTW9kZWxbXSBnZXRTY2hlbWFzKCkKLSAgewotICAgIHJldHVybiAoWFNNb2RlbFtdKXNjaGVtYXMudG9BcnJheShuZXcgWFNNb2RlbFtzY2hlbWFzLnNpemUoKV0pOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvI2NsZWFyZFNjaGVtYXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXJTY2hlbWFzKCkKLSAgewotICAgIHNjaGVtYXMuY2xlYXIoKTsKLSAgfQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jc2V0RWxlbWVudExvY2F0aW9ucyhqYXZhLnV0aWwuSGFzaHRhYmxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudExvY2F0aW9ucyhIYXNodGFibGUgZWxlbWVudExvY2F0aW9ucykKLSAgewotICAgIHRoaXMuZWxlbWVudGxvY2F0aW9ucyA9IGVsZW1lbnRMb2NhdGlvbnM7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jYWRkRXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZWxlbWVudCkKLSAgewotICAgIGFkZEVycm9yKG1lc3NhZ2UsIGVsZW1lbnQsIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jYWRkRXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBlbGVtZW50LCBTdHJpbmcgZXJyb3JLZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsKLSAgICBMb2NhdGlvbkhvbGRlciBsb2NhdGlvbjsKLSAgICBpZiAoZWxlbWVudGxvY2F0aW9ucy5jb250YWluc0tleShlbGVtZW50KSkKLSAgICB7Ci0gICAgICBsb2NhdGlvbiA9IChMb2NhdGlvbkhvbGRlcillbGVtZW50bG9jYXRpb25zLmdldChlbGVtZW50KTsKLSAgICAgIGFkZEVycm9yKG1lc3NhZ2UsIGxvY2F0aW9uLmdldExpbmUoKSwgbG9jYXRpb24uZ2V0Q29sdW1uKCksIGxvY2F0aW9uLmdldFVSSSgpLCBlcnJvcktleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgfQotICAgIC8vIGlmIHdlIGdpdmUgaXQgYW4gZWxlbWVudCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQgd2UnbGwgc2V0IHRoZSBsb2NhdGlvbgotICAgIC8vIGF0ICgwLDApIHNvIHRoZSBlcnJvciBzaG93cyB1cCBidXQgbm8gbGluZSBtYXJrZXIgaW4gdGhlIGVkaXRvcgotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhZGRFcnJvcihtZXNzYWdlLCAwLCAxLCBnZXRGaWxlVVJJKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRXYXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgZWxlbWVudCkKLSAgewotICAgIExvY2F0aW9uSG9sZGVyIGxvY2F0aW9uOwotICAgIGlmIChlbGVtZW50bG9jYXRpb25zLmNvbnRhaW5zS2V5KGVsZW1lbnQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gKExvY2F0aW9uSG9sZGVyKWVsZW1lbnRsb2NhdGlvbnMuZ2V0KGVsZW1lbnQpOwotICAgICAgYWRkV2FybmluZyhtZXNzYWdlLCBsb2NhdGlvbi5nZXRMaW5lKCksIGxvY2F0aW9uLmdldENvbHVtbigpLCBsb2NhdGlvbi5nZXRVUkkoKSk7Ci0gICAgfQotICAgIC8vIGlmIHdlIGdpdmUgaXQgYW4gZWxlbWVudCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQgd2UnbGwgc2V0IHRoZSBsb2NhdGlvbgotICAgIC8vIGF0ICgwLDApIHNvIHRoZSBlcnJvciBzaG93cyB1cCBidXQgbm8gbGluZSBtYXJrZXIgaW4gdGhlIGVkaXRvcgotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhZGRXYXJuaW5nKG1lc3NhZ2UsIDAsIDEsIGdldEZpbGVVUkkoKSk7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlV2l0aE5vVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UpCi0vLyAgewotLy8gICAgdmFsaW5mby5hZGROYW1lc3BhY2VXaXRoTm9WYWxpZGF0b3IobmFtZXNwYWNlKTsKLS8vCi0vLyAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbyNhZGRFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBudWxsLCBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICB7IAotICAgIHRyeQotICAgIHsgKChWYWxpZGF0aW9uSW5mb0ltcGwpdmFsaW5mbykuYWRkRXJyb3IobWVzc2FnZSwgbGluZSwgY29sdW1uLCB1cmksIGVycm9yS2V5LCBtZXNzYWdlQXJndW1lbnRzKTsKLSAgICB9Ci0gICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKQotICAgIHsgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgdmFsaW5mby5hZGRFcnJvcihtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8jYWRkV2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGludCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgdmFsaW5mby5hZGRXYXJuaW5nKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5XU0RMMTFWYWxpZGF0aW9uSW5mbyNnZXRVUklSZXNvbHZlcigpCi0gICAqLwotICBwdWJsaWMgSVVSSVJlc29sdmVyIGdldFVSSVJlc29sdmVyKCkgCi0gIHsKLQlyZXR1cm4gdmFsaW5mby5nZXRVUklSZXNvbHZlcigpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNDZlODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExVmFsaWRhdG9yQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVdTRExWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24uVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaXMgdGhlIGhlYWQgb2YgdmFsaWRhdGlvbi4gCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMTFWYWxpZGF0b3JDb250cm9sbGVyIGltcGxlbWVudHMgSVdTRExWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfV0FSTl9OT19WQUxESUFUT1IgPSAiX1dBUk5fTk9fVkFMRElBVE9SIjsKLS8vICBwcm90ZWN0ZWQgZmluYWwgaW50IEVSUk9SX01FU1NBR0UgPSAwOwotLy8gIHByb3RlY3RlZCBmaW5hbCBpbnQgV0FSTklOR19NRVNTQUdFID0gMTsKLS8vICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGVVUkk7Ci0vLyAgcHJvdGVjdGVkIExpc3Qgc2NoZW1hcyA9IG5ldyBWZWN0b3IoKTsKLS8vICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbjsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciA9IG51bGw7Ci0gIC8vcHJvdGVjdGVkIFZhbGlkYXRpb25Db250cm9sbGVyIHZhbGlkYXRpb25Db250cm9sbGVyOwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkgdmVyID0gVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETDExVmFsaWRhdG9yQ29udHJvbGxlcigpCi0gIHsKLSAgfQotCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuSVdTRExWYWxpZGF0b3IjdmFsaWRhdGUob3JnLnczYy5kb20uRG9jdW1lbnQsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShEb2N1bWVudCBkb21Nb2RlbCwgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8pIHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgewotICAgIC8vIHJlc2V0IHRoZSB2YXJpYWJsZXMKLS8vICAgIHJlc2V0KCk7Ci0vLyAgICBmaWxlVVJJID0gdmFsSW5mby5nZXRGaWxlVVJJKCk7Ci0gICAgLy90aGlzLnZhbGlkYXRpb25Db250cm9sbGVyID0gdmFsaWRhdGlvbmNvbnRyb2xsZXI7Ci0KLSAgICBJV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm8gPSBuZXcgV1NETDExVmFsaWRhdGlvbkluZm9JbXBsKHZhbEluZm8pOwotICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gcmVhZFdTRExEb2N1bWVudChkb21Nb2RlbCwgdmFsSW5mby5nZXRGaWxlVVJJKCksIGdldE1lc3NhZ2VHZW5lcmF0b3IoKSwgd3NkbHZhbGluZm8pOwotICAgIC8vIERvbid0IHZhbGlkYXRlIGFuIG51bGwgZGVmaW5pdGlvbnMgZWxlbWVudC4gRWl0aGVyIHRoZSBmaWxlIGlzIGVtdHB5IGFuZCB2YWxpZCBvcgotICAgIC8vIGhhZCBhbiBlcnJvciB3aGVuIHJlYWRpbmcuCi0gICAgaWYod3NkbERvY3MgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIGludCBudW1XU0RMRG9jcyA9IHdzZGxEb2NzLmxlbmd0aDsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1XU0RMRG9jczsgaSsrKQotICAgICAgewotICAgICAgICBXU0RMRG9jdW1lbnQgdGVtcERvYyA9IHdzZGxEb2NzW2ldOwotICAgICAgICBEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uID0gdGVtcERvYy5nZXREZWZpbml0aW9uKCk7Ci0gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBzY2hlbWFzLgotICAgICAgICBMaXN0IHhzZExpc3QgPSB0ZW1wRG9jLmdldFNjaGVtYXMoKTsKLSAgICAgICAgSXRlcmF0b3IgeHNkSXRlciA9IHhzZExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHhzZEl0ZXIuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbHZhbGluZm8uYWRkU2NoZW1hKChYU01vZGVsKXhzZEl0ZXIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBTZXQgdGhlIGVsZW1lbnQgbG9jYXRpb25zIHRhYmxlLgotICAgICAgICB3c2RsdmFsaW5mby5zZXRFbGVtZW50TG9jYXRpb25zKHRlbXBEb2MuZ2V0RWxlbWVudExvY2F0aW9ucygpKTsKLSAgICAgICAgLy8gU2V0IGFueSByZWFkZXIgZXJyb3JzLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYWZ0ZXIgdGhlIGVsZW1lbnQgbG9jYXRpb25zIHRhYmxlIGlzIHNldC4KLSAgICAgICAgTGlzdCByZWFkZXJFcnJvcnMgPSB0ZW1wRG9jLmdldFJlYWRlckVycm9ycygpOwotICAgICAgICBpZiAocmVhZGVyRXJyb3JzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciByZWFkZXJFcnJvcnNJID0gcmVhZGVyRXJyb3JzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKHJlYWRlckVycm9yc0kuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRlckVycm9yIHJlID0gKFJlYWRlckVycm9yKXJlYWRlckVycm9yc0kubmV4dCgpOwotICAgICAgICAgICAgd3NkbHZhbGluZm8uYWRkRXJyb3IocmUuZ2V0RXJyb3IoKSwgcmUuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBMaXN0IHJlYWRlcldhcm5pbmdzID0gdGVtcERvYy5nZXRSZWFkZXJXYXJuaW5ncygpOwotICAgICAgICBpZiAocmVhZGVyV2FybmluZ3MgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIHJlYWRlcldhcm5pbmdzSSA9IHJlYWRlcldhcm5pbmdzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKHJlYWRlcldhcm5pbmdzSS5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgUmVhZGVyRXJyb3IgcmUgPSAoUmVhZGVyRXJyb3IpcmVhZGVyV2FybmluZ3NJLm5leHQoKTsKLSAgICAgICAgICAgIHdzZGx2YWxpbmZvLmFkZFdhcm5pbmcocmUuZ2V0RXJyb3IoKSwgcmUuZ2V0T2JqZWN0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB2YWxpZGF0ZVdTRExFbGVtZW50KENvbnN0YW50cy5OU19VUklfV1NETCwgd3NkbERlZmluaXRpb24sIG5ldyBWZWN0b3IoKSwgd3NkbHZhbGluZm8pOwotICAgICAgICB3c2RsdmFsaW5mby5jbGVhclNjaGVtYXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSBhbiBpbXBvcnRlZCBXU0RMIGRvY3VtZW50LiBBbGxvd3MgdGhlIGNhbGxpbmcgY2xhc3MgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGludGVybmFsCi0gICAqIGNvbXBvbmVudHMgb2YgdGhlIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbHZhbGluZm8gVGhlIFdTREwgMS4xIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdG8gdXNlLgotICAgKiBAcmV0dXJuIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZvciB0aGUgaW1wb3J0LgotICAgKiBAdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotICAgKi8KLS8vICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiB2YWxpZGF0ZUltcG9ydChXU0RMMTFWYWxpZGF0aW9uSW5mbyB3c2RsdmFsaW5mbykKLS8vICB7Ci0vLyAgICBXU0RMRG9jdW1lbnRbXSB3c2RsRG9jcyA9IG51bGw7Ci0vLyAgICB0cnkKLS8vICAgIHsKLS8vICAgICAgd3NkbERvY3MgPSByZWFkV1NETERvY3VtZW50KG51bGwsIHdzZGx2YWxpbmZvLmdldEZpbGVVUkkoKSwgZ2V0TWVzc2FnZUdlbmVyYXRvcigpLCB3c2RsdmFsaW5mbyk7Ci0vLyAgICB9Ci0vLyAgICBjYXRjaChWYWxpZGF0ZVdTRExFeGNlcHRpb24gZSkKLS8vICAgIHsKLS8vICAgICAgLy8gc3VwcmVzcyBhbnkgdmFsaWRhdGlvbiBpc3N1ZXMgd2l0aCBpbXBvcnRlZCBkb2N1bWVudHMKLS8vICAgIH0KLS8vICAgIC8vIERvbid0IHZhbGlkYXRlIGFuIG51bGwgZGVmaW5pdGlvbnMgZWxlbWVudC4gRWl0aGVyIHRoZSBmaWxlIGlzIGVtdHB5IGFuZCB2YWxpZCBvcgotLy8gICAgLy8gaGFkIGFuIGVycm9yIHdoZW4gcmVhZGluZy4KLS8vICAgIGlmKHdzZGxEb2NzICE9IG51bGwpCi0vLyAgICAgeyAgCi0vLyAgICAgIHZhbGlkYXRlV1NETEVsZW1lbnQoQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCB3c2RsRGVmaW5pdGlvbiwgbmV3IFZlY3RvcigpLCB3c2RsdmFsaW5mbyk7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gd3NkbERlZmluaXRpb247Ci0vLyAgfQotICAKLSAgLyoqCi0gICAqIFJlYWQgaW4gdGhlIFdTREwgZG9jdW1lbnQgYW5kIHNldCB0aGUgbW9kZWwgYW5kIGltcG9ydGVkIHNjaGVtYXMuCi0gICAqIAotICAgKiBAcGFyYW0gZG9tTW9kZWwgQSBET00gbW9kZWwgb2YgdGhlIGRvY3VtZW50IHRvIGJlIHJlYWQuCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHJlYWQuCi0gICAqIEBwYXJhbSBtZXNzYWdlZ2VuZXJhdG9yIFRoZSBtZXNzYWdlZ2VuZXJhdG9yIHRoZSByZWFkZXIgc2hvdWxkIHVzZSBmb3IgYW55IG1lc3NhZ2VzIHByb2R1Y2VkLgotICAgKiBAcGFyYW0gd3NkbHZhbGluZm8gVGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqIEByZXR1cm4gVGhlIGRlZmluaXRpb25zIGVsZW1lbnQgZm9yIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExEb2N1bWVudFtdIHJlYWRXU0RMRG9jdW1lbnQoRG9jdW1lbnQgZG9tTW9kZWwsIFN0cmluZyBmaWxlLCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3IsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB3c2RsdmFsaW5mbykgdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgV1NETERvY3VtZW50W10gd3NkbERvY3MgPSBudWxsOwotICAgIHRyeQotICAgIHsKLQotICAgICAgV1NETFJlYWRlckltcGwgd3NkbFJlYWRlciA9IG5ldyBXU0RMUmVhZGVySW1wbCh3c2RsdmFsaW5mbyk7Ci0gICAgICB3c2RsUmVhZGVyLnNldE1lc3NhZ2VHZW5lcmF0b3IobWVzc2FnZWdlbmVyYXRvcik7Ci0gICAgICBpZihkb21Nb2RlbCAhPSBudWxsKQotICAgICAgewotICAgICAgICB3c2RsRG9jcyA9IHdzZGxSZWFkZXIucmVhZFdTREwoZmlsZSwgZG9tTW9kZWwpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgCi0gICAgICAgIHdzZGxEb2NzID0gd3NkbFJlYWRlci5yZWFkV1NETChmaWxlKTsKLSAgICAgIH0KLSAgICAgIC8vd3NkbHZhbGluZm8uc2V0RWxlbWVudExvY2F0aW9ucyh3c2RsUmVhZGVyLmdldEVsZW1lbnRMb2NhdGlvbnNIYXNodGFibGUoKSk7Ci0vLyAgICAgIExpc3QgcmVhZGVyRXJyb3JzID0gd3NkbFJlYWRlci5nZXRSZWFkZXJFcnJvcnMoKTsKLS8vICAgICAgaWYgKHJlYWRlckVycm9ycyAhPSBudWxsKQotLy8gICAgICAgewotLy8gICAgICAgIEl0ZXJhdG9yIHJlYWRlckVycm9yc0kgPSByZWFkZXJFcnJvcnMuaXRlcmF0b3IoKTsKLS8vICAgICAgICB3aGlsZSAocmVhZGVyRXJyb3JzSS5oYXNOZXh0KCkpCi0vLyAgICAgICAgIHsKLS8vICAgICAgICAgIFJlYWRlckVycm9yIHJlID0gKFJlYWRlckVycm9yKXJlYWRlckVycm9yc0kubmV4dCgpOwotLy8gICAgICAgICAgd3NkbHZhbGluZm8uYWRkRXJyb3IocmUuZ2V0RXJyb3IoKSwgcmUuZ2V0T2JqZWN0KCkpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBpZiAod3NkbFJlYWRlci5oYXNJbXBvcnRTY2hlbWFzKCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBMaXN0IHhzZExpc3QgPSB3c2RsUmVhZGVyLmdldEltcG9ydFNjaGVtYXMoKTsKLS8vICAgICAgICBJdGVyYXRvciB4c2RJdGVyID0geHNkTGlzdC5pdGVyYXRvcigpOwotLy8gICAgICAgIHdoaWxlICh4c2RJdGVyLmhhc05leHQoKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICB3c2RsdmFsaW5mby5hZGRTY2hlbWEoKFhTTW9kZWwpeHNkSXRlci5uZXh0KCkpOwotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgIH0KLQotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBWYWxpZGF0ZVdTRExFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkgKyAiICIgKyBlLmdldEZhdWx0Q29kZSgpKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFZhbGlkYXRlV1NETEV4Y2VwdGlvbigidW5hYmxlIHRvIHJlYWQgZmlsZSIgKyBlLmdldE1lc3NhZ2UoKSArICIgIiArIGUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiB3c2RsRG9jczsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIFdTREwgZWxlbWVudCwgY2FsbCBWYWxpZGF0ZUVsZW1lbnQgZm9yIGl0LgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHBhcmVudHMgVGhlIGxpc3Qgb2YgcGFyZW50cyBmb3IgdGhpcyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVXU0RMRWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm8pCi0gIHsKLSAgICBJV1NETDExVmFsaWRhdG9yIHZhbCA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KG5hbWVzcGFjZSk7Ci0gICAgaWYgKHZhbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHZhbC52YWxpZGF0ZShlbGVtZW50LCBwYXJlbnRzLCB3c2RsdmFsaW5mbyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JICAvL1RPRE86IEFkZCB0aGlzIGFzIGEgcHJlZmVyZW5jZS4KLSAgICAgIC8vd3NkbHZhbGluZm8uYWRkV2FybmluZyhtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfV0FSTl9OT19WQUxESUFUT1IsIG5hbWVzcGFjZSksIGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBzY2hlbWEgdG8gdGhlIGxpc3Qgb2Ygc2NoZW1hcy4KLSAgICogCi0gICAqIEBwYXJhbSB4c01vZGVsIFRoZSBzY2hlbWEgdG8gYWRkLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRTY2hlbWEoWFNNb2RlbCB4c01vZGVsKQotLy8gIHsKLS8vICAgIGlmICh4c01vZGVsICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHNjaGVtYXMuYWRkKHhzTW9kZWwpOwotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaXN0IGNvbnRhaW5pbmcgdGhlIHNjaGVtYXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHNjaGVtYXMuCi0gICAqLwotLy8gIHB1YmxpYyBMaXN0IGdldFNjaGVtYXMoKQotLy8gIHsKLS8vICAgIHJldHVybiBzY2hlbWFzOwotLy8gIH0KLQotICAvKioKLSAgCSogR2V0IHRoZSBSZXNvdXJjZUJ1bmRsZSBmb3IgdGhpcyBWYWxpZGF0b3JNYW5hZ2VyLgotICAJKiAKLSAgCSogQHJldHVybiBUaGUgcmVzb3VyY2UgYnVuZGxlIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY29udHJvbGxlci4KLSAgCSogQHNlZSAjc2V0UmVzb3VyY2VCdW5kbGUKLSAgCSovCi0vLyAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLS8vICB7Ci0vLyAgICByZXR1cm4gcmVzb3VyY2VidW5kbGU7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldFJlc291cmNlQnVuZGxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIGlmIChtZXNzYWdlZ2VuZXJhdG9yID09IG51bGwpCi0gICAgewotICAgICAgbWVzc2FnZWdlbmVyYXRvciA9IG5ldyBNZXNzYWdlR2VuZXJhdG9yKHJiKTsKLSAgICB9Ci0KLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbWVzc2FnZSBnZW5lcmF0b3IgZm9yIHRoaXMgY29udHJvbGxlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNnZW4gVGhlIG1lc3NhZ2UgZ2VuZXJhdG9yIHRvIHNldCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1lc2dlbikKLSAgewotICAgIG1lc3NhZ2VnZW5lcmF0b3IgPSBtZXNnZW47Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGdlbmVyYXRvciByZWdpc3RlcmVkIGZvciB0aGlzIGNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIGdlbmVyYXRvciByZWdpc3RlcmVkIGZvciB0aGlzIGNvbnRyb2xsZXIuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUdlbmVyYXRvciBnZXRNZXNzYWdlR2VuZXJhdG9yKCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlZ2VuZXJhdG9yOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZmlsZW5hbWUgZm9yIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyB2YWxpZGF0ZWQuIFNvbWUgdmFsaWRhdG9ycyByZXF1aXJlIHRoaXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBmaWxlbmFtZSBmb3IgdGhlIGZpbGUgYmVpbmcgdmFsaWRhdGVkLgotICAgKi8KLS8vICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkKLS8vICB7Ci0vLyAgICByZXR1cm4gZmlsZVVSSTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCBlcnJvciBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIGZvci4KLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciB0byBhZGQuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZEVycm9yTWVzc2FnZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZXJyb3IpCi0vLyAgewotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoRVJST1JfTUVTU0FHRSwgb2JqZWN0LCBlcnJvcik7Ci0vLyAgICBlcnJvcnMgPSB0cnVlOwotLy8gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIGVycm9yIG1lc3NhZ2VzIHdoZW4gdGhleSBrbm93Ci0gICAqIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLgotICAgKiAKLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgd2hlcmUgdGhlIGVycm9yIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgbWVzc2FnZS4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgYWRkRXJyb3JNZXNzYWdlKGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgZXJyb3IpCi0vLyAgewotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoRVJST1JfTUVTU0FHRSwgbGluZSwgY29sdW1uLCBlcnJvcik7Ci0vLyAgICBlcnJvcnMgPSB0cnVlOwotLy8gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBleHRlbnNpYmx5IHZhbGlkYXRvcnMgdG8gYWRkIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYWRkIHRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB3YXJuaW5nIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmdNZXNzYWdlKE9iamVjdCBvYmplY3QsIFN0cmluZyB3YXJuaW5nKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKFdBUk5JTkdfTUVTU0FHRSwgb2JqZWN0LCB3YXJuaW5nKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCB3YXJuaW5nIG1lc3NhZ2VzIHdoZW4gdGhleSBrbm93Ci0gICAqIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLgotICAgKiAKLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgd2hlcmUgdGhlIGVycm9yIG1lc3NhZ2UgaXMgbG9jYXRlZC4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSB3YXJuaW5nIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmdNZXNzYWdlKGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgd2FybmluZykKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShXQVJOSU5HX01FU1NBR0UsIGxpbmUsIGNvbHVtbiwgd2FybmluZyk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBJZiB5b3UgaGF2ZSBhbiBvYmplY3QgcmVhZCBpbiBieSB0aGUgcmVhZGVyIGZvciB0aGlzCi0gICAqIHZhbGlkYXRvcmNvbnRyb2xsZXIgdGhlIG9iamVjdCBjYW4gYmUgcGFzc2VkIGluIGhlcmUgYW5kIHRoZSBsaW5lIGFuZCBjb2x1bW4KLSAgICogaW5mb3JtYXRpb24gd2lsbCBiZSBhYnN0cmFjdGVkIGZyb20gaXQuCi0gICAqIAotICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIG8gVGhlIG9iamVjdCB0aGF0IGhhcyB0aGUgZXJyb3IgKHVzZWQgdG8gZ2V0IHRoZSBsb2NhdGlvbikuCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGFkZC4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoaW50IHR5cGUsIE9iamVjdCBvLCBTdHJpbmcgbWVzc2FnZSkKLS8vICB7Ci0vLyAgICBpbnRbXSBsb2NhdGlvbjsKLS8vICAgIGlmIChlbGVtZW50TG9jYXRpb25zLmNvbnRhaW5zS2V5KG8pKQotLy8gICAgewotLy8gICAgICBsb2NhdGlvbiA9IChpbnRbXSllbGVtZW50TG9jYXRpb25zLmdldChvKTsKLS8vICAgIH0KLS8vICAgIC8vIGlmIHdlIGdpdmUgaXQgYW4gZWxlbWVudCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQgd2UnbGwgc2V0IHRoZSBsb2NhdGlvbgotLy8gICAgLy8gYXQgKDAsMCkgc28gdGhlIGVycm9yIHNob3dzIHVwIGJ1dCBubyBsaW5lIG1hcmtlciBpbiB0aGUgZWRpdG9yCi0vLyAgICBlbHNlCi0vLyAgICB7Ci0vLyAgICAgIGxvY2F0aW9uID0gbmV3IGludFtdIHsgMCwgMCB9OwotLy8gICAgfQotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UodHlwZSwgbG9jYXRpb25bMF0sIGxvY2F0aW9uWzFdLCBtZXNzYWdlKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAgKiBDcmVhdGVzIGEgdmFsaWRhdGlvbiBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAqIAotICAJKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gYWRkLgotICAJKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAJKiBAcGFyYW0gY29sdW1uIFRoZSBsaW5lIHdoZXJlIHRoZSBjb2x1bW4gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAJKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gIAkqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKGludCB0eXBlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgaWYgKHR5cGUgPT0gRVJST1JfTUVTU0FHRSkKLS8vICAgICAgewotLy8gICAgICAgIHZhbGlkYXRpb25Db250cm9sbGVyLmFkZEVycm9yTWVzc2FnZShsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gV0FSTklOR19NRVNTQUdFKQotLy8gICAgICB7Ci0vLyAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xsZXIuYWRkV2FybmluZ01lc3NhZ2UobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLmNvbnRyb2xsZXIuSVdTRExWYWxpZGF0b3IjaXNWYWxpZCgpCi0gICAqLwotLy8gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotLy8gIHsKLS8vICAgIHJldHVybiAhZXJyb3JzOwotLy8gIH0KLQotICAvKioKLSAgICogUmVzZXQgdGhlIHZhbGlkYXRvciBjb250cm9sbGVyLgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCByZXNldCgpCi0vLyAgewotLy8gICAgc2NoZW1hcyA9IG5ldyBWZWN0b3IoKTsKLS8vICAgIGZpbGVVUkkgPSAiIjsKLS8vICAgIHdzZGxEZWZpbml0aW9uID0gbnVsbDsKLS8vICAgIGVsZW1lbnRMb2NhdGlvbnMgPSBudWxsOwotLy8gICAgcmVzb3VyY2VidW5kbGUgPSBudWxsOwotLy8gICAgLy92YWxpZGF0aW9uQ29udHJvbGxlciA9IG51bGw7Ci0vLyAgICBlcnJvcnMgPSBmYWxzZTsKLS8vICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExVmFsaWRhdG9yRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyN2E3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLQotLyoqCi0gKiBUaGUgV1NETCAxLjEgdmFsaWRhdG9yIGRlbGVnYXRlIGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgdmFsaWRhdG9yIHRvIGJlIGluc3RhbnRpYXRlZCBhdAotICogYSBsYXRlciBwb2ludC4KLSAqLwotcHVibGljIGNsYXNzIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlCi17Ci0gIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlQnVuZGxlID0gbnVsbDsKLSAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IG51bGw7Ci0gIHByaXZhdGUgSVdTREwxMVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWxlZ2F0ZSBmb3IgYSB2YWxpZGF0b3IgYnkgaXRzIGNsYXNzIG5hbWUgYW5kIHJlc291cmNlIGJ1bmRsZSBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBiYXNlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZShTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUpCi0gIHsKLSAgICB0aGlzLnZhbGlkYXRvckNsYXNzbmFtZSA9IHZhbGlkYXRvckNsYXNzbmFtZTsKLSAgICB0aGlzLnJlc291cmNlQnVuZGxlID0gcmVzb3VyY2VCdW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgZGVsZWdhdGUgZm9yIGEgdmFsaWRhdG9yIGJ5IGl0cyBjbGFzcyBuYW1lLCByZXNvdXJjZSBidW5kbGUgbmFtZSBhbmQgCi0gICAqIGEgY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIHZhbGlkYXRvciBhbmQgYnVuZGxlLgotICAgKiAKLSAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBiYXNlIHJlc291cmNlIGJ1bmRsZS4KLSAgICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIHZhbGlkYXRvciBhbmQgYnVuZGxlLgotICAgKi8KLSAgcHVibGljIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUsIFN0cmluZyByZXNvdXJjZUJ1bmRsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gIHsKLSAgICB0aGlzKHZhbGlkYXRvckNsYXNzbmFtZSwgcmVzb3VyY2VCdW5kbGUpOwotICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbGlkYXRvciBzcGVjaWZpZWQgaW4gdGhpcyBkZWxlZ2F0ZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFdTREwgMS4xIHZhbGlkYXRvciBzcGVjaWZpZWQgYnkgdGhpcyBkZWxlZ2F0ZS4KLSAgICovCi0gIHB1YmxpYyBJV1NETDExVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpCi0gIHsKLSAgICBpZiAodmFsaWRhdG9yID09IG51bGwpCi0gICAgewotICAgICAgaWYoY2xhc3NMb2FkZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgIAljbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgIH0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcyA9Ci0gICAgICAgICAgY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzc25hbWUpIDogQ2xhc3MuZm9yTmFtZSh2YWxpZGF0b3JDbGFzc25hbWUpOwotCi0gICAgICAgIHZhbGlkYXRvciA9IChJV1NETDExVmFsaWRhdG9yKXZhbGlkYXRvckNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUmVzb3VyY2VCdW5kbGUgdmFsaWRhdG9yQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBjbGFzc0xvYWRlcik7Ci0gICAgICAgICAgdmFsaWRhdG9yLnNldFJlc291cmNlQnVuZGxlKHZhbGlkYXRvckJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE86IGFkZCBsb2dnaW5nCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE86IGFkZCBsb2dnaW5nCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRPRE86IGFkZCBsb2dnaW5nCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbGlkYXRvcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyZmIwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25EZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnROU0ltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2QuSW5saW5lU2NoZW1hVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLkVsZW1lbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET01VdGlsczsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuUU5hbWVVdGlsczsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuWFBhdGhVdGlsczsKLQotLyoqCi0gKiBBIFdTREwgZG9jdW1lbnQgdGhhdCBrbm93cyBob3cgdG8gcGFyc2UgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgV1NETERvY3VtZW50Ci17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgU1RZTEVfT05FX1dBWSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkVMRU1fSU5QVVQgfSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgU1RZTEVfUkVRVUVTVF9SRVNQT05TRSA9Ci0gICAgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyBDb25zdGFudHMuRUxFTV9JTlBVVCwgQ29uc3RhbnRzLkVMRU1fT1VUUFVUIH0pOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0IFNUWUxFX1NPTElDSVRfUkVTUE9OU0UgPQotICAgIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkVMRU1fT1VUUFVULCBDb25zdGFudHMuRUxFTV9JTlBVVCB9KTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdCBTVFlMRV9OT1RJRklDQVRJT04gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5FTEVNX09VVFBVVCB9KTsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfRVJST1JfTVVMVElQTEVfVFlQRVNfREVGSU5FRCA9ICJfRVJST1JfTVVMVElQTEVfVFlQRVNfREVGSU5FRCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVU5BQkxFX1RPX0lNUE9SVF9OT19MT0NBVElPTiA9ICJfVU5BQkxFX1RPX0lNUE9SVF9OT19MT0NBVElPTiI7Ci0KLSAgcHJvdGVjdGVkIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dFJlZyA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmFjdG9yeUltcGxOYW1lID0gbnVsbDsKLQotICAvLyBzdG9yZSB0aGUgZWxlbWVudCBsb2NhdGlvbnMgd2l0aGluIHRoZSBmaWxlIC0gbGluZSBhbmQgY29sdW1uIG51bWJlcnMKLSAgLy8gdGhlIGxvY2F0aW9uIGluZm8gaXMgc3RvcmVkIGFzIGFuIGludCBhcnJheSBvZiBsZW5ndGggMiB7bGluZW51bWJlciwgY29sbnVtYmVyfQotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGVsZW1lbnRMb2NhdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIAotICAvLyBob2xkIHRoZSByZWFkZXIgZXJyb3JzCi0gIHByb3RlY3RlZCBMaXN0IHJlYWRlckVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIExpc3QgcmVhZGVyV2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIAotICBwcml2YXRlIERlZmluaXRpb24gZGVmID0gbnVsbDsKLSAgcHJpdmF0ZSBTZXQgaW1wb3J0ZWREZWZzID0gbmV3IFRyZWVTZXQoKTsKLSAgcHJpdmF0ZSBFbGVtZW50IHR5cGVzRWwgPSBudWxsOwotICBwcml2YXRlIExpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgTGlzdCBwb3J0dHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgTGlzdCBiaW5kaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJpdmF0ZSBMaXN0IHNlcnZpY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIExpc3QgZXh0ZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByaXZhdGUgaW50IGRlcHRoOwotICAvLyBIb2xkIHRoZSBzY2hlbWFzIHRoYXQgYXJlIGltcG9ydGVkIG9yIGRlY2xhcmVkIGlubGluZSBpbiB0aGlzIHdzZGwgZG9jdW1lbnQuCi0gIHByaXZhdGUgTGlzdCBzY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxpbmZvOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBQZXJmb3JtcyBhIHByZXBhcnNlIG9mIHRoZSBkb2N1bWVudCBhbmQgaGFuZGxlcyBpbXBvcnRzIGFuZCB0eXBlcy4KLSAgICogCi0gICAqIEBwYXJhbSBkb2N1bWVudEJhc2VVUkkgVGhlIFVSSSBvZiB0aGlzIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBkZWZFbCBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlcHRoIFRoZSBkZXB0aCBvZiB0aGlzIGRvY3VtZW50IGluIGEgZG9jdW1lbnQgdHJlZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VnZW5lcmF0b3IgQSBtZXNzYWdlZ2VuZXJhdG9yIHVzZWQgZm9yIHJldHJpZXZpbmcgc3RyaW5ncy4KLSAgICogQHBhcmFtIHZhbGluZm8gQSBXU0RMMTFWYWxpZGF0aW9uSW5mbyBvYmplY3QgZm9yIHJlcG9ydGluZyBtZXNzYWdlcy4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50KFN0cmluZyBkb2N1bWVudEJhc2VVUkksIEVsZW1lbnQgZGVmRWwsIGludCBkZXB0aCwgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsaW5mbykgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRoaXMubWVzc2FnZWdlbmVyYXRvciA9IG1lc3NhZ2VnZW5lcmF0b3I7Ci0gICAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gICAgCi0gICAgY2hlY2tFbGVtZW50TmFtZShkZWZFbCwgQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUyk7Ci0gICAgCi0gICAgV1NETEZhY3RvcnkgZmFjdG9yeSA9Ci0gICAgICAoZmFjdG9yeUltcGxOYW1lICE9IG51bGwpID8gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoZmFjdG9yeUltcGxOYW1lKSA6IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZGVmID0gZmFjdG9yeS5uZXdEZWZpbml0aW9uKCk7Ci0KLSAgICBpZiAoZXh0UmVnICE9IG51bGwpCi0gICAgewotICAgICAgZGVmLnNldEV4dGVuc2lvblJlZ2lzdHJ5KGV4dFJlZyk7Ci0gICAgfQotCi0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZGVmRWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZGVmRWwsIENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IGRlZkVsLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgIGlmIChkb2N1bWVudEJhc2VVUkkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWYuc2V0RG9jdW1lbnRCYXNlVVJJKGRvY3VtZW50QmFzZVVSSSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWYuc2V0UU5hbWUobmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgbmFtZSkpOwotICAgIH0KLQotICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkZWYuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgfQotCi0gICAgaW50IHNpemUgPSBhdHRycy5nZXRMZW5ndGgoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWF0dHJzLml0ZW0oaSk7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gYXR0ci5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBhdHRyLmdldExvY2FsTmFtZSgpOwotICAgICAgU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCi0gICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hNTE5TKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGxvY2FsUGFydCAhPSBudWxsICYmICFsb2NhbFBhcnQuZXF1YWxzKENvbnN0YW50cy5BVFRSX1hNTE5TKSkKLSAgICAgICAgewotICAgICAgICAgIGRlZi5hZGROYW1lc3BhY2UobG9jYWxQYXJ0LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZGVmLmFkZE5hbWVzcGFjZShudWxsLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBhcmUgcHJvYmxlbXMgd2hlbiB0aGUgbW9kZWwgaXMgY3JlYXRlZCBhbmQgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGlzIG5vdAotICAgIC8vIEltcG9ydCAtIFR5cGVzIC0gTWVzc2FnZSAtIFBvcnRUeXBlIC0gQmluZGluZyAtIFNlcnZpY2Ugc28gd2UgbmVlZCB0byByZWFkIHRoZW0KLSAgICAvLyBpbnRvIHRoZSBtb2RlbCBpbiB0aGF0IG9yZGVyCi0gICAgLy8gUGVyZm9ybWFuY2Ugd2lzZSB0aGlzIHNob3VsZCBiZSBtb2RpZmllZCBhcyB3ZSBoYXZlIHRvIG1ha2UgNSBleHRyYSBsb29wcyB0aHJvdWdoCi0gICAgLy8gYWxsIG9mIHRoZSBlbGVtZW50cyBhcyBhIHJlc3VsdAotCi0gICAgLy8gdGFrZSBjYXJlIG9mIEltcG9ydHMsIFR5cGVzLCBEb2N1bWVudGF0aW9uIGFuZCBleHRlbnNpYmxlZWxlbWVudHMgdG9nZXRoZXIgLSBzYXZlcyBhIHBhc3MgZm9yIERvY3VtZW50YXRpb24gCi0gICAgLy8gbGF0ZXIgYW5kIERvY3MgZG9uJ3QgZWZmZWN0IGFueXRoaW5nIGVsc2UgLSBJbXBvcnRzIGFuZCBUeXBlcyBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgdGhpbmcKLSAgICAvLyBubyBwcmVjb25jZWl2ZWQgaWRlYXMgYWJvdXQgZXh0ZW5zaWJsZSBlbGVtZW50cwotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoZGVmRWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLQotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0lNUE9SVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSk7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsIENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OKTsKLSAgICAgICAgaWYobG9jYXRpb25VUkkgPT0gbnVsbCB8fCBsb2NhdGlvblVSSS5lcXVhbHMoIiIpKQotICAgICAgICB7Ci0gICAgICAgICAgYWRkUmVhZGVyRXJyb3IoZGVmLCB0ZW1wRWwsIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9VTkFCTEVfVE9fSU1QT1JUX05PX0xPQ0FUSU9OKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgSW1wb3J0SG9sZGVyIGloID0gbmV3IEltcG9ydEhvbGRlcihuYW1lc3BhY2VVUkksIGxvY2F0aW9uVVJJLCBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCksIHRoaXMsIGRlcHRoKzEsIHRlbXBFbCwgbWVzc2FnZWdlbmVyYXRvciwgdmFsaW5mbyk7Ci0gICAgICAgICAgaW1wb3J0ZWREZWZzLmFkZChpaCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0TG9jYXRpb24odGVtcEVsLCB0ZW1wRWwpOwotLy8gICAgICAgIGlmIChpbXBvcnRlZERlZnMgPT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBpbXBvcnRlZERlZnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChkb2N1bWVudEJhc2VVUkkgIT0gbnVsbCkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBpbXBvcnRlZERlZnMucHV0KGRvY3VtZW50QmFzZVVSSSwgZGVmKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgZGVmLmFkZEltcG9ydChwYXJzZUltcG9ydCh0ZW1wRWwsIGRlZiwgaW1wb3J0ZWREZWZzKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBkZWYuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX1RZUEVTLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBpZih0eXBlc0VsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzZXRMb2NhdGlvbih0ZW1wRWwsIHRlbXBFbCk7Ci0gICAgICAgICAgYWRkUmVhZGVyRXJyb3IoZGVmLCB0ZW1wRWwsIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9NVUxUSVBMRV9UWVBFU19ERUZJTkVEKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdHlwZXNFbCA9IHRlbXBFbDsKLSAgICAgICAgICBwYXJzZVR5cGVzKCk7Ci0gICAgICAgIH0KLS8vICAgICAgICBkZWYuc2V0VHlwZXMocGFyc2VUeXBlcyh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fTUVTU0FHRSwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZXMuYWRkKHRlbXBFbCk7Ci0gICAgICAgIC8vZGVmLmFkZE1lc3NhZ2UocGFyc2VNZXNzYWdlKHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9QT1JUX1RZUEUsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIHBvcnR0eXBlcy5hZGQodGVtcEVsKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgUG9ydFR5cGUgcHQgPSBwYXJzZVBvcnRUeXBlKHRlbXBFbCwgZGVmKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgaWYocHQgIT0gbnVsbCkKLSAgICAgICAgLy8gICAgICAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICBkZWYuYWRkUG9ydFR5cGUocHQpOwotICAgICAgICAvLyAgICAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9CSU5ESU5HLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5ncy5hZGQodGVtcEVsKTsKLSAgICAgICAgLy9kZWYuYWRkQmluZGluZyhwYXJzZUJpbmRpbmcodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX1NFUlZJQ0UsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIHNlcnZpY2VzLmFkZCh0ZW1wRWwpOwotICAgICAgICAvL2RlZi5hZGRTZXJ2aWNlKHBhcnNlU2VydmljZSh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBleHRlbGVtZW50cy5hZGQodGVtcEVsKTsKLSAgICAgICAgLy8gICAgICAgIGRlZi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCgKLSAgICAgICAgLy8gICAgICAgICAgcGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChEZWZpbml0aW9uLmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGRlZmluaXRpb25zIGVsZW1lbnQgZm9yIHRoaXMgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZvciB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZGVmOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGEgc2V0IG9mIHRoZSBpbXBvcnRzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgc2V0IG9mIHRoZSBpbXBvcnRzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgU2V0IGdldEltcG9ydHMoKQotICB7Ci0gICAgcmV0dXJuIGltcG9ydGVkRGVmczsKLSAgfQotICAKLSAgLyoqCi0gICAqIAotICAgKiBAcGFyYW0gZGVmCi0gICAqIEBwYXJhbSBkb2MKLSAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgKiBAcGFyYW0gbG9jYXRpb24KLSAgICovCi0vLyAgcHVibGljIHZvaWQgc2V0SW1wb3J0KERlZmluaXRpb24gZGVmLCBFbGVtZW50IGRvYywgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKQotLy8gIHsKLS8vICAgIGlmKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uZXF1YWxzKCIiKSkKLS8vICAgIHsKLS8vICAgICAgdmFsaW5mby5hZGRFcnJvcigpX1VOQUJMRV9UT19JTVBPUlRfTk9fTE9DQVRJT04gCi0vLyAgICB9Ci0vLyAgICBJbXBvcnQgaW1wID0gZGVmLmNyZWF0ZUltcG9ydCgpOwotLy8gICAgaW1wLnNldERlZmluaXRpb24oZGVmKTsKLS8vICAgIGltcC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChkb2MpOwotLy8gICAgaW1wLnNldE5hbWVzcGFjZVVSSShuYW1lc3BhY2UpOwotLy8gICAgaW1wLnNldExvY2F0aW9uVVJJKGxvY2F0aW9uKTsKLS8vICAgIGRlZi5hZGRJbXBvcnQoaW1wKTsKLS8vICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIHR5cGVzIGluIHRoZSBXU0RMIGRvY3VtZW50LiBIYW5kbGVzIGRvY3VtZW50YXRpb24sIGltcG9ydCBhbmQgc2NoZW1hCi0gICAqIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VUeXBlcygpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IGRlZi5jcmVhdGVUeXBlcygpOwotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudCh0eXBlc0VsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgdHlwZXMuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRlbXBFbC5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbXBvcnQiKSkKLSAgICAgICAgLy9lbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9JTVBPUlQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IHJlYWxseSBiZSB1c2VkIGhlcmUgYnV0IGEgbGl0dGxlIGhhY2sgd2lsbCBtYWtlCi0gICAgICAgIC8vIGxpZmUgZWFzaWVyCi0gICAgICAgIC8vcGFyc2VJbXBvcnQodGVtcEVsLCBkZWYsIChNYXApbmV3IEhhc2h0YWJsZSgpKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsIENvbnN0YW50cy5BVFRSX05BTUVTUEFDRSk7Ci0gICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZSh0ZW1wRWwsICJzY2hlbWFMb2NhdGlvbiIpOwotICAgICAgICBpbXBvcnRlZERlZnMuYWRkKG5ldyBJbXBvcnRIb2xkZXIobmFtZXNwYWNlVVJJLCBsb2NhdGlvblVSSSwgZGVmLmdldERvY3VtZW50QmFzZVVSSSgpLCB0aGlzLCBkZXB0aCsxLCB0ZW1wRWwsIG1lc3NhZ2VnZW5lcmF0b3IsIHZhbGluZm8pKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KFR5cGVzLmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoVHlwZXMuY2xhc3MsIHRlbXBFbCwgZGVmKTsKLSAgICAgICAgICB0eXBlcy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRFbGVtKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0gICAgZGVmLnNldFR5cGVzKHR5cGVzKTsKLSAgICAKLSAgICB2YWxpbmZvLnNldEVsZW1lbnRMb2NhdGlvbnMoZWxlbWVudExvY2F0aW9ucyk7Ci0gICAgTGlzdCB0eXBlc0VsZW1zID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYodHlwZXNFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHR5cGVzRWxlbXNJdGVyID0gdHlwZXNFbGVtcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUodHlwZXNFbGVtc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCB0eXBlRWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCl0eXBlc0VsZW1zSXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBJbmxpbmVTY2hlbWFWYWxpZGF0b3IgeHNkVmFsID0gbmV3IElubGluZVNjaGVtYVZhbGlkYXRvcigpOwotICAgICAgICB4c2RWYWwuc2V0TWVzc2FnZUdlbmVyYXRvcihtZXNzYWdlZ2VuZXJhdG9yKTsKLSAgICAKLSAgICAgICAgTGlzdCBwYXJlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBwYXJlbnRzLmFkZChkZWYpOwotICAgICAgICBwYXJlbnRzLmFkZCgwLHR5cGVzKTsKLSAgICAgICAgeHNkVmFsLnZhbGlkYXRlKHR5cGVFbGVtZW50LCBwYXJlbnRzLHZhbGluZm8pOwotICAgICAgICBYU01vZGVsW10gdHlwZXNTY2hlbWFzID0gdmFsaW5mby5nZXRTY2hlbWFzKCk7Ci0gICAgICAgIExpc3QgdHlwZXNTY2hlbWFMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdHlwZXNTY2hlbWFzLmxlbmd0aDsgaSsrKQotICAgICAgICB7ICAKLSAgICAgICAgICB0eXBlc1NjaGVtYUxpc3QuYWRkKHR5cGVzU2NoZW1hc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2NoZW1hcy5hZGRBbGwodHlwZXNTY2hlbWFMaXN0KTsKLSAgICAgICAgdmFsaW5mby5jbGVhclNjaGVtYXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdmFsaW5mby5zZXRFbGVtZW50TG9jYXRpb25zKG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIG1lc3NhZ2VzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZU1lc3NhZ2VzKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZi5hZGRNZXNzYWdlKHBhcnNlTWVzc2FnZSgoRWxlbWVudCltZXNzYWdlcy5nZXQoaSksIGRlZikpOwotICAgICAgfQotICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAge30KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgcG9ydFR5cGVzIGluIHRoaXMgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVBvcnR0eXBlcygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvcnR0eXBlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUG9ydFR5cGUgcHQgPSBwYXJzZVBvcnRUeXBlKChFbGVtZW50KXBvcnR0eXBlcy5nZXQoaSksIGRlZik7Ci0gICAgICAgIGlmIChwdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZGVmLmFkZFBvcnRUeXBlKHB0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2goV1NETEV4Y2VwdGlvbiBlKQotICAgICAge30KLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgYmluZGluZ3MgaW4gdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlQmluZGluZ3MoKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZGVmLmFkZEJpbmRpbmcocGFyc2VCaW5kaW5nKChFbGVtZW50KWJpbmRpbmdzLmdldChpKSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICB7fQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBzZXJ2aWNlcyBpbiB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VTZXJ2aWNlcygpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBkZWYuYWRkU2VydmljZShwYXJzZVNlcnZpY2UoKEVsZW1lbnQpc2VydmljZXMuZ2V0KGkpLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgICAgIHt9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgaW4gdGhpcyBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZWxlbWVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGRlZi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KERlZmluaXRpb24uY2xhc3MsIChFbGVtZW50KWV4dGVsZW1lbnRzLmdldChpKSwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChXU0RMRXhjZXB0aW9uIGUpCi0gICAgICB7fQotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgZ2l2ZW4gbGlzdCBvZiBzY2hlbWFzIHRvIHRoZSBzY2hlbWFzIGZvciB0aGlzIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYXMgVGhlIGxpc3Qgb2Ygc2NoZW1hcyB0byBhZGQgdG8gdGhpcyBkb2N1bWVudCdzIHNjaGVtYXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRTY2hlbWFzKExpc3Qgc2NoZW1hcykKLSAgewotICAgIHRoaXMuc2NoZW1hcy5hZGRBbGwoc2NoZW1hcyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHNjaGVtYXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgYmluZGluZy4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nRWwgVGhlIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgYmluZGluZyBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIHBhcnNlQmluZGluZyhFbGVtZW50IGJpbmRpbmdFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBudWxsOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgcG9ydFR5cGVOYW1lOwotICAgIHRyeQotICAgIHsKLSAgICAgIHBvcnRUeXBlTmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKGJpbmRpbmdFbCwgQ29uc3RhbnRzLkFUVFJfVFlQRSwgQ29uc3RhbnRzLkVMRU1fQklORElORywgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgbWVzc2FnZSBuYW1lCi0gICAgICBwb3J0VHlwZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdFbCwgInR5cGUiKSk7Ci0gICAgfQotCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBudWxsOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBRTmFtZSBiaW5kaW5nTmFtZSA9IG5ldyBRTmFtZShkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUpOwotCi0gICAgICBiaW5kaW5nID0gZGVmLmdldEJpbmRpbmcoYmluZGluZ05hbWUpOwotCi0gICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgewotICAgICAgICBiaW5kaW5nID0gZGVmLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgICAgYmluZGluZy5zZXRRTmFtZShiaW5kaW5nTmFtZSk7Ci0gICAgICB9Ci0gICAgICAvLyByZXBvcnQgYW4gZXJyb3IgaWYgYSBiaW5kaW5nIHdpdGggdGhpcyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZAotICAgICAgZWxzZSBpZiAoIWJpbmRpbmcuaXNVbmRlZmluZWQoKSkKLSAgICAgIHsKLSAgICAgICAgLy9hZGRSZWFkZXJFcnJvcihkZWYsYmluZGluZ0VsLCAiX0JJTkRJTkdfTkFNRV9BTFJFQURZX0RFRklORUQiKTsgICAgICAgCi0gICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgIGRlZiwKLSAgICAgICAgICBiaW5kaW5nRWwsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9CSU5ESU5HX05BTUVfQUxSRUFEWV9ERUZJTkVEIiwgIiciICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgIiciKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBiaW5kaW5nID0gZGVmLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBXaGV0aGVyIGl0IHdhcyByZXRyaWV2ZWQgb3IgY3JlYXRlZCwgdGhlIGRlZmluaXRpb24gaGFzIGJlZW4gZm91bmQuCi0gICAgYmluZGluZy5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgaWYgKHBvcnRUeXBlTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHBvcnRUeXBlID0gZGVmLmdldFBvcnRUeXBlKHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICBwb3J0VHlwZS5zZXRRTmFtZShwb3J0VHlwZU5hbWUpOwotICAgICAgICBkZWYuYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nLnNldFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmcuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX09QRVJBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5hZGRCaW5kaW5nT3BlcmF0aW9uKHBhcnNlQmluZGluZ09wZXJhdGlvbih0ZW1wRWwsIHBvcnRUeXBlLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmcuY2xhc3MsIHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24oYmluZGluZywgYmluZGluZ0VsKTsKLQotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbkVsIFRoZSBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcG9ydFR5cGUgVGhlIHBvcnRUeXBlIHRoZSBiaW5kaW5nIHJlZmVyZW5jZXMuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdPcGVyYXRpb24gcGFyc2VCaW5kaW5nT3BlcmF0aW9uKEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsLCBQb3J0VHlwZSBwb3J0VHlwZSwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IGRlZi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ09wZXJhdGlvbkVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU5QVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KHBhcnNlQmluZGluZ0lucHV0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9PVVRQVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChwYXJzZUJpbmRpbmdPdXRwdXQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0ZBVUxULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChwYXJzZUJpbmRpbmdGYXVsdCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ09wZXJhdGlvbi5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgICAgIFN0cmluZyBpbnB1dE5hbWUgPSAoYmluZGluZ0lucHV0ICE9IG51bGwgPyBiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpIDogbnVsbCk7Ci0gICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9IChiaW5kaW5nT3V0cHV0ICE9IG51bGwgPyBiaW5kaW5nT3V0cHV0LmdldE5hbWUoKSA6IG51bGwpOwotCi0gICAgICAvLyBoYWNrIGNvZGUgdG8gZ2V0IGF0IG9wZXJhdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudAotICAgICAgLy8gaW5wdXRzIGFuZCBvdXRwdXRzIAotICAgICAgT3BlcmF0aW9uIG9wID0gbnVsbDsKLSAgICAgIExpc3Qgb3BlcmF0aW9ucyA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgIC8vIGdldCBhIGxpc3Qgb2YgYWxsIG9wZXJhdGlvbnMgd2l0aCBtYXRjaGluZyBuYW1lcwotICAgICAgTGlzdCBtYXRjaGluZ09wZXJhdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBJdGVyYXRvciBpT3BlcmF0aW9ucyA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpT3BlcmF0aW9ucy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBvcGVyID0gKE9wZXJhdGlvbilpT3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgIGlmIChvcGVyLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIG1hdGNoaW5nT3BlcmF0aW9ucy5hZGQob3Blcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG1hdGNoaW5nT3BlcmF0aW9ucyAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBJZiB0aGVyZSdzIG9ubHkgb25lIG1hdGNoaW5nIG9wZXJhdGlvbiB0aGlzIGlzIHdoYXQgd2UncmUgcmVmZXJyaW5nIHRvLgotICAgICAgICAvLyBPbmx5IG1hdGNoaW5nIGlmIGJpbmRpbmcgb3BlcmF0aW9uIGlucHV0IG5hbWUgYW5kIG91dHB1dCBuYW1lIGFyZQotICAgICAgICAvLyBib3RoIG51bGwgb3IgdGhlIHNhbWUgYXMgdGhlIHBvcnRUeXBlIG9wZXJhdGlvbiBpbnB1dCBhbmQgb3V0cHV0IG5hbWVzLgotICAgICAgICAvLyB0aGUgcG9ydFR5cGUgb3BlcmF0aW9uIG5hbWUKLSAgICAgICAgaWYgKG1hdGNoaW5nT3BlcmF0aW9ucy5zaXplKCkgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgIC8vIG9ubHkgc2F5IHRoZSBzaW5nbGUgb3BlcmF0aW9uIGlzIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IgaWYgdGhlIG5hbWVzCi0gICAgICAgICAgLy8gb2YgdGhlIGJpbmRpbmcgaW5wdXQgYW5kIG91dHB1dCBhcmUgbm90IHNwZWNpZmllZAotICAgICAgICAgIE9wZXJhdGlvbiB0ZW1wT3AgPSAoT3BlcmF0aW9uKW1hdGNoaW5nT3BlcmF0aW9ucy5nZXQoMCk7Ci0gICAgICAgICAgYm9vbGVhbiBpbnB1dE9LID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBvdXRwdXRPSyA9IGZhbHNlOwotICAgICAgICAgIElucHV0IHRlbXBJbnB1dCA9IHRlbXBPcC5nZXRJbnB1dCgpOwotICAgICAgICAgIE91dHB1dCB0ZW1wT3V0cHV0ID0gdGVtcE9wLmdldE91dHB1dCgpOwotCi0gICAgICAgICAgLy8gb3JkZXIgaXMgaW1wb3J0YW50IGluIHRoZXNlIGNvbmRpdGlvbnMuIGNvbmRpdGlvbiAyIG11c3QgZmFpbCBmb3IgMyB0byB3b3JrCi0gICAgICAgICAgLy8gY2hlY2sgdGhlIGlucHV0Ci0gICAgICAgICAgaWYgKHRlbXBJbnB1dCA9PSBudWxsICYmIGJpbmRpbmdJbnB1dCA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nSW5wdXQgPT0gbnVsbCB8fCBiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRPSyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHRlbXBJbnB1dCAhPSBudWxsICYmIGJpbmRpbmdJbnB1dC5nZXROYW1lKCkuZXF1YWxzKHRlbXBJbnB1dC5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBjaGVjayB0aGUgb3V0cHV0Ci0gICAgICAgICAgaWYgKHRlbXBPdXRwdXQgPT0gbnVsbCAmJiBiaW5kaW5nT3V0cHV0ID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0T0sgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChiaW5kaW5nT3V0cHV0ID09IG51bGwgfHwgYmluZGluZ091dHB1dC5nZXROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRPSyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHRlbXBPdXRwdXQgIT0gbnVsbCAmJiBiaW5kaW5nT3V0cHV0LmdldE5hbWUoKS5lcXVhbHModGVtcE91dHB1dC5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dE9LID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlucHV0T0sgJiYgb3V0cHV0T0spCi0gICAgICAgICAgewotICAgICAgICAgICAgb3AgPSB0ZW1wT3A7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vICAgICAgICAgIG9wID0gKE9wZXJhdGlvbikgbWF0Y2hpbmdPcGVyYXRpb25zLmdldCgwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBvdGhlcndpc2UgZmluZCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSwgaW5wdXRuYW1lLCBvdXRwdXRuYW1lIHNpZ25hdHVyZQotICAgICAgICBpZiAobWF0Y2hpbmdPcGVyYXRpb25zICE9IG51bGwgJiYgb3AgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEl0ZXJhdG9yIGlNYXRjaGluZ09wZXJhdGlvbnMgPSBtYXRjaGluZ09wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAoaU1hdGNoaW5nT3BlcmF0aW9ucy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotCi0gICAgICAgICAgICBib29sZWFuIGlucHV0TmFtZXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBvdXRwdXROYW1lc0VxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICBPcGVyYXRpb24gb3BlciA9IChPcGVyYXRpb24paU1hdGNoaW5nT3BlcmF0aW9ucy5uZXh0KCk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICBpZiAob3Blci5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSkpCi0gICAgICAgICAgICAvLyAgICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dCBvcElucHV0ID0gb3Blci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKG9wSW5wdXQgIT0gbnVsbCAmJiBiaW5kaW5nSW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIG9wSW5wdXROYW1lID0gb3BJbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBiaW5kaW5nSW5wdXROYW1lID0gYmluZGluZ0lucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgaWYgKG9wSW5wdXROYW1lICE9IG51bGwgJiYgb3BJbnB1dE5hbWUuZXF1YWxzSWdub3JlQ2FzZShiaW5kaW5nSW5wdXROYW1lKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAob3BJbnB1dE5hbWUgPT0gbnVsbCAmJiBiaW5kaW5nSW5wdXROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvcElucHV0ID09IG51bGwgJiYgYmluZGluZ0lucHV0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlucHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBPdXRwdXQgb3BPdXRwdXQgPSBvcGVyLmdldE91dHB1dCgpOwotICAgICAgICAgICAgaWYgKG9wT3V0cHV0ICE9IG51bGwgJiYgYmluZGluZ091dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgb3BPdXRwdXROYW1lID0gb3BPdXRwdXQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBTdHJpbmcgYmluZGluZ091dHB1dE5hbWUgPSBiaW5kaW5nT3V0cHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgaWYgKG9wT3V0cHV0TmFtZSAhPSBudWxsICYmIG9wT3V0cHV0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKGJpbmRpbmdPdXRwdXROYW1lKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsICYmIGJpbmRpbmdPdXRwdXROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob3BPdXRwdXQgPT0gbnVsbCAmJiBiaW5kaW5nT3V0cHV0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG91dHB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlucHV0TmFtZXNFcXVhbCAmJiBvdXRwdXROYW1lc0VxdWFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcCA9IG9wZXI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvL09wZXJhdGlvbiBvcCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbihuYW1lLCBpbnB1dE5hbWUsIG91dHB1dE5hbWUpOwotCi0gICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3AgPSBkZWYuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgICAgIG9wLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIHBvcnRUeXBlLmFkZE9wZXJhdGlvbihvcCk7Ci0gICAgICB9Ci0KLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0T3BlcmF0aW9uKG9wKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmdPcGVyYXRpb24sIGJpbmRpbmdPcGVyYXRpb25FbCk7Ci0KLSAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgYmluZGluZyBpbnB1dCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdJbnB1dEVsIFRoZSBiaW5kaW5nIGlucHV0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGJpbmRpbmcgaW5wdXQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0lucHV0IHBhcnNlQmluZGluZ0lucHV0KEVsZW1lbnQgYmluZGluZ0lucHV0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGRlZi5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShiaW5kaW5nSW5wdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJpbmRpbmdJbnB1dC5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ0lucHV0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nSW5wdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0lucHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ0lucHV0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmdJbnB1dCwgYmluZGluZ0lucHV0RWwpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGJpbmRpbmcgb3V0cHV0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZ091dHB1dEVsIFRoZSBiaW5kaW5nIG91dHB1dCBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBiaW5kaW5nIG91dHB1dCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3V0cHV0IHBhcnNlQmluZGluZ091dHB1dChFbGVtZW50IGJpbmRpbmdPdXRwdXRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBkZWYuY3JlYXRlQmluZGluZ091dHB1dCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGJpbmRpbmdPdXRwdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJpbmRpbmdPdXRwdXQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGJpbmRpbmdPdXRwdXRFbCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ091dHB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KEJpbmRpbmdPdXRwdXQuY2xhc3MsIHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24oYmluZGluZ091dHB1dCwgYmluZGluZ091dHB1dEVsKTsKLQotICAgIHJldHVybiBiaW5kaW5nT3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgYmluZGluZyBmYXVsdCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmdGYXVsdEVsIFRoZSBiaW5kaW5nIGZhdWx0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGJpbmRpbmcgZmF1bHQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0ZhdWx0IHBhcnNlQmluZGluZ0ZhdWx0KEVsZW1lbnQgYmluZGluZ0ZhdWx0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IGRlZi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShiaW5kaW5nRmF1bHRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGJpbmRpbmdGYXVsdC5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ0ZhdWx0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nRmF1bHQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ0ZhdWx0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ0ZhdWx0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGJpbmRpbmdGYXVsdCwgYmluZGluZ0ZhdWx0RWwpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIG1lc3NhZ2UgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBtc2dFbCBUaGUgbWVzc2FnZSBlbGVtZW50LgotICAgKiBAcGFyYW0gZGVmIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBtZXNzYWdlIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2UgcGFyc2VNZXNzYWdlKEVsZW1lbnQgbXNnRWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgTWVzc2FnZSBtc2cgPSBudWxsOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKG1zZ0VsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lKTsKLQotICAgICAgbXNnID0gZGVmLmdldE1lc3NhZ2UobWVzc2FnZU5hbWUpOwotCi0gICAgICBpZiAobXNnID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1zZyA9IGRlZi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgIG1zZy5zZXRRTmFtZShtZXNzYWdlTmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICghbXNnLmlzVW5kZWZpbmVkKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBhcyBhIG1lc3NhZ2Ugd2l0aCB0aGlzIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCi0gICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgIGRlZiwKLSAgICAgICAgICBtc2dFbCwKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX01FU1NBR0VfTkFNRV9BTFJFQURZX0RFRklORUQiLCAiJyIgKyBtc2cuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICInIikpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbXNnID0gZGVmLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICAvLyBXaGV0aGVyIGl0IHdhcyByZXRyaWV2ZWQgb3IgY3JlYXRlZCwgdGhlIGRlZmluaXRpb24gaGFzIGJlZW4gZm91bmQuCi0gICAgbXNnLnNldFVuZGVmaW5lZChmYWxzZSk7Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KG1zZ0VsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgbXNnLnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9QQVJULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBtc2cuYWRkUGFydChwYXJzZVBhcnQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gWE1MIFZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGlzCi0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKG1zZywgbXNnRWwpOwotCi0gICAgcmV0dXJuIG1zZzsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHBhcnQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJ0RWwgVGhlIHBhcnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgcGFydCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBQYXJ0IHBhcnNlUGFydChFbGVtZW50IHBhcnRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBQYXJ0IHBhcnQgPSBkZWYuY3JlYXRlUGFydCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBhcnRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0KLSAgICBRTmFtZSBlbGVtZW50TmFtZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBlbGVtZW50TmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKHBhcnRFbCwgQ29uc3RhbnRzLkFUVFJfRUxFTUVOVCwgQ29uc3RhbnRzLkVMRU1fTUVTU0FHRSwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgZWxlbWVudCBuYW1lCi0gICAgICBlbGVtZW50TmFtZSA9IG5ldyBRTmFtZShudWxsLCBET01VdGlscy5nZXRBdHRyaWJ1dGUocGFydEVsLCAiZWxlbWVudCIpKTsKLSAgICB9Ci0KLSAgICBRTmFtZSB0eXBlTmFtZTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICB0eXBlTmFtZSA9IERPTVV0aWxzLmdldFF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlKHBhcnRFbCwgQ29uc3RhbnRzLkFUVFJfVFlQRSwKLSAgICAgICAgLy8gQ29ycmVjdGVkIC0gd2FzIEFUVFJfRUxFTUVOVAotICBDb25zdGFudHMuRUxFTV9NRVNTQUdFLCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL3RoZSBjYWxsIGFib3ZlIGZhaWxzIGlmIHRoZXJlIGlzIG5vIHF1YWxpZmllZCBuYW1lc3BhY2UgZm9yIHRoZSBlbGVtZW50IGF0dHJpYnV0ZQotICAgICAgdHlwZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBhcnRFbCwgIm5hbWUiKSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJ0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRFbGVtZW50TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwYXJ0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwYXJ0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgTWFwIGV4dGVuc2lvbkF0dHJpYnV0ZXMgPSBwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKTsKLQotICAgIGV4dGVuc2lvbkF0dHJpYnV0ZXMucHV0QWxsKGdldFBhcnRBdHRyaWJ1dGVzKHBhcnRFbCwgZGVmKSk7Ci0KLSAgICAvLyBOZWVkIHRvIGRvIHNvbWV0aGluZyBoZXJlIHRvIGxvY2F0ZSBwYXJ0IGRlZmluaXRpb24uCi0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKHBhcnQsIHBhcnRFbCk7Ci0KLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBtYXAgb2YgdGhlIHBhcnQgYXR0cmlidXRlcy4KLSAgICogCi0gICAqIEBwYXJhbSBlbCBUaGUgcGFydCBhdHRyaWJ1dGVzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmludGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIG1hcCBjb250YWluaW5nIHRoZSBwYXJ0IGF0dHJpYnV0ZXMuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE1hcCBnZXRQYXJ0QXR0cmlidXRlcyhFbGVtZW50IGVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBOYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVsLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0cyA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0KLSAgICBmb3IgKGludCBhID0gMDsgYSA8IGF0dHM7IGErKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHJpYnV0ZSA9IChBdHRyKW5vZGVNYXAuaXRlbShhKTsKLSAgICAgIFN0cmluZyBsTmFtZSA9IGF0dHJpYnV0ZS5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIFN0cmluZyBuU3BhY2UgPSBhdHRyaWJ1dGUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gYXR0cmlidXRlLmdldFByZWZpeCgpOwotICAgICAgUU5hbWUgbmFtZSA9IG5ldyBRTmFtZShuU3BhY2UsIGxOYW1lKTsKLQotICAgICAgaWYgKG5TcGFjZSAhPSBudWxsICYmICFuU3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfV1NETCkpCi0gICAgICB7Ci0gICAgICAgIGlmICghblNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hNTE5TKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzdHJWYWx1ZSA9IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOwotICAgICAgICAgIFFOYW1lIHFWYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBxVmFsdWUgPSBET01VdGlscy5nZXRRTmFtZShzdHJWYWx1ZSwgZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHFWYWx1ZSA9IG5ldyBRTmFtZShzdHJWYWx1ZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYXR0cmlidXRlcy5wdXQobmFtZSwgcVZhbHVlKTsKLQotICAgICAgICAgIFN0cmluZyB0ZW1wTlNVcmkgPSBkZWYuZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0KLSAgICAgICAgICB3aGlsZSAodGVtcE5TVXJpICE9IG51bGwgJiYgIXRlbXBOU1VyaS5lcXVhbHMoblNwYWNlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmVmaXggKz0gIl8iOwotICAgICAgICAgICAgdGVtcE5TVXJpID0gZGVmLmdldE5hbWVzcGFjZShwcmVmaXgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGRlZi5hZGROYW1lc3BhY2UocHJlZml4LCBuU3BhY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgIWxOYW1lLmVxdWFscyhDb25zdGFudHMuQVRUUl9OQU1FKQotICAgICAgICAgICYmICFsTmFtZS5lcXVhbHMoQ29uc3RhbnRzLkFUVFJfRUxFTUVOVCkKLSAgICAgICAgICAmJiAhbE5hbWUuZXF1YWxzKENvbnN0YW50cy5BVFRSX1RZUEUpKQotICAgICAgewotICAgICAgICBXU0RMRXhjZXB0aW9uIHdzZGxFeGMgPQotICAgICAgICAgIG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICAgICAgV1NETEV4Y2VwdGlvbi5JTlZBTElEX1dTREwsCi0gICAgICAgICAgICAiRW5jb3VudGVyZWQgaWxsZWdhbCAiCi0gICAgICAgICAgICAgICsgInBhcnQgZXh0ZW5zaW9uICIKLSAgICAgICAgICAgICAgKyAiYXR0cmlidXRlICciCi0gICAgICAgICAgICAgICsgbmFtZQotICAgICAgICAgICAgICArICInLiBFeHRlbnNpb24gIgotICAgICAgICAgICAgICArICJhdHRyaWJ1dGVzIG11c3QgYmUgaW4gIgotICAgICAgICAgICAgICArICJhIG5hbWVzcGFjZSBvdGhlciB0aGFuICIKLSAgICAgICAgICAgICAgKyAiV1NETCdzLiIpOwotCi0gICAgICAgIHdzZGxFeGMuc2V0TG9jYXRpb24oWFBhdGhVdGlscy5nZXRYUGF0aEV4cHJGcm9tTm9kZShlbCkpOwotICAgICAgICAvL3Rocm93IHdzZGxFeGM7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihhdHRyaWJ1dGVzLCBlbCk7Ci0KLSAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gcG9ydFR5cGVFbCBUaGUgcG9ydFR5cGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBwb3J0VHlwZSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBwYXJzZVBvcnRUeXBlKEVsZW1lbnQgcG9ydFR5cGVFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLQotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShwb3J0VHlwZUVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgcG9ydFR5cGVOYW1lID0gbmV3IFFOYW1lKGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZSk7Ci0KLSAgICAgIHBvcnRUeXBlID0gZGVmLmdldFBvcnRUeXBlKHBvcnRUeXBlTmFtZSk7Ci0KLSAgICAgIGlmIChwb3J0VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICBwb3J0VHlwZS5zZXRRTmFtZShwb3J0VHlwZU5hbWUpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIXBvcnRUeXBlLmlzVW5kZWZpbmVkKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIHRoZSBQb3J0VHlwZSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgcHJvZHVjZSBhbiBlcnJvciBhbmQgcmV0dXJuIG51bGwKLSAgICAgICAgYWRkUmVhZGVyRXJyb3IoCi0gICAgICAgICAgZGVmLAotICAgICAgICAgIHBvcnRUeXBlRWwsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9QT1JUVFlQRV9OQU1FX0FMUkVBRFlfREVGSU5FRCIsICInIiArIHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBwb3J0VHlwZSA9IGRlZi5jcmVhdGVQb3J0VHlwZSgpOwotICAgIH0KLQotICAgIC8vIFdoZXRoZXIgaXQgd2FzIHJldHJpZXZlZCBvciBjcmVhdGVkLCB0aGUgZGVmaW5pdGlvbiBoYXMgYmVlbiBmb3VuZC4KLSAgICBwb3J0VHlwZS5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwb3J0VHlwZUVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgcG9ydFR5cGUuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX09QRVJBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbW9kaWZpZWQgc28gZHVwbGljYXRlIG9wZXJhdGlvbnMgd2lsbCBub3QgYmUgYWRkZWQgdG8gcG9ydHR5cGUgCi0gICAgICAgIE9wZXJhdGlvbiBvcCA9IHBhcnNlT3BlcmF0aW9uKHRlbXBFbCwgcG9ydFR5cGUsIGRlZik7Ci0gICAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wKTsKLSAgICAgICAgfQotICAgICAgICAvL3BvcnRUeXBlLmFkZE9wZXJhdGlvbihwYXJzZU9wZXJhdGlvbih0ZW1wRWwsIHBvcnRUeXBlLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gc29tZXRoaW5nIGVsc2UgdGhhdCBzaG91bGRuJ3QgYmUgaGVyZQotICAgICAgICAvLyBORUVEIFRPIEFERCBUTyBFUlJPUiBMSVNUCi0gICAgICAgIC8vRE9NVXRpbHMudGhyb3dXU0RMRXhjZXB0aW9uKHRlbXBFbCk7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXBFbCA9IERPTVV0aWxzLmdldE5leHRTaWJsaW5nRWxlbWVudCh0ZW1wRWwpOwotICAgIH0KLQotICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgc2V0TG9jYXRpb24ocG9ydFR5cGUsIHBvcnRUeXBlRWwpOwotCi0gICAgcmV0dXJuIHBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgc3BlY2lmaWMgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gb3BFbCBUaGUgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBUaGUgcG9ydFR5cGUgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBwYXJzZU9wZXJhdGlvbihFbGVtZW50IG9wRWwsIFBvcnRUeXBlIHBvcnRUeXBlLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE9wZXJhdGlvbiBvcCA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUob3BFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgU3RyaW5nIHBhcmFtZXRlck9yZGVyU3RyID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKG9wRWwsIENvbnN0YW50cy5BVFRSX1BBUkFNRVRFUl9PUkRFUik7Ci0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChvcEVsKTsKLSAgICBMaXN0IG1lc3NhZ2VPcmRlciA9IG5ldyBWZWN0b3IoKTsKLSAgICBFbGVtZW50IGRvY0VsID0gbnVsbDsKLSAgICBJbnB1dCBpbnB1dCA9IG51bGw7Ci0gICAgT3V0cHV0IG91dHB1dCA9IG51bGw7Ci0gICAgTGlzdCBmYXVsdHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICB3aGlsZSAodGVtcEVsICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0RPQ1VNRU5UQVRJT04sIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGRvY0VsID0gdGVtcEVsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU5QVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGlucHV0ID0gcGFyc2VJbnB1dCh0ZW1wRWwsIGRlZik7Ci0gICAgICAgIG1lc3NhZ2VPcmRlci5hZGQoQ29uc3RhbnRzLkVMRU1fSU5QVVQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fT1VUUFVULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBvdXRwdXQgPSBwYXJzZU91dHB1dCh0ZW1wRWwsIGRlZik7Ci0gICAgICAgIG1lc3NhZ2VPcmRlci5hZGQoQ29uc3RhbnRzLkVMRU1fT1VUUFVUKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0ZBVUxULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBmYXVsdHMuYWRkKHBhcnNlRmF1bHQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gaW52YWxpZCBlbGVtZW50IGluIHRoZSBvcGVyYXRpb24KLSAgICAgICAgLy8gWE1MIGNoZWNrIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgaW5wdXROYW1lID0gKGlucHV0ICE9IG51bGwgPyBpbnB1dC5nZXROYW1lKCkgOiBudWxsKTsKLSAgICAgIFN0cmluZyBvdXRwdXROYW1lID0gKG91dHB1dCAhPSBudWxsID8gb3V0cHV0LmdldE5hbWUoKSA6IG51bGwpOwotCi0gICAgICBib29sZWFuIG9wRGVmaW5lZCA9IGZhbHNlOwotCi0gICAgICB0cnkKLSAgICAgIHsKLQotICAgICAgICAvL29wID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9uKG5hbWUsIGlucHV0TmFtZSwgb3V0cHV0TmFtZSk7Ci0KLSAgICAgICAgLy9PcGVyYXRpb24gb3AgPSBudWxsOwotICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25zICE9IG51bGwpCi0gICAgICAgIHsKLQotICAgICAgICAgIEl0ZXJhdG9yIGlPcGVyYXRpb25zID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpT3BlcmF0aW9ucy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBpbnB1dE5hbWVzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gb3V0cHV0TmFtZXNFcXVhbCA9IGZhbHNlOwotICAgICAgICAgICAgT3BlcmF0aW9uIG9wZXIgPSAoT3BlcmF0aW9uKWlPcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChvcGVyLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBJbnB1dCBvcElucHV0ID0gb3Blci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgICBpZiAob3BJbnB1dCAhPSBudWxsICYmIGlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BJbnB1dE5hbWUgPSBvcElucHV0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAob3BJbnB1dE5hbWUgIT0gbnVsbCAmJiBpbnB1dE5hbWUgIT0gbnVsbCAmJiBvcElucHV0TmFtZS5lcXVhbHNJZ25vcmVDYXNlKGlucHV0TmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW5wdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAob3BJbnB1dE5hbWUgPT0gbnVsbCAmJiBpbnB1dE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpbnB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChvcElucHV0ID09IG51bGwgJiYgaW5wdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgT3V0cHV0IG9wT3V0cHV0ID0gb3Blci5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAgICAgaWYgKG9wT3V0cHV0ICE9IG51bGwgJiYgb3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgb3BPdXRwdXROYW1lID0gb3BPdXRwdXQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChvcE91dHB1dE5hbWUgIT0gbnVsbCAmJiBvdXRwdXROYW1lICE9IG51bGwgJiYgb3BPdXRwdXROYW1lLmVxdWFsc0lnbm9yZUNhc2Uob3V0cHV0TmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3V0cHV0TmFtZXNFcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsICYmIG91dHB1dE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvdXRwdXROYW1lc0VxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAob3BPdXRwdXQgPT0gbnVsbCAmJiBvdXRwdXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dE5hbWVzRXF1YWwgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChpbnB1dE5hbWVzRXF1YWwgJiYgb3V0cHV0TmFtZXNFcXVhbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wID0gb3BlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAvKiYmICFvcC5pc1VuZGVmaW5lZCgpKi8KLSAgICAgICAgKQotICAgICAgewotICAgICAgICAvL29wID0gbnVsbDsKLSAgICAgICAgb3BEZWZpbmVkID0gdHJ1ZTsKLQotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiAhb3BEZWZpbmVkKQotICAgICAgewotICAgICAgICBpZiAoaW5wdXROYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJbnB1dCB0ZW1wSW4gPSBvcC5nZXRJbnB1dCgpOwotCi0gICAgICAgICAgaWYgKHRlbXBJbiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0ZW1wSW4uZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vb3AgPSBudWxsOwotICAgICAgICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiAhb3BEZWZpbmVkKQotICAgICAgewotICAgICAgICBpZiAob3V0cHV0TmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgT3V0cHV0IHRlbXBPdXQgPSBvcC5nZXRPdXRwdXQoKTsKLQotICAgICAgICAgIGlmICh0ZW1wT3V0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHRlbXBPdXQuZ2V0TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vb3AgPSBudWxsOwotICAgICAgICAgICAgICBvcERlZmluZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAob3BEZWZpbmVkKQotICAgICAgewotICAgICAgICAvLyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgd2UncmUgZ29pbmcgdG8gcmV0dXJuIG51bGwuCi0gICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgV1NETCAxLjIgd29ya2luZyBkcmFmdCBvcGVyYXRpb24gb3ZlcmxvYWRpbmcgaXMgbm8gbG9uZ2VyIGFsbG93ZWQuCi0gICAgICAgIC8vIEdvaW5nIHRvIHVzZSB0aGF0IGhlcmUgdG8gc2F2ZSBhIGxvdCBvZiB3b3JrCi0gICAgICAgIHNldExvY2F0aW9uKG9wLCBvcEVsKTsKLSAgICAgICAgYWRkUmVhZGVyRXJyb3IoCi0gICAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgICAgb3AsCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICAiX0RVUExJQ0FURV9PUEVSQVRJT05fRk9SX1BPUlRUWVBFIiwKLSAgICAgICAgICAgICInIiArIG9wLmdldE5hbWUoKSArICInIiwKLSAgICAgICAgICAgICInIiArIHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyAiJyIpKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3AgPSBkZWYuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgICAgIG9wLnNldE5hbWUobmFtZSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG9wID0gZGVmLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIH0KLQotICAgIC8vIFdoZXRoZXIgaXQgd2FzIHJldHJpZXZlZCBvciBjcmVhdGVkLCB0aGUgZGVmaW5pdGlvbiBoYXMgYmVlbiBmb3VuZC4KLSAgICBvcC5zZXRVbmRlZmluZWQoZmFsc2UpOwotCi0gICAgaWYgKHBhcmFtZXRlck9yZGVyU3RyICE9IG51bGwpCi0gICAgewotICAgICAgb3Auc2V0UGFyYW1ldGVyT3JkZXJpbmcoU3RyaW5nVXRpbHMucGFyc2VOTVRva2VucyhwYXJhbWV0ZXJPcmRlclN0cikpOwotICAgIH0KLQotICAgIGlmIChkb2NFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wLnNldERvY3VtZW50YXRpb25FbGVtZW50KGRvY0VsKTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcC5zZXRJbnB1dChpbnB1dCk7Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgIHsKLSAgICAgIG9wLnNldE91dHB1dChvdXRwdXQpOwotICAgIH0KLQotICAgIGlmIChmYXVsdHMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBmYXVsdEl0ZXJhdG9yID0gZmF1bHRzLml0ZXJhdG9yKCk7Ci0KLSAgICAgIHdoaWxlIChmYXVsdEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRmF1bHQgZiA9IChGYXVsdClmYXVsdEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgLy8gaWYgdGhlIGZhdWx0IGlzbid0IGRlZmluZWQgeWV0Ci0gICAgICAgIGlmIChvcC5nZXRGYXVsdChmLmdldE5hbWUoKSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG9wLmFkZEZhdWx0KGYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGFkZFJlYWRlckVycm9yKAotICAgICAgICAgICAgb3AsCi0gICAgICAgICAgICBmLAotICAgICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoIl9EVVBMSUNBVEVfRkFVTFRfTkFNRSIsICInIiArIGYuZ2V0TmFtZSgpICsgIiciLCAiJyIgKyBvcC5nZXROYW1lKCkgKyAiJyIpKTsKLSAgICAgICAgICAvL2ZhdWx0RXJyb3JzLmFkZChuZXcgT2JqZWN0W117ZiwiRHVwbGljYXRlIE5hbWUiLG9wfSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBPcGVyYXRpb25UeXBlIHN0eWxlID0gbnVsbDsKLQotICAgIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX09ORV9XQVkpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5PTkVfV0FZOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX1JFUVVFU1RfUkVTUE9OU0UpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX1NPTElDSVRfUkVTUE9OU0UpKQotICAgIHsKLSAgICAgIHN0eWxlID0gT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFOwotICAgIH0KLSAgICBlbHNlIGlmIChtZXNzYWdlT3JkZXIuZXF1YWxzKFNUWUxFX05PVElGSUNBVElPTikpCi0gICAgewotICAgICAgc3R5bGUgPSBPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAoc3R5bGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcC5zZXRTdHlsZShzdHlsZSk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihvcCwgb3BFbCk7Ci0KLSAgICAvLyBtb2RpZmllZCB0byByZW1vdmUgZHVwbGljYXRlIG9wZXJhdGlvbnMKLSAgICAvLyAgICBpZihvcERlZmluZWQpCi0gICAgLy8gICAgewotICAgIC8vICAgICAgYWRkUmVhZGVyRXJyb3IocG9ydFR5cGUsb3AsVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfRFVQTElDQVRFX09QRVJBVElPTl9GT1JfUE9SVFRZUEUiLCInIitvcC5nZXROYW1lKCkrIiciLCInIitwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKyInIikpOwotICAgIC8vICAgICAgcmV0dXJuIG51bGw7Ci0gICAgLy8gICAgfQotICAgIHJldHVybiBvcDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHNlcnZpY2UgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBzZXJ2aWNlRWwgVGhlIHNlcnZpY2UgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBzZXJ2aWNlIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2UgcGFyc2VTZXJ2aWNlKEVsZW1lbnQgc2VydmljZUVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFNlcnZpY2Ugc2VydmljZSA9IGRlZi5jcmVhdGVTZXJ2aWNlKCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoc2VydmljZUVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2VydmljZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBuYW1lKSk7Ci0gICAgfQotICAgIFNlcnZpY2UgczsKLSAgICAvLyBhIHNlcnZpY2Ugd2l0aCB0aGlzIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkCi0gICAgaWYgKChzID0gZGVmLmdldFNlcnZpY2Uoc2VydmljZS5nZXRRTmFtZSgpKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhZGRSZWFkZXJFcnJvcigKLSAgICAgICAgZGVmLAotICAgICAgICBzZXJ2aWNlRWwsCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKCJfU0VSVklDRV9OQU1FX0FMUkVBRFlfREVGSU5FRCIsICInIiArIHMuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArICInIikpOwotICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoc2VydmljZUVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZS5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fUE9SVCwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgc2VydmljZS5hZGRQb3J0KHBhcnNlUG9ydCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXJ2aWNlLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU2VydmljZS5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihzZXJ2aWNlLCBzZXJ2aWNlRWwpOwotCi0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIHBvcnQgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBwb3J0RWwgVGhlIHBvcnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgcG9ydCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBQb3J0IHBhcnNlUG9ydChFbGVtZW50IHBvcnRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBQb3J0IHBvcnQgPSBkZWYuY3JlYXRlUG9ydCgpOwotICAgIFN0cmluZyBuYW1lID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBvcnRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgYmluZGluZ1N0cjsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiaW5kaW5nU3RyID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUocG9ydEVsLCBDb25zdGFudHMuQVRUUl9CSU5ESU5HLCBDb25zdGFudHMuRUxFTV9QT1JULCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL3RoZSBjYWxsIGFib3ZlIGZhaWxzIGlmIHRoZXJlIGlzIG5vIHF1YWxpZmllZCBuYW1lc3BhY2UgZm9yIHRoZSBtZXNzYWdlIG5hbWUKLSAgICAgIGJpbmRpbmdTdHIgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKHBvcnRFbCwgImJpbmRpbmciKSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwb3J0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGJpbmRpbmdTdHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSBkZWYuZ2V0QmluZGluZyhiaW5kaW5nU3RyKTsKLQotICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZyA9IGRlZi5jcmVhdGVCaW5kaW5nKCk7Ci0gICAgICAgIGJpbmRpbmcuc2V0UU5hbWUoYmluZGluZ1N0cik7Ci0gICAgICAgIGRlZi5hZGRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgfQotCi0gICAgICBwb3J0LnNldEJpbmRpbmcoYmluZGluZyk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwb3J0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHBvcnQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQocGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChQb3J0LmNsYXNzLCB0ZW1wRWwsIGRlZikpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKHBvcnQsIHBvcnRFbCk7Ci0KLSAgICByZXR1cm4gcG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRUeXBlIFRoZSBwYXJlbnQgdHlwZSBvZiB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgKiBAcGFyYW0gZWwgVGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmlsaXR5RWxlbWVudCBwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KENsYXNzIHBhcmVudFR5cGUsIEVsZW1lbnQgZWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBRTmFtZSBlbGVtZW50VHlwZSA9IFFOYW1lVXRpbHMubmV3UU5hbWUoZWwpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0UmVnID0gZGVmLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgICAgIGlmIChleHRSZWcgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oCi0gICAgICAgICAgV1NETEV4Y2VwdGlvbi5DT05GSUdVUkFUSU9OX0VSUk9SLAotICAgICAgICAgICJObyBFeHRlbnNpb25SZWdpc3RyeSBzZXQgZm9yIHRoaXMgIgotICAgICAgICAgICAgKyAiRGVmaW5pdGlvbiwgc28gdW5hYmxlIHRvIGRlc2VyaWFsaXplICIKLSAgICAgICAgICAgICsgImEgJyIKLSAgICAgICAgICAgICsgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICsgIicgZWxlbWVudCBpbiB0aGUgIgotICAgICAgICAgICAgKyAiY29udGV4dCBvZiBhICciCi0gICAgICAgICAgICArIHBhcmVudFR5cGUuZ2V0TmFtZSgpCi0gICAgICAgICAgICArICInLiIpOwotICAgICAgfQotCi0gICAgICBFeHRlbnNpb25EZXNlcmlhbGl6ZXIgZXh0RFMgPSBleHRSZWcucXVlcnlEZXNlcmlhbGl6ZXIocGFyZW50VHlwZSwgZWxlbWVudFR5cGUpOwotCi0gICAgICAvLyBhc2lnbiB0aGUgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdG8gYSB2YXIgc28gd2UgY2FuIGFkZCBpdCB0byB0aGUgbG9jYXRpb25zCi0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gZXh0RFMudW5tYXJzaGFsbChwYXJlbnRUeXBlLCBlbGVtZW50VHlwZSwgZWwsIGRlZiwgZXh0UmVnKTsKLSAgICAgIC8vIGFkZCB0aGUgbG9jYXRpb24gb2YgdGhpcyBlbGVtZW50IHRvIGVsZW1lbnRMb2NhdGlvbnMgCi0gICAgICAvLyB0aGlzIG1pZ2h0IG5vdCB3b3JrIHByb3Blcmx5Ci0gICAgICBzZXRMb2NhdGlvbihleHRFbGVtLCBlbCk7Ci0KLSAgICAgIC8vIHJlZ2lzdGVyIGFsbCBvZiB0aGUgY2hpbGQgRWxlbWVudHMgc28gd2UgY2FuIGZpbmQgdGhlbSBsYXRlcgotICAgICAgLy8gdXNlZCBmb3IgaW5saW5lIHNjaGVtYSB2YWxpZGF0aW9uCi0gICAgICByZWdpc3RlckNoaWxkRWxlbWVudHMoZXh0RWxlbSk7Ci0KLSAgICAgIHJldHVybiBleHRFbGVtOwotICAgIH0KLSAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGlmIChlLmdldExvY2F0aW9uKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZS5zZXRMb2NhdGlvbihYUGF0aFV0aWxzLmdldFhQYXRoRXhwckZyb21Ob2RlKGVsKSk7Ci0gICAgICB9Ci0gICAgICB0aHJvdyBlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIGlucHV0IGVsZW1lbnQuCi0gICAqIAotICAgKiBAcGFyYW0gaW5wdXRFbCBUaGUgaW5wdXQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBpbnB1dCBlbGVtZW50LgotICAgKiBAdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBJbnB1dCBwYXJzZUlucHV0KEVsZW1lbnQgaW5wdXRFbCwgRGVmaW5pdGlvbiBkZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLQotICAgIElucHV0IGlucHV0ID0gZGVmLmNyZWF0ZUlucHV0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoaW5wdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoaW5wdXRFbCwgQ29uc3RhbnRzLkFUVFJfTUVTU0FHRSwgQ29uc3RhbnRzLkVMRU1fSU5QVVQsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIG1lc3NhZ2UgbmFtZQotICAgICAgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGlucHV0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgaW5wdXQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZU5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBkZWYuZ2V0TWVzc2FnZShtZXNzYWdlTmFtZSk7Ci0KLSAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBkZWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBtZXNzYWdlLnNldFFOYW1lKG1lc3NhZ2VOYW1lKTsKLSAgICAgICAgZGVmLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlucHV0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChpbnB1dEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gWE1MIFZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGlzCi0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGlucHV0LCBpbnB1dEVsKTsKLQotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHNwZWNpZmljIG91dHB1dCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIG91dHB1dEVsIFRoZSBvdXRwdXQgZWxlbWVudC4KLSAgICogQHBhcmFtIGRlZiBUaGUgZGVmaW50aW9ucyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgV1NETCBvdXRwdXQgZWxlbWVudC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgT3V0cHV0IHBhcnNlT3V0cHV0KEVsZW1lbnQgb3V0cHV0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgT3V0cHV0IG91dHB1dCA9IGRlZi5jcmVhdGVPdXRwdXQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShvdXRwdXRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUob3V0cHV0RWwsIENvbnN0YW50cy5BVFRSX01FU1NBR0UsIENvbnN0YW50cy5FTEVNX09VVFBVVCwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy90aGUgY2FsbCBhYm92ZSBmYWlscyBpZiB0aGVyZSBpcyBubyBxdWFsaWZpZWQgbmFtZXNwYWNlIGZvciB0aGUgbWVzc2FnZSBuYW1lCi0gICAgICBtZXNzYWdlTmFtZSA9IG5ldyBRTmFtZShudWxsLCBET01VdGlscy5nZXRBdHRyaWJ1dGUob3V0cHV0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgb3V0cHV0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKG1lc3NhZ2VOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgTWVzc2FnZSBtZXNzYWdlID0gZGVmLmdldE1lc3NhZ2UobWVzc2FnZU5hbWUpOwotCi0gICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBtZXNzYWdlID0gZGVmLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgbWVzc2FnZS5zZXRRTmFtZShtZXNzYWdlTmFtZSk7Ci0gICAgICAgIGRlZi5hZGRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgfQotCi0gICAgICBvdXRwdXQuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBFbGVtZW50IHRlbXBFbCA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KG91dHB1dEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFhNTCBWYWxpZGF0aW9uIHdpbGwgY2F0Y2ggdGhpcwotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24odGVtcEVsKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgLy8gYWRkIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGVsZW1lbnQgdG8gZWxlbWVudExvY2F0aW9ucyAKLSAgICBzZXRMb2NhdGlvbihvdXRwdXQsIG91dHB1dEVsKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzcGVjaWZpYyBmYXVsdCBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGZhdWx0RWwgVGhlIGZhdWx0IGVsZW1lbnQgdG8gcGFyc2UuCi0gICAqIEBwYXJhbSBkZWYgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gQSBXU0RMIGZhdWx0IGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIEZhdWx0IHBhcnNlRmF1bHQoRWxlbWVudCBmYXVsdEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEZhdWx0IGZhdWx0ID0gZGVmLmNyZWF0ZUZhdWx0KCk7Ci0gICAgU3RyaW5nIG5hbWUgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZmF1bHRFbCwgQ29uc3RhbnRzLkFUVFJfTkFNRSk7Ci0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIG1lc3NhZ2VOYW1lID0gRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoZmF1bHRFbCwgQ29uc3RhbnRzLkFUVFJfTUVTU0FHRSwgQ29uc3RhbnRzLkVMRU1fSU5QVVQsIGZhbHNlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vdGhlIGNhbGwgYWJvdmUgZmFpbHMgaWYgdGhlcmUgaXMgbm8gcXVhbGlmaWVkIG5hbWVzcGFjZSBmb3IgdGhlIG1lc3NhZ2UgbmFtZQotICAgICAgbWVzc2FnZU5hbWUgPSBuZXcgUU5hbWUobnVsbCwgRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGZhdWx0RWwsICJtZXNzYWdlIikpOwotICAgIH0KLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgZmF1bHQuc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZU5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBkZWYuZ2V0TWVzc2FnZShtZXNzYWdlTmFtZSk7Ci0KLSAgICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBkZWYuY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICBtZXNzYWdlLnNldFFOYW1lKG1lc3NhZ2VOYW1lKTsKLSAgICAgICAgZGVmLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZhdWx0LnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChmYXVsdEVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgZmF1bHQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodGVtcEVsKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gWE1MIFZhbGlkYXRpb24gd2lsbCBjYXRjaCB0aGlzCi0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIGxvY2F0aW9uIG9mIHRoaXMgZWxlbWVudCB0byBlbGVtZW50TG9jYXRpb25zIAotICAgIHNldExvY2F0aW9uKGZhdWx0LCBmYXVsdEVsKTsKLQotICAgIHJldHVybiBmYXVsdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgbWVzc2FnZWdlbmVyYXRvciBmb3IgdGhlIHJlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZyBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1nKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1nOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB0aGUgcmVmT2JqZWN0IHRvIHRoZSBlbGVtZW50TG9jYXRpb24gaGFzaHRhYmxlIHdpdGggdGhlIGxvY2F0aW9uIGRlZmluZWQgaW4gZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSByZWZPYmplY3QgVGhlIG9iamVjdCB0byBhZGQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TG9jYXRpb24oT2JqZWN0IHJlZk9iamVjdCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRWxlbWVudEltcGwgZWxlbWVudEltcGwgPSAoRWxlbWVudEltcGwpZWxlbWVudDsKLSAgICAgIEVsZW1lbnRMb2NhdGlvbiBlbGVtZW50TG9jYXRpb24gPSAoRWxlbWVudExvY2F0aW9uKWVsZW1lbnRJbXBsLmdldFVzZXJEYXRhKEVsZW1lbnRMb2NhdGlvbi5JRCk7Ci0gICAgICBpZiAoZWxlbWVudExvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0KLSAgICAgICAgZWxlbWVudExvY2F0aW9ucy5wdXQoCi0gICAgICAgICAgcmVmT2JqZWN0LAotICAgICAgICAgIG5ldyBMb2NhdGlvbkhvbGRlcihlbGVtZW50TG9jYXRpb24uZ2V0TGluZU51bWJlcigpLCBlbGVtZW50TG9jYXRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKSkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotICAvKioKLSAgICogQWRkIGEgcmVhZGVyIGVycm9yIHRvIHRoZSBsaXN0LgotICAgKiAKLSAgICogQHBhcmFtIHBhcmVudG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGVycm9yLgotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlYWRlckVycm9yKE9iamVjdCBwYXJlbnRvYmplY3QsIE9iamVjdCBvYmplY3QsIFN0cmluZyBlcnJvcikKLSAgewotICAgIHJlYWRlckVycm9ycy5hZGQobmV3IFJlYWRlckVycm9yKHBhcmVudG9iamVjdCwgb2JqZWN0LCBlcnJvcikpOwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgcmVhZGVyIHdhcm5pbmcgdG8gdGhlIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50b2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgZXJyb3IuCi0gICAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCB3aXRoIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIHdhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFJlYWRlcldhcm5pbmcoT2JqZWN0IHBhcmVudG9iamVjdCwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIHdhcm5pbmcpCi0gIHsKLSAgICByZWFkZXJXYXJuaW5ncy5hZGQobmV3IFJlYWRlckVycm9yKHBhcmVudG9iamVjdCwgb2JqZWN0LCB3YXJuaW5nKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWdpc3RlciBhbGwgb2YgdGhlIGxvY2F0aW9ucyBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGV4dGVuc2liaWxpdHkKLSAgICogZWxlbWVudCBnaXZlbi4KLSAgICogCi0gICAqIEBwYXJhbSBleHRFbGVtIFRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgd2hvc2UgY2hpbGQgZWxlbWVudHMgd2lsbCBiZSByZWdpc3RlcmVkLgotICAgKi8KLQotICBwcm90ZWN0ZWQgdm9pZCByZWdpc3RlckNoaWxkRWxlbWVudHMoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSkKLSAgewotICAgIC8vIG9ubHkgYWRkIHRob3NlIHRoYXQgYXJlIG9mIHR5cGUgdW5rbm93bi4gaWYgdGhleSdyZSBrbm93biB0aGV5IAotICAgIC8vIHdpbGwgdGFrZSBjYXJlIG9mIHRoZW1zZWx2ZXMKLSAgICBpZiAoZXh0RWxlbSBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW0gPSAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtKS5nZXRFbGVtZW50KCk7Ci0gICAgICByZWdpc3RlckNoaWxkRWxlbWVudHNSZWN1cnNpdmVseShlbGVtKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhlIGxvY2F0aW9uIG9mIGFsbCBvZiB0aGUgY2hpbGQgZWxlbWVudHMgb2YgZWxlbS4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHdob3NlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgcmVnaXN0ZXJlZC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQ2hpbGRFbGVtZW50c1JlY3Vyc2l2ZWx5KEVsZW1lbnQgZWxlbSkKLSAgewotICAgIGlmIChlbGVtIGluc3RhbmNlb2YgRWxlbWVudE5TSW1wbCkKLSAgICB7Ci0gICAgICBzZXRMb2NhdGlvbihlbGVtLCBlbGVtKTsKLQotICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpIHx8IGkgPCA1OyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICAgIHJlZ2lzdGVyQ2hpbGRFbGVtZW50c1JlY3Vyc2l2ZWx5KGNoaWxkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAvKioKLSAgICogQ2hlY2sgdGhhdCBhbiBlbGVtZW50IG5hbWUgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBlbCBUaGUgZWxlbWVudCB3aXRoIHRoZSBuYW1lIHRvIGNoZWNrLgotICAgKiBAcGFyYW0gcW5hbWUgVGhlIG5hbWUgdG8gY2hlY2sgYWdhaW5zdC4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRWxlbWVudE5hbWUoRWxlbWVudCBlbCwgUU5hbWUgcW5hbWUpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIVFOYW1lVXRpbHMubWF0Y2hlcyhxbmFtZSwgZWwpKQotICAgIHsKLSAgICAgIFdTRExFeGNlcHRpb24gd3NkbEV4YyA9IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uSU5WQUxJRF9XU0RMLCAiRXhwZWN0ZWQgZWxlbWVudCAnIiArIHFuYW1lICsgIicuIik7Ci0KLSAgICAgIHdzZGxFeGMuc2V0TG9jYXRpb24oWFBhdGhVdGlscy5nZXRYUGF0aEV4cHJGcm9tTm9kZShlbCkpOwotCi0gICAgICB0aHJvdyB3c2RsRXhjOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZWxlbWVudCBsb2NhdGlvbnMgaGFzaHRhYmxlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZWxlbWVudCBsb2NhdGlvbnMgaGFzaHRhYmxlLgotICAgKi8KLSAgcHVibGljIEhhc2h0YWJsZSBnZXRFbGVtZW50TG9jYXRpb25zKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50TG9jYXRpb25zOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSByZWFkZXIgZXJyb3JzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgcmVhZGVyIGVycm9ycy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFJlYWRlckVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gcmVhZGVyRXJyb3JzOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHJlYWRlciB3YXJuaW5ncy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHJlYWRlciB3YXJuaW5ncy4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFJlYWRlcldhcm5pbmdzKCkKLSAgewotICAgIHJldHVybiByZWFkZXJXYXJuaW5nczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExSZWFkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMUmVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTZlY2Q2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTRExSZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5MaW5lTnVtYmVyRE9NUGFyc2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBBIFdTREwgcmVhZGVyIHRoYXQgc3VwcG9ydHMgY3ljbGljIFdTREwgaW1wb3J0cywgc2NoZW1hIGltcG9ydHMgYW5kIGlubGluZSBzY2hlbWFzLgotICogVGhpcyByZWFkZXIgaXMgYmFzZWQgb24gdGhlIFdTRExSZWFkZXJJbXBsIGZyb20gV1NETDRKLiAKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZWFkZXJJbXBsCi17Ci0gIHByb3RlY3RlZCBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VnZW5lcmF0b3I7Ci0gIHByb3RlY3RlZCBJV1NETDExVmFsaWRhdGlvbkluZm8gd3NkbHZhbGluZm87Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbHZhbGluZm8gVGhlIFdTREwgMS4xIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIFdTRExSZWFkZXJJbXBsKElXU0RMMTFWYWxpZGF0aW9uSW5mbyB3c2RsdmFsaW5mbykKLSAgewotICAgIHRoaXMud3NkbHZhbGluZm8gPSB3c2RsdmFsaW5mbzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFBhcnNlIHRoZSByb290IGRvY3VtZW50LiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgYWxsIGltcG9ydHMgYW5kIHBhcnNlIHRoZW0gYXMgCi0gICAqIHdlbGwgY3JlYXRpbmcgYSBXU0RMRG9jdW1lbnQgZm9yIGVhY2ggdW5pcXVlIFdTREwgZmlsZS4gVGhpcyBtZXRob2Qgc3VwcG9ydHMKLSAgICogY3ljbGljIFdTREwgaW1wb3J0IHN0YXRlbWVudHMgc3VjaCB0aGF0IGZpbGUgQSBjYW4gaW1wb3J0IGZpbGUgQiBhbmQgZmlsZSBCCi0gICAqIGNhbiBpbXBvcnQgZmlsZSBBLgotICAgKiAKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSBUaGUgYmFzZSBVUkkgb2YgdGhlIHJvb3QgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBkZWZFbCBUaGUgZGVmaW5pdGlvbiBlbGVtZW50IG9mIHRoZSByb290IGRvY3VtZW50LgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdTRExEb2N1bWVudHMgY29udGFpbmluZyBhbGwgb2YgdGhlIHVuaXF1ZSBmaWxlcyBpbiB0aGUgZGVzY3JpcHRpb24uCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExEb2N1bWVudFtdIHBhcnNlRG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50QmFzZVVSSSwgRWxlbWVudCBkZWZFbCkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIGludCBpbml0aWFsSW1wb3J0QXJyYXlTaXplID0gMjA7Ci0gICAgTGlzdFtdIGZpbGVzQXREZXB0aCA9IG5ldyBBcnJheUxpc3RbaW5pdGlhbEltcG9ydEFycmF5U2l6ZV07Ci0gICAgTWFwIGZpbGVzSW1wb3J0aW5nID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIFNvcnRlZFNldCBwYXJzZWRJbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBTb3J0ZWRTZXQgaW1wb3J0c1RvUGFyc2UgPSBuZXcgVHJlZVNldCgpOwotICAgIGludCBtYXhkZXB0aCA9IDA7Ci0KLSAgICBXU0RMRG9jdW1lbnQgcm9vdGRvYyA9IG5ldyBXU0RMRG9jdW1lbnQoZG9jdW1lbnRCYXNlVVJJLCBkZWZFbCwgMCwgbWVzc2FnZWdlbmVyYXRvciwgd3NkbHZhbGluZm8pOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSByb290ZG9jLmdldERlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBJbXBvcnRIb2xkZXIgcm9vdEltcG9ydCA9IG5ldyBJbXBvcnRIb2xkZXIodGFyZ2V0TmFtZXNwYWNlLCBkb2N1bWVudEJhc2VVUkksIGRvY3VtZW50QmFzZVVSSSwgcm9vdGRvYywgMCwgbnVsbCwgbWVzc2FnZWdlbmVyYXRvciwgd3NkbHZhbGluZm8pOwotICAgIHJvb3RJbXBvcnQuY3JlYXRlV1NETEltcG9ydChyb290ZG9jKTsKLSAgICBwYXJzZWRJbXBvcnRzLmFkZChyb290SW1wb3J0KTsKLSAgICBMaXN0IHJvb3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZpbGVzSW1wb3J0aW5nLnB1dChyb290SW1wb3J0LmdldExvY2F0aW9uKCksIG5ldyBBcnJheUxpc3QoKSk7Ci0gICAgcm9vdExpc3QuYWRkKHJvb3Rkb2MpOwotICAgIGZpbGVzQXREZXB0aFswXSA9IHJvb3RMaXN0OwotICAgIGltcG9ydHNUb1BhcnNlLmFkZEFsbChyb290ZG9jLmdldEltcG9ydHMoKSk7Ci0gICAgU2V0IGltcHMgPSByb290ZG9jLmdldEltcG9ydHMoKTsKLSAgICBJdGVyYXRvciBpbXBJdGVyID0gaW1wcy5pdGVyYXRvcigpOwotICAgIHdoaWxlKGltcEl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEltcG9ydEhvbGRlciBpbXAgPSAoSW1wb3J0SG9sZGVyKWltcEl0ZXIubmV4dCgpOwotICAgICAgTGlzdCB0ZW1wTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRlbXBMaXN0LmFkZChpbXAuZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICBmaWxlc0ltcG9ydGluZy5wdXQoaW1wLmdldExvY2F0aW9uKCksIHRlbXBMaXN0KTsKLSAgICB9Ci0gICAgCi0gICAgd2hpbGUoIWltcG9ydHNUb1BhcnNlLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBJbXBvcnRIb2xkZXIgaW1wID0gKEltcG9ydEhvbGRlcilpbXBvcnRzVG9QYXJzZS5maXJzdCgpOwotICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gaW5pdGlhbGl6ZSB0aGUgaW1wb3J0IGhlcmUgc28gZWFjaCBpbXBvcnQKLSAgICAgIC8vIGlzIG9ubHkgY3JlYXRlZCBvbmNlLiBJbiB0aGUgY2FzZSBvZiByZWNpcHJpY2FsIGltcG9ydHMgdGhpcwotICAgICAgLy8gYXZvaWRzIGFuIGluZmluaXRlIGxvb3AuCi0gICAgICBpbXAuaW5pdGlhbGl6ZSgpOwotICAgICAgV1NETERvY3VtZW50IGltcERvYyA9IGltcC5nZXRXU0RMRG9jdW1lbnQoKTsKLSAgICAgIAotICAgICAgaW1wb3J0c1RvUGFyc2UucmVtb3ZlKGltcCk7Ci0gICAgICAKLSAgICAgIHBhcnNlZEltcG9ydHMuYWRkKGltcCk7Ci0gICAgICAKLSAgICAgIC8vIEFkZCBuZXcgaW1wb3J0cyB0byB0aGUgbGlzdCBvZiBpbXBvcnRzIHRvIHBhcnNlLgotICAgICAgLy8gUmVtb3ZlIGFsbCB0aGUgaW1wb3J0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHBhcnNlZC4KLSAgICAgIGlmKGltcERvYyAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBJbmNyZWF0ZSBpbXBvcnQgYXJyYXkgaWYgbmVjZXNzYXJ5LgotICAgICAgICBpZihpbXAuZ2V0RGVwdGgoKSA+PSBpbml0aWFsSW1wb3J0QXJyYXlTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdFtdIHRlbXBBcnJheSA9IG5ldyBMaXN0W2ZpbGVzQXREZXB0aC5sZW5ndGggKyBpbml0aWFsSW1wb3J0QXJyYXlTaXplXTsKLSAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZpbGVzQXREZXB0aCwgMCwgdGVtcEFycmF5LCAwLCBmaWxlc0F0RGVwdGgubGVuZ3RoKTsKLSAgICAgICAgICBmaWxlc0F0RGVwdGggPSB0ZW1wQXJyYXk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGZvciB0aGUgZGVwdGggaWYgbmVjZXNzYXJ5LgotICAgICAgICBpbnQgaW1wRGVwdGggPSBpbXAuZ2V0RGVwdGgoKTsKLSAgICAgICAgaWYoZmlsZXNBdERlcHRoW2ltcERlcHRoXSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYobWF4ZGVwdGggPCBpbXBEZXB0aCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhkZXB0aCA9IGltcERlcHRoOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaWxlc0F0RGVwdGhbaW1wRGVwdGhdID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbGVzQXREZXB0aFtpbXAuZ2V0RGVwdGgoKV0uYWRkKGltcERvYyk7Ci0gICAgICAgIAotICAgICAgICBTZXQgaW1wb3J0cyA9IGltcERvYy5nZXRJbXBvcnRzKCk7Ci0gICAgICAgIEltcG9ydEhvbGRlcltdIGltcG9ydHNBcnJheSA9IChJbXBvcnRIb2xkZXJbXSlpbXBvcnRzLnRvQXJyYXkobmV3IEltcG9ydEhvbGRlcltpbXBvcnRzLnNpemUoKV0pOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaW1wb3J0c0FycmF5Lmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgSW1wb3J0SG9sZGVyIGloID0gaW1wb3J0c0FycmF5W2ldOwotICAgICAgICAgIC8vIElmIGFscmVhZHkgcGFyc2VkLCBhZGQgdGhlIGRlZmluaXRpb24gaW1wb3J0aW5nIHRoaXMgZmlsZSB0byB0aGUgbGlzdC4KLSAgICAgICAgICBpZihmaWxlc0ltcG9ydGluZy5jb250YWluc0tleShpaC5nZXRMb2NhdGlvbigpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAoKExpc3QpZmlsZXNJbXBvcnRpbmcuZ2V0KGloLmdldExvY2F0aW9uKCkpKS5hZGQoaWguZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIE90aGVyd2lzZSBhZGQgaXQgdG8gdGhlIGxpc3QgdG8gcGFyc2UuCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFkZCB0aGlzIGltcG9ydCB0byB0aGUgbGlzdCBvZiBmaWxlcyBpbXBvcnRpbmcgbGlzdC4KLSAgICAgICAgICAgIExpc3QgdGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICB0ZW1wTGlzdC5hZGQoaWguZ2V0SW1wb3J0aW5nRG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICBmaWxlc0ltcG9ydGluZy5wdXQoaWguZ2V0TG9jYXRpb24oKSwgdGVtcExpc3QpOwotICAgICAgICAgICAgaW1wb3J0c1RvUGFyc2UuYWRkKGloKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gQWRkIGFsbCBvZiB0aGUgaW1wb3J0cyB0byB0aGUgcmVzcGVjdGl2ZSBkb2N1bWVudHMuCi0gICAgSXRlcmF0b3IgaW1wb3J0RWxlbWVudHNJdGVyID0gcGFyc2VkSW1wb3J0cy5pdGVyYXRvcigpOwotICAgIHdoaWxlKGltcG9ydEVsZW1lbnRzSXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgSW1wb3J0SG9sZGVyIGltcCA9IChJbXBvcnRIb2xkZXIpaW1wb3J0RWxlbWVudHNJdGVyLm5leHQoKTsKLSAgICAgIExpc3QgZmlsZXMgPSAoTGlzdClmaWxlc0ltcG9ydGluZy5nZXQoaW1wLmdldExvY2F0aW9uKCkpOwotICAgICAgSXRlcmF0b3IgZmlsZXNJdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGZpbGVzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWZpbGVzSXRlci5uZXh0KCk7Ci0gICAgICAgIAotICAgICAgICBEZWZpbml0aW9uSW1wbCBkZWYgPSAoRGVmaW5pdGlvbkltcGwpZG9jLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgSW1wb3J0IGltcEVsZW0gPSBpbXAuZ2V0SW1wb3J0KCk7Ci0gICAgICAgIGlmKGltcEVsZW0gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGRlZi5hZGRJbXBvcnQoaW1wRWxlbSk7Ci0gICAgICAgICAgaWYoIWltcC5pc1dTRExGaWxlSW1wb3J0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9jLmFkZFNjaGVtYXMoaW1wLmdldFNjaGVtYXMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBQYXJzZSB0aGUgV1NETCBkb2N1bWVudHMuCi0gICAgLy8gUGFyc2UgdGhlIE1lc3NhZ2VzLgotICAgIGZvcihpbnQgaSA9IG1heGRlcHRoOyBpID49MDsgaS0tKQotICAgIHsKLSAgICAgIExpc3QgZG9jcyA9IGZpbGVzQXREZXB0aFtpXTsKLSAgICAgIEl0ZXJhdG9yIGRvY3NJdGVyID0gZG9jcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUoZG9jc0l0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBXU0RMRG9jdW1lbnQgZG9jID0gKFdTRExEb2N1bWVudClkb2NzSXRlci5uZXh0KCk7Ci0gICAgICAgIGRvYy5wYXJzZU1lc3NhZ2VzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFBhcnNlIHRoZSBQb3J0dHlwZXMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlUG9ydHR5cGVzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFBhcnNlIHRoZSBCaW5kaW5ncy4KLSAgICBmb3IoaW50IGkgPSBtYXhkZXB0aDsgaSA+PTA7IGktLSkKLSAgICB7Ci0gICAgICBMaXN0IGRvY3MgPSBmaWxlc0F0RGVwdGhbaV07Ci0gICAgICBJdGVyYXRvciBkb2NzSXRlciA9IGRvY3MuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlKGRvY3NJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IGRvYyA9IChXU0RMRG9jdW1lbnQpZG9jc0l0ZXIubmV4dCgpOwotICAgICAgICBkb2MucGFyc2VCaW5kaW5ncygpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBQYXJzZSB0aGUgU2VydmljZXMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlU2VydmljZXMoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUGFyc2UgdGhlIEV4dGVuc2liaWxpdHkgRWxlbWVudHMuCi0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgZG9jLnBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIExpc3Qgd3NkbERvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yKGludCBpID0gbWF4ZGVwdGg7IGkgPj0wOyBpLS0pCi0gICAgewotICAgICAgTGlzdCBkb2NzID0gZmlsZXNBdERlcHRoW2ldOwotICAgICAgSXRlcmF0b3IgZG9jc0l0ZXIgPSBkb2NzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShkb2NzSXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCBkb2MgPSAoV1NETERvY3VtZW50KWRvY3NJdGVyLm5leHQoKTsKLSAgICAgICAgd3NkbERvY3MuYWRkKGRvYyk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiAoV1NETERvY3VtZW50W10pd3NkbERvY3MudG9BcnJheShuZXcgV1NETERvY3VtZW50W3dzZGxEb2NzLnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGlucHV0U291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIGRvY3VtZW50IGJlaW5nIHJldHJpZXZlZC4KLSAgICogQHBhcmFtIGRlc2MgVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkb2N1bWVudCBiZWluZyByZXRyaWV2ZWQuCi0gICAqIEByZXR1cm4gVGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgU3RyaW5nIGRlc2MpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24oKQotICAgICAgewotICAgICAgICBwcm90ZWN0ZWQgWE1MRXJyb3JSZXBvcnRlciBjcmVhdGVFcnJvclJlcG9ydGVyKCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWE1MRXJyb3JSZXBvcnRlcigpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgT2JqZWN0W10gYXJndW1lbnRzLCBzaG9ydCBzZXZlcml0eSkgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBib29sZWFuIHJlcG9ydEVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoIlByZW1hdHVyZUVPRiIpKQotICAgICAgICAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlcG9ydEVycm9yID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIucmVwb3J0RXJyb3IoZG9tYWluLCBrZXksIGFyZ3VtZW50cywgc2V2ZXJpdHkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIAotICAgICAgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKQotICAgICAgewotICAgICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjd2FybmluZyhvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotICAgICAgICAgIH0KLSAgICAgIH07Ci0KLSAgICAgIERPTVBhcnNlciBidWlsZGVyID0gbmV3IExpbmVOdW1iZXJET01QYXJzZXIoY29uZmlndXJhdGlvbik7Ci0gICAgICBidWlsZGVyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotICAgICAgYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmdldERvY3VtZW50KCk7Ci0KLSAgICAgIHJldHVybiBkb2M7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLlBBUlNFUl9FUlJPUiwgIlByb2JsZW0gcGFyc2luZyAnIiArIGRlc2MgKyAiJy4iLCB0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgdXNpbmcgYSBjb250ZXh0IFVSSSBhbmQgZmlsZSBVUkkuCi0gICAqIAotICAgKiBAcGFyYW0gY29udGV4dFVSSSBUaGUgY29udGV4dCBVUkkgdG8gdXNlLgotICAgKiBAcGFyYW0gd3NkbFVSSSBUaGUgV1NETCBVUkkgdG8gdXNlLgotICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIFdTRExEb2N1bWVudHMuCi0gICAqIEB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudFtdIHJlYWRXU0RMKFN0cmluZyBjb250ZXh0VVJJLCBTdHJpbmcgd3NkbFVSSSkgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCBjb250ZXh0VVJMID0gKGNvbnRleHRVUkkgIT0gbnVsbCkgPyBTdHJpbmdVdGlscy5nZXRVUkwobnVsbCwgY29udGV4dFVSSSkgOiBudWxsOwotICAgICAgVVJMIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTChjb250ZXh0VVJMLCB3c2RsVVJJKTsKLSAgICAgIFJlYWRlciByZWFkZXIgPSBTdHJpbmdVdGlscy5nZXRDb250ZW50QXNSZWFkZXIodXJsKTsKLSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChpbnB1dFNvdXJjZSwgd3NkbFVSSSk7Ci0gICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgIFdTRExEb2N1bWVudFtdIHdzZGxEb2NzID0gbnVsbDsKLSAgICAgIC8vIG9ubHkgcGFyc2UgdGhlIGRvY3VtZW50IGlmIGl0IGlzbid0IGVtcHR5Ci0gICAgICBpZihkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgICB7ICAgICAgCi0gICAgICAgIHdzZGxEb2NzID0gcmVhZFdTREwodXJsLnRvU3RyaW5nKCksIGRvYyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gd3NkbERvY3M7Ci0gICAgfQotICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICBXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLAotICAgICAgICAiVW5hYmxlIHRvIHJlc29sdmUgaW1wb3J0ZWQgZG9jdW1lbnQgYXQgJyIgKyB3c2RsVVJJICsgIicuIiwKLSAgICAgICAgdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbWVzc2FnZWdlbmVyYXRvciBmb3IgdGhlIHJlYWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBtZyBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZUdlbmVyYXRvcihNZXNzYWdlR2VuZXJhdG9yIG1nKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1nOwotICB9Ci0gIAotICAvKioKLSAgICogUmVhZCB0aGUgV1NETCBkb2N1bWVudCBhY2Nlc3NpYmxlIHZpYSB0aGUgc3BlY2lmaWVkCi0gICAqIFVSSSBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gd3NkbFVSSSBBIFVSSSBwb2ludGluZyB0byBhIFdTREwgZmlsZS4KLSAgICogQHJldHVybiBBbiBhcnJheSBvZiBXU0RMRG9jdW1lbnRzLgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudFtdIHJlYWRXU0RMKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRXU0RMKG51bGwsIHdzZGxVUkkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIFdTREwgZG9jdW1lbnQgZGVzY3JpYmVkIGJ5IGEgVVJJIGFuZCBpdHMgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBkb2N1bWVudEJhc2VVUkkgVGhlIFVSSSBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRlZmluaXRpb25zRWxlbWVudCBUaGUgZGVmaW5pdGlvbnMgZWxlbWVudCBmb3IgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV1NETERvY3VtZW50cy4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50W10gcmVhZFdTREwoU3RyaW5nIGRvY3VtZW50QmFzZVVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBkZWZpbml0aW9uc0VsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBwYXJzZURvY3VtZW50KGRvY3VtZW50QmFzZVVSSSwgZGVmaW5pdGlvbnNFbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzcGVjaWZpZWQgV1NETCBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSBUaGUgZG9jdW1lbnQgYmFzZSBVUkkuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgVGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgV1NETERvY3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyBXU0RMRG9jdW1lbnRbXSByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIHJldHVybiByZWFkV1NETChkb2N1bWVudEJhc2VVUkksIHdzZGxEb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gIH0KLSAgCi0gIAotICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvaHR0cC9IVFRQVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9odHRwL0hUVFBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4MGU0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9odHRwL0hUVFBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuaHR0cDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5NZXNzYWdlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nSW5wdXRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuUG9ydEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzc0ltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZ0ltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudEltcGw7Ci0KLS8qKgotICogVGhlIEhUVFAgdmFsaWRhdG9yIGlzIGFuIGV4dGVuc2lvbiBXU0RMIHZhbGlkYXRvciB0aGF0IHZhbGlkYXRlcyBhbGwgZWxlbWVudHMgaW4gdGhlIEhUVFAKLSAqIG5hbWVzcGFjZS4KLSAqLwotcHVibGljIGNsYXNzIEhUVFBWYWxpZGF0b3IgaW1wbGVtZW50cyBJV1NETDExVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19JTlBVVF9FTEVNRU5UID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfSU5QVVRfRUxFTUVOVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0hUVFBfRUxFTUVOVF9GT1JfTE9DQVRJT04gPSAiX0VSUk9SX0lOVkFMSURfSFRUUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyA9ICJfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX0FERFJFU1MgPSAiX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9BRERSRVNTIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19WRVJCID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfVkVSQiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0xPQ0FUSU9OX1VSSSA9ICJfRVJST1JfSU5WQUxJRF9MT0NBVElPTl9VUkkiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiA9ICJfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT1RfT05MWV9FTEVNRU5UX0RFRklORUQgPSAiX0VSUk9SX05PVF9PTkxZX0VMRU1FTlRfREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19IVFRQT1BFUkFUSU9OX0ZPUl9VUkwgPSAiX0VSUk9SX05PX0hUVFBPUEVSQVRJT05fRk9SX1VSTCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUID0gIkdFVCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFBPU1QgPSAiUE9TVCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUVVPVEUgPSAiJyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotCi0gIHByaXZhdGUgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgLy8gUG9ydCBIVFRQIGRlZmluaXRpb24KLSAgICAvLyBtYWtlIHN1cmUgZXZlcnkgcG9ydCBoYXMgb25seSBvbmUgYWRkcmVzcyBlbGVtZW50IGRlZmluZWQKLSAgICAvLyBpZiBpdCBpcyBhbiBhZGRyZXNzIGVsZW1lbnQsIHZhbGlkYXRlIGl0Ci0gICAgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gUG9ydEltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQQWRkcmVzc0ltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlQWRkcmVzcyhlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCwgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgICAgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQmluZGluZyBIVFRQIGRlZmluaXRpb24KLSAgICAvLyBBIEhUVFAgQmluZGluZyBtdXN0IGhhdmUgYSB2ZXJiIG9mIEdFVCBvciBQT1NUCi0gICAgZWxzZSBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBCaW5kaW5nSW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IEhUVFBCaW5kaW5nSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVCaW5kaW5nKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgICBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gQmluZGluZyBPcGVyYXRpb24gSFRUUCBkZWZpbml0aW9uCi0gICAgLy8gQSBIVFRQIE9wZXJhdGlvbiBoYXMgYSBsb2NhdGlvbiB1cmkgZGVmaW5lZAotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ09wZXJhdGlvbkltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQT3BlcmF0aW9uSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVPcGVyYXRpb24oZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgIF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQsCi0gICAgICAgICAgICBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwKLSAgICAgICAgICBlbGVtZW50KTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdJbnB1dEltcGwuY2xhc3MpCi0gICAgewotICAgICAgLy8gdmFsaWRhdGUgdGhlIEhUVFAgdXJsRW5jb2RlZCBhbmQgdXJsUmVwbGFjZW1lbnQKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gSFRUUFVybEVuY29kZWRJbXBsLmNsYXNzIHx8IGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBIVFRQVXJsUmVwbGFjZW1lbnRJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUh0dHBVcmwoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0lOUFVUX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIGluIHRoaXMgY2FzZSB0aGVyZSBoYXMgYmVlbiBhIEhUVFAgZWxlbWVudCBkZWZpbmVkIHRoYXQgaXMgbm90IGRlZmluZWQgZm9yIHRoaXMgcG9pbnQgaW4gdGhlIEhUVFAgbmFtZXNwYWNlCi0gICAgZWxzZQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKAotICAgICAgICAgIF9FUlJPUl9JTlZBTElEX0hUVFBfRUxFTUVOVF9GT1JfTE9DQVRJT04sCi0gICAgICAgICAgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksCi0gICAgICAgIGVsZW1lbnQpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEudmFsaWRhdG9yLklXU0RMMTFWYWxpZGF0b3Ijc2V0UmVzb3VyY2VCdW5kbGUoamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICBpZiAobWVzc2FnZWdlbmVyYXRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIG1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyYik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoZSBIVFRQIGFkZHJlc3MgaGFzIGEgdmFsdWUgc3BlY2lmaWVkIGZvciBpdCdzIHVyaSBhbmQgdGhhdCB0aGVyZSBpcyBhIEhUVFAgQmluZGluZyBkZWZpbmVkCi0gICAqIGZvciB0aGUgQmluZGluZyBzcGVjaWZpZWQgaW4gdGhlIHBvcnQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRUUCBhZGRyZXNzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIEhUVFAgYWRkcmVzcyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUFkZHJlc3MoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBIVFRQQWRkcmVzc0ltcGwgaGEgPSAoSFRUUEFkZHJlc3NJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgdXJpID0gaGEuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICBpZiAodXJpID09IG51bGwgfHwgdXJpLmVxdWFsc0lnbm9yZUNhc2UoRU1QVFlfU1RSSU5HKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyksIGhhKTsKLSAgICB9Ci0KLSAgICBQb3J0IHBvcnQgPSAoUG9ydClwYXJlbnRzLmdldCgwKTsKLQotICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotCi0gICAgaWYgKCFoYXNIdHRwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICBfRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX0FERFJFU1MsCi0gICAgICAgICAgUVVPVEUgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSwKLSAgICAgICAgICBRVU9URSArIHBvcnQuZ2V0TmFtZSgpICsgUVVPVEUpLAotICAgICAgICBoYSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGUgSFRUUCBCaW5kaW5nIGRlZmluZWQgaXMgdmFsaWQuIEEgSFRUUCBCaW5kaW5nIG11c3QgaGF2ZSBhIHZlcmIgb2YgR0VUIG9yIFBPU1QuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgSFRUUCBiaW5kaW5nIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIEhUVFAgYmluZGluZyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJpbmRpbmcoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBIVFRQQmluZGluZ0ltcGwgaGIgPSAoSFRUUEJpbmRpbmdJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgdmVyYiA9IGhiLmdldFZlcmIoKTsKLQotICAgIGlmICh2ZXJiICE9IG51bGwgJiYgIXZlcmIuZXF1YWxzKEdFVCkgJiYgIXZlcmIuZXF1YWxzKFBPU1QpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQklORElOR19WRVJCLCBRVU9URSArIHZlcmIgKyBRVU9URSksIGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbiBvcGVyYXRpb24gbXVzdCBoYXZlIGEgbG9jYXRpb24gZGVmaW5lZC4gQSBIVFRQIEJpbmRpbmcgbXVzdCBiZSBzcGVjaWZpZWQgdG8gdXNlIGFuIG9wZXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBIVFRQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBUaGUgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBIVFRQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9wZXJhdGlvbihPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIEhUVFBPcGVyYXRpb24gaG8gPSAoSFRUUE9wZXJhdGlvbillbGVtZW50OwotCi0gICAgU3RyaW5nIGxvY2F0aW9uVVJJID0gaG8uZ2V0TG9jYXRpb25VUkkoKTsKLQotICAgIGlmIChsb2NhdGlvblVSSSAhPSBudWxsICYmIGxvY2F0aW9uVVJJLmVxdWFsc0lnbm9yZUNhc2UoRU1QVFlfU1RSSU5HKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0xPQ0FUSU9OX1VSSSksIGVsZW1lbnQpOwotICAgIH0KLQotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKXBhcmVudHMuZ2V0KDEpOwotICAgIGlmICghaGFzSHR0cEJpbmRpbmcoYmluZGluZykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX0hUVFBCSU5ESU5HX0ZPUl9PUEVSQVRJT04sIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLAotICAgICAgICBobyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBIVFRQIHVybFJlcGxhY2VtZW50IG9yIHVybEVuY29kZWQuIEVuc3VyZSB0aGUgSFRUUCBvcGVyYXRpb24gaGFzIGJlZW4gZGVmaW5lZC4gCi0gICAqIEVuc3VyZSB0aGF0IGVpdGhlciBlbGVtZW50IGlzIHRoZSBvbmx5IGVsZW1lbnQgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUVFAgYmluZGluZyBvcGVyYXRpb24gZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgVGhlIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgSFRUUCBiaW5kaW5nIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUh0dHBVcmwoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKXBhcmVudHMuZ2V0KDEpOwotCi0gICAgU3RyaW5nIGVsZW1lbnROYW1lOwotICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gSFRUUFVybEVuY29kZWRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGVsZW1lbnROYW1lID0gInVybEVuY29kZWQiOwotICAgIH0KLSAgICBlbHNlIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gSFRUUFVybFJlcGxhY2VtZW50SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBlbGVtZW50TmFtZSA9ICJ1cmxSZXBsYWNlbWVudCI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlbGVtZW50TmFtZSA9IEVNUFRZX1NUUklORzsKLSAgICB9Ci0KLSAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSAoQmluZGluZ0lucHV0KXBhcmVudHMuZ2V0KDApOwotICAgIGlmIChpbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5zaXplKCkgIT0gMSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT1RfT05MWV9FTEVNRU5UX0RFRklORUQsIGVsZW1lbnROYW1lKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gICAgaWYgKCFoYXNIdHRwT3BlcmF0aW9uKG9wZXJhdGlvbikpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX05PX0hUVFBPUEVSQVRJT05fRk9SX1VSTCwgUVVPVEUgKyBvcGVyYXRpb24uZ2V0TmFtZSgpICsgUVVPVEUsIGVsZW1lbnROYW1lKSwKLSAgICAgICAgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdpdmVuIGEgQmluZGluZ09wZXJhdGlvbiB0ZWxscyB3aGV0aGVyIGl0IGhhcyBhIEhUVFAgb3BlcmF0aW9uIGRlZmluZWQgZm9yIGl0LgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmcgVGhlIEhUVFAgYmluZGluZyBvcGVyYXRpb24gZWxlbWVudC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGFuIEhUVFAgb3BlcmF0aW9uIGRlZmluZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGhhc0h0dHBPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBleHRlbGVtcyA9IG9wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGlmIChleHRlbGVtcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpZXh0ZWxlbXMgPSBleHRlbGVtcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaWV4dGVsZW1zLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpZXh0ZWxlbXMubmV4dCgpLmdldENsYXNzKCkgPT0gSFRUUE9wZXJhdGlvbkltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIGJpbmRpbmcgcmV0dXJucyB0cnVlIGlmIGl0IGhhcyBhIEhUVFAgYmluZGluZyBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGJpbmRpbmcgVGhlIGJpbmRpbmcgdG8gY2hlY2suCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhbiBIVFRQIGJpbmRpbmcgZGVmaW5lZC4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGhhc0h0dHBCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBleHRlbGVtcyA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBpZiAoZXh0ZWxlbXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaWV4dGVsZW1zID0gZXh0ZWxlbXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGlleHRlbGVtcy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaWV4dGVsZW1zLm5leHQoKS5nZXRDbGFzcygpID09IEhUVFBCaW5kaW5nSW1wbC5jbGFzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9taW1lL01JTUVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL21pbWUvTUlNRVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZjZWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL21pbWUvTUlNRVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLm1pbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbzsKLQotLyoqCi0gKiBUaGUgTUlNRSB2YWxpZGF0b3IgcGx1Z3MgaW50byB0aGUgV1NETCB2YWxpZGF0b3IgdG8gcHJvdmlkZQotICogdmFsaWRhdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGluIGEgV1NETCBkb2N1bWVudCB3aXRoaW4gdGhlIE1JTUUgbmFtZXNwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgTUlNRVZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm8pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnZhbGlkYXRvci5JV1NETDExVmFsaWRhdG9yI3NldFJlc291cmNlQnVuZGxlKGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvc29hcC9TT0FQVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9zb2FwL1NPQVBWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNhOTU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9zb2FwL1NPQVBWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuc29hcDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0aW9uSW5mbzsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nRmF1bHRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5CaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ0lucHV0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuQmluZGluZ09wZXJhdGlvbkltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLkJpbmRpbmdPdXRwdXRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5Qb3J0SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nSW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5SW1wbDsKLWltcG9ydCBjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdEltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHRJbXBsOwotaW1wb3J0IGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckltcGw7Ci1pbXBvcnQgY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uSW1wbDsKLQotLyoqCi0gKiBUaGUgU09BUCB2YWxpZGF0b3IgcGx1Z3MgaW50byB0aGUgV1NETCB2YWxpZGF0b3IgdG8gcHJvdmlkZQotICogdmFsaWRhdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGluIGEgV1NETCBkb2N1bWVudCB3aXRoaW4gdGhlIFNPQVAgbmFtZXNwYWNlLgotICoKLSAqLwotcHVibGljIGNsYXNzIFNPQVBWYWxpZGF0b3IgaW1wbGVtZW50cyBJV1NETDExVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX1BPUlRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgPSAiX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfSEVBREVSX0JPRFlfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9IRUFERVJfQk9EWV9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfRUxFTUVOVCA9ICJfRVJST1JfSU5WQUxJRF9GQVVMVF9FTEVNRU5UIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfU09BUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiA9ICJfRVJST1JfSU5WQUxJRF9TT0FQX0VMRU1FTlRfRk9SX0xPQ0FUSU9OIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTID0gIl9FUlJPUl9OT19MT0NBVElPTl9GT1JfQUREUkVTUyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQUREUkVTUyA9ICJfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0FERFJFU1MiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1NUWUxFID0gIl9FUlJPUl9JTlZBTElEX0JJTkRJTkdfU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSA9ICJfRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX09QRVJBVElPTl9TVFlMRSA9ICJfRVJST1JfSU5WQUxJRF9PUEVSQVRJT05fU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiA9ICJfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JPRFlfRU5DT0RJTkdfU1RZTEUgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9FTkNPRElOR19TVFlMRSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9JTlZBTElEX0JPRFlfTkFNRVNQQUNFX0ZPUl9FTkNPREVEID0gIl9FUlJPUl9JTlZBTElEX0JPRFlfTkFNRVNQQUNFX0ZPUl9FTkNPREVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9VU0UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfTk9UX1RZUEUgPSAiX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX05PVF9UWVBFIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX1VOREVGSU5FRCA9ICJfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9CT0RZID0gIl9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQk9EWSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfTUVTU0FHRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9NRVNTQUdFX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfUEFSVF9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9QQVJUX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJfVVNFX1VOREVGSU5FRCA9ICJfRVJST1JfSEVBREVSX1VTRV9VTkRFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSX05BTUVTUEFDRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUl9OQU1FU1BBQ0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIgPSAiX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSEVBREVSRkFVTFRfTUVTU0FHRV9VTkRFRklORUQgPSAiX0VSUk9SX0hFQURFUkZBVUxUX01FU1NBR0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0hFQURFUkZBVUxUX1BBUlRfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9QQVJUX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0hFQURFUkZBVUxUX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9FTkNPRElOR1NUWUxFX1VOREVGSU5FRCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEID0gIl9FUlJPUl9IRUFERVJGQVVMVF9OQU1FU1BBQ0VfVU5ERUZJTkVEIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRSA9ICJfRVJST1JfSU5WQUxJRF9GQVVMVF9OQU1FIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0VSUk9SX0lOVkFMSURfRkFVTFRfRU5DT0RJTkdfU1RZTEUgPSAiX0VSUk9SX0lOVkFMSURfRkFVTFRfRU5DT0RJTkdfU1RZTEUiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfRVJST1JfSU5WQUxJRF9GQVVMVF9OQU1FU1BBQ0VfRk9SX0VOQ09ERUQgPSAiX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRVNQQUNFX0ZPUl9FTkNPREVEIjsKLSAgCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVOQ09ERUQgPSAiZW5jb2RlZCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIExJVEVSQUwgPSAibGl0ZXJhbCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFJQQyA9ICJycGMiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBET0NVTUVOVCA9ICJkb2N1bWVudCI7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBRVU9URSA9ICInIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7Ci0KLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLSAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvciN2YWxpZGF0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuTGlzdCwgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS53c2RsMTEuSVdTREwxMVZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICAvLyBQb3J0IFNPQVAgZGVmaW5pdGlvbgotICAgIC8vIG1ha2Ugc3VyZSBldmVyeSBwb3J0IGhhcyBvbmx5IG9uZSBhZGRyZXNzIGVsZW1lbnQgZGVmaW5lZAotICAgIC8vIGlmIGl0IGlzIGFuIGFkZHJlc3MgZWxlbWVudCwgdmFsaWRhdGUgaXQKLSAgICBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBQb3J0SW1wbC5jbGFzcykKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IFNPQVBBZGRyZXNzSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVBZGRyZXNzKGVsZW1lbnQsIHBhcmVudHMsIHZhbEluZm8pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWVsZW1lbnQ7Ci0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5ULCBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQmluZGluZyBTT0FQIGRlZmluaXRpb24KLSAgICAvLyBBIFNPQVAgQmluZGluZyBtdXN0IGhhdmUgYSBzdHlsZSBvciBycGMgb3IgZG9jdW1lbnQgb3Igbm8gc3R5bGUgZGVmaW5lZCAtIGRlZmF1bHRzIHRvIGRvY3VtZW50Ci0gICAgLy8gTXVzdCBoYXZlIGEgdHJhbnNwb3J0IHVyaSBkZWZpbmVkIC0gY2hlY2sgaWYgdGhlIHVyaSBpcyBlbXB0eQotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBTT0FQQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlQmluZGluZyhlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfRUxFTUVOVCwgUVVPVEUgKyBlLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIGVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBCaW5kaW5nIE9wZXJhdGlvbiBTT0FQIGRlZmluaXRpb24KLSAgICAvLyBBIFNPQVAgT3BlcmF0aW9uIG1heSBoYXZlIGEgc3R5bGUgZGVmaW5lZCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZG9jdW1lbnQgb3IgcnBjCi0gICAgLy8gYW5kIG1heSBoYXZlIGEgc29hcEFjdGlvbiB1cmkgZGVmaW5lZAotICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ09wZXJhdGlvbkltcGwuY2xhc3MpCi0gICAgewotICAgICAgaWYgKGVsZW1lbnQuZ2V0Q2xhc3MoKSA9PSBTT0FQT3BlcmF0aW9uSW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVPcGVyYXRpb24oZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZWxlbWVudDsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygKLSAgICAgICAgICAgICAgX0VSUk9SX0lOVkFMSURfQklORElOR19PUEVSQVRJT05fRUxFTUVOVCwKLSAgICAgICAgICAgIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIGlmICgKLSAgICAgIHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0lucHV0SW1wbC5jbGFzcyB8fCBwYXJlbnRzLmdldCgwKS5nZXRDbGFzcygpID09IEJpbmRpbmdPdXRwdXRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIC8vIHZhbGlkYXRlIHRoZSBTT0FQIGJvZHkKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gU09BUEJvZHlJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUJvZHkoZWxlbWVudCwgcGFyZW50cywgdmFsSW5mbyk7Ci0gICAgICB9Ci0gICAgICAvLyB2YWxpYXRlIHRoZSBTT0FQIGhlYWRlcgotICAgICAgZWxzZSBpZiAoZWxlbWVudC5nZXRDbGFzcygpID09IFNPQVBIZWFkZXJJbXBsLmNsYXNzKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUhlYWRlcihlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0hFQURFUl9CT0RZX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50cy5nZXQoMCkuZ2V0Q2xhc3MoKSA9PSBCaW5kaW5nRmF1bHRJbXBsLmNsYXNzKQotICAgIHsKLSAgICAgIGlmIChlbGVtZW50LmdldENsYXNzKCkgPT0gU09BUEZhdWx0SW1wbC5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgdmFsaWRhdGVGYXVsdChlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0ZBVUxUX0VMRU1FTlQsIFFVT1RFICsgZS5nZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaW4gdGhpcyBjYXNlIHRoZXJlIGhhcyBiZWVuIGEgU09BUCBlbGVtZW50IGRlZmluZWQgdGhhdCBpcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBwb2ludCBpbiB0aGUgU09BUCBuYW1lc3BhY2UKLSAgICBlbHNlCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OwotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX0lOVkFMSURfU09BUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiwKLSAgICAgICAgICBRVU9URSArIGUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgfQotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnZhbGlkYXRvci5JV1NETDExVmFsaWRhdG9yI3NldFJlc291cmNlQnVuZGxlKGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlIHJiKQotICB7Ci0gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhhdCB0aGUgU09BUCBhZGRyZXNzIGhhcyBhIHZhbHVlIHNwZWNpZmllZCBmb3IgaXQncyB1cmkgYW5kIHRoYXQgdGhlIGJpbmRpbmcgaGFzIGEgU09BUAotICAgKiBCaW5kaW5nIGRlZmluZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgU09BUCBhZGRyZXNzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBTT0FQIGFkZHJlc3MgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBZGRyZXNzKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEFkZHJlc3NJbXBsIHNhID0gKFNPQVBBZGRyZXNzSW1wbCllbGVtZW50OwotCi0gICAgU3RyaW5nIHVyaSA9IHNhLmdldExvY2F0aW9uVVJJKCk7Ci0gICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MpLCBzYSk7Ci0gICAgfQotCi0gICAgUG9ydCBwb3J0ID0gKFBvcnQpcGFyZW50cy5nZXQoMCk7Ci0KLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLQotICAgIGlmICghaGFzU29hcEJpbmRpbmcoYmluZGluZykpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9BRERSRVNTLAotICAgICAgICAgIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUsCi0gICAgICAgICAgUVVPVEUgKyBwb3J0LmdldE5hbWUoKSArIFFVT1RFKSwgc2EpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmUgdGhlIFNPQVAgQmluZGluZyBkZWZpbmVkIGlzIHZhbGlkLiBBIFNPQVAgQmluZGluZyBtdXN0IGhhdmUgYSBzdHlsZSBvZiBycGMgb3IgZG9jdW1lbnQKLSAgICogb3Igbm8gc3R5bGUgZGVmaW5lZCAoZGVmYXVsdHMgdG8gZG9jdW1lbnQuKSAgQSB2YWxpZCAobm9uIGVtcHR5KSBVUkkgbXVzdCBhbHNvIGJlIHNwZWNpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIHBhcmVudHMgQSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIFNPQVAgYmluZGluZyBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGlzIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUJpbmRpbmcoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBTT0FQQmluZGluZ0ltcGwgc2IgPSAoU09BUEJpbmRpbmdJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgc3R5bGUgPSBzYi5nZXRTdHlsZSgpOwotICAgIFN0cmluZyB1cmkgPSBzYi5nZXRUcmFuc3BvcnRVUkkoKTsKLQotICAgIGlmIChzdHlsZSAhPSBudWxsICYmICFzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKFJQQykgJiYgIXN0eWxlLmVxdWFsc0lnbm9yZUNhc2UoRE9DVU1FTlQpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JJTkRJTkdfU1RZTEUsIFFVT1RFICsgc2IuZ2V0U3R5bGUoKSArIFFVT1RFKSwgZWxlbWVudCk7Ci0gICAgfQotICAgIGlmICh1cmkuZXF1YWxzSWdub3JlQ2FzZShFTVBUWV9TVFJJTkcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfQklORElOR19VUkkpLCBlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQW4gb3BlcmF0aW9uIG1heSBoYXZlIGEgc3R5bGUgZGVmaW5lZC4gSWYgaXQgaXMgZGVmaW5lZCBpdCBtdXN0IGJlIHJwYyBvciBkb2N1bWVudC4gSXQgbWF5IGFsc28gaGF2ZSBhCi0gICAqIHVyaSBkZWZpbmVkIHdoaWNoIG11c3QgYmUgbm9uIGVtcHR5LiAgSXQgbWF5IGhhdmUgYSBzb2FwQWN0aW9uIGRlZmluZWQgYXMgd2VsbC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBvcGVyYXRpb24gZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVPcGVyYXRpb24oT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBTT0FQT3BlcmF0aW9uIHNvID0gKFNPQVBPcGVyYXRpb24pZWxlbWVudDsKLQotICAgIFN0cmluZyBzb2FwU3R5bGUgPSBzby5nZXRTdHlsZSgpOwotCi0gICAgaWYgKHNvYXBTdHlsZSAhPSBudWxsICYmICFzb2FwU3R5bGUuZXF1YWxzSWdub3JlQ2FzZShSUEMpICYmICFzb2FwU3R5bGUuZXF1YWxzSWdub3JlQ2FzZShET0NVTUVOVCkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9PUEVSQVRJT05fU1RZTEUpLCBlbGVtZW50KTsKLSAgICB9Ci0KLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylwYXJlbnRzLmdldCgxKTsKLSAgICBpZiAoIWhhc1NvYXBCaW5kaW5nKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19TT0FQQklORElOR19GT1JfT1BFUkFUSU9OLCBRVU9URSArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc28pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgU09BUCBib2R5LiBJZiBlbmNvZGVkIGEgYm9keSBtdXN0IGhhdmUgYW4gZW5jb2RpbmdTdHlsZS4gQWxzbywKLSAgICogaWYgc3BlY2lmaWVkLCBhbGwgb2YgdGhlIHBhcnRzIGxpc3RlZCBtdXN0IGJlIGRlZmluZWQgcGFydHMgYW5kIGluIHRoZSBlbmNvZGluZyB1c2UgY2FzZSwgdGhlIHBhcnRzCi0gICAqIG11c3QgaGF2ZSB0eXBlcyBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgYm9keSBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBib2R5IGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoaXMgdmFsaWRhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQm9keShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIFNPQVBCb2R5SW1wbCBzYiA9IChTT0FQQm9keUltcGwpZWxlbWVudDsKLQotICAgIFN0cmluZyB1c2UgPSBzYi5nZXRVc2UoKTsKLQotICAgIC8vIGlmIHRoZSB1c2UgPSBlbmNvZGVkIHRoZW4gdGhlcmUgbXVzdCBiZSBlbmNvZGluZ1N0eWxlcy4KLSAgICBpZiAodXNlICE9IG51bGwgJiYgdXNlLmVxdWFsc0lnbm9yZUNhc2UoRU5DT0RFRCkpCi0gICAgewotICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlcyA9IHNiLmdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCB8fCBlbmNvZGluZ1N0eWxlcy5zaXplKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX0VOQ09ESU5HX1NUWUxFKSwgc2IpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh1c2UgIT0gbnVsbCAmJiAhdXNlLmVxdWFsc0lnbm9yZUNhc2UoTElURVJBTCkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1VTRSwgUVVPVEUgKyB1c2UgKyBRVU9URSksIHNiKTsKLSAgICB9Ci0KLSAgICAvL0NoZWNrIHRoYXQgdGhlIHBhcnRzIGFyZSB2YWxpZAotICAgIC8vIHBhcnRzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgbWVzc2FnZSBzcGVjaWZpZWQgZm9yIHRoZSBvcGVyYXRpb24KLSAgICBMaXN0IHBhcnRzID0gc2IuZ2V0UGFydHMoKTsKLQotICAgIGlmIChwYXJ0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIHBhcnRzSXRlcmF0b3IgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKHBhcnRzSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFydCA9IChTdHJpbmcpcGFydHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm8gPSAoQmluZGluZ09wZXJhdGlvbilwYXJlbnRzLmdldCgxKTsKLSAgICAgICAgT3BlcmF0aW9uIG8gPSBiby5nZXRPcGVyYXRpb24oKTsKLQotICAgICAgICBpZiAobyAhPSBudWxsICYmICFvLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBnZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQgb3Igb3V0cHV0IGlmIGl0IGV4aXN0cwotICAgICAgICAgIE1lc3NhZ2UgbWVzcyA9IG51bGw7Ci0gICAgICAgICAgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ0lucHV0SW1wbC5jbGFzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBJbnB1dCBpbnB1dCA9IG8uZ2V0SW5wdXQoKTsKLQotICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lc3MgPSBpbnB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHBhcmVudHMuZ2V0KDApLmdldENsYXNzKCkgPT0gQmluZGluZ091dHB1dEltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgT3V0cHV0IG91dHB1dCA9IG8uZ2V0T3V0cHV0KCk7Ci0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVzcyA9IG91dHB1dC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKG1lc3MgIT0gbnVsbCAmJiAhbWVzcy5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBhcnQgcCA9IG1lc3MuZ2V0UGFydChwYXJ0KTsKLQotICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZSBpcyBlbmNvZGVkIHRoZSBwYXJ0cyBtdXN0IGFsbCBoYXZlIGEgdHlwZSBkZWZpbmVkCi0gICAgICAgICAgICAgIGlmICh1c2UgIT0gbnVsbCAmJiB1c2UuZXF1YWxzSWdub3JlQ2FzZShFTkNPREVEKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwLmdldFR5cGVOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBwYXJ0IGVycm9yIC0gcGFydCBuZWVkcyB0byBiZSB0eXBlIGFuZCBpc24ndAkKLSAgICAgICAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9OT1RfVFlQRSwgUVVPVEUgKyBwYXJ0ICsgUVVPVEUpLCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vcGFydCBlcnJvciAtIHBhcnQgaXNuJ3QgZGVmaW5lZAkKLSAgICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSU5WQUxJRF9CT0RZX1BBUlRfVU5ERUZJTkVELCBRVU9URSArIHBhcnQgKyBRVU9URSksIHNiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vcGFydCBlcnJvciAtIGlucHV0IGlzbid0IGRlZmluZWQKLSAgICAgICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9VTkRFRklORUQsIFFVT1RFICsgcGFydCArIFFVT1RFKSwgc2IpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBwYXJ0cyBlcnJvciAtIG9wZXJhdGlvbiBpc24ndCBkZWZpbmVkCi0gICAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9VTkRFRklORUQsIFFVT1RFICsgcGFydCArIFFVT1RFKSwgc2IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpcGFyZW50cy5nZXQoMik7Ci0gICAgaWYgKCFoYXNTb2FwQmluZGluZyhiaW5kaW5nKSkKLSAgICB7Ci0gICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX0JPRFksIFFVT1RFICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzYik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEgU09BUCBoZWFkZXIgbXVzdCBoYXZlIGEgbWVzc2FnZSwgcGFydCBhbmQgdXNlIGRlZmluZWQuIElmIHRoZSB1c2UgaXMgZW5jb2RlZCwgbXVzdAotICAgKiBhbHNvIGhhdmUgYSBub24tZW1wdHkgZW5jb2RpbmdTdHlsZSBhbmQgbmFtZXNwYWNlIGRlZmluZWQuCi0gICAqIEEgU09BUCBoZWFkZXIgbWF5IGhhdmUgaGVhZGVyZmF1bHRzIGRlZmluZWQgYXMgd2VsbC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBTT0FQIGhlYWRlciBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBoZWFkZXIgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXIoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBTT0FQSGVhZGVySW1wbCBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXJJbXBsKWVsZW1lbnQ7Ci0KLSAgICBRTmFtZSBtZXNzYWdlUU5hbWUgPSBzb2FwSGVhZGVyLmdldE1lc3NhZ2UoKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoKERlZmluaXRpb24pcGFyZW50cy5nZXQocGFyZW50cy5zaXplKCkgLSAxKSkuZ2V0TWVzc2FnZShtZXNzYWdlUU5hbWUpOwotICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgLy8gbWVzc2FnZSB1bmRlZmluZWQKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJfTUVTU0FHRV9VTkRFRklORUQsIFFVT1RFICsgbWVzc2FnZVFOYW1lLmdldExvY2FsUGFydCgpICsgUVVPVEUpLCBzb2FwSGVhZGVyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJ0bmFtZSA9IHNvYXBIZWFkZXIuZ2V0UGFydCgpOwotICAgICAgUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KHBhcnRuYW1lKTsKLSAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIHBhcnQgdW5kZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICBfRVJST1JfSEVBREVSX1BBUlRfVU5ERUZJTkVELAotICAgICAgICAgICAgUVVPVEUgKyBwYXJ0bmFtZSArIFFVT1RFLAotICAgICAgICAgICAgUVVPVEUgKyBtZXNzYWdlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvYXBIZWFkZXIpOwotICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyB1c2UgPSBzb2FwSGVhZGVyLmdldFVzZSgpOwotICAgIGlmICh1c2UgIT0gbnVsbCAmJiAhdXNlLmVxdWFsc0lnbm9yZUNhc2UoTElURVJBTCkgJiYgIXVzZS5lcXVhbHNJZ25vcmVDYXNlKEVOQ09ERUQpKQotICAgIHsKLSAgICAgIC8vIHVzZSB1bmRlZmluZWQKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJfVVNFX1VOREVGSU5FRCwgUVVPVEUgKyB1c2UgKyBRVU9URSksIHNvYXBIZWFkZXIpOwotICAgIH0KLQotICAgIGlmICh1c2UuZXF1YWxzSWdub3JlQ2FzZShFTkNPREVEKSkKLSAgICB7Ci0gICAgICBMaXN0IGVuY29kaW5nU3R5bGVzID0gc29hcEhlYWRlci5nZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwgfHwgZW5jb2RpbmdTdHlsZXMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICAvLyBubyBlbmNvZGluZ1N0eWxlIGRlZmluZWQKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEKSwgc29hcEhlYWRlcik7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgICB7Ci0gICAgICAgIC8vIG5vIG5hbWVzcGFjZSBkZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IobWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUl9OQU1FU1BBQ0VfVU5ERUZJTkVEKSwgc29hcEhlYWRlcik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTGlzdCBoZWFkZXJGYXVsdHMgPSBzb2FwSGVhZGVyLmdldFNPQVBIZWFkZXJGYXVsdHMoKTsKLSAgICBpZiAoaGVhZGVyRmF1bHRzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaWhlYWRlckZhdWx0cyA9IGhlYWRlckZhdWx0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGloZWFkZXJGYXVsdHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB2YWxpZGF0ZUhlYWRlckZhdWx0KGloZWFkZXJGYXVsdHMubmV4dCgpLCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylwYXJlbnRzLmdldCgyKTsKLSAgICBpZiAoIWhhc1NvYXBCaW5kaW5nKGJpbmRpbmcpKQotICAgIHsKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9OT19TT0FQQklORElOR19GT1JfSEVBREVSLCBRVU9URSArIGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc29hcEhlYWRlcik7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQSBTT0FQIGhlYWRlcmZhdWx0IG11c3QgaGF2ZSBhIG1lc3NhZ2UsIHBhcnQgYW5kIHVzZSBkZWZpbmVkLiBJZiB0aGUgdXNlIGlzIGVuY29kZWQsIG11c3QKLSAgICogYWxzbyBoYXZlIGEgbm9uLWVtcHR5IGVuY29kaW5nU3R5bGUgYW5kIG5hbWVzcGFjZSBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIFNPQVAgaGVhZGVyIGZhdWx0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnRzIEEgbGlzdCBvZiBwYXJlbnRzIG9mIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIGZvciB0aGlzIHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlckZhdWx0KE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEhlYWRlckZhdWx0SW1wbCBzb2FwSGVhZGVyRmF1bHQgPSAoU09BUEhlYWRlckZhdWx0SW1wbCllbGVtZW50OwotCi0gICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gc29hcEhlYWRlckZhdWx0LmdldE1lc3NhZ2UoKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoKERlZmluaXRpb24pcGFyZW50cy5nZXQocGFyZW50cy5zaXplKCkgLSAxKSkuZ2V0TWVzc2FnZShtZXNzYWdlUU5hbWUpOwotICAgIGlmIChtZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgLy8gbWVzc2FnZSB1bmRlZmluZWQKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJGQVVMVF9NRVNTQUdFX1VOREVGSU5FRCwgUVVPVEUgKyBtZXNzYWdlUU5hbWUuZ2V0TG9jYWxQYXJ0KCkgKyBRVU9URSksIHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFydG5hbWUgPSBzb2FwSGVhZGVyRmF1bHQuZ2V0UGFydCgpOwotICAgICAgUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KHBhcnRuYW1lKTsKLSAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIHBhcnQgdW5kZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoCi0gICAgICAgICAgICBfRVJST1JfSEVBREVSRkFVTFRfUEFSVF9VTkRFRklORUQsCi0gICAgICAgICAgICBRVU9URSArIHBhcnRuYW1lICsgUVVPVEUsCi0gICAgICAgICAgICBRVU9URSArIG1lc3NhZ2VRTmFtZS5nZXRMb2NhbFBhcnQoKSArIFFVT1RFKSwgc29hcEhlYWRlckZhdWx0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBTdHJpbmcgdXNlID0gc29hcEhlYWRlckZhdWx0LmdldFVzZSgpOwotICAgIGlmICh1c2UgIT0gbnVsbCAmJiAhdXNlLmVxdWFsc0lnbm9yZUNhc2UoTElURVJBTCkgJiYgIXVzZS5lcXVhbHNJZ25vcmVDYXNlKEVOQ09ERUQpKQotICAgIHsKLSAgICAgIC8vIHVzZSB1bmRlZmluZWQKLSAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgIG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9FUlJPUl9IRUFERVJGQVVMVF9VU0VfVU5ERUZJTkVELCBRVU9URSArIHVzZSArIFFVT1RFKSwgc29hcEhlYWRlckZhdWx0KTsKLSAgICB9Ci0KLSAgICBpZiAodXNlLmVxdWFsc0lnbm9yZUNhc2UoRU5DT0RFRCkpCi0gICAgewotICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlcyA9IHNvYXBIZWFkZXJGYXVsdC5nZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwgfHwgZW5jb2RpbmdTdHlsZXMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICAvLyBubyBlbmNvZGluZ1N0eWxlIGRlZmluZWQKLSAgICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVJST1JfSEVBREVSRkFVTFRfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQpLCBzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gc29hcEhlYWRlckZhdWx0LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5lcXVhbHNJZ25vcmVDYXNlKEVNUFRZX1NUUklORykpCi0gICAgICB7Ci0gICAgICAgIC8vIG5vIG5hbWVzcGFjZSBkZWZpbmVkCi0gICAgICAgIHZhbEluZm8uYWRkRXJyb3IoCi0gICAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0hFQURFUkZBVUxUX05BTUVTUEFDRV9VTkRFRklORUQpLCBzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFZhbGlkYXRlIHRoZSBTT0FQIGZhdWx0LiBBIFNPQVAgZmF1bHQgbXVzdCBoYXZlIGEgbmFtZSBkZWZpbmVkIHRoYXQgY29ycmVzcG9uZHMgd2l0aCB0aGUgbmFtZQotICAqIHNwZWNpZmllZCBpbiB0aGUgcG9ydFR5cGUuICBJZiBlbmNvZGVkIGEgZmF1bHQgbXVzdCBoYXZlIGFuIGVuY29kaW5nU3R5bGUgYW5kIGEgbmFtZXNwYWNlVVJJLiAKLSAgKiAKLSAgKiBAcGFyYW0gZWxlbWVudCBUaGUgU09BUCBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGUgU09BUCBmYXVsdCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsaWRhdGlvbkluZm8gVGhlIHZhbGlkYXRpb24gaW5mbyBmb3IgdGhpcyB2YWxpZGF0aW9uLgotICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUZhdWx0KE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElXU0RMMTFWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgU09BUEZhdWx0SW1wbCBmYXVsdCA9IChTT0FQRmF1bHRJbXBsKWVsZW1lbnQ7Ci0KLSAgICBTdHJpbmcgbmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLQotICAgIFN0cmluZyBwYXJlbnROYW1lID0gKChCaW5kaW5nRmF1bHQpcGFyZW50cy5nZXQoMCkpLmdldE5hbWUoKTsKLQotICAgIGlmICghbmFtZS5lcXVhbHMocGFyZW50TmFtZSkpCi0gICAgewotICAgICAgdmFsSW5mby5hZGRFcnJvcigKLSAgICAgICAgbWVzc2FnZWdlbmVyYXRvci5nZXRTdHJpbmcoX0VSUk9SX0lOVkFMSURfRkFVTFRfTkFNRSwgUVVPVEUgKyBuYW1lICsgUVVPVEUsIFFVT1RFICsgcGFyZW50TmFtZSArIFFVT1RFKSwgZmF1bHQpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBoYXNTb2FwQmluZGluZy4gLSBoZWxwZXIgTWV0aG9kCi0gICAqIEdpdmVuIGEgYmluZGluZyByZXR1cm5zIHRydWUgaWYgaXQgaGFzIGEgU09BUCBiaW5kaW5nIGRlZmluZWQuCi0gICAqIAotICAgKiBAcGFyYW0gYmluZGluZyAtIHRoZSBTT0FQIGJpbmRpbmcgdG8gY2hlY2sKLSAgICogQHJldHVybiB0cnVlIGlmIGEgYmluZGluZyBoYXMgYSBTT0FQIGJpbmRpbmcgZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTb2FwQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZXh0ZWxlbXMgPSBiaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgaWYgKGV4dGVsZW1zICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGlleHRlbGVtcyA9IGV4dGVsZW1zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpZXh0ZWxlbXMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlleHRlbGVtcy5uZXh0KCkuZ2V0Q2xhc3MoKSA9PSBTT0FQQmluZGluZ0ltcGwuY2xhc3MpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0ZpbGVFbnRpdHlSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjFjMzJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9GaWxlRW50aXR5UmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBFbnRpdHkgcmVzb2x2ZSB0byByZXNvbHZlIGZpbGUgZW50aXRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRW50aXR5UmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlcgotewotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlKSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHB1YmxpY0lkID0gcmVzb3VyY2UuZ2V0UHVibGljSWQoKTsKLSAgICBTdHJpbmcgc3lzdGVtSWQgPSByZXNvdXJjZS5nZXRFeHBhbmRlZFN5c3RlbUlkKCk7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IHJlc291cmNlLmdldE5hbWVzcGFjZSgpOwotICAgIFVSTCB1cmwgPSBudWxsOwotICAgIGlmKHN5c3RlbUlkICE9IG51bGwpCi0gICAgewotICAgICAgdXJsID0gbmV3IFVSTChzeXN0ZW1JZCk7Ci0gICAgfQotICAgIGVsc2UgaWYocHVibGljSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKHB1YmxpY0lkKTsKLSAgICB9Ci0gICAgZWxzZSBpZihuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKG5hbWVzcGFjZSk7Ci0gICAgfQotICAgIGlmKHVybCAhPSBudWxsKQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgIHJldHVybiBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHJlc291cmNlLmdldEV4cGFuZGVkU3lzdGVtSWQoKSwgcmVzb3VyY2UuZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpLCBpcywgbnVsbCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwMmJlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lU2NoZW1hR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBHZW5lcmF0ZSBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNjaGVtYSBmb3IgYW4gaW5saW5lIHNjaGVtYS4gV2lsbCBhZGQgaW1wb3J0cyBmb3IgdW5yZXNvbHZlZAotICogbmFtZXNwYWNlcy4KLSAqLwotcHVibGljIGNsYXNzIElubGluZVNjaGVtYUdlbmVyYXRvcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0VOQ09ESU5HX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6Ly8vIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnMiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVCA9ICJpbXBvcnQiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImluY2x1ZGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUEgPSAic2NoZW1hIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGlnbm9yZU5hbWVzcGFjZXMgPQotICAgIHsgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSwgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCwgQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSB9OwotCi0gIHByb3RlY3RlZCBzdGF0aWMgSW5saW5lU2NoZW1hR2VuZXJhdG9yIGluc3RhbmNlID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgSW5saW5lU2NoZW1hR2VuZXJhdG9yKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaW5zdGFuY2Ugb2YgdGhlIElubGluZVNjaGVtYUdlbmVyYXRvci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoZSBpbmxpbmUgc2NoZW1hIGdlbmVyYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgSW5saW5lU2NoZW1hR2VuZXJhdG9yIGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGluc3RhbmNlID0gbmV3IElubGluZVNjaGVtYUdlbmVyYXRvcigpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzY2hlbWEgZnJvbSB0aGUgZWxlbWVudCBwcm92aWRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGVsZW1lbnRzIEEgbGlzdCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSBpbiBvcmRlci4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgVVJJIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIHZhbGlkSW1wb3J0TlNzIEEgc2V0IG9mIG5hbWVzcGFjZXMgZm9yIHdoaWNoIGl0J3MgdmFsaWQgdG8gY3JlYXRlIGltcG9ydCBzdGF0ZW1lbnRzLgotICAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NoZW1hLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlWFNEU3RyaW5nKEVsZW1lbnQgZWxlbWVudCwgTGlzdCBlbGVtZW50cywgU3RyaW5nIGZpbGVsb2NhdGlvbiwgU2V0IHZhbGlkSW1wb3J0TlNzKQotICB7Ci0JICByZXR1cm4gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmNyZWF0ZVhTRFN0cmluZyhlbGVtZW50LCBlbGVtZW50cywgZmlsZWxvY2F0aW9uLCBuZXcgSGFzaHRhYmxlKCksIHZhbGlkSW1wb3J0TlNzKTsKLSAgfQotICAKLSAgLyoqCi0gIAkqIENyZWF0ZXMgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzY2hlbWEgbW9kZWwgd2l0aCB0aGUgcm9vdCBlbGVtZW50IG9mCi0gIAkqIGV4dEVsZW0uIENhbGxzIGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5IHRvIHRha2UgY2FyZSBvZiBidWlsZGluZyB0aGUgU3RyaW5nCi0gIAkqIGFmdGVyIGl0IG9idGFpbnMgdGhlIEVsZW1lbnQgZnJvbSB0aGUgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LgotICAJKiAKLSAgCSogQHBhcmFtIGVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAJKiBAcGFyYW0gZWxlbWVudHMgQSBsaXN0IHRvIGNvbnRhaW4gdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gIAkqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRoZSBzY2hlbWEgaXMgbG9jYXRlZCBpbi4KLSAgCSogQHBhcmFtIHBhcmVudE5TcyBBIGhhc2h0YWJsZSBvZiBwYXJlbnQgbmFtZXNwYWNlcyB0byB1c2VkIHRvIHJlc29sdmUgcHJlZml4ZXMuCi0gIAkqIEBwYXJhbSB2YWxpZEltcG9ydE5TcyBBIHNldCBvZiBuYW1lc3BhY2VzIGZvciB3aGljaCBpdCdzIHZhbGlkIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50cy4KLSAgCSogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NoZW1hIHdpdGggdGhlIHJvb3QgZWxlbWVudCAnZWxlbWVudCcuCi0gIAkqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVYU0RTdHJpbmcoRWxlbWVudCBlbGVtZW50LCBMaXN0IGVsZW1lbnRzLCBTdHJpbmcgZmlsZWxvY2F0aW9uLCBIYXNodGFibGUgcGFyZW50TlNzLCBTZXQgdmFsaWRJbXBvcnROU3MpCi0gIHsKLQlTZXQgaW1wb3J0TlNzID0gbmV3IFRyZWVTZXQoKTsgCi0gICAgaW1wb3J0TlNzLmFkZEFsbCh2YWxpZEltcG9ydE5Tcyk7IAotICAgIGltcG9ydE5Tcy5hZGQoU09BUF9FTkNPRElOR19VUkkpOyAKLQotICAgIElubGluZVNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW5lcmF0b3IgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICBIYXNodGFibGUgbnNSZXNvbHZlciA9IHNjaGVtYUdlbmVyYXRvci5nZXROU1Jlc29sdmVyKGVsZW1lbnQpOwotICAgIExpc3QgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0UmVxdWlyZWROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIEhhc2h0YWJsZSByZXFOU0RlY2wgPSBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9IYXNodGFibGUgcmVxTlNEZWNsID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTlNEZWNsYXJhdGlvbnMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgTGlzdCBpbXBvcnROUyA9IHNjaGVtYUdlbmVyYXRvci5nZXRJbXBvcnROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlbW92ZUltcG9ydHMocmVxbnMsIGltcG9ydE5TKTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVMb2NhbE5hbWVzcGFjZXMocmVxbnMsIGVsZW1lbnQpOwotCXJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlc3RyaWN0SW1wb3J0cyhyZXFucywgdmFsaWRJbXBvcnROU3MpOwotICAgIHJldHVybiBzY2hlbWFHZW5lcmF0b3IuY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkoZWxlbWVudCwgZWxlbWVudHMsIHJlcW5zLCByZXFOU0RlY2wsIGZpbGVsb2NhdGlvbik7Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgaXMgcmVxdWlyZWQgYnV0IG5vdCBpbXBvcnRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gcGFyZW50TlNzIEEgaGFzaHRhYmxlIG9mIHRoZSBwYXJlbnQgbmFtZXNwYWNlcy4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzb2FwIGVuY29kaW5nIG5hbWVzcGFjZSBpcyByZXF1aXJlZCBidXQgbm90IGltcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc29hcEVuY29kaW5nUmVxdWlyZWROb3RJbXBvcnRlZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBmaWxlbG9jYXRpb24sIEhhc2h0YWJsZSBwYXJlbnROU3MpCi0gIHsKLSAgICBJbmxpbmVTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgSGFzaHRhYmxlIG5zUmVzb2x2ZXIgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0TlNSZXNvbHZlcihlbGVtZW50KTsKLSAgICBMaXN0IHJlcW5zID0gbnVsbDsKLQotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTmFtZXNwYWNlcyhlbGVtZW50KTsKLSAgICBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9zY2hlbWFHZW5lcmF0b3IucmVzb2x2ZVVuZGVjbGFyZWROYW1lc3BhY2VzKHJlcW5zLCBwYXJlbnROU3MpOwotICAgIExpc3QgaW1wb3J0TlMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0SW1wb3J0TmFtZXNwYWNlcyhlbGVtZW50KTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVJbXBvcnRzKHJlcW5zLCBpbXBvcnROUyk7Ci0gICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IucmVtb3ZlTG9jYWxOYW1lc3BhY2VzKHJlcW5zLCBlbGVtZW50KTsKLSAgICByZXR1cm4gc2NoZW1hR2VuZXJhdG9yLmNoZWNrU09BUEVuY29kaW5nUmVxdWlyZWQocmVxbnMpOwotICB9Ci0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSB1bmRlY2xhcmVkIG5hbWVzcGFjZXMuCi0gICAqIAotICAgKiBAcGFyYW0gdW5yZXNvbHZlZE5TcyBBIGxpc3Qgb2YgdW5yZXNvbHZlZCBuYW1lc3BhY2VzLgotICAgKiBAcGFyYW0gbnNSZXNvbHZlciBUaGUgbmFtZXNwYWNlIHJlc29sdmVyIHRvIHVzZS4KLSAgICogQHJldHVybiBBIGhhc2h0YWJsZSBvZiBwcmVmaXhlcyBhbmQgbmFtZXNwYWNlcy4KLSAgICovCi0vLyAgcHJvdGVjdGVkIEhhc2h0YWJsZSByZXNvbHZlVW5kZWNsYXJlZE5hbWVzcGFjZXMoTGlzdCB1bnJlc29sdmVkTlNzLCBIYXNodGFibGUgbnNSZXNvbHZlcikKLS8vICB7Ci0vLyAgICBIYXNodGFibGUgbmFtZXNwYWNlcyA9IG5ldyBIYXNodGFibGUoKTsKLS8vICAgIGlmICh1bnJlc29sdmVkTlNzICE9IG51bGwgJiYgIXVucmVzb2x2ZWROU3MuaXNFbXB0eSgpICYmIG5zUmVzb2x2ZXIgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgZm9yIChpbnQgaSA9IHVucmVzb2x2ZWROU3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0vLyAgICAgIHsKLS8vICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKXVucmVzb2x2ZWROU3MuZ2V0KGkpOwotLy8gICAgICAgIGlmIChucy5lcXVhbHMoIiIpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIG5zID0gWE1MTlM7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGVsc2UKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBucyA9IFhNTE5TICsgIjoiICsgbnM7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGlmIChuc1Jlc29sdmVyLmNvbnRhaW5zS2V5KG5zKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAvL25hbWVzcGFjZXMucmVtb3ZlKGkpOwotLy8gICAgICAgICAgLy9uYW1lc3BhY2VzLmFkZChpLCBuc1Jlc29sdmVyLmdldChucykpOwotLy8gICAgICAgICAgbmFtZXNwYWNlcy5wdXQobnMsIG5zUmVzb2x2ZXIuZ2V0KG5zKSk7Ci0vLyAgICAgICAgICB1bnJlc29sdmVkTlNzLnJlbW92ZShpKTsKLS8vICAgICAgICAgIHVucmVzb2x2ZWROU3MuYWRkKGksIG5zUmVzb2x2ZXIuZ2V0KG5zKSk7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gbmFtZXNwYWNlczsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgcmVjdXJzaXZlIG1ldGhvZCBjcmVhdGVzIHRoZSBzY2hlbWEgU3RyaW5nIGZyb20gdGhlIHJvb3QgRWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGVsZW1lbnRzIEEgbGlzdCB0byBiZSBjcmVhdGVkIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2NoZW1hIGluIG9yZGVyLgotICAgKiBAcGFyYW0gcmVxdWlyZWROYW1lc3BhY2VzIEEgbGlzdCBvZiByZXF1aXJlZCBuYW1lc3BhY2VzLgotICAgKiBAcGFyYW0gcmVxTlNEZWNsIEEgaGFzaHRhYmxlIG9mIHJlcXVpcmVkIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuCi0gICAqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcmV0dXJuIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2NoZW1hLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVYU0RTdHJpbmdSZWN1cnNpdmVseSgKLSAgICBFbGVtZW50IGVsZW0sCi0gICAgTGlzdCBlbGVtZW50cywKLSAgICBMaXN0IHJlcXVpcmVkTmFtZXNwYWNlcywKLSAgICBIYXNodGFibGUgcmVxTlNEZWNsLAotICAgIFN0cmluZyBmaWxlbG9jYXRpb24pCi0gIHsKLSAgICBpZiAoZWxlbSA9PSBudWxsKQotICAgICAgcmV0dXJuICIiOyAvLyBqdXN0IGluIGNhc2UKLQotICAgIGVsZW1lbnRzLmFkZChlbGVtKTsKLQotICAgIFN0cmluZ0J1ZmZlciB4c2RTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbS5nZXRUYWdOYW1lKCk7Ci0gICAgeHNkU3RyaW5nLmFwcGVuZCgiPCIpLmFwcGVuZChlbGVtZW50TmFtZSk7Ci0KLSAgICBib29sZWFuIGZvdW5kU2NoZW1hTG9jYXRpb24gPSBmYWxzZTsgLy8gZmxhZyBpZiBzY2hlbWFsb2NhdGlvbiBpcyBkZWZpbmVkCi0gICAgU3RyaW5nIG5hbWVzcGFjZSA9ICIiOyAvLyB0aGUgbmFtZXNwYWNlIGlmIHdlJ3JlIGNoZWNraW5nIGFuIGltcG9ydCBvciBpbmNsdWRlCi0gICAgU3RyaW5nIG5hbWVQcmVmaXggPSAiIjsgLy8gdGhlIHhtbG5zIHByZWZpeCB1c2VkIGZvciB0aGUgZWxlbWVudHMKLSAgICAvLyBHZXQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZSB4c2RTdHJpbmcKLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLSAgICAgIHhzZFN0cmluZy5hcHBlbmQoIiAiKS5hcHBlbmQobi5nZXROb2RlTmFtZSgpKS5hcHBlbmQoIj1cIiIpOwotICAgICAgU3RyaW5nIG5vZGVOYW1lID0gbi5nZXROb2RlTmFtZSgpOwotICAgICAgaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0NIRU1BTE9DQVRJT04pICYmIGZpbGVsb2NhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3VuZFNjaGVtYUxvY2F0aW9uID0gdHJ1ZTsKLSAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIHhzZFN0cmluZy5hcHBlbmQocmVsYXRpdmVQYXRoKS5hcHBlbmQoIlwiIik7ICAgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBuLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICBpZiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShOQU1FU1BBQ0UpKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlID0gbm9kZVZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGdldCB0aGUgbmFtZSBwcmVmaXggZm9yIHRoaXMgc2NoZW1hIHRvIHVzZSBpbiBnZW5lcmF0aW5nIGltcG9ydCBzdGF0ZW1lbnRzCi0gICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xKQotICAgICAgICB7Ci0KLSAgICAgICAgICBpZiAobm9kZVZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoZWxlbS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZVByZWZpeCA9IG5vZGVOYW1lOwotICAgICAgICAgICAgaWYgKG5hbWVQcmVmaXguZXF1YWxzSWdub3JlQ2FzZShYTUxOUykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hbWVQcmVmaXggPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZVByZWZpeCA9IG5hbWVQcmVmaXguc3Vic3RyaW5nKDYpICsgIjoiOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBSZXBsYWNlIG9sZCBzY2hlbWEgbmFtZXNwYWNlcyB3aXRoIHRoZSBuZXcgc2NoZW1hIG5hbWVzcGFjZS4KLSAgICAgICAgaWYobm9kZVZhbHVlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCBub2RlVmFsdWUuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotICAgICAgICAgewotICAgICAgICAgIG5vZGVWYWx1ZSA9IENvbnN0YW50cy5OU19VUklfWFNEXzIwMDE7Ci0gICAgICAgIH0KLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZChub2RlVmFsdWUpLmFwcGVuZCgiXCIiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoImltcG9ydCIpICYmICFmb3VuZFNjaGVtYUxvY2F0aW9uKQotICAgIHsKLSAgICAgIHhzZFN0cmluZy5hcHBlbmQoIiAiKS5hcHBlbmQoU0NIRU1BTE9DQVRJT04pLmFwcGVuZCgiPVwiIikuYXBwZW5kKG5hbWVzcGFjZSkuYXBwZW5kKCJcIiIpOwotICAgIH0KLSAgICAvLyBhZGQgaW4gYW55IHJlcXVpcmVkIE5TIGRlY2xhcmF0aW9ucyBmcm9tIHBhcmVudCBlbGVtZW50cwotICAgIGlmIChyZXFOU0RlY2wgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiBrZXlzID0gcmVxTlNEZWNsLmtleXMoKTsKLSAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBkZWNsTlMgPSAoU3RyaW5nKXJlcU5TRGVjbC5nZXQoa2V5KTsKLSAgICAgICAgaWYoZGVjbE5TLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCBkZWNsTlMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotICAgICAgICAgewotICAgICAgICAgIGRlY2xOUyA9IENvbnN0YW50cy5OU19VUklfWFNEXzIwMDE7Ci0gICAgICAgIH0KLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChrZXkpLmFwcGVuZCgiPVwiIikuYXBwZW5kKGRlY2xOUykuYXBwZW5kKCJcIiIpOwotICAgICAgfQotCi0gICAgfQotICAgIHhzZFN0cmluZy5hcHBlbmQoIj4iKTsKLSAgICBpZiAocmVxdWlyZWROYW1lc3BhY2VzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaVJlcXVpcmVkTmFtZXNwYWNlcyA9IHJlcXVpcmVkTmFtZXNwYWNlcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGlSZXF1aXJlZE5hbWVzcGFjZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWlSZXF1aXJlZE5hbWVzcGFjZXMubmV4dCgpOwotCi0gICAgICAgIHhzZFN0cmluZwotICAgICAgICAgIC5hcHBlbmQoIjwiKQotICAgICAgICAgIC5hcHBlbmQobmFtZVByZWZpeCkKLSAgICAgICAgICAuYXBwZW5kKElNUE9SVCkKLSAgICAgICAgICAuYXBwZW5kKCIgIikKLSAgICAgICAgICAuYXBwZW5kKE5BTUVTUEFDRSkKLSAgICAgICAgICAuYXBwZW5kKCI9XCIiKQotICAgICAgICAgIC5hcHBlbmQobnMpCi0gICAgICAgICAgLmFwcGVuZCgiXCIgIikKLSAgICAgICAgICAuYXBwZW5kKFNDSEVNQUxPQ0FUSU9OKQotICAgICAgICAgIC5hcHBlbmQoIj1cIiIpCi0gICAgICAgICAgLmFwcGVuZChucykKLSAgICAgICAgICAuYXBwZW5kKCJcIi8+Iik7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgeHNkU3RyaW5nLmFwcGVuZCgiXG4iKTsKLQotICAgIC8vIGNhbGwgdGhlIG1ldGhvZCByZWN1cnNpdmVseSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpIHx8IGkgPCA1OyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICB4c2RTdHJpbmcuYXBwZW5kKGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5KGNoaWxkLCBlbGVtZW50cywgbnVsbCwgbnVsbCwgZmlsZWxvY2F0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgeHNkU3RyaW5nLmFwcGVuZCgiPC8iKS5hcHBlbmQoZWxlbS5nZXRUYWdOYW1lKCkpLmFwcGVuZCgiPiIpOwotCi0gICAgcmV0dXJuIHhzZFN0cmluZy50b1N0cmluZygpOwotCi0gIH0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIHVzZWQgZm9yIGVsZW1lbnRzIG9yIHR5cGVzIGluIHRoZSBzY2hlbWEuCi0gICAqIFRoZXNlIGFyZSB0aGUgcmVxdWlyZWQgbmFtZXNwYWNlcyBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhbGwgdGhlIGVsbWVudHMgYXJlIHZhbGlkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIGVsZW1lbnQgdG8gY2hlY2sgZm9yIHJlcXVpcmVkIG5hbWVzcGFjZXMuCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIHJlcXVpcmVkIG5hbWVzcGFjZXMgZm9yIHRoZSBlbGVtZW50IGFuZCBhbGwgaXRzIGNoaWxkcmVuLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0UmVxdWlyZWROYW1lc3BhY2VzKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIExpc3QgbmFtZXNwYWNlID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICAvLyByZWdpc3RlciBhbGwgdGhlIGNoaWxkIHR5cGVzIGZpcnN0Ci0gICAgTm9kZUxpc3QgY2hpbGROb2RlcyA9IGVsZW0uZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBudW1DaGlsZHJlbiA9IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgLy8gVE9ETzogd2h5IGlzIHRoZXJlIGEgPCA1IGNvbmRpdGlvbj8KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNoaWxkcmVuIC8qfHwgaSA8IDUqLzsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgIC8vIHdlIG9ubHkgd2FudCBub2RlcyB0aGF0IGFyZSBFbGVtZW50cwotICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpbjsKLSAgICAgICAgTGlzdCBjaGlsZG5zID0gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKGNoaWxkKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IGNoaWxkbnMuc2l6ZSgpIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKWNoaWxkbnMuZ2V0KGopOwotICAgICAgICAgIAotICAgICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5zKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UuYWRkKG5zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gQWRkIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGN1cnJlbnQgZWxlbWVudAotICAgIFN0cmluZyBlbGVtTlMgPSBlbGVtLmdldFByZWZpeCgpOwotICAgIC8vIGlmIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSBwcmVmaXggc2V0IGl0IHRvIHRoZSBlbXB0eSBwcmVmaXguCi0gICAgaWYoZWxlbU5TID09IG51bGwpCi0gICAgewotICAgICAgZWxlbU5TID0gIiI7Ci0gICAgfQotICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKGVsZW1OUykpCi0gICAgIHsKLSAgICAgIG5hbWVzcGFjZS5hZGQoZWxlbU5TKTsKLSAgICB9Ci0gICAgLy8gbm93IGFkZCBhbGwgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCdzIG5hbWVzcGFjZXMKLSAgICAvLyBkb24ndCBpbmNsdWRlIGltcG9ydCBhbmQgc2NoZW1hIGVsZW1lbnRzCi0gICAgU3RyaW5nIGxvY2FsbmFtZSA9IGVsZW0uZ2V0TG9jYWxOYW1lKCk7Ci0gICAgaWYgKCFsb2NhbG5hbWUuZXF1YWxzKElNUE9SVCkgJiYgIWxvY2FsbmFtZS5lcXVhbHMoSU5DTFVERSkgJiYgIWxvY2FsbmFtZS5lcXVhbHMoU0NIRU1BKSkKLSAgICB7Ci0gICAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLQotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIC8vIHJlbW92ZWQgcmVzdHJpY3Rpb24gdGhhdCB3ZSdyZSBvbmx5IGxvb2tpbmcgYXQgdHlwZXMKLSAgICAgICAgLy8JCWlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRZUEUpKQotICAgICAgICAvLwkJewotICAgICAgICAvLyBkb24ndCB0YWtlIG5hbWVzcGFjZSBpbmZvIGZyb20gYXR0cmlidXRlcyBkZWZpbmluZyBuYW1lc3BhY2VzLgotICAgICAgICAvLyB0aGF0IGluY2x1ZGVzIHhtbG5zLCB0YXJnZXROYW1lc3BhY2UKLSAgICAgICAgLy8gZG9uJ3QgdGFrZSBuYW1lc3BhY2UgaW5mbyBmcm9tIG5hbWUgYXR0cmlidXRlcwotICAgICAgICBpZiAobm9kZU5hbWUuaW5kZXhPZihYTUxOUykgIT0gLTEgfHwgbm9kZU5hbWUuZXF1YWxzKFRBUkdFVE5BTUVTUEFDRSkgfHwgbm9kZU5hbWUuZXF1YWxzKE5BTUUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgaW50IGNvbG9uSW5kZXggPSBub2RlVmFsdWUuaW5kZXhPZigiOiIpOwotICAgICAgICAvLyBEb24ndCB0YWtlIG5hbWVzcGFjZSBpbmZvIGZyb20gYXR0cmlidXRlcyB3aXRoIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgdGhhdCBpcyBhdHRyaWJ1dGVzCi0gICAgICAgIC8vIHRoYXQgYXJlIG5vdCBwcmVmaXhlZC4gKGNvbG9uSW5kZXggPT0gLTEpCi0gICAgICAgIC8vIElmIHRoZSBjb2xvbkluZGV4IGlzIGZvbGxvd2VkIGJ5IGEgLyB0aGVuIGl0IGlzIGEgVVJJIGFuZCBub3QKLSAgICAgICAgLy8gbmFtZXNwYWNlIHF1YWxpZmllZC4KLQkJaWYgKGNvbG9uSW5kZXggPT0gLTEgfHwgKGNvbG9uSW5kZXggKyAxIDwgbm9kZVZhbHVlLmxlbmd0aCgpICYmIG5vZGVWYWx1ZS5jaGFyQXQoY29sb25JbmRleCArIDEpID09ICcvJykpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgZm91bmQgYSBjb2xvbiBkZWxpbWl0ZXIgc28gd2UgbmVlZCB0aGUgbmFtZXNwYWNlIGRlZmluZWQgaGVyZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlVmFsdWUgPSBub2RlVmFsdWUuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5vZGVWYWx1ZSkpCi0gICAgICAgIHsKLQotICAgICAgICAgIG5hbWVzcGFjZS5hZGQobm9kZVZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAvLwkJfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgbmFtZXNwYWNlcyB0aGF0IGhhdmUgYW4gaW1wb3J0IHN0YXRlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBBIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGltcG9ydGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0SW1wb3J0TmFtZXNwYWNlcyhFbGVtZW50IGVsZW0pCi0gIHsKLSAgICBMaXN0IG5hbWVzcGFjZSA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIGNhbGwgdGhlIG1ldGhvZCByZWN1cnNpdmVseSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgLy8gcmVnaXN0ZXIgYWxsIHRoZSBjaGlsZCB0eXBlcyBmaXJzdAotICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSB8fCBpIDwgNTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgIC8vIHdlIG9ubHkgd2FudCBub2RlcyB0aGF0IGFyZSBFbGVtZW50cwotICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpbjsKLSAgICAgICAgTGlzdCBjaGlsZG5zID0gZ2V0SW1wb3J0TmFtZXNwYWNlcyhjaGlsZCk7Ci0gICAgICAgIGZvciAoaW50IGogPSBjaGlsZG5zLnNpemUoKSAtIDE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyljaGlsZG5zLmdldChqKTsKLSAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhucykpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlLmFkZChucyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGlmIHRoaXMgaXMgYW4gaW1wb3J0IGVsZW1lbnQgZ2V0IHRoZSBuYW1lc3BhY2UgYW5kIGFkZCBpdCB0byB0aGUgbGlzdAotICAgIGlmIChlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSU1QT1JUKSkKLSAgICB7Ci0gICAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLQotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIGlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5BTUVTUEFDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbm9kZVZhbHVlID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhub2RlVmFsdWUpKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgbmFtZXNwYWNlLmFkZChub2RlVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBIYXNodGFibGUgd2l0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXMga2V5cyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIEEgaGFzaHRhYmxlIHdpdGggbmFtZXNwYWNlIHByZWZpeGVzIG1hcHBlZCB0byBuYW1lc3BhY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXROU1Jlc29sdmVyKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIEhhc2h0YWJsZSBuc1Jlc29sdmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgTmFtZWROb2RlTWFwIGF0dHMgPSBlbGVtLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBhdHRzLml0ZW0oaSk7Ci0KLSAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIGlmIChub2RlTmFtZS5pbmRleE9mKFhNTE5TKSAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lUHJlZml4ID0gbm9kZU5hbWU7Ci0KLSAgICAgICAgaWYgKG5hbWVQcmVmaXguZXF1YWxzSWdub3JlQ2FzZShYTUxOUykpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lUHJlZml4ID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVByZWZpeCA9IG5hbWVQcmVmaXguc3Vic3RyaW5nKDYpOwotICAgICAgICB9Ci0gICAgICAgIG5zUmVzb2x2ZXIucHV0KG5hbWVQcmVmaXgsIG5vZGVWYWx1ZSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5zUmVzb2x2ZXI7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSBuYW1lc3BhY2VzIGluIHRoZSBnaXZlbiBuYW1lc3BhY2VzIGxpc3Qgd2l0aCB0aGUgdHdvIG5hbWVzcGFjZQotICAgKiByZXNvbHZlciBoYXNodGFibGVzIHByb3ZpZGVkLiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbmFtZXNwYWNlIHRoYXQgbmVlZAotICAgKiB0byBiZSBkZWNsYXJlZC4KLSAgICogRmlyc3QgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsb2NhbCBuYW1lc3BhY2VzIHdpdGggbnNSZXNvbHZlci4KLSAgICogTmV4dCByZXNvbHZlIGFnYWluc3QgdGhlIHBhcmVudCBuYW1lc3BhY2Ugd2l0aCBwYXJlbnROU1Jlc29sdmVyLgotICAgKiBBIHNpZGUgYWZmZWN0IG9mIHRoaXMgbWV0aG9kIGlzIHRoZSBuYW1lc3BhY2VzIGxpc3QgaXMgbGVmdCB3aXRoIG9ubHkgdGhvc2UgCi0gICAqIG5hbWVzcGFjZXMgdGhhdCBhcmUgcmVzb2x2ZWQgYW5kIHRoZSByZXNvbHZlZCBlbnRpdGllcyBhcmUgcGxhY2VkIGluIHRoZSAKLSAgICogbGlzdCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBlbnRyaWVzLgotICAgKiBGb3IgZXguIElmIHlvdSBwcm92aWRlIGEgbGlzdCBzdWNoIGFzIHt4c2QsIGludGZ9IGFuZCBvbmx5IHhzZCBjYW4gYmUgcmVzb2x2ZWQKLSAgICogeW91IHdpbGwgZW5kIHVwIHdpdGggdGhlIGxpc3Qge2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfQotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB0byByZXNvbHZlLgotICAgKiBAcGFyYW0gbnNSZXNvbHZlciBUaGUgaGFzaHRhYmxlIHRvIGJlIHVzZWQgYXMgdGhlIGxvY2FsIHJlc29sdmVyLgotICAgKiBAcGFyYW0gcGFyZW50TlNSZXNvbHZlciBUaGUgaGFzaHRhYmxlIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBuYW1lc3BhY2UgcmVzb2x2ZXIuCi0gICAqIEByZXR1cm4gQSBIYXNodGFibGUgb2YgbmFtZXNwYWNlcyB0aGF0IG11c3QgYmUgZGVjbGFyZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHJlc29sdmVOYW1lc3BhY2VzKExpc3QgbmFtZXNwYWNlcywgSGFzaHRhYmxlIG5zUmVzb2x2ZXIsIEhhc2h0YWJsZSBwYXJlbnROU1Jlc29sdmVyKQotICB7Ci0gIAlIYXNodGFibGUgcmVxTlNEZWNsID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwgJiYgIW5hbWVzcGFjZXMuaXNFbXB0eSgpICYmIG5zUmVzb2x2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gbmFtZXNwYWNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyluYW1lc3BhY2VzLmdldChpKTsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgbmFtZXNwYWNlcy5yZW1vdmUoaSk7Ci0gICAgICAgIC8vIEZpcnN0IHRyeSB0byByZXNvbHZlIGFnYWluc3QgdGhlIGxvY2FsIG5hbWVzcGFjZSByZXNvbHZlci4KLSAgICAgICAgaWYgKG5zUmVzb2x2ZXIuY29udGFpbnNLZXkobnMpKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IHJlc29sdmVkTlMgPSBuc1Jlc29sdmVyLmdldChucyk7Ci0gICAgICAgICAgLy8gT25seSBhZGQgdGhlIG5hbWVzcGFjZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgIGlmKCFuYW1lc3BhY2VzLmNvbnRhaW5zKHJlc29sdmVkTlMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZXMuYWRkKGksIG5zUmVzb2x2ZXIuZ2V0KG5zKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5leHQgdHJ5IHRvIHJlc29sdmUgYWdhaW5zdCB0aGUgcGFyZW50IG5hbWVzcGFjZSByZXNvbHZlci4KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlpZiAobnMuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbnMgPSBYTUxOUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbnMgPSBYTUxOUyArICI6IiArIG5zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudE5TUmVzb2x2ZXIuY29udGFpbnNLZXkobnMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3QgcmVzb2x2ZWROUyA9IHBhcmVudE5TUmVzb2x2ZXIuZ2V0KG5zKTsKLSAgICAgICAgICAgICAgLy8gT25seSBhZGQgdGhlIG5hbWVzcGFjZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgICAgICBpZighbmFtZXNwYWNlcy5jb250YWlucyhyZXNvbHZlZE5TKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuYWRkKGksIHJlc29sdmVkTlMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8vIFN0aWxsIG5lZWQgdG8gZGVjbGFyZSB0aGUgbmFtZXNwYWNlIHRob3VnaC4KLSAgICAgICAgICAgICAgcmVxTlNEZWNsLnB1dChucywgcmVzb2x2ZWROUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVxTlNEZWNsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhbnkgbmFtZXNwYWNlIGZyb20gdGhlIG5hbWVzcGFjZXMgbGlzdCBpZiBpdCBpcyBpbiB0aGUgaW1wb3J0IGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbmFtZXNwYWNlcyBsaXN0LgotICAgKiBAcGFyYW0gaW1wb3J0ZWROYW1lc3BhY2VzIEEgbGlzdCBvZiBpbXBvcnRlZCBuYW1lc3BhY2VzLgotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG5hbWVzcGFjZXMgd2l0aG91dCB0aGUgaW1wb3J0ZWQgbmFtZXNwYWNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IHJlbW92ZUltcG9ydHMoTGlzdCBuYW1lc3BhY2VzLCBMaXN0IGltcG9ydGVkTmFtZXNwYWNlcykKLSAgewotICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwgJiYgaW1wb3J0ZWROYW1lc3BhY2VzICE9IG51bGwgJiYgIWltcG9ydGVkTmFtZXNwYWNlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgSXRlcmF0b3IgaUltcG9ydGVkTlMgPSBpbXBvcnRlZE5hbWVzcGFjZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpSW1wb3J0ZWROUy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpTlMgPSAoU3RyaW5nKWlJbXBvcnRlZE5TLm5leHQoKTsKLQotICAgICAgICBuYW1lc3BhY2VzLnJlbW92ZShpTlMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYSBhbmQgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoZSBpZ25vcmVOYW1lc3BhY2VzCi0gICAqIGxpc3QgZnJvbSB0aGUgbmFtZXNwYWNlcyBsaXN0IHByb3ZpZGVkLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIGxpc3Qgb2YgbG9jYWwgbmFtZXNwYWNlcy4KLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG5hbWVzcGFjZXMgd2l0aCB0aGUgbG9jYWwgbmFtZXNwYWNlcyByZW1vdmVkLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgcmVtb3ZlTG9jYWxOYW1lc3BhY2VzKExpc3QgbmFtZXNwYWNlcywgRWxlbWVudCBlbGVtKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZXMgIT0gbnVsbCAmJiBlbGVtICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5zID0gZWxlbS5nZXRBdHRyaWJ1dGUoVEFSR0VUTkFNRVNQQUNFKTsKLSAgICAgIG5hbWVzcGFjZXMucmVtb3ZlKG5zKTsKLQotICAgICAgZm9yIChpbnQgaSA9IGlnbm9yZU5hbWVzcGFjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIC8vIGtlZXAgcmVtb3ZpbmcgdGhlIG5hbWVzcGFjZSB1bnRpbCBpdCBpcyBub3QgaW4gdGhlIGxpc3QKLSAgICAgICAgaWYgKG5hbWVzcGFjZXMucmVtb3ZlKGlnbm9yZU5hbWVzcGFjZXNbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0gIAotICAvKiogCi0gICAqIFJlbW92ZSBhbGwgdGhlIG5hbWVzcGFjZXMgaW4gdGhlIG5hbWVzcGFjZXMgbGlzdCB0aGF0IGFyZW4ndCBjb250YWluZWQgaW4gdGhlIAotICAgKiB2YWxpZEltcG9ydE5TcyBzZXQuIAotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgQSBsaXN0IG9mIG5hbWVzcGFjZXMuIAotICAgKiBAcGFyYW0gdmFsaWRJbXBvcnROU3MgQSBzZXQgb2YgdmFsaWQgbmFtZXNwYWNlcy4gCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIG5hbWVzcGFjZXMgdGhhdCBkb2VzIG5vdCBjb250YWluIGFueSBtZW1iZXJzIHdoaWNoIGFyZW4ndCBpbiB0aGUgdmFsaWRJbXBvcnROU3Mgc2V0LiAKLSAgICovIAotICBwcm90ZWN0ZWQgTGlzdCByZXN0cmljdEltcG9ydHMoTGlzdCBuYW1lc3BhY2VzLCBTZXQgdmFsaWRJbXBvcnROU3MpIAotICB7IAotICAgICAgICBJdGVyYXRvciBuc0l0ZXIgPSBuYW1lc3BhY2VzLml0ZXJhdG9yKCk7IAotICAgICAgICB3aGlsZShuc0l0ZXIuaGFzTmV4dCgpKSAKLSAgICAgICAgeyAKLSAgICAgICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKW5zSXRlci5uZXh0KCk7IAotICAgICAgICAgIGlmKCF2YWxpZEltcG9ydE5Tcy5jb250YWlucyhucykpIAotICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5yZW1vdmUobnMpOyAKLQkJCQluc0l0ZXIgPSBuYW1lc3BhY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgfSAKLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXM7IAotICB9IAotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGlzIGluIHRoZSBsaXN0IG9mIHJlcXVpcmVkIG5hbWVzcGFjZXMsCi0gICAqIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEBwYXJhbSByZXFucyBUaGUgbGlzdCBvZiBuYW1lc3BhY2VzIHRvIGNoZWNrIGZvciB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2VzIGlzIGluIHRoZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1NPQVBFbmNvZGluZ1JlcXVpcmVkKExpc3QgcmVxbnMpCi0gIHsKLSAgICBpZiAocmVxbnMuY29udGFpbnMoU09BUF9FTkNPRElOR19VUkkpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9JbmxpbmVTY2hlbWFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1OGYyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lU2NoZW1hVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudXRpbC5FcnJvck1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm87Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogUGx1Z2luIHZhbGlkYXRvciBmb3IgdGhlIFdTREwgVmFsaWRhdGlvbiBmcmFtZXdvcmsuIFZhbGlkYXRlcyBpbmxpbmUgc2NoZW1hIGZvdW5kIGluIGEgV1NETCBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIElubGluZVNjaGVtYVZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1dBUk5fT0xEX1NDSEVNQV9OQU1FU1BBQ0UgPSAiX1dBUk5fT0xEX1NDSEVNQV9OQU1FU1BBQ0UiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1NDSEVNQSA9ICJfV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1NDSEVNQSI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBRVU9URSA9ICInIjsKLSAgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yID0gbnVsbDsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLklXU0RMMTFWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUud3NkbDExLldTREwxMVZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbGVtZW50OwotICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgcGFyZW50cy5nZXQocGFyZW50cy5zaXplKCkgLSAxKTsKLSAgICBTdHJpbmcgYmFzZUxvY2F0aW9uID0gd3NkbERlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgLy8gQWRkIGluIHRoZSBuYW1lc3BhY2VzIGRlZmluZWQgaW4gdGhlIGRvYyBhbHJlYWR5IHRoYXQgYXJlbid0IGRlZmluZWQgbG9jYWxseSBpbiB0aGlzIHNjaGVtYS4KLSAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGZvciBuYW1lc3BhY2VzIG90aGVyIHRoZW4gaW4gdGhlIGRlZmludGlvbnMgYW5kIHR5cGVzIGVsZW1lbnRzIGFzCi0gICAgLy8gaW5saW5lIHNjaGVtYSBjYW4gbm90IGhhdmUgYW55IG90aGVyIHBhcmVudHMgYW5kIG11c3QgaGF2ZSB0aGVyZSB0d28gcGFyZW50cy4KLSAgICAvLyBGaXJzdCB0YWtlIGNhcmUgb2YgdGhlIGRlZmluaXRpb25zIGVsZW1lbnQKLSAgICAKLSAgICAvLyBjcmVhdGUgdGhlIGlubGluZSBzY2hlbWEgc3RyaW5nCi0JRWxlbWVudCB3M2NlbGVtZW50ID0gZWxlbS5nZXRFbGVtZW50KCk7Ci0JSGFzaHRhYmxlIHBhcmVudG5hbWVzcGFjZXMgPSBnZXROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbix3M2NlbGVtZW50KTsKLQlTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gdzNjZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0JLy8gaWYgdGhlIHRhcmdldE5hbWVzcGFjZSBoYXNuJ3QgYmVlbiBkZWZpbmVkIGZvciB0aGUgc2NoZW1hIHVzZSB0aGUgCi0JLy8gdGFyZ2V0TmFtZXNwYWNlIG9mIHRoZSBkZWZpbml0aW9ucyBlbGVtZW50Ci0JaWYodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgfHwgdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhFTVBUWV9TVFJJTkcpKQotCSB7Ci0JICB0YXJnZXROYW1lc3BhY2UgPSB3c2RsRGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkgIHczY2VsZW1lbnQuc2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UsdGFyZ2V0TmFtZXNwYWNlKTsKLQl9Ci0JCi0gICAgLy8gSWYgdGhlIG5hbWVzcGFjZSBnaXZlbiBpcyBvbmUgb2YgdGhlIG9sZCBzY2hlbWEgbmFtZXNwYWNlcyBwcm9kdWNlIGEgd2FybmluZy4KLQlTdHJpbmcgbmFtZXNwYWNlID0gdzNjZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQlpZihuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IG5hbWVzcGFjZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0JIHsKLQkgIHZhbEluZm8uYWRkV2FybmluZygKLQkgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfV0FSTl9PTERfU0NIRU1BX05BTUVTUEFDRSwgUVVPVEUgKyBDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxICsgUVVPVEUpLCBlbGVtZW50KTsKLQl9Ci0JCi0gICAgLy8gbm93IGNyZWF0ZSBhbmQgY2FsbCB0aGUgdmFsaWRhdG9yIGZvciB0aGUgaW5saW5lIHNjaGVtYQotICAgIFhTRFZhbGlkYXRvciBzY2hlbWF2ID0gbmV3IFhTRFZhbGlkYXRvcigpOwotICAgIAotICAgIC8vU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG5ldyBVUkwodmFsaWRhdG9ybWFuYWdlci5nZXRGaWxlbmFtZSgpKS5nZXRQYXRoKCk7Ci0gICAgSW5saW5lWFNEUmVzb2x2ZXIgaW5saW5lRW50aXR5UmVzb2x2ZXIgPQotICAgICAgZ2V0RW50aXR5UmVzb2x2ZXIod3NkbERlZmluaXRpb24sIChUeXBlcykgcGFyZW50cy5nZXQoMCksIGJhc2VMb2NhdGlvbiwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAvLwlhZGQgaW4gdGhlIGV4dGVybmFsIFhTRCBDYXRhbG9nIHRvIHJlc29sdmUgc2NoZW1hcyBvZmZsaW5lCi0gICAgWE1MRW50aXR5UmVzb2x2ZXJDaGFpbiBlbnRpdHlSZXNvbHZlckNoYWluID0gbmV3IFhNTEVudGl0eVJlc29sdmVyQ2hhaW4oKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKGlubGluZUVudGl0eVJlc29sdmVyKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKChYTUxFbnRpdHlSZXNvbHZlcil2YWxJbmZvLmdldFVSSVJlc29sdmVyKCkpOwotICAgIC8vZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihYTUxDYXRhbG9nUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihuZXcgRmlsZUVudGl0eVJlc29sdmVyKCkpOwotCQotICAgIC8vCSBDcmVhdGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5saW5lIHNjaGVtYS4gCi0gICAgU3RyaW5nIHhzZCA9IElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcodzNjZWxlbWVudCwgZWxlbWVudHMsIGJhc2VMb2NhdGlvbiwgcGFyZW50bmFtZXNwYWNlcywgaW5saW5lRW50aXR5UmVzb2x2ZXIuZ2V0SW5saW5lU2NoZW1hTlNzKCkpOyAKLQotCQotICAgIHNjaGVtYXYudmFsaWRhdGVJbmxpbmVTY2hlbWEoeHNkLCB0YXJnZXROYW1lc3BhY2UsIGJhc2VMb2NhdGlvbiwgZW50aXR5UmVzb2x2ZXJDaGFpbiwgaW5saW5lRW50aXR5UmVzb2x2ZXIpOwotICAgIAotLy8JY2hlY2sgaWYgdGhlIFNPQVAgRW5jb2RpbmcgbmFtZXNwYWNlIGlzIHJlcXVpcmVkIGJ1dCBub3QgaW1wb3J0ZWQKLQkJIGlmIChJbmxpbmVTY2hlbWFHZW5lcmF0b3Iuc29hcEVuY29kaW5nUmVxdWlyZWROb3RJbXBvcnRlZChlbGVtLmdldEVsZW1lbnQoKSwgYmFzZUxvY2F0aW9uLCBwYXJlbnRuYW1lc3BhY2VzKSkKLQkJIHsKLQkJICAgdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX1NPQVBFTkNfSU1QT1JURURfU0NIRU1BKSwgZWxlbWVudCk7Ci0JCSB9Ci0KLSAgICAvLyBJZiB0aGUgc2NoZW1hIGlzbid0IHZhbGlkIGFkZCB0aGUgZXJyb3IgbWVzc2FnZXMgcHJvZHVjZWQgdG8gdmFsaW5mby4KLSAgICAvLyBEb24ndCBhZGQgdGhlIGVycm9ycyBpZiB0aGV5IGFyZSBsb2NhdGVkIG9uIGFub3RoZXIgaW5saW5lIHNjaGVtYS4gVGhlc2UKLQkvLyB3aWxsIGJlIHJlcG9ydGVkIHdoZW4gdGhlIG90aGVyIHNjaGVtYSBpcyB2YWxpZGF0ZWQuCi0JCSAKLSAgICBpZiAoIXNjaGVtYXYuaXNWYWxpZCgpKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGVycm9ycyA9IHNjaGVtYXYuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChlcnJvcnMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFcnJvck1lc3NhZ2UgZXJyID0gKEVycm9yTWVzc2FnZSkgZXJyb3JzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IGVyci5nZXRVUkkoKTsKLSAgICAgICAgaW50IGxpbmUgPSBlcnIuZ2V0RXJyb3JMaW5lKCk7Ci0gICAgICAgIFN0cmluZyBlcnJtZXNzID0gZXJyLmdldEVycm9yTWVzc2FnZSgpOwotICAgICAgICBlcnJtZXNzID0gcmVwbGFjZU5hbWVzcGFjZShlcnJtZXNzLCBuYW1lc3BhY2UpOwotICAgICAgICBpZihsaW5lID4gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHModmFsSW5mby5nZXRGaWxlVVJJKCkpKQotICAgICAgICAgIHsKLQkJCXZhbEluZm8uYWRkRXJyb3IoZXJybWVzcywgZ2V0T2JqZWN0QXRMaW5lKGxpbmUgLSAxLCBlbGVtZW50cykpOwotICAgICAgICAgIH0KLQkJICBlbHNlIGlmKCFpbmxpbmVFbnRpdHlSZXNvbHZlci5pc0lubGluZVNjaGVtYSh1cmkpICYmICF1cmkuZXF1YWxzKHZhbEluZm8uZ2V0RmlsZVVSSSgpICsgSW5saW5lWFNEUmVzb2x2ZXIuSU5MSU5FX1NDSEVNQV9JRCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdmFsSW5mby5hZGRFcnJvcihlcnJtZXNzLCBsaW5lLCBlcnIuZ2V0RXJyb3JDb2x1bW4oKSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJZWxzZSBpZih1cmkgIT0gbnVsbCAmJiAhaW5saW5lRW50aXR5UmVzb2x2ZXIuaXNJbmxpbmVTY2hlbWEodXJpKSAmJiAhdXJpLmVxdWFscyh2YWxJbmZvLmdldEZpbGVVUkkoKSArIElubGluZVhTRFJlc29sdmVyLklOTElORV9TQ0hFTUFfSUQpKQotICAgICAgICB7Ci0JICAgICAgdmFsSW5mby5hZGRFcnJvcihlcnJtZXNzLCAwLDAsIHVyaSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gaWYgdGhlIHNjaGVtYSBpcyB2YWxpZCwgYXNzaWduIHRoZSBtb2RlbCB0byB0aGUgdmFsaWRhdG9ybWFuYWdlcgotICAgIGVsc2UKLSAgICB7Ci0gICAgICBYU01vZGVsIHhzTW9kZWwgPSBzY2hlbWF2LmdldFhTTW9kZWwoKTsKLSAgICAgIHZhbEluZm8uYWRkU2NoZW1hKHhzTW9kZWwpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW4gZW50aXR5IHJlc29sdmVyIHRoYXQgd2lsbCByZXNvbHZlIGlubGluZSBzY2hlbWFzLiAgRXZlcnkgaW5saW5lIHNjaGVtYSBpcyBwcmVyZWdpc3RlcmVkIHdpdGgKLSAgICogdGhlIHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB0eXBlcyBUaGUgdHlwZXMgZWxlbWVudC4KLSAgICogQHBhcmFtIHJlZmVyZW5jZUxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXROYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBBbiBlbnRpdHkgcmVzb2x2ZXIgdGhhdCBjYW4gcmVzb2x2ZSBpbmxpbmUgc2NoZW1hcy4KLSAgICovCi0gIHByb3RlY3RlZCBJbmxpbmVYU0RSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcihEZWZpbml0aW9uIHdzZGxEZWZpbml0aW9uLCBUeXBlcyB0eXBlcywgU3RyaW5nIHJlZmVyZW5jZUxvY2F0aW9uLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgSW5saW5lWFNEUmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSBuZXcgSW5saW5lWFNEUmVzb2x2ZXIoKTsKLS8vICAgIGVudGl0eVJlc29sdmVyLnNldFJlZmVyZW5jZUxvY2F0aW9uKHJlZmVyZW5jZUxvY2F0aW9uKTsKLSAgICBMaXN0IHNjaGVtYXMgPSB0eXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBpZiAoc2NoZW1hcyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGlTY2hlbWFzID0gc2NoZW1hcy5pdGVyYXRvcigpOwotCSAgU2V0IG5hbWVzcGFjZXMgPSBuZXcgVHJlZVNldCgpOyAKLSAgICAgIHdoaWxlIChpU2NoZW1hcy5oYXNOZXh0KCkpIAotICAgICAgeyAKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBpU2NoZW1hcy5uZXh0KCk7IAotICAgICAgICBTdHJpbmcgdGhpc05hbWVzcGFjZSA9IGV4dEVsZW0uZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShDb25zdGFudHMuQVRUUl9UQVJHRVRfTkFNRVNQQUNFKTsgCi0gICAgICAgIGlmKHRoaXNOYW1lc3BhY2UgIT0gbnVsbCkgCi0gICAgICAgIHsgCi0gICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5hZGQodGhpc05hbWVzcGFjZSk7IAotICAgICAgICB9IAotICAgICAgfSAKLSAgICAgIGlTY2hlbWFzID0gc2NoZW1hcy5pdGVyYXRvcigpOyAKLQotICAgICAgd2hpbGUgKGlTY2hlbWFzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBpU2NoZW1hcy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aGlzTmFtZXNwYWNlID0gZXh0RWxlbS5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBpZiAodGhpc05hbWVzcGFjZSAhPSBudWxsICYmICF0aGlzTmFtZXNwYWNlLmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0TmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAJCi0gICAgICAgIAlFbGVtZW50IGVsZW1lbnQgPSBleHRFbGVtLmdldEVsZW1lbnQoKTsKLQkJCQotLy8JCQljcmVhdGUgdGhlIGlubGluZSBzY2hlbWEgc3RyaW5nCi0JCQkgLy9FbGVtZW50IHczY2VsZW1lbnQgPSBlbGVtLmdldEVsZW1lbnQoKTsKLQkJCSBIYXNodGFibGUgcGFyZW50bmFtZXNwYWNlcyA9IGdldE5hbWVzcGFjZURlY2xhcmF0aW9uc0Zyb21QYXJlbnRzKHdzZGxEZWZpbml0aW9uLGVsZW1lbnQpOwotCQkJIFN0cmluZyB4c2QgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuY3JlYXRlWFNEU3RyaW5nKGVsZW1lbnQsIG5ldyBBcnJheUxpc3QoKSwgcmVmZXJlbmNlTG9jYXRpb24sIHBhcmVudG5hbWVzcGFjZXMsIG5hbWVzcGFjZXMpOwotICAgICAgICAJLy9hZGROYW1lc3BhY2VEZWNsYXJhdGlvbnNGcm9tUGFyZW50cyh3c2RsRGVmaW5pdGlvbixlbGVtZW50KTsKLSAgICAgICAgICBlbnRpdHlSZXNvbHZlci5hZGQodGhpc05hbWVzcGFjZSwgeHNkKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlbnRpdHlSZXNvbHZlcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEudmFsaWRhdG9yLklXU0RMMTFWYWxpZGF0b3Ijc2V0UmVzb3VyY2VCdW5kbGUoamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgCW1lc3NhZ2VnZW5lcmF0b3IgPSBuZXcgTWVzc2FnZUdlbmVyYXRvcihyYik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2VHZW5lcmF0b3IoTWVzc2FnZUdlbmVyYXRvciBtZXNzZ2VuKQotICB7Ci0gICAgbWVzc2FnZWdlbmVyYXRvciA9IG1lc3NnZW47Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGFzIGluIHRoZSBmb3JtIAotICAgKiB4bWxucz0ic29tZW5hbWVzcGFjZSIKLSAgICogZnJvbSB0aGUgZGVmaW5pdGlvbnMgYW5kIHR5cGVzIGVsZW1lbnRzIGFuZCBhZGQgdGhlbSB0byB0aGUgc2NoZW1hIGVsZW1lbnQgc28gdGhlIHNjaGVtYSAKLSAgICogdmFsaWRhdG9yIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LgotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgdHlwZXMgZWxlbWVudC4KLSAgICogQHJldHVybiBBIGhhc2h0YWJsZSB3aXRoIHRoZSBuYW1lc3BhY2UgZWxlbWVudHMgZnJvbSB0aGUgZWxlbWVudHMgcHJvdmlkZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGdldE5hbWVzcGFjZURlY2xhcmF0aW9uc0Zyb21QYXJlbnRzKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAJSGFzaHRhYmxlIG5zcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBJdGVyYXRvciBuYW1lU3BhY2VzID0gd3NkbERlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0KLSAgICBTdHJpbmcgWE1MTlMgPSBDb25zdGFudHMuQVRUUl9YTUxOUzsKLSAgICAKLSAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAiIjsKLSAgICB3aGlsZSAobmFtZVNwYWNlcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgU3RyaW5nIG5zcHJlZml4ID0gWE1MTlM7Ci0gICAgICBTdHJpbmcgbnMgPSAoU3RyaW5nKSBuYW1lU3BhY2VzLm5leHQoKTsKLSAgICAgIGlmICghbnMuZXF1YWxzSWdub3JlQ2FzZSgiIikpCi0gICAgICB7Ci0gICAgICAgIG5zcHJlZml4ICs9ICI6IjsKLSAgICAgIH0KLSAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUobnNwcmVmaXggKyBucykpCi0gICAgICB7Ci0gICAgICAJbnNzLnB1dChuc3ByZWZpeCArIG5zLCB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UobnMpKTsKLS8vICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuc3ByZWZpeCArIG5zLCB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2UobnMpKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICAvLyBOZXh0IGhhbmRsZSB0aGUgcGFyZW50IHR5cGVzIGVsZW1lbnQKLSAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBpbnQgYXR0c2xlbmd0aCA9IGF0dHMuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSB0ZW1wbm9kZSA9IGF0dHMuaXRlbShpKTsKLSAgICAgIFN0cmluZyBub2RlbmFtZSA9IHRlbXBub2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAvLyBpZiB0aGlzIGlzIGEgbmFtZXNwYWNlIGF0dHJpYnV0ZQotICAgICAgaWYgKG5vZGVuYW1lLmluZGV4T2YoWE1MTlMpICE9IC0xKQotICAgICAgewotCQluc3MucHV0KG5vZGVuYW1lLCAgdGVtcG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKG5vZGVuYW1lLCB0ZW1wbm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuc3M7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHaXZlbiBhIGxpbmUgbnVtYmVyIGZvciB0aGUgc2NoZW1hIHJldHVybnMgdGhlIGVsZW1lbnQgZm91bmQgb24gdGhhdCBsaW5lLiAKLSAgICogVXNlZnVsIGZvciBvYnRhaW5pbmcgZWxlbWVudHMgZnJvbSBzY2hlbWEgU3RyaW5ncy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIG51bWJlciBmb3IgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGVsZW1lbnRzIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIGNoZWNrLgotICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgbG9jYXRlZCBhdCB0aGUgbGluZSBvciBhdCBsaW5lIDAgaWYgdGhlIGxpbmUgaXMgaW52YWxpZC4KLSAgICovCi0gICBwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdEF0TGluZShpbnQgbGluZSwgTGlzdCBlbGVtZW50cykKLSAgIHsKLSAgIAlpZihsaW5lIDwgMCB8fCBsaW5lID49IGVsZW1lbnRzLnNpemUoKSkKLSAgIAl7Ci0gICAJICBsaW5lID0gMDsKLSAgIAl9Ci0JcmV0dXJuIGVsZW1lbnRzLmdldChsaW5lKTsKLSAgIH0KLSAgIAotICAvKioKLSAgICogUmVwbGFjZSBhbnkgaW5zdGFuY2Ugb2YgdGhlIDIwMDEgc2NoZW1hIG5hbWVzcGFjZSBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSB3aXRoCi0gICAqIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byByZXBsYWNlIHRoZSBuYW1lc3BhY2UgaW4uCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB1c2VkIGZvciByZXBsYWNlbWVudC4KLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSB3aXRoIHRoZSAyMDAxIHNjaGVtYSBuYW1lc3BhY2UgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlcGxhY2VOYW1lc3BhY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBuYW1lc3BhY2UpCi0gICB7Ci0gICAgIFN0cmluZyB4c2QyMDAxID0gQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMTsKLSAgICAgaW50IHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKHhzZDIwMDEpOwotICAgICBpbnQgZW5kID0gc3RhcnQgKyB4c2QyMDAxLmxlbmd0aCgpOwotICAgICBpZihzdGFydCA8IDApCi0gICAgIHsKLSAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICAgfQotICAgICBTdHJpbmcgc3RhcnRTdHJpbmcgPSBtZXNzYWdlLnN1YnN0cmluZygwLHN0YXJ0KTsKLSAgICAgU3RyaW5nIGVuZFN0cmluZyA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCxtZXNzYWdlLmxlbmd0aCgpKTsKLSAgICAgcmV0dXJuIHN0YXJ0U3RyaW5nICsgbmFtZXNwYWNlICsgZW5kU3RyaW5nOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL0lubGluZVhTRFJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4N2IzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEFuIFhNTEVudGl0eVJlc29sdmVyIHRoYXQgYWxsb3dzIGlubGluZSBzY2hlbWFzIHRvIHJlc29sdmUgZWFjaCBvdGhlciB0aHJvdWdoIGltcG9ydHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVYU0RSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTElORV9TQ0hFTUFfSUQgPSAiI2lubGluZXNjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVggPSAiZmlsZToiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlbnRpdGllcyA9IG5ldyBIYXNodGFibGUoKTsKLS8vICBwcm90ZWN0ZWQgU3RyaW5nIHJlZkxvY2F0aW9uID0gbnVsbDsKLSAgcHJvdGVjdGVkIFhNTEVudGl0eVJlc29sdmVyIGV4dGVybmFsUmVzb2x2ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgWE1MSW5wdXRTb3VyY2UgcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2UgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlZmVycmluZ1NjaGVtYU5hbWVzcGFjZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3R1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBJbmxpbmVYU0RSZXNvbHZlcigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpCi0JCSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsJIAotCVN0cmluZyBwdWJsaWNJZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRQdWJsaWNJZCgpOwkKLQlTdHJpbmcgbmFtZXNwYWNlID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldE5hbWVzcGFjZSgpOwotCVhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQlTdHJpbmcgc2NoZW1hID0gbnVsbDsKLQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkKLQl7Ci0JICBpZihwdWJsaWNJZCA9PSBudWxsKQotCSAgewotCSAgCWlmKG5hbWVzcGFjZSA9PSBudWxsKQotCSAgCXsJCi0JICAgICAgcmV0dXJuIG51bGw7Ci0JICAJfQotCSAgCWVsc2UKLQkgIAl7Ci0JICAJCXN5c3RlbUlkID0gbmFtZXNwYWNlOwotCSAgCX0KLQkgIH0KLQkgIGVsc2UKLQkgIHsJCi0JICAgIHN5c3RlbUlkID0gcHVibGljSWQ7Ci0JICB9Ci0JfQotCSAgCi0JaWYocmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlICE9IG51bGwgJiYgcmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlLmVxdWFscyhzeXN0ZW1JZCkpCi0JewotCQlpZihyZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZSE9bnVsbCkKLQkJewotCQkJcmV0dXJuIHJlZmVycmluZ1NjaGVtYUlucHV0U291cmNlOwotCQl9Ci0JfQotCWVsc2UgaWYgKChzY2hlbWEgPSAoU3RyaW5nKSBlbnRpdGllcy5nZXQoc3lzdGVtSWQpKSAhPSBudWxsICYmICFzY2hlbWEuZXF1YWxzKCIiKSkKLQl7Ci0JCWlzID0gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCByZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZS5nZXRTeXN0ZW1JZCgpICsgSU5MSU5FX1NDSEVNQV9JRCwgbnVsbCwgbmV3IFN0cmluZ1JlYWRlcihzY2hlbWEpLG51bGwpOwotCX0KLQkKLSAgICAvL2lmKGlzID09IG51bGwpCi0gICAgLy97Ci0gICAgLy8JdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgLy99Ci0JcmV0dXJuIGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBpbmxpbmUgc2NoZW1hLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSAtIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEKLSAgICogQHBhcmFtIHNjaGVtYSAtIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2hlbWEKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hKQotICB7Ci0gICAgZW50aXRpZXMucHV0KHRhcmdldE5hbWVzcGFjZSwgc2NoZW1hKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgcmVmZXJyaW5nIGlubGluZSBzY2hlbWEuIAotICAgKiAKLSAgICogQHBhcmFtIGlucHV0U291cmNlIC0gYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5saW5lIHNjaGVtYQotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW5saW5lIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUmVmZXJyaW5nU2NoZW1hKFhNTElucHV0U291cmNlIGlucHV0U291cmNlLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLSAgICByZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXNwYWNlIGNvcnJlc3BvbmRzIHRvIGFuIGlubGluZSBzY2hlbWEsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5hbWVzcGFjZSBjb3JyZXNwb25kcyB0byBhbiBpbmxpbmUgc2NoZW1hLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0lubGluZVNjaGVtYShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmV0dXJuIGVudGl0aWVzLmNvbnRhaW5zS2V5KG5hbWVzcGFjZSk7Ci0gIH0KLSAgCi0gIC8qKiAKLSAgICogR2V0IHRoZSBzZXQgb2YgdGhlIGlubGluZSBzY2hlbWEgbmFtZXNwYWNlcy4gCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBzZXQgb2YgdGhlIGlubGluZSBzY2hlbWEgbmFtZXNwYWNlcy4gCi0gICAqLyAKLSAgcHVibGljIFNldCBnZXRJbmxpbmVTY2hlbWFOU3MoKSAKLSAgeyAKLSAgICAgICAgcmV0dXJuIGVudGl0aWVzLmtleVNldCgpOyAKLSAgfSAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1NjaGVtYUF0dHJpYnV0ZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0M2UxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvU2NoZW1hQXR0cmlidXRlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEueHNkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5TY2hlbWFTeW1ib2xzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuU3ltYm9sVGFibGU7Ci0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBhbGxvdyB0aGUgY2FsbGluZyBjb2RlIHRvIHNlZSBpZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQgaW4gc2NoZW1hLgotICogVGhpcyBzZXJ2ZXMgYXMgc2NoZW1hIGZvciBzY2hlbWEuCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSBleHRlbmRzIFN5bWJvbFRhYmxlCi17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZVRhYmxlKCkKLSAgewotICAgIC8vIGFkZCBhbGwgb2YgdGhlIHN5Ym9scyB0byB0aGUgdGFibGUuIFNjaGVtYVN5bWJvbHMgcHJvYmFibHkgc2hvdWxkIGhhdmUKLSAgICAvLyBhIFN5bWJvbFRhYmxlIGZvciB0aGVzZSBidXQgaXQgZG9lc24ndAotCi0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5EQU5ZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFdPUE9VTkRMT0NBTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5ET1RIRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UV09QT1VORFRBUkdFVE5TKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUE9VTkRBTEwpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRV8wKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFJVRV8xKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQU5ZU0lNUExFVFlQRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0FOWVRZUEUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9BTllVUkkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CQVNFNjRCSU5BUlkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CT09MRUFOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0NPTExBUFNFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RBVEVUSU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREVDSU1BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RPVUJMRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RVUkFUSU9OKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRJRVMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9FWFRFTlNJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0ZMT0FUKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSEVYQklOQVJZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSUQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9JRFJFRik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lEUkVGUyk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MQU5HVUFHRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xBWCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xJU1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTkFNRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05FR0FUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX01PTlRIKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTU9OVEhEQVkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OQ05BTUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OTVRPS0VOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk1UT0tFTlMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05ORUdBVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05QT1NJVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT1JNQUxJWkVEU1RSSU5HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk9UQVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9PUFRJT05BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BPU0lUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BSRVNFUlZFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUFJPSElCSVRFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1FOQU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUVVBTElGSUVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVQTEFDRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1JFUVVJUkVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVTVFJJQ1RJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NLSVApOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJQ1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJTkcpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVUJTVElUVVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9USU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVE9LRU4pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UUlVFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5CT1VOREVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5JT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTlFVQUxJRklFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVEQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVESU5UKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURMT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURTSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1lFQVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9ZRUFSTU9OVEgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvVmFsaWRhdGVFcnJvckhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhmYzE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20zLkRPTUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuRXJyb3JNZXNzYWdlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFhNTEVycm9ySGFuZGxlciB0aGF0IGNhcHR1cmVzIGVycm9yIGZyb20gWGVyY2VzLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBYTUxFcnJvckhhbmRsZXIKLXsKLSAgQXJyYXlMaXN0IGVycm9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBtZXNzYWdlcyBjcmVhdGVkIGJ5IFhlcmNlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVycm9ycyBsaXN0LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RXJyb3JNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIHZhbGlkYXRpb24gbWVzc2FnZSBmcm9tIHRoZSBleGNlcHRpb24gYW5kIHNldmVyaXR5LgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvci4KLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eS4KLSAgICogQHJldHVybiBBbiBlcnJvciBtZXNzYWdlLgotICAgKi8KLSAgcHJvdGVjdGVkIEVycm9yTWVzc2FnZSBjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihYTUxQYXJzZUV4Y2VwdGlvbiBlcnJvciwgaW50IHNldmVyaXR5KQotICB7Ci0gICAgU3RyaW5nIHVyaSA9IGVycm9yLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgIGlmKHVyaSA9PSBudWxsKQotICAgIHsKLSAgICAgIHVyaSA9IGVycm9yLmdldFB1YmxpY0lkKCk7Ci0gICAgfQotICAgIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UgPSBuZXcgRXJyb3JNZXNzYWdlKCk7Ci0gICAgZXJyb3JNZXNzYWdlLnNldEVycm9yTGluZShlcnJvci5nZXRMaW5lTnVtYmVyKCkpOwotICAgIGVycm9yTWVzc2FnZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3IuZ2V0TWVzc2FnZSgpKTsKLSAgICBlcnJvck1lc3NhZ2Uuc2V0RXJyb3JDb2x1bW4oZXJyb3IuZ2V0Q29sdW1uTnVtYmVyKCkpOwotICAgIGVycm9yTWVzc2FnZS5zZXRVUkkodXJpKTsKLSAgICBlcnJvck1lc3NhZ2Uuc2V0U2V2ZXJpdHkoc2V2ZXJpdHkpOwotICAgIHJldHVybiBlcnJvck1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciNlcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIGVycm9yTGlzdC5hZGQoY3JlYXRlVmFsaWRhdGlvbk1lc3NhZ2VGb3JFeGNlcHRpb24oZXhjZXB0aW9uLCBET01FcnJvci5TRVZFUklUWV9FUlJPUikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXIjZmF0YWxFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlRXhjZXB0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3JMaXN0LmFkZChjcmVhdGVWYWxpZGF0aW9uTWVzc2FnZUZvckV4Y2VwdGlvbihleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX0ZBVEFMX0VSUk9SKSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciN3YXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvckxpc3QuYWRkKGNyZWF0ZVZhbGlkYXRpb25NZXNzYWdlRm9yRXhjZXB0aW9uKGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfV0FSTklORykpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWE1MRW50aXR5UmVzb2x2ZXJDaGFpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1hNTEVudGl0eVJlc29sdmVyQ2hhaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y5MzYxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWE1MRW50aXR5UmVzb2x2ZXJDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEhhbmRsZSBhIGNoYWluIG9mIGVudGl0eSByZXNvbHZlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFbnRpdHlSZXNvbHZlckNoYWluIGltcGxlbWVudHMgWE1MRW50aXR5UmVzb2x2ZXIKLXsKLSAgcHJpdmF0ZSBMaXN0IGVudGl0eVJlc29sdmVycyA9IG5ldyBWZWN0b3IoKTsKLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHhtbFJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLSAgICBJdGVyYXRvciBlbnRpdHlSZXNvbHZlckl0ZXIgPSBlbnRpdHlSZXNvbHZlcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZW50aXR5UmVzb2x2ZXJJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IChYTUxFbnRpdHlSZXNvbHZlcillbnRpdHlSZXNvbHZlckl0ZXIubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlzID0gZW50aXR5UmVzb2x2ZXIucmVzb2x2ZUVudGl0eSh4bWxSZXNvdXJjZUlkZW50aWZpZXIpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFhOSUV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBpZiAoaXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRocm93IGFuZCBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpc24ndCBmb3VuZAotICAgIGlmIChpcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxvY2F0ZSBmaWxlIik7Ci0gICAgfQotICAgIHJldHVybiBpczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZW50aXR5IHJlc29sdmVyIHRvIHRoaXMgY2hhaW4uCi0gICAqIAotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgVGhlIHJlc29sdmVyIHRvIGFkZCB0byB0aGUgY2hhaW4uCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFbnRpdHlSZXNvbHZlcihYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikKLSAgewotICAgIGVudGl0eVJlc29sdmVycy5hZGQoZW50aXR5UmVzb2x2ZXIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWFNEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS94c2QvWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDk3ZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEveHNkL1hTRFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWE1MR3JhbW1hclByZXBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTEdyYW1tYXJQb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWFNHcmFtbWFyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotCi0KLS8qKgotICogVmFsaWRhdGUgc2NoZW1hcyBmcm9tIGZpbGVzIG9yIFN0cmluZy4KLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZVTExfQ0hFQ0tJTkdfRkVBVFVSRV9JRCA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYS1mdWxsLWNoZWNraW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBDT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEZJTEVfUFJFRklYID0gImZpbGU6IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEFSR0VUTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgSU1QT1JUID0gImltcG9ydCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BTE9DQVRJT04gPSAic2NoZW1hTG9jYXRpb24iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBpZ25vcmVOYW1lc3BhY2VzID0KLSAgICB7ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSIgfTsKLQotICBwcm90ZWN0ZWQgWFNNb2RlbCB4c01vZGVsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkWFNEOwotICBwcm90ZWN0ZWQgTGlzdCBlcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZWxvY2F0aW9uOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBYU0RWYWxpZGF0b3IoKQotICB7Ci0gICAgeHNNb2RlbCA9IG51bGw7Ci0gICAgaXNWYWxpZFhTRCA9IGZhbHNlOwotICAgIGVycm9ycyA9IG51bGw7Ci0gIH0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFuIGlubGluZSBzY2hlbWEuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hIEEgc2NoZW1hIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBmaWxlbG9jIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc2NoZW1hLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVJbmxpbmVTY2hlbWEoU3RyaW5nIHNjaGVtYSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIGZpbGVsb2MpCi0gIHsKLSAgICB2YWxpZGF0ZUlubGluZVNjaGVtYShzY2hlbWEsIHRhcmdldE5hbWVzcGFjZSwgZmlsZWxvYywgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSBhbiBpbmxpbmUgc2NoZW1hIGFuZCBzcGVjaWZ5IGFuIGVudGl0eSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhpcyBzY2hlbWEgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuCi0gICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2MgVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoaXMgc2NoZW1hLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXJDaGFpbiBUaGUgZW50aXR5IHJlc29sdmVyIGNoYWluLgotICAgKiBAcGFyYW0gaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIgQW4gaW5saW5lIHNjaGVtYSByZXNvbHZlciBmb3IgdGhpcyBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUlubGluZVNjaGVtYSgKLSAgICBTdHJpbmcgc2NoZW1hLAotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UsCi0gICAgU3RyaW5nIGZpbGVsb2MsCi0gICAgWE1MRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXJDaGFpbiwKLSAgICBYTUxFbnRpdHlSZXNvbHZlciBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikKLSAgewotICAgIGZpbGVsb2NhdGlvbiA9IGZpbGVsb2M7Ci0gICAgCi0gICAgdmFsaWRhdGVYU0Qoc2NoZW1hLCB0cnVlLCBlbnRpdHlSZXNvbHZlckNoYWluLHRhcmdldE5hbWVzcGFjZSwgaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGxvY2F0ZWQgYXQgdGhlIHVyaSBzcGVjaWZpZWQgd2l0aCB0aGUgZ2l2ZW4gZW50aXR5IHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBBbiBhYnNvbHV0ZSB1cmkgZm9yIHRoZSBzY2hlbWEgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBlbnRpdHlSZXNvbHZlciBBbiBlbnRpdHkgcmVzb2x2ZXIgdG8gYmUgdXNlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKFN0cmluZyB1cmksIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKQotICB7Ci0gICAgdmFsaWRhdGVYU0QodXJpLCBmYWxzZSwgZW50aXR5UmVzb2x2ZXIsIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIHNjaGVtYS4KLSAgICogCi0gICAqIEBwYXJhbSBzY2hlbWEgVGhlIHNjaGVtYSBvciBpdCdzIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gaW5saW5lWFNEIFRydWUgaWYgYW4gaW5saW5lIHNjaGVtYSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgQW4gZW50aXR5IHJlc29sdmVyIHRvIHVzZS4KLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hIGJlaW5nIHZhbGlkYXRlZC4KLSAgICogQHBhcmFtIGlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyIEFuIGlubGluZSBzY2hlbWEgZW50aXR5IHJlc29sdmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYU0QoU3RyaW5nIHNjaGVtYSwgYm9vbGVhbiBpbmxpbmVYU0QsIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyLCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBYTUxFbnRpdHlSZXNvbHZlciBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikKLSAgewotICAgIFZhbGlkYXRlRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBWYWxpZGF0ZUVycm9ySGFuZGxlcigpOwotICAgIGVycm9ySGFuZGxlci5nZXRFcnJvck1lc3NhZ2VzKCkuY2xlYXIoKTsKLSAgICB0cnkKLSAgICB7Ci0JCVhNTEdyYW1tYXJQcmVwYXJzZXIgZ3JhbW1hclByZXBhcnNlciA9IG5ldyBYTUxHcmFtbWFyUHJlcGFyc2VyKCk7Ci0JCVhNTEdyYW1tYXJQb29sIGdyYW1tYXJQb29sID0gbmV3IFhNTEdyYW1tYXJQb29sSW1wbCgpOwotCQlncmFtbWFyUHJlcGFyc2VyLnNldEdyYW1tYXJQb29sKGdyYW1tYXJQb29sKTsKLQkgCi0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotICAgICAgaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCi0gICAgICB7Ci0JCWdyYW1tYXJQcmVwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoZW50aXR5UmVzb2x2ZXIpOwotICAgICAgfQotCi0gICAgICB0cnkKLSAgICAgIHsKLQkJWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgICAgICAvLyB0aGlzIGFsbG93cyBzdXBwb3J0IGZvciB0aGUgaW5saW5lIHNjaGVtYSBpbiBXU0RMIGRvY3VtZW50cwotICAgICAgICBpZiAoaW5saW5lWFNEKQotICAgICAgICB7Ci0gICAgICAgIAkKLSAgICAgICAgCVJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHNjaGVtYSk7Ci0JCQlpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLGZpbGVsb2NhdGlvbixmaWxlbG9jYXRpb24scmVhZGVyLG51bGwpOwotCQkJCi0JCQkoKElubGluZVhTRFJlc29sdmVyKWlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyKS5hZGRSZWZlcnJpbmdTY2hlbWEoaXMsdGFyZ2V0TmFtZXNwYWNlKTsKLQotICAgICAgICB9Ci0gICAgICAgIC8vIGdldCB0aGUgaW5wdXQgc291cmNlIGZvciBhbiBleHRlcm5hbCBzY2hlbWEgZmlsZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShudWxsLHNjaGVtYSxzY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBncmFtbWFyUHJlcGFyc2VyLnJlZ2lzdGVyUHJlcGFyc2VyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLG51bGwvKnNjaGVtYUxvYWRlciovKTsKLSAgICAgICAgWE1MR3JhbW1hckxvYWRlciBzY2hlbWFMb2FkZXIgPSBncmFtbWFyUHJlcGFyc2VyLmdldExvYWRlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSk7Ci0KLQkJWFNHcmFtbWFyIGdyYW1tYXIgPSAoWFNHcmFtbWFyKWdyYW1tYXJQcmVwYXJzZXIucHJlcGFyc2VHcmFtbWFyKFhNTEdyYW1tYXJEZXNjcmlwdGlvbi5YTUxfU0NIRU1BLGlzKTsKLQkJeHNNb2RlbCA9IGdyYW1tYXIudG9YU01vZGVsKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vcGFyc2VyIHdpbGwgcmV0dXJuIG51bGwgcG9pbnRlciBleGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIHN0cnVjdHVyYWxseSBpbnZhbGlkCi0gICAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgfQotCi0gICAgICBlcnJvcnMgPSBlcnJvckhhbmRsZXIuZ2V0RXJyb3JNZXNzYWdlcygpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICAgIGlmIChlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGlzVmFsaWRYU0QgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBYU01vZGVsIGNyZWF0ZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYU01vZGVsIGNyZWF0ZWQuCi0gICAqLwotCi0gIHB1YmxpYyBYU01vZGVsIGdldFhTTW9kZWwoKQotICB7Ci0gIAlyZXR1cm4geHNNb2RlbDsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzY2hlbWEgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2NoZW1hIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiBpc1ZhbGlkWFNEOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZXJyb3IgbGlzdC4KLSAgICogCi0gICAqIEByZXR1cm4gQSBsaXN0IG9mIGVycm9yIGZyb20gdGhlIHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JzOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9JV1NETDIwVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9JV1NETDIwVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzc5MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvSVdTREwyMFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDIwOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvbkluZm87Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIHZhbGlkYXRvciBwbHVnZ2VkIGludG8gdGhlIFdTREwgMi4wIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJV1NETDIwVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZWxlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gcGFyZW50cyBBIGxpc3Qgb2YgcGFyZW50cyBvZiB0aGlzIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gZm9yIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbyk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcmVzb3VyY2UgYnVuZGxlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9WYWxpZGF0b3JSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTgzYmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1ZhbGlkYXRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDIwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLS8qKgotICogQSByZWdpc3RyeSB0byBob2xkIGFsbCB0aGUgV1NETCAyLjAgdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclJlZ2lzdHJ5Ci17Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0b3JSZWdpc3RyeSB2ZXJJbnN0YW5jZTsKLQotICBwcm90ZWN0ZWQgTWFwIHZhbGlkYXRvclJlZyA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZWdpc3RyeS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGluc3RhbmNlIG9mIHRoaXMgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFZhbGlkYXRvclJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotICAgIGlmICh2ZXJJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZlckluc3RhbmNlID0gbmV3IFZhbGlkYXRvclJlZ2lzdHJ5KCk7Ci0gICAgfQotICAgIHJldHVybiB2ZXJJbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGlzIHZhbGlkYXRvciBkZWxlZ2F0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdGhlIHZhbGlkYXRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0gICAqIEBwYXJhbSB2YWxEZWxlZ2F0ZSBUaGUgdmFsaWRhdG9yIGRlbGVnYXRlIHRvIHJlZ2lzdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJWYWxpZGF0b3IoU3RyaW5nIG5hbWVzcGFjZSwgV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUgdmFsRGVsZWdhdGUpCi0gIHsKLSAgICAvLyBhbGxvdyB0aGUgbnVsbCBuYW1lc3BhY2UgYnV0IG1ha2UgaXQgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0KLSAgICAvLyBhZGQgdGhlIHZhbGlkYXRvciB0byB0aGUgaGFzaHRhYmxlCi0gICAgdmFsaWRhdG9yUmVnLnB1dChuYW1lc3BhY2UsIHZhbERlbGVnYXRlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc2sgZm9yIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlLiBJZiBub25lIGlzIGZvdW5kCi0gICAqIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IuCi0gICAqIEByZXR1cm4gVGhlIFdTREwgMS4xIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHB1YmxpYyBJV1NETDIwVmFsaWRhdG9yIHF1ZXJ5VmFsaWRhdG9yUmVnaXN0cnkoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIC8vIGlmIHRoZSBuYW1lc3BhY2UgaXMgbnVsbCBhbGxvdyBpdCBhbmQgdHJlYXQgaXQgYXMgdGhlIGVtcHR5IHN0cmluZwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICB9Ci0gICAgV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSAoV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUpdmFsaWRhdG9yUmVnLmdldChuYW1lc3BhY2UpOwotICAgIGlmKGRlbGVnYXRlICE9IG51bGwpCi0gICAgeyAgCi0gICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0VmFsaWRhdG9yKCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHRlbGxzIHdoZXRoZXIgYSB2YWxpZGF0b3IgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlIGlzIHJlZ2lzdGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgdG8gY2hlY2suCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRvciByZWdpc3RlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNSZWdpc3RlcmVkVmFsaWRhdG9yKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICBpZiAocXVlcnlWYWxpZGF0b3JSZWdpc3RyeShuYW1lc3BhY2UpICE9IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwQmFzaWNWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1dTREwyMEJhc2ljVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMzhjOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwQmFzaWNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMjA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLS8qKgotICogVmFsaWRhdGUgdGhlIGVsZW1lbnRzIGRlZmluZWQgaW4gYSBXU0RMIDEuMSBEb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFdTREwyMEJhc2ljVmFsaWRhdG9yIGltcGxlbWVudHMgSVdTREwyMFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUVTUEFDRVNfRkVBVFVSRV9JRCA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTQ0hFTUFfVkFMSURBVElPTl9GRUFUVVJFX0lEID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZVTExfQ0hFQ0tJTkdfRkVBVFVSRV9JRCA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYS1mdWxsLWNoZWNraW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBDT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9JRCA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNPQVBfRU5DT0RJTkdfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIjsKLQotICBwcm90ZWN0ZWQgZmluYWwgaW50IEVMRU1FTlQgPSAwOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IFRZUEUgPSAxOwotCi0gIC8vcHJvdGVjdGVkIFdTREwyMFZhbGlkYXRvckNvbnRyb2xsZXIgdmFsaWRhdG9yY29udHJvbGxlcjsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETDIwQmFzaWNWYWxpZGF0b3IoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLnZhbGlkYXRvci5JV1NETDExVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5MaXN0LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLklWYWxpZGF0aW9uSW5mbykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKE9iamVjdCBlbGVtZW50LCBMaXN0IHBhcmVudHMsIElWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKQotICB7Ci0gICAgLy90aGlzLnZhbGlkYXRvcmNvbnRyb2xsZXIgPSB2YWxpZGF0b3Jjb250cm9sbGVyOwotICAgIC8vc2V0RGVmYXVsdFJlc291cmNlQnVuZGxlSWZOZWVkZWQodmFsaWRhdG9yY29udHJvbGxlcik7Ci0gIAkKLS8vICAgIERlZmluaXRpb25zIHdzZGxEZWZpbml0aW9ucyA9IChEZWZpbml0aW9ucyllbGVtZW50OwotLy8gICAgdmFsaWRhdGVUeXBlcyh3c2RsRGVmaW5pdGlvbnMsIHZhbEluZm8pOwotLy8gICAgdmFsaWRhdGVTZXJ2aWNlcyh3c2RsRGVmaW5pdGlvbnMsIHZhbEluZm8pOwotLy8gICAgdmFsaWRhdGVCaW5kaW5ncyh3c2RsRGVmaW5pdGlvbnMsIHZhbEluZm8pOwotLy8gICAgdmFsaWRhdGVJbnRlcmZhY2VzKHdzZGxEZWZpbml0aW9ucywgdmFsSW5mbyk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBUYWtlcyBhIGxpc3Qgb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIGFuZCBjaGVja3MgaWYgdGhlcmUncyBhIHZhbGlkYXRvciAKLSAgICogYXNzb2NpYXRlZCB3aXRoIGVhY2ggZWxlbWVudCBhbmQgaWYgc28gY2FsbHMgdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgb2YgdGhlIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzIFRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gdmFsaWRhdG9yY29udHJvbGxlciBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIuCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbiBUaGUgZGVmbmludGlvbnMgZWxlbWVudCBmb3IgdGhpcyBkb2N1bWVudC4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QoCi0vLyAgICBMaXN0IHBhcmVudHMsCi0vLyAgICBFbGVtZW50SW5mb0l0ZW1bXSBleHRlbnNpYmlsaXR5RWxlbWVudHMsCi0vLyAgICBWYWxpZGF0aW9uSW5mbyB2YWxJbmZvLAotLy8gICAgRGVmaW5pdGlvbnMgd3NkbERlZmluaXRpb25zKQotLy8gIHsKLS8vICAgIC8vVE9ETzogZ2V0IHRoZSB2YWxpZGF0aW9uIGNvbnRyb2xsZXIgc3RhdGljYWxseSB0byBnZXQgdGhlIGV4dGVuc2liaWxpdHkgdmFsaWRhdG9yCi0vLy8vICAgIFZhbGlkYXRvclJlZ2lzdHJ5IHZlciA9IFZhbGlkYXRvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0vLy8vICAgIEl0ZXJhdG9yIGV4dEVsZW1zID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0vLy8vICAgIHdoaWxlIChleHRFbGVtcy5oYXNOZXh0KCkpCi0vLy8vICAgIHsKLS8vLy8gICAgICBFbGVtZW50SW5mb0l0ZW0gZWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5uZXh0KCk7Ci0vLy8vICAgICAgLy8gICAgICBpZiAodmVyLmhhc1JlZ2lzdGVyZWRWYWxpZGF0b3IoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpKSkKLS8vLy8gICAgICAvLyAgICAgIHsKLS8vLy8gICAgICB2YWxpZGF0b3Jjb250cm9sbGVyLnZhbGlkYXRlV1NETEVsZW1lbnQoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpLCBlbGVtZW50LCBwYXJlbnRzKTsKLS8vLy8gICAgICAvL3Zlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKSkudmFsaWRhdGUoZWxlbWVudCwgcGFyZW50cywgdmFsaWRhdG9ybWFuYWdlcik7Ci0vLy8vICAgICAgLy8gICAgICB9Ci0vLy8vICAgIH0KLS8vICB9Ci0KLSAgLyoqCi0gICAqIElmIHRoZSByZXNvdXJjZWJ1bmRsZSBoYXNuJ3QgYmVlbiBzZXQsIHNldCBpdCB0byB0aGUgb25lIHJlZ2lzdGVyZWQgd2l0aCB0aGUgVmFsaWRhdG9yQ29udHJvbGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3Jjb250cm9sbGVyIFRoZSB2YWxpZGF0b3IgY29udHJvbGxlciB0byBnZXQgdGhlIHJlc291cmNlIGJ1bmRsZSBmcm9tLgotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVzb3VyY2VCdW5kbGVJZk5lZWRlZChXU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyIHZhbGlkYXRvcmNvbnRyb2xsZXIpCi0vLyAgewotLy8gICAgaWYgKG1lc3NhZ2VnZW5lcmF0b3IgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2V0UmVzb3VyY2VCdW5kbGUodmFsaWRhdG9yY29udHJvbGxlci5nZXRSZXNvdXJjZUJ1bmRsZSgpKTsKLS8vICAgIH0KLS8vICB9Ci0gIC8qKgotICAgKiBTZXQgdGhlIHJlc291cmNlYnVuZGxlIHRvIHRoZSBvbmUgc3BlY2lmaWVkLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZSB0aGF0IHRoZSBUeXBlcyBlbGVtZW50IGlzIGNvcnJlY3QuIAotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBkZWZpbml0aW9ucyBlbGVtZW50IGZyb20gdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0gICAqLwotCi0vLyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlcyhEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbnMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0vLyAgewotLy8gICAgVHlwZXMgdHlwZXMgPSB3c2RsRGVmaW5pdGlvbnMuZ2V0VHlwZXMoKTsKLS8vICAgIC8vIGVuc3VyZSB0aGF0IHR5cGVzIGlzIGRlZmluZWQKLS8vICAgIGlmICh0eXBlcyAhPSBudWxsKQotLy8gICAgewotLy8gICAgICBMaXN0IHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICAgIHBhcmVudHMuYWRkKHdzZGxEZWZpbml0aW9ucyk7Ci0vLyAgICAgIEVsZW1lbnRJbmZvSXRlbSBlbGVtZW50SW5mb0l0ZW1zW10gPSB0eXBlcy5nZXRFbGVtZW50SW5mb0l0ZW1zKCk7Ci0vLyAgICAgIHBhcmVudHMuYWRkKDAsIHR5cGVzKTsKLS8vICAgICAgdmFsaWRhdGVFeHRlbnNpYmlsaXR5RWxlbWVudExpc3QocGFyZW50cywgZWxlbWVudEluZm9JdGVtcywgdmFsSW5mbywgd3NkbERlZmluaXRpb25zKTsKLS8vICAgICAgcGFyZW50cy5yZW1vdmUoMCk7Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgYWxsIG9mIHRoZSBkZWNsYXJlZCBzZXJ2aWNlcyBmb3IgdGhlIGRlZmluaXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb25zIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTZXJ2aWNlcyhEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbnMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0vLyAgewotLy8KLS8vICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB0aGF0IHRoZSBiaW5kaW5ncyByZWZlciB0byB2YWxpZCBpbnRlcmZhY2VzIGFuZCBhbGwgb2YgdGhlIG9wZXJhdGlvbnMKLSAgICogaW4gYSBnaXZlbiBiaW5kaW5nIHJlZmVyIHRvIGEgZGVmaW5lZCBvcGVyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqIGludGVyZmFjZXMuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb25zIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVCaW5kaW5ncyhEZWZpbml0aW9ucyB3c2RsRGVmaW5pdGlvbnMsIFZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0vLyAgewotLy8KLS8vICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBJbnRlcmZhY2VzIGhhdmUgdmFsaWQgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZWlyCi0gICAqIG9wZXJhdGlvbiBpbnB1dCwgb3V0cHV0LCBpbmZhdWx0IGFuZCBvdXRmYXVsdCB0eXBlcy4KLSAgICogCi0gICAqIEBwYXJhbSB3c2RsRGVmaW5pdGlvbnMgVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbEluZm8gVmFsaWRhdGlvbiBpbmZvIGZvciB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKi8KLS8vICBwcml2YXRlIHZvaWQgdmFsaWRhdGVJbnRlcmZhY2VzKERlZmluaXRpb25zIHdzZGxEZWZpbml0aW9ucywgVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLS8vICB7Ci0vLyAgICAKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBuYW1lIGlzIGRlZmluZWQgaW4gdGhlIG5hbWVzcGFjZSBmb3IgdGhlIHBhcnQuICBBIHBhcnQgaXMgYW4KLSAgICogRUxFTUVOVCBpbiBXU0RMIDIuMC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB0byBjaGVjay4KLSAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdG8gY2hlY2suCi0gICAqIEBwYXJhbSB2YWxJbmZvIFZhbGlkYXRpb24gaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbi4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwYXJ0IGVsZW1lbnQgaXMgZGVmaW5lZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tNZXNzYWdlKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotCi0gICAgYm9vbGVhbiBwYXJ0dmFsaWQgPSBmYWxzZTsKLS8vICAgIC8vIGZpcnN0IHRha2UgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlIGl0J3Mgc2NoZW1hIGZvciBzY2hlbWEKLS8vICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzSWdub3JlQ2FzZShTY2hlbWFTeW1ib2xzLlVSSV9TQ0hFTUFGT1JTQ0hFTUEpKQotLy8gICAgewotLy8gICAgICBTY2hlbWFBdHRyaWJ1dGVUYWJsZSB4c2RUYWJsZSA9IG5ldyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSgpOwotLy8gICAgICBpZiAoeHNkVGFibGUuY29udGFpbnNTeW1ib2wobmFtZSkpCi0vLyAgICAgIHsKLS8vICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICAvLyBjaGVjayBpbmxpbmUgYW5kIGltcG9ydGVkIHNjaGVtYQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICBMaXN0IHNjaGVtYXMgPSB2YWxpZGF0b3Jjb250cm9sbGVyLmdldFNjaGVtYXMoKTsKLS8vICAgICAgSXRlcmF0b3Igc2NoZW1hc0l0ZXIgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0vLyAgICAgIHdoaWxlIChzY2hlbWFzSXRlci5oYXNOZXh0KCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBYU01vZGVsIHNjaGVtYSA9IChYU01vZGVsKXNjaGVtYXNJdGVyLm5leHQoKTsKLS8vICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgaWYgKHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb24obmFtZSwgbmFtZXNwYWNlKSAhPSBudWxsKQotLy8gICAgICAgICAgewotLy8gICAgICAgICAgICBwYXJ0dmFsaWQgPSB0cnVlOwotLy8gICAgICAgICAgICBicmVhazsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgCi0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgLy8gSWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgaW1wb3J0ZWQgZG8gc28gbm93LgotICAgIC8vIEFsbG93IHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSB0byBiZSBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIGJ1dCBtYXJrIGl0IGFzIGEgd2FybmluZy4KLS8vICAgIGlmICghcGFydHZhbGlkICYmIG5hbWVzcGFjZS5lcXVhbHMoU09BUF9FTkNPRElOR19VUkkpKQotLy8gICAgewotLy8gICAgICB0cnkKLS8vICAgICAgewotLy8gICAgICAgIFhTRFZhbGlkYXRvciB4c2RWYWwgPSBuZXcgWFNEVmFsaWRhdG9yKCk7Ci0vLyAgICAgICAgeHNkVmFsLnZhbGlkYXRlKFhNTENhdGFsb2cuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlRW50aXR5TG9jYXRpb24oU09BUF9FTkNPRElOR19VUkksIG51bGwpLCBudWxsKTsKLS8vICAgICAgICAvLyBzYW5pdHkgY2hlY2sgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZwotLy8gICAgICAgIGlmICh4c2RWYWwuaXNWYWxpZCgpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIFhTTW9kZWwgeHNNb2RlbCA9IHhzZFZhbC5nZXRYU01vZGVsKCk7Ci0vLwotLy8gICAgICAgICAgaWYgKHhzTW9kZWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKG5hbWUsIG5hbWVzcGFjZSkgIT0gbnVsbCkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgcGFydHZhbGlkID0gdHJ1ZTsKLS8vICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICB2YWxpZGF0b3Jjb250cm9sbGVyLmFkZFdhcm5pbmdNZXNzYWdlKAotLy8gICAgICAgICAgICBwYXJ0T2JqZWN0LAotLy8gICAgICAgICAgICBtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZygiX1dBUk5fU09BUEVOQ19JTVBPUlRFRF9QQVJUIiwgIiciICsgbmFtZSArICInIikpOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICAgIHsKLS8vICAgICAgICAvL1RPRE86IGxvZyB0aGUgZXJyb3IgbWVzc2FnZQotLy8gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgcmV0dXJuIHBhcnR2YWxpZDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9XU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwyMC9XU0RMMjBWYWxpZGF0b3JDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MTc1Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklXU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZXhjZXB0aW9uLlZhbGlkYXRlV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgdmFsaWRhdG9yIGNvbnRyb2xsZXIgaXMgdGhlIGhlYWQgb2YgdmFsaWRhdGlvbi4gSGFzIG1ldGhvZHMgZm9yIGdldHRpbmcgCi0gKiBleHRlbnNpb24gdmFsaWRhdG9ycy4KLSAqLwotcHVibGljIGNsYXNzIFdTREwyMFZhbGlkYXRvckNvbnRyb2xsZXIgaW1wbGVtZW50cyBJV1NETFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9XQVJOX05PX1ZBTERJQVRPUiA9ICJfV0FSTl9OT19WQUxESUFUT1IiOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IEVSUk9SX01FU1NBR0UgPSAwOwotICBwcm90ZWN0ZWQgZmluYWwgaW50IFdBUk5JTkdfTUVTU0FHRSA9IDE7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZVVSSTsKLSAgcHJvdGVjdGVkIExpc3Qgc2NoZW1hcyA9IG5ldyBWZWN0b3IoKTsKLS8vICBwcm90ZWN0ZWQgRGVmaW5pdGlvbnMgd3NkbERlZmluaXRpb247Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgZWxlbWVudExvY2F0aW9ucyA9IG51bGw7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZTsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvciA9IG51bGw7Ci0gIC8vcHJvdGVjdGVkIFZhbGlkYXRpb25Db250cm9sbGVyIHZhbGlkYXRpb25Db250cm9sbGVyOwotICBwcm90ZWN0ZWQgVmFsaWRhdG9yUmVnaXN0cnkgdmVyID0gVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3JzID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHJiIFRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2V0IGZvciB0aGlzIGNvbnRyb2xsZXIuCi0gICAqLwotICBwdWJsaWMgV1NETDIwVmFsaWRhdG9yQ29udHJvbGxlcihSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIHNldFJlc291cmNlQnVuZGxlKHJiKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLklXU0RMVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy53M2MuZG9tLkRvY3VtZW50LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLlZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoRG9jdW1lbnQgZG9tTW9kZWwsIElWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKSB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICAvLyByZXNldCB0aGUgdmFyaWFibGVzCi0gICAgLy9yZXNldCgpOwotICAgIGZpbGVVUkkgPSB2YWxJbmZvLmdldEZpbGVVUkkoKTsKLSAgICAvL3RoaXMudmFsaWRhdGlvbkNvbnRyb2xsZXIgPSB2YWxpZGF0aW9uY29udHJvbGxlcjsKLQotICAgIAotLy8gICAgTGlzdCByZWFkZXJFcnJvcnMgPSByZWFkV1NETERvY3VtZW50KGRvbU1vZGVsLCBmaWxlVVJJLCBnZXRNZXNzYWdlR2VuZXJhdG9yKCkpOwotICAgIC8vCQloYW5kbGUgYW55IHJlYWRlciBlcnJvcnMKLS8vICAgIGlmIChyZWFkZXJFcnJvcnMgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgSXRlcmF0b3IgcmVhZGVyRXJyb3JzSSA9IHJlYWRlckVycm9ycy5pdGVyYXRvcigpOwotLy8gICAgICB3aGlsZSAocmVhZGVyRXJyb3JzSS5oYXNOZXh0KCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBSZWFkZXJFcnJvciByZSA9IChSZWFkZXJFcnJvcilyZWFkZXJFcnJvcnNJLm5leHQoKTsKLS8vICAgICAgICB2YWxJbmZvLmFkZEVycm9yKHJlLmdldE1lc3NhZ2UoKSwgcmUuZ2V0TGluZSgpLCByZS5nZXRDb2x1bW4oKSwgcmUuZ2V0RmlsZVVSSSgpKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgdmFsaWRhdGVXU0RMRWxlbWVudChDb25zdGFudHMuTlNfVVJJX1dTREwsIHdzZGxEZWZpbml0aW9uLCBuZXcgVmVjdG9yKCksIHZhbEluZm8pOwotICB9Ci0gIAotICAvKioKLSAgICogUmVhZCBpbiB0aGUgV1NETCBkb2N1bWVudCBhbmQgc2V0IHRoZSBtb2RlbCBhbmQgaW1wb3J0ZWQgc2NoZW1hcy4KLSAgICogCi0gICAqIEBwYXJhbSBkb21Nb2RlbCBBIERPTSBkb2N1bWVudCBtb2RlbCBvZiB0aGUgZmlsZSB0byBiZSByZWFkLgotICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byByZWFkLgotICAgKiBAcGFyYW0gbWVzc2FnZWdlbmVyYXRvciBUaGUgbWVzc2FnZWdlbmVyYXRvciB0aGUgcmVhZGVyIHNob3VsZCB1c2UgZm9yIGFueSBtZXNzYWdlcyBwcm9kdWNlZC4KLSAgICogQHRocm93cyBWYWxpZGF0ZVdTRExFeGNlcHRpb24KLSAgICogQHJldHVybiBBIGxpc3Qgb2YgcmVhZGVyIGVycm9ycy4KLSAgICovCi0vLyAgcHJvdGVjdGVkIExpc3QgcmVhZFdTRExEb2N1bWVudChEb2N1bWVudCBkb21Nb2RlbCwgU3RyaW5nIGZpbGUsIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc2FnZWdlbmVyYXRvcikgdGhyb3dzIFZhbGlkYXRlV1NETEV4Y2VwdGlvbgotLy8gIHsKLS8vICAgIExpc3QgcmVhZGVyRXJyb3JzID0gbnVsbDsKLS8vICAgIHRyeQotLy8gICAgewotLy8KLS8vICAgICAgV1NETFJlYWRlckltcGwgd3NkbFJlYWRlciA9IG5ldyBXU0RMUmVhZGVySW1wbCgpOwotLy8gICAgICB3c2RsRGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwoZmlsZSwgZG9tTW9kZWwpOwotLy8KLS8vICAgICAgcmVhZGVyRXJyb3JzID0gd3NkbFJlYWRlci5nZXRSZWFkZXJFcnJvcnMoKTsKLS8vCi0vLyAgICB9Ci0vLyAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotLy8gICAgewotLy8gICAgICB0aHJvdyBuZXcgVmFsaWRhdGVXU0RMRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpIC8qKyAiICIgKyBlLmdldEZhdWx0Q29kZSgpKi8pOwotLy8gICAgfQotLy8KLS8vICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLS8vICAgIHsKLS8vICAgICAgdGhyb3cgbmV3IFZhbGlkYXRlV1NETEV4Y2VwdGlvbigidW5hYmxlIHRvIHJlYWQgZmlsZSIgKyBlLmdldE1lc3NhZ2UoKSArICIgIiArIGUudG9TdHJpbmcoKSk7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gcmVhZGVyRXJyb3JzOwotLy8gIH0KLQotICAvKioKLSAgICogR2l2ZW4gYSBXU0RMIGVsZW1lbnQsIGNhbGwgVmFsaWRhdGVFbGVtZW50IGZvciBpdC4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBwYXJlbnRzIFRoZSBsaXN0IG9mIHBhcmVudHMgZm9yIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlV1NETEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICBJV1NETDIwVmFsaWRhdG9yIHZhbCA9IHZlci5xdWVyeVZhbGlkYXRvclJlZ2lzdHJ5KG5hbWVzcGFjZSk7Ci0gICAgaWYgKHZhbCAhPSBudWxsKQotICAgIHsKLSAgICAgIHZhbC52YWxpZGF0ZShlbGVtZW50LCBwYXJlbnRzLCB2YWxJbmZvKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vdmFsSW5mby5hZGRXYXJuaW5nKG1lc3NhZ2VnZW5lcmF0b3IuZ2V0U3RyaW5nKF9XQVJOX05PX1ZBTERJQVRPUiwgbmFtZXNwYWNlKSwgZWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSB0byB0aGUgbGlzdCBvZiBzY2hlbWFzLgotICAgKiAKLSAgICogQHBhcmFtIHhzTW9kZWwgVGhlIHNjaGVtYSB0byBhZGQuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZFNjaGVtYShYU01vZGVsIHhzTW9kZWwpCi0vLyAgewotLy8gICAgaWYgKHhzTW9kZWwgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgc2NoZW1hcy5hZGQoeHNNb2RlbCk7Ci0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxpc3QgY29udGFpbmluZyB0aGUgc2NoZW1hcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2Ygc2NoZW1hcy4KLSAgICovCi0vLyAgcHVibGljIExpc3QgZ2V0U2NoZW1hcygpCi0vLyAgewotLy8gICAgcmV0dXJuIHNjaGVtYXM7Ci0vLyAgfQotCi0gIC8qKgotICAJKiBHZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gIAkqIAotICAJKiBAcmV0dXJuIFRoZSByZXNvdXJjZSBidW5kbGUgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAJKiBAc2VlICNzZXRSZXNvdXJjZUJ1bmRsZQotICAJKi8KLSAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZWJ1bmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFJlc291cmNlQnVuZGxlIGZvciB0aGlzIFZhbGlkYXRvck1hbmFnZXIuCi0gICAqIAotICAgKiBAcGFyYW0gcmIgVGhlIHJlc291cmNlIGJ1bmRsZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldFJlc291cmNlQnVuZGxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJ1bmRsZShSZXNvdXJjZUJ1bmRsZSByYikKLSAgewotICAgIGlmIChyYiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc291cmNlYnVuZGxlID0gcmI7Ci0gICAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWVzc2FnZSBnZW5lcmF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBnZW5lcmF0b3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBjb250cm9sbGVyLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VHZW5lcmF0b3IgZ2V0TWVzc2FnZUdlbmVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZWdlbmVyYXRvcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGZpbGVuYW1lIGZvciB0aGUgZmlsZSBjdXJyZW50bHkgYmVpbmcgdmFsaWRhdGVkLiBTb21lIHZhbGlkYXRvcnMgcmVxdWlyZSB0aGlzLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgZmlsZW5hbWUgZm9yIHRoZSBmaWxlIGJlaW5nIHZhbGlkYXRlZC4KLSAgICovCi0vLyAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCi0vLyAgewotLy8gICAgcmV0dXJuIGZpbGVVUkk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgZXJyb3IgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgdG8gYWRkIHRoZSBlcnJvciBmb3IuCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgdG8gYWRkLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGVycm9yKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKEVSUk9SX01FU1NBR0UsIG9iamVjdCwgZXJyb3IpOwotLy8gICAgZXJyb3JzID0gdHJ1ZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXkga25vdwotICAgKiBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gZXJyb3IgVGhlIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZEVycm9yTWVzc2FnZShpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIGVycm9yKQotLy8gIHsKLS8vICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKEVSUk9SX01FU1NBR0UsIGxpbmUsIGNvbHVtbiwgZXJyb3IpOwotLy8gICAgZXJyb3JzID0gdHJ1ZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZXh0ZW5zaWJseSB2YWxpZGF0b3JzIHRvIGFkZCB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHBhcmFtIG9iamVjdCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgd2FybmluZyBtZXNzYWdlLgotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nTWVzc2FnZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgd2FybmluZykKLS8vICB7Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShXQVJOSU5HX01FU1NBR0UsIG9iamVjdCwgd2FybmluZyk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZm9yIGV4dGVuc2libHkgdmFsaWRhdG9ycyB0byBhZGQgd2FybmluZyBtZXNzYWdlcyB3aGVuIHRoZXkga25vdwotICAgKiBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIHdoZXJlIHRoZSBlcnJvciBtZXNzYWdlIGlzIGxvY2F0ZWQuCi0gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlLgotICAgKi8KLS8vICBwdWJsaWMgdm9pZCBhZGRXYXJuaW5nTWVzc2FnZShpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHdhcm5pbmcpCi0vLyAgewotLy8gICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoV0FSTklOR19NRVNTQUdFLCBsaW5lLCBjb2x1bW4sIHdhcm5pbmcpOwotLy8gIH0KLQotICAvKioKLSAgICogSWYgeW91IGhhdmUgYW4gb2JqZWN0IHJlYWQgaW4gYnkgdGhlIHJlYWRlciBmb3IgdGhpcwotICAgKiB2YWxpZGF0b3Jjb250cm9sbGVyIHRoZSBvYmplY3QgY2FuIGJlIHBhc3NlZCBpbiBoZXJlIGFuZCB0aGUgbGluZSBhbmQgY29sdW1uCi0gICAqIGluZm9ybWF0aW9uIHdpbGwgYmUgYWJzdHJhY3RlZCBmcm9tIGl0LgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBvIFRoZSBvYmplY3QgdGhhdCBoYXMgdGhlIGVycm9yICh1c2VkIHRvIGdldCB0aGUgbG9jYXRpb24pLgotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKGludCB0eXBlLCBPYmplY3QgbywgU3RyaW5nIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgVmFsaWRhdGFibGVFbGVtZW50IHZlID0gKFZhbGlkYXRhYmxlRWxlbWVudClvOwotLy8vLyAgICBpbnRbXSBsb2NhdGlvbjsKLS8vLy8gICAgaWYgKGVsZW1lbnRMb2NhdGlvbnMuY29udGFpbnNLZXkobykpCi0vLy8vICAgIHsKLS8vLy8gICAgICBsb2NhdGlvbiA9IChpbnRbXSllbGVtZW50TG9jYXRpb25zLmdldChvKTsKLS8vLy8gICAgfQotLy8vLyAgICAvLyBpZiB3ZSBnaXZlIGl0IGFuIGVsZW1lbnQgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkIHdlJ2xsIHNldCB0aGUgbG9jYXRpb24KLS8vLy8gICAgLy8gYXQgKDAsMCkgc28gdGhlIGVycm9yIHNob3dzIHVwIGJ1dCBubyBsaW5lIG1hcmtlciBpbiB0aGUgZWRpdG9yCi0vLy8vICAgIGVsc2UKLS8vLy8gICAgewotLy8vLyAgICAgIGxvY2F0aW9uID0gbmV3IGludFtdIHsgMCwgMCB9OwotLy8vLyAgICB9Ci0vLyAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZSh0eXBlLCB2ZS5nZXRMaW5lKCksIHZlLmdldENvbHVtbigpLCBtZXNzYWdlKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAgKiBDcmVhdGVzIGEgdmFsaWRhdGlvbiBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAqIAotICAJKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gYWRkLgotICAJKiBAcGFyYW0gbGluZSBUaGUgbGluZSB3aGVyZSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBsb2NhdGVkLgotICAJKiBAcGFyYW0gY29sdW1uIFRoZSBsaW5lIHdoZXJlIHRoZSBjb2x1bW4gbWVzc2FnZSBpcyBsb2NhdGVkLgotICAJKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gIAkqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKGludCB0eXBlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIG1lc3NhZ2UpCi0vLyAgewotLy8gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgaWYgKHR5cGUgPT0gRVJST1JfTUVTU0FHRSkKLS8vICAgICAgewotLy8gICAgICAgIHZhbGlkYXRpb25Db250cm9sbGVyLmFkZEVycm9yTWVzc2FnZShsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKHR5cGUgPT0gV0FSTklOR19NRVNTQUdFKQotLy8gICAgICB7Ci0vLyAgICAgICAgdmFsaWRhdGlvbkNvbnRyb2xsZXIuYWRkV2FybmluZ01lc3NhZ2UobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmNvbnRyb2xsZXIuSVdTRExWYWxpZGF0b3IjaXNWYWxpZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiAhZXJyb3JzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc2V0IHRoZSB2YWxpZGF0b3IgY29udHJvbGxlci4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoKQotLy8gIHsKLS8vICAgIHNjaGVtYXMgPSBuZXcgVmVjdG9yKCk7Ci0vLyAgICBmaWxlVVJJID0gIiI7Ci0vLyAgICB3c2RsRGVmaW5pdGlvbiA9IG51bGw7Ci0vLyAgICBlbGVtZW50TG9jYXRpb25zID0gbnVsbDsKLS8vICAgIHJlc291cmNlYnVuZGxlID0gbnVsbDsKLS8vICAgIC8vdmFsaWRhdGlvbkNvbnRyb2xsZXIgPSBudWxsOwotLy8gICAgZXJyb3JzID0gZmFsc2U7Ci0vLyAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDIwL1dTREwyMFZhbGlkYXRvckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjFmN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMjAvV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwyMDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0KLS8qKgotICogVGhlIFdTREwgMS4xIHZhbGlkYXRvciBkZWxlZ2F0ZSBob2xkcyBhIHJlZmVyZW5jZSB0byBhIHZhbGlkYXRvciB0byBiZSBpbnN0YW50aWF0ZWQgYXQKLSAqIGEgbGF0ZXIgcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZQotewotICBwcml2YXRlIFN0cmluZyB2YWxpZGF0b3JDbGFzc25hbWUgPSBudWxsOwotICBwcml2YXRlIFN0cmluZyByZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0gIHByaXZhdGUgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBudWxsOwotICBwcml2YXRlIElXU0RMMjBWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgZGVsZWdhdGUgZm9yIGEgdmFsaWRhdG9yIGJ5IGl0cyBjbGFzcyBuYW1lIGFuZCByZXNvdXJjZSBidW5kbGUgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgV1NETDIwVmFsaWRhdG9yRGVsZWdhdGUoU3RyaW5nIHZhbGlkYXRvckNsYXNzbmFtZSwgU3RyaW5nIHJlc291cmNlQnVuZGxlKQotICB7Ci0gICAgdGhpcy52YWxpZGF0b3JDbGFzc25hbWUgPSB2YWxpZGF0b3JDbGFzc25hbWU7Ci0gICAgdGhpcy5yZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGRlbGVnYXRlIGZvciBhIHZhbGlkYXRvciBieSBpdHMgY2xhc3MgbmFtZSwgcmVzb3VyY2UgYnVuZGxlIG5hbWUgYW5kIAotICAgKiBhIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc25hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlIFRoZSBuYW1lIG9mIHRoZSB2YWxpZGF0b3IgYmFzZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgY2xhc3MgbG9hZGVyIHRvIHVzZSB0byBsb2FkIHRoZSB2YWxpZGF0b3IgYW5kIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBXU0RMMjBWYWxpZGF0b3JEZWxlZ2F0ZShTdHJpbmcgdmFsaWRhdG9yQ2xhc3NuYW1lLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICB7Ci0gICAgdGhpcyh2YWxpZGF0b3JDbGFzc25hbWUsIHJlc291cmNlQnVuZGxlKTsKLSAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB2YWxpZGF0b3Igc3BlY2lmaWVkIGluIHRoaXMgZGVsZWdhdGUuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBXU0RMIDEuMSB2YWxpZGF0b3Igc3BlY2lmaWVkIGJ5IHRoaXMgZGVsZWdhdGUuCi0gICAqLwotICBwdWJsaWMgSVdTREwyMFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQotICB7Ci0gICAgaWYgKHZhbGlkYXRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmKGNsYXNzTG9hZGVyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJY2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MgPQotICAgICAgICAgIGNsYXNzTG9hZGVyICE9IG51bGwgPyBjbGFzc0xvYWRlci5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3NuYW1lKSA6IENsYXNzLmZvck5hbWUodmFsaWRhdG9yQ2xhc3NuYW1lKTsKLQotICAgICAgICB2YWxpZGF0b3IgPSAoSVdTREwyMFZhbGlkYXRvcil2YWxpZGF0b3JDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFJlc291cmNlQnVuZGxlIHZhbGlkYXRvckJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZSwgTG9jYWxlLmdldERlZmF1bHQoKSwgY2xhc3NMb2FkZXIpOwotICAgICAgICAgIHZhbGlkYXRvci5zZXRSZXNvdXJjZUJ1bmRsZSh2YWxpZGF0b3JCdW5kbGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBhZGQgbG9nZ2luZwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0Fic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9BYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2NiNTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0Fic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZ2VuZXJhdGluZyBvYmplY3RzIG5lZWRlZCBmb3IgWE1MIENvbmZvcm1hbmNlIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeQotewotICBwcm90ZWN0ZWQgc3RhdGljIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5IGluc3RhbmNlOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluc3RhbmNlIG9mIHRoaXMgZmFjdG9yeS4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoaXMgZmFjdG9yeQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBEZWZhdWx0WE1MQ29uZm9ybWFuY2VGYWN0b3J5KCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgZmFjdG9yeSB0byB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gZmFjdG9yeSAtIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGlzIGZhY3Rvcnkgd2lsbCB1c2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbXBsZW1lbnRhdGlvbihBYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgaW5zdGFuY2UgPSBmYWN0b3J5OwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIGFuIFhNTCB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIGFuIFhNTCB2YWxpZGF0b3IKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBJWE1MVmFsaWRhdG9yIGdldFhNTFZhbGlkYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTRlMTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxDb25mb3JtYW5jZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFhNTENvbmZvcm1hbmNlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0WE1MQ29uZm9ybWFuY2VGYWN0b3J5Ci17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIERlZmF1bHRYTUxDb25mb3JtYW5jZUZhY3RvcnkoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5BYnN0cmFjdFhNTENvbmZvcm1hbmNlRmFjdG9yeSNnZXRYTUxWYWxpZGF0b3IoKQotICAgKi8KLSAgcHVibGljIElYTUxWYWxpZGF0b3IgZ2V0WE1MVmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiBuZXcgRGVmYXVsdFhNTFZhbGlkYXRvcigpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0RlZmF1bHRYTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmN2E1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9EZWZhdWx0WE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuamF4cC5TQVhQYXJzZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbk1lc3NhZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgSVhNTFZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRYTUxWYWxpZGF0b3IgaW1wbGVtZW50cyBJWE1MVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUiA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9jb250aW51ZS1hZnRlci1mYXRhbC1lcnJvciI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VfUFJFRklYRVMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VTID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX1ZBTElEQVRJT04gPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfVkFMSURBVElPTl9TQ0hFTUEgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0FQQUNIRV9QUk9QRVJUWV9FWFRFUk5BTF9TQ0hFTUFMT0NBVElPTiA9Ci0gICAgImh0dHA6Ly9hcGFjaGUub3JnL3htbC9wcm9wZXJ0aWVzL3NjaGVtYS9leHRlcm5hbC1zY2hlbWFMb2NhdGlvbiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIERFRklOSVRJT05TID0gImRlZmluaXRpb25zIjsKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9BTFdBWVMgPSAiSUdOT1JFX0FMV0FZUyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRU1BVFVSRV9FT0YgPSAiUHJlbWF0dXJlRU9GIjsKLSAgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaW5nb3JlZEVycm9yS2V5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyB1cmk7Ci0gIHByb3RlY3RlZCBVUklSZXNvbHZlciB1cmlSZXNvbHZlciA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBzY2hlbWFMb2NhdGlvblN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgcHJvdGVjdGVkIExpc3QgaWdub3JlZE5hbWVzcGFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAotICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RXJyb3JLZXkgPSBudWxsOwotICBwcm90ZWN0ZWQgT2JqZWN0W10gY3VycmVudE1lc3NhZ2VBcmd1bWVudHMgPSBudWxsOwotICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDaGlsZE9mRG9jID0gZmFsc2U7Ci0vLyAgcHJvdGVjdGVkIFN0cmluZyB3c2RsTmFtZXNwYWNlID0gbnVsbDsKLQotCi0KLQotLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIERlZmF1bHRYTUxWYWxpZGF0b3IoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICAKLSAgICBpZ25vcmVkTmFtZXNwYWNlTGlzdC5hZGQoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSk7Ci0gICAgaWdub3JlZE5hbWVzcGFjZUxpc3QuYWRkKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApOwotICAgIGlnbm9yZWROYW1lc3BhY2VMaXN0LmFkZChDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxKTsKLSAgICAKLSAgICBpbmdvcmVkRXJyb3JLZXlUYWJsZS5wdXQoUFJFTUFUVVJFX0VPRiwgSUdOT1JFX0FMV0FZUyk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jc2V0RmlsZShJRmlsZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIHVyaSkKLSAgewotICAgIHRoaXMudXJpID0gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgewotICAJdGhpcy51cmlSZXNvbHZlciA9IHVyaVJlc29sdmVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudmFsaWRhdGUud3NkbC54bWxjb25mb3JtYW5jZS5JWE1MVmFsaWRhdG9yQWN0aW9uI3J1bigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgLy8gVmFsaWRhdGUgdGhlIFhNTCBmaWxlLgotICAgIHRyeQotICAgIHsKLSAgICAgIFJlYWRlciByZWFkZXIxID0gbnVsbDsgLy8gVXNlZCBmb3IgdGhlIHByZXBhcnNlLgotICAgICAgUmVhZGVyIHJlYWRlcjIgPSBudWxsOyAvLyBVc2VkIGZvciB2YWxpZGF0aW9uIHBhcnNlLgotICAgICAgCi0gICAgICBJbnB1dFNvdXJjZSB2YWxpZGF0ZUlucHV0U291cmNlOyAKLSAgICAgCi0gICAgICAKLSAgICAgIGlmICh0aGlzLmlucHV0U3RyZWFtICE9IG51bGwpCi0gICAgICB7ICAgIAotICAgICAgCi0KLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICAgICAgcmVhZGVyMSA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsKLSAgICAgICAgcmVhZGVyMiA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsgCi0gICAgICAgICAgCi0gICAgICAgIHZhbGlkYXRlSW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pOwotICAgICAgICB2YWxpZGF0ZUlucHV0U291cmNlLnNldENoYXJhY3RlclN0cmVhbShyZWFkZXIyKTsKLSAgICAgIH0gZWxzZQotICAgICAgeyB2YWxpZGF0ZUlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHByZXBhcnNlKHVyaSwgcmVhZGVyMSk7Ci0gICAgICAKLSAgICAgIFNBWFBhcnNlciBzYXhwYXJzZXIgPSBjcmVhdGVTQVhQYXJzZXIoKTsKLSAgICAgIFhNTENvbmZvcm1hbmNlRGVmYXVsdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxDb25mb3JtYW5jZURlZmF1bHRIYW5kbGVyKCk7Ci0KLSAgICAgIHNheHBhcnNlci5zZXRFcnJvckhhbmRsZXIoaGFuZGxlcik7Ci0JICBzYXhwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoaGFuZGxlcik7Ci0JICBzYXhwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7Ci0gICAgICAKLSAgICAgIHNheHBhcnNlci5wYXJzZSh2YWxpZGF0ZUlucHV0U291cmNlKTsKLS8vICAgICAgd3NkbE5hbWVzcGFjZSA9IGhhbmRsZXIuZ2V0V1NETE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBhZGRFcnJvcihlLmdldE1lc3NhZ2UoKSwgZS5nZXRMaW5lTnVtYmVyKCksIGUuZ2V0Q29sdW1uTnVtYmVyKCksIHVyaSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIFNBWCBwYXJzZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuZXcgU0FYIHBhcnNlci4KLSAgICovCi0gIHByb3RlY3RlZCBTQVhQYXJzZXIgY3JlYXRlU0FYUGFyc2VyKCkKLSAgewotICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJmYWN0b3J5ID0gbmV3IFNBWFBhcnNlckZhY3RvcnlJbXBsKCk7Ci0gICAgICB0cnkKLSAgICAgIHsgTXlTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbigpOwotICAgICAgICBzYXhQYXJzZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoY29uZmlndXJhdGlvbik7Ci0gICAgICAgIHNheFBhcnNlci5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUiwgdHJ1ZSk7Ci0gICAgICAgIHNheFBhcnNlci5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VfUFJFRklYRVMsIHRydWUpOwotICAgICAgICBzYXhQYXJzZXIuc2V0RmVhdHVyZShfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFUywgdHJ1ZSk7Ci0gICAgICAgIHNheFBhcnNlci5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9WQUxJREFUSU9OLCB0cnVlKTsKLSAgICAgICAgc2F4UGFyc2VyLnNldEZlYXR1cmUoX0FQQUNIRV9GRUFUVVJFX1ZBTElEQVRJT05fU0NIRU1BLCB0cnVlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgICBpZiAoc2NoZW1hTG9jYXRpb25TdHJpbmcubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBzYXhQYXJzZXIuc2V0UHJvcGVydHkoX0FQQUNIRV9QUk9QRVJUWV9FWFRFUk5BTF9TQ0hFTUFMT0NBVElPTiwgc2NoZW1hTG9jYXRpb25TdHJpbmcudG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0vLyAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0vLyAgICB7Ci0vLyAgICB9Ci0gICAgcmV0dXJuIHNheFBhcnNlcjsKLSAgfQotCi0gIAotICBmaW5hbCBTdHJpbmcgY3JlYXRlU3RyaW5nRm9ySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICAvLyBIZXJlIHdlIGFyZSByZWFkaW5nIHRoZSBmaWxlIGFuZCBzdG9yaW5nIHRvIGEgc3RyaW5nYnVmZmVyLgotICAgIFN0cmluZ0J1ZmZlciBmaWxlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0UmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKTsKLSAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihpbnB1dFJlYWRlcik7Ci0gICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsxMDI0XTsKLSAgICAgIGludCBudW1iZXJSZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpOwotICAgICAgd2hpbGUgKG51bWJlclJlYWQgIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGZpbGVTdHJpbmcuYXBwZW5kKGNoYXJzLCAwLCBudW1iZXJSZWFkKTsKLSAgICAgICAgbnVtYmVyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLSAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVTdHJpbmcudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFByZXBhcnNlIHRoZSBmaWxlIHRvIGZpbmQgYWxsIG9mIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGRlZmluZWQgaW4gb3JkZXIKLSAgICogdG8gc3BlY2lmeSB0aGUgc2NoZW1hbG9jYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgdG8gcGFyc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcmVwYXJzZShTdHJpbmcgdXJpLCBSZWFkZXIgY2hhcmFjdGVyU3RyZWFtKQotICB7Ci0gICAgICBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXIgc2F4UGFyc2VyID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAgIAotICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2U7IAotICAgICAgCi0gICAgICBpZiAoY2hhcmFjdGVyU3RyZWFtICE9IG51bGwpCi0gICAgICB7ICAgCi0gICAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UodXJpKTsKLSAgICAgICAgICBpbnB1dFNvdXJjZS5zZXRDaGFyYWN0ZXJTdHJlYW0oY2hhcmFjdGVyU3RyZWFtKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZSh1cmkpOwotICAgICAgfQotICAgICAgCi0gICAgICBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlcmZhY3RvcnkgPSBuZXcgU0FYUGFyc2VyRmFjdG9yeUltcGwoKTsKLQotICAgICAgcGFyc2VyZmFjdG9yeS5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VfUFJFRklYRVMsIHRydWUpOwotICAgICAgcGFyc2VyZmFjdG9yeS5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VTLCB0cnVlKTsKLQotICAgICAgc2F4UGFyc2VyID0gcGFyc2VyZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgIFNjaGVtYVN0cmluZ0hhbmRsZXIgaGFuZGxlciA9IG5ldyBTY2hlbWFTdHJpbmdIYW5kbGVyKHVyaSk7Ci0gICAgICAKLSAgICAgIHNheFBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSwgaGFuZGxlcik7Ci0gICAgfQotICAgIGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jaGFzRXJyb3JzKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpCi0gIHsKLSAgICByZXR1cm4gIWVycm9ycy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLnhtbGNvbmZvcm1hbmNlLklYTUxWYWxpZGF0b3JBY3Rpb24jZ2V0RXJyb3JMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpCi0gIHsKLSAgICByZXR1cm4gZXJyb3JzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBtZXNzYWdlIHRvIGFkZC4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVycm9yLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZXJyb3IuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvcihTdHJpbmcgZXJyb3IsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgZXJyb3JzLmFkZChuZXcgVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKGVycm9yLCBsaW5lLCBjb2x1bW4sIFZhbGlkYXRpb25NZXNzYWdlSW1wbC5TRVZfRVJST1IsIHVyaSwgY3VycmVudEVycm9yS2V5LCBjdXJyZW50TWVzc2FnZUFyZ3VtZW50cykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBoYW5kbGVyIGZvciB0aGUgU0FYIHBhcnNlci4gVGhpcyBoYW5kbGVyIHdpbGwgb2J0YWluIHRoZSBXU0RMCi0gICAqIG5hbWVzcGFjZSwgaGFuZGxlIGVycm9ycyBhbmQgcmVzb2x2ZSBlbnRpdGllcy4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxDb25mb3JtYW5jZURlZmF1bHRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLSAgewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgIFN0cmluZyB0ZW1wVVJJID0gYXJnMC5nZXRTeXN0ZW1JZCgpOwotICAgICBpZiAoaW5wdXRTdHJlYW0hPSBudWxsICYmIGFyZzAuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKQotICAgICB7Ci0gICAgICAgLy9taDogSW4gdGhpcyBjYXNlIHdlIGFyZSB2YWxpZGF0aW5nIGEgc3RyZWFtIHNvIHRoZSBVUkkgbWF5IGJlIG51bGwgaW4gdGhpcyBleGNlcHRpb24KLSAgICAgICB0ZW1wVVJJID0gdXJpOyAgICAgICAKLSAgICAgfQotICAgICBhZGRFcnJvcihhcmcwLmdldE1lc3NhZ2UoKSwgYXJnMC5nZXRMaW5lTnVtYmVyKCksIGFyZzAuZ2V0Q29sdW1uTnVtYmVyKCksIHRlbXBVUkkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkRXJyb3IoYXJnMC5nZXRNZXNzYWdlKCksIGFyZzAuZ2V0TGluZU51bWJlcigpLCBhcmcwLmdldENvbHVtbk51bWJlcigpLCBhcmcwLmdldFN5c3RlbUlkKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBhcmcwKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkRXJyb3IoYXJnMC5nZXRNZXNzYWdlKCksIGFyZzAuZ2V0TGluZU51bWJlcigpLCBhcmcwLmdldENvbHVtbk51bWJlcigpLCBhcmcwLmdldFN5c3RlbUlkKCkpOwotICAgIH0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKLQkJCXRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZihsb2NhbE5hbWUuZXF1YWxzKCJkb2N1bWVudGF0aW9uIikgJiYgKHVyaS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9XU0RMKSB8fCB1cmkuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEpfHwgdXJpLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCB1cmkuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKSkKLQkJewotCQkgIGlzQ2hpbGRPZkRvYyA9IGZhbHNlOwotCQl9Ci0JCXN1cGVyLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLAotCQkJQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYobG9jYWxOYW1lLmVxdWFscygiZG9jdW1lbnRhdGlvbiIpICYmICh1cmkuZXF1YWxzKENvbnN0YW50cy5OU19VUklfV1NETCkgfHwgdXJpLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAxKXx8IHVyaS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMTk5OSkgfHwgdXJpLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKSkpCi0JCXsKLQkJICBpc0NoaWxkT2ZEb2MgPSB0cnVlOwotCQl9Ci0JCXN1cGVyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHMpOwotCX0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBleGFtaW5pbmcgYSBzdWJlbGVtZW50IG9mIHRoZSAKLQkgIC8vIFdTREwgb3Igc2NoZW1hIGRvY3VtZW50YXRpb24gZWxlbWVudCB3ZSBkb24ndCB3YW50IHRvIHJlc29sdmUgaXQKLQkgIC8vIGFzIGFueXRoaW5nIGlzIGFsbG93ZWQgYXMgYSBjaGlsZCBvZiBkb2N1bWVudGF0aW9uLgotCSAgaWYoaXNDaGlsZE9mRG9jKQotCSAgewotCSAgICByZXR1cm4gbmV3IElucHV0U291cmNlKCk7Ci0JICB9Ci0gICAgaWYocHVibGljSWQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdWJsaWNJZCA9IHN5c3RlbUlkOwotICAgIH0KLSAgICAgIAotICAgIFN0cmluZyB1cmkgPSB1cmlSZXNvbHZlci5yZXNvbHZlKG51bGwsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgaWYgKHVyaSAhPSBudWxsICYmICF1cmkuZXF1YWxzKCIiKSkKLSAgICB7Ci0JCSAgdHJ5Ci0JCSAgewotCSAgICAgIFN0cmluZyBlbnRpdHk7Ci0JCSAgICBlbnRpdHkgPSBzeXN0ZW1JZDsKLQkJICAgIGlmKHB1YmxpY0lkICE9IG51bGwpCi0JCSAgICB7Ci0JCQkgICAgZW50aXR5ID0gcHVibGljSWQ7Ci0JCSAgICB9Ci0JCSAgICBVUkwgZW50aXR5VVJMID0gbmV3IFVSTCh1cmkpOwotICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZShlbnRpdHkpOwotCQkgICAgaXMuc2V0Qnl0ZVN0cmVhbShlbnRpdHlVUkwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gaXM7Ci0gICAgICAgIH0KLQkJICB9Ci0JCSAgY2F0Y2goRXhjZXB0aW9uIGUpCi0JCSAgewotCQkgICAgLy8gRG8gbm90aGluZy4KLQkJICB9Ci0gICAgfQotICAgICAgLy8gVGhpcyB0cnkvY2F0Y2ggYmxvY2sgd2l0aCB0aGUgSU9FeGNlcHRpb24gaXMgaGVyZSB0byBoYW5kbGUgYSBkaWZmZXJlbmNlCi0gICAgICAvLyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgRW50aXR5UmVzb2x2ZXIgaW50ZXJmYWNlLgotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElucHV0U291cmNlIGlzID0gc3VwZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgICBpZihpcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGlzOwotICAgICAgfQotICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudmFsaWRhdGUud3NkbC54bWxjb25mb3JtYW5jZS5JWE1MVmFsaWRhdG9yI3NldFNjaGVtYUxvY2F0aW9uKFN0cmluZywKLSAgICogICAgICBTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWFMb2NhdGlvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbG9jYXRpb24gIT0gbnVsbCAmJiAhbmFtZXNwYWNlLmVxdWFsc0lnbm9yZUNhc2UoIiIpICYmICFsb2NhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCIiKSkKLSAgICB7Ci0gICAgICBzY2hlbWFMb2NhdGlvblN0cmluZy5hcHBlbmQoIiAiKS5hcHBlbmQobmFtZXNwYWNlKS5hcHBlbmQoIiAiKS5hcHBlbmQoZm9ybWF0VVJJKGxvY2F0aW9uKSk7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBpbnB1dFN0cmVhbSAtIHNldCB0aGUgaW5wdXRTdHJlYW0gdG8gdmFsaWRhdGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgICB0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlIHNwYWNlIGNoYXJhY3RlcnMgZnJvbSBhIFN0cmluZyBhbmQgcmVwbGFjZSB0aGVtIHdpdGggJTIwLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSAtCi0gICAqICAgICAgICAgICAgdGhlIHVyaSB0byBmb3JtYXQKLSAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRVUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyBzcGFjZSA9ICIlMjAiOwotICAgIFN0cmluZ0J1ZmZlciBuZXdVcmkgPSBuZXcgU3RyaW5nQnVmZmVyKHVyaSk7Ci0gICAgaW50IG5ld1VyaUxlbmd0aCA9IG5ld1VyaS5sZW5ndGgoKTsKLQotICAgIC8vIHdvcmsgYmFja3dhcmRzIHRocm91Z2ggdGhlIHN0cmluZ2J1ZmZlciBpbiBjYXNlIGl0IGdyb3dzIHRvIHRoZQotICAgIC8vIHBvaW50Ci0gICAgLy8gd2hlcmUgdGhlIGxhc3Qgc3BhY2Ugd291bGQgYmUgbWlzc2VkLgotICAgIGZvciAoaW50IGkgPSBuZXdVcmlMZW5ndGggLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBpZiAobmV3VXJpLmNoYXJBdChpKSA9PSAnICcpCi0gICAgICB7Ci0gICAgICAgIG5ld1VyaS5yZXBsYWNlKGksIGkgKyAxLCBzcGFjZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld1VyaS50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgaGFuZGxlciB1c2VkIGluIHByZXBhcnNpbmcgdG8gZ2V0IHRoZSBzY2hlbWFMb2NhdGlvbiBzdHJpbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgU2NoZW1hU3RyaW5nSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ci0JICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlbG9jYXRpb24gPSBudWxsOwotCi0gICAgcHVibGljIFNjaGVtYVN0cmluZ0hhbmRsZXIoU3RyaW5nIGJhc2Vsb2NhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLmJhc2Vsb2NhdGlvbiA9IGJhc2Vsb2NhdGlvbjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzdGFydEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy54bWwuc2F4LkF0dHJpYnV0ZXMpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbG5hbWUsIFN0cmluZyBhcmcyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobG9jYWxuYW1lLmVxdWFscyhERUZJTklUSU9OUykpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFRBUkdFVE5BTUVTUEFDRSk7Ci0gICAgICAgIGludCBudW1BdHRzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BdHRzOyBpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgIFN0cmluZyBhdHRuYW1lID0gYXR0cmlidXRlcy5nZXRRTmFtZShpKTsKLSAgICAgICAgICBpZiAoYXR0bmFtZS5zdGFydHNXaXRoKFhNTE5TKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgIGlmKCEobmFtZXNwYWNlLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpIHx8IGlnbm9yZWROYW1lc3BhY2VMaXN0LmNvbnRhaW5zKG5hbWVzcGFjZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBuYW1lc3BhY2U7Ci0gICAgICAgICAgICAgIHNldFNjaGVtYUxvY2F0aW9uKG5hbWVzcGFjZSwgcmVzb2x2ZWRVUkkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbG5hbWUsIGFyZzIsIGF0dHJpYnV0ZXMpOwotCi0gICAgfQotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBjbGFzcyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbgotICB7Ci0gICAgcHVibGljIE15U3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uKCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5EVERDb25maWd1cmF0aW9uI2NyZWF0ZUVycm9yUmVwb3J0ZXIoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBYTUxFcnJvclJlcG9ydGVyIGNyZWF0ZUVycm9yUmVwb3J0ZXIoKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgWE1MRXJyb3JSZXBvcnRlcigpCi0gICAgICB7Ci0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXIjcmVwb3J0RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdLCBzaG9ydCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3VtZW50cywKLSAgICAgICAgICAgIHNob3J0IHNldmVyaXR5KSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50RXJyb3JLZXkgPSBrZXk7Ci0gICAgICAgICAgY3VycmVudE1lc3NhZ2VBcmd1bWVudHMgPSBhcmd1bWVudHM7Ci0gICAgICAgICAgc3VwZXIucmVwb3J0RXJyb3IoZG9tYWluLCBrZXksIGFyZ3VtZW50cywgc2V2ZXJpdHkpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLSAgfQotICAKLSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9FbGVtZW50TG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0VsZW1lbnRMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q5YTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0VsZW1lbnRMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEhvbGRzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gZWxlbWVudCBpbiB0aGUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TG9jYXRpb24KLXsgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJsb2NhdGlvbiI7Ci0gIHByb3RlY3RlZCBpbnQgbGluZTsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW47Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBsaW5lIC0gdGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICogQHBhcmFtIGNvbHVtbiAtIHRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50TG9jYXRpb24oaW50IGxpbmUsIGludCBjb2x1bW4pCi0gIHsKLSAgICB0aGlzLmxpbmUgPSBsaW5lOwotICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBsaW5lIG51bWJlciBmb3IgdGhpcyBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiB0aGUgbGluZSBudW1iZXIgZm9yIHRoaXMgZWxlbWVudAotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgewotICAJcmV0dXJuIGxpbmU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgZm9yIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgZm9yIHRoaXMgZWxlbWVudAotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gIAlyZXR1cm4gY29sdW1uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvSVhNTENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmNDU2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYW4gWE1MIGNhdGFsb2cuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTENhdGFsb2cKLXsKLQotICAvKioKLSAgICogQWRkIGEgcHVibGljIGlkIGFuZCBhIGxvY2F0aW9uIHRvIHRoZSBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIHB1YmxpY0lkIC0KLSAgICogICAgICAgICAgdGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50cnkKLSAgICogQHBhcmFtIHN5c3RlbUlkIC0KLSAgICogICAgICAgICAgdGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50cnkKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZEVudHJ5VG9DYXRhbG9nKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLQotICAvKioKLSAgICogUmVzb2x2ZSB0aGUgbG9jYXRpb24gb2YgYW4gZW50aXR5IGdpdmVuIHB1YmxpYyBhbmQgc3lzdGVtIGlkcy4KLSAgICogCi0gICAqIEBwYXJhbSBwdWJsaWNJZCAtCi0gICAqICAgICAgICAgIHRoZSBwdWJsaWMgaWQgb2YgdGhlIGVudGl0eSB0byBiZSByZXNvbHZlZAotICAgKiBAcGFyYW0gc3lzdGVtSWQgLQotICAgKiAgICAgICAgICB0aGUgc3lzdGVtIGlkIG9mIHRoZSBlbnRpdHkgdG8gYmUgcmVzb2x2ZWQKLSAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGVudGl0eQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlRW50aXR5TG9jYXRpb24oU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0lYTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL0lYTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjYWRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9JWE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGZvciBhbiBYTUwgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFNldCB0aGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0gdGhlIHVyaSBvZiB0aGUgZmlsZSB0byBiZSB2YWxpZGF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIHVyaSk7Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdlcmUgdmFsaWRhdGlvbiBlcnJvcnMsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSB3ZXJlIHZhbGlkYXRpb24gZXJyb3JzLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0Vycm9ycygpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZXJyb3JzLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBlcnJvcnMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9ycygpOwotICAKLSAgLyoqCi0gICAqIEFkZCBhIHNjaGVtYSBsb2NhdGlvbiB0byBiZSBzY2hlbWEgbG9jYXRpbm8gc3RyaW5nIHVzZWQgYnkgdGhlIFhNTCBwYXJzZXIuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZXMgb2YgdGhlIHNjaGVtYQotICAgKiBAcGFyYW0gbG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2F0aW9uKTsKLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIFVSSSByZXNvbHZlciB0byB1c2UuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSByZXNvbHZlciB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9MaW5lTnVtYmVyRE9NUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9MaW5lTnVtYmVyRE9NUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGRiMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvTGluZU51bWJlckRPTVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlN5bWJvbFRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5OYW1lc3BhY2VDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MQXR0cmlidXRlczsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC5Db25zdGFudHM7Ci0KLS8qKgotICogQSBET00gcGFyc2VyIHRoYXQgd2lsbCByZWdpc3RlciBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBpbiB0aGUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lTnVtYmVyRE9NUGFyc2VyIGV4dGVuZHMgRE9NUGFyc2VyCi17Ci0gIFhNTExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIExpbmVOdW1iZXJET01QYXJzZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBzZXRGZWF0dXJlKERFRkVSX05PREVfRVhQQU5TSU9OLCBmYWxzZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGFyZzAgVGhlIHBhcnNlciBjb25maWd1cmF0aW9uLgotICAgKi8KLSAgcHVibGljIExpbmVOdW1iZXJET01QYXJzZXIoWE1MUGFyc2VyQ29uZmlndXJhdGlvbiBhcmcwKQotICB7Ci0gICAgc3VwZXIoYXJnMCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc2V0RmVhdHVyZShERUZFUl9OT0RFX0VYUEFOU0lPTiwgZmFsc2UpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gYXJnMCBBIHN5bWJvbCB0YWJsZSBmb3IgdGhlIHBhcnNlci4KLSAgICovCi0gIHB1YmxpYyBMaW5lTnVtYmVyRE9NUGFyc2VyKFN5bWJvbFRhYmxlIGFyZzApCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBhcmcwIEEgc3ltYm9sIHRhYmxlIGZvciB0aGUgcGFyc2VyLgotICAgKiBAcGFyYW0gYXJnMSBBIGdyYW1tYXIgcG9vbCBmb3IgdGhlIHBhcnNlci4KLSAgICovCi0gIHB1YmxpYyBMaW5lTnVtYmVyRE9NUGFyc2VyKFN5bWJvbFRhYmxlIGFyZzAsIFhNTEdyYW1tYXJQb29sIGFyZzEpCi0gIHsKLSAgICBzdXBlcihhcmcwLCBhcmcxKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxEb2N1bWVudEhhbmRsZXIjc3RhcnRFbGVtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5RTmFtZSwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTEF0dHJpYnV0ZXMsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFFOYW1lIGFyZzAsIFhNTEF0dHJpYnV0ZXMgYXJnMSwgQXVnbWVudGF0aW9ucyBhcmcyKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBFbGVtZW50IGVsZW1lbnQ7Ci0gICAgLy8gRm9yIGVsZW1lbnRzIGZyb20gdGhlIFNjaGVtYSBuYW1lc3BhY2Ugd2Ugd2FudCB0byBwcmVzZXJ2ZSB0aGVtCi0gICAgLy8gdGhlIHdheSB0aGV5IHdlcmUgZW50ZXJlZC4gUmV2ZXJ0IHRoZSB2YWx1ZXMgdG8gdGhlIG5vbi1ub3JtYWxpemVkIHZhbHVlcy4KLSAgICBTdHJpbmcgbnMgPSBhcmcwLnVyaTsKLSAgICBpZihucyAhPSBudWxsICYmIChucy5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMSkgfHwgbnMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IG5zLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8yMDAwKSkpCi0gICAgewotICAgICAgaW50IG51bWF0dHMgPSBhcmcxLmdldExlbmd0aCgpOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bWF0dHM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vbk5vcm1hbGl6ZWRWYWx1ZSA9IGFyZzEuZ2V0Tm9uTm9ybWFsaXplZFZhbHVlKGkpOwotICAgICAgICBhcmcxLnNldFZhbHVlKGksIG5vbk5vcm1hbGl6ZWRWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnN0YXJ0RWxlbWVudChhcmcwLCBhcmcxLCBhcmcyKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gKEVsZW1lbnQpZ2V0UHJvcGVydHkoQ1VSUkVOVF9FTEVNRU5UX05PREUpOwotICAgICAgRWxlbWVudEltcGwgZWxlbWVudEltcGwgPSAoRWxlbWVudEltcGwpZWxlbWVudDsKLSAgICAgIGVsZW1lbnRJbXBsLnNldFVzZXJEYXRhKAotICAgICAgICBFbGVtZW50TG9jYXRpb24uSUQsCi0gICAgICAgIG5ldyBFbGVtZW50TG9jYXRpb24obG9jYXRvci5nZXRMaW5lTnVtYmVyKCksIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpLAotICAgICAgICBudWxsKTsKLSAgICB9Ci0gICAgLy8gY2F0Y2ggU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBhbmQgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIGNhbid0IGdldCBlbGVtZW50Ci0gICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTERvY3VtZW50SGFuZGxlciNzdGFydERvY3VtZW50KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuTmFtZXNwYWNlQ29udGV4dCwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KFhNTExvY2F0b3IgYXJnMCwgU3RyaW5nIGFyZzEsIE5hbWVzcGFjZUNvbnRleHQgYXJnMiwgQXVnbWVudGF0aW9ucyBhcmczKQotICAgIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIGxvY2F0b3IgPSBhcmcwOwotICAgIHN1cGVyLnN0YXJ0RG9jdW1lbnQoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5YTU5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuamF4cC5TQVhQYXJzZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFhNTENhdGFsb2cgVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byByZWdpc3Rlciwgb2J0YWluIGFuZCBkZWxldGUgYW4gaW5zdGFuY2UKLSAqIG9mIGFuIFhNTCBjYXRhbG9nLiBNZXRob2QgZGVmaW5pdGlvbnMgYXJlIHByb3ZpZGVkIGZvciB0aGUgY2F0YWxvZyB0byBzZXQgYQotICogbG9jYXRpb24gaW4gdGhlIGNhdGFsb2cgYW5kIHJlc29sdmUgYW4gZW50aXR5IGZyb20gdGhlIGNhdGFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nIGltcGxlbWVudHMgSVhNTENhdGFsb2cKLXsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUiA9ICJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFX1BSRUZJWEVTID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2UtcHJlZml4ZXMiOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfQVBBQ0hFX0ZFQVRVUkVfTkFNRVNQQUNFUyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9BUEFDSEVfRkVBVFVSRV9WQUxJREFUSU9OID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIjsKLQotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX0FQQUNIRV9GRUFUVVJFX1ZBTElEQVRJT05fU0NIRU1BID0gImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgSVhNTENhdGFsb2cgaW5zdGFuY2UgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHR4bWxjYXRhbG9nY2xhc3MgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGV4dGNsYXNzTG9hZGVyID0gbnVsbDsKLQotICBwcml2YXRlIHN0YXRpYyBJWE1MQ2F0YWxvZyBleHRYTUxDYXRhbG9nSW5zdGFuY2UgPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIExpc3Qgc2NoZW1hZGlycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICBwcml2YXRlIHN0YXRpYyBMaXN0IGVudGl0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBBIGhhc2h0YWJsZSB0byBob2xkIHRoZSBYTUwgY2F0YWxvZyBlbnRyaWVzLgotICAgKi8KLSAgcHJvdGVjdGVkIE1hcCBjYXRhbG9nID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBjYXRhbG9nLiBBc3NpZ25zIGFsbCByZWdpc3RlcmVkIHNjaGVtYXMgdG8KLSAgICogdGhlIFhNTCBjYXRhbG9nLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgaW5zdGFuY2Ugb2YgdGhlIFhNTCBjYXRhbG9nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJWE1MQ2F0YWxvZyBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYTUxDYXRhbG9nKCk7Ci0KLSAgICAgIC8vIEFkZCB0aGUgcmVnaXN0ZXJlZCBlbnRpdGllcyB0byB0aGUgY2F0YWxvZy4KLSAgICAgIEl0ZXJhdG9yIGVudGl0eUl0ZXIgPSBlbnRpdGllcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGVudGl0eUl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBYTUxDYXRhbG9nRW50aXR5SG9sZGVyIGVudGl0eSA9IChYTUxDYXRhbG9nRW50aXR5SG9sZGVyKSBlbnRpdHlJdGVyLm5leHQoKTsKLSAgICAgICAgaW5zdGFuY2UuYWRkRW50cnlUb0NhdGFsb2coZW50aXR5LmdldFB1YmxpY0lkKCksIGVudGl0eS5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gQWRkIHRoZSBzY2hlbWFzIGluIHRoZSBzY2hlbWEgZGlyZWN0b3JpZXMgdG8gdGhlIGNhdGFsb2cuCi0gICAgICBpZiAoc2NoZW1hZGlycy5zaXplKCkgPiAwKQotICAgICAgewotICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlcmZhY3RvcnkgPSBuZXcgU0FYUGFyc2VyRmFjdG9yeUltcGwoKTsKLSAgICAgICAgICBwYXJzZXJmYWN0b3J5LnNldEZlYXR1cmUoX0FQQUNIRV9GRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUywgdHJ1ZSk7Ci0gICAgICAgICAgcGFyc2VyZmFjdG9yeS5zZXRGZWF0dXJlKF9BUEFDSEVfRkVBVFVSRV9OQU1FU1BBQ0VTLCB0cnVlKTsKLSAgICAgICAgICBzYXhQYXJzZXIgPSBwYXJzZXJmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yIHNjaGVtYWRpckl0ZXIgPSBzY2hlbWFkaXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIFNjaGVtYU5hbWVzcGFjZUhhbmRsZXIgaGFuZGxlciA9ICgoWE1MQ2F0YWxvZykgaW5zdGFuY2UpLm5ldyBTY2hlbWFOYW1lc3BhY2VIYW5kbGVyKCk7Ci0gICAgICAgIHdoaWxlIChzY2hlbWFkaXJJdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBzY2hlbWFkaXIgPSAoU3RyaW5nKSBzY2hlbWFkaXJJdGVyLm5leHQoKTsKLSAgICAgICAgICByZWdpc3RlclNjaGVtYXNGb3JEaXIoaW5zdGFuY2UsIHNjaGVtYWRpciwgc2F4UGFyc2VyLCBoYW5kbGVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmVnaXN0ZXIgdGhlIHNjaGVtYXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSBhbmQgYWxsIHN1YmRpcmVjdG9yaWVzIHdpdGggdGhlCi0gICAqIFhNTCBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIGNhdGFsb2cKLSAgICogICAgICAgICAgVGhlIGNhdGFsb2cgdG8gcmVnaXN0ZXIgdGhlIHNjaGVtYXMgd2l0aC4KLSAgICogQHBhcmFtIHNjaGVtYWRpcgotICAgKiAgICAgICAgICBUaGUgc2NoZW1hIGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIHNjaGVtYSBmaWxlcy4KLSAgICogQHBhcmFtIHBhcnNlcgotICAgKiAgICAgICAgICBUaGUgU0FYUGFyc2VyIHRvIHVzZSB0byBwYXJzZSB0aGUgc2NoZW1hcyBmb3IgdGhlaXIKLSAgICogICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlLgotICAgKiBAcGFyYW0gaGFuZGxlcgotICAgKiAgICAgICAgICBUaGUgaGFuZGxlciB0byB1c2UgdG8gZ2V0IHRoZSB0YXJnZXROYW1lc3BhY2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVyU2NoZW1hc0ZvckRpcihJWE1MQ2F0YWxvZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hZGlyLCBTQVhQYXJzZXIgcGFyc2VyLAotICAgICAgU2NoZW1hTmFtZXNwYWNlSGFuZGxlciBoYW5kbGVyKQotICB7Ci0gICAgLy8gUmVtb3ZlIGZpbGU6IGFuZCBmaWxlOi8gZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSBsb2NhdGlvbiBpZiB0aGV5IGFyZSBwcmVzZW50LgotICAgIGlmKHNjaGVtYWRpci5zdGFydHNXaXRoKCJmaWxlOi8iKSkKLSAgICB7Ci0gICAgICBzY2hlbWFkaXIgPSBzY2hlbWFkaXIuc3Vic3RyaW5nKDYpOwotICAgIH0KLSAgICBlbHNlIGlmKHNjaGVtYWRpci5zdGFydHNXaXRoKCJmaWxlOiIpKQotICAgIHsKLSAgICAgIHNjaGVtYWRpciA9IHNjaGVtYWRpci5zdWJzdHJpbmcoNSk7Ci0gICAgfQotICAgIAotICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoc2NoZW1hZGlyKTsKLSAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpCi0gICAgewotICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotICAgICAgaW50IG51bWZpbGVzID0gZmlsZXMubGVuZ3RoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1maWxlczsgaSsrKQotICAgICAgewotICAgICAgICBGaWxlIHRlbXBmaWxlID0gZmlsZXNbaV07Ci0gICAgICAgIFN0cmluZyB0ZW1wZmlsZXBhdGggPSB0ZW1wZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgaWYgKHRlbXBmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZWdpc3RlclNjaGVtYXNGb3JEaXIoY2F0YWxvZywgdGVtcGZpbGVwYXRoLCBwYXJzZXIsIGhhbmRsZXIpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGhhbmRsZXIucmVzZXQoKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJzZXIucGFyc2UodGVtcGZpbGVwYXRoLCBoYW5kbGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGxvZyBlcnJvci4KLSAgICAgICAgICB9Ci0gICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGhhbmRsZXIuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhdGFsb2cuYWRkRW50cnlUb0NhdGFsb2codGFyZ2V0TmFtZXNwYWNlLCB0ZW1wZmlsZXBhdGgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24gWE1MIGNhdGFsb2cuIFJldHVybnMgdGhlIGluc3RhbmNlIGlmIG9uZQotICAgKiBpcyByZWdpc3RlcmVkIGFuZCBjYW4gYmUgY3JlYXRlZCwgbnVsbCBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uIFhNTCBjYXRhbG9nIGlmIG9uZSBpcyByZWdpc3RlcmVkLAotICAgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJWE1MQ2F0YWxvZyBnZXRFeHRlbnNpb25DYXRhbG9nSW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGV4dFhNTENhdGFsb2dJbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmIChleHR4bWxjYXRhbG9nY2xhc3MgIT0gbnVsbCAmJiBleHRjbGFzc0xvYWRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIENsYXNzIGNhdGFsb2dDbGFzcyA9IGV4dGNsYXNzTG9hZGVyICE9IG51bGwgPyBleHRjbGFzc0xvYWRlci5sb2FkQ2xhc3MoZXh0eG1sY2F0YWxvZ2NsYXNzKSA6IENsYXNzCi0gICAgICAgICAgICAgIC5mb3JOYW1lKGV4dHhtbGNhdGFsb2djbGFzcyk7Ci0gICAgICAgICAgZXh0WE1MQ2F0YWxvZ0luc3RhbmNlID0gKElYTUxDYXRhbG9nKSBjYXRhbG9nQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAvL1RPRE86IExvZyBlcnJvcgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBleHRYTUxDYXRhbG9nSW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjbGFzcyBvZiB0aGUgWE1MIGNhdGFsb2cgdG8gYmUgdXNlZC4KLSAgICogCi0gICAqIEBwYXJhbSB4bWxjYXRhbG9nCi0gICAqICAgICAgICAgIFRoZSBjbGFzcyBvZiB0aGUgWE1MIGNhdGFsb2cgdG8gYmUgdXNlZC4KLSAgICogQHBhcmFtIGNsYXNzbG9hZGVyCi0gICAqICAgICAgICAgIFRoZSBjbGFzc2xvYWRlciB0byB1c2UgdG8gbG9hZCB0aGUgY2F0YWxvZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRlbnNpb25YTUxDYXRhbG9nKFN0cmluZyB4bWxjYXRhbG9nLCBDbGFzc0xvYWRlciBjbGFzc2xvYWRlcikKLSAgewotICAgIGV4dHhtbGNhdGFsb2djbGFzcyA9IHhtbGNhdGFsb2c7Ci0gICAgZXh0Y2xhc3NMb2FkZXIgPSBjbGFzc2xvYWRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIGluc3RhbmNlIG9mIHRoZSBYTUwgY2F0YWxvZyB0byBudWxsLiBGb3IgZGVsZXRpbmcgdGhlIGNhdGFsb2cgaWYKLSAgICogbmVjZXNzYXJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkKLSAgewotICAgIGluc3RhbmNlID0gbnVsbDsKLSAgICBleHR4bWxjYXRhbG9nY2xhc3MgPSBudWxsOwotICAgIGV4dGNsYXNzTG9hZGVyID0gbnVsbDsKLSAgICBleHRYTUxDYXRhbG9nSW5zdGFuY2UgPSBudWxsOwotICAgIGVudGl0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHNjaGVtYWRpcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgc2NoZW1hIGRpcmVjdG9yeSB0byBiZSBjaGVja2VkIGZvciBzY2hlbWFzIHRvIHJlZ2lzdGVyIGluIHRoZQotICAgKiBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYWRpcgotICAgKiAgICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIGNoZWNrIGZvciBzY2hlbWFzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFNjaGVtYURpcihTdHJpbmcgc2NoZW1hZGlyKQotICB7Ci0gICAgc2NoZW1hZGlycy5hZGQoc2NoZW1hZGlyKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gZW50aXR5IHRvIHRoZSBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIGVudGl0eQotICAgKiAgICAgICAgICBUaGUgZW50aXR5IHRvIGFkZCB0byB0aGUgY2F0YWxvZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFbnRpdHkoWE1MQ2F0YWxvZ0VudGl0eUhvbGRlciBlbnRpdHkpCi0gIHsKLSAgICBlbnRpdGllcy5hZGQoZW50aXR5KTsKLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5pbnRlcm5hbC54bWwuSVhNTENhdGFsb2cjYWRkRW50cnlUb0NhdGFsb2coamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRW50cnlUb0NhdGFsb2coU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBjYXRhbG9nLnB1dChwdWJsaWNJZCwgc3lzdGVtSWQpOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLmludGVybmFsLnhtbC5JWE1MQ2F0YWxvZyNyZXNvbHZlRW50aXR5TG9jYXRpb24oamF2YS5sYW5nLlN0cmluZywKLSAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyByZXNvbHZlRW50aXR5TG9jYXRpb24oU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRsb2NhdGlvbiA9IG51bGw7Ci0gICAgLy8gRmlyc3QgdHJ5IHRvIHJlc29sdmUgdXNpbmcgdGhlIGV4dCBjYXRhbG9nLgotICAgIElYTUxDYXRhbG9nIGV4dGNhdGFsb2cgPSBnZXRFeHRlbnNpb25DYXRhbG9nSW5zdGFuY2UoKTsKLSAgICBpZiAoZXh0Y2F0YWxvZyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc29sdmVkbG9jYXRpb24gPSBleHRjYXRhbG9nLnJlc29sdmVFbnRpdHlMb2NhdGlvbihwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIH0KLSAgICBpZiAocmVzb2x2ZWRsb2NhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIGlmIHRoZXJlJ3Mgbm8gc3lzdGVtIGlkIHVzZSB0aGUgcHVibGljIGlkCi0gICAgICBpZiAoc3lzdGVtSWQgPT0gbnVsbCB8fCBzeXN0ZW1JZC5lcXVhbHMoIiIpKQotICAgICAgewotICAgICAgICBzeXN0ZW1JZCA9IHB1YmxpY0lkOwotICAgICAgfQotICAgICAgcmVzb2x2ZWRsb2NhdGlvbiA9IChTdHJpbmcpIGNhdGFsb2cuZ2V0KHN5c3RlbUlkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc29sdmVkbG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogQSBoYW5kbGVyIHVzZWQgaW4gcGFyc2luZyB0byBnZXQgdGhlIHRhcmdldE5hbWVzcGFjZSBzdHJpbmcgb2YgYSBzY2hlbWEuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgU2NoZW1hTmFtZXNwYWNlSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBTQ0hFTUEgPSAic2NoZW1hIjsKLQotICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIGFyZzIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChsb2NhbG5hbWUuZXF1YWxzKFNDSEVNQSkpCi0gICAgICB7Ci0KLSAgICAgICAgaW50IG51bUF0dHMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUF0dHM7IGkrKykKLSAgICAgICAgewotCi0gICAgICAgICAgU3RyaW5nIGF0dG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgIGlmIChhdHRuYW1lLmVxdWFscyhUQVJHRVRfTkFNRVNQQUNFKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICBzdXBlci5zdGFydEVsZW1lbnQodXJpLCBsb2NhbG5hbWUsIGFyZzIsIGF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdGFyZ2V0TmFtZXNwYWNlIGZvdW5kIGJ5IHBhcnNpbmcgdGhlIGZpbGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgdGFyZ2V0TmFtZXNwYWNlIGZvdW5kIGJ5IHBhcnNpbmcgdGhlIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgIHsKLSAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBoYW5kbGVyIHNvIGl0IGNhbiBiZSByZXVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgIHRhcmdldE5hbWVzcGFjZSA9IG51bGw7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ0VudGl0eUhvbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ0VudGl0eUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWNhNmFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTENhdGFsb2dFbnRpdHlIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotLyoqCi0gKiBBIGNvbnRhaW5lciB0byBob2xkIHRoZSBlbnRpdHkgaW5mb3JtYXRpb24gdW50aWwgYW4gWE1MIGNhdGFsb2cgaXMKLSAqIHRvIGJlIGluaXRpYWxpemVkLgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcgotewotICBwcml2YXRlIFN0cmluZyBwdWJsaWNJZDsKLSAgcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQ7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcHVibGljSWQgVGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50aXR5LgotICAgKiBAcGFyYW0gc3lzdGVtSWQgVGhlIHN5c3RlbSBpZCBvZiB0aGUgZW50aXR5LgotICAgKi8KLSAgcHVibGljIFhNTENhdGFsb2dFbnRpdHlIb2xkZXIoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7Ci0gICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgcHVibGljIGlkIG9mIHRoZSBlbnRpdHkuCi0gICAqIEByZXR1cm4gVGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50aXR5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpCi0gIHsKLSAgICByZXR1cm4gcHVibGljSWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIGVudGl0eS4KLSAgICogQHJldHVybiBUaGUgc3lzdGVtIGlkIG9mIHRoZSBlbnRpdHkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkKLSAgewotICAgIHJldHVybiBzeXN0ZW1JZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MQ2F0YWxvZ1Jlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyNzc4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3htbC9YTUxDYXRhbG9nUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEEgcmVzb2x2ZXIgdG8gcmVzb2x2ZXIgZW50aXRpZXMgZnJvbSB0aGUgWE1MIGNhdGFsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nUmVzb2x2ZXIgaW1wbGVtZW50cyBYTUxFbnRpdHlSZXNvbHZlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIFhNTENhdGFsb2dSZXNvbHZlciB4bWxDYXRhbG9nOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByb3RlY3RlZCBYTUxDYXRhbG9nUmVzb2x2ZXIoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGlzIHJlc29sdmVyLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhpcyByZXNvbHZlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYTUxDYXRhbG9nUmVzb2x2ZXIgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKHhtbENhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB4bWxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2dSZXNvbHZlcigpOwotICAgIH0KLSAgICByZXR1cm4geG1sQ2F0YWxvZzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHVibGljSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0UHVibGljSWQoKTsKLSAgICBpZihwdWJsaWNJZCA9PSBudWxsKQotICAgIHsKLSAgICAgIHB1YmxpY0lkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBTdHJpbmcgc3lzdGVtSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0TGl0ZXJhbFN5c3RlbUlkKCk7Ci0gICAgU3RyaW5nIGxvY2F0aW9uID0gWE1MQ2F0YWxvZy5nZXRJbnN0YW5jZSgpLnJlc29sdmVFbnRpdHlMb2NhdGlvbihwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgWE1MSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgWE1MSW5wdXRTb3VyY2UocHVibGljSWQsIHN5c3RlbUlkLCBzeXN0ZW1JZCwgaXMsIG51bGwpOwotICAgICAgICByZXR1cm4gaW5wdXRTb3VyY2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBvdGhlcndpc2UgcmV0dXJuIG51bGwgdG8gdGVsbCB0aGUgcGFyc2VyIHRvIGxvY2F0ZSB0aGUgc3lzdGVtSWQgYXMgYSBVUkkKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwveG1sL1hNTE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0M2FiODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC94bWwvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWw7Ci0KLXB1YmxpYyBjbGFzcyBYTUxNZXNzYWdlSW5mb0hlbHBlcgotewotICAKLSAgLy9zZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5yZWNvbmNpbGUuRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvcgotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQVRUUklCVVRFUyA9ICJBTExfQVRUUklCVVRFUyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9OQU1FID0iQVRUUklCVVRFX05BTUUiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVkFMVUUgPSAiQVRUUklCVVRFX1ZBTFVFIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHID0gIlNUQVJUX1RBRyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAiVEVYVCI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQgPSAiRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVCI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRU5USVRZX1JFRkVSRU5DRSA9ICJURVhUX0VOVElUWV9SRUZFUkVOQ0UiOyAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUgPSAiVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUiOwotICAKLSAgCi0gIHB1YmxpYyBYTUxNZXNzYWdlSW5mb0hlbHBlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqICByZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBzaG91bGQgYmUgdW5kZXJsaW5lZCB3aXRoIHRoZSByZWQgInNxdWlnZ2xlcyIKLSAgICogIHVzaW5nIHRoZSBlcnJvcktleSwgYW5kIHRoZSBtZXNzYWdlQXJndW1lbnRzCi0gICAqICA8YnI+UG9zaXRpb24gMCBvZiB0aGUgYXJyYXkgcmV0dXJuZWQgY29udGFpbnMgdGhlIHNlbGVjdGlvbiBTdHJhdGVneSxvciB3aGF0IERPTSBFbGVtZW50IHRvIHVuZGVybGluZS4gIAotICAgKiAgRm9yIGV4YW1wbGUgIkFUVFJJQlVURV9OQU1FIiAgCi0gICAqICA8YnI+UG9zaXRpb24gMSBjb250YWlucyB0aGUgbmFtZSBvciB2YWx1ZSB0byBzcXVpZ2dsZS4KLSAgICogIDxwPkZvciBleGFtcGxlLCBpZiB3ZSB3YW50ZWQgdG8gc3F1aWdnbGUgdGhlIGF0dHJpYnV0ZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBuYW1lCi0gICAqICBmb28gdGhpcyBtZXRob2Qgd291bGQgcmV0dXJuIHsiQVRUUklCVVRFX05BTUUiLCAiZm9vIn0KLSAgICogIDwvcD4KLSAgICogIEBwYXJhbSBlcnJvcktleSB0aGUgZXJyb3Iga2V5IGdpdmVuIGJ5IHRoZSBYZXJjZXMgcGFyc2VyCi0gICAqICBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyB0aGUgYXJndW1lbnRzIHVzZWQgYnkgWGVyY2VzIHRvICJmaWxsIGluIHRoZSBibGFua3MiIG9mIHRoZWlyIG1lc3NhZ2VzCi0gICAqICBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHNxdWlnZ2xlIGluZm9ybWF0aW9uCi0gICAqICBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwudWkucmVjb25jaWxlLkRlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3IKLSAgICogIAotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGNyZWF0ZU1lc3NhZ2VJbmZvKFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgeyAKLSAgICBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSBudWxsOwotICAgIFN0cmluZyBuYW1lT3JWYWx1ZSA9IG51bGw7Ci0KLSAgICAvL1hNTCBFcnJvcnMKLSAgICBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5hIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5kIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5iIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQ09OVEVOVF9JTlZBTElEIikKLSAgICAgICAgfCBlcnJvcktleS5lcXVhbHMoIk1TR19DT05URU5UX0lOQ09NUExFVEUiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19SRVFVSVJFRF9BVFRSSUJVVEVfTk9UX1NQRUNJRklFRCIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS40IikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSBTVEFSVF9UQUc7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLXR5cGUuMy4xLjMiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneSA9IFRFWFQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4yLjMiKSkKLSAgICB7Ci0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtdHlwZS4zLjEuMSIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gQUxMX0FUVFJJQlVURVM7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjIuMiIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9OT1RfREVDTEFSRUQiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneSA9IEFUVFJJQlVURV9OQU1FOwotCSAgLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVuZGVybGluZQotCSAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWF0dHJpYnV0ZS4zIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX1ZBTFVFX05PVF9JTl9MSVNUIikpCi0gICAgewkKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSBBVFRSSUJVVEVfVkFMVUU7ICAKLQkJLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgbmFtZSBvZiB0aGUgQXR0cmlidXRlCi0gICAgCWlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1hdHRyaWJ1dGUuMyIpKQotICAgIAl7IG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzFdOwotICAgIAl9Ci0gICAgCWVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9WQUxVRV9OT1RfSU5fTElTVCIpKQotICAgIAl7CW5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzBdOwotICAgIAl9Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWVsdC40LjIiKSkKLSAgICB7CXNlbGVjdGlvblN0cmF0ZWd5PVZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFOwotCQkvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdlIHdhbnQgdG8gdW5lcmxpbmUKLSAgICAJbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07CQotICAgIH0KLSAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVudGl0eU5vdERlY2xhcmVkIikpCi0gICAgeyAgCXNlbGVjdGlvblN0cmF0ZWd5PVRFWFRfRU5USVRZX1JFRkVSRU5DRTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLy9XU0RMIEVycm9ycwotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9PVVRQVVQiKSB8fAotICAgICAgICAgICAgICAgZXJyb3JLZXkuZXF1YWxzKCJfTUVTU0FHRV9VTkRFRklORURfRk9SX0lOUFVUIikgfHwKLSAgICAgICAgICAgICAgIGVycm9yS2V5LmVxdWFscygiX01FU1NBR0VfVU5ERUZJTkVEX0ZPUl9GQVVMVCIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5PUFUVFJJQlVURV9WQUxVRTsKLSAgICAgIG5hbWVPclZhbHVlPSAibWVzc2FnZSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORyIpKQotICAgIHsKLSAgICAgIHNlbGVjdGlvblN0cmF0ZWd5PUFUVFJJQlVURV9WQUxVRTsKLSAgICAgIG5hbWVPclZhbHVlPSJ0eXBlIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJfT1BFUkFUSU9OX1VOREVGSU5FRF9GT1JfUE9SVFRZUEUiKSkKLSAgICB7Ci0gICAgICBzZWxlY3Rpb25TdHJhdGVneT1BVFRSSUJVVEVfVkFMVUU7Ci0gICAgICBuYW1lT3JWYWx1ZT0ibmFtZSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiX1BBUlRfSU5WQUxJRF9FTEVNRU5UIikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3k9QVRUUklCVVRFX1ZBTFVFOwotICAgICAgbmFtZU9yVmFsdWU9ImVsZW1lbnQiOwotICAgIH0KLSAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIl9OT19CSU5ESU5HX0ZPUl9QT1JUIikpCi0gICAgewotICAgICAgc2VsZWN0aW9uU3RyYXRlZ3k9QVRUUklCVVRFX1ZBTFVFOwotICAgICAgbmFtZU9yVmFsdWU9ImJpbmRpbmciOwotICAgIH0KLSAgICAKLSAgICBTdHJpbmcgbWVzc2FnZUluZm9bXSA9IG5ldyBTdHJpbmdbMl07Ci0gICAgbWVzc2FnZUluZm9bMF0gPSBzZWxlY3Rpb25TdHJhdGVneTsKLSAgICBtZXNzYWdlSW5mb1sxXSA9IG5hbWVPclZhbHVlOwotICAgIHJldHVybiBtZXNzYWdlSW5mbzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkMDVkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hLS0gQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotIS0tIFdhcm5pbmcgTWVzc2FnZXMKLV9XQVJOX05PX1ZBTERJQVRPUiAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgdmFsaWRhdG9yIGZvciB0aGUgbmFtZXNwYWNlIHswfS4KLQotX0VSUk9SX1BST0JMRU1fV1NETF9WQUxJREFUT1IgICAgICAgICAgICAgID0gQSBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIFdTREwgdmFsaWRhdG9yIGZvciBuYW1lc3BhY2UgezB9LgotX0VSUk9SX05PX1dTRExfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgID0gVGhlIG5hbWVzcGFjZSB7MH0gc3BlY2lmaWVkIGlzIG5vdCBhIHZhbGlkIFdTREwgbmFtZXNwYWNlLgotX0VSUk9SX1BST0JMRU1fRVhUX1ZBTElEQVRPUiAgICAgICAgICAgICAgID0gQSBwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIEV4dGVuc2lvbiB2YWxpZGF0b3IgezB9IGZvciBuYW1lc3BhY2UgezF9LgotCi0hLS0gU3RyaW5ncyBmb3IgV1NETCAxLjEgdmFsaWRhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1fVU5BQkxFX1RPX0lNUE9SVF9CQURfTE9DQVRJT04gICAgICAgICAgICAgPSBUaGUgezB9IGRvY3VtZW50IGNvdWxkIG5vdCBiZSBpbXBvcnRlZC4gQ2hlY2sgdGhhdCB0aGUgZG9jdW1lbnQgZXhpc3RzIGFuZCB0aGF0IHRoZSBsb2NhdGlvbiBpcyBjb3JyZWN0LgotX1VOQUJMRV9UT19JTVBPUlRfTk9fTE9DQVRJT04gICAgICAgICAgICAgID0gVGhlIGxvY2F0aW9uIGF0dHJpYnV0ZSBpcyBlbXB0eS4gQSBsb2NhdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIGxvY2F0aW9uIGF0dHJpYnV0ZS4KLV9VTkFCTEVfVE9fSU1QT1JUX0lOVkFMSUQgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gZG9jdW1lbnQgY291bGQgbm90IGJlIGltcG9ydGVkIGJlY2F1c2UgaXQgaXMgbm90IHZhbGlkLiBUaGUgZG9jdW1lbnQgbXVzdCBiZSBjb3JyZWN0ZWQgYmVmb3JlIGl0IGNhbiBiZSBpbXBvcnRlZC4KLV9OT19CSU5ESU5HX0ZPUl9QT1JUICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gcG9ydCBoYXMgYW4gaW52YWxpZCBiaW5kaW5nIC0gezF9LiBDaGVjayB0aGF0IHRoZSB7MX0gYmluZGluZyBpcyBkZWZpbmVkLgotX1BPUlRUWVBFX1VOREVGSU5FRF9GT1JfQklORElORyAgICAgICAgICAgID0gVGhlIHswfSBwb3J0IHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgezF9IGJpbmRpbmcgaXMgdW5kZWZpbmVkLiBDaGVjayB0aGUgezB9IHBvcnQgdHlwZSBuYW1lIGFuZCBlbnN1cmUgaXQgaXMgZGVmaW5lZC4KLV9PUEVSQVRJT05fVU5ERUZJTkVEX0ZPUl9QT1JUVFlQRSAgICAgICAgICA9IFRoZSBvcGVyYXRpb24gc3BlY2lmaWVkIGZvciB0aGUgezB9IGJpbmRpbmcgaXMgbm90IGRlZmluZWQgZm9yIHBvcnQgdHlwZSB7MX0uIEFsbCBvcGVyYXRpb25zIHNwZWNpZmllZCBpbiB0aGlzIGJpbmRpbmcgbXVzdCBiZSBkZWZpbmVkIGluIHBvcnQgdHlwZSB7MX0uCi1fSU5QVVRfTkFNRV9OT1RfVU5JUVVFICAgICAgICAgICAgICAgICAgICAgPSBUaGUgbmFtZSB7MH0gc3BlY2lmaWVkIGZvciB0aGlzIGlucHV0IGVsZW1lbnQgaXMgbm90IHVuaXF1ZS4gVGhlIG5hbWUgb2YgYW4gaW5wdXQgZWxlbWVudCBtdXN0IGJlIHVuaXF1ZSBmcm9tIHRoZSBuYW1lcyBvZiBhbGwgb3RoZXIgaW5wdXQgYW5kIG91dHB1dCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSB7MX0gcG9ydCB0eXBlLgotX09VVFBVVF9OQU1FX05PVF9VTklRVUUgICAgICAgICAgICAgICAgICAgID0gVGhlIG5hbWUgezB9IHNwZWNpZmllZCBmb3IgdGhpcyBvdXRwdXQgZWxlbWVudCBpcyBub3QgdW5pcXVlLiBUaGUgbmFtZSBvZiBhbiBvdXRwdXQgZWxlbWVudCBtdXN0IGJlIHVuaXF1ZSBmcm9tIHRoZSBuYW1lcyBvZiBhbGwgb3RoZXIgaW5wdXRzIGFuZCBvdXRwdXQgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgezF9IHBvcnQgdHlwZS4KLV9NRVNTQUdFX1VOREVGSU5FRF9GT1JfSU5QVVQgICAgICAgICAgICAgICA9IFRoZSBpbnB1dCBlbGVtZW50IGlzIHJlZmVyZW5jaW5nIGFuIHVuZGVmaW5lZCBtZXNzYWdlIHswfS4gQ2hlY2sgdGhhdCB0aGUgbWVzc2FnZSBuYW1lIGFuZCBuYW1lc3BhY2UgYXJlIGNvcnJlY3QgYW5kIHRoYXQgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gZGVmaW5lZC4KLV9NRVNTQUdFX1VOREVGSU5FRF9GT1JfT1VUUFVUICAgICAgICAgICAgICA9IFRoZSBvdXRwdXQgZWxlbWVudCBpcyByZWZlcmVuY2luZyBhbiB1bmRlZmluZWQgbWVzc2FnZSB7MH0uIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgbmFtZSBhbmQgbmFtZXNwYWNlIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHRoZSBtZXNzYWdlIGhhcyBiZWVuIGRlZmluZWQuCi1fTUVTU0FHRV9VTkRFRklORURfRk9SX0ZBVUxUICAgICAgICAgICAgICAgPSBUaGUgZmF1bHQgZWxlbWVudCBpcyByZWZlcmVuY2luZyBhbiB1bmRlZmluZWQgbWVzc2FnZSB7MH0uIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgbmFtZSBhbmQgbmFtZXNwYWNlIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHRoZSBtZXNzYWdlIGhhcyBiZWVuIGRlZmluZWQuCi1fRFVQTElDQVRFX0ZBVUxUX05BTUUgICAgICAgICAgICAgICAgICAgICAgPSBBIGZhdWx0IHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBmb3IgdGhlIHsxfSAwcGVyYXRpb24uIENoZWNrIHRoYXQgZXZlcnkgZmF1bHQgZGVmaW5lZCBmb3IgdGhpcyBvcGVyYXRpb24gaGFzIGEgdW5pcXVlIG5hbWUuCi1fUEFSVF9OT19FTEVNRU5UX09SX1RZUEUgICAgICAgICAgICAgICAgICAgPSBUaGUgcGFydCB7MH0gZG9lcyBub3QgaGF2ZSBhIHR5cGUgZGVmaW5lZC4gRXZlcnkgcGFydCBtdXN0IHNwZWNpZnkgYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gVGhlIHR5cGUgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgYnVpbHQgaW4gImVsZW1lbnQiIG9yICJ0eXBlIiBhdHRyaWJ1dGVzIG9yIG1heSBiZSBzcGVjaWZpZWQgdXNpbmcgYW4gZXh0ZW5zaW9uIGF0dHJpYnV0ZS4KLV9QQVJUX0JPVEhfRUxFTUVOVF9BTkRfVFlQRSAgICAgICAgICAgICAgICA9IFRoZSBwYXJ0IHswfSBoYXMgYm90aCBhbiBlbGVtZW50IGFuZCBhIHR5cGUgZGVmaW5lZC4gRXZlcnkgcGFydCBtdXN0IG9ubHkgaGF2ZSBhbiBlbGVtZW50IG9yIGEgdHlwZSBkZWZpbmVkLgotX1BBUlRfSU5WQUxJRF9FTEVNRU5UICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHBhcnQgezB9IGhhcyBhbiBpbnZhbGlkIHZhbHVlIHsxfSBkZWZpbmVkIGZvciBpdHMgZWxlbWVudC4gRWxlbWVudCBkZWNsYXJhdGlvbnMgbXVzdCByZWZlciB0byB2YWxpZCB2YWx1ZXMgZGVmaW5lZCBpbiBhIHNjaGVtYS4KLV9QQVJUX0lOVkFMSURfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSBwYXJ0IHswfSBoYXMgYW4gaW52YWxpZCB2YWx1ZSB7MX0gZGVmaW5lZCBmb3IgaXRzIHR5cGUuIFR5cGUgZGVjbGFyYXRpb25zIG11c3QgcmVmZXIgdG8gdmFsaWQgdmFsdWVzIGRlZmluZWQgaW4gYSBzY2hlbWEuCi1fRFVQTElDQVRFX09QRVJBVElPTl9GT1JfUE9SVFRZUEUgICAgICAgICAgPSBBbiBvcGVyYXRpb24gd2l0aCB0aGUgbmFtZSB7MH0gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGZvciB0aGUgezF9IHBvcnQgdHlwZS4gRXZlcnkgb3BlcmF0aW9uIGRlZmluZWQgZm9yIGEgcG9ydCB0eXBlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLiAKLV9TRVJWSUNFX05BTUVfQUxSRUFEWV9ERUZJTkVEICAgICAgICAgICAgICA9IEEgU2VydmljZSB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIEV2ZXJ5IHNlcnZpY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuCi1fQklORElOR19OQU1FX0FMUkVBRFlfREVGSU5FRCAgICAgICAgICAgICAgPSBBIGJpbmRpbmcgd2l0aCB0aGUgbmFtZSB7MH0gaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLiBFdmVyeSBiaW5kaW5nIGluIHRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLgotX01FU1NBR0VfTkFNRV9BTFJFQURZX0RFRklORUQgICAgICAgICAgICAgID0gQSBtZXNzYWdlIHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gRXZlcnkgbWVzc2FnZSBpbiB0aGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZS4KLV9QT1JUVFlQRV9OQU1FX0FMUkVBRFlfREVGSU5FRCAgICAgICAgICAgICA9IEEgcG9ydCB0eXBlIHdpdGggdGhlIG5hbWUgezB9IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4gRXZlcnkgcG9ydCB0eXBlIGluIHRoZSBXU0RMIGRvY3VtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLgotX01PUkVfVEhFTl9PTkVfQUREUkVTU19QT1JUICAgICAgICAgICAgICAgID0gQW4gYWRkcmVzcyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgZm9yIHBvcnQgezB9LiBFYWNoIHBvcnQgY2FuIGhhdmUgb25seSBvbmUgYWRkcmVzcyBkZWZpbmVkLgotX05PX0FERFJFU1NfUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHBvcnQgezB9IGhhcyBubyBhZGRyZXNzIGRlZmluZWQuIEVhY2ggcG9ydCBtdXN0IGRlZmluZSBvbmUgYWRkcmVzcy4KLV9QT1JUX05BTUVfTk9UX1VOSVFVRSAgICAgICAgICAgICAgICAgICAgICA9IEEgcG9ydCB3aXRoIHRoZSBuYW1lIHswfSBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIEV2ZXJ5IHBvcnQgaW4gdGhlIFdTREwgZG9jdW1lbnQgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuCi1fT1BFUkFUSU9OX05PX0lOUFVUX09SX09VVFBVVCAgICAgICAgICAgICAgPSBObyBpbnB1dCBvciBvdXRwdXQgZWxlbWVudCBoYXMgYmVlbiBkZWZpbmVkIGZvciB0aGUgezB9IG9wZXJhdGlvbi4gQW4gaW5wdXQgZWxlbWVudCwgYW4gb3V0cHV0IGVsZW1lbnQsIG9yIGJvdGggbXVzdCBiZSBkZWZpbmVkIGZvciBldmVyeSBvcGVyYXRpb24uCi1fV0FSTl9TT0FQRU5DX0lNUE9SVEVEX1BBUlQgICAgICAgICAgICAgICAgPSBUaGUgcGFydCB7MH0gdXNlcyBhbiBlbGVtZW50IG9yIHR5cGUgZnJvbSB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgYnV0IHRoZSBuYW1lc3BhY2UgaGFzIG5vdCBiZWVuIGltcG9ydGVkLiBUaGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2Ugc2hvdWxkIGJlIGltcG9ydGVkIHdpdGggYW4gaW1wb3J0IHN0YXRlbWVudCBiZWZvcmUgaXQgaXMgdXNlZC4KLV9XQVJOX1NPQVBFTkNfSU1QT1JURURfU0NIRU1BICAgICAgICAgICAgICA9IFRoZSBpbmxpbmUgc2NoZW1hIHVzZXMgYW4gZWxlbWVudCBvciB0eXBlIGZyb20gdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGJ1dCB0aGUgbmFtZXNwYWNlIGhhcyBub3QgYmVlbiBpbXBvcnRlZC4gVGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIHNob3VsZCBiZSBpbXBvcnRlZCB3aXRoIGFuIGltcG9ydCBzdGF0ZW1lbnQgYmVmb3JlIGl0IGlzIHVzZWQuCi1fUkVGRVJFTkNFRF9GSUxFX0NPTlRBSU5TX0VSUk9SUyAgICAgICAgICAgPSBSZWZlcmVuY2VkIGZpbGUgY29udGFpbnMgZXJyb3JzICh7MH0pLgotX1dBUk5fT0xEX1NDSEVNQV9OQU1FU1BBQ0UgICAgICAgICAgICAgICAgID0gQW4gb2xkIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBuYW1lc3BhY2UgaGFzIGJlZW4gc3BlY2lmaWVkLiB7MH0gaXMgdGhlIHNjaGVtYSBuYW1lc3BhY2UgdGhhdCBzaG91bGQgYmUgdXNlZC4KLV9FUlJPUl9NVUxUSVBMRV9UWVBFU19ERUZJTkVEICAgICAgICAgICAgICA9IEEgdHlwZXMgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIE9ubHkgb25lIHR5cGVzIGVsZW1lbnQgaXMgYWxsb3dlZC4KLV9XQVJOX1dST05HX05TX09OX0lNUE9SVCAgICAgICAgICAgICAgICAgICA9IFRoZSBmaWxlIGNhbm5vdCBiZSBpbXBvcnRlZCBiZWNhdXNlIHRoZSBuYW1lc3BhY2UgezB9IGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgbmFtZXNwYWNlIHsxfSBvZiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQuCi0hLS0gUmVmZXJlbmNlZCBmaWxlIGVycm9yCi0hLS0gTm90ZSB0byB0cmFuc2xhdG9yIC0gX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgbmVlZHMgYSB0cmFpbGluZyBzcGFjZSBhcyBhbm90aGVyIG1lc3NhZ2UgbWF5IGZvbGxvdy4KLV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxodHRwLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxodHRwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlN2FmZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsaHR0cC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotX0VSUk9SX05PX0xPQ0FUSU9OX0ZPUl9BRERSRVNTICAgICAgICAgICAgICAgICAgID0gTm8gbG9jYXRpb24gaGFzIGJlZW4gc3BlY2lmaWVkIGZvciB0aGlzIGFkZHJlc3MuIEV2ZXJ5IGFkZHJlc3MgbXVzdCBoYXZlIGEgdmFsaWQgbG9jYXRpb24gc3BlY2lmaWVkLgotX0VSUk9SX0lOVkFMSURfUE9SVF9FTEVNRU5UICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBIVFRQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudCBpcyAiYWRkcmVzcyIuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIEhUVFAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICJiaW5kaW5nIi4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfT1BFUkFUSU9OX0VMRU1FTlQgICAgICAgICA9IFRoZSB7MH0gZWxlbWVudCBkZWZpbmVkIGhlcmUgaXMgdW5kZWZpbmVkIGZvciB0aGUgSFRUUCBuYW1lc3BhY2UuIFRoZSBvbmx5IHZhbGlkIGVsZW1lbnQgaXMgIm9wZXJhdGlvbiIuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX0lOUFVUX0VMRU1FTlQgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIEhUVFAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50cyBhcmUgInVybFJlcGxhY2VtZW50IiBhbmQgInVybEVuY29kZWQiLgotX0VSUk9SX0lOVkFMSURfSFRUUF9FTEVNRU5UX0ZPUl9MT0NBVElPTiAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGNhbm5vdCBiZSBzcGVjaWZpZWQgaGVyZS4gVGhpcyBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIHRoZSBIVFRQIG5hbWVzcGFjZSBmb3IgdXNlIGF0IHRoaXMgcG9pbnQuCi1fRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX0FERFJFU1MgICAgICAgICAgICAgICAgPSBBbiBIVFRQIGFkZHJlc3MgY2Fubm90IGJlIHNwZWNpZmllZCBoZXJlIGFzIHRoZSB7MH0gYmluZGluZyB0aGF0IHRoZSB7MX0gcG9ydCByZWZlcnMgdG8gZG9lcyBub3QgaGF2ZSBhbiBIVFRQIGJpbmRpbmcgZWxlbWVudCBkZWZpbmVkLiBUaGVyZSBtdXN0IGJlIGFuIEhUVFAgYmluZGluZyBlbGVtZW50IGRlZmluZWQgaW4gb3JkZXIgdG8gc3BlY2lmeSBhbiBIVFRQIGFkZHJlc3MgZm9yIGEgYmluZGluZy4KLV9FUlJPUl9JTlZBTElEX0JJTkRJTkdfVkVSQiAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gdmVyYiBkZWZpbmVkIGZvciB0aGUgSFRUUCBiaW5kaW5nIGlzIGludmFsaWQuIFRoZSBIVFRQIGJpbmRpbmcgdmVyYiBtdXN0IGJlICJHRVQiIG9yICJQT1NUIiBhbmQgaXMgY2FzZSBzZW5zaXRpdmUuCi1fRVJST1JfSU5WQUxJRF9MT0NBVElPTl9VUkkgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgbG9jYXRpb24gVVJJIGlzIGludmFsaWQgZm9yIHRoZSBIVFRQIG9wZXJhdGlvbi4gWW91IG11c3Qgc3BlY2lmeSBhIHZhbGlkIGxvY2F0aW9uIFVSSSBmb3IgZXZlcnkgSFRUUCBPcGVyYXRpb24uCi1fRVJST1JfTk9fSFRUUEJJTkRJTkdfRk9SX09QRVJBVElPTiAgICAgICAgICAgICAgPSBUaGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgSFRUUCBvcGVyYXRpb24gaXMgc3BlY2lmaWVkIGZvciBkb2VzIG5vdCBoYXZlIGFuIEhUVFAgYmluZGluZyBkZWZpbmVkLiBBbiBIVFRQIGJpbmRpbmcgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvIGRlZmluZSBhbiBIVFRQIG9wZXJhdGlvbiBoZXJlLgotX0VSUk9SX05PX0hUVFBPUEVSQVRJT05fRk9SX1VSTCAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBvcGVyYXRpb24gdGhhdCB0aGUgezF9IEhUVFAgZWxlbWVudCBpcyBzcGVjaWZpZWQgZm9yIGRvZXMgbm90IGhhdmUgYW4gSFRUUCBvcGVyYXRpb24gZGVmaW5lZC4gQSBIVFRQIG9wZXJhdGlvbiBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZGVmaW5lIGEgezF9IEhUVFAgZWxlbWVudCBoZXJlLgotX0VSUk9SX05PVF9PTkxZX0VMRU1FTlRfREVGSU5FRCAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBIVFRQIGVsZW1lbnQgZGVmaW5lZCBpcyBub3QgdGhlIG9ubHkgZWxlbWVudCBkZWZpbmVkIGZvciB0aGUgaW5wdXQgZWxlbWVudC4gV2hlbiB7MH0gaXMgZGVmaW5lZCBpdCBtdXN0IGJlIHRoZSBvbmx5IGNoaWxkIGVsZW1lbnQgZGVmaW5lZCBmb3IgdGhlIGlucHV0IGVsZW1lbnQuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxtaW1lLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxtaW1lLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzM2U3YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2RsbWltZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxzb2FwLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZS92YWxpZGF0ZXdzZGxzb2FwLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMmI5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGUvdmFsaWRhdGV3c2Rsc29hcC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1fRVJST1JfTk9fTE9DQVRJT05fRk9SX0FERFJFU1MgICAgICAgICAgICAgICAgICAgPSBObyBsb2NhdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIHRoaXMgYWRkcmVzcy4gRXZlcnkgYWRkcmVzcyBtdXN0IGhhdmUgYSB2YWxpZCBsb2NhdGlvbiBzcGVjaWZpZWQuCi1fRVJST1JfSU5WQUxJRF9QT1JUX0VMRU1FTlQgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBTT0FQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudCBpcyAiYWRkcmVzcyIuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX1NUWUxFICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IHN0eWxlIGRlZmluZWQgZm9yIHRoZSBTT0FQIGJpbmRpbmcgaW4gaW52YWxpZC4gVGhlIFNPQVAgYmluZGluZyBzdHlsZSBtdXN0IGJlICJycGMiIG9yICJkb2N1bWVudCIuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX1VSSSAgICAgICAgICAgICAgICAgICAgICAgPSBUaGUgdHJhbnNwb3J0IFVSSSBoYXMgbm90IGJlZW4gZGVmaW5lZCBmb3IgdGhlIFNPQVAgYmluZGluZy4gWW91IG11c3Qgc3BlY2lmeSBhIHRyYW5zcG9ydCBVUkkgZm9yIGV2ZXJ5IFNPQVAgYmluZGluZy4KLV9FUlJPUl9JTlZBTElEX09QRVJBVElPTl9TVFlMRSAgICAgICAgICAgICAgICAgICA9IFRoZSBzdHlsZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIG9wZXJhdGlvbiBpcyBpbnZhbGlkLiBUaGUgU09BUCBvcGVyYXRpb24gc3R5bGUgbXVzdCBiZSAicnBjIiBvciAiZG9jdW1lbnQiLgotX0VSUk9SX0lOVkFMSURfQklORElOR19FTEVNRU5UICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBTT0FQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudCBpcyAiYmluZGluZyIuCi1fRVJST1JfSU5WQUxJRF9CSU5ESU5HX09QRVJBVElPTl9FTEVNRU5UICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICJvcGVyYXRpb24iLgotX0VSUk9SX0lOVkFMSURfSEVBREVSX0JPRFlfRUxFTUVOVCAgICAgICAgICAgICAgID0gVGhlIHswfSBlbGVtZW50IGRlZmluZWQgaGVyZSBpcyB1bmRlZmluZWQgZm9yIHRoZSBTT0FQIG5hbWVzcGFjZS4gVGhlIG9ubHkgdmFsaWQgZWxlbWVudHMgYXJlICJib2R5IiwgImhlYWRlciIgYW5kICJoZWFkZXJmYXVsdCIuCi1fRVJST1JfSU5WQUxJRF9GQVVMVF9FTEVNRU5UICAgICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgZGVmaW5lZCBoZXJlIGlzIHVuZGVmaW5lZCBmb3IgdGhlIFNPQVAgbmFtZXNwYWNlLiBUaGUgb25seSB2YWxpZCBlbGVtZW50IGlzICJmYXVsdCIuCi0KLSEtLSBBIFNPQVAgYm9keSBlbGVtZW50IGluIGEgV1NETCBkb2N1bWVudCBjYW4gaGF2ZSBhbiBhdHRyaWJ1dGUgInVzZSIgZGVmaW5lZCB0byBiZSBlaXRoZXIgbGl0ZXJhbCBvciBlbmNvZGVkLiAtLQotIS0tIFRoaXMgc3RyaW5nIGlzIHVzZWQgaW4gYW4gZXJyb3IgdGFzayBpbiBXU0FEIGlmIHRoZSBkb2N1bWVudCBzcGVjaWZpZXMgYSB1c2Ugb3RoZXIgdGhlbiBsaXRlcmFsIG9yIGVuY29kZWQuIC0tIAotIS0tIEZvciBleGFtcGxlLCBpZiB0aGUgZG9jdW1lbnQgc3BlY2lmaWVzIHRoZSB1c2Ugb2YgdGhlIFNPQVAgYm9keSBhcyAic2ltcGxlIiB0aGUgb3V0cHV0IHN0cmluZyBzaG91bGQgYmU6ICAgIC0tCi0hLS0gVGhlICdzaW1wbGUnIHVzZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGJvZHkgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIGxpdGVyYWwgb3IgZW5jb2RlZC4gICAgICAgICAgICAgICAgLS0KLV9FUlJPUl9JTlZBTElEX0JPRFlfVVNFICAgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gdXNlIHNwZWNpZmllZCBmb3IgdGhlIFNPQVAgYm9keSBpcyBpbnZhbGlkLiBUaGUgdXNlIG11c3QgYmUgbGl0ZXJhbCBvciBlbmNvZGVkLgotX0VSUk9SX0lOVkFMSURfQk9EWV9FTkNPRElOR19TVFlMRSAgICAgICAgICAgICAgID0gVGhlcmUgaXMgbm8gZW5jb2Rpbmcgc3R5bGUgVVJJIGRlZmluZWQgZm9yIHRoZSBTT0FQIGJvZHkuIFlvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIFVSSSBmb3IgdGhlIGVuY29kaW5nIHN0eWxlIHdoZW4gdGhlIHVzZSBpcyBlbmNvZGVkLgotX0VSUk9SX0lOVkFMSURfQk9EWV9QQVJUX1VOREVGSU5FRCAgICAgICAgICAgICAgID0gVGhlIHswfSBwYXJ0IHNwZWNpZmllZCBhcyBhIHBhcnQgZm9yIHRoZSBTT0FQIGJvZHkgaXMgdW5kZWZpbmVkLiAgWW91IGNhbiBvbmx5IHNwZWNpZnkgZGVmaW5lZCBwYXJ0cy4KLV9FUlJPUl9JTlZBTElEX0JPRFlfUEFSVF9OT1RfVFlQRSAgICAgICAgICAgICAgICA9IFRoZSB7MH0gcGFydCBkb2VzIG5vdCBoYXZlIGEgdHlwZSBkZWZpbmVkIGFuZCBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGEgU09BUCBib2R5IHdpdGggaXRzIHVzZSBlbmNvZGVkLiBXaGVuIHVzZSBpcyBlbmNvZGVkIG9uIGEgU09BUCBib2R5LCBhbGwgcGFydHMgZGVmaW5lZCBtdXN0IG9ubHkgY29udGFpbiBhIHZhbGlkIHR5cGUuCi1fRVJST1JfSU5WQUxJRF9TT0FQX0VMRU1FTlRfRk9SX0xPQ0FUSU9OICAgICAgICAgPSBUaGUgezB9IGVsZW1lbnQgY2Fubm90IGJlIHNwZWNpZmllZCBoZXJlLiBUaGlzIGVsZW1lbnQgaXMgbm90IGRlZmluZWQgaW4gdGhlIFNPQVAgbmFtZXNwYWNlIGZvciB1c2UgYXQgdGhpcyBwb2ludC4KLV9FUlJPUl9OT19TT0FQQklORElOR19GT1JfQUREUkVTUyAgICAgICAgICAgICAgICA9IEEgU09BUCBhZGRyZXNzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaGVyZSBhcyB0aGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgezF9IHBvcnQgcmVmZXJzIHRvIGRvZXMgbm90IGhhdmUgYSBTT0FQIGJpbmRpbmcgZWxlbWVudCBkZWZpbmVkLiBUaGVyZSBtdXN0IGJlIGEgU09BUCBiaW5kaW5nIGVsZW1lbnQgZGVmaW5lZCBpbiBvcmRlciB0byBzcGVjaWZ5IGEgU09BUCBhZGRyZXNzIGZvciBhIGJpbmRpbmcuCi1fRVJST1JfSEVBREVSX01FU1NBR0VfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgPSBUaGUgezB9IG1lc3NhZ2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgdW5kZWZpbmVkLiBUaGUgbWVzc2FnZSBzcGVjaWZpZWQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBXU0RMIGRvY3VtZW50LgotX0VSUk9SX0hFQURFUl9QQVJUX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBwYXJ0IHNwZWNpZmllZCBpbiBtZXNzYWdlIHsxfSBmb3IgdGhlIFNPQVAgaGVhZGVyIGlzIHVuZGVmaW5lZC4gRW5zdXJlIHRoZSBwYXJ0IGlzIGRlZmluZWQgaW4gdGhlIHsxfSBtZXNzYWdlLgotX0VSUk9SX0hFQURFUl9VU0VfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSB1c2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBsaXRlcmFsIG9yIGVuY29kZWQuCi1fRVJST1JfSEVBREVSX0VOQ09ESU5HU1RZTEVfVU5ERUZJTkVEICAgICAgICAgICAgPSBUaGUgZW5jb2Rpbmcgc3R5bGUgZm9yIHRoZSBTT0FQIGhlYWRlciBpcyBub3Qgc3BlY2lmaWVkLiBXaGVuIHRoZSB1c2UgaXMgZW5jb2RlZCB0aGUgZW5jb2Rpbmcgc3R5bGUgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBVUkkuCi1fRVJST1JfSEVBREVSX05BTUVTUEFDRV9VTkRFRklORUQgICAgICAgICAgICAgICAgPSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgU09BUCBoZWFkZXIgaXMgbm90IHNwZWNpZmllZC4gV2hlbiB0aGUgdXNlIGlzIGVuY29kZWQgYSBuYW1lc3BhY2UgVVJJIG11c3QgYmUgZGVmaW5lZC4KLV9FUlJPUl9IRUFERVJGQVVMVF9NRVNTQUdFX1VOREVGSU5FRCAgICAgICAgICAgICA9IFRoZSB7MH0gbWVzc2FnZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyB1bmRlZmluZWQuIFRoZSBtZXNzYWdlIHNwZWNpZmllZCBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQuCi1fRVJST1JfSEVBREVSRkFVTFRfUEFSVF9VTkRFRklORUQgICAgICAgICAgICAgICAgPSBUaGUgezB9IHBhcnQgc3BlY2lmaWVkIGluIG1lc3NhZ2UgezF9IGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgdW5kZWZpbmVkLiBFbnN1cmUgdGhlIHBhcnQgaXMgZGVmaW5lZCBpbiB0aGUgezF9IG1lc3NhZ2UuIAotX0VSUk9SX0hFQURFUkZBVUxUX1VTRV9VTkRFRklORUQgICAgICAgICAgICAgICAgID0gVGhlIHswfSB1c2Ugc3BlY2lmaWVkIGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgaW52YWxpZC4gVGhlIHVzZSBtdXN0IGJlIHNwZWNpZmllZCBhcyBsaXRlcmFsIG9yIGVuY29kZWQuCi1fRVJST1JfSEVBREVSRkFVTFRfRU5DT0RJTkdTVFlMRV9VTkRFRklORUQgICAgICAgPSBUaGUgZW5jb2Rpbmcgc3R5bGUgZm9yIHRoZSBTT0FQIGhlYWRlciBmYXVsdCBpcyBub3Qgc3BlY2lmaWVkLiBXaGVuIHRoZSB1c2UgaXMgZW5jb2RlZCB0aGUgZW5jb2Rpbmcgc3R5bGUgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBVUkkuCi1fRVJST1JfSEVBREVSRkFVTFRfTkFNRVNQQUNFX1VOREVGSU5FRCAgICAgICAgICAgPSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgU09BUCBoZWFkZXIgZmF1bHQgaXMgbm90IHNwZWNpZmllZC4gV2hlbiB0aGUgdXNlIGlzIGVuY29kZWQgYSBuYW1lc3BhY2UgVVJJIG11c3QgYmUgZGVmaW5lZC4KLV9FUlJPUl9JTlZBTElEX0ZBVUxUX05BTUUgICAgICAgICAgICAgICAgICAgICAgICA9IFRoZSB7MH0gbmFtZSBzcGVjaWZpZWQgZm9yIHRoZSBTT0FQIGZhdWx0IGlzIGludmFsaWQuIFRoZSBuYW1lIHNwZWNpZmllZCBtdXN0IGJlIHsxfSwgdGhlIG5hbWUgZnJvbSB0aGUgZmF1bHQgcGFyZW50IGVsZW1lbnQuCi1fRVJST1JfTk9fU09BUEJJTkRJTkdfRk9SX09QRVJBVElPTiAgICAgICAgICAgICAgPSBUaGUgezB9IGJpbmRpbmcgdGhhdCB0aGUgU09BUCBvcGVyYXRpb24gaXMgc3BlY2lmaWVkIGZvciBkb2VzIG5vdCBoYXZlIGEgU09BUCBiaW5kaW5nIGRlZmluZWQuIEEgU09BUCBiaW5kaW5nIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byBkZWZpbmUgYSBTT0FQIG9wZXJhdGlvbiBoZXJlLgotX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9CT0RZICAgICAgICAgICAgICAgICAgID0gVGhlIHswfSBiaW5kaW5nIHRoYXQgdGhlIFNPQVAgYm9keSBpcyBzcGVjaWZpZWQgZm9yIGRvZXMgbm90IGhhdmUgYSBTT0FQIGJpbmRpbmcgZGVmaW5lZC4gQSBTT0FQIGJpbmRpbmcgbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvIGRlZmluZSBhIFNPQVAgYm9keSBoZXJlLgotX0VSUk9SX05PX1NPQVBCSU5ESU5HX0ZPUl9IRUFERVIgICAgICAgICAgICAgICAgID0gVGhlIHswfSBiaW5kaW5nIHRoYXQgdGhlIFNPQVAgaGVhZGVyIGlzIHNwZWNpZmllZCBmb3IgZG9lcyBub3QgaGF2ZSBhIFNPQVAgYmluZGluZyBkZWZpbmVkLiBBIFNPQVAgYmluZGluZyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gZGVmaW5lIGEgU09BUCBoZWFkZXIgaGVyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L0V4dGVuc2lvblZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9FeHRlbnNpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5YWEyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L0V4dGVuc2lvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50OwotCi0vKioKLSAqIEFuIGV4dGVuc2lvbiBBbnQgV1NETCB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25WYWxpZGF0b3IKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLSAgcHJpdmF0ZSBTdHJpbmcgcmVzb3VyY2VidW5kbGUgPSBudWxsOwotICAKLSAgcHVibGljIHZvaWQgc2V0Q2xhc3MoU3RyaW5nIGNsYXNzbmFtZSkKLSAgewotICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5jbGFzc25hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIHJldHVybiB0aGlzLm5hbWVzcGFjZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoU3RyaW5nIHJlc291cmNlYnVuZGxlKQotICB7Ci0gICAgdGhpcy5yZXNvdXJjZWJ1bmRsZSA9IHJlc291cmNlYnVuZGxlOwotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlKCkKLSAgewotICAgIHJldHVybiB0aGlzLnJlc291cmNlYnVuZGxlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1VSSVJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1VSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNjYyMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9VUklSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLQotLyoqCi0gKiBUaGUgVVJJUmVzb2x2ZXIgdGFzayBhbGxvd3Mgc3BlY2lmeWluZyBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyIHdpdGgKLSAqIHRoZSBXU0RMVmFsaWRhdGUgQW50IHRhc2suCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlciBleHRlbmRzIFRhc2sKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgY2xhenogPSBudWxsOwotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICogCi0gICAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIFVSSSByZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhenopCi0gIHsKLSAgICB0aGlzLmNsYXp6ID0gY2xheno7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBleHRlbnNpb24gVVJJIHJlc29sdmVyLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotICB7Ci0gICAgcmV0dXJuIGNsYXp6OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1dTRExWYWxpZGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9XU0RMVmFsaWRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyNmE0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1dTRExWYWxpZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmFudDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EVERMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuV1NETFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyLlVSSVJlc29sdmVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExVmFsaWRhdG9yRGVsZWdhdGU7Ci0KLS8qKgotICogQW4gQW50IHRhc2sgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbiBhIGZpbGUgb3IgYSBzZXQgb2YgZmlsZXMuCi0gKiAKLSAqIE9wdGlvbnMKLSAqIC0gZmlsZSAtIHRoZSBmaWxlIHRvIHJ1biB2YWxpZGF0aW9uIG9uIChvcHRpb25hbCBpZiBmaWxlc2V0IGlzIHVzZWQpCi0gKiAtIGZhaWxvbmVycm9yIC0gZmFpbCB0aGUgYnVpbGQgcHJvY2VzcyBvbiB0aGUgZmlyc3QgZmlsZSB3aXRoIGFuIGVycm9yCi0gKiAtIHdzaWNvbXBsaWFuY2UgLSBob3cgdG8gcmVwb3J0IFdTLUkgZXJyb3JzIC0gUkVRVUlSRSwgU1VHR0VTVCwgSUdOT1JFIChkZWZhdWx0cyB0byBSRVFVSVJFKQotICogCi0gKiBTdXBwb3J0ZWQgTmVzdGVkIEVsZW1lbnRzCi0gKiAtIHhtbGNhdGFsb2cgLSBhbiB4bWwgY2F0YWxvZwotICogLSBkdGQgICAgICAgIC0gYSBkdGQgc3BlY2lmaWNhdGlvbiBhcyB3b3VsZCBhcHBlYXIgaW4gYW4geG1sY2F0YWxvZwotICogLSBzY2hlbWEgICAgIC0gYSBzY2hlbWEgc3BlY2lmaWNhdGlvbiBhcyB3b3VsZCBhcHBlYXIgaW4gYW4geG1sY2F0YWxvZwotICogLSBlbnRpdHkgICAgIC0gYW4gZW50aXR5IHNwZWNpZmljYXRpb24gYXMgd291bGQgYXBwZWFyIGluIGFuIHhtbGNhdGFsb2cKLSAqIC0gZmlsZXNldCAgICAtIGEgc2V0IG9mIGZpbGVzIHRvIHZhbGlkYXRlCi0gKiAtIHdzZGwxMXZhbGlkYXRvciAtIGFuIGV4dGVuc2lvbiBXU0RMIDEuMSB2YWxpZGF0b3IKLSAqIC0gdXJpcmVzb2x2ZXIgLSBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0ZSBleHRlbmRzIFRhc2sKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBVSV9QUk9QRVJUSUVTID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfUFJPUEVSVElFUyA9IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uc3RhbnRzLldTRExfVkFMSURBVE9SX1BST1BFUlRJRVNfRklMRTsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVJST1JfTk9fRklMRV9TUEVDSUZJRUQgPSAiX0VSUk9SX05PX0ZJTEVfU1BFQ0lGSUVEIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSID0gIl9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9BQ1RJT05fVkFMSURBVElOR19GSUxFID0gIl9VSV9BQ1RJT05fVkFMSURBVElOR19GSUxFIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfVUlfRVJST1JfTUFSS0VSID0gIl9VSV9FUlJPUl9NQVJLRVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9XQVJOSU5HX01BUktFUiA9ICJfVUlfV0FSTklOR19NQVJLRVIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9WQUxJRCA9ICJfVUlfVkFMSUQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9VSV9JTlZBTElEID0gIl9VSV9JTlZBTElEIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBfRVhDX1VOQUJMRV9UT19WQUxJREFURV9GSUxFID0gIl9FWENfVU5BQkxFX1RPX1ZBTElEQVRFX0ZJTEUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FWENfV1NETF9GQUlMX09OX0VSUk9SID0gIl9FWENfV1NETF9GQUlMX09OX0VSUk9SIjsKLSAgCi0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vLyI7Ci0KLSAgLy8gR2xvYmFsIFZhcnMKLSAgcHJvdGVjdGVkIExpc3QgZmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBQYXRoIGNsYXNzcGF0aDsKLSAgcHJvdGVjdGVkIFN0cmluZyB4c2REaXJlY3RvcnkgPSBudWxsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBmYWlsT25FcnJvciA9IGZhbHNlOwotICBwcm90ZWN0ZWQgWE1MQ2F0YWxvZyBnbG9iYWxYTUxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2coKTsKLSAgcHJvdGVjdGVkIExpc3Qgd3NkbDExdmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIExpc3QgZXh0dmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgcHJvdGVjdGVkIExpc3QgZXh0VVJJUmVzb2x2ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIC8qKgotICAgKiBDb25zdHVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0ZSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBUZWxscyB0aGUgV1NETCB2YWxpZGF0ZSB0YXNrIHRvIGZhaWwgdGhlIGJ1aWxkIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGZhaWxPbkVycm9yIFdoZXRoZXIgdG8gZmFpbCBvbiBlcnJvciBvciBub3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxPbkVycm9yKQotICB7Ci0gICAgdGhpcy5mYWlsT25FcnJvciA9IGZhaWxPbkVycm9yOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBiYXNlIHNjaGVtYSBmaWxlcyBmb3IgdGhlIGNhdGFsb2cgYXJlIGxvY2F0ZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZGlyIC0gdGhlIGRpcmVjdG9yeSBvZiB0aGUgYmFzZSBzY2hlbWEgZmlsZXMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNjaGVtYURpcihTdHJpbmcgZGlyKQotICB7Ci0gICAgeHNkRGlyZWN0b3J5ID0gZGlyOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhIGZpbGUgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIC0gYSBmaWxlIHRvIHJ1biB2YWxpZGF0aW9uIG9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlKQotICB7Ci0gICAgdGhpcy5maWxlID0gZmlsZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBzZXQgb2YgZmlsZXMgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbi4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIEZpbGVTZXQgb2YgZmlsZXMgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbgotICAgKi8KLSAgcHVibGljIEZpbGVTZXQgY3JlYXRlRmlsZXNldCgpCi0gIHsKLSAgICBGaWxlU2V0IGZpbGVzZXQgPSBuZXcgRmlsZVNldCgpOwotICAgIGZpbGVzZXRzLmFkZChmaWxlc2V0KTsKLSAgICByZXR1cm4gZmlsZXNldDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYW4gWE1MIGNhdGFsb2cgdG8gdGhlIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBjYXRhbG9nIC0gdGhlIGNhdGFsb2cgdG8gYWRkIHRvIHRoZSB2YWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRYTUxDYXRhbG9nKFhNTENhdGFsb2cgY2F0YWxvZykKLSAgewotICAgIGdsb2JhbFhNTENhdGFsb2cuYWRkQ29uZmlndXJlZFhNTENhdGFsb2coY2F0YWxvZyk7Ci0gIH0KLSAgLyoqCi0gICAqIEFkZCBhbiBleHRlbnNpb24gdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGV4dFZhbCBUaGUgZXh0ZW5zaW9uIHZhbGlkYXRvciB0byBhZGQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkRXh0ZW5zaW9uVmFsaWRhdG9yKEV4dGVuc2lvblZhbGlkYXRvciBleHRWYWwpCi0gIHsKLSAgICBleHR2YWxpZGF0b3JzLmFkZChleHRWYWwpOwotICB9Ci0gIC8qKgotICAgKiBBZGQgYW4gZXh0ZW5zaW9uIFdTREwgMS4xIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBleHRWYWwgVGhlIGV4dGVuc2lvbiBXU0RMIDEuMSB2YWxpZGF0b3IgdG8gYWRkLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFdTREwxMVZhbGlkYXRvcihFeHRlbnNpb25WYWxpZGF0b3IgZXh0VmFsKQotICB7Ci0gICAgd3NkbDExdmFsaWRhdG9ycy5hZGQoZXh0VmFsKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbGxvdyBzcGVjaWZpY2F0aW9uIG9mIGFuIGVudGl0eSBvdXRzaWRlIG9mIGFuIFhNTENhdGFsb2cuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgRFRETG9jYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGVudGl0eQotICAgKiovCi0gIHB1YmxpYyBEVERMb2NhdGlvbiBjcmVhdGVFbnRpdHkoKQotICB7Ci0gICAgRFRETG9jYXRpb24gZHRkTG9jID0gbmV3IERURExvY2F0aW9uKCk7Ci0gICAgZ2xvYmFsWE1MQ2F0YWxvZy5hZGRFbnRpdHkoZHRkTG9jKTsKLSAgICByZXR1cm4gZHRkTG9jOwotICB9Ci0KLSAgLyoqCi0gICAqIEFsbG93IHNwZWNpZmljYXRpb24gb2YgYSBEVEQgb3V0c2lkZSBvZiBhbiBYTUxDYXRhbG9nLgotICAgKiAKLSAgICogQHJldHVybiBhIERURExvY2F0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBEVEQKLSAgICoqLwotICBwdWJsaWMgRFRETG9jYXRpb24gY3JlYXRlRFREKCkKLSAgewotICAgIERURExvY2F0aW9uIGR0ZExvYyA9IG5ldyBEVERMb2NhdGlvbigpOwotICAgIGdsb2JhbFhNTENhdGFsb2cuYWRkRW50aXR5KGR0ZExvYyk7Ci0gICAgcmV0dXJuIGR0ZExvYzsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIFVSSVJlc29sdmVyIGV4dGVuc2lvbi4KLSAgICogCi0gICAqIEByZXR1cm4gQSBVUklSZXNvbHZlci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlciBjcmVhdGVVUklSZXNvbHZlcigpCi0gIHsKLSAgICBVUklSZXNvbHZlciB1cmlyZXMgPSBuZXcgVVJJUmVzb2x2ZXIoKTsKLSAgICBleHRVUklSZXNvbHZlcnMuYWRkKHVyaXJlcy5nZXRDbGFzc05hbWUoKSk7Ci0gICAgcmV0dXJuIHVyaXJlczsKLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgZmlsZXMgdG8gcnVuIFdTREwgdmFsaWRhdGlvbiBvbi4gVGFrZXMgdGhlIGZpbGUgYW5kIGZpbGVzZXQKLSAgICogYW5kIGNyZWF0ZXMgdGhlIGxpc3QuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHZhbGlkYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0RmlsZUxpc3QoKQotICB7Ci0gICAgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIGlmIGEgc3BlY2lmaWMgZmlsZSB3YXMgc3BlY2lmaWVkIGFkZCBpdCB0byB0aGUgbGlzdAotICAgIGlmIChmaWxlICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGZpbGUpOwotICAgICAgICBmaWxlcy5hZGQodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgfQotICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIEZpbGUgdGhlRmlsZSA9IG5ldyBGaWxlKGZpbGUpOwotICAgICAgICBpZighdGhlRmlsZS5pc0Fic29sdXRlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0aGVGaWxlID0gbmV3IEZpbGUoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGFic0ZpbGUgPSB0aGVGaWxlLnRvU3RyaW5nKCk7IAotICAgICAgICBpZighYWJzRmlsZS5zdGFydHNXaXRoKCJmaWxlOiIpKQotICAgICAgICB7Ci0gICAgICAgICAgYWJzRmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBhYnNGaWxlOwotICAgICAgICB9Ci0gICAgICAgIGFic0ZpbGUgPSBhYnNGaWxlLnJlcGxhY2UoJ1xcJywnLycpOwotICAgICAgICBmaWxlcy5hZGQoYWJzRmlsZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gZ28gdGhyb3VnaCBhbGwgZmlsZXNldHMgc3BlY2lmaWVkIGFuZCBhZGQgYWxsIHRoZSBmaWxlcyB0byB0aGUgbGlzdAotICAgIEl0ZXJhdG9yIGZzSXRlciA9IGZpbGVzZXRzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGZzSXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRmlsZVNldCBmaWxlc2V0ID0gKEZpbGVTZXQpZnNJdGVyLm5leHQoKTsKLSAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmaWxlc2V0LmdldERpcmVjdG9yeVNjYW5uZXIoZmlsZXNldC5nZXRQcm9qZWN0KCkpOwotICAgICAgU3RyaW5nIGJhc2VkaXIgPSBkcy5nZXRCYXNlZGlyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yOwotCi0gICAgICBTdHJpbmdbXSBmaWxlbGlzdCA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgIGludCBudW1GaWxlcyA9IGZpbGVsaXN0Lmxlbmd0aDsKLSAgICAgIGlmIChmaWxlcyAhPSBudWxsICYmIG51bUZpbGVzID4gMCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GaWxlczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGFic0ZpbGUgPSBGSUxFX1BST1RPQ09MICsgYmFzZWRpciArIGZpbGVsaXN0W2ldOwotICAgICAgICAgIGFic0ZpbGUgPSBhYnNGaWxlLnJlcGxhY2UoJ1xcJywnLycpOwotICAgICAgICAgIGZpbGVzLmFkZChhYnNGaWxlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmlsZXM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24KLSAgewotICAgIC8vIHRoZSByZXNvdXJjZSBidW5kbGVzIGZvciB0aGUgdWkgYW5kIHZhbGlkYXRvciBhcmUgbmVlZGVkCi0gICAgUmVzb3VyY2VCdW5kbGUgdmFsaWRhdG9yUkIgPSBudWxsOwotICAgIE1lc3NhZ2VHZW5lcmF0b3IgbWVzc0dlbiA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2VCdW5kbGUgdWlSQiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShVSV9QUk9QRVJUSUVTKTsKLSAgICAgIG1lc3NHZW4gPSBuZXcgTWVzc2FnZUdlbmVyYXRvcih1aVJCKTsKLSAgICAgIHZhbGlkYXRvclJCID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFZBTElEQVRPUl9QUk9QRVJUSUVTKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIGlmIHRoZSByZXNvdXJjZSBidW5kbGVzIGNhbid0IGJlIG9wZW5lZCB3ZSBjYW4ndCByZXBvcnQgZXJyb3Igc28gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBvcGVuIHJlc291cmNlIGJ1bmRsZS4gIiArIGUpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgWE1MIGNhdGFsb2cuCi0gICAgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MQ2F0YWxvZy5zZXRFeHRlbnNpb25YTUxDYXRhbG9nKFhNTENhdGFsb2dJbXBsLmNsYXNzLmdldE5hbWUoKSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICBYTUxDYXRhbG9nSW1wbCB4bWxDYXRhbG9nID0gKFhNTENhdGFsb2dJbXBsKW9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cuZ2V0RXh0ZW5zaW9uQ2F0YWxvZ0luc3RhbmNlKCk7Ci0gICAgeG1sQ2F0YWxvZy5hZGRYTUxDYXRhbG9nKGdsb2JhbFhNTENhdGFsb2cpOwotICAgIAotICAgIFdTRExWYWxpZGF0b3Igd3NkbFZhbGlkYXRvciA9IG5ldyBXU0RMVmFsaWRhdG9yKCk7Ci0gICAgCi0gICAgLy8gU2V0IHRoZSBleHRlbnNpb24gVVJJUmVzb2x2ZXJzLgotICAgIEl0ZXJhdG9yIHJlc29sdmVyc0l0ZXIgPSBleHRVUklSZXNvbHZlcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZShyZXNvbHZlcnNJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzb2x2ZXJDbGFzcyA9IChTdHJpbmcpcmVzb2x2ZXJzSXRlci5uZXh0KCk7Ci0gICAgICB3c2RsVmFsaWRhdG9yLmFkZFVSSVJlc29sdmVyKG5ldyBVUklSZXNvbHZlckRlbGVnYXRlKHJlc29sdmVyQ2xhc3MsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuZ2V0VVJJUmVzb2x2ZXIoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIEdldCB0aGUgbGlzdCBvZiBmaWxlcyB0byB2YWxpZGF0ZS4KLSAgICBMaXN0IGZpbGVzID0gZ2V0RmlsZUxpc3QoKTsKLSAgICAKLSAgICAvLyBSZWdpc3RlciB0aGUgV1NETCAxLjEgZXh0ZW5zaW9uIHZhbGlkYXRvcnMuCi0gICAgSXRlcmF0b3Igd3NkbDExZXh0SXRlciA9IHdzZGwxMXZhbGlkYXRvcnMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSh3c2RsMTFleHRJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpb25WYWxpZGF0b3IgZXh0VmFsID0gKEV4dGVuc2lvblZhbGlkYXRvcil3c2RsMTFleHRJdGVyLm5leHQoKTsKLSAgICAgIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKGV4dFZhbC5nZXRDbGFzc05hbWUoKSwgZXh0VmFsLmdldFJlc291cmNlQnVuZGxlKCkpOwotICAgICAgd3NkbFZhbGlkYXRvci5yZWdpc3RlcldTREwxMVZhbGlkYXRvcihleHRWYWwuZ2V0TmFtZXNwYWNlKCksIGRlbGVnYXRlKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gUmVnaXN0ZXIgdGhlIGV4dGVuc2lvbiB2YWxpZGF0b3JzLgotICAgIEl0ZXJhdG9yIGV4dEl0ZXIgPSBleHR2YWxpZGF0b3JzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUoZXh0SXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaW9uVmFsaWRhdG9yIGV4dFZhbCA9IChFeHRlbnNpb25WYWxpZGF0b3IpZXh0SXRlci5uZXh0KCk7Ci0gICAgICBXU0RMVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgV1NETFZhbGlkYXRvckRlbGVnYXRlKGV4dFZhbC5nZXRDbGFzc05hbWUoKSwgZXh0VmFsLmdldFJlc291cmNlQnVuZGxlKCkpOwotICAgICAgd3NkbFZhbGlkYXRvci5yZWdpc3RlcldTRExFeHRlbnNpb25WYWxpZGF0b3IoZXh0VmFsLmdldE5hbWVzcGFjZSgpLCBkZWxlZ2F0ZSk7Ci0gICAgfQotCi0gICAgLy8gVGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYW55IGZpbGVzIHRvIHZhbGlkYXRlLgotICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4obWVzc0dlbi5nZXRTdHJpbmcoX0VSUk9SX05PX0ZJTEVfU1BFQ0lGSUVEKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHhzZERpcmVjdG9yeSAhPSBudWxsKQotICAgIHsKLSAgICAgIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cuYWRkU2NoZW1hRGlyKHhzZERpcmVjdG9yeSk7Ci0gICAgfQotCi0gICAgLy8gVmFsaWRhdGUgYWxsIHRoZSBmaWxlcyBzcGVjaWZpZWQuCi0gICAgSXRlcmF0b3IgaUZpbGVzID0gZmlsZXMuaXRlcmF0b3IoKTsKLQotICAgIC8vIENvbW1vbiBzdHJpbmdzIG5lZWRlZCBpbiB2YWxpZGF0aW9uIG91dHB1dC4KLSAgICBTdHJpbmcgaW5mb0RlbGltID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUik7Ci0gICAgU3RyaW5nIHZhbGlkID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX1ZBTElEKTsKLSAgICBTdHJpbmcgaW52YWxpZCA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9JTlZBTElEKTsKLSAgICBTdHJpbmcgZXJyb3JtYXJrZXIgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfRVJST1JfTUFSS0VSKTsKLSAgICBTdHJpbmcgd2FybmluZ21hcmtlciA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9XQVJOSU5HX01BUktFUik7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbnVsbDsKLSAgICBib29sZWFuIG5vdHZhbGlkID0gdHJ1ZTsKLSAgICB3aGlsZSAoaUZpbGVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBub3R2YWxpZCA9IGZhbHNlOwotICAgICAgU3RyaW5nIGZpbGVuYW1lID0gKFN0cmluZylpRmlsZXMubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaW5mb0RlbGltKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobWVzc0dlbi5nZXRTdHJpbmcoX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUsIGZpbGVuYW1lKSkuYXBwZW5kKCIgLSAiKTsKLQotICAgICAgICBJVmFsaWRhdGlvblJlcG9ydCB2YWxSZXBvcnQgPSB3c2RsVmFsaWRhdG9yLnZhbGlkYXRlKGZpbGVuYW1lKTsKLQotICAgICAgICBJVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcyA9IHZhbFJlcG9ydC5nZXRWYWxpZGF0aW9uTWVzc2FnZXMoKTsKLQotICAgICAgICBpZiAoIXZhbFJlcG9ydC5oYXNFcnJvcnMoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQodmFsaWQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW52YWxpZCk7Ci0gICAgICAgICAgbm90dmFsaWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIikuYXBwZW5kKGluZm9EZWxpbSkuYXBwZW5kKCJcbiIpOwotCi0gICAgICAgIHJlc3VsdC5hcHBlbmQocmVwb3J0TWVzc2FnZXMobWVzc2FnZXMsIGVycm9ybWFya2VyLCB3YXJuaW5nbWFya2VyKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKG5vdHZhbGlkICYmIGZhaWxPbkVycm9yKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2UgZmFpbCBvbiBlcnJvciBieSB0aHJvd2luZyBhIGJ1aWxkIGV4Y2VwdGlvbgotICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzR2VuLmdldFN0cmluZyhfRVhDX1dTRExfRkFJTF9PTl9FUlJPUikpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzR2VuLmdldFN0cmluZyhfRVhDX1VOQUJMRV9UT19WQUxJREFURV9GSUxFLCBmaWxlbmFtZSwgZSkpOwotICAgICAgfQotICAgIH0KLQotICAgIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cucmVzZXQoKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIHN0cmluZyB3aXRoIGZvcm1hdHRlZCBvdXRwdXQgZm9yIHRoZSBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgbWVzc2FnZXMgdG8gcmVwb3J0LgotICAgKiBAcGFyYW0gZXJyb3JtYXJrZXIgVGhlIG1hcmtlciB0byB1c2UgZm9yIGVycm9yIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gd2FybmluZ21hcmtlciBUaGUgbWFya2VyIHRvIHVzZSBmb3Igd2FybmluZyBtZXNzYWdlcy4KLSAgICogQHJldHVybiBBIHN0cmluZyB3aXRoIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXBvcnRNZXNzYWdlcyhJVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcywgU3RyaW5nIGVycm9ybWFya2VyLCBTdHJpbmcgd2FybmluZ21hcmtlcikKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXR1cm5CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBpZiAobWVzc2FnZXMgPT0gbnVsbCkKLSAgICAgIHJldHVybiByZXR1cm5CdWZmZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIGludCBudW1NZXNzYWdlcyA9IG1lc3NhZ2VzLmxlbmd0aDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtTWVzc2FnZXM7IGkrKykKLSAgICB7Ci0gICAgICBJVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldOwotCi0gICAgICBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gd2FybmluZ21hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgfWlmKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0VSUk9SKQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gZXJyb3JtYXJrZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSB3YXJuaW5nbWFya2VyOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICB9aWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfRVJST1IpCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSBlcnJvcm1hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYobWVzc2FnZS5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IHdhcm5pbmdtYXJrZXI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgewotICAgICAgICBwcmVmaXggPSAiIjsKLSAgICAgIH1pZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9IGVycm9ybWFya2VyOwotICAgICAgfQotICAgICAgZWxzZSBpZihtZXNzYWdlLmdldFNldmVyaXR5KCkgPT0gSVZhbGlkYXRpb25NZXNzYWdlLlNFVl9XQVJOSU5HKQotICAgICAgIHsKLSAgICAgICAgcHJlZml4ID0gd2FybmluZ21hcmtlcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgfQotICAgICAgcmV0dXJuQnVmZmVyCi0gICAgICAgIC5hcHBlbmQocHJlZml4KQotICAgICAgICAuYXBwZW5kKCIgIikKLSAgICAgICAgLmFwcGVuZChtZXNzYWdlLmdldExpbmUoKSkKLSAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgIC5hcHBlbmQobWVzc2FnZS5nZXRDb2x1bW4oKSkKLSAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgIC5hcHBlbmQobWVzc2FnZS5nZXRNZXNzYWdlKCkpCi0gICAgICAgIC5hcHBlbmQoIlxuIik7Ci0gICAgfQotICAgIHJldHVybiByZXR1cm5CdWZmZXIudG9TdHJpbmcoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvWE1MQ2F0YWxvZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvWE1MQ2F0YWxvZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3NjJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1hNTENhdGFsb2dJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EVERMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5YTUxDYXRhbG9nOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXU0RMIFZhbGlkYXRvcidzIFhNTCBDYXRhbG9nIHRoYXQgdXNlcyB0aGUgWE1MIENhdGFsb2cKLSAqIGZyb20gYW50LgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0ltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nCi17Ci0gIHByb3RlY3RlZCBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSBuZXcgWE1MQ2F0YWxvZygpOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2cjYWRkRW50cnlUb0NhdGFsb2coamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVudHJ5VG9DYXRhbG9nKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgRFRETG9jYXRpb24gcmVzTG9jID0gbmV3IERURExvY2F0aW9uKCk7Ci0gICAgcmVzTG9jLnNldExvY2F0aW9uKHN5c3RlbUlkKTsKLSAgICByZXNMb2Muc2V0UHVibGljSWQocHVibGljSWQpOwotICAgIHhtbENhdGFsb2cuYWRkRW50aXR5KHJlc0xvYyk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nI3Jlc29sdmVFbnRpdHlMb2NhdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyByZXNvbHZlRW50aXR5TG9jYXRpb24oU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRJZCA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFNvdXJjZSBpcyA9IHhtbENhdGFsb2cucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkSWQgPSBpcy5nZXRTeXN0ZW1JZCgpOwotICAgICAgfQotICAgIH0KLSAgICAvLyAKLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGUgcmVzb3VyY2UgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0gICAgfQotICAgIC8vIG5lZWRzIHRvIHJldHVybiBudWxsIGlmIGl0IGNhbid0IHJlc29sdmUgdGhlIGlkCi0gICAgaWYgKHJlc29sdmVkSWQgIT0gbnVsbCAmJiByZXNvbHZlZElkLmVxdWFscygiIikpCi0gICAgewotICAgICAgcmVzb2x2ZWRJZCA9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlZElkOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIGNvbmZpZ3VyZWQgWE1MIENhdGFsb2cgdG8gdGhpcyBjYXRhbG9nLgotICAgKiAKLSAgICogQHBhcmFtIGNhdGFsb2cgQSBjb25maWd1cmVkIFhNTCBjYXRhbG9nIHRvIGFkZCB0byB0aGlzIGNhdGFsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRYTUxDYXRhbG9nKFhNTENhdGFsb2cgY2F0YWxvZykKLSAgewotICAgIHhtbENhdGFsb2cuYWRkQ29uZmlndXJlZFhNTENhdGFsb2coY2F0YWxvZyk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY1ODYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1VSSVJlc29sdmVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnVpLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJEZWxlZ2F0ZTsKLQotLyoqCi0gKiBSZWFkIGV4dGVuc2lvbiBVUkkgcmVzb2x2ZXJzLgotICogCi0gKiAgPGV4dGVuc2lvbgotICogICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnVyaXJlc29sdmVyIj4KLSAqICAgIDx1cmlyZXNvbHZlcgotICogICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uc29tZWNsYXNzIi8+Ci0gKiAgIDwvZXh0ZW5zaW9uPgotICogIAotICovCi1jbGFzcyBVUklSZXNvbHZlclJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInVyaXJlc29sdmVyIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YWdOYW1lOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBVUklSZXNvbHZlclJlZ2lzdHJ5UmVhZGVyKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIGhhbmRsZSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyB0aGF0IG1hdGNoCi0gICAqIHRoZSBzcGVkaWZpZWQgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgTGlzdCByZWFkUmVnaXN0cnkoKQotICB7Ci0gIAlMaXN0IHJlc29sdmVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgSVVSSVJlc29sdmVyIHJlc29sdmVyID0gcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgICBpZihyZXNvbHZlciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzb2x2ZXJMaXN0LmFkZChyZXNvbHZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc29sdmVyTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhbmQgZGVhbCB3aXRoIHRoZSBleHRlbnNpb24gcG9pbnRzLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQgVGhlIGV4dGVuc2lvbiBwb2ludCBlbGVtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIElVUklSZXNvbHZlciByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRVhURU5TSU9OX1BPSU5UX0lEKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzb2x2ZXJDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0KLSAgICAgIGlmIChyZXNvbHZlckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICByZXR1cm4gbmV3IFVSSVJlc29sdmVyRGVsZWdhdGUocmVzb2x2ZXJDbGFzcywgcGx1Z2luTG9hZGVyKS5nZXRVUklSZXNvbHZlcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9VUklSZXNvbHZlcldyYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1VSSVJlc29sdmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWZiMjlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1VSSVJlc29sdmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5yZXNvbHZlci5JVVJJUmVzb2x2ZXI7Ci0KLS8qKgotICogQW4gd3JhcHBlciBVUkkgcmVzb2x2ZXIgdGhhdCB3cmFwcyB0aGUgV2ViIFN0YW5kYXJkIFRvb2xzIFVSSSByZXNvbHZlcgotICogaW4gYSBXU0RMIHZhbGlkYXRvciBVUkkgcmVzb2x2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlcldyYXBwZXIgaW1wbGVtZW50cyBJVVJJUmVzb2x2ZXIKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFVSSVJlc29sdmVyV3JhcHBlcigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLmludGVybmFsLnJlc29sdmVyLklVUklSZXNvbHZlciNyZXNvbHZlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBVUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB0ZW1wVVJMID0gbmV3IFVSTChyZXN1bHQpOwotICAgICAgdGVtcFVSTCA9IFBsYXRmb3JtLnJlc29sdmUodGVtcFVSTCk7Ci0gICAgICByZXN1bHQgPSB0ZW1wVVJMLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgfQotICAgIC8vIElmIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3QgcmV0dXJuIG51bGwuCi0gICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIChyZXN1bHQuZXF1YWxzKHN5c3RlbUlkKSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0ZVdTRExBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkMjFlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0ZVdTRExBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uTWVzc2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC54bWwuWE1MTWVzc2FnZUluZm9IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGVBY3Rpb247Ci0KLS8qKgotICogRWNsaXBzZSBhY3Rpb24gZm9yIHJ1bm5pbmcgdGhlIFdTREwgdmFsaWRhdG9yLiAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETEFjdGlvbiBleHRlbmRzIFZhbGlkYXRlQWN0aW9uCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfT1BFTiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yKCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUl9DTE9TRSA9ICIpIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8vLyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9VSV9TQVZFX0RJUlRZX0ZJTEVfTUVTU0FHRSA9ICJfVUlfU0FWRV9ESVJUWV9GSUxFX01FU1NBR0UiOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfU0FWRV9ESVJUWV9GSUxFX1RJVExFID0gIl9VSV9TQVZFX0RJUlRZX0ZJTEVfVElUTEUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgPSAiX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX0VSUk9SUyA9ICJORVNURURfRVJST1JTIjsKLQotICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBzaG93RGlhbG9nIFdoZXRoZXIgdG8gc2hvdyBhIGRpYWxvZyB3aXRoIHRoZSBzdGF0dXMgdXBvbiBjb21wbGV0aW9uLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRlV1NETEFjdGlvbihJRmlsZSBmaWxlLCBib29sZWFuIHNob3dEaWFsb2cpCi0gIHsKLSAgCXN1cGVyKGZpbGUsIHNob3dEaWFsb2cpOwotICB9Ci0KLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgYW5kIGFzc2lnbiBtYXJrZXJzIGNvcnJlc3BvbmRpbmdseSB0byB0aGUgZmlsZS4gSWYKLSAgICogcmVxdWlyZWQsIHNob3cgYSBkaWFsb2cgd2l0aCB0aGUgcmVzdWx0cyBvZiB0aGUgdmFsaWRhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoZmluYWwgSUZpbGUgZmlsZSkKLSAgewotICAgIGZpbmFsIFZhbGlkYXRpb25PdXRjb21lIHZhbGlkYXRpb25PdXRjb21lID0gbmV3IFZhbGlkYXRpb25PdXRjb21lKCk7Ci0gICAgSVdvcmtzcGFjZVJ1bm5hYmxlIG9wID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgewotICAgICAgICBXU0RMVmFsaWRhdG9yIHdzZGxWYWxpZGF0b3IgPSBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGNsZWFyTWFya2VycyhmaWxlKTsKLSAgICAgICAgSVZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gbnVsbDsKLQotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldENhbm9uaWNhbEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIGxvY2F0aW9uID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkKLSAgICAgICAgewotICAgICAgICAgIHZhbFJlcG9ydCA9IHdzZGxWYWxpZGF0b3IudmFsaWRhdGUoRklMRV9QUk9UT0NPTCArIGxvY2F0aW9uLnN1YnN0cmluZygxKSwgaW5wdXRTdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHZhbFJlcG9ydCA9IHdzZGxWYWxpZGF0b3IudmFsaWRhdGUoRklMRV9QUk9UT0NPTCArIGxvY2F0aW9uLCBpbnB1dFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsaWRhdGlvbk91dGNvbWUuaXNXU0RMVmFsaWQgPSB2YWxSZXBvcnQuaXNXU0RMVmFsaWQoKTsKLSAgICAgICAgdmFsaWRhdGlvbk91dGNvbWUuaXNWYWxpZCA9ICF2YWxSZXBvcnQuaGFzRXJyb3JzKCk7Ci0gICAgICAgIGlmICh2YWxSZXBvcnQuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkubGVuZ3RoID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpZGF0aW9uT3V0Y29tZS5oYXNNZXNzYWdlcyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHZhbGlkYXRpb25PdXRjb21lLmhhc01lc3NhZ2VzID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNyZWF0ZU1hcmtlcnMoZmlsZSwgY29udmVydFZhbGlkYXRpb25NZXNzYWdlcyh2YWxSZXBvcnQuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCkpKTsKLSAgICAgICAgLy9jcmVhdGVNYXJrZXJzKGZpbGUsIHZhbGlkYXRvcm1hbmFnZXIuZ2V0V2FybmluZ0xpc3QoKSwgV0FSTklOR19NQVJLRVIpOwotICAgICAgICAKLSAgICAgICAgLy9maWxlLnNldFNlc3Npb25Qcm9wZXJ0eShWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSwgdmFsUmVwb3J0LmdldE5lc3RlZE1lc3NhZ2VzKCkpOwotICAgICAgICBmaWxlLnNldFNlc3Npb25Qcm9wZXJ0eShvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZS5FUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSwgY29udmVydE5lc3RlZFZhbGlkYXRpb25NZXNzYWdlcyh2YWxSZXBvcnQuZ2V0TmVzdGVkTWVzc2FnZXMoKSkpOwotICAgICAgfQotICAgIH07Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wLCBudWxsKTsKLQotICAgICAgaWYgKHNob3dEaWFsb2cpCi0gICAgICB7Ci0gICAgICAgIHNob3dEaWFsb2codmFsaWRhdGlvbk91dGNvbWUpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb252ZXJ0IFdTREwgdmFsaWRhdGlvbiBtZXNzYWdlcyB0byB2YWxpZGF0aW9uIGZyYW1ld29yayBtZXNzYWdlcy4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlcyBUaGUgV1NETCB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIGNvbnZlcnQuCi0gICAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKi8KLSAgcHJpdmF0ZSBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZVtdIGNvbnZlcnRWYWxpZGF0aW9uTWVzc2FnZXMoSVZhbGlkYXRpb25NZXNzYWdlW10gbWVzc2FnZXMpCi0gIHsKLSAgCWludCBudW1NZXNzYWdlcyA9IG1lc3NhZ2VzLmxlbmd0aDsKLSAgCW9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlW10gY29udmVydGVkTWVzc2FnZXMgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2VbbnVtTWVzc2FnZXNdOwotICAJCi0gIAlmb3IoaW50IGkgPSAwOyBpIDwgbnVtTWVzc2FnZXM7IGkrKykKLSAgCXsKLSAgCSAgSVZhbGlkYXRpb25NZXNzYWdlIG1lc3MgPSBtZXNzYWdlc1tpXTsKLSAgICAgIAotICAgICAgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UgY29udmVydE1lc3MgPSBudWxsOwotICAgICAgaWYgKG1lc3MgaW5zdGFuY2VvZiBWYWxpZGF0aW9uTWVzc2FnZUltcGwpCi0gICAgICB7ICAgU3RyaW5nIGVycm9yS2V5ID0gKChWYWxpZGF0aW9uTWVzc2FnZUltcGwpbWVzcykuZ2V0RXJyb3JLZXkoKTsKLSAgICAgICAgICBPYmplY3RbXSBtZXNzYWdlQXJncyA9ICgoVmFsaWRhdGlvbk1lc3NhZ2VJbXBsKW1lc3MpLmdldE1lc3NhZ2VBcmd1bWVudHMoKTsKLSAgICAgICAgICBjb252ZXJ0TWVzcyA9IG5ldyBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZShtZXNzLmdldE1lc3NhZ2UoKSwgbWVzcy5nZXRMaW5lKCksIG1lc3MuZ2V0Q29sdW1uKCksIG1lc3MuZ2V0VVJJKCksIGVycm9yS2V5LCBtZXNzYWdlQXJncyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBjb252ZXJ0TWVzcyA9IG5ldyBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZShtZXNzLmdldE1lc3NhZ2UoKSxtZXNzLmdldExpbmUoKSxtZXNzLmdldENvbHVtbigpLCBtZXNzLmdldFVSSSgpKTsKLSAgICAgIH0KLSAgCSAgaWYobWVzcy5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLQkgIHsKLQkgIAljb252ZXJ0TWVzcy5zZXRTZXZlcml0eShvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkgIAljb252ZXJ0TWVzcy5zZXRTZXZlcml0eShvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZS5TRVZfSElHSCk7Ci0JICB9Ci0gIAkgIAotICAJICAvLyBDb252ZXJ0IGFueSBuZXN0ZWQgbWVzc2FnZXMuCi0gIAkgIExpc3QgbmVzdGVkTWVzc2FnZXMgPSBtZXNzLmdldE5lc3RlZE1lc3NhZ2VzKCk7Ci0gIAkgIGlmKG5lc3RlZE1lc3NhZ2VzICE9IG51bGwgJiYgIW5lc3RlZE1lc3NhZ2VzLmlzRW1wdHkoKSkKLSAgCSAgewotICAJICAJSXRlcmF0b3IgbmVzdGVkSXRlciA9IG5lc3RlZE1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0gIAkgICAgd2hpbGUobmVzdGVkSXRlci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBJVmFsaWRhdGlvbk1lc3NhZ2UgbmVzdGVkTWVzcyA9IChJVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkSXRlci5uZXh0KCk7Ci0gICAgCSAgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UgY29udmVydE5lc3RlZE1lc3MgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UobmVzdGVkTWVzcy5nZXRNZXNzYWdlKCksbmVzdGVkTWVzcy5nZXRMaW5lKCksbmVzdGVkTWVzcy5nZXRDb2x1bW4oKSwgbmVzdGVkTWVzcy5nZXRVUkkoKSk7Ci0gICAgCSAgaWYobmVzdGVkTWVzcy5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLSAgICAJICB7Ci0gICAgCSAgCWNvbnZlcnROZXN0ZWRNZXNzLnNldFNldmVyaXR5KG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpOwotICAgIAkgIH0KLSAgICAJICBlbHNlCi0gICAgCSAgewotICAgIAkgIAljb252ZXJ0TmVzdGVkTWVzcy5zZXRTZXZlcml0eShvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZS5TRVZfSElHSCk7Ci0gICAgCSAgfQotICAgIAkgIGNvbnZlcnRNZXNzLmFkZE5lc3RlZE1lc3NhZ2UoY29udmVydE5lc3RlZE1lc3MpOwotICAgICAgICB9Ci0gIAkgIH0KLSAgCSAgY29udmVydGVkTWVzc2FnZXNbaV0gPSBjb252ZXJ0TWVzczsKLSAgCX0KLSAgCXJldHVybiBjb252ZXJ0ZWRNZXNzYWdlczsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnZlcnQgdGhlIG5lc3RlZCBtZXNzYWdlcyBoYXNobWFwLgotICAgKiAKLSAgICogQHBhcmFtIG5lc3RlZE1lc3NhZ2VzIFRoZSBuZXN0ZWQgbWVzc2FnZXMgaGFzaG1hcCB0byBjb252ZXJ0LgotICAgKiBAcmV0dXJuIEEgaGFzaG1hcCB3aXRoIHRoZSBjb252ZXJ0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHByaXZhdGUgSGFzaE1hcCBjb252ZXJ0TmVzdGVkVmFsaWRhdGlvbk1lc3NhZ2VzKEhhc2hNYXAgbmVzdGVkTWVzc2FnZXMpCi0gIHsKLSAgCUhhc2hNYXAgY29udmVydGVkTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgCQotICAJU2V0IGtleVNldCA9IG5lc3RlZE1lc3NhZ2VzLmtleVNldCgpOwotICAJSXRlcmF0b3Iga2V5c0l0ZXIgPSBrZXlTZXQuaXRlcmF0b3IoKTsKLSAgCXdoaWxlKGtleXNJdGVyLmhhc05leHQoKSkKLSAgCXsKLSAgCSAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5c0l0ZXIubmV4dCgpOwotICAJICBJVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IChJVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkTWVzc2FnZXMuZ2V0KGtleSk7Ci0gIAkgIG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25NZXNzYWdlW10gY29udmVydGVkTWVzc2FnZSA9IGNvbnZlcnRWYWxpZGF0aW9uTWVzc2FnZXMobmV3IElWYWxpZGF0aW9uTWVzc2FnZVtde21lc3NhZ2V9KTsKLSAgCSAgCi0gIAkgIGNvbnZlcnRlZE1hcC5wdXQoa2V5LCBjb252ZXJ0ZWRNZXNzYWdlWzBdKTsKLSAgCX0KLSAgCXJldHVybiBjb252ZXJ0ZWRNYXA7Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIHJ1bigpCi0vLyAgewotLy8gICAgLy8gT25seSBydW4gdGhlIHZhbGlkYXRpb24gaWYgdGhlIGZpbGUgZXhpc3RzIGFuZCBpcyBhdmFpbGFibGUuCi0vLyAgICBpZiAoZmlsZUlzT0soZmlsZSkpCi0vLyAgICB7Ci0vLyAgICAgIGlmIChzaG93RGlhbG9nKQotLy8gICAgICB7Ci0vLyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgaXMgZGlydHkgLSBwcm9tcHRzIHVzZXIgdG8gc2F2ZS4KLS8vICAgICAgICBjaGVja0lmRmlsZURpcnR5KGZpbGUpOwotLy8gICAgICB9Ci0vLyAgICAgIHN1cGVyLnJ1bigpOwotLy8gICAgfQotLy8gIH0KLQotICAvKioKLSAgICogVGVzdCB3aGV0aGVyIHRoZSBmaWxlIGdpdmVuIGlzIE9LIHRvIHVzZS4gQSBmaWxlIGlzIE9LIHRvIHVzZSBpZiAxLiBJdCBpcwotICAgKiBub3QgbnVsbCAyLiBJdCBleGlzdHMuIDMuIFRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIGZpbGUgaXMgYWNjZXNzaWJsZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBPSyB0byB2YWxpZGF0ZS4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIGlzIE9LIHRvIHZhbGlkYXRlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotLy8gIHByb3RlY3RlZCBib29sZWFuIGZpbGVJc09LKElGaWxlIGZpbGUpCi0vLyAgewotLy8gICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICYmIGZpbGUuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotLy8gICAgewotLy8gICAgICByZXR1cm4gdHJ1ZTsKLS8vICAgIH0KLS8vICAgIHJldHVybiBmYWxzZTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSBmaWxlIGlzIGRpcnR5LiBBIGZpbGUgaXMgZGlydHkgaWYgdGhlcmUgaXMgYW4gb3BlbiBlZGl0b3IgZm9yCi0gICAqIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgY2hhbmdlcyB0aGF0IGhhdmVuJ3QgYmVlbiBzYXZlZC4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBkaXJ0eS4KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgY2hlY2tJZkZpbGVEaXJ0eShJRmlsZSBmaWxlKQotLy8gIHsKLS8vICAgIElFZGl0b3JQYXJ0W10gZGlydHlFZGl0b3JzID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldERpcnR5RWRpdG9ycygpOwotLy8KLS8vICAgIGludCBudW1lZGl0b3JzID0gZGlydHlFZGl0b3JzLmxlbmd0aDsKLS8vICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtZWRpdG9yczsgaSsrKQotLy8gICAgewotLy8gICAgICBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBkaXJ0eUVkaXRvcnNbaV0uZ2V0RWRpdG9ySW5wdXQoKTsKLS8vICAgICAgaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KQotLy8gICAgICB7Ci0vLyAgICAgICAgRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotLy8gICAgICAgIGlmIChmaWxlRWRpdG9ySW5wdXQuZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZyhfVUlfU0FWRV9ESVJUWV9GSUxFX01FU1NBR0UpOwotLy8gICAgICAgICAgU3RyaW5nIHRpdGxlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKF9VSV9TQVZFX0RJUlRZX0ZJTEVfVElUTEUpOwotLy8gICAgICAgICAgaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgZGlydHlFZGl0b3JzW2ldLmRvU2F2ZShudWxsKTsKLS8vICAgICAgICAgIH0KLS8vICAgICAgICAgIC8vIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBvcGVuIGVkaXRvci9maWxlIHNvIHdlIGNhbiBicmVhay4KLS8vICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8KLS8vICAgIH0KLS8vICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG1hcmtlciBvbiB0aGUgZmlsZSBvZiB0aGUgaW5kaWNhdGVkIHR5cGUgZm9yIGVhY2gKLSAgICogVmFsaWRhdGlvbk1lc3NhZ2UgaW4gdGhlIGFycmF5LgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqICAgICAgICAgIFRoZSBmaWxlIHRvIGFkZCB0aGUgbWFya2VycyB0by4KLSAgICogQHBhcmFtIHZhbE1lc3NhZ2VzCi0gICAqICAgICAgICAgIFRoZSBhcnJheSBvZiBtZXNzYWdlcyB0byBhZGQgYXMgbWFya2Vycy4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgY3JlYXRlTWFya2VycyhJRmlsZSBpRmlsZSwgVmFsaWRhdGlvbk1lc3NhZ2VbXSB2YWxNZXNzYWdlcykKLS8vICB7Ci0vLyAgICBpZiAoIWZpbGVJc09LKGlGaWxlKSkKLS8vICAgIHsKLS8vICAgICAgcmV0dXJuOwotLy8gICAgfQotLy8gICAgaW50IG51bVZhbE1lc3NhZ2VzID0gdmFsTWVzc2FnZXMubGVuZ3RoOwotLy8gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1WYWxNZXNzYWdlczsgaSsrKQotLy8gICAgewotLy8gICAgICBWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IHZhbE1lc3NhZ2VzW2ldOwotLy8KLS8vICAgICAgaW50IGxpbmUgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRMaW5lKCk7Ci0vLyAgICAgIGludCBjb2x1bW4gPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW4oKTsKLS8vICAgICAgU3RyaW5nIG1lc3NhZ2UgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRNZXNzYWdlKCk7Ci0vLyAgICAgIGludCBzZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0vLyAgICAgIElNYXJrZXIgbWFya2VyID0gbnVsbDsKLS8vICAgICAgCi0vLyAgICAgIGJvb2xlYW4gaGFzTmVzdGVkRXJyb3JzID0gZmFsc2U7Ci0vLyAgICAgIExpc3QgbmVzdGVkZXJyb3JzID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLS8vICAgICAgaWYobmVzdGVkZXJyb3JzICE9IG51bGwgJiYgIW5lc3RlZGVycm9ycy5pc0VtcHR5KCkpCi0vLyAgICAgIHsKLS8vICAgICAgICBoYXNOZXN0ZWRFcnJvcnMgPSB0cnVlOwotLy8gICAgICAgIG1lc3NhZ2UgKz0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKF9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFKTsgCi0vLyAgICAgIH0KLS8vICAgICAgaWYgKHNldmVyaXR5ID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9FUlJPUikKLS8vICAgICAgewotLy8gICAgICAgIG1hcmtlciA9IGdldE9yQ3JlYXRlUmVwb3J0ZXIoKS5hZGRFcnJvck1lc3NhZ2UoaUZpbGUsIG1lc3NhZ2UsIGxpbmUsIGNvbHVtbik7Ci0vLyAgICAgIH0KLS8vICAgICAgZWxzZSBpZiAoc2V2ZXJpdHkgPT0gVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0vLyAgICAgIHsKLS8vICAgICAgICBtYXJrZXIgPSBnZXRPckNyZWF0ZVJlcG9ydGVyKCkuYWRkV2FybmluZ01lc3NhZ2UoaUZpbGUsIG1lc3NhZ2UsIGxpbmUsIGNvbHVtbik7Ci0vLyAgICAgIH0KLS8vICAgICAgCi0vLyAgICAgIGlmIChoYXNOZXN0ZWRFcnJvcnMgJiYgbWFya2VyICE9IG51bGwpCi0vLyAgICAgIHsKLS8vICAgICAgICB0cnkKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICBtYXJrZXIuc2V0QXR0cmlidXRlKCJncm91cE5hbWUiLCBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfT1BFTiArIHZhbGlkYXRpb25NZXNzYWdlLmdldFVSSSgpICsgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX0NMT1NFKTsKLS8vICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5ET05FLCB0cnVlKTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKQotLy8gICAgICAgIHsKLS8vICAgICAgICB9Ci0vLyAgICAgIH0KLS8vICAgICAgCi0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBTaG93IGEgZGlhbG9nIGNvbnRhaW5pbmcgdGhlIHN0YXR1cyBvZiB0aGUgdmFsaWRhdGlvbi4gV2lsbCBkaXNwbGF5IHZhbGlkCi0gICAqIG9yIGludmFsaWQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlcmUgYXJlIGVycm9ycyBvciBub3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdGlvbk91dGNvbWUKLSAgICogICAgICAgICAgVGhlIG91dGNvbWUgb2YgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzaG93RGlhbG9nKFZhbGlkYXRpb25PdXRjb21lIHZhbGlkYXRpb25PdXRjb21lKQotICB7Ci0gICAgU3RyaW5nIHRpdGxlLCBtZXNzYWdlOwotICAgIGlmICh2YWxpZGF0aW9uT3V0Y29tZS5pc1ZhbGlkKQotICAgIHsKLSAgICAgIGlmICh2YWxpZGF0aW9uT3V0Y29tZS5oYXNNZXNzYWdlcykKLSAgICAgIHsKLSAgICAgICAgc2hvd1Byb2JsZW1zVmlldygpOwotICAgICAgICB0aXRsZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1ZBTElEQVRJT05fU1VDQ0VFREVEIik7Ci0gICAgICAgIG1lc3NhZ2UgPSBWYWxpZGF0ZVdTRExQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9USEVfV1NETF9GSUxFX0lTX1ZBTElEX1dJVEhfV0FSTklOR1MiKTsKLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRpdGxlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVkFMSURBVElPTl9TVUNDRUVERUQiKTsKLSAgICAgICAgbWVzc2FnZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX1RIRV9XU0RMX0ZJTEVfSVNfVkFMSUQiKTsKLSAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdGlvbk91dGNvbWUuaXNXU0RMVmFsaWQpCi0gICAgICB7Ci0gICAgICAgIHRpdGxlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVkFMSURBVElPTl9GQUlMRUQiKTsKLSAgICAgICAgbWVzc2FnZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX1RIRV9XU0RMX0ZJTEVfSVNfVkFMSURfV1NETDExIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRpdGxlID0gVmFsaWRhdGVXU0RMUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U3RyaW5nKCJfVkFMSURBVElPTl9GQUlMRUQiKTsKLSAgICAgICAgbWVzc2FnZSA9IFZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFN0cmluZygiX1VJX1RIRV9XU0RMX0ZJTEVfSVNfTk9UX1ZBTElEIik7Ci0gICAgICB9Ci0gICAgICBzaG93UHJvYmxlbXNWaWV3KCk7Ci0gICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgfQotCi0gIH0KLSAgCi0gIC8qKgotICAgKiBTaG93IHRoZSBwcm9ibGVtcyB2aWV3IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHZpc2libGUuCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIHNob3dQcm9ibGVtc1ZpZXcoKQotLy8gIHsKLS8vICAgIElXb3JrYmVuY2hXaW5kb3cgZHcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotLy8gICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IGR3LmdldEFjdGl2ZVBhZ2UoKTsKLS8vICAgIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLS8vICAgIHRyeQotLy8gICAgewotLy8gICAgICBpZiAocGFnZSAhPSBudWxsKQotLy8gICAgICB7Ci0vLyAgICAgICAgcGFnZS5zaG93Vmlldygib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciKTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpCi0vLyAgICB7Ci0vLyAgICB9Ci0vLyAgICBwYWdlLmFjdGl2YXRlKGFjdGl2ZVBhcnQpOwotLy8gIH0KLQotICAvKioKLSAgICogSWYgYSByZXBvcnRlciBkb2Vzbid0IGV4aXN0IGNyZWF0ZXMgaXQgb3IgdXNlcyB0aGUgcmVwb3J0ZXIgYWxyZWFkeQotICAgKiBjcmVhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBhIHJlcG9ydGVyCi0gICAqLwotLy8gIHByb3RlY3RlZCBJUmVwb3J0ZXIgZ2V0T3JDcmVhdGVSZXBvcnRlcigpCi0vLyAgewotLy8gICAgaWYgKHJlcG9ydGVyID09IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIHJlcG9ydGVyID0gbmV3IFdvcmtiZW5jaFJlcG9ydGVyKGZpbGUuZ2V0UHJvamVjdCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiByZXBvcnRlcjsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIENsZWFyIGFsbCB0aGUgbWFya2VycyBvbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgZ2VuZXJhdGVkIGJ5IHRoaXMgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHJlc291cmNlIC0KLSAgICogICAgICAgICAgdGhlIHJlc3JvdWNlIHRvIGNsZWFyIGFsbCB0aGUgbWFya2VycyBmcm9tCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGNsZWFyTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UpCi0vLyAgewotLy8gICAgZ2V0T3JDcmVhdGVSZXBvcnRlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKHJlc291cmNlKTsKLS8vICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIFZhbGlkYXRpb25PdXRjb21lCi0gIHsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzV1NETFZhbGlkID0gdHJ1ZTsKLQotICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NhZ2VzID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgVmFsaWRhdGlvbk91dGNvbWUoKQotICAgIHsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgeyAgdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IGV4dHJhIGF0dHJpYnV0ZXMgaW4gdGhlIElNZXNzYWdlIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gb24gd2hhdCBzaG91bGQgYmUgInNxdWlnZ2xlZCIKLSAgICogQHBhcmFtIHZhbE1lc3MgdGhlIFZhbGlkYXRpb25NZXNzYWdlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBlcnJvcgotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgSU1lc3NhZ2UgdG8gc2V0IHRoZSBhdHRyaWJ1dGVzIGZvcgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW5mb1RvTWVzc2FnZShvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uTWVzc2FnZSB2YWxNZXNzLCBJTWVzc2FnZSBtZXNzYWdlKQotICB7ICAgaWYgKHZhbE1lc3MuZ2V0S2V5KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgICBYTUxNZXNzYWdlSW5mb0hlbHBlciBoZWxwZXIgPSBuZXcgWE1MTWVzc2FnZUluZm9IZWxwZXIoKTsKLSAgICAgICAgICBTdHJpbmdbXSBzcXVpZ2dsZUluZm8gPSBoZWxwZXIuY3JlYXRlTWVzc2FnZUluZm8odmFsTWVzcy5nZXRLZXkoKSwgdmFsTWVzcy5nZXRNZXNzYWdlQXJndW1lbnRzKCkpOwotICAgICAgCi0gICAgICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUsIG5ldyBJbnRlZ2VyKHZhbE1lc3MuZ2V0Q29sdW1uTnVtYmVyKCkpKTsKLSAgICAgICAgICBtZXNzYWdlLnNldEF0dHJpYnV0ZShTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFLCBzcXVpZ2dsZUluZm9bMF0pOwotICAgICAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFLCBzcXVpZ2dsZUluZm9bMV0pOwotICAgICAgfQotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0ZVdTRExBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxOTlkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9WYWxpZGF0ZVdTRExBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgZm9yIHRoZSBXU0RMIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlV1NETEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17Ci0gIHByb3RlY3RlZCBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSkKLSAgewotICAgIFZhbGlkYXRlV1NETEFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZVdTRExBY3Rpb24oZmlsZSwgdHJ1ZSk7Ci0gICAgdmFsaWRhdGVBY3Rpb24uc2V0VmFsaWRhdG9yKG5ldyBWYWxpZGF0b3IoKSk7Ci0gICAgdmFsaWRhdGVBY3Rpb24ucnVuKCk7CQotICB9Ci0gCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAJSUZpbGUgZmlsZSA9IG51bGw7Ci0gICAgaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgIE9iamVjdCBlbGVtZW50ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgIHsKLSAgICAgICAgZmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICAgICAgICAKLSAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgIHsgICAgICAgICAgCi0gICAgICB2YWxpZGF0ZShmaWxlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRlV1NETFBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNjYwMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdGVXU0RMUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2dFbnRpdHlIb2xkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgcmVxdWlyZWQgZm9yIGVjbGlwc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVdTRExQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19GSUxFID0gInZhbGlkYXRld3NkbHVpIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBWYWxpZGF0ZVdTRExQbHVnaW4gaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZWJ1bmRsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSB3c2RsVmFsaWRhdG9yUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTRExQbHVnaW4oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICBpbnN0YW5jZSA9IHRoaXM7Ci0gICAgd3NkbFZhbGlkYXRvclJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKENvbnN0YW50cy5XU0RMX1ZBTElEQVRPUl9QUk9QRVJUSUVTX0ZJTEUpOwotICAgIHJlc291cmNlYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFBST1BFUlRJRVNfRklMRSk7Ci0KLSAgICAvLyBDb25maWd1cmUgdGhlIFhNTCBjYXRhbG9nLgotICAgIG5ldyBFeHRYTUxDYXRhbG9nUGx1Z2luUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLSAgICBuZXcgV1NETFZhbGlkYXRvclBsdWdpblJlZ2lzdHJ5UmVhZGVyKAotICAgICAgImV4dHZhbGlkYXRvciIsCi0gICAgICAiZXh0dmFsaWRhdG9yIiwKLSAgICAgIFdTRExWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlci5FWFRfVkFMSURBVE9SKQotICAgICAgLnJlYWRSZWdpc3RyeSgpOwotCi0gICAgLy8gcmVnaXN0ZXIgYW55IFdTREwgMS4xIHZhbGlkYXRvcnMgZGVmaW5lZAotICAgIG5ldyBXU0RMMTFWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcigid3NkbDExdmFsaWRhdG9yIiwgInZhbGlkYXRvciIpLnJlYWRSZWdpc3RyeSgpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICBYTUxDYXRhbG9nLnJlc2V0KCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luIG9iamVjdC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luIG9iamVjdAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBWYWxpZGF0ZVdTRExQbHVnaW4gZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaW5zdGFsbCBVUkwgb2YgdGhpcyBwbHVnaW4uCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIHVybCBvZiB0aGlzIHBsdWdpbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJbnN0YWxsVVJMKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIikpLmdldEZpbGUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogUmVzb3VyY2VCdW5kbGUgaGVscGVyIG1ldGhvZHMKLSAgICogCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHBsdWdpbi4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnaW4KLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VidW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGUgV1NETCB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoZSBXU0RMIHZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFdTRExWYWxpZGF0b3JSZXNvdXJjZUJ1bmRsZSgpCi0gIHsKLSAgICByZXR1cm4gd3NkbFZhbGlkYXRvclJlc291cmNlQnVuZGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0cmluZyBmb3IgdGhlIGdpdmVuIGlkLgotICAgKiAKLSAgICogQHBhcmFtIHN0cmluZ0lEIC0gdGhlIGlkIGZvciB0aGUgc3RyaW5nCi0gICAqIEByZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIGdpdmVuIGlkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgc3RyaW5nSUQpCi0gIHsKLSAgICByZXR1cm4gZ2V0UmVzb3VyY2VCdW5kbGUoKS5nZXRTdHJpbmcoc3RyaW5nSUQpOwotICB9Ci19Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggV1NETEV4dGVuc2lvblZhbGlkYXRvcgotICovCi1jbGFzcyBXU0RMVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9SRVNPVVJDRUJVTkRMRSA9ICJyZXNvdXJjZWJ1bmRsZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdTRExfVkFMSURBVE9SID0gMDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVhUX1ZBTElEQVRPUiA9IDE7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZDsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YWdOYW1lOwotICBwcm90ZWN0ZWQgaW50IHZhbGlkYXRvclR5cGU7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcihTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCwgU3RyaW5nIHRhZ05hbWUsIGludCB2YWxpZGF0b3JUeXBlKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnRJZDsKLSAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwotICAgIHRoaXMudmFsaWRhdG9yVHlwZSA9IHZhbGlkYXRvclR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogcmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBhbmQgcGFyc2UgaXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50SWQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotICAgKgotICAgKiA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS52YWxpZGF0ZS53c2RsLldTRExFeHRlbnNpb25WYWxpZGF0b3IiCi0gICAqICAgICAgICAgICAgaWQ9InNvYXBWYWxpZGF0b3IiCi0gICAqICAgICAgICAgICAgbmFtZT0iU09BUCBWYWxpZGF0b3IiPj4KLSAgICogICA8dmFsaWRhdG9yPgotICAgKiAgICAgICAgPHJ1biBjbGFzcz0iIG9yZy5lY2xpcHNlLnZhbGlkYXRlLndzZGwuc29hcC5TT0FQVmFsaWRhdG9yIi8+Ci0gICAqICAgPC92YWxpZGF0b3I+Ci0gICAqICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHZhbHVlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi8+Ci0gICAqIDwvZXh0ZW5zaW9uPgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKHRhZ05hbWUpKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05BTUVTUEFDRSk7Ci0gICAgICBTdHJpbmcgcmVzb3VyY2VCdW5kbGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUkVTT1VSQ0VCVU5ETEUpOwotCi0gICAgICBpZiAodmFsaWRhdG9yQ2xhc3MgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyAgICAgICAgICBDbGFzc0xvYWRlciBwbHVnaW5Mb2FkZXIgPQotICAgICAgICAgIC8vICAgICAgICAgICAgZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgIC8vCQkJCW1vZGlmaWVkIHRvIHJlc29sdmUgY2VydGFpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBwbHVnaW4gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkCi0KLSAgICAgICAgICBDbGFzc0xvYWRlciBwbHVnaW5Mb2FkZXIgPQotICAgICAgICAgICAgZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAKLS8vICAgICAgICAgIGlmICh2YWxpZGF0b3JUeXBlID09IFdTRExfVkFMSURBVE9SKQotLy8gICAgICAgICAgIHsKLS8vICAgICAgICAgICAgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgV1NETDExVmFsaWRhdG9yRGVsZWdhdGUodmFsaWRhdG9yQ2xhc3MsIHJlc291cmNlQnVuZGxlLCBwbHVnaW5Mb2FkZXIpOwotLy8gICAgICAgICAgICBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCkucmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0vLyAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHZhbGlkYXRvclR5cGUgPT0gRVhUX1ZBTElEQVRPUikKLSAgICAgICAgICAgewotICAgICAgICAgICAgV1NETFZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzcywgcmVzb3VyY2VCdW5kbGUsIHBsdWdpbkxvYWRlcik7Ci0gICAgICAgICAgICBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCkucmVnaXN0ZXJXU0RMRXh0ZW5zaW9uVmFsaWRhdG9yKG5hbWVzcGFjZSwgZGVsZWdhdGUpOwotICAgICAgICAgIH0KLS8vICAgICAgICAgIHJlZ2lzdGVyV1NETFZhbGlkYXRvclBsdWdpbkV4dGVuc2lvbldpdGhDbGFzc05hbWUoCi0vLyAgICAgICAgICAgIHBsdWdpbkxvYWRlciwKLS8vICAgICAgICAgICAgV1NETFZhbGlkYXRvckV4dGVuc2lvbkNsYXNzLAotLy8gICAgICAgICAgICBXU0RMVmFsaWRhdG9yRXh0ZW5zaW9uTmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgZXh0ZW5zaW9uIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lIGFuZCBuYW1lc3BhY2VzLgotICAgKiAKLSAgICogQHBhcmFtIGNsYXNzTG9hZGVyIC0gdGhlIGNsYXNzIGxvYWRlciB0byBjcmVhdGUgdGhlIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gY2xhc3NOYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB2YWxpZGF0b3IKLSAgICogQHBhcmFtIG5hbWVzcGFjZSAtIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGV4dGVuc2lvbiB2YWxpZGF0b3IKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0vLyAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJXU0RMVmFsaWRhdG9yUGx1Z2luRXh0ZW5zaW9uV2l0aENsYXNzTmFtZSgKLS8vICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAotLy8gICAgU3RyaW5nIGNsYXNzTmFtZSwKLS8vICAgIFN0cmluZyBuYW1lc3BhY2UpCi0vLyAgICB0aHJvd3MgRXhjZXB0aW9uCi0vLyAgewotLy8gICAgdHJ5Ci0vLyAgICB7Ci0vLyAgICAgIENsYXNzIHZhbGlkYXRvckV4dGVuc2lvbkNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDogQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotLy8KLS8vICAgICAgCi0vLyAgICAgIC8vSVZhbGlkYXRvckV4dGVuc2lvblBsdWdpbiB2YWxpZGF0b3JIYW5kbGVyID0gKElWYWxpZGF0b3JFeHRlbnNpb25QbHVnaW4pdmFsaWRhdG9yRXh0ZW5zaW9uQ2xhc3MubmV3SW5zdGFuY2UoKTsKLS8vICAgICAgLy9hZGQobmFtZXNwYWNlLCB2YWxpZGF0b3JIYW5kbGVyLmdldFZhbGlkYXRvcigpKTsKLS8vICAgIH0KLS8vICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLS8vICAgIHsKLS8vICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotLy8gICAgICAvL1RPRE86IHdyaXRlIHRoZSBlcnJvciBtZXNzYWdlIHRvIHRoZSBsb2cgZmlsZSAtIHVzZSBjdXN0b20gbG9nIHdyaXRlciBjbGFzcwotLy8gICAgICAvL1ZhbGlkYXRlV1NETFBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJXU0RMIFZhbGlkYXRvciBjb3VsZCBub3QgcmVnaXN0ZXIgdGhlIGV4dGVuc2lvbiB2YWxpZGF0b3IuIiArIGUuZ2V0TWVzc2FnZSgpKTsJCi0vLyAgICB9Ci0vLyAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciB0aGUgbG9hZGVkIHZhbGlkYXRvci4KLSAgICogCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSB0aGUgbmFtZXNwYWNlIG9mIHRoZSB2YWxpZGF0b3IKLSAgICogQHBhcmFtIHZhbGlkYXRvckV4dGVuc2lvbiAtIHRoZSBleHRlbnNpb24gdmFsaWRhdG9yCi0gICAqLwotLy8gIHByb3RlY3RlZCB2b2lkIGFkZChTdHJpbmcgbmFtZXNwYWNlLCBJV1NETFZhbGlkYXRvciB2YWxpZGF0b3JFeHRlbnNpb24pCi0vLyAgewotLy8gICAgaWYgKHZhbGlkYXRvclR5cGUgPT0gV1NETF9WQUxJREFUT1IpCi0vLyAgICB7Ci0vLyAgICAgIFdTRExDb25maWd1cmF0b3IucmVnaXN0ZXJXU0RMVmFsaWRhdG9yKG5hbWVzcGFjZSwgdmFsaWRhdG9yRXh0ZW5zaW9uKTsKLS8vICAgIH0KLS8vICAgIGVsc2UgaWYgKHZhbGlkYXRvclR5cGUgPT0gV1NJX1ZBTElEQVRPUikKLS8vICAgIHsKLS8vICAgICAgV1NETENvbmZpZ3VyYXRvci5yZWdpc3RlcldTSVZhbGlkYXRvcihuYW1lc3BhY2UsIHZhbGlkYXRvckV4dGVuc2lvbik7Ci0vLyAgICB9Ci0vLyAgfQotfQotCi0vKioKLSAqIFJlYWQgV1NEbCAxLjEgZXh0ZW5zaW9uIHZhbGlkYXRvcnMuCi0gKiAKLSAqICA8ZXh0ZW5zaW9uCi0gKiAgICAgcG9pbnQ9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udmFsaWRhdG9yIgotICogICAgIGlkPSJ3c2RsVmFsaWRhdG9yIgotICogICAgIG5hbWU9IiVfVUlfV1NETF9WQUxJREFUT1IiPgotICogICAgPHdzZGwxMXZhbGlkYXRvcgotICogICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotICogICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzZGwudmFsaWRhdGUuc29hcC53c2RsMTEuU09BUFZhbGlkYXRvciIKLSAqICAgICAgIHJlc291cmNlYnVuZGxlPSJ2YWxpZGF0ZXdzZGxzb2FwIi8+Ci0gKiAgIDwvZXh0ZW5zaW9uPgotICogIAotICovCi1jbGFzcyBXU0RMMTFWYWxpZGF0b3JQbHVnaW5SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFU09VUkNFQlVORExFID0gInJlc291cmNlYnVuZGxlIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBleHRlbnNpb25Qb2ludElkOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhZ05hbWU7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGV4dGVuc2lvblBvaW50SWQgLSB0aGUgaWQgb2YgdGhlIGV4dGVuc2lvbiBwb2ludAotICAgKiBAcGFyYW0gdGFnTmFtZSAtIHRoZSB0YWcgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50Ci0gICAqLwotICBwdWJsaWMgV1NETDExVmFsaWRhdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIoU3RyaW5nIGV4dGVuc2lvblBvaW50SWQsIFN0cmluZyB0YWdOYW1lKQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25Qb2ludElkID0gZXh0ZW5zaW9uUG9pbnRJZDsKLSAgICB0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIGhhbmRsZSB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50cyB0aGF0IG1hdGNoCi0gICAqIHRoZSBzcGVkaWZpZWQgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKQotICB7Ci0gICAgSUV4dGVuc2lvblJlZ2lzdHJ5IHBsdWdpblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgICBJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50SWQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGFuZCBkZWFsIHdpdGggdGhlIGV4dGVuc2lvbiBwb2ludHMuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZXh0ZW5zaW9uIHBvaW50IGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0gICAgewotICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLSAgICAgIFN0cmluZyByZXNvdXJjZUJ1bmRsZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9SRVNPVVJDRUJVTkRMRSk7Ci0KLSAgICAgIGlmICh2YWxpZGF0b3JDbGFzcyAhPSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkxvYWRlciA9Ci0gICAgICAgICAgICBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotICAgICAgICAgIFdTREwxMVZhbGlkYXRvckRlbGVnYXRlIGRlbGVnYXRlID0gbmV3IFdTREwxMVZhbGlkYXRvckRlbGVnYXRlKHZhbGlkYXRvckNsYXNzLCByZXNvdXJjZUJ1bmRsZSwgcGx1Z2luTG9hZGVyKTsKLSAgICAgICAgICBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCkucmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnaW4gbWFuaWZlc3RzIGFuZCByZWdpc3RlcnMgZWFjaCBXU0RMRXh0ZW5zaW9uVmFsaWRhdG9yCi0gKi8KLWNsYXNzIEV4dFhNTENhdGFsb2dQbHVnaW5SZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJ4bWxjYXRhbG9nIjsKLSAgCi0gIC8qKgotICAgKiBUaGUgeG1sY2F0YWxvZyBlbGVtZW50IGFsbG93IGFkZGluZyBhbiBleHRlbnNpb24gWE1MIENhdGFsb2cgc3VjaCBhcwotICAgKiA8eG1sY2F0YWxvZyBjbGFzcz0ib3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5FeHRYTUxDYXRhbG9nIj4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVF9DQVRBTE9HX1RBR19OQU1FID0gInhtbGNhdGFsb2ciOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOwotICAKLSAgLyoqCi0gICAqIFRoZSBlbnRpdHkgZWxlbWVudCBhbGxvd3MgYWRkaW5nIHNwZWNpZmljIFhNTCBjYXRhbG9nIGVudGl0aWVzIHN1Y2ggYXMKLSAgICogPGVudGl0eQotICAgKiAgIHB1YmxpY2lkPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgCi0gICAqICAgc3lzdGVtaWQ9InhzZC93c2RsLnhzZCIgLz4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9UQUdfTkFNRSA9ICJlbnRpdHkiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFVCTElDX0lEID0gInB1YmxpY0lkIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1NZU1RFTV9JRCA9ICJsb2NhdGlvbiI7Ci0gIAotICAvKioKLSAgICogVGhlIHNjaGVtYWRpciBlbGVtZW50IGFsbG93cyBhZGRpbmcgYSBkaXJlY3RvciBvZiBzY2hlbWFzIHRvIHRoZSBYTUwgY2F0YWxvZyBzdWNoIGFzCi0gICAqIDxzY2hlbWFkaXIgbG9jYXRpb249ImM6XG15c2NoZW1hZGlyIiAvPgotICAgKiBOb3RlOiBJdCBpcyBtb3JlIGV4cGVuc2l2ZSB0byB1c2UgdGhpcyBtZXRob2QgdGhlbiB0aGUgZW50aXR5IG1ldGhvZAotICAgKiBvZiBhZGRpbmcgc2NoZW1hcyB0byB0aGUgY2F0YWxvZyBhcyB0aGlzIG1ldGhvZCByZXF1aXJlcyB0aGF0IGFsbCBvZgotICAgKiB0aGUgc2NoZW1hcyBiZSByZWFkLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0RJUl9UQUdfTkFNRSA9ICJzY2hlbWFkaXIiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTE9DQVRJT04gPSAibG9jYXRpb24iOwotICBwcm90ZWN0ZWQgU3RyaW5nIHBsdWdpbklkLCBleHRlbnNpb25Qb2ludElkOwotCi0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZToKLSAgICoKLSAgICogPGV4dGVuc2lvbiBwb2ludD0iY29tLmlibS5ldG9vbHMudmFsaWRhdGUud3NkbC5XU0RMRXh0ZW5zaW9uVmFsaWRhdG9yIgotICAgKiAgICAgICAgICAgIGlkPSJzb2FwVmFsaWRhdG9yIgotICAgKiAgICAgICAgICAgIG5hbWU9IlNPQVAgVmFsaWRhdG9yIj4+Ci0gICAqICAgPHZhbGlkYXRvcj4KLSAgICogICAgICAgIDxydW4gY2xhc3M9IiBjb20uaWJtLmV0b29scy52YWxpZGF0ZS53c2RsLnNvYXAuU09BUFZhbGlkYXRvciIvPgotICAgKiAgIDwvdmFsaWRhdG9yPgotICAgKiAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB2YWx1ZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIvPgotICAgKiA8L2V4dGVuc2lvbj4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIGVsZW1lbnRuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0gICAgLy8gRXh0ZW5zaW9uIFhNTCBDYXRhbG9ncy4KLSAgICBpZiAoZWxlbWVudG5hbWUuZXF1YWxzKEVYVF9DQVRBTE9HX1RBR19OQU1FKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgeG1sQ2F0YWxvZ0NsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQotICAgICAgaWYgKHhtbENhdGFsb2dDbGFzcyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIC8vIG1vZGlmaWVkIHRvIHJlc29sdmUgY2VydGFpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBwbHVnaW4gaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkCi0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KLSAgICAgICAgICAgIGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0RGVjbGFyaW5nUGx1Z2luRGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgLy8JCQkJCUNsYXNzTG9hZGVyIHBsdWdpbkxvYWRlciA9Ci0gICAgICAgICAgLy8JCQkJCQllbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldERlY2xhcmluZ1BsdWdpbkRlc2NyaXB0b3IoKS5nZXRQbHVnaW4oKS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgWE1MQ2F0YWxvZy5zZXRFeHRlbnNpb25YTUxDYXRhbG9nKHhtbENhdGFsb2dDbGFzcywgcGx1Z2luTG9hZGVyKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gWE1MIENhdGFsb2cgZW50aXRlcy4KLSAgICBlbHNlIGlmKGVsZW1lbnRuYW1lLmVxdWFscyhFTlRJVFlfVEFHX05BTUUpKQotICAgIHsKLSAgICAgIFN0cmluZyBwdWJsaWNpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QVUJMSUNfSUQpOwotICAgICAgU3RyaW5nIHN5c3RlbWlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NZU1RFTV9JRCk7Ci0gICAgICBpZihwdWJsaWNpZCA9PSBudWxsIHx8IHN5c3RlbWlkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICBzeXN0ZW1pZCA9IGdldEFic29sdXRlTG9jYXRpb24oc3lzdGVtaWQsIGJ1bmRsZSk7Ci0gICAgICAKLSAgICAgIFhNTENhdGFsb2cuYWRkRW50aXR5KG5ldyBYTUxDYXRhbG9nRW50aXR5SG9sZGVyKHB1YmxpY2lkLCBzeXN0ZW1pZCkpOwotICAgIH0KLSAgICAvLyBTY2hlbWEgZGlyZWN0b3JpZXMgZm9yIHRoZSBYTUwgQ2F0YWxvZy4KLSAgICBlbHNlIGlmKGVsZW1lbnRuYW1lLmVxdWFscyhTQ0hFTUFfRElSX1RBR19OQU1FKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbG9jYXRpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTE9DQVRJT04pOwotICAgICAgaWYobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgbG9jYXRpb24gPSBnZXRBYnNvbHV0ZUxvY2F0aW9uKGxvY2F0aW9uLCBidW5kbGUpOwotICAgICAgICBYTUxDYXRhbG9nLmFkZFNjaGVtYURpcihsb2NhdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWJzb2x1dGVMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24sIEJ1bmRsZSBidW5kbGUpCi0gIHsKLSAgICBVUkwgdXJsID0gbnVsbDsKLSAgICBpZihidW5kbGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBidW5kbGUuZ2V0RW50cnkobG9jYXRpb24pOwotICAgIH0KLSAgICAKLSAgICBpZih1cmwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdXJsID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpOwotICAgICAgICByZXR1cm4gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaChJT0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvL1VuYWJsZSB0byByZWdpc3RlciB0aGUgc2NoZW1hLgotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbG9jYXRpb247Ci0gIH0KLX0KLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjdkYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVJ1bGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLkhlbHBlcjsKLQotCi0vKioKLSAqIEEgdmFsaWRhdG9yIHRvIHBsdWcgdGhlIFdTREwgdmFsaWRhdG9yIGludG8gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvcgotewotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gSUZpbGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZQotICAgKiAgICAgICAgICBUaGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSkKLS8vICB7Ci0vLyAgICBWYWxpZGF0ZVdTRExBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVXU0RMQWN0aW9uKGZpbGUsIGZhbHNlKTsKLS8vICAgIHZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcih0aGlzKTsKLS8vICAgIHZhbGlkYXRlQWN0aW9uLnJ1bigpOwotLy8gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLSAgICBWYWxpZGF0ZVdTRExBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgVmFsaWRhdGVXU0RMQWN0aW9uKGZpbGUsIGZhbHNlKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IodGhpcyk7Ci0gICAgdmFsaWRhdGVBY3Rpb24uc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotICAgIHZhbGlkYXRlQWN0aW9uLnNldElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5ydW4oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5jb3JlLklWYWxpZGF0b3IjdmFsaWRhdGUob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JSGVscGVyLCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5jb3JlLklSZXBvcnRlciwgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uY29yZS5JRmlsZURlbHRhW10pCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCi0gIHsKLQlTdHJpbmdbXSBjaGFuZ2VkRmlsZXMgPSBoZWxwZXIuZ2V0VVJJcygpOwotICAgIGlmIChjaGFuZ2VkRmlsZXMgIT0gbnVsbCAmJiBjaGFuZ2VkRmlsZXMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbSBzdHJlYW1Ub1ZhbGlkYXRlID0gKElucHV0U3RyZWFtKSBoZWxwZXIubG9hZE1vZGVsKCJpbnB1dFN0cmVhbSIpOwotICAgICAgaWYgKHN0cmVhbVRvVmFsaWRhdGUgIT0gbnVsbCkKLSAgICAgIHsgICAKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gY2hhbmdlZEZpbGVzWzBdOwotICAgICAgICBPYmplY3RbXSBwYXJtcyA9IHsgZmlsZU5hbWUgfTsKLSAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgaGVscGVyLmxvYWRNb2RlbChIZWxwZXIuR0VUX0ZJTEUsIHBhcm1zKTsKLSAgICAgICAgCi0gICAgICAgIHZhbGlkYXRlKGZpbGUsIHN0cmVhbVRvVmFsaWRhdGUsIHJlcG9ydGVyKTsKLSAgICAgICAgCi0gICAgICB9IGVsc2UKLSAgICAgIHsgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkRmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBjaGFuZ2VkRmlsZXNbaV07Ci0gICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0W10gcGFybXMgPSB7ZmlsZU5hbWV9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBoZWxwZXIubG9hZE1vZGVsKEhlbHBlci5HRVRfRklMRSwgcGFybXMpOwotICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFsaWRhdGVJZk5lZWRlZChmaWxlLCBoZWxwZXIsIHJlcG9ydGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBPYmplY3RbXSBwYXJtcyA9IHt0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpfTsKLSAgICAgIENvbGxlY3Rpb24gZmlsZXMgPSAoQ29sbGVjdGlvbikgaGVscGVyLmxvYWRNb2RlbChIZWxwZXIuR0VUX1BST0pFQ1RfRklMRVMsIHBhcm1zKTsKLSAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBmaWxlcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBpdGVyLm5leHQoKTsKLSAgICAgICAgdmFsaWRhdGVJZk5lZWRlZChmaWxlLCBoZWxwZXIsIHJlcG9ydGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGZpbGUKLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqIEBwYXJhbSBydWxlR3JvdXAKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKElGaWxlIGZpbGUsIElSZXBvcnRlciByZXBvcnRlciwgaW50IHJ1bGVHcm91cCkKLSAgewotICAgIFZhbGlkYXRlV1NETEFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IG5ldyBWYWxpZGF0ZVdTRExBY3Rpb24oZmlsZSwgZmFsc2UpOwotICAgIHZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcih0aGlzKTsKLSAgICB2YWxpZGF0ZUFjdGlvbi5ydW4oKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZmlsZSBpZiB2YWxpZGF0aW9uIGlzIHJlcXVpcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGUKLSAgICogQHBhcmFtIG1vZGVsCi0gICAqIEBwYXJhbSBoZWxwZXIKLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlmTmVlZGVkKElGaWxlIGZpbGUsIE9iamVjdCBtb2RlbCwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0gICAgaWYgKG1vZGVsID09IG51bGwpCi0gICAgewotICAgICAgdmFsaWRhdGVJZk5lZWRlZChmaWxlLCBoZWxwZXIsIHJlcG9ydGVyKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVW5wYWNrcyB0aGUgZmlsZU1vZGVsUGFpciBhbmQgcmV0dXJucyBhbiBJRmlsZSBvYmplY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZShPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLSAgICB7Ci0gICAgICBMaXN0IGZpbGVNb2RlbFBhaXIgPSAoTGlzdCkgb2JqZWN0OwotICAgICAgaWYgKGZpbGVNb2RlbFBhaXIuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGZpbGUgPSBmaWxlTW9kZWxQYWlyLmdldCgwKTsKLSAgICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBJRmlsZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChJRmlsZSkgZmlsZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBmaWxlIGlmIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZQotICAgKiAgICAgICAgICBUaGUgZmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGhlbHBlcgotICAgKiAgICAgICAgICBBbiBhaWQgZm9yIHRoZSB2YWxpZGF0aW9uLgotICAgKiBAcGFyYW0gcmVwb3J0ZXIKLSAgICogICAgICAgICAgVGhlIHJlcG9ydGVyIHRvIHJlcG9ydCB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSWZOZWVkZWQoSUZpbGUgZmlsZSwgSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0gICAgVmFsaWRhdG9yTWFuYWdlciBtZ3IgPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLSAgICAvLyBQYXNzIGluIGEgIm51bGwiIHNvIHRoYXQgbG9hZE1vZGVsIGRvZXNuJ3QgYXR0ZW1wdCB0byBjYXN0IHRoZSByZXN1bHQgaW50byBhIFJlZk9iamVjdC4KLSAgICBJbnRlZ2VyIHJ1bGVHcm91cEludCA9IChJbnRlZ2VyKSBoZWxwZXIubG9hZE1vZGVsKElSdWxlR3JvdXAuUEFTU19MRVZFTCwgbnVsbCk7IAotICAgIGludCBydWxlR3JvdXAgPSAocnVsZUdyb3VwSW50ID09IG51bGwpID8gSVJ1bGVHcm91cC5QQVNTX0ZVTEwgOiBydWxlR3JvdXBJbnQuaW50VmFsdWUoKTsKLQotICAgIHZhbGlkYXRlKGZpbGUsIHJlcG9ydGVyLCBydWxlR3JvdXApOwotICB9Ci0KLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklWYWxpZGF0b3IjY2xlYW51cChjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKQotICB7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9XU0RMVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvZWNsaXBzZS9XU0RMVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDcwMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2VjbGlwc2UvV1NETFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotCi0vKioKLSAqIEFuIEVjbGlwc2UgV1NETCB2YWxpZGF0b3IuIFRoaXMgdmFsaWRhdG9yIGlzIHRoZSBkZWZhdWx0IHZhbGlkYXRvcgotICogdXNlZCBpbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YKLSAqIHRoaXMgdmFsaWRhdG9yLiBXaGVuIGNyZWF0ZWQsIHRoaXMgdmFsaWRhdG9yIHJlZ2lzdGVycyBhbGwgZXh0ZW5zaW9uCi0gKiBVUkkgcmVzb2x2ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuV1NETFZhbGlkYXRvcgotewotCXByaXZhdGUgc3RhdGljIFdTRExWYWxpZGF0b3IgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yIHJlZ2lzdGVycyBhbGwgb2YgdGhlIFVSSSByZXNvbHZlcnMgZGVmaW5lZCB2aWEgdGhlCi0JICogV1NETCBVUkkgcmVzb2x2ZXIgZXh0ZW5zaW9uIHBvaW50IHdpdGggdGhlIFdTREwgdmFsaWRhdG9yLiAKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFdTRExWYWxpZGF0b3IoKQotCXsKLSAgICBzdXBlcigpOwotCSAgVVJJUmVzb2x2ZXJSZWdpc3RyeVJlYWRlciB1cmlSUiA9IG5ldyBVUklSZXNvbHZlclJlZ2lzdHJ5UmVhZGVyKCk7Ci0JICBMaXN0IHJlc29sdmVycyA9IHVyaVJSLnJlYWRSZWdpc3RyeSgpOwotCSAgSXRlcmF0b3IgcmVzb2x2ZXJJdGVyID0gcmVzb2x2ZXJzLml0ZXJhdG9yKCk7Ci0JICB3aGlsZShyZXNvbHZlckl0ZXIuaGFzTmV4dCgpKQotCSAgewotCSAgCUlVUklSZXNvbHZlciByZXNvbHZlciA9IChJVVJJUmVzb2x2ZXIpcmVzb2x2ZXJJdGVyLm5leHQoKTsKLQkgIAlhZGRVUklSZXNvbHZlcihyZXNvbHZlcik7Ci0JICB9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoaXMgRWNsaXBzZSBXU0RMIHZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBFY2xpcHNlIFdTREwgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NETFZhbGlkYXRvciBnZXRJbnN0YW5jZSgpCi0JewotCQlpZihpbnN0YW5jZSA9PSBudWxsKQotCQl7Ci0JCQlpbnN0YW5jZSA9IG5ldyBXU0RMVmFsaWRhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLS8vCS8qKgotLy8JICogVmFsaWRhdGUgdGhlIHNwZWNpZmllZCBXU0RMIGZpbGUuCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBmaWxlVVJJIFRoZSBVUkkgb2YgdGhlIFdTREwgZmlsZS4KLS8vCSAqIEByZXR1cm4gQSB2YWxpZGF0aW9uIHJlcG9ydCB3aXRoIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMuCi0vLwkgKi8KLS8vCXB1YmxpYyBJVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgZmlsZVVSSSkKLS8vCXsKLS8vCQlyZXR1cm4gd3NkbFZhbGlkYXRvci52YWxpZGF0ZShmaWxlVVJJKTsKLS8vCX0KLS8vICAvKioKLS8vCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBXU0RMIElucHV0U3RyZWFtCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBmaWxlVVJJIFRoZSBVUkkgb2YgdGhlIFdTREwgZmlsZS4KLS8vCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSB0aGUgSW5wdXRTdHJlYW0gdG8gdmFsaWRhdGUKLS8vCSAqIEByZXR1cm4gQSB2YWxpZGF0aW9uIHJlcG9ydCB3aXRoIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMuCi0vLwkgKi8KLS8vCXB1YmxpYyBJVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgZmlsZVVSSSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0vLyAgewotLy8gICAgcmV0dXJuIHdzZGxWYWxpZGF0b3IudmFsaWRhdGUoZmlsZVVSSSwgaW5wdXRTdHJlYW0pOwotLy8gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy93c2RsdmFsaWRhdGV1aS9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvV1NETFZhbGlkYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdGV4dC9XU0RMVmFsaWRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhMTE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdGV4dC9XU0RMVmFsaWRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS50ZXh0OwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5XU0RMVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuV1NETFZhbGlkYXRvckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuSVVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnV0aWwuTWVzc2FnZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnhtbC5YTUxDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwueG1sLlhNTENhdGFsb2dFbnRpdHlIb2xkZXI7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBBIGNvbW1hbmRlIGxpbmUgdG9vbCB0byBydW4gV1NETCBWYWxpZGF0aW9uIG9uIGEgc2luZ2xlIG9yIG11bHRpcGxlIGZpbGVzLgotICogCi0gKiBPcHRpb25zCi0gKiAtc2NoZW1hRGlyIGRpcmVjdG9yeSAgICAgICA6IGEgZGlyZWN0b3J5IG9mIHNjaGVtYXMgdG8gbG9hZCBpbnRvIHRoZSBjYXRhbG9nCi0gKiAtc2NoZW1hIG5hbWVzcGFjZSBsb2NhdGlvbiA6IGEgc2NoZW1hIHRvIGxvYWQgaW50byB0aGUgcmVnaXN0cnkKLSAqIC13c2RsMTF2IGNsYXNzbmFtZSBuYW1lc3BhY2UgcmVzb3VyY2VidW5kbGUgOiByZWdpc3RlciBhIFdTREwgMS4xIGV4dGVuc2lvbiB2YWxpZGF0b3IKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbG9hZCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZSB3aXRoIHRoZSBnaXZlbiByZXNvdXJjZWJ1bmRsZQotICogLXdzaXYgdmFsaWRhdG9yQ2xhc3MgbmFtZXNwYWNlIHByb3BlcnRpZXNmaWxlIDogcmVnaXN0ZXIgYSBXUy1JIHZhbGlkYXRvcgotICogLXVyaXJlc29sdmVyIFVSSVJlc29sdmVyQ2xhc3MgOiByZWdpc3RlciBhbiBleHRlbnNpb24gVVJJIHJlc29sdmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVmFsaWRhdGUKLXsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVggPSAiZmlsZTovLy8iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX1BST1BFUlRJRVMgPQotICAgIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uc3RhbnRzLldTRExfVkFMSURBVE9SX1BST1BFUlRJRVNfRklMRTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX1BST1BFUlRJRVMgPSAidmFsaWRhdGV3c2RsdWkiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0VSUk9SX1dST05HX0FSR1VNRU5UUyA9ICJfRVJST1JfV1JPTkdfQVJHVU1FTlRTIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9VSV9JTkZPUk1BVElPTl9ERUxJTUlURVIgPSAiX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfQUNUSU9OX1ZBTElEQVRJTkdfRklMRSA9ICJfVUlfQUNUSU9OX1ZBTElEQVRJTkdfRklMRSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfVkFMSUQgPSAiX1VJX1ZBTElEIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9VSV9JTlZBTElEID0gIl9VSV9JTlZBTElEIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9VSV9FUlJPUl9NQVJLRVIgPSAiX1VJX0VSUk9SX01BUktFUiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVUlfV0FSTklOR19NQVJLRVIgPSAiX1VJX1dBUk5JTkdfTUFSS0VSIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9FUlJPUl9VTkFCTEVfVE9fTE9BRF9FWFRfVkFMSURBVE9SID0gIl9FUlJPUl9VTkFCTEVfVE9fTE9BRF9FWFRfVkFMSURBVE9SIjsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9XU0RMMTFWQUwgPSAiLXdzZGwxMXYiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRVhUVkFMID0gIi1leHR2IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1NDSEVNQURJUiA9ICItc2NoZW1hRGlyIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1NDSEVNQSA9ICItc2NoZW1hIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1VSSVJFU09MVkVSID0gIi11cmlyZXNvbHZlciI7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0VNUFRZID0gIiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfU1BBQ0UgPSAiICI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfREFTSCA9ICItIjsKLSAgCi0gIAotICBwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0gIHByb3RlY3RlZCBMaXN0IGVycm9ycyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IHdhcm5pbmdzID0gbnVsbDsKLSAgcHJvdGVjdGVkIFdTRExWYWxpZGF0b3Igd3NkbFZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQ29uc3R1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBXU0RMVmFsaWRhdGUoKQotICB7Ci0gIAl3c2RsVmFsaWRhdG9yID0gbmV3IFdTRExWYWxpZGF0b3IoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgYWRkVVJJUmVzb2x2ZXIoSVVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gIAl3c2RsVmFsaWRhdG9yLmFkZFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBSdW4gV1NETCB2YWxpZGF0aW9uIG9uIGEgZ2l2ZW4gZmlsZS4KLSAgICogCi0gICAqIEBwYXJhbSBkaXJlY3RvcnkgLSB0aGUgY3VycmVudCBkaXIgZm9yIHJlc29sdmluZyByZWxhdGl2ZSBmaWxlIG5hbWVzCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JSQiAtIHRoZSBXU0RMIHZhbGlkYXRvciByZXNvdXJjZSBidW5kbGUKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0gIHByb3RlY3RlZCBJVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZUZpbGUoU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIGZpbGVuYW1lLCBSZXNvdXJjZUJ1bmRsZSB2YWxpZGF0b3JSQikKLSAgICB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICAvLwlyZXNvbHZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZQotICAgIFN0cmluZyBmaWxlbG9jYXRpb24gPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB0ZXN0ID0gU3RyaW5nVXRpbHMuZ2V0VVJMKG5ldyBVUkwoRklMRV9QUkVGSVggKyBkaXJlY3RvcnkgKyAiLyIpLCBmaWxlbmFtZSk7Ci0gICAgICBmaWxlbG9jYXRpb24gPSB0ZXN0LnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzb2x2ZSBXU0RMIGZpbGUgbG9jYXRpb24iKTsKLSAgICB9Ci0gICAgLy8gcnVuIHZhbGlkYXRpb24gb24gdGhlIGZpbGUgYW5kIHJlY29yZCB0aGUgZXJyb3JzIGFuZCB3YXJuaW5ncwotICAgIElWYWxpZGF0aW9uUmVwb3J0IHZhbFJlcG9ydCA9IHdzZGxWYWxpZGF0b3IudmFsaWRhdGUoZmlsZWxvY2F0aW9uKTsKLSAgICByZXR1cm4gdmFsUmVwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBTdHJpbmcgd2l0aCBmb3JtYXR0ZWQgb3V0cHV0IGZvciBhIGxpc3Qgb2YgbWVzc2FnZXMuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZXMgVGhlIG1lc3NhZ2VzIHRvIGdldC4KLSAgICogQHBhcmFtIGVycm9ybWFya2VyIFRoZSBtYXJrZXIgdG8gdXNlIHRvIGxhYmVsIGVycm9yIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gd2FybmluZ21hcmtlciBUaGUgbWFya2VyIHRvIHVzZSB0byBsYWJlbCB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKiBAcmV0dXJuIEEgc3RyaW5nIHdpdGggYSBmb3JtYXR0ZWQgbGlzdCBvZiB0aGUgbWVzc2FnZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1lc3NhZ2VzKElWYWxpZGF0aW9uTWVzc2FnZVtdIG1lc3NhZ2VzLCBTdHJpbmcgZXJyb3JtYXJrZXIsIFN0cmluZyB3YXJuaW5nbWFya2VyKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIG91dHB1dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBpZiAobWVzc2FnZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBjcmVhdGUgYSBsaXN0IG9mIG1lc3NhZ2VzIHRoYXQgbG9va3MgbGlrZQotICAgICAgLy8gRVJST1IgMToxIEVycm9yIG1lc3NhZ2UgY29udGVudAotICAgICAgaW50IG51bU1lc3NhZ2VzID0gbWVzc2FnZXMubGVuZ3RoOwotICAgICAgU3RyaW5nIG1hcmtlciA9IG51bGw7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU1lc3NhZ2VzOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZXNbaV07Ci0gICAgICAgIGludCBzZXZlcml0eSA9IG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKTsKLSAgICAgICAgaWYgKHNldmVyaXR5ID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXJrZXIgPSBlcnJvcm1hcmtlcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzZXZlcml0eSA9PSBJVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX1dBUk5JTkcpCi0gICAgICAgIHsKLSAgICAgICAgICBtYXJrZXIgPSB3YXJuaW5nbWFya2VyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1hcmtlciA9IFNUUklOR19FTVBUWTsKLSAgICAgICAgfQotICAgICAgICBvdXRwdXRCdWZmZXIKLSAgICAgICAgICAuYXBwZW5kKG1hcmtlcikKLSAgICAgICAgICAuYXBwZW5kKFNUUklOR19TUEFDRSkKLSAgICAgICAgICAuYXBwZW5kKG1lc3NhZ2UuZ2V0TGluZSgpKQotICAgICAgICAgIC5hcHBlbmQoIjoiKQotICAgICAgICAgIC5hcHBlbmQobWVzc2FnZS5nZXRDb2x1bW4oKSkKLSAgICAgICAgICAuYXBwZW5kKFNUUklOR19TUEFDRSkKLSAgICAgICAgICAuYXBwZW5kKG1lc3NhZ2UuZ2V0TWVzc2FnZSgpKQotICAgICAgICAgIC5hcHBlbmQoIlxuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvdXRwdXRCdWZmZXIudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWFpbiBlbnRyeSBwb2ludCBpbnRvIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4gCi0gICAqIENoZWNrcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgcmVnaXN0ZXJzIHRoZSBkZWZhdWx0IHZhbGlkYXRvcnMgYW5kIHJ1bnMgdmFsaWRhdGlvbiBvbiB0aGUKLSAgICogbGlzdCBvZiBmaWxlcy4KLSAgICogCi0gICAqIEBwYXJhbSBhcmdzIC0gdGhlIGFyZ3VtZW50cyB0byB0aGUgdmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgTGlzdCB3c2RsRmlsZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgTWVzc2FnZUdlbmVyYXRvciBtZXNzR2VuID0gbnVsbDsKLSAgICBSZXNvdXJjZUJ1bmRsZSB2YWxpZGF0b3JSQiA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2VCdW5kbGUgdWlSQiA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShVSV9QUk9QRVJUSUVTKTsKLSAgICAgIG1lc3NHZW4gPSBuZXcgTWVzc2FnZUdlbmVyYXRvcih1aVJCKTsKLSAgICAgIHZhbGlkYXRvclJCID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFZBTElEQVRPUl9QUk9QRVJUSUVTKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVmFsaWRhdGlvbiBmYWlsZWQ6IFVuYWJsZSB0byBsb2FkIHRoZSBwcm9wZXJ0aWVzIGZpbGUuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIG5vIGFyZ3VtZW50cyBzcGVjaWZpZWQuIFByaW50IHVzYWdlLgotICAgIGlmIChhcmdzLmxlbmd0aCA8IDEpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NHZW4uZ2V0U3RyaW5nKF9FUlJPUl9XUk9OR19BUkdVTUVOVFMpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQgYXJnc2xlbmd0aCA9IGFyZ3MubGVuZ3RoOwotCi0gICAgV1NETFZhbGlkYXRlIHdzZGxWYWxpZGF0b3IgPSBuZXcgV1NETFZhbGlkYXRlKCk7Ci0gICAgLy8gZ28gdGhyb3VnaCB0aGUgcGFyYW1ldGVycwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnc2xlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJhbSA9IGFyZ3NbaV07Ci0KLSAgICAgIC8vIHJlZ2lzdGVyaW5nIGEgdmFsaWRhdG9yCi0gICAgICBpZiAocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fV1NETDExVkFMKSB8fCBwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKFdTRExWYWxpZGF0ZS5QQVJBTV9FWFRWQUwpKQotICAgICAgewotCi0gICAgICAgIFN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IGFyZ3NbKytpXTsKLSAgICAgICAgaWYgKCF2YWxpZGF0b3JDbGFzcy5zdGFydHNXaXRoKFdTRExWYWxpZGF0ZS5TVFJJTkdfREFTSCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gYXJnc1srK2ldOwotCi0gICAgICAgICAgaWYgKCFuYW1lc3BhY2Uuc3RhcnRzV2l0aChXU0RMVmFsaWRhdGUuU1RSSU5HX0RBU0gpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzRmlsZS5zdGFydHNXaXRoKFdTRExWYWxpZGF0ZS5TVFJJTkdfREFTSCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHByb3BlcnRpZXNGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShXU0RMVmFsaWRhdGUuUEFSQU1fV1NETDExVkFMKSkKLSAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMMTFWYWxpZGF0b3JEZWxlZ2F0ZSh2YWxpZGF0b3JDbGFzcywgcHJvcGVydGllc0ZpbGUpOwotICAgICAgICAgICAgICB3c2RsVmFsaWRhdG9yLndzZGxWYWxpZGF0b3IucmVnaXN0ZXJXU0RMMTFWYWxpZGF0b3IobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoV1NETFZhbGlkYXRlLlBBUkFNX0VYVFZBTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFdTRExWYWxpZGF0b3JEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG5ldyBXU0RMVmFsaWRhdG9yRGVsZWdhdGUodmFsaWRhdG9yQ2xhc3MsIHByb3BlcnRpZXNGaWxlKTsKLSAgICAgICAgICAgICAgd3NkbFZhbGlkYXRvci53c2RsVmFsaWRhdG9yLnJlZ2lzdGVyV1NETEV4dGVuc2lvblZhbGlkYXRvcihuYW1lc3BhY2UsIGRlbGVnYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHZhbGlkYXRvckNsYXNzID0gbnVsbDsKLSAgICAgICAgICBpLS07Ci0gICAgICAgIH0gIAotICAgICAgfQotICAgICAgLy8gcmVnaXN0ZXJpbmcgYSBkaXJlY3Rvcnkgd2l0aCBzY2hlbWFzCi0gICAgICBlbHNlIGlmIChwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKFdTRExWYWxpZGF0ZS5QQVJBTV9TQ0hFTUFESVIpKQotICAgICAgewotICAgICAgICBTdHJpbmcgeHNkRGlyID0gYXJnc1srK2ldOwotICAgICAgICBYTUxDYXRhbG9nLmFkZFNjaGVtYURpcih4c2REaXIpOwotICAgICAgfQotICAgICAgLy8gcmVnaXN0ZXJpbmcgYSBzY2hlbWEKLSAgICAgIGVsc2UgaWYgKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoV1NETFZhbGlkYXRlLlBBUkFNX1NDSEVNQSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwdWJsaWNpZCA9IGFyZ3NbKytpXTsKLSAgICAgICAgU3RyaW5nIHN5c3RlbWlkID0gYXJnc1srK2ldOwotICAgICAgICBYTUxDYXRhbG9nLmFkZEVudGl0eShuZXcgWE1MQ2F0YWxvZ0VudGl0eUhvbGRlcihwdWJsaWNpZCwgc3lzdGVtaWQpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShQQVJBTV9VUklSRVNPTFZFUikpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyByZXNvbHZlckNsYXNzID0gYXJnc1srK2ldOwotICAgICAgICB3c2RsVmFsaWRhdG9yLmFkZFVSSVJlc29sdmVyKG5ldyBVUklSZXNvbHZlckRlbGVnYXRlKHJlc29sdmVyQ2xhc3MsIG51bGwpLmdldFVSSVJlc29sdmVyKCkpOwotICAgICAgfQotICAgICAgLy8gYSBmaWxlIHRvIHZhbGlkYXRlCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmKCFwYXJhbS5zdGFydHNXaXRoKFdTRExWYWxpZGF0ZS5TVFJJTkdfREFTSCkpCi0gICAgICAgIHsgIAotICAgICAgICAgIHdzZGxGaWxlcy5hZGQocGFyYW0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgLy8gdmFsaWRhdGUgdGhlIGZpbGUKLSAgICBTdHJpbmdCdWZmZXIgb3V0cHV0QnVmZmVyID0gbnVsbDsKLSAgICBTdHJpbmcgaW5mb0RlbGltID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX0lORk9STUFUSU9OX0RFTElNSVRFUik7Ci0gICAgU3RyaW5nIHZhbGlkID0gbWVzc0dlbi5nZXRTdHJpbmcoX1VJX1ZBTElEKTsKLSAgICBTdHJpbmcgaW52YWxpZCA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9JTlZBTElEKTsKLSAgICBTdHJpbmcgZXJyb3JtYXJrZXIgPSBtZXNzR2VuLmdldFN0cmluZyhfVUlfRVJST1JfTUFSS0VSKTsKLSAgICBTdHJpbmcgd2FybmluZ21hcmtlciA9IG1lc3NHZW4uZ2V0U3RyaW5nKF9VSV9XQVJOSU5HX01BUktFUik7Ci0KLSAgICBJdGVyYXRvciBmaWxlc0l0ZXIgPSB3c2RsRmlsZXMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZmlsZXNJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBvdXRwdXRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBTdHJpbmcgd3NkbEZpbGUgPSAoU3RyaW5nKWZpbGVzSXRlci5uZXh0KCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgSVZhbGlkYXRpb25SZXBvcnQgdmFsUmVwb3J0ID0gd3NkbFZhbGlkYXRvci52YWxpZGF0ZUZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpLCB3c2RsRmlsZSwgdmFsaWRhdG9yUkIpOwotCi0gICAgICAgIG91dHB1dEJ1ZmZlci5hcHBlbmQoaW5mb0RlbGltKS5hcHBlbmQoIlxuIik7Ci0gICAgICAgIG91dHB1dEJ1ZmZlci5hcHBlbmQobWVzc0dlbi5nZXRTdHJpbmcoX1VJX0FDVElPTl9WQUxJREFUSU5HX0ZJTEUsIHdzZGxGaWxlKSkuYXBwZW5kKCIgLSAiKTsKLSAgICAgICAgaWYgKCF2YWxSZXBvcnQuaGFzRXJyb3JzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKHZhbGlkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKGludmFsaWQpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dEJ1ZmZlci5hcHBlbmQoIlxuIikuYXBwZW5kKGluZm9EZWxpbSkuYXBwZW5kKCJcbiIpOwotICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKHdzZGxWYWxpZGF0b3IuZ2V0TWVzc2FnZXModmFsUmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpLCBlcnJvcm1hcmtlciwgd2FybmluZ21hcmtlcikpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ob3V0cHV0QnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMb2FkIGEgdmFsaWRhdG9yIGludG8gdGhlIHdzZGwgdmFsaWRhdGlvbiBmcmFtZXdvcmsgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZSB0aGUgdmFsaWRhdG9yIGNoZWNrcwotICAgKiBAcGFyYW0gdmFsaWRhdG9yQ2xhc3MgLSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhlIGltcGxlbWVudHMgSVdTRExWYWxpZGF0b3IKLSAgICogQHBhcmFtIHByb3BlcnRpZXNGaWxlIC0gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIHZhbGlkYXRvcgotICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgLSB0aGUgdHlwZSBvZiB2YWxpZGF0b3IgLSBXU0RMIG9yIFdTLUkKLSAgICogQHBhcmFtIG1lc3NHZW4gICAgICAgIC0gYSBNZXNzYWdlR2VuZXJhdG9yIGZvciBwcm9kdWNpbmcgZXJyb3IgbWVzc2FnZXMKLSAgICovCi0vLyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvYWRFeHRlbnNpb25WYWxpZGF0b3IoCi0vLyAgICBTdHJpbmcgbmFtZXNwYWNlLAotLy8gICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzLAotLy8gICAgU3RyaW5nIHByb3BlcnRpZXNGaWxlLAotLy8gICAgSW50ZWdlciB0eXBlLAotLy8gICAgTWVzc2FnZUdlbmVyYXRvciBtZXNzR2VuKQotLy8gIHsKLS8vICAgIHRyeQotLy8gICAgewotLy8gICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0vLyAgICAgIElXU0RMVmFsaWRhdG9yIHZhbGlkYXRvciA9IChJV1NETFZhbGlkYXRvciljbGFzc0xvYWRlci5sb2FkQ2xhc3ModmFsaWRhdG9yQ2xhc3MpLm5ld0luc3RhbmNlKCk7Ci0vLyAgICAgIC8vIGlmIG5vIHByb3BlcnRpZXMgZmlsZSBpcyBzcGVjaWZpZWQgd2UgY2FuIHN0aWxsIGxvYWQgdGhlIHZhbGlkYXRvcgotLy8gICAgICBpZiAocHJvcGVydGllc0ZpbGUgIT0gbnVsbCAmJiAhcHJvcGVydGllc0ZpbGUuZXF1YWxzKCIiKSkKLS8vICAgICAgewotLy8gICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHByb3BlcnRpZXNGaWxlKTsKLS8vICAgICAgICB2YWxpZGF0b3Iuc2V0UmVzb3VyY2VCdW5kbGUocmIpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UKLS8vICAgICAgewotLy8gICAgICAgIHByb3BlcnRpZXNGaWxlID0gbnVsbDsKLS8vICAgICAgfQotLy8KLS8vICAgICAgVmFsaWRhdG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlclZhbGlkYXRvcihuYW1lc3BhY2UsIHZhbGlkYXRvciwgdHlwZSk7Ci0vLyAgICB9Ci0vLyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0vLyAgICB7Ci0vLyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzR2VuLmdldFN0cmluZyhfRVJST1JfVU5BQkxFX1RPX0xPQURfRVhUX1ZBTElEQVRPUiwgbmFtZXNwYWNlLCBlKSk7Ci0vLyAgICB9Ci0vLwotLy8gIH0KLSAgLy8JLyoqCi0gIC8vCSAqIGxvYWRXU0RMMTFFeHRlbnNpb25WYWxpZGF0b3IKLSAgLy8JICogTG9hZCBhbiBleHRlbnNpb24gdmFsaWRhdG9yIGludG8gdGhlIFdTREwgMS4xIHZhbGlkYXRvcgotICAvLyAgICogQHBhcmFtIG5hbWVzcGFjZQotICAvLyAgICogQHBhcmFtIHZhbGlkYXRvckNsYXNzCi0gIC8vICAgKiBAcGFyYW0gcHJvcGVydGllc0ZpbGUKLSAgLy8gICAqIEBwYXJhbSB0eXBlCi0gIC8vICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIKLSAgLy8gICAqLwotICAvLyAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvYWRXU0RMMTFFeHRlbnNpb25WYWxpZGF0b3IoCi0gIC8vCQkJU3RyaW5nIG5hbWVzcGFjZSwKLSAgLy8JCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3MsCi0gIC8vCQkJU3RyaW5nIHJlc291cmNlQnVuZGxlLAotICAvLwkJCUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotICAvLwkJewotICAvLwkJCXRyeQotICAvLyB7Ci0gIC8vIAlDbGFzcyB2YWxjbGFzcyA9IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyh2YWxpZGF0b3JDbGFzcyk7Ci0gIC8vIAlJV1NETDExVmFsaWRhdG9yIHZhbGlkYXRvciA9IChJV1NETDExVmFsaWRhdG9yKXZhbGNsYXNzLm5ld0luc3RhbmNlKCk7Ci0gIC8vIAl2YWxpZGF0b3Iuc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlKSk7Ci0gIC8vIAlXU0RMQ29uZmlndXJhdG9yLnJlZ2lzdGVyV1NETDExVmFsaWRhdG9yKG5hbWVzcGFjZSx2YWxpZGF0b3IpOwotICAvLyB9Ci0gIC8vIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAvLyB7Ci0gIC8vCSBTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBsb2FkIHRoZSBXU0RMIDEuMSB2YWxpZGF0b3IgZm9yIG5hbWVzcGFjZSAiCi0gIC8vICsgbmFtZXNwYWNlICsgZSk7Ci0gIC8vIH0KLSAgLy8KLSAgLy8JCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvdmFsaWRhdGV3c2RsdWkucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvd3NkbHZhbGlkYXRldWkvdmFsaWRhdGV3c2RsdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5ZTgwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL3dzZGx2YWxpZGF0ZXVpL3ZhbGlkYXRld3NkbHVpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIS0tIEVjbGlwc2UgVUkgTWVzc2FnZSBEaWFsb2cKLV9WQUxJREFUSU9OX1NVQ0NFRURFRCAgICAgICAgICAgICAgICAgICAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVkFMSURBVElPTl9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW9uIEZhaWxlZAotX1VJX1RIRV9XU0RMX0ZJTEVfSVNfVkFMSUQgICAgICAgICAgICAgICAgID0gVGhlIFdTREwgZmlsZSBpcyB2YWxpZC4KLV9VSV9USEVfV1NETF9GSUxFX0lTX05PVF9WQUxJRCAgICAgICAgICAgICA9IFRoZSBXU0RMIGZpbGUgaXMgbm90IHZhbGlkLiBTZWUgdGhlIFByb2JsZW1zIHZpZXcgZm9yIGEgbGlzdCBvZiB0aGUgdmFsaWRhdGlvbiBlcnJvcnMuCi1fVUlfVEhFX1dTRExfRklMRV9JU19WQUxJRF9XU0RMMTEgICAgICAgICAgPSBUaGUgV1NETCBmaWxlIGlzIHZhbGlkIGFjY29yZGluZyB0byB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIGhvd2V2ZXIgYW4gZXh0ZW5zaW9uIHZhbGlkYXRvciBoYXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSBmaWxlIGlzIG5vdCB2YWxpZC4gU2VlIHRoZSBQcm9ibGVtcyB2aWV3IGZvciBhIGxpc3Qgb2YgdGhlIHZhbGlkYXRpb24gZXJyb3JzLgotX1VJX1RIRV9XU0RMX0ZJTEVfSVNfVkFMSURfV0lUSF9XQVJOSU5HUyAgID0gVGhlIFdTREwgZmlsZSBpcyB2YWxpZCBob3dldmVyIHdhcm5pbmdzIGhhdmUgYmVlbiBpc3N1ZWQuIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIHRoZSB2YWxpZGF0aW9uIHdhcm5pbmdzLgotCi0hLS0gQW50IFVJCi1fVUlfSU5GT1JNQVRJT05fREVMSU1JVEVSICAgICAgICAgICAgICAgICAgPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV9VSV9FUlJPUl9NQVJLRVIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVSUk9SICAKLV9VSV9XQVJOSU5HX01BUktFUiAgICAgICAgICAgICAgICAgICAgICAgICA9IFdBUk5JTkcKLV9VSV9WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZBTElECi1fVUlfSU5WQUxJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJTlZBTElECi1fVUlfQUNUSU9OX1ZBTElEQVRJTkdfRklMRSAgICAgICAgICAgICAgICAgPSBWYWxpZGF0aW5nIHswfQotCi1fRVJST1JfTk9fRklMRV9TUEVDSUZJRUQgICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gcnVuIFdTREwgVmFsaWRhdGlvbi4gWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgZmlsZS4KLQotX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfRklMRSAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIHZhbGlkYXRlIHRoZSBXU0RMIGZpbGUgezB9LiB7MX0KLV9FWENfV1NETF9GQUlMX09OX0VSUk9SICAgICAgICAgICAgICAgICAgICA9IFRoZSBXU0RMIGZpbGUgaXMgbm90IHZhbGlkLiAoRmFpbCBPbiBFcnJvciBpcyBlbmFibGVkLikKLQotIS0tIFRleHQgVUkKLV9FUlJPUl9XUk9OR19BUkdVTUVOVFMgICAgICAgICAgICAgICAgICAgICA9IFVzYWdlOiBXU0RMVmFsaWRhdGUgZmlsZW5hbWUiCi1fRVJST1JfVU5BQkxFX1RPX0xPQURfRVhUX1ZBTElEQVRPUiAgICAgICAgPSBVbmFibGUgdG8gbG9hZCB0aGUgdmFsaWRhdG9yIGZvciBuYW1lc3BhY2UgezB9LiB7MX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxODBiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtaHR0cCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1taW1lIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLXNvYXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtd3NkbCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjI5Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLXdzZGwuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Qud3NkbF8xLjAuMC5qYXIKLW9yZy5lY2xpcHNlLndzdC53c2RsLnBhdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjNTNiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzZGw8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjNlNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud3NkbDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IHdzZGwuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBtb2RlbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmdlbmVyYXRvciwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5nZW5lcmF0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eSwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLmV4dGVuc2lvbiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS54c2QsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLndzZGw0agotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKLVBsdWdpbi1DbGFzczogb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbkltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZjA5ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHdzZGwuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB4c2QvLFwKLSAgICAgICAgICAgICAgIGdyYWJqYXJzLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLWphcnMuY29tcGlsZS5vcmRlciA9IHdzZGwuamFyCi1zb3VyY2Uud3NkbC5qYXIgPSBzcmMtaHR0cC8sXAotICAgICAgICAgICAgICAgICAgc3JjLW1pbWUvLFwKLSAgICAgICAgICAgICAgICAgIHNyYy1zb2FwLyxcCi0gICAgICAgICAgICAgICAgICBzcmMtd3NkbC8KLW91dHB1dC53c2RsLmphciA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGxpYi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBncmFiamFycy54bWwsXAotICAgICAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHhzZC8sXAotICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCi0gICAgICAgICAgICAgICAucHJvamVjdCxcCi0gICAgICAgICAgICAgICBzcmMtd3NkbC8sXAotICAgICAgICAgICAgICAgc3JjLXNvYXAvLFwKLSAgICAgICAgICAgICAgIHNyYy1taW1lLyxcCi0gICAgICAgICAgICAgICBzcmMtaHR0cC8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICAuY3ZzaWdub3JlCi1iaW4uZXhjbHVkZXMgPSBsaWIvLmN2c2lnbm9yZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDljNTZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiCi0JbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwiPgotCTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC51aSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24iIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcud3NkbDRqIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJCaW5kaW5nRmF1bHQiIC8+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmdPdXRwdXQiIC8+Ci0JCTx0eXBlIG5hbWU9IlR5cGVzIiAvPgotCQk8dHlwZSBuYW1lPSJPcGVyYXRpb24iIC8+Ci0JCTx0eXBlIG5hbWU9IkZhdWx0IiAvPgotCQk8dHlwZSBuYW1lPSJFeHRlbnNpYmlsaXR5RWxlbWVudCIgLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZSIgLz4KLQkJPHR5cGUgbmFtZT0iRXh0ZW5zaWJsZUVsZW1lbnQiIC8+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmdJbnB1dCIgLz4KLQkJPHR5cGUgbmFtZT0iUG9ydFR5cGUiIC8+Ci0JCTx0eXBlIG5hbWU9IlNlcnZpY2UiIC8+Ci0JCTx0eXBlIG5hbWU9IklucHV0IiAvPgotCQk8dHlwZSBuYW1lPSJXU0RMRWxlbWVudCIgLz4KLQkJPHR5cGUgbmFtZT0iUG9ydCIgLz4KLQkJPHR5cGUgbmFtZT0iTmFtZXNwYWNlIiAvPgotCQk8dHlwZSBuYW1lPSJQYXJ0IiAvPgotCQk8dHlwZSBuYW1lPSJEZWZpbml0aW9uIiAvPgotCQk8dHlwZSBuYW1lPSJJbXBvcnQiIC8+Ci0JCTx0eXBlIG5hbWU9IlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiAvPgotCQk8dHlwZSBuYW1lPSJXU0RMUGx1Z2luIiAvPgotCQk8dHlwZSBuYW1lPSJXU0RMRmFjdG9yeSIgLz4KLQkJPHR5cGUgbmFtZT0iTWVzc2FnZVJlZmVyZW5jZSIgLz4KLQkJPHR5cGUgbmFtZT0iVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiAvPgotCQk8dHlwZSBuYW1lPSJPdXRwdXQiIC8+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmciIC8+Ci0JCTx0eXBlIG5hbWU9IkJpbmRpbmdPcGVyYXRpb24iIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJXU0RMQ29uc3RhbnRzIiAvPgotCQk8dHlwZSBuYW1lPSJFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSIgLz4KLQkJPHR5cGUgbmFtZT0iV1NETFJlc291cmNlRmFjdG9yeUltcGwiIC8+Ci0JCTx0eXBlIG5hbWU9IkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSIgLz4KLQkJPHR5cGUgbmFtZT0iV1NETFJlc291cmNlSW1wbCIgc3ViY2xhc3M9ImZhbHNlIi8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcCIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlNPQVBCb2R5IiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQSGVhZGVyRmF1bHQiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBBZGRyZXNzIiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQRmFjdG9yeSIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEhlYWRlciIgLz4KLQkJPHR5cGUgbmFtZT0iU09BUEJpbmRpbmciIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBIZWFkZXJCYXNlIiAvPgotCQk8dHlwZSBuYW1lPSJTT0FQRmF1bHQiIC8+Ci0JCTx0eXBlIG5hbWU9IlNPQVBPcGVyYXRpb24iIC8+Ci0JPC9wYWNrYWdlPgotPCEtLSBwcm92aXNpb25hbCBBUElzIC0tPgotPCEtLQotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZSI+Ci0JCTx0eXBlIG5hbWU9Ik1JTUVDb250ZW50IiAvPgotCQk8dHlwZSBuYW1lPSJNSU1FUGFja2FnZSIgLz4KLQkJPHR5cGUgbmFtZT0iTUlNRU11bHRpcGFydFJlbGF0ZWQiIC8+Ci0JCTx0eXBlIG5hbWU9Ik1JTUVQYXJ0IiAvPgotCQk8dHlwZSBuYW1lPSJNSU1FTWltZVhtbCIgLz4KLQkJPHR5cGUgbmFtZT0iTUlNRUZhY3RvcnkiIC8+Ci0JPC9wYWNrYWdlPgotLS0+Ci08IS0tCi0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwIj4KLQkJPHR5cGUgbmFtZT0iSFRUUEZhY3RvcnkiIC8+Ci0JCTx0eXBlIG5hbWU9IkhUVFBPcGVyYXRpb24iIC8+Ci0JCTx0eXBlIG5hbWU9IkhUVFBVcmxFbmNvZGVkIiAvPgotCQk8dHlwZSBuYW1lPSJIVFRQUGFja2FnZSIgLz4KLQkJPHR5cGUgbmFtZT0iSFRUUEFkZHJlc3MiIC8+Ci0JCTx0eXBlIG5hbWU9IkhUVFBVcmxSZXBsYWNlbWVudCIgLz4KLQkJPHR5cGUgbmFtZT0iSFRUUEJpbmRpbmciIC8+Ci0JPC9wYWNrYWdlPgotLS0+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvZ3JhYmphcnMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9ncmFiamFycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNmVkYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9ncmFiamFycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJjb3B5SmFycyIgYmFzZWRpcj0iLiI+Ci0KLQk8cHJvcGVydHkgbmFtZT0icGx1Z2luTmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0JPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIiLz4KLQotCTx0YXJnZXQgbmFtZT0iY29weUphcnMiIGlmPSJkb3dubG9hZFBhdGgiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNvcHlKYXJzMiIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY29weUphcnMyIiBpZj0icGx1Z2luc1BhdGgiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNvcHlKYXJzMyIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjb3B5SmFyczMiIGlmPSJwbHVnaW5OYW1lIj4KLQkJPGNvcHkgdG9kaXI9IiR7cGx1Z2luc1BhdGh9LyR7cGx1Z2luTmFtZX0ke3ZlcnNpb259L2xpYiIgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJCTxmaWxlc2V0IGRpcj0iJHtkb3dubG9hZFBhdGh9LyR7cGx1Z2luTmFtZX0ke3ZlcnNpb259Ij4KLQkJCQk8ZmlsZW5hbWUgbmFtZT0iKi5qYXIiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9jb3B5PgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xlYW51cEphcnMiIGlmPSJwbHVnaW5zUGF0aCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY2xlYW51cEphcnMyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXBKYXJzMiIgaWY9InBsdWdpbk5hbWUiPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke3BsdWdpbnNQYXRofS8ke3BsdWdpbk5hbWV9JHt2ZXJzaW9ufS9saWIiPgotCQkJCTxmaWxlbmFtZSBuYW1lPSIqLmphciIvPgotCQkJPC9maWxlc2V0PgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9saWIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvbGliLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTJmMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9saWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSouamFyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkYWY5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gV1NETCBNb2RlbAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQoteHBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyA9IFdTREwgRXh0ZW5zaWJpbGl0eSBFbGVtZW50IEZhY3RvcmllcwoteHBQb3J0QW5kQmluZGluZ0NvbnRlbnRHZW5lcmF0b3JzID0gUG9ydCBhbmQgQmluZGluZyBDb250ZW50IEdlbmVyYXRvcnMKLXhwV1NETENvbnRlbnRUeXBlID0gV1NETCBDb250ZW50IFR5cGUKLQotX0VSUk9SX0lOVkFMSURfV1NETCA9IFRoZSBpbnB1dCBzb3VyY2UgaXMgbm90IGEgdmFsaWQgV1NETCBkb2N1bWVudC4KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGYwMjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3JpZXMiCi0JCW5hbWU9IiV4cEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIiAvPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImNvbnRlbnRHZW5lcmF0b3JzIgotCQluYW1lPSIleHBQb3J0QW5kQmluZGluZ0NvbnRlbnRHZW5lcmF0b3JzIiAvPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLQkJPHBhY2thZ2UKLQkJCXVyaT0iaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9XU0RMIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlIj4KLQkJPC9wYWNrYWdlPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KLQkJPHBhcnNlcgotCQkJdHlwZT0id3NkbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsIj4KLQkJPC9wYXJzZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotCQk8cGFja2FnZQotCQkJdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzZGwvMjAwMy9IVFRQIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSI+Ci0JCTwvcGFja2FnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLmV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIj4KLQkJPGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotCQkJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotCQk8cGFja2FnZQotCQkJdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzZGwvMjAwMy9NSU1FIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSI+Ci0JCTwvcGFja2FnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLmV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIj4KLQkJPGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotCQkJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsLk1JTUVFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotCQk8cGFja2FnZQotCQkJdXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzZGwvMjAwMy9TT0FQIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSI+Ci0JCTwvcGFja2FnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLmV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yaWVzIj4KLQkJPGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotCQkJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC5jb250ZW50R2VuZXJhdG9ycyI+Ci0JCTxjb250ZW50R2VuZXJhdG9yCi0JCQluYW1lPSJTT0FQIgotCQkJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5nZW5lcmF0b3IuU09BUENvbnRlbnRHZW5lcmF0b3IiPgotCQk8L2NvbnRlbnRHZW5lcmF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Qud3NkbC5jb250ZW50R2VuZXJhdG9ycyI+Ci0JCTxjb250ZW50R2VuZXJhdG9yCi0JCQluYW1lPSJIVFRQIgotCQkJbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5nZW5lcmF0b3IuSFRUUENvbnRlbnRHZW5lcmF0b3IiPgotCQk8L2NvbnRlbnRHZW5lcmF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQotCi0JPCEtLSBkZWZpbmUgYSB3c2RsIGNvbnRlbnQgdHlwZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIleHBXU0RMQ29udGVudFR5cGUiCi0JCQlpZD0id3NkbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiCi0JCQlmaWxlLWV4dGVuc2lvbnM9IndzZGwiIC8+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvbW9kZWwvSFRUUC5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvbW9kZWwvSFRUUC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjNDE1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL21vZGVsL0hUVFAuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLmh0dHAvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcuaHR0cC5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLmh0dHAuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcuaHR0cCIgbW9kZWxOYW1lPSJIVFRQIiBlZGl0UGx1Z2luQ2xhc3M9IiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMvbW9kZWwvWFNELmdlbm1vZGVsIy8veHNkIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXGh0dHAubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+VkFCQVNFX1BMVUdJTlNfUEFUSDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IldTREwiIGJhc2VQYWNrYWdlPSJjb20uaWJtLmV0b29scyIgZWNvcmVQYWNrYWdlPSJ3c2RsLmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1FOYW1lIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTUVsZW1lbnQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9XU0RMRXhjZXB0aW9uIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRG9jdW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9kb2N1bWVudGF0aW9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9lbGVtZW50Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2dldEVuY2xvc2luZ0RlZmluaXRpb24iLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbi9kZWZpbml0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvZU9wZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9zdHlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lT3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZVBhcmFtZXRlck9yZGVyaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2UvZVBhcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9QYXJ0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC90eXBlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZU1lc3NhZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VQb3J0VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lQmluZGluZ09wZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdGYXVsdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1NlcnZpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vU2VydmljZS9lUG9ydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BvcnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9yZXF1aXJlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9lbGVtZW50VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vbG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VuY29kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VNZXNzYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lUG9ydFR5cGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VCaW5kaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lU2VydmljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU5hbWVzcGFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVR5cGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VJbXBvcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vZ2V0RG9jdW1lbnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudC9kb2N1bWVudCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW1wb3J0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9JbXBvcnQvbG9jYXRpb25VUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9nZXRTY2hlbWEiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudC9leHRFbGVtZW50Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbnB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PdXRwdXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRmF1bHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2VJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvZ2V0SW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQvaW5wdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9lT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dC9vdXRwdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9lRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2dldEZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0L2ZhdWx0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9OYW1lc3BhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9wcmVmaXgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0VHlwZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24vb3BlcmF0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vaW5wdXROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9vdXRwdXROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdC9mYXVsdCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRQYXJhbWV0ZXJPcmRlcmluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nL3BhcmFtZXRlck9yZGVyIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0SW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dC9pbnB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldE91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQvb3V0cHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSW5wdXQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU91dHB1dCI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPdXRwdXQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPdXRwdXQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRmF1bHQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0L3BhcnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0T3JkZXJlZFBhcnRzL3BhcnRPcmRlciIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBhcnQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlL3ZhbHVlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lTZXJ2aWNlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydC9wb3J0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9nZXRCaW5kaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmcvYmluZGluZyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmciPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uL2JpbmRpbmdPcGVyYXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9uYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9pbnB1dE5hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL291dHB1dE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbnMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0UG9ydFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlL3BvcnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vYWRkQmluZGluZ0ZhdWx0L2JpbmRpbmdGYXVsdCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0T3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uL29wZXJhdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nSW5wdXQvYmluZGluZ0lucHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dC9iaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0lucHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nRmF1bHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZy9iaW5kaW5nIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0L2ltcG9ydERlZiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UvcHJlZml4Ii8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL25hbWVzcGFjZVVSSSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUvcG9ydFR5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZS9zZXJ2aWNlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ091dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlSW1wb3J0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUlucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQYXJ0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlU2VydmljZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZ3MiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlL3ByZWZpeCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeC9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEV4dGVuc2lvblJlZ2lzdHJ5Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeS9leHRlbnNpb25SZWdpc3RyeSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXREb2N1bWVudEJhc2VVUkkiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkvZG9jdW1lbnRCYXNlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVR5cGVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlUG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFR5cGVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcy90eXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUltcG9ydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lVUkwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1R5cGVzIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJdGVyYXRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVHlwZXMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L3BhcmVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvY2hpbGRyZW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50L3NjaGVtYSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL2VNZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJIVFRQIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nIiBlY29yZVBhY2thZ2U9Imh0dHAuZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0hUVFBCaW5kaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBodHRwLmVjb3JlIy8vSFRUUEJpbmRpbmcvdmVyYiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSFRUUE9wZXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaHR0cC5lY29yZSMvL0hUVFBPcGVyYXRpb24vbG9jYXRpb25VUkkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0hUVFBVcmxSZXBsYWNlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9IVFRQVXJsRW5jb2RlZCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9IVFRQQWRkcmVzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaHR0cC5lY29yZSMvL0hUVFBBZGRyZXNzL2xvY2F0aW9uVVJJIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9JSFRUUEFkZHJlc3MiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJodHRwLmVjb3JlIy8vSUhUVFBCaW5kaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0lIVFRQT3BlcmF0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaHR0cC5lY29yZSMvL0lIVFRQVXJsRW5jb2RlZCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imh0dHAuZWNvcmUjLy9JSFRUUFVybFJlcGxhY2VtZW50Ii8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLkhUVFAuY2F0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLkhUVFAuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjMyMDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvbW9kZWwvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5IVFRQLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0MgotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJodHRwIgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgcXVpZCAgICAgICAJIjNBQkZEOUFEMDFGOCIKLSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIgotICAgIGxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzcyAiSFRUUEJpbmRpbmciCi0JICAgIHF1aWQgICAgICAgCSIzQUJGRTU3QzAxMzYiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUU1RkYxRDAwMTkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmVyYiIKLQkJICAgIHF1aWQgICAgICAgCSIzQUJGRTYwRDAwREIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJIVFRQT3BlcmF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0FCRkU2QUUwMDUwIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNUZGNEIwMzdDIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBQkZFNzBEMDE0NyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkhUVFBVcmxSZXBsYWNlbWVudCIKLQkgICAgcXVpZCAgICAgICAJIjNBQkZFQTFBMDE3QyIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRTcyOEI4MDJDMyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSFRUUFVybEVuY29kZWQiCi0JICAgIHF1aWQgICAgICAgCSIzQUJGRUE2RDAyOTQiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUU3MjhENTAwOTQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkhUVFBBZGRyZXNzIgotCSAgICBxdWlkICAgICAgIAkiM0FDM0JGMjUwMEY1IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNUZFQTkwMUI3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBQzNCRkE3MDEyRSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUG9ydCIKLQkgICAgcXVpZCAgICAgICAJIjNBQzExRTUyMDFGQiIKLQkgICAgdGl0bGUgICAgICAJIlBvcnQiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQWRkcmVzcyIgQDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2LCA0MzIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoMTM1LCAzNTEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDAyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSFRUUEFkZHJlc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQzNCRjI1MDBGNSIKLQkJICAgIHdpZHRoICAgICAgCTQyMAotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiCi0JICAgIHF1aWQgICAgICAgCSIzQUU1RkUzQjAzN0IiCi0JICAgIHRpdGxlICAgICAgCSJFeHRlbnNpYmlsaXR5IgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMTI4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlpdGFsaWNzICAgIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDcwLCA1MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkgICAgd2lkdGggICAgICAJNDIyCi0JCSAgICBoZWlnaHQgICAgIAkxNzQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEFkZHJlc3MiIEAzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgNDgwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMwotCQkJbG9jYXRpb24gICAJKDEyOCwgNDI4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI4OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkhUVFBBZGRyZXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUMzQkYyNTAwRjUiCi0JCSAgICB3aWR0aCAgICAgIAkzMDYKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQmluZGluZyIgQDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA2NDApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0Ci0JCQlsb2NhdGlvbiAgIAkoMzQ0LCA1ODgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSFRUUEJpbmRpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFNTdDMDEzNiIKLQkJICAgIHdpZHRoICAgICAgCTI5MAotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMzA1KQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUAyCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgyNzIsIDMwNSkKLQkJCSgyNzIsIDIxNSkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFNUZFQTkwMUI3IgotCQkgICAgY2xpZW50ICAgICAJQDMKLQkJICAgIHN1cHBsaWVyICAgCUAyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI3MiwgNDE2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgMzA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTVGRjFEMDAxOSIKLQkJICAgIGNsaWVudCAgICAgCUA0Ci0JCSAgICBzdXBwbGllciAgIAlAMgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzUsIDU3NikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzUsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUE9wZXJhdGlvbiIgQDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNjcyLCA4MTYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4Ci0JCQlsb2NhdGlvbiAgIAkoNTE4LCA3NjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzA4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSFRUUE9wZXJhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FCRkU2QUUwMDUwIgotCQkgICAgd2lkdGggICAgICAJMzI2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUU1RkY0QjAzN0MiCi0JCSAgICBjbGllbnQgICAgIAlAOAotCQkgICAgc3VwcGxpZXIgICAJQDIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjU2LCA3NTIpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAzMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxSZXBsYWNlbWVudCIgQDEwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgOTkyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCWxvY2F0aW9uICAgCSg2MDUsIDk0MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIVFRQVXJsUmVwbGFjZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFQTFBMDE3QyIKLQkJICAgIHdpZHRoICAgICAgCTQ0MAotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTcyOEI4MDJDMyIKLQkJICAgIGNsaWVudCAgICAgCUAxMAotCQkgICAgc3VwcGxpZXIgICAJQDIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODY5LCA5MjkpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY5LCAzMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxFbmNvZGVkIiBAMTIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgMTE2OCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEyCi0JCQlsb2NhdGlvbiAgIAkoOTAwLCAxMTE3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkhUVFBVcmxFbmNvZGVkIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRUE2RDAyOTQiCi0JCSAgICB3aWR0aCAgICAgIAkzNjIKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTMKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUU3MjhENTAwOTQiCi0JCSAgICBjbGllbnQgICAgIAlAMTIKLQkJICAgIHN1cHBsaWVyICAgCUAyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMDMsIDExMDUpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEwMywgMzA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJCaW5kaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0FFNzJBNzAwMEE5IgotCSAgICB0aXRsZSAgICAgIAkiQmluZGluZyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBCaW5kaW5nIiBAMTQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzM2LCAyNzIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNAotCQkJbG9jYXRpb24gICAJKDIwMCwgMjIwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkhUVFBCaW5kaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRTU3QzAxMzYiCi0JCSAgICB3aWR0aCAgICAgIAkyOTAKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQT3BlcmF0aW9uIiBAMTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNzIwLCAyNzIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDUxOSwgMTkxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQwMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkhUVFBPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFNkFFMDA1MCIKLQkJICAgIHdpZHRoICAgICAgCTQyMAotCQkgICAgaGVpZ2h0ICAgICAJMTg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxSZXBsYWNlbWVudCIgQDE2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDg0OCwgNTkyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTYKLQkJCWxvY2F0aW9uICAgCSg2MzcsIDU0MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJIVFRQVXJsUmVwbGFjZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQkZFQTFBMDE3QyIKLQkJICAgIHdpZHRoICAgICAgCTQ0MAotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxFbmNvZGVkIiBAMTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzg0LCA1OTIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNwotCQkJbG9jYXRpb24gICAJKDIxMiwgNTQxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkhUVFBVcmxFbmNvZGVkIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUJGRUE2RDAyOTQiCi0JCSAgICB3aWR0aCAgICAgIAkzNjIKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKSkpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL21vZGVsL2h0dHAuZWNvcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL21vZGVsL2h0dHAuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMTAzOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9odHRwLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iaHR0cCIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9IVFRQIiBuc1ByZWZpeD0iaHR0cCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUEJpbmRpbmciIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSUhUVFBCaW5kaW5nIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyYiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIVFRQT3BlcmF0aW9uIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lIVFRQT3BlcmF0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSFRUUFVybFJlcGxhY2VtZW50IiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lIVFRQVXJsUmVwbGFjZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIVFRQVXJsRW5jb2RlZCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUFVybEVuY29kZWQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJIVFRQQWRkcmVzcyIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JSFRUUEFkZHJlc3MiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvblVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSFRUUEFkZHJlc3MiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSFRUUEJpbmRpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSFRUUE9wZXJhdGlvbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24iCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBVcmxFbmNvZGVkIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUhUVFBVcmxSZXBsYWNlbWVudCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiLz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL21vZGVsL2h0dHAubWRsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9tb2RlbC9odHRwLm1kbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRlMmJlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL21vZGVsL2h0dHAubWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIzODMgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDIKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGRlZmF1bHRzICAgCShvYmplY3QgZGVmYXVsdHMKLQlyaWdodE1hcmdpbiAJMC4yNTAwMDAKLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMAotCXRvcE1hcmdpbiAgCTAuMjUwMDAwCi0JYm90dG9tTWFyZ2luIAkwLjUwMDAwMAotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMAotCWNsaXBJY29uTGFiZWxzIAlUUlVFCi0JYXV0b1Jlc2l6ZSAJVFJVRQotCXNuYXBUb0dyaWQgCVRSVUUKLQlncmlkWCAgICAgIAkxNgotCWdyaWRZICAgICAgCTE2Ci0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udAotCSAgICBzaXplICAgICAgIAkxMAotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JICAgIGJvbGQgICAgICAgCUZBTFNFCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JICAgIHVuZGVybGluZSAgCUZBTFNFCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JICAgIGNvbG9yICAgICAgCTAKLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQlzaG93TWVzc2FnZU51bSAJMQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3IgotCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTEiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxOEMiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyIKLQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTUwIgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyIKLQlxdWlkdSAgICAgIAkiM0FCRkQ5QTcwMTUyIgotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImh0dHAiCi0JCXF1aWQgICAgICAgCSIzQUJGRDlBRDAxRjgiCi0JCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzICJIVFRQQmluZGluZyIKLQkJCXF1aWQgICAgICAgCSIzQUJGRTU3QzAxMzYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFNUZGMUQwMDE5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0M0YxMDNDMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUEJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0M0E3MDJFQiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJiIgotCQkJCXF1aWQgICAgICAgCSIzQUJGRTYwRDAwREIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSFRUUE9wZXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQUJGRTZBRTAwNTAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFNUZGNEIwMzdDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjQwOTg0NDQ2MDJDQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpodHRwOjpJSFRUUE9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQzRkYwMkJCIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUJGRTcwRDAxNDciCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSFRUUFVybFJlcGxhY2VtZW50IgotCQkJcXVpZCAgICAgICAJIjNBQkZFQTFBMDE3QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUU3MjhCODAyQzMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0RDIwMkM1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQVXJsUmVwbGFjZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjQwOTg0NDk2MDBEOCIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSFRUUFVybEVuY29kZWQiCi0JCQlxdWlkICAgICAgIAkiM0FCRkVBNkQwMjk0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTcyOEQ1MDA5NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSI0MDk4NDQ5MTAwMDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBVcmxFbmNvZGVkIgotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ1NzAwNjMiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkhUVFBBZGRyZXNzIgotCQkJcXVpZCAgICAgICAJIjNBQzNCRjI1MDBGNSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUU1RkVBOTAxQjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiNDA5ODQwRDgwMEM0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQQWRkcmVzcyIKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQwODkwMUExIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUMzQkZBNzAxMkUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUhUVFBBZGRyZXNzIgotCQkJcXVpZCAgICAgICAJIjQwOTg0MDg5MDFBMSIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIgotCQkJCXF1aWQgICAgICAgCSI0MDk4NDBBNDAxM0EiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUhUVFBCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjQwOTg0M0E3MDJFQiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSI0MDk4NDNDQTAxNzciCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUhUVFBPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiNDA5ODQzRkYwMkJCIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0MTMwMjA0IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQVXJsRW5jb2RlZCIKLQkJCXF1aWQgICAgICAgCSI0MDk4NDQ1NzAwNjMiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCIKLQkJCQlxdWlkICAgICAgIAkiNDA5ODQ0NkQwMjFDIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklIVFRQVXJsUmVwbGFjZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiNDA5ODQ0OTYwMEQ4IgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IgotCQkJCXF1aWQgICAgICAgCSI0MDk4NDRBQzAxQUIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKSkKLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUMxMUU1MjAxRkIiCi0JCQl0aXRsZSAgICAgIAkiUG9ydCIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEFkZHJlc3MiIEAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NzIsIDc4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgNzAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQQWRkcmVzcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQzNCRjI1MDBGNSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MSwgNzYzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOSkKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQQWRkcmVzcyIgQDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY3MiwgMjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4LCAyMjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSFRUUEFkZHJlc3MiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4LCAxNzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQwODkwMUExIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4LCAyODkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA2NSkKLQkJCQl3aWR0aCAgICAgIAkxMDg2Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjQwOTg0MEQ4MDBDNCIKLQkJCQljbGllbnQgICAgIAlAMQotCQkJCXN1cHBsaWVyICAgCUAyCi0JCQkJbGluZV9zdHlsZSAJMCkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiCi0JCQlxdWlkICAgICAgIAkiM0FFNUZFM0IwMzdCIgotCQkJdGl0bGUgICAgICAJIkV4dGVuc2liaWxpdHkiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBANAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxMjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MCwgNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCXdpZHRoICAgICAgCTQyMgotCQkJCWhlaWdodCAgICAgCTE3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEFkZHJlc3MiIEA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgNDgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCA0MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBBZGRyZXNzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FDM0JGMjUwMEY1IgotCQkJCXdpZHRoICAgICAgCTMwNgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUEJpbmRpbmciIEA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ0LCA1ODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FCRkU1N0MwMTM2IgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3Ci0JCQkJbG9jYXRpb24gICAJKDI3MiwgMzA1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyNzIsIDMwNSkKLQkJCQkgICAgKDI3MiwgMjE1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTVGRUE5MDFCNyIKLQkJCQljbGllbnQgICAgIAlANQotCQkJCXN1cHBsaWVyICAgCUA0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA0MTYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTVGRjFEMDAxOSIKLQkJCQljbGllbnQgICAgIAlANgotCQkJCXN1cHBsaWVyICAgCUA0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDc1LCA1NzYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3NSwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQT3BlcmF0aW9uIiBAMTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjcyLCA4MTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTE4LCA3NjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzA4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUJGRTZBRTAwNTAiCi0JCQkJd2lkdGggICAgICAJMzI2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUU1RkY0QjAzN0MiCi0JCQkJY2xpZW50ICAgICAJQDEwCi0JCQkJc3VwcGxpZXIgICAJQDQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDc1MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAzMDUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxSZXBsYWNlbWVudCIgQDEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgOTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDYwNSwgOTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQVXJsUmVwbGFjZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUJGRUExQTAxN0MiCi0JCQkJd2lkdGggICAgICAJNDQwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUU3MjhCODAyQzMiCi0JCQkJY2xpZW50ICAgICAJQDEyCi0JCQkJc3VwcGxpZXIgICAJQDQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjksIDkyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY5LCAzMDUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OkhUVFBVcmxFbmNvZGVkIiBAMTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA3MiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDAsIDExMTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkhUVFBVcmxFbmNvZGVkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FCRkVBNkQwMjk0IgotCQkJCXdpZHRoICAgICAgCTM2MgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFNzI4RDUwMDk0IgotCQkJCWNsaWVudCAgICAgCUAxNAotCQkJCXN1cHBsaWVyICAgCUA0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEwMywgMTEwNSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEwMywgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDcpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjNBRTcyQTcwMDBBOSIKLQkJCXRpdGxlICAgICAgCSJCaW5kaW5nIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQQmluZGluZyIgQDE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDU5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NDAsIDU0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSFRUUEJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUJGRTU3QzAxMzYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQwLCA2MDApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc1KQotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SFRUUE9wZXJhdGlvbiIgQDE3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjk2LCA2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgNTI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FCRkU2QUUwMDUwIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDU4NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MDkpCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsUmVwbGFjZW1lbnQiIEAxOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYxNiwgMTgwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDA1LCAxNzU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQVXJsUmVwbGFjZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUJGRUExQTAxN0MiCi0JCQkJd2lkdGggICAgICAJNDQwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpodHRwOjpIVFRQVXJsRW5jb2RlZCIgQDE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1MjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDM2LCAxNDY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJIVFRQVXJsRW5jb2RlZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQkZFQTZEMDI5NCIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQQmluZGluZyIgQDIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUhUVFBCaW5kaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgNTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQzQTcwMkVCIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwLCAxNjEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA1MCkKLQkJCQl3aWR0aCAgICAgIAkxMDcwCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDNGMTAzQzAiCi0JCQkJY2xpZW50ICAgICAJQDE2Ci0JCQkJc3VwcGxpZXIgICAJQDIwCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQT3BlcmF0aW9uIiBAMjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2OTYsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTUwLCAxMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSFRUUE9wZXJhdGlvbiIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1MCwgNTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQzRkYwMkJCIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTAsIDE2MSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkxMDkwKQotCQkJCXdpZHRoICAgICAgCTExMTAKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjQwOTg0NDQ2MDJDQyIKLQkJCQljbGllbnQgICAgIAlAMTcKLQkJCQlzdXBwbGllciAgIAlAMjIKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aHR0cDo6SUhUVFBVcmxFbmNvZGVkIiBAMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDYwOCwgMTEwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NCwgMTA0NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklIVFRQVXJsRW5jb2RlZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDk5NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ1NzAwNjMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDExMDUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMTEyNSkKLQkJCQl3aWR0aCAgICAgIAkxMTQ2Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSI0MDk4NDQ5MTAwMDkiCi0JCQkJY2xpZW50ICAgICAJQDE5Ci0JCQkJc3VwcGxpZXIgICAJQDI0Ci0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omh0dHA6OklIVFRQVXJsUmVwbGFjZW1lbnQiIEAyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTM3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5ODEsIDEzMTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTIwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSFRUUFVybFJlcGxhY2VtZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5ODEsIDEyNjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTIwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDA5ODQ0OTYwMEQ4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDk4MSwgMTM3NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkxMjAzKQotCQkJCXdpZHRoICAgICAgCTEyMjQKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjQwOTg0NEQyMDJDNSIKLQkJCQljbGllbnQgICAgIAlAMTgKLQkJCQlzdXBwbGllciAgIAlAMjYKLQkJCQlsaW5lX3N0eWxlIAkwKSkpKSkKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCIKLQkJcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSIKLQkJZG9jdW1lbnRhdGlvbiAJCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuCi18Ci18V1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50LgotfAotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuCi18Ci18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkKLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQotfC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETAotfC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLgotfAotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLgotCQkKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiCi0JCQkJcmVzdWx0ICAgICAJIkRlZmluaXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENEZEMDFCQSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiCi0JCQkJdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTIwMDExQiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDA1NTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODdDMDFGRSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRDIwMjI2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNEIwMkIwIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ1NDIwMEYxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODk3RTIzMDIzNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDA5MjAyRjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUM0Q0IwMTk5IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNlcnZpY2UiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRDNTAxRTIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQ1MDJDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFdTREwgYWxsb3dzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxNDkwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0FGOTU0M0MwMDczIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I4NUIyMUEwMjcxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRjgwMzgyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiIKLQkJCQlyZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXREb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50IgotCQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkltcG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIFdTREwgaW1wb3J0IGVsZW1lbnQuIFdTREwgYWxsb3dzIGFzc29jaWF0aW5nIGEgbmFtZXNwYWNlIHdpdGggYSBkb2N1bWVudCBsb2NhdGlvbiB1c2luZyBhbiBpbXBvcnQgZWxlbWVudC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUVFNTgwMzdBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzNzkiCi0JCQkJcmVzdWx0ICAgICAJIlhTRFNjaGVtYSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzk3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSIKLQkJCQkJdHlwZSAgICAgICAJIlhTRFNjaGVtYSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MEEwMDM2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUxNDAyMTEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0RWxlbWVudCIKLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QzUwNDAyNUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MEMwMzVCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIGlucHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTFCMDExMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNBNDAyMDMiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNCNTAzQTIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzFFQTAyMEUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ091dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU0MzAyQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0YxMDMyNiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiIKLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJRTmFtZSIKLQkJCXF1aWQgICAgICAgCSIzQUU4RUQyMjAxNDAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIgotCQkJcXVpZCAgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBuYW1lc3BhY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZSBwcmVmaXggdXNlZCBpbiBhIFdTREwgZG9jdW1lbnQuIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDI5MDFCMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDMyMDIzNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb25UeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiIKLQkJCWRvY3VtZW50YXRpb24gCQotfE9ORV9XQVk9MQotfFJFUVVFU1RfUkVTUE9OU0U9MgotfFNPTElDSVRfUkVTUE9OU0U9MwotfE5PVElGSUNBVElPTj00Ci0JCQkKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzM1MzAzRTMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNCODRBNUJFMDMzMSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTYzMjAwMEQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3NzYwMEQxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlck9yZGVyIgotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTRFNTAxOEQiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJDNDAxMDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRTQwMDk0IgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTc5OTAxMkIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLklucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDNBMDM1RCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ0NTAxQzgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODM5MDFENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NkEwMEJEIgotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTg3MTAyMDgiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNZXNzYWdlIgotCQkJcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0IgotCQkJCQl0eXBlICAgICAgIAkiSVBhcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjNEMDIzMyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjU0MDI1RSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNjEwMjBEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnRPcmRlciIKLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUGFydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODQ1MDA1MiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCWV4Y2VwdGlvbnMgCSJXU0RMRXhjZXB0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTAxMDFDMyIKLQkJCQlyZXN1bHQgICAgIAkiSUl0ZXJhdG9yIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEyRDAyRDUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIlFOYW1lIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NTAwMjMxIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJU2VydmljZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUI0OTAyODciCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCNUIwMDNFIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjE2MDE1MyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjUwMDA2NiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RkE0MDFDNSIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQTkwMjg0IgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQkUwMUE4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUJDRjAzMDIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRBREMwMDA3MiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0ZhdWx0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyIKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MDkwMERBIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUxRDAwN0YiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0lucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdJbnB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MzQwMzQ5IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRENCMDIxQyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ091dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUyRDAwNTAiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFNEYwMEJEIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTVGMDAyQSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5FbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTM1MDNEMSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxRDkwMTQyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OEYxMDM5RCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEltcG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImltcG9ydERlZiIKLQkJCQkJdHlwZSAgICAgICAJIklJbXBvcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTZFMDA1RSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5ODQwMDRCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlDNTAwNDUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUU0MDFFRSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIgotCQkJCQl0eXBlICAgICAgIAkiSVNlcnZpY2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3IgotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyIKLQkJCQlyZXN1bHQgICAgIAkiSUltcG9ydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUlucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCIKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIgotCQkJCXJlc3VsdCAgICAgCSJJUGFydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1IgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQcmVmaXgiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIgotCQkJCXJlc3VsdCAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudEJhc2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUZFMDIwOCIKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDYxODAzMjgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnRCYXNlIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwNTYwMDgwIgotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwQkEwMzU1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBEODAyOUEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwNkYwMzFCIgotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIgotCQkJCQl0eXBlICAgICAgIAkiSVR5cGVzIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFFNzAyQTEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUxpc3QiCi0JCQlxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMEFGMDI5NyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1hcCIKLQkJCXF1aWQgICAgICAgCSIzQjg5NkIwMzAwRDQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QjExMDJCNSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVVSTCIKLQkJCXF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5uZXQuVVJMIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpb25SZWdpc3RyeSIKLQkJCXF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU5RjAyRTgiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJdGVyYXRvciIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkl0ZXJhdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODgwODAwQjkiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iCi0JCQlxdWlkICAgICAgIAkiM0M0Njg5NjUwMzEzIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4OTc0MDMxNSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuVHlwZXMgbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYyN0YwMEI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0QxNTAyQzAyM0IiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiCi0JCQlxdWlkICAgICAgIAkiM0Y2NzcxREIwMkRDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNzYyQTZBMDMwOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQcm90ZWN0ZWQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJwb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIgotCQkJCWxhYmVsICAgICAgCSJwb3J0VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQ0QiCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiCi0JCQlxdWlkICAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA2MSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIgotCQkJcXVpZCAgICAgICAJIjNBRDVEMzUyMDEwRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxODAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ09wZXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciCi0JCQlxdWlkICAgICAgIAkiM0FENUQ0MjUwMzhBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRjUiCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5IgotCQkJcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIgotCQkJcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjcxMDEwNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM0QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjc3MDA5NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5ncyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjdCMDMxMSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJCWxhYmVsICAgICAgCSJlU2VydmljZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIgotCQkJcXVpZCAgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCWxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyIKLQkJCXF1aWQgICAgICAgCSIzQURGMkU2NDAxRjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MSIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSIKLQkJCXF1aWQgICAgICAgCSIzQURGMkVCMzAxNjMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0MiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNiIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNyIKLQkJCXF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTlBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5IgotCQkJcXVpZCAgICAgICAJIjNBREYyRkI4MDJGOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBBIgotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIgotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEiCi0JCQlxdWlkICAgICAgIAkiM0FERjMzMTYwMUE0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODciCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMyIKLQkJCXF1aWQgICAgICAgCSIzQURGMzQwMDAzRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUEiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nRmF1bHRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSIKLQkJCXF1aWQgICAgICAgCSIzQUUwOTFGNDAyRjMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZFIgotCQkJCWxhYmVsICAgICAgCSJlRmF1bHQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzYiCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM3IgotCQkJcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzgiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVOYW1lc3BhY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiCi0JCQkJbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM5IgotCQkJcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCQlsYWJlbCAgICAgIAkiZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDEiCi0JCQlxdWlkICAgICAgIAkiM0FFQTQxMkYwMDM1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIgotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MyIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNDAwQkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ1IgotCQkJcXVpZCAgICAgICAJIjNCODRBRDc5MDBGMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTREIgotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTRFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ3IgotCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0OCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ5IgotCQkJcXVpZCAgICAgICAJIjNCOEIxQzEyMDNCMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIgotCQkJcXVpZCAgICAgICAJIjNCOEIxRENDMDJFNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjcwIgotCQkJCWxhYmVsICAgICAgCSJlU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUyIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MyIKLQkJCXF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU0IgotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlVHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZVR5cGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIgotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5MzAzRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTYiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyIKLQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJbGFiZWwgICAgICAJImVJbXBvcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1OSIKLQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIgotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjEiCi0JCQlxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIgotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjMiCi0JCQlxdWlkICAgICAgIAkiM0Y3ODk2QTIwMjZFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCQlsYWJlbCAgICAgIAkicGFyZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjaGlsZHJlbiIKLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJCWxhYmVsICAgICAgCSJjaGlsZHJlbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiCi0JCQlxdWlkICAgICAgIAkiMzlBRDNFRjYwMTI3IgotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyIKLQkJCXpvb20gICAgICAgCTkwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDY2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCQl3aWR0aCAgICAgIAk1MjAKLQkJCQloZWlnaHQgICAgIAk0MDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IiBAMjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDUyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQ4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNDMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IgotCQkJCXdpZHRoICAgICAgCTI3OAotCQkJCWhlaWdodCAgICAgCTIxOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEAzMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJU2VydmljZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkyNjQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAzMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDM4OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQl3aWR0aCAgICAgIAk0MTAKLQkJCQloZWlnaHQgICAgIAkzMDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTRFMDFCNCIKLQkJCQljbGllbnQgICAgIAlAMzEKLQkJCQlzdXBwbGllciAgIAlAMzAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDAsIDM3NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQwLCAyOTIpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDMzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDQsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJMzAyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCQkJY2xpZW50ICAgICAJQDMzCi0JCQkJc3VwcGxpZXIgICAJQDI4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMCwgMTExMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMCwgMTAwMikpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAMzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgOTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3NSwgODQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCXdpZHRoICAgICAgCTMwMAotCQkJCWhlaWdodCAgICAgCTE2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDUwMkM5IgotCQkJCWNsaWVudCAgICAgCUAzNQotCQkJCXN1cHBsaWVyICAgCUAyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAzNwotCQkJCWxvY2F0aW9uICAgCSgzNDMsIDkxNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0cyIgQDM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzcKLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MTMsIDk0NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxODk3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyIKLQkJCQkJY2xpZW50ICAgICAJQDM3Ci0JCQkJCXN1cHBsaWVyICAgCUAzNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDkxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzksIDg4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwODAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgOTkwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg0NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTc0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwIiBANDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMSwgNjQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNiwgNzQ0KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxRCIKLQkJCQkJY2xpZW50ICAgICAJQDM3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNDMsIDkxNikKLQkJCQkJICAgICgyNTcsIDkxNikKLQkJCQkJICAgICgyNTcsIDY3OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NywgNjc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMSwgNzk2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzcwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEA0NQotCQkJCWxvY2F0aW9uICAgCSg4ODYsIDEyNzApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjgwMTFGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZyIgQDQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlANDUKLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExMiwgMTIzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQ4NTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjREIgotCQkJCQljbGllbnQgICAgIAlANDUKLQkJCQkJc3VwcGxpZXIgICAJQDMzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEA0OQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3OTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCQljbGllbnQgICAgIAlANDUKLQkJCQkJc3VwcGxpZXIgICAJQDM1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDg4NiwgMTI3MCkKLQkJCQkJICAgICg4MTIsIDEyNzApCi0JCQkJCSAgICAoODEyLCA5OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEyLCA5OTYpKSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjUgQmluZGluZ3MiCi0JCQlxdWlkICAgICAgIAkiMzlBRDUxMjcwMjUyIgotCQkJdGl0bGUgICAgICAJIjIuNSBCaW5kaW5ncyIKLQkJCXpvb20gICAgICAgCTg1Ci0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxMTQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgNjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMzc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIgQDUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMzUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgMTMwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCA4MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiIKLQkJCQl3aWR0aCAgICAgIAk0MTAKLQkJCQloZWlnaHQgICAgIAk1NjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nSW5wdXQiIEA1MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTMzNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdJbnB1dCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIDEyODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiCi0JCQkJd2lkdGggICAgICAJMjc4Ci0JCQkJaGVpZ2h0ICAgICAJMTc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ091dHB1dCIgQDU0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxNjM4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ091dHB1dCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE1ODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiCi0JCQkJd2lkdGggICAgICAJMzEyCi0JCQkJaGVpZ2h0ICAgICAJMTc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IiBANTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTU4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0ZhdWx0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MiwgMTkwOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIKLQkJCQl3aWR0aCAgICAgIAkyOTAKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBANTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCA0ODYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCXdpZHRoICAgICAgCTY5MQotCQkJCWhlaWdodCAgICAgCTMwMQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEA1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxMjgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDU4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxNjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE1ODcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA1OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTcsIDUzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQl3aWR0aCAgICAgIAk0MzIKLQkJCQloZWlnaHQgICAgIAkzMjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSIKLQkJCQljbGllbnQgICAgIAlANTkKLQkJCQlzdXBwbGllciAgIAlANTEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzksIDUyNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc5LCA0MjgpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBANjEKLQkJCQlsb2NhdGlvbiAgIAkoMTAzOSwgNzQyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMzUyMDEwRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlIiBANjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MQotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0OSwgNzgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MjkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTQwMTc2IgotCQkJCQljbGllbnQgICAgIAlANjEKLQkJCQkJc3VwcGxpZXIgICAJQDU2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU5LCA3NDIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MiwgNzE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIxOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEA2NQotCQkJCQlQYXJlbnRfVmlldyAJQDYxCi0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzYsIDY5NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA5NDQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTQwMTgwIgotCQkJCQljbGllbnQgICAgIAlANjEKLQkJCQkJc3VwcGxpZXIgICAJQDU5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjAsIDc0MikpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxMDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzIsIDg1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTM3MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBANjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDYyNCwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzYsIDEyODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDMiIEA2OQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCAxMzU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRDI0MDBCRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBANzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjM3LCAxMzE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc1MTQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkJCQljbGllbnQgICAgIAlANjkKLQkJCQkJc3VwcGxpZXIgICAJQDU3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjY0LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTM1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk0LCAxMzk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODk1NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ0IiBANzMKLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCQlsb2NhdGlvbiAgIAkoOTYsIDI4NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODQiCi0JCQkJCWNsaWVudCAgICAgCUA2OQotCQkJCQlzdXBwbGllciAgIAlANjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODEsIDEzNTkpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBANzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgMTY2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTIsIDE1MzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMjc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ1IiBANzUKLQkJCQlsb2NhdGlvbiAgIAkoMTQzMiwgMTY1NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3OTAwRjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEA3NgotCQkJCQlQYXJlbnRfVmlldyAJQDc1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIwLCAzNzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NSwgMTYxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3V0cHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzQ3NzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEQiCi0JCQkJCWNsaWVudCAgICAgCUA3NQotCQkJCQlzdXBwbGllciAgIAlANTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxNjU0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODEsIDE2OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5MDI3NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDYiIEA3OQotCQkJCQlQYXJlbnRfVmlldyAJQDc1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIwLCAzNzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTRFIgotCQkJCQljbGllbnQgICAgIAlANzUKLQkJCQkJc3VwcGxpZXIgICAJQDc0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTY1NCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEA4MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTkyLCAxMDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOSwgOTMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCXdpZHRoICAgICAgCTM2NAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERTQwMURDIgotCQkJCWNsaWVudCAgICAgCUA4MAotCQkJCXN1cHBsaWVyICAgCUA1MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2NiwgOTE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjYsIDYzNikpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEA4MgotCQkJCWxvY2F0aW9uICAgCSg0NTcsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTEwMTc5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2IiBAODMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MgotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzUsIDkyMCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMjUiCi0JCQkJCWNsaWVudCAgICAgCUA4MgotCQkJCQlzdXBwbGllciAgIAlANTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDU3LCAxMDIyKQotCQkJCQkgICAgKDI3NiwgMTAyMikKLQkJCQkJICAgICgyNzYsIDg0OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzYsIDg0OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzAsIDg4NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ09wZXJhdGlvbnMiIEA4NgotCQkJCQlQYXJlbnRfVmlldyAJQDgyCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgOTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjExNjk5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkJCQljbGllbnQgICAgIAlAODIKLQkJCQkJc3VwcGxpZXIgICAJQDgwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NTcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY5LCA5ODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4NDk1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgMTA2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzI3NTY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA5MAotCQkJCWxvY2F0aW9uICAgCSgxNDE4LCAxMDQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVENDI1MDM4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbiIgQDkxCi0JCQkJCVBhcmVudF9WaWV3IAlAOTAKLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDYwMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGNSIKLQkJCQkJY2xpZW50ICAgICAJQDkwCi0JCQkJCXN1cHBsaWVyICAgCUA2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjMsIDEwNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4OSwgMTAwNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk2NzIxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4IiBAOTQKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MAotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzMsIDEwNzApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NTQyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGRiIKLQkJCQkJY2xpZW50ICAgICAJQDkwCi0JCQkJCXN1cHBsaWVyICAgCUA4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNzQsIDEwNDApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBAOTYKLQkJCQlsb2NhdGlvbiAgIAkoNzg3LCAxMTkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRTY0MDFGNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdJbnB1dCIgQDk3Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTYKLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjksIDExNTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdJbnB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTExOTA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUxIgotCQkJCQljbGllbnQgICAgIAlAOTYKLQkJCQkJc3VwcGxpZXIgICAJQDY4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc4NywgMTE5MCkKLQkJCQkJICAgICg2MzYsIDExOTApCi0JCQkJCSAgICAoNjM2LCAxMjcxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYzNiwgMTI3MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDEyMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0MDQ3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQiIEAxMDAKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NgotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODg1LCAxMTQ0KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MiIKLQkJCQkJY2xpZW50ICAgICAJQDk2Ci0JCQkJCXN1cHBsaWVyICAgCUA4MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODcsIDExOTApCi0JCQkJCSAgICAoOTI2LCAxMTkwKQotCQkJCQkgICAgKDkyNiwgMTA5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzNzc1OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDEwMwotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMzEyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRUIzMDE2MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPdXRwdXQiIEAxMDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTIsIDE0MjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPdXRwdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0NTA4MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRUI0MDEzQyIKLQkJCQkJY2xpZW50ICAgICAJQDEwMwotCQkJCQlzdXBwbGllciAgIAlANzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxNDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzQ1OTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2IiBAMTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCA1NzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCQljbGllbnQgICAgIAlAMTAzCi0JCQkJCXN1cHBsaWVyICAgCUA4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDEwOTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MjAsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzIsIDE5MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMTExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjEyLCAxODU5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMjc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNzEwMzMzIgotCQkJCWNsaWVudCAgICAgCUAxMTEKLQkJCQlzdXBwbGllciAgIAlANTUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjAzLCAyMDA3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDExMwotCQkJCWxvY2F0aW9uICAgCSgxMzU2LCAxMzUyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYzNDAwMDNFNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEAxMTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MiwgMTc1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0ZhdWx0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAzMTUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FBIgotCQkJCQljbGllbnQgICAgIAlAMTEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCAxODQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwOSwgMTc5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU2LCAxODA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTkyOTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNCIgQDExOAotCQkJCQlQYXJlbnRfVmlldyAJQDExMwotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc2LCAxMTk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDExMwotCQkJCQlzdXBwbGllciAgIAlAODAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM1NiwgMTM1MikKLQkJCQkJICAgICgxMzU2LCAxMjE3KQotCQkJCQkgICAgKDExMTcsIDEyMTcpCi0JCQkJCSAgICAoMTExNywgMTA5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4NzAwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNSIgQDEyMQotCQkJCWxvY2F0aW9uICAgCSgxNjQwLCAxOTcwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA5MUY0MDJGMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0IiBAMTIyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxCi0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc0LCAxOTE1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2NDIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZFIgotCQkJCQljbGllbnQgICAgIAlAMTIxCi0JCQkJCXN1cHBsaWVyICAgCUAxMTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYzLCAxOTcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDEyNQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMQotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMQotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUxNywgMTk3MCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0MzAyQUIiCi0JCQkJY2xpZW50ICAgICAJQDc0Ci0JCQkJc3VwcGxpZXIgICAJQDU0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODAzLCAxNjU2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjQsIDE2NTYpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTFCMDExMyIKLQkJCQljbGllbnQgICAgIAlANjgKLQkJCQlzdXBwbGllciAgIAlANTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjcsIDEzODUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMzMSwgMTM4NSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjQgUG9ydFR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNBRDVEMUM0MDM2NiIKLQkJCXRpdGxlICAgICAgCSIyLjQgUG9ydFR5cGVzIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiIKLQkJCXpvb20gICAgICAgCTgwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiIEAxMjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAyMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydFR5cGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDEyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIKLQkJCQl3aWR0aCAgICAgIAk3MTgKLQkJCQloZWlnaHQgICAgIAkxOTYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIgQDEyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDE3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU9wZXJhdGlvbiIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDEyNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIKLQkJCQl3aWR0aCAgICAgIAk4OTEKLQkJCQloZWlnaHQgICAgIAkxODgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIgQDEzMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW5wdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTM4NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIKLQkJCQl3aWR0aCAgICAgIAk2NDQKLQkJCQloZWlnaHQgICAgIAkxOTQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiIEAxMzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU91dHB1dCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIgotCQkJCXdpZHRoICAgICAgCTY3NAotCQkJCWhlaWdodCAgICAgCTE5NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IiBAMTMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIwNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklGYXVsdCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDI2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIgotCQkJCXdpZHRoICAgICAgCTY0NAotCQkJCWhlaWdodCAgICAgCTE5NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxMzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OCwgNjcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQl3aWR0aCAgICAgIAk2OTUKLQkJCQloZWlnaHQgICAgIAkyODEKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDEzNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTc2LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMjUsIDY5MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQl3aWR0aCAgICAgIAk1MjAKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAMTM1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDIwNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEAxMzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgMTQ3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoODcwLCAxNDIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMTM3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE3OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzIsIDE3NDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQl3aWR0aCAgICAgIAkyNzQKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDEzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTQsIDYyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCXdpZHRoICAgICAgCTY5NQotCQkJCWhlaWdodCAgICAgCTM1MgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxMzkKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgNzk3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODI0MDE4QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbnMiIEAxNDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkKLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgNzQ4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQ5Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPcGVyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNTk2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQ0QiCi0JCQkJCWNsaWVudCAgICAgCUAxMzkKLQkJCQkJc3VwcGxpZXIgICAJQDEzOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwNSwgNzk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NiwgODYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDAzOTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzQsIDkyMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2MjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicG9ydFR5cGUiIEAxNDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkKLQkJCQkJbG9jYXRpb24gICAJKDU5MiwgMjY5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDMyIKLQkJCQkJY2xpZW50ICAgICAJQDEzOQotCQkJCQlzdXBwbGllciAgIAlAMTMzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDc5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4OCwgNzU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTM0ODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDEiIEAxNDYKLQkJCQlsb2NhdGlvbiAgIAkoMjEwNywgNzczKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUE0MTJGMDAzNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcmFtZXRlck9yZGVyaW5nIiBAMTQ3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ1LCA2NDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODMzMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjU1IgotCQkJCQljbGllbnQgICAgIAlAMTQ2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTYsIDc3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzIsIDgyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk2NjEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTcxLCA4ODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMwNjIyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQyIiBAMTUxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgxODE5LCAxMDEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMzEwMjVGIgotCQkJCQljbGllbnQgICAgIAlAMTQ2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTksIDc3MykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEiIEAxNTIKLQkJCQlsb2NhdGlvbiAgIAkoMTcwMiwgMTUwNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxNjAxQTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVGYXVsdHMiIEAxNTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTIKLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTUsIDE5ODIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUZhdWx0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc4OTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4NyIKLQkJCQkJY2xpZW50ICAgICAJQDE1MgotCQkJCQlzdXBwbGllciAgIAlAMTM1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgMjA0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDQsIDIwMjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0OTU4MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MywgMTk2MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ1Mzc4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzIiIEAxNTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTIKLQkJCQkJbG9jYXRpb24gICAJKDE0MTQsIDgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjEsIDEwNjkpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg4IgotCQkJCQljbGllbnQgICAgIAlAMTUyCi0JCQkJCXN1cHBsaWVyICAgCUAxMzgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMDM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTczNjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTExOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3IiBAMTYwCi0JCQkJbG9jYXRpb24gICAJKDExNzgsIDEyMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTQwMjREIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEAxNjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNjAKLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAxMzQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbnB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE5ODIwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5MCIKLQkJCQkJY2xpZW50ICAgICAJQDE2MAotCQkJCQlzdXBwbGllciAgIAlAMTM2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzgsIDEyMzQpCi0JCQkJCSAgICAoOTgwLCAxMjM0KQotCQkJCQkgICAgKDk4MCwgMTQxMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAxNDEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0NiwgMTM2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc3NjYwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOCIgQDE2NAotCQkJCQlQYXJlbnRfVmlldyAJQDE2MAotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM2LCAxMDM2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRjk1MDE5QSIKLQkJCQkJY2xpZW50ICAgICAJQDE2MAotCQkJCQlzdXBwbGllciAgIAlAMTM4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzgsIDEyMzQpCi0JCQkJCSAgICAoMTI3NywgMTIzNCkKLQkJCQkJICAgICgxMjc3LCA5NjApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzcsIDk2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExOTcsIDEwNTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjQxMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOSIgQDE2NwotCQkJCWxvY2F0aW9uICAgCSgxNDY4LCAxMzQ1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRkI4MDJGOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDE2OAotCQkJCQlQYXJlbnRfVmlldyAJQDE2NwotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MiwgMTY2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3V0cHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDA5MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBBIgotCQkJCQljbGllbnQgICAgIAlAMTY3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAxNzMwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU0NiwgMTY3NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNjM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMCIgQDE3MQotCQkJCQlQYXJlbnRfVmlldyAJQDE2NwotCQkJCQlsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyNywgMTAzNykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEIiCi0JCQkJCWNsaWVudCAgICAgCUAxNjcKLQkJCQkJc3VwcGxpZXIgICAJQDEzOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDk2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjMsIDEwODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5MDM0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkQ4MDE5RiIKLQkJCQljbGllbnQgICAgIAlAMTMzCi0JCQkJc3VwcGxpZXIgICAJQDEyOAotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTc1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRTIwMTcxIgotCQkJCWNsaWVudCAgICAgCUAxMzgKLQkJCQlzdXBwbGllciAgIAlAMTI5Ci0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNzYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFRTAzMUQiCi0JCQkJY2xpZW50ICAgICAJQDEzNgotCQkJCXN1cHBsaWVyICAgCUAxMzAKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE3NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkY4MDFDRCIKLQkJCQljbGllbnQgICAgIAlAMTM3Ci0JCQkJc3VwcGxpZXIgICAJQDEzMQotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTc4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMDIwMDJEIgotCQkJCWNsaWVudCAgICAgCUAxMzUKLQkJCQlzdXBwbGllciAgIAlAMTMyCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAxNzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjIyNCwgMTQ1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkzNywgMTMxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQl3aWR0aCAgICAgIAk1OTMKLQkJCQloZWlnaHQgICAgIAkzMTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIgQDE4MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTIwLCAyNTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlUmVmZXJlbmNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIgotCQkJCXdpZHRoICAgICAgCTY3MgotCQkJCWhlaWdodCAgICAgCTE4MAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE4MQotCQkJCWxvY2F0aW9uICAgCSgxNTI0LCAyMjc1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxODAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE1MjQsIDIyNzUpCi0JCQkJICAgICgxNTI0LCAyNDU0KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyM0QwMzE5IgotCQkJCWNsaWVudCAgICAgCUAxMzUKLQkJCQlzdXBwbGllciAgIAlAMTgwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3NiwgMjE3NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc3NiwgMjI3NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxODEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTgzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMzUwMEREIgotCQkJCWNsaWVudCAgICAgCUAxMzcKLQkJCQlzdXBwbGllciAgIAlAMTgwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM3MSwgMTg1NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3MSwgMjI3NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxODEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTg0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcyMjgwMkU3IgotCQkJCWNsaWVudCAgICAgCUAxMzYKLQkJCQlzdXBwbGllciAgIAlAMTgwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgwLCAxNTM0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTgxKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MSIgQDE4NQotCQkJCWxvY2F0aW9uICAgCSgyMjA2LCAyMjU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNzRFNzg0MDFCMSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAxODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxODUKLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNjgsIDE2NzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMjIzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMEYiCi0JCQkJCWNsaWVudCAgICAgCUAxODUKLQkJCQkJc3VwcGxpZXIgICAJQDE3OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDYsIDE2MTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYwLCAxNjc4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMTg5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTg1Ci0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDIzIgotCQkJCQljbGllbnQgICAgIAlAMTg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxODAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjIwNiwgMjI1OSkKLQkJCQkJICAgICgyMjA2LCAyNTU2KQotCQkJCQkgICAgKDE4NTYsIDI1NTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwNiwgMjI1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTYsIDI1NTYpKSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEgRGVmaW5pdGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0FENUU0OEEwMjYyIgotCQkJdGl0bGUgICAgICAJIjIuMSBEZWZpbml0aW9ucyIKLQkJCXpvb20gICAgICAgCTgzCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIgQDE5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDE5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDE2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSURlZmluaXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTExKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIgotCQkJCXdpZHRoICAgICAgCTcwNgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAxOTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg2LCA4OTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCXdpZHRoICAgICAgCTI5NAotCQkJCWhlaWdodCAgICAgCTEyMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMTkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxMCwgNTQ1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTgyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTA1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTk0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgwOCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5NiwgMTM2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMTk1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEyNCwgMTYwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAxOTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTEwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJNTI4Ci0JCQkJaGVpZ2h0ICAgICAJNDI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMTk3Ci0JCQkJbG9jYXRpb24gICAJKDEzNTgsIDg2MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMTk4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTk3Ci0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxNywgNTM1KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiIKLQkJCQkJY2xpZW50ICAgICAJQDE5NwotCQkJCQlzdXBwbGllciAgIAlAMTk2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU4LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAzLCA1MTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NjY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMjAxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTk3Ci0JCQkJCWxvY2F0aW9uICAgCSg2MiwgLTM2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4NiwgOTA5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VUeXBlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc5MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMTk3Ci0JCQkJCXN1cHBsaWVyICAgCUAxOTEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM1OCwgODYwKQotCQkJCQkgICAgKDEzNTgsIDk0OCkKLQkJCQkJICAgICgxNjc3LCA5NDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NywgOTQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgOTg3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTI2NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAyMDQKLQkJCQlsb2NhdGlvbiAgIAkoMTYxMiwgNTk1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAyMDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMDQKLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1MTIpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJCQljbGllbnQgICAgIAlAMjA0Ci0JCQkJCXN1cHBsaWVyICAgCUAxOTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYxMiwgNTk1KQotCQkJCQkgICAgKDE0NjQsIDU5NSkKLQkJCQkJICAgICgxNDY0LCA0NTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2NCwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyNCwgNDk1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTg2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTYwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMjA4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjA0Ci0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5MiwgNTU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODAzMzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJCWNsaWVudCAgICAgCUAyMDQKLQkJCQkJc3VwcGxpZXIgICAJQDE5MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMSwgNTk1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNjUyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDEwMDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzYsIDY0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjI1OTQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzIiBAMjEyCi0JCQkJbG9jYXRpb24gICAJKDEyNzksIDExMzcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDMwMUUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNCIgQDIxMwotCQkJCQlQYXJlbnRfVmlldyAJQDIxMgotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjM4LCA1OTEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEI3IgotCQkJCQljbGllbnQgICAgIAlAMjEyCi0JCQkJCXN1cHBsaWVyICAgCUAxOTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc5LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIwLCA1ODYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwNDk3NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2VzIiBAMjE2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjEyCi0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDcsIDExNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDMxMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQzEiCi0JCQkJCWNsaWVudCAgICAgCUAyMTIKLQkJCQkJc3VwcGxpZXIgICAJQDE5MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjc5LCAxMTM3KQotCQkJCQkgICAgKDEyNzksIDEyMDgpCi0JCQkJCSAgICAoMTg5MSwgMTIwOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5MSwgMTIwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDExNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTM0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc5NywgMTI0NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NDA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBAMjIwCi0JCQkJbG9jYXRpb24gICAJKDEyMTIsIDExNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzEwMTA0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDIyMQotCQkJCQlQYXJlbnRfVmlldyAJQDIyMAotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgNTk0KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM0QSIKLQkJCQkJY2xpZW50ICAgICAJQDIyMAotCQkJCQlzdXBwbGllciAgIAlAMTk2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxMiwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MSwgNjI0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTc5NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZXMiIEAyMjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMjAKLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTEsIDE0NTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzIzNjk4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzU0IgotCQkJCQljbGllbnQgICAgIAlAMjIwCi0JCQkJCXN1cHBsaWVyICAgCUAxOTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxMiwgMTE1OSkKLQkJCQkJICAgICgxMjEyLCAxNDkwKQotCQkJCQkgICAgKDE1ODcsIDE0OTApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1ODcsIDE0OTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTMzLCAxNDUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjU2MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDE1NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTg1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNyIgQDIyOAotCQkJCWxvY2F0aW9uICAgCSgxMTE0LCAxNTg1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjc3MDA5NSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgiIEAyMjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMjgKLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDY4MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzNzEiCi0JCQkJCWNsaWVudCAgICAgCUAyMjgKLQkJCQkJc3VwcGxpZXIgICAJQDE5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTQsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTUsIDc1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NzA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ3MiIEAyMzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMjgKLQkJCQkJbG9jYXRpb24gICAJKC00MDYsIDI0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTEsIDE2NzQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjYzNDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzN0IiCi0JCQkJCWNsaWVudCAgICAgCUAyMjgKLQkJCQkJc3VwcGxpZXIgICAJQDE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTE0LCAxNTg1KQotCQkJCQkgICAgKDExMTQsIDE3MTYpCi0JCQkJCSAgICAoMjExNSwgMTcxNikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgMTcxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTMsIDE2NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NTA3NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAxNCwgMTc1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTExMDcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyOCwgMTkyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkiIEAyMzcKLQkJCQlsb2NhdGlvbiAgIAkoMTA2NiwgMTUzMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3QjAzMTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwIiBAMjM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjM3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgNjY5KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJCQkJY2xpZW50ICAgICAJQDIzNwotCQkJCQlzdXBwbGllciAgIAlAMTk2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOSwgNzU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTk2OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTZXJ2aWNlcyIgQDI0MQotCQkJCQlQYXJlbnRfVmlldyAJQDIzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTMsIDIwMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNlcnZpY2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTE4MjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwODkiCi0JCQkJCWNsaWVudCAgICAgCUAyMzcKLQkJCQkJc3VwcGxpZXIgICAJQDIzNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDY2LCAxNTMzKQotCQkJCQkgICAgKDEwNjYsIDIwNTkpCi0JCQkJCSAgICAoMTYxOSwgMjA1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMjA1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTQsIDIwMzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0MDE5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMiwgMjExMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIwNTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRjgwMzgyIgotCQkJCWNsaWVudCAgICAgCUAxOTYKLQkJCQlzdXBwbGllciAgIAlAMTkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMjYzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODUsIDI2MykpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMyBFeHRlbnNpYmlsaXR5IgotCQkJcXVpZCAgICAgICAJIjNBRDYwQzUxMDE5MiIKLQkJCXRpdGxlICAgICAgCSIyLjEuMyBFeHRlbnNpYmlsaXR5IgotCQkJem9vbSAgICAgICAJODAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAyNDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDE1ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5NCwgMTUzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQl3aWR0aCAgICAgIAkxODIKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAyNDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAxODg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDg3LCAxODM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDI0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNDIsIDE2NzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJd2lkdGggICAgICAJMTgyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEAyNDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAyMzM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAyMjgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQkJd2lkdGggICAgICAJMjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAMjUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzM2LCAxNzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDE3MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJd2lkdGggICAgICAJMzY0Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI1MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDEzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgODYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiCi0JCQkJd2lkdGggICAgICAJODA0Ci0JCQkJaGVpZ2h0ICAgICAJMTcyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEAyNTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDE5NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMTg5OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDI1MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDIxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2MywgMjA5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQl3aWR0aCAgICAgIAkzMDgKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyNTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEyOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMjM1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTIyMgotCQkJCWhlaWdodCAgICAgCTE0NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyNTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDEzNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAyNTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjU2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDksIDU4MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQkJd2lkdGggICAgICAJNTYwCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI1NwotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDEwMzkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDI1NgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDgwLCAxMDM5KQotCQkJCSAgICAoNDgwLCA4MDgpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDBDQjAwQUEiCi0JCQkJY2xpZW50ICAgICAJQDI0NwotCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY2LCAxODI0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY2LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjVBNDAyN0UiCi0JCQkJY2xpZW50ICAgICAJQDI1MwotCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk3LCAyMDc5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk3LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTM4NjAyQzkiCi0JCQkJY2xpZW50ICAgICAJQDI0OQotCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE5LCAyMjcxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE5LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjU5QjAwNzIiCi0JCQkJY2xpZW50ICAgICAJQDI1MgotCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODgsIDE4ODcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4OCwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjYyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwOTIwMkY3IgotCQkJCWNsaWVudCAgICAgCUAyNTAKLQkJCQlzdXBwbGllciAgIAlAMjU2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzk3LCAxNjk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTcsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTBGMDJGMCIKLQkJCQljbGllbnQgICAgIAlAMjQ2Ci0JCQkJc3VwcGxpZXIgICAJQDI1NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYwMSwgMTUxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAxLCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNjQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCQkJY2xpZW50ICAgICAJQDI1NAotCQkJCXN1cHBsaWVyICAgCUAyNTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTEsIDEyMjMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjY1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCWNsaWVudCAgICAgCUAyNTUKLQkJCQlzdXBwbGllciAgIAlAMjU2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDE0LCAxMzQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJCQljbGllbnQgICAgIAlAMjQ4Ci0JCQkJc3VwcGxpZXIgICAJQDI1NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE2NjMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MjksIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjU3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDY4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNTgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCQl3aWR0aCAgICAgIAk1NjMKLQkJCQloZWlnaHQgICAgIAkyMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAyNjgKLQkJCQlsb2NhdGlvbiAgIAkoMTE5MSwgNjcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAyNjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NDcsIDYzMSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJCWNsaWVudCAgICAgCUAyNjgKLQkJCQkJc3VwcGxpZXIgICAJQDI1NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzYwLCA2NzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzAsIDYyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM5Njk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMjcyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NSwgNTIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3OTA3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkJCWNsaWVudCAgICAgCUAyNjgKLQkJCQkJc3VwcGxpZXIgICAJQDI2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMywgNjcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NiwgNjI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjMsIDc2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjMyNDc5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk5MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIgQDI3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxOTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzMCwgODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIldTRExFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIgotCQkJCXdpZHRoICAgICAgCTc3NAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNzcKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgNDAyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAyNzYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEwMDgsIDQwMikKLQkJCQkgICAgKDEwMDgsIDMxMikpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJCQljbGllbnQgICAgIAlAMjU2Ci0JCQkJc3VwcGxpZXIgICAJQDI3NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5MiwgNTY4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0OTIsIDQwMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxNDkwM0QwIgotCQkJCWNsaWVudCAgICAgCUAyNjcKLQkJCQlzdXBwbGllciAgIAlAMjUxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxNSwgNTcxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE1LCAyNDYpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI4MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRERGNTM1MDJDMyIKLQkJCQljbGllbnQgICAgIAlAMjY3Ci0JCQkJc3VwcGxpZXIgICAJQDI3NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDU3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MiwgNDAyKQotCQkJCWRyYXdTdXBwbGllciAJQDI3NykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAxNiwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMSwgMTMwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJCXdpZHRoICAgICAgCTU4OAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI4MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUVDMDFDQiIKLQkJCQljbGllbnQgICAgIAlAMjgxCi0JCQkJc3VwcGxpZXIgICAJQDI2NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3OTYsIDEyOTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTYsIDgwNSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYzIiBAMjgzCi0JCQkJbG9jYXRpb24gICAJKDIzMTEsIDE2ODYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTIwMjZFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJlbnQiIEAyODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAyODMKLQkJCQkJbG9jYXRpb24gICAJKDI3OSwgMjk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQyMiwgMTMzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCQkJY2xpZW50ICAgICAJQDI4MwotCQkJCQlzdXBwbGllciAgIAlAMjgxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzMTEsIDE2ODYpCi0JCQkJCSAgICAoMjQzMiwgMTY4NikKLQkJCQkJICAgICgyNDMyLCAxMzc0KQotCQkJCQkgICAgKDIzMTAsIDEzNzQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjMxMSwgMTY4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTAsIDEzNzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzY2LCAxNDI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNoaWxkcmVuIiBAMjg3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjgzCi0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTksIDE1MzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2hpbGRyZW4iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5ODU2MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkMiCi0JCQkJCWNsaWVudCAgICAgCUAyODMKLQkJCQkJc3VwcGxpZXIgICAJQDI4MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzExLCAxNjg2KQotCQkJCQkgICAgKDIwMTYsIDE2ODYpCi0JCQkJCSAgICAoMjAxNiwgMTQyNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNiwgMTQyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzAsIDE0ODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCQkJcXVpZCAgICAgICAJIjNBRThFRDcyMDFCRCIKLQkJCXRpdGxlICAgICAgCSIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIgQDI5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklJbXBvcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxMjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiCi0JCQkJd2lkdGggICAgICAJNTk4Ci0JCQkJaGVpZ2h0ICAgICAJMjE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiIEAyOTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTEzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCAxMDQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJOYW1lc3BhY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiCi0JCQkJd2lkdGggICAgICAJNDc5Ci0JCQkJaGVpZ2h0ICAgICAJMjE1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDI5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCAxMTQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTczCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQsIDIzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQl3aWR0aCAgICAgIAk0OTAKLQkJCQloZWlnaHQgICAgIAkzMjAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzciIEAyOTQKLQkJCQlsb2NhdGlvbiAgIAkoMzA5LCA3ODYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTUwMDJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTmFtZXNwYWNlcyIgQDI5NQotCQkJCQlQYXJlbnRfVmlldyAJQDI5NAotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjEsIDk1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTmFtZXNwYWNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk4ODQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMzMiIKLQkJCQkJY2xpZW50ICAgICAJQDI5NAotCQkJCQlzdXBwbGllciAgIAlAMjkxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgMTAyOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0OCwgOTczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Njg3MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjUwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTgyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM4IiBAMjk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI2OCwgNTkyKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMjgiCi0JCQkJCWNsaWVudCAgICAgCUAyOTQKLQkJCQkJc3VwcGxpZXIgICAJQDI5MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDU0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzOSwgNTgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDQ5NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTcxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDMwMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgNzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjU1LCA1ODApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCQl3aWR0aCAgICAgIAk0NTIKLQkJCQloZWlnaHQgICAgIAkzMDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTEiIEAzMDMKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NiwgMTAwMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDQzAyRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTY2hlbWEiIEAzMDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDMKLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDEwMTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkyNTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3MCIKLQkJCQkJY2xpZW50ICAgICAJQDMwMwotCQkJCQlzdXBwbGllciAgIAlAMjkyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0ODYsIDEwMDEpCi0JCQkJCSAgICAoMTYzMiwgMTAwMSkKLQkJCQkJICAgICgxNjMyLCAxMTMwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMyLCAxMTMwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2MywgMTAxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTkyNTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1MiIgQDMwNwotCQkJCQlQYXJlbnRfVmlldyAJQDMwMwotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxRENFMDI3QSIKLQkJCQkJY2xpZW50ICAgICAJQDMwMwotCQkJCQlzdXBwbGllciAgIAlAMzAyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCAxMDAwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOSIgQDMwOAotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCA0MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0EwMDJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDMwOQotCQkJCQlQYXJlbnRfVmlldyAJQDMwOAotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiCi0JCQkJCWNsaWVudCAgICAgCUAzMDgKLQkJCQkJc3VwcGxpZXIgICAJQDMwMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg3LCA0MDMpCi0JCQkJCSAgICAoMTM2NCwgNDAzKQotCQkJCQkgICAgKDEzNjQsIDU2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRGVmaW5pdGlvbiIgQDMxMQotCQkJCQlQYXJlbnRfVmlldyAJQDMwOAotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA1LCAzNjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzUzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCQkJY2xpZW50ICAgICAJQDMwOAotCQkJCQlzdXBwbGllciAgIAlAMjkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNDU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQ5MTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAzMTQKLQkJCQlsb2NhdGlvbiAgIAkoNzM3LCA4MjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDMxNQotCQkJCQlQYXJlbnRfVmlldyAJQDMxNAotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUyLCA2NDcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQkJY2xpZW50ICAgICAJQDMxNAotCQkJCQlzdXBwbGllciAgIAlAMjkzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDczNywgODI2KQotCQkJCQkgICAgKDUxMCwgODI2KQotCQkJCQkgICAgKDUxMCwgNTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA1NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NTcsIDU5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDMxOAotCQkJCQlQYXJlbnRfVmlldyAJQDMxNAotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTkxODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJCWNsaWVudCAgICAgCUAzMTQKLQkJCQkJc3VwcGxpZXIgICAJQDMwMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA4NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzIyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMEQwMzQwIgotCQkJCWNsaWVudCAgICAgCUAzMDIKLQkJCQlzdXBwbGllciAgIAlAMjkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1NSwgNTY4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNCODVBRTU5MDM3RSIKLQkJCXRpdGxlICAgICAgCSIyLjIgVHlwZXMiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAk4MQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAzMjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5NSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNTAwCi0JCQkJaGVpZ2h0ICAgICAJMTc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDMyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDYsIDE1MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk0NzgKLQkJCQloZWlnaHQgICAgIAkxNjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE5NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTE3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNTM1Ci0JCQkJaGVpZ2h0ICAgICAJMzA1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMzI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTA2NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQl3aWR0aCAgICAgIAk0NjYKLQkJCQloZWlnaHQgICAgIAkyNTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDciIEAzMjcKLQkJCQlsb2NhdGlvbiAgIAkoNzM1LCAxMTcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEAzMjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcKLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc1LCAxMTMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjkwMDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMjciCi0JCQkJCWNsaWVudCAgICAgCUAzMjcKLQkJCQkJc3VwcGxpZXIgICAJQDMyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg2LCAxMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM5LCAxMjA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODg3MDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ4IiBAMzMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzI3Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMzEiCi0JCQkJCWNsaWVudCAgICAgCUAzMjcKLQkJCQkJc3VwcGxpZXIgICAJQDMyNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg1LCAxMTcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDMzMgotCQkJCWxvY2F0aW9uICAgCSg1MjcsIDE1OTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTIwM0IyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb24iIEAzMzMKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzIKLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2NiwgMTU1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3NTM5NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAxQyIKLQkJCQkJY2xpZW50ICAgICAJQDMzMgotCQkJCQlzdXBwbGllciAgIAlAMzI0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDE1OTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDE2NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NTg3NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTAiIEAzMzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzIKLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMjYiCi0JCQkJCWNsaWVudCAgICAgCUAzMzIKLQkJCQkJc3VwcGxpZXIgICAJQDMyNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1MjcsIDE1OTIpCi0JCQkJCSAgICAoNDM3LCAxNTkyKQotCQkJCQkgICAgKDQzNywgMTMxMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDEzMTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU1IiBAMzM3Ci0JCQkJbG9jYXRpb24gICAJKDMyMiwgMTkxMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5MzAzRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMzM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzM3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzgsIDE4NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0ODU2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSIKLQkJCQkJY2xpZW50ICAgICAJQDMzNwotCQkJCQlzdXBwbGllciAgIAlAMzI1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxOTExKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzQxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzM3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTE4IgotCQkJCQljbGllbnQgICAgIAlAMzM3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMjYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzIyLCAxOTExKQotCQkJCQkgICAgKDIyOSwgMTkxMSkKLQkJCQkJICAgICgyMjksIDEzMTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5LCAxMzEzKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAzNDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDUxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJd2lkdGggICAgICAJMzg5Ci0JCQkJaGVpZ2h0ICAgICAJMjE2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJMjIyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMzQ0Ci0JCQkJbG9jYXRpb24gICAJKDIzNCwgNjA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMzQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQ0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNwotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY2MTAxNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDM0NAotCQkJCQlzdXBwbGllciAgIAlAMzQyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4Mzg4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAzNDgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNDQKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMywgMzEzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiIKLQkJCQkJY2xpZW50ICAgICAJQDM0NAotCQkJCQlzdXBwbGllciAgIAlAMzQzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNCwgNjA0KQotCQkJCQkgICAgKDE3NCwgNjA0KQotCQkJCQkgICAgKDE3NCwgMjI1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAyMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDI3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3NzI5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiIEAzNTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNSwgMjAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJVHlwZXMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDE1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJCQl3aWR0aCAgICAgIAkyNDgKLQkJCQloZWlnaHQgICAgIAkxNjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTksIDc1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MzkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQkJd2lkdGggICAgICAJNzU3Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDM1MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxMjE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTI5LCAxMTAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNjczCi0JCQkJaGVpZ2h0ICAgICAJMjUwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU5IiBAMzU0Ci0JCQkJbG9jYXRpb24gICAJKDE4MjYsIDk3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYwIiBAMzU1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzU0Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkJCWNsaWVudCAgICAgCUAzNTQKLQkJCQkJc3VwcGxpZXIgICAJQDM1MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgODU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3NCwgOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTY0ODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDM1NwotCQkJCQlQYXJlbnRfVmlldyAJQDM1NAotCQkJCQlsb2NhdGlvbiAgIAkoMzA2LCA0NDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA2LCAxMDMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA3NTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRSIKLQkJCQkJY2xpZW50ICAgICAJQDM1NAotCQkJCQlzdXBwbGllciAgIAlAMzUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCAxMDkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjUxNTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NBRENEM0IwMzgwIgotCQkJCWNsaWVudCAgICAgCUAzNDIKLQkJCQlzdXBwbGllciAgIAlAMzUxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwNSwgMzA3KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMzYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyMjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxNSwgMTMwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQl3aWR0aCAgICAgIAk1MDAKLQkJCQloZWlnaHQgICAgIAkyMTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNjIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiCi0JCQkJY2xpZW50ICAgICAJQDM0MgotCQkJCXN1cHBsaWVyICAgCUAzNjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTQsIDUwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCAzNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCXdpZHRoICAgICAgCTY4NwotCQkJCWhlaWdodCAgICAgCTIxNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDM2NAotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA0OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDM2NQotCQkJCQlQYXJlbnRfVmlldyAJQDM2NAotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMzg2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJCWNsaWVudCAgICAgCUAzNjQKLQkJCQkJc3VwcGxpZXIgICAJQDM2MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjA2LCA0OTMpCi0JCQkJCSAgICAoMTA5NCwgNDkzKQotCQkJCQkgICAgKDEwOTQsIDMzMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAzNzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyODMyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM2OAotCQkJCQlQYXJlbnRfVmlldyAJQDM2NAotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzk3MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkJCWNsaWVudCAgICAgCUAzNjQKLQkJCQkJc3VwcGxpZXIgICAJQDM2MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MSwgNDkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxNSwgNTQ2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjQ5NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTYsIDM5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk0OTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyIKLQkJCQljbGllbnQgICAgIAlAMzUyCi0JCQkJc3VwcGxpZXIgICAJQDM2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MTIsIDc0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgNTcyKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyIKLQkJCXF1aWQgICAgICAgCSIzQkNFODUzRDAyQzgiCi0JCQl0aXRsZSAgICAgIAkiMi4zIE1lc3NhZ2VzIgotCQkJem9vbSAgICAgICAJODUKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzczCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTWVzc2FnZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiCi0JCQkJd2lkdGggICAgICAJMzgwCi0JCQkJaGVpZ2h0ICAgICAJMzI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCIgQDM3NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDEyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBhcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCA3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIKLQkJCQl3aWR0aCAgICAgIAk2MTcKLQkJCQloZWlnaHQgICAgIAkzMjQKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDM3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA2OTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMjc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzc2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkJCWNsaWVudCAgICAgCUAzNzUKLQkJCQlzdXBwbGllciAgIAlAMzc0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwNCwgNjc4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA0LCAzODYpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDM3NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCXdpZHRoICAgICAgCTQzMgotCQkJCWhlaWdodCAgICAgCTMyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJCQljbGllbnQgICAgIAlAMzc3Ci0JCQkJc3VwcGxpZXIgICAJQDM3MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAzNzkKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFydHMiIEAzODAKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNzkKLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCA4OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTc0NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiCi0JCQkJCWNsaWVudCAgICAgCUAzNzkKLQkJCQkJc3VwcGxpZXIgICAJQDM3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTgwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDIwMzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMzg0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzc5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyIKLQkJCQkJY2xpZW50ICAgICAJQDM3OQotCQkJCQlzdXBwbGllciAgIAlAMzc3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY4OCwgOTUyKQotCQkJCQkgICAgKDQ0NSwgOTUyKQotCQkJCQkgICAgKDQ0NSwgODE3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDkxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ3NjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkpKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ4c2QiCi0JCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIlhTRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIm9yZy5lY2xpcHNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkieHNkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94c2QvMjAwMi9YU0QiKSkKLQkJcXVpZCAgICAgICAJIjM5QUJEQzZGMDFBQSIKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREFubm90YXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRFMjAzNjYiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXBwbGljYXRpb25JbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFQkYwMkM4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZXJJbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFRUEwMTU3IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RjA1MDFFMiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiRE9NQXR0ciIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCN0RDMDE5MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjEwM0JFIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y1MjAyQjQiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ4RTIwMEVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwM0EwMjIxIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFQjAyQTgiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjdCMDM4NiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlIgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjcyRDczNzAzOEYiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0NGMzAyN0QiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRERCMDNCNyIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWludCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDREUwMDJEOCIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjAyMjAzODIiCi0JCQkJdHlwZSAgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzE5RDkwMzQxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREJvdW5kZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2M0MwMjI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzUyQTAwQ0MiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5RmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjRGMDEzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1NkMwMTUzIgotCQkJCXR5cGUgICAgICAgCSJYU0RDYXJkaW5hbGl0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhCODAyODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJBQTIwMzEwIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVyaXZhdGlvbk1ldGhvZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNkU0MDIwRSIKLQkJCQl0eXBlICAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCIKLQkJCQlpbml0diAgICAgIAkicmVzdHJpY3Rpb24iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNzFEMDI2QSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MzgwMEM1IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQTQyMDJCOCIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNCOEEwM0U2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjYxODAxNEQiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGQjk3MDA2RSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWl4ZWQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzMxQUY1RTAzQTYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTkwM0QyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUREQjUwMUE1IgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW5pbmdGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpYWdub3N0aWMiCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNENEMwRjRDMDFBMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V2ZXJpdHkiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OTFDMDA1RCIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU1RkREMDI4MCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0MzAxNkIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5lIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjA3RTAyMTMiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2x1bW4iCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MTFFMDI5NiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vZGUiCi0JCQkJcXVpZCAgICAgICAJIjNDMDE2QjZCMDIwMCIKLQkJCQl0eXBlICAgICAgIAkiRE9NTm9kZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbm5vdGF0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0RjAxODYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjE3MDAyRSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTY2MDMzOSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmlsbGFibGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkZCNDAyOUYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNDY4MDM2OCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRBMDAzQjkiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNEUwMDAwRSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE0QzAwQjIiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNjgwMUMxIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODlGNjIwM0NGIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMzREQ0IwMDAxOCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERW51bWVyYXRpb25GYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOUQwM0M3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QzY0MDA1NCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Mzc0MDI1MyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhY2V0TmFtZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUZCNDAxRUMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlZmZlY3RpdmVWYWx1ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUFFMzAzQjYiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGZWF0dXJlIgotCQkJcXVpZCAgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4MTAyMEYiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4ODAwQzUiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnN0cmFpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZm9ybSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDJCMDMzRSIKLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjcxQTFCMDE2RiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImdsb2JhbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTAwNzAzNzIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmVhdHVyZVJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTA0NDAxODUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZpeGVkRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5OUUwMEMxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Qzg4MDFCNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkE2MDAyMDEiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qjk5MDAxNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc5RDIwMDhBIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5RTgwMUQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzdCMDM5NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDFDNzAxNDMiCi0JCQkJdHlwZSAgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEQ5MDAzRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QURCMTUwMzZDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREluY2x1ZGUiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDN0QwMjUwIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOERDMDM4MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRExlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc4MDAyREYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzZDMDA0QiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhFeGNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOEUwMzA5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQzMTAzQUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUUyMDFGNyIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTc0MDI3RCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExOTMwMzU0IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhJbmNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCODMwM0I4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heExlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3N0M3MDE0NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I3RDAwRkMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0RBMDBGMyIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5FeGNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTkwMjgxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQyNDAwOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUQxMDM5OCIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUEyMDA4RSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQkUwM0UyIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5JbmNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTIwMzUzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NzhDMDA2NSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNDAwQzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Nzk5MDE1RSIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEE2NDAyNzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tcG9zaXRvciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGMUQwMUNGIgotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wb3NpdG9yIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRTIwMzgxIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI1NTAzODUiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExRjYwMkU4IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lZENvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDAwMTQyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NDcwNDAzMUUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc05hbWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1N0YwMTI3IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidVJJIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTg3MDBFMiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzVVJJIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNUFBMDJBRiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwOTYzMDI1RSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDk0MzAyRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU0RjAyM0MiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5c3RlbUlkZW50aWZpZXIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzJFMDBGMCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lkZW50aWZpZXIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzM0MDM5NyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROdW1lcmljRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjQyMDA3NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1QTMwMDEyIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjU5MDEyQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc0RjYwMkRBIgotCQkJCXR5cGUgICAgICAgCSJYU0RPcmRlcmVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWluT2NjdXJzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOEUwM0IyIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWF4T2NjdXJzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOTkwM0FFIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3ODBCRDkwMDU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhdHRlcm5GYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDQTUwMzhEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qzc5MDMxMSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0QkEwMjNDIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNjgwMDIxNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkFFMjA2MDE3MiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNjQwMjQwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QUE2MDMxQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hIgotCQkJcXVpZCAgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0M0QTAxODIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQzI3ODRFNTAzREQiCi0JCQkJdHlwZSAgICAgICAJIkRPTURvY3VtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NjhFQzAyMjYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5QkZGMDE4MCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUZvcm1EZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNEIwMTAyIgotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIgotCQkJCWluaXR2ICAgICAgCSJ1bnF1YWxpZmllZCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Rm9ybURlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA3ODAwQUMiCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDNEE3MDAzOCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2tEZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY1OUQwMkQ4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIgotCQkJCXF1aWQgICAgICAgCSIzRDIyRDZEODAzNTYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCXF1aWQgICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhFNjAzNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJcXVpZCAgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NoZW1hTG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOUIzMDMzMCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY29wZSIKLQkJCXF1aWQgICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNENjQwMjMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzE1ODAwQTkiCi0JCQkJdHlwZSAgICAgICAJIlhTRFZhcmlldHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NDRGMDE0NiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2NUUwMzVBIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RTaW1wbGVGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWxpZEZhY2V0cyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEFCMEYwMEI2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRlcm0iCi0JCQlxdWlkICAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI0NDAwNjkiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3OUEwMDIwRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I2MTAzMzciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUFCMDIzMiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRjUwMTNBIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FCMTAwNEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg2MjAwNDUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODUwMDIwMSIKLQkJCQl0eXBlICAgICAgIAkiWFNEV2hpdGVTcGFjZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2lsZGNhcmQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMEU5MDE5RSIKLQkJCQl0eXBlICAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZUNvbnN0cmFpbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDRjg2MDIyMyIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2Nlc3NDb250ZW50cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMTJFMDFFNCIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBN0JEQjcwMUY5IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2RDg0RjcwMDkyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDkwMTUwM0RFIgotCQkJCXR5cGUgICAgICAgCSJYU0RYUGF0aFZhcmlldHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCN0JCQkUxMDFCMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01BdHRyIgotCQkJcXVpZCAgICAgICAJIjNCQkY4Qzg5MDFCNiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uQXR0ciIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjhDQjAwMEQ1IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTURvY3VtZW50IgotCQkJcXVpZCAgICAgICAJIjNDMjc4NTBFMDM4MSIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NTFCMDNDNiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNCODE4OTc5MDIwMCIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4MTg5REIwMzc0IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTU5vZGUiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Ob2RlIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjVCRjAwMkQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiVmFsdWUiCi0JCQlxdWlkICAgICAgIAkiM0MwNDBCNUIwMzFGIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuT2JqZWN0IgotCQkJCXF1aWQgICAgICAgCSIzQzA0MEI4RDAzRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0JBN0IwRTgwMUE4IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcHRpb25hbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMTUwMkI3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2hpYml0ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTIyMDJEMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjkwMkYwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDYXJkaW5hbGl0eSIKLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1RDAwOUIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbml0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxREMwMkVEIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvdW50YWJseUluZmluaXRlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFFQzAxNDEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhGaW5hbCIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzJDQTAxQ0IiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRTcwMERBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFQTAxNkEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZEMjAxMTIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvc2l0b3IiCi0JCQlxdWlkICAgICAgIAkiM0I4NjlCNjIwMDM3IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5QkQwMDAwMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaG9pY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0I4MDExRSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXF1ZW5jZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDRTUwMDU3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW50IgotCQkJcXVpZCAgICAgICAJIjNCODY5RTI2MDFBRSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOEUwMjU4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU5OTAyNzEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I4NkE3OUYwM0EyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbXB0eSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3Q0QwMkYwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNpbXBsZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDEwMENFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMzAxQjciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE9ubHkiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0Q3MDJFOSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGVyaXZhdGlvbk1ldGhvZCIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTBCMDAwQ0UiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQzgwMzI5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDQzAxNjIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpYWdub3N0aWNTZXZlcml0eSIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjhBNzAzMkYiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhdGFsIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhDMzAzRDAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXJyb3IiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEU3MDBFMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3YXJuaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFQTAxRkYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5mb3JtYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCRkU3RkMyMDE5QSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QTQwM0RGIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjc5MDA0NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjdGMDFBQyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2ODMwMjBCIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNDUwMDY5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGb3JtIgotCQkJcXVpZCAgICAgICAJIjNCOUY5MTNCMDFFQiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicXVhbGlmaWVkIgotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE2RjAwMjMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5xdWFsaWZpZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MThDMDA3RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I4NkExRTAwMjcyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXkiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEyMDA4NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXlyZWYiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEzMDE0RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlxdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjE2MDM2NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCOTdDNUVBMDAyMyIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW55IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2MDAwMzQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm90IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2MjAwNUYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V0IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2NTAxMTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWQiCi0JCQlxdWlkICAgICAgIAkiM0JDNzcxNTIwMkU0IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWxzZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQTkwMjcxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcnRpYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUJCMDFGRiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0b3RhbCIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQzQwMUIyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQcm9jZXNzQ29udGVudHMiCi0JCQlxdWlkICAgICAgIAkiM0I4RkY4QzcwMjg0IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHJpY3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY4MDA0NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXgiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY2MDM4QiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJza2lwIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhFODAyQkEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4QjAwQjgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjk0MDI5MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjUwMDI5NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlRmluYWwiCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyNUQwMjk1IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MTAyMzAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgzMDEzOCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODgwMjRFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RTAwMzc0IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1OTEwMEFFIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjY0MDIzMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NkQwMjE2IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RWYXJpZXR5IgotCQkJcXVpZCAgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXRvbWljIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBNzAyREYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUQwMTM5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRjAzOUYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2UiCi0JCQlxdWlkICAgICAgIAkiM0JFRUQwRjYwMzQyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVzZXJ2ZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMEYwMTE3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcGxhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI3MDM0RCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2xsYXBzZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjkwMzk2IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aFZhcmlldHkiCi0JCQlxdWlkICAgICAgIAkiM0I4RkZCODkwMzNBIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZWxlY3RvciIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQUMwMTkyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJCMzAyNzgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY0IgotCQkJcXVpZCAgICAgICAJIjNDNjI2RUE3MDEwMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjUiCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDY2IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQURDMDJGNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjciCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDIzOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjQyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjgiCi0JCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMDZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzBFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzE4IgotCQkJCWxhYmVsICAgICAgCSJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU2QjAyQ0IiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDcxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTciCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3MiIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI2QjAxOTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDczIgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2RDAzMDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMxMyIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzQiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMDYwMjkxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzYiCi0JCQlxdWlkICAgICAgIAkiM0I2OTQwNEUwMDY3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwNTAwMjlCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDJBNSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc4IgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTlGMDA4NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2QSIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlVXNlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgwIgotCQkJcXVpZCAgICAgICAJIjNDMjc1RDMyMDIyMCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBEIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODIiCi0JCQlxdWlkICAgICAgIAkiM0I2ODg3QkYwMTUwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBOCIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg0IgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjVFMDFGOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNTAiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODYiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1ODUwMTBEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQiIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg4IgotCQkJcXVpZCAgICAgICAJIjNCNkYxREU5MDE4QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODkiCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM2QyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM4MCIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MCIKLQkJCXF1aWQgICAgICAgCSIzQjkwMDY4ODAxQzIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkxIgotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50QW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2OEEwMTFCIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50QW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkyIgotCQkJcXVpZCAgICAgICAJIjNCNjgzMzM1MDM0MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzMzYwMjhFIgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk0IgotCQkJcXVpZCAgICAgICAJIjNCNkZEREQ3MDExMyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTYiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3REYwMjRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5OCIKLQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAwNkUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk5IgotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNEEiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDAiCi0JCQlxdWlkICAgICAgIAkiM0I2OThFMzYwMzg2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjk4RTM4MDA3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwN0MiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDIiCi0JCQlxdWlkICAgICAgIAkiM0I2ODUxQkEwMTI2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1MUJCMDE1MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTEiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDQiCi0JCQlxdWlkICAgICAgIAkiM0I3NTFCMDgwM0M3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJjb250YWluZXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0UiCi0JCQkJbGFiZWwgICAgICAJImNvbnRhaW5lciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA2IgotCQkJcXVpZCAgICAgICAJIjNCNzUxQjQ4MDI2MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdENvbnRhaW5lciIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NSIKLQkJCQlsYWJlbCAgICAgIAkicm9vdENvbnRhaW5lciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA4IgotCQkJcXVpZCAgICAgICAJIjNCNzUxQzMxMDM1NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFDMzMwMzNCIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEEwMDY2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDIzRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDI0OSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExMiIKLQkJCXF1aWQgICAgICAgCSIzQjY4OTExNDAxQUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNyIKLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE0IgotCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDA1OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0MwIgotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE2IgotCQkJcXVpZCAgICAgICAJIjNCNjgzM0VGMDE2MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE3IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk5IgotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExOCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDFFNjAyNTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExOSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQxRUEwMkY3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDMwQiIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjAiCi0JCQlxdWlkICAgICAgIAkiM0I2OUMwNTkwMTk4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IikKLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFRCIKLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyMiIKLQkJCXF1aWQgICAgICAgCSIzQzQyREJERDAyOTciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyMyIKLQkJCQlxdWlkICAgICAgIAkiM0M0MkRCRTAwMTFFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXAiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDEyOCIKLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjQiCi0JCQlxdWlkICAgICAgIAkiM0I2RDIzQjkwMUNEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUNFIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI2IgotCQkJcXVpZCAgICAgICAJIjNCNkQ1OTcxMDJFQSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDEwNSIKLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjciCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU5NzUwMTE5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyOCIKLQkJCXF1aWQgICAgICAgCSIzQjY5QjY1MzAxN0EiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjb3BlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZEIgotCQkJCWxhYmVsICAgICAgCSJzY29wZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyOSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzAiCi0JCQlxdWlkICAgICAgIAkiM0MyOTAxMDYwMkQ3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEZlYXR1cmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMEUiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRmVhdHVyZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMxIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAxOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAxODMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMzNDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDM0NiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNCIKLQkJCXF1aWQgICAgICAgCSIzQjY5RDI5RTAxNEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jZWRLZXkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2NSIKLQkJCQlsYWJlbCAgICAgIAkicmVmZXJlbmNlZEtleSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNiIKLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRDAwM0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInNlbGVjdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJbGFiZWwgICAgICAJInNlbGVjdG9yIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzgiCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzkiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmaWVsZHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM3OSIKLQkJCQlsYWJlbCAgICAgIAkiZmllbGRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDAiCi0JCQlxdWlkICAgICAgIAkiM0I2QURDRDgwMkZDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MiIKLQkJCXF1aWQgICAgICAgCSIzQjZBRENDNTAwN0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QURDQzYwMDZCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0NCIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNzAyQzgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTgwM0UyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE5MDAwNCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0NiIKLQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCMTAyRjgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDFCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCNjAwMjUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0OCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNjAyNkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInBhcnRpY2xlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIyIgotCQkJCWxhYmVsICAgICAgCSJwYXJ0aWNsZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1MCIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNTAwOEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMDk2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxNjAwQTAiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTIiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3QUMwMjVBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibW9kZWxHcm91cCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM5IgotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU0IgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ1MDM5OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU1IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM5RSIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU2IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBGMDIxMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU3IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMDAwQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEQzIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU4IgotCQkJcXVpZCAgICAgICAJIjNCNkI0NzE1MDExOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU5IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNCNSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzQzg5MDEyMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInRlcm0iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzQzhBMDExMSIKLQkJCQlsYWJlbCAgICAgIAkidGVybSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjIiCi0JCQlxdWlkICAgICAgIAkiM0I2QURFNDIwMDlBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDJGRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDMwOCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY0IgotCQkJcXVpZCAgICAgICAJIjNCNkFFODI0MDA1MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY1IgotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQjciCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjYiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhFNkIwMDNEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjciCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTZDMDEwNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMTEiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY4IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRThEMDFCRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY5IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTkiCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzAiCi0JCQlxdWlkICAgICAgIAkiM0I2NkZERkEwMEMzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkZERkIwMjdFIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MjAyMTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThDIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc0IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDA0OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc1IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzNzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDM3RSIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzYiCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFRkYwMjRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzciCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI1QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVGMDAwMjY0IgotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3OCIKLQkJCXF1aWQgICAgICAgCSIzQkZDMkExNzAxRUQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3OSIKLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjczIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3RCIKLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgwIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRUE3MDIzRSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgxIgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUVBODAzOEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhCIgotCQkJCWxhYmVsICAgICAgCSJub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODIiCi0JCQlxdWlkICAgICAgIAkiM0I2OUU0NTYwMjkwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFNDU3MDE2NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNkYiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NCIKLQkJCXF1aWQgICAgICAgCSIzQjZENUNBNTAxMTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0I0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0M4IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODYiCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1QUQwMzc0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODciCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAwNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRDb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDEwIgotCQkJCWxhYmVsICAgICAgCSJmYWNldENvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4OCIKLQkJCXF1aWQgICAgICAgCSIzQkM4QUUwMjAzQTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4OSIKLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDUxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA2NSIKLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTAiCi0JCQlxdWlkICAgICAgIAkiM0I2QzM0QjcwMjA4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNEJFMDI1OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWVtYmVyVHlwZURlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTkiCi0JCQkJbGFiZWwgICAgICAJIm1lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkyIgotCQkJcXVpZCAgICAgICAJIjNCNkMzNjMyMDFEQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkzIgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZ1bmRhbWVudGFsRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNjMiCi0JCQkJbGFiZWwgICAgICAJImZ1bmRhbWVudGFsRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk0IgotCQkJcXVpZCAgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk1IgotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NiIKLQkJCXF1aWQgICAgICAgCSIzQjZENTU3MjAxNkMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjJGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjQzIgotCQkJCWxhYmVsICAgICAgCSJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk4IgotCQkJcXVpZCAgICAgICAJIjNCNjlFMjkxMDE1OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxOUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDFBOSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMCIKLQkJCXF1aWQgICAgICAgCSIzQjkwMDZDRjAwODgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMSIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTVEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJkZXJpdmF0aW9uQW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTY3IgotCQkJCWxhYmVsICAgICAgCSJkZXJpdmF0aW9uQW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIzMzAyNjQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjg0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjhFIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDQiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTEwMjZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDFGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTIwMjAzIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA2IgotCQkJcXVpZCAgICAgICAJIjNDNjI2RUIzMDAwNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA3IgotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMzIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwOCIKLQkJCXF1aWQgICAgICAgCSIzQkVCREM4NzAyNDciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwOSIKLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMkY5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQkVCREM4QzAzMDMiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTAiCi0JCQlxdWlkICAgICAgIAkiM0JGRTYyMjcwM0NEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbXBvbmVudHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2QyIKLQkJCQlsYWJlbCAgICAgIAkiY29tcG9uZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEyIgotCQkJcXVpZCAgICAgICAJIjNCRkU2MjY5MDE2NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEzIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImRpYWdub3N0aWNzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI3IgotCQkJCWxhYmVsICAgICAgCSJkaWFnbm9zdGljcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNCIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMTAzNUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYWxsRGlhZ25vc3RpY3MiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNyIKLQkJCQlsYWJlbCAgICAgIAkiYWxsRGlhZ25vc3RpY3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE2IgotCQkJcXVpZCAgICAgICAJIjNDMjFEQ0M3MDBFQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE3IgotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZFNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZFNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxOCIKLQkJCXF1aWQgICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxOSIKLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjAiCi0JCQlxdWlkICAgICAgIAkiM0MyMzkxMzQwMDRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBDQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBENCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMiIKLQkJCXF1aWQgICAgICAgCSIzQzI1RDNBNjAxMzEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVmZXJlbmNpbmdEaXJlY3RpdmVzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzEiCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNCIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUNGMDAwNUUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDFFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFZlcnNpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMjgiCi0JCQkJbGFiZWwgICAgICAJInJvb3RWZXJzaW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI2IgotCQkJcXVpZCAgICAgICAJIjNDMjVFRDBCMDExQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI3IgotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmlnaW5hbFZlcnNpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMkIiCi0JCQkJbGFiZWwgICAgICAJIm9yaWdpbmFsVmVyc2lvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyOCIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUVBQjAwMUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyOSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTBCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMTUiCi0JCQkJbGFiZWwgICAgICAJImluY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzAiCi0JCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaXRlbVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwRTAiCi0JCQkJbGFiZWwgICAgICAJIml0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMyIgotCQkJcXVpZCAgICAgICAJIjNDMjc4NDczMDE5NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMzIgotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWFGb3JTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRkIiCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYUZvclNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNCIKLQkJCXF1aWQgICAgICAgCSIzQzI4ODBGNTAzRDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDAzQyIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDA0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM2IgotCQkJcXVpZCAgICAgICAJIjNDMjg4MkM1MDEzNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM3IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltYXJ5Q29tcG9uZW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODgyQzcwMTEzIgotCQkJCWxhYmVsICAgICAgCSJwcmltYXJ5Q29tcG9uZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzgiCi0JCQlxdWlkICAgICAgIAkiM0MyOEEwRjIwMUE0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwRjMwMkU1IgotCQkJCWxhYmVsICAgICAgCSJ0eXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJGMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTZEQjAxRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0REIgotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQyIgotCQkJcXVpZCAgICAgICAJIjNDMjhBNzEyMDEwOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNTEiCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzE0MDE1QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDQiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3NEIwMTc4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJzaW1wbGVUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3NEQwMTdCIgotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE4NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3RUQwM0MwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wbGV4VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDExNyIKLQkJCQlsYWJlbCAgICAgIAkiY29tcGxleFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDciCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NDAzMEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBERCIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBFNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTAiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwODUwMjVCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyN0EiCi0JCQkJbGFiZWwgICAgICAJIm1pbkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTIiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwOEQwMjUyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDhFMDA5MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOUIiCi0JCQkJbGFiZWwgICAgICAJIm1heEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTQiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUIwMzk2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4SW5jbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzRDQiCi0JCQkJbGFiZWwgICAgICAJIm1heEluY2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUYwMzM4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTciCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDFGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAyMDMiCi0JCQkJbGFiZWwgICAgICAJIm1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTgiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjMwMjA3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTkiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI0MDE5MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRXhjbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOUEiCi0JCQkJbGFiZWwgICAgICAJIm1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjAiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjYwMjhEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIxNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMjEiCi0JCQkJbGFiZWwgICAgICAJIm1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjIiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMDUxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibGVuZ3RoRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNTAiCi0JCQkJbGFiZWwgICAgICAJImxlbmd0aEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjQiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkYwMThDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAid2hpdGVTcGFjZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDc1IgotCQkJCWxhYmVsICAgICAgCSJ3aGl0ZVNwYWNlRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzIwMjFEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjciCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZW51bWVyYXRpb25GYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUMiCi0JCQkJbGFiZWwgICAgICAJImVudW1lcmF0aW9uRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNTAxNTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEIwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXR0ZXJuRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEJBIgotCQkJCWxhYmVsICAgICAgCSJwYXR0ZXJuRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEM4MDJBNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjcxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNhcmRpbmFsaXR5RmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRjUiCi0JCQkJbGFiZWwgICAgICAJImNhcmRpbmFsaXR5RmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMENCMDM5QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjczIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm51bWVyaWNGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMENDMDNEMSIKLQkJCQlsYWJlbCAgICAgIAkibnVtZXJpY0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMENGMDE5OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwODUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heExlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDhGIgotCQkJCWxhYmVsICAgICAgCSJtYXhMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ1MDBDNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBENjAwMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDI3IgotCQkJCWxhYmVsICAgICAgCSJtaW5MZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDBERSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzQ0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzRDciCi0JCQkJbGFiZWwgICAgICAJInRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMERCMDM3NyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNjQiCi0JCQkJbGFiZWwgICAgICAJImZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDA0OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yZGVyZWRGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNDMyIKLQkJCQlsYWJlbCAgICAgIAkib3JkZXJlZEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEUzMDBEOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOEUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJvdW5kZWRGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEU0MDM5OCIKLQkJCQlsYWJlbCAgICAgIAkiYm91bmRlZEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ0MDFFQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzZBIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNTRGMDE0NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOEMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM5NiIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCNUM0MDExQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjE3IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCNjJBMDBBQSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxNDIiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNkIwMDNBNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMiIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlUGF0dGVybkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCN0NBMDI2QiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxOTAiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCODQwMDA2MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMjciCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCODk4MDE2RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5OTAwNTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDYwIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDA1MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0MzIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCOTcwMDFEQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwQ0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMEQ5IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA2IgotCQkJcXVpZCAgICAgICAJIjNENEJCNEFFMDFDQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA3IgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRjAxMEYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY0ZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTFBIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNGYWNldHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA4IgotCQkJcXVpZCAgICAgICAJIjNENEJCNEQzMDI4RSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA5IgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRENDAyRjMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkZEIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTAiCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDkwMUY2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTEiCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNERBMDI4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyOEUiCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMiIKLQkJCXF1aWQgICAgICAgCSIzRDRDNjhGRjAxQkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMyIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QzY5MDIwMzE3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxOCIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljV2lsZGNhcmQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDc2ODAxMzgiCi0JCQl0aXRsZSAgICAgIAkiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEAzODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAzODgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzODkKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAyMjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM4NwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTI4LCAyMjUpCi0JCQkJICAgICg5MjgsIDEzNSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMzkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYwLCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzkxCi0JCQkJbG9jYXRpb24gICAJKDEyMDMsIDcwNikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzg4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMjAzLCA3MDYpCi0JCQkJICAgICgxMjAzLCA2MTUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBAMzkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDU2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzcyLCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOTMKLQkJCQlsb2NhdGlvbiAgIAkoNDQ0LCA3MDkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM5MgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDQ0LCA3MDkpCi0JCQkJICAgICg0NDQsIDYxNSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzOTQKLQkJCQlsb2NhdGlvbiAgIAkoMTU3MiwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzOTAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE1NzIsIDQ2NSkKLQkJCQkgICAgKDE1NzIsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDM5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI5MCwgNzU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDM5NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAxMDU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjIsIDEwMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDM5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEwNCwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MzYsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCXdpZHRoICAgICAgCTM1NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5OAotCQkJCWxvY2F0aW9uICAgCSg0NTMsIDEyMDMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM5NgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDUzLCAxMjAzKQotCQkJCSAgICAoNDUzLCAxMTExKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAMzk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA0MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCA4MDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDYsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDEKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgOTUwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MDAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4NzIsIDk1MCkKLQkJCQkgICAgKDE4NzIsIDg1NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDIKLQkJCQlsb2NhdGlvbiAgIAkoMTgxLCA0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM5OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTgxLCA0NjUpCi0JCQkJICAgICgxODEsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDQwMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTI4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MCwgMTIzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNTUwCi0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANDA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMDU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzM0LCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDQwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OSwgMTQ0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2NTYKLQkJCQloZWlnaHQgICAgIAkxMTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANDA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCAxNDg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDMsIDE0NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNTgxCi0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0MDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDU2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDQwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTA1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDA5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDYsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQxMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDYsIDEyNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDQxMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDYwLCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA0MTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDEyODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMTIzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQxMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMCwgMTQ0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTY5NAotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBANDE0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQyNiwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTMxOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDQxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDAyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCWNsaWVudCAgICAgCUAzOTcKLQkJCQlzdXBwbGllciAgIAlAMzg3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NCwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDQxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgODAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQxOAotCQkJCWxvY2F0aW9uICAgCSg5NjIsIDk0NykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDE3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg5NjIsIDk0NykKLQkJCQkgICAgKDk2MiwgODU1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDE5Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDIwCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTgsIDExNTQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjM1MzQKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJY2xpZW50ICAgICAJQDQxMAotCQkJCXN1cHBsaWVyICAgCUAzOTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDksIDEyNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OSwgNzA5KQotCQkJCWRyYXdTdXBwbGllciAJQDM5MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDQxMAotCQkJCXN1cHBsaWVyICAgCUAzOTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTYsIDEyNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgMTIwMykKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDIyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIgotCQkJCWNsaWVudCAgICAgCUA0MTEKLQkJCQlzdXBwbGllciAgIAlAMzk5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg0LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiCi0JCQkJY2xpZW50ICAgICAJQDQwOQotCQkJCXN1cHBsaWVyICAgCUAzOTAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDAyLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMDIsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDI0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCWNsaWVudCAgICAgCUAzOTAKLQkJCQlzdXBwbGllciAgIAlAMzg3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OSwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY5LCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzg5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQljbGllbnQgICAgIAlANDA3Ci0JCQkJc3VwcGxpZXIgICAJQDM5MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTAsIDUwNSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5MCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDM5NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MjYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciCi0JCQkJY2xpZW50ICAgICAJQDM5NQotCQkJCXN1cHBsaWVyICAgCUAzOTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MTAsIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA3MDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQyNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQljbGllbnQgICAgIAlANDEyCi0JCQkJc3VwcGxpZXIgICAJQDQxNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjEsIDEyMjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjEsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDI4Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDI5Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM3LCA4ODYpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTU4MTIKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDQwNAotCQkJCXN1cHBsaWVyICAgCUAzOTAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjAwLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjAwLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlANDA0Ci0JCQkJc3VwcGxpZXIgICAJQDQwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEwMDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDk1MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDMxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUAzOTYKLQkJCQlzdXBwbGllciAgIAlANDE3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDUwLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDMyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIgotCQkJCWNsaWVudCAgICAgCUAzOTkKLQkJCQlzdXBwbGllciAgIAlAMzg3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3LCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODRGNzAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDQxNQotCQkJCXN1cHBsaWVyICAgCUAzODcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDEyLCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTIsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QjgwMjg2IgotCQkJCWNsaWVudCAgICAgCUAzOTIKLQkJCQlzdXBwbGllciAgIAlAMzg3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM0LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgzNCwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJY2xpZW50ICAgICAJQDM4OAotCQkJCXN1cHBsaWVyICAgCUAzODcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUwLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTAsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzODkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2IgotCQkJCWNsaWVudCAgICAgCUA0MTQKLQkJCQlzdXBwbGllciAgIAlAMzg3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTcyLCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3MiwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM4OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiCi0JCQkJY2xpZW50ICAgICAJQDQwMwotCQkJCXN1cHBsaWVyICAgCUA0MDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkzLCAxMjIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjkzLCA5NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQljbGllbnQgICAgIAlANDA1Ci0JCQkJc3VwcGxpZXIgICAJQDM4OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDE0MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIgotCQkJCWNsaWVudCAgICAgCUA0MDYKLQkJCQlzdXBwbGllciAgIAlAMzg4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMSwgMTQzMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMSwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDQxNwotCQkJCXN1cHBsaWVyICAgCUAzODgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTksIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCA3MDYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQljbGllbnQgICAgIAlANDAwCi0JCQkJc3VwcGxpZXIgICAJQDM4OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzIsIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3MiwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiCi0JCQkJY2xpZW50ICAgICAJQDQwOAotCQkJCXN1cHBsaWVyICAgCUA0MTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjIsIDEwMDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2MiwgOTQ3KQotCQkJCWRyYXdTdXBwbGllciAJQDQxOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDMKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0NDQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDk1LCAxMzg4KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDQyNTMxCi0JCQkJICAgIGhlaWdodCAgICAgCTY3Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUJBQTIwMzEwIgotCQkJCWNsaWVudCAgICAgCUA0MTMKLQkJCQlzdXBwbGllciAgIAlAMzk5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgsIDE0MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlANDEzCi0JCQkJc3VwcGxpZXIgICAJQDM5NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY1NiwgMTQyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAxMjAzKQotCQkJCWRyYXdTdXBwbGllciAJQDM5OCkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuIENvbXBvbmVudCBSZWxhdGlvbnMgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIgotCQkJcXVpZCAgICAgICAJIjM3NEIxODE5MDAyOCIKLQkJCXRpdGxlICAgICAgCSIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXpvb20gICAgICAgCTk2Ci0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBANDQ2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzg0LCAxNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzAsIDE1OTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA0NDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDE2MzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyOCIgQDQ0OAotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDE2MjcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTMwMTdBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY29wZSIgQDQ0OQotCQkJCQlQYXJlbnRfVmlldyAJQDQ0OAotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU1LCAxNTg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Njb3BlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzEyNTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkQiCi0JCQkJCWNsaWVudCAgICAgCUA0NDgKLQkJCQkJc3VwcGxpZXIgICAJQDQ0NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYxLCAxNjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDQ5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNjY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTEwMTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyOSIgQDQ1MgotCQkJCQlQYXJlbnRfVmlldyAJQDQ0OAotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RSIKLQkJCQkJY2xpZW50ICAgICAJQDQ0OAotCQkJCQlzdXBwbGllciAgIAlANDQ3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMjcsIDE2MjcpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA0NTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODQsIDExOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0NTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNzYsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNjgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjAiIEA0NTUKLQkJCQlsb2NhdGlvbiAgIAkoMjIyOSwgMTExMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4OTAxMjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MSIgQDQ1NgotCQkJCQlQYXJlbnRfVmlldyAJQDQ1NQotCQkJCQlsb2NhdGlvbiAgIAkoNTQ5LCAtMjQ4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMCIKLQkJCQkJY2xpZW50ICAgICAJQDQ1NQotCQkJCQlzdXBwbGllciAgIAlANDU0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInRlcm0iIEA0NTcKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTUKLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNTcsIDExMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdGVybSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTM0MzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTExIgotCQkJCQljbGllbnQgICAgIAlANDU1Ci0JCQkJCXN1cHBsaWVyICAgCUA0NTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3NCwgMTExOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTE5NDAzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQ2MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMTIzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCXdpZHRoICAgICAgCTUyMgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA0NjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NywgNzI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCXdpZHRoICAgICAgCTM1MgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0OCIgQDQ2MgotCQkJCWxvY2F0aW9uICAgCSgyMjE5LCA4ODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDYwMjZGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDkiIEA0NjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjIKLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIxIgotCQkJCQljbGllbnQgICAgIAlANDYyCi0JCQkJCXN1cHBsaWVyICAgCUA0NjEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDgyMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcnRpY2xlcyIgQDQ2NAotCQkJCQlQYXJlbnRfVmlldyAJQDQ2MgotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDY1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDUsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0aWNsZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NjYyNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjIiCi0JCQkJCWNsaWVudCAgICAgCUA0NjIKLQkJCQkJc3VwcGxpZXIgICAJQDQ1NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxOSwgOTM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4MSwgODg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0NjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NzYsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzOSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0NjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNSwgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCXdpZHRoICAgICAgCTM1MgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NCIgQDQ3MAotCQkJCWxvY2F0aW9uICAgCSg1OTAsIDExNDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEA0NzEKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzAKLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSIKLQkJCQkJY2xpZW50ICAgICAJQDQ3MAotCQkJCQlzdXBwbGllciAgIAlANDY5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDU5MCwgMTE0MCkKLQkJCQkJICAgICg1NDAsIDExNDApCi0JCQkJCSAgICAoNTQwLCAxMDQ1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MCwgMTE0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU0MCwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ3MgotCQkJCQlQYXJlbnRfVmlldyAJQDQ3MAotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDExNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4wNTM1NzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyQTUiCi0JCQkJCWNsaWVudCAgICAgCUA0NzAKLQkJCQkJc3VwcGxpZXIgICAJQDQ2OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1OTAsIDExNDApCi0JCQkJCSAgICAoNjQxLCAxMTQwKQotCQkJCQkgICAgKDY0MSwgMTA0NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDEsIDEwNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODQsIDEwOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xMjI0NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTYiIEA0NzYKLQkJCQlsb2NhdGlvbiAgIAkoMTExOSwgMTExMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdERjAyNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk3IiBANDc3Ci0JCQkJCVBhcmVudF9WaWV3IAlANDc2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZEIgotCQkJCQljbGllbnQgICAgIAlANDc2Ci0JCQkJCXN1cHBsaWVyICAgCUA0NzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMDQ1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudFR5cGUiIEA0NzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTksIDExMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkUiCi0JCQkJCWNsaWVudCAgICAgCUA0NzYKLQkJCQkJc3VwcGxpZXIgICAJQDQ2MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDExNzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxMTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAyIiBANDgxCi0JCQkJbG9jYXRpb24gICAJKDE0NTUsIDk4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQTAxMjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMyIgQDQ4MgotCQkJCQlQYXJlbnRfVmlldyAJQDQ4MQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MCIKLQkJCQkJY2xpZW50ICAgICAJQDQ4MQotCQkJCQlzdXBwbGllciAgIAlANDc1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjgwLCA5ODIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDQ4MwotCQkJCQlQYXJlbnRfVmlldyAJQDQ4MQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDgzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NSwgOTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYyODU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCQljbGllbnQgICAgIAlANDgxCi0JCQkJCXN1cHBsaWVyICAgCUA0NjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzAsIDk4MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTAsIDEwMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0Mjg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5OCIgQDQ4NgotCQkJCWxvY2F0aW9uICAgCSg5MjEsIDEyMDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMDZFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5OSIgQDQ4NwotCQkJCQlQYXJlbnRfVmlldyAJQDQ4NgotCQkJCQlsb2NhdGlvbiAgIAkoLTg3MSwgLTM3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNDkiCi0JCQkJCWNsaWVudCAgICAgCUA0ODYKLQkJCQkJc3VwcGxpZXIgICAJQDQ3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMDQ1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDQ4OAotCQkJCQlQYXJlbnRfVmlldyAJQDQ4NgotCQkJCQlsb2NhdGlvbiAgIAkoLTg3MSwgLTM3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTI1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjk5MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTE0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzRBIgotCQkJCQljbGllbnQgICAgIAlANDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA0NjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyMSwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTM3MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3OSwgMTI1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjg4MzQ0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDQ5MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDc2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMiwgNzI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJMzk4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA0OTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDE2MzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjMsIDE1OTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA0OTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwMywgNDA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTIiIEA0OTQKLQkJCQlsb2NhdGlvbiAgIAkoMjIxNiwgNjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUzIiBANDk1Ci0JCQkJCVBhcmVudF9WaWV3IAlANDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTUyLCAtODE2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOCIKLQkJCQkJY2xpZW50ICAgICAJQDQ5NAotCQkJCQlzdXBwbGllciAgIAlANDkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA1MDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwIiBANDk2Ci0JCQkJCVBhcmVudF9WaWV3IAlANDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTUyLCAtODE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgNjI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MjYwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzkiCi0JCQkJCWNsaWVudCAgICAgCUA0OTQKLQkJCQkJc3VwcGxpZXIgICAJQDQ2MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxNiwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNzE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NiwgNjMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMzM2NDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANDk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjE5LCAxMzgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODIiIEA1MDAKLQkJCQlsb2NhdGlvbiAgIAkoMTY3NiwgMTIwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdCRjAxNTAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgzIiBANTAxCi0JCQkJCVBhcmVudF9WaWV3IAlANTAwCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE3IgotCQkJCQljbGllbnQgICAgIAlANTAwCi0JCQkJCXN1cHBsaWVyICAgCUA0OTkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMzcxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmQiIEA1MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDAKLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTcsIDExMDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYyNTc2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTgiCi0JCQkJCWNsaWVudCAgICAgCUA1MDAKLQkJCQkJc3VwcGxpZXIgICAJQDQ2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEwNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjE4LCAxMTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTk2MzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTU5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzgiIEA1MDUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyOSwgMTQzOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU5RjAwODYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc5IiBANTA2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNUEwMDA2OSIKLQkJCQkJY2xpZW50ICAgICAJQDUwNQotCQkJCQlzdXBwbGllciAgIAlANDk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMCwgMTQzOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA1MDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDUKLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA1LCAxNTA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMjU5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNUEwMDA2QSIKLQkJCQkJY2xpZW50ICAgICAJQDUwNQotCQkJCQlzdXBwbGllciAgIAlANDY4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI0OCwgMTQzOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjcsIDEzOTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU2MzUzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDUxMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg2IiBANTExCi0JCQkJbG9jYXRpb24gICAJKDc3NywgMTQyNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NTAxMEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg3IiBANTEyCi0JCQkJCVBhcmVudF9WaWV3IAlANTExCi0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTg2MDBGQSIKLQkJCQkJY2xpZW50ICAgICAJQDUxMQotCQkJCQlzdXBwbGllciAgIAlANDY4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzcsIDE0MjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTYsIDE0MjUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDUxMwotCQkJCQlQYXJlbnRfVmlldyAJQDUxMQotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc4NCwgMTUwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1OTI1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTg2MDBGQiIKLQkJCQkJY2xpZW50ICAgICAJQDUxMQotCQkJCQlzdXBwbGllciAgIAlANTEwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzcsIDE0MjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTgsIDE0MjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjEsIDEzODUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3MjQ0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MCIgQDUxNgotCQkJCWxvY2F0aW9uICAgCSgyMzcsIDEyMDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkIwMkNCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MSIgQDUxNwotCQkJCQlQYXJlbnRfVmlldyAJQDUxNgotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNDMsIDcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTZEMDBBNiIKLQkJCQkJY2xpZW50ICAgICAJQDUxNgotCQkJCQlzdXBwbGllciAgIAlANTEwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzcsIDEzNzEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbiIgQDUxOAotCQkJCQlQYXJlbnRfVmlldyAJQDUxNgotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNDMsIDcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzg4LCAxMjQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNTZEMDBBNyIKLQkJCQkJY2xpZW50ICAgICAJQDUxNgotCQkJCQlzdXBwbGllciAgIAlANDY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzcsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzcsIDEwNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTUsIDEyNDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA1MjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgNzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgsIDc0MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTIiIEA1MjIKLQkJCQlsb2NhdGlvbiAgIAkoNzI4LCA3NzUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzUwMzQwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MyIgQDUyMwotCQkJCQlQYXJlbnRfVmlldyAJQDUyMgotCQkJCQlsb2NhdGlvbiAgIAkoLTg1NiwgLTU3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzM2MDI4RCIKLQkJCQkJY2xpZW50ICAgICAJQDUyMgotCQkJCQlzdXBwbGllciAgIAlANDc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDcyOCwgNzc1KQotCQkJCQkgICAgKDc4OCwgNzc1KQotCQkJCQkgICAgKDc4OCwgOTM5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcyOCwgNzc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg4LCA5MzkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA1MjQKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjIKLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1OCwgODgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMTQwOTQwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzM2MDI4RSIKLQkJCQkJY2xpZW50ICAgICAJQDUyMgotCQkJCQlzdXBwbGllciAgIAlANTIxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3OSwgNzc1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzUwLCA4MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNTI0MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDUyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDE3LCA0MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjA4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM0IiBANTI4Ci0JCQkJbG9jYXRpb24gICAJKDE2MjksIDU3NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RDI5RTAxNEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jZWRLZXkiIEA1MjkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjgKLQkJCQkJbG9jYXRpb24gICAJKC04MywgOTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYxLCA2MDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVmZXJlbmNlZEtleSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjc5NzI5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2NSIKLQkJCQkJY2xpZW50ICAgICAJQDUyOAotCQkJCQlzdXBwbGllciAgIAlANTI3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MjksIDU3NCkKLQkJCQkJICAgICgxNTU1LCA1NzQpCi0JCQkJCSAgICAoMTU1NSwgNTAxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjksIDU3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDUwMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjIsIDUzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ3NjE5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzUiIEA1MzIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjgKLQkJCQkJbG9jYXRpb24gICAJKC04MywgOTQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyQTgwMTZGIgotCQkJCQljbGllbnQgICAgIAlANTI4Ci0JCQkJCXN1cHBsaWVyICAgCUA1MjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYyOSwgNTc0KQotCQkJCQkgICAgKDE2ODksIDU3NCkKLQkJCQkJICAgICgxNjg5LCA0NDQpCi0JCQkJCSAgICAoMTYxNiwgNDQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjksIDU3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTYsIDQ0NCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM4IiBANTMzCi0JCQkJbG9jYXRpb24gICAJKDExOTcsIDYwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAwMjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzOSIgQDUzNAotCQkJCQlQYXJlbnRfVmlldyAJQDUzMwotCQkJCQlsb2NhdGlvbiAgIAkoLTExNSwgMzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1IgotCQkJCQljbGllbnQgICAgIAlANTMzCi0JCQkJCXN1cHBsaWVyICAgCUA1MjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDUzNQotCQkJCQlQYXJlbnRfVmlldyAJQDUzMwotCQkJCQlsb2NhdGlvbiAgIAkoLTExNSwgMzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTE5LCA2NTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzkyNTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTc4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJCWNsaWVudCAgICAgCUA1MzMKLQkJCQkJc3VwcGxpZXIgICAJQDQ5MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgNzE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MywgNjU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk5MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM2IiBANTM4Ci0JCQkJbG9jYXRpb24gICAJKDE0MTUsIDYwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNyIgQDUzOQotCQkJCQlQYXJlbnRfVmlldyAJQDUzOAotCQkJCQlsb2NhdGlvbiAgIAkoMTAzLCAzMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiCi0JCQkJCWNsaWVudCAgICAgCUA1MzgKLQkJCQkJc3VwcGxpZXIgICAJQDUyNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNTAxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEA1NDAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzgKLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEzLCA2NTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQxMTIxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIzNCIKLQkJCQkJY2xpZW50ICAgICAJQDUzOAotCQkJCQlzdXBwbGllciAgIAlANDkxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE1LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDE1LCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzgxLCA2NTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5MjUyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA1NDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDIyLCA2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTU5OQotCQkJCWhlaWdodCAgICAgCTIwOQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MCIgQDU0NAotCQkJCWxvY2F0aW9uICAgCSgyMzk1LCA2MDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTcwMjNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODEiIEA1NDUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDQKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEEiCi0JCQkJCWNsaWVudCAgICAgCUA1NDQKLQkJCQkJc3VwcGxpZXIgICAJQDU0MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzk1LCA2MDYpCi0JCQkJCSAgICAoMjM5NSwgNjUpCi0JCQkJCSAgICAoMTYxMSwgNjUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM5NSwgNjA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgNjUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJub3RhdGlvbkRlY2xhcmF0aW9ucyIgQDU0NgotCQkJCQlQYXJlbnRfVmlldyAJQDU0NAotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgMTc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4OSwgMTA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK25vdGF0aW9uRGVjbGFyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDg5Nzc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRUE4MDM4QiIKLQkJCQkJY2xpZW50ICAgICAJQDU0NAotCQkJCQlzdXBwbGllciAgIAlANDkyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzOTUsIDYwNikKLQkJCQkJICAgICgyMzk1LCAxNjMzKQotCQkJCQkgICAgKDIwOTgsIDE2MzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM5NSwgNjA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5OCwgMTYzMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNDQsIDEwNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4NzgyOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzYiIEA1NDkKLQkJCQlsb2NhdGlvbiAgIAkoMTc3MiwgMjQ5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUZGMDI0RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc3IiBANTUwCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ5Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI1QSIKLQkJCQkJY2xpZW50ICAgICAJQDU0OQotCQkJCQlzdXBwbGllciAgIAlANTQzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzcyLCAyNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAyNDkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiIEA1NTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDkKLQkJCQkJbG9jYXRpb24gICAJKC05NDgsIC0zMjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc2LCAzMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTM1OTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTI0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVGMDAwMjY0IgotCQkJCQljbGllbnQgICAgIAlANTQ5Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTc3MiwgMjQ5KQotCQkJCQkgICAgKDE4MzIsIDI0OSkKLQkJCQkJICAgICgxODMyLCAzOTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgzMiwgMzk1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMzQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mzc4NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcyIiBANTU0Ci0JCQkJbG9jYXRpb24gICAJKDIzNDYsIDUxOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MjAyMTYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MyIgQDU1NQotCQkJCQlQYXJlbnRfVmlldyAJQDU1NAotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NzIsIDE4NTcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjYzMDA3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDc1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU5MzAxOEIiCi0JCQkJCWNsaWVudCAgICAgCUA1NTQKLQkJCQkJc3VwcGxpZXIgICAJQDU0MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQ2LCA1MTgpCi0JCQkJCSAgICAoMjM0NiwgMTQ5KQotCQkJCQkgICAgKDE2MTEsIDE0OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1MTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjExLCAxNDkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIiBANTU3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTU0Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTQsIDg2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwOCwgMTk1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zNDk5NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTMzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThDIgotCQkJCQljbGllbnQgICAgIAlANTU0Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0NiwgNTE4KQotCQkJCQkgICAgKDIzNDYsIDE0NDEpCi0JCQkJCSAgICAoMjE2NiwgMTQ0MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1MTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTY2LCAxNDQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI5OSwgMTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ4ODYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NCIgQDU2MAotCQkJCWxvY2F0aW9uICAgCSgyMDMsIDE1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAwNDkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3NSIgQDU2MQotCQkJCQlQYXJlbnRfVmlldyAJQDU2MAotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4NSwgLTI3MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAzNzQiCi0JCQkJCWNsaWVudCAgICAgCUA1NjAKLQkJCQkJc3VwcGxpZXIgICAJQDU0MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxNTkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0eXBlRGVmaW5pdGlvbnMiIEA1NjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjAKLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNDksIDE5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS40NzU3MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU3NjAzN0UiCi0JCQkJCWNsaWVudCAgICAgCUA1NjAKLQkJCQkJc3VwcGxpZXIgICAJQDUyMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMDMsIDE1OSkKLQkJCQkJICAgICgxMDQsIDE1OSkKLQkJCQkJICAgICgxMDQsIDc4NCkKLQkJCQkJICAgICgxODksIDc4NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDMsIDE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OSwgNzg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1LCAyMDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTcwMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzgiIEA1NjUKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgMzI5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkMyQTE3MDFFRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc5IiBANTY2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTY1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTc3LCAtMjMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjczIgotCQkJCQljbGllbnQgICAgIAlANTY1Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDI2NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANTY3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTY1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTc3LCAtMjMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzc1LCAzMzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMDk1MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExQTAyN0QiCi0JCQkJCWNsaWVudCAgICAgCUA1NjUKLQkJCQkJc3VwcGxpZXIgICAJQDUyNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgMzI5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgMzk1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxOCwgMzM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMDcxNDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcwIiBANTcwCi0JCQkJbG9jYXRpb24gICAJKDQ4LCAzMjApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkEwMEMzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzEiIEA1NzEKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzAKLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RCIKLQkJCQkJY2xpZW50ICAgICAJQDU3MAotCQkJCQlzdXBwbGllciAgIAlANTQzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5LCAzMjIpCi0JCQkJCSAgICAoNDksIDY4KQotCQkJCQkgICAgKDEwMTMsIDY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCA2OCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyIgQDU3MgotCQkJCQlQYXJlbnRfVmlldyAJQDU3MAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC0yODgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzgsIDEwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xOTg1MzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkZERkIwMjdFIgotCQkJCQljbGllbnQgICAgIAlANTcwCi0JCQkJCXN1cHBsaWVyICAgCUA1MTAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDksIDMyMikKLQkJCQkJICAgICg0OSwgMTQxNSkKLQkJCQkJICAgICgxNzQsIDE0MTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDksIDMyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMTQxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxLCAxMDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xOTY3MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANTc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1LCA0MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk1MDEKLQkJCQloZWlnaHQgICAgIAk5NwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMCIgQDU3NgotCQkJCWxvY2F0aW9uICAgCSg0OTksIDU4OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1OTAxOTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMSIgQDU3NwotCQkJCQlQYXJlbnRfVmlldyAJQDU3NgotCQkJCQlsb2NhdGlvbiAgIAkoLTEzLCAxMDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUUzIgotCQkJCQljbGllbnQgICAgIAlANTc2Ci0JCQkJCXN1cHBsaWVyICAgCUA1NzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDk5LCA1ODkpCi0JCQkJCSAgICAoNDUyLCA1ODkpCi0JCQkJCSAgICAoNDUyLCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTIsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iIEA1NzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzYKLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODExLCA1ODUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTYuNTIwODMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QzA1RDAxRUQiCi0JCQkJCWNsaWVudCAgICAgCUA1NzYKLQkJCQkJc3VwcGxpZXIgICAJQDU3NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OTksIDU4OSkKLQkJCQkJICAgICg1NDcsIDU4OSkKLQkJCQkJICAgICg1NDcsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTksIDU4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU0NywgNDk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDk5LCA1NTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTQiIEA1ODEKLQkJCQlsb2NhdGlvbiAgIAkoMjQxLCA2MTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwMDU4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTUiIEA1ODIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODEKLQkJCQkJbG9jYXRpb24gICAJKC0xMzQzLCAtMjE5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDNCRiIKLQkJCQkJY2xpZW50ICAgICAJQDU4MQotCQkJCQlzdXBwbGllciAgIAlANTc1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNDEsIDYxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MSwgNDk2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEA1ODMKLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODEKLQkJCQkJbG9jYXRpb24gICAJKC0xMzQzLCAtMjE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTgzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA4LCA2OTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4NjQ0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQzAiCi0JCQkJCWNsaWVudCAgICAgCUA1ODEKLQkJCQkJc3VwcGxpZXIgICAJQDUyMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDczMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgNjg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTAxNjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE2IiBANTg2Ci0JCQkJbG9jYXRpb24gICAJKDgzNywgNDYwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzM0VGMDE2MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE3IiBANTg3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTg2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCIKLQkJCQkJY2xpZW50ICAgICAJQDU4NgotCQkJCQlzdXBwbGllciAgIAlANTc1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgNDYwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEA1ODgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODYKLQkJCQkJbG9jYXRpb24gICAJKC0xODE5LCAtNjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDUyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjUxNDYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk5IgotCQkJCQljbGllbnQgICAgIAlANTg2Ci0JCQkJCXN1cHBsaWVyICAgCUA1MjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNywgNDYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwOCwgNDYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA0MDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzMDQzNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjgiIEA1OTEKLQkJCQlsb2NhdGlvbiAgIAkoNTQxLCAyNDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEQwMUJGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjkiIEA1OTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTEKLQkJCQkJbG9jYXRpb24gICAJKC0xMTIzLCAtMTg2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OCIKLQkJCQkJY2xpZW50ICAgICAJQDU5MQotCQkJCQlzdXBwbGllciAgIAlANTQzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NDEsIDI0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTMsIDI0NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVsZW1lbnREZWNsYXJhdGlvbnMiIEA1OTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTEKLQkJCQkJbG9jYXRpb24gICAJKC0xMTIzLCAtMTg2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQzLCAzMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA5MzAyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOEUwMTk5IgotCQkJCQljbGllbnQgICAgIAlANTkxCi0JCQkJCXN1cHBsaWVyICAgCUA1NzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTQxLCAyNDYpCi0JCQkJCSAgICAoMjI0LCAyNDYpCi0JCQkJCSAgICAoMjI0LCA0MDApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjQsIDQwMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTk1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NiwgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ2OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIyIiBANTk2Ci0JCQkJbG9jYXRpb24gICAJKDM1MywgNjIxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDNDJEQkREMDI5NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIzIiBANTk3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTk2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMUUiCi0JCQkJCWNsaWVudCAgICAgCUA1OTYKLQkJCQkJc3VwcGxpZXIgICAJQDU3NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNTMsIDYyMSkKLQkJCQkJICAgICgzMDYsIDYyMSkKLQkJCQkJICAgICgzMDYsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwNiwgNDk2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3Vic3RpdHV0aW9uR3JvdXAiIEA1OTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTYKLQkJCQkJbG9jYXRpb24gICAJKC02MywgMTczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc5LCA2MzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3Vic3RpdHV0aW9uR3JvdXAiCi0JCQkJCSAgICBwY3REaXN0ICAgIAk0LjgwODUxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDJEQkUwMDEyOCIKLQkJCQkJY2xpZW50ICAgICAJQDU5NgotCQkJCQlzdXBwbGllciAgIAlANTc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDM1MywgNjIxKQotCQkJCQkgICAgKDQwMCwgNjIxKQotCQkJCQkgICAgKDQwMCwgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM1MywgNjIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA0OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTAsIDU4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2OTc2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMy4gQ29tcG9uZW50IEF0dHJpYnV0ZXMgIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzQjY5RTc4NjAyQzUiCi0JCQl0aXRsZSAgICAgIAkiMy4gQ29tcG9uZW50IEF0dHJpYnV0ZXMgIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDYwMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTI4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NiwgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NiwgMTA3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbmFtZSA6IFN0cmluZyIKLQkJCQkJIisgdGFyZ2V0TmFtZXNwYWNlIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNTM0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANjAyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTY0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTUxMgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA2MDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAxNjgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAxNTI0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTExNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzgxLCAxNTg0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTExMzkKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZGVyaXZhdGlvbk1ldGhvZCA6IFhTRERlcml2YXRpb25NZXRob2QgPSByZXN0cmljdGlvbiIKLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RDb21wbGV4RmluYWwiCi0JCQkJCSIrIGFic3RyYWN0IDogYm9vbGVhbiIKLQkJCQkJIisgY29udGVudFR5cGVDYXRlZ29yeSA6IFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQkJCSI8PDAuLio+PiArIHByb2hpYml0ZWRTdWJzdGl0dXRpb25zIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKSkKLQkJCQl3aWR0aCAgICAgIAkxMTkyCi0JCQkJaGVpZ2h0ICAgICAJMzM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYwNAotCQkJCWxvY2F0aW9uICAgCSg0NjMsIDM2MikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjAxCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg0NjMsIDM2MikKLQkJCQkgICAgKDQ2MywgMjIxKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANjA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTYwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMTUxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1NzkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTkyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhcmlldHkgOiBYU0RWYXJpZXR5IgotCQkJCQkiPDwwLi4qPj4gKyBmaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpCi0JCQkJd2lkdGggICAgICAJNjQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDYwNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDM4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDY0NywgOTgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHJlcXVpcmVkIDogYm9vbGVhbiIKLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIKLQkJCQkJIisgY29uc3RyYWludCA6IFhTRENvbnN0cmFpbnQiKSkKLQkJCQl3aWR0aCAgICAgIAk1NDgKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA2MDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDE5MzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODMwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEyODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODkwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTEyNjAKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IDogWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJCQkiPDwwLi4qPj4gKyBuYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIgotCQkJCQkiKyBwcm9jZXNzQ29udGVudHMgOiBYU0RQcm9jZXNzQ29udGVudHMiKSkKLQkJCQl3aWR0aCAgICAgIAkxMzA0Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA2MDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAxNDQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgMTM4NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAk1OTYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDYwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgNDMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgNDkxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1MDYKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIKLQkJCQkJIisgY29uc3RyYWludCA6IFhTRENvbnN0cmFpbnQiKSkKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjEwCi0JCQkJbG9jYXRpb24gICAJKDI5NCwgNjk3KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2MDkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI5NCwgNjk3KQotCQkJCSAgICAoMjk0LCA2MDUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANjExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNTYsIDEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NSwgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQl3aWR0aCAgICAgIAk1NDAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA2MTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjg4LCA1MTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MTgsIDQ2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYxMwotCQkJCWxvY2F0aW9uICAgCSgyNjg0LCA5NjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYxMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjY4NCwgOTYyKQotCQkJCSAgICAoMjY4NCwgNTc2KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvc2l0b3IiIEA2MTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTExNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9zaXRvciIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxMDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODY5QjYyMDAzNyIKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWludCIgQDYxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDUyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0NjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzgsIDQxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUUyNjAxQUUiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERlcml2YXRpb25NZXRob2QiIEA2MTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMjI3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4MCwgMjIxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIxNjMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NkEwQjAwMENFIgotCQkJCXdpZHRoICAgICAgCTQ0MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIgQDYxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyODEsIDg4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYwNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyODEsIDM4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYwNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODZBMUUwMDI3MiIKLQkJCQl3aWR0aCAgICAgIAk2MjUKLQkJCQloZWlnaHQgICAgIAkzMDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29udGVudFR5cGVDYXRlZ29yeSIgQDYxOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzA0LCAyMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDU2LCAyMTE1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjA2NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTc5RjAzQTIiCi0JCQkJd2lkdGggICAgICAJNTE0Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFZhcmlldHkiIEA2MTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MDgsIDE1MTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFZhcmlldHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MDgsIDE0NjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJCXdpZHRoICAgICAgCTM2MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9jZXNzQ29udGVudHMiIEA2MjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAyMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2Nlc3NDb250ZW50cyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDc2NiwgMjEwNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjhDNzAyODQiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoVmFyaWV0eSIgQDYyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzY4LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI1ODcsIDk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aFZhcmlldHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjhGRkI4OTAzM0EiCi0JCQkJd2lkdGggICAgICAJMzgxCi0JCQkJaGVpZ2h0ICAgICAJMjUwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANjIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMTg3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTc4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzg5LCAxNzM4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTg0OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkxOTkKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbGlzdCIKLQkJCQkJIisgcmVzdHJpY3Rpb24iCi0JCQkJCSIrIHVuaW9uIikpCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDYyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDIwMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDE5NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODYsIDE4OTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAyMDAxKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpCi0JCQkJd2lkdGggICAgICAJMzgyCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIgQDYyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDg1LCAxMDc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNTkxMDBBRSIKLQkJCQl3aWR0aCAgICAgIAk2NDgKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA2MjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMTE2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDEwNjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMTc2KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIzNgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBzdWJzdGl0dXRpb24iCi0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iKSkKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA2MjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjY0LCAyMjcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMjEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTgsIDIxNjMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMjczKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpCi0JCQkJd2lkdGggICAgICAJNTUwCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIgQDYyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDIyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAyMTU0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjEwNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVFQTAwMjMiCi0JCQkJd2lkdGggICAgICAJNjk2Ci0JCQkJaGVpZ2h0ICAgICAJMjk2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDYyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDg4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCA3NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTM4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgODA5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTEzNTcKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbmlsbGFibGUgOiBib29sZWFuIgotCQkJCQkiPDwwLi4qPj4gKyBkaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCQkiPDwwLi4qPj4gKyBzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMgOiBYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQkJCSIrIGFic3RyYWN0IDogYm9vbGVhbiIpKQotCQkJCXdpZHRoICAgICAgCTE0MDQKLQkJCQloZWlnaHQgICAgIAkyODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MjkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDYyOAotCQkJCXN1cHBsaWVyICAgCUA2MDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODEsIDczNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjgxLCA2OTcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjEwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDYzMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgODEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0OTIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANjMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQyMCwgMTEwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYzMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQljbGllbnQgICAgIAlANjMxCi0JCQkJc3VwcGxpZXIgICAJQDYxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NjIsIDEwODgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NjIsIDk2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANjMzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM1MiwgMTMxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2OCwgMTI2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzg2Ci0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYzNAotCQkJCWxvY2F0aW9uICAgCSgyMzc1LCAxNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2MzMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIzNzUsIDE0NjUpCi0JCQkJICAgICgyMzc1LCAxMzc1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjM1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUA2MzMKLQkJCQlzdXBwbGllciAgIAlANjEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM2OCwgMTI0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM2OCwgOTYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYxMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MzYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDYwMwotCQkJCXN1cHBsaWVyICAgCUA2MzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODE4LCAxNTEyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODE4LCAxNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDYzNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MzcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDYwNQotCQkJCXN1cHBsaWVyICAgCUA2MzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA2LCAxNTA3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA2LCAxNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDYzNCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA2MzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCAxMTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE4LCAxMTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MzkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiCi0JCQkJY2xpZW50ICAgICAJQDYzOAotCQkJCXN1cHBsaWVyICAgCUA2MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTE1LCAxMDg5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCA5NjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjEzKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANjQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDUyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNCwgNDY4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTExMzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAkxMTUwCi0JCQkJaGVpZ2h0ICAgICAJMTQ0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBQTMwMjQyIgotCQkJCWNsaWVudCAgICAgCUA2NDAKLQkJCQlzdXBwbGllciAgIAlANjAxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OCwgNDU2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY4LCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA0KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANjQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDc4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3OCwgNzAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTUwMgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA2NDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDI2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQljbGllbnQgICAgIAlANjQyCi0JCQkJc3VwcGxpZXIgICAJQDYwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOTAsIDY5MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5MCwgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiCi0JCQkJY2xpZW50ICAgICAJQDYzMAotCQkJCXN1cHBsaWVyICAgCUA2MDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDEsIDgwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxLCA2OTcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjEwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQljbGllbnQgICAgIAlANjA5Ci0JCQkJc3VwcGxpZXIgICAJQDYwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM3MiwgNDE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNzIsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUA2MTIKLQkJCQlzdXBwbGllciAgIAlANjAxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY4NywgNDQ4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjg3LCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjA0KSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNC4gQ29tcG9uZW50IEhpZXJhcmNoeSwgUmVsYXRpb25zIGFuZCBBdHRyaWJ1dGVzIChQYXJ0IDI6IERhdGF0eXBlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2QzMyNjUwMDVGIgotCQkJdGl0bGUgICAgICAJIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiIEA2NDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCA4OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDMyLCA4NDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZpeGVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiCi0JCQkJd2lkdGggICAgICAJMzM4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIgQDY0OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDg5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA0LCA4NDUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlcGVhdGFibGVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIKLQkJCQl3aWR0aCAgICAgIAk0NTAKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDY1MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NiwgMTExMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQl3aWR0aCAgICAgIAk0NzgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IiBANjUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc3NywgMTExMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGF0dGVybkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NTIKLQkJCQlsb2NhdGlvbiAgIAkoNzE4LCAxMDQ5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2NDkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDcxOCwgMTA0OSkKLQkJCQkgICAgKDcxOCwgOTU5KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIgQDY1MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCA5MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTksIDg3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJCXdpZHRoICAgICAgCTQyMAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RCb3VuZGVkRmFjZXQiIEA2NTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgOTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzgzLCA4NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREJvdW5kZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTFEMDM0NCIKLQkJCQl3aWR0aCAgICAgIAkzODgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIgQDY1NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDMyLCAxMTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA3LCAxMDQ4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiIEA2NTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgMTEwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxOSwgMTA0OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETnVtZXJpY0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJCXdpZHRoICAgICAgCTM4OAotCQkJCWhlaWdodCAgICAgCTEzNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIgQDY1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NTYsIDEzNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5MSwgMTMyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJd2lkdGggICAgICAJMzQ4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IiBANjU4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDYwOCwgMTU1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA1LCAxNDk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5MZW5ndGhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkxMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjU5Ci0JCQkJbG9jYXRpb24gICAJKDE0NCwgMTI2MikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjQ4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNDQsIDEyNjIpCi0JCQkJICAgICgxNDQsIDk2NCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIgQDY2MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAxNTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA3LCAxNDk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhMZW5ndGhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M3MDE0NiIKLQkJCQl3aWR0aCAgICAgIAk0MzYKLQkJCQloZWlnaHQgICAgIAkxMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IiBANjYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEzNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4MCwgMTMyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCXdpZHRoICAgICAgCTQ5OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDY2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCAxNjc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhJbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCQl3aWR0aCAgICAgIAk0NjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiIEA2NjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMTkwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMTg1MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBANjY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyLCAxNjc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQl3aWR0aCAgICAgIAk0NDYKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEA2NjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxOTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQsIDE4NTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIgotCQkJCXdpZHRoICAgICAgCTQ3NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IiBANjY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIsIDIwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJd2lkdGggICAgICAJNDI2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiIEA2NjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMxOCwgMjA1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUJFMDJFRSIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM5RDAzQzciCi0JCQkJY2xpZW50ICAgICAJQDY1MAotCQkJCXN1cHBsaWVyICAgCUA2NDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzOTQsIDExMDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM5NCwgMTA0OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NjIwMDQ1IgotCQkJCWNsaWVudCAgICAgCUA2NjEKLQkJCQlzdXBwbGllciAgIAlANjQ4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTMwOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDY3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIDExNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2Q0E1MDM4RCIKLQkJCQljbGllbnQgICAgIAlANjUxCi0JCQkJc3VwcGxpZXIgICAJQDY0OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNDQsIDExMDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDQsIDEwNDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjUyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzgwMDJERiIKLQkJCQljbGllbnQgICAgIAlANjU3Ci0JCQkJc3VwcGxpZXIgICAJQDY0OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MywgMTMwOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYzLCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZCIgQDY3MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjczCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxMzI0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RPcmRlcmVkIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTI3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQkM3NzE1MjAyRTQiCi0JCQkJd2lkdGggICAgICAJNDQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5IiBANjc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNDgsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2NjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTYxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQkM3NzE1RDAwOUIiCi0JCQkJd2lkdGggICAgICAJNDQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2UiIEA2NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMjAzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg2MSwgMTk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JFRUQwRjYwMzQyIgotCQkJCXdpZHRoICAgICAgCTQyNAotCQkJCWhlaWdodCAgICAgCTI4NwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpWYWx1ZSIgQDY3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgMjA2MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVmFsdWUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNDMDQwQjVCMDMxRiIKLQkJCQl3aWR0aCAgICAgIAk2MzYKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I2MTAzMzciCi0JCQkJY2xpZW50ICAgICAJQDY2NgotCQkJCXN1cHBsaWVyICAgCUA2NDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMjA0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDY3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMTM3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCAxMzIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzLCAxMzgwKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIpKQotCQkJCXdpZHRoICAgICAgCTMwNAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIgQDY3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1ODQsIDEzNzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzgwKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFsdWUgOiBWYWx1ZSIpKQotCQkJCXdpZHRoICAgICAgCTMwNgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExRDI0MDA5OCIKLQkJCQljbGllbnQgICAgIAlANjc4Ci0JCQkJc3VwcGxpZXIgICAJQDY0OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNSwgMTMwOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQzMTAzQUQiCi0JCQkJY2xpZW50ICAgICAJQDY3OQotCQkJCXN1cHBsaWVyICAgCUA2NDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCAxMzA4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTgxLCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I1MjAzNTMiCi0JCQkJY2xpZW50ICAgICAJQDY2NAotCQkJCXN1cHBsaWVyICAgCUA2NzgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODUsIDE2NjQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NSwgMTQ0NCkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCODMwM0I4IgotCQkJCWNsaWVudCAgICAgCUA2NjIKLQkJCQlzdXBwbGllciAgIAlANjc5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwMCwgMTY2NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMCwgMTQ0NCkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjg0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCOEUwMzA5IgotCQkJCWNsaWVudCAgICAgCUA2NjMKLQkJCQlzdXBwbGllciAgIAlANjc5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYyMiwgMTg0MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMiwgMTQ0NCkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjg1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzQwMEMwIgotCQkJCWNsaWVudCAgICAgCUA2NTgKLQkJCQlzdXBwbGllciAgIAlANjQ4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDQ3LCAxNDg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDcsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjdEMDBGQyIKLQkJCQljbGllbnQgICAgIAlANjYwCi0JCQkJc3VwcGxpZXIgICAJQDY0OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzOTcsIDE0ODUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzOTcsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3Qjk5MDAxNiIKLQkJCQljbGllbnQgICAgIAlANjY3Ci0JCQkJc3VwcGxpZXIgICAJQDY0OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzUsIDIwNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzUsIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjU5KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDY4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMzY4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQsIDMxOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJd2lkdGggICAgICAJNDA2Ci0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY4OQotCQkJCWxvY2F0aW9uICAgCSgzNjYsIDUyMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjg4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgzNjYsIDUyMikKLQkJCQkgICAgKDM2NiwgNDMwKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANjkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgNjI0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNCwgNTczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW5pbmdGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQl3aWR0aCAgICAgIAk0NjIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjkxCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgNzgxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2OTAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI3MiwgNzgxKQotCQkJCSAgICAoMjcyLCA2ODcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDY0OQotCQkJCXN1cHBsaWVyICAgCUA2OTAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTQsIDgzMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTk0LCA3ODEpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjkxKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IiBANjkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgNjI0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDU3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERnVuZGFtZW50YWxGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIKLQkJCQl3aWR0aCAgICAgIAk0NzAKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjk0Ci0JCQkJbG9jYXRpb24gICAJKDc2OCwgNzg5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2OTMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDc2OCwgNzg5KQotCQkJCSAgICAoNzY4LCA2ODcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY1OTAxMkMiCi0JCQkJY2xpZW50ICAgICAJQDY1MwotCQkJCXN1cHBsaWVyICAgCUA2OTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDUwLCA4NjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNTAsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2OTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2M0MwMjI0IgotCQkJCWNsaWVudCAgICAgCUA2NTQKLQkJCQlzdXBwbGllciAgIAlANjkzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUyNSwgODYwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI1LCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjRGMDEzMSIKLQkJCQljbGllbnQgICAgIAlANjU1Ci0JCQkJc3VwcGxpZXIgICAJQDY5MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMzcsIDEwMzYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMzcsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2OTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NDIwMDc0IgotCQkJCWNsaWVudCAgICAgCUA2NTYKLQkJCQlzdXBwbGllciAgIAlANjkzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMTAzNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDY5NCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA2OTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDU2LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgMTA3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTU5OAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSIKLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTY1NgotCQkJCWhlaWdodCAgICAgCTI1MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjYiIEA3MDAKLQkJCQlsb2NhdGlvbiAgIAkoNzc1LCAxNzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzEwMkVBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjciIEA3MDEKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MDAKLQkJCQkJbG9jYXRpb24gICAJKC0xMjA5LCAtNDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDksIDIzNSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU5NzUwMTE5IgotCQkJCQljbGllbnQgICAgIAlANzAwCi0JCQkJCXN1cHBsaWVyICAgCUA2ODgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzc1LCAxNzgpCi0JCQkJCSAgICAoNTUwLCAxNzgpCi0JCQkJCSAgICAoNTUwLCAzMDYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NTAsIDMwNikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzAzCi0JCQkJCVBhcmVudF9WaWV3IAlANzAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc1LCAxMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MzEzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDEwNSIKLQkJCQkJY2xpZW50ICAgICAJQDcwMAotCQkJCQlzdXBwbGllciAgIAlANjk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzUsIDE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDE3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjEsIDIxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODEyNTAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4OCIgQDcwNgotCQkJCWxvY2F0aW9uICAgCSgzNjksIDcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQzhBRTAyMDNBOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRzIiBANzA3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzA2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTYxNSwgLTE1MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgNDk2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZhY2V0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzODYzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JDOEFFMDYwMDY1IgotCQkJCQljbGllbnQgICAgIAlANzA2Ci0JCQkJCXN1cHBsaWVyICAgCUA2OTAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzY5LCA3MikKLQkJCQkJICAgICgxMDAsIDcyKQotCQkJCQkgICAgKDEwMCwgNTYxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2OSwgNzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDAsIDU2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDYwLCA0OTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNzkwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg5IiBANzEwCi0JCQkJCVBhcmVudF9WaWV3IAlANzA2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTYxNSwgLTE1MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NiwgMzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA1MSIKLQkJCQkJY2xpZW50ICAgICAJQDcwNgotCQkJCQlzdXBwbGllciAgIAlANjk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOCwgNzIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMCIgQDcxMgotCQkJCWxvY2F0aW9uICAgCSgxNTM4LCA1MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEzCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTM4LCA0NDkpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDAwMDAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjAKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMERFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzEiIEA3MTQKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTIKLQkJCQkJbG9jYXRpb24gICAJKC00NDYsIDI4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDYsIDM0MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMERGIgotCQkJCQljbGllbnQgICAgIAlANzEyCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzOCwgNTA4KQotCQkJCQkgICAgKDE0ODcsIDUwOCkKLQkJCQkJICAgICgxNDg3LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgNTA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaXRlbVR5cGVEZWZpbml0aW9uIiBANzE2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzEyCi0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIzLCA1NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraXRlbVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuMjExNTM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzZEQTAwMEUwIgotCQkJCQljbGllbnQgICAgIAlANzEyCi0JCQkJCXN1cHBsaWVyICAgCUA2OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzOCwgNTA4KQotCQkJCQkgICAgKDE1OTAsIDUwOCkKLQkJCQkJICAgICgxNTkwLCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgNTA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU5MCwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzE2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNDY4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDM5ODQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkwIiBANzE5Ci0JCQkJbG9jYXRpb24gICAJKDE3MjksIDU3NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCNzAyMDgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MSIgQDcyMAotCQkJCQlQYXJlbnRfVmlldyAJQDcxOQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgMzUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzNywgMzUzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCRTAyNTgiCi0JCQkJCWNsaWVudCAgICAgCUA3MTkKLQkJCQkJc3VwcGxpZXIgICAJQDY5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzI5LCA1NzQpCi0JCQkJCSAgICAoMTY3OCwgNTc0KQotCQkJCQkgICAgKDE2NzgsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc4LCAyODUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiIEA3MjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTkKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTksIDY1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittZW1iZXJUeXBlRGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy4yNjkyMzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTgwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzRCRTAyNTkiCi0JCQkJCWNsaWVudCAgICAgCUA3MTkKLQkJCQkJc3VwcGxpZXIgICAJQDY5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzI5LCA1NzQpCi0JCQkJCSAgICAoMTc4MSwgNTc0KQotCQkJCQkgICAgKDE3ODEsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzgxLCAyODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzMwLCA1MjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMxMjEyMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTIiIEA3MjUKLQkJCQlsb2NhdGlvbiAgIAkoNzQ4LCAyNjkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzIwMURCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmdW5kYW1lbnRhbEZhY2V0cyIgQDcyNgotCQkJCQlQYXJlbnRfVmlldyAJQDcyNQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCAzMTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZnVuZGFtZW50YWxGYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS40MDkwOTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNjMiCi0JCQkJCWNsaWVudCAgICAgCUA3MjUKLQkJCQkJc3VwcGxpZXIgICAJQDY5MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NDgsIDI2OSkKLQkJCQkJICAgICg2NTksIDI2OSkKLQkJCQkJICAgICg2NTksIDU2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDgsIDI2OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OSwgNTYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI4LCAzODUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzODAyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkzIiBANzI5Ci0JCQkJCVBhcmVudF9WaWV3IAlANzI1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIzNiwgNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDUyLCAyMjgpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkMzNjM1MDA1OSIKLQkJCQkJY2xpZW50ICAgICAJQDcyNQotCQkJCQlzdXBwbGllciAgIAlANjk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NDgsIDI2OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDI2OSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk0IiBANzMxCi0JCQkJbG9jYXRpb24gICAJKDExNzUsIDM5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVBQjAyNzMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NSIgQDczMgotCQkJCQlQYXJlbnRfVmlldyAJQDczMQotCQkJCQlsb2NhdGlvbiAgIAkoLTgwOSwgMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5NCwgMzE2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJCWNsaWVudCAgICAgCUA3MzEKLQkJCQkJc3VwcGxpZXIgICAJQDY5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc1LCAzOTYpCi0JCQkJCSAgICAoMTEzNSwgMzk2KQotCQkJCQkgICAgKDExMzUsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc1LCAzOTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTM1LCAyODUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA3MzQKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzEKLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzM1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzQsIDQ0MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi41MzMzMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyQTUiCi0JCQkJCWNsaWVudCAgICAgCUA3MzEKLQkJCQkJc3VwcGxpZXIgICAJQDY5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc1LCAzOTYpCi0JCQkJCSAgICAoMTIxNSwgMzk2KQotCQkJCQkgICAgKDEyMTUsIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc1LCAzOTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE1LCAyODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcyLCAzNTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTYxNTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk2IiBANzM3Ci0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDQ0NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3MjAxNkMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NyIgQDczOAotCQkJCQlQYXJlbnRfVmlldyAJQDczNwotCQkJCQlsb2NhdGlvbiAgIAkoLTYyNCwgMjIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2OCwgMzI3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTU3NTAyMkYiCi0JCQkJCWNsaWVudCAgICAgCUA3MzcKLQkJCQkJc3VwcGxpZXIgICAJQDY5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzYwLCA0NDYpCi0JCQkJCSAgICAoMTMwOSwgNDQ2KQotCQkJCQkgICAgKDEzMDksIDI4NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYwLCA0NDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA5LCAyODUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIgQDc0MAotCQkJCQlQYXJlbnRfVmlldyAJQDczNwotCQkJCQlsb2NhdGlvbiAgIAkoLTYyNCwgMjIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwNCwgNTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3ByaW1pdGl2ZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMDAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjQzIgotCQkJCQljbGllbnQgICAgIAlANzM3Ci0JCQkJCXN1cHBsaWVyICAgCUA2OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQotCQkJCQkgICAgKDE0MTIsIDQ0NikKLQkJCQkJICAgICgxNDEyLCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxMiwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3MywgNDA5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjIxNDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA3NDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCA1MTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDQyOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCAzNzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0ODgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjAyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxpc3QiCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyB1bmlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANzQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwODAsIDE3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgOTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFZhcmlldHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzQ0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE4LCA0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjhGRjc3MzAyNDkiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDN0IwMzk2IgotCQkJCWNsaWVudCAgICAgCUA2OTMKLQkJCQlzdXBwbGllciAgIAlANjg4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkxLCA1NjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5MSwgNTIyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4MDAzOTQiCi0JCQkJY2xpZW50ICAgICAJQDY5MAotCQkJCXN1cHBsaWVyICAgCUA2ODgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzIsIDU2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjcyLCA1MjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjg5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSIKLQkJCQljbGllbnQgICAgIAlANjg4Ci0JCQkJc3VwcGxpZXIgICAJQDY3MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDM2NiwgMzA2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjYsIDIxNSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzQ4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODgwMUI0IgotCQkJCWNsaWVudCAgICAgCUA2NDgKLQkJCQlzdXBwbGllciAgIAlANjkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3LCA4MjgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgNzgxKQotCQkJCWRyYXdTdXBwbGllciAJQDY5MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I1OTAyODEiCi0JCQkJY2xpZW50ICAgICAJQDY2NQotCQkJCXN1cHBsaWVyICAgCUA2NzgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAsIDE4NDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MCwgMTQ0NCkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I2OUQ2OEQwMEQyIgotCQkJdGl0bGUgICAgICAJIjUuIENvbXBvbmVudCBBbm5vdGF0aW9ucyIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA3NTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA3NTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDgyLCAxNjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA3NTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCAxNTA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI2LCAxNDYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEA3NTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAzMDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjMsIDI2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJd2lkdGggICAgICAJNDY4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA3NTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMzE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTYwNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iIEA3NTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDcwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDY2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDc1NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDExNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDc1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgNTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANzU4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIwMCwgODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjgsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA3NTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzUwLCAxMTczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANzYwCi0JCQkJbG9jYXRpb24gICAJKDE5OTQsIDE0MTIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDc1OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTk5NCwgMTQxMikKLQkJCQkgICAgKDE5OTQsIDEyNzEpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDc1MgotCQkJCXN1cHBsaWVyICAgCUA3NTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDg0LCAxNDQ5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDg0LCAxNDEyKQotCQkJCWRyYXdTdXBwbGllciAJQDc2MCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANzYyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA4NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwLCA4MjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQl3aWR0aCAgICAgIAk0MDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA3NjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCA4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg5MiwgMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA3NjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODQsIDM0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANzY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCAxODEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDc2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3OTIsIDE3MTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjcsIDE2NzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk2NjkKLQkJCQloZWlnaHQgICAgIAkxMDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlANzY2Ci0JCQkJc3VwcGxpZXIgICAJQDc1OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NzIsIDE2NjIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NzIsIDE0MTIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzYwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANzY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3OCwgOTgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIgQDc2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDU2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4OCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJd2lkdGggICAgICAJNDUwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANzcwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzcwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MSwgMTQ5MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDc3MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODcyLCA2ODUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJNzM4Ci0JCQkJaGVpZ2h0ICAgICAJNTQzCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMyIiBANzcyCi0JCQkJbG9jYXRpb24gICAJKDg2NSwgMTM1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAxODMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMyIgQDc3MwotCQkJCQlQYXJlbnRfVmlldyAJQDc3MgotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDMzQyIKLQkJCQkJY2xpZW50ICAgICAJQDc3MgotCQkJCQlzdXBwbGllciAgIAlANzU0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NzEsIDEzNTkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzc0Ci0JCQkJCVBhcmVudF9WaWV3IAlANzcyCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCA1NTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTgsIDEzMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjExNjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBEMDM0NiIKLQkJCQkJY2xpZW50ICAgICAJQDc3MgotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDg2NSwgMTM1OSkKLQkJCQkJICAgICg5MjUsIDEzNTkpCi0JCQkJCSAgICAoOTI1LCAxMjE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg2NSwgMTM1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTI3NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NDIyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1NiIgQDc3NwotCQkJCWxvY2F0aW9uICAgCSg3MTMsIDcwOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRjAyMTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NyIgQDc3OAotCQkJCQlQYXJlbnRfVmlldyAJQDc3NwotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNywgLTkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBDOSIKLQkJCQkJY2xpZW50ICAgICAJQDc3NwotCQkJCQlzdXBwbGllciAgIAlANzU1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNzA5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc3OQotCQkJCQlQYXJlbnRfVmlldyAJQDc3NwotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNywgLTkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzc5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCA2NjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1MjM4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTAwMEQzIgotCQkJCQljbGllbnQgICAgIAlANzc3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxMywgNzA5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCA3MDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTYsIDc1MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUzNTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1MCIgQDc4MgotCQkJCWxvY2F0aW9uICAgCSg3MTksIDExOTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTUwMDhBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTEiIEA3ODMKLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODIKLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwOTYiCi0JCQkJCWNsaWVudCAgICAgCUA3ODIKLQkJCQkJc3VwcGxpZXIgICAJQDc1NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCAxMTkzKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4NAotCQkJCQlQYXJlbnRfVmlldyAJQDc4MgotCQkJCQlsb2NhdGlvbiAgIAkoLTQwMSwgMzkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIwLCAxMTQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNjk5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE2MDBBMCIKLQkJCQkJY2xpZW50ICAgICAJQDc4MgotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExOTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDExOTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDYsIDEyNDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwNDE2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTAiIEA3ODcKLQkJCQlsb2NhdGlvbiAgIAkoNzg1LCA1NTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEEwMDY2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTEiIEA3ODgKLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODcKLQkJCQkJbG9jYXRpb24gICAJKC0zMzUsIC0yNTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEIwMjNGIgotCQkJCQljbGllbnQgICAgIAlANzg3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NTcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NSwgNTUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTYzLCA1NTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzg5Ci0JCQkJCVBhcmVudF9WaWV3IAlANzg3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc5LCA1MTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA3MDcwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDI0OSIKLQkJCQkJY2xpZW50ICAgICAJQDc4NwotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc4NSwgNTUwKQotCQkJCQkgICAgKDg4NCwgNTUwKQotCQkJCQkgICAgKDg4NCwgNjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NSwgNTUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg0LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MzUsIDYxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzI5NzMwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MiIgQDc5MgotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCA0MDQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTYwMjkwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODMiIEA3OTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTIKLQkJCQkJbG9jYXRpb24gICAJKC0zMiwgLTQxMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NzAxNjUiCi0JCQkJCWNsaWVudCAgICAgCUA3OTIKLQkJCQkJc3VwcGxpZXIgICAJQDc1OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE4NCwgNDA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4NCwgMTM1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA3OTQKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTIKLQkJCQkJbG9jYXRpb24gICAJKC0zMiwgLTQxMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjQsIDIyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjY2NTQyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTQ1NzAxNkYiCi0JCQkJCWNsaWVudCAgICAgCUA3OTIKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE4NCwgNDA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4NCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1MSwgNjE1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODQzODcKLQkJCQkJICAgIGhlaWdodCAgICAgCTY3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk4IiBANzk3Ci0JCQkJbG9jYXRpb24gICAJKDE3NTIsIDEwMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTEwMTU4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTkiIEA3OTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTcKLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDE5RiIKLQkJCQkJY2xpZW50ICAgICAJQDc5NwotCQkJCQlzdXBwbGllciAgIAlANzU5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3NTIsIDEwMzQpCi0JCQkJCSAgICAoMTgxMiwgMTAzNCkKLQkJCQkJICAgICgxODEyLCAxMTYxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTIsIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCAxMTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5OQotCQkJCQlQYXJlbnRfVmlldyAJQDc5NwotCQkJCQlsb2NhdGlvbiAgIAkoNTM2LCAyMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzQzLCA5OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU5NjAzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUUyOTIwMUE5IgotCQkJCQljbGllbnQgICAgIAlANzk3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTIsIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCAxMDM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NCwgMTA2NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUwMzMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMCIgQDgwMgotCQkJCWxvY2F0aW9uICAgCSgxODk2LCA4ODEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2Q0YwMDg4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDEiIEA4MDMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDIKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2RDEwMTVEIgotCQkJCQljbGllbnQgICAgIAlAODAyCi0JCQkJCXN1cHBsaWVyICAgCUA3NTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTg5NiwgODgxKQotCQkJCQkgICAgKDE5NTYsIDg4MSkKLQkJCQkJICAgICgxOTU2LCAxMTYxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4OTYsIDg4MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTYsIDExNjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJkZXJpdmF0aW9uQW5ub3RhdGlvbiIgQDgwNAotCQkJCQlQYXJlbnRfVmlldyAJQDgwMgotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCA0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDg0MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitkZXJpdmF0aW9uQW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjU0MjM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2RDEwMTY3IgotCQkJCQljbGllbnQgICAgIAlAODAyCi0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4OTYsIDg4MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDg4MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODksIDkxNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA1MDg1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMiIgQDgwNwotCQkJCWxvY2F0aW9uICAgCSgyMDQwLCA3MTUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzMwMjY0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDMiIEA4MDgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDcKLQkJCQkJbG9jYXRpb24gICAJKDkyMCwgLTg1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjM0MDI4NCIKLQkJCQkJY2xpZW50ICAgICAJQDgwNwotCQkJCQlzdXBwbGllciAgIAlANzU5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIwNDAsIDcxNSkKLQkJCQkJICAgICgyMTAwLCA3MTUpCi0JCQkJCSAgICAoMjEwMCwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDQwLCA3MTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAwLCAxMTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4MDkKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDcKLQkJCQkJbG9jYXRpb24gICAJKDkyMCwgLTg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNjgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDMxOTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUA4MDcKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgNzE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgNzQ2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDkzMTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIwIiBAODEyCi0JCQkJbG9jYXRpb24gICAJKDY2OCwgODY1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjM5MTM0MDA0RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIxIiBAODEzCi0JCQkJCVBhcmVudF9WaWV3IAlAODEyCi0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNjAwQ0EiCi0JCQkJCWNsaWVudCAgICAgCUA4MTIKLQkJCQkJc3VwcGxpZXIgICAJQDc2MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjY4LCA4NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NzMsIDg2NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MTQKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTIKLQkJCQkJbG9jYXRpb24gICAJKC02MTIsIDMzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCA4MjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjM0MTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMEQ0IgotCQkJCQljbGllbnQgICAgIAlAODEyCi0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCA4NjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDEsIDkwMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjgyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNCIgQDgxNwotCQkJCWxvY2F0aW9uICAgCSgxNDcyLCAxNjcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQjkwMUNEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjUiIEA4MTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTcKLQkJCQkJbG9jYXRpb24gICAJKDI1NiwgLTY0OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCQTAxQzQiCi0JCQkJCWNsaWVudCAgICAgCUA4MTcKLQkJCQkJc3VwcGxpZXIgICAJQDc2MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDcyLCAxNjcpCi0JCQkJCSAgICAoMTQ3MiwgNzIpCi0JCQkJCSAgICAoMTg4MywgNzIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgMTY3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg4MywgNzIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODE5Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE3Ci0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA0LCAxMjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA3NjMwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMjNCQTAxQ0UiCi0JCQkJCWNsaWVudCAgICAgCUA4MTcKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3MiwgMTY3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ3MiwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxOSwgNjE4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTM1NzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzQiIEA4MjIKLQkJCQlsb2NhdGlvbiAgIAkoOTI3LCAzNTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDYwMjkxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NSIgQDgyMwotCQkJCQlQYXJlbnRfVmlldyAJQDgyMgotCQkJCQlsb2NhdGlvbiAgIAkoLTE5MywgLTQ1MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwNzAxNzEiCi0JCQkJCWNsaWVudCAgICAgCUA4MjIKLQkJCQkJc3VwcGxpZXIgICAJQDc2NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI3LCAzNTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MjksIDM1MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MjQKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjIKLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDMxMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuODE2NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcyIgotCQkJCQljbGllbnQgICAgIAlAODIyCi0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTI3LCAzNTApCi0JCQkJCSAgICAoOTg3LCAzNTApCi0JCQkJCSAgICAoOTg3LCA2NzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI3LCAzNTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODcsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzcsIDYxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQzMzQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY2IiBAODI3Ci0JCQkJbG9jYXRpb24gICAJKDEwMjcsIDIyMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REFEQzAyRjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY3IiBAODI4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODI3Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTMsIC01NzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjM4IgotCQkJCQljbGllbnQgICAgIAlAODI3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NjUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjcsIDIyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgMjIyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgyOQotCQkJCQlQYXJlbnRfVmlldyAJQDgyNwotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwMywgMTg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40MDYyNTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REFERDAyNDIiCi0JCQkJCWNsaWVudCAgICAgCUA4MjcKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDI3LCAyMjIpCi0JCQkJCSAgICAoMTA4NywgMjIyKQotCQkJCQkgICAgKDEwODcsIDY3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA2MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODI1ODMKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTAiIEA4MzIKLQkJCQlsb2NhdGlvbiAgIAkoMTQ5NCwgMTQzOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4ODAxQzIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDkxIiBAODMzCi0JCQkJCVBhcmVudF9WaWV3IAlAODMyCi0JCQkJCWxvY2F0aW9uICAgCSgyMTQsIDU5MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjkwMDY4QTAxMTEiCi0JCQkJCWNsaWVudCAgICAgCUA4MzIKLQkJCQkJc3VwcGxpZXIgICAJQDc2NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5NCwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTQsIDE2NjIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50QW5ub3RhdGlvbiIgQDgzNAotCQkJCQlQYXJlbnRfVmlldyAJQDgzMgotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjk2LCAxMzU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRBbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNjc3MTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTIwMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTFCIgotCQkJCQljbGllbnQgICAgIAlAODMyCi0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MywgMTI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzMDA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NCIgQDgzNwotCQkJCWxvY2F0aW9uICAgCSg2MzcsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTcwMkM4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDUiIEA4MzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzcKLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxODAzRTIiCi0JCQkJCWNsaWVudCAgICAgCUA4MzcKLQkJCQkJc3VwcGxpZXIgICAJQDc2OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM3LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDExLCAxMDIyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgzOQotCQkJCQlQYXJlbnRfVmlldyAJQDgzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTQ4MywgMjIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEwLCA5NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4ODg5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTkwMDA0IgotCQkJCQljbGllbnQgICAgIAlAODM3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgMTAyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMTA2MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMwMDg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY0IiBAODQyCi0JCQkJbG9jYXRpb24gICAJKDE1ODEsIDYwNykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBNzAxMDIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY1IiBAODQzCi0JCQkJCVBhcmVudF9WaWV3IAlAODQyCi0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTkwMTkxIgotCQkJCQljbGllbnQgICAgIAlAODQyCi0JCQkJCXN1cHBsaWVyICAgCUA3NjkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU4MSwgNjA3KQotCQkJCQkgICAgKDE1ODEsIDU0NykKLQkJCQkJICAgICgxNjc5LCA1NDcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OSwgNTQ3KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4NDQKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDIKLQkJCQkJbG9jYXRpb24gICAJKDMwMSwgLTIyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NjksIDQ2MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjE5Njk3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJODgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MiIKLQkJCQkJY2xpZW50ICAgICAJQDg0MgotCQkJCQlzdXBwbGllciAgIAlANzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTgxLCA2MDcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTgxLCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTM5LCA2MjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE5Njk3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDQiIEA4NDcKLQkJCQlsb2NhdGlvbiAgIAkoODQ5LCAxNDk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjExMDI2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA1IiBAODQ4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODQ3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMUY5IgotCQkJCQljbGllbnQgICAgIAlAODQ3Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg0OSwgMTQ5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM1NCwgMTQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDkKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDcKLQkJCQkJbG9jYXRpb24gICAJKC0yNzEsIDY5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MiwgMTQ2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODgyNTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTMzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMjAyMDMiCi0JCQkJCWNsaWVudCAgICAgCUA4NDcKLQkJCQkJc3VwcGxpZXIgICAJQDc3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4NDksIDE0OTYpCi0JCQkJCSAgICAoMTA2MiwgMTQ5NikKLQkJCQkJICAgICgxMDYyLCAxMjE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg0OSwgMTQ5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjIsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTE1LCAxMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzI2OTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA2IiBAODUyCi0JCQkJbG9jYXRpb24gICAJKDk1MiwgMTU2NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCMzAwMDUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNyIgQDg1MwotCQkJCQlQYXJlbnRfVmlldyAJQDg1MgotCQkJCQlsb2NhdGlvbiAgIAkoLTMyOCwgNzMzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMyNyIKLQkJCQkJY2xpZW50ICAgICAJQDg1MgotCQkJCQlzdXBwbGllciAgIAlANzcwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE1NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE1NjUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9ucyIgQDg1NAotCQkJCQlQYXJlbnRfVmlldyAJQDg1MgotCQkJCQlsb2NhdGlvbiAgIAkoLTMyOCwgNzMzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODU0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgMTUzOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA0OTU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjQwMzMyIgotCQkJCQljbGllbnQgICAgIAlAODUyCi0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTUyLCAxNTY1KQotCQkJCQkgICAgKDEyMDAsIDE1NjUpCi0JCQkJCSAgICAoMTIwMCwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE1NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjAwLCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODU0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NCwgMTI3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODU3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCWNsaWVudCAgICAgCUA3NTMKLQkJCQlzdXBwbGllciAgIAlANzYzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk4NCwgMjQ5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTg0LCAxMzUpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzhGMDAyRSIKLQkJCQljbGllbnQgICAgIAlANzY5Ci0JCQkJc3VwcGxpZXIgICAJQDc1MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5OTcsIDUwNSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5NywgMzU5KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjYuIENvbmNyZXRlIENvbXBvbmVudHMiCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3NEQwM0M0IgotCQkJdGl0bGUgICAgICAJIjYuIENvbmNyZXRlIENvbXBvbmVudHMiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAODU5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IiBAODYwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDU2OCwgMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQkJd2lkdGggICAgICAJNTQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDg2MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTkxLCA2MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIKLQkJCQl3aWR0aCAgICAgIAk0MzYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDg2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1NiwgMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NjMKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgNTYxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4NjIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEzNjAsIDU2MSkKLQkJCQkgICAgKDEzNjAsIDQ3MSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbmNsdWRlIiBAODY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMiwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW5jbHVkZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCIKLQkJCQl3aWR0aCAgICAgIAkyNTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA4NjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiCi0JCQkJd2lkdGggICAgICAJMjQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEA4NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTM2LCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA1LCAxMTU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCQl3aWR0aCAgICAgIAkyODAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAODY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3NSwgMTE1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAk4NjkKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDIiIEA4NjgKLQkJCQlsb2NhdGlvbiAgIAkoMTM2OCwgMTIwNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNTAwN0UiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MyIgQDg2OQotCQkJCQlQYXJlbnRfVmlldyAJQDg2OAotCQkJCQlsb2NhdGlvbiAgIAkoMTE2MCwgNDA2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QiIKLQkJCQkJY2xpZW50ICAgICAJQDg2OAotCQkJCQlzdXBwbGllciAgIAlAODY0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTIwNikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjgKLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNDcsIDExNTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU0NDEyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzYwMDZDIgotCQkJCQljbGllbnQgICAgIAlAODY4Ci0JCQkJCXN1cHBsaWVyICAgCUA4NjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjgsIDEyMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM0LCAxMjA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwMCwgMTI1MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwNwotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxNDcwNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDAiIEA4NzMKLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgMTAyMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEODAyRkMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MSIgQDg3NAotCQkJCQlQYXJlbnRfVmlldyAJQDg3MwotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDkwMThCIgotCQkJCQljbGllbnQgICAgIAlAODczCi0JCQkJCXN1cHBsaWVyICAgCUA4NjUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE2OCwgMTAyMikKLQkJCQkJICAgICgxMTY4LCA5NjIpCi0JCQkJCSAgICAoMTI4NSwgOTYyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNjgsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjg1LCA5NjIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODc1Ci0JCQkJCVBhcmVudF9WaWV3IAlAODczCi0JCQkJCWxvY2F0aW9uICAgCSg5NjAsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTAsIDEwNzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ1Mzc4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QyIKLQkJCQkJY2xpZW50ICAgICAJQDg3MwotCQkJCQlzdXBwbGllciAgIAlAODY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE2OCwgMTE0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMjcsIDEwNzQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQzNjk3NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjIiIEA4NzgKLQkJCQlsb2NhdGlvbiAgIAkoMTU2MywgMTM1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MjAwOUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MyIgQDg3OQotCQkJCQlQYXJlbnRfVmlldyAJQDg3OAotCQkJCQlsb2NhdGlvbiAgIAkoMTM1NSwgNTUzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFERTQzMDJGRSIKLQkJCQkJY2xpZW50ICAgICAJQDg3OAotCQkJCQlzdXBwbGllciAgIAlAODY2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1NjMsIDEzNTMpCi0JCQkJCSAgICAoMTk0MCwgMTM1MykKLQkJCQkJICAgICgxOTQwLCAxMjU1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjMsIDEzNTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTQwLCAxMjU1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4ODAKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzgKLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDEzMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUxNjgwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFERTQzMDMwOCIKLQkJCQkJY2xpZW50ICAgICAJQDg3OAotCQkJCQlzdXBwbGllciAgIAlAODY3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1NjMsIDEzNTMpCi0JCQkJCSAgICAoMTE4MSwgMTM1MykKLQkJCQkJICAgICgxMTgxLCAxMjU5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjMsIDEzNTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTgxLCAxMjU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzMCwgMTMyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYxMzQ1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDg4MwotCQkJCWxvY2F0aW9uICAgCSgyODgsIDU2MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODU5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyODgsIDU2MSkKLQkJCQkgICAgKDI4OCwgNDcxKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAODg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MCwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAODg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjU4LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQl3aWR0aCAgICAgIAk0MTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA4ODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3MjAsIDk2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUwLCA5MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDg4NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTAsIDYyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQkJd2lkdGggICAgICAJMjQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODg4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIgotCQkJCWNsaWVudCAgICAgCUA4ODcKLQkJCQlzdXBwbGllciAgIAlAODU5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxLCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMSwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDg4MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJY2xpZW50ICAgICAJQDg4NAotCQkJCXN1cHBsaWVyICAgCUA4NTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1ODksIDYxNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg5LCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODgzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg5MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkIzMDFENSIKLQkJCQljbGllbnQgICAgIAlAODYxCi0JCQkJc3VwcGxpZXIgICAJQDg2MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMTYsIDYxNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxNiwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDg2MykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDg5MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MCwgOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4OTIKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgMTA4OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODkxCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxODI0LCAxMDg5KQotCQkJCSAgICAoMTgyNCwgOTk5KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODkzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4REMwMzgxIgotCQkJCWNsaWVudCAgICAgCUA4NjQKLQkJCQlzdXBwbGllciAgIAlAODkxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2NiwgMTE0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2NiwgMTA4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODk0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNjQwMjQwIgotCQkJCWNsaWVudCAgICAgCUA4NjYKLQkJCQlzdXBwbGllciAgIAlAODkxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkzNCwgMTE0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkzNCwgMTA4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTIpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDg5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODk1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMwLCA2MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQl3aWR0aCAgICAgIAk0MzgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4OTYKLQkJCQlsb2NhdGlvbiAgIAkoMTc2MiwgODE5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4OTUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE3NjIsIDgxOSkKLQkJCQkgICAgKDE3NjIsIDcyNykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg5NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEQ5MDAzRSIKLQkJCQljbGllbnQgICAgIAlAODY1Ci0JCQkJc3VwcGxpZXIgICAJQDg5NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTYsIDg4OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNiwgODE5KQotCQkJCWRyYXdTdXBwbGllciAJQDg5NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4OTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJY2xpZW50ICAgICAJQDg5NQotCQkJCXN1cHBsaWVyICAgCUA4NjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU2LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTYsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAODk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDE0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODc1LCAxMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkwMAotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAyODkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTEyMCwgMjg5KQotCQkJCSAgICAoMTEyMCwgMTk5KSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNCIgQDkwMQotCQkJCWxvY2F0aW9uICAgCSgxNDg1LCAyMTUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCMDgwM0M3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250YWluZXIiIEA5MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MDEKLQkJCQkJbG9jYXRpb24gICAJKDk4OSwgMTAzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMjEwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRhaW5lciIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMzMTEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjBDMDFDRSIKLQkJCQkJY2xpZW50ICAgICAJQDkwMQotCQkJCQlzdXBwbGllciAgIAlAODk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0ODUsIDIxNSkKLQkJCQkJICAgICgxNDg1LCAxNzYpCi0JCQkJCSAgICAoMTM3NCwgMTc2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODUsIDIxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzQsIDE3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MzUsIDIyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTY5Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAyNjQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDUiIEA5MDUKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MDEKLQkJCQkJbG9jYXRpb24gICAJKDk4OSwgMTAzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjBDMDFDRiIKLQkJCQkJY2xpZW50ICAgICAJQDkwMQotCQkJCQlzdXBwbGllciAgIAlAODk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0ODUsIDIxNSkKLQkJCQkJICAgICgxNDg1LCAyNTQpCi0JCQkJCSAgICAoMTM0NSwgMjU0KQotCQkJCQkgICAgKDEzNDUsIDE5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzQ1LCAxOTkpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNiIgQDkwNgotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDIxNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0ODAyNjEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RDb250YWluZXIiIEA5MDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MDYKLQkJCQkJbG9jYXRpb24gICAJKDUzLCAxMDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDIxNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290Q29udGFpbmVyIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI1MDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjRDMDI4NSIKLQkJCQkJY2xpZW50ICAgICAJQDkwNgotCQkJCQlzdXBwbGllciAgIAlAODk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3MywgMjE2KQotCQkJCQkgICAgKDc3MywgMTc2KQotCQkJCQkgICAgKDg2NiwgMTc2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMjE2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODY2LCAxNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDIyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjMwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA3IiBAOTEwCi0JCQkJCVBhcmVudF9WaWV3IAlAOTA2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQjRDMDI4NiIKLQkJCQkJY2xpZW50ICAgICAJQDkwNgotCQkJCQlzdXBwbGllciAgIAlAODk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3MywgMjE2KQotCQkJCQkgICAgKDc3MywgMjU3KQotCQkJCQkgICAgKDg5NSwgMjU3KQotCQkJCQkgICAgKDg5NSwgMTk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMjE2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk1LCAxOTkpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTExCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIgotCQkJCWNsaWVudCAgICAgCUA4NjIKLQkJCQlzdXBwbGllciAgIAlAODk5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2NywgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY3LCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTAwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEOEUyMDBFQSIKLQkJCQljbGllbnQgICAgIAlAODYwCi0JCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MiwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTIsIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTEzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIgotCQkJCWNsaWVudCAgICAgCUA4NTkKLQkJCQlzdXBwbGllciAgIAlAODk5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk5LCAzNjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5OSwgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkwMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAOTE0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxMTU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTE1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIgotCQkJCWNsaWVudCAgICAgCUA5MTQKLQkJCQlzdXBwbGllciAgIAlAODg3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE2LCAxMTQ1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTYsIDcyNykpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxOCIgQDkxNgotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCAxNDI1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE5IiBAOTE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTE2Ci0JCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAyMjUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA0IgotCQkJCQljbGllbnQgICAgIAlAOTE2Ci0JCQkJCXN1cHBsaWVyICAgCUA4OTEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM4MiwgMTQyNSkKLQkJCQkJICAgICgyMTQ3LCAxNDI1KQotCQkJCQkgICAgKDIxNDcsIDk0MykKLQkJCQkJICAgICgyMDY3LCA5NDMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjcsIDk0MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFNjaGVtYSIgQDkxOAotCQkJCQlQYXJlbnRfVmlldyAJQDkxNgotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ1LCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA2NTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCQljbGllbnQgICAgIAlAOTE2Ci0JCQkJCXN1cHBsaWVyICAgCUA5MTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM4MiwgMTQyNSkKLQkJCQkJICAgICgyMjUsIDE0MjUpCi0JCQkJCSAgICAoMjI1LCAxMjU1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjUsIDEyNTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMsIDEzOTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NjkxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTYiIEA5MjEKLQkJCQlsb2NhdGlvbiAgIAkoMTUwNSwgMTUwMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDNzAwRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxNyIgQDkyMgotCQkJCQlQYXJlbnRfVmlldyAJQDkyMQotCQkJCQlsb2NhdGlvbiAgIAkoMTMxMywgMzAzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiIKLQkJCQkJY2xpZW50ICAgICAJQDkyMQotCQkJCQlzdXBwbGllciAgIAlAODk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MDUsIDE1MDMpCi0JCQkJCSAgICAoMjE4OCwgMTUwMykKLQkJCQkJICAgICgyMTg4LCA2NzUpCi0JCQkJCSAgICAoMjA1OSwgNjc1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDU5LCA2NzUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDkyMwotCQkJCQlQYXJlbnRfVmlldyAJQDkyMQotCQkJCQlsb2NhdGlvbiAgIAkoMTMxMywgMzAzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTIzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAzLCAxNDcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzMzMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDMiCi0JCQkJCWNsaWVudCAgICAgCUA5MjEKLQkJCQkJc3VwcGxpZXIgICAJQDkxNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTA1LCAxNTAzKQotCQkJCQkgICAgKDExMywgMTUwMykKLQkJCQkJICAgICgxMTMsIDEyNTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNSwgMTUwMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMywgMTI1NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njc2ODMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTA4IiBAOTI2Ci0JCQkJbG9jYXRpb24gICAJKDY2LCAyNDQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzEwMzU2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDkiIEA5MjcKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjYKLQkJCQkJbG9jYXRpb24gICAJKC05NCwgLTQ0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzMzEiCi0JCQkJCWNsaWVudCAgICAgCUA5MjYKLQkJCQkJc3VwcGxpZXIgICAJQDg5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2NiwgMjQ0KQotCQkJCQkgICAgKDY2LCAxNDQpCi0JCQkJCSAgICAoODY2LCAxNDQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTQ0KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAOTI4Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTI2Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjUsIDkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE2ODExMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNzUxQzMzMDMzQiIKLQkJCQkJY2xpZW50ICAgICAJQDkyNgotCQkJCQlzdXBwbGllciAgIAlAOTE0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NiwgMjQ0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYsIDExNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYsIDE4NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTExMwotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjY1OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjc4MEJEOTAwNTkiCi0JCQkJY2xpZW50ICAgICAJQDg4NQotCQkJCXN1cHBsaWVyICAgCUA4OTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU5LCAzNjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTksIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTMyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2IgotCQkJCWNsaWVudCAgICAgCUA4NjcKLQkJCQlzdXBwbGllciAgIAlAODU5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDAwLCAxMTQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MDAsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4ODMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkzMwotCQkJCWxvY2F0aW9uICAgCSgxMDEyLCA4MzcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg2MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTAxMiwgODM3KQotCQkJCSAgICAoMTAxMiwgNzI3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTM0Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAOTM1Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDcxLCA4NzEpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODgxNTgKLQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGRDRFMjAzNjYiCi0JCQkJY2xpZW50ICAgICAJQDg2NwotCQkJCXN1cHBsaWVyICAgCUA4NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM3LCAxMTQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDM3LCA4MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTMzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzNgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDkzNwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoODkwLCA4NjUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODE2MzMKLQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGRDRCQTAyM0MiCi0JCQkJY2xpZW50ICAgICAJQDg4NgotCQkJCXN1cHBsaWVyICAgCUA4NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjUsIDkwNSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTI1LCA4MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTMzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiIKLQkJCQljbGllbnQgICAgIAlAODkxCi0JCQkJc3VwcGxpZXIgICAJQDg5NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjgsIDg4OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyOCwgODE5KQotCQkJCWRyYXdTdXBwbGllciAJQDg5NikpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjcuIENvbmNyZXRlIEF0dHJpYnV0ZXMiCi0JCQlxdWlkICAgICAgIAkiM0I5RjhGNzYwMkM3IgotCQkJdGl0bGUgICAgICAJIjcuIENvbmNyZXRlIEF0dHJpYnV0ZXMiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIgQDkzOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDE0NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzgsIDEzNTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzgsIDE0MTkpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBmb3JtIDogWFNERm9ybSIKLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDMwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZvcm0iIEA5NDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2MCwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5OCwgMTM2NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERm9ybSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzMTUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5RjkxM0IwMUVCIgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDk0MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgOTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uY3JldGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwLCA5NykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ2Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGVsZW1lbnQgOiBET01FbGVtZW50IikpCi0JCQkJd2lkdGggICAgICAJNjc1Ci0JCQkJaGVpZ2h0ICAgICAJMTQzCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBAOTQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODcsIDMzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MAotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAOTQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDk0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3OCwgODkyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQl3aWR0aCAgICAgIAk0NzAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA5NDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCAxNDA4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAxMzU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA5NDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODY0LCA2MjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NSwgNTczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNTYKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTQ2Ci0JCQkJbG9jYXRpb24gICAJKDg1MCwgNTM3KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NDIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDg1MCwgNTM3KQotCQkJCSAgICAoODUwLCA0NDcpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRWxlbWVudCIgQDk0NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjQ4LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgOTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTUVsZW1lbnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQjgxODk3OTAyMDAiCi0JCQkJd2lkdGggICAgICAJNzY5Ci0JCQkJaGVpZ2h0ICAgICAJMjAwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDk0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDY0MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDU4NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCXdpZHRoICAgICAgCTUxMgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA5NDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAzODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAzMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk1MAotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDI2MykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTQxCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgzNjgsIDI2MykKLQkJCQkgICAgKDM2OCwgMTY3KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBAOTUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTkyLCAxNDU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEzNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxMjk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxNDA3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBzdWJzdGl0dXRpb24iCi0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iCi0JCQkJCSIrIGFsbCIpKQotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIgQDk1MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTc5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzA4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTY1OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVCRTAyNzIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTc2OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkxOTgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgYWxsIikpCi0JCQkJd2lkdGggICAgICAJNTUwCi0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAOTUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTEyLCAyMDk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzIsIDIwNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MzIsIDIxMDApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzIzCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFNpbXBsZUZpbmFsIikpCi0JCQkJd2lkdGggICAgICAJNzc4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBAOTU0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4NzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDE4MjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyNUQwMjk1IgotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA5NTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU0NCwgMjAxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2MiwgMTkzMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleEZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2MiwgMTg4MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzJDQTAxQ0IiCi0JCQkJd2lkdGggICAgICAJMzgyCi0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDk1NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDEyNzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDEzMzkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTg4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHVzZSA6IFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IgotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk2NDAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiIEA5NTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxNjMyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTU0OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTQ5OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQkE3QjBFODAxQTgiCi0JCQkJd2lkdGggICAgICAJNTEyCi0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA5NTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjYwOCwgOTI4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDk4LCA4ODEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM4Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAOTU5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI0MCwgMTcxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTYzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk5NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjkxKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTkzNAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpKQotCQkJCXdpZHRoICAgICAgCTk4NAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDk2MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEwOTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMTU2KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg1MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsTmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTkwNgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA5NjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMTAwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIyLCA3NzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJOTk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkxMDE0Ci0JCQkJaGVpZ2h0ICAgICAJNDg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIgQDk2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDk2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzcsIDkwNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCXdpZHRoICAgICAgCTQyNAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAOTYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM0NCwgNjU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM4LCA2MDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDEyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM4LCA2NjApCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBsZXhpY2FsVmFsdWUgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk0MzAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAOTY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg0MCwgMjA0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMTk0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAyMDAyKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTgyMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RDb21wbGV4RmluYWwiCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJCSIrIG1peGVkIDogYm9vbGVhbiIpKQotCQkJCXdpZHRoICAgICAgCTg3OAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDk2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDg4LCAxNjk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzA0LCAxNjQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzODYKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FCMTAwNEQiCi0JCQkJY2xpZW50ICAgICAJQDk2NQotCQkJCXN1cHBsaWVyICAgCUA5NDQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA2LCAxNjMyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA2LCAxNDcyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDk2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjA4LCA3MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDU5OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk5MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAk5MTgKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhBQTAxRDMiCi0JCQkJY2xpZW50ICAgICAJQDk1OAotCQkJCXN1cHBsaWVyICAgCUA5NDIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjk2LCA4NjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2OTYsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTY5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUA5NTkKLQkJCQlzdXBwbGllciAgIAlAOTM5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5NCwgMTYxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5NCwgMTUzMykpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk3MAotCQkJCWxvY2F0aW9uICAgCSgxNDg3LCAxODU2KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NjUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE0ODcsIDE4NTYpCi0JCQkJICAgICgxNDg3LCAxNzYwKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUF0dHIiIEA5NzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwMCwgMzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAzNTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTUF0dHIiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCAzMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNCQkY4Qzg5MDFCNiIKLQkJCQl3aWR0aCAgICAgIAk2NTgKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDk2NAotCQkJCXN1cHBsaWVyICAgCUA5NjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzM0LCAxOTMwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzM0LCAxODU2KQotCQkJCWRyYXdTdXBwbGllciAJQDk3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJY2xpZW50ICAgICAJQDk2MwotCQkJCXN1cHBsaWVyICAgCUA5NDIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCA1ODgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTc0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2IgotCQkJCWNsaWVudCAgICAgCUA5NjcKLQkJCQlzdXBwbGllciAgIAlAOTQyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE5MCwgNTg2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTkwLCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTQ2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiIKLQkJCQljbGllbnQgICAgIAlAOTQ4Ci0JCQkJc3VwcGxpZXIgICAJQDk0OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMiwgNTcyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjIsIDQ0NykpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTc2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIgotCQkJCWNsaWVudCAgICAgCUA5NDkKLQkJCQlzdXBwbGllciAgIAlAOTQxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwLCAzMjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MCwgMjYzKQotCQkJCWRyYXdTdXBwbGllciAJQDk1MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NzcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiCi0JCQkJY2xpZW50ICAgICAJQDk2MgotCQkJCXN1cHBsaWVyICAgCUA5NDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjMsIDg5MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIzLCA3MDgpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk3OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQljbGllbnQgICAgIAlAOTYwCi0JCQkJc3VwcGxpZXIgICAJQDk1OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDAsIDEwODQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDAsIDk4NykpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTURvY3VtZW50IiBAOTc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1NywgOTQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzU4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTURvY3VtZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1NywgNDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzU4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc4NTBFMDM4MSIKLQkJCQl3aWR0aCAgICAgIAk3NzYKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiCi0JCQkJY2xpZW50ICAgICAJQDk0MgotCQkJCXN1cHBsaWVyICAgCUA5NDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDMyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCAyNjMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTUwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAOTgxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzUwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Ob2RlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciCi0JCQkJd2lkdGggICAgICAJNjg2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIgotCQkJCWNsaWVudCAgICAgCUA5NDUKLQkJCQlzdXBwbGllciAgIAlAOTQyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODUwLCA1NjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1MCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDdCQjAzNDkiCi0JCQkJY2xpZW50ICAgICAJQDk1NgotCQkJCXN1cHBsaWVyICAgCUA5NDIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDEyNjcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJY2xpZW50ICAgICAJQDk0MwotCQkJCXN1cHBsaWVyICAgCUA5NDIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjk0LCA4ODApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTQsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIgotCQkJCWNsaWVudCAgICAgCUA5NjEKLQkJCQlzdXBwbGllciAgIAlAOTQ1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCA3NjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgNjg3KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTg2Ci0JCQkJbG9jYXRpb24gICAJKDE3MDMsIDEyOTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk0MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTcwMywgMTI5MCkKLQkJCQkgICAgKDE3MDMsIDEwMDgpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDk0NAotCQkJCXN1cHBsaWVyICAgCUA5NDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAzLCAxMzQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjkwKQotCQkJCWRyYXdTdXBwbGllciAJQDk4NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDkzOQotCQkJCXN1cHBsaWVyICAgCUA5NDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMzQ3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAxMjkwKQotCQkJCWRyYXdTdXBwbGllciAJQDk4NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDk1MwotCQkJCXN1cHBsaWVyICAgCUA5NjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUzLCAyMDI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjUzLCAxODU2KQotCQkJCWRyYXdTdXBwbGllciAJQDk3MCkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjguIENvbmNyZXRlIENvbnRhaW5tZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkE4MDk3MDI3QSIKLQkJCXRpdGxlICAgICAgCSI4LiBDb25jcmV0ZSBDb250YWlubWVudCIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBAOTkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY3MiwgOTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDM5LCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY0MCwgNTc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDMxLCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQl3aWR0aCAgICAgIAk0MzYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiIEA5OTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTMsIDc0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IiBAOTkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgNTc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTkzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIKLQkJCQl3aWR0aCAgICAgIAk0MzgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTk0Ci0JCQkJbG9jYXRpb24gICAJKDE5NDMsIDg2OCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTkzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxOTQzLCA4NjgpCi0JCQkJICAgICgxOTQzLCA2MzEpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY0IiBAOTk1Ci0JCQkJbG9jYXRpb24gICAJKDIxMjUsIDY4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2NSIgQDk5NgotCQkJCQlQYXJlbnRfVmlldyAJQDk5NQotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkFEIgotCQkJCQljbGllbnQgICAgIAlAOTk1Ci0JCQkJCXN1cHBsaWVyICAgCUA5OTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMjUsIDY4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjUsIDcyOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAOTk3Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTk1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTUsIDY3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTc1NDM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJCNyIKLQkJCQkJY2xpZW50ICAgICAJQDk5NQotCQkJCQlzdXBwbGllciAgIAlAOTkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA2MzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY3LCA2NzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMTAwMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAwMQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTAwMAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjcyLCA0NjUpCi0JCQkJICAgICgyNzIsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEwMDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM3MiwgMTEyMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTg3Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDEwMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDU3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzUyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUyIiBAMTAwNAotCQkJCWxvY2F0aW9uICAgCSgxMTcwLCAxMzU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDEwMDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA0Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNDA0NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMDQKLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3MCwgMTM1NikKLQkJCQkJICAgICgyMDYsIDEzNTYpCi0JCQkJCSAgICAoMjA2LCA2MzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNiwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1OTE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUzIiBAMTAwOAotCQkJCQlQYXJlbnRfVmlldyAJQDEwMDQKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNTIxLCAxMzk4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDAyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzAsIDEzNTYpCi0JCQkJCSAgICAoMjczMSwgMTM1NikKLQkJCQkJICAgICgyNzMxLCAxMjI3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzMxLCAxMjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEwMTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAsIDE2OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ2IiBAMTAxMQotCQkJCWxvY2F0aW9uICAgCSgxMjIsIDExMzYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEAxMDEyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAxMQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDExCi0JCQkJCXN1cHBsaWVyICAgCUAxMDAzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDYzMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAxMwotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTEKLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMywgMTUxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAyNSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMTEKLQkJCQkJc3VwcGxpZXIgICAJQDEwMTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgMTY0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODExODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAMTAxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQl3aWR0aCAgICAgIAk1MTMKLQkJCQloZWlnaHQgICAgIAkxMDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTgiIEAxMDE3Ci0JCQkJbG9jYXRpb24gICAJKDQ3LCA4ODUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MTUwMTE5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTkiIEAxMDE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNwotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDEwMTcKLQkJCQkJc3VwcGxpZXIgICAJQDEwMTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTY0MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDE5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAxNwotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjE4NTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTk1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDE3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDE2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDEzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgsIDE5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3ODgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDEwMjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNjMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMDIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg4IiBAMTAyNAotCQkJCWxvY2F0aW9uICAgCSgxMzE5LCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkYxREU5MDE4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODkiIEAxMDI1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAyNAotCQkJCQlsb2NhdGlvbiAgIAkoLTU3LCAtMTAyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM2QyIKLQkJCQkJY2xpZW50ICAgICAJQDEwMjQKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTAyNgotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQKLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzMxNzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIgotCQkJCQljbGllbnQgICAgIAlAMTAyNAotCQkJCQlzdXBwbGllciAgIAlAMTAyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDEwMzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTUsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEwMzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg0IiBAMTAzMQotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg1IiBAMTAzMgotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzEKLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDMxCi0JCQkJCXN1cHBsaWVyICAgCUAxMDMwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTEsIDE4NDApCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkKLQkJCQkJICAgICgxMjk0LCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk0LCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDMzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzMQotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxODA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI2NTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0M4IgotCQkJCQljbGllbnQgICAgIAlAMTAzMQotCQkJCQlzdXBwbGllciAgIAlAMTAzMAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzUxLCAxODQwKQotCQkJCQkgICAgKDE0MDksIDE4NDApCi0JCQkJCSAgICAoMTQwOSwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTc1MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MSwgMTgwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcyODQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY4IiBAMTAzNgotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDM3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNgotCQkJCQlsb2NhdGlvbiAgIAkoNzc0LCAtMTgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgMTUyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ0OTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzYKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQ1NDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY5IiBAMTA0MAotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzYKLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMwRSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzYKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxMjIzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODYiIEAxMDQyCi0JCQkJbG9jYXRpb24gICAJKDE2OTAsIDE2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUQwMzc0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldENvbnRlbnRzIiBAMTA0MwotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDIKLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgMTczMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldENvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzIwNTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQyCi0JCQkJCXN1cHBsaWVyICAgCUAxMDI5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NiwgMTY4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTY0NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTk0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNzMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODciIEAxMDQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA0MgotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTY2LCAxNjQzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQyCi0JCQkJCXN1cHBsaWVyICAgCUAxMDMwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzNCwgMTY4NCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDEwNDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjI0LCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzg4LCA3NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEAxMDQ5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEwNTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1NywgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY2IiBAMTA1MQotCQkJCWxvY2F0aW9uICAgCSg5NjMsIDMxOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QjAwM0QiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTA1MgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTEKLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDM2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgxMDgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCQljbGllbnQgICAgIAlAMTA1MQotCQkJCQlzdXBwbGllciAgIAlAMTA0OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk5LCAzMTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTYsIDI5MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk2Mzk2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjciIEAxMDU1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA1MQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NSwgMzYxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJCWNsaWVudCAgICAgCUAxMDUxCi0JCQkJCXN1cHBsaWVyICAgCUAxMDUwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgyOCwgMzE5KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDEwNTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA5OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc0LCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwNTgKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMiwgMTU5MykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA1NwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjMyMiwgMTU5MykKLQkJCQkgICAgKDIzMjIsIDEwNDcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDU5Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTA2MAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDYsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2MDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk1Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRjUwMTNBIgotCQkJCWNsaWVudCAgICAgCUAxMDU3Ci0JCQkJc3VwcGxpZXIgICAJQDk5MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNTAsIDkzNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE1MCwgODY4KQotCQkJCWRyYXdTdXBwbGllciAJQDk5NCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTA2MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCA1MzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk2NjIKLQkJCQloZWlnaHQgICAgIAkxMTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTIiIEAxMDYyCi0JCQkJbG9jYXRpb24gICAJKDE0OTgsIDE0MzEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTQwMUFGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwNjMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDYyCi0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyNywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDU0Mzg5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE3IgotCQkJCQljbGllbnQgICAgIAlAMTA2MgotCQkJCQlzdXBwbGllciAgIAlAMTA1NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDk4LCAxNDMxKQotCQkJCQkgICAgKDIyODEsIDE0MzEpCi0JCQkJCSAgICAoMjI4MSwgMTA0NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI4MSwgMTA0NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjIwNCwgMTM5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA1NDE5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTMiIEAxMDY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA2MgotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTAsIDg2NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkxMTUwMDE2IgotCQkJCQljbGllbnQgICAgIAlAMTA2MgotCQkJCQlzdXBwbGllciAgIAlAMTA2MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDk4LCAxNDMxKQotCQkJCQkgICAgKDExMzEsIDE0MzEpCi0JCQkJCSAgICAoMTEzMSwgNjMyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMxLCA2MzIpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDEwNjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NTUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQl3aWR0aCAgICAgIAk0MDQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDEwNjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDg5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNSwgODUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTYwOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNiIgQDEwNzAKLQkJCQlsb2NhdGlvbiAgIAkoNTM0LCA3MzYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRUYwMTYwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDEwNzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDcwCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMCwgNzQ4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMTExMTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk5IgotCQkJCQljbGllbnQgICAgIAlAMTA3MAotCQkJCQlzdXBwbGllciAgIAlAMTA2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDg0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTk1LCA4MDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NTkyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE3IiBAMTA3NAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzAKLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCA2NTMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OCIKLQkJCQkJY2xpZW50ICAgICAJQDEwNzAKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA2MzIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNiIgQDEwNzYKLQkJCQlsb2NhdGlvbiAgIAkoOTAwLCAxMDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNEMDAzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2VsZWN0b3IiIEAxMDc3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA3NgotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxMywgMTA0MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzZWxlY3RvciIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMjg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIzNCIKLQkJCQkJY2xpZW50ICAgICAJQDEwNzYKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgMTExMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAxMDQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wOTU4OTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNyIgQDEwODAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc2Ci0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDk2OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCQljbGllbnQgICAgIAlAMTA3NgotCQkJCQlzdXBwbGllciAgIAlAMTA2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCA5NTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDEwODIKLQkJCQlsb2NhdGlvbiAgIAkoNzAwLCAxMDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBAMTA4MwotCQkJCQlQYXJlbnRfVmlldyAJQDEwODIKLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE2LCAxMDM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDU0Nzk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5IgotCQkJCQljbGllbnQgICAgIAlAMTA4MgotCQkJCQlzdXBwbGllciAgIAlAMTA2OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzEsIDEwNDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzA3NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM5IiBAMTA4NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwODIKLQkJCQkJbG9jYXRpb24gICAJKC0xMTYsIDEyMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU5LCA5NjgpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQkJY2xpZW50ICAgICAJQDEwODIKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgOTUxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEAxMDg4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCAxNDQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAwLCAxMzk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJd2lkdGggICAgICAJNTIyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTA4OQotCQkJCWxvY2F0aW9uICAgCSg1NTAsIDE1OTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwODgKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDU1MCwgMTU5MCkKLQkJCQkgICAgKDU1MCwgMTQ5NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiIEAxMDkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUwNCwgNTc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0MCwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQkJd2lkdGggICAgICAJNTQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTA5MQotCQkJCWxvY2F0aW9uICAgCSgxNDA2LCA3NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwOTAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE0MDYsIDc2NSkKLQkJCQkgICAgKDE0MDYsIDYzMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMDkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY1NiwgMTY5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTMsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5NCIgQDEwOTMKLQkJCQlsb2NhdGlvbiAgIAkoMTYxNCwgMTg2OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZGRERENzAxMTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk1IiBAMTA5NAotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTMKLQkJCQkJbG9jYXRpb24gICAJKDUyNiwgNDc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI2QiIKLQkJCQkJY2xpZW50ICAgICAJQDEwOTMKLQkJCQkJc3VwcGxpZXIgICAJQDEwOTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkKLQkJCQkJICAgICgyNTAwLCAxODY4KQotCQkJCQkgICAgKDI1MDAsIDE3NTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxNCwgMTg2OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1MDAsIDE3NTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTA5NQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTMKLQkJCQkJbG9jYXRpb24gICAJKDUyNiwgNDc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4OTYsIDE3ODcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5ODcwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RkREREEwMjc1IgotCQkJCQljbGllbnQgICAgIAlAMTA5MwotCQkJCQlzdXBwbGllciAgIAlAMTA4OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjE0LCAxODY4KQotCQkJCQkgICAgKDk4NCwgMTg2OCkKLQkJCQkJICAgICg5ODQsIDE0OTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTYxNCwgMTg2OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4NCwgMTQ5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0MiwgMTgyNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTcxMjg2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMCIgQDEwOTgKLQkJCQlsb2NhdGlvbiAgIAkoMjkyNywgMzg3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk4RTM2MDM4NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlQ29udGVudHMiIEAxMDk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA5OAotCQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgLTM3NTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTUsIDM1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVDb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzczMDYwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OThFMzgwMDdDIgotCQkJCQljbGllbnQgICAgIAlAMTA5OAotCQkJCQlzdXBwbGllciAgIAlAMTA5MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyOTI3LCAzODcpCi0JCQkJCSAgICAoMTc1MCwgMzg3KQotCQkJCQkgICAgKDE3NTAsIDUyMSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTI3LCAzODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCA1MjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDQsIDQyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MjQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDEiIEAxMTAyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5OAotCQkJCQlsb2NhdGlvbiAgIAkoMjQ2MywgLTM3NTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDI5NDYsIDE0NDgpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3MiIKLQkJCQkJY2xpZW50ICAgICAJQDEwOTgKLQkJCQkJc3VwcGxpZXIgICAJQDEwOTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjkyNywgMzg3KQotCQkJCQkgICAgKDI5ODcsIDM4NykKLQkJCQkJICAgICgyOTg3LCAxNjcxKQotCQkJCQkgICAgKDI5MjgsIDE2NzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjkyOCwgMTY3MSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTEwNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5NjgsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjk5LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzYiIEAxMTA1Ci0JCQkJbG9jYXRpb24gICAJKDE3NTAsIDg3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA0RTAwNjciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTEwNgotCQkJCQlQYXJlbnRfVmlldyAJQDExMDUKLQkJCQkJbG9jYXRpb24gICAJKDE0NjIsIC0yMzkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCA2OTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MTAzNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5NDA1MDAyQTUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTA1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDkwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUwLCA4NzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUwLCA2MzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTQsIDY5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM0NDQwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NyIgQDExMDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTA1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTExMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcwOSwgMTA2NSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMjlCIgotCQkJCQljbGllbnQgICAgIAlAMTEwNQotCQkJCQlzdXBwbGllciAgIAlAMTEwNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgMTExMykpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAxMTExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjc5LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDgiIEAxMTEyCi0JCQkJbG9jYXRpb24gICAJKDEyNTIsIDE4OTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDODcwMjQ3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDkiIEAxMTEzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTExMgotCQkJCQlsb2NhdGlvbiAgIAkoNzA4LCAxMjg4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRUJEQzhDMDJGOSIKLQkJCQkJY2xpZW50ICAgICAJQDExMTIKLQkJCQkJc3VwcGxpZXIgICAJQDEwOTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI1MiwgMTg5NikKLQkJCQkJICAgICgyNjAzLCAxODk2KQotCQkJCQkgICAgKDI2MDMsIDE3NTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDMsIDE3NTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiIEAxMTE0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTExMgotCQkJCQlsb2NhdGlvbiAgIAkoNzA4LCAxMjg4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODIsIDE4NTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zODExNDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAzMDMiCi0JCQkJCWNsaWVudCAgICAgCUAxMTEyCi0JCQkJCXN1cHBsaWVyICAgCUAxMTExCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNTIsIDE4OTYpCi0JCQkJCSAgICAoNDI4LCAxODk2KQotCQkJCQkgICAgKDQyOCwgMTIyMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjUyLCAxODk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDI4LCAxMjIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODIsIDE4NjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3NTAzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4MCIgQDExMTcKLQkJCQlsb2NhdGlvbiAgIAkoMTE5OSwgMTMyMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzMjAyMjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgxIiBAMTExOAotCQkJCQlQYXJlbnRfVmlldyAJQDExMTcKLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc1RDNDMDEwQyIKLQkJCQkJY2xpZW50ICAgICAJQDExMTcKLQkJCQkJc3VwcGxpZXIgICAJQDExMDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE5OSwgMTMyMSkKLQkJCQkJICAgICgxODk3LCAxMzIxKQotCQkJCQkgICAgKDE4OTcsIDEyMjMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5OSwgMTMyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTcsIDEyMjMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiIEAxMTE5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTExNwotCQkJCQlsb2NhdGlvbiAgIAkoNjU1LCA3MTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMTI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyOTU2OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc1RDNDMDEwRCIKLQkJCQkJY2xpZW50ICAgICAJQDExMTcKLQkJCQkJc3VwcGxpZXIgICAJQDExMTEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE5OSwgMTMyMSkKLQkJCQkJICAgICg1MDAsIDEzMjEpCi0JCQkJCSAgICAoNTAwLCAxMjIzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDAsIDEyMjMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgyMzA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlAMTA5MgotCQkJCXN1cHBsaWVyICAgCUAxMDU3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwNiwgMTY0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwNiwgMTU5MykKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDU4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjMKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI0Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCA0OTUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDY0MjkKLQkJCQkgICAgaGVpZ2h0ICAgICAJNgotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjE3MDAyRSIKLQkJCQljbGllbnQgICAgIAlAMTA2MQotCQkJCXN1cHBsaWVyICAgCUAxMDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUzLCA1MjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MywgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDEwMDEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEyNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlAMTAzMAotCQkJCXN1cHBsaWVyICAgCUAxMDU3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwOSwgMTY0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTU5MykKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDU4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI3Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU5LCAxNTkxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxOQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTgwMzkyCi0JCQkJICAgIGhlaWdodCAgICAgCTM4NQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg1RjU1MDMyQiIKLQkJCQljbGllbnQgICAgIAlAMTAzMAotCQkJCXN1cHBsaWVyICAgCUAxMDg4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE0NCwgMTY0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE0NCwgMTU5MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDg5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiCi0JCQkJY2xpZW50ICAgICAJQDEwMDMKLQkJCQlzdXBwbGllciAgIAlAMTAwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NiwgNTIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDAxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTI5Ci0JCQkJbG9jYXRpb24gICAJKDQzMSwgMjIyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDE2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg0MzEsIDIyMikKLQkJCQkgICAgKDQzMSwgMTMwKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEzMAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMzEKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNjEsIDIyNCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk3Njc0NAotCQkJCSAgICBoZWlnaHQgICAgIAk4NgotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjQ0MDA2OSIKLQkJCQljbGllbnQgICAgIAlAMTAwMAotCQkJCXN1cHBsaWVyICAgCUAxMDE2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc1LCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NSwgMjIyKQotCQkJCWRyYXdTdXBwbGllciAJQDExMjkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExMzIKLQkJCQlsb2NhdGlvbiAgIAkoMTMwOSwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDQ5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMzA5LCA0NjUpCi0JCQkJICAgICgxMzA5LCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTMzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEzNAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MSwgNDk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDY0Mjg2Ci0JCQkJICAgIGhlaWdodCAgICAgCTEwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjYwMzM5IgotCQkJCWNsaWVudCAgICAgCUAxMDYxCi0JCQkJc3VwcGxpZXIgICAJQDEwNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzEsIDUyMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTMxLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEzMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCWNsaWVudCAgICAgCUAxMDEwCi0JCQkJc3VwcGxpZXIgICAJQDEwODgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTAsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1MCwgMTU5MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDg5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM3Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIwNSwgNDkzKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTU4MzMzCi0JCQkJICAgIGhlaWdodCAgICAgCTgKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2MTAzQkUiCi0JCQkJY2xpZW50ICAgICAJQDEwMjMKLQkJCQlzdXBwbGllciAgIAlAMTA0OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTMyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzgKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM5Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MSwgOTA1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODQ4OTgwCi0JCQkJICAgIGhlaWdodCAgICAgCTczCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRUIwMkE4IgotCQkJCWNsaWVudCAgICAgCUAxMTA0Ci0JCQkJc3VwcGxpZXIgICAJQDk5MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzgsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzgsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0MAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDEKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAzQTAyMjEiCi0JCQkJY2xpZW50ICAgICAJQDExMDQKLQkJCQlzdXBwbGllciAgIAlAMTA5MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDMsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDkxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDIKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQzCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NCwgODAxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIgotCQkJCWNsaWVudCAgICAgCUAxMDIyCi0JCQkJc3VwcGxpZXIgICAJQDEwOTAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODQsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDkxKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJY2xpZW50ICAgICAJQDk5MgotCQkJCXN1cHBsaWVyICAgCUAxMDQ4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4NCwgNzYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzc5LCA3NjIpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJY2xpZW50ICAgICAJQDk5MQotCQkJCXN1cHBsaWVyICAgCUAxMDQ5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNTIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjM3LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEzMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCWNsaWVudCAgICAgCUAxMDQ4Ci0JCQkJc3VwcGxpZXIgICAJQDk5MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDcyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCWNsaWVudCAgICAgCUA5OTMKLQkJCQlzdXBwbGllciAgIAlAMTA0OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5NTAsIDUyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk1MCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExMzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0OAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDkKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyODIxLCA4OTcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTgxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODc3MTkKLQkJCQkgICAgaGVpZ2h0ICAgICAJNzYKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU0RjAyM0MiCi0JCQkJY2xpZW50ICAgICAJQDk5MAotCQkJCXN1cHBsaWVyICAgCUAxMDQ5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg5NiwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODk2LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEzMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUwCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMTMsIDkwNCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MDYyMgotCQkJCSAgICBoZWlnaHQgICAgIAk2OAotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkUyMDM4MSIKLQkJCQljbGllbnQgICAgIAlAMTAwMgotCQkJCXN1cHBsaWVyICAgCUA5OTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzgxLCAxMTA5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzgxLCA4NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTIKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUzCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjg3OCwgMjY5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuOTQ2NjY3Ci0JCQkJICAgIGhlaWdodCAgICAgCTY2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyNTUwMzg1IgotCQkJCWNsaWVudCAgICAgCUAxMDAyCi0JCQkJc3VwcGxpZXIgICAJQDEwMTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQzLCAxMTA5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTQzLCAyMjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEyOSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCWNsaWVudCAgICAgCUAxMTExCi0JCQkJc3VwcGxpZXIgICAJQDEwMDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjIsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ2MiwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDEwMDEpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0MyNUVCN0EwMzhDIgotCQkJdGl0bGUgICAgICAJIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMTU1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxNTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE4IiBAMTE1NgotCQkJCWxvY2F0aW9uICAgCSgyMjgsIDE2OTUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRTYwMjUxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMTkiIEAxMTU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE1NgotCQkJCQlsb2NhdGlvbiAgIAkoLTQ3NiwgLTM4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3LCAxNjIzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAyRjciCi0JCQkJCWNsaWVudCAgICAgCUAxMTU2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTU1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIyOCwgMTY5NSkKLQkJCQkJICAgICgxNzUsIDE2OTUpCi0JCQkJCSAgICAoMTc1LCAxNTkxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NSwgMTU5MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIiBAMTE1OQotCQkJCQlQYXJlbnRfVmlldyAJQDExNTYKLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMyOSwgMTc0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuOTI0NTI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMzBCIgotCQkJCQljbGllbnQgICAgIAlAMTE1NgotCQkJCQlzdXBwbGllciAgIAlAMTE1NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjgsIDE2OTUpCi0JCQkJCSAgICAoMjgxLCAxNjk1KQotCQkJCQkgICAgKDI4MSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDE1OTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOSwgMTY0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDA1NzE0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTE2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDE1MzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3OTAsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUxOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTQiIEAxMTYzCi0JCQkJbG9jYXRpb24gICAJKDk1MiwgMTY5OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0NTAzOTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NSIgQDExNjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTI4OCwgLTMxOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODYwLCAxNjIzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOEEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTYyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk1MiwgMTY5OCkKLQkJCQkJICAgICg5MDEsIDE2OTgpCi0JCQkJCSAgICAoOTAxLCAxNTkxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTY5OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgMTU5MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iIEAxMTY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjAsIDE3MzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzI2OTIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzlFIgotCQkJCQljbGllbnQgICAgIAlAMTE2MwotCQkJCQlzdXBwbGllciAgIAlAMTE2MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE2OTgpCi0JCQkJCSAgICAoMTAwNCwgMTY5OCkKLQkJCQkJICAgICgxMDA0LCAxNTkxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTY5OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDQsIDE1OTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgMTY0OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMTY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCA5OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjAsIDk0OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk0OTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAMTE3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEyLCA3MzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQl3aWR0aCAgICAgIAk0NzUKLQkJCQloZWlnaHQgICAgIAkxMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTE3MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNDE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ2LCAyODUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk0MDYKLQkJCQloZWlnaHQgICAgIAkyODcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE4IiBAMTE3MgotCQkJCWxvY2F0aW9uICAgCSgxMzAzLCA2NzkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEAxMTczCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3MgotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDU5LCAzODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDAzODQKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTcyCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMDMsIDY3OSkKLQkJCQkJICAgICgxMzAzLCA0MTkpCi0JCQkJCSAgICAoODQzLCA0MTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA0MTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyMiwgNDU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTA3NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxOSIgQDExNzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTcyCi0JCQkJCWxvY2F0aW9uICAgCSgtNDEsIC04NTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDUsIDk1NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA0IgotCQkJCQljbGllbnQgICAgIAlAMTE3MgotCQkJCQlzdXBwbGllciAgIAlAMTE2OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzAzLCA2NzkpCi0JCQkJCSAgICAoMTMwMywgOTk3KQotCQkJCQkgICAgKDkwMSwgOTk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgOTk3KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTYiIEAxMTc4Ci0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDY0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDNzAwRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAMTE3OQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzgKLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzgsIDUwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAxOTIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCQljbGllbnQgICAgIAlAMTE3OAotCQkJCQlzdXBwbGllciAgIAlAMTE3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjE2LCA2NDkpCi0JCQkJCSAgICAoMTIxNiwgNTM0KQotCQkJCQkgICAgKDg0MywgNTM0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNTM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjYsIDU3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODMxNjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTciIEAxMTgyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3OAotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTgyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCA3NTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiIKLQkJCQkJY2xpZW50ICAgICAJQDExNzgKLQkJCQkJc3VwcGxpZXIgICAJQDExNzAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQotCQkJCQkgICAgKDEyMTYsIDc5NykKLQkJCQkJICAgICg4NzcsIDc5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDc5NykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIyIiBAMTE4NAotCQkJCWxvY2F0aW9uICAgCSg2NjIsIDY0MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBNjAxMzEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIgQDExODUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgNjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDA4NzU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyMTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MSIKLQkJCQkJY2xpZW50ICAgICAJQDExODQKLQkJCQkJc3VwcGxpZXIgICAJQDExNzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MiwgNjQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA3MjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNjc4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzA2NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMyIgQDExODgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDYyMSwgNTc2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzAiCi0JCQkJCWNsaWVudCAgICAgCUAxMTg0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNTU5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjQiIEAxMTkwCi0JCQkJbG9jYXRpb24gICAJKDc1LCAxODgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjAwMDVFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjUiIEAxMTkxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5MAotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMUUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTkwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc1LCAxODgpCi0JCQkJCSAgICAoNzUsIDEyOCkKLQkJCQkJICAgICg1MTAsIDEyOCkKLQkJCQkJICAgICg1MTAsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCAyNzMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VmVyc2lvbiIgQDExOTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkwCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RWZXJzaW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNTkzNzUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAyOCIKLQkJCQkJY2xpZW50ICAgICAJQDExOTAKLQkJCQkJc3VwcGxpZXIgICAJQDExNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzUsIDE4OCkKLQkJCQkJICAgICg3NSwgMzgwKQotCQkJCQkgICAgKDQzNywgMzgwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDM4MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAzMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NDc1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjYiIEAxMTk1Ci0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDEzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwQjAxMUIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNyIgQDExOTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTk1Ci0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTIxIgotCQkJCQljbGllbnQgICAgIAlAMTE5NQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAxMzQpCi0JCQkJCSAgICAoNzY2LCAxMzQpCi0JCQkJCSAgICAoNzY2LCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMTM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzY2LCAyNzMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmlnaW5hbFZlcnNpb24iIEAxMTk3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE5NQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTY0LCA5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmlnaW5hbFZlcnNpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS42NTAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTk1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDEzNCkKLQkJCQkJICAgICgxMzIyLCAxMzQpCi0JCQkJCSAgICAoMTMyMiwgMzM0KQotCQkJCQkgICAgKDg0MywgMzM0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgMzM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4MTA4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyOCIgQDEyMDAKLQkJCQlsb2NhdGlvbiAgIAkoMTI2LCA2NTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUIwMDFGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjkiIEAxMjAxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMAotCQkJCQlsb2NhdGlvbiAgIAkoLTgzNCwgMTYwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRUFGMDEwQiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDAKLQkJCQkJc3VwcGxpZXIgICAJQDExNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2LCA2NTYpCi0JCQkJCSAgICAoNTEzLCA2NTYpCi0JCQkJCSAgICAoNTEzLCA1NTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTMsIDU1OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFZlcnNpb25zIiBAMTIwMgotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDAKLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3LCA0MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkVmVyc2lvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzkwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRUFGMDExNSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDAKLQkJCQkJc3VwcGxpZXIgICAJQDExNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2LCA2NTYpCi0JCQkJCSAgICAoNjYsIDY1NikKLQkJCQkJICAgICg2NiwgNDcyKQotCQkJCQkgICAgKDQzNywgNDcyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCA0NzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1NiwgNTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njg0NjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMyIiBAMTIwNQotCQkJCWxvY2F0aW9uICAgCSg2NDIsIDEyNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3MzAxOTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzMyIgQDEyMDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjA1Ci0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRjEiCi0JCQkJCWNsaWVudCAgICAgCUAxMjA1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTcxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY0MiwgMTI2KQotCQkJCQkgICAgKDU4OCwgMTI2KQotCQkJCQkgICAgKDU4OCwgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY0MiwgMTI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg4LCAyNzMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWFGb3JTY2hlbWEiIEAxMjA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIwNQotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDYzOSwgNzQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hRm9yU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU1NTU2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUZCIgotCQkJCQljbGllbnQgICAgIAlAMTIwNQotCQkJCQlzdXBwbGllciAgIAlAMTE3MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2NDIsIDEyNikKLQkJCQkJICAgICg2OTcsIDEyNikKLQkJCQkJICAgICg2OTcsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY5NywgMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDIxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAxODYzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTIxMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiIKLQkJCQljbGllbnQgICAgIAlAMTE2OQotCQkJCXN1cHBsaWVyICAgCUAxMTcwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM4LCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYzOCwgODQzKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcsIDExNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MiIgQDEyMTIKLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCAxMzQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjZCMDE5NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzMiIEAxMjEzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxMgotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MCwgMTI3MSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkQwMzA5IgotCQkJCQljbGllbnQgICAgIAlAMTIxMgotCQkJCQlzdXBwbGllciAgIAlAMTIxMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQsIDEzNDApCi0JCQkJCSAgICAoMTgxLCAxMzQwKQotCQkJCQkgICAgKDE4MSwgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDEzNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEsIDEyMzkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTIxNQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTIKLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzMsIDEzODkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuODY3OTI1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkQwMzEzIgotCQkJCQljbGllbnQgICAgIAlAMTIxMgotCQkJCQlzdXBwbGllciAgIAlAMTIxMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQsIDEzNDApCi0JCQkJCSAgICAoMjg3LCAxMzQwKQotCQkJCQkgICAgKDI4NywgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDEzNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODcsIDEyMzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgMTI5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQyOTQ1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTIxOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NjAsIDE0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTA0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTIxOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTksIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJd2lkdGggICAgICAJMjQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNiIgQDEyMjAKLQkJCQlsb2NhdGlvbiAgIAkoMTY2OCwgMjgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEFFMDFDQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA3IiBAMTIyMQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjAKLQkJCQkJbG9jYXRpb24gICAJKDgsIC0xNTIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTBGIgotCQkJCQljbGllbnQgICAgIAlAMTIyMAotCQkJCQlzdXBwbGllciAgIAlAMTIxOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMTk5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljRmFjZXRzIiBAMTIyMgotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjAKLQkJCQkJbG9jYXRpb24gICAJKDgsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTIsIDMwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNGYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI0NjE1NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMjIwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjE5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY4LCAyODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAzNjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjUsIDMwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2OTIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTIyNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjYsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEyMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA2NDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCA1OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA4IiBAMTIyNwotCQkJCWxvY2F0aW9uICAgCSgxNTA4LCA3OTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDMwMjhFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMDkiIEAxMjI4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIyNwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyLCAtMjgwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGMyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjcKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDgsIDc5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDY5NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1BhcnRpY2xlIiBAMTIyOQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjcKLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgNzY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1BhcnRpY2xlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjU5MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGRCIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjcKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDgsIDc5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDg4OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ1NCwgODI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTUwNjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIzMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODQiIEAxMjMzCi0JCQkJbG9jYXRpb24gICAJKDkxOSwgMTM0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI1RTAxRjkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg1IiBAMTIzNAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzMKLQkJCQkJbG9jYXRpb24gICAJKC0yMzMsIC01OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODI1LCAxMjczKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2MjAwNDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkxOSwgMTM0OSkKLQkJCQkJICAgICg4NjYsIDEzNDkpCi0JCQkJCSAgICAoODY2LCAxMjM5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkxOSwgMTM0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTIzOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIzNgotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzMKLQkJCQkJbG9jYXRpb24gICAJKC0yMzMsIC01OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTkzLCAxMzkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zNzczNTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2MjAwNTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMjMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjMyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkxOSwgMTM0OSkKLQkJCQkJICAgICg5NzMsIDEzNDkpCi0JCQkJCSAgICAoOTczLCAxMjM5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkxOSwgMTM0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk3MywgMTIzOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAxMjk2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDE0OTI1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTIzOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5NTIsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTYsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMCIgQDEyNDAKLQkJCQlsb2NhdGlvbiAgIAkoMjAyNSwgNzkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQ5MDFGNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzExIiBAMTI0MQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDAKLQkJCQkJbG9jYXRpb24gICAJKDE1MywgLTI4MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyODQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjI2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA2OTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyNDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQwCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjYsIDgzOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4MDk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4RSIKLQkJCQkJY2xpZW50ICAgICAJQDEyNDAKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjUsIDg4OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5OCwgODQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYxNzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTczCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEyIiBAMTI0NQotCQkJCWxvY2F0aW9uICAgCSgxNzU0LCAxMTc4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEM2OEZGMDFCRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEzIiBAMTI0NgotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDUKLQkJCQkJbG9jYXRpb24gICAJKC0xOTgsIDIzNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRDNjkwMjAzMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjMyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwMSwgMTE3OCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1dpbGRjYXJkIiBAMTI0NwotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDUKLQkJCQkJbG9jYXRpb24gICAJKC0xOTgsIDIzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTI2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTYzMzU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE4IgotCQkJCQljbGllbnQgICAgIAlAMTI0NQotCQkJCQlzdXBwbGllciAgIAlAMTIzOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzU0LCAxMTc4KQotCQkJCQkgICAgKDIwMjgsIDExNzgpCi0JCQkJCSAgICAoMjAyOCwgOTk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI4LCA5OTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODIsIDEwOTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MzY2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMTAuIERpYWdub3N0aWNzIgotCQkJcXVpZCAgICAgICAJIjNCRkU1RjA4MDNFMiIKLQkJCXRpdGxlICAgICAgCSIxMC4gRGlhZ25vc3RpY3MiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDEyNTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDAwLCAxMDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciCi0JCQkJd2lkdGggICAgICAJNjg2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWNTZXZlcml0eSIgQDEyNTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgNjU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA1NDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWNTZXZlcml0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjhBNzAzMkYiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEyNTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDU5LCA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDEyNTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4OTYsIDExMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDU0MCwgNjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzEzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCXdpZHRoICAgICAgCTczMQotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI1NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDYwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDY0LCA0MDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJd2lkdGggICAgICAJNjU4Ci0JCQkJaGVpZ2h0ICAgICAJNDM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNCIgQDEyNTUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAyODMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzEwMzVGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTUiIEAxMjU2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM2IgotCQkJCQljbGllbnQgICAgIAlAMTI1NQotCQkJCQlzdXBwbGllciAgIAlAMTI1MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0LCAyODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQsIDE3NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFsbERpYWdub3N0aWNzIiBAMTI1NwotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDksIDMzMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbGxEaWFnbm9zdGljcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ4NTk4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNyIKLQkJCQkJY2xpZW50ICAgICAJQDEyNTUKLQkJCQkJc3VwcGxpZXIgICAJQDEyNTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2LCAzMjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDU2MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTAiIEAxMjYwCi0JCQkJbG9jYXRpb24gICAJKDEwMjgsIDQ0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyNzAzQ0QiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMSIgQDEyNjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjYwCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMkIwMDYxIgotCQkJCQljbGllbnQgICAgIAlAMTI2MAotCQkJCQlzdXBwbGllciAgIAlAMTI1NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyOCwgNDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzEzLCA0NDApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb21wb25lbnRzIiBAMTI2MgotCQkJCQlQYXJlbnRfVmlldyAJQDEyNjAKLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM4LCAyMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcG9uZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI5MTgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2QyIKLQkJCQkJY2xpZW50ICAgICAJQDEyNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEyNTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTAyOCwgNDQwKQotCQkJCQkgICAgKDEwODgsIDQ0MCkKLQkJCQkJICAgICgxMDg4LCAxNzQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyOCwgNDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4OCwgMTc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAyMzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyMzg0OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTIiIEAxMjY1Ci0JCQkJbG9jYXRpb24gICAJKDY4OCwgMjgyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2MjY5MDE2NSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEzIiBAMTI2NgotCQkJCQlQYXJlbnRfVmlldyAJQDEyNjUKLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjYiCi0JCQkJCWNsaWVudCAgICAgCUAxMjY1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMTc0KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGlhZ25vc3RpY3MiIEAxMjY3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI2NQotCQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAtMjc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjY4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDMzMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitkaWFnbm9zdGljcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUyNjMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjZBMDAyNyIKLQkJCQkJY2xpZW50ICAgICAJQDEyNjUKLQkJCQkJc3VwcGxpZXIgICAJQDEyNTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0NSwgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTQ3MzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjcwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Q0QzBGNEMwMUExIgotCQkJCWNsaWVudCAgICAgCUAxMjU0Ci0JCQkJc3VwcGxpZXIgICAJQDEyNTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDM5MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCAxNzQpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMTEuIFN1cHBsZW1lbnRhbCIKLQkJCXF1aWQgICAgICAgCSIzQzI4N0U0OTAxOUIiCi0JCQl0aXRsZSAgICAgIAkiMTEuIFN1cHBsZW1lbnRhbCIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ2NCwgODE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDc2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4MzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTg1MgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyNzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgODgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMSwgODI0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk3ODAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjczCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjczCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCXdpZHRoICAgICAgCTQ5OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI3NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzODQsIDExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIyMzYsIDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzYiIEAxMjc1Ci0JCQkJbG9jYXRpb24gICAJKDEzODIsIDg0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjg4MkM1MDEzNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWFyeUNvbXBvbmVudCIgQDEyNzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjc1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltYXJ5Q29tcG9uZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDA4MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjczCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNywgODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDYyNCwgNTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzI2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM3IiBAMTI3OQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzUKLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTgsIDEyNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEyIgotCQkJCQljbGllbnQgICAgIAlAMTI3NQotCQkJCQlzdXBwbGllciAgIAlAMTI3NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI3LCA4NCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTI4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDY4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDYwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjY3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UgOiBib29sZWFuIgotCQkJCQkiKyBjaXJjdWxhciA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk3ODIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMjgyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMTA3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDAsIDk5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCAxMDUxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MjMKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZmFjZXROYW1lIDogU3RyaW5nIgotCQkJCQkiKyBlZmZlY3RpdmVWYWx1ZSA6IFZhbHVlIikpCi0JCQkJd2lkdGggICAgICAJNDU4Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTI4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDU2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNjI4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2OQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk4MjAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAxMjg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMjg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMTU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDIxNykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMzU2Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGFsaWFzTmFtZSA6IFN0cmluZyIKLQkJCQkJIisgdVJJIDogU3RyaW5nIgotCQkJCQkiKyBhbGlhc1VSSSA6IFN0cmluZyIKLQkJCQkJIisgcU5hbWUgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk0NzIKLQkJCQloZWlnaHQgICAgIAkyODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEAxMjg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMzUyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDI5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTYyCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEyODYKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1MTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEyODUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDMyMCwgNTEwKQotCQkJCSAgICAoMzIwLCA0MjApKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjg3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUAxMjgzCi0JCQkJc3VwcGxpZXIgICAJQDEyODUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MSwgNTU2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MSwgNTEwKQotCQkJCWRyYXdTdXBwbGllciAJQDEyODYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI4OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQljbGllbnQgICAgIAlAMTI3MQotCQkJCXN1cHBsaWVyICAgCUAxMjg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODc3LCA3NDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNTEwKQotCQkJCWRyYXdTdXBwbGllciAJQDEyODYpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBAMTI4OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDE4MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAxLCAxNzYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhJbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCQl3aWR0aCAgICAgIAk0NTYKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiIEAxMjkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxNzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE3MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5IgotCQkJCXdpZHRoICAgICAgCTQ5MwotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDEyOTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE5MzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTg4OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJd2lkdGggICAgICAJNDkzCi0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBAMTI5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDE5NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDczLCAxOTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhFeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIgQDEyOTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNCwgMTM3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBAMTI5NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEyNjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTYzLCAxMjEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJd2lkdGggICAgICAJMzk2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIgQDEyOTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDEzOTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMTM0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJCXdpZHRoICAgICAgCTM4MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiIEAxMjk2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMjMyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDksIDExNzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzgyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCQl3aWR0aCAgICAgIAk0MDAKLQkJCQloZWlnaHQgICAgIAkxMzIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEAxMjk3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTYxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1MzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTU5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IiBAMTI5OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDIyODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMjM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJd2lkdGggICAgICAJNDU0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMjk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMjYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzQsIDI1NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDEzMDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAyMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE5NiwgMjA3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGF0dGVybkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCXdpZHRoICAgICAgCTM2MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBAMTMwMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjA5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCAyMDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbnVtZXJhdGlvbkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCXdpZHRoICAgICAgCTQ1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIgQDEzMDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjIyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJd2lkdGggICAgICAJMzU4Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBAMTMwMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTU4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAxNTAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAxNTYzKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiIKLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQotCQkJCXdpZHRoICAgICAgCTQyMgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIgQDEzMDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyNDY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjExMSwgMjQxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IiBAMTMwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDM5LCAyMzk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5MZW5ndGhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSIKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDEzMDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjU1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVG90YWxEaWdpdHNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTMwNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2NywgMTEwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEzMDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTAyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTMwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzMDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzY0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiPDwwLi4qPj4gKyB2YWxpZEZhY2V0cyA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTU5NAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDgiIEAxMzEwCi0JCQkJbG9jYXRpb24gICAJKDE0NDYsIDEyMTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTQwMzBBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxMzExCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMxMAotCQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAtNzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODAsIDExNzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMy4yNjgyOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwREQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzEwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NDYsIDEyMTgpCi0JCQkJCSAgICAoMTQ4NywgMTIxOCkKLQkJCQkJICAgICgxNDg3LCAxMjkyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NDYsIDEyMTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxMjkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM5LCAxMjU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTg0MjExCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDkiIEAxMzE0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMxMAotCQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAtNzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEU3IgotCQkJCQljbGllbnQgICAgIAlAMTMxMAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDQ2LCAxMjE4KQotCQkJCQkgICAgKDE0MDUsIDEyMTgpCi0JCQkJCSAgICAoMTQwNSwgMTI5MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNSwgMTI5MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUyIiBAMTMxNQotCQkJCWxvY2F0aW9uICAgCSgxNzMzLCAxNTc1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDhEMDI1MiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUzIiBAMTMxNgotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTUKLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RTAwOTEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzE1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3MzMsIDE1NzUpCi0JCQkJCSAgICAoMTQ4NywgMTU3NSkKLQkJCQkJICAgICgxNDg3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzMsIDE1NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RmFjZXQiIEAxMzE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMxNQotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzUxLCAxNTQxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDYyNDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RTAwOUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzE1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjk3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNiwgMTU3NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA0MiwgMTUzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MTU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NCIgQDEzMjAKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NywgMTc5MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQjAzOTYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NSIgQDEzMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIwCi0JCQkJCWxvY2F0aW9uICAgCSg3MDcsIC0zMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzQzkiCi0JCQkJCWNsaWVudCAgICAgCUAxMzIwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1ODcsIDE3OTMpCi0JCQkJCSAgICAoMTQ0NywgMTc5MykKLQkJCQkJICAgICgxNDQ3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQ3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4SW5jbHVzaXZlRmFjZXQiIEAxMzIyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMyMAotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDE3NTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4SW5jbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODQ0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEFDMDNENCIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjAKLQkJCQkJc3VwcGxpZXIgICAJQDEyODkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkyLCAxNzkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIwLCAxNzU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTkxNTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU2IiBAMTMyNQotCQkJCWxvY2F0aW9uICAgCSg5MzcsIDE3ODcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUYwMzM4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTciIEAxMzI2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMyNQotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAxRjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMzI1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkzNywgMTc4NykKLQkJCQkJICAgICg5OTcsIDE3ODcpCi0JCQkJCSAgICAoOTk3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkluY2x1c2l2ZUZhY2V0IiBAMTMyNwotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjUKLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5MiwgMTc0NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5JbmNsdXNpdmVGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzQ2MDYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMjAzIgotCQkJCQljbGllbnQgICAgIAlAMTMyNQotCQkJCQlzdXBwbGllciAgIAlAMTI5MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTE4LCAxNzg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDE3NDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2Mzk2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTgiIEAxMzMwCi0JCQkJbG9jYXRpb24gICAJKDk4MSwgMTkzNykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMzAyMDciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1OSIgQDEzMzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMwCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk4MSwgMTkzNykKLQkJCQkJICAgICgxMDQxLCAxOTM3KQotCQkJCQkgICAgKDEwNDEsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgxLCAxOTM3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0MSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTMzMgotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzAKLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjMsIDE5MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRXhjbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0MTI1MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5QSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzAKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTkzNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg5LCAxODk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDY2NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYwIiBAMTMzNQotCQkJCWxvY2F0aW9uICAgCSgxNDY5LCAxOTUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEI2MDI4RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYxIiBAMTMzNgotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzUKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgLTk1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIxNyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ2OSwgMTk1MykKLQkJCQkJICAgICgxNDAwLCAxOTUzKQotCQkJCQkgICAgKDE0MDAsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDAsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhFeGNsdXNpdmVGYWNldCIgQDEzMzcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM1Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NiwgMTkxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhFeGNsdXNpdmVGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjcwMjIxIgotCQkJCQljbGllbnQgICAgIAlAMTMzNQotCQkJCQlzdXBwbGllciAgIAlAMTI5MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjQsIDE5NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NjEsIDE5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyNzIzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjIiIEAxMzQwCi0JCQkJbG9jYXRpb24gICAJKDExMjIsIDIxODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMDUxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjMiIEAxMzQxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0MAotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI0NiIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIxODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibGVuZ3RoRmFjZXQiIEAxMzQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0MAotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDQsIDIyMDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbGVuZ3RoRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3NTQ3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI1MCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTEyMiwgMjE4MCkKLQkJCQkJICAgICgxMTIyLCAyMjQwKQotCQkJCQkgICAgKDM4NywgMjI0MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg3LCAyMjQwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NzEsIDIyMDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTU5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjYiIEAxMzQ1Ci0JCQkJbG9jYXRpb24gICAJKDEwODQsIDE5ODkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzIwMjFEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjciIEAxMzQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0NQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzODAsIDQzNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMzAwQUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVudW1lcmF0aW9uRmFjZXRzIiBAMTM0NwotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDUKLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzNywgMjAxNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbnVtZXJhdGlvbkZhY2V0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDY1ODU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFDIgotCQkJCQljbGllbnQgICAgIAlAMTM0NQotCQkJCQlzdXBwbGllciAgIAlAMTMwMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg0LCAxOTg5KQotCQkJCQkgICAgKDEwODQsIDIwNDkpCi0JCQkJCSAgICAoNDg1LCAyMDQ5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIwNDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4MywgMjAyMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODUxMjkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2OCIgQDEzNTAKLQkJCQlsb2NhdGlvbiAgIAkoMTQ1MSwgMjA3NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNTAxNTkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2OSIgQDEzNTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzUwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCMCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ1MSwgMjA3NCkKLQkJCQkJICAgICgxMzYyLCAyMDc0KQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXR0ZXJuRmFjZXRzIiBAMTM1MgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTAKLQkJCQkJbG9jYXRpb24gICAJKC0xNTI1LCA1MzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjAsIDIwMzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGF0dGVybkZhY2V0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3MjIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzYwMEJBIgotCQkJCQljbGllbnQgICAgIAlAMTM1MAotCQkJCQlzdXBwbGllciAgIAlAMTMwMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIwNzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzIsIDIwMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwODY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzAiIEAxMzU1Ci0JCQkJbG9jYXRpb24gICAJKDE4MjcsIDE0MDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzgwMkE3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzEiIEAxMzU2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUVBIgotCQkJCQljbGllbnQgICAgIAlAMTM1NQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNywgMTQwMCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjksIDE0MDApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjYXJkaW5hbGl0eUZhY2V0IiBAMTM1NwotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODQ3LCAxMzU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NhcmRpbmFsaXR5RmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MTczMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFGNSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTUKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCAxNDAwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgzLCAxMzU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM0MjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgwIiBAMTM2MAotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDEzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERCMDM3NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgxIiBAMTM2MQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjAKLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzYwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMzYyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM2MAotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA4LCAyNTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNzM5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM2NCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMjQxMykKLQkJCQkJICAgICgxMjYyLCAyNTk2KQotCQkJCQkgICAgKDIwNjUsIDI1OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI1OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzksIDI1NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODQiIEAxMzY1Ci0JCQkJbG9jYXRpb24gICAJKDE4NDEsIDEzMDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTMwMEQ5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODUiIEAxMzY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM2NQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzhFIgotCQkJCQljbGllbnQgICAgIAlAMTM2NQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjksIDEzMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJib3VuZGVkRmFjZXQiIEAxMzY3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM2NQotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzIsIDEyNzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYm91bmRlZEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDMxNzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzk4IgotCQkJCQljbGllbnQgICAgIAlAMTM2NQotCQkJCQlzdXBwbGllciAgIAlAMTI5NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTQsIDEzMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzcsIDEyNzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NDcxNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjQiIEAxMzcwCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIxODYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkYwMThDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjUiIEAxMzcxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM3MAotCQkJCQlsb2NhdGlvbiAgIAkoLTY0MCwgNjM0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA2QiIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAid2hpdGVTcGFjZUZhY2V0IiBAMTM3MgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzAKLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MywgMjIwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit3aGl0ZVNwYWNlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MDkwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA3NSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzAKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMyOCwgMjE4NikKLQkJCQkJICAgICgxMzI4LCAyMjQ2KQotCQkJCQkgICAgKDIwOTMsIDIyNDYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIyNDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMzMsIDIyMDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNjc2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODIiIEAxMzc1Ci0JCQkJbG9jYXRpb24gICAJKDY3NCwgMTM5MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAwNDgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MyIgQDEzNzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzUsIDEzOTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmRlcmVkRmFjZXQiIEAxMzc3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM3NQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDY1OCwgMTM1MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmRlcmVkRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MTUzOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDNDMyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzUKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTM5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCAxMzU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzQ2MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcyIiBAMTM4MAotCQkJCWxvY2F0aW9uICAgCSg2ODcsIDEyOTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0IwMzlDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzMiIEAxMzgxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM4MAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MDksIC01NzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QwIgotCQkJCQljbGllbnQgICAgIAlAMTM4MAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMjk2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibnVtZXJpY0ZhY2V0IiBAMTM4MgotCQkJCQlQYXJlbnRfVmlldyAJQDEzODAKLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjgsIDEyNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbnVtZXJpY0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODA5NzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzgwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjk2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDAsIDEyOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwNiwgMTI2MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2ODQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NiIgQDEzODUKLQkJCQlsb2NhdGlvbiAgIAkoMTY4OSwgMTY2MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NDAxRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NyIgQDEzODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgzLCAtMzU0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2MCIKLQkJCQkJY2xpZW50ICAgICAJQDEzODUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTY4OSwgMTY2MikKLQkJCQkJICAgICgxNDg3LCAxNjYyKQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhGYWNldCIgQDEzODcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgzLCAtMzU0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzY5LCAxNjIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODIwNTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNkEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjk3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNiwgMTY2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA0NCwgMTYyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE1Mzg1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4OCIgQDEzOTAKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI1OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU0RjAxNDUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4OSIgQDEzOTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOEMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzkwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIgQDEzOTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgMjI4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwODU0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM5NiIKLQkJCQkJY2xpZW50ICAgICAJQDEzOTAKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMyOCwgMjI1OCkKLQkJCQkJICAgICgxMzI4LCAyMzI0KQotCQkJCQkgICAgKDIwOTMsIDIzMjQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIzMjQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDksIDIyOTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODgxNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTAiIEAxMzk1Ci0JCQkJbG9jYXRpb24gICAJKDEyOTcsIDIzNjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzQwMTFDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTEiIEAxMzk2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM5NQotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMEQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzk1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzY2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IiBAMTM5NwotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTUKLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTcsIDI0NjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNjkwNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNUM1MDIxNyIKLQkJCQkJY2xpZW50ICAgICAJQDEzOTUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI5NywgMjM2NikKLQkJCQkJICAgICgxMjk3LCAyNDk5KQotCQkJCQkgICAgKDIxMDIsIDI0OTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDIsIDI0OTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDcsIDI0NzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTMwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTIiIEAxNDAwCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDI0NDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkEwMEFBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTMiIEAxNDAxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMAotCQkJCQlsb2NhdGlvbiAgIAkoLTExNzAsIC04MTUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkIwMTM4IgotCQkJCQljbGllbnQgICAgIAlAMTQwMAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTQwMgotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDAKLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCAyNjM0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NTMxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDE0MiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDAKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMjQ0OSkKLQkJCQkJICAgICgxMjYyLCAyNjY4KQotCQkJCQkgICAgKDIwNjUsIDI2NjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI2NjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODksIDI2MjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNjQ4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTQiIEAxNDA1Ci0JCQkJbG9jYXRpb24gICAJKDE0MjIsIDIxNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjAwM0E2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTUiIEAxNDA2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQwNQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjEwMzExIgotCQkJCQljbGllbnQgICAgIAlAMTQwNQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDIyLCAyMTU5KQotCQkJCQkgICAgKDEzNjIsIDIxNTkpCi0JCQkJCSAgICAoMTM2MiwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIgQDE0MDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzcwLCAtMTMxMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyNywgMjEyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5OTA5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDUKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjIsIDIxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMTE5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODkyMjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk2IiBAMTQxMAotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAyMDgzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCN0NBMDI2QiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk3IiBAMTQxMQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTAKLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTg2IgotCQkJCQljbGllbnQgICAgIAlAMTQxMAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMjA4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IiBAMTQxMgotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTAKLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMjEwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODg2MTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQjAxOTAiCi0JCQkJCWNsaWVudCAgICAgCUAxNDEwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwODQsIDIwODMpCi0JCQkJCSAgICAoMTA4NCwgMjE0MykKLQkJCQkJICAgICg0ODUsIDIxNDMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMjA4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ4NSwgMjE0MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCAyMTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MzE3MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAyIiBAMTQxNQotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMjQxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDA1MiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAzIiBAMTQxNgotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTUKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTQ3OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAzQjkiCi0JCQkJCWNsaWVudCAgICAgCUAxNDE1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUxlbmd0aEZhY2V0IiBAMTQxNwotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTUKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTQ3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUxlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTE3MzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAzQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxNDE1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzAyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMjIsIDIyNDEpCi0JCQkJCSAgICAoMTEyMiwgMjMxOCkKLQkJCQkJICAgICgzODcsIDIzMTgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjMxOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcwLCAyMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg1NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUwIiBAMTQyMAotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDE1NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODUwMjVCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTEiIEAxNDIxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyMAotCQkJCQlsb2NhdGlvbiAgIAkoNDY5LCAxMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NjAyNzAiCi0JCQkJCWNsaWVudCAgICAgCUAxNDIwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3MywgMTU2NSkKLQkJCQkJICAgICg5NTksIDE1NjUpCi0JCQkJCSAgICAoOTU5LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkZhY2V0IiBAMTQyMgotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjAKLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MywgMTUzMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYzMDkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjdBIgotCQkJCQljbGllbnQgICAgIAlAMTQyMAotCQkJCQlzdXBwbGllciAgIAlAMTMwMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNTY1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDE1MjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDQiIEAxNDI1Ci0JCQkJbG9jYXRpb24gICAJKDgxNiwgMTY1MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MDAxREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNSIgQDE0MjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDI1Ci0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMENGIgotCQkJCQljbGllbnQgICAgIAlAMTQyNQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4MTYsIDE2NTApCi0JCQkJCSAgICAoOTU5LCAxNjUwKQotCQkJCQkgICAgKDk1OSwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTYsIDE2NTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5GYWNldCIgQDE0MjcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDI1Ci0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2NCwgMTYxNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTQxNjE4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMEQ5IgotCQkJCQljbGllbnQgICAgIAlAMTQyNQotCQkJCQlzdXBwbGllciAgIAlAMTMwMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNjUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjMsIDE2MDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMjc0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzQiIEAxNDMwCi0JCQkJbG9jYXRpb24gICAJKDEyOTcsIDIzMjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0YwMTk5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzUiIEAxNDMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMAotCQkJCQlsb2NhdGlvbiAgIAkoLTcxOSwgNDk3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQyMDA4NSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4TGVuZ3RoRmFjZXQiIEAxNDMyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMAotCQkJCQlsb2NhdGlvbiAgIAkoLTcxOSwgNDk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjMwLCAyMzgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heExlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzIyNTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwOEYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDMwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyOTcsIDIzMjEpCi0JCQkJCSAgICAoMTI5NywgMjQwOSkKLQkJCQkJICAgICgyMTAyLCAyNDA5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTk0LCAyMzY2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkyMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc2IiBAMTQzNQotCQkJCWxvY2F0aW9uICAgCSgxMTU5LCAyMjczKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ1MDBDNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc3IiBAMTQzNgotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzUKLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMUQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE1OSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkxlbmd0aEZhY2V0IiBAMTQzNwotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzUKLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAyMzcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkxlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTk1MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMjciCi0JCQkJCWNsaWVudCAgICAgCUAxNDM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNTksIDIyNzMpCi0JCQkJCSAgICAoMTE1OSwgMjQwOSkKLQkJCQkJICAgICg0NTAsIDI0MDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAyMzY5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM2MTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAwIiBAMTQ0MAotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCAyMzM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCODk4MDE2RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAxIiBAMTQ0MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDAKLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNTYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAyMzM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IiBAMTQ0MgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDAKLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU2LCAyNDU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTI2MDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNDQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTcsIDIzMzQpCi0JCQkJCSAgICAoMTE5NywgMjQ5MykKLQkJCQkJICAgICg0NTAsIDI0OTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQ5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI3LCAyNDUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTYwNDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk4IiBAMTQ0NQotCQkJCWxvY2F0aW9uICAgCSgxMjMxLCAyNDM4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCODQwMDA2MiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk5IiBAMTQ0NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDUKLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MTAwMUQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiIEAxNDQ3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0NQotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDI2MzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk3MDMwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDI3IgotCQkJCQljbGllbnQgICAgIAlAMTQ0NQotCQkJCQlzdXBwbGllciAgIAlAMTMwNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjMxLCAyNDM4KQotCQkJCQkgICAgKDEyMzEsIDI2NjgpCi0JCQkJCSAgICAoNDUxLCAyNjY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDI2NjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNCwgMjYzMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE4ODEyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3OCIgQDE0NTAKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjM5NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAwREUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3OSIgQDE0NTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUwCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwM0NEIgotCQkJCQljbGllbnQgICAgIAlAMTQ1MAotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0b3RhbERpZ2l0c0ZhY2V0IiBAMTQ1MgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTAKLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUzLCAyNTUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3RvdGFsRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NTU2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNENyIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIzMSwgMjM5NykKLQkJCQkJICAgICgxMjMxLCAyNTg3KQotCQkJCQkgICAgKDQ1MSwgMjU4NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNTg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzUsIDI1NjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNDY0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDE0NTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgNzY4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxOSwgNTc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAk0NDQKLQkJCQloZWlnaHQgICAgIAk0MTMKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ1NgotCQkJCWxvY2F0aW9uICAgCSgxMjA5LCAxMDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMjA5LCAxMDY1KQotCQkJCSAgICAoMTIwOSwgOTc0KSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNCIgQDE0NTcKLQkJCQlsb2NhdGlvbiAgIAkoMTA5MCwgMTAzMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGNTAzRDkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDE0NTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU3Ci0JCQkJCWxvY2F0aW9uICAgCSgzMjIsIC0yNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk3LCAxMDM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5ODc2NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTk0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGOTAwM0MiCi0JCQkJCWNsaWVudCAgICAgCUAxNDU3Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5MCwgOTc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTIxLCAxMDM0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYxNzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzUiIEAxNDYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ1NwotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDQ2IgotCQkJCQljbGllbnQgICAgIAlAMTQ1NwotCQkJCQlzdXBwbGllciAgIAlAMTMwNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDEwODgpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MCIgQDE0NjIKLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgODczKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBNkRCMDFFNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGUiIEAxNDYzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2MgotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTgsIDc5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjc2MDg3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjIKLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzOCwgODczKQotCQkJCQkgICAgKDE1MzgsIDkxOSkKLQkJCQkJICAgICgxNDU0LCA5MTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgODczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgOTE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA5LCA4NzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAxNjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQxIiBAMTQ2NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjIKLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjIKLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzOCwgODczKQotCQkJCQkgICAgKDE1MzgsIDgyOCkKLQkJCQkJICAgICgxNDU0LCA4MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgODczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgODI4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDIiIEAxNDY3Ci0JCQkJbG9jYXRpb24gICAJKDE1MzUsIDY4NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxMjAxMDgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlIiBAMTQ2OAotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjcKLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA1OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS45NzcyNzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTI0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNTEiCi0JCQkJCWNsaWVudCAgICAgCUAxNDY3Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzUsIDY4NCkKLQkJCQkJICAgICgxNTM1LCA3MjgpCi0JCQkJCSAgICAoMTQ1NCwgNzI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDcyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwNiwgNjgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI3Nzc4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDMiIEAxNDcxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2NwotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTVCIgotCQkJCQljbGllbnQgICAgIAlAMTQ2NwotCQkJCQlzdXBwbGllciAgIAlAMTQ1NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM1LCA2ODQpCi0JCQkJCSAgICAoMTUzNSwgNjQxKQotCQkJCQkgICAgKDE0NTQsIDY0MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA2NDEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NiIgQDE0NzIKLQkJCQlsb2NhdGlvbiAgIAkoNjEzLCA5NDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RUQwM0MwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb21wbGV4VHlwZSIgQDE0NzMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDcyCi0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2NSwgOTgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBsZXhUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzMwNTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMTciCi0JCQkJCWNsaWVudCAgICAgCUAxNDcyCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDYxMywgOTQwKQotCQkJCQkgICAgKDI4NCwgOTQwKQotCQkJCQkgICAgKDI4NCwgMTAwOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTMsIDk0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgMTAwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDczCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA5NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwOTMyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ3IiBAMTQ3NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzIKLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMjEiCi0JCQkJCWNsaWVudCAgICAgCUAxNDcyCi0JCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTMsIDk0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTAsIDk0MCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDc3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUAxNDU1Ci0JCQkJc3VwcGxpZXIgICAJQDEyODUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTEyLCA1NjIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTIsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjg2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDEzMDcKLQkJCQlzdXBwbGllciAgIAlAMTQ1NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDYsIDEwODgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDYsIDEwNjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ1NikKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ0IiBAMTQ3OQotCQkJCWxvY2F0aW9uICAgCSgxMzYyLCAxMTMzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzRCMDE3OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2ltcGxlVHlwZSIgQDE0ODAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDc5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDk5LCAxMDk0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yNDY3NTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEQwMTdCIgotCQkJCQljbGllbnQgICAgIAlAMTQ3OQotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MiwgMTEzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDEyOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjEsIDEwOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMjcyNzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NSIgQDE0ODMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDc5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE4NSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NzkKLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCA5NzQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAxNDg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzYzKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1MDgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZ2xvYmFsIDogYm9vbGVhbiIKLQkJCQkJIisgZmVhdHVyZVJlZmVyZW5jZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ4NQotCQkJCWxvY2F0aW9uICAgCSgyMjYyLCA1NjgpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDE0ODQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIyNjIsIDU2OCkKLQkJCQkgICAgKDIyNjIsIDQ3NykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0ODYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDEyODEKLQkJCQlzdXBwbGllciAgIAlAMTQ4NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDU5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM0NiwgNTY4KQotCQkJCWRyYXdTdXBwbGllciAJQDE0ODUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzOCIgQDE0ODcKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MywgNDUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBMEYyMDFBNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZSIgQDE0ODgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDg3Ci0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzMSwgNDk5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjI2NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBMEYzMDJFNSIKLQkJCQkJY2xpZW50ICAgICAJQDE0ODcKLQkJCQkJc3VwcGxpZXIgICAJQDE0NTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU1MywgNDUzKQotCQkJCQkgICAgKDEyMjIsIDQ1MykKLQkJCQkJICAgICgxMjIyLCA1NjIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1MywgNDUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyMiwgNTYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTg1LCA0NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjAzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM5IiBAMTQ5MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODcKLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBMEYzMDJGMCIKLQkJCQkJY2xpZW50ICAgICAJQDE0ODcKLQkJCQkJc3VwcGxpZXIgICAJQDE0ODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDQ1MykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMwIiBAMTQ5MgotCQkJCWxvY2F0aW9uICAgCSgxOTA4LCAzNTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMDYwMkQ3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEZlYXR1cmUiIEAxNDkzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ5MgotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyOSwgMzUyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkRmVhdHVyZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyOTQxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMEUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDkyCi0JCQkJCXN1cHBsaWVyICAgCUAxNDg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE5MDgsIDM1MykKLQkJCQkJICAgICgxOTA4LCAzODcpCi0JCQkJCSAgICAoMTk5MywgMzg3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDM4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk0NSwgMzU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTY2MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMSIgQDE0OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDkyCi0JCQkJCWxvY2F0aW9uICAgCSgtMjY4LCAtMTU5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjkwMTBCMDAxOCIKLQkJCQkJY2xpZW50ICAgICAJQDE0OTIKLQkJCQkJc3VwcGxpZXIgICAJQDE0ODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTkwOCwgMzUzKQotCQkJCQkgICAgKDE5MDgsIDMxOSkKLQkJCQkJICAgICgxOTkzLCAzMTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgMzE5KSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDEyODUKLQkJCQlzdXBwbGllciAgIAlAMTI4NAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDk0LCAyODQpCi0JCQkJICAgICg0OTQsIDI0NCkKLQkJCQkgICAgKDk5NiwgMjQ0KSkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDI4NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTk2LCAyNDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiCi0JCQkJY2xpZW50ICAgICAJQDEyNzIKLQkJCQlzdXBwbGllciAgIAlAMTQ4NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MTgsIDgxMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcxOCwgNTY4KQotCQkJCWRyYXdTdXBwbGllciAJQDE0ODUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlAMTMwOQotCQkJCXN1cHBsaWVyICAgCUAxNDU1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NSwgMTI5MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NSwgMTA2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDE0ODQKLQkJCQlzdXBwbGllciAgIAlAMTI4NAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjE0NywgMjkxKQotCQkJCSAgICAoMjE0NywgMjQ0KQotCQkJCSAgICAoMTQ2OCwgMjQ0KSkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTQ3LCAyOTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDI0NCkpKSkpKSkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNjMiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjpodHRwIiBAMTUwMQotCQkJbG9jYXRpb24gICAJKDMzNiwgMjI0KQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTkyLCAxNDApCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJodHRwIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQUJGRDlBRDAxRjgiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OndzZGwiIEAxNTAyCi0JCQlsb2NhdGlvbiAgIAkoNzg0LCAyMjQpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwMgotCQkJICAgIGxvY2F0aW9uICAgCSg2NDAsIDE0MCkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJIndzZGwiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjNBREZCOEU1MDIxRSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6eHNkIiBAMTUwMwotCQkJbG9jYXRpb24gICAJKDEyMzIsIDIyNCkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTAzCi0JCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDE0MCkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJInhzZCIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiMzlBQkRDNkYwMUFBIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApKSkpKQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciCi0JcXVpZCAgICAgICAJIjNBQkZEOUE3MDE1MiIKLQlwaHlzaWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IE1vZHVsZV9EaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMThCIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9jZXNzX3N0cnVjdHVyZSAJKG9iamVjdCBQcm9jZXNzZXMKLQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTUzIgotCVByb2NzTkRldnMgCShsaXN0Ci0JICAgIChvYmplY3QgUHJvY2Vzc19EaWFncmFtICJEZXBsb3ltZW50IFZpZXciCi0JCXF1aWQgICAgICAgCSIzQUJGRDlBNzAxNTUiCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvcGVydGllcyAJKG9iamVjdCBQcm9wZXJ0aWVzCi0JYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YUJhc2VTZXQiIDgwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIkFOU0kiCi0JCQkJdmFsdWUgICAgICAJODAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiT3JhY2xlIgotCQkJCXZhbHVlICAgICAgCTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIlNRTFNlcnZlciIKLQkJCQl2YWx1ZSAgICAgIAk4MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJTeWJhc2UiCi0JCQkJdmFsdWUgICAgICAJODAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiV2F0Y29tIgotCQkJCXZhbHVlICAgICAgCTgwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lIgotCQkJdmFsdWUgICAgICAJIlZfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJUXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0U3VmZml4IgotCQkJdmFsdWUgICAgICAJIl9WIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkJhc2VWaWV3cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiVkFSQ0hBUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIk51bGxzT0siCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImZyYW1ld29yayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklETEVsZW1lbnQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSURMU3BlY2lmaWNhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIklETFNwZWNTZXQiIDIyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklETFNwZWNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJUeXBlZGVmIgotCQkJCXZhbHVlICAgICAgCTU0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiRW51bWVyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiRXhjZXB0aW9uIgotCQkJCXZhbHVlICAgICAgCTYxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiU3RydWN0IgotCQkJCXZhbHVlICAgICAgCTUxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiVW5pb24iCi0JCQkJdmFsdWUgICAgICAJODEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9jb20uaWJtLmV0b29scy5jdGMuYmluZGluZy5odHRwL3NyYy9yb3NlL2h0dHBiaW5kaW5nTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJRExNb2R1bGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuaHR0cC9zcmMvcm9zZS9odHRwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkibV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzVmFyaWFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkic18iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJInZvaWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdFNpbmNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWF4TnVtQ2hhcnMiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk0iCi0JCQl2YWx1ZSAgICAgIAkoIlZNVHlwZSIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3VuIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJNaWNyb3NvZnQiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIklCTSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIgotCQkJdmFsdWUgICAgICAJMykKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIgotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTkwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMTkwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiCi0JCQkJdmFsdWUgICAgICAJMTkwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIgotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJBRlRFUiIKLQkJCQl2YWx1ZSAgICAgIAkxODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSIKLQkJCQl2YWx1ZSAgICAgIAkxODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlJPVyIKLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCIKLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCIKLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIjIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIjYiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSIKLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIgotCQkJCXZhbHVlICAgICAgCTIwNikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuaHR0cC9zcmMvcm9zZS9odHRwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuaHR0cC9zcmMvcm9zZS9odHRwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAKLXwvLyAkcGFja2FnZQotfCNpbmNsdWRlICIkZmlsZSIKLXwKLQkJCSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk9wZXJhdGlvbktpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlJhaXNlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcmRlcmVkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkSGFzUmVsVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZUFyZ3VtZW50cyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5nZXQoJGtleXMpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyU2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLnNldCgka2V5cywkdmFsdWUpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHN1cHBsaWVyICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZEdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZEdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkF0QXR0cmlidXRlVmlzaWJpbGl0eSIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlNDQyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVHlwZUxpYkltcG9ydGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpY05vdENyZWF0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIxOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIgotCQkJCXZhbHVlICAgICAgCTIyMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSIKLQkJCXZhbHVlICAgICAgCSIwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGFibGUiCi0JCQl2YWx1ZSAgICAgIAkoIkNyZWF0YWJsZVNldCIgMjIxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5pdGlhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlVGVybWluYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25DbGFzcyIKLQkJCXZhbHVlICAgICAgCSJDb2xsZWN0aW9uIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkJpbmFyeSIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJUZXh0IgotCQkJCXZhbHVlICAgICAgCTIwNCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJG9wZXJhdGlvbiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2plY3RGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsU3R1ZGlvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQk1QX0V4dGVuZF9DTVAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSMkVkaXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKSkKLQlxdWlkICAgICAgIAkiM0FCRkQ5QTcwMTU0IikpCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQQWRkcmVzcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEFkZHJlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhYjU4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWRkcmVzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBBZGRyZXNzKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQQWRkcmVzcyBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYXRpb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2NhdGlvblVSSShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUEFkZHJlc3NfTG9jYXRpb25VUkkoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uVVJJKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBIVFRQQWRkcmVzcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEJpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzI1NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nI2dldFZlcmIgPGVtPlZlcmI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQQmluZGluZygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRUUEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcmI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcmI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmVyYihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2UjZ2V0SFRUUEJpbmRpbmdfVmVyYigpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyYigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nI2dldFZlcmIgPGVtPlZlcmI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcmI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcmIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcmIoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBIVFRQQmluZGluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTgyYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUVFBGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsLkhUVFBGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQQmluZGluZyBjcmVhdGVIVFRQQmluZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUE9wZXJhdGlvbiBjcmVhdGVIVFRQT3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlIVFRQVXJsUmVwbGFjZW1lbnQgY3JlYXRlSFRUUFVybFJlcGxhY2VtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlVybCBFbmNvZGVkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUFVybEVuY29kZWQgY3JlYXRlSFRUUFVybEVuY29kZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUEFkZHJlc3MgY3JlYXRlSFRUUEFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUFBhY2thZ2UgZ2V0SFRUUFBhY2thZ2UoKTsKLQotfSAvL0hUVFBGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGE5YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQT3BlcmF0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQT3BlcmF0aW9uIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2F0aW9uIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9jYXRpb25VUkkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBPcGVyYXRpb25fTG9jYXRpb25VUkkoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uVVJJKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbiNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEhUVFBPcGVyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWQ2NTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImh0dHAiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL0hUVFAiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAiaHR0cCI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUhUVFBQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsLkhUVFBQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBCaW5kaW5nSW1wbCA8ZW0+QmluZGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBCaW5kaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldEhUVFBCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhUVFBfQklORElORyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9CSU5ESU5HX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9CSU5ESU5HX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9CSU5ESU5HX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJiPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9CSU5ESU5HX19WRVJCID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQklORElOR19GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQT3BlcmF0aW9uSW1wbCA8ZW0+T3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUE9wZXJhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRIVFRQT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT05fX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9PUEVSQVRJT05fX0xPQ0FUSU9OX1VSSSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3BlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBVcmxSZXBsYWNlbWVudEltcGwgPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBVcmxSZXBsYWNlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRIVFRQVXJsUmVwbGFjZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfUkVQTEFDRU1FTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX1JFUExBQ0VNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9SRVBMQUNFTUVOVF9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX1JFUExBQ0VNRU5UX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBVcmxFbmNvZGVkSW1wbCA8ZW0+VXJsIEVuY29kZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQVXJsRW5jb2RlZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRIVFRQVXJsRW5jb2RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIVFRQX1VSTF9FTkNPREVEID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9FTkNPREVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfVVJMX0VOQ09ERURfX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBIVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9VUkxfRU5DT0RFRF9GRUFUVVJFX0NPVU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQWRkcmVzc0ltcGwgPGVtPkFkZHJlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQWRkcmVzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRIVFRQQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIVFRQX0FERFJFU1MgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTU19fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTU19fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEhUVFBfQUREUkVTU19fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb24gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkFkZHJlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSFRUUF9BRERSRVNTX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MgPGVtPklIVFRQIEFkZHJlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldElIVFRQQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSFRUUF9BRERSRVNTID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUhUVFAgQWRkcmVzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSFRUUF9BRERSRVNTX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIDxlbT5JSFRUUCBCaW5kaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBQYWNrYWdlSW1wbCNnZXRJSFRUUEJpbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUhUVFBfQklORElORyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklIVFRQIEJpbmRpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUhUVFBfQklORElOR19GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiA8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmltcGwuSFRUUFBhY2thZ2VJbXBsI2dldElIVFRQT3BlcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElIVFRQX09QRVJBVElPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklIVFRQIE9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSFRUUF9PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIDxlbT5JSFRUUCBVcmwgRW5jb2RlZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SUhUVFBVcmxFbmNvZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElIVFRQX1VSTF9FTkNPREVEID0gODsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUhUVFBfVVJMX0VOQ09ERURfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCA8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQUGFja2FnZUltcGwjZ2V0SUhUVFBVcmxSZXBsYWNlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJSFRUUF9VUkxfUkVQTEFDRU1FTlQgPSA5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUhUVFBfVVJMX1JFUExBQ0VNRU5UX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmcgPGVtPkJpbmRpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SFRUUEJpbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nI2dldFZlcmIgPGVtPlZlcmI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJiPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nI2dldFZlcmIoKQotCSAqIEBzZWUgI2dldEhUVFBCaW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRIVFRQQmluZGluZ19WZXJiKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbiA8ZW0+T3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRIVFRQT3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbiNnZXRMb2NhdGlvblVSSSgpCi0JICogQHNlZSAjZ2V0SFRUUE9wZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SFRUUE9wZXJhdGlvbl9Mb2NhdGlvblVSSSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCA8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEhUVFBVcmxSZXBsYWNlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkIDxlbT5VcmwgRW5jb2RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5VcmwgRW5jb2RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SFRUUFVybEVuY29kZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcyA8ZW0+QWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRIVFRQQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSgpCi0JICogQHNlZSAjZ2V0SFRUUEFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEhUVFBBZGRyZXNzX0xvY2F0aW9uVVJJKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyA8ZW0+SUhUVFAgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSFRUUCBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3MiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUhUVFBBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyA8ZW0+SUhUVFAgQmluZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSFRUUCBCaW5kaW5nPC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUhUVFBCaW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIDxlbT5JSFRUUCBPcGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElIVFRQT3BlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCA8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSFRUUFVybEVuY29kZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCA8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SUhUVFBVcmxSZXBsYWNlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSFRUUEZhY3RvcnkgZ2V0SFRUUEZhY3RvcnkoKTsKLQotfSAvL0hUVFBQYWNrYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsRW5jb2RlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvSFRUUFVybEVuY29kZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2YzAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsRW5jb2RlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXJsIEVuY29kZWQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2dldEhUVFBVcmxFbmNvZGVkKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBIVFRQVXJsRW5jb2RlZCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCB7Ci19IC8vIEhUVFBVcmxFbmNvZGVkCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9IVFRQVXJsUmVwbGFjZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBVcmxSZXBsYWNlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQxZGRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL0hUVFBVcmxSZXBsYWNlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXJsIFJlcGxhY2VtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZSNnZXRIVFRQVXJsUmVwbGFjZW1lbnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUVFBVcmxSZXBsYWNlbWVudCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQgewotfSAvLyBIVFRQVXJsUmVwbGFjZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2dlbmVyYXRvci9IVFRQQ29udGVudEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvZ2VuZXJhdG9yL0hUVFBDb250ZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MzViOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvZ2VuZXJhdG9yL0hUVFBDb250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuZ2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkNvbnRlbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEhUVFBDb250ZW50R2VuZXJhdG9yIGltcGxlbWVudHMgQ29udGVudEdlbmVyYXRvcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJCX1BPU1QgPSAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJCX0dFVCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUkJfTk9UX1NFVCA9IC0xOwotCi0gIHByaXZhdGUgaW50IHZlcmJPcHRpb24gPSBWRVJCX05PVF9TRVQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYWRkcmVzc0xvY2F0aW9uID0gQ29udGVudEdlbmVyYXRvci5BRERSRVNTX0xPQ0FUSU9OOwotCi0gIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gcmVxdWlyZWROYW1lc3BhY2VzID0geyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIsICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB9OwotCi0gIHB1YmxpYyB2b2lkIHNldFZlcmIoaW50IHZlcmIpIHsKLQkgIHZlcmJPcHRpb24gPSB2ZXJiOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzTG9jYXRpb24oU3RyaW5nIGFkZHJlc3NMb2NhdGlvbikgewotCSAgdGhpcy5hZGRyZXNzTG9jYXRpb24gPSBhZGRyZXNzTG9jYXRpb247Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXF1aXJlZE5hbWVzcGFjZXMoKQotICB7Ci0gICAgcmV0dXJuIHJlcXVpcmVkTmFtZXNwYWNlczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4KFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLQkgIGlmIChuYW1lc3BhY2UuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIikpIHsKLQkJICByZXR1cm4gIm1pbWUiOwotCSAgfQotCSAgZWxzZSBpZiAobmFtZXNwYWNlLmVxdWFscygiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIpKSB7Ci0JCSAgcmV0dXJuICJodHRwIjsKLQkgIH0KLQotCSAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVQb3J0Q29udGVudChQb3J0IHBvcnQpCi0gIHsKLQkgIC8vIFdlIGJsb3cgYXdheSBhbnkgZXhpc3RpbmcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRzL2NvbnRlbnQgYmVmb3JlIHdlIGdlbmVyYXRlIGl0Ci0JICAvLyBJcyBpdCB3b3J0aCBiZWluZyBzbWFydGVyPyAgTG9vayBmb3IgbWF0Y2hpbmcgY29udGVudCBmaXJzdCBhbmQgY3JlYXRlIHRob3NlIHdoaWNoIGFyZW4ndCBmb3VuZD8/Pz8KLQkgIExpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QocG9ydC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCSAgcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKHBvcnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQotCSAgSFRUUEFkZHJlc3MgaHR0cEFkZHJlc3M9IEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQQWRkcmVzcygpOwotCSAgaHR0cEFkZHJlc3Muc2V0TG9jYXRpb25VUkkoYWRkcmVzc0xvY2F0aW9uKTsKLQkgIHBvcnQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cEFkZHJlc3MpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nQ29udGVudChCaW5kaW5nIGJpbmRpbmcsIFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0JICAvLyBXZSBibG93IGF3YXkgYW55IGV4aXN0aW5nIEV4dGVuc2liaWxpdHlFbGVtZW50cy9jb250ZW50IGJlZm9yZSB3ZSBnZW5lcmF0ZSBpdAotCSAgLy8gSXMgaXQgd29ydGggYmVpbmcgc21hcnRlcj8gIExvb2sgZm9yIG1hdGNoaW5nIGNvbnRlbnQgZmlyc3QgYW5kIGNyZWF0ZSB0aG9zZSB3aGljaCBhcmVuJ3QgZm91bmQ/Pz8/Ci0JICBMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGJpbmRpbmcuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQkgIHJlbW92ZUV4dGVuc2ViaWxpdHlFbGVtZW50cyhiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgcmVtb3ZlTGlzdCk7Ci0JCi0JICBIVFRQQmluZGluZyBodHRwQmluZGluZyA9IEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQQmluZGluZygpOwotCSAgaHR0cEJpbmRpbmcuc2V0VmVyYihnZXRWZXJiT3B0aW9uKGJpbmRpbmcpID09IFZFUkJfUE9TVCA/ICJQT1NUIiA6ICJHRVQiKTsKLQotCSAgYmluZGluZy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwQmluZGluZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nT3BlcmF0aW9uLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0JICByZW1vdmVFeHRlbnNlYmlsaXR5RWxlbWVudHMoYmluZGluZ09wZXJhdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHJlbW92ZUxpc3QpOwotCQotCSAgSFRUUE9wZXJhdGlvbiBodHRwT3BlcmF0aW9uID0gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBPcGVyYXRpb24oKTsKLQkgIGh0dHBPcGVyYXRpb24uc2V0TG9jYXRpb25VUkkoIi8iICsgb3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0JICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBPcGVyYXRpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQsIElucHV0IGlucHV0KQotICB7Ci0JICAvLyBXZSBibG93IGF3YXkgYW55IGV4aXN0aW5nIEV4dGVuc2liaWxpdHlFbGVtZW50cy9jb250ZW50IGJlZm9yZSB3ZSBnZW5lcmF0ZSBpdAotCSAgLy8gSXMgaXQgd29ydGggYmVpbmcgc21hcnRlcj8gIExvb2sgZm9yIG1hdGNoaW5nIGNvbnRlbnQgZmlyc3QgYW5kIGNyZWF0ZSB0aG9zZSB3aGljaCBhcmVuJ3QgZm91bmQ/Pz8/Ci0JICBMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGJpbmRpbmdJbnB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCSAgCi0JICAvLyBoYWNrOiB3ZSdyZSBiZWluZyBzbmVha3kgaGVyZS4gU2V0IHRoZSAndmVyYicgb3B0aW9ucyBub3cuCi0JICBpbnQgb3B0aW9uID0gZ2V0VmVyYk9wdGlvbihiaW5kaW5nSW5wdXQpOwotCSAgcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdJbnB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHJlbW92ZUxpc3QpOwotCSAgCi0JICBpZiAob3B0aW9uID09IFZFUkJfUE9TVCkKLQkgIHsKLQkJICAvLyBUT0RPOiBJcyB0aGVyZSBhbiBlcXVpdmFsZW50IEhUVFAgTW9kZWwgT2JqZWN0IGZvciB0aGlzPy4uLi4KLQkJICBFbGVtZW50IGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGJpbmRpbmdJbnB1dC5nZXRFbGVtZW50KCksICJtaW1lIiwgImNvbnRlbnQiKTsKLQkJICBlbGVtZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKTsKLQkgIH0KLQkgIGVsc2UKLQkgIHsKLQkJICBIVFRQVXJsRW5jb2RlZCB1cmxFbmNvZGVkPSBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUFVybEVuY29kZWQoKTsKLQkJICBiaW5kaW5nSW5wdXQuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQodXJsRW5jb2RlZCk7Ci0JICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCwgT3V0cHV0IG91dHB1dCkKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nT3V0cHV0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0KLQkgIC8vIGhhY2s6IHdlJ3JlIGJlaW5nIHNuZWFreSBoZXJlLiBTZXQgdGhlICd2ZXJiJyBvcHRpb25zIG5vdy4KLQkgIGdldFZlcmJPcHRpb24oYmluZGluZ091dHB1dCk7Ci0JICByZW1vdmVFeHRlbnNlYmlsaXR5RWxlbWVudHMoYmluZGluZ091dHB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHJlbW92ZUxpc3QpOwotCi0JICAvLyBUT0RPOiBJcyB0aGVyZSBhbiBlcXVpdmFsZW50IEhUVFAgTW9kZWwgT2JqZWN0IGZvciB0aGlzPy4uLi4KLQkgIEVsZW1lbnQgYmluZGluZ091dHB1dEVsZW1lbnQgPSBiaW5kaW5nT3V0cHV0LmdldEVsZW1lbnQoKTsKLQkgIEVsZW1lbnQgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoYmluZGluZ091dHB1dEVsZW1lbnQsICJtaW1lIiwgImNvbnRlbnQiKTsKLQkgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQveG1sIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdGYXVsdENvbnRlbnQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCwgRmF1bHQgZmF1bHQpCi0gIHsKLSAgICAvL1RPRE8hIQotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudChFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICE9IG51bGwgPyAocHJlZml4ICsgIjoiICsgZWxlbWVudE5hbWUpIDogZWxlbWVudE5hbWU7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBwYXJlbnRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KG5hbWUpOwotCXBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHJlc3VsdCwgcGFyZW50RWxlbWVudC5nZXRGaXJzdENoaWxkKCkpOwotLy8gICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgCi0gIHByaXZhdGUgaW50IGdldFZlcmJPcHRpb24oT2JqZWN0IGdlbmVyaWNCaW5kaW5nT2JqZWN0KSB7Ci0JICBpZiAodmVyYk9wdGlvbiA9PSBWRVJCX05PVF9TRVQgJiYgZ2VuZXJpY0JpbmRpbmdPYmplY3QgIT0gbnVsbCkgewotCQkgIC8vIGluaXQoKSB3YXMgbmV2ZXIgY2FsbGVkLCB0cnkgdG8gZGV0ZXJtaW5lIHRoZSAndmVyYicgYmFzZWQgb24gd2hhdCB3ZSBoYXZlL2tub3cKLQkJICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRCaW5kaW5nT2JqZWN0KGdlbmVyaWNCaW5kaW5nT2JqZWN0KTsKLQkJICAKLQkJICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSB2ZXJiIGZyb20gdGhlIEJpbmRpbmcgT2JqZWN0Ci0JCSAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJICBMaXN0IGxpc3QgPSBiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQkJCSAgSXRlcmF0b3IgdmFsdWVzSXQgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEF0dHJpYnV0ZVZhbHVlKGxpc3QsICJ2ZXJiIikuaXRlcmF0b3IoKTsKLQotCQkJICB3aGlsZSAodmFsdWVzSXQuaGFzTmV4dCgpKSB7Ci0JCQkJICBTdHJpbmcgdmVyYiA9IChTdHJpbmcpIHZhbHVlc0l0Lm5leHQoKTsKLQkJCQkgIAotCQkJCSAgaWYgKHZlcmIuZXF1YWxzKCJQT1NUIikpIHsKLQkJCQkJICB2ZXJiT3B0aW9uID0gVkVSQl9QT1NUOwotCQkJCSAgfQotCQkJCSAgZWxzZSBpZiAodmVyYi5lcXVhbHMoIkdFVCIpKSB7Ci0JCQkJCSAgdmVyYk9wdGlvbiA9IFZFUkJfR0VUOwotCQkJCSAgfQotCQkJCSAgCi0JCQkJICBpZiAodmVyYk9wdGlvbiAhPSBWRVJCX05PVF9TRVQpIHsKLQkJCQkJICBicmVhazsKLQkJCQkgIH0KLQkJCSAgfQotCQkgIH0KLQkgIH0KLQkgIAotCSAgaWYgKHZlcmJPcHRpb24gPT0gVkVSQl9OT1RfU0VUKSB7Ci0JCSAgdmVyYk9wdGlvbiA9IFZFUkJfR0VUOwotCSAgfQotCSAgCi0JICByZXR1cm4gdmVyYk9wdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50QXR0cmlidXRlVmFsdWUoTGlzdCBlZUxpc3QsIFN0cmluZyBhdHRyaWJ1dGVLZXkpIHsKLQkgIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgSXRlcmF0b3IgZWVFbGVtZW50c0l0ID0gZWVMaXN0Lml0ZXJhdG9yKCk7Ci0JICAKLQkgIHdoaWxlIChlZUVsZW1lbnRzSXQuaGFzTmV4dCgpKSB7Ci0JCSAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWVFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlZUVsZW1lbnRzSXQubmV4dCgpOwotCQkgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGVlRWxlbWVudC5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZUtleSk7Ci0JCSAgaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwgJiYgIWF0dHJpYnV0ZVZhbHVlLmVxdWFscygiIikpIHsKLQkJCSAgdmFsdWVzLmFkZChhdHRyaWJ1dGVWYWx1ZSk7Ci0JCSAgfQkJICAKLQkgIH0KLQkgIAotCSAgcmV0dXJuIHZhbHVlczsKLSAgfQotICAKLSAgcHJpdmF0ZSBCaW5kaW5nIGdldEJpbmRpbmdPYmplY3QoT2JqZWN0IGdlbmVyaWNCaW5kaW5nT2JqZWN0KSB7Ci0JICBPYmplY3QgcGFyZW50ID0gZ2VuZXJpY0JpbmRpbmdPYmplY3Q7Ci0JICAKLQkgIGludCBpbmRleCA9IDA7Ci0JICB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgaW5kZXggPCA1KSB7Ci0JCSAgcGFyZW50ID0gZ2V0R2VuZXJpY0JpbmRpbmdPYmplY3RQYXJlbnQocGFyZW50KTsKLQkJICBpZiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZykgewotCQkJICBicmVhazsKLQkJICB9Ci0JCSAgaW5kZXgrKzsKLQkgIH0KLQotCSAgcmV0dXJuIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nKT8gKEJpbmRpbmcpIHBhcmVudCA6IG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRNZXNzYWdlUmVmZXJlbmNlQmluZGluZ09iamVjdHMoT2JqZWN0IGdlbmVyaWNCaW5kaW5nT2JqZWN0KSB7Ci0JICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRCaW5kaW5nT2JqZWN0KGdlbmVyaWNCaW5kaW5nT2JqZWN0KTsKLQkgIAotCSAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkgIEl0ZXJhdG9yIG9wZXJhdGlvbnNJdCA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQkgIAotCQkgIHdoaWxlIChvcGVyYXRpb25zSXQuaGFzTmV4dCgpKSB7Ci0JCQkgIEJpbmRpbmdPcGVyYXRpb24gb3AgPSAoQmluZGluZ09wZXJhdGlvbikgb3BlcmF0aW9uc0l0Lm5leHQoKTsKLQkJCSAgbGlzdC5hZGQob3AuZ2V0RUJpbmRpbmdJbnB1dCgpKTsKLQkJCSAgbGlzdC5hZGQob3AuZ2V0RUJpbmRpbmdPdXRwdXQoKSk7Ci0JCQkgIGxpc3QuYWRkQWxsKG9wLmdldEVCaW5kaW5nRmF1bHRzKCkpOwotCQkgIH0JICAKLQkgIH0KLQkgIAotCSAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByaXZhdGUgT2JqZWN0IGdldEdlbmVyaWNCaW5kaW5nT2JqZWN0UGFyZW50KE9iamVjdCBnZW5lcmljQmluZGluZ09iamVjdCkgewotCSAgT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JICAKLQkgIGlmIChnZW5lcmljQmluZGluZ09iamVjdCAhPSBudWxsKSB7Ci0JCSAgaWYgKGdlbmVyaWNCaW5kaW5nT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbikgewotCQkJICBwYXJlbnQgPSAoKEJpbmRpbmdPcGVyYXRpb24pIGdlbmVyaWNCaW5kaW5nT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoZ2VuZXJpY0JpbmRpbmdPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpIHsKLQkJCSAgcGFyZW50ID0gKChCaW5kaW5nSW5wdXQpIGdlbmVyaWNCaW5kaW5nT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoZ2VuZXJpY0JpbmRpbmdPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KSB7Ci0JCQkgIHBhcmVudCA9ICgoQmluZGluZ091dHB1dCkgZ2VuZXJpY0JpbmRpbmdPYmplY3QpLmdldENvbnRhaW5lcigpOwotCQkgIH0KLQkJICBlbHNlIGlmIChnZW5lcmljQmluZGluZ09iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgewotCQkJICBwYXJlbnQgPSAoKEJpbmRpbmdGYXVsdCkgZ2VuZXJpY0JpbmRpbmdPYmplY3QpLmdldENvbnRhaW5lcigpOwotCQkgIH0JICAKLQkgIH0KLQkgIAotCSAgcmV0dXJuIHBhcmVudDsJICAKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHJlbW92ZUV4dGVuc2ViaWxpdHlFbGVtZW50cyhMaXN0IG9yaWdpbmFsTGlzdCwgTGlzdCByZW1vdmVMaXN0KSB7Ci0JICBJdGVyYXRvciByZW1vdmVJdCA9IHJlbW92ZUxpc3QuaXRlcmF0b3IoKTsKLQkgIHdoaWxlIChyZW1vdmVJdC5oYXNOZXh0KCkpIHsKLQkJICBvcmlnaW5hbExpc3QucmVtb3ZlKHJlbW92ZUl0Lm5leHQoKSk7Ci0JICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JICByZXR1cm4gIkhUVFAiOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQWRkcmVzc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEFkZHJlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2UwMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQQWRkcmVzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbXBsLkhUVFBBZGRyZXNzSW1wbCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUEFkZHJlc3NJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSFRUUEFkZHJlc3MgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvblVSSSA9IExPQ0FUSU9OX1VSSV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQQWRkcmVzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUEFkZHJlc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJJKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIG5ld0xvY2F0aW9uVVJJKSB7Ci0JCVN0cmluZyBvbGRMb2NhdGlvblVSSSA9IGxvY2F0aW9uVVJJOwotCQlsb2NhdGlvblVSSSA9IG5ld0xvY2F0aW9uVVJJOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSwgb2xkTG9jYXRpb25VUkksIGxvY2F0aW9uVVJJKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb25VUkkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0JCQkJc2V0TG9jYXRpb25VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0JCQkJc2V0TG9jYXRpb25VUkkoTE9DQVRJT05fVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9BRERSRVNTX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTU19fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLQkJCQlyZXR1cm4gTE9DQVRJT05fVVJJX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvblVSSSAhPSBudWxsIDogIUxPQ0FUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMobG9jYXRpb25VUkkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb25VUkk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2F0aW9uVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldExvY2F0aW9uVVJJCi0gICAgICAoSFRUUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIEhUVFBDb25zdGFudHMuTE9DQVRJT05fVVJJX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBBZGRyZXNzX0xvY2F0aW9uVVJJKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxIVFRQQ29uc3RhbnRzLkxPQ0FUSU9OX1VSSV9BVFRSSUJVVEUsZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotICB7Ci0gICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpCi0gICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShIVFRQQ29uc3RhbnRzLkhUVFBfTkFNRVNQQUNFX1VSSSwgSFRUUENvbnN0YW50cy5BRERSRVNTX0VMRU1FTlRfVEFHKTsKLSAgICByZXR1cm4gZWxlbWVudFR5cGU7Ci0gIH0KLX0gLy9IVFRQQWRkcmVzc0ltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEJpbmRpbmdJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBCaW5kaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzdmMDc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUEJpbmRpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQQmluZGluZ0ltcGwjZ2V0VmVyYiA8ZW0+VmVyYjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBCaW5kaW5nSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhUVFBCaW5kaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyYigpIDxlbT5WZXJiPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJiKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJCX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcmIoKSA8ZW0+VmVyYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJiID0gVkVSQl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQQmluZGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUEJpbmRpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcmIoKSB7Ci0JCXJldHVybiB2ZXJiOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcmIoU3RyaW5nIG5ld1ZlcmIpIHsKLQkJU3RyaW5nIG9sZFZlcmIgPSB2ZXJiOwotCQl2ZXJiID0gbmV3VmVyYjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCLCBvbGRWZXJiLCB2ZXJiKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX1ZFUkI6Ci0JCQkJcmV0dXJuIGdldFZlcmIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCOgotCQkJCXNldFZlcmIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCOgotCQkJCXNldFZlcmIoVkVSQl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQklORElOR19fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkdfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HX19WRVJCOgotCQkJCXJldHVybiBWRVJCX0VERUZBVUxUID09IG51bGwgPyB2ZXJiICE9IG51bGwgOiAhVkVSQl9FREVGQVVMVC5lcXVhbHModmVyYik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJiOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJiKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgCXNldFZlcmIKLSAgICAgIChIVFRQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgSFRUUENvbnN0YW50cy5WRVJCX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBCaW5kaW5nX1ZlcmIoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LEhUVFBDb25zdGFudHMuVkVSQl9BVFRSSUJVVEUsZ2V0VmVyYigpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotICB7Ci0gICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpCi0gICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShIVFRQQ29uc3RhbnRzLkhUVFBfTkFNRVNQQUNFX1VSSSwgSFRUUENvbnN0YW50cy5CSU5ESU5HX0VMRU1FTlRfVEFHKTsKLSAgICByZXR1cm4gZWxlbWVudFR5cGU7Ci0gIH0KLSAgCi19IC8vSFRUUEJpbmRpbmdJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxZTk3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybEVuY29kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBIVFRQRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX0JJTkRJTkc6IHJldHVybiBjcmVhdGVIVFRQQmluZGluZygpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTjogcmV0dXJuIGNyZWF0ZUhUVFBPcGVyYXRpb24oKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlQ6IHJldHVybiBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRDogcmV0dXJuIGNyZWF0ZUhUVFBVcmxFbmNvZGVkKCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTUzogcmV0dXJuIGNyZWF0ZUhUVFBBZGRyZXNzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUEJpbmRpbmcgY3JlYXRlSFRUUEJpbmRpbmcoKSB7Ci0JCUhUVFBCaW5kaW5nSW1wbCBodHRwQmluZGluZyA9IG5ldyBIVFRQQmluZGluZ0ltcGwoKTsKLQkJcmV0dXJuIGh0dHBCaW5kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQT3BlcmF0aW9uIGNyZWF0ZUhUVFBPcGVyYXRpb24oKSB7Ci0JCUhUVFBPcGVyYXRpb25JbXBsIGh0dHBPcGVyYXRpb24gPSBuZXcgSFRUUE9wZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGh0dHBPcGVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBVcmxSZXBsYWNlbWVudCBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnQoKSB7Ci0JCUhUVFBVcmxSZXBsYWNlbWVudEltcGwgaHR0cFVybFJlcGxhY2VtZW50ID0gbmV3IEhUVFBVcmxSZXBsYWNlbWVudEltcGwoKTsKLQkJcmV0dXJuIGh0dHBVcmxSZXBsYWNlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUFVybEVuY29kZWQgY3JlYXRlSFRUUFVybEVuY29kZWQoKSB7Ci0JCUhUVFBVcmxFbmNvZGVkSW1wbCBodHRwVXJsRW5jb2RlZCA9IG5ldyBIVFRQVXJsRW5jb2RlZEltcGwoKTsKLQkJcmV0dXJuIGh0dHBVcmxFbmNvZGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQQWRkcmVzcyBjcmVhdGVIVFRQQWRkcmVzcygpIHsKLQkJSFRUUEFkZHJlc3NJbXBsIGh0dHBBZGRyZXNzID0gbmV3IEhUVFBBZGRyZXNzSW1wbCgpOwotCQlyZXR1cm4gaHR0cEFkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBQYWNrYWdlIGdldEhUVFBQYWNrYWdlKCkgewotCQlyZXR1cm4gKEhUVFBQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUVFBQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotfSAvL0hUVFBGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQT3BlcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQT3BlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjEwMDlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUE9wZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW1wbC5IVFRQT3BlcmF0aW9uSW1wbCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUE9wZXJhdGlvbkltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBIVFRQT3BlcmF0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb25VUkkgPSBMT0NBVElPTl9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUE9wZXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUE9wZXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKSB7Ci0JCXJldHVybiBsb2NhdGlvblVSSTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgbmV3TG9jYXRpb25VUkkpIHsKLQkJU3RyaW5nIG9sZExvY2F0aW9uVVJJID0gbG9jYXRpb25VUkk7Ci0JCWxvY2F0aW9uVVJJID0gbmV3TG9jYXRpb25VUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkksIG9sZExvY2F0aW9uVVJJLCBsb2NhdGlvblVSSSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotCQkJCXJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJOgotCQkJCXJldHVybiBnZXRMb2NhdGlvblVSSSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkk6Ci0JCQkJc2V0TG9jYXRpb25VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJOgotCQkJCXNldExvY2F0aW9uVVJJKExPQ0FUSU9OX1VSSV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTl9fTE9DQVRJT05fVVJJOgotCQkJCXJldHVybiBMT0NBVElPTl9VUklfRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uVVJJICE9IG51bGwgOiAhTE9DQVRJT05fVVJJX0VERUZBVUxULmVxdWFscyhsb2NhdGlvblVSSSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2NhdGlvblVSSTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9jYXRpb25VUkkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAJc2V0TG9jYXRpb25VUkkKLSAgICAgIChIVFRQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgSFRUUENvbnN0YW50cy5MT0NBVElPTl9VUklfQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUE9wZXJhdGlvbl9Mb2NhdGlvblVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsSFRUUENvbnN0YW50cy5MT0NBVElPTl9VUklfQVRUUklCVVRFLGdldExvY2F0aW9uVVJJKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoSFRUUENvbnN0YW50cy5IVFRQX05BTUVTUEFDRV9VUkksIEhUVFBDb25zdGFudHMuT1BFUkFUSU9OX0VMRU1FTlRfVEFHKTsKLSAgICByZXR1cm4gZWxlbWVudFR5cGU7Ci0gIH0KLSAgCi19IC8vSFRUUE9wZXJhdGlvbkltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFhZGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUGFja2FnZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSFRUUFBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBCaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBVcmxFbmNvZGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGh0dHBBZGRyZXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlodHRwQWRkcmVzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpaHR0cEJpbmRpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaWh0dHBPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaWh0dHBVcmxFbmNvZGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBIVFRQUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIEhUVFBGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUVFBQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChIVFRQUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoSFRUUFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZS4KLQkJSFRUUFBhY2thZ2VJbXBsIHRoZUhUVFBQYWNrYWdlID0gKEhUVFBQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgSFRUUFBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJWFNEUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdTRExQYWNrYWdlSW1wbCB0aGVXU0RMUGFja2FnZSA9IChXU0RMUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChXU0RMUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KFdTRExQYWNrYWdlLmVOU19VUkkpIDogV1NETFBhY2thZ2VJbXBsLmVJTlNUQU5DRSk7Ci0KLQkJLy8gU3RlcCAxOiBjcmVhdGUgbWV0YS1tb2RlbCBvYmplY3RzCi0JCXRoZUhUVFBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXU0RMUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBTdGVwIDI6IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uCi0JCXRoZUhUVFBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV1NETFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCXJldHVybiB0aGVIVFRQUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhUVFBCaW5kaW5nKCkgewotCQlyZXR1cm4gaHR0cEJpbmRpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SFRUUEJpbmRpbmdfVmVyYigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWh0dHBCaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRIVFRQT3BlcmF0aW9uKCkgewotCQlyZXR1cm4gaHR0cE9wZXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRIVFRQT3BlcmF0aW9uX0xvY2F0aW9uVVJJKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaHR0cE9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SFRUUFVybFJlcGxhY2VtZW50KCkgewotCQlyZXR1cm4gaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SFRUUFVybEVuY29kZWQoKSB7Ci0JCXJldHVybiBodHRwVXJsRW5jb2RlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEhUVFBBZGRyZXNzKCkgewotCQlyZXR1cm4gaHR0cEFkZHJlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SFRUUEFkZHJlc3NfTG9jYXRpb25VUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlodHRwQWRkcmVzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUhUVFBBZGRyZXNzKCkgewotCQlyZXR1cm4gaWh0dHBBZGRyZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUhUVFBCaW5kaW5nKCkgewotCQlyZXR1cm4gaWh0dHBCaW5kaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUhUVFBPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBpaHR0cE9wZXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElIVFRQVXJsRW5jb2RlZCgpIHsKLQkJcmV0dXJuIGlodHRwVXJsRW5jb2RlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElIVFRQVXJsUmVwbGFjZW1lbnQoKSB7Ci0JCXJldHVybiBpaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBIVFRQRmFjdG9yeSBnZXRIVFRQRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChIVFRQRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlodHRwQmluZGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIVFRQX0JJTkRJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGh0dHBCaW5kaW5nRUNsYXNzLCBIVFRQX0JJTkRJTkdfX1ZFUkIpOwotCi0JCWh0dHBPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9PUEVSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGh0dHBPcGVyYXRpb25FQ2xhc3MsIEhUVFBfT1BFUkFUSU9OX19MT0NBVElPTl9VUkkpOwotCi0JCWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhIVFRQX1VSTF9SRVBMQUNFTUVOVCk7Ci0KLQkJaHR0cFVybEVuY29kZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9VUkxfRU5DT0RFRCk7Ci0KLQkJaHR0cEFkZHJlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSFRUUF9BRERSRVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShodHRwQWRkcmVzc0VDbGFzcywgSFRUUF9BRERSRVNTX19MT0NBVElPTl9VUkkpOwotCi0JCWlodHRwQWRkcmVzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSFRUUF9BRERSRVNTKTsKLQotCQlpaHR0cEJpbmRpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfQklORElORyk7Ci0KLQkJaWh0dHBPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfT1BFUkFUSU9OKTsKLQotCQlpaHR0cFVybEVuY29kZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfVVJMX0VOQ09ERUQpOwotCi0JCWlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUhUVFBfVVJMX1JFUExBQ0VNRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJV1NETFBhY2thZ2VJbXBsIHRoZVdTRExQYWNrYWdlID0gKFdTRExQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXU0RMUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWh0dHBCaW5kaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQlodHRwQmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQQmluZGluZygpKTsKLQkJaHR0cE9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJaHR0cE9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQT3BlcmF0aW9uKCkpOwotCQlodHRwVXJsUmVwbGFjZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQVXJsUmVwbGFjZW1lbnQoKSk7Ci0JCWh0dHBVcmxFbmNvZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQlodHRwVXJsRW5jb2RlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElIVFRQVXJsRW5jb2RlZCgpKTsKLQkJaHR0cEFkZHJlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCWh0dHBBZGRyZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUhUVFBBZGRyZXNzKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoaHR0cEJpbmRpbmdFQ2xhc3MsIEhUVFBCaW5kaW5nLmNsYXNzLCAiSFRUUEJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIVFRQQmluZGluZ19WZXJiKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJiIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotCQlpbml0RUNsYXNzKGh0dHBPcGVyYXRpb25FQ2xhc3MsIEhUVFBPcGVyYXRpb24uY2xhc3MsICJIVFRQT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SFRUUE9wZXJhdGlvbl9Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCWluaXRFQ2xhc3MoaHR0cFVybFJlcGxhY2VtZW50RUNsYXNzLCBIVFRQVXJsUmVwbGFjZW1lbnQuY2xhc3MsICJIVFRQVXJsUmVwbGFjZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaHR0cFVybEVuY29kZWRFQ2xhc3MsIEhUVFBVcmxFbmNvZGVkLmNsYXNzLCAiSFRUUFVybEVuY29kZWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaHR0cEFkZHJlc3NFQ2xhc3MsIEhUVFBBZGRyZXNzLmNsYXNzLCAiSFRUUEFkZHJlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIVFRQQWRkcmVzc19Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBBZGRyZXNzRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcy5jbGFzcywgIklIVFRQQWRkcmVzcyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBCaW5kaW5nRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZy5jbGFzcywgIklIVFRQQmluZGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBPcGVyYXRpb25FQ2xhc3MsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24uY2xhc3MsICJJSFRUUE9wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBVcmxFbmNvZGVkRUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZC5jbGFzcywgIklIVFRQVXJsRW5jb2RlZCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCWluaXRFQ2xhc3MoaWh0dHBVcmxSZXBsYWNlbWVudEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50LmNsYXNzLCAiSUhUVFBVcmxSZXBsYWNlbWVudCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci19IC8vSFRUUFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxFbmNvZGVkSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvaW1wbC9IVFRQVXJsRW5jb2RlZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0YTk5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxFbmNvZGVkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VcmwgRW5jb2RlZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEhUVFBVcmxFbmNvZGVkSW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhUVFBVcmxFbmNvZGVkIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSFRUUFVybEVuY29kZWRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSFRUUFBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBVcmxFbmNvZGVkKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfRU5DT0RFRF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9FTkNPREVEX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERURfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0JICB7Ci0JICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotCSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKEhUVFBDb25zdGFudHMuSFRUUF9OQU1FU1BBQ0VfVVJJLCBIVFRQQ29uc3RhbnRzLlVSTF9FTkNPREVEX0VMRU1FTlRfVEFHKTsKLQkgICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotCSAgfQotCSAgCi19IC8vSFRUUFVybEVuY29kZWRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC9pbXBsL0hUVFBVcmxSZXBsYWNlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFVybFJlcGxhY2VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzczMWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL2ltcGwvSFRUUFVybFJlcGxhY2VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsUmVwbGFjZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXJsIFJlcGxhY2VtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFVybFJlcGxhY2VtZW50SW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEhUVFBVcmxSZXBsYWNlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhUVFBVcmxSZXBsYWNlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBIVFRQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SFRUUFVybFJlcGxhY2VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9VUkxfUkVQTEFDRU1FTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0JCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX1JFUExBQ0VNRU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotCSAgewotCSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLQkgICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShIVFRQQ29uc3RhbnRzLkhUVFBfTkFNRVNQQUNFX1VSSSwgSFRUUENvbnN0YW50cy5VUkxfUkVQTEFDRU1FTlRfRUxFTUVOVF9UQUcpOwotCSAgICByZXR1cm4gZWxlbWVudFR5cGU7Ci0JICB9Ci0JICAKLX0gLy9IVFRQVXJsUmVwbGFjZW1lbnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtaHR0cC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL2h0dHAvaW50ZXJuYWwvdXRpbC9IVFRQQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NDgxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIVFRQQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEhUVFBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSFRUUEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IEhUVFBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBIVFRQU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEhUVFBTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQQmluZGluZyhIVFRQQmluZGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUEJpbmRpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQT3BlcmF0aW9uKEhUVFBPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUhUVFBPcGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQVXJsUmVwbGFjZW1lbnQoSFRUUFVybFJlcGxhY2VtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQVXJsRW5jb2RlZChIVFRQVXJsRW5jb2RlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUFVybEVuY29kZWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQQWRkcmVzcyhIVFRQQWRkcmVzcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSFRUUEFkZHJlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUEFkZHJlc3MoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEFkZHJlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlIVFRQQWRkcmVzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQQmluZGluZyhqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQmluZGluZyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUhUVFBCaW5kaW5nQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUhUVFBPcGVyYXRpb24oamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUhUVFBPcGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUFVybEVuY29kZWQoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybEVuY29kZWQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlIVFRQVXJsRW5jb2RlZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQVXJsUmVwbGFjZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJSFRUUFVybFJlcGxhY2VtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBCaW5kaW5nIDxlbT5CaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQmluZGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIVFRQQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUE9wZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIVFRQT3BlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IDxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVIVFRQVXJsUmVwbGFjZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZCA8ZW0+VXJsIEVuY29kZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBVcmxFbmNvZGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBVcmxFbmNvZGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEFkZHJlc3MgPGVtPkFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBBZGRyZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhUVFBBZGRyZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcyA8ZW0+SUhUVFAgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQQWRkcmVzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSFRUUEFkZHJlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nIDxlbT5JSFRUUCBCaW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBCaW5kaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlIVFRQQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUE9wZXJhdGlvbiA8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBPcGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUhUVFBPcGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxFbmNvZGVkIDxlbT5JSFRUUCBVcmwgRW5jb2RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSFRUUFVybEVuY29kZWRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudCA8ZW0+SUhUVFAgVXJsIFJlcGxhY2VtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBVcmxSZXBsYWNlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSFRUUFVybFJlcGxhY2VtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vSFRUUEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjQ2YTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBIVFRQQ29uc3RhbnRzIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTX0VMRU1FTlRfVEFHID0gImFkZHJlc3MiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX0VMRU1FTlRfVEFHID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT05fRUxFTUVOVF9UQUcgPSAib3BlcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VOQ09ERURfRUxFTUVOVF9UQUcgPSAidXJsRW5jb2RlZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9SRVBMQUNFTUVOVF9FTEVNRU5UX1RBRyA9ICJ1cmxSZXBsYWNlbWVudCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0FUVFJJQlVURSA9ImxvY2F0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSQl9BVFRSSUJVVEUgPSJ2ZXJiIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgOiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjk2MmQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEhUVFBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgaW1wbGVtZW50cyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLXsKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBpZiAoSFRUUENvbnN0YW50cy5IVFRQX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgaWYgKEhUVFBDb25zdGFudHMuQUREUkVTU19FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQQWRkcmVzcygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoSFRUUENvbnN0YW50cy5CSU5ESU5HX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gSFRUUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhUVFBCaW5kaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLk9QRVJBVElPTl9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEhUVFBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIVFRQT3BlcmF0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChIVFRQQ29uc3RhbnRzLlVSTF9FTkNPREVEX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUFVybEVuY29kZWQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEhUVFBDb25zdGFudHMuVVJMX1JFUExBQ0VNRU5UX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBIVFRQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSFRUUFVybFJlcGxhY2VtZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJVbmhhbmRsZWQgbG9jYWxOYW1lOiAiICsgbG9jYWxOYW1lKTsKLSAgICAgICAgcmV0dXJuIFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJVbmhhbmRsZWQgbmFtZXNwYWNlOiAiICsgbmFtZXNwYWNlKTsKLSAgICAgIHJldHVybiBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1odHRwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvaHR0cC9pbnRlcm5hbC91dGlsL0hUVFBTd2l0Y2guamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQwM2YyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLWh0dHAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9odHRwL2ludGVybmFsL3V0aWwvSFRUUFN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5odHRwLkhUVFBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQVXJsRW5jb2RlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuaHR0cC5IVFRQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSFRUUFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBIVFRQUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhUVFBTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSFRUUFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgSFRUUFBhY2thZ2UuSFRUUF9CSU5ESU5HOiB7Ci0JCQkJCUhUVFBCaW5kaW5nIGh0dHBCaW5kaW5nID0gKEhUVFBCaW5kaW5nKXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSFRUUEJpbmRpbmcoaHR0cEJpbmRpbmcpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwQmluZGluZyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlIVFRQQmluZGluZyhodHRwQmluZGluZyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGh0dHBCaW5kaW5nKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBCaW5kaW5nKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX09QRVJBVElPTjogewotCQkJCQlIVFRQT3BlcmF0aW9uIGh0dHBPcGVyYXRpb24gPSAoSFRUUE9wZXJhdGlvbil0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBPcGVyYXRpb24oaHR0cE9wZXJhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBPcGVyYXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSFRUUE9wZXJhdGlvbihodHRwT3BlcmF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoaHR0cE9wZXJhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwT3BlcmF0aW9uKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBIVFRQUGFja2FnZS5IVFRQX1VSTF9SRVBMQUNFTUVOVDogewotCQkJCQlIVFRQVXJsUmVwbGFjZW1lbnQgaHR0cFVybFJlcGxhY2VtZW50ID0gKEhUVFBVcmxSZXBsYWNlbWVudCl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBVcmxSZXBsYWNlbWVudChodHRwVXJsUmVwbGFjZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwVXJsUmVwbGFjZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSFRUUFVybFJlcGxhY2VtZW50KGh0dHBVcmxSZXBsYWNlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGh0dHBVcmxSZXBsYWNlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwVXJsUmVwbGFjZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfVVJMX0VOQ09ERUQ6IHsKLQkJCQkJSFRUUFVybEVuY29kZWQgaHR0cFVybEVuY29kZWQgPSAoSFRUUFVybEVuY29kZWQpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VIVFRQVXJsRW5jb2RlZChodHRwVXJsRW5jb2RlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KGh0dHBVcmxFbmNvZGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUhUVFBVcmxFbmNvZGVkKGh0dHBVcmxFbmNvZGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoaHR0cFVybEVuY29kZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cFVybEVuY29kZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIEhUVFBQYWNrYWdlLkhUVFBfQUREUkVTUzogewotCQkJCQlIVFRQQWRkcmVzcyBodHRwQWRkcmVzcyA9IChIVFRQQWRkcmVzcyl0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUhUVFBBZGRyZXNzKGh0dHBBZGRyZXNzKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoaHR0cEFkZHJlc3MpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSFRUUEFkZHJlc3MoaHR0cEFkZHJlc3MpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChodHRwQWRkcmVzcyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChodHRwQWRkcmVzcyk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSFRUUEJpbmRpbmcoSFRUUEJpbmRpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQT3BlcmF0aW9uKEhUVFBPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIFJlcGxhY2VtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQVXJsUmVwbGFjZW1lbnQoSFRUUFVybFJlcGxhY2VtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIEVuY29kZWQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBVcmxFbmNvZGVkKEhUVFBVcmxFbmNvZGVkIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRkcmVzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VIVFRQQWRkcmVzcyhIVFRQQWRkcmVzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIEFkZHJlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUhUVFBBZGRyZXNzKGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLkhUVFBBZGRyZXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgQmluZGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBCaW5kaW5nPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUEJpbmRpbmcoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUEJpbmRpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBPcGVyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgT3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJSFRUUE9wZXJhdGlvbihqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQT3BlcmF0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUhUVFAgVXJsIEVuY29kZWQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQVXJsRW5jb2RlZChqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cC5IVFRQVXJsRW5jb2RlZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklIVFRQIFVybCBSZXBsYWNlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSFRUUCBVcmwgUmVwbGFjZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlIVFRQVXJsUmVwbGFjZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAuSFRUUFVybFJlcGxhY2VtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0hUVFBTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvTUlNRS5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvTUlNRS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwZGM1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL01JTUUuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLm1pbWUvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcubWltZS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLm1pbWUuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmcubWltZSIgbW9kZWxOYW1lPSJNSU1FIiBlZGl0UGx1Z2luQ2xhc3M9IiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0iIiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMvbW9kZWwvWFNELmdlbm1vZGVsIy8veHNkIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXG1pbWUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+VkFCQVNFX1BMVUdJTlNfUEFUSDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1JTUUiIGJhc2VQYWNrYWdlPSJjb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmciIGVjb3JlUGFja2FnZT0ibWltZS5lY29yZSMvIj4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1pbWUuZWNvcmUjLy9MaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL01JTUVDb250ZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1pbWUuZWNvcmUjLy9NSU1FQ29udGVudC9lUGFydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1pbWUuZWNvcmUjLy9NSU1FQ29udGVudC9zZXRQYXJ0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1pbWUuZWNvcmUjLy9NSU1FQ29udGVudC9zZXRQYXJ0L3BhcnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRUNvbnRlbnQvZ2V0UGFydCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vTUlNRVBhcnQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1pbWUuZWNvcmUjLy9NSU1FUGFydC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJtaW1lLmVjb3JlIy8vTUlNRVBhcnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQvZXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRVBhcnQvZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9NSU1FTXVsdGlwYXJ0UmVsYXRlZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1pbWUuZWNvcmUjLy9NSU1FTXVsdGlwYXJ0UmVsYXRlZC9lTUlNRVBhcnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRU11bHRpcGFydFJlbGF0ZWQvYWRkTUlNRVBhcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0ibWltZS5lY29yZSMvL01JTUVNdWx0aXBhcnRSZWxhdGVkL2FkZE1JTUVQYXJ0L21pbWVQYXJ0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0ibWltZS5lY29yZSMvL01JTUVNdWx0aXBhcnRSZWxhdGVkL2dldE1JTUVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vTUlNRU1pbWVYbWwiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1pbWUuZWNvcmUjLy9NSU1FTWltZVhtbC9lUGFydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249Im1pbWUuZWNvcmUjLy9NSU1FTWltZVhtbC9zZXRQYXJ0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9Im1pbWUuZWNvcmUjLy9NSU1FTWltZVhtbC9zZXRQYXJ0L3BhcnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJtaW1lLmVjb3JlIy8vTUlNRU1pbWVYbWwvZ2V0UGFydCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vSU1JTUVQYXJ0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibWltZS5lY29yZSMvL0lNSU1FTXVsdGlwYXJ0UmVsYXRlZCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1pbWUuZWNvcmUjLy9JTUlNRUNvbnRlbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtaW1lLmVjb3JlIy8vSU1JTUVNaW1lWG1sIi8+Ci0gIDwvZ2VuUGFja2FnZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IldTREwiIGJhc2VQYWNrYWdlPSJjb20uaWJtLmV0b29scyIgZWNvcmVQYWNrYWdlPSJ3c2RsLmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1FOYW1lIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL0RPTUVsZW1lbnQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9XU0RMRXhjZXB0aW9uIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRG9jdW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9kb2N1bWVudGF0aW9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9lbGVtZW50Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2dldEVuY2xvc2luZ0RlZmluaXRpb24iLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvc2V0RW5jbG9zaW5nRGVmaW5pdGlvbi9kZWZpbml0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvZU9wZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9zdHlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lT3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZVBhcmFtZXRlck9yZGVyaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL01lc3NhZ2UvZVBhcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9QYXJ0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC90eXBlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZU1lc3NhZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VQb3J0VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZy9lQmluZGluZ09wZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdGYXVsdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1NlcnZpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vU2VydmljZS9lUG9ydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BvcnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9Qb3J0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9yZXF1aXJlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudC9lbGVtZW50VHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vbG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9xTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VuY29kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VNZXNzYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lUG9ydFR5cGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VCaW5kaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lU2VydmljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU5hbWVzcGFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVR5cGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VJbXBvcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0RlZmluaXRpb24vZ2V0RG9jdW1lbnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9zZXREb2N1bWVudC9kb2N1bWVudCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSW1wb3J0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9JbXBvcnQvbG9jYXRpb25VUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9nZXRTY2hlbWEiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9hZGRFeHRlbnNpYmlsaXR5RWxlbWVudC9leHRFbGVtZW50Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbnB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PdXRwdXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRmF1bHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2VJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvZ2V0SW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQvaW5wdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9lT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dC9vdXRwdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9lRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2dldEZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdC9zZXRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0L2ZhdWx0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9OYW1lc3BhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9wcmVmaXgiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0VHlwZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9hZGRPcGVyYXRpb24vb3BlcmF0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vaW5wdXROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9vdXRwdXROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9hZGRGYXVsdC9mYXVsdCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRQYXJhbWV0ZXJPcmRlcmluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldFBhcmFtZXRlck9yZGVyaW5nL3BhcmFtZXRlck9yZGVyIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0SW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRJbnB1dC9pbnB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldE91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQvb3V0cHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSW5wdXQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU91dHB1dCI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPdXRwdXQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPdXRwdXQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRmF1bHQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvZ2V0TWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9hZGRQYXJ0L3BhcnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0T3JkZXJlZFBhcnRzL3BhcnRPcmRlciIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBhcnQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlL3ZhbHVlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lTZXJ2aWNlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvYWRkUG9ydC9wb3J0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2dldFBvcnQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9nZXRCaW5kaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0L3NldEJpbmRpbmcvYmluZGluZyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmciPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9hZGRCaW5kaW5nT3BlcmF0aW9uL2JpbmRpbmdPcGVyYXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9uYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9pbnB1dE5hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL291dHB1dE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbnMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0UG9ydFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlL3BvcnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vYWRkQmluZGluZ0ZhdWx0L2JpbmRpbmdGYXVsdCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0T3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uL29wZXJhdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nSW5wdXQvYmluZGluZ0lucHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ091dHB1dC9iaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0lucHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nRmF1bHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkQmluZGluZy9iaW5kaW5nIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0L2ltcG9ydERlZiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UvcHJlZml4Ii8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL25hbWVzcGFjZVVSSSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUvcG9ydFR5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkU2VydmljZS9zZXJ2aWNlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ091dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlSW1wb3J0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUlucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlT3BlcmF0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU91dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQYXJ0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydFR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlU2VydmljZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5nL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZ3MiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlL3ByZWZpeCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeC9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEV4dGVuc2lvblJlZ2lzdHJ5Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeS9leHRlbnNpb25SZWdpc3RyeSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXREb2N1bWVudEJhc2VVUkkiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkvZG9jdW1lbnRCYXNlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVR5cGVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVNlcnZpY2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVCaW5kaW5nL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlUG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlTWVzc2FnZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFR5cGVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcy90eXBlcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUltcG9ydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTGlzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lVUkwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUV4dGVuc2lvblJlZ2lzdHJ5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1R5cGVzIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJdGVyYXRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVHlwZXMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L3BhcmVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvY2hpbGRyZW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50L3NjaGVtYSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL2VNZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5NSU1FLmNhdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5ncy5NSU1FLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3ZjkyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuTUlNRS5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDIKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAibWltZSIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIHF1aWQgICAgICAgCSIzQUM5MTI3QzAyNjYiCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3MgIk1JTUVDb250ZW50IgotCSAgICBxdWlkICAgICAgIAkiM0FDOTEzNUIwM0E3IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjExQ0EwMzhFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FDOTE5NzEwMzZCIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiTUlNRVBhcnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUM5MTNFRTAwRUIiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUVGMTE0MDAyNTkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUU4QjFBQjAxNUQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJNSU1FTXVsdGlwYXJ0UmVsYXRlZCIKLQkgICAgcXVpZCAgICAgICAJIjNBQzkxM0ZBMDI1QiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRUYxMUQ1MDMzMCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiTUlNRU1pbWVYbWwiCi0JICAgIHF1aWQgICAgICAgCSIzQUM5MTQ1QTAxRkYiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUVGMTFERDAzOEIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JICAgIHF1aWQgICAgICAgCSIzQUU3M0IzQzAzNTYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFNzNCM0QwMDkwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRUNvbnRlbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3IikKLQkJKG9iamVjdCBSb2xlICJwYXJ0IgotCQkgICAgcXVpZCAgICAgICAJIjNBRTczQjNEMDA5QSIKLQkJICAgIGxhYmVsICAgICAgCSJwYXJ0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBxdWlkICAgICAgIAkiM0FFNzNCQjkwMEQ1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwYXJ0IgotCQkgICAgcXVpZCAgICAgICAJIjNBRTczQkI5MDNDRSIKLQkJICAgIGxhYmVsICAgICAgCSJwYXJ0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUU3M0JCOTAzRTIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTQ1QTAxRkYiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCIKLQkgICAgcXVpZCAgICAgICAJIjNBRUYxMkZFMDM4NyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVGMTMwMDAwRDciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTXVsdGlwYXJ0UmVsYXRlZCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFRjEzMDAwMEUxIgotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRVBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZ3MiCi0JICAgIHF1aWQgICAgICAgCSIzQUM5MTI4QjAxRjkiCi0JICAgIHRpdGxlICAgICAgCSJCaW5kaW5ncyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTU2Ci0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCIgQDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg1NiwgMzM2KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDE3MTQsIDI1NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyODQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNSU1FQ29udGVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3IgotCQkgICAgd2lkdGggICAgICAJMzAyCi0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUwNCwgNzg0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDEzNTQsIDU1NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQYXJ0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCSAgICB3aWR0aCAgICAgIAkzMTgKLQkJICAgIGhlaWdodCAgICAgCTQ4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcyMiwgNTA1KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTczQjNDMDM1NiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMyNiwgLTcyNykKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0IzRDAwOTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDMKLQkJCSAgICBzdXBwbGllciAgIAlAMQotCQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJ0IiBANQotCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJICAgIGxvY2F0aW9uICAgCSgtMzI2LCAtNzI3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYKLQkJCQlQYXJlbnRfVmlldyAJQDUKLQkJCQlsb2NhdGlvbiAgIAkoMTc0MCwgNTA4KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTk2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFydCIKLQkJCQlwY3REaXN0ICAgIAktMC4wOTc5MzQKLQkJCQloZWlnaHQgICAgIAkxNgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRTczQjNEMDA5QSIKLQkJCSAgICBjbGllbnQgICAgIAlAMwotCQkJICAgIHN1cHBsaWVyICAgCUAyCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcKLQkJCQlQYXJlbnRfVmlldyAJQDUKLQkJCQlsb2NhdGlvbiAgIAkoMTczNCwgNTY5KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNDQ5MTAzCi0JCQkJaGVpZ2h0ICAgICAJNDkKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIgQDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxNiwgMzIwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOAotCQkJbG9jYXRpb24gICAJKDEwNjEsIDI2OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNSU1FTWltZVhtbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FDOTE0NUEwMUZGIgotCQkgICAgd2lkdGggICAgICAJMzI4Ci0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAOQotCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDQ2MykKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0JCOTAwRDUiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcnQiIEAxMAotCQkJICAgIFBhcmVudF9WaWV3IAlAOQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTg0LCAtMTE4NSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQotCQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMSwgNDc5KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTk2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFydCIKLQkJCQlwY3REaXN0ICAgIAkwLjE3Nzk0MQotCQkJCWhlaWdodCAgICAgCTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUU3M0JCOTAzQ0UiCi0JCQkgICAgY2xpZW50ICAgICAJQDkKLQkJCSAgICBzdXBwbGllciAgIAlAMgotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMgotCQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCQlsb2NhdGlvbiAgIAkoMTI3MiwgNTU0KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNjUyMjcwCi0JCQkJaGVpZ2h0ICAgICAJNzYKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE4NCwgLTExODUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFNzNCQjkwM0UyIgotCQkJICAgIGNsaWVudCAgICAgCUA5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDgKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU11bHRpcGFydFJlbGF0ZWQiIEAxNAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDMyMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0Ci0JCQlsb2NhdGlvbiAgIAkoMzEyLCAyNjkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTUlNRU11bHRpcGFydFJlbGF0ZWQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxM0ZBMDI1QiIKLQkJICAgIHdpZHRoICAgICAgCTQ1MAotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IiBAMTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTI4LCA4NDgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDM4MCwgNzY3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1JTUVQYXJ0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNFRTAwRUIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDM4MCwgODI3KQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMzAzKQotCQkgICAgd2lkdGggICAgICAJMzE0Ci0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0IiBAMTYKLQkJICAgIGxvY2F0aW9uICAgCSg1MjgsIDU2OCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTJGRTAzODciCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAxNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYKLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgLTEzNikKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTMwMDAwRDciCi0JCQkgICAgY2xpZW50ICAgICAJQDE2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE0Ci0JCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVsZW1lbnRzIiBAMTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE2Ci0JCQkgICAgbG9jYXRpb24gICAJKDAsIC0xMzYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkKLQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJbG9jYXRpb24gICAJKDUzNSwgNjI3KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnRzIgotCQkJCXBjdERpc3QgICAgCTAuMzIwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRUYxMzAwMDBFMSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTYKLQkJCSAgICBzdXBwbGllciAgIAlAMTUKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAKLQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJbG9jYXRpb24gICAJKDQ3MSwgNzE2KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuNzk0MTE4Ci0JCQkJaGVpZ2h0ICAgICAJNTgKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQotCQkJCVBhcmVudF9WaWV3IAlAMTgKLQkJCQlsb2NhdGlvbiAgIAkoNjM2LCA3MzQpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAkxMDgKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFeHRlbnNpYmlsaXR5IgotCSAgICBxdWlkICAgICAgIAkiM0FFNzNBQTMwMzJFIgotCSAgICB0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDAwLCAxNzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMgotCQkJbG9jYXRpb24gICAJKDEzOCwgNDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTI0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJICAgIHdpZHRoICAgICAgCTU0MgotCQkgICAgaGVpZ2h0ICAgICAJMjkyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NCwgMTkyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlpdGFsaWNzICAgIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjMKLQkJCWxvY2F0aW9uICAgCSgxMTE1LCA4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ1OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCSAgICB3aWR0aCAgICAgIAk0NzYKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiIgQDI0Ci0JCSAgICBsb2NhdGlvbiAgIAkoODg4LCAxODMpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIiIEAyNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTM2LCAyMykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNgotCQkJCVBhcmVudF9WaWV3IAlAMjUKLQkJCQlsb2NhdGlvbiAgIAkoNzE0LCAyMjIpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkgICAgY2xpZW50ICAgICAJQDI0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIyCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJCWxvY2F0aW9uICAgCSg2OTQsIDIzMykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJICAgIGxvY2F0aW9uICAgCSg1MzYsIDIzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5Ci0JCQkJUGFyZW50X1ZpZXcgCUAyOAotCQkJCWxvY2F0aW9uICAgCSg5OTYsIDIyNSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NTcKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCXBjdERpc3QgICAgCTAuNTAxNTM4Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDI0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDIzCi0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwCi0JCQkJUGFyZW50X1ZpZXcgCUAyOAotCQkJCWxvY2F0aW9uICAgCSgxMDY5LCAxMzIpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44Mjk2MzAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNaW1lWG1sIiBAMzEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTUwNCwgNzg0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzEKLQkJCWxvY2F0aW9uICAgCSgxMzQ5LCA3MzMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzEwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTUlNRU1pbWVYbWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiIKLQkJICAgIHdpZHRoICAgICAgCTMyOAotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIiBAMzIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0OCwgNjA4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzIKLQkJCWxvY2F0aW9uICAgCSgxMDMyLCA1NTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDMyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTUlNRU11bHRpcGFydFJlbGF0ZWQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBQzkxM0ZBMDI1QiIKLQkJICAgIHdpZHRoICAgICAgCTQ1MAotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IiBAMzMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDAwLCA3NTIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzMwotCQkJbG9jYXRpb24gICAJKDI5NSwgNzAwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIxMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1JTUVQYXJ0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTNFRTAwRUIiCi0JCSAgICB3aWR0aCAgICAgIAkyMjgKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTE0MDAyNTkiCi0JCSAgICBjbGllbnQgICAgIAlAMzMKLQkJICAgIHN1cHBsaWVyICAgCUAyMgotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCIgQDM1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3MjgsIDk3NikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM1Ci0JCQlsb2NhdGlvbiAgIAkoMTU4NywgOTI0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI4MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1JTUVDb250ZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUM5MTM1QjAzQTciCi0JCSAgICB3aWR0aCAgICAgIAkzMDAKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM2Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NCwgNTQ5KQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUAyMwotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTM0NCwgNTQ5KQotCQkJKDEzNDQsIDM4OCkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRUYxMUREMDM4QiIKLQkJICAgIGNsaWVudCAgICAgCUAzMQotCQkgICAgc3VwcGxpZXIgICAJQDIzCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDEsIDcyMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTQxLCA1NDkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzNikKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzgKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUVGMTFENTAzMzAiCi0JCSAgICBjbGllbnQgICAgIAlAMzIKLQkJICAgIHN1cHBsaWVyICAgCUAyMwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzQ3LCA1NDUpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM0NywgNTQ5KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzYpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFRjExQ0EwMzhFIgotCQkgICAgY2xpZW50ICAgICAJQDM1Ci0JCSAgICBzdXBwbGllciAgIAlAMjMKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcyMiwgOTEyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3MjIsIDU0OSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDM2KSkpKSkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvbWltZS5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvbWltZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3YmZhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL21vZGVsL21pbWUuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtaW1lIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL01JTUUiIG5zUHJlZml4PSJtaW1lIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNSU1FQ29udGVudCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JTUlNRUNvbnRlbnQiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRQYXJ0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UGFydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQYXJ0IiBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzZGwuZWNvcmUjLy9QYXJ0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1JTUVQYXJ0IiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50ICMvL0lNSU1FUGFydCI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJleHRlbnNpYmlsaXR5RWxlbWVudCIgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2RsLmVjb3JlIy8vSUV4dGVuc2liaWxpdHlFbGVtZW50Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBlVHlwZT0iIy8vTGlzdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNSU1FTXVsdGlwYXJ0UmVsYXRlZCIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCAjLy9JTUlNRU11bHRpcGFydFJlbGF0ZWQiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRNSU1FUGFydCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWltZVBhcnQiIGVUeXBlPSIjLy9JTUlNRVBhcnQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNSU1FUGFydHMiIGVUeXBlPSIjLy9MaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVNSU1FUGFydCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NSU1FUGFydCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTUlNRU1pbWVYbWwiIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQgIy8vSU1JTUVNaW1lWG1sIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0UGFydCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBhcnQiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NkbC5lY29yZSMvL1BhcnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1JTUVQYXJ0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1JTUVNdWx0aXBhcnRSZWxhdGVkIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1JTUVDb250ZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU1JTUVNaW1lWG1sIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGlzdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0Ii8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9tb2RlbC9taW1lLm1kbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvbW9kZWwvbWltZS5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNzZhNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9tb2RlbC9taW1lLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOTk4ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQyCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlUUlVFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzFFIgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0FDOTEwNTIwMDFCIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjNBQzkxMDUxMDMxRCIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjNBQzkxMDUxMDMxRiIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJtaW1lIgotCQlxdWlkICAgICAgIAkiM0FDOTEyN0MwMjY2IgotCQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzcyAiTUlNRUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0FDOTEzNUIwM0E3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRUYxMUNBMDM4RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSI0MEExMDZBMzAxNjgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6SU1JTUVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSI0MEExMDVFMDAxQ0MiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFydCIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTA2NkYwMDIzIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnQiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkidm9pZCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNjdEMDJDQyIKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNBQzkxOTcxMDM2QiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJNSU1FUGFydCIKLQkJCXF1aWQgICAgICAgCSIzQUM5MTNFRTAwRUIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiNDBBMEZERUYwMzIyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwMkNEMDE3NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRVBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjQwQTEwMjVEMDFBNiIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiNDBBMTA0NjQwMUEyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikpCi0JCQkJcmVzdWx0ICAgICAJInZvaWQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNDg0MDI3QiIKLQkJCQlyZXN1bHQgICAgIAkiTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTUlNRU11bHRpcGFydFJlbGF0ZWQiCi0JCQlxdWlkICAgICAgIAkiM0FDOTEzRkEwMjVCIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRUYxMUQ1MDMzMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSI0MEExMDNBRDAzMUMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6SU1JTUVNdWx0aXBhcnRSZWxhdGVkIgotCQkJCXF1aWR1ICAgICAgCSI0MEExMDMzQjAwREQiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkTUlNRVBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwM0Y2MDE3MiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtaW1lUGFydCIKLQkJCQkJdHlwZSAgICAgICAJIklNSU1FUGFydCIpKQotCQkJCXJlc3VsdCAgICAgCSJ2b2lkIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TUlNRVBhcnRzIgotCQkJCXF1aWQgICAgICAgCSI0MEExMDQwMzAzOEQiCi0JCQkJcmVzdWx0ICAgICAJIkxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1JTUVNaW1lWG1sIgotCQkJcXVpZCAgICAgICAJIjNBQzkxNDVBMDFGRiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUVGMTFERDAzOEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiNDBBMTA3NDcwMzRFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FTWltZVhtbCIKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA2RUYwMDhCIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjQwQTEwNkQ0MDFFQiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0IgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJInZvaWQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSI0MEExMDZFMTAwOTUiCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1JTUVQYXJ0IgotCQkJcXVpZCAgICAgICAJIjQwQTEwMjVEMDFBNiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IgotCQkJCXF1aWQgICAgICAgCSI0MEExMDI5RDAzRDkiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1JTUVNdWx0aXBhcnRSZWxhdGVkIgotCQkJcXVpZCAgICAgICAJIjQwQTEwMzNCMDBERCIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIgotCQkJCXF1aWQgICAgICAgCSI0MEExMDM3ODAxOEYiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1JTUVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjQwQTEwNUUwMDFDQyIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IgotCQkJCXF1aWQgICAgICAgCSI0MEExMDVGNTAyMjYiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1JTUVNaW1lWG1sIgotCQkJcXVpZCAgICAgICAJIjQwQTEwNkVGMDA4QiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIgotCQkJCXF1aWQgICAgICAgCSI0MEExMDcxRTAzQjQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTGlzdCIKLQkJCXF1aWQgICAgICAgCSI0MEExMEJGQTAxMDkiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0IgotCQkJCXF1aWQgICAgICAgCSI0MEExMEMwOTAyQTYiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkJCXF1aWQgICAgICAgCSIzQUU3M0IzQzAzNTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEiCi0JCQkJcXVpZCAgICAgICAJIjNBRTczQjNEMDA5MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3IikKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQUU3M0IzRDAwOUEiCi0JCQkJbGFiZWwgICAgICAJImVQYXJ0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCQkJcXVpZCAgICAgICAJIjNBRTczQkI5MDBENSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNBRTczQkI5MDNDRSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzIgotCQkJCXF1aWQgICAgICAgCSIzQUU3M0JCOTAzRTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU1pbWVYbWwiCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiCi0JCQlxdWlkICAgICAgIAkiM0FFRjEyRkUwMzg3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1IgotCQkJCXF1aWQgICAgICAgCSIzQUVGMTMwMDAwRDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU11bHRpcGFydFJlbGF0ZWQiCi0JCQkJcXVpZHUgICAgICAJIjNBQzkxM0ZBMDI1QiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTUlNRVBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNBRUYxMzAwMDBFMSIKLQkJCQlsYWJlbCAgICAgIAkiZU1JTUVQYXJ0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNFRTAwRUIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZ3MiCi0JCQlxdWlkICAgICAgIAkiM0FDOTEyOEIwMUY5IgotCQkJdGl0bGUgICAgICAJIkJpbmRpbmdzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCIgQDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDg0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDcxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTUlNRUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTM1QjAzQTciCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCA3NzcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyKQotCQkJCXdpZHRoICAgICAgCTMwMgotCQkJCWhlaWdodCAgICAgCTI4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTUxLCAxMTUwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCWhlaWdodCAgICAgCTEyNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMwotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMDY0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTczQjNDMDM1NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMSIgQDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAzCi0JCQkJCWxvY2F0aW9uICAgCSgtNDE2LCAtMTY4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTczQjNEMDA5MCIKLQkJCQkJY2xpZW50ICAgICAJQDMKLQkJCQkJc3VwcGxpZXIgICAJQDEKLQkJCQkJbGluZV9zdHlsZSAJMCkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBhcnQiIEA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMwotCQkJCQlsb2NhdGlvbiAgIAkoLTQxNiwgLTE2OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgMTEwMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFydCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTM5MzI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTczQjNEMDA5QSIKLQkJCQkJY2xpZW50ICAgICAJQDMKLQkJCQkJc3VwcGxpZXIgICAJQDIKLQkJCQkJbGluZV9zdHlsZSAJMAotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDkxMDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNaW1lWG1sIiBAOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTUwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NzgsIDEzOTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzA4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVNaW1lWG1sIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FDOTE0NUEwMUZGIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ3OCwgMTQ1OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMDYpCi0JCQkJd2lkdGggICAgICAJMzI2Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA5Ci0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEzMjMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFNzNCQjkwMEQ1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFydCIgQDEwCi0JCQkJCVBhcmVudF9WaWV3IAlAOQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAtMzI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDYsIDEyOTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4OTU4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUU3M0JCOTAzQ0UiCi0JCQkJCWNsaWVudCAgICAgCUA5Ci0JCQkJCXN1cHBsaWVyICAgCUAyCi0JCQkJCWxpbmVfc3R5bGUgCTAKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzA4LCAxMjg0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTIyNzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTc2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMiIEAxMwotCQkJCQlQYXJlbnRfVmlldyAJQDkKLQkJCQkJbG9jYXRpb24gICAJKDE0NCwgLTMyNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUU3M0JCOTAzRTIiCi0JCQkJCWNsaWVudCAgICAgCUA5Ci0JCQkJCXN1cHBsaWVyICAgCUA4Ci0JCQkJCWxpbmVfc3R5bGUgCTApKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVNdWx0aXBhcnRSZWxhdGVkIiBAMTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU2MCwgNTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDM0MSwgNDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FTXVsdGlwYXJ0UmVsYXRlZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQzkxM0ZBMDI1QiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNDEsIDU0NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQpCi0JCQkJd2lkdGggICAgICAJNDU2Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FUGFydCIgQDE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1NjAsIDEwNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjk2LCA5MzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzRUUwMEVCIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI5NiwgOTk0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNSkKLQkJCQl3aWR0aCAgICAgIAk1NDYKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDE2Ci0JCQkJbG9jYXRpb24gICAJKDU2MCwgODE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUYxMkZFMDM4NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTYKLQkJCQkJbG9jYXRpb24gICAJKDMyLCAxMTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFRjEzMDAwMEQ3IgotCQkJCQljbGllbnQgICAgIAlAMTYKLQkJCQkJc3VwcGxpZXIgICAJQDE0Ci0JCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNSU1FUGFydCIgQDE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTYKLQkJCQkJbG9jYXRpb24gICAJKDMyLCAxMTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ0LCA4OTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1JTUVQYXJ0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFRjEzMDAwMEUxIgotCQkJCQljbGllbnQgICAgIAlAMTYKLQkJCQkJc3VwcGxpZXIgICAJQDE1Ci0JCQkJCWxpbmVfc3R5bGUgCTAKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDMsIDg5OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk0MTE4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzY0LCA4OTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTQwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTk3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FUGFydCIgQDIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDcyMCwgMTQ1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDUsIDE0MjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTAzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTUlNRVBhcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNSwgMTM3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDI1RDAxQTYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1LCAxNDgyKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwMjgpCi0JCQkJd2lkdGggICAgICAJMTA0OAotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTAyQ0QwMTc1IgotCQkJCWNsaWVudCAgICAgCUAxNQotCQkJCXN1cHBsaWVyICAgCUAyMgotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpJTUlNRU11bHRpcGFydFJlbGF0ZWQiIEAyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDE3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDMsIDE0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklNSU1FTXVsdGlwYXJ0UmVsYXRlZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCA5MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDMzQjAwREQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzLCAyMDIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTI0NykKLQkJCQl3aWR0aCAgICAgIAkxMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDNBRDAzMUMiCi0JCQkJY2xpZW50ICAgICAJQDE0Ci0JCQkJc3VwcGxpZXIgICAJQDI0Ci0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FQ29udGVudCIgQDI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDQzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg0LCAzOTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTA5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTUlNRUNvbnRlbnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwODQsIDM0OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMDk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDVFMDAxQ0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4NCwgNDU4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEwOTQpCi0JCQkJd2lkdGggICAgICAJMTExNAotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTA2QTMwMTY4IgotCQkJCWNsaWVudCAgICAgCUAxCi0JCQkJc3VwcGxpZXIgICAJQDI2Ci0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6OklNSU1FTWltZVhtbCIgQDI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MTYsIDE5MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1NSwgMTg3MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklNSU1FTWltZVhtbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1NSwgMTgyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSI0MEExMDZFRjAwOEIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1NSwgMTkzMCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTE5KQotCQkJCXdpZHRoICAgICAgCTExNDAKLQkJCQloZWlnaHQgICAgIAkxOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjQwQTEwNzQ3MDM0RSIKLQkJCQljbGllbnQgICAgIAlAOAotCQkJCXN1cHBsaWVyICAgCUAyOAotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpMaXN0IiBAMzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTc2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDE3MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkxpc3QiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTY1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiNDBBMTBCRkEwMTA5IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTc2MSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1NDEpCi0JCQkJd2lkdGggICAgICAJNTYyCi0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJFeHRlbnNpYmlsaXR5IgotCQkJcXVpZCAgICAgICAJIjNBRTczQUEzMDMyRSIKLQkJCXRpdGxlICAgICAgCSJFeHRlbnNpYmlsaXR5IgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NywgODcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NywgMTk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYpCi0JCQkJd2lkdGggICAgICAJNDc2Ci0JCQkJaGVpZ2h0ICAgICAJMjM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FTWltZVhtbCIgQDMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCA3NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3NCwgNjQ2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNSU1FTWltZVhtbCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBQzkxNDVBMDFGRiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTc0LCA3MDYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA2KQotCQkJCXdpZHRoICAgICAgCTMyNgotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6bWltZTo6TUlNRU11bHRpcGFydFJlbGF0ZWQiIEAzMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzUyLCAxMTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMywgMTAzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTUlNRU11bHRpcGFydFJlbGF0ZWQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNGQTAyNUIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMzLCAxMDkwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNCkKLQkJCQl3aWR0aCAgICAgIAk0NTYKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Om1pbWU6Ok1JTUVQYXJ0IiBAMzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDY2MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTUlNRVBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUM5MTNFRTAwRUIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDAsIDcyMikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk1MjUpCi0JCQkJd2lkdGggICAgICAJNTQ2Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjptaW1lOjpNSU1FQ29udGVudCIgQDM1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3OTIsIDc1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjUwLCA2NDYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjg0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1JTUVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FDOTEzNUIwM0E3IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTAsIDcwNikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMDYpCi0JCQkJd2lkdGggICAgICAJMzAyCi0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM2Ci0JCQkJbG9jYXRpb24gICAJKDk3NiwgNTI2KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTc2LCA1MjYpCi0JCQkJICAgICg5NzYsIDMwOSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFRjExREQwMzhCIgotCQkJCWNsaWVudCAgICAgCUAzMgotCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDYzNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NiwgNTI2KQotCQkJCWRyYXdTdXBwbGllciAJQDM2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFRjExRDUwMzMwIgotCQkJCWNsaWVudCAgICAgCUAzMwotCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg0NCwgMTAxOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQ0LCA1MjYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVGMTFDQTAzOEUiCi0JCQkJY2xpZW50ICAgICAJQDM1Ci0JCQkJc3VwcGxpZXIgICAJQDMxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3OCwgNjM0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc4LCA1MjYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSI0MEEwRkRFRjAzMjIiCi0JCQkJY2xpZW50ICAgICAJQDM0Ci0JCQkJc3VwcGxpZXIgICAJQDMxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCA2NTApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgNTI2KQotCQkJCWRyYXdTdXBwbGllciAJQDM2KSkpKSkKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCIKLQkJcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSIKLQkJZG9jdW1lbnRhdGlvbiAJCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuCi18Ci18V1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50LgotfAotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuCi18Ci18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkKLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQotfC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETAotfC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLgotfAotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLgotCQkKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiCi0JCQkJcmVzdWx0ICAgICAJIkRlZmluaXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENEZEMDFCQSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiCi0JCQkJdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTIwMDExQiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDA1NTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODdDMDFGRSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRDIwMjI2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNEIwMkIwIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ1NDIwMEYxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODk3RTIzMDIzNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDA5MjAyRjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUM0Q0IwMTk5IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNlcnZpY2UiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRDNTAxRTIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQ1MDJDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFdTREwgYWxsb3dzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxNDkwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0FGOTU0M0MwMDczIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I4NUIyMUEwMjcxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRjgwMzgyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiIKLQkJCQlyZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXREb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50IgotCQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkltcG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIFdTREwgaW1wb3J0IGVsZW1lbnQuIFdTREwgYWxsb3dzIGFzc29jaWF0aW5nIGEgbmFtZXNwYWNlIHdpdGggYSBkb2N1bWVudCBsb2NhdGlvbiB1c2luZyBhbiBpbXBvcnQgZWxlbWVudC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUVFNTgwMzdBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzNzkiCi0JCQkJcmVzdWx0ICAgICAJIlhTRFNjaGVtYSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzk3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSIKLQkJCQkJdHlwZSAgICAgICAJIlhTRFNjaGVtYSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MEEwMDM2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUxNDAyMTEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0RWxlbWVudCIKLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QzUwNDAyNUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MEMwMzVCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIGlucHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTFCMDExMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNBNDAyMDMiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNCNTAzQTIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzFFQTAyMEUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ091dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU0MzAyQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0YxMDMyNiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiIKLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJRTmFtZSIKLQkJCXF1aWQgICAgICAgCSIzQUU4RUQyMjAxNDAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIgotCQkJcXVpZCAgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBuYW1lc3BhY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZSBwcmVmaXggdXNlZCBpbiBhIFdTREwgZG9jdW1lbnQuIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDI5MDFCMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDMyMDIzNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb25UeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiIKLQkJCWRvY3VtZW50YXRpb24gCQotfE9ORV9XQVk9MQotfFJFUVVFU1RfUkVTUE9OU0U9MgotfFNPTElDSVRfUkVTUE9OU0U9MwotfE5PVElGSUNBVElPTj00Ci0JCQkKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzM1MzAzRTMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNCODRBNUJFMDMzMSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTYzMjAwMEQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3NzYwMEQxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlck9yZGVyIgotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTRFNTAxOEQiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJDNDAxMDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRTQwMDk0IgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTc5OTAxMkIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLklucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDNBMDM1RCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ0NTAxQzgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODM5MDFENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NkEwMEJEIgotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTg3MTAyMDgiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNZXNzYWdlIgotCQkJcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0IgotCQkJCQl0eXBlICAgICAgIAkiSVBhcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjNEMDIzMyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjU0MDI1RSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNjEwMjBEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnRPcmRlciIKLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUGFydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODQ1MDA1MiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCWV4Y2VwdGlvbnMgCSJXU0RMRXhjZXB0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTAxMDFDMyIKLQkJCQlyZXN1bHQgICAgIAkiSUl0ZXJhdG9yIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEyRDAyRDUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIlFOYW1lIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NTAwMjMxIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJU2VydmljZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUI0OTAyODciCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCNUIwMDNFIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjE2MDE1MyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjUwMDA2NiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RkE0MDFDNSIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQTkwMjg0IgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQkUwMUE4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUJDRjAzMDIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRBREMwMDA3MiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0ZhdWx0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyIKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MDkwMERBIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUxRDAwN0YiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0lucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdJbnB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MzQwMzQ5IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRENCMDIxQyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ091dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUyRDAwNTAiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFNEYwMEJEIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTVGMDAyQSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5FbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTM1MDNEMSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxRDkwMTQyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OEYxMDM5RCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEltcG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImltcG9ydERlZiIKLQkJCQkJdHlwZSAgICAgICAJIklJbXBvcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTZFMDA1RSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5ODQwMDRCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlDNTAwNDUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUU0MDFFRSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIgotCQkJCQl0eXBlICAgICAgIAkiSVNlcnZpY2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3IgotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyIKLQkJCQlyZXN1bHQgICAgIAkiSUltcG9ydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUlucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCIKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIgotCQkJCXJlc3VsdCAgICAgCSJJUGFydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1IgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQcmVmaXgiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIgotCQkJCXJlc3VsdCAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudEJhc2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUZFMDIwOCIKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDYxODAzMjgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnRCYXNlIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwNTYwMDgwIgotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwQkEwMzU1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBEODAyOUEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwNkYwMzFCIgotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIgotCQkJCQl0eXBlICAgICAgIAkiSVR5cGVzIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFFNzAyQTEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUxpc3QiCi0JCQlxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMEFGMDI5NyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1hcCIKLQkJCXF1aWQgICAgICAgCSIzQjg5NkIwMzAwRDQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QjExMDJCNSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVVSTCIKLQkJCXF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5uZXQuVVJMIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpb25SZWdpc3RyeSIKLQkJCXF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU5RjAyRTgiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJdGVyYXRvciIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkl0ZXJhdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODgwODAwQjkiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iCi0JCQlxdWlkICAgICAgIAkiM0M0Njg5NjUwMzEzIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4OTc0MDMxNSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuVHlwZXMgbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYyN0YwMEI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0QxNTAyQzAyM0IiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiCi0JCQlxdWlkICAgICAgIAkiM0Y2NzcxREIwMkRDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNzYyQTZBMDMwOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQcm90ZWN0ZWQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJwb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIgotCQkJCWxhYmVsICAgICAgCSJwb3J0VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQ0QiCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciCi0JCQlxdWlkICAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA2MSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5IgotCQkJcXVpZCAgICAgICAJIjNBRDVEMzUyMDEwRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTgwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIgotCQkJcXVpZCAgICAgICAJIjNBRDVEM0UxMDE3OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ09wZXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIgotCQkJcXVpZCAgICAgICAJIjNBRDVENDI1MDM4QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkZGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1IgotCQkJcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3IgotCQkJcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjcxMDEwNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM0QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjc3MDA5NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5ncyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjdCMDMxMSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJCWxhYmVsICAgICAgCSJlU2VydmljZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3IgotCQkJcXVpZCAgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCWxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSIKLQkJCXF1aWQgICAgICAgCSIzQURGMkU2NDAxRjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MSIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMSIKLQkJCXF1aWQgICAgICAgCSIzQURGMkVCMzAxNjMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0MiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMiIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMyIKLQkJCXF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTlBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM1IgotCQkJcXVpZCAgICAgICAJIjNBREYyRkI4MDJGOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBBIgotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM2IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzciCi0JCQlxdWlkICAgICAgIAkiM0FERjMzMTYwMUE0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODciCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzgiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOSIKLQkJCXF1aWQgICAgICAgCSIzQURGMzQwMDAzRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUEiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nRmF1bHRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MSIKLQkJCXF1aWQgICAgICAgCSIzQUUwOTFGNDAyRjMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZFIgotCQkJCWxhYmVsICAgICAgCSJlRmF1bHQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDIiCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQzIgotCQkJcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDQiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVOYW1lc3BhY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiCi0JCQkJbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ1IgotCQkJcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCQlsYWJlbCAgICAgIAkiZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDciCi0JCQlxdWlkICAgICAgIAkiM0FFQTQxMkYwMDM1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ4IgotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNDAwQkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTAiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIgotCQkJcXVpZCAgICAgICAJIjNCODRBRDc5MDBGMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTREIgotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTRFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUzIgotCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU1IgotCQkJcXVpZCAgICAgICAJIjNCOEIxQzEyMDNCMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NiIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU3IgotCQkJcXVpZCAgICAgICAJIjNCOEIxRENDMDJFNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjcwIgotCQkJCWxhYmVsICAgICAgCSJlU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU4IgotCQkJCXF1aWQgICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1OSIKLQkJCXF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIgotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlVHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZVR5cGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIgotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MSIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5MzAzRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjIiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MyIKLQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJbGFiZWwgICAgICAJImVJbXBvcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NSIKLQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY2IgotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjciCi0JCQlxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY4IgotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjkiCi0JCQlxdWlkICAgICAgIAkiM0Y3ODk2QTIwMjZFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCQlsYWJlbCAgICAgIAkicGFyZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjaGlsZHJlbiIKLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJCWxhYmVsICAgICAgCSJjaGlsZHJlbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiCi0JCQlxdWlkICAgICAgIAkiMzlBRDNFRjYwMTI3IgotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyIKLQkJCXpvb20gICAgICAgCTkwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDQxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDY2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA3MTUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcxKQotCQkJCXdpZHRoICAgICAgCTUyMAotCQkJCWhlaWdodCAgICAgCTQwNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiIEA0MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNDgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI4MDAzMjYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA1MzYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc1KQotCQkJCXdpZHRoICAgICAgCTI3OAotCQkJCWhlaWdodCAgICAgCTIxOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEA0MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJU2VydmljZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDE0NSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMzcpCi0JCQkJd2lkdGggICAgICAJMjQ2Ci0JCQkJaGVpZ2h0ICAgICAJMjY0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBANDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAzODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDQ0NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJMzAyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCQkJY2xpZW50ICAgICAJQDQ0Ci0JCQkJc3VwcGxpZXIgICAJQDQzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQwLCAzNzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA0NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTI2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQ0LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDQsIDExODApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTMwMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCWNsaWVudCAgICAgCUA0NgotCQkJCXN1cHBsaWVyICAgCUA0MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzAsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzAsIDEwMDIpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDQ4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzUsIDg0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzUsIDg5NSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpCi0JCQkJd2lkdGggICAgICAJMzAwCi0JCQkJaGVpZ2h0ICAgICAJMTY4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0NTAyQzkiCi0JCQkJY2xpZW50ICAgICAJQDQ4Ci0JCQkJc3VwcGxpZXIgICAJQDQyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODA5LCA4MjgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgwOSwgNjM3KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEA1MAotCQkJCWxvY2F0aW9uICAgCSgzNDMsIDkxNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0cyIgQDUxCi0JCQkJCVBhcmVudF9WaWV3IAlANTAKLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MTMsIDk0NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxODk3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyIKLQkJCQkJY2xpZW50ICAgICAJQDUwCi0JCQkJCXN1cHBsaWVyICAgCUA0OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDkxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzksIDg4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwODAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgOTkwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMjg0NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTc0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBANTUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMSwgNjQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNiwgNzQ0KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxRCIKLQkJCQkJY2xpZW50ICAgICAJQDUwCi0JCQkJCXN1cHBsaWVyICAgCUA0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNDMsIDkxNikKLQkJCQkJICAgICgyNTcsIDkxNikKLQkJCQkJICAgICgyNTcsIDY3OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NywgNjc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMSwgNzk2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzcwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEA1OAotCQkJCWxvY2F0aW9uICAgCSg4ODYsIDEyNzApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjgwMTFGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZyIgQDU5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTgKLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExMiwgMTIzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQ4NTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjREIgotCQkJCQljbGllbnQgICAgIAlANTgKLQkJCQkJc3VwcGxpZXIgICAJQDQ2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgiIEA2MgotCQkJCQlQYXJlbnRfVmlldyAJQDU4Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3OTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCQljbGllbnQgICAgIAlANTgKLQkJCQkJc3VwcGxpZXIgICAJQDQ4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDg4NiwgMTI3MCkKLQkJCQkJICAgICg4MTIsIDEyNzApCi0JCQkJCSAgICAoODEyLCA5OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEyLCA5OTYpKSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjUgQmluZGluZ3MiCi0JCQlxdWlkICAgICAgIAkiMzlBRDUxMjcwMjUyIgotCQkJdGl0bGUgICAgICAJIjIuNSBCaW5kaW5ncyIKLQkJCXpvb20gICAgICAgCTg1Ci0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxMTQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgNjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE3MikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzEpCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMzc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIgQDY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMzUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgMTMwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCA4MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBREMwMDA3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDE4OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJOQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTYpCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJNTY4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IiBANjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIDEzMzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nSW5wdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMjg0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIgotCQkJCXdpZHRoICAgICAgCTI3OAotCQkJCWhlaWdodCAgICAgCTE3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiIEA2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTY2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTYzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxLCAxNTg4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFMjEwMTExIgotCQkJCXdpZHRoICAgICAgCTMxMgotCQkJCWhlaWdodCAgICAgCTE3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIgQDY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MiwgMTk1OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdGYXVsdCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5MDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiCi0JCQkJd2lkdGggICAgICAJMjkwCi0JCQkJaGVpZ2h0ICAgICAJMTc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OCwgNDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCA1NDQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTY5MQotCQkJCWhlaWdodCAgICAgCTMwMQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiIEA3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTM2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxMjgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxNjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE1ODcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk91dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTcsIDUzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NywgNTk3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk0MzIKLQkJCQloZWlnaHQgICAgIAkzMjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSIKLQkJCQljbGllbnQgICAgIAlANzIKLQkJCQlzdXBwbGllciAgIAlANjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzksIDUyNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc5LCA0MjgpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBANzQKLQkJCQlsb2NhdGlvbiAgIAkoMTAzOSwgNzQyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMzUyMDEwRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlIiBANzUKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NAotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0OSwgNzgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MjkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTQwMTc2IgotCQkJCQljbGllbnQgICAgIAlANzQKLQkJCQkJc3VwcGxpZXIgICAJQDY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU5LCA3NDIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MiwgNzE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIxOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwIiBANzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NAotCQkJCQlsb2NhdGlvbiAgIAkoNTc1LCA1OTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc2LCA2OTcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwOTQ0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE4MCIKLQkJCQkJY2xpZW50ICAgICAJQDc0Ci0JCQkJCXN1cHBsaWVyICAgCUA3MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzOSwgNzQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCA3NDIpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEA4MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcyLCA4NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcyLCA5MDkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTYKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ2KQotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTM3MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDYyNCwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzYsIDEyODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzYsIDEzNDEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDgyCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjQwMEJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA4MwotCQkJCQlQYXJlbnRfVmlldyAJQDgyCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDEzMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzUxNDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODMiCi0JCQkJCWNsaWVudCAgICAgCUA4MgotCQkJCQlzdXBwbGllciAgIAlANzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxMzU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4OTU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTAiIEA4NgotCQkJCQlQYXJlbnRfVmlldyAJQDgyCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCQkJY2xpZW50ICAgICAJQDgyCi0JCQkJCXN1cHBsaWVyICAgCUA4MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEA4NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAxNjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxMiwgMTUzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTIsIDE1OTcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MSIgQDg4Ci0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBAODkKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDUsIDE2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc0NzcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTREIgotCQkJCQljbGllbnQgICAgIAlAODgKLQkJCQkJc3VwcGxpZXIgICAJQDcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTAyNzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUyIiBAOTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSIKLQkJCQkJY2xpZW50ICAgICAJQDg4Ci0JCQkJCXN1cHBsaWVyICAgCUA4NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDE2NTQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAOTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTAwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTksIDkzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTksIDk4OSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpCi0JCQkJd2lkdGggICAgICAJMzY0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFNDAxREMiCi0JCQkJY2xpZW50ICAgICAJQDkzCi0JCQkJc3VwcGxpZXIgICAJQDY1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2NiwgNjM2KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEA5NQotCQkJCWxvY2F0aW9uICAgCSg0NTcsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTEwMTc5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMiIgQDk2Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM1LCA5MjApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQzRTIwMjI1IgotCQkJCQljbGllbnQgICAgIAlAOTUKLQkJCQkJc3VwcGxpZXIgICAJQDcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ1NywgMTAyMikKLQkJCQkJICAgICgyNzYsIDEwMjIpCi0JCQkJCSAgICAoMjc2LCA4NDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDU3LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc2LCA4NDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMwLCA4ODQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdPcGVyYXRpb25zIiBAOTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NQotCQkJCQlsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCA5NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTE2OTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMzkiCi0JCQkJCWNsaWVudCAgICAgCUA5NQotCQkJCQlzdXBwbGllciAgIAlAOTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMCwgMTAyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY5LCA5ODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4NDk1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MTQsIDEwNjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyNzU2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDEwMwotCQkJCWxvY2F0aW9uICAgCSgxNDE4LCAxMDQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVENDI1MDM4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbiIgQDEwNAotCQkJCQlQYXJlbnRfVmlldyAJQDEwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMCwgMTA3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA2MDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDMKLQkJCQkJc3VwcGxpZXIgICAJQDgwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODksIDEwMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NjcyMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxMDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDMKLQkJCQkJbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzMsIDEwNzApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NTQyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVENDI2MDJGRiIKLQkJCQkJY2xpZW50ICAgICAJQDEwMwotCQkJCQlzdXBwbGllciAgIAlAOTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTgsIDEwNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTc0LCAxMDQwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOSIgQDEwOQotCQkJCWxvY2F0aW9uICAgCSg3ODcsIDExOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjQwMUY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0lucHV0IiBAMTEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzgxLCA0NTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjksIDExNTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdJbnB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTExOTA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUxIgotCQkJCQljbGllbnQgICAgIAlAMTA5Ci0JCQkJCXN1cHBsaWVyICAgCUA4MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODcsIDExOTApCi0JCQkJCSAgICAoNjM2LCAxMTkwKQotCQkJCQkgICAgKDYzNiwgMTI3MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODcsIDExOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzYsIDEyNzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2ODUsIDEyMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0MDQ3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxMTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkKLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg4NSwgMTE0NCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDkKLQkJCQkJc3VwcGxpZXIgICAJQDkzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc4NywgMTE5MCkKLQkJCQkJICAgICg5MjYsIDExOTApCi0JCQkJCSAgICAoOTI2LCAxMDk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNiwgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MSwgMTEzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzU4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTE2Ci0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ091dHB1dCIgQDExNwotCQkJCQlQYXJlbnRfVmlldyAJQDExNgotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgNTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxMiwgMTQyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMwNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ091dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQ1MDgyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNDIgotCQkJCQljbGllbnQgICAgIAlAMTE2Ci0JCQkJCXN1cHBsaWVyICAgCUA4NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgMTMxMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDE1MjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NjcsIDE0NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3NDU5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzIiIEAxMjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4MywgMTE0MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0QiCi0JCQkJCWNsaWVudCAgICAgCUAxMTYKLQkJCQkJc3VwcGxpZXIgICAJQDkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzEsIDExODYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MDE2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDEyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyMCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3MiwgMTkwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEAxMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDE4NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTkxNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMjc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNzEwMzMzIgotCQkJCWNsaWVudCAgICAgCUAxMjQKLQkJCQlzdXBwbGllciAgIAlANjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjAzLCAyMDA3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOSIgQDEyNgotCQkJCWxvY2F0aW9uICAgCSgxMzU2LCAxMzUyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYzNDAwMDNFNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEAxMjcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjYKLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MiwgMTc1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0ZhdWx0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAzMTUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDEwM0FBIgotCQkJCQljbGllbnQgICAgIAlAMTI2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCAxODQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwOSwgMTc5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjU2LCAxODA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTkyOTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDEzMQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNgotCQkJCQlsb2NhdGlvbiAgIAkoMTg4LCA2MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc2LCAxMTk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNgotCQkJCQlzdXBwbGllciAgIAlAOTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM1NiwgMTM1MikKLQkJCQkJICAgICgxMzU2LCAxMjE3KQotCQkJCQkgICAgKDExMTcsIDEyMTcpCi0JCQkJCSAgICAoMTExNywgMTA5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNywgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4NzAwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MSIgQDEzNAotCQkJCWxvY2F0aW9uICAgCSgxNjQwLCAxOTcwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA5MUY0MDJGMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0IiBAMTM1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc0LCAxOTE1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2NDIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZFIgotCQkJCQljbGllbnQgICAgIAlAMTM0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYzLCAxOTcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDEzOAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNAotCQkJCQlsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRiIKLQkJCQkJY2xpZW50ICAgICAJQDEzNAotCQkJCQlzdXBwbGllciAgIAlAMTI0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjQwLCAxOTcwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUxNywgMTk3MCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMzkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0MzAyQUIiCi0JCQkJY2xpZW50ICAgICAJQDg3Ci0JCQkJc3VwcGxpZXIgICAJQDY3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODAzLCAxNjU2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjQsIDE2NTYpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTFCMDExMyIKLQkJCQljbGllbnQgICAgIAlAODEKLQkJCQlzdXBwbGllciAgIAlANjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjcsIDEzODUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMzMSwgMTM4NSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjQgUG9ydFR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNBRDVEMUM0MDM2NiIKLQkJCXRpdGxlICAgICAgCSIyLjQgUG9ydFR5cGVzIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiIKLQkJCXpvb20gICAgICAgCTgwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiIEAxNDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAyMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMTcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydFR5cGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDEyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBNUJFMDMzMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAyMzMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjk2KQotCQkJCXdpZHRoICAgICAgCTcxOAotCQkJCWhlaWdodCAgICAgCTE5NgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3BlcmF0aW9uIiBAMTQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMTc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg3MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJT3BlcmF0aW9uIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMTI2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg3MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAyMzcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzA5KQotCQkJCXdpZHRoICAgICAgCTg5MQotCQkJCWhlaWdodCAgICAgCTE4OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUlucHV0IiBAMTQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDE0MzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklJbnB1dCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxMzg3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTQ5OCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjEpCi0JCQkJd2lkdGggICAgICAJNjQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTk0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMTc5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklPdXRwdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTcwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE4MTgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2KQotCQkJCXdpZHRoICAgICAgCTY3NAotCQkJCWhlaWdodCAgICAgCTE5NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IiBAMTQ1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIwNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklGYXVsdCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDI2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjEzNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjUpCi0JCQkJd2lkdGggICAgICAJNjQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTk2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE0NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDgwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4LCA2NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTgsIDczMykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpCi0JCQkJd2lkdGggICAgICAJNjk1Ci0JCQkJaGVpZ2h0ICAgICAJMjgxCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxNDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU3NiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA2OTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzMjUsIDc1MykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQpCi0JCQkJd2lkdGggICAgICAJNTIwCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDE0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMTQ5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMTQyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDE1MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJd2lkdGggICAgICAJMjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEAxNTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjE0LCA2MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxNCwgNjgxKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk1Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ0NikKLQkJCQl3aWR0aCAgICAgIAk2OTUKLQkJCQloZWlnaHQgICAgIAkzNTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2IiBAMTUyCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDc5NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNDAxOEMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTUzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUyCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDc0OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzU5NjQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUNEIgotCQkJCQljbGllbnQgICAgIAlAMTUyCi0JCQkJCXN1cHBsaWVyICAgCUAxNTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDUsIDc5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzYsIDg2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwMzkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA5MjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjI0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBvcnRUeXBlIiBAMTU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTUyCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxNTIKLQkJCQkJc3VwcGxpZXIgICAJQDE0NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA3OTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODgsIDc1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUzNDg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ3IiBAMTU5Ci0JCQkJbG9jYXRpb24gICAJKDIxMDcsIDc3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEyRjAwMzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJhbWV0ZXJPcmRlcmluZyIgQDE2MAotCQkJCQlQYXJlbnRfVmlldyAJQDE1OQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NSwgNjQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJCQkJY2xpZW50ICAgICAJQDE1OQotCQkJCQlzdXBwbGllciAgIAlAMTQ3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzE2LCA3NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjcyLCA4MjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NjYxMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3MSwgODg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMDYyMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0OCIgQDE2NAotCQkJCQlQYXJlbnRfVmlldyAJQDE1OQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1RiIKLQkJCQkJY2xpZW50ICAgICAJQDE1OQotCQkJCQlzdXBwbGllciAgIAlAMTUxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCA3NzMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM3IiBAMTY1Ci0JCQkJbG9jYXRpb24gICAJKDE3MDIsIDE1MDQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTYwMUE0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHRzIiBAMTY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3ODk5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODciCi0JCQkJCWNsaWVudCAgICAgCUAxNjUKLQkJCQkJc3VwcGxpZXIgICAJQDE0OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDIwNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDk1ODAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTMsIDE5NjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM4IiBAMTcwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjYxLCAxMDY5KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJCQkJY2xpZW50ICAgICAJQDE2NQotCQkJCQlzdXBwbGllciAgIAlAMTUxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MzYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDE3MwotCQkJCWxvY2F0aW9uICAgCSgxMTc4LCAxMjM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRjk0MDI0RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTc0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTczCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMTM0MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxOTgyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiCi0JCQkJCWNsaWVudCAgICAgCUAxNzMKLQkJCQkJc3VwcGxpZXIgICAJQDE0OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc4LCAxMjM0KQotCQkJCQkgICAgKDk4MCwgMTIzNCkKLQkJCQkJICAgICg5ODAsIDE0MTApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDYsIDEzNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NzY2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEAxNzcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzMKLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNiwgMTAzNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxNzMKLQkJCQkJc3VwcGxpZXIgICAJQDE1MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc4LCAxMjM0KQotCQkJCQkgICAgKDEyNzcsIDEyMzQpCi0JCQkJCSAgICAoMTI3NywgOTYwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc3LCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk3LCAxMDU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY0MTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTgxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEAxODAKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEAxODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxODAKLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDE2NjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwOTA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQSIKLQkJCQkJY2xpZW50ICAgICAJQDE4MAotCQkJCQlzdXBwbGllciAgIAlAMTUwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDE2NzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzYzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzYiIEAxODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxODAKLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjcsIDEwMzcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBCIgotCQkJCQljbGllbnQgICAgIAlAMTgwCi0JCQkJCXN1cHBsaWVyICAgCUAxNTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIzLCAxMDgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTAzNDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxODcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZEODAxOUYiCi0JCQkJY2xpZW50ICAgICAJQDE0NgotCQkJCXN1cHBsaWVyICAgCUAxNDEKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkUyMDE3MSIKLQkJCQljbGllbnQgICAgIAlAMTUxCi0JCQkJc3VwcGxpZXIgICAJQDE0MgotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTg5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkJCWNsaWVudCAgICAgCUAxNDkKLQkJCQlzdXBwbGllciAgIAlAMTQzCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZGODAxQ0QiCi0JCQkJY2xpZW50ICAgICAJQDE1MAotCQkJCXN1cHBsaWVyICAgCUAxNDQKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJCQljbGllbnQgICAgIAlAMTQ4Ci0JCQkJc3VwcGxpZXIgICAJQDE0NQotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyMjQsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzcsIDEzMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzcsIDEzNzMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTU5MwotCQkJCWhlaWdodCAgICAgCTMxMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIiBAMTkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1MjAsIDI1NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDI0NjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2VSZWZlcmVuY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDI1MjcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMykKLQkJCQl3aWR0aCAgICAgIAk2NzIKLQkJCQloZWlnaHQgICAgIAkxODAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxOTQKLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMjI3NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTkzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTI0LCAyMjc1KQotCQkJCSAgICAoMTUyNCwgMjQ1NCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJCQljbGllbnQgICAgIAlAMTQ4Ci0JCQkJc3VwcGxpZXIgICAJQDE5MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzYsIDIxNzYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzYsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJCQljbGllbnQgICAgIAlAMTUwCi0JCQkJc3VwcGxpZXIgICAJQDE5MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNzEsIDE4NTQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE5NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJCQljbGllbnQgICAgIAlAMTQ5Ci0JCQkJc3VwcGxpZXIgICAJQDE5MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MCwgMTUzNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAyMjc1KQotCQkJCWRyYXdTdXBwbGllciAJQDE5NCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjciIEAxOTgKLQkJCQlsb2NhdGlvbiAgIAkoMjIwNiwgMjI1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NDAxQjEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMTk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTk4Ci0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY4LCAxNjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTIyMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkJCQljbGllbnQgICAgIAlAMTk4Ci0JCQkJCXN1cHBsaWVyICAgCUAxOTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2MCwgMTY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2OCIgQDIwMgotCQkJCQlQYXJlbnRfVmlldyAJQDE5OAotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAyMyIKLQkJCQkJY2xpZW50ICAgICAJQDE5OAotCQkJCQlzdXBwbGllciAgIAlAMTkzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIyMDYsIDIyNTkpCi0JCQkJCSAgICAoMjIwNiwgMjU1NikKLQkJCQkJICAgICgxODU2LCAyNTU2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU2LCAyNTU2KSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xIERlZmluaXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNDhBMDI2MiIKLQkJCXRpdGxlICAgICAgCSIyLjEgRGVmaW5pdGlvbnMiCi0JCQl6b29tICAgICAgIAk4MwotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAyMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxOTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDExMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDIyMCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDApCi0JCQkJd2lkdGggICAgICAJNzA2Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDIwNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODYsIDg5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJd2lkdGggICAgICAJMjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTIwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAyMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTEwLCA1NDUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxMCwgNjA0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3OCkKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxODIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAyMDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTEyLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAwLCAxMDU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTAwLCAxMTE1KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMjA3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgwOCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5NiwgMTM2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDE0MTkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTQ0MgotCQkJCWhlaWdodCAgICAgCTI4MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDIwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMjQsIDE2MDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMjQsIDE2NTkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTQ0MgotCQkJCWhlaWdodCAgICAgCTI4MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDIwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCAzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgOTgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTcKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIxKQotCQkJCXdpZHRoICAgICAgCTUyOAotCQkJCWhlaWdodCAgICAgCTQyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OSIgQDIxMAotCQkJCWxvY2F0aW9uICAgCSgxMzU4LCA4NjApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDIxMQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMAotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDUzNSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJCWNsaWVudCAgICAgCUAyMTAKLQkJCQkJc3VwcGxpZXIgICAJQDIwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1OCwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwMywgNTExKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTY2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDIxNAotCQkJCQlQYXJlbnRfVmlldyAJQDIxMAotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODYsIDkwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3OTA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDIxMAotCQkJCQlzdXBwbGllciAgIAlAMjA0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTgsIDg2MCkKLQkJCQkJICAgICgxMzU4LCA5NDgpCi0JCQkJCSAgICAoMTY3NywgOTQ4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDk0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDk4NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkyNjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYzIiBAMjE3Ci0JCQkJbG9jYXRpb24gICAJKDE2MTIsIDU5NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY0IiBAMjE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjE3Ci0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTEyKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQkJY2xpZW50ICAgICAJQDIxNwotCQkJCQlzdXBwbGllciAgIAlAMjA5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTIsIDU5NSkKLQkJCQkJICAgICgxNDY0LCA1OTUpCi0JCQkJCSAgICAoMTQ2NCwgNDUzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjQsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU4NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDIyMQotCQkJCQlQYXJlbnRfVmlldyAJQDIxNwotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTIsIDU1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgwMzM1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCQljbGllbnQgICAgIAlAMjE3Ci0JCQkJCXN1cHBsaWVyICAgCUAyMDUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDEsIDU5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDY1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQxMDA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIyNTk0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOSIgQDIyNQotCQkJCWxvY2F0aW9uICAgCSgxMjc5LCAxMTM3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAiIEAyMjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMjUKLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCQkJY2xpZW50ICAgICAJQDIyNQotCQkJCQlzdXBwbGllciAgIAlAMjA5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3OSwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDQ5NzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDIyOQotCQkJCQlQYXJlbnRfVmlldyAJQDIyNQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJCQljbGllbnQgICAgIAlAMjI1Ci0JCQkJCXN1cHBsaWVyICAgCUAyMDYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI3OSwgMTEzNykKLQkJCQkJICAgICgxMjc5LCAxMjA4KQotCQkJCQkgICAgKDE4OTEsIDEyMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzNDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTcsIDEyNDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDQwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDIzMwotCQkJCWxvY2F0aW9uICAgCSgxMjEyLCAxMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjcxMDEwNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAyMzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMzMKLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDU5NCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNEEiCi0JCQkJCWNsaWVudCAgICAgCUAyMzMKLQkJCQkJc3VwcGxpZXIgICAJQDIwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIzNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYyNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU3OTYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGVzIiBAMjM3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjMzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkxLCAxNDUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyMzY5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCQkJY2xpZW50ICAgICAJQDIzMwotCQkJCQlzdXBwbGllciAgIAlAMjA3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTIsIDExNTkpCi0JCQkJCSAgICAoMTIxMiwgMTQ5MCkKLQkJCQkJICAgICgxNTg3LCAxNDkwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg3LCAxNDkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMywgMTQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI1NjExCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU4NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMiIEAyNDEKLQkJCQlsb2NhdGlvbiAgIAkoMTExNCwgMTU4NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0IiBAMjQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCA2ODApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzcxIgotCQkJCQljbGllbnQgICAgIAlAMjQxCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE0LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTU1LCA3NTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjcwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdzIiBAMjQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjQxCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUxLCAxNjc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5ncyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY2MzQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkJCQljbGllbnQgICAgIAlAMjQxCi0JCQkJCXN1cHBsaWVyICAgCUAyMDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTExNCwgMTU4NSkKLQkJCQkJICAgICgxMTE0LCAxNzE2KQotCQkJCQkgICAgKDIxMTUsIDE3MTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDE3MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDUwNzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTQsIDE3NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMTA3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDI0OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjgsIDE5MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjgsIDE5NzkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTQ0MgotCQkJCWhlaWdodCAgICAgCTI4MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDI1MAotCQkJCWxvY2F0aW9uICAgCSgxMDY2LCAxNTMzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjdCMDMxMSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEAyNTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNTAKLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDI1LCA2NjkpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDdGIgotCQkJCQljbGllbnQgICAgIAlAMjUwCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTA5LCA3NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxOTY5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNlcnZpY2VzIiBAMjU0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjUwCi0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5MywgMjAyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlU2VydmljZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5MTgyNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjdEMDA4OSIKLQkJCQkJY2xpZW50ICAgICAJQDI1MAotCQkJCQlzdXBwbGllciAgIAlAMjQ5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwNjYsIDE1MzMpCi0JCQkJCSAgICAoMTA2NiwgMjA1OSkKLQkJCQkJICAgICgxNjE5LCAyMDU5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE5LCAyMDU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1NCwgMjAzMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQwMTk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTMyLCAyMTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjA1MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFGODAzODIiCi0JCQkJY2xpZW50ICAgICAJQDIwOQotCQkJCXN1cHBsaWVyICAgCUAyMDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY0LCAyNjMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4NSwgMjYzKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4zIEV4dGVuc2liaWxpdHkiCi0JCQlxdWlkICAgICAgIAkiM0FENjBDNTEwMTkyIgotCQkJdGl0bGUgICAgICAJIjIuMS4zIEV4dGVuc2liaWxpdHkiCi0JCQl6b29tICAgICAgIAk4MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDI1OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMTU4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDk0LCAxNTMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCXdpZHRoICAgICAgCTE4MgotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDI2MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDE4ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0ODcsIDE4MzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBAMjYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM0MiwgMTY3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU2VydmljZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQl3aWR0aCAgICAgIAkxODIKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDI2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDIzMzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDIyODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCQl3aWR0aCAgICAgIAkyNzQKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iIEAyNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3MzYsIDE3NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDU2MywgMTcwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQl3aWR0aCAgICAgIAkzNjQKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgMTM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCA4NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIKLQkJCQl3aWR0aCAgICAgIAk4MDQKLQkJCQloZWlnaHQgICAgIAkxNzIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDI2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTk1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAxODk5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQkJd2lkdGggICAgICAJMjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBAMjY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMjE0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYzLCAyMDkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkJCXdpZHRoICAgICAgCTMwOAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTI5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEyMzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJMjIyCi0JCQkJaGVpZ2h0ICAgICAJMTQ2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDI2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDMzNSwgMTM1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDI2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCA2ODgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwOSwgNTgwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA2NDEpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMSkKLQkJCQl3aWR0aCAgICAgIAk1NjAKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjcwCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgMTAzOSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMjY5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg0ODAsIDEwMzkpCi0JCQkJICAgICg0ODAsIDgwOCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYwMENCMDBBQSIKLQkJCQljbGllbnQgICAgIAlAMjYwCi0JCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjYsIDE4MjQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NjYsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODVCNUE0MDI3RSIKLQkJCQljbGllbnQgICAgIAlAMjY2Ci0JCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTcsIDIwNzkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTcsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA5Mzg2MDJDOSIKLQkJCQljbGllbnQgICAgIAlAMjYyCi0JCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTksIDIyNzEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTksIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODVCNTlCMDA3MiIKLQkJCQljbGllbnQgICAgIAlAMjY1Ci0JCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4OCwgMTg4NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg4LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDA5MjAyRjciCi0JCQkJY2xpZW50ICAgICAJQDI2MwotCQkJCXN1cHBsaWVyICAgCUAyNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3OTcsIDE2OTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc5NywgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZBMEYwMkYwIgotCQkJCWNsaWVudCAgICAgCUAyNTkKLQkJCQlzdXBwbGllciAgIAlAMjY5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjAxLCAxNTE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDEsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjcwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI3NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGREI4MDNENCIKLQkJCQljbGllbnQgICAgIAlAMjY3Ci0JCQkJc3VwcGxpZXIgICAJQDI2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxMSwgMTIyMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExLCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDI3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiCi0JCQkJY2xpZW50ICAgICAJQDI2OAotCQkJCXN1cHBsaWVyICAgCUAyNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0MTQsIDEzNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjc5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZBMjAwMjVFIgotCQkJCWNsaWVudCAgICAgCUAyNjEKLQkJCQlzdXBwbGllciAgIAlAMjY5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTY2MykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQyOSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNzApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI4MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA1ODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA2NDQpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY1KQotCQkJCXdpZHRoICAgICAgCTU2MwotCQkJCWhlaWdodCAgICAgCTIzNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDI4MQotCQkJCWxvY2F0aW9uICAgCSgxMTkxLCA2NzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOCIgQDI4MgotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg0NywgNjMxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSIKLQkJCQkJY2xpZW50ICAgICAJQDI4MQotCQkJCQlzdXBwbGllciAgIAlAMjY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjAsIDY3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzMCwgNjI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzk2OTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAyODUKLQkJCQkJUGFyZW50X1ZpZXcgCUAyODEKLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzU1LCA1MjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzc5MDcwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJCQkJY2xpZW50ICAgICAJQDI4MQotCQkJCQlzdXBwbGllciAgIAlAMjgwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjIzLCA2NzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDk2LCA2MjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTQwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MywgNzY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI0NzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTkyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IiBAMjg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDE5MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCA4NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiV1NETEVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODkKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzMCwgMTQ1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk3NTMpCi0JCQkJd2lkdGggICAgICAJNzc0Ci0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI5MAotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA0MDIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDI4OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTAwOCwgNDAyKQotCQkJCSAgICAoMTAwOCwgMzEyKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjkxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZFM0MwM0Q0IgotCQkJCWNsaWVudCAgICAgCUAyNjkKLQkJCQlzdXBwbGllciAgIAlAMjg5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDkyLCA1NjgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ5MiwgNDAyKQotCQkJCWRyYXdTdXBwbGllciAJQDI5MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyOTIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjE0OTAzRDAiCi0JCQkJY2xpZW50ICAgICAJQDI4MAotCQkJCXN1cHBsaWVyICAgCUAyNjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDE1LCA1NzEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTUsIDI0NikpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjkzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JEREY1MzUwMkMzIgotCQkJCWNsaWVudCAgICAgCUAyODAKLQkJCQlzdXBwbGllciAgIAlAMjg5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc2MiwgNTcxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzYyLCA0MDIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjkwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjk0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDE2LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzMxLCAxMzA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQkJd2lkdGggICAgICAJNTg4Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjk1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBRUMwMUNCIgotCQkJCWNsaWVudCAgICAgCUAyOTQKLQkJCQlzdXBwbGllciAgIAlAMjgwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc5NiwgMTI5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc5NiwgODA1KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjkiIEAyOTYKLQkJCQlsb2NhdGlvbiAgIAkoMjMxMSwgMTY4NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBMjAyNkUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcmVudCIgQDI5NwotCQkJCQlQYXJlbnRfVmlldyAJQDI5NgotCQkJCQlsb2NhdGlvbiAgIAkoMjc5LCAyOTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDIyLCAxMzMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhcmVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJCIgotCQkJCQljbGllbnQgICAgIAlAMjk2Ci0JCQkJCXN1cHBsaWVyICAgCUAyOTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjMxMSwgMTY4NikKLQkJCQkJICAgICgyNDMyLCAxNjg2KQotCQkJCQkgICAgKDI0MzIsIDEzNzQpCi0JCQkJCSAgICAoMjMxMCwgMTM3NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzExLCAxNjg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxMCwgMTM3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjYsIDE0MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2hpbGRyZW4iIEAzMDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAyOTYKLQkJCQkJbG9jYXRpb24gICAJKDI3OSwgMjk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg5OSwgMTUzNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjaGlsZHJlbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk4NTYxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQyIKLQkJCQkJY2xpZW50ICAgICAJQDI5NgotCQkJCQlzdXBwbGllciAgIAlAMjk0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzMTEsIDE2ODYpCi0JCQkJCSAgICAoMjAxNiwgMTY4NikKLQkJCQkJICAgICgyMDE2LCAxNDI1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE2LCAxNDI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MCwgMTQ4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciCi0JCQlxdWlkICAgICAgIAkiM0FFOEVENzIwMUJEIgotCQkJdGl0bGUgICAgICAJIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyIKLQkJCXpvb20gICAgICAgCTkwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IiBAMzAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjIsIDE3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUltcG9ydCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjIsIDEyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSIKLQkJCQl3aWR0aCAgICAgIAk1OTgKLQkJCQloZWlnaHQgICAgIAkyMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIgQDMwNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxMTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDEwNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk5hbWVzcGFjZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJCQl3aWR0aCAgICAgIAk0NzkKLQkJCQloZWlnaHQgICAgIAkyMTUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMzA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDExNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk2OTQKLQkJCQloZWlnaHQgICAgIAkxNzMKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAzMDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDAwLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NCwgMjM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTQ5MAotCQkJCWhlaWdodCAgICAgCTMyMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDMwNwotCQkJCWxvY2F0aW9uICAgCSgzMDksIDc4NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NTAwMkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVOYW1lc3BhY2VzIiBAMzA4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzA3Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MSwgOTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VOYW1lc3BhY2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTg4NDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzMyIgotCQkJCQljbGllbnQgICAgIAlAMzA3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCAxMDI5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ4LCA5NzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2ODcwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCA5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNTA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDQiIEAzMTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDcKLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY4LCA1OTIpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMyOCIKLQkJCQkJY2xpZW50ICAgICAJQDMwNwotCQkJCQlzdXBwbGllciAgIAlAMzA2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgNTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5LCA1ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NDk2MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMzE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDcyLCA3MjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTUsIDU4MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCXdpZHRoICAgICAgCTQ1MgotCQkJCWhlaWdodCAgICAgCTMwNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDMxNgotCQkJCWxvY2F0aW9uICAgCSgxNDg2LCAxMDAxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxRENDMDJFNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNjaGVtYSIgQDMxNwotCQkJCQlQYXJlbnRfVmlldyAJQDMxNgotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNywgMTAxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0UwMjcwIgotCQkJCQljbGllbnQgICAgIAlAMzE2Ci0JCQkJCXN1cHBsaWVyICAgCUAzMDUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ4NiwgMTAwMSkKLQkJCQkJICAgICgxNjMyLCAxMDAxKQotCQkJCQkgICAgKDE2MzIsIDExMzApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzIsIDExMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTYzLCAxMDE4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMzIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMzE2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0UwMjdBIgotCQkJCQljbGllbnQgICAgIAlAMzE2Ci0JCQkJCXN1cHBsaWVyICAgCUAzMTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDEwMDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg2LCA4NzIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ1IiBAMzIxCi0JCQkJbG9jYXRpb24gICAJKDEwODcsIDQwMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQTAwMkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ2IiBAMzIyCi0JCQkJCVBhcmVudF9WaWV3IAlAMzIxCi0JCQkJCWxvY2F0aW9uICAgCSg2ODcsIC0xMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDA2LCA0ODApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFGMiIKLQkJCQkJY2xpZW50ICAgICAJQDMyMQotCQkJCQlzdXBwbGllciAgIAlAMzE1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwODcsIDQwMykKLQkJCQkJICAgICgxMzY0LCA0MDMpCi0JCQkJCSAgICAoMTM2NCwgNTY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjQsIDU2OCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVEZWZpbml0aW9uIiBAMzI0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzIxCi0JCQkJCWxvY2F0aW9uICAgCSg2ODcsIC0xMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDUsIDM2MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3NTMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUU4IgotCQkJCQljbGllbnQgICAgIAlAMzIxCi0JCQkJCXN1cHBsaWVyICAgCUAzMDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNDAzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzI3LCA0NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDkxMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDMyNwotCQkJCWxvY2F0aW9uICAgCSg3MzcsIDgyNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY0IiBAMzI4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzI3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjcxLCAxMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTIsIDY0NykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJCQljbGllbnQgICAgIAlAMzI3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMDYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzM3LCA4MjYpCi0JCQkJCSAgICAoNTEwLCA4MjYpCi0JCQkJCSAgICAoNTEwLCA1NDQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDU0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ1NywgNTk1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbXBvcnRzIiBAMzMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzI3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjcxLCAxMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQ0LCA3NzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUltcG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5OTE4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCIKLQkJCQkJY2xpZW50ICAgICAJQDMyNwotCQkJCQlzdXBwbGllciAgIAlAMzE1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDYsIDgyNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExODAsIDg3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMjExCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTYyLCA5MzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzNzcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMjAwRDAzNDAiCi0JCQkJY2xpZW50ICAgICAJQDMxNQotCQkJCXN1cHBsaWVyICAgCUAzMDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTU1LCA1NjgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDMzMykpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjIgVHlwZXMiCi0JCQlxdWlkICAgICAgIAkiM0I4NUFFNTkwMzdFIgotCQkJdGl0bGUgICAgICAJIjIuMiBUeXBlcyIKLQkJCXpvb20gICAgICAgCTkwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTgxCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDMzNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTIzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoODk1LCAxMTU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAk1MDAKLQkJCQloZWlnaHQgICAgIAkxNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMzM3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNiwgMTUzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTE2MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDMzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTk2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgMTgyOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MTcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgMTg4MykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjUpCi0JCQkJd2lkdGggICAgICAJNTM1Ci0JCQkJaGVpZ2h0ICAgICAJMzA1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMzM5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTA2NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCAxMTIyKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTQ4NCkKLQkJCQl3aWR0aCAgICAgIAk0NjYKLQkJCQloZWlnaHQgICAgIAkyNTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAzNDAKLQkJCQlsb2NhdGlvbiAgIAkoNzM1LCAxMTcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEAzNDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNDAKLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc1LCAxMTMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjkwMDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMjciCi0JCQkJCWNsaWVudCAgICAgCUAzNDAKLQkJCQkJc3VwcGxpZXIgICAJQDMzNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg2LCAxMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM5LCAxMjA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODg3MDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQwCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMzEiCi0JCQkJCWNsaWVudCAgICAgCUAzNDAKLQkJCQkJc3VwcGxpZXIgICAJQDMzOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg1LCAxMTcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NSIgQDM0NQotCQkJCWxvY2F0aW9uICAgCSg1MjcsIDE1OTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTIwM0IyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb24iIEAzNDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNDUKLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2NiwgMTU1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3NTM5NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAxQyIKLQkJCQkJY2xpZW50ICAgICAJQDM0NQotCQkJCQlzdXBwbGllciAgIAlAMzM3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDE1OTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDE2NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NTg3NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTYiIEAzNDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNDUKLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMjYiCi0JCQkJCWNsaWVudCAgICAgCUAzNDUKLQkJCQkJc3VwcGxpZXIgICAJQDMzOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1MjcsIDE1OTIpCi0JCQkJCSAgICAoNDM3LCAxNTkyKQotCQkJCQkgICAgKDQzNywgMTMxMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDEzMTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYxIiBAMzUwCi0JCQkJbG9jYXRpb24gICAJKDMyMiwgMTkxMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5MzAzRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMzUxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzUwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzgsIDE4NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0ODU2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSIKLQkJCQkJY2xpZW50ICAgICAJQDM1MAotCQkJCQlzdXBwbGllciAgIAlAMzM4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxOTExKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYyIiBAMzU0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzUwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTE4IgotCQkJCQljbGllbnQgICAgIAlAMzUwCi0JCQkJCXN1cHBsaWVyICAgCUAzMzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzIyLCAxOTExKQotCQkJCQkgICAgKDIyOSwgMTkxMSkKLQkJCQkJICAgICgyMjksIDEzMTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5LCAxMzEzKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAzNTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDUxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNTY3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTMxMikKLQkJCQl3aWR0aCAgICAgIAkzODkKLQkJCQloZWlnaHQgICAgIAkyMTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAzNTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQsIDEwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQl3aWR0aCAgICAgIAkyMjIKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTkiIEAzNTcKLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCA2MDQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAzNTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTcKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNjQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA3Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VUeXBlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjYxMDE3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMzU3Ci0JCQkJCXN1cHBsaWVyICAgCUAzNTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjA2LCA2MDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjYsIDU2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzgzODgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDM2MQotCQkJCQlQYXJlbnRfVmlldyAJQDM1NwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzLCAzMTMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJCQljbGllbnQgICAgIAlAMzU3Ci0JCQkJCXN1cHBsaWVyICAgCUAzNTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCA2MDQpCi0JCQkJCSAgICAoMTc0LCA2MDQpCi0JCQkJCSAgICAoMTc0LCAyMjUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDIyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOCwgMjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTc3MjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyIgQDM2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAyMDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklUeXBlcyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNSwgMTUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIgotCQkJCXdpZHRoICAgICAgCTI0OAotCQkJCWhlaWdodCAgICAgCTE2NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzNjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MjgsIDgwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1OSwgNzUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTczOQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyIKLQkJCQl3aWR0aCAgICAgIAk3NTcKLQkJCQloZWlnaHQgICAgIAkxMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMzY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDEyMTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjksIDExMDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk2NzMKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjUiIEAzNjcKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNiwgOTc1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ1MDBGMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjYiIEAzNjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNjcKLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRCIKLQkJCQkJY2xpZW50ICAgICAJQDM2NwotCQkJCQlzdXBwbGllciAgIAlAMzY1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCA4NTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzc0LCA5MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1NjQ4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAMzcwCi0JCQkJCVBhcmVudF9WaWV3IAlAMzY3Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDYsIDEwMzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDc1NzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNFIgotCQkJCQljbGllbnQgICAgIAlAMzY3Ci0JCQkJCXN1cHBsaWVyICAgCUAzNjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDEwOTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzg4LCAxMDUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTE1MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0QzQjAzODAiCi0JCQkJY2xpZW50ICAgICAJQDM1NQotCQkJCXN1cHBsaWVyICAgCUAzNjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDUsIDUwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzA1LCAzMDcpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAzNzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDIyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE1LCAxMzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDE4NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMxKQotCQkJCXdpZHRoICAgICAgCTUwMAotCQkJCWhlaWdodCAgICAgCTIxMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM3NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQljbGllbnQgICAgIAlAMzU1Ci0JCQkJc3VwcGxpZXIgICAJQDM3NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NCwgNTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTQsIDMzMCkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDM3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA0NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDM2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTAsIDQyMykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0NjUpCi0JCQkJd2lkdGggICAgICAJNjg3Ci0JCQkJaGVpZ2h0ICAgICAJMjE2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3IiBAMzc3Ci0JCQkJbG9jYXRpb24gICAJKDEyMDYsIDQ5MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAMzc4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzc3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAzODYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RSIKLQkJCQkJY2xpZW50ICAgICAJQDM3NwotCQkJCQlzdXBwbGllciAgIAlAMzc0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMDYsIDQ5MykKLQkJCQkJICAgICgxMDk0LCA0OTMpCi0JCQkJCSAgICAoMTA5NCwgMzMwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTQsIDMzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDM3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI4MzI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMzgxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzc3Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTg2LCAyMzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk2LCA0NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzOTcxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJCQkJY2xpZW50ICAgICAJQDM3NwotCQkJCQlzdXBwbGllciAgIAlAMzc2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDgxLCA0OTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDE1LCA1NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NDk1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5NiwgMzkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTQ5MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzg1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYyN0YwMEI3IgotCQkJCWNsaWVudCAgICAgCUAzNjUKLQkJCQlzdXBwbGllciAgIAlAMzc2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgxMiwgNzQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEyLCA1NzIpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4zIE1lc3NhZ2VzIgotCQkJcXVpZCAgICAgICAJIjNCQ0U4NTNEMDJDOCIKLQkJCXRpdGxlICAgICAgCSIyLjMgTWVzc2FnZXMiCi0JCQl6b29tICAgICAgIAk4NQotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU1lc3NhZ2UiIEAzODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCAxMjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklNZXNzYWdlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCA3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY3LCAxODApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMzgxKQotCQkJCXdpZHRoICAgICAgCTM4MAotCQkJCWhlaWdodCAgICAgCTMyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiIEAzODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCAxMjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklQYXJ0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgNzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDE4MikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk2MDMpCi0JCQkJd2lkdGggICAgICAJNjE3Ci0JCQkJaGVpZ2h0ICAgICAJMzI0Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzODgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDgxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgNjkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA3NDgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0KQotCQkJCXdpZHRoICAgICAgCTQ5MgotCQkJCWhlaWdodCAgICAgCTI3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM4OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOTZEMDJGMSIKLQkJCQljbGllbnQgICAgIAlAMzg4Ci0JCQkJc3VwcGxpZXIgICAJQDM4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDQsIDY3OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwNCwgMzg2KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzOTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDUwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCA1NjUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI1KQotCQkJCXdpZHRoICAgICAgCTQzMgotCQkJCWhlaWdodCAgICAgCTMyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJCQljbGllbnQgICAgIAlAMzkwCi0JCQkJc3VwcGxpZXIgICAJQDM4NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEAzOTIKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFydHMiIEAzOTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAzOTIKLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCA4OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTc0NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiCi0JCQkJCWNsaWVudCAgICAgCUAzOTIKLQkJCQkJc3VwcGxpZXIgICAJQDM4OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTgwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDIwMzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4IiBAMzk3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzkyCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyIKLQkJCQkJY2xpZW50ICAgICAJQDM5MgotCQkJCQlzdXBwbGllciAgIAlAMzkwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY4OCwgOTUyKQotCQkJCQkgICAgKDQ0NSwgOTUyKQotCQkJCQkgICAgKDQ0NSwgODE3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDkxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ3NjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkpKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ4c2QiCi0JCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIlhTRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIm9yZy5lY2xpcHNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkieHNkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94c2QvMjAwMi9YU0QiKSkKLQkJcXVpZCAgICAgICAJIjM5QUJEQzZGMDFBQSIKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREFubm90YXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRFMjAzNjYiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXBwbGljYXRpb25JbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFQkYwMkM4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZXJJbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdFRUEwMTU3IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCQkY3RjA1MDFFMiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiRE9NQXR0ciIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCN0RDMDE5MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjEwM0JFIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVEZWNsYXJhdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4N0Y1MjAyQjQiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ4RTIwMEVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwM0EwMjIxIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFQjAyQTgiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjdCMDM4NiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlIgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjcyRDczNzAzOEYiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0NGMzAyN0QiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDRERCMDNCNyIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWludCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDREUwMDJEOCIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkE3QjAyMjAzODIiCi0JCQkJdHlwZSAgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzE5RDkwMzQxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREJvdW5kZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2M0MwMjI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzUyQTAwQ0MiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5RmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjRGMDEzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1NkMwMTUzIgotCQkJCXR5cGUgICAgICAgCSJYU0RDYXJkaW5hbGl0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhCODAyODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUJBQTIwMzEwIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVyaXZhdGlvbk1ldGhvZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNkU0MDIwRSIKLQkJCQl0eXBlICAgICAgIAkiWFNERGVyaXZhdGlvbk1ldGhvZCIKLQkJCQlpbml0diAgICAgIAkicmVzdHJpY3Rpb24iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNzFEMDI2QSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MzgwMEM1IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQTQyMDJCOCIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNCOEEwM0U2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjYxODAxNEQiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBsZXhGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9jayIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGQjk3MDA2RSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWl4ZWQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzMxQUY1RTAzQTYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTkwM0QyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUREQjUwMUE1IgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW5pbmdGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpYWdub3N0aWMiCi0JCQlxdWlkICAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNENEMwRjRDMDFBMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V2ZXJpdHkiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OTFDMDA1RCIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlhZ25vc3RpY1NldmVyaXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU1RkREMDI4MCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0MzAxNkIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaW5lIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjA3RTAyMTMiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2x1bW4iCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MTFFMDI5NiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5vZGUiCi0JCQkJcXVpZCAgICAgICAJIjNDMDE2QjZCMDIwMCIKLQkJCQl0eXBlICAgICAgIAkiRE9NTm9kZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbm5vdGF0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQzA2Mzc0RjAxODYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1RjE3MDAyRSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTY2MDMzOSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmlsbGFibGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkZCNDAyOUYiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNDY4MDM2OCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzRBMDAzQjkiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhYnN0cmFjdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNEUwMDAwRSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE0QzAwQjIiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEQxNjgwMUMxIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODlGNjIwM0NGIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMzREQ0IwMDAxOCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERW51bWVyYXRpb25GYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDOUQwM0M3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QzY0MDA1NCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Mzc0MDI1MyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhY2V0TmFtZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUZCNDAxRUMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlZmZlY3RpdmVWYWx1ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QUFFMzAzQjYiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGZWF0dXJlIgotCQkJcXVpZCAgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4MTAyMEYiCi0JCQkJdHlwZSAgICAgICAJIlZhbHVlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cmFpbnQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QkY4ODAwQzUiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbnN0cmFpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZm9ybSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDJCMDMzRSIKLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsVmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjcxQTFCMDE2RiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImdsb2JhbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTAwNzAzNzIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmVhdHVyZVJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTA0NDAxODUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZpeGVkRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5OUUwMEMxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2Qzg4MDFCNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDNkE2MDAyMDEiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qjk5MDAxNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc5RDIwMDhBIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzY5RTgwMUQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzdCMDM5NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RDFDNzAxNDMiCi0JCQkJdHlwZSAgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludENhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEQ5MDAzRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QURCMTUwMzZDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREluY2x1ZGUiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDN0QwMjUwIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOERDMDM4MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRExlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzc4MDAyREYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzZDMDA0QiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhFeGNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOEUwMzA5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQzMTAzQUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUUyMDFGNyIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMTc0MDI3RCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExOTMwMzU0IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNYXhJbmNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCODMwM0I4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heExlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3N0M3MDE0NiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I3RDAwRkMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0RBMDBGMyIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5FeGNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTkwMjgxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzBBMUQyNDAwOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRUQxMDM5OCIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5jbHVzaXZlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMUEyMDA4RSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleGNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQkUwM0UyIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNaW5JbmNsdXNpdmVGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCNTIwMzUzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NzhDMDA2NSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzdDNDAwQzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Nzk5MDE1RSIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEE2NDAyNzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tcG9zaXRvciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGMUQwMUNGIgotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wb3NpdG9yIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRTIwMzgxIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI1NTAzODUiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExRjYwMkU4IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lZENvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ3MDAwMTQyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NDcwNDAzMUUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGlhc05hbWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1N0YwMTI3IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidVJJIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNTg3MDBFMiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzVVJJIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNUFBMDJBRiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwOTYzMDI1RSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDk0MzAyRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU0RjAyM0MiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN5c3RlbUlkZW50aWZpZXIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzJFMDBGMCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lkZW50aWZpZXIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMzM0MDM5NyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROdW1lcmljRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjQyMDA3NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc1QTMwMDEyIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RPcmRlcmVkRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NjU5MDEyQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc0RjYwMkRBIgotCQkJCXR5cGUgICAgICAgCSJYU0RPcmRlcmVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQYXJ0aWNsZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWluT2NjdXJzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOEUwM0IyIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWF4T2NjdXJzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNGOTkwM0FFIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3ODBCRDkwMDU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhdHRlcm5GYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDQTUwMzhEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3Qzc5MDMxMSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCXF1aWQgICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkQ0QkEwMjNDIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNpcmN1bGFyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNjgwMDIxNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVkZWZpbmVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkFFMjA2MDE3MiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNjQwMjQwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QUE2MDMxQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hIgotCQkJcXVpZCAgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0M0QTAxODIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQzI3ODRFNTAzREQiCi0JCQkJdHlwZSAgICAgICAJIkRPTURvY3VtZW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNjaGVtYUxvY2F0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NjhFQzAyMjYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5QkZGMDE4MCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZUZvcm1EZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwNEIwMTAyIgotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIgotCQkJCWluaXR2ICAgICAgCSJ1bnF1YWxpZmllZCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50Rm9ybURlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA3ODAwQUMiCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbmFsRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBDNEE3MDAzOCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2tEZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY1OUQwMkQ4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2ZXJzaW9uIgotCQkJCXF1aWQgICAgICAgCSIzRDIyRDZEODAzNTYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCXF1aWQgICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0MyMURCNTYwMDkyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRDhFNjAzNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJcXVpZCAgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NoZW1hTG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOUIzMDMzMCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY29wZSIKLQkJCXF1aWQgICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNENjQwMjMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhcmlldHkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzE1ODAwQTkiCi0JCQkJdHlwZSAgICAgICAJIlhTRFZhcmlldHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NDRGMDE0NiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEU2ltcGxlRmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbEZpbmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2NUUwMzVBIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RTaW1wbGVGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWxpZEZhY2V0cyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEFCMEYwMEI2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRlcm0iCi0JCQlxdWlkICAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZCRDI0NDAwNjkiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3OUEwMDIwRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I2MTAzMzciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3OUFCMDIzMiIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUUyRjUwMTNBIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0FCMTAwNEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzg2MjAwNDUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjk5RTAwQzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODUwMDIwMSIKLQkJCQl0eXBlICAgICAgIAkiWFNEV2hpdGVTcGFjZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2lsZGNhcmQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMEU5MDE5RSIKLQkJCQl0eXBlICAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZUNvbnN0cmFpbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDRjg2MDIyMyIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2Nlc3NDb250ZW50cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMTJFMDFFNCIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvY2Vzc0NvbnRlbnRzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBN0JEQjcwMUY5IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2RDg0RjcwMDkyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDkwMTUwM0RFIgotCQkJCXR5cGUgICAgICAgCSJYU0RYUGF0aFZhcmlldHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCN0JCQkUxMDFCMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01BdHRyIgotCQkJcXVpZCAgICAgICAJIjNCQkY4Qzg5MDFCNiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uQXR0ciIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjhDQjAwMEQ1IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTURvY3VtZW50IgotCQkJcXVpZCAgICAgICAJIjNDMjc4NTBFMDM4MSIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NTFCMDNDNiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01FbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNCODE4OTc5MDIwMCIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4MTg5REIwMzc0IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTU5vZGUiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Ob2RlIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjVCRjAwMkQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiVmFsdWUiCi0JCQlxdWlkICAgICAgIAkiM0MwNDBCNUIwMzFGIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuT2JqZWN0IgotCQkJCXF1aWQgICAgICAgCSIzQzA0MEI4RDAzRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0JBN0IwRTgwMUE4IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcHRpb25hbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMTUwMkI3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2hpYml0ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMTIyMDJEMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjkwMkYwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDYXJkaW5hbGl0eSIKLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1RDAwOUIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpbml0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxREMwMkVEIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvdW50YWJseUluZmluaXRlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFFQzAxNDEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBsZXhGaW5hbCIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzJDQTAxQ0IiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyRTcwMERBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFQTAxNkEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZEMjAxMTIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbXBvc2l0b3IiCi0JCQlxdWlkICAgICAgIAkiM0I4NjlCNjIwMDM3IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5QkQwMDAwMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjaG9pY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5Q0I4MDExRSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXF1ZW5jZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDRTUwMDU3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb25zdHJhaW50IgotCQkJcXVpZCAgICAgICAJIjNCODY5RTI2MDFBRSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlFOEUwMjU4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpeGVkIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU5OTAyNzEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I4NkE3OUYwM0EyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbXB0eSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3Q0QwMkYwIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNpbXBsZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDEwMENFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm1peGVkIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMzAxQjciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE9ubHkiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0Q3MDJFOSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGVyaXZhdGlvbk1ldGhvZCIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTBCMDAwQ0UiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEwQzgwMzI5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDQzAxNjIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRERpYWdub3N0aWNTZXZlcml0eSIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjhBNzAzMkYiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhdGFsIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhDMzAzRDAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXJyb3IiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEU3MDBFMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ3YXJuaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjhFQTAxRkYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5mb3JtYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCRkU3RkMyMDE5QSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QTQwM0RGIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjc5MDA0NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjdGMDFBQyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2ODMwMjBCIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNDUwMDY5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RGb3JtIgotCQkJcXVpZCAgICAgICAJIjNCOUY5MTNCMDFFQiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicXVhbGlmaWVkIgotCQkJCXF1aWQgICAgICAgCSIzQjlGOTE2RjAwMjMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5xdWFsaWZpZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MThDMDA3RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I4NkExRTAwMjcyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXkiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEyMDA4NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJrZXlyZWYiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjEzMDE0RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlxdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMjE2MDM2NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IgotCQkJcXVpZCAgICAgICAJIjNCOTdDNUVBMDAyMyIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYW55IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2MDAwMzQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm90IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2MjAwNUYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2V0IgotCQkJCXF1aWQgICAgICAgCSIzQjk3RDA2NTAxMTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWQiCi0JCQlxdWlkICAgICAgIAkiM0JDNzcxNTIwMkU0IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWxzZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQTkwMjcxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcnRpYWwiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUJCMDFGRiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0b3RhbCIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQzQwMUIyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RQcm9jZXNzQ29udGVudHMiCi0JCQlxdWlkICAgICAgIAkiM0I4RkY4QzcwMjg0IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHJpY3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY4MDA0NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsYXgiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEY2MDM4QiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJza2lwIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjhFODAyQkEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4QjAwQjgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjk0MDI5MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGMjUwMDI5NSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2ltcGxlRmluYWwiCi0JCQlxdWlkICAgICAgIAkiM0I5N0MyNUQwMjk1IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4MTAyMzAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgzMDEzOCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODgwMjRFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEY2RTAwMzc0IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1OTEwMEFFIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjY0MDIzMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NkQwMjE2IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RWYXJpZXR5IgotCQkJcXVpZCAgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXRvbWljIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBNzAyREYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGlzdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY3QUQwMTM5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRjAzOUYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFdoaXRlU3BhY2UiCi0JCQlxdWlkICAgICAgIAkiM0JFRUQwRjYwMzQyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVzZXJ2ZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMEYwMTE3IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcGxhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCRUVEMTI3MDM0RCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb2xsYXBzZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjkwMzk2IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RYUGF0aFZhcmlldHkiCi0JCQlxdWlkICAgICAgIAkiM0I4RkZCODkwMzNBIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZWxlY3RvciIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkZCQUMwMTkyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJCMzAyNzgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDcwIgotCQkJcXVpZCAgICAgICAJIjNDNjI2RUE3MDEwMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzEiCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlcGVhdGFibGVGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVBOTAxOTIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDcyIgotCQkJcXVpZCAgICAgICAJIjNCNjlEQURDMDJGNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQUREMDIzOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjQyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMDZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzBFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkwRDYwMzE4IgotCQkJCWxhYmVsICAgICAgCSJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU2QjAyQ0IiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc3IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU2RDAwQTciCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3OCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI2QjAxOTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc5IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2RDAzMDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMxMyIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMDYwMjkxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMDcwMTcyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODIiCi0JCQlxdWlkICAgICAgIAkiM0I2OTQwNEUwMDY3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwNTAwMjlCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjk0MDUwMDJBNSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg0IgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTlGMDA4NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVVzZXMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNUEwMDA2QSIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlVXNlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDg2IgotCQkJcXVpZCAgICAgICAJIjNDMjc1RDMyMDIyMCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODciCi0JCQkJcXVpZCAgICAgICAJIjNDMjc1RDNDMDEwQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBEIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODgiCi0JCQlxdWlkICAgICAgIAkiM0I2ODg3QkYwMTUwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4N0MwMDBBOCIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlV2lsZGNhcmQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkwIgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjVFMDFGOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI2MjAwNTAiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTIiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1ODUwMTBEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTg2MDBGQiIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk0IgotCQkJcXVpZCAgICAgICAJIjNCNkYxREU5MDE4QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM2QyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkYxREVBMDM4MCIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NiIKLQkJCXF1aWQgICAgICAgCSIzQjkwMDY4ODAxQzIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk3IgotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50QW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2OEEwMTFCIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50QW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk4IgotCQkJcXVpZCAgICAgICAJIjNCNjgzMzM1MDM0MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzMzYwMjhFIgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwMCIKLQkJCXF1aWQgICAgICAgCSIzQjZGRERENzAxMTMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwMSIKLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjZCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjc1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDIiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3REYwMjRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0UxMDBGRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA0IgotCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDA2RSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNEEiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDYiCi0JCQlxdWlkICAgICAgIAkiM0I2OThFMzYwMzg2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDciCi0JCQkJcXVpZCAgICAgICAJIjNCNjk4RTM4MDA3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwN0MiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDgiCi0JCQlxdWlkICAgICAgIAkiM0I2ODUxQkEwMTI2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1MUJCMDE1MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTEiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTAiCi0JCQlxdWlkICAgICAgIAkiM0I3NTFCMDgwM0M3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJjb250YWluZXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0UiCi0JCQkJbGFiZWwgICAgICAJImNvbnRhaW5lciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEyIgotCQkJcXVpZCAgICAgICAJIjNCNzUxQjQ4MDI2MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdENvbnRhaW5lciIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NSIKLQkJCQlsYWJlbCAgICAgIAkicm9vdENvbnRhaW5lciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExMyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE0IgotCQkJcXVpZCAgICAgICAJIjNCNzUxQzMxMDM1NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFDMzMwMzNCIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTYiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEEwMDY2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTciCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDIzRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDI0OSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExOCIKLQkJCXF1aWQgICAgICAgCSIzQjY4OTExNDAxQUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExOSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNyIKLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDA1OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0MwIgotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTIyIgotCQkJcXVpZCAgICAgICAJIjNCNjgzM0VGMDE2MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIzIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk5IgotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNCIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDFFNjAyNTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyNSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQxRUEwMkY3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDMwQiIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjYiCi0JCQlxdWlkICAgICAgIAkiM0I2OUMwNTkwMTk4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjciCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IikKLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFRCIKLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyOCIKLQkJCXF1aWQgICAgICAgCSIzQzQyREJERDAyOTciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyOSIKLQkJCQlxdWlkICAgICAgIAkiM0M0MkRCRTAwMTFFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXAiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDEyOCIKLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzAiCi0JCQlxdWlkICAgICAgIAkiM0I2RDIzQjkwMUNEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUNFIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMyIgotCQkJcXVpZCAgICAgICAJIjNCNkQ1OTcxMDJFQSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDEwNSIKLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU5NzUwMTE5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNCIKLQkJCXF1aWQgICAgICAgCSIzQjY5QjY1MzAxN0EiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjb3BlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZEIgotCQkJCWxhYmVsICAgICAgCSJzY29wZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzYiCi0JCQlxdWlkICAgICAgIAkiM0MyOTAxMDYwMkQ3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEZlYXR1cmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMEUiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRmVhdHVyZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM3IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAxOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzOCIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAxODMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzOSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMzNDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDM0NiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MCIKLQkJCXF1aWQgICAgICAgCSIzQjY5RDI5RTAxNEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jZWRLZXkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2NSIKLQkJCQlsYWJlbCAgICAgIAkicmVmZXJlbmNlZEtleSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQxIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MiIKLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRDAwM0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInNlbGVjdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJbGFiZWwgICAgICAJInNlbGVjdG9yIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDQiCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmaWVsZHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM3OSIKLQkJCQlsYWJlbCAgICAgIAkiZmllbGRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDYiCi0JCQlxdWlkICAgICAgIAkiM0I2QURDRDgwMkZDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDciCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0OCIKLQkJCXF1aWQgICAgICAgCSIzQjZBRENDNTAwN0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QURDQzYwMDZCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1MCIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNzAyQzgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTgwM0UyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE5MDAwNCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1MiIKLQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCMTAyRjgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDFCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCNjAwMjUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNjAyNkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInBhcnRpY2xlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIyIgotCQkJCWxhYmVsICAgICAgCSJwYXJ0aWNsZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1NiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNTAwOEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMDk2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxNjAwQTAiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTgiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3QUMwMjVBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibW9kZWxHcm91cCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM5IgotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYwIgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ1MDM5OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYxIgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM5RSIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYyIgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBGMDIxMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMDAwQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEQzIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY0IgotCQkJcXVpZCAgICAgICAJIjNCNkI0NzE1MDExOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY1IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNCNSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY2IgotCQkJcXVpZCAgICAgICAJIjNCNjgzQzg5MDEyMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY3IgotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInRlcm0iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzQzhBMDExMSIKLQkJCQlsYWJlbCAgICAgIAkidGVybSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjgiCi0JCQlxdWlkICAgICAgIAkiM0I2QURFNDIwMDlBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjkiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDJGRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDMwOCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcwIgotCQkJcXVpZCAgICAgICAJIjNCNkFFODI0MDA1MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcxIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQjciCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzIiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhFNkIwMDNEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTZDMDEwNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMTEiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc0IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRThEMDFCRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc1IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTkiCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzYiCi0JCQlxdWlkICAgICAgIAkiM0I2NkZERkEwMEMzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzciCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkZERkIwMjdFIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3OCIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MjAyMTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThDIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgwIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDA0OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgxIgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzNzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDM3RSIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODIiCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFRkYwMjRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI1QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVGMDAwMjY0IgotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NCIKLQkJCXF1aWQgICAgICAgCSIzQkZDMkExNzAxRUQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NSIKLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjczIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3RCIKLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg2IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRUE3MDIzRSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg3IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUVBODAzOEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhCIgotCQkJCWxhYmVsICAgICAgCSJub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODgiCi0JCQlxdWlkICAgICAgIAkiM0I2OUU0NTYwMjkwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFNDU3MDE2NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNkYiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5MCIKLQkJCXF1aWQgICAgICAgCSIzQjZENUNBNTAxMTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5MSIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0I0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0M4IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTIiCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1QUQwMzc0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAwNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRDb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDEwIgotCQkJCWxhYmVsICAgICAgCSJmYWNldENvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NCIKLQkJCXF1aWQgICAgICAgCSIzQkM4QUUwMjAzQTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5NSIKLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDUxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA2NSIKLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTYiCi0JCQlxdWlkICAgICAgIAkiM0I2QzM0QjcwMjA4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTciCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNEJFMDI1OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWVtYmVyVHlwZURlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTkiCi0JCQkJbGFiZWwgICAgICAJIm1lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk4IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNjMyMDFEQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk5IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZ1bmRhbWVudGFsRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNjMiCi0JCQkJbGFiZWwgICAgICAJImZ1bmRhbWVudGFsRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjAwIgotCQkJcXVpZCAgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAxIgotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMiIKLQkJCXF1aWQgICAgICAgCSIzQjZENTU3MjAxNkMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjJGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjQzIgotCQkJCWxhYmVsICAgICAgCSJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA0IgotCQkJcXVpZCAgICAgICAJIjNCNjlFMjkxMDE1OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA1IgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxOUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDFBOSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNiIKLQkJCXF1aWQgICAgICAgCSIzQjkwMDZDRjAwODgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNyIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTVEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJkZXJpdmF0aW9uQW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTY3IgotCQkJCWxhYmVsICAgICAgCSJkZXJpdmF0aW9uQW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwOCIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIzMzAyNjQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwOSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjg0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjhFIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTEwMjZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDFGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTIwMjAzIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEyIgotCQkJcXVpZCAgICAgICAJIjNDNjI2RUIzMDAwNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEzIgotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMzIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNCIKLQkJCXF1aWQgICAgICAgCSIzQkVCREM4NzAyNDciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNSIKLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMkY5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQkVCREM4QzAzMDMiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTYiCi0JCQlxdWlkICAgICAgIAkiM0JGRTYyMjcwM0NEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTciCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbXBvbmVudHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2QyIKLQkJCQlsYWJlbCAgICAgIAkiY29tcG9uZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE4IgotCQkJcXVpZCAgICAgICAJIjNCRkU2MjY5MDE2NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE5IgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImRpYWdub3N0aWNzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI3IgotCQkJCWxhYmVsICAgICAgCSJkaWFnbm9zdGljcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMCIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMTAzNUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYWxsRGlhZ25vc3RpY3MiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNyIKLQkJCQlsYWJlbCAgICAgIAkiYWxsRGlhZ25vc3RpY3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjIyIgotCQkJcXVpZCAgICAgICAJIjNDMjFEQ0M3MDBFQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjIzIgotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZFNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZFNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNCIKLQkJCXF1aWQgICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjYiCi0JCQlxdWlkICAgICAgIAkiM0MyMzkxMzQwMDRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjciCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBDQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBENCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyOCIKLQkJCXF1aWQgICAgICAgCSIzQzI1RDNBNjAxMzEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyOSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVmZXJlbmNpbmdEaXJlY3RpdmVzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzEiCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzMCIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUNGMDAwNUUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDFFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFZlcnNpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMjgiCi0JCQkJbGFiZWwgICAgICAJInJvb3RWZXJzaW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMyIgotCQkJcXVpZCAgICAgICAJIjNDMjVFRDBCMDExQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjMzIgotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmlnaW5hbFZlcnNpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMkIiCi0JCQkJbGFiZWwgICAgICAJIm9yaWdpbmFsVmVyc2lvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNCIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUVBQjAwMUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTBCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMTUiCi0JCQkJbGFiZWwgICAgICAJImluY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzYiCi0JCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzciCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaXRlbVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwRTAiCi0JCQkJbGFiZWwgICAgICAJIml0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM4IgotCQkJcXVpZCAgICAgICAJIjNDMjc4NDczMDE5NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM5IgotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWFGb3JTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRkIiCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYUZvclNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4ODBGNTAzRDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDAzQyIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQxIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDA0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQyIgotCQkJcXVpZCAgICAgICAJIjNDMjg4MkM1MDEzNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltYXJ5Q29tcG9uZW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODgyQzcwMTEzIgotCQkJCWxhYmVsICAgICAgCSJwcmltYXJ5Q29tcG9uZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDQiCi0JCQlxdWlkICAgICAgIAkiM0MyOEEwRjIwMUE0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwRjMwMkU1IgotCQkJCWxhYmVsICAgICAgCSJ0eXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJGMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTZEQjAxRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0REIgotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ4IgotCQkJcXVpZCAgICAgICAJIjNDMjhBNzEyMDEwOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNTEiCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzE0MDE1QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTAiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3NEIwMTc4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJzaW1wbGVUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3NEQwMTdCIgotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUxIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE4NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTIiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3RUQwM0MwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wbGV4VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDExNyIKLQkJCQlsYWJlbCAgICAgIAkiY29tcGxleFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NDAzMEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBERCIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBFNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwODUwMjVCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTciCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyN0EiCi0JCQkJbGFiZWwgICAgICAJIm1pbkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTgiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwOEQwMjUyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTkiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDhFMDA5MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOUIiCi0JCQkJbGFiZWwgICAgICAJIm1heEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjAiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUIwMzk2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4SW5jbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzRDQiCi0JCQkJbGFiZWwgICAgICAJIm1heEluY2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjIiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUYwMzM4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDFGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAyMDMiCi0JCQkJbGFiZWwgICAgICAJIm1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjQiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjMwMjA3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjUiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI0MDE5MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRXhjbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOUEiCi0JCQkJbGFiZWwgICAgICAJIm1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjYwMjhEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjciCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIxNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMjEiCi0JCQkJbGFiZWwgICAgICAJIm1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjgiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMDUxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjkiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibGVuZ3RoRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNTAiCi0JCQkJbGFiZWwgICAgICAJImxlbmd0aEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzAiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkYwMThDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAid2hpdGVTcGFjZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDc1IgotCQkJCWxhYmVsICAgICAgCSJ3aGl0ZVNwYWNlRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzIiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzIwMjFEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZW51bWVyYXRpb25GYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUMiCi0JCQkJbGFiZWwgICAgICAJImVudW1lcmF0aW9uRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNTAxNTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEIwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXR0ZXJuRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEJBIgotCQkJCWxhYmVsICAgICAgCSJwYXR0ZXJuRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEM4MDJBNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNhcmRpbmFsaXR5RmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRjUiCi0JCQkJbGFiZWwgICAgICAJImNhcmRpbmFsaXR5RmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMENCMDM5QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm51bWVyaWNGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMENDMDNEMSIKLQkJCQlsYWJlbCAgICAgIAkibnVtZXJpY0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMENGMDE5OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwODUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heExlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDhGIgotCQkJCWxhYmVsICAgICAgCSJtYXhMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ1MDBDNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBENjAwMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDI3IgotCQkJCWxhYmVsICAgICAgCSJtaW5MZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDBERSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzQ0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzRDciCi0JCQkJbGFiZWwgICAgICAJInRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMERCMDM3NyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNjQiCi0JCQkJbGFiZWwgICAgICAJImZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDA0OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yZGVyZWRGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNDMyIKLQkJCQlsYWJlbCAgICAgIAkib3JkZXJlZEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEUzMDBEOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOEUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJvdW5kZWRGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEU0MDM5OCIKLQkJCQlsYWJlbCAgICAgIAkiYm91bmRlZEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ0MDFFQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzZBIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNTRGMDE0NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOEMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM5NiIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNUM0MDExQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjE3IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNjJBMDBBQSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxNDIiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCNkIwMDNBNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMiIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlUGF0dGVybkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCN0NBMDI2QiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxOTAiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCODQwMDA2MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMjciCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCODk4MDE2RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5OTAwNTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDYwIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDA1MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0MzIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCOTcwMDFEQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzExIgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwQ0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMEQ5IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEyIgotCQkJcXVpZCAgICAgICAJIjNENEJCNEFFMDFDQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzEzIgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRjAxMEYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY0ZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTFBIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNGYWNldHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzE0IgotCQkJcXVpZCAgICAgICAJIjNENEJCNEQzMDI4RSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzE1IgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRENDAyRjMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkZEIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTYiCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDkwMUY2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTciCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNERBMDI4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyOEUiCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxOCIKLQkJCXF1aWQgICAgICAgCSIzRDRDNjhGRjAxQkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxOSIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QzY5MDIwMzE3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxOCIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljV2lsZGNhcmQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDc2ODAxMzgiCi0JCQl0aXRsZSAgICAgIAkiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA0MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDAwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA0MDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDIKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAyMjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQwMAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTI4LCAyMjUpCi0JCQkJICAgICg5MjgsIDEzNSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBANDAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYwLCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDA0Ci0JCQkJbG9jYXRpb24gICAJKDEyMDMsIDcwNikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDAxCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMjAzLCA3MDYpCi0JCQkJICAgICgxMjAzLCA2MTUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBANDA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDU2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzcyLCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDYKLQkJCQlsb2NhdGlvbiAgIAkoNDQ0LCA3MDkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQwNQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDQ0LCA3MDkpCi0JCQkJICAgICg0NDQsIDYxNSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MDcKLQkJCQlsb2NhdGlvbiAgIAkoMTU3MiwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MDMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE1NzIsIDQ2NSkKLQkJCQkgICAgKDE1NzIsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDQwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDI5MCwgNzU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDQwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAxMDU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjIsIDEwMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDQxMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEwNCwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MzYsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCXdpZHRoICAgICAgCTM1NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQxMQotCQkJCWxvY2F0aW9uICAgCSg0NTMsIDEyMDMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQwOQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDUzLCAxMjAzKQotCQkJCSAgICAoNDUzLCAxMTExKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBANDEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA0MTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCA4MDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDYsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MTQKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgOTUwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MTMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4NzIsIDk1MCkKLQkJCQkgICAgKDE4NzIsIDg1NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MTUKLQkJCQlsb2NhdGlvbiAgIAkoMTgxLCA0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQxMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTgxLCA0NjUpCi0JCQkJICAgICgxODEsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDQxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTI4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MCwgMTIzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNTUwCi0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBANDE3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMDU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzM0LCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDQxOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OSwgMTQ0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2NTYKLQkJCQloZWlnaHQgICAgIAkxMTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANDE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCAxNDg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDMsIDE0NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNTgxCi0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0MjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDU2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDQyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTA1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDYsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDYsIDEyNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDQyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDYwLCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA0MjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDEyODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMTIzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzMCwgMTQ0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTY5NAotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBANDI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQyNiwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTMxOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDQyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDAyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDI5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCWNsaWVudCAgICAgCUA0MTAKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NCwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDQzMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgODAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQzMQotCQkJCWxvY2F0aW9uICAgCSg5NjIsIDk0NykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDMwCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg5NjIsIDk0NykKLQkJCQkgICAgKDk2MiwgODU1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDMyCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDMzCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTgsIDExNTQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjM1MzQKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJY2xpZW50ICAgICAJQDQyMwotCQkJCXN1cHBsaWVyICAgCUA0MDUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDksIDEyNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OSwgNzA5KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDQyMwotCQkJCXN1cHBsaWVyICAgCUA0MDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTYsIDEyNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgMTIwMykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIgotCQkJCWNsaWVudCAgICAgCUA0MjQKLQkJCQlzdXBwbGllciAgIAlANDEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg0LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQxNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiCi0JCQkJY2xpZW50ICAgICAJQDQyMgotCQkJCXN1cHBsaWVyICAgCUA0MDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDAyLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMDIsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDM3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCWNsaWVudCAgICAgCUA0MDMKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OSwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY5LCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDAyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQzOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQljbGllbnQgICAgIAlANDIwCi0JCQkJc3VwcGxpZXIgICAJQDQwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTAsIDUwNSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5MCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MzkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciCi0JCQkJY2xpZW50ICAgICAJQDQwOAotCQkJCXN1cHBsaWVyICAgCUA0MDUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MTAsIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA3MDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQljbGllbnQgICAgIAlANDI1Ci0JCQkJc3VwcGxpZXIgICAJQDQzMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjEsIDEyMjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjEsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MzEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQxCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDQyCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM3LCA4ODYpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTU4MTIKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDQxNwotCQkJCXN1cHBsaWVyICAgCUA0MDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjAwLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjAwLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlANDE3Ci0JCQkJc3VwcGxpZXIgICAJQDQxMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEwMDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDk1MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUA0MDkKLQkJCQlzdXBwbGllciAgIAlANDMwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDUwLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MzEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIgotCQkJCWNsaWVudCAgICAgCUA0MTIKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3LCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODRGNzAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDQyOAotCQkJCXN1cHBsaWVyICAgCUA0MDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDEyLCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTIsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QjgwMjg2IgotCQkJCWNsaWVudCAgICAgCUA0MDUKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM0LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgzNCwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJY2xpZW50ICAgICAJQDQwMQotCQkJCXN1cHBsaWVyICAgCUA0MDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUwLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTAsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2IgotCQkJCWNsaWVudCAgICAgCUA0MjcKLQkJCQlzdXBwbGllciAgIAlANDAwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTcyLCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3MiwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiCi0JCQkJY2xpZW50ICAgICAJQDQxNgotCQkJCXN1cHBsaWVyICAgCUA0MTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkzLCAxMjIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjkzLCA5NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQljbGllbnQgICAgIAlANDE4Ci0JCQkJc3VwcGxpZXIgICAJQDQwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDE0MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIgotCQkJCWNsaWVudCAgICAgCUA0MTkKLQkJCQlzdXBwbGllciAgIAlANDAxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMSwgMTQzMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMSwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDQzMAotCQkJCXN1cHBsaWVyICAgCUA0MDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTksIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCA3MDYpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQljbGllbnQgICAgIAlANDEzCi0JCQkJc3VwcGxpZXIgICAJQDQwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzIsIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3MiwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiCi0JCQkJY2xpZW50ICAgICAJQDQyMQotCQkJCXN1cHBsaWVyICAgCUA0MzAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjIsIDEwMDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2MiwgOTQ3KQotCQkJCWRyYXdTdXBwbGllciAJQDQzMSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTcKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDk1LCAxMzg4KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDQyNTMxCi0JCQkJICAgIGhlaWdodCAgICAgCTY3Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUJBQTIwMzEwIgotCQkJCWNsaWVudCAgICAgCUA0MjYKLQkJCQlzdXBwbGllciAgIAlANDEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgsIDE0MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlANDI2Ci0JCQkJc3VwcGxpZXIgICAJQDQwOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY1NiwgMTQyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAxMjAzKQotCQkJCWRyYXdTdXBwbGllciAJQDQxMSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuIENvbXBvbmVudCBSZWxhdGlvbnMgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIgotCQkJcXVpZCAgICAgICAJIjM3NEIxODE5MDAyOCIKLQkJCXRpdGxlICAgICAgCSIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXpvb20gICAgICAgCTk2Ci0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBANDU5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzg0LCAxNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDU5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzAsIDE1OTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA0NjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDE2MzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNCIgQDQ2MQotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDE2MjcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTMwMTdBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY29wZSIgQDQ2MgotCQkJCQlQYXJlbnRfVmlldyAJQDQ2MQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU1LCAxNTg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Njb3BlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzEyNTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkQiCi0JCQkJCWNsaWVudCAgICAgCUA0NjEKLQkJCQkJc3VwcGxpZXIgICAJQDQ1OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYxLCAxNjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNjY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTEwMTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzNSIgQDQ2NQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2MQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RSIKLQkJCQkJY2xpZW50ICAgICAJQDQ2MQotCQkJCQlzdXBwbGllciAgIAlANDYwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMjcsIDE2MjcpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA0NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODQsIDExOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0NjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNzYsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNjgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjYiIEA0NjgKLQkJCQlsb2NhdGlvbiAgIAkoMjIyOSwgMTExMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4OTAxMjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2NyIgQDQ2OQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2OAotCQkJCQlsb2NhdGlvbiAgIAkoNTQ5LCAtMjQ4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMCIKLQkJCQkJY2xpZW50ICAgICAJQDQ2OAotCQkJCQlzdXBwbGllciAgIAlANDY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInRlcm0iIEA0NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NjgKLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNTcsIDExMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdGVybSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTM0MzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTExIgotCQkJCQljbGllbnQgICAgIAlANDY4Ci0JCQkJCXN1cHBsaWVyICAgCUA0NjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3NCwgMTExOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTE5NDAzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQ3MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMTIzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCXdpZHRoICAgICAgCTUyMgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA0NzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NywgNzI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCXdpZHRoICAgICAgCTM1MgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1NCIgQDQ3NQotCQkJCWxvY2F0aW9uICAgCSgyMjE5LCA4ODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDYwMjZGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTUiIEA0NzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzUKLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIxIgotCQkJCQljbGllbnQgICAgIAlANDc1Ci0JCQkJCXN1cHBsaWVyICAgCUA0NzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDgyMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcnRpY2xlcyIgQDQ3NwotCQkJCQlQYXJlbnRfVmlldyAJQDQ3NQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDUsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0aWNsZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NjYyNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjIiCi0JCQkJCWNsaWVudCAgICAgCUA0NzUKLQkJCQkJc3VwcGxpZXIgICAJQDQ2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxOSwgOTM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4MSwgODg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0ODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NzYsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzOSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0ODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNSwgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCXdpZHRoICAgICAgCTM1MgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDgyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMCIgQDQ4MwotCQkJCWxvY2F0aW9uICAgCSg1OTAsIDExNDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDEiIEA0ODQKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODMKLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSIKLQkJCQkJY2xpZW50ICAgICAJQDQ4MwotCQkJCQlzdXBwbGllciAgIAlANDgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDU5MCwgMTE0MCkKLQkJCQkJICAgICg1NDAsIDExNDApCi0JCQkJCSAgICAoNTQwLCAxMDQ1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MCwgMTE0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU0MCwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ4NQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4MwotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDExNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4wNTM1NzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyQTUiCi0JCQkJCWNsaWVudCAgICAgCUA0ODMKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1OTAsIDExNDApCi0JCQkJCSAgICAoNjQxLCAxMTQwKQotCQkJCQkgICAgKDY0MSwgMTA0NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDEsIDEwNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODQsIDEwOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xMjI0NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDg4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAyIiBANDg5Ci0JCQkJbG9jYXRpb24gICAJKDExMTksIDExMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3REYwMjRGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDMiIEA0OTAKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODkKLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkQiCi0JCQkJCWNsaWVudCAgICAgCUA0ODkKLQkJCQkJc3VwcGxpZXIgICAJQDQ4OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50VHlwZSIgQDQ5MQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE1NjksIC04KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1OSwgMTEyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjA4OTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0UxMDBGRSIKLQkJCQkJY2xpZW50ICAgICAJQDQ4OQotCQkJCQlzdXBwbGllciAgIAlANDczCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExOSwgMTE3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNjMsIDExMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDgiIEA0OTQKLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NSwgOTgyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg1MUJBMDEyNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA5IiBANDk1Ci0JCQkJCVBhcmVudF9WaWV3IAlANDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTksIC01NzApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUwIgotCQkJCQljbGllbnQgICAgIAlANDk0Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODAsIDk4MikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkIiBANDk2Ci0JCQkJCVBhcmVudF9WaWV3IAlANDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTksIC01NzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ1LCA5MjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjI4NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQjAxNTEiCi0JCQkJCWNsaWVudCAgICAgCUA0OTQKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NSwgOTgyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMCwgOTgyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1MCwgMTAyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTQyODU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNCIgQDQ5OQotCQkJCWxvY2F0aW9uICAgCSg5MjEsIDEyMDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMDZFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDUiIEA1MDAKLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTkKLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzQ5IgotCQkJCQljbGllbnQgICAgIAlANDk5Ci0JCQkJCXN1cHBsaWVyICAgCUA0ODgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyMSwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA1MDEKLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTkKLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEyNTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5OTM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0QSIKLQkJCQkJY2xpZW50ICAgICAJQDQ5OQotCQkJCQlzdXBwbGllciAgIAlANDgxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEzNzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzksIDEyNTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4ODM0NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA1MDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMjIsIDcyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTM5OAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANTA1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxNjMyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjIzLCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANTA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDMsIDQwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU4IiBANTA3Ci0JCQkJbG9jYXRpb24gICAJKDIyMTYsIDYwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1OSIgQDUwOAotCQkJCQlQYXJlbnRfVmlldyAJQDUwNwotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJCWNsaWVudCAgICAgCUA1MDcKLQkJCQkJc3VwcGxpZXIgICAJQDUwNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxNiwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNTAxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDUwOQotCQkJCQlQYXJlbnRfVmlldyAJQDUwNwotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDYyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODI2MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM5IgotCQkJCQljbGllbnQgICAgIAlANTA3Ci0JCQkJCXN1cHBsaWVyICAgCUA0NzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTYsIDYzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjMzNjQ1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDUxMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOSwgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg4IiBANTEzCi0JCQkJbG9jYXRpb24gICAJKDE2NzYsIDEyMDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QkYwMTUwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4OSIgQDUxNAotCQkJCQlQYXJlbnRfVmlldyAJQDUxMwotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBNyIKLQkJCQkJY2xpZW50ICAgICAJQDUxMwotCQkJCQlzdXBwbGllciAgIAlANTEyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTM3MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkIiBANTE1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTEzCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU3LCAxMTA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MjU3NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE4IgotCQkJCQljbGllbnQgICAgIAlANTEzCi0JCQkJCXN1cHBsaWVyICAgCUA0ODAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOCwgMTEwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjE5NjMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg0IiBANTE4Ci0JCQkJbG9jYXRpb24gICAJKDE0MjksIDE0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1OUYwMDg2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NSIgQDUxOQotCQkJCQlQYXJlbnRfVmlldyAJQDUxOAotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNjkiCi0JCQkJCWNsaWVudCAgICAgCUA1MTgKLQkJCQkJc3VwcGxpZXIgICAJQDUxMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTAsIDE0MzgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANTIwCi0JCQkJCVBhcmVudF9WaWV3IAlANTE4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNSwgMTUwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzI1OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNkEiCi0JCQkJCWNsaWVudCAgICAgCUA1MTgKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDgsIDE0MzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI3LCAxMzkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NjM1MzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA1MjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MiIgQDUyNAotCQkJCWxvY2F0aW9uICAgCSg3NzcsIDE0MjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODUwMTBEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MyIgQDUyNQotCQkJCQlQYXJlbnRfVmlldyAJQDUyNAotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkEiCi0JCQkJCWNsaWVudCAgICAgCUA1MjQKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk2LCAxNDI1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb24iIEA1MjYKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjQKLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDE1MDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTkyNTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTgzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkIiCi0JCQkJCWNsaWVudCAgICAgCUA1MjQKLQkJCQkJc3VwcGxpZXIgICAJQDUyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU4LCAxNDI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIxLCAxMzg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzI0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzYiIEA1MjkKLQkJCQlsb2NhdGlvbiAgIAkoMjM3LCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTZCMDJDQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzciIEA1MzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjkKLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTYiCi0JCQkJCWNsaWVudCAgICAgCUA1MjkKLQkJCQkJc3VwcGxpZXIgICAJQDUyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMzcxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEA1MzEKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjkKLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4OCwgMTI0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTciCi0JCQkJCWNsaWVudCAgICAgCUA1MjkKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1LCAxMjQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANTM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4LCA3NDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk4IiBANTM1Ci0JCQkJbG9jYXRpb24gICAJKDcyOCwgNzc1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzM1MDM0MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTkiIEA1MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzUKLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJCWNsaWVudCAgICAgCUA1MzUKLQkJCQkJc3VwcGxpZXIgICAJQDQ4OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3MjgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDkzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4OCwgOTM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANTM3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTgsIDg4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjE0MDk0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUA1MzUKLQkJCQkJc3VwcGxpZXIgICAJQDUzNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzksIDc3NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MCwgODEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTUyNDM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA1NDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNywgNDA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTYwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MCIgQDU0MQotCQkJCWxvY2F0aW9uICAgCSgxNjI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkS2V5IiBANTQyCi0JCQkJCVBhcmVudF9WaWV3IAlANTQxCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MSwgNjA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRLZXkiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43OTcyOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJCWNsaWVudCAgICAgCUA1NDEKLQkJCQkJc3VwcGxpZXIgICAJQDU0MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjI5LCA1NzQpCi0JCQkJCSAgICAoMTU1NSwgNTc0KQotCQkJCQkgICAgKDE1NTUsIDUwMSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCA1MDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjIyLCA1MzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NzYxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQxIiBANTQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTQxCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2RiIKLQkJCQkJY2xpZW50ICAgICAJQDU0MQotCQkJCQlzdXBwbGllciAgIAlANTQwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MjksIDU3NCkKLQkJCQkJICAgICgxNjg5LCA1NzQpCi0JCQkJCSAgICAoMTY4OSwgNDQ0KQotCQkJCQkgICAgKDE2MTYsIDQ0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE2LCA0NDQpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NCIgQDU0NgotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDUiIEA1NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDYKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQkJY2xpZW50ICAgICAJQDU0NgotCQkJCQlzdXBwbGllciAgIAlANTQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA1MDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEA1NDgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDYKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExOSwgNjU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM5MjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5IgotCQkJCQljbGllbnQgICAgIAlANTQ2Ci0JCQkJCXN1cHBsaWVyICAgCUA1MDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTMsIDY1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5OTA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MiIgQDU1MQotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDMiIEA1NTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTEKLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCQljbGllbnQgICAgIAlANTUxCi0JCQkJCXN1cHBsaWVyICAgCUA1NDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBANTUzCi0JCQkJCVBhcmVudF9WaWV3IAlANTUxCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMywgNjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTEyMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTk4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJCWNsaWVudCAgICAgCUA1NTEKLQkJCQkJc3VwcGxpZXIgICAJQDUwNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNzE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgNjUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTI1MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANTU2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk1OTkKLQkJCQloZWlnaHQgICAgIAkyMDkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODYiIEA1NTcKLQkJCQlsb2NhdGlvbiAgIAkoMjM5NSwgNjA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUE3MDIzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg3IiBANTU4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCQljbGllbnQgICAgIAlANTU3Ci0JCQkJCXN1cHBsaWVyICAgCUA1NTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM5NSwgNjA2KQotCQkJCQkgICAgKDIzOTUsIDY1KQotCQkJCQkgICAgKDE2MTEsIDY1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibm90YXRpb25EZWNsYXJhdGlvbnMiIEA1NTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTcKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODksIDEwNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4OTc3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEIiCi0JCQkJCWNsaWVudCAgICAgCUA1NTcKLQkJCQkJc3VwcGxpZXIgICAJQDUwNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzk1LCA2MDYpCi0JCQkJCSAgICAoMjM5NSwgMTYzMykKLQkJCQkJICAgICgyMDk4LCAxNjMzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTgsIDE2MzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzQ0LCAxMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODc4MjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTgyIiBANTYyCi0JCQkJbG9jYXRpb24gICAJKDE3NzIsIDI0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVGRjAyNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4MyIgQDU2MwotCQkJCQlQYXJlbnRfVmlldyAJQDU2MgotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJCWNsaWVudCAgICAgCUA1NjIKLQkJCQkJc3VwcGxpZXIgICAJQDU1NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMjQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cERlZmluaXRpb25zIiBANTY0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTYyCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NiwgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXBEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzNTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQkJY2xpZW50ICAgICAJQDU2MgotCQkJCQlzdXBwbGllciAgIAlANTA2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3NzIsIDI0OSkKLQkJCQkJICAgICgxODMyLCAyNDkpCi0JCQkJCSAgICAoMTgzMiwgMzk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MzIsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDM0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM3ODY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3OCIgQDU2NwotCQkJCWxvY2F0aW9uICAgCSgyMzQ2LCA1MTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzkiIEA1NjgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjcKLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcyLCAxODU3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy42MzAwNzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThCIgotCQkJCQljbGllbnQgICAgIAlANTY3Ci0JCQkJCXN1cHBsaWVyICAgCUA1NTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0NiwgNTE4KQotCQkJCQkgICAgKDIzNDYsIDE0OSkKLQkJCQkJICAgICgxNjExLCAxNDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMTQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIgQDU3MAotCQkJCQlQYXJlbnRfVmlldyAJQDU2NwotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDgsIDE5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ5OTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQkJY2xpZW50ICAgICAJQDU2NwotCQkJCQlzdXBwbGllciAgIAlANTEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNDYsIDUxOCkKLQkJCQkJICAgICgyMzQ2LCAxNDQxKQotCQkJCQkgICAgKDIxNjYsIDE0NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2NiwgMTQ0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOTksIDE5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0ODg2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODAiIEA1NzMKLQkJCQlsb2NhdGlvbiAgIAkoMjAzLCAxNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMDQ5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODEiIEA1NzQKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzMKLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCQljbGllbnQgICAgIAlANTczCi0JCQkJCXN1cHBsaWVyICAgCUA1NTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb25zIiBANTc1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTczCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ5LCAxOTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDc1NzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzdFIgotCQkJCQljbGllbnQgICAgIAlANTczCi0JCQkJCXN1cHBsaWVyICAgCUA1MzQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjAzLCAxNTkpCi0JCQkJCSAgICAoMTA0LCAxNTkpCi0JCQkJCSAgICAoMTA0LCA3ODQpCi0JCQkJCSAgICAoMTg5LCA3ODQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODksIDc4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NSwgMjAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk3MDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg0IiBANTc4Ci0JCQkJbG9jYXRpb24gICAJKDEwODcsIDMyOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExNzAxRUQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NSIgQDU3OQotCQkJCQlQYXJlbnRfVmlldyAJQDU3OAotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQkJY2xpZW50ICAgICAJQDU3OAotCQkJCQlzdXBwbGllciAgIAlANTU2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAyNjQpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU4MAotCQkJCQlQYXJlbnRfVmlldyAJQDU3OAotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3NSwgMzM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA5NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjdEIgotCQkJCQljbGllbnQgICAgIAlANTc4Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTgsIDMzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTA3MTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3NiIgQDU4MwotCQkJCWxvY2F0aW9uICAgCSg0OCwgMzIwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc3IiBANTg0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTgzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJCWNsaWVudCAgICAgCUA1ODMKLQkJCQkJc3VwcGxpZXIgICAJQDU1NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OSwgMzIyKQotCQkJCQkgICAgKDQ5LCA2OCkKLQkJCQkJICAgICgxMDEzLCA2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgNjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiIEA1ODUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODMKLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM4LCAxMDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk4NTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQkJY2xpZW50ICAgICAJQDU4MwotCQkJCQlzdXBwbGllciAgIAlANTIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5LCAzMjIpCi0JCQkJCSAgICAoNDksIDE0MTUpCi0JCQkJCSAgICAoMTc0LCAxNDE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDE0MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MSwgMTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk2NzA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDU4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NSwgNDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNTAxCi0JCQkJaGVpZ2h0ICAgICAJOTcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjYiIEA1ODkKLQkJCQlsb2NhdGlvbiAgIAkoNDk5LCA1ODkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNTkwMTk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjciIEA1OTAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODkKLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFMyIKLQkJCQkJY2xpZW50ICAgICAJQDU4OQotCQkJCQlzdXBwbGllciAgIAlANTg4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5OSwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUyLCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIiBANTkxCi0JCQkJCVBhcmVudF9WaWV3IAlANTg5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgxMSwgNTg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAk2LjUyMDgzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUVEIgotCQkJCQljbGllbnQgICAgIAlANTg5Ci0JCQkJCXN1cHBsaWVyICAgCUA1ODgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDk5LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDcsIDQ5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5OSwgNTU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIwIiBANTk0Ci0JCQkJbG9jYXRpb24gICAJKDI0MSwgNjEzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDA1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIxIiBANTk1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQkYiCi0JCQkJCWNsaWVudCAgICAgCUA1OTQKLQkJCQkJc3VwcGxpZXIgICAJQDU4OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTk2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwOCwgNjk0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODY0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0MwIgotCQkJCQljbGllbnQgICAgIAlANTk0Ci0JCQkJCXN1cHBsaWVyICAgCUA1MzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA3MzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDY4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjEwMTY5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMiIgQDU5OQotCQkJCWxvY2F0aW9uICAgCSg4MzcsIDQ2MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMyIgQDYwMAotCQkJCQlQYXJlbnRfVmlldyAJQDU5OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJCWNsaWVudCAgICAgCUA1OTkKLQkJCQkJc3VwcGxpZXIgICAJQDU4OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDQ2MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANjAxCi0JCQkJCVBhcmVudF9WaWV3IAlANTk5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1MTQ2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQkJY2xpZW50ICAgICAJQDU5OQotCQkJCQlzdXBwbGllciAgIAlANTQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQ2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgNDA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA0MzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc0IiBANjA0Ci0JCQkJbG9jYXRpb24gICAJKDU0MSwgMjQ2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRThEMDFCRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc1IiBANjA1Ci0JCQkJCVBhcmVudF9WaWV3IAlANjA0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTgiCi0JCQkJCWNsaWVudCAgICAgCUA2MDQKLQkJCQkJc3VwcGxpZXIgICAJQDU1NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAyNDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb25zIiBANjA2Ci0JCQkJCVBhcmVudF9WaWV3IAlANjA0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MywgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwOTMwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OSIKLQkJCQkJY2xpZW50ICAgICAJQDYwNAotCQkJCQlzdXBwbGllciAgIAlANTg4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDU0MSwgMjQ2KQotCQkJCQkgICAgKDIyNCwgMjQ2KQotCQkJCQkgICAgKDIyNCwgNDAwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI0LCA0MDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODYsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyOCIgQDYwOQotCQkJCWxvY2F0aW9uICAgCSgzNTMsIDYyMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQyREJERDAyOTciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyOSIgQDYxMAotCQkJCQlQYXJlbnRfVmlldyAJQDYwOQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTFFIgotCQkJCQljbGllbnQgICAgIAlANjA5Ci0JCQkJCXN1cHBsaWVyICAgCUA1ODgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzUzLCA2MjEpCi0JCQkJCSAgICAoMzA2LCA2MjEpCi0JCQkJCSAgICAoMzA2LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDYsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwIiBANjExCi0JCQkJCVBhcmVudF9WaWV3IAlANjA5Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3OSwgNjM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJNC44MDg1MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJCWNsaWVudCAgICAgCUA2MDkKLQkJCQkJc3VwcGxpZXIgICAJQDU4OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNTMsIDYyMSkKLQkJCQkJICAgICg0MDAsIDYyMSkKLQkJCQkJICAgICg0MDAsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNDk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUwLCA1ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjk3NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2OUU3ODYwMkM1IgotCQkJdGl0bGUgICAgICAJIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA2MTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDEyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDEwNykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHRhcmdldE5hbWVzcGFjZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTUzNAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDYxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTY3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANjE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMTY4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTUyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTU4NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc3Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGRlcml2YXRpb25NZXRob2QgOiBYU0REZXJpdmF0aW9uTWV0aG9kID0gcmVzdHJpY3Rpb24iCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEQ29tcGxleEZpbmFsIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iCi0JCQkJCSIrIGNvbnRlbnRUeXBlQ2F0ZWdvcnkgOiBYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCQkiPDwwLi4qPj4gKyBwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJMTE5MgotCQkJCWhlaWdodCAgICAgCTMzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MTcKLQkJCQlsb2NhdGlvbiAgIAkoNDYzLCAzNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYxNAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDYzLCAzNjIpCi0JCQkJICAgICg0NjMsIDIyMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDYxOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTc5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTYyOAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSIKLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTY0NgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA2MTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDE0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDk4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyByZXF1aXJlZCA6IGJvb2xlYW4iCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANjIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg5MCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkxMjk0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSA6IFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQkJIjw8MC4uKj4+ICsgbmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIKLQkJCQkJIisgcHJvY2Vzc0NvbnRlbnRzIDogWFNEUHJvY2Vzc0NvbnRlbnRzIikpCi0JCQkJd2lkdGggICAgICAJMTMwNAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANjIxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTQ0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDEzODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJNTk2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA2MjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDUxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQ5MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYyMwotCQkJCWxvY2F0aW9uICAgCSgyOTQsIDY5NykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjIyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyOTQsIDY5NykKLQkJCQkgICAgKDI5NCwgNjA1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDYyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjU2LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTUsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANjI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgNTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDE4LCA0NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MjYKLQkJCQlsb2NhdGlvbiAgIAkoMjY4NCwgOTYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2MjUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI2ODQsIDk2MikKLQkJCQkgICAgKDI2ODQsIDU3NikpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb3NpdG9yIiBANjI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDExMTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvc2l0b3IiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTA2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUI2MjAwMzciCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbnQiIEA2MjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlFMjYwMUFFIgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REZXJpdmF0aW9uTWV0aG9kIiBANjI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIyMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODZBMEIwMDBDRSIKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiIEA2MzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCA4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTFFMDAyNzIiCi0JCQkJd2lkdGggICAgICAJNjI1Ci0JCQkJaGVpZ2h0ICAgICAJMzAwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiIEA2MzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjExNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIwNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NkE3OUYwM0EyIgotCQkJCXdpZHRoICAgICAgCTUxNAotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANjMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTYwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNTE2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvY2Vzc0NvbnRlbnRzIiBANjMzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMjI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxMDYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY4QzcwMjg0IgotCQkJCXdpZHRoICAgICAgCTQzOAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aFZhcmlldHkiIEA2MzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkZCODkwMzNBIgotCQkJCXdpZHRoICAgICAgCTM4MQotCQkJCWhlaWdodCAgICAgCTI1MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDYzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDE4NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3ODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTczOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE4NDgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQxCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxpc3QiCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyB1bmlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA2MzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxOTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxODkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMjAwMSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM4MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiIEA2MzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTA3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzU5MTAwQUUiCi0JCQkJd2lkdGggICAgICAJNjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBANjM4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTExNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTE3NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgc3Vic3RpdHV0aW9uIgotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBANjM5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMjI3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjIxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjI3MykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiIEA2NDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAyMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjE1NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxMDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1RUEwMDIzIgotCQkJCXdpZHRoICAgICAgCTY5NgotCQkJCWhlaWdodCAgICAgCTI5NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA2NDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCA4ODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgNzQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDgwOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkxMzk2Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5pbGxhYmxlIDogYm9vbGVhbiIKLQkJCQkJIjw8MC4uKj4+ICsgZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIjw8MC4uKj4+ICsgc3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIDogWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAkxNDA0Ci0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUA2NDEKLQkJCQlzdXBwbGllciAgIAlANjIyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjgxLCA3MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDYyMykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA2NDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDgxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDY0NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjAsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDY0NAotCQkJCXN1cHBsaWVyICAgCUA2MjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODYyLCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODYyLCA5NjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDY0NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEzMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjgsIDEyNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NDcKLQkJCQlsb2NhdGlvbiAgIAkoMjM3NSwgMTQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjQ2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMzc1LCAxNDY1KQotCQkJCSAgICAoMjM3NSwgMTM3NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlANjQ2Ci0JCQkJc3VwcGxpZXIgICAJQDYyNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNjgsIDEyNDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNjgsIDk2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQ5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA2MTYKLQkJCQlzdXBwbGllciAgIAlANjQ2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgxOCwgMTUxMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxOCwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA2MTgKLQkJCQlzdXBwbGllciAgIAlANjQ2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwNiwgMTUwNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNiwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NDcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANjUxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOCwgMTEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA2NTEKLQkJCQlzdXBwbGllciAgIAlANjI1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExNSwgMTA4OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgOTYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYyNikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDY1MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDQ2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJMTE1MAotCQkJCWhlaWdodCAgICAgCTE0NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQljbGllbnQgICAgIAlANjUzCi0JCQkJc3VwcGxpZXIgICAJQDYxNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjgsIDQ1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OCwgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYxNykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDY1NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzgsIDcwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk1MDIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANjU2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAyNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiCi0JCQkJY2xpZW50ICAgICAJQDY1NQotCQkJCXN1cHBsaWVyICAgCUA2MTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjkwLCA2OTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTAsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA2NDMKLQkJCQlzdXBwbGllciAgIAlANjIyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxLCA4MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDYyMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDYyMgotCQkJCXN1cHBsaWVyICAgCUA2MTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzIsIDQxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzcyLCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjE3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQljbGllbnQgICAgIAlANjI1Ci0JCQkJc3VwcGxpZXIgICAJQDYxNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2ODcsIDQ0OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4NywgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYxNykpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIgotCQkJcXVpZCAgICAgICAJIjNCNkMzMjY1MDA1RiIKLQkJCXRpdGxlICAgICAgCSI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IiBANjYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgODk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgODQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGaXhlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIgotCQkJCXdpZHRoICAgICAgCTMzOAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA2NjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA4OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNCwgODQ1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJd2lkdGggICAgICAJNDUwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEA2NjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjYsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDY2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzcsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjY1Ci0JCQkJbG9jYXRpb24gICAJKDcxOCwgMTA0OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjYyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3MTgsIDEwNDkpCi0JCQkJICAgICg3MTgsIDk1OSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEA2NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgOTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzk5LCA4NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBANjY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MywgODcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJd2lkdGggICAgICAJMzg4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEA2NjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAzMiwgMTEwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMTA0OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBANjY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTksIDEwNDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCQl3aWR0aCAgICAgIAkzODgKLQkJCQloZWlnaHQgICAgIAkxMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEA2NzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM0OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDY3MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwNSwgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY3MgotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDEyNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ0LCAxMjYyKQotCQkJCSAgICAoMTQ0LCA5NjQpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEA2NzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMTU1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDY3NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEA2NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBANjc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE5MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDE4NTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDY3NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MiwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJd2lkdGggICAgICAJNDQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBANjc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTkwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0LCAxODUyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDY3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyLCAyMDU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBANjgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTgsIDIwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjgxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOUQwM0M3IgotCQkJCWNsaWVudCAgICAgCUA2NjMKLQkJCQlzdXBwbGllciAgIAlANjYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzk0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTQsIDEwNDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY4MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODYyMDA0NSIKLQkJCQljbGllbnQgICAgIAlANjc0Ci0JCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjcyKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA2ODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAxMTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkNBNTAzOEQiCi0JCQkJY2xpZW50ICAgICAJQDY2NAotCQkJCXN1cHBsaWVyICAgCUA2NjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMDQ5KQotCQkJCWRyYXdTdXBwbGllciAJQDY2NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2ODUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4MDAyREYiCi0JCQkJY2xpZW50ICAgICAJQDY3MAotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjMsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWQiIEA2ODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTMyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEyNzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNTIwMkU0IgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eSIgQDY4NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNUQwMDlCIgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlIiBANjg4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCRUVEMEY2MDM0MiIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkyODcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6VmFsdWUiIEA2ODkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAyMDk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwNjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlZhbHVlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQzA0MEI1QjAzMUYiCi0JCQkJd2lkdGggICAgICAJNjM2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNjEwMzM3IgotCQkJCWNsaWVudCAgICAgCUA2NzkKLQkJCQlzdXBwbGllciAgIAlANjYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDIwNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEA2OTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDEzNzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTMyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTM4MCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEA2OTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxMzc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTM4MCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQyNDAwOTgiCi0JCQkJY2xpZW50ICAgICAJQDY5MQotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzUsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMzEwM0FEIgotCQkJCWNsaWVudCAgICAgCUA2OTIKLQkJCQlzdXBwbGllciAgIAlANjYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgMTMwOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjk1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTIwMzUzIgotCQkJCWNsaWVudCAgICAgCUA2NzcKLQkJCQlzdXBwbGllciAgIAlANjkxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg1LCAxNjY0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODUsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjgzMDNCOCIKLQkJCQljbGllbnQgICAgIAlANjc1Ci0JCQkJc3VwcGxpZXIgICAJQDY5MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDAsIDE2NjQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDAsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjhFMDMwOSIKLQkJCQljbGllbnQgICAgIAlANjc2Ci0JCQkJc3VwcGxpZXIgICAJQDY5MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjIsIDE4NDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjIsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M0MDBDMCIKLQkJCQljbGllbnQgICAgIAlANjcxCi0JCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTQ4NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I3RDAwRkMiCi0JCQkJY2xpZW50ICAgICAJQDY3MwotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I5OTAwMTYiCi0JCQkJY2xpZW50ICAgICAJQDY4MAotCQkJCXN1cHBsaWVyICAgCUA2NjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc1LCAyMDQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY3MikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA3MDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDM2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAzMTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTQwNgotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3MDIKLQkJCQlsb2NhdGlvbiAgIAkoMzY2LCA1MjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDcwMQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzY2LCA1MjIpCi0JCQkJICAgICgzNjYsIDQzMCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDcwMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQsIDU3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcwNAotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDc4MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANzAzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyNzIsIDc4MSkKLQkJCQkgICAgKDI3MiwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzA1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCWNsaWVudCAgICAgCUA2NjIKLQkJCQlzdXBwbGllciAgIAlANzAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTk0LCA4MzMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5NCwgNzgxKQotCQkJCWRyYXdTdXBwbGllciAJQDcwNCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIgQDcwNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZ1bmRhbWVudGFsRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiCi0JCQkJd2lkdGggICAgICAJNDcwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcwNwotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDc4OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANzA2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3NjgsIDc4OSkKLQkJCQkgICAgKDc2OCwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzA4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NTkwMTJDIgotCQkJCWNsaWVudCAgICAgCUA2NjYKLQkJCQlzdXBwbGllciAgIAlANzA2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA1MCwgODYwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjNDMDIyNCIKLQkJCQljbGllbnQgICAgIAlANjY3Ci0JCQkJc3VwcGxpZXIgICAJQDcwNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjUsIDg2MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyNSwgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDcwNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0RjAxMzEiCi0JCQkJY2xpZW50ICAgICAJQDY2OAotCQkJCXN1cHBsaWVyICAgCUA3MDYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjM3LCAxMDM2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM3LCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcxMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjQyMDA3NCIKLQkJCQljbGllbnQgICAgIAlANjY5Ci0JCQkJc3VwcGxpZXIgICAJQDcwNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDEwMzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NiwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDEwNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk2NTYKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMyIiBANzEzCi0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTc4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1OTcxMDJFQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMzIiBANzE0Ci0JCQkJCVBhcmVudF9WaWV3IAlANzEzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA5LCAyMzUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQkJY2xpZW50ICAgICAJQDcxMwotCQkJCQlzdXBwbGllciAgIAlANzAxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3NSwgMTc4KQotCQkJCQkgICAgKDU1MCwgMTc4KQotCQkJCQkgICAgKDU1MCwgMzA2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCAzMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDcxNgotCQkJCQlQYXJlbnRfVmlldyAJQDcxMwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODMxMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJCWNsaWVudCAgICAgCUA3MTMKLQkJCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAxNzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcxOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYxLCAyMTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjUwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTQiIEA3MTkKLQkJCQlsb2NhdGlvbiAgIAkoMzY5LCA3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwMjAzQTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0cyIgQDcyMAotCQkJCQlQYXJlbnRfVmlldyAJQDcxOQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQ5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA2NSIKLQkJCQkJY2xpZW50ICAgICAJQDcxOQotCQkJCQlzdXBwbGllciAgIAlANzAzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDM2OSwgNzIpCi0JCQkJCSAgICAoMTAwLCA3MikKLQkJCQkJICAgICgxMDAsIDU2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwLCA1NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc5MDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NSIgQDcyMwotCQkJCQlQYXJlbnRfVmlldyAJQDcxOQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDMxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNTEiCi0JCQkJCWNsaWVudCAgICAgCUA3MTkKLQkJCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzYiIEA3MjUKLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgNTA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyNgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOCwgNDQ5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTYwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM3IiBANzI3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzI1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ2LCAzNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERiIKLQkJCQkJY2xpZW50ICAgICAJQDcyNQotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNDg3LCA1MDgpCi0JCQkJCSAgICAoMTQ4NywgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIml0ZW1UeXBlRGVmaW5pdGlvbiIgQDcyOQotCQkJCQlQYXJlbnRfVmlldyAJQDcyNQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2l0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjIxMTUzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBFMCIKLQkJCQkJY2xpZW50ICAgICAJQDcyNQotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNTkwLCA1MDgpCi0JCQkJCSAgICAoMTU5MCwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDQ2OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAzOTg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NiIgQDczMgotCQkJCWxvY2F0aW9uICAgCSgxNzI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QjcwMjA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTciIEA3MzMKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzIKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDM1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU4IgotCQkJCQljbGllbnQgICAgIAlANzMyCi0JCQkJCXN1cHBsaWVyICAgCUA3MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE2NzgsIDU3NCkKLQkJCQkJICAgICgxNjc4LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OCwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWVtYmVyVHlwZURlZmluaXRpb25zIiBANzM1Ci0JCQkJCVBhcmVudF9WaWV3IAlANzMyCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA2NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWVtYmVyVHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMjY5MjMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCQljbGllbnQgICAgIAlANzMyCi0JCQkJCXN1cHBsaWVyICAgCUA3MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE3ODEsIDU3NCkKLQkJCQkJICAgICgxNzgxLCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMCwgNTIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMTIxMjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTk4IiBANzM4Ci0JCQkJbG9jYXRpb24gICAJKDc0OCwgMjY5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNjMyMDFEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnVuZGFtZW50YWxGYWNldHMiIEA3MzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MzgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgMzEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Z1bmRhbWVudGFsRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDA5MDkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCQljbGllbnQgICAgIAlANzM4Ci0JCQkJCXN1cHBsaWVyICAgCUA3MDYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzQ4LCAyNjkpCi0JCQkJCSAgICAoNjU5LCAyNjkpCi0JCQkJCSAgICAoNjU5LCA1NjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTksIDU2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDczOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyOCwgMzg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzgwMjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5OSIgQDc0MgotCQkJCQlQYXJlbnRfVmlldyAJQDczOAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1MiwgMjI4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNTkiCi0JCQkJCWNsaWVudCAgICAgCUA3MzgKLQkJCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAyNjkpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMCIgQDc0NAotCQkJCWxvY2F0aW9uICAgCSgxMTc1LCAzOTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDEiIEA3NDUKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDQKLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDMxNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCQljbGllbnQgICAgIAlANzQ0Ci0JCQkJCXN1cHBsaWVyICAgCUA3MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDExMzUsIDM5NikKLQkJCQkJICAgICgxMTM1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANzQ3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzQ0Ci0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA0NDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuNTMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANzQ0Ci0JCQkJCXN1cHBsaWVyICAgCUA3MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDEyMTUsIDM5NikKLQkJCQkJICAgICgxMjE1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxNSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgMzU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk2MTU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMiIgQDc1MAotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0NDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDMiIEA3NTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTAKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNjgsIDMyNykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjJGIgotCQkJCQljbGllbnQgICAgIAlANzUwCi0JCQkJCXN1cHBsaWVyICAgCUA3MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQotCQkJCQkgICAgKDEzMDksIDQ0NikKLQkJCQkJICAgICgxMzA5LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwOSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iIEA3NTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTAKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDQsIDUwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQkJY2xpZW50ICAgICAJQDc1MAotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNjAsIDQ0NikKLQkJCQkJICAgICgxNDEyLCA0NDYpCi0JCQkJCSAgICAoMTQxMiwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTIsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzMsIDQwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYyMTQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANzU2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgNTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzU2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgMzc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDg4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBsaXN0IgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgdW5pb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDc1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDkyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzdCMDM5NiIKLQkJCQljbGllbnQgICAgIAlANzA2Ci0JCQkJc3VwcGxpZXIgICAJQDcwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MSwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTEsIDUyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzU5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCWNsaWVudCAgICAgCUA3MDMKLQkJCQlzdXBwbGllciAgIAlANzAxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA1NjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgNTIyKQotCQkJCWRyYXdTdXBwbGllciAJQDcwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NjAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJY2xpZW50ICAgICAJQDcwMQotCQkJCXN1cHBsaWVyICAgCUA2ODMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjYsIDMwNikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY2LCAyMTUpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2Qzg4MDFCNCIKLQkJCQljbGllbnQgICAgIAlANjYxCi0JCQkJc3VwcGxpZXIgICAJQDcwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDc4MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MDQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzYyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTkwMjgxIgotCQkJCWNsaWVudCAgICAgCUA2NzgKLQkJCQlzdXBwbGllciAgIAlANjkxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwLCAxODQwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAsIDE0NDQpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCNjlENjhEMDBEMiIKLQkJCXRpdGxlICAgICAgCSI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANzYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJd2lkdGggICAgICAJMzU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANzY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MiwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgMTUwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNiwgMTQ2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMzA0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjYzLCAyNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANzY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTMxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANzY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA3MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA2NjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA3NjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA3NzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDU0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDUwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDc3MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzcxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDY4LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANzcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTE3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDc3MwotCQkJCWxvY2F0aW9uICAgCSgxOTk0LCAxNDEyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA3NzIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5OTQsIDE0MTIpCi0JCQkJICAgICgxOTk0LCAxMjcxKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzc0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA3NjUKLQkJCQlzdXBwbGllciAgIAlANzcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA4NCwgMTQ0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA4NCwgMTQxMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3NzMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDc3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MCwgODIxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDAyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTIsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQl3aWR0aCAgICAgIAkyMzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANzc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDg0LCAzNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDc3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgMTgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA3NzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDY3LCAxNjc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNjY5Ci0JCQkJaGVpZ2h0ICAgICAJMTAwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3ODAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDc3OQotCQkJCXN1cHBsaWVyICAgCUA3NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTcyLCAxNjYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcyLCAxNDEyKQotCQkJCWRyYXdTdXBwbGllciAJQDc3MykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDc4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgsIDk4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA3ODIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODgsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDc4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA3ODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MiwgNjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTczOAotCQkJCWhlaWdodCAgICAgCTU0MwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDc4NQotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzkiIEA3ODYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3ODUKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzM0MiCi0JCQkJCWNsaWVudCAgICAgCUA3ODUKLQkJCQkJc3VwcGxpZXIgICAJQDc2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjcxLCAxMzU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc4NwotCQkJCQlQYXJlbnRfVmlldyAJQDc4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk4LCAxMzIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS4xMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJCWNsaWVudCAgICAgCUA3ODUKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4NjUsIDEzNTkpCi0JCQkJCSAgICAoOTI1LCAxMzU5KQotCQkJCQkgICAgKDkyNSwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEyNzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjQyMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjIiIEA3OTAKLQkJCQlsb2NhdGlvbiAgIAkoNzEzLCA3MDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEYwMjEyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjMiIEA3OTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTAKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwQzkiCi0JCQkJCWNsaWVudCAgICAgCUA3OTAKLQkJCQkJc3VwcGxpZXIgICAJQDc2OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDcwOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3OTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTAKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNjY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTIzOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQkJY2xpZW50ICAgICAJQDc5MAotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgNzA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk2LCA3NTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MzU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTYiIEA3OTUKLQkJCQlsb2NhdGlvbiAgIAkoNzE5LCAxMTkzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE1MDA4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU3IiBANzk2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzk1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMDk2IgotCQkJCQljbGllbnQgICAgIAlANzk1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTE5MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3OTcKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTUKLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMTE0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDY5OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwQTAiCi0JCQkJCWNsaWVudCAgICAgCUA3OTUKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMTkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCAxMjQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDQxNjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE2IiBAODAwCi0JCQkJbG9jYXRpb24gICAJKDc4NSwgNTUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE3IiBAODAxCi0JCQkJCVBhcmVudF9WaWV3IAlAODAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDIzRiIKLQkJCQkJY2xpZW50ICAgICAJQDgwMAotCQkJCQlzdXBwbGllciAgIAlANzcwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNTUwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgwMgotCQkJCQlQYXJlbnRfVmlldyAJQDgwMAotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OSwgNTE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzA3MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJCWNsaWVudCAgICAgCUA4MDAKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODUsIDU1MCkKLQkJCQkJICAgICg4ODQsIDU1MCkKLQkJCQkJICAgICg4ODQsIDY3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyOTczMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODgiIEA4MDUKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgNDA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg5IiBAODA2Ci0JCQkJCVBhcmVudF9WaWV3IAlAODA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTY1IgotCQkJCQljbGllbnQgICAgIAlAODA1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDEzNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI0LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC42NjU0MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCQljbGllbnQgICAgIAlAODA1Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg0Mzg3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNCIgQDgxMAotCQkJCWxvY2F0aW9uICAgCSgxNzUyLCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMjkxMDE1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA1IiBAODExCi0JCQkJCVBhcmVudF9WaWV3IAlAODEwCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxOUYiCi0JCQkJCWNsaWVudCAgICAgCUA4MTAKLQkJCQkJc3VwcGxpZXIgICAJQDc3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzUyLCAxMDM0KQotCQkJCQkgICAgKDE4MTIsIDEwMzQpCi0JCQkJCSAgICAoMTgxMiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTAKLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0MywgOTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTYwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDFBOSIKLQkJCQkJY2xpZW50ICAgICAJQDgxMAotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgMTAzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODQsIDEwNjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MDMzMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDYiIEA4MTUKLQkJCQlsb2NhdGlvbiAgIAkoMTg5NiwgODgxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOTAwNkNGMDA4OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA3IiBAODE2Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE1Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQkJY2xpZW50ICAgICAJQDgxNQotCQkJCQlzdXBwbGllciAgIAlANzcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE4OTYsIDg4MSkKLQkJCQkJICAgICgxOTU2LCA4ODEpCi0JCQkJCSAgICAoMTk1NiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTU2LCAxMTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGVyaXZhdGlvbkFubm90YXRpb24iIEA4MTcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTUKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCA4NDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1NDIzNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQkJY2xpZW50ICAgICAJQDgxNQotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA4ODEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg5LCA5MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNTA4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDgiIEA4MjAKLQkJCQlsb2NhdGlvbiAgIAkoMjA0MCwgNzE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjMzMDI2NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA5IiBAODIxCi0JCQkJCVBhcmVudF9WaWV3IAlAODIwCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyODQiCi0JCQkJCWNsaWVudCAgICAgCUA4MjAKLQkJCQkJc3VwcGxpZXIgICAJQDc3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMDQwLCA3MTUpCi0JCQkJCSAgICAoMjEwMCwgNzE1KQotCQkJCQkgICAgKDIxMDAsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMCwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODIyCi0JCQkJCVBhcmVudF9WaWV3IAlAODIwCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDY4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjhFIgotCQkJCQljbGllbnQgICAgIAlAODIwCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDc0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA5MzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyNiIgQDgyNQotCQkJCWxvY2F0aW9uICAgCSg2NjgsIDg2NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNDAwNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNyIgQDgyNgotCQkJCQlQYXJlbnRfVmlldyAJQDgyNQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMENBIgotCQkJCQljbGllbnQgICAgIAlAODI1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDczLCA4NjUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODI3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODI1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgODI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzNDE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBENCIKLQkJCQkJY2xpZW50ICAgICAJQDgyNQotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgODY1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAxLCA5MDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4MjA1MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzAiIEA4MzAKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgMTY3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMxIiBAODMxCi0JCQkJCVBhcmVudF9WaWV3IAlAODMwCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUM0IgotCQkJCQljbGllbnQgICAgIAlAODMwCi0JCQkJCXN1cHBsaWVyICAgCUA3NzYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ3MiwgMTY3KQotCQkJCQkgICAgKDE0NzIsIDcyKQotCQkJCQkgICAgKDE4ODMsIDcyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODMsIDcyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgzMgotCQkJCQlQYXJlbnRfVmlldyAJQDgzMAotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzYzMDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUNFIgotCQkJCQljbGllbnQgICAgIAlAODMwCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTksIDYxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkzNTc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgwIiBAODM1Ci0JCQkJbG9jYXRpb24gICAJKDkyNywgMzUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjA2MDI5MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODEiIEA4MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MzUKLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcxIgotCQkJCQljbGllbnQgICAgIAlAODM1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCAzNTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODM3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAzMTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjgxNjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MiIKLQkJCQkJY2xpZW50ICAgICAJQDgzNQotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkyNywgMzUwKQotCQkJCQkgICAgKDk4NywgMzUwKQotCQkJCQkgICAgKDk4NywgNjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg3LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM3LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MzM0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MiIgQDg0MAotCQkJCWxvY2F0aW9uICAgCSgxMDI3LCAyMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREMwMkY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MyIgQDg0MQotCQkJCQlQYXJlbnRfVmlldyAJQDg0MAotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDIzOCIKLQkJCQkJY2xpZW50ICAgICAJQDg0MAotCQkJCQlzdXBwbGllciAgIAlANzc4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDIyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDAKLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDA2MjUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjQyIgotCQkJCQljbGllbnQgICAgIAlAODQwCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTAyNywgMjIyKQotCQkJCQkgICAgKDEwODcsIDIyMikKLQkJCQkJICAgICgxMDg3LCA2NzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNjEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTAwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgyNTgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk2IiBAODQ1Ci0JCQkJbG9jYXRpb24gICAJKDE0OTQsIDE0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2ODgwMUMyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NyIgQDg0NgotCQkJCQlQYXJlbnRfVmlldyAJQDg0NQotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTExIgotCQkJCQljbGllbnQgICAgIAlAODQ1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NzkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxNjYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudEFubm90YXRpb24iIEA4NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDUKLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NiwgMTM1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50QW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3NzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExQiIKLQkJCQkJY2xpZW50ICAgICAJQDg0NQotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDMsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzAwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTAiIEA4NTAKLQkJCQlsb2NhdGlvbiAgIAkoNjM3LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE3MDJDOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUxIiBAODUxCi0JCQkJCVBhcmVudF9WaWV3IAlAODUwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTgwM0UyIgotCQkJCQljbGllbnQgICAgIAlAODUwCi0JCQkJCXN1cHBsaWVyICAgCUA3ODEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxMSwgMTAyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTAKLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxMCwgOTc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODg4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE5MDAwNCIKLQkJCQkJY2xpZW50ICAgICAJQDg1MAotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDEwMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEwNjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMDA4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MCIgQDg1NQotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA2MDcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTcwMTAyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MSIgQDg1NgotCQkJCQlQYXJlbnRfVmlldyAJQDg1NQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MSIKLQkJCQkJY2xpZW50ICAgICAJQDg1NQotCQkJCQlzdXBwbGllciAgIAlANzgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1ODEsIDYwNykKLQkJCQkJICAgICgxNTgxLCA1NDcpCi0JCQkJCSAgICAoMTY3OSwgNTQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzksIDU0NykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODU1Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA0NjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTg4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTIiCi0JCQkJCWNsaWVudCAgICAgCUA4NTUKLQkJCQkJc3VwcGxpZXIgICAJQDc4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNjIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEwIiBAODYwCi0JCQkJbG9jYXRpb24gICAJKDg0OSwgMTQ5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMTAyNkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMSIgQDg2MQotCQkJCQlQYXJlbnRfVmlldyAJQDg2MAotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDFGOSIKLQkJCQkJY2xpZW50ICAgICAJQDg2MAotCQkJCQlzdXBwbGllciAgIAlANzgzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODYyCi0JCQkJCVBhcmVudF9WaWV3IAlAODYwCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDIsIDE0NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTg4MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMjAzIgotCQkJCQljbGllbnQgICAgIAlAODYwCi0JCQkJCXN1cHBsaWVyICAgCUA3ODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODQ5LCAxNDk2KQotCQkJCQkgICAgKDEwNjIsIDE0OTYpCi0JCQkJCSAgICAoMTA2MiwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDYyLCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNSwgMTI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyNjkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxMiIgQDg2NQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE1NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjMwMDA1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTMiIEA4NjYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjUKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMjciCi0JCQkJCWNsaWVudCAgICAgCUA4NjUKLQkJCQkJc3VwcGxpZXIgICAJQDc4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNTY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4NjcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjUKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODY4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDE1MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwNDk1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMzMiIKLQkJCQkJY2xpZW50ICAgICAJQDg2NQotCQkJCQlzdXBwbGllciAgIAlANzg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk1MiwgMTU2NSkKLQkJCQkJICAgICgxMjAwLCAxNTY1KQotCQkJCQkgICAgKDEyMDAsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTQsIDEyNzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg3MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQljbGllbnQgICAgIAlANzY2Ci0JCQkJc3VwcGxpZXIgICAJQDc3NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDI0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgMTM1KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDc4MgotCQkJCXN1cHBsaWVyICAgCUA3NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTk3LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTcsIDM1OSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJcXVpZCAgICAgICAJIjNCNkFENzREMDNDNCIKLQkJCXRpdGxlICAgICAgCSI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDg3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDg3MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODczCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCXdpZHRoICAgICAgCTU0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA4NzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDk5MSwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA4NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTYsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODc2Ci0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDU2MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODc1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMzYwLCA1NjEpCi0JCQkJICAgICgxMzYwLCA0NzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIgQDg3NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREluY2x1ZGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiCi0JCQkJd2lkdGggICAgICAJMjU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAODc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAODc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDg4MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzUsIDExNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJODY5Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ4IiBAODgxCi0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDEyMDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDkiIEA4ODIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODEKLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUA4ODEKLQkJCQkJc3VwcGxpZXIgICAJQDg3NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODgzCi0JCQkJCVBhcmVudF9WaWV3IAlAODgxCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzQ3LCAxMTU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NDQxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QyIKLQkJCQkJY2xpZW50ICAgICAJQDg4MQotCQkJCQlzdXBwbGllciAgIAlAODgwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNCwgMTIwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg4MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDAsIDEyNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDcKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTQ3MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ2IiBAODg2Ci0JCQkJbG9jYXRpb24gICAJKDExNjgsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDgwMkZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEA4ODcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODYKLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QiIKLQkJCQkJY2xpZW50ICAgICAJQDg4NgotCQkJCQlzdXBwbGllciAgIAlAODc4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNjgsIDEwMjIpCi0JCQkJCSAgICAoMTE2OCwgOTYyKQotCQkJCQkgICAgKDEyODUsIDk2MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NSwgOTYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg4OAotCQkJCQlQYXJlbnRfVmlldyAJQDg4NgotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjkwLCAxMDc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJCWNsaWVudCAgICAgCUA4ODYKLQkJCQkJc3VwcGxpZXIgICAJQDg4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNjgsIDExNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTI3LCAxMDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzY5NzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY4IiBAODkxCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEzNTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDIwMDlBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjkiIEA4OTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTEKLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJCWNsaWVudCAgICAgCUA4OTEKLQkJCQkJc3VwcGxpZXIgICAJQDg3OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDE5NDAsIDEzNTMpCi0JCQkJCSAgICAoMTk0MCwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MCwgMTI1NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODkzCi0JCQkJCVBhcmVudF9WaWV3IAlAODkxCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCAxMzIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTY4MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJCWNsaWVudCAgICAgCUA4OTEKLQkJCQkJc3VwcGxpZXIgICAJQDg4MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDExODEsIDEzNTMpCi0JCQkJCSAgICAoMTE4MSwgMTI1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4MSwgMTI1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODk1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzAsIDEzMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MTM0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4OTYKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA1NjEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjg4LCA1NjEpCi0JCQkJICAgICgyODgsIDQ3MSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDg5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDYyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDg5OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1OCwgMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQkJd2lkdGggICAgICAJNDE0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAODk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA5NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgOTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA5MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwLCA2MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAOTAwCi0JCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMSwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjEsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4OTYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTAyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA4OTcKLQkJCQlzdXBwbGllciAgIAlAODcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTg5LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OSwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDg5NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJY2xpZW50ICAgICAJQDg3NAotCQkJCXN1cHBsaWVyICAgCUA4NzUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDE2LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTYsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzYpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEA5MDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTAsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTA1Ci0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDEwODkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDkwNAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTgyNCwgMTA4OSkKLQkJCQkgICAgKDE4MjQsIDk5OSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOERDMDM4MSIKLQkJCQljbGllbnQgICAgIAlAODc3Ci0JCQkJc3VwcGxpZXIgICAJQDkwNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjYsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjYsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCIKLQkJCQljbGllbnQgICAgIAlAODc5Ci0JCQkJc3VwcGxpZXIgICAJQDkwNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MzQsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzQsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA1KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5MDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTA5Ci0JCQkJbG9jYXRpb24gICAJKDE3NjIsIDgxOSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTA4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzYyLCA4MTkpCi0JCQkJICAgICgxNzYyLCA3MjcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiCi0JCQkJY2xpZW50ICAgICAJQDg3OAotCQkJCXN1cHBsaWVyICAgCUA5MDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE2LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTYsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTExCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA5MDgKLQkJCQlzdXBwbGllciAgIAlAODc1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NiwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU2LCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODc2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDkxMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxNDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MTMKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjg5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDExMjAsIDI4OSkKLQkJCQkgICAgKDExMjAsIDE5OSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTAiIEA5MTQKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NSwgMjE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGFpbmVyIiBAOTE1Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTE0Ci0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDIxMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250YWluZXIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMzExMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0UiCi0JCQkJCWNsaWVudCAgICAgCUA5MTQKLQkJCQkJc3VwcGxpZXIgICAJQDkxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMTc2KQotCQkJCQkgICAgKDEzNzQsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM1LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMjY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTExIiBAOTE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTE0Ci0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0YiCi0JCQkJCWNsaWVudCAgICAgCUA5MTQKLQkJCQkJc3VwcGxpZXIgICAJQDkxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMjU0KQotCQkJCQkgICAgKDEzNDUsIDI1NCkKLQkJCQkJICAgICgxMzQ1LCAxOTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM0NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTIiIEA5MTkKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAyMTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNDgwMjYxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290Q29udGFpbmVyIiBAOTIwCi0JCQkJCVBhcmVudF9WaWV3IAlAOTE5Ci0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAyMTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdENvbnRhaW5lciIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNTAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTYwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJCWNsaWVudCAgICAgCUA5MTkKLQkJCQkJc3VwcGxpZXIgICAJQDkxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDE3NikKLQkJCQkJICAgICg4NjYsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMyIgQDkyMwotCQkJCQlQYXJlbnRfVmlldyAJQDkxOQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODYiCi0JCQkJCWNsaWVudCAgICAgCUA5MTkKLQkJCQkJc3VwcGxpZXIgICAJQDkxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDI1NykKLQkJCQkJICAgICg4OTUsIDI1NykKLQkJCQkJICAgICg4OTUsIDE5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkyNAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQljbGllbnQgICAgIAlAODc1Ci0JCQkJc3VwcGxpZXIgICAJQDkxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjcsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NywgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkxMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MjUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDhFMjAwRUEiCi0JCQkJY2xpZW50ICAgICAJQDg3MwotCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTEzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkyNgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQljbGllbnQgICAgIAlAODcyCi0JCQkJc3VwcGxpZXIgICAJQDkxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTksIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkyOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTI3Ci0JCQkJc3VwcGxpZXIgICAJQDkwMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNiwgMTE0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2LCA3MjcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjQiIEA5MjkKLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTQyNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNSIgQDkzMAotCQkJCQlQYXJlbnRfVmlldyAJQDkyOQotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDkyOQotCQkJCQlzdXBwbGllciAgIAlAOTA0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjE0NywgMTQyNSkKLQkJCQkJICAgICgyMTQ3LCA5NDMpCi0JCQkJCSAgICAoMjA2NywgOTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY3LCA5NDMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEA5MzEKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MjkKLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NSwgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQkJY2xpZW50ICAgICAJQDkyOQotCQkJCQlzdXBwbGllciAgIAlAOTI3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjI1LCAxNDI1KQotCQkJCQkgICAgKDIyNSwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI1LCAxMjU1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTY5MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIyIiBAOTM0Ci0JCQkJbG9jYXRpb24gICAJKDE1MDUsIDE1MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjMiIEA5MzUKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MzQKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUA5MzQKLQkJCQkJc3VwcGxpZXIgICAJQDkwOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTA1LCAxNTAzKQotCQkJCQkgICAgKDIxODgsIDE1MDMpCi0JCQkJCSAgICAoMjE4OCwgNjc1KQotCQkJCQkgICAgKDIwNTksIDY3NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1OSwgNjc1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEA5MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MzQKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCQljbGllbnQgICAgIAlAOTM0Ci0JCQkJCXN1cHBsaWVyICAgCUA5MjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUwNSwgMTUwMykKLQkJCQkJICAgICgxMTMsIDE1MDMpCi0JCQkJCSAgICAoMTEzLCAxMjU1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMsIDEyNTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY3NjgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNCIgQDkzOQotCQkJCWxvY2F0aW9uICAgCSg2NiwgMjQ0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQzMxMDM1NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE1IiBAOTQwCi0JCQkJCVBhcmVudF9WaWV3IAlAOTM5Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzMxIgotCQkJCQljbGllbnQgICAgIAlAOTM5Ci0JCQkJCXN1cHBsaWVyICAgCUA5MTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjYsIDI0NCkKLQkJCQkJICAgICg2NiwgMTQ0KQotCQkJCQkgICAgKDg2NiwgMTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE0NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDk0MQotCQkJCQlQYXJlbnRfVmlldyAJQDkzOQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNjgxMTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTk5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzM0IiCi0JCQkJCWNsaWVudCAgICAgCUA5MzkKLQkJCQkJc3VwcGxpZXIgICAJQDkyNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2LCAxMTQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAxODQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMTMKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY2NTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3ODBCRDkwMDU5IgotCQkJCWNsaWVudCAgICAgCUA4OTgKLQkJCQlzdXBwbGllciAgIAlAOTEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU5LCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTEzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAODgwCi0JCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQwMCwgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODk2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NDYKLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgODM3KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4NzQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEwMTIsIDgzNykKLQkJCQkgICAgKDEwMTIsIDcyNykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0NwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDk0OAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MSwgODcxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODg4MTU4Ci0JCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0RTIwMzY2IgotCQkJCWNsaWVudCAgICAgCUA4ODAKLQkJCQlzdXBwbGllciAgIAlAODc0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzNywgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzNywgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDkKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5NTAKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5MCwgODY1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTgxNjMzCi0JCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0QkEwMjNDIgotCQkJCWNsaWVudCAgICAgCUA4OTkKLQkJCQlzdXBwbGllciAgIAlAODc0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI1LCA5MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk0NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDkwNAotCQkJCXN1cHBsaWVyICAgCUA5MDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI4LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjgsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJcXVpZCAgICAgICAJIjNCOUY4Rjc2MDJDNyIKLQkJCXRpdGxlICAgICAgCSI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA5NTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCAxNDQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxMzU5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxNDE5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MTIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZm9ybSA6IFhTREZvcm0iCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGb3JtIiBAOTUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NjAsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZvcm0iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzE1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOUY5MTNCMDFFQiIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5NTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgOTcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBlbGVtZW50IDogRE9NRWxlbWVudCIpKQotCQkJCXdpZHRoICAgICAgCTY3NQotCQkJCWhlaWdodCAgICAgCTE0MwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDk1NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg3LCAzMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDAKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDk1NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzgsIDg5MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDcwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAOTU3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgMTQwOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMTM1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAOTU4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg2NCwgNjI0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTU4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDU3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQkJd2lkdGggICAgICAJMjU2Ci0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk1OQotCQkJCWxvY2F0aW9uICAgCSg4NTAsIDUzNykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTU1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg4NTAsIDUzNykKLQkJCQkgICAgKDg1MCwgNDQ3KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUVsZW1lbnQiIEA5NjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI0OCwgMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01FbGVtZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4MTg5NzkwMjAwIgotCQkJCXdpZHRoICAgICAgCTc2OQotCQkJCWhlaWdodCAgICAgCTIwMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5NjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA2NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCA1ODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAOTYyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMzMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCXdpZHRoICAgICAgCTQyMgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NjMKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyNjMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk1NAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzY4LCAyNjMpCi0JCQkJICAgICgzNjgsIDE2NykpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDk2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTQ1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxMzQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTI5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTQwNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgc3Vic3RpdHV0aW9uIgotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyBhbGwiKSkKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA5NjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE3OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTcwOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE2NTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3NjgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iCi0JCQkJCSIrIGFsbCIpKQotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDk2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMjA5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMDQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMTAwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2NAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTc3OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDk2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBAOTY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NDQsIDIwMTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE5MzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE4ODIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIgotCQkJCXdpZHRoICAgICAgCTM4MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA5NjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMzM5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB1c2UgOiBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIKLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNjQwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IiBAOTcwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTYzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE0OTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JBN0IwRTgwMUE4IgotCQkJCXdpZHRoICAgICAgCTUxMgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAOTcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2MDgsIDkyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ5OCwgODgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzOAotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDk3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNDAsIDE3MTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJOTY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTY5MSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk5NzMKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKSkKLQkJCQl3aWR0aCAgICAgIAk5ODQKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA5NzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAxMTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTczCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMDk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTE1NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk5MDYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAOTc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEwMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyMiwgNzc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTk5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMTAxNAotCQkJCWhlaWdodCAgICAgCTQ4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA5NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA5NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3LCA5MDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDk3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzNDQsIDY1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjYwKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDMwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDk3NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDE5NDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMjAwMikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk4NzAKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEQ29tcGxleEZpbmFsIgotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCQkiKyBtaXhlZCA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk4NzgKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA5NzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4OCwgMTY5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwNCwgMTY0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzg2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTc5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUA5NzgKLQkJCQlzdXBwbGllciAgIAlAOTU3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNiwgMTYzMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwNiwgMTQ3MikpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA5ODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjIwOCwgNzA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA1OTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJOTAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJOTE4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTgxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCWNsaWVudCAgICAgCUA5NzEKLQkJCQlzdXBwbGllciAgIAlAOTU1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY5NiwgODY5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjk2LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlAOTcyCi0JCQkJc3VwcGxpZXIgICAJQDk1MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTQsIDE2MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTQsIDE1MzMpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5ODMKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NywgMTg1NikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTc4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNDg3LCAxODU2KQotCQkJCSAgICAoMTQ4NywgMTc2MCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01BdHRyIiBAOTg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MDAsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzUwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01BdHRyIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQkJGOEM4OTAxQjYiCi0JCQkJd2lkdGggICAgICAJNjU4Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA5NzcKLQkJCQlzdXBwbGllciAgIAlAOTc4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczNCwgMTkzMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTczNCwgMTg1NikKLQkJCQlkcmF3U3VwcGxpZXIgCUA5ODMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTg2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5IgotCQkJCWNsaWVudCAgICAgCUA5NzYKLQkJCQlzdXBwbGllciAgIAlAOTU1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgNTg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAOTgwCi0JCQkJc3VwcGxpZXIgICAJQDk1NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxOTAsIDU4NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5MCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk1OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5ODgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJY2xpZW50ICAgICAJQDk2MQotCQkJCXN1cHBsaWVyICAgCUA5NjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjIsIDU3MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyLCA0NDcpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk4OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQljbGllbnQgICAgIAlAOTYyCi0JCQkJc3VwcGxpZXIgICAJQDk1NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MCwgMzIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAsIDI2MykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTkwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCWNsaWVudCAgICAgCUA5NzUKLQkJCQlzdXBwbGllciAgIAlAOTYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzLCA4OTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMywgNzA4KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDk3MwotCQkJCXN1cHBsaWVyICAgCUA5NzEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAwLCAxMDg0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAwLCA5ODcpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Eb2N1bWVudCIgQDk5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDk0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Eb2N1bWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODUwRTAzODEiCi0JCQkJd2lkdGggICAgICAJNzc2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTkzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIgotCQkJCWNsaWVudCAgICAgCUA5NTUKLQkJCQlzdXBwbGllciAgIAlAOTU0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCAzMjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgMjYzKQotCQkJCWRyYXdTdXBwbGllciAJQDk2MykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDk5NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDM1MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDMwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJCXdpZHRoICAgICAgCTY4NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAOTU4Ci0JCQkJc3VwcGxpZXIgICAJQDk1NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1MCwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTk2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCWNsaWVudCAgICAgCUA5NjkKLQkJCQlzdXBwbGllciAgIAlAOTU1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAxMjY3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTk3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA5NTYKLQkJCQlzdXBwbGllciAgIAlAOTU1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5NCwgODgwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjk0LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTc0Ci0JCQkJc3VwcGxpZXIgICAJQDk1OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgNzY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDY4NykpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk5OQotCQkJCWxvY2F0aW9uICAgCSgxNzAzLCAxMjkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NTYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE3MDMsIDEyOTApCi0JCQkJICAgICgxNzAzLCAxMDA4KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQljbGllbnQgICAgIAlAOTU3Ci0JCQkJc3VwcGxpZXIgICAJQDk1NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDMsIDEzNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyOTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMDEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDk1MgotCQkJCXN1cHBsaWVyICAgCUA5NTYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMzQ3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAxMjkwKQotCQkJCWRyYXdTdXBwbGllciAJQDk5OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA5NjYKLQkJCQlzdXBwbGllciAgIAlAOTc4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MywgMjAyOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MywgMTg1NikKLQkJCQlkcmF3U3VwcGxpZXIgCUA5ODMpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI4LiBDb25jcmV0ZSBDb250YWlubWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBODA5NzAyN0EiCi0JCQl0aXRsZSAgICAgIAkiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDEwMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjcyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDM5LCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAMTAwNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NDAsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzEsIDUzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDEwMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDEzLCA3NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDEwMDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIKLQkJCQl3aWR0aCAgICAgIAk0MzgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAwNwotCQkJCWxvY2F0aW9uICAgCSgxOTQzLCA4NjgpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMDYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5NDMsIDg2OCkKLQkJCQkgICAgKDE5NDMsIDYzMSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzAiIEAxMDA4Ci0JCQkJbG9jYXRpb24gICAJKDIxMjUsIDY4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MSIgQDEwMDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQUQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDA4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDA1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA3MjkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NSwgNjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCQljbGllbnQgICAgIAlAMTAwOAotCQkJCQlzdXBwbGllciAgIAlAMTAwNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY3LCA2NzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMTAxMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAxNAotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTAxMwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjcyLCA0NjUpCi0JCQkJICAgICgyNzIsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEwMTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM3MiwgMTEyMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTg3Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDEwMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDU3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzUyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU4IiBAMTAxNwotCQkJCWxvY2F0aW9uICAgCSgxMTcwLCAxMzU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDEwMTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE3Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNDA0NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMTcKLQkJCQkJc3VwcGxpZXIgICAJQDEwMTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3MCwgMTM1NikKLQkJCQkJICAgICgyMDYsIDEzNTYpCi0JCQkJCSAgICAoMjA2LCA2MzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNiwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1OTE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU5IiBAMTAyMQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTcKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNTIxLCAxMzk4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDE3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDE1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzAsIDEzNTYpCi0JCQkJCSAgICAoMjczMSwgMTM1NikKLQkJCQkJICAgICgyNzMxLCAxMjI3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzMxLCAxMjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEwMjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAsIDE2OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUyIiBAMTAyNAotCQkJCWxvY2F0aW9uICAgCSgxMjIsIDExMzYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTMiIEAxMDI1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAyNAotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDE2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDYzMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAyNgotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQKLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMywgMTUxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAyNSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMjQKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgMTY0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODExODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAMTAyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQl3aWR0aCAgICAgIAk1MTMKLQkJCQloZWlnaHQgICAgIAkxMDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjQiIEAxMDMwCi0JCQkJbG9jYXRpb24gICAJKDQ3LCA4ODUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MTUwMTE5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjUiIEAxMDMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzMAotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzAKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTY0MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDMyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAzMAotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjE4NTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTk1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDMwCi0JCQkJCXN1cHBsaWVyICAgCUAxMDI5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDEzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgsIDE5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3ODgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDEwMzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNjMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMDM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk0IiBAMTAzNwotCQkJCWxvY2F0aW9uICAgCSgxMzE5LCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkYxREU5MDE4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTUiIEAxMDM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTU3LCAtMTAyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM2QyIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzcKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTAzOQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzcKLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzMxNzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIgotCQkJCQljbGllbnQgICAgIAlAMTAzNwotCQkJCQlzdXBwbGllciAgIAlAMTAzNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDEwMzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTUsIDE2NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEwNDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkwIiBAMTA0NAotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkxIiBAMTA0NQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDQKLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDQzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTEsIDE4NDApCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkKLQkJCQkJICAgICgxMjk0LCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk0LCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA0NAotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxODA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI2NTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0M4IgotCQkJCQljbGllbnQgICAgIAlAMTA0NAotCQkJCQlzdXBwbGllciAgIAlAMTA0MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzUxLCAxODQwKQotCQkJCQkgICAgKDE0MDksIDE4NDApCi0JCQkJCSAgICAoMTQwOSwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTc1MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MSwgMTgwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcyODQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc0IiBAMTA0OQotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDUwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OQotCQkJCQlsb2NhdGlvbiAgIAkoNzc0LCAtMTgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgMTUyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ0OTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDkKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQ1NDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc1IiBAMTA1MwotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkKLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMwRSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDkKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxMjIzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTIiIEAxMDU1Ci0JCQkJbG9jYXRpb24gICAJKDE2OTAsIDE2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUQwMzc0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldENvbnRlbnRzIiBAMTA1NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTUKLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgMTczMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldENvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzIwNTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDQyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NiwgMTY4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTY0NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTk0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNzMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTMiIEAxMDU5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTY2LCAxNjQzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDQzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzNCwgMTY4NCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDEwNjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjI0LCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzg4LCA3NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEAxMDYyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEwNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1NywgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcyIiBAMTA2NAotCQkJCWxvY2F0aW9uICAgCSg5NjMsIDMxOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QjAwM0QiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTA2NQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjQKLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDM2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgxMDgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCQljbGllbnQgICAgIAlAMTA2NAotCQkJCQlzdXBwbGllciAgIAlAMTA2MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk5LCAzMTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTYsIDI5MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk2Mzk2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzMiIEAxMDY4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA2NAotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NSwgMzYxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJCWNsaWVudCAgICAgCUAxMDY0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDYzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgyOCwgMzE5KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDEwNzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA5OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc0LCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwNzEKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMiwgMTU5MykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA3MAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjMyMiwgMTU5MykKLQkJCQkgICAgKDIzMjIsIDEwNDcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDcyCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTA3MwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDYsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2MDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk1Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRjUwMTNBIgotCQkJCWNsaWVudCAgICAgCUAxMDcwCi0JCQkJc3VwcGxpZXIgICAJQDEwMDYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTUwLCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTAsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDA3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMDc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA1NzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDUzMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTY2MgotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExOCIgQDEwNzUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ5OCwgMTQzMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNDAxQUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTA3NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzUKLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDI3LCAxNDcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQzODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMDc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDcwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0OTgsIDE0MzEpCi0JCQkJCSAgICAoMjI4MSwgMTQzMSkKLQkJCQkJICAgICgyMjgxLCAxMDQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjgxLCAxMDQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjA0LCAxMzk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDU0MTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExOSIgQDEwNzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc1Ci0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgODY2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDc0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0OTgsIDE0MzEpCi0JCQkJCSAgICAoMTEzMSwgMTQzMSkKLQkJCQkJICAgICgxMTMxLCA2MzIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzEsIDYzMikpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBAMTA4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDY1NSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBAMTA4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgODk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA1LCA4NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIyIiBAMTA4MwotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDczNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBAMTA4NAotCQkJCQlQYXJlbnRfVmlldyAJQDEwODMKLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIwLCA3NDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExMTExMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDgzCi0JCQkJCXN1cHBsaWVyICAgCUAxMDgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgODQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1OTUsIDgwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc1OTI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjMiIEAxMDg3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA4MwotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDY1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCQljbGllbnQgICAgIAlAMTA4MwotCQkJCQlzdXBwbGllciAgIAlAMTA3NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDYzMikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQyIiBAMTA4OQotCQkJCWxvY2F0aW9uICAgCSg5MDAsIDEwMzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDEwOTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEzLCAxMDQyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMyODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCQljbGllbnQgICAgIAlAMTA4OQotCQkJCQlzdXBwbGllciAgIAlAMTA4MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDEwNDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTg5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQzIiBAMTA5MwotCQkJCQlQYXJlbnRfVmlldyAJQDEwODkKLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgOTY4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiCi0JCQkJCWNsaWVudCAgICAgCUAxMDg5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDk1MSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ0IiBAMTA5NQotCQkJCWxvY2F0aW9uICAgCSg3MDAsIDEwMzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEAxMDk2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA5NQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDEwMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTQ3OTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTg1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDk1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDgxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3MSwgMTA0MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMDc3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDUiIEAxMDk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA5NQotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTksIDk2OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1IgotCQkJCQljbGllbnQgICAgIAlAMTA5NQotCQkJCQlzdXBwbGllciAgIAlAMTA4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCA5NTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDExMDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDE0NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDAsIDEzOTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTAyCi0JCQkJbG9jYXRpb24gICAJKDU1MCwgMTU5MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTEwMQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNTUwLCAxNTkwKQotCQkJCSAgICAoNTUwLCAxNDk1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDExMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQwLCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQl3aWR0aCAgICAgIAk1NDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTA0Ci0JCQkJbG9jYXRpb24gICAJKDE0MDYsIDc2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTEwMwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQwNiwgNzY1KQotCQkJCSAgICAoMTQwNiwgNjMxKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDExMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5MywgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMCIgQDExMDYKLQkJCQlsb2NhdGlvbiAgIAkoMTYxNCwgMTg2OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZGRERENzAxMTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMSIgQDExMDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTA2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTA2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTA1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTQsIDE4NjgpCi0JCQkJCSAgICAoMjUwMCwgMTg2OCkKLQkJCQkJICAgICgyNTAwLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAwLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDExMDgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTA2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxNzg3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTg3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQkJY2xpZW50ICAgICAJQDExMDYKLQkJCQkJc3VwcGxpZXIgICAJQDExMDEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkKLQkJCQkJICAgICg5ODQsIDE4NjgpCi0JCQkJCSAgICAoOTg0LCAxNDk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODQsIDE0OTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDE4MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3MTI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDYiIEAxMTExCi0JCQkJbG9jYXRpb24gICAJKDI5MjcsIDM4NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzNjAzODYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUNvbnRlbnRzIiBAMTExMgotCQkJCQlQYXJlbnRfVmlldyAJQDExMTEKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAzNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlQ29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3MzA2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3QyIKLQkJCQkJY2xpZW50ICAgICAJQDExMTEKLQkJCQkJc3VwcGxpZXIgICAJQDExMDMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjkyNywgMzg3KQotCQkJCQkgICAgKDE3NTAsIDM4NykKLQkJCQkJICAgICgxNzUwLCA1MjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNTIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODA0LCA0MjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzI0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA3IiBAMTExNQotCQkJCQlQYXJlbnRfVmlldyAJQDExMTEKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOTQ2LCAxNDQ4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTExCi0JCQkJCXN1cHBsaWVyICAgCUAxMTA1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDI5MjcsIDM4NykKLQkJCQkJICAgICgyOTg3LCAzODcpCi0JCQkJCSAgICAoMjk4NywgMTY3MSkKLQkJCQkJICAgICgyOTI4LCAxNjcxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDE2NzEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDExMTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgyIiBAMTExOAotCQkJCWxvY2F0aW9uICAgCSgxNzUwLCA4NzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNEUwMDY3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDExMTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTE4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgNjkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTEwMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMkE1IgotCQkJCQljbGllbnQgICAgIAlAMTExOAotCQkJCQlzdXBwbGllciAgIAlAMTEwMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE0LCA2OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNDQ0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODMiIEAxMTIyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTExOAotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDksIDEwNjUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDI5QiIKLQkJCQkJY2xpZW50ICAgICAJQDExMTgKLQkJCQkJc3VwcGxpZXIgICAJQDExMTcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDExMTMpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTEyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE0IiBAMTEyNQotCQkJCWxvY2F0aW9uICAgCSgxMjUyLCAxODk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRUJEQzg3MDI0NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE1IiBAMTEyNgotCQkJCQlQYXJlbnRfVmlldyAJQDExMjUKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAyRjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMTI1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTA1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNTIsIDE4OTYpCi0JCQkJCSAgICAoMjYwMywgMTg5NikKLQkJCQkJICAgICgyNjAzLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAzLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTEyNwotCQkJCQlQYXJlbnRfVmlldyAJQDExMjUKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjgyLCAxODU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzgxMTQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCQljbGllbnQgICAgIAlAMTEyNQotCQkJCQlzdXBwbGllciAgIAlAMTEyNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjUyLCAxODk2KQotCQkJCQkgICAgKDQyOCwgMTg5NikKLQkJCQkJICAgICg0MjgsIDEyMjMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQyOCwgMTIyMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTI3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgyLCAxODYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzUwMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODYiIEAxMTMwCi0JCQkJbG9jYXRpb24gICAJKDExOTksIDEzMjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEMzIwMjIwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NyIgQDExMzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTMwCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEMiCi0JCQkJCWNsaWVudCAgICAgCUAxMTMwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTE3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoMTg5NywgMTMyMSkKLQkJCQkJICAgICgxODk3LCAxMjIzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk3LCAxMjIzKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTEzMgotCQkJCQlQYXJlbnRfVmlldyAJQDExMzAKLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk1NjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEQiCi0JCQkJCWNsaWVudCAgICAgCUAxMTMwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTI0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoNTAwLCAxMzIxKQotCQkJCQkgICAgKDUwMCwgMTIyMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxMjIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MjMwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDExMDUKLQkJCQlzdXBwbGllciAgIAlAMTA3MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDYsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDYsIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA3MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEzNwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgNDk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDQ2NDI5Ci0JCQkJICAgIGhlaWdodCAgICAgCTYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDEwNzQKLQkJCQlzdXBwbGllciAgIAlAMTAxMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTMsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDE0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMzgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEwNDMKLQkJCQlzdXBwbGllciAgIAlAMTA3MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDksIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA3MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTM5Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE0MAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgMTU5MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk4MDM5MgotCQkJCSAgICBoZWlnaHQgICAgIAkzODUKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJY2xpZW50ICAgICAJQDEwNDMKLQkJCQlzdXBwbGllciAgIAlAMTEwMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDQsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDQsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUAxMDE2Ci0JCQkJc3VwcGxpZXIgICAJQDEwMTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAxNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTE0MgotCQkJCWxvY2F0aW9uICAgCSg0MzEsIDIyMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTAyOQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDMxLCAyMjIpCi0JCQkJICAgICg0MzEsIDEzMCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDMKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ0Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYxLCAyMjQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NzY3NDQKLQkJCQkgICAgaGVpZ2h0ICAgICAJODYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI0NDAwNjkiCi0JCQkJY2xpZW50ICAgICAJQDEwMTMKLQkJCQlzdXBwbGllciAgIAlAMTAyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3NSwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUsIDIyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTQ1Ci0JCQkJbG9jYXRpb24gICAJKDEzMDksIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA2MgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTMwOSwgNDY1KQotCQkJCSAgICAoMTMwOSwgMzc1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0NgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNDcKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDEsIDQ5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NDI4NgotCQkJCSAgICBoZWlnaHQgICAgIAkxMAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTY2MDMzOSIKLQkJCQljbGllbnQgICAgIAlAMTA3NAotCQkJCXN1cHBsaWVyICAgCUAxMDYyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCA1MjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzMSwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExNDUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE0OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyIKLQkJCQljbGllbnQgICAgIAlAMTAyMwotCQkJCXN1cHBsaWVyICAgCUAxMTAxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjUwLCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ5Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDUsIDQ5MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk1ODMzMwotCQkJCSAgICBoZWlnaHQgICAgIAk4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjEwM0JFIgotCQkJCWNsaWVudCAgICAgCUAxMDM2Ci0JCQkJc3VwcGxpZXIgICAJQDEwNjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE0NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUxCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MAotCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkVCMDJBOCIKLQkJCQljbGllbnQgICAgIAlAMTExNwotCQkJCXN1cHBsaWVyICAgCUAxMDA2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg3OCwgMTExMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3OCwgODY4KQotCQkJCWRyYXdTdXBwbGllciAJQDEwMDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1MwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAzQTAyMjEiCi0JCQkJY2xpZW50ICAgICAJQDExMTcKLQkJCQlzdXBwbGllciAgIAlAMTEwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDMsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTUKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU2Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NCwgODAxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIgotCQkJCWNsaWVudCAgICAgCUAxMDM1Ci0JCQkJc3VwcGxpZXIgICAJQDExMDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODQsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJY2xpZW50ICAgICAJQDEwMDUKLQkJCQlzdXBwbGllciAgIAlAMTA2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyODQsIDc2MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3OSwgNzYyKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTU4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUAxMDA0Ci0JCQkJc3VwcGxpZXIgICAJQDEwNjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQ1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDEwNjEKLQkJCQlzdXBwbGllciAgIAlAMTAwNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDcyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCWNsaWVudCAgICAgCUAxMDA2Ci0JCQkJc3VwcGxpZXIgICAJQDEwNjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUwLCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQ1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjEKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYyCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyMSwgODk3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDg3NzE5Ci0JCQkJICAgIGhlaWdodCAgICAgCTc2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNEYwMjNDIgotCQkJCWNsaWVudCAgICAgCUAxMDAzCi0JCQkJc3VwcGxpZXIgICAJQDEwNjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODk2LCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4OTYsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTQ1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjMKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY0Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMxMywgOTA0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODUwNjIyCi0JCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRTIwMzgxIgotCQkJCWNsaWVudCAgICAgCUAxMDE1Ci0JCQkJc3VwcGxpZXIgICAJQDEwMDYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzgxLCAxMTA5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzgxLCA4NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAwNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTY1Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE2NgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4NzgsIDI2OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NjY2NwotCQkJCSAgICBoZWlnaHQgICAgIAk2NgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjU1MDM4NSIKLQkJCQljbGllbnQgICAgIAlAMTAxNQotCQkJCXN1cHBsaWVyICAgCUAxMDI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk0MywgMTEwOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk0MywgMjIyKQotCQkJCWRyYXdTdXBwbGllciAJQDExNDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQljbGllbnQgICAgIAlAMTEyNAotCQkJCXN1cHBsaWVyICAgCUAxMDEzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDYyLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjIsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDE0KSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIgotCQkJcXVpZCAgICAgICAJIjNDMjVFQjdBMDM4QyIKLQkJCXRpdGxlICAgICAgCSI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTE2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNCIgQDExNjkKLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI1IiBAMTE3MAotCQkJCQlQYXJlbnRfVmlldyAJQDExNjkKLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMkY3IgotCQkJCQljbGllbnQgICAgIAlAMTE2OQotCQkJCQlzdXBwbGllciAgIAlAMTE2OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjgsIDE2OTUpCi0JCQkJCSAgICAoMTc1LCAxNjk1KQotCQkJCQkgICAgKDE3NSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExNzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMjksIDE3NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDMwQiIKLQkJCQkJY2xpZW50ICAgICAJQDExNjkKLQkJCQkJc3VwcGxpZXIgICAJQDExNjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjI4LCAxNjk1KQotCQkJCQkgICAgKDI4MSwgMTY5NSkKLQkJCQkJICAgICgyODEsIDE1OTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxLCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjksIDE2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExNzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYwIiBAMTE3NgotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjEiIEAxMTc3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE3NgotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg2MCwgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCQljbGllbnQgICAgIAlAMTE3NgotCQkJCQlzdXBwbGllciAgIAlAMTE3NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE2OTgpCi0JCQkJCSAgICAoOTAxLCAxNjk4KQotCQkJCQkgICAgKDkwMSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTE3OQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzYKLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDIwLCAxNzM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM5RSIKLQkJCQkJY2xpZW50ICAgICAJQDExNzYKLQkJCQkJc3VwcGxpZXIgICAJQDExNzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTUyLCAxNjk4KQotCQkJCQkgICAgKDEwMDQsIDE2OTgpCi0JCQkJCSAgICAoMTAwNCwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA0LCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDE2NDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDIwLCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDExODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDc1Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDExODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDQxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NiwgMjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNDA2Ci0JCQkJaGVpZ2h0ICAgICAJMjg3Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyNCIgQDExODUKLQkJCQlsb2NhdGlvbiAgIAkoMTMwMywgNjc5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAMTE4NgotCQkJCQlQYXJlbnRfVmlldyAJQDExODUKLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAwMzg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCQljbGllbnQgICAgIAlAMTE4NQotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzAzLCA2NzkpCi0JCQkJCSAgICAoMTMwMywgNDE5KQotCQkJCQkgICAgKDg0MywgNDE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkwNzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjUiIEAxMTg5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDExODUKLQkJCQkJc3VwcGxpZXIgICAJQDExODIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMwMywgNjc5KQotCQkJCQkgICAgKDEzMDMsIDk5NykKLQkJCQkJICAgICg5MDEsIDk5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDk5NykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIyIiBAMTE5MQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDExOTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkxCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM4LCA1MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMTkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQkJY2xpZW50ICAgICAJQDExOTEKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQotCQkJCQkgICAgKDEyMTYsIDUzNCkKLQkJCQkJICAgICg4NDMsIDUzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDUzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTI2LCA1NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMTY0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIzIiBAMTE5NQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTEKLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgNzU2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTkxCi0JCQkJCXN1cHBsaWVyICAgCUAxMTgzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTYsIDY0OSkKLQkJCQkJICAgICgxMjE2LCA3OTcpCi0JCQkJCSAgICAoODc3LCA3OTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA3OTcpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyOCIgQDExOTcKLQkJCQlsb2NhdGlvbiAgIAkoNjYyLCA2NDIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMTk4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE5NwotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDY3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjE2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTk3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTgzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNzI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDMwNjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjkiIEAxMjAxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5NwotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjEsIDU3NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcwIgotCQkJCQljbGllbnQgICAgIAlAMTE5NwotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDU1OSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMwIiBAMTIwMwotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMxIiBAMTIwNAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDMKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDFFIgotCQkJCQljbGllbnQgICAgIAlAMTIwMwotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NSwgMTg4KQotCQkJCQkgICAgKDc1LCAxMjgpCi0JCQkJCSAgICAoNTEwLCAxMjgpCi0JCQkJCSAgICAoNTEwLCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMjA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VmVyc2lvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMjgiCi0JCQkJCWNsaWVudCAgICAgCUAxMjAzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc1LCAxODgpCi0JCQkJCSAgICAoNzUsIDM4MCkKLQkJCQkJICAgICg0MzcsIDM4MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAzODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMzI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMyIiBAMTIwOAotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAxMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEIwMTFCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzMiIEAxMjA5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIwOAotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyMSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDgKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2NiwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTIxMAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDgKLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2NCwgOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JpZ2luYWxWZXJzaW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCQljbGllbnQgICAgIAlAMTIwOAotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAxMzQpCi0JCQkJCSAgICAoMTMyMiwgMTM0KQotCQkJCQkgICAgKDEzMjIsIDMzNCkKLQkJCQkJICAgICg4NDMsIDMzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODEwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzQiIEAxMjEzCi0JCQkJbG9jYXRpb24gICAJKDEyNiwgNjU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFRUFCMDAxRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM1IiBAMTIxNAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTMKLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDUxMywgNjU2KQotCQkJCQkgICAgKDUxMywgNTU5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIgQDEyMTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEzCi0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDM5MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDY2LCA2NTYpCi0JCQkJCSAgICAoNjYsIDQ3MikKLQkJCQkJICAgICg0MzcsIDQ3MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgNDcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTYsIDUyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY4NDY4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzOCIgQDEyMTgKLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzkiIEAxMjE5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIxOAotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCQljbGllbnQgICAgIAlAMTIxOAotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2NDIsIDEyNikKLQkJCQkJICAgICg1ODgsIDEyNikKLQkJCQkJICAgICg1ODgsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hRm9yU2NoZW1hIiBAMTIyMAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgKLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYUZvclNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1NTU1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGQiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMTgKLQkJCQkJc3VwcGxpZXIgICAJQDExODQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjQyLCAxMjYpCi0JCQkJCSAgICAoNjk3LCAxMjYpCi0JCQkJCSAgICAoNjk3LCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OTcsIDI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAyMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMTg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyMjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDExODIKLQkJCQlzdXBwbGllciAgIAlAMTE4MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzgsIDg0MykpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTIyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0OTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzgiIEAxMjI1Ci0JCQkJbG9jYXRpb24gICAJKDIzNCwgMTM0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2QjAxOTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc5IiBAMTIyNgotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjUKLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMwOSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjUKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDE4MSwgMTM0MCkKLQkJCQkJICAgICgxODEsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxLCAxMjM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyMjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMzLCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjg2NzkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMxMyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjUKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDI4NywgMTM0MCkKLQkJCQkJICAgICgyODcsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg3LCAxMjM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDEyOTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0Mjk0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEyMzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYwLCAxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDEyMzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTI0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTIiIEAxMjMzCi0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMyIgQDEyMzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDEwRiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzMKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY0ZhY2V0cyIgQDEyMzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzCi0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNDYxNTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIgotCQkJCQljbGllbnQgICAgIAlAMTIzMwotCQkJCQlzdXBwbGllciAgIAlAMTIzMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMzYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjI1LCAzMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEyMzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMjM5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgNjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgNTk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxNCIgQDEyNDAKLQkJCQlsb2NhdGlvbiAgIAkoMTUwOCwgNzkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQzMDI4RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzE1IiBAMTI0MQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDAKLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjM5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA2OTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyNDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDc2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRkQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMjM4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NTQsIDgyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk1MDYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkwIiBAMTI0NgotCQkJCWxvY2F0aW9uICAgCSg5MTksIDEzNDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNUUwMUY5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MSIgQDEyNDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDQ2IgotCQkJCQljbGllbnQgICAgIAlAMTI0NgotCQkJCQlzdXBwbGllciAgIAlAMTI0NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoODY2LCAxMzQ5KQotCQkJCQkgICAgKDg2NiwgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDEyMzkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk5MywgMTM5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzc3MzU4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDUwIgotCQkJCQljbGllbnQgICAgIAlAMTI0NgotCQkJCQlzdXBwbGllciAgIAlAMTI0NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoOTczLCAxMzQ5KQotCQkJCQkgICAgKDk3MywgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzMsIDEyMzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMTI5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAxNDkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEyNTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTYiIEAxMjUzCi0JCQkJbG9jYXRpb24gICAJKDIwMjUsIDc5MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREOTAxRjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxNyIgQDEyNTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUzCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0IgotCQkJCQljbGllbnQgICAgIAlAMTI1MwotCQkJCQlzdXBwbGllciAgIAlAMTIzOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgNjk1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjU1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI1MwotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA4MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjUzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjUyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwOTgsIDg0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MTczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxOCIgQDEyNTgKLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxOSIgQDEyNTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE3IgotCQkJCQljbGllbnQgICAgIAlAMTI1OAotCQkJCQlzdXBwbGllciAgIAlAMTI0NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyNjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzM1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEyNTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTc1NCwgMTE3OCkKLQkJCQkJICAgICgyMDI4LCAxMTc4KQotCQkJCQkgICAgKDIwMjgsIDk5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM2NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEwLiBEaWFnbm9zdGljcyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNUYwODAzRTIiCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEAxMjYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJCXdpZHRoICAgICAgCTY4NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljU2V2ZXJpdHkiIEAxMjY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDY1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNTQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY4QTcwMzJGIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1OSwgNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODk2LCAxMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDYyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk3MzEKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyNjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NCwgNDAyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTQzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjAiIEAxMjY4Ci0JCQkJbG9jYXRpb24gICAJKDE0NCwgMjgzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2NDMxMDM1RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIxIiBAMTI2OQotCQkJCQlQYXJlbnRfVmlldyAJQDEyNjgKLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNjgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAxNzYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbGxEaWFnbm9zdGljcyIgQDEyNzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYWxsRGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0ODU5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJCWNsaWVudCAgICAgCUAxMjY4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE2IiBAMTI3MwotCQkJCWxvY2F0aW9uICAgCSgxMDI4LCA0NDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMjcwM0NEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTciIEAxMjc0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQkJY2xpZW50ICAgICAJQDEyNzMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcxMywgNDQwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyNzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjczCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzOCwgMjMwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBvbmVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjczCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwMjgsIDQ0MCkKLQkJCQkJICAgICgxMDg4LCA0NDApCi0JCQkJCSAgICAoMTA4OCwgMTc0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODgsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE4IiBAMTI3OAotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDI4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxOSIgQDEyNzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjc4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCQljbGllbnQgICAgIAlAMTI3OAotCQkJCQlzdXBwbGllciAgIAlAMTI2NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDE3NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRpYWdub3N0aWNzIiBAMTI4MAotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzgKLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MjYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjciCi0JCQkJCWNsaWVudCAgICAgCUAxMjc4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDk0NzM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI4MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEMwRjRDMDFBMSIKLQkJCQljbGllbnQgICAgIAlAMTI2NwotCQkJCXN1cHBsaWVyICAgCUAxMjY2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAzOTApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjExLiBTdXBwbGVtZW50YWwiCi0JCQlxdWlkICAgICAgIAkiM0MyODdFNDkwMTlCIgotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk4NTIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDg4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDgyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNzgwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI4NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQyIiBAMTI4OAotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1hcnlDb21wb25lbnQiIEAxMjg5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI4OAotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWFyeUNvbXBvbmVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQwODI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEzIgotCQkJCQljbGllbnQgICAgIAlAMTI4OAotCQkJCQlzdXBwbGllciAgIAlAMTI4NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTcyNjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0MyIgQDEyOTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMiIKLQkJCQkJY2xpZW50ICAgICAJQDEyODgKLQkJCQkJc3VwcGxpZXIgICAJQDEyODcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEyOTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDY2NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiIKLQkJCQkJIisgY2lyY3VsYXIgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNzgyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTI5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDEwNzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU5Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyIKLQkJCQkJIisgZWZmZWN0aXZlVmFsdWUgOiBWYWx1ZSIpKQotCQkJCXdpZHRoICAgICAgCTQ1OAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEyOTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA1NjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDYyOCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4MDUKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODIwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMTI5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDI4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAyMTcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBhbGlhc05hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHVSSSA6IFN0cmluZyIKLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciCi0JCQkJCSIrIHFOYW1lIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDcyCi0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTI5OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDM1MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCAyOTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMjk5Ci0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTEwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMjk4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgzMjAsIDUxMCkKLQkJCQkgICAgKDMyMCwgNDIwKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTMwMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQljbGllbnQgICAgIAlAMTI5NgotCQkJCXN1cHBsaWVyICAgCUAxMjk4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjk5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzMDEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDEyODQKLQkJCQlzdXBwbGllciAgIAlAMTI5OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg3NywgNzQ4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjk5KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDEzMDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxODA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMSwgMTc2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDU2Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBAMTMwMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTc3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNzI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQl3aWR0aCAgICAgIAk0OTMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEAxMzA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE4ODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIgotCQkJCXdpZHRoICAgICAgCTQ5MwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDEzMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAxOTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MywgMTkxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEAxMzA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzQsIDEzNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDEzMDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2MywgMTIxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCXdpZHRoICAgICAgCTM5NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEAxMzA4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCAxMzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDEzNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAkzODAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBAMTMwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTIzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5LCAxMTc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJd2lkdGggICAgICAJNDAwCi0JCQkJaGVpZ2h0ICAgICAJMTMyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBAMTMxMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE2MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTM1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1OTUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIgotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDEzMTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyMjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjIzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCXdpZHRoICAgICAgCTQ1NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTMxMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDI2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc0LCAyNTcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEAxMzEzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMjEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOTYsIDIwNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDEzMTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgMjA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQl3aWR0aCAgICAgIAk0NTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEAxMzE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAyMjcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDIyMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDEzMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE1ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTUwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTU2MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA1Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEAxMzE3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjQ2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMTEsIDI0MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDEzMTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzE4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOSwgMjM5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEAxMzE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDI1NTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEzMjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NjcsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMzIxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDEwMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEzMjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTM2NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NzUKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk1OTQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU0IiBAMTMyMwotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTMyNAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjMKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTgwLCAxMTczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTMuMjY4MjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEREIgotCQkJCQljbGllbnQgICAgIAlAMTMyMwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDQ2LCAxMjE4KQotCQkJCQkgICAgKDE0ODcsIDEyMTgpCi0JCQkJCSAgICAoMTQ4NywgMTI5MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTI5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTI1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE4NDIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU1IiBAMTMyNwotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjMKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBFNyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkKLQkJCQkJICAgICgxNDA1LCAxMjE4KQotCQkJCQkgICAgKDE0MDUsIDEyOTIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDUsIDEyOTIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1OCIgQDEzMjgKLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1OSIgQDEzMjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzI4Ci0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDkxIgotCQkJCQljbGllbnQgICAgIAlAMTMyOAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzMzLCAxNTc1KQotCQkJCQkgICAgKDE0ODcsIDE1NzUpCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEZhY2V0IiBAMTMzMAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjgKLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgMTU0MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ2MjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCQljbGllbnQgICAgIAlAMTMyOAotCQkJCQlzdXBwbGllciAgIAlAMTMxMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTE1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjAiIEAxMzMzCi0JCQkJbG9jYXRpb24gICAJKDE1ODcsIDE3OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUIwMzk2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjEiIEAxMzM0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMzMwotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5IgotCQkJCQljbGllbnQgICAgIAlAMTMzMwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTg3LCAxNzkzKQotCQkJCQkgICAgKDE0NDcsIDE3OTMpCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEluY2x1c2l2ZUZhY2V0IiBAMTMzNQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzMKLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTg0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzAyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MiwgMTc5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyMCwgMTc1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MiIgQDEzMzgKLQkJCQlsb2NhdGlvbiAgIAkoOTM3LCAxNzg3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYzIiBAMTMzOQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzgKLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMUY5IgotCQkJCQljbGllbnQgICAgIAlAMTMzOAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MzcsIDE3ODcpCi0JCQkJCSAgICAoOTk3LCAxNzg3KQotCQkJCQkgICAgKDk5NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzNDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM4Ci0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTIsIDE3NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDIwMyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTc4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAxNzQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM5NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY0IiBAMTM0MwotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjUiIEAxMzQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0MwotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTM0MwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5ODEsIDE5MzcpCi0JCQkJCSAgICAoMTA0MSwgMTkzNykKLQkJCQkJICAgICgxMDQxLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5FeGNsdXNpdmVGYWNldCIgQDEzNDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQzCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIzLCAxOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDEyNTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzA0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ2NjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NiIgQDEzNDgKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OSwgMTk1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNjAyOEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2NyIgQDEzNDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ4Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NjksIDE5NTMpCi0JCQkJCSAgICAoMTQwMCwgMTk1MykKLQkJCQkJICAgICgxNDAwLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RXhjbHVzaXZlRmFjZXQiIEAxMzUwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0OAotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY0LCAxOTUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTYxLCAxOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY4IiBAMTM1MwotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMTgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY5IiBAMTM1NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTMKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMzUzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImxlbmd0aEZhY2V0IiBAMTM1NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTMKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA0LCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2xlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzU0NzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzUzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMjIsIDIxODApCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkKLQkJCQkJICAgICgzODcsIDIyNDApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjI0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcxLCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU1OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcyIiBAMTM1OAotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjczIiBAMTM1OQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTgKLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFCIgotCQkJCQljbGllbnQgICAgIAlAMTM1OAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbnVtZXJhdGlvbkZhY2V0cyIgQDEzNjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NTg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA4NCwgMTk4OSkKLQkJCQkJICAgICgxMDg0LCAyMDQ5KQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MTI5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzQiIEAxMzYzCi0JCQkJbG9jYXRpb24gICAJKDE0NTEsIDIwNzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzUiIEAxMzY0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NTEsIDIwNzQpCi0JCQkJCSAgICAoMTM2MiwgMjA3NCkKLQkJCQkJICAgICgxMzYyLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGF0dGVybkZhY2V0cyIgQDEzNjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzIyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMDc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzY3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTcyLCAyMDM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc2IiBAMTM2OAotCQkJCWxvY2F0aW9uICAgCSgxODI3LCAxNDAwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM4MDJBNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc3IiBAMTM2OQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjgKLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFFQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxNDAwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2FyZGluYWxpdHlGYWNldCIgQDEzNzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg0NywgMTM1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjYXJkaW5hbGl0eUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzE3MzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzY4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNDI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NiIgQDEzNzMKLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQxMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NyIgQDEzNzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzczCi0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCQljbGllbnQgICAgIAlAMTM3MwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTM3NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzMKLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwOCwgMjU1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzczCi0JCQkJCXN1cHBsaWVyICAgCUAxMzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0MTMpCi0JCQkJCSAgICAoMTI2MiwgMjU5NikKLQkJCQkJICAgICgyMDY1LCAyNTk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNTk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTc5LCAyNTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkwIiBAMTM3OAotCQkJCWxvY2F0aW9uICAgCSgxODQxLCAxMzA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEUzMDBEOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkxIiBAMTM3OQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzgKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM4RSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxMzA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYm91bmRlZEZhY2V0IiBAMTM4MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzgKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMyLCAxMjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2JvdW5kZWRGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzMTc0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM5OCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTQ3MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcwIiBAMTM4MwotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMTg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcxIiBAMTM4NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzODMKLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzgzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzODUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzgzCi0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzMsIDIyMDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrd2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNzUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzgzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzExCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIxODYpCi0JCQkJCSAgICAoMTMyOCwgMjI0NikKLQkJCQkJICAgICgyMDkzLCAyMjQ2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMjQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDMzLCAyMjAzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjg4IiBAMTM4OAotCQkJCWxvY2F0aW9uICAgCSg2NzQsIDEzOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwMDQ4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODkiIEAxMzg5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM4OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTM4OAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMzkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JkZXJlZEZhY2V0IiBAMTM5MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgKLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTgsIDEzNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JkZXJlZEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjE1MzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzg4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzA4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM0NjE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3OCIgQDEzOTMKLQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAxMjk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENCMDM5QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc5IiBAMTM5NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTMKLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCIKLQkJCQkJY2xpZW50ICAgICAJQDEzOTMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTI5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDEzOTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzkzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY4LCAxMjU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK251bWVyaWNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QxIgotCQkJCQljbGllbnQgICAgIAlAMTM5MwotCQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQwLCAxMjk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDYsIDEyNjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTIiIEAxMzk4Ci0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTMiIEAxMzk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNjAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzk4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2ODksIDE2NjIpCi0JCQkJCSAgICAoMTQ4NywgMTY2MikKLQkJCQkJICAgICgxNDg3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4RmFjZXQiIEAxNDAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2OSwgMTYyMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMTM5OAotCQkJCQlzdXBwbGllciAgIAlAMTMxMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNTM4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTQiIEAxNDAzCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NEYwMTQ1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTUiIEAxNDA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCQljbGllbnQgICAgIAlAMTQwMwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxNDA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDIyODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDAzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzExCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIyNTgpCi0JCQkJCSAgICAoMTMyOCwgMjMyNCkKLQkJCQkJICAgICgyMDkzLCAyMzI0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMzI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA5LCAyMjkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk2IiBAMTQwOAotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzY2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNUM0MDExQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk3IiBAMTQwOQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDgKLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCQljbGllbnQgICAgIAlAMTQwOAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIgQDE0MTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA4Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjU3LCAyNDYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heExlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjY5MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxNDA4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyOTcsIDIzNjYpCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkKLQkJCQkJICAgICgyMTAyLCAyNDk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA3LCAyNDcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk4IiBAMTQxMwotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk5IiBAMTQxNAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTMKLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDEzOCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MTMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCIgQDE0MTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDEzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODUzMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0NDkpCi0JCQkJCSAgICAoMTI2MiwgMjY2OCkKLQkJCQkJICAgICgyMDY1LCAyNjY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY0ODUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAwIiBAMTQxOAotCQkJCWxvY2F0aW9uICAgCSgxNDIyLCAyMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNkIwMDNBNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAxIiBAMTQxOQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTgKLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MTgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQyMiwgMjE1OSkKLQkJCQkJICAgICgxMzYyLCAyMTU5KQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiIEAxNDIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxOAotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTkwOTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDE4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzEzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjE1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjExOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwMiIgQDE0MjMKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMjA4MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwMyIgQDE0MjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIzCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE4NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIgQDE0MjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIzCi0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDIxMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4NjE5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTQyMwotCQkJCQlzdXBwbGllciAgIAlAMTMxNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg0LCAyMDgzKQotCQkJCQkgICAgKDEwODQsIDIxNDMpCi0JCQkJCSAgICAoNDg1LCAyMTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIxNDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgMjEwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTMxNzE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwOCIgQDE0MjgKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwOSIgQDE0MjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDI4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTQyOAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVMZW5ndGhGYWNldCIgQDE0MzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDI4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxNzMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIgotCQkJCQljbGllbnQgICAgIAlAMTQyOAotCQkJCQlzdXBwbGllciAgIAlAMTMxNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTIyLCAyMjQxKQotCQkJCQkgICAgKDExMjIsIDIzMTgpCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4NTY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NiIgQDE0MzMKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAxNTY1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU3IiBAMTQzNAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzMKLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIgotCQkJCQljbGllbnQgICAgIAlAMTQzMwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDE1NjUpCi0JCQkJCSAgICAoOTU5LCAxNTY1KQotCQkJCQkgICAgKDk1OSwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5GYWNldCIgQDE0MzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDMzCi0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MzA5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTU2NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAxNTIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEwIiBAMTQzOAotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDE2NTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzAwMURCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTEiIEAxNDM5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQzOAotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBDRiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODE2LCAxNjUwKQotCQkJCQkgICAgKDk1OSwgMTY1MCkKLQkJCQkJICAgICg5NTksIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDQwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQzOAotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjQsIDE2MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTY1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAxNjA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDI3NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgwIiBAMTQ0MwotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgxIiBAMTQ0NAotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDMKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDQzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heExlbmd0aEZhY2V0IiBAMTQ0NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDMKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyMjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIgotCQkJCQljbGllbnQgICAgIAlAMTQ0MwotCQkJCQlzdXBwbGllciAgIAlAMTMxNwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjk3LCAyMzIxKQotCQkJCQkgICAgKDEyOTcsIDI0MDkpCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc5MjA4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MiIgQDE0NDgKLQkJCQlsb2NhdGlvbiAgIAkoMTE1OSwgMjI3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MyIgQDE0NDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQ0OAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0NTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMjM3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDI3IgotCQkJCQljbGllbnQgICAgIAlAMTQ0OAotCQkJCQlzdXBwbGllciAgIAlAMTMxOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTU5LCAyMjczKQotCQkJCQkgICAgKDExNTksIDI0MDkpCi0JCQkJCSAgICAoNDUwLCAyNDA5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0MDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMjM2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNiIgQDE0NTMKLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMjMzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNyIgQDE0NTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUzCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCQljbGllbnQgICAgIAlAMTQ1MwotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIgQDE0NTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUzCi0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NiwgMjQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUyNjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDYwIgotCQkJCQljbGllbnQgICAgIAlAMTQ1MwotCQkJCQlzdXBwbGllciAgIAlAMTMxOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk3LCAyMzM0KQotCQkJCQkgICAgKDExOTcsIDI0OTMpCi0JCQkJCSAgICAoNDUwLCAyNDkzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0OTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNywgMjQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE2MDQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNCIgQDE0NTgKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNSIgQDE0NTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQ1OAotCQkJCQlzdXBwbGllciAgIAlAMTMyMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IiBAMTQ2MAotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTgKLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NzAzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTgKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIzMSwgMjQzOCkKLQkJCQkJICAgICgxMjMxLCAyNjY4KQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxODgxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODQiIEAxNDYzCi0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDIzOTcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwMERFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODUiIEAxNDY0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0NjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYzCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MywgMjU1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzRDciCi0JCQkJCWNsaWVudCAgICAgCUAxNDYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMzE5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMzEsIDIzOTcpCi0JCQkJCSAgICAoMTIzMSwgMjU4NykKLQkJCQkJICAgICg0NTEsIDI1ODcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjU4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM1LCAyNTYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDY4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDc2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTksIDU3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNDQ0Ci0JCQkJaGVpZ2h0ICAgICAJNDEzCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0NjkKLQkJCQlsb2NhdGlvbiAgIAkoMTIwOSwgMTA2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwOSwgMTA2NSkKLQkJCQkgICAgKDEyMDksIDk3NCkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDAiIEAxNDcwCi0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxNDcxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3MAotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NywgMTAzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTg3NjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDNDIgotCQkJCQljbGllbnQgICAgIAlAMTQ3MAotCQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2MTcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQxIiBAMTQ3NAotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzAKLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NzAKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDg4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDYiIEAxNDc1Ci0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDg3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZEQjAxRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQ3NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NzUKLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU4LCA3OTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTIwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDY4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA5MTkpCi0JCQkJCSAgICAoMTQ1NCwgOTE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDkxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwOSwgODc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NyIgQDE0NzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDc1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDY4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA4MjgpCi0JCQkJCSAgICAoMTQ1NCwgODI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDgyOCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ4IiBAMTQ4MAotCQkJCWxvY2F0aW9uICAgCSgxNTM1LCA2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTIwMTA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0ODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDgwCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCQljbGllbnQgICAgIAlAMTQ4MAotCQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM1LCA2ODQpCi0JCQkJCSAgICAoMTUzNSwgNzI4KQotCQkJCQkgICAgKDE0NTQsIDcyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA3MjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDYsIDY4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ5IiBAMTQ4NAotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODAKLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1QiIKLQkJCQkJY2xpZW50ICAgICAJQDE0ODAKLQkJCQkJc3VwcGxpZXIgICAJQDE0NjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzNSwgNjg0KQotCQkJCQkgICAgKDE1MzUsIDY0MSkKLQkJCQkJICAgICgxNDU0LCA2NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNjQxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTIiIEAxNDg1Ci0JCQkJbG9jYXRpb24gICAJKDYxMywgOTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDg2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDg3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjUsIDk4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wbGV4VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTE3IgotCQkJCQljbGllbnQgICAgIAlAMTQ4NQotCQkJCQlzdXBwbGllciAgIAlAMTMyMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2MTMsIDk0MCkKLQkJCQkJICAgICgyODQsIDk0MCkKLQkJCQkJICAgICgyODQsIDEwMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDEwMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgOTcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1MyIgQDE0ODkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDg1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTIxIgotCQkJCQljbGllbnQgICAgIAlAMTQ4NQotCQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEwLCA5NDApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAMTQ2OAotCQkJCXN1cHBsaWVyICAgCUAxMjk4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTEyLCA1MTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTI5OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDkxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUAxMzIwCi0JCQkJc3VwcGxpZXIgICAJQDE0NjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDE0NjkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MCIgQDE0OTIKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MiwgMTEzMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0QjAxNzgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGUiIEAxNDkzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ5MgotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjQ2NzUzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQkJY2xpZW50ICAgICAJQDE0OTIKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxMjkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDk1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIxLCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTEiIEAxNDk2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ5MgotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDkyCi0JCQkJCXN1cHBsaWVyICAgCUAxNDY4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgOTc0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAMTQ5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDMwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDM2MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTUwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGdsb2JhbCA6IGJvb2xlYW4iCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0OTgKLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxNDk3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMjYyLCA1NjgpCi0JCQkJICAgICgyMjYyLCA0NzcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDk5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUAxMjk0Ci0JCQkJc3VwcGxpZXIgICAJQDE0OTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1OTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDQiIEAxNTAwCi0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGUiIEAxNTAxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUwMAotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMzEsIDQ5OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYyNjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRTUiCi0JCQkJCWNsaWVudCAgICAgCUAxNTAwCi0JCQkJCXN1cHBsaWVyICAgCUAxNDY4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1NTMsIDQ1MykKLQkJCQkJICAgICgxMjIyLCA0NTMpCi0JCQkJCSAgICAoMTIyMiwgNTYyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMjIsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NSwgNDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTIwMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NSIgQDE1MDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTAwCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNTAwCi0JCQkJCXN1cHBsaWVyICAgCUAxNDk3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNiIgQDE1MDUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwOCwgMzUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRGZWF0dXJlIiBAMTUwNgotCQkJCQlQYXJlbnRfVmlldyAJQDE1MDUKLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjk0MTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCQljbGllbnQgICAgIAlAMTUwNQotCQkJCQlzdXBwbGllciAgIAlAMTQ5NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxOTA4LCAzNTMpCi0JCQkJCSAgICAoMTkwOCwgMzg3KQotCQkJCQkgICAgKDE5OTMsIDM4NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk2NjM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzciIEAxNTA5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTUwNQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJCWNsaWVudCAgICAgCUAxNTA1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDk3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE5MDgsIDM1MykKLQkJCQkJICAgICgxOTA4LCAzMTkpCi0JCQkJCSAgICAoMTk5MywgMzE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTEwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUAxMjk4Ci0JCQkJc3VwcGxpZXIgICAJQDEyOTcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ5NCwgMjg0KQotCQkJCSAgICAoNDk0LCAyNDQpCi0JCQkJICAgICg5OTYsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NiwgMjQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTExCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUAxMjg1Ci0JCQkJc3VwcGxpZXIgICAJQDE0OTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MTgsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MTIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEzMjIKLQkJCQlzdXBwbGllciAgIAlAMTQ2OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDEyOTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDEwNjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ2OSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTEzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUAxNDk3Ci0JCQkJc3VwcGxpZXIgICAJQDEyOTcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIxNDcsIDI5MSkKLQkJCQkgICAgKDIxNDcsIDI0NCkKLQkJCQkgICAgKDE0NjgsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAyNDQpKSkpKSkpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0FDOTEwNTEwM0IyIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6bWltZSIgQDE1MTQKLQkJCWxvY2F0aW9uICAgCSg0MDAsIDI0MCkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTE0Ci0JCQkgICAgbG9jYXRpb24gICAJKDI1NiwgMTU2KQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkibWltZSIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiM0FDOTEyN0MwMjY2IgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp3c2RsIiBAMTUxNQotCQkJbG9jYXRpb24gICAJKDg4MCwgMjQwKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MTUKLQkJCSAgICBsb2NhdGlvbiAgIAkoNzM2LCAxNTYpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJ3c2RsIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQURGQjhFNTAyMUUiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OnhzZCIgQDE1MTYKLQkJCWxvY2F0aW9uICAgCSgxMzc2LCAyNDApCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNgotCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNTYpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJ4c2QiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM5QUJEQzZGMDFBQSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzQUM5MTA1MTAzMUYiCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjNBQzkxMDUyMDAxQSIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjNBQzkxMDUxMDMyNiIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiM0FDOTEwNTEwMzI4IgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJBTlNJIgotCQkJCXZhbHVlICAgICAgCTgwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIk9yYWNsZSIKLQkJCQl2YWx1ZSAgICAgIAk4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiCi0JCQkJdmFsdWUgICAgICAJODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiU3liYXNlIgotCQkJCXZhbHVlICAgICAgCTgwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIldhdGNvbSIKLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIklkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZSIKLQkJCXZhbHVlICAgICAgCSJWXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSJfViIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc09LIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExFbGVtZW50IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiIKLQkJCQl2YWx1ZSAgICAgIAk1NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk2MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCIKLQkJCQl2YWx1ZSAgICAgIAk1MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlVuaW9uIgotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcubWltZS9zcmMvcm9zZS9taW1lYmluZGluZ01ETC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLm1pbWUvc3JjL3Jvc2UvbWltZWJpbmRpbmdNREwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlJhaXNlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIgotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIm1fIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJInNfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb290RGlyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNIgotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN1biIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0IgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJJQk0iCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyIKLQkJCXZhbHVlICAgICAgCTMpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIl9JRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCIKLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50IgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTE5MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIgotCQkJCXZhbHVlICAgICAgCTE5MDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQUZURVIiCi0JCQkJdmFsdWUgICAgICAJMTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiCi0JCQkJdmFsdWUgICAgICAJMTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIgotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJST1ciCi0JCQkJdmFsdWUgICAgICAJMTcwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiCi0JCQkJdmFsdWUgICAgICAJMTYwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSI2IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLm1pbWUvc3JjL3Jvc2UvbWltZWJpbmRpbmdNREwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLm1pbWUvc3JjL3Jvc2UvbWltZWJpbmRpbmdNREwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kZW50IgotCQkJdmFsdWUgICAgICAJMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiCi0JCQkJdmFsdWUgICAgICAJNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciIKLQkJCQl2YWx1ZSAgICAgIAk3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJTQ0MiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlR5cGVMaWJJbXBvcnRlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiCi0JCQkJdmFsdWUgICAgICAJMjEzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiMCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlIgotCQkJdmFsdWUgICAgICAJKCJDcmVhdGFibGVTZXQiIDIyMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluaXRpYWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVRlcm1pbmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiQ29sbGVjdGlvbiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiVGV4dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiRvcGVyYXRpb24iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JcXVpZCAgICAgICAJIjNBQzkxMDUxMDMyNyIpKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjZmODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNnZXRNSU1FQ29udGVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTUlNRUNvbnRlbnQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRUNvbnRlbnRfVHlwZSgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50I2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQYXJ0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FUGFydDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFydDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RVBhcnQoUGFydCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNnZXRNSU1FQ29udGVudF9FUGFydCgpCi0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYXJ0IGdldEVQYXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFydDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVQYXJ0KFBhcnQgdmFsdWUpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAbW9kZWwgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFydChTdHJpbmcgcGFydCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIHBhcmFtZXRlcnM9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhcnQoKTsKLQotfSAvLyBNSU1FQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NWUxMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRUZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsLk1JTUVGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNSU1FQ29udGVudCBjcmVhdGVNSU1FQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNSU1FUGFydCBjcmVhdGVNSU1FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1JTUVNdWx0aXBhcnRSZWxhdGVkIGNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbWUgWG1sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaW1lIFhtbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRU1pbWVYbWwgY3JlYXRlTUlNRU1pbWVYbWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRVBhY2thZ2UgZ2V0TUlNRVBhY2thZ2UoKTsKLQotfSAvL01JTUVGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTWltZVhtbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRU1pbWVYbWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3OTRjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTWltZVhtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaW1lIFhtbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRU1pbWVYbWwoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1JTUVNaW1lWG1sIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVQYXJ0KFBhcnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRU1pbWVYbWxfRVBhcnQoKQotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFydCBnZXRFUGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sI2dldEVQYXJ0IDxlbT5FUGFydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVBhcnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFUGFydChQYXJ0IHZhbHVlKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcnQoU3RyaW5nIHBhcnQpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXJ0KCk7Ci0KLX0gLy8gTUlNRU1pbWVYbWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVNdWx0aXBhcnRSZWxhdGVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FTXVsdGlwYXJ0UmVsYXRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE3YjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVNdWx0aXBhcnRSZWxhdGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk11bHRpcGFydCBSZWxhdGVkPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCNnZXRFTUlNRVBhcnQgPGVtPkVNSU1FIFBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTUlNRU11bHRpcGFydFJlbGF0ZWQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVNSU1FIFBhcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU1JTUUgUGFydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVNSU1FIFBhcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2UjZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWRfRU1JTUVQYXJ0KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RU1JTUVQYXJ0KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBhZGRNSU1FUGFydChNSU1FUGFydCBtaW1lUGFydCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLkxpc3QiIHBhcmFtZXRlcnM9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRNSU1FUGFydHMoKTsKLQotfSAvLyBNSU1FTXVsdGlwYXJ0UmVsYXRlZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL01JTUVQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODc2ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVGYWN0b3J5Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTUlNRVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJtaW1lIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9NSU1FIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm1pbWUiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNSU1FUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbC5NSU1FUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FQ29udGVudEltcGwgPGVtPkNvbnRlbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRNSU1FQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNSU1FX0NPTlRFTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVF9fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVF9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVF9fVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfQ09OVEVOVF9fRVBBUlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkNvbnRlbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYXJ0SW1wbCA8ZW0+UGFydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYXJ0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldE1JTUVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1JTUVfUEFSVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9QQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9QQVJUX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9QQVJUX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9QQVJUX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UGFydDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX1BBUlRfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsIDxlbT5NdWx0aXBhcnQgUmVsYXRlZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldE1JTUVNdWx0aXBhcnRSZWxhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1JTUVfTVVMVElQQVJUX1JFTEFURUQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTVVMVElQQVJUX1JFTEFURURfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNSU1FIFBhcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTVVMVElQQVJUX1JFTEFURURfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRU1pbWVYbWxJbXBsIDxlbT5NaW1lIFhtbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNaW1lWG1sSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRVBhY2thZ2VJbXBsI2dldE1JTUVNaW1lWG1sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUwgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUxfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSU1FX01JTUVfWE1MX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NSU1FX1hNTF9fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUxfX0VMRU1FTlRfVFlQRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYXJ0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlNRV9NSU1FX1hNTF9fRVBBUlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1pbWUgWG1sPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTUVfTUlNRV9YTUxfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydCA8ZW0+SU1JTUUgUGFydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0SU1JTUVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNSU1FX1BBUlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTUlNRSBQYXJ0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNSU1FX1BBUlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkIDxlbT5JTUlNRSBNdWx0aXBhcnQgUmVsYXRlZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0SU1JTUVNdWx0aXBhcnRSZWxhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNSU1FX01VTFRJUEFSVF9SRUxBVEVEID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1JTUVfTVVMVElQQVJUX1JFTEFURURfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IDxlbT5JTUlNRSBDb250ZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRJTUlNRUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1JTUVfQ09OVEVOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklNSU1FIENvbnRlbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1JTUVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwgPGVtPklNSU1FIE1pbWUgWG1sPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVQYWNrYWdlSW1wbCNnZXRJTUlNRU1pbWVYbWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1JTUVfTUlNRV9YTUwgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUlNRV9NSU1FX1hNTF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TGlzdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FUGFja2FnZUltcGwjZ2V0TGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMSVNUID0gODsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1JTUVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRNSU1FQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TUlNRUNvbnRlbnRfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RVBhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQjZ2V0RVBhcnQoKQotCSAqIEBzZWUgI2dldE1JTUVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNSU1FQ29udGVudF9FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0IDxlbT5QYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1JTUVQYXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQgPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCNnZXRFTUlNRVBhcnQgPGVtPkVNSU1FIFBhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVNSU1FIFBhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQjZ2V0RU1JTUVQYXJ0KCkKLQkgKiBAc2VlICNnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWRfRU1JTUVQYXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwgPGVtPk1pbWUgWG1sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pbWUgWG1sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNSU1FTWltZVhtbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RVBhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwjZ2V0RVBhcnQoKQotCSAqIEBzZWUgI2dldE1JTUVNaW1lWG1sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNSU1FTWltZVhtbF9FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgPGVtPklNSU1FIFBhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1JTUUgUGFydDwvZW0+Jy4KLQkgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElNSU1FUGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQgPGVtPklNSU1FIE11bHRpcGFydCBSZWxhdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklNSU1FIE11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SU1JTUVNdWx0aXBhcnRSZWxhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCA8ZW0+SU1JTUUgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTUlNRSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQiIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SU1JTUVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCA8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPicuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJTUlNRU1pbWVYbWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuTGlzdCA8ZW0+TGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TGlzdDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5MaXN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTUlNRUZhY3RvcnkgZ2V0TUlNRUZhY3RvcnkoKTsKLQotfSAvL01JTUVQYWNrYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FUGFydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvTUlNRVBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjYjgyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9NSU1FUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJ0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNnZXRNSU1FUGFydCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTUlNRVBhcnQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQG1vZGVsIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLkxpc3QiIHBhcmFtZXRlcnM9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQotfSAvLyBNSU1FUGFydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMmY5MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLnV0aWwuTUlNRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmltcGwuTUlNRUNvbnRlbnRJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVDb250ZW50SW1wbCNnZXRFUGFydCA8ZW0+RVBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FQ29udGVudEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBNSU1FQ29udGVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUGFydCgpIDxlbT5FUGFydDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RVBhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQYXJ0IGVQYXJ0ID0gbnVsbDsKLQkKLSAgICBwcml2YXRlIFN0cmluZyBwYXJ0OyAvLyBUQkQKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TUlNRUNvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnQgZ2V0RVBhcnQoKSB7Ci0JCWlmIChlUGFydCAhPSBudWxsICYmIGVQYXJ0LmVJc1Byb3h5KCkpIHsKLQkJCVBhcnQgb2xkRVBhcnQgPSBlUGFydDsKLQkJCWVQYXJ0ID0gKFBhcnQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVQYXJ0KTsKLQkJCWlmIChlUGFydCAhPSBvbGRFUGFydCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQsIG9sZEVQYXJ0LCBlUGFydCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlUGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFydCBiYXNpY0dldEVQYXJ0KCkgewotCQlyZXR1cm4gZVBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RVBhcnQoUGFydCBuZXdFUGFydCkgewotCQlQYXJ0IG9sZEVQYXJ0ID0gZVBhcnQ7Ci0JCWVQYXJ0ID0gbmV3RVBhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQsIG9sZEVQYXJ0LCBlUGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0KFN0cmluZyBwYXJ0KSB7Ci0gICAgICB0aGlzLnBhcnQgPSBwYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnQoKSB7Ci0gICAgICByZXR1cm4gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VQQVJUOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVBhcnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFUGFydCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRVBBUlQ6Ci0JCQkJc2V0RVBhcnQoKFBhcnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FUEFSVDoKLQkJCQlzZXRFUGFydCgoUGFydCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FTEVNRU5UOgotCQkJCXJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfQ09OVEVOVF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX0VMRU1FTlRfVFlQRToKLQkJCQlyZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX0NPTlRFTlRfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UX19FUEFSVDoKLQkJCQlyZXR1cm4gZVBhcnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAJc2V0UGFydAotICAgICAgKE1JTUVDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBNSU1FQ29uc3RhbnRzLlBBUlRfQVRUUklCVVRFKSk7Ci0gIAlzZXRUeXBlCi0gICAgICAoTUlNRUNvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIE1JTUVDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IE1JTUVQYWNrYWdlLmVJTlNUQU5DRS4gZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LE1JTUVDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUsZ2V0UGFydCgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuIGdldE1JTUVDb250ZW50X1R5cGUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LE1JTUVDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsZ2V0VHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotfSAvL01JTUVDb250ZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NjA3YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTUlNRUZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UOiByZXR1cm4gY3JlYXRlTUlNRUNvbnRlbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUOiByZXR1cm4gY3JlYXRlTUlNRVBhcnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRDogcmV0dXJuIGNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkKCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUw6IHJldHVybiBjcmVhdGVNSU1FTWltZVhtbCgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTElTVDoKLQkJCQlyZXR1cm4gY3JlYXRlTGlzdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTElTVDoKLQkJCQlyZXR1cm4gY29udmVydExpc3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVDb250ZW50IGNyZWF0ZU1JTUVDb250ZW50KCkgewotCQlNSU1FQ29udGVudEltcGwgbWltZUNvbnRlbnQgPSBuZXcgTUlNRUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBtaW1lQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRVBhcnQgY3JlYXRlTUlNRVBhcnQoKSB7Ci0JCU1JTUVQYXJ0SW1wbCBtaW1lUGFydCA9IG5ldyBNSU1FUGFydEltcGwoKTsKLQkJcmV0dXJuIG1pbWVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBjcmVhdGVNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpIHsKLQkJTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsIG1pbWVNdWx0aXBhcnRSZWxhdGVkID0gbmV3IE1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCgpOwotCQlyZXR1cm4gbWltZU11bHRpcGFydFJlbGF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVNaW1lWG1sIGNyZWF0ZU1JTUVNaW1lWG1sKCkgewotCQlNSU1FTWltZVhtbEltcGwgbWltZU1pbWVYbWwgPSBuZXcgTUlNRU1pbWVYbWxJbXBsKCk7Ci0JCXJldHVybiBtaW1lTWltZVhtbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBjcmVhdGVMaXN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTGlzdClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRMaXN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FUGFja2FnZSBnZXRNSU1FUGFja2FnZSgpIHsKLQkJcmV0dXJuIChNSU1FUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNSU1FUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTUlNRVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLX0gLy9NSU1FRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU1pbWVYbWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVNaW1lWG1sSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU4MzRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU1pbWVYbWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsLk1JTUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbWUgWG1sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW1wbC5NSU1FTWltZVhtbEltcGwjZ2V0RVBhcnQgPGVtPkVQYXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRU1pbWVYbWxJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgTUlNRU1pbWVYbWwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVQYXJ0KCkgPGVtPkVQYXJ0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFUGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBhcnQgZVBhcnQgPSBudWxsOwotCQotICAgIHByaXZhdGUgU3RyaW5nIHBhcnQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTUlNRU1pbWVYbWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTUlNRVBhY2thZ2UuZUlOU1RBTkNFLmdldE1JTUVNaW1lWG1sKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnQgZ2V0RVBhcnQoKSB7Ci0JCWlmIChlUGFydCAhPSBudWxsICYmIGVQYXJ0LmVJc1Byb3h5KCkpIHsKLQkJCVBhcnQgb2xkRVBhcnQgPSBlUGFydDsKLQkJCWVQYXJ0ID0gKFBhcnQpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVQYXJ0KTsKLQkJCWlmIChlUGFydCAhPSBvbGRFUGFydCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VQQVJULCBvbGRFUGFydCwgZVBhcnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZVBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnQgYmFzaWNHZXRFUGFydCgpIHsKLQkJcmV0dXJuIGVQYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVQYXJ0KFBhcnQgbmV3RVBhcnQpIHsKLQkJUGFydCBvbGRFUGFydCA9IGVQYXJ0OwotCQllUGFydCA9IG5ld0VQYXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FUEFSVCwgb2xkRVBhcnQsIGVQYXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnQoU3RyaW5nIHBhcnQpIHsKLSAgICAgIHRoaXMucGFydCA9IHBhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkIE5PVAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydCgpIHsKLSAgICAgIHJldHVybiBwYXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VQQVJUOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVBhcnQoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRFUGFydCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRVBBUlQ6Ci0JCQkJc2V0RVBhcnQoKFBhcnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVDoKLQkJCQlzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fUkVRVUlSRUQ6Ci0JCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FUEFSVDoKLQkJCQlzZXRFUGFydCgoUGFydCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUxfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01JTUVfWE1MX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NSU1FX1hNTF9fRVBBUlQ6Ci0JCQkJcmV0dXJuIGVQYXJ0ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gIAlzZXRQYXJ0Ci0gICAgICAoTUlNRUNvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIE1JTUVDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IE1JTUVQYWNrYWdlLmVJTlNUQU5DRS4gZ2V0TUlNRUNvbnRlbnRfRVBhcnQoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LE1JTUVDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUsZ2V0UGFydCgpKTsKLSAgICB9Ci0gIH0KLQotfSAvL01JTUVNaW1lWG1sSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRU11bHRpcGFydFJlbGF0ZWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzgyYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvaW1wbC9NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLmludGVybmFsLnV0aWwuTUlNRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbXBsLk1JTUVNdWx0aXBhcnRSZWxhdGVkSW1wbCNnZXRFTUlNRVBhcnQgPGVtPkVNSU1FIFBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBNSU1FTXVsdGlwYXJ0UmVsYXRlZCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU1JTUVQYXJ0KCkgPGVtPkVNSU1FIFBhcnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RU1JTUVQYXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZU1JTUVQYXJ0ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNSU1FUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU1JTUVQYXJ0KCkgewotCQlpZiAoZU1JTUVQYXJ0ID09IG51bGwpIHsKLQkJCWVNSU1FUGFydCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNSU1FUGFydC5jbGFzcywgdGhpcywgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVCk7Ci0JCX0KLQkJcmV0dXJuIGVNSU1FUGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIHZvaWQgYWRkTUlNRVBhcnQoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgbWltZVBhcnQpIHsKLQkJZ2V0RU1JTUVQYXJ0KCkuYWRkKG1pbWVQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNSU1FUGFydHMoKSB7Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQ6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU1JTUVQYXJ0KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX1JFUVVJUkVEOgotCQkJCXJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQ6Ci0JCQkJcmV0dXJuIGdldEVNSU1FUGFydCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlRfVFlQRToKLQkJCQlzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVDoKLQkJCQlnZXRFTUlNRVBhcnQoKS5jbGVhcigpOwotCQkJCWdldEVNSU1FUGFydCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19SRVFVSVJFRDoKLQkJCQlzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VNSU1FX1BBUlQ6Ci0JCQkJZ2V0RU1JTUVQYXJ0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURURfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9NVUxUSVBBUlRfUkVMQVRFRF9fRU1JTUVfUEFSVDoKLQkJCQlyZXR1cm4gZU1JTUVQYXJ0ICE9IG51bGwgJiYgIWVNSU1FUGFydC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICAgIHsKLSAgICAgIGlmIChNSU1FQ29uc3RhbnRzLlBBUlRfRUxFTUVOVF9UQUcuZXF1YWxzKGNoaWxkLmdldExvY2FsTmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgTUlNRVBhcnQgbWltZVBhcnQgPSBNSU1FRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTUlNRVBhcnQoKTsKLQkgICAgbWltZVBhcnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCSAgICBtaW1lUGFydC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgYWRkTUlNRVBhcnQobWltZVBhcnQpOwotICAgICAgfQotICAgIH0KLX0gLy9NSU1FTXVsdGlwYXJ0UmVsYXRlZEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRVBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU0YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUGFja2FnZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTUlNRVBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVQYXJ0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbWVNaW1lWG1sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGltaW1lUGFydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW1pbWVDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGltaW1lTWltZVhtbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBsaXN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTUlNRVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNSU1FRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNSU1FUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoTUlNRVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KE1JTUVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UuCi0JCU1JTUVQYWNrYWdlSW1wbCB0aGVNSU1FUGFja2FnZSA9IChNSU1FUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IE1JTUVQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhTRFBhY2thZ2VJbXBsLmluaXQoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoV1NETFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChXU0RMUGFja2FnZS5lTlNfVVJJKSA6IFdTRExQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCi0JCS8vIFN0ZXAgMTogY3JlYXRlIG1ldGEtbW9kZWwgb2JqZWN0cwotCQl0aGVNSU1FUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV1NETFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gU3RlcCAyOiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgotCQl0aGVNSU1FUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdTRExQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQlyZXR1cm4gdGhlTUlNRVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNSU1FQ29udGVudCgpIHsKLQkJcmV0dXJuIG1pbWVDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1JTUVDb250ZW50X1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltaW1lQ29udGVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1JTUVDb250ZW50X0VQYXJ0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWltZUNvbnRlbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1JTUVQYXJ0KCkgewotCQlyZXR1cm4gbWltZVBhcnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpIHsKLQkJcmV0dXJuIG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1JTUVNdWx0aXBhcnRSZWxhdGVkX0VNSU1FUGFydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNSU1FTWltZVhtbCgpIHsKLQkJcmV0dXJuIG1pbWVNaW1lWG1sRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1JTUVNaW1lWG1sX0VQYXJ0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWltZU1pbWVYbWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElNSU1FUGFydCgpIHsKLQkJcmV0dXJuIGltaW1lUGFydEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpIHsKLQkJcmV0dXJuIGltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElNSU1FQ29udGVudCgpIHsKLQkJcmV0dXJuIGltaW1lQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElNSU1FTWltZVhtbCgpIHsKLQkJcmV0dXJuIGltaW1lTWltZVhtbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExpc3QoKSB7Ci0JCXJldHVybiBsaXN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNSU1FRmFjdG9yeSBnZXRNSU1FRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNSU1FRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQltaW1lQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX0NPTlRFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1pbWVDb250ZW50RUNsYXNzLCBNSU1FX0NPTlRFTlRfX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1pbWVDb250ZW50RUNsYXNzLCBNSU1FX0NPTlRFTlRfX0VQQVJUKTsKLQotCQltaW1lUGFydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX1BBUlQpOwotCi0JCW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTUVfTVVMVElQQVJUX1JFTEFURUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLCBNSU1FX01VTFRJUEFSVF9SRUxBVEVEX19FTUlNRV9QQVJUKTsKLQotCQltaW1lTWltZVhtbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNSU1FX01JTUVfWE1MKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtaW1lTWltZVhtbEVDbGFzcywgTUlNRV9NSU1FX1hNTF9fRVBBUlQpOwotCi0JCWltaW1lUGFydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUlNRV9QQVJUKTsKLQotCQlpbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1JTUVfTVVMVElQQVJUX1JFTEFURUQpOwotCi0JCWltaW1lQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUlNRV9DT05URU5UKTsKLQotCQlpbWltZU1pbWVYbWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1JTUVfTUlNRV9YTUwpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCWxpc3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTElTVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVdTRExQYWNrYWdlSW1wbCB0aGVXU0RMUGFja2FnZSA9IChXU0RMUGFja2FnZUltcGwpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQltaW1lQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJbWltZUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTUlNRUNvbnRlbnQoKSk7Ci0JCW1pbWVQYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotCQltaW1lUGFydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElNSU1FUGFydCgpKTsKLQkJbWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlV1NETFBhY2thZ2UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSk7Ci0JCW1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU1JTUVNdWx0aXBhcnRSZWxhdGVkKCkpOwotCQltaW1lTWltZVhtbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLQkJbWltZU1pbWVYbWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTUlNRU1pbWVYbWwoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhtaW1lQ29udGVudEVDbGFzcywgTUlNRUNvbnRlbnQuY2xhc3MsICJNSU1FQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1JTUVDb250ZW50X1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNSU1FQ29udGVudF9FUGFydCgpLCB0aGVXU0RMUGFja2FnZS5nZXRQYXJ0KCksIG51bGwsICJlUGFydCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLQkJRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24obWltZUNvbnRlbnRFQ2xhc3MsIG51bGwsICJzZXRQYXJ0Iik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJ0Iik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtaW1lQ29udGVudEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFBhcnQiKTsKLQotCQlpbml0RUNsYXNzKG1pbWVQYXJ0RUNsYXNzLCBNSU1FUGFydC5jbGFzcywgIk1JTUVQYXJ0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWltZVBhcnRFQ2xhc3MsIG51bGwsICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCIpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGVXU0RMUGFja2FnZS5nZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSwgImV4dGVuc2liaWxpdHlFbGVtZW50Iik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtaW1lUGFydEVDbGFzcywgdGhpcy5nZXRMaXN0KCksICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiKTsKLQotCQlpbml0RUNsYXNzKG1pbWVNdWx0aXBhcnRSZWxhdGVkRUNsYXNzLCBNSU1FTXVsdGlwYXJ0UmVsYXRlZC5jbGFzcywgIk1JTUVNdWx0aXBhcnRSZWxhdGVkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TUlNRU11bHRpcGFydFJlbGF0ZWRfRU1JTUVQYXJ0KCksIHRoaXMuZ2V0TUlNRVBhcnQoKSwgbnVsbCwgImVNSU1FUGFydCIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcywgbnVsbCwgImFkZE1JTUVQYXJ0Iik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SU1JTUVQYXJ0KCksICJtaW1lUGFydCIpOwotCi0JCWFkZEVPcGVyYXRpb24obWltZU11bHRpcGFydFJlbGF0ZWRFQ2xhc3MsIHRoaXMuZ2V0TGlzdCgpLCAiZ2V0TUlNRVBhcnRzIik7Ci0KLQkJaW5pdEVDbGFzcyhtaW1lTWltZVhtbEVDbGFzcywgTUlNRU1pbWVYbWwuY2xhc3MsICJNSU1FTWltZVhtbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1JTUVNaW1lWG1sX0VQYXJ0KCksIHRoZVdTRExQYWNrYWdlLmdldFBhcnQoKSwgbnVsbCwgImVQYXJ0IiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWltZU1pbWVYbWxFQ2xhc3MsIG51bGwsICJzZXRQYXJ0Iik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJ0Iik7Ci0KLQkJYWRkRU9wZXJhdGlvbihtaW1lTWltZVhtbEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFBhcnQiKTsKLQotCQlpbml0RUNsYXNzKGltaW1lUGFydEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQuY2xhc3MsICJJTUlNRVBhcnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGltaW1lTXVsdGlwYXJ0UmVsYXRlZEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQuY2xhc3MsICJJTUlNRU11bHRpcGFydFJlbGF0ZWQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGltaW1lQ29udGVudEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQuY2xhc3MsICJJTUlNRUNvbnRlbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQlpbml0RUNsYXNzKGltaW1lTWltZVhtbEVDbGFzcywgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwuY2xhc3MsICJJTUlNRU1pbWVYbWwiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZShsaXN0RURhdGFUeXBlLCBMaXN0LmNsYXNzLCAiTGlzdCIsIElTX1NFUklBTElaQUJMRSk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLX0gLy9NSU1FUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRVBhcnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC9pbXBsL01JTUVQYXJ0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGQzNDg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL2ltcGwvTUlNRVBhcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuV1NETEZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FUGFydEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBNSU1FUGFydCB7Ci0JCi0gICAgcHJpdmF0ZSBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1JTUVQYXJ0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1JTUVQYWNrYWdlLmVJTlNUQU5DRS5nZXRNSU1FUGFydCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZCBOT1QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkgewotICAgICAgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkKGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQgTk9UCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2liaWxpdHlFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0VMRU1FTlQ6Ci0JCQkJc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLQkJCQlzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UOgotCQkJCXNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVF9UWVBFOgotCQkJCXNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotCQkJCXJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0JCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfUEFSVF9fRUxFTUVOVDoKLQkJCQlyZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlRfX1JFUVVJUkVEOgotCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9QQVJUX19FTEVNRU5UX1RZUEU6Ci0JCQkJcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCQotICAvLwotICAvLyBSZWNvbmNpbGlhdGlvbjogRE9NIC0+IE1PREVMCi0gIC8vCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBpZiAoIVdTRExDb25zdGFudHMuaXNNYXRjaGluZ05hbWVzcGFjZShjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSwgV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpKQotICAgIHsgIAotICAgICAgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB1c2VFeHRlbnNpb25GYWN0b3JpZXMoKSA/IAotICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICAgKChXU0RMRmFjdG9yeUltcGwpV1NETEZhY3RvcnkuZUlOU1RBTkNFKS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLQkgICAgICAgICAgCi0gICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQkgIAotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkKLSAgewotICAJLy8gVXNlIGV4dGVuc2lvbiBmYWN0b3JpZXMgYnkgZGVmYXVsdC4KLSAgICByZXR1cm4gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpID09IG51bGwgPyAKLSAgICAgIHRydWUgOiAoKERlZmluaXRpb25JbXBsKWdldEVuY2xvc2luZ0RlZmluaXRpb24oKSkuZ2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCk7Ci0gIH0KLQotfSAvL01JTUVQYXJ0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODg3ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNSU1FQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1JTUVQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTUlNRUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1JTUVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNSU1FU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IE1JTUVTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FQ29udGVudChNSU1FQ29udGVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRUNvbnRlbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FUGFydChNSU1FUGFydCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRVBhcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTXVsdGlwYXJ0UmVsYXRlZChNSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRU11bHRpcGFydFJlbGF0ZWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTWltZVhtbChNSU1FTWltZVhtbCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTUlNRU1pbWVYbWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRVBhcnQoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlNSU1FUGFydEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FTXVsdGlwYXJ0UmVsYXRlZChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSU1JTUVDb250ZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJTUlNRUNvbnRlbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJTUlNRU1pbWVYbWwoamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU1pbWVYbWwgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUlNSU1FTWltZVhtbEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FQ29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTUlNRUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFydCA8ZW0+UGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTUlNRVBhcnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+TXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRU1pbWVYbWwgPGVtPk1pbWUgWG1sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTWltZVhtbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNSU1FTWltZVhtbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQgPGVtPklNSU1FIFBhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1JTUVQYXJ0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCA8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1JTUVNdWx0aXBhcnRSZWxhdGVkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudCA8ZW0+SU1JTUUgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJTUlNRUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNaW1lWG1sIDxlbT5JTUlNRSBNaW1lIFhtbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJTUlNRU1pbWVYbWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9NSU1FQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODk4OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1JTUVDb25zdGFudHMgCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRUxFTUVOVF9UQUcgPSAiY29udGVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfWE1MX0VMRU1FTlRfVEFHID0gIm1pbWVYTUwiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlRfUkVMQVRFRF9FTEVNRU5UX1RBRyA9ICJtdWx0aXBhcnRSZWxhdGVkIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9FTEVNRU5UX1RBRyA9ICJwYXJ0IjsKLQkgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9BVFRSSUJVVEUgPSJwYXJ0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9BVFRSSUJVVEUgPSJ0eXBlIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgOiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTVkN2JiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLW1pbWUvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9taW1lL2ludGVybmFsL3V0aWwvTUlNRUV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIE1JTUVFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgaW1wbGVtZW50cyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLXsKLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBpZiAoTUlNRUNvbnN0YW50cy5NSU1FX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgaWYgKE1JTUVDb25zdGFudHMuQ09OVEVOVF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIE1JTUVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNSU1FQ29udGVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoTUlNRUNvbnN0YW50cy5NSU1FX1hNTF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIE1JTUVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNSU1FTWltZVhtbCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoTUlNRUNvbnN0YW50cy5NVUxUSVBBUlRfUkVMQVRFRF9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIE1JTUVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNSU1FTXVsdGlwYXJ0UmVsYXRlZCgpOwotICAgICAgfQotICAgICAgLyogVE9ETyAtIGZpeCB0aGUgcm9zZSBtb2RlbAotICAgICAgZWxzZSBpZiAoInBhcnQiLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gTUlNRUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1JTUVQYXJ0KCk7Ci0gICAgICB9Ci0gICAgICAqLwotCSAgZWxzZQotCSAgewotCSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5oYW5kbGVkIGxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSk7Ci0JICAgIHJldHVybiBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5oYW5kbGVkIG5hbWVzcGFjZTogIiArIG5hbWVzcGFjZSk7Ci0gICAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtbWltZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL21pbWUvaW50ZXJuYWwvdXRpbC9NSU1FU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhNTZkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1taW1lL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvbWltZS9pbnRlcm5hbC91dGlsL01JTUVTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVNaW1lWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLm1pbWUuTUlNRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5taW1lLk1JTUVQYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcubWltZS5NSU1FUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTUlNRVN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNSU1FUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1JTUVTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTUlNRVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgTUlNRVBhY2thZ2UuTUlNRV9DT05URU5UOiB7Ci0JCQkJCU1JTUVDb250ZW50IG1pbWVDb250ZW50ID0gKE1JTUVDb250ZW50KXRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTUlNRUNvbnRlbnQobWltZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChtaW1lQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlNSU1FQ29udGVudChtaW1lQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG1pbWVDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBNSU1FUGFja2FnZS5NSU1FX1BBUlQ6IHsKLQkJCQkJTUlNRVBhcnQgbWltZVBhcnQgPSAoTUlNRVBhcnQpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNSU1FUGFydChtaW1lUGFydCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVQYXJ0KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU1JTUVQYXJ0KG1pbWVQYXJ0KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQobWltZVBhcnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZVBhcnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTVVMVElQQVJUX1JFTEFURUQ6IHsKLQkJCQkJTUlNRU11bHRpcGFydFJlbGF0ZWQgbWltZU11bHRpcGFydFJlbGF0ZWQgPSAoTUlNRU11bHRpcGFydFJlbGF0ZWQpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNSU1FTXVsdGlwYXJ0UmVsYXRlZChtaW1lTXVsdGlwYXJ0UmVsYXRlZCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVNdWx0aXBhcnRSZWxhdGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU1JTUVNdWx0aXBhcnRSZWxhdGVkKG1pbWVNdWx0aXBhcnRSZWxhdGVkKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQobWltZU11bHRpcGFydFJlbGF0ZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZU11bHRpcGFydFJlbGF0ZWQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIE1JTUVQYWNrYWdlLk1JTUVfTUlNRV9YTUw6IHsKLQkJCQkJTUlNRU1pbWVYbWwgbWltZU1pbWVYbWwgPSAoTUlNRU1pbWVYbWwpdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNSU1FTWltZVhtbChtaW1lTWltZVhtbCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG1pbWVNaW1lWG1sKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU1JTUVNaW1lWG1sKG1pbWVNaW1lWG1sKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQobWltZU1pbWVYbWwpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQobWltZU1pbWVYbWwpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1JTUVDb250ZW50KE1JTUVDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJ0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FUGFydChNSU1FUGFydCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk11bHRpcGFydCBSZWxhdGVkPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTXVsdGlwYXJ0UmVsYXRlZChNSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgWG1sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgWG1sPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNSU1FTWltZVhtbChNSU1FTWltZVhtbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIFBhcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgUGFydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSU1JTUVQYXJ0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgTXVsdGlwYXJ0IFJlbGF0ZWQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FTXVsdGlwYXJ0UmVsYXRlZChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNSU1FIENvbnRlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlSU1JTUVDb250ZW50KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU1JTUUgTWltZSBYbWw8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlNSU1FTWltZVhtbChqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTWltZVhtbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9NSU1FU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL1NPQVAuZ2VubW9kZWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL1NPQVAuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNDQxY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9tb2RlbC9TT0FQLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5zb2FwL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLnNvYXAuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZy5zb2FwLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nLnNvYXAiIG1vZGVsTmFtZT0iU09BUCIgZWRpdFBsdWdpbkNsYXNzPSIiCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9IiIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjL21vZGVsL1hTRC5nZW5tb2RlbCMvL3hzZCI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxzb2FwLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPlZBQkFTRV9QTFVHSU5TX1BBVEg8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD4uLi8uLi8uLjwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJTT0FQIiBiYXNlUGFja2FnZT0iY29tLmlibS5ldG9vbHMud3NkbC5iaW5kaW5nIiBlY29yZVBhY2thZ2U9InNvYXAuZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJzb2FwLmVjb3JlIy8vSVN0cmluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQQmluZGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQmluZGluZy90cmFuc3BvcnRVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBCaW5kaW5nL3N0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQQm9keSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQm9keS91c2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBCb2R5L25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEJvZHkvZW5jb2RpbmdTdHlsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc29hcC5lY29yZSMvL1NPQVBCb2R5L3BhcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyQmFzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyQmFzZS91c2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUEhlYWRlckJhc2UvZW5jb2RpbmdTdHlsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL21lc3NhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugc29hcC5lY29yZSMvL1NPQVBIZWFkZXJCYXNlL3BhcnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBGYXVsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQRmF1bHQvdXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQRmF1bHQvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQRmF1bHQvZW5jb2RpbmdTdHlsZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBPcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBzb2FwLmVjb3JlIy8vU09BUE9wZXJhdGlvbi9zb2FwQWN0aW9uVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQT3BlcmF0aW9uL3N0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InNvYXAuZWNvcmUjLy9TT0FQQWRkcmVzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHNvYXAuZWNvcmUjLy9TT0FQQWRkcmVzcy9sb2NhdGlvblVSSSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJzb2FwLmVjb3JlIy8vU09BUEhlYWRlckZhdWx0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ic29hcC5lY29yZSMvL1NPQVBIZWFkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHNvYXAuZWNvcmUjLy9TT0FQSGVhZGVyL2hlYWRlckZhdWx0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iV1NETCIgYmFzZVBhY2thZ2U9ImNvbS5pYm0uZXRvb2xzIiBlY29yZVBhY2thZ2U9IndzZGwuZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vUU5hbWUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9PcGVyYXRpb25UeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRWxlbWVudCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1dTRExFeGNlcHRpb24iLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01Eb2N1bWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9kb2N1bWVudGF0aW9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZWxlbWVudCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9nZXRFbmNsb3NpbmdEZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL1dTRExFbGVtZW50L3NldEVuY2xvc2luZ0RlZmluaXRpb24vZGVmaW5pdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydFR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BvcnRUeXBlL2VPcGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9PcGVyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3N0eWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vcmVzb3VyY2VVUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZU91dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9PcGVyYXRpb24vZUZhdWx0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VQYXJhbWV0ZXJPcmRlcmluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vTWVzc2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3VuZGVmaW5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL2VQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUGFydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BhcnQvdHlwZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvdHlwZURlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvZWxlbWVudERlY2xhcmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9QYXJ0L2VNZXNzYWdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VQb3J0VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VCaW5kaW5nT3BlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZU9wZXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ091dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VCaW5kaW5nRmF1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9TZXJ2aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1NlcnZpY2UvZVBvcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Qb3J0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUG9ydC9lQmluZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50L2VsZW1lbnRUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2xvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VuY29kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU1lc3NhZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVBvcnRUeXBlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VCaW5kaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VTZXJ2aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VOYW1lc3BhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZVR5cGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUltcG9ydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9nZXREb2N1bWVudCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50L2RvY3VtZW50Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbXBvcnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L25hbWVzcGFjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2xvY2F0aW9uVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZURlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0ltcG9ydC9lU2NoZW1hIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0ltcG9ydC9nZXRTY2hlbWEiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L3NldFNjaGVtYS9zY2hlbWEiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZUV4dGVuc2liaWxpdHlFbGVtZW50cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50L2V4dEVsZW1lbnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lucHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL091dHB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9GYXVsdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9lSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L2dldElucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9zZXRJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0lucHV0L3NldElucHV0L2lucHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9lT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvZ2V0T3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L3NldE91dHB1dC9vdXRwdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0JpbmRpbmdGYXVsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2VGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZ2V0RmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQvZmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL05hbWVzcGFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9OYW1lc3BhY2UvcHJlZml4Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvYWRkT3BlcmF0aW9uL29wZXJhdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL25hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL2lucHV0TmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQb3J0VHlwZS9nZXRPcGVyYXRpb24vb3V0cHV0TmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vYWRkRmF1bHQvZmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRGYXVsdC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0UGFyYW1ldGVyT3JkZXJpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRQYXJhbWV0ZXJPcmRlcmluZy9wYXJhbWV0ZXJPcmRlciIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldElucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0SW5wdXQvaW5wdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9zZXRPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0L291dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUlucHV0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUlucHV0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPdXRwdXQiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3V0cHV0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3V0cHV0L3NldE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUZhdWx0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L2dldE1lc3NhZ2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUZhdWx0L3NldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNZXNzYWdlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvYWRkUGFydC9wYXJ0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldFBhcnQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2dldE9yZGVyZWRQYXJ0cy9wYXJ0T3JkZXIiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQYXJ0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZS92YWx1ZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lQYXJ0L2dldEV4dGVuc2lvbkF0dHJpYnV0ZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JU2VydmljZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lTZXJ2aWNlL2FkZFBvcnQvcG9ydCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9nZXRQb3J0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lQb3J0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvZ2V0QmluZGluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydC9zZXRCaW5kaW5nL2JpbmRpbmciLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvYWRkQmluZGluZ09wZXJhdGlvbi9iaW5kaW5nT3BlcmF0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vbmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vaW5wdXROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvZ2V0QmluZGluZ09wZXJhdGlvbi9vdXRwdXROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldFBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL3NldFBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZS9wb3J0VHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2FkZEJpbmRpbmdGYXVsdC9iaW5kaW5nRmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nRmF1bHRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldE9wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldE9wZXJhdGlvbi9vcGVyYXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0QmluZGluZ0lucHV0L2JpbmRpbmdJbnB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdPdXRwdXQvYmluZGluZ091dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdJbnB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ091dHB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZ0ZhdWx0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpYmlsaXR5RWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEJpbmRpbmcvYmluZGluZyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZEltcG9ydC9pbXBvcnREZWYiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkTmFtZXNwYWNlL3ByZWZpeCIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9uYW1lc3BhY2VVUkkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkUG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlL3BvcnRUeXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFNlcnZpY2Uvc2VydmljZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nRmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0lucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ09wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUltcG9ydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVNZXNzYWdlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZU9wZXJhdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUGFydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQb3J0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVNlcnZpY2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0QmluZGluZy9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmdzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzLjEvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE1lc3NhZ2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZS9wcmVmaXgiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQb3J0VHlwZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRQcmVmaXgvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFNlcnZpY2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRFeHRlbnNpb25SZWdpc3RyeSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkvZXh0ZW5zaW9uUmVnaXN0cnkiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RG9jdW1lbnRCYXNlVVJJIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RG9jdW1lbnRCYXNlVVJJL2RvY3VtZW50QmFzZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVTZXJ2aWNlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlQmluZGluZy9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZVBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZU1lc3NhZ2UvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRUeXBlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXRUeXBlcyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMvdHlwZXMiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUxpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSU1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JVVJMIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9UeXBlcyI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcy4xIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzLjEvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSXRlcmF0b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVR5cGVzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvcGFyZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQvY2hpbGRyZW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQvc2NoZW1hIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9lTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuU09BUC5jYXQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL2NvbS5pYm0uZXRvb2xzLndzZGwuYmluZGluZ3MuU09BUC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjAzNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9tb2RlbC9jb20uaWJtLmV0b29scy53c2RsLmJpbmRpbmdzLlNPQVAuY2F0CisrKyAvZGV2L251bGwKQEAgLTEsOTQ1ICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQyCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInNvYXAiCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBxdWlkICAgICAgIAkiM0EwMUNGMEMwMUEyIgotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJTT0FQQmluZGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5QTM4MDFBQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0cmFuc3BvcnRVUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0EwMUQzREYwMUU0IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkgICAgcXVpZCAgICAgICAJIjNBMDFEM0YxMDI5RSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlNPQVBCb2R5IgotCSAgICBxdWlkICAgICAgIAkiM0EwMURFRDUwMzFGIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBNDUwMDQxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTAxRTJENTAxQTUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBOTM0NzdDMDFCMiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZ1N0eWxlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRUU0QTREQjAwNzIiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJJU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJTT0FQSGVhZGVyQmFzZSIKLQkgICAgcXVpZCAgICAgICAJIjNBMDFERUU3MDM0RCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5QTNFMDMyNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjJFOUMwMDU2IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkVBMjAyNUQiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmdTdHlsZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0VFNEE1OEYwMUFFIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiSVN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiU09BUEZhdWx0IgotCSAgICBxdWlkICAgICAgIAkiM0EwNkQ5RkEwMEY3IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBNEEwMDIwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTA5ODIxQTAxMkIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyMDQ4MDNBRSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZ1N0eWxlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzRUU0QTU2MzAzQUYiCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJJU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJTT0FQT3BlcmF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0EwQUQ0NTUwMEU4IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDlBNEUwMzFGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvYXBBY3Rpb25VUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0EwQUQ0NjQwMDRBIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkgICAgcXVpZCAgICAgICAJIjNBMEFENDZDMDE4QyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlNPQVBBZGRyZXNzIgotCSAgICBxdWlkICAgICAgIAkiM0FEMUZGNzUwMjg3IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDk1MzUwMDk4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDIxMUM5MDI1QyIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXJGYXVsdCIKLQkgICAgcXVpZCAgICAgICAJIjNBRDYzMkI4MDNERCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzM0MDAzOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIgotCQkgICAgcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiU09BUEhlYWRlciIKLQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzA5MDE2RCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzMwMDE3RCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIgotCQkgICAgcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiSVN0cmluZyIKLQkgICAgcXVpZCAgICAgICAJIjNCOEREOTBDMDIyMCIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLmxhbmcuU3RyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCOEREOTMyMDM4MyIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkgICAgcXVpZCAgICAgICAJIjNBMDZFMEI1MDAzNiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMSIKLQkJICAgIHF1aWQgICAgICAgCSIzQTA2RTBCNjAwQzQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQQm9keSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiKQotCQkob2JqZWN0IFJvbGUgInBhcnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBMDZFMEI2MDBDNSIKLQkJICAgIGxhYmVsICAgICAgCSJwYXJ0cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyIgotCSAgICBxdWlkICAgICAgIAkiM0FENjJERTYwMTMwIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJtZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDYyREU3MDA0QiIKLQkJICAgIGxhYmVsICAgICAgCSJtZXNzYWdlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkRFNzAwNTUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNCIKLQkgICAgcXVpZCAgICAgICAJIjNBRDYyREY4MDJEMSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ2MkRGQTAwMDIiCi0JCSAgICBsYWJlbCAgICAgIAkicGFydCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjJERkEwMDAzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlckJhc2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ2MzMzNzAxQ0QiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDciCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjMzMzcwMzcyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMwOTAxNkQiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaGVhZGVyRmF1bHRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDYzMzM3MDM3MyIKLQkJICAgIGxhYmVsICAgICAgCSJoZWFkZXJGYXVsdHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyRmF1bHQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMyQjgwM0REIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLSAgICBsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiQmluZGluZyIKLQkgICAgcXVpZCAgICAgICAJIjNBMDFDRjIzMDI5RiIKLQkgICAgdGl0bGUgICAgICAJIkJpbmRpbmciCi0JICAgIHpvb20gICAgICAgCTg3Ci0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMzI0Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI3MiwgMjA4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDU1LCAxMDApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDM0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU09BUEJpbmRpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkJICAgIHdpZHRoICAgICAgCTQ1MgotCQkgICAgaGVpZ2h0ICAgICAJMjQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBPcGVyYXRpb24iIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNDAsIDIwOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSg4MDMsIDEwMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTBBRDQ1NTAwRTgiCi0JCSAgICB3aWR0aCAgICAgIAk0OTIKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyIiBAMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1NjAsIDk2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgzOTUsIDkwNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMwOTAxNkQiCi0JCSAgICB3aWR0aCAgICAgIAkzNDgKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyRmF1bHQiIEA0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNjAsIDk2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQKLQkJCWxvY2F0aW9uICAgCSgxMTQyLCA5MDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDM2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU09BUEhlYWRlckZhdWx0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzJCODAzREQiCi0JCSAgICB3aWR0aCAgICAgIAk0NTQKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA1Ci0JCSAgICBsb2NhdGlvbiAgIAkoOTMzLCA5NjEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzcwMUNEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBANgotCQkJICAgIFBhcmVudF9WaWV3IAlANQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzcsIC01NDMpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzcwMzcyIgotCQkJICAgIGNsaWVudCAgICAgCUA1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzMsIDk2MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzM0LCA5NjEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiaGVhZGVyRmF1bHRzIiBANwotCQkJICAgIFBhcmVudF9WaWV3IAlANQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzcsIC01NDMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOAotCQkJCVBhcmVudF9WaWV3IAlANwotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDkyMSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNDYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitoZWFkZXJGYXVsdHMiCi0JCQkJcGN0RGlzdCAgICAJLTAuMDMwNzAyCi0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMzNzAzNzMiCi0JCQkgICAgY2xpZW50ICAgICAJQDUKLQkJCSAgICBzdXBwbGllciAgIAlANAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkzMywgOTYxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMzLCA5NjEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOQotCQkJCVBhcmVudF9WaWV3IAlANwotCQkJCWxvY2F0aW9uICAgCSgxMDgwLCA5MjQpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC43MzY4NDIKLQkJCQloZWlnaHQgICAgIAkzOAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwCi0JCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDk5OSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTEKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjYxNDAzNQotCQkJCWhlaWdodCAgICAgCTM4Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDExCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDQ5NikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExCi0JCQlsb2NhdGlvbiAgIAkoMTcwMSwgNDE5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI0NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJICAgIHdpZHRoICAgICAgCTI2NAotCQkgICAgaGVpZ2h0ICAgICAJMTc4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIiBAMTIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgNTI4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTIKLQkJCWxvY2F0aW9uICAgCSg3OTQsIDQyMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0OTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyQmFzZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIgotCQkgICAgd2lkdGggICAgICAJNTEwCi0JCSAgICBoZWlnaHQgICAgIAkyNDAKLQkJICAgIGFubm90YXRpb24gCTgpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMTMKLQkJICAgIGxvY2F0aW9uICAgCSgxNDkzLCA0ODUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENjJERTYwMTMwIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXNzYWdlIiBAMTQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzCi0JCQkgICAgbG9jYXRpb24gICAJKDM0MSwgLTY4MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNQotCQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTU3NCwgNTE1KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI1NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK21lc3NhZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC40MTIzMjIKLQkJCQloZWlnaHQgICAgIAkzMAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDYyREU3MDA0QiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkzLCA0ODUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTIsIDQ4NSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNgotCQkJCVBhcmVudF9WaWV3IAlAMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMCwgNDQ4KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNjg3MjA0Ci0JCQkJaGVpZ2h0ICAgICAJMzgKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzCi0JCQkgICAgbG9jYXRpb24gICAJKDM0MSwgLTY4MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOAotCQkJCVBhcmVudF9WaWV3IAlAMTcKLQkJCQlsb2NhdGlvbiAgIAkoMTQyMCwgNTI1KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjM3MjI1NAotCQkJCWhlaWdodCAgICAgCTQwCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENjJERTcwMDU1IgotCQkJICAgIGNsaWVudCAgICAgCUAxMwotCQkJICAgIHN1cHBsaWVyICAgCUAxMgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0OTMsIDQ4NSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NSwgNDg1KSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5IiBAMTkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA0MCwgMTM0NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE5Ci0JCQlsb2NhdGlvbiAgIAkoNzk0LCAxMjM2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNPQVBCb2R5IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiCi0JCSAgICB3aWR0aCAgICAgIAk1MTAKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgMTIwMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIwCi0JCQlsb2NhdGlvbiAgIAkoMTYyOCwgOTU2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhcnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJICAgIHdpZHRoICAgICAgCTQxMAotCQkgICAgaGVpZ2h0ICAgICAJNTEyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDIxCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU5MCwgNzA0KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDYyREY4MDJEMSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicGFydCIgQDIyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMQotCQkJICAgIGxvY2F0aW9uICAgCSg0MzgsIC00NjQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMKLQkJCQlQYXJlbnRfVmlldyAJQDIyCi0JCQkJbG9jYXRpb24gICAJKDE5MTcsIDg4NikKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxMjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwYXJ0IgotCQkJCXBjdERpc3QgICAgCTAuODgxNDY1Ci0JCQkJaGVpZ2h0ICAgICAJOTAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRGQTAwMDIiCi0JCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDIwCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE1OTAsIDcwNCkKLQkJCQkoMTgyNywgNzA0KQotCQkJCSgxODI3LCA5NDQpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDcwNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNywgOTQ0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMgotCQkJCWxvY2F0aW9uICAgCSgxNzc0LCA4ODYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44ODE0NjUKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUiIEAyNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDM4LCAtNDY0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJCWxvY2F0aW9uICAgCSgxMjA5LCA3NDYpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTEyMAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MkRGQTAwMDMiCi0JCQkgICAgY2xpZW50ICAgICAJQDIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE1OTAsIDcwNCkKLQkJCQkoMTE3MCwgNzA0KQotCQkJCSgxMTcwLCA2NDgpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDcwNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3MCwgNjQ4KSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDI3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTQ1NywgMTM5MCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTA2RTBCNTAwMzYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEiIEAyOAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjcKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1LCAtOTE0KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBMDZFMEI2MDBDNCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjcKLQkJCSAgICBzdXBwbGllciAgIAlAMTkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU3LCAxMzkwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk1LCAxMzkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcnRzIiBAMjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Ci0JCQkgICAgbG9jYXRpb24gICAJKDIyNSwgLTkxNCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMAotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoMTU5MSwgMTQ5NCkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitwYXJ0cyIKLQkJCQlwY3REaXN0ICAgIAkwLjgzMzg1NgotCQkJCWhlaWdodCAgICAgCTEwNAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBMDZFMEI2MDBDNSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjcKLQkJCSAgICBzdXBwbGllciAgIAlAMjAKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU3LCAxMzkwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE5LCAxMzkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxCi0JCQkJUGFyZW50X1ZpZXcgCUAyOQotCQkJCWxvY2F0aW9uICAgCSgxNTkxLCAxMzQ0KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuODMzODU2Ci0JCQkJaGVpZ2h0ICAgICAJNDcKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQRmF1bHQiIEAzMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDQwLCAxNjQ4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzIKLQkJCWxvY2F0aW9uICAgCSg3OTQsIDE1NDApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU09BUEZhdWx0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTA2RDlGQTAwRjciCi0JCSAgICB3aWR0aCAgICAgIAk1MTAKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpJU3RyaW5nIiBAMzMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQwLCAxMzYwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCWxvY2F0aW9uICAgCSg2NiwgMTMzMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJU3RyaW5nIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMzCi0JCQlsb2NhdGlvbiAgIAkoNjYsIDEyODIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM0OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4REQ5MEMwMjIwIgotCQkgICAgd2lkdGggICAgICAJMzY2Ci0JCSAgICBoZWlnaHQgICAgIAkxODAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNAotCQkgICAgbG9jYXRpb24gICAJKDEwNDAsIDc1MCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMTIKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEwNDAsIDc1MCkKLQkJCSgxMDQwLCA2NDgpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MzMzMDAxN0QiCi0JCSAgICBjbGllbnQgICAgIAlAMwotCQkgICAgc3VwcGxpZXIgICAJQDEyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0NSwgODk1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDY0NSwgNzUwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzQpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENjMzMzQwMDM4IgotCQkgICAgY2xpZW50ICAgICAJQDQKLQkJICAgIHN1cHBsaWVyICAgCUAxMgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzE2LCA4OTUpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxNiwgNzUwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzQpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUG9ydCIKLQkgICAgcXVpZCAgICAgICAJIjNBMDg1RTMwMDM1QyIKLQkgICAgdGl0bGUgICAgICAJIlBvcnQiCi0JICAgIHpvb20gICAgICAgCTkwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBBZGRyZXNzIiBAMzcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCAzMjApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNwotCQkJbG9jYXRpb24gICAJKDE1MSwgMjM5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQwMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNPQVBBZGRyZXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQxRkY3NTAyODciCi0JCSAgICB3aWR0aCAgICAgIAk0MjAKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJFeHRlbnNpYmlsaXR5IgotCSAgICBxdWlkICAgICAgIAkiM0FFMDk5QjEwMTYxIgotCSAgICB0aXRsZSAgICAgIAkiRXh0ZW5zaWJpbGl0eSIKLQkgICAgem9vbSAgICAgICAJOTAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEFkZHJlc3MiIEAzOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCA1NzYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzOAotCQkJbG9jYXRpb24gICAJKDEzNzEsIDUyNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQQWRkcmVzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FEMUZGNzUwMjg3IgotCQkgICAgd2lkdGggICAgICAJMzE2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAzOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDU5MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM5Ci0JCQlsb2NhdGlvbiAgIAkoMTYyLCA1NDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjg0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU09BUEJpbmRpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkJICAgIHdpZHRoICAgICAgCTMwMgotCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5IiBANDAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MiwgMTEwNCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQwCi0JCQlsb2NhdGlvbiAgIAkoOTUwLCAxMDU1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI0NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNPQVBCb2R5IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiCi0JCSAgICB3aWR0aCAgICAgIAkyNjIKLQkJICAgIGhlaWdodCAgICAgCTEyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQRmF1bHQiIEA0MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxMjY0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDEKLQkJCWxvY2F0aW9uICAgCSgxMTEyLCAxMjE1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI0MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNPQVBGYXVsdCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0EwNkQ5RkEwMEY3IgotCQkgICAgd2lkdGggICAgICAJMjU4Ci0JCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUE9wZXJhdGlvbiIgQDQyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDUxMiwgNzUyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDIKLQkJCWxvY2F0aW9uICAgCSgzNDQsIDcwMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMzYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTBBRDQ1NTAwRTgiCi0JCSAgICB3aWR0aCAgICAgIAkzNTQKLQkJICAgIGhlaWdodCAgICAgCTEyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIgQDQzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgOTI4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDMKLQkJCWxvY2F0aW9uICAgCSg2MjcsIDg3OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNzgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTT0FQSGVhZGVyQmFzZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIgotCQkgICAgd2lkdGggICAgICAJMzk2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEA0NAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg2MDgsIDEyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ0Ci0JCQlsb2NhdGlvbiAgIAkoNDA4LCA1MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkgICAgd2lkdGggICAgICAJNDE4Ci0JCSAgICBoZWlnaHQgICAgIAkxNzQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0NQotCQkgICAgbG9jYXRpb24gICAJKDYwOCwgMzA1KQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA0NAotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoNjA4LCAzMDUpCi0JCQkoNjA4LCAyMTUpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUEzODAxQUIiCi0JCSAgICBjbGllbnQgICAgIAlAMzkKLQkJICAgIHN1cHBsaWVyICAgCUA0NAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDQsIDUzMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNDQsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA5QTNFMDMyNiIKLQkJICAgIGNsaWVudCAgICAgCUA0MwotCQkgICAgc3VwcGxpZXIgICAJQDQ0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgxNSwgODY3KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxNSwgMzA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDlBNDUwMDQxIgotCQkgICAgY2xpZW50ICAgICAJQDQwCi0JCSAgICBzdXBwbGllciAgIAlANDQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2OCwgMTA0MykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY4LCAzMDUpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0NSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOUE0RTAzMUYiCi0JCSAgICBjbGllbnQgICAgIAlANDIKLQkJICAgIHN1cHBsaWVyICAgCUA0NAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1MDYsIDY5MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MDYsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1MAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA5QTRBMDAyMCIKLQkJICAgIGNsaWVudCAgICAgCUA0MQotCQkgICAgc3VwcGxpZXIgICAJQDQ0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDEyMDMpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMzA1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDk1MzUwMDk4IgotCQkgICAgY2xpZW50ICAgICAJQDM4Ci0JCSAgICBzdXBwbGllciAgIAlANDQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTUyMCwgNTE1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjAsIDMwNSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQ1KSkpKSkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvbW9kZWwvc29hcC5lY29yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvbW9kZWwvc29hcC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhZWNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL3NvYXAuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InNvYXAiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuaWJtLmNvbS93c2RsLzIwMDMvU09BUCIgbnNQcmVmaXg9InNvYXAiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBCaW5kaW5nIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHJhbnNwb3J0VVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0eWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBCb2R5IiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmNvZGluZ1N0eWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyB3c2RsLmVjb3JlIy8vUGFydCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQSGVhZGVyQmFzZSIgZVN1cGVyVHlwZXM9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5jb2RpbmdTdHlsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXNzYWdlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIHdzZGwuZWNvcmUjLy9NZXNzYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcnQiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFQ2xhc3Mgd3NkbC5lY29yZSMvL1BhcnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEZhdWx0IiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmNvZGluZ1N0eWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBPcGVyYXRpb24iIGVTdXBlclR5cGVzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQWN0aW9uVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0eWxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNPQVBBZGRyZXNzIiBlU3VwZXJUeXBlcz0id3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb25VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU09BUEhlYWRlckZhdWx0IiBlU3VwZXJUeXBlcz0iIy8vU09BUEhlYWRlckJhc2UiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTT0FQSGVhZGVyIiBlU3VwZXJUeXBlcz0iIy8vU09BUEhlYWRlckJhc2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoZWFkZXJGYXVsdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vU09BUEhlYWRlckZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJU3RyaW5nIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyIvPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvbW9kZWwvc29hcC5tZGwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL21vZGVsL3NvYXAubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2QwYWE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvbW9kZWwvc29hcC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjY4OCArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0MgotICAgIF93cml0dGVuICAgCSJSb3NlIDQuNS44MDU0YSIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3IgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJVFJVRQotCWdyaWRYICAgICAgCTE2Ci0JZ3JpZFkgICAgICAJMTYKLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250Ci0JICAgIHNpemUgICAgICAgCTEwCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkgICAgY29sb3IgICAgICAJMAotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCXNob3dNZXNzYWdlTnVtIAkxCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUKLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NCIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3OCIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjMiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3IgotCXF1aWR1ICAgICAgCSIzOUUyN0YwODAwNjUiCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCIKLQkJcXVpZCAgICAgICAJIjNBREZCOEU1MDIxRSIKLQkJZG9jdW1lbnRhdGlvbiAJCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuCi18Ci18V1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50LgotfAotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuCi18Ci18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkKLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQotfC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETAotfC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLgotfAotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLgotCQkKLQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGxhbmd1YWdlIGVsZW1lbnQuIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTI5NjAwQzgiCi0JCQkJcmVzdWx0ICAgICAJIkRlZmluaXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIkRlZmluaXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkb2N1bWVudGF0aW9uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NDRTQ0MzYwMkEzIgotCQkJCXR5cGUgICAgICAgCSJET01FbGVtZW50IikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnRUeXBlIGVsZW1lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMSBhbmQgYW4gSW50ZXJmYWNlIGNvbXBvbmVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4yLiBBIHBvcnQgdHlwZSBvciBJbnRlcmZhY2UgaXMgYSBuYW1lZCBzZXQgb2YgYWJzdHJhY3Qgb3BlcmF0aW9ucyBhbmQgdGhlIGFic3RyYWN0IG1lc3NhZ2VzIGludm9sdmVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzlCNzAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg4RTAwMjMiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUUzMDFFNSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENEZEMDFCQSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiCi0JCQkJdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThDRTIyMDFBRCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNEMThENTIwMDExQiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlIgotCQkJcXVpZCAgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDA1NTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4RDEwMkJBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODdDMDFGRSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRDIwMjI2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNEIwMkIwIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ1NDIwMEYxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODk3RTIzMDIzNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEI3MDNDOCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50TmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCQ0U3MEMzMDNDNSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgYmluZGluZyBlbGVtZW50LiBBIGJpbmRpbmcgZGVmaW5lcyBtZXNzYWdlIGZvcm1hdCBhbmQgcHJvdG9jb2wgZGV0YWlscyBmb3Igb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXIgcG9ydFR5cGUuIFRoZXJlIG1heSBiZSBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzIGZvciBhIGdpdmVuIHBvcnRUeXBlLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODk5MDE0QiIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRjQwMUEzIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0QxOEQ0REYwMzVDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDA5MjAyRjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUM0Q0IwMTk5IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNlcnZpY2UiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzRDE4RDRDNTAxRTIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODU5NTQ1MDJDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUEwMDM5MSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIFdTREwgYWxsb3dzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxNDkwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJCQlxdWlkICAgICAgIAkiM0FGOTU0M0MwMDczIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I4NUIyMUEwMjcxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50LiBUaGUgV1NETCBkZWZpbml0aW9ucyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBXU0RMIGRvY3VtZW50LiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRjgwMzgyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDRDE0RkMyMDEyQiIKLQkJCQlyZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXREb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50IgotCQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNDc0MDA0RSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg1NzAyRjUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwMEQwMDBEIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkltcG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIFdTREwgaW1wb3J0IGVsZW1lbnQuIFdTREwgYWxsb3dzIGFzc29jaWF0aW5nIGEgbmFtZXNwYWNlIHdpdGggYSBkb2N1bWVudCBsb2NhdGlvbiB1c2luZyBhbiBpbXBvcnQgZWxlbWVudC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUVFNTgwMzdBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDBEMDM0MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NzJDMTAzNzkiCi0JCQkJcmVzdWx0ICAgICAJIlhTRFNjaGVtYSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldFNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzk3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSIKLQkJCQkJdHlwZSAgICAgICAJIlhTRFNjaGVtYSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MEEwMDM2IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxvY2F0aW9uVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTUxNDAyMTEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxMkMwM0NEIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzE0NzAyOTUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZXh0RWxlbWVudCIKLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QzUwNDAyNUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3RUUwMDE1IikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MEMwMzVCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkY4MDFDRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFMUM4MjAwMkYyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ0lucHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIGlucHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTFCMDExMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNBNDAyMDMiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNCNTAzQTIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzFFQTAyMEUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZ091dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU0MzAyQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiCi0JCQkJcmVzdWx0ICAgICAJIklPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1M0YxMDMyNiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJT3V0cHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUU0RjAwQkQiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiIKLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NDIxMDEwOSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJRTmFtZSIKLQkJCXF1aWQgICAgICAgCSIzQUU4RUQyMjAxNDAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg0OURBOTAwM0QiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIgotCQkJcXVpZCAgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBuYW1lc3BhY2UgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzcGFjZSBwcmVmaXggdXNlZCBpbiBhIFdTREwgZG9jdW1lbnQuIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDI5MDFCMSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDMyMDIzNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb25UeXBlIgotCQkJcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiIKLQkJCWRvY3VtZW50YXRpb24gCQotfE9ORV9XQVk9MQotfFJFUVVFU1RfUkVTUE9OU0U9MgotfFNPTElDSVRfUkVTUE9OU0U9MwotfE5PVElGSUNBVElPTj00Ci0JCQkKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzM1MzAzRTMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnRUeXBlIgotCQkJcXVpZCAgICAgICAJIjNCODRBNUJFMDMzMSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSU9wZXJhdGlvbiIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkJBRjAxQTQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTYzMjAwMEQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3NzYwMEQxIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCQkJdHlwZSAgICAgICAJIklGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzU5MDI4RiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzgxMDFCMCIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZDOTkwMzFEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlck9yZGVyIgotCQkJCQl0eXBlICAgICAgIAkiSUxpc3QiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTRFNTAxOEQiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJDNDAxMDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXQiCi0JCQkJCXR5cGUgICAgICAgCSJJSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRTQwMDk0IgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTc5OTAxMkIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLklucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjM0NzAyNzciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNCODRBODI5MDI3RCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDNBMDM1RCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ0NTAxQzgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODM5MDFENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NkEwMEJEIgotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTg3MTAyMDgiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNZXNzYWdlIgotCQkJcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuTWVzc2FnZSBub24tTU9GIGludGVyZmFjZSIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0IgotCQkJCQl0eXBlICAgICAgIAkiSVBhcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjNEMDIzMyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklQYXJ0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjU0MDI1RSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTcyNjEwMjBEIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBhcnRPcmRlciIKLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4QkMwMjYwIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUGFydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTkzRjAxQkUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25BdHRyaWJ1dGUiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4ODQ1MDA1MiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAidmFsdWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCWV4Y2VwdGlvbnMgCSJXU0RMRXhjZXB0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4QTAxMDFDMyIKLQkJCQlyZXN1bHQgICAgIAkiSUl0ZXJhdG9yIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEyRDAyRDUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIlFOYW1lIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE5NTAwMjMxIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJU2VydmljZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUI0OTAyODciCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlNlcnZpY2Ugbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkUG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REEyMDAzNiIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1REIwMDFCQyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCNUIwMDNFIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJUG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MjYzMDJGMiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjE2MDE1MyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3BlcmF0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RjUwMDA2NiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RkE0MDFDNSIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQTkwMjg0IgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUyQkUwMUE4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUJDRjAzMDIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRBREMwMDA3MiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJQmluZGluZ0ZhdWx0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2MEQ5MDA5RCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzJEMDAxNyIKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzM0YwMzdCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MDkwMERBIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTUxRDAwN0YiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0lucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdJbnB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MzQwMzQ5IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRENCMDIxQyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ091dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUUyMTAxMTEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUyRDAwNTAiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFNEYwMEJEIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRTVGMDAyQSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5FbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLnczYy5kb20uRWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTM1MDNEMSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSURlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I4NEIxRDkwMTQyIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OEYxMDM5RCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nIgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEltcG9ydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImltcG9ydERlZiIKLQkJCQkJdHlwZSAgICAgICAJIklJbXBvcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTZFMDA1RSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJCQl0eXBlICAgICAgIAkiSU1lc3NhZ2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5ODQwMDRCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInByZWZpeCIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlDNTAwNDUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiCi0JCQkJCXR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUU0MDFFRSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzZXJ2aWNlIgotCQkJCQl0eXBlICAgICAgIAkiSVNlcnZpY2UiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMTcwMzhDIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE0NjAxM0IiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNUMwMEIwIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNzUwMkU3IgotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTgzMDE0QyIKLQkJCQlyZXN1bHQgICAgIAkiSUltcG9ydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUlucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiCi0JCQkJcmVzdWx0ICAgICAJIklJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUFGMDI1NCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUMyMDNDNCIKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUGFydCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBRjgwMjZEIgotCQkJCXJlc3VsdCAgICAgCSJJUGFydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjA4MDFEQSIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIgotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIzMjAxM0EiCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCNDIwMDc1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEI5MjAzNDEiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJDRDAwNjAiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDMTcwMTA3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEMzRTAwMUQiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzYyMDE0QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDNzQwMTE1IgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0JFMDA3MSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENEQTAxQzYiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQcmVmaXgiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Q0ZEMDAxNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThEMjMwMEE4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1QjgwMTJCIgotCQkJCXJlc3VsdCAgICAgCSJJRXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1RDcwM0JCIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCQl0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudEJhc2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUZFMDIwOCIKLQkJCQlyZXN1bHQgICAgIAkiU3RyaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDYxODAzMjgiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZG9jdW1lbnRCYXNlIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwNTYwMDgwIgotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklTZXJ2aWNlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwQkEwMzU1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBEODAyOUEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwNkYwMzFCIgotCQkJCXJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIgotCQkJCQl0eXBlICAgICAgIAkiSVR5cGVzIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5EZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjFFNzAyQTEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbXBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5JbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUxpc3QiCi0JCQlxdWlkICAgICAgIAkiM0I4NUMwQTIwM0M1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMEFGMDI5NyIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU1hcCIKLQkJCXF1aWQgICAgICAgCSIzQjg5NkIwMzAwRDQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5NYXAiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QjExMDJCNSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVVSTCIKLQkJCXF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5uZXQuVVJMIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklFeHRlbnNpb25SZWdpc3RyeSIKLQkJCXF1aWQgICAgICAgCSIzQjg5RDU5MzAyQTUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDU5RjAyRTgiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiCi0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWFzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENGN0UwMzAxIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklJdGVyYXRvciIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5JdGVyYXRvciBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkl0ZXJhdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODgwODAwQjkiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iCi0JCQlxdWlkICAgICAgIAkiM0M0Njg5NjUwMzEzIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5FeGNlcHRpb24gY2xhc3MuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4OTc0MDMxNSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuVHlwZXMgbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JGMTAxNzMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NCMjRBRUMwMUNCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYyN0YwMEI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJET01Eb2N1bWVudCIKLQkJCXF1aWQgICAgICAgCSIzQ0QxNTAyQzAyM0IiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkRvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiCi0JCQlxdWlkICAgICAgIAkiM0Y2NzcxREIwMkRDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNzYyQTZBMDMwOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNGNjc4MEEwMDFBQiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQcm90ZWN0ZWQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIgotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJwb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUMzIgotCQkJCWxhYmVsICAgICAgCSJwb3J0VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQ0QiCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEiCi0JCQlxdWlkICAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDRUJGMDA2MSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzIgotCQkJcXVpZCAgICAgICAJIjNBRDVEMzUyMDEwRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1NDAxODAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ09wZXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciCi0JCQlxdWlkICAgICAgIAkiM0FENUQ0MjUwMzhBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRjUiCi0JCQkJbGFiZWwgICAgICAJImVPcGVyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVENDI2MDJGRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5IgotCQkJcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUMiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MTAzMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIgotCQkJcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjcxMDEwNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM0QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCQlsYWJlbCAgICAgIAkiZVBvcnRUeXBlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjc3MDA5NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5ncyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5IgotCQkJcXVpZCAgICAgICAJIjNBRDVFNjdCMDMxMSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJCWxhYmVsICAgICAgCSJlU2VydmljZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxIgotCQkJcXVpZCAgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCWxhYmVsICAgICAgCSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMyIKLQkJCXF1aWQgICAgICAgCSIzQURGMkU2NDAxRjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MSIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdJbnB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSIKLQkJCXF1aWQgICAgICAgCSIzQURGMkVCMzAxNjMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkVCNDAxM0MiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNiIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNyIKLQkJCXF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGOTUwMTlBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5IgotCQkJcXVpZCAgICAgICAJIjNBREYyRkI4MDJGOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBBIgotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwIgotCQkJCXF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEiCi0JCQlxdWlkICAgICAgIAkiM0FERjMzMTYwMUE0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODciCi0JCQkJbGFiZWwgICAgICAJImVGYXVsdHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzIiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMyIKLQkJCXF1aWQgICAgICAgCSIzQURGMzQwMDAzRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzQwMTAzQUEiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nRmF1bHRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzNCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSIKLQkJCXF1aWQgICAgICAgCSIzQUUwOTFGNDAyRjMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVGYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZFIgotCQkJCWxhYmVsICAgICAgCSJlRmF1bHQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzYiCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM3IgotCQkJcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzgiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRDU2MDMyOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVOYW1lc3BhY2VzIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMzIiCi0JCQkJbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok5hbWVzcGFjZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDM5IgotCQkJcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCQlsYWJlbCAgICAgIAkiZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MCIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDEiCi0JCQlxdWlkICAgICAgIAkiM0FFQTQxMkYwMDM1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlUGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJCQlsYWJlbCAgICAgIAkiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQyIgotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MyIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNDAwQkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkJCWxhYmVsICAgICAgCSJlSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ1IgotCQkJcXVpZCAgICAgICAJIjNCODRBRDc5MDBGMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTREIgotCQkJCWxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFEN0EwMTRFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ3IgotCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMyNyIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0OCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ5IgotCQkJcXVpZCAgICAgICAJIjNCOEIxQzEyMDNCMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIgotCQkJcXVpZCAgICAgICAJIjNCOEIxRENDMDJFNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjcwIgotCQkJCWxhYmVsICAgICAgCSJlU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUyIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MyIKLQkJCXF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU0IgotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlVHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZVR5cGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIgotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NSIKLQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5MzAzRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCQkJbGFiZWwgICAgICAJImVNZXNzYWdlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTYiCi0JCQkJcXVpZCAgICAgICAJIjNDNDY4Mjk2MDExOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyIKLQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVJbXBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJbGFiZWwgICAgICAJImVJbXBvcnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1OCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1OSIKLQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYwIgotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQzM2MEQ3MDM5QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIgotCQkJCXF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjEiCi0JCQlxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDYyIgotCQkJCXF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjMiCi0JCQlxdWlkICAgICAgIAkiM0Y3ODk2QTIwMjZFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCQlsYWJlbCAgICAgIAkicGFyZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjaGlsZHJlbiIKLQkJCQlxdWlkICAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJCWxhYmVsICAgICAgCSJjaGlsZHJlbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiCi0JCQlxdWlkICAgICAgIAkiMzlBRDNFRjYwMTI3IgotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyIKLQkJCXpvb20gICAgICAgCTkwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCQl3aWR0aCAgICAgIAk1MjAKLQkJCQloZWlnaHQgICAgIAk0MDQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0IiBAMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgNTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg2LCA0ODEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklQb3J0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNDMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IgotCQkJCXdpZHRoICAgICAgCTI3OAotCQkJCWhlaWdodCAgICAgCTIxOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVNlcnZpY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI2LCA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkyNjQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDUyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0LCAzODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJMzAyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTRFMDFCNCIKLQkJCQljbGllbnQgICAgIAlANAotCQkJCXN1cHBsaWVyICAgCUAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQwLCAzNzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQl3aWR0aCAgICAgIAk0MTAKLQkJCQloZWlnaHQgICAgIAkzMDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCWNsaWVudCAgICAgCUA2Ci0JCQkJc3VwcGxpZXIgICAJQDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDMwLCAxMDAyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEA4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkxMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3NSwgODQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCXdpZHRoICAgICAgCTMwMAotCQkJCWhlaWdodCAgICAgCTE2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0NTAyQzkiCi0JCQkJY2xpZW50ICAgICAJQDgKLQkJCQlzdXBwbGllciAgIAlAMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MDksIDYzNykpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAxMAotCQkJCWxvY2F0aW9uICAgCSgzNDMsIDkxNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0cyIgQDExCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCQkJbG9jYXRpb24gICAJKC0xMjEsIDY0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MTMsIDk0NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIxODk3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOTQxMDMxQyIKLQkJCQkJY2xpZW50ICAgICAJQDEwCi0JCQkJCXN1cHBsaWVyICAgCUA4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2NiwgOTE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzOSwgODgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjA4MDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCA5OTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODQ2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAiIEAxNQotCQkJCQlQYXJlbnRfVmlldyAJQDEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIxLCA2NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2LCA3NDQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5NDEwMzFEIgotCQkJCQljbGllbnQgICAgIAlAMTAKLQkJCQkJc3VwcGxpZXIgICAJQDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzQzLCA5MTYpCi0JCQkJCSAgICAoMjU3LCA5MTYpCi0JCQkJCSAgICAoMjU3LCA2NzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTcsIDY3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDEsIDc5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM3MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExIiBAMTgKLQkJCQlsb2NhdGlvbiAgIAkoODg2LCAxMjcwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEAxOQotCQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMTIsIDEyMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmciCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0ODU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEOUI5MDI0RCIKLQkJCQkJY2xpZW50ICAgICAJQDE4Ci0JCQkJCXN1cHBsaWVyICAgCUA2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzAsIDEzMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNDI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEAyMgotCQkJCQlQYXJlbnRfVmlldyAJQDE4Ci0JCQkJCWxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MiwgMTEwNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg3OTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkJCQljbGllbnQgICAgIAlAMTgKLQkJCQkJc3VwcGxpZXIgICAJQDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODg2LCAxMjcwKQotCQkJCQkgICAgKDgxMiwgMTI3MCkKLQkJCQkJICAgICg4MTIsIDk5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTIsIDk5NikpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNSBCaW5kaW5ncyIKLQkJCXF1aWQgICAgICAgCSIzOUFENTEyNzAyNTIiCi0JCQl0aXRsZSAgICAgIAkiMi41IEJpbmRpbmdzIgotCQkJem9vbSAgICAgICAJODUKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nIiBAMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDExNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmciKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCA2NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkzNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIiBAMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTc2LCAzNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxMzApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDgwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEQzAwMDcyIgotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTU2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMzM0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTI4NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCIKLQkJCQl3aWR0aCAgICAgIAkyNzgKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBAMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE2MzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3V0cHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTU4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIKLQkJCQl3aWR0aCAgICAgIAkzMTIKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiIEAyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5NTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTA4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTE3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjgsIDQ4NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJd2lkdGggICAgICAJNjkxCi0JCQkJaGVpZ2h0ICAgICAJMzAxCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDEyODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDE2NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTU4NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTE3OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDY4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NywgNTM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCXdpZHRoICAgICAgCTQzMgotCQkJCWhlaWdodCAgICAgCTMyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NTk1NDEwMTI5IgotCQkJCWNsaWVudCAgICAgCUAzMgotCQkJCXN1cHBsaWVyICAgCUAyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3OSwgNTI3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzksIDQyOCkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEAzNAotCQkJCWxvY2F0aW9uICAgCSgxMDM5LCA3NDIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzNTIwMTBGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGUiIEAzNQotCQkJCQlQYXJlbnRfVmlldyAJQDM0Ci0JCQkJCWxvY2F0aW9uICAgCSg1NzUsIDU5OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ5LCA3ODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBvcnRUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODkyOTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCQkJCWNsaWVudCAgICAgCUAzNAotCQkJCQlzdXBwbGllciAgIAlAMjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTksIDc0MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDkyLCA3MTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjE5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNCIgQDM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQKLQkJCQkJbG9jYXRpb24gICAJKDU3NSwgNTk4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NiwgNjk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDk0NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1NDAxODAiCi0JCQkJCWNsaWVudCAgICAgCUAzNAotCQkJCQlzdXBwbGllciAgIAlAMzIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMzksIDc0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgNzQyKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBANDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDEwMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MiwgODUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJd2lkdGggICAgICAJNDUwCi0JCQkJaGVpZ2h0ICAgICAJMzcwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEA0MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCAxNDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3NiwgMTI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDQyCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjQwMEJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA0MwotCQkJCQlQYXJlbnRfVmlldyAJQDQyCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDEzMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzUxNDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODMiCi0JCQkJCWNsaWVudCAgICAgCUA0MgotCQkJCQlzdXBwbGllciAgIAlAMzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxMzU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4OTU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDQiIEA0NgotCQkJCQlQYXJlbnRfVmlldyAJQDQyCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCQkJY2xpZW50ICAgICAJQDQyCi0JCQkJCXN1cHBsaWVyICAgCUA0MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEA0NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAxNjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxMiwgMTUzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDUiIEA0OAotCQkJCWxvY2F0aW9uICAgCSgxNDMyLCAxNjU0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRDc5MDBGMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY3NDc3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJCQkJY2xpZW50ICAgICAJQDQ4Ci0JCQkJCXN1cHBsaWVyICAgCUAzMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDE2NTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4MSwgMTY5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkwMjc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDUyCi0JCQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjAsIDM3NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQ3QTAxNEUiCi0JCQkJCWNsaWVudCAgICAgCUA0OAotCQkJCQlzdXBwbGllciAgIAlANDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxNjU0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDEwMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE5LCA5MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJd2lkdGggICAgICAJMzY0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFNDAxREMiCi0JCQkJY2xpZW50ICAgICAJQDUzCi0JCQkJc3VwcGxpZXIgICAJQDI1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2NiwgNjM2KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDU1Ci0JCQkJbG9jYXRpb24gICAJKDQ1NywgMTAyMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYiIEA1NgotCQkJCQlQYXJlbnRfVmlldyAJQDU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNSwgOTIwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCQkJY2xpZW50ICAgICAJQDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAzMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0NTcsIDEwMjIpCi0JCQkJCSAgICAoMjc2LCAxMDIyKQotCQkJCQkgICAgKDI3NiwgODQ5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NiwgODQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMCwgODg0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDU5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMzE5LCA0OTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCA5NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTE2OTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMzkiCi0JCQkJCWNsaWVudCAgICAgCUA1NQotCQkJCQlzdXBwbGllciAgIAlANTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMCwgMTAyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjksIDk4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg0OTU2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzE0LCAxMDY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjc1NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDYzCi0JCQkJbG9jYXRpb24gICAJKDE0MTgsIDEwNDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjUwMzhBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9uIiBANjQKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEwNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNjAxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkJCQljbGllbnQgICAgIAlANjMKLQkJCQkJc3VwcGxpZXIgICAJQDQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTY3MjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgiIEA2NwotCQkJCQlQYXJlbnRfVmlldyAJQDYzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3MywgMTA3MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk1NDIwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkZGIgotCQkJCQljbGllbnQgICAgIAlANjMKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMiIEA2OQotCQkJCWxvY2F0aW9uICAgCSg3ODcsIDExOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjQwMUY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0lucHV0IiBANzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OSwgMTE1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0lucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTE5MDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTEiCi0JCQkJCWNsaWVudCAgICAgCUA2OQotCQkJCQlzdXBwbGllciAgIAlANDEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzg3LCAxMTkwKQotCQkJCQkgICAgKDYzNiwgMTE5MCkKLQkJCQkJICAgICg2MzYsIDEyNzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4NSwgMTIyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQwNDc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDczCi0JCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODUsIDExNDQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkJCQljbGllbnQgICAgIAlANjkKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc4NywgMTE5MCkKLQkJCQkJICAgICg5MjYsIDExOTApCi0JCQkJCSAgICAoOTI2LCAxMDk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNiwgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzNzc1OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDc2Ci0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ091dHB1dCIgQDc3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzA2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDUwODIKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiCi0JCQkJCWNsaWVudCAgICAgCUA3NgotCQkJCQlzdXBwbGllciAgIAlANDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTQ3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc0NTkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDgwCi0JCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCQljbGllbnQgICAgIAlANzYKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEA4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyMCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzcyLCAxOTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDE4NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQljbGllbnQgICAgIAlAODQKLQkJCQlzdXBwbGllciAgIAlAMjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjAzLCAyMDA3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDg2Ci0JCQkJbG9jYXRpb24gICAJKDEzNTYsIDEzNTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDAwM0U1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0ZhdWx0cyIgQDg3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODYKLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODIsIDE3NTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQSIKLQkJCQkJY2xpZW50ICAgICAJQDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDE4NDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwOSwgMTc5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE5MjkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEA5MQotCQkJCQlQYXJlbnRfVmlldyAJQDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgxODgsIDYxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc2LCAxMTk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA1MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzU2LCAxMzUyKQotCQkJCQkgICAgKDEzNTYsIDEyMTcpCi0JCQkJCSAgICAoMTExNywgMTIxNykKLQkJCQkJICAgICgxMTE3LCAxMDk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxMDk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4NzAwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNSIgQDk0Ci0JCQkJbG9jYXRpb24gICAJKDE2NDAsIDE5NzApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjQwMkYzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHQiIEA5NQotCQkJCQlQYXJlbnRfVmlldyAJQDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjQyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCQkJY2xpZW50ICAgICAJQDk0Ci0JCQkJCXN1cHBsaWVyICAgCUA4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjMsIDE5NzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDk4Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTQKLQkJCQkJbG9jYXRpb24gICAJKC0zNDQsIDgxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkJCWNsaWVudCAgICAgCUA5NAotCQkJCQlzdXBwbGllciAgIAlAODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTE3LCAxOTcwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkJCWNsaWVudCAgICAgCUA0NwotCQkJCXN1cHBsaWVyICAgCUAyNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUxQjAxMTMiCi0JCQkJY2xpZW50ICAgICAJQDQxCi0JCQkJc3VwcGxpZXIgICAJQDI2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi40IFBvcnRUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiCi0JCQl0aXRsZSAgICAgIAkiMi40IFBvcnRUeXBlcyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iCi0JCQl6b29tICAgICAgIAk4MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDE3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JCQkJd2lkdGggICAgICAJNzE4Ci0JCQkJaGVpZ2h0ICAgICAJMTk2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iIEAxMDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklPcGVyYXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTE2LCAxMjYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODczCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTc3NjAwRDEiCi0JCQkJd2lkdGggICAgICAJODkxCi0JCQkJaGVpZ2h0ICAgICAJMTg4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiIEAxMDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTQzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUlucHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDEzODcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JCQkJd2lkdGggICAgICAJNjQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTk0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IiBAMTA0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM4NCwgMTc5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3NTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklPdXRwdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgMTcwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIKLQkJCQl3aWR0aCAgICAgIAk2NzQKLQkJCQloZWlnaHQgICAgIAkxOTQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDEwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjAyNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCQl3aWR0aCAgICAgIAk2NDQKLQkJCQloZWlnaHQgICAgIAkxOTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMTA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTgsIDY3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJd2lkdGggICAgICAJNjk1Ci0JCQkJaGVpZ2h0ICAgICAJMjgxCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxMDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU3NiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA2OTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNTIwCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDEwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCAyMTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAyMDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMTA5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNTYsIDE0NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MCwgMTQyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok91dHB1dCIgQDExMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjMyLCAxNzQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJd2lkdGggICAgICAJMjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTI1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEAxMTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MiwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjE0LCA2MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQl3aWR0aCAgICAgIAk2OTUKLQkJCQloZWlnaHQgICAgIAkzNTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTEyCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDc5NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNDAxOEMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPcGVyYXRpb25zIiBAMTEzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDc0OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlT3BlcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzU5NjQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUNEIgotCQkJCQljbGllbnQgICAgIAlAMTEyCi0JCQkJCXN1cHBsaWVyICAgCUAxMTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMDUsIDc5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzYsIDg2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwMzkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk2NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA5MjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjI0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBvcnRUeXBlIiBAMTE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEyCi0JCQkJCWxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMTIKLQkJCQkJc3VwcGxpZXIgICAJQDEwNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNCwgNzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA3OTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODgsIDc1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUzNDg4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTE5Ci0JCQkJbG9jYXRpb24gICAJKDIxMDcsIDc3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEyRjAwMzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJhbWV0ZXJPcmRlcmluZyIgQDEyMAotCQkJCQlQYXJlbnRfVmlldyAJQDExOQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE0NSwgNjQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMjcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJCQkJY2xpZW50ICAgICAJQDExOQotCQkJCQlzdXBwbGllciAgIAlAMTA3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzE2LCA3NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjcyLCA4MjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5NjYxMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3MSwgODg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMDYyMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MiIgQDEyNAotCQkJCQlQYXJlbnRfVmlldyAJQDExOQotCQkJCQlsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1RiIKLQkJCQkJY2xpZW50ICAgICAJQDExOQotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk5LCA3NzMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxIiBAMTI1Ci0JCQkJbG9jYXRpb24gICAJKDE3MDIsIDE1MDQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTYwMUE0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHRzIiBAMTI2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3ODk5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODciCi0JCQkJCWNsaWVudCAgICAgCUAxMjUKLQkJCQkJc3VwcGxpZXIgICAJQDEwOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDIwNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ0LCAyMDIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDk1ODAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTMsIDE5NjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyIiBAMTMwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI1Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDE0LCA4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjYxLCAxMDY5KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJCQkJY2xpZW50ICAgICAJQDEyNQotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMiwgOTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU3MzYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNyIgQDEzMwotCQkJCWxvY2F0aW9uICAgCSgxMTc4LCAxMjM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYyRjk0MDI0RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTM0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMzCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgMTM0MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW5wdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxOTgyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMKLQkJCQkJc3VwcGxpZXIgICAJQDEwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc4LCAxMjM0KQotCQkJCQkgICAgKDk4MCwgMTIzNCkKLQkJCQkJICAgICg5ODAsIDE0MTApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMTQxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDYsIDEzNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NzY2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgiIEAxMzcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzMKLQkJCQkJbG9jYXRpb24gICAJKDg5MCwgNTYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNiwgMTAzNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NTAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMKLQkJCQkJc3VwcGxpZXIgICAJQDExMQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTc4LCAxMjM0KQotCQkJCQkgICAgKDEyNzcsIDEyMzQpCi0JCQkJCSAgICAoMTI3NywgOTYwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjc3LCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTk3LCAxMDU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY0MTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTgxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxNDAKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OCwgMTM0NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCODAyRjkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEAxNDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAKLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNjIsIDE2NjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQwOTA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MAotCQkJCQlzdXBwbGllciAgIAlAMTEwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgMTczMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDE2NzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MzYzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAiIEAxNDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDAKLQkJCQkJbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjcsIDEwMzcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjkwMjBCIgotCQkJCQljbGllbnQgICAgIAlAMTQwCi0JCQkJCXN1cHBsaWVyICAgCUAxMTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCA5NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTIzLCAxMDgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTAzNDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZEODAxOUYiCi0JCQkJY2xpZW50ICAgICAJQDEwNgotCQkJCXN1cHBsaWVyICAgCUAxMDEKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkUyMDE3MSIKLQkJCQljbGllbnQgICAgIAlAMTExCi0JCQkJc3VwcGxpZXIgICAJQDEwMgotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkJCWNsaWVudCAgICAgCUAxMDkKLQkJCQlzdXBwbGllciAgIAlAMTAzCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZGODAxQ0QiCi0JCQkJY2xpZW50ICAgICAJQDExMAotCQkJCXN1cHBsaWVyICAgCUAxMDQKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDAyMDAyRCIKLQkJCQljbGllbnQgICAgIAlAMTA4Ci0JCQkJc3VwcGxpZXIgICAJQDEwNQotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTUyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyMjQsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MzcsIDEzMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNTkzCi0JCQkJaGVpZ2h0ICAgICAJMzEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiIEAxNTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgMjU0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5MywgMjQ2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZVJlZmVyZW5jZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIKLQkJCQl3aWR0aCAgICAgIAk2NzIKLQkJCQloZWlnaHQgICAgIAkxODAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNTQKLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMjI3NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTUzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTI0LCAyMjc1KQotCQkJCSAgICAoMTUyNCwgMjQ1NCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJCQljbGllbnQgICAgIAlAMTA4Ci0JCQkJc3VwcGxpZXIgICAJQDE1MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzYsIDIxNzYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NzYsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJCQljbGllbnQgICAgIAlAMTEwCi0JCQkJc3VwcGxpZXIgICAJQDE1MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNzEsIDE4NTQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNzEsIDIyNzUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTU0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJCQljbGllbnQgICAgIAlAMTA5Ci0JCQkJc3VwcGxpZXIgICAJQDE1MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MCwgMTUzNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAyMjc1KQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEAxNTgKLQkJCQlsb2NhdGlvbiAgIAkoMjIwNiwgMjI1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NDAxQjEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMTU5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTU4Ci0JCQkJCWxvY2F0aW9uICAgCSg3MzQsIC0yODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE2MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY4LCAxNjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTIyMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDBGIgotCQkJCQljbGllbnQgICAgIAlAMTU4Ci0JCQkJCXN1cHBsaWVyICAgCUAxNTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjA2LCAxNjEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI2MCwgMTY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MiIgQDE2MgotCQkJCQlQYXJlbnRfVmlldyAJQDE1OAotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAyMyIKLQkJCQkJY2xpZW50ICAgICAJQDE1OAotCQkJCQlzdXBwbGllciAgIAlAMTUzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIyMDYsIDIyNTkpCi0JCQkJCSAgICAoMjIwNiwgMjU1NikKLQkJCQkJICAgICgxODU2LCAyNTU2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODU2LCAyNTU2KSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xIERlZmluaXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNBRDVFNDhBMDI2MiIKLQkJCXRpdGxlICAgICAgCSIyLjEgRGVmaW5pdGlvbnMiCi0JCQl6b29tICAgICAgIAk4MwotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SURlZmluaXRpb24iIEAxNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCAxOTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDExMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkJCQl3aWR0aCAgICAgIAk3MDYKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMTY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NiwgODk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQl3aWR0aCAgICAgIAkyOTQKLQkJCQloZWlnaHQgICAgIAkxMjAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIgQDE2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDU0NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTE4MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MDAsIDEwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MDgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDEzNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCXdpZHRoICAgICAgCTQ0MgotCQkJCWhlaWdodCAgICAgCTI4MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDE2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMjQsIDE2MDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMTY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyNDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTUyOAotCQkJCWhlaWdodCAgICAgCTQyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDE3MAotCQkJCWxvY2F0aW9uICAgCSgxMzU4LCA4NjApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NCIgQDE3MQotCQkJCQlQYXJlbnRfVmlldyAJQDE3MAotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTcsIDUzNSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJCWNsaWVudCAgICAgCUAxNzAKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1OCwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwMywgNTExKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTY2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDE3NAotCQkJCQlQYXJlbnRfVmlldyAJQDE3MAotCQkJCQlsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODYsIDkwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3OTA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDE3MAotCQkJCQlzdXBwbGllciAgIAlAMTY0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTgsIDg2MCkKLQkJCQkJICAgICgxMzU4LCA5NDgpCi0JCQkJCSAgICAoMTY3NywgOTQ4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzcsIDk0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDk4NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkyNjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMTc3Ci0JCQkJbG9jYXRpb24gICAJKDE2MTIsIDU5NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMTc4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTc3Ci0JCQkJCWxvY2F0aW9uICAgCSgxMiwgMjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTEyKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQkJY2xpZW50ICAgICAJQDE3NwotCQkJCQlzdXBwbGllciAgIAlAMTY5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTIsIDU5NSkKLQkJCQkJICAgICgxNDY0LCA1OTUpCi0JCQkJCSAgICAoMTQ2NCwgNDUzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjQsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU4NjY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDE4MQotCQkJCQlQYXJlbnRfVmlldyAJQDE3NwotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTIsIDU1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjgwMzM1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCQljbGllbnQgICAgIAlAMTc3Ci0JCQkJCXN1cHBsaWVyICAgCUAxNjUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MDEsIDU5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTQsIDY1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQxMDA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjc2LCA2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIyNTk0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDE4NQotCQkJCWxvY2F0aW9uICAgCSgxMjc5LCAxMTM3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxODUKLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzOCwgNTkxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCQkJY2xpZW50ICAgICAJQDE4NQotCQkJCQlzdXBwbGllciAgIAlAMTY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjc5LCAxMTM3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3OSwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyMCwgNTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDQ5NzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDE4OQotCQkJCQlQYXJlbnRfVmlldyAJQDE4NQotCQkJCQlsb2NhdGlvbiAgIAkoMjcxLCAyNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQ3LCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2MDQwMEMxIgotCQkJCQljbGllbnQgICAgIAlAMTg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNjYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI3OSwgMTEzNykKLQkJCQkJICAgICgxMjc5LCAxMjA4KQotCQkJCQkgICAgKDE4OTEsIDEyMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4OTEsIDEyMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzNDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3OTcsIDEyNDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2NDQwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNSIgQDE5MwotCQkJCWxvY2F0aW9uICAgCSgxMjEyLCAxMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNjcxMDEwNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYiIEAxOTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxOTMKLQkJCQkJbG9jYXRpb24gICAJKC0zMjQsIDIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNzEsIDU5NCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNEEiCi0JCQkJCWNsaWVudCAgICAgCUAxOTMKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMTIsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYyNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzU3OTYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGVzIiBAMTk3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTkzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkxLCAxNDUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0VHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyMzY5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCQkJY2xpZW50ICAgICAJQDE5MwotCQkJCQlzdXBwbGllciAgIAlAMTY3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTIsIDExNTkpCi0JCQkJCSAgICAoMTIxMiwgMTQ5MCkKLQkJCQkJICAgICgxNTg3LCAxNDkwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg3LCAxNDkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMywgMTQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTI1NjExCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTEyLCAxNTQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU4NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEAyMDEKLQkJCQlsb2NhdGlvbiAgIAkoMTExNCwgMTU4NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4IiBAMjAyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjAxCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDczLCA2ODApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzcxIgotCQkJCQljbGllbnQgICAgIAlAMjAxCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE0LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTU1LCA3NTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjcwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdzIiBAMjA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjAxCi0JCQkJCWxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUxLCAxNjc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5ncyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY2MzQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzgwMzdCIgotCQkJCQljbGllbnQgICAgIAlAMjAxCi0JCQkJCXN1cHBsaWVyICAgCUAxNjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTExNCwgMTU4NSkKLQkJCQkJICAgICgxMTE0LCAxNzE2KQotCQkJCQkgICAgKDIxMTUsIDE3MTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExNCwgMTU4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMTUsIDE3MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDUzLCAxNjc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDUwNzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMTQsIDE3NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMTA3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjgsIDE5MjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMjgwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5IiBAMjEwCi0JCQkJbG9jYXRpb24gICAJKDEwNjYsIDE1MzMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0IwMzExIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMCIgQDIxMQotCQkJCQlQYXJlbnRfVmlldyAJQDIxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDY2OSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwN0YiCi0JCQkJCWNsaWVudCAgICAgCUAyMTAKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMDksIDc1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzE5Njk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2VydmljZXMiIEAyMTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAyMTAKLQkJCQkJbG9jYXRpb24gICAJKC01MjEsIC0xMTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzkzLCAyMDI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTZXJ2aWNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzkxODI0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJCQljbGllbnQgICAgIAlAMjEwCi0JCQkJCXN1cHBsaWVyICAgCUAyMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA2NiwgMTUzMykKLQkJCQkJICAgICgxMDY2LCAyMDU5KQotCQkJCQkgICAgKDE2MTksIDIwNTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDIwNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU0LCAyMDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45NDAxOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzIsIDIxMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyMDUxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJCQljbGllbnQgICAgIAlAMTY5Ci0JCQkJc3VwcGxpZXIgICAJQDE2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDI2MykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzg1LCAyNjMpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkJCXF1aWQgICAgICAgCSIzQUQ2MEM1MTAxOTIiCi0JCQl0aXRsZSAgICAgIAkiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkJCXpvb20gICAgICAgCTgwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMjE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAxNTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTQsIDE1MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJd2lkdGggICAgICAJMTgyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IiBAMjIwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTg4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzQyLCAxNjc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCXdpZHRoICAgICAgCTE4MgotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAMjIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMjMzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA4OCwgMjI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDIyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDczNiwgMTc2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYzLCAxNzA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJCXdpZHRoICAgICAgCTM2NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDk1LCAxMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkJCXdpZHRoICAgICAgCTgwNAotCQkJCWhlaWdodCAgICAgCTE3MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAMjI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAxOTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDE4OTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQl3aWR0aCAgICAgIAkyNzQKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAyMTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NjMsIDIwOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJd2lkdGggICAgICAJMzA4Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTIzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQl3aWR0aCAgICAgIAkyMjIKLQkJCQloZWlnaHQgICAgIAkxNDYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM1LCAxMzU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJUeXBlcyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFOUE2MDNBOCIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDY4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5LCA1ODIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIgotCQkJCXdpZHRoICAgICAgCTU2MAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyMzAKLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ4MCwgMTAzOSkKLQkJCQkgICAgKDQ4MCwgODA4KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwQ0IwMEFBIgotCQkJCWNsaWVudCAgICAgCUAyMjAKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2NiwgMTgyNCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkJCWNsaWVudCAgICAgCUAyMjYKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NywgMjA3OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NywgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkzODYwMkM5IgotCQkJCWNsaWVudCAgICAgCUAyMjIKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxOSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NUI1OUIwMDcyIgotCQkJCWNsaWVudCAgICAgCUAyMjUKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTg4LCAxODg3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYwMDkyMDJGNyIKLQkJCQljbGllbnQgICAgIAlAMjIzCi0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc5NywgMTY5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzk3LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEwRjAyRjAiCi0JCQkJY2xpZW50ICAgICAJQDIxOQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwMSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkJCWNsaWVudCAgICAgCUAyMjcKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExLCAxMjIzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQljbGllbnQgICAgIAlAMjI4Ci0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQxNCwgMTM0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDE0LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkEyMDAyNUUiCi0JCQkJY2xpZW50ICAgICAJQDIyMQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDI5LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMjQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzIsIDU4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJd2lkdGggICAgICAJNTYzCi0JCQkJaGVpZ2h0ICAgICAJMjM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMjQxCi0JCQkJbG9jYXRpb24gICAJKDExOTEsIDY3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyIiBAMjQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMjQxCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODQ3LCA2MzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCQljbGllbnQgICAgIAlAMjQxCi0JCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODMwLCA2MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzOTY5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDI0NQotCQkJCQlQYXJlbnRfVmlldyAJQDI0MQotCQkJCQlsb2NhdGlvbiAgIAkoMjMsIDU2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTUsIDUyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzkwNzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCQljbGllbnQgICAgIAlAMjQxCi0JCQkJCXN1cHBsaWVyICAgCUAyNDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjMsIDY3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTYsIDYyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzA5NDAyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYzLCA3NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjQ3OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJOTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiIEAyNDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgMTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJXU0RMRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIKLQkJCQl3aWR0aCAgICAgIAk3NzQKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjUwCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDQwMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMjQ5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMDA4LCA0MDIpCi0JCQkJICAgICgxMDA4LCAzMTIpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkUzQzAzRDQiCi0JCQkJY2xpZW50ICAgICAJQDIyOQotCQkJCXN1cHBsaWVyICAgCUAyNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTIsIDU2OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDkyLCA0MDIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjUwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJCQljbGllbnQgICAgIAlAMjQwCi0JCQkJc3VwcGxpZXIgICAJQDIyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMTUsIDU3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAxNSwgMjQ2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkRERjUzNTAyQzMiCi0JCQkJY2xpZW50ICAgICAJQDI0MAotCQkJCXN1cHBsaWVyICAgCUAyNDkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzYyLCA1NzEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTApCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMTYsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDEzMDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk1ODgKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyNTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFFQzAxQ0IiCi0JCQkJY2xpZW50ICAgICAJQDI1NAotCQkJCXN1cHBsaWVyICAgCUAyNDAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzk2LCA4MDUpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDI1NgotCQkJCWxvY2F0aW9uICAgCSgyMzExLCAxNjg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGFyZW50IiBAMjU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjU2Ci0JCQkJCWxvY2F0aW9uICAgCSgyNzksIDI5NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjIsIDEzMzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFyZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkIiCi0JCQkJCWNsaWVudCAgICAgCUAyNTYKLQkJCQkJc3VwcGxpZXIgICAJQDI1NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzExLCAxNjg2KQotCQkJCQkgICAgKDI0MzIsIDE2ODYpCi0JCQkJCSAgICAoMjQzMiwgMTM3NCkKLQkJCQkJICAgICgyMzEwLCAxMzc0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzEwLCAxMzc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM2NiwgMTQyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjaGlsZHJlbiIgQDI2MAotCQkJCQlQYXJlbnRfVmlldyAJQDI1NgotCQkJCQlsb2NhdGlvbiAgIAkoMjc5LCAyOTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODk5LCAxNTM3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NoaWxkcmVuIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTg1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTExOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJCQljbGllbnQgICAgIAlAMjU2Ci0JCQkJCXN1cHBsaWVyICAgCUAyNTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjMxMSwgMTY4NikKLQkJCQkJICAgICgyMDE2LCAxNjg2KQotCQkJCQkgICAgKDIwMTYsIDE0MjUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjMxMSwgMTY4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTYsIDE0MjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDcwLCAxNDgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMS4xIE5hbWluZyBhbmQgTGlua2luZyIKLQkJCXF1aWQgICAgICAgCSIzQUU4RUQ3MjAxQkQiCi0JCQl0aXRsZSAgICAgIAkiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCQkJem9vbSAgICAgICAJOTAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbXBvcnQiIEAyNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW1wb3J0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMiwgMTI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IgotCQkJCXdpZHRoICAgICAgCTU5OAotCQkJCWhlaWdodCAgICAgCTIxOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIiBAMjY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDExMzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgMTA0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTmFtZXNwYWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkJCXdpZHRoICAgICAgCTQ3OQotCQkJCWhlaWdodCAgICAgCTIxNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAyNjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI5NCwgMTE0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTY5NAotCQkJCWhlaWdodCAgICAgCTE3MwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDI2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MDAsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyMzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMzIwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDM3IiBAMjY3Ci0JCQkJbG9jYXRpb24gICAJKDMwOSwgNzg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZU5hbWVzcGFjZXMiIEAyNjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjcKLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYxLCA5NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU5hbWVzcGFjZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5ODg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NjAzMzIiCi0JCQkJCWNsaWVudCAgICAgCUAyNjcKLQkJCQkJc3VwcGxpZXIgICAJQDI2NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDgsIDk3MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY4NzA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDkxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTI1MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDI3MgotCQkJCQlQYXJlbnRfVmlldyAJQDI2NwotCQkJCQlsb2NhdGlvbiAgIAkoLTkxLCAyNTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNjgsIDU5MikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzI4IgotCQkJCQljbGllbnQgICAgIAlAMjY3Ci0JCQkJCXN1cHBsaWVyICAgCUAyNjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCA1NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzksIDU4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ0OTYxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAyNzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0NzIsIDcyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NSwgNTgwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQkJd2lkdGggICAgICAJNDUyCi0JCQkJaGVpZ2h0ICAgICAJMzA0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUxIiBAMjc2Ci0JCQkJbG9jYXRpb24gICAJKDE0ODYsIDEwMDEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0MwMkU1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlU2NoZW1hIiBAMjc3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjc2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxMDE4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyNzAiCi0JCQkJCWNsaWVudCAgICAgCUAyNzYKLQkJCQkJc3VwcGxpZXIgICAJQDI2NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg2LCAxMDAxKQotCQkJCQkgICAgKDE2MzIsIDEwMDEpCi0JCQkJCSAgICAoMTYzMiwgMTEzMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCAxMDAxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYzMiwgMTEzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5MjU5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTIiIEAyODAKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNzYKLQkJCQkJbG9jYXRpb24gICAJKDUxMCwgLTEwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMURDRTAyN0EiCi0JCQkJCWNsaWVudCAgICAgCUAyNzYKLQkJCQkJc3VwcGxpZXIgICAJQDI3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgODcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzOSIgQDI4MQotCQkJCWxvY2F0aW9uICAgCSgxMDg3LCA0MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0EwMDJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDI4MgotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjgyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNiwgNDgwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiCi0JCQkJCWNsaWVudCAgICAgCUAyODEKLQkJCQkJc3VwcGxpZXIgICAJQDI3NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg3LCA0MDMpCi0JCQkJCSAgICAoMTM2NCwgNDAzKQotCQkJCQkgICAgKDEzNjQsIDU2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRGVmaW5pdGlvbiIgQDI4NAotCQkJCQlQYXJlbnRfVmlldyAJQDI4MQotCQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAtMTI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA1LCAzNjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzNzUzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCQkJY2xpZW50ICAgICAJQDI4MQotCQkJCQlzdXBwbGllciAgIAlAMjY2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCA0MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDUsIDQwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNDU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTQ5MTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAyODcKLQkJCQlsb2NhdGlvbiAgIAkoNzM3LCA4MjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDI4OAotCQkJCQlQYXJlbnRfVmlldyAJQDI4NwotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUyLCA2NDcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQkJY2xpZW50ICAgICAJQDI4NwotCQkJCQlzdXBwbGllciAgIAlAMjY2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDczNywgODI2KQotCQkJCQkgICAgKDUxMCwgODI2KQotCQkJCQkgICAgKDUxMCwgNTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA1NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NTcsIDU5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW1wb3J0cyIgQDI5MQotCQkJCQlQYXJlbnRfVmlldyAJQDI4NwotCQkJCQlsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VJbXBvcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTkxODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkJCWNsaWVudCAgICAgCUAyODcKLQkJCQkJc3VwcGxpZXIgICAJQDI3NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM3LCA4MjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ2LCA4MjYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTgwLCA4NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3MjIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTQ2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Mzc3MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjk1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjIwMEQwMzQwIgotCQkJCWNsaWVudCAgICAgCUAyNzUKLQkJCQlzdXBwbGllciAgIAlAMjYzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1NSwgNTY4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCAzMzMpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIgotCQkJcXVpZCAgICAgICAJIjNCODVBRTU5MDM3RSIKLQkJCXRpdGxlICAgICAgCSIyLjIgVHlwZXMiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAk4MQotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAyOTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMzYsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5NSwgMTE1OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNTAwCi0JCQkJaGVpZ2h0ICAgICAJMTc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDI5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDYsIDE1MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk0NzgKLQkJCQloZWlnaHQgICAgIAkxNjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAyOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE5NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjIsIDE4MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTE3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJd2lkdGggICAgICAJNTM1Ci0JCQkJaGVpZ2h0ICAgICAJMzA1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMjk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTA2NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUGFydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJCQl3aWR0aCAgICAgIAk0NjYKLQkJCQloZWlnaHQgICAgIAkyNTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDciIEAzMDAKLQkJCQlsb2NhdGlvbiAgIAkoNzM1LCAxMTcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEAzMDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDAKLQkJCQkJbG9jYXRpb24gICAJKDE0MywgNjc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc1LCAxMTMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNjkwMDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMjciCi0JCQkJCWNsaWVudCAgICAgCUAzMDAKLQkJCQkJc3VwcGxpZXIgICAJQDI5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg2LCAxMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM5LCAxMjA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODg3MDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ4IiBAMzA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzAwCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMzEiCi0JCQkJCWNsaWVudCAgICAgCUAzMDAKLQkJCQkJc3VwcGxpZXIgICAJQDI5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzM1LCAxMTcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg1LCAxMTcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0OSIgQDMwNQotCQkJCWxvY2F0aW9uICAgCSg1MjcsIDE1OTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTIwM0IyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb24iIEAzMDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDUKLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2NiwgMTU1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3NTM5NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEIxQzE0MDAxQyIKLQkJCQkJY2xpZW50ICAgICAJQDMwNQotCQkJCQlzdXBwbGllciAgIAlAMjk3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4OTcsIDE1OTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDcsIDE2NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NTg3NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTAiIEAzMDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMDUKLQkJCQkJbG9jYXRpb24gICAJKC02NSwgMTA5NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMjYiCi0JCQkJCWNsaWVudCAgICAgCUAzMDUKLQkJCQkJc3VwcGxpZXIgICAJQDI5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1MjcsIDE1OTIpCi0JCQkJCSAgICAoNDM3LCAxNTkyKQotCQkJCQkgICAgKDQzNywgMTMxMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MjcsIDE1OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDEzMTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU1IiBAMzEwCi0JCQkJbG9jYXRpb24gICAJKDMyMiwgMTkxMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5MzAzRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlIiBAMzExCi0JCQkJCVBhcmVudF9WaWV3IAlAMzEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzgsIDE4NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU1lc3NhZ2UiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0ODU2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSIKLQkJCQkJY2xpZW50ICAgICAJQDMxMAotCQkJCQlzdXBwbGllciAgIAlAMjk4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAxOTExKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQzLCAxOTY1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzE0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTQsIDExOTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTYwMTE4IgotCQkJCQljbGllbnQgICAgIAlAMzEwCi0JCQkJCXN1cHBsaWVyICAgCUAyOTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzIyLCAxOTExKQotCQkJCQkgICAgKDIyOSwgMTkxMSkKLQkJCQkJICAgICgyMjksIDEzMTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI5LCAxMzEzKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAzMTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDUxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVHlwZXMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQkJd2lkdGggICAgICAJMzg5Ci0JCQkJaGVpZ2h0ICAgICAJMjE2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJd2lkdGggICAgICAJMjIyCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMzE3Ci0JCQkJbG9jYXRpb24gICAJKDIzNCwgNjA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMzE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzE3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0ODAsIDY0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNwotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlVHlwZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY2MTAxNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM2QSIKLQkJCQkJY2xpZW50ICAgICAJQDMxNwotCQkJCQlzdXBwbGllciAgIAlAMzE1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYwNiwgNjA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4Mzg4MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAzMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMTcKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDM5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMywgMzEzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiIKLQkJCQkJY2xpZW50ICAgICAJQDMxNwotCQkJCQlzdXBwbGllciAgIAlAMzE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNCwgNjA0KQotCQkJCQkgICAgKDE3NCwgNjA0KQotCQkJCQkgICAgKDE3NCwgMjI1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNCwgNjA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0LCAyMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjgsIDI3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk3NzI5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiIEAzMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjQwLCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyNSwgMjAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJVHlwZXMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDE1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNDQURDQkIyMDA1MCIKLQkJCQl3aWR0aCAgICAgIAkyNDgKLQkJCQloZWlnaHQgICAgIAkxNjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzI4LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNTksIDc1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MzkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQkJd2lkdGggICAgICAJNzU3Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDMyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxMjE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTI5LCAxMTAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNjczCi0JCQkJaGVpZ2h0ICAgICAJMjUwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU5IiBAMzI3Ci0JCQkJbG9jYXRpb24gICAJKDE4MjYsIDk3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NTAwRjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYwIiBAMzI4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzI3Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDYsIDQ0NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0QiCi0JCQkJCWNsaWVudCAgICAgCUAzMjcKLQkJCQkJc3VwcGxpZXIgICAJQDMyNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgODU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzI4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3NCwgOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NTY0ODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDMzMAotCQkJCQlQYXJlbnRfVmlldyAJQDMyNwotCQkJCQlsb2NhdGlvbiAgIAkoMzA2LCA0NDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA2LCAxMDMzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA3NTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRSIKLQkJCQkJY2xpZW50ICAgICAJQDMyNwotCQkJCQlzdXBwbGllciAgIAlAMzI2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI2LCAxMDkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjUxNTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzMzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NBRENEM0IwMzgwIgotCQkJCWNsaWVudCAgICAgCUAzMTUKLQkJCQlzdXBwbGllciAgIAlAMzI0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwNSwgMzA3KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMzM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAyMjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxNSwgMTMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmxlRWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCQl3aWR0aCAgICAgIAk1MDAKLQkJCQloZWlnaHQgICAgIAkyMTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzMzUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUIwMTAzMTEiCi0JCQkJY2xpZW50ICAgICAJQDMxNQotCQkJCXN1cHBsaWVyICAgCUAzMzQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTQsIDUwMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU0LCAzMzApKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDkwLCAzNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCXdpZHRoICAgICAgCTY4NwotCQkJCWhlaWdodCAgICAgCTIxNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMSIgQDMzNwotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA0OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTMwMDc5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMiIgQDMzOAotCQkJCQlQYXJlbnRfVmlldyAJQDMzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNiwgMzg2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJCWNsaWVudCAgICAgCUAzMzcKLQkJCQkJc3VwcGxpZXIgICAJQDMzNAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjA2LCA0OTMpCi0JCQkJCSAgICAoMTA5NCwgNDkzKQotCQkJCQkgICAgKDEwOTQsIDMzMCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjA2LCA0OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAzMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQyLCAzNzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyODMyNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM0MQotCQkJCQlQYXJlbnRfVmlldyAJQDMzNwotCQkJCQlsb2NhdGlvbiAgIAkoLTU4NiwgMjM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NiwgNDU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzk3MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkJCWNsaWVudCAgICAgCUAzMzcKLQkJCQkJc3VwcGxpZXIgICAJQDMzNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MSwgNDkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxNSwgNTQ2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NjQ5NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTYsIDM5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjk0OTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyIKLQkJCQljbGllbnQgICAgIAlAMzI1Ci0JCQkJc3VwcGxpZXIgICAJQDMzNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MTIsIDc0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgNTcyKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMyBNZXNzYWdlcyIKLQkJCXF1aWQgICAgICAgCSIzQkNFODUzRDAyQzgiCi0JCQl0aXRsZSAgICAgIAkiMi4zIE1lc3NhZ2VzIgotCQkJem9vbSAgICAgICAJODUKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIiBAMzQ2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgMTIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJTWVzc2FnZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI2NywgNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QThBRjAwNEYiCi0JCQkJd2lkdGggICAgICAJMzgwCi0JCQkJaGVpZ2h0ICAgICAJMzI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUGFydCIgQDM0NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjksIDEyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBhcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCA3NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIKLQkJCQl3aWR0aCAgICAgIAk2MTcKLQkJCQloZWlnaHQgICAgIAkzMjQKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDM0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgODE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDc1LCA2OTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMjc2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzQ5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkJCWNsaWVudCAgICAgCUAzNDgKLQkJCQlzdXBwbGllciAgIAlAMzQ3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwNCwgNjc4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzA0LCAzODYpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDM1MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCA2NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgNTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCXdpZHRoICAgICAgCTQzMgotCQkJCWhlaWdodCAgICAgCTMyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM1MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJCQljbGllbnQgICAgIAlAMzUwCi0JCQkJc3VwcGxpZXIgICAJQDM0NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDM4OCkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAzNTIKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCA5NTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkUwMEUyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFydHMiIEAzNTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTIKLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTUyLCA4OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVBhcnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTc0NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTU2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRjAwNjEiCi0JCQkJCWNsaWVudCAgICAgCUAzNTIKLQkJCQkJc3VwcGxpZXIgICAJQDM0OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDY2LCA5NTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEwMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTgwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTY3LCAxMDYxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDIwMzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyIiBAMzU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzUyCi0JCQkJCWxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwNCwgODkzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA1NyIKLQkJCQkJY2xpZW50ICAgICAJQDM1MgotCQkJCQlzdXBwbGllciAgIAlAMzUwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY4OCwgOTUyKQotCQkJCQkgICAgKDQ0NSwgOTUyKQotCQkJCQkgICAgKDQ0NSwgODE3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ1LCA4MTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzOTMsIDkxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQ3NjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpKSkpKQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJzb2FwIgotCQlxdWlkICAgICAgIAkiM0EwMUNGMEMwMUEyIgotCQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzcyAiU09BUEJpbmRpbmciCi0JCQlxdWlkICAgICAgIAkiM0EwMUQzQjkwMUFEIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5QTM4MDFBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRyYW5zcG9ydFVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0EwMUQzREYwMUU0IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkJCXF1aWQgICAgICAgCSIzQTAxRDNGMTAyOUUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiU09BUEJvZHkiCi0JCQlxdWlkICAgICAgIAkiM0EwMURFRDUwMzFGIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5QTQ1MDA0MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJCQlxdWlkICAgICAgIAkiM0EwMUUyRDUwMUE1IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0E5MzQ3N0MwMUIyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nU3R5bGVzIgotCQkJCXF1aWQgICAgICAgCSIzRUU0QTREQjAwNzIiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIklTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXJCYXNlIgotCQkJcXVpZCAgICAgICAJIjNBMDFERUU3MDM0RCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUUwOUEzRTAzMjYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1c2UiCi0JCQkJcXVpZCAgICAgICAJIjNBRDYyRTlDMDA1NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRDYyRUEyMDI1RCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbmNvZGluZ1N0eWxlcyIKLQkJCQlxdWlkICAgICAgIAkiM0VFNEE1OEYwMUFFIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJJU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJTT0FQRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0EwNkQ5RkEwMEY3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5QTRBMDAyMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJCQlxdWlkICAgICAgIAkiM0EwOTgyMUEwMTJCIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENjIwNDgwM0FFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nU3R5bGVzIgotCQkJCXF1aWQgICAgICAgCSIzRUU0QTU2MzAzQUYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIklTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0EwQUQ0NTUwMEU4IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5QTRFMDMxRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNvYXBBY3Rpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBMEFENDY0MDA0QSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdHlsZSIKLQkJCQlxdWlkICAgICAgIAkiM0EwQUQ0NkMwMThDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBBZGRyZXNzIgotCQkJcXVpZCAgICAgICAJIjNBRDFGRjc1MDI4NyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUUwOTUzNTAwOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FEMjExQzkwMjVDIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXJGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUQ2MzJCODAzREQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENjMzMzQwMDM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNPQVBIZWFkZXIiCi0JCQlxdWlkICAgICAgIAkiM0FENjMzMDkwMTZEIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDYzMzMwMDE3RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIKLQkJCQlxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJJU3RyaW5nIgotCQkJcXVpZCAgICAgICAJIjNCOEREOTBDMDIyMCIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS5sYW5nLlN0cmluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4REQ5MzIwMzgzIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2NCIKLQkJCXF1aWQgICAgICAgCSIzQTA2RTBCNTAwMzYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY1IgotCQkJCXF1aWQgICAgICAgCSIzQTA2RTBCNjAwQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJvZHkiCi0JCQkJcXVpZHUgICAgICAJIjNBMDFERUQ1MDMxRiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0cyIKLQkJCQlxdWlkICAgICAgIAkiM0EwNkUwQjYwMEM1IgotCQkJCWxhYmVsICAgICAgCSJwYXJ0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjYiCi0JCQlxdWlkICAgICAgIAkiM0FENjJERTYwMTMwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJtZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ2MkRFNzAwNEIiCi0JCQkJbGFiZWwgICAgICAJIm1lc3NhZ2UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NyIKLQkJCQlxdWlkICAgICAgIAkiM0FENjJERTcwMDU1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQTAxREVFNzAzNEQiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2OCIKLQkJCXF1aWQgICAgICAgCSIzQUQ2MkRGODAyRDEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNBRDYyREZBMDAwMiIKLQkJCQlsYWJlbCAgICAgIAkicGFydCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDY5IgotCQkJCXF1aWQgICAgICAgCSIzQUQ2MkRGQTAwMDMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEhlYWRlckJhc2UiCi0JCQkJcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDcwIgotCQkJcXVpZCAgICAgICAJIjNBRDYzMzM3MDFDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzEiCi0JCQkJcXVpZCAgICAgICAJIjNBRDYzMzM3MDM3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MzMwOTAxNkQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaGVhZGVyRmF1bHRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ2MzMzNzAzNzMiCi0JCQkJbGFiZWwgICAgICAJImhlYWRlckZhdWx0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDYzMkI4MDNERCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjNBMDFDRjIzMDI5RiIKLQkJCXRpdGxlICAgICAgCSJCaW5kaW5nIgotCQkJem9vbSAgICAgICAJODcKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMzI0Ci0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAzNjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDE1NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgpCi0JCQkJd2lkdGggICAgICAJNDUyCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQT3BlcmF0aW9uIiBAMzYxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAyMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMywgMTAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQT3BlcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0EwQUQ0NTUwMEU4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDMsIDE1NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0NzEpCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXIiIEAzNjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU2MCwgOTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOTUsIDkwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU09BUEhlYWRlciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYzMzA5MDE2RCIKLQkJCQl3aWR0aCAgICAgIAkzNDgKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJGYXVsdCIgQDM2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgOTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTQyLCA5MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBIZWFkZXJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYzMkI4MDNERCIKLQkJCQl3aWR0aCAgICAgIAk0NTQKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzAiIEAzNjQKLQkJCQlsb2NhdGlvbiAgIAkoOTMzLCA5NjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjMzMzcwMUNEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MSIgQDM2NQotCQkJCQlQYXJlbnRfVmlldyAJQDM2NAotCQkJCQlsb2NhdGlvbiAgIAkoMjc3LCAtNTQzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDYzMzM3MDM3MiIKLQkJCQkJY2xpZW50ICAgICAJQDM2NAotCQkJCQlzdXBwbGllciAgIAlAMzYyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzMsIDk2MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDczNCwgOTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaGVhZGVyRmF1bHRzIiBAMzY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzY0Ci0JCQkJCWxvY2F0aW9uICAgCSgyNzcsIC01NDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDkyMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitoZWFkZXJGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMzA3MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ2MzMzNzAzNzMiCi0JCQkJCWNsaWVudCAgICAgCUAzNjQKLQkJCQkJc3VwcGxpZXIgICAJQDM2MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMzLCA5NjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMzLCA5NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDgwLCA5MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNjkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgOTk5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUxCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MTQwMzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzNzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA0OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDEsIDQxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQl3aWR0aCAgICAgIAkyNjQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBIZWFkZXJCYXNlIiBAMzcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDc5NCwgNDIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQSGVhZGVyQmFzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDFERUU3MDM0RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk0LCA0NzcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY1KQotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY2IiBAMzcyCi0JCQkJbG9jYXRpb24gICAJKDE0OTMsIDQ4NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MkRFNjAxMzAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1lc3NhZ2UiIEAzNzMKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNzIKLQkJCQkJbG9jYXRpb24gICAJKDM0MSwgLTY4MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NzQsIDUxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTIzMjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ2MkRFNzAwNEIiCi0JCQkJCWNsaWVudCAgICAgCUAzNzIKLQkJCQkJc3VwcGxpZXIgICAJQDM3MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5MywgNDg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MiwgNDg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzczCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNDQ4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODcyMDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDY3IiBAMzc2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzcyCi0JCQkJCWxvY2F0aW9uICAgCSgzNDEsIC02ODMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIwLCA1MjUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3MjI1NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDYyREU3MDA1NSIKLQkJCQkJY2xpZW50ICAgICAJQDM3MgotCQkJCQlzdXBwbGllciAgIAlAMzcxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkzLCA0ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk1LCA0ODUpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQQm9keSIgQDM3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgMTM0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk0LCAxMjM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQQm9keSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDFERUQ1MDMxRiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk0LCAxMjkzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTY2NSkKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDM3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCA5NTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJNTEyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDY4IiBAMzgwCi0JCQkJbG9jYXRpb24gICAJKDE1OTAsIDcwNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MkRGODAyRDEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcnQiIEAzODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzODAKLQkJCQkJbG9jYXRpb24gICAJKDQzOCwgLTQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTcsIDg4NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODE0NjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTkwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ2MkRGQTAwMDIiCi0JCQkJCWNsaWVudCAgICAgCUAzODAKLQkJCQkJc3VwcGxpZXIgICAJQDM3OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTkwLCA3MDQpCi0JCQkJCSAgICAoMTgyNywgNzA0KQotCQkJCQkgICAgKDE4MjcsIDk0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODI3LCA5NDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzc0LCA4ODYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MTQ2NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjkiIEAzODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAzODAKLQkJCQkJbG9jYXRpb24gICAJKDQzOCwgLTQ2NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDksIDc0NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENjJERkEwMDAzIgotCQkJCQljbGllbnQgICAgIAlAMzgwCi0JCQkJCXN1cHBsaWVyICAgCUAzNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU5MCwgNzA0KQotCQkJCQkgICAgKDExNzAsIDcwNCkKLQkJCQkJICAgICgxMTcwLCA2NDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU5MCwgNzA0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3MCwgNjQ4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NCIgQDM4NgotCQkJCWxvY2F0aW9uICAgCSgxNDU3LCAxMzkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDZFMEI1MDAzNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjUiIEAzODcKLQkJCQkJUGFyZW50X1ZpZXcgCUAzODYKLQkJCQkJbG9jYXRpb24gICAJKDIyNSwgLTkxNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQTA2RTBCNjAwQzQiCi0JCQkJCWNsaWVudCAgICAgCUAzODYKLQkJCQkJc3VwcGxpZXIgICAJQDM3OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1NywgMTM5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTUsIDEzOTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0cyIgQDM4OAotCQkJCQlQYXJlbnRfVmlldyAJQDM4NgotCQkJCQlsb2NhdGlvbiAgIAkoMjI1LCAtOTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU5MSwgMTQ5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODMzODU2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBMDZFMEI2MDBDNSIKLQkJCQkJY2xpZW50ICAgICAJQDM4NgotCQkJCQlzdXBwbGllciAgIAlAMzc5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU3LCAxMzkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMTM5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTEsIDEzNDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMzg1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEZhdWx0IiBAMzkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNjQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3OTQsIDE1NDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDZEOUZBMDBGNyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk0LCAxNTk3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTY2NSkKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkyNDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6SVN0cmluZyIgQDM5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCAxMzMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJU3RyaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDEyODIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEREOTBDMDIyMCIKLQkJCQl3aWR0aCAgICAgIAkzNjYKLQkJCQloZWlnaHQgICAgIAkxODAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzkzCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDc1MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzcxCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMDQwLCA3NTApCi0JCQkJICAgICgxMDQwLCA2NDgpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MzMzMDAxN0QiCi0JCQkJY2xpZW50ICAgICAJQDM2MgotCQkJCXN1cHBsaWVyICAgCUAzNzEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDUsIDg5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ1LCA3NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzkzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDYzMzM0MDAzOCIKLQkJCQljbGllbnQgICAgIAlAMzYzCi0JCQkJc3VwcGxpZXIgICAJQDM3MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTYsIDg5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMxNiwgNzUwKQotCQkJCWRyYXdTdXBwbGllciAJQDM5MykpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIlBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0EwODVFMzAwMzVDIgotCQkJdGl0bGUgICAgICAJIlBvcnQiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEFkZHJlc3MiIEAzOTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTEsIDIzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU09BUEFkZHJlc3MiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQxRkY3NTAyODciCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MSwgMjk0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOSkKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIkV4dGVuc2liaWxpdHkiCi0JCQlxdWlkICAgICAgIAkiM0FFMDk5QjEwMTYxIgotCQkJdGl0bGUgICAgICAJIkV4dGVuc2liaWxpdHkiCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEFkZHJlc3MiIEAzOTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgNTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzcxLCA1MjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBBZGRyZXNzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FEMUZGNzUwMjg3IgotCQkJCXdpZHRoICAgICAgCTMxNgotCQkJCWhlaWdodCAgICAgCTEyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUEJpbmRpbmciIEAzOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCA1OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MiwgNTQzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTT0FQQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBMDFEM0I5MDFBRCIKLQkJCQl3aWR0aCAgICAgIAkzMDIKLQkJCQloZWlnaHQgICAgIAkxMjIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnNvYXA6OlNPQVBCb2R5IiBAMzk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzOTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDk1MCwgMTA1NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU09BUEJvZHkiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQTAxREVENTAzMUYiCi0JCQkJd2lkdGggICAgICAJMjYyCi0JCQkJaGVpZ2h0ICAgICAJMTIyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQRmF1bHQiIEA0MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMTI2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExMiwgMTIxNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiU09BUEZhdWx0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0EwNkQ5RkEwMEY3IgotCQkJCXdpZHRoICAgICAgCTI1OAotCQkJCWhlaWdodCAgICAgCTEyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6c29hcDo6U09BUE9wZXJhdGlvbiIgQDQwMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1MTIsIDc1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ0LCA3MDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQTBBRDQ1NTAwRTgiCi0JCQkJd2lkdGggICAgICAJMzU0Ci0JCQkJaGVpZ2h0ICAgICAJMTIyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojpzb2FwOjpTT0FQSGVhZGVyQmFzZSIgQDQwMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjI3LCA4NzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNPQVBIZWFkZXJCYXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0EwMURFRTcwMzREIgotCQkJCXdpZHRoICAgICAgCTM5NgotCQkJCWhlaWdodCAgICAgCTEyMgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEA0MDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDEyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA4LCA1NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCQkJd2lkdGggICAgICAJNDE4Ci0JCQkJaGVpZ2h0ICAgICAJMTc0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQwNAotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDMwNSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg2MDgsIDMwNSkKLQkJCQkgICAgKDYwOCwgMjE1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDlBMzgwMUFCIgotCQkJCWNsaWVudCAgICAgCUAzOTgKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzQ0LCA1MzEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM0NCwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOUEzRTAzMjYiCi0JCQkJY2xpZW50ICAgICAJQDQwMgotCQkJCXN1cHBsaWVyICAgCUA0MDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTUsIDg2NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODE1LCAzMDUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA5QTQ1MDA0MSIKLQkJCQljbGllbnQgICAgIAlAMzk5Ci0JCQkJc3VwcGxpZXIgICAJQDQwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwNjgsIDEwNDMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjgsIDMwNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MDQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDlBNEUwMzFGIgotCQkJCWNsaWVudCAgICAgCUA0MDEKLQkJCQlzdXBwbGllciAgIAlANDAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTA2LCA2OTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUwNiwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOUE0QTAwMjAiCi0JCQkJY2xpZW50ICAgICAJQDQwMAotCQkJCXN1cHBsaWVyICAgCUA0MDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAxMjAzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAzMDUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDA0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA5NTM1MDA5OCIKLQkJCQljbGllbnQgICAgIAlAMzk3Ci0JCQkJc3VwcGxpZXIgICAJQDQwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjAsIDUxNSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyMCwgMzA1KQotCQkJCWRyYXdTdXBwbGllciAJQDQwNCkpKSkpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInhzZCIKLQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiWFNEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkib3JnLmVjbGlwc2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJ4c2QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3hzZC8yMDAyL1hTRCIpKQotCQlxdWlkICAgICAgIAkiMzlBQkRDNkYwMUFBIgotCQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQW5ub3RhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUUxNzcwMTE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZENEUyMDM2NiIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcHBsaWNhdGlvbkluZm9ybWF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VCRjAyQzgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlckluZm9ybWF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VFQTAxNTciCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlcyIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdGMDUwMUUyIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01BdHRyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2MTAzQkUiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjUyMDJCNCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjcyRDhFMjAwRUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5NDAzQTAyMjEiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkVCMDJBOCIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzgwMEQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODdGN0IwMzg2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2UiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzJENzM3MDM4RiIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQ0YzMDI3RCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNEREIwM0I3IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNERTAwMkQ4IgotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMDIyMDM4MiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzI3MTlEOTAzNDEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQm91bmRlZEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NTFEMDM0NCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzYzQzAyMjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTJBMDBDQyIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHlGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NEYwMTMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzU2QzAxNTMiCi0JCQkJdHlwZSAgICAgICAJIlhTRENhcmRpbmFsaXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEI4MDI4NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5QkFBMjAzMTAiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXJpdmF0aW9uTWV0aG9kIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM2RTQwMjBFIgotCQkJCXR5cGUgICAgICAgCSJYU0REZXJpdmF0aW9uTWV0aG9kIgotCQkJCWluaXR2ICAgICAgCSJyZXN0cmljdGlvbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MUQwMjZBIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzczODAwQzUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29udGVudFR5cGVDYXRlZ29yeSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNBNDIwMkI4IgotCQkJCXR5cGUgICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0I4QTAzRTYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjE4MDE0RCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEZCOTcwMDZFIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMzFBRjVFMDNBNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBOTAzRDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZBRERCNTAxQTUiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4MDAzOTQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpYyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Q0QzBGNEMwMUExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXZlcml0eSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY5MUMwMDVEIgotCQkJCXR5cGUgICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTVGREQwMjgwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNDMDYzNzQzMDE2QiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpbmUiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MDdFMDIxMyIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbHVtbiIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYxMUUwMjk2IgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm9kZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwMTZCNkIwMjAwIgotCQkJCXR5cGUgICAgICAgCSJET01Ob2RlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFubm90YXRpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNDMDYzNzRGMDE4NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjYwMzM5IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuaWxsYWJsZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRkI0MDI5RiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0NjgwMzY4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNEEwMDNCOSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0RTAwMDBFIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTRDMDBCMiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE2ODAxQzEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUY2MjAzQ0YiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MzNERDQjAwMDE4IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbnVtZXJhdGlvbkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM5RDAzQzciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNjQwMDU0IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyNTY4MDI1OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzczNzQwMjUzIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFjZXROYW1lIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RkI0MDFFQyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVmZmVjdGl2ZVZhbHVlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQUUzMDNCNiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZlYXR1cmUiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRjgxMDIwRiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWludCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRjg4MDBDNSIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmb3JtIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwMkIwMzNFIgotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzFBMUIwMTZGIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ2xvYmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDA3MDM3MiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmZWF0dXJlUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDQ0MDE4NSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERml4ZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNjk5RTAwQzEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODgwMUI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaXhlZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QTYwMDIwMSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOTkwMDE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlEMjAwOEEiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnVuZGFtZW50YWxGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNjlFODAxRDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDN0IwMzk2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMUM3MDE0MyIKLQkJCQl0eXBlICAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREltcG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5MzAxN0YiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjZBREIxNTAzNkMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW5jbHVkZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM3RDAyNTAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4REMwMzgxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzgwMDJERiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3NkMwMDRCIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4RTAzMDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDMxMDNBRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRTIwMUY3IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExNzQwMjdEIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE5MzAzNTQiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEluY2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4MzAzQjgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4TGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjdEMDBGQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3REEwMEYzIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1OTAyODEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDI0MDA5OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRDEwMzk4IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQTIwMDhFIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFCRTAzRTIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkluY2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1MjAzNTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluTGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0M0MDBDMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3OTkwMTVFIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXAiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTY0MDI3OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21wb3NpdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0YxRDAxQ0YiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBvc2l0b3IiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFMjAzODEiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjU1MDM4NSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFGNjAyRTgiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5hbWVkQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NDcwMDAxNDIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzA0MDMxRSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzTmFtZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU3RjAxMjciCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1UkkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1ODcwMEUyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNVUkkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1QUEwMkFGIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOTA5NjMwMjVFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTRGMDIzQyIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSWRlbnRpZmllciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMkUwMEYwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSWRlbnRpZmllciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMzQwMzk3IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE51bWVyaWNGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NDIwMDc0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzVBMzAwMTIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NTkwMTJDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzRGNjAyREEiCi0JCQkJdHlwZSAgICAgICAJIlhTRE9yZGVyZWQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhcnRpY2xlIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhGQzAxRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaW5PY2N1cnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y4RTAzQjIiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtYXhPY2N1cnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y5OTAzQUUiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjc4MEJEOTAwNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGF0dGVybkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkNBNTAzOEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNzkwMzExIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRCQTAyM0MiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2ODAwMjE2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkIzMDFENSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lIgotCQkJcXVpZCAgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIgotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzhGMDAyRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWEiCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NEU1MDNERCIKLQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NoZW1hTG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjg2OEVDMDIyNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I5RjlCRkYwMTgwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRm9ybURlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA0QjAxMDIiCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRGb3JtRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDc4MDBBQyIKLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSIKLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWxEZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEM0QTcwMDM4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9ja0RlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjU5RDAyRDgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZlcnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNEMjJENkQ4MDM1NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb21wb3NpdG9yIgotCQkJcXVpZCAgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMzIxMDJBRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ5QjMwMzMwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjb3BlIgotCQkJcXVpZCAgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0Q2NDAyMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzMTU4MDBBOSIKLQkJCQl0eXBlICAgICAgIAkiWFNEVmFyaWV0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU0NEYwMTQ2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RTaW1wbGVGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjY1RTAzNUEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbGlkRmFjZXRzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QUIwRjAwQjYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVGVybSIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjQ0MDA2OSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRvdGFsRGlnaXRzRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjYxMDMzNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc5QUIwMjMyIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJGNTAxM0EiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODYyMDA0NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NTAwMjAxIgotCQkJCXR5cGUgICAgICAgCSJYU0RXaGl0ZVNwYWNlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaWxkY2FyZCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQwRTkwMTlFIgotCQkJCXR5cGUgICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0NGODYwMjIzIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvY2Vzc0NvbnRlbnRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxMkUwMUU0IgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkE3QkRCNzAxRjkiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZEODRGNzAwOTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5IgotCQkJCXF1aWQgICAgICAgCSIzQjZEOTAxNTAzREUiCi0JCQkJdHlwZSAgICAgICAJIlhTRFhQYXRoVmFyaWV0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I3QkJCRTEwMUIxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUF0dHIiCi0JCQlxdWlkICAgICAgIAkiM0JCRjhDODkwMUI2IgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5BdHRyIgotCQkJCXF1aWQgICAgICAgCSIzQkJGOENCMDAwRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0MyNzg1MEUwMzgxIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg1MUIwM0M2IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4MTg5NzkwMjAwIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjgxODlEQjAzNzQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NTm9kZSIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjRBNTAxMTciCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLk5vZGUiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NUJGMDAyRCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJWYWx1ZSIKLQkJCXF1aWQgICAgICAgCSIzQzA0MEI1QjAzMUYiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubGFuZy5PYmplY3QiCi0JCQkJcXVpZCAgICAgICAJIjNDMDQwQjhEMDNENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQkE3QjBFODAxQTgiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wdGlvbmFsIgotCQkJCXF1aWQgICAgICAgCSIzQkE3QjExNTAyQjciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjIwMkQzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyOTAyRjAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5IgotCQkJcXVpZCAgICAgICAJIjNCQzc3MTVEMDA5QiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluaXRlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFEQzAyRUQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY291bnRhYmx5SW5maW5pdGUiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUVDMDE0MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleEZpbmFsIgotCQkJcXVpZCAgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFNzAwREEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkVBMDE2QSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkQyMDExMiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9zaXRvciIKLQkJCXF1aWQgICAgICAgCSIzQjg2OUI2MjAwMzciCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlCRDAwMDAzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNob2ljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDQjgwMTFFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcXVlbmNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNFNTAwNTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NjlFMjYwMUFFIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU4RTAyNTgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RTk5MDI3MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTc5RjAzQTIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVtcHR5IgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdDRDAyRjAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2ltcGxlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMTAwQ0UiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWl4ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QzMDFCNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50T25seSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDcwMkU5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REZXJpdmF0aW9uTWV0aG9kIgotCQkJcXVpZCAgICAgICAJIjNCODZBMEIwMDBDRSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDODAzMjkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMENDMDE2MiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpY1NldmVyaXR5IgotCQkJcXVpZCAgICAgICAJIjNCRkU2OEE3MDMyRiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmF0YWwiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEMzMDNEMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlcnJvciIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RTcwMEUzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndhcm5pbmciCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEVBMDFGRiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTdGQzIwMTlBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzVBNDAzREYiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN1YnN0aXR1dGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NzkwMDQ1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2N0YwMUFDIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4MzAyMEIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI0NTAwNjkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZvcm0iCi0JCQlxdWlkICAgICAgIAkiM0I5RjkxM0IwMUVCIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxdWFsaWZpZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MTZGMDAyMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bnF1YWxpZmllZCIKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxOEMwMDdGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTFFMDAyNzIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTIwMDg1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleXJlZiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTMwMTRGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaXF1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTYwMzY1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1RUEwMDIzIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbnkiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYwMDAzNCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYyMDA1RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXQiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDY1MDExNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZCIKLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1MjAyRTQiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhbHNlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFBOTAyNzEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFydGlhbCIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQkIwMUZGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRvdGFsIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFDNDAxQjIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2Nlc3NDb250ZW50cyIKLQkJCXF1aWQgICAgICAgCSIzQjhGRjhDNzAyODQiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0cmljdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RjgwMDQ1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxheCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RjYwMzhCIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNraXAiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEU4MDJCQSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QkUwMjcyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjhCMDBCOCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OTQwMjkxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNTAwMjk1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVGaW5hbCIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgxMDIzMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODMwMTM4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4ODAyNEUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZFMDAzNzQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzU5MTAwQUUiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NjQwMjMxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2RDAyMTYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFZhcmlldHkiCi0JCQlxdWlkICAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdG9taWMiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0E3MDJERiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRDAxMzkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FGMDM5RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2hpdGVTcGFjZSIKLQkJCXF1aWQgICAgICAgCSIzQkVFRDBGNjAzNDIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZXNlcnZlIgotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEwRjAxMTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVwbGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjcwMzREIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbGxhcHNlIgotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyOTAzOTYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoVmFyaWV0eSIKLQkJCXF1aWQgICAgICAgCSIzQjhGRkI4OTAzM0EiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlbGVjdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJBQzAxOTIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGQiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkIzMDI3OCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzIiCi0JCQlxdWlkICAgICAgIAkiM0M2MjZFQTcwMTAyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3MyIKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzQiCi0JCQlxdWlkICAgICAgIAkiM0I2OURBREMwMkY1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyNDIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NiIKLQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAwNkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc3IgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMEUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMTgiCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDc4IgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTZCMDJDQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNyIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDgwIgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjZCMDE5NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkODEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMwOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzEzIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MiIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwNjAyOTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NCIKLQkJCXF1aWQgICAgICAgCSIzQjY5NDA0RTAwNjciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg1IgotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyOUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwNTAwMkE1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODYiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1OUYwMDg2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDY5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDZBIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODgiCi0JCQlxdWlkICAgICAgIAkiM0MyNzVEMzIwMjIwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEQiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5MCIKLQkJCXF1aWQgICAgICAgCSIzQjY4ODdCRjAxNTAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDkxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE4IgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTIiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNUUwMUY5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDQ2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA1MCIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NTAxMEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZCIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTYiCi0JCQlxdWlkICAgICAgIAkiM0I2RjFERTkwMThBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzZDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzgwIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk4IgotCQkJcXVpZCAgICAgICAJIjNCOTAwNjg4MDFDMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTkiCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRBbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMUIiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRBbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTAwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzMzM1MDM0MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzM2MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDIiCi0JCQlxdWlkICAgICAgIAkiM0I2RkRERDcwMTEzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA0IgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0RGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZFIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwNiIKLQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAwNkUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM5NTkwMzRBIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA4IgotCQkJcXVpZCAgICAgICAJIjNCNjk4RTM2MDM4NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTA5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OThFMzgwMDdDIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEwIgotCQkJcXVpZCAgICAgICAJIjNCNjg1MUJBMDEyNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTExIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTEyIgotCQkJcXVpZCAgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGFpbmVyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNFIgotCQkJCWxhYmVsICAgICAgCSJjb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCMEMwMUNGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNCIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUI0ODAyNjEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RDb250YWluZXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJbGFiZWwgICAgICAJInJvb3RDb250YWluZXIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFCNEMwMjg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExNiIKLQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMTAzNTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUMzMzAzMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzQiIKLQkJCQlsYWJlbCAgICAgIAkic2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE4IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyM0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjAiCi0JCQlxdWlkICAgICAgIAkiM0I2ODkxMTQwMUFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyMiIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAwNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0JGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDNDMCIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyNCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyNSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjYiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQxRTYwMjUxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjciCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDJGNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDFFQTAzMEIiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI4IgotCQkJcXVpZCAgICAgICAJIjNCNjlDMDU5MDE5OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTI5IgotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzA1RDAxRUQiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzAiCi0JCQlxdWlkICAgICAgIAkiM0M0MkRCREQwMjk3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzEiCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDExRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJbGFiZWwgICAgICAJInN1YnN0aXR1dGlvbkdyb3VwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMyIgotCQkJcXVpZCAgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMzIgotCQkJCXF1aWQgICAgICAgCSIzQjZEMjNCQTAxQzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDRSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNCIKLQkJCXF1aWQgICAgICAgCSIzQjZENTk3MTAyRUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJbGFiZWwgICAgICAJInNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzYiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI2NTMwMTdBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJzY29wZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCNjU0MDA2RCIKLQkJCQlsYWJlbCAgICAgIAkic2NvcGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMzciCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTM4IgotCQkJcXVpZCAgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRGZWF0dXJlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEZlYXR1cmUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzOSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDMzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDIiCi0JCQlxdWlkICAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyZWZlcmVuY2VkS2V5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jZWRLZXkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0MyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjY5RDJBODAxNkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDQiCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzZWxlY3RvciIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCWxhYmVsICAgICAgCSJzZWxlY3RvciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ2IgotCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDAyNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ3IgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmllbGRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJbGFiZWwgICAgICAJImZpZWxkcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTQ4IgotCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q4MDJGQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQ5IgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTAiCi0JCQlxdWlkICAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREluY2x1ZGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzdEMDI1MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRENDNjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTIiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTcwMkM4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE4MDNFMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxOTAwMDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTQiCi0JCQlxdWlkICAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkJDRUI2MDAxQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDI1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTYiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM2MDYwMjZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTciCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXJ0aWNsZXMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNjA3MDIyMiIKLQkJCQlsYWJlbCAgICAgIAkicGFydGljbGVzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTgiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTUwMDhBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE2MDA5NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMEEwIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYwIgotCQkJcXVpZCAgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYxIgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXAiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2MiIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDI0NTAzOTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOUUiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NCIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRjAyMTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEM5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2NiIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDcxNTAxMTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQ3MUEwM0FCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE2OCIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0M4OTAxMjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODNDOEEwMTEwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0ZXJtIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTEiCi0JCQkJbGFiZWwgICAgICAJInRlcm0iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTcwIgotCQkJcXVpZCAgICAgICAJIjNCNkFERTQyMDA5QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcxIgotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MiIKLQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc0IgotCQkJcXVpZCAgICAgICAJIjNCNjg4RTZCMDAzRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc1IgotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3NiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RDAxQkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NyIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZWxlbWVudERlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOEUwMTk5IgotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc4IgotCQkJcXVpZCAgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc5IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODAiCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQlsYWJlbCAgICAgIAkiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4MiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAwNDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MyIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzN0UiCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTg0IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRUZGMDI0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTg1IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQlsYWJlbCAgICAgIAkibW9kZWxHcm91cERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODYiCi0JCQlxdWlkICAgICAgIAkiM0JGQzJBMTcwMUVEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODciCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZDMkExQTAyN0QiCi0JCQkJbGFiZWwgICAgICAJImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4OCIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUVBNzAyM0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4OSIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRUE4MDM4QiIKLQkJCQlsYWJlbCAgICAgIAkibm90YXRpb25EZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkwIgotCQkJcXVpZCAgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTkxIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTIiCi0JCQlxdWlkICAgICAgIAkiM0I2RDVDQTUwMTEyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNCNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1Q0E3MDNDOCIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk0IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNUFEMDM3NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk1IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZhY2V0Q29udGVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAxMCIKLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRDb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTYiCi0JCQlxdWlkICAgICAgIAkiM0JDOEFFMDIwM0E4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTciCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA1MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkM4QUUwNjAwNjUiCi0JCQkJbGFiZWwgICAgICAJImZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk4IgotCQkJcXVpZCAgICAgICAJIjNCNkMzNEI3MDIwOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk5IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCWxhYmVsICAgICAgCSJtZW1iZXJUeXBlRGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMCIKLQkJCXF1aWQgICAgICAgCSIzQjZDMzYzMjAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDU5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCWxhYmVsICAgICAgCSJmdW5kYW1lbnRhbEZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZ1bmRhbWVudGFsRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OUU4MDFENiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMiIKLQkJCXF1aWQgICAgICAgCSIzQjZEMzVBQjAyNzMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQzNUIyMDJBNSIKLQkJCQlsYWJlbCAgICAgIAkiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDQiCi0JCQlxdWlkICAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDIyRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWl0aXZlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwNiIKLQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MTAxNTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUUyOTIwMTlGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxQTkiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDgiCi0JCQlxdWlkICAgICAgIAkiM0I5MDA2Q0YwMDg4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDkiCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQlsYWJlbCAgICAgIAkiZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTAiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMzMwMjY0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTEiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjM0MDI4RSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEyIgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjExMDI2RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjEzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMjAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDIwMyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNCIKLQkJCXF1aWQgICAgICAgCSIzQzYyNkVCMzAwMDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNSIKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzI3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQjQwMzMyIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTYiCi0JCQlxdWlkICAgICAgIAkiM0JFQkRDODcwMjQ3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTciCi0JCQkJcXVpZCAgICAgICAJIjNCRUJEQzhDMDJGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZENvbnRlbnQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE4IgotCQkJcXVpZCAgICAgICAJIjNCRkU2MjI3MDNDRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE5IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wb25lbnRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJbGFiZWwgICAgICAJImNvbXBvbmVudHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMCIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJkaWFnbm9zdGljcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjZBMDAyNyIKLQkJCQlsYWJlbCAgICAgIAkiZGlhZ25vc3RpY3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjIiCi0JCQlxdWlkICAgICAgIAkiM0JGRTY0MzEwMzVGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjMiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFsbERpYWdub3N0aWNzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJbGFiZWwgICAgICAJImFsbERpYWdub3N0aWNzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNCIKLQkJCXF1aWQgICAgICAgCSIzQzIxRENDNzAwRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjYiCi0JCQlxdWlkICAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjciCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiCi0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQlsYWJlbCAgICAgIAkiaW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI4IgotCQkJcXVpZCAgICAgICAJIjNDMjM5MTM0MDA0RiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI5IgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwQ0EiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzIzOTEzNjAwRDQiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzAiCi0JCQlxdWlkICAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzEiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVEM0E5MDM3MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcxIgotCQkJCWxhYmVsICAgICAgCSJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzIiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVDRjAwMDVFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzMiCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFQ0Y0MDAxRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIikKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDI4IgotCQkJCWxhYmVsICAgICAgCSJyb290VmVyc2lvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNCIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUQwQjAxMUIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAib3JpZ2luYWxWZXJzaW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCWxhYmVsICAgICAgCSJvcmlnaW5hbFZlcnNpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzYiCi0JCQlxdWlkICAgICAgIAkiM0MyNUVFQUIwMDFGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzciCi0JCQkJcXVpZCAgICAgICAJIjNDMjVFRUFGMDEwQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTE1IgotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM4IgotCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM5IgotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwREYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIml0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMEUwIgotCQkJCWxhYmVsICAgICAgCSJpdGVtVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MCIKLQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3MzAxOTQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hRm9yU2NoZW1hIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg0NzUwMUZCIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWFGb3JTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDIiCi0JCQlxdWlkICAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwM0MiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODBGOTAwNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4ODJDNzAxMTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiKQotCQkJICAgIChvYmplY3QgUm9sZSAicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMyIKLQkJCQlsYWJlbCAgICAgIAkicHJpbWFyeUNvbXBvbmVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQ2IgotCQkJcXVpZCAgICAgICAJIjNDMjhBMEYyMDFBNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJFNSIKLQkJCQlsYWJlbCAgICAgIAkidHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0NyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDgiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE2REIwMUU1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNkREMDNERCIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0RFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI1MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTcxMjAxMDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUyIgotCQkJcXVpZCAgICAgICAJIjNDMjhBNzRCMDE3OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1MyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU0IgotCQkJcXVpZCAgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiY29tcGxleFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTdGNDAxMTciCi0JCQkJbGFiZWwgICAgICAJImNvbXBsZXhUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU1IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDEyMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE5OTQwMzBBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyb290VHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwREQiCi0JCQkJbGFiZWwgICAgICAJInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI1NyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NzAwRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjU4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjU5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyNzAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwODYwMjdBIgotCQkJCWxhYmVsICAgICAgCSJtaW5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMDhEMDI1MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCWxhYmVsICAgICAgCSJtYXhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjYyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFCMDM5NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQUMwM0Q0IgotCQkJCWxhYmVsICAgICAgCSJtYXhJbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAxRjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjAwMjAzIgotCQkJCWxhYmVsICAgICAgCSJtaW5JbmNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY2IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEIzMDIwNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY3IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjQwMTlBIgotCQkJCWxhYmVsICAgICAgCSJtaW5FeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjY4IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEI2MDI4RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjY5IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQjcwMjIxIgotCQkJCWxhYmVsICAgICAgCSJtYXhFeGNsdXNpdmVGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcwIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjcxIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMjUwIgotCQkJCWxhYmVsICAgICAgCSJsZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcyIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjczIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIndoaXRlU3BhY2VGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA3NSIKLQkJCQlsYWJlbCAgICAgIAkid2hpdGVTcGFjZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc0IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc1IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVudW1lcmF0aW9uRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzMwMEFDIgotCQkJCWxhYmVsICAgICAgCSJlbnVtZXJhdGlvbkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNzYiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNzciCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicGF0dGVybkZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQlsYWJlbCAgICAgIAkicGF0dGVybkZhY2V0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI3OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDODAyQTciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzkwMUY1IgotCQkJCWxhYmVsICAgICAgCSJjYXJkaW5hbGl0eUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1NUQwM0QyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQjAzOUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQ0MwM0QwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJudW1lcmljRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDEiCi0JCQkJbGFiZWwgICAgICAJIm51bWVyaWNGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE51bWVyaWNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1OTUwMjA2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDRjAxOTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDg1IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQyMDA4RiIKLQkJCQlsYWJlbCAgICAgIAkibWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJtaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ2MDAyNyIKLQkJCQlsYWJlbCAgICAgIAkibWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAwREUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0NEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDgwM0Q3IgotCQkJCWxhYmVsICAgICAgCSJ0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI4OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI4OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREMwMzY0IgotCQkJCWxhYmVsICAgICAgCSJmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAwNDgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmRlcmVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJbGFiZWwgICAgICAJIm9yZGVyZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5MiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBFMzAwRDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5MyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRTQwMzhFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJib3VuZGVkRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOTgiCi0JCQkJbGFiZWwgICAgICAJImJvdW5kZWRGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NDAxRUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzYwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ1MDM2QSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4RmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5NiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjU0RjAxNDUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5NyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI5OCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNDAxMUMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI5OSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNUM1MDIxNyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQTAwQUEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2MkIwMTQyIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwMiIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMDAzQTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI2QjEwMzExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTg2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwNiIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwNyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4NDEwMDI3IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMwOCIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMwOSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCODk5MDA2MCIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMCIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMSIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDNDMyIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTGVuZ3RoRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMiIKLQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MDAxREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxMyIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMENGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxNCIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxNSIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTBGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNGYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEFGMDExQSIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxNiIKLQkJCXF1aWQgICAgICAgCSIzRDRCQjREMzAyOEUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxNyIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkYzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljUGFydGljbGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNEQ0MDJGRCIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljUGFydGljbGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzE4IgotCQkJcXVpZCAgICAgICAJIjNENEJCNEQ5MDFGNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzE5IgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyODQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0REEwMjhFIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMjAiCi0JCQlxdWlkICAgICAgIAkiM0Q0QzY4RkYwMUJGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMjEiCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXF1aWQgICAgICAgCSIzRDRDNjkwMjAzMTgiCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkpCi0JCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2ODQ3NjgwMTM4IgotCQkJdGl0bGUgICAgICAJIjEuIENvbXBvbmVudCBIaWVyYXJjaHkgKFBhcnQgMTogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IiBANDExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCA4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBANDEyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE2OCwgNTYwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDAsIDUxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDEzCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMjI1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MTEKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDkyOCwgMjI1KQotCQkJCSAgICAoOTI4LCAxMzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDQxNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MCwgMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDQxNQotCQkJCWxvY2F0aW9uICAgCSgxMjAzLCA3MDYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQxMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwMywgNzA2KQotCQkJCSAgICAoMTIwMywgNjE1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjI0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3MiwgNTE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJd2lkdGggICAgICAJNTIyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE3Ci0JCQkJbG9jYXRpb24gICAJKDQ0NCwgNzA5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MTYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ0NCwgNzA5KQotCQkJCSAgICAoNDQ0LCA2MTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDE4Ci0JCQkJbG9jYXRpb24gICAJKDE1NzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDE0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNTcyLCA0NjUpCi0JCQkJICAgICgxNTcyLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0MTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyOTAsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA0MjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMTA1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjYyLCAxMDE1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0MjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM2LCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MjIKLQkJCQlsb2NhdGlvbiAgIAkoNDUzLCAxMjAzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MjAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ1MywgMTIwMykKLQkJCQkgICAgKDQ1MywgMTExMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgODAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzQ2LCA3NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZlYXR1cmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDI1Ci0JCQkJbG9jYXRpb24gICAJKDE4NzIsIDk1MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANDI0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxODcyLCA5NTApCi0JCQkJICAgICgxODcyLCA4NTUpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANDI2Ci0JCQkJbG9jYXRpb24gICAJKDE4MSwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA0MjMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4MSwgNDY1KQotCQkJCSAgICAoMTgxLCAzNzUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA0MjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MzYsIDEyODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzAsIDEyMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDQyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgMTA1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA0MjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjksIDE0NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjU2Ci0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDQzMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTAzLCAxNDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTU4MQotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjIsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA0MzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEwNTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDc3OCwgMTAxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDQzMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTk2OCwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODA2LCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA0MzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTI5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA2LCAxMjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEA0MzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgNTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANDM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxMjgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEyMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA0MzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM2OCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzAsIDE0NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk2OTQKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDQzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDU3NiwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjYsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQW5ub3RhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQl3aWR0aCAgICAgIAkzMTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0MzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDAwLCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlANDIxCi0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTQsIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQxMykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEA0NDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NjAsIDgwMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjkwLCA3NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0NDIKLQkJCQlsb2NhdGlvbiAgIAkoOTYyLCA5NDcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDQ0MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTYyLCA5NDcpCi0JCQkJICAgICg5NjIsIDg1NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0MwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQ0NAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE4LCAxMTU0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMTYzNTM0Ci0JCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCWNsaWVudCAgICAgCUA0MzQKLQkJCQlzdXBwbGllciAgIAlANDE2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDksIDcwOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA0MzQKLQkJCQlzdXBwbGllciAgIAlANDIwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjU2LCAxMjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTYsIDEyMDMpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDIyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlANDM1Ci0JCQkJc3VwcGxpZXIgICAJQDQyMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4NCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MjYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQ3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUA0MzMKLQkJCQlzdXBwbGllciAgIAlANDE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAwMiwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDAyLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ0OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlANDE0Ci0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjksIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OSwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDQxMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDQzMQotCQkJCXN1cHBsaWVyICAgCUA0MTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDkwLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDUwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4RkMwMUU3IgotCQkJCWNsaWVudCAgICAgCUA0MTkKLQkJCQlzdXBwbGllciAgIAlANDE2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTEwLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNzA5KQotCQkJCWRyYXdTdXBwbGllciAJQDQxNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDQzNgotCQkJCXN1cHBsaWVyICAgCUA0NDEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzIxLCAxMjI1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzIxLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDQyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1MgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDQ1MwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNywgODg2KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMjE1ODEyCi0JCQkJICAgIGhlaWdodCAgICAgCTY0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCWNsaWVudCAgICAgCUA0MjgKLQkJCQlzdXBwbGllciAgIAlANDE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIwMCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwMCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQxOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDQyOAotCQkJCXN1cHBsaWVyICAgCUA0MjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDkzLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCA5NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlANDI1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlANDIwCi0JCQkJc3VwcGxpZXIgICAJQDQ0MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ1MCwgMTAwMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUwLCA5NDcpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDQyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlANDIzCi0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDg0RjcwMDkyIgotCQkJCWNsaWVudCAgICAgCUA0MzkKLQkJCQlzdXBwbGllciAgIAlANDExCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxMiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDEyLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDEzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEI4MDI4NiIKLQkJCQljbGllbnQgICAgIAlANDE2Ci0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgzNCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MzQsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDU5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA0MTIKLQkJCQlzdXBwbGllciAgIAlANDExCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MCwgNTA1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzUwLCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDEzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ2MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlANDM4Ci0JCQkJc3VwcGxpZXIgICAJQDQxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3MiwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzIsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDYxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA0MjcKLQkJCQlzdXBwbGllciAgIAlANDI0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MywgMTIyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY5MywgOTUwKQotCQkJCWRyYXdTdXBwbGllciAJQDQyNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NjIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEFBMzAyNDIiCi0JCQkJY2xpZW50ICAgICAJQDQyOQotCQkJCXN1cHBsaWVyICAgCUA0MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTkwLCAxNDMyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTkwLCA3MDYpCi0JCQkJZHJhd1N1cHBsaWVyIAlANDE1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ2MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQljbGllbnQgICAgIAlANDMwCi0JCQkJc3VwcGxpZXIgICAJQDQxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzEsIDE0MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzEsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDY0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUA0NDEKLQkJCQlzdXBwbGllciAgIAlANDEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTU5LCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDQxNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NjUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDQyNAotCQkJCXN1cHBsaWVyICAgCUA0MTIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODcyLCA3NDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzIsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MTUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDY2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA0MzIKLQkJCQlzdXBwbGllciAgIAlANDQxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYyLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NjIsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0NDIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDY3Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDY4Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NSwgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxODcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0MjUzMQotCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCQUEyMDMxMCIKLQkJCQljbGllbnQgICAgIAlANDM3Ci0JCQkJc3VwcGxpZXIgICAJQDQyMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI4LCAxNDI5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDQyNikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0NjkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDQzNwotCQkJCXN1cHBsaWVyICAgCUA0MjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NTYsIDE0MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1NiwgMTIwMykKLQkJCQlkcmF3U3VwcGxpZXIgCUA0MjIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzNzRCMTgxOTAwMjgiCi0JCQl0aXRsZSAgICAgIAkiMi4gQ29tcG9uZW50IFJlbGF0aW9ucyAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAk5NgotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDQ3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc4NCwgMTYzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcwLCAxNTkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY29wZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCQl3aWR0aCAgICAgIAkyNDYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBANDcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDcxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgMTU5MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzYiIEA0NzIKLQkJCQlsb2NhdGlvbiAgIAkoNDk0LCAxNjI3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNjUzMDE3QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NvcGUiIEA0NzMKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzIKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1NSwgMTU4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY29wZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzcxMjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTQwMDZEIgotCQkJCQljbGllbnQgICAgIAlANDcyCi0JCQkJCXN1cHBsaWVyICAgCUA0NzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5NCwgMTYyNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MSwgMTYyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDc1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgMTY2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxMDE4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzciIEA0NzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzIKLQkJCQkJbG9jYXRpb24gICAJKDI4NiwgLTQ4NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkUiCi0JCQkJCWNsaWVudCAgICAgCUA0NzIKLQkJCQkJc3VwcGxpZXIgICAJQDQ3MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzI3LCAxNjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBANDc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTkyLCAxMjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDg0LCAxMTkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzNAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANDc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTEsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY4IiBANDc5Ci0JCQkJbG9jYXRpb24gICAJKDIyMjksIDExMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDODkwMTIyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjkiIEA0ODAKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NzkKLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4QTAxMTAiCi0JCQkJCWNsaWVudCAgICAgCUA0NzkKLQkJCQkJc3VwcGxpZXIgICAJQDQ3OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMjksIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0ZXJtIiBANDgxCi0JCQkJCVBhcmVudF9WaWV3IAlANDc5Ci0JCQkJCWxvY2F0aW9uICAgCSg1NDksIC0yNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTU3LCAxMTIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Rlcm0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEzNDMyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDQ3OQotCQkJCQlzdXBwbGllciAgIAlANDc3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTE3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNzQsIDExMTkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExOTQwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiIEA0ODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzYsIDExOTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANDg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzcsIDcyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTYiIEA0ODYKLQkJCQlsb2NhdGlvbiAgIAkoMjIxOSwgODgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNjA2MDI2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU3IiBANDg3Ci0JCQkJCVBhcmVudF9WaWV3IAlANDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzU3LCAtMjQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzNjA3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDQ4NgotCQkJCQlzdXBwbGllciAgIAlANDg1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE5LCA4ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE5LCA4MjEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXJ0aWNsZXMiIEA0ODgKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODYKLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTA1LCA4ODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGFydGljbGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIyIgotCQkJCQljbGllbnQgICAgIAlANDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA0NzgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDkzOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyODEsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTU2NjI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANDkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzksIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANDkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDcyLCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDUsIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDQ5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDMyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NywgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDIiIEA0OTQKLQkJCQlsb2NhdGlvbiAgIAkoNTkwLCAxMTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAzIiBANDk1Ci0JCQkJCVBhcmVudF9WaWV3IAlANDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDIsIDE0OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJCWNsaWVudCAgICAgCUA0OTQKLQkJCQkJc3VwcGxpZXIgICAJQDQ5MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1OTAsIDExNDApCi0JCQkJCSAgICAoNTQwLCAxMTQwKQotCQkJCQkgICAgKDU0MCwgMTA0NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDAsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZURlZmluaXRpb24iIEA0OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTQKLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAxMTcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMDUzNTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANDk0Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTkwLCAxMTQwKQotCQkJCQkgICAgKDY0MSwgMTE0MCkKLQkJCQkJICAgICg2NDEsIDEwNDUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTkwLCAxMTQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQxLCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg0LCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTIyNDQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDQ5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgOTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDk1MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwNCIgQDUwMAotCQkJCWxvY2F0aW9uICAgCSgxMTE5LCAxMTEyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0RGMDI0RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA1IiBANTAxCi0JCQkJCVBhcmVudF9WaWV3IAlANTAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZEIgotCQkJCQljbGllbnQgICAgIAlANTAwCi0JCQkJCXN1cHBsaWVyICAgCUA0OTkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMDQ1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudFR5cGUiIEA1MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDAKLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTksIDExMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkUiCi0JCQkJCWNsaWVudCAgICAgCUA1MDAKLQkJCQkJc3VwcGxpZXIgICAJQDQ4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDExNzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxMTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEwIiBANTA1Ci0JCQkJbG9jYXRpb24gICAJKDE0NTUsIDk4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQTAxMjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExMSIgQDUwNgotCQkJCQlQYXJlbnRfVmlldyAJQDUwNQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MCIKLQkJCQkJY2xpZW50ICAgICAJQDUwNQotCQkJCQlzdXBwbGllciAgIAlANDk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjgwLCA5ODIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDUwNwotCQkJCQlQYXJlbnRfVmlldyAJQDUwNQotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NSwgOTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYyODU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCQljbGllbnQgICAgIAlANTA1Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzAsIDk4MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTAsIDEwMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0Mjg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDYiIEA1MTAKLQkJCQlsb2NhdGlvbiAgIAkoOTIxLCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDA2RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA3IiBANTExCi0JCQkJCVBhcmVudF9WaWV3IAlANTEwCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0OSIKLQkJCQkJY2xpZW50ICAgICAJQDUxMAotCQkJCQlzdXBwbGllciAgIAlANDk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEwNDUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANTEyCi0JCQkJCVBhcmVudF9WaWV3IAlANTEwCi0JCQkJCWxvY2F0aW9uICAgCSgtODcxLCAtMzc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVVzZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI2OTkzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4Mzk1OTAzNEEiCi0JCQkJCWNsaWVudCAgICAgCUA1MTAKLQkJCQkJc3VwcGxpZXIgICAJQDQ5MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTIxLCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIxLCAxMzcxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc5LCAxMjU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODgzNDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBANTE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgNzY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTE1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTIyLCA3MjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFhQYXRoRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCQl3aWR0aCAgICAgIAkzOTgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDUxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTYzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyMywgMTU5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDUxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgNDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODAzLCA0MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2MCIgQDUxOAotCQkJCWxvY2F0aW9uICAgCSgyMjE2LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUMwMjVBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjEiIEA1MTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTgKLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4IgotCQkJCQljbGllbnQgICAgIAlANTE4Ci0JCQkJCXN1cHBsaWVyICAgCUA1MTcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA1MjAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTgKLQkJCQkJbG9jYXRpb24gICAJKC01NTIsIC04MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA2MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbW9kZWxHcm91cCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyNjA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDUxOAotCQkJCQlzdXBwbGllciAgIAlANDg1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjE2LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjE2LCA3MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU2LCA2MzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzMzY0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEA1MjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4ODgsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTksIDEzODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5MCIgQDUyNAotCQkJCWxvY2F0aW9uICAgCSgxNjc2LCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4N0JGMDE1MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTEiIEA1MjUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjQKLQkJCQkJbG9jYXRpb24gICAJKDQxMiwgLTM0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4ODdDMDAwQTciCi0JCQkJCWNsaWVudCAgICAgCUA1MjQKLQkJCQkJc3VwcGxpZXIgICAJQDUyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY3NiwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzYsIDEzNzEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDUyNgotCQkJCQlQYXJlbnRfVmlldyAJQDUyNAotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NywgMTEwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjI1NzY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBOCIKLQkJCQkJY2xpZW50ICAgICAJQDUyNAotCQkJCQlzdXBwbGllciAgIAlANDkxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTgsIDExMDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYxOTYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NiIgQDUyOQotCQkJCWxvY2F0aW9uICAgCSgxNDI5LCAxNDM4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTlGMDA4NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODciIEA1MzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjkKLQkJCQkJbG9jYXRpb24gICAJKC0zNjMsIC0xNDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDY5IgotCQkJCQljbGllbnQgICAgIAlANTI5Ci0JCQkJCXN1cHBsaWVyICAgCUA1MjMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjEwLCAxNDM4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVXNlcyIgQDUzMQotCQkJCQlQYXJlbnRfVmlldyAJQDUyOQotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDE1MDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTMyNTk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1QTAwMDZBIgotCQkJCQljbGllbnQgICAgIAlANTI5Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjQ4LCAxNDM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyNywgMTM5MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTYzNTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MTYsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MywgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTQiIEA1MzUKLQkJCQlsb2NhdGlvbiAgIAkoNzc3LCAxNDI1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTg1MDEwRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTUiIEA1MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzUKLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZBIgotCQkJCQljbGllbnQgICAgIAlANTM1Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NiwgMTQyNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZURlY2xhcmF0aW9uIiBANTM3Ci0JCQkJCVBhcmVudF9WaWV3IAlANTM1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNTE5LCAtMzY3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzg0LCAxNTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU5MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODYwMEZCIgotCQkJCQljbGllbnQgICAgIAlANTM1Ci0JCQkJCXN1cHBsaWVyICAgCUA1MzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NywgMTQyNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY1OCwgMTQyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMSwgMTM4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyNDQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc4IiBANTQwCi0JCQkJbG9jYXRpb24gICAJKDIzNywgMTIwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2QjAyQ0IiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc5IiBANTQxCi0JCQkJCVBhcmVudF9WaWV3IAlANTQwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE2IgotCQkJCQljbGllbnQgICAgIAlANTQwCi0JCQkJCXN1cHBsaWVyICAgCUA1MzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTM3MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTQyCi0JCQkJCVBhcmVudF9WaWV3IAlANTQwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA0MywgNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzODgsIDEyNDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMzkyNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NkQwMEE3IgotCQkJCQljbGllbnQgICAgIAlANTQwCi0JCQkJCXN1cHBsaWVyICAgCUA0OTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNywgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNywgMTA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NSwgMTI0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDU0NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OCwgNzQ1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDAiIEA1NDYKLQkJCQlsb2NhdGlvbiAgIAkoNzI4LCA3NzUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzMzUwMzQwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDEiIEA1NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDYKLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJCWNsaWVudCAgICAgCUA1NDYKLQkJCQkJc3VwcGxpZXIgICAJQDQ5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3MjgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDkzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4OCwgOTM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANTQ4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTgsIDg4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjE0MDk0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUA1NDYKLQkJCQkJc3VwcGxpZXIgICAJQDU0NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzksIDc3NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MCwgODEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTUyNDM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA1NTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNywgNDA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTYwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MiIgQDU1MgotCQkJCWxvY2F0aW9uICAgCSgxNjI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkS2V5IiBANTUzCi0JCQkJCVBhcmVudF9WaWV3IAlANTUyCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MSwgNjA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRLZXkiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43OTcyOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJCWNsaWVudCAgICAgCUA1NTIKLQkJCQkJc3VwcGxpZXIgICAJQDU1MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjI5LCA1NzQpCi0JCQkJCSAgICAoMTU1NSwgNTc0KQotCQkJCQkgICAgKDE1NTUsIDUwMSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCA1MDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjIyLCA1MzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NzYxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQzIiBANTU2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTUyCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2RiIKLQkJCQkJY2xpZW50ICAgICAJQDU1MgotCQkJCQlzdXBwbGllciAgIAlANTUxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MjksIDU3NCkKLQkJCQkJICAgICgxNjg5LCA1NzQpCi0JCQkJCSAgICAoMTY4OSwgNDQ0KQotCQkJCQkgICAgKDE2MTYsIDQ0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE2LCA0NDQpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NiIgQDU1NwotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEA1NTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTcKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQkJY2xpZW50ICAgICAJQDU1NwotCQkJCQlzdXBwbGllciAgIAlANTUxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA1MDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEA1NTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NTcKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExOSwgNjU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM5MjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5IgotCQkJCQljbGllbnQgICAgIAlANTU3Ci0JCQkJCXN1cHBsaWVyICAgCUA1MTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTMsIDY1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5OTA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0NCIgQDU2MgotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDUiIEA1NjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjIKLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCQljbGllbnQgICAgIAlANTYyCi0JCQkJCXN1cHBsaWVyICAgCUA1NTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBANTY0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTYyCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMywgNjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTEyMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTk4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJCWNsaWVudCAgICAgCUA1NjIKLQkJCQkJc3VwcGxpZXIgICAJQDUxNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNzE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTY0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgNjUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTI1MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANTY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk1OTkKLQkJCQloZWlnaHQgICAgIAkyMDkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODgiIEA1NjgKLQkJCQlsb2NhdGlvbiAgIAkoMjM5NSwgNjA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUE3MDIzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg5IiBANTY5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTY4Ci0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCQljbGllbnQgICAgIAlANTY4Ci0JCQkJCXN1cHBsaWVyICAgCUA1NjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM5NSwgNjA2KQotCQkJCQkgICAgKDIzOTUsIDY1KQotCQkJCQkgICAgKDE2MTEsIDY1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibm90YXRpb25EZWNsYXJhdGlvbnMiIEA1NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NjgKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODksIDEwNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4OTc3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEIiCi0JCQkJCWNsaWVudCAgICAgCUA1NjgKLQkJCQkJc3VwcGxpZXIgICAJQDUxNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzk1LCA2MDYpCi0JCQkJCSAgICAoMjM5NSwgMTYzMykKLQkJCQkJICAgICgyMDk4LCAxNjMzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTgsIDE2MzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzQ0LCAxMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODc4MjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg0IiBANTczCi0JCQkJbG9jYXRpb24gICAJKDE3NzIsIDI0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVGRjAyNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NSIgQDU3NAotCQkJCQlQYXJlbnRfVmlldyAJQDU3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJCWNsaWVudCAgICAgCUA1NzMKLQkJCQkJc3VwcGxpZXIgICAJQDU2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMjQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cERlZmluaXRpb25zIiBANTc1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTczCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NiwgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXBEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzNTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQkJY2xpZW50ICAgICAJQDU3MwotCQkJCQlzdXBwbGllciAgIAlANTE3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3NzIsIDI0OSkKLQkJCQkJICAgICgxODMyLCAyNDkpCi0JCQkJCSAgICAoMTgzMiwgMzk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MzIsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDM0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM3ODY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE4MCIgQDU3OAotCQkJCWxvY2F0aW9uICAgCSgyMzQ2LCA1MTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODEiIEA1NzkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NzgKLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcyLCAxODU3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy42MzAwNzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThCIgotCQkJCQljbGllbnQgICAgIAlANTc4Ci0JCQkJCXN1cHBsaWVyICAgCUA1NjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0NiwgNTE4KQotCQkJCQkgICAgKDIzNDYsIDE0OSkKLQkJCQkJICAgICgxNjExLCAxNDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMTQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIgQDU4MQotCQkJCQlQYXJlbnRfVmlldyAJQDU3OAotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDgsIDE5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ5OTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQkJY2xpZW50ICAgICAJQDU3OAotCQkJCQlzdXBwbGllciAgIAlANTIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNDYsIDUxOCkKLQkJCQkJICAgICgyMzQ2LCAxNDQxKQotCQkJCQkgICAgKDIxNjYsIDE0NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2NiwgMTQ0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOTksIDE5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0ODg2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODIiIEA1ODQKLQkJCQlsb2NhdGlvbiAgIAkoMjAzLCAxNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMDQ5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODMiIEA1ODUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1ODQKLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCQljbGllbnQgICAgIAlANTg0Ci0JCQkJCXN1cHBsaWVyICAgCUA1NjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb25zIiBANTg2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1ODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ5LCAxOTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDc1NzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzdFIgotCQkJCQljbGllbnQgICAgIAlANTg0Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjAzLCAxNTkpCi0JCQkJCSAgICAoMTA0LCAxNTkpCi0JCQkJCSAgICAoMTA0LCA3ODQpCi0JCQkJCSAgICAoMTg5LCA3ODQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODksIDc4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NSwgMjAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk3MDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg2IiBANTg5Ci0JCQkJbG9jYXRpb24gICAJKDEwODcsIDMyOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExNzAxRUQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4NyIgQDU5MAotCQkJCQlQYXJlbnRfVmlldyAJQDU4OQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQkJY2xpZW50ICAgICAJQDU4OQotCQkJCQlzdXBwbGllciAgIAlANTY3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAyNjQpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU5MQotCQkJCQlQYXJlbnRfVmlldyAJQDU4OQotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3NSwgMzM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA5NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjdEIgotCQkJCQljbGllbnQgICAgIAlANTg5Ci0JCQkJCXN1cHBsaWVyICAgCUA1NTEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTgsIDMzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTA3MTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3OCIgQDU5NAotCQkJCWxvY2F0aW9uICAgCSg0OCwgMzIwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc5IiBANTk1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJCWNsaWVudCAgICAgCUA1OTQKLQkJCQkJc3VwcGxpZXIgICAJQDU2NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OSwgMzIyKQotCQkJCQkgICAgKDQ5LCA2OCkKLQkJCQkJICAgICgxMDEzLCA2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgNjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiIEA1OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA1OTQKLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTk2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM4LCAxMDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk4NTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQkJY2xpZW50ICAgICAJQDU5NAotCQkJCQlzdXBwbGllciAgIAlANTM0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5LCAzMjIpCi0JCQkJCSAgICAoNDksIDE0MTUpCi0JCQkJCSAgICAoMTc0LCAxNDE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDE0MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MSwgMTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk2NzA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDU5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NSwgNDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNTAxCi0JCQkJaGVpZ2h0ICAgICAJOTcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjgiIEA2MDAKLQkJCQlsb2NhdGlvbiAgIAkoNDk5LCA1ODkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNTkwMTk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjkiIEA2MDEKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MDAKLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFMyIKLQkJCQkJY2xpZW50ICAgICAJQDYwMAotCQkJCQlzdXBwbGllciAgIAlANTk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5OSwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUyLCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIiBANjAyCi0JCQkJCVBhcmVudF9WaWV3IAlANjAwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDgxMSwgNTg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAk2LjUyMDgzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUVEIgotCQkJCQljbGllbnQgICAgIAlANjAwCi0JCQkJCXN1cHBsaWVyICAgCUA1OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDk5LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDcsIDQ5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5OSwgNTU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIyIiBANjA1Ci0JCQkJbG9jYXRpb24gICAJKDI0MSwgNjEzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDA1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIzIiBANjA2Ci0JCQkJCVBhcmVudF9WaWV3IAlANjA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQkYiCi0JCQkJCWNsaWVudCAgICAgCUA2MDUKLQkJCQkJc3VwcGxpZXIgICAJQDU5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANjA3Ci0JCQkJCVBhcmVudF9WaWV3IAlANjA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwOCwgNjk0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODY0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0MwIgotCQkJCQljbGllbnQgICAgIAlANjA1Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA3MzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDY4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjEwMTY5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNCIgQDYxMAotCQkJCWxvY2F0aW9uICAgCSg4MzcsIDQ2MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNSIgQDYxMQotCQkJCQlQYXJlbnRfVmlldyAJQDYxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJCWNsaWVudCAgICAgCUA2MTAKLQkJCQkJc3VwcGxpZXIgICAJQDU5OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDQ2MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANjEyCi0JCQkJCVBhcmVudF9WaWV3IAlANjEwCi0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1MTQ2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQkJY2xpZW50ICAgICAJQDYxMAotCQkJCQlzdXBwbGllciAgIAlANTUxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQ2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgNDA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA0MzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc2IiBANjE1Ci0JCQkJbG9jYXRpb24gICAJKDU0MSwgMjQ2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRThEMDFCRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTc3IiBANjE2Ci0JCQkJCVBhcmVudF9WaWV3IAlANjE1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTgiCi0JCQkJCWNsaWVudCAgICAgCUA2MTUKLQkJCQkJc3VwcGxpZXIgICAJQDU2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAyNDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb25zIiBANjE3Ci0JCQkJCVBhcmVudF9WaWV3IAlANjE1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MywgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwOTMwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OSIKLQkJCQkJY2xpZW50ICAgICAJQDYxNQotCQkJCQlzdXBwbGllciAgIAlANTk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDU0MSwgMjQ2KQotCQkJCQkgICAgKDIyNCwgMjQ2KQotCQkJCQkgICAgKDIyNCwgNDAwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI0LCA0MDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODYsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMCIgQDYyMAotCQkJCWxvY2F0aW9uICAgCSgzNTMsIDYyMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQyREJERDAyOTciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMSIgQDYyMQotCQkJCQlQYXJlbnRfVmlldyAJQDYyMAotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTFFIgotCQkJCQljbGllbnQgICAgIAlANjIwCi0JCQkJCXN1cHBsaWVyICAgCUA1OTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzUzLCA2MjEpCi0JCQkJCSAgICAoMzA2LCA2MjEpCi0JCQkJCSAgICAoMzA2LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDYsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwIiBANjIyCi0JCQkJCVBhcmVudF9WaWV3IAlANjIwCi0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3OSwgNjM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJNC44MDg1MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJCWNsaWVudCAgICAgCUA2MjAKLQkJCQkJc3VwcGxpZXIgICAJQDU5OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNTMsIDYyMSkKLQkJCQkJICAgICg0MDAsIDYyMSkKLQkJCQkJICAgICg0MDAsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNDk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUwLCA1ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjk3NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2OUU3ODYwMkM1IgotCQkJdGl0bGUgICAgICAJIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA2MjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDEyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDExNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHRhcmdldE5hbWVzcGFjZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTUzNAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDYyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTY3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANjI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMTY4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTUyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTU4NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTM5Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGRlcml2YXRpb25NZXRob2QgOiBYU0REZXJpdmF0aW9uTWV0aG9kID0gcmVzdHJpY3Rpb24iCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEQ29tcGxleEZpbmFsIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iCi0JCQkJCSIrIGNvbnRlbnRUeXBlQ2F0ZWdvcnkgOiBYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCQkiPDwwLi4qPj4gKyBwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJMTE5MgotCQkJCWhlaWdodCAgICAgCTMzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MjgKLQkJCQlsb2NhdGlvbiAgIAkoNDYzLCAzNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYyNQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDYzLCAzNjIpCi0JCQkJICAgICg0NjMsIDIyMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDYyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTc5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSIKLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTY0NgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA2MzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDE0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDk4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyByZXF1aXJlZCA6IGJvb2xlYW4iCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANjMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg5MCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkxMjYwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSA6IFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQkJIjw8MC4uKj4+ICsgbmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIKLQkJCQkJIisgcHJvY2Vzc0NvbnRlbnRzIDogWFNEUHJvY2Vzc0NvbnRlbnRzIikpCi0JCQkJd2lkdGggICAgICAJMTMwNAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANjMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTQ0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDEzODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJNTk2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA2MzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDUxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQ5OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA2Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYzNAotCQkJCWxvY2F0aW9uICAgCSgyOTQsIDY5NykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyOTQsIDY5NykKLQkJCQkgICAgKDI5NCwgNjA1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDYzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjU2LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTUsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANjM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgNTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDE4LCA0NjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MzcKLQkJCQlsb2NhdGlvbiAgIAkoMjY4NCwgOTYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA2MzYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI2ODQsIDk2MikKLQkJCQkgICAgKDI2ODQsIDU3NikpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb3NpdG9yIiBANjM4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDExMTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvc2l0b3IiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTA2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUI2MjAwMzciCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbnQiIEA2MzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlFMjYwMUFFIgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REZXJpdmF0aW9uTWV0aG9kIiBANjQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIyMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODZBMEIwMDBDRSIKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiIEA2NDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCA4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTFFMDAyNzIiCi0JCQkJd2lkdGggICAgICAJNjI1Ci0JCQkJaGVpZ2h0ICAgICAJMzAwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiIEA2NDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjExNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIwNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NkE3OUYwM0EyIgotCQkJCXdpZHRoICAgICAgCTUxNAotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANjQzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTYwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNTE2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvY2Vzc0NvbnRlbnRzIiBANjQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMjI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxMDYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY4QzcwMjg0IgotCQkJCXdpZHRoICAgICAgCTQzOAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aFZhcmlldHkiIEA2NDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkZCODkwMzNBIgotCQkJCXdpZHRoICAgICAgCTM4MQotCQkJCWhlaWdodCAgICAgCTI1MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDY0NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDE4NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3ODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTczOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE4NDgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMTk5Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxpc3QiCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyB1bmlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA2NDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxOTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxODkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMjAwMSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMDIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM4MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiIEA2NDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTA3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzU5MTAwQUUiCi0JCQkJd2lkdGggICAgICAJNjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBANjQ5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTExNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTE3NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMzYKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgc3Vic3RpdHV0aW9uIgotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBANjUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMjI3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjIxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjI3MykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMDIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiIEA2NTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAyMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjE1NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxMDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1RUEwMDIzIgotCQkJCXdpZHRoICAgICAgCTY5NgotCQkJCWhlaWdodCAgICAgCTI5NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA2NTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCA4ODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgNzQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDgwOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkxMzU3Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5pbGxhYmxlIDogYm9vbGVhbiIKLQkJCQkJIjw8MC4uKj4+ICsgZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIjw8MC4uKj4+ICsgc3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIDogWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAkxNDA0Ci0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUA2NTIKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjgxLCA3MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDYzNCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA2NTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDgxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDY1NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjAsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDY1NQotCQkJCXN1cHBsaWVyICAgCUA2MzYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODYyLCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODYyLCA5NjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjM3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDY1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEzMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjgsIDEyNjMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NTgKLQkJCQlsb2NhdGlvbiAgIAkoMjM3NSwgMTQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjU3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMzc1LCAxNDY1KQotCQkJCSAgICAoMjM3NSwgMTM3NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlANjU3Ci0JCQkJc3VwcGxpZXIgICAJQDYzNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNjgsIDEyNDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNjgsIDk2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA2MjcKLQkJCQlzdXBwbGllciAgIAlANjU3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgxOCwgMTUxMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxOCwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA2MjkKLQkJCQlzdXBwbGllciAgIAlANjU3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwNiwgMTUwNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNiwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANjYyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOCwgMTEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjYzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA2NjIKLQkJCQlzdXBwbGllciAgIAlANjM2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExNSwgMTA4OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgOTYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYzNykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDY2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDQ2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJMTE1MAotCQkJCWhlaWdodCAgICAgCTE0NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQljbGllbnQgICAgIAlANjY0Ci0JCQkJc3VwcGxpZXIgICAJQDYyNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjgsIDQ1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OCwgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYyOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDY2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzgsIDcwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk1MDIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANjY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAyNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiCi0JCQkJY2xpZW50ICAgICAJQDY2NgotCQkJCXN1cHBsaWVyICAgCUA2MjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjkwLCA2OTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTAsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MjgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA2NTQKLQkJCQlzdXBwbGllciAgIAlANjMzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxLCA4MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDYzNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDYzMwotCQkJCXN1cHBsaWVyICAgCUA2MjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzIsIDQxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzcyLCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQljbGllbnQgICAgIAlANjM2Ci0JCQkJc3VwcGxpZXIgICAJQDYyNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2ODcsIDQ0OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4NywgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYyOCkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIgotCQkJcXVpZCAgICAgICAJIjNCNkMzMjY1MDA1RiIKLQkJCXRpdGxlICAgICAgCSI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IiBANjcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgODk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgODQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGaXhlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIgotCQkJCXdpZHRoICAgICAgCTMzOAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA2NzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA4OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNCwgODQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJd2lkdGggICAgICAJNDUwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEA2NzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjYsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDY3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzcsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjc2Ci0JCQkJbG9jYXRpb24gICAJKDcxOCwgMTA0OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjczCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3MTgsIDEwNDkpCi0JCQkJICAgICg3MTgsIDk1OSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEA2NzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgOTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzk5LCA4NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBANjc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MywgODcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJd2lkdGggICAgICAJMzg4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEA2NzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAzMiwgMTEwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMTA0OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBANjgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTksIDEwNDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCQl3aWR0aCAgICAgIAkzODgKLQkJCQloZWlnaHQgICAgIAkxMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEA2ODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM0OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDY4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwNSwgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY4MwotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDEyNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ0LCAxMjYyKQotCQkJCSAgICAoMTQ0LCA5NjQpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEA2ODQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMTU1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDY4NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEA2ODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBANjg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE5MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDE4NTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDY4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MiwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJd2lkdGggICAgICAJNDQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBANjg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTkwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0LCAxODUyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDY5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyLCAyMDU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBANjkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTgsIDIwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOUQwM0M3IgotCQkJCWNsaWVudCAgICAgCUA2NzQKLQkJCQlzdXBwbGllciAgIAlANjczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzk0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTQsIDEwNDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjc2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY5MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODYyMDA0NSIKLQkJCQljbGllbnQgICAgIAlANjg1Ci0JCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjgzKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA2OTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAxMTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkNBNTAzOEQiCi0JCQkJY2xpZW50ICAgICAJQDY3NQotCQkJCXN1cHBsaWVyICAgCUA2NzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMDQ5KQotCQkJCWRyYXdTdXBwbGllciAJQDY3NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4MDAyREYiCi0JCQkJY2xpZW50ICAgICAJQDY4MQotCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjMsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWQiIEA2OTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTMyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEyNzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNTIwMkU0IgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eSIgQDY5OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNUQwMDlCIgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlIiBANjk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCRUVEMEY2MDM0MiIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkyODcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6VmFsdWUiIEA3MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAyMDk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzAwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwNjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlZhbHVlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQzA0MEI1QjAzMUYiCi0JCQkJd2lkdGggICAgICAJNjM2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzAxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNjEwMzM3IgotCQkJCWNsaWVudCAgICAgCUA2OTAKLQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDIwNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4MykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEA3MDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDEzNzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTMyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEA3MDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxMzc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzIyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTM4OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjU4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MDQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQyNDAwOTgiCi0JCQkJY2xpZW50ICAgICAJQDcwMgotCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzUsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzA1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMzEwM0FEIgotCQkJCWNsaWVudCAgICAgCUA3MDMKLQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgMTMwOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2ODMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzA2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTIwMzUzIgotCQkJCWNsaWVudCAgICAgCUA2ODgKLQkJCQlzdXBwbGllciAgIAlANzAyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg1LCAxNjY0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODUsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjgzMDNCOCIKLQkJCQljbGllbnQgICAgIAlANjg2Ci0JCQkJc3VwcGxpZXIgICAJQDcwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDAsIDE2NjQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDAsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjhFMDMwOSIKLQkJCQljbGllbnQgICAgIAlANjg3Ci0JCQkJc3VwcGxpZXIgICAJQDcwMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjIsIDE4NDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjIsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcwOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M0MDBDMCIKLQkJCQljbGllbnQgICAgIAlANjgyCi0JCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTQ4NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I3RDAwRkMiCi0JCQkJY2xpZW50ICAgICAJQDY4NAotCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I5OTAwMTYiCi0JCQkJY2xpZW50ICAgICAJQDY5MQotCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc1LCAyMDQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDY4MykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA3MTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDM2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTQwNgotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA3MTMKLQkJCQlsb2NhdGlvbiAgIAkoMzY2LCA1MjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzY2LCA1MjIpCi0JCQkJICAgICgzNjYsIDQzMCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDcxNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQsIDU3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcxNQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDc4MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANzE0Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyNzIsIDc4MSkKLQkJCQkgICAgKDI3MiwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzE2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCWNsaWVudCAgICAgCUA2NzMKLQkJCQlzdXBwbGllciAgIAlANzE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTk0LCA4MzMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5NCwgNzgxKQotCQkJCWRyYXdTdXBwbGllciAJQDcxNSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIgQDcxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZ1bmRhbWVudGFsRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiCi0JCQkJd2lkdGggICAgICAJNDcwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDcxOAotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDc4OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANzE3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3NjgsIDc4OSkKLQkJCQkgICAgKDc2OCwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzE5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NTkwMTJDIgotCQkJCWNsaWVudCAgICAgCUA2NzcKLQkJCQlzdXBwbGllciAgIAlANzE3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA1MCwgODYwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzE4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjNDMDIyNCIKLQkJCQljbGllbnQgICAgIAlANjc4Ci0JCQkJc3VwcGxpZXIgICAJQDcxNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjUsIDg2MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyNSwgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDcxOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0RjAxMzEiCi0JCQkJY2xpZW50ICAgICAJQDY3OQotCQkJCXN1cHBsaWVyICAgCUA3MTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjM3LCAxMDM2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM3LCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANzE4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjQyMDA3NCIKLQkJCQljbGllbnQgICAgIAlANjgwCi0JCQkJc3VwcGxpZXIgICAJQDcxNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDEwMzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NiwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDEwNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1OTgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk2NTYKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTM0IiBANzI0Ci0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTc4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1OTcxMDJFQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM1IiBANzI1Ci0JCQkJCVBhcmVudF9WaWV3IAlANzI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzI1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA5LCAyMzUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQkJY2xpZW50ICAgICAJQDcyNAotCQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3NSwgMTc4KQotCQkJCQkgICAgKDU1MCwgMTc4KQotCQkJCQkgICAgKDU1MCwgMzA2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCAzMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDcyNwotCQkJCQlQYXJlbnRfVmlldyAJQDcyNAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODMxMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJCWNsaWVudCAgICAgCUA3MjQKLQkJCQkJc3VwcGxpZXIgICAJQDcyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAxNzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYxLCAyMTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjUwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTYiIEA3MzAKLQkJCQlsb2NhdGlvbiAgIAkoMzY5LCA3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwMjAzQTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0cyIgQDczMQotCQkJCQlQYXJlbnRfVmlldyAJQDczMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQ5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA2NSIKLQkJCQkJY2xpZW50ICAgICAJQDczMAotCQkJCQlzdXBwbGllciAgIAlANzE0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDM2OSwgNzIpCi0JCQkJCSAgICAoMTAwLCA3MikKLQkJCQkJICAgICgxMDAsIDU2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwLCA1NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc5MDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NyIgQDczNAotCQkJCQlQYXJlbnRfVmlldyAJQDczMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDMxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNTEiCi0JCQkJCWNsaWVudCAgICAgCUA3MzAKLQkJCQkJc3VwcGxpZXIgICAJQDcyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzgiIEA3MzYKLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgNTA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczNwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOCwgNDQ5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTYwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM5IiBANzM4Ci0JCQkJCVBhcmVudF9WaWV3IAlANzM2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDczOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ2LCAzNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERiIKLQkJCQkJY2xpZW50ICAgICAJQDczNgotCQkJCQlzdXBwbGllciAgIAlANzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNDg3LCA1MDgpCi0JCQkJCSAgICAoMTQ4NywgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIml0ZW1UeXBlRGVmaW5pdGlvbiIgQDc0MAotCQkJCQlQYXJlbnRfVmlldyAJQDczNgotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2l0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjIxMTUzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBFMCIKLQkJCQkJY2xpZW50ICAgICAJQDczNgotCQkJCQlzdXBwbGllciAgIAlANzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNTkwLCA1MDgpCi0JCQkJCSAgICAoMTU5MCwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDQ2OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAzOTg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5OCIgQDc0MwotCQkJCWxvY2F0aW9uICAgCSgxNzI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QjcwMjA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTkiIEA3NDQKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDMKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDM1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU4IgotCQkJCQljbGllbnQgICAgIAlANzQzCi0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE2NzgsIDU3NCkKLQkJCQkJICAgICgxNjc4LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OCwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWVtYmVyVHlwZURlZmluaXRpb25zIiBANzQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzQzCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA2NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWVtYmVyVHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMjY5MjMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCQljbGllbnQgICAgIAlANzQzCi0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE3ODEsIDU3NCkKLQkJCQkJICAgICgxNzgxLCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMCwgNTIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMTIxMjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjAwIiBANzQ5Ci0JCQkJbG9jYXRpb24gICAJKDc0OCwgMjY5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNjMyMDFEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnVuZGFtZW50YWxGYWNldHMiIEA3NTAKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDkKLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgMzEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Z1bmRhbWVudGFsRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDA5MDkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCQljbGllbnQgICAgIAlANzQ5Ci0JCQkJCXN1cHBsaWVyICAgCUA3MTcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzQ4LCAyNjkpCi0JCQkJCSAgICAoNjU5LCAyNjkpCi0JCQkJCSAgICAoNjU5LCA1NjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTksIDU2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyOCwgMzg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzgwMjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwMSIgQDc1MwotCQkJCQlQYXJlbnRfVmlldyAJQDc0OQotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1MiwgMjI4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNTkiCi0JCQkJCWNsaWVudCAgICAgCUA3NDkKLQkJCQkJc3VwcGxpZXIgICAJQDcyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAyNjkpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwMiIgQDc1NQotCQkJCWxvY2F0aW9uICAgCSgxMTc1LCAzOTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDMiIEA3NTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTUKLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDMxNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCQljbGllbnQgICAgIAlANzU1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDExMzUsIDM5NikKLQkJCQkJICAgICgxMTM1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANzU4Ci0JCQkJCVBhcmVudF9WaWV3IAlANzU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA0NDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuNTMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANzU1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDEyMTUsIDM5NikKLQkJCQkJICAgICgxMjE1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxNSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzU4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgMzU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk2MTU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNCIgQDc2MQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0NDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDUiIEA3NjIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjEKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNjgsIDMyNykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjJGIgotCQkJCQljbGllbnQgICAgIAlANzYxCi0JCQkJCXN1cHBsaWVyICAgCUA3MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQotCQkJCQkgICAgKDEzMDksIDQ0NikKLQkJCQkJICAgICgxMzA5LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwOSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iIEA3NjQKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NjEKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDQsIDUwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQkJY2xpZW50ICAgICAJQDc2MQotCQkJCQlzdXBwbGllciAgIAlANzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNjAsIDQ0NikKLQkJCQkJICAgICgxNDEyLCA0NDYpCi0JCQkJCSAgICAoMTQxMiwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTIsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzMsIDQwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYyMTQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANzY3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgNTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgMzc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDg4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIwMgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBsaXN0IgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgdW5pb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDc2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDkyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc2OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzdCMDM5NiIKLQkJCQljbGllbnQgICAgIAlANzE3Ci0JCQkJc3VwcGxpZXIgICAJQDcxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MSwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTEsIDUyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzcwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCWNsaWVudCAgICAgCUA3MTQKLQkJCQlzdXBwbGllciAgIAlANzEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA1NjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgNTIyKQotCQkJCWRyYXdTdXBwbGllciAJQDcxMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJY2xpZW50ICAgICAJQDcxMgotCQkJCXN1cHBsaWVyICAgCUA2OTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjYsIDMwNikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY2LCAyMTUpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc3MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2Qzg4MDFCNCIKLQkJCQljbGllbnQgICAgIAlANjcyCi0JCQkJc3VwcGxpZXIgICAJQDcxNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDc4MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MTUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzczCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTkwMjgxIgotCQkJCWNsaWVudCAgICAgCUA2ODkKLQkJCQlzdXBwbGllciAgIAlANzAyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwLCAxODQwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAsIDE0NDQpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCNjlENjhEMDBEMiIKLQkJCXRpdGxlICAgICAgCSI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANzc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJd2lkdGggICAgICAJMzU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANzc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MiwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgMTUwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNiwgMTQ2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMzA0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjYzLCAyNjMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANzc4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTMxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANzc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA3MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA2NjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA3ODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA3ODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDU0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDUwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDc4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzgyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDY4LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANzgzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTE3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDc4NAotCQkJCWxvY2F0aW9uICAgCSgxOTk0LCAxNDEyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA3ODMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5OTQsIDE0MTIpCi0JCQkJICAgICgxOTk0LCAxMjcxKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzg1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA3NzYKLQkJCQlzdXBwbGllciAgIAlANzgzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA4NCwgMTQ0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA4NCwgMTQxMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3ODQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDc4NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzg2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MCwgODIxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDAyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTIsIDM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQl3aWR0aCAgICAgIAkyMzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANzg4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDg0LCAzNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDc4OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzg5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgMTgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA3OTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDY3LCAxNjc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNjY5Ci0JCQkJaGVpZ2h0ICAgICAJMTAwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3OTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDc5MAotCQkJCXN1cHBsaWVyICAgCUA3ODMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTcyLCAxNjYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcyLCAxNDEyKQotCQkJCWRyYXdTdXBwbGllciAJQDc4NCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDc5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgsIDk4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA3OTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODgsIDUxOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDc5NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA3OTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MiwgNjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTczOAotCQkJCWhlaWdodCAgICAgCTU0MwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0MCIgQDc5NgotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDEiIEA3OTcKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTYKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzM0MiCi0JCQkJCWNsaWVudCAgICAgCUA3OTYKLQkJCQkJc3VwcGxpZXIgICAJQDc3OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjcxLCAxMzU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5OAotCQkJCQlQYXJlbnRfVmlldyAJQDc5NgotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk4LCAxMzIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS4xMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJCWNsaWVudCAgICAgCUA3OTYKLQkJCQkJc3VwcGxpZXIgICAJQDc5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4NjUsIDEzNTkpCi0JCQkJCSAgICAoOTI1LCAxMzU5KQotCQkJCQkgICAgKDkyNSwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEyNzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjQyMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjQiIEA4MDEKLQkJCQlsb2NhdGlvbiAgIAkoNzEzLCA3MDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEYwMjEyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjUiIEA4MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDEKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwQzkiCi0JCQkJCWNsaWVudCAgICAgCUA4MDEKLQkJCQkJc3VwcGxpZXIgICAJQDc3OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDcwOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDEKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNjY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTIzOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQkJY2xpZW50ICAgICAJQDgwMQotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgNzA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk2LCA3NTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MzU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTgiIEA4MDYKLQkJCQlsb2NhdGlvbiAgIAkoNzE5LCAxMTkzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE1MDA4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTU5IiBAODA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODA2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMDk2IgotCQkJCQljbGllbnQgICAgIAlAODA2Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTE5MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDYKLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMTE0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDY5OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwQTAiCi0JCQkJCWNsaWVudCAgICAgCUA4MDYKLQkJCQkJc3VwcGxpZXIgICAJQDc5NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMTkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCAxMjQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDQxNjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE4IiBAODExCi0JCQkJbG9jYXRpb24gICAJKDc4NSwgNTUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE5IiBAODEyCi0JCQkJCVBhcmVudF9WaWV3IAlAODExCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDIzRiIKLQkJCQkJY2xpZW50ICAgICAJQDgxMQotCQkJCQlzdXBwbGllciAgIAlANzgxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNTUwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDgxMwotCQkJCQlQYXJlbnRfVmlldyAJQDgxMQotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OSwgNTE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzA3MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJCWNsaWVudCAgICAgCUA4MTEKLQkJCQkJc3VwcGxpZXIgICAJQDc5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODUsIDU1MCkKLQkJCQkJICAgICg4ODQsIDU1MCkKLQkJCQkJICAgICg4ODQsIDY3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyOTczMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTAiIEA4MTYKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgNDA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkxIiBAODE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTY1IgotCQkJCQljbGllbnQgICAgIAlAODE2Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDEzNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODE4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI0LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC42NjU0MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCQljbGllbnQgICAgIAlAODE2Ci0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg0Mzg3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNiIgQDgyMQotCQkJCWxvY2F0aW9uICAgCSgxNzUyLCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMjkxMDE1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA3IiBAODIyCi0JCQkJCVBhcmVudF9WaWV3IAlAODIxCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxOUYiCi0JCQkJCWNsaWVudCAgICAgCUA4MjEKLQkJCQkJc3VwcGxpZXIgICAJQDc4MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzUyLCAxMDM0KQotCQkJCQkgICAgKDE4MTIsIDEwMzQpCi0JCQkJCSAgICAoMTgxMiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjEKLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODIzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0MywgOTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTYwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDFBOSIKLQkJCQkJY2xpZW50ICAgICAJQDgyMQotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgMTAzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODQsIDEwNjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MDMzMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDgiIEA4MjYKLQkJCQlsb2NhdGlvbiAgIAkoMTg5NiwgODgxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOTAwNkNGMDA4OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA5IiBAODI3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODI2Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQkJY2xpZW50ICAgICAJQDgyNgotCQkJCQlzdXBwbGllciAgIAlANzgzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE4OTYsIDg4MSkKLQkJCQkJICAgICgxOTU2LCA4ODEpCi0JCQkJCSAgICAoMTk1NiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTU2LCAxMTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGVyaXZhdGlvbkFubm90YXRpb24iIEA4MjgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjYKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCA4NDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1NDIzNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQkJY2xpZW50ICAgICAJQDgyNgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA4ODEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg5LCA5MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNTA4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTAiIEA4MzEKLQkJCQlsb2NhdGlvbiAgIAkoMjA0MCwgNzE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjMzMDI2NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjExIiBAODMyCi0JCQkJCVBhcmVudF9WaWV3IAlAODMxCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyODQiCi0JCQkJCWNsaWVudCAgICAgCUA4MzEKLQkJCQkJc3VwcGxpZXIgICAJQDc4MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMDQwLCA3MTUpCi0JCQkJCSAgICAoMjEwMCwgNzE1KQotCQkJCQkgICAgKDIxMDAsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMCwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODMzCi0JCQkJCVBhcmVudF9WaWV3IAlAODMxCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDY4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjhFIgotCQkJCQljbGllbnQgICAgIAlAODMxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDc0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA5MzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyOCIgQDgzNgotCQkJCWxvY2F0aW9uICAgCSg2NjgsIDg2NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNDAwNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyOSIgQDgzNwotCQkJCQlQYXJlbnRfVmlldyAJQDgzNgotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMENBIgotCQkJCQljbGllbnQgICAgIAlAODM2Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDczLCA4NjUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODM4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODM2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgODI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzNDE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBENCIKLQkJCQkJY2xpZW50ICAgICAJQDgzNgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgODY1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAxLCA5MDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4MjA1MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzIiIEA4NDEKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgMTY3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTMzIiBAODQyCi0JCQkJCVBhcmVudF9WaWV3IAlAODQxCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUM0IgotCQkJCQljbGllbnQgICAgIAlAODQxCi0JCQkJCXN1cHBsaWVyICAgCUA3ODcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ3MiwgMTY3KQotCQkJCQkgICAgKDE0NzIsIDcyKQotCQkJCQkgICAgKDE4ODMsIDcyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODMsIDcyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg0MwotCQkJCQlQYXJlbnRfVmlldyAJQDg0MQotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzYzMDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUNFIgotCQkJCQljbGllbnQgICAgIAlAODQxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTksIDYxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkzNTc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgyIiBAODQ2Ci0JCQkJbG9jYXRpb24gICAJKDkyNywgMzUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjA2MDI5MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODMiIEA4NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDYKLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcxIgotCQkJCQljbGllbnQgICAgIAlAODQ2Ci0JCQkJCXN1cHBsaWVyICAgCUA3ODgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCAzNTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODQ4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODQ2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODQ4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAzMTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjgxNjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MiIKLQkJCQkJY2xpZW50ICAgICAJQDg0NgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkyNywgMzUwKQotCQkJCQkgICAgKDk4NywgMzUwKQotCQkJCQkgICAgKDk4NywgNjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg3LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM3LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MzM0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3NCIgQDg1MQotCQkJCWxvY2F0aW9uICAgCSgxMDI3LCAyMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREMwMkY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3NSIgQDg1MgotCQkJCQlQYXJlbnRfVmlldyAJQDg1MQotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDIzOCIKLQkJCQkJY2xpZW50ICAgICAJQDg1MQotCQkJCQlzdXBwbGllciAgIAlANzg5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDIyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTEKLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDA2MjUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjQyIgotCQkJCQljbGllbnQgICAgIAlAODUxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTAyNywgMjIyKQotCQkJCQkgICAgKDEwODcsIDIyMikKLQkJCQkJICAgICgxMDg3LCA2NzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNjEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTAwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgyNTgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk4IiBAODU2Ci0JCQkJbG9jYXRpb24gICAJKDE0OTQsIDE0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2ODgwMUMyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5OSIgQDg1NwotCQkJCQlQYXJlbnRfVmlldyAJQDg1NgotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTExIgotCQkJCQljbGllbnQgICAgIAlAODU2Ci0JCQkJCXN1cHBsaWVyICAgCUA3OTAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxNjYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudEFubm90YXRpb24iIEA4NTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTYKLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODU4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NiwgMTM1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50QW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3NzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExQiIKLQkJCQkJY2xpZW50ICAgICAJQDg1NgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDMsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzAwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTIiIEA4NjEKLQkJCQlsb2NhdGlvbiAgIAkoNjM3LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE3MDJDOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUzIiBAODYyCi0JCQkJCVBhcmVudF9WaWV3IAlAODYxCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTgwM0UyIgotCQkJCQljbGllbnQgICAgIAlAODYxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxMSwgMTAyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4NjMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NjEKLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODY0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxMCwgOTc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODg4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE5MDAwNCIKLQkJCQkJY2xpZW50ICAgICAJQDg2MQotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDEwMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEwNjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMDA4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MiIgQDg2NgotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA2MDcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTcwMTAyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3MyIgQDg2NwotCQkJCQlQYXJlbnRfVmlldyAJQDg2NgotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MSIKLQkJCQkJY2xpZW50ICAgICAJQDg2NgotCQkJCQlzdXBwbGllciAgIAlANzkzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1ODEsIDYwNykKLQkJCQkJICAgICgxNTgxLCA1NDcpCi0JCQkJCSAgICAoMTY3OSwgNTQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzksIDU0NykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODY4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODY2Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA0NjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTg4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTIiCi0JCQkJCWNsaWVudCAgICAgCUA4NjYKLQkJCQkJc3VwcGxpZXIgICAJQDc5NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNjIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEyIiBAODcxCi0JCQkJbG9jYXRpb24gICAJKDg0OSwgMTQ5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMTAyNkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMyIgQDg3MgotCQkJCQlQYXJlbnRfVmlldyAJQDg3MQotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDFGOSIKLQkJCQkJY2xpZW50ICAgICAJQDg3MQotCQkJCQlzdXBwbGllciAgIAlANzk0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODczCi0JCQkJCVBhcmVudF9WaWV3IAlAODcxCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDIsIDE0NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTg4MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMjAzIgotCQkJCQljbGllbnQgICAgIAlAODcxCi0JCQkJCXN1cHBsaWVyICAgCUA3OTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODQ5LCAxNDk2KQotCQkJCQkgICAgKDEwNjIsIDE0OTYpCi0JCQkJCSAgICAoMTA2MiwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDYyLCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4NzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODczCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNSwgMTI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyNjkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNCIgQDg3NgotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE1NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjMwMDA1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTUiIEA4NzcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzYKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMjciCi0JCQkJCWNsaWVudCAgICAgCUA4NzYKLQkJCQkJc3VwcGxpZXIgICAJQDc5NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNTY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4NzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NzYKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDE1MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwNDk1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMzMiIKLQkJCQkJY2xpZW50ICAgICAJQDg3NgotCQkJCQlzdXBwbGllciAgIAlANzk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk1MiwgMTU2NSkKLQkJCQkJICAgICgxMjAwLCAxNTY1KQotCQkJCQkgICAgKDEyMDAsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTQsIDEyNzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQljbGllbnQgICAgIAlANzc3Ci0JCQkJc3VwcGxpZXIgICAJQDc4NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDI0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgMTM1KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDc5MwotCQkJCXN1cHBsaWVyICAgCUA3NzcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTk3LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTcsIDM1OSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJcXVpZCAgICAgICAJIjNCNkFENzREMDNDNCIKLQkJCXRpdGxlICAgICAgCSI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDg4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDM3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDg4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDM3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCXdpZHRoICAgICAgCTU0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA4ODUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODUKLQkJCQkgICAgbG9jYXRpb24gICAJKDk5MSwgNjMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA4ODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTYsIDM3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODg3Ci0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDU2MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODg2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMzYwLCA1NjEpCi0JCQkJICAgICgxMzYwLCA0NzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIgQDg4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREluY2x1ZGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiCi0JCQkJd2lkdGggICAgICAJMjU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAODg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4ODkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAODkwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDg5MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODkxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzUsIDExNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJODY5Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUwIiBAODkyCi0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDEyMDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTEiIEA4OTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTIKLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUA4OTIKLQkJCQkJc3VwcGxpZXIgICAJQDg4OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODk0Ci0JCQkJCVBhcmVudF9WaWV3IAlAODkyCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzQ3LCAxMTU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NDQxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QyIKLQkJCQkJY2xpZW50ICAgICAJQDg5MgotCQkJCQlzdXBwbGllciAgIAlAODkxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNCwgMTIwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDAsIDEyNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDcKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTQ3MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ4IiBAODk3Ci0JCQkJbG9jYXRpb24gICAJKDExNjgsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDgwMkZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDkiIEA4OTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTcKLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QiIKLQkJCQkJY2xpZW50ICAgICAJQDg5NwotCQkJCQlzdXBwbGllciAgIAlAODg5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNjgsIDEwMjIpCi0JCQkJCSAgICAoMTE2OCwgOTYyKQotCQkJCQkgICAgKDEyODUsIDk2MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NSwgOTYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg5OQotCQkJCQlQYXJlbnRfVmlldyAJQDg5NwotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjkwLCAxMDc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJCWNsaWVudCAgICAgCUA4OTcKLQkJCQkJc3VwcGxpZXIgICAJQDg5MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNjgsIDExNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTI3LCAxMDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzY5NzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTcwIiBAOTAyCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEzNTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDIwMDlBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzEiIEA5MDMKLQkJCQkJUGFyZW50X1ZpZXcgCUA5MDIKLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJCWNsaWVudCAgICAgCUA5MDIKLQkJCQkJc3VwcGxpZXIgICAJQDg5MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDE5NDAsIDEzNTMpCi0JCQkJCSAgICAoMTk0MCwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MCwgMTI1NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAOTA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTAyCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCAxMzIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTY4MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJCWNsaWVudCAgICAgCUA5MDIKLQkJCQkJc3VwcGxpZXIgICAJQDg5MQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDExODEsIDEzNTMpCi0JCQkJCSAgICAoMTE4MSwgMTI1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4MSwgMTI1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzAsIDEzMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MTM0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MDcKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA1NjEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg4MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjg4LCA1NjEpCi0JCQkJICAgICgyODgsIDQ3MSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDkwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDYzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDkwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1OCwgMzc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQkJd2lkdGggICAgICAJNDE0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAOTEwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA5NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgOTE5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA5MTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwLCA2MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAOTExCi0JCQkJc3VwcGxpZXIgICAJQDg4MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMSwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjEsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTEzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA5MDgKLQkJCQlzdXBwbGllciAgIAlAODgzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTg5LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OSwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDkwNykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJY2xpZW50ICAgICAJQDg4NQotCQkJCXN1cHBsaWVyICAgCUA4ODYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDE2LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTYsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4ODcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEA5MTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTAsIDkwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTE2Ci0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDEwODkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTgyNCwgMTA4OSkKLQkJCQkgICAgKDE4MjQsIDk5OSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOERDMDM4MSIKLQkJCQljbGllbnQgICAgIAlAODg4Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjYsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjYsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkxOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCIKLQkJCQljbGllbnQgICAgIAlAODkwCi0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MzQsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzQsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5MTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNjMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTIwCi0JCQkJbG9jYXRpb24gICAJKDE3NjIsIDgxOSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTE5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzYyLCA4MTkpCi0JCQkJICAgICgxNzYyLCA3MjcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MjEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiCi0JCQkJY2xpZW50ICAgICAJQDg4OQotCQkJCXN1cHBsaWVyICAgCUA5MTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE2LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTYsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTIyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA5MTkKLQkJCQlzdXBwbGllciAgIAlAODg2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NiwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU2LCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODg3KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDkyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxNDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MjQKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjg5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5MjMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDExMjAsIDI4OSkKLQkJCQkgICAgKDExMjAsIDE5OSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTIiIEA5MjUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NSwgMjE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGFpbmVyIiBAOTI2Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTI1Ci0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDIxMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250YWluZXIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMzExMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0UiCi0JCQkJCWNsaWVudCAgICAgCUA5MjUKLQkJCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMTc2KQotCQkJCQkgICAgKDEzNzQsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM1LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMjY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEzIiBAOTI5Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTI1Ci0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0YiCi0JCQkJCWNsaWVudCAgICAgCUA5MjUKLQkJCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMjU0KQotCQkJCQkgICAgKDEzNDUsIDI1NCkKLQkJCQkJICAgICgxMzQ1LCAxOTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM0NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTQiIEA5MzAKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAyMTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNDgwMjYxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290Q29udGFpbmVyIiBAOTMxCi0JCQkJCVBhcmVudF9WaWV3IAlAOTMwCi0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAyMTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdENvbnRhaW5lciIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNTAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTYwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJCWNsaWVudCAgICAgCUA5MzAKLQkJCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDE3NikKLQkJCQkJICAgICg4NjYsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExNSIgQDkzNAotCQkJCQlQYXJlbnRfVmlldyAJQDkzMAotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODYiCi0JCQkJCWNsaWVudCAgICAgCUA5MzAKLQkJCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDI1NykKLQkJCQkJICAgICg4OTUsIDI1NykKLQkJCQkJICAgICg4OTUsIDE5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQljbGllbnQgICAgIAlAODg2Ci0JCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjcsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NywgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDkyNCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MzYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDhFMjAwRUEiCi0JCQkJY2xpZW50ICAgICAJQDg4NAotCQkJCXN1cHBsaWVyICAgCUA5MjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTI0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQljbGllbnQgICAgIAlAODgzCi0JCQkJc3VwcGxpZXIgICAJQDkyMwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTksIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjQpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDkzOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkzOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTM4Ci0JCQkJc3VwcGxpZXIgICAJQDkxMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNiwgMTE0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2LCA3MjcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjYiIEA5NDAKLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTQyNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNyIgQDk0MQotCQkJCQlQYXJlbnRfVmlldyAJQDk0MAotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDk0MAotCQkJCQlzdXBwbGllciAgIAlAOTE1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjE0NywgMTQyNSkKLQkJCQkJICAgICgyMTQ3LCA5NDMpCi0JCQkJCSAgICAoMjA2NywgOTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY3LCA5NDMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEA5NDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NDAKLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NSwgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQkJY2xpZW50ICAgICAJQDk0MAotCQkJCQlzdXBwbGllciAgIAlAOTM4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjI1LCAxNDI1KQotCQkJCQkgICAgKDIyNSwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI1LCAxMjU1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTQyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTY5MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI0IiBAOTQ1Ci0JCQkJbG9jYXRpb24gICAJKDE1MDUsIDE1MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjUiIEA5NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NDUKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUA5NDUKLQkJCQkJc3VwcGxpZXIgICAJQDkxOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTA1LCAxNTAzKQotCQkJCQkgICAgKDIxODgsIDE1MDMpCi0JCQkJCSAgICAoMjE4OCwgNjc1KQotCQkJCQkgICAgKDIwNTksIDY3NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1OSwgNjc1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEA5NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NDUKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCQljbGllbnQgICAgIAlAOTQ1Ci0JCQkJCXN1cHBsaWVyICAgCUA5MzgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUwNSwgMTUwMykKLQkJCQkJICAgICgxMTMsIDE1MDMpCi0JCQkJCSAgICAoMTEzLCAxMjU1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMsIDEyNTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY3NjgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNiIgQDk1MAotCQkJCWxvY2F0aW9uICAgCSg2NiwgMjQ0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQzMxMDM1NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE3IiBAOTUxCi0JCQkJCVBhcmVudF9WaWV3IAlAOTUwCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzMxIgotCQkJCQljbGllbnQgICAgIAlAOTUwCi0JCQkJCXN1cHBsaWVyICAgCUA5MjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjYsIDI0NCkKLQkJCQkJICAgICg2NiwgMTQ0KQotCQkJCQkgICAgKDg2NiwgMTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE0NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDk1MgotCQkJCQlQYXJlbnRfVmlldyAJQDk1MAotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNjgxMTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTk5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzM0IiCi0JCQkJCWNsaWVudCAgICAgCUA5NTAKLQkJCQkJc3VwcGxpZXIgICAJQDkzOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2LCAxMTQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAxODQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMTMKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY2NTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3ODBCRDkwMDU5IgotCQkJCWNsaWVudCAgICAgCUA5MDkKLQkJCQlzdXBwbGllciAgIAlAOTIzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU5LCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTI0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAODkxCi0JCQkJc3VwcGxpZXIgICAJQDg4MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQwMCwgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTA3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NTcKLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgODM3KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4ODUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEwMTIsIDgzNykKLQkJCQkgICAgKDEwMTIsIDcyNykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1OAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDk1OQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MSwgODcxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODg4MTU4Ci0JCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0RTIwMzY2IgotCQkJCWNsaWVudCAgICAgCUA4OTEKLQkJCQlzdXBwbGllciAgIAlAODg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzNywgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzNywgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjAKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5NjEKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5MCwgODY1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTgxNjMzCi0JCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0QkEwMjNDIgotCQkJCWNsaWVudCAgICAgCUA5MTAKLQkJCQlzdXBwbGllciAgIAlAODg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI1LCA5MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk1NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NjIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDkxNQotCQkJCXN1cHBsaWVyICAgCUA5MTkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI4LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjgsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjApKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJcXVpZCAgICAgICAJIjNCOUY4Rjc2MDJDNyIKLQkJCXRpdGxlICAgICAgCSI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA5NjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCAxNDQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxMzYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxNDI3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkzODIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZm9ybSA6IFhTREZvcm0iCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGb3JtIiBAOTY0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NjAsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZvcm0iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzE1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOUY5MTNCMDFFQiIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5NjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMTA1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDYKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudCA6IERPTUVsZW1lbnQiKSkKLQkJCQl3aWR0aCAgICAgIAk2NzUKLQkJCQloZWlnaHQgICAgIAkxNDMKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA5NjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAzODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NywgMzM1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA5NjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgOTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjc4LCA4OTQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5hbWVkQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RDMwM0E0IgotCQkJCXdpZHRoICAgICAgCTQ3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDk2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDE0MDgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjgsIDEzNTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY29wZSIgQDk2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NjQsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzQ1LCA1NzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI1NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NzAKLQkJCQlsb2NhdGlvbiAgIAkoODUwLCA1MzcpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoODUwLCA1MzcpCi0JCQkJICAgICg4NTAsIDQ0NykpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01FbGVtZW50IiBAOTcxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyNDgsIDEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NRWxlbWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZGF0YXR5cGU+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE0NjcxODM5Ci0JCQkJcXVpZHUgICAgICAJIjNCODE4OTc5MDIwMCIKLQkJCQl3aWR0aCAgICAgIAk3NjkKLQkJCQloZWlnaHQgICAgIAkyMDAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAOTcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNjQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNTg2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNTEyCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIgQDk3MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDMzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTc0Ci0JCQkJbG9jYXRpb24gICAJKDM2OCwgMjYzKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5NjUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDM2OCwgMjYzKQotCQkJCSAgICAoMzY4LCAxNjcpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiIEA5NzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5OTIsIDE0NTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTM0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDEyOTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QTQwM0RGIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MjMsIDE0MDcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHN1YnN0aXR1dGlvbiIKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgYWxsIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBAOTc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAxNzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3MDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNjU4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAxNzY4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTE5OAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyBhbGwiKSkKLQkJCQl3aWR0aCAgICAgIAk1NTAKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iIEA5NzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDUzMiwgMjEwMCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MjMKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk3NzgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlRmluYWwiIEA5NzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlRmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhGaW5hbCIgQDk3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTQ0LCAyMDE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxOTMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzYyLCAxODgyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQl3aWR0aCAgICAgIAkzODIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTI3OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgMTMzOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdXNlIDogWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTY0MAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIgQDk4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2MzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTQ4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNDk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCQTdCMEU4MDFBOCIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDk4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjA4LCA5MjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0OTgsIDg4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCQl3aWR0aCAgICAgIAkyMzgKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA5ODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQwLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU3LCAxNjMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTk2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2OTEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJOTM0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJOTg0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAOTg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTA5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDExNTYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODUyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxOYW1lc3BhY2VDb25zdHJhaW50IDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJOTA2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDk4NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MjIsIDc3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk5OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTEwMTQKLQkJCQloZWlnaHQgICAgIAk0ODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAOTg2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgOTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNywgOTA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5MzAxN0YiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA5ODcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzQ0LCA2NTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDYwMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzgsIDY2OCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzc4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA5ODgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDEwLCAxOTQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDIwMDIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJODIyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSI8PDAuLio+PiArIGxleGljYWxGaW5hbCA6IFhTRENvbXBsZXhGaW5hbCIKLQkJCQkJIjw8MC4uKj4+ICsgYmxvY2sgOiBYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIisgbWl4ZWQgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODc4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAOTg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0ODgsIDE2OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDQsIDE2NDYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5MAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAOTg5Ci0JCQkJc3VwcGxpZXIgICAJQDk2OAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDYsIDE2MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDYsIDE0NzIpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAOTkxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyMDgsIDcwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1OCwgNTk4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTkwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTkxOAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEFBMDFEMyIKLQkJCQljbGllbnQgICAgIAlAOTgyCi0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2OTYsIDg2OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY5NiwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDk4MwotCQkJCXN1cHBsaWVyICAgCUA5NjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDk0LCAxNjE5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDk0LCAxNTMzKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAOTk0Ci0JCQkJbG9jYXRpb24gICAJKDE0ODcsIDE4NTYpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk4OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ4NywgMTg1NikKLQkJCQkgICAgKDE0ODcsIDE3NjApKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NQXR0ciIgQDk5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAwLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDM1MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NQXR0ciIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDMwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JCRjhDODkwMUI2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlAOTg4Ci0JCQkJc3VwcGxpZXIgICAJQDk4OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzQsIDE5MzApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MzQsIDE4NTYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTk0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyNTY4MDI1OSIKLQkJCQljbGllbnQgICAgIAlAOTg3Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDU4OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDk3MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OTgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RTE3NzAxMTYiCi0JCQkJY2xpZW50ICAgICAJQDk5MQotCQkJCXN1cHBsaWVyICAgCUA5NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTkwLCA1ODYpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxOTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTk5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA5NzIKLQkJCQlzdXBwbGllciAgIAlAOTczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIyLCA1NzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMiwgNDQ3KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RTYwMzcyIgotCQkJCWNsaWVudCAgICAgCUA5NzMKLQkJCQlzdXBwbGllciAgIAlAOTY1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwLCAzMjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MCwgMjYzKQotCQkJCWRyYXdTdXBwbGllciAJQDk3NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCWNsaWVudCAgICAgCUA5ODYKLQkJCQlzdXBwbGllciAgIAlAOTcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzLCA4OTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMywgNzA4KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCWNsaWVudCAgICAgCUA5ODQKLQkJCQlzdXBwbGllciAgIAlAOTgyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYwMCwgMTA4NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYwMCwgOTg3KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NRG9jdW1lbnQiIEAxMDAzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDk0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Eb2N1bWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTU3LCA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg1MEUwMzgxIgotCQkJCXdpZHRoICAgICAgCTc3NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMDQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBOTAzRDIiCi0JCQkJY2xpZW50ICAgICAJQDk2NgotCQkJCXN1cHBsaWVyICAgCUA5NjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTYsIDMyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODU2LCAyNjMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTc0KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Ob2RlIiBAMTAwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjM0LCAzNTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzNCwgMzAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciCi0JCQkJd2lkdGggICAgICAJNjg2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwNgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAOTY5Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1MCwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzJEN0JCMDM0OSIKLQkJCQljbGllbnQgICAgIAlAOTgwCi0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU3NSwgMTI2NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTcwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJY2xpZW50ICAgICAJQDk2NwotCQkJCXN1cHBsaWVyICAgCUA5NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjk0LCA4ODApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2OTQsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTg1Ci0JCQkJc3VwcGxpZXIgICAJQDk2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgNzY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDY4NykpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwMTAKLQkJCQlsb2NhdGlvbiAgIAkoMTcwMywgMTI5MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTY3Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzAzLCAxMjkwKQotCQkJCSAgICAoMTcwMywgMTAwOCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwMTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDk2OAotCQkJCXN1cHBsaWVyICAgCUA5NjcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTAzLCAxMzQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAzLCAxMjkwKQotCQkJCWRyYXdTdXBwbGllciAJQDEwMTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAxMgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQljbGllbnQgICAgIAlAOTYzCi0JCQkJc3VwcGxpZXIgICAJQDk2NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEzNDcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDEyOTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAxMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDEzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA5NzcKLQkJCQlzdXBwbGllciAgIAlAOTg5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MywgMjAyOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MywgMTg1NikKLQkJCQlkcmF3U3VwcGxpZXIgCUA5OTQpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI4LiBDb25jcmV0ZSBDb250YWlubWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBODA5NzAyN0EiCi0JCQl0aXRsZSAgICAgIAkiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDEwMTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjcyLCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDM5LCA5NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAMTAxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NDAsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MzEsIDUzNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hRGlyZWN0aXZlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIgQDEwMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDEzLCA3NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDEwMTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDY0LCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA1MzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIKLQkJCQl3aWR0aCAgICAgIAk0MzgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAxOAotCQkJCWxvY2F0aW9uICAgCSgxOTQzLCA4NjgpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMTcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5NDMsIDg2OCkKLQkJCQkgICAgKDE5NDMsIDYzMSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzIiIEAxMDE5Ci0JCQkJbG9jYXRpb24gICAJKDIxMjUsIDY4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNDAwNTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3MyIgQDEwMjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQUQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDE5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDE2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA3MjkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTcsIDM0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI1NSwgNjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjYwMkI3IgotCQkJCQljbGllbnQgICAgIAlAMTAxOQotCQkJCQlzdXBwbGllciAgIAlAMTAxNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDY3LCA2NzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMTAyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4LCAyNzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTAyNQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTAyNAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjcyLCA0NjUpCi0JCQkJICAgICgyNzIsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEwMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM3MiwgMTEyMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NjkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTg3Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDEwMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDU3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5LCA1MzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJMzUyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYwIiBAMTAyOAotCQkJCWxvY2F0aW9uICAgCSgxMTcwLCAxMzU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzN0FDMDI1QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDEwMjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI4Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC0yMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNDA0NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMjgKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3MCwgMTM1NikKLQkJCQkJICAgICgyMDYsIDEzNTYpCi0JCQkJCSAgICAoMjA2LCA2MzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNiwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjYsIDEzMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1OTE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTYxIiBAMTAzMgotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjgKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNTIxLCAxMzk4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDI4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDI2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzAsIDEzNTYpCi0JCQkJCSAgICAoMjczMSwgMTM1NikKLQkJCQkJICAgICgyNzMxLCAxMjI3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzMxLCAxMjI3KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEwMzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAsIDE2OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTU0IiBAMTAzNQotCQkJCWxvY2F0aW9uICAgCSgxMjIsIDExMzYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkNFQjEwMkY4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTUiIEAxMDM2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDM1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDI3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDYzMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTAzNwotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzUKLQkJCQkJbG9jYXRpb24gICAJKC02MzAsIC0yNTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMywgMTUxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAyNSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzUKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMiwgMTEzNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMiwgMTY0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwLCAxNTgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODExODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGVDb250ZW50IiBAMTA0MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQl3aWR0aCAgICAgIAk1MTMKLQkJCQloZWlnaHQgICAgIAkxMDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjYiIEAxMDQxCi0JCQkJbG9jYXRpb24gICAJKDQ3LCA4ODUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQ3MTUwMTE5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjciIEAxMDQyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0MQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDEKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ3LCA4ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NywgMTY0MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMDQzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0MQotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjE4NTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTk1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQxCi0JCQkJCXN1cHBsaWVyICAgCUAxMDQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDEzMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgsIDE5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE3ODgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDEwNDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNjMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMDQ3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDk2IiBAMTA0OAotCQkJCWxvY2F0aW9uICAgCSgxMzE5LCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkYxREU5MDE4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTciIEAxMDQ5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTU3LCAtMTAyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkYxREVBMDM2QyIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDgKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMTksIDEwMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzE5LCA5NTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAMTA1MAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDgKLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTAzOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzMxNzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RjFERUEwMzgwIgotCQkJCQljbGllbnQgICAgIAlAMTA0OAotCQkJCQlzdXBwbGllciAgIAlAMTA0NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNzksIDEwMzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNDA4MTYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiIEAxMDUzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgMTY5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTUsIDE2NTUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEwNTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkyIiBAMTA1NQotCQkJCWxvY2F0aW9uICAgCSgxMzUxLCAxODQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E1MDExMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkzIiBAMTA1NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNTUKLQkJCQkJbG9jYXRpb24gICAJKC0yOTcsIDIyNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDU0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTEsIDE4NDApCi0JCQkJCSAgICAoMTI5NCwgMTg0MCkKLQkJCQkJICAgICgxMjk0LCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk0LCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudHMiIEAxMDU3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA1NQotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxODA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzI2NTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTcwM0M4IgotCQkJCQljbGllbnQgICAgIAlAMTA1NQotCQkJCQlzdXBwbGllciAgIAlAMTA1NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzUxLCAxODQwKQotCQkJCQkgICAgKDE0MDksIDE4NDApCi0JCQkJCSAgICAoMTQwOSwgMTc1MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUxLCAxODQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwOSwgMTc1MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2MSwgMTgwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDcyODQ4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc2IiBAMTA2MAotCQkJCWxvY2F0aW9uICAgCSgxMTkwLCAxNDMyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDA2RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2MAotCQkJCQlsb2NhdGlvbiAgIAkoNzc0LCAtMTgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgMTUyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ0OTc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyNzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEwNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEwNTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxNjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAxNTI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQ1NDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDc3IiBAMTA2NAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjAKLQkJCQkJbG9jYXRpb24gICAJKDc3NCwgLTE4MzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDksIDEyNjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MEQ2MDMwRSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNjAKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTAsIDE0MzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTkwLCAxMjIzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOTQiIEAxMDY2Ci0JCQkJbG9jYXRpb24gICAJKDE2OTAsIDE2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUQwMzc0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmYWNldENvbnRlbnRzIiBAMTA2NwotCQkJCQlQYXJlbnRfVmlldyAJQDEwNjYKLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgMTczMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldENvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMzIwNTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg0NiwgMTY4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTY0NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTk0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNzMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTUiIEAxMDcwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA2NgotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNiwgLTEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTY2LCAxNjQzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzVBRjAwMDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDU0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkwLCAxNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzNCwgMTY4NCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIgQDEwNzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjI0LCA3ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzg4LCA3NDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEAxMDczCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOCwgMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEwNzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1NywgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc0IiBAMTA3NQotCQkJCWxvY2F0aW9uICAgCSg5NjMsIDMxOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QjAwM0QiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnRzIiBAMTA3NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzUKLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzQsIDM2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgxMDgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTExIgotCQkJCQljbGllbnQgICAgIAlAMTA3NQotCQkJCQlzdXBwbGllciAgIAlAMTA3MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk5LCAzMTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTYsIDI5MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk2Mzk2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzUiIEAxMDc5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA3NQotCQkJCQlsb2NhdGlvbiAgIAkoNTk1LCAtMTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NSwgMzYxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2QzAxMDciCi0JCQkJCWNsaWVudCAgICAgCUAxMDc1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDc0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjMsIDMxOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgyOCwgMzE5KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDEwODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA5OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTc0LCA5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwODIKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMiwgMTU5MykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA4MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjMyMiwgMTU5MykKLQkJCQkgICAgKDIzMjIsIDEwNDcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDgzCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTA4NAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDYsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2MDAwMAotCQkJCSAgICBoZWlnaHQgICAgIAk1Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRjUwMTNBIgotCQkJCWNsaWVudCAgICAgCUAxMDgxCi0JCQkJc3VwcGxpZXIgICAJQDEwMTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTUwLCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTAsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDE4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMDg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODMyLCA1NzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MTAsIDUzMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTY2MgotCQkJCWhlaWdodCAgICAgCTExMgotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMCIgQDEwODYKLQkJCQlsb2NhdGlvbiAgIAkoMTQ5OCwgMTQzMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNDAxQUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFub255bW91c1R5cGVEZWZpbml0aW9uIiBAMTA4NwotCQkJCQlQYXJlbnRfVmlldyAJQDEwODYKLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDI3LCAxNDcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NTQzODkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMDg2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDgxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0OTgsIDE0MzEpCi0JCQkJCSAgICAoMjI4MSwgMTQzMSkKLQkJCQkJICAgICgyMjgxLCAxMDQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTgsIDE0MzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjgxLCAxMDQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjA0LCAxMzk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDU0MTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyMSIgQDEwOTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgxMDM4LCAtMTgxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgODY2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4OTExNTAwMTYiCi0JCQkJCWNsaWVudCAgICAgCUAxMDg2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDg1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0OTgsIDE0MzEpCi0JCQkJCSAgICAoMTEzMSwgMTQzMSkKLQkJCQkJICAgICgxMTMxLCA2MzIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMzEsIDYzMikpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIiBAMTA5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg0OCwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY1NSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTQwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBAMTA5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgwMCwgODk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA1LCA4NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJNjA4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI0IiBAMTA5NAotCQkJCWxvY2F0aW9uICAgCSg1MzQsIDczNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBAMTA5NQotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTQKLQkJCQkJbG9jYXRpb24gICAJKDg2LCAtMjE0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIwLCA3NDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjExMTExMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDk0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgODQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1OTUsIDgwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc1OTI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjUiIEAxMDk4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA5NAotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDY1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzRjAwMjk4IgotCQkJCQljbGllbnQgICAgIAlAMTA5NAotCQkJCQlzdXBwbGllciAgIAlAMTA4NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTM0LCA3MzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzQsIDYzMikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ0IiBAMTEwMAotCQkJCWxvY2F0aW9uICAgCSg5MDAsIDEwMzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzZWxlY3RvciIgQDExMDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTAwCi0JCQkJCWxvY2F0aW9uICAgCSg4NCwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEzLCAxMDQyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMyODgKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjM0IgotCQkJCQljbGllbnQgICAgIAlAMTEwMAotCQkJCQlzdXBwbGllciAgIAlAMTA5MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTAwLCAxMTEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDEwNDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTg5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ1IiBAMTEwNAotCQkJCQlQYXJlbnRfVmlldyAJQDExMDAKLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgOTY4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMkEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTAwCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDk1MSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ2IiBAMTEwNgotCQkJCWxvY2F0aW9uICAgCSg3MDAsIDEwMzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEAxMTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNgotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTYsIDEwMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmllbGRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTQ3OTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTg1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNzkiCi0JCQkJCWNsaWVudCAgICAgCUAxMTA2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDkyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3MSwgMTA0MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTIzMDc3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDciIEAxMTEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEwNgotCQkJCQlsb2NhdGlvbiAgIAkoLTExNiwgMTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTksIDk2OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzY1IgotCQkJCQljbGllbnQgICAgIAlAMTEwNgotCQkJCQlzdXBwbGllciAgIAlAMTA5MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzAwLCAxMDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzAwLCA5NTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDExMTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDE0NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDAsIDEzOTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTEzCi0JCQkJbG9jYXRpb24gICAJKDU1MCwgMTU5MCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTExMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNTUwLCAxNTkwKQotCQkJCSAgICAoNTUwLCAxNDk1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDExMTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTA0LCA1NzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjQwLCA1MzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCQl3aWR0aCAgICAgIAk1NDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTE1Ci0JCQkJbG9jYXRpb24gICAJKDE0MDYsIDc2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTExNAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQwNiwgNzY1KQotCQkJCSAgICAoMTQwNiwgNjMxKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDExMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNjU2LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5MywgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwMiIgQDExMTcKLQkJCQlsb2NhdGlvbiAgIAkoMTYxNCwgMTg2OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZGRERENzAxMTMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwMyIgQDExMTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTE3Ci0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTE3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTQsIDE4NjgpCi0JCQkJCSAgICAoMjUwMCwgMTg2OCkKLQkJCQkJICAgICgyNTAwLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAwLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDExMTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTE3Ci0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxNzg3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTg3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQkJY2xpZW50ICAgICAJQDExMTcKLQkJCQkJc3VwcGxpZXIgICAJQDExMTIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkKLQkJCQkJICAgICg5ODQsIDE4NjgpCi0JCQkJCSAgICAoOTg0LCAxNDk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODQsIDE0OTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTExOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDE4MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3MTI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDgiIEAxMTIyCi0JCQkJbG9jYXRpb24gICAJKDI5MjcsIDM4NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzNjAzODYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUNvbnRlbnRzIiBAMTEyMwotCQkJCQlQYXJlbnRfVmlldyAJQDExMjIKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAzNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlQ29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3MzA2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3QyIKLQkJCQkJY2xpZW50ICAgICAJQDExMjIKLQkJCQkJc3VwcGxpZXIgICAJQDExMTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjkyNywgMzg3KQotCQkJCQkgICAgKDE3NTAsIDM4NykKLQkJCQkJICAgICgxNzUwLCA1MjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNTIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODA0LCA0MjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzI0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA5IiBAMTEyNgotCQkJCQlQYXJlbnRfVmlldyAJQDExMjIKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOTQ2LCAxNDQ4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTIyCi0JCQkJCXN1cHBsaWVyICAgCUAxMTE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDI5MjcsIDM4NykKLQkJCQkJICAgICgyOTg3LCAzODcpCi0JCQkJCSAgICAoMjk4NywgMTY3MSkKLQkJCQkJICAgICgyOTI4LCAxNjcxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDE2NzEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDExMjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDg0IiBAMTEyOQotCQkJCWxvY2F0aW9uICAgCSgxNzUwLCA4NzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNEUwMDY3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDExMzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTI5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgNjkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTEwMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMkE1IgotCQkJCQljbGllbnQgICAgIAlAMTEyOQotCQkJCQlzdXBwbGllciAgIAlAMTExNAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE0LCA2OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNDQ0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkODUiIEAxMTMzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyOQotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDksIDEwNjUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDI5QiIKLQkJCQkJY2xpZW50ICAgICAJQDExMjkKLQkJCQkJc3VwcGxpZXIgICAJQDExMjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDExMTMpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTEzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE2IiBAMTEzNgotCQkJCWxvY2F0aW9uICAgCSgxMjUyLCAxODk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRUJEQzg3MDI0NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE3IiBAMTEzNwotCQkJCQlQYXJlbnRfVmlldyAJQDExMzYKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAyRjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMTM2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTE2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNTIsIDE4OTYpCi0JCQkJCSAgICAoMjYwMywgMTg5NikKLQkJCQkJICAgICgyNjAzLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAzLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTEzOAotCQkJCQlQYXJlbnRfVmlldyAJQDExMzYKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjgyLCAxODU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzgxMTQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCQljbGllbnQgICAgIAlAMTEzNgotCQkJCQlzdXBwbGllciAgIAlAMTEzNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjUyLCAxODk2KQotCQkJCQkgICAgKDQyOCwgMTg5NikKLQkJCQkJICAgICg0MjgsIDEyMjMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQyOCwgMTIyMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgyLCAxODYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzUwMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODgiIEAxMTQxCi0JCQkJbG9jYXRpb24gICAJKDExOTksIDEzMjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEMzIwMjIwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4OSIgQDExNDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTQxCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEMiCi0JCQkJCWNsaWVudCAgICAgCUAxMTQxCi0JCQkJCXN1cHBsaWVyICAgCUAxMTI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoMTg5NywgMTMyMSkKLQkJCQkJICAgICgxODk3LCAxMjIzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk3LCAxMjIzKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTE0MwotCQkJCQlQYXJlbnRfVmlldyAJQDExNDEKLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk1NjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEQiCi0JCQkJCWNsaWVudCAgICAgCUAxMTQxCi0JCQkJCXN1cHBsaWVyICAgCUAxMTM1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoNTAwLCAxMzIxKQotCQkJCQkgICAgKDUwMCwgMTIyMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxMjIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MjMwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDExMTYKLQkJCQlzdXBwbGllciAgIAlAMTA4MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDYsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDYsIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA4MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTQ3Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE0OAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgNDk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDQ2NDI5Ci0JCQkJICAgIGhlaWdodCAgICAgCTYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDEwODUKLQkJCQlzdXBwbGllciAgIAlAMTAyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1MywgNTIwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTMsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDI1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNDkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEwNTQKLQkJCQlzdXBwbGllciAgIAlAMTA4MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MDksIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDksIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA4MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUwCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE1MQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTAKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgMTU5MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTkKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk4MDM5MgotCQkJCSAgICBoZWlnaHQgICAgIAkzODUKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJY2xpZW50ICAgICAJQDEwNTQKLQkJCQlzdXBwbGllciAgIAlAMTExMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDQsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDQsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTExMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTUyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBNjQwMjc5IgotCQkJCWNsaWVudCAgICAgCUAxMDI3Ci0JCQkJc3VwcGxpZXIgICAJQDEwMjQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUyMSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAyNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTE1MwotCQkJCWxvY2F0aW9uICAgCSg0MzEsIDIyMikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA0MAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDMxLCAyMjIpCi0JCQkJICAgICg0MzEsIDEzMCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNTQKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU1Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYxLCAyMjQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NzY3NDQKLQkJCQkgICAgaGVpZ2h0ICAgICAJODYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI0NDAwNjkiCi0JCQkJY2xpZW50ICAgICAJQDEwMjQKLQkJCQlzdXBwbGllciAgIAlAMTA0MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI3NSwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzUsIDIyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTUzKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMTU2Ci0JCQkJbG9jYXRpb24gICAJKDEzMDksIDQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTA3MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTMwOSwgNDY1KQotCQkJCSAgICAoMTMwOSwgMzc1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1NwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNTgKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDEsIDQ5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NDI4NgotCQkJCSAgICBoZWlnaHQgICAgIAkxMAotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTY2MDMzOSIKLQkJCQljbGllbnQgICAgIAlAMTA4NQotCQkJCXN1cHBsaWVyICAgCUAxMDczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTMxLCA1MjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzMSwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDExNTYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE1OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0OEZDMDFFNyIKLQkJCQljbGllbnQgICAgIAlAMTAzNAotCQkJCXN1cHBsaWVyICAgCUAxMTEyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjUwLCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTExMykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTYwCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE2MQotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDUsIDQ5MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk1ODMzMwotCQkJCSAgICBoZWlnaHQgICAgIAk4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjEwM0JFIgotCQkJCWNsaWVudCAgICAgCUAxMDQ3Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTE1NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTYyCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE2MwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTEsIDkwNSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0ODk4MAotCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkVCMDJBOCIKLQkJCQljbGllbnQgICAgIAlAMTEyOAotCQkJCXN1cHBsaWVyICAgCUAxMDE3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg3OCwgMTExMykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3OCwgODY4KQotCQkJCWRyYXdTdXBwbGllciAJQDEwMTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE2NAotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExNjUKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAzQTAyMjEiCi0JCQkJY2xpZW50ICAgICAJQDExMjgKLQkJCQlzdXBwbGllciAgIAlAMTExNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDMsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTE1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY3Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NCwgODAxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIgotCQkJCWNsaWVudCAgICAgCUAxMDQ2Ci0JCQkJc3VwcGxpZXIgICAJQDExMTQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjg0LCA4MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyODQsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTE1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNjgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJY2xpZW50ICAgICAJQDEwMTYKLQkJCQlzdXBwbGllciAgIAlAMTA3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyODQsIDc2MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3OSwgNzYyKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTY5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUAxMDE1Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDEwNzIKLQkJCQlzdXBwbGllciAgIAlAMTAxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MzcsIDcyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjYzNywgNjMxKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTcxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyQjMwMUQ1IgotCQkJCWNsaWVudCAgICAgCUAxMDE3Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUwLCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNzIKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTczCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjgyMSwgODk3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDg3NzE5Ci0JCQkJICAgIGhlaWdodCAgICAgCTc2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNEYwMjNDIgotCQkJCWNsaWVudCAgICAgCUAxMDE0Ci0JCQkJc3VwcGxpZXIgICAJQDEwNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODk2LCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4OTYsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExNzQKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTc1Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMxMywgOTA0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODUwNjIyCi0JCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRTIwMzgxIgotCQkJCWNsaWVudCAgICAgCUAxMDI2Ci0JCQkJc3VwcGxpZXIgICAJQDEwMTcKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzgxLCAxMTA5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMzgxLCA4NjgpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAxOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTc2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTE3NwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4NzgsIDI2OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NjY2NwotCQkJCSAgICBoZWlnaHQgICAgIAk2NgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjU1MDM4NSIKLQkJCQljbGllbnQgICAgIAlAMTAyNgotCQkJCXN1cHBsaWVyICAgCUAxMDQwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjk0MywgMTEwOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjk0MywgMjIyKQotCQkJCWRyYXdTdXBwbGllciAJQDExNTMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE3OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQljbGllbnQgICAgIAlAMTEzNQotCQkJCXN1cHBsaWVyICAgCUAxMDI0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDYyLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjIsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDI1KSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiOS4gQ29uY3JldGUgU2NoZW1hIENvbXBvc2l0aW9uIgotCQkJcXVpZCAgICAgICAJIjNDMjVFQjdBMDM4QyIKLQkJCXRpdGxlICAgICAgCSI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTE3OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyNiIgQDExODAKLQkJCQlsb2NhdGlvbiAgIAkoMjI4LCAxNjk1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MUU2MDI1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI3IiBAMTE4MQotCQkJCQlQYXJlbnRfVmlldyAJQDExODAKLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMkY3IgotCQkJCQljbGllbnQgICAgIAlAMTE4MAotCQkJCQlzdXBwbGllciAgIAlAMTE3OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjgsIDE2OTUpCi0JCQkJCSAgICAoMTc1LCAxNjk1KQotCQkJCQkgICAgKDE3NSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzUsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIgQDExODMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTgwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDc2LCAtMzg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMjksIDE3NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjkyNDUyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MUVBMDMwQiIKLQkJCQkJY2xpZW50ICAgICAJQDExODAKLQkJCQkJc3VwcGxpZXIgICAJQDExNzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjI4LCAxNjk1KQotCQkJCQkgICAgKDI4MSwgMTY5NSkKLQkJCQkJICAgICgyODEsIDE1OTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjI4LCAxNjk1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxLCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjksIDE2NDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwNTcxNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDExODYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDQwLCAxNTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzkwLCAxNDkzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYyIiBAMTE4NwotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE2OTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDUwMzk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjMiIEAxMTg4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg2MCwgMTYyMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzhBIgotCQkJCQljbGllbnQgICAgIAlAMTE4NwotCQkJCQlzdXBwbGllciAgIAlAMTE4NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE2OTgpCi0JCQkJCSAgICAoOTAxLCAxNjk4KQotCQkJCQkgICAgKDkwMSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDE1OTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTE5MAotCQkJCQlQYXJlbnRfVmlldyAJQDExODcKLQkJCQkJbG9jYXRpb24gICAJKC0xMjg4LCAtMzE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDIwLCAxNzM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjMyNjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjQ5MDM5RSIKLQkJCQkJY2xpZW50ICAgICAJQDExODcKLQkJCQkJc3VwcGxpZXIgICAJQDExODYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoOTUyLCAxNjk4KQotCQkJCQkgICAgKDEwMDQsIDE2OTgpCi0JCQkJCSAgICAoMTAwNCwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTIsIDE2OTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDA0LCAxNTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDE2NDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIiBAMTE5MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY1NiwgOTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDIwLCA5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUNvbXBvc2l0b3IiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiCi0JCQkJd2lkdGggICAgICAJNDkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDExOTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxMiwgNzM5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDc1Ci0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDExOTUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2NDAsIDQxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NiwgMjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNDA2Ci0JCQkJaGVpZ2h0ICAgICAJMjg3Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyNiIgQDExOTYKLQkJCQlsb2NhdGlvbiAgIAkoMTMwMywgNjc5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFERDBDMDNEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaW5jb3Jwb3JhdGVkU2NoZW1hIiBAMTE5NwotCQkJCQlQYXJlbnRfVmlldyAJQDExOTYKLQkJCQkJbG9jYXRpb24gICAJKC00MSwgLTg1NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1OSwgMzgxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAwMzg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCQljbGllbnQgICAgIAlAMTE5NgotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzAzLCA2NzkpCi0JCQkJCSAgICAoMTMwMywgNDE5KQotCQkJCQkgICAgKDg0MywgNDE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNDE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjIsIDQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkwNzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjciIEAxMjAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE5NgotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ1LCA5NTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDExOTYKLQkJCQkJc3VwcGxpZXIgICAJQDExOTMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMwMywgNjc5KQotCQkJCQkgICAgKDEzMDMsIDk5NykKLQkJCQkJICAgICg5MDEsIDk5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzAzLCA2NzkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDEsIDk5NykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjI0IiBAMTIwMgotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCA2NDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZFNjaGVtYSIgQDEyMDMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjAyCi0JCQkJCWxvY2F0aW9uICAgCSgzMzYsIC0xMzk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM4LCA1MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMTkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDIKLQkJCQkJc3VwcGxpZXIgICAJQDExOTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQotCQkJCQkgICAgKDEyMTYsIDUzNCkKLQkJCQkJICAgICg4NDMsIDUzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDUzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTI2LCA1NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzMTY0MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjI1IiBAMTIwNgotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDIKLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDk3NCwgNzU2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjAyCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMTYsIDY0OSkKLQkJCQkJICAgICgxMjE2LCA3OTcpCi0JCQkJCSAgICAoODc3LCA3OTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIxNiwgNjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODc3LCA3OTcpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzMCIgQDEyMDgKLQkJCQlsb2NhdGlvbiAgIAkoNjYyLCA2NDIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTYwMTMxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2luZ0RpcmVjdGl2ZXMiIEAxMjA5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIwOAotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDY3NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZWZlcmVuY2luZ0RpcmVjdGl2ZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQwODc1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjE2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzEiCi0JCQkJCWNsaWVudCAgICAgCUAxMjA4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTk0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNzI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MTUsIDY3OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDMwNjU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzEiIEAxMjEyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwOAotCQkJCQlsb2NhdGlvbiAgIAkoLTIzNCwgMTE0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjEsIDU3NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUQzQTkwMzcwIgotCQkJCQljbGllbnQgICAgIAlAMTIwOAotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYyLCA2NDIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjIsIDU1OSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMyIiBAMTIxNAotCQkJCWxvY2F0aW9uICAgCSg3NSwgMTg4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFQ0YwMDA1RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMzIiBAMTIxNQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTQKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIC0zMDgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjQwMDFFIgotCQkJCQljbGllbnQgICAgIAlAMTIxNAotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NSwgMTg4KQotCQkJCQkgICAgKDc1LCAxMjgpCi0JCQkJCSAgICAoNTEwLCAxMjgpCi0JCQkJCSAgICAoNTEwLCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDE4OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFZlcnNpb24iIEAxMjE2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIxNAotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2LCA3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VmVyc2lvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjU5Mzc1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMjgiCi0JCQkJCWNsaWVudCAgICAgCUAxMjE0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc1LCAxODgpCi0JCQkJCSAgICAoNzUsIDM4MCkKLQkJCQkJICAgICg0MzcsIDM4MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAzODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDM2OCwgMzI4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzQ3NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjM0IiBAMTIxOQotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAxMzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEIwMTFCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzUiIEAxMjIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIxOQotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRDBGMDEyMSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMTkKLQkJCQkJc3VwcGxpZXIgICAJQDExOTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMTM0KQotCQkJCQkgICAgKDc2NiwgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc2NiwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JpZ2luYWxWZXJzaW9uIiBAMTIyMQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTkKLQkJCQkJbG9jYXRpb24gICAJKDMzNCwgLTM2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE2NCwgOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JpZ2luYWxWZXJzaW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNjUwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTJCIgotCQkJCQljbGllbnQgICAgIAlAMTIxOQotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAxMzQpCi0JCQkJCSAgICAoMTMyMiwgMTM0KQotCQkJCQkgICAgKDEzMjIsIDMzNCkKLQkJCQkJICAgICg4NDMsIDMzNCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAxMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NDMsIDMzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODEwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzYiIEAxMjI0Ci0JCQkJbG9jYXRpb24gICAJKDEyNiwgNjU2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjVFRUFCMDAxRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM3IiBAMTIyNQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjQKLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMEIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDUxMywgNjU2KQotCQkJCQkgICAgKDUxMywgNTU5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEzLCA1NTkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRWZXJzaW9ucyIgQDEyMjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtODM0LCAxNjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNywgNDMxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2luY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NDM5MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUVBRjAxMTUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTk1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNiwgNjU2KQotCQkJCQkgICAgKDY2LCA2NTYpCi0JCQkJCSAgICAoNjYsIDQ3MikKLQkJCQkJICAgICg0MzcsIDQ3MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYsIDY1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQzNywgNDcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzNTYsIDUyNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY4NDY4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MCIgQDEyMjkKLQkJCQlsb2NhdGlvbiAgIAkoNjQyLCAxMjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzMwMTk0IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDEiIEAxMjMwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIyOQotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUYxIgotCQkJCQljbGllbnQgICAgIAlAMTIyOQotCQkJCQlzdXBwbGllciAgIAlAMTE5NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2NDIsIDEyNikKLQkJCQkJICAgICg1ODgsIDEyNikKLQkJCQkJICAgICg1ODgsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OCwgMjczKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2NoZW1hRm9yU2NoZW1hIiBAMTIzMQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjkKLQkJCQkJbG9jYXRpb24gICAJKDgyLCAtNDE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MzksIDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzg0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NjaGVtYUZvclNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA1NTU1NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc4NDc1MDFGQiIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjkKLQkJCQkJc3VwcGxpZXIgICAJQDExOTUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjQyLCAxMjYpCi0JCQkJCSAgICAoNjk3LCAxMjYpCi0JCQkJCSAgICAoNjk3LCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjQyLCAxMjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2OTcsIDI3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQzLCAyMTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwMTg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEyMzQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDExOTMKLQkJCQlzdXBwbGllciAgIAlAMTE5NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzOCwgOTM3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzgsIDg0MykpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTIzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDY3LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0OTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODAiIEAxMjM2Ci0JCQkJbG9jYXRpb24gICAJKDIzNCwgMTM0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2QjAxOTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgxIiBAMTIzNwotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzYKLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDAsIDEyNzEpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMwOSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzYKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDE4MSwgMTM0MCkKLQkJCQkJICAgICgxODEsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxLCAxMjM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyMzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjM2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzEwLCAtNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI0MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzMzLCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjg2NzkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0MjZEMDMxMyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzYKLQkJCQkJc3VwcGxpZXIgICAJQDEyMzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0LCAxMzQwKQotCQkJCQkgICAgKDI4NywgMTM0MCkKLQkJCQkJICAgICgyODcsIDEyMzkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCAxMzQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjg3LCAxMjM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDEyOTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0Mjk0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEyNDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYwLCAxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE3LCAxMDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwNAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDEyNDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzEyLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk5LCAzNzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTI0NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTQiIEAxMjQ0Ci0JCQkJbG9jYXRpb24gICAJKDE2NjgsIDI4MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRTAxQ0MiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxNSIgQDEyNDUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ0Ci0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEFGMDEwRiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNDQKLQkJCQkJc3VwcGxpZXIgICAJQDEyNDIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjgsIDI4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjgsIDE5OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY0ZhY2V0cyIgQDEyNDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ0Ci0JCQkJCWxvY2F0aW9uICAgCSg4LCAtMTUyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODUyLCAzMDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNDYxNTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTFBIgotCQkJCQljbGllbnQgICAgIAlAMTI0NAotCQkJCQlzdXBwbGllciAgIAlAMTI0MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMzYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjI1LCAzMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjkyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEyNDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDI2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEAxMjUwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc3NiwgNjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxNSwgNTk3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxNiIgQDEyNTEKLQkJCQlsb2NhdGlvbiAgIAkoMTUwOCwgNzkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQzMDI4RSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzE3IiBAMTI1MgotCQkJCQlQYXJlbnRfVmlldyAJQDEyNTEKLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRjMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjUxCi0JCQkJCXN1cHBsaWVyICAgCUAxMjUwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA2OTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNQYXJ0aWNsZSIgQDEyNTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjUxCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIsIC0yODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDc2NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjI1OTI1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRENDAyRkQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjUxCi0JCQkJCXN1cHBsaWVyICAgCUAxMjQ5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA4LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTA4LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NTQsIDgyOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzk1MDYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkyIiBAMTI1NwotCQkJCWxvY2F0aW9uICAgCSg5MTksIDEzNDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNUUwMUY5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MyIgQDEyNTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyNSwgMTI3MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDQ2IgotCQkJCQljbGllbnQgICAgIAlAMTI1NwotCQkJCQlzdXBwbGllciAgIAlAMTI1NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoODY2LCAxMzQ5KQotCQkJCQkgICAgKDg2NiwgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDEyMzkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEyNjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjMzLCAtNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk5MywgMTM5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzc3MzU4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNjIwMDUwIgotCQkJCQljbGllbnQgICAgIAlAMTI1NwotCQkJCQlzdXBwbGllciAgIAlAMTI1NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MTksIDEzNDkpCi0JCQkJCSAgICAoOTczLCAxMzQ5KQotCQkJCQkgICAgKDk3MywgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTksIDEzNDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NzMsIDEyMzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDkxOSwgMTI5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAxNDkyNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDEyNjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTUyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODE2LCA5MDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMTgiIEAxMjY0Ci0JCQkJbG9jYXRpb24gICAJKDIwMjUsIDc5MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREOTAxRjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxOSIgQDEyNjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY0Ci0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0REEwMjg0IgotCQkJCQljbGllbnQgICAgIAlAMTI2NAotCQkJCQlzdXBwbGllciAgIAlAMTI1MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAyNSwgNzkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyNSwgNjk1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljV2lsZGNhcmQiIEAxMjY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI2NAotCQkJCQlsb2NhdGlvbiAgIAkoMTUzLCAtMjgwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjY3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA4MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ4ODA5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUAxMjY0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjYzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA4ODkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwOTgsIDg0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTA2MTczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMyMCIgQDEyNjkKLQkJCQlsb2NhdGlvbiAgIAkoMTc1NCwgMTE3OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRDRDNjhGRjAxQkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMyMSIgQDEyNzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE3IgotCQkJCQljbGllbnQgICAgIAlAMTI2OQotCQkJCQlzdXBwbGllciAgIAlAMTI1NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NCwgMTE3OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDEsIDExNzgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyNzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTk4LCAyMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjgsIDEyNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc3ludGhldGljV2lsZGNhcmQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE2MzM1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEM2OTAyMDMxOCIKLQkJCQkJY2xpZW50ICAgICAJQDEyNjkKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTc1NCwgMTE3OCkKLQkJCQkJICAgICgyMDI4LCAxMTc4KQotCQkJCQkgICAgKDIwMjgsIDk5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjAyOCwgOTk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgyLCAxMDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM2NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjEwLiBEaWFnbm9zdGljcyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNUYwODAzRTIiCi0JCQl0aXRsZSAgICAgIAkiMTAuIERpYWdub3N0aWNzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTU5vZGUiIEAxMjc0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCA5OTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRPTU5vZGUiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJCXdpZHRoICAgICAgCTY4NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljU2V2ZXJpdHkiIEAxMjc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDY1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxOCwgNTQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA0OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY4QTcwMzJGIgotCQkJCXdpZHRoICAgICAgCTQ2MgotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMjc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1OSwgNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODk2LCAxMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NDAsIDY0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcxMwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk3MzEKLQkJCQloZWlnaHQgICAgIAkxMjUKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyNzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCA2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NCwgNDAyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCXdpZHRoICAgICAgCTY1OAotCQkJCWhlaWdodCAgICAgCTQzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjIiIEAxMjc5Ci0JCQkJbG9jYXRpb24gICAJKDE0NCwgMjgzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2NDMxMDM1RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIzIiBAMTI4MAotCQkJCQlQYXJlbnRfVmlldyAJQDEyNzkKLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNiIKLQkJCQkJY2xpZW50ICAgICAJQDEyNzkKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAxNzYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbGxEaWFnbm9zdGljcyIgQDEyODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjc5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTA4OCwgLTY2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzA5LCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYWxsRGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0ODU5OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTY1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjQzMjAxQzciCi0JCQkJCWNsaWVudCAgICAgCUAxMjc5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQsIDI4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMzI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MjA1NjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE4IiBAMTI4NAotCQkJCWxvY2F0aW9uICAgCSgxMDI4LCA0NDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMjcwM0NEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTkiIEAxMjg1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI4NAotCQkJCQlsb2NhdGlvbiAgIAkoLTM5NiwgLTcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2MSIKLQkJCQkJY2xpZW50ICAgICAJQDEyODQKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcxMywgNDQwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcG9uZW50cyIgQDEyODYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkzOCwgMjMwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBvbmVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyOTE4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyQjAwNkMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjg0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwMjgsIDQ0MCkKLQkJCQkJICAgICgxMDg4LCA0NDApCi0JCQkJCSAgICAoMTA4OCwgMTc0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjgsIDQ0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODgsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0MywgMjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjM4NDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIwIiBAMTI4OQotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDI4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2OTAxNjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMSIgQDEyOTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjg5Ci0JCQkJCWxvY2F0aW9uICAgCSgxNjAsIC0yNzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyNkEwMDI2IgotCQkJCQljbGllbnQgICAgIAlAMTI4OQotCQkJCQlzdXBwbGllciAgIAlAMTI3NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCAyODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2ODgsIDE3NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImRpYWdub3N0aWNzIiBAMTI5MQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODkKLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIyLCAzMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGlhZ25vc3RpY3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MjYzMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjciCi0JCQkJCWNsaWVudCAgICAgCUAxMjg5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDUsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDk0NzM3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI5NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEMwRjRDMDFBMSIKLQkJCQljbGllbnQgICAgIAlAMTI3OAotCQkJCXN1cHBsaWVyICAgCUAxMjc3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAzOTApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTc0KSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjExLiBTdXBwbGVtZW50YWwiCi0JCQlxdWlkICAgICAgIAkiM0MyODdFNDkwMTlCIgotCQkJdGl0bGUgICAgICAJIjExLiBTdXBwbGVtZW50YWwiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTI5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NjQsIDgxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA3NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODM0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk4NTIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMjk2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxMTIsIDg4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzEsIDgyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNzgwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IiBAMTI5NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDYyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIgQDEyOTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzg0LCAxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMjM2LCA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlhZ25vc3RpYyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ0IiBAMTI5OQotCQkJCWxvY2F0aW9uICAgCSgxMzgyLCA4NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNTAxMzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInByaW1hcnlDb21wb25lbnQiIEAxMzAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI5OQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1MCwgLTUwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzAwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzU2LCAxMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcHJpbWFyeUNvbXBvbmVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzQwODI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEzIgotCQkJCQljbGllbnQgICAgIAlAMTI5OQotCQkJCQlzdXBwbGllciAgIAlAMTI5NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MzcsIDg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MjQsIDU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTcyNjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NSIgQDEzMDMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjk5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzA0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDU4LCAxMjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MkM3MDExMiIKLQkJCQkJY2xpZW50ICAgICAJQDEyOTkKLQkJCQkJc3VwcGxpZXIgICAJQDEyOTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyNywgODQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEzMDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTYwLCA2ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzc4LCA2MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDY2NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk3MjIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlIDogYm9vbGVhbiIKLQkJCQkJIisgY2lyY3VsYXIgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNzgyCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTMwNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDEwNzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCA5OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMCwgMTA1OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIzCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGZhY2V0TmFtZSA6IFN0cmluZyIKLQkJCQkJIisgZWZmZWN0aXZlVmFsdWUgOiBWYWx1ZSIpKQotCQkJCXdpZHRoICAgICAgCTQ1OAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDEzMDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0NDgsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ3LCA1NjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDYyOCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjkKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbW9kZWxHcm91cERlZmluaXRpb25SZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJODIwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IiBAMTMwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDI4OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDE1OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDA1LCAyMjUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTM1NgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBhbGlhc05hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHVSSSA6IFN0cmluZyIKLQkJCQkJIisgYWxpYXNVUkkgOiBTdHJpbmciCi0JCQkJCSIrIHFOYW1lIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDcyCi0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAMTMwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDM1MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4LCAyOTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU2MgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMzEwCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgNTEwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgzMjAsIDUxMCkKLQkJCQkgICAgKDMyMCwgNDIwKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTMxMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM0MDA5MCIKLQkJCQljbGllbnQgICAgIAlAMTMwNwotCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODEsIDU1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODEsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMzEwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzMTIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDEyOTUKLQkJCQlzdXBwbGllciAgIAlAMTMwOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg3NywgNzQ4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMzEwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhJbmNsdXNpdmVGYWNldCIgQDEzMTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAxODA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMSwgMTc2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDU2Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkluY2x1c2l2ZUZhY2V0IiBAMTMxNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgMTc3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDM1LCAxNzI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5JbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQl3aWR0aCAgICAgIAk0OTMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiIEAxMzE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE4ODkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5MkQwMDBBIgotCQkJCXdpZHRoICAgICAgCTQ5MwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhFeGNsdXNpdmVGYWNldCIgQDEzMTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzA0LCAxOTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3MywgMTkxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4RXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg5NjAwQzIiCi0JCQkJd2lkdGggICAgICAJNDgwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEAxMzE3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzQsIDEzNzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENhcmRpbmFsaXR5RmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREJvdW5kZWRGYWNldCIgQDEzMTgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzUyLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE2MywgMTIxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQm91bmRlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc1MUQwMzQ0IgotCQkJCXdpZHRoICAgICAgCTM5NgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEAxMzE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI0LCAxMzkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDMsIDEzNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAkzODAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBAMTMyMAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTIzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5LCAxMTc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROdW1lcmljRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJd2lkdGggICAgICAJNDAwCi0JCQkJaGVpZ2h0ICAgICAJMTMyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IiBAMTMyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMzYsIDE2MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM1LCAxNTM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE2MDMpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MwotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBpbmNsdXNpdmUgOiBib29sZWFuIgotCQkJCQkiKyBleGNsdXNpdmUgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDEzMjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyMjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjIzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2hpdGVTcGFjZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJCXdpZHRoICAgICAgCTQ1NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTMyMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDI2MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDc0LCAyNTcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QkUwMkVFIgotCQkJCXdpZHRoICAgICAgCTQ3OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXR0ZXJuRmFjZXQiIEAxMzI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMjEyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxOTYsIDIwNzYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIgQDEzMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIwOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNiwgMjA0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERW51bWVyYXRpb25GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCQl3aWR0aCAgICAgIAk0NTgKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEAxMzI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAyMjcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDIyMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIgQDEzMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE1ODQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTUwNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMTU3MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEAxMzI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMjQ2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMTEsIDI0MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJCXdpZHRoICAgICAgCTQzNgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDEzMjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOSwgMjM5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDIwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRvdGFsRGlnaXRzRmFjZXQiIEAxMzMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAyNjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDI1NTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRvdGFsRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJd2lkdGggICAgICAJNDIyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDEzMzEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NjcsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEAxMzMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAxMDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTAsIDEwMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDEzMzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzA0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0NCwgMTM2NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgdmFsaWRGYWNldHMgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk1OTQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU2IiBAMTMzNAotCQkJCWxvY2F0aW9uICAgCSgxNDQ2LCAxMjE4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBOTk0MDMwQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGVEZWZpbml0aW9uIiBAMTMzNQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzQKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTgwLCAxMTczKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTMuMjY4MjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEREIgotCQkJCQljbGllbnQgICAgIAlAMTMzNAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDQ2LCAxMjE4KQotCQkJCQkgICAgKDE0ODcsIDEyMTgpCi0JCQkJCSAgICAoMTQ4NywgMTI5MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTI5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQzOSwgMTI1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjE4NDIxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU3IiBAMTMzOAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzQKLQkJCQkJbG9jYXRpb24gICAJKDU4MiwgLTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBOTk3MDBFNyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ0NiwgMTIxOCkKLQkJCQkJICAgICgxNDA1LCAxMjE4KQotCQkJCQkgICAgKDE0MDUsIDEyOTIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0NiwgMTIxOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDUsIDEyOTIpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2MCIgQDEzMzkKLQkJCQlsb2NhdGlvbiAgIAkoMTczMywgMTU3NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RDAyNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MSIgQDEzNDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzM5Ci0JCQkJCWxvY2F0aW9uICAgCSg5MTcsIDcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDkxIgotCQkJCQljbGllbnQgICAgIAlAMTMzOQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzMzLCAxNTc1KQotCQkJCQkgICAgKDE0ODcsIDE1NzUpCi0JCQkJCSAgICAoMTQ4NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEZhY2V0IiBAMTM0MQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzkKLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgMTU0MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQ2MjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwOEUwMDlCIgotCQkJCQljbGllbnQgICAgIAlAMTMzOQotCQkJCQlzdXBwbGllciAgIAlAMTMyMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczMywgMTU3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE1NzUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDIsIDE1MzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTE1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjIiIEAxMzQ0Ci0JCQkJbG9jYXRpb24gICAJKDE1ODcsIDE3OTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUIwMzk2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjMiIEAxMzQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0NAotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUMwM0M5IgotCQkJCQljbGllbnQgICAgIAlAMTM0NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTg3LCAxNzkzKQotCQkJCQkgICAgKDE0NDcsIDE3OTMpCi0JCQkJCSAgICAoMTQ0NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heEluY2x1c2l2ZUZhY2V0IiBAMTM0NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDQKLQkJCQkJbG9jYXRpb24gICAJKDcwNywgLTMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzM3LCAxNzUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEluY2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yOTg0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzRDQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzEzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTg3LCAxNzkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MiwgMTc5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyMCwgMTc1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU5MTU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2NCIgQDEzNDkKLQkJCQlsb2NhdGlvbiAgIAkoOTM3LCAxNzg3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEFGMDMzOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjY1IiBAMTM1MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDkKLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMUY5IgotCQkJCQljbGllbnQgICAgIAlAMTM0OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5MzcsIDE3ODcpCi0JCQkJCSAgICAoOTk3LCAxNzg3KQotCQkJCQkgICAgKDk5NywgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MzcsIDE3ODcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5OTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5JbmNsdXNpdmVGYWNldCIgQDEzNTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ5Ci0JCQkJCWxvY2F0aW9uICAgCSg2MTcsIC01KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3OTIsIDE3NDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0NjA2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEIwMDIwMyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTc4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCAxNzQzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM5NjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjY2IiBAMTM1NAotCQkJCWxvY2F0aW9uICAgCSg5ODEsIDE5MzcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjMwMjA3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjciIEAxMzU1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM1NAotCQkJCQlsb2NhdGlvbiAgIAkoNjc3LCAtNzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjQwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTM1NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5ODEsIDE5MzcpCi0JCQkJCSAgICAoMTA0MSwgMTkzNykKLQkJCQkJICAgICgxMDQxLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNDEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5FeGNsdXNpdmVGYWNldCIgQDEzNTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU0Ci0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODIzLCAxOTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNDEyNTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzU0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODEsIDE5MzcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTgsIDE5MzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4OSwgMTg5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODQ2NjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2OCIgQDEzNTkKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2OSwgMTk1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNjAyOEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2OSIgQDEzNjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU5Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNzAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMzU5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NjksIDE5NTMpCi0JCQkJCSAgICAoMTQwMCwgMTk1MykKLQkJCQkJICAgICgxNDAwLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDAwLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RXhjbHVzaXZlRmFjZXQiIEAxMzYxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM1OQotCQkJCQlsb2NhdGlvbiAgIAkoNjIxLCAtOTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDYsIDE5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIyMSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NjksIDE5NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY0LCAxOTUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTYxLCAxOTEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjcyMzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcwIiBAMTM2NAotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMTgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDA1MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjcxIiBAMTM2NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjQKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMzY0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImxlbmd0aEZhY2V0IiBAMTM2NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjQKLQkJCQkJbG9jYXRpb24gICAJKC0zMTgsIDYyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA0LCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2xlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzU0NzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCQzAyNTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzY0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzI2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMjIsIDIxODApCi0JCQkJCSAgICAoMTEyMiwgMjI0MCkKLQkJCQkJICAgICgzODcsIDIyNDApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjE4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjI0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcxLCAyMjA0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTU1OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc0IiBAMTM2OQotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAxOTg5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEMyMDIxRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc1IiBAMTM3MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjkKLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFCIgotCQkJCQljbGllbnQgICAgIAlAMTM2OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMTk4OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbnVtZXJhdGlvbkZhY2V0cyIgQDEzNzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM4MCwgNDM3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzcsIDIwMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZW51bWVyYXRpb25GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ2NTg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMzMDBBQyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA4NCwgMTk4OSkKLQkJCQkJICAgICgxMDg0LCAyMDQ5KQotCQkJCQkgICAgKDQ4NSwgMjA0OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDg1LCAyMDQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODMsIDIwMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1MTI5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzYiIEAxMzc0Ci0JCQkJbG9jYXRpb24gICAJKDE0NTEsIDIwNzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzUwMTU5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzciIEAxMzc1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM3NAotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MjUsIDUzOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNjAwQjAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NTEsIDIwNzQpCi0JCQkJCSAgICAoMTM2MiwgMjA3NCkKLQkJCQkJICAgICgxMzYyLCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicGF0dGVybkZhY2V0cyIgQDEzNzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzIwLCAyMDM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3BhdHRlcm5GYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM2NzIyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTEsIDIwNzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMDc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTcyLCAyMDM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDg2NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc4IiBAMTM3OQotCQkJCWxvY2F0aW9uICAgCSgxODI3LCAxNDAwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEM4MDJBNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc5IiBAMTM4MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzkKLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFFQSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxNDAwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY2FyZGluYWxpdHlGYWNldCIgQDEzODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE0OSwgLTQ3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg0NywgMTM1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjYXJkaW5hbGl0eUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzE3MzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDOTAxRjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzc5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI3LCAxNDAwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgMTQwMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MywgMTM1NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODYzNDI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4OCIgQDEzODQKLQkJCQlsb2NhdGlvbiAgIAkoMTI2MiwgMjQxMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQjAzNzciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4OSIgQDEzODUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzg0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzg2LCAzMDEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREMwMzVBIgotCQkJCQljbGllbnQgICAgIAlAMTM4NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTM4NgotCQkJCQlQYXJlbnRfVmlldyAJQDEzODQKLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwOCwgMjU1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzczOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNjQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzg0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0MTMpCi0JCQkJCSAgICAoMTI2MiwgMjU5NikKLQkJCQkJICAgICgyMDY1LCAyNTk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNTk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTc5LCAyNTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM4ODYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkyIiBAMTM4OQotCQkJCWxvY2F0aW9uICAgCSgxODQxLCAxMzA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEUzMDBEOSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjkzIiBAMTM5MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzODkKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM4RSIKLQkJCQkJY2xpZW50ICAgICAJQDEzODkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTI5LCAxMzA2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYm91bmRlZEZhY2V0IiBAMTM5MQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODkKLQkJCQkJbG9jYXRpb24gICAJKC0xMTM1LCAtNzkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODMyLCAxMjcwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2JvdW5kZWRGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAzMTc0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEU0MDM5OCIKLQkJCQkJY2xpZW50ICAgICAJQDEzODkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NDEsIDEzMDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTU0LCAxMzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDc3LCAxMjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTQ3MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjcyIiBAMTM5NAotCQkJCWxvY2F0aW9uICAgCSgxMzI4LCAyMTg2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEJGMDE4QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjczIiBAMTM5NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTQKLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzk0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMTg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIndoaXRlU3BhY2VGYWNldCIgQDEzOTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjQwLCA2MzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzMsIDIyMDcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrd2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTA5MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMDAwNzUiCi0JCQkJCWNsaWVudCAgICAgCUAxMzk0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIxODYpCi0JCQkJCSAgICAoMTMyOCwgMjI0NikKLQkJCQkJICAgICgyMDkzLCAyMjQ2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMjQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDMzLCAyMjAzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY3NjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkwIiBAMTM5OQotCQkJCWxvY2F0aW9uICAgCSg2NzQsIDEzOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwMDQ4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTEiIEAxNDAwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM5OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwREYwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTM5OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjc0LCAxMzkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMzkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAib3JkZXJlZEZhY2V0IiBAMTQwMQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTkKLQkJCQkJbG9jYXRpb24gICAJKC0xODU0LCAtNzA2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NTgsIDEzNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrb3JkZXJlZEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNjE1MzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzk5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzE5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgMTM1NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjM0NjE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4MCIgQDE0MDQKLQkJCQlsb2NhdGlvbiAgIAkoNjg3LCAxMjk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENCMDM5QyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgxIiBAMTQwNQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDQKLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMENDMDNEMCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4NywgMTI5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkzNSwgMTI5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm51bWVyaWNGYWNldCIgQDE0MDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDA0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgwOSwgLTU3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDA2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjY4LCAxMjU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK251bWVyaWNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDgwOTcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QxIgotCQkJCQljbGllbnQgICAgIAlAMTQwNAotCQkJCQlzdXBwbGllciAgIAlAMTMyMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQwLCAxMjk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MDYsIDEyNjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNjg0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTQiIEAxNDA5Ci0JCQkJbG9jYXRpb24gICAJKDE2ODksIDE2NjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDQwMUVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTUiIEAxNDEwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNDA5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2ODksIDE2NjIpCi0JCQkJCSAgICAoMTQ4NywgMTY2MikKLQkJCQkJICAgICgxNDg3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2ODksIDE2NjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWF4RmFjZXQiIEAxNDExCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwOQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MywgLTM1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2OSwgMTYyMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTgyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI0NDUwMzZBIgotCQkJCQljbGllbnQgICAgIAlAMTQwOQotCQkJCQlzdXBwbGllciAgIAlAMTMyMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMjYsIDE2NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNDQsIDE2MjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxNTM4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTYiIEAxNDE0Ci0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIyNTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NEYwMTQ1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTciIEAxNDE1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQxNAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1NTAwMzhDIgotCQkJCQljbGllbnQgICAgIAlAMTQxNAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiIEAxNDE2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQxNAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwNzIsIC00NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDIyODgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDg1NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOTYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDE0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMjgsIDIyNTgpCi0JCQkJCSAgICAoMTMyOCwgMjMyNCkKLQkJCQkJICAgICgyMDkzLCAyMzI0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIyNTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkzLCAyMzI0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDE4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA5LCAyMjkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg4MTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk4IiBAMTQxOQotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzY2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNUM0MDExQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk5IiBAMTQyMAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTkKLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzUwMjBEIgotCQkJCQljbGllbnQgICAgIAlAMTQxOQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIgQDE0MjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDE5Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjA3LCAtNzIyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjU3LCAyNDYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heExlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MjY5MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMTciCi0JCQkJCWNsaWVudCAgICAgCUAxNDE5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyOTcsIDIzNjYpCi0JCQkJCSAgICAoMTI5NywgMjQ5OSkKLQkJCQkJICAgICgyMTAyLCAyNDk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzNjYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDk5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDA3LCAyNDcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTkzMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTI5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAwIiBAMTQyNAotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDQ5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNjJBMDBBQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAxIiBAMTQyNQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjQKLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDEzOCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjYyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRnJhY3Rpb25EaWdpdHNGYWNldCIgQDE0MjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDI0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE3MCwgLTgxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgMjYzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODUzMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjYyQjAxNDIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDI0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzIzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDI0NDkpCi0JCQkJCSAgICAoMTI2MiwgMjY2OCkKLQkJCQkJICAgICgyMDY1LCAyNjY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDI0NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY1LCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTg5LCAyNjI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjY0ODUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAyIiBAMTQyOQotCQkJCWxvY2F0aW9uICAgCSgxNDIyLCAyMTU5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCNkIwMDNBNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAzIiBAMTQzMAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjkKLQkJCQkJbG9jYXRpb24gICAJKC03NzAsIC0xMzEzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQyMiwgMjE1OSkKLQkJCQkJICAgICgxMzYyLCAyMTU5KQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyMiwgMjE1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiIEAxNDMxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQyOQotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjcsIDIxMjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlUGF0dGVybkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTkwOTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjZCMTAzMTIiCi0JCQkJCWNsaWVudCAgICAgCUAxNDI5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzI0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE4NywgMjE1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEwMiwgMjExOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg5MjI2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNCIgQDE0MzQKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NCwgMjA4MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQTAyNkIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNSIgQDE0MzUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM0Ci0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCN0NCMDE4NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg0LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIgQDE0MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM0Ci0JCQkJCWxvY2F0aW9uICAgCSg4MjgsIC0xMzczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDIxMDEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlRW51bWVyYXRpb25GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4NjE5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTQzNAotCQkJCQlzdXBwbGllciAgIAlAMTMyNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg0LCAyMDgzKQotCQkJCQkgICAgKDEwODQsIDIxNDMpCi0JCQkJCSAgICAoNDg1LCAyMTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDIwODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIxNDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzMSwgMjEwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTMxNzE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMCIgQDE0MzkKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMiwgMjI0MSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAwNTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMxMSIgQDE0NDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0I5IgotCQkJCQljbGllbnQgICAgIAlAMTQzOQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVMZW5ndGhGYWNldCIgQDE0NDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDM5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjYsIC00NzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDkxNzMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4REMwM0MzIgotCQkJCQljbGllbnQgICAgIAlAMTQzOQotCQkJCQlzdXBwbGllciAgIAlAMTMyNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTIyLCAyMjQxKQotCQkJCQkgICAgKDExMjIsIDIzMTgpCi0JCQkJCSAgICAoMzg3LCAyMzE4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIyNDEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzODcsIDIzMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ3MCwgMjI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4NTY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1OCIgQDE0NDQKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAxNTY1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDg1MDI1QiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU5IiBAMTQ0NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDQKLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjcwIgotCQkJCQljbGllbnQgICAgIAlAMTQ0NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDE1NjUpCi0JCQkJCSAgICAoOTU5LCAxNTY1KQotCQkJCQkgICAgKDk1OSwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDE1NjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5GYWNldCIgQDE0NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ0Ci0JCQkJCWxvY2F0aW9uICAgCSg0NjksIDEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTMsIDE1MzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MzA5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMDg2MDI3QSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTU2NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM0LCAxNTIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEyIiBAMTQ0OQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDE2NTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzAwMURCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTMiIEAxNDUwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0OQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBDRiIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODE2LCAxNjUwKQotCQkJCQkgICAgKDk1OSwgMTY1MCkKLQkJCQkJICAgICg5NTksIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWZmZWN0aXZlTWluRmFjZXQiIEAxNDUxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0OQotCQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAtMzM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjQsIDE2MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWluRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE0MTYxOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCOTcxMDBEOSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NDkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgxNiwgMTY1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMTY1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDUxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAxNjA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDI3NDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgyIiBAMTQ1NAotCQkJCWxvY2F0aW9uICAgCSgxMjk3LCAyMzIxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMENGMDE5OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgzIiBAMTQ1NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTQKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDU0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1heExlbmd0aEZhY2V0IiBAMTQ1NgotCQkJCQlQYXJlbnRfVmlldyAJQDE0NTQKLQkJCQkJbG9jYXRpb24gICAJKC03MTksIDQ5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgMjM4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhMZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDcyMjU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDIwMDhGIgotCQkJCQljbGllbnQgICAgIAlAMTQ1NAotCQkJCQlzdXBwbGllciAgIAlAMTMyOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjk3LCAyMzIxKQotCQkJCQkgICAgKDEyOTcsIDI0MDkpCi0JCQkJCSAgICAoMjEwMiwgMjQwOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMiwgMjQwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk5NCwgMjM2NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODc5MjA4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NCIgQDE0NTkKLQkJCQlsb2NhdGlvbiAgIAkoMTE1OSwgMjI3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENTAwQzUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NSIgQDE0NjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQ1OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtaW5MZW5ndGhGYWNldCIgQDE0NjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDU5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjgxLCA0NDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NywgMjM3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTE5NTI3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDYwMDI3IgotCQkJCQljbGllbnQgICAgIAlAMTQ1OQotCQkJCQlzdXBwbGllciAgIAlAMTMyOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTU5LCAyMjczKQotCQkJCQkgICAgKDExNTksIDI0MDkpCi0JCQkJCSAgICAoNDUwLCAyNDA5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNTksIDIyNzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0MDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyMywgMjM2OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEzNjEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwOCIgQDE0NjQKLQkJCQlsb2NhdGlvbiAgIAkoMTE5NywgMjMzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5ODAxNkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwOSIgQDE0NjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY0Ci0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDU2IgotCQkJCQljbGllbnQgICAgIAlAMTQ2NAotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIgQDE0NjYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY0Ci0JCQkJCWxvY2F0aW9uICAgCSg5NDEsIC02MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1NiwgMjQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTUyNjA0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4OTkwMDYwIgotCQkJCQljbGllbnQgICAgIAlAMTQ2NAotCQkJCQlzdXBwbGllciAgIAlAMTMyOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMTk3LCAyMzM0KQotCQkJCQkgICAgKDExOTcsIDI0OTMpCi0JCQkJCSAgICAoNDUwLCAyNDkzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDIzMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDI0OTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNywgMjQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE2MDQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNiIgQDE0NjkKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjQzOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MDAwNjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNyIgQDE0NzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY5Ci0JCQkJCWxvY2F0aW9uICAgCSg4NjMsIC03NDYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDFEIgotCQkJCQljbGllbnQgICAgIAlAMTQ2OQotCQkJCQlzdXBwbGllciAgIAlAMTMzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVUb3RhbERpZ2l0c0ZhY2V0IiBAMTQ3MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjkKLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCAyNjMyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU5NzAzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCODQxMDAyNyIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjkKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIzMSwgMjQzOCkKLQkJCQkJICAgICgxMjMxLCAyNjY4KQotCQkJCQkgICAgKDQ1MSwgMjY2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNjY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDI2MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxODgxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODYiIEAxNDc0Ci0JCQkJbG9jYXRpb24gICAJKDEyMzEsIDIzOTcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwMERFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODciIEAxNDc1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ3NAotCQkJCQlsb2NhdGlvbiAgIAkoLTIwOSwgMjUzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNDRCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NzQKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDIzOTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjMxLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidG90YWxEaWdpdHNGYWNldCIgQDE0NzYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDc0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1MywgMjU1MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0b3RhbERpZ2l0c0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41ODU1NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAzRDciCi0JCQkJCWNsaWVudCAgICAgCUAxNDc0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMzMwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyMzEsIDIzOTcpCi0JCQkJCSAgICAoMTIzMSwgMjU4NykKLQkJCQkJICAgICg0NTEsIDI1ODcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MSwgMjU4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTM1LCAyNTYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTQ2NDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxNDc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDc2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTksIDU3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJNDQ0Ci0JCQkJaGVpZ2h0ICAgICAJNDEzCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE0ODAKLQkJCQlsb2NhdGlvbiAgIAkoMTIwOSwgMTA2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTIwOSwgMTA2NSkKLQkJCQkgICAgKDEyMDksIDk3NCkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDIiIEAxNDgxCi0JCQkJbG9jYXRpb24gICAJKDEwOTAsIDEwMzEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjUwM0Q5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxNDgyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQ4MQotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0ODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg5NywgMTAzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wOTg3NjUKLQkJCQkJICAgIGhlaWdodCAgICAgCTE5NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDNDIgotCQkJCQljbGllbnQgICAgIAlAMTQ4MQotCQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDk3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDgyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEyMSwgMTAzNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA2MTcyOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQzIiBAMTQ4NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODEKLQkJCQkJbG9jYXRpb24gICAJKDMyMiwgLTI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjg4MEY5MDA0NiIKLQkJCQkJY2xpZW50ICAgICAJQDE0ODEKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwOTAsIDEwMzEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDg4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDgiIEAxNDg2Ci0JCQkJbG9jYXRpb24gICAJKDE1MzgsIDg3MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZEQjAxRTUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlIiBAMTQ4NwotCQkJCQlQYXJlbnRfVmlldyAJQDE0ODYKLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0ODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU4LCA3OTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43NjA4NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTIwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDg2Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDc5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA5MTkpCi0JCQkJCSAgICAoMTQ1NCwgOTE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDkxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwOSwgODc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0OSIgQDE0OTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgxNzgsIDEwNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTZERDAzREUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDg2Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDc5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDg3MykKLQkJCQkJICAgICgxNTM4LCA4MjgpCi0JCQkJCSAgICAoMTQ1NCwgODI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDg3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDgyOCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUwIiBAMTQ5MQotCQkJCWxvY2F0aW9uICAgCSgxNTM1LCA2ODQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTIwMTA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJiYXNlVHlwZSIgQDE0OTIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDkxCi0JCQkJCWxvY2F0aW9uICAgCSgxNzUsIC04NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU1OSwgNTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Jhc2VUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuOTc3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTUxIgotCQkJCQljbGllbnQgICAgIAlAMTQ5MQotCQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM1LCA2ODQpCi0JCQkJCSAgICAoMTUzNSwgNzI4KQotCQkJCQkgICAgKDE0NTQsIDcyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA3MjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MDYsIDY4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNzc3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjUxIiBAMTQ5NQotCQkJCQlQYXJlbnRfVmlldyAJQDE0OTEKLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzE0MDE1QiIKLQkJCQkJY2xpZW50ICAgICAJQDE0OTEKLQkJCQkJc3VwcGxpZXIgICAJQDE0NzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzNSwgNjg0KQotCQkJCQkgICAgKDE1MzUsIDY0MSkKLQkJCQkJICAgICgxNDU0LCA2NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzNSwgNjg0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgNjQxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTQiIEAxNDk2Ci0JCQkJbG9jYXRpb24gICAJKDYxMywgOTQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBN0VEMDNDMCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29tcGxleFR5cGUiIEAxNDk3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ5NgotCQkJCQlsb2NhdGlvbiAgIAkoLTc0NywgMTcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDk4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NjUsIDk4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb21wbGV4VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzczMDU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTE3IgotCQkJCQljbGllbnQgICAgIAlAMTQ5NgotCQkJCQlzdXBwbGllciAgIAlAMTMzMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2MTMsIDk0MCkKLQkJCQkJICAgICgyODQsIDk0MCkKLQkJCQkJICAgICgyODQsIDEwMDgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODQsIDEwMDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0OTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNCwgOTcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDkzMjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NSIgQDE1MDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDk2Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RjQwMTIxIgotCQkJCQljbGllbnQgICAgIAlAMTQ5NgotCQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjEzLCA5NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEwLCA5NDApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUwMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlAMTQ3OQotCQkJCXN1cHBsaWVyICAgCUAxMzA5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExMiwgNTYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTEyLCA1MTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTMxMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTAyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUAxMzMxCi0JCQkJc3VwcGxpZXIgICAJQDE0NzkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ2LCAxMDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDE0ODApCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1MiIgQDE1MDMKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MiwgMTEzMykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0QjAxNzgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNpbXBsZVR5cGUiIEAxNTA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTUwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUwNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTA0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5OSwgMTA5NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzaW1wbGVUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjQ2NzUzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE3QiIKLQkJCQkJY2xpZW50ICAgICAJQDE1MDMKLQkJCQkJc3VwcGxpZXIgICAJQDEzMzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCAxMjkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzIxLCAxMDk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjI3MjczCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTMiIEAxNTA3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTUwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1OCwgLTE2MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTc0RDAxODUiCi0JCQkJCWNsaWVudCAgICAgCUAxNTAzCi0JCQkJCXN1cHBsaWVyICAgCUAxNDc5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzYyLCAxMTMzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgOTc0KSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIiBAMTUwOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNzIsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDMwNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDIsIDM3MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGdsb2JhbCA6IGJvb2xlYW4iCi0JCQkJCSIrIGZlYXR1cmVSZWZlcmVuY2UgOiBib29sZWFuIikpCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE1MDkKLQkJCQlsb2NhdGlvbiAgIAkoMjI2MiwgNTY4KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxNTA4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMjYyLCA1NjgpCi0JCQkJICAgICgyMjYyLCA0NzcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTEwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUAxMzA1Ci0JCQkJc3VwcGxpZXIgICAJQDE1MDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQ2LCA1OTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDYsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTA5KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDYiIEAxNTExCi0JCQkJbG9jYXRpb24gICAJKDE1NTMsIDQ1MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMjAxQTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGUiIEAxNTEyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUxMQotCQkJCQlsb2NhdGlvbiAgIAkoODAxLCAyOTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMzEsIDQ5OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYyNjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRTUiCi0JCQkJCWNsaWVudCAgICAgCUAxNTExCi0JCQkJCXN1cHBsaWVyICAgCUAxNDc5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1NTMsIDQ1MykKLQkJCQkJICAgICgxMjIyLCA0NTMpCi0JCQkJCSAgICAoMTIyMiwgNTYyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMjIsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNTEyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4NSwgNDc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTIwMzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NyIgQDE1MTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTExCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTBGMzAyRjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNTExCi0JCQkJCXN1cHBsaWVyICAgCUAxNTA4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTUzLCA0NTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCA0NTMpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOCIgQDE1MTYKLQkJCQlsb2NhdGlvbiAgIAkoMTkwOCwgMzUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwMTA2MDJENyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRGZWF0dXJlIiBAMTUxNwotCQkJCQlQYXJlbnRfVmlldyAJQDE1MTYKLQkJCQkJbG9jYXRpb24gICAJKC0yNjgsIC0xNTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjksIDM1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMxMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEZlYXR1cmUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wMjk0MTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMEIwMDBFIgotCQkJCQljbGllbnQgICAgIAlAMTUxNgotCQkJCQlzdXBwbGllciAgIAlAMTUwOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxOTA4LCAzNTMpCi0JCQkJCSAgICAoMTkwOCwgMzg3KQotCQkJCQkgICAgKDE5OTMsIDM4NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTA4LCAzNTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTkzLCAzODcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1MTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUxNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NDUsIDM1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk2NjM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzkiIEAxNTIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTUxNgotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMTgiCi0JCQkJCWNsaWVudCAgICAgCUAxNTE2Ci0JCQkJCXN1cHBsaWVyICAgCUAxNTA4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE5MDgsIDM1MykKLQkJCQkJICAgICgxOTA4LCAzMTkpCi0JCQkJCSAgICAoMTk5MywgMzE5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDMxOSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTIxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUAxMzA5Ci0JCQkJc3VwcGxpZXIgICAJQDEzMDgKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDQ5NCwgMjg0KQotCQkJCSAgICAoNDk0LCAyNDQpCi0JCQkJICAgICg5OTYsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAyODQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NiwgMjQ0KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTIyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUAxMjk2Ci0JCQkJc3VwcGxpZXIgICAJQDE1MDgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzE4LCA4MTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MTgsIDU2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTA5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1MjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDEzMzMKLQkJCQlzdXBwbGllciAgIAlAMTQ3OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjUsIDEyOTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDEwNjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQ4MCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTI0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUAxNTA4Ci0JCQkJc3VwcGxpZXIgICAJQDEzMDgKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIxNDcsIDI5MSkKLQkJCQkgICAgKDIxNDcsIDI0NCkKLQkJCQkgICAgKDE0NjgsIDI0NCkpCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjE0NywgMjkxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAyNDQpKSkpKSkpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDc2IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6d3NkbCIgQDE1MjUKLQkJCWxvY2F0aW9uICAgCSgyNzIsIDI1NikKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNTI1Ci0JCQkgICAgbG9jYXRpb24gICAJKDEyOCwgMTcyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkid3NkbCIpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlxdWlkdSAgICAgIAkiM0FERkI4RTUwMjFFIgotCQkJd2lkdGggICAgICAJMzAwCi0JCQloZWlnaHQgICAgIAkxODApCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojpzb2FwIiBAMTUyNgotCQkJbG9jYXRpb24gICAJKDcwNCwgMjU2KQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MjYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTYwLCAxNzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJzb2FwIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQTAxQ0YwQzAxQTIiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OnhzZCIgQDE1MjcKLQkJCWxvY2F0aW9uICAgCSgxMTUyLCAyNTYpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTUyNwotCQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCAxNzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJ4c2QiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM5QUJEQzZGMDFBQSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjUiCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA3NyIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NiIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY4IgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFCYXNlU2V0IiA4MDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRGF0YUJhc2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJBTlNJIgotCQkJCXZhbHVlICAgICAgCTgwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIk9yYWNsZSIKLQkJCQl2YWx1ZSAgICAgIAk4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJTUUxTZXJ2ZXIiCi0JCQkJdmFsdWUgICAgICAJODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiU3liYXNlIgotCQkJCXZhbHVlICAgICAgCTgwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIldhdGNvbSIKLQkJCQl2YWx1ZSAgICAgIAk4MDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIklkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZSIKLQkJCXZhbHVlICAgICAgCSJWXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSJfViIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJCYXNlVmlld3MiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc09LIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRERMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJmcmFtZXdvcmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExFbGVtZW50IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklETFNwZWNpZmljYXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiVHlwZWRlZiIKLQkJCQl2YWx1ZSAgICAgIAk1NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkV4Y2VwdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk2MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCIKLQkJCQl2YWx1ZSAgICAgIAk1MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlVuaW9uIgotCQkJCXZhbHVlICAgICAgCTgxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLmJpbmRpbmcuc29hcC9zcmMvcm9zZS9zb2FwYmluZGluZ01kbC5tZGwsIGN0YywgaWJtY3RjIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSURMTW9kdWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLnNvYXAvc3JjL3Jvc2Uvc29hcGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlJhaXNlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIgotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIm1fIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJInNfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb290RGlyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNIgotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdEluIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN1biIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTWljcm9zb2Z0IgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJJQk0iCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdsb2JhbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlQ2xhc3NTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VTcGFjZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyIKLQkJCXZhbHVlICAgICAgCTMpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9zZURlZmF1bHRDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFzdGVyaXNrQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NBdXRob3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzTmF2aWdhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSIzNjAwMDAwMDIiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5OYW1lIgotCQkJdmFsdWUgICAgICAJIl9JRCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTlVNQkVSKDUsMCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9iamVjdFRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJXaGVyZUNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZCIKLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzV3JpdGVOb1Byb2Nlc3NTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyVHlwZVNldCIgMTgwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50IgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclJlZmVyZW5jaW5nTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJNYXBNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTE5MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIgotCQkJCXZhbHVlICAgICAgCTE5MDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ2FsY3VsYXRlZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQUZURVIiCi0JCQkJdmFsdWUgICAgICAJMTgwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJCRUZPUkUiCi0JCQkJdmFsdWUgICAgICAJMTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNURUFEIE9GIgotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJST1ciCi0JCQkJdmFsdWUgICAgICAJMTcwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJTVEFURU1FTlQiCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQiCi0JCQkJdmFsdWUgICAgICAJMTYwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSI2IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29tcG9zaXRlVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJlcG9zaXRvcnkiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVXNlTVNWQyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJlc2VydmVSZWdpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0U3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLnNvYXAvc3JjL3Jvc2Uvc29hcGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5iaW5kaW5nLnNvYXAvc3JjL3Jvc2Uvc29hcGJpbmRpbmdNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEhhc1JlbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkhhc1JlbFR5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDYXNlU3BlY2lmaWVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlByZWNvbXBpbGVkSGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kZW50IgotCQkJdmFsdWUgICAgICAJMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0NsYXNzVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0NsYXNzVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJJbnRlcmZhY2VfUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25fUGFydCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5IgotCQkJdmFsdWUgICAgICAJKCJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmFtaWMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5jcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGVHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpZWxkR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRklFTERfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJKCJPTEVGYWN0b3J5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVGYWN0b3J5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJCdWlsdF9pbiIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ2xhc3NJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRVR5cGVMaWIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWFqb3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliTWlub3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwYXRjaE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tGdW5jdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hEZWZWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQX0lEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnRlcmZhY2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5pdEludGVyZmFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudFNpbmtNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUHJvcE5vdGlmeVNpbmtzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ29ubmVjdGlvblBvaW50SUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDb21tYW5kcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRkNJbXBsZW1lbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFUTF9EZWNsYXJlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25Qb2ludE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNc2dNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBST1BFUlRZX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ09wZXJhdGlvblR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNPcGVyYXRpb25UeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZXNzYWdlX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaF9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRXZlbnRfU2lua19IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RkX09MRV9NZXRob2QiCi0JCQkJdmFsdWUgICAgICAJNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciIKLQkJCQl2YWx1ZSAgICAgIAk3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X0dldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X1NldF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNYWNyb19HZW5lcmF0ZWRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJNZW1iZXJfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlhbG9nX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJGaWVsZF9EYXRhIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlBvaW50ZXJCYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJTQ0MiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlR5cGVMaWJJbXBvcnRlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiCi0JCQkJdmFsdWUgICAgICAJMjEzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiMCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRhYmxlIgotCQkJdmFsdWUgICAgICAJKCJDcmVhdGFibGVTZXQiIDIyMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluaXRpYWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVRlcm1pbmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiQ29sbGVjdGlvbiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiVGV4dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiRvcGVyYXRpb24iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGUkc3VwcGxpZXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUxldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfRUpCX19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NyIpKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBBZGRyZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZWZlYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEFkZHJlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzI2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQWRkcmVzcygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEFkZHJlc3MgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3MgewotCi0KLX0gLy8gU09BUEFkZHJlc3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzU0MTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyNnZXRUcmFuc3BvcnRVUkkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQQmluZGluZygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEJpbmRpbmcgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmcgewotfSAvLyBTT0FQQmluZGluZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEJvZHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBCb2R5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDE2YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEJvZHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldFBhcnRzIDxlbT5QYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBCb2R5KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQQm9keSBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keSB7Ci19IC8vIFNPQVBCb2R5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3N2UzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmFjdG9yeUltcGwoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEJpbmRpbmcgY3JlYXRlU09BUEJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Cb2R5PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJvZHk8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEJvZHkgY3JlYXRlU09BUEJvZHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXIgQmFzZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXIgQmFzZTwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQSGVhZGVyQmFzZSBjcmVhdGVTT0FQSGVhZGVyQmFzZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBGYXVsdCBjcmVhdGVTT0FQRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVNPQVBPcGVyYXRpb24gY3JlYXRlU09BUE9wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkZHJlc3M8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQQWRkcmVzcyBjcmVhdGVTT0FQQWRkcmVzcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhlYWRlciBGYXVsdDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXIgRmF1bHQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEhlYWRlckZhdWx0IGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkhlYWRlcjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5IZWFkZXI8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUEhlYWRlciBjcmVhdGVTT0FQSGVhZGVyKCk7Ci0KLSAgLyoKLSAgICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotCS8vU09BUFBhY2thZ2UgZ2V0U09BUFBhY2thZ2UoKTsKLQotfSAvL1NPQVBGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU2YmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmF1bHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRVc2UgPGVtPlVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBGYXVsdCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEZhdWx0IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdCB7Ci0KLX0gLy8gU09BUEZhdWx0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTMxMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUEhlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlciNnZXRIZWFkZXJGYXVsdHMgPGVtPkhlYWRlciBGYXVsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQSGVhZGVyIGV4dGVuZHMgU09BUEhlYWRlckJhc2UgewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVhZGVyIEZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0fS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWFkZXIgRmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlciBGYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJfSGVhZGVyRmF1bHRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEhlYWRlckZhdWx0cygpOwotCi19IC8vIFNPQVBIZWFkZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWJiOWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5IZWFkZXIgQmFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFBhcnQgPGVtPlBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU09BUEhlYWRlckJhc2UgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0VXNlKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckJhc2VfVXNlKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXRVc2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlI2dldFVzZSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVc2UoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lc3BhY2VVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuY29kaW5nIFN0eWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZV9FbmNvZGluZ1N0eWxlcygpCi0gICAqIEBtb2RlbCB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLklTdHJpbmciCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRNZXNzYWdlKE1lc3NhZ2UpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBIZWFkZXJCYXNlX01lc3NhZ2UoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTWVzc2FnZSBnZXRNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2U8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE1lc3NhZ2UoTWVzc2FnZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0UGFydChQYXJ0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZSNnZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBhcnQgZ2V0UGFydCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0UGFydCA8ZW0+UGFydDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRQYXJ0KFBhcnQgdmFsdWUpOwotCi19IC8vIFNPQVBIZWFkZXJCYXNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQSGVhZGVyRmF1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJGYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDQ4ODUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBIZWFkZXJGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGVhZGVyIEZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmdzLnNvYXAuU09BUFBhY2thZ2UjZ2V0U09BUEhlYWRlckZhdWx0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQSGVhZGVyRmF1bHQgZXh0ZW5kcyBTT0FQSGVhZGVyQmFzZSB7Ci19IC8vIFNPQVBIZWFkZXJGYXVsdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvU09BUE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM4ZGQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbiNnZXRTb2FwQWN0aW9uVVJJIDxlbT5Tb2FwIEFjdGlvbiBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlI2dldFNPQVBPcGVyYXRpb24oKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNPQVBPcGVyYXRpb24gZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbiB7Ci19IC8vIFNPQVBPcGVyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9TT0FQUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGZhZTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL1NPQVBQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTT0FQUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlewotICAvKioKLSAgICogVGhlIHBhY2thZ2UgbmFtZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZU5BTUUgPSAic29hcCI7Ci0KLSAgLyoqCi0gICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3dzZGwvMjAwMy9TT0FQIjsKLQotICAvKioKLSAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAic29hcCI7Ci0KLSAgLyoqCi0gICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU09BUFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsLmluaXQoKTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQmluZGluZ0ltcGwgPGVtPkJpbmRpbmc8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfQklORElORyA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zcG9ydCBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19UUkFOU1BPUlRfVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CSU5ESU5HX19TVFlMRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JJTkRJTkdfRkVBVFVSRV9DT1VOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwgPGVtPkJvZHk8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCb2R5SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBQYWNrYWdlSW1wbCNnZXRTT0FQQm9keSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfQk9EWSA9IDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19FTEVNRU5UX1RZUEUgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0JPRFlfX1VTRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVMgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQk9EWV9fUEFSVFMgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Qm9keTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9CT0RZX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsIDxlbT5IZWFkZXIgQmFzZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsI2dldFNPQVBIZWFkZXJCYXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRSA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fVVNFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfQkFTRV9fRU5DT0RJTkdfU1RZTEVTID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX19QQVJUID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkhlYWRlciBCYXNlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9CQVNFX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEZhdWx0SW1wbCA8ZW0+RmF1bHQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBGYXVsdEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVCA9IDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfRkFVTFRfX0VMRU1FTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19SRVFVSVJFRCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fVVNFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX19OQU1FU1BBQ0VfVVJJID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5jb2RpbmcgU3R5bGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0ZBVUxUX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUE9wZXJhdGlvbkltcGwgPGVtPk9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUE9wZXJhdGlvbkltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OID0gNDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX19FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fX1JFUVVJUkVEID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEFjdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX19TVFlMRSA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEFkZHJlc3NJbXBsIDxlbT5BZGRyZXNzPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQWRkcmVzc0ltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEFkZHJlc3MoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWludCBTT0FQX0FERFJFU1MgPSA1OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTU19fRUxFTUVOVCA9IFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTU19fUkVRVUlSRUQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFID0gV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX19MT0NBVElPTl9VUkkgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QWRkcmVzczwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9BRERSRVNTX0ZFQVRVUkVfQ09VTlQgPSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckZhdWx0SW1wbCA8ZW0+SGVhZGVyIEZhdWx0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyRmF1bHRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUFBhY2thZ2VJbXBsI2dldFNPQVBIZWFkZXJGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUID0gNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVCA9IFNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQgPSBTT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVF9UWVBFID0gU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19VU0UgPSBTT0FQX0hFQURFUl9CQVNFX19VU0U7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19OQU1FU1BBQ0VfVVJJID0gU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuY29kaW5nIFN0eWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19FTkNPRElOR19TVFlMRVMgPSBTT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFID0gU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfX1BBUlQgPSBTT0FQX0hFQURFUl9CQVNFX19QQVJUOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkhlYWRlciBGYXVsdDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfRkFVTFRfRkVBVFVSRV9DT1VOVCA9IFNPQVBfSEVBREVSX0JBU0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckltcGwgPGVtPkhlYWRlcjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0U09BUEhlYWRlcigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSID0gNzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fRUxFTUVOVCA9IFNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fUkVRVUlSRUQgPSBTT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCWludCBTT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFID0gU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19VU0UgPSBTT0FQX0hFQURFUl9CQVNFX19VU0U7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lc3BhY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19OQU1FU1BBQ0VfVVJJID0gU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuY29kaW5nIFN0eWxlczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19FTkNPRElOR19TVFlMRVMgPSBTT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19NRVNTQUdFID0gU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlpbnQgU09BUF9IRUFERVJfX1BBUlQgPSBTT0FQX0hFQURFUl9CQVNFX19QQVJUOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVhZGVyIEZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTID0gU09BUF9IRUFERVJfQkFTRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5IZWFkZXI8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JaW50IFNPQVBfSEVBREVSX0ZFQVRVUkVfQ09VTlQgPSBTT0FQX0hFQURFUl9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPklTdHJpbmc8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQUGFja2FnZUltcGwjZ2V0SVN0cmluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JaW50IElTVFJJTkcgPSA4OwotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUNsYXNzIGdldFNPQVBCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nI2dldFRyYW5zcG9ydFVSSSA8ZW0+VHJhbnNwb3J0IFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNwb3J0IFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcjZ2V0VHJhbnNwb3J0VVJJKCkKLSAgICogQHNlZSAjZ2V0U09BUEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJpbmRpbmdfVHJhbnNwb3J0VVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3R5bGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nI2dldFN0eWxlKCkKLSAgICogQHNlZSAjZ2V0U09BUEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJpbmRpbmdfU3R5bGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5IDxlbT5Cb2R5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Qm9keTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEJvZHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0VXNlIDxlbT5Vc2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0VXNlKCkKLSAgICogQHNlZSAjZ2V0U09BUEJvZHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfVXNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQHNlZSAjZ2V0U09BUEJvZHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfTmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldEVuY29kaW5nU3R5bGVzKCkKLSAgICogQHNlZSAjZ2V0U09BUEJvZHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEJvZHlfRW5jb2RpbmdTdHlsZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keSNnZXRQYXJ0cyA8ZW0+UGFydHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFydHM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5I2dldFBhcnRzKCkKLSAgICogQHNlZSAjZ2V0U09BUEJvZHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVSZWZlcmVuY2UgZ2V0U09BUEJvZHlfUGFydHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlIDxlbT5IZWFkZXIgQmFzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkhlYWRlciBCYXNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVDbGFzcyBnZXRTT0FQSGVhZGVyQmFzZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRVc2UgPGVtPlVzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRVc2UoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9Vc2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9OYW1lc3BhY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAc2VlICNnZXRTT0FQSGVhZGVyQmFzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQSGVhZGVyQmFzZV9FbmNvZGluZ1N0eWxlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRNZXNzYWdlKCkKLSAgICogQHNlZSAjZ2V0U09BUEhlYWRlckJhc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlckJhc2VfTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRQYXJ0IDxlbT5QYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZSNnZXRQYXJ0KCkKLSAgICogQHNlZSAjZ2V0U09BUEhlYWRlckJhc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlckJhc2VfUGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0IDxlbT5GYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdCNnZXRVc2UgPGVtPlVzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0VXNlKCkKLSAgICogQHNlZSAjZ2V0U09BUEZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBGYXVsdF9Vc2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBzZWUgI2dldFNPQVBGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUF0dHJpYnV0ZSBnZXRTT0FQRmF1bHRfTmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0I2dldEVuY29kaW5nU3R5bGVzIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQjZ2V0RW5jb2RpbmdTdHlsZXMoKQotICAgKiBAc2VlICNnZXRTT0FQRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVBdHRyaWJ1dGUgZ2V0U09BUEZhdWx0X0VuY29kaW5nU3R5bGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUE9wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFNvYXBBY3Rpb25VUkkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBBY3Rpb24gVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFNvYXBBY3Rpb25VUkkoKQotICAgKiBAc2VlICNnZXRTT0FQT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBPcGVyYXRpb25fU29hcEFjdGlvblVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uI2dldFN0eWxlIDxlbT5TdHlsZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3R5bGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24jZ2V0U3R5bGUoKQotICAgKiBAc2VlICNnZXRTT0FQT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBPcGVyYXRpb25fU3R5bGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzIDxlbT5BZGRyZXNzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWRkcmVzczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQ2xhc3MgZ2V0U09BUEFkZHJlc3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb24gVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcyNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBzZWUgI2dldFNPQVBBZGRyZXNzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFQXR0cmlidXRlIGdldFNPQVBBZGRyZXNzX0xvY2F0aW9uVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQgPGVtPkhlYWRlciBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkhlYWRlciBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUNsYXNzIGdldFNPQVBIZWFkZXJGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlciA8ZW0+SGVhZGVyPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SGVhZGVyPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUNsYXNzIGdldFNPQVBIZWFkZXIoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyI2dldEhlYWRlckZhdWx0cyA8ZW0+SGVhZGVyIEZhdWx0czwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IZWFkZXIgRmF1bHRzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyI2dldEhlYWRlckZhdWx0cygpCi0gICAqIEBzZWUgI2dldFNPQVBIZWFkZXIoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlcl9IZWFkZXJGYXVsdHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPklTdHJpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SVN0cmluZzwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVEYXRhVHlwZSBnZXRJU3RyaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTT0FQRmFjdG9yeSBnZXRTT0FQRmFjdG9yeSgpOwotCi19IC8vU09BUFBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2dlbmVyYXRvci9TT0FQQ29udGVudEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvZ2VuZXJhdG9yL1NPQVBDb250ZW50R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZThlNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvZ2VuZXJhdG9yL1NPQVBDb250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuZ2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuQ29udGVudEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgU09BUENvbnRlbnRHZW5lcmF0b3IgaW1wbGVtZW50cyBDb250ZW50R2VuZXJhdG9yCi17CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9OT1RfU0VUID0gLTE7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfRE9DVU1FTlQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUWUxFX1JQQyA9IDI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFX0xJVEVSQUwgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRV9FTkNPREVEID0gMjsKLQkKLQlwcml2YXRlIGludCBzdHlsZU9wdGlvbiA9IE9QVElPTl9OT1RfU0VUOwotCXByaXZhdGUgaW50IHVzZU9wdGlvbiA9IE9QVElPTl9OT1RfU0VUOwotCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVmFsdWUgPSAiIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBhZGRyZXNzTG9jYXRpb24gPSBDb250ZW50R2VuZXJhdG9yLkFERFJFU1NfTE9DQVRJT047Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSByZXF1aXJlZE5hbWVzcGFjZXMgPSB7Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8ifTsKLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBwcmVmZXJyZWROYW1lc3BhY2VQcmVmaXhlcyA9IHsic29hcCJ9OwotICAKLSAgICAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRSZXF1aXJlZE5hbWVzcGFjZXMoKQotICB7Ci0gICAgcmV0dXJuIHJlcXVpcmVkTmFtZXNwYWNlczsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcmVmZXJyZWROYW1lc3BhY2VQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotCSAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iKSkgewotCQkgIHJldHVybiAic29hcCI7Ci0JICB9Ci0JICAKLQkgIHJldHVybiAiIjsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0U3R5bGUoaW50IHN0eWxlKSB7Ci0JICBzdHlsZU9wdGlvbiA9IHN0eWxlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVc2UoaW50IHVzZSkgewotCSAgdXNlT3B0aW9uID0gdXNlOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRBZGRyZXNzTG9jYXRpb24oU3RyaW5nIGFkZHJlc3NMb2NhdGlvbikgewotCSAgdGhpcy5hZGRyZXNzTG9jYXRpb24gPSBhZGRyZXNzTG9jYXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVBvcnRDb250ZW50KFBvcnQgcG9ydCkKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChwb3J0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7CSAgCi0JICByZW1vdmVFeHRlbnNlYmlsaXR5RWxlbWVudHMocG9ydC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHJlbW92ZUxpc3QpOwotCi0JICBTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcz0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBBZGRyZXNzKCk7Ci0JICBzb2FwQWRkcmVzcy5zZXRMb2NhdGlvblVSSShhZGRyZXNzTG9jYXRpb24pOwotCSAgcG9ydC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQWRkcmVzcyk7Ci0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0NvbnRlbnQoQmluZGluZyBiaW5kaW5nLCBQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewkgIAotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7CSAgCi0JICByZW1vdmVFeHRlbnNlYmlsaXR5RWxlbWVudHMoYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHJlbW92ZUxpc3QpOwotCQotCVNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFOwotCVNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEJpbmRpbmcoKTsKLQlzb2FwQmluZGluZy5zZXRTdHlsZSgoZ2V0U3R5bGVPcHRpb24oYmluZGluZykgPT0gU1RZTEVfRE9DVU1FTlQpID8gImRvY3VtZW50IiA6ICJycGMiKTsKLQlzb2FwQmluZGluZy5zZXRUcmFuc3BvcnRVUkkoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIpOwotCQotCWJpbmRpbmcuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEJpbmRpbmcpOwkKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ09wZXJhdGlvbkNvbnRlbnQoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uLCBPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0JICAvLyBXZSBibG93IGF3YXkgYW55IGV4aXN0aW5nIEV4dGVuc2liaWxpdHlFbGVtZW50cy9jb250ZW50IGJlZm9yZSB3ZSBnZW5lcmF0ZSBpdAotCSAgLy8gSXMgaXQgd29ydGggYmVpbmcgc21hcnRlcj8gIExvb2sgZm9yIG1hdGNoaW5nIGNvbnRlbnQgZmlyc3QgYW5kIGNyZWF0ZSB0aG9zZSB3aGljaCBhcmVuJ3QgZm91bmQ/Pz8/Ci0JICBMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGJpbmRpbmdPcGVyYXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQkgIEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbkVsZW1lbnQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVsZW1lbnQoKTsJCi0JcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQkKLQlTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUE9wZXJhdGlvbigpOwotCQotCQotICAgIFN0cmluZyBzb2FwQWN0aW9uVmFsdWUgPSBnZXROYW1lc3BhY2UoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgaWYgKCFzb2FwQWN0aW9uVmFsdWUuZW5kc1dpdGgoIi8iKSkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgc29hcEFjdGlvblZhbHVlICs9ICIvIjsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgc29hcEFjdGlvblZhbHVlICs9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0JCi0Jc29hcE9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uVVJJKHNvYXBBY3Rpb25WYWx1ZSk7Ci0JCi0JYmluZGluZ09wZXJhdGlvbi5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwT3BlcmF0aW9uKTsJCi0gIH0gIAotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlQmluZGluZ0lucHV0Q29udGVudChCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0LCBJbnB1dCBpbnB1dCkKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nSW5wdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQkgIEVsZW1lbnQgYmluZGluZ0lucHV0RWxlbWVudCA9IGJpbmRpbmdJbnB1dC5nZXRFbGVtZW50KCk7Ci0JcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdJbnB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIHJlbW92ZUxpc3QpOwotCQotCVNPQVBGYWN0b3J5IHNvYXBGYWN0b3J5ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFOwotCVNPQVBCb2R5IHNvYXBCb2R5ID0gc29hcEZhY3RvcnkuY3JlYXRlU09BUEJvZHkoKTsKLQlzb2FwQm9keS5zZXRVc2UoKGdldFVzZU9wdGlvbihudWxsKSA9PSBVU0VfRU5DT0RFRCkgPyAiZW5jb2RlZCIgOiAibGl0ZXJhbCIpOwotCWlmIChnZXRVc2VPcHRpb24oYmluZGluZ0lucHV0KSA9PSBVU0VfRU5DT0RFRCAmJiBnZXRTdHlsZU9wdGlvbihiaW5kaW5nSW5wdXQpID09IFNUWUxFX1JQQykKLSAgICB7Ci0JCUxpc3QgZW5jb2RpbmdMaXN0ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJZW5jb2RpbmdMaXN0LmFkZCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLQkJc29hcEJvZHkuc2V0RW5jb2RpbmdTdHlsZXMoZW5jb2RpbmdMaXN0KTsKLQkgIAlzb2FwQm9keS5zZXROYW1lc3BhY2VVUkkoZ2V0TmFtZXNwYWNlKGJpbmRpbmdJbnB1dCkpOwotICAgIH0KLSAgICBlbHNlIGlmIChnZXRVc2VPcHRpb24oYmluZGluZ0lucHV0KSA9PSBVU0VfTElURVJBTCAmJiBnZXRTdHlsZU9wdGlvbihiaW5kaW5nSW5wdXQpID09IFNUWUxFX1JQQykgewotCSAgCXNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSShnZXROYW1lc3BhY2UoYmluZGluZ0lucHV0KSk7Ci0gICAgfQotCQotCWJpbmRpbmdJbnB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQm9keSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPdXRwdXRDb250ZW50KEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCwgT3V0cHV0IG91dHB1dCkKLSAgewotCSAgLy8gV2UgYmxvdyBhd2F5IGFueSBleGlzdGluZyBFeHRlbnNpYmlsaXR5RWxlbWVudHMvY29udGVudCBiZWZvcmUgd2UgZ2VuZXJhdGUgaXQKLQkgIC8vIElzIGl0IHdvcnRoIGJlaW5nIHNtYXJ0ZXI/ICBMb29rIGZvciBtYXRjaGluZyBjb250ZW50IGZpcnN0IGFuZCBjcmVhdGUgdGhvc2Ugd2hpY2ggYXJlbid0IGZvdW5kPz8/PwotCSAgTGlzdCByZW1vdmVMaXN0ID0gbmV3IEFycmF5TGlzdChiaW5kaW5nT3V0cHV0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0JICBFbGVtZW50IGJpbmRpbmdPdXRwdXRFbGVtZW50ID0gYmluZGluZ091dHB1dC5nZXRFbGVtZW50KCk7Ci0JcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdPdXRwdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCByZW1vdmVMaXN0KTsKLQkKLQlTT0FQRmFjdG9yeSBzb2FwRmFjdG9yeSA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRTsKLQlTT0FQQm9keSBzb2FwQm9keSA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBCb2R5KCk7Ci0Jc29hcEJvZHkuc2V0VXNlKChnZXRVc2VPcHRpb24oYmluZGluZ091dHB1dCkgPT0gVVNFX0VOQ09ERUQpID8gImVuY29kZWQiIDogImxpdGVyYWwiKTsKLQlpZiAoZ2V0VXNlT3B0aW9uKGJpbmRpbmdPdXRwdXQpID09IFVTRV9FTkNPREVEICYmIGdldFN0eWxlT3B0aW9uKGJpbmRpbmdPdXRwdXQpID09IFNUWUxFX1JQQykKLSAgICB7Ci0JCUxpc3QgZW5jb2RpbmdMaXN0ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJZW5jb2RpbmdMaXN0LmFkZCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLQkJc29hcEJvZHkuc2V0RW5jb2RpbmdTdHlsZXMoZW5jb2RpbmdMaXN0KTsKLQkgIAlzb2FwQm9keS5zZXROYW1lc3BhY2VVUkkoZ2V0TmFtZXNwYWNlKGJpbmRpbmdPdXRwdXQpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZ2V0VXNlT3B0aW9uKGJpbmRpbmdPdXRwdXQpID09IFVTRV9MSVRFUkFMICYmIGdldFN0eWxlT3B0aW9uKGJpbmRpbmdPdXRwdXQpID09IFNUWUxFX1JQQykgewotCSAgCXNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSShnZXROYW1lc3BhY2UoYmluZGluZ091dHB1dCkpOwotICAgIH0KLQkKLQliaW5kaW5nT3V0cHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCb2R5KTsJCi0gIH0gICAgICAgICAKLQotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdGYXVsdENvbnRlbnQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCwgRmF1bHQgZmF1bHQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAvLyBXZSBibG93IGF3YXkgYW55IGV4aXN0aW5nIEV4dGVuc2liaWxpdHlFbGVtZW50cy9jb250ZW50IGJlZm9yZSB3ZSBnZW5lcmF0ZSBpdAotCSAgLy8gSXMgaXQgd29ydGggYmVpbmcgc21hcnRlcj8gIExvb2sgZm9yIG1hdGNoaW5nIGNvbnRlbnQgZmlyc3QgYW5kIGNyZWF0ZSB0aG9zZSB3aGljaCBhcmVuJ3QgZm91bmQ/Pz8/Ci0JICBMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KGJpbmRpbmdGYXVsdC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCSAgRWxlbWVudCBiaW5kaW5nRmF1bHRFbGVtZW50ID0gYmluZGluZ0ZhdWx0LmdldEVsZW1lbnQoKTsKLQlyZW1vdmVFeHRlbnNlYmlsaXR5RWxlbWVudHMoYmluZGluZ0ZhdWx0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgcmVtb3ZlTGlzdCk7Ci0JCi0JU09BUEZhY3Rvcnkgc29hcEZhY3RvcnkgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNvYXBGYWN0b3J5LmNyZWF0ZVNPQVBGYXVsdCgpOwotCXNvYXBGYXVsdC5zZXRVc2UoKGdldFVzZU9wdGlvbihiaW5kaW5nRmF1bHQpID09IFVTRV9FTkNPREVEKSA/ICJlbmNvZGVkIiA6ICJsaXRlcmFsIik7Ci0Jc29hcEZhdWx0LnNldE5hbWUoZmF1bHQuZ2V0TmFtZSgpKTsKLQlzb2FwRmF1bHQuc2V0TmFtZXNwYWNlVVJJKGdldE5hbWVzcGFjZShiaW5kaW5nRmF1bHQpKTsKLQotCWlmIChnZXRVc2VPcHRpb24oYmluZGluZ0ZhdWx0KSA9PSBVU0VfRU5DT0RFRCAmJiBnZXRTdHlsZU9wdGlvbihiaW5kaW5nRmF1bHQpID09IFNUWUxFX1JQQykKLSAgICB7Ci0JCUxpc3QgZW5jb2RpbmdMaXN0ID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJZW5jb2RpbmdMaXN0LmFkZCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iKTsKLQkJc29hcEZhdWx0LnNldEVuY29kaW5nU3R5bGVzKGVuY29kaW5nTGlzdCk7Ci0gICAgfQotCQotCWJpbmRpbmdGYXVsdC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwRmF1bHQpOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2UoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpIHsKLQkgIGlmIChuYW1lc3BhY2VWYWx1ZS5lcXVhbHMoIiIpICYmIHdzZGxFbGVtZW50ICE9IG51bGwpIHsKLQkJICBuYW1lc3BhY2VWYWx1ZSA9IHdzZGxFbGVtZW50LmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQkgIH0KLQkgIAotCSAgcmV0dXJuIG5hbWVzcGFjZVZhbHVlOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcmVtb3ZlRXh0ZW5zZWJpbGl0eUVsZW1lbnRzKExpc3Qgb3JpZ2luYWxMaXN0LCBMaXN0IHJlbW92ZUxpc3QpIHsKLQkgIEl0ZXJhdG9yIHJlbW92ZUl0ID0gcmVtb3ZlTGlzdC5pdGVyYXRvcigpOwotCSAgd2hpbGUgKHJlbW92ZUl0Lmhhc05leHQoKSkgewotCQkgIG9yaWdpbmFsTGlzdC5yZW1vdmUocmVtb3ZlSXQubmV4dCgpKTsKLQkgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBCaW5kaW5nIGdldEJpbmRpbmdPYmplY3QoT2JqZWN0IGdlbmVyaWNCaW5kaW5nT2JqZWN0KSB7Ci0JICBPYmplY3QgcGFyZW50ID0gZ2VuZXJpY0JpbmRpbmdPYmplY3Q7Ci0JICAKLQkgIGludCBpbmRleCA9IDA7Ci0JICB3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgaW5kZXggPCA1KSB7Ci0JCSAgcGFyZW50ID0gZ2V0R2VuZXJpY0JpbmRpbmdPYmplY3RQYXJlbnQocGFyZW50KTsKLQkJICBpZiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZykgewotCQkJICBicmVhazsKLQkJICB9Ci0JCSAgaW5kZXgrKzsKLQkgIH0KLQotCSAgcmV0dXJuIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nKT8gKEJpbmRpbmcpIHBhcmVudCA6IG51bGw7Ci0gIH0KLSAgCi0gIHByaXZhdGUgT2JqZWN0IGdldEdlbmVyaWNCaW5kaW5nT2JqZWN0UGFyZW50KE9iamVjdCBnZW5lcmljQmluZGluZ09iamVjdCkgewotCSAgT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JICAKLQkgIGlmIChnZW5lcmljQmluZGluZ09iamVjdCAhPSBudWxsKSB7Ci0JCSAgaWYgKGdlbmVyaWNCaW5kaW5nT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbikgewotCQkJICBwYXJlbnQgPSAoKEJpbmRpbmdPcGVyYXRpb24pIGdlbmVyaWNCaW5kaW5nT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoZ2VuZXJpY0JpbmRpbmdPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpIHsKLQkJCSAgcGFyZW50ID0gKChCaW5kaW5nSW5wdXQpIGdlbmVyaWNCaW5kaW5nT2JqZWN0KS5nZXRDb250YWluZXIoKTsKLQkJICB9Ci0JCSAgZWxzZSBpZiAoZ2VuZXJpY0JpbmRpbmdPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KSB7Ci0JCQkgIHBhcmVudCA9ICgoQmluZGluZ091dHB1dCkgZ2VuZXJpY0JpbmRpbmdPYmplY3QpLmdldENvbnRhaW5lcigpOwotCQkgIH0KLQkJICBlbHNlIGlmIChnZW5lcmljQmluZGluZ09iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkgewotCQkJICBwYXJlbnQgPSAoKEJpbmRpbmdGYXVsdCkgZ2VuZXJpY0JpbmRpbmdPYmplY3QpLmdldENvbnRhaW5lcigpOwotCQkgIH0JICAKLQkgIH0KLQkgIAotCSAgcmV0dXJuIHBhcmVudDsJICAKLSAgfQotICAKLSAgICBwcml2YXRlIGludCBnZXRTdHlsZU9wdGlvbihPYmplY3QgZ2VuZXJpY0JpbmRpbmdPYmplY3QpIHsKLQkgIGlmIChzdHlsZU9wdGlvbiA9PSBPUFRJT05fTk9UX1NFVCAmJiBnZW5lcmljQmluZGluZ09iamVjdCAhPSBudWxsKSB7Ci0JCSAgLy8gaW5pdCgpIHdhcyBuZXZlciBjYWxsZWQsIHRyeSB0byBkZXRlcm1pbmUgdGhlICdzdHlsZScgYmFzZWQgb24gd2hhdCB3ZSBoYXZlL2tub3cKLQkJICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRCaW5kaW5nT2JqZWN0KGdlbmVyaWNCaW5kaW5nT2JqZWN0KTsKLQkJICAKLQkJICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdHlsZSBmcm9tIHRoZSBCaW5kaW5nIE9iamVjdAotCQkgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCSAgTGlzdCBsaXN0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCQkgIEl0ZXJhdG9yIHZhbHVlc0l0ID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShsaXN0LCAic3R5bGUiKS5pdGVyYXRvcigpOwotCi0JCQkgIHdoaWxlICh2YWx1ZXNJdC5oYXNOZXh0KCkpIHsKLQkJCQkgIFN0cmluZyBzdHlsZSA9IChTdHJpbmcpIHZhbHVlc0l0Lm5leHQoKTsKLQkJCQkgIAotCQkJCSAgaWYgKHN0eWxlLmVxdWFscygiZG9jdW1lbnQiKSkgewotCQkJCQkgIHN0eWxlT3B0aW9uID0gU1RZTEVfRE9DVU1FTlQ7Ci0JCQkJICB9Ci0JCQkJICBlbHNlIGlmIChzdHlsZS5lcXVhbHMoInJwYyIpKSB7Ci0JCQkJCSAgc3R5bGVPcHRpb24gPSBTVFlMRV9SUEM7ICAKLQkJCQkgIH0KLQkJCQkgIAotCQkJCSAgaWYgKHN0eWxlT3B0aW9uICE9IE9QVElPTl9OT1RfU0VUKSB7Ci0JCQkJCSAgYnJlYWs7Ci0JCQkJICB9Ci0JCQkgIH0KLQkJICB9Ci0JICB9Ci0JICAKLQkgIGlmIChzdHlsZU9wdGlvbiA9PSBPUFRJT05fTk9UX1NFVCkgewotCQkgIHN0eWxlT3B0aW9uID0gU1RZTEVfRE9DVU1FTlQ7Ci0JICB9Ci0JICAKLQkgIHJldHVybiBzdHlsZU9wdGlvbjsKLSAgfQotCQotCSAgcHJpdmF0ZSBpbnQgZ2V0VXNlT3B0aW9uKE9iamVjdCBnZW5lcmljQmluZGluZ09iamVjdCkgewotCQkgIGlmICh1c2VPcHRpb24gPT0gT1BUSU9OX05PVF9TRVQpIHsKLQkJCSAgLy8gaW5pdCgpIHdhcyBuZXZlciBjYWxsZWQsIHRyeSB0byBkZXRlcm1pbmUgdGhlICd1c2UnIGJhc2VkIG9uIHdoYXQgd2UgaGF2ZS9rbm93Ci0JCQkgIEl0ZXJhdG9yIG1lc3NhZ2VSZWZJdCA9IGdldE1lc3NhZ2VSZWZlcmVuY2VCaW5kaW5nT2JqZWN0cyhnZW5lcmljQmluZGluZ09iamVjdCkuaXRlcmF0b3IoKTsKLQkJCSAgCi0JCQkgIC8vIFRyeSB0byBkZXRlcm1pbmUgdGhlIHVzZSBmcm9tIHRoZSBsaXN0IG9mIEJpbmRpbmdJbnB1dHMsIEJpbmRpbmdPdXRwdXRzLCBhbmQgQmluZGluZ0ZhdWx0cwotCQkJICB3aGlsZSAobWVzc2FnZVJlZkl0Lmhhc05leHQoKSkgewotCQkJCSAgT2JqZWN0IG1lc3NhZ2VSZWYgPSBtZXNzYWdlUmVmSXQubmV4dCgpOwotCQkJCSAgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJICAKLQkJCQkgIGlmIChtZXNzYWdlUmVmIGluc3RhbmNlb2YgQmluZGluZ0lucHV0KSB7Ci0JCQkJCSAgTGlzdCBsaXN0ID0gKChCaW5kaW5nSW5wdXQpIG1lc3NhZ2VSZWYpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQkJCQkJICB2YWx1ZXMgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEF0dHJpYnV0ZVZhbHVlKGxpc3QsICJ1c2UiKTsKLQkJCQkgIH0KLQkJCQkgIGVsc2UgaWYgKG1lc3NhZ2VSZWYgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KSB7Ci0JCQkJCSAgTGlzdCBsaXN0ID0gKChCaW5kaW5nT3V0cHV0KSBtZXNzYWdlUmVmKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCQkJCSAgdmFsdWVzID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRBdHRyaWJ1dGVWYWx1ZShsaXN0LCAidXNlIik7Ci0JCQkJICB9Ci0JCQkJICBlbHNlIGlmIChtZXNzYWdlUmVmIGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KSB7Ci0JCQkJCSAgTGlzdCBsaXN0ID0gKChCaW5kaW5nRmF1bHQpIG1lc3NhZ2VSZWYpLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLQkJCQkJICB2YWx1ZXMgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEF0dHJpYnV0ZVZhbHVlKGxpc3QsICJ1c2UiKTsJCQkJICAKLQkJCQkgIH0KLQotCQkJCSAgSXRlcmF0b3IgdmFsdWVzSXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsKLQkJCQkgIHdoaWxlICh2YWx1ZXNJdC5oYXNOZXh0KCkpIHsKLQkJCQkJICBTdHJpbmcgdXNlID0gKFN0cmluZykgdmFsdWVzSXQubmV4dCgpOwotCQkJCQkgIAotCQkJCQkgIGlmICh1c2UuZXF1YWxzKCJsaXRlcmFsIikpIHsKLQkJCQkJCSAgdXNlT3B0aW9uID0gVVNFX0xJVEVSQUw7Ci0JCQkJCSAgfQotCQkJCQkgIGVsc2UgaWYgKHVzZS5lcXVhbHMoImVuY29kZWQiKSkgewotCQkJCQkJICB1c2VPcHRpb24gPSBVU0VfRU5DT0RFRDsgIAotCQkJCQkgIH0KLQkJCQkgIH0KLQkJCQkgIAotCQkJCSAgaWYgKHVzZU9wdGlvbiAhPSBPUFRJT05fTk9UX1NFVCkgewotCQkJCQkgIGJyZWFrOwotCQkJCSAgfQotCQkJICB9Ci0JCSAgfQotCi0JCSAgaWYgKHVzZU9wdGlvbiA9PSBPUFRJT05fTk9UX1NFVCkgewotCQkJICB1c2VPcHRpb24gPSBVU0VfTElURVJBTDsKLQkJICB9Ci0JCSAgCi0JCSAgcmV0dXJuIHVzZU9wdGlvbjsKLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSBMaXN0IGdldE1lc3NhZ2VSZWZlcmVuY2VCaW5kaW5nT2JqZWN0cyhPYmplY3QgZ2VuZXJpY0JpbmRpbmdPYmplY3QpIHsKLQkJICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgQmluZGluZyBiaW5kaW5nID0gZ2V0QmluZGluZ09iamVjdChnZW5lcmljQmluZGluZ09iamVjdCk7Ci0JCSAgCi0JCSAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJICBJdGVyYXRvciBvcGVyYXRpb25zSXQgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCSAgCi0JCQkgIHdoaWxlIChvcGVyYXRpb25zSXQuaGFzTmV4dCgpKSB7Ci0JCQkJICBCaW5kaW5nT3BlcmF0aW9uIG9wID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wZXJhdGlvbnNJdC5uZXh0KCk7Ci0JCQkJICBsaXN0LmFkZChvcC5nZXRFQmluZGluZ0lucHV0KCkpOwotCQkJCSAgbGlzdC5hZGQob3AuZ2V0RUJpbmRpbmdPdXRwdXQoKSk7Ci0JCQkJICBsaXN0LmFkZEFsbChvcC5nZXRFQmluZGluZ0ZhdWx0cygpKTsKLQkJCSAgfQkgIAotCQkgIH0KLQkJICAKLQkJICByZXR1cm4gbGlzdDsKLQkgIH0KLQkKLQkgIHByaXZhdGUgTGlzdCBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudEF0dHJpYnV0ZVZhbHVlKExpc3QgZWVMaXN0LCBTdHJpbmcgYXR0cmlidXRlS2V5KSB7Ci0JCSAgTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCSAgSXRlcmF0b3IgZWVFbGVtZW50c0l0ID0gZWVMaXN0Lml0ZXJhdG9yKCk7Ci0JCSAgCi0JCSAgd2hpbGUgKGVlRWxlbWVudHNJdC5oYXNOZXh0KCkpIHsKLQkJCSAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWVFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlZUVsZW1lbnRzSXQubmV4dCgpOwotCQkJICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBlZUVsZW1lbnQuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVLZXkpOwotCQkJICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCAmJiAhYXR0cmlidXRlVmFsdWUuZXF1YWxzKCIiKSkgewotCQkJCSAgdmFsdWVzLmFkZChhdHRyaWJ1dGVWYWx1ZSk7Ci0JCQkgIH0JCSAgCi0JCSAgfQotCQkgIAotCQkgIHJldHVybiB2YWx1ZXM7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7Ci0JCSAgcmV0dXJuICJTT0FQIjsKLQkgIH0KLX0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQWRkcmVzc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEFkZHJlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MDY5OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQWRkcmVzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBBZGRyZXNzSW1wbCNnZXRMb2NhdGlvblVSSSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEFkZHJlc3NJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgU09BUEFkZHJlc3MgewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb25VUkkoKSA8ZW0+TG9jYXRpb24gVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvY2F0aW9uVVJJID0gTE9DQVRJT05fVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQQWRkcmVzc0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEFkZHJlc3MoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkkoU3RyaW5nIG5ld0xvY2F0aW9uVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZExvY2F0aW9uVVJJID0gbG9jYXRpb25VUkk7Ci0gICAgbG9jYXRpb25VUkkgPSBuZXdMb2NhdGlvblVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSSwgb2xkTG9jYXRpb25VUkksIGxvY2F0aW9uVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19MT0NBVElPTl9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRMb2NhdGlvblVSSSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgc2V0TG9jYXRpb25VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotICAgICAgICBzZXRMb2NhdGlvblVSSShMT0NBVElPTl9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1NfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9BRERSRVNTX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTU19fTE9DQVRJT05fVVJJOgotICAgICAgICByZXR1cm4gTE9DQVRJT05fVVJJX0VERUZBVUxUID09IG51bGwgPyBsb2NhdGlvblVSSSAhPSBudWxsIDogIUxPQ0FUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMobG9jYXRpb25VUkkpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb25VUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobG9jYXRpb25VUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldExvY2F0aW9uVVJJCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuTE9DQVRJT05fQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEFkZHJlc3NfTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTE9DQVRJT05fQVRUUklCVVRFLGdldExvY2F0aW9uVVJJKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5TT0FQX05BTUVTUEFDRV9VUkksIFNPQVBDb25zdGFudHMuQUREUkVTU19FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9IAotfSAvL1NPQVBBZGRyZXNzSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQmluZGluZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEJpbmRpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjMxZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQQmluZGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbCNnZXRUcmFuc3BvcnRVUkkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBCaW5kaW5nSW1wbCNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0ltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQQmluZGluZyB7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0VVJJKCkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VHJhbnNwb3J0VVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU1BPUlRfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNwb3J0VVJJKCkgPGVtPlRyYW5zcG9ydCBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VHJhbnNwb3J0VVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zcG9ydFVSSSA9IFRSQU5TUE9SVF9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQQmluZGluZ0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNwb3J0VVJJKCkKLSAgewotICAgIHJldHVybiB0cmFuc3BvcnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc3BvcnRVUkkoU3RyaW5nIG5ld1RyYW5zcG9ydFVSSSkKLSAgewotICAgIFN0cmluZyBvbGRUcmFuc3BvcnRVUkkgPSB0cmFuc3BvcnRVUkk7Ci0gICAgdHJhbnNwb3J0VVJJID0gbmV3VHJhbnNwb3J0VVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fVFJBTlNQT1JUX1VSSSwgb2xkVHJhbnNwb3J0VVJJLCB0cmFuc3BvcnRVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIG5ld1N0eWxlKQotICB7Ci0gICAgU3RyaW5nIG9sZFN0eWxlID0gc3R5bGU7Ci0gICAgc3R5bGUgPSBuZXdTdHlsZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1NUWUxFLCBvbGRTdHlsZSwgc3R5bGUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRUcmFuc3BvcnRVUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19TVFlMRToKLSAgICAgICAgcmV0dXJuIGdldFN0eWxlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fVFJBTlNQT1JUX1VSSToKLSAgICAgICAgc2V0VHJhbnNwb3J0VVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fU1RZTEU6Ci0gICAgICAgIHNldFN0eWxlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1RSQU5TUE9SVF9VUkk6Ci0gICAgICAgIHNldFRyYW5zcG9ydFVSSShUUkFOU1BPUlRfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX1NUWUxFOgotICAgICAgICBzZXRTdHlsZShTVFlMRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElOR19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JJTkRJTkdfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19UUkFOU1BPUlRfVVJJOgotICAgICAgICByZXR1cm4gVFJBTlNQT1JUX1VSSV9FREVGQVVMVCA9PSBudWxsID8gdHJhbnNwb3J0VVJJICE9IG51bGwgOiAhVFJBTlNQT1JUX1VSSV9FREVGQVVMVC5lcXVhbHModHJhbnNwb3J0VVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HX19TVFlMRToKLSAgICAgICAgcmV0dXJuIFNUWUxFX0VERUZBVUxUID09IG51bGwgPyBzdHlsZSAhPSBudWxsIDogIVNUWUxFX0VERUZBVUxULmVxdWFscyhzdHlsZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh0cmFuc3BvcnRVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodHJhbnNwb3J0VVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHN0eWxlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHN0eWxlKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0JCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0U3R5bGUKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5TVFlMRV9BVFRSSUJVVEUpKTsKLSAgICBzZXRUcmFuc3BvcnRVUkkKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5UUkFOU1BPUlRfQVRUUklCVVRFKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdfU3R5bGUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuU1RZTEVfQVRUUklCVVRFLGdldFN0eWxlKCkpOwotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ19UcmFuc3BvcnRVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuVFJBTlNQT1JUX0FUVFJJQlVURSxnZXRUcmFuc3BvcnRVUkkoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotICB7Ci0gICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpCi0gICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSwgU09BUENvbnN0YW50cy5CSU5ESU5HX0VMRU1FTlRfVEFHKTsKLSAgICByZXR1cm4gZWxlbWVudFR5cGU7Ci0gIH0KLX0gLy9TT0FQQmluZGluZ0ltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEJvZHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBCb2R5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI1YzVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEJvZHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Qm9keTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEJvZHlJbXBsI2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQQm9keUltcGwjZ2V0RW5jb2RpbmdTdHlsZXMgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEJvZHlJbXBsI2dldFBhcnRzIDxlbT5QYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBCb2R5SW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBCb2R5IHsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2UoKSA8ZW0+VXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFVzZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlKCkgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNlID0gVVNFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IE5BTUVTUEFDRV9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuY29kaW5nU3R5bGVzKCkgPGVtPkVuY29kaW5nIFN0eWxlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVuY29kaW5nU3R5bGVzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW5jb2RpbmdTdHlsZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0cygpIDxlbT5QYXJ0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFBhcnRzKCkKLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIExpc3QgcGFydHMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQQm9keUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEJvZHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkKLSAgewotICAgIHJldHVybiB1c2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2UoU3RyaW5nIG5ld1VzZSkKLSAgewotICAgIFN0cmluZyBvbGRVc2UgPSB1c2U7Ci0gICAgdXNlID0gbmV3VXNlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fVVNFLCBvbGRVc2UsIHVzZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmV3TmFtZXNwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICBuYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJLCBvbGROYW1lc3BhY2VVUkksIG5hbWVzcGFjZVVSSSkpOwotICB9Ci0KLXB1YmxpYyB2b2lkIHNldEVuY29kaW5nU3R5bGVzKExpc3QgbGlzdCkKLXsKLSAgZW5jb2RpbmdTdHlsZXMgPSAoRUxpc3QpbGlzdDsKLX0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIExpc3QgZ2V0RW5jb2RpbmdTdHlsZXMoKQotICB7Ci0gICAgaWYgKGVuY29kaW5nU3R5bGVzID09IG51bGwpCi0gICAgewotICAgICAgZW5jb2RpbmdTdHlsZXMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VOQ09ESU5HX1NUWUxFUyk7Ci0gICAgfQotICAgIHJldHVybiBlbmNvZGluZ1N0eWxlczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFBhcnRzKExpc3QgbGlzdCkKLSAgewotICAgIHBhcnRzID0gbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFBhcnRzKCkKLSAgewotICAgIGlmIChwYXJ0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIHBhcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChQYXJ0LmNsYXNzLCB0aGlzLCBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1BBUlRTKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHBhcnRzLnNpemUoKSA9PSAwKQotICAgIHsKLSAgICAgIExpc3QgaW1wbGljaXRQYXJ0cyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gICAgICAKLSAgICAgIC8vIFRyeSB0byBmaW5kIGFuIGltcGxpY2l0IG9uZS4KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICAgIHsKLSAgICAgIAlNZXNzYWdlIG1lc3NhZ2UgPSAoKEJpbmRpbmdJbnB1dCllQ29udGFpbmVyKCkpLmdldEVJbnB1dCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQpCi0gICAgICB7Ci0gICAgICAJTWVzc2FnZSBtZXNzYWdlID0gKChCaW5kaW5nT3V0cHV0KWVDb250YWluZXIoKSkuZ2V0RU91dHB1dCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGlmKGVDb250YWluZXIoKSBpbnN0YW5jZW9mIEJpbmRpbmdGYXVsdCkKLSAgICAgIHsKLSAgICAgIAlNZXNzYWdlIG1lc3NhZ2UgPSAoKEJpbmRpbmdGYXVsdCllQ29udGFpbmVyKCkpLmdldEVGYXVsdCgpLmdldEVNZXNzYWdlKCk7Ci0gICAgICAJaWYobWVzc2FnZS5nZXRFUGFydHMoKS5zaXplKCkgPiAwKQotICAgICAgCXsKLSAgICAgIAkgIGltcGxpY2l0UGFydHMuYWRkQWxsKG1lc3NhZ2UuZ2V0RVBhcnRzKCkpOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIHJldHVybiBpbXBsaWNpdFBhcnRzOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcGFydHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICByZXR1cm4gZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19QQVJUUzoKLSAgICAgICAgcmV0dXJuIGdldFBhcnRzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUEFSVFM6Ci0gICAgICAgIGdldFBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0UGFydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX1BBUlRTOgotICAgICAgICBnZXRQYXJ0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0JPRFlfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19VU0U6Ci0gICAgICAgIHJldHVybiBVU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzZSAhPSBudWxsIDogIVVTRV9FREVGQVVMVC5lcXVhbHModXNlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWV9fUEFSVFM6Ci0gICAgICAgIHJldHVybiBwYXJ0cyAhPSBudWxsICYmICFwYXJ0cy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh1c2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodXNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5jb2RpbmdTdHlsZXM6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RpbmdTdHlsZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSkpCi0gICAgICBzZXRVc2UoY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSkpOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSkKLSAgICAgIHNldE5hbWVzcGFjZVVSSShjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFKSk7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLkVOQ09ESU5HX1NUWUxFX0FUVFJJQlVURSkpIAotICAgIHsKLSAgICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlcyA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLkVOQ09ESU5HX1NUWUxFX0FUVFJJQlVURSk7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbmNvZGluZ1N0eWxlcyk7Ci0gICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIAlnZXRFbmNvZGluZ1N0eWxlcygpLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgIH0gICAKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICAvLyBUQkQgLSByZXNvbHZlIFBhcnRzIHJlZmVyZW5jZSBoZXJlLgotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCb2R5X1VzZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5VU0VfQVRUUklCVVRFLGdldFVzZSgpKTsKLSAgICAgIGlmKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQQm9keV9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSxnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBCb2R5X0VuY29kaW5nU3R5bGVzKCkpCi0gICAgICB7Ci0gICAgICAgIExpc3QgZW5jb2RpbmdTdHlsZUxpc3QgPSBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSAiIjsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlbmNvZGluZ1N0eWxlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpIC8vIGZpcnN0IGl0ZXJhdGlvbgotICAgICAgICAgICAgZW5jb2RpbmdTdHlsZXMgKz0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIAllbmNvZGluZ1N0eWxlcyArPSAiICIgKyAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpCi0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFLGVuY29kaW5nU3R5bGVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8qCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzd2l0Y2ggKFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoY2hpbGQpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5QQVJUIDoKLSAgICAgICAgUGFydCBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICAgICAgcGFydC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgIHBhcnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGdldFBhcnRzKCkuYWRkKHBhcnQpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgKi8KLSAgCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLCBTT0FQQ29uc3RhbnRzLkJPRFlfRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfSAKLX0gLy9TT0FQQm9keUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmNkYWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgU09BUEZhY3RvcnkgewotICAvKioKLSAgICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBGYWN0b3J5SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0gIHsKLSAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQklORElORzogcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQk9EWTogcmV0dXJuIGNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0U6IHJldHVybiBjcmVhdGVTT0FQSGVhZGVyQmFzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUOiByZXR1cm4gY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OOiByZXR1cm4gY3JlYXRlU09BUE9wZXJhdGlvbigpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0FERFJFU1M6IHJldHVybiBjcmVhdGVTT0FQQWRkcmVzcygpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVDogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUjogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXIoKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLklTVFJJTkc6Ci0gICAgICAgIHJldHVybiBjcmVhdGVJU3RyaW5nRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5JU1RSSU5HOgotICAgICAgICByZXR1cm4gY29udmVydElTdHJpbmdUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEJpbmRpbmcgY3JlYXRlU09BUEJpbmRpbmcoKQotICB7Ci0gICAgU09BUEJpbmRpbmdJbXBsIHNvYXBCaW5kaW5nID0gbmV3IFNPQVBCaW5kaW5nSW1wbCgpOwotICAgIHJldHVybiBzb2FwQmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQQm9keSBjcmVhdGVTT0FQQm9keSgpCi0gIHsKLSAgICBTT0FQQm9keUltcGwgc29hcEJvZHkgPSBuZXcgU09BUEJvZHlJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBCb2R5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBIZWFkZXJCYXNlIGNyZWF0ZVNPQVBIZWFkZXJCYXNlKCkKLSAgewotICAgIFNPQVBIZWFkZXJCYXNlSW1wbCBzb2FwSGVhZGVyQmFzZSA9IG5ldyBTT0FQSGVhZGVyQmFzZUltcGwoKTsKLSAgICByZXR1cm4gc29hcEhlYWRlckJhc2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEZhdWx0IGNyZWF0ZVNPQVBGYXVsdCgpCi0gIHsKLSAgICBTT0FQRmF1bHRJbXBsIHNvYXBGYXVsdCA9IG5ldyBTT0FQRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQT3BlcmF0aW9uIGNyZWF0ZVNPQVBPcGVyYXRpb24oKQotICB7Ci0gICAgU09BUE9wZXJhdGlvbkltcGwgc29hcE9wZXJhdGlvbiA9IG5ldyBTT0FQT3BlcmF0aW9uSW1wbCgpOwotICAgIHJldHVybiBzb2FwT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBBZGRyZXNzIGNyZWF0ZVNPQVBBZGRyZXNzKCkKLSAgewotICAgIFNPQVBBZGRyZXNzSW1wbCBzb2FwQWRkcmVzcyA9IG5ldyBTT0FQQWRkcmVzc0ltcGwoKTsKLSAgICByZXR1cm4gc29hcEFkZHJlc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUEhlYWRlckZhdWx0IGNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICBTT0FQSGVhZGVyRmF1bHRJbXBsIHNvYXBIZWFkZXJGYXVsdCA9IG5ldyBTT0FQSGVhZGVyRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXJGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQSGVhZGVyIGNyZWF0ZVNPQVBIZWFkZXIoKQotICB7Ci0gICAgU09BUEhlYWRlckltcGwgc29hcEhlYWRlciA9IG5ldyBTT0FQSGVhZGVySW1wbCgpOwotICAgIHJldHVybiBzb2FwSGVhZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVJU3RyaW5nRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJU3RyaW5nVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU09BUFBhY2thZ2UgZ2V0U09BUFBhY2thZ2UoKQotICB7Ci0gICAgcmV0dXJuIChTT0FQUGFja2FnZSlnZXRFUGFja2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHN0YXRpYyBTT0FQUGFja2FnZSBnZXRQYWNrYWdlKCkKLSAgewotICAgIHJldHVybiBTT0FQUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLX0gLy9TT0FQRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEZhdWx0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQRmF1bHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzUzNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZVVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmF1bHRJbXBsI2dldFVzZSA8ZW0+VXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQRmF1bHRJbXBsI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEZhdWx0SW1wbCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEZhdWx0SW1wbCBleHRlbmRzIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNPQVBGYXVsdCB7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlKCkgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZSA9IFVTRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZ1N0eWxlcygpIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIEVMaXN0IGVuY29kaW5nU3R5bGVzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgU09BUEZhdWx0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQRmF1bHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlKCkKLSAgewotICAgIHJldHVybiB1c2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2UoU3RyaW5nIG5ld1VzZSkKLSAgewotICAgIFN0cmluZyBvbGRVc2UgPSB1c2U7Ci0gICAgdXNlID0gbmV3VXNlOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1VTRSwgb2xkVXNlLCB1c2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiBuYW1lc3BhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5ld05hbWVzcGFjZVVSSSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgbmFtZXNwYWNlVVJJID0gbmV3TmFtZXNwYWNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi17Ci0gIHJldHVybiBuYW1lOwotfQotCi1wdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKQotewotICB0aGlzLm5hbWUgPSBuYW1lOwotfQotCi1wdWJsaWMgdm9pZCBzZXRFbmNvZGluZ1N0eWxlcyhMaXN0IGxpc3QpCi17Ci0gIGVuY29kaW5nU3R5bGVzID0gKEVMaXN0KWxpc3Q7Ci19Ci0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBMaXN0IGdldEVuY29kaW5nU3R5bGVzKCkKLSAgewotICAgIGlmIChlbmNvZGluZ1N0eWxlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVuY29kaW5nU3R5bGVzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBnZXRFbmNvZGluZ1N0eWxlcygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKChRTmFtZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19VU0U6Ci0gICAgICAgIHNldFVzZShVU0VfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9GQVVMVF9fVVNFOgotICAgICAgICByZXR1cm4gVVNFX0VERUZBVUxUID09IG51bGwgPyB1c2UgIT0gbnVsbCA6ICFVU0VfRURFRkFVTFQuZXF1YWxzKHVzZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh1c2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodXNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5jb2RpbmdTdHlsZXM6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RpbmdTdHlsZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldE5hbWUKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSkpOwotICAgIHNldE5hbWVzcGFjZVVSSQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLk5BTUVTUEFDRV9VUklfQVRUUklCVVRFKSk7Ci0gICAgc2V0VXNlCi0gICAgICAoU09BUENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSkpOwotICAgIAotICAgIC8vIFRCRCAtIGhhbmRsZSBlbmNvZGluZ1N0eWxlcwotICAgIAotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSxnZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9Vc2UoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LFNPQVBDb25zdGFudHMuVVNFX0FUVFJJQlVURSxnZXRVc2UoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBGYXVsdF9FbmNvZGluZ1N0eWxlcygpKQotCSAgewotCSAgICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlTGlzdCA9IGdldEVuY29kaW5nU3R5bGVzKCk7Ci0JICAgICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSAiIjsKLQkgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZW5jb2RpbmdTdHlsZUxpc3QuaXRlcmF0b3IoKTsKLQkgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0JICAgICAgICB7Ci0JICAgICAgICAgIGlmIChlbmNvZGluZ1N0eWxlcy5lcXVhbHMoIiIpKSAvLyBmaXJzdCBpdGVyYXRpb24KLQkgICAgICAgICAgICBlbmNvZGluZ1N0eWxlcyArPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkgICAgICAgICAgZWxzZQotCSAgICAgICAgICAJZW5jb2RpbmdTdHlsZXMgKz0gIiAiICsgKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAoIWVuY29kaW5nU3R5bGVzLmVxdWFscygiIikpCi0JICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLkVOQ09ESU5HX1NUWUxFX0FUVFJJQlVURSxlbmNvZGluZ1N0eWxlcyk7Ci0JICAgICAgfSAvLyBUQkQgLSBJcyB0aGlzIHRoZSBwcm9wZXIgd2F5IHRvIGhhbmRsZSBlbmNvZGluZ1N0eWxlcwotICAgICAgaWYgKGdldE5hbWUoKSAhPSBudWxsKQotICAgICAgCW5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLGdldE5hbWUoKSk7IC8vIFJldmlzaXQgUm9zZSBtb2RlbAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnRUeXBlKCkKLSAgewotICAgIGlmIChlbGVtZW50VHlwZSA9PSBudWxsKQotICAgICAgZWxlbWVudFR5cGUgPSBuZXcgUU5hbWUoU09BUENvbnN0YW50cy5TT0FQX05BTUVTUEFDRV9VUkksIFNPQVBDb25zdGFudHMuRkFVTFRfRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotCi19IC8vU09BUEZhdWx0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyQmFzZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckJhc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmIwNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyQmFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsLlNPQVBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkhlYWRlciBCYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwjZ2V0VXNlIDxlbT5Vc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJCYXNlSW1wbCNnZXROYW1lc3BhY2VVUkkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBIZWFkZXJCYXNlSW1wbCNnZXRFbmNvZGluZ1N0eWxlcyA8ZW0+RW5jb2RpbmcgU3R5bGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVyQmFzZUltcGwjZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUEhlYWRlckJhc2VJbXBsI2dldFBhcnQgPGVtPlBhcnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVyQmFzZUltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQSGVhZGVyQmFzZSB7Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlKCkgPGVtPlVzZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVc2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZSgpIDxlbT5Vc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0VXNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZSA9IFVTRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZ1N0eWxlcygpIDxlbT5FbmNvZGluZyBTdHlsZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbmNvZGluZ1N0eWxlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIEVMaXN0IGVuY29kaW5nU3R5bGVzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZSgpIDxlbT5NZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0KCkgPGVtPlBhcnQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UGFydCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFBhcnQgcGFydCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBIZWFkZXJCYXNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyQmFzZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXRVc2UoKQotICB7Ci0gICAgcmV0dXJuIHVzZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFVzZShTdHJpbmcgbmV3VXNlKQotICB7Ci0gICAgU3RyaW5nIG9sZFVzZSA9IHVzZTsKLSAgICB1c2UgPSBuZXdVc2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fVVNFLCBvbGRVc2UsIHVzZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmV3TmFtZXNwYWNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLSAgICBuYW1lc3BhY2VVUkkgPSBuZXdOYW1lc3BhY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSSwgb2xkTmFtZXNwYWNlVVJJLCBuYW1lc3BhY2VVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFTGlzdCBnZXRFbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICBpZiAoZW5jb2RpbmdTdHlsZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbmNvZGluZ1N0eWxlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUyk7Ci0gICAgfQotICAgIHJldHVybiBlbmNvZGluZ1N0eWxlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgTWVzc2FnZSBvbGRNZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgIG1lc3NhZ2UgPSAoTWVzc2FnZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpbWVzc2FnZSk7Ci0gICAgICBpZiAobWVzc2FnZSAhPSBvbGRNZXNzYWdlKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0UsIG9sZE1lc3NhZ2UsIG1lc3NhZ2UpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgTWVzc2FnZSBiYXNpY0dldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKE1lc3NhZ2UgbmV3TWVzc2FnZSkKLSAgewotICAgIE1lc3NhZ2Ugb2xkTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgbWVzc2FnZSA9IG5ld01lc3NhZ2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTUVTU0FHRSwgb2xkTWVzc2FnZSwgbWVzc2FnZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFBhcnQgZ2V0UGFydCgpCi0gIHsKLSAgICBpZiAocGFydCAhPSBudWxsICYmIHBhcnQuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBQYXJ0IG9sZFBhcnQgPSBwYXJ0OwotICAgICAgcGFydCA9IChQYXJ0KWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClwYXJ0KTsKLSAgICAgIGlmIChwYXJ0ICE9IG9sZFBhcnQpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUEFSVCwgb2xkUGFydCwgcGFydCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBQYXJ0IGJhc2ljR2V0UGFydCgpCi0gIHsKLSAgICByZXR1cm4gcGFydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnQoUGFydCBuZXdQYXJ0KQotICB7Ci0gICAgUGFydCBvbGRQYXJ0ID0gcGFydDsKLSAgICBwYXJ0ID0gbmV3UGFydDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19QQVJULCBvbGRQYXJ0LCBwYXJ0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRNZXNzYWdlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1BBUlQ6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFydCgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRQYXJ0KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19QQVJUOgotICAgICAgICBzZXRQYXJ0KChQYXJ0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKE5BTUVTUEFDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIHNldE1lc3NhZ2UoKE1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fUEFSVDoKLSAgICAgICAgc2V0UGFydCgoUGFydCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gcmVxdWlyZWQgIT0gUkVRVUlSRURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRV9fVVNFOgotICAgICAgICByZXR1cm4gVVNFX0VERUZBVUxUID09IG51bGwgPyB1c2UgIT0gbnVsbCA6ICFVU0VfRURFRkFVTFQuZXF1YWxzKHVzZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9CQVNFX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBtZXNzYWdlICE9IG51bGw7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0JBU0VfX1BBUlQ6Ci0gICAgICAgIHJldHVybiBwYXJ0ICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh1c2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodXNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5jb2RpbmdTdHlsZXM6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZW5jb2RpbmdTdHlsZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kczogRE9NIC0+IE1vZGVsCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgaWYgKGNoYW5nZWRFbGVtZW50Lmhhc0F0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpKQotICAgICAgc2V0VXNlKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZShTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUpKTsKLSAgICBpZiAoY2hhbmdlZEVsZW1lbnQuaGFzQXR0cmlidXRlKFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpCi0gICAgICBzZXROYW1lc3BhY2VVUkkoY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuTkFNRVNQQUNFX0FUVFJJQlVURSkpOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUpKSAKLSAgICB7Ci0gICAgICBTdHJpbmcgZW5jb2RpbmdTdHlsZXMgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUpOwotICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZW5jb2RpbmdTdHlsZXMpOwotICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAJZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICB9IAotICAgIAotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgbWVzc2FnZVFOYW1lID0gY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSkpOwotICAgICAgTWVzc2FnZSBuZXdNZXNzYWdlID0gKG1lc3NhZ2VRTmFtZSAhPSBudWxsKSA/IChNZXNzYWdlKSBkZWZpbml0aW9uLmdldE1lc3NhZ2UobWVzc2FnZVFOYW1lKSA6IG51bGw7Ci0gICAgICBpZiAobmV3TWVzc2FnZSAhPSBudWxsICYmIG5ld01lc3NhZ2UgIT0gZ2V0TWVzc2FnZSgpKQotICAgICAgICBzZXRNZXNzYWdlKG5ld01lc3NhZ2UpOwotICAgICAgCi0gICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoU09BUENvbnN0YW50cy5QQVJUX0FUVFJJQlVURSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFNPQVBDb25zdGFudHMuUEFSVF9BVFRSSUJVVEUpOwotICAgICAgICBQYXJ0IG5ld1BhcnQgPSAobmV3TWVzc2FnZSAhPSBudWxsKSA/IChQYXJ0KSBuZXdNZXNzYWdlLmdldFBhcnQocGFydE5hbWUpIDogbnVsbDsKLSAgICAgICAgaWYgKG5ld1BhcnQgIT0gbnVsbCAmJiBuZXdQYXJ0ICE9IGdldFBhcnQoKSkKLSAgICAgICAgICBzZXRQYXJ0KG5ld1BhcnQpOwotICAgICAgfSAgIAotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9CSAgCi0gCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfVXNlKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCxTT0FQQ29uc3RhbnRzLlVTRV9BVFRSSUJVVEUsZ2V0VXNlKCkpOwotICAgICAgaWYoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXJCYXNlX05hbWVzcGFjZVVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5OQU1FU1BBQ0VfQVRUUklCVVRFLGdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfRW5jb2RpbmdTdHlsZXMoKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBlbmNvZGluZ1N0eWxlTGlzdCA9IGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICAgIFN0cmluZyBlbmNvZGluZ1N0eWxlcyA9ICIiOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVuY29kaW5nU3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZW5jb2RpbmdTdHlsZXMuZXF1YWxzKCIiKSkgLy8gZmlyc3QgaXRlcmF0aW9uCi0gICAgICAgICAgICBlbmNvZGluZ1N0eWxlcyArPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICBlbHNlCi0gIAkgICAgICAgIGVuY29kaW5nU3R5bGVzICs9ICIgIiArIChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZW5jb2RpbmdTdHlsZXMuZXF1YWxzKCIiKSkKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5FTkNPRElOR19TVFlMRV9BVFRSSUJVVEUsZW5jb2RpbmdTdHlsZXMpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUEhlYWRlckJhc2VfTWVzc2FnZSgpKQotICAgICAgewotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBRTmFtZSBxTmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgU09BUENvbnN0YW50cy5NRVNTQUdFX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCkpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IGdldFBhcnQoKTsKLSAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IHBhcnQuZ2V0TmFtZSgpOwotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgU09BUENvbnN0YW50cy5QQVJUX0FUVFJJQlVURSxwYXJ0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0gLy9TT0FQSGVhZGVyQmFzZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckZhdWx0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyRmF1bHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzMzZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVyRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGVhZGVyIEZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEhlYWRlckZhdWx0SW1wbCBleHRlbmRzIFNPQVBIZWFkZXJCYXNlSW1wbCBpbXBsZW1lbnRzIFNPQVBIZWFkZXJGYXVsdCB7Ci0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQSGVhZGVyRmF1bHRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBIZWFkZXJGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1VTRToKLSAgICAgICAgcmV0dXJuIGdldFVzZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICByZXR1cm4gZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX01FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0TWVzc2FnZSgpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRNZXNzYWdlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19QQVJUOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFBhcnQoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0UGFydCgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19VU0U6Ci0gICAgICAgIHNldFVzZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fUEFSVDoKLSAgICAgICAgc2V0UGFydCgoUGFydCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1VTRToKLSAgICAgICAgc2V0VXNlKFVTRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSShOQU1FU1BBQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX01FU1NBR0U6Ci0gICAgICAgIHNldE1lc3NhZ2UoKE1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX1BBUlQ6Ci0gICAgICAgIHNldFBhcnQoKFBhcnQpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9GQVVMVF9fVVNFOgotICAgICAgICByZXR1cm4gVVNFX0VERUZBVUxUID09IG51bGwgPyB1c2UgIT0gbnVsbCA6ICFVU0VfRURFRkFVTFQuZXF1YWxzKHVzZSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICByZXR1cm4gTkFNRVNQQUNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbmFtZXNwYWNlVVJJICE9IG51bGwgOiAhTkFNRVNQQUNFX1VSSV9FREVGQVVMVC5lcXVhbHMobmFtZXNwYWNlVVJJKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nU3R5bGVzICE9IG51bGwgJiYgIWVuY29kaW5nU3R5bGVzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfRkFVTFRfX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBtZXNzYWdlICE9IG51bGw7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUX19QQVJUOgotICAgICAgICByZXR1cm4gcGFydCAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLCBTT0FQQ29uc3RhbnRzLkhFQURFUl9GQVVMVF9FTEVNRU5UX1RBRyk7Ci0gICAgcmV0dXJuIGVsZW1lbnRUeXBlOwotICB9IAotCi19IC8vU09BUEhlYWRlckZhdWx0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQSGVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzY5MDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwuaW1wbC5TT0FQSGVhZGVySW1wbCNnZXRIZWFkZXJGYXVsdHMgPGVtPkhlYWRlciBGYXVsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVySW1wbCBleHRlbmRzIFNPQVBIZWFkZXJCYXNlSW1wbCBpbXBsZW1lbnRzIFNPQVBIZWFkZXIgewotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVhZGVyRmF1bHRzKCkgPGVtPkhlYWRlciBGYXVsdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRIZWFkZXJGYXVsdHMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotCXByb3RlY3RlZCBFTGlzdCBoZWFkZXJGYXVsdHMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQSGVhZGVySW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQSGVhZGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0SGVhZGVyRmF1bHRzKCkKLSAgewotICAgIGlmIChoZWFkZXJGYXVsdHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBoZWFkZXJGYXVsdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU09BUEhlYWRlckZhdWx0LmNsYXNzLCB0aGlzLCBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fSEVBREVSX0ZBVUxUUyk7Ci0gICAgfQotICAgIHJldHVybiBoZWFkZXJGYXVsdHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SGVhZGVyRmF1bHRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1JFUVVJUkVEOgotICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19VU0U6Ci0gICAgICAgIHJldHVybiBnZXRVc2UoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgcmV0dXJuIGdldEVuY29kaW5nU3R5bGVzKCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19NRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0TWVzc2FnZSgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUEFSVDoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRQYXJ0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldFBhcnQoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFM6Ci0gICAgICAgIHJldHVybiBnZXRIZWFkZXJGYXVsdHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fVVNFOgotICAgICAgICBzZXRVc2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHNldE5hbWVzcGFjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRU5DT0RJTkdfU1RZTEVTOgotICAgICAgICBnZXRFbmNvZGluZ1N0eWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVuY29kaW5nU3R5bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTUVTU0FHRToKLSAgICAgICAgc2V0TWVzc2FnZSgoTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1BBUlQ6Ci0gICAgICAgIHNldFBhcnQoKFBhcnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTOgotICAgICAgICBnZXRIZWFkZXJGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICBnZXRIZWFkZXJGYXVsdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fRUxFTUVOVF9UWVBFOgotICAgICAgICBzZXRFbGVtZW50VHlwZShFTEVNRU5UX1RZUEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19VU0U6Ci0gICAgICAgIHNldFVzZShVU0VfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VOQ09ESU5HX1NUWUxFUzoKLSAgICAgICAgZ2V0RW5jb2RpbmdTdHlsZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19NRVNTQUdFOgotICAgICAgICBzZXRNZXNzYWdlKChNZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19QQVJUOgotICAgICAgICBzZXRQYXJ0KChQYXJ0KW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19IRUFERVJfRkFVTFRTOgotICAgICAgICBnZXRIZWFkZXJGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX1VTRToKLSAgICAgICAgcmV0dXJuIFVTRV9FREVGQVVMVCA9PSBudWxsID8gdXNlICE9IG51bGwgOiAhVVNFX0VERUZBVUxULmVxdWFscyh1c2UpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIE5BTUVTUEFDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWVzcGFjZVVSSSAhPSBudWxsIDogIU5BTUVTUEFDRV9VUklfRURFRkFVTFQuZXF1YWxzKG5hbWVzcGFjZVVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19FTkNPRElOR19TVFlMRVM6Ci0gICAgICAgIHJldHVybiBlbmNvZGluZ1N0eWxlcyAhPSBudWxsICYmICFlbmNvZGluZ1N0eWxlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX19NRVNTQUdFOgotICAgICAgICByZXR1cm4gbWVzc2FnZSAhPSBudWxsOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX0hFQURFUl9fUEFSVDoKLSAgICAgICAgcmV0dXJuIHBhcnQgIT0gbnVsbDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFM6Ci0gICAgICAgIHJldHVybiBoZWFkZXJGYXVsdHMgIT0gbnVsbCAmJiAhaGVhZGVyRmF1bHRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGlmIChTT0FQQ29uc3RhbnRzLkhFQURFUl9GQVVMVF9FTEVNRU5UX1RBRy5lcXVhbHMoZWxlbWVudC5nZXRMb2NhbE5hbWUoKSkpCi0gICAgewotICAgICAgU09BUEhlYWRlckZhdWx0IGZhdWx0ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpOwotICAgICAgZmF1bHQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgZmF1bHQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICBnZXRIZWFkZXJGYXVsdHMoKS5hZGQoZmF1bHQpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHJlbW92ZSh0aGlzLCBpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKE9iamVjdCBjb21wb25lbnQsIE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gKFNPQVBIZWFkZXIpIGNvbXBvbmVudDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBTT0FQSGVhZGVyRmF1bHQpCi0gICAgewotICAgICAgaGVhZGVyLmdldEhlYWRlckZhdWx0cygpLnJlbW92ZShtb2RlbE9iamVjdCk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotICB7Ci0gICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpCi0gICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSwgU09BUENvbnN0YW50cy5IRUFERVJfRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfSAKLQotfSAvL1NPQVBIZWFkZXJJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBPcGVyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBPcGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MzUxYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQT3BlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC5pbXBsLlNPQVBPcGVyYXRpb25JbXBsI2dldFNvYXBBY3Rpb25VUkkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGwuU09BUE9wZXJhdGlvbkltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUE9wZXJhdGlvbkltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBTT0FQT3BlcmF0aW9uIHsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQWN0aW9uVVJJKCkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTb2FwQWN0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0FDVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQWN0aW9uVVJJKCkgPGVtPlNvYXAgQWN0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTb2FwQWN0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNvYXBBY3Rpb25VUkkgPSBTT0FQX0FDVElPTl9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBTT0FQT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFNPQVBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQT3BlcmF0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvYXBBY3Rpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBBY3Rpb25VUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb2FwQWN0aW9uVVJJKFN0cmluZyBuZXdTb2FwQWN0aW9uVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFNvYXBBY3Rpb25VUkkgPSBzb2FwQWN0aW9uVVJJOwotICAgIHNvYXBBY3Rpb25VUkkgPSBuZXdTb2FwQWN0aW9uVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TT0FQX0FDVElPTl9VUkksIG9sZFNvYXBBY3Rpb25VUkksIHNvYXBBY3Rpb25VUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIG5ld1N0eWxlKQotICB7Ci0gICAgU3RyaW5nIG9sZFN0eWxlID0gc3R5bGU7Ci0gICAgc3R5bGUgPSBuZXdTdHlsZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU1RZTEUsIG9sZFN0eWxlLCBzdHlsZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiBpc1JlcXVpcmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIGdldFNvYXBBY3Rpb25VUkkoKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICByZXR1cm4gZ2V0U3R5bGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fU09BUF9BQ1RJT05fVVJJOgotICAgICAgICBzZXRTb2FwQWN0aW9uVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgc2V0U29hcEFjdGlvblVSSShTT0FQX0FDVElPTl9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoU1RZTEVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBTT0FQUGFja2FnZS5TT0FQX09QRVJBVElPTl9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9PUEVSQVRJT05fX1NPQVBfQUNUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIFNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gc29hcEFjdGlvblVSSSAhPSBudWxsIDogIVNPQVBfQUNUSU9OX1VSSV9FREVGQVVMVC5lcXVhbHMoc29hcEFjdGlvblVSSSk7Ci0gICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgcmV0dXJuIFNUWUxFX0VERUZBVUxUID09IG51bGwgPyBzdHlsZSAhPSBudWxsIDogIVNUWUxFX0VERUZBVUxULmVxdWFscyhzdHlsZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChzb2FwQWN0aW9uVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHNvYXBBY3Rpb25VUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgc3R5bGU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc3R5bGUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQkKLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHM6IERPTSAtPiBNb2RlbAotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHNldFNvYXBBY3Rpb25VUkkKLSAgICAgIChTT0FQQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgU09BUENvbnN0YW50cy5TT0FQX0FDVElPTl9BVFRSSUJVVEUpKTsKLSAgICBzZXRTdHlsZQotICAgICAgKFNPQVBDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBTT0FQQ29uc3RhbnRzLlNUWUxFX0FUVFJJQlVURSkpOwotICAgIHJlY29uY2lsZVJlZmVyZW5jZXMoZmFsc2UpOwotICB9Ci0gIAotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gU09BUFBhY2thZ2UuZUlOU1RBTkNFLmdldFNPQVBPcGVyYXRpb25fU29hcEFjdGlvblVSSSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5TT0FQX0FDVElPTl9BVFRSSUJVVEUsZ2V0U29hcEFjdGlvblVSSSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBTT0FQUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUE9wZXJhdGlvbl9TdHlsZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsU09BUENvbnN0YW50cy5TVFlMRV9BVFRSSUJVVEUsZ2V0U3R5bGUoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudFR5cGUoKQotICB7Ci0gICAgaWYgKGVsZW1lbnRUeXBlID09IG51bGwpCi0gICAgICBlbGVtZW50VHlwZSA9IG5ldyBRTmFtZShTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSwgU09BUENvbnN0YW50cy5PUEVSQVRJT05fRUxFTUVOVF9UQUcpOwotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfSAKLQotfSAvL1NPQVBPcGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvaW1wbC9TT0FQUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyNTQ1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC9pbXBsL1NPQVBQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEUGFja2FnZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgU09BUFBhY2thZ2UgewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc29hcEJvZHlFQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBIZWFkZXJCYXNlRUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBBZGRyZXNzRUNsYXNzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIEVDbGFzcyBzb2FwSGVhZGVyRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRUNsYXNzIHNvYXBIZWFkZXJFQ2xhc3MgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgRURhdGFUeXBlIGlTdHJpbmdFRGF0YVR5cGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0gICAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0gICAqIHBhY2thZ2UgVVJJIHZhbHVlLgotICAgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0gICAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0gICAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0gICAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2UjZU5TX1VSSQotICAgKiBAc2VlICNpbml0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcml2YXRlIFNPQVBQYWNrYWdlSW1wbCgpCi0gIHsKLSAgICBzdXBlcihlTlNfVVJJLCBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLSAgICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLSAgICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLSAgICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0gICAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLSAgICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLSAgICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotICAgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLSAgICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotICAgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotICAgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotICAgKiB0aG9zZSBvZiBhbm90aGVyLgotICAgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0gICAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZU5TX1VSSQotICAgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotICAgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgc3RhdGljIFNPQVBQYWNrYWdlIGluaXQoKQotICB7Ci0gICAgaWYgKGlzSW5pdGVkKSByZXR1cm4gKFNPQVBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChTT0FQUGFja2FnZS5lTlNfVVJJKTsKLQotICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UuCi0gICAgU09BUFBhY2thZ2VJbXBsIHRoZVNPQVBQYWNrYWdlID0gKFNPQVBQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgU09BUFBhY2thZ2VJbXBsKCkpOwotCi0gICAgaXNJbml0ZWQgPSB0cnVlOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0gICAgWFNEUGFja2FnZUltcGwuaW5pdCgpOwotCi0gICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLSAgICBXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoV1NETFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChXU0RMUGFja2FnZS5lTlNfVVJJKSA6IFdTRExQYWNrYWdlSW1wbC5lSU5TVEFOQ0UpOwotCi0gICAgLy8gU3RlcCAxOiBjcmVhdGUgbWV0YS1tb2RlbCBvYmplY3RzCi0gICAgdGhlU09BUFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0gICAgdGhlV1NETFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICAvLyBTdGVwIDI6IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uCi0gICAgdGhlU09BUFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotICAgIHRoZVdTRExQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotICAgIHJldHVybiB0aGVTT0FQUGFja2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUEJpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBCaW5kaW5nRUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEJpbmRpbmdfVHJhbnNwb3J0VVJJKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwQmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEJpbmRpbmdfU3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBCaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBCb2R5KCkKLSAgewotICAgIHJldHVybiBzb2FwQm9keUVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBCb2R5X1VzZSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEJvZHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBCb2R5X05hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEJvZHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBCb2R5X0VuY29kaW5nU3R5bGVzKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwQm9keUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U09BUEJvZHlfUGFydHMoKQotICB7Ci0gICAgcmV0dXJuIChFUmVmZXJlbmNlKXNvYXBCb2R5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBIZWFkZXJCYXNlKCkKLSAgewotICAgIHJldHVybiBzb2FwSGVhZGVyQmFzZUVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX1VzZSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEhlYWRlckJhc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX05hbWVzcGFjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEhlYWRlckJhc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBIZWFkZXJCYXNlX0VuY29kaW5nU3R5bGVzKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwSGVhZGVyQmFzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlckJhc2VfTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gKEVSZWZlcmVuY2Upc29hcEhlYWRlckJhc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNPQVBIZWFkZXJCYXNlX1BhcnQoKQotICB7Ci0gICAgcmV0dXJuIChFUmVmZXJlbmNlKXNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gc29hcEZhdWx0RUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEZhdWx0X1VzZSgpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEZhdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQRmF1bHRfTmFtZXNwYWNlVVJJKCkKLSAgewotICAgIHJldHVybiAoRUF0dHJpYnV0ZSlzb2FwRmF1bHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBGYXVsdF9FbmNvZGluZ1N0eWxlcygpCi0gIHsKLSAgICByZXR1cm4gKEVBdHRyaWJ1dGUpc29hcEZhdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHNvYXBPcGVyYXRpb25FQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTT0FQT3BlcmF0aW9uX1NvYXBBY3Rpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNPQVBPcGVyYXRpb25fU3R5bGUoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U09BUEFkZHJlc3MoKQotICB7Ci0gICAgcmV0dXJuIHNvYXBBZGRyZXNzRUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U09BUEFkZHJlc3NfTG9jYXRpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIChFQXR0cmlidXRlKXNvYXBBZGRyZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gc29hcEhlYWRlckZhdWx0RUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVDbGFzcyBnZXRTT0FQSGVhZGVyKCkKLSAgewotICAgIHJldHVybiBzb2FwSGVhZGVyRUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U09BUEhlYWRlcl9IZWFkZXJGYXVsdHMoKQotICB7Ci0gICAgcmV0dXJuIChFUmVmZXJlbmNlKXNvYXBIZWFkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SVN0cmluZygpCi0gIHsKLSAgICByZXR1cm4gaVN0cmluZ0VEYXRhVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQRmFjdG9yeSBnZXRTT0FQRmFjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gKFNPQVBGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0gICAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotICB7Ci0gICAgaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotICAgIGlzQ3JlYXRlZCA9IHRydWU7Ci0KLSAgICAvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLSAgICBzb2FwQmluZGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0JJTkRJTkcpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEJpbmRpbmdFQ2xhc3MsIFNPQVBfQklORElOR19fVFJBTlNQT1JUX1VSSSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwQmluZGluZ0VDbGFzcywgU09BUF9CSU5ESU5HX19TVFlMRSk7Ci0KLSAgICBzb2FwQm9keUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0JPRFkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEJvZHlFQ2xhc3MsIFNPQVBfQk9EWV9fVVNFKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBCb2R5RUNsYXNzLCBTT0FQX0JPRFlfX05BTUVTUEFDRV9VUkkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEJvZHlFQ2xhc3MsIFNPQVBfQk9EWV9fRU5DT0RJTkdfU1RZTEVTKTsKLSAgICBjcmVhdGVFUmVmZXJlbmNlKHNvYXBCb2R5RUNsYXNzLCBTT0FQX0JPRFlfX1BBUlRTKTsKLQotICAgIHNvYXBIZWFkZXJCYXNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfSEVBREVSX0JBU0UpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcEhlYWRlckJhc2VFQ2xhc3MsIFNPQVBfSEVBREVSX0JBU0VfX1VTRSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwSGVhZGVyQmFzZUVDbGFzcywgU09BUF9IRUFERVJfQkFTRV9fTkFNRVNQQUNFX1VSSSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwSGVhZGVyQmFzZUVDbGFzcywgU09BUF9IRUFERVJfQkFTRV9fRU5DT0RJTkdfU1RZTEVTKTsKLSAgICBjcmVhdGVFUmVmZXJlbmNlKHNvYXBIZWFkZXJCYXNlRUNsYXNzLCBTT0FQX0hFQURFUl9CQVNFX19NRVNTQUdFKTsKLSAgICBjcmVhdGVFUmVmZXJlbmNlKHNvYXBIZWFkZXJCYXNlRUNsYXNzLCBTT0FQX0hFQURFUl9CQVNFX19QQVJUKTsKLQotICAgIHNvYXBGYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTT0FQX0ZBVUxUKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBGYXVsdEVDbGFzcywgU09BUF9GQVVMVF9fVVNFKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBGYXVsdEVDbGFzcywgU09BUF9GQVVMVF9fTkFNRVNQQUNFX1VSSSk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwRmF1bHRFQ2xhc3MsIFNPQVBfRkFVTFRfX0VOQ09ESU5HX1NUWUxFUyk7Ci0KLSAgICBzb2FwT3BlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfT1BFUkFUSU9OKTsKLSAgICBjcmVhdGVFQXR0cmlidXRlKHNvYXBPcGVyYXRpb25FQ2xhc3MsIFNPQVBfT1BFUkFUSU9OX19TT0FQX0FDVElPTl9VUkkpOwotICAgIGNyZWF0ZUVBdHRyaWJ1dGUoc29hcE9wZXJhdGlvbkVDbGFzcywgU09BUF9PUEVSQVRJT05fX1NUWUxFKTsKLQotICAgIHNvYXBBZGRyZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfQUREUkVTUyk7Ci0gICAgY3JlYXRlRUF0dHJpYnV0ZShzb2FwQWRkcmVzc0VDbGFzcywgU09BUF9BRERSRVNTX19MT0NBVElPTl9VUkkpOwotCi0gICAgc29hcEhlYWRlckZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNPQVBfSEVBREVSX0ZBVUxUKTsKLQotICAgIHNvYXBIZWFkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU09BUF9IRUFERVIpOwotICAgIGNyZWF0ZUVSZWZlcmVuY2Uoc29hcEhlYWRlckVDbGFzcywgU09BUF9IRUFERVJfX0hFQURFUl9GQVVMVFMpOwotCi0gICAgLy8gQ3JlYXRlIGRhdGEgdHlwZXMKLSAgICBpU3RyaW5nRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElTVFJJTkcpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLSAgICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLSAgewotICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0gICAgaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgICAvLyBJbml0aWFsaXplIHBhY2thZ2UKLSAgICBzZXROYW1lKGVOQU1FKTsKLSAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLSAgICBzZXROc1VSSShlTlNfVVJJKTsKLQotICAgIC8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLSAgICBXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdTRExQYWNrYWdlLmVOU19VUkkpOwotCi0gICAgLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotICAgIHNvYXBCaW5kaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgIHNvYXBCb2R5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgIHNvYXBIZWFkZXJCYXNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgIHNvYXBGYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVXU0RMUGFja2FnZS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICBzb2FwT3BlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgIHNvYXBBZGRyZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZVdTRExQYWNrYWdlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgIHNvYXBIZWFkZXJGYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNPQVBIZWFkZXJCYXNlKCkpOwotICAgIHNvYXBIZWFkZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRTT0FQSGVhZGVyQmFzZSgpKTsKLQotICAgIC8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0gICAgaW5pdEVDbGFzcyhzb2FwQmluZGluZ0VDbGFzcywgU09BUEJpbmRpbmcuY2xhc3MsICJTT0FQQmluZGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEJpbmRpbmdfVHJhbnNwb3J0VVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0cmFuc3BvcnRVUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBCaW5kaW5nX1N0eWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzdHlsZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBCb2R5RUNsYXNzLCBTT0FQQm9keS5jbGFzcywgIlNPQVBCb2R5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQQm9keV9Vc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVzZSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEJvZHlfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBCb2R5X0VuY29kaW5nU3R5bGVzKCksIHRoaXMuZ2V0SVN0cmluZygpLCAiZW5jb2RpbmdTdHlsZXMiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RVJlZmVyZW5jZShnZXRTT0FQQm9keV9QYXJ0cygpLCB0aGVXU0RMUGFja2FnZS5nZXRQYXJ0KCksIG51bGwsICJwYXJ0cyIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwSGVhZGVyQmFzZUVDbGFzcywgU09BUEhlYWRlckJhc2UuY2xhc3MsICJTT0FQSGVhZGVyQmFzZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEhlYWRlckJhc2VfVXNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1c2UiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBIZWFkZXJCYXNlX05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQSGVhZGVyQmFzZV9FbmNvZGluZ1N0eWxlcygpLCB0aGlzLmdldElTdHJpbmcoKSwgImVuY29kaW5nU3R5bGVzIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0gICAgaW5pdEVSZWZlcmVuY2UoZ2V0U09BUEhlYWRlckJhc2VfTWVzc2FnZSgpLCB0aGVXU0RMUGFja2FnZS5nZXRNZXNzYWdlKCksIG51bGwsICJtZXNzYWdlIiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RVJlZmVyZW5jZShnZXRTT0FQSGVhZGVyQmFzZV9QYXJ0KCksIHRoZVdTRExQYWNrYWdlLmdldFBhcnQoKSwgbnVsbCwgInBhcnQiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotCi0gICAgaW5pdEVDbGFzcyhzb2FwRmF1bHRFQ2xhc3MsIFNPQVBGYXVsdC5jbGFzcywgIlNPQVBGYXVsdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7Ci0gICAgaW5pdEVBdHRyaWJ1dGUoZ2V0U09BUEZhdWx0X1VzZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXNlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQRmF1bHRfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBGYXVsdF9FbmNvZGluZ1N0eWxlcygpLCB0aGlzLmdldElTdHJpbmcoKSwgImVuY29kaW5nU3R5bGVzIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBPcGVyYXRpb25FQ2xhc3MsIFNPQVBPcGVyYXRpb24uY2xhc3MsICJTT0FQT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLSAgICBpbml0RUF0dHJpYnV0ZShnZXRTT0FQT3BlcmF0aW9uX1NvYXBBY3Rpb25VUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNvYXBBY3Rpb25VUkkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBPcGVyYXRpb25fU3R5bGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInN0eWxlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcEFkZHJlc3NFQ2xhc3MsIFNPQVBBZGRyZXNzLmNsYXNzLCAiU09BUEFkZHJlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFQXR0cmlidXRlKGdldFNPQVBBZGRyZXNzX0xvY2F0aW9uVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvblVSSSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCk7Ci0KLSAgICBpbml0RUNsYXNzKHNvYXBIZWFkZXJGYXVsdEVDbGFzcywgU09BUEhlYWRlckZhdWx0LmNsYXNzLCAiU09BUEhlYWRlckZhdWx0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsKLQotICAgIGluaXRFQ2xhc3Moc29hcEhlYWRlckVDbGFzcywgU09BUEhlYWRlci5jbGFzcywgIlNPQVBIZWFkZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOwotICAgIGluaXRFUmVmZXJlbmNlKGdldFNPQVBIZWFkZXJfSGVhZGVyRmF1bHRzKCksIHRoaXMuZ2V0U09BUEhlYWRlckZhdWx0KCksIG51bGwsICJoZWFkZXJGYXVsdHMiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVEKTsKLQotICAgIC8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotICAgIGluaXRFRGF0YVR5cGUoaVN0cmluZ0VEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiSVN0cmluZyIsIElTX1NFUklBTElaQUJMRSk7Ci0KLSAgICAvLyBDcmVhdGUgcmVzb3VyY2UKLSAgICBjcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLSAgfQotfSAvL1NPQVBQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YmUyMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQm9keTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU09BUEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFNPQVBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBTT0FQQWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vZGVsUGFja2FnZSA9IFNPQVBQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHJvdGVjdGVkIFNPQVBTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotICAgIG5ldyBTT0FQU3dpdGNoKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQmluZGluZyhTT0FQQmluZGluZyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQQmluZGluZ0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBCb2R5KFNPQVBCb2R5IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBCb2R5QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUEhlYWRlckJhc2UoU09BUEhlYWRlckJhc2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEhlYWRlckJhc2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQRmF1bHQoU09BUEZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQT3BlcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU09BUEFkZHJlc3MoU09BUEFkZHJlc3Mgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlU09BUEFkZHJlc3NBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyRmF1bHQoU09BUEhlYWRlckZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVNPQVBIZWFkZXIoU09BUEhlYWRlciBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVTT0FQSGVhZGVyQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlV1NETEVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICB9OwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0gICAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KQotICB7Ci0gICAgcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQQmluZGluZ0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHkgPGVtPkJvZHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEJvZHlBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlIDxlbT5IZWFkZXIgQmFzZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQSGVhZGVyQmFzZUFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0IDxlbT5GYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhdWx0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEZhdWx0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQT3BlcmF0aW9uIDxlbT5PcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzcyA8ZW0+QWRkcmVzczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEFkZHJlc3MKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTT0FQQWRkcmVzc0FkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckZhdWx0IDxlbT5IZWFkZXIgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlciA8ZW0+SGVhZGVyPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfSAvL1NPQVBBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MGMzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU09BUENvbnN0YW50cyAKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREUkVTU19FTEVNRU5UX1RBRyA9ICJhZGRyZXNzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElOR19FTEVNRU5UX1RBRyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9FTEVNRU5UX1RBRyA9ICJib2R5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfRUxFTUVOVF9UQUcgPSAiZmF1bHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRUxFTUVOVF9UQUcgPSAiaGVhZGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0ZBVUxUX0VMRU1FTlRfVEFHID0gImhlYWRlcmZhdWx0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX0VMRU1FTlRfVEFHID0gIm9wZXJhdGlvbiI7Ci0JICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iOwotIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0FDVElPTl9BVFRSSUJVVEUgPSJzb2FwQWN0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfQVRUUklCVVRFID0ic3R5bGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9BVFRSSUJVVEUgPSJsb2NhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9BVFRSSUJVVEUgPSJ0cmFuc3BvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQVRUUklCVVRFID0idXNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0FUVFJJQlVURSA9Im5hbWVzcGFjZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9VUklfQVRUUklCVVRFID0ibmFtZXNwYWNlVVJJIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSJuYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfU1RZTEVfQVRUUklCVVRFID0iZW5jb2RpbmdTdHlsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfQVRUUklCVVRFID0ibWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfQVRUUklCVVRFID0icGFydCI7Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyZGFkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9pbnRlcm5hbC91dGlsL1NPQVBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgaWYgKFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIGlmIChTT0FQQ29uc3RhbnRzLkFERFJFU1NfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEFkZHJlc3MoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNPQVBDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQmluZGluZygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU09BUENvbnN0YW50cy5CT0RZX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTT0FQQ29uc3RhbnRzLkZBVUxUX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTT0FQQ29uc3RhbnRzLk9QRVJBVElPTl9FTEVNRU5UX1RBRy5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgIAlyZXR1cm4gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBPcGVyYXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNPQVBDb25zdGFudHMuSEVBREVSX0VMRU1FTlRfVEFHLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgCXJldHVybiBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoU09BUENvbnN0YW50cy5IRUFERVJfRkFVTFRfRUxFTUVOVF9UQUcuZXF1YWxzKGxvY2FsTmFtZSkpCi0gICAgICB7Ci0gICAgICAJcmV0dXJuIFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyRmF1bHQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBsb2NhbE5hbWU6ICIgKyBsb2NhbE5hbWUpOwotICAgICAgICByZXR1cm4gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVuaGFuZGxlZCBuYW1lc3BhY2U6ICIgKyBuYW1lc3BhY2UpOwotICAgICAgcmV0dXJuIFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL2ludGVybmFsL3V0aWwvU09BUFN3aXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTQ5ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvaW50ZXJuYWwvdXRpbC9TT0FQU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQU3dpdGNoIHsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXByb3RlY3RlZCBzdGF0aWMgU09BUFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIFNPQVBTd2l0Y2goKQotICB7Ci0gICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vZGVsUGFja2FnZSA9IFNPQVBQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpCi0gIHsKLSAgICBFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLSAgICBpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpCi0gICAgewotICAgICAgc3dpdGNoICh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CSU5ESU5HOgotICAgICAgICB7Ci0gICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBCaW5kaW5nKHNvYXBCaW5kaW5nKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQmluZGluZyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9CT0RZOgotICAgICAgICB7Ci0gICAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSAoU09BUEJvZHkpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBCb2R5KHNvYXBCb2R5KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQm9keSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEJvZHkpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQm9keSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU09BUFBhY2thZ2UuU09BUF9IRUFERVJfQkFTRToKLSAgICAgICAgewotICAgICAgICAgIFNPQVBIZWFkZXJCYXNlIHNvYXBIZWFkZXJCYXNlID0gKFNPQVBIZWFkZXJCYXNlKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQSGVhZGVyQmFzZShzb2FwSGVhZGVyQmFzZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEhlYWRlckJhc2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBIZWFkZXJCYXNlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEhlYWRlckJhc2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfRkFVTFQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gKFNPQVBGYXVsdCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlU09BUEZhdWx0KHNvYXBGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChzb2FwRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfT1BFUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uID0gKFNPQVBPcGVyYXRpb24pdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBPcGVyYXRpb24oc29hcE9wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcE9wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcE9wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBPcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfQUREUkVTUzoKLSAgICAgICAgewotICAgICAgICAgIFNPQVBBZGRyZXNzIHNvYXBBZGRyZXNzID0gKFNPQVBBZGRyZXNzKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTT0FQQWRkcmVzcyhzb2FwQWRkcmVzcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEFkZHJlc3MpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEFkZHJlc3MpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSX0ZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgU09BUEhlYWRlckZhdWx0IHNvYXBIZWFkZXJGYXVsdCA9IChTT0FQSGVhZGVyRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBIZWFkZXJGYXVsdChzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVNPQVBIZWFkZXJCYXNlKHNvYXBIZWFkZXJGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEhlYWRlckZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwSGVhZGVyRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNPQVBQYWNrYWdlLlNPQVBfSEVBREVSOgotICAgICAgICB7Ci0gICAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVNPQVBIZWFkZXIoc29hcEhlYWRlcik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlU09BUEhlYWRlckJhc2Uoc29hcEhlYWRlcik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoc29hcEhlYWRlcik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoc29hcEhlYWRlcik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBIZWFkZXIpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQmluZGluZyhTT0FQQmluZGluZyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Qm9keTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Cb2R5PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQQm9keShTT0FQQm9keSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyIEJhc2U8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBIZWFkZXJCYXNlKFNPQVBIZWFkZXJCYXNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GYXVsdDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUEZhdWx0KFNPQVBGYXVsdCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlU09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZGRyZXNzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFkZHJlc3M8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBBZGRyZXNzKFNPQVBBZGRyZXNzIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IZWFkZXIgRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyIEZhdWx0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyRmF1bHQoU09BUEhlYWRlckZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5IZWFkZXI8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SGVhZGVyPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTT0FQSGVhZGVyKFNPQVBIZWFkZXIgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlV1NETEVsZW1lbnQoV1NETEVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBjYXNlSUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0gLy9TT0FQU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy1zb2FwL29yZy9lY2xpcHNlL3dzdC93c2RsL2JpbmRpbmcvc29hcC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTQzNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi8uLi8uLi8uLi8vYXBpc3R5bGVzLmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPldTREwgTW9kZWwgU09BUCBCaW5kaW5nIEV4dGVuc2lvbiBBUEkgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD4KLSAgICAgICAgVGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIHdvcmsgd2l0aCB0aGUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgV1NETCBtb2RlbCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gbG9hZCwgbW9kaWZ5LCBhbmQgc2F2ZSBXU0RMIDEuMSBkb2N1bWVudHMuCi0JCTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXNvYXAvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvYmluZGluZy9zb2FwL3BhY2thZ2UueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2I5MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtc29hcC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9iaW5kaW5nL3NvYXAvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0JPGhlYWQ+Ci0JCTxtZXRhCi0JCQluYW1lPSJyb290IgotCQotCQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCQk8dGl0bGU+V1NETCBNb2RlbCBTT0FQIEJpbmRpbmcgRXh0ZW5zaW9uIEFQSSBPdmVydmlldzwvdGl0bGU+Ci0JPC9oZWFkPgotCi0JPGJvZHk+Ci0JCTxhYnN0cmFjdD4KLSAgICAgICAgVGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIHdvcmsgd2l0aCB0aGUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L2Fic3RyYWN0PgotCQk8cD5UaGUgV1NETCBtb2RlbCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gbG9hZCwgbW9kaWZ5LCBhbmQgc2F2ZSBXU0RMIDEuMSBkb2N1bWVudHMuCi0JCTwvcD4gCi0JPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9tb2RlbC9XU0RMLm1kbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvV1NETC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZGVhOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9tb2RlbC9XU0RMLm1kbAorKysgL2Rldi9udWxsCkBAIC0xLDMxMDIzICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQyCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNC41LjgwNTRhIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgRGVzaWduICJMb2dpY2FsIFZpZXciCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzCi0JcmlnaHRNYXJnaW4gCTAuMjUwMDAwCi0JbGVmdE1hcmdpbiAJMC4yNTAwMDAKLQl0b3BNYXJnaW4gIAkwLjI1MDAwMAotCWJvdHRvbU1hcmdpbiAJMC41MDAwMDAKLQlwYWdlT3ZlcmxhcCAJMC4yNTAwMDAKLQljbGlwSWNvbkxhYmVscyAJVFJVRQotCWF1dG9SZXNpemUgCVRSVUUKLQlzbmFwVG9HcmlkIAlUUlVFCi0JZ3JpZFggICAgICAJMTYKLQlncmlkWSAgICAgIAkxNgotCWRlZmF1bHRGb250IAkob2JqZWN0IEZvbnQKLQkgICAgc2l6ZSAgICAgICAJMTAKLQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCSAgICBib2xkICAgICAgIAlGQUxTRQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCSAgICBjb2xvciAgICAgIAkwCi0JICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0Jc2hvd01lc3NhZ2VOdW0gCTEKLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQotCW5vdGF0aW9uICAgCSJVbmlmaWVkIikKLSAgICByb290X3VzZWNhc2VfcGFja2FnZSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiVXNlIENhc2UgVmlldyIKLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY0IgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IFVzZUNhc2VEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDc4IgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICByb290X2NhdGVnb3J5IAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJMb2dpY2FsIFZpZXciCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2MyIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciCi0JcXVpZHUgICAgICAJIjM5RTI3RjA4MDA2NSIKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJ3c2RsIgotCQlxdWlkICAgICAgIAkiM0FERkI4RTUwMjFFIgotCQlkb2N1bWVudGF0aW9uIAkKLXxUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4KLXwKLXxXU0RMIGRlc2NyaWJlcyBuZXR3b3JrIHNlcnZpY2VzIGFzIHNldHMgb2YgZW5kcG9pbnRzIG9wZXJhdGluZyBvbiBtZXNzYWdlcy4gVGhlIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGFyZSBkZXNjcmliZWQgYWJzdHJhY3RseSwgYW5kIHRoZW4gYm91bmQgdG8gYSBjb25jcmV0ZSBuZXR3b3JrIHByb3RvY29sIGFuZCBtZXNzYWdlIGZvcm1hdCB0byBkZWZpbmUgYW4gZW5kcG9pbnQuCi18Ci18V1NETCBkZXNjcmliZXMgdGhlIGZvcm1hdHMgb2YgdGhlIG1lc3NhZ2VzIGV4Y2hhbmdlZCBieSB0aGUgc2VydmljZXMsIGFuZCBzdXBwb3J0cyB0aGUgWE1MIFNjaGVtYXMgc3BlY2lmaWNhdGlvbiBhcyBpdHMgY2Fub25pY2FsIHR5cGUgc3lzdGVtLiBUaGlzIHBhY2thZ2UgdXNlcyBhbiBYTUwgU2NoZW1hIEluZm9zZXQgbW9kZWwgcGFja2FnZSAoc2VlIHRoZSBYU0QgcGFja2FnZSkgdG8gZGVzY3JpYmUgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0cy4KLXwKLXxUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KQotfC0gMi4xIERlZmluaXRpb24sIHNob3dzIHRoZSBXU0RMIGRlZmluaXRpb24gZWxlbWVudCBhbmQgdGhlIFdTREwgZG9jdW1lbnQgc3RydWN0dXJlCi18LSAyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmcsIHNob3dzIHRoZSBuYW1lc3BhY2UgYW5kIGltcG9ydCBtZWNoYW5pc20KLXwtIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtCi18LSAyLjIgVHlwZXMsIHNob3dzIHRoZSB1c2Ugb2YgWE1MIFNjaGVtYSB0eXBlcyBpbiBXU0RMCi18LSAyLjMgTWVzc2FnZXMsIDIuNCBQb3J0VHlwZXMsIDIuNSBCaW5kaW5ncyBhbmQgMi43IFNlcnZpY2VzLCBzaG93IHRoZSBtYWpvciBXU0RMIGVsZW1lbnRzIGFuZCB0aGVpciByZWxhdGlvbnMuCi18Ci18VGhlIFdTREwgY2xhc3NlcyBleHRlbmQgdGhlIGphdmF4LndzZGwgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5IEpTUiAxMTAuIENsYXNzZXMgd2l0aCBpbnRlcmZhY2UgYW5kIGRhdGF0eXBlIHN0ZXJlb3R5cGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVzZSBub24tTU9GIGludGVyZmFjZXMuCi0JCQotCQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzcyAiV1NETEVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUM2QTMwMkREIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbGFuZ3VhZ2UgZWxlbWVudC4iCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEVuY2xvc2luZ0RlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1Mjk2MDBDOCIKLQkJCQlyZXN1bHQgICAgIAkiRGVmaW5pdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEVuY2xvc2luZ0RlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1MkI4MDM0NyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkZWZpbml0aW9uIgotCQkJCQl0eXBlICAgICAgIAkiRGVmaW5pdGlvbiIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50YXRpb25FbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0NFNDQzNjAyQTMiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNGOTdEQkQzMDIwNyIKLQkJCQl0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUG9ydFR5cGUiCi0JCQlxdWlkICAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydFR5cGUgZWxlbWVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4xIGFuZCBhbiBJbnRlcmZhY2UgY29tcG9uZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIuIEEgcG9ydCB0eXBlIG9yIEludGVyZmFjZSBpcyBhIG5hbWVkIHNldCBvZiBhYnN0cmFjdCBvcGVyYXRpb25zIGFuZCB0aGUgYWJzdHJhY3QgbWVzc2FnZXMgaW52b2x2ZWQuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDOUI3MDE1MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZEODAxOUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNBRUI0ODhFMDAyMyIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJCQlxdWlkICAgICAgIAkiM0JEREYxRTMwMUU1IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQuIEEgV1NETCBvcGVyYXRpb24gaXMgYW4gYWJzdHJhY3QgZGVzY3JpcHRpb24gb2YgYW4gYWN0aW9uIHN1cHBvcnRlZCBieSBhIHNlcnZpY2UuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTlERTk4MDAzQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZFMjAxNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDcyNjAxQUMiCi0JCQkJdHlwZSAgICAgICAJIk9wZXJhdGlvblR5cGUiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCREQ5NjQzMDA0QyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiTWVzc2FnZSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUQwNTUwMUM0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUVCNDg3QzAxRkUiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCRERGMUQyMDIyNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUGFydCIKLQkJCXF1aWQgICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwYXJ0IGVsZW1lbnQuIFBhcnRzIGRlc2NyaWJlIHRoZSBsb2dpY2FsIGFic3RyYWN0IGNvbnRlbnQgb2YgYSBtZXNzYWdlLiBFYWNoIHBhcnQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdHlwZSBmcm9tIHNvbWUgdHlwZSBzeXN0ZW0uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QTk2RDAyRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBOTNGMDFCRSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4OTdFMjMwMjM3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDRTcwQjcwM0M4IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnROYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjA4NzAzREIiCi0JCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0eXBlTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0JDRTcwQzMwM0M1IgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiQmluZGluZyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTBGMDJGMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4OTkwMTRCIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjFGNDAxQTMiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPcGVyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZy4gQW4gb3BlcmF0aW9uIGVsZW1lbnQgd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2l0aGluIHRoZSBiaW5kaW5nJ3MgcG9ydFR5cGUuICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ2MDA5MjAyRjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFERTQwMURDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUM0Q0IwMTk5IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlNlcnZpY2UiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4QTQwMTUxIgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkRERjIwRDAyMDMiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIlBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydCBlbGVtZW50LiBBIHBvcnQgZGVmaW5lcyBhbiBpbmRpdmlkdWFsIGVuZHBvaW50IGJ5IHNwZWNpZnlpbmcgYSBzaW5nbGUgYWRkcmVzcyBmb3IgYSBiaW5kaW5nIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDYwMENCMDBBQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1OTU0NTAyQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlBMDAzOTEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBXU0RMIGFsbG93cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRCMTI0MDJBQiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JEREY1MzUwMkMzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCQkJcXVpZCAgICAgICAJIjNBRjk1NDNDMDA3MyIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudFR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSIKLQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgV1NETCBkb2N1bWVudC4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEQjgwM0Q0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldERvY3VtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQ0QxNEZDMjAxMkIiCi0JCQkJcmVzdWx0ICAgICAJIkRPTURvY3VtZW50IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDRDE1MERFMDFFNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudCIKLQkJCQkJdHlwZSAgICAgICAJIkRPTURvY3VtZW50IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidGFyZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ3NDAwNEUiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjQwMzUyQjdDMDM5NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0FFQjQ4NTcwMkY1IgotCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZW5jb2RpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDBEMDAwRCIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJJbXBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFRTU4MDM3QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwRDAzNDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIyMDIwMTE5IikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjcyQzEwMzc5IgotCQkJCXJlc3VsdCAgICAgCSJYU0RTY2hlbWEiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MkMxMDM5NyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJzY2hlbWEiCi0JCQkJCXR5cGUgICAgICAgCSJYU0RTY2hlbWEiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lc3BhY2VVUkkiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNTBBMDAzNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUU1MTQwMjExIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkV4dGVuc2libGVFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJCWRvY3VtZW50YXRpb24gCSIgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQUQ1RkUzQzAzRDQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMTJDMDNDRCIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxNDcwMjk1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImV4dEVsZW1lbnQiCi0JCQkJCXR5cGUgICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgaW5wdXQgZWxlbWVudC4gQW4gaW5wdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NUM1MDQwMjVGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNjc3MjI4MDJFNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW5wdXQiCi0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3V0cHV0IgotCQkJcXVpZCAgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVDNTBDMDM1QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzNTAwREQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMUZGODAxQ0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50LiBGYXVsdCBlbGVtZW50cyBzcGVjaWZ5IHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgYW55IGVycm9yIG1lc3NhZ2VzIHRoYXQgbWF5IGJlIG91dHB1dCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTFDODIwMDJGMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjY3NzIzRDAzMTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjZGMjAwMjAwMkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTg2MTAzMUQiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdJbnB1dCIKLQkJCXF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUUxQjAxMTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFERUIwMTAwIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg1QjU5QjAwNzIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQTQwMjAzIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzQjUwM0EyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMxRUEwMjBFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIkJpbmRpbmdPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCODVCNUE0MDI3RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjUzRDkwMEYxIgotCQkJCXJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0T3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTNGMTAzMjYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0IgotCQkJCQl0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCQkJcXVpZCAgICAgICAJIjNCODVDMjAyMDBCRSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIpCi0JCSAgICAob2JqZWN0IENsYXNzICJCaW5kaW5nRmF1bHQiCi0JCQlxdWlkICAgICAgIAkiM0FFMDhBOUUwM0E2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5Mzg2MDJDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU3MTAzMzMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdGYXVsdCIKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIikpCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTQxMzAzN0YiCi0JCQkJcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTQyMTAxMDkiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjg1QkY5RTAxNEEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiUU5hbWUiCi0JCQlxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5RTmFtZSBjbGFzcy4gQSBRTmFtZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NDlEQTkwMDNEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIk5hbWVzcGFjZSIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0NEMzAwMzAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QyOTAxQjEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJlZml4IgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0QzMjAyMzYiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJbGFuZ3VhZ2UgICAJIkphdmEiKQotCQkgICAgKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uVHlwZSIKLQkJCXF1aWQgICAgICAgCSIzQUVCNDc4MjAyNEYiCi0JCQlkb2N1bWVudGF0aW9uIAkKLXxPTkVfV0FZPTEKLXxSRVFVRVNUX1JFU1BPTlNFPTIKLXxTT0xJQ0lUX1JFU1BPTlNFPTMKLXxOT1RJRklDQVRJT049NAotCQkJCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NUMzNTMwM0UzIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkJCWxhbmd1YWdlICAgCSJKYXZhIikKLQkJICAgIChvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnRUeXBlIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZBQzEwMUNBIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm9wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTZCQUYwMUE0IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiaW5wdXROYW1lIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QkY3MDMxQSIKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE2MzIwMDBEIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRBNzc2MDBEMSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM0MjAwNjUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiZmF1bHQiCi0JCQkJCXR5cGUgICAgICAgCSJJRmF1bHQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM1OTAyOEYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk2QzcxMDJCMSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkM4MTAxQjAiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk2Qzk5MDMxRCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJPcmRlciIKLQkJCQkJdHlwZSAgICAgICAJIklMaXN0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU0RTUwMThEIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyQzQwMTA3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0IgotCQkJCQl0eXBlICAgICAgIAkiSUlucHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCIKLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYyRjAwMUQyIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklPdXRwdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE3RUUwMDE1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5JbnB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjMzMTAwRUYiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjYzNDcwMjc3IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBODAwMDAzOSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSU91dHB1dCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTgyOTAyN0QiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQzQTAzNUQiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0TWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjY0NDUwMUM4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkJCXR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QTgzOTAxRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklGYXVsdCIKLQkJCXF1aWQgICAgICAgCSIzQjg0QTg2MTAzMUQiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCIKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NjQ3NTAxMzEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5GYXVsdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJTWVzc2FnZSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QThBRjAwNEYiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk1lc3NhZ2Ugbm9uLU1PRiBpbnRlcmZhY2UiCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIyNDAyNzMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicGFydCIKLQkJCQkJdHlwZSAgICAgICAJIklQYXJ0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQYXJ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzIzRDAyMzMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJUGFydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NzI1NDAyNUUiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRPcmRlcmVkUGFydHMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk3MjYxMDIwRCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwYXJ0T3JkZXIiCi0JCQkJCXR5cGUgICAgICAgCSJJTGlzdCIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLk1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOEJDMDI2MCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBhcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEE5M0YwMUJFIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODg0NTAwNTIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInZhbHVlIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlleGNlcHRpb25zIAkiV1NETEV4Y2VwdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2OEEwMTAxQzMiCi0JCQkJcmVzdWx0ICAgICAJIklJdGVyYXRvciIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2lvbkF0dHJpYnV0ZSIKLQkJCQlxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJRTmFtZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBOTUwMDIzMSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCNDkwMjg3IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5TZXJ2aWNlIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk1RDU2MDFEMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0IgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NURBMjAwMzYiCi0JCQkJcmVzdWx0ICAgICAJIklNYXAiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NURCMDAxQkMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLlNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSVBvcnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFCODAwMzI2IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQlvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MUYzMDJCNSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTI2MzAyRjIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUI4QzAwMTYiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nIgotCQkJcXVpZCAgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUYxNjAxNTMiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ09wZXJhdGlvbiIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPcGVyYXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NUZBNDAxQzUiCi0JCQkJcmVzdWx0ICAgICAJIklMaXN0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkE5MDI4NCIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MkJFMDFBOCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwb3J0VHlwZSIKLQkJCQkJdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZyIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFCQ0YwMzAyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjg0QURDMDAwNzIiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBCQzAwNDEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ0ZhdWx0IgotCQkJCQl0eXBlICAgICAgIAkiSUJpbmRpbmdGYXVsdCIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5NjBEOTAwOUQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTYwRkMwMDYxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTMyRDAwMTciCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDODY1MzNGMDM3QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iCi0JCQkJCXR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTA5MDBEQSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjU1MUQwMDdGIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdJbnB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nSW5wdXQiKSkKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPdXRwdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWQgICAgICAgCSIzQzg2NTU0NzAyQTYiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZ091dHB1dCIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nT3V0cHV0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklCaW5kaW5nSW5wdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFERUIwMTAwIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBREZFMDAwRCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdPdXRwdXQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFFMjEwMTExIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEFFMkQwMDUwIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJQmluZGluZ0ZhdWx0IgotCQkJcXVpZCAgICAgICAJIjNCODRBRTRGMDBCRCIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ0ZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFGMzIwM0RCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRWxlbWVudCBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRjU2MDI5MiIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiSUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJcXVpZCAgICAgICAJIjNCODRCMTI0MDJBQiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjEzNTAzRDEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRGVmaW5pdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyIKLQkJCQkJdHlwZSAgICAgICAJIklCaW5kaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRJbXBvcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTQ5MDI1OSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJpbXBvcnREZWYiCi0JCQkJCXR5cGUgICAgICAgCSJJSW1wb3J0IikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODk2RTAwNUUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibWVzc2FnZSIKLQkJCQkJdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OTg5QzUwMDQ1IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJCQl0eXBlICAgICAgIAkiSVBvcnRUeXBlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJhZGRTZXJ2aWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlFNDAxRUUiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAic2VydmljZSIKLQkJCQkJdHlwZSAgICAgICAJIklTZXJ2aWNlIikpCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTE3MDM4QyIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdGYXVsdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBMzIwMjg2IgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ0lucHV0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBNDYwMTNCIgotCQkJCXJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTVDMDBCMCIKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQjg5ODlGRTAzN0MiCi0JCQkJcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QTc1MDJFNyIKLQkJCQlyZXN1bHQgICAgIAkiSUZhdWx0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlSW1wb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEE4MzAxNEMiCi0JCQkJcmVzdWx0ICAgICAJIklJbXBvcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbnB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThBOUQwMzNFIgotCQkJCXJlc3VsdCAgICAgCSJJSW5wdXQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFBRjAyNTQiCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlT3BlcmF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEFDMjAzQzQiCi0JCQkJcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUU4MDBFRCIKLQkJCQlyZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVBhcnQiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QUY4MDI2RCIKLQkJCQlyZXN1bHQgICAgIAkiSVBhcnQiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVQb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEIwODAxREEiCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjE1MDM5QiIKLQkJCQlyZXN1bHQgICAgIAkiSVBvcnRUeXBlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCMzIwMTNBIgotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QjQyMDA3NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5ncyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCOTIwMzQxIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCQ0QwMDYwIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThCRTcwMTQ0IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWVzcGFjZVVSSSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4QzE3MDEwNyIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSU1lc3NhZ2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDM0UwMDFEIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OEM2MjAxNEIiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAicHJlZml4IgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZXMiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4Qzc0MDExNSIKLQkJCQlyZXN1bHQgICAgIAkiSU1hcCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENCRTAwNzEiCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThDREEwMUM2IgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHJlZml4IgotCQkJCXF1aWQgICAgICAgCSIzQjg5OENGRDAwMTciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNlcnZpY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCODk4RDIzMDBBOCIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSVNlcnZpY2UiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0I4OThEM0IwM0NFIgotCQkJCXJlc3VsdCAgICAgCSJJTWFwIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUI4MDEyQiIKLQkJCQlyZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0RXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQkJcXVpZCAgICAgICAJIjNCODlENUQ3MDNCQiIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpb25SZWdpc3RyeSIKLQkJCQkJdHlwZSAgICAgICAJIklFeHRlbnNpb25SZWdpc3RyeSIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIgotCQkJCXF1aWQgICAgICAgCSIzQjg5RDVGRTAyMDgiCi0JCQkJcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInNldERvY3VtZW50QmFzZVVSSSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ2MTgwMzI4IgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50QmFzZSIKLQkJCQkJdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlVHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCIKLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlU2VydmljZSIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwN0UwMDRDIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZUJpbmRpbmciCi0JCQkJcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJCQl0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJCQlyZXN1bHQgICAgIAkiSUJpbmRpbmciCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0NBREQwRDgwMjlBIgotCQkJCXBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCQkgICAgKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkJCXR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkJCXJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKQotCQkJICAgIChvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVNZXNzYWdlIgotCQkJCXF1aWQgICAgICAgCSIzQ0FERDBGQTAzMDciCi0JCQkJcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJCSAgICAob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCQkJdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCQkJcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiIKLQkJCQlyZXN1bHQgICAgIAkiSVR5cGVzIgotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAic2V0VHlwZXMiCi0JCQkJcXVpZCAgICAgICAJIjNDODY3MDk1MDBFRSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJ0eXBlcyIKLQkJCQkJdHlwZSAgICAgICAJIklUeXBlcyIpKQotCQkJCWNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJCQlvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCQkJdWlkICAgICAgICAJMCkpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRGVmaW5pdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSW1wb3J0IgotCQkJcXVpZCAgICAgICAJIjNCODRCMjAyMDExOSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW1wb3J0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW1wb3J0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QjIwQzAyRUEiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklMaXN0IgotCQkJcXVpZCAgICAgICAJIjNCODVDMEEyMDNDNSIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjg1QzBBRjAyOTciCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklNYXAiCi0JCQlxdWlkICAgICAgIAkiM0I4OTZCMDMwMEQ0IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTWFwIGludGVyZmFjZS4iCi0JCQlzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhLnV0aWwuTWFwIgotCQkJCXF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklVUkwiCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1NjMwMjc0IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLm5ldC5VUkwgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubmV0LlVSTCIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1NkUwM0UyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJRXh0ZW5zaW9uUmVnaXN0cnkiCi0JCQlxdWlkICAgICAgIAkiM0I4OUQ1OTMwMkE1IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSIKLQkJCQlxdWlkICAgICAgIAkiM0I4OUQ1OUYwMkU4IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQ0FEQ0QzQjAzODAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIgotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiKSkKLQkJCW9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJCSAgICAob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENGMzgwM0U2IgotCQkJCXJlc3VsdCAgICAgCSJJTGlzdCIKLQkJCQljb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCQkJb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkJCXVpZCAgICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBPcGVyYXRpb24gImdldFNjaGVtYXMiCi0JCQkJcXVpZCAgICAgICAJIjNDQURDRjdFMDMwMSIKLQkJCQlwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkJICAgIChvYmplY3QgUGFyYW1ldGVyICJuYW1lc3BhY2VVUkkiCi0JCQkJCXR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJCQlyZXN1bHQgICAgIAkiSUxpc3QiCi0JCQkJY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkJCW9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJCQl1aWQgICAgICAgIAkwKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJJSXRlcmF0b3IiCi0JCQlxdWlkICAgICAgIAkiM0M0Njg3REEwMTY3IgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiIKLQkJCXN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciIKLQkJCQlxdWlkICAgICAgIAkiM0M0Njg4MDgwMEI5IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJXU0RMRXhjZXB0aW9uIgotCQkJcXVpZCAgICAgICAJIjNDNDY4OTY1MDMxMyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXhjZXB0aW9uIGNsYXNzLiIKLQkJCXN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODk3NDAzMTUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIklUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiCi0JCQlkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIgotCQkJc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5UeXBlcyIKLQkJCQlxdWlkICAgICAgIAkiM0NBRENCRjEwMTczIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQjI0QUVDMDFDQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NDMzYwRDcwMzlDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDQzM2MjdGMDBCNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0NEMTUwMkMwMjNCIgotCQkJZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3JnLnczYy5kb20uRG9jdW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0NEMTUwNjAwMTgyIgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJNZXNzYWdlUmVmZXJlbmNlIgotCQkJcXVpZCAgICAgICAJIjNGNjc3MURCMDJEQyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzRjY3ODBBMDAxQUIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHJvdGVjdGVkIikpCi0JCQlsYW5ndWFnZSAgIAkiSmF2YSIKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCQkJcXVpZCAgICAgICAJIjNBRDVDODI0MDE4QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicG9ydFR5cGUiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVDODI3MDFDMyIKLQkJCQlsYWJlbCAgICAgIAkicG9ydFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlT3BlcmF0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUM4MjcwMUNEIgotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIgotCQkJcXVpZCAgICAgICAJIjNBRDVDRUJFMDBFMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUNFQkYwMDU3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcnRzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNjEiCi0JCQkJbGFiZWwgICAgICAJImVQYXJ0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDM1MjAxMEYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0VHlwZSIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTc2IgotCQkJCWxhYmVsICAgICAgCSJlUG9ydFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQzNTQwMTgwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUiCi0JCQlxdWlkICAgICAgIAkiM0FENUQzRTEwMTc5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ09wZXJhdGlvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEM0UyMDIzOSIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3IgotCQkJcXVpZCAgICAgICAJIjNBRDVENDI1MDM4QSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU9wZXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkJCWxhYmVsICAgICAgCSJlT3BlcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDQyNjAyRkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDk0MDAzOTMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVQb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFDIgotCQkJCWxhYmVsICAgICAgCSJlUG9ydHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMCIKLQkJCQlxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCODAxMUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVCaW5kaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RDlCOTAyNEQiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVEOUI5MDI2MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwMzAxRTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjA0MDBDMSIKLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MTAxMDQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlUG9ydFR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3MjAzNTQiCi0JCQkJbGFiZWwgICAgICAJImVQb3J0VHlwZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4IgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3ODAzNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ3MiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3QiIKLQkJCQlsYWJlbCAgICAgIAkiZUJpbmRpbmdzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3QjAzMTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIgotCQkJCXF1aWQgICAgICAgCSIzQUQ1RTY3RDAwN0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlU2VydmljZXMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVFNjdEMDA4OSIKLQkJCQlsYWJlbCAgICAgIAkiZVNlcnZpY2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMSIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJCQlsYWJlbCAgICAgIAkiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENURCQjYwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMiIKLQkJCQlxdWlkICAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMiCi0JCQlxdWlkICAgICAgIAkiM0FERjJFNjQwMUY1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0IgotCQkJCXF1aWQgICAgICAgCSIzQURGMkU2NTAyNTEiCi0JCQkJbGFiZWwgICAgICAJImVCaW5kaW5nSW5wdXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjUiCi0JCQlxdWlkICAgICAgIAkiM0FERjJFQjMwMTYzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ091dHB1dCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ091dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjYiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRUI0MDEzRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjciCi0JCQlxdWlkICAgICAgIAkiM0FERjJGOTQwMjREIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5MCIKLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRjk1MDE5QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyOSIKLQkJCXF1aWQgICAgICAgCSIzQURGMkZCODAyRjkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYyRkI5MDIwQSIKLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMCIKLQkJCQlxdWlkICAgICAgIAkiM0FERjJGQjkwMjBCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxIgotCQkJcXVpZCAgICAgICAJIjNBREYzMzE2MDFBNCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZUZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3IgotCQkJCWxhYmVsICAgICAgCSJlRmF1bHRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMyIgotCQkJCXF1aWQgICAgICAgCSIzQURGMzMxODAzODgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzMiCi0JCQlxdWlkICAgICAgIAkiM0FERjM0MDAwM0U1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlQmluZGluZ0ZhdWx0cyIKLQkJCQlxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIgotCQkJCWxhYmVsICAgICAgCSJlQmluZGluZ0ZhdWx0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzQiCi0JCQkJcXVpZCAgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzUiCi0JCQlxdWlkICAgICAgIAkiM0FFMDkxRjQwMkYzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlRmF1bHQiCi0JCQkJcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCQlsYWJlbCAgICAgIAkiZUZhdWx0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM2IgotCQkJCXF1aWQgICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNyIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NTAwMkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDM4IgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0Q1NjAzMjgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlTmFtZXNwYWNlcyIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTNENTYwMzMyIgotCQkJCWxhYmVsICAgICAgCSJlTmFtZXNwYWNlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiCi0JCQkJcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOSIKLQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQTAwMkQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQUVBM0UzQzAxRTgiCi0JCQkJbGFiZWwgICAgICAJImVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDAiCi0JCQkJcXVpZCAgICAgICAJIjNBRUEzRTNDMDFGMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQxIgotCQkJcXVpZCAgICAgICAJIjNBRUE0MTJGMDAzNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkJCXF1aWQgICAgICAgCSIzQUVBNDEzMTAyNTUiCi0JCQkJbGFiZWwgICAgICAJImVQYXJhbWV0ZXJPcmRlcmluZyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MiIKLQkJCQlxdWlkICAgICAgIAkiM0FFQTQxMzEwMjVGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDMiCi0JCQlxdWlkICAgICAgIAkiM0I4NEFEMjQwMEJEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW5wdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDI1MDA4MyIKLQkJCQlsYWJlbCAgICAgIAkiZUlucHV0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQ0IgotCQkJCXF1aWQgICAgICAgCSIzQjg0QUQyNTAwODQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4MjAyRDQiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NSIKLQkJCXF1aWQgICAgICAgCSIzQjg0QUQ3OTAwRjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVPdXRwdXQiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJCQlsYWJlbCAgICAgIAkiZU91dHB1dCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiCi0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDYiCi0JCQkJcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IgotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NyIKLQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAwQzQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjhCMUJFOTAzMjciCi0JCQkJbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDgiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQkU5MDMzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0OSIKLQkJCXF1aWQgICAgICAgCSIzQjhCMUMxMjAzQjIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFDMTQwMDFDIgotCQkJCWxhYmVsICAgICAgCSJlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTAiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxQzE0MDAyNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1MSIKLQkJCXF1aWQgICAgICAgCSIzQjhCMURDQzAyRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgImVTY2hlbWEiCi0JCQkJcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCIKLQkJCQlsYWJlbCAgICAgIAkiZVNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1MiIKLQkJCQlxdWlkICAgICAgIAkiM0I4QjFEQ0UwMjdBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTMiCi0JCQlxdWlkICAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NCIKLQkJCQlxdWlkICAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZVR5cGVzIgotCQkJCXF1aWQgICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkJbGFiZWwgICAgICAJImVUeXBlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTUiCi0JCQlxdWlkICAgICAgIAkiM0M0NjgyOTMwM0U1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0M0NjgyOTYwMTBFIgotCQkJCWxhYmVsICAgICAgCSJlTWVzc2FnZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU2IgotCQkJCXF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTciCi0JCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJlSW1wb3J0cyIKLQkJCQlxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCWxhYmVsICAgICAgCSJlSW1wb3J0cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiCi0JCQkJcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTgiCi0JCQkJcXVpZCAgICAgICAJIjNDODY0REZGMDJFRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTkiCi0JCQlxdWlkICAgICAgIAkiM0NDMzYxNDUwMEYyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MCIKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJCQlxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNFIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYxIgotCQkJcXVpZCAgICAgICAJIjNGNzRFNzg0MDFCMSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiZU1lc3NhZ2UiCi0JCQkJcXVpZCAgICAgICAJIjNGNzRFNzg2MDAwRiIKLQkJCQlsYWJlbCAgICAgIAkiZU1lc3NhZ2UiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MiIKLQkJCQlxdWlkICAgICAgIAkiM0Y3NEU3ODYwMDIzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCQkJcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYzIgotCQkJcXVpZCAgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjQiCi0JCQkJcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUMwMDJBRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY2hpbGRyZW4iCi0JCQkJcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQyIKLQkJCQlsYWJlbCAgICAgIAkiY2hpbGRyZW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpKQotCQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjcgU2VydmljZXMiCi0JCQlxdWlkICAgICAgIAkiMzlBRDNFRjYwMTI3IgotCQkJdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyIKLQkJCXpvb20gICAgICAgCTkwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIgQDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTczLCA2NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDYxMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQkM2MDIxOSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNzMsIDcxNSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzEpCi0JCQkJd2lkdGggICAgICAJNTIwCi0JCQkJaGVpZ2h0ICAgICAJNDA0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydCIgQDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MTYsIDUyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNDgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJUG9ydCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2ODYsIDQzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBQjgwMDMyNiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDY4NiwgNTM2KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NSkKLQkJCQl3aWR0aCAgICAgIAkyNzgKLQkJCQloZWlnaHQgICAgIAkyMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIiBAMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgOTApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklTZXJ2aWNlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNiwgNDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUI0OTAyODciCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDE0NSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyMzcpCi0JCQkJd2lkdGggICAgICAJMjQ2Ci0JCQkJaGVpZ2h0ICAgICAJMjY0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpTZXJ2aWNlIiBANAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NCwgNDMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQsIDQ4NykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkzODkpCi0JCQkJd2lkdGggICAgICAJNDEwCi0JCQkJaGVpZ2h0ICAgICAJMjE0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTRFMDFCNCIKLQkJCQljbGllbnQgICAgIAlANAotCQkJCXN1cHBsaWVyICAgCUAzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQwLCA0MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI0MCwgMjkyKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDQwLCAxMjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0NCwgMTE2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDQsIDEyMjMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg5KQotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTIxNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCQkJY2xpZW50ICAgICAJQDYKLQkJCQlzdXBwbGllciAgIAlAMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MzAsIDExNTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzAsIDEwMDIpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgxNiwgOTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjc1LCA4NDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjgyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzUsIDg5NSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpCi0JCQkJd2lkdGggICAgICAJMzAwCi0JCQkJaGVpZ2h0ICAgICAJMTY4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODU5NTQ1MDJDOSIKLQkJCQljbGllbnQgICAgIAlAOAotCQkJCXN1cHBsaWVyICAgCUAyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODA5LCA4MjgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgwOSwgNjM3KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOSIgQDEwCi0JCQkJbG9jYXRpb24gICAJKDMyMSwgOTE2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEOTQwMDM5MyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRzIiBAMTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE0MywgNjQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM5NywgOTQ1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VQb3J0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjE4OTc4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5NDEwMzFDIgotCQkJCQljbGllbnQgICAgIAlAMTAKLQkJCQkJc3VwcGxpZXIgICAJQDgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMSwgOTE2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA5MTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMwLCA4ODApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDgwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0MzMsIDk5MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzI4NDY3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDE1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCQkJbG9jYXRpb24gICAJKC0xNDMsIDY0NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTYsIDcwNCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUQiCi0JCQkJCWNsaWVudCAgICAgCUAxMAotCQkJCQlzdXBwbGllciAgIAlANAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzMjEsIDkxNikKLQkJCQkJICAgICgyNTcsIDkxNikKLQkJCQkJICAgICgyNTcsIDYzNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjEsIDkxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NywgNjM1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMSwgNzYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzcwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxOAotCQkJCWxvY2F0aW9uICAgCSg4ODYsIDEyNzApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjgwMTFGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZyIgQDE5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTgKLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExMiwgMTIzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQ4NTcxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjREIgotCQkJCQljbGllbnQgICAgIAlAMTgKLQkJCQkJc3VwcGxpZXIgICAJQDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzUsIDEyNzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MCwgMTMxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE0Mjg2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMiIgQDIyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTgKLQkJCQkJbG9jYXRpb24gICAJKDM4LCA0MjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUyLCAxMTA2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODc5NDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDlCOTAyNjEiCi0JCQkJCWNsaWVudCAgICAgCUAxOAotCQkJCQlzdXBwbGllciAgIAlAOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4ODYsIDEyNzApCi0JCQkJCSAgICAoODEyLCAxMjcwKQotCQkJCQkgICAgKDgxMiwgOTk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg4NiwgMTI3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMiwgOTk2KSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi41IEJpbmRpbmdzIgotCQkJcXVpZCAgICAgICAJIjM5QUQ1MTI3MDI1MiIKLQkJCXRpdGxlICAgICAgCSIyLjUgQmluZGluZ3MiCi0JCQl6b29tICAgICAgIAk4NQotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTE0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDY0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDczLCAxNzIpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDcxKQotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTM3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPcGVyYXRpb24iIEAyNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5NzYsIDM1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3ODAsIDEzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzOTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDc4MCwgODApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgwLCAxODgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTkKLQkJCQkgICAgbWF4X3dpZHRoICAJMzk2KQotCQkJCXdpZHRoICAgICAgCTQxMAotCQkJCWhlaWdodCAgICAgCTU2OAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIgQDI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAxMzM0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJQmluZGluZ0lucHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MiwgMTI4NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCIKLQkJCQl3aWR0aCAgICAgIAkyNzgKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBAMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE2NjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjEsIDE2MzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nT3V0cHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTU4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIKLQkJCQl3aWR0aCAgICAgIAkzMTIKLQkJCQloZWlnaHQgICAgIAkxNzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiIEAyOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIsIDE5NTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklCaW5kaW5nRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyLCAxOTA4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIgotCQkJCXdpZHRoICAgICAgCTI5MAotCQkJCWhlaWdodCAgICAgCTE3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAyOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgNjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTcsIDUyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NywgNTgwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMSkKLQkJCQl3aWR0aCAgICAgIAk0MzIKLQkJCQloZWlnaHQgICAgIAkyMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW5wdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzg5RjAwNTkiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEAzMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU2LCAxNTg3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCNjAyMzIiCi0JCQkJd2lkdGggICAgICAJMzE0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIiBAMzIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMwNCwgNjg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDk3LCA1ODYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDE0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTcsIDY0NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0MTEpCi0JCQkJd2lkdGggICAgICAJNDMyCi0JCQkJaGVpZ2h0ICAgICAJMjI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCQkJY2xpZW50ICAgICAJQDMyCi0JCQkJc3VwcGxpZXIgICAJQDI0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjc5LCA1NzQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3OSwgNDI4KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDM0Ci0JCQkJbG9jYXRpb24gICAJKDExMDQsIDc0MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDM1MjAxMEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQb3J0VHlwZSIgQDM1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzQKLQkJCQkJbG9jYXRpb24gICAJKDY0MCwgNTk4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NjUsIDc4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4OTI5MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE3NiIKLQkJCQkJY2xpZW50ICAgICAJQDM0Ci0JCQkJCXN1cHBsaWVyICAgCUAyOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEwNCwgNzQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY4OCwgNzQyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MTMsIDcxNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyMTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0IiBAMzgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNAotCQkJCQlsb2NhdGlvbiAgIAkoNjQwLCA1OTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCA2OTcpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwOTQ0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEMzU0MDE4MCIKLQkJCQkJY2xpZW50ICAgICAJQDM0Ci0JCQkJCXN1cHBsaWVyICAgCUAzMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEwNCwgNzQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTIwLCA3NDIpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iIEA0MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcyLCA4OTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjcyLCA5NTYpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJNDMwKQotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTI3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBANDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDYyNCwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzYsIDEyODMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NzYsIDEzNDEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDQyCi0JCQkJbG9jYXRpb24gICAJKDEyNjQsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEMjQwMEJEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlSW5wdXQiIEA0MwotCQkJCQlQYXJlbnRfVmlldyAJQDQyCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDEzMTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzUxNDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjg0QUQyNTAwODMiCi0JCQkJCWNsaWVudCAgICAgCUA0MgotCQkJCQlzdXBwbGllciAgIAlAMzAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxMzU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4OTU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDQiIEA0NgotCQkJCQlQYXJlbnRfVmlldyAJQDQyCi0JCQkJCWxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDI1MDA4NCIKLQkJCQkJY2xpZW50ICAgICAJQDQyCi0JCQkJCXN1cHBsaWVyICAgCUA0MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NCwgMTM1OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEA0NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAxNjY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDgxMiwgMTUzOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTIsIDE1OTcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMzAzKQotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTI3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NSIgQDQ4Ci0JCQkJbG9jYXRpb24gICAJKDE0MzIsIDE2NTQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFENzkwMEYyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBANDkKLQkJCQkJUGFyZW50X1ZpZXcgCUA0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NDUsIDE2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU91dHB1dCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjc0NzcyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTREIgotCQkJCQljbGllbnQgICAgIAlANDgKLQkJCQkJc3VwcGxpZXIgICAJQDMxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0NywgMTY1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTAyNzQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ2IiBANTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RSIKLQkJCQkJY2xpZW50ICAgICAJQDQ4Ci0JCQkJCXN1cHBsaWVyICAgCUA0NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMiwgMTY1NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDE2NTQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBANTMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTAwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTksIDkzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEM0NCMDE0NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTksIDk4OSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpCi0JCQkJd2lkdGggICAgICAJMzY0Ci0JCQkJaGVpZ2h0ICAgICAJMTc4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QURFNDAxREMiCi0JCQkJY2xpZW50ICAgICAJQDUzCi0JCQkJc3VwcGxpZXIgICAJQDI1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2NiwgNjM2KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDU1Ci0JCQkJbG9jYXRpb24gICAJKDQzMywgMTAyMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMTAxNzkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDYiIEA1NgotCQkJCQlQYXJlbnRfVmlldyAJQDU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgNDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIzNSwgODc3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVEM0UyMDIyNSIKLQkJCQkJY2xpZW50ICAgICAJQDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAzMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0MzMsIDEwMjIpCi0JCQkJCSAgICAoMjc2LCAxMDIyKQotCQkJCQkgICAgKDI3NiwgODAyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQzMywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3NiwgODAyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDMzMCwgODQxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3BlcmF0aW9ucyIgQDU5Ci0JCQkJCVBhcmVudF9WaWV3IAlANTUKLQkJCQkJbG9jYXRpb24gICAJKC0xMzQzLCA0OTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEzLCA5NzcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTE2OTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMzkiCi0JCQkJCWNsaWVudCAgICAgCUA1NQotCQkJCQlzdXBwbGllciAgIAlANTMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQzMywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgxMCwgMTAyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDk4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODg0OTU2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA2LCAxMDY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43Mjc1NjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDYzCi0JCQkJbG9jYXRpb24gICAJKDE0MTgsIDEwNDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjUwMzhBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9uIiBANjQKLQkJCQkJUGFyZW50X1ZpZXcgCUA2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTM1OCwgNDY0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDEwNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDIwNjAxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkJCQljbGllbnQgICAgIAlANjMKLQkJCQkJc3VwcGxpZXIgICAJQDQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg5LCAxMDA1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTY3MjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDgiIEA2NwotCQkJCQlQYXJlbnRfVmlldyAJQDYzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzU4LCA0NjQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3MywgMTA3MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk1NDIwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUQ0MjYwMkZGIgotCQkJCQljbGllbnQgICAgIAlANjMKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE4LCAxMDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMiIEA2OQotCQkJCWxvY2F0aW9uICAgCSg3ODcsIDExOTApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjQwMUY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0lucHV0IiBANzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCQlsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY2OSwgMTE1MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ0lucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTE5MDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkU2NTAyNTEiCi0JCQkJCWNsaWVudCAgICAgCUA2OQotCQkJCQlzdXBwbGllciAgIAlANDEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzg3LCAxMTkwKQotCQkJCQkgICAgKDYzNiwgMTE5MCkKLQkJCQkJICAgICg2MzYsIDEyNzEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjM2LCAxMjcxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY4NSwgMTIyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQwNDc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNCIgQDczCi0JCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQkJbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4ODUsIDExNDQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkJCQljbGllbnQgICAgIAlANjkKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc4NywgMTE5MCkKLQkJCQkJICAgICg5MjYsIDExOTApCi0JCQkJCSAgICAoOTI2LCAxMDk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc4NywgMTE5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNiwgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzEsIDExMzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgzNzc1OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDc2Ci0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDEzMTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjMwMTYzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ091dHB1dCIgQDc3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDEyLCAxNDI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzA2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VCaW5kaW5nT3V0cHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NDUwODIKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkVCNDAxM0MiCi0JCQkJCWNsaWVudCAgICAgCUA3NgotCQkJCQlzdXBwbGllciAgIAlANDcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxNTI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2NywgMTQ3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzc0NTkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNiIgQDgwCi0JCQkJCVBhcmVudF9WaWV3IAlANzYKLQkJCQkJbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODMsIDExNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNEIgotCQkJCQljbGllbnQgICAgIAlANzYKLQkJCQkJc3VwcGxpZXIgICAJQDUzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAyNCwgMTA5NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTAxNjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEA4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyMCwgMTk4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzcyLCAxOTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkxNzgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdGYXVsdCIgQDg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCAxOTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTIsIDE4NTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdGYXVsdCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjEyLCAxOTE3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk0Ci0JCQkJICAgIG1heF93aWR0aCAgCTMwMykKLQkJCQl3aWR0aCAgICAgIAkzMTQKLQkJCQloZWlnaHQgICAgIAkyNzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJCQljbGllbnQgICAgIAlAODQKLQkJCQlzdXBwbGllciAgIAlAMjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjAzLCAyMDA3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTMsIDIwMDcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMyIgQDg2Ci0JCQkJbG9jYXRpb24gICAJKDEzNTYsIDEzNTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjM0MDAwM0U1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0ZhdWx0cyIgQDg3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODYKLQkJCQkJbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzODIsIDE3NTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUJpbmRpbmdGYXVsdHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMzE1MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQSIKLQkJCQkJY2xpZW50ICAgICAJQDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA4NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1NiwgMTM1MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTYsIDE4NDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwOSwgMTc5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MTk0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE5MjkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzQiIEA5MQotCQkJCQlQYXJlbnRfVmlldyAJQDg2Ci0JCQkJCWxvY2F0aW9uICAgCSgxODgsIDYxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc2LCAxMTk3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDg2Ci0JCQkJCXN1cHBsaWVyICAgCUA1MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzU2LCAxMzUyKQotCQkJCQkgICAgKDEzNTYsIDEyMTcpCi0JCQkJCSAgICAoMTExNywgMTIxNykKLQkJCQkJICAgICgxMTE3LCAxMDk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE3LCAxMDk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNTIsIDExNjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4NzAwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNSIgQDk0Ci0JCQkJbG9jYXRpb24gICAJKDE2NDAsIDE5NzApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDkxRjQwMkYzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHQiIEA5NQotCQkJCQlQYXJlbnRfVmlldyAJQDk0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzQ0LCA4MTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NCwgMTkxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI3NjQyMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJCQkJY2xpZW50ICAgICAJQDk0Ci0JCQkJCXN1cHBsaWVyICAgCUA4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjMsIDE5NzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcxOCwgMjAxMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQyMjc2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzNiIgQDk4Ci0JCQkJCVBhcmVudF9WaWV3IAlAOTQKLQkJCQkJbG9jYXRpb24gICAJKC0zNDQsIDgxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkJCWNsaWVudCAgICAgCUA5NAotCQkJCQlzdXBwbGllciAgIAlAODQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTE3LCAxOTcwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEFFNDMwMkFCIgotCQkJCWNsaWVudCAgICAgCUA0NwotCQkJCXN1cHBsaWVyICAgCUAyNwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDgwMywgMTY1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QUUxQjAxMTMiCi0JCQkJY2xpZW50ICAgICAJQDQxCi0JCQkJc3VwcGxpZXIgICAJQDI2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMzEsIDEzODUpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi40IFBvcnRUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RDFDNDAzNjYiCi0JCQl0aXRsZSAgICAgIAkiMi40IFBvcnRUeXBlcyIKLQkJCWRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iCi0JCQl6b29tICAgICAgIAk4MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnRUeXBlIiBAMTAxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ5NiwgMjA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYsIDE3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3MDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVBvcnRUeXBlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTVCRTAzMzEiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0NiwgMjMzKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY5NikKLQkJCQl3aWR0aCAgICAgIAk3MTgKLQkJCQloZWlnaHQgICAgIAkxOTYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIgQDEwMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTUyLCAyMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDE3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU9wZXJhdGlvbiIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMTYsIDEyNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4NzMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNiwgMjM3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcwOSkKLQkJCQl3aWR0aCAgICAgIAk4OTEKLQkJCQloZWlnaHQgICAgIAkxODgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIgQDEwMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDE0NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAxNDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJSW5wdXQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMTM4NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDE0OTgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjIxKQotCQkJCXdpZHRoICAgICAgCTY0NAotCQkJCWhlaWdodCAgICAgCTE5NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU91dHB1dCIgQDEwNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDE3OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxNzU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJT3V0cHV0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDE3MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTgyOTAyN0QiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDU2LCAxODE4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NikKLQkJCQl3aWR0aCAgICAgIAk2NzQKLQkJCQloZWlnaHQgICAgIAkxOTQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklGYXVsdCIgQDEwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUKLQkJCQkgICAgbG9jYXRpb24gICAJKDU1LCAyMDc2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRmF1bHQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NSwgMjAyNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCQkJaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJCQlpY29uX3N0eWxlIAkiTGFiZWwiCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBODYxMDMxRCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTUsIDIxMzcpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI1KQotCQkJCXdpZHRoICAgICAgCTY0NAotCQkJCWhlaWdodCAgICAgCTE5NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxMDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OCwgNjcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0VHlwZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU4LCA3MzMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA5KQotCQkJCXdpZHRoICAgICAgCTY5NQotCQkJCWhlaWdodCAgICAgCTI4MQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMTA3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NzYsIDgwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMyNSwgNjkyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzI1LCA3NTMpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNDg0KQotCQkJCXdpZHRoICAgICAgCTUyMAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RmF1bHQiIEAxMDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTcyOCwgMjExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NywgMjA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDEwOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDU2LCAxNDcyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzAsIDE0MjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiIEAxMTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTM2MCwgMTc5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIzMiwgMTc0MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiT3V0cHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3BlcmF0aW9uIiBAMTExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDc4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTIxNCwgNjIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMTQsIDY4MSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk0NDYpCi0JCQkJd2lkdGggICAgICAJNjk1Ci0JCQkJaGVpZ2h0ICAgICAJMzUyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMCIgQDExMgotCQkJCWxvY2F0aW9uICAgCSgxMDI0LCA3OTcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjQwMThDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9ucyIgQDExMwotCQkJCQlQYXJlbnRfVmlldyAJQDExMgotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA3NDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZU9wZXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM1OTY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDODI3MDFDRCIKLQkJCQkJY2xpZW50ICAgICAJQDExMgotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjA1LCA3OTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTc2LCA4NjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDM5MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NCwgOTIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yNzYyNDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwb3J0VHlwZSIgQDExNwotCQkJCQlQYXJlbnRfVmlldyAJQDExMgotCQkJCQlsb2NhdGlvbiAgIAkoNTkyLCAyNjkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUM4MjcwMUMzIgotCQkJCQljbGllbnQgICAgIAlAMTEyCi0JCQkJCXN1cHBsaWVyICAgCUAxMDYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNzk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODg4LCA3NTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1MzQ4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MSIgQDExOQotCQkJCWxvY2F0aW9uICAgCSgyMTA3LCA3NzMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FFQTQxMkYwMDM1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlUGFyYW1ldGVyT3JkZXJpbmciIEAxMjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkKLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNDUsIDY0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE4MzMzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNTUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTkKLQkJCQkJc3VwcGxpZXIgICAJQDEwNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjMxNiwgNzczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3MiwgODIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTY2MTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNzEsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzA2MjIwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDIiIEAxMjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTkKLQkJCQkJbG9jYXRpb24gICAJKDE4MTksIDEwMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNUYiCi0JCQkJCWNsaWVudCAgICAgCUAxMTkKLQkJCQkJc3VwcGxpZXIgICAJQDExMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEwNywgNzczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5OSwgNzczKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMSIgQDEyNQotCQkJCWxvY2F0aW9uICAgCSgxNzAyLCAxNTA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBREYzMzE2MDFBNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0cyIgQDEyNgotCQkJCQlQYXJlbnRfVmlldyAJQDEyNQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxNSwgMTk4MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRmF1bHRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzg5OTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjMzMTgwMzg3IgotCQkJCQljbGllbnQgICAgIAlAMTI1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDIsIDE1MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCAyMDQ4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NCwgMjAyMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ5NTgwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTkzLCAxOTYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDUzNzgKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMiIgQDEzMAotCQkJCQlQYXJlbnRfVmlldyAJQDEyNQotCQkJCQlsb2NhdGlvbiAgIAkoMTQxNCwgODMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY2MSwgMTA2OSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMzMxODAzODgiCi0JCQkJCWNsaWVudCAgICAgCUAxMjUKLQkJCQkJc3VwcGxpZXIgICAJQDExMQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcwMiwgMTUwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDIsIDk2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjEsIDEwMzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzM2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjciIEAxMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTE3OCwgMTIzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQURGMkY5NDAyNEQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDEzNAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMwotCQkJCQlsb2NhdGlvbiAgIAkoODkwLCA1NjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NzgsIDEzNDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUlucHV0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MTk4MjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTkwIgotCQkJCQljbGllbnQgICAgIAlAMTMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMDkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkKLQkJCQkJICAgICg5ODAsIDEyMzQpCi0JCQkJCSAgICAoOTgwLCAxNDEwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzgsIDEyMzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODAsIDE0MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDQ2LCAxMzY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Nzc2NjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTY2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAMTM3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMzCi0JCQkJCWxvY2F0aW9uICAgCSg4OTAsIDU2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzYsIDEwMzYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FERjJGOTUwMTlBIgotCQkJCQljbGllbnQgICAgIAlAMTMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3OCwgMTIzNCkKLQkJCQkJICAgICgxMjc3LCAxMjM0KQotCQkJCQkgICAgKDEyNzcsIDk2MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTc4LCAxMjM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NywgOTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE5NywgMTA1OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2NDEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI5IiBAMTQwCi0JCQkJbG9jYXRpb24gICAJKDE0NjgsIDEzNDUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FERjJGQjgwMkY5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlT3V0cHV0IiBAMTQxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQwCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYyLCAxNjY5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VPdXRwdXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MDkwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEEiCi0JCQkJCWNsaWVudCAgICAgCUAxNDAKLQkJCQkJc3VwcGxpZXIgICAJQDExMAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OCwgMTM0NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDE3MzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTQ2LCAxNjc2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM2MzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTc4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwIiBAMTQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQwCi0JCQkJCWxvY2F0aW9uICAgCSgxMTgwLCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDI3LCAxMDM3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQiIKLQkJCQkJY2xpZW50ICAgICAJQDE0MAotCQkJCQlzdXBwbGllciAgIAlAMTExCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2OCwgOTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyMywgMTA4MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjkwMzQxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkJCWNsaWVudCAgICAgCUAxMDYKLQkJCQlzdXBwbGllciAgIAlAMTAxCi0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMUZFMjAxNzEiCi0JCQkJY2xpZW50ICAgICAJQDExMQotCQkJCXN1cHBsaWVyICAgCUAxMDIKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYxRkVFMDMxRCIKLQkJCQljbGllbnQgICAgIAlAMTA5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMwotCQkJCWxpbmVfc3R5bGUgCTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2RjFGRjgwMUNEIgotCQkJCWNsaWVudCAgICAgCUAxMTAKLQkJCQlzdXBwbGllciAgIAlAMTA0Ci0JCQkJbGluZV9zdHlsZSAJMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjZGMjAwMjAwMkQiCi0JCQkJY2xpZW50ICAgICAJQDEwOAotCQkJCXN1cHBsaWVyICAgCUAxMDUKLQkJCQlsaW5lX3N0eWxlIAkwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDE1MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjI0LCAxNDU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM3LCAxMzEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM3LCAxMzcxKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNSkKLQkJCQl3aWR0aCAgICAgIAk1OTMKLQkJCQloZWlnaHQgICAgIAkzMTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIgQDE1MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTIwLCAyNTQ0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlUmVmZXJlbmNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTUzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTkzLCAyNTI3KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMDMpCi0JCQkJd2lkdGggICAgICAJNjcyCi0JCQkJaGVpZ2h0ICAgICAJMTgwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTU0Ci0JCQkJbG9jYXRpb24gICAJKDE1MjQsIDIyNzUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDE1MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTUyNCwgMjI3NSkKLQkJCQkgICAgKDE1MjQsIDI0NTQpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzRDAzMTkiCi0JCQkJY2xpZW50ICAgICAJQDEwOAotCQkJCXN1cHBsaWVyICAgCUAxNTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc2LCAyMTc2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc2LCAyMjc1KQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIzNTAwREQiCi0JCQkJY2xpZW50ICAgICAJQDExMAotCQkJCXN1cHBsaWVyICAgCUAxNTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzcxLCAxODU0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzcxLCAyMjc1KQotCQkJCWRyYXdTdXBwbGllciAJQDE1NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzRjY3NzIyODAyRTciCi0JCQkJY2xpZW50ICAgICAJQDEwOQotCQkJCXN1cHBsaWVyICAgCUAxNTMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODAsIDE1MzQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4MCwgMjI3NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNTQpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYxIiBAMTU4Ci0JCQkJbG9jYXRpb24gICAJKDIyMDYsIDIyNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y3NEU3ODQwMUIxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDE1OQotCQkJCQlQYXJlbnRfVmlldyAJQDE1OAotCQkJCQlsb2NhdGlvbiAgIAkoNzM0LCAtMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTU5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2OCwgMTY3MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTEyMjMwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzRFNzg2MDAwRiIKLQkJCQkJY2xpZW50ICAgICAJQDE1OAotCQkJCQlzdXBwbGllciAgIAlAMTUyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIwNiwgMTYxMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNjAsIDE2NzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjIiIEAxNjIKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNTgKLQkJCQkJbG9jYXRpb24gICAJKDczNCwgLTI4NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc0RTc4NjAwMjMiCi0JCQkJCWNsaWVudCAgICAgCUAxNTgKLQkJCQkJc3VwcGxpZXIgICAJQDE1MwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjA2LCAyMjU5KQotCQkJCQkgICAgKDIyMDYsIDI1NTYpCi0JCQkJCSAgICAoMTg1NiwgMjU1NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjA2LCAyMjU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg1NiwgMjU1NikpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMSBEZWZpbml0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQUQ1RTQ4QTAyNjIiCi0JCQl0aXRsZSAgICAgIAkiMi4xIERlZmluaXRpb25zIgotCQkJem9vbSAgICAgICAJODMKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIiBAMTYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTkyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4OCwgMTYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJRGVmaW5pdGlvbiIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAxMTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjFEOTAxNDIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDg4LCAyMjApCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzAwKQotCQkJCXdpZHRoICAgICAgCTcwNgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAxNjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTgyNCwgOTQ0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjg2LCA4OTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCXdpZHRoICAgICAgCTI5NAotCQkJCWhlaWdodCAgICAgCTEyMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMTY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxMCwgNTQ1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJJbXBvcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTAsIDYwNCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0NzgpCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTgyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgMTE4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTEwNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkwMCwgMTE2NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MjIpCi0JCQkJd2lkdGggICAgICAJNDQyCi0JCQkJaGVpZ2h0ICAgICAJMTgyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MDgsIDE0ODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTYsIDE0MDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBvcnRUeXBlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTk2LCAxNDY4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMikKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkxODIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAxNjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNjQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTI0LCAxNzA4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMikKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkxODIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAxNjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDE2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMzkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTEwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDk4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAk3Ci0JCQkJICAgIG1heF93aWR0aCAgCTUyMSkKLQkJCQl3aWR0aCAgICAgIAk1MjgKLQkJCQloZWlnaHQgICAgIAk0MjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTMiIEAxNzAKLQkJCQlsb2NhdGlvbiAgIAkoMTM1OCwgODYwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEJFQTI3MDI5RiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTQiIEAxNzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzAKLQkJCQkJbG9jYXRpb24gICAJKDYyLCAtMzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCA1MzUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QkVBMjkwMzU2IgotCQkJCQljbGllbnQgICAgIAlAMTcwCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTgsIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDMsIDUxMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODU2NjQ5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAxNzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzAKLQkJCQkJbG9jYXRpb24gICAJKDYyLCAtMzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTg2LCA5MDkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NzkwOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkJCWNsaWVudCAgICAgCUAxNzAKLQkJCQkJc3VwcGxpZXIgICAJQDE2NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzU4LCA4NjApCi0JCQkJCSAgICAoMTM1OCwgOTQ4KQotCQkJCQkgICAgKDE2NzcsIDk0OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU4LCA4NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc3LCA5NDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjMyLCA5ODcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5MjY1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NyIgQDE3NwotCQkJCWxvY2F0aW9uICAgCSgxNjEyLCA1OTUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1OCIgQDE3OAotCQkJCQlQYXJlbnRfVmlldyAJQDE3NwotCQkJCQlsb2NhdGlvbiAgIAkoMTIsIDIyNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjMsIDUxMikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiCi0JCQkJCWNsaWVudCAgICAgCUAxNzcKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjEyLCA1OTUpCi0JCQkJCSAgICAoMTQ2NCwgNTk1KQotCQkJCQkgICAgKDE0NjQsIDQ1MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY0LCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNzgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTI0LCA0OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1ODY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAxODEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNzcKLQkJCQkJbG9jYXRpb24gICAJKDEyLCAyMjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjkyLCA1NTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZUltcG9ydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4MDMzNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFRCIKLQkJCQkJY2xpZW50ICAgICAJQDE3NwotCQkJCQlzdXBwbGllciAgIAlAMTY1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjEyLCA1OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAxLCA1OTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU0LCA2NTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MTAwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3NiwgNjQ2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMjU5NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMiIEAxODUKLQkJCQlsb2NhdGlvbiAgIAkoMTI3OSwgMTEzNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwMzAxRTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTg2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTg1Ci0JCQkJCWxvY2F0aW9uICAgCSgyNzEsIDI3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzgsIDU5MSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQjciCi0JCQkJCWNsaWVudCAgICAgCUAxODUKLQkJCQkJc3VwcGxpZXIgICAJQDE2OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzksIDQ1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjAsIDU4NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA0OTc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZXMiIEAxODkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxODUKLQkJCQkJbG9jYXRpb24gICAJKDI3MSwgMjcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NywgMTE3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlTWVzc2FnZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzEzNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjA0MDBDMSIKLQkJCQkJY2xpZW50ICAgICAJQDE4NQotCQkJCQlzdXBwbGllciAgIAlAMTY2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNzksIDExMzYpCi0JCQkJCSAgICAoMTI3OSwgMTIwOCkKLQkJCQkJICAgICgxODkxLCAxMjA4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODkxLCAxMjA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyMSwgMTE3MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk5MzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxODkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzk3LCAxMjQ0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjQ0MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEAxOTMKLQkJCQlsb2NhdGlvbiAgIAkoMTIxMiwgMTE1OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MTAxMDQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBAMTk0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTkzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzI0LCAyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5NQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCA1OTQpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzIwMzRBIgotCQkJCQljbGllbnQgICAgIAlAMTkzCi0JCQkJCXN1cHBsaWVyICAgCUAxNjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTIsIDExNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjEyLCA0NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxOTQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjUxLCA2MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1Nzk2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlcyIgQDE5NwotCQkJCQlQYXJlbnRfVmlldyAJQDE5MwotCQkJCQlsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5MSwgMTQ1MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUG9ydFR5cGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MjM2OTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3MjAzNTQiCi0JCQkJCWNsaWVudCAgICAgCUAxOTMKLQkJCQkJc3VwcGxpZXIgICAJQDE2NwotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjEyLCAxMTU5KQotCQkJCQkgICAgKDEyMTIsIDE0OTApCi0JCQkJCSAgICAoMTU4NywgMTQ5MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4NywgMTQ5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzMsIDE0NTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNTYxMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMiwgMTU0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk1ODU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3IiBAMjAxCi0JCQkJbG9jYXRpb24gICAJKDExMTQsIDE1ODUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU2NzcwMDk1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOCIgQDIwMgotCQkJCQlQYXJlbnRfVmlldyAJQDIwMQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgNjgwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3MSIKLQkJCQkJY2xpZW50ICAgICAJQDIwMQotCQkJCQlzdXBwbGllciAgIAlAMTY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTExNCwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE1NSwgNzUyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MzY3MDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5ncyIgQDIwNQotCQkJCQlQYXJlbnRfVmlldyAJQDIwMQotCQkJCQlsb2NhdGlvbiAgIAkoLTQwNiwgMjQxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1MSwgMTY3NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlQmluZGluZ3MiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2NjM0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3QiIKLQkJCQkJY2xpZW50ICAgICAJQDIwMQotCQkJCQlzdXBwbGllciAgIAlAMTY4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMTQsIDE1ODUpCi0JCQkJCSAgICAoMTExNCwgMTcxNikKLQkJCQkJICAgICgyMTE1LCAxNzE2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTQsIDE1ODUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCAxNzE2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MywgMTY3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTQ1MDc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDE0LCAxNzU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMwotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTU4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTEwNzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODQwLCAyMDQ4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCAxOTY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjA5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjI4LCAyMDI4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMikKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkxODIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkiIEAyMTAKLQkJCQlsb2NhdGlvbiAgIAkoMTA2NiwgMTUzMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3QjAzMTEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwIiBAMjExCi0JCQkJCVBhcmVudF9WaWV3IAlAMjEwCi0JCQkJCWxvY2F0aW9uICAgCSgtNTIxLCAtMTEyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgNjcwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJCQkJY2xpZW50ICAgICAJQDIxMAotCQkJCQlzdXBwbGllciAgIAlAMTY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgNDUzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwOSwgNzU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MTk2OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVTZXJ2aWNlcyIgQDIxNAotCQkJCQlQYXJlbnRfVmlldyAJQDIxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTUyMSwgLTExMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzOTMsIDIwMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVNlcnZpY2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43OTE4MjQKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RTY3RDAwODkiCi0JCQkJCWNsaWVudCAgICAgCUAyMTAKLQkJCQkJc3VwcGxpZXIgICAJQDIwOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDY2LCAxNTMyKQotCQkJCQkgICAgKDEwNjYsIDIwNTkpCi0JCQkJCSAgICAoMTYxOSwgMjA1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDY2LCAxNTMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxOSwgMjA1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDIxNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTQsIDIwMzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0MDE5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjE0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzMiwgMjExMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTIwNTE1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjE4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxRjgwMzgyIgotCQkJCWNsaWVudCAgICAgCUAxNjkKLQkJCQlzdXBwbGllciAgIAlAMTYzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMjYzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3ODUsIDI2MykpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMyBFeHRlbnNpYmlsaXR5IgotCQkJcXVpZCAgICAgICAJIjNBRDYwQzUxMDE5MiIKLQkJCXRpdGxlICAgICAgCSIyLjEuMyBFeHRlbnNpYmlsaXR5IgotCQkJem9vbSAgICAgICAJODAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAyMTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg1NzYsIDE1ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ5NCwgMTUzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJCQl3aWR0aCAgICAgIAkxODIKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEAyMjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAxODg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDg3LCAxODM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUQ5MTcwMjg2IgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIyMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzNDMsIDE2NzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEAyMjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjE2LCAyMzM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCAyMjgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCQkJd2lkdGggICAgICAJMjc0Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAMjIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzM2LCAxNzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjMsIDE3MDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIkJpbmRpbmdPcGVyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCQkJd2lkdGggICAgICAJMzY0Ci0JCQkJaGVpZ2h0ICAgICAJMTMwCi0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDIyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODg4LCAxNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0OTUsIDEzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3ODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSUV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDIyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NSwgODYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiCi0JCQkJd2lkdGggICAgICAJODA0Ci0JCQkJaGVpZ2h0ICAgICAJMTcyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiIEAyMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDE5NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMCwgMTg5OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ0lucHV0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IgotCQkJCXdpZHRoICAgICAgCTI3NAotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIgQDIyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMDgsIDIxNDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2MywgMjA5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyOTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIKLQkJCQl3aWR0aCAgICAgIAkzMDgKLQkJCQloZWlnaHQgICAgIAkxMzAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAyMjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEyOTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMjM1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTIyMgotCQkJCWhlaWdodCAgICAgCTE0NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAyMjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCAxNDA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzMzUsIDEzNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiIEAyMjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ4MCwgNjg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjI5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDksIDU4MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyMjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwOSwgNjQxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk1MzEpCi0JCQkJd2lkdGggICAgICAJNTYwCi0JCQkJaGVpZ2h0ICAgICAJMjQwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDIzMAotCQkJCWxvY2F0aW9uICAgCSg0ODAsIDEwMzkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDgwLCAxMDM5KQotCQkJCSAgICAoNDgwLCA4MDgpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ2MDBDQjAwQUEiCi0JCQkJY2xpZW50ICAgICAJQDIyMAotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTY2LCAxODI0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY2LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzIKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjVBNDAyN0UiCi0JCQkJY2xpZW50ICAgICAJQDIyNgotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk3LCAyMDc5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk3LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUUwOTM4NjAyQzkiCi0JCQkJY2xpZW50ICAgICAJQDIyMgotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE5LCAyMjcxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE5LCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjg1QjU5QjAwNzIiCi0JCQkJY2xpZW50ICAgICAJQDIyNQotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODgsIDE4ODcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk4OCwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0FENjAwOTIwMkY3IgotCQkJCWNsaWVudCAgICAgCUAyMjMKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzk3LCAxNjk1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3OTcsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTBGMDJGMCIKLQkJCQljbGllbnQgICAgIAlAMjE5Ci0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYwMSwgMTUxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAxLCAxMDM5KQotCQkJCWRyYXdTdXBwbGllciAJQDIzMCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCQkJY2xpZW50ICAgICAJQDIyNwotCQkJCXN1cHBsaWVyICAgCUAyMjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTEsIDEyMjMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMSwgMTAzOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAyMzApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCWNsaWVudCAgICAgCUAyMjgKLQkJCQlzdXBwbGllciAgIAlAMjI5Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDE0LCAxMzQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MTQsIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGQTIwMDI1RSIKLQkJCQljbGllbnQgICAgIAlAMjIxCi0JCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjksIDE2NjMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MjksIDEwMzkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MDQsIDY4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNTgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0NQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgNjQ0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NSkKLQkJCQl3aWR0aCAgICAgIAk1NjMKLQkJCQloZWlnaHQgICAgIAkyMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAyNDEKLQkJCQlsb2NhdGlvbiAgIAkoMTE5MSwgNjcyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAyNDIKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNDEKLQkJCQkJbG9jYXRpb24gICAJKDIzLCA1NjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NDcsIDYzMSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkJCWNsaWVudCAgICAgCUAyNDEKLQkJCQkJc3VwcGxpZXIgICAJQDIyOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzYwLCA2NzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MzAsIDYyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM5Njk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMjQ1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjQxCi0JCQkJCWxvY2F0aW9uICAgCSgyMywgNTYwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NSwgNTIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM3OTA3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUQiCi0JCQkJCWNsaWVudCAgICAgCUAyNDEKLQkJCQkJc3VwcGxpZXIgICAJQDI0MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MSwgNjcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMywgNjcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5NiwgNjI3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDk0MDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NjMsIDc2NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjMyNDc5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk5MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIgQDI0OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxOTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzMCwgODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzU2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIldTRExFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MzAsIDE0NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJNzUzKQotCQkJCXdpZHRoICAgICAgCTc3NAotCQkJCWhlaWdodCAgICAgCTI0MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAyNTAKLQkJCQlsb2NhdGlvbiAgIAkoMTAwOCwgNDAyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAyNDkKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEwMDgsIDQwMikKLQkJCQkgICAgKDEwMDgsIDMxMikpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJCQljbGllbnQgICAgIAlAMjI5Ci0JCQkJc3VwcGxpZXIgICAJQDI0OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5MiwgNTY4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0OTIsIDQwMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAyNTApCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEIxNDkwM0QwIgotCQkJCWNsaWVudCAgICAgCUAyNDAKLQkJCQlzdXBwbGllciAgIAlAMjI0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAxNSwgNTcxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDE1LCAyNDYpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRERGNTM1MDJDMyIKLQkJCQljbGllbnQgICAgIAlAMjQwCi0JCQkJc3VwcGxpZXIgICAJQDI0OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NjIsIDU3MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc2MiwgNDAyKQotCQkJCWRyYXdTdXBwbGllciAJQDI1MCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgQDI1NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE5MiwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyOSwgMTMwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk5MjcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkJCXdpZHRoICAgICAgCTk0NQotCQkJCWhlaWdodCAgICAgCTIzNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQjI0QUVDMDFDQiIKLQkJCQljbGllbnQgICAgIAlAMjU0Ci0JCQkJc3VwcGxpZXIgICAJQDI0MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3OTYsIDEyOTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTYsIDgwNSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYzIiBAMjU2Ci0JCQkJbG9jYXRpb24gICAJKDI2MzksIDE3MzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Y3ODk2QTIwMjZFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NCIgQDI1NwotCQkJCQlQYXJlbnRfVmlldyAJQDI1NgotCQkJCQlsb2NhdGlvbiAgIAkoNjA3LCAzNDIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNzk3LCAxMzgwKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJCQkJY2xpZW50ICAgICAJQDI1NgotCQkJCQlzdXBwbGllciAgIAlAMjU0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDI2MzksIDE3MzQpCi0JCQkJCSAgICAoMjgyNCwgMTczNCkKLQkJCQkJICAgICgyODI0LCAxNDIxKQotCQkJCQkgICAgKDI2NjQsIDE0MjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzOSwgMTczNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2NjQsIDE0MjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI1OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyNzMxLCAxNDc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNoaWxkcmVuIiBAMjYwCi0JCQkJCVBhcmVudF9WaWV3IAlAMjU2Ci0JCQkJCWxvY2F0aW9uICAgCSg2MDcsIDM0MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzQsIDE2NTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY2hpbGRyZW4iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc5ODU2MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRjc4OTZBNzAxMkMiCi0JCQkJCWNsaWVudCAgICAgCUAyNTYKLQkJCQkJc3VwcGxpZXIgICAJQDI1NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyNjM5LCAxNzM0KQotCQkJCQkgICAgKDIxOTEsIDE3MzQpCi0JCQkJCSAgICAoMjE5MSwgMTUyNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM5LCAxNzM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5MSwgMTUyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNDUsIDE1OTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCQkJcXVpZCAgICAgICAJIjNBRThFRDcyMDFCRCIKLQkJCXRpdGxlICAgICAgCSIyLjEuMSBOYW1pbmcgYW5kIExpbmtpbmciCi0JCQl6b29tICAgICAgIAk5MAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUltcG9ydCIgQDI2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTcxMiwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklJbXBvcnQiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDIyLCAxMjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjIsIDIzMikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk2NDYpCi0JCQkJd2lkdGggICAgICAJNTk4Ci0JCQkJaGVpZ2h0ICAgICAJMjE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiIEAyNjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQzMiwgMTEzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAyLCAxMDQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJOYW1lc3BhY2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0NEMzAwMzAiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwMiwgMTA5NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkzMDApCi0JCQkJd2lkdGggICAgICAJNDc5Ci0JCQkJaGVpZ2h0ICAgICAJMjE1Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDI2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjMyLCAxMjE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjk0LCAxMTQyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJNjk0Ci0JCQkJaGVpZ2h0ICAgICAJMTczCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQwMCwgMzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjY2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQsIDIzNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0LCAyOTEpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIxKQotCQkJCXdpZHRoICAgICAgCTQ5MAotCQkJCWhlaWdodCAgICAgCTMyMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNyIgQDI2NwotCQkJCWxvY2F0aW9uICAgCSgzMDksIDc4NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUVBM0Q1NTAwMkQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVOYW1lc3BhY2VzIiBAMjY4Ci0JCQkJCVBhcmVudF9WaWV3IAlAMjY3Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTEsIDI1OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2MSwgOTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VOYW1lc3BhY2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42OTg4NDIKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNENTYwMzMyIgotCQkJCQljbGllbnQgICAgIAlAMjY3Ci0JCQkJCXN1cHBsaWVyICAgCUAyNjQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzA5LCAxMDI5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ4LCA5NzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc2ODcwNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCA5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNTA5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzgiIEAyNzIKLQkJCQkJUGFyZW50X1ZpZXcgCUAyNjcKLQkJCQkJbG9jYXRpb24gICAJKC05MSwgMjU4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY4LCA1OTIpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxOTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRUEzRDU2MDMyOCIKLQkJCQkJY2xpZW50ICAgICAJQDI2NwotCQkJCQlzdXBwbGllciAgIAlAMjY2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzMDksIDc4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgNTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM5LCA1ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0NDk2MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMjc1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDcyLCA3MjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTUsIDU4MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjU1LCA2MzUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTUKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc4KQotCQkJCXdpZHRoICAgICAgCTQ1MgotCQkJCWhlaWdodCAgICAgCTMwNAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MSIgQDI3NgotCQkJCWxvY2F0aW9uICAgCSgxNDg2LCAxMDAxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxRENDMDJFNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZVNjaGVtYSIgQDI3NwotCQkJCQlQYXJlbnRfVmlldyAJQDI3NgotCQkJCQlsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjc3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczNywgMTAxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEwNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0UwMjcwIgotCQkJCQljbGllbnQgICAgIAlAMjc2Ci0JCQkJCXN1cHBsaWVyICAgCUAyNjUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ4NiwgMTAwMSkKLQkJCQkJICAgICgxNjMyLCAxMDAxKQotCQkJCQkgICAgKDE2MzIsIDExMzApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NiwgMTAwMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzIsIDExMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyNzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTYzLCAxMDE4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTI1OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUyIiBAMjgwCi0JCQkJCVBhcmVudF9WaWV3IAlAMjc2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MTAsIC0xMDMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFEQ0UwMjdBIgotCQkJCQljbGllbnQgICAgIAlAMjc2Ci0JCQkJCXN1cHBsaWVyICAgCUAyNzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDg3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODYsIDg3MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAyODEKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgNDAzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRUEzRTNBMDAyRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDAiIEAyODIKLQkJCQkJUGFyZW50X1ZpZXcgCUAyODEKLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MDYsIDQ4MCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FFQTNFM0MwMUYyIgotCQkJCQljbGllbnQgICAgIAlAMjgxCi0JCQkJCXN1cHBsaWVyICAgCUAyNzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTA4NywgNDAzKQotCQkJCQkgICAgKDEzNjQsIDQwMykKLQkJCQkJICAgICgxMzY0LCA1NjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NCwgNTY4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZURlZmluaXRpb24iIEAyODQKLQkJCQkJUGFyZW50X1ZpZXcgCUAyODEKLQkJCQkJbG9jYXRpb24gICAJKDY4NywgLTEyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgwNSwgMzYzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42Mzc1MzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRTgiCi0JCQkJCWNsaWVudCAgICAgCUAyODEKLQkJCQkJc3VwcGxpZXIgICAJQDI2NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ1LCA0MDMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAyODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MjcsIDQ1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE0OTEwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMjg3Ci0JCQkJbG9jYXRpb24gICAJKDczNywgODI2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAyODgKLQkJCQkJUGFyZW50X1ZpZXcgCUAyODcKLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDU1MiwgNjQ3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUUiCi0JCQkJCWNsaWVudCAgICAgCUAyODcKLQkJCQkJc3VwcGxpZXIgICAJQDI2NgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3MzcsIDgyNikKLQkJCQkJICAgICg1MTAsIDgyNikKLQkJCQkJICAgICg1MTAsIDU0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxMCwgNTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjg4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDU3LCA1OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAyOTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAyODcKLQkJCQkJbG9jYXRpb24gICAJKC02NzEsIDEwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDQsIDc3MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlSW1wb3J0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzk5MTg5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJCQljbGllbnQgICAgIAlAMjg3Ci0JCQkJCXN1cHBsaWVyICAgCUAyNzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI0NiwgODI2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMjkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4MCwgODc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzIyMTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNjIsIDkzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTMKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODM3NzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNGNkYyMDBEMDM0MCIKLQkJCQljbGllbnQgICAgIAlAMjc1Ci0JCQkJc3VwcGxpZXIgICAJQDI2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTUsIDU2OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU1NSwgMzMzKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuMiBUeXBlcyIKLQkJCXF1aWQgICAgICAgCSIzQjg1QUU1OTAzN0UiCi0JCQl0aXRsZSAgICAgIAkiMi4yIFR5cGVzIgotCQkJem9vbSAgICAgICAJOTAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJODEKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBAMjk2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTM2LCAxMjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4OTUsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTUwMAotCQkJCWhlaWdodCAgICAgCTE3NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAyOTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMTYwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDI5NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTA2LCAxNTMxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTYyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMjk4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjgwLCAxOTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDIyLCAxODI4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUM5NTkwMDc4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDIyLCAxOTAwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTMwKQotCQkJCXdpZHRoICAgICAgCTUzNQotCQkJCWhlaWdodCAgICAgCTMwNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDI5OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMjk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgsIDEwNjcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlBhcnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCQkJd2lkdGggICAgICAJNDY2Ci0JCQkJaGVpZ2h0ICAgICAJMjU4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ3IiBAMzAwCi0JCQkJbG9jYXRpb24gICAJKDczNSwgMTE3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCMUJFOTAwQzQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBAMzAxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzAwCi0JCQkJCWxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3NSwgMTEzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5MDA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzI3IgotCQkJCQljbGllbnQgICAgIAlAMzAwCi0JCQkJCXN1cHBsaWVyICAgCUAyOTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NiwgMTE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzOSwgMTIwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjg4NzA1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0OCIgQDMwNAotCQkJCQlQYXJlbnRfVmlldyAJQDMwMAotCQkJCQlsb2NhdGlvbiAgIAkoMTQzLCA2NzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkJCQljbGllbnQgICAgIAlAMzAwCi0JCQkJCXN1cHBsaWVyICAgCUAyOTkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4NSwgMTE3MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNDkiIEAzMDUKLQkJCQlsb2NhdGlvbiAgIAkoNTI3LCAxNTkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOEIxQzEyMDNCMiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9uIiBAMzA2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjYsIDE1NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWxlbWVudERlY2xhcmF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzUzOTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCQkJCWNsaWVudCAgICAgCUAzMDUKLQkJCQkJc3VwcGxpZXIgICAJQDI5NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk3LCAxNTkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzA2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA3LCAxNjQ1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTU4NzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUwIiBAMzA5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMzA1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjUsIDEwOTYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDI2IgotCQkJCQljbGllbnQgICAgIAlAMzA1Ci0JCQkJCXN1cHBsaWVyICAgCUAyOTkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNTI3LCAxNTkyKQotCQkJCQkgICAgKDQzNywgMTU5MikKLQkJCQkJICAgICg0MzcsIDEzMTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTI3LCAxNTkyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAxMzEzKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1NSIgQDMxMAotCQkJCWxvY2F0aW9uICAgCSgzMjIsIDE5MTEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M0NjgyOTMwM0U1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDMxMQotCQkJCQlQYXJlbnRfVmlldyAJQDMxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzExCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODM4LCAxODcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VNZXNzYWdlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDg1NjAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCQkJCWNsaWVudCAgICAgCUAzMTAKLQkJCQkJc3VwcGxpZXIgICAJQDI5OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzIyLCAxOTExKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTkxMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk0MywgMTk2NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ1NiIgQDMxNAotCQkJCQlQYXJlbnRfVmlldyAJQDMxMAotCQkJCQlsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNDY4Mjk2MDExOCIKLQkJCQkJY2xpZW50ICAgICAJQDMxMAotCQkJCQlzdXBwbGllciAgIAlAMjk5Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDMyMiwgMTkxMSkKLQkJCQkJICAgICgyMjksIDE5MTEpCi0JCQkJCSAgICAoMjI5LCAxMzEzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOSwgMTMxMykpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMzE1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MDAsIDYwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE1LCA1MTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlR5cGVzIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkJCXdpZHRoICAgICAgCTM4OQotCQkJCWhlaWdodCAgICAgCTIxNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIgQDMxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NiwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkJCXdpZHRoICAgICAgCTIyMgotCQkJCWhlaWdodCAgICAgCTEzMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDMxNwotCQkJCWxvY2F0aW9uICAgCSgyMzQsIDYwNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVUeXBlcyIgQDMxOAotCQkJCQlQYXJlbnRfVmlldyAJQDMxNwotCQkJCQlsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzE4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgwLCA2NDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDcKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZVR5cGVzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NjEwMTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkJCWNsaWVudCAgICAgCUAzMTcKLQkJCQkJc3VwcGxpZXIgICAJQDMxNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MDYsIDYwNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMxOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUyNiwgNTY5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43ODM4ODMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzIxCi0JCQkJCVBhcmVudF9WaWV3IAlAMzE3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTUwLCAzOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzMjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzMsIDMxMykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkJCWNsaWVudCAgICAgCUAzMTcKLQkJCQkJc3VwcGxpZXIgICAJQDMxNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQsIDYwNCkKLQkJCQkJICAgICgxNzQsIDYwNCkKLQkJCQkJICAgICgxNzQsIDIyNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMjI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzIxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4LCAyNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzcyOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVR5cGVzIiBAMzI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1MjUsIDIwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSVR5cGVzIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI1LCAxNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiCi0JCQkJd2lkdGggICAgICAJMjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMTY2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIgQDMyNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTcyOCwgODAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzU5LCA3NTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzM5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIgotCQkJCXdpZHRoICAgICAgCTc1NwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAzMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg1NiwgMTIxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUyOSwgMTEwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NTUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTY3MwotCQkJCWhlaWdodCAgICAgCTI1MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1OSIgQDMyNwotCQkJCWxvY2F0aW9uICAgCSgxODI2LCA5NzUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDUwMEYyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDMyOAotCQkJCQlQYXJlbnRfVmlldyAJQDMyNwotCQkJCQlsb2NhdGlvbiAgIAkoMzA2LCA0NDcpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0NDMzYxNDYwMjNEIgotCQkJCQljbGllbnQgICAgIAlAMzI3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMjUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDg1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMyOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzQsIDkwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjU2NDg5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWEiIEAzMzAKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMjcKLQkJCQkJbG9jYXRpb24gICAJKDMwNiwgNDQ3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwNiwgMTAzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNzU3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0UiCi0JCQkJCWNsaWVudCAgICAgCUAzMjcKLQkJCQkJc3VwcGxpZXIgICAJQDMyNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNiwgOTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgMTA5MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODgsIDEwNTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY1MTUxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzMwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDQURDRDNCMDM4MCIKLQkJCQljbGllbnQgICAgIAlAMzE1Ci0JCQkJc3VwcGxpZXIgICAJQDMyNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwNSwgNTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDUsIDMwNykpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIgQDMzNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA1NiwgMjI0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTUsIDEzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCQkJd2lkdGggICAgICAJNTAwCi0JCQkJaGVpZ2h0ICAgICAJMjEyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzM1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkJCWNsaWVudCAgICAgCUAzMTUKLQkJCQlzdXBwbGllciAgIAlAMzM0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU0LCA1MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NCwgMzMwKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2liaWxpdHlFbGVtZW50IiBAMzM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDQ2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ5MCwgMzY4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJFeHRlbnNpYmlsaXR5RWxlbWVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVEQkI2MDJBOSIKLQkJCQl3aWR0aCAgICAgIAk2ODcKLQkJCQloZWlnaHQgICAgIAkyMTYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjEiIEAzMzcKLQkJCQlsb2NhdGlvbiAgIAkoMTIwNiwgNDkzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAzMzgKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzcKLQkJCQkJbG9jYXRpb24gICAJKC01ODYsIDIzNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDMzOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzYsIDM4NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJCQljbGllbnQgICAgIAlAMzM3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMzQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIwNiwgNDkzKQotCQkJCQkgICAgKDEwOTQsIDQ5MykKLQkJCQkJICAgICgxMDk0LCAzMzApKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIwNiwgNDkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMzMwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzM4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA0MiwgMzc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MjgzMjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiIEAzNDEKLQkJCQkJUGFyZW50X1ZpZXcgCUAzMzcKLQkJCQkJbG9jYXRpb24gICAJKC01ODYsIDIzNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDExOTYsIDQ1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDM5NzExCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkJCQljbGllbnQgICAgIAlAMzM3Ci0JCQkJCXN1cHBsaWVyICAgCUAzMzYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODEsIDQ5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTUsIDU0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzY0OTU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzk2LCAzOTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNDYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NDkxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTAyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQ0MzNjI3RjAwQjciCi0JCQkJY2xpZW50ICAgICAJQDMyNQotCQkJCXN1cHBsaWVyICAgCUAzMzYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODEyLCA3NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDU3MikpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICIyLjMgTWVzc2FnZXMiCi0JCQlxdWlkICAgICAgIAkiM0JDRTg1M0QwMkM4IgotCQkJdGl0bGUgICAgICAJIjIuMyBNZXNzYWdlcyIKLQkJCXpvb20gICAgICAgCTg1Ci0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSIgQDM0NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDEyMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiSU1lc3NhZ2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjcsIDcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJCQlpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkJCWljb25fc3R5bGUgCSJMYWJlbCIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4QUYwMDRGIgotCQkJCXdpZHRoICAgICAgCTM4MAotCQkJCWhlaWdodCAgICAgCTMyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiIEAzNDcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDI5LCAxMjQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIklQYXJ0IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyOSwgNzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTk5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkJCWljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCQkJaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjg0QTkzRjAxQkUiCi0JCQkJd2lkdGggICAgICAJNjE3Ci0JCQkJaGVpZ2h0ICAgICAJMzI0Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAzNDgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDgxNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM0OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NSwgNjkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJQYXJ0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkJCXdpZHRoICAgICAgCTQ5MgotCQkJCWhlaWdodCAgICAgCTI3NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCODRBOTZEMDJGMSIKLQkJCQljbGllbnQgICAgIAlAMzQ4Ci0JCQkJc3VwcGxpZXIgICAJQDM0NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDQsIDY3OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwNCwgMzg2KSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2UiIEAzNTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzUwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDEsIDUwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiTWVzc2FnZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQxLCA1NzkpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMzApCi0JCQkJd2lkdGggICAgICAJNDMyCi0JCQkJaGVpZ2h0ICAgICAJMzIyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzUxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I4NEE4RDEwMkJBIgotCQkJCWNsaWVudCAgICAgCUAzNTAKLQkJCQlzdXBwbGllciAgIAlAMzQ2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDQ1LCA0OTUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgMzg4KSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDM1MgotCQkJCWxvY2F0aW9uICAgCSg2ODgsIDk1MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQUQ1Q0VCRTAwRTIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVQYXJ0cyIgQDM1MwotCQkJCQlQYXJlbnRfVmlldyAJQDM1MgotCQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NTIsIDg5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE0NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlUGFydHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY5NzQ1MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNBRDVDRUJGMDA2MSIKLQkJCQkJY2xpZW50ICAgICAJQDM1MgotCQkJCQlzdXBwbGllciAgIAlAMzQ4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDk1MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDk1MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDk4NywgMTAwNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5ODA5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NjcsIDEwNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkzCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNTQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0MjAzOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIiIEAzNTcKLQkJCQkJUGFyZW50X1ZpZXcgCUAzNTIKLQkJCQkJbG9jYXRpb24gICAJKDE3NiwgMzI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMzU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDA0LCA4OTMpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0FENUNFQkYwMDU3IgotCQkJCQljbGllbnQgICAgIAlAMzUyCi0JCQkJCXN1cHBsaWVyICAgCUAzNTAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjg4LCA5NTIpCi0JCQkJCSAgICAoNDQ1LCA5NTIpCi0JCQkJCSAgICAoNDQ1LCA4MTcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDgxNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzU5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDM1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDM5MywgOTEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDc2MDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTUzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKSkpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgInhzZCIKLQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiWFNEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkib3JnLmVjbGlwc2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJ4c2QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc1VSSSIKLQkJCXZhbHVlICAgICAgCSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3hzZC8yMDAyL1hTRCIpKQotCQlxdWlkICAgICAgIAkiMzlBQkRDNkYwMUFBIgotCQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQW5ub3RhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUUxNzcwMTE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZENEUyMDM2NiIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcHBsaWNhdGlvbkluZm9ybWF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VCRjAyQzgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidXNlckluZm9ybWF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQkJGN0VFQTAxNTciCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlcyIKLQkJCQlxdWlkICAgICAgIAkiM0JCRjdGMDUwMUUyIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJET01BdHRyIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmVhdHVyZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2MTAzQkUiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImF0dHJpYnV0ZURlY2xhcmF0aW9uUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg3RjUyMDJCNCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjk0MDIwMDA4OSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjcyRDhFMjAwRUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5NDAzQTAyMjEiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkVCMDJBOCIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFFMjA2MDE3MiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzgwMEQyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25SZWZlcmVuY2UiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODdGN0IwMzg2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2UiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNzJENzM3MDM4RiIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cENvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjk0MDIwMDA4OSIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVxdWlyZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDQ0YzMDI3RCIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNEREIwM0I3IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb25zdHJhaW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNERTAwMkQ4IgotCQkJCXR5cGUgICAgICAgCSJYU0RDb25zdHJhaW50IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVzZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTdCMDIyMDM4MiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQXR0cmlidXRlVXNlQ2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbFZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQzI3MTlEOTAzNDEiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQm91bmRlZEZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3NTFEMDM0NCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNzYzQzAyMjQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGdW5kYW1lbnRhbEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NTJBMDBDQyIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ2FyZGluYWxpdHlGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NEYwMTMxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzU2QzAxNTMiCi0JCQkJdHlwZSAgICAgICAJIlhTRENhcmRpbmFsaXR5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OEI4MDI4NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY5QkFBMjAzMTAiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTQwMDBGMiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZXJpdmF0aW9uTWV0aG9kIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM2RTQwMjBFIgotCQkJCXR5cGUgICAgICAgCSJYU0REZXJpdmF0aW9uTWV0aG9kIgotCQkJCWluaXR2ICAgICAgCSJyZXN0cmljdGlvbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM3MUQwMjZBIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RDb21wbGV4RmluYWwiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5QzczODAwQzUiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29udGVudFR5cGVDYXRlZ29yeSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUNBNDIwMkI4IgotCQkJCXR5cGUgICAgICAgCSJYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0I4QTAzRTYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNjE4MDE0RCIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29tcGxleEZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJsb2NrIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEZCOTcwMDZFIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaXhlZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMzFBRjVFMDNBNiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBOTAzRDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjZBRERCNTAxQTUiCi0JCQkJdHlwZSAgICAgICAJIkRPTUVsZW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM4MDAzOTQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpYyIKLQkJCXF1aWQgICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0Q0QzBGNEMwMUExIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXZlcml0eSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY5MUMwMDVEIgotCQkJCXR5cGUgICAgICAgCSJYU0REaWFnbm9zdGljU2V2ZXJpdHkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTVGREQwMjgwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNDMDYzNzQzMDE2QiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpbmUiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MDdFMDIxMyIKLQkJCQl0eXBlICAgICAgIAkiaW50IgotCQkJCWluaXR2ICAgICAgCSIxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbHVtbiIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYxMUUwMjk2IgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJaW5pdHYgICAgICAJIjEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibm9kZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwMTZCNkIwMjAwIgotCQkJCXR5cGUgICAgICAgCSJET01Ob2RlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFubm90YXRpb25VUkkiCi0JCQkJcXVpZCAgICAgICAJIjNDMDYzNzRGMDE4NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODVGMTcwMDJFIgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODhFNjYwMzM5IgotCQkJCXN0ZXJlb3R5cGUgCSJtaXhpbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuaWxsYWJsZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRkI0MDI5RiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0NjgwMzY4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDNEEwMDNCOSIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFic3RyYWN0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUM0RTAwMDBFIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxGaW5hbCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQTBEMTRDMDBCMiIKLQkJCQlzdGVyZW90eXBlIAkiMC4uKiIKLQkJCQl0eXBlICAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYmxvY2siCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRDE2ODAxQzEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnREZWNsYXJhdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4OUY2MjAzQ0YiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MzNERDQjAwMDE4IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RFbnVtZXJhdGlvbkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QUNFMDE0MSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkM5RDAzQzciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNjQwMDU0IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyNTY4MDI1OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzczNzQwMjUzIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmFjZXROYW1lIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg5RkI0MDFFQyIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVmZmVjdGl2ZVZhbHVlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBQUUzMDNCNiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZlYXR1cmUiCi0JCQlxdWlkICAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRjgxMDIwRiIKLQkJCQl0eXBlICAgICAgIAkiVmFsdWUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29uc3RyYWludCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlCRjg4MDBDNSIKLQkJCQl0eXBlICAgICAgIAkiWFNEQ29uc3RyYWludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmb3JtIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkwMkIwMzNFIgotCQkJCXR5cGUgICAgICAgCSJYU0RGb3JtIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxleGljYWxWYWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzFBMUIwMTZGIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZ2xvYmFsIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDA3MDM3MiIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmZWF0dXJlUmVmZXJlbmNlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMDQ0MDE4NSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERml4ZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNjk5RTAwQzEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDODgwMUI0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaXhlZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QTYwMDIwMSIKLQkJCQl0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnJhY3Rpb25EaWdpdHNGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdCOTkwMDE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERml4ZWRGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzlEMjAwOEEiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERnVuZGFtZW50YWxGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNjlFODAxRDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QzZDN0IwMzk2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMUM3MDE0MyIKLQkJCQl0eXBlICAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREltcG9ydCIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM5MzAxN0YiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlIgotCQkJCXF1aWQgICAgICAgCSIzQjZBREIxNTAzNkMiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNESW5jbHVkZSIKLQkJCXF1aWQgICAgICAgCSIzQjY4OEM3RDAyNTAiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ4REMwMzgxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3NzgwMDJERiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3NkMwMDRCIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4RTAzMDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4RmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDMxMDNBRCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRTIwMUY3IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExNzQwMjdEIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTE5MzAzNTQiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1heEluY2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I4MzAzQjgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWF4TGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3QzcwMTQ2IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjdEMDBGQyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3REEwMEYzIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1OTAyODEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0MwQTFDREUwMzdDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMEExRDI0MDA5OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0MwQTFFRDEwMzk4IgotCQkJCXR5cGUgICAgICAgCSJWYWx1ZSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmNsdXNpdmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEExQTIwMDhFIgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4Y2x1c2l2ZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFCRTAzRTIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1pbkluY2x1c2l2ZUZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDN0I1MjAzNTMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDREUwMzdDIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNETWluTGVuZ3RoRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc3OEMwMDY1IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3N0M0MDBDMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc3OTkwMTVFIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXAiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0QTY0MDI3OSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21wb3NpdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0YxRDAxQ0YiCi0JCQkJdHlwZSAgICAgICAJIlhTRENvbXBvc2l0b3IiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJFMjAzODEiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjU1MDM4NSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTFGNjAyRTgiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5hbWVkQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkJCXF1aWQgICAgICAgCSIzQjY4NDcwMDAxNDIiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0NzA0MDMxRSIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsaWFzTmFtZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTU3RjAxMjciCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1UkkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1ODcwMEUyIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxpYXNVUkkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE1QUEwMkFGIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOTA5NjMwMjVFIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg0OTQzMDJGMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTRGMDIzQyIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OENCODAwQkEiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSWRlbnRpZmllciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMkUwMEYwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHVibGljSWRlbnRpZmllciIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQzMzQwMzk3IgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE51bWVyaWNGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NDIwMDc0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzVBMzAwMTIiCi0JCQkJdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRE9yZGVyZWRGYWNldCIKLQkJCXF1aWQgICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc2NTkwMTJDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbHVlIgotCQkJCXF1aWQgICAgICAgCSIzQjZDNzRGNjAyREEiCi0JCQkJdHlwZSAgICAgICAJIlhTRE9yZGVyZWQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFBhcnRpY2xlIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NDhGQzAxRTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtaW5PY2N1cnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y4RTAzQjIiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJtYXhPY2N1cnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5Q0Y5OTAzQUUiCi0JCQkJdHlwZSAgICAgICAJImludCIKLQkJCQlpbml0diAgICAgIAkiMSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGFydGljbGVDb250ZW50IgotCQkJcXVpZCAgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjc4MEJEOTAwNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpCi0JCQlhYnN0cmFjdCAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUGF0dGVybkZhY2V0IgotCQkJcXVpZCAgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZDNkNBNTAzOEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QUE2MDMxQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzdDNzkwMzExIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJcXVpZCAgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGRDRCQTAyM0MiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5hbWVkQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY2lyY3VsYXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2ODAwMjE2IgotCQkJCXR5cGUgICAgICAgCSJib29sZWFuIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZWRlZmluZUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2QUUyMDYwMTcyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMkIzMDFENSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFJlZGVmaW5lIgotCQkJcXVpZCAgICAgICAJIjNCNjg4QzlCMDJBRCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzIxREI2NDAyNDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb21wb3NpdG9yIgotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI0MTAyQUUiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RSZXBlYXRhYmxlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM2QzhGMDAyRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWEiCi0JCQlxdWlkICAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZG9jdW1lbnQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc4NEU1MDNERCIKLQkJCQl0eXBlICAgICAgIAkiRE9NRG9jdW1lbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2NoZW1hTG9jYXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjg2OEVDMDIyNiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0I5RjlCRkYwMTgwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXR0cmlidXRlRm9ybURlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjlGOTA0QjAxMDIiCi0JCQkJdHlwZSAgICAgICAJIlhTREZvcm0iCi0JCQkJaW5pdHYgICAgICAJInVucXVhbGlmaWVkIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRGb3JtRGVmYXVsdCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MDc4MDBBQyIKLQkJCQl0eXBlICAgICAgIAkiWFNERm9ybSIKLQkJCQlpbml0diAgICAgIAkidW5xdWFsaWZpZWQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWxEZWZhdWx0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JBMEM0QTcwMDM4IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJibG9ja0RlZmF1bHQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjU5RDAyRDgiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZlcnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNEMjJENkQ4MDM1NiIKLQkJCQl0eXBlICAgICAgIAkiU3RyaW5nIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFDb21wb3NpdG9yIgotCQkJcXVpZCAgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjaGVtYUNvbnRlbnQiCi0JCQlxdWlkICAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQlxdWlkICAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkFFMzIxMDJBRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzY2hlbWFMb2NhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2QUQ5QjMwMzMwIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNjb3BlIgotCQkJcXVpZCAgICAgICAJIjNCNjlCNTQwMDBGMiIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjdGQ0Q2NDAyMzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiKSkKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFyaWV0eSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzMTU4MDBBOSIKLQkJCQl0eXBlICAgICAgIAkiWFNEVmFyaWV0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU0NEYwMTQ2IgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJYU0RTaW1wbGVGaW5hbCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsZXhpY2FsRmluYWwiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkEwRjY1RTAzNUEiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlhTRFNpbXBsZUZpbmFsIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInZhbGlkRmFjZXRzIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QUIwRjAwQjYiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEVGVybSIKLQkJCXF1aWQgICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkJEMjQ0MDA2OSIKLQkJCQlzdGVyZW90eXBlIAkibWl4aW4iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIpKQotCQkJYWJzdHJhY3QgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFRvdGFsRGlnaXRzRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3QjYxMDMzNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc5QUIwMjMyIgotCQkJCXR5cGUgICAgICAgCSJpbnQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFR5cGVEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZBRTJGNTAxM0EiCi0JCQkJc3RlcmVvdHlwZSAJIm1peGluIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiKQotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiKSkKLQkJCWFic3RyYWN0ICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaGl0ZVNwYWNlRmFjZXQiCi0JCQlxdWlkICAgICAgIAkiM0I2Qzc4NDYwMUI3IgotCQkJc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkJICAgIChvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCQkJcXVpZCAgICAgICAJIjNCNkM3ODYyMDA0NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZpeGVkRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2OTlFMDBDMSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I2Qzc4NTAwMjAxIgotCQkJCXR5cGUgICAgICAgCSJYU0RXaGl0ZVNwYWNlIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RXaWxkY2FyZCIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQlzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCQkgICAgKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJCQlxdWlkICAgICAgIAkiM0I2ODRBM0EwMDQxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IikpCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQwRTkwMTlFIgotCQkJCXR5cGUgICAgICAgCSJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlQ29uc3RyYWludCIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0NGODYwMjIzIgotCQkJCXN0ZXJlb3R5cGUgCSIwLi4qIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvY2Vzc0NvbnRlbnRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNVbnNldHRhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUQxMkUwMUU0IgotCQkJCXR5cGUgICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQkE3QkRCNzAxRjkiCi0JCQkJc3RlcmVvdHlwZSAJIjAuLioiCi0JCQkJdHlwZSAgICAgICAJIlN0cmluZyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEWFBhdGhEZWZpbml0aW9uIgotCQkJcXVpZCAgICAgICAJIjNCNkQ4M0JCMDM1NSIKLQkJCXN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJCSAgICAob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkJCXF1aWQgICAgICAgCSIzQjZEODRGNzAwOTIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIpKQotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YXJpZXR5IgotCQkJCXF1aWQgICAgICAgCSIzQjZEOTAxNTAzREUiCi0JCQkJdHlwZSAgICAgICAJIlhTRFhQYXRoVmFyaWV0eSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2YWx1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I3QkJCRTEwMUIxIgotCQkJCXR5cGUgICAgICAgCSJTdHJpbmciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUF0dHIiCi0JCQlxdWlkICAgICAgIAkiM0JCRjhDODkwMUI2IgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5BdHRyIgotCQkJCXF1aWQgICAgICAgCSIzQkJGOENCMDAwRDUiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0MyNzg1MEUwMzgxIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzg1MUIwM0M2IgotCQkJCXN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4MTg5NzkwMjAwIgotCQkJc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5FbGVtZW50IgotCQkJCXF1aWQgICAgICAgCSIzQjgxODlEQjAzNzQiCi0JCQkJc3RlcmVvdHlwZSAJImphdmFjbGFzcyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiRE9NTm9kZSIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjRBNTAxMTciCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLk5vZGUiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NUJGMDAyRCIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJWYWx1ZSIKLQkJCXF1aWQgICAgICAgCSIzQzA0MEI1QjAzMUYiCi0JCQlzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubGFuZy5PYmplY3QiCi0JCQkJcXVpZCAgICAgICAJIjNDMDQwQjhEMDNENSIKLQkJCQlzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQkE3QjBFODAxQTgiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wdGlvbmFsIgotCQkJCXF1aWQgICAgICAgCSIzQkE3QjExNTAyQjciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJvaGliaXRlZCIKLQkJCQlxdWlkICAgICAgIAkiM0JBN0IxMjIwMkQzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlcXVpcmVkIgotCQkJCXF1aWQgICAgICAgCSIzQkE3QjEyOTAyRjAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENhcmRpbmFsaXR5IgotCQkJcXVpZCAgICAgICAJIjNCQzc3MTVEMDA5QiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluaXRlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFEQzAyRUQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY291bnRhYmx5SW5maW5pdGUiCi0JCQkJcXVpZCAgICAgICAJIjNCQzc3MUVDMDE0MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcGxleEZpbmFsIgotCQkJcXVpZCAgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzJFNzAwREEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMkVBMDE2QSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbGwiCi0JCQkJcXVpZCAgICAgICAJIjNCQTBGNkQyMDExMiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29tcG9zaXRvciIKLQkJCXF1aWQgICAgICAgCSIzQjg2OUI2MjAwMzciCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlCRDAwMDAzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNob2ljZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NjlDQjgwMTFFIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlcXVlbmNlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUNFNTAwNTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRENvbnN0cmFpbnQiCi0JCQlxdWlkICAgICAgIAkiM0I4NjlFMjYwMUFFIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0IgotCQkJCXF1aWQgICAgICAgCSIzQjg2OUU4RTAyNTgiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZml4ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCODY5RTk5MDI3MSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTc5RjAzQTIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVtcHR5IgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdDRDAyRjAiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic2ltcGxlIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTdEMTAwQ0UiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWl4ZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCODZBN0QzMDFCNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlbGVtZW50T25seSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkE3RDcwMkU5IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REZXJpdmF0aW9uTWV0aG9kIgotCQkJcXVpZCAgICAgICAJIjNCODZBMEIwMDBDRSIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5zaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjg2QTBDODAzMjkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzdHJpY3Rpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCODZBMENDMDE2MiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNERGlhZ25vc3RpY1NldmVyaXR5IgotCQkJcXVpZCAgICAgICAJIjNCRkU2OEE3MDMyRiIKLQkJCXN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkJCWNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmF0YWwiCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEMzMDNEMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJlcnJvciIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY4RTcwMEUzIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIndhcm5pbmciCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2OEVBMDFGRiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmZvcm1hdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTdGQzIwMTlBIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzVBNDAzREYiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN1YnN0aXR1dGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NzkwMDQ1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2N0YwMUFDIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY4MzAyMEIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjI0NTAwNjkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTREZvcm0iCi0JCQlxdWlkICAgICAgIAkiM0I5RjkxM0IwMUVCIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJxdWFsaWZpZWQiCi0JCQkJcXVpZCAgICAgICAJIjNCOUY5MTZGMDAyMyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bnF1YWxpZmllZCIKLQkJCQlxdWlkICAgICAgIAkiM0I5RjkxOEMwMDdGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RJZGVudGl0eUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCXF1aWQgICAgICAgCSIzQjg2QTFFMDAyNzIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTIwMDg1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtleXJlZiIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTMwMTRGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaXF1ZSIKLQkJCQlxdWlkICAgICAgIAkiM0I4NkEyMTYwMzY1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1RUEwMDIzIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhbnkiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYwMDAzNCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJub3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDYyMDA1RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJzZXQiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdEMDY1MDExNyIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNET3JkZXJlZCIKLQkJCXF1aWQgICAgICAgCSIzQkM3NzE1MjAyRTQiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZhbHNlIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFBOTAyNzEiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicGFydGlhbCIKLQkJCQlxdWlkICAgICAgIAkiM0JDNzcxQkIwMUZGIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRvdGFsIgotCQkJCXF1aWQgICAgICAgCSIzQkM3NzFDNDAxQjIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFByb2Nlc3NDb250ZW50cyIKLQkJCXF1aWQgICAgICAgCSIzQjhGRjhDNzAyODQiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0cmljdCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RjgwMDQ1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxheCIKLQkJCQlxdWlkICAgICAgIAkiM0I4RkY4RjYwMzhCIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNraXAiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGOEU4MDJCQSIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQlxdWlkICAgICAgIAkiM0I5N0M1QkUwMjcyIgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHRlbnNpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDNjhCMDBCOCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2OTQwMjkxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFsbCIKLQkJCQlxdWlkICAgICAgIAkiM0JBMEYyNTAwMjk1IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JCSAgICAob2JqZWN0IENsYXNzICJYU0RTaW1wbGVGaW5hbCIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpc3QiCi0JCQkJcXVpZCAgICAgICAJIjNCOTdDMjgxMDIzMCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXN0cmljdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0MyODMwMTM4IgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuaW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzI4ODAyNEUiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWxsIgotCQkJCXF1aWQgICAgICAgCSIzQkEwRjZFMDAzNzQiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIKLQkJCXF1aWQgICAgICAgCSIzQjk3QzU5MTAwQUUiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImV4dGVuc2lvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5N0M2NjQwMjMxIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc3RyaWN0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjk3QzY2RDAyMTYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFZhcmlldHkiCi0JCQlxdWlkICAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCQkJY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJhdG9taWMiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0E3MDJERiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJCSAgICAob2JqZWN0IENsYXNzQXR0cmlidXRlICJsaXN0IgotCQkJCXF1aWQgICAgICAgCSIzQjhGRjdBRDAxMzkiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5pb24iCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGN0FGMDM5RiIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBDbGFzcyAiWFNEV2hpdGVTcGFjZSIKLQkJCXF1aWQgICAgICAgCSIzQkVFRDBGNjAzNDIiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByZXNlcnZlIgotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEwRjAxMTciCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVwbGFjZSIKLQkJCQlxdWlkICAgICAgIAkiM0JFRUQxMjcwMzREIgotCQkJCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbGxhcHNlIgotCQkJCXF1aWQgICAgICAgCSIzQkVFRDEyOTAzOTYiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkJICAgIChvYmplY3QgQ2xhc3MgIlhTRFhQYXRoVmFyaWV0eSIKLQkJCXF1aWQgICAgICAgCSIzQjhGRkI4OTAzM0EiCi0JCQlzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JCQljbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInNlbGVjdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjhGRkJBQzAxOTIiCi0JCQkJZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCQkgICAgKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmllbGQiCi0JCQkJcXVpZCAgICAgICAJIjNCOEZGQkIzMDI3OCIKLQkJCQlleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjUiCi0JCQlxdWlkICAgICAgIAkiM0M2MjZFQTcwMTAyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2NiIKLQkJCQlxdWlkICAgICAgIAkiM0M2MjZFQTkwMTkxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVwZWF0YWJsZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDNjI2RUE5MDE5MiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNjciCi0JCQlxdWlkICAgICAgIAkiM0I2OURBREMwMkY1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2OCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURBREQwMjM4IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REFERDAyNDIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2OSIKLQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAwNkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDcwIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMEUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OTBENjAzMTgiCi0JCQkJbGFiZWwgICAgICAJImFub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDcxIgotCQkJcXVpZCAgICAgICAJIjNCNjgzNTZCMDJDQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzNTZEMDBBNyIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDczIgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjZCMDE5NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkNzQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjZEMDMwOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNkQwMzEzIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NSIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwNjAyOTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc2IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIwNzAxNzIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ3NyIKLQkJCXF1aWQgICAgICAgCSIzQjY5NDA0RTAwNjciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDc4IgotCQkJCXF1aWQgICAgICAgCSIzQjY5NDA1MDAyOUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2OTQwNTAwMkE1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNzkiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM1OUYwMDg2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDY5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlVXNlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1QTAwMDZBIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVVc2VzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODEiCi0JCQlxdWlkICAgICAgIAkiM0MyNzVEMzIwMjIwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4MiIKLQkJCQlxdWlkICAgICAgIAkiM0MyNzVEM0MwMTBDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQzI3NUQzQzAxMEQiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4MyIKLQkJCXF1aWQgICAgICAgCSIzQjY4ODdCRjAxNTAiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg0IgotCQkJCXF1aWQgICAgICAgCSIzQjY4ODdDMDAwQTciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODg3QzAwMEE4IgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVXaWxkY2FyZCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODUiCi0JCQlxdWlkICAgICAgIAkiM0I2QjQyNUUwMUY5IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ4NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQyNjIwMDQ2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjYyMDA1MCIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4NyIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NTAxMEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDg4IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzU4NjAwRkEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM1ODYwMEZCIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkODkiCi0JCQlxdWlkICAgICAgIAkiM0I2RjFERTkwMThBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5MCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzZDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RjFERUEwMzgwIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkxIgotCQkJcXVpZCAgICAgICAJIjNCOTAwNjg4MDFDMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkOTIiCi0JCQkJcXVpZCAgICAgICAJIjNCOTAwNjhBMDExMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRBbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjkwMDY4QTAxMUIiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRBbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTMiCi0JCQlxdWlkICAgICAgIAkiM0I2ODMzMzUwMzQwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzMzYwMjhEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4MzMzNjAyOEUiCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOTUiCi0JCQlxdWlkICAgICAgIAkiM0I2RkRERDcwMTEzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ5NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjZCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiY29udGVudCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RkREREEwMjc1IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0JBMDAxOTYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ5NyIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzdERjAyNEYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDk4IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzdFMTAwRkQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3RTEwMEZFIgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDk5IgotCQkJcXVpZCAgICAgICAJIjNCNjgzOTU5MDA2RSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAwIgotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNDkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVVc2VzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4Mzk1OTAzNEEiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVVzZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDEiCi0JCQlxdWlkICAgICAgIAkiM0I2OThFMzYwMzg2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjk4RTM4MDA3MiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZUNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjY5OEUzODAwN0MiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZUNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAyMDAwODkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDMiCi0JCQlxdWlkICAgICAgIAkiM0I2ODUxQkEwMTI2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMDQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg1MUJCMDE1MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY4NTFCQjAxNTEiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMDUiCi0JCQlxdWlkICAgICAgIAkiM0I3NTFCMDgwM0M3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJjb250YWluZXIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0UiCi0JCQkJbGFiZWwgICAgICAJImNvbnRhaW5lciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwNiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUIwQzAxQ0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA3IgotCQkJcXVpZCAgICAgICAJIjNCNzUxQjQ4MDI2MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdENvbnRhaW5lciIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQjRDMDI4NSIKLQkJCQlsYWJlbCAgICAgIAkicm9vdENvbnRhaW5lciIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEwOCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjc1MUI0QzAyODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTA5IgotCQkJcXVpZCAgICAgICAJIjNCNzUxQzMxMDM1NiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTEwIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNzUxQzMzMDMzMSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiKQotCQkJICAgIChvYmplY3QgUm9sZSAic2NoZW1hIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I3NTFDMzMwMzNCIgotCQkJCWxhYmVsICAgICAgCSJzY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMTEiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMEEwMDY2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMTIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDIzRiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBCMDI0OSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExMyIKLQkJCXF1aWQgICAgICAgCSIzQjY4OTExNDAxQUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDExNCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODkxMTUwMDE2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjg5MTE1MDAxNyIKLQkJCQlsYWJlbCAgICAgIAkiYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE1IgotCQkJcXVpZCAgICAgICAJIjNCNjgzMzhDMDA1OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE2IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzM4QzAzQkYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzOEMwM0MwIgotCQkJCWxhYmVsICAgICAgCSJ0eXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTE3IgotCQkJcXVpZCAgICAgICAJIjNCNjgzM0VGMDE2MCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTE4IgotCQkJCXF1aWQgICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODMzRjAwMjk5IgotCQkJCWxhYmVsICAgICAgCSJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExOSIKLQkJCXF1aWQgICAgICAgCSIzQjZCNDFFNjAyNTEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyMCIKLQkJCQlxdWlkICAgICAgIAkiM0I2QjQxRUEwMkY3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MUVBMDMwQiIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjEiCi0JCQlxdWlkICAgICAgIAkiM0I2OUMwNTkwMTk4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFMyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IikKLQkJCSAgICAob2JqZWN0IFJvbGUgInN1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlDMDVEMDFFRCIKLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyMyIKLQkJCXF1aWQgICAgICAgCSIzQzQyREJERDAyOTciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyNCIKLQkJCQlxdWlkICAgICAgIAkiM0M0MkRCRTAwMTFFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3Vic3RpdHV0aW9uR3JvdXAiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDNDJEQkUwMDEyOCIKLQkJCQlsYWJlbCAgICAgIAkic3Vic3RpdHV0aW9uR3JvdXAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMjUiCi0JCQlxdWlkICAgICAgIAkiM0I2RDIzQjkwMUNEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjYiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQyM0JBMDFDNCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDIzQkEwMUNFIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTI3IgotCQkJcXVpZCAgICAgICAJIjNCNkQ1OTcxMDJFQSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAic2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ1OTc1MDEwNSIKLQkJCQlsYWJlbCAgICAgIAkic2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMjgiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU5NzUwMTE5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyOSIKLQkJCXF1aWQgICAgICAgCSIzQjY5QjY1MzAxN0EiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInNjb3BlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OUI2NTQwMDZEIgotCQkJCWxhYmVsICAgICAgCSJzY29wZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzMCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQjY5QjY1NDAwNkUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGZWF0dXJlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjUzNzAyNkMiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzEiCi0JCQlxdWlkICAgICAgIAkiM0MyOTAxMDYwMkQ3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZEZlYXR1cmUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI5MDEwQjAwMEUiCi0JCQkJbGFiZWwgICAgICAJInJlc29sdmVkRmVhdHVyZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTMyIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjkwMTBCMDAxOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzMyIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIwRDAxODMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzNCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMEQwMzNDIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjBEMDM0NiIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNSIKLQkJCXF1aWQgICAgICAgCSIzQjY5RDI5RTAxNEQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlZmVyZW5jZWRLZXkiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2NSIKLQkJCQlsYWJlbCAgICAgIAkicmVmZXJlbmNlZEtleSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTM2IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEMkE4MDE2RiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEzNyIKLQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRDAwM0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEzOCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInNlbGVjdG9yIgotCQkJCXF1aWQgICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJbGFiZWwgICAgICAJInNlbGVjdG9yIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMzkiCi0JCQlxdWlkICAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDAiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmaWVsZHMiCi0JCQkJcXVpZCAgICAgICAJIjNCNkQ4RDMzMDM3OSIKLQkJCQlsYWJlbCAgICAgIAkiZmllbGRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEWFBhdGhEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNDEiCi0JCQlxdWlkICAgICAgIAkiM0I2QURDRDgwMkZDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNDIiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREltcG9ydCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0Q5MDE4QyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0MyIKLQkJCXF1aWQgICAgICAgCSIzQjZBRENDNTAwN0UiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0NCIKLQkJCQlxdWlkICAgICAgIAkiM0I2QURDQzYwMDZCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDN0QwMjUwIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNkFEQ0M2MDA2QyIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0NSIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNzAyQzgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTgwM0UyIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjE5MDAwNCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0NyIKLQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCMTAyRjgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0OCIKLQkJCQlxdWlkICAgICAgIAkiM0I2QkNFQjYwMDFCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZCQ0VCNjAwMjUiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE0OSIKLQkJCXF1aWQgICAgICAgCSIzQjY4MzYwNjAyNkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInBhcnRpY2xlcyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM2MDcwMjIyIgotCQkJCWxhYmVsICAgICAgCSJwYXJ0aWNsZXMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE1MSIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIxNTAwOEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE1MiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTYwMDk2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9uIgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxNjAwQTAiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNTMiCi0JCQlxdWlkICAgICAgIAkiM0I2ODM3QUMwMjVBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNTQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzN0FEMDMzOCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibW9kZWxHcm91cCIKLQkJCQlxdWlkICAgICAgIAkiM0I2ODM3QUQwMzM5IgotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU1IgotCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ1MDM5OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU2IgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDI0OTAzOEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0MjQ5MDM5RSIKLQkJCQlsYWJlbCAgICAgIAkicmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU3IgotCQkJcXVpZCAgICAgICAJIjNCNjlEQjBGMDIxMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTU4IgotCQkJCXF1aWQgICAgICAgCSIzQjY5REIxMDAwQzkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTAwMEQzIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTU5IgotCQkJcXVpZCAgICAgICAJIjNCNkI0NzE1MDExOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYwIgotCQkJCXF1aWQgICAgICAgCSIzQjZCNDcxQTAzQUIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkI0NzFBMDNCNSIKLQkJCQlsYWJlbCAgICAgIAkiY29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QkQyMjMwMEM2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTYxIgotCQkJcXVpZCAgICAgICAJIjNCNjgzQzg5MDEyMiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYyIgotCQkJCXF1aWQgICAgICAgCSIzQjY4M0M4QTAxMTAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInRlcm0iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjgzQzhBMDExMSIKLQkJCQlsYWJlbCAgICAgIAkidGVybSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjMiCi0JCQlxdWlkICAgICAgIAkiM0I2QURFNDIwMDlBIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjQiCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDJGRSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNkFERTQzMDMwOCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY1IgotCQkJcXVpZCAgICAgICAJIjNCNkFFODI0MDA1MSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTY2IgotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjZBRTgyNjAyQjciCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmVDb250ZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNjciCi0JCQlxdWlkICAgICAgIAkiM0I2ODhFNkIwMDNEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNjgiCi0JCQkJcXVpZCAgICAgICAJIjNCNjg4RTZDMDEwNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbnRlbnRzIgotCQkJCXF1aWQgICAgICAgCSIzQjY4OEU2QzAxMTEiCi0JCQkJbGFiZWwgICAgICAJImNvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29udGVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTY5IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRThEMDFCRiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTcwIgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJlbGVtZW50RGVjbGFyYXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU4RTAxOTkiCi0JCQkJbGFiZWwgICAgICAJImVsZW1lbnREZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzEiCi0JCQlxdWlkICAgICAgIAkiM0I2NkZERkEwMEMzIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzIiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZGREZCMDI3RCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImF0dHJpYnV0ZURlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkZERkIwMjdFIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3MyIKLQkJCXF1aWQgICAgICAgCSIzQjY2RUU5MjAyMTYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3NCIKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFOTMwMThDIgotCQkJCWxhYmVsICAgICAgCSJhdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTc1IgotCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDA0OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTc2IgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUU3NjAzNzQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlRGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRTc2MDM3RSIKLQkJCQlsYWJlbCAgICAgIAkidHlwZURlZmluaXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNzciCi0JCQlxdWlkICAgICAgIAkiM0I2NkVFRkYwMjRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxNzgiCi0JCQkJcXVpZCAgICAgICAJIjNCNjZFRjAwMDI1QSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1vZGVsR3JvdXBEZWZpbml0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVGMDAwMjY0IgotCQkJCWxhYmVsICAgICAgCSJtb2RlbEdyb3VwRGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE3OSIKLQkJCXF1aWQgICAgICAgCSIzQkZDMkExNzAxRUQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4MCIKLQkJCQlxdWlkICAgICAgIAkiM0JGQzJBMUEwMjczIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkMyQTFBMDI3RCIKLQkJCQlsYWJlbCAgICAgIAkiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTgxIgotCQkJcXVpZCAgICAgICAJIjNCNjZFRUE3MDIzRSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTgyIgotCQkJCXF1aWQgICAgICAgCSIzQjY2RUVBODAzOEEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2NkVFQTgwMzhCIgotCQkJCWxhYmVsICAgICAgCSJub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODMiCi0JCQlxdWlkICAgICAgIAkiM0I2OUU0NTYwMjkwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODQiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFNDU3MDE2NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjY5RTQ1NzAxNkYiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4NSIKLQkJCXF1aWQgICAgICAgCSIzQjZENUNBNTAxMTIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4NiIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0I0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJjb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDVDQTcwM0M4IgotCQkJCWxhYmVsICAgICAgCSJjb250ZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxODciCi0JCQlxdWlkICAgICAgIAkiM0I2QzM1QUQwMzc0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxODgiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNUFGMDAwNiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZmFjZXRDb250ZW50cyIKLQkJCQlxdWlkICAgICAgIAkiM0I2QzM1QUYwMDEwIgotCQkJCWxhYmVsICAgICAgCSJmYWNldENvbnRlbnRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4OSIKLQkJCXF1aWQgICAgICAgCSIzQkM4QUUwMjAzQTgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5MCIKLQkJCQlxdWlkICAgICAgIAkiM0JDOEFFMDYwMDUxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJmYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCQzhBRTA2MDA2NSIKLQkJCQlsYWJlbCAgICAgIAkiZmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uc3RyYWluaW5nRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM2QjM0MDA5MyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxOTEiCi0JCQlxdWlkICAgICAgIAkiM0I2QzM0QjcwMjA4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOTIiCi0JCQkJcXVpZCAgICAgICAJIjNCNkMzNEJFMDI1OCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWVtYmVyVHlwZURlZmluaXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzRCRTAyNTkiCi0JCQkJbGFiZWwgICAgICAJIm1lbWJlclR5cGVEZWZpbml0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkzIgotCQkJcXVpZCAgICAgICAJIjNCNkMzNjMyMDFEQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk0IgotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNTkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZ1bmRhbWVudGFsRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQjZDMzYzNTAwNjMiCi0JCQkJbGFiZWwgICAgICAJImZ1bmRhbWVudGFsRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5RTgwMUQ2IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk1IgotCQkJcXVpZCAgICAgICAJIjNCNkQzNUFCMDI3MyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTk2IgotCQkJCXF1aWQgICAgICAgCSIzQjZEMzVCMjAyOTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJhc2VUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCWxhYmVsICAgICAgCSJiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE5NyIKLQkJCXF1aWQgICAgICAgCSIzQjZENTU3MjAxNkMiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE5OCIKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjJGIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2RDU1NzUwMjQzIgotCQkJCWxhYmVsICAgICAgCSJwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTk5IgotCQkJcXVpZCAgICAgICAJIjNCNjlFMjkxMDE1OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAwIgotCQkJCXF1aWQgICAgICAgCSIzQjY5RTI5MjAxOUYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNCNjlFMjkyMDFBOSIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMSIKLQkJCXF1aWQgICAgICAgCSIzQjkwMDZDRjAwODgiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwMiIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTVEIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJkZXJpdmF0aW9uQW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I5MDA2RDEwMTY3IgotCQkJCWxhYmVsICAgICAgCSJkZXJpdmF0aW9uQW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwMyIKLQkJCXF1aWQgICAgICAgCSIzQjY5REIzMzAyNjQiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwNCIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjg0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJhbm5vdGF0aW9ucyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMzQwMjhFIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9ucyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMDUiCi0JCQlxdWlkICAgICAgIAkiM0I2OURCMTEwMjZGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMDYiCi0JCQkJcXVpZCAgICAgICAJIjNCNjlEQjEyMDFGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYW5ub3RhdGlvbiIKLQkJCQlxdWlkICAgICAgIAkiM0I2OURCMTIwMjAzIgotCQkJCWxhYmVsICAgICAgCSJhbm5vdGF0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjA3IgotCQkJcXVpZCAgICAgICAJIjNDNjI2RUIzMDAwNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjA4IgotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMjciCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb25zIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzYyNkVCNDAzMzIiCi0JCQkJbGFiZWwgICAgICAJImFubm90YXRpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIwOSIKLQkJCXF1aWQgICAgICAgCSIzQkVCREM4NzAyNDciCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxMCIKLQkJCQlxdWlkICAgICAgIAkiM0JFQkRDOEMwMkY5IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCXF1aWQgICAgICAgCSIzQkVCREM4QzAzMDMiCi0JCQkJbGFiZWwgICAgICAJImF0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMTEiCi0JCQlxdWlkICAgICAgIAkiM0JGRTYyMjcwM0NEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMTIiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyMkIwMDYxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERGlhZ25vc3RpYyIKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IikKLQkJCSAgICAob2JqZWN0IFJvbGUgImNvbXBvbmVudHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2MjJCMDA2QyIKLQkJCQlsYWJlbCAgICAgIAkiY29tcG9uZW50cyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbmNyZXRlQ29tcG9uZW50IgotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDdCNDAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEzIgotCQkJcXVpZCAgICAgICAJIjNCRkU2MjY5MDE2NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE0IgotCQkJCXF1aWQgICAgICAgCSIzQkZFNjI2QTAwMjYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImRpYWdub3N0aWNzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0JGRTYyNkEwMDI3IgotCQkJCWxhYmVsICAgICAgCSJkaWFnbm9zdGljcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxNSIKLQkJCXF1aWQgICAgICAgCSIzQkZFNjQzMTAzNUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIxNiIKLQkJCQlxdWlkICAgICAgIAkiM0JGRTY0MzIwMUM2IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiYWxsRGlhZ25vc3RpY3MiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCQkJcXVpZCAgICAgICAJIjNCRkU2NDMyMDFDNyIKLQkJCQlsYWJlbCAgICAgIAkiYWxsRGlhZ25vc3RpY3MiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIgotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjE3IgotCQkJcXVpZCAgICAgICAJIjNDMjFEQ0M3MDBFQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjE4IgotCQkJCXF1aWQgICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJyZXNvbHZlZFNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCWxhYmVsICAgICAgCSJyZXNvbHZlZFNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIxOSIKLQkJCXF1aWQgICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyMCIKLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hQ29tcG9zaXRvciIKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImluY29ycG9yYXRlZFNjaGVtYSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyMUREMTAwMzA1IgotCQkJCWxhYmVsICAgICAgCSJpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMjEiCi0JCQlxdWlkICAgICAgIAkiM0MyMzkxMzQwMDRGIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMjIiCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBDQSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImFubm90YXRpb24iCi0JCQkJcXVpZCAgICAgICAJIjNDMjM5MTM2MDBENCIKLQkJCQlsYWJlbCAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFREM4MDIzMyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyMyIKLQkJCXF1aWQgICAgICAgCSIzQzI1RDNBNjAxMzEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUQzQTkwMzcwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAicmVmZXJlbmNpbmdEaXJlY3RpdmVzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RDNBOTAzNzEiCi0JCQkJbGFiZWwgICAgICAJInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4QTIwMkEyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyNSIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUNGMDAwNUUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyNiIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVDRjQwMDFFIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiKQotCQkJICAgIChvYmplY3QgUm9sZSAicm9vdFZlcnNpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUNGNDAwMjgiCi0JCQkJbGFiZWwgICAgICAJInJvb3RWZXJzaW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjI3IgotCQkJcXVpZCAgICAgICAJIjNDMjVFRDBCMDExQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjI4IgotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJvcmlnaW5hbFZlcnNpb24iCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUQwRjAxMkIiCi0JCQkJbGFiZWwgICAgICAJIm9yaWdpbmFsVmVyc2lvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIyOSIKLQkJCXF1aWQgICAgICAgCSIzQzI1RUVBQjAwMUYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIzMCIKLQkJCQlxdWlkICAgICAgIAkiM0MyNUVFQUYwMTBCIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaW5jb3Jwb3JhdGVkVmVyc2lvbnMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI1RUVBRjAxMTUiCi0JCQkJbGFiZWwgICAgICAJImluY29ycG9yYXRlZFZlcnNpb25zIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIgotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzEiCi0JCQlxdWlkICAgICAgIAkiM0MyNzZEQTAwMERFIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyMzIiCi0JCQkJcXVpZCAgICAgICAJIjNDMjc2REEwMDBERiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiaXRlbVR5cGVEZWZpbml0aW9uIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpKQotCQkJCXF1aWQgICAgICAgCSIzQzI3NkRBMDAwRTAiCi0JCQkJbGFiZWwgICAgICAJIml0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjMzIgotCQkJcXVpZCAgICAgICAJIjNDMjc4NDczMDE5NCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM0IgotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRjEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzY2hlbWFGb3JTY2hlbWEiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI3ODQ3NTAxRkIiCi0JCQkJbGFiZWwgICAgICAJInNjaGVtYUZvclNjaGVtYSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzNSIKLQkJCXF1aWQgICAgICAgCSIzQzI4ODBGNTAzRDkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDAzQyIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM2IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MEY5MDA0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjM3IgotCQkJcXVpZCAgICAgICAJIjNDMjg4MkM1MDEzNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjM4IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjg4MkM3MDExMiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWMiCi0JCQkJcXVpZHUgICAgICAJIjNCRkU1RjkxMDA0NiIpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwcmltYXJ5Q29tcG9uZW50IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyODgyQzcwMTEzIgotCQkJCWxhYmVsICAgICAgCSJwcmltYXJ5Q29tcG9uZW50IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyMzkiCi0JCQlxdWlkICAgICAgIAkiM0MyOEEwRjIwMUE0IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJ0eXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEEwRjMwMkU1IgotCQkJCWxhYmVsICAgICAgCSJ0eXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQwIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBMEYzMDJGMCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiCi0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0MSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTZEQjAxRTUiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE2REQwM0REIgotCQkJCWxhYmVsICAgICAgCSJyb290VHlwZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI0MiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0KQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTZERDAzREUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IikpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjQzIgotCQkJcXVpZCAgICAgICAJIjNDMjhBNzEyMDEwOCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiYmFzZVR5cGUiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QTcxNDAxNTEiCi0JCQkJbGFiZWwgICAgICAJImJhc2VUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzE0MDE1QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDUiCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3NEIwMTc4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJzaW1wbGVUeXBlIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3NEQwMTdCIgotCQkJCWxhYmVsICAgICAgCSJzaW1wbGVUeXBlIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQ2IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBNzREMDE4NSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNDciCi0JCQlxdWlkICAgICAgIAkiM0MyOEE3RUQwM0MwIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICJjb21wbGV4VHlwZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBN0Y0MDExNyIKLQkJCQlsYWJlbCAgICAgIAkiY29tcGxleFR5cGUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQkQwMUY3IgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNDgiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldCkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEE3RjQwMTIxIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI0OSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QTk5NDAzMEEiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgInJvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBERCIKLQkJCQlsYWJlbCAgICAgIAkicm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjUwIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhBOTk3MDBFNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTEiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwODUwMjVCIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTIiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDg2MDI3MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4NjAyN0EiCi0JCQkJbGFiZWwgICAgICAJIm1pbkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTMiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwOEQwMjUyIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMDhFMDA5MSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjA4RTAwOUIiCi0JCQkJbGFiZWwgICAgICAJIm1heEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTUiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUIwMzk2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTYiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEFDMDNDOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4SW5jbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBBQzAzRDQiCi0JCQkJbGFiZWwgICAgICAJIm1heEluY2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTciCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQUYwMzM4IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNTgiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEIwMDFGOSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCMDAyMDMiCi0JCQkJbGFiZWwgICAgICAJIm1pbkluY2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODg3MDJDOSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNTkiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjMwMjA3IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjAiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI0MDE5MCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWluRXhjbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNDAxOUEiCi0JCQkJbGFiZWwgICAgICAJIm1pbkV4Y2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRXhjbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjEiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQjYwMjhEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjIiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEI3MDIxNyIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCNzAyMjEiCi0JCQkJbGFiZWwgICAgICAJIm1heEV4Y2x1c2l2ZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RXhjbHVzaXZlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjMiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkMwMDUxIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjQiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEJDMDI0NiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAibGVuZ3RoRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBCQzAyNTAiCi0JCQkJbGFiZWwgICAgICAJImxlbmd0aEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzYyMDBFNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjUiCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQkYwMThDIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjYiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMwMDA2QiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAid2hpdGVTcGFjZUZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzAwMDc1IgotCQkJCWxhYmVsICAgICAgCSJ3aGl0ZVNwYWNlRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNjciCi0JCQlxdWlkICAgICAgIAkiM0MyOEIwQzIwMjFEIgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyNjgiCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEMzMDBBQiIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAiZW51bWVyYXRpb25GYWNldHMiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDMzAwQUMiCi0JCQkJbGFiZWwgICAgICAJImVudW1lcmF0aW9uRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERW51bWVyYXRpb25GYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDI2OSIKLQkJCXF1aWQgICAgICAgCSIzQzI4QjBDNTAxNTkiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI3MCIKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEIwIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2ltcGxlVHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJwYXR0ZXJuRmFjZXRzIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwQzYwMEJBIgotCQkJCWxhYmVsICAgICAgCSJwYXR0ZXJuRmFjZXRzIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjcxIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEM4MDJBNyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjcyIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImNhcmRpbmFsaXR5RmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDOTAxRjUiCi0JCQkJbGFiZWwgICAgICAJImNhcmRpbmFsaXR5RmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU1RDAzRDIiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjczIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMENCMDM5QyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc0IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBDQzAzRDAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm51bWVyaWNGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMENDMDNEMSIKLQkJCQlsYWJlbCAgICAgIAkibnVtZXJpY0ZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzU5NTAyMDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc1IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMENGMDE5OSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc2IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEMjAwODUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1heExlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDIwMDhGIgotCQkJCWxhYmVsICAgICAgCSJtYXhMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc3IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ1MDBDNSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjc4IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBENjAwMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm1pbkxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEIwRDYwMDI3IgotCQkJCWxhYmVsICAgICAgCSJtaW5MZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjc5IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEQ4MDBERSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgwIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzQ0QiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEODAzRDciCi0JCQkJbGFiZWwgICAgICAJInRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgxIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMERCMDM3NyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjgyIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNUEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBEQzAzNjQiCi0JCQkJbGFiZWwgICAgICAJImZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjgzIgotCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDA0OCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg0IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBERjAzQjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgIm9yZGVyZWRGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMERGMDNDMyIKLQkJCQlsYWJlbCAgICAgIAkib3JkZXJlZEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNET3JkZXJlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzRERDAyNDgiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg1IgotCQkJcXVpZCAgICAgICAJIjNDMjhCMEUzMDBEOSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg2IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjBFNDAzOEUiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImJvdW5kZWRGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCMEU0MDM5OCIKLQkJCQlsYWJlbCAgICAgIAkiYm91bmRlZEZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg3IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNDQ0MDFFQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjg4IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjQ0NTAzNjAiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI0NDUwMzZBIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNFQjAxMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjg5IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNTRGMDE0NSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkwIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjU1MDAzOEMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNTUwMDM5NiIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlV2hpdGVTcGFjZUZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkxIgotCQkJcXVpZCAgICAgICAJIjNDMjhCNUM0MDExQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjkyIgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjVDNTAyMEQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI1QzUwMjE3IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNYXhMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkzIgotCQkJcXVpZCAgICAgICAJIjNDMjhCNjJBMDBBQSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk0IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxMzgiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjYyQjAxNDIiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk1IgotCQkJcXVpZCAgICAgICAJIjNDMjhCNkIwMDNBNiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk2IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjZCMTAzMTEiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkpCi0JCQkJcXVpZCAgICAgICAJIjNDMjhCNkIxMDMxMiIKLQkJCQlsYWJlbCAgICAgIAkiZWZmZWN0aXZlUGF0dGVybkZhY2V0IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGF0dGVybkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFEQjAyNkMiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk3IgotCQkJcXVpZCAgICAgICAJIjNDMjhCN0NBMDI2QiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjk4IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxODYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4QjdDQjAxOTAiCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZUVudW1lcmF0aW9uRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjk5IgotCQkJcXVpZCAgICAgICAJIjNDMjhCODQwMDA2MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAwIgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMUQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg0MTAwMjciCi0JCQkJbGFiZWwgICAgICAJImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUb3RhbERpZ2l0c0ZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlBMDAyMEUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAxIgotCQkJcXVpZCAgICAgICAJIjNDMjhCODk4MDE2RCIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzAyIgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjg5OTAwNTYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4OTkwMDYwIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5MZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzAzIgotCQkJcXVpZCAgICAgICAJIjNDMjhCOERDMDA1MiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA0IgotCQkJCXF1aWQgICAgICAgCSIzQzI4QjhEQzAzQjkiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZUxlbmd0aEZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI4REMwM0MzIgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVMZW5ndGhGYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRExlbmd0aEZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA1IgotCQkJcXVpZCAgICAgICAJIjNDMjhCOTcwMDFEQiIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA2IgotCQkJCXF1aWQgICAgICAgCSIzQzI4Qjk3MTAwQ0YiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgImVmZmVjdGl2ZU1pbkZhY2V0IgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIgotCQkJCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0MyOEI5NzEwMEQ5IgotCQkJCWxhYmVsICAgICAgCSJlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IgotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA3IgotCQkJcXVpZCAgICAgICAJIjNENEJCNEFFMDFDQyIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzA4IgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRBRjAxMEYiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY0ZhY2V0cyIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0QUYwMTFBIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNGYWNldHMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKQotCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzA5IgotCQkJcXVpZCAgICAgICAJIjNENEJCNEQzMDI4RSIKLQkJCXJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkJICAgIChvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzEwIgotCQkJCXF1aWQgICAgICAgCSIzRDRCQjRENDAyRjMiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iCi0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQlpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBSb2xlICJzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQkJbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJCQl2YWx1ZSAgICAgIAlUUlVFKSkKLQkJCQlxdWlkICAgICAgIAkiM0Q0QkI0RDQwMkZEIgotCQkJCWxhYmVsICAgICAgCSJzeW50aGV0aWNQYXJ0aWNsZSIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIgotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkJCUNvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCQkJaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JCSAgICAob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMTEiCi0JCQlxdWlkICAgICAgIAkiM0Q0QkI0RDkwMUY2IgotCQkJcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCQkgICAgKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMTIiCi0JCQkJcXVpZCAgICAgICAJIjNENEJCNERBMDI4NCIKLQkJCQlzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCWlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IFJvbGUgInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQkJCXZhbHVlICAgICAgCVRSVUUpKQotCQkJCXF1aWQgICAgICAgCSIzRDRCQjREQTAyOEUiCi0JCQkJbGFiZWwgICAgICAJInN5bnRoZXRpY1dpbGRjYXJkIgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiCi0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCQkJQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJCQlpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkJICAgIChvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMxMyIKLQkJCXF1aWQgICAgICAgCSIzRDRDNjhGRjAxQkYiCi0JCQlyb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJCSAgICAob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMxNCIKLQkJCQlxdWlkICAgICAgIAkiM0Q0QzY5MDIwMzE3IgotCQkJCXN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ4NDAyOTAiCi0JCQkJaXNfYWdncmVnYXRlIAlUUlVFKQotCQkJICAgIChvYmplY3QgUm9sZSAic3ludGhldGljV2lsZGNhcmQiCi0JCQkJcXVpZCAgICAgICAJIjNENEM2OTAyMDMxOCIKLQkJCQlsYWJlbCAgICAgIAkic3ludGhldGljV2lsZGNhcmQiCi0JCQkJc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJCQlDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkJCWlzX25hdmlnYWJsZSAJVFJVRSkpKSkKLQkJbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSIKLQkJCXF1aWQgICAgICAgCSIzQjY4NDc2ODAxMzgiCi0JCQl0aXRsZSAgICAgIAkiMS4gQ29tcG9uZW50IEhpZXJhcmNoeSAoUGFydCAxOiBTdHJ1Y3R1cmVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEAzNjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MjgsIDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZFOTAwMjkiCi0JCQkJd2lkdGggICAgICAJMzQyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAzNjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTY4LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDk0MCwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjIKLQkJCQlsb2NhdGlvbiAgIAkoOTI4LCAyMjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM2MAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoOTI4LCAyMjUpCi0JCQkJICAgICg5MjgsIDEzNSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAMzYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzYzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDYwLCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzY0Ci0JCQkJbG9jYXRpb24gICAJKDEyMDMsIDcwNikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzYxCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMjAzLCA3MDYpCi0JCQkJICAgICgxMjAzLCA2MTUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBAMzY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MjQsIDU2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM2NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzcyLCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQkEwMDE5NiIKLQkJCQl3aWR0aCAgICAgIAk1MjIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjYKLQkJCQlsb2NhdGlvbiAgIAkoNDQ0LCA3MDkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM2NQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDQ0LCA3MDkpCi0JCQkJICAgICg0NDQsIDYxNSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNjcKLQkJCQlsb2NhdGlvbiAgIAkoMTU3MiwgNDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzNjMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE1NzIsIDQ2NSkKLQkJCQkgICAgKDE1NzIsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDM2OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA4MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDI5MCwgNzU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDM2OQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDQ4LCAxMDU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzY5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjIsIDEwMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZSIgQDM3MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTEwNCwgMzIwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzcwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5MzYsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCXdpZHRoICAgICAgCTM1NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM3MQotCQkJCWxvY2F0aW9uICAgCSg0NTMsIDEyMDMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM2OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDUzLCAxMjAzKQotCQkJCSAgICAoNDUzLCAxMTExKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAMzcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyLCAyNzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAzNzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODcyLCA4MDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzNzMKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NDYsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQl3aWR0aCAgICAgIAkyNzAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNzQKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgOTUwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAzNzMKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE4NzIsIDk1MCkKLQkJCQkgICAgKDE4NzIsIDg1NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAzNzUKLQkJCQlsb2NhdGlvbiAgIAkoMTgxLCA0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDM3MgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTgxLCA0NjUpCi0JCQkJICAgICgxODEsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDM3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTI4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MCwgMTIzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNTUwCi0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMzc3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMDU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzM0LCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDM3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQ4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM3OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2OSwgMTQ0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2NTYKLQkJCQloZWlnaHQgICAgIAkxMTIKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBAMzc5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTg0LCAxNDg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg5MDMsIDE0NDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNTgxCi0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEAzODAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MDAsIDU2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ2MiwgNTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDM4MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTAyNCwgMTA1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzc4LCAxMDEzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBAMzgyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDYsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDM4MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAxMjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDYsIDEyNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUxMAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDM4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCA1NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDYwLCA1MTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAzODUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDEyODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODUKLQkJCQkgICAgbG9jYXRpb24gICAJKDgwMiwgMTIzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDM4NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxNDg4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzg2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzMCwgMTQ0MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTY5NAotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBbm5vdGF0aW9uIiBAMzg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNTc2LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAzODcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQyNiwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMwMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTMxOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDM4OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwMDAsIDMyMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDM4OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMjc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDAyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzg5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCWNsaWVudCAgICAgCUAzNzAKLQkJCQlzdXBwbGllciAgIAlAMzYwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5NCwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDk0LCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIgQDM5MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk2MCwgODAwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2OTAsIDc1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDM5MQotCQkJCWxvY2F0aW9uICAgCSg5NjIsIDk0NykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAMzkwCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg5NjIsIDk0NykKLQkJCQkgICAgKDk2MiwgODU1KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzkyCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMzkzCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMzkyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTgsIDExNTQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjEyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNjM1MzQKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUY1NTAzMkIiCi0JCQkJY2xpZW50ICAgICAJQDM4MwotCQkJCXN1cHBsaWVyICAgCUAzNjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDksIDEyNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0OSwgNzA5KQotCQkJCWRyYXdTdXBwbGllciAJQDM2NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEExMzAyQTIiCi0JCQkJY2xpZW50ICAgICAJQDM4MwotCQkJCXN1cHBsaWVyICAgCUAzNjkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNTYsIDEyNDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI1NiwgMTIwMykKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNzEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNDNEEwMTgyIgotCQkJCWNsaWVudCAgICAgCUAzODQKLQkJCQlzdXBwbGllciAgIAlAMzcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg0LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDM3NSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEE2NDAyNzkiCi0JCQkJY2xpZW50ICAgICAJQDM4MgotCQkJCXN1cHBsaWVyICAgCUAzNjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDAyLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMDIsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzk3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCWNsaWVudCAgICAgCUAzNjMKLQkJCQlzdXBwbGllciAgIAlAMzYwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU2OSwgMjY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTY5LCAyMjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzYyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM5OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTNBMDA0MSIKLQkJCQljbGllbnQgICAgIAlAMzgwCi0JCQkJc3VwcGxpZXIgICAJQDM2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTAsIDUwNSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5MCwgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDM2NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzOTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciCi0JCQkJY2xpZW50ICAgICAJQDM2OAotCQkJCXN1cHBsaWVyICAgCUAzNjUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MTAsIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCA3MDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQljbGllbnQgICAgIAlAMzg1Ci0JCQkJc3VwcGxpZXIgICAJQDM5MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjEsIDEyMjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjEsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDAxCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBANDAyCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTM3LCA4ODYpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMTU4MTIKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDM3NwotCQkJCXN1cHBsaWVyICAgCUAzNjMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjAwLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjAwLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQwMwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlAMzc3Ci0JCQkJc3VwcGxpZXIgICAJQDM3MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTMsIDEwMDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDk1MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNzQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUAzNjkKLQkJCQlzdXBwbGllciAgIAlAMzkwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDUwLCAxMDAxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTAsIDk0NykKLQkJCQlkcmF3U3VwcGxpZXIgCUAzOTEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNENjQwMjMxIgotCQkJCWNsaWVudCAgICAgCUAzNzIKLQkJCQlzdXBwbGllciAgIAlAMzYwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ3LCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NywgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDYKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODRGNzAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDM4OAotCQkJCXN1cHBsaWVyICAgCUAzNjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDEyLCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTIsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QjgwMjg2IgotCQkJCWNsaWVudCAgICAgCUAzNjUKLQkJCQlzdXBwbGllciAgIAlAMzYwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM0LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDgzNCwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwQ0VBMjAxOTciCi0JCQkJY2xpZW50ICAgICAJQDM2MQotCQkJCXN1cHBsaWVyICAgCUAzNjAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzUwLCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNTAsIDIyNSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDA5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUUxNzcwMTE2IgotCQkJCWNsaWVudCAgICAgCUAzODcKLQkJCQlzdXBwbGllciAgIAlAMzYwCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTcyLCAyNjUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3MiwgMjI1KQotCQkJCWRyYXdTdXBwbGllciAJQDM2MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiCi0JCQkJY2xpZW50ICAgICAJQDM3NgotCQkJCXN1cHBsaWVyICAgCUAzNzMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjkzLCAxMjIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjkzLCA5NTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQljbGllbnQgICAgIAlAMzc4Ci0JCQkJc3VwcGxpZXIgICAJQDM2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1OTAsIDE0MzIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDcwNikKLQkJCQlkcmF3U3VwcGxpZXIgCUAzNjQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDEyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ5NDMwMkYxIgotCQkJCWNsaWVudCAgICAgCUAzNzkKLQkJCQlzdXBwbGllciAgIAlAMzYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQzMSwgMTQzMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzMSwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDM2NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDM5MAotCQkJCXN1cHBsaWVyICAgCUAzNjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NTksIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTU5LCA3MDYpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzY0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxNAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTJDMDMwNyIKLQkJCQljbGllbnQgICAgIAlAMzczCi0JCQkJc3VwcGxpZXIgICAJQDM2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzIsIDc0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg3MiwgNzA2KQotCQkJCWRyYXdTdXBwbGllciAJQDM2NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDNDAwOTAiCi0JCQkJY2xpZW50ICAgICAJQDM4MQotCQkJCXN1cHBsaWVyICAgCUAzOTAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5NjIsIDEwMDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk2MiwgOTQ3KQotCQkJCWRyYXdTdXBwbGllciAJQDM5MSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MTYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA0MTcKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDk1LCAxMzg4KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTE4NwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuMDQyNTMxCi0JCQkJICAgIGhlaWdodCAgICAgCTY3Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUJBQTIwMzEwIgotCQkJCWNsaWVudCAgICAgCUAzODYKLQkJCQlzdXBwbGllciAgIAlAMzcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgsIDE0MjkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4LCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMzc1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQxOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBEMDE5MDFGMSIKLQkJCQljbGllbnQgICAgIAlAMzg2Ci0JCQkJc3VwcGxpZXIgICAJQDM2OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY1NiwgMTQyOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU2LCAxMjAzKQotCQkJCWRyYXdTdXBwbGllciAJQDM3MSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuIENvbXBvbmVudCBSZWxhdGlvbnMgKFBhcnQgMSA6IFN0cnVjdHVyZXMpIgotCQkJcXVpZCAgICAgICAJIjM3NEIxODE5MDAyOCIKLQkJCXRpdGxlICAgICAgCSIyLiBDb21wb25lbnQgUmVsYXRpb25zIChQYXJ0IDEgOiBTdHJ1Y3R1cmVzKSIKLQkJCXpvb20gICAgICAgCTk2Ci0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBANDE5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzg0LCAxNjMyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDE5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NzAsIDE1OTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA0MjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDE2MzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjAKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2LCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCXdpZHRoICAgICAgCTI3MAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyOSIgQDQyMQotCQkJCWxvY2F0aW9uICAgCSg0OTQsIDE2MjcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI2NTMwMTdBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY29wZSIgQDQyMgotCQkJCQlQYXJlbnRfVmlldyAJQDQyMQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTU1LCAxNTg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Njb3BlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzEyNTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5QjY1NDAwNkQiCi0JCQkJCWNsaWVudCAgICAgCUA0MjEKLQkJCQkJc3VwcGxpZXIgICAJQDQxOQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk0LCAxNjI3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYxLCAxNjI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTc2LCAxNjY0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTEwMTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTM3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMCIgQDQyNQotCQkJCQlQYXJlbnRfVmlldyAJQDQyMQotCQkJCQlsb2NhdGlvbiAgIAkoMjg2LCAtNDg1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlCNjU0MDA2RSIKLQkJCQkJY2xpZW50ICAgICAJQDQyMQotCQkJCQlzdXBwbGllciAgIAlANDIwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDE2MjcpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMjcsIDE2MjcpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFRlcm0iIEA0MjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDEyMzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0MjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwODQsIDExOTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFRlcm0iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M1RTAxNzQiCi0JCQkJd2lkdGggICAgICAJMjM0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUGFydGljbGUiIEA0MjcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNzYsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA1MSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI1MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAkyNjgKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNjEiIEA0MjgKLQkJCQlsb2NhdGlvbiAgIAkoMjIyOSwgMTExMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4M0M4OTAxMjIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MiIgQDQyOQotCQkJCQlQYXJlbnRfVmlldyAJQDQyOAotCQkJCQlsb2NhdGlvbiAgIAkoNTQ5LCAtMjQ4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzQzhBMDExMCIKLQkJCQkJY2xpZW50ICAgICAJQDQyOAotCQkJCQlzdXBwbGllciAgIAlANDI3Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTEyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyOSwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInRlcm0iIEA0MzAKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MjgKLQkJCQkJbG9jYXRpb24gICAJKDU0OSwgLTI0OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxNTcsIDExMjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdGVybSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTM0MzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk3MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDOEEwMTExIgotCQkJCQljbGllbnQgICAgIAlANDI4Ci0JCQkJCXN1cHBsaWVyICAgCUA0MjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMjksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI5LCAxMTc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI3NCwgMTExOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTE5NDAzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlQ29udGVudCIgQDQzMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMTIzMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3NiwgMTE5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCXdpZHRoICAgICAgCTUyMgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA0MzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNDQsIDc2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NywgNzI3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM0RTAwMjkxIgotCQkJCXdpZHRoICAgICAgCTM1MgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE0OSIgQDQzNQotCQkJCWxvY2F0aW9uICAgCSgyMjE5LCA4ODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDYwMjZGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTAiIEA0MzYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0MzUKLQkJCQkJbG9jYXRpb24gICAJKC0zNTcsIC0yNDApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM2MDcwMjIxIgotCQkJCQljbGllbnQgICAgIAlANDM1Ci0JCQkJCXN1cHBsaWVyICAgCUA0MzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTksIDg4MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTksIDgyMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInBhcnRpY2xlcyIgQDQzNwotCQkJCQlQYXJlbnRfVmlldyAJQDQzNQotCQkJCQlsb2NhdGlvbiAgIAkoLTM1NywgLTI0MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDM4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQzNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDUsIDg4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwYXJ0aWNsZXMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NjYyNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzYwNzAyMjIiCi0JCQkJCWNsaWVudCAgICAgCUA0MzUKLQkJCQkJc3VwcGxpZXIgICAJQDQyNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxOSwgODgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxOSwgOTM5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0MzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI4MSwgODg4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNTY2MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTYyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA0NDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NzYsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzOSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI3NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQl3aWR0aCAgICAgIAkyOTIKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA0NDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNzIsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDkwNSwgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCXdpZHRoICAgICAgCTM1MgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANDQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0MzIsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ0MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg3LCA5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDkwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCXdpZHRoICAgICAgCTUwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NSIgQDQ0MwotCQkJCWxvY2F0aW9uICAgCSg1OTAsIDExNDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTYiIEA0NDQKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDMKLQkJCQkJbG9jYXRpb24gICAJKDMwMiwgMTQ4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQzNUIyMDI5MSIKLQkJCQkJY2xpZW50ICAgICAJQDQ0MwotCQkJCQlzdXBwbGllciAgIAlANDQyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDU5MCwgMTE0MCkKLQkJCQkJICAgICg1NDAsIDExNDApCi0JCQkJCSAgICAoNTQwLCAxMDQ1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MCwgMTE0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU0MCwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlRGVmaW5pdGlvbiIgQDQ0NQotCQkJCQlQYXJlbnRfVmlldyAJQDQ0MwotCQkJCQlsb2NhdGlvbiAgIAkoMzAyLCAxNDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDExNzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4wNTM1NzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEMzVCMjAyQTUiCi0JCQkJCWNsaWVudCAgICAgCUA0NDMKLQkJCQkJc3VwcGxpZXIgICAJQDQ0MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg1OTAsIDExNDApCi0JCQkJCSAgICAoNjQxLCAxMTQwKQotCQkJCQkgICAgKDY0MSwgMTA0NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTAsIDExNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NDEsIDEwNDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1ODQsIDEwOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xMjI0NDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANDQ4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCA5OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0NSwgOTUxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTciIEA0NDkKLQkJCQlsb2NhdGlvbiAgIAkoMTExOSwgMTExMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdERjAyNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDk4IiBANDUwCi0JCQkJCVBhcmVudF9WaWV3IAlANDQ5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTU2OSwgLTgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3RTEwMEZEIgotCQkJCQljbGllbnQgICAgIAlANDQ5Ci0JCQkJCXN1cHBsaWVyICAgCUA0NDgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDExMTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE5LCAxMDQ1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudFR5cGUiIEA0NTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NDkKLQkJCQkJbG9jYXRpb24gICAJKC0xNTY5LCAtOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTksIDExMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudFR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwODk1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdFMTAwRkUiCi0JCQkJCWNsaWVudCAgICAgCUA0NDkKLQkJCQkJc3VwcGxpZXIgICAJQDQzMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTExOSwgMTExMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDExNzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ1MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NTEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYzLCAxMTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yMDg5NTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTAzIiBANDU0Ci0JCQkJbG9jYXRpb24gICAJKDE0NTUsIDk4MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NTFCQTAxMjYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwNCIgQDQ1NQotCQkJCQlQYXJlbnRfVmlldyAJQDQ1NAotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg1MUJCMDE1MCIKLQkJCQkJY2xpZW50ICAgICAJQDQ1NAotCQkJCQlzdXBwbGllciAgIAlANDQ4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDU1LCA5ODIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjgwLCA5ODIpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVXaWxkY2FyZCIgQDQ1NgotCQkJCQlQYXJlbnRfVmlldyAJQDQ1NAotCQkJCQlsb2NhdGlvbiAgIAkoMTU5LCAtNTcwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0NSwgOTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYyODU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODUxQkIwMTUxIgotCQkJCQljbGllbnQgICAgIAlANDU0Ci0JCQkJCXN1cHBsaWVyICAgCUA0NDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NTUsIDk4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MzAsIDk4MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTAsIDEwMjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU0Mjg1NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5OSIgQDQ1OQotCQkJCWxvY2F0aW9uICAgCSg5MjEsIDEyMDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMDZFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMDAiIEA0NjAKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTkKLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM5NTkwMzQ5IgotCQkJCQljbGllbnQgICAgIAlANDU5Ci0JCQkJCXN1cHBsaWVyICAgCUA0NDgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyMSwgMTIwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyMSwgMTA0NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVVzZXMiIEA0NjEKLQkJCQkJUGFyZW50X1ZpZXcgCUA0NTkKLQkJCQkJbG9jYXRpb24gICAJKC04NzEsIC0zNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NzgsIDEyNTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlVXNlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjY5OTM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzOTU5MDM0QSIKLQkJCQkJY2xpZW50ICAgICAJQDQ1OQotCQkJCQlzdXBwbGllciAgIAlANDQxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjEsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjEsIDEzNzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ2MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzksIDEyNTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI4ODM0NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEA0NjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzEyLCA3NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMjIsIDcyNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzODAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDgzQkIwMzU1IgotCQkJCXdpZHRoICAgICAgCTM5OAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANDY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODU2LCAxNjMyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANDY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjIzLCAxNTkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANDY2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MDMsIDQwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTA4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUzIiBANDY3Ci0JCQkJbG9jYXRpb24gICAJKDIyMTYsIDYwOCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NCIgQDQ2OAotCQkJCQlQYXJlbnRfVmlldyAJQDQ2NwotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBRDAzMzgiCi0JCQkJCWNsaWVudCAgICAgCUA0NjcKLQkJCQkJc3VwcGxpZXIgICAJQDQ2NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIxNiwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIxNiwgNTAxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cCIgQDQ2OQotCQkJCQlQYXJlbnRfVmlldyAJQDQ2NwotCQkJCQlsb2NhdGlvbiAgIAkoLTU1MiwgLTgxNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODAsIDYyOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI1MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittb2RlbEdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODI2MDkKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM5IgotCQkJCQljbGllbnQgICAgIAlANDY3Ci0JCQkJCXN1cHBsaWVyICAgCUA0MzQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMTYsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMTYsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ2OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNTYsIDYzMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjMzNjQ1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDQ3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ3MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOSwgMTM4MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDgzIiBANDczCi0JCQkJbG9jYXRpb24gICAJKDE2NzYsIDEyMDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QkYwMTUwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4NCIgQDQ3NAotCQkJCQlQYXJlbnRfVmlldyAJQDQ3MwotCQkJCQlsb2NhdGlvbiAgIAkoNDEyLCAtMzQ0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4N0MwMDBBNyIKLQkJCQkJY2xpZW50ICAgICAJQDQ3MwotCQkJCQlzdXBwbGllciAgIAlANDcyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjc2LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NiwgMTM3MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZVdpbGRjYXJkIiBANDc1Ci0JCQkJCVBhcmVudF9WaWV3IAlANDczCi0JCQkJCWxvY2F0aW9uICAgCSg0MTIsIC0zNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0NzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODU3LCAxMTA2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MjU3NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTE4MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODg3QzAwMEE4IgotCQkJCQljbGllbnQgICAgIAlANDczCi0JCQkJCXN1cHBsaWVyICAgCUA0NDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NzYsIDEyMDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc2LCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0NzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYxOCwgMTEwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjE5NjMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc5IiBANDc4Ci0JCQkJbG9jYXRpb24gICAJKDE0MjksIDE0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1OUYwMDg2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MCIgQDQ3OQotCQkJCQlQYXJlbnRfVmlldyAJQDQ3OAotCQkJCQlsb2NhdGlvbiAgIAkoLTM2MywgLTE0NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNjkiCi0JCQkJCWNsaWVudCAgICAgCUA0NzgKLQkJCQkJc3VwcGxpZXIgICAJQDQ3MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTAsIDE0MzgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVVc2VzIiBANDgwCi0JCQkJCVBhcmVudF9WaWV3IAlANDc4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzYzLCAtMTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQwNSwgMTUwNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVVc2VzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzI1OTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzVBMDAwNkEiCi0JCQkJCWNsaWVudCAgICAgCUA0NzgKLQkJCQkJc3VwcGxpZXIgICAJQDQ0MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQyOSwgMTQzOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNDgsIDE0MzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI3LCAxMzkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NjM1MzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA0ODMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTQyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ4MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzgzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4NyIgQDQ4NAotCQkJCWxvY2F0aW9uICAgCSg3NzcsIDE0MjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1ODUwMTBEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4OCIgQDQ4NQotCQkJCQlQYXJlbnRfVmlldyAJQDQ4NAotCQkJCQlsb2NhdGlvbiAgIAkoLTUxOSwgLTM2NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkEiCi0JCQkJCWNsaWVudCAgICAgCUA0ODQKLQkJCQkJc3VwcGxpZXIgICAJQDQ0MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk2LCAxNDI1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlRGVjbGFyYXRpb24iIEA0ODYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODQKLQkJCQkJbG9jYXRpb24gICAJKC01MTksIC0zNjcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0ODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3ODQsIDE1MDgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNTkyNTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTgzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU4NjAwRkIiCi0JCQkJCWNsaWVudCAgICAgCUA0ODQKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc3LCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjU4LCAxNDI1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0ODgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDg2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIxLCAxMzg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzI0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNzEiIEA0ODkKLQkJCQlsb2NhdGlvbiAgIAkoMjM3LCAxMjA4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTZCMDJDQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzIiIEA0OTAKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODkKLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTYiCi0JCQkJCWNsaWVudCAgICAgCUA0ODkKLQkJCQkJc3VwcGxpZXIgICAJQDQ4MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMzcxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEA0OTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA0ODkKLQkJCQkJbG9jYXRpb24gICAJKC0xMDQzLCA3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM4OCwgMTI0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit0eXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjIzOTI2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTUxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU2RDAwQTciCi0JCQkJCWNsaWVudCAgICAgCUA0ODkKLQkJCQkJc3VwcGxpZXIgICAJQDQ0MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM3LCAxMjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM3LCAxMDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0OTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANDkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1LCAxMjQ3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjM5MjY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANDk0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDc4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk4LCA3NDMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM5MAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkzIiBANDk1Ci0JCQkJbG9jYXRpb24gICAJKDcyOCwgNzc1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzM1MDM0MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTQiIEA0OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA0OTUKLQkJCQkJbG9jYXRpb24gICAJKC04NTYsIC01NykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEQiCi0JCQkJCWNsaWVudCAgICAgCUA0OTUKLQkJCQkJc3VwcGxpZXIgICAJQDQ0OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3MjgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDc3NSkKLQkJCQkJICAgICg3ODgsIDkzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MjgsIDc3NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc4OCwgOTM5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANDk3Ci0JCQkJCVBhcmVudF9WaWV3IAlANDk1Ci0JCQkJCWxvY2F0aW9uICAgCSgtODU2LCAtNTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA0OTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NTgsIDg4MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitiYXNlVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkxLjE0MDk0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzMzNjAyOEUiCi0JCQkJCWNsaWVudCAgICAgCUA0OTUKLQkJCQkJc3VwcGxpZXIgICAJQDQ5NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzI4LCA3NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzksIDc3NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDk5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MCwgODEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTUyNDM5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEA1MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxNywgNDA3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCMjYwM0EyIgotCQkJCXdpZHRoICAgICAgCTYwOAotCQkJCWhlaWdodCAgICAgCTEwNwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNSIgQDUwMQotCQkJCWxvY2F0aW9uICAgCSgxNjI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUQyOUUwMTREIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkS2V5IiBANTAyCi0JCQkJCVBhcmVudF9WaWV3IAlANTAxCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc2MSwgNjA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRLZXkiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS43OTcyOTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RDJBODAxNjUiCi0JCQkJCWNsaWVudCAgICAgCUA1MDEKLQkJCQkJc3VwcGxpZXIgICAJQDUwMAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNjI5LCA1NzQpCi0JCQkJCSAgICAoMTU1NSwgNTc0KQotCQkJCQkgICAgKDE1NTUsIDUwMSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTU1LCA1MDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MDIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjIyLCA1MzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA0NzYxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTM2IiBANTA1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTAxCi0JCQkJCWxvY2F0aW9uICAgCSgtODMsIDk0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEMkE4MDE2RiIKLQkJCQkJY2xpZW50ICAgICAJQDUwMQotCQkJCQlzdXBwbGllciAgIAlANTAwCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MjksIDU3NCkKLQkJCQkJICAgICgxNjg5LCA1NzQpCi0JCQkJCSAgICAoMTY4OSwgNDQ0KQotCQkJCQkgICAgKDE2MTYsIDQ0NCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjI5LCA1NzQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjE2LCA0NDQpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzOSIgQDUwNgotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMDI1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDAiIEA1MDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDYKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM2NSIKLQkJCQkJY2xpZW50ICAgICAJQDUwNgotCQkJCQlzdXBwbGllciAgIAlANTAwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCA2MDgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTk3LCA1MDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJmaWVsZHMiIEA1MDgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MDYKLQkJCQkJbG9jYXRpb24gICAJKC0xMTUsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTA4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExOSwgNjU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTIwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZpZWxkcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDM5MjUyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEMzMwMzc5IgotCQkJCQljbGllbnQgICAgIAlANTA2Ci0JCQkJCXN1cHBsaWVyICAgCUA0NjQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTEwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUwOAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTMsIDY1NCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMS4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDI5OTA3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzNyIgQDUxMQotCQkJCWxvY2F0aW9uICAgCSgxNDE1LCA2MDgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0QwMDNFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzgiIEA1MTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTEKLQkJCQkJbG9jYXRpb24gICAJKDEwMywgMzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDhEM0UwMjJBIgotCQkJCQljbGllbnQgICAgIAlANTExCi0JCQkJCXN1cHBsaWVyICAgCUA1MDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MTUsIDYwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTUsIDUwMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBANTEzCi0JCQkJCVBhcmVudF9WaWV3IAlANTExCi0JCQkJCWxvY2F0aW9uICAgCSgxMDMsIDMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUxMywgNjUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NlbGVjdG9yIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MTEyMTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTk4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJCWNsaWVudCAgICAgCUA1MTEKLQkJCQkJc3VwcGxpZXIgICAJQDQ2NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxNSwgNjA4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxNSwgNzE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MSwgNjUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTI1MjMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANTE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDE2MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyMiwgNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTgxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk1OTkKLQkJCQloZWlnaHQgICAgIAkyMDkKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODEiIEA1MTcKLQkJCQlsb2NhdGlvbiAgIAkoMjM5NSwgNjA2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRUE3MDIzRSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgyIiBANTE4Ci0JCQkJCVBhcmVudF9WaWV3IAlANTE3Ci0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAxNzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFQTgwMzhBIgotCQkJCQljbGllbnQgICAgIAlANTE3Ci0JCQkJCXN1cHBsaWVyICAgCUA1MTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM5NSwgNjA2KQotCQkJCQkgICAgKDIzOTUsIDY1KQotCQkJCQkgICAgKDE2MTEsIDY1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTEsIDY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibm90YXRpb25EZWNsYXJhdGlvbnMiIEA1MTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MTcKLQkJCQkJbG9jYXRpb24gICAJKC04NTMsIDE3NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTIwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUxOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODksIDEwNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitub3RhdGlvbkRlY2xhcmF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjQ4OTc3NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzA3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVBODAzOEIiCi0JCQkJCWNsaWVudCAgICAgCUA1MTcKLQkJCQkJc3VwcGxpZXIgICAJQDQ2NQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzk1LCA2MDYpCi0JCQkJCSAgICAoMjM5NSwgMTYzMykKLQkJCQkJICAgICgyMDk4LCAxNjMzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzOTUsIDYwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTgsIDE2MzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMzQ0LCAxMDUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC40ODc4MjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc3IiBANTIyCi0JCQkJbG9jYXRpb24gICAJKDE3NzIsIDI0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUVGRjAyNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE3OCIgQDUyMwotCQkJCQlQYXJlbnRfVmlldyAJQDUyMgotCQkJCQlsb2NhdGlvbiAgIAkoLTk0OCwgLTMyNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUYwMDAyNUEiCi0JCQkJCWNsaWVudCAgICAgCUA1MjIKLQkJCQkJc3VwcGxpZXIgICAJQDUxNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc3MiwgMjQ5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMjQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibW9kZWxHcm91cERlZmluaXRpb25zIiBANTI0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTIyCi0JCQkJCWxvY2F0aW9uICAgCSgtOTQ4LCAtMzI3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MjUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTI0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA3NiwgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDMyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXBEZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzEzNTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRjAwMDI2NCIKLQkJCQkJY2xpZW50ICAgICAJQDUyMgotCQkJCQlzdXBwbGllciAgIAlANDY2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3NzIsIDI0OSkKLQkJCQkJICAgICgxODMyLCAyNDkpCi0JCQkJCSAgICAoMTgzMiwgMzk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NzIsIDI0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MzIsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTI2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUyNAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3ODEsIDM0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM3ODY0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MyIgQDUyNwotCQkJCWxvY2F0aW9uICAgCSgyMzQ2LCA1MTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTIwMjE2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzQiIEA1MjgKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MjcKLQkJCQkJbG9jYXRpb24gICAJKDE1NCwgODYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyOQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1MjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcyLCAxODU3KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMy42MzAwNzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFOTMwMThCIgotCQkJCQljbGllbnQgICAgIAlANTI3Ci0JCQkJCXN1cHBsaWVyICAgCUA1MTYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjM0NiwgNTE4KQotCQkJCQkgICAgKDIzNDYsIDE0OSkKLQkJCQkJICAgICgxNjExLCAxNDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYxMSwgMTQ5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucyIgQDUzMAotCQkJCQlQYXJlbnRfVmlldyAJQDUyNwotCQkJCQlsb2NhdGlvbiAgIAkoMTU0LCA4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDgsIDE5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithdHRyaWJ1dGVHcm91cERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMzQ5OTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMzkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRTkzMDE4QyIKLQkJCQkJY2xpZW50ICAgICAJQDUyNwotCQkJCQlzdXBwbGllciAgIAlANDcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIzNDYsIDUxOCkKLQkJCQkJICAgICgyMzQ2LCAxNDQxKQotCQkJCQkgICAgKDIxNjYsIDE0NDEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM0NiwgNTE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2NiwgMTQ0MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOTksIDE5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjM0ODg2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNzUiIEA1MzMKLQkJCQlsb2NhdGlvbiAgIAkoMjAzLCAxNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMDQ5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNzYiIEA1MzQKLQkJCQkJUGFyZW50X1ZpZXcgCUA1MzMKLQkJCQkJbG9jYXRpb24gICAJKC00ODUsIC0yNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzc0IgotCQkJCQljbGllbnQgICAgIAlANTMzCi0JCQkJCXN1cHBsaWVyICAgCUA1MTYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMywgMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb25zIiBANTM1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTMzCi0JCQkJCWxvY2F0aW9uICAgCSgtNDg1LCAtMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MzYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQ5LCAxOTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDc1NzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2NkVFNzYwMzdFIgotCQkJCQljbGllbnQgICAgIAlANTMzCi0JCQkJCXN1cHBsaWVyICAgCUA0OTQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjAzLCAxNTkpCi0JCQkJCSAgICAoMTA0LCAxNTkpCi0JCQkJCSAgICAoMTA0LCA3ODQpCi0JCQkJCSAgICAoMTg5LCA3ODQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjAzLCAxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODksIDc4NCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDUzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NSwgMjAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNTk3MDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTc5IiBANTM4Ci0JCQkJbG9jYXRpb24gICAJKDEwODcsIDMyOSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZDMkExNzAxRUQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE4MCIgQDUzOQotCQkJCQlQYXJlbnRfVmlldyAJQDUzOAotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkMyQTFBMDI3MyIKLQkJCQkJY2xpZW50ICAgICAJQDUzOAotCQkJCQlzdXBwbGllciAgIAlANTE2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg3LCAzMjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDg3LCAyNjQpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIgQDU0MAotCQkJCQlQYXJlbnRfVmlldyAJQDUzOAotCQkJCQlsb2NhdGlvbiAgIAkoLTU3NywgLTIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM3NSwgMzM4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2lkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA5NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTI4OAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGQzJBMUEwMjdEIgotCQkJCQljbGllbnQgICAgIAlANTM4Ci0JCQkJCXN1cHBsaWVyICAgCUA1MDAKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDMyOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODcsIDM5NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTgsIDMzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTA3MTQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE3MSIgQDU0MwotCQkJCWxvY2F0aW9uICAgCSg0OCwgMzIwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZGREZBMDBDMyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTcyIiBANTQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlANTQzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RkRGQjAyN0QiCi0JCQkJCWNsaWVudCAgICAgCUA1NDMKLQkJCQkJc3VwcGxpZXIgICAJQDUxNgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg0OSwgMzIyKQotCQkJCQkgICAgKDQ5LCA2OCkKLQkJCQkJICAgICgxMDEzLCA2OCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OSwgMzIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgNjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVEZWNsYXJhdGlvbnMiIEA1NDUKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDMKLQkJCQkJbG9jYXRpb24gICAJKC0xMDcyLCAtMjg4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzM4LCAxMDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlRGVjbGFyYXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk4NTM2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZGREZCMDI3RSIKLQkJCQkJY2xpZW50ICAgICAJQDU0MwotCQkJCQlzdXBwbGllciAgIAlANDgzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5LCAzMjIpCi0JCQkJCSAgICAoNDksIDE0MTUpCi0JCQkJCSAgICAoMTc0LCAxNDE1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5LCAzMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQsIDE0MTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MSwgMTA4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTk2NzA2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDU0OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDE2LCA0NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NSwgNDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNTAxCi0JCQkJaGVpZ2h0ICAgICAJOTcKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjEiIEA1NDkKLQkJCQlsb2NhdGlvbiAgIAkoNDk5LCA1ODkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNTkwMTk4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjIiIEA1NTAKLQkJCQkJUGFyZW50X1ZpZXcgCUA1NDkKLQkJCQkJbG9jYXRpb24gICAJKC0xMywgMTA5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlDMDVEMDFFMyIKLQkJCQkJY2xpZW50ICAgICAJQDU0OQotCQkJCQlzdXBwbGllciAgIAlANTQ4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDQ5OSwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNTg5KQotCQkJCQkgICAgKDQ1MiwgNDk2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ5OSwgNTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUyLCA0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uIiBANTUxCi0JCQkJCVBhcmVudF9WaWV3IAlANTQ5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTMsIDEwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgxMSwgNTg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwQWZmaWxpYXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAk2LjUyMDgzMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUMwNUQwMUVEIgotCQkJCQljbGllbnQgICAgIAlANTQ5Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNDk5LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA1ODkpCi0JCQkJCSAgICAoNTQ3LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDk5LCA1ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NDcsIDQ5NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ5OSwgNTU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTMxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE1IiBANTU0Ci0JCQkJbG9jYXRpb24gICAJKDI0MSwgNjEzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzMzhDMDA1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE2IiBANTU1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTU0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzM4QzAzQkYiCi0JCQkJCWNsaWVudCAgICAgCUA1NTQKLQkJCQkJc3VwcGxpZXIgICAJQDU0OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjQxLCA2MTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNDEsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInR5cGVEZWZpbml0aW9uIiBANTU2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTU0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTM0MywgLTIxOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTU3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQwOCwgNjk0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjc2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42ODY0NDEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODMzOEMwM0MwIgotCQkJCQljbGllbnQgICAgIAlANTU0Ci0JCQkJCXN1cHBsaWVyICAgCUA0OTQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI0MSwgNjEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQxLCA3MzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIsIDY4NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjEwMTY5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDExNyIgQDU1OQotCQkJCWxvY2F0aW9uICAgCSg4MzcsIDQ2MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNFRjAxNjAiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExOCIgQDU2MAotCQkJCQlQYXJlbnRfVmlldyAJQDU1OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MTksIC02OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJCWNsaWVudCAgICAgCUA1NTkKLQkJCQkJc3VwcGxpZXIgICAJQDU0OAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODM3LCA0NjApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjYsIDQ2MCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImlkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zIiBANTYxCi0JCQkJCVBhcmVudF9WaWV3IAlANTU5Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgxOSwgLTY4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1MjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1MTQ2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQkJY2xpZW50ICAgICAJQDU1OQotCQkJCQlzdXBwbGllciAgIAlANTAwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MzcsIDQ2MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDgsIDQ2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgNDA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMzA0MzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTY5IiBANTY0Ci0JCQkJbG9jYXRpb24gICAJKDU0MSwgMjQ2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRThEMDFCRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTcwIiBANTY1Ci0JCQkJCVBhcmVudF9WaWV3IAlANTY0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY2RUU4RTAxOTgiCi0JCQkJCWNsaWVudCAgICAgCUA1NjQKLQkJCQkJc3VwcGxpZXIgICAJQDUxNgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTQxLCAyNDYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDEzLCAyNDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50RGVjbGFyYXRpb25zIiBANTY2Ci0JCQkJCVBhcmVudF9WaWV3IAlANTY0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTEyMywgLTE4NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTY3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU2NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0MywgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VsZW1lbnREZWNsYXJhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwOTMwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjZFRThFMDE5OSIKLQkJCQkJY2xpZW50ICAgICAJQDU2NAotCQkJCQlzdXBwbGllciAgIAlANTQ4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDU0MSwgMjQ2KQotCQkJCQkgICAgKDIyNCwgMjQ2KQotCQkJCQkgICAgKDIyNCwgNDAwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU0MSwgMjQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI0LCA0MDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NjYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODYsIDMzNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY0NjkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEyMyIgQDU2OQotCQkJCWxvY2F0aW9uICAgCSgzNTMsIDYyMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzQyREJERDAyOTciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEyNCIgQDU3MAotCQkJCQlQYXJlbnRfVmlldyAJQDU2OQotCQkJCQlsb2NhdGlvbiAgIAkoLTYzLCAxNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0M0MkRCRTAwMTFFIgotCQkJCQljbGllbnQgICAgIAlANTY5Ci0JCQkJCXN1cHBsaWVyICAgCUA1NDgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMzUzLCA2MjEpCi0JCQkJCSAgICAoMzA2LCA2MjEpCi0JCQkJCSAgICAoMzA2LCA0OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzUzLCA2MjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDYsIDQ5NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN1YnN0aXR1dGlvbkdyb3VwIiBANTcxCi0JCQkJCVBhcmVudF9WaWV3IAlANTY5Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjMsIDE3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3OSwgNjM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N1YnN0aXR1dGlvbkdyb3VwIgotCQkJCQkgICAgcGN0RGlzdCAgICAJNC44MDg1MTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzQyREJFMDAxMjgiCi0JCQkJCWNsaWVudCAgICAgCUA1NjkKLQkJCQkJc3VwcGxpZXIgICAJQDU0OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgzNTMsIDYyMSkKLQkJCQkJICAgICg0MDAsIDYyMSkKLQkJCQkJICAgICg0MDAsIDQ5NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNTMsIDYyMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQwMCwgNDk2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1NzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANTcxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUwLCA1ODMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNjk3NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQlxdWlkICAgICAgIAkiM0I2OUU3ODYwMkM1IgotCQkJdGl0bGUgICAgICAJIjMuIENvbXBvbmVudCBBdHRyaWJ1dGVzICAoUGFydCAxIDogU3RydWN0dXJlcykiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEA1NzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDEyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDYsIDEwNykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTI0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWUgOiBTdHJpbmciCi0JCQkJCSIrIHRhcmdldE5hbWVzcGFjZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTUzNAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDU3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDE2NDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxNTY3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkJEMDFGNyIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBANTc2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjM2OCwgMTY4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTUyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4MSwgMTU4NCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTc3Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGRlcml2YXRpb25NZXRob2QgOiBYU0REZXJpdmF0aW9uTWV0aG9kID0gcmVzdHJpY3Rpb24iCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEQ29tcGxleEZpbmFsIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iCi0JCQkJCSIrIGNvbnRlbnRUeXBlQ2F0ZWdvcnkgOiBYU0RDb250ZW50VHlwZUNhdGVnb3J5IgotCQkJCQkiPDwwLi4qPj4gKyBwcm9oaWJpdGVkU3Vic3RpdHV0aW9ucyA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIikpCi0JCQkJd2lkdGggICAgICAJMTE5MgotCQkJCWhlaWdodCAgICAgCTMzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1NzcKLQkJCQlsb2NhdGlvbiAgIAkoNDYzLCAzNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDU3NAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDYzLCAzNjIpCi0JCQkJICAgICg0NjMsIDIyMSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDU3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MDgsIDE2MDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1NzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDE1MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDk0LCAxNTc5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTYyOAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB2YXJpZXR5IDogWFNEVmFyaWV0eSIKLQkJCQkJIjw8MC4uKj4+ICsgZmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTY0NgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA1NzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg5MTIsIDE0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU3OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjQ3LCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlVXNlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM1NDYwMUE4IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANTc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2NDcsIDk4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyByZXF1aXJlZCA6IGJvb2xlYW4iCi0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBANTgwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAxOTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTgzMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMjg2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANTgwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTg5MCkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkxMjk0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSA6IFhTRE5hbWVzcGFjZUNvbnN0cmFpbnRDYXRlZ29yeSIKLQkJCQkJIjw8MC4uKj4+ICsgbmFtZXNwYWNlQ29uc3RyYWludCA6IFN0cmluZyIKLQkJCQkJIisgcHJvY2Vzc0NvbnRlbnRzIDogWFNEUHJvY2Vzc0NvbnRlbnRzIikpCi0JCQkJd2lkdGggICAgICAJMTMwNAotCQkJCWhlaWdodCAgICAgCTIzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwIiBANTgxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMzNiwgMTQ0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDEzODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXAiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzRFMDAyOTEiCi0JCQkJd2lkdGggICAgICAJNTk2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA1ODIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMDQsIDUxMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQzMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmVhdHVyZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlCNTM3MDI2QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYsIDQ5MSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQ4Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiCi0JCQkJCSIrIGNvbnN0cmFpbnQgOiBYU0RDb25zdHJhaW50IikpCi0JCQkJd2lkdGggICAgICAJNTU0Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDU4MwotCQkJCWxvY2F0aW9uICAgCSgyOTQsIDY5NykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANTgyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyOTQsIDY5NykKLQkJCQkgICAgKDI5NCwgNjA1KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDU4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjU2LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5OTUsIDQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNTQwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBANTg1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjY4OCwgNTEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNDE4LCA0NjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBOEIwMjBCIgotCQkJCXdpZHRoICAgICAgCTU1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1ODYKLQkJCQlsb2NhdGlvbiAgIAkoMjY4NCwgOTYyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA1ODUKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDI2ODQsIDk2MikKLQkJCQkgICAgKDI2ODQsIDU3NikpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb3NpdG9yIiBANTg3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDExMTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvc2l0b3IiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMTA2NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2OUI2MjAwMzciCi0JCQkJd2lkdGggICAgICAJMzQ0Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbnQiIEA1ODgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODgKLQkJCQkgICAgbG9jYXRpb24gICAJKDYzOCwgNDY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25zdHJhaW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU4OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjM4LCA0MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NjlFMjYwMUFFIgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REZXJpdmF0aW9uTWV0aG9kIiBANTg5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxOTIsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1ODkKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODAsIDIyMTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERlcml2YXRpb25NZXRob2QiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTg5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTgwLCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCODZBMEIwMDBDRSIKLQkJCQl3aWR0aCAgICAgIAk0NDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiIEA1OTAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NCwgMTc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCA4OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50Q2F0ZWdvcnkiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjgxLCAzOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MDcKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjg2QTFFMDAyNzIiCi0JCQkJd2lkdGggICAgICAJNjI1Ci0JCQkJaGVpZ2h0ICAgICAJMzAwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkiIEA1OTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcwNCwgMjIyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ1NiwgMjExNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29udGVudFR5cGVDYXRlZ29yeSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0NTYsIDIwNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4NkE3OUYwM0EyIgotCQkJCXdpZHRoICAgICAgCTUxNAotCQkJCWhlaWdodCAgICAgCTM0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RWYXJpZXR5IiBANTkyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg4MCwgMTYwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNTE2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzA4LCAxNDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOEZGNzczMDI0OSIKLQkJCQl3aWR0aCAgICAgIAkzNjIKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvY2Vzc0NvbnRlbnRzIiBANTkzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk3NiwgMjI0MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzY2LCAyMTU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQcm9jZXNzQ29udGVudHMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTkzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg3NjYsIDIxMDYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDIwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY4QzcwMjg0IgotCQkJCXdpZHRoICAgICAgCTQzOAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aFZhcmlldHkiIEA1OTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjc2OCwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyNTg3LCA5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjMKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEWFBhdGhWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjU4NywgNDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzYzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkZCODkwMzNBIgotCQkJCXdpZHRoICAgICAgCTM4MQotCQkJCWhlaWdodCAgICAgCTI1MAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDU5NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDE4NzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE3ODgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4OSwgMTczOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzI1RDAyOTUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzODksIDE4NDgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQxCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGxpc3QiCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyB1bmlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4RmluYWwiIEA1OTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAyMDAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxOTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4RmluYWwiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzg2LCAxODkxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM2NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMkNBMDFDQiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc4NiwgMjAwMSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTM4MgotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMiIEA1OTcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0ODUsIDExMjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA1OTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ4NSwgMTA3NSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzU5MTAwQUUiCi0JCQkJd2lkdGggICAgICAJNjQ4Ci0JCQkJaGVpZ2h0ICAgICAJMjQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpc2FsbG93ZWRTdWJzdGl0dXRpb25zIiBANTk4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0MCwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTExNikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTcxLCAxMDY2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUE0MDNERiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MSwgMTE3NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgc3Vic3RpdHV0aW9uIgotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIikpCi0JCQkJd2lkdGggICAgICAJNTU2Ci0JCQkJaGVpZ2h0ICAgICAJMjkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIiBANTk5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTY2NCwgMjI3MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjIxMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANTk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMzk4LCAyMTYzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDNUJFMDI3MiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDU5OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM5OCwgMjI3MykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZXh0ZW5zaW9uIgotCQkJCQkiKyByZXN0cmljdGlvbiIpKQotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lc3BhY2VDb25zdHJhaW50Q2F0ZWdvcnkiIEA2MDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzg0LCAyMjQwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0NSwgMjE1NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZXNwYWNlQ29uc3RyYWludENhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDUsIDIxMDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjc4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1RUEwMDIzIgotCQkJCXdpZHRoICAgICAgCTY5NgotCQkJCWhlaWdodCAgICAgCTI5NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA2MDEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjY0LCA4ODApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDEKLQkJCQkgICAgbG9jYXRpb24gICAJKDU3MSwgNzQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTEzODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlANjAxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDgwOSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkxMzk2Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIG5pbGxhYmxlIDogYm9vbGVhbiIKLQkJCQkJIjw8MC4uKj4+ICsgZGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMgOiBYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIKLQkJCQkJIjw8MC4uKj4+ICsgc3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIDogWFNEU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zIgotCQkJCQkiKyBhYnN0cmFjdCA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAkxNDA0Ci0JCQkJaGVpZ2h0ICAgICAJMjg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjAyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUVERUUwMUJGIgotCQkJCWNsaWVudCAgICAgCUA2MDEKLQkJCQlzdXBwbGllciAgIAlANTgyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjgxLCA3MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDU4MykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA2MDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDg2NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDgxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQyRTAxOTIiCi0JCQkJd2lkdGggICAgICAJNDkyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDYwNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2ODgsIDExNTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI0MjAsIDExMDApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0FDODAwRDIiCi0JCQkJY2xpZW50ICAgICAJQDYwNAotCQkJCXN1cHBsaWVyICAgCUA1ODUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODYyLCAxMDg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODYyLCA5NjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANTg2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDYwNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEzMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxNjgsIDEyNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVDRDMwMkE5IgotCQkJCXdpZHRoICAgICAgCTM4NgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2MDcKLQkJCQlsb2NhdGlvbiAgIAkoMjM3NSwgMTQ2NSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjA2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyMzc1LCAxNDY1KQotCQkJCSAgICAoMjM3NSwgMTM3NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYwOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUIxMDA0RCIKLQkJCQljbGllbnQgICAgIAlANjA2Ci0JCQkJc3VwcGxpZXIgICAJQDU4NQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNjgsIDEyNDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNjgsIDk2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA1ODYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjA5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA1NzYKLQkJCQlzdXBwbGllciAgIAlANjA2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjgxOCwgMTUxMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjgxOCwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjEwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA1NzgKLQkJCQlzdXBwbGllciAgIAlANjA2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQwNiwgMTUwNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNiwgMTQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MDcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBANjExCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA2NCwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYxMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOCwgMTEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjEyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUA2MTEKLQkJCQlzdXBwbGllciAgIAlANTg1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjExNSwgMTA4OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjExNSwgOTYyKQotCQkJCWRyYXdTdXBwbGllciAJQDU4NikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIgQDYxMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNjAwLCA1MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzQsIDQ2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxMTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkIyNjAzQTIiCi0JCQkJd2lkdGggICAgICAJMTE1MAotCQkJCWhlaWdodCAgICAgCTE0NAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxNAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QUEzMDI0MiIKLQkJCQljbGllbnQgICAgIAlANjEzCi0JCQkJc3VwcGxpZXIgICAJQDU3NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NjgsIDQ1NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2OCwgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDU3NykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDYxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCA3ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzgsIDcwMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETm90YXRpb25EZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFREFBMDIxQyIKLQkJCQl3aWR0aCAgICAgIAk1MDIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBANjE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTc2LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDQzLCAyNjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAkyODQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDk0MzAyRjEiCi0JCQkJY2xpZW50ICAgICAJQDYxNQotCQkJCXN1cHBsaWVyICAgCUA1NzQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjkwLCA2OTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyOTAsIDM2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA1NzcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjE4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI3REMwMTkzIgotCQkJCWNsaWVudCAgICAgCUA2MDMKLQkJCQlzdXBwbGllciAgIAlANTgyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQxLCA4MDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MSwgNjk3KQotCQkJCWRyYXdTdXBwbGllciAJQDU4MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2MTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDU4MgotCQkJCXN1cHBsaWVyICAgCUA1NzQKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNzIsIDQxOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzcyLCAzNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANTc3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYyMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjkwQTI2MDM2RCIKLQkJCQljbGllbnQgICAgIAlANTg1Ci0JCQkJc3VwcGxpZXIgICAJQDU3NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2ODcsIDQ0OCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY4NywgMzYyKQotCQkJCWRyYXdTdXBwbGllciAJQDU3NykpKQotCQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIjQuIENvbXBvbmVudCBIaWVyYXJjaHksIFJlbGF0aW9ucyBhbmQgQXR0cmlidXRlcyAoUGFydCAyOiBEYXRhdHlwZXMpIgotCQkJcXVpZCAgICAgICAJIjNCNkMzMjY1MDA1RiIKLQkJCXRpdGxlICAgICAgCSI0LiBDb21wb25lbnQgSGllcmFyY2h5LCBSZWxhdGlvbnMgYW5kIEF0dHJpYnV0ZXMgKFBhcnQgMjogRGF0YXR5cGVzKSIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGaXhlZEZhY2V0IiBANjIxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5MiwgODk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzMiwgODQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGaXhlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzY5OUUwMEMxIgotCQkJCXdpZHRoICAgICAgCTMzOAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA2MjIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA4OTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwNCwgODQ1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZXBlYXRhYmxlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFBNjAzMUEiCi0JCQkJd2lkdGggICAgICAJNDUwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVudW1lcmF0aW9uRmFjZXQiIEA2MjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDk2LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyNjYsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVudW1lcmF0aW9uRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkFDRTAxNDEiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDYyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMDA4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NzcsIDExMTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhdHRlcm5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QURCMDI2QyIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjI1Ci0JCQkJbG9jYXRpb24gICAJKDcxOCwgMTA0OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjIyCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3MTgsIDEwNDkpCi0JCQkJICAgICg3MTgsIDk1OSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RPcmRlcmVkRmFjZXQiIEA2MjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgOTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzk5LCA4NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE9yZGVyZWRGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NEREMDI0OCIKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBANjI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NjgsIDkyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM4MywgODcyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJd2lkdGggICAgICAJMzg4Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENhcmRpbmFsaXR5RmFjZXQiIEA2MjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAzMiwgMTEwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNywgMTA0OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0NjgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETnVtZXJpY0ZhY2V0IiBANjI5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDExMDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTksIDEwNDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzcwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCQl3aWR0aCAgICAgIAkzODgKLQkJCQloZWlnaHQgICAgIAkxMzQKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETGVuZ3RoRmFjZXQiIEA2MzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjMwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0OTEsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzMwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRExlbmd0aEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc3NjIwMEU3IgotCQkJCXdpZHRoICAgICAgCTM0OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5MZW5ndGhGYWNldCIgQDYzMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg2MDgsIDE1NTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQwNSwgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluTGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4QzAwNjUiCi0JCQkJd2lkdGggICAgICAJNDI0Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYzMgotCQkJCWxvY2F0aW9uICAgCSgxNDQsIDEyNjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDYyMQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTQ0LCAxMjYyKQotCQkJCSAgICAoMTQ0LCA5NjQpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4TGVuZ3RoRmFjZXQiIEA2MzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIxNiwgMTU1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNywgMTQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTM0Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdoaXRlU3BhY2VGYWNldCIgQDYzNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxMzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjM0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4ODAsIDEzMjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2VGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODQ2MDFCNyIKLQkJCQl3aWR0aCAgICAgIAk0OTgKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4SW5jbHVzaXZlRmFjZXQiIEA2MzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTMxMiwgMTcyOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA5MCwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4SW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg3RDAwREEiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBANjM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE0MjQsIDE5MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDExOTMsIDE4NTIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEV4Y2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4OTYwMEMyIgotCQkJCXdpZHRoICAgICAgCTQ4MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5JbmNsdXNpdmVGYWNldCIgQDYzNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg0OTYsIDE3MjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MiwgMTY3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluSW5jbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg4NzAyQzkiCi0JCQkJd2lkdGggICAgICAJNDQ2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkV4Y2x1c2l2ZUZhY2V0IiBANjM4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDM1MiwgMTkwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDYzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI0LCAxODUyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5FeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OTJEMDAwQSIKLQkJCQl3aWR0aCAgICAgIAk0NzQKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDYzOQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2MzkKLQkJCQkgICAgbG9jYXRpb24gICAJKDUyLCAyMDU2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUb3RhbERpZ2l0c0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc5QTAwMjBFIgotCQkJCXdpZHRoICAgICAgCTQyNgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBANjQwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDIxMTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDAKLQkJCQkgICAgbG9jYXRpb24gICAJKDEzMTgsIDIwNTYpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjQxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOUQwM0M3IgotCQkJCWNsaWVudCAgICAgCUA2MjMKLQkJCQlzdXBwbGllciAgIAlANjIyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzk0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzOTQsIDEwNDkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjI1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY0MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODYyMDA0NSIKLQkJCQljbGllbnQgICAgIAlANjM0Ci0JCQkJc3VwcGxpZXIgICAJQDYyMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMTksIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTksIDEyNjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjMyKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wb25lbnQiIEA2NDMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMzYsIDE2MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAxMTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDQKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkNBNTAzOEQiCi0JCQkJY2xpZW50ICAgICAJQDYyNAotCQkJCXN1cHBsaWVyICAgCUA2MjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMTAwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDQ0LCAxMDQ5KQotCQkJCWRyYXdTdXBwbGllciAJQDYyNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NDUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc4MDAyREYiCi0JCQkJY2xpZW50ICAgICAJQDYzMAotCQkJCXN1cHBsaWVyICAgCUA2MjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjMsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MywgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWQiIEA2NDYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA0OCwgMTQwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzNSwgMTMyNCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDEyNzQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNTIwMkU0IgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDYXJkaW5hbGl0eSIgQDY0NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDQ4LCAxNzI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODM1LCAxNjY5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDYXJkaW5hbGl0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzUsIDE2MTkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JDNzcxNUQwMDlCIgotCQkJCXdpZHRoICAgICAgCTQ0NAotCQkJCWhlaWdodCAgICAgCTI0MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaGl0ZVNwYWNlIiBANjQ4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDIwMzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NDgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4NjEsIDE5NTEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdoaXRlU3BhY2UiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxODYxLCAxOTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCRUVEMEY2MDM0MiIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkyODcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6VmFsdWUiIEA2NDkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODgwLCAyMDk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjQ5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg1NzEsIDIwNjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjE4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlZhbHVlIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY0OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTcxLCAyMDEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQzA0MEI1QjAzMUYiCi0JCQkJd2lkdGggICAgICAJNjM2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjUwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNjEwMzM3IgotCQkJCWNsaWVudCAgICAgCUA2MzkKLQkJCQlzdXBwbGllciAgIAlANjIxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUsIDIwNDQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluRmFjZXQiIEA2NTEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDEzNzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTMyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUNERTAzN0MiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMywgMTM4MCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjkwCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEA2NTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTg0LCAxMzc2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjUyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDQwLCAxMzIwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0VCMDEwRSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY1MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ0MCwgMTM4MCkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjk0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIHZhbHVlIDogVmFsdWUiKSkKLQkJCQl3aWR0aCAgICAgIAkzMDYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzBBMUQyNDAwOTgiCi0JCQkJY2xpZW50ICAgICAJQDY1MQotCQkJCXN1cHBsaWVyICAgCUA2MjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzUsIDEzMDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFEMzEwM0FEIgotCQkJCWNsaWVudCAgICAgCUA2NTIKLQkJCQlzdXBwbGllciAgIAlANjIxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgMTMwOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgMTI2MikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2MzIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjU1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTIwMzUzIgotCQkJCWNsaWVudCAgICAgCUA2MzcKLQkJCQlzdXBwbGllciAgIAlANjUxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjg1LCAxNjY0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODUsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjgzMDNCOCIKLQkJCQljbGllbnQgICAgIAlANjM1Ci0JCQkJc3VwcGxpZXIgICAJQDY1MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDAsIDE2NjQpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDAsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3QjhFMDMwOSIKLQkJCQljbGllbnQgICAgIAlANjM2Ci0JCQkJc3VwcGxpZXIgICAJQDY1MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MjIsIDE4NDApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MjIsIDE0NDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3N0M0MDBDMCIKLQkJCQljbGllbnQgICAgIAlANjMxCi0JCQkJc3VwcGxpZXIgICAJQDYyMQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQ0NywgMTQ4NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDQ3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I3RDAwRkMiCi0JCQkJY2xpZW50ICAgICAJQDYzMwotCQkJCXN1cHBsaWVyICAgCUA2MjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzk3LCAxNDg1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzk3LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NjAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDN0I5OTAwMTYiCi0JCQkJY2xpZW50ICAgICAJQDY0MAotCQkJCXN1cHBsaWVyICAgCUA2MjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzc1LCAyMDQ0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc1LCAxMjYyKQotCQkJCWRyYXdTdXBwbGllciAJQDYzMikKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEA2NjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDM2OCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0LCAzMTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1OTQwM0QyIgotCQkJCXdpZHRoICAgICAgCTQwNgotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA2NjIKLQkJCQlsb2NhdGlvbiAgIAkoMzY2LCA1MjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzY2LCA1MjIpCi0JCQkJICAgICgzNjYsIDQzMCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDY2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzQsIDU3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2NAotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDc4MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjYzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgyNzIsIDc4MSkKLQkJCQkgICAgKDI3MiwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDOEYwMDJFIgotCQkJCWNsaWVudCAgICAgCUA2MjIKLQkJCQlzdXBwbGllciAgIAlANjYzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTk0LCA4MzMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU5NCwgNzgxKQotCQkJCWRyYXdTdXBwbGllciAJQDY2NCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERnVuZGFtZW50YWxGYWNldCIgQDY2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg3NTIsIDYyNCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI2LCA1NzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZ1bmRhbWVudGFsRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNjlFODAxRDYiCi0JCQkJd2lkdGggICAgICAJNDcwCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDY2NwotCQkJCWxvY2F0aW9uICAgCSg3NjgsIDc4OSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlANjY2Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg3NjgsIDc4OSkKLQkJCQkgICAgKDc2OCwgNjg3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjY4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc2NTkwMTJDIgotCQkJCWNsaWVudCAgICAgCUA2MjYKLQkJCQlzdXBwbGllciAgIAlANjY2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA1MCwgODYwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDUwLCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY2OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjNDMDIyNCIKLQkJCQljbGllbnQgICAgIAlANjI3Ci0JCQkJc3VwcGxpZXIgICAJQDY2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MjUsIDg2MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUyNSwgNzg5KQotCQkJCWRyYXdTdXBwbGllciAJQDY2NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2NzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzY0RjAxMzEiCi0JCQkJY2xpZW50ICAgICAJQDYyOAotCQkJCXN1cHBsaWVyICAgCUA2NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjM3LCAxMDM2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM3LCA3ODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlANjY3KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NjQyMDA3NCIKLQkJCQljbGllbnQgICAgIAlANjI5Ci0JCQkJc3VwcGxpZXIgICAJQDY2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDEwMzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMjgsIDc4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANjcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ1NiwgMTYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANjcyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTM3LCA0NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMzcsIDEwNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk2MjgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgdmFyaWV0eSA6IFhTRFZhcmlldHkiCi0JCQkJCSI8PDAuLio+PiArIGZpbmFsIDogWFNEU2ltcGxlRmluYWwiKSkKLQkJCQl3aWR0aCAgICAgIAk2NTYKLQkJCQloZWlnaHQgICAgIAkyNTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTI3IiBANjczCi0JCQkJbG9jYXRpb24gICAJKDc3NSwgMTc4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQ1OTcxMDJFQSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI4IiBANjc0Ci0JCQkJCVBhcmVudF9WaWV3IAlANjczCi0JCQkJCWxvY2F0aW9uICAgCSgtMTIwOSwgLTQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NzUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjc0Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTA5LCAyMzUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1OTc1MDExOSIKLQkJCQkJY2xpZW50ICAgICAJQDY3MwotCQkJCQlzdXBwbGllciAgIAlANjYxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3NSwgMTc4KQotCQkJCQkgICAgKDU1MCwgMTc4KQotCQkJCQkgICAgKDU1MCwgMzA2KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3NSwgMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTUwLCAzMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDY3NgotCQkJCQlQYXJlbnRfVmlldyAJQDY3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMDksIC00NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjc3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY3NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4yODMxMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENTk3NTAxMDUiCi0JCQkJCWNsaWVudCAgICAgCUA2NzMKLQkJCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzc1LCAxNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAxNzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2NzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDYxLCAyMTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjUwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODkiIEA2NzkKLQkJCQlsb2NhdGlvbiAgIAkoMzY5LCA3MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwMjAzQTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZhY2V0cyIgQDY4MAotCQkJCQlQYXJlbnRfVmlldyAJQDY3OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODcsIDQ5NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJODcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCQzhBRTA2MDA2NSIKLQkJCQkJY2xpZW50ICAgICAJQDY3OQotCQkJCQlzdXBwbGllciAgIAlANjYzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDM2OSwgNzIpCi0JCQkJCSAgICAoMTAwLCA3MikKLQkJCQkJICAgICgxMDAsIDU2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjksIDcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwLCA1NjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2MCwgNDk4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc5MDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5MCIgQDY4MwotCQkJCQlQYXJlbnRfVmlldyAJQDY3OQotCQkJCQlsb2NhdGlvbiAgIAkoLTE2MTUsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NzYsIDMxKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkM4QUUwNjAwNTEiCi0JCQkJCWNsaWVudCAgICAgCUA2NzkKLQkJCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMzY5LCA3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMjgsIDcyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzEiIEA2ODUKLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgNTA4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4NgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOCwgNDQ5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTYwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjMyIiBANjg3Ci0JCQkJCVBhcmVudF9WaWV3IAlANjg1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDQ2LCAyODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2ODcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDQ2LCAzNDApCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBERiIKLQkJCQkJY2xpZW50ICAgICAJQDY4NQotCQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNDg3LCA1MDgpCi0JCQkJCSAgICAoMTQ4NywgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDI4NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIml0ZW1UeXBlRGVmaW5pdGlvbiIgQDY4OQotCQkJCQlQYXJlbnRfVmlldyAJQDY4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ0NiwgMjg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjg5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQyMywgNTc3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2l0ZW1UeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0yLjIxMTUzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjc2REEwMDBFMCIKLQkJCQkJY2xpZW50ICAgICAJQDY4NQotCQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzgsIDUwOCkKLQkJCQkJICAgICgxNTkwLCA1MDgpCi0JCQkJCSAgICAoMTU5MCwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzgsIDUwOCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1OTAsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY4OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MzksIDQ2OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAzOTg0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5MSIgQDY5MgotCQkJCWxvY2F0aW9uICAgCSgxNzI5LCA1NzQpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QjcwMjA4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTIiIEA2OTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA2OTIKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDM1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MzcsIDM1MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU4IgotCQkJCQljbGllbnQgICAgIAlANjkyCi0JCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE2NzgsIDU3NCkKLQkJCQkJICAgICgxNjc4LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3OCwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWVtYmVyVHlwZURlZmluaXRpb25zIiBANjk1Ci0JCQkJCVBhcmVudF9WaWV3IAlANjkyCi0JCQkJCWxvY2F0aW9uICAgCSgtMjU1LCAzNTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY5NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA2OTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA2NTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWVtYmVyVHlwZURlZmluaXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTMuMjY5MjMxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk4MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM0QkUwMjU5IgotCQkJCQljbGllbnQgICAgIAlANjkyCi0JCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTcyOSwgNTc0KQotCQkJCQkgICAgKDE3ODEsIDU3NCkKLQkJCQkJICAgICgxNzgxLCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTcyOSwgNTc0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc4MSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2OTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANjk1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMCwgNTIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zMTIxMjEKLQkJCQkJICAgIGhlaWdodCAgICAgCTUyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkzIiBANjk4Ci0JCQkJbG9jYXRpb24gICAJKDc0OCwgMjY5KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNjMyMDFEQiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZnVuZGFtZW50YWxGYWNldHMiIEA2OTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA2OTgKLQkJCQkJbG9jYXRpb24gICAJKC0xMjM2LCA0NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3MywgMzEyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Z1bmRhbWVudGFsRmFjZXRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTEuNDA5MDkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM2MzUwMDYzIgotCQkJCQljbGllbnQgICAgIAlANjk4Ci0JCQkJCXN1cHBsaWVyICAgCUA2NjYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzQ4LCAyNjkpCi0JCQkJCSAgICAoNjU5LCAyNjkpCi0JCQkJCSAgICAoNjU5LCA1NjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NTksIDU2MSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzAxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDY5OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyOCwgMzg1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MzgwMjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTY5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE5NCIgQDcwMgotCQkJCQlQYXJlbnRfVmlldyAJQDY5OAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyMzYsIDQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA1MiwgMjI4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZDMzYzNTAwNTkiCi0JCQkJCWNsaWVudCAgICAgCUA2OTgKLQkJCQkJc3VwcGxpZXIgICAJQDY3MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzQ4LCAyNjkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTI4LCAyNjkpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NSIgQDcwNAotCQkJCWxvY2F0aW9uICAgCSgxMTc1LCAzOTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QUIwMjczIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTYiIEA3MDUKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MDQKLQkJCQkJbG9jYXRpb24gICAJKC04MDksIDE3MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcwNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwOTQsIDMxNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMjkxIgotCQkJCQljbGllbnQgICAgIAlANzA0Ci0JCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDExMzUsIDM5NikKLQkJCQkJICAgICgxMTM1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzNSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYmFzZVR5cGVEZWZpbml0aW9uIiBANzA3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzA0Ci0JCQkJCWxvY2F0aW9uICAgCSgtODA5LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDc0LCA0NDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTIuNTMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDM1QjIwMkE1IgotCQkJCQljbGllbnQgICAgIAlANzA0Ci0JCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3NSwgMzk2KQotCQkJCQkgICAgKDEyMTUsIDM5NikKLQkJCQkJICAgICgxMjE1LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3NSwgMzk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxNSwgMjg1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MDkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE3MiwgMzU5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDk2MTU0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5NyIgQDcxMAotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0NDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzIwMTZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxOTgiIEA3MTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTAKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzEyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNjgsIDMyNykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDU1NzUwMjJGIgotCQkJCQljbGllbnQgICAgIAlANzEwCi0JCQkJCXN1cHBsaWVyICAgCUA2NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM2MCwgNDQ2KQotCQkJCQkgICAgKDEzMDksIDQ0NikKLQkJCQkJICAgICgxMzA5LCAyODUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MCwgNDQ2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwOSwgMjg1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWl0aXZlVHlwZURlZmluaXRpb24iIEA3MTMKLQkJCQkJUGFyZW50X1ZpZXcgCUA3MTAKLQkJCQkJbG9jYXRpb24gICAJKC02MjQsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDQsIDUwOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQzMgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltaXRpdmVUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0zLjAwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1NTc1MDI0MyIKLQkJCQkJY2xpZW50ICAgICAJQDcxMAotCQkJCQlzdXBwbGllciAgIAlANjcyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNjAsIDQ0NikKLQkJCQkJICAgICgxNDEyLCA0NDYpCi0JCQkJCSAgICAoMTQxMiwgMjg1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjAsIDQ0NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTIsIDI4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzE1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxMwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzNzMsIDQwOSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYyMTQ3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZUZpbmFsIiBANzE2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4MCwgNTEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzE2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTE3LCA0MjgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZUZpbmFsIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgMzc4KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxNywgNDg4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkzCi0JCQkJICAgIG1heF93aWR0aCAgCTIzOAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBsaXN0IgotCQkJCQkiKyByZXN0cmljdGlvbiIKLQkJCQkJIisgdW5pb24iKSkKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkyOTIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVmFyaWV0eSIgQDcxNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5MTgsIDkyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RWYXJpZXR5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcxNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTkxOCwgNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I4RkY3NzMwMjQ5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcxOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzdCMDM5NiIKLQkJCQljbGllbnQgICAgIAlANjY2Ci0JCQkJc3VwcGxpZXIgICAJQDY2MQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDU5MSwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1OTEsIDUyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzE5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZDODAwMzk0IgotCQkJCWNsaWVudCAgICAgCUA2NjMKLQkJCQlzdXBwbGllciAgIAlANjYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjcyLCA1NjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MiwgNTIyKQotCQkJCWRyYXdTdXBwbGllciAJQDY2MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3MjAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEMjU2ODAyNTkiCi0JCQkJY2xpZW50ICAgICAJQDY2MQotCQkJCXN1cHBsaWVyICAgCUA2NDMKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgzNjYsIDMwNikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY2LCAyMTUpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcyMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2Qzg4MDFCNCIKLQkJCQljbGllbnQgICAgIAlANjIxCi0JCQkJc3VwcGxpZXIgICAJQDY2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NywgODI4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcsIDc4MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA2NjQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzIyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzdCNTkwMjgxIgotCQkJCWNsaWVudCAgICAgCUA2MzgKLQkJCQlzdXBwbGllciAgIAlANjUxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwLCAxODQwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTAsIDE0NDQpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiNS4gQ29tcG9uZW50IEFubm90YXRpb25zIgotCQkJcXVpZCAgICAgICAJIjNCNjlENjhEMDBEMiIKLQkJCXRpdGxlICAgICAgCSI1LiBDb21wb25lbnQgQW5ub3RhdGlvbnMiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBANzIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjU2LCA4MCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoODgsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJd2lkdGggICAgICAJMzU0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBANzI0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjA4LCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MiwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBANzI1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg3MiwgMTUwNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDcyNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYyNiwgMTQ2MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTEwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbnN0cmFpbmluZ0ZhY2V0IiBANzI2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTg4OCwgMzA0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjYzLCAyNjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbnN0cmFpbmluZ0ZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZCMzQwMDkzIgotCQkJCXdpZHRoICAgICAgCTQ2OAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIiBANzI3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAxMzYwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzI3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NCwgMTMxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1ODgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIiBANzI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA3MDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDg2LCA2NjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE5vdGF0aW9uRGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURBQTAyMUMiCi0JCQkJd2lkdGggICAgICAJNDg2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cERlZmluaXRpb24iIEA3MjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDc0LCAxMTQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDlBMDIwNSIKLQkJCQl3aWR0aCAgICAgIAk1MTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEA3MzAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzMjAsIDU0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODYsIDUwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCXdpZHRoICAgICAgCTQ4NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDczMQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMDAsIDgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzMxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDY4LCAzNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFR5cGVEZWZpbml0aW9uIiBANzMyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDczMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1MCwgMTE3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDczMwotCQkJCWxvY2F0aW9uICAgCSgxOTk0LCAxNDEyKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA3MzIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE5OTQsIDE0MTIpCi0JCQkJICAgICgxOTk0LCAxMjcxKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBANzM0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA3MjUKLQkJCQlzdXBwbGllciAgIAlANzMyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA4NCwgMTQ0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA4NCwgMTQxMikKLQkJCQlkcmF3U3VwcGxpZXIgCUA3MzMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFhQYXRoRGVmaW5pdGlvbiIgQDczNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI3MiwgODY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MCwgODIxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDAyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBANzM2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjAwMCwgODApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4OTIsIDM3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQl3aWR0aCAgICAgIAkyMzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBANzM3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzUyLCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3MzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDg0LCAzNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDczOAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4NiwgMTgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb21wbGV4VHlwZURlZmluaXRpb24iIEA3MzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzkyLCAxNzEyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlANzM5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDY3LCAxNjc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNjY5Ci0JCQkJaGVpZ2h0ICAgICAJMTAwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NDAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDczOQotCQkJCXN1cHBsaWVyICAgCUA3MzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTcyLCAxNjYyKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTcyLCAxNDEyKQotCQkJCWRyYXdTdXBwbGllciAJQDczMykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETW9kZWxHcm91cCIgQDc0MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTAyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzgsIDk4MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZXBlYXRhYmxlRmFjZXQiIEA3NDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA1NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODgsIDUxNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVwZWF0YWJsZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQTYwMzFBIgotCQkJCXdpZHRoICAgICAgCTQ1MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RXaWxkY2FyZCIgQDc0MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwOCwgMTUzNikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDc0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzEsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFdpbGRjYXJkIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODM4MzcwMDMxIgotCQkJCXdpZHRoICAgICAgCTI5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA3NDQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjMyLCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDQKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3MiwgNjg1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTcyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBbm5vdGF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQzgwMjMzIgotCQkJCXdpZHRoICAgICAgCTczOAotCQkJCWhlaWdodCAgICAgCTU0MwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEzMyIgQDc0NQotCQkJCWxvY2F0aW9uICAgCSg4NjUsIDEzNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEQwMTgzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzQiIEA3NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NDUKLQkJCQkJbG9jYXRpb24gICAJKC0yNTUsIDU1OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzM0MiCi0JCQkJCWNsaWVudCAgICAgCUA3NDUKLQkJCQkJc3VwcGxpZXIgICAJQDcyNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODY1LCAxMzU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjcxLCAxMzU5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc0NwotCQkJCQlQYXJlbnRfVmlldyAJQDc0NQotCQkJCQlsb2NhdGlvbiAgIAkoLTI1NSwgNTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzQ3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk4LCAxMzIxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS4xMTY2NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwRDAzNDYiCi0JCQkJCWNsaWVudCAgICAgCUA3NDUKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4NjUsIDEzNTkpCi0JCQkJCSAgICAoOTI1LCAxMzU5KQotCQkJCQkgICAgKDkyNSwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NjUsIDEzNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjUsIDEyMTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NDcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5ODcsIDEyNzYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjQyMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTciIEA3NTAKLQkJCQlsb2NhdGlvbiAgIAkoNzEzLCA3MDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMEYwMjEyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTgiIEA3NTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTAKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMDAwQzkiCi0JCQkJCWNsaWVudCAgICAgCUA3NTAKLQkJCQkJc3VwcGxpZXIgICAJQDcyOAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzEzLCA3MDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDcwOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTAKLQkJCQkJbG9jYXRpb24gICAJKC00MDcsIC05MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyNywgNjY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA5NTIzOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEwMDBEMyIKLQkJCQkJY2xpZW50ICAgICAJQDc1MAotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTMsIDcwOSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgNzA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzUyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzk2LCA3NTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU1MzU3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTEiIEA3NTUKLQkJCQlsb2NhdGlvbiAgIAkoNzE5LCAxMTkzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE1MDA4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTUyIiBANzU2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDAxLCAzOTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTYwMDk2IgotCQkJCQljbGllbnQgICAgIAlANzU1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MjkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcxOSwgMTE5MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU3NSwgMTE5MykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NTcKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NTUKLQkJCQkJbG9jYXRpb24gICAJKC00MDEsIDM5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzU4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc1NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcyMCwgMTE0NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wMDY5OTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxNjAwQTAiCi0JCQkJCWNsaWVudCAgICAgCUA3NTUKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzE5LCAxMTkzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODYzLCAxMTkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzU3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODA2LCAxMjQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MDQxNjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTExIiBANzYwCi0JCQkJbG9jYXRpb24gICAJKDc4NSwgNTUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjBBMDA2NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEyIiBANzYxCi0JCQkJCVBhcmVudF9WaWV3IAlANzYwCi0JCQkJCWxvY2F0aW9uICAgCSgtMzM1LCAtMjUwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjBCMDIzRiIKLQkJCQkJY2xpZW50ICAgICAJQDc2MAotCQkJCQlzdXBwbGllciAgIAlANzMwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU2MywgNTUwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc2MgotCQkJCQlQYXJlbnRfVmlldyAJQDc2MAotCQkJCQlsb2NhdGlvbiAgIAkoLTMzNSwgLTI1MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDc3OSwgNTE2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzA3MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIwQjAyNDkiCi0JCQkJCWNsaWVudCAgICAgCUA3NjAKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3ODUsIDU1MCkKLQkJCQkJICAgICg4ODQsIDU1MCkKLQkJCQkJICAgICg4ODQsIDY3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3ODUsIDU1MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg4NCwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzYyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM1LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcyOTczMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODMiIEA3NjUKLQkJCQlsb2NhdGlvbiAgIAkoMTE4NCwgNDA0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFNDU2MDI5MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg0IiBANzY2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzY1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTY1IgotCQkJCQljbGllbnQgICAgIAlANzY1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MzEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDEzNSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBANzY3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzY1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzIsIC00MTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NjcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzI0LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDkKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC42NjU0MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTE0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OUU0NTcwMTZGIgotCQkJCQljbGllbnQgICAgIAlANzY1Ci0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExODQsIDQwNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExODQsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzY5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc2NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTEsIDYxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg0Mzg3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk2NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE5OSIgQDc3MAotCQkJCWxvY2F0aW9uICAgCSgxNzUyLCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMjkxMDE1OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAwIiBANzcxCi0JCQkJCVBhcmVudF9WaWV3IAlANzcwCi0JCQkJCWxvY2F0aW9uICAgCSg1MzYsIDIxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5RTI5MjAxOUYiCi0JCQkJCWNsaWVudCAgICAgCUA3NzAKLQkJCQkJc3VwcGxpZXIgICAJQDczMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzUyLCAxMDM0KQotCQkJCQkgICAgKDE4MTIsIDEwMzQpCi0JCQkJCSAgICAoMTgxMiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgxMiwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA3NzIKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzAKLQkJCQkJbG9jYXRpb24gICAJKDUzNiwgMjE4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3NzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzcyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc0MywgOTk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1OTYwMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlFMjkyMDFBOSIKLQkJCQkJY2xpZW50ICAgICAJQDc3MAotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzUyLCAxMDM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYwMSwgMTAzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc3MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODQsIDEwNjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1MDMzMQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDEiIEA3NzUKLQkJCQlsb2NhdGlvbiAgIAkoMTg5NiwgODgxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCOTAwNkNGMDA4OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAyIiBANzc2Ci0JCQkJCVBhcmVudF9WaWV3IAlANzc1Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIDQwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE1RCIKLQkJCQkJY2xpZW50ICAgICAJQDc3NQotCQkJCQlzdXBwbGllciAgIAlANzMyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE4OTYsIDg4MSkKLQkJCQkJICAgICgxOTU2LCA4ODEpCi0JCQkJCSAgICAoMTk1NiwgMTE2MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTU2LCAxMTYxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGVyaXZhdGlvbkFubm90YXRpb24iIEA3NzcKLQkJCQkJUGFyZW50X1ZpZXcgCUA3NzUKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgNDApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODIxLCA4NDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZGVyaXZhdGlvbkFubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI1NDIzNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNkQxMDE2NyIKLQkJCQkJY2xpZW50ICAgICAJQDc3NQotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODk2LCA4ODEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAxLCA4ODEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc3OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3NzcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjg5LCA5MTQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNTA4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMDMiIEA3ODAKLQkJCQlsb2NhdGlvbiAgIAkoMjA0MCwgNzE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjMzMDI2NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjA0IiBANzgxCi0JCQkJCVBhcmVudF9WaWV3IAlANzgwCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5REIzNDAyODQiCi0JCQkJCWNsaWVudCAgICAgCUA3ODAKLQkJCQkJc3VwcGxpZXIgICAJQDczMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMDQwLCA3MTUpCi0JCQkJCSAgICAoMjEwMCwgNzE1KQotCQkJCQkgICAgKDIxMDAsIDExNjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA0MCwgNzE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEwMCwgMTE2MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBANzgyCi0JCQkJCVBhcmVudF9WaWV3IAlANzgwCi0JCQkJCWxvY2F0aW9uICAgCSg5MjAsIC04NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTgsIDY4MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjQzMTkyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMzQwMjhFIgotCQkJCQljbGllbnQgICAgIAlANzgwCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwNDAsIDcxNSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDEsIDcxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2ODUsIDc0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODA5MzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyMSIgQDc4NQotCQkJCWxvY2F0aW9uICAgCSg2NjgsIDg2NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIzOTEzNDAwNEYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMiIgQDc4NgotCQkJCQlQYXJlbnRfVmlldyAJQDc4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTYxMiwgMzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMzkxMzYwMENBIgotCQkJCQljbGllbnQgICAgIAlANzg1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MzUKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2OCwgODY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDczLCA4NjUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzg3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzg1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNjEyLCAzMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzg4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc4NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxNCwgODI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIzNDE0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjM5MTM2MDBENCIKLQkJCQkJY2xpZW50ICAgICAJQDc4NQotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDg2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2MywgODY1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3ODkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAxLCA5MDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY4MjA1MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMjUiIEA3OTAKLQkJCQlsb2NhdGlvbiAgIAkoMTQ3MiwgMTY3KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkQyM0I5MDFDRCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTI2IiBANzkxCi0JCQkJCVBhcmVudF9WaWV3IAlANzkwCi0JCQkJCWxvY2F0aW9uICAgCSgyNTYsIC02NDkpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUM0IgotCQkJCQljbGllbnQgICAgIAlANzkwCi0JCQkJCXN1cHBsaWVyICAgCUA3MzYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ3MiwgMTY3KQotCQkJCQkgICAgKDE0NzIsIDcyKQotCQkJCQkgICAgKDE4ODMsIDcyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4ODMsIDcyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDc5MgotCQkJCQlQYXJlbnRfVmlldyAJQDc5MAotCQkJCQlsb2NhdGlvbiAgIAkoMjU2LCAtNjQ5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzkyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYwNCwgMTI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4wNzYzMDUKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2RDIzQkEwMUNFIgotCQkJCQljbGllbnQgICAgIAlANzkwCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDE2NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDY3MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDc5MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTksIDYxOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODkzNTc0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc1IiBANzk1Ci0JCQkJbG9jYXRpb24gICAJKDkyNywgMzUwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjA2MDI5MSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzYiIEA3OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA3OTUKLQkJCQkJbG9jYXRpb24gICAJKC0xOTMsIC00NTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMDcwMTcxIgotCQkJCQljbGllbnQgICAgIAlANzk1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MzcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjI5LCAzNTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBANzk3Ci0JCQkJCVBhcmVudF9WaWV3IAlANzk1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTkzLCAtNDUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlANzk3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODc4LCAzMTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjgxNjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjA3MDE3MiIKLQkJCQkJY2xpZW50ICAgICAJQDc5NQotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkyNywgMzUwKQotCQkJCQkgICAgKDk4NywgMzUwKQotCQkJCQkgICAgKDk4NywgNjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkyNywgMzUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTg3LCA2NzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc5OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA3OTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDM3LCA2MTIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg0MzM0MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NyIgQDgwMAotCQkJCWxvY2F0aW9uICAgCSgxMDI3LCAyMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREMwMkY1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2OCIgQDgwMQotCQkJCQlQYXJlbnRfVmlldyAJQDgwMAotCQkJCQlsb2NhdGlvbiAgIAkoLTkzLCAtNTc4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQUREMDIzOCIKLQkJCQkJY2xpZW50ICAgICAJQDgwMAotCQkJCQlzdXBwbGllciAgIAlANzM4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI3LCAyMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NjMsIDIyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDAKLQkJCQkJbG9jYXRpb24gICAJKC05MywgLTU3OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODAzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDMsIDE4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTIxNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbm5vdGF0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNDA2MjUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURBREQwMjQyIgotCQkJCQljbGllbnQgICAgIAlAODAwCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTAyNywgMjIyKQotCQkJCQkgICAgKDEwODcsIDIyMikKLQkJCQkJICAgICgxMDg3LCA2NzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyNywgMjIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NywgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzNywgNjEzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTAwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODgyNTgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkxIiBAODA1Ci0JCQkJbG9jYXRpb24gICAJKDE0OTQsIDE0MzgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2ODgwMUMyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5MiIgQDgwNgotCQkJCQlQYXJlbnRfVmlldyAJQDgwNQotCQkJCQlsb2NhdGlvbiAgIAkoMjE0LCA1OTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I5MDA2OEEwMTExIgotCQkJCQljbGllbnQgICAgIAlAODA1Ci0JCQkJCXN1cHBsaWVyICAgCUA3MzkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0OTQsIDE0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDk0LCAxNjYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudEFubm90YXRpb24iIEA4MDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MDUKLQkJCQkJbG9jYXRpb24gICAJKDIxNCwgNTkwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NiwgMTM1NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM2MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50QW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3NzEzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCOTAwNjhBMDExQiIKLQkJCQkJY2xpZW50ICAgICAJQDgwNQotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk0LCAxNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ5NCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODA5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgwNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0NDMsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcxMzAwNAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNDUiIEA4MTAKLQkJCQlsb2NhdGlvbiAgIAkoNjM3LCAxMDIyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlEQjE3MDJDOCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQ2IiBAODExCi0JCQkJCVBhcmVudF9WaWV3IAlAODEwCi0JCQkJCWxvY2F0aW9uICAgCSgtNDgzLCAyMjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTgwM0UyIgotCQkJCQljbGllbnQgICAgIAlAODEwCi0JCQkJCXN1cHBsaWVyICAgCUA3NDEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDYzNywgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxMSwgMTAyMikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb24iIEA4MTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MTAKLQkJCQkJbG9jYXRpb24gICAJKC00ODMsIDIyMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODEzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgxMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDcxMCwgOTc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjMyODg4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjE5MDAwNCIKLQkJCQkJY2xpZW50ICAgICAJQDgxMAotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MzcsIDEwMjIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjMsIDEwMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDEwNjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczMDA4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2NSIgQDgxNQotCQkJCWxvY2F0aW9uICAgCSgxNTgxLCA2MDcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQTcwMTAyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2NiIgQDgxNgotCQkJCQlQYXJlbnRfVmlldyAJQDgxNQotCQkJCQlsb2NhdGlvbiAgIAkoMzAxLCAtMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUE5MDE5MSIKLQkJCQkJY2xpZW50ICAgICAJQDgxNQotCQkJCQlzdXBwbGllciAgIAlANzQyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1ODEsIDYwNykKLQkJCQkJICAgICgxNTgxLCA1NDcpCi0JCQkJCSAgICAoMTY3OSwgNTQ3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODEsIDYwNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NzksIDU0NykpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODE3Ci0JCQkJCVBhcmVudF9WaWV3IAlAODE1Ci0JCQkJCWxvY2F0aW9uICAgCSgzMDEsIC0yMjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MTcKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjY5LCA0NjIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMi4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTg4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVBOTAxOTIiCi0JCQkJCWNsaWVudCAgICAgCUA4MTUKLQkJCQkJc3VwcGxpZXIgICAJQDc0NAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU4MSwgNjA3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU4MSwgNjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODE3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUzOSwgNjIwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xOTY5NzAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA1IiBAODIwCi0JCQkJbG9jYXRpb24gICAJKDg0OSwgMTQ5NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5REIxMTAyNkYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwNiIgQDgyMQotCQkJCQlQYXJlbnRfVmlldyAJQDgyMAotCQkJCQlsb2NhdGlvbiAgIAkoLTI3MSwgNjk2KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjlEQjEyMDFGOSIKLQkJCQkJY2xpZW50ICAgICAJQDgyMAotCQkJCQlzdXBwbGllciAgIAlANzQzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNTQsIDE0OTYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODIyCi0JCQkJCVBhcmVudF9WaWV3IAlAODIwCi0JCQkJCWxvY2F0aW9uICAgCSgtMjcxLCA2OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MjIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5NDIsIDE0NjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTg4MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OURCMTIwMjAzIgotCQkJCQljbGllbnQgICAgIAlAODIwCi0JCQkJCXN1cHBsaWVyICAgCUA3NDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoODQ5LCAxNDk2KQotCQkJCQkgICAgKDEwNjIsIDE0OTYpCi0JCQkJCSAgICAoMTA2MiwgMTIxNSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4NDksIDE0OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDYyLCAxMjE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4MjQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODIyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTExNSwgMTI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODcyNjkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIwNyIgQDgyNQotCQkJCWxvY2F0aW9uICAgCSg5NTIsIDE1NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0M2MjZFQjMwMDA1IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMDgiIEA4MjYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjUKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzYyNkVCNDAzMjciCi0JCQkJCWNsaWVudCAgICAgCUA4MjUKLQkJCQkJc3VwcGxpZXIgICAJQDc0MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU0LCAxNTY1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbnMiIEA4MjcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4MjUKLQkJCQkJbG9jYXRpb24gICAJKC0zMjgsIDczMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNzUsIDE1MzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5ub3RhdGlvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjIwNDk1OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDNjI2RUI0MDMzMiIKLQkJCQkJY2xpZW50ICAgICAJQDgyNQotCQkJCQlzdXBwbGllciAgIAlANzQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk1MiwgMTU2NSkKLQkJCQkJICAgICgxMjAwLCAxNTY1KQotCQkJCQkgICAgKDEyMDAsIDEyMTUpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTUyLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwMCwgMTIxNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDgyNwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEyNTQsIDEyNzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgzMAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM2QzgwMDM5NCIKLQkJCQljbGllbnQgICAgIAlANzI2Ci0JCQkJc3VwcGxpZXIgICAJQDczNgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5ODQsIDI0OSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk4NCwgMTM1KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4MzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkM4RjAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDc0MgotCQkJCXN1cHBsaWVyICAgCUA3MjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTk3LCA1MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTcsIDM1OSkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJcXVpZCAgICAgICAJIjNCNkFENzREMDNDNCIKLQkJCXRpdGxlICAgICAgCSI2LiBDb25jcmV0ZSBDb21wb25lbnRzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDgzMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjYsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ2RTkwMDI5IgotCQkJCXdpZHRoICAgICAgCTM0MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwQ29udGVudCIgQDgzMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDgzMiwgNDE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NjgsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCXdpZHRoICAgICAgCTU0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RSZWRlZmluZUNvbnRlbnQiIEA4MzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMjAwLCA2NzIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDk5MSwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbnRlbnQiIEA4MzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMzYwLCA0MTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDExNTYsIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODM2Ci0JCQkJbG9jYXRpb24gICAJKDEzNjAsIDU2MSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODM1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMzYwLCA1NjEpCi0JCQkJICAgICgxMzYwLCA0NzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW5jbHVkZSIgQDgzNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE2MzIsIDEyMDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTIsIDExNTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREluY2x1ZGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM3RDAyNTAiCi0JCQkJd2lkdGggICAgICAJMjU4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNESW1wb3J0IiBAODM4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCA5NDQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4MzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyOTQsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESW1wb3J0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOTMwMTdGIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAODM5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkzNiwgMTIwMCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDgzOQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgwNSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEM5QjAyQUQiCi0JCQkJd2lkdGggICAgICAJMjgwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQW5ub3RhdGlvbiIgQDg0MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNzUsIDExNTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODUxCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJODY5Ci0JCQkJaGVpZ2h0ICAgICAJMTE5Ci0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQzIiBAODQxCi0JCQkJbG9jYXRpb24gICAJKDEzNjgsIDEyMDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDQzUwMDdFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDQiIEA4NDIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDEKLQkJCQkJbG9jYXRpb24gICAJKDExNjAsIDQwNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENDNjAwNkIiCi0JCQkJCWNsaWVudCAgICAgCUA4NDEKLQkJCQkJc3VwcGxpZXIgICAJQDgzNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2OCwgMTIwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDMsIDEyMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm5vdGF0aW9uIiBAODQzCi0JCQkJCVBhcmVudF9WaWV3IAlAODQxCi0JCQkJCWxvY2F0aW9uICAgCSgxMTYwLCA0MDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzQ3LCAxMTU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE1NDQxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0M2MDA2QyIKLQkJCQkJY2xpZW50ICAgICAJQDg0MQotCQkJCQlzdXBwbGllciAgIAlAODQwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzY4LCAxMjA2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzNCwgMTIwNikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg0MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMDAsIDEyNTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMDcKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTQ3MDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQxIiBAODQ2Ci0JCQkJbG9jYXRpb24gICAJKDExNjgsIDEwMjIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURDRDgwMkZDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNDIiIEA4NDcKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NDYKLQkJCQkJbG9jYXRpb24gICAJKDk2MCwgMjIyKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFEQ0Q5MDE4QiIKLQkJCQkJY2xpZW50ICAgICAJQDg0NgotCQkJCQlzdXBwbGllciAgIAlAODM4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNjgsIDEwMjIpCi0JCQkJCSAgICAoMTE2OCwgOTYyKQotCQkJCQkgICAgKDEyODUsIDk2MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTY4LCAxMDIyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NSwgOTYyKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5ub3RhdGlvbiIgQDg0OAotCQkJCQlQYXJlbnRfVmlldyAJQDg0NgotCQkJCQlsb2NhdGlvbiAgIAkoOTYwLCAyMjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg0OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMjkwLCAxMDc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjE2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ0NTM3OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRENEOTAxOEMiCi0JCQkJCWNsaWVudCAgICAgCUA4NDYKLQkJCQkJc3VwcGxpZXIgICAJQDg0MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE2OCwgMTAyMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNjgsIDExNDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NDgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTI3LCAxMDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzY5NzUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTYzIiBAODUxCi0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEzNTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QURFNDIwMDlBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjQiIEA4NTIKLQkJCQkJUGFyZW50X1ZpZXcgCUA4NTEKLQkJCQkJbG9jYXRpb24gICAJKDEzNTUsIDU1MykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAyRkUiCi0JCQkJCWNsaWVudCAgICAgCUA4NTEKLQkJCQkJc3VwcGxpZXIgICAJQDgzOQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDE5NDAsIDEzNTMpCi0JCQkJCSAgICAoMTk0MCwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk0MCwgMTI1NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFubm90YXRpb25zIiBAODUzCi0JCQkJCVBhcmVudF9WaWV3IAlAODUxCi0JCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzE3LCAxMzIyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fubm90YXRpb25zIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTY4MDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBREU0MzAzMDgiCi0JCQkJCWNsaWVudCAgICAgCUA4NTEKLQkJCQkJc3VwcGxpZXIgICAJQDg0MAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTYzLCAxMzUzKQotCQkJCQkgICAgKDExODEsIDEzNTMpCi0JCQkJCSAgICAoMTE4MSwgMTI1OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTYzLCAxMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE4MSwgMTI1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODU1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDExMzAsIDEzMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2MTM0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NTYKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA1NjEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDgzMgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjg4LCA1NjEpCi0JCQkJICAgICgyODgsIDQ3MSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDg1NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY4OCwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODU3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NjAsIDYyOSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDc0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlQ29udGVudCIgQDg1OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NTYsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg1OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1OCwgMzczKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RQYXJ0aWNsZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDIyMzAwQzYiCi0JCQkJd2lkdGggICAgICAJNDE0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAODU5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNzIwLCA5NjApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NTkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1MCwgOTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluYWJsZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQThCMDIwQiIKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NvcGUiIEA4NjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEwLCA2MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjb3BlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1NDAwMEYyIgotCQkJCXdpZHRoICAgICAgCTI0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAODYwCi0JCQkJc3VwcGxpZXIgICAJQDgzMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyMSwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjEsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NTYpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODYyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA4NTcKLQkJCQlzdXBwbGllciAgIAlAODMyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTg5LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDU4OSwgNTYxKQotCQkJCWRyYXdTdXBwbGllciAJQDg1NikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NjMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJY2xpZW50ICAgICAJQDgzNAotCQkJCXN1cHBsaWVyICAgCUA4MzUKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDE2LCA2MTcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTYsIDU2MSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4MzYpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEA4NjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxODI0LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTAsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk0ODYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODY1Ci0JCQkJbG9jYXRpb24gICAJKDE4MjQsIDEwODkpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDg2NAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTgyNCwgMTA4OSkKLQkJCQkgICAgKDE4MjQsIDk5OSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOERDMDM4MSIKLQkJCQljbGllbnQgICAgIAlAODM3Ci0JCQkJc3VwcGxpZXIgICAJQDg2NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NjYsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE2NjYsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg2NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCIKLQkJCQljbGllbnQgICAgIAlAODM5Ci0JCQkJc3VwcGxpZXIgICAJQDg2NAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MzQsIDExNDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5MzQsIDEwODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODY1KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA4NjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDY3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDg2OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTYzMCwgNjI5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAODY5Ci0JCQkJbG9jYXRpb24gICAJKDE3NjIsIDgxOSkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAODY4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNzYyLCA4MTkpCi0JCQkJICAgICgxNzYyLCA3MjcpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhEOTAwM0UiCi0JCQkJY2xpZW50ICAgICAJQDgzOAotCQkJCXN1cHBsaWVyICAgCUA4NjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDE2LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MTYsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODcxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUzMjEwMkFGIgotCQkJCWNsaWVudCAgICAgCUA4NjgKLQkJCQlzdXBwbGllciAgIAlAODM1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1NiwgNjE3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU2LCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODM2KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDg3MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxMTIwLCAxNDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDg3NSwgMTAxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb25jcmV0ZUNvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEN0I0MDA2NSIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA4NzMKLQkJCQlsb2NhdGlvbiAgIAkoMTEyMCwgMjg5KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDExMjAsIDI4OSkKLQkJCQkgICAgKDExMjAsIDE5OSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDUiIEA4NzQKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NSwgMjE1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQjA4MDNDNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGFpbmVyIiBAODc1Ci0JCQkJCVBhcmVudF9WaWV3IAlAODc0Ci0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MDQsIDIxMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250YWluZXIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAzMzExMwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTE5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0UiCi0JCQkJCWNsaWVudCAgICAgCUA4NzQKLQkJCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMTc2KQotCQkJCQkgICAgKDEzNzQsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg1LCAyMTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzc0LCAxNzYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4NzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM1LCAyMjYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk2OQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwMjY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTA2IiBAODc4Ci0JCQkJCVBhcmVudF9WaWV3IAlAODc0Ci0JCQkJCWxvY2F0aW9uICAgCSg5ODksIDEwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUIwQzAxQ0YiCi0JCQkJCWNsaWVudCAgICAgCUA4NzQKLQkJCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDg1LCAyMTUpCi0JCQkJCSAgICAoMTQ4NSwgMjU0KQotCQkJCQkgICAgKDEzNDUsIDI1NCkKLQkJCQkJICAgICgxMzQ1LCAxOTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ4NSwgMjE1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM0NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDciIEA4NzkKLQkJCQlsb2NhdGlvbiAgIAkoNzczLCAyMTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3NTFCNDgwMjYxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290Q29udGFpbmVyIiBAODgwCi0JCQkJCVBhcmVudF9WaWV3IAlAODc5Ci0JCQkJCWxvY2F0aW9uICAgCSg1MywgMTA0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjE0LCAyMTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdENvbnRhaW5lciIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyNTAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTYwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODUiCi0JCQkJCWNsaWVudCAgICAgCUA4NzkKLQkJCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDE3NikKLQkJCQkJICAgICg4NjYsIDE3NikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4ODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4zMDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTI3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEwOCIgQDg4MwotCQkJCQlQYXJlbnRfVmlldyAJQDg3OQotCQkJCQlsb2NhdGlvbiAgIAkoNTMsIDEwNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUI0QzAyODYiCi0JCQkJCWNsaWVudCAgICAgCUA4NzkKLQkJCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg3NzMsIDIxNikKLQkJCQkJICAgICg3NzMsIDI1NykKLQkJCQkJICAgICg4OTUsIDI1NykKLQkJCQkJICAgICg4OTUsIDE5OSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NzMsIDIxNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg5NSwgMTk5KSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4NAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQljbGllbnQgICAgIAlAODM1Ci0JCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjcsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2NywgMjg5KQotCQkJCWRyYXdTdXBwbGllciAJQDg3MykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4ODUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjcyRDhFMjAwRUEiCi0JCQkJY2xpZW50ICAgICAJQDgzMwotCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NTIsIDM2MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzUyLCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODczKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4NgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCQTBDRUE5MDNEMiIKLQkJCQljbGllbnQgICAgIAlAODMyCi0JCQkJc3VwcGxpZXIgICAJQDg3MgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTksIDI4OSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NzMpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDg4NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTkyLCAxMjAwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAODg3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MSwgMTE1NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg4OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAODg3Ci0JCQkJc3VwcGxpZXIgICAJQDg2MAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxNiwgMTE0NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2LCA3MjcpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTkiIEA4ODkKLQkJCQlsb2NhdGlvbiAgIAkoMTM4MiwgMTQyNSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREQwQzAzREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMCIgQDg5MAotCQkJCQlQYXJlbnRfVmlldyAJQDg4OQotCQkJCQlsb2NhdGlvbiAgIAkoMTE5MCwgMjI1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNCIKLQkJCQkJY2xpZW50ICAgICAJQDg4OQotCQkJCQlzdXBwbGllciAgIAlAODY0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjE0NywgMTQyNSkKLQkJCQkJICAgICgyMTQ3LCA5NDMpCi0JCQkJCSAgICAoMjA2NywgOTQzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzODIsIDE0MjUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDY3LCA5NDMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEA4OTEKLQkJCQkJUGFyZW50X1ZpZXcgCUA4ODkKLQkJCQkJbG9jYXRpb24gICAJKDExOTAsIDIyNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODkyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ0NSwgMTM4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM5NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpbmNvcnBvcmF0ZWRTY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwNjU0NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFERDEwMDMwNSIKLQkJCQkJY2xpZW50ICAgICAJQDg4OQotCQkJCQlzdXBwbGllciAgIAlAODg3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzODIsIDE0MjUpCi0JCQkJCSAgICAoMjI1LCAxNDI1KQotCQkJCQkgICAgKDIyNSwgMTI1NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCAxNDI1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjI1LCAxMjU1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA4OTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAODkxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgzLCAxMzkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTY5MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE3IiBAODk0Ci0JCQkJbG9jYXRpb24gICAJKDE1MDUsIDE1MDMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQzcwMEVDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTgiIEA4OTUKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTQKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDRTAwNDIiCi0JCQkJCWNsaWVudCAgICAgCUA4OTQKLQkJCQkJc3VwcGxpZXIgICAJQDg2OAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTA1LCAxNTAzKQotCQkJCQkgICAgKDIxODgsIDE1MDMpCi0JCQkJCSAgICAoMjE4OCwgNjc1KQotCQkJCQkgICAgKDIwNTksIDY3NSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTA1LCAxNTAzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1OSwgNjc1KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicmVzb2x2ZWRTY2hlbWEiIEA4OTYKLQkJCQkJUGFyZW50X1ZpZXcgCUA4OTQKLQkJCQkJbG9jYXRpb24gICAJKDEzMTMsIDMwMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDg5NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDMwMywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzMzMzMzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzMgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCQljbGllbnQgICAgIAlAODk0Ci0JCQkJCXN1cHBsaWVyICAgCUA4ODcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUwNSwgMTUwMykKLQkJCQkJICAgICgxMTMsIDE1MDMpCi0JCQkJCSAgICAoMTEzLCAxMjU1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDUsIDE1MDMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTMsIDEyNTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA4OTYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3MywgMTQ3MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTcyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODY3NjgzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEwOSIgQDg5OQotCQkJCWxvY2F0aW9uICAgCSg2NiwgMjQ0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNzUxQzMxMDM1NiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTEwIiBAOTAwCi0JCQkJCVBhcmVudF9WaWV3IAlAODk5Ci0JCQkJCWxvY2F0aW9uICAgCSgtOTQsIC00NDQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I3NTFDMzMwMzMxIgotCQkJCQljbGllbnQgICAgIAlAODk5Ci0JCQkJCXN1cHBsaWVyICAgCUA4NzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNjYsIDI0NCkKLQkJCQkJICAgICg2NiwgMTQ0KQotCQkJCQkgICAgKDg2NiwgMTQ0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2LCAyNDQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NjYsIDE0NCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNjaGVtYSIgQDkwMQotCQkJCQlQYXJlbnRfVmlldyAJQDg5OQotCQkJCQlsb2NhdGlvbiAgIAkoLTk0LCAtNDQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY1LCA5MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzY2hlbWEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4xNjgxMTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTk5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjc1MUMzMzAzM0IiCi0JCQkJCWNsaWVudCAgICAgCUA4OTkKLQkJCQkJc3VwcGxpZXIgICAJQDg4NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjYsIDI0NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2LCAxMTQ1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MDMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTAxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM2LCAxODQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxMTMKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDY2NTkzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk3MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTA0Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3ODBCRDkwMDU5IgotCQkJCWNsaWVudCAgICAgCUA4NTgKLQkJCQlzdXBwbGllciAgIAlAODcyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1OSwgMzYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzU5LCAyODkpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODczKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAODQwCi0JCQkJc3VwcGxpZXIgICAJQDgzMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDQwMCwgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDAwLCA1NjEpCi0JCQkJZHJhd1N1cHBsaWVyIAlAODU2KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MDYKLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgODM3KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA4MzQKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEwMTIsIDgzNykKLQkJCQkgICAgKDEwMTIsIDcyNykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkwNwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDkwOAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkwNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTA3MSwgODcxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODg4MTU4Ci0JCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0RTIwMzY2IgotCQkJCWNsaWVudCAgICAgCUA4NDAKLQkJCQlzdXBwbGllciAgIAlAODM0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAzNywgMTE0MSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAzNywgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDkwNikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MDkKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEA5MTAKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDg5MCwgODY1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI2MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTgxNjMzCi0JCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkQ0QkEwMjNDIgotCQkJCWNsaWVudCAgICAgCUA4NTkKLQkJCQlzdXBwbGllciAgIAlAODM0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTI1LCA5MDUpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkyNSwgODM3KQotCQkJCWRyYXdTdXBwbGllciAJQDkwNikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5MTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDg2NAotCQkJCXN1cHBsaWVyICAgCUA4NjgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI4LCA4ODkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjgsIDgxOSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA4NjkpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJcXVpZCAgICAgICAJIjNCOUY4Rjc2MDJDNyIKLQkJCXRpdGxlICAgICAgCSI3LiBDb25jcmV0ZSBBdHRyaWJ1dGVzIgotCQkJem9vbSAgICAgICAJMTAwCi0JCQltYXhfaGVpZ2h0IAkyODM1MAotCQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJCW9yaWdpbl94ICAgCTAKLQkJCW9yaWdpbl95ICAgCTAKLQkJCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEA5MTIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMTQ0LCAxNDQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxMzU5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxOTM4LCAxNDE5KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MTIKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZm9ybSA6IFhTREZvcm0iCi0JCQkJCSIrIGxleGljYWxWYWx1ZSA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTQzMAotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGb3JtIiBAOTEzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NjAsIDE0MjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTMKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzOTgsIDEzNjUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZvcm0iKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTEzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzk4LCAxMzE1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOUY5MTNCMDFFQiIKLQkJCQl3aWR0aCAgICAgIAkzNDIKLQkJCQloZWlnaHQgICAgIAkyNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEA5MTQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNjgsIDk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgMzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjU3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MCwgOTcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlpdGFsaWNzICAgIAlUUlVFKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ4MgotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBlbGVtZW50IDogRE9NRWxlbWVudCIpKQotCQkJCXdpZHRoICAgICAgCTY3NQotCQkJCWhlaWdodCAgICAgCTE0MwotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBvbmVudCIgQDkxNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4NDgsIDM4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjg3LCAzMzMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkU5MDAyOSIKLQkJCQl3aWR0aCAgICAgIAkzNDAKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROYW1lZENvbXBvbmVudCIgQDkxNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTA0LCA5NDQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDE2NzgsIDg5MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETmFtZWRDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDZEMzAzQTQiCi0JCQkJd2lkdGggICAgICAJNDcwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5hYmxlQ29tcG9uZW50IiBAOTE3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYwMCwgMTQwOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkxNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMTM1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTYyCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjb3BlIiBAOTE4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDg2NCwgNjI0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTE4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NDUsIDU3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NvcGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjU0MDAwRjIiCi0JCQkJd2lkdGggICAgICAJMjU2Ci0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDkxOQotCQkJCWxvY2F0aW9uICAgCSg4NTAsIDUzNykKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTE1Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg4NTAsIDUzNykKLQkJCQkgICAgKDg1MCwgNDQ3KSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OkRPTUVsZW1lbnQiIEA5MjAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTI0OCwgMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIwCi0JCQkJICAgIGxvY2F0aW9uICAgCSg4NzMsIDkwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1MQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01FbGVtZW50IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODczLCA0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NTEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0I4MTg5NzkwMjAwIgotCQkJCXdpZHRoICAgICAgCTc2OQotCQkJCWhlaWdodCAgICAgCTIwMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFEaXJlY3RpdmUiIEA5MjEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCA2NDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCA1ODQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQl3aWR0aCAgICAgIAk1MTIKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAOTIyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTIyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMzMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDQjgwMEJBIgotCQkJCXdpZHRoICAgICAgCTQyMgotCQkJCWhlaWdodCAgICAgCTEyNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5MjMKLQkJCQlsb2NhdGlvbiAgIAkoMzY4LCAyNjMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDkxNAotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMzY4LCAyNjMpCi0JCQkJICAgICgzNjgsIDE2NykpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIgQDkyNAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDk5MiwgMTQ1NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzIzLCAxMzQ3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaXNhbGxvd2VkU3Vic3RpdHV0aW9ucyIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTI5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQjk3QzVBNDAzREYiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjQKLQkJCQkgICAgbG9jYXRpb24gICAJKDcyMywgMTQwNykKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJNAotCQkJCSAgICBtYXhfd2lkdGggIAkyNjQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgc3Vic3RpdHV0aW9uIgotCQkJCQkiKyBleHRlbnNpb24iCi0JCQkJCSIrIHJlc3RyaWN0aW9uIgotCQkJCQkiKyBhbGwiKSkKLQkJCQl3aWR0aCAgICAgIAk1NTYKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiIEA5MjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4ODAsIDE3OTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDYxNCwgMTcwOCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiKQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE2NTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTMyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0M1QkUwMjcyIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTI1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg2MTQsIDE3NjgpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTMKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM0Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGV4dGVuc2lvbiIKLQkJCQkJIisgcmVzdHJpY3Rpb24iCi0JCQkJCSIrIGFsbCIpKQotCQkJCXdpZHRoICAgICAgCTU1MAotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIgQDkyNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDkxMiwgMjA5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMDQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkyNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMyLCAyMTAwKQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2NAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiPDwwLi4qPj4gKyBsZXhpY2FsRmluYWwgOiBYU0RTaW1wbGVGaW5hbCIpKQotCQkJCXdpZHRoICAgICAgCTc3OAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTaW1wbGVGaW5hbCIgQDkyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDE5ODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODc1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDQ1LCAxODI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTMyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAk4NDMyMTI3Ci0JCQkJcXVpZHUgICAgICAJIjNCOTdDMjVEMDI5NSIKLQkJCQl3aWR0aCAgICAgIAkzNDQKLQkJCQloZWlnaHQgICAgIAkzNDIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleEZpbmFsIiBAOTI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NDQsIDIwMTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE5MzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhGaW5hbCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjgKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNjIsIDE4ODIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzY0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0I5N0MyQ0EwMUNCIgotCQkJCXdpZHRoICAgICAgCTM4MgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVVc2UiIEA5MjkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzNTIsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMjc5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTYyMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVVc2UiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzU0NjAxQTgiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MjkKLQkJCQkgICAgbG9jYXRpb24gICAJKDQxLCAxMzM5KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTYzMAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyB1c2UgOiBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeSIKLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNjQwCi0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IiBAOTMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI4OCwgMTYzMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE1NDgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5IikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEsIDE0OTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8ZW51bWVyYXRpb24+PiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTg0MzIxMjcKLQkJCQlxdWlkdSAgICAgIAkiM0JBN0IwRTgwMUE4IgotCQkJCXdpZHRoICAgICAgCTUxMgotCQkJCWhlaWdodCAgICAgCTI5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUZXJtIiBAOTMxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2MDgsIDkyOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQ5OCwgODgxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUZXJtIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNDNUUwMTc0IgotCQkJCXdpZHRoICAgICAgCTIzOAotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDkzMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIyNDAsIDE3MTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTcsIDE2MzEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJOTY2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc1NywgMTY5MSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk5NzMKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEUHJvaGliaXRlZFN1YnN0aXR1dGlvbnMiCi0JCQkJCSI8PDAuLio+PiArIGJsb2NrIDogWFNERGlzYWxsb3dlZFN1YnN0aXR1dGlvbnMiKSkKLQkJCQl3aWR0aCAgICAgIAk5ODQKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2lsZGNhcmQiIEA5MzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCAxMTUyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTMzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxODI4LCAxMDk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTg4OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaWxkY2FyZCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzODM3MDAzMSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTE1NikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4ODgKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbE5hbWVzcGFjZUNvbnN0cmFpbnQgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk5MDYKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAOTM0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDExMjAsIDEwMDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDYyMiwgNzc3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTk5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCQkJd2lkdGggICAgICAJMTAxNAotCQkJCWhlaWdodCAgICAgCTQ4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RJbXBvcnQiIEA5MzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCA5NjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDM3LCA5MDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREltcG9ydCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4QzkzMDE3RiIKLQkJCQl3aWR0aCAgICAgIAk0MjQKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RGYWNldCIgQDkzNgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzNDQsIDY1NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNTk0MDNEMiIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTEzOCwgNjYwKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTQKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgbGV4aWNhbFZhbHVlIDogU3RyaW5nIikpCi0JCQkJd2lkdGggICAgICAJNDMwCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDkzNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5MzcKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MTAsIDE5NDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJODYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzNwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQxMCwgMjAwMikKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMwotCQkJCSAgICBtYXhfd2lkdGggIAk4NzAKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIjw8MC4uKj4+ICsgbGV4aWNhbEZpbmFsIDogWFNEQ29tcGxleEZpbmFsIgotCQkJCQkiPDwwLi4qPj4gKyBibG9jayA6IFhTRFByb2hpYml0ZWRTdWJzdGl0dXRpb25zIgotCQkJCQkiKyBtaXhlZCA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk4NzgKLQkJCQloZWlnaHQgICAgIAkyMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEA5MzgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4OCwgMTY5NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDkzOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMwNCwgMTY0NCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCQkJd2lkdGggICAgICAJMzg2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTM5Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUA5MzgKLQkJCQlzdXBwbGllciAgIAlAOTE3Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwNiwgMTYzMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwNiwgMTQ3MikpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREFubm90YXRpb24iIEA5NDAKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjIwOCwgNzA0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTQwCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNzU4LCA1OTgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJOTAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREFubm90YXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RURDODAyMzMiCi0JCQkJd2lkdGggICAgICAJOTE4Ci0JCQkJaGVpZ2h0ICAgICAJMjM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODQ4QUEwMUQzIgotCQkJCWNsaWVudCAgICAgCUA5MzEKLQkJCQlzdXBwbGllciAgIAlAOTE1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjY5NiwgODY5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjk2LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFREVFMDFCRiIKLQkJCQljbGllbnQgICAgIAlAOTMyCi0JCQkJc3VwcGxpZXIgICAJQDkxMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwOTQsIDE2MTkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTQsIDE1MzMpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NDMKLQkJCQlsb2NhdGlvbiAgIAkoMTQ4NywgMTg1NikKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlzdXBwbGllciAgIAlAOTM4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNDg3LCAxODU2KQotCQkJCSAgICAoMTQ4NywgMTc2MCkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01BdHRyIiBAOTQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MDAsIDM4NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzUwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01BdHRyIikKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA4MCwgMzAwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQkJGOEM4OTAxQjYiCi0JCQkJd2lkdGggICAgICAJNjU4Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ1Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMEQwMTkwMUYxIgotCQkJCWNsaWVudCAgICAgCUA5MzcKLQkJCQlzdXBwbGllciAgIAlAOTM4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTczNCwgMTkzMCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTczNCwgMTg1NikKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTQ2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDI1NjgwMjU5IgotCQkJCWNsaWVudCAgICAgCUA5MzYKLQkJCQlzdXBwbGllciAgIAlAOTE1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgNTg4KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0NwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjlFMTc3MDExNiIKLQkJCQljbGllbnQgICAgIAlAOTQwCi0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIxOTAsIDU4NikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5MCwgNTM3KQotCQkJCWRyYXdTdXBwbGllciAJQDkxOSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTMyMTAyQUYiCi0JCQkJY2xpZW50ICAgICAJQDkyMQotCQkJCXN1cHBsaWVyICAgCUA5MjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjIsIDU3MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyLCA0NDcpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk0OQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEU2MDM3MiIKLQkJCQljbGllbnQgICAgIAlAOTIyCi0JCQkJc3VwcGxpZXIgICAJQDkxNAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MCwgMzIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAsIDI2MykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MjMpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ4RDkwMDNFIgotCQkJCWNsaWVudCAgICAgCUA5MzUKLQkJCQlzdXBwbGllciAgIAlAOTIxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjIzLCA4OTIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyMywgNzA4KSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5NTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDkzMwotCQkJCXN1cHBsaWVyICAgCUA5MzEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjAwLCAxMDg0KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAwLCA5ODcpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpET01Eb2N1bWVudCIgQDk1MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxMjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDk0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJET01Eb2N1bWVudCIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE5NTcsIDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc1OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODUwRTAzODEiCi0JCQkJd2lkdGggICAgICAJNzc2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTUzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTkwM0QyIgotCQkJCWNsaWVudCAgICAgCUA5MTUKLQkJCQlzdXBwbGllciAgIAlAOTE0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODU2LCAzMjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg1NiwgMjYzKQotCQkJCWRyYXdTdXBwbGllciAJQDkyMykKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDk1NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNTY4LCAzODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDM1MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMzQsIDMwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTQ2NzE4MzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0QTUwMTE3IgotCQkJCXdpZHRoICAgICAgCTY4NgotCQkJCWhlaWdodCAgICAgCTE5MgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1NQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDRDY0MDIzMSIKLQkJCQljbGllbnQgICAgIAlAOTE4Ci0JCQkJc3VwcGxpZXIgICAJQDkxNQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1MCwgNTYxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTAsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU2Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3QkIwMzQ5IgotCQkJCWNsaWVudCAgICAgCUA5MjkKLQkJCQlzdXBwbGllciAgIAlAOTE1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNTc1LCAxMjY3KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzUsIDUzNykKLQkJCQlkcmF3U3VwcGxpZXIgCUA5MTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTU3Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JBMENFQTIwMTk3IgotCQkJCWNsaWVudCAgICAgCUA5MTYKLQkJCQlzdXBwbGllciAgIAlAOTE1Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5NCwgODgwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjk0LCA1MzcpCi0JCQkJZHJhd1N1cHBsaWVyIAlAOTE5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDk1OAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQzRBMDE4MiIKLQkJCQljbGllbnQgICAgIAlAOTM0Ci0JCQkJc3VwcGxpZXIgICAJQDkxOAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDg1NiwgNzY1KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTYsIDY4NykpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk1OQotCQkJCWxvY2F0aW9uICAgCSgxNzAzLCAxMjkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUA5MTYKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDE3MDMsIDEyOTApCi0JCQkJICAgICgxNzAzLCAxMDA4KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMjYwMzZEIgotCQkJCWNsaWVudCAgICAgCUA5MTcKLQkJCQlzdXBwbGllciAgIAlAOTE2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUwMywgMTM0NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUwMywgMTI5MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTYxCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTBBMkMwMzA3IgotCQkJCWNsaWVudCAgICAgCUA5MTIKLQkJCQlzdXBwbGllciAgIAlAOTE2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjA5MywgMTM0NykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA5MywgMTI5MCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTYyCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUA5MjYKLQkJCQlzdXBwbGllciAgIAlAOTM4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MywgMjAyOCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI1MywgMTg1NikKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NDMpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI4LiBDb25jcmV0ZSBDb250YWlubWVudCIKLQkJCXF1aWQgICAgICAgCSIzQjZBODA5NzAyN0EiCi0JCQl0aXRsZSAgICAgIAkiOC4gQ29uY3JldGUgQ29udGFpbm1lbnQiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETm90YXRpb25EZWNsYXJhdGlvbiIgQDk2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NzIsIDk5MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzOSwgOTQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEQUEwMjFDIgotCQkJCXdpZHRoICAgICAgCTQ4NAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYURpcmVjdGl2ZSIgQDk2NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NDAsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjQzMSwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQxOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFEaXJlY3RpdmUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRDhBMjAyQTIiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lIiBAOTY1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE0NCwgNzg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDEzLCA3NDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFJlZGVmaW5lIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhDOUIwMkFEIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFJlZGVmaW5lQ29udGVudCIgQDk2NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIwNjQsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NCwgNTMzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyMAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RSZWRlZmluZUNvbnRlbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTIwNjAxNzIiCi0JCQkJd2lkdGggICAgICAJNDM4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDk2NwotCQkJCWxvY2F0aW9uICAgCSgxOTQzLCA4NjgpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMTk0MywgODY4KQotCQkJCSAgICAoMTk0MywgNjMxKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NSIgQDk2OAotCQkJCWxvY2F0aW9uICAgCSgyMTI1LCA2ODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUU4MjQwMDUxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNjYiIEA5NjkKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NjgKLQkJCQkJbG9jYXRpb24gICAJKDE1NywgMzQ0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkFFODI2MDJBRCIKLQkJCQkJY2xpZW50ICAgICAJQDk2OAotCQkJCQlzdXBwbGllciAgIAlAOTY1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTI1LCA2ODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCA3MjkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDk3MAotCQkJCQlQYXJlbnRfVmlldyAJQDk2OAotCQkJCQlsb2NhdGlvbiAgIAkoMTU3LCAzNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk3MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMjU1LCA2NzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjE3NTQzOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZBRTgyNjAyQjciCi0JCQkJCWNsaWVudCAgICAgCUA5NjgKLQkJCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjEyNSwgNjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNSwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTcwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA2NywgNjcxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xNzU0MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTU5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVGVybSIgQDk3MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMzIwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTczCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVGVybSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzQzVFMDE3NCIKLQkJCQl3aWR0aCAgICAgIAkyMzQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA5NzQKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCA0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk3MwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjcyLCA0NjUpCi0JCQkJICAgICgyNzIsIDM3NSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiIgQDk3NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDExNjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5NzUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIzNzIsIDExMjEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTY5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTU4NwotCQkJCWhlaWdodCAgICAgCTExOAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXAiIEA5NzYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNTYsIDU3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoODksIDUzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzMzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNEUwMDI5MSIKLQkJCQl3aWR0aCAgICAgIAkzNTIKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTMiIEA5NzcKLQkJCQlsb2NhdGlvbiAgIAkoMTE3MCwgMTM1NikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzdBQzAyNUEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1vZGVsR3JvdXAiIEA5NzgKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NzcKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5NzkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTc4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjY5LCAxMzg5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjUyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21vZGVsR3JvdXAiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNDA0NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzN0FEMDMzOSIKLQkJCQkJY2xpZW50ICAgICAJQDk3NwotCQkJCQlzdXBwbGllciAgIAlAOTc2Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNzAsIDEzNTYpCi0JCQkJCSAgICAoMjA2LCAxMzU2KQotCQkJCQkgICAgKDIwNiwgNjMxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNzAsIDEzNTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDYsIDYzMSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTgwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk3OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyNiwgMTMyMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTU5MTQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNTQiIEA5ODEKLQkJCQkJUGFyZW50X1ZpZXcgCUA5NzcKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTIwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5ODIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTgxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjUyMSwgMTM5OCkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODM3QUQwMzM4IgotCQkJCQljbGllbnQgICAgIAlAOTc3Ci0JCQkJCXN1cHBsaWVyICAgCUA5NzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTE3MCwgMTM1NikKLQkJCQkJICAgICgyNzMxLCAxMzU2KQotCQkJCQkgICAgKDI3MzEsIDEyMjcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE3MCwgMTM1NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI3MzEsIDEyMjcpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAOTgzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAxNjk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTgzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjY4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTQ3IiBAOTg0Ci0JCQkJbG9jYXRpb24gICAJKDEyMiwgMTEzNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCMTAyRjgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0OCIgQDk4NQotCQkJCQlQYXJlbnRfVmlldyAJQDk4NAotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCQ0VCNjAwMUIiCi0JCQkJCWNsaWVudCAgICAgCUA5ODQKLQkJCQkJc3VwcGxpZXIgICAJQDk3NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIyLCAxMTM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyLCA2MzEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDk4NgotCQkJCQlQYXJlbnRfVmlldyAJQDk4NAotCQkJCQlsb2NhdGlvbiAgIAkoLTYzMCwgLTI1NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTg3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDk4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMywgMTUxNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzUwNDk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkJDRUI2MDAyNSIKLQkJCQkJY2xpZW50ICAgICAJQDk4NAotCQkJCQlzdXBwbGllciAgIAlAOTgzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjIsIDExMzYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjIsIDE2NDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5ODYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODAsIDE1ODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg4MTE4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZUNvbnRlbnQiIEA5ODkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyODgsIDgwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTg5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MSwgNDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDk1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFBhcnRpY2xlQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjIzMDBDNiIKLQkJCQl3aWR0aCAgICAgIAk1MTMKLQkJCQloZWlnaHQgICAgIAkxMDAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTkiIEA5OTAKLQkJCQlsb2NhdGlvbiAgIAkoNDcsIDg4NSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxNTAxMTkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2MCIgQDk5MQotCQkJCQlQYXJlbnRfVmlldyAJQDk5MAotCQkJCQlsb2NhdGlvbiAgIAkoLTI4OSwgODIxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkI0NzFBMDNBQiIKLQkJCQkJY2xpZW50ICAgICAJQDk5MAotCQkJCQlzdXBwbGllciAgIAlAOTgzCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0NywgODg1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDcsIDE2NDEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50IiBAOTkyCi0JCQkJCVBhcmVudF9WaWV3IAlAOTkwCi0JCQkJCWxvY2F0aW9uICAgCSgtMjg5LCA4MjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDIsIDE4OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE2OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitjb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MjE4NTQKLQkJCQkJICAgIGhlaWdodCAgICAgCTk1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDcxQTAzQjUiCi0JCQkJCWNsaWVudCAgICAgCUA5OTAKLQkJCQkJc3VwcGxpZXIgICAJQDk4OQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDcsIDg4NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ3LCAxMzApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk5NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOCwgMTkyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTc4ODEKLQkJCQkJICAgIGhlaWdodCAgICAgCTE5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlVXNlIiBAOTk1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTQyNCwgODk2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTk1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMjUyLCA4NDkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzQ1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZVVzZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzNTQ2MDFBOCIKLQkJCQl3aWR0aCAgICAgIAkzNjMKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEA5OTYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNDA4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAOTk2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxMTc1LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk0ODQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4OSIgQDk5NwotCQkJCWxvY2F0aW9uICAgCSgxMzE5LCAxMDM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkYxREU5MDE4QSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOTAiIEA5OTgKLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTcKLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFQTAzNkMiCi0JCQkJCWNsaWVudCAgICAgCUA5OTcKLQkJCQkJc3VwcGxpZXIgICAJQDk5NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDk1NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEA5OTkKLQkJCQkJUGFyZW50X1ZpZXcgCUA5OTcKLQkJCQkJbG9jYXRpb24gICAJKC01NywgLTEwMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAwMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUA5OTkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM5LCAxMDM5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MzE3MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTIwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGMURFQTAzODAiCi0JCQkJCWNsaWVudCAgICAgCUA5OTcKLQkJCQkJc3VwcGxpZXIgICAJQDk5NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMxOSwgMTAzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzMTksIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAOTk5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTI3OSwgMTAzMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA0MDgxNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25zdHJhaW5pbmdGYWNldCIgQDEwMDIKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgwLCAxNjk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwMgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTg1NSwgMTY1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29uc3RyYWluaW5nRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDNkIzNDAwOTMiCi0JCQkJd2lkdGggICAgICAJNDY4Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTAwMwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyODAsIDE2OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxMDM1LCAxNjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ5MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQkE3MDA1RCIKLQkJCQl3aWR0aCAgICAgIAk1MDgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxODUiIEAxMDA0Ci0JCQkJbG9jYXRpb24gICAJKDEzNTEsIDE4NDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RDVDQTUwMTEyIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxODYiIEAxMDA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAwNAotCQkJCQlsb2NhdGlvbiAgIAkoLTI5NywgMjI0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ1Q0E3MDNCNCIKLQkJCQkJY2xpZW50ICAgICAJQDEwMDQKLQkJCQkJc3VwcGxpZXIgICAJQDEwMDMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTM1MSwgMTg0MCkKLQkJCQkJICAgICgxMjk0LCAxODQwKQotCQkJCQkgICAgKDEyOTQsIDE3NTEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM1MSwgMTg0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTQsIDE3NTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA0Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjk3LCAyMjQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAwNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDE4MDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYzMjY1MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTA4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZENUNBNzAzQzgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDA0Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDAzCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzNTEsIDE4NDApCi0JCQkJCSAgICAoMTQwOSwgMTg0MCkKLQkJCQkJICAgICgxNDA5LCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNTEsIDE4NDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNzUxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDA4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMzYxLCAxODAxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNzI4NDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjkiIEAxMDA5Ci0JCQkJbG9jYXRpb24gICAJKDExOTAsIDE0MzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMDZGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJhbm9ueW1vdXNUeXBlRGVmaW5pdGlvbiIgQDEwMTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDA5Ci0JCQkJCWxvY2F0aW9uICAgCSg3NzQsIC0xODMyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDExCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDYyLCAxNTI1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDkyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2Fub255bW91c1R5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NDQ5NzYKLQkJCQkJICAgIGhlaWdodCAgICAgCTI3MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMzE4IgotCQkJCQljbGllbnQgICAgIAlAMTAwOQotCQkJCQlzdXBwbGllciAgIAlAMTAwMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5MCwgMTQzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTAsIDE2NDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDExNDMsIDE1MjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1NDU0NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzAiIEAxMDEzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTAwOQotCQkJCQlsb2NhdGlvbiAgIAkoNzc0LCAtMTgzMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAxNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDEzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTE0OSwgMTI2NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODkwRDYwMzBFIgotCQkJCQljbGllbnQgICAgIAlAMTAwOQotCQkJCQlzdXBwbGllciAgIAlAOTk2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkwLCAxNDMyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5MCwgMTIyMykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTg3IiBAMTAxNQotCQkJCWxvY2F0aW9uICAgCSgxNjkwLCAxNjg0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkMzNUFEMDM3NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZmFjZXRDb250ZW50cyIgQDEwMTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDE1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMzI2LCAtMTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2OTUsIDE3MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZmFjZXRDb250ZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDMyMDUxCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDEwIgotCQkJCQljbGllbnQgICAgIAlAMTAxNQotCQkJCQlzdXBwbGllciAgIAlAMTAwMgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NDYsIDE2ODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMTgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAxNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3NTYsIDE2NDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk5NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDczMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTg4IiBAMTAxOQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMTUKLQkJCQkJbG9jYXRpb24gICAJKC0zMjYsIC0xMikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDE5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTU2NiwgMTY0MykKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QzM1QUYwMDA2IgotCQkJCQljbGllbnQgICAgIAlAMTAxNQotCQkJCQlzdXBwbGllciAgIAlAMTAwMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY5MCwgMTY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MzQsIDE2ODQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMDIxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjYyNCwgNzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAyMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjM4OCwgNzQxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RTY2hlbWFDb21wb3NpdG9yIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MyMURCNDEwMkFFIgotCQkJCXdpZHRoICAgICAgCTQ5MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWFDb250ZW50IiBAMTAyMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEzMTIsIDMyMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjIKLQkJCQkgICAgbG9jYXRpb24gICAJKDExMDgsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29udGVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4Q0I4MDBCQSIKLQkJCQl3aWR0aCAgICAgIAk0MjYKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAxMDIzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjg4LCAzMjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1NTcsIDI3NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4MAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE2NyIgQDEwMjQKLQkJCQlsb2NhdGlvbiAgIAkoOTYzLCAzMTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkIwMDNEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwMjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDI0Ci0JCQkJCWxvY2F0aW9uICAgCSg1OTUsIC0xNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAyNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDI1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCAzNjEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4MTA4MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg4RTZDMDExMSIKLQkJCQkJY2xpZW50ICAgICAJQDEwMjQKLQkJCQkJc3VwcGxpZXIgICAJQDEwMjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk2MywgMzE5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5OSwgMzE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDE2LCAyOTApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5NjM5NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTY4IiBAMTAyOAotCQkJCQlQYXJlbnRfVmlldyAJQDEwMjQKLQkJCQkJbG9jYXRpb24gICAJKDU5NSwgLTE3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDI5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMjgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTUsIDM2MSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNkMwMTA3IgotCQkJCQljbGllbnQgICAgIAlAMTAyNAotCQkJCQlzdXBwbGllciAgIAlAMTAyMwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTYzLCAzMTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MjgsIDMxOSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVHlwZURlZmluaXRpb24iIEAxMDMwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjE2MCwgOTkyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzMAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk3NCwgOTQ5KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAkzOTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMDMxCi0JCQkJbG9jYXRpb24gICAJKDIzMjIsIDE1OTMpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMzAKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIzMjIsIDE1OTMpCi0JCQkJICAgICgyMzIyLCAxMDQ3KSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAzMgotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDEwMzMKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDMyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTQ2LCA5MDUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjAwMDAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNQotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMkY1MDEzQSIKLQkJCQljbGllbnQgICAgIAlAMTAzMAotCQkJCXN1cHBsaWVyICAgCUA5NjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTUwLCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTAsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjcpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDEwMzQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4MzIsIDU3NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDUxMCwgNTMyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY0NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbGVtZW50RGVjbGFyYXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ1ODAyMTQiCi0JCQkJd2lkdGggICAgICAJNjYyCi0JCQkJaGVpZ2h0ICAgICAJMTEyCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEzIiBAMTAzNQotCQkJCWxvY2F0aW9uICAgCSgxNDk4LCAxNDMxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg5MTE0MDFBRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYW5vbnltb3VzVHlwZURlZmluaXRpb24iIEAxMDM2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTAzNQotCQkJCQlsb2NhdGlvbiAgIAkoMTAzOCwgLTE4MTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMjcsIDE0NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0OTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYW5vbnltb3VzVHlwZURlZmluaXRpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ1NDM4OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNyIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzUKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzAKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkKLQkJCQkJICAgICgyMjgxLCAxNDMxKQotCQkJCQkgICAgKDIyODEsIDEwNDcpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ5OCwgMTQzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIyODEsIDEwNDcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMzgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTAzNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyMDQsIDEzOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjYwNTQxOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTE0IiBAMTAzOQotCQkJCQlQYXJlbnRfVmlldyAJQDEwMzUKLQkJCQkJbG9jYXRpb24gICAJKDEwMzgsIC0xODEwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDkwLCA4NjYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjg5MTE1MDAxNiIKLQkJCQkJY2xpZW50ICAgICAJQDEwMzUKLQkJCQkJc3VwcGxpZXIgICAJQDEwMzQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ5OCwgMTQzMSkKLQkJCQkJICAgICgxMTMxLCAxNDMxKQotCQkJCQkgICAgKDExMzEsIDYzMikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDk4LCAxNDMxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEzMSwgNjMyKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RYUGF0aERlZmluaXRpb24iIEAxMDQxCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODQ4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0MQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjU1LCAxMTI1KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM4NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RYUGF0aERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEODNCQjAzNTUiCi0JCQkJd2lkdGggICAgICAJNDA0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24iIEAxMDQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoODAwLCA4OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MDUsIDg1MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1OTAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjI2MDNBMiIKLQkJCQl3aWR0aCAgICAgIAk2MDgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4KQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMTciIEAxMDQzCi0JCQkJbG9jYXRpb24gICAJKDUzNCwgNzM2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgzM0VGMDE2MCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiaWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbnMiIEAxMDQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTA0MwotCQkJCQlsb2NhdGlvbiAgIAkoODYsIC0yMTQ0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDQ1Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNDQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjAsIDc0OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTU1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitpZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9ucyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTExMTExCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyODYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjgzM0YwMDI5OSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDMKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDUzNCwgNzM2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTM0LCA4NDEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDU5NSwgODA3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42NzU5MjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTYxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDExOCIgQDEwNDcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDQzCi0JCQkJCWxvY2F0aW9uICAgCSg4NiwgLTIxNDQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0NwotCQkJCQkgICAgbG9jYXRpb24gICAJKDU3NiwgNjUzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY4MzNGMDAyOTgiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQzCi0JCQkJCXN1cHBsaWVyICAgCUAxMDM0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1MzQsIDczNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNCwgNjMyKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzciIEAxMDQ5Ci0JCQkJbG9jYXRpb24gICAJKDkwMCwgMTAzMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRDAwM0UiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInNlbGVjdG9yIiBAMTA1MAotCQkJCQlQYXJlbnRfVmlldyAJQDEwNDkKLQkJCQkJbG9jYXRpb24gICAJKDg0LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMTMsIDEwNDIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2VsZWN0b3IiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjEyMzI4OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTEzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzRTAyMzQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDQ5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDQxCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg5MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MDAsIDExMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg1OSwgMTA0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDk1ODkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMzgiIEAxMDUzCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA0OQotCQkJCQlsb2NhdGlvbiAgIAkoODQsIDEyMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1NAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUzCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU5LCA5NjgpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDNFMDIyQSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNDkKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkwMCwgMTAzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMCwgOTUxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMzkiIEAxMDU1Ci0JCQkJbG9jYXRpb24gICAJKDcwMCwgMTAzMikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAwMjUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZpZWxkcyIgQDEwNTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTAzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTEyMAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitmaWVsZHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA1NDc5NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJODUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkQ4RDMzMDM3OSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNTUKLQkJCQkJc3VwcGxpZXIgICAJQDEwNDEKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDcwMCwgMTAzMikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDcwMCwgMTExMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA1OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDU2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNzcxLCAxMDQyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xMjMwNzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTcxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0MCIgQDEwNTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDU1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTE2LCAxMjApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA1OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDY1OSwgOTY4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZEOEQzMzAzNjUiCi0JCQkJCWNsaWVudCAgICAgCUAxMDU1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDQyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3MDAsIDEwMzIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MDAsIDk1MSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVDb250ZW50IiBAMTA2MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDc1MiwgMTQ0MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDUwMCwgMTM5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODNCQTAwMTk2IgotCQkJCXdpZHRoICAgICAgCTUyMgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwNjIKLQkJCQlsb2NhdGlvbiAgIAkoNTUwLCAxNTkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDYxCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICg1NTAsIDE1OTApCi0JCQkJICAgICg1NTAsIDE0OTUpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBDb250ZW50IiBAMTA2MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1MDQsIDU3NikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNjMKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyNDAsIDUzMykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBDb250ZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwMjAwMDg5IgotCQkJCXdpZHRoICAgICAgCTU0NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEwNjQKLQkJCQlsb2NhdGlvbiAgIAkoMTQwNiwgNzY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxMDYzCi0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxNDA2LCA3NjUpCi0JCQkJICAgICgxNDA2LCA2MzEpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTA2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI2NTYsIDE2OTYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMzkzLCAxNjUzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTUyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RDb21wbGV4VHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkI4MjAzMUEiCi0JCQkJd2lkdGggICAgICAJNTQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkOTUiIEAxMDY2Ci0JCQkJbG9jYXRpb24gICAJKDE2MTQsIDE4NjgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2RkRERDcwMTEzIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ5NiIgQDEwNjcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDY2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZGREREQTAyNkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDY2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDY1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE2MTQsIDE4NjgpCi0JCQkJCSAgICAoMjUwMCwgMTg2OCkKLQkJCQkJICAgICgyNTAwLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAwLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwNjgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDY2Ci0JCQkJCWxvY2F0aW9uICAgCSg1MjYsIDQ3NikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDY4Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk2LCAxNzg3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwOTg3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJODkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNkZERERBMDI3NSIKLQkJCQkJY2xpZW50ICAgICAJQDEwNjYKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTYxNCwgMTg2OCkKLQkJCQkJICAgICg5ODQsIDE4NjgpCi0JCQkJCSAgICAoOTg0LCAxNDk1KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2MTQsIDE4NjgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODQsIDE0OTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNzAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA2OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDIsIDE4MjQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU3MTI4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMDEiIEAxMDcxCi0JCQkJbG9jYXRpb24gICAJKDI5MjcsIDM4NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzNjAzODYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZUNvbnRlbnRzIiBAMTA3MgotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzEKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDczCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTE1LCAzNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzMzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlQ29udGVudHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc3MzA2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk4RTM4MDA3QyIKLQkJCQkJY2xpZW50ICAgICAJQDEwNzEKLQkJCQkJc3VwcGxpZXIgICAJQDEwNjMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMjkyNywgMzg3KQotCQkJCQkgICAgKDE3NTAsIDM4NykKLQkJCQkJICAgICgxNzUwLCA1MjEpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjkyNywgMzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNTIxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODA0LCA0MjUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg1NzI0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTAyIiBAMTA3NQotCQkJCQlQYXJlbnRfVmlldyAJQDEwNzEKLQkJCQkJbG9jYXRpb24gICAJKDI0NjMsIC0zNzU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyOTQ2LCAxNDQ4KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjY5OEUzODAwNzIiCi0JCQkJCWNsaWVudCAgICAgCUAxMDcxCi0JCQkJCXN1cHBsaWVyICAgCUAxMDY1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDI5MjcsIDM4NykKLQkJCQkJICAgICgyOTg3LCAzODcpCi0JCQkJCSAgICAoMjk4NywgMTY3MSkKLQkJCQkJICAgICgyOTI4LCAxNjcxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5MjcsIDM4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5MjgsIDE2NzEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIgQDEwNzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTY4LCAxMTY4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTA3NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTU1NgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDc3IiBAMTA3OAotCQkJCWxvY2F0aW9uICAgCSgxNzUwLCA4NzIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNEUwMDY3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb250ZW50cyIgQDEwNzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDc4Ci0JCQkJCWxvY2F0aW9uICAgCSgxNDYyLCAtMjM5MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4MAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDc5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0MCwgNjkxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbnRlbnRzIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NTEwMzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTExMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2OTQwNTAwMkE1IgotCQkJCQljbGllbnQgICAgIAlAMTA3OAotCQkJCQlzdXBwbGllciAgIAlAMTA2MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTc1MCwgODcyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc1MCwgNjMxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDgxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNzkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODE0LCA2OTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjczNDQ0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzgiIEAxMDgyCi0JCQkJCVBhcmVudF9WaWV3IAlAMTA3OAotCQkJCQlsb2NhdGlvbiAgIAkoMTQ2MiwgLTIzOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwODMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTA4MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MDksIDEwNjUpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCNjk0MDUwMDI5QiIKLQkJCQkJY2xpZW50ICAgICAJQDEwNzgKLQkJCQkJc3VwcGxpZXIgICAJQDEwNzcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDg3MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NTAsIDExMTMpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTA4NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQxNiwgMTE2OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwODQKLQkJCQkgICAgbG9jYXRpb24gICAJKDI3OSwgMTEyNSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkyCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOCkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjA5IiBAMTA4NQotCQkJCWxvY2F0aW9uICAgCSgxMjUyLCAxODk2KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRUJEQzg3MDI0NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjEwIiBAMTA4NgotCQkJCQlQYXJlbnRfVmlldyAJQDEwODUKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkVCREM4QzAyRjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMDg1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMDY1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNTIsIDE4OTYpCi0JCQkJCSAgICAoMjYwMywgMTg5NikKLQkJCQkJICAgICgyNjAzLCAxNzUxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNTIsIDE4OTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjAzLCAxNzUxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTA4NwotCQkJCQlQYXJlbnRfVmlldyAJQDEwODUKLQkJCQkJbG9jYXRpb24gICAJKDcwOCwgMTI4OCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNjgyLCAxODU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVdpbGRjYXJkQ29udGVudCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzgxMTQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JFQkRDOEMwMzAzIgotCQkJCQljbGllbnQgICAgIAlAMTA4NQotCQkJCQlzdXBwbGllciAgIAlAMTA4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjUyLCAxODk2KQotCQkJCQkgICAgKDQyOCwgMTg5NikKLQkJCQkJICAgICg0MjgsIDEyMjMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI1MiwgMTg5NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQyOCwgMTIyMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA4OQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDg3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzgyLCAxODYwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NzUwMzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ3Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODEiIEAxMDkwCi0JCQkJbG9jYXRpb24gICAJKDExOTksIDEzMjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNzVEMzIwMjIwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ4MiIgQDEwOTEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMDkwCi0JCQkJCWxvY2F0aW9uICAgCSg2NTUsIDcxMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEMiCi0JCQkJCWNsaWVudCAgICAgCUAxMDkwCi0JCQkJCXN1cHBsaWVyICAgCUAxMDc3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoMTg5NywgMTMyMSkKLQkJCQkJICAgICgxODk3LCAxMjIzKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTksIDEzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODk3LCAxMjIzKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IiBAMTA5MgotCQkJCQlQYXJlbnRfVmlldyAJQDEwOTAKLQkJCQkJbG9jYXRpb24gICAJKDY1NSwgNzEzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDkzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTcsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYXR0cmlidXRlV2lsZGNhcmRDb250ZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40Mjk1NjkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3NUQzQzAxMEQiCi0JCQkJCWNsaWVudCAgICAgCUAxMDkwCi0JCQkJCXN1cHBsaWVyICAgCUAxMDg0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTksIDEzMjEpCi0JCQkJCSAgICAoNTAwLCAxMzIxKQotCQkJCQkgICAgKDUwMCwgMTIyMykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk5LCAxMzIxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTAwLCAxMjIzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDk0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDEyNzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MjMwNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEwOTUKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDEwNjUKLQkJCQlzdXBwbGllciAgIAlAMTAzMAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI2MDYsIDE2NDEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MDYsIDE1OTMpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTAzMSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk2Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTA5NwotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEwOTYKLQkJCQkgICAgbG9jYXRpb24gICAJKDc1OSwgNDk1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI0MwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNDQ2NDI5Ci0JCQkJICAgIGhlaWdodCAgICAgCTYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NUYxNzAwMkUiCi0JCQkJY2xpZW50ICAgICAJQDEwMzQKLQkJCQlzdXBwbGllciAgIAlAOTczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzUzLCA1MjApCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDc1MywgNDY1KQotCQkJCWRyYXdTdXBwbGllciAJQDk3NCkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMDk4Ci0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODRBMTMwMkEyIgotCQkJCWNsaWVudCAgICAgCUAxMDAzCi0JCQkJc3VwcGxpZXIgICAJQDEwMzAKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDA5LCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDA5LCAxNTkzKQotCQkJCWRyYXdTdXBwbGllciAJQDEwMzEpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTA5OQotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMDAKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMDk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTksIDE1OTEpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjE5Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45ODAzOTIKLQkJCQkgICAgaGVpZ2h0ICAgICAJMzg1Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODVGNTUwMzJCIgotCQkJCWNsaWVudCAgICAgCUAxMDAzCi0JCQkJc3VwcGxpZXIgICAJQDEwNjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTQ0LCAxNTkwKQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjIpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEwMQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTY0MDI3OSIKLQkJCQljbGllbnQgICAgIAlAOTc2Ci0JCQkJc3VwcGxpZXIgICAJQDk3MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE2NiwgNTIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjYsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDExMDIKLQkJCQlsb2NhdGlvbiAgIAkoNDMxLCAyMjIpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDk4OQotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDMxLCAyMjIpCi0JCQkJICAgICg0MzEsIDEzMCkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDMKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA0Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzYxLCAyMjQpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjM3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC45NzY3NDQKLQkJCQkgICAgaGVpZ2h0ICAgICAJODYKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCRDI0NDAwNjkiCi0JCQkJY2xpZW50ICAgICAJQDk3MwotCQkJCXN1cHBsaWVyICAgCUA5ODkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzUsIDI2NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc1LCAyMjIpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwMikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTEwNQotCQkJCWxvY2F0aW9uICAgCSgxMzA5LCA0NjUpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEwMjIKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDEzMDksIDQ2NSkKLQkJCQkgICAgKDEzMDksIDM3NSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDYKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTA3Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEwNgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQxLCA0OTUpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMjI1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC40NjQyODYKLQkJCQkgICAgaGVpZ2h0ICAgICAJMTAKLQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4OEU2NjAzMzkiCi0JCQkJY2xpZW50ICAgICAJQDEwMzQKLQkJCQlzdXBwbGllciAgIAlAMTAyMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzMSwgNTIwKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzEsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMDgKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NDhGQzAxRTciCi0JCQkJY2xpZW50ICAgICAJQDk4MwotCQkJCXN1cHBsaWVyICAgCUAxMDYxCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjUwLCAxNjQxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNTAsIDE1OTApCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTA2MikKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTA5Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTExMAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMDkKLQkJCQkgICAgbG9jYXRpb24gICAJKDEyMDUsIDQ5MykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk1ODMzMwotCQkJCSAgICBoZWlnaHQgICAgIAk4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODhFNjEwM0JFIgotCQkJCWNsaWVudCAgICAgCUA5OTYKLQkJCQlzdXBwbGllciAgIAlAMTAyMgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExOTcsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExOTcsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTEKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTEyCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExMQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk1MSwgOTA1KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODQ4OTgwCi0JCQkJICAgIGhlaWdodCAgICAgCTczCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRUIwMkE4IgotCQkJCWNsaWVudCAgICAgCUAxMDc3Ci0JCQkJc3VwcGxpZXIgICAJQDk2NgotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4NzgsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE4NzgsIDg2OCkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NjcpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExMwotCQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDExMTQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTEzCi0JCQkJICAgIGxvY2F0aW9uICAgCSgxNjQyLCA4MDcpCi0JCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCQlzaXplICAgICAgIAk4KQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMTg3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIjw8bWl4aW4+PiIKLQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkzMTAKLQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5NDAzQTAyMjEiCi0JCQkJY2xpZW50ICAgICAJQDEwNzcKLQkJCQlzdXBwbGllciAgIAlAMTA2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MDMsIDExMTMpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3MDMsIDc2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMDY0KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTUKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTE2Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTExNQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTM1NCwgODAxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIyNQotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuNTAwMDAwCi0JCQkJICAgIGhlaWdodCAgICAgCTcwCi0JCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3MkQ3MzcwMzhGIgotCQkJCWNsaWVudCAgICAgCUA5OTUKLQkJCQlzdXBwbGllciAgIAlAMTA2MwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyODQsIDgzNykKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI4NCwgNzY1KQotCQkJCWRyYXdTdXBwbGllciAJQDEwNjQpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExNwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjY0MDI0MCIKLQkJCQljbGllbnQgICAgIAlAOTY1Ci0JCQkJc3VwcGxpZXIgICAJQDEwMjEKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg0LCA3NjIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIzNzksIDc2MikpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExOAotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFFMzIxMDJBRiIKLQkJCQljbGllbnQgICAgIAlAOTY0Ci0JCQkJc3VwcGxpZXIgICAJQDEwMjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyNjM3LCA1MjEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI2MzcsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxREI1NjAwOTIiCi0JCQkJY2xpZW50ICAgICAJQDEwMjEKLQkJCQlzdXBwbGllciAgIAlAOTY0Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjYzNywgNzI5KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNjM3LCA2MzEpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZBRTJCMzAxRDUiCi0JCQkJY2xpZW50ICAgICAJQDk2NgotCQkJCXN1cHBsaWVyICAgCUAxMDIyCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTk1MCwgNTIxKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTUwLCA0NjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTEwNSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIxCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEyMgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjEKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4MjEsIDg5NykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkxODEKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjA4NzcxOQotCQkJCSAgICBoZWlnaHQgICAgIAk3NgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg4RTRGMDIzQyIKLQkJCQljbGllbnQgICAgIAlAOTYzCi0JCQkJc3VwcGxpZXIgICAJQDEwMjIKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyODk2LCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4OTYsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTA1KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjMKLQkJCQlzdGVyZW90eXBlIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTI0Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjMxMywgOTA0KQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJc2l6ZSAgICAgICAJOCkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTIwNwotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PG1peGluPj4iCi0JCQkJICAgIHBjdERpc3QgICAgCTAuODUwNjIyCi0JCQkJICAgIGhlaWdodCAgICAgCTY4Ci0JCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUUyRTIwMzgxIgotCQkJCWNsaWVudCAgICAgCUA5NzUKLQkJCQlzdXBwbGllciAgIAlAOTY2Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMjM4MSwgMTEwOSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM4MSwgODY4KQotCQkJCWRyYXdTdXBwbGllciAJQDk2NykKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTI1Ci0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBTZWdMYWJlbCBAMTEyNgotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDI4NzgsIDI2OSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCXNpemUgICAgICAgCTgpCi0JCQkJICAgIGFuY2hvciAgICAgCTEwCi0JCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMzgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxtaXhpbj4+IgotCQkJCSAgICBwY3REaXN0ICAgIAkwLjk0NjY2NwotCQkJCSAgICBoZWlnaHQgICAgIAk2NgotCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkJEMjU1MDM4NSIKLQkJCQljbGllbnQgICAgIAlAOTc1Ci0JCQkJc3VwcGxpZXIgICAJQDk4OQotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDI5NDMsIDExMDkpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI5NDMsIDIyMikKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMTAyKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDExMjcKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4NEEzQTAwNDEiCi0JCQkJY2xpZW50ICAgICAJQDEwODQKLQkJCQlzdXBwbGllciAgIAlAOTczCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNDYyLCAxMTEzKQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjIsIDQ2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUA5NzQpKSkKLQkJICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICI5LiBDb25jcmV0ZSBTY2hlbWEgQ29tcG9zaXRpb24iCi0JCQlxdWlkICAgICAgIAkiM0MyNUVCN0EwMzhDIgotCQkJdGl0bGUgICAgICAJIjkuIENvbmNyZXRlIFNjaGVtYSBDb21wb3NpdGlvbiIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iIEAxMTI4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxNTM2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTEyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNzMsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDU4MDIxNCIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTE5IiBAMTEyOQotCQkJCWxvY2F0aW9uICAgCSgyMjgsIDE2OTUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRTYwMjUxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMjAiIEAxMTMwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTEyOQotCQkJCQlsb2NhdGlvbiAgIAkoLTQ3NiwgLTM4NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3LCAxNjIzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDFFQTAyRjciCi0JCQkJCWNsaWVudCAgICAgCUAxMTI5Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDIyOCwgMTY5NSkKLQkJCQkJICAgICgxNzUsIDE2OTUpCi0JCQkJCSAgICAoMTc1LCAxNTkxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIyOCwgMTY5NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE3NSwgMTU5MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkRWxlbWVudERlY2xhcmF0aW9uIiBAMTEzMgotCQkJCQlQYXJlbnRfVmlldyAJQDExMjkKLQkJCQkJbG9jYXRpb24gICAJKC00NzYsIC0zODUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDMyOSwgMTc0MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUyOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuOTI0NTI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQxRUEwMzBCIgotCQkJCQljbGllbnQgICAgIAlAMTEyOQotCQkJCQlzdXBwbGllciAgIAlAMTEyOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMjgsIDE2OTUpCi0JCQkJCSAgICAoMjgxLCAxNjk1KQotCQkJCQkgICAgKDI4MSwgMTU5MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjgsIDE2OTUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODEsIDE1OTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExMzQKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzMgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIyOSwgMTY0NikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDA1NzE0Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTEzNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwNDAsIDE1MzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3OTAsIDE0OTMpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTAwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEOUEwMjA1IgotCQkJCXdpZHRoICAgICAgCTUxOAotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxNTUiIEAxMTM2Ci0JCQkJbG9jYXRpb24gICAJKDk1MiwgMTY5OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0NTAzOTgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE1NiIgQDExMzcKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTM2Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTI4OCwgLTMxOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEzOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTM3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODYwLCAxNjIzKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI0OTAzOEEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTM2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTM1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk1MiwgMTY5OCkKLQkJCQkJICAgICg5MDEsIDE2OTgpCi0JCQkJCSAgICAoOTAxLCAxNTkxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTY5OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgMTU5MSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24iIEAxMTM5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTEzNgotCQkJCQlsb2NhdGlvbiAgIAkoLTEyODgsIC0zMTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNDAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMjAsIDE3MzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1NjQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRNb2RlbEdyb3VwRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuMzI2OTIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNDkwMzlFIgotCQkJCQljbGllbnQgICAgIAlAMTEzNgotCQkJCQlzdXBwbGllciAgIAlAMTEzNQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg5NTIsIDE2OTgpCi0JCQkJCSAgICAoMTAwNCwgMTY5OCkKLQkJCQkJICAgICgxMDA0LCAxNTkxKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk1MiwgMTY5OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMDQsIDE1OTEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzOQotCQkJCQkgICAgbG9jYXRpb24gICAJKDk1MiwgMTY0OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYUNvbXBvc2l0b3IiIEAxMTQyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNjU2LCA5OTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTQyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg0MjAsIDk0OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hQ29tcG9zaXRvciIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjQxMDJBRSIKLQkJCQl3aWR0aCAgICAgIAk0OTAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hRGlyZWN0aXZlIiBAMTE0MwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDEyLCA3MzcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDU3Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYURpcmVjdGl2ZSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNkFEOEEyMDJBMiIKLQkJCQl3aWR0aCAgICAgIAk0NzUKLQkJCQloZWlnaHQgICAgIAkxMTgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEU2NoZW1hIiBAMTE0NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDY0MCwgNDE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDQ2LCAyODUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzg4Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNjaGVtYSIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJCQl3aWR0aCAgICAgIAk0MDYKLQkJCQloZWlnaHQgICAgIAkyODcKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjE5IiBAMTE0NQotCQkJCWxvY2F0aW9uICAgCSgxMzAzLCA2NzkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMEMwM0RCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJpbmNvcnBvcmF0ZWRTY2hlbWEiIEAxMTQ2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE0NQotCQkJCQlsb2NhdGlvbiAgIAkoLTQxLCAtODU3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQ3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNDYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMDU5LCAzODEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzOTYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43MDAzODQKLQkJCQkJICAgIGhlaWdodCAgICAgCTM5Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzIxREQxMDAzMDUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEzMDMsIDY3OSkKLQkJCQkJICAgICgxMzAzLCA0MTkpCi0JCQkJCSAgICAoODQzLCA0MTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMwMywgNjc5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoODQzLCA0MTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNDgKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDkyMiwgNDU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTA3NDYKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyMCIgQDExNDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNDEsIC04NTcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwNDUsIDk1NikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMUREMTAwMzA0IgotCQkJCQljbGllbnQgICAgIAlAMTE0NQotCQkJCQlzdXBwbGllciAgIAlAMTE0MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMzAzLCA2NzkpCi0JCQkJCSAgICAoMTMwMywgOTk3KQotCQkJCQkgICAgKDkwMSwgOTk3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMDMsIDY3OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDkwMSwgOTk3KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTciIEAxMTUxCi0JCQkJbG9jYXRpb24gICAJKDEyMTYsIDY0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzIxRENDNzAwRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkU2NoZW1hIiBAMTE1MgotCQkJCQlQYXJlbnRfVmlldyAJQDExNTEKLQkJCQkJbG9jYXRpb24gICAJKDMzNiwgLTEzOTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDEwMzgsIDUwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityZXNvbHZlZFNjaGVtYSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNjAxOTIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyMURDQ0UwMDQzIgotCQkJCQljbGllbnQgICAgIAlAMTE1MQotCQkJCQlzdXBwbGllciAgIAlAMTE0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjE2LCA2NDkpCi0JCQkJCSAgICAoMTIxNiwgNTM0KQotCQkJCQkgICAgKDg0MywgNTM0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMTYsIDY0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNTM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNTIKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MjYsIDU3NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODMxNjQzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTgiIEAxMTU1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE1MQotCQkJCQlsb2NhdGlvbiAgIAkoMzM2LCAtMTM5OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTU1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTc0LCA3NTYpCi0JCQkJCSAgICBoaWRkZW4gICAgIAlUUlVFCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NTAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjFEQ0NFMDA0MiIKLQkJCQkJY2xpZW50ICAgICAJQDExNTEKLQkJCQkJc3VwcGxpZXIgICAJQDExNDMKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIxNiwgNjQ5KQotCQkJCQkgICAgKDEyMTYsIDc5NykKLQkJCQkJICAgICg4NzcsIDc5NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjE2LCA2NDkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NzcsIDc5NykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjIzIiBAMTE1NwotCQkJCWxvY2F0aW9uICAgCSg2NjIsIDY0MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBNjAxMzEiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jaW5nRGlyZWN0aXZlcyIgQDExNTgKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNTkKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDg3OCwgNjc1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3JlZmVyZW5jaW5nRGlyZWN0aXZlcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDA4NzU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyMTYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVEM0E5MDM3MSIKLQkJCQkJY2xpZW50ICAgICAJQDExNTcKLQkJCQkJc3VwcGxpZXIgICAJQDExNDMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY2MiwgNjQyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjYyLCA3MjUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE1OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDYxNSwgNjc4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40MzA2NTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyNCIgQDExNjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTU3Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjM0LCAxMTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE2MQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYyMSwgNTc2KQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RDNBOTAzNzAiCi0JCQkJCWNsaWVudCAgICAgCUAxMTU3Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjIsIDY0MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY2MiwgNTU5KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjUiIEAxMTYzCi0JCQkJbG9jYXRpb24gICAJKDc1LCAxODgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVDRjAwMDVFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMjYiIEAxMTY0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE2MwotCQkJCQlsb2NhdGlvbiAgIAkoLTg1MywgLTMwOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUNGNDAwMUUiCi0JCQkJCWNsaWVudCAgICAgCUAxMTYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc1LCAxODgpCi0JCQkJCSAgICAoNzUsIDEyOCkKLQkJCQkJICAgICg1MTAsIDEyOCkKLQkJCQkJICAgICg1MTAsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg3NSwgMTg4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTEwLCAyNzMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VmVyc2lvbiIgQDExNjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTYzCi0JCQkJCWxvY2F0aW9uICAgCSgtODUzLCAtMzA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTY2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDc0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RWZXJzaW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuNTkzNzUwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFQ0Y0MDAyOCIKLQkJCQkJY2xpZW50ICAgICAJQDExNjMKLQkJCQkJc3VwcGxpZXIgICAJQDExNDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoNzUsIDE4OCkKLQkJCQkJICAgICg3NSwgMzgwKQotCQkJCQkgICAgKDQzNywgMzgwKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc1LCAxODgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0MzcsIDM4MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAzMjgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg3NDc1NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMjciIEAxMTY4Ci0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDEzNCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwQjAxMUIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIyOCIgQDExNjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTY4Ci0JCQkJCWxvY2F0aW9uICAgCSgzMzQsIC0zNjIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNUVEMEYwMTIxIgotCQkJCQljbGllbnQgICAgIAlAMTE2OAotCQkJCQlzdXBwbGllciAgIAlAMTE0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjYyLCAxMzQpCi0JCQkJCSAgICAoNzY2LCAxMzQpCi0JCQkJCSAgICAoNzY2LCAyNzMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMTM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzY2LCAyNzMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmlnaW5hbFZlcnNpb24iIEAxMTcwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE2OAotCQkJCQlsb2NhdGlvbiAgIAkoMzM0LCAtMzYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTcxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTY0LCA5NykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmlnaW5hbFZlcnNpb24iCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS42NTAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI1RUQwRjAxMkIiCi0JCQkJCWNsaWVudCAgICAgCUAxMTY4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyNjIsIDEzNCkKLQkJCQkJICAgICgxMzIyLCAxMzQpCi0JCQkJCSAgICAoMTMyMiwgMzM0KQotCQkJCQkgICAgKDg0MywgMzM0KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNjIsIDEzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgMzM0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTcyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExNzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg5MTksIDI3OSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODk4MTA4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIyOSIgQDExNzMKLQkJCQlsb2NhdGlvbiAgIAkoMTI2LCA2NTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyNUVFQUIwMDFGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzAiIEAxMTc0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTgzNCwgMTYwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRUFGMDEwQiIKLQkJCQkJY2xpZW50ICAgICAJQDExNzMKLQkJCQkJc3VwcGxpZXIgICAJQDExNDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2LCA2NTYpCi0JCQkJCSAgICAoNTEzLCA2NTYpCi0JCQkJCSAgICAoNTEzLCA1NTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2LCA2NTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTMsIDU1OSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImluY29ycG9yYXRlZFZlcnNpb25zIiBAMTE3NQotCQkJCQlQYXJlbnRfVmlldyAJQDExNzMKLQkJCQkJbG9jYXRpb24gICAJKC04MzQsIDE2MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE3NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTc1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE3LCA0MzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0MDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIraW5jb3Jwb3JhdGVkVmVyc2lvbnMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjY0MzkwMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjVFRUFGMDExNSIKLQkJCQkJY2xpZW50ICAgICAJQDExNzMKLQkJCQkJc3VwcGxpZXIgICAJQDExNDQKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2LCA2NTYpCi0JCQkJCSAgICAoNjYsIDY1NikKLQkJCQkJICAgICg2NiwgNDcyKQotCQkJCQkgICAgKDQzNywgNDcyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyNiwgNjU2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCA0NzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDM1NiwgNTI2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44Njg0NjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTU0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjMzIiBAMTE3OAotCQkJCWxvY2F0aW9uICAgCSg2NDIsIDEyNikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3MzAxOTQiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIzNCIgQDExNzkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMTc4Ci0JCQkJCWxvY2F0aW9uICAgCSg4MiwgLTQxOCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI3ODQ3NTAxRjEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTc4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMTQ0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDY0MiwgMTI2KQotCQkJCQkgICAgKDU4OCwgMTI2KQotCQkJCQkgICAgKDU4OCwgMjczKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY0MiwgMTI2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTg4LCAyNzMpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzY2hlbWFGb3JTY2hlbWEiIEAxMTgwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTE3OAotCQkJCQlsb2NhdGlvbiAgIAkoODIsIC00MTgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDYzOSwgNzQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzODQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrc2NoZW1hRm9yU2NoZW1hIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDU1NTU2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyNzg0NzUwMUZCIgotCQkJCQljbGllbnQgICAgIAlAMTE3OAotCQkJCQlzdXBwbGllciAgIAlAMTE0NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg2NDIsIDEyNikKLQkJCQkJICAgICg2OTcsIDEyNikKLQkJCQkJICAgICg2OTcsIDI3MykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NDIsIDEyNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY5NywgMjczKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDIxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzAxODYzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk1NQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTE4MwotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjFEQjU2MDA5MiIKLQkJCQljbGllbnQgICAgIAlAMTE0MgotCQkJCXN1cHBsaWVyICAgCUAxMTQzCi0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjM4LCA5MzcpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDYzOCwgODQzKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlRGVjbGFyYXRpb24iIEAxMTg0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMzA0LCAxMTg0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjcsIDExNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEMkUwMTkyIgotCQkJCXdpZHRoICAgICAgCTQ5MgotCQkJCWhlaWdodCAgICAgCTExMAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3MyIgQDExODUKLQkJCQlsb2NhdGlvbiAgIAkoMjM0LCAxMzQwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkI0MjZCMDE5NCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNzQiIEAxMTg2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTE4NQotCQkJCQlsb2NhdGlvbiAgIAkoLTMxMCwgLTQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExODcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE0MCwgMTI3MSkKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkQwMzA5IgotCQkJCQljbGllbnQgICAgIAlAMTE4NQotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQsIDEzNDApCi0JCQkJCSAgICAoMTgxLCAxMzQwKQotCQkJCQkgICAgKDE4MSwgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDEzNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxODEsIDEyMzkpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uIiBAMTE4OAotCQkJCQlQYXJlbnRfVmlldyAJQDExODUKLQkJCQkJbG9jYXRpb24gICAJKC0zMTAsIC00KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTg5Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDExODgKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMzMsIDEzODkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk1MjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTEuODY3OTI1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0OQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0I2QjQyNkQwMzEzIgotCQkJCQljbGllbnQgICAgIAlAMTE4NQotCQkJCQlzdXBwbGllciAgIAlAMTE4NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgyMzQsIDEzNDApCi0JCQkJCSAgICAoMjg3LCAxMzQwKQotCQkJCQkgICAgKDI4NywgMTIzOSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDEzNDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyODcsIDEyMzkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTAKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE4OAotCQkJCQkgICAgbG9jYXRpb24gICAJKDI0MSwgMTI5NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDQyOTQ1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0NgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTE5MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3NjAsIDE0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTEKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1MTcsIDEwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0ODYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2ltcGxlVHlwZURlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJBNzAwNUQiCi0JCQkJd2lkdGggICAgICAJNTA0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZhY2V0IiBAMTE5MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE3MTIsIDQxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE1OTksIDM3MykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyMjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJd2lkdGggICAgICAJMjQ0Ci0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMwNyIgQDExOTMKLQkJCQlsb2NhdGlvbiAgIAkoMTY2OCwgMjgwKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEFFMDFDQyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA4IiBAMTE5NAotCQkJCQlQYXJlbnRfVmlldyAJQDExOTMKLQkJCQkJbG9jYXRpb24gICAJKDgsIC0xNTIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0QUYwMTBGIgotCQkJCQljbGllbnQgICAgIAlAMTE5MwotCQkJCQlzdXBwbGllciAgIAlAMTE5MQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY2OCwgMjgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OCwgMTk5KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic3ludGhldGljRmFjZXRzIiBAMTE5NQotCQkJCQlQYXJlbnRfVmlldyAJQDExOTMKLQkJCQkJbG9jYXRpb24gICAJKDgsIC0xNTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4NTIsIDMwMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMyNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNGYWNldHMiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI0NjE1NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTg0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjRBRjAxMUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMTkzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTkyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjY4LCAyODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjY4LCAzNjEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTE5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2MjUsIDMwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjc2OTIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhcnRpY2xlIiBAMTE5OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE1NTIsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDExOTgKLQkJCQkgICAgbG9jYXRpb24gICAJKDE0MjYsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIgQDExOTkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzc2LCA2NDApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMTk5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgxNTE1LCA1OTcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTIyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjgyQjgyMDMxQSIKLQkJCQl3aWR0aCAgICAgIAk1NDAKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzA5IiBAMTIwMAotCQkJCWxvY2F0aW9uICAgCSgxNTA4LCA3OTIpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Q0QkI0RDMwMjhFIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMTAiIEAxMjAxCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIwMAotCQkJCQlsb2NhdGlvbiAgIAkoLTEyLCAtMjgwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGMyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDAKLQkJCQkJc3VwcGxpZXIgICAJQDExOTkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDgsIDc5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDY5NSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1BhcnRpY2xlIiBAMTIwMgotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDAKLQkJCQkJbG9jYXRpb24gICAJKC0xMiwgLTI4MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwMwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY5NSwgNzY3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3N5bnRoZXRpY1BhcnRpY2xlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMjU5MjU5Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxODcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNEQ0MDJGRCIKLQkJCQkJY2xpZW50ICAgICAJQDEyMDAKLQkJCQkJc3VwcGxpZXIgICAJQDExOTgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MDgsIDc5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MDgsIDg4OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwNAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjAyCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ1NCwgODI5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zOTUwNjIKLQkJCQkJICAgIGhlaWdodCAgICAgCTU1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIwNQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEwMjQsIDExODQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNDEpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTM2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDg0MDI5MCIKLQkJCQl3aWR0aCAgICAgIAk1NTQKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkODUiIEAxMjA2Ci0JCQkJbG9jYXRpb24gICAJKDkxOSwgMTM0OSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI1RTAxRjkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDg2IiBAMTIwNwotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDYKLQkJCQkJbG9jYXRpb24gICAJKC0yMzMsIC01OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIwOAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA3Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODI1LCAxMjczKQotCQkJCQkgICAgaGlkZGVuICAgICAJVFJVRQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDUwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2MjAwNDYiCi0JCQkJCWNsaWVudCAgICAgCUAxMjA2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjA1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkxOSwgMTM0OSkKLQkJCQkJICAgICg4NjYsIDEzNDkpCi0JCQkJCSAgICAoODY2LCAxMjM5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkxOSwgMTM0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg2NiwgMTIzOSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIiBAMTIwOQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMDYKLQkJCQkJbG9jYXRpb24gICAJKC0yMzMsIC01OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTkzLCAxMzkzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNjAwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMS4zNzczNTgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQjZCNDI2MjAwNTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMjA2Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjA1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkxOSwgMTM0OSkKLQkJCQkJICAgICg5NzMsIDEzNDkpCi0JCQkJCSAgICAoOTczLCAxMjM5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkxOSwgMTM0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk3MywgMTIzOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjA5Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTE5LCAxMjk2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDE0OTI1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk1NAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFdpbGRjYXJkIiBAMTIxMgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDE5NTIsIDk0NCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMTIKLQkJCQkgICAgbG9jYXRpb24gICAJKDE4MTYsIDkwMSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNzIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEV2lsZGNhcmQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MzgzNzAwMzEiCi0JCQkJd2lkdGggICAgICAJMjkwCi0JCQkJaGVpZ2h0ICAgICAJMTEwCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMxMSIgQDEyMTMKLQkJCQlsb2NhdGlvbiAgIAkoMjAyNSwgNzkyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEJCNEQ5MDFGNiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzEyIiBAMTIxNAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTMKLQkJCQkJbG9jYXRpb24gICAJKDE1MywgLTI4MCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRCQjREQTAyODQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMTk5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMDI1LCA3OTIpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI1LCA2OTUpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJzeW50aGV0aWNXaWxkY2FyZCIgQDEyMTUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjEzCi0JCQkJCWxvY2F0aW9uICAgCSgxNTMsIC0yODApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MjYsIDgzOCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDg4MDk1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkyMDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNENEJCNERBMDI4RSIKLQkJCQkJY2xpZW50ICAgICAJQDEyMTMKLQkJCQkJc3VwcGxpZXIgICAJQDEyMTIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIwMjUsIDc5MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwMjUsIDg4OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA5OCwgODQwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MDYxNzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTczCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEzIiBAMTIxOAotCQkJCWxvY2F0aW9uICAgCSgxNzU0LCAxMTc4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNENEM2OEZGMDFCRiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzE0IiBAMTIxOQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgKLQkJCQkJbG9jYXRpb24gICAJKC0xOTgsIDIzNCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzRDRDNjkwMjAzMTciCi0JCQkJCWNsaWVudCAgICAgCUAxMjE4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjA1Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzU0LCAxMTc4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMwMSwgMTE3OCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInN5bnRoZXRpY1dpbGRjYXJkIiBAMTIyMAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMTgKLQkJCQkJbG9jYXRpb24gICAJKC0xOTgsIDIzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIyMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTgyOCwgMTI2MSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitzeW50aGV0aWNXaWxkY2FyZCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTYzMzU1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk4MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0Q0QzY5MDIwMzE4IgotCQkJCQljbGllbnQgICAgIAlAMTIxOAotCQkJCQlzdXBwbGllciAgIAlAMTIxMgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNzU0LCAxMTc4KQotCQkJCQkgICAgKDIwMjgsIDExNzgpCi0JCQkJCSAgICAoMjAyOCwgOTk5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3NTQsIDExNzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDI4LCA5OTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwODIsIDEwOTgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc4MzY2NAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMTAuIERpYWdub3N0aWNzIgotCQkJcXVpZCAgICAgICAJIjNCRkU1RjA4MDNFMiIKLQkJCXRpdGxlICAgICAgCSIxMC4gRGlhZ25vc3RpY3MiCi0JCQl6b29tICAgICAgIAkxMDAKLQkJCW1heF9oZWlnaHQgCTI4MzUwCi0JCQltYXhfd2lkdGggIAkyMTYwMAotCQkJb3JpZ2luX3ggICAJMAotCQkJb3JpZ2luX3kgICAJMAotCQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6RE9NTm9kZSIgQDEyMjMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoNDAwLCAxMDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyMwotCQkJCSAgICBsb2NhdGlvbiAgIAkoNjYsIDk5MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk2NjgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiRE9NTm9kZSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjIzCi0JCQkJICAgIGxvY2F0aW9uICAgCSg2NiwgOTQwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkxMAotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTY2OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNDY3MTgzOQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjRBNTAxMTciCi0JCQkJd2lkdGggICAgICAJNjg2Ci0JCQkJaGVpZ2h0ICAgICAJMTkyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRERpYWdub3N0aWNTZXZlcml0eSIgQDEyMjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgNjU2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTIyNAotCQkJCSAgICBsb2NhdGlvbiAgIAkoODE4LCA1NDcpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDQ0Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWNTZXZlcml0eSIpCi0JCQkJc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjI0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg4MTgsIDQ5NykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJODQzMjEyNwotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjhBNzAzMkYiCi0JCQkJd2lkdGggICAgICAJNDYyCi0JCQkJaGVpZ2h0ICAgICAJMzQyCi0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDEyMjUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxOTIsIDExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjUKLQkJCQkgICAgbG9jYXRpb24gICAJKDU5LCA2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNjYKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkJCXdpZHRoICAgICAgCTI4NAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RDb25jcmV0ZUNvbXBvbmVudCIgQDEyMjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSg4OTYsIDExMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjYKLQkJCQkgICAgbG9jYXRpb24gICAJKDU0MCwgNjIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNzEzCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCXdpZHRoICAgICAgCTczMQotCQkJCWhlaWdodCAgICAgCTEyNQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTIyNwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgzODQsIDYwOCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMjcKLQkJCQkgICAgbG9jYXRpb24gICAJKDY0LCA0MDIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNjQwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRERpYWdub3N0aWMiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNUY5MTAwNDYiCi0JCQkJd2lkdGggICAgICAJNjU4Ci0JCQkJaGVpZ2h0ICAgICAJNDM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxNSIgQDEyMjgKLQkJCQlsb2NhdGlvbiAgIAkoMTQ0LCAyODMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzEwMzVGIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMTYiIEAxMjI5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTIyOAotCQkJCQlsb2NhdGlvbiAgIAkoLTEwODgsIC02NjEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTY0MzIwMUM2IgotCQkJCQljbGllbnQgICAgIAlAMTIyOAotCQkJCQlzdXBwbGllciAgIAlAMTIyNQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ0LCAyODMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQsIDE3NikpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImFsbERpYWdub3N0aWNzIiBAMTIzMAotCQkJCQlQYXJlbnRfVmlldyAJQDEyMjgKLQkJCQkJbG9jYXRpb24gICAJKC0xMDg4LCAtNjYxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgzMDksIDMzMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI3NgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIithbGxEaWFnbm9zdGljcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDQ4NTk4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkxNjUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2NDMyMDFDNyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMjgKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NCwgMjgzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ0LCAzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTIzMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDk2LCAzMjcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQyMDU2MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTEiIEAxMjMzCi0JCQkJbG9jYXRpb24gICAJKDEwMjgsIDQ0MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkZFNjIyNzAzQ0QiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIxMiIgQDEyMzQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjMzCi0JCQkJCWxvY2F0aW9uICAgCSgtMzk2LCAtNzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0JGRTYyMkIwMDYxIgotCQkJCQljbGllbnQgICAgIAlAMTIzMwotCQkJCQlzdXBwbGllciAgIAlAMTIyNwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyOCwgNDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzEzLCA0NDApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb21wb25lbnRzIiBAMTIzNQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzMKLQkJCQkJbG9jYXRpb24gICAJKC0zOTYsIC03MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTIzNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjM1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoOTM4LCAyMzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrY29tcG9uZW50cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODI5MTgxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxNTEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjJCMDA2QyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzMKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjYKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTAyOCwgNDQwKQotCQkJCQkgICAgKDEwODgsIDQ0MCkKLQkJCQkJICAgICgxMDg4LCAxNzQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTAyOCwgNDQwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4OCwgMTc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjM3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTQzLCAyMzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk3MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyMzg0OAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNTUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMTMiIEAxMjM4Ci0JCQkJbG9jYXRpb24gICAJKDY4OCwgMjgyKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCRkU2MjY5MDE2NSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjE0IiBAMTIzOQotCQkJCQlQYXJlbnRfVmlldyAJQDEyMzgKLQkJCQkJbG9jYXRpb24gICAJKDE2MCwgLTI3OCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQkZFNjI2QTAwMjYiCi0JCQkJCWNsaWVudCAgICAgCUAxMjM4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjI2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODgsIDI4MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDY4OCwgMTc0KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiZGlhZ25vc3RpY3MiIEAxMjQwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTIzOAotCQkJCQlsb2NhdGlvbiAgIAkoMTYwLCAtMjc4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjQxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjIsIDMzMCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI0MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitkaWFnbm9zdGljcyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDUyNjMyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkxMzQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNCRkU2MjZBMDAyNyIKLQkJCQkJY2xpZW50ICAgICAJQDEyMzgKLQkJCQkJc3VwcGxpZXIgICAJQDEyMjcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgMjgyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjg4LCAzOTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY0NSwgMzM1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNzAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4qIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTQ3MzcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjQzCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0Q0QzBGNEMwMUExIgotCQkJCWNsaWVudCAgICAgCUAxMjI3Ci0JCQkJc3VwcGxpZXIgICAJQDEyMjYKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg1NzUsIDM5MCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTc1LCAxNzQpKSkpCi0JCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiMTEuIFN1cHBsZW1lbnRhbCIKLQkJCXF1aWQgICAgICAgCSIzQzI4N0U0OTAxOUIiCi0JCQl0aXRsZSAgICAgIAkiMTEuIFN1cHBsZW1lbnRhbCIKLQkJCXpvb20gICAgICAgCTEwMAotCQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJCW1heF93aWR0aCAgCTIxNjAwCi0JCQlvcmlnaW5feCAgIAkwCi0JCQlvcmlnaW5feSAgIAkwCi0JCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24iIEAxMjQ0Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ2NCwgODE2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDc2MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4MzQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVEODQwMjkwIgotCQkJCXdpZHRoICAgICAgCTg1MgotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIgQDEyNDUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjExMiwgODgwKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0NQotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTczMSwgODI0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTc2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFRDJFMDE5MiIKLQkJCQl3aWR0aCAgICAgIAk3ODAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29uY3JldGVDb21wb25lbnQiIEAxMjQ2Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjg4LCAxMTIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIGl0YWxpY3MgICAgCVRSVUUpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjQ2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0OCwgNjApCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDgwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRENvbmNyZXRlQ29tcG9uZW50IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2QUQ3QjQwMDY1IgotCQkJCXdpZHRoICAgICAgCTQ5OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0REaWFnbm9zdGljIiBAMTI0NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzODQsIDExMikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDcKLQkJCQkgICAgbG9jYXRpb24gICAJKDIyMzYsIDYwKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTI5NgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0REaWFnbm9zdGljIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0JGRTVGOTEwMDQ2IgotCQkJCXdpZHRoICAgICAgCTMxNAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyMzciIEAxMjQ4Ci0JCQkJbG9jYXRpb24gICAJKDEzODIsIDg0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjg4MkM1MDEzNyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicHJpbWFyeUNvbXBvbmVudCIgQDEyNDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjQ4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjUwLCAtNTA4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUwCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNDkKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg3NTYsIDExNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitwcmltYXJ5Q29tcG9uZW50IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC43NDA4MjgKLQkJCQkJICAgIGhlaWdodCAgICAgCTMyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODJDNzAxMTMiCi0JCQkJCWNsaWVudCAgICAgCUAxMjQ4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjQ2Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgyLCA4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUzNywgODQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI0OQotCQkJCQkgICAgbG9jYXRpb24gICAJKDYyNCwgNTUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NzI2MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjM4IiBAMTI1MgotCQkJCQlQYXJlbnRfVmlldyAJQDEyNDgKLQkJCQkJbG9jYXRpb24gICAJKC0yNTAsIC01MDgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNTMKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1MgotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNTgsIDEyNikKLQkJCQkJICAgIGhpZGRlbiAgICAgCVRSVUUKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ1MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MgotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgyQzcwMTEyIgotCQkJCQljbGllbnQgICAgIAlAMTI0OAotCQkJCQlzdXBwbGllciAgIAlAMTI0NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM4MiwgODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjI3LCA4NCkpKSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERWxlbWVudERlY2xhcmF0aW9uIiBAMTI1NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIxNjAsIDY4OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTQKLQkJCQkgICAgbG9jYXRpb24gICAJKDE3NzgsIDYwNykKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk3NjQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERWxlbWVudERlY2xhcmF0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTc3OCwgNjY3KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkJICAgIG1heF93aWR0aCAgCTc2NAotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBlbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UgOiBib29sZWFuIgotCQkJCQkiKyBjaXJjdWxhciA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk3ODIKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNERmFjZXQiIEAxMjU1Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMyMCwgMTA3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTUKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMDAsIDk5MSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNERmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjZDMzU5NDAzRDIiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAwLCAxMDUxKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0NTkKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZmFjZXROYW1lIDogU3RyaW5nIgotCQkJCQkiKyBlZmZlY3RpdmVWYWx1ZSA6IFZhbHVlIikpCi0JCQkJd2lkdGggICAgICAJNDU4Ci0JCQkJaGVpZ2h0ICAgICAJMTg2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIiBAMTI1NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgNjI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcsIDU2OCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk4MDIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETW9kZWxHcm91cERlZmluaXRpb24iKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY2RUQ5QTAyMDUiCi0JCQkJY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjU2Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0NywgNjI4KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTgwNQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiKyBtb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk4MjAKLQkJCQloZWlnaHQgICAgIAkxMzYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETmFtZWRDb21wb25lbnQiIEAxMjU3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgMjg4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAwNSwgMTU3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ1NAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0ROYW1lZENvbXBvbmVudCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0NkQzMDNBNCIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNTcKLQkJCQkgICAgbG9jYXRpb24gICAJKDEwMDUsIDIxNykKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTQKLQkJCQkgICAgbWF4X3dpZHRoICAJMzkyCi0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGFsaWFzTmFtZSA6IFN0cmluZyIKLQkJCQkJIisgdVJJIDogU3RyaW5nIgotCQkJCQkiKyBhbGlhc1VSSSA6IFN0cmluZyIKLQkJCQkJIisgcU5hbWUgOiBTdHJpbmciKSkKLQkJCQl3aWR0aCAgICAgIAk0NzIKLQkJCQloZWlnaHQgICAgIAkyODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEUmVkZWZpbmFibGVDb21wb25lbnQiIEAxMjU4Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDMyMCwgMzUyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1OAotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDgsIDI5NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1NDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUmVkZWZpbmFibGVDb21wb25lbnQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxNjc3NzA4OAotCQkJCXF1aWR1ICAgICAgCSIzQjdGQ0E4QjAyMEIiCi0JCQkJd2lkdGggICAgICAJNTYyCi0JCQkJaGVpZ2h0ICAgICAJMTM2Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDEyNTkKLQkJCQlsb2NhdGlvbiAgIAkoMzIwLCA1MTApCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDEyNTgKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDMyMCwgNTEwKQotCQkJCSAgICAoMzIwLCA0MjApKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjYwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQzQwMDkwIgotCQkJCWNsaWVudCAgICAgCUAxMjU2Ci0JCQkJc3VwcGxpZXIgICAJQDEyNTgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MSwgNTU2KQotCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MSwgNTEwKQotCQkJCWRyYXdTdXBwbGllciAJQDEyNTkpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTI2MQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCN0ZDQUM4MDBEMiIKLQkJCQljbGllbnQgICAgIAlAMTI0NAotCQkJCXN1cHBsaWVyICAgCUAxMjU4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODc3LCA3NDgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDg3NywgNTEwKQotCQkJCWRyYXdTdXBwbGllciAJQDEyNTkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEluY2x1c2l2ZUZhY2V0IiBAMTI2MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDE4MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjYyCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAxLCAxNzYxKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzOAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhJbmNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODdEMDBEQSIKLQkJCQl3aWR0aCAgICAgIAk0NTYKLQkJCQloZWlnaHQgICAgIAkxMTkKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWluSW5jbHVzaXZlRmFjZXQiIEAxMjYzCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjcyLCAxNzc2KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMzUsIDE3MjkpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDc1Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1pbkluY2x1c2l2ZUZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc4ODcwMkM5IgotCQkJCXdpZHRoICAgICAgCTQ5MwotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNaW5FeGNsdXNpdmVGYWNldCIgQDEyNjQKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNzIsIDE5MzYpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY0Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzNSwgMTg4OSkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0NzUKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWluRXhjbHVzaXZlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzkyRDAwMEEiCi0JCQkJd2lkdGggICAgICAJNDkzCi0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1heEV4Y2x1c2l2ZUZhY2V0IiBAMTI2NQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMDQsIDE5NjgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMDczLCAxOTE3KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ2MgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNYXhFeGNsdXNpdmVGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3ODk2MDBDMiIKLQkJCQl3aWR0aCAgICAgIAk0ODAKLQkJCQloZWlnaHQgICAgIAkxMjYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ2FyZGluYWxpdHlGYWNldCIgQDEyNjYKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzM2LCAxNDI0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2NgotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNCwgMTM3MikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ2FyZGluYWxpdHlGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTVEMDNEMiIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQm91bmRlZEZhY2V0IiBAMTI2NwotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzNTIsIDEyNjQpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY3Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTYzLCAxMjEyKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTM3OAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RCb3VuZGVkRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzUxRDAzNDQiCi0JCQkJd2lkdGggICAgICAJMzk2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE9yZGVyZWRGYWNldCIgQDEyNjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMjQsIDEzOTIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjY4Ci0JCQkJICAgIGxvY2F0aW9uICAgCSg0MywgMTM0MCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNET3JkZXJlZEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2Qzc0REQwMjQ4IgotCQkJCXdpZHRoICAgICAgCTM4MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0ROdW1lcmljRmFjZXQiIEAxMjY5Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjQwLCAxMjMyKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI2OQotCQkJCSAgICBsb2NhdGlvbiAgIAkoNDksIDExNzgpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJMzgyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE51bWVyaWNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NTk1MDIwNiIKLQkJCQl3aWR0aCAgICAgIAk0MDAKLQkJCQloZWlnaHQgICAgIAkxMzIKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNETWF4RmFjZXQiIEAxMjcwCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMzNiwgMTYxNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzAKLQkJCQkgICAgbG9jYXRpb24gICAJKDIxMzUsIDE1MzUpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDAyCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRE1heEZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0MwQTFDRUIwMTBFIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjEzNSwgMTU5NSkKLQkJCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCQkgICAgbWF4X3dpZHRoICAJNDA1Ci0JCQkJICAgIGNvbXBhcnRtZW50SXRlbXMgCShsaXN0IENvbXBhcnRtZW50Ci0JCQkJCSIrIGluY2x1c2l2ZSA6IGJvb2xlYW4iCi0JCQkJCSIrIGV4Y2x1c2l2ZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEV2hpdGVTcGFjZUZhY2V0IiBAMTI3MQotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDIzMjAsIDIyODgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjcxCi0JCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMjM2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQzNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RXaGl0ZVNwYWNlRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzg0NjAxQjciCi0JCQkJd2lkdGggICAgICAJNDU0Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMjcyCi0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjMwNCwgMjYyNCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzIKLQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzQsIDI1NzIpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNDYwCi0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTREZyYWN0aW9uRGlnaXRzRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzlCRTAyRUUiCi0JCQkJd2lkdGggICAgICAJNDc4Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFBhdHRlcm5GYWNldCIgQDEyNzMKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzY4LCAyMTI4KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3MwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjE5NiwgMjA3NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGF0dGVybkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBREIwMjZDIgotCQkJCXdpZHRoICAgICAgCTM2MgotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbnVtZXJhdGlvbkZhY2V0IiBAMTI3NAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI1NiwgMjA5NikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzQKLQkJCQkgICAgbG9jYXRpb24gICAJKDM2LCAyMDQ0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQ0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RFbnVtZXJhdGlvbkZhY2V0IikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2QzZBQ0UwMTQxIgotCQkJCXdpZHRoICAgICAgCTQ1OAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RMZW5ndGhGYWNldCIgQDEyNzUKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMDgsIDIyNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc1Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjIyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkzNDAKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzc2MjAwRTciCi0JCQkJd2lkdGggICAgICAJMzU4Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkZhY2V0IiBAMTI3NgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMTU4NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgaXRhbGljcyAgICAJVFJVRSkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAxNTAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwNAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5GYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNDMEExQ0RFMDM3QyIKLQkJCQljb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzYKLQkJCQkgICAgbG9jYXRpb24gICAJKDM4LCAxNTYzKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk0MDUKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgaW5jbHVzaXZlIDogYm9vbGVhbiIKLQkJCQkJIisgZXhjbHVzaXZlIDogYm9vbGVhbiIpKQotCQkJCXdpZHRoICAgICAgCTQyMgotCQkJCWhlaWdodCAgICAgCTE4NgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RNYXhMZW5ndGhGYWNldCIgQDEyNzcKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyMzIwLCAyNDY0KQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI3NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjExMSwgMjQxMikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MTgKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNETWF4TGVuZ3RoRmFjZXQiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjZDNzdDNzAxNDYiCi0JCQkJd2lkdGggICAgICAJNDM2Ci0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRE1pbkxlbmd0aEZhY2V0IiBAMTI3OAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDI0MCwgMjQ0OCkKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyNzgKLQkJCQkgICAgbG9jYXRpb24gICAJKDM5LCAyMzk2KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQwMgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RNaW5MZW5ndGhGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3NzhDMDA2NSIKLQkJCQl3aWR0aCAgICAgIAk0MjAKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEVG90YWxEaWdpdHNGYWNldCIgQDEyNzkKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDI2MDgpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjc5Ci0JCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgMjU1NikKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk0MDQKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEVG90YWxEaWdpdHNGYWNldCIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJcXVpZHUgICAgICAJIjNCNkM3OUEwMDIwRSIKLQkJCQl3aWR0aCAgICAgIAk0MjIKLQkJCQloZWlnaHQgICAgIAkxMjgKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OnhzZDo6WFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIiBAMTI4MAotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDkyOCwgMTE1MikKLQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODAKLQkJCQkgICAgbG9jYXRpb24gICAJKDY2NywgMTEwMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAk1MjIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCODIwMzFBIgotCQkJCXdpZHRoICAgICAgCTU0MAotCQkJCWhlaWdodCAgICAgCTEyOAotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RQYXJ0aWNsZSIgQDEyODEKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkJCWxvY2F0aW9uICAgCSgxNzYsIDEwNzIpCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgxCi0JCQkJICAgIGxvY2F0aW9uICAgCSg1MCwgMTAyMCkKLQkJCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCSAgICBtYXhfd2lkdGggIAkyNTIKLQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCSAgICBsYWJlbCAgICAgIAkiWFNEUGFydGljbGUiKQotCQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXF1aWR1ICAgICAgCSIzQjY4MkJCRDAxRjciCi0JCQkJd2lkdGggICAgICAJMjcwCi0JCQkJaGVpZ2h0ICAgICAJMTI4Ci0JCQkJYW5ub3RhdGlvbiAJOAotCQkJCWF1dG9SZXNpemUgCVRSVUUpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIiBAMTI4MgotCQkJCVNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCQkJU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJCQlJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCQkJbG9jYXRpb24gICAJKDEyMzIsIDEzNjApCi0JCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgyCi0JCQkJICAgIGxvY2F0aW9uICAgCSg5NDQsIDEzMDQpCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkgICAgbWF4X3dpZHRoICAJNTc2Ci0JCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkgICAgbGFiZWwgICAgICAJIlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCQlxdWlkdSAgICAgIAkiM0I2ODJCQTcwMDVEIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4MgotCQkJCSAgICBsb2NhdGlvbiAgIAkoOTQ0LCAxMzY0KQotCQkJCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU3NQotCQkJCSAgICBjb21wYXJ0bWVudEl0ZW1zIAkobGlzdCBDb21wYXJ0bWVudAotCQkJCQkiPDwwLi4qPj4gKyB2YWxpZEZhY2V0cyA6IFN0cmluZyIpKQotCQkJCXdpZHRoICAgICAgCTU5NAotCQkJCWhlaWdodCAgICAgCTEzNgotCQkJCWFubm90YXRpb24gCTgKLQkJCQlhdXRvUmVzaXplIAlUUlVFKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDkiIEAxMjgzCi0JCQkJbG9jYXRpb24gICAJKDE0NDYsIDEyMTgpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTQwMzBBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyb290VHlwZURlZmluaXRpb24iIEAxMjg0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI4MwotCQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAtNzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyODUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI4NAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1ODAsIDExNzMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNDgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcm9vdFR5cGVEZWZpbml0aW9uIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMy4yNjgyOTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTk5NzAwREQiCi0JCQkJCWNsaWVudCAgICAgCUAxMjgzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE0NDYsIDEyMTgpCi0JCQkJCSAgICAoMTQ4NywgMTIxOCkKLQkJCQkJICAgICgxNDg3LCAxMjkyKSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0NDYsIDEyMTgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxMjkyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjg2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyODQKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDM5LCAxMjU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMTg0MjExCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTAiIEAxMjg3Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI4MwotCQkJCQlsb2NhdGlvbiAgIAkoNTgyLCAtNzgpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE5OTcwMEU3IgotCQkJCQljbGllbnQgICAgIAlAMTI4MwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDQ2LCAxMjE4KQotCQkJCQkgICAgKDE0MDUsIDEyMTgpCi0JCQkJCSAgICAoMTQwNSwgMTI5MikpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDQ2LCAxMjE4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQwNSwgMTI5MikpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUzIiBAMTI4OAotCQkJCWxvY2F0aW9uICAgCSgxNzMzLCAxNTc1KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMDhEMDI1MiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjU0IiBAMTI4OQotCQkJCQlQYXJlbnRfVmlldyAJQDEyODgKLQkJCQkJbG9jYXRpb24gICAJKDkxNywgNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RTAwOTEiCi0JCQkJCWNsaWVudCAgICAgCUAxMjg4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE3MzMsIDE1NzUpCi0JCQkJCSAgICAoMTQ4NywgMTU3NSkKLQkJCQkJICAgICgxNDg3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MzMsIDE1NzUpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDg3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4RmFjZXQiIEAxMjkwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTI4OAotCQkJCQlsb2NhdGlvbiAgIAkoOTE3LCA3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjkxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzUxLCAxNTQxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjA0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wNDYyNDMKLQkJCQkJICAgIGhlaWdodCAgICAgCTM1Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4RTAwOUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMjg4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjcwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzMzLCAxNTc1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNiwgMTU3NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMjkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA0MiwgMTUzNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzg5MTU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MAotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI1NSIgQDEyOTMKLQkJCQlsb2NhdGlvbiAgIAkoMTU4NywgMTc5MykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQjAzOTYiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI1NiIgQDEyOTQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMjkzCi0JCQkJCWxvY2F0aW9uICAgCSg3MDcsIC0zMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBBQzAzQzkiCi0JCQkJCWNsaWVudCAgICAgCUAxMjkzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1ODcsIDE3OTMpCi0JCQkJCSAgICAoMTQ0NywgMTc5MykKLQkJCQkJICAgICgxNDQ3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDQ3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4SW5jbHVzaXZlRmFjZXQiIEAxMjk1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI5MwotCQkJCQlsb2NhdGlvbiAgIAkoNzA3LCAtMzEpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTI5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MzcsIDE3NTEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNjAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWF4SW5jbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjI5ODQ0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEFDMDNENCIKLQkJCQkJY2xpZW50ICAgICAJQDEyOTMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1ODcsIDE3OTMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDkyLCAxNzkzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDIwLCAxNzU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NTkxNTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjU3IiBAMTI5OAotCQkJCWxvY2F0aW9uICAgCSg5MzcsIDE3ODcpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQUYwMzM4IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTgiIEAxMjk5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTI5OAotCQkJCQlsb2NhdGlvbiAgIAkoNjE3LCAtNSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMDAxRjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMjk4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDkzNywgMTc4NykKLQkJCQkJICAgICg5OTcsIDE3ODcpCi0JCQkJCSAgICAoOTk3LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDkzNywgMTc4NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkluY2x1c2l2ZUZhY2V0IiBAMTMwMAotCQkJCQlQYXJlbnRfVmlldyAJQDEyOTgKLQkJCQkJbG9jYXRpb24gICAJKDYxNywgLTUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMwMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc5MiwgMTc0NSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM0OAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5JbmNsdXNpdmVGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzQ2MDYyCi0JCQkJCSAgICBoZWlnaHQgICAgIAk0MwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjAwMjAzIgotCQkJCQljbGllbnQgICAgIAlAMTI5OAotCQkJCQlzdXBwbGllciAgIAlAMTI2MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTM3LCAxNzg3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTE4LCAxNzg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1NzUsIDE3NDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg2Mzk2MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNTkiIEAxMzAzCi0JCQkJbG9jYXRpb24gICAJKDk4MSwgMTkzNykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCMzAyMDciCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI2MCIgQDEzMDQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzAzCi0JCQkJCWxvY2F0aW9uICAgCSg2NzcsIC03OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBCNDAxOTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzAzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDk4MSwgMTkzNykKLQkJCQkJICAgICgxMDQxLCAxOTM3KQotCQkJCQkgICAgKDEwNDEsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoOTgxLCAxOTM3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA0MSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkV4Y2x1c2l2ZUZhY2V0IiBAMTMwNQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMDMKLQkJCQkJbG9jYXRpb24gICAJKDY3NywgLTc5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MjMsIDE5MDApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkzNzIKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbWluRXhjbHVzaXZlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM0MTI1MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI0MDE5QSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMDMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjQKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDk4MSwgMTkzNykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDUxOCwgMTkzNykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMwNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzA1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTg5LCAxODk3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NDY2NTIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjYxIiBAMTMwOAotCQkJCWxvY2F0aW9uICAgCSgxNDY5LCAxOTUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEI2MDI4RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYyIiBAMTMwOQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMDgKLQkJCQkJbG9jYXRpb24gICAJKDYyMSwgLTk1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEI3MDIxNyIKLQkJCQkJY2xpZW50ICAgICAJQDEzMDgKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ2OSwgMTk1MykKLQkJCQkJICAgICgxNDAwLCAxOTUzKQotCQkJCQkgICAgKDE0MDAsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0MDAsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJtYXhFeGNsdXNpdmVGYWNldCIgQDEzMTAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzA4Ci0JCQkJCWxvY2F0aW9uICAgCSg2MjEsIC05NSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY0NiwgMTkxMykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM4NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittYXhFeGNsdXNpdmVGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMjk4MDk3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAk0MQotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQjcwMjIxIgotCQkJCQljbGllbnQgICAgIAlAMTMwOAotCQkJCQlzdXBwbGllciAgIAlAMTI2NQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ2OSwgMTk1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjQsIDE5NTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMTIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMxMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NjEsIDE5MTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgyNzIzNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjMiIEAxMzEzCi0JCQkJbG9jYXRpb24gICAJKDExMjIsIDIxODApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkMwMDUxIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjQiIEAxMzE0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMxMwotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI0NiIKLQkJCQkJY2xpZW50ICAgICAJQDEzMTMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExMjIsIDIxODApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIyLCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibGVuZ3RoRmFjZXQiIEAxMzE1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMxMwotCQkJCQlsb2NhdGlvbiAgIAkoLTMxOCwgNjI4KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4MDQsIDIyMDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNDAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbGVuZ3RoRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ3NTQ3MgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEJDMDI1MCIKLQkJCQkJY2xpZW50ICAgICAJQDEzMTMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzUKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTEyMiwgMjE4MCkKLQkJCQkJICAgICgxMTIyLCAyMjQwKQotCQkJCQkgICAgKDM4NywgMjI0MCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMTgwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzg3LCAyMjQwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzE3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg0NzEsIDIyMDQpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5NTU5NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjciIEAxMzE4Ci0JCQkJbG9jYXRpb24gICAJKDEwODQsIDE5ODkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzIwMjFEIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjgiIEAxMzE5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMxOAotCQkJCQlsb2NhdGlvbiAgIAkoLTEzODAsIDQzNykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDMzAwQUIiCi0JCQkJCWNsaWVudCAgICAgCUAxMzE4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDg0LCAxOTg5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA4NCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVudW1lcmF0aW9uRmFjZXRzIiBAMTMyMAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMTgKLQkJCQkJbG9jYXRpb24gICAJKC0xMzgwLCA0MzcpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDgzNywgMjAxNikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTM3MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlbnVtZXJhdGlvbkZhY2V0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNDY1ODU3Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzMwMEFDIgotCQkJCQljbGllbnQgICAgIAlAMTMxOAotCQkJCQlzdXBwbGllciAgIAlAMTI3NAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMDg0LCAxOTg5KQotCQkJCQkgICAgKDEwODQsIDIwNDkpCi0JCQkJCSAgICAoNDg1LCAyMDQ5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEwODQsIDE5ODkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0ODUsIDIwNDkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDU4MywgMjAyMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODUxMjkwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkyOQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI2OSIgQDEzMjMKLQkJCQlsb2NhdGlvbiAgIAkoMTQ1MSwgMjA3NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDNTAxNTkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI3MCIgQDEzMjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzIzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTUyNSwgNTM4KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM2MDBCMCIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTQ1MSwgMjA3NCkKLQkJCQkJICAgICgxMzYyLCAyMDc0KQotCQkJCQkgICAgKDEzNjIsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJwYXR0ZXJuRmFjZXRzIiBAMTMyNQotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjMKLQkJCQkJbG9jYXRpb24gICAJKC0xNTI1LCA1MzgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE3MjAsIDIwMzgpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrcGF0dGVybkZhY2V0cyIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMzY3MjIzCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzYwMEJBIgotCQkJCQljbGllbnQgICAgIAlAMTMyMwotCQkJCQlzdXBwbGllciAgIAlAMTI3MwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTQ1MSwgMjA3NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxODcsIDIwNzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMyNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzIsIDIwMzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLioiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjcwODY0OQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzEiIEAxMzI4Ci0JCQkJbG9jYXRpb24gICAJKDE4MjcsIDE0MDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzgwMkE3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzIiIEAxMzI5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMyOAotCQkJCQlsb2NhdGlvbiAgIAkoLTExNDksIC00NzIpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQzkwMUVBIgotCQkJCQljbGllbnQgICAgIAlAMTMyOAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTgyNywgMTQwMCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjksIDE0MDApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjYXJkaW5hbGl0eUZhY2V0IiBAMTMzMAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMjgKLQkJCQkJbG9jYXRpb24gICAJKC0xMTQ5LCAtNDcyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxODQ3LCAxMzU4KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NhcmRpbmFsaXR5RmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA3MTczMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEM5MDFGNSIKLQkJCQkJY2xpZW50ICAgICAJQDEzMjgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjYKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE4MjcsIDE0MDApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTI1LCAxNDAwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzMyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMDgzLCAxMzU3KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NjM0MjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjgxIiBAMTMzMwotCQkJCWxvY2F0aW9uICAgCSgxMjYyLCAyNDEzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMERCMDM3NyIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjgyIiBAMTMzNAotCQkJCQlQYXJlbnRfVmlldyAJQDEzMzMKLQkJCQkJbG9jYXRpb24gICAJKC03ODYsIDMwMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEQzAzNUEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzMzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYyLCAyNDEzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2MiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImZyYWN0aW9uRGlnaXRzRmFjZXQiIEAxMzM1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMzMwotCQkJCQlsb2NhdGlvbiAgIAkoLTc4NiwgMzAxKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzM2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjA4LCAyNTU2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzYwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2ZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUzNzM5MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERDMDM2NCIKLQkJCQkJY2xpZW50ICAgICAJQDEzMzMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMjQxMykKLQkJCQkJICAgICgxMjYyLCAyNTk2KQotCQkJCQkgICAgKDIwNjUsIDI1OTYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQxMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI1OTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTMzNQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5NzksIDI1NTYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxMzg4NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODUiIEAxMzM4Ci0JCQkJbG9jYXRpb24gICAJKDE4NDEsIDEzMDYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTMwMEQ5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyODYiIEAxMzM5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTMzOAotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzhFIgotCQkJCQljbGllbnQgICAgIAlAMTMzOAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE1MjksIDEzMDYpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJib3VuZGVkRmFjZXQiIEAxMzQwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTMzOAotCQkJCQlsb2NhdGlvbiAgIAkoLTExMzUsIC03OTApCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE4MzIsIDEyNzApCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYm91bmRlZEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDMxNzQ2Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRTQwMzk4IgotCQkJCQljbGllbnQgICAgIAlAMTMzOAotCQkJCQlzdXBwbGllciAgIAlAMTI2NwotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTg0MSwgMTMwNikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxNTQsIDEzMDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwNzcsIDEyNzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc1NDcxNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNjUiIEAxMzQzCi0JCQkJbG9jYXRpb24gICAJKDEzMjgsIDIxODYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQkYwMThDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNjYiIEAxMzQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM0MwotCQkJCQlsb2NhdGlvbiAgIAkoLTY0MCwgNjM0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA2QiIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzMjgsIDIxODYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzI4LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAid2hpdGVTcGFjZUZhY2V0IiBAMTM0NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNDMKLQkJCQkJbG9jYXRpb24gICAJKC02NDAsIDYzNCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzQ1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY3MywgMjIwNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIit3aGl0ZVNwYWNlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjQ5MDkwOQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEMwMDA3NSIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMyOCwgMjE4NikKLQkJCQkJICAgICgxMzI4LCAyMjQ2KQotCQkJCQkgICAgKDIwOTMsIDIyNDYpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjE4NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIyNDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM0NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMzMsIDIyMDMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNjc2MwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyODMiIEAxMzQ4Ci0JCQkJbG9jYXRpb24gICAJKDY3NCwgMTM5MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAwNDgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4NCIgQDEzNDkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzQ4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTg1NCwgLTcwNikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBERjAzQjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMzQ4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2NzQsIDEzOTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MzUsIDEzOTApKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJvcmRlcmVkRmFjZXQiIEAxMzUwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTM0OAotCQkJCQlsb2NhdGlvbiAgIAkoLTE4NTQsIC03MDYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDY1OCwgMTM1MykKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTI2NAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitvcmRlcmVkRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjA2MTUzOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMERGMDNDMyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNDgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDY3NCwgMTM5MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTM5MCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzUwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCAxMzU1KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC42MzQ2MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTM2Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjczIiBAMTM1MwotCQkJCWxvY2F0aW9uICAgCSg2ODcsIDEyOTYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0IwMzlDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzQiIEAxMzU0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM1MwotCQkJCQlsb2NhdGlvbiAgIAkoLTE4MDksIC01NzYpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0MwM0QwIgotCQkJCQljbGllbnQgICAgIAlAMTM1MwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNjg3LCAxMjk2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTM1LCAxMjk2KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibnVtZXJpY0ZhY2V0IiBAMTM1NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNTMKLQkJCQkJbG9jYXRpb24gICAJKC0xODA5LCAtNTc2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzU2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg2NjgsIDEyNTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyNzYKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrbnVtZXJpY0ZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4wODA5NzIKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBDQzAzRDEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzUzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjY5Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2ODcsIDEyOTYpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDAsIDEyOTYpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNTcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM1NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDUwNiwgMTI2MCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNzM2ODQyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4NyIgQDEzNTgKLQkJCQlsb2NhdGlvbiAgIAkoMTY4OSwgMTY2MikKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NDAxRUMiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4OCIgQDEzNTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgzLCAtMzU0KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNDQ1MDM2MCIKLQkJCQkJY2xpZW50ICAgICAJQDEzNTgKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTY4OSwgMTY2MikKLQkJCQkJICAgICgxNDg3LCAxNjYyKQotCQkJCQkgICAgKDE0ODcsIDE0MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTY4OSwgMTY2MikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODcsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNYXhGYWNldCIgQDEzNjAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzU4Ci0JCQkJCWxvY2F0aW9uICAgCSgtMTgzLCAtMzU0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzYxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNzY5LCAxNjIzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1heEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4xODIwNTEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjQ0NTAzNkEiCi0JCQkJCWNsaWVudCAgICAgCUAxMzU4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjcwCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjg5LCAxNjYyKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjEyNiwgMTY2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzYwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjA0NCwgMTYyNykKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuODE1Mzg1Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNgotCQkJCQkgICAgb3JpZW50YXRpb24gCTApKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI4OSIgQDEzNjMKLQkJCQlsb2NhdGlvbiAgIAkoMTMyOCwgMjI1OCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU0RjAxNDUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI5MCIgQDEzNjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjU1MDAzOEMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzYzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzI4LCAyMjU4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTMyOCwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVdoaXRlU3BhY2VGYWNldCIgQDEzNjUKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzYzCi0JCQkJCWxvY2F0aW9uICAgCSgtMTA3MiwgLTQ2MikKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM2NgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzY1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTY4NSwgMjI4OCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQ5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVXaGl0ZVNwYWNlRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwODU0MQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNTUwMDM5NiIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzEKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTMyOCwgMjI1OCkKLQkJCQkJICAgICgxMzI4LCAyMzI0KQotCQkJCQkgICAgKDIwOTMsIDIzMjQpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTMyOCwgMjI1OCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwOTMsIDIzMjQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNjcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM2NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDksIDIyOTMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5ODgxNwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzIKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTEiIEAxMzY4Ci0JCQkJbG9jYXRpb24gICAJKDEyOTcsIDIzNjYpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI1QzQwMTFDIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTIiIEAxMzY5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM2OAotCQkJCQlsb2NhdGlvbiAgIAkoLTYwNywgLTcyMikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjVDNTAyMEQiCi0JCQkJCWNsaWVudCAgICAgCUAxMzY4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjk3LCAyMzY2KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1heExlbmd0aEZhY2V0IiBAMTM3MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzNjgKLQkJCQkJbG9jYXRpb24gICAJKC02MDcsIC03MjIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDE2NTcsIDI0NjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0ODAKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlTWF4TGVuZ3RoRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUyNjkwNgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzcKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNUM1MDIxNyIKLQkJCQkJY2xpZW50ICAgICAJQDEzNjgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI5NywgMjM2NikKLQkJCQkJICAgICgxMjk3LCAyNDk5KQotCQkJCQkgICAgKDIxMDIsIDI0OTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI5NywgMjM2NikKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIxMDIsIDI0OTkpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3MAotCQkJCQkgICAgbG9jYXRpb24gICAJKDIwMDcsIDI0NzEpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjg5OTMwOAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjkKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTMiIEAxMzczCi0JCQkJbG9jYXRpb24gICAJKDEyNjIsIDI0NDkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkEwMEFBIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTQiIEAxMzc0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM3MwotCQkJCQlsb2NhdGlvbiAgIAkoLTExNzAsIC04MTUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2MkIwMTM4IgotCQkJCQljbGllbnQgICAgIAlAMTM3MwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjIsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVGcmFjdGlvbkRpZ2l0c0ZhY2V0IiBAMTM3NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzNzMKLQkJCQkJbG9jYXRpb24gICAJKC0xMTcwLCAtODE1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzc2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzNzUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjQwLCAyNjM0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNTI4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUZyYWN0aW9uRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NTMxNQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNjJCMDE0MiIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzIKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTI2MiwgMjQ0OSkKLQkJCQkJICAgICgxMjYyLCAyNjY4KQotCQkJCQkgICAgKDIwNjUsIDI2NjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2MiwgMjQ0OSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDIwNjUsIDI2NjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM3NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDE5ODksIDI2MjkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkyNjQ4NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyOTUiIEAxMzc4Ci0JCQkJbG9jYXRpb24gICAJKDE0MjIsIDIxNTkpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjAwM0E2IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyOTYiIEAxMzc5Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM3OAotCQkJCQlsb2NhdGlvbiAgIAkoLTc3MCwgLTEzMTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI2QjEwMzExIgotCQkJCQljbGllbnQgICAgIAlAMTM3OAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNDIyLCAyMTU5KQotCQkJCQkgICAgKDEzNjIsIDIxNTkpCi0JCQkJCSAgICAoMTM2MiwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDIyLCAyMTU5KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM2MiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVBhdHRlcm5GYWNldCIgQDEzODAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzc4Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzcwLCAtMTMxMykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzgwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyNywgMjEyNSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTQwOAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVQYXR0ZXJuRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjM5OTA5MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzUKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCNkIxMDMxMiIKLQkJCQkJY2xpZW50ICAgICAJQDEzNzgKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzMKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE0MjIsIDIxNTkpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTg3LCAyMTU5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzODAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgyMTAyLCAyMTE5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44ODkyMjYKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk3IiBAMTM4MwotCQkJCWxvY2F0aW9uICAgCSgxMDg0LCAyMDgzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCN0NBMDI2QiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjk4IiBAMTM4NAotCQkJCQlQYXJlbnRfVmlldyAJQDEzODMKLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI3Q0IwMTg2IgotCQkJCQljbGllbnQgICAgIAlAMTM4MwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMjA4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwODQsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IiBAMTM4NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODMKLQkJCQkJbG9jYXRpb24gICAJKDgyOCwgLTEzNzMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzODYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM4NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDgyMiwgMjEwMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTUwNAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVFbnVtZXJhdGlvbkZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40ODg2MTkKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjdDQjAxOTAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzgzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc0Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEwODQsIDIwODMpCi0JCQkJCSAgICAoMTA4NCwgMjE0MykKLQkJCQkJICAgICg0ODUsIDIxNDMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA4NCwgMjA4MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ4NSwgMjE0MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzg1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTMxLCAyMTAwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MzE3MTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAzIiBAMTM4OAotCQkJCWxvY2F0aW9uICAgCSgxMTIyLCAyMjQxKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCOERDMDA1MiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzA0IiBAMTM4OQotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTQ3OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAzQjkiCi0JCQkJCWNsaWVudCAgICAgCUAxMzg4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTIyLCAyMjQxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyMiwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZUxlbmd0aEZhY2V0IiBAMTM5MAotCQkJCQlQYXJlbnRfVmlldyAJQDEzODgKLQkJCQkJbG9jYXRpb24gICAJKDg2NiwgLTQ3OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5MQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODAwLCAyMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzk2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZUxlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40OTE3MzEKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjhEQzAzQzMiCi0JCQkJCWNsaWVudCAgICAgCUAxMzg4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc1Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExMjIsIDIyNDEpCi0JCQkJCSAgICAoMTEyMiwgMjMxOCkKLQkJCQkJICAgICgzODcsIDIzMTgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTEyMiwgMjI0MSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDM4NywgMjMxOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM5MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxMzkwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNDcwLCAyMjc5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44OTg1NjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjUxIiBAMTM5MwotCQkJCWxvY2F0aW9uICAgCSg3NzMsIDE1NjUpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODUwMjVCIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNTIiIEAxMzk0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTM5MwotCQkJCQlsb2NhdGlvbiAgIAkoNDY5LCAxMykKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjA4NjAyNzAiCi0JCQkJCWNsaWVudCAgICAgCUAxMzkzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDc3MywgMTU2NSkKLQkJCQkJICAgICg5NTksIDE1NjUpCi0JCQkJCSAgICAoOTU5LCAxNDI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDc3MywgMTU2NSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDk1OSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkZhY2V0IiBAMTM5NQotCQkJCQlQYXJlbnRfVmlldyAJQDEzOTMKLQkJCQkJbG9jYXRpb24gICAJKDQ2OSwgMTMpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOTYKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTM5NQotCQkJCQkgICAgbG9jYXRpb24gICAJKDc1MywgMTUzMikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE5MgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIittaW5GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMDYzMDkxCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwODYwMjdBIgotCQkJCQljbGllbnQgICAgIAlAMTM5MwotCQkJCQlzdXBwbGllciAgIAlAMTI3NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoNzczLCAxNTY1KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNTY1KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzk3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDEzOTUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzQsIDE1MjMpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjc0NjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDMKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzMDUiIEAxMzk4Ci0JCQkJbG9jYXRpb24gICAJKDgxNiwgMTY1MCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjk3MDAxREIiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwNiIgQDEzOTkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk4Ci0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMENGIgotCQkJCQljbGllbnQgICAgIAlAMTM5OAotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICg4MTYsIDE2NTApCi0JCQkJCSAgICAoOTU5LCAxNjUwKQotCQkJCQkgICAgKDk1OSwgMTQyOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg4MTYsIDE2NTApCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5NTksIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJlZmZlY3RpdmVNaW5GYWNldCIgQDE0MDAKLQkJCQkJUGFyZW50X1ZpZXcgCUAxMzk4Ci0JCQkJCWxvY2F0aW9uICAgCSg0OTYsIC0zMzQpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MDEKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDc2NCwgMTYxNCkKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTMzNgotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIitlZmZlY3RpdmVNaW5GYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuMTQxNjE4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI5NzEwMEQ5IgotCQkJCQljbGllbnQgICAgIAlAMTM5OAotCQkJCQlzdXBwbGllciAgIAlAMTI3NgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoODE2LCAxNjUwKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAxNjUwKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDAyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MjMsIDE2MDYpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgwMjc0MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDQKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNzUiIEAxNDAzCi0JCQkJbG9jYXRpb24gICAJKDEyOTcsIDIzMjEpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwQ0YwMTk5IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNzYiIEAxNDA0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTcxOSwgNDk3KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQyMDA4NSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MDMKLQkJCQkJc3VwcGxpZXIgICAJQDEyODIKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjk3LCAxNDI4KSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAibWF4TGVuZ3RoRmFjZXQiIEAxNDA1Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQwMwotCQkJCQlsb2NhdGlvbiAgIAkoLTcxOSwgNDk3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA2Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNjMwLCAyMzgwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzM2Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21heExlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC40NzIyNTUKLQkJCQkJICAgIGhlaWdodCAgICAgCTMwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEMjAwOEYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDAzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDEyOTcsIDIzMjEpCi0JCQkJCSAgICAoMTI5NywgMjQwOSkKLQkJCQkJICAgICgyMTAyLCAyNDA5KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDIzMjEpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTAyLCAyNDA5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDA3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MDUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxOTk0LCAyMzY2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC44NzkyMDgKLQkJCQkJICAgIGhlaWdodCAgICAgCTQ0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjc3IiBAMTQwOAotCQkJCWxvY2F0aW9uICAgCSgxMTU5LCAyMjczKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ1MDBDNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjc4IiBAMTQwOQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDgKLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMUQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDA4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTU5LCAyMjczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE1OSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIm1pbkxlbmd0aEZhY2V0IiBAMTQxMAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MDgKLQkJCQkJbG9jYXRpb24gICAJKC0yODEsIDQ0OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMQotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU3LCAyMzcyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzI0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK21pbkxlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41MTk1MjcKLQkJCQkJICAgIGhlaWdodCAgICAgCTM4Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBENjAwMjciCi0JCQkJCWNsaWVudCAgICAgCUAxNDA4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjc4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExNTksIDIyNzMpCi0JCQkJCSAgICAoMTE1OSwgMjQwOSkKLQkJCQkJICAgICg0NTAsIDI0MDkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE1OSwgMjI3MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQwOSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDEwCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTIzLCAyMzY5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTM2MTAKLQkJCQkJICAgIGhlaWdodCAgICAgCTQxCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzAxIiBAMTQxMwotCQkJCWxvY2F0aW9uICAgCSgxMTk3LCAyMzM0KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCODk4MDE2RCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAyIiBAMTQxNAotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTMKLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNTYiCi0JCQkJCWNsaWVudCAgICAgCUAxNDEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTk3LCAyMzM0KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE5NywgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IiBAMTQxNQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTMKLQkJCQkJbG9jYXRpb24gICAJKDk0MSwgLTYxMCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODU2LCAyNDU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJNDY4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2VmZmVjdGl2ZU1pbkxlbmd0aEZhY2V0IgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41NTI2MDQKLQkJCQkJICAgIGhlaWdodCAgICAgCTQwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg5OTAwNjAiCi0JCQkJCWNsaWVudCAgICAgCUAxNDEzCi0JCQkJCXN1cHBsaWVyICAgCUAxMjc4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDExOTcsIDIzMzQpCi0JCQkJCSAgICAoMTE5NywgMjQ5MykKLQkJCQkJICAgICg0NTAsIDI0OTMpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTE5NywgMjMzNCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDQ1MCwgMjQ5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQxNwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDE1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoNTI3LCAyNDUxKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIwLi4xIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC45MTYwNDcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjk5IiBAMTQxOAotCQkJCWxvY2F0aW9uICAgCSgxMjMxLCAyNDM4KQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhCODQwMDA2MiIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMzAwIiBAMTQxOQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MTgKLQkJCQkJbG9jYXRpb24gICAJKDg2MywgLTc0NikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4Qjg0MTAwMUQiCi0JCQkJCWNsaWVudCAgICAgCUAxNDE4Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgyCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyNDM4KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIzMSwgMTQyOCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImVmZmVjdGl2ZVRvdGFsRGlnaXRzRmFjZXQiIEAxNDIwCi0JCQkJCVBhcmVudF9WaWV3IAlAMTQxOAotCQkJCQlsb2NhdGlvbiAgIAkoODYzLCAtNzQ2KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIxCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjAKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg4NTksIDI2MzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAk0NjgKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrZWZmZWN0aXZlVG90YWxEaWdpdHNGYWNldCIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuNTk3MDMwCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEI4NDEwMDI3IgotCQkJCQljbGllbnQgICAgIAlAMTQxOAotCQkJCQlzdXBwbGllciAgIAlAMTI3OQotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxMjMxLCAyNDM4KQotCQkJCQkgICAgKDEyMzEsIDI2NjgpCi0JCQkJCSAgICAoNDUxLCAyNjY4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEyMzEsIDI0MzgpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NTEsIDI2NjgpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MjIKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyMAotCQkJCQkgICAgbG9jYXRpb24gICAJKDUzNCwgMjYzMSkKLQkJCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE1Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQkJICAgIHBjdERpc3QgICAgCTAuOTE4ODEyCi0JCQkJCSAgICBoZWlnaHQgICAgIAkzOAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI3OSIgQDE0MjMKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMSwgMjM5NykKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QjBEODAwREUiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4MCIgQDE0MjQKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDIzCi0JCQkJCWxvY2F0aW9uICAgCSgtMjA5LCAyNTMpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEIwRDgwM0NEIgotCQkJCQljbGllbnQgICAgIAlAMTQyMwotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTIzMSwgMjM5NykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEyMzEsIDE0MjgpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJ0b3RhbERpZ2l0c0ZhY2V0IiBAMTQyNQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MjMKLQkJCQkJbG9jYXRpb24gICAJKC0yMDksIDI1MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQyNgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDI1Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODUzLCAyNTUwKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3RvdGFsRGlnaXRzRmFjZXQiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjU4NTU2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhCMEQ4MDNENyIKLQkJCQkJY2xpZW50ICAgICAJQDE0MjMKLQkJCQkJc3VwcGxpZXIgICAJQDEyNzkKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTIzMSwgMjM5NykKLQkJCQkJICAgICgxMjMxLCAyNTg3KQotCQkJCQkgICAgKDQ1MSwgMjU4NykpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMxLCAyMzk3KQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDUxLCAyNTg3KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDI3Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MjUKLQkJCQkJICAgIGxvY2F0aW9uICAgCSg1MzUsIDI1NjApCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkxNDY0NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkpKQotCQkJICAgIChvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDE0MjgKLQkJCQlTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkJCVN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCQkJSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMTIzMiwgNzY4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQyOAotCQkJCSAgICBsb2NhdGlvbiAgIAkoMTAxOSwgNTc0KQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTQyNgotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RUeXBlRGVmaW5pdGlvbiIpCi0JCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTE2Nzc3MDg4Ci0JCQkJcXVpZHUgICAgICAJIjNCNjZFQ0QzMDJBOSIKLQkJCQl3aWR0aCAgICAgIAk0NDQKLQkJCQloZWlnaHQgICAgIAk0MTMKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQyOQotCQkJCWxvY2F0aW9uICAgCSgxMjA5LCAxMDY1KQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJICAgICgxMjA5LCAxMDY1KQotCQkJCSAgICAoMTIwOSwgOTc0KSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzNSIgQDE0MzAKLQkJCQlsb2NhdGlvbiAgIAkoMTA5MCwgMTAzMSkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGNTAzRDkiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgInJvb3RUeXBlRGVmaW5pdGlvbiIgQDE0MzEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDMwCi0JCQkJCWxvY2F0aW9uICAgCSgzMjIsIC0yNSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQzMgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDMxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoODk3LCAxMDM2KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzQ4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jvb3RUeXBlRGVmaW5pdGlvbiIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjA5ODc2NQotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTk0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4ODBGOTAwM0MiCi0JCQkJCWNsaWVudCAgICAgCUAxNDMwCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDkwLCAxMDMxKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5MCwgOTc0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDMzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTIxLCAxMDM0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDYxNzI4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMQotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyMzYiIEAxNDM0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQzMAotCQkJCQlsb2NhdGlvbiAgIAkoMzIyLCAtMjUpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyODgwRjkwMDQ2IgotCQkJCQljbGllbnQgICAgIAlAMTQzMAotCQkJCQlzdXBwbGllciAgIAlAMTI4MAotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTA5MCwgMTAzMSkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTAsIDEwODgpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0MSIgQDE0MzUKLQkJCQlsb2NhdGlvbiAgIAkoMTUzOCwgODczKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBNkRCMDFFNSIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAicm9vdFR5cGUiIEAxNDM2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQzNQotCQkJCQlsb2NhdGlvbiAgIAkoMTc4LCAxMDUpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MzcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQzNgotCQkJCQkgICAgbG9jYXRpb24gICAJKDE1NTgsIDc5MikKLQkJCQkJICAgIGFuY2hvciAgICAgCTEKLQkJCQkJICAgIGFuY2hvcl9sb2MgCTEKLQkJCQkJICAgIG5saW5lcyAgICAgCTEKLQkJCQkJICAgIG1heF93aWR0aCAgCTE4MAotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIityb290VHlwZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0xLjc2MDg3MAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMjAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERCIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzUKLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzOCwgODczKQotCQkJCQkgICAgKDE1MzgsIDkxOSkKLQkJCQkJICAgICgxNDU0LCA5MTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgODczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgOTE5KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDM4Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0MzYKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTA5LCA4NzUpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjAxNjY2NwotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzAKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQyIiBAMTQzOQotCQkJCQlQYXJlbnRfVmlldyAJQDE0MzUKLQkJCQkJbG9jYXRpb24gICAJKDE3OCwgMTA1KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNkREMDNERSIKLQkJCQkJY2xpZW50ICAgICAJQDE0MzUKLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTUzOCwgODczKQotCQkJCQkgICAgKDE1MzgsIDgyOCkKLQkJCQkJICAgICgxNDU0LCA4MjgpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTUzOCwgODczKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ1NCwgODI4KSkpKQotCQkJICAgIChvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNDMiIEAxNDQwCi0JCQkJbG9jYXRpb24gICAJKDE1MzUsIDY4NCkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxMjAxMDgiCi0JCQkJcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgImJhc2VUeXBlIiBAMTQ0MQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDAKLQkJCQkJbG9jYXRpb24gICAJKDE3NSwgLTg0KQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDQyCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NDEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNTU5LCA1OTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkxCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkyMDQKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIrYmFzZVR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMS45NzcyNzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTI0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTcxNDAxNTEiCi0JCQkJCWNsaWVudCAgICAgCUAxNDQwCi0JCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE1MzUsIDY4NCkKLQkJCQkJICAgICgxNTM1LCA3MjgpCi0JCQkJCSAgICAoMTQ1NCwgNzI4KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1MzUsIDY4NCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NTQsIDcyOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0MwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTUwNiwgNjgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJLTAuMDI3Nzc4Ci0JCQkJCSAgICBoZWlnaHQgICAgIAkzMAotCQkJCQkgICAgb3JpZW50YXRpb24gCTEpKQotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQyNDQiIEAxNDQ0Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ0MAotCQkJCQlsb2NhdGlvbiAgIAkoMTc1LCAtODQpCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3MTQwMTVCIgotCQkJCQljbGllbnQgICAgIAlAMTQ0MAotCQkJCQlzdXBwbGllciAgIAlAMTQyOAotCQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkJICAgICgxNTM1LCA2ODQpCi0JCQkJCSAgICAoMTUzNSwgNjQxKQotCQkJCQkgICAgKDE0NTQsIDY0MSkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTM1LCA2ODQpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDU0LCA2NDEpKSkpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDI0NyIgQDE0NDUKLQkJCQlsb2NhdGlvbiAgIAkoNjEzLCA5NDApCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3RUQwM0MwIgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJjb21wbGV4VHlwZSIgQDE0NDYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDQ1Ci0JCQkJCWxvY2F0aW9uICAgCSgtNzQ3LCAxNzIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NDcKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ0NgotCQkJCQkgICAgbG9jYXRpb24gICAJKDQ2NSwgOTgzKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjY0Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK2NvbXBsZXhUeXBlIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC4zNzMwNTcKLQkJCQkJICAgIGhlaWdodCAgICAgCTQzCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMTciCi0JCQkJCWNsaWVudCAgICAgCUAxNDQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAxMjgxCi0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDYxMywgOTQwKQotCQkJCQkgICAgKDI4NCwgOTQwKQotCQkJCQkgICAgKDI4NCwgMTAwOCkpCi0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTMsIDk0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDI4NCwgMTAwOCkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ0OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDQ2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMjI0LCA5NzIpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjkwOTMyMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJNjEKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQ4IiBAMTQ0OQotCQkJCQlQYXJlbnRfVmlldyAJQDE0NDUKLQkJCQkJbG9jYXRpb24gICAJKC03NDcsIDE3MikKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI4QTdGNDAxMjEiCi0JCQkJCWNsaWVudCAgICAgCUAxNDQ1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg2MTMsIDk0MCkKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEwMTAsIDk0MCkpKSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDUwCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0I3RkNBQjEwMDREIgotCQkJCWNsaWVudCAgICAgCUAxNDI4Ci0JCQkJc3VwcGxpZXIgICAJQDEyNTgKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTEyLCA1NjIpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExMTIsIDUxMCkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxMjU5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NTEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQkEwRDAxOTAxRjEiCi0JCQkJY2xpZW50ICAgICAJQDEyODAKLQkJCQlzdXBwbGllciAgIAlAMTQyOAotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDExNDYsIDEwODgpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDExNDYsIDEwNjUpCi0JCQkJZHJhd1N1cHBsaWVyIAlAMTQyOSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjQ1IiBAMTQ1MgotCQkJCWxvY2F0aW9uICAgCSgxMzYyLCAxMTMzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBNzRCMDE3OCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAic2ltcGxlVHlwZSIgQDE0NTMKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUyCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDU0Ci0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NTMKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxNDk5LCAxMDk0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMjQwCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3NpbXBsZVR5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yNDY3NTMKLQkJCQkJICAgIGhlaWdodCAgICAgCTEzNwotCQkJCQkgICAgb3JpZW50YXRpb24gCTApCi0JCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCQlxdWlkdSAgICAgIAkiM0MyOEE3NEQwMTdCIgotCQkJCQljbGllbnQgICAgIAlAMTQ1MgotCQkJCQlzdXBwbGllciAgIAlAMTI4MgotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTM2MiwgMTEzMykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDEzNjIsIDEyOTIpCi0JCQkJCWxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NTUKLQkJCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1MwotCQkJCQkgICAgbG9jYXRpb24gICAJKDEzMjEsIDEwOTcpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAktMC4yMjcyNzMKLQkJCQkJICAgIGhlaWdodCAgICAgCTQyCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI0NiIgQDE0NTYKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDUyCi0JCQkJCWxvY2F0aW9uICAgCSgtMTU4LCAtMTYzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBNzREMDE4NSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NTIKLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDEzNjIsIDExMzMpCi0JCQkJCXRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzYyLCA5NzQpKSkpCi0JCQkgICAgKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREZlYXR1cmUiIEAxNDU3Ci0JCQkJU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJCQlTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkJCUluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJCQlsb2NhdGlvbiAgIAkoMjI3MiwgMzg0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBpdGFsaWNzICAgIAlUUlVFKQotCQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzAzKQotCQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJICAgIG1heF93aWR0aCAgCTU0MAotCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJICAgIGxhYmVsICAgICAgCSJYU0RGZWF0dXJlIikKLQkJCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJZmlsbF9jb2xvciAJMTY3NzcwODgKLQkJCQlxdWlkdSAgICAgIAkiM0I2OUI1MzcwMjZDIgotCQkJCWNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ1NwotCQkJCSAgICBsb2NhdGlvbiAgIAkoMjAwMiwgMzYzKQotCQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJICAgIGFuY2hvciAgICAgCTIKLQkJCQkgICAgbmxpbmVzICAgICAJMgotCQkJCSAgICBtYXhfd2lkdGggIAk1NTAKLQkJCQkgICAgY29tcGFydG1lbnRJdGVtcyAJKGxpc3QgQ29tcGFydG1lbnQKLQkJCQkJIisgZ2xvYmFsIDogYm9vbGVhbiIKLQkJCQkJIisgZmVhdHVyZVJlZmVyZW5jZSA6IGJvb2xlYW4iKSkKLQkJCQl3aWR0aCAgICAgIAk1NTgKLQkJCQloZWlnaHQgICAgIAkxODYKLQkJCQlhbm5vdGF0aW9uIAk4Ci0JCQkJYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJCSAgICAob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMTQ1OAotCQkJCWxvY2F0aW9uICAgCSgyMjYyLCA1NjgpCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkJc3VwcGxpZXIgICAJQDE0NTcKLQkJCQl2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkgICAgKDIyNjIsIDU2OCkKLQkJCQkgICAgKDIyNjIsIDQ3NykpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NTkKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5RURFRTAxQkYiCi0JCQkJY2xpZW50ICAgICAJQDEyNTQKLQkJCQlzdXBwbGllciAgIAlAMTQ1NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDIzNDYsIDU5NSkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjM0NiwgNTY4KQotCQkJCWRyYXdTdXBwbGllciAJQDE0NTgpCi0JCQkgICAgKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzOSIgQDE0NjAKLQkJCQlsb2NhdGlvbiAgIAkoMTU1MywgNDUzKQotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNDMjhBMEYyMDFBNCIKLQkJCQlyb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAidHlwZSIgQDE0NjEKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDYwCi0JCQkJCWxvY2F0aW9uICAgCSg4MDEsIDI5MykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2MgotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDYxCi0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTMzMSwgNDk5KQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTA4Ci0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3R5cGUiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjUwNjI2NgotCQkJCQkgICAgaGVpZ2h0ICAgICAJNDYKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkwKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBMEYzMDJFNSIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjAKLQkJCQkJc3VwcGxpZXIgICAJQDE0MjgKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTU1MywgNDUzKQotCQkJCQkgICAgKDEyMjIsIDQ1MykKLQkJCQkJICAgICgxMjIyLCA1NjIpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTU1MywgNDUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIyMiwgNTYyKQotCQkJCQlsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYzCi0JCQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NjEKLQkJCQkJICAgIGxvY2F0aW9uICAgCSgxMTg1LCA0NzkpCi0JCQkJCSAgICBhbmNob3IgICAgIAkyCi0JCQkJCSAgICBhbmNob3JfbG9jIAkxCi0JCQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkJCSAgICBtYXhfd2lkdGggIAkxNQotCQkJCQkgICAganVzdGlmeSAgICAJMAotCQkJCQkgICAgbGFiZWwgICAgICAJIjEiCi0JCQkJCSAgICBwY3REaXN0ICAgIAkwLjgxMjAzMAotCQkJCQkgICAgaGVpZ2h0ICAgICAJMzgKLQkJCQkJICAgIG9yaWVudGF0aW9uIAkxKSkKLQkJCQkgICAgKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQwIiBAMTQ2NAotCQkJCQlQYXJlbnRfVmlldyAJQDE0NjAKLQkJCQkJbG9jYXRpb24gICAJKDgwMSwgMjkzKQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjhBMEYzMDJGMCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjAKLQkJCQkJc3VwcGxpZXIgICAJQDE0NTcKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE1NTMsIDQ1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDQ1MykpKSkKLQkJCSAgICAob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMxIiBAMTQ2NQotCQkJCWxvY2F0aW9uICAgCSgxOTA4LCAzNTMpCi0JCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQlxdWlkdSAgICAgIAkiM0MyOTAxMDYwMkQ3IgotCQkJCXJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJCSAgICAob2JqZWN0IFJvbGVWaWV3ICJyZXNvbHZlZEZlYXR1cmUiIEAxNDY2Ci0JCQkJCVBhcmVudF9WaWV3IAlAMTQ2NQotCQkJCQlsb2NhdGlvbiAgIAkoLTI2OCwgLTE1OSkKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2NwotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTcyOSwgMzUyKQotCQkJCQkgICAgYW5jaG9yICAgICAJMQotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMzEyCi0JCQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkJCSAgICBsYWJlbCAgICAgIAkiK3Jlc29sdmVkRmVhdHVyZSIKLQkJCQkJICAgIHBjdERpc3QgICAgCS0wLjAyOTQxMgotCQkJCQkgICAgaGVpZ2h0ICAgICAJMTgwCi0JCQkJCSAgICBvcmllbnRhdGlvbiAJMSkKLQkJCQkJc3RlcmVvdHlwZSAJVFJVRQotCQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJCXF1aWR1ICAgICAgCSIzQzI5MDEwQjAwMEUiCi0JCQkJCWNsaWVudCAgICAgCUAxNDY1Ci0JCQkJCXN1cHBsaWVyICAgCUAxNDU3Ci0JCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCQkgICAgKDE5MDgsIDM1MykKLQkJCQkJICAgICgxOTA4LCAzODcpCi0JCQkJCSAgICAoMTk5MywgMzg3KSkKLQkJCQkJbGluZV9zdHlsZSAJMwotCQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE5MDgsIDM1MykKLQkJCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE5OTMsIDM4NykKLQkJCQkJbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQ2OAotCQkJCQkgICAgUGFyZW50X1ZpZXcgCUAxNDY2Ci0JCQkJCSAgICBsb2NhdGlvbiAgIAkoMTk0NSwgMzU0KQotCQkJCQkgICAgYW5jaG9yICAgICAJMgotCQkJCQkgICAgYW5jaG9yX2xvYyAJMQotCQkJCQkgICAgbmxpbmVzICAgICAJMQotCQkJCQkgICAgbWF4X3dpZHRoICAJMTUKLQkJCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCQkJICAgIGxhYmVsICAgICAgCSIxIgotCQkJCQkgICAgcGN0RGlzdCAgICAJMC41OTY2MzkKLQkJCQkJICAgIGhlaWdodCAgICAgCTM0Ci0JCQkJCSAgICBvcmllbnRhdGlvbiAJMCkpCi0JCQkJICAgIChvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDEzMiIgQDE0NjkKLQkJCQkJUGFyZW50X1ZpZXcgCUAxNDY1Ci0JCQkJCWxvY2F0aW9uICAgCSgtMjY4LCAtMTU5KQotCQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJCWxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCQkJcXVpZHUgICAgICAJIjNDMjkwMTBCMDAxOCIKLQkJCQkJY2xpZW50ICAgICAJQDE0NjUKLQkJCQkJc3VwcGxpZXIgICAJQDE0NTcKLQkJCQkJdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJCSAgICAoMTkwOCwgMzUzKQotCQkJCQkgICAgKDE5MDgsIDMxOSkKLQkJCQkJICAgICgxOTkzLCAzMTkpKQotCQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTkwOCwgMzUzKQotCQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTk5MywgMzE5KSkpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzAKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyNjAzNkQiCi0JCQkJY2xpZW50ICAgICAJQDEyNTgKLQkJCQlzdXBwbGllciAgIAlAMTI1NwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoNDk0LCAyODQpCi0JCQkJICAgICg0OTQsIDI0NCkKLQkJCQkgICAgKDk5NiwgMjQ0KSkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSg0OTQsIDI4NCkKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTk2LCAyNDQpKQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzEKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQjY5QjdEQzAxOTMiCi0JCQkJY2xpZW50ICAgICAJQDEyNDUKLQkJCQlzdXBwbGllciAgIAlAMTQ1NwotCQkJCWxpbmVfc3R5bGUgCTMKLQkJCQlvcmlnaW5fYXR0YWNobWVudCAJKDE3MTgsIDgxMikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcxOCwgNTY4KQotCQkJCWRyYXdTdXBwbGllciAJQDE0NTgpCi0JCQkgICAgKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3MgotCQkJCXN0ZXJlb3R5cGUgCVRSVUUKLQkJCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkJcXVpZHUgICAgICAJIjNCNjg0QTEzMDJBMiIKLQkJCQljbGllbnQgICAgIAlAMTI4MgotCQkJCXN1cHBsaWVyICAgCUAxNDI4Ci0JCQkJbGluZV9zdHlsZSAJMwotCQkJCW9yaWdpbl9hdHRhY2htZW50IAkoMTI2NSwgMTI5MikKLQkJCQl0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI2NSwgMTA2NSkKLQkJCQlkcmF3U3VwcGxpZXIgCUAxNDI5KQotCQkJICAgIChvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0NzMKLQkJCQlzdGVyZW90eXBlIAlUUlVFCi0JCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJCXF1aWR1ICAgICAgCSIzQzI5MEEyQzAzMDciCi0JCQkJY2xpZW50ICAgICAJQDE0NTcKLQkJCQlzdXBwbGllciAgIAlAMTI1NwotCQkJCXZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSAgICAoMjE0NywgMjkxKQotCQkJCSAgICAoMjE0NywgMjQ0KQotCQkJCSAgICAoMTQ2OCwgMjQ0KSkKLQkJCQlsaW5lX3N0eWxlIAkzCi0JCQkJb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTQ3LCAyOTEpCi0JCQkJdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDI0NCkpKSkpKSkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNzYiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3Ojp3c2RsIiBAMTQ3NAotCQkJbG9jYXRpb24gICAJKDI3MiwgMjU2KQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0NzQKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTI4LCAxNzIpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMjg4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJ3c2RsIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzQURGQjhFNTAyMUUiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OnhzZCIgQDE0NzUKLQkJCWxvY2F0aW9uICAgCSgyNzIsIDU3NikKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDc1Ci0JCQkgICAgbG9jYXRpb24gICAJKDEyOCwgNDkyKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkieHNkIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzOUFCREM2RjAxQUEiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyIKLQlxdWlkICAgICAgIAkiMzlFMjdGMDgwMDY1IgotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNzciCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3NlcwotCXF1aWQgICAgICAgCSIzOUUyN0YwODAwNjYiCi0JUHJvY3NORGV2cyAJKGxpc3QKLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyIKLQkJcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2OCIKLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMKLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEREwiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlIgotCQkJdmFsdWUgICAgICAJKCJEYXRhQmFzZVNldCIgODAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiQU5TSSIKLQkJCQl2YWx1ZSAgICAgIAk4MDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJPcmFjbGUiCi0JCQkJdmFsdWUgICAgICAJODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCQluYW1lICAgICAgIAkiU1FMU2VydmVyIgotCQkJCXZhbHVlICAgICAgCTgwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQkJbmFtZSAgICAgICAJIlN5YmFzZSIKLQkJCQl2YWx1ZSAgICAgIAk4MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRERMIgotCQkJCW5hbWUgICAgICAgCSJXYXRjb20iCi0JCQkJdmFsdWUgICAgICAJODA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJJZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVl8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lIgotCQkJdmFsdWUgICAgICAJIlRfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkluaGVyaXRTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiX1YiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQmFzZVZpZXdzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJWQVJDSEFSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiTnVsbHNPSyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRETCIKLQkJCW5hbWUgICAgICAgCSJVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRERMIgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEREwiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRETCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSURMRWxlbWVudCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJRExTcGVjaWZpY2F0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiSURMU3BlY1NldCIgMjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiSURMU3BlY1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlR5cGVkZWYiCi0JCQkJdmFsdWUgICAgICAJNTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJFeGNlcHRpb24iCi0JCQkJdmFsdWUgICAgICAJNjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTdHJ1Y3QiCi0JCQkJdmFsdWUgICAgICAJNTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJVbmlvbiIKLQkJCQl2YWx1ZSAgICAgIAk4MSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5zZXJ2aWNlcy9zcmMvcm9zZS93c2RsTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJRExNb2R1bGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLnNlcnZpY2VzL3NyYy9yb3NlL3dzZGxNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIlJhaXNlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIgotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJIYXNSZWxUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIklETCIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIklETCIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSURMIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJJREwiCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIklETCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJJREwiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSURMIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSURMIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIm1fIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJInNfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEltcG9ydHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIgotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTkwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMTkwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiCi0JCQkJdmFsdWUgICAgICAJMTkwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIgotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJBRlRFUiIKLQkJCQl2YWx1ZSAgICAgIAkxODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSIKLQkJCQl2YWx1ZSAgICAgIAkxODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlJPVyIKLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCIKLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCIKLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIjIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIjYiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUmVwb3NpdG9yeSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcmVzZXJ2ZVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSIKLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIgotCQkJCXZhbHVlICAgICAgCTIwNikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvY29tLmlibS5ldG9vbHMuY3RjLnNlcnZpY2VzL3NyYy9yb3NlL3dzZGxNZGwubWRsLCBjdGMsIGlibWN0YyIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmN0Yy5zZXJ2aWNlcy9zcmMvcm9zZS93c2RsTWRsLm1kbCwgY3RjLCBpYm1jdGMiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzT25lV2F5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmFpc2VzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIgotCQkJdmFsdWUgICAgICAJKCJIYXNSZWxUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRSb2xlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGVudCIKLQkJCXZhbHVlICAgICAgCTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5IgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAk1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiCi0JCQkJdmFsdWUgICAgICAJNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiU0NDIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUeXBlTGliSW1wb3J0ZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTIxMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25CYXNlIgotCQkJdmFsdWUgICAgICAJIjAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQ29tcGFyZSIKLQkJCXZhbHVlICAgICAgCSgiQ29tcGFyZVNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNyZWF0YWJsZSIKLQkJCXZhbHVlICAgICAgCSgiQ3JlYXRhYmxlU2V0IiAyMjEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbml0aWFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUZXJtaW5hdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbkNsYXNzIgotCQkJdmFsdWUgICAgICAJIkNvbGxlY3Rpb24iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiQmluYXJ5IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlRleHQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkb3BlcmF0aW9uIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkxpYnJhcnlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIklzU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZSRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTGV0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVMZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50c0RlbGVnYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkpCi0JcXVpZCAgICAgICAJIjM5RTI3RjA4MDA2NyIpKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9tb2RlbC9jb20uaWJtLmV0b29scy5XU0RMLmNhdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvY29tLmlibS5ldG9vbHMuV1NETC5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MjdiZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9tb2RlbC9jb20uaWJtLmV0b29scy5XU0RMLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDY5OTcgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDIKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA0LjUuODA1NGEiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBDbGFzc19DYXRlZ29yeSAid3NkbCIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIHF1aWQgICAgICAgCSIzQURGQjhFNTAyMUUiCi0gICAgZG9jdW1lbnRhdGlvbiAJCi18VGhlIFdTREwgbW9kZWwgY29udGFpbnMgY2xhc3NlcyBmb3IgdGhlIFdlYiBTZXJ2aWNlcyBEZXNjcmlwdGlvbiBMYW5ndWFnZSAoV1NETCkuCi18Ci18V1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50LgotfAotfFdTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuCi18Ci18VGhlIG1vZGVsIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbXMsIG5hbWVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGNoYXB0ZXJzIGluIHRoZSBXU0RMIDEuMSBzcGVjaWZpY2F0aW9uIChodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL05PVEUtd3NkbC0yMDAxMDMxNSkKLXwtIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZQotfC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtCi18LSAyLjEuMyBFeHRlbnNpYmlsaXR5LCBzaG93cyB0aGUgV1NETCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbQotfC0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETAotfC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLgotfAotfFRoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLgotICAgIAotICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkob2JqZWN0IENsYXNzICJXU0RMRWxlbWVudCIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVDNkEzMDJERCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbGFuZ3VhZ2UgZWxlbWVudC4iCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEVuY2xvc2luZ0RlZmluaXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0NEMTUyOTYwMEM4IgotCQkgICAgcmVzdWx0ICAgICAJIkRlZmluaXRpb24iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0QxNTJCODAzNDciCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZGVmaW5pdGlvbiIKLQkJCSAgICB0eXBlICAgICAgIAkiRGVmaW5pdGlvbiIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImRvY3VtZW50YXRpb25FbGVtZW50IgotCQkgICAgcXVpZCAgICAgICAJIjNDQ0U0NDM2MDJBMyIKLQkJICAgIHR5cGUgICAgICAgCSJET01FbGVtZW50IikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudCIKLQkJICAgIHF1aWQgICAgICAgCSIzRjk3REJEMzAyMDciCi0JCSAgICB0eXBlICAgICAgIAkiRE9NRWxlbWVudCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIKLQkgICAgYWJzdHJhY3QgICAJVFJVRSkKLQkob2JqZWN0IENsYXNzICJQb3J0VHlwZSIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydFR5cGUgZWxlbWVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4xIGFuZCBhbiBJbnRlcmZhY2UgY29tcG9uZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIuIEEgcG9ydCB0eXBlIG9yIEludGVyZmFjZSBpcyBhIG5hbWVkIHNldCBvZiBhYnN0cmFjdCBvcGVyYXRpb25zIGFuZCB0aGUgYWJzdHJhY3QgbWVzc2FnZXMgaW52b2x2ZWQuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUM5QjcwMTUwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjZGMUZEODAxOUYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJUG9ydFR5cGUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUI0ODhFMDAyMyIKLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInVuZGVmaW5lZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQkRERjFFMzAxRTUiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInByb3h5IgotCQkgICAgcXVpZCAgICAgICAJIjNEMThDREVCMDMxNiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVzb3VyY2VVUkkiCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOEQ0RkQwMUJBIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0FENUM4MEQwM0NFIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudC4gQSBXU0RMIG9wZXJhdGlvbiBpcyBhbiBhYnN0cmFjdCBkZXNjcmlwdGlvbiBvZiBhbiBhY3Rpb24gc3VwcG9ydGVkIGJ5IGEgc2VydmljZS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUU5REU5ODAwM0MiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGNkYxRkUyMDE3MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE3NzYwMEQxIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInN0eWxlIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUI0NzI2MDFBQyIKLQkJICAgIHR5cGUgICAgICAgCSJPcGVyYXRpb25UeXBlIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQkREOTY0MzAwNEMiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCRERGMjM1MDAzRSIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOENFMjIwMUFEIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzRDE4RDUyMDAxMUIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJNZXNzYWdlIgotCSAgICBxdWlkICAgICAgIAkiM0FENUM5NTkwMDc4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBtZXNzYWdlIGVsZW1lbnQuIEEgV1NETCBtZXNzYWdlIGlzIGFuIGFic3RyYWN0LCB0eXBlZCBkZWZpbml0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGNvbW11bmljYXRlZC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDA1NTAxQzQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODRBOEQxMDJCQSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklNZXNzYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDg3QzAxRkUiCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0JEREYxRDIwMjI2IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJICAgIHF1aWQgICAgICAgCSIzRDE4Q0U0QjAyQjAiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNEMThENTQyMDBGMSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlBhcnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE5NkQwMkYxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5N0UyMzAyMzciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQkNFNzBCNzAzQzgiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZWxlbWVudE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEIwODcwM0RCIgotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZU5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0JDRTcwQzMwM0M1IgotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJCaW5kaW5nIgotCSAgICBxdWlkICAgICAgIAkiM0FENUQyODYwMjYxIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUZBMEYwMkYwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUJDNjAyMTkiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicU5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQjQ4OTkwMTRCIgotCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidW5kZWZpbmVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCRERGMUY0MDFBMyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicHJveHkiCi0JCSAgICBxdWlkICAgICAgIAkiM0QxOENFNkQwMTUxIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXNvdXJjZVVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzRDE4RDRERjAzNUMiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJCaW5kaW5nT3BlcmF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FENjAwOTIwMkY3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QURFNDAxREMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ09wZXJhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5QzRDQjAxOTkiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJTZXJ2aWNlIgotCSAgICBxdWlkICAgICAgIAkiM0FENUQ4RjAwMkY4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBzZXJ2aWNlIGVsZW1lbnQuIEEgc2VydmljZSBncm91cHMgYSBzZXQgb2YgcmVsYXRlZCBwb3J0cyB0b2dldGhlci4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RkEyMDAyNUUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODU5NTRFMDFCNCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklTZXJ2aWNlIgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJxTmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVCNDhBNDAxNTEiCi0JCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ1bmRlZmluZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0JEREYyMEQwMjAzIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcm94eSIKLQkJICAgIHF1aWQgICAgICAgCSIzRDE4RDQ4MTAyMjAiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJlc291cmNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNEMThENEM1MDFFMiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlBvcnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZyIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNBRDYwMENCMDBBQSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NTk1NDUwMkM5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ5QTAwMzkxIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjEyNDAyQUIiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCRERGNTM1MDJDMyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJyZXF1aXJlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQUY5NTQzQzAwNzMiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVsZW1lbnRUeXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQotCQkgICAgcXVpZCAgICAgICAJIjNCODVCMjFBMDI3MSIKLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiRGVmaW5pdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGEgV1NETCBkb2N1bWVudC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklEZWZpbml0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMUQ5MDE0MiIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXREb2N1bWVudCIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0QxNEZDMjAxMkIiCi0JCSAgICByZXN1bHQgICAgIAkiRE9NRG9jdW1lbnQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0NEMTUwREUwMUU3IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImRvY3VtZW50IgotCQkJICAgIHR5cGUgICAgICAgCSJET01Eb2N1bWVudCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRhcmdldE5hbWVzcGFjZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTQ3NDAwNEUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibG9jYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDAzNTJCN0MwMzk2IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInFOYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUI0ODU3MDJGNSIKLQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImVuY29kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMDBEMDAwRCIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkltcG9ydCIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVFNEY5MDNERSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUVFNTgwMzdBIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjZGMjAwRDAzNDAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IgotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMjAyMDExOSIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRTY2hlbWEiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjcyQzEwMzc5IgotCQkgICAgcmVzdWx0ICAgICAJIlhTRFNjaGVtYSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRTY2hlbWEiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjcyQzEwMzk3IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInNjaGVtYSIKLQkJCSAgICB0eXBlICAgICAgIAkiWFNEU2NoZW1hIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZXNwYWNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNTBBMDAzNiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJsb2NhdGlvblVSSSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTUxNDAyMTEiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJFeHRlbnNpYmxlRWxlbWVudCIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIiBXU0RMIGFsbG93cyBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IChyZWZlcnJlZCB0byBoZXJlIGFzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMpIHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvaW50IG9mIGV4dGVuc2liaWxpdHkuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUZFM0MwM0Q0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6V1NETEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM2QTMwMkREIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzEyQzAzQ0QiCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMxNDcwMjk1IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImV4dEVsZW1lbnQiCi0JCQkgICAgdHlwZSAgICAgICAJIklFeHRlbnNpYmlsaXR5RWxlbWVudCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIgotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQotCShvYmplY3QgQ2xhc3MgIklucHV0IgotCSAgICBxdWlkICAgICAgIAkiM0FFMDc4OUYwMDU5IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50LiBBbiBpbnB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBpbnB1dCBvZiB0aGUgb3BlcmF0aW9uLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODVDNTA0MDI1RiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OldTRExFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDNkEzMDJERCIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0Y2NzcyMjgwMkU3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZVJlZmVyZW5jZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGNkYxRkVFMDMxRCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QTdFRTAwMTUiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIk91dHB1dCIKLQkgICAgcXVpZCAgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQuIEFuIG91dHB1dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIG9wZXJhdGlvbi4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzUwQzAzNUIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGNjc3MjM1MDBERCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjZGMUZGODAxQ0QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJT3V0cHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBODI5MDI3RCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiRmF1bHQiCi0JICAgIHF1aWQgICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUUxQzgyMDAyRjIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok1lc3NhZ2VSZWZlcmVuY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcxREIwMkRDIikKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjZGMjAwMjAwMkQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRmF1bHQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJCaW5kaW5nSW5wdXQiCi0JICAgIHF1aWQgICAgICAgCSIzQUUwOEE4MjAyRDQiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIGlucHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgaW5wdXQgb2YgdGhlIG9wZXJhdGlvbi4gIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFFMUIwMTEzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdJbnB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QURFQjAxMDAiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODVCNTlCMDA3MiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTNBNDAyMDMiCi0JCSAgICByZXN1bHQgICAgIAkiSUlucHV0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1M0I1MDNBMiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnB1dCIKLQkJCSAgICB0eXBlICAgICAgIAkiSUlucHV0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg1QzFFQTAyMEUiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJCaW5kaW5nT3V0cHV0IgotCSAgICBxdWlkICAgICAgIAkiM0FFMDhBOEYwMjhDIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTQzMDJBQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTIxMDExMSIpCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJsZUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZDRkEwMzNBIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE91dHB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTNEOTAwRjEiCi0JCSAgICByZXN1bHQgICAgIAkiSU91dHB1dCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRPdXRwdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUzRjEwMzI2IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm91dHB1dCIKLQkJCSAgICB0eXBlICAgICAgIAkiSU91dHB1dCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMyMDIwMEJFIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiQmluZGluZ0ZhdWx0IgotCSAgICBxdWlkICAgICAgIAkiM0FFMDhBOUUwM0E2IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBmYXVsdCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBIGZhdWx0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZmF1bHQgd2l0aCB0aGUgc2FtZSBuYW1lLiAiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQUUwOTM4NjAyQzkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nRmF1bHQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFFNEYwMEJEIikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NDEzMDM3RiIKLQkJICAgIHJlc3VsdCAgICAgCSJJRmF1bHQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0RmF1bHQiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjU0MjEwMTA5IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImZhdWx0IgotCQkJICAgIHR5cGUgICAgICAgCSJJRmF1bHQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYW1lIgotCQkgICAgcXVpZCAgICAgICAJIjNCODVCRjlFMDE0QSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIlFOYW1lIgotCSAgICBxdWlkICAgICAgIAkiM0FFOEVEMjIwMTQwIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIgotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NDlEQTkwMDNEIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiTmFtZXNwYWNlIgotCSAgICBxdWlkICAgICAgIAkiM0FFQTNDRDMwMDMwIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDI5MDFCMSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwcmVmaXgiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQTNEMzIwMjM2IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIpCi0JKG9iamVjdCBDbGFzcyAiT3BlcmF0aW9uVHlwZSIKLQkgICAgcXVpZCAgICAgICAJIjNBRUI0NzgyMDI0RiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18T05FX1dBWT0xCi18UkVRVUVTVF9SRVNQT05TRT0yCi18U09MSUNJVF9SRVNQT05TRT0zCi18Tk9USUZJQ0FUSU9OPTQKLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJkYXRhdHlwZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb25UeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODVDMzUzMDNFMyIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIklQb3J0VHlwZSIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBNUJFMDMzMSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5Qb3J0VHlwZSBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZE9wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkFDMTAxQ0EiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3BlcmF0aW9uIgotCQkJICAgIHR5cGUgICAgICAgCSJJT3BlcmF0aW9uIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QkFGMDFBNCIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImlucHV0TmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJvdXRwdXROYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJT3BlcmF0aW9uIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE9wZXJhdGlvbnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZCRjcwMzFBIgotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuUG9ydFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE2MzIwMDBEIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJT3BlcmF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiM0I4NEE3NzYwMEQxIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk9wZXJhdGlvbiBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2QzQyMDA2NSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJmYXVsdCIKLQkJCSAgICB0eXBlICAgICAgIAkiSUZhdWx0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmF1bHQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZDNTkwMjhGIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIklGYXVsdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGYXVsdHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZDNzEwMkIxIgotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UGFyYW1ldGVyT3JkZXJpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTZDODEwMUIwIgotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFBhcmFtZXRlck9yZGVyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2Qzk5MDMxRCIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJPcmRlciIKLQkJCSAgICB0eXBlICAgICAgIAkiSUxpc3QiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NTRFNTAxOEQiCi0JCSAgICByZXN1bHQgICAgIAkiSUlucHV0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldElucHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY2MkM0MDEwNyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnB1dCIKLQkJCSAgICB0eXBlICAgICAgIAkiSUlucHV0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0T3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY2MkU0MDA5NCIKLQkJICAgIHJlc3VsdCAgICAgCSJJT3V0cHV0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldE91dHB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQzg2NjJGMDAxRDIiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0IgotCQkJICAgIHR5cGUgICAgICAgCSJJT3V0cHV0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PcGVyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE3OTkwMTJCIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJSW5wdXQiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QTdFRTAwMTUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuSW5wdXQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY2MzMxMDBFRiIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY2MzQ3MDI3NyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJICAgIHR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE4MDAwMDM5IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJT3V0cHV0IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEE4MjkwMjdEIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjY0M0EwMzVEIgotCQkgICAgcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldE1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjY0NDUwMUM4IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkgICAgdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5PdXRwdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE4MzkwMUQ1IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJRmF1bHQiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QTg2MTAzMUQiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY2NDZBMDBCRCIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWVzc2FnZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY2NDc1MDEzMSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXNzYWdlIgotCQkJICAgIHR5cGUgICAgICAgCSJJTWVzc2FnZSIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuRmF1bHQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEE4NzEwMjA4IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJTWVzc2FnZSIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBOEFGMDA0RiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5NZXNzYWdlIG5vbi1NT0YgaW50ZXJmYWNlIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRQYXJ0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk3MjI0MDI3MyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJ0IgotCQkJICAgIHR5cGUgICAgICAgCSJJUGFydCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTcyM0QwMjMzIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIklQYXJ0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBhcnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk3MjU0MDI1RSIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE9yZGVyZWRQYXJ0cyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NzI2MTAyMEQiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFydE9yZGVyIgotCQkJICAgIHR5cGUgICAgICAgCSJJTGlzdCIpKQotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuTWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QThCQzAyNjAiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklQYXJ0IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEE5M0YwMUJFIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBhcnQgbm9uLU1PRiBpbnRlcmZhY2UiCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvbkF0dHJpYnV0ZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2ODg0NTAwNTIiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInZhbHVlIgotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkgICAgZXhjZXB0aW9ucyAJIldTRExFeGNlcHRpb24iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0M0NjhBMDEwMUMzIgotCQkgICAgcmVzdWx0ICAgICAJIklJdGVyYXRvciIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25BdHRyaWJ1dGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0M0NjhBMkQwMkQ1IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlFOYW1lIikpCi0JCSAgICByZXN1bHQgICAgIAkiUU5hbWUiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5QYXJ0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBOTUwMDIzMSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSVNlcnZpY2UiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUI0OTAyODciCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuU2VydmljZSBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZFBvcnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVENTYwMUQxIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBvcnQiCi0JCQkgICAgdHlwZSAgICAgICAJIklQb3J0IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVEQTIwMDM2IgotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NURCMDAxQkMiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiSVBvcnQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5TZXJ2aWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBQjVCMDAzRSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSVBvcnQiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUI4MDAzMjYiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydCBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUxRjMwMkI1IgotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEJpbmRpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUyNjMwMkYyIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmciCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5Qb3J0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBQjhDMDAxNiIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUJpbmRpbmciCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUJDNjAyMTkiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZyBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZEJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVGMTYwMTUzIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImJpbmRpbmdPcGVyYXRpb24iCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NUY1MDAwNjYiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJpbnB1dE5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAib3V0cHV0TmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ09wZXJhdGlvbnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTVGQTQwMUM1IgotCQkgICAgcmVzdWx0ICAgICAJIklMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBvcnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MkE5MDI4NCIKLQkJICAgIHJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0UG9ydFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUyQkUwMUE4IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBvcnRUeXBlIgotCQkJICAgIHR5cGUgICAgICAgCSJJUG9ydFR5cGUiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFCQ0YwMzAyIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJQmluZGluZ09wZXJhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBREMwMDA3MiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZ0ZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk2MEJDMDA0MSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nRmF1bHQiCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nRmF1bHQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nRmF1bHQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTYwRDkwMDlEIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm5hbWUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nRmF1bHQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0QmluZGluZ0ZhdWx0cyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NjBGQzAwNjEiCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRPcGVyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjUzMkQwMDE3IgotCQkgICAgcmVzdWx0ICAgICAJIklPcGVyYXRpb24iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0T3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1MzNGMDM3QiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJvcGVyYXRpb24iCi0JCQkgICAgdHlwZSAgICAgICAJIklPcGVyYXRpb24iKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nSW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjU1MDkwMERBIgotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nSW5wdXQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0QmluZGluZ0lucHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NTFEMDA3RiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nSW5wdXQiCi0JCQkgICAgdHlwZSAgICAgICAJIklCaW5kaW5nSW5wdXQiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NTM0MDM0OSIKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRCaW5kaW5nT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODY1NTQ3MDJBNiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJiaW5kaW5nT3V0cHV0IgotCQkJICAgIHR5cGUgICAgICAgCSJJQmluZGluZ091dHB1dCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QURDQjAyMUMiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklCaW5kaW5nSW5wdXQiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QURFQjAxMDAiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFERkUwMDBEIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJQmluZGluZ091dHB1dCIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBRTIxMDExMSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRTJEMDA1MCIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUJpbmRpbmdGYXVsdCIKLQkgICAgcXVpZCAgICAgICAJIjNCODRBRTRGMDBCRCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkJpbmRpbmdGYXVsdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUU1RjAwMkEiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIkRPTUVsZW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QUYzMjAzREIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy53M2MuZG9tLkVsZW1lbnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFGNTYwMjkyIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQjg0QjEyNDAyQUIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIgotCSAgICBzdGVyZW90eXBlIAkiSW50ZXJmYWNlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEIxMzUwM0QxIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJRGVmaW5pdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNCODRCMUQ5MDE0MiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5EZWZpbml0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkQmluZGluZyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODhGMTAzOUQiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYmluZGluZyIKLQkJCSAgICB0eXBlICAgICAgIAkiSUJpbmRpbmciKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRJbXBvcnQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5NDkwMjU5IgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImltcG9ydERlZiIKLQkJCSAgICB0eXBlICAgICAgIAkiSUltcG9ydCIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZE1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5NkUwMDVFIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1lc3NhZ2UiCi0JCQkgICAgdHlwZSAgICAgICAJIklNZXNzYWdlIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiYWRkTmFtZXNwYWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OTg0MDA0QiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwcmVmaXgiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJhZGRQb3J0VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5ODlDNTAwNDUiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicG9ydFR5cGUiCi0JCQkgICAgdHlwZSAgICAgICAJIklQb3J0VHlwZSIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImFkZFNlcnZpY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OTg5RTQwMUVFIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInNlcnZpY2UiCi0JCQkgICAgdHlwZSAgICAgICAJIklTZXJ2aWNlIikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlQmluZGluZ0ZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QTE3MDM4QyIKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ0ZhdWx0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUJpbmRpbmdJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEEzMjAyODYiCi0JCSAgICByZXN1bHQgICAgIAkiSUJpbmRpbmdJbnB1dCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QTQ2MDEzQiIKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ091dHB1dCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nT3BlcmF0aW9uIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QTVDMDBCMCIKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZ09wZXJhdGlvbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVCaW5kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4OUZFMDM3QyIKLQkJICAgIHJlc3VsdCAgICAgCSJJQmluZGluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVGYXVsdCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEE3NTAyRTciCi0JCSAgICByZXN1bHQgICAgIAkiSUZhdWx0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZUltcG9ydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEE4MzAxNEMiCi0JCSAgICByZXN1bHQgICAgIAkiSUltcG9ydCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEE5RDAzM0UiCi0JCSAgICByZXN1bHQgICAgIAkiSUlucHV0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU1lc3NhZ2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBQUYwMjU0IgotCQkgICAgcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZU9wZXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEFDMjAzQzQiCi0JCSAgICByZXN1bHQgICAgIAkiSU9wZXJhdGlvbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVPdXRwdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThBRTgwMEVEIgotCQkgICAgcmVzdWx0ICAgICAJIklPdXRwdXQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUGFydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEFGODAyNkQiCi0JCSAgICByZXN1bHQgICAgIAkiSVBhcnQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEIwODAxREEiCi0JCSAgICByZXN1bHQgICAgIAkiSVBvcnQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiY3JlYXRlUG9ydFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCMTUwMzlCIgotCQkgICAgcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJjcmVhdGVTZXJ2aWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QjMyMDEzQSIKLQkJICAgIHJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRCaW5kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QjQyMDA3NSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEJpbmRpbmdzIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QjkyMDM0MSIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEltcG9ydHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4OThCQ0QwMDYwIgotCQkgICAgcmVzdWx0ICAgICAJIklNYXAiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SW1wb3J0cyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEJFNzAxNDQiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QzE3MDEwNyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkgICAgcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1lc3NhZ2VzIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4QzNFMDAxRCIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE5hbWVzcGFjZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEM2MjAxNEIiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicHJlZml4IgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TmFtZXNwYWNlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEM3NDAxMTUiCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQb3J0VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OENCRTAwNzEiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJUG9ydFR5cGUiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UG9ydFR5cGVzIgotCQkgICAgcXVpZCAgICAgICAJIjNCODk4Q0RBMDFDNiIKLQkJICAgIHJlc3VsdCAgICAgCSJJTWFwIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFByZWZpeCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OENGRDAwMTciCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2VydmljZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEQyMzAwQTgiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRTZXJ2aWNlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5OEQzQjAzQ0UiCi0JCSAgICByZXN1bHQgICAgIAkiSU1hcCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRFeHRlbnNpb25SZWdpc3RyeSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDVCODAxMkIiCi0JCSAgICByZXN1bHQgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldEV4dGVuc2lvblJlZ2lzdHJ5IgotCQkgICAgcXVpZCAgICAgICAJIjNCODlENUQ3MDNCQiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJleHRlbnNpb25SZWdpc3RyeSIKLQkJCSAgICB0eXBlICAgICAgIAkiSUV4dGVuc2lvblJlZ2lzdHJ5IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RG9jdW1lbnRCYXNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNCODlENUZFMDIwOCIKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0RG9jdW1lbnRCYXNlVVJJIgotCQkgICAgcXVpZCAgICAgICAJIjNCODlENjE4MDMyOCIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJkb2N1bWVudEJhc2UiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImNyZWF0ZVR5cGVzIgotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMDU2MDA4MCIKLQkJICAgIHJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAicmVtb3ZlU2VydmljZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FERDA3RTAwNEMiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICB0eXBlICAgICAgIAkiUU5hbWUiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJU2VydmljZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVCaW5kaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMEJBMDM1NSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkgICAgcmVzdWx0ICAgICAJIklCaW5kaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInJlbW92ZVBvcnRUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMEQ4MDI5QSIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkgICAgcmVzdWx0ICAgICAJIklQb3J0VHlwZSIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJyZW1vdmVNZXNzYWdlIgotCQkgICAgcXVpZCAgICAgICAJIjNDQUREMEZBMDMwNyIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJuYW1lIgotCQkJICAgIHR5cGUgICAgICAgCSJRTmFtZSIpKQotCQkgICAgcmVzdWx0ICAgICAJIklNZXNzYWdlIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFR5cGVzIgotCQkgICAgcXVpZCAgICAgICAJIjNDODY3MDZGMDMxQiIKLQkJICAgIHJlc3VsdCAgICAgCSJJVHlwZXMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0VHlwZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjcwOTUwMEVFIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInR5cGVzIgotCQkJICAgIHR5cGUgICAgICAgCSJJVHlwZXMiKSkKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLkRlZmluaXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEIxRTcwMkExIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJSW1wb3J0IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEIyMDIwMTE5IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuSW1wb3J0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRCMjBDMDJFQSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUxpc3QiCi0JICAgIHF1aWQgICAgICAgCSIzQjg1QzBBMjAzQzUiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkxpc3QgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLkxpc3QiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NUMwQUYwMjk3IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJTWFwIgotCSAgICBxdWlkICAgICAgIAkiM0I4OTZCMDMwMEQ0IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YS51dGlsLk1hcCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5NkIxMTAyQjUiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklVUkwiCi0JICAgIHF1aWQgICAgICAgCSIzQjg5RDU2MzAyNzQiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS5uZXQuVVJMIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEubmV0LlVSTCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg5RDU2RTAzRTIiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIklFeHRlbnNpb25SZWdpc3RyeSIKLQkgICAgcXVpZCAgICAgICAJIjNCODlENTkzMDJBNSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IgotCQkgICAgcXVpZCAgICAgICAJIjNCODlENTlGMDJFOCIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiVHlwZXMiCi0JICAgIHF1aWQgICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHR5cGVzIGVsZW1lbnQuIFRoZSB0eXBlcyBlbGVtZW50IGVuY2xvc2VzIGRhdGEgdHlwZSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlIGV4Y2hhbmdlZCBtZXNzYWdlcy4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQjhCRUIwMTAzMTEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmxlRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiKQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNDQURDRDNCMDM4MCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklUeXBlcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0FEQ0JCMjAwNTAiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FEQ0YzODAzRTYiCi0JCSAgICByZXN1bHQgICAgIAkiSUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0U2NoZW1hcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0FEQ0Y3RTAzMDEiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZXNwYWNlVVJJIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJJTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKSkKLQkob2JqZWN0IENsYXNzICJJSXRlcmF0b3IiCi0JICAgIHF1aWQgICAgICAgCSIzQzQ2ODdEQTAxNjciCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5JdGVyYXRvciIKLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2ODgwODAwQjkiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIldTRExFeGNlcHRpb24iCi0JICAgIHF1aWQgICAgICAgCSIzQzQ2ODk2NTAzMTMiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXhjZXB0aW9uIGNsYXNzLiIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZheC53c2RsLldTRExFeGNlcHRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0M0Njg5NzQwMzE1IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJJVHlwZXMiCi0JICAgIHF1aWQgICAgICAgCSIzQ0FEQ0JCMjAwNTAiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuVHlwZXMgbm9uLU1PRiBpbnRlcmZhY2UiCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmF4LndzZGwuVHlwZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0NBRENCRjEwMTczIgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQ0IyNEFFQzAxQ0IiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JKG9iamVjdCBDbGFzcyAiWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzQ0MzNjI3RjAwQjciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiKSkpCi0JKG9iamVjdCBDbGFzcyAiRE9NRG9jdW1lbnQiCi0JICAgIHF1aWQgICAgICAgCSIzQ0QxNTAyQzAyM0IiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG9yZy53M2MuZG9tLkRvY3VtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcudzNjLmRvbS5Eb2N1bWVudCIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0QxNTA2MDAxODIiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIikpKQotCShvYmplY3QgQ2xhc3MgIk1lc3NhZ2VSZWZlcmVuY2UiCi0JICAgIHF1aWQgICAgICAgCSIzRjY3NzFEQjAyREMiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRjc2MkE2QTAzMDgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjY3ODBBMDAxQUIiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlByb3RlY3RlZCIpKQotCSAgICBsYW5ndWFnZSAgIAkiSmF2YSIKLQkgICAgYWJzdHJhY3QgICAJVFJVRSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQwIgotCSAgICBxdWlkICAgICAgIAkiM0FENUM4MjQwMThDIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJwb3J0VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1QzgyNzAxQzMiCi0JCSAgICBsYWJlbCAgICAgIAkicG9ydFR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImVPcGVyYXRpb25zIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVDODI3MDFDRCIKLQkJICAgIGxhYmVsICAgICAgCSJlT3BlcmF0aW9ucyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMSIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVDRUJFMDBFMiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMiIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1Q0VCRjAwNTciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJlUGFydHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUNFQkYwMDYxIgotCQkgICAgbGFiZWwgICAgICAJImVQYXJ0cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDM1MjAxMEYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVQb3J0VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDM1NDAxNzYiCi0JCSAgICBsYWJlbCAgICAgIAkiZVBvcnRUeXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM3RjAwMUE1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDQiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQzNTQwMTgwIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVEM0UxMDE3OSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNiIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RDNFMjAyMjUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJlQmluZGluZ09wZXJhdGlvbnMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQzRTIwMjM5IgotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nT3BlcmF0aW9ucyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RDQyNTAzOEEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVPcGVyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ0MjYwMkY1IgotCQkgICAgbGFiZWwgICAgICAJImVPcGVyYXRpb24iCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDgiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ0MjYwMkZGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkOSIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVEOTQwMDM5MyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZVBvcnRzIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVEOTQxMDMxQyIKLQkJICAgIGxhYmVsICAgICAgCSJlUG9ydHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ5NDEwMzFEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMSIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVEOUI4MDExRiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZUJpbmRpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ5QjkwMjREIgotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTIiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUQ5QjkwMjYxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTMiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTYwMzAxRTIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0IgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImVNZXNzYWdlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTYwNDAwQzEiCi0JCSAgICBsYWJlbCAgICAgIAkiZU1lc3NhZ2VzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTUiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3MTAxMDQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE2IgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjcyMDM0QSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImVQb3J0VHlwZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUU2NzIwMzU0IgotCQkgICAgbGFiZWwgICAgICAJImVQb3J0VHlwZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzdGMDAxQTUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTciCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3NzAwOTUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE4IgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjc4MDM3MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImVCaW5kaW5ncyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3ODAzN0IiCi0JCSAgICBsYWJlbCAgICAgIAkiZUJpbmRpbmdzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMTkiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3QjAzMTEiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIwIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVFNjdEMDA3RiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImVTZXJ2aWNlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQUQ1RTY3RDAwODkiCi0JCSAgICBsYWJlbCAgICAgIAkiZVNlcnZpY2VzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjEiCi0JICAgIHF1aWQgICAgICAgCSIzQUQ1RkQxMzAwNzkiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FENUZEMTQwMTlEIgotCQkgICAgbGFiZWwgICAgICAJImVFeHRlbnNpYmlsaXR5RWxlbWVudHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpFeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDIyIgotCQkgICAgcXVpZCAgICAgICAJIjNBRDVGRDE0MDE5RSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIzIgotCSAgICBxdWlkICAgICAgIAkiM0FERjJFNjQwMUY1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlQmluZGluZ0lucHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRTY1MDI1MSIKLQkJICAgIGxhYmVsICAgICAgCSJlQmluZGluZ0lucHV0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjQiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJFNjUwMjUyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQyNSIKLQkgICAgcXVpZCAgICAgICAJIjNBREYyRUIzMDE2MyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZUJpbmRpbmdPdXRwdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJFQjQwMTNDIgotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nT3V0cHV0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ091dHB1dCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDI2IgotCQkgICAgcXVpZCAgICAgICAJIjNBREYyRUI0MDEzRCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjciCi0JICAgIHF1aWQgICAgICAgCSIzQURGMkY5NDAyNEQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVJbnB1dCIKLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkY5NTAxOTAiCi0JCSAgICBsYWJlbCAgICAgIAkiZUlucHV0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW5wdXQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQyOCIKLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkY5NTAxOUEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMjkiCi0JICAgIHF1aWQgICAgICAgCSIzQURGMkZCODAyRjkiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVPdXRwdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjJGQjkwMjBBIgotCQkgICAgbGFiZWwgICAgICAJImVPdXRwdXQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPdXRwdXQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QjYwMjMyIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQzMCIKLQkJICAgIHF1aWQgICAgICAgCSIzQURGMkZCOTAyMEIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMzEiCi0JICAgIHF1aWQgICAgICAgCSIzQURGMzMxNjAxQTQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVGYXVsdHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjMzMTgwMzg3IgotCQkgICAgbGFiZWwgICAgICAJImVGYXVsdHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDMyIgotCQkgICAgcXVpZCAgICAgICAJIjNBREYzMzE4MDM4OCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgwRDAzQ0UiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzMyIKLQkgICAgcXVpZCAgICAgICAJIjNBREYzNDAwMDNFNSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZUJpbmRpbmdGYXVsdHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjM0MDEwM0FBIgotCQkgICAgbGFiZWwgICAgICAJImVCaW5kaW5nRmF1bHRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzQiCi0JCSAgICBxdWlkICAgICAgIAkiM0FERjM0MDEwM0FCIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNSIKLQkgICAgcXVpZCAgICAgICAJIjNBRTA5MUY0MDJGMyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZUZhdWx0IgotCQkgICAgcXVpZCAgICAgICAJIjNBRTA5MUY4MDFGRSIKLQkJICAgIGxhYmVsICAgICAgCSJlRmF1bHQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwNzhCRTAxMDgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzYiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFMDkxRjgwMUZGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzNyIKLQkgICAgcXVpZCAgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMzgiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQTNENTYwMzI4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiZU5hbWVzcGFjZXMiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQTNENTYwMzMyIgotCQkgICAgbGFiZWwgICAgICAJImVOYW1lc3BhY2VzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6TmFtZXNwYWNlIgotCQkgICAgcXVpZHUgICAgICAJIjNBRUEzQ0QzMDAzMCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQzOSIKLQkgICAgcXVpZCAgICAgICAJIjNBRUEzRTNBMDAyRCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZURlZmluaXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQTNFM0MwMUU4IgotCQkgICAgbGFiZWwgICAgICAJImVEZWZpbml0aW9uIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDAiCi0JCSAgICBxdWlkICAgICAgIAkiM0FFQTNFM0MwMUYyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0MSIKLQkgICAgcXVpZCAgICAgICAJIjNBRUE0MTJGMDAzNSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZVBhcmFtZXRlck9yZGVyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNBRUE0MTMxMDI1NSIKLQkJICAgIGxhYmVsICAgICAgCSJlUGFyYW1ldGVyT3JkZXJpbmciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0MiIKLQkJICAgIHF1aWQgICAgICAgCSIzQUVBNDEzMTAyNUYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpPcGVyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQzIgotCSAgICBxdWlkICAgICAgIAkiM0I4NEFEMjQwMEJEIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlSW5wdXQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkgICAgbGFiZWwgICAgICAJImVJbnB1dCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3ODlGMDA1OSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUQyNTAwODQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nSW5wdXQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQ1IgotCSAgICBxdWlkICAgICAgIAkiM0I4NEFENzkwMEYyIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlT3V0cHV0IgotCQkgICAgcXVpZCAgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJICAgIGxhYmVsICAgICAgCSJlT3V0cHV0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0NiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjg0QUQ3QTAxNEUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QThGMDI4QyIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ0NyIKLQkgICAgcXVpZCAgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAidHlwZURlZmluaXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QjFCRTkwMzI3IgotCQkgICAgbGFiZWwgICAgICAJInR5cGVEZWZpbml0aW9uIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNDgiCi0JCSAgICBxdWlkICAgICAgIAkiM0I4QjFCRTkwMzMxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNDkiCi0JICAgIHF1aWQgICAgICAgCSIzQjhCMUMxMjAzQjIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImVsZW1lbnREZWNsYXJhdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhCMUMxNDAwMUMiCi0JCSAgICBsYWJlbCAgICAgIAkiZWxlbWVudERlY2xhcmF0aW9uIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RFbGVtZW50RGVjbGFyYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUwIgotCQkgICAgcXVpZCAgICAgICAJIjNCOEIxQzE0MDAyNiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDUxIgotCSAgICBxdWlkICAgICAgIAkiM0I4QjFEQ0MwMkU1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlU2NoZW1hIgotCQkgICAgcXVpZCAgICAgICAJIjNCOEIxRENFMDI3MCIKLQkJICAgIGxhYmVsICAgICAgCSJlU2NoZW1hIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCSAgICBxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUyIgotCQkgICAgcXVpZCAgICAgICAJIjNCOEIxRENFMDI3QSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkltcG9ydCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNTMiCi0JICAgIHF1aWQgICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDU0IgotCQkgICAgcXVpZCAgICAgICAJIjNCOEJFQTI5MDM1NiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImVUeXBlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCSAgICBsYWJlbCAgICAgIAkiZVR5cGVzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiCi0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDU1IgotCSAgICBxdWlkICAgICAgIAkiM0M0NjgyOTMwM0U1IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMEUiCi0JCSAgICBsYWJlbCAgICAgIAkiZU1lc3NhZ2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ1NiIKLQkJICAgIHF1aWQgICAgICAgCSIzQzQ2ODI5NjAxMTgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDRTFDMDMyRSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1NyIKLQkgICAgcXVpZCAgICAgICAJIjNDODY0REZGMDJFQyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZUltcG9ydHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkgICAgbGFiZWwgICAgICAJImVJbXBvcnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNEY5MDNERSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCIKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNTgiCi0JCSAgICBxdWlkICAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6RGVmaW5pdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMS4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1OSIKLQkgICAgcXVpZCAgICAgICAJIjNDQzM2MTQ1MDBGMiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkNjAiCi0JCSAgICBxdWlkICAgICAgIAkiM0NDMzYxNDYwMjNEIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0NDMzYwRDcwMzlDIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLjEiKQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgInNjaGVtYSIKLQkJICAgIHF1aWQgICAgICAgCSIzQ0MzNjE0NjAyM0UiCi0JCSAgICBsYWJlbCAgICAgIAkic2NoZW1hIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiCi0JCSAgICBxdWlkdSAgICAgIAkiMzc0QjE4MjUwMEJCIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYxIgotCSAgICBxdWlkICAgICAgIAkiM0Y3NEU3ODQwMUIxIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJlTWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRjc0RTc4NjAwMEYiCi0JCSAgICBsYWJlbCAgICAgIAkiZU1lc3NhZ2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIgotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ2MiIKLQkJICAgIHF1aWQgICAgICAgCSIzRjc0RTc4NjAwMjMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MURCMDJEQyIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ2MyIKLQkgICAgcXVpZCAgICAgICAJIjNGNzg5NkEyMDI2RSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFyZW50IgotCQkgICAgcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQiIKLQkJICAgIGxhYmVsICAgICAgCSJwYXJlbnQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiM0NCMjRBQzAwMkFFIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImNoaWxkcmVuIgotCQkgICAgcXVpZCAgICAgICAJIjNGNzg5NkE3MDEyQyIKLQkJICAgIGxhYmVsICAgICAgCSJjaGlsZHJlbiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OndzZGw6OlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNyBTZXJ2aWNlcyIKLQkgICAgcXVpZCAgICAgICAJIjM5QUQzRUY2MDEyNyIKLQkgICAgdGl0bGUgICAgICAJIjIuNyBTZXJ2aWNlcyIKLQkgICAgem9vbSAgICAgICAJOTAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCA4MDApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoMTE3MywgNjYwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUwMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEKLQkJCWxvY2F0aW9uICAgCSgxMTczLCA2MTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUwMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkgICAgd2lkdGggICAgICAJNTIwCi0JCSAgICBoZWlnaHQgICAgIAk0MDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVBvcnQiIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4MTYsIDUyOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIKLQkJCWxvY2F0aW9uICAgCSg2ODYsIDQ4MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJUG9ydCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoNjg2LCA0MzEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCODAwMzI2IgotCQkgICAgd2lkdGggICAgICAJMjc4Ci0JCSAgICBoZWlnaHQgICAgIAkyMTgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SVNlcnZpY2UiIEAzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDE2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxMjYsIDkwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIyOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklTZXJ2aWNlIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxMjYsIDQwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBQjQ5MDI4NyIKLQkJICAgIHdpZHRoICAgICAgCTI0NgotCQkgICAgaGVpZ2h0ICAgICAJMjY0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEA0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI0MCwgNTI4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANAotCQkJbG9jYXRpb24gICAJKDQ0LCAzODkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiU2VydmljZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ4RjAwMkY4IgotCQkgICAgd2lkdGggICAgICAJNDEwCi0JCSAgICBoZWlnaHQgICAgIAkzMDIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDUKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1OTU0RTAxQjQiCi0JCSAgICBjbGllbnQgICAgIAlANAotCQkgICAgc3VwcGxpZXIgICAJQDMKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjQwLCAzNzcpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQwLCAyOTIpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEA2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE0NDAsIDEyNjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2Ci0JCQlsb2NhdGlvbiAgIAkoMTI0NCwgMTEyNSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzOTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCSAgICB3aWR0aCAgICAgIAk0MTAKLQkJICAgIGhlaWdodCAgICAgCTMwMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODU5NTQxMDEyOSIKLQkJICAgIGNsaWVudCAgICAgCUA2Ci0JCSAgICBzdXBwbGllciAgIAlAMQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMwLCAxMTEzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MzAsIDEwMDIpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnQiIEA4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDgxNiwgOTEyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAOAotCQkJbG9jYXRpb24gICAJKDY3NSwgODQwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI4MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBvcnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOTE3MDI4NiIKLQkJICAgIHdpZHRoICAgICAgCTMwMAotCQkgICAgaGVpZ2h0ICAgICAJMTY4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NTk1NDUwMkM5IgotCQkgICAgY2xpZW50ICAgICAJQDgKLQkJICAgIHN1cHBsaWVyICAgCUAyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDgwOSwgODI4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgwOSwgNjM3KSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDkiIEAxMAotCQkgICAgbG9jYXRpb24gICAJKDM0MywgOTE2KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOTQwMDM5MyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZVBvcnRzIiBAMTEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMjEsIDY0NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMgotCQkJCVBhcmVudF9WaWV3IAlAMTEKLQkJCQlsb2NhdGlvbiAgIAkoNDEzLCA5NDUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTkyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZVBvcnRzIgotCQkJCXBjdERpc3QgICAgCTAuMjE4OTc4Ci0JCQkJaGVpZ2h0ICAgICAJMjkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUMiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwCi0JCQkgICAgc3VwcGxpZXIgICAJQDgKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzNDMsIDkxNikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY2LCA5MTYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMKLQkJCQlQYXJlbnRfVmlldyAJQDExCi0JCQkJbG9jYXRpb24gICAJKDUzOSwgODgwKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjYwODAwMAotCQkJCWhlaWdodCAgICAgCTM3Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTQKLQkJCQlQYXJlbnRfVmlldyAJQDExCi0JCQkJbG9jYXRpb24gICAJKDQ0OCwgOTkwKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuMzI4NDY3Ci0JCQkJaGVpZ2h0ICAgICAJNzQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDE1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMAotCQkJICAgIGxvY2F0aW9uICAgCSgtMTIxLCA2NDQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYKLQkJCQlQYXJlbnRfVmlldyAJQDE1Ci0JCQkJbG9jYXRpb24gICAJKDIxNiwgNzQ0KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDk0MTAzMUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwCi0JCQkgICAgc3VwcGxpZXIgICAJQDQKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMzQzLCA5MTYpCi0JCQkJKDI1NywgOTE2KQotCQkJCSgyNTcsIDY3OSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzQzLCA5MTYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI1NywgNjc5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJCWxvY2F0aW9uICAgCSgzMDEsIDc5NikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjYzNzA5NwotCQkJCWhlaWdodCAgICAgCTQ0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDE4Ci0JCSAgICBsb2NhdGlvbiAgIAkoODg2LCAxMjcwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOUI4MDExRiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmciIEAxOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTgKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzgsIDQyMikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMAotCQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCQlsb2NhdGlvbiAgIAkoMTExMiwgMTIzNSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlQmluZGluZyIKLQkJCQlwY3REaXN0ICAgIAkwLjY0ODU3MQotCQkJCWhlaWdodCAgICAgCTM2Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQ5QjkwMjREIgotCQkJICAgIGNsaWVudCAgICAgCUAxOAotCQkJICAgIHN1cHBsaWVyICAgCUA2Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoODg2LCAxMjcwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjM1LCAxMjcwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxCi0JCQkJUGFyZW50X1ZpZXcgCUAxOQotCQkJCWxvY2F0aW9uICAgCSgxMTcwLCAxMzEzKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODE0Mjg2Ci0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMiIgQDIyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOAotCQkJICAgIGxvY2F0aW9uICAgCSgzOCwgNDIyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIzCi0JCQkJUGFyZW50X1ZpZXcgCUAyMgotCQkJCWxvY2F0aW9uICAgCSg4NTIsIDExMDYpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuNjg3OTQzCi0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDlCOTAyNjEiCi0JCQkgICAgY2xpZW50ICAgICAJQDE4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDgKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoODg2LCAxMjcwKQotCQkJCSg4MTIsIDEyNzApCi0JCQkJKDgxMiwgOTk2KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4ODYsIDEyNzApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDgxMiwgOTk2KSkpKSkpCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIjIuNSBCaW5kaW5ncyIKLQkgICAgcXVpZCAgICAgICAJIjM5QUQ1MTI3MDI1MiIKLQkgICAgdGl0bGUgICAgICAJIjIuNSBCaW5kaW5ncyIKLQkgICAgem9vbSAgICAgICAJODUKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmciIEAyNAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzA0LCAyNDApCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNAotCQkJbG9jYXRpb24gICAJKDczLCAxMTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUJpbmRpbmciKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjQKLQkJCWxvY2F0aW9uICAgCSg3MywgNjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFCQzYwMjE5IgotCQkgICAgd2lkdGggICAgICAJNDgwCi0JCSAgICBoZWlnaHQgICAgIAkzNzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUJpbmRpbmdPcGVyYXRpb24iIEAyNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoOTc2LCAzNTIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJbG9jYXRpb24gICAJKDc4MCwgMTMwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM5MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklCaW5kaW5nT3BlcmF0aW9uIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI1Ci0JCQlsb2NhdGlvbiAgIAkoNzgwLCA4MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzkyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QURDMDAwNzIiCi0JCSAgICB3aWR0aCAgICAgIAk0MTAKLQkJICAgIGhlaWdodCAgICAgCTU2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0lucHV0IiBAMjYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MiwgMTM2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI2Ci0JCQlsb2NhdGlvbiAgIAkoNjIsIDEzMzQpCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjYwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUJpbmRpbmdJbnB1dCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNgotCQkJbG9jYXRpb24gICAJKDYyLCAxMjg0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBREVCMDEwMCIKLQkJICAgIHdpZHRoICAgICAgCTI3OAotCQkgICAgaGVpZ2h0ICAgICAJMTc2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklCaW5kaW5nT3V0cHV0IiBAMjcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMTY2NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI3Ci0JCQlsb2NhdGlvbiAgIAkoNjEsIDE2MzgpCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUJpbmRpbmdPdXRwdXQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjcKLQkJCWxvY2F0aW9uICAgCSg2MSwgMTU4OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUUyMTAxMTEiCi0JCSAgICB3aWR0aCAgICAgIAkzMTIKLQkJICAgIGhlaWdodCAgICAgCTE3NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJQmluZGluZ0ZhdWx0IiBAMjgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIwOCwgMTk4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI4Ci0JCQlsb2NhdGlvbiAgIAkoNzIsIDE5NTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUJpbmRpbmdGYXVsdCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyOAotCQkJbG9jYXRpb24gICAJKDcyLCAxOTA4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTRGMDBCRCIKLQkJICAgIHdpZHRoICAgICAgCTI5MAotCQkgICAgaGVpZ2h0ICAgICAJMTc2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBvcnRUeXBlIiBAMjkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgNjI0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCWxvY2F0aW9uICAgCSgxNTY4LCA0ODYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjczCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJICAgIHdpZHRoICAgICAgCTY5MQotCQkgICAgaGVpZ2h0ICAgICAJMzAxCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklucHV0IiBAMzAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMTM2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMwCi0JCQlsb2NhdGlvbiAgIAkoMTc1NiwgMTI4MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbnB1dCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkgICAgd2lkdGggICAgICAJMzE0Ci0JCSAgICBoZWlnaHQgICAgIAkxNzgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMzEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgMTY2NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMxCi0JCQlsb2NhdGlvbiAgIAkoMTc1NiwgMTU4NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJICAgIHdpZHRoICAgICAgCTMxNAotCQkgICAgaGVpZ2h0ICAgICAJMTc4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAzMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzMDQsIDY4OCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMyCi0JCQlsb2NhdGlvbiAgIAkoOTcsIDUzOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDI4NjAyNjEiCi0JCSAgICB3aWR0aCAgICAgIAk0MzIKLQkJICAgIGhlaWdodCAgICAgCTMyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzMKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1OTU0MTAxMjkiCi0JCSAgICBjbGllbnQgICAgIAlAMzIKLQkJICAgIHN1cHBsaWVyICAgCUAyNAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzksIDUyNykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyNzksIDQyOCkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzIiBAMzQKLQkJICAgIGxvY2F0aW9uICAgCSgxMDM5LCA3NDIpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzNTIwMTBGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlUG9ydFR5cGUiIEAzNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTc1LCA1OTgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzYKLQkJCQlQYXJlbnRfVmlldyAJQDM1Ci0JCQkJbG9jYXRpb24gICAJKDE0NDksIDc4MSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMTYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlUG9ydFR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC43ODkyOTIKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMzU0MDE3NiIKLQkJCSAgICBjbGllbnQgICAgIAlAMzQKLQkJCSAgICBzdXBwbGllciAgIAlAMjkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTksIDc0MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNwotCQkJCVBhcmVudF9WaWV3IAlAMzUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ5MiwgNzE2KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODcyMTkzCi0JCQkJaGVpZ2h0ICAgICAJMjcKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0IiBAMzgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM0Ci0JCQkgICAgbG9jYXRpb24gICAJKDU3NSwgNTk4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM5Ci0JCQkJUGFyZW50X1ZpZXcgCUAzOAotCQkJCWxvY2F0aW9uICAgCSg3NzYsIDY5NykKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTA4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC41MDk0NDkKLQkJCQloZWlnaHQgICAgIAk0NgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMzU0MDE4MCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzQKLQkJCSAgICBzdXBwbGllciAgIAlAMzIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDM5LCA3NDIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDUyMCwgNzQyKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDQwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDEwMjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0MAotCQkJbG9jYXRpb24gICAJKDE2NzIsIDg1MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJPcGVyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODBEMDNDRSIKLQkJICAgIHdpZHRoICAgICAgCTQ1MAotCQkgICAgaGVpZ2h0ICAgICAJMzcwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdJbnB1dCIgQDQxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDYyNCwgMTQwOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQxCi0JCQlsb2NhdGlvbiAgIAkoNDc2LCAxMjgzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI5NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJpbmRpbmdJbnB1dCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBODIwMkQ0IgotCQkgICAgd2lkdGggICAgICAJMzE0Ci0JCSAgICBoZWlnaHQgICAgIAkyNzQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0MyIgQDQyCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgMTM1OSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUQyNDAwQkQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVJbnB1dCIgQDQzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0MgotCQkJICAgIGxvY2F0aW9uICAgCSg5NiwgMjg3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQ0Ci0JCQkJUGFyZW50X1ZpZXcgCUA0MwotCQkJCWxvY2F0aW9uICAgCSgxNjM3LCAxMzE2KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTEzMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VJbnB1dCIKLQkJCQlwY3REaXN0ICAgIAkwLjc3NTE0OAotCQkJCWhlaWdodCAgICAgCTQ0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDgzIgotCQkJICAgIGNsaWVudCAgICAgCUA0MgotCQkJICAgIHN1cHBsaWVyICAgCUAzMAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NDcsIDEzNTkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDUKLQkJCQlQYXJlbnRfVmlldyAJQDQzCi0JCQkJbG9jYXRpb24gICAJKDE2OTQsIDEzOTgpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44ODk1NDYKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQ0IiBANDYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDQyCi0JCQkgICAgbG9jYXRpb24gICAJKDk2LCAyODcpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEMjUwMDg0IgotCQkJICAgIGNsaWVudCAgICAgCUA0MgotCQkJICAgIHN1cHBsaWVyICAgCUA0MQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNjQsIDEzNTkpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc4MSwgMTM1OSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3V0cHV0IiBANDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoOTYwLCAxNjY0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDcKLQkJCWxvY2F0aW9uICAgCSg4MTIsIDE1MzkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ091dHB1dCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDhBOEYwMjhDIgotCQkgICAgd2lkdGggICAgICAJMzE0Ci0JCSAgICBoZWlnaHQgICAgIAkyNzQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ0NSIgQDQ4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTQzMiwgMTY1NCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUQ3OTAwRjIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVPdXRwdXQiIEA0OQotCQkJICAgIFBhcmVudF9WaWV3IAlANDgKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEyMCwgMzc0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUwCi0JCQkJUGFyZW50X1ZpZXcgCUA0OQotCQkJCWxvY2F0aW9uICAgCSgxNjQ1LCAxNjEyKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VPdXRwdXQiCi0JCQkJcGN0RGlzdCAgICAJMC42NzQ3NzIKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCODRBRDdBMDE0RCIKLQkJCSAgICBjbGllbnQgICAgIAlANDgKLQkJCSAgICBzdXBwbGllciAgIAlAMzEKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDMyLCAxNjU0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzQ3LCAxNjU0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUxCi0JCQkJUGFyZW50X1ZpZXcgCUA0OQotCQkJCWxvY2F0aW9uICAgCSgxNjgxLCAxNjk3KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNzkwMjc0Ci0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0NiIgQDUyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OAotCQkJICAgIGxvY2F0aW9uICAgCSgtMTIwLCAzNzQpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4NEFEN0EwMTRFIgotCQkJICAgIGNsaWVudCAgICAgCUA0OAotCQkJICAgIHN1cHBsaWVyICAgCUA0NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MzIsIDE2NTQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDE2NTQpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ09wZXJhdGlvbiIgQDUzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDk5MiwgMTAwOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDUzCi0JCQlsb2NhdGlvbiAgIAkoODE5LCA5MzEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQ2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ09wZXJhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQzQ0IwMTQ1IgotCQkgICAgd2lkdGggICAgICAJMzY0Ci0JCSAgICBoZWlnaHQgICAgIAkxNzgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFERTQwMURDIgotCQkgICAgY2xpZW50ICAgICAJQDUzCi0JCSAgICBzdXBwbGllciAgIAlAMjUKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTY2LCA5MTkpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTY2LCA2MzYpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNSIgQDU1Ci0JCSAgICBsb2NhdGlvbiAgIAkoNDU3LCAxMDIyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEM0UxMDE3OSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNiIgQDU2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTMxOSwgNDk0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3Ci0JCQkJUGFyZW50X1ZpZXcgCUA1NgotCQkJCWxvY2F0aW9uICAgCSgyMzUsIDkyMCkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUQzRTIwMjI1IgotCQkJICAgIGNsaWVudCAgICAgCUA1NQotCQkJICAgIHN1cHBsaWVyICAgCUAzMgotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg0NTcsIDEwMjIpCi0JCQkJKDI3NiwgMTAyMikKLQkJCQkoMjc2LCA4NDkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ1NywgMTAyMikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjc2LCA4NDkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTgKLQkJCQlQYXJlbnRfVmlldyAJQDU2Ci0JCQkJbG9jYXRpb24gICAJKDMzMCwgODg0KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ09wZXJhdGlvbnMiIEA1OQotCQkJICAgIFBhcmVudF9WaWV3IAlANTUKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTEzMTksIDQ5NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MAotCQkJCVBhcmVudF9WaWV3IAlANTkKLQkJCQlsb2NhdGlvbiAgIAkoNTMxLCA5NzcpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzg0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUJpbmRpbmdPcGVyYXRpb25zIgotCQkJCXBjdERpc3QgICAgCTAuMjExNjk5Ci0JCQkJaGVpZ2h0ICAgICAJNDYKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNFMjAyMzkiCi0JCQkgICAgY2xpZW50ICAgICAJQDU1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDU3LCAxMDIyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4MTAsIDEwMjIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDc2OSwgOTgwKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuODg0OTU2Ci0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2MgotCQkJCVBhcmVudF9WaWV3IAlANTkKLQkJCQlsb2NhdGlvbiAgIAkoNzE0LCAxMDY3KQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNzI3NTY0Ci0JCQkJaGVpZ2h0ICAgICAJNDUKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDciIEA2MwotCQkgICAgbG9jYXRpb24gICAJKDE0MTgsIDEwNDApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQ0MjUwMzhBIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlT3BlcmF0aW9uIiBANjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYzCi0JCQkgICAgbG9jYXRpb24gICAJKC0zNTgsIDQ2NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTUyMCwgMTA3OSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlT3BlcmF0aW9uIgotCQkJCXBjdERpc3QgICAgCTAuNDIwNjAxCi0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRjUiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDQwCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2MywgMTA0MCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NgotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTU4OSwgMTAwNSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY5NjcyMQotCQkJCWhlaWdodCAgICAgCTM2Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkOCIgQDY3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA2MwotCQkJICAgIGxvY2F0aW9uICAgCSgtMzU4LCA0NjQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjgKLQkJCQlQYXJlbnRfVmlldyAJQDY3Ci0JCQkJbG9jYXRpb24gICAJKDEyNzMsIDEwNzApCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE5MgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuNTk1NDIwCi0JCQkJaGVpZ2h0ICAgICAJMzAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDQyNjAyRkYiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTQxOCwgMTA0MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTE3NCwgMTA0MCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIzIiBANjkKLQkJICAgIGxvY2F0aW9uICAgCSg3ODcsIDExOTApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FERjJFNjQwMUY1IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ0lucHV0IiBANzAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY5Ci0JCQkgICAgbG9jYXRpb24gICAJKC0zODEsIDQ1NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQotCQkJCVBhcmVudF9WaWV3IAlANzAKLQkJCQlsb2NhdGlvbiAgIAkoNjY5LCAxMTUyKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI3NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VCaW5kaW5nSW5wdXQiCi0JCQkJcGN0RGlzdCAgICAJMC41MTE5MDUKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MSIKLQkJCSAgICBjbGllbnQgICAgIAlANjkKLQkJCSAgICBzdXBwbGllciAgIAlANDEKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNzg3LCAxMTkwKQotCQkJCSg2MzYsIDExOTApCi0JCQkJKDYzNiwgMTI3MSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzYsIDEyNzEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzIKLQkJCQlQYXJlbnRfVmlldyAJQDcwCi0JCQkJbG9jYXRpb24gICAJKDY4NSwgMTIyMikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjQ0MDQ3NgotCQkJCWhlaWdodCAgICAgCTMyCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjQiIEA3MwotCQkJICAgIFBhcmVudF9WaWV3IAlANjkKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM4MSwgNDU0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0Ci0JCQkJUGFyZW50X1ZpZXcgCUA3MwotCQkJCWxvY2F0aW9uICAgCSg4ODUsIDExNDQpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRTY1MDI1MiIKLQkJCSAgICBjbGllbnQgICAgIAlANjkKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNzg3LCAxMTkwKQotCQkJCSg5MjYsIDExOTApCi0JCQkJKDkyNiwgMTA5NykpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzg3LCAxMTkwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5MjYsIDEwOTcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUKLQkJCQlQYXJlbnRfVmlldyAJQDczCi0JCQkJbG9jYXRpb24gICAJKDg3MSwgMTEzNikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjgzNzc1OAotCQkJCWhlaWdodCAgICAgCTU2Ci0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyNSIgQDc2Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTAyNCwgMTMxMikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkVCMzAxNjMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVCaW5kaW5nT3V0cHV0IiBANzcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDc2Ci0JCQkgICAgbG9jYXRpb24gICAJKC0xNTAsIDU3OCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OAotCQkJCVBhcmVudF9WaWV3IAlANzcKLQkJCQlsb2NhdGlvbiAgIAkoMTAxMiwgMTQyOSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMDYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlQmluZGluZ091dHB1dCIKLQkJCQlwY3REaXN0ICAgIAkwLjU0NTA4MgotCQkJCWhlaWdodCAgICAgCTEzCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJFQjQwMTNDIgotCQkJICAgIGNsaWVudCAgICAgCUA3NgotCQkJICAgIHN1cHBsaWVyICAgCUA0NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDEzMTIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwMjQsIDE1MjcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkKLQkJCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQkJbG9jYXRpb24gICAJKDk2NywgMTQ3OSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc3NDU5MAotCQkJCWhlaWdodCAgICAgCTU4Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjYiIEA4MAotCQkJICAgIFBhcmVudF9WaWV3IAlANzYKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE1MCwgNTc4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxCi0JCQkJUGFyZW50X1ZpZXcgCUA4MAotCQkJCWxvY2F0aW9uICAgCSg5ODMsIDExNDApCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRUI0MDEzRCIKLQkJCSAgICBjbGllbnQgICAgIAlANzYKLQkJCSAgICBzdXBwbGllciAgIAlANTMKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCAxMzEyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMDI0LCAxMDk3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyCi0JCQkJUGFyZW50X1ZpZXcgCUA4MAotCQkJCWxvY2F0aW9uICAgCSgxMDMxLCAxMTg2KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNTkwMTY0Ci0JCQkJaGVpZ2h0ICAgICAJNwotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkZhdWx0IiBAODMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyMCwgMTk4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDgzCi0JCQlsb2NhdGlvbiAgIAkoMTc3MiwgMTkwNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGYXVsdCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4QkUwMTA4IgotCQkgICAgd2lkdGggICAgICAJMzE0Ci0JCSAgICBoZWlnaHQgICAgIAkxNzgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0ZhdWx0IiBAODQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM2MCwgMTk4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDg0Ci0JCQlsb2NhdGlvbiAgIAkoMTIxMiwgMTg1OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nRmF1bHQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTlFMDNBNiIKLQkJICAgIHdpZHRoICAgICAgCTMxNAotCQkgICAgaGVpZ2h0ICAgICAJMjc0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBRTcxMDMzMyIKLQkJICAgIGNsaWVudCAgICAgCUA4NAotCQkgICAgc3VwcGxpZXIgICAJQDI4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMDMsIDIwMDcpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzUzLCAyMDA3KSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMzIiBAODYKLQkJICAgIGxvY2F0aW9uICAgCSgxMzU2LCAxMzUyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBREYzNDAwMDNFNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZUJpbmRpbmdGYXVsdHMiIEA4NwotCQkJICAgIFBhcmVudF9WaWV3IAlAODYKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTg4LCA2MTYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODgKLQkJCQlQYXJlbnRfVmlldyAJQDg3Ci0JCQkJbG9jYXRpb24gICAJKDEzODIsIDE3NTApCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzAwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUJpbmRpbmdGYXVsdHMiCi0JCQkJcGN0RGlzdCAgICAJMC44MDMxNTAKLQkJCQloZWlnaHQgICAgIAkyNgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBREYzNDAxMDNBQSIKLQkJCSAgICBjbGllbnQgICAgIAlAODYKLQkJCSAgICBzdXBwbGllciAgIAlAODQKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzU2LCAxMzUyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzU2LCAxODQ3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Ci0JCQkJUGFyZW50X1ZpZXcgCUA4NwotCQkJCWxvY2F0aW9uICAgCSgxNDA5LCAxNzk3KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuODk5MTk0Ci0JCQkJaGVpZ2h0ICAgICAJNTMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MAotCQkJCVBhcmVudF9WaWV3IAlAODcKLQkJCQlsb2NhdGlvbiAgIAkoMTI1NiwgMTgwNikKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjkxOTI5MQotCQkJCWhlaWdodCAgICAgCTEwMQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM0IiBAOTEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDg2Ci0JCQkgICAgbG9jYXRpb24gICAJKDE4OCwgNjE2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDkyCi0JCQkJUGFyZW50X1ZpZXcgCUA5MQotCQkJCWxvY2F0aW9uICAgCSgxMDc2LCAxMTk3KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzQwMTAzQUIiCi0JCQkgICAgY2xpZW50ICAgICAJQDg2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDUzCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEzNTYsIDEzNTIpCi0JCQkJKDEzNTYsIDEyMTcpCi0JCQkJKDExMTcsIDEyMTcpCi0JCQkJKDExMTcsIDEwOTcpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTYsIDEzNTIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExMTcsIDEwOTcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMKLQkJCQlQYXJlbnRfVmlldyAJQDkxCi0JCQkJbG9jYXRpb24gICAJKDExNTIsIDExNjQpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42ODcwMDgKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzUiIEA5NAotCQkgICAgbG9jYXRpb24gICAJKDE2NDAsIDE5NzApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDkxRjQwMkYzIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlRmF1bHQiIEA5NQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTQKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTM0NCwgODE4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk2Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NQotCQkJCWxvY2F0aW9uICAgCSgxNjc0LCAxOTE1KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VGYXVsdCIKLQkJCQlwY3REaXN0ICAgIAkwLjI3NjQyMwotCQkJCWhlaWdodCAgICAgCTU2Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFMDkxRjgwMUZFIgotCQkJICAgIGNsaWVudCAgICAgCUA5NAotCQkJICAgIHN1cHBsaWVyICAgCUA4MwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NDAsIDE5NzApCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjMsIDE5NzApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTcKLQkJCQlQYXJlbnRfVmlldyAJQDk1Ci0JCQkJbG9jYXRpb24gICAJKDE3MTgsIDIwMTIpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC42NDIyNzYKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDM2IiBAOTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk0Ci0JCQkgICAgbG9jYXRpb24gICAJKC0zNDQsIDgxOCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOTFGODAxRkYiCi0JCQkgICAgY2xpZW50ICAgICAJQDk0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDg0Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY0MCwgMTk3MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUxNywgMTk3MCkpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QUU0MzAyQUIiCi0JCSAgICBjbGllbnQgICAgIAlANDcKLQkJICAgIHN1cHBsaWVyICAgCUAyNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4MDMsIDE2NTYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzY0LCAxNjU2KSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAwCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEFFMUIwMTEzIgotCQkgICAgY2xpZW50ICAgICAJQDQxCi0JCSAgICBzdXBwbGllciAgIAlAMjYKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDY3LCAxMzg1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMzMSwgMTM4NSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi40IFBvcnRUeXBlcyIKLQkgICAgcXVpZCAgICAgICAJIjNBRDVEMUM0MDM2NiIKLQkgICAgdGl0bGUgICAgICAJIjIuNCBQb3J0VHlwZXMiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIG5vbi1NT0YgamF2YS51dGlsLkl0ZXJhdG9yIGludGVyZmFjZS4iCi0JICAgIHpvb20gICAgICAgCTgwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQb3J0VHlwZSIgQDEwMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDk2LCAyMDgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDEKLQkJCWxvY2F0aW9uICAgCSgxNDYsIDE3MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJUG9ydFR5cGUiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAxCi0JCQlsb2NhdGlvbiAgIAkoMTQ2LCAxMjIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTcwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE1QkUwMzMxIgotCQkgICAgd2lkdGggICAgICAJNzE4Ci0JCSAgICBoZWlnaHQgICAgIAkxOTYKLQkJICAgIGFubm90YXRpb24gCTgpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SU9wZXJhdGlvbiIgQDEwMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU1MiwgMjA4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAyCi0JCQlsb2NhdGlvbiAgIAkoMTExNiwgMTc2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTg3MwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklPcGVyYXRpb24iKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAyCi0JCQlsb2NhdGlvbiAgIAkoMTExNiwgMTI2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk4NzMKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBNzc2MDBEMSIKLQkJICAgIHdpZHRoICAgICAgCTg5MQotCQkgICAgaGVpZ2h0ICAgICAJMTg4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklJbnB1dCIgQDEwMwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzY4LCAxNDcyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAzCi0JCQlsb2NhdGlvbiAgIAkoNTUsIDE0MzcpCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjI2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUlucHV0IikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwMwotCQkJbG9jYXRpb24gICAJKDU1LCAxMzg3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBN0VFMDAxNSIKLQkJICAgIHdpZHRoICAgICAgCTY0NAotCQkgICAgaGVpZ2h0ICAgICAJMTk0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklPdXRwdXQiIEAxMDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM4NCwgMTc5MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwNAotCQkJbG9jYXRpb24gICAJKDU2LCAxNzU3KQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY1NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklPdXRwdXQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA0Ci0JCQlsb2NhdGlvbiAgIAkoNTYsIDE3MDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY1NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE4MjkwMjdEIgotCQkgICAgd2lkdGggICAgICAJNjc0Ci0JCSAgICBoZWlnaHQgICAgIAkxOTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SUZhdWx0IiBAMTA1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzNjgsIDIxMTIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMDUKLQkJCWxvY2F0aW9uICAgCSg1NSwgMjA3NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MjYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJRmF1bHQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA1Ci0JCQlsb2NhdGlvbiAgIAkoNTUsIDIwMjYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYyNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE4NjEwMzFEIgotCQkgICAgd2lkdGggICAgICAJNjQ0Ci0JCSAgICBoZWlnaHQgICAgIAkxOTYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydFR5cGUiIEAxMDYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ5NiwgODAwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTA2Ci0JCQlsb2NhdGlvbiAgIAkoMTU4LCA2NzIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjc3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJICAgIHdpZHRoICAgICAgCTY5NQotCQkgICAgaGVpZ2h0ICAgICAJMjgxCi0JCSAgICBhbm5vdGF0aW9uIAk4KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlBhcnQiIEAxMDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI1NzYsIDgwMCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwNwotCQkJbG9jYXRpb24gICAJKDIzMjUsIDY5MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQYXJ0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCSAgICB3aWR0aCAgICAgIAk1MjAKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpGYXVsdCIgQDEwOAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcyOCwgMjExMikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwOAotCQkJbG9jYXRpb24gICAJKDE2NDcsIDIwNjApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTYyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRmF1bHQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEJFMDEwOCIKLQkJICAgIGhlaWdodCAgICAgCTEyOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbnB1dCIgQDEwOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA1NiwgMTQ3MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEwOQotCQkJbG9jYXRpb24gICAJKDg3MCwgMTQyMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbnB1dCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFMDc4OUYwMDU5IgotCQkgICAgd2lkdGggICAgICAJMzkwCi0JCSAgICBoZWlnaHQgICAgIAkxMjUKLQkJICAgIGFubm90YXRpb24gCTgpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6T3V0cHV0IiBAMTEwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzYwLCAxNzkyKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTEwCi0JCQlsb2NhdGlvbiAgIAkoMTIzMiwgMTc0MikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJPdXRwdXQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA3OEI2MDIzMiIKLQkJICAgIHdpZHRoICAgICAgCTI3NAotCQkgICAgaGVpZ2h0ICAgICAJMTI1Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6Ok9wZXJhdGlvbiIgQDExMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTU1MiwgNzg0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTExCi0JCQlsb2NhdGlvbiAgIAkoMTIxNCwgNjIwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY3NwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk9wZXJhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUM4MEQwM0NFIgotCQkgICAgd2lkdGggICAgICAJNjk1Ci0JCSAgICBoZWlnaHQgICAgIAkzNTIKLQkJICAgIGFubm90YXRpb24gCTgpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBAMTEyCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAyNCwgNzk3KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODI0MDE4QyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZU9wZXJhdGlvbnMiIEAxMTMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMgotCQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTQKLQkJCQlQYXJlbnRfVmlldyAJQDExMwotCQkJCWxvY2F0aW9uICAgCSgxMDg4LCA3NDgpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQ5Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZU9wZXJhdGlvbnMiCi0JCQkJcGN0RGlzdCAgICAJMC4zNTk2NDkKLQkJCQloZWlnaHQgICAgIAk1MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVDODI3MDFDRCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTEyCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMjQsIDc5NykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIwNSwgNzk3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExNQotCQkJCVBhcmVudF9WaWV3IAlAMTEzCi0JCQkJbG9jYXRpb24gICAJKDExNzYsIDg2MSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjg0MDM5MQotCQkJCWhlaWdodCAgICAgCTY0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMTMKLQkJCQlsb2NhdGlvbiAgIAkoMTA3NCwgOTIzKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuMjc2MjQzCi0JCQkJaGVpZ2h0ICAgICAJMTI2Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAicG9ydFR5cGUiIEAxMTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDExMgotCQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDI2OSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzgyNzAxQzMiCi0JCQkgICAgY2xpZW50ICAgICAJQDExMgotCQkJICAgIHN1cHBsaWVyICAgCUAxMDYKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDI0LCA3OTcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg0MywgNzk3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExOAotCQkJCVBhcmVudF9WaWV3IAlAMTE3Ci0JCQkJbG9jYXRpb24gICAJKDg4OCwgNzU3KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNzUzNDg4Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQxIiBAMTE5Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjEwNywgNzczKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRUE0MTJGMDAzNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZVBhcmFtZXRlck9yZGVyaW5nIiBAMTIwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMQotCQkJCVBhcmVudF9WaWV3IAlAMTIwCi0JCQkJbG9jYXRpb24gICAJKDIxNDUsIDY0NykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzOTYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlUGFyYW1ldGVyT3JkZXJpbmciCi0JCQkJcGN0RGlzdCAgICAJMC4xODMzMzMKLQkJCQloZWlnaHQgICAgIAkxMjcKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVBNDEzMTAyNTUiCi0JCQkgICAgY2xpZW50ICAgICAJQDExOQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMTA3LCA3NzMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTYsIDc3MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjIKLQkJCQlQYXJlbnRfVmlldyAJQDEyMAotCQkJCWxvY2F0aW9uICAgCSgyMjcyLCA4MjIpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC43OTY2MTAKLQkJCQloZWlnaHQgICAgIAk0OQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMwotCQkJCVBhcmVudF9WaWV3IAlAMTIwCi0JCQkJbG9jYXRpb24gICAJKDIxNzEsIDg4OCkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjMwNjIyMAotCQkJCWhlaWdodCAgICAgCTExNQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQyIiBAMTI0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTkKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTgxOSwgMTAxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRUE0MTMxMDI1RiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTE5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDExMQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxMDcsIDc3MykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5OSwgNzczKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzEiIEAxMjUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzAyLCAxNTA0KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBREYzMzE2MDFBNCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZUZhdWx0cyIgQDEyNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Ci0JCQkgICAgbG9jYXRpb24gICAJKDE0MTQsIDgzMikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjcKLQkJCQlQYXJlbnRfVmlldyAJQDEyNgotCQkJCWxvY2F0aW9uICAgCSgxODE1LCAxOTgyKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VGYXVsdHMiCi0JCQkJcGN0RGlzdCAgICAJMC44Nzg5OTIKLQkJCQloZWlnaHQgICAgIAkxMTMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzMxODAzODciCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNQotCQkJICAgIHN1cHBsaWVyICAgCUAxMDgKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCAyMDQ4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOAotCQkJCVBhcmVudF9WaWV3IAlAMTI2Ci0JCQkJbG9jYXRpb24gICAJKDE2NDQsIDIwMjApCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC45NDk1ODAKLQkJCQloZWlnaHQgICAgIAk1OQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyOQotCQkJCVBhcmVudF9WaWV3IAlAMTI2Ci0JCQkJbG9jYXRpb24gICAJKDE1OTMsIDE5NjMpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTY0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC44NDUzNzgKLQkJCQloZWlnaHQgICAgIAkxMTAKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzMiIgQDEzMAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTI1Ci0JCQkgICAgbG9jYXRpb24gICAJKDE0MTQsIDgzMikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzEKLQkJCQlQYXJlbnRfVmlldyAJQDEzMAotCQkJCWxvY2F0aW9uICAgCSgxNjYxLCAxMDY5KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMzMxODAzODgiCi0JCQkgICAgY2xpZW50ICAgICAJQDEyNQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTEKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAyLCAxNTA0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAyLCA5NjApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyCi0JCQkJUGFyZW50X1ZpZXcgCUAxMzAKLQkJCQlsb2NhdGlvbiAgIAkoMTgyMSwgMTAzOSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg1NzM2MgotCQkJCWhlaWdodCAgICAgCTExOQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjciIEAxMzMKLQkJICAgIGxvY2F0aW9uICAgCSgxMTc4LCAxMjM0KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBREYyRjk0MDI0RCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZUlucHV0IiBAMTM0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMKLQkJCSAgICBsb2NhdGlvbiAgIAkoODkwLCA1NjIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM1Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzQKLQkJCQlsb2NhdGlvbiAgIAkoODc4LCAxMzQzKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTEzMgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VJbnB1dCIKLQkJCQlwY3REaXN0ICAgIAkwLjgxOTgyMAotCQkJCWhlaWdodCAgICAgCTEwMwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRjk1MDE5MCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMzCi0JCQkgICAgc3VwcGxpZXIgICAJQDEwOQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMTc4LCAxMjM0KQotCQkJCSg5ODAsIDEyMzQpCi0JCQkJKDk4MCwgMTQxMCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAxNDEwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNgotCQkJCVBhcmVudF9WaWV3IAlAMTM0Ci0JCQkJbG9jYXRpb24gICAJKDEwNDYsIDEzNjQpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44Nzc2NjAKLQkJCQloZWlnaHQgICAgIAk2NgotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDI4IiBAMTM3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzMKLQkJCSAgICBsb2NhdGlvbiAgIAkoODkwLCA1NjIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzcKLQkJCQlsb2NhdGlvbiAgIAkoMTIzNiwgMTAzNikKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FERjJGOTUwMTlBIgotCQkJICAgIGNsaWVudCAgICAgCUAxMzMKLQkJCSAgICBzdXBwbGllciAgIAlAMTExCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDExNzgsIDEyMzQpCi0JCQkJKDEyNzcsIDEyMzQpCi0JCQkJKDEyNzcsIDk2MCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTE3OCwgMTIzNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NywgOTYwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzOQotCQkJCVBhcmVudF9WaWV3IAlAMTM3Ci0JCQkJbG9jYXRpb24gICAJKDExOTcsIDEwNTgpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43MzY0MTMKLQkJCQloZWlnaHQgICAgIAk4MQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMjkiIEAxNDAKLQkJICAgIGxvY2F0aW9uICAgCSgxNDY4LCAxMzQ1KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBREYyRkI4MDJGOSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZU91dHB1dCIgQDE0MQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQwCi0JCQkgICAgbG9jYXRpb24gICAJKDExODAsIDY3MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDIKLQkJCQlQYXJlbnRfVmlldyAJQDE0MQotCQkJCWxvY2F0aW9uICAgCSgxMzYyLCAxNjY5KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VPdXRwdXQiCi0JCQkJcGN0RGlzdCAgICAJMC44NDA5MDkKLQkJCQloZWlnaHQgICAgIAkxMDcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQURGMkZCOTAyMEEiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0MAotCQkJICAgIHN1cHBsaWVyICAgCUAxMTAKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDY4LCAxMzQ1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDY4LCAxNzMwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0MwotCQkJCVBhcmVudF9WaWV3IAlAMTQxCi0JCQkJbG9jYXRpb24gICAJKDE1NDYsIDE2NzYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44NjM2MzYKLQkJCQloZWlnaHQgICAgIAk3OAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDMwIiBAMTQ0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMTE4MCwgNjczKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE0NQotCQkJCVBhcmVudF9WaWV3IAlAMTQ0Ci0JCQkJbG9jYXRpb24gICAJKDE0MjcsIDEwMzcpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBREYyRkI5MDIwQiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTQwCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NjgsIDEzNDUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NjgsIDk2MCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNDYKLQkJCQlQYXJlbnRfVmlldyAJQDE0NAotCQkJCWxvY2F0aW9uICAgCSgxNTIzLCAxMDgwKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNjkwMzQxCi0JCQkJaGVpZ2h0ICAgICAJNTUKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjFGRDgwMTlGIgotCQkgICAgY2xpZW50ICAgICAJQDEwNgotCQkgICAgc3VwcGxpZXIgICAJQDEwMQotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjFGRTIwMTcxIgotCQkgICAgY2xpZW50ICAgICAJQDExMQotCQkgICAgc3VwcGxpZXIgICAJQDEwMgotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQ5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjFGRUUwMzFEIgotCQkgICAgY2xpZW50ICAgICAJQDEwOQotCQkgICAgc3VwcGxpZXIgICAJQDEwMwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUwCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjFGRjgwMUNEIgotCQkgICAgY2xpZW50ICAgICAJQDExMAotCQkgICAgc3VwcGxpZXIgICAJQDEwNAotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTUxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y2RjIwMDIwMDJEIgotCQkgICAgY2xpZW50ICAgICAJQDEwOAotCQkgICAgc3VwcGxpZXIgICAJQDEwNQotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTUyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMjI0LCAxNDU2KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTUyCi0JCQlsb2NhdGlvbiAgIAkoMTkzNywgMTMxMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1NzUKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICB3aWR0aCAgICAgIAk1OTMKLQkJICAgIGhlaWdodCAgICAgCTMxMgotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlUmVmZXJlbmNlIiBAMTUzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAyNTQ0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlpdGFsaWNzICAgIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTUzCi0JCQlsb2NhdGlvbiAgIAkoMTE5MywgMjQ2NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2NTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlUmVmZXJlbmNlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzFEQjAyREMiCi0JCSAgICB3aWR0aCAgICAgIAk2NzIKLQkJICAgIGhlaWdodCAgICAgCTE4MAotCQkgICAgYW5ub3RhdGlvbiAJOCkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDE1NAotCQkgICAgbG9jYXRpb24gICAJKDE1MjQsIDIyNzUpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDE1MwotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTUyNCwgMjI3NSkKLQkJCSgxNTI0LCAyNDU0KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE1NQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNjc3MjNEMDMxOSIKLQkJICAgIGNsaWVudCAgICAgCUAxMDgKLQkJICAgIHN1cHBsaWVyICAgCUAxNTMKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc3NiwgMjE3NikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc2LCAyMjc1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTU0KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNTYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRjY3NzIzNTAwREQiCi0JCSAgICBjbGllbnQgICAgIAlAMTEwCi0JCSAgICBzdXBwbGllciAgIAlAMTUzCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNzEsIDE4NTQpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM3MSwgMjI3NSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDE1NCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTU3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y2NzcyMjgwMkU3IgotCQkgICAgY2xpZW50ICAgICAJQDEwOQotCQkgICAgc3VwcGxpZXIgICAJQDE1MwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5ODAsIDE1MzQpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTgwLCAyMjc1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTU0KQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNjEiIEAxNTgKLQkJICAgIGxvY2F0aW9uICAgCSgyMjA2LCAyMjU5KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNzRFNzg0MDFCMSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZU1lc3NhZ2UiIEAxNTkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OAotCQkJICAgIGxvY2F0aW9uICAgCSg3MzQsIC0yODUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYwCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTkKLQkJCQlsb2NhdGlvbiAgIAkoMjA2OCwgMTY3MCkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMTYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlTWVzc2FnZSIKLQkJCQlwY3REaXN0ICAgIAkwLjkxMjIzMAotCQkJCWhlaWdodCAgICAgCTEzOQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGNzRFNzg2MDAwRiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTU4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE1MgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyMDYsIDE2MTIpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYxCi0JCQkJUGFyZW50X1ZpZXcgCUAxNTkKLQkJCQlsb2NhdGlvbiAgIAkoMjI2MCwgMTY3OCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNjIiIEAxNjIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1OAotCQkJICAgIGxvY2F0aW9uICAgCSg3MzQsIC0yODUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y3NEU3ODYwMDIzIgotCQkJICAgIGNsaWVudCAgICAgCUAxNTgKLQkJCSAgICBzdXBwbGllciAgIAlAMTUzCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIyMDYsIDIyNTkpCi0JCQkJKDIyMDYsIDI1NTYpCi0JCQkJKDE4NTYsIDI1NTYpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIyMDYsIDIyNTkpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4NTYsIDI1NTYpKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xIERlZmluaXRpb25zIgotCSAgICBxdWlkICAgICAgIAkiM0FENUU0OEEwMjYyIgotCSAgICB0aXRsZSAgICAgIAkiMi4xIERlZmluaXRpb25zIgotCSAgICB6b29tICAgICAgIAk4MwotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRGVmaW5pdGlvbiIgQDE2MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMyLCAxOTIpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjMKLQkJCWxvY2F0aW9uICAgCSg4OCwgMTYxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY4OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklEZWZpbml0aW9uIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2MwotCQkJbG9jYXRpb24gICAJKDg4LCAxMTEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY4OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEIxRDkwMTQyIgotCQkgICAgd2lkdGggICAgICAJNzA2Ci0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6VHlwZXMiIEAxNjQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4MjQsIDk0NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NAotCQkJbG9jYXRpb24gICAJKDE2ODYsIDg5NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNzYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJUeXBlcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkgICAgd2lkdGggICAgICAJMjk0Ci0JCSAgICBoZWlnaHQgICAgIAkxMjAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6SW1wb3J0IiBAMTY1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMTQ0LCA2MjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjUKLQkJCWxvY2F0aW9uICAgCSgxOTEwLCA1NDUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDY4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW1wb3J0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTRGOTAzREUiCi0JCSAgICB3aWR0aCAgICAgIAk0ODYKLQkJICAgIGhlaWdodCAgICAgCTE4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpNZXNzYWdlIiBAMTY2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMTEyLCAxMTg0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY2Ci0JCQlsb2NhdGlvbiAgIAkoMTkwMCwgMTA1NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICB3aWR0aCAgICAgIAk0NDIKLQkJICAgIGhlaWdodCAgICAgCTI4MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQb3J0VHlwZSIgQDE2NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgwOCwgMTQ4OCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NwotCQkJbG9jYXRpb24gICAJKDE1OTYsIDEzNjApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDI0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUG9ydFR5cGUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDN0YwMDFBNSIKLQkJICAgIHdpZHRoICAgICAgCTQ0MgotCQkgICAgaGVpZ2h0ICAgICAJMjgwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmciIEAxNjgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMzYsIDE3MjgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjgKLQkJCWxvY2F0aW9uICAgCSgyMTI0LCAxNjAwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQyNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkJpbmRpbmciKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEMjg2MDI2MSIKLQkJICAgIHdpZHRoICAgICAgCTQ0MgotCQkgICAgaGVpZ2h0ICAgICAJMjgwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkRlZmluaXRpb24iIEAxNjkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMyOCwgMjQwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY5Ci0JCQlsb2NhdGlvbiAgIAkoMTA3MywgMzkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTEwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgd2lkdGggICAgICAJNTI4Ci0JCSAgICBoZWlnaHQgICAgIAk0MjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MyIgQDE3MAotCQkgICAgbG9jYXRpb24gICAJKDEzNTgsIDg2MCkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyNzAyOUYiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMTcxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzIKLQkJCQlQYXJlbnRfVmlldyAJQDE3MQotCQkJCWxvY2F0aW9uICAgCSgxMzE3LCA1MzUpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQTI5MDM1NiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTcwCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNTgsIDg2MCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1OCwgNDUzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3MwotCQkJCVBhcmVudF9WaWV3IAlAMTcxCi0JCQkJbG9jYXRpb24gICAJKDE0MDMsIDUxMSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg1NjY0OQotCQkJCWhlaWdodCAgICAgCTQ1Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVR5cGVzIiBAMTc0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNzAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjIsIC0zNikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNzUKLQkJCQlQYXJlbnRfVmlldyAJQDE3NAotCQkJCWxvY2F0aW9uICAgCSgxNTg2LCA5MDkpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZVR5cGVzIgotCQkJCXBjdERpc3QgICAgCTAuNzc5MDk3Ci0JCQkJaGVpZ2h0ICAgICAJNDAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkgICAgY2xpZW50ICAgICAJQDE3MAotCQkJICAgIHN1cHBsaWVyICAgCUAxNjQKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTM1OCwgODYwKQotCQkJCSgxMzU4LCA5NDgpCi0JCQkJKDE2NzcsIDk0OCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTM1OCwgODYwKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjc3LCA5NDgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTc2Ci0JCQkJUGFyZW50X1ZpZXcgCUAxNzQKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMiwgOTg3KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODkyNjU1Ci0JCQkJaGVpZ2h0ICAgICAJMzkKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDU3IiBAMTc3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTYxMiwgNTk1KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDODY0REZGMDJFQyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTgiIEAxNzgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NwotCQkJICAgIGxvY2F0aW9uICAgCSgxMiwgMjI3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE3OQotCQkJCVBhcmVudF9WaWV3IAlAMTc4Ci0JCQkJbG9jYXRpb24gICAJKDE0MjMsIDUxMikKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJICAgIGNsaWVudCAgICAgCUAxNzcKLQkJCSAgICBzdXBwbGllciAgIAlAMTY5Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE2MTIsIDU5NSkKLQkJCQkoMTQ2NCwgNTk1KQotCQkJCSgxNDY0LCA0NTMpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MTIsIDU5NSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ2NCwgNDUzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MAotCQkJCVBhcmVudF9WaWV3IAlAMTc4Ci0JCQkJbG9jYXRpb24gICAJKDE1MjQsIDQ5NSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjg1ODY2NwotCQkJCWhlaWdodCAgICAgCTYwCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAxODEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE3NwotCQkJICAgIGxvY2F0aW9uICAgCSgxMiwgMjI3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4MgotCQkJCVBhcmVudF9WaWV3IAlAMTgxCi0JCQkJbG9jYXRpb24gICAJKDE2OTIsIDU1NykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlSW1wb3J0cyIKLQkJCQlwY3REaXN0ICAgIAkwLjI4MDMzNQotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVEIgotCQkJICAgIGNsaWVudCAgICAgCUAxNzcKLQkJCSAgICBzdXBwbGllciAgIAlAMTY1Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTYxMiwgNTk1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAxLCA1OTUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTgzCi0JCQkJUGFyZW50X1ZpZXcgCUAxODEKLQkJCQlsb2NhdGlvbiAgIAkoMTg1NCwgNjUyKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuODQxMDA0Ci0JCQkJaGVpZ2h0ICAgICAJNTcKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODQKLQkJCQlQYXJlbnRfVmlldyAJQDE4MQotCQkJCWxvY2F0aW9uICAgCSgxNjc2LCA2NDYpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC4yMjU5NDEKLQkJCQloZWlnaHQgICAgIAk1MQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTMiIEAxODUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjc5LCAxMTM3KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjAzMDFFMiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxODYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE4NQotCQkJICAgIGxvY2F0aW9uICAgCSgyNzEsIDI3MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODcKLQkJCQlQYXJlbnRfVmlldyAJQDE4NgotCQkJCWxvY2F0aW9uICAgCSgxMjM4LCA1OTEpCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTYwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjA0MDBCNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMTg1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE2OQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNzksIDExMzcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNzksIDQ1MykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxODgKLQkJCQlQYXJlbnRfVmlldyAJQDE4NgotCQkJCWxvY2F0aW9uICAgCSgxMzIwLCA1ODYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjEuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44MDQ5NzQKLQkJCQloZWlnaHQgICAgIAk0MQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImVNZXNzYWdlcyIgQDE4OQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTg1Ci0JCQkgICAgbG9jYXRpb24gICAJKDI3MSwgMjczKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5MAotCQkJCVBhcmVudF9WaWV3IAlAMTg5Ci0JCQkJbG9jYXRpb24gICAJKDE2NDcsIDExNzEpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjQwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZU1lc3NhZ2VzIgotCQkJCXBjdERpc3QgICAgCTAuNjQzMTM3Ci0JCQkJaGVpZ2h0ICAgICAJMzgKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTYwNDAwQzEiCi0JCQkgICAgY2xpZW50ICAgICAJQDE4NQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjYKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTI3OSwgMTEzNykKLQkJCQkoMTI3OSwgMTIwOCkKLQkJCQkoMTg5MSwgMTIwOCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI3OSwgMTEzNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTg5MSwgMTIwOCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTEKLQkJCQlQYXJlbnRfVmlldyAJQDE4OQotCQkJCWxvY2F0aW9uICAgCSgxODIxLCAxMTcxKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4qIgotCQkJCXBjdERpc3QgICAgCTAuODk5MzQ2Ci0JCQkJaGVpZ2h0ICAgICAJMzgKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTIKLQkJCQlQYXJlbnRfVmlldyAJQDE4OQotCQkJCWxvY2F0aW9uICAgCSgxNzk3LCAxMjQ0KQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuODY0NDA3Ci0JCQkJaGVpZ2h0ICAgICAJMzYKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBAMTkzCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxMiwgMTE1OSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3MTAxMDQiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBAMTk0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxOTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMyNCwgMjE1KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5NQotCQkJCVBhcmVudF9WaWV3IAlAMTk0Ci0JCQkJbG9jYXRpb24gICAJKDExNzEsIDU5NCkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2NzIwMzRBIgotCQkJICAgIGNsaWVudCAgICAgCUAxOTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTY5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxMiwgMTE1OSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTIxMiwgNDUzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5NgotCQkJCVBhcmVudF9WaWV3IAlAMTk0Ci0JCQkJbG9jYXRpb24gICAJKDEyNTEsIDYyNCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc1Nzk2MgotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVBvcnRUeXBlcyIgQDE5NwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTkzCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMjQsIDIxNSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOTgKLQkJCQlQYXJlbnRfVmlldyAJQDE5NwotCQkJCWxvY2F0aW9uICAgCSgxMzkxLCAxNDUxKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VQb3J0VHlwZXMiCi0JCQkJcGN0RGlzdCAgICAJMC43MjM2OTgKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjcyMDM1NCIKLQkJCSAgICBjbGllbnQgICAgIAlAMTkzCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMjEyLCAxMTU5KQotCQkJCSgxMjEyLCAxNDkwKQotCQkJCSgxNTg3LCAxNDkwKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjEyLCAxMTU5KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTg3LCAxNDkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE5OQotCQkJCVBhcmVudF9WaWV3IAlAMTk3Ci0JCQkJbG9jYXRpb24gICAJKDE1MzMsIDE0NTEpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC45MjU2MTEKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwMAotCQkJCVBhcmVudF9WaWV3IAlAMTk3Ci0JCQkJbG9jYXRpb24gICAJKDE1MTIsIDE1NDApCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC44OTU4NTUKLQkJCQloZWlnaHQgICAgIAk1MAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTciIEAyMDEKLQkJICAgIGxvY2F0aW9uICAgCSgxMTE0LCAxNTg1KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjc3MDA5NSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTgiIEAyMDIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjAzCi0JCQkJUGFyZW50X1ZpZXcgCUAyMDIKLQkJCQlsb2NhdGlvbiAgIAkoMTA3MywgNjgwKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTY3ODAzNzEiCi0JCQkgICAgY2xpZW50ICAgICAJQDIwMQotCQkJICAgIHN1cHBsaWVyICAgCUAxNjkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTE0LCA0NTMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA0Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMDIKLQkJCQlsb2NhdGlvbiAgIAkoMTE1NSwgNzUyKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNzM2NzA0Ci0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlQmluZGluZ3MiIEAyMDUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwMQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDA2LCAyNDEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjA2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMDUKLQkJCQlsb2NhdGlvbiAgIAkoMTg1MSwgMTY3NCkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMDQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlQmluZGluZ3MiCi0JCQkJcGN0RGlzdCAgICAJMC43NjYzNDcKLQkJCQloZWlnaHQgICAgIAk0MwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjc4MDM3QiIKLQkJCSAgICBjbGllbnQgICAgIAlAMjAxCi0JCQkgICAgc3VwcGxpZXIgICAJQDE2OAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMTE0LCAxNTg1KQotCQkJCSgxMTE0LCAxNzE2KQotCQkJCSgyMTE1LCAxNzE2KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTE0LCAxNTg1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTE1LCAxNzE2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwNwotCQkJCVBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJbG9jYXRpb24gICAJKDIwNTMsIDE2NzcpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC45NDUwNzQKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIwOAotCQkJCVBhcmVudF9WaWV3IAlAMjA1Ci0JCQkJbG9jYXRpb24gICAJKDIwMTQsIDE3NTQpCi0JCQkJYW5jaG9yICAgICAJMwotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTU4Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSJ7b3JkZXJlZH0iCi0JCQkJcGN0RGlzdCAgICAJMC45MTEwNzIKLQkJCQloZWlnaHQgICAgIAkzOAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlNlcnZpY2UiIEAyMDkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4NDAsIDIwNDgpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMDkKLQkJCWxvY2F0aW9uICAgCSgxNjI4LCAxOTIwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQyNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlNlcnZpY2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVEOEYwMDJGOCIKLQkJICAgIHdpZHRoICAgICAgCTQ0MgotCQkgICAgaGVpZ2h0ICAgICAJMjgwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTkiIEAyMTAKLQkJICAgIGxvY2F0aW9uICAgCSgxMDY2LCAxNTMzKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNjdCMDMxMSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjAiIEAyMTEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIxMAotCQkJICAgIGxvY2F0aW9uICAgCSgtNTIxLCAtMTExKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMgotCQkJCVBhcmVudF9WaWV3IAlAMjExCi0JCQkJbG9jYXRpb24gICAJKDEwMjUsIDY2OSkKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2N0QwMDdGIgotCQkJICAgIGNsaWVudCAgICAgCUAyMTAKLQkJCSAgICBzdXBwbGllciAgIAlAMTY5Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2NiwgMTUzMykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA2NiwgNDUzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIxMwotCQkJCVBhcmVudF9WaWV3IAlAMjExCi0JCQkJbG9jYXRpb24gICAJKDExMDksIDc1NikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjcxOTY5NwotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZVNlcnZpY2VzIiBAMjE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyMTAKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTUyMSwgLTExMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyMTUKLQkJCQlQYXJlbnRfVmlldyAJQDIxNAotCQkJCWxvY2F0aW9uICAgCSgxMzkzLCAyMDI4KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTIwNAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VTZXJ2aWNlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjc5MTgyNAotCQkJCWhlaWdodCAgICAgCTMyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUU2N0QwMDg5IgotCQkJICAgIGNsaWVudCAgICAgCUAyMTAKLQkJCSAgICBzdXBwbGllciAgIAlAMjA5Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEwNjYsIDE1MzMpCi0JCQkJKDEwNjYsIDIwNTkpCi0JCQkJKDE2MTksIDIwNTkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjYsIDE1MzMpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MTksIDIwNTkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTU1NCwgMjAzMSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjk0MDE5NwotCQkJCWhlaWdodCAgICAgCTI5Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjE3Ci0JCQkJUGFyZW50X1ZpZXcgCUAyMTQKLQkJCQlsb2NhdGlvbiAgIAkoMTUzMiwgMjExMykKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjkyMDUxNQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIxOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMUY4MDM4MiIKLQkJICAgIGNsaWVudCAgICAgCUAxNjkKLQkJICAgIHN1cHBsaWVyICAgCUAxNjMKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA2NCwgMjYzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc4NSwgMjYzKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICIyLjEuMyBFeHRlbnNpYmlsaXR5IgotCSAgICBxdWlkICAgICAgIAkiM0FENjBDNTEwMTkyIgotCSAgICB0aXRsZSAgICAgIAkiMi4xLjMgRXh0ZW5zaWJpbGl0eSIKLQkgICAgem9vbSAgICAgICAJODAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAkwCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZyIgQDIxOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1NzYsIDE1ODQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyMTkKLQkJCWxvY2F0aW9uICAgCSg0OTQsIDE1MzEpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUQyODYwMjYxIgotCQkgICAgd2lkdGggICAgICAJMTgyCi0JCSAgICBoZWlnaHQgICAgIAkxMzAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UG9ydCIgQDIyMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCAxODg4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjIwCi0JCQlsb2NhdGlvbiAgIAkoMTQ4NywgMTgzNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQb3J0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDkxNzAyODYiCi0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6U2VydmljZSIgQDIyMQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDI0LCAxNzI4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjIxCi0JCQlsb2NhdGlvbiAgIAkoMTM0MiwgMTY3NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxNjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJTZXJ2aWNlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDhGMDAyRjgiCi0JCSAgICB3aWR0aCAgICAgIAkxODIKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nRmF1bHQiIEAyMjIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIxNiwgMjMzNikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyMgotCQkJbG9jYXRpb24gICAJKDEwODgsIDIyODMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjU2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQmluZGluZ0ZhdWx0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE5RTAzQTYiCi0JCSAgICB3aWR0aCAgICAgIAkyNzQKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpCaW5kaW5nT3BlcmF0aW9uIiBAMjIzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDczNiwgMTc2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyMwotCQkJbG9jYXRpb24gICAJKDU2MywgMTcwNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nT3BlcmF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RDNDQjAxNDUiCi0JCSAgICB3aWR0aCAgICAgIAkzNjQKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyMjQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBTdXBwcmVzc0F0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDE2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyNAotCQkJbG9jYXRpb24gICAJKDE0OTUsIDEzNikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3ODYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjI0Ci0JCQlsb2NhdGlvbiAgIAkoMTQ5NSwgODYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTc4NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEIxMjQwMkFCIgotCQkgICAgd2lkdGggICAgICAJODA0Ci0JCSAgICBoZWlnaHQgICAgIAkxNzIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6QmluZGluZ0lucHV0IiBAMjI1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDkyOCwgMTk1MikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyNQotCQkJbG9jYXRpb24gICAJKDgwMCwgMTg5OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNTYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nSW5wdXQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA4QTgyMDJENCIKLQkJICAgIHdpZHRoICAgICAgCTI3NAotCQkgICAgaGVpZ2h0ICAgICAJMTMwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkJpbmRpbmdPdXRwdXQiIEAyMjYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAwOCwgMjE0NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyNgotCQkJbG9jYXRpb24gICAJKDg2MywgMjA5MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyOTAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCaW5kaW5nT3V0cHV0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUUwOEE4RjAyOEMiCi0JCSAgICB3aWR0aCAgICAgIAkzMDgKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjI3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTI5NikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyNwotCQkJbG9jYXRpb24gICAJKDc0LCAxMjM1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIwNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkRlZmluaXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVFNDNGMDA4RSIKLQkJICAgIHdpZHRoICAgICAgCTIyMgotCQkgICAgaGVpZ2h0ICAgICAJMTQ2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OlR5cGVzIiBAMjI4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQxNiwgMTQwOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDIyOAotCQkJbG9jYXRpb24gICAJKDMzNSwgMTM1NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJUeXBlcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkU5QTYwM0E4IgotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMjI5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ4MCwgNjg4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlpdGFsaWNzICAgIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjI5Ci0JCQlsb2NhdGlvbiAgIAkoMjA5LCA1ODApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTQyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRXh0ZW5zaWJsZUVsZW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGQ0ZBMDMzQSIKLQkJICAgIHdpZHRoICAgICAgCTU2MAotCQkgICAgaGVpZ2h0ICAgICAJMjQwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjMwCi0JCSAgICBsb2NhdGlvbiAgIAkoNDgwLCAxMDM5KQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUAyMjkKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDQ4MCwgMTAzOSkKLQkJCSg0ODAsIDgwOCkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ2MDBDQjAwQUEiCi0JCSAgICBjbGllbnQgICAgIAlAMjIwCi0JCSAgICBzdXBwbGllciAgIAlAMjI5Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NjYsIDE4MjQpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU2NiwgMTAzOSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDIzMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjMyCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NUI1QTQwMjdFIgotCQkgICAgY2xpZW50ICAgICAJQDIyNgotCQkgICAgc3VwcGxpZXIgICAJQDIyOQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDk3LCAyMDc5KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwOTcsIDEwMzkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzMwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRTA5Mzg2MDJDOSIKLQkJICAgIGNsaWVudCAgICAgCUAyMjIKLQkJICAgIHN1cHBsaWVyICAgCUAyMjkKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxOSwgMjI3MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjE5LCAxMDM5KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg1QjU5QjAwNzIiCi0JCSAgICBjbGllbnQgICAgIAlAMjI1Ci0JCSAgICBzdXBwbGllciAgIAlAMjI5Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk4OCwgMTg4NykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg5ODgsIDEwMzkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzNQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDYwMDkyMDJGNyIKLQkJICAgIGNsaWVudCAgICAgCUAyMjMKLQkJICAgIHN1cHBsaWVyICAgCUAyMjkKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzk3LCAxNjk1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc5NywgMTAzOSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDIzMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM2Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZBMEYwMkYwIgotCQkgICAgY2xpZW50ICAgICAJQDIxOQotCQkgICAgc3VwcGxpZXIgICAJQDIyOQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDEsIDE1MTkpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAxLCAxMDM5KQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjMwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAyMzcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkRCODAzRDQiCi0JCSAgICBjbGllbnQgICAgIAlAMjI3Ci0JCSAgICBzdXBwbGllciAgIAlAMjI5Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxMSwgMTIyMykKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTEsIDEwMzkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDIzOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEJFQjAxMDMxMSIKLQkJICAgIGNsaWVudCAgICAgCUAyMjgKLQkJICAgIHN1cHBsaWVyICAgCUAyMjkKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDE0LCAxMzQ0KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQxNCwgMTAzOSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDIzMCkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjM5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUZBMjAwMjVFIgotCQkgICAgY2xpZW50ICAgICAJQDIyMQotCQkgICAgc3VwcGxpZXIgICAJQDIyOQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDI5LCAxNjYzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0MjksIDEwMzkpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyMzApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNDAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgNjg4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjQwCi0JCQlsb2NhdGlvbiAgIAkoMTYzMiwgNTgzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU0NQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCSAgICB3aWR0aCAgICAgIAk1NjMKLQkJICAgIGhlaWdodCAgICAgCTIzNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMjQxCi0JCSAgICBsb2NhdGlvbiAgIAkoMTE5MSwgNjcyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAyNDIKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0MQotCQkJICAgIGxvY2F0aW9uICAgCSgyMywgNTYwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0MwotCQkJCVBhcmVudF9WaWV3IAlAMjQyCi0JCQkJbG9jYXRpb24gICAJKDg0NywgNjMxKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkQxNDAxOUUiCi0JCQkgICAgY2xpZW50ICAgICAJQDI0MQotCQkJICAgIHN1cHBsaWVyICAgCUAyMjkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMTkxLCA2NzIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc2MCwgNjcyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NAotCQkJCVBhcmVudF9WaWV3IAlAMjQyCi0JCQkJbG9jYXRpb24gICAJKDgzMCwgNjI4KQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODM5Njk1Ci0JCQkJaGVpZ2h0ICAgICAJNDUKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBAMjQ1Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjMsIDU2MCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNDYKLQkJCQlQYXJlbnRfVmlldyAJQDI0NQotCQkJCWxvY2F0aW9uICAgCSgxMzU1LCA1MjIpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDUwCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlwY3REaXN0ICAgIAkwLjM3OTA3MAotCQkJCWhlaWdodCAgICAgCTE1MQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjQxCi0JCQkgICAgc3VwcGxpZXIgICAJQDI0MAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExOTEsIDY3MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyMywgNjcyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI0NwotCQkJCVBhcmVudF9WaWV3IAlAMjQ1Ci0JCQkJbG9jYXRpb24gICAJKDE0OTYsIDYyNykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjcwOTQwMgotCQkJCWhlaWdodCAgICAgCTQ2Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjQ4Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNDUKLQkJCQlsb2NhdGlvbiAgIAkoMTQ2MywgNzY0KQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNjMyNDc5Ci0JCQkJaGVpZ2h0ICAgICAJOTIKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpXU0RMRWxlbWVudCIgQDI0OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDA4LCAxOTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCWl0YWxpY3MgICAgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNDkKLQkJCWxvY2F0aW9uICAgCSg2MzAsIDg0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTc1NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIldTRExFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1QzZBMzAyREQiCi0JCSAgICB3aWR0aCAgICAgIAk3NzQKLQkJICAgIGhlaWdodCAgICAgCTI0MAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDI1MAotCQkgICAgbG9jYXRpb24gICAJKDEwMDgsIDQwMikKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMjQ5Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMDA4LCA0MDIpCi0JCQkoMTAwOCwgMzEyKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRTNDMDNENCIKLQkJICAgIGNsaWVudCAgICAgCUAyMjkKLQkJICAgIHN1cHBsaWVyICAgCUAyNDkKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDkyLCA1NjgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDkyLCA0MDIpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNTApCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRCMTQ5MDNEMCIKLQkJICAgIGNsaWVudCAgICAgCUAyNDAKLQkJICAgIHN1cHBsaWVyICAgCUAyMjQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjAxNSwgNTcxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTUsIDI0NikpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI1MwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCRERGNTM1MDJDMyIKLQkJICAgIGNsaWVudCAgICAgCUAyNDAKLQkJICAgIHN1cHBsaWVyICAgCUAyNDkKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc2MiwgNTcxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NjIsIDQwMikKLQkJICAgIGRyYXdTdXBwbGllciAJQDI1MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAyNTQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAxNiwgMTM2MCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI1NAotCQkJbG9jYXRpb24gICAJKDE3MzEsIDEzMDcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTcwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0IyNEFDMDAyQUUiCi0JCSAgICB3aWR0aCAgICAgIAk1ODgKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjU1Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0NCMjRBRUMwMUNCIgotCQkgICAgY2xpZW50ICAgICAJQDI1NAotCQkgICAgc3VwcGxpZXIgICAJQDI0MAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzk2LCAxMjk1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3OTYsIDgwNSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ2MyIgQDI1NgotCQkgICAgbG9jYXRpb24gICAJKDIzMTEsIDE2ODYpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0Y3ODk2QTIwMjZFIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJlbnQiIEAyNTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NgotCQkJICAgIGxvY2F0aW9uICAgCSgyNzksIDI5NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNTgKLQkJCQlQYXJlbnRfVmlldyAJQDI1NwotCQkJCWxvY2F0aW9uICAgCSgyNDIyLCAxMzMzKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3BhcmVudCIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJCIgotCQkJICAgIGNsaWVudCAgICAgCUAyNTYKLQkJCSAgICBzdXBwbGllciAgIAlAMjU0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIzMTEsIDE2ODYpCi0JCQkJKDI0MzIsIDE2ODYpCi0JCQkJKDI0MzIsIDEzNzQpCi0JCQkJKDIzMTAsIDEzNzQpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzMTAsIDEzNzQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjU5Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNTcKLQkJCQlsb2NhdGlvbiAgIAkoMjM2NiwgMTQyOCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiY2hpbGRyZW4iIEAyNjAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI1NgotCQkJICAgIGxvY2F0aW9uICAgCSgyNzksIDI5NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjEKLQkJCQlQYXJlbnRfVmlldyAJQDI2MAotCQkJCWxvY2F0aW9uICAgCSgxODk5LCAxNTM3KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE2OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2NoaWxkcmVuIgotCQkJCXBjdERpc3QgICAgCTAuNzk4NTYxCi0JCQkJaGVpZ2h0ICAgICAJMTE4Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0Y3ODk2QTcwMTJDIgotCQkJICAgIGNsaWVudCAgICAgCUAyNTYKLQkJCSAgICBzdXBwbGllciAgIAlAMjU0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIzMTEsIDE2ODYpCi0JCQkJKDIwMTYsIDE2ODYpCi0JCQkJKDIwMTYsIDE0MjUpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzMTEsIDE2ODYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIwMTYsIDE0MjUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYyCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjAKLQkJCQlsb2NhdGlvbiAgIAkoMjA3MCwgMTQ4MSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCSAgICBxdWlkICAgICAgIAkiM0FFOEVENzIwMUJEIgotCSAgICB0aXRsZSAgICAgIAkiMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nIgotCSAgICB6b29tICAgICAgIAk5MAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJSW1wb3J0IiBAMjYzCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3MTIsIDIyNCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI2MwotCQkJbG9jYXRpb24gICAJKDE0MjIsIDE3NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1ODAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSW1wb3J0IikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI2MwotCQkJbG9jYXRpb24gICAJKDE0MjIsIDEyNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTgwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxJbnRlcmZhY2U+PiIpCi0JCSAgICBpY29uICAgICAgIAkiSW50ZXJmYWNlIgotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QjIwMjAxMTkiCi0JCSAgICB3aWR0aCAgICAgIAk1OTgKLQkJICAgIGhlaWdodCAgICAgCTIxOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpOYW1lc3BhY2UiIEAyNjQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMyLCAxMTM2KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjY0Ci0JCQlsb2NhdGlvbiAgIAkoMjAyLCAxMDQxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2MQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk5hbWVzcGFjZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFQTNDRDMwMDMwIgotCQkgICAgd2lkdGggICAgICAJNDc5Ci0JCSAgICBoZWlnaHQgICAgIAkyMTUKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RTY2hlbWEiIEAyNjUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTYzMiwgMTIxNikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI2NQotCQkJbG9jYXRpb24gICAJKDEyOTQsIDExNDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjc2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiWFNEU2NoZW1hIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNzRCMTgyNTAwQkIiCi0JCSAgICB3aWR0aCAgICAgIAk2OTQKLQkJICAgIGhlaWdodCAgICAgCTE3MwotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMjY2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQwMCwgMzg0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjY2Ci0JCQlsb2NhdGlvbiAgIAkoMTY0LCAyMzYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRGVmaW5pdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0M0YwMDhFIgotCQkgICAgd2lkdGggICAgICAJNDkwCi0JCSAgICBoZWlnaHQgICAgIAkzMjAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQzNyIgQDI2NwotCQkgICAgbG9jYXRpb24gICAJKDMwOSwgNzg2KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRDU1MDAyRCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZU5hbWVzcGFjZXMiIEAyNjgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI2NwotCQkJICAgIGxvY2F0aW9uICAgCSgtOTEsIDI1OCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNjkKLQkJCQlQYXJlbnRfVmlldyAJQDI2OAotCQkJCWxvY2F0aW9uICAgCSg0NjEsIDk1NikKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyODgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlTmFtZXNwYWNlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjY5ODg0MgotCQkJCWhlaWdodCAgICAgCTE1MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRDU2MDMzMiIKLQkJCSAgICBjbGllbnQgICAgIAlAMjY3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI2NAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMwOSwgNzg2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzMDksIDEwMjkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjcwCi0JCQkJUGFyZW50X1ZpZXcgCUAyNjgKLQkJCQlsb2NhdGlvbiAgIAkoMjQ4LCA5NzMpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC43Njg3MDcKLQkJCQloZWlnaHQgICAgIAk2MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MQotCQkJCVBhcmVudF9WaWV3IAlAMjY4Ci0JCQkJbG9jYXRpb24gICAJKDIyOCwgOTEzKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNTI1MDk3Ci0JCQkJaGVpZ2h0ICAgICAJODIKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzOCIgQDI3MgotCQkJICAgIFBhcmVudF9WaWV3IAlAMjY3Ci0JCQkgICAgbG9jYXRpb24gICAJKC05MSwgMjU4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3MwotCQkJCVBhcmVudF9WaWV3IAlAMjcyCi0JCQkJbG9jYXRpb24gICAJKDI2OCwgNTkyKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FFQTNENTYwMzI4IgotCQkJICAgIGNsaWVudCAgICAgCUAyNjcKLQkJCSAgICBzdXBwbGllciAgIAlAMjY2Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzA5LCA3ODYpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDMwOSwgNTQ0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3NAotCQkJCVBhcmVudF9WaWV3IAlAMjcyCi0JCQkJbG9jYXRpb24gICAJKDIzOSwgNTgzKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODQ0OTYxCi0JCQkJaGVpZ2h0ICAgICAJNzEKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJbXBvcnQiIEAyNzUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ3MiwgNzIwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjc1Ci0JCQlsb2NhdGlvbiAgIAkoMTI1NSwgNTgwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQzNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkltcG9ydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUU0RjkwM0RFIgotCQkgICAgd2lkdGggICAgICAJNDUyCi0JCSAgICBoZWlnaHQgICAgIAkzMDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ1MSIgQDI3NgotCQkgICAgbG9jYXRpb24gICAJKDE0ODYsIDEwMDEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QjFEQ0MwMkU1IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlU2NoZW1hIiBAMjc3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNzYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OAotCQkJCVBhcmVudF9WaWV3IAlAMjc3Ci0JCQkJbG9jYXRpb24gICAJKDE3MzcsIDEwMTgpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjA0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZVNjaGVtYSIKLQkJCQlwY3REaXN0ICAgIAkwLjU5MjU5MwotCQkJCWhlaWdodCAgICAgCTEwNQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxRENFMDI3MCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjc2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI2NQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNDg2LCAxMDAxKQotCQkJCSgxNjMyLCAxMDAxKQotCQkJCSgxNjMyLCAxMTMwKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg2LCAxMDAxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjMyLCAxMTMwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3OQotCQkJCVBhcmVudF9WaWV3IAlAMjc3Ci0JCQkJbG9jYXRpb24gICAJKDE1NjMsIDEwMTgpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC41OTI1OTMKLQkJCQloZWlnaHQgICAgIAk3MAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDUyIiBAMjgwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyNzYKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTEwLCAtMTAzKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxRENFMDI3QSIKLQkJCSAgICBjbGllbnQgICAgIAlAMjc2Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI3NQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0ODYsIDg3MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4NiwgODcyKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMzkiIEAyODEKLQkJICAgIGxvY2F0aW9uICAgCSgxMDg3LCA0MDMpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FFQTNFM0EwMDJEIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ0MCIgQDI4MgotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgxCi0JCQkgICAgbG9jYXRpb24gICAJKDY4NywgLTEyNSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyODMKLQkJCQlQYXJlbnRfVmlldyAJQDI4MgotCQkJCWxvY2F0aW9uICAgCSgxNDA2LCA0ODApCi0JCQkJaGlkZGVuICAgICAJVFJVRQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQ1MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQUVBM0UzQzAxRjIiCi0JCQkgICAgY2xpZW50ICAgICAJQDI4MQotCQkJICAgIHN1cHBsaWVyICAgCUAyNzUKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTA4NywgNDAzKQotCQkJCSgxMzY0LCA0MDMpCi0JCQkJKDEzNjQsIDU2OCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA4NywgNDAzKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzY0LCA1NjgpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZURlZmluaXRpb24iIEAyODQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4MQotCQkJICAgIGxvY2F0aW9uICAgCSg2ODcsIC0xMjUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg1Ci0JCQkJUGFyZW50X1ZpZXcgCUAyODQKLQkJCQlsb2NhdGlvbiAgIAkoODA1LCAzNjMpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjE2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZURlZmluaXRpb24iCi0JCQkJcGN0RGlzdCAgICAJMC42Mzc1MzIKLQkJCQloZWlnaHQgICAgIAk0MQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRUEzRTNDMDFFOCIKLQkJCSAgICBjbGllbnQgICAgIAlAMjgxCi0JCQkgICAgc3VwcGxpZXIgICAJQDI2NgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwODcsIDQwMykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjQ1LCA0MDMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjg2Ci0JCQkJUGFyZW50X1ZpZXcgCUAyODQKLQkJCQlsb2NhdGlvbiAgIAkoNzI3LCA0NTYpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC44MTQ5MTAKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTciIEAyODcKLQkJICAgIGxvY2F0aW9uICAgCSg3MzcsIDgyNikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU4IiBAMjg4Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAyODcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY3MSwgMTA2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI4OQotCQkJCVBhcmVudF9WaWV3IAlAMjg4Ci0JCQkJbG9jYXRpb24gICAJKDU1MiwgNjQ3KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M4NjRERkYwMkVFIgotCQkJICAgIGNsaWVudCAgICAgCUAyODcKLQkJCSAgICBzdXBwbGllciAgIAlAMjY2Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDczNywgODI2KQotCQkJCSg1MTAsIDgyNikKLQkJCQkoNTEwLCA1NDQpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDczNywgODI2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MTAsIDU0NCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyOTAKLQkJCQlQYXJlbnRfVmlldyAJQDI4OAotCQkJCWxvY2F0aW9uICAgCSg0NTcsIDU5NSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUltcG9ydHMiIEAyOTEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI4NwotCQkJICAgIGxvY2F0aW9uICAgCSgtNjcxLCAxMDYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjkyCi0JCQkJUGFyZW50X1ZpZXcgCUAyOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTE0NCwgNzczKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE4MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VJbXBvcnRzIgotCQkJCXBjdERpc3QgICAgCTAuNzk5MTg5Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg2NERGRjAyRUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDI4NwotCQkJICAgIHN1cHBsaWVyICAgCUAyNzUKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzcsIDgyNikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI0NiwgODI2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI5MwotCQkJCVBhcmVudF9WaWV3IAlAMjkxCi0JCQkJbG9jYXRpb24gICAJKDExODAsIDg3OSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjg3MjIxMQotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjk0Ci0JCQkJUGFyZW50X1ZpZXcgCUAyOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTE2MiwgOTMzKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuODM3NzI4Ci0JCQkJaGVpZ2h0ICAgICAJMTA3Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI5NQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGNkYyMDBEMDM0MCIKLQkJICAgIGNsaWVudCAgICAgCUAyNzUKLQkJICAgIHN1cHBsaWVyICAgCUAyNjMKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU1NSwgNTY4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NTUsIDMzMykpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4yIFR5cGVzIgotCSAgICBxdWlkICAgICAgIAkiM0I4NUFFNTkwMzdFIgotCSAgICB0aXRsZSAgICAgIAkiMi4yIFR5cGVzIgotCSAgICB6b29tICAgICAgIAk5MAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTgxCi0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6eHNkOjpYU0RUeXBlRGVmaW5pdGlvbiIgQDI5NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAxMjMyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlpdGFsaWNzICAgIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjk2Ci0JCQlsb2NhdGlvbiAgIAkoODk1LCAxMTU3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ4MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlhTRFR5cGVEZWZpbml0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY2RUNEMzAyQTkiCi0JCSAgICB3aWR0aCAgICAgIAk1MDAKLQkJICAgIGhlaWdodCAgICAgCTE3NAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTREVsZW1lbnREZWNsYXJhdGlvbiIgQDI5NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTM2LCAxNjAwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjk3Ci0JCQlsb2NhdGlvbiAgIAkoOTA2LCAxNTMxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlhTREVsZW1lbnREZWNsYXJhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I2NkVENTgwMjE0IgotCQkgICAgd2lkdGggICAgICAJNDc4Ci0JCSAgICBoZWlnaHQgICAgIAkxNjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDI5OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMjgwLCAxOTY4KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMjk4Ci0JCQlsb2NhdGlvbiAgIAkoMTAyMiwgMTgyOCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MTcKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXNzYWdlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Qzk1OTAwNzgiCi0JCSAgICB3aWR0aCAgICAgIAk1MzUKLQkJICAgIGhlaWdodCAgICAgCTMwNQotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpQYXJ0IiBAMjk5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDM1MiwgMTE4NCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI5OQotCQkJbG9jYXRpb24gICAJKDEyOCwgMTA2NykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQYXJ0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0UxQzAzMkUiCi0JCSAgICB3aWR0aCAgICAgIAk0NjYKLQkJICAgIGhlaWdodCAgICAgCTI1OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ3IiBAMzAwCi0JCSAgICBsb2NhdGlvbiAgIAkoNzM1LCAxMTcyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQkU5MDBDNCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAidHlwZURlZmluaXRpb24iIEAzMDEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMAotCQkJICAgIGxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMDIKLQkJCQlQYXJlbnRfVmlldyAJQDMwMQotCQkJCWxvY2F0aW9uICAgCSg3NzUsIDExMzMpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjc2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrdHlwZURlZmluaXRpb24iCi0JCQkJcGN0RGlzdCAgICAJMC4yNjkwMDYKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQkU5MDMyNyIKLQkJCSAgICBjbGllbnQgICAgIAlAMzAwCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5NgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDczNSwgMTE3MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODg2LCAxMTcyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwMwotCQkJCVBhcmVudF9WaWV3IAlAMzAxCi0JCQkJbG9jYXRpb24gICAJKDgzOSwgMTIwNykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY4ODcwNQotCQkJCWhlaWdodCAgICAgCTM1Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNDgiIEAzMDQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwMAotCQkJICAgIGxvY2F0aW9uICAgCSgxNDMsIDY3NikKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCMUJFOTAzMzEiCi0JCQkgICAgY2xpZW50ICAgICAJQDMwMAotCQkJICAgIHN1cHBsaWVyICAgCUAyOTkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MzUsIDExNzIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU4NSwgMTE3MikpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQ5IiBAMzA1Ci0JCSAgICBsb2NhdGlvbiAgIAkoNTI3LCAxNTkyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQzEyMDNCMiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZWxlbWVudERlY2xhcmF0aW9uIiBAMzA2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMDUKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTY1LCAxMDk2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwNwotCQkJCVBhcmVudF9WaWV3IAlAMzA2Ci0JCQkJbG9jYXRpb24gICAJKDY2NiwgMTU1NCkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzNzIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitlbGVtZW50RGVjbGFyYXRpb24iCi0JCQkJcGN0RGlzdCAgICAJMC4zNzUzOTQKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNCOEIxQzE0MDAxQyIKLQkJCSAgICBjbGllbnQgICAgIAlAMzA1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI5NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODk3LCAxNTkyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMwOAotCQkJCVBhcmVudF9WaWV3IAlAMzA2Ci0JCQkJbG9jYXRpb24gICAJKDgwNywgMTY0NSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc1NTg3NwotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNTAiIEAzMDkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMwNQotCQkJICAgIGxvY2F0aW9uICAgCSgtNjUsIDEwOTYpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I4QjFDMTQwMDI2IgotCQkJICAgIGNsaWVudCAgICAgCUAzMDUKLQkJCSAgICBzdXBwbGllciAgIAlAMjk5Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDUyNywgMTU5MikKLQkJCQkoNDM3LCAxNTkyKQotCQkJCSg0MzcsIDEzMTMpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUyNywgMTU5MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDM3LCAxMzEzKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTUiIEAzMTAKLQkJICAgIGxvY2F0aW9uICAgCSgzMjIsIDE5MTEpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M0NjgyOTMwM0U1IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlTWVzc2FnZSIgQDMxMQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzEwCi0JCQkgICAgbG9jYXRpb24gICAJKC0xNCwgMTE5MSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTIKLQkJCQlQYXJlbnRfVmlldyAJQDMxMQotCQkJCWxvY2F0aW9uICAgCSg4MzgsIDE4NzIpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjE2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZU1lc3NhZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC43NDg1NjAKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDNDY4Mjk2MDEwRSIKLQkJCSAgICBjbGllbnQgICAgIAlAMzEwCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5OAotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDMyMiwgMTkxMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAxMywgMTkxMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMTMKLQkJCQlQYXJlbnRfVmlldyAJQDMxMQotCQkJCWxvY2F0aW9uICAgCSg5NDMsIDE5NjUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU2IiBAMzE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTAKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE0LCAxMTkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDNDY4Mjk2MDExOCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzEwCi0JCQkgICAgc3VwcGxpZXIgICAJQDI5OQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgzMjIsIDE5MTEpCi0JCQkJKDIyOSwgMTkxMSkKLQkJCQkoMjI5LCAxMzEzKSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgzMjIsIDE5MTEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyOSwgMTMxMykpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpUeXBlcyIgQDMxNQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4MDAsIDYwOCkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMxNQotCQkJbG9jYXRpb24gICAJKDYxNSwgNTEyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM3MQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlR5cGVzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRTlBNjAzQTgiCi0JCSAgICB3aWR0aCAgICAgIAkzODkKLQkJICAgIGhlaWdodCAgICAgCTIxNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpEZWZpbml0aW9uIiBAMzE2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMTYwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzE2Ci0JCQlsb2NhdGlvbiAgIAkoNzQsIDEwNykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJEZWZpbml0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RTQzRjAwOEUiCi0JCSAgICB3aWR0aCAgICAgIAkyMjIKLQkJICAgIGhlaWdodCAgICAgCTEzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUzIiBAMzE3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMjM0LCA2MDQpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkVBMjcwMjlGIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlVHlwZXMiIEAzMTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMxNwotCQkJICAgIGxvY2F0aW9uICAgCSgtMTUwLCAzOTYpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzE5Ci0JCQkJUGFyZW50X1ZpZXcgCUAzMTgKLQkJCQlsb2NhdGlvbiAgIAkoNDgwLCA2NDApCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjA3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZVR5cGVzIgotCQkJCXBjdERpc3QgICAgCTAuNjYxMDE3Ci0JCQkJaGVpZ2h0ICAgICAJMzYKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNkEiCi0JCQkgICAgY2xpZW50ICAgICAJQDMxNwotCQkJICAgIHN1cHBsaWVyICAgCUAzMTUKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMzQsIDYwNCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjA2LCA2MDQpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzIwCi0JCQkJUGFyZW50X1ZpZXcgCUAzMTgKLQkJCQlsb2NhdGlvbiAgIAkoNTI2LCA1NjkpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43ODM4ODMKLQkJCQloZWlnaHQgICAgIAkzNgotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDU0IiBAMzIxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMTcKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTE1MCwgMzk2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMgotCQkJCVBhcmVudF9WaWV3IAlAMzIxCi0JCQkJbG9jYXRpb24gICAJKDEzMywgMzEzKQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk2MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQjhCRUEyOTAzNTYiCi0JCQkgICAgY2xpZW50ICAgICAJQDMxNwotCQkJICAgIHN1cHBsaWVyICAgCUAzMTYKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMjM0LCA2MDQpCi0JCQkJKDE3NCwgNjA0KQotCQkJCSgxNzQsIDIyNSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM0LCA2MDQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3NCwgMjI1KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyMwotCQkJCVBhcmVudF9WaWV3IAlAMzIxCi0JCQkJbG9jYXRpb24gICAJKDIyOCwgMjcxKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxLi4xIgotCQkJCXBjdERpc3QgICAgCTAuODk3NzI5Ci0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJVHlwZXMiIEAzMjQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNjQwLCAyMjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzMjQKLQkJCWxvY2F0aW9uICAgCSg1MjUsIDIwMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMzAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJVHlwZXMiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzI0Ci0JCQlsb2NhdGlvbiAgIAkoNTI1LCAxNTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0NBRENCQjIwMDUwIgotCQkgICAgd2lkdGggICAgICAJMjQ4Ci0JCSAgICBoZWlnaHQgICAgIAkxNjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMjUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTcyOCwgODAwKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzI1Ci0JCQlsb2NhdGlvbiAgIAkoMTM1OSwgNzUzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTczOQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQ0MzNjBENzAzOUMiCi0JCSAgICB3aWR0aCAgICAgIAk3NTcKLQkJICAgIGhlaWdodCAgICAgCTExOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp4c2Q6OlhTRFNjaGVtYSIgQDMyNgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxODU2LCAxMjE2KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzI2Ci0JCQlsb2NhdGlvbiAgIAkoMTUyOSwgMTEwMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2NTUKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJYU0RTY2hlbWEiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM3NEIxODI1MDBCQiIKLQkJICAgIHdpZHRoICAgICAgCTY3MwotCQkgICAgaGVpZ2h0ICAgICAJMjUwCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNTkiIEAzMjcKLQkJICAgIGxvY2F0aW9uICAgCSgxODI2LCA5NzUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0NDMzYxNDUwMEYyIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ2MCIgQDMyOAotCQkJICAgIFBhcmVudF9WaWV3IAlAMzI3Ci0JCQkgICAgbG9jYXRpb24gICAJKDMwNiwgNDQ3KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNDQzM2MTQ2MDIzRCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzI3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMyNQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE4MjYsIDk3NSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTgyNiwgODU5KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMyOQotCQkJCVBhcmVudF9WaWV3IAlAMzI4Ci0JCQkJbG9jYXRpb24gICAJKDE3NzQsIDkwMCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY1NjQ4OQotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAic2NoZW1hIiBAMzMwCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMjcKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA2LCA0NDcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMxCi0JCQkJUGFyZW50X1ZpZXcgCUAzMzAKLQkJCQlsb2NhdGlvbiAgIAkoMjAwNiwgMTAzMykKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNjgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitzY2hlbWEiCi0JCQkJcGN0RGlzdCAgICAJMC41MDc1NzYKLQkJCQloZWlnaHQgICAgIAkxODAKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQ0MzNjE0NjAyM0UiCi0JCQkgICAgY2xpZW50ICAgICAJQDMyNwotCQkJICAgIHN1cHBsaWVyICAgCUAzMjYKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxODI2LCA5NzUpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4MjYsIDEwOTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzMyCi0JCQkJUGFyZW50X1ZpZXcgCUAzMzAKLQkJCQlsb2NhdGlvbiAgIAkoMTc4OCwgMTA1MCkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjY1MTUxNQotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMzMwotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDQURDRDNCMDM4MCIKLQkJICAgIGNsaWVudCAgICAgCUAzMTUKLQkJICAgIHN1cHBsaWVyICAgCUAzMjQKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzA1LCA1MDApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzA1LCAzMDcpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OkV4dGVuc2libGVFbGVtZW50IiBAMzM0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEwNTYsIDIyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJaXRhbGljcyAgICAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMzNAotCQkJbG9jYXRpb24gICAJKDgxNSwgMTMwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ4MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkV4dGVuc2libGVFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1RkNGQTAzM0EiCi0JCSAgICB3aWR0aCAgICAgIAk1MDAKLQkJICAgIGhlaWdodCAgICAgCTIxMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzM1Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QkVCMDEwMzExIgotCQkgICAgY2xpZW50ICAgICAJQDMxNQotCQkgICAgc3VwcGxpZXIgICAJQDMzNAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg4NTQsIDUwMCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg4NTQsIDMzMCkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6RXh0ZW5zaWJpbGl0eUVsZW1lbnQiIEAzMzYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgNDY0KQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzM2Ci0JCQlsb2NhdGlvbiAgIAkoMTQ5MCwgMzY4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTY2OQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkV4dGVuc2liaWxpdHlFbGVtZW50IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1REJCNjAyQTkiCi0JCSAgICB3aWR0aCAgICAgIAk2ODcKLQkJICAgIGhlaWdodCAgICAgCTIxNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIxIiBAMzM3Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTIwNiwgNDkzKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDEzMDA3OSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMjIiIEAzMzgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMzNwotCQkJICAgIGxvY2F0aW9uICAgCSgtNTg2LCAyMzcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzM5Ci0JCQkJUGFyZW50X1ZpZXcgCUAzMzgKLQkJCQlsb2NhdGlvbiAgIAkoMTEzNiwgMzg2KQotCQkJCWhpZGRlbiAgICAgCVRSVUUKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAk0NTAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUZEMTQwMTlFIgotCQkJICAgIGNsaWVudCAgICAgCUAzMzcKLQkJCSAgICBzdXBwbGllciAgIAlAMzM0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDEyMDYsIDQ5MykKLQkJCQkoMTA5NCwgNDkzKQotCQkJCSgxMDk0LCAzMzApKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTA5NCwgMzMwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0MAotCQkJCVBhcmVudF9WaWV3IAlAMzM4Ci0JCQkJbG9jYXRpb24gICAJKDEwNDIsIDM3NykKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjgyODMyNgotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZUV4dGVuc2liaWxpdHlFbGVtZW50cyIgQDM0MQotCQkJICAgIFBhcmVudF9WaWV3IAlAMzM3Ci0JCQkgICAgbG9jYXRpb24gICAJKC01ODYsIDIzNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNDIKLQkJCQlQYXJlbnRfVmlldyAJQDM0MQotCQkJCWxvY2F0aW9uICAgCSgxMTk2LCA0NTQpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNDQ0Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZUV4dGVuc2liaWxpdHlFbGVtZW50cyIKLQkJCQlwY3REaXN0ICAgIAktMC4wMzk3MTEKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNBRDVGRDE0MDE5RCIKLQkJCSAgICBjbGllbnQgICAgIAlAMzM3Ci0JCQkgICAgc3VwcGxpZXIgICAJQDMzNgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyMDYsIDQ5MykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MSwgNDkzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM0MwotCQkJCVBhcmVudF9WaWV3IAlAMzQxCi0JCQkJbG9jYXRpb24gICAJKDE0MTUsIDU0NikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uKiIKLQkJCQlwY3REaXN0ICAgIAkwLjc2NDk1NwotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQ0Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNDEKLQkJCQlsb2NhdGlvbiAgIAkoMTM5NiwgMzkyKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNjk0OTE1Ci0JCQkJaGVpZ2h0ICAgICAJMTAyCi0JCQkJb3JpZW50YXRpb24gCTApKSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0NQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDQzM2MjdGMDBCNyIKLQkJICAgIGNsaWVudCAgICAgCUAzMjUKLQkJICAgIHN1cHBsaWVyICAgCUAzMzYKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTgxMiwgNzQxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE4MTIsIDU3MikpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiMi4zIE1lc3NhZ2VzIgotCSAgICBxdWlkICAgICAgIAkiM0JDRTg1M0QwMkM4IgotCSAgICB0aXRsZSAgICAgIAkiMi4zIE1lc3NhZ2VzIgotCSAgICB6b29tICAgICAgIAk4NQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3Ojp3c2RsOjpJTWVzc2FnZSIgQDM0NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIFN1cHByZXNzQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDQ4LCAyMjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNDYKLQkJCWxvY2F0aW9uICAgCSgyNjcsIDEyMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJTWVzc2FnZSIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNDYKLQkJCWxvY2F0aW9uICAgCSgyNjcsIDcyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOEFGMDA0RiIKLQkJICAgIHdpZHRoICAgICAgCTM4MAotCQkgICAgaGVpZ2h0ICAgICAJMzI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OndzZGw6OklQYXJ0IiBAMzQ3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgU3VwcHJlc3NBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzI4LCAyMjQpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNDcKLQkJCWxvY2F0aW9uICAgCSgxMDI5LCAxMjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTk5Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSVBhcnQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzQ3Ci0JCQlsb2NhdGlvbiAgIAkoMTAyOSwgNzQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTU5OQotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4NEE5M0YwMUJFIgotCQkgICAgd2lkdGggICAgICAJNjE3Ci0JCSAgICBoZWlnaHQgICAgIAkzMjQKLQkJICAgIGFubm90YXRpb24gCTgpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6UGFydCIgQDM0OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzEyLCA4MTYpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzNDgKLQkJCWxvY2F0aW9uICAgCSgxMDc1LCA2OTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDc0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFydCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FENUNFMUMwMzJFIgotCQkgICAgd2lkdGggICAgICAJNDkyCi0JCSAgICBoZWlnaHQgICAgIAkyNzYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM0OQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNCODRBOTZEMDJGMSIKLQkJICAgIGNsaWVudCAgICAgCUAzNDgKLQkJICAgIHN1cHBsaWVyICAgCUAzNDcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTMwNCwgNjc4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEzMDQsIDM4NikpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6d3NkbDo6TWVzc2FnZSIgQDM1MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0NDgsIDY1NikKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM1MAotCQkJbG9jYXRpb24gICAJKDI0MSwgNTA3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQxNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1lc3NhZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNBRDVDOTU5MDA3OCIKLQkJICAgIHdpZHRoICAgICAgCTQzMgotCQkgICAgaGVpZ2h0ICAgICAJMzIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAzNTEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjg0QThEMTAyQkEiCi0JCSAgICBjbGllbnQgICAgIAlAMzUwCi0JCSAgICBzdXBwbGllciAgIAlAMzQ2Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDQ0NSwgNDk1KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ0NSwgMzg4KSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDEiIEAzNTIKLQkJICAgIGxvY2F0aW9uICAgCSg2ODgsIDk1MikKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQUQ1Q0VCRTAwRTIiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImVQYXJ0cyIgQDM1MwotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUyCi0JCQkgICAgbG9jYXRpb24gICAJKDE3NiwgMzI4KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NAotCQkJCVBhcmVudF9WaWV3IAlAMzUzCi0JCQkJbG9jYXRpb24gICAJKDk1MiwgODk3KQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2VQYXJ0cyIKLQkJCQlwY3REaXN0ICAgIAkwLjY5NzQ1MgotCQkJCWhlaWdodCAgICAgCTU2Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUNFQkYwMDYxIgotCQkJICAgIGNsaWVudCAgICAgCUAzNTIKLQkJCSAgICBzdXBwbGllciAgIAlAMzQ4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjg4LCA5NTIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjYsIDk1MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTUKLQkJCQlQYXJlbnRfVmlldyAJQDM1MwotCQkJCWxvY2F0aW9uICAgCSg5ODcsIDEwMDUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLioiCi0JCQkJcGN0RGlzdCAgICAJMC43ODk4MDkKLQkJCQloZWlnaHQgICAgIAk1MwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1NgotCQkJCVBhcmVudF9WaWV3IAlAMzUzCi0JCQkJbG9jYXRpb24gICAJKDk2NywgMTA2MSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTQKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjc0MjAzOAotCQkJCWhlaWdodCAgICAgCTEwOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIiIEAzNTcKLQkJCSAgICBQYXJlbnRfVmlldyAJQDM1MgotCQkJICAgIGxvY2F0aW9uICAgCSgxNzYsIDMyOCkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTgKLQkJCQlQYXJlbnRfVmlldyAJQDM1NwotCQkJCWxvY2F0aW9uICAgCSg0MDQsIDg5MykKLQkJCQloaWRkZW4gICAgIAlUUlVFCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJNjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIiIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0FENUNFQkYwMDU3IgotCQkJICAgIGNsaWVudCAgICAgCUAzNTIKLQkJCSAgICBzdXBwbGllciAgIAlAMzUwCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDY4OCwgOTUyKQotCQkJCSg0NDUsIDk1MikKLQkJCQkoNDQ1LCA4MTcpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY4OCwgOTUyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NDUsIDgxNykKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNTkKLQkJCQlQYXJlbnRfVmlldyAJQDM1NwotCQkJCWxvY2F0aW9uICAgCSgzOTMsIDkxMikKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMS4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjc0NzYwNAotCQkJCWhlaWdodCAgICAgCTUzCi0JCQkJb3JpZW50YXRpb24gCTApKSkpKSkpKQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9tb2RlbC93c2RsLmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9tb2RlbC93c2RsLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTc3MzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvd3NkbC5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ3c2RsIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzZGwvMjAwMy9XU0RMIiBuc1ByZWZpeD0id3NkbCI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4mI3hEOyYjeEE7JiN4RDsmI3hBO1dTREwgZGVzY3JpYmVzIG5ldHdvcmsgc2VydmljZXMgYXMgc2V0cyBvZiBlbmRwb2ludHMgb3BlcmF0aW5nIG9uIG1lc3NhZ2VzLiBUaGUgb3BlcmF0aW9ucyBhbmQgbWVzc2FnZXMgYXJlIGRlc2NyaWJlZCBhYnN0cmFjdGx5LCBhbmQgdGhlbiBib3VuZCB0byBhIGNvbmNyZXRlIG5ldHdvcmsgcHJvdG9jb2wgYW5kIG1lc3NhZ2UgZm9ybWF0IHRvIGRlZmluZSBhbiBlbmRwb2ludC4mI3hEOyYjeEE7JiN4RDsmI3hBO1dTREwgZGVzY3JpYmVzIHRoZSBmb3JtYXRzIG9mIHRoZSBtZXNzYWdlcyBleGNoYW5nZWQgYnkgdGhlIHNlcnZpY2VzLCBhbmQgc3VwcG9ydHMgdGhlIFhNTCBTY2hlbWFzIHNwZWNpZmljYXRpb24gYXMgaXRzIGNhbm9uaWNhbCB0eXBlIHN5c3RlbS4gVGhpcyBwYWNrYWdlIHVzZXMgYW4gWE1MIFNjaGVtYSBJbmZvc2V0IG1vZGVsIHBhY2thZ2UgKHNlZSB0aGUgWFNEIHBhY2thZ2UpIHRvIGRlc2NyaWJlIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdHMuJiN4RDsmI3hBOyYjeEQ7JiN4QTtUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KSYjeEQ7JiN4QTstIDIuMSBEZWZpbml0aW9uLCBzaG93cyB0aGUgV1NETCBkZWZpbml0aW9uIGVsZW1lbnQgYW5kIHRoZSBXU0RMIGRvY3VtZW50IHN0cnVjdHVyZSYjeEQ7JiN4QTstIDIuMS4xIE5hbWluZyBhbmQgTGlua2luZywgc2hvd3MgdGhlIG5hbWVzcGFjZSBhbmQgaW1wb3J0IG1lY2hhbmlzbSYjeEQ7JiN4QTstIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtJiN4RDsmI3hBOy0gMi4yIFR5cGVzLCBzaG93cyB0aGUgdXNlIG9mIFhNTCBTY2hlbWEgdHlwZXMgaW4gV1NETCYjeEQ7JiN4QTstIDIuMyBNZXNzYWdlcywgMi40IFBvcnRUeXBlcywgMi41IEJpbmRpbmdzIGFuZCAyLjcgU2VydmljZXMsIHNob3cgdGhlIG1ham9yIFdTREwgZWxlbWVudHMgYW5kIHRoZWlyIHJlbGF0aW9ucy4mI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBXU0RMIGNsYXNzZXMgZXh0ZW5kIHRoZSBqYXZheC53c2RsIGludGVyZmFjZXMgZGVmaW5lZCBieSBKU1IgMTEwLiBDbGFzc2VzIHdpdGggaW50ZXJmYWNlIGFuZCBkYXRhdHlwZSBzdGVyZW90eXBlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlc2Ugbm9uLU1PRiBpbnRlcmZhY2VzLiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbGFuZ3VhZ2UgZWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIgZVR5cGU9IiMvL0RlZmluaXRpb24iLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RW5jbG9zaW5nRGVmaW5pdGlvbiI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZGVmaW5pdGlvbiIgZVR5cGU9IiMvL0RlZmluaXRpb24iLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkb2N1bWVudGF0aW9uRWxlbWVudCIgZVR5cGU9IiMvL0RPTUVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWxlbWVudCIgZVR5cGU9IiMvL0RPTUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9ydFR5cGUiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JUG9ydFR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9ydFR5cGUgZWxlbWVudCBvZiB0aGUgV1NETCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gMS4xIGFuZCBhbiBJbnRlcmZhY2UgY29tcG9uZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjIuIEEgcG9ydCB0eXBlIG9yIEludGVyZmFjZSBpcyBhIG5hbWVkIHNldCBvZiBhYnN0cmFjdCBvcGVyYXRpb25zIGFuZCB0aGUgYWJzdHJhY3QgbWVzc2FnZXMgaW52b2x2ZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm94eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU9wZXJhdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vT3BlcmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPcGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JT3BlcmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50LiBBIFdTREwgb3BlcmF0aW9uIGlzIGFuIGFic3RyYWN0IGRlc2NyaXB0aW9uIG9mIGFuIGFjdGlvbiBzdXBwb3J0ZWQgYnkgYSBzZXJ2aWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdHlsZSIgZVR5cGU9IiMvL09wZXJhdGlvblR5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bmRlZmluZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3h5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlSW5wdXQiIGVUeXBlPSIjLy9JbnB1dCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU91dHB1dCIgZVR5cGU9IiMvL091dHB1dCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUZhdWx0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9GYXVsdCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBhcmFtZXRlck9yZGVyaW5nIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BhcnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZSIgZVN1cGVyVHlwZXM9IiMvL1dTRExFbGVtZW50ICMvL0lNZXNzYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJxTmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuZGVmaW5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJveHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVQYXJ0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QYXJ0IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYXJ0IiBlU3VwZXJUeXBlcz0iIy8vV1NETEVsZW1lbnQgIy8vSVBhcnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcGFydCBlbGVtZW50LiBQYXJ0cyBkZXNjcmliZSB0aGUgbG9naWNhbCBhYnN0cmFjdCBjb250ZW50IG9mIGEgbWVzc2FnZS4gRWFjaCBwYXJ0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHR5cGUgZnJvbSBzb21lIHR5cGUgc3lzdGVtLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbGVtZW50TmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZURlZmluaXRpb24iIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy14c2QvbW9kZWwvWFNELmVjb3JlIy8vWFNEVHlwZURlZmluaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWxlbWVudERlY2xhcmF0aW9uIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTREVsZW1lbnREZWNsYXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlTWVzc2FnZSIgZVR5cGU9IiMvL01lc3NhZ2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmluZGluZyIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lCaW5kaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGJpbmRpbmcgZWxlbWVudC4gQSBiaW5kaW5nIGRlZmluZXMgbWVzc2FnZSBmb3JtYXQgYW5kIHByb3RvY29sIGRldGFpbHMgZm9yIG9wZXJhdGlvbnMgYW5kIG1lc3NhZ2VzIGRlZmluZWQgYnkgYSBwYXJ0aWN1bGFyIHBvcnRUeXBlLiBUaGVyZSBtYXkgYmUgYW55IG51bWJlciBvZiBiaW5kaW5ncyBmb3IgYSBnaXZlbiBwb3J0VHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bmRlZmluZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb3h5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNvdXJjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlUG9ydFR5cGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qb3J0VHlwZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZ09wZXJhdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmluZGluZ09wZXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmluZGluZ09wZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lCaW5kaW5nT3BlcmF0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcuIEFuIG9wZXJhdGlvbiBlbGVtZW50IHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBvcGVyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgYmluZGluZydzIHBvcnRUeXBlLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlT3BlcmF0aW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vT3BlcmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5nSW5wdXQiIGVUeXBlPSIjLy9CaW5kaW5nSW5wdXQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVCaW5kaW5nT3V0cHV0IiBlVHlwZT0iIy8vQmluZGluZ091dHB1dCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUJpbmRpbmdGYXVsdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmluZGluZ0ZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZXJ2aWNlIiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSVNlcnZpY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgc2VydmljZSBlbGVtZW50LiBBIHNlcnZpY2UgZ3JvdXBzIGEgc2V0IG9mIHJlbGF0ZWQgcG9ydHMgdG9nZXRoZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InFOYW1lIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5kZWZpbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm94eSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBvcnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvcnQiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JUG9ydCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0IGVsZW1lbnQuIEEgcG9ydCBkZWZpbmVzIGFuIGluZGl2aWR1YWwgZW5kcG9pbnQgYnkgc3BlY2lmeWluZyBhIHNpbmdsZSBhZGRyZXNzIGZvciBhIGJpbmRpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlQmluZGluZyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0JpbmRpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCAjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiBXU0RMIGFsbG93cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcXVpcmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbGVtZW50VHlwZSIgZVR5cGU9IiMvL1FOYW1lIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldERvY3VtZW50IiBlVHlwZT0iIy8vRE9NRG9jdW1lbnQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RG9jdW1lbnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImRvY3VtZW50IiBlVHlwZT0iIy8vRE9NRG9jdW1lbnQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icU5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmNvZGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlTWVzc2FnZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWVzc2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZVBvcnRUeXBlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qb3J0VHlwZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZUJpbmRpbmdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0JpbmRpbmciIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVTZXJ2aWNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZXJ2aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlTmFtZXNwYWNlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9OYW1lc3BhY2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVUeXBlcyIgZVR5cGU9IiMvL1R5cGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlSW1wb3J0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9JbXBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkltcG9ydCIgZVN1cGVyVHlwZXM9IiMvL1dTRExFbGVtZW50ICMvL0lJbXBvcnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyBXU0RMIGltcG9ydCBlbGVtZW50LiBXU0RMIGFsbG93cyBhc3NvY2lhdGluZyBhIG5hbWVzcGFjZSB3aXRoIGEgZG9jdW1lbnQgbG9jYXRpb24gdXNpbmcgYW4gaW1wb3J0IGVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFNjaGVtYSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi8uLi9vcmcuZWNsaXBzZS54c2Qvc3JjLXhzZC9tb2RlbC9YU0QuZWNvcmUjLy9YU0RTY2hlbWEiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0U2NoZW1hIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy14c2QvbW9kZWwvWFNELmVjb3JlIy8vWFNEU2NoZW1hIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZXNwYWNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVEZWZpbml0aW9uIiBlVHlwZT0iIy8vRGVmaW5pdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlU2NoZW1hIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTRFNjaGVtYSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbnNpYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iIFdTREwgYWxsb3dzIGVsZW1lbnRzIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHRlY2hub2xvZ3kgKHJlZmVycmVkIHRvIGhlcmUgYXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cykgdW5kZXIgdmFyaW91cyBlbGVtZW50cyBkZWZpbmVkIGJ5IFdTREwuIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgcG9pbnQgb2YgZXh0ZW5zaWJpbGl0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiBlVHlwZT0iIy8vSUxpc3QiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImV4dEVsZW1lbnQiIGVUeXBlPSIjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4dGVuc2liaWxpdHlFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbnB1dCIgZVN1cGVyVHlwZXM9IiMvL01lc3NhZ2VSZWZlcmVuY2UgIy8vV1NETEVsZW1lbnQgIy8vSUlucHV0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dHB1dCIgZVN1cGVyVHlwZXM9IiMvL01lc3NhZ2VSZWZlcmVuY2UgIy8vV1NETEVsZW1lbnQgIy8vSU91dHB1dCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudC4gQW4gb3V0cHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGYXVsdCIgZVN1cGVyVHlwZXM9IiMvL01lc3NhZ2VSZWZlcmVuY2UgIy8vV1NETEVsZW1lbnQgIy8vSUZhdWx0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQuIEZhdWx0IGVsZW1lbnRzIHNwZWNpZnkgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciBhbnkgZXJyb3IgbWVzc2FnZXMgdGhhdCBtYXkgYmUgb3V0cHV0IGFzIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmluZGluZ0lucHV0IiBlU3VwZXJUeXBlcz0iIy8vRXh0ZW5zaWJsZUVsZW1lbnQgIy8vSUJpbmRpbmdJbnB1dCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRJbnB1dCIgZVR5cGU9IiMvL0lJbnB1dCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRJbnB1dCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW5wdXQiIGVUeXBlPSIjLy9JSW5wdXQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVJbnB1dCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0lucHV0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJpbmRpbmdPdXRwdXQiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JQmluZGluZ091dHB1dCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvdXRwdXQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQW4gb3V0cHV0IGVsZW1lbnQgd2l0aGluIGFuIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPdXRwdXQiIGVUeXBlPSIjLy9JT3V0cHV0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldE91dHB1dCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ib3V0cHV0IiBlVHlwZT0iIy8vSU91dHB1dCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU91dHB1dCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL091dHB1dCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCaW5kaW5nRmF1bHQiIGVTdXBlclR5cGVzPSIjLy9FeHRlbnNpYmxlRWxlbWVudCAjLy9JQmluZGluZ0ZhdWx0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGZhdWx0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEEgZmF1bHQgZWxlbWVudCB3aXRoaW4gYW4gb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcgc3BlY2lmaWVzIGJpbmRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBmYXVsdCB3aXRoIHRoZSBzYW1lIG5hbWUuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGYXVsdCIgZVR5cGU9IiMvL0lGYXVsdCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRGYXVsdCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZmF1bHQiIGVUeXBlPSIjLy9JRmF1bHQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVGYXVsdCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0ZhdWx0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlFOYW1lIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlFOYW1lIGNsYXNzLiBBIFFOYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbmFtZXNwYWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2UgcHJlZml4IHVzZWQgaW4gYSBXU0RMIGRvY3VtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik9wZXJhdGlvblR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLk9wZXJhdGlvblR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik9ORV9XQVk9MSYjeEQ7JiN4QTtSRVFVRVNUX1JFU1BPTlNFPTImI3hEOyYjeEE7U09MSUNJVF9SRVNQT05TRT0zJiN4RDsmI3hBO05PVElGSUNBVElPTj00Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklQb3J0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuUG9ydFR5cGUiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuUG9ydFR5cGUgbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZE9wZXJhdGlvbiI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ib3BlcmF0aW9uIiBlVHlwZT0iIy8vSU9wZXJhdGlvbiIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJpbnB1dE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvdXRwdXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3BlcmF0aW9ucyIgZVR5cGU9IiMvL0lMaXN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklPcGVyYXRpb24iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLk9wZXJhdGlvbiIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5PcGVyYXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEZhdWx0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJmYXVsdCIgZVR5cGU9IiMvL0lGYXVsdCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZhdWx0IiBlVHlwZT0iIy8vSUZhdWx0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmF1bHRzIiBlVHlwZT0iIy8vSU1hcCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJhbWV0ZXJPcmRlcmluZyIgZVR5cGU9IiMvL0lMaXN0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFBhcmFtZXRlck9yZGVyaW5nIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJhbWV0ZXJPcmRlciIgZVR5cGU9IiMvL0lMaXN0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0SW5wdXQiIGVUeXBlPSIjLy9JSW5wdXQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0SW5wdXQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImlucHV0IiBlVHlwZT0iIy8vSUlucHV0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3V0cHV0IiBlVHlwZT0iIy8vSU91dHB1dCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRPdXRwdXQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im91dHB1dCIgZVR5cGU9IiMvL0lPdXRwdXQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJSW5wdXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLklucHV0IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLklucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRNZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0TWVzc2FnZSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSU91dHB1dCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuT3V0cHV0IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLk91dHB1dCBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldE1lc3NhZ2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklGYXVsdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuRmF1bHQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRmF1bHQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRNZXNzYWdlIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXNzYWdlIiBlVHlwZT0iIy8vSU1lc3NhZ2UiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJTWVzc2FnZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuTWVzc2FnZSIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5NZXNzYWdlIG5vbi1NT0YgaW50ZXJmYWNlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZFBhcnQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBhcnQiIGVUeXBlPSIjLy9JUGFydCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcnQiIGVUeXBlPSIjLy9JUGFydCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBhcnRzIiBlVHlwZT0iIy8vSU1hcCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRPcmRlcmVkUGFydHMiIGVUeXBlPSIjLy9JTGlzdCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFydE9yZGVyIiBlVHlwZT0iIy8vSUxpc3QiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJUGFydCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuUGFydCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5QYXJ0IG5vbi1NT0YgaW50ZXJmYWNlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldEV4dGVuc2lvbkF0dHJpYnV0ZSIgZUV4Y2VwdGlvbnM9IiMvL1dTRExFeGNlcHRpb24iPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InZhbHVlIiBlVHlwZT0iIy8vUU5hbWUiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIgZVR5cGU9IiMvL0lJdGVyYXRvciIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRFeHRlbnNpb25BdHRyaWJ1dGUiIGVUeXBlPSIjLy9RTmFtZSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVNlcnZpY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLlNlcnZpY2UiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuU2VydmljZSBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkUG9ydCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icG9ydCIgZVR5cGU9IiMvL0lQb3J0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UG9ydHMiIGVUeXBlPSIjLy9JTWFwIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBvcnQiIGVUeXBlPSIjLy9JUG9ydCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklQb3J0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5Qb3J0IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlBvcnQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmciIGVUeXBlPSIjLy9JQmluZGluZyIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRCaW5kaW5nIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuQmluZGluZyIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nIG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRCaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nT3BlcmF0aW9uIiBlVHlwZT0iIy8vSUJpbmRpbmdPcGVyYXRpb24iLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nT3BlcmF0aW9uIiBlVHlwZT0iIy8vSUJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJpbnB1dE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJvdXRwdXROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZ09wZXJhdGlvbnMiIGVUeXBlPSIjLy9JTGlzdCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQb3J0VHlwZSIgZVR5cGU9IiMvL0lQb3J0VHlwZSIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRQb3J0VHlwZSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icG9ydFR5cGUiIGVUeXBlPSIjLy9JUG9ydFR5cGUiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZ09wZXJhdGlvbiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJhZGRCaW5kaW5nRmF1bHQiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImJpbmRpbmdGYXVsdCIgZVR5cGU9IiMvL0lCaW5kaW5nRmF1bHQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nRmF1bHQiIGVUeXBlPSIjLy9JQmluZGluZ0ZhdWx0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0QmluZGluZ0ZhdWx0cyIgZVR5cGU9IiMvL0lNYXAiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0T3BlcmF0aW9uIiBlVHlwZT0iIy8vSU9wZXJhdGlvbiIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRPcGVyYXRpb24iPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nSW5wdXQiIGVUeXBlPSIjLy9JQmluZGluZ0lucHV0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldEJpbmRpbmdJbnB1dCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYmluZGluZ0lucHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdJbnB1dCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdPdXRwdXQiIGVUeXBlPSIjLy9JQmluZGluZ091dHB1dCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRCaW5kaW5nT3V0cHV0Ij4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJiaW5kaW5nT3V0cHV0IiBlVHlwZT0iIy8vSUJpbmRpbmdPdXRwdXQiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZ0lucHV0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5CaW5kaW5nSW5wdXQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0lucHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZ091dHB1dCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuQmluZGluZ091dHB1dCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJQmluZGluZ0ZhdWx0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJET01FbGVtZW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLnczYy5kb20uRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5FbGVtZW50IG5vbi1NT0YgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklEZWZpbml0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5EZWZpbml0aW9uIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkRlZmluaXRpb24gbm9uLU1PRiBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEJpbmRpbmciPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImJpbmRpbmciIGVUeXBlPSIjLy9JQmluZGluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZEltcG9ydCI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iaW1wb3J0RGVmIiBlVHlwZT0iIy8vSUltcG9ydCIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZE1lc3NhZ2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImFkZE5hbWVzcGFjZSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZXNwYWNlVVJJIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkUG9ydFR5cGUiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iYWRkU2VydmljZSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ic2VydmljZSIgZVR5cGU9IiMvL0lTZXJ2aWNlIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlQmluZGluZ0ZhdWx0IiBlVHlwZT0iIy8vSUJpbmRpbmdGYXVsdCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVCaW5kaW5nSW5wdXQiIGVUeXBlPSIjLy9JQmluZGluZ0lucHV0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUJpbmRpbmdPdXRwdXQiIGVUeXBlPSIjLy9JQmluZGluZ091dHB1dCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVCaW5kaW5nT3BlcmF0aW9uIiBlVHlwZT0iIy8vSUJpbmRpbmdPcGVyYXRpb24iLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlQmluZGluZyIgZVR5cGU9IiMvL0lCaW5kaW5nIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUZhdWx0IiBlVHlwZT0iIy8vSUZhdWx0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZUltcG9ydCIgZVR5cGU9IiMvL0lJbXBvcnQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlSW5wdXQiIGVUeXBlPSIjLy9JSW5wdXQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlTWVzc2FnZSIgZVR5cGU9IiMvL0lNZXNzYWdlIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZU9wZXJhdGlvbiIgZVR5cGU9IiMvL0lPcGVyYXRpb24iLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlT3V0cHV0IiBlVHlwZT0iIy8vSU91dHB1dCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVQYXJ0IiBlVHlwZT0iIy8vSVBhcnQiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iY3JlYXRlUG9ydCIgZVR5cGU9IiMvL0lQb3J0Ii8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZVBvcnRUeXBlIiBlVHlwZT0iIy8vSVBvcnRUeXBlIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImNyZWF0ZVNlcnZpY2UiIGVUeXBlPSIjLy9JU2VydmljZSIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRCaW5kaW5nIiBlVHlwZT0iIy8vSUJpbmRpbmciPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEJpbmRpbmdzIiBlVHlwZT0iIy8vSU1hcCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRJbXBvcnRzIiBlVHlwZT0iIy8vSU1hcCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRJbXBvcnRzIiBlVHlwZT0iIy8vSUxpc3QiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWVzc2FnZXMiIGVUeXBlPSIjLy9JTWFwIi8+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE5hbWVzcGFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TmFtZXNwYWNlcyIgZVR5cGU9IiMvL0lNYXAiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UG9ydFR5cGUiIGVUeXBlPSIjLy9JUG9ydFR5cGUiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFBvcnRUeXBlcyIgZVR5cGU9IiMvL0lNYXAiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJuYW1lc3BhY2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTZXJ2aWNlIiBlVHlwZT0iIy8vSVNlcnZpY2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFNlcnZpY2VzIiBlVHlwZT0iIy8vSU1hcCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRFeHRlbnNpb25SZWdpc3RyeSIgZVR5cGU9IiMvL0lFeHRlbnNpb25SZWdpc3RyeSIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRFeHRlbnNpb25SZWdpc3RyeSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZXh0ZW5zaW9uUmVnaXN0cnkiIGVUeXBlPSIjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXREb2N1bWVudEJhc2VVUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0RG9jdW1lbnRCYXNlVVJJIj4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJkb2N1bWVudEJhc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJjcmVhdGVUeXBlcyIgZVR5cGU9IiMvL0lUeXBlcyIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJyZW1vdmVTZXJ2aWNlIiBlVHlwZT0iIy8vSVNlcnZpY2UiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InJlbW92ZUJpbmRpbmciIGVUeXBlPSIjLy9JQmluZGluZyI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0icmVtb3ZlUG9ydFR5cGUiIGVUeXBlPSIjLy9JUG9ydFR5cGUiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9RTmFtZSIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InJlbW92ZU1lc3NhZ2UiIGVUeXBlPSIjLy9JTWVzc2FnZSI+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1FOYW1lIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0VHlwZXMiIGVUeXBlPSIjLy9JVHlwZXMiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0VHlwZXMiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9InR5cGVzIiBlVHlwZT0iIy8vSVR5cGVzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUltcG9ydCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuSW1wb3J0IgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLkltcG9ydCBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUxpc3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuTGlzdCBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklNYXAiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTWFwIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEudXRpbC5NYXAgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJVVJMIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJMIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBub24tTU9GIGphdmEubmV0LlVSTCBpbnRlcmZhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklFeHRlbnNpb25SZWdpc3RyeSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlcyIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2libGVFbGVtZW50ICMvL0lUeXBlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFNjaGVtYXMiIGVUeXBlPSIjLy9JTGlzdCIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTY2hlbWFzIiBlVHlwZT0iIy8vSUxpc3QiPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWVzcGFjZVVSSSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklJdGVyYXRvciIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5JdGVyYXRvciIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgbm9uLU1PRiBqYXZhLnV0aWwuSXRlcmF0b3IgaW50ZXJmYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXU0RMRXhjZXB0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGphdmF4LndzZGwuRXhjZXB0aW9uIGNsYXNzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJVHlwZXMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZheC53c2RsLlR5cGVzIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBqYXZheC53c2RsLlR5cGVzIG5vbi1NT0YgaW50ZXJmYWNlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRyZW4iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0V4dGVuc2liaWxpdHlFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uLy4uL29yZy5lY2xpcHNlLnhzZC9zcmMteHNkL21vZGVsL1hTRC5lY29yZSMvL1hTRFNjaGVtYSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRE9NRG9jdW1lbnQiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcudzNjLmRvbS5Eb2N1bWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBvcmcudzNjLmRvbS5Eb2N1bWVudCBub24tTU9GIGludGVyZmFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWVzc2FnZVJlZmVyZW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9XU0RMRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZU1lc3NhZ2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXNzYWdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvd3NkbC5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvbW9kZWwvd3NkbC5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjYzhkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL21vZGVsL3dzZGwuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjIgotICAgIGVkaXREaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS53c3Qud3NkbC5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSJvcmcuZWNsaXBzZS53c3Qud3NkbC5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLndzdC53c2RsIiBtb2RlbE5hbWU9IldTREwiIGVkaXRQbHVnaW5DbGFzcz0iIiBlZGl0b3JQbHVnaW5DbGFzcz0iIgotICAgIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vLi4vb3JnLmVjbGlwc2UueHNkL3NyYy14c2QvbW9kZWwvWFNELmdlbm1vZGVsIy8veHNkIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXFdTREwubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+VkFCQVNFX1BMVUdJTlNfUEFUSDwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPi4uLy4uLy4uPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IldTREwiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS53c3QiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9IndzZGwuZWNvcmUjLyI+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vUU5hbWUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9PcGVyYXRpb25UeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ3c2RsLmVjb3JlIy8vRE9NRWxlbWVudCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0id3NkbC5lY29yZSMvL1dTRExFeGNlcHRpb24iLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IndzZGwuZWNvcmUjLy9ET01Eb2N1bWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2RvY3VtZW50YXRpb25FbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1dTRExFbGVtZW50L2VsZW1lbnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vV1NETEVsZW1lbnQvZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9zZXRFbmNsb3NpbmdEZWZpbml0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9XU0RMRWxlbWVudC9zZXRFbmNsb3NpbmdEZWZpbml0aW9uL2RlZmluaXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BvcnRUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUG9ydFR5cGUvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnRUeXBlL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Qb3J0VHlwZS9lT3BlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vT3BlcmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3N0eWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi91bmRlZmluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL3Byb3h5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL09wZXJhdGlvbi9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vT3BlcmF0aW9uL2VPdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lRmF1bHRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL09wZXJhdGlvbi9lUGFyYW1ldGVyT3JkZXJpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL01lc3NhZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvdW5kZWZpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL01lc3NhZ2UvcHJveHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9yZXNvdXJjZVVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZS9lUGFydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL1BhcnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vUGFydC9lbGVtZW50TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9QYXJ0L3R5cGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL1BhcnQvdHlwZURlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC9lbGVtZW50RGVjbGFyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vUGFydC9lTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmcvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy91bmRlZmluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZy9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmcvZVBvcnRUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nL2VCaW5kaW5nT3BlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3BlcmF0aW9uL2VPcGVyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0JpbmRpbmdPcGVyYXRpb24vZUJpbmRpbmdJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ091dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ09wZXJhdGlvbi9lQmluZGluZ0ZhdWx0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vU2VydmljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1NlcnZpY2UvcU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS91bmRlZmluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vU2VydmljZS9wcm94eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL3Jlc291cmNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9TZXJ2aWNlL2VQb3J0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vUG9ydCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL1BvcnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9Qb3J0L2VCaW5kaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9FeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50L3JlcXVpcmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0V4dGVuc2liaWxpdHlFbGVtZW50L2VsZW1lbnRUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi90YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9sb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3FOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZW5jb2RpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZU1lc3NhZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VQb3J0VHlwZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUJpbmRpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9EZWZpbml0aW9uL2VTZXJ2aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lTmFtZXNwYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9lVHlwZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkbC5lY29yZSMvL0RlZmluaXRpb24vZUltcG9ydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRGVmaW5pdGlvbi9nZXREb2N1bWVudCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9EZWZpbml0aW9uL3NldERvY3VtZW50L2RvY3VtZW50Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JbXBvcnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9JbXBvcnQvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0ltcG9ydC9sb2NhdGlvblVSSSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9JbXBvcnQvZURlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vSW1wb3J0L2VTY2hlbWEiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSW1wb3J0L2dldFNjaGVtYSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JbXBvcnQvc2V0U2NoZW1hIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JbXBvcnQvc2V0U2NoZW1hL3NjaGVtYSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvZUV4dGVuc2liaWxpdHlFbGVtZW50cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9FeHRlbnNpYmxlRWxlbWVudC9nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vRXh0ZW5zaWJsZUVsZW1lbnQvYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0V4dGVuc2libGVFbGVtZW50L2FkZEV4dGVuc2liaWxpdHlFbGVtZW50L2V4dEVsZW1lbnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lucHV0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL091dHB1dCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9GYXVsdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvZUlucHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9nZXRJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nSW5wdXQvc2V0SW5wdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdJbnB1dC9zZXRJbnB1dC9pbnB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9CaW5kaW5nT3V0cHV0L2VPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9nZXRPdXRwdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ091dHB1dC9zZXRPdXRwdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0JpbmRpbmdPdXRwdXQvc2V0T3V0cHV0L291dHB1dCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L2VGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvZ2V0RmF1bHQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vQmluZGluZ0ZhdWx0L3NldEZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9CaW5kaW5nRmF1bHQvc2V0RmF1bHQvZmF1bHQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL05hbWVzcGFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkbC5lY29yZSMvL05hbWVzcGFjZS9VUkkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RsLmVjb3JlIy8vTmFtZXNwYWNlL3ByZWZpeCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2FkZE9wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2FkZE9wZXJhdGlvbi9vcGVyYXRpb24iLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbiI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9uYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbi9pbnB1dE5hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUG9ydFR5cGUvZ2V0T3BlcmF0aW9uL291dHB1dE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnRUeXBlL2dldE9wZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24iPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2FkZEZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2FkZEZhdWx0L2ZhdWx0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0RmF1bHQvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldEZhdWx0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL2dldFBhcmFtZXRlck9yZGVyaW5nIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0UGFyYW1ldGVyT3JkZXJpbmcvcGFyYW1ldGVyT3JkZXIiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU9wZXJhdGlvbi9nZXRJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldElucHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldElucHV0L2lucHV0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vZ2V0T3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPcGVyYXRpb24vc2V0T3V0cHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JT3BlcmF0aW9uL3NldE91dHB1dC9vdXRwdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lJbnB1dCI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lJbnB1dC9nZXRNZXNzYWdlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lJbnB1dC9zZXRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JSW5wdXQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JT3V0cHV0Ij4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9nZXRNZXNzYWdlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lPdXRwdXQvc2V0TWVzc2FnZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSU91dHB1dC9zZXRNZXNzYWdlL21lc3NhZ2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lGYXVsdCI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lGYXVsdC9nZXRNZXNzYWdlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lGYXVsdC9zZXRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRmF1bHQvc2V0TWVzc2FnZS9tZXNzYWdlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JTWVzc2FnZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2FkZFBhcnQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lNZXNzYWdlL2FkZFBhcnQvcGFydCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRQYXJ0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0UGFydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSU1lc3NhZ2UvZ2V0T3JkZXJlZFBhcnRzIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JTWVzc2FnZS9nZXRPcmRlcmVkUGFydHMvcGFydE9yZGVyIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUGFydCI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQYXJ0L3NldEV4dGVuc2lvbkF0dHJpYnV0ZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBhcnQvc2V0RXh0ZW5zaW9uQXR0cmlidXRlL25hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9zZXRFeHRlbnNpb25BdHRyaWJ1dGUvdmFsdWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlTmFtZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBhcnQvZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JUGFydC9nZXRFeHRlbnNpb25BdHRyaWJ1dGUvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JU2VydmljZS9hZGRQb3J0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JU2VydmljZS9hZGRQb3J0L3BvcnQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydHMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVNlcnZpY2UvZ2V0UG9ydC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JUG9ydCI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lQb3J0L2dldEJpbmRpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZyI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSVBvcnQvc2V0QmluZGluZy9iaW5kaW5nIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JQmluZGluZyI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2FkZEJpbmRpbmdPcGVyYXRpb24iPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2FkZEJpbmRpbmdPcGVyYXRpb24vYmluZGluZ09wZXJhdGlvbiIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL25hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9uL2lucHV0TmFtZSIvPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nL2dldEJpbmRpbmdPcGVyYXRpb24vb3V0cHV0TmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRCaW5kaW5nT3BlcmF0aW9ucyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9nZXRQb3J0VHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZy9zZXRQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmcvc2V0UG9ydFR5cGUvcG9ydFR5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uIj4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vYWRkQmluZGluZ0ZhdWx0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9hZGRCaW5kaW5nRmF1bHQvYmluZGluZ0ZhdWx0Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdGYXVsdCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0L25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ0ZhdWx0cyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9nZXRPcGVyYXRpb24iLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vc2V0T3BlcmF0aW9uIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRPcGVyYXRpb24vb3BlcmF0aW9uIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL2dldEJpbmRpbmdJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nSW5wdXQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lCaW5kaW5nT3BlcmF0aW9uL3NldEJpbmRpbmdJbnB1dC9iaW5kaW5nSW5wdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPcGVyYXRpb24vZ2V0QmluZGluZ091dHB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JQmluZGluZ09wZXJhdGlvbi9zZXRCaW5kaW5nT3V0cHV0L2JpbmRpbmdPdXRwdXQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lCaW5kaW5nSW5wdXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdPdXRwdXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUJpbmRpbmdGYXVsdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24iPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRCaW5kaW5nL2JpbmRpbmciLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vYWRkSW1wb3J0Ij4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRJbXBvcnQvaW1wb3J0RGVmIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE1lc3NhZ2UvbWVzc2FnZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZE5hbWVzcGFjZS9wcmVmaXgiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGROYW1lc3BhY2UvbmFtZXNwYWNlVVJJIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2FkZFBvcnRUeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRQb3J0VHlwZS9wb3J0VHlwZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRTZXJ2aWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9hZGRTZXJ2aWNlL3NlcnZpY2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZ0ZhdWx0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdJbnB1dCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVCaW5kaW5nT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZUJpbmRpbmdPcGVyYXRpb24iLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlQmluZGluZyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVGYXVsdCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVJbXBvcnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlSW5wdXQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlTWVzc2FnZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVPcGVyYXRpb24iLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlT3V0cHV0Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2NyZWF0ZVBhcnQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlUG9ydCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVQb3J0VHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9jcmVhdGVTZXJ2aWNlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEJpbmRpbmcvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRCaW5kaW5ncyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRJbXBvcnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldEltcG9ydHMuMSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0SW1wb3J0cy4xL25hbWVzcGFjZVVSSSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRNZXNzYWdlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TWVzc2FnZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0TmFtZXNwYWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXROYW1lc3BhY2UvcHJlZml4Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldE5hbWVzcGFjZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFBvcnRUeXBlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UG9ydFR5cGVzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldFByZWZpeCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0UHJlZml4L25hbWVzcGFjZVVSSSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9nZXRTZXJ2aWNlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0U2VydmljZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0RXh0ZW5zaW9uUmVnaXN0cnkiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0RXh0ZW5zaW9uUmVnaXN0cnkiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldEV4dGVuc2lvblJlZ2lzdHJ5L2V4dGVuc2lvblJlZ2lzdHJ5Ii8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL2dldERvY3VtZW50QmFzZVVSSSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9zZXREb2N1bWVudEJhc2VVUkkiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldERvY3VtZW50QmFzZVVSSS9kb2N1bWVudEJhc2UiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vY3JlYXRlVHlwZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlU2VydmljZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlU2VydmljZS9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZUJpbmRpbmciPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3JlbW92ZUJpbmRpbmcvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVQb3J0VHlwZSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vcmVtb3ZlUG9ydFR5cGUvbmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVNZXNzYWdlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9IndzZGwuZWNvcmUjLy9JRGVmaW5pdGlvbi9yZW1vdmVNZXNzYWdlL25hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vZ2V0VHlwZXMiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJ3c2RsLmVjb3JlIy8vSURlZmluaXRpb24vc2V0VHlwZXMiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0id3NkbC5lY29yZSMvL0lEZWZpbml0aW9uL3NldFR5cGVzL3R5cGVzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JSW1wb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lMaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lNYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSVVSTCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9JRXh0ZW5zaW9uUmVnaXN0cnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vVHlwZXMiPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249IndzZGwuZWNvcmUjLy9UeXBlcy9nZXRTY2hlbWFzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0id3NkbC5lY29yZSMvL1R5cGVzL2dldFNjaGVtYXMuMSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJ3c2RsLmVjb3JlIy8vVHlwZXMvZ2V0U2NoZW1hcy4xL25hbWVzcGFjZVVSSSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RsLmVjb3JlIy8vSUl0ZXJhdG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL0lUeXBlcyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50L2NoaWxkcmVuIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGwuZWNvcmUjLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC9zY2hlbWEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0id3NkbC5lY29yZSMvL01lc3NhZ2VSZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGwuZWNvcmUjLy9NZXNzYWdlUmVmZXJlbmNlL25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RsLmVjb3JlIy8vTWVzc2FnZVJlZmVyZW5jZS9lTWVzc2FnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MxNjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBiaW5kaW5nIGVsZW1lbnQuIEEgYmluZGluZyBkZWZpbmVzIG1lc3NhZ2UgZm9ybWF0IGFuZCBwcm90b2NvbCBkZXRhaWxzIGZvciBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBwb3J0VHlwZS4gVGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIGEgZ2l2ZW4gcG9ydFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRFUG9ydFR5cGUgPGVtPkVQb3J0IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRFQmluZGluZ09wZXJhdGlvbnMgPGVtPkVCaW5kaW5nIE9wZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZyBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLkJpbmRpbmd7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQb3J0IFR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FUG9ydCBUeXBlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUG9ydCBUeXBlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RVBvcnRUeXBlKFBvcnRUeXBlKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19FUG9ydFR5cGUoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUG9ydFR5cGUgZ2V0RVBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZyNnZXRFUG9ydFR5cGUgPGVtPkVQb3J0IFR5cGU8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFUG9ydFR5cGUoUG9ydFR5cGUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZyBPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbn0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmcgT3BlcmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ09wZXJhdGlvbnMoKTsKLQotfSAvLyBCaW5kaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdGYXVsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nRmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlOTU1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdGYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmluZGluZyBGYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudCB3aXRoaW4gYSBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZy4gQSBmYXVsdCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhdWx0IHdpdGggdGhlIHNhbWUgbmFtZS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0KCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nRmF1bHQgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5CaW5kaW5nRmF1bHR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0X05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVGYXVsdDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVGYXVsdDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUZhdWx0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RUZhdWx0KEZhdWx0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlGYXVsdCBnZXRFRmF1bHQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0IDxlbT5FRmF1bHQ8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUZhdWx0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVGYXVsdChGYXVsdCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdCgpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRGYXVsdChqYXZheC53c2RsLkZhdWx0IGZhdWx0KTsKLQotfSAvLyBCaW5kaW5nRmF1bHQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ0lucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjBmNGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ0lucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIElucHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBpbnB1dCBlbGVtZW50IHdpdGhpbiBhIG9wZXJhdGlvbiB3aXRoaW4gYSBiaW5kaW5nLiBBbiBpbnB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ0lucHV0IGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuQmluZGluZ0lucHV0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVJbnB1dChJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdJbnB1dF9FSW5wdXQoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JSW5wdXQgZ2V0RUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0lucHV0I2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFSW5wdXQoSW5wdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWphdmF4LndzZGwuSW5wdXQgZ2V0SW5wdXQoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0SW5wdXQoamF2YXgud3NkbC5JbnB1dCBpbnB1dCk7Ci0KLX0gLy8gQmluZGluZ0lucHV0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0JpbmRpbmdPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRlM2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgT3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nLiBBbiBvcGVyYXRpb24gZWxlbWVudCB3aXRoaW4gYSBiaW5kaW5nIHNwZWNpZmllcyBiaW5kaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgb3BlcmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSB3aXRoaW4gdGhlIGJpbmRpbmcncyBwb3J0VHlwZS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdJbnB1dCA8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdGYXVsdHMgPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCaW5kaW5nT3BlcmF0aW9uIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnQsIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbnsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU9wZXJhdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVPcGVyYXRpb24oT3BlcmF0aW9uKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU9wZXJhdGlvbiBnZXRFT3BlcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVPcGVyYXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVPcGVyYXRpb24oT3BlcmF0aW9uIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUJpbmRpbmcgSW5wdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FQmluZGluZyBJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nSW5wdXQgZ2V0RUJpbmRpbmdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdJbnB1dCA8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFQmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUJpbmRpbmcgT3V0cHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBPdXRwdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ091dHB1dCgpCi0gICAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3V0cHV0IGdldEVCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nIE91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVCaW5kaW5nT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZyBGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nRmF1bHR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FQmluZGluZyBGYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nRmF1bHRzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0IiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ0ZhdWx0cygpOwotCi19IC8vIEJpbmRpbmdPcGVyYXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvQmluZGluZ091dHB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3V0cHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NGRmNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9CaW5kaW5nT3V0cHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIE91dHB1dDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgb3V0cHV0IGVsZW1lbnQgd2l0aGluIGEgb3BlcmF0aW9uIHdpdGhpbiBhIGJpbmRpbmcuIEFuIG91dHB1dCBlbGVtZW50IHdpdGhpbiBhbiBvcGVyYXRpb24gd2l0aGluIGEgYmluZGluZyBzcGVjaWZpZXMgYmluZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBvZiB0aGUgb3BlcmF0aW9uLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nT3V0cHV0I2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ091dHB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmluZGluZ091dHB1dCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0QmluZGluZ091dHB1dF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ091dHB1dCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVPdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVPdXRwdXQ8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFT3V0cHV0KE91dHB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpCi0gICAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlPdXRwdXQgZ2V0RU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFT3V0cHV0KE91dHB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JamF2YXgud3NkbC5PdXRwdXQgZ2V0T3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE91dHB1dChqYXZheC53c2RsLk91dHB1dCBvdXRwdXQpOwotCi19IC8vIEJpbmRpbmdPdXRwdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRGVmaW5pdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2Y3YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIFdTREwgZG9jdW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVuY29kaW5nIDxlbT5FbmNvZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVNZXNzYWdlcyA8ZW0+RU1lc3NhZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RVBvcnRUeXBlcyA8ZW0+RVBvcnQgVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFQmluZGluZ3MgPGVtPkVCaW5kaW5nczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uI2dldEVTZXJ2aWNlcyA8ZW0+RVNlcnZpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RU5hbWVzcGFjZXMgPGVtPkVOYW1lc3BhY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0RVR5cGVzIDxlbT5FVHlwZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFSW1wb3J0cyA8ZW0+RUltcG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVmaW5pdGlvbiBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb257Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFRhcmdldE5hbWVzcGFjZShTdHJpbmcpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldExvY2F0aW9uKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fTG9jYXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFN0cmluZyBnZXRMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldExvY2F0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkRlZmluaXRpb24jZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuY29kaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldEVuY29kaW5nKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRW5jb2RpbmcoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU3RyaW5nIGdldEVuY29kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5jb2Rpbmc8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRFbmNvZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTWVzc2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FTWVzc2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU1lc3NhZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FTWVzc2FnZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFTWVzc2FnZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVBvcnQgVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZX0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVBvcnQgVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBvcnRUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FQmluZGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FQmluZGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RUJpbmRpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5CaW5kaW5nIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFTGlzdCBnZXRFQmluZGluZ3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZX0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVNlcnZpY2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVTZXJ2aWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRVNlcnZpY2VzKCkKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuU2VydmljZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVNlcnZpY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVOYW1lc3BhY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlfS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FTmFtZXNwYWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTmFtZXNwYWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVOYW1lc3BhY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVUeXBlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RVR5cGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RVR5cGVzKFR5cGVzKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FVHlwZXMoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JVHlwZXMgZ2V0RVR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRGVmaW5pdGlvbiNnZXRFVHlwZXMgPGVtPkVUeXBlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FVHlwZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFVHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RVR5cGVzKFR5cGVzIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RUltcG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVJbXBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbXBvcnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RGVmaW5pdGlvbl9FSW1wb3J0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLkltcG9ydCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUltcG9ydHMoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLkRPTURvY3VtZW50IiBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIHBhcmFtZXRlcnM9Im9yZy5lY2xpcHNlLndzZGwuRE9NRG9jdW1lbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCk7Ci0KLX0gLy8gRGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9FeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9FeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc4Y2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudC4gV1NETCBhbGxvd3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyB0ZWNobm9sb2d5IHVuZGVyIHZhcmlvdXMgZWxlbWVudHMgZGVmaW5lZCBieSBXU0RMLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0RWxlbWVudFR5cGUgPGVtPkVsZW1lbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5kcyBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRSZXF1aXJlZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfUmVxdWlyZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1JlcXVpcmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldEVsZW1lbnRUeXBlKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRFbGVtZW50VHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldEVsZW1lbnRUeXBlIDxlbT5FbGVtZW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0RWxlbWVudFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgdmFsdWUpOwotCi19IC8vIEV4dGVuc2liaWxpdHlFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0V4dGVuc2libGVFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0V4dGVuc2libGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1M2FmM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9FeHRlbnNpYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbnNpYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiAgV1NETCBhbGxvd3MgZWxlbWVudHMgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgdGVjaG5vbG9neSAocmVmZXJyZWQgdG8gaGVyZSBhcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzKSB1bmRlciB2YXJpb3VzIGVsZW1lbnRzIGRlZmluZWQgYnkgV1NETC4gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb2ludCBvZiBleHRlbnNpYmlsaXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cyA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2libGVFbGVtZW50IGV4dGVuZHMgV1NETEVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50fS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUxpc3QgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIGFkZEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpOwotCi19IC8vIEV4dGVuc2libGVFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0ZhdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0ZhdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Nzg2NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9GYXVsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GYXVsdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgZmF1bHQgZWxlbWVudC4gRmF1bHQgZWxlbWVudHMgc3BlY2lmeSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXQgZm9yIGFueSBlcnJvciBtZXNzYWdlcyB0aGF0IG1heSBiZSBvdXRwdXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0RmF1bHQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZhdWx0IGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZSwgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuRmF1bHR7Ci19IC8vIEZhdWx0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0ltcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxNDU5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgV1NETCBpbXBvcnQgZWxlbWVudC4gV1NETCBhbGxvd3MgYXNzb2NpYXRpbmcgYSBuYW1lc3BhY2Ugd2l0aCBhIGRvY3VtZW50IGxvY2F0aW9uIHVzaW5nIGFuIGltcG9ydCBlbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRFU2NoZW1hIDxlbT5FU2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1wb3J0IGV4dGVuZHMgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuSW1wb3J0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZXNwYWNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZSBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lc3BhY2VVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0SW1wb3J0X05hbWVzcGFjZVVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lc3BhY2UgVVJJPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldExvY2F0aW9uVVJJKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydF9Mb2NhdGlvblVSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5JbXBvcnQjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRMb2NhdGlvblVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVEZWZpbml0aW9uKERlZmluaXRpb24pCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRJbXBvcnRfRURlZmluaXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRGVmaW5pdGlvbiBnZXRFRGVmaW5pdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCNnZXRFRGVmaW5pdGlvbiA8ZW0+RURlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RURlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFRGVmaW5pdGlvbihEZWZpbml0aW9uIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RVNjaGVtYTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVTY2hlbWE8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVTY2hlbWE8L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRFU2NoZW1hKFhTRFNjaGVtYSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldEltcG9ydF9FU2NoZW1hKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYSBnZXRFU2NoZW1hKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW1wb3J0I2dldEVTY2hlbWEgPGVtPkVTY2hlbWE8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RVNjaGVtYTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVTY2hlbWEoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RVNjaGVtYShYU0RTY2hlbWEgdmFsdWUpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYSBnZXRTY2hlbWEoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpOwotCi19IC8vIEltcG9ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9JbnB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9JbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzI4MWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvSW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5wdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIGlucHV0IGVsZW1lbnQuIEFuIGlucHV0IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBhYnN0cmFjdCBtZXNzYWdlIGZvcm1hdCBmb3IgdGhlIGlucHV0IG9mIHRoZSBvcGVyYXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRJbnB1dCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5wdXQgZXh0ZW5kcyBNZXNzYWdlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCwgamF2YXgud3NkbC5JbnB1dHsKLX0gLy8gSW5wdXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOTRkNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG1lc3NhZ2UgZWxlbWVudC4gQSBXU0RMIG1lc3NhZ2UgaXMgYW4gYWJzdHJhY3QsIHR5cGVkIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgYmVpbmcgY29tbXVuaWNhdGVkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjZ2V0RVBhcnRzIDxlbT5FUGFydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZSBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLk1lc3NhZ2V7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZV9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZV9VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2UjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQYXJ0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVQYXJ0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlX0VQYXJ0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlBhcnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVQYXJ0cygpOwotCi19IC8vIE1lc3NhZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTWVzc2FnZVJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzQxZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9NZXNzYWdlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk1lc3NhZ2VSZWZlcmVuY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlUmVmZXJlbmNlIGV4dGVuZHMgV1NETEVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVNZXNzYWdlKE1lc3NhZ2UpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCkKLSAgICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBNZXNzYWdlIGdldEVNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgdmFsdWUpOwotCi19IC8vIE1lc3NhZ2VSZWZlcmVuY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL05hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTMwMDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG5hbWVzcGFjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlIHByZWZpeCB1c2VkIGluIGEgV1NETCBkb2N1bWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk5hbWVzcGFjZSNnZXRVUkkgPGVtPlVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TmFtZXNwYWNlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lc3BhY2UgZXh0ZW5kcyBFT2JqZWN0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VVJJPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VUkk8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRVUkkoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TmFtZXNwYWNlX1VSSSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlI2dldFVSSSA8ZW0+VVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVUkkoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRQcmVmaXgoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0TmFtZXNwYWNlX1ByZWZpeCgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0UHJlZml4KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTmFtZXNwYWNlI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldFByZWZpeCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBOYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvT3BlcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzNlMGI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3BlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBvcGVyYXRpb24gZWxlbWVudC4gQSBXU0RMIG9wZXJhdGlvbiBpcyBhbiBhYnN0cmFjdCBkZXNjcmlwdGlvbiBvZiBhbiBhY3Rpb24gc3VwcG9ydGVkIGJ5IGEgc2VydmljZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RUZhdWx0cyA8ZW0+RUZhdWx0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RVBhcmFtZXRlck9yZGVyaW5nIDxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbigpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3BlcmF0aW9uIGV4dGVuZHMgV1NETEVsZW1lbnQsIGphdmF4LndzZGwuT3BlcmF0aW9uewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRTdHlsZShPcGVyYXRpb25UeXBlKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX1N0eWxlKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvblR5cGUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3BlcmF0aW9uVHlwZSBnZXRTdHlsZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLk9wZXJhdGlvbiNnZXRTdHlsZSA8ZW0+U3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3R5bGU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRTdHlsZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRTdHlsZShPcGVyYXRpb25UeXBlIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbl9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX1VuZGVmaW5lZCgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlib29sZWFuIGlzVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5kZWZpbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjaXNVbmRlZmluZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FSW5wdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FSW5wdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVJbnB1dChJbnB1dCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldE9wZXJhdGlvbl9FSW5wdXQoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JSW5wdXQgZ2V0RUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3BlcmF0aW9uI2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVJbnB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFSW5wdXQoSW5wdXQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FT3V0cHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RU91dHB1dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVPdXRwdXQoT3V0cHV0KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VPdXRwdXQoKQotICAgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3V0cHV0IGdldEVPdXRwdXQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24jZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FT3V0cHV0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFT3V0cHV0KE91dHB1dCB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5GYXVsdH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUZhdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FRmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VGYXVsdHMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5GYXVsdCIgY29udGFpbm1lbnQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RUZhdWx0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FUGFyYW1ldGVyIE9yZGVyaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLSAgICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydH0uCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUGFyYW1ldGVyIE9yZGVyaW5nPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlBhcnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JRUxpc3QgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCk7Ci0KLX0gLy8gT3BlcmF0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL091dHB1dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9PdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwOWRkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL091dHB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIG91dHB1dCBlbGVtZW50LiBBbiBvdXRwdXQgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGFic3RyYWN0IG1lc3NhZ2UgZm9ybWF0IGZvciB0aGUgb3V0cHV0IG9mIHRoZSBvcGVyYXRpb24uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRPdXRwdXQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dHB1dCBleHRlbmRzIE1lc3NhZ2VSZWZlcmVuY2UsIFdTRExFbGVtZW50LCBqYXZheC53c2RsLk91dHB1dHsKLX0gLy8gT3V0cHV0CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1BhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjViMDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBhcnQgZWxlbWVudC4gUGFydHMgZGVzY3JpYmUgdGhlIGxvZ2ljYWwgYWJzdHJhY3QgY29udGVudCBvZiBhIG1lc3NhZ2UuIEVhY2ggcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggYSB0eXBlIGZyb20gc29tZSB0eXBlIHN5c3RlbS4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50TmFtZSA8ZW0+RWxlbWVudCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldFR5cGVEZWZpbml0aW9uIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFTWVzc2FnZSA8ZW0+RU1lc3NhZ2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFydCBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLlBhcnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9OYW1lKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRFbGVtZW50TmFtZShRTmFtZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfRWxlbWVudE5hbWUoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuUU5hbWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUU5hbWUgZ2V0RWxlbWVudE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVsZW1lbnROYW1lIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0RWxlbWVudE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RWxlbWVudE5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFR5cGVOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UGFydF9UeXBlTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRUeXBlTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBhcnQjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRUeXBlTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRUeXBlTmFtZShRTmFtZSB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgRGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRUeXBlRGVmaW5pdGlvbihYU0RUeXBlRGVmaW5pdGlvbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfVHlwZURlZmluaXRpb24oKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFhTRFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRUeXBlRGVmaW5pdGlvbiA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRUeXBlRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IERlY2xhcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24gPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPicgcmVmZXJlbmNlLgotICAgKiBAc2VlICNnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICB2b2lkIHNldEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FTWVzc2FnZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVNZXNzYWdlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldEVNZXNzYWdlKE1lc3NhZ2UpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRQYXJ0X0VNZXNzYWdlKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU1lc3NhZ2UgZ2V0RU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0I2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FTWVzc2FnZTwvZW0+JyByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldEVNZXNzYWdlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgdmFsdWUpOwotCi19IC8vIFBhcnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Qb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYTYxZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Qb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHBvcnQgZWxlbWVudC4gQSBwb3J0IGRlZmluZXMgYW4gaW5kaXZpZHVhbCBlbmRwb2ludCBieSBzcGVjaWZ5aW5nIGEgc2luZ2xlIGFkZHJlc3MgZm9yIGEgYmluZGluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnQoKQotICogQG1vZGVsIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvcnQgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5Qb3J0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRfTmFtZSgpCi0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVCaW5kaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RUJpbmRpbmc8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0RUJpbmRpbmcoQmluZGluZykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRfRUJpbmRpbmcoKQotICAgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JQmluZGluZyBnZXRFQmluZGluZygpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnQjZ2V0RUJpbmRpbmcgPGVtPkVCaW5kaW5nPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVCaW5kaW5nPC9lbT4nIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0RUJpbmRpbmcoQmluZGluZyB2YWx1ZSk7Ci0KLX0gLy8gUG9ydApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Qb3J0VHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9Qb3J0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjM3Y2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvUG9ydFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCBwb3J0VHlwZSBlbGVtZW50IG9mIHRoZSBXU0RMIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjEgYW5kIGFuIEludGVyZmFjZSBjb21wb25lbnQgb2YgdGhlIFdTREwgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDEuMi4gQSBwb3J0IHR5cGUgb3IgSW50ZXJmYWNlIGlzIGEgbmFtZWQgc2V0IG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgYW5kIHRoZSBhYnN0cmFjdCBtZXNzYWdlcyBpbnZvbHZlZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjZ2V0RU9wZXJhdGlvbnMgPGVtPkVPcGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRUeXBlKCkKLSAqIEBtb2RlbCAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3J0VHlwZSBleHRlbmRzIFdTRExFbGVtZW50LCBqYXZheC53c2RsLlBvcnRUeXBlewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UU5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRRTmFtZShRTmFtZSkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFBvcnRUeXBlX1FOYW1lKCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLlFOYW1lIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVFOYW1lIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuUG9ydFR5cGUjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCkKLSAgICogQG1vZGVsIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCWJvb2xlYW4gaXNVbmRlZmluZWQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0VHlwZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQl2b2lkIHNldFVuZGVmaW5lZChib29sZWFuIHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb259LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVPcGVyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0UG9ydFR5cGVfRU9wZXJhdGlvbnMoKQotICAgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVPcGVyYXRpb25zKCk7Ci0KLX0gLy8gUG9ydFR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTRjN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBXU0RMIHNlcnZpY2UgZWxlbWVudC4gQSBzZXJ2aWNlIGdyb3VwcyBhIHNldCBvZiByZWxhdGVkIHBvcnRzIHRvZ2V0aGVyLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjZ2V0RVBvcnRzIDxlbT5FUG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZSgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZSBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50LCBqYXZheC53c2RsLlNlcnZpY2V7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFFOYW1lKFFOYW1lKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZV9RTmFtZSgpCi0gICAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2Uud3NkbC5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlFOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCXZvaWQgc2V0UU5hbWUoUU5hbWUgdmFsdWUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuZGVmaW5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIEBzZWUgI3NldFVuZGVmaW5lZChib29sZWFuKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0U2VydmljZV9VbmRlZmluZWQoKQotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JYm9vbGVhbiBpc1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlNlcnZpY2UjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmRlZmluZWQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVQb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnR9LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVQb3J0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FUG9ydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRTZXJ2aWNlX0VQb3J0cygpCi0gICAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS53c2RsLlBvcnQiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUVMaXN0IGdldEVQb3J0cygpOwotCi19IC8vIFNlcnZpY2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5MTA2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1R5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgV1NETCB0eXBlcyBlbGVtZW50LiBUaGUgdHlwZXMgZWxlbWVudCBlbmNsb3NlcyBkYXRhIHR5cGUgZGVmaW5pdGlvbnMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZSBleGNoYW5nZWQgbWVzc2FnZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRUeXBlcygpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZXMgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudCwgamF2YXgud3NkbC5UeXBlc3sKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCBwYXJhbWV0ZXJzPSIiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTGlzdCBnZXRTY2hlbWFzKCk7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBtb2RlbCAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlMaXN0IGdldFNjaGVtYXMoU3RyaW5nIG5hbWVzcGFjZVVSSSk7Ci0KLX0gLy8gVHlwZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1Vua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDZmOWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0Q2hpbGRyZW4gPGVtPkNoaWxkcmVuPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLldTRExQYWNrYWdlI2dldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnR7Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGlsZHJlbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudH0uCi0gICAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50I2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoaWxkcmVuPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoaWxkcmVuPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50X0NoaWxkcmVuKCkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRQYXJlbnQKLSAgICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiBvcHBvc2l0ZT0icGFyZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFTGlzdCBnZXRDaGlsZHJlbigpOwotCi19IC8vIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ1YmE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIFdTREwgbGFuZ3VhZ2UgZWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLldTRExFbGVtZW50I2dldERvY3VtZW50YXRpb25FbGVtZW50IDxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuV1NETEVsZW1lbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRXU0RMRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETEVsZW1lbnQgZXh0ZW5kcyBFT2JqZWN0ewotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXREb2N1bWVudGF0aW9uRWxlbWVudChFbGVtZW50KQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0V1NETEVsZW1lbnRfRG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLndzZGwuRE9NRWxlbWVudCIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlFbGVtZW50IGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuV1NETEVsZW1lbnQjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXREb2N1bWVudGF0aW9uRWxlbWVudChFbGVtZW50IHZhbHVlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogVGhpcyBpcyB0aGUgdW5kZXJseWluZyBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21wb25lbnQsIAotICAgKiBpLmUuLCB0aGUge0BsaW5rICN1cGRhdGVFbGVtZW50KCkgc2VyaWFsaXphdGlvbn0gb2YgdGhpcyBjb21wb25lbnQuCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNzZXRFbGVtZW50KEVsZW1lbnQpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRXU0RMRWxlbWVudF9FbGVtZW50KCkKLSAgICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS53c2RsLkRPTUVsZW1lbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLldTRExFbGVtZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotICAgKiBAc2VlICNnZXRFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgdmFsdWUpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgcGFyYW1ldGVycz0iIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCURlZmluaXRpb24gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAbW9kZWwgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0Jdm9pZCBzZXRFbmNsb3NpbmdEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbik7Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhhdCB0aGUgdW5kZXJseWluZyBET00ge0BsaW5rICNnZXRFbGVtZW50IGVsZW1lbnR9IGJvdGggZXhpc3RzIGFuZCBpcyB1cC10by1kYXRlIHdpdGggcmVzcGVjdCB0byB0aGUgbW9kZWwsCi0gICAqIGkuZS4sIGl0IHNlcmlhbGl6ZXMgdGhlIGNvbXBvbmVudCBhbmQgbWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIHdpdGggdGhhdCBzZXJpYWxpemF0aW9uLgotICAgKiBAc2VlICN1cGRhdGVFbGVtZW50KGJvb2xlYW4pCi0gICAqIEBzZWUgI2dldEVsZW1lbnQKLSAgICovCi0gIHZvaWQgdXBkYXRlRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoYXQgdGhlIHVuZGVybHlpbmcgRE9NIHtAbGluayAjZ2V0RWxlbWVudCBlbGVtZW50fSBib3RoIGV4aXN0cyBhbmQgaXMgdXAtdG8tZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIG1vZGVsLAotICAgKiBpLmUuLCBpdCBzZXJpYWxpemVzIHRoZSBjb21wb25lbnQgYW5kIG1haW50YWlucyBhbiBhc3NvY2lhdGlvbiB3aXRoIHRoYXQgc2VyaWFsaXphdGlvbi4KLSAgICogRm9yIDxjb2RlPmRlZXAgPT0gdHJ1ZTwvY29kZT4sIAotICAgKiBvciB3aGVuIDxjb2RlPntAbGluayAjZ2V0RWxlbWVudCBnZXRFbGVtZW50KCl9ID09IG51bGw8L2NvZGU+LCAKLSAgICogdGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIHtAbGluayAjdXBkYXRlRWxlbWVudCgpfTsKLSAgICogb3RoZXJ3aXNlLCBpdCB1cGRhdGVzIGp1c3QgdGhlIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudCB0byByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXRlLgotICAgKiBAc2VlICN1cGRhdGVFbGVtZW50KCkKLSAgICogQHNlZSAjZ2V0RWxlbWVudAotICAgKi8KLSAgdm9pZCB1cGRhdGVFbGVtZW50KGJvb2xlYW4gZGVlcCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIFRoaXMgcmVwcmVzZW50cyB0aGUgY29uY3JldGUgY29udGFpbmVyIG9mIHRoaXMgY29tcG9uZW50LCAKLSAgICogaS5lLiwgdGhlIGludmVyc2Ugb2YgdGhlIGJsYWNrIGRpYW1vbmQgcmVsYXRpb25zIGluIHRoZSBVTUwgbW9kZWwuCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyByZWZlcmVuY2UuCi0gICAqLwotICBXU0RMRWxlbWVudCBnZXRDb250YWluZXIoKTsKLSAgCi0gIC8qKgotICAgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCBoYXMgY2hhbmdlZDsKLSAgICogdGhlIGVsZW1lbnQgc2hvdWxkIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIHJldHVybmVkIHtAbGluayAjZ2V0RWxlbWVudH0uCi0gICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgY2xpZW50cyB3aWxsIG5vdCBjYWxsIHRoaXMgdGhlbXNlbHZlcyAKLSAgICogc2luY2UgdGhlIERPTSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhlIHVuZGVybHlpbmcgRE9NIHdpbGwgaW52b2tlIHRoZXNlIGF1dG9tYXRpY2FsbHkuCi0gICAqLwotICB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpOwotCi19IC8vIFdTRExFbGVtZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZmVhODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnl7Ci0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVdTRExGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExGYWN0b3J5SW1wbCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0IFR5cGU8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JUG9ydFR5cGUgY3JlYXRlUG9ydFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCU9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBhcnQgY3JlYXRlUGFydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nIGNyZWF0ZUJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3BlcmF0aW9uIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZXJ2aWNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JU2VydmljZSBjcmVhdGVTZXJ2aWNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb3J0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVBvcnQgY3JlYXRlUG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlZmluaXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbXBvcnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUltcG9ydCBjcmVhdGVJbXBvcnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JbnB1dDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlJbnB1dCBjcmVhdGVJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRwdXQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JT3V0cHV0IGNyZWF0ZU91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUZhdWx0IGNyZWF0ZUZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCUJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLQlCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JQmluZGluZ0ZhdWx0IGNyZWF0ZUJpbmRpbmdGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JTmFtZXNwYWNlIGNyZWF0ZU5hbWVzcGFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlR5cGVzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlR5cGVzPC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVR5cGVzIGNyZWF0ZVR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0JVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotCVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoKLSAgICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotCS8vV1NETFBhY2thZ2UgZ2V0V1NETFBhY2thZ2UoKTsKLQotfSAvL1dTRExGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQYWNrYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjY4Y2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgV1NETCBtb2RlbCBjb250YWlucyBjbGFzc2VzIGZvciB0aGUgV2ViIFNlcnZpY2VzIERlc2NyaXB0aW9uIExhbmd1YWdlIChXU0RMKS4KLSAqIAotICogV1NETCBkZXNjcmliZXMgbmV0d29yayBzZXJ2aWNlcyBhcyBzZXRzIG9mIGVuZHBvaW50cyBvcGVyYXRpbmcgb24gbWVzc2FnZXMuIFRoZSBvcGVyYXRpb25zIGFuZCBtZXNzYWdlcyBhcmUgZGVzY3JpYmVkIGFic3RyYWN0bHksIGFuZCB0aGVuIGJvdW5kIHRvIGEgY29uY3JldGUgbmV0d29yayBwcm90b2NvbCBhbmQgbWVzc2FnZSBmb3JtYXQgdG8gZGVmaW5lIGFuIGVuZHBvaW50LgotICogCi0gKiBXU0RMIGRlc2NyaWJlcyB0aGUgZm9ybWF0cyBvZiB0aGUgbWVzc2FnZXMgZXhjaGFuZ2VkIGJ5IHRoZSBzZXJ2aWNlcywgYW5kIHN1cHBvcnRzIHRoZSBYTUwgU2NoZW1hcyBzcGVjaWZpY2F0aW9uIGFzIGl0cyBjYW5vbmljYWwgdHlwZSBzeXN0ZW0uIFRoaXMgcGFja2FnZSB1c2VzIGFuIFhNTCBTY2hlbWEgSW5mb3NldCBtb2RlbCBwYWNrYWdlIChzZWUgdGhlIFhTRCBwYWNrYWdlKSB0byBkZXNjcmliZSB0aGUgYWJzdHJhY3QgbWVzc2FnZSBmb3JtYXRzLgotICogCi0gKiBUaGUgbW9kZWwgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkaWFncmFtcywgbmFtZWQgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcHRlcnMgaW4gdGhlIFdTREwgMS4xIHNwZWNpZmljYXRpb24gKGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvTk9URS13c2RsLTIwMDEwMzE1KQotICogLSAyLjEgRGVmaW5pdGlvbiwgc2hvd3MgdGhlIFdTREwgZGVmaW5pdGlvbiBlbGVtZW50IGFuZCB0aGUgV1NETCBkb2N1bWVudCBzdHJ1Y3R1cmUKLSAqIC0gMi4xLjEgTmFtaW5nIGFuZCBMaW5raW5nLCBzaG93cyB0aGUgbmFtZXNwYWNlIGFuZCBpbXBvcnQgbWVjaGFuaXNtCi0gKiAtIDIuMS4zIEV4dGVuc2liaWxpdHksIHNob3dzIHRoZSBXU0RMIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtCi0gKiAtIDIuMiBUeXBlcywgc2hvd3MgdGhlIHVzZSBvZiBYTUwgU2NoZW1hIHR5cGVzIGluIFdTREwKLSAqIC0gMi4zIE1lc3NhZ2VzLCAyLjQgUG9ydFR5cGVzLCAyLjUgQmluZGluZ3MgYW5kIDIuNyBTZXJ2aWNlcywgc2hvdyB0aGUgbWFqb3IgV1NETCBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zLgotICogCi0gKiBUaGUgV1NETCBjbGFzc2VzIGV4dGVuZCB0aGUgamF2YXgud3NkbCBpbnRlcmZhY2VzIGRlZmluZWQgYnkgSlNSIDExMC4gQ2xhc3NlcyB3aXRoIGludGVyZmFjZSBhbmQgZGF0YXR5cGUgc3RlcmVvdHlwZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZXNlIG5vbi1NT0YgaW50ZXJmYWNlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMRmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UKLXsKLSAgLyoqCi0gICAqIFRoZSBwYWNrYWdlIG5hbWUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBTdHJpbmcgZU5BTUUgPSAid3NkbCI7Ci0KLSAgLyoqCi0gICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmlibS5jb20vd3NkbC8yMDAzL1dTREwiOwotCi0gIC8qKgotICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIFN0cmluZyBlTlNfUFJFRklYID0gIndzZGwiOwotCi0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgV1NETFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5XU0RMUGFja2FnZUltcGwuaW5pdCgpOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5XU0RMRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExFbGVtZW50SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFdTRExFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFdTRExfRUxFTUVOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgV1NETF9FTEVNRU5UX19FTEVNRU5UID0gMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlBvcnRUeXBlSW1wbCA8ZW0+UG9ydCBUeXBlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Qb3J0VHlwZUltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEUgPSAxOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fUU5BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX1RZUEVfX1VOREVGSU5FRCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9UWVBFX19QUk9YWSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fUkVTT1VSQ0VfVVJJID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9fRU9QRVJBVElPTlMgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UG9ydCBUeXBlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBPUlRfVFlQRV9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCA8ZW0+T3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5PcGVyYXRpb25JbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTiA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19TVFlMRSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fX1VOREVGSU5FRCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19QUk9YWSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9QRVJBVElPTl9fUkVTT1VSQ0VfVVJJID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlucHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19FSU5QVVQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3V0cHV0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19FT1VUUFVUID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUZhdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19FRkFVTFRTID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcmFtZXRlciBPcmRlcmluZzwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLk1lc3NhZ2VJbXBsIDxlbT5NZXNzYWdlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5NZXNzYWdlSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgTUVTU0FHRSA9IDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19FTEVNRU5UID0gV1NETF9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19RTkFNRSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuZGVmaW5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfX1VOREVGSU5FRCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3h5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9fUFJPWFkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX19SRVNPVVJDRV9VUkkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUGFydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfX0VQQVJUUyA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5NZXNzYWdlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlBhcnRJbXBsIDxlbT5QYXJ0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5QYXJ0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgUEFSVCA9IDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19FTEVNRU5UID0gV1NETF9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFBBUlRfX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19FTEVNRU5UX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19UWVBFX05BTUUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIERlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX19UWVBFX0RFRklOSVRJT04gPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IERlY2xhcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRUxFTUVOVF9ERUNMQVJBVElPTiA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUEFSVF9fRU1FU1NBR0UgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UGFydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQQVJUX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5FeHRlbnNpYmxlRWxlbWVudEltcGwgPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRXh0ZW5zaWJsZUVsZW1lbnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgRVhURU5TSUJMRV9FTEVNRU5UID0gMTI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdJbXBsIDxlbT5CaW5kaW5nPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgQklORElORyA9IDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fUU5BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19VTkRFRklORUQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX1BST1hZID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19fUkVTT1VSQ0VfVVJJID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBvcnQgVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfX0VQT1JUX1RZUEUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZyBPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmc8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwgPGVtPkJpbmRpbmcgT3BlcmF0aW9uPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5CaW5kaW5nT3BlcmF0aW9uSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEJpbmRpbmdPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT04gPSA2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT05fX05BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT05fX0VPUEVSQVRJT04gPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZyBJbnB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVCaW5kaW5nIE91dHB1dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZyBGYXVsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19GQVVMVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlNlcnZpY2VJbXBsIDxlbT5TZXJ2aWNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5TZXJ2aWNlSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgU0VSVklDRSA9IDc7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFNFUlZJQ0VfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fUU5BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmRlZmluZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19VTkRFRklORUQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm94eTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFNFUlZJQ0VfX1BST1hZID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgU0VSVklDRV9fUkVTT1VSQ0VfVVJJID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX19FUE9SVFMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+U2VydmljZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBTRVJWSUNFX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Qb3J0SW1wbCA8ZW0+UG9ydDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuUG9ydEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRQb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFBPUlQgPSA4OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fTkFNRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVCaW5kaW5nPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgUE9SVF9fRUJJTkRJTkcgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UG9ydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBQT1JUX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgPGVtPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UID0gOTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UID0gV1NETF9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEUgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwgPGVtPkRlZmluaXRpb248L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OID0gMTA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19MT0NBVElPTiA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlFOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fUU5BTUUgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmNvZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VOQ09ESU5HID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU1lc3NhZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBERUZJTklUSU9OX19FTUVTU0FHRVMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUG9ydCBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRVBPUlRfVFlQRVMgPSBFWFRFTlNJQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQmluZGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VCSU5ESU5HUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTZXJ2aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRVNFUlZJQ0VTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU5hbWVzcGFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VOQU1FU1BBQ0VTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgREVGSU5JVElPTl9fRVRZUEVTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUltcG9ydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fX0VJTVBPUlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5EZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IERFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5JbXBvcnRJbXBsIDxlbT5JbXBvcnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkltcG9ydEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJbXBvcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU1QT1JUID0gMTE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElNUE9SVF9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX05BTUVTUEFDRV9VUkkgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbiBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX0xPQ0FUSU9OX1VSSSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVEZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU1QT1JUX19FREVGSU5JVElPTiA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTY2hlbWE8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTVBPUlRfX0VTQ0hFTUEgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW1wb3J0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElNUE9SVF9GRUFUVVJFX0NPVU5UID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGwgPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5NZXNzYWdlUmVmZXJlbmNlSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE1lc3NhZ2VSZWZlcmVuY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9SRUZFUkVOQ0UgPSA0NjsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBXU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVCA9IFdTRExfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBNRVNTQUdFX1JFRkVSRU5DRV9fTkFNRSA9IFdTRExfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFID0gV1NETF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE1FU1NBR0VfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBXU0RMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5JbnB1dEltcGwgPGVtPklucHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5JbnB1dEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJbnB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJTlBVVCA9IDEzOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTlBVVF9fTkFNRSA9IE1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTlBVVF9fRU1FU1NBR0UgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0U7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW5wdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSU5QVVRfRkVBVFVSRV9DT1VOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuT3V0cHV0SW1wbCA8ZW0+T3V0cHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5PdXRwdXRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0T3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE9VVFBVVCA9IDE0OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9VVFBVVF9fRUxFTUVOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IE9VVFBVVF9fTkFNRSA9IE1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU1lc3NhZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPVVRQVVRfX0VNRVNTQUdFID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBPVVRQVVRfRkVBVFVSRV9DT1VOVCA9IE1FU1NBR0VfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRmF1bHRJbXBsIDxlbT5GYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuRmF1bHRJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgRkFVTFQgPSAxNTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX19FTEVNRU5UID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRkFVTFRfX05BTUUgPSBNRVNTQUdFX1JFRkVSRU5DRV9fTkFNRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVNZXNzYWdlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgRkFVTFRfX0VNRVNTQUdFID0gTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEZBVUxUX0ZFQVRVUkVfQ09VTlQgPSBNRVNTQUdFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdJbnB1dEltcGwgPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdJbnB1dEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nSW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVCA9IDE2OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVF9fRUxFTUVOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0lOUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUyA9IEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19JTlBVVF9fTkFNRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfX0VJTlBVVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfSU5QVVRfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLkJpbmRpbmdPdXRwdXRJbXBsIDxlbT5CaW5kaW5nIE91dHB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ091dHB1dEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRCaW5kaW5nT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfT1VUUFVUID0gMTc7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVF9fTkFNRSA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVF9fRU9VVFBVVCA9IEVYVEVOU0lCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CaW5kaW5nIE91dHB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX09VVFBVVF9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ0ZhdWx0SW1wbCA8ZW0+QmluZGluZyBGYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuQmluZGluZ0ZhdWx0SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldEJpbmRpbmdGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUID0gMTg7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUX19FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IEJJTkRJTkdfRkFVTFRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBCSU5ESU5HX0ZBVUxUX19OQU1FID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUZhdWx0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9fRUZBVUxUID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgQklORElOR19GQVVMVF9GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5OYW1lc3BhY2VJbXBsCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IE5BTUVTUEFDRSA9IDE5OwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTkFNRVNQQUNFX19VUkkgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgTkFNRVNQQUNFX19QUkVGSVggPSAxOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBOQU1FU1BBQ0VfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0VHlwZSA8ZW0+SVBvcnQgVHlwZTwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuUG9ydFR5cGUKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJUG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVBPUlRfVFlQRSA9IDIwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklQb3J0IFR5cGU8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVBPUlRfVFlQRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLk9wZXJhdGlvbiA8ZW0+SU9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuT3BlcmF0aW9uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SU9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJT1BFUkFUSU9OID0gMjE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuSW5wdXQgPGVtPklJbnB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuSW5wdXQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJSW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUlOUFVUID0gMjI7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUlucHV0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElJTlBVVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLk91dHB1dCA8ZW0+SU91dHB1dDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuT3V0cHV0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJT1VUUFVUID0gMjM7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU91dHB1dDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJT1VUUFVUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuRmF1bHQgPGVtPklGYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuRmF1bHQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUZBVUxUID0gMjQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElGQVVMVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLk1lc3NhZ2UgPGVtPklNZXNzYWdlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5NZXNzYWdlCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SU1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSU1FU1NBR0UgPSAyNTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JTWVzc2FnZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTUVTU0FHRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLlBhcnQgPGVtPklQYXJ0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5QYXJ0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SVBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVBBUlQgPSAyNjsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JUGFydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJUEFSVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLlNlcnZpY2UgPGVtPklTZXJ2aWNlPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5TZXJ2aWNlCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SVNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVNFUlZJQ0UgPSAyNzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JU2VydmljZTwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJU0VSVklDRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLlBvcnQgPGVtPklQb3J0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5Qb3J0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SVBvcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVBPUlQgPSAyODsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JUG9ydDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJUE9SVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmcgPGVtPklCaW5kaW5nPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUJJTkRJTkcgPSAyOTsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JQmluZGluZzwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJQklORElOR19GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElCaW5kaW5nT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX09QRVJBVElPTiA9IDMwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJQklORElOR19PUEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgPGVtPklCaW5kaW5nIElucHV0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJQmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX0lOUFVUID0gMzE7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfSU5QVVRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IDxlbT5JQmluZGluZyBPdXRwdXQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJQmluZGluZ091dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJQklORElOR19PVVRQVVQgPSAzMjsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JQmluZGluZyBPdXRwdXQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUJJTkRJTkdfT1VUUFVUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IDxlbT5JQmluZGluZyBGYXVsdDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUJpbmRpbmdGYXVsdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJQklORElOR19GQVVMVCA9IDMzOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklCaW5kaW5nIEZhdWx0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElCSU5ESU5HX0ZBVUxUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJRVhURU5TSUJJTElUWV9FTEVNRU5UID0gMzQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuRGVmaW5pdGlvbiA8ZW0+SURlZmluaXRpb248L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJREVGSU5JVElPTiA9IDM1OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElERUZJTklUSU9OX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmF4LndzZGwuSW1wb3J0IDxlbT5JSW1wb3J0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5JbXBvcnQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJSW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElJTVBPUlQgPSAzNjsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSW1wb3J0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElJTVBPUlRfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YS51dGlsLkxpc3QgPGVtPklMaXN0PC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YS51dGlsLkxpc3QKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJTGlzdCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJTElTVCA9IDM3OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklMaXN0PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IElMSVNUX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEudXRpbC5NYXAgPGVtPklNYXA8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZhLnV0aWwuTWFwCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SU1hcCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJTUFQID0gMzg7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SU1hcDwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJTUFQX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEubmV0LlVSTCA8ZW0+SVVSTDwvZW0+fScgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElVUkwoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSVVSTCA9IDM5OwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklVUkw8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVVSTF9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkgPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnkKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRJRXh0ZW5zaW9uUmVnaXN0cnkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgSUVYVEVOU0lPTl9SRUdJU1RSWSA9IDQwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSUVYVEVOU0lPTl9SRUdJU1RSWV9GRUFUVVJFX0NPVU5UID0gMDsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlR5cGVzSW1wbCA8ZW0+VHlwZXM8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlR5cGVzSW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFR5cGVzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFRZUEVTID0gNDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBUWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVFlQRVNfX0VMRU1FTlQgPSBFWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRXh0ZW5zaWJpbGl0eSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVFlQRVNfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTID0gRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UeXBlczwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBUWVBFU19GRUFUVVJFX0NPVU5UID0gRVhURU5TSUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIGphdmEudXRpbC5JdGVyYXRvciA8ZW0+SUl0ZXJhdG9yPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0SUl0ZXJhdG9yKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IElJVEVSQVRPUiA9IDQyOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPklJdGVyYXRvcjwvZW0+JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBJSVRFUkFUT1JfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgamF2YXgud3NkbC5UeXBlcyA8ZW0+SVR5cGVzPC9lbT59JyBjbGFzcy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5UeXBlcwotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldElUeXBlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBJVFlQRVMgPSA0MzsKLQotICAvKioKLSAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JVHlwZXM8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgSVRZUEVTX0ZFQVRVUkVfQ09VTlQgPSAwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCA8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQgPSA0NDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvY3VtZW50YXRpb24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBVTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEUgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRTsKLQotICAvKioKLSAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoaWxkcmVuPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBVTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU4gPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VW5rbm93biBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCA8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UID0gNDU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Eb2N1bWVudGF0aW9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBpbnQgWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCA9IEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU7Ci0KLSAgLyoqCi0gICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIGludCBYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BID0gRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0gIC8qKgotICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nIGNsYXNzLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgaW50IFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFWFRFTlNJQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UU5hbWU8L2VtPicgZGF0YSB0eXBlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgUU5BTUUgPSA0NzsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5PcGVyYXRpb24gVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLmltcGwuV1NETFBhY2thZ2VJbXBsI2dldE9wZXJhdGlvblR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgT1BFUkFUSU9OX1RZUEUgPSA0ODsKLQotICAvKioKLSAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5ET00gRWxlbWVudDwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy53M2MuZG9tLkVsZW1lbnQKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbXBsLldTRExQYWNrYWdlSW1wbCNnZXRET01FbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgaW50IERPTV9FTEVNRU5UID0gNDk7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RXhjZXB0aW9uPC9lbT4nIGRhdGEgdHlwZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0V1NETEV4Y2VwdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIGludCBXU0RMX0VYQ0VQVElPTiA9IDUwOwotCi0gIC8qKgotICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRPTSBEb2N1bWVudDwvZW0+JyBkYXRhIHR5cGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5XU0RMUGFja2FnZUltcGwjZ2V0RE9NRG9jdW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBpbnQgRE9NX0RPQ1VNRU5UID0gNTE7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFdTRExFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudCNnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpCi0gICAqIEBzZWUgI2dldFdTRExFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRXU0RMRWxlbWVudF9Eb2N1bWVudGF0aW9uRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50I2dldEVsZW1lbnQoKQotICAgKiBAc2VlICNnZXRXU0RMRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0V1NETEVsZW1lbnRfRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSA8ZW0+UG9ydCBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0UG9ydFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5RTmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNnZXRRTmFtZSgpCi0gICAqIEBzZWUgI2dldFBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9RTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmRlZmluZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjaXNVbmRlZmluZWQoKQotICAgKiBAc2VlICNnZXRQb3J0VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm94eTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNpc1Byb3h5KCkKLSAgICogQHNlZSAjZ2V0UG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFBvcnRUeXBlX1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBzZWUgI2dldFBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9SZXNvdXJjZVVSSSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUjZ2V0RU9wZXJhdGlvbnMgPGVtPkVPcGVyYXRpb25zPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FT3BlcmF0aW9uczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZSNnZXRFT3BlcmF0aW9ucygpCi0gICAqIEBzZWUgI2dldFBvcnRUeXBlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0VHlwZV9FT3BlcmF0aW9ucygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3R5bGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldFN0eWxlKCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRPcGVyYXRpb25fU3R5bGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmRlZmluZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2lzVW5kZWZpbmVkKCkKLSAgICogQHNlZSAjZ2V0T3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRPcGVyYXRpb25fVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2lzUHJveHkgPGVtPlByb3h5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJveHk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2lzUHJveHkoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9Qcm94eSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1Jlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RUlucHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFSW5wdXQoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVPdXRwdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVPdXRwdXQoKQotICAgKiBAc2VlICNnZXRPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RUZhdWx0cyA8ZW0+RUZhdWx0czwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RUZhdWx0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24jZ2V0RUZhdWx0cygpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0T3BlcmF0aW9uX0VGYXVsdHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbiNnZXRFUGFyYW1ldGVyT3JkZXJpbmcgPGVtPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVQYXJhbWV0ZXIgT3JkZXJpbmc8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uI2dldEVQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAqIEBzZWUgI2dldE9wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0TWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UU5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNnZXRRTmFtZSgpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUU5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmRlZmluZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNpc1VuZGVmaW5lZCgpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE1lc3NhZ2VfVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3h5PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjaXNQcm94eSgpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUHJveHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZSNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UjZ2V0RVBhcnRzIDxlbT5FUGFydHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVQYXJ0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlI2dldEVQYXJ0cygpCi0gICAqIEBzZWUgI2dldE1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldE1lc3NhZ2VfRVBhcnRzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQgPGVtPlBhcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFydDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRQYXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQYXJ0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldEVsZW1lbnROYW1lIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbGVtZW50IE5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFbGVtZW50TmFtZSgpCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFBhcnRfRWxlbWVudE5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRUeXBlTmFtZSgpCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFBhcnRfVHlwZU5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldFR5cGVEZWZpbml0aW9uIDxlbT5UeXBlIERlZmluaXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UeXBlIERlZmluaXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRUeXBlRGVmaW5pdGlvbigpCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFBhcnRfVHlwZURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0I2dldEVsZW1lbnREZWNsYXJhdGlvbiA8ZW0+RWxlbWVudCBEZWNsYXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVsZW1lbnQgRGVjbGFyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICAgKiBAc2VlICNnZXRQYXJ0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQYXJ0X0VsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RU1lc3NhZ2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydCNnZXRFTWVzc2FnZSgpCi0gICAqIEBzZWUgI2dldFBhcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFBhcnRfRU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyA8ZW0+QmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmcoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1FOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5kZWZpbmVkPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjaXNVbmRlZmluZWQoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1VuZGVmaW5lZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm94eTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nI2lzUHJveHkoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1Byb3h5KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgVVJJPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1Jlc291cmNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZyNnZXRFUG9ydFR5cGUgPGVtPkVQb3J0IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FUG9ydCBUeXBlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0RVBvcnRUeXBlKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ19FUG9ydFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0RUJpbmRpbmdPcGVyYXRpb25zIDxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcjZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiA8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0QmluZGluZ09wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ09wZXJhdGlvbl9OYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RU9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVPcGVyYXRpb24oKQotICAgKiBAc2VlICNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRCaW5kaW5nT3BlcmF0aW9uX0VPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nSW5wdXQgPGVtPkVCaW5kaW5nIElucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ0lucHV0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ0lucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbiNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb24jZ2V0RUJpbmRpbmdPdXRwdXQoKQotICAgKiBAc2VlICNnZXRCaW5kaW5nT3BlcmF0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nRmF1bHRzIDxlbT5FQmluZGluZyBGYXVsdHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uI2dldEVCaW5kaW5nRmF1bHRzKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FQmluZGluZ0ZhdWx0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlIDxlbT5TZXJ2aWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0U2VydmljZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UU5hbWU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNnZXRRTmFtZSgpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VfUU5hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2lzVW5kZWZpbmVkIDxlbT5VbmRlZmluZWQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmRlZmluZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNpc1VuZGVmaW5lZCgpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VfVW5kZWZpbmVkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb3h5PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjaXNQcm94eSgpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VfUHJveHkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldFNlcnZpY2VfUmVzb3VyY2VVUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2UjZ2V0RVBvcnRzIDxlbT5FUG9ydHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVQb3J0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlI2dldEVQb3J0cygpCi0gICAqIEBzZWUgI2dldFNlcnZpY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFNlcnZpY2VfRVBvcnRzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQgPGVtPlBvcnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9ydDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRQb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0I2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRQb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRQb3J0X05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0I2dldEVCaW5kaW5nIDxlbT5FQmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVCaW5kaW5nPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQjZ2V0RUJpbmRpbmcoKQotICAgKiBAc2VlICNnZXRQb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRQb3J0X0VCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVxdWlyZWQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjaXNSZXF1aXJlZCgpCi0gICAqIEBzZWUgI2dldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudF9SZXF1aXJlZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldEVsZW1lbnRUeXBlIDxlbT5FbGVtZW50IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbGVtZW50IFR5cGU8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0RWxlbWVudFR5cGUoKQotICAgKiBAc2VlICNnZXRFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiA8ZW0+RGVmaW5pdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWZpbml0aW9uPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldERlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRMb2NhdGlvbigpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldERlZmluaXRpb25fTG9jYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlFOYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0UU5hbWUoKQotICAgKiBAc2VlICNnZXREZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX1FOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFbmNvZGluZyA8ZW0+RW5jb2Rpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmNvZGluZzwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVuY29kaW5nKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9FbmNvZGluZygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFTWVzc2FnZXMgPGVtPkVNZXNzYWdlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RU1lc3NhZ2VzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RU1lc3NhZ2VzKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FTWVzc2FnZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RVBvcnRUeXBlcyA8ZW0+RVBvcnQgVHlwZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVQb3J0IFR5cGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RVBvcnRUeXBlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRVBvcnRUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFQmluZGluZ3MgPGVtPkVCaW5kaW5nczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RUJpbmRpbmdzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RUJpbmRpbmdzKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RVNlcnZpY2VzIDxlbT5FU2VydmljZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVTZXJ2aWNlczwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVTZXJ2aWNlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRVNlcnZpY2VzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVOYW1lc3BhY2VzIDxlbT5FTmFtZXNwYWNlczwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RU5hbWVzcGFjZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbiNnZXRFTmFtZXNwYWNlcygpCi0gICAqIEBzZWUgI2dldERlZmluaXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVUeXBlcyA8ZW0+RVR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RVR5cGVzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RVR5cGVzKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FVHlwZXMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24jZ2V0RUltcG9ydHMgPGVtPkVJbXBvcnRzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FSW1wb3J0czwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uI2dldEVJbXBvcnRzKCkKLSAgICogQHNlZSAjZ2V0RGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FSW1wb3J0cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQgPGVtPkltcG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbXBvcnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJbXBvcnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQjZ2V0TmFtZXNwYWNlVVJJIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQjZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICogQHNlZSAjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRJbXBvcnRfTmFtZXNwYWNlVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldExvY2F0aW9uVVJJIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbiBVUkk8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldExvY2F0aW9uVVJJKCkKLSAgICogQHNlZSAjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRJbXBvcnRfTG9jYXRpb25VUkkoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RURlZmluaXRpb248L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldEVEZWZpbml0aW9uKCkKLSAgICogQHNlZSAjZ2V0SW1wb3J0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRURlZmluaXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQjZ2V0RVNjaGVtYSA8ZW0+RVNjaGVtYTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVTY2hlbWE8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0I2dldEVTY2hlbWEoKQotICAgKiBAc2VlICNnZXRJbXBvcnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldEltcG9ydF9FU2NoZW1hKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50IDxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5zaWJsZSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRFeHRlbnNpYmxlRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cyA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50I2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgKiBAc2VlICNnZXRFeHRlbnNpYmxlRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0RXh0ZW5zaWJsZUVsZW1lbnRfRUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dCA8ZW0+SW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldE91dHB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdCA8ZW0+RmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dCA8ZW0+QmluZGluZyBJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0QmluZGluZ0lucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dCNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nSW5wdXRfTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dCNnZXRFSW5wdXQgPGVtPkVJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQjZ2V0RUlucHV0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRCaW5kaW5nSW5wdXRfRUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQgPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0TmFtZSgpCi0gICAqIEBzZWUgI2dldEJpbmRpbmdPdXRwdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldEJpbmRpbmdPdXRwdXRfTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQjZ2V0RU91dHB1dCA8ZW0+RU91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVPdXRwdXQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dCNnZXRFT3V0cHV0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ091dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVSZWZlcmVuY2UgZ2V0QmluZGluZ091dHB1dF9FT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+QmluZGluZyBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0QmluZGluZ0ZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdCNnZXROYW1lKCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ0ZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nRmF1bHRfTmFtZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdCNnZXRFRmF1bHQgPGVtPkVGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQjZ2V0RUZhdWx0KCkKLSAgICogQHNlZSAjZ2V0QmluZGluZ0ZhdWx0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRCaW5kaW5nRmF1bHRfRUZhdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZSA8ZW0+TmFtZXNwYWNlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk5hbWVzcGFjZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldE5hbWVzcGFjZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZSNnZXRVUkkgPGVtPlVSSTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVSSTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UjZ2V0VVJJKCkKLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXROYW1lc3BhY2VfVVJJKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZSNnZXRQcmVmaXgoKQotICAgKiBAc2VlICNnZXROYW1lc3BhY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQXR0cmlidXRlIGdldE5hbWVzcGFjZV9QcmVmaXgoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0VHlwZSA8ZW0+SVBvcnQgVHlwZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JUG9ydCBUeXBlPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuUG9ydFR5cGUKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuUG9ydFR5cGUiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SVBvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuT3BlcmF0aW9uIDxlbT5JT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5PcGVyYXRpb24KLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuT3BlcmF0aW9uIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5JbnB1dCA8ZW0+SUlucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLklucHV0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLklucHV0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElJbnB1dCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLk91dHB1dCA8ZW0+SU91dHB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuT3V0cHV0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLk91dHB1dCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuRmF1bHQgPGVtPklGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5GYXVsdAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5GYXVsdCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJRmF1bHQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5NZXNzYWdlIDxlbT5JTWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTWVzc2FnZTwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLk1lc3NhZ2UKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuTWVzc2FnZSIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlBhcnQgPGVtPklQYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklQYXJ0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuUGFydAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5QYXJ0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElQYXJ0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuU2VydmljZSA8ZW0+SVNlcnZpY2U8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVNlcnZpY2U8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5TZXJ2aWNlCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLlNlcnZpY2UiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SVNlcnZpY2UoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0IDxlbT5JUG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JUG9ydDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuUG9ydCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJUG9ydCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmcgPGVtPklCaW5kaW5nPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklCaW5kaW5nPC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZwotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5CaW5kaW5nIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElCaW5kaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiA8ZW0+SUJpbmRpbmcgT3BlcmF0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24KLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJQmluZGluZ09wZXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdJbnB1dCA8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuQmluZGluZ0lucHV0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElCaW5kaW5nSW5wdXQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IDxlbT5JQmluZGluZyBPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ091dHB1dAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IDxlbT5JQmluZGluZyBGYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JQmluZGluZyBGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5CaW5kaW5nRmF1bHQiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUJpbmRpbmdGYXVsdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5EZWZpbml0aW9uIDxlbT5JRGVmaW5pdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuRGVmaW5pdGlvbiIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJRGVmaW5pdGlvbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkltcG9ydCA8ZW0+SUltcG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSW1wb3J0PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuSW1wb3J0Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkltcG9ydCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJSW1wb3J0KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5JTGlzdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTGlzdDwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLnV0aWwuTGlzdAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLkxpc3QiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SUxpc3QoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLk1hcCA8ZW0+SU1hcDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JTWFwPC9lbT4nLgotICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5NYXAiIAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0SU1hcCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBqYXZhLm5ldC5VUkwgPGVtPklVUkw8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVVSTDwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLm5ldC5VUkwKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubmV0LlVSTCIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJVVJMKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeSA8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT4nLgotICAgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeQotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlcyA8ZW0+VHlwZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFR5cGVzKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5JdGVyYXRvciA8ZW0+SUl0ZXJhdG9yPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklJdGVyYXRvcjwvZW0+Jy4KLSAgICogQHNlZSBqYXZhLnV0aWwuSXRlcmF0b3IKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5JdGVyYXRvciIgCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRJSXRlcmF0b3IoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5UeXBlcyA8ZW0+SVR5cGVzPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklUeXBlczwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLlR5cGVzCi0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLlR5cGVzIiAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldElUeXBlcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFQ2xhc3MgZ2V0VW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0Q2hpbGRyZW4gPGVtPkNoaWxkcmVuPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DaGlsZHJlbjwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0Q2hpbGRyZW4oKQotICAgKiBAc2VlICNnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudF9DaGlsZHJlbigpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUNsYXNzIGdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TY2hlbWE8L2VtPicuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0U2NoZW1hKCkKLSAgICogQHNlZSAjZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFUmVmZXJlbmNlIGdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlIDxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVDbGFzcyBnZXRNZXNzYWdlUmVmZXJlbmNlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldE5hbWUoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlUmVmZXJlbmNlX05hbWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlI2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkVNZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2UjZ2V0RU1lc3NhZ2UoKQotICAgKiBAc2VlICNnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRVJlZmVyZW5jZSBnZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lIDxlbT5RTmFtZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UU5hbWU8L2VtPicuCi0gICAqIEBzZWUgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZQotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRURhdGFUeXBlIGdldFFOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZheC53c2RsLk9wZXJhdGlvblR5cGUgPGVtPk9wZXJhdGlvbiBUeXBlPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5PcGVyYXRpb24gVHlwZTwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLk9wZXJhdGlvblR5cGUKLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuT3BlcmF0aW9uVHlwZSIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRURhdGFUeXBlIGdldE9wZXJhdGlvblR5cGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy53M2MuZG9tLkVsZW1lbnQgPGVtPkRPTSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5ET00gRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcudzNjLmRvbS5FbGVtZW50Ci0gICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcudzNjLmRvbS5FbGVtZW50IgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBFRGF0YVR5cGUgZ2V0RE9NRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIDxlbT5FeGNlcHRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkV4Y2VwdGlvbjwvZW0+Jy4KLSAgICogQHNlZSBqYXZheC53c2RsLldTRExFeGNlcHRpb24KLSAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmF4LndzZGwuV1NETEV4Y2VwdGlvbiIKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgRURhdGFUeXBlIGdldFdTRExFeGNlcHRpb24oKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy53M2MuZG9tLkRvY3VtZW50IDxlbT5ET00gRG9jdW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRPTSBEb2N1bWVudDwvZW0+Jy4KLSAgICogQHNlZSBvcmcudzNjLmRvbS5Eb2N1bWVudAotICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLnczYy5kb20uRG9jdW1lbnQiCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIEVEYXRhVHlwZSBnZXRET01Eb2N1bWVudCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBXU0RMRmFjdG9yeSBnZXRXU0RMRmFjdG9yeSgpOwotCi19IC8vV1NETFBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTg4ZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9XU0RMUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eS5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZXh0ZW5zaWJpbGl0eS5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ai5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLQotCi0vKioKLSAqIFRoZSA8Yj5QbHVnaW48L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBUaGUgV1NETCBtb2RlbCBuZWVkcyB0byBiZSBhYmxlIHRvIHJ1biB3aXRoaW4gYW4gRWNsaXBzZSB3b3JrYmVuY2gsCi0gKiB3aXRoaW4gYSBoZWFkbGVzcyBFY2xpcHNlIHdvcmtzcGFjZSwgb3IganVzdCBzdGFuZC1hbG9uZSBhcyBwYXJ0IAotICogb2Ygc29tZSBvdGhlciBhcHBsaWNhdGlvbi4KLSAqIFRvIHN1cHBvcnQgdGhpcywgYWxsIGFjY2VzcyBpcyBkaXJlY3RlZCB0byB0aGUgc3RhdGljIG1ldGhvZHMsCi0gKiB3aGljaCBjYW4gcmVkaXJlY3QgdGhlIHNlcnZpY2UgYXMgYXBwb3ByaWF0ZSB0byB0aGUgcnVudGltZS4KLSAqIER1cmluZyBzdGFuZC1hbG9uZSBpbnZvY2F0aW9uIG5vIHBsdWdpbiBpbml0aWFsaXphdGlvbiB0YWtlcyBwbGFjZS4KLSAqIEluIHRoaXMgY2FzZSB5b3Ugd2lsbCBuZWVkIHRoZSByZXNvdXJjZXMgamFyIG9uIHRoZSBjbGFzcyBwYXRoLgotICogQHNlZSAjZ2V0QmFzZVVSTAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETFBsdWdpbiBleHRlbmRzIEVNRlBsdWdpbiAKLXsKLSAgLyoqCi0gICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBsdWdpbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgV1NETFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBXU0RMUGx1Z2luKCk7Ci0KLSAgLyoqCi0gICAqIFRoZSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICovCi0gIHN0YXRpYyBXU0RMUGx1Z2luSW1wbGVtZW50YXRpb24gcGx1Z2luOwotICAKLSAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KLSAgICovCi0gIHByaXZhdGUgV1NETFBsdWdpbigpCi0gIHsKLSAgICBzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotICB9Ci0KLSAgLyoKLSAgICogSmF2YWRvYyBjb3BpZWQgZnJvbSBiYXNlIGNsYXNzLgotICAgKi8KLSAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKQotICB7Ci0gICAgcmV0dXJuIHBsdWdpbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLgotICAgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExQbHVnaW5JbXBsZW1lbnRhdGlvbiBnZXRQbHVnaW4oKQotICB7Ci0gICAgcmV0dXJuIHBsdWdpbjsKLSAgfQotCi0gIHByaXZhdGUgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsIGludGVybmFsR2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkoKQotICB7Ci0gICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5ID09IG51bGwpCi0gICAgewotICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkgPSBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsKCk7Ci0gICAgICBpZiAocGx1Z2luICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgbmV3IEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKGV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5KS5yZWFkUmVnaXN0cnkoKTsKLSAgICAgIH0gIAotICAgIH0KLSAgICByZXR1cm4gZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZXR1cm4gaW50ZXJuYWxHZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeShuYW1lc3BhY2UpOwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkoKQotICB7ICAgCi0gICAgcmV0dXJuIGludGVybmFsR2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkoKTsKLSAgfQotICAKLSAgcHVibGljIFdTRExGYWN0b3J5IGNyZWF0ZVdTREw0SkZhY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMRmFjdG9yeUltcGwoKTsgICAJCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBsdWdpbkltcGxlbWVudGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1dTRExQbHVnaW5JbXBsZW1lbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzQyOWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvV1NETFBsdWdpbkltcGxlbWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luLkVjbGlwc2VQbHVnaW47Ci0KLS8qKgotICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uCi0gICAqLwotICBwdWJsaWMgY2xhc3MgV1NETFBsdWdpbkltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbgotICB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBsdWdpbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgV1NETFBsdWdpbkltcGxlbWVudGF0aW9uKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gICAgewotICAgICAgc3VwZXIoZGVzY3JpcHRvcik7Ci0KLSAgICAgIC8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0gICAgICAvLwotICAgICAgV1NETFBsdWdpbi5wbHVnaW4gPSB0aGlzOwotICAgIH0KLSAgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYjY2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL1hTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZSNnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiBAc2VlICNzZXRTY2hlbWEoWFNEU2NoZW1hKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UjZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRfU2NoZW1hKCkKLSAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBYU0RTY2hlbWEgZ2V0U2NoZW1hKCk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldFNjaGVtYSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSB2YWx1ZSk7Ci0KLX0gLy8gWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBiNzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0xPQURJTkdfRVJST1IgPSAiQ0xBU1NfTE9BRElOR19FUlJPUiI7Ci0gIAotICBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsgIAotICBwcm90ZWN0ZWQgT2JqZWN0IGZhY3Rvcnk7Ci0KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpCi0gIHsKLSAgICB0aGlzLmNsYXNzTG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGdldEV4dGVuc2libGl0eUVsZW1lbnRGYWN0b3J5KCkKLSAgewotICAgIGlmIChmYWN0b3J5ID09IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDogQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICBmYWN0b3J5ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSl0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBmYWN0b3J5ID0gQ0xBU1NfTE9BRElOR19FUlJPUjsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3RvcnkgIT0gQ0xBU1NfTE9BRElOR19FUlJPUiA/IChFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkpZmFjdG9yeSA6IG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2libGl0eUVsZW1lbnRGYWN0b3J5KEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBmYWN0b3J5KQotICB7Ci0gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiYzAxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmV4dGVuc2liaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0KLQotcHVibGljIGNsYXNzIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIG5hbWVzcGFjZSwgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICB7Ci0gICAgbWFwLnB1dChuYW1lc3BhY2UsIGRlc2NyaXB0b3IpOwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IHJlc3VsdCA9IG51bGw7Ci0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IpbWFwLmdldChuYW1lc3BhY2UpOwotICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVzY3JpcHRvci5nZXRFeHRlbnNpYmxpdHlFbGVtZW50RmFjdG9yeSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCByZWdpc3RlckZhY3RvcnkoU3RyaW5nIG5hbWVzcGFjZSwgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGZhY3RvcnkpCi0gIHsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5RGVzY3JpcHRvcihudWxsLG5hbWVzcGFjZSxudWxsKTsKLSAgICBkZXNjcmlwdG9yLnNldEV4dGVuc2libGl0eUVsZW1lbnRGYWN0b3J5KGZhY3RvcnkpOwotICAgIG1hcC5wdXQobmFtZXNwYWNlLGRlc2NyaXB0b3IpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2V4dGVuc2liaWxpdHkvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGM1NDA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZXh0ZW5zaWJpbGl0eS9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5leHRlbnNpYmlsaXR5OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlcgotewotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBXU0RMUGx1Z2luLmdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcmllcyI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTkFNRSA9ICJleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7Ci0gIHByb3RlY3RlZCBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeUltcGwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5SW1wbCBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSkKLSAgewotICAgIHRoaXMuZXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkgPSBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeTsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJUGx1Z2luUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLSAgICBpZiAocG9pbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZShVUkwgcGxhdGZvcm1VUkwsIFN0cmluZyByZWxhdGl2ZVBhdGgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFVSTCByZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUocGxhdGZvcm1VUkwpOwotICAgIHJldHVybiByZXNvbHZlZFVSTC50b1N0cmluZygpICsgcmVsYXRpdmVQYXRoOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfTkFNRSkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZEVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50OwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NzTG9hZGVyID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlEZXNjcmlwdG9yKGNsYXNzTmFtZSxuYW1lc3BhY2UscGx1Z2luQ2xhc3NzTG9hZGVyKTsKLSAgICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeS5wdXQobmFtZXNwYWNlLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL0Jhc2VHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL0Jhc2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0NzdlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9CYXNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlR2VuZXJhdG9yIHsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHJlZk5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZTsKLQlwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotCXByb3RlY3RlZCBDb250ZW50R2VuZXJhdG9yIGNvbnRlbnRHZW5lcmF0b3I7Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0Q29udGVudEdlbmVyYXRvcihDb250ZW50R2VuZXJhdG9yIGdlbmVyYXRvcikgewotCQljb250ZW50R2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgQ29udGVudEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gY29udGVudEdlbmVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBvdmVyd3JpdGUpIHsKLQkJdGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGdldE92ZXJ3cml0ZSgpIHsKLQkJcmV0dXJuIG92ZXJ3cml0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRSZWZOYW1lKFN0cmluZyByZWZOYW1lKSB7Ci0JCXRoaXMucmVmTmFtZSA9IHJlZk5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZSgpIHsKLQkJcmV0dXJuIHJlZk5hbWU7Ci0JfQotCQotCXB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oKSB7Ci0JCXJldHVybiBkZWZpbml0aW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgewotCQlpZiAoY29udGVudEdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudEdlbmVyYXRvci5nZXRQcm90b2NvbCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9CaW5kaW5nR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9CaW5kaW5nR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDE0MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvQmluZGluZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLmV4dGVuc2lvbi5Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5OwotCi0vKgotICogQ2xhc3MgdXNlZCB0byBnZW5lcmF0ZSB0aGUgQmluZGluZyBhbmQgaXQncyBjb250ZW50LiAgV2UgbG9vayBpbiB0aGUgcmVnaXN0cnkgZm9yCi0gKiBhcHByb3ByaWF0ZSBDb250ZW50R2VuZXJhdG9yIGNsYXNzZXMgYmFzZWQgb24gdGhlIGV4aXN0aW5nIEJpbmRpbmcgQ29udGVudCdzIG5hbWVzcGFjZS4KLSAqIEFsdGVybmF0aXZlbHksIHVzZXJzIGNhbiBwYXNzIGluIGEgbmFtZXNwYWNlIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9yIHRvIHNwZWNpZnkgd2hpY2gKLSAqIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBzZWFyY2hpbmcgdGhlIHJlZ2lzdHJ5LgotICogCi0gKiBUaGUgQ29udGVudEdlbmVyYXRvciBtYXkgYWxzbyBiZSBzZXQgbWFudWFsbHkgYnkgY2FsbGluZwotICogc2V0Q29udGVudEdlbmVyYXRvcihDb250ZW50R2VuZXJhdG9yKS4KLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdHZW5lcmF0b3IgZXh0ZW5kcyBCYXNlR2VuZXJhdG9yIHsKLQlwcml2YXRlIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JcHJpdmF0ZSBCaW5kaW5nIGJpbmRpbmc7Ci0KLQkvKgotCSAqIFdoZW4gdGhlIGNvbnN0cnVjdG9yIGlzIHVzZWQsIGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byByZXRyaWV2ZSBhIHByb3BlcgotCSAqIENvbnRlbnRHZW5lcmF0b3IgYmFzZWQgb24gdGhlIEJpbmRpbmcgZ2l2ZW4uICBUaGUgQ29udGVudEdlbmVyYXRvciBtYXkKLQkgKiBiZSByZXBsYWNlZCBieSBjYWxsaW5nIHNldENvbnRlbnRHZW5lcmF0b3IoQ29udGVudEdlbmVyYXRvcikuCi0JICovCi0JcHVibGljIEJpbmRpbmdHZW5lcmF0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBCaW5kaW5nIGJpbmRpbmcpIHsJCi0JCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0JCWNvbnRlbnRHZW5lcmF0b3IgPSBnZXRDb250ZW50R2VuZXJhdG9yKGJpbmRpbmcpOwotCX0KLQotCS8qCi0JICogV2hlbiB0aGUgY29uc3RydWN0b3IgaXMgdXNlZCwgYXV0b21hdGljYWxseSBhdHRlbXB0IHRvIHJldHJpZXZlIGEgcHJvcGVyCi0JICogQ29udGVudEdlbmVyYXRvciBiYXNlZCBvbiB0aGUgbmFtZXNwYWNlIGdpdmVuLiAgVGhlIENvbnRlbnRHZW5lcmF0b3IgbWF5Ci0JICogYmUgcmVwbGFjZWQgYnkgY2FsbGluZyBzZXRDb250ZW50R2VuZXJhdG9yKENvbnRlbnRHZW5lcmF0b3IpLgotCSAqLwotCXB1YmxpYyBCaW5kaW5nR2VuZXJhdG9yKERlZmluaXRpb24gZGVmaW5pdGlvbiwgQmluZGluZyBiaW5kaW5nLCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXRoaXMuZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0JCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7Ci0JCWNvbnRlbnRHZW5lcmF0b3IgPSBnZXRDb250ZW50R2VuZXJhdG9yKG5hbWVzcGFjZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50R2VuZXJhdG9yIGdldENvbnRlbnRHZW5lcmF0b3IoQmluZGluZyBiaW5kaW5nKSB7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJICogRmluZCB0aGUgcmVnZWlzdGVyZWQgQ29udGVudCBHZW5lcmF0b3IgZm9yIHRoZSBCaW5kaW5nCi0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCS8vIEdldCBCaW5kaW5nQ29udGVudCBuYW1lc3BhY2UKLQkJU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0JCUxpc3QgZWVMaXN0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0JCWlmIChlZUxpc3Quc2l6ZSgpID4gMCkgewotCSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWUgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVlTGlzdC5nZXQoMCk7CQkJCi0JCQkvLyBUT0RPOiBRTmFtZSBxTmFtZSA9IGVlLmdldEVsZW1lbnRUeXBlKCk7IGdvIGdldCB0aGUgbmFtZXNwYWNlIGluc3RlYWQ/Ci0JICAgICAgICBuYW1lc3BhY2UgPSBlZS5nZXRFbGVtZW50KCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlyZXR1cm4gZ2V0Q29udGVudEdlbmVyYXRvcihuYW1lc3BhY2UpOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbnRlbnRHZW5lcmF0b3IgZ2V0Q29udGVudEdlbmVyYXRvcihTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCUNvbnRlbnRHZW5lcmF0b3IgY29udGVudEdlbiA9IG51bGw7Ci0JCWlmIChuYW1lc3BhY2UgIT0gbnVsbCkgewotCQkJQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7IAotCQkJY29udGVudEdlbiA9IGZhY3RvcnlSZWdpc3RyeS5nZXRHZW5lcmF0b3JDbGFzc0Zyb21OYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvbnRlbnRHZW47CQkKLQl9Ci0JCi0JcHJpdmF0ZSBCaW5kaW5nIGNyZWF0ZUVtcHR5QmluZGluZyhTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCVN0cmluZyBuYW1lID0gbG9jYWxOYW1lOwotCQlpZiAobG9jYWxOYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSAiIjsKLQkJfQotCSAgICBCaW5kaW5nIG5ld0JpbmRpbmcgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZygpOwotCQluZXdCaW5kaW5nLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLGxvY2FsTmFtZSkpOwotCQluZXdCaW5kaW5nLnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0JICAgIGRlZmluaXRpb24uYWRkQmluZGluZyhuZXdCaW5kaW5nKTsKLQkJCi0JCXJldHVybiBuZXdCaW5kaW5nOwotCX0KLQkKLQlwdWJsaWMgQmluZGluZyBnZW5lcmF0ZUJpbmRpbmcoKSB7Ci0JCXRyeSB7Ci0JCS8vIElmIEJpbmRpbmcgaXMgbnVsbCAoTm8gQmluZGluZyB3YXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yKSwgd2UgY3JlYXRlIGFuIGVtcHR5IEJpbmRpbmcgZmlyc3QuCi0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCWJpbmRpbmcgPSBjcmVhdGVFbXB0eUJpbmRpbmcoZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCWJpbmRpbmcuc2V0UU5hbWUobmV3IFFOYW1lKGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwgZ2V0TmFtZSgpKSk7Ci0JCX0KLQkJaWYgKGdldFJlZk5hbWUoKSAhPSBudWxsKSB7Ci0JCQlQb3J0VHlwZSBwb3J0VHlwZSA9IGdldFBvcnRUeXBlKCk7Ci0JCQliaW5kaW5nLnNldEVQb3J0VHlwZShwb3J0VHlwZSk7Ci0JCQlpZiAocG9ydFR5cGUgPT0gbnVsbCkgewotCQkJCS8vVGhlIG1vZGVsIGRvZXNuJ3QgcmVjb25pbGUgd2l0aCBpdCdzIEVsZW1lbnQgcHJvcGVybHkgd2hlbiB3ZSdyZSBzZXR0aW5nIGEgbnVsbCBmb3IgaXQncyBQb3J0VHlwZQotCQkJCWJpbmRpbmcuZ2V0RWxlbWVudCgpLnNldEF0dHJpYnV0ZSgidHlwZSIsICIiKTsKLQkJCX0KLQkJfQotCQkKLQkJTGlzdCBiaW5kaW5nT3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCk7CQkKLQkJUG9ydFR5cGUgcG9ydFR5cGUgPSBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotCQlpZiAocG9ydFR5cGUgPT0gbnVsbCkgewotCQkJLy8gV2UgbmVlZCB0byBibG93IGF3YXkgZXZlcnl0aGluZyB1bmRlciB0aGUgQmluZGluZy4gIE5vIFBvcnRUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJpbmRpbmcKLQkJCWJpbmRpbmdPcGVyYXRpb25zLmNsZWFyKCk7Ci0JCQlyZXR1cm4gYmluZGluZzsKLQkJfQotCQkKLQkJYWRkUmVxdWlyZWROYW1lc3BhY2VzKGJpbmRpbmcpOwotCQkKLQkJTGlzdCBvcGVyYXRpb25zID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpOwotCQkKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiBDb21wYXJlIHRoZSBPcGVyYXRpb25zCi0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCS8vIFJlbW92ZSBhbnkgQmluZGluZ09wZXJhdGlvbnMgd2hpY2ggYXJlIG5vIGxvbmdlciB1c2VkCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBiaW5kaW5nT3BlcmF0aW9ucy5zaXplKCk7IGluZGV4KyspIHsKLQkJCUJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BlcmF0aW9ucy5nZXQoaW5kZXgpOwotCQkJCi0JCQlib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKLQkJCUl0ZXJhdG9yIG9wZXJhdGlvbnNJdCA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChvcGVyYXRpb25zSXQuaGFzTmV4dCgpKSB7Ci0JCQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pIG9wZXJhdGlvbnNJdC5uZXh0KCk7Ci0JCQkJCi0JCQkJaWYgKG5hbWVzRXF1YWwoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCksIG9wZXJhdGlvbi5nZXROYW1lKCkpKSB7Ci0JCQkJCWZvdW5kTWF0Y2ggPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghZm91bmRNYXRjaCl7Ci0JCQkJLy8gV2UgbmVlZCB0byByZW1vdmUgdGhpcyBCaW5kaW5nRmF1bHQgZnJvbSB0aGUgYmluZGluZ0ZhdWx0cyBMaXN0Ci0JCQkJYmluZGluZ09wZXJhdGlvbnMucmVtb3ZlKGluZGV4KTsKLQkJCQlpbmRleC0tOwotCQkJfQkJCQotCQl9Ci0JCQotCQkvLyBSZW1vdmUgYW55IE9wZXJhdGlvbnMgd2hpY2ggYWxyZWFkeSBleGlzdHMgaW4gYmluZGluZ09wZXJhdGlvbnMuICBXaGF0IHdlCi0JCS8vIGhhdmUgbGVmdCBhcmUgdGhlIE9wZXJhdGlvbnMgd2hpY2ggbmVlZHMgbmV3bHkgY3JlYXRlZCBCaW5kaW5nT3BlcmF0aW9ucwotCQlMaXN0IGJpbmRpbmdPcGVyYXRpb25zTmVlZGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgb3BlcmF0aW9ucy5zaXplKCk7IGluZGV4KyspIHsKLQkJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldChpbmRleCk7Ci0JCQkKLQkJCWJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJSXRlcmF0b3IgYmluZGluZ09wZXJhdGlvbnNJdCA9IGJpbmRpbmdPcGVyYXRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYmluZGluZ09wZXJhdGlvbnNJdC5oYXNOZXh0KCkpIHsKLQkJCQlCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ09wZXJhdGlvbnNJdC5uZXh0KCk7Ci0JCQkJCi0JCQkJaWYgKG5hbWVzRXF1YWwoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCksIG9wZXJhdGlvbi5nZXROYW1lKCkpKSB7Ci0JCQkJCWZvdW5kTWF0Y2ggPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghZm91bmRNYXRjaCl7Ci0JCQkJLy8gV2UgbmVlZCB0byByZW1vdmUgdGhpcyBCaW5kaW5nRmF1bHQgZnJvbSB0aGUgYmluZGluZ0ZhdWx0cyBMaXN0Ci0JCQkJYmluZGluZ09wZXJhdGlvbnNOZWVkZWQuYWRkKG9wZXJhdGlvbik7IC8vIFN0b3JlIHRoZSBhY3R1YWwgT3BlcmF0aW9uCi0JCQl9CQkJCi0JCX0JCQotCQkKLQkJLy8gYmluZGluZ0ZhdWx0c05lZWRlZCBjb250YWlucyB0aGUgbmVlZGVkIEJpbmRpbmdGYXVsdCdzIHdlIG5lZWQgdG8gY3JlYXRlCi0JCUl0ZXJhdG9yIG5lZWRlZEJpbmRpbmdPcGVyYXRpb25zSXQgPSBiaW5kaW5nT3BlcmF0aW9uc05lZWRlZC5pdGVyYXRvcigpOwotCQl3aGlsZSAobmVlZGVkQmluZGluZ09wZXJhdGlvbnNJdC5oYXNOZXh0KCkpIHsKLQkJCU9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBuZWVkZWRCaW5kaW5nT3BlcmF0aW9uc0l0Lm5leHQoKTsKLQkJCUJpbmRpbmdPcGVyYXRpb24gbmV3QmluZGluZ09wZXJhdGlvbiA9IGZhY3RvcnkuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotCQkJbmV3QmluZGluZ09wZXJhdGlvbi5zZXRFT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0JCQluZXdCaW5kaW5nT3BlcmF0aW9uLnNldE5hbWUob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0JCQliaW5kaW5nLmFkZEJpbmRpbmdPcGVyYXRpb24obmV3QmluZGluZ09wZXJhdGlvbik7Ci0JCX0KLQotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCSAqIFByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBPcGVyYXRpb25zCi0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCUl0ZXJhdG9yIGJpbmRpbmdPcGVyYXRpb25zSXQgPSBiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChiaW5kaW5nT3BlcmF0aW9uc0l0Lmhhc05leHQoKSkgewotCQkJZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BlcmF0aW9uc0l0Lm5leHQoKSk7Ci0JCX0KLQkJCi0JCWdlbmVyYXRlQmluZGluZ0NvbnRlbnQoYmluZGluZyk7Ci0JCQotCQlyZXR1cm4gYmluZGluZzsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikgewotCQlCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCk7Ci0JCUJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLQkJTGlzdCBiaW5kaW5nRmF1bHRzID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpOwotCQkKLQkJT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpOwotCQlJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLQkJT3V0cHV0IG91dHB1dCA9IG9wZXJhdGlvbi5nZXRFT3V0cHV0KCk7Ci0JCUxpc3QgZmF1bHRzID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKTsKLQotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCSAqIENvbXBhcmUgdGhlIE9wZXJhdGlvbiBuYW1lcwotCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkJCi0JCWlmICghbmFtZXNFcXVhbChiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSwgb3BlcmF0aW9uLmdldE5hbWUoKSkpIHsKLQkJCWJpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJICogQ29tcGFyZSB0aGUgT3V0cHV0Ci0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCWlmIChvdXRwdXQgPT0gbnVsbCkgewotCQkJYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nT3V0cHV0KG51bGwpOwkJCQotCQl9Ci0JCWVsc2UgewotCQkJLy8gQ3JlYXRlIEJpbmRpbmdPdXRwdXQgaWYgbmVjZXNzYXJ5Ci0JCQlpZiAoYmluZGluZ091dHB1dCA9PSBudWxsKSB7Ci0JCQkJQmluZGluZ091dHB1dCBuZXdCaW5kaW5nT3V0cHV0ID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0JCQkJbmV3QmluZGluZ091dHB1dC5zZXRFT3V0cHV0KG91dHB1dCk7Ci0JCQkJbmV3QmluZGluZ091dHB1dC5zZXROYW1lKG91dHB1dC5nZXROYW1lKCkpOwotCQkJCWJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChuZXdCaW5kaW5nT3V0cHV0KTsJCQkJCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBDb21wYXJlIHRoZSBPdXRwdXQgbmFtZXMKLQkJCQlpZiAoIW5hbWVzRXF1YWwoYmluZGluZ091dHB1dC5nZXROYW1lKCksIG91dHB1dC5nZXROYW1lKCkpKSB7Ci0JCQkJCWJpbmRpbmdPdXRwdXQuc2V0TmFtZShvdXRwdXQuZ2V0TmFtZSgpKTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCWdlbmVyYXRlQmluZGluZ091dHB1dENvbnRlbnQoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ091dHB1dCgpKTsKLQkJCi0JCQotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCSAqIENvbXBhcmUgdGhlIElucHV0Ci0JCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCWlmIChpbnB1dCA9PSBudWxsKSB7Ci0JCQliaW5kaW5nT3BlcmF0aW9uLnNldEJpbmRpbmdJbnB1dChudWxsKTsJCQkKLQkJfQotCQllbHNlIHsKLQkJCS8vIENyZWF0ZSBCaW5kaW5nSW5wdXQgaWYgbmVjZXNzYXJ5Ci0JCQlpZiAoYmluZGluZ0lucHV0ID09IG51bGwpIHsKLQkJCQlCaW5kaW5nSW5wdXQgbmV3QmluZGluZ0lucHV0ID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLQkJCQluZXdCaW5kaW5nSW5wdXQuc2V0RUlucHV0KGlucHV0KTsKLQkJCQluZXdCaW5kaW5nSW5wdXQuc2V0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCQkJCWJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KG5ld0JpbmRpbmdJbnB1dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBDb21wYXJlIHRoZSBJbnB1dCBuYW1lcwotCQkJCWlmICghbmFtZXNFcXVhbChiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpLCBpbnB1dC5nZXROYW1lKCkpKSB7Ci0JCQkJCWJpbmRpbmdJbnB1dC5zZXROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWdlbmVyYXRlQmluZGluZ0lucHV0Q29udGVudChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKSk7Ci0JCQotCQkKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiBDb21wYXJlIHRoZSBGYXVsdHMKLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJLy8gUmVtb3ZlIGFueSBCaW5kaW5nRmF1bHRzIHdoaWNoIGFyZSBubyBsb25nZXIgdXNlZAotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgYmluZGluZ0ZhdWx0cy5zaXplKCk7IGluZGV4KyspIHsKLQkJCUJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBiaW5kaW5nRmF1bHRzLmdldChpbmRleCk7Ci0JCQkKLQkJCWJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJSXRlcmF0b3IgZmF1bHRzSXQgPSBmYXVsdHMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChmYXVsdHNJdC5oYXNOZXh0KCkpIHsKLQkJCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgZmF1bHRzSXQubmV4dCgpOwotCQkJCWlmIChuYW1lc0VxdWFsKGJpbmRpbmdGYXVsdC5nZXROYW1lKCksIGZhdWx0LmdldE5hbWUoKSkpIHsKLQkJCQkJZm91bmRNYXRjaCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKCFmb3VuZE1hdGNoKXsKLQkJCQkvLyBXZSBuZWVkIHRvIHJlbW92ZSB0aGlzIEJpbmRpbmdGYXVsdCBmcm9tIHRoZSBiaW5kaW5nRmF1bHRzIExpc3QKLQkJCQliaW5kaW5nRmF1bHRzLnJlbW92ZShpbmRleCk7Ci0JCQkJaW5kZXgtLTsKLQkJCX0JCQkKLQkJfQotCQkKLQkJLy8gUmVtb3ZlIGFueSBGYXVsdHMgd2hpY2ggYWxyZWFkeSBleGlzdHMgaW4gYmluZGluZ0ZhdWx0cy4gIFdoYXQgd2UKLQkJLy8gaGF2ZSBsZWZ0IGFyZSB0aGUgRmF1bHRzIHdoaWNoIG5lZWRzIG5ld2x5IGNyZWF0ZWQgQmluZGluZ0ZhdWx0cwotCQlMaXN0IGJpbmRpbmdGYXVsdHNOZWVkZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBmYXVsdHMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0JCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgZmF1bHRzLmdldChpbmRleCk7Ci0JCQkKLQkJCWJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJSXRlcmF0b3IgYmluZGluZ0ZhdWx0c0l0ID0gYmluZGluZ0ZhdWx0cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGJpbmRpbmdGYXVsdHNJdC5oYXNOZXh0KCkpIHsKLQkJCQlCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgYmluZGluZ0ZhdWx0c0l0Lm5leHQoKTsKLQkJCQlpZiAobmFtZXNFcXVhbChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBmYXVsdC5nZXROYW1lKCkpKSB7Ci0JCQkJCWZvdW5kTWF0Y2ggPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghZm91bmRNYXRjaCl7Ci0JCQkJLy8gV2UgbmVlZCB0byByZW1vdmUgdGhpcyBCaW5kaW5nRmF1bHQgZnJvbSB0aGUgYmluZGluZ0ZhdWx0cyBMaXN0Ci0JCQkJYmluZGluZ0ZhdWx0c05lZWRlZC5hZGQoZmF1bHQpOwotCQkJfQkJCQotCQl9CQkKLQkJCi0JCS8vIGJpbmRpbmdGYXVsdHNOZWVkZWQgY29udGFpbnMgdGhlIG5lZWRlZCBCaW5kaW5nRmF1bHQncyB3ZSBuZWVkIHRvIGNyZWF0ZQotCQlJdGVyYXRvciBuZWVkZWRCaW5kaW5nRmF1bHRzSXQgPSBiaW5kaW5nRmF1bHRzTmVlZGVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChuZWVkZWRCaW5kaW5nRmF1bHRzSXQuaGFzTmV4dCgpKSB7Ci0JCQlGYXVsdCBmYXVsdCA9IChGYXVsdCkgbmVlZGVkQmluZGluZ0ZhdWx0c0l0Lm5leHQoKTsKLQkJCUJpbmRpbmdGYXVsdCBuZXdCaW5kaW5nRmF1bHQgPSBmYWN0b3J5LmNyZWF0ZUJpbmRpbmdGYXVsdCgpOwotCQkJbmV3QmluZGluZ0ZhdWx0LnNldEVGYXVsdChmYXVsdCk7Ci0JCQluZXdCaW5kaW5nRmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotCQkJYmluZGluZ09wZXJhdGlvbi5hZGRCaW5kaW5nRmF1bHQobmV3QmluZGluZ0ZhdWx0KTsKLQkJfQotCQkKLQkJLy8gQ3JlYXRlIHRoZSBjb250ZW50cyBmb3IgZWFjaCBCaW5kaW5nRmF1bHQKLQkJSXRlcmF0b3IgZmF1bHRDb250ZW50SXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nRmF1bHRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGZhdWx0Q29udGVudEl0Lmhhc05leHQoKSkgewotCQkJQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpIGZhdWx0Q29udGVudEl0Lm5leHQoKTsKLQkJCWdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChiaW5kaW5nRmF1bHQpOwotCQl9Ci0JCQotCQlnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KGJpbmRpbmdPcGVyYXRpb24pOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbmFtZXNFcXVhbChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQotCQlpZiAobmFtZTEgIT0gbnVsbCBeIG5hbWUyICE9IG51bGwpIHsKLQkJCS8vIG9uZSBpcyBudWxsCi0JCQltYXRjaCA9IGZhbHNlOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWUxICE9IG51bGwgJiYgbmFtZTIgIT0gbnVsbCkgewotCQkJLy8gbmVpdGhlciBpcyBudWxsCi0JCQltYXRjaCA9IG5hbWUxLmVxdWFscyhuYW1lMik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBib3RoIGFyZSBudWxsCi0JCQltYXRjaCA9IHRydWU7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIG1hdGNoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQmluZGluZ0NvbnRlbnQoQmluZGluZyBiaW5kaW5nKSB7Ci0JCWlmIChjb250ZW50R2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCWNvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nQ29udGVudChiaW5kaW5nLCAoUG9ydFR5cGUpIGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKGJpbmRpbmcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uQ29udGVudChCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pIHsKLQkJaWYgKGJpbmRpbmdPcGVyYXRpb24gIT0gbnVsbCAmJiBjb250ZW50R2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCWNvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nT3BlcmF0aW9uQ29udGVudChiaW5kaW5nT3BlcmF0aW9uLCBiaW5kaW5nT3BlcmF0aW9uLmdldEVPcGVyYXRpb24oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudHMoYmluZGluZ09wZXJhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVCaW5kaW5nSW5wdXRDb250ZW50KEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQpIHsKLQkJaWYgKGJpbmRpbmdJbnB1dCAhPSBudWxsICYmIGNvbnRlbnRHZW5lcmF0b3IgIT0gbnVsbCkgewotCQkJY29udGVudEdlbmVyYXRvci5nZW5lcmF0ZUJpbmRpbmdJbnB1dENvbnRlbnQoYmluZGluZ0lucHV0LCBiaW5kaW5nSW5wdXQuZ2V0RUlucHV0KCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKGJpbmRpbmdJbnB1dCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpIHsKLQkJaWYgKGJpbmRpbmdPdXRwdXQgIT0gbnVsbCAmJiBjb250ZW50R2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCWNvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChiaW5kaW5nT3V0cHV0LCBiaW5kaW5nT3V0cHV0LmdldEVPdXRwdXQoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudHMoYmluZGluZ091dHB1dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUJpbmRpbmdGYXVsdENvbnRlbnQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCkgewotCQlpZiAoYmluZGluZ0ZhdWx0ICE9IG51bGwgJiYgY29udGVudEdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQljb250ZW50R2VuZXJhdG9yLmdlbmVyYXRlQmluZGluZ0ZhdWx0Q29udGVudChiaW5kaW5nRmF1bHQsIGJpbmRpbmdGYXVsdC5nZXRFRmF1bHQoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVFeHRlbnNpYmlsaXR5RWxlbWVudHMoYmluZGluZ0ZhdWx0KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKEV4dGVuc2libGVFbGVtZW50IGVlKSB7Ci0JCWVlLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotCX0KLQkKLQkvKgotCSAqIEdlbmVyYXRlIFBvcnQgQ29udGVudCBmb3IgYWxsIFBvcnRzIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIEJpbmRpbmcKLQkgKiB3aGljaCB3YXMgcGFzc2VkIGluIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9yIChvciBhIHJlZmVyZW5jZSB0byB0aGUKLQkgKiBuZXdseSBjcmVhdGVkIEJpbmRpbmcpLgotCSAqLwotCXB1YmxpYyB2b2lkIGdlbmVyYXRlUG9ydENvbnRlbnQoKSB7Ci0JCWlmIChiaW5kaW5nICE9IG51bGwgJiYgY29udGVudEdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQlMaXN0IHBvcnRzVG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkKLQkJCUl0ZXJhdG9yIHNlcnZpY2VzSXQgPSBiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXRFU2VydmljZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHNlcnZpY2VzSXQuaGFzTmV4dCgpKSB7Ci0JCQkJU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VzSXQubmV4dCgpOwotCQkJCUl0ZXJhdG9yIHBvcnRzSXQgPSBzZXJ2aWNlLmdldEVQb3J0cygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKHBvcnRzSXQuaGFzTmV4dCgpKSB7Ci0JCQkJCVBvcnQgcG9ydCA9IChQb3J0KSBwb3J0c0l0Lm5leHQoKTsKLQkJCQkJaWYgKGJpbmRpbmcuZXF1YWxzKHBvcnQuZ2V0RUJpbmRpbmcoKSkpIHsKLQkJCQkJCS8vIEZvdW5kIGEgbWF0Y2gKLQkJCQkJCXBvcnRzVG9VcGRhdGUuYWRkKHBvcnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlJdGVyYXRvciBwb3J0c1RvVXBkYXRlSXQgPSBwb3J0c1RvVXBkYXRlLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAocG9ydHNUb1VwZGF0ZUl0Lmhhc05leHQoKSkgewotCQkJCWNvbnRlbnRHZW5lcmF0b3IuZ2VuZXJhdGVQb3J0Q29udGVudCgoUG9ydCkgcG9ydHNUb1VwZGF0ZUl0Lm5leHQoKSk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCS8qCi0JICogbWV0aG9kcyBhZGRSZXF1aXJlZE5hbWVzcGFjZXMoKSBhbmQgY29tcHV0ZVVuaXF1ZVByZWZpeCgpIGFyZSB1c2VkIHRvIGFkZCBuZWNlc3NhcnkKLQkgKiBuYW1lc3BhY2VzIAotCSAqIAotCSAqIFRPRE86Ci0JICogRG9lcyB0aGlzIGJlbG9uZyBoZXJlPyAgVGhpcyBpcyBjb3BpZWQgZnJvbSB3c2RsLnVpLiAgQ2FuIHdlIHN5bmMgdXAgaW4gc29tZSB3YXk/Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVxdWlyZWROYW1lc3BhY2VzKEJpbmRpbmcgYmluZGluZykgewotCQlpZiAoY29udGVudEdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBuYW1lc3BhY2VOYW1lcyA9IGNvbnRlbnRHZW5lcmF0b3IuZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCk7Ci0JCQlTdHJpbmdbXSBwcmVmZXJyZWRQcmVmaXhlcyA9IG5ldyBTdHJpbmdbbmFtZXNwYWNlTmFtZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBuYW1lc3BhY2VOYW1lcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQlwcmVmZXJyZWRQcmVmaXhlc1tpbmRleF0gPSBjb250ZW50R2VuZXJhdG9yLmdldFByZWZlcnJlZE5hbWVzcGFjZVByZWZpeChuYW1lc3BhY2VOYW1lc1tpbmRleF0pOwkJCQkKLQkJCX0KLQkKLQkJCU1hcCBtYXAgPSBiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5nZXROYW1lc3BhY2VzKCk7Ci0JCQkKLQkJICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lc3BhY2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBuYW1lc3BhY2VOYW1lc1tpXTsKLQkJICAgICAgICBpZiAoIW1hcC5jb250YWluc1ZhbHVlKG5hbWVzcGFjZSkpIHsKLQkJICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoaSA8IHByZWZlcnJlZFByZWZpeGVzLmxlbmd0aCkgPyBwcmVmZXJyZWRQcmVmaXhlc1tpXSA6ICJwMCI7Ci0JCSAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KHByZWZpeCkpIHsKLQkJICAgICAgICAgICAgcHJlZml4ID0gY29tcHV0ZVVuaXF1ZVByZWZpeCgicCIsIG1hcCk7Ci0JCSAgICAgICAgICB9Ci0JCQkJICBiaW5kaW5nLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKS5hZGROYW1lc3BhY2UocHJlZml4LCBuYW1lc3BhY2UpOwotCQkgICAgICAgIH0KLQkJICAgICAgfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVVbmlxdWVQcmVmaXgoU3RyaW5nIGJhc2UsIE1hcCB0YWJsZSl7Ci0JICAgIGludCBpID0gMDsKLQkgICAgU3RyaW5nIHByZWZpeCA9IGJhc2U7Ci0JICAgIHdoaWxlICh0cnVlKSB7Ci0JICAgICAgaWYgKCF0YWJsZS5jb250YWluc0tleShwcmVmaXgpKSB7Ci0JICAgICAgICBicmVhazsKLQkgICAgICB9Ci0JICAgICAgZWxzZSB7Ci0JICAgICAgICBwcmVmaXggPSBiYXNlICsgaTsKLQkgICAgICAgIGkrKzsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIHByZWZpeDsKLQl9Ci0JCi0JcHJpdmF0ZSBQb3J0VHlwZSBnZXRQb3J0VHlwZSgpIHsKLQkJaWYgKGdldFJlZk5hbWUoKS5lcXVhbHMoIiIpKSB7Ci0JCQkvLyBNZWFucyB3ZSBzaG91bGQgc2V0IHRoZSBQb3J0VHlwZSB0byBVbnNwZWNpZmllZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmIChnZXRSZWZOYW1lKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgcG9ydFR5cGVJdCA9IGRlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpLml0ZXJhdG9yKCk7CQkJCi0KLQkJCXdoaWxlIChwb3J0VHlwZUl0Lmhhc05leHQoKSkgewotCQkJCVBvcnRUeXBlIHB0ID0gKFBvcnRUeXBlKSBwb3J0VHlwZUl0Lm5leHQoKTsKLQkJCQlMaXN0IHByZWZpeGVkTmFtZXMgPSBnZXRQcmVmaXhlZE5hbWVzKHB0KTsKLQkJCQlpZiAocHJlZml4ZWROYW1lcy5jb250YWlucyhnZXRSZWZOYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBwdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBiaW5kaW5nLmdldEVQb3J0VHlwZSgpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0UHJlZml4ZWROYW1lcyhQb3J0VHlwZSBwb3J0VHlwZSkgewotCQlMaXN0IHByZWZpeGVkTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZyBjdXJyZW50UG9ydFR5cGVOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJU3RyaW5nIGN1cnJlbnROYW1lc3BhY2UgPSBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCi0JCU1hcCBuYW1lc3BhY2VNYXAgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLQkJSXRlcmF0b3Iga2V5cyA9IG5hbWVzcGFjZU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHQoKTsKLQkJCU9iamVjdCB2YWx1ZSA9IG5hbWVzcGFjZU1hcC5nZXQoa2V5KTsKLQotCQkJaWYgKGN1cnJlbnROYW1lc3BhY2UuZXF1YWxzKHZhbHVlKSkgewotCQkJCS8vIEZvdW5kIGEgbWF0Y2guICBBZGQgdG8gb3VyIGxpc3QKLQkJCQlwcmVmaXhlZE5hbWVzLmFkZChrZXkgKyAiOiIgKyBjdXJyZW50UG9ydFR5cGVOYW1lKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByZWZpeGVkTmFtZXM7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL0NvbnRlbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlZGU2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9Db250ZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRHZW5lcmF0b3IKLXsJCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERFJFU1NfTE9DQVRJT04gPSAiaHR0cDovL3d3dy5leGFtcGxlLm9yZy8iOyAKLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0UmVxdWlyZWROYW1lc3BhY2VzKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVycmVkTmFtZXNwYWNlUHJlZml4KFN0cmluZyBuYW1lc3BhY2UpOwotCi0gIC8vIGdlbmVyYXRlcyB0aGUgJ2FkZHJlc3MnIGV4dGVuc2libGl0eSBlbGVtZW50IGZvciBhIHBvcnQKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVQb3J0Q29udGVudChQb3J0IHBvcnQpOwotIAotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdDb250ZW50KEJpbmRpbmcgYmluZGluZywgUG9ydFR5cGUgcG9ydFR5cGUpOwotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdPcGVyYXRpb25Db250ZW50KEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiwgT3BlcmF0aW9uIG9wZXJhdGlvbik7IAotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdJbnB1dENvbnRlbnQoQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCwgSW5wdXQgaW5wdXQpOyAgICAKLSAgcHVibGljIHZvaWQgZ2VuZXJhdGVCaW5kaW5nT3V0cHV0Q29udGVudChCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQsIE91dHB1dCBvdXRwdXQpOwotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUJpbmRpbmdGYXVsdENvbnRlbnQoQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCwgRmF1bHQgZmF1bHQpOwotICAKLSAgcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL1BvcnRHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL1BvcnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmNjJkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9Qb3J0R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFBvcnRHZW5lcmF0b3IgZXh0ZW5kcyBCYXNlR2VuZXJhdG9yIHsKLQlwcml2YXRlIFNlcnZpY2Ugc2VydmljZTsKLQkKLQlwdWJsaWMgUG9ydEdlbmVyYXRvcihTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkJZGVmaW5pdGlvbiA9IHNlcnZpY2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgUG9ydCBnZW5lcmF0ZVBvcnQoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlTdHJpbmcgYmluZGluZ05hbWUgPSBnZXRSZWZOYW1lKCk7CQkKLQkJCi0JICAgIFBvcnQgcG9ydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0KCk7Ci0JICAgIHBvcnQuc2V0TmFtZShnZXROYW1lKCkpOwotCSAgICBwb3J0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oc2VydmljZS5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotCQlwb3J0LnNldEJpbmRpbmcoZ2V0QmluZGluZyhnZXRSZWZOYW1lKCkpKTsKLQkgICAgc2VydmljZS5hZGRQb3J0KHBvcnQpOwotCQkKLQkJaWYgKHRoaXMuZ2V0Q29udGVudEdlbmVyYXRvcigpICE9IG51bGwpIHsKLQkJCXRoaXMuZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlUG9ydENvbnRlbnQocG9ydCk7Ci0JCX0KLQkJCi0JCXJldHVybiBwb3J0OwotCX0KLQkKLQlwcml2YXRlIEJpbmRpbmcgZ2V0QmluZGluZyhTdHJpbmcgYmluZGluZ05hbWUpIHsKLQkJSXRlcmF0b3IgYmluZGluZ0l0ID0gZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoYmluZGluZ0l0Lmhhc05leHQoKSkgewotCQkJQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGJpbmRpbmdJdC5uZXh0KCk7Ci0JCQlTdHJpbmcgY3VycmVudEJpbmRpbmdOYW1lID0gYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCQkJU3RyaW5nIGN1cnJlbnROYW1lc3BhY2UgPSBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQkKLQkJCUxpc3QgcHJlZml4ZWROYW1lcyA9IGdldFByZWZpeGVkTmFtZXMoYmluZGluZyk7Ci0JCQkKLQkJCWlmIChwcmVmaXhlZE5hbWVzLmNvbnRhaW5zKGJpbmRpbmdOYW1lKSkgewotCQkJCXJldHVybiBiaW5kaW5nOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldFByZWZpeGVkTmFtZXMoQmluZGluZyBiaW5kaW5nKSB7Ci0JCUxpc3QgcHJlZml4ZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGN1cnJlbnRCaW5kaW5nTmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQkJU3RyaW5nIGN1cnJlbnROYW1lc3BhY2UgPSBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQkJTWFwIG5hbWVzcGFjZU1hcCA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlcygpOwotCQlJdGVyYXRvciBrZXlzID0gbmFtZXNwYWNlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gbmFtZXNwYWNlTWFwLmdldChrZXkpOwotCQkJCi0JCQlpZiAoY3VycmVudE5hbWVzcGFjZS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJLy8gRm91bmQgYSBtYXRjaC4gIEFkZCB0byBvdXIgbGlzdAotCQkJCXByZWZpeGVkTmFtZXMuYWRkKGtleSArICI6IiArIGN1cnJlbnRCaW5kaW5nTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwcmVmaXhlZE5hbWVzOwotCX0KLQkKLQlwdWJsaWMgU2VydmljZSBnZXRTZXJ2aWNlKCkgewotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9leHRlbnNpb24vQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL2V4dGVuc2lvbi9Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzViNWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL2V4dGVuc2lvbi9Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLkNvbnRlbnRHZW5lcmF0b3I7Ci0KLS8qCi0gKiBDbGFzcyB3aGljaCBhY3RzIGFzIGEgY29udGFpbmVyIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4dGVuc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yIHsKLQlwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXI7Ci0JcHJvdGVjdGVkIENvbnRlbnRHZW5lcmF0b3IgY29udGVudEdlbmVyYXRvcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7Ci0JCi0JcHVibGljIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgY2xhc3NTdHJpbmcsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NTdHJpbmc7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGVudEdlbmVyYXRvcigpIHsKLQkJdHJ5IHsKLQkgICAgICAgIENsYXNzIHRoZUNsYXNzID0gY2xhc3NMb2FkZXIgIT0gbnVsbCA/IGNsYXNzTG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpIDogQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCSAgICAgICAgY29udGVudEdlbmVyYXRvciA9IChDb250ZW50R2VuZXJhdG9yKSB0aGVDbGFzcy5uZXdJbnN0YW5jZSgpOwotCSAgICAgIH0KLQkgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICAgICAgfQotCQkKLQkJcmV0dXJuIGNvbnRlbnRHZW5lcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9leHRlbnNpb24vQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9nZW5lcmF0b3IvZXh0ZW5zaW9uL0NvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhYjViOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9leHRlbnNpb24vQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuZ2VuZXJhdG9yLmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5nZW5lcmF0b3IuQ29udGVudEdlbmVyYXRvcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5IHsKLQlwcm90ZWN0ZWQgTWFwIG1hcDsKLQlwcm90ZWN0ZWQgc3RhdGljIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkgaW5zdGFuY2U7Ci0JCi0JcHVibGljIHN0YXRpYyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeSgpOwotCQkJCi0JCQkvLyBUT0RPLi4uIGRvbid0IHJlYWQgdGhlIHJlZ2lzdHJ5IHVudGlsIGFuICdnZXQnb2NjdXJzCi0JCQkvLwotCQkJQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IG5ldyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIoaW5zdGFuY2UpOyAKLQkJCXJlYWRlci5yZWFkUmVnaXN0cnkoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHV0KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCS8vIENoZWNrIGlmIHRoaXMgbmFtZXNwYWNlL25hbWUga2V5IGlzIGFscmVhZHkgaW4gdGhlIE1hcAotCQlMaXN0IGZvdW5kS2V5ID0gZmluZEV4aXN0aW5nS2V5KG5hbWVzcGFjZSwgbmFtZSk7Ci0JCQotCQkvLyBEaWQgd2UgZmluZCBhbiBleGlzdGluZyBrZXkgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2Uva2V5IHBhaXJpbmc/Ci0JCWlmIChmb3VuZEtleSAhPSBudWxsKSB7Ci0JCQkvLyBTaW1wbHkgYWRkIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBsaXN0IG9mIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQKLQkJCS8vIHdpdGggdGhpcyBuYW1lc3BhY2UvbmFtZSBrZXkKLQkJCUxpc3QgZGVzY3JpcHRvckxpc3QgPSAoTGlzdCkgbWFwLmdldChmb3VuZEtleSk7Ci0JCQlkZXNjcmlwdG9yTGlzdC5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeSBpbiB0aGUgTWFwIGZvciB0aGlzIG5hbWVzcGFjZS9uYW1lIGtleQotCQkJTGlzdCBuZXdLZXkgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQkJbmV3S2V5LmFkZChuYW1lc3BhY2UpOwotCQkJbmV3S2V5LmFkZChuYW1lKTsKLQkJCQotCQkJTGlzdCBuZXdEZXNjcmlwdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW5ld0Rlc2NyaXB0b3JMaXN0LmFkZChkZXNjcmlwdG9yKTsKLQkJCQotCQkJbWFwLnB1dChuZXdLZXksIG5ld0Rlc2NyaXB0b3JMaXN0KTsKLQkJfQkJCi0JfQotCQotCS8qCi0JICogUmV0dXJucyB0aGUgJ25hbWUnIGF0dHJpYnV0ZSBmb3IgdGhpcyBleHRlbnNpb24uCi0JICovCi0JcHVibGljIExpc3QgZ2V0QmluZGluZ0V4dGVuc2lvbk5hbWVzKCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlJdGVyYXRvciBrZXlJdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlMaXN0IGtleSA9IG51bGw7Ci0JCXdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKLQkJCWtleSA9IChMaXN0KSBrZXlJdC5uZXh0KCk7Ci0JCQlsaXN0LmFkZChrZXkuZ2V0KDEpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBjbGFzcyBzcGVjaWZpZWQgZm9yIHRoaXMgZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBuYW1lc3BhY2UKLQkgKiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIENvbnRlbnRHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yQ2xhc3NGcm9tTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJQ29udGVudEdlbmVyYXRvciBnZW5lcmF0b3JDbGFzcyA9IG51bGw7Ci0JCUxpc3Qga2V5ID0gZmluZEV4aXN0aW5nS2V5RnJvbU5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkKLQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQlMaXN0IGRlc2NyaXB0b3JzID0gKExpc3QpIG1hcC5nZXQoa2V5KTsKLQkJCQotCQkJLy8gR3JhYiB0aGUgZmlyc3QgZGVzY3JpcHRvciBhdmFpbGFibGUKLQkJCWlmIChkZXNjcmlwdG9ycy5zaXplKCkgPiAwKSB7Ci0JCQkJQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkRlc2NyaXB0b3IgZXh0ZW5zaW9uRGVzY3JpcHRvciA9IChDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KDApOwotCQkJCWdlbmVyYXRvckNsYXNzID0gKENvbnRlbnRHZW5lcmF0b3IpIGV4dGVuc2lvbkRlc2NyaXB0b3IuZ2V0Q29udGVudEdlbmVyYXRvcigpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZ2VuZXJhdG9yQ2xhc3M7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIHNwZWNpZmllZCBmb3IgdGhpcyBleHRlbnNpb24gYmFzZWQgb24gdGhlIG5hbWUKLQkgKiBhdHRyaWJ1dGUuCi0JICovCi0JcHVibGljIENvbnRlbnRHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yQ2xhc3NGcm9tTmFtZShTdHJpbmcgbmFtZSkgewotCQlDb250ZW50R2VuZXJhdG9yIGdlbmVyYXRvckNsYXNzID0gbnVsbDsKLQkJTGlzdCBrZXkgPSBmaW5kRXhpc3RpbmdLZXlGcm9tTmFtZShuYW1lKTsKLQkJCi0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJTGlzdCBkZXNjcmlwdG9ycyA9IChMaXN0KSBtYXAuZ2V0KGtleSk7Ci0JCQkKLQkJCS8vIEdyYWIgdGhlIGZpcnN0IGRlc2NyaXB0b3IgYXZhaWxhYmxlCi0JCQlpZiAoZGVzY3JpcHRvcnMuc2l6ZSgpID4gMCkgewotCQkJCUNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25EZXNjcmlwdG9yIGV4dGVuc2lvbkRlc2NyaXB0b3IgPSAoQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkRlc2NyaXB0b3IpIGRlc2NyaXB0b3JzLmdldCgwKTsKLQkJCQlnZW5lcmF0b3JDbGFzcyA9IChDb250ZW50R2VuZXJhdG9yKSBleHRlbnNpb25EZXNjcmlwdG9yLmdldENvbnRlbnRHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGdlbmVyYXRvckNsYXNzOwotCX0KLQkKLQkvLyBUT0RPOiBXZSBuZWVkIHRvIGNvbW1vbiB0aGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZHMgdXAuLi4uLi4uCi0JcHJpdmF0ZSBMaXN0IGZpbmRFeGlzdGluZ0tleUZyb21OYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlJdGVyYXRvciBrZXlJdCA9IG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlMaXN0IGZvdW5kS2V5ID0gbnVsbDsKLQkJd2hpbGUgKGtleUl0Lmhhc05leHQoKSkgewotCQkJZm91bmRLZXkgPSAoTGlzdCkga2V5SXQubmV4dCgpOwotCQkJaWYgKG5hbWVzcGFjZS5lcXVhbHMoZm91bmRLZXkuZ2V0KDApKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJZm91bmRLZXkgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIGZvdW5kS2V5OwotCX0KLQkKLQlwcml2YXRlIExpc3QgZmluZEV4aXN0aW5nS2V5RnJvbU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3Iga2V5SXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTGlzdCBmb3VuZEtleSA9IG51bGw7Ci0JCXdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKLQkJCWZvdW5kS2V5ID0gKExpc3QpIGtleUl0Lm5leHQoKTsKLQkJCWlmIChuYW1lLmVxdWFscyhmb3VuZEtleS5nZXQoMSkpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlmb3VuZEtleSA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gZm91bmRLZXk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBmaW5kRXhpc3RpbmdLZXkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3Iga2V5SXQgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTGlzdCBmb3VuZEtleSA9IG51bGw7Ci0JCXdoaWxlIChrZXlJdC5oYXNOZXh0KCkpIHsKLQkJCWZvdW5kS2V5ID0gKExpc3QpIGtleUl0Lm5leHQoKTsKLQkJCWlmIChuYW1lc3BhY2UuZXF1YWxzKGZvdW5kS2V5LmdldCgwKSkgJiYgbmFtZS5lcXVhbHMoZm91bmRLZXkuZ2V0KDEpKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJZm91bmRLZXkgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIGZvdW5kS2V5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL2V4dGVuc2lvbi9Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvZ2VuZXJhdG9yL2V4dGVuc2lvbi9Db250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1NDc2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2dlbmVyYXRvci9leHRlbnNpb24vQ29udGVudEdlbmVyYXRvckV4dGVuc2lvblJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmdlbmVyYXRvci5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbjsKLQotcHVibGljIGNsYXNzIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlciB7Ci0JICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBXU0RMUGx1Z2luLmdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29udGVudEdlbmVyYXRvcnMiOwotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9OQU1FID0gImNvbnRlbnRHZW5lcmF0b3IiOwotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7Ci0JICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOwotCSAgcHJvdGVjdGVkIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkgY29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeTsKLQotCSAgcHVibGljIENvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25SZWdpc3RyeVJlYWRlcihDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRmFjdG9yeVJlZ2lzdHJ5IGdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeSkgewotCSAgICB0aGlzLmNvbnRlbnRHZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnkgPSBnZW5lcmF0b3JFeHRlbnNpb25GYWN0b3J5UmVnaXN0cnk7Ci0JICB9Ci0JCi0JCi0JICAvKioKLQkgICAqIHJlYWQgZnJvbSBwbHVnaW4gcmVnaXN0cnkgYW5kIHBhcnNlIGl0LgotCSAgICovCi0JICBwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JICAgIElQbHVnaW5SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkgICAgaWYgKHBvaW50ICE9IG51bGwpIHsKLQkgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkgICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkgICAgICB9Ci0JICAgIH0KLQkgIH0KLQotCSAgcHVibGljIFN0cmluZyByZXNvbHZlKFVSTCBwbGF0Zm9ybVVSTCwgU3RyaW5nIHJlbGF0aXZlUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIFVSTCByZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUocGxhdGZvcm1VUkwpOwotCSAgICByZXR1cm4gcmVzb2x2ZWRVUkwudG9TdHJpbmcoKSArIHJlbGF0aXZlUGF0aDsKLQkgIH0KLQotCSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNRU5UX05BTUUpKSB7Ci0JICAgICAgdHJ5IHsKLQkgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZEVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50OwotCQkJU3RyaW5nIG5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKTsKLQkgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FU1BBQ0UpOwotCQkJCi0JICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwpIHsKLQkgICAgICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luQ2xhc3NzTG9hZGVyID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXREZWNsYXJpbmdQbHVnaW5EZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLQkgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkgICAgICAgICAgQ29udGVudEdlbmVyYXRvckV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDb250ZW50R2VuZXJhdG9yRXh0ZW5zaW9uRGVzY3JpcHRvcihwbHVnaW5DbGFzc3NMb2FkZXIsIGNsYXNzTmFtZSwgbmFtZXNwYWNlLCBuYW1lKTsKLQkgICAgICAgICAgY29udGVudEdlbmVyYXRvckV4dGVuc2lvbkZhY3RvcnlSZWdpc3RyeS5wdXQobmFtZXNwYWNlLCBuYW1lLCBkZXNjcmlwdG9yKTsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0ZhdWx0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdGYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkNDhkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0ZhdWx0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgRmF1bHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nRmF1bHRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nRmF1bHRJbXBsI2dldEVGYXVsdCA8ZW0+RUZhdWx0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ0ZhdWx0SW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJpbmRpbmdGYXVsdAotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFRmF1bHQoKSA8ZW0+RUZhdWx0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFRmF1bHQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRmF1bHQgZUZhdWx0ID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nRmF1bHRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ0ZhdWx0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBGYXVsdCBnZXRFRmF1bHQoKQotICB7Ci0gICAgaWYgKGVGYXVsdCAhPSBudWxsICYmIGVGYXVsdC5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIEZhdWx0IG9sZEVGYXVsdCA9IGVGYXVsdDsKLSAgICAgIGVGYXVsdCA9IChGYXVsdCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZUZhdWx0KTsKLSAgICAgIGlmIChlRmF1bHQgIT0gb2xkRUZhdWx0KQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VGQVVMVCwgb2xkRUZhdWx0LCBlRmF1bHQpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEZhdWx0IGJhc2ljR2V0RUZhdWx0KCkKLSAgewotICAgIHJldHVybiBlRmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVGYXVsdChGYXVsdCBuZXdFRmF1bHQpCi0gIHsKLSAgICBGYXVsdCBvbGRFRmF1bHQgPSBlRmF1bHQ7Ci0gICAgZUZhdWx0ID0gbmV3RUZhdWx0OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VGQVVMVCwgb2xkRUZhdWx0LCBlRmF1bHQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkZhdWx0IGdldEZhdWx0KCkKLSAgewotICAgIHJldHVybiBnZXRFRmF1bHQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhdWx0KGphdmF4LndzZGwuRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBzZXRFRmF1bHQoKEZhdWx0KSBmYXVsdCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VGQVVMVDoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFRmF1bHQoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RUZhdWx0KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUZBVUxUOgotICAgICAgICBzZXRFRmF1bHQoKEZhdWx0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRUZBVUxUOgotICAgICAgICBzZXRFRmF1bHQoKEZhdWx0KW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCAmJiAhZUV4dGVuc2liaWxpdHlFbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfRkFVTFRfX0VGQVVMVDoKLSAgICAgICAgcmV0dXJuIGVGYXVsdCAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXROYW1lKG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgY29tcG9uZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbChiaW5kaW5nRmF1bHQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ0ZhdWx0X05hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLkZBVUxUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0gIAotICAvLyBSZXNvbHZlIHRoZSByZWZlcmVuY2UgdG8gRmF1bHQKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm9wID0gKEJpbmRpbmdPcGVyYXRpb24pZ2V0Q29udGFpbmVyKCk7Ci0gICAgICBPcGVyYXRpb24gb3AgPSBib3AuZ2V0RU9wZXJhdGlvbigpOwotICAgICAgaWYgKG9wICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAJLy8gVEJEIC0gUmV2aXNpdCBBUEkuIEdldCB0aGUgZmlyc3QgRmF1bHQuCi0gICAgICAgIHNldEZhdWx0KChGYXVsdClvcC5nZXRFRmF1bHRzKCkuZ2V0KDApKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL0JpbmRpbmdGYXVsdEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjY3NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nSW1wbCNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nSW1wbCNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nSW1wbCNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjZ2V0RVBvcnRUeXBlIDxlbT5FUG9ydCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ0ltcGwjZ2V0RUJpbmRpbmdPcGVyYXRpb25zIDxlbT5FQmluZGluZyBPcGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ0ltcGwgZXh0ZW5kcyBFeHRlbnNpYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBCaW5kaW5nCi17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UU5hbWUoKSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBxTmFtZSA9IFFOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmRlZmluZWQoKSA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTkRFRklORURfRURFRkFVTFQgPSBmYWxzZTsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmRlZmluZWQoKSA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHVuZGVmaW5lZCA9IFVOREVGSU5FRF9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPWFlfRURFRkFVTFQgPSBmYWxzZTsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHByb3h5ID0gUFJPWFlfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VVUkkgPSBSRVNPVVJDRV9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVQb3J0VHlwZSgpIDxlbT5FUG9ydCBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFUG9ydFR5cGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgUG9ydFR5cGUgZVBvcnRUeXBlID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkgPGVtPkVCaW5kaW5nIE9wZXJhdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVCaW5kaW5nT3BlcmF0aW9ucyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ0ltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG5ld1FOYW1lKQotICB7Ci0gICAgUU5hbWUgb2xkUU5hbWUgPSBxTmFtZTsKLSAgICBxTmFtZSA9IG5ld1FOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfX1FOQU1FLCBvbGRRTmFtZSwgcU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRlZmluZWQoKQotICB7Ci0gICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gbmV3VW5kZWZpbmVkKQotICB7Ci0gICAgYm9vbGVhbiBvbGRVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0gICAgdW5kZWZpbmVkID0gbmV3VW5kZWZpbmVkOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfX1VOREVGSU5FRCwgb2xkVW5kZWZpbmVkLCB1bmRlZmluZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5KGJvb2xlYW4gbmV3UHJveHkpCi0gIHsKLSAgICBib29sZWFuIG9sZFByb3h5ID0gcHJveHk7Ci0gICAgcHJveHkgPSBuZXdQcm94eTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX19QUk9YWSwgb2xkUHJveHksIHByb3h5KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVVSSShTdHJpbmcgbmV3UmVzb3VyY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkUmVzb3VyY2VVUkkgPSByZXNvdXJjZVVSSTsKLSAgICByZXNvdXJjZVVSSSA9IG5ld1Jlc291cmNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfX1JFU09VUkNFX1VSSSwgb2xkUmVzb3VyY2VVUkksIHJlc291cmNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZSBnZXRFUG9ydFR5cGUoKQotICB7Ci0gICAgaWYgKGVQb3J0VHlwZSAhPSBudWxsICYmIGVQb3J0VHlwZS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIFBvcnRUeXBlIG9sZEVQb3J0VHlwZSA9IGVQb3J0VHlwZTsKLSAgICAgIGVQb3J0VHlwZSA9IChQb3J0VHlwZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZVBvcnRUeXBlKTsKLSAgICAgIGlmIChlUG9ydFR5cGUgIT0gb2xkRVBvcnRUeXBlKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VQT1JUX1RZUEUsIG9sZEVQb3J0VHlwZSwgZVBvcnRUeXBlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlUG9ydFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZSBiYXNpY0dldEVQb3J0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZVBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFUG9ydFR5cGUoUG9ydFR5cGUgbmV3RVBvcnRUeXBlKQotICB7Ci0gICAgUG9ydFR5cGUgb2xkRVBvcnRUeXBlID0gZVBvcnRUeXBlOwotICAgIGVQb3J0VHlwZSA9IG5ld0VQb3J0VHlwZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFLCBvbGRFUG9ydFR5cGUsIGVQb3J0VHlwZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgewotICAgIGlmIChlQmluZGluZ09wZXJhdGlvbnMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlQmluZGluZ09wZXJhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmluZGluZ09wZXJhdGlvbi5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUyk7Ci0gICAgfQotICAgIHJldHVybiBlQmluZGluZ09wZXJhdGlvbnM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQWRkIGFuIG9wZXJhdGlvbiBiaW5kaW5nIHRvIGJpbmRpbmcuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQmluZGluZ09wZXJhdGlvbihqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIGdldEJpbmRpbmdPcGVyYXRpb25zKCkuYWRkKGJpbmRpbmdPcGVyYXRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBiaW5kaW5nLiBOb3RlIHRoYXQgb3BlcmF0aW9uIG5hbWVzIGNhbgotICAgKiBiZSBvdmVybG9hZGVkIHdpdGhpbiBhIFBvcnRUeXBlLiBJbiBjYXNlIG9mIG92ZXJsb2FkaW5nLCB0aGUKLSAgICogbmFtZXMgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgbWVzc2FnZXMgY2FuIGJlIHVzZWQgdG8gZnVydGhlcgotICAgKiByZWZpbmUgdGhlIHNlYXJjaC4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgb3BlcmF0aW9uIGJpbmRpbmcuCi0gICAqIEBwYXJhbSBpbnB1dE5hbWUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IG1lc3NhZ2U7IGlmIHRoaXMgaXMgbnVsbAotICAgKiBpdCB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEBwYXJhbSBvdXRwdXROYW1lIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgbWVzc2FnZTsgaWYgdGhpcyBpcyBudWxsCi0gICAqIGl0IHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gYmluZGluZywgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIG9wZXJhdGlvbiBiaW5kaW5nCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBnZXRCaW5kaW5nT3BlcmF0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgaW5wdXROYW1lLCBTdHJpbmcgb3V0cHV0TmFtZSkKLSAgewotICAgIEl0ZXJhdG9yIG9wQmluZGluZ0l0ZXJhdG9yID0gZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChvcEJpbmRpbmdJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIG9wID0gKGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbikgb3BCaW5kaW5nSXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBTdHJpbmcgb3BOYW1lID0gb3AuZ2V0TmFtZSgpOwotICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBvcE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFuYW1lLmVxdWFscyhvcE5hbWUpKQotICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5hbWUgIT0gbnVsbCB8fCBvcE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3AgPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCAmJiBpbnB1dE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgaW5wdXQgPSBvcC5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgb3BJbnB1dE5hbWUgPSBpbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG9wSW5wdXROYW1lID09IG51bGwgfHwgIW9wSW5wdXROYW1lLmVxdWFscyhpbnB1dE5hbWUpKQotICAgICAgICAgICAgb3AgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcCAhPSBudWxsICYmIG91dHB1dE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IG91dHB1dCA9IG9wLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG9wT3V0cHV0TmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG9wT3V0cHV0TmFtZSA9PSBudWxsIHx8ICFvcE91dHB1dE5hbWUuZXF1YWxzKG91dHB1dE5hbWUpKQotICAgICAgICAgICAgb3AgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcCAhPSBudWxsKQotICAgICAgICByZXR1cm4gb3A7Ci0gICAgfSAvLyBlbmQgd2hpbGUKLSAgICByZXR1cm4gbnVsbDsgLy8gYmluZGluZyBvcGVyYXRpb24gbm90IGZvdW5kCi0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGFsbCB0aGUgb3BlcmF0aW9uIGJpbmRpbmdzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRCaW5kaW5nT3BlcmF0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSBnZXRQb3J0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RVBvcnRUeXBlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQb3J0VHlwZShqYXZheC53c2RsLlBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgc2V0RVBvcnRUeXBlKChQb3J0VHlwZSkgcG9ydFR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRUJJTkRJTkdfT1BFUkFUSU9OUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVCaW5kaW5nT3BlcmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19RTkFNRToKLSAgICAgICAgcmV0dXJuIGdldFFOYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19QUk9YWToKLSAgICAgICAgcmV0dXJuIGlzUHJveHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldFJlc291cmNlVVJJKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VQT1JUX1RZUEU6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RVBvcnRUeXBlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVQb3J0VHlwZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TOgotICAgICAgICByZXR1cm4gZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1BST1hZOgotICAgICAgICBzZXRQcm94eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VQT1JUX1RZUEU6Ci0gICAgICAgIHNldEVQb3J0VHlwZSgoUG9ydFR5cGUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlM6Ci0gICAgICAgIGdldEVCaW5kaW5nT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVCaW5kaW5nT3BlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoUU5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKFVOREVGSU5FRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KFBST1hZX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKFJFU09VUkNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRVBPUlRfVFlQRToKLSAgICAgICAgc2V0RVBvcnRUeXBlKChQb3J0VHlwZSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FQklORElOR19PUEVSQVRJT05TOgotICAgICAgICBnZXRFQmluZGluZ09wZXJhdGlvbnMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCAmJiAhZUV4dGVuc2liaWxpdHlFbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX1FOQU1FOgotICAgICAgICByZXR1cm4gUU5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHFOYW1lICE9IG51bGwgOiAhUU5BTUVfRURFRkFVTFQuZXF1YWxzKHFOYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUFJPWFk6Ci0gICAgICAgIHJldHVybiBwcm94eSAhPSBQUk9YWV9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19fUkVTT1VSQ0VfVVJJOgotICAgICAgICByZXR1cm4gUkVTT1VSQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyByZXNvdXJjZVVSSSAhPSBudWxsIDogIVJFU09VUkNFX1VSSV9FREVGQVVMVC5lcXVhbHMocmVzb3VyY2VVUkkpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX19FUE9SVF9UWVBFOgotICAgICAgICByZXR1cm4gZVBvcnRUeXBlICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlM6Ci0gICAgICAgIHJldHVybiBlQmluZGluZ09wZXJhdGlvbnMgIT0gbnVsbCAmJiAhZUJpbmRpbmdPcGVyYXRpb25zLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAocU5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocU5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgdW5kZWZpbmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHVuZGVmaW5lZCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBwcm94eTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChwcm94eSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZVVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotCi0gICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIHNldFFOYW1lKHFuYW1lKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGNvbXBvbmVudDsKLQotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbChiaW5kaW5nLmdldEVCaW5kaW5nT3BlcmF0aW9ucygpKTsKLSAgICBsaXN0LmFkZEFsbChiaW5kaW5nLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3dpdGNoIChXU0RMVXRpbC5nZXRJbnN0YW5jZSgpLmdldFdTRExUeXBlKGNoaWxkKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1BFUkFUSU9OIDoKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ09wZXJhdGlvbigpOwotICAgICAgICBvcGVyYXRpb24uc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICBvcGVyYXRpb24uc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGFkZEJpbmRpbmdPcGVyYXRpb24ob3BlcmF0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChjb21wb25lbnQsIG1vZGVsT2JqZWN0KTsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0TGlzdChPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGNvbXBvbmVudDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGJpbmRpbmcuZ2V0RUJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdfUU5hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nX0VQb3J0VHlwZSgpKQotICAgICAgewotICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGdldEVQb3J0VHlwZSgpOwotICAgICAgICBpZiAocG9ydFR5cGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFFOYW1lIHFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UWVBFX0FUVFJJQlVURSwgcU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5CSU5ESU5HKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFQmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoQmluZGluZ09wZXJhdGlvbkltcGwpIG9wZXJhdGlvbikuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgcG9ydFR5cGVRTmFtZSA9IGNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpOwotICAgICAgUG9ydFR5cGUgbmV3UG9ydFR5cGUgPSBwb3J0VHlwZVFOYW1lICE9IG51bGwgPyAoUG9ydFR5cGUpIGRlZmluaXRpb24uZ2V0UG9ydFR5cGUocG9ydFR5cGVRTmFtZSkgOiBudWxsOwotICAgICAgaWYgKG5ld1BvcnRUeXBlICE9IGdldEVQb3J0VHlwZSgpKQotICAgICAgewotICAgICAgICBzZXRFUG9ydFR5cGUobmV3UG9ydFR5cGUpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9Ci19IC8vQmluZGluZ0ltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nSW5wdXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0lucHV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZhYmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nSW5wdXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgSW5wdXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nSW5wdXRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nSW5wdXRJbXBsI2dldEVJbnB1dCA8ZW0+RUlucHV0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmluZGluZ0lucHV0SW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJpbmRpbmdJbnB1dAotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFSW5wdXQoKSA8ZW0+RUlucHV0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFSW5wdXQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgSW5wdXQgZUlucHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nSW5wdXRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ0lucHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBnZXRFSW5wdXQoKQotICB7Ci0gICAgaWYgKGVJbnB1dCAhPSBudWxsICYmIGVJbnB1dC5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIElucHV0IG9sZEVJbnB1dCA9IGVJbnB1dDsKLSAgICAgIGVJbnB1dCA9IChJbnB1dCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZUlucHV0KTsKLSAgICAgIGlmIChlSW5wdXQgIT0gb2xkRUlucHV0KQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VJTlBVVCwgb2xkRUlucHV0LCBlSW5wdXQpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIElucHV0IGJhc2ljR2V0RUlucHV0KCkKLSAgewotICAgIHJldHVybiBlSW5wdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVJbnB1dChJbnB1dCBuZXdFSW5wdXQpCi0gIHsKLSAgICBJbnB1dCBvbGRFSW5wdXQgPSBlSW5wdXQ7Ci0gICAgZUlucHV0ID0gbmV3RUlucHV0OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VJTlBVVCwgb2xkRUlucHV0LCBlSW5wdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLklucHV0IGdldElucHV0KCkKLSAgewotICAgIHJldHVybiBnZXRFSW5wdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucHV0KGphdmF4LndzZGwuSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBzZXRFSW5wdXQoKElucHV0KSBpbnB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VJTlBVVDoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFSW5wdXQoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RUlucHV0KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUlOUFVUOgotICAgICAgICBzZXRFSW5wdXQoKElucHV0KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRUlOUFVUOgotICAgICAgICBzZXRFSW5wdXQoKElucHV0KW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCAmJiAhZUV4dGVuc2liaWxpdHlFbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfSU5QVVRfX0VJTlBVVDoKLSAgICAgICAgcmV0dXJuIGVJbnB1dCAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGlhdGlvbiBtZXRob2RzCi0gIC8vCi0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkucmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSAoQmluZGluZ0lucHV0KSBjb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkQWxsKGJpbmRpbmdJbnB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nSW5wdXRfTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuSU5QVVQpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLSAgCi0gIC8vIFJlc29sdmUgdGhlIHJlZmVyZW5jZSB0byBJbnB1dAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBib3AgPSAoQmluZGluZ09wZXJhdGlvbilnZXRDb250YWluZXIoKTsKLSAgICAgIE9wZXJhdGlvbiBvcCA9IGJvcC5nZXRFT3BlcmF0aW9uKCk7Ci0gICAgICBpZiAob3AgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0SW5wdXQob3AuZ2V0RUlucHV0KCkpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9Ci19IC8vQmluZGluZ0lucHV0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdPcGVyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ09wZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4N2Y1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ09wZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CaW5kaW5nIE9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3BlcmF0aW9uSW1wbCNnZXRFT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwjZ2V0RUJpbmRpbmdJbnB1dCA8ZW0+RUJpbmRpbmcgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5CaW5kaW5nT3BlcmF0aW9uSW1wbCNnZXRFQmluZGluZ091dHB1dCA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ09wZXJhdGlvbkltcGwjZ2V0RUJpbmRpbmdGYXVsdHMgPGVtPkVCaW5kaW5nIEZhdWx0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJpbmRpbmdPcGVyYXRpb25JbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgQmluZGluZ09wZXJhdGlvbgotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFT3BlcmF0aW9uKCkgPGVtPkVPcGVyYXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVPcGVyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uIGVPcGVyYXRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFQmluZGluZ0lucHV0KCkgPGVtPkVCaW5kaW5nIElucHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZ0lucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdJbnB1dCBlQmluZGluZ0lucHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUJpbmRpbmdPdXRwdXQoKSA8ZW0+RUJpbmRpbmcgT3V0cHV0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZ091dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3V0cHV0IGVCaW5kaW5nT3V0cHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUJpbmRpbmdGYXVsdHMoKSA8ZW0+RUJpbmRpbmcgRmF1bHRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVCaW5kaW5nRmF1bHRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVCaW5kaW5nRmF1bHRzID0gbnVsbDsKLQotICBwcml2YXRlIE1hcCBiaW5kaW5nRmF1bHRzOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdPcGVyYXRpb25JbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ09wZXJhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0gICAgbmFtZSA9IG5ld05hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvbiBnZXRFT3BlcmF0aW9uKCkKLSAgewotICAgIGlmIChlT3BlcmF0aW9uICE9IG51bGwgJiYgZU9wZXJhdGlvbi5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIE9wZXJhdGlvbiBvbGRFT3BlcmF0aW9uID0gZU9wZXJhdGlvbjsKLSAgICAgIGVPcGVyYXRpb24gPSAoT3BlcmF0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllT3BlcmF0aW9uKTsKLSAgICAgIGlmIChlT3BlcmF0aW9uICE9IG9sZEVPcGVyYXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VPUEVSQVRJT04sIG9sZEVPcGVyYXRpb24sIGVPcGVyYXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVPcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb24gYmFzaWNHZXRFT3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBlT3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFT3BlcmF0aW9uKE9wZXJhdGlvbiBuZXdFT3BlcmF0aW9uKQotICB7Ci0gICAgT3BlcmF0aW9uIG9sZEVPcGVyYXRpb24gPSBlT3BlcmF0aW9uOwotICAgIGVPcGVyYXRpb24gPSBuZXdFT3BlcmF0aW9uOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OLCBvbGRFT3BlcmF0aW9uLCBlT3BlcmF0aW9uKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nSW5wdXQgZ2V0RUJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZUJpbmRpbmdJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgbmV3RUJpbmRpbmdJbnB1dCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIEJpbmRpbmdJbnB1dCBvbGRFQmluZGluZ0lucHV0ID0gZUJpbmRpbmdJbnB1dDsKLSAgICBlQmluZGluZ0lucHV0ID0gbmV3RUJpbmRpbmdJbnB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVCwgb2xkRUJpbmRpbmdJbnB1dCwgbmV3RUJpbmRpbmdJbnB1dCk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBuZXdFQmluZGluZ0lucHV0KQotICB7Ci0gICAgaWYgKG5ld0VCaW5kaW5nSW5wdXQgIT0gZUJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLSAgICAgIGlmIChlQmluZGluZ0lucHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllQmluZGluZ0lucHV0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVULCBudWxsLCBtc2dzKTsKLSAgICAgIGlmIChuZXdFQmluZGluZ0lucHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFQmluZGluZ0lucHV0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVULCBudWxsLCBtc2dzKTsKLSAgICAgIG1zZ3MgPSBiYXNpY1NldEVCaW5kaW5nSW5wdXQobmV3RUJpbmRpbmdJbnB1dCwgbXNncyk7Ci0gICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVULCBuZXdFQmluZGluZ0lucHV0LCBuZXdFQmluZGluZ0lucHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGdldEVCaW5kaW5nT3V0cHV0KCkKLSAgewotICAgIHJldHVybiBlQmluZGluZ091dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RUJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBuZXdFQmluZGluZ091dHB1dCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIEJpbmRpbmdPdXRwdXQgb2xkRUJpbmRpbmdPdXRwdXQgPSBlQmluZGluZ091dHB1dDsKLSAgICBlQmluZGluZ091dHB1dCA9IG5ld0VCaW5kaW5nT3V0cHV0OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVCwgb2xkRUJpbmRpbmdPdXRwdXQsIG5ld0VCaW5kaW5nT3V0cHV0KTsKLSAgICAgIGlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1zZ3M7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgbmV3RUJpbmRpbmdPdXRwdXQpCi0gIHsKLSAgICBpZiAobmV3RUJpbmRpbmdPdXRwdXQgIT0gZUJpbmRpbmdPdXRwdXQpCi0gICAgewotICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0gICAgICBpZiAoZUJpbmRpbmdPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVCaW5kaW5nT3V0cHV0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBpZiAobmV3RUJpbmRpbmdPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0VCaW5kaW5nT3V0cHV0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVCwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRFQmluZGluZ091dHB1dChuZXdFQmluZGluZ091dHB1dCwgbXNncyk7Ci0gICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVCwgbmV3RUJpbmRpbmdPdXRwdXQsIG5ld0VCaW5kaW5nT3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFQmluZGluZ0ZhdWx0cygpCi0gIHsKLSAgICBpZiAoZUJpbmRpbmdGYXVsdHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlQmluZGluZ0ZhdWx0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChCaW5kaW5nRmF1bHQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19GQVVMVFMpOwotICAgIH0KLSAgICByZXR1cm4gZUJpbmRpbmdGYXVsdHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQWRkIGEgZmF1bHQgYmluZGluZy4KLSAgICogQHBhcmFtIGZhdWx0IHRoZSBuZXcgZmF1bHQgYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmdGYXVsdChqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gIHsKLSAgICBnZXRFQmluZGluZ0ZhdWx0cygpLmFkZCgoQmluZGluZ0ZhdWx0KWJpbmRpbmdGYXVsdCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgZmF1bHQgYmluZGluZy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgZmF1bHQgYmluZGluZy4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBmYXVsdCBiaW5kaW5nLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgZmF1bHQgYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCBnZXRCaW5kaW5nRmF1bHQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBCaW5kaW5nRmF1bHQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFQmluZGluZ0ZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nRmF1bHQgZmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBpLm5leHQoKTsKLSAgICAgIGlmIChuYW1lLmVxdWFscyhmYXVsdC5nZXROYW1lKCkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYXVsdDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGFsbCB0aGUgZmF1bHQgYmluZGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3BlcmF0aW9uIGJpbmRpbmcuCi0gICAqIEByZXR1cm4gbmFtZXMgb2YgZmF1bHQgYmluZGluZ3MKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldEJpbmRpbmdGYXVsdHMoKQotICB7Ci0gICAgSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFQmluZGluZ0ZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBoYXNoTWFwLnB1dChiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpLCBiaW5kaW5nRmF1bHQpOwotICAgIH0KLSAgICByZXR1cm4gaGFzaE1hcDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldEVPcGVyYXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE9wZXJhdGlvbihqYXZheC53c2RsLk9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBzZXRFT3BlcmF0aW9uKChPcGVyYXRpb24pIG9wZXJhdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgZ2V0QmluZGluZ0lucHV0KCkKLSAgewotICAgIHJldHVybiBnZXRFQmluZGluZ0lucHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogU2V0IHRoZSBpbnB1dCBvZiB0aGlzIG9wZXJhdGlvbiBiaW5kaW5nLgotICAgKiBAcGFyYW0gaW5wdXQgdGhlIGRlc2lyZWQgaW5wdXQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nSW5wdXQoamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0KQotICB7Ci0gICAgc2V0RUJpbmRpbmdJbnB1dCgoQmluZGluZ0lucHV0KSBiaW5kaW5nSW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZ091dHB1dCBnZXRCaW5kaW5nT3V0cHV0KCkKLSAgewotICAgIHJldHVybiBnZXRFQmluZGluZ091dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFNldCB0aGUgb3V0cHV0IG9mIHRoaXMgb3BlcmF0aW9uIGJpbmRpbmcuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QmluZGluZ091dHB1dChqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCkKLSAgewotICAgIHNldEVCaW5kaW5nT3V0cHV0KChCaW5kaW5nT3V0cHV0KSBiaW5kaW5nT3V0cHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQ6Ci0gICAgICAgICAgcmV0dXJuIGJhc2ljU2V0RUJpbmRpbmdJbnB1dChudWxsLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVCaW5kaW5nT3V0cHV0KG51bGwsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19GQVVMVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFQmluZGluZ0ZhdWx0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VPUEVSQVRJT046Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RU9wZXJhdGlvbigpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFT3BlcmF0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19JTlBVVDoKLSAgICAgICAgcmV0dXJuIGdldEVCaW5kaW5nSW5wdXQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVDoKLSAgICAgICAgcmV0dXJuIGdldEVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19GQVVMVFM6Ci0gICAgICAgIHJldHVybiBnZXRFQmluZGluZ0ZhdWx0cygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTjoKLSAgICAgICAgc2V0RU9wZXJhdGlvbigoT3BlcmF0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQ6Ci0gICAgICAgIHNldEVCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX09VVFBVVDoKLSAgICAgICAgc2V0RUJpbmRpbmdPdXRwdXQoKEJpbmRpbmdPdXRwdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19GQVVMVFM6Ci0gICAgICAgIGdldEVCaW5kaW5nRmF1bHRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUJpbmRpbmdGYXVsdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VPUEVSQVRJT046Ci0gICAgICAgIHNldEVPcGVyYXRpb24oKE9wZXJhdGlvbiludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQ6Ci0gICAgICAgIHNldEVCaW5kaW5nSW5wdXQoKEJpbmRpbmdJbnB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUOgotICAgICAgICBzZXRFQmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICBnZXRFQmluZGluZ0ZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FT1BFUkFUSU9OOgotICAgICAgICByZXR1cm4gZU9wZXJhdGlvbiAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfSU5QVVQ6Ci0gICAgICAgIHJldHVybiBlQmluZGluZ0lucHV0ICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OX19FQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHJldHVybiBlQmluZGluZ091dHB1dCAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdGYXVsdHMgIT0gbnVsbCAmJiAhZUJpbmRpbmdGYXVsdHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIFN0cmluZyBuYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzZXROYW1lKG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBzd2l0Y2ggKFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoY2hpbGQpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5JTlBVVCA6Ci0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdJbnB1dCBpbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgaW5wdXQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgaW5wdXQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIHNldEJpbmRpbmdJbnB1dChpbnB1dCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk9VVFBVVCA6Ci0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPdXRwdXQgb3V0cHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICAgICAgb3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIG91dHB1dC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgc2V0QmluZGluZ091dHB1dChvdXRwdXQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5GQVVMVCA6Ci0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdGYXVsdCBmYXVsdCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICAgICAgZmF1bHQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgZmF1bHQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGFkZEJpbmRpbmdGYXVsdChmYXVsdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQscmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHJlbW92ZSh0aGlzLCBpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKE9iamVjdCBjb21wb25lbnQsIE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBjb21wb25lbnQ7Ci0gICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0RUJpbmRpbmdJbnB1dChudWxsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0RUJpbmRpbmdPdXRwdXQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KQotICAgIHsKLSAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKS5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBjb21wb25lbnQ7Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZChiaW5kaW5nT3BlcmF0aW9uLmdldEVCaW5kaW5nSW5wdXQoKSk7Ci0gICAgfQotCi0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKSk7Ci0gICAgfQotCi0gICAgbGlzdC5hZGRBbGwoYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpKTsKLSAgICBsaXN0LmFkZEFsbChiaW5kaW5nT3BlcmF0aW9uLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0KLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QmluZGluZ09wZXJhdGlvbl9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5PUEVSQVRJT04pOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSBnZXRFQmluZGluZ0lucHV0KCk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoQmluZGluZ0lucHV0SW1wbCkgaW5wdXQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIEJpbmRpbmdPdXRwdXQgb3V0cHV0ID0gZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLSAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoQmluZGluZ091dHB1dEltcGwpIG91dHB1dCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFQmluZGluZ0ZhdWx0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBCaW5kaW5nRmF1bHQgZmF1bHQgPSAoQmluZGluZ0ZhdWx0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChCaW5kaW5nRmF1bHRJbXBsKSBmYXVsdCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0gIAotICAvLyBSZXNvbHZlIHRoZSByZWZlcmVuY2UgdG8gT3BlcmF0aW9uCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZylnZXRDb250YWluZXIoKTsKLSAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYmluZGluZy5nZXRFUG9ydFR5cGUoKTsKLSAgICAgIGlmIChwb3J0VHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBzZXRPcGVyYXRpb24ocG9ydFR5cGUuZ2V0T3BlcmF0aW9uKGdldE5hbWUoKSxudWxsLG51bGwpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3VwZXIucmVjb25jaWxlUmVmZXJlbmNlcyhkZWVwKTsKLSAgfQotfSAvL0JpbmRpbmdPcGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ091dHB1dEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nT3V0cHV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJmYTRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nT3V0cHV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJpbmRpbmcgT3V0cHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuQmluZGluZ091dHB1dEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkJpbmRpbmdPdXRwdXRJbXBsI2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5kaW5nT3V0cHV0SW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEJpbmRpbmdPdXRwdXQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU91dHB1dCgpIDxlbT5FT3V0cHV0PC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFT3V0cHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIE91dHB1dCBlT3V0cHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3V0cHV0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgZ2V0RU91dHB1dCgpCi0gIHsKLSAgICBpZiAoZU91dHB1dCAhPSBudWxsICYmIGVPdXRwdXQuZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBPdXRwdXQgb2xkRU91dHB1dCA9IGVPdXRwdXQ7Ci0gICAgICBlT3V0cHV0ID0gKE91dHB1dCllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZU91dHB1dCk7Ci0gICAgICBpZiAoZU91dHB1dCAhPSBvbGRFT3V0cHV0KQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FT1VUUFVULCBvbGRFT3V0cHV0LCBlT3V0cHV0KSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlT3V0cHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3V0cHV0IGJhc2ljR2V0RU91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZU91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RU91dHB1dChPdXRwdXQgbmV3RU91dHB1dCkKLSAgewotICAgIE91dHB1dCBvbGRFT3V0cHV0ID0gZU91dHB1dDsKLSAgICBlT3V0cHV0ID0gbmV3RU91dHB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRU9VVFBVVCwgb2xkRU91dHB1dCwgZU91dHB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuT3V0cHV0IGdldE91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU91dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHNldEVPdXRwdXQoKE91dHB1dCkgb3V0cHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRU9VVFBVVDoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRFT3V0cHV0KCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVPdXRwdXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VPVVRQVVQ6Ci0gICAgICAgIHNldEVPdXRwdXQoKE91dHB1dCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fTkFNRToKLSAgICAgICAgc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRU9VVFBVVDoKLSAgICAgICAgc2V0RU91dHB1dCgoT3V0cHV0KW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCAmJiAhZUV4dGVuc2liaWxpdHlFbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1VUUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVF9fRU9VVFBVVDoKLSAgICAgICAgcmV0dXJuIGVPdXRwdXQgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5yZW1vdmUoaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gKEJpbmRpbmdPdXRwdXQpIGNvbXBvbmVudDsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGRBbGwoYmluZGluZ091dHB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRCaW5kaW5nT3V0cHV0X05hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXROYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLk9VVFBVVCk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotICAKLSAgLy8gUmVzb2x2ZSB0aGUgcmVmZXJlbmNlIHRvIE91dHB1dAotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBib3AgPSAoQmluZGluZ09wZXJhdGlvbilnZXRDb250YWluZXIoKTsKLSAgICAgIE9wZXJhdGlvbiBvcCA9IGJvcC5nZXRFT3BlcmF0aW9uKCk7Ci0gICAgICBpZiAob3AgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0T3V0cHV0KG9wLmdldEVPdXRwdXQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLX0gLy9CaW5kaW5nT3V0cHV0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0RlZmluaXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRGVmaW5pdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmYmIyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTREltcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmV2ZW50cy5FdmVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ldmVudHMuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcudzNjLmRvbS5ldmVudHMuRXZlbnRUYXJnZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uZXZlbnRzLk11dGF0aW9uRXZlbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RW5jb2RpbmcgPGVtPkVuY29kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RU1lc3NhZ2VzIDxlbT5FTWVzc2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFUG9ydFR5cGVzIDxlbT5FUG9ydCBUeXBlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVCaW5kaW5ncyA8ZW0+RUJpbmRpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRGVmaW5pdGlvbkltcGwjZ2V0RVNlcnZpY2VzIDxlbT5FU2VydmljZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFTmFtZXNwYWNlcyA8ZW0+RU5hbWVzcGFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5EZWZpbml0aW9uSW1wbCNnZXRFVHlwZXMgPGVtPkVUeXBlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkRlZmluaXRpb25JbXBsI2dldEVJbXBvcnRzIDxlbT5FSW1wb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlZmluaXRpb25JbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVmaW5pdGlvbgotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldExvY2F0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbiA9IExPQ0FUSU9OX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UU5hbWUoKSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBxTmFtZSA9IFFOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5jb2RpbmcoKSA8ZW0+RW5jb2Rpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVuY29kaW5nKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmNvZGluZygpIDxlbT5FbmNvZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RW5jb2RpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nID0gRU5DT0RJTkdfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVNZXNzYWdlcygpIDxlbT5FTWVzc2FnZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU1lc3NhZ2VzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVNZXNzYWdlcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVQb3J0VHlwZXMoKSA8ZW0+RVBvcnQgVHlwZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVBvcnRUeXBlcygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlUG9ydFR5cGVzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUJpbmRpbmdzKCkgPGVtPkVCaW5kaW5nczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFQmluZGluZ3MoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZUJpbmRpbmdzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVNlcnZpY2VzKCkgPGVtPkVTZXJ2aWNlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFU2VydmljZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZVNlcnZpY2VzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU5hbWVzcGFjZXMoKSA8ZW0+RU5hbWVzcGFjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU5hbWVzcGFjZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZU5hbWVzcGFjZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFVHlwZXMoKSA8ZW0+RVR5cGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFVHlwZXMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgVHlwZXMgZVR5cGVzID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUltcG9ydHMoKSA8ZW0+RUltcG9ydHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUltcG9ydHMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZUltcG9ydHMgPSBudWxsOwotCi0gIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIHByaXZhdGUgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIHByaXZhdGUgSGFzaE1hcCBuYW1lc3BhY2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBEZWZpbml0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBuZXdUYXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICBTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgIHRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFLCBvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKQotICB7Ci0gICAgU3RyaW5nIG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG5ld1FOYW1lKQotICB7Ci0gICAgUU5hbWUgb2xkUU5hbWUgPSBxTmFtZTsKLSAgICBxTmFtZSA9IG5ld1FOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FLCBvbGRRTmFtZSwgcU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpCi0gIHsKLSAgICByZXR1cm4gZW5jb2Rpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBuZXdFbmNvZGluZykKLSAgewotICAgIFN0cmluZyBvbGRFbmNvZGluZyA9IGVuY29kaW5nOwotICAgIGVuY29kaW5nID0gbmV3RW5jb2Rpbmc7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkcsIG9sZEVuY29kaW5nLCBlbmNvZGluZykpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RU1lc3NhZ2VzKCkKLSAgewotICAgIGlmIChlTWVzc2FnZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlTWVzc2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZS5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVNZXNzYWdlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVQb3J0VHlwZXMoKQotICB7Ci0gICAgaWYgKGVQb3J0VHlwZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlUG9ydFR5cGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnRUeXBlLmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FUE9SVF9UWVBFUyk7Ci0gICAgfQotICAgIHJldHVybiBlUG9ydFR5cGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUJpbmRpbmdzKCkKLSAgewotICAgIGlmIChlQmluZGluZ3MgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlQmluZGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmluZGluZy5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUJJTkRJTkdTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVCaW5kaW5nczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVTZXJ2aWNlcygpCi0gIHsKLSAgICBpZiAoZVNlcnZpY2VzID09IG51bGwpCi0gICAgewotICAgICAgZVNlcnZpY2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2UuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VTRVJWSUNFUyk7Ci0gICAgfQotICAgIHJldHVybiBlU2VydmljZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQGRlcHJlY2F0ZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFTmFtZXNwYWNlcygpCi0gIHsKLSAgICBpZiAoZU5hbWVzcGFjZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlTmFtZXNwYWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChOYW1lc3BhY2UuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQU1FU1BBQ0VTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVOYW1lc3BhY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgVHlwZXMgZ2V0RVR5cGVzKCkKLSAgewotICAgIHJldHVybiBlVHlwZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVUeXBlcyhUeXBlcyBuZXdFVHlwZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBUeXBlcyBvbGRFVHlwZXMgPSBlVHlwZXM7Ci0gICAgZVR5cGVzID0gbmV3RVR5cGVzOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTLCBvbGRFVHlwZXMsIG5ld0VUeXBlcyk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFVHlwZXMoVHlwZXMgbmV3RVR5cGVzKQotICB7Ci0gICAgaWYgKG5ld0VUeXBlcyAhPSBlVHlwZXMpCi0gICAgewotICAgICAgTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0gICAgICBpZiAoZVR5cGVzICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllVHlwZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVMsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VUeXBlcyAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RVR5cGVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTLCBudWxsLCBtc2dzKTsKLSAgICAgIG1zZ3MgPSBiYXNpY1NldEVUeXBlcyhuZXdFVHlwZXMsIG1zZ3MpOwotICAgICAgaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VUWVBFUywgbmV3RVR5cGVzLCBuZXdFVHlwZXMpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbXNnKQotICB7Ci0gICAgc3VwZXIuZU5vdGlmeShtc2cpOwotICAgIAotICAgIC8vIGNzLi4gaWYgd2UndmUgYWRkZWQgYSBUeXBlcyBlbGVtZW50LCBhbmQgdGhpcyBkZWZpbml0aW9uIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSByZXNvdXJjZQotICAgIC8vIHdlIG5lZWQgdG8gc2V0IHRoZSBzY2hlbWFMb2NhdGlvbnMgZm9yIGFueSBpbmxpbmUgc2NoZW1hTG9jYXRpb25zLgotICAgIC8vIElmIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgdGhlIHNjaGVtYUxvY2F0aW9uJ3Mgd2lsbCBiZSBzZXQgdmlhIFdTRExSZXNvdXJjZUltcGwuYXR0YWNoZWQoRU9iamVjdCBvKQotICAgIC8vCi0gICAgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRVR5cGVzKCkgJiYKLSAgICAgICAgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQpCi0gICAgewotICAgICAgaWYgKGVSZXNvdXJjZSgpIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCAmJiBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2V0SW5saW5lU2NoZW1hTG9jYXRpb25zKGVSZXNvdXJjZSgpKTsKLSAgICAgIH0gICAgCi0gICAgfSAgICAgICAgCi0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFSW1wb3J0cygpCi0gIHsKLSAgICBpZiAoZUltcG9ydHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlSW1wb3J0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbXBvcnQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVJbXBvcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIGJpbmRpbmcgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gYmluZGluZyB0aGUgYmluZGluZyB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEJpbmRpbmcoamF2YXgud3NkbC5CaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBnZXRFQmluZGluZ3MoKS5hZGQoKEJpbmRpbmcpIGJpbmRpbmcpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhbiBpbXBvcnQgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gaW1wb3J0RGVmIHRoZSBpbXBvcnQgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRJbXBvcnQoamF2YXgud3NkbC5JbXBvcnQgaW1wb3J0RGVmKQotICB7Ci0gICAgZ2V0RUltcG9ydHMoKS5hZGQoKEltcG9ydCkgaW1wb3J0RGVmKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoaXMgV1NETCBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGphdmF4LndzZGwuTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgZ2V0RU1lc3NhZ2VzKCkuYWRkKChNZXNzYWdlKW1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaXMgYSB3YXkgdG8gYWRkIGEgbmFtZXNwYWNlIGFzc29jaWF0aW9uIHRvIGEgZGVmaW5pdGlvbi4KLSAgICogSXQgaXMgc2ltaWxhciB0byBhZGRpbmcgYSBuYW1lc3BhY2UgcHJlZml4IGRlY2xhcmF0aW9uIHRvIHRoZQotICAgKiB0b3Agb2YgYSAmbHQ7d3NkbDpkZWZpbml0aW9uJmd0OyBlbGVtZW50LiBUaGlzIGhhcyBub3RoaW5nIHRvIGRvCi0gICAqIHdpdGggdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudDsgdGhlcmUgYXJlIHNlcGFyYXRlIG1ldGhvZHMgZm9yCi0gICAqIGRlYWxpbmcgd2l0aCBpbmZvcm1hdGlvbiBkZXNjcmliZWQgYnkgJmx0O3dzZGw6aW1wb3J0Jmd0OyBlbGVtZW50cy4KLSAgICogVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZSBhc3NvY2lhdGlvbiAod2hpY2ggY2FuIGJlCi0gICAqIG92ZXJyaWRkZW4pIGJldHdlZW4gdGhlIG51bGwgcHJlZml4IGFuZAotICAgKiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLy4KLSAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IHRvIHVzZSBmb3IgdGhpcyBuYW1lc3BhY2UgKHdoZW4KLSAgICogcmVuZGVyaW5nIHRoaXMgaW5mb3JtYXRpb24gYXMgWE1MKS4gVXNlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nCi0gICAqIHRvIGRlc2NyaWJlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSAoaS5lLiB4bWxucz0iLi4uIikuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgdGhlIG5hbWVzcGFjZSBVUkkgdG8gYXNzb2NpYXRlIHRoZSBwcmVmaXgKLSAgICogd2l0aC4gSWYgeW91IHVzZSBudWxsLCB0aGUgbmFtZXNwYWNlIGFzc29jaWF0aW9uIHdpbGwgYmUgcmVtb3ZlZC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgewotICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgIHByZWZpeCA9ICIiOwotCi0gICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEZpcnN0LCBjaGVjayBpZiB0aGVyZSBpcyB0aGlzIG5hbWVzcGFjZSBhbHJlYWR5LgotICAgICAgU3RyaW5nIGV4aXN0aW5nUHJlZml4ID0gZ2V0UHJlZml4KG5hbWVzcGFjZVVSSSk7Ci0gICAgICBpZiAoZXhpc3RpbmdQcmVmaXggIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZWZpeCBpcyBub3QgYWxyZWFkeSB1c2VkIGZvciBhIGRpZmZlcmVudCBuYW1lc3BhY2UKLSAgICAgIE1hcCBuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlcygpOwotICAgICAgU3RyaW5nIGV4aXN0aW5nTmFtZXNwYWNlID0gKFN0cmluZykgbmFtZXNwYWNlcy5nZXQocHJlZml4KTsKLSAgICAgIGlmIChleGlzdGluZ05hbWVzcGFjZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBuYW1lc3BhY2VzLnB1dChwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIAotICAgICAgICAvLyBTdXBwb3J0IGZvciBOYW1lc3BhY2UKLSAgICAgICAgTmFtZXNwYWNlIGVucyA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOYW1lc3BhY2UoKTsKLSAgICAgICAgZW5zLnNldFByZWZpeChwcmVmaXgpOwotICAgICAgICBlbnMuc2V0VVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuYWRkKGVucyk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIFRoZSBwcmVmaXggaXMgdGFrZW4gYWxyZWFkeS4gTWFrZSBhIHVuaXF1ZSBwcmVmaXgKLSAgICAgIGlmIChwcmVmaXguZW5kc1dpdGgoIjEiKSkKLSAgICAgICAgcHJlZml4ID0gcHJlZml4LnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDI7OyBpKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXdQcmVmaXggPSBwcmVmaXggKyBpOwotICAgICAgICBpZiAoIW5hbWVzcGFjZXMuY29udGFpbnNLZXkobmV3UHJlZml4KSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVzcGFjZXMucHV0KG5ld1ByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAKLSAgICAgICAgICAvLyBTdXBwb3J0IGZvciBOYW1lc3BhY2UKLSAgICAgICAgICBOYW1lc3BhY2UgZW5zID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU5hbWVzcGFjZSgpOwotICAgICAgICAgIGVucy5zZXRQcmVmaXgocHJlZml4KTsKLSAgICAgICAgICBlbnMuc2V0VVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5hZGQoZW5zKTsKLSAgICAgICAgICAKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IC8vIGVuZCBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGdldE5hbWVzcGFjZXMoKS5yZW1vdmUocHJlZml4KTsKLSAgICAgIAotICAgICAgLy8gU3VwcG9ydCBmb3IgTmFtZXNwYWNlCi0gICAgICBnZXRFTmFtZXNwYWNlcygpLnJlbW92ZShwcmVmaXgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBwb3J0VHlwZSB0byB0aGlzIFdTREwgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBwb3J0VHlwZSB0aGUgcG9ydFR5cGUgdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQb3J0VHlwZShqYXZheC53c2RsLlBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgZ2V0RVBvcnRUeXBlcygpLmFkZCgoUG9ydFR5cGUpcG9ydFR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIHNlcnZpY2UgdG8gdGhpcyBXU0RMIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gc2VydmljZSB0aGUgc2VydmljZSB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFNlcnZpY2UoamF2YXgud3NkbC5TZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBnZXRFU2VydmljZXMoKS5hZGQoKFNlcnZpY2Upc2VydmljZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGJpbmRpbmcgZmF1bHQuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZyBmYXVsdAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCkKLSAgewotICAgIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgYmluZGluZyBpbnB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBiaW5kaW5nIGlucHV0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdJbnB1dCBjcmVhdGVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICByZXR1cm4gYmluZGluZ0lucHV0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBiaW5kaW5nIG91dHB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBiaW5kaW5nIG91dHB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3V0cHV0IGNyZWF0ZUJpbmRpbmdPdXRwdXQoKQotICB7Ci0gICAgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICByZXR1cm4gYmluZGluZ091dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZyBvcGVyYXRpb24KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCkKLSAgewotICAgIGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmcgY3JlYXRlQmluZGluZygpCi0gIHsKLSAgICBqYXZheC53c2RsLkJpbmRpbmcgYmluZGluZyA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZygpOwotICAgIGJpbmRpbmcuc2V0VW5kZWZpbmVkKHRydWUpOwotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBmYXVsdC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBmYXVsdAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBGYXVsdCBjcmVhdGVGYXVsdCgpCi0gIHsKLSAgICBqYXZheC53c2RsLkZhdWx0IGZhdWx0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVGYXVsdCgpOwotICAgIHJldHVybiBmYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgaW1wb3J0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGltcG9ydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkltcG9ydCBjcmVhdGVJbXBvcnQoKQotICB7Ci0gICAgamF2YXgud3NkbC5JbXBvcnQgaW1wb3J0RGVmID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICByZXR1cm4gaW1wb3J0RGVmOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBpbnB1dC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBpbnB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBjcmVhdGVJbnB1dCgpCi0gIHsKLSAgICBqYXZheC53c2RsLklucHV0IGlucHV0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgbWVzc2FnZS4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBtZXNzYWdlCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkKLSAgewotICAgIGphdmF4LndzZGwuTWVzc2FnZSBtZXNzYWdlID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgbWVzc2FnZS5zZXRVbmRlZmluZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IG9wZXJhdGlvbi4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBvcGVyYXRpb24KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpCi0gIHsKLSAgICBqYXZheC53c2RsLk9wZXJhdGlvbiBvcGVyYXRpb24gPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbi5zZXRVbmRlZmluZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgb3V0cHV0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG91dHB1dAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgY3JlYXRlT3V0cHV0KCkKLSAgewotICAgIGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgcmV0dXJuIG91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBDcmVhdGUgYSBuZXcgcGFydC4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBwYXJ0Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIFBhcnQgY3JlYXRlUGFydCgpCi0gIHsKLSAgICBqYXZheC53c2RsLlBhcnQgcGFydCA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlUGFydCgpOwotICAgIHJldHVybiBwYXJ0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIENyZWF0ZSBhIG5ldyBwb3J0LgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHBvcnQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkKLSAgewotICAgIGphdmF4LndzZGwuUG9ydCBwb3J0ID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVQb3J0KCk7Ci0gICAgcmV0dXJuIHBvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IHBvcnQgdHlwZS4KLSAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBwb3J0IHR5cGUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpCi0gIHsKLSAgICBqYXZheC53c2RsLlBvcnRUeXBlIHBvcnRUeXBlID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIHBvcnRUeXBlLnNldFVuZGVmaW5lZCh0cnVlKTsKLSAgICByZXR1cm4gcG9ydFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQ3JlYXRlIGEgbmV3IHNlcnZpY2UuCi0gICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgc2VydmljZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgY3JlYXRlU2VydmljZSgpCi0gIHsKLSAgICBqYXZheC53c2RsLlNlcnZpY2Ugc2VydmljZSA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZSgpOwotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGJpbmRpbmcuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgYmluZGluZy4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBiaW5kaW5nLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgYmluZGluZwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmcgZ2V0QmluZGluZyhRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLkJpbmRpbmcpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLkJJTkRJTkcsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGJpbmRpbmdzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldEJpbmRpbmdzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5CSU5ESU5HLCBnZXRFQmluZGluZ3MoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAqIEdldCBhIG1hcCBvZiBsaXN0cyBjb250YWluaW5nIGFsbCB0aGUgaW1wb3J0cyBkZWZpbmVkIGhlcmUuCi0gICAgKiBUaGUgbWFwJ3Mga2V5cyBhcmUgdGhlIG5hbWVzcGFjZVVSSXMsIGFuZCB0aGUgbWFwJ3MgdmFsdWVzCi0gICAgKiBhcmUgbGlzdHMuIFRoZXJlIGlzIG9uZSBsaXN0IGZvciBlYWNoIG5hbWVzcGFjZVVSSSBmb3Igd2hpY2gKLSAgICAqIGltcG9ydHMgaGF2ZSBiZWVuIGRlZmluZWQuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRJbXBvcnRzKCkKLSAgewotICAgIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcga2V5ID0gdGhlSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgewotICAgICAgICBrZXkgPSAiIjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgTGlzdCBsaXN0ID0gbnVsbDsKLSAgICAgIGlmIChtYXAuY29udGFpbnNLZXkoa2V5KSkKLSAgICAgIHsKLSAgICAgICAgbGlzdCA9IChMaXN0KW1hcC5nZXQoa2V5KTsKLSAgICAgICAgbGlzdC5hZGQodGhlSW1wb3J0KTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGxpc3QuYWRkKHRoZUltcG9ydCk7ICAgICAgIAotICAgICAgfQotICAgICAgbWFwLnB1dChrZXksbGlzdCk7ICAgICAgCi0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBsaXN0IG9mIGltcG9ydHMgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlVVJJLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIHRoZSBuYW1lc3BhY2VVUkkgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgKiBkZXNpcmVkIGltcG9ydHMuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGltcG9ydHMKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRJbXBvcnRzKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgSW1wb3J0IHRoZUltcG9ydCA9IChJbXBvcnQpIGkubmV4dCgpOwotICAgICAgaWYgKFdTRExDb25zdGFudHMuaXNNYXRjaGluZ05hbWVzcGFjZShuYW1lc3BhY2VVUkksIHRoZUltcG9ydC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKHRoZUltcG9ydCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgbWVzc2FnZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgbWVzc2FnZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgZ2V0TWVzc2FnZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLk1lc3NhZ2UpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLk1FU1NBR0UsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE1lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5NRVNTQUdFLCBnZXRFTWVzc2FnZXMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBuYW1lc3BhY2UgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZpeC4gT3IgbnVsbCBpZgotICAgKiB0aGVyZSBpcyBubyBuYW1lc3BhY2UgVVJJIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWZpeC4gVGhpcyBpcwotICAgKiB1bnJlbGF0ZWQgdG8gdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudC4KLSAgICogQHNlZSAjYWRkTmFtZXNwYWNlKFN0cmluZywgU3RyaW5nKQotICAgKiBAc2VlICNnZXRQcmVmaXgoU3RyaW5nKQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgZ2V0TmFtZXNwYWNlcygpLmdldChwcmVmaXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgbmFtZXNwYWNlIGFzc29jaWF0aW9ucyBpbiB0aGlzIGRlZmluaXRpb24uIFRoZSBrZXlzIGFyZQotICAgKiB0aGUgcHJlZml4ZXMsIGFuZCB0aGUgbmFtZXNwYWNlIFVSSXMgYXJlIHRoZSB2YWx1ZXMuIFRoaXMgaXMKLSAgICogdW5yZWxhdGVkIHRvIHRoZSAmbHQ7d3NkbDppbXBvcnQmZ3Q7IGVsZW1lbnQuCi0gICAqIEBzZWUgI2FkZE5hbWVzcGFjZShTdHJpbmcsIFN0cmluZykKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldE5hbWVzcGFjZXMoKQotICB7ICAgIAotICAgIHJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIHBvcnRUeXBlLiBBbHNvIGNoZWNrcyBpbXBvcnRlZCBkb2N1bWVudHMuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBvcnRUeXBlLgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHBvcnRUeXBlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcG9ydFR5cGUKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSBnZXRQb3J0VHlwZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlBvcnRUeXBlKSByZXNvbHZlV1NETEVsZW1lbnQoV1NETENvbnN0YW50cy5QT1JUX1RZUEUsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHBvcnRUeXBlcyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRQb3J0VHlwZXMoKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZU1hcChXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSwgZ2V0RVBvcnRUeXBlcygpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYSBwcmVmaXggYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlIFVSSS4gT3IgbnVsbCBpZgotICAgKiB0aGVyZSBhcmUgbm8gcHJlZml4ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbmFtZXNwYWNlIFVSSS4gVGhpcyBpcwotICAgKiB1bnJlbGF0ZWQgdG8gdGhlICZsdDt3c2RsOmltcG9ydCZndDsgZWxlbWVudC4KLSAgICogQHNlZSAjYWRkTmFtZXNwYWNlKFN0cmluZywgU3RyaW5nKQotICAgKiBAc2VlICNnZXROYW1lc3BhY2UoU3RyaW5nKQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIEl0ZXJhdG9yIGVudHJ5SXRlcmF0b3IgPSBnZXROYW1lc3BhY2VzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChlbnRyeUl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBlbnRyeUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIFN0cmluZyBhc3NvY05hbWVzcGFjZVVSSSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKGFzc29jTmFtZXNwYWNlVVJJKSAmJiBwcmVmaXggIT0gIiIpIC8vIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIHNlcnZpY2UuIEFsc28gY2hlY2tzIGltcG9ydGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgc2VydmljZS4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBzZXJ2aWNlLCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgc2VydmljZQotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgZ2V0U2VydmljZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlNlcnZpY2UpIHJlc29sdmVXU0RMRWxlbWVudChXU0RMQ29uc3RhbnRzLlNFUlZJQ0UsIG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIHNlcnZpY2VzIGRlZmluZWQgaGVyZS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTWFwIGdldFNlcnZpY2VzKCkKLSAgewotICAgIHJldHVybiBjcmVhdGVNYXAoV1NETENvbnN0YW50cy5TRVJWSUNFLCBnZXRFU2VydmljZXMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBFeHRlbnNpb25SZWdpc3RyeSBmb3IgdGhpcyBEZWZpbml0aW9uLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogU2V0IHRoZSBFeHRlbnNpb25SZWdpc3RyeSBmb3IgdGhpcyBEZWZpbml0aW9uLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQotICB7Ci0gICAgdGhpcy5leHRlbnNpb25SZWdpc3RyeSA9IGV4dGVuc2lvblJlZ2lzdHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREb2N1bWVudEJhc2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEJhc2VVUkkoU3RyaW5nIGRvY3VtZW50QmFzZSkKLSAgewotICAgIHNldExvY2F0aW9uKGRvY3VtZW50QmFzZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5UeXBlcyBjcmVhdGVUeXBlcygpCi0gIHsKLSAgICBqYXZheC53c2RsLlR5cGVzIHR5cGVzID0gV1NETEZhY3RvcnlJbXBsLmVJTlNUQU5DRS5jcmVhdGVUeXBlcygpOwotICAgIHJldHVybiB0eXBlczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlNlcnZpY2UgcmVtb3ZlU2VydmljZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlNlcnZpY2UpIGdldFNlcnZpY2VzKCkucmVtb3ZlKG5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuQmluZGluZyByZW1vdmVCaW5kaW5nKFFOYW1lIG5hbWUpCi0gIHsKLSAgICByZXR1cm4gKGphdmF4LndzZGwuQmluZGluZykgZ2V0QmluZGluZ3MoKS5yZW1vdmUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0VHlwZSByZW1vdmVQb3J0VHlwZShRTmFtZSBuYW1lKQotICB7Ci0gICAgcmV0dXJuIChqYXZheC53c2RsLlBvcnRUeXBlKSBnZXRQb3J0VHlwZXMoKS5yZW1vdmUobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5NZXNzYWdlIHJlbW92ZU1lc3NhZ2UoUU5hbWUgbmFtZSkKLSAgewotICAgIHJldHVybiAoamF2YXgud3NkbC5NZXNzYWdlKSBnZXRNZXNzYWdlcygpLnJlbW92ZShuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlR5cGVzIGdldFR5cGVzKCkKLSAgewotICAgIHJldHVybiBnZXRFVHlwZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVzKGphdmF4LndzZGwuVHlwZXMgdHlwZXMpCi0gIHsKLSAgICBzZXRFVHlwZXMoKFR5cGVzKSB0eXBlcyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFNldHMgdGhlIG93bmVyIGRvY3VtZW50LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RU1lc3NhZ2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FUE9SVF9UWVBFUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVQb3J0VHlwZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVCaW5kaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVNFUlZJQ0VTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVNlcnZpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkFNRVNQQUNFUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVOYW1lc3BhY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgICAgcmV0dXJuIGJhc2ljU2V0RVR5cGVzKG51bGwsIG1zZ3MpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUltcG9ydHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTjoKLSAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICByZXR1cm4gZ2V0UU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkc6Ci0gICAgICAgIHJldHVybiBnZXRFbmNvZGluZygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIHJldHVybiBnZXRFTWVzc2FnZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIHJldHVybiBnZXRFUG9ydFR5cGVzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgcmV0dXJuIGdldEVCaW5kaW5ncygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FU0VSVklDRVM6Ci0gICAgICAgIHJldHVybiBnZXRFU2VydmljZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5BTUVTUEFDRVM6Ci0gICAgICAgIHJldHVybiBnZXRFTmFtZXNwYWNlcygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHJldHVybiBnZXRFVHlwZXMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUlNUE9SVFM6Ci0gICAgICAgIHJldHVybiBnZXRFSW1wb3J0cygpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICBzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT046Ci0gICAgICAgIHNldExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HOgotICAgICAgICBzZXRFbmNvZGluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIGdldEVQb3J0VHlwZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFUG9ydFR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FQklORElOR1M6Ci0gICAgICAgIGdldEVCaW5kaW5ncygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVCaW5kaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVNFUlZJQ0VTOgotICAgICAgICBnZXRFU2VydmljZXMoKS5jbGVhcigpOwotICAgICAgICBnZXRFU2VydmljZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQU1FU1BBQ0VTOgotICAgICAgICBnZXRFTmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHNldEVUeXBlcygoVHlwZXMpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICBnZXRFSW1wb3J0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVJbXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1RBUkdFVF9OQU1FU1BBQ0U6Ci0gICAgICAgIHNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19MT0NBVElPTjoKLSAgICAgICAgc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX1FOQU1FOgotICAgICAgICBzZXRRTmFtZShRTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5DT0RJTkc6Ci0gICAgICAgIHNldEVuY29kaW5nKEVOQ09ESU5HX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTUVTU0FHRVM6Ci0gICAgICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVBPUlRfVFlQRVM6Ci0gICAgICAgIGdldEVQb3J0VHlwZXMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VCSU5ESU5HUzoKLSAgICAgICAgZ2V0RUJpbmRpbmdzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FU0VSVklDRVM6Ci0gICAgICAgIGdldEVTZXJ2aWNlcygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU5BTUVTUEFDRVM6Ci0gICAgICAgIGdldEVOYW1lc3BhY2VzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FVFlQRVM6Ci0gICAgICAgIHNldEVUeXBlcygoVHlwZXMpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUlNUE9SVFM6Ci0gICAgICAgIGdldEVJbXBvcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICByZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fTE9DQVRJT046Ci0gICAgICAgIHJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19RTkFNRToKLSAgICAgICAgcmV0dXJuIFFOQU1FX0VERUZBVUxUID09IG51bGwgPyBxTmFtZSAhPSBudWxsIDogIVFOQU1FX0VERUZBVUxULmVxdWFscyhxTmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VOQ09ESU5HOgotICAgICAgICByZXR1cm4gRU5DT0RJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGVuY29kaW5nICE9IG51bGwgOiAhRU5DT0RJTkdfRURFRkFVTFQuZXF1YWxzKGVuY29kaW5nKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRU1FU1NBR0VTOgotICAgICAgICByZXR1cm4gZU1lc3NhZ2VzICE9IG51bGwgJiYgIWVNZXNzYWdlcy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VQT1JUX1RZUEVTOgotICAgICAgICByZXR1cm4gZVBvcnRUeXBlcyAhPSBudWxsICYmICFlUG9ydFR5cGVzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRUJJTkRJTkdTOgotICAgICAgICByZXR1cm4gZUJpbmRpbmdzICE9IG51bGwgJiYgIWVCaW5kaW5ncy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VTRVJWSUNFUzoKLSAgICAgICAgcmV0dXJuIGVTZXJ2aWNlcyAhPSBudWxsICYmICFlU2VydmljZXMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ERUZJTklUSU9OX19FTkFNRVNQQUNFUzoKLSAgICAgICAgcmV0dXJuIGVOYW1lc3BhY2VzICE9IG51bGwgJiYgIWVOYW1lc3BhY2VzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTl9fRVRZUEVTOgotICAgICAgICByZXR1cm4gZVR5cGVzICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT05fX0VJTVBPUlRTOgotICAgICAgICByZXR1cm4gZUltcG9ydHMgIT0gbnVsbCAmJiAhZUltcG9ydHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiICh0YXJnZXROYW1lc3BhY2U6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGxvY2F0aW9uOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGxvY2F0aW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVuY29kaW5nOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVuY29kaW5nKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gSGFuZC1jb2RlZCBtZXRob2RzCi0gIC8vCi0KLSAgcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZVNldCBnbG9iYWxSZXNvdXJjZVNldDsKLQotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBSZXNvdXJjZVNldCBnZXRHbG9iYWxSZXNvdXJjZVNldCgpCi0gIHsKLSAgICBpZiAoZ2xvYmFsUmVzb3VyY2VTZXQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBnbG9iYWxSZXNvdXJjZVNldCA9IGNyZWF0ZVJlc291cmNlU2V0KCk7Ci0gICAgICAvL1N0cmluZyBiYXNlVVJMID0gV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRCYXNlVVJMKCkudG9TdHJpbmcoKTsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJCYXNlIFVSTCBpczogIiArIGJhc2VVUkwpOwotICAgIH0KLQotICAgIHJldHVybiBnbG9iYWxSZXNvdXJjZVNldDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlUmVzb3VyY2VTZXQoKQotICB7Ci0gICAgUmVzb3VyY2VTZXQgcmVzdWx0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAgIHJlc3VsdC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZURlZmluaXRpb24obm9kZSwgbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIERlZmluaXRpb24gY3JlYXRlRGVmaW5pdGlvbihOb2RlIG5vZGUsIFN0cmluZyBsb2NhdGlvbikKLSAgewotICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uKG5vZGUsbG9jYXRpb24sdHJ1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgRGVmaW5pdGlvbiBjcmVhdGVEZWZpbml0aW9uKE5vZGUgbm9kZSwgU3RyaW5nIGxvY2F0aW9uLCBib29sZWFuIHVzZUV4dGVuc2lvbkZhY3RvcmllcykKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgKChEZWZpbml0aW9uSW1wbClkZWZpbml0aW9uKS5zZXRVc2VFeHRlbnNpb25GYWN0b3JpZXModXNlRXh0ZW5zaW9uRmFjdG9yaWVzKTsKLSAgICBkZWZpbml0aW9uLnNldEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGxvY2F0aW9uKTsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotICAKLSAgcHJpdmF0ZSBXU0RMRWxlbWVudCByZXNvbHZlV1NETEVsZW1lbnQoaW50IHR5cGUsIExpc3QgbGlzdCwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgICAgUU5hbWUgdGhlUU5hbWUgPSBnZXRRTmFtZUZvcldTRExFbGVtZW50KHR5cGUsIHdzZGxFbGVtZW50KTsKLSAgICAgICAgaWYgKHFuYW1lLmVxdWFscyh0aGVRTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB3c2RsRWxlbWVudDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBIYXNoTWFwIGNyZWF0ZU1hcChpbnQgdHlwZSwgTGlzdCBsaXN0KQotICB7Ci0gICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIFFOYW1lIHRoZVFOYW1lID0gZ2V0UU5hbWVGb3JXU0RMRWxlbWVudCh0eXBlLCB3c2RsRWxlbWVudCk7Ci0gICAgICBpZiAodGhlUU5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWFwLnB1dCh0aGVRTmFtZSwgd3NkbEVsZW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLSAgcHJpdmF0ZSBRTmFtZSBnZXRRTmFtZUZvcldTRExFbGVtZW50KGludCB0eXBlLCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIFFOYW1lIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLSAgICAgICAgcmVzdWx0ID0gKChNZXNzYWdlKSB3c2RsRWxlbWVudCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuUE9SVF9UWVBFIDoKLSAgICAgICAgcmVzdWx0ID0gKChQb3J0VHlwZSkgd3NkbEVsZW1lbnQpLmdldFFOYW1lKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkJJTkRJTkcgOgotICAgICAgICByZXN1bHQgPSAoKEJpbmRpbmcpIHdzZGxFbGVtZW50KS5nZXRRTmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5TRVJWSUNFIDoKLSAgICAgICAgcmVzdWx0ID0gKChTZXJ2aWNlKSB3c2RsRWxlbWVudCkuZ2V0UU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiBUQkQgLSBSZXZpc2l0Ci0gICAqIExvb2sgZm9yIGFuIG9iamVjdCBpbiB0aGUgaW1wb3J0ZWQgZGVmaW5pdGlvbnMuCi0gICAqLwotICBwcml2YXRlIFdTRExFbGVtZW50IHJlc29sdmVXU0RMRWxlbWVudChpbnQgdHlwZSwgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSBxbmFtZSkKLSAgewotICAgIFdTRExFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RGVmaW5pdGlvbnMocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuTUVTU0FHRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSwgcW5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCksIHFuYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgV1NETENvbnN0YW50cy5CSU5ESU5HIDoKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlc29sdmVXU0RMRWxlbWVudCh0eXBlLCBkZWZpbml0aW9uLmdldEVCaW5kaW5ncygpLCBxbmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFdTRExDb25zdGFudHMuU0VSVklDRSA6Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlV1NETEVsZW1lbnQodHlwZSwgZGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKSwgcW5hbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLSAgLy8KLSAgLy8gUmVjb25jaWxpYXRpb24gbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRWxlbWVudCBvbGRFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmIChvbGRFbGVtZW50IGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpCi0gICAgewotICAgICAgRXZlbnRUYXJnZXQgb2xkRXZlbnRUYXJnZXQgPSAoKEV2ZW50VGFyZ2V0KW9sZEVsZW1lbnQpOwotICAgICAgb2xkRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NTm9kZUluc2VydGVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICAgIG9sZEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTU5vZGVSZW1vdmVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICAgIG9sZEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUF0dHJNb2RpZmllZCIsIGdldEV2ZW50TGlzdGVuZXIoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIHN1cGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFdmVudFRhcmdldCkKLSAgICB7Ci0gICAgICBFdmVudFRhcmdldCBldmVudFRhcmdldCA9ICgoRXZlbnRUYXJnZXQpZWxlbWVudCk7Ci0gICAgICBldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJET01Ob2RlSW5zZXJ0ZWQiLCBnZXRFdmVudExpc3RlbmVyKCksIHRydWUpOwotICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NTm9kZVJlbW92ZWQiLCBnZXRFdmVudExpc3RlbmVyKCksIHRydWUpOwotICAgICAgZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQXR0ck1vZGlmaWVkIiwgZ2V0RXZlbnRMaXN0ZW5lcigpLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgaWYgKGNoYW5nZWRFbGVtZW50ID09IGdldEVsZW1lbnQoKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgc2V0VGFyZ2V0TmFtZXNwYWNlKGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikpOwotICAgICAgc2V0UU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLCBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSkpOwotICAgICAgZ2V0RU5hbWVzcGFjZXMoKS5jbGVhcigpOwotICAgICAgZ2V0TmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0gICAgICAvL2dldE5hbWVzcGFjZXMoKS5wdXQoIiIsIG51bGwpOwotCi0gICAgICBOYW1lZE5vZGVNYXAgbWFwID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBtYXAuaXRlbShpKTsKLSAgICAgICAgU3RyaW5nIG5zUHJlZml4ID0gbnVsbDsKLSAgICAgICAgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0UHJlZml4KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgbnNQcmVmaXggPSBhdHRyLmdldExvY2FsTmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCJ4bWxucyIuZXF1YWxzKGF0dHIuZ2V0Tm9kZU5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuc1ByZWZpeCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5zUHJlZml4ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXROYW1lc3BhY2VzKCkucHV0KG5zUHJlZml4LCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkJJTkRJTkcgOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICAgICAgICBiaW5kaW5nLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgYmluZGluZy5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBDUzogd2UgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byB1bnNldCB0aGlzIGVsZW1lbnQgd2hlbiBpdHMgcmVtb3ZlZAotICAgICAgICAgIC8vZGVmaW5pdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChjaGlsZCk7ICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLklNUE9SVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbXBvcnQgaSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbXBvcnQoKTsKLSAgICAgICAgICBpLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgaS5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRJbXBvcnQoaSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5NRVNTQUdFIDoKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgICAgICAgbWVzc2FnZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHRoaXMpOwotICAgICAgICAgIG1lc3NhZ2Uuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYWRkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlRfVFlQRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgICAgICAgIHBvcnRUeXBlLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgcG9ydFR5cGUuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuU0VSVklDRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICAgICAgICBzZXJ2aWNlLnNldEVuY2xvc2luZ0RlZmluaXRpb24odGhpcyk7Ci0gICAgICAgICAgc2VydmljZS5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBhZGRTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuVFlQRVMgOgotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGdldEVUeXBlcygpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgVHlwZXMgdHlwZXMgPSBXU0RMRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVR5cGVzKCk7Ci0gICAgICAgICAgICB0eXBlcy5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKHRoaXMpOwotICAgICAgICAgICAgdHlwZXMuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgICBzZXRFVHlwZXModHlwZXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgZGVmYXVsdCA6Ci0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gZ2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkgPyAKLSAgICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICgoV1NETEZhY3RvcnlJbXBsKVdTRExGYWN0b3J5LmVJTlNUQU5DRSkuY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICAgIAkgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbih0aGlzKTsKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBUeXBlcykKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgICAgaWYgKGRlZmluaXRpb24uZ2V0RVR5cGVzKCkgPT0gbW9kZWxPYmplY3QpCi0gICAgICB7Ci0gICAgICAgIGRlZmluaXRpb24uc2V0RVR5cGVzKG51bGwpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChjb21wb25lbnQsIG1vZGVsT2JqZWN0KTsKLSAgICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0TGlzdChPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGNvbXBvbmVudDsKLQotICAgIC8vIHRvZG8uLi4gdXNlIFdTRExTd2l0Y2gKLSAgICAvLwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEJpbmRpbmcpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFQmluZGluZ3MoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBJbXBvcnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFSW1wb3J0cygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIE1lc3NhZ2UpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0VHlwZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBkZWZpbml0aW9uLmdldEVQb3J0VHlwZXMoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBTZXJ2aWNlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29tcG9uZW50OwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKSk7Ci0gICAgbGlzdC5hZGQoZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFTWVzc2FnZXMoKSk7Ci0gICAgbGlzdC5hZGRBbGwoZGVmaW5pdGlvbi5nZXRFUG9ydFR5cGVzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCkpOwotICAgIGxpc3QuYWRkQWxsKGRlZmluaXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0KLSAgcHVibGljIERvY3VtZW50IHVwZGF0ZURvY3VtZW50KCkKLSAgewotICAgIGRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKLSAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gIH0KLQotICBwcml2YXRlIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRCdWlsZGVyLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuREVGSU5JVElPTik7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIE9iamVjdCBvYmogPSBudWxsOwotCi0gICAgVHlwZXMgdHlwZXMgPSBnZXRFVHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChUeXBlc0ltcGwpIHR5cGVzKS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFSW1wb3J0cygpKTsKLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVNZXNzYWdlcygpKTsKLSAgICBhZGRDaGlsZEVsZW1lbnRzKG5ld0VsZW1lbnQsIGdldEVQb3J0VHlwZXMoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFQmluZGluZ3MoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFU2VydmljZXMoKSk7Ci0gICAgYWRkQ2hpbGRFbGVtZW50cyhuZXdFbGVtZW50LCBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZEVsZW1lbnRzKEVsZW1lbnQgcGFyZW50LCBMaXN0IGMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50SW1wbCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudEltcGwpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSB3c2RsRWxlbWVudC5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgICAvLyBBZGQgbmFtZXNwYWNlIHByZWZpeCBpbmZvCi0gICAgLy8gVEJEIC0gTmVlZCB0byByZXZpc2l0LgotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAoZVJlZmVyZW5jZSA9PSBudWxsICYmIHRoZUVsZW1lbnQgIT0gbnVsbCkgCi0gICAgLy8gV2UgYXJlIHVwZGF0aW5nIHRoZSBEZWZpbml0aW9uIGVsZW1lbnQuCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXROYW1lc3BhY2VzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gbnVsbDsKLSAgICAgIFN0cmluZyB1cmkgPSBudWxsOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBwcmVmaXggPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgdXJpID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHByZWZpeCAhPSAiIikKLSAgICAgICAgICB0aGVFbGVtZW50LnNldEF0dHJpYnV0ZU5TKFhTRENvbnN0YW50cy5YTUxOU19VUklfMjAwMCwgInhtbG5zOiIgKyBwcmVmaXgsIHVyaSk7Ci0gICAgICAgIGVsc2UgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICAgIC8vIEhhbmRsZSBkZWZhdWx0IG5hbWVzcGFjZSwgZS5nLiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgdGhlRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhYU0RDb25zdGFudHMuWE1MTlNfVVJJXzIwMDAsICJ4bWxucyIsIHVyaSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7ICAgIAotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOyAKLSAgICAKLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgLy9pZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fRW5jb2RpbmcoKSkKLSAgICAgIC8vICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuRU5DT0RJTkdfQVRUUklCVVRFLCBnZXRFbmNvZGluZygpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVmaW5pdGlvbl9RTmFtZSgpKQotICAgICAgICBpZiAoZ2V0UU5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCkpCi0gICAgICAgIGlmIChnZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5UQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFLCBnZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0RGVmaW5pdGlvbnMoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKG5hbWVzcGFjZSwgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKHRoaXMpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRJbXBvcnRzKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgICgoSW1wb3J0SW1wbCkgdGhlSW1wb3J0KS5pbXBvcnREZWZpbml0aW9uT3JTY2hlbWEoKTsKLSAgICAgIERlZmluaXRpb24gaW1wb3J0ZWREZWZpbml0aW9uID0gdGhlSW1wb3J0LmdldEVEZWZpbml0aW9uKCk7Ci0gICAgICBpZiAoaW1wb3J0ZWREZWZpbml0aW9uICE9IG51bGwgJiYgV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKG5hbWVzcGFjZSwgaW1wb3J0ZWREZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSkKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoaW1wb3J0ZWREZWZpbml0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwdWJsaWMgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc29sdmVFbGVtZW50RGVjbGFyYXRpb25VUkkoU3RyaW5nIHVyaSkKLSAgewotICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIGludCBpbmRleCA9IHVyaS5sYXN0SW5kZXhPZigiIyIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSByZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpLCB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlU2NoZW1hKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKSBpLm5leHQoKTsKLSAgICAgIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgLy8gQ291bGQgbm90IHJlc29sdmUuIFRyeSBhZ2FpbnN0IGFsbCA8aW1wb3J0PmVkIGFuZCBpbmxpbmVkIHNjaGVtYXMuCi0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0SW1wb3J0ZWRPcklubGluZWRTY2hlbWFzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWkubmV4dCgpOwotICAgICAgcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24obmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUeXBlRGVmaW5pdGlvblVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIiMiKTsKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gcmVzb2x2ZVR5cGVEZWZpbml0aW9uKHVyaS5zdWJzdHJpbmcoMCwgaW5kZXgpLCB1cmkuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUeXBlRGVmaW5pdGlvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvbHZlU2NoZW1hKG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWkubmV4dCgpOwotICAgICAgcmVzdWx0ID0gc2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbihuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIC8vIENvdWxkIG5vdCByZXNvbHZlLiBUcnkgYWdhaW5zdCBhbGwgPGltcG9ydD5lZCBhbmQgaW5saW5lZCBzY2hlbWFzLgotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEltcG9ydGVkT3JJbmxpbmVkU2NoZW1hcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSlpLm5leHQoKTsKLSAgICAgIHJlc3VsdCA9IHNjaGVtYS5yZXNvbHZlVHlwZURlZmluaXRpb24obmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OyAvLyBGYWlsZWQgdG8gcmVzb2x2ZS4KLSAgfQotCi0gIC8qKgotICAJKiBUaGlzIHJldHVybnMgc2V0IG9mIHNjaGVtYXMgd2l0aCB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGFzIGl0J3MgdGFyZ2V0IG5hbWVzcGFjZS4KLSAgCSovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIHJlc29sdmVTY2hlbWEoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIGlmICgiIi5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBudWxsOwotICAgIH0KLQotICAgIGlmIChYU0RDb25zdGFudHMuaXNTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UobmFtZXNwYWNlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKG5hbWVzcGFjZSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChYU0RDb25zdGFudHMuaXNTY2hlbWFJbnN0YW5jZU5hbWVzcGFjZShuYW1lc3BhY2UpKQotICAgIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFJbnN0YW5jZShuYW1lc3BhY2UpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBnZXRJbXBvcnRlZE9ySW5saW5lZFNjaGVtYXMobmFtZXNwYWNlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBMaXN0IGdldEltcG9ydGVkT3JJbmxpbmVkU2NoZW1hcyhTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVJbXBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEltcG9ydCB0aGVJbXBvcnQgPSAoSW1wb3J0KSBpLm5leHQoKTsKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UodGhlSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgICAoKEltcG9ydEltcGwpIHRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB0aGVJbXBvcnQuZ2V0RVNjaGVtYSgpOwotICAgICAgICBpZiAoc2NoZW1hICE9IG51bGwgJiYgV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmFtZXNwYWNlKSkKLSAgICAgICAgewotICAgICAgICAgIGxpc3QuYWRkKHNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGdldEVUeXBlcygpICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IChYU0RTY2hlbWEpIGkubmV4dCgpOwotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpZiAobmFtZXNwYWNlLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICB7ICAKLSAgICAgICAgICBsaXN0LmFkZChzY2hlbWEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSBzY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IGNvbXBvbmVudCA9IGoubmV4dCgpOwotICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBYU0RJbXBvcnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgWFNESW1wb3J0IHRoZUltcG9ydCA9IChYU0RJbXBvcnQpY29tcG9uZW50OwotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHModGhlSW1wb3J0LmdldE5hbWVzcGFjZSgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKChYU0RJbXBvcnRJbXBsKXRoZUltcG9ydCkuaW1wb3J0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIFhTRFNjaGVtYSBpbXBvcnRlZFNjaGVtYSA9IHRoZUltcG9ydC5nZXRSZXNvbHZlZFNjaGVtYSgpOyAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaWYgKGltcG9ydGVkU2NoZW1hICE9IG51bGwpCi0gICAgICAgICAgICAgIHsgIAotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGltcG9ydGVkU2NoZW1hKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICAgIAotICAgICAgfSAgICAgCi0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gIAotICBwcml2YXRlIExpc3QgZ2V0SW1wb3J0ZWRPcklubGluZWRTY2hlbWFzKCkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBJbXBvcnQgdGhlSW1wb3J0ID0gKEltcG9ydCkgaS5uZXh0KCk7Ci0gICAgICAoKEltcG9ydEltcGwpIHRoZUltcG9ydCkuaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCk7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gdGhlSW1wb3J0LmdldEVTY2hlbWEoKTsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgbGlzdC5hZGQoc2NoZW1hKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGdldEVUeXBlcygpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGRBbGwoZ2V0RVR5cGVzKCkuZ2V0U2NoZW1hcygpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBFdmVudExpc3RlbmVyIGV2ZW50TGlzdGVuZXI7Ci0gIHByb3RlY3RlZCBOb2RlIGRlbGV0aW9uTm9kZTsKLQotICBwdWJsaWMgTm9kZSBnZXREZWxldGlvbk5vZGUoKQotICB7Ci0gICAgcmV0dXJuIGRlbGV0aW9uTm9kZTsKLSAgfQotCi0gIHByb3RlY3RlZCBFdmVudExpc3RlbmVyIGdldEV2ZW50TGlzdGVuZXIoKQotICB7Ci0gICAgaWYgKGV2ZW50TGlzdGVuZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBldmVudExpc3RlbmVyID0gCi0gICAgICAgIG5ldyBFdmVudExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNdXRhdGlvbkV2ZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBNdXRhdGlvbkV2ZW50IG11dGF0aW9uRXZlbnQgPSAoTXV0YXRpb25FdmVudClldmVudDsKLSAgICAgICAgICAgICAgaWYgKG11dGF0aW9uRXZlbnQuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBOb2RlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpbXV0YXRpb25FdmVudC5nZXRUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uRXZlbnQuZ2V0QXR0ckNoYW5nZSgpID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGxpc3RlbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUuZ2V0UGFyZW50Tm9kZSgpKTsKLSAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscygiRE9NTm9kZVJlbW92ZWQiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uTm9kZSA9IChOb2RlKWV2ZW50LmdldFRhcmdldCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVsZW1lbnRDb250ZW50c0NoYW5nZWQoKEVsZW1lbnQpbm9kZS5nZXRQYXJlbnROb2RlKCkpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGlvbk5vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGxpc3RlbmVyID0gKFdTRExFbGVtZW50SW1wbClnZXRDb3JyZXNwb25kaW5nQ29tcG9uZW50KG5vZGUpOwotICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmVsZW1lbnRBdHRyaWJ1dGVzQ2hhbmdlZCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIHJldHVybiBldmVudExpc3RlbmVyOwotICB9Ci0gIAotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NvbXBvbmVudChOb2RlIG5vZGUpCi0gIHsKLSAgICAvLyBXZSBjb25zaWRlciBhbGwgcGFyZW50cyBzbyB0aGF0IHRoZXkgY2FuIGhhbmRsZSBvdGhlciBjb250YWluZWQgbm9kZXMgdGhhdCBvdGhlcndpc2UgZG9uJ3QgY29ycmVzcG9uZCB0byBhIGNvbXBvbmVudC4KLSAgICAvLwotICAgIExpc3QgcGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCi0gICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotICAgIHsKLSAgICAgIG5vZGUgPSAoKEF0dHIpbm9kZSkuZ2V0T3duZXJFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTa2lwIGFoZWFkIHRvIGFuIGVsZW1lbnQuCi0gICAgICAvLwotICAgICAgZm9yIChOb2RlIHNjYW5Ob2RlID0gbm9kZTsgc2Nhbk5vZGUgIT0gbnVsbDsgc2Nhbk5vZGUgPSBzY2FuTm9kZS5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAoc2Nhbk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIG5vZGUgPSBzY2FuTm9kZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAKLSAgICAgIC8vIFNraXAgYmFjayB0byBhbiBlbGVtZW50LgotICAgICAgLy8KLSAgICAgIGZvciAoTm9kZSBzY2FuTm9kZSA9IG5vZGU7IHNjYW5Ob2RlICE9IG51bGw7IHNjYW5Ob2RlID0gc2Nhbk5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChzY2FuTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgbm9kZSA9IHNjYW5Ob2RlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAKLSAgICAvLyBOYXZpZ2F0ZSBvdXQgdGhyb3VnaCB0aGUgZWxlbWVudHMuCi0gICAgLy8KLSAgICBmb3IgKE5vZGUgcGFyZW50ID0gbm9kZTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpCi0gICAgewotICAgICAgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICBwYXJlbnRzLmFkZChwYXJlbnQpOwotICAgICAgfQotICAgIH0KLQotICAgIFdTRExFbGVtZW50IGJlc3RXU0RMRWxlbWVudCA9IGdldEJlc3RXU0RMRWxlbWVudChwYXJlbnRzKTsKLSAgICByZXR1cm4gYmVzdFdTRExFbGVtZW50OwotICB9Ci0gIAotICAvLwotICAvLwotICAvLwotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdHJ1ZTsgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAJdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdmFsdWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGdldFVzZUV4dGVuc2lvbkZhY3RvcmllcygpCi0gIHsKLSAgCXJldHVybiB1c2VFeHRlbnNpb25GYWN0b3JpZXM7Ci0gIH0KLSAgCi0gIC8vIFNlZSBCdWcgNTM2NgotICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgZG9jdW1lbnQgPSBudWxsOwotICAgICBlbGVtZW50ID0gbnVsbDsKLSAgICAgZ2V0RVNlcnZpY2VzKCkuY2xlYXIoKTsKLSAgICAgZ2V0RUJpbmRpbmdzKCkuY2xlYXIoKTsKLSAgICAgZ2V0RVBvcnRUeXBlcygpLmNsZWFyKCk7Ci0gICAgIGdldEVNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgIHNldEVUeXBlcyhudWxsKTsKLSAgICAgZ2V0RUltcG9ydHMoKS5jbGVhcigpOwotICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICB9IAotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRJbmxpbmVTY2hlbWFMb2NhdGlvbnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICBUeXBlcyB0eXBlcyA9IHRoaXMuZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBqID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGoubmV4dCgpOwotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgIAkvLyBXZSBuZWVkIHRoaXMgdHJ5LWNhdGNoIGJsb2NrIGluIGNhc2Ugd2UgZW5jb3VudGVyIGFuIGV4Y2VwdGlvbiB3aGlsZSBhdHRlbXB0aW5nCi0gICAgICAgIAkvLyB0byByZXNvbHZlIHRoZSBzY2hlbWEuICBJbiB0aGUgY2FzZSBvZiB0aGUgV1NETCBFZGl0b3IsIHdlIGdldCBhCi0gICAgICAgIAkvLyAnY2Fubm90IGNyZWF0ZSBwYXJ0IGV4Y2VwdGlvbicuLi4uLi5TZWUgZWNsaXBzZSBidWd6aWxsYSBidWcgODk4NTUKLSAgICAgICAgCXRyeQotICAgICAgICAJewotICAgICAgICAJCXNjaGVtYS5zZXRTY2hlbWFMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgCX0KLSAgICAgICAgCWNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgIAl9Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgCi0gICAgfSAgICAgIAotICB9ICAKLSAgCi19IC8vRGVmaW5pdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODQyNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCNnZXRFbGVtZW50VHlwZSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlcXVpcmVkKCkgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1JlcXVpcmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVxdWlyZWQoKSA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUmVxdWlyZWQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZCA9IFJFUVVJUkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudFR5cGUoKSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgRUxFTUVOVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudFR5cGUoKSA8ZW0+RWxlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50VHlwZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBlbGVtZW50VHlwZSA9IEVMRU1FTlRfVFlQRV9FREVGQVVMVDsKLQotICBwcml2YXRlIEhhc2hNYXAgYmVhblByb3BlcnR5RGVzY3JpcHRvcnM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWlyZWQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gbmV3UmVxdWlyZWQpCi0gIHsKLSAgICBib29sZWFuIG9sZFJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0gICAgcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgcmVxdWlyZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKGVDbGFzcygpLmdldEVQYWNrYWdlKCkuZ2V0TnNVUkkoKSwgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgbmV3RWxlbWVudFR5cGUpCi0gIHsKLSAgICBRTmFtZSBvbGRFbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotICAgIGVsZW1lbnRUeXBlID0gbmV3RWxlbWVudFR5cGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEUsIG9sZEVsZW1lbnRUeXBlLCBlbGVtZW50VHlwZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFR5cGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHNldFJlcXVpcmVkKFJFUVVJUkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnRUeXBlICE9IG51bGwgOiAhRUxFTUVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhlbGVtZW50VHlwZSk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHJlcXVpcmVkOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVsZW1lbnRUeXBlOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVsZW1lbnRUeXBlKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50I2dldFJlcXVpcmVkKCkKLSAgICovCi0gIHB1YmxpYyBCb29sZWFuIGdldFJlcXVpcmVkKCkKLSAgewotICAgIHJldHVybiBuZXcgQm9vbGVhbihpc1JlcXVpcmVkKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50I3NldFJlcXVpcmVkKEJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKQotICB7Ci0gICAgc2V0UmVxdWlyZWQocmVxdWlyZWQuYm9vbGVhblZhbHVlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciBhIGdpdmVuIGNsYXNzLgotICAgKi8KLSAgcHVibGljIGphdmEudXRpbC5NYXAgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuQ2xhc3MgY2xhenopCi0gIHsKLSAgICAvLyBMb29rdXAgcHJvcGVydGllcyBjYWNoZQotICAgIE1hcCBwcm9wZXJ0aWVzID0gbnVsbDsKLSAgICBpZiAoYmVhblByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkKLSAgICAgIGJlYW5Qcm9wZXJ0eURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBlbHNlCi0gICAgICBwcm9wZXJ0aWVzID0gKE1hcCkgYmVhblByb3BlcnR5RGVzY3JpcHRvcnMuZ2V0KGNsYXp6KTsKLQotICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0gICAgewotICAgICAgLy8gSW50cm9zcGVjdCB0aGUgYmVhbgotICAgICAgQXJyYXlMaXN0IGJpbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBCZWFuSW5mbyBiaW5mbyA9IEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyhjbGF6eik7Ci0gICAgICAgIGlmIChiaW5mbyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgYmluZm9zLmFkZChiaW5mbyk7Ci0gICAgICAgICAgQmVhbkluZm9bXSBhYmluZm8gPSBiaW5mby5nZXRBZGRpdGlvbmFsQmVhbkluZm8oKTsKLSAgICAgICAgICBpZiAoYWJpbmZvICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBhYmluZm8ubGVuZ3RoOyBiKyspCi0gICAgICAgICAgICAgIGJpbmZvcy5hZGQoYWJpbmZvW2JdKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChJbnRyb3NwZWN0aW9uRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIFRCRCAtIGhhbmRsZSBleGNlcHRpb24KLSAgICAgIH0KLQotICAgICAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGIgPSBiaW5mb3MuaXRlcmF0b3IoKTsgYi5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBCZWFuSW5mbyBiaW5mbyA9IChCZWFuSW5mbykgYi5uZXh0KCk7Ci0gICAgICAgIFByb3BlcnR5RGVzY3JpcHRvcltdIHBkZXNjID0gYmluZm8uZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocGRlc2MgPT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBwZGVzYy5sZW5ndGg7IHArKykKLSAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChwZGVzY1twXS5nZXROYW1lKCksIHBkZXNjW3BdKTsKLSAgICAgIH0KLSAgICAgIGJlYW5Qcm9wZXJ0eURlc2NyaXB0b3JzLnB1dChjbGF6eiwgcHJvcGVydGllcyk7Ci0gICAgfQotICAgIHJldHVybiBwcm9wZXJ0aWVzOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50ID09IG51bGwgJiYgIWlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnQoKTogUHJlc2VydmluZyBvbGQgZWxlbWVudCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihlbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBzdXBlci5yZWNvbmNpbGVBdHRyaWJ1dGVzKGNoYW5nZWRFbGVtZW50KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN1cGVyLmhhbmRsZVJlY29uY2lsaWF0aW9uKHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IEVNRiAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLQotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IG51bGw7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgLy8gVGhpcyBpcyBhbiBvbGQgZWxlbWVudC4KLSAgICB7Ci0gICAgICBuZXdFbGVtZW50ID0gKEVsZW1lbnQpIGRvY3VtZW50LmltcG9ydE5vZGUoZWxlbWVudCwgdHJ1ZSk7IAotICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSBkZWZpbml0aW9uLmdldFByZWZpeChuYW1lc3BhY2UpOwotICAgICAgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIChxdWFsaWZpZXIgPT0gbnVsbCA/ICIiIDogcXVhbGlmaWVyICsgIjoiKSArIGdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjZTYxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5zaWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuRXh0ZW5zaWJsZUVsZW1lbnRJbXBsI2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPGVtPkVFeHRlbnNpYmlsaXR5IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJsZUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSA8ZW0+RUV4dGVuc2liaWxpdHkgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFTGlzdCBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmxlRWxlbWVudEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbnNpYmxlRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRUxpc3QgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICBpZiAoZUV4dGVuc2liaWxpdHlFbGVtZW50cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMpOwotICAgIH0KLSAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpCi0gIHsKLSAgICBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGQoZXh0RWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJMRV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQkxFX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzICE9IG51bGwgJiYgIWVFeHRlbnNpYmlsaXR5RWxlbWVudHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvLwotICAvLwotICAvLwotICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgaWYgKCFXU0RMQ29uc3RhbnRzLmlzTWF0Y2hpbmdOYW1lc3BhY2UoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCksIFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKSkKLSAgICB7ICAKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkgPyAKLSAgICAgICAgICAoKFdTRExGYWN0b3J5SW1wbClXU0RMRmFjdG9yeS5lSU5TVEFOQ0UpLmNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KGdldE5hbWVzcGFjZShjaGlsZCksZ2V0TG9jYWxOYW1lKGNoaWxkKSkgOgotICAgICAgICAgICAgKChXU0RMRmFjdG9yeUltcGwpV1NETEZhY3RvcnkuZUlOU1RBTkNFKS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmFkZChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCkKLSAgewotICAJLy8gVXNlIGV4dGVuc2lvbiBmYWN0b3JpZXMgYnkgZGVmYXVsdC4KLSAgICByZXR1cm4gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpID09IG51bGwgPyAKLSAgICAgIHRydWUgOiAKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKS5nZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMoKTsKLSAgfQotICAKLX0gLy9FeHRlbnNpYmxlRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9GYXVsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9GYXVsdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YTI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRmF1bHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZhdWx0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRmF1bHRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBGYXVsdAotewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBGYXVsdEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRGYXVsdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5GQVVMVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRkFVTFRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLkZBVUxUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vRmF1bHRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0ltcG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4NTRmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETE1vZGVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5JbXBvcnRJbXBsI2dldE5hbWVzcGFjZVVSSSA8ZW0+TmFtZXNwYWNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkltcG9ydEltcGwjZ2V0TG9jYXRpb25VUkkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLkltcG9ydEltcGwjZ2V0RURlZmluaXRpb24gPGVtPkVEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuSW1wb3J0SW1wbCNnZXRFU2NoZW1hIDxlbT5FU2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0SW1wbCBleHRlbmRzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEltcG9ydAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXNvbHZlZDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZVVSSSgpIDxlbT5OYW1lc3BhY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lc3BhY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZXNwYWNlVVJJKCkgPGVtPk5hbWVzcGFjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWVzcGFjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlVVJJID0gTkFNRVNQQUNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uVVJJKCkgPGVtPkxvY2F0aW9uIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb25VUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTl9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvblVSSSgpIDxlbT5Mb2NhdGlvbiBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldExvY2F0aW9uVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvblVSSSA9IExPQ0FUSU9OX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RURlZmluaXRpb24oKSA8ZW0+RURlZmluaXRpb248L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVEZWZpbml0aW9uKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZURlZmluaXRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFU2NoZW1hKCkgPGVtPkVTY2hlbWE8L2VtPn0nIHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVTY2hlbWEoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNEU2NoZW1hIGVTY2hlbWEgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEltcG9ydEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBvcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuZXdOYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotICAgIG5hbWVzcGFjZVVSSSA9IG5ld05hbWVzcGFjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX05BTUVTUEFDRV9VUkksIG9sZE5hbWVzcGFjZVVSSSwgbmFtZXNwYWNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoKQotICB7Ci0gICAgcmV0dXJuIGxvY2F0aW9uVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSSShTdHJpbmcgbmV3TG9jYXRpb25VUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkTG9jYXRpb25VUkkgPSBsb2NhdGlvblVSSTsKLSAgICBsb2NhdGlvblVSSSA9IG5ld0xvY2F0aW9uVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLklNUE9SVF9fTE9DQVRJT05fVVJJLCBvbGRMb2NhdGlvblVSSSwgbG9jYXRpb25VUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RURlZmluaXRpb24oKQotICB7Ci0gICAgaWYgKGVEZWZpbml0aW9uICE9IG51bGwgJiYgZURlZmluaXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIG9sZEVEZWZpbml0aW9uID0gZURlZmluaXRpb247Ci0gICAgICBlRGVmaW5pdGlvbiA9IChEZWZpbml0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllRGVmaW5pdGlvbik7Ci0gICAgICBpZiAoZURlZmluaXRpb24gIT0gb2xkRURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTiwgb2xkRURlZmluaXRpb24sIGVEZWZpbml0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlRGVmaW5pdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gYmFzaWNHZXRFRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZURlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVEZWZpbml0aW9uKERlZmluaXRpb24gbmV3RURlZmluaXRpb24pCi0gIHsKLSAgICBEZWZpbml0aW9uIG9sZEVEZWZpbml0aW9uID0gZURlZmluaXRpb247Ci0gICAgZURlZmluaXRpb24gPSBuZXdFRGVmaW5pdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX0VERUZJTklUSU9OLCBvbGRFRGVmaW5pdGlvbiwgZURlZmluaXRpb24pKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTRFNjaGVtYSBnZXRFU2NoZW1hKCkKLSAgewotICAgIGlmIChlU2NoZW1hICE9IG51bGwgJiYgZVNjaGVtYS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSBvbGRFU2NoZW1hID0gZVNjaGVtYTsKLSAgICAgIGVTY2hlbWEgPSAoWFNEU2NoZW1hKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCllU2NoZW1hKTsKLSAgICAgIGlmIChlU2NoZW1hICE9IG9sZEVTY2hlbWEpCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BLCBvbGRFU2NoZW1hLCBlU2NoZW1hKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlU2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGJhc2ljR2V0RVNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gZVNjaGVtYTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RVNjaGVtYShYU0RTY2hlbWEgbmV3RVNjaGVtYSkKLSAgewotICAgIFhTRFNjaGVtYSBvbGRFU2NoZW1hID0gZVNjaGVtYTsKLSAgICBlU2NoZW1hID0gbmV3RVNjaGVtYTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5JTVBPUlRfX0VTQ0hFTUEsIG9sZEVTY2hlbWEsIGVTY2hlbWEpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBYU0RTY2hlbWEgZ2V0U2NoZW1hKCkKLSAgewotICAgIHJldHVybiBnZXRFU2NoZW1hKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHNldEVTY2hlbWEoc2NoZW1hKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgcmV0dXJuIGdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uVVJJKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fRURFRklOSVRJT046Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RURlZmluaXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RURlZmluaXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVTY2hlbWEoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RVNjaGVtYSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTkFNRVNQQUNFX1VSSToKLSAgICAgICAgc2V0TmFtZXNwYWNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fTE9DQVRJT05fVVJJOgotICAgICAgICBzZXRMb2NhdGlvblVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VERUZJTklUSU9OOgotICAgICAgICBzZXRFRGVmaW5pdGlvbigoRGVmaW5pdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBzZXRFU2NoZW1hKChYU0RTY2hlbWEpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19OQU1FU1BBQ0VfVVJJOgotICAgICAgICBzZXROYW1lc3BhY2VVUkkoTkFNRVNQQUNFX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19MT0NBVElPTl9VUkk6Ci0gICAgICAgIHNldExvY2F0aW9uVVJJKExPQ0FUSU9OX1VSSV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTjoKLSAgICAgICAgc2V0RURlZmluaXRpb24oKERlZmluaXRpb24pbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FU0NIRU1BOgotICAgICAgICBzZXRFU2NoZW1hKChYU0RTY2hlbWEpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX05BTUVTUEFDRV9VUkk6Ci0gICAgICAgIHJldHVybiBOQU1FU1BBQ0VfVVJJX0VERUZBVUxUID09IG51bGwgPyBuYW1lc3BhY2VVUkkgIT0gbnVsbCA6ICFOQU1FU1BBQ0VfVVJJX0VERUZBVUxULmVxdWFscyhuYW1lc3BhY2VVUkkpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlRfX0xPQ0FUSU9OX1VSSToKLSAgICAgICAgcmV0dXJuIExPQ0FUSU9OX1VSSV9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb25VUkkgIT0gbnVsbCA6ICFMT0NBVElPTl9VUklfRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUX19FREVGSU5JVElPTjoKLSAgICAgICAgcmV0dXJuIGVEZWZpbml0aW9uICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklNUE9SVF9fRVNDSEVNQToKLSAgICAgICAgcmV0dXJuIGVTY2hlbWEgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZXNwYWNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCBsb2NhdGlvblVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChsb2NhdGlvblVSSSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEltcG9ydCNnZXREZWZpbml0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkRlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0RURlZmluaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIEltcG9ydCNzZXREZWZpbml0aW9uKERlZmluaXRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc2V0RURlZmluaXRpb24oKG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24pIGRlZmluaXRpb24pOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc2V0TmFtZXNwYWNlVVJJKFdTRExDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUpKTsKLSAgICBzZXRMb2NhdGlvblVSSShXU0RMQ29uc3RhbnRzLmdldEF0dHJpYnV0ZShjaGFuZ2VkRWxlbWVudCwgV1NETENvbnN0YW50cy5MT0NBVElPTl9BVFRSSUJVVEUpKTsKLSAgfQotCi0gIC8vCi0gIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCi0gIC8vCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGlzIGJvb2xlYW4gdG8gZmFsc2UgYmVjYXVzZSB0aGUgSW1wb3J0IG1heSBwb2ludCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4KLSAgICAvLyBTbyB3ZSBuZWVkIHdlIHNob3VsZCB2aWV3IHRoaXMgaW1wb3J0IGFzIHVucmVzb2x2ZWQuCi0gICAgcmVzb2x2ZWQgPSBmYWxzZTsKLSAgICAKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldEltcG9ydF9OYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVTUEFDRV9BVFRSSUJVVEUsIGdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbXBvcnRfTG9jYXRpb25VUkkoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLkxPQ0FUSU9OX0FUVFJJQlVURSwgZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuSU1QT1JUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW1wb3J0RGVmaW5pdGlvbk9yU2NoZW1hKCkKLSAgewotICAgIHJlc29sdmUoZ2V0TmFtZXNwYWNlVVJJKCksIGdldExvY2F0aW9uVVJJKCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICBpZiAoIXJlc29sdmVkKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwgJiYgZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IGRlZmluaXRpb24uZVJlc291cmNlKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotICAgICAgICAgIGlmIChyZXNvdXJjZVNldCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24oZGVmaW5pdGlvbiwgbmFtZXNwYWNlLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHJlc29sdmVkTG9jYXRpb24pOwotICAgICAgICAgICAgUmVzb3VyY2UgcmVzb2x2ZWRSZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKHVyaSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZS5sb2FkKGlucHV0U3RyZWFtLCByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSXQgaXMgZ2VuZXJhbGx5IG5vdCBhbiBlcnJvciB0byBmYWlsIHRvIHJlc29sdmUuCi0gICAgICAgICAgICAgICAgLy8gSWYgYSByZXNvdXJjZSBpcyBhY3R1YWxseSBjcmVhdGVkLCAKLSAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXBwZW5zIG9ubHkgd2hlbiB3ZSBjYW4gY3JlYXRlIGFuIGlucHV0IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIGl0J3MgYW4gZXJyb3IgaWYgaXQncyBub3QgYSBnb29kIHdzZGwgb3Igc2NoZW1hCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZURlZmluaXRpb24gPSAoKFdTRExSZXNvdXJjZUltcGwpIHJlc29sdmVkUmVzb3VyY2UpLmdldERlZmluaXRpb24oKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmIChyZXNvbHZlZFJlc291cmNlIGluc3RhbmNlb2YgWFNEUmVzb3VyY2VJbXBsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZVNjaGVtYSA9ICgoWFNEUmVzb3VyY2VJbXBsKSByZXNvbHZlZFJlc291cmNlKS5nZXRTY2hlbWEoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlRGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVMb2NhdGlvbihEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBzY2hlbWFMb2NhdGlvbikKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIFdTRExNb2RlbExvY2F0b3IgbG9jYXRvciA9IChXU0RMTW9kZWxMb2NhdG9yKUVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcihkZWZpbml0aW9uLmVSZXNvdXJjZSgpLCBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzKTsKLSAgICBpZiAobG9jYXRvciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGxvY2F0b3IucmVzb2x2ZVVSSShkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLCBuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRPRE8uLi4gdGhlcmUncyBzb21lIGRlZmF1bHQgcmVzb2x2aW5nIHdlJ2xsIG5lZWQgdG8gZG8gaGVyZQotICAgICAgLy8gc2VlIFhTRFNjaGVtYURpcmVjdGl2ZQotICAgICAgVVJJIGJhc2VMb2NhdGlvblVSSSA9IGNyZWF0ZVVSSShkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgIFVSSSBsb2NhdGlvblVSSSA9IFVSSS5jcmVhdGVVUkkoc2NoZW1hTG9jYXRpb24pOwotICAgICAgcmV0dXJuIGxvY2F0aW9uVVJJLnJlc29sdmUoYmFzZUxvY2F0aW9uVVJJKS50b1N0cmluZygpOwotICAgIH0gIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIC8vVE9ETy4uLiBwdXNoIGRvd24gdG8gRU1GCi0gIHByaXZhdGUgc3RhdGljIFVSSSBjcmVhdGVVUkkoU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIGlmIChoYXNQcm90b2NvbCh1cmlTdHJpbmcpKQotICAgICAgIHJldHVybiBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7Ci0gICAgZWxzZQotICAgICAgIHJldHVybiBVUkkuY3JlYXRlRmlsZVVSSSh1cmlTdHJpbmcpOwotICB9Ci0KLSAgLy9UT0RPLi4uIHB1c2ggZG93biB0byBFTUYgIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAgICAgCi0gICAgaWYgKHVyaSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHVyaS5pbmRleE9mKCI6Iik7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggPiAyKSAvLyBhc3N1bWUgcHJvdG9jb2wgd2l0aCBiZSBsZW5ndGggMyBzbyB0aGF0IHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYSBwcm90b2NvbAotICAgICAgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotfSAvL0ltcG9ydEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9JbnB1dEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9JbnB1dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3ZWUwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW5wdXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklucHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5wdXRJbXBsIGV4dGVuZHMgTWVzc2FnZVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBJbnB1dAotewotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBJbnB1dEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuTWVzc2FnZSBnZXRNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBnZXRFTWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIHNldEVNZXNzYWdlKChNZXNzYWdlKSBtZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTlBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU5QVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLklOUFVUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vSW5wdXRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTWVzc2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk3NmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjZ2V0UU5hbWUgPGVtPlFOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjaXNVbmRlZmluZWQgPGVtPlVuZGVmaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZUltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VJbXBsI2dldEVQYXJ0cyA8ZW0+RVBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXNzYWdlCi17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UU5hbWUoKSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFFOYW1lKCkgPGVtPlFOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRRTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSBxTmFtZSA9IFFOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmRlZmluZWQoKSA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVTkRFRklORURfRURFRkFVTFQgPSBmYWxzZTsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVbmRlZmluZWQoKSA8ZW0+VW5kZWZpbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1VuZGVmaW5lZCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHVuZGVmaW5lZCA9IFVOREVGSU5FRF9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJveHkoKSA8ZW0+UHJveHk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzUHJveHkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPWFlfRURFRkFVTFQgPSBmYWxzZTsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHByb3h5ID0gUFJPWFlfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfVVJJX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VVUkkoKSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRSZXNvdXJjZVVSSSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VVUkkgPSBSRVNPVVJDRV9VUklfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVQYXJ0cygpIDxlbT5FUGFydHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RVBhcnRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVQYXJ0cyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSBNYXAgcGFydHM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG5ld1FOYW1lKQotICB7Ci0gICAgUU5hbWUgb2xkUU5hbWUgPSBxTmFtZTsKLSAgICBxTmFtZSA9IG5ld1FOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FLCBvbGRRTmFtZSwgcU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRlZmluZWQoKQotICB7Ci0gICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gbmV3VW5kZWZpbmVkKQotICB7Ci0gICAgYm9vbGVhbiBvbGRVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0gICAgdW5kZWZpbmVkID0gbmV3VW5kZWZpbmVkOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1VOREVGSU5FRCwgb2xkVW5kZWZpbmVkLCB1bmRlZmluZWQpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQcm94eSgpCi0gIHsKLSAgICByZXR1cm4gcHJveHk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3h5KGJvb2xlYW4gbmV3UHJveHkpCi0gIHsKLSAgICBib29sZWFuIG9sZFByb3h5ID0gcHJveHk7Ci0gICAgcHJveHkgPSBuZXdQcm94eTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX19QUk9YWSwgb2xkUHJveHksIHByb3h5KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVVSSShTdHJpbmcgbmV3UmVzb3VyY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkUmVzb3VyY2VVUkkgPSByZXNvdXJjZVVSSTsKLSAgICByZXNvdXJjZVVSSSA9IG5ld1Jlc291cmNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk1FU1NBR0VfX1JFU09VUkNFX1VSSSwgb2xkUmVzb3VyY2VVUkksIHJlc291cmNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFUGFydHMoKQotICB7Ci0gICAgaWYgKGVQYXJ0cyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVQYXJ0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJ0LmNsYXNzLCB0aGlzLCBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFMpOwotICAgIH0KLSAgICByZXR1cm4gZVBhcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEFkZCBhIHBhcnQgdG8gdGhpcyBtZXNzYWdlLgotICAgKiBAcGFyYW0gcGFydCB0aGUgcGFydCB0byBiZSBhZGRlZAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFBhcnQoamF2YXgud3NkbC5QYXJ0IHBhcnQpCi0gIHsKLSAgICBnZXRFUGFydHMoKS5hZGQoKFBhcnQpcGFydCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFydC4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcGFydC4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBwYXJ0LCBvciBudWxsIGlmIHRoZXJlIHdhc24ndAotICAgKiBhbnkgbWF0Y2hpbmcgcGFydAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLlBhcnQgZ2V0UGFydChTdHJpbmcgbmFtZSkKLSAgewotICAgIFBhcnQgcmVzdWx0ID0gbnVsbDsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUGFydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgaWYgKG5hbWUuZXF1YWxzKHBhcnQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gcGFydDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGFsbCB0aGUgcGFydHMgZGVmaW5lZCBoZXJlLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0UGFydHMoKQotICB7Ci0gICAgSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRFUGFydHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgaGFzaE1hcC5wdXQocGFydC5nZXROYW1lKCksIHBhcnQpOwotICAgIH0KLSAgICByZXR1cm4gaGFzaE1hcDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldE9yZGVyZWRQYXJ0cyhMaXN0IHBhcnRPcmRlcikKLSAgewotICAgIExpc3Qgb3JkZXJlZFBhcnRzID0gbmV3IFZlY3RvcigpOwotICAgIGlmIChwYXJ0T3JkZXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBvcmRlcmVkUGFydHMuYWRkQWxsKGdldEVQYXJ0cygpKTsKLSAgICAgIHJldHVybiBvcmRlcmVkUGFydHM7Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgcGFydE5hbWVJdGVyYXRvciA9IHBhcnRPcmRlci5pdGVyYXRvcigpOwotICAgIHdoaWxlIChwYXJ0TmFtZUl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFydE5hbWUgPSAoU3RyaW5nKSBwYXJ0TmFtZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGphdmF4LndzZGwuUGFydCBwYXJ0ID0gZ2V0UGFydChwYXJ0TmFtZSk7Ci0gICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICBvcmRlcmVkUGFydHMuYWRkKHBhcnQpOwotICAgIH0KLQotICAgIHJldHVybiBvcmRlcmVkUGFydHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRVBBUlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVBhcnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBnZXRRTmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUFJPWFk6Ci0gICAgICAgIHJldHVybiBpc1Byb3h5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19FUEFSVFM6Ci0gICAgICAgIHJldHVybiBnZXRFUGFydHMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgZ2V0RVBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBhcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eShQUk9YWV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgZ2V0RVBhcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBRTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcU5hbWUgIT0gbnVsbCA6ICFRTkFNRV9FREVGQVVMVC5lcXVhbHMocU5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiB1bmRlZmluZWQgIT0gVU5ERUZJTkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBSRVNPVVJDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVVJJICE9IG51bGwgOiAhUkVTT1VSQ0VfVVJJX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVSSSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfX0VQQVJUUzoKLSAgICAgICAgcmV0dXJuIGVQYXJ0cyAhPSBudWxsICYmICFlUGFydHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChxTmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChxTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCB1bmRlZmluZWQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodW5kZWZpbmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHByb3h5OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHByb3h5KTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlc291cmNlVVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBudWxsOwotICAgIGlmIChjaGFuZ2VkRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICB7Ci0gICAgICBuZXdOYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0gICAgfQotICAgIGlmIChuZXdOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgUU5hbWUgcW5hbWUgPSBuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgbmV3TmFtZSk7Ci0gICAgICBzZXRRTmFtZShxbmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBBUlQgOgotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBwYXJ0ID0gKChXU0RMUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSkpLmdldFdTRExGYWN0b3J5KCkuY3JlYXRlUGFydCgpOwotICAgICAgICAgIHBhcnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICAgIHBhcnQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgZ2V0RVBhcnRzKCkuYWRkKHBhcnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIHJlbW92ZSh0aGlzLCBpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIGNvbXBvbmVudDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQYXJ0KQotICAgIHsKLSAgICAgIG1lc3NhZ2UuZ2V0RVBhcnRzKCkuY2xlYXIoKTsKLSAgICB9Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VfUU5hbWUoKSkKLSAgICAgICAgbmljZVNldEF0dHJpYnV0ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLk5BTUVfQVRUUklCVVRFLCBnZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAgIEVsZW1lbnQgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoV1NETENvbnN0YW50cy5NRVNTQUdFKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQYXJ0KQotICAgICAgewotICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgb2JqOwotICAgICAgICBFbGVtZW50IGNoaWxkID0gKChQYXJ0SW1wbCkgcGFydCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9NZXNzYWdlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTWVzc2FnZVJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhN2I5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTWVzc2FnZVJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgUmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTWVzc2FnZVJlZmVyZW5jZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk1lc3NhZ2VSZWZlcmVuY2VJbXBsI2dldEVNZXNzYWdlIDxlbT5FTWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lc3NhZ2VSZWZlcmVuY2VJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgTWVzc2FnZVJlZmVyZW5jZQotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFTWVzc2FnZSgpIDxlbT5FTWVzc2FnZTwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU1lc3NhZ2UoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZSBlTWVzc2FnZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZVJlZmVyZW5jZUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlUmVmZXJlbmNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZSBnZXRFTWVzc2FnZSgpCi0gIHsKLSAgICBpZiAoZU1lc3NhZ2UgIT0gbnVsbCAmJiBlTWVzc2FnZS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIE1lc3NhZ2Ugb2xkRU1lc3NhZ2UgPSBlTWVzc2FnZTsKLSAgICAgIGVNZXNzYWdlID0gKE1lc3NhZ2UpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVNZXNzYWdlKTsKLSAgICAgIGlmIChlTWVzc2FnZSAhPSBvbGRFTWVzc2FnZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0UsIG9sZEVNZXNzYWdlLCBlTWVzc2FnZSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZU1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlIGJhc2ljR2V0RU1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGVNZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFTWVzc2FnZShNZXNzYWdlIG5ld0VNZXNzYWdlKQotICB7Ci0gICAgTWVzc2FnZSBvbGRFTWVzc2FnZSA9IGVNZXNzYWdlOwotICAgIGVNZXNzYWdlID0gbmV3RU1lc3NhZ2U7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFLCBvbGRFTWVzc2FnZSwgZU1lc3NhZ2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fTkFNRToKLSAgICAgICAgcmV0dXJuIGdldE5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VNRVNTQUdFOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVNZXNzYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOgotICAgICAgICBzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFX1JFRkVSRU5DRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTUVTU0FHRV9SRUZFUkVOQ0VfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0VfUkVGRVJFTkNFX19FTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGVNZXNzYWdlICE9IG51bGw7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQobmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsaWF0aW9uIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBzZXROYW1lKFdTRExDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCAibmFtZSIpKTsKLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VSZWZlcmVuY2VfTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZVJlZmVyZW5jZV9FTWVzc2FnZSgpKQotICAgICAgewotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBnZXRFTWVzc2FnZSgpOwotICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUU5hbWUgcU5hbWUgPSBtZXNzYWdlLmdldFFOYW1lKCk7Ci0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTUVTU0FHRV9BVFRSSUJVVEUsIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIiMiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsgICAgICAKLSAgICAgIFFOYW1lIG1lc3NhZ2VRTmFtZSA9IGNyZWF0ZVFOYW1lKGRlZmluaXRpb24sIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJtZXNzYWdlIikpOwotICAgICAgTWVzc2FnZSBuZXdNZXNzYWdlID0gbWVzc2FnZVFOYW1lICE9IG51bGwgPyAoTWVzc2FnZSkgZGVmaW5pdGlvbi5nZXRNZXNzYWdlKG1lc3NhZ2VRTmFtZSkgOiBudWxsOwotICAgICAgaWYgKG5ld01lc3NhZ2UgIT0gZ2V0RU1lc3NhZ2UoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0RU1lc3NhZ2UobmV3TWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLX0gLy9NZXNzYWdlUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL05hbWVzcGFjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9OYW1lc3BhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzI4YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL05hbWVzcGFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuTmFtZXNwYWNlSW1wbCNnZXRVUkkgPGVtPlVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk5hbWVzcGFjZUltcGwjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBOYW1lc3BhY2UKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVUkkoKSA8ZW0+VVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVUkkoKSA8ZW0+VVJJPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHVyaSA9IFVSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFByZWZpeCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFByZWZpeCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcHJlZml4ID0gUFJFRklYX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIE5hbWVzcGFjZUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lc3BhY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVUkkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyBuZXdVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkVVJJID0gdXJpOwotICAgIHVyaSA9IG5ld1VSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1VSSSwgb2xkVVJJLCB1cmkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQotICB7Ci0gICAgcmV0dXJuIHByZWZpeDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBuZXdQcmVmaXgpCi0gIHsKLSAgICBTdHJpbmcgb2xkUHJlZml4ID0gcHJlZml4OwotICAgIHByZWZpeCA9IG5ld1ByZWZpeDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5OQU1FU1BBQ0VfX1BSRUZJWCwgb2xkUHJlZml4LCBwcmVmaXgpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19VUkk6Ci0gICAgICAgIHJldHVybiBnZXRVUkkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19QUkVGSVg6Ci0gICAgICAgIHJldHVybiBnZXRQcmVmaXgoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fVVJJOgotICAgICAgICBzZXRVUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19QUkVGSVg6Ci0gICAgICAgIHNldFByZWZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFX19VUkk6Ci0gICAgICAgIHNldFVSSShVUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fUFJFRklYOgotICAgICAgICBzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fVVJJOgotICAgICAgICByZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk5BTUVTUEFDRV9fUFJFRklYOgotICAgICAgICByZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQuZXF1YWxzKHByZWZpeCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKFVSSTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1cmkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJlZml4OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgcmVzdWx0LmFwcGVuZCgnKScpOwotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi19IC8vTmFtZXNwYWNlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL09wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9PcGVyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMTllMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL09wZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9wZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0U3R5bGUgPGVtPlN0eWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuT3BlcmF0aW9uSW1wbCNpc1Byb3h5IDxlbT5Qcm94eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0UmVzb3VyY2VVUkkgPGVtPlJlc291cmNlIFVSSTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLk9wZXJhdGlvbkltcGwjZ2V0RUlucHV0IDxlbT5FSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVPdXRwdXQgPGVtPkVPdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVGYXVsdHMgPGVtPkVGYXVsdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5PcGVyYXRpb25JbXBsI2dldEVQYXJhbWV0ZXJPcmRlcmluZyA8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvbkltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBPcGVyYXRpb24KLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0U3R5bGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9wZXJhdGlvblR5cGUgU1RZTEVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHlsZSgpIDxlbT5TdHlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0U3R5bGUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uVHlwZSBzdHlsZSA9IFNUWUxFX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVOREVGSU5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdW5kZWZpbmVkID0gVU5ERUZJTkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9YWV9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJveHkgPSBQUk9YWV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVVSSSA9IFJFU09VUkNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RUlucHV0KCkgPGVtPkVJbnB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUlucHV0KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIElucHV0IGVJbnB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVPdXRwdXQoKSA8ZW0+RU91dHB1dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU91dHB1dCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBPdXRwdXQgZU91dHB1dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVGYXVsdHMoKSA8ZW0+RUZhdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFRmF1bHRzKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVMaXN0IGVGYXVsdHMgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKSA8ZW0+RVBhcmFtZXRlciBPcmRlcmluZzwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZVBhcmFtZXRlck9yZGVyaW5nID0gbnVsbDsKLQotICBwcml2YXRlIE1hcCBmYXVsdHM7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgT3BlcmF0aW9uSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE9wZXJhdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE9wZXJhdGlvblR5cGUgZ2V0U3R5bGUoKQotICB7Ci0gICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICBzdHlsZSA9IGRlZHVjZU9wZXJhdGlvblR5cGUoZ2V0RWxlbWVudCgpKTsKLSAgICAKLSAgICAvLyBUaGUgdmFsdWUgb2Ygc3R5bGUgaXMgdXBkYXRlZCB3aGVuCi0gICAgLy8gMSkgdGhlIFdTREwgaXMgbG9hZGVkIGZvciB0aGUgZmlyc3QgdGltZSwKLSAgICAvLyAyKSB0aGUgc2V0U3R5bGUoKSBtZXRob2QgaXMgY2FsbGVkLCBhbmQKLSAgICAvLyAzKSB0aGUgY2hpbGRyZW4gb2YgdGhlIE9wZXJhdGlvbiAoRE9NKSBlbGVtZW50IGFyZSBtYW5pcHVsYXRlZC4KLSAgICByZXR1cm4gc3R5bGU7Ci0gIH0KLQotICBwcml2YXRlIE9wZXJhdGlvblR5cGUgZGVkdWNlT3BlcmF0aW9uVHlwZShFbGVtZW50IG9wZXJhdGlvbikKLSAgewotICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgICAgIAotICAJaW50IHN0YXRlID0gMDsKLSAgCWludCBtZXNzYWdlUmVmVHlwZSA9IC0xOwotICAJTm9kZSBjaGlsZCA9IG51bGw7Ci0gIAlOb2RlTGlzdCBjaGlsZHJlbiA9IG9wZXJhdGlvbi5nZXRDaGlsZE5vZGVzKCk7Ci0gIAkKLSAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0gICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgY29udGludWU7Ci0gICAgICAKLSAgICAgIG1lc3NhZ2VSZWZUeXBlID0gV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZSgoRWxlbWVudCljaGlsZCk7Ci0gICAgICBzd2l0Y2ggKHN0YXRlKQotCSAgewotICAgICAgICBjYXNlIDA6IC8vIGluaXRpYWwgc3RhdGUgICAgIAotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLklOUFVUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAxOyAKLSAgICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLk9VVFBVVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gMjsgCi0gICAgICAgICAgZWxzZSBpZiAoV1NETENvbnN0YW50cy5ET0NVTUVOVEFUSU9OID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgIAlzdGF0ZSA9IDA7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6IC8vIG9uZS13YXkgb3IgcmVxdWVzdC1yZXNwb25zZQotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAxMTsgLy8gb25lLXdheQotICAgICAgICAgIGVsc2UgaWYgKFdTRExDb25zdGFudHMuT1VUUFVUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAzOyAvLyByZXF1ZXN0LXJlc3BvbnNlCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDExOiAvLyBvbmUtd2F5Ci0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDExOyAvLyBvbmUtd2F5Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6IC8vIHNvbGljaXQtcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuSU5QVVQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDQ7IC8vIHNvbGljaXQtcmVzcG9uc2UKLSAgICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAyMTsgLy8gbm90aWZpY2F0aW9uCi0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAvLyBub3RpZmljYXRpb24KLSAgICAgICAgICBpZiAoV1NETENvbnN0YW50cy5GQVVMVCA9PSBtZXNzYWdlUmVmVHlwZSkKLSAgICAgICAgICAgIHN0YXRlID0gMjE7IC8vIG5vdGlmaWNhdGlvbgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlID0gLTE7IC8vIGNhbm5vdCBoYXBwZW4KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOiAvLyByZXF1ZXN0LXJlc3BvbnNlIAotICAgICAgICAgIGlmIChXU0RMQ29uc3RhbnRzLkZBVUxUID09IG1lc3NhZ2VSZWZUeXBlKQotICAgICAgICAgICAgc3RhdGUgPSAzOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0YXRlID0gLTE7IC8vIGNhbm5vdCBoYXBwZW4KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OiAvLyBzb2xpY2l0LXJlc3BvbnNlCi0gICAgICAgICAgaWYgKFdTRExDb25zdGFudHMuRkFVTFQgPT0gbWVzc2FnZVJlZlR5cGUpCi0gICAgICAgICAgICBzdGF0ZSA9IDQ7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdGUgPSAtMTsgLy8gY2Fubm90IGhhcHBlbgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvLyBjYW5ub3QgaGFwcGVuICgtMSkKLSAgICAgICAgICBicmVhazsKLQkgIH0KLSAgICB9Ci0gICAgCi0gICAgT3BlcmF0aW9uVHlwZSBvcFR5cGUgPSBudWxsOwotICAgIHN3aXRjaCAoc3RhdGUpCi0JewotICAgICAgY2FzZSAxOgotICAgICAgY2FzZSAxMToKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLk9ORV9XQVk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgY2FzZSAyMToKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLk5PVElGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAJb3BUeXBlID0gT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgIAlvcFR5cGUgPSBPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogLy8gaW52YWxpZAotICAgICAgICBicmVhazsKLQl9Ci0gICAgcmV0dXJuIG9wVHlwZTsgICAgCi0gIH0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdHlsZShPcGVyYXRpb25UeXBlIG5ld1N0eWxlKQotICB7Ci0gICAgT3BlcmF0aW9uVHlwZSBvbGRTdHlsZSA9IHN0eWxlOwotICAgIHN0eWxlID0gbmV3U3R5bGU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19TVFlMRSwgb2xkU3R5bGUsIHN0eWxlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVbmRlZmluZWQoKQotICB7Ci0gICAgcmV0dXJuIHVuZGVmaW5lZDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gbmV3VW5kZWZpbmVkKQotICB7Ci0gICAgYm9vbGVhbiBvbGRVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0gICAgdW5kZWZpbmVkID0gbmV3VW5kZWZpbmVkOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fVU5ERUZJTkVELCBvbGRVbmRlZmluZWQsIHVuZGVmaW5lZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3h5KCkKLSAgewotICAgIHJldHVybiBwcm94eTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJveHkoYm9vbGVhbiBuZXdQcm94eSkKLSAgewotICAgIGJvb2xlYW4gb2xkUHJveHkgPSBwcm94eTsKLSAgICBwcm94eSA9IG5ld1Byb3h5OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFksIG9sZFByb3h5LCBwcm94eSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlVVJJKCkKLSAgewotICAgIHJldHVybiByZXNvdXJjZVVSSTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVUkkoU3RyaW5nIG5ld1Jlc291cmNlVVJJKQotICB7Ci0gICAgU3RyaW5nIG9sZFJlc291cmNlVVJJID0gcmVzb3VyY2VVUkk7Ci0gICAgcmVzb3VyY2VVUkkgPSBuZXdSZXNvdXJjZVVSSTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSSwgb2xkUmVzb3VyY2VVUkksIHJlc291cmNlVVJJKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBJbnB1dCBnZXRFSW5wdXQoKQotICB7Ci0gICAgcmV0dXJuIGVJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RUlucHV0KElucHV0IG5ld0VJbnB1dCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIElucHV0IG9sZEVJbnB1dCA9IGVJbnB1dDsKLSAgICBlSW5wdXQgPSBuZXdFSW5wdXQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIEVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVCwgb2xkRUlucHV0LCBuZXdFSW5wdXQpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUlucHV0KElucHV0IG5ld0VJbnB1dCkKLSAgewotICAgIGlmIChuZXdFSW5wdXQgIT0gZUlucHV0KQotICAgIHsKLSAgICAgIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotICAgICAgaWYgKGVJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZUlucHV0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld0VJbnB1dCAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RUlucHV0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG51bGwsIG1zZ3MpOwotICAgICAgbXNncyA9IGJhc2ljU2V0RUlucHV0KG5ld0VJbnB1dCwgbXNncyk7Ci0gICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQsIG5ld0VJbnB1dCwgbmV3RUlucHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPdXRwdXQgZ2V0RU91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZU91dHB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RU91dHB1dChPdXRwdXQgbmV3RU91dHB1dCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIE91dHB1dCBvbGRFT3V0cHV0ID0gZU91dHB1dDsKLSAgICBlT3V0cHV0ID0gbmV3RU91dHB1dDsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgewotICAgICAgRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRU9VVFBVVCwgb2xkRU91dHB1dCwgbmV3RU91dHB1dCk7Ci0gICAgICBpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBtc2dzOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFT3V0cHV0KE91dHB1dCBuZXdFT3V0cHV0KQotICB7Ci0gICAgaWYgKG5ld0VPdXRwdXQgIT0gZU91dHB1dCkKLSAgICB7Ci0gICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLSAgICAgIGlmIChlT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCllT3V0cHV0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBudWxsLCBtc2dzKTsKLSAgICAgIGlmIChuZXdFT3V0cHV0ICE9IG51bGwpCi0gICAgICAgIG1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFT3V0cHV0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBudWxsLCBtc2dzKTsKLSAgICAgIG1zZ3MgPSBiYXNpY1NldEVPdXRwdXQobmV3RU91dHB1dCwgbXNncyk7Ci0gICAgICBpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVULCBuZXdFT3V0cHV0LCBuZXdFT3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFRmF1bHRzKCkKLSAgewotICAgIGlmIChlRmF1bHRzID09IG51bGwpCi0gICAgewotICAgICAgZUZhdWx0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChGYXVsdC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FRkFVTFRTKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVGYXVsdHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBFTGlzdCBnZXRFUGFyYW1ldGVyT3JkZXJpbmcoKQotICB7Ci0gICAgaWYgKGVQYXJhbWV0ZXJPcmRlcmluZyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVQYXJhbWV0ZXJPcmRlcmluZyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3QoUGFydC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVQYXJhbWV0ZXJPcmRlcmluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYSBmYXVsdCBtZXNzYWdlIHRoYXQgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgKiBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBmYXVsdCB0aGUgbmV3IGZhdWx0IG1lc3NhZ2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRGYXVsdChqYXZheC53c2RsLkZhdWx0IGZhdWx0KQotICB7Ci0gICAgZ2V0RUZhdWx0cygpLmFkZCgoRmF1bHQpZmF1bHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIGZhdWx0IG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGZhdWx0IG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZmF1bHQgbWVzc2FnZSwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIG1lc3NhZ2UKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5GYXVsdCBnZXRGYXVsdChTdHJpbmcgbmFtZSkKLSAgewotICAgIEZhdWx0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBpZiAobmFtZS5lcXVhbHMoZmF1bHQuZ2V0TmFtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmF1bHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCBhbGwgdGhlIGZhdWx0IG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9wZXJhdGlvbi4KLSAgICogQHJldHVybiBuYW1lcyBvZiBmYXVsdCBtZXNzYWdlcwotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0RmF1bHRzKCkKLSAgewotICAgIEhhc2hNYXAgaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUZhdWx0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgaS5uZXh0KCk7Ci0gICAgICBoYXNoTWFwLnB1dChmYXVsdC5nZXROYW1lKCksIGZhdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hNYXA7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgUGFydCBuYW1lcy4gTm90ZSB0aGF0IAotICAgKiBnZXRQYXJhbWV0ZXJFT3JkZXJpbmcoKSByZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBQYXJ0cy4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRQYXJhbWV0ZXJPcmRlcmluZygpCi0gIHsKLSAgICBMaXN0IG9yZGVyaW5nID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVQYXJhbWV0ZXJPcmRlcmluZygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgICBvcmRlcmluZy5hZGQocGFydC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUQkQgLSBoYW5kbGUgZXhjZXB0aW9uCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvcmRlcmluZy5pc0VtcHR5KCkgPyBudWxsIDogb3JkZXJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJPcmRlcmluZyhMaXN0IHBhcmFtZXRlck9yZGVyKQotICB7Ci0gICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICBpZiAocGFyYW1ldGVyT3JkZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBwYXJhbWV0ZXJPcmRlci5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgICAgIHBhcnQuc2V0TmFtZSgoU3RyaW5nKSBpLm5leHQoKSk7Ci0gICAgICAgIGdldEVQYXJhbWV0ZXJPcmRlcmluZygpLmFkZChwYXJ0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5JbnB1dCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUlucHV0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbnB1dChqYXZheC53c2RsLklucHV0IGlucHV0KQotICB7Ci0gICAgc2V0RUlucHV0KChJbnB1dCkgaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIGphdmF4LndzZGwuT3V0cHV0IGdldE91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU91dHB1dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG91dHB1dCkKLSAgewotICAgIHNldEVPdXRwdXQoKE91dHB1dCkgb3V0cHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgICByZXR1cm4gYmFzaWNTZXRFSW5wdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICAgIHJldHVybiBiYXNpY1NldEVPdXRwdXQobnVsbCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FRkFVTFRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUZhdWx0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1NUWUxFOgotICAgICAgICByZXR1cm4gZ2V0U3R5bGUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19OQU1FOgotICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIGlzVW5kZWZpbmVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVVSSSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgcmV0dXJuIGdldEVJbnB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQ6Ci0gICAgICAgIHJldHVybiBnZXRFT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUZBVUxUUzoKLSAgICAgICAgcmV0dXJuIGdldEVGYXVsdHMoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FUEFSQU1FVEVSX09SREVSSU5HOgotICAgICAgICByZXR1cm4gZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19TVFlMRToKLSAgICAgICAgc2V0U3R5bGUoKE9wZXJhdGlvblR5cGUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fTkFNRToKLSAgICAgICAgc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICBzZXRFT3V0cHV0KChPdXRwdXQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRUZBVUxUUzoKLSAgICAgICAgZ2V0RUZhdWx0cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVGYXVsdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORzoKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHNldFN0eWxlKFNUWUxFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19VTkRFRklORUQ6Ci0gICAgICAgIHNldFVuZGVmaW5lZChVTkRFRklORURfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KFBST1hZX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoUkVTT1VSQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VJTlBVVDoKLSAgICAgICAgc2V0RUlucHV0KChJbnB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VPVVRQVVQ6Ci0gICAgICAgIHNldEVPdXRwdXQoKE91dHB1dCludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFM6Ci0gICAgICAgIGdldEVGYXVsdHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRVBBUkFNRVRFUl9PUkRFUklORzoKLSAgICAgICAgZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fU1RZTEU6Ci0gICAgICAgIHJldHVybiBTVFlMRV9FREVGQVVMVCA9PSBudWxsID8gc3R5bGUgIT0gbnVsbCA6ICFTVFlMRV9FREVGQVVMVC5lcXVhbHMoc3R5bGUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTl9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gdW5kZWZpbmVkICE9IFVOREVGSU5FRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX1JFU09VUkNFX1VSSToKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX1VSSV9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VVUkkgIT0gbnVsbCA6ICFSRVNPVVJDRV9VUklfRURFRkFVTFQuZXF1YWxzKHJlc291cmNlVVJJKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FSU5QVVQ6Ci0gICAgICAgIHJldHVybiBlSW5wdXQgIT0gbnVsbDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX19FT1VUUFVUOgotICAgICAgICByZXR1cm4gZU91dHB1dCAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VGQVVMVFM6Ci0gICAgICAgIHJldHVybiBlRmF1bHRzICE9IG51bGwgJiYgIWVGYXVsdHMuaXNFbXB0eSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkc6Ci0gICAgICAgIHJldHVybiBlUGFyYW1ldGVyT3JkZXJpbmcgIT0gbnVsbCAmJiAhZVBhcmFtZXRlck9yZGVyaW5nLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoc3R5bGU6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoc3R5bGUpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLyAKLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBTdHJpbmcgbmFtZSA9IGNoYW5nZWRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgc2V0TmFtZShuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIHBhcmFtZXRlck9yZGVyID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwYXJhbWV0ZXJPcmRlciIpOwotICAgIGlmIChwYXJhbWV0ZXJPcmRlciAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIGFycmF5ID0gcGFyYW1ldGVyT3JkZXIuc3BsaXQoIiAiKTsKLQkgIExpc3QgbCA9IEFycmF5cy5hc0xpc3QoYXJyYXkpOwotICAgICAgc2V0UGFyYW1ldGVyT3JkZXJpbmcobCk7Ci0gICAgfQotCi0gIH0KLQotICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgc3R5bGUgPSBkZWR1Y2VPcGVyYXRpb25UeXBlKGNoYW5nZWRFbGVtZW50KTsKLSAgICBzdXBlci5lbGVtZW50Q2hhbmdlZChjaGFuZ2VkRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBzd2l0Y2ggKFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoY2hpbGQpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETENvbnN0YW50cy5JTlBVVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbnB1dCBpbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgICAgICAgIGlucHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgaW5wdXQuc2V0RWxlbWVudChjaGlsZCk7Ci0gICAgICAgICAgc2V0SW5wdXQoaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuT1VUUFVUIDoKLSAgICAgICAgewotICAgICAgICAgIE91dHB1dCBvdXRwdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgICAgICAgb3V0cHV0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgb3V0cHV0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIHNldE91dHB1dChvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIFdTRExDb25zdGFudHMuRkFVTFQgOgotICAgICAgICB7Ci0gICAgICAgICAgRmF1bHQgZmF1bHQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmF1bHQoKTsKLSAgICAgICAgICBmYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgIGZhdWx0LnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGFkZEZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICByZW1vdmUodGhpcywgaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgY29tcG9uZW50OwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIElucHV0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5zZXRFSW5wdXQobnVsbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgT3V0cHV0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5zZXRFT3V0cHV0KG51bGwpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEZhdWx0KQotICAgIHsKLSAgICAgIG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RlbE9iamVjdHMoT2JqZWN0IGNvbXBvbmVudCkKLSAgewotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBjb21wb25lbnQ7Ci0KLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uLmdldEVJbnB1dCgpICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5hZGQob3BlcmF0aW9uLmdldEVJbnB1dCgpKTsKLSAgICB9Ci0KLSAgICBpZiAob3BlcmF0aW9uLmdldEVPdXRwdXQoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKG9wZXJhdGlvbi5nZXRFT3V0cHV0KCkpOwotICAgIH0KLQotICAgIGxpc3QuYWRkQWxsKG9wZXJhdGlvbi5nZXRFRmF1bHRzKCkpOwotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldE9wZXJhdGlvbl9OYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0TmFtZSgpKTsKLSAgICAgIGlmIChlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRPcGVyYXRpb25fU3R5bGUoKSkKLSAgICAgIHsKLSAgICAgICAgT3BlcmF0aW9uVHlwZSB0YXJnZXRUeXBlID0gZ2V0U3R5bGUoKTsKLSAgICAgICAgT3BlcmF0aW9uVHlwZSBjdXJyZW50VHlwZSA9IGRlZHVjZU9wZXJhdGlvblR5cGUodGhlRWxlbWVudCk7Ci0gICAgICAgIGlmICh0YXJnZXRUeXBlLmVxdWFscyhjdXJyZW50VHlwZSkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBlbHNlIGlmICgodGFyZ2V0VHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFKSB8fCB0YXJnZXRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKQotICAgICAgICAgICAgICAgICAgJiYgKGN1cnJlbnRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpIHx8IGN1cnJlbnRUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UpKSkKLSAgICAgICAgCXJlb3JkZXJDaGlsZHJlbigpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgc3R5bGUgPSBkZWR1Y2VPcGVyYXRpb25UeXBlKHRoZUVsZW1lbnQpOyAvLyBzd2l0Y2ggYmFjay4gbm8gc3VwcG9ydCBmb3IgdGhlIG90aGVyIHR5cGVzCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBTd2l0Y2ggPGlucHV0PiBhbmQgPG91dHB1dD4KLSAgcHJpdmF0ZSB2b2lkIHJlb3JkZXJDaGlsZHJlbigpCi0gIHsKLSAgICAvLyBGaW5kIG91dCB0aGUgcG9zaXRpb25zIG9mIDxpbnB1dD4gYW5kIDxvdXRwdXQ+Ci0gICAgTm9kZSBpbnB1dCA9IG51bGw7Ci0gICAgTm9kZSBvdXRwdXQgPSBudWxsOwotICAgIE5vZGUgcmVmZXJlbmNlID0gbnVsbDsKLSAgICBmb3IgKE5vZGUgY3VycmVudD1nZXRFbGVtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpOyBjdXJyZW50IT0gbnVsbDtjdXJyZW50PWN1cnJlbnQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgCWlmIChXU0RMQ29uc3RhbnRzLklOUFVUID09IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoKEVsZW1lbnQpY3VycmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnB1dCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICAgIHsgCi0gICAgICAgICAgICAvLyBjcy4uIGZvciBzYWZldHkgdXNlIGN1cnJlbnQuZ2V0TmV4dFNpYmxpbmcoKSBpbnN0ZWFkIG9mIG5vZGVMaXN0Lml0ZW0oaSsxKSAgICAgICAgICAgIAotICAgICAgICAgICAgcmVmZXJlbmNlID0gY3VycmVudC5nZXROZXh0U2libGluZygpOwotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFdTRExDb25zdGFudHMuT1VUUFVUID09IFdTRExVdGlsLmdldEluc3RhbmNlKCkuZ2V0V1NETFR5cGUoKEVsZW1lbnQpY3VycmVudCkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRwdXQgPSBjdXJyZW50OwotICAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIGNzLi4gZm9yIHNhZmV0eSB1c2UgY3VycmVudC5nZXROZXh0U2libGluZygpIGluc3RlYWQgb2Ygbm9kZUxpc3QuaXRlbShpKzEpICAgICAgICAgICAgCi0gICAgICAgICAgICByZWZlcmVuY2UgPSBjdXJyZW50LmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IC8vIGVuZCBmb3IKLSAgICAKLSAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiBvdXRwdXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChnZXRTdHlsZSgpLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKQotICAgICAgewotICAgICAgCS8vIGN1cnJlbnQgb3JkZXI6IDxvdXRwdXQ+IDxpbnB1dD4KLSAgICAgICAgc3dpdGNoQ2hpbGRyZW4ocGFyZW50LG91dHB1dCxpbnB1dCxyZWZlcmVuY2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZ2V0U3R5bGUoKS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5TT0xJQ0lUX1JFU1BPTlNFKSkKLSAgICAgIHsKLSAgICAgICAgLy8gY3VycmVudCBvcmRlcjogPGlucHV0PiA8b3V0cHV0PgotICAgICAgICBzd2l0Y2hDaGlsZHJlbihwYXJlbnQsaW5wdXQsb3V0cHV0LHJlZmVyZW5jZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgc3dpdGNoQ2hpbGRyZW4oTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQxLCBOb2RlIGNoaWxkMiwgTm9kZSBuZXh0T2ZDaGlsZDIpCi0gIHsKLSAgICAvLyBjdXJyZW50IG5vZGUgc2VxdWVuY2U6IDxjaGlsZDE+IDxjaGlsZDI+IDxuZXh0T2ZDaGlsZDI+Ci0gICAgbmljZVJlbW92ZUNoaWxkKHBhcmVudCxjaGlsZDIpOwotICAgIG5pY2VJbnNlcnRCZWZvcmUocGFyZW50LGNoaWxkMixjaGlsZDEpOwotICAgIG5pY2VSZW1vdmVDaGlsZChwYXJlbnQsY2hpbGQxKTsKLSAgICBuaWNlSW5zZXJ0QmVmb3JlKHBhcmVudCxjaGlsZDEsbmV4dE9mQ2hpbGQyKTsKLSAgfQotCi0gIHB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKQotICB7Ci0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gY3JlYXRlRWxlbWVudChXU0RMQ29uc3RhbnRzLk9QRVJBVElPTik7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIElucHV0IGlucHV0ID0gZ2V0RUlucHV0KCk7Ci0gICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoSW5wdXRJbXBsKSBpbnB1dCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgT3V0cHV0IG91dHB1dCA9IGdldEVPdXRwdXQoKTsKLSAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgewotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoT3V0cHV0SW1wbCkgb3V0cHV0KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldEVGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEZhdWx0SW1wbCkgZmF1bHQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9IAotICAKLX0gLy9PcGVyYXRpb25JbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3V0cHV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL091dHB1dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjNzYzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3V0cHV0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0cHV0SW1wbCBleHRlbmRzIE1lc3NhZ2VSZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgT3V0cHV0Ci17Ci0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIE91dHB1dEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRwdXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk1lc3NhZ2UgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoamF2YXgud3NkbC5NZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSkgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2UpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19OQU1FOgotICAgICAgICBzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRU1FU1NBR0U6Ci0gICAgICAgIHNldEVNZXNzYWdlKChvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9VVFBVVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUX19OQU1FOgotICAgICAgICByZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVRfX0VNRVNTQUdFOgotICAgICAgICByZXR1cm4gZU1lc3NhZ2UgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuT1VUUFVUKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci19IC8vT3V0cHV0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BhcnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUGFydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1OWIwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUGFydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUGFydEltcGwjZ2V0RWxlbWVudE5hbWUgPGVtPkVsZW1lbnQgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBhcnRJbXBsI2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5QYXJ0SW1wbCNnZXRUeXBlRGVmaW5pdGlvbiA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUGFydEltcGwjZ2V0RWxlbWVudERlY2xhcmF0aW9uIDxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUGFydEltcGwjZ2V0RU1lc3NhZ2UgPGVtPkVNZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFydEltcGwgZXh0ZW5kcyBXU0RMRWxlbWVudEltcGwgaW1wbGVtZW50cyBQYXJ0Ci17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50TmFtZSgpIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVsZW1lbnROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBRTmFtZSBFTEVNRU5UX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50TmFtZSgpIDxlbT5FbGVtZW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVsZW1lbnROYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFFOYW1lIGVsZW1lbnROYW1lID0gRUxFTUVOVF9OQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU5hbWUoKSA8ZW0+VHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUeXBlTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgVFlQRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU5hbWUoKSA8ZW0+VHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUeXBlTmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBRTmFtZSB0eXBlTmFtZSA9IFRZUEVfTkFNRV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZURlZmluaXRpb24oKSA8ZW0+VHlwZSBEZWZpbml0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRUeXBlRGVmaW5pdGlvbigpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnREZWNsYXJhdGlvbigpIDxlbT5FbGVtZW50IERlY2xhcmF0aW9uPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVNZXNzYWdlKCkgPGVtPkVNZXNzYWdlPC9lbT59JyByZWZlcmVuY2UuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFTWVzc2FnZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlIGVNZXNzYWdlID0gbnVsbDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfUEFSVF9FWFRFTlNJT05TID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvcGFydC1leHRlbnNpb25zLyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVTU0FHRSA9ICJtZXNzYWdlIjsKLSAgcHJpdmF0ZSBNYXAgZXh0ZW5zaW9uQXR0cmlidXRlcyA9IG5ldyBFeHRlbnNpb25BdHRyaWJ1dGVNYXAoKTsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBQYXJ0SW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotICB7Ci0gICAgU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotICAgIG5hbWUgPSBuZXdOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBBUlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldEVsZW1lbnROYW1lKCkKLSAgewotICAgIHJldHVybiBlbGVtZW50TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoUU5hbWUgbmV3RWxlbWVudE5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRFbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICAgIGVsZW1lbnROYW1lID0gbmV3RWxlbWVudE5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9OQU1FLCBvbGRFbGVtZW50TmFtZSwgZWxlbWVudE5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiB0eXBlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoUU5hbWUgbmV3VHlwZU5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRUeXBlTmFtZSA9IHR5cGVOYW1lOwotICAgIHR5cGVOYW1lID0gbmV3VHlwZU5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FLCBvbGRUeXBlTmFtZSwgdHlwZU5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFhTRFR5cGVEZWZpbml0aW9uIGdldFR5cGVEZWZpbml0aW9uKCkKLSAgewotICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBudWxsICYmIHR5cGVEZWZpbml0aW9uLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gb2xkVHlwZURlZmluaXRpb24gPSB0eXBlRGVmaW5pdGlvbjsKLSAgICAgIHR5cGVEZWZpbml0aW9uID0gKFhTRFR5cGVEZWZpbml0aW9uKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCl0eXBlRGVmaW5pdGlvbik7Ci0gICAgICBpZiAodHlwZURlZmluaXRpb24gIT0gb2xkVHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9ERUZJTklUSU9OLCBvbGRUeXBlRGVmaW5pdGlvbiwgdHlwZURlZmluaXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVEZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEVHlwZURlZmluaXRpb24gYmFzaWNHZXRUeXBlRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdHlwZURlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGVEZWZpbml0aW9uKFhTRFR5cGVEZWZpbml0aW9uIG5ld1R5cGVEZWZpbml0aW9uKQotICB7Ci0gICAgWFNEVHlwZURlZmluaXRpb24gb2xkVHlwZURlZmluaXRpb24gPSB0eXBlRGVmaW5pdGlvbjsKLSAgICB0eXBlRGVmaW5pdGlvbiA9IG5ld1R5cGVEZWZpbml0aW9uOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTiwgb2xkVHlwZURlZmluaXRpb24sIHR5cGVEZWZpbml0aW9uKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkKLSAgewotICAgIGlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCAmJiBlbGVtZW50RGVjbGFyYXRpb24uZUlzUHJveHkoKSkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gb2xkRWxlbWVudERlY2xhcmF0aW9uID0gZWxlbWVudERlY2xhcmF0aW9uOwotICAgICAgZWxlbWVudERlY2xhcmF0aW9uID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbillUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZWxlbWVudERlY2xhcmF0aW9uKTsKLSAgICAgIGlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gb2xkRWxlbWVudERlY2xhcmF0aW9uKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04sIG9sZEVsZW1lbnREZWNsYXJhdGlvbiwgZWxlbWVudERlY2xhcmF0aW9uKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlbGVtZW50RGVjbGFyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gYmFzaWNHZXRFbGVtZW50RGVjbGFyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnREZWNsYXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBuZXdFbGVtZW50RGVjbGFyYXRpb24pCi0gIHsKLSAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gb2xkRWxlbWVudERlY2xhcmF0aW9uID0gZWxlbWVudERlY2xhcmF0aW9uOwotICAgIGVsZW1lbnREZWNsYXJhdGlvbiA9IG5ld0VsZW1lbnREZWNsYXJhdGlvbjsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX0RFQ0xBUkFUSU9OLCBvbGRFbGVtZW50RGVjbGFyYXRpb24sIGVsZW1lbnREZWNsYXJhdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZSBnZXRFTWVzc2FnZSgpCi0gIHsKLSAgICBpZiAoZU1lc3NhZ2UgIT0gbnVsbCAmJiBlTWVzc2FnZS5lSXNQcm94eSgpKQotICAgIHsKLSAgICAgIE1lc3NhZ2Ugb2xkRU1lc3NhZ2UgPSBlTWVzc2FnZTsKLSAgICAgIGVNZXNzYWdlID0gKE1lc3NhZ2UpZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KWVNZXNzYWdlKTsKLSAgICAgIGlmIChlTWVzc2FnZSAhPSBvbGRFTWVzc2FnZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRSwgb2xkRU1lc3NhZ2UsIGVNZXNzYWdlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlTWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE1lc3NhZ2UgYmFzaWNHZXRFTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gZU1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVNZXNzYWdlKE1lc3NhZ2UgbmV3RU1lc3NhZ2UpCi0gIHsKLSAgICBNZXNzYWdlIG9sZEVNZXNzYWdlID0gZU1lc3NhZ2U7Ci0gICAgZU1lc3NhZ2UgPSBuZXdFTWVzc2FnZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRSwgb2xkRU1lc3NhZ2UsIGVNZXNzYWdlKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25BdHRyaWJ1dGUoUU5hbWUgbmFtZSwgUU5hbWUgdmFsdWUpCi0gIHsKLSAgICBTdHJpbmcgbG9jYWxOYW1lID0gbmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICBTdHJpbmcgbnNVUkkgPSBuYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIGlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgZXh0ZW5zaW9uQXR0cmlidXRlcy5yZW1vdmUobmFtZSk7Ci0gICAgZWxzZQotICAgICAgZXh0ZW5zaW9uQXR0cmlidXRlcy5wdXQobmFtZSwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGdldEV4dGVuc2lvbkF0dHJpYnV0ZU5hbWVzKCkKLSAgewotICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcChleHRlbnNpb25BdHRyaWJ1dGVzKTsKLQotICAgIC8vIEFkanVzdCBtZXNzYWdlTmFtZSBhdHRyaWJ1dGUKLSAgICBRTmFtZSBtZXNzYWdlTmFtZSA9IGdldE1lc3NhZ2UoKSAhPSBudWxsID8gZ2V0TWVzc2FnZSgpLmdldFFOYW1lKCkgOiBudWxsOwotICAgIGlmIChtZXNzYWdlTmFtZSAhPSBudWxsKQotICAgICAgbWFwLnB1dChuZXcgUU5hbWUoTlNfVVJJX1BBUlRfRVhURU5TSU9OUywgQVRUUl9NRVNTQUdFKSwgbWVzc2FnZU5hbWUpOwotICAgIGVsc2UKLSAgICAgIG1hcC5yZW1vdmUobmV3IFFOYW1lKE5TX1VSSV9QQVJUX0VYVEVOU0lPTlMsIEFUVFJfTUVTU0FHRSkpOwotCi0gICAgcmV0dXJuIG1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldEV4dGVuc2lvbkF0dHJpYnV0ZShRTmFtZSBuYW1lKQotICB7Ci0gICAgaWYgKG5hbWUuZXF1YWxzKG5ldyBRTmFtZShOU19VUklfUEFSVF9FWFRFTlNJT05TLCBBVFRSX01FU1NBR0UpKSkKLSAgICAgIHJldHVybiBnZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpIDogbnVsbDsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKFFOYW1lKSBleHRlbnNpb25BdHRyaWJ1dGVzLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoamF2YXgud3NkbC5NZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSkgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5NZXNzYWdlIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIGdldEVNZXNzYWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfTkFNRToKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfTkFNRToKLSAgICAgICAgcmV0dXJuIGdldFR5cGVOYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfREVGSU5JVElPTjoKLSAgICAgICAgaWYgKHJlc29sdmUpIHJldHVybiBnZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX0RFQ0xBUkFUSU9OOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVsZW1lbnREZWNsYXJhdGlvbigpOwotICAgICAgICByZXR1cm4gYmFzaWNHZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRU1FU1NBR0U6Ci0gICAgICAgIGlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RU1lc3NhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGJhc2ljR2V0RU1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9OQU1FOgotICAgICAgICBzZXRFbGVtZW50TmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfTkFNRToKLSAgICAgICAgc2V0VHlwZU5hbWUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX0RFRklOSVRJT046Ci0gICAgICAgIHNldFR5cGVEZWZpbml0aW9uKChYU0RUeXBlRGVmaW5pdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9ERUNMQVJBVElPTjoKLSAgICAgICAgc2V0RWxlbWVudERlY2xhcmF0aW9uKChYU0RFbGVtZW50RGVjbGFyYXRpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFOgotICAgICAgICBzZXRFTWVzc2FnZSgoTWVzc2FnZSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fRUxFTUVOVF9OQU1FOgotICAgICAgICBzZXRFbGVtZW50TmFtZShFTEVNRU5UX05BTUVfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX1RZUEVfTkFNRToKLSAgICAgICAgc2V0VHlwZU5hbWUoVFlQRV9OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX0RFRklOSVRJT046Ci0gICAgICAgIHNldFR5cGVEZWZpbml0aW9uKChYU0RUeXBlRGVmaW5pdGlvbiludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX0RFQ0xBUkFUSU9OOgotICAgICAgICBzZXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbiludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTUVTU0FHRToKLSAgICAgICAgc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpbnVsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VMRU1FTlRfTkFNRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudE5hbWUgIT0gbnVsbCA6ICFFTEVNRU5UX05BTUVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnROYW1lKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUEFSVF9fVFlQRV9OQU1FOgotICAgICAgICByZXR1cm4gVFlQRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyB0eXBlTmFtZSAhPSBudWxsIDogIVRZUEVfTkFNRV9FREVGQVVMVC5lcXVhbHModHlwZU5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19UWVBFX0RFRklOSVRJT046Ci0gICAgICAgIHJldHVybiB0eXBlRGVmaW5pdGlvbiAhPSBudWxsOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUX19FTEVNRU5UX0RFQ0xBUkFUSU9OOgotICAgICAgICByZXR1cm4gZWxlbWVudERlY2xhcmF0aW9uICE9IG51bGw7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBBUlRfX0VNRVNTQUdFOgotICAgICAgICByZXR1cm4gZU1lc3NhZ2UgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIGVsZW1lbnROYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKGVsZW1lbnROYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHR5cGVOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHR5cGVOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIE1hcCBnZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkKLSAgewotICAgIHJldHVybiBleHRlbnNpb25BdHRyaWJ1dGVzOwotICB9Ci0KLSAgY2xhc3MgRXh0ZW5zaW9uQXR0cmlidXRlTWFwIGV4dGVuZHMgSGFzaE1hcAotICB7Ci0gICAgRXh0ZW5zaW9uQXR0cmlidXRlTWFwKCkKLSAgICB7Ci0gICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWwpCi0gICAgewotICAgICAgUU5hbWUgbmFtZSA9IChRTmFtZSkga2V5OwotICAgICAgUU5hbWUgdmFsdWUgPSAoUU5hbWUpIHZhbDsKLSAgICAgIFN0cmluZyBsTmFtZSA9IG5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICBTdHJpbmcgblNwYWNlID0gbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgaWYgKE5TX1VSSV9QQVJUX0VYVEVOU0lPTlMuZXF1YWxzKG5TcGFjZSkgJiYgQVRUUl9NRVNTQUdFLmVxdWFscyhsTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGphdmF4LndzZGwuTWVzc2FnZSBtZXNzYWdlUHJveHkgPSBuZXcgTWVzc2FnZUltcGwoKTsKLSAgICAgICAgbWVzc2FnZVByb3h5LnNldFFOYW1lKHZhbHVlKTsKLSAgICAgICAgc2V0RU1lc3NhZ2UoKE1lc3NhZ2UpIG1lc3NhZ2VQcm94eSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLSAgfQotCi0gIC8vCi0gIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gIC8vCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQotICAgIFN0cmluZyBuYW1lID0gY2hhbmdlZEVsZW1lbnQuZ2V0QXR0cmlidXRlTlMobnVsbCwgIm5hbWUiKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgU3RyaW5nIGVsZW1lbnRBdHRyID0gV1NETENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoY2hhbmdlZEVsZW1lbnQsIFdTRExDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEUpOwotICAgIHNldEVsZW1lbnROYW1lKGVsZW1lbnRBdHRyICE9IG51bGwgPyBjcmVhdGVRTmFtZShkZWZpbml0aW9uLCBlbGVtZW50QXR0cikgOiBudWxsKTsKLQkJICAgIAotICAgIFN0cmluZyB0eXBlQXR0ciA9IFdTRExDb25zdGFudHMuZ2V0QXR0cmlidXRlKGNoYW5nZWRFbGVtZW50LCBXU0RMQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFKTsKLSAgICBzZXRUeXBlTmFtZSh0eXBlQXR0ciAhPSBudWxsID8gY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgdHlwZUF0dHIpIDogbnVsbCk7Ci0KLSAgICByZWNvbmNpbGVSZWZlcmVuY2VzKGZhbHNlKTsKLSAgfQotCi0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICAvL3N1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhcnRfTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0KLSAgICAgIGlmIChlQXR0cmlidXRlID09IG51bGwgfHwgZUF0dHJpYnV0ZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFydF9UeXBlTmFtZSgpKQotICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGVVUklWYWx1ZSh0aGVFbGVtZW50LCBXU0RMQ29uc3RhbnRzLlRZUEVfQVRUUklCVVRFLCBnZXRUeXBlTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpICsgIiMiICsgZ2V0VHlwZU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgIAotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJ0X0VsZW1lbnROYW1lKCkpCi0gICAgICAgIGlmIChnZXRFbGVtZW50TmFtZSgpICE9IG51bGwpCi0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuRUxFTUVOVF9BVFRSSUJVVEUsIGdldEVsZW1lbnROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiIyIgKyBnZXRFbGVtZW50TmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgCi0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFydF9UeXBlRGVmaW5pdGlvbigpKQotICAgICAgewotICAgICAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IGdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmICh0eXBlRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuVFlQRV9BVFRSSUJVVEUsIHR5cGVEZWZpbml0aW9uLmdldFVSSSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGVSZWZlcmVuY2UgPT0gbnVsbCB8fCBlUmVmZXJlbmNlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJ0X0VsZW1lbnREZWNsYXJhdGlvbigpKQotICAgICAgewotICAgICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICAgICAgaWYgKGVsZW1lbnREZWNsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBuaWNlU2V0QXR0cmlidXRlVVJJVmFsdWUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5FTEVNRU5UX0FUVFJJQlVURSwgZWxlbWVudERlY2wuZ2V0VVJJKCkpOwotICAgICAgICB9Ci0gICAgICB9ICAgICAgCi0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuUEFSVCk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIG5ld0VsZW1lbnREZWNsYXJhdGlvbiA9IHJlc29sdmVFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudE5hbWUpOwotICAgIGlmIChuZXdFbGVtZW50RGVjbGFyYXRpb24gIT0gZWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIHNldEVsZW1lbnREZWNsYXJhdGlvbihuZXdFbGVtZW50RGVjbGFyYXRpb24pOwotICAgIH0KLQotICAgIFhTRFR5cGVEZWZpbml0aW9uIG5ld1R5cGVEZWZpbml0aW9uID0gcmVzb2x2ZVR5cGVEZWZpbml0aW9uKHR5cGVOYW1lKTsKLSAgICBpZiAobmV3VHlwZURlZmluaXRpb24gIT0gdHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgc2V0VHlwZURlZmluaXRpb24obmV3VHlwZURlZmluaXRpb24pOwotICAgIH0KLQotICAgIHN1cGVyLnJlY29uY2lsZVJlZmVyZW5jZXMoZGVlcCk7Ci0gIH0KLQotICBwcml2YXRlIFhTREVsZW1lbnREZWNsYXJhdGlvbiByZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKFFOYW1lIHFuYW1lKQotICB7Ci0gICAgWFNERWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbkltcGwgZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uSW1wbCkgZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5yZXNvbHZlRWxlbWVudERlY2xhcmF0aW9uKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLCBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIFhTRFR5cGVEZWZpbml0aW9uIHJlc29sdmVUeXBlRGVmaW5pdGlvbihRTmFtZSBxbmFtZSkKLSAgewotICAgIFhTRFR5cGVEZWZpbml0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbkltcGwgZGVmaW5pdGlvbiA9IChEZWZpbml0aW9uSW1wbCkgZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZGVmaW5pdGlvbi5yZXNvbHZlVHlwZURlZmluaXRpb24ocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCksIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfSAvL1BhcnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Qb3J0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODMwOTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Qb3J0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBvcnRJbXBsI2dldEVCaW5kaW5nIDxlbT5FQmluZGluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUG9ydAotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0TmFtZSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldE5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFQmluZGluZygpIDxlbT5FQmluZGluZzwvZW0+fScgcmVmZXJlbmNlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RUJpbmRpbmcoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZyBlQmluZGluZyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgUG9ydEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0KCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLSAgewotICAgIFN0cmluZyBvbGROYW1lID0gbmFtZTsKLSAgICBuYW1lID0gbmV3TmFtZTsKLSAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5QT1JUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nIGdldEVCaW5kaW5nKCkKLSAgewotICAgIGlmIChlQmluZGluZyAhPSBudWxsICYmIGVCaW5kaW5nLmVJc1Byb3h5KCkpCi0gICAgewotICAgICAgQmluZGluZyBvbGRFQmluZGluZyA9IGVCaW5kaW5nOwotICAgICAgZUJpbmRpbmcgPSAoQmluZGluZyllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpZUJpbmRpbmcpOwotICAgICAgaWYgKGVCaW5kaW5nICE9IG9sZEVCaW5kaW5nKQotICAgICAgewotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIFdTRExQYWNrYWdlLlBPUlRfX0VCSU5ESU5HLCBvbGRFQmluZGluZywgZUJpbmRpbmcpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCaW5kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZyBiYXNpY0dldEVCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBlQmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RUJpbmRpbmcoQmluZGluZyBuZXdFQmluZGluZykKLSAgewotICAgIEJpbmRpbmcgb2xkRUJpbmRpbmcgPSBlQmluZGluZzsKLSAgICBlQmluZGluZyA9IG5ld0VCaW5kaW5nOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBPUlRfX0VCSU5ESU5HLCBvbGRFQmluZGluZywgZUJpbmRpbmcpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkJpbmRpbmcgZ2V0QmluZGluZygpCi0gIHsKLSAgICByZXR1cm4gZ2V0RUJpbmRpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJpbmRpbmcoamF2YXgud3NkbC5CaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBzZXRFQmluZGluZygoQmluZGluZykgYmluZGluZyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIGlmIChmZWF0dXJlSUQgPj0gMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX05BTUU6Ci0gICAgICAgIHJldHVybiBnZXROYW1lKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VCSU5ESU5HOgotICAgICAgICBpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVCaW5kaW5nKCk7Ci0gICAgICAgIHJldHVybiBiYXNpY0dldEVCaW5kaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkc6Ci0gICAgICAgIHNldEVCaW5kaW5nKChCaW5kaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX05BTUU6Ci0gICAgICAgIHNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRUJJTkRJTkc6Ci0gICAgICAgIHNldEVCaW5kaW5nKChCaW5kaW5nKW51bGwpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgcmV0dXJuIGVFeHRlbnNpYmlsaXR5RWxlbWVudHMgIT0gbnVsbCAmJiAhZUV4dGVuc2liaWxpdHlFbGVtZW50cy5pc0VtcHR5KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX05BTUU6Ci0gICAgICAgIHJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfX0VCSU5ESU5HOgotICAgICAgICByZXR1cm4gZUJpbmRpbmcgIT0gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChuYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgc2V0TmFtZShjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgcmVjb25jaWxlUmVmZXJlbmNlcyhmYWxzZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBQb3J0IHBvcnQgPSAoUG9ydCkgY29tcG9uZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbChwb3J0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRfTmFtZSgpKQotICAgICAgICBuaWNlU2V0QXR0cmlidXRlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuTkFNRV9BVFRSSUJVVEUsIGdldE5hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlUmVmZXJlbmNlKEVSZWZlcmVuY2UgZVJlZmVyZW5jZSkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgICAgcmV0dXJuOwotCi0gICAgc3VwZXIuY2hhbmdlUmVmZXJlbmNlKGVSZWZlcmVuY2UpOwotICAgIEVsZW1lbnQgdGhlRWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLSAgICBpZiAodGhlRWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlUmVmZXJlbmNlID09IG51bGwgfHwgZVJlZmVyZW5jZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydF9FQmluZGluZygpKQotICAgICAgewotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBnZXRFQmluZGluZygpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgUU5hbWUgcU5hbWUgPSBiaW5kaW5nLmdldFFOYW1lKCk7Ci0gICAgICAgICAgbmljZVNldEF0dHJpYnV0ZVVSSVZhbHVlKHRoZUVsZW1lbnQsIFdTRExDb25zdGFudHMuQklORElOR19BVFRSSUJVVEUsIHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpICsgIiMiICsgcU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuUE9SVCk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVSZWZlcmVuY2VzKGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgUU5hbWUgYmluZGluZ1FOYW1lID0gY3JlYXRlUU5hbWUoZGVmaW5pdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoImJpbmRpbmciKSk7Ci0gICAgICBCaW5kaW5nIG5ld0JpbmRpbmcgPSAoYmluZGluZ1FOYW1lICE9IG51bGwpID8gKEJpbmRpbmcpIGRlZmluaXRpb24uZ2V0QmluZGluZyhiaW5kaW5nUU5hbWUpIDogbnVsbDsKLSAgICAgIGlmIChuZXdCaW5kaW5nICE9IGdldEVCaW5kaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIHNldEVCaW5kaW5nKG5ld0JpbmRpbmcpOwotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5yZWNvbmNpbGVSZWZlcmVuY2VzKGRlZXApOwotICB9Ci0KLX0gLy9Qb3J0SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZjYTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Qb3J0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9ydCBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydFR5cGVJbXBsI2dldFFOYW1lIDxlbT5RTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLlBvcnRUeXBlSW1wbCNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydFR5cGVJbXBsI2lzUHJveHkgPGVtPlByb3h5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuUG9ydFR5cGVJbXBsI2dldFJlc291cmNlVVJJIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5Qb3J0VHlwZUltcGwjZ2V0RU9wZXJhdGlvbnMgPGVtPkVPcGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydFR5cGVJbXBsIGV4dGVuZHMgV1NETEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUG9ydFR5cGUKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UU5hbWUoKSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFFOYW1lIHFOYW1lID0gUU5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVOREVGSU5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdW5kZWZpbmVkID0gVU5ERUZJTkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9YWV9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJveHkgPSBQUk9YWV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVVSSSA9IFJFU09VUkNFX1VSSV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RU9wZXJhdGlvbnMoKSA8ZW0+RU9wZXJhdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RU9wZXJhdGlvbnMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZU9wZXJhdGlvbnMgPSBudWxsOwotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIFBvcnRUeXBlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRUeXBlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gcU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFFOYW1lKFFOYW1lIG5ld1FOYW1lKQotICB7Ci0gICAgUU5hbWUgb2xkUU5hbWUgPSBxTmFtZTsKLSAgICBxTmFtZSA9IG5ld1FOYW1lOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUU5BTUUsIG9sZFFOYW1lLCBxTmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZGVmaW5lZCgpCi0gIHsKLSAgICByZXR1cm4gdW5kZWZpbmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiBuZXdVbmRlZmluZWQpCi0gIHsKLSAgICBib29sZWFuIG9sZFVuZGVmaW5lZCA9IHVuZGVmaW5lZDsKLSAgICB1bmRlZmluZWQgPSBuZXdVbmRlZmluZWQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19VTkRFRklORUQsIG9sZFVuZGVmaW5lZCwgdW5kZWZpbmVkKSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUHJveHkoKQotICB7Ci0gICAgcmV0dXJuIHByb3h5OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm94eShib29sZWFuIG5ld1Byb3h5KQotICB7Ci0gICAgYm9vbGVhbiBvbGRQcm94eSA9IHByb3h5OwotICAgIHByb3h5ID0gbmV3UHJveHk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWSwgb2xkUHJveHksIHByb3h5KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIHJlc291cmNlVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVVSSShTdHJpbmcgbmV3UmVzb3VyY2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgb2xkUmVzb3VyY2VVUkkgPSByZXNvdXJjZVVSSTsKLSAgICByZXNvdXJjZVVSSSA9IG5ld1Jlc291cmNlVVJJOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUkVTT1VSQ0VfVVJJLCBvbGRSZXNvdXJjZVVSSSwgcmVzb3VyY2VVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVPcGVyYXRpb25zKCkKLSAgewotICAgIGlmIChlT3BlcmF0aW9ucyA9PSBudWxsKQotICAgIHsKLSAgICAgIGVPcGVyYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE9wZXJhdGlvbi5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUyk7Ci0gICAgfQotICAgIHJldHVybiBlT3BlcmF0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBBZGQgYW4gb3BlcmF0aW9uIHRvIHRoaXMgcG9ydCB0eXBlLgotICAgKiBAcGFyYW0gb3BlcmF0aW9uIHRoZSBvcGVyYXRpb24gdG8gYmUgYWRkZWQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRPcGVyYXRpb24oamF2YXgud3NkbC5PcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgaWYgKCFvcGVyYXRpb24uaXNVbmRlZmluZWQoKSkKLSAgICAgIGdldEVPcGVyYXRpb25zKCkuYWRkKG9wZXJhdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLiBOb3RlIHRoYXQgb3BlcmF0aW9uIG5hbWVzIGNhbgotICAgKiBiZSBvdmVybG9hZGVkIHdpdGhpbiBhIFBvcnRUeXBlLiBJbiBjYXNlIG9mIG92ZXJsb2FkaW5nLCB0aGUKLSAgICogbmFtZXMgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgbWVzc2FnZXMgY2FuIGJlIHVzZWQgdG8gZnVydGhlcgotICAgKiByZWZpbmUgdGhlIHNlYXJjaC4KLSAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgb3BlcmF0aW9uLgotICAgKiBAcGFyYW0gaW5wdXROYW1lIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBtZXNzYWdlOyBpZiB0aGlzIGlzIG51bGwKLSAgICogICAgICAgIGl0IHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHBhcmFtIG91dHB1dE5hbWUgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBtZXNzYWdlOyBpZiB0aGlzIGlzIG51bGwKLSAgICogICAgICAgIGl0IHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24sIG9yIG51bGwgaWYgdGhlcmUgd2Fzbid0Ci0gICAqICAgICAgICAgYW55IG1hdGNoaW5nIG9wZXJhdGlvbgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLk9wZXJhdGlvbiBnZXRPcGVyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBpbnB1dE5hbWUsIFN0cmluZyBvdXRwdXROYW1lKQotICB7Ci0gICAgSXRlcmF0b3Igb3BJdGVyYXRvciA9IGdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChvcEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBqYXZheC53c2RsLk9wZXJhdGlvbiBvcCA9IChqYXZheC53c2RsLk9wZXJhdGlvbikgb3BJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAob3AgPT0gbnVsbCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIFN0cmluZyBvcE5hbWUgPSBvcC5nZXROYW1lKCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKG9wTmFtZSkpCi0gICAgICAgICAgb3AgPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmFtZSAhPSBudWxsIHx8IG9wTmFtZSAhPSBudWxsKQotICAgICAgICBvcCA9IG51bGw7Ci0KLSAgICAgIGlmIChvcCAhPSBudWxsICYmIGlucHV0TmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBqYXZheC53c2RsLklucHV0IGlucHV0ID0gb3AuZ2V0SW5wdXQoKTsKLSAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgb3BJbnB1dE5hbWUgPSBpbnB1dC5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG9wSW5wdXROYW1lID09IG51bGwgfHwgIW9wSW5wdXROYW1lLmVxdWFscyhpbnB1dE5hbWUpKQotICAgICAgICAgICAgb3AgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvcCA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvcCAhPSBudWxsICYmIG91dHB1dE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgamF2YXgud3NkbC5PdXRwdXQgb3V0cHV0ID0gb3AuZ2V0T3V0cHV0KCk7Ci0gICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBvcE91dHB1dE5hbWUgPSBvdXRwdXQuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChvcE91dHB1dE5hbWUgPT0gbnVsbCB8fCAhb3BPdXRwdXROYW1lLmVxdWFscyhvdXRwdXROYW1lKSkKLSAgICAgICAgICAgIG9wID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgb3AgPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAob3AgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG9wOwotICAgIH0gLy8gZW5kIHdoaWxlCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogR2V0IGFsbCB0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0T3BlcmF0aW9ucygpCi0gIHsKLSAgICBpZiAoIWlzVW5kZWZpbmVkKCkpCi0gICAgICByZXR1cm4gZ2V0RU9wZXJhdGlvbnMoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRU9QRVJBVElPTlM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFT3BlcmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1FOQU1FOgotICAgICAgICByZXR1cm4gZ2V0UU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWToKLSAgICAgICAgcmV0dXJuIGlzUHJveHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VVUkkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FT1BFUkFUSU9OUzoKLSAgICAgICAgcmV0dXJuIGdldEVPcGVyYXRpb25zKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRUxFTUVOVDoKLSAgICAgICAgc2V0RWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19RTkFNRToKLSAgICAgICAgc2V0UU5hbWUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUFJPWFk6Ci0gICAgICAgIHNldFByb3h5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VPUEVSQVRJT05TOgotICAgICAgICBnZXRFT3BlcmF0aW9ucygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVPcGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUU5BTUU6Ci0gICAgICAgIHNldFFOYW1lKFFOQU1FX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKFVOREVGSU5FRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoUFJPWFlfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICBzZXRSZXNvdXJjZVVSSShSRVNPVVJDRV9VUklfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRU9QRVJBVElPTlM6Ci0gICAgICAgIGdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBRTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcU5hbWUgIT0gbnVsbCA6ICFRTkFNRV9FREVGQVVMVC5lcXVhbHMocU5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QT1JUX1RZUEVfX1VOREVGSU5FRDoKLSAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCAhPSBVTkRFRklORURfRURFRkFVTFQ7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fUFJPWFk6Ci0gICAgICAgIHJldHVybiBwcm94eSAhPSBQUk9YWV9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVF9UWVBFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBSRVNPVVJDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVVJJICE9IG51bGwgOiAhUkVTT1VSQ0VfVVJJX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVSSSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRV9fRU9QRVJBVElPTlM6Ci0gICAgICAgIHJldHVybiBlT3BlcmF0aW9ucyAhPSBudWxsICYmICFlT3BlcmF0aW9ucy5pc0VtcHR5KCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgKHFOYW1lOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHFOYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHVuZGVmaW5lZDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZCh1bmRlZmluZWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJveHk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocHJveHkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VVUkk6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VVUkkpOwotICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvLwotICAvLyBSZWNvbmNpbGUgbWV0aG9kcwotICAvLwotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgc2V0UU5hbWUocW5hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLk9QRVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICAgIG9wZXJhdGlvbi5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKGdldEVuY2xvc2luZ0RlZmluaXRpb24oKSk7Ci0gICAgICAgICAgb3BlcmF0aW9uLnNldEVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGdldEVPcGVyYXRpb25zKCkuYWRkKG9wZXJhdGlvbik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChjb21wb25lbnQsIG1vZGVsT2JqZWN0KTsKLSAgICBpZiAobGlzdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3QgZ2V0TGlzdChPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpIGNvbXBvbmVudDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBPcGVyYXRpb24pCi0gICAgewotICAgICAgcmVzdWx0ID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQotICB7Ci0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSAoUG9ydFR5cGUpIGNvbXBvbmVudDsKLQotICAgIExpc3QgbGlzdCA9IHBvcnRUeXBlLmdldEVPcGVyYXRpb25zKCk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvLwotICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQotICAvLwotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHJldHVybjsKLQotICAgIHN1cGVyLmNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZUF0dHJpYnV0ZSA9PSBudWxsIHx8IGVBdHRyaWJ1dGUgPT0gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRUeXBlX1FOYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuUE9SVF9UWVBFKTsKLSAgICBzZXRFbGVtZW50KG5ld0VsZW1lbnQpOwotCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgRWxlbWVudCBjaGlsZCA9ICgoT3BlcmF0aW9uSW1wbCkgb3BlcmF0aW9uKS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotfSAvL1BvcnRUeXBlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViZThkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlcnZpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNnZXRRTmFtZSA8ZW0+UU5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNpc1VuZGVmaW5lZCA8ZW0+VW5kZWZpbmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuU2VydmljZUltcGwjaXNQcm94eSA8ZW0+UHJveHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5TZXJ2aWNlSW1wbCNnZXRSZXNvdXJjZVVSSSA8ZW0+UmVzb3VyY2UgVVJJPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuU2VydmljZUltcGwjZ2V0RVBvcnRzIDxlbT5FUG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW1wbCBleHRlbmRzIEV4dGVuc2libGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNlcnZpY2UKLXsKLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRTmFtZSgpIDxlbT5RTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UU5hbWUoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UU5hbWUoKSA8ZW0+UU5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFFOYW1lKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFFOYW1lIHFOYW1lID0gUU5BTUVfRURFRkFVTFQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVOREVGSU5FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VuZGVmaW5lZCgpIDxlbT5VbmRlZmluZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2lzVW5kZWZpbmVkKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdW5kZWZpbmVkID0gVU5ERUZJTkVEX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcm94eSgpIDxlbT5Qcm94eTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjaXNQcm94eSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9YWV9FREVGQVVMVCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb3h5KCkgPGVtPlByb3h5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNpc1Byb3h5KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJveHkgPSBQUk9YWV9FREVGQVVMVDsKLQotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVVJJKCkgPGVtPlJlc291cmNlIFVSSTwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0UmVzb3VyY2VVUkkoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVSSSgpIDxlbT5SZXNvdXJjZSBVUkk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFJlc291cmNlVVJJKCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVVSSSA9IFJFU09VUkNFX1VSSV9FREVGQVVMVDsKLQotICBwcml2YXRlIE1hcCBwb3J0czsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RVBvcnRzKCkgPGVtPkVQb3J0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFUG9ydHMoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUxpc3QgZVBvcnRzID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBTZXJ2aWNlSW1wbCgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKLSAgewotICAgIHJldHVybiBxTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UU5hbWUoUU5hbWUgbmV3UU5hbWUpCi0gIHsKLSAgICBRTmFtZSBvbGRRTmFtZSA9IHFOYW1lOwotICAgIHFOYW1lID0gbmV3UU5hbWU7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUUsIG9sZFFOYW1lLCBxTmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1VuZGVmaW5lZCgpCi0gIHsKLSAgICByZXR1cm4gdW5kZWZpbmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVbmRlZmluZWQoYm9vbGVhbiBuZXdVbmRlZmluZWQpCi0gIHsKLSAgICBib29sZWFuIG9sZFVuZGVmaW5lZCA9IHVuZGVmaW5lZDsKLSAgICB1bmRlZmluZWQgPSBuZXdVbmRlZmluZWQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuU0VSVklDRV9fVU5ERUZJTkVELCBvbGRVbmRlZmluZWQsIHVuZGVmaW5lZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1Byb3h5KCkKLSAgewotICAgIHJldHVybiBwcm94eTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJveHkoYm9vbGVhbiBuZXdQcm94eSkKLSAgewotICAgIGJvb2xlYW4gb2xkUHJveHkgPSBwcm94eTsKLSAgICBwcm94eSA9IG5ld1Byb3h5OwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZLCBvbGRQcm94eSwgcHJveHkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlc291cmNlVVJJKFN0cmluZyBuZXdSZXNvdXJjZVVSSSkKLSAgewotICAgIFN0cmluZyBvbGRSZXNvdXJjZVVSSSA9IHJlc291cmNlVVJJOwotICAgIHJlc291cmNlVVJJID0gbmV3UmVzb3VyY2VVUkk7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuU0VSVklDRV9fUkVTT1VSQ0VfVVJJLCBvbGRSZXNvdXJjZVVSSSwgcmVzb3VyY2VVUkkpKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVMaXN0IGdldEVQb3J0cygpCi0gIHsKLSAgICBpZiAoZVBvcnRzID09IG51bGwpCi0gICAgewotICAgICAgZVBvcnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBvcnQuY2xhc3MsIHRoaXMsIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VQT1JUUyk7Ci0gICAgfQotICAgIHJldHVybiBlUG9ydHM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogQWRkIGEgcG9ydCB0byB0aGlzIHNlcnZpY2UuCi0gICAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0IHRvIGJlIGFkZGVkCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUG9ydChqYXZheC53c2RsLlBvcnQgcG9ydCkKLSAgewotICAgIGdldEVQb3J0cygpLmFkZCgoUG9ydClwb3J0KTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBHZXQgYWxsIHRoZSBwb3J0cyBkZWZpbmVkIGhlcmUuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIE1hcCBnZXRQb3J0cygpCi0gIHsKLSAgICBIYXNoTWFwIGhhc2hNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldEVQb3J0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgaS5uZXh0KCk7Ci0gICAgICBoYXNoTWFwLnB1dChwb3J0LmdldE5hbWUoKSwgcG9ydCk7Ci0gICAgfQotICAgIHJldHVybiBoYXNoTWFwOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIEdldCB0aGUgc3BlY2lmaWVkIHBvcnQuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBvcnQuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcG9ydCwgb3IgbnVsbCBpZiB0aGVyZSB3YXNuJ3QKLSAgICogYW55IG1hdGNoaW5nIHBvcnQKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgamF2YXgud3NkbC5Qb3J0IGdldFBvcnQoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBQb3J0IHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBpLm5leHQoKTsKLSAgICAgIGlmIChuYW1lLmVxdWFscyhwb3J0LmdldE5hbWUoKSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHBvcnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTOgotICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RVBvcnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1FOQU1FOgotICAgICAgICByZXR1cm4gZ2V0UU5hbWUoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fVU5ERUZJTkVEOgotICAgICAgICByZXR1cm4gaXNVbmRlZmluZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZOgotICAgICAgICByZXR1cm4gaXNQcm94eSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUkVTT1VSQ0VfVVJJOgotICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VVUkkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRVBPUlRTOgotICAgICAgICByZXR1cm4gZ2V0RVBvcnRzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZSgoUU5hbWUpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1VOREVGSU5FRDoKLSAgICAgICAgc2V0VW5kZWZpbmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1BST1hZOgotICAgICAgICBzZXRQcm94eSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHNldFJlc291cmNlVVJJKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VQT1JUUzoKLSAgICAgICAgZ2V0RVBvcnRzKCkuY2xlYXIoKTsKLSAgICAgICAgZ2V0RVBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1FOQU1FOgotICAgICAgICBzZXRRTmFtZShRTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fVU5ERUZJTkVEOgotICAgICAgICBzZXRVbmRlZmluZWQoVU5ERUZJTkVEX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19QUk9YWToKLSAgICAgICAgc2V0UHJveHkoUFJPWFlfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX1JFU09VUkNFX1VSSToKLSAgICAgICAgc2V0UmVzb3VyY2VVUkkoUkVTT1VSQ0VfVVJJX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19FUE9SVFM6Ci0gICAgICAgIGdldEVQb3J0cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRV9fUU5BTUU6Ci0gICAgICAgIHJldHVybiBRTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcU5hbWUgIT0gbnVsbCA6ICFRTkFNRV9FREVGQVVMVC5lcXVhbHMocU5hbWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19VTkRFRklORUQ6Ci0gICAgICAgIHJldHVybiB1bmRlZmluZWQgIT0gVU5ERUZJTkVEX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19QUk9YWToKLSAgICAgICAgcmV0dXJuIHByb3h5ICE9IFBST1hZX0VERUZBVUxUOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5TRVJWSUNFX19SRVNPVVJDRV9VUkk6Ci0gICAgICAgIHJldHVybiBSRVNPVVJDRV9VUklfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVVJJICE9IG51bGwgOiAhUkVTT1VSQ0VfVVJJX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVSSSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlNFUlZJQ0VfX0VQT1JUUzoKLSAgICAgICAgcmV0dXJuIGVQb3J0cyAhPSBudWxsICYmICFlUG9ydHMuaXNFbXB0eSgpOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiIChxTmFtZTogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChxTmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZCgiLCB1bmRlZmluZWQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQodW5kZWZpbmVkKTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHByb3h5OiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHByb3h5KTsKLSAgICByZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVVJJOiAiKTsKLSAgICByZXN1bHQuYXBwZW5kKHJlc291cmNlVVJJKTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0KLSAgICBRTmFtZSBxbmFtZSA9IG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCBjaGFuZ2VkRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgc2V0UU5hbWUocW5hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChFbGVtZW50IGNoaWxkLCBDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIHN3aXRjaCAoV1NETFV0aWwuZ2V0SW5zdGFuY2UoKS5nZXRXU0RMVHlwZShjaGlsZCkpCi0gICAgewotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLlBPUlQgOgotICAgICAgICB7Ci0gICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpICgoV1NETFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdTRExQYWNrYWdlLmVOU19VUkkpKS5nZXRXU0RMRmFjdG9yeSgpLmNyZWF0ZVBvcnQoKTsKLSAgICAgICAgICBwb3J0LnNldEVuY2xvc2luZ0RlZmluaXRpb24oZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpKTsKLSAgICAgICAgICBnZXRFUG9ydHMoKS5hZGQocG9ydCk7Ci0gICAgICAgICAgcG9ydC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgY2FzZSBXU0RMQ29uc3RhbnRzLkRPQ1VNRU5UQVRJT04gOgotICAgICAgICB7Ci0gICAgICAgICAgc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoY2hpbGQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgIHsKLSAgICAgICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCxyZW1haW5pbmdNb2RlbE9iamVjdHMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKGkubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlKE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgbGlzdCA9IGdldExpc3QobW9kZWxPYmplY3QpOwotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgbGlzdC5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTGlzdCBnZXRMaXN0KE9iamVjdCBtb2RlbE9iamVjdCkKLSAgewotICAgIExpc3QgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBQb3J0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEVQb3J0cygpOwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICByZXR1cm47Ci0KLSAgICBzdXBlci5jaGFuZ2VBdHRyaWJ1dGUoZUF0dHJpYnV0ZSk7Ci0gICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlX1FOYW1lKCkpCi0gICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgV1NETENvbnN0YW50cy5OQU1FX0FUVFJJQlVURSwgZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuU0VSVklDRSk7Ci0gICAgc2V0RWxlbWVudChuZXdFbGVtZW50KTsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RVBvcnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBFbGVtZW50IGNoaWxkID0gKChQb3J0SW1wbCkgcG9ydCkuY3JlYXRlRWxlbWVudCgpOwotICAgICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgfQotCi0gICAgaXRlcmF0b3IgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCkgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotICAgIH0KLQotICAgIHJldHVybiBuZXdFbGVtZW50OwotICB9Ci0KLX0gLy9TZXJ2aWNlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1R5cGVzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1R5cGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmQ4YjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9UeXBlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8vaW1wb3J0IGNvbS5pYm0ud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVHlwZXNJbXBsIGV4dGVuZHMgRXh0ZW5zaWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgVHlwZXMKLXsKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgVHlwZXNJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZXMoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldFNjaGVtYXMoKQotICB7Ci0gICAgTGlzdCBhcnJheUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCB4c2RlZSA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICBpZiAoeHNkZWUuZ2V0U2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgYXJyYXlMaXN0LmFkZCh4c2RlZS5nZXRTY2hlbWEoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhcnJheUxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRTY2hlbWFzKFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gIHsKLSAgICBMaXN0IHNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSkgaS5uZXh0KCk7Ci0gICAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKQotICAgICAgICBzY2hlbWFzLmFkZChzY2hlbWEpOwotICAgIH0KLSAgICByZXR1cm4gc2NoZW1hczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICB7Ci0gICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgICAgcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFM6Ci0gICAgICAgIHJldHVybiBnZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTX19FRVhURU5TSUJJTElUWV9FTEVNRU5UUzoKLSAgICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBkb2N1bWVudGF0aW9uRWxlbWVudCAhPSBudWxsIDogIURPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5UWVBFU19fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVNfX0VFWFRFTlNJQklMSVRZX0VMRU1FTlRTOgotICAgICAgICByZXR1cm4gZUV4dGVuc2liaWxpdHlFbGVtZW50cyAhPSBudWxsICYmICFlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzLmlzRW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBtc2cpCi0gIHsKLSAgICBzdXBlci5lTm90aWZ5KG1zZyk7Ci0gICAgCi0gICAgLy8gY3MuLiBpZiB3ZSd2ZSBhZGRlZCBhbiBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgYW5kIHRoZSBUeXBlcyBvYmplY3QgaXMgYWxyZWFkeSBhdHRhY2hlZCAKLSAgICAvLyB0byBhIHJlc291cmNlIHdlIG5lZWQgdG8gc2V0IHRoZSBzY2hlbWFMb2NhdGlvbiBmb3IgdGhlIGlubGluZSBzY2hlbWEuCi0gICAgLy8gSWYgbm90IHlldCBhdHRhY2hlZCB0byBhIHJlc291cmNlLCB0aGUgc2NoZW1hTG9jYXRpb24ncyB3aWxsIGJlIHNldCB2aWEgV1NETFJlc291cmNlSW1wbC5hdHRhY2hlZChFT2JqZWN0IG8pCi0gICAgLy8gICAgIAotICAgIGlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbnNpYmxlRWxlbWVudF9FRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgJiYKLSAgICAgICAgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQpCi0gICAgewotICAgICAgaWYgKG1zZy5nZXROZXdWYWx1ZSgpIGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZWUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKW1zZy5nZXROZXdWYWx1ZSgpOwotICAgICAgICBpZiAoZWUuZ2V0U2NoZW1hKCkgIT0gbnVsbCAmJiBlZS5nZXRTY2hlbWEoKS5lUmVzb3VyY2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgIGVlLmdldFNjaGVtYSgpLnNldFNjaGVtYUxvY2F0aW9uKGVlLmdldFNjaGVtYSgpLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0gIAotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxlIG1ldGhvZHMKLSAgLy8KLQotICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoRWxlbWVudCBjaGlsZCwgQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBpZiAoInNjaGVtYSIuZXF1YWxzKGNoaWxkLmdldExvY2FsTmFtZSgpKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkZWUgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgeHNkZWUuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICB4c2RlZS5zZXRFbGVtZW50KGNoaWxkKTsgLy8gY3MgOiB0aGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY3JlYXRpbmcgdGhlIGlubGluZSBzY2hlbWEgICAgICAgICAgICAgICAKLSAgICAgICAgYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoeHNkZWUpOyAgICAgICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9Ci0gICAgKChEZWZpbml0aW9uSW1wbClnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpLnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpIGNvbXBvbmVudDsKLSAgICBMaXN0IGxpc3QgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgbGlzdC5yZW1vdmUobW9kZWxPYmplY3QpOwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcykgY29tcG9uZW50OwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbCh0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gIHsKLSAgICBFbGVtZW50IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50KFdTRExDb25zdGFudHMuVFlQRVMpOwotICAgIHNldEVsZW1lbnQobmV3RWxlbWVudCk7Ci0KLSAgICAvLyBBZGQgY2hpbGRyZW4KLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybiBuZXdFbGVtZW50OwotCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0KLSAgICBJdGVyYXRvciBpdGVyID0gZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgRWxlbWVudCBlbCA9IG51bGw7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHkgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotICAgICAgZWwgPSBleHRlbnNpYmlsaXR5LmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbCAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnQgcmVQYXJlbnRlZCA9IChFbGVtZW50KSBkb2N1bWVudC5pbXBvcnROb2RlKGVsLCB0cnVlKTsKLSAgICAgICAgICBleHRlbnNpYmlsaXR5LnNldEVsZW1lbnQocmVQYXJlbnRlZCk7IC8vIHJlcGxhY2Ugd2l0aCB0aGUgbmV3IG9uZQotICAgICAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQocmVQYXJlbnRlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgCUVsZW1lbnQgY2hpbGQgPSAoKEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbClleHRlbnNpYmlsaXR5KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICAJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gIH0KLX0gLy9UeXBlc0ltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmRkZDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW1wbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsI2dldENoaWxkcmVuIDxlbT5DaGlsZHJlbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgZXh0ZW5kcyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgaW1wbGVtZW50cyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGlsZHJlbigpIDxlbT5DaGlsZHJlbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDaGlsZHJlbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVMaXN0IGNoaWxkcmVuID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUxpc3QgZ2V0Q2hpbGRyZW4oKQotICAgIHsKLSAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgdGhpcywgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotICAgIHsKLSAgICAgICAgaWYgKGZlYXR1cmVJRCA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19DSElMRFJFTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDaGlsZHJlbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgICAgICByZXR1cm4gaXNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFOgotICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUeXBlKCk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOOgotICAgICAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KChFbGVtZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgICAgICBzZXRFbGVtZW50VHlwZSgoUU5hbWUpIG5ld1ZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fQ0hJTERSRU46Ci0gICAgICAgICAgICBnZXRDaGlsZHJlbigpLmNsZWFyKCk7Ci0gICAgICAgICAgICBnZXRDaGlsZHJlbigpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudChET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICAgICAgc2V0RWxlbWVudChFTEVNRU5UX0VERUZBVUxUKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgICAgIHNldEVsZW1lbnRUeXBlKEVMRU1FTlRfVFlQRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOOgotICAgICAgICAgICAgZ2V0Q2hpbGRyZW4oKS5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpCi0gICAgewotICAgICAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZG9jdW1lbnRhdGlvbkVsZW1lbnQgIT0gbnVsbCA6ICFET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGRvY3VtZW50YXRpb25FbGVtZW50KTsKLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgICAgIHJldHVybiBFTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50ICE9IG51bGwgOiAhRUxFTUVOVF9FREVGQVVMVC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmVkICE9IFJFUVVJUkVEX0VERUZBVUxUOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgICAgICByZXR1cm4gRUxFTUVOVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbGVtZW50VHlwZSAhPSBudWxsIDogIUVMRU1FTlRfVFlQRV9FREVGQVVMVC5lcXVhbHMoZWxlbWVudFR5cGUpOwotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlVOS05PV05fRVhURU5TSUJJTElUWV9FTEVNRU5UX19DSElMRFJFTjoKLSAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbiAhPSBudWxsICYmICFjaGlsZHJlbi5pc0VtcHR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICAgIH0KLQotICAgIC8vIAotICAgIC8vIFJlY29uY2lsZSBtZXRob2RzCi0gICAgLy8KLQotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCAmJiAhaXNSZWNvbmNpbGluZykKLSAgICAgICAgewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4dGVuc2liaWxpdHlFbGVtZW50LnNldEVsZW1lbnQoKTogUHJlc2VydmluZyBvbGQgZWxlbWVudCIpOwotICAgICAgICB9IAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldEVsZW1lbnRHZW4oZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbC5yZWNvbmNpbGVBdHRyaWJ1dGVzKCkiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudCgpIik7Ci0gICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnQuc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudC5zZXRFbGVtZW50KGNoaWxkKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRPRE8uLiAgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlIHRoZSBjaGlsZCBzaG91bGQgZ28gaW4gdGhlIGluIGN1cnJlbnQgbGlzdAotICAgICAgICAvLyBzbyB0aGF0IGl0IGRvZXNuJ3QgYWx3YXlzIGVuZCB1cCBnb2luZyB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IAotICAgICAgICAvLyAoc2luY2UgYSBuZXcgZWxlbWVudCBtaWdodCBiZSBhZGRlZCBhdCB0aGUgc3RhcnQpCi0gICAgICAgIGdldENoaWxkcmVuKCkuYWRkKGV4dGVuc2liaWxpdHlFbGVtZW50KTsgICAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgICB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlbW92ZSh0aGlzLCBpLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQotICAgIHsKLSAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVlZSA9IChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGNvbXBvbmVudDsKLSAgICAgICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICB1ZWUuZ2V0Q2hpbGRyZW4oKS5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudCgpCi0gICAgewotICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICAgICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0KLSAgICAgICAgRWxlbWVudCBuZXdFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgLy8gVGhpcyBpcyBhbiBvbGQgZWxlbWVudC4KLSAgICAgICAgewotICAgICAgICAgICAgbmV3RWxlbWVudCA9IChFbGVtZW50KSBkb2N1bWVudC5pbXBvcnROb2RlKGVsZW1lbnQsIHRydWUpOwotICAgICAgICAgICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVyID0gZGVmaW5pdGlvbi5nZXRQcmVmaXgobmFtZXNwYWNlKTsKLSAgICAgICAgICAgIG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCAocXVhbGlmaWVyID09IG51bGwgPyAiIiA6IHF1YWxpZmllciArICI6IikgKyBnZXRFbGVtZW50VHlwZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICAgICAgICAgIGVsZW1lbnQgPSBuZXdFbGVtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIHByb3BlcnRpZXMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXAoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGFuZ2VBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBlQXR0cmlidXRlKQotICAgIHsKLSAgICAgICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc3VwZXIuY2hhbmdlQXR0cmlidXRlKGVBdHRyaWJ1dGUpOwotICAgICAgICBFbGVtZW50IHRoZUVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmICh0aGVFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBqYXZhLnV0aWwuTWFwLkVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSAoamF2YS51dGlsLk1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIG5pY2VTZXRBdHRyaWJ1dGUodGhlRWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19IC8vVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDUyMmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuaW1wbC5XU0RMRWxlbWVudEltcGwjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLldTRExFbGVtZW50SW1wbCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETEVsZW1lbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXU0RMRWxlbWVudAotewotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERvY3VtZW50YXRpb25FbGVtZW50KCkgPGVtPkRvY3VtZW50YXRpb24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVsZW1lbnQgRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSA8ZW0+RG9jdW1lbnRhdGlvbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBFbGVtZW50IGRvY3VtZW50YXRpb25FbGVtZW50ID0gRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxUOwotCi0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAc2VlICNnZXRFbGVtZW50KCkKLSAgICogQGdlbmVyYXRlZAotICAgKiBAb3JkZXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbGVtZW50IEVMRU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50KCkgPGVtPkVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldEVsZW1lbnQoKQotICAgKiBAZ2VuZXJhdGVkCi0gICAqIEBvcmRlcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50ID0gRUxFTUVOVF9FREVGQVVMVDsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIHVwZGF0aW5nRE9NID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBFTGlzdCB3c2RsQ29udGVudHM7Ci0KLSAgcHJpdmF0ZSBEZWZpbml0aW9uIGVuY2xvc2luZ0RlZmluaXRpb247Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnRJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLSAgewotICAgIHJldHVybiBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETEVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50YXRpb25FbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudGF0aW9uRWxlbWVudChFbGVtZW50IG5ld0RvY3VtZW50YXRpb25FbGVtZW50KQotICB7Ci0gICAgRWxlbWVudCBvbGREb2N1bWVudGF0aW9uRWxlbWVudCA9IGRvY3VtZW50YXRpb25FbGVtZW50OwotICAgIGRvY3VtZW50YXRpb25FbGVtZW50ID0gbmV3RG9jdW1lbnRhdGlvbkVsZW1lbnQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQsIG9sZERvY3VtZW50YXRpb25FbGVtZW50LCBkb2N1bWVudGF0aW9uRWxlbWVudCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgRWxlbWVudCBnZXRFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50R2VuKEVsZW1lbnQgbmV3RWxlbWVudCkKLSAgewotICAgIEVsZW1lbnQgb2xkRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0gICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19FTEVNRU5ULCBvbGRFbGVtZW50LCBlbGVtZW50KSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQgTk9UCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmNsb3NpbmdEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIGVuY2xvc2luZ0RlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VMRU1FTlRfX0RPQ1VNRU5UQVRJT05fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KChFbGVtZW50KW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICBzZXRFbGVtZW50KEVMRU1FTlRfRURFRkFVTFQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKQotICB7Ci0gICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuV1NETF9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRUxFTUVOVF9fRUxFTUVOVDoKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGVsZW1lbnQgIT0gbnVsbCA6ICFFTEVNRU5UX0VERUZBVUxULmVxdWFscyhlbGVtZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAoZG9jdW1lbnRhdGlvbkVsZW1lbnQ6ICIpOwotICAgIHJlc3VsdC5hcHBlbmQoZG9jdW1lbnRhdGlvbkVsZW1lbnQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiwgZWxlbWVudDogIik7Ci0gICAgcmVzdWx0LmFwcGVuZChlbGVtZW50KTsKLSAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLy8KLSAgLy8gUmVjb25jaWxhdGlvbiBtZXRob2RzOiBET00gLT4gTW9kZWwKLSAgLy8KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIFdTRExDb250ZW50c0VMaXN0IGV4dGVuZHMgRUNvbnRlbnRzRUxpc3QKLSAgewotICAgIFdTRExDb250ZW50c0VMaXN0KEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlW10gZVN0cnVjdHVyYWxGZWF0dXJlcykKLSAgICB7Ci0gICAgICBzdXBlcihlT2JqZWN0LCBlU3RydWN0dXJhbEZlYXR1cmVzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yIG5ld0xpc3RJdGVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlSXRlcmF0b3JJbXBsKGVPYmplY3QsIGVTdHJ1Y3R1cmFsRmVhdHVyZXMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZWQoRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSkKLSAgICB7Ci0gICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZVN0cnVjdHVyYWxGZWF0dXJlOwotICAgICAgcmV0dXJuICFlUmVmZXJlbmNlLmlzVHJhbnNpZW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3QgYmFzaWNMaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFdTRExDb250ZW50c0VMaXN0KGVPYmplY3QsIGVTdHJ1Y3R1cmFsRmVhdHVyZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYXRvciBiYXNpY0l0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IEZlYXR1cmVJdGVyYXRvckltcGwoZU9iamVjdCwgZVN0cnVjdHVyYWxGZWF0dXJlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGZWF0dXJlSXRlcmF0b3JJbXBsIGV4dGVuZHMgRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9ySW1wbAotICAgIHsKLSAgICAgIHB1YmxpYyBGZWF0dXJlSXRlcmF0b3JJbXBsKEVPYmplY3QgZU9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgc3VwZXIoZU9iamVjdCwgKEVTdHJ1Y3R1cmFsRmVhdHVyZVtdKSAoKEJhc2ljRUxpc3QpIGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKSkuZGF0YSgpKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIEZlYXR1cmVJdGVyYXRvckltcGwoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmVbXSBlU3RydWN0dXJhbEZlYXR1cmVzKQotICAgICAgewotICAgICAgICBzdXBlcihlT2JqZWN0LCBlU3RydWN0dXJhbEZlYXR1cmVzKTsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmNsdWRlZChFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlKQotICAgICAgewotICAgICAgICBFUmVmZXJlbmNlIGVSZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZVN0cnVjdHVyYWxGZWF0dXJlOwotICAgICAgICByZXR1cm4gIWVSZWZlcmVuY2UuaXNUcmFuc2llbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgRUxpc3QgZ2V0V1NETENvbnRlbnRzKCkKLSAgewotICAgIGlmICh3c2RsQ29udGVudHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2RsQ29udGVudHMgPSBuZXcgV1NETENvbnRlbnRzRUxpc3QodGhpcywgKEVTdHJ1Y3R1cmFsRmVhdHVyZVtdKSAoKEJhc2ljRUxpc3QpIGVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKSkuZGF0YSgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gd3NkbENvbnRlbnRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgc2V0RWxlbWVudEdlbihudWxsKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgY29udGVudHMgPSBnZXRXU0RMQ29udGVudHMoKS5pdGVyYXRvcigpOyBjb250ZW50cy5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgV1NETEVsZW1lbnRJbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgV1NETEVsZW1lbnRJbXBsIGNvbnRlbnQgPSAoV1NETEVsZW1lbnRJbXBsKSBvYmo7Ci0gICAgICAgICAgY29udGVudC5zZXRFbGVtZW50KG51bGwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpc1JlY29uY2lsaW5nID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZXRFbGVtZW50R2VuKGVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGVOb3RpZmljYXRpb25SZXF1aXJlZCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG1zZykKLSAgewotICAgIGludCBldmVudFR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0gICAgT2JqZWN0IGZlYXR1cmUgPSBtc2cuZ2V0RmVhdHVyZSgpOwotICAgIE9iamVjdCBvbGRWYWx1ZSA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotICAgIE9iamVjdCBuZXdWYWx1ZSA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCi0gICAgaWYgKGVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkuY29udGFpbnMoZmVhdHVyZSkpCi0gICAgewotICAgICAgRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0gICAgICBpZiAoZVJlZmVyZW5jZS5pc0NvbnRhaW5tZW50KCkgJiYgIWVSZWZlcmVuY2UuaXNUcmFuc2llbnQoKSkKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYWRvcHRDb250ZW50KGVSZWZlcmVuY2UsbmV3VmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG5ld1ZhbHVlcyA9ICgoQ29sbGVjdGlvbikgbmV3VmFsdWUpLml0ZXJhdG9yKCk7IG5ld1ZhbHVlcy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgbmV3VmFsdWVzLm5leHQoKTsKLSAgICAgICAgICAgICAgYWRvcHRDb250ZW50KGVSZWZlcmVuY2UsIHdzZGxFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcnBoYW5Db250ZW50KGVSZWZlcmVuY2UsIChXU0RMRWxlbWVudCkgb2xkVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9sZFZhbHVlcyA9ICgoQ29sbGVjdGlvbikgb2xkVmFsdWUpLml0ZXJhdG9yKCk7IG9sZFZhbHVlcy5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBvbGRWYWx1ZXMubmV4dCgpOwotICAgICAgICAgICAgICBvcnBoYW5Db250ZW50KGVSZWZlcmVuY2UsIG9iamVjdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgbW92ZUNvbnRlbnQoZVJlZmVyZW5jZSwgKFdTRExFbGVtZW50KSBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uU0VUIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5VTlNFVCA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9ycGhhbkNvbnRlbnQoZVJlZmVyZW5jZSwgb2xkVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFkb3B0Q29udGVudChlUmVmZXJlbmNlLCBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc3dpdGNoIChldmVudFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkUgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5NT1ZFIDoKLSAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5TRVQgOgotICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGFuZ2VSZWZlcmVuY2UoZVJlZmVyZW5jZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5jb250YWlucyhmZWF0dXJlKSkKLSAgICB7Ci0gICAgICBFQXR0cmlidXRlIGVBdHRyaWJ1dGUgPSAoRUF0dHJpYnV0ZSkgZmVhdHVyZTsKLSAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BREQgOgotICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZIDoKLSAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uTU9WRSA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlNFVCA6Ci0gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUIDoKLSAgICAgICAgewotICAgICAgICAgIGNoYW5nZUF0dHJpYnV0ZShlQXR0cmlidXRlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzdXBlci5lTm90aWZ5KG1zZyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBvcnBoYW5Db250ZW50KEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgT2JqZWN0IG9iaikKLSAgewotICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudCA9IGdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBXU0RMRWxlbWVudCkKLSAgICAgIHsKLSAgICAgIAlXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudClvYmo7Ci0gICAgICAgIEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSB3c2RsRWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKQotICAgICAgICAgIG5pY2VSZW1vdmVDaGlsZChjb250ZW50RWxlbWVudC5nZXRQYXJlbnROb2RlKCksIGNvbnRlbnRFbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIAk7Ly9TeXN0ZW0ub3V0LnByaW50bG4oIldTRExFbGVtZW50Lm9ycGhhbkNvbnRlbnQoKSwgT2JqZWN0IGlzOiAiICsgb2JqKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIG5pY2VSZW1vdmVDaGlsZChOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIHdyaXRlYmFjayBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3JjZU5pY2VSZW1vdmVDaGlsZChwYXJlbnQsIGNoaWxkKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgZm9yY2VOaWNlUmVtb3ZlQ2hpbGQoTm9kZSBwYXJlbnQsIE5vZGUgY2hpbGQpCi0gIHsKLSAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0KLSAgICBib29sZWFuIGRvbmUgPSBmYWxzZTsKLQotLy8gU3lzdGVtLm91dC5wcmludGxuKCI/KiIpOwotICAgIE5vZGUgcHJldmlvdXMgPSBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLSAgICBpZiAocHJldmlvdXMgIT0gbnVsbCAmJiBwcmV2aW91cy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotICAgIHsKLSAgICAgIFRleHQgdGV4dCA9IChUZXh0KXByZXZpb3VzOwotICAgICAgU3RyaW5nIGRhdGEgPSB0ZXh0LmdldERhdGEoKTsKLSAgICAgIGludCBpbmRleCA9IGRhdGEubGFzdEluZGV4T2YoJ1xuJyk7Ci0gICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmIChpbmRleCAtIDEgPiAwICYmIGRhdGEuY2hhckF0KGluZGV4IC0gMSkgPT0gJ1xyJykKLSAgICAgICAgewotLy9TeXN0ZW0ub3V0LnByaW50bG4oIjEqIik7Ci0gICAgICAgICAgdGV4dC5kZWxldGVEYXRhKGluZGV4IC0gMSwgZGF0YS5sZW5ndGgoKSAtIGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0vL1N5c3RlbS5vdXQucHJpbnRsbigiMioiKTsKLSAgICAgICAgICB0ZXh0LmRlbGV0ZURhdGEoaW5kZXgsIGRhdGEubGVuZ3RoKCkgLSBpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJObyByZXR1cm4gYmVmb3JlISIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJObyB0ZXh0IG5vZGUgYmVmb3JlISIpOwotICAgIH0KLQotCi0gICAgaWYgKCFkb25lKQotICAgIHsKLSAgICAgIGZvciAoTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsgbmV4dCAhPSBudWxsOyBuZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpKQotICAgICAgewotICAgICAgICBpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgVGV4dCB0ZXh0ID0gKFRleHQpbmV4dDsKLSAgICAgICAgICBTdHJpbmcgZGF0YSA9IHRleHQuZ2V0RGF0YSgpOwotLyoKLSAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieHggIiArIGRhdGEubGVuZ3RoKCkgKyAiOjogIik7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCgpOyArK2kpCi0gICAgICAgICAgewotICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAiICsgSW50ZWdlci50b0hleFN0cmluZygoaW50KWRhdGEuY2hhckF0KGkpKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotKi8KLQotICAgICAgICAgIGludCBpbmRleCA9IGRhdGEuaW5kZXhPZignXG4nKTsKLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IGRhdGEubGVuZ3RoKCkgJiYgZGF0YS5jaGFyQXQoaW5kZXggKyAxKSA9PSAnXHInKQotICAgICAgICAgICAgewotICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiMyoiKTsKLSAgICAgICAgICAgICAgdGV4dC5kZWxldGVEYXRhKDAsIGluZGV4ICsgMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIjQqIik7Ci0gICAgICAgICAgICAgIHRleHQuZGVsZXRlRGF0YSgwLCBpbmRleCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHJldHVybiBhZnRlciEiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVtb3ZpbmcgZnJvbS0tLS0tLS0tXG4gICAgICIgKyBwYXJlbnQpOwotLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZW1vdmluZy0tLS0tLS0tXG4gICAgICIgKyBjaGlsZCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIAlwYXJlbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCi0gICAgdXBkYXRpbmdET009ZmFsc2U7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgbW92ZUNvbnRlbnQoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCkKLSAgewotICAgIGlmIChpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIHdyaXRlYmFjayBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibW92aW5nICIgKyB4c2RDb25jcmV0ZUNvbXBvbmVudCk7Ci0gICAgTm9kZSBwYXJlbnQgPSBnZXRBZG9wdGlvblBhcmVudE5vZGUoZVJlZmVyZW5jZSk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSB3c2RsRWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoY2hpbGQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBjb250ZW50cyA9IGdldFdTRExDb250ZW50cygpOwotICAgICAgICBpbnQgaW5kZXggPSBjb250ZW50cy5pbmRleE9mKHdzZGxFbGVtZW50KTsKLSAgICAgICAgbmljZVJlbW92ZUNoaWxkKHBhcmVudCwgY2hpbGQpOwotICAgICAgICBuaWNlSW5zZXJ0QmVmb3JlCi0gICAgICAgICAgKHBhcmVudCwgCi0gICAgICAgICAgICBjaGlsZCwgCi0gICAgICAgICAgICArK2luZGV4ID09IGNvbnRlbnRzLnNpemUoKSA/ICAKLSAgICAgICAgICAgICAgbnVsbCA6IAotICAgICAgICAgICAgICAoKFdTRExFbGVtZW50KWNvbnRlbnRzLmdldChpbmRleCkpLmdldEVsZW1lbnQoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJtb3ZlZCAiICsgeHNkQ29uY3JldGVDb21wb25lbnQpOwotCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZG9wdENvbnRlbnQoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLCBPYmplY3Qgb2JqZWN0KQotICB7Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBvYmplY3Q7Ci0gICAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICAgIHsKLSAgICAgICAgaWYgKHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS5lbGVtZW50Q2hhbmdlZCh3c2RsRWxlbWVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gd3NkbEVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICBpZiAoZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgKGNoaWxkRWxlbWVudCA9PSBudWxsIHx8IGNoaWxkRWxlbWVudC5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwgJiYgY2hpbGRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSAhPSBnZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdzZGxFbGVtZW50LnNldEVsZW1lbnQobnVsbCk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQgPSBudWxsOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGhhbmRsZUVsZW1lbnRGb3JBZG9wdChlUmVmZXJlbmNlLCB3c2RsRWxlbWVudCk7Ci0gICAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgKChXU0RMRWxlbWVudEltcGwpIHdzZGxFbGVtZW50KS5hZG9wdEJ5KGRlZmluaXRpb24pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOYW1lc3BhY2UpCi0gICAgewotICAgICAgLy8gQWRkIGEgbmFtZXNwYWNlIGF0dHJpYnV0ZSB0byB0aGUgRGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICAgIE5hbWVzcGFjZSBucyA9IChOYW1lc3BhY2Upb2JqZWN0OwotICAgICAgTm9kZSBhZG9wdGlvblBhcmVudCA9IGdldEFkb3B0aW9uUGFyZW50Tm9kZShlUmVmZXJlbmNlKTsgLy8gRGVmaW5pdGlvbnMgbm9kZQotICAgICAgLy8gS0I6IEFzc3VtcHRpb24gLSBUaGUgcHJlZml4IGlzIHVuaXF1ZSBpZiB3ZSBhcmUgaGVyZSAoYnkgdGhlIERlZmluaXRpb25zIG1vZGVsKS4gCi0JICBpZiAoYWRvcHRpb25QYXJlbnQgIT0gbnVsbCkgewotCQkgICgoRWxlbWVudClhZG9wdGlvblBhcmVudCkuc2V0QXR0cmlidXRlKCJ4bWxuczoiK25zLmdldFByZWZpeCgpLG5zLmdldFVSSSgpKTsKLQkgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgTm9kZSBnZXRBZG9wdGlvblBhcmVudE5vZGUoRVJlZmVyZW5jZSBlUmVmZXJlbmNlKQotICB7Ci0gICAgcmV0dXJuIGdldEVsZW1lbnQoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRWxlbWVudEZvckFkb3B0KEVSZWZlcmVuY2UgZVJlZmVyZW5jZSwgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpCi0gIHsgCi0gICAgLy8gRXN0YWJsaXNoIERPTSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwCi0gICAgCi0gICAgTm9kZSBhZG9wdGlvblBhcmVudCA9IGdldEFkb3B0aW9uUGFyZW50Tm9kZShlUmVmZXJlbmNlKTsKLSAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IHdzZGxFbGVtZW50LmdldEVsZW1lbnQoKTsKLSAgICBFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gbnVsbDsKLSAgICAKLSAgICBmb3IgKEl0ZXJhdG9yIGNvbnRlbnRzID0gZ2V0V1NETENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29udGVudHMuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgaWYgKGNvbnRlbnRzLm5leHQoKSA9PSB3c2RsRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbnRlbnRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIE9iamVjdCBuZXh0ID0gY29udGVudHMubmV4dCgpOwotICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgV1NETEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSAoKFdTRExFbGVtZW50KW5leHQpLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWZlcmVuY2VkRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBOb2RlIHBhcmVudCA9IHJlZmVyZW5jZWRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsgCi0gICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWZlcmVuY2VkRWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50ID09IGFkb3B0aW9uUGFyZW50KQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWZlcmVuY2VkRWxlbWVudCA9IChFbGVtZW50KXBhcmVudDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAKLSAgICBib29sZWFuIGlzTmV3ID0gZmFsc2U7Ci0gICAgaWYgKGNoaWxkRWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgICgoV1NETEVsZW1lbnRJbXBsKXdzZGxFbGVtZW50KS5pc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgIGNoaWxkRWxlbWVudCA9ICgoV1NETEVsZW1lbnRJbXBsKXdzZGxFbGVtZW50KS5jcmVhdGVFbGVtZW50KCk7Ci0gICAgICAoKFdTRExFbGVtZW50SW1wbCl3c2RsRWxlbWVudCkuaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgICAgaXNOZXcgPSB0cnVlOwotICAgICAgaWYgKGNoaWxkRWxlbWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBjcmVhdGVkISAiICsgd3NkbEVsZW1lbnQpOwotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaXNBdHRhY2hlZCA9IGZhbHNlOwotICAgIGZvciAoTm9kZSByb290RG9jdW1lbnQgPSBjaGlsZEVsZW1lbnQ7IHJvb3REb2N1bWVudCAhPSBudWxsOyByb290RG9jdW1lbnQgPSByb290RG9jdW1lbnQuZ2V0UGFyZW50Tm9kZSgpKQotICAgIHsKLSAgICAgIGlmIChXU0RMQ29uc3RhbnRzLm5vZGVUeXBlKHJvb3REb2N1bWVudCkgPT0gV1NETENvbnN0YW50cy5ERUZJTklUSU9OKQotICAgICAgewotICAgICAgICBpc0F0dGFjaGVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmICghaXNBdHRhY2hlZCkKLSAgICB7Ci0gICAgICBpZiAocmVmZXJlbmNlZEVsZW1lbnQgPT0gbnVsbCAmJiAKLSAgICAgICAgICAhZVJlZmVyZW5jZS5pc01hbnkoKSkKLSAgICB7Ci0gICAgICBmb3IgKE5vZGUgY2hpbGQgPSBhZG9wdGlvblBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICByZWZlcmVuY2VkRWxlbWVudCA9IChFbGVtZW50KWNoaWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICAgLy9yZWZlcmVuY2VkRWxlbWVudCA9IGNvbXB1dGVUb3BMZXZlbFJlZkNoaWxkKGFkb3B0aW9uUGFyZW50LGNoaWxkRWxlbWVudCk7ICAgICAKLSAgICAgIG5pY2VJbnNlcnRCZWZvcmUoYWRvcHRpb25QYXJlbnQsIGNoaWxkRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIG5pY2VJbnNlcnRCZWZvcmUoTm9kZSBwYXJlbnQsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgcmVmZXJlbmNlQ2hpbGQpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIGRvbSB3cml0ZWJhY2sgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3JjZU5pY2VJbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmZXJlbmNlQ2hpbGQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZm9yY2VOaWNlSW5zZXJ0QmVmb3JlKE5vZGUgcGFyZW50LCBOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZmVyZW5jZUNoaWxkKQotICB7Ci0gICAgdXBkYXRpbmdET00gPSB0cnVlOwotCi0gICAgTE9PUDoKLSAgICBmb3IgKE5vZGUgY2hpbGQgPSByZWZlcmVuY2VDaGlsZCA9PSBudWxsID8gcGFyZW50LmdldExhc3RDaGlsZCgpIDogcmVmZXJlbmNlQ2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7IAotICAgICAgICAgY2hpbGQgIT0gbnVsbDsgCi0gICAgICAgICBjaGlsZCA9IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpKQotICAgIHsKLSAgICAgIHN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBOb2RlLlRFWFRfTk9ERToKLSAgICAgICAgewotICAgICAgICAgIFRleHQgdGV4dCA9IChUZXh0KWNoaWxkOwotICAgICAgICAgIFN0cmluZyBkYXRhID0gdGV4dC5nZXREYXRhKCk7Ci0KLS8qCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieHggIiArIGRhdGEubGVuZ3RoKCkgKyAiOjogIik7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCgpOyArK2kpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKChpbnQpZGF0YS5jaGFyQXQoaSkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0qLwotCi0gICAgICAgICAgaW50IGluZGV4ID0gZGF0YS5sYXN0SW5kZXhPZignXG4nKTsKLSAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgICAgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbiBoZXJlIik7Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBmb3IgKE5vZGUgYW5jZXN0b3IgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOyAKLSAgICAgICAgICAgICAgICAgYW5jZXN0b3IgIT0gbnVsbCAmJiBhbmNlc3Rvci5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERTsgCi0gICAgICAgICAgICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50Tm9kZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbmRlbnQuYXBwZW5kKCIgICAgIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpbmRleCArIDEgPCBkYXRhLmxlbmd0aCgpICYmIGRhdGEuY2hhckF0KGluZGV4ICsgMSkgPT0gJ1xyJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRleHQucmVwbGFjZURhdGEoaW5kZXggKyAxLCBkYXRhLmxlbmd0aCgpIC0gaW5kZXggLSAxLCBpbmRlbnQgKyAiICAgICIpOwotCi0gICAgICAgICAgICAvLyBzZXRDb3JyZWN0SW5kZW50YXRpb24oaW5kZW50LCBuZXdUZXh0KTsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VDaGlsZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbmRlbnQuYXBwZW5kKCIgICAgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXh0IG5ld1RleHQgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKCJcbiIgKyBpbmRlbnQpOwotLy8gU3lzdGVtLm91dC5wcmludGxuKCJJbnNlcnRlZC4uLiIgKyBuZXdUZXh0KTsKLSAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3VGV4dCwgcmVmZXJlbmNlQ2hpbGQpOwotICAgICAgICAgICAgcmVmZXJlbmNlQ2hpbGQgPSBuZXdUZXh0OwotICAgICAgICAgICAgYnJlYWsgTE9PUDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAKLSAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrIExPT1A7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiSW5zZXJ0ZWQuLi4iICsgbmV3Q2hpbGQpOwotICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZmVyZW5jZUNoaWxkKTsKLQotICAgIHVwZGF0aW5nRE9NID0gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBjb21wdXRlVG9wTGV2ZWxSZWZDaGlsZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbm9kZVRvQWRkKQotICB7Ci0gIAlFbGVtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGEgPSBnZXRQcmVjZWRlbmNlKG5vZGVUb0FkZCk7Ci0gICAgICAJCi0gICAgZm9yIChOb2RlIG5vZGUgPSBwYXJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKQotICAgIHsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0JCSAgICBpbnQgYiA9IGdldFByZWNlZGVuY2Uobm9kZSk7Ci0JCSAgICBpZiAoYiA+PSBhKQotCQkgICAgewotCQkgICAgICByZXN1bHQgPSAoRWxlbWVudClub2RlOwkKLQkgICAgICAgIGJyZWFrOwkgICAgCi0JCSAgICB9ICAgICAgICAKLSAgICAgIH0gCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgSGFzaE1hcCBwcmVjZWRlbmNlTWFwID0gY3JlYXRlUHJlY2VkZW5jZU1hcCgpOwotCi0gIHByaXZhdGUgaW50IGdldFByZWNlZGVuY2UoTm9kZSBub2RlKQotICB7Ci0gIAlpbnQgcmVzdWx0ID0gMjsKLSAgCVN0cmluZyBsb2NhbE5hbWUgPSBub2RlLmdldExvY2FsTmFtZSgpOwotICAJaWYgKGxvY2FsTmFtZSAhPSBudWxsKQotICAJeyAgCQotICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpcHJlY2VkZW5jZU1hcC5nZXQobG9jYWxOYW1lKTsKLSAgICAgIGlmIChpbnRlZ2VyICE9IG51bGwpCi0gICAgICB7ICAgICAgCi0gICAgICAgIHJlc3VsdCA9IGludGVnZXIuaW50VmFsdWUoKTsKLSAgICAgIH0KLSAgCX0KLSAgCXJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBIYXNoTWFwIGNyZWF0ZVByZWNlZGVuY2VNYXAoKQotCXsKLQkJSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5ET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcigxKSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuSU1QT1JUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcigzKSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuVFlQRVNfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDQpKTsKLQkJaGFzaE1hcC5wdXQoV1NETENvbnN0YW50cy5NRVNTQUdFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig1KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuUE9SVF9UWVBFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcig2KSk7Ci0JCWhhc2hNYXAucHV0KFdTRExDb25zdGFudHMuQklORElOR19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoNykpOwotCQloYXNoTWFwLnB1dChXU0RMQ29uc3RhbnRzLlNFUlZJQ0VfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKDgpKTsKLQkJcmV0dXJuIGhhc2hNYXA7Ci0JfQotCi0gIHByb3RlY3RlZCB2b2lkIGFkb3B0QnkoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBjb21wb25lbnRzID0gZ2V0V1NETENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgY29tcG9uZW50cy5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBjaGlsZCA9IGNvbXBvbmVudHMubmV4dCgpOwotICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgV1NETEVsZW1lbnRJbXBsKQotICAgICAgewotICAgICAgICAoKFdTRExFbGVtZW50SW1wbCkgY2hpbGQpLmFkb3B0QnkoZGVmaW5pdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZ0RPTSgpCi0gIHsKLSAgICByZXR1cm4gdXBkYXRpbmdET007Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgaWYgKCFpc1VwZGF0aW5nRE9NKCkpCi0gICAgewotICAgICAgaWYgKCFpc1JlY29uY2lsaW5nKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjaGFuZ2VGb3IgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICByZWNvbmNpbGUoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgICAgIFdTRExFbGVtZW50IHRoZUNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAodGhlQ29udGFpbmVyICE9IG51bGwgJiYgdGhlQ29udGFpbmVyLmdldEVsZW1lbnQoKSA9PSBjaGFuZ2VkRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKSB0aGVDb250YWluZXIpLmVsZW1lbnRDaGFuZ2VkKGNoYW5nZWRFbGVtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgdHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICA7IC8vU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBpbnRlcm5hbCByZWNvbmNpbGUgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIDsgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIERPTSByZWNvbmNpbGUgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KEVsZW1lbnQgY2hpbGQsIENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqIFRPRE8uLi4gcmVtb3ZlIHRoaXMgbWV0aG9kIQotICAgKi8KLSAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCi0gIHsKLSAgICByZXR1cm4gZ2V0V1NETENvbnRlbnRzKCk7Ci0gIH0KLQotICAvKgotICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRFbGVtZW50Rm9yTW9kZWxPYmplY3QoT2JqZWN0IG1vZGVsT2JqZWN0KQotICB7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKEVsZW1lbnQpIG1vZGVsT2JqZWN0OwotICAgIH0KLSAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFdTRExFbGVtZW50KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoV1NETEVsZW1lbnQpIG1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgKi8KLQotICBwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q29udGVudE5vZGVzKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKE5vZGUgY2hpbGQgPSBjaGFuZ2VkRWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7Ci0gICAgICBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0LmFkZChjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBTb21lIHN1YmNsYXNzZXMgdXNlIHRoaXMgbWV0aG9kCi0gIHByb3RlY3RlZCBRTmFtZSBjcmVhdGVRTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBwcmVmaXhlZE5hbWUpCi0gIHsKLSAgICBRTmFtZSBxbmFtZSA9IG51bGw7Ci0gICAgaWYgKHByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHByZWZpeGVkTmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gKGluZGV4ID09IC0xKSA/ICIiIDogcHJlZml4ZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHByZWZpeGVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgcW5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbFBhcnQpOyAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHFuYW1lOwotICB9Ci0KLSAgLy8KLSAgLy8gRm9yIHJlY29uY2lsaWF0aW9uOiBNb2RlbCAtPiBET00KLSAgLy8KLQotICBwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KGJvb2xlYW4gZGVlcCkKLSAgewotICAgIGlmIChkZWVwIHx8IGdldEVsZW1lbnQoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHVwZGF0ZUVsZW1lbnQoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNoYW5nZUF0dHJpYnV0ZShudWxsKTsKLSAgICAgIGNoYW5nZVJlZmVyZW5jZShudWxsKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KCkKLSAgewotICAgIGlmIChnZXRFbGVtZW50KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpc1JlY29uY2lsaW5nID0gdHJ1ZTsKLSAgICAgIGNyZWF0ZUVsZW1lbnQoKTsKLSAgICAgIGlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFuZ2VBdHRyaWJ1dGUobnVsbCk7Ci0gICAgY2hhbmdlUmVmZXJlbmNlKG51bGwpOwotCi0gICAgT2JqZWN0IG9iaiA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBjb250YWlubWVudHMgPSBlQ2xhc3MoKS5nZXRFQWxsQ29udGFpbm1lbnRzKCkuaXRlcmF0b3IoKTsgY29udGFpbm1lbnRzLmhhc05leHQoKTspCi0gICAgewotICAgICAgRVJlZmVyZW5jZSBlUmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGNvbnRhaW5tZW50cy5uZXh0KCk7Ci0gICAgICBpZiAoZVJlZmVyZW5jZSA9PSBXU0RMUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRfU2NoZW1hKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIFRCRCAtIFRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgYW5kCi0gICAgICAgIC8vIGVSZWZlcm5jZSBpcyBYU0RTY2hlbWEuIFdoYXQgZG8gd2Ugd2FudCB0byBkbyBmb3IgdXBkYXRlPwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIWVSZWZlcmVuY2UuaXNUcmFuc2llbnQoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGVSZWZlcmVuY2UuaXNNYW55KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSAoKENvbGxlY3Rpb24pIGVHZXQoZVJlZmVyZW5jZSkpLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvYmogPSBvYmplY3RzLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFdTRExFbGVtZW50KSB8fCBvYmogPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gU2tpcCBpdC4gUHJvYmFibHkgdGhpcyBpcyBOYW1lc3BhY2UuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFdTRExFbGVtZW50IHdzZGxFbGVtZW50ID0gKFdTRExFbGVtZW50KSBvYmo7Ci0gICAgICAgICAgICAgIC8vaGFuZGxlRWxlbWVudEZvckFkb3B0KGVSZWZlcmVuY2UsIHdzZGxFbGVtZW50KTsKLSAgICAgICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKSB3c2RsRWxlbWVudCkudXBkYXRlRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgZUdldChlUmVmZXJlbmNlKTsKLSAgICAgICAgICBpZiAod3NkbEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL2hhbmRsZUVsZW1lbnRGb3JBZG9wdChlUmVmZXJlbmNlLCAgd3NkbEVsZW1lbnQpOwotICAgICAgICAgICAgICgoV1NETEVsZW1lbnRJbXBsKSB3c2RsRWxlbWVudCkudXBkYXRlRWxlbWVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAvLyBlbmQgZWxzZSBpZgotICAgIH0gLy8gZW5kIGZvcgotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hhbmdlQXR0cmlidXRlKEVBdHRyaWJ1dGUgZUF0dHJpYnV0ZSkKLSAgewotICAgIGlmIChlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMRWxlbWVudF9FbGVtZW50KCkpCi0gICAgewotICAgICAgRWxlbWVudCB0aGVFbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotICAgICAgaWYgKHRoZUVsZW1lbnQgIT0gbnVsbCAmJiAhaXNSZWNvbmNpbGluZykKLSAgICAgIHsKLSAgICAgICAgZm9yIChOb2RlIHJvb3REb2N1bWVudCA9IHRoZUVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOyByb290RG9jdW1lbnQgIT0gbnVsbDsgcm9vdERvY3VtZW50ID0gcm9vdERvY3VtZW50LmdldFBhcmVudE5vZGUoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChyb290RG9jdW1lbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgaXNSZWNvbmNpbGluZyA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlY29uY2lsZUF0dHJpYnV0ZXMoZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZWNvbmNpbGUoZ2V0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICB0cmF2ZXJzZVRvUm9vdEZvclBhdGNoaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHRyYXZlcnNlVG9Sb290Rm9yUGF0Y2hpbmcoKQotICB7Ci0gICAgaWYgKCFpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50SW1wbCBjb250YWluZXIgPSAoV1NETEVsZW1lbnRJbXBsKWdldENvbnRhaW5lcigpOwotICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKQotICAgICAgewotICAgICAgICBjb250YWluZXIudHJhdmVyc2VUb1Jvb3RGb3JQYXRjaGluZygpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZShFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgcmVjb25jaWxlQXR0cmlidXRlcyhjaGFuZ2VkRWxlbWVudCk7Ci0gICAgcmVjb25jaWxlQ29udGVudHMoY2hhbmdlZEVsZW1lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVDb250ZW50cyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgTGlzdCByZW1haW5pbmdNb2RlbE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KGdldFdTRExDb250ZW50cygpKTsKLQotICAgIENvbGxlY3Rpb24gY29udGVudE5vZGVzID0gZ2V0Q29udGVudE5vZGVzKGNoYW5nZWRFbGVtZW50KTsKLQotICAgIEVsZW1lbnQgdGhlRG9jdW1lbnRhdGlvbkVsZW1lbnQgPSBudWxsOwotICAgIAotICAgIC8vIGZvciBlYWNoIGFwcGxpY2FibGUgY2hpbGQgbm9kZSBvZiBjaGFuZ2VkRWxlbWVudAotICAgIExPT1AgOiBmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZW50Tm9kZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICAvLyBTZXQgRG9jdW1lbnRhdGlvbiBlbGVtZW50IGlmIGV4aXN0cwotICAgICAgaWYgKFdTRExDb25zdGFudHMuRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRy5lcXVhbHMoY2hpbGQuZ2V0TG9jYWxOYW1lKCkpICYmCi0gICAgICAgICAgV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpLCBXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSkpCi0gICAgICB7Ci0gICAgICAgIC8vIGFzc3VtZSB0aGUgZmlyc3QgJ2RvY3VtZW50YXRpb24nIGVsZW1lbnQgaXMgJ3RoZScgZG9jdW1lbnRhdGlvbiBlbGVtZW50Ci0gICAgICAgIC8vICd0aGVyZSBjYW4gYmUgb25seSBvbmUhJwotICAgICAgICBpZiAodGhlRG9jdW1lbnRhdGlvbkVsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgdGhlRG9jdW1lbnRhdGlvbkVsZW1lbnQgPSBjaGlsZDsKLSAgICAgICAgfSAgIAotICAgICAgfSAKLSAgICAgIC8vIGdvIHRocnUgdGhlIG1vZGVsIG9iamVjdHMgdG8gY29sbGVjdCBtYXRjaGluZyBvYmplY3QgZm9yIHJldXNlCi0gICAgICBmb3IgKEl0ZXJhdG9yIGNvbnRlbnRzID0gcmVtYWluaW5nTW9kZWxPYmplY3RzLml0ZXJhdG9yKCk7IGNvbnRlbnRzLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IChPYmplY3QpIGNvbnRlbnRzLm5leHQoKTsKLSAgICAgICAgaWYgKCgoV1NETEVsZW1lbnQpIG1vZGVsT2JqZWN0KS5nZXRFbGVtZW50KCkgPT0gY2hpbGQpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250ZW50cy5yZW1vdmUoKTsgLy8gcmVtb3ZlcyB0aGUgJ2NoaWxkJyBOb2RlIGZyb20gdGhlIHJlbWFpbmluZ01vZGVsT2JqZWN0cyBsaXN0Ci0gICAgICAgICAgY29udGludWUgTE9PUDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBpZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGhhcyBjaGFuZ2VkLi4uIHVwZGF0ZSBpdAotICAgICAgLy8KLSAgICAgIGlmICh0aGVEb2N1bWVudGF0aW9uRWxlbWVudCAhPSBnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKQotICAgICAgewotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCh0aGVEb2N1bWVudGF0aW9uRWxlbWVudCk7ICAKLSAgICAgIH0gIAotICAgICAgCi0gICAgICAvLyB3ZSBoYXZlbid0IGZvdW5kIGEgbWF0Y2hpbmcgbW9kZWwgb2JqZWN0IGZvciB0aGUgTm9kZSwgc2Ugd2UgbWF5IG5lZWQgdG8KLSAgICAgIC8vIGNyZWF0ZSBhIG5ldyBtb2RlbCBvYmplY3QKLSAgICAgIGhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQsIHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7Ci0gICAgfQotCi0gICAgLy8gbm93IHdlIGNhbiByZW1vdmUgdGhlIHJlbWFpbmluZyBtb2RlbCBvYmplY3RzCi0gICAgaGFuZGxlUmVjb25jaWxpYXRpb24ocmVtYWluaW5nTW9kZWxPYmplY3RzKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpCi0gIHsKLSAgICBpZiAoZW5jbG9zaW5nRGVmaW5pdGlvbiAhPSBudWxsKQotICAgICAgcmV0dXJuIGVuY2xvc2luZ0RlZmluaXRpb247Ci0KLSAgICAvLyBUQkQgLSBSZXZpc2l0Ci0gICAgLy9FT2JqZWN0IGMgPSBlQ29udGFpZXIoKTsgYyAhPSBudWxsOyBjID0gYy5lQ29udGFpbnRlcigpKQotICAgIC8vewotCi0gICAgZm9yIChXU0RMRWxlbWVudCBjb250YWluZXIgPSB0aGlzOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gKChXU0RMRWxlbWVudEltcGwpIGNvbnRhaW5lcikuZ2V0Q29udGFpbmVyKCkpCi0gICAgewotICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIGVuY2xvc2luZ0RlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgY29udGFpbmVyOwotICAgICAgICByZXR1cm4gZW5jbG9zaW5nRGVmaW5pdGlvbjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldFJvb3RFbmNsb3NpbmdEZWZpbml0aW9uKCkKLSAgewotICAgIGlmIChlbmNsb3NpbmdEZWZpbml0aW9uID09IG51bGwpCi0gICAgIHsKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0gICAgICBMaXN0IGNvbnRlbnRzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLSAgICAgIGlmIChjb250ZW50cy5zaXplKCkgPT0gMSAKLSAgICAgICAgICAmJiBjb250ZW50cy5nZXQoMCkgaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgICBlbmNsb3NpbmdEZWZpbml0aW9uID0gKERlZmluaXRpb24pY29udGVudHMuZ2V0KDApOwotICAgIH0gCi0gICAgcmV0dXJuIGVuY2xvc2luZ0RlZmluaXRpb247Ci0gIH0KLSAgKi8KLQotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0Q29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiBlQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBXU0RMRWxlbWVudCA/IChXU0RMRWxlbWVudCkgZUNvbnRhaW5lcigpIDogbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG5pY2VTZXRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAoaXNSZWNvbmNpbGluZykKLSAgICB7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgZG9tIGF0dHJpYnV0ZSB3cml0ZWJhY2sgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUpKQotICAgICAgewotICAgICAgICB1cGRhdGluZ0RPTSA9IHRydWU7Ci0gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7Ci0gICAgICAgIHVwZGF0aW5nRE9NID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSkgfHwgIWVsZW1lbnQuZ2V0QXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlKS5lcXVhbHModmFsdWUpKQotICAgIHsKLSAgICAgIHVwZGF0aW5nRE9NID0gdHJ1ZTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0gICAgICB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgbmljZUNyZWF0ZU5hbWVzcGFjZUF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSB1bmlxdWUgcHJlZml4IGZvciAibmFtZXNwYWNlLiIKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIG5pY2VTZXRBdHRyaWJ1dGVVUklWYWx1ZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB1cmlMaXN0KQotICB7Ci0gICAgaWYgKGlzUmVjb25jaWxpbmcpCi0gICAgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGN5Y2xpYyBkb20gYXR0cmlidXRlIHdyaXRlYmFjayBhdm9pZGVkICIgKyBlQ2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh1cmlMaXN0ID09IG51bGwpCi0gICAgewotICAgICAgdXBkYXRpbmdET00gPSB0cnVlOwotICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLSAgICAgIHVwZGF0aW5nRE9NID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVyaUxpc3QsICIgIik7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB1cmkgPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdXJpOwotICAgICAgICBpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIiMiKTsKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGluZGV4ID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSB1cmkuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbG9jYWxOYW1lID0gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSBYU0RDb25zdGFudHMubG9va3VwUXVhbGlmaWVyKGVsZW1lbnQsIG5hbWVzcGFjZSk7Ci0gICAgICAgIGlmIChxdWFsaWZpZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHF1YWxpZmllciA9IG5pY2VDcmVhdGVOYW1lc3BhY2VBdHRyaWJ1dGUobmFtZXNwYWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBxTmFtZSA9IHF1YWxpZmllciA9PSBudWxsIHx8IHF1YWxpZmllci5sZW5ndGgoKSA9PSAwID8gbG9jYWxOYW1lIDogcXVhbGlmaWVyICsgIjoiICsgbG9jYWxOYW1lOwotCi0gICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUuYXBwZW5kKCcgJyk7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsdWUuYXBwZW5kKHFOYW1lKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZU5TKG51bGwsIGF0dHJpYnV0ZSkgfHwgIWVsZW1lbnQuZ2V0QXR0cmlidXRlTlMobnVsbCwgYXR0cmlidXRlKS5lcXVhbHModmFsdWUudG9TdHJpbmcoKSkpCi0gICAgICB7Ci0gICAgICAgIHVwZGF0aW5nRE9NID0gdHJ1ZTsKLSAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBhdHRyaWJ1dGUsIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICB1cGRhdGluZ0RPTSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZVJlZmVyZW5jZShFUmVmZXJlbmNlIGVSZWZlcmVuY2UpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKSAvLyBTaG91bGQgSSBtYWtlIHRoaXMgYWJzdHJhY3Q/Ci0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByb3RlY3RlZCBmaW5hbCBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoaW50IG5vZGVUeXBlKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICBpZiAodGhpcyBpbnN0YW5jZW9mIERlZmluaXRpb24pCi0gICAgICBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIHRoaXM7Ci0gICAgZWxzZQotICAgICAgZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLQotICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgZG9jdW1lbnQgPSAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS51cGRhdGVEb2N1bWVudCgpOwotCi0gICAgLy8gUmV0cmlldmUgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoZSBXU0RMIG5hbWVzcGFjZQotICAgIFN0cmluZyB3c2RsTmFtZXNwYWNlID0gV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkk7Ci0gICAgU3RyaW5nIHF1YWxpZmllciA9IGRlZmluaXRpb24uZ2V0UHJlZml4KHdzZGxOYW1lc3BhY2UpOwotCi0gICAgRWxlbWVudCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHdzZGxOYW1lc3BhY2UsIChxdWFsaWZpZXIgPT0gbnVsbCA/ICIiIDogcXVhbGlmaWVyICsgIjoiKSArIFdTRExDb25zdGFudHMuRUxFTUVOVF9UQUdTW25vZGVUeXBlXSk7Ci0KLSAgICBpZiAoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkgPT0gbnVsbCkKLSAgICAgIGRvY3VtZW50LmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwotCi0gICAgaWYgKGdldERvY3VtZW50YXRpb25FbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgIG5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaW1wb3J0Tm9kZShnZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCB0cnVlKSk7Ci0KLSAgICByZXR1cm4gbmV3RWxlbWVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZVJlZmVyZW5jZXMoYm9vbGVhbiBkZWVwKQotICB7Ci0gICAgaWYgKGRlZXApCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBjb250ZW50cyA9IGdldFdTRExDb250ZW50cygpLml0ZXJhdG9yKCk7IGNvbnRlbnRzLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBjb250ZW50ID0gY29udGVudHMubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFdTRExFbGVtZW50SW1wbCkKLSAgICAgICAgewotICAgICAgICAgIFdTRExFbGVtZW50SW1wbCBlbGVtZW50ID0gKFdTRExFbGVtZW50SW1wbCkgY29udGVudDsKLSAgICAgICAgICBlbGVtZW50LmlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICAgIGVsZW1lbnQucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKLSAgICAgICAgICBlbGVtZW50LmlzUmVjb25jaWxpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIFdTRExFbGVtZW50IGdldEJlc3RXU0RMRWxlbWVudChMaXN0IGVsZW1lbnRQYXRoKQotICB7Ci0gICAgV1NETEVsZW1lbnQgcmVzdWx0ID0gdGhpczsKLSAgICBmb3IgKEl0ZXJhdG9yIGNvbXBvbmVudHMgPSBnZXRXU0RMQ29udGVudHMoKS5pdGVyYXRvcigpOyBjb21wb25lbnRzLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFdTRExFbGVtZW50SW1wbCBjaGlsZFdTRExFbGVtZW50ID0gKFdTRExFbGVtZW50SW1wbCljb21wb25lbnRzLm5leHQoKTsKLSAgICAgIGlmIChlbGVtZW50UGF0aC5jb250YWlucyhjaGlsZFdTRExFbGVtZW50LmdldEVsZW1lbnQoKSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGNoaWxkV1NETEVsZW1lbnQ7Ci0gICAgICAgIFdTRExFbGVtZW50IGJldHRlcldTRExFbGVtZW50ID0gY2hpbGRXU0RMRWxlbWVudC5nZXRCZXN0V1NETEVsZW1lbnQoZWxlbWVudFBhdGgpOwotICAgICAgICBpZiAoYmV0dGVyV1NETEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGJldHRlcldTRExFbGVtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjb25zaWRlckFsbENvbnRhaW5zRm9yQmVzdFdTRExFbGVtZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjb25zaWRlckFsbENvbnRhaW5zRm9yQmVzdFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50QXR0cmlidXRlc0NoYW5nZWQoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIGlmICghaXNVcGRhdGluZ0RPTSgpKQotICAgIHsKLSAgICAgIGlmICghaXNSZWNvbmNpbGluZykKLSAgICAgIHsKLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCIqKioqIGNoYW5nZUZvciAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAKLSAgICAgICAgaXNSZWNvbmNpbGluZyA9IHRydWU7Ci0gICAgICAgIHJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotCi0gICAgICAgIFdTRExFbGVtZW50SW1wbCB0aGVDb250YWluZXIgPSAoV1NETEVsZW1lbnRJbXBsKWdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAodGhlQ29udGFpbmVyICE9IG51bGwgJiYgdGhlQ29udGFpbmVyLmdldEVsZW1lbnQoKSA9PSBjaGFuZ2VkRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIHRoZUNvbnRhaW5lci5lbGVtZW50QXR0cmlidXRlc0NoYW5nZWQoY2hhbmdlZEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgICAgICB0cmF2ZXJzZVRvUm9vdEZvclBhdGNoaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgaW50ZXJuYWwgcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIERPTSByZWNvbmNpbGUgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbGVtZW50Q29udGVudHNDaGFuZ2VkKEVsZW1lbnQgY2hhbmdlZEVsZW1lbnQpCi0gIHsKLSAgICBpZiAoIWlzVXBkYXRpbmdET00oKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzUmVjb25jaWxpbmcpCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjaGFuZ2VGb3IgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgCi0gICAgICAgIGlzUmVjb25jaWxpbmcgPSB0cnVlOwotICAgICAgICByZWNvbmNpbGVDb250ZW50cyhjaGFuZ2VkRWxlbWVudCk7Ci0KLSAgICAgICAgV1NETEVsZW1lbnRJbXBsIHRoZUNvbnRhaW5lciA9IChXU0RMRWxlbWVudEltcGwpZ2V0Q29udGFpbmVyKCk7Ci0gICAgICAgIGlmICh0aGVDb250YWluZXIgIT0gbnVsbCAmJiB0aGVDb250YWluZXIuZ2V0RWxlbWVudCgpID09IGNoYW5nZWRFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgdGhlQ29udGFpbmVyLmVsZW1lbnRDb250ZW50c0NoYW5nZWQoY2hhbmdlZEVsZW1lbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXNSZWNvbmNpbGluZyA9IGZhbHNlOwotICAgICAgICB0cmF2ZXJzZVRvUm9vdEZvclBhdGNoaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiKioqKiBjeWNsaWMgaW50ZXJuYWwgcmVjb25jaWxlIGF2b2lkZWQgIiArIGVDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiogY3ljbGljIERPTSByZWNvbmNpbGUgYXZvaWRlZCAiICsgZUNsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVByZWZpeChOb2RlIG5vZGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBvbGRQcmVmaXgsIFN0cmluZyBuZXdQcmVmaXgpCi0gIHsKLSAgICBpZiAoKG5hbWVzcGFjZSA9PSBudWxsID8gbm9kZS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsIDogbmFtZXNwYWNlLmVxdWFscyhub2RlLmdldE5hbWVzcGFjZVVSSSgpKSkgJiYKLSAgICAgICAgICAob2xkUHJlZml4ID09IG51bGwgPyBub2RlLmdldFByZWZpeCgpID09IG51bGwgOiBvbGRQcmVmaXguZXF1YWxzKG5vZGUuZ2V0UHJlZml4KCkpKSkKLSAgICB7Ci0gICAgICBub2RlLnNldFByZWZpeChuZXdQcmVmaXgpOwotICAgIH0KLQotICAgIGZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgewotICAgICAgdXBkYXRlUHJlZml4KGNoaWxkLCBuYW1lc3BhY2UsIG9sZFByZWZpeCwgbmV3UHJlZml4KTsKLSAgICB9Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lc3BhY2UoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLSAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICBlbHNlIGlmIChnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgIT0gbnVsbCkKLSAgICAgIHJldHVybiBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkuZ2V0TmFtZXNwYWNlKG5hbWUuc3Vic3RyaW5nKDAsaW5kZXgpKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbE5hbWUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLSAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsKLSAgICBpZiAoIGluZGV4ID09IC0xKQotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGluZGV4KzEpOwotICB9Ci0KLX0gLy9XU0RMRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjZGZkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvV1NETEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdTRExGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMRmFjdG9yeUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0gIHsKLSAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRTogcmV0dXJuIGNyZWF0ZVBvcnRUeXBlKCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLk9QRVJBVElPTjogcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5NRVNTQUdFOiByZXR1cm4gY3JlYXRlTWVzc2FnZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUOiByZXR1cm4gY3JlYXRlUGFydCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HOiByZXR1cm4gY3JlYXRlQmluZGluZygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09QRVJBVElPTjogcmV0dXJuIGNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRTogcmV0dXJuIGNyZWF0ZVNlcnZpY2UoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUE9SVDogcmV0dXJuIGNyZWF0ZVBvcnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRVhURU5TSUJJTElUWV9FTEVNRU5UOiByZXR1cm4gY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuREVGSU5JVElPTjogcmV0dXJuIGNyZWF0ZURlZmluaXRpb24oKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuSU1QT1JUOiByZXR1cm4gY3JlYXRlSW1wb3J0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUOiByZXR1cm4gY3JlYXRlSW5wdXQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1VUUFVUOiByZXR1cm4gY3JlYXRlT3V0cHV0KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUOiByZXR1cm4gY3JlYXRlRmF1bHQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19JTlBVVDogcmV0dXJuIGNyZWF0ZUJpbmRpbmdJbnB1dCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX09VVFBVVDogcmV0dXJuIGNyZWF0ZUJpbmRpbmdPdXRwdXQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19GQVVMVDogcmV0dXJuIGNyZWF0ZUJpbmRpbmdGYXVsdCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5OQU1FU1BBQ0U6IHJldHVybiBjcmVhdGVOYW1lc3BhY2UoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuVFlQRVM6IHJldHVybiBjcmVhdGVUeXBlcygpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5VTktOT1dOX0VYVEVOU0lCSUxJVFlfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVDogcmV0dXJuIGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlFOQU1FOgotICAgICAgICByZXR1cm4gY3JlYXRlUU5hbWVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OX1RZUEU6Ci0gICAgICAgIHJldHVybiBjcmVhdGVPcGVyYXRpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLkRPTV9FTEVNRU5UOgotICAgICAgICByZXR1cm4gY3JlYXRlRE9NRWxlbWVudEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5XU0RMX0VYQ0VQVElPTjoKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVdTRExFeGNlcHRpb25Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRE9NX0RPQ1VNRU5UOgotICAgICAgICByZXR1cm4gY3JlYXRlRE9NRG9jdW1lbnRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLSAgewotICAgIHN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotICAgIHsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuUU5BTUU6Ci0gICAgICAgIHJldHVybiBjb252ZXJ0UU5hbWVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5PUEVSQVRJT05fVFlQRToKLSAgICAgICAgcmV0dXJuIGNvbnZlcnRPcGVyYXRpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuRE9NX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBjb252ZXJ0RE9NRWxlbWVudFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLldTRExfRVhDRVBUSU9OOgotICAgICAgICByZXR1cm4gY29udmVydFdTRExFeGNlcHRpb25Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5ET01fRE9DVU1FTlQ6Ci0gICAgICAgIHJldHVybiBjb252ZXJ0RE9NRG9jdW1lbnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZSBjcmVhdGVQb3J0VHlwZSgpCi0gIHsKLSAgICBQb3J0VHlwZUltcGwgcG9ydFR5cGUgPSBuZXcgUG9ydFR5cGVJbXBsKCk7Ci0gICAgcmV0dXJuIHBvcnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbigpCi0gIHsKLSAgICBPcGVyYXRpb25JbXBsIG9wZXJhdGlvbiA9IG5ldyBPcGVyYXRpb25JbXBsKCk7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpCi0gIHsKLSAgICBNZXNzYWdlSW1wbCBtZXNzYWdlID0gbmV3IE1lc3NhZ2VJbXBsKCk7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBQYXJ0IGNyZWF0ZVBhcnQoKQotICB7Ci0gICAgUGFydEltcGwgcGFydCA9IG5ldyBQYXJ0SW1wbCgpOwotICAgIHJldHVybiBwYXJ0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZyBjcmVhdGVCaW5kaW5nKCkKLSAgewotICAgIEJpbmRpbmdJbXBsIGJpbmRpbmcgPSBuZXcgQmluZGluZ0ltcGwoKTsKLSAgICByZXR1cm4gYmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gY3JlYXRlQmluZGluZ09wZXJhdGlvbigpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uSW1wbCBiaW5kaW5nT3BlcmF0aW9uID0gbmV3IEJpbmRpbmdPcGVyYXRpb25JbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTZXJ2aWNlIGNyZWF0ZVNlcnZpY2UoKQotICB7Ci0gICAgU2VydmljZUltcGwgc2VydmljZSA9IG5ldyBTZXJ2aWNlSW1wbCgpOwotICAgIHJldHVybiBzZXJ2aWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgUG9ydCBjcmVhdGVQb3J0KCkKLSAgewotICAgIFBvcnRJbXBsIHBvcnQgPSBuZXcgUG9ydEltcGwoKTsKLSAgICByZXR1cm4gcG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IG5ldyBFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKTsKLSAgICByZXR1cm4gZXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0gICAKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb24oKQotICB7Ci0gICAgRGVmaW5pdGlvbkltcGwgZGVmaW5pdGlvbiA9IG5ldyBEZWZpbml0aW9uSW1wbCgpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGNyZWF0ZUltcG9ydCgpCi0gIHsKLSAgICBJbXBvcnRJbXBsIGltcG9ydF8gPSBuZXcgSW1wb3J0SW1wbCgpOwotICAgIHJldHVybiBpbXBvcnRfOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgSW5wdXQgY3JlYXRlSW5wdXQoKQotICB7Ci0gICAgSW5wdXRJbXBsIGlucHV0ID0gbmV3IElucHV0SW1wbCgpOwotICAgIHJldHVybiBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE91dHB1dCBjcmVhdGVPdXRwdXQoKQotICB7Ci0gICAgT3V0cHV0SW1wbCBvdXRwdXQgPSBuZXcgT3V0cHV0SW1wbCgpOwotICAgIHJldHVybiBvdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBGYXVsdCBjcmVhdGVGYXVsdCgpCi0gIHsKLSAgICBGYXVsdEltcGwgZmF1bHQgPSBuZXcgRmF1bHRJbXBsKCk7Ci0gICAgcmV0dXJuIGZhdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0lucHV0IGNyZWF0ZUJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXRJbXBsIGJpbmRpbmdJbnB1dCA9IG5ldyBCaW5kaW5nSW5wdXRJbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPdXRwdXQgY3JlYXRlQmluZGluZ091dHB1dCgpCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0SW1wbCBiaW5kaW5nT3V0cHV0ID0gbmV3IEJpbmRpbmdPdXRwdXRJbXBsKCk7Ci0gICAgcmV0dXJuIGJpbmRpbmdPdXRwdXQ7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nRmF1bHQgY3JlYXRlQmluZGluZ0ZhdWx0KCkKLSAgewotICAgIEJpbmRpbmdGYXVsdEltcGwgYmluZGluZ0ZhdWx0ID0gbmV3IEJpbmRpbmdGYXVsdEltcGwoKTsKLSAgICByZXR1cm4gYmluZGluZ0ZhdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTmFtZXNwYWNlIGNyZWF0ZU5hbWVzcGFjZSgpCi0gIHsKLSAgICBOYW1lc3BhY2VJbXBsIG5hbWVzcGFjZSA9IG5ldyBOYW1lc3BhY2VJbXBsKCk7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFR5cGVzIGNyZWF0ZVR5cGVzKCkKLSAgewotICAgIFR5cGVzSW1wbCB0eXBlcyA9IG5ldyBUeXBlc0ltcGwoKTsKLSAgICByZXR1cm4gdHlwZXM7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwgdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50ID0gbmV3IFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKTsKLSAgICByZXR1cm4gdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50ID0gbmV3IFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50SW1wbCgpOwotICAgIHJldHVybiB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotICAKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBjcmVhdGVRTmFtZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgewotICAgIHJldHVybiAoUU5hbWUpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY29udmVydFFOYW1lVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb25UeXBlIGNyZWF0ZU9wZXJhdGlvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gKE9wZXJhdGlvblR5cGUpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY29udmVydE9wZXJhdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLSAgewotICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEVsZW1lbnQgY3JlYXRlRE9NRWxlbWVudEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgewotICAgIHJldHVybiAoRWxlbWVudClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBjb252ZXJ0RE9NRWxlbWVudFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETEV4Y2VwdGlvbiBjcmVhdGVXU0RMRXhjZXB0aW9uRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotICB7Ci0gICAgcmV0dXJuIChXU0RMRXhjZXB0aW9uKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRXU0RMRXhjZXB0aW9uVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBjcmVhdGVET01Eb2N1bWVudEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLSAgewotICAgIHJldHVybiAoRG9jdW1lbnQpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgY29udmVydERPTURvY3VtZW50VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMUGFja2FnZSBnZXRXU0RMUGFja2FnZSgpCi0gIHsKLSAgICByZXR1cm4gKFdTRExQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NETFBhY2thZ2UgZ2V0UGFja2FnZSgpCi0gIHsKLSAgICByZXR1cm4gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLwotICAvLwotICAvLwotICBwdWJsaWMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkobmFtZXNwYWNlKTsKLSAgICBpZiAoZmFjdG9yeSAhPSBudWxsKQotICAgICAgcmV0dXJuIGZhY3RvcnkuY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBjcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgfQotICAKLSAgLyoKLSAgcHVibGljIHZvaWQgc2V0QWx3YXlzVXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlcHJlY2F0ZWQ6IFdTRExGYWN0b3J5SW1wbC5zZXRVc2VFeHRlbnNpb25GYWN0b3JpZXMiKTsKLSAgfQotICAqLwotfSAvL1dTRExGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExQYWNrYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1dTRExQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjMxMTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9XU0RMUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdTRExQYWNrYWdlCi17Ci0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcG9ydFR5cGVFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgb3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIG1lc3NhZ2VFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcGFydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgc2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBwb3J0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGRlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaW1wb3J0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGV4dGVuc2libGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlucHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIG91dHB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBmYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nSW5wdXRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgYmluZGluZ091dHB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBiaW5kaW5nRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgbmFtZXNwYWNlRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlQb3J0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpT3BlcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlJbnB1dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpT3V0cHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlGYXVsdEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpTWVzc2FnZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpUGFydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpU2VydmljZUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpUG9ydEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ0VDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ09wZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpQmluZGluZ0lucHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlCaW5kaW5nT3V0cHV0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlCaW5kaW5nRmF1bHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlEZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlJbXBvcnRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaUxpc3RFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaU1hcEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpdXJsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGlFeHRlbnNpb25SZWdpc3RyeUVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB0eXBlc0VDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBpSXRlcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgaVR5cGVzRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIHFOYW1lRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIG9wZXJhdGlvblR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgZG9tRWxlbWVudEVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSB3c2RsRXhjZXB0aW9uRURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRURhdGFUeXBlIGRvbURvY3VtZW50RURhdGFUeXBlID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotICAgICAqIHBhY2thZ2UgVVJJIHZhbHVlLgotICAgICAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLSAgICAgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotICAgICAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0gICAgICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlI2VOU19VUkkKLSAgICAgKiBAc2VlICNpbml0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBXU0RMUGFja2FnZUltcGwoKQotICAgIHsKLSAgICAgICAgc3VwZXIoZU5TX1VSSSwgV1NETEZhY3RvcnkuZUlOU1RBTkNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLSAgICAgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotICAgICAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0gICAgICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0gICAgICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotICAgICAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0gICAgICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotICAgICAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotICAgICAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLSAgICAgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotICAgICAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0gICAgICogdGhvc2Ugb2YgYW5vdGhlci4KLSAgICAgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0gICAgICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZU5TX1VSSQotICAgICAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgV1NETFBhY2thZ2UgaW5pdCgpCi0gICAgewotICAgICAgICBpZiAoaXNJbml0ZWQpIHJldHVybiAoV1NETFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV1NETFBhY2thZ2UuZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotICAgICAgICBXU0RMUGFja2FnZUltcGwgdGhlV1NETFBhY2thZ2UgPSAoV1NETFBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXU0RMUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXU0RMUGFja2FnZUltcGwoKSk7Ci0KLSAgICAgICAgaXNJbml0ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotICAgICAgICBYU0RQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLSAgICAgICAgdGhlV1NETFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLSAgICAgICAgdGhlV1NETFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLSAgICAgICAgdGhlV1NETFBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRoZVdTRExQYWNrYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETEVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdzZGxFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTRExFbGVtZW50X0RvY3VtZW50YXRpb25FbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgd3NkbEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMRWxlbWVudF9FbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgd3NkbEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFBvcnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwb3J0VHlwZUVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9RTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBvcnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfVW5kZWZpbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0VHlwZV9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBvcnRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydFR5cGVfUmVzb3VyY2VVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwb3J0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRUeXBlX0VPcGVyYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldE9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9TdHlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgb3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3BlcmF0aW9uX1VuZGVmaW5lZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE9wZXJhdGlvbl9SZXNvdXJjZVVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBvcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRPcGVyYXRpb25fRU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldE9wZXJhdGlvbl9FRmF1bHRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgb3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbWVzc2FnZUVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlX1FOYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgbWVzc2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VfVW5kZWZpbmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgbWVzc2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VfUHJveHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBtZXNzYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlX0VQYXJ0cygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFBhcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhcnRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFydF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFBhcnRfRWxlbWVudE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGFydF9UeXBlTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHBhcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJ0X1R5cGVEZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgcGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnRfRU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBwYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRCaW5kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEJpbmRpbmdfUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19VbmRlZmluZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ19Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGJpbmRpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nX1Jlc291cmNlVVJJKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRVBvcnRUeXBlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdfRUJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QmluZGluZ09wZXJhdGlvbl9FT3BlcmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ09wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgYmluZGluZ09wZXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPcGVyYXRpb25fRUJpbmRpbmdGYXVsdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRTZXJ2aWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VfUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZV9VbmRlZmluZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBzZXJ2aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZV9Qcm94eSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlX1Jlc291cmNlVVJJKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgc2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZpY2VfRVBvcnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgc2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gcG9ydEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0X05hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBwb3J0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydF9FQmluZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudF9SZXF1aXJlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX1RhcmdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWZpbml0aW9uX0xvY2F0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldERlZmluaXRpb25fUU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVmaW5pdGlvbl9FbmNvZGluZygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VNZXNzYWdlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VQb3J0VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FQmluZGluZ3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FU2VydmljZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBkZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVmaW5pdGlvbl9FTmFtZXNwYWNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VUeXBlcygpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXREZWZpbml0aW9uX0VJbXBvcnRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEltcG9ydCgpCi0gICAgewotICAgICAgICByZXR1cm4gaW1wb3J0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEltcG9ydF9OYW1lc3BhY2VVUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbXBvcnRfTG9jYXRpb25VUkkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRURlZmluaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBpbXBvcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBvcnRfRVNjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGltcG9ydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2libGVFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEV4dGVuc2libGVFbGVtZW50X0VFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBleHRlbnNpYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlucHV0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0T3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmF1bHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRCaW5kaW5nSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdJbnB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCaW5kaW5nSW5wdXRfTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIGJpbmRpbmdJbnB1dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdJbnB1dF9FSW5wdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKSBiaW5kaW5nSW5wdXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEJpbmRpbmdPdXRwdXQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdPdXRwdXRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmluZGluZ091dHB1dF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ091dHB1dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldEJpbmRpbmdPdXRwdXRfRU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdPdXRwdXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldEJpbmRpbmdGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmluZGluZ0ZhdWx0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEJpbmRpbmdGYXVsdF9OYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSkgYmluZGluZ0ZhdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIGJpbmRpbmdGYXVsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0TmFtZXNwYWNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZXNwYWNlX1VSSSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG5hbWVzcGFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE5hbWVzcGFjZV9QcmVmaXgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKSBuYW1lc3BhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElQb3J0VHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gaVBvcnRUeXBlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU9wZXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gaU9wZXJhdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUlucHV0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU91dHB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaU91dHB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElGYXVsdCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUZhdWx0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlNZXNzYWdlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVBhcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlQYXJ0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVNlcnZpY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlTZXJ2aWNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlQb3J0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmdPcGVyYXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUJpbmRpbmdJbnB1dCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUJpbmRpbmdJbnB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElCaW5kaW5nT3V0cHV0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpQmluZGluZ091dHB1dEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElCaW5kaW5nRmF1bHQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlCaW5kaW5nRmF1bHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElEZWZpbml0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpRGVmaW5pdGlvbkVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElJbXBvcnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlJbXBvcnRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJTGlzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gaUxpc3RFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJTWFwKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpTWFwRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SVVSTCgpCi0gICAgewotICAgICAgICByZXR1cm4gaXVybEVDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldElFeHRlbnNpb25SZWdpc3RyeSgpCi0gICAgewotICAgICAgICByZXR1cm4gaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0VHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHR5cGVzRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SUl0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpSXRlcmF0b3JFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRJVHlwZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlUeXBlc0VDbGFzczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudF9DaGlsZHJlbigpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0WFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFUmVmZXJlbmNlIGdldFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50X1NjaGVtYSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRNZXNzYWdlUmVmZXJlbmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VSZWZlcmVuY2VfTmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlUmVmZXJlbmNlX0VNZXNzYWdlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSkgbWVzc2FnZVJlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0UU5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHFOYW1lRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0T3BlcmF0aW9uVHlwZSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uVHlwZUVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldERPTUVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbUVsZW1lbnRFRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXRXU0RMRXhjZXB0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3c2RsRXhjZXB0aW9uRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRGF0YVR5cGUgZ2V0RE9NRG9jdW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRvbURvY3VtZW50RURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBXU0RMRmFjdG9yeSBnZXRXU0RMRmFjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gKFdTRExGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0gICAgewotICAgICAgICBpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0gICAgICAgIGlzQ3JlYXRlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0gICAgICAgIHdzZGxFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdTRExfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbEVsZW1lbnRFQ2xhc3MsIFdTRExfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsRWxlbWVudEVDbGFzcywgV1NETF9FTEVNRU5UX19FTEVNRU5UKTsKLQotICAgICAgICBwb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUX1RZUEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0VHlwZUVDbGFzcywgUE9SVF9UWVBFX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0VHlwZUVDbGFzcywgUE9SVF9UWVBFX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBvcnRUeXBlRUNsYXNzLCBQT1JUX1RZUEVfX0VPUEVSQVRJT05TKTsKLQotICAgICAgICBvcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1BFUkFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fU1RZTEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fVU5ERUZJTkVEKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fUFJPWFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19FSU5QVVQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKG9wZXJhdGlvbkVDbGFzcywgT1BFUkFUSU9OX19FT1VUUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShvcGVyYXRpb25FQ2xhc3MsIE9QRVJBVElPTl9fRUZBVUxUUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2Uob3BlcmF0aW9uRUNsYXNzLCBPUEVSQVRJT05fX0VQQVJBTUVURVJfT1JERVJJTkcpOwotCi0gICAgICAgIG1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fUU5BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VFQ2xhc3MsIE1FU1NBR0VfX1VOREVGSU5FRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fUFJPWFkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VFQ2xhc3MsIE1FU1NBR0VfX1JFU09VUkNFX1VSSSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZUVDbGFzcywgTUVTU0FHRV9fRVBBUlRTKTsKLQotICAgICAgICBwYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUlQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBhcnRFQ2xhc3MsIFBBUlRfX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHBhcnRFQ2xhc3MsIFBBUlRfX0VMRU1FTlRfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUocGFydEVDbGFzcywgUEFSVF9fVFlQRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShwYXJ0RUNsYXNzLCBQQVJUX19UWVBFX0RFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBhcnRFQ2xhc3MsIFBBUlRfX0VMRU1FTlRfREVDTEFSQVRJT04pOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHBhcnRFQ2xhc3MsIFBBUlRfX0VNRVNTQUdFKTsKLQotICAgICAgICBiaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShiaW5kaW5nRUNsYXNzLCBCSU5ESU5HX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShiaW5kaW5nRUNsYXNzLCBCSU5ESU5HX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX0VQT1JUX1RZUEUpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGJpbmRpbmdFQ2xhc3MsIEJJTkRJTkdfX0VCSU5ESU5HX09QRVJBVElPTlMpOwotCi0gICAgICAgIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQklORElOR19PUEVSQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIEJJTkRJTkdfT1BFUkFUSU9OX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRU9QRVJBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ09wZXJhdGlvbkVDbGFzcywgQklORElOR19PUEVSQVRJT05fX0VCSU5ESU5HX0lOUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfT1VUUFVUKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBCSU5ESU5HX09QRVJBVElPTl9fRUJJTkRJTkdfRkFVTFRTKTsKLQotICAgICAgICBzZXJ2aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX1FOQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRUNsYXNzLCBTRVJWSUNFX19VTkRFRklORUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX1BST1hZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlRUNsYXNzLCBTRVJWSUNFX19SRVNPVVJDRV9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VFQ2xhc3MsIFNFUlZJQ0VfX0VQT1JUUyk7Ci0KLSAgICAgICAgcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1JUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShwb3J0RUNsYXNzLCBQT1JUX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShwb3J0RUNsYXNzLCBQT1JUX19FQklORElORyk7Ci0KLSAgICAgICAgZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVhURU5TSUJJTElUWV9FTEVNRU5UKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIEVYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRUxFTUVOVF9UWVBFKTsKLQotICAgICAgICBkZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFRklOSVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0xPQ0FUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19RTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRU5DT0RJTkcpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VNRVNTQUdFUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVBPUlRfVFlQRVMpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGRlZmluaXRpb25FQ2xhc3MsIERFRklOSVRJT05fX0VCSU5ESU5HUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVNFUlZJQ0VTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19FTkFNRVNQQUNFUyk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZGVmaW5pdGlvbkVDbGFzcywgREVGSU5JVElPTl9fRVRZUEVTKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShkZWZpbml0aW9uRUNsYXNzLCBERUZJTklUSU9OX19FSU1QT1JUUyk7Ci0KLSAgICAgICAgaW1wb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElNUE9SVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoaW1wb3J0RUNsYXNzLCBJTVBPUlRfX05BTUVTUEFDRV9VUkkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGltcG9ydEVDbGFzcywgSU1QT1JUX19MT0NBVElPTl9VUkkpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKGltcG9ydEVDbGFzcywgSU1QT1JUX19FREVGSU5JVElPTik7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoaW1wb3J0RUNsYXNzLCBJTVBPUlRfX0VTQ0hFTUEpOwotCi0gICAgICAgIGV4dGVuc2libGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYVEVOU0lCTEVfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIEVYVEVOU0lCTEVfRUxFTUVOVF9fRUVYVEVOU0lCSUxJVFlfRUxFTUVOVFMpOwotCi0gICAgICAgIGlucHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElOUFVUKTsKLQotICAgICAgICBvdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoT1VUUFVUKTsKLQotICAgICAgICBmYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGQVVMVCk7Ci0KLSAgICAgICAgYmluZGluZ0lucHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkdfSU5QVVQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdJbnB1dEVDbGFzcywgQklORElOR19JTlBVVF9fTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ0lucHV0RUNsYXNzLCBCSU5ESU5HX0lOUFVUX19FSU5QVVQpOwotCi0gICAgICAgIGJpbmRpbmdPdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQklORElOR19PVVRQVVQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIEJJTkRJTkdfT1VUUFVUX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShiaW5kaW5nT3V0cHV0RUNsYXNzLCBCSU5ESU5HX09VVFBVVF9fRU9VVFBVVCk7Ci0KLSAgICAgICAgYmluZGluZ0ZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEJJTkRJTkdfRkFVTFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGJpbmRpbmdGYXVsdEVDbGFzcywgQklORElOR19GQVVMVF9fTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoYmluZGluZ0ZhdWx0RUNsYXNzLCBCSU5ESU5HX0ZBVUxUX19FRkFVTFQpOwotCi0gICAgICAgIG5hbWVzcGFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG5hbWVzcGFjZUVDbGFzcywgTkFNRVNQQUNFX19VUkkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG5hbWVzcGFjZUVDbGFzcywgTkFNRVNQQUNFX19QUkVGSVgpOwotCi0gICAgICAgIGlQb3J0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJUE9SVF9UWVBFKTsKLQotICAgICAgICBpT3BlcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElPUEVSQVRJT04pOwotCi0gICAgICAgIGlJbnB1dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJSU5QVVQpOwotCi0gICAgICAgIGlPdXRwdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU9VVFBVVCk7Ci0KLSAgICAgICAgaUZhdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElGQVVMVCk7Ci0KLSAgICAgICAgaU1lc3NhZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU1FU1NBR0UpOwotCi0gICAgICAgIGlQYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElQQVJUKTsKLQotICAgICAgICBpU2VydmljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJU0VSVklDRSk7Ci0KLSAgICAgICAgaVBvcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVBPUlQpOwotCi0gICAgICAgIGlCaW5kaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKElCSU5ESU5HKTsKLQotICAgICAgICBpQmluZGluZ09wZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQklORElOR19PUEVSQVRJT04pOwotCi0gICAgICAgIGlCaW5kaW5nSW5wdXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUJJTkRJTkdfSU5QVVQpOwotCi0gICAgICAgIGlCaW5kaW5nT3V0cHV0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElCSU5ESU5HX09VVFBVVCk7Ci0KLSAgICAgICAgaUJpbmRpbmdGYXVsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJQklORElOR19GQVVMVCk7Ci0KLSAgICAgICAgaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElFWFRFTlNJQklMSVRZX0VMRU1FTlQpOwotCi0gICAgICAgIGlEZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKElERUZJTklUSU9OKTsKLQotICAgICAgICBpSW1wb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElJTVBPUlQpOwotCi0gICAgICAgIGlMaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKElMSVNUKTsKLQotICAgICAgICBpTWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKElNQVApOwotCi0gICAgICAgIGl1cmxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVVSTCk7Ci0KLSAgICAgICAgaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKElFWFRFTlNJT05fUkVHSVNUUlkpOwotCi0gICAgICAgIHR5cGVzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEVTKTsKLQotICAgICAgICBpSXRlcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUlURVJBVE9SKTsKLQotICAgICAgICBpVHlwZXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVRZUEVTKTsKLQotICAgICAgICB1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQpOwotICAgICAgICBjcmVhdGVFUmVmZXJlbmNlKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0NISUxEUkVOKTsKLQotICAgICAgICB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UoeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIFhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUEpOwotCi0gICAgICAgIG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9SRUZFUkVOQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VSZWZlcmVuY2VFQ2xhc3MsIE1FU1NBR0VfUkVGRVJFTkNFX19OQU1FKTsKLSAgICAgICAgY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlUmVmZXJlbmNlRUNsYXNzLCBNRVNTQUdFX1JFRkVSRU5DRV9fRU1FU1NBR0UpOwotCi0gICAgICAgIC8vIENyZWF0ZSBkYXRhIHR5cGVzCi0gICAgICAgIHFOYW1lRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFFOQU1FKTsKLSAgICAgICAgb3BlcmF0aW9uVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShPUEVSQVRJT05fVFlQRSk7Ci0gICAgICAgIGRvbUVsZW1lbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9NX0VMRU1FTlQpOwotICAgICAgICB3c2RsRXhjZXB0aW9uRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFdTRExfRVhDRVBUSU9OKTsKLSAgICAgICAgZG9tRG9jdW1lbnRFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRE9NX0RPQ1VNRU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLSAgICAgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotICAgIHsKLSAgICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLSAgICAgICAgaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0gICAgICAgIHNldE5hbWUoZU5BTUUpOwotICAgICAgICBzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLSAgICAgICAgc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotICAgICAgICBYU0RQYWNrYWdlSW1wbCB0aGVYU0RQYWNrYWdlID0gKFhTRFBhY2thZ2VJbXBsKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYU0RQYWNrYWdlLmVOU19VUkkpOwotCi0gICAgICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLSAgICAgICAgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMRWxlbWVudCgpKTsKLSAgICAgICAgcG9ydFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJUG9ydFR5cGUoKSk7Ci0gICAgICAgIG9wZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBvcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJT3BlcmF0aW9uKCkpOwotICAgICAgICBtZXNzYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gICAgICAgIG1lc3NhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJTWVzc2FnZSgpKTsKLSAgICAgICAgcGFydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBwYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SVBhcnQoKSk7Ci0gICAgICAgIGJpbmRpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nKCkpOwotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKSk7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpKTsKLSAgICAgICAgc2VydmljZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2libGVFbGVtZW50KCkpOwotICAgICAgICBzZXJ2aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SVNlcnZpY2UoKSk7Ci0gICAgICAgIHBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElQb3J0KCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElFeHRlbnNpYmlsaXR5RWxlbWVudCgpKTsKLSAgICAgICAgZGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2libGVFbGVtZW50KCkpOwotICAgICAgICBkZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SURlZmluaXRpb24oKSk7Ci0gICAgICAgIGltcG9ydEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBpbXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSW1wb3J0KCkpOwotICAgICAgICBleHRlbnNpYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBpbnB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1lc3NhZ2VSZWZlcmVuY2UoKSk7Ci0gICAgICAgIGlucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0gICAgICAgIGlucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUlucHV0KCkpOwotICAgICAgICBvdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotICAgICAgICBvdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXU0RMRWxlbWVudCgpKTsKLSAgICAgICAgb3V0cHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SU91dHB1dCgpKTsKLSAgICAgICAgZmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXNzYWdlUmVmZXJlbmNlKCkpOwotICAgICAgICBmYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTRExFbGVtZW50KCkpOwotICAgICAgICBmYXVsdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElGYXVsdCgpKTsKLSAgICAgICAgYmluZGluZ0lucHV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXh0ZW5zaWJsZUVsZW1lbnQoKSk7Ci0gICAgICAgIGJpbmRpbmdJbnB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nSW5wdXQoKSk7Ci0gICAgICAgIGJpbmRpbmdPdXRwdXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ091dHB1dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElCaW5kaW5nT3V0cHV0KCkpOwotICAgICAgICBiaW5kaW5nRmF1bHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgYmluZGluZ0ZhdWx0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SUJpbmRpbmdGYXVsdCgpKTsKLSAgICAgICAgdHlwZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFeHRlbnNpYmxlRWxlbWVudCgpKTsKLSAgICAgICAgdHlwZXNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJVHlwZXMoKSk7Ci0gICAgICAgIHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgICAgICB4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgICAgICBtZXNzYWdlUmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V1NETEVsZW1lbnQoKSk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLSAgICAgICAgaW5pdEVDbGFzcyh3c2RsRWxlbWVudEVDbGFzcywgV1NETEVsZW1lbnQuY2xhc3MsICJXU0RMRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMRWxlbWVudF9Eb2N1bWVudGF0aW9uRWxlbWVudCgpLCB0aGlzLmdldERPTUVsZW1lbnQoKSwgImRvY3VtZW50YXRpb25FbGVtZW50IiwgbnVsbCwgMCwgMSwgV1NETEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTRExFbGVtZW50X0VsZW1lbnQoKSwgdGhpcy5nZXRET01FbGVtZW50KCksICJlbGVtZW50IiwgbnVsbCwgMCwgMSwgV1NETEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbih3c2RsRWxlbWVudEVDbGFzcywgdGhpcy5nZXREZWZpbml0aW9uKCksICJnZXRFbmNsb3NpbmdEZWZpbml0aW9uIik7Ci0KLSAgICAgICAgRU9wZXJhdGlvbiBvcCA9IGFkZEVPcGVyYXRpb24od3NkbEVsZW1lbnRFQ2xhc3MsIG51bGwsICJzZXRFbmNsb3NpbmdEZWZpbml0aW9uIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0RGVmaW5pdGlvbigpLCAiZGVmaW5pdGlvbiIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MocG9ydFR5cGVFQ2xhc3MsIFBvcnRUeXBlLmNsYXNzLCAiUG9ydFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1FOYW1lKCksIHRoaXMuZ2V0UU5hbWUoKSwgInFOYW1lIiwgbnVsbCwgMCwgMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIFBvcnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0VHlwZV9Qcm94eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb3h5IiwgbnVsbCwgMCwgMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBvcnRUeXBlX1Jlc291cmNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZVVSSSIsIG51bGwsIDAsIDEsIFBvcnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQb3J0VHlwZV9FT3BlcmF0aW9ucygpLCB0aGlzLmdldE9wZXJhdGlvbigpLCBudWxsLCAiZU9wZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgUG9ydFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhvcGVyYXRpb25FQ2xhc3MsIE9wZXJhdGlvbi5jbGFzcywgIk9wZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0T3BlcmF0aW9uX1N0eWxlKCksIHRoaXMuZ2V0T3BlcmF0aW9uVHlwZSgpLCAic3R5bGUiLCBudWxsLCAwLCAxLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE9wZXJhdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRPcGVyYXRpb25fVW5kZWZpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5kZWZpbmVkIiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRPcGVyYXRpb25fUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0T3BlcmF0aW9uX1Jlc291cmNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZVVSSSIsIG51bGwsIDAsIDEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0T3BlcmF0aW9uX0VJbnB1dCgpLCB0aGlzLmdldElucHV0KCksIG51bGwsICJlSW5wdXQiLCBudWxsLCAwLCAxLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldE9wZXJhdGlvbl9FT3V0cHV0KCksIHRoaXMuZ2V0T3V0cHV0KCksIG51bGwsICJlT3V0cHV0IiwgbnVsbCwgMCwgMSwgT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRPcGVyYXRpb25fRUZhdWx0cygpLCB0aGlzLmdldEZhdWx0KCksIG51bGwsICJlRmF1bHRzIiwgbnVsbCwgMCwgLTEsIE9wZXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0T3BlcmF0aW9uX0VQYXJhbWV0ZXJPcmRlcmluZygpLCB0aGlzLmdldFBhcnQoKSwgbnVsbCwgImVQYXJhbWV0ZXJPcmRlcmluZyIsIG51bGwsIDAsIC0xLCBPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhtZXNzYWdlRUNsYXNzLCBNZXNzYWdlLmNsYXNzLCAiTWVzc2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9RTmFtZSgpLCB0aGlzLmdldFFOYW1lKCksICJxTmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VfVW5kZWZpbmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5kZWZpbmVkIiwgbnVsbCwgMCwgMSwgTWVzc2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9Qcm94eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInByb3h5IiwgbnVsbCwgMCwgMSwgTWVzc2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZV9SZXNvdXJjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VVUkkiLCBudWxsLCAwLCAxLCBNZXNzYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlX0VQYXJ0cygpLCB0aGlzLmdldFBhcnQoKSwgbnVsbCwgImVQYXJ0cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MocGFydEVDbGFzcywgUGFydC5jbGFzcywgIlBhcnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBhcnRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFBhcnRfRWxlbWVudE5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAiZWxlbWVudE5hbWUiLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQYXJ0X1R5cGVOYW1lKCksIHRoaXMuZ2V0UU5hbWUoKSwgInR5cGVOYW1lIiwgbnVsbCwgMCwgMSwgUGFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0UGFydF9UeXBlRGVmaW5pdGlvbigpLCB0aGVYU0RQYWNrYWdlLmdldFhTRFR5cGVEZWZpbml0aW9uKCksIG51bGwsICJ0eXBlRGVmaW5pdGlvbiIsIG51bGwsIDAsIDEsIFBhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFBhcnRfRWxlbWVudERlY2xhcmF0aW9uKCksIHRoZVhTRFBhY2thZ2UuZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCksIG51bGwsICJlbGVtZW50RGVjbGFyYXRpb24iLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQYXJ0X0VNZXNzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZSgpLCBudWxsLCAiZU1lc3NhZ2UiLCBudWxsLCAwLCAxLCBQYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoYmluZGluZ0VDbGFzcywgQmluZGluZy5jbGFzcywgIkJpbmRpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIEJpbmRpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIEJpbmRpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEJpbmRpbmdfUmVzb3VyY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVVJJIiwgbnVsbCwgMCwgMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ19FUG9ydFR5cGUoKSwgdGhpcy5nZXRQb3J0VHlwZSgpLCBudWxsLCAiZVBvcnRUeXBlIiwgbnVsbCwgMSwgMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ19FQmluZGluZ09wZXJhdGlvbnMoKSwgdGhpcy5nZXRCaW5kaW5nT3BlcmF0aW9uKCksIG51bGwsICJlQmluZGluZ09wZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgQmluZGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIEJpbmRpbmdPcGVyYXRpb24uY2xhc3MsICJCaW5kaW5nT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nT3BlcmF0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VPcGVyYXRpb24oKSwgdGhpcy5nZXRPcGVyYXRpb24oKSwgbnVsbCwgImVPcGVyYXRpb24iLCBudWxsLCAxLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nSW5wdXQoKSwgdGhpcy5nZXRCaW5kaW5nSW5wdXQoKSwgbnVsbCwgImVCaW5kaW5nSW5wdXQiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nT3V0cHV0KCksIHRoaXMuZ2V0QmluZGluZ091dHB1dCgpLCBudWxsLCAiZUJpbmRpbmdPdXRwdXQiLCBudWxsLCAwLCAxLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRCaW5kaW5nT3BlcmF0aW9uX0VCaW5kaW5nRmF1bHRzKCksIHRoaXMuZ2V0QmluZGluZ0ZhdWx0KCksIG51bGwsICJlQmluZGluZ0ZhdWx0cyIsIG51bGwsIDAsIC0xLCBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3Moc2VydmljZUVDbGFzcywgU2VydmljZS5jbGFzcywgIlNlcnZpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlX1VuZGVmaW5lZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInVuZGVmaW5lZCIsIG51bGwsIDAsIDEsIFNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUHJveHkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJwcm94eSIsIG51bGwsIDAsIDEsIFNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VfUmVzb3VyY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlVVJJIiwgbnVsbCwgMCwgMSwgU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZV9FUG9ydHMoKSwgdGhpcy5nZXRQb3J0KCksIG51bGwsICJlUG9ydHMiLCBudWxsLCAwLCAtMSwgU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHBvcnRFQ2xhc3MsIFBvcnQuY2xhc3MsICJQb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRQb3J0X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRQb3J0X0VCaW5kaW5nKCksIHRoaXMuZ2V0QmluZGluZygpLCBudWxsLCAiZUJpbmRpbmciLCBudWxsLCAxLCAxLCBQb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZXh0ZW5zaWJpbGl0eUVsZW1lbnRFQ2xhc3MsIEV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAiRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEV4dGVuc2liaWxpdHlFbGVtZW50X1JlcXVpcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRfRWxlbWVudFR5cGUoKSwgdGhpcy5nZXRRTmFtZSgpLCAiZWxlbWVudFR5cGUiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZGVmaW5pdGlvbkVDbGFzcywgRGVmaW5pdGlvbi5jbGFzcywgIkRlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldERlZmluaXRpb25fVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXREZWZpbml0aW9uX0xvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhdGlvbiIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldERlZmluaXRpb25fUU5hbWUoKSwgdGhpcy5nZXRRTmFtZSgpLCAicU5hbWUiLCBudWxsLCAwLCAxLCBEZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXREZWZpbml0aW9uX0VuY29kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlbmNvZGluZyIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRU1lc3NhZ2VzKCksIHRoaXMuZ2V0TWVzc2FnZSgpLCBudWxsLCAiZU1lc3NhZ2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVBvcnRUeXBlcygpLCB0aGlzLmdldFBvcnRUeXBlKCksIG51bGwsICJlUG9ydFR5cGVzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRUJpbmRpbmdzKCksIHRoaXMuZ2V0QmluZGluZygpLCBudWxsLCAiZUJpbmRpbmdzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVNlcnZpY2VzKCksIHRoaXMuZ2V0U2VydmljZSgpLCBudWxsLCAiZVNlcnZpY2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRU5hbWVzcGFjZXMoKSwgdGhpcy5nZXROYW1lc3BhY2UoKSwgbnVsbCwgImVOYW1lc3BhY2VzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRVR5cGVzKCksIHRoaXMuZ2V0VHlwZXMoKSwgbnVsbCwgImVUeXBlcyIsIG51bGwsIDAsIDEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldERlZmluaXRpb25fRUltcG9ydHMoKSwgdGhpcy5nZXRJbXBvcnQoKSwgbnVsbCwgImVJbXBvcnRzIiwgbnVsbCwgMCwgLTEsIERlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihkZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldERPTURvY3VtZW50KCksICJnZXREb2N1bWVudCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihkZWZpbml0aW9uRUNsYXNzLCBudWxsLCAic2V0RG9jdW1lbnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRET01Eb2N1bWVudCgpLCAiZG9jdW1lbnQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGltcG9ydEVDbGFzcywgSW1wb3J0LmNsYXNzLCAiSW1wb3J0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRJbXBvcnRfTmFtZXNwYWNlVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiLCBudWxsLCAwLCAxLCBJbXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEltcG9ydF9Mb2NhdGlvblVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb25VUkkiLCBudWxsLCAwLCAxLCBJbXBvcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEltcG9ydF9FRGVmaW5pdGlvbigpLCB0aGlzLmdldERlZmluaXRpb24oKSwgbnVsbCwgImVEZWZpbml0aW9uIiwgbnVsbCwgMCwgMSwgSW1wb3J0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRJbXBvcnRfRVNjaGVtYSgpLCB0aGVYU0RQYWNrYWdlLmdldFhTRFNjaGVtYSgpLCBudWxsLCAiZVNjaGVtYSIsIG51bGwsIDAsIDEsIEltcG9ydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGltcG9ydEVDbGFzcywgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgImdldFNjaGVtYSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpbXBvcnRFQ2xhc3MsIG51bGwsICJzZXRTY2hlbWEiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgInNjaGVtYSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIEV4dGVuc2libGVFbGVtZW50LmNsYXNzLCAiRXh0ZW5zaWJsZUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0RXh0ZW5zaWJsZUVsZW1lbnRfRUV4dGVuc2liaWxpdHlFbGVtZW50cygpLCB0aGlzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50KCksIG51bGwsICJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEV4dGVuc2libGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oZXh0ZW5zaWJsZUVsZW1lbnRFQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldEV4dGVuc2liaWxpdHlFbGVtZW50cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihleHRlbnNpYmxlRWxlbWVudEVDbGFzcywgbnVsbCwgImFkZEV4dGVuc2liaWxpdHlFbGVtZW50Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUV4dGVuc2liaWxpdHlFbGVtZW50KCksICJleHRFbGVtZW50Iik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpbnB1dEVDbGFzcywgSW5wdXQuY2xhc3MsICJJbnB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKG91dHB1dEVDbGFzcywgT3V0cHV0LmNsYXNzLCAiT3V0cHV0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoZmF1bHRFQ2xhc3MsIEZhdWx0LmNsYXNzLCAiRmF1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhiaW5kaW5nSW5wdXRFQ2xhc3MsIEJpbmRpbmdJbnB1dC5jbGFzcywgIkJpbmRpbmdJbnB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QmluZGluZ0lucHV0X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBCaW5kaW5nSW5wdXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFUmVmZXJlbmNlKGdldEJpbmRpbmdJbnB1dF9FSW5wdXQoKSwgdGhpcy5nZXRJbnB1dCgpLCBudWxsLCAiZUlucHV0IiwgbnVsbCwgMSwgMSwgQmluZGluZ0lucHV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oYmluZGluZ0lucHV0RUNsYXNzLCB0aGlzLmdldElJbnB1dCgpLCAiZ2V0SW5wdXQiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oYmluZGluZ0lucHV0RUNsYXNzLCBudWxsLCAic2V0SW5wdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJSW5wdXQoKSwgImlucHV0Iik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhiaW5kaW5nT3V0cHV0RUNsYXNzLCBCaW5kaW5nT3V0cHV0LmNsYXNzLCAiQmluZGluZ091dHB1dCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QmluZGluZ091dHB1dF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQmluZGluZ091dHB1dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ091dHB1dF9FT3V0cHV0KCksIHRoaXMuZ2V0T3V0cHV0KCksIG51bGwsICJlT3V0cHV0IiwgbnVsbCwgMSwgMSwgQmluZGluZ091dHB1dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIHRoaXMuZ2V0SU91dHB1dCgpLCAiZ2V0T3V0cHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGJpbmRpbmdPdXRwdXRFQ2xhc3MsIG51bGwsICJzZXRPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3V0cHV0KCksICJvdXRwdXQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGJpbmRpbmdGYXVsdEVDbGFzcywgQmluZGluZ0ZhdWx0LmNsYXNzLCAiQmluZGluZ0ZhdWx0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRCaW5kaW5nRmF1bHRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEJpbmRpbmdGYXVsdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0QmluZGluZ0ZhdWx0X0VGYXVsdCgpLCB0aGlzLmdldEZhdWx0KCksIG51bGwsICJlRmF1bHQiLCBudWxsLCAxLCAxLCBCaW5kaW5nRmF1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihiaW5kaW5nRmF1bHRFQ2xhc3MsIHRoaXMuZ2V0SUZhdWx0KCksICJnZXRGYXVsdCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihiaW5kaW5nRmF1bHRFQ2xhc3MsIG51bGwsICJzZXRGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElGYXVsdCgpLCAiZmF1bHQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKG5hbWVzcGFjZUVDbGFzcywgTmFtZXNwYWNlLmNsYXNzLCAiTmFtZXNwYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXROYW1lc3BhY2VfVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJVUkkiLCBudWxsLCAwLCAxLCBOYW1lc3BhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldE5hbWVzcGFjZV9QcmVmaXgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByZWZpeCIsIG51bGwsIDAsIDEsIE5hbWVzcGFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlQb3J0VHlwZUVDbGFzcywgamF2YXgud3NkbC5Qb3J0VHlwZS5jbGFzcywgIklQb3J0VHlwZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpUG9ydFR5cGVFQ2xhc3MsIG51bGwsICJhZGRPcGVyYXRpb24iKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3BlcmF0aW9uKCksICJvcGVyYXRpb24iKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVBvcnRUeXBlRUNsYXNzLCB0aGlzLmdldElPcGVyYXRpb24oKSwgImdldE9wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5wdXROYW1lIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvdXRwdXROYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpUG9ydFR5cGVFQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldE9wZXJhdGlvbnMiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlPcGVyYXRpb25FQ2xhc3MsIGphdmF4LndzZGwuT3BlcmF0aW9uLmNsYXNzLCAiSU9wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpT3BlcmF0aW9uRUNsYXNzLCBudWxsLCAiYWRkRmF1bHQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJRmF1bHQoKSwgImZhdWx0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUZhdWx0KCksICJnZXRGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaU9wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRGYXVsdHMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUxpc3QoKSwgImdldFBhcmFtZXRlck9yZGVyaW5nIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRQYXJhbWV0ZXJPcmRlcmluZyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElMaXN0KCksICJwYXJhbWV0ZXJPcmRlciIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaU9wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJSW5wdXQoKSwgImdldElucHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRJbnB1dCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElJbnB1dCgpLCAiaW5wdXQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SU91dHB1dCgpLCAiZ2V0T3V0cHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPcGVyYXRpb25FQ2xhc3MsIG51bGwsICJzZXRPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJT3V0cHV0KCksICJvdXRwdXQiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlJbnB1dEVDbGFzcywgamF2YXgud3NkbC5JbnB1dC5jbGFzcywgIklJbnB1dCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUlucHV0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlJbnB1dEVDbGFzcywgbnVsbCwgInNldE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU91dHB1dEVDbGFzcywgamF2YXgud3NkbC5PdXRwdXQuY2xhc3MsICJJT3V0cHV0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpT3V0cHV0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlPdXRwdXRFQ2xhc3MsIG51bGwsICJzZXRNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SU1lc3NhZ2UoKSwgIm1lc3NhZ2UiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlGYXVsdEVDbGFzcywgamF2YXgud3NkbC5GYXVsdC5jbGFzcywgIklGYXVsdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUZhdWx0RUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlGYXVsdEVDbGFzcywgbnVsbCwgInNldE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU1lc3NhZ2VFQ2xhc3MsIGphdmF4LndzZGwuTWVzc2FnZS5jbGFzcywgIklNZXNzYWdlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlNZXNzYWdlRUNsYXNzLCBudWxsLCAiYWRkUGFydCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQYXJ0KCksICJwYXJ0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlNZXNzYWdlRUNsYXNzLCB0aGlzLmdldElQYXJ0KCksICJnZXRQYXJ0Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpTWVzc2FnZUVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRQYXJ0cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpTWVzc2FnZUVDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0T3JkZXJlZFBhcnRzIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUxpc3QoKSwgInBhcnRPcmRlciIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaVBhcnRFQ2xhc3MsIGphdmF4LndzZGwuUGFydC5jbGFzcywgIklQYXJ0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlQYXJ0RUNsYXNzLCBudWxsLCAic2V0RXh0ZW5zaW9uQXR0cmlidXRlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRRTmFtZSgpLCAidmFsdWUiKTsKLSAgICAgICAgYWRkRUV4Y2VwdGlvbihvcCwgdGhpcy5nZXRXU0RMRXhjZXB0aW9uKCkpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVBhcnRFQ2xhc3MsIHRoaXMuZ2V0SUl0ZXJhdG9yKCksICJnZXRFeHRlbnNpb25BdHRyaWJ1dGVOYW1lcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpUGFydEVDbGFzcywgdGhpcy5nZXRRTmFtZSgpLCAiZ2V0RXh0ZW5zaW9uQXR0cmlidXRlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlTZXJ2aWNlRUNsYXNzLCBqYXZheC53c2RsLlNlcnZpY2UuY2xhc3MsICJJU2VydmljZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpU2VydmljZUVDbGFzcywgbnVsbCwgImFkZFBvcnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJUG9ydCgpLCAicG9ydCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVNlcnZpY2VFQ2xhc3MsIHRoaXMuZ2V0SU1hcCgpLCAiZ2V0UG9ydHMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVNlcnZpY2VFQ2xhc3MsIHRoaXMuZ2V0SVBvcnQoKSwgImdldFBvcnQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlQb3J0RUNsYXNzLCBqYXZheC53c2RsLlBvcnQuY2xhc3MsICJJUG9ydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaVBvcnRFQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmcoKSwgImdldEJpbmRpbmciKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaVBvcnRFQ2xhc3MsIG51bGwsICJzZXRCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUJpbmRpbmcoKSwgImJpbmRpbmciKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nRUNsYXNzLCBqYXZheC53c2RsLkJpbmRpbmcuY2xhc3MsICJJQmluZGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgbnVsbCwgImFkZEJpbmRpbmdPcGVyYXRpb24iKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpLCAiYmluZGluZ09wZXJhdGlvbiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgdGhpcy5nZXRJQmluZGluZ09wZXJhdGlvbigpLCAiZ2V0QmluZGluZ09wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5wdXROYW1lIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvdXRwdXROYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpQmluZGluZ0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0QmluZGluZ09wZXJhdGlvbnMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nRUNsYXNzLCB0aGlzLmdldElQb3J0VHlwZSgpLCAiZ2V0UG9ydFR5cGUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaUJpbmRpbmdFQ2xhc3MsIG51bGwsICJzZXRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQb3J0VHlwZSgpLCAicG9ydFR5cGUiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24uY2xhc3MsICJJQmluZGluZ09wZXJhdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgImFkZEJpbmRpbmdGYXVsdCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElCaW5kaW5nRmF1bHQoKSwgImJpbmRpbmdGYXVsdCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ0ZhdWx0KCksICJnZXRCaW5kaW5nRmF1bHQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldEJpbmRpbmdGYXVsdHMiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCB0aGlzLmdldElPcGVyYXRpb24oKSwgImdldE9wZXJhdGlvbiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgInNldE9wZXJhdGlvbiIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElPcGVyYXRpb24oKSwgIm9wZXJhdGlvbiIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaUJpbmRpbmdPcGVyYXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiZ2V0QmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlCaW5kaW5nT3BlcmF0aW9uRUNsYXNzLCBudWxsLCAic2V0QmluZGluZ0lucHV0Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiYmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiZ2V0QmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpQmluZGluZ09wZXJhdGlvbkVDbGFzcywgbnVsbCwgInNldEJpbmRpbmdPdXRwdXQiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiYmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUJpbmRpbmdJbnB1dEVDbGFzcywgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQuY2xhc3MsICJJQmluZGluZ0lucHV0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpQmluZGluZ091dHB1dEVDbGFzcywgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0LmNsYXNzLCAiSUJpbmRpbmdPdXRwdXQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlCaW5kaW5nRmF1bHRFQ2xhc3MsIGphdmF4LndzZGwuQmluZGluZ0ZhdWx0LmNsYXNzLCAiSUJpbmRpbmdGYXVsdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQuY2xhc3MsICJJRXh0ZW5zaWJpbGl0eUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlEZWZpbml0aW9uRUNsYXNzLCBqYXZheC53c2RsLkRlZmluaXRpb24uY2xhc3MsICJJRGVmaW5pdGlvbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZEJpbmRpbmciKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJQmluZGluZygpLCAiYmluZGluZyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZEltcG9ydCIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElJbXBvcnQoKSwgImltcG9ydERlZiIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZE1lc3NhZ2UiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJTWVzc2FnZSgpLCAibWVzc2FnZSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgImFkZE5hbWVzcGFjZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJlZml4Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2VVUkkiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJhZGRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElQb3J0VHlwZSgpLCAicG9ydFR5cGUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJhZGRTZXJ2aWNlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SVNlcnZpY2UoKSwgInNlcnZpY2UiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nRmF1bHQoKSwgImNyZWF0ZUJpbmRpbmdGYXVsdCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdJbnB1dCgpLCAiY3JlYXRlQmluZGluZ0lucHV0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZ091dHB1dCgpLCAiY3JlYXRlQmluZGluZ091dHB1dCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUJpbmRpbmdPcGVyYXRpb24oKSwgImNyZWF0ZUJpbmRpbmdPcGVyYXRpb24iKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nKCksICJjcmVhdGVCaW5kaW5nIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJRmF1bHQoKSwgImNyZWF0ZUZhdWx0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJSW1wb3J0KCksICJjcmVhdGVJbXBvcnQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElJbnB1dCgpLCAiY3JlYXRlSW5wdXQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJjcmVhdGVNZXNzYWdlIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJT3BlcmF0aW9uKCksICJjcmVhdGVPcGVyYXRpb24iKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElPdXRwdXQoKSwgImNyZWF0ZU91dHB1dCIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBhcnQoKSwgImNyZWF0ZVBhcnQiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElQb3J0KCksICJjcmVhdGVQb3J0Iik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJUG9ydFR5cGUoKSwgImNyZWF0ZVBvcnRUeXBlIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAiY3JlYXRlU2VydmljZSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJQmluZGluZygpLCAiZ2V0QmluZGluZyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRCaW5kaW5ncyIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SU1hcCgpLCAiZ2V0SW1wb3J0cyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0SW1wb3J0cyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJnZXRNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldE1lc3NhZ2VzIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0TmFtZXNwYWNlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwcmVmaXgiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNYXAoKSwgImdldE5hbWVzcGFjZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBvcnRUeXBlKCksICJnZXRQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRQb3J0VHlwZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRQcmVmaXgiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAiZ2V0U2VydmljZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJTWFwKCksICJnZXRTZXJ2aWNlcyIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCksICJnZXRFeHRlbnNpb25SZWdpc3RyeSIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgbnVsbCwgInNldEV4dGVuc2lvblJlZ2lzdHJ5Iik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SUV4dGVuc2lvblJlZ2lzdHJ5KCksICJleHRlbnNpb25SZWdpc3RyeSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXREb2N1bWVudEJhc2VVUkkiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJzZXREb2N1bWVudEJhc2VVUkkiKTsKLSAgICAgICAgYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRvY3VtZW50QmFzZSIpOwotCi0gICAgICAgIGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVR5cGVzKCksICJjcmVhdGVUeXBlcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbihpRGVmaW5pdGlvbkVDbGFzcywgdGhpcy5nZXRJU2VydmljZSgpLCAicmVtb3ZlU2VydmljZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElCaW5kaW5nKCksICJyZW1vdmVCaW5kaW5nIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIHRoaXMuZ2V0SVBvcnRUeXBlKCksICJyZW1vdmVQb3J0VHlwZSIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldFFOYW1lKCksICJuYW1lIik7Ci0KLSAgICAgICAgb3AgPSBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElNZXNzYWdlKCksICJyZW1vdmVNZXNzYWdlIik7Ci0gICAgICAgIGFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0UU5hbWUoKSwgIm5hbWUiKTsKLQotICAgICAgICBhZGRFT3BlcmF0aW9uKGlEZWZpbml0aW9uRUNsYXNzLCB0aGlzLmdldElUeXBlcygpLCAiZ2V0VHlwZXMiKTsKLQotICAgICAgICBvcCA9IGFkZEVPcGVyYXRpb24oaURlZmluaXRpb25FQ2xhc3MsIG51bGwsICJzZXRUeXBlcyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldElUeXBlcygpLCAidHlwZXMiKTsKLQotICAgICAgICBpbml0RUNsYXNzKGlJbXBvcnRFQ2xhc3MsIGphdmF4LndzZGwuSW1wb3J0LmNsYXNzLCAiSUltcG9ydCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUxpc3RFQ2xhc3MsIExpc3QuY2xhc3MsICJJTGlzdCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaU1hcEVDbGFzcywgTWFwLmNsYXNzLCAiSU1hcCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaXVybEVDbGFzcywgVVJMLmNsYXNzLCAiSVVSTCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoaUV4dGVuc2lvblJlZ2lzdHJ5RUNsYXNzLCBFeHRlbnNpb25SZWdpc3RyeS5jbGFzcywgIklFeHRlbnNpb25SZWdpc3RyeSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIGluaXRFQ2xhc3ModHlwZXNFQ2xhc3MsIFR5cGVzLmNsYXNzLCAiVHlwZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgYWRkRU9wZXJhdGlvbih0eXBlc0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0U2NoZW1hcyIpOwotCi0gICAgICAgIG9wID0gYWRkRU9wZXJhdGlvbih0eXBlc0VDbGFzcywgdGhpcy5nZXRJTGlzdCgpLCAiZ2V0U2NoZW1hcyIpOwotICAgICAgICBhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIik7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpSXRlcmF0b3JFQ2xhc3MsIEl0ZXJhdG9yLmNsYXNzLCAiSUl0ZXJhdG9yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhpVHlwZXNFQ2xhc3MsIGphdmF4LndzZGwuVHlwZXMuY2xhc3MsICJJVHlwZXMiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICBpbml0RUNsYXNzKHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEVDbGFzcywgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAiVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRfQ2hpbGRyZW4oKSwgdGhpcy5nZXRVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSwgbnVsbCwgImNoaWxkcmVuIiwgbnVsbCwgMCwgLTEsIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICBpbml0RUNsYXNzKHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50RUNsYXNzLCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudC5jbGFzcywgIlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RVJlZmVyZW5jZShnZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKSwgdGhlWFNEUGFja2FnZS5nZXRYU0RTY2hlbWEoKSwgbnVsbCwgInNjaGVtYSIsIG51bGwsIDAsIDEsIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MobWVzc2FnZVJlZmVyZW5jZUVDbGFzcywgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIk1lc3NhZ2VSZWZlcmVuY2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZVJlZmVyZW5jZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZVJlZmVyZW5jZV9FTWVzc2FnZSgpLCB0aGlzLmdldE1lc3NhZ2UoKSwgbnVsbCwgImVNZXNzYWdlIiwgbnVsbCwgMSwgMSwgTWVzc2FnZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLSAgICAgICAgaW5pdEVEYXRhVHlwZShxTmFtZUVEYXRhVHlwZSwgUU5hbWUuY2xhc3MsICJRTmFtZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUob3BlcmF0aW9uVHlwZUVEYXRhVHlwZSwgT3BlcmF0aW9uVHlwZS5jbGFzcywgIk9wZXJhdGlvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RURhdGFUeXBlKGRvbUVsZW1lbnRFRGF0YVR5cGUsIEVsZW1lbnQuY2xhc3MsICJET01FbGVtZW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVEYXRhVHlwZSh3c2RsRXhjZXB0aW9uRURhdGFUeXBlLCBXU0RMRXhjZXB0aW9uLmNsYXNzLCAiV1NETEV4Y2VwdGlvbiIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUoZG9tRG9jdW1lbnRFRGF0YVR5cGUsIERvY3VtZW50LmNsYXNzLCAiRE9NRG9jdW1lbnQiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0gICAgICAgIC8vIENyZWF0ZSByZXNvdXJjZQotICAgICAgICBjcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLSAgICB9Ci0KLX0gLy9XU0RMUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmNzIxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS53c2RsLmltcGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBzZWUgI2dldFNjaGVtYSgpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICogQG9yZGVyZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hID0gbnVsbDsKLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgWFNEU2NoZW1hIGdldFNjaGVtYSgpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTY2hlbWEoWFNEU2NoZW1hIG5ld1NjaGVtYSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLSAgewotICAgIFhTRFNjaGVtYSBvbGRTY2hlbWEgPSBzY2hlbWE7Ci0gICAgc2NoZW1hID0gbmV3U2NoZW1hOwotICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSwgb2xkU2NoZW1hLCBuZXdTY2hlbWEpOwotICAgICAgaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gbXNnczsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFhTRFNjaGVtYSBuZXdTY2hlbWEpCi0gIHsKLSAgICBpZiAobmV3U2NoZW1hICE9IHNjaGVtYSkKLSAgICB7Ci0gICAgICBOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLSAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNjaGVtYSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUEsIG51bGwsIG1zZ3MpOwotICAgICAgaWYgKG5ld1NjaGVtYSAhPSBudWxsKQotICAgICAgICBtc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2NoZW1hKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQSwgbnVsbCwgbXNncyk7Ci0gICAgICBtc2dzID0gYmFzaWNTZXRTY2hlbWEobmV3U2NoZW1hLCBtc2dzKTsKLSAgICAgIGlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BLCBuZXdTY2hlbWEsIG5ld1NjaGVtYSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0gIHsKLSAgICBpZiAoZmVhdHVyZUlEID49IDApCi0gICAgewotICAgICAgc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19TQ0hFTUE6Ci0gICAgICAgICAgcmV0dXJuIGJhc2ljU2V0U2NoZW1hKG51bGwsIG1zZ3MpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50KCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UX1RZUEU6Ci0gICAgICAgIHJldHVybiBnZXRFbGVtZW50VHlwZSgpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICByZXR1cm4gZ2V0U2NoZW1hKCk7Ci0gICAgfQotICAgIHJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0gIH0KLQotICAvKioKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0gIHsKLSAgICBzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpCi0gICAgewotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fRE9DVU1FTlRBVElPTl9FTEVNRU5UOgotICAgICAgICBzZXREb2N1bWVudGF0aW9uRWxlbWVudCgoRWxlbWVudCluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoKEVsZW1lbnQpbmV3VmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19SRVFVSVJFRDoKLSAgICAgICAgc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoKFFOYW1lKW5ld1ZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICBzZXRTY2hlbWEoKFhTRFNjaGVtYSluZXdWYWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHNldERvY3VtZW50YXRpb25FbGVtZW50KERPQ1VNRU5UQVRJT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlQ6Ci0gICAgICAgIHNldEVsZW1lbnQoRUxFTUVOVF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1JFUVVJUkVEOgotICAgICAgICBzZXRSZXF1aXJlZChSRVFVSVJFRF9FREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgc2V0RWxlbWVudFR5cGUoRUxFTUVOVF9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fU0NIRU1BOgotICAgICAgICBzZXRTY2hlbWEoKFhTRFNjaGVtYSludWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLSAgfQotCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkKLSAgewotICAgIHN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkKLSAgICB7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19ET0NVTUVOVEFUSU9OX0VMRU1FTlQ6Ci0gICAgICAgIHJldHVybiBET0NVTUVOVEFUSU9OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGRvY3VtZW50YXRpb25FbGVtZW50ICE9IG51bGwgOiAhRE9DVU1FTlRBVElPTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyhkb2N1bWVudGF0aW9uRWxlbWVudCk7Ci0gICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UX19FTEVNRU5UOgotICAgICAgICByZXR1cm4gRUxFTUVOVF9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudCAhPSBudWxsIDogIUVMRU1FTlRfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnQpOwotICAgICAgY2FzZSBXU0RMUGFja2FnZS5YU0RfU0NIRU1BX0VYVEVOU0lCSUxJVFlfRUxFTUVOVF9fUkVRVUlSRUQ6Ci0gICAgICAgIHJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX0VMRU1FTlRfVFlQRToKLSAgICAgICAgcmV0dXJuIEVMRU1FTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWxlbWVudFR5cGUgIT0gbnVsbCA6ICFFTEVNRU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGVsZW1lbnRUeXBlKTsKLSAgICAgIGNhc2UgV1NETFBhY2thZ2UuWFNEX1NDSEVNQV9FWFRFTlNJQklMSVRZX0VMRU1FTlRfX1NDSEVNQToKLSAgICAgICAgcmV0dXJuIHNjaGVtYSAhPSBudWxsOwotICAgIH0KLSAgICByZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5pbXBsLldTRExFbGVtZW50SW1wbCNyZWNvbmNpbGUob3JnLnczYy5kb20uRWxlbWVudCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlY29uY2lsZShFbGVtZW50IGNoYW5nZWRFbGVtZW50KQotICB7Ci0gICAgZWxlbWVudCA9IGNoYW5nZWRFbGVtZW50OyAvLyBUaGlzIGxpbmUgbWF5IG5vdCBuZWVkZWQuICAgIAotICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgbmV3U2NoZW1hID0gWFNEU2NoZW1hSW1wbC5jcmVhdGVTY2hlbWEoY2hhbmdlZEVsZW1lbnQpOwotICAgICAgc2V0U2NoZW1hKG5ld1NjaGVtYSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFhTRFNjaGVtYSBjcmVhdGVTY2hlbWEoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKCJzY2hlbWEiKSAmJiBYU0RDb25zdGFudHMuaXNTY2hlbWFGb3JTY2hlbWFOYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgeyAgICAgCi0gICAgICBYU0RTY2hlbWEgeHNkU2NoZW1hID0gWFNERmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWFNEU2NoZW1hKCk7IAotICAgICAgeHNkU2NoZW1hLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZXR1cm4geHNkU2NoZW1hOyAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpCi0gIHsKLSAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgZWxzZSBpZiAoZ2V0U2NoZW1hKCkgIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQgPSBnZXRTY2hlbWEoKS5nZXRFbGVtZW50KCk7Ci0KLSAgICByZXR1cm4gZWxlbWVudDsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQpCi0gIHsKLSAgICBpZiAobmV3RWxlbWVudCA9PSBudWxsICYmICFpc1JlY29uY2lsaW5nKQotICAgIHsKLSAgICAgIGVsZW1lbnQgPSBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RWxlbWVudEdlbihuZXdFbGVtZW50KTsKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZCBOT1QKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLSAgICAgIGVsZW1lbnRUeXBlID0gbmV3IFFOYW1lKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSxYU0RDb25zdGFudHMuU0NIRU1BX0VMRU1FTlRfVEFHKTsKLQotICAgIHJldHVybiBlbGVtZW50VHlwZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkIE5PVAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGUoUU5hbWUgbmV3RWxlbWVudFR5cGUpCi0gIHsKLSAgICAvLyBTaG91bGQgbm90IGRvIGFueXRoaW5nLgotICB9ICAKLSAgCi0gIHB1YmxpYyB2b2lkIHJlY29uY2lsZUF0dHJpYnV0ZXMoRWxlbWVudCBjaGFuZ2VkRWxlbWVudCkKLSAgewotICAgIHN1cGVyLnJlY29uY2lsZUF0dHJpYnV0ZXMoY2hhbmdlZEVsZW1lbnQpOwotICB9Ci0gIAotICBwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KCkKLSAgewotICAJaWYgKHNjaGVtYSA9PSBudWxsKSAvLyBrYiBOb3RlOiBUaGlzIGNhc2UgaXMgbm90IHN1cHBvc2VkIHRvIGhhcHBlbi4KLSAgCXsgICAgIAotICAJICAvLyBjcyAuLi4gd2h5IGRvIHdlIGRvIHRoaXMgaWYgaXRzIG5vdCBzdXBwb3NlZCB0byBoYXBwZW4/Ci0gIAkgIC8vIElzIHRoZXJlIGEgc2NlbmFyaW8gd2hlcmUgdGhpcyBpcyBhIHVzZWZ1bGwgZmFsbGJhY2s/Ci0gIAkgIC8vIFVuZGVyIHdoYXQgY29uZGl0aW9ucyBkb2VzIHRoaXMgY29kZSBnZXQgZXhlY3V0ZWQgKGkuZS4gd2h5IHdvdWxkIHNjaGVtYSA9PSBudWxsKT8KLSAgICAgIHNjaGVtYSA9IFhTREZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhTRFNjaGVtYSgpOwotICAgICAgc2NoZW1hLnNldFNjaGVtYUZvclNjaGVtYVFOYW1lUHJlZml4KCJ4c2QiKTsKLSAgICAgIHNjaGVtYS5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly90ZW1wdXJpLm9yZy8iKTsKLSAgICAgIGphdmEudXRpbC5NYXAgcU5hbWVQcmVmaXhUb05hbWVzcGFjZU1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBxTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwLnB1dCgiIiwgc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICAgIHFOYW1lUHJlZml4VG9OYW1lc3BhY2VNYXAucHV0Ci0gICAgICAgIChzY2hlbWEuZ2V0U2NoZW1hRm9yU2NoZW1hUU5hbWVQcmVmaXgoKSxvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEpOwotICAgICAgYWRvcHQoc2NoZW1hKTsKLSAgICAgIHNjaGVtYS51cGRhdGVFbGVtZW50KHRydWUpOwotICAgICAgcmV0dXJuIHNjaGVtYS5nZXRFbGVtZW50KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChlbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAJYWRvcHQoc2NoZW1hKTsKLSAgICAgICAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbGVtZW50ID0gc2NoZW1hLmdldEVsZW1lbnQoKTsKLSAgICAgIHJldHVybiBlbGVtZW50OwotICAgIH0KLSAgfQotIAotICBwcml2YXRlIHZvaWQgYWRvcHQoWFNEU2NoZW1hIHhzZFNjaGVtYSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgaWYgKGRvY3VtZW50ID09IG51bGwpCi0gICAgICBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnVwZGF0ZURvY3VtZW50KCk7Ci0gICAgCi0gICAgaWYgKHhzZFNjaGVtYS5nZXREb2N1bWVudCgpICE9IG51bGwpCi0gICAgCXhzZFNjaGVtYS5zZXREb2N1bWVudChudWxsKTsKLSAgICAKLSAgICB4c2RTY2hlbWEuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotICB9Ci0gIAotICAvKgotICBwcml2YXRlIEVsZW1lbnQgYWRvcHQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpOwotICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgICByZXR1cm4gZWxlbWVudDsKLQotICAgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgZG9jdW1lbnQgPSAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS51cGRhdGVEb2N1bWVudCgpOwotICAgIAotICAgIHJldHVybiAoRWxlbWVudClkb2N1bWVudC5pbXBvcnROb2RlKGVsZW1lbnQsdHJ1ZSk7Ci0gIH0KLSAgKi8KLSAgCi0gIHByb3RlY3RlZCB2b2lkIGNoYW5nZUF0dHJpYnV0ZShFQXR0cmlidXRlIGVBdHRyaWJ1dGUpCi0gIHsKLQkgIGlmIChpc1JlY29uY2lsaW5nKQotCQkgIHJldHVybjsKLQkgIAotCSAgLy8gVE9ETy4uLiByZXZpc3QgdGhpcyBibG9jayBvZiBjb2RlCi0JICAvLwotCSAgaWYgKGVBdHRyaWJ1dGUgPT0gbnVsbCB8fCBlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudF9TY2hlbWEoKSkKLQkgIHsKLQkJICAvLyBXZSBnb3QgYSBuZXcgc2NoZW1hIHNvIHJlLXBhcmVudCBpdC4KLQkJICAvLyBjcy4uLiBhcmUgd2UgcmVhbGx5IGRvaW5nIHRoZSByaWdodCB0aGluZyBoZXJlPyAgdGhpcyBzZWVtcyBzdHJhbmdlCi0JCSAgaWYgKHNjaGVtYSAhPSBudWxsKQotCQkgIHsKLQkJCSAgaWYgKChzY2hlbWEuZ2V0RWxlbWVudCgpID09IG51bGwgJiYgZ2V0RWxlbWVudCgpID09IG51bGwpIHx8Ci0JCQkJCSAgKHNjaGVtYS5nZXRFbGVtZW50KCkgIT0gZ2V0RWxlbWVudCgpKSkKLQkJCSAgewkKLQkJCQkgIHNjaGVtYS5zZXREb2N1bWVudChudWxsKTsKLQkJCQkgIHNjaGVtYS5zZXRFbGVtZW50KG51bGwpOwotCQkJCSAgYWRvcHQoc2NoZW1hKTsKLQkJCQkgIHNjaGVtYS51cGRhdGVFbGVtZW50KCk7Ci0JCQkgIH0gIAotCQkgIH0KLQkgIH0gICAgCi0JICBlbHNlIGlmIChlQXR0cmlidXRlID09IFdTRExQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMRWxlbWVudF9FbGVtZW50KCkpCi0JICB7Ci0JCSAgc2V0U2NoZW1hKGNyZWF0ZVNjaGVtYShlbGVtZW50KSk7IC8vIGVsZW1lbnQgaXMgbm90IG51bGwKLQkgIH0gICAgCi0gIH0KLX0gLy9YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETEZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWJiMTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETEZhY3RvcnlJbXBsIGV4dGVuZHMgV1NETEZhY3RvcnkKLXsKLSAgCi0gIC8vcHVibGljIHN0YXRpYyBXU0RMRmFjdG9yeSBuZXdJbnN0YW5jZSgpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIC8vewotICAvLyAgcmV0dXJuIG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgLy99Ci0gIAotICBwdWJsaWMgV1NETEZhY3RvcnlJbXBsKCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgRGVmaW5pdGlvbiBuZXdEZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICB9Ci0gIAotICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkgbmV3UG9wdWxhdGVkRXh0ZW5zaW9uUmVnaXN0cnkoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLSAgCi0gIHB1YmxpYyBXU0RMUmVhZGVyIG5ld1dTRExSZWFkZXIoKQotICB7Ci0gICAgV1NETFJlYWRlciByZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwoKTsKLSAgICByZWFkZXIuc2V0RmFjdG9yeUltcGxOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gcmVhZGVyOwotICB9Ci0gIAotICBwdWJsaWMgV1NETFdyaXRlciBuZXdXU0RMV3JpdGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgV1NETFdyaXRlckltcGwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMUmVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL3dzZGw0ai9XU0RMUmVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM4ZDc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETFJlYWRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETExvY2F0b3I7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0RMUmVhZGVySW1wbCBpbXBsZW1lbnRzIFdTRExSZWFkZXIKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeUltcGxOYW1lOwotICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dFJlZzsKLSAgCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpCi0gIHsKLSAgICByZXR1cm4gZXh0UmVnOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBleHRSZWcpCi0gIHsKLSAgICB0aGlzLmV4dFJlZyA9IGV4dFJlZzsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZyBnZXRGYWN0b3J5SW1wbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGZhY3RvcnlJbXBsTmFtZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmFjdG9yeUltcGxOYW1lKFN0cmluZyBmYWN0b3J5SW1wbE5hbWUpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy5mYWN0b3J5SW1wbE5hbWUgPSBmYWN0b3J5SW1wbE5hbWU7Ci0gIH0KLQotICAKLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgbmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7IAotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZWFkIHRoZSBXU0RMIGRvY3VtZW50IGFjY2Vzc2libGUgdmlhIHRoZSBzcGVjaWZpZWQKLSAgICogVVJJIGludG8gYSBXU0RMIGRlZmluaXRpb24uCi0gICAqCi0gICAqIEBwYXJhbSB3c2RsVVJJIGEgVVJJIChjYW4gYmUgYSBmaWxlbmFtZSBvciBVUkwpIHBvaW50aW5nIHRvIGEKLSAgICogV1NETCBYTUwgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyB3c2RsVVJJKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgVVJJIHVyaTsgICAgCi0gICAgaWYgKGhhc1Byb3RvY29sKHdzZGxVUkkpKQotICAgICAgIHVyaSA9IFVSSS5jcmVhdGVVUkkod3NkbFVSSSk7Ci0gICAgZWxzZQotICAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHdzZGxVUkkpOwotICAKLSAgICAvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQsIGNyZWF0ZSBhIHdzZGwgcmVzb3VyY2UsIGFuZCBsb2FkIHRoZSBtYWluIHdzZGwgZmlsZSBpbnRvIGl0LgotICAgIAotICAJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7ICAJCi0gIAlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLQotICAJV1NETFJlc291cmNlSW1wbCB3c2RsTWFpblJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi53c2RsIikpOwotICAJd3NkbE1haW5SZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgCQotICAgIHRyeQotICAgIHsKLSAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgIHdzZGxNYWluUmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0gICAgICAvL3dzZGxNYWluUmVzb3VyY2UubG9hZChyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5JTlZBTElEX1dTREwsIldTREwgVVJJOiAiK3dzZGxVUkksZSk7Ci0gICAgfQotICAgIAotICAgIC8vIFJldHVybiB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG1haW4gcmVzb3VyY2UuCi0gICAgcmV0dXJuIHdzZGxNYWluUmVzb3VyY2UuZ2V0RGVmaW5pdGlvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGhhc1Byb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsgICAgIAotCQlpZiAodXJpICE9IG51bGwpCi0JCXsKLQkJICBpbnQgaW5kZXggPSB1cmkuaW5kZXhPZigiOiIpOwotCQkgIGlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA+IDIpIC8vIGFzc3VtZSBwcm90b2NvbCB3aXRoIGJlIGxlbmd0aCAzIHNvIHRoYXQgdGhlJ0MnIGluICdDOi8nIGlzIG5vdCBpbnRlcnByZXRlZCBhcyBhIHByb3RvY29sCi0JCSAgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCSAgfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0gIH0gCi0gIAotICAvKioKLSAgICogUmVhZCB0aGUgV1NETCBkb2N1bWVudCBhY2Nlc3NpYmxlIHZpYSB0aGUgc3BlY2lmaWVkCi0gICAqIFVSSSBpbnRvIGEgV1NETCBkZWZpbml0aW9uLgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFVSSSB0aGUgY29udGV4dCBpbiB3aGljaCB0byByZXNvbHZlIHRoZQotICAgKiB3c2RsVVJJLCBpZiB0aGUgd3NkbFVSSSBpcyByZWxhdGl2ZS4gQ2FuIGJlIG51bGwsIGluIHdoaWNoCi0gICAqIGNhc2UgaXQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0gd3NkbFVSSSBhIFVSSSAoY2FuIGJlIGEgZmlsZW5hbWUgb3IgVVJMKSBwb2ludGluZyB0byBhCi0gICAqIFdTREwgWE1MIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24uCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgY29udGV4dFVSSSwgU3RyaW5nIHdzZGxVUkkpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHRoZSBzcGVjaWZpZWQgJmx0O3dzZGw6ZGVmaW5pdGlvbnMmZ3Q7IGVsZW1lbnQgaW50byBhIFdTREwKLSAgICogZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGVsZW1lbnQuIFdpbGwgYmUgc2V0IGFzIHRoZSBkb2N1bWVudEJhc2VVUkkKLSAgICogb2YgdGhlIHJldHVybmVkIERlZmluaXRpb24uIENhbiBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGl0Ci0gICAqIHdpbGwgYmUgaWdub3JlZC4KLSAgICogQHBhcmFtIGRlZmluaXRpb25zRWxlbWVudCB0aGUgJmx0O3dzZGw6ZGVmaW5pdGlvbnMmZ3Q7IGVsZW1lbnQKLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBkZXNjcmliZWQgYnkgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBFbGVtZW50IGRlZmluaXRpb25zRWxlbWVudCkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCB0aGUgc3BlY2lmaWVkIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGRvY3VtZW50LiBXaWxsIGJlIHNldCBhcyB0aGUgZG9jdW1lbnRCYXNlVVJJCi0gICAqIG9mIHRoZSByZXR1cm5lZCBEZWZpbml0aW9uLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBpdAotICAgKiB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgdGhlIFdTREwgZG9jdW1lbnQsIGFuIFhNTCAKLSAgICogZG9jdW1lbnQgb2JleWluZyB0aGUgV1NETCBzY2hlbWEuCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFN0cmluZyBkb2N1bWVudEJhc2VVUkksIERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGRvY3VtZW50QmFzZVVSSSB0aGUgZG9jdW1lbnQgYmFzZSBVUkkgb2YgdGhlIFdTREwgZGVmaW5pdGlvbgotICAgKiBkZXNjcmliZWQgYnkgdGhlIGRvY3VtZW50LiBXaWxsIGJlIHNldCBhcyB0aGUgZG9jdW1lbnRCYXNlVVJJCi0gICAqIG9mIHRoZSByZXR1cm5lZCBEZWZpbml0aW9uLiBDYW4gYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSBpdAotICAgKiB3aWxsIGJlIGlnbm9yZWQuCi0gICAqIEBwYXJhbSBpbnB1dFNvdXJjZSBhbiBJbnB1dFNvdXJjZSBwb2ludGluZyB0byB0aGUKLSAgICogV1NETCBkb2N1bWVudCwgYW4gWE1MIGRvY3VtZW50IG9iZXlpbmcgdGhlIFdTREwgc2NoZW1hLgotICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQgcG9pbnRlZCB0bwotICAgKiBieSB0aGUgSW5wdXRTb3VyY2UuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiByZWFkV1NETChTdHJpbmcgZG9jdW1lbnRCYXNlVVJJLCBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSkKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gIAlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbE1haW5SZXNvdXJjZSA9IChXU0RMUmVzb3VyY2VJbXBsKXJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIioud3NkbCIpKTsKLQotICAJdHJ5Ci0gICAgewotICAgICAgaWYgKGRvY3VtZW50QmFzZVVSSSAhPSBudWxsKQotICAgICAgICB3c2RsTWFpblJlc291cmNlLnNldFVSSShjcmVhdGVVUkkoZG9jdW1lbnRCYXNlVVJJKSk7Ci0gICAgICByZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dChXU0RMUmVzb3VyY2VJbXBsLkNPTlRJTlVFX09OX0xPQURfRVJST1IsbmV3IEJvb2xlYW4oZmFsc2UpKTsKLSAgICAgIHdzZGxNYWluUmVzb3VyY2UubG9hZChpbnB1dFNvdXJjZS5nZXRCeXRlU3RyZWFtKCksIHJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uSU5WQUxJRF9XU0RMLCAiIiwgaW9lKTsKLSAgICB9Ci0gICAgCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gd3NkbE1haW5SZXNvdXJjZS5nZXREZWZpbml0aW9uKCk7Ci0gICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkKLSAgICAgIGRlZmluaXRpb24uc2V0RG9jdW1lbnRCYXNlVVJJKGRvY3VtZW50QmFzZVVSSSk7Ci0gICAgCi0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIFdTREwgZG9jdW1lbnQgaW50byBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGxvY2F0b3IgQSBXU0RMTG9jYXRvciBvYmplY3QgdXNlZCB0byBwcm92aWRlIElucHV0U291cmNlcwotICAgKiBwb2ludGluZyB0byB0aGUgd3NkbCBmaWxlLgotICAgKiBAcmV0dXJuIHRoZSBkZWZpbml0aW9uIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIHJlYWRXU0RMKFdTRExMb2NhdG9yIGxvY2F0b3IpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbihXU0RMRXhjZXB0aW9uLk9USEVSX0VSUk9SLCJOb3QgSW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIHByaXZhdGUgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgaWYgKGhhc1Byb3RvY29sKHVyaVN0cmluZykpCi0gICAgICAgcmV0dXJuIFVSSS5jcmVhdGVVUkkodXJpU3RyaW5nKTsKLSAgICBlbHNlCi0gICAgICAgcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKHVyaVN0cmluZyk7Ci0gIH0gCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETFdyaXRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC93c2RsNGovV1NETFdyaXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhZjE1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvd3NkbDRqL1dTRExXcml0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ajsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExXcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIFdTRExXcml0ZXJJbXBsIGltcGxlbWVudHMgV1NETFdyaXRlcgotewotICAvKioKLSAgICogU2V0cyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLSAgICogPHA+Ci0gICAqIFRoZXJlIGFyZSBubyBtaW5pbXVtIGZlYXR1cmVzIHRoYXQgbXVzdCBiZSBzdXBwb3J0ZWQuCi0gICAqIDxwPgotICAgKiBBbGwgZmVhdHVyZSBuYW1lcyBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCwgSmF2YSBwYWNrYWdlIHN0eWxlLiBBbGwKLSAgICogbmFtZXMgc3RhcnRpbmcgd2l0aCBqYXZheC53c2RsLiBhcmUgcmVzZXJ2ZWQgZm9yIGZlYXR1cmVzIGRlZmluZWQKLSAgICogYnkgdGhlIEpXU0RMIHNwZWNpZmljYXRpb24uIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgaW1wbGVtZW50YXRpb24tCi0gICAqIHNwZWNpZmljIGZlYXR1cmVzIGJlIGZ1bGx5LXF1YWxpZmllZCB0byBtYXRjaCB0aGUgcGFja2FnZSBuYW1lCi0gICAqIG9mIHRoYXQgaW1wbGVtZW50YXRpb24uIEZvciBleGFtcGxlOiBjb20uYWJjLmZlYXR1cmVOYW1lCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvIGJlIHNldC4KLSAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQgdGhlIGZlYXR1cmUgdG8uCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmZWF0dXJlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuCi0gICAqIEBzZWUgI2dldEZlYXR1cmUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICB7Ci0gICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm90IEltcGxlbWVudGVkIik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgotICAgKgotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZSB0byBnZXQgdGhlIHZhbHVlIG9mLgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmVhdHVyZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkLgotICAgKiBAc2VlICNzZXRGZWF0dXJlKFN0cmluZywgYm9vbGVhbikKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgewotICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBJbXBsZW1lbnRlZCIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhIGRvY3VtZW50IGdlbmVyYXRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgV1NETCBtb2RlbC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudChEZWZpbml0aW9uIHdzZGxEZWYpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gKChEZWZpbml0aW9uSW1wbCl3c2RsRGVmKS5nZXREb2N1bWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBzcGVjaWZpZWQgV1NETCBkZWZpbml0aW9uIHRvIHRoZSBzcGVjaWZpZWQgV3JpdGVyLgotICAgKgotICAgKiBAcGFyYW0gd3NkbERlZiB0aGUgV1NETCBkZWZpbml0aW9uIHRvIGJlIHdyaXR0ZW4uCi0gICAqIEBwYXJhbSBzaW5rIHRoZSBXcml0ZXIgdG8gd3JpdGUgdGhlIHhtbCB0by4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlV1NETChEZWZpbml0aW9uIHdzZGxEZWYsIFdyaXRlciBzaW5rKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotCi0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKLSAgICAgIAotICAgICAgLy8gVW5sZXNzIGEgd2lkdGggaXMgc2V0LCB0aGVyZSB3aWxsIGJlIG9ubHkgbGluZSBicmVha3MgYnV0IG5vIGluZGVudGF0aW9uLgotICAgICAgLy8gVGhlIElCTSBKREsgYW5kIHRoZSBTdW4gSkRLIGRvbid0IGFncmVlIG9uIHRoZSBwcm9wZXJ0eSBuYW1lLAotICAgICAgLy8gc28gd2Ugc2V0IHRoZW0gYm90aC4KLSAgICAgIC8vCi0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbn1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7Ci0gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZW5jb2RpbmcpOwotICAgICAgfQotICAgICAgCi0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9ICgoRGVmaW5pdGlvbkltcGwpd3NkbERlZikuZ2V0RG9jdW1lbnQoKTsKLSAgICAgIGlmIChkb2N1bWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICAoKERlZmluaXRpb25JbXBsKXdzZGxEZWYpLnVwZGF0ZUVsZW1lbnQodHJ1ZSk7Ci0gICAgICAgIGRvY3VtZW50ID0gKChEZWZpbml0aW9uSW1wbCl3c2RsRGVmKS5nZXREb2N1bWVudCgpOwotICAgICAgfQotICAgICAgCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoc2luaykpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKFdTRExFeGNlcHRpb24uT1RIRVJfRVJST1IsIkZhaWxlZCB0byBzYXZlIERlZmluaXRpb25zLiIsZXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgc3BlY2lmaWVkIFdTREwgZGVmaW5pdGlvbiB0byB0aGUgc3BlY2lmaWVkIE91dHB1dFN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIHdzZGxEZWYgdGhlIFdTREwgZGVmaW5pdGlvbiB0byBiZSB3cml0dGVuLgotICAgKiBAcGFyYW0gc2luayB0aGUgT3V0cHV0U3RyZWFtIHRvIHdyaXRlIHRoZSB4bWwgdG8uCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVdTREwoRGVmaW5pdGlvbiB3c2RsRGVmLCBPdXRwdXRTdHJlYW0gc2luaykgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotCi0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoKERlZmluaXRpb25JbXBsKXdzZGxEZWYpLmVSZXNvdXJjZSgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIHJlc291cmNlLnNhdmUoc2luayxudWxsKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oV1NETEV4Y2VwdGlvbi5PVEhFUl9FUlJPUiwiRmFpbGVkIHRvIHNhdmUgRGVmaW5pdGlvbnMuIixlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9SZWNvbmNpbGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9SZWNvbmNpbGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMmE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvUmVjb25jaWxhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vLyBUT0RPLi4uIHdoeSBkbyB3ZSBuZWVkIHRoaXM/Ci0vLyAKLXB1YmxpYyBpbnRlcmZhY2UgUmVjb25jaWxhYmxlIAotewotICBwdWJsaWMgdm9pZCBzZXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCk7Ci0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKTsKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlQXR0cmlidXRlcyhFbGVtZW50IGNoYW5nZWRFbGVtZW50KTsKLSAgcHVibGljIHZvaWQgcmVjb25jaWxlUmVmZXJlbmNlcyhib29sZWFuIGRlZXApOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M2MjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk91dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzZGwuV1NETFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICAvKioKLSAgICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXU0RMUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMQWRhcHRlckZhY3RvcnkoKQotICB7Ci0gICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vZGVsUGFja2FnZSA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpCi0gICAgewotICAgICAgcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0gICAgbmV3IFdTRExTd2l0Y2goKQotICAgIHsKLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVdTRExFbGVtZW50KFdTRExFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVdTRExFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlUG9ydFR5cGUoUG9ydFR5cGUgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VPcGVyYXRpb24oT3BlcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU9wZXJhdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2UoTWVzc2FnZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlUGFydChQYXJ0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVBhcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nKEJpbmRpbmcgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlU2VydmljZShTZXJ2aWNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVNlcnZpY2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VQb3J0KFBvcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlUG9ydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlRGVmaW5pdGlvbihEZWZpbml0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZURlZmluaXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJbXBvcnQoSW1wb3J0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUltcG9ydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2libGVFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUV4dGVuc2libGVFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSW5wdXQoSW5wdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSW5wdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VPdXRwdXQoT3V0cHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU91dHB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUZhdWx0KEZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUZhdWx0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVCaW5kaW5nSW5wdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ091dHB1dEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlQmluZGluZ0ZhdWx0QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlTmFtZXNwYWNlKE5hbWVzcGFjZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVOYW1lc3BhY2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJUG9ydFR5cGUoamF2YXgud3NkbC5Qb3J0VHlwZSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJUG9ydFR5cGVBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJT3BlcmF0aW9uKGphdmF4LndzZGwuT3BlcmF0aW9uIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJSW5wdXQoamF2YXgud3NkbC5JbnB1dCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJSW5wdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJT3V0cHV0KGphdmF4LndzZGwuT3V0cHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlPdXRwdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRmF1bHQoamF2YXgud3NkbC5GYXVsdCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJRmF1bHRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJTWVzc2FnZShqYXZheC53c2RsLk1lc3NhZ2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSU1lc3NhZ2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJUGFydChqYXZheC53c2RsLlBhcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVBhcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJU2VydmljZShqYXZheC53c2RsLlNlcnZpY2Ugb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVNlcnZpY2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJUG9ydChqYXZheC53c2RsLlBvcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVBvcnRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZyhqYXZheC53c2RsLkJpbmRpbmcgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUJpbmRpbmdBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ09wZXJhdGlvbihqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUJpbmRpbmdPcGVyYXRpb25BZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ0lucHV0KGphdmF4LndzZGwuQmluZGluZ0lucHV0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlCaW5kaW5nSW5wdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ091dHB1dChqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUJpbmRpbmdPdXRwdXRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ0ZhdWx0KGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlCaW5kaW5nRmF1bHRBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlEZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlJbXBvcnQoamF2YXgud3NkbC5JbXBvcnQgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUltcG9ydEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlMaXN0KExpc3Qgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSUxpc3RBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJTWFwKE1hcCBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJTWFwQWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlSVVSTChVUkwgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlSVVSTEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJRXh0ZW5zaW9uUmVnaXN0cnlBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VUeXBlcyhUeXBlcyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUeXBlc0FkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZUlJdGVyYXRvcihJdGVyYXRvciBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJSXRlcmF0b3JBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VJVHlwZXMoamF2YXgud3NkbC5UeXBlcyBvYmplY3QpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVJVHlwZXNBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNhc2VVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50QWRhcHRlcigpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZVJlZmVyZW5jZShNZXNzYWdlUmVmZXJlbmNlIG9iamVjdCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VSZWZlcmVuY2VBZGFwdGVyKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KQotICAgICAgewotICAgICAgICByZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLSAgICAgIH0KLSAgICB9OwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotICAgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gIHsKLSAgICByZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5XU0RMRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMRWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMRWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLlBvcnRUeXBlIDxlbT5Qb3J0IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGUKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydFR5cGVBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5PcGVyYXRpb24gPGVtPk9wZXJhdGlvbjwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuTWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5QYXJ0IDxlbT5QYXJ0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFydEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmcgPGVtPkJpbmRpbmc8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ09wZXJhdGlvbiA8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuU2VydmljZSA8ZW0+U2VydmljZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Qb3J0IDxlbT5Qb3J0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50IDxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5EZWZpbml0aW9uIDxlbT5EZWZpbml0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVmaW5pdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkltcG9ydCA8ZW0+SW1wb3J0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJbXBvcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5FeHRlbnNpYmxlRWxlbWVudCA8ZW0+RXh0ZW5zaWJsZSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuc2libGVFbGVtZW50QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuSW5wdXQgPGVtPklucHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlucHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuT3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dHB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkZhdWx0IDxlbT5GYXVsdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c2RsLkJpbmRpbmdJbnB1dCA8ZW0+QmluZGluZyBJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQmluZGluZ0lucHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ091dHB1dCA8ZW0+QmluZGluZyBPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nT3V0cHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzZGwuQmluZGluZ0ZhdWx0IDxlbT5CaW5kaW5nIEZhdWx0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVCaW5kaW5nRmF1bHRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5OYW1lc3BhY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZXNwYWNlQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuUG9ydFR5cGUgPGVtPklQb3J0IFR5cGU8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5Qb3J0VHlwZQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJUG9ydFR5cGVBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5PcGVyYXRpb24gPGVtPklPcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5PcGVyYXRpb24KLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSU9wZXJhdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLklucHV0IDxlbT5JSW5wdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5JbnB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJSW5wdXRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5PdXRwdXQgPGVtPklPdXRwdXQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5PdXRwdXQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSU91dHB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkZhdWx0IDxlbT5JRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5GYXVsdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJRmF1bHRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5NZXNzYWdlIDxlbT5JTWVzc2FnZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLk1lc3NhZ2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1lc3NhZ2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5QYXJ0IDxlbT5JUGFydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLlBhcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVBhcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5TZXJ2aWNlIDxlbT5JU2VydmljZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLlNlcnZpY2UKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5Qb3J0IDxlbT5JUG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLlBvcnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSVBvcnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nIDxlbT5JQmluZGluZzwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmcKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUJpbmRpbmdBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uIDxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlCaW5kaW5nT3BlcmF0aW9uQWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ0lucHV0IDxlbT5JQmluZGluZyBJbnB1dDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkJpbmRpbmdJbnB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJQmluZGluZ0lucHV0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmF4LndzZGwuQmluZGluZ091dHB1dCA8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuQmluZGluZ091dHB1dAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJQmluZGluZ091dHB1dEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkJpbmRpbmdGYXVsdCA8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSUJpbmRpbmdGYXVsdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlFeHRlbnNpYmlsaXR5RWxlbWVudEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkRlZmluaXRpb24gPGVtPklEZWZpbml0aW9uPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuRGVmaW5pdGlvbgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJRGVmaW5pdGlvbkFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLkltcG9ydCA8ZW0+SUltcG9ydDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZheC53c2RsLkltcG9ydAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJSW1wb3J0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5JTGlzdDwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBqYXZhLnV0aWwuTGlzdAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJTGlzdEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLnV0aWwuTWFwIDxlbT5JTWFwPC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmEudXRpbC5NYXAKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSU1hcEFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZhLm5ldC5VUkwgPGVtPklVUkw8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YS5uZXQuVVJMCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlVUkxBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2lvblJlZ2lzdHJ5IDxlbT5JRXh0ZW5zaW9uIFJlZ2lzdHJ5PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJRXh0ZW5zaW9uUmVnaXN0cnlBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5UeXBlcyA8ZW0+VHlwZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXMKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlVHlwZXNBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgamF2YS51dGlsLkl0ZXJhdG9yIDxlbT5JSXRlcmF0b3I8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YS51dGlsLkl0ZXJhdG9yCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlJdGVyYXRvckFkYXB0ZXIoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBqYXZheC53c2RsLlR5cGVzIDxlbT5JVHlwZXM8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgamF2YXgud3NkbC5UeXBlcwotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVJVHlwZXNBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPGVtPlVua25vd24gRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT59Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5YU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCA8ZW0+WFNEIFNjaGVtYSBFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPn0nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3NkbC5NZXNzYWdlUmVmZXJlbmNlIDxlbT5NZXNzYWdlIFJlZmVyZW5jZTwvZW0+fScuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VSZWZlcmVuY2VBZGFwdGVyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19IC8vV1NETEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETERlZmluaXRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETERlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZWY1MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1dTRExEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLldTRExQYWNrYWdlSW1wbDsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMRGVmaW5pdGlvbkZhY3RvcnkgZXh0ZW5kcyBjb20uaWJtLndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeUltcGwKLXsKLQotICBwcml2YXRlIHN0YXRpYyBXU0RMRGVmaW5pdGlvbkZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0gIHB1YmxpYyBXU0RMRGVmaW5pdGlvbkZhY3RvcnkoKQotICB7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBXU0RMIHBhY2thZ2UgaXMgaW5pdGlhbGl6ZWQuCi0gICAgV1NETFBhY2thZ2VJbXBsLmluaXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgRGVmaW5pdGlvbi4KLSAgICovCi0gIHB1YmxpYyBqYXZheC53c2RsLkRlZmluaXRpb24gbmV3RGVmaW5pdGlvbigpCi0gIHsKLSAgICBqYXZheC53c2RsLkRlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExGYWN0b3J5SW1wbC5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBmYWN0b3J5Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgIGluc3RhbmNlID0gbmV3IFdTRExEZWZpbml0aW9uRmFjdG9yeSgpOwotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgV1NETFJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBXU0RMUmVhZGVyIG5ld1dTRExSZWFkZXIoKQotICB7Ci0gICAgV1NETFJlYWRlciByZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwoKTsKLSAgICByZWFkZXIuc2V0RmFjdG9yeUltcGxOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gcmVhZGVyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMTW9kZWxMb2NhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETE1vZGVsTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTliMGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMTW9kZWxMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciBpbnRlcmZhY2UgdXNlZCBieSB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW1wb3J0SW1wbCB0byBmaW5kIHJlZmVyZW5jZWQgcmVzb3VyY2VzLgotICogV2hlbiB0aGUgcmVzb3VyY2UgcmVmZXJlbmNlZCBieSBhIHdzZGwgaW1wb3J0IG5lZWRzIHRvIGJlIGRldGVybWluZWQsIAotICogdGhlIGNvbnRhaW5pbmcge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZX0KLSAqIHdpbGwgYmUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbCNnZXRSZWdpc3RlcmVkQWRhcHRlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UsT2JqZWN0KSBpbnNwZWN0ZWR9IAotICogZm9yIGFuIGFkYXB0ZXIgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLgotICogQXMgc3VjaCwgeW91IGNhbiByZWdpc3RlciBhbiBhZGFwdGVyIGZhY3RvcnkgbGlrZSB0aGlzIHRvIHRhaWxvciB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gbG9jYXRlIHRoZSByZXNvdXJjZSA6Ci0gKjxwcmU+Ci0gKiAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gKiAgcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZAotICogICAgKG5ldyBBZGFwdGVyRmFjdG9yeUltcGwoKQotICogICAgIHsKLSAqICAgICAgIGNsYXNzIEN1c3RvbVVSSVJlc29sdmVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBXU0RMTW9kZWxMb2NhdG9yCi0gKiAgICAgICB7Ci0gKiAgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pOwotICogICAgICAgICB7Ci0gKiAgICAgICAgICAgcmV0dXJuIG51bGw7ICAvLyBBZGRpdGlvbmFsIGxvZ2ljLi4uCi0gKiAgICAgICAgIH0KLSAqCi0gKiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gKiAgICAgICAgIHsKLSAqICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzOwotICogICAgICAgICB9Ci0gKiAgICAgICB9Ci0gKgotICogICAgICAgcHJvdGVjdGVkIEN1c3RvbVVSSVJlc29sdmVyIGN1c3RvbVVSSVJlc29sdmVyID0gbmV3IEN1c3RvbVVSSVJlc29sdmVyKCk7Ci0gKgotICogICAgICAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkKLSAqICAgICAgIHsKLSAqICAgICAgICAgcmV0dXJuIHR5cGUgPT0gV1NETE1vZGVsTG9jYXRvci5jbGFzczsKLSAqICAgICAgIH0KLSAqCi0gKiAgICAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICogICAgICAgewotICogICAgICAgICByZXR1cm4gY3VzdG9tVVJJUmVzb2x2ZXI7Ci0gKiAgICAgICB9Ci0gKiAgICAgfSk7Ci0gKjwvcHJlPgotICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwjZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLE9iamVjdCkKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMTW9kZWxMb2NhdG9yCi17Ci0JcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzk4NmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKQotICB7Ci0gICAgUmVzb3VyY2UgcmVzdWx0ID0gbmV3IFdTRExSZXNvdXJjZUltcGwodXJpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19IC8vV1NETFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODYwNjY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpb25SZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC5XU0RMUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFN3aXRjaCB7Ci0gIC8qKgotICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgV1NETFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgV1NETFN3aXRjaCgpCi0gIHsKLSAgICBpZiAobW9kZWxQYWNrYWdlID09IG51bGwpCi0gICAgewotICAgICAgbW9kZWxQYWNrYWdlID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KQotICB7Ci0gICAgRUNsYXNzIHRoZUVDbGFzcyA9IHRoZUVPYmplY3QuZUNsYXNzKCk7Ci0gICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotICAgICAgewotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlRfVFlQRToKLSAgICAgICAgewotICAgICAgICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gKFBvcnRUeXBlKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQocG9ydFR5cGUpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuT1BFUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IChPcGVyYXRpb24pdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZU9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG9wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLk1FU1NBR0U6Ci0gICAgICAgIHsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5QQVJUOgotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVBhcnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSVBhcnQocGFydCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElORzoKLSAgICAgICAgewotICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlCaW5kaW5nKGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmcpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkJJTkRJTkdfT1BFUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJsZUVsZW1lbnQoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbik7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuU0VSVklDRToKLSAgICAgICAgewotICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlTZXJ2aWNlKHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KHNlcnZpY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlBPUlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlUG9ydChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJUG9ydChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChwb3J0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5FWFRFTlNJQklMSVRZX0VMRU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkRFRklOSVRJT046Ci0gICAgICAgIHsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbil0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJRGVmaW5pdGlvbihkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChkZWZpbml0aW9uKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5JTVBPUlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBJbXBvcnQgaW1wb3J0XyA9IChJbXBvcnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUltcG9ydChpbXBvcnRfKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChpbXBvcnRfKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSW1wb3J0KGltcG9ydF8pOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLklOUFVUOgotICAgICAgICB7Ci0gICAgICAgICAgSW5wdXQgaW5wdXQgPSAoSW5wdXQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUlucHV0KGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXNzYWdlUmVmZXJlbmNlKGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChpbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUlucHV0KGlucHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5PVVRQVVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBPdXRwdXQgb3V0cHV0ID0gKE91dHB1dCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWVzc2FnZVJlZmVyZW5jZShvdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KG91dHB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSU91dHB1dChvdXRwdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLkZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXNzYWdlUmVmZXJlbmNlKGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChmYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUZhdWx0KGZhdWx0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0lOUFVUOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IChCaW5kaW5nSW5wdXQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdJbnB1dChiaW5kaW5nSW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmdJbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdJbnB1dChiaW5kaW5nSW5wdXQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmdJbnB1dCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuQklORElOR19PVVRQVVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSAoQmluZGluZ091dHB1dCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlQmluZGluZ091dHB1dChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJQmluZGluZ091dHB1dChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudChiaW5kaW5nT3V0cHV0KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXU0RMUGFja2FnZS5CSU5ESU5HX0ZBVUxUOgotICAgICAgICB7Ci0gICAgICAgICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IChCaW5kaW5nRmF1bHQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZUJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUV4dGVuc2libGVFbGVtZW50KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUJpbmRpbmdGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdTRExFbGVtZW50KGJpbmRpbmdGYXVsdCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuTkFNRVNQQUNFOgotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlIG5hbWVzcGFjZSA9IChOYW1lc3BhY2UpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlRZUEVTOgotICAgICAgICB7Ci0gICAgICAgICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVR5cGVzKHR5cGVzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmxlRWxlbWVudCh0eXBlcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSVR5cGVzKHR5cGVzKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudCh0eXBlcyk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV1NETFBhY2thZ2UuVU5LTk9XTl9FWFRFTlNJQklMSVRZX0VMRU1FTlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCl0aGVFT2JqZWN0OwotICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBjYXNlVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQodW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMRWxlbWVudCh1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudCh1bmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFdTRExQYWNrYWdlLlhTRF9TQ0hFTUFfRVhURU5TSUJJTElUWV9FTEVNRU5UOgotICAgICAgICB7Ci0gICAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpdGhlRU9iamVjdDsKLSAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gY2FzZVhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KHhzZFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFeHRlbnNpYmlsaXR5RWxlbWVudCh4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV1NETEVsZW1lbnQoeHNkU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlFeHRlbnNpYmlsaXR5RWxlbWVudCh4c2RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VXU0RMRWxlbWVudChXU0RMRWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBUeXBlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgVHlwZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVBvcnRUeXBlKFBvcnRUeXBlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3BlcmF0aW9uPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlT3BlcmF0aW9uKE9wZXJhdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZShNZXNzYWdlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJ0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VQYXJ0KFBhcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZzwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmcoQmluZGluZyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2UoU2VydmljZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlUG9ydChQb3J0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlZmluaXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZURlZmluaXRpb24oRGVmaW5pdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1wb3J0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkltcG9ydDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUltcG9ydChJbXBvcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuc2libGUgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbnNpYmxlIEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbnNpYmxlRWxlbWVudChFeHRlbnNpYmxlRWxlbWVudCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5wdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJbnB1dChJbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZU91dHB1dChPdXRwdXQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZhdWx0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlRmF1bHQoRmF1bHQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgSW5wdXQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmluZGluZyBJbnB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlQmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CaW5kaW5nIEZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZXNwYWNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTmFtZXNwYWNlKE5hbWVzcGFjZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBvcnQgVHlwZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydCBUeXBlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVBvcnRUeXBlKGphdmF4LndzZGwuUG9ydFR5cGUgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklPcGVyYXRpb248L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU9wZXJhdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlPcGVyYXRpb24oamF2YXgud3NkbC5PcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklJbnB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSW5wdXQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJSW5wdXQoamF2YXgud3NkbC5JbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SU91dHB1dDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JT3V0cHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSU91dHB1dChqYXZheC53c2RsLk91dHB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUZhdWx0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklGYXVsdDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlGYXVsdChqYXZheC53c2RsLkZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWVzc2FnZTwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWVzc2FnZTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlNZXNzYWdlKGphdmF4LndzZGwuTWVzc2FnZSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBhcnQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVBhcnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJUGFydChqYXZheC53c2RsLlBhcnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklTZXJ2aWNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklTZXJ2aWNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVNlcnZpY2UoamF2YXgud3NkbC5TZXJ2aWNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JUG9ydDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlQb3J0KGphdmF4LndzZGwuUG9ydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmc8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmc8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZyhqYXZheC53c2RsLkJpbmRpbmcgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIE9wZXJhdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JQmluZGluZyBPcGVyYXRpb248L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ09wZXJhdGlvbihqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24gb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIElucHV0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUJpbmRpbmdJbnB1dChqYXZheC53c2RsLkJpbmRpbmdJbnB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgT3V0cHV0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklCaW5kaW5nIE91dHB1dDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlCaW5kaW5nT3V0cHV0KGphdmF4LndzZGwuQmluZGluZ091dHB1dCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUJpbmRpbmcgRmF1bHQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJQmluZGluZ0ZhdWx0KGphdmF4LndzZGwuQmluZGluZ0ZhdWx0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpYmlsaXR5IEVsZW1lbnQ8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJRXh0ZW5zaWJpbGl0eUVsZW1lbnQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlEZWZpbml0aW9uKGphdmF4LndzZGwuRGVmaW5pdGlvbiBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUltcG9ydDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSW1wb3J0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSUltcG9ydChqYXZheC53c2RsLkltcG9ydCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUxpc3Q8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUxpc3Q8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJTGlzdChMaXN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JTWFwPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklNYXA8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VJTWFwKE1hcCBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVVSTDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JVVJMPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlSVVSTChVUkwgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklFeHRlbnNpb24gUmVnaXN0cnk8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUV4dGVuc2lvbiBSZWdpc3RyeTwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZXM8L2VtPicuCi0gICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgKiBAZ2VuZXJhdGVkCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGNhc2VUeXBlcyhUeXBlcyBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUl0ZXJhdG9yPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklJdGVyYXRvcjwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlJdGVyYXRvcihJdGVyYXRvciBvYmplY3QpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVR5cGVzPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklUeXBlczwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZUlUeXBlcyhqYXZheC53c2RsLlR5cGVzIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vbmtub3duIEV4dGVuc2liaWxpdHkgRWxlbWVudDwvZW0+Jy4KLSAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgY2FzZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlhTRCBTY2hlbWEgRXh0ZW5zaWJpbGl0eSBFbGVtZW50PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0KQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgUmVmZXJlbmNlPC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZVJlZmVyZW5jZShNZXNzYWdlUmVmZXJlbmNlIG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICogQGdlbmVyYXRlZAotICAgKi8KLSAgcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0gLy9XU0RMU3dpdGNoCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvV1NETFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTc5YjA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9XU0RMVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgV1NETFV0aWwgZXh0ZW5kcyBXU0RMQ29uc3RhbnRzCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgV1NETFV0aWwgaW5zdGFuY2U7Ci0gIC8vICBwcm90ZWN0ZWQgTm9kZUFzc29jaWF0aW9uTWFuYWdlciBub2RlQXNzb2NpYXRpb25NYW5hZ2VyID0gbmV3IE5vZGVBc3NvY2lhdGlvbk1hbmFnZXIoKTsKLQotICBwcm90ZWN0ZWQgSGFzaE1hcCBlbGVtZW50TmFtZVRvVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgcHVibGljIHN0YXRpYyBXU0RMVXRpbCBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBXU0RMVXRpbCgpOwotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICBwdWJsaWMgV1NETFV0aWwoKQotICB7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KEJJTkRJTkdfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKEJJTkRJTkcpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoREVGSU5JVElPTl9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoREVGSU5JVElPTikpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihET0NVTUVOVEFUSU9OKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KEZBVUxUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihGQVVMVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChJTVBPUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKElNUE9SVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChJTlBVVF9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoSU5QVVQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoTUVTU0FHRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoTUVTU0FHRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChPUEVSQVRJT05fRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKE9QRVJBVElPTikpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChPVVRQVVRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKE9VVFBVVCkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChQQVJUX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihQQVJUKSk7Ci0gICAgZWxlbWVudE5hbWVUb1R5cGVNYXAucHV0KFBPUlRfRUxFTUVOVF9UQUcsIG5ldyBJbnRlZ2VyKFBPUlQpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoUE9SVF9UWVBFX0VMRU1FTlRfVEFHLCBuZXcgSW50ZWdlcihQT1JUX1RZUEUpKTsKLSAgICBlbGVtZW50TmFtZVRvVHlwZU1hcC5wdXQoU0VSVklDRV9FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoU0VSVklDRSkpOwotICAgIGVsZW1lbnROYW1lVG9UeXBlTWFwLnB1dChUWVBFU19FTEVNRU5UX1RBRywgbmV3IEludGVnZXIoVFlQRVMpKTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0V1NETFR5cGUoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgaW50IHJlc3VsdCA9IC0xOwotCi0gICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGVsZW1lbnROYW1lVG9UeXBlTWFwLmdldChlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICBpZiAoaW50ZWdlciAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGludGVnZXIuaW50VmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldFBhcmVudEVsZW1lbnRDaGFpbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBsaXN0LmFkZCgwLCBlbGVtZW50KTsKLSAgICAgIE5vZGUgbm9kZSA9IGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgZWxlbWVudCA9IChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSA/IChFbGVtZW50KSBub2RlIDogbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKgotICAgIHB1YmxpYyBPYmplY3QgZmluZE1vZGVsT2JqZWN0Rm9yRWxlbWVudChEZWZpbml0aW9uIGRlZmluaXRpb24sIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkKLSAgICB7ICAgCi0gICAgICBPYmplY3QgbyA9IG5vZGVBc3NvY2lhdGlvbk1hbmFnZXIuZ2V0TW9kZWxPYmplY3RGb3JOb2RlKGRlZmluaXRpb24sIHRhcmdldEVsZW1lbnQpOwotICAgICAgcmV0dXJuIG87Ci0gICAgfQotICAKLSAgICAgICAgICAgICAgCi0gICAgcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudEZvck9iamVjdChPYmplY3QgbykKLSAgICB7ICAgICAgCi0gICAgICBOb2RlIG5vZGUgPSBub2RlQXNzb2NpYXRpb25NYW5hZ2VyLmdldE5vZGUobyk7ICAKLSAgICAgIHJldHVybiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgPyAoRWxlbWVudClub2RlIDogbnVsbDsgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIE5vZGUgZ2V0Tm9kZUZvck9iamVjdChPYmplY3QgbykKLSAgICB7ICAgICAgCi0gICAgICByZXR1cm4gbm9kZUFzc29jaWF0aW9uTWFuYWdlci5nZXROb2RlKG8pOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gIAotICAgIHB1YmxpYyBJVHlwZVN5c3RlbVByb3ZpZGVyIGdldFR5cGVTeXN0ZW1Qcm92aWRlcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgeyAgICAgIAotICAgICAgcmV0dXJuIFdTRExUb0RPTUVsZW1lbnRVdGlsLmdldFR5cGVTeXN0ZW1Qcm92aWRlcihkZWZpbml0aW9uKTsgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLSAgCi0gIAotICAgIHB1YmxpYyB2b2lkIHNldFR5cGVTeXN0ZW1Qcm92aWRlcihEZWZpbml0aW9uIGRlZmluaXRpb24sIElUeXBlU3lzdGVtUHJvdmlkZXIgdHlwZVN5c3RlbVByb3ZpZGVyKQotICAgIHsgICAgICAKLSAgICAgIFdTRExUb0RPTUVsZW1lbnRVdGlsLnNldFR5cGVTeXN0ZW1Qcm92aWRlcihkZWZpbml0aW9uLCB0eXBlU3lzdGVtUHJvdmlkZXIpOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9ICAgCi0gICovCi0KLSAgcHVibGljIHN0YXRpYyBRTmFtZSBjcmVhdGVRTmFtZShEZWZpbml0aW9uIGRlZmluaXRpb24sIFN0cmluZyBwcmVmaXhlZE5hbWUpCi0gIHsKLSAgICBRTmFtZSBxbmFtZSA9IG51bGw7Ci0gICAgaWYgKHByZWZpeGVkTmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IHByZWZpeGVkTmFtZS5pbmRleE9mKCI6Iik7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gKGluZGV4ID09IC0xKSA/IG51bGwgOiBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBwcmVmaXhlZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgcW5hbWUgPSBuZXcgUU5hbWUobmFtZXNwYWNlLCBsb2NhbFBhcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBxbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldEV4dGVuc2liaWxpdHlFbGVtZW50Tm9kZXMoRXh0ZW5zaWJsZUVsZW1lbnQgZXh0ZW5zaWJsZUVsZW1lbnQpCi0gIHsKLSAgICBMaXN0IGNoaWxkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRlbnNpYmxlRWxlbWVudC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZExpc3QuYWRkKGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGlsZExpc3Q7Ci0gICAgLy9yZXR1cm4gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTRlZTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICAgIHByb3RlY3RlZCBYU0RTY2hlbWFMb2NhdG9ySW1wbCBzY2hlbWFMb2NhdG9yID0gbmV3IFhTRFNjaGVtYUxvY2F0b3JJbXBsKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0b3IuY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gc2NoZW1hTG9jYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODMzNTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0b3JJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBYU0RTY2hlbWFMb2NhdG9yCi17Ci0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yI2xvY2F0ZVNjaGVtYShvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hLAotICAgICAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEU2NoZW1hIGxvY2F0ZVNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcmF3U2NoZW1hTG9jYXRpb25VUkksIFN0cmluZyByZXNvbHZlZFNjaGVtYUxvY2F0aW9uVVJJKQotICAgIHsKLSAgICAgIFhTRFNjaGVtYSByZXNvbHZlZFNjaGVtYSA9IG51bGw7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgICAgICBmb3IgKEVPYmplY3QgcGFyZW50ID0geHNkU2NoZW1hLmVDb250YWluZXIoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgRGVmaW5pdGlvbikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIHBhcmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwgJiYgZGVmaW5pdGlvbi5nZXRFVHlwZXMoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFhTRFNjaGVtYUV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgbykuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCAmJiBuYW1lc3BhY2VVUkkuZXF1YWxzKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlZFNjaGVtYSA9IHNjaGVtYTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc29sdmVkU2NoZW1hOyAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvcGFja2FnZS5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjJkZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+V1NETCBNb2RlbCBBUEkgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD4KLSAgICAgICAgVGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIHdvcmsgd2l0aCB0aGUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD5UaGUgV1NETCBtb2RlbCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gbG9hZCwgbW9kaWZ5LCBhbmQgc2F2ZSBXU0RMIDEuMSBkb2N1bWVudHMuCi0JCTwvcD4KLTwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvcGFja2FnZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmE1YmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGh0bWw+Ci0JPGhlYWQ+Ci0JCTxtZXRhCi0JCQluYW1lPSJyb290IgotCQotCQkJY29udGVudD0iLi4vLi4vLi4vLi4vLi4vLi4vIiAvPgotCQk8dGl0bGU+V1NETCBNb2RlbCBBUEkgT3ZlcnZpZXc8L3RpdGxlPgotCTwvaGVhZD4KLQotCTxib2R5PgotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoZSBXU0RMIG1vZGVsIEFQSSBhbGxvd3MgY2xpZW50cyB0byB3b3JrIHdpdGggdGhlIFdTREwgMS4xIGRvY3VtZW50cy4KLQkJPC9hYnN0cmFjdD4KLQkJPHA+VGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIGxvYWQsIG1vZGlmeSwgYW5kIHNhdmUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L3A+IAotCTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YzY5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeQotewotICBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9FeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTI4Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL0V4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkKLXsKLSAgcHVibGljIHZvaWQgcmVnaXN0ZXJGYWN0b3J5KFN0cmluZyBuYW1lc3BhY2UsIEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSBmYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvV1NETENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmI5NGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgV1NETENvbnN0YW50cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSU5ESU5HID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGSU5JVElPTiA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UQVRJT04gPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQVVMVCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNUE9SVCA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUID0gNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRSA9IDY7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QRVJBVElPTiA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVFBVVCA9IDg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlQgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUID0gMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPUlRfVFlQRSA9IDExOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVTID0gMTM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAxNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRSA9IDE1OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVOU0lCSUxJVFlfRUxFTUVOVCA9IDI0OwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfRUxFTUVOVF9UQUcgPSAiYmluZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklOSVRJT05fRUxFTUVOVF9UQUcgPSAiZGVmaW5pdGlvbnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVEFUSU9OX0VMRU1FTlRfVEFHID0gImRvY3VtZW50YXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQVVMVF9FTEVNRU5UX1RBRyA9ICJmYXVsdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FTEVNRU5UX1RBRyA9ICJpbXBvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9FTEVNRU5UX1RBRyA9ICJpbnB1dCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfRUxFTUVOVF9UQUcgPSAibWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9FTEVNRU5UX1RBRyA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRUxFTUVOVF9UQUcgPSAib3V0cHV0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9FTEVNRU5UX1RBRyA9ICJwYXJ0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9FTEVNRU5UX1RBRyA9ICJwb3J0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFX0VMRU1FTlRfVEFHID0gInBvcnRUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9FTEVNRU5UX1RBRyA9ICJzZXJ2aWNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRVNfRUxFTUVOVF9UQUcgPSAidHlwZXMiOwotCi0gIC8vIGNvbW1vbgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9BVFRSSUJVVEUgPSAibWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfQVRUUklCVVRFID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURSA9ICJ0eXBlIjsKLQotICAvLyBkZWZpbml0aW9ucwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFTkNPRElOR19BVFRSSUJVVEUgPSAiZW5jb2RpbmciOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVJHRVROQU1FU1BBQ0VfQVRUUklCVVRFID0gInRhcmdldE5hbWVzcGFjZSI7Ci0KLSAgLy8gYmluZGluZwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9VUklfQVRUUklCVVRFID0gInJlc291cmNlVVJJIjsKLQotICAvLyBwYXJ0Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVMRU1FTlRfQVRUUklCVVRFID0gImVsZW1lbnQiOwotICAKLSAgLy8gaW1wb3J0Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExPQ0FUSU9OX0FUVFJJQlVURSA9ICJsb2NhdGlvbiI7IAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRUUklCVVRFID0gIm5hbWVzcGFjZSI7ICAKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYU0RfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIFRoZSB2YWx1ZSA8Y29kZT5odHRwOi8vd3d3LnczLm9yZy8xOTk5L1hNTFNjaGVtYSI8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzE5OTkgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUxTY2hlbWEiOwotCi0gIC8qKgotICAgKiBUaGUgdmFsdWUgPGNvZGU+Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvWE1MU2NoZW1hIjwvY29kZT4uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMF8xMCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL1hNTFNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIFRoZSB2YWx1ZSA8Y29kZT4iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPC9jb2RlPi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVMRU1FTlRfVEFHUyA9Ci0gICAgbmV3IFN0cmluZ1tdIHsKLSAgICAgIEJJTkRJTkdfRUxFTUVOVF9UQUcsCi0gICAgICBERUZJTklUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgRE9DVU1FTlRBVElPTl9FTEVNRU5UX1RBRywKLSAgICAgIEZBVUxUX0VMRU1FTlRfVEFHLAotICAgICAgSU1QT1JUX0VMRU1FTlRfVEFHLAotICAgICAgSU5QVVRfRUxFTUVOVF9UQUcsCi0gICAgICBNRVNTQUdFX0VMRU1FTlRfVEFHLAotICAgICAgT1BFUkFUSU9OX0VMRU1FTlRfVEFHLAotICAgICAgT1VUUFVUX0VMRU1FTlRfVEFHLAotICAgICAgUEFSVF9FTEVNRU5UX1RBRywKLSAgICAgIFBPUlRfRUxFTUVOVF9UQUcsCi0gICAgICBQT1JUX1RZUEVfRUxFTUVOVF9UQUcsCi0gICAgICBTRVJWSUNFX0VMRU1FTlRfVEFHLAotICAgICAgVFlQRVNfRUxFTUVOVF9UQUcgfTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBub2RlVHlwZShTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFTEVNRU5UX1RBR1MubGVuZ3RoOyArK2kpCi0gICAgewotICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoRUxFTUVOVF9UQUdTW2ldKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vZGVUeXBlKE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiBpc1dTRExOYW1lc3BhY2Uobm9kZS5nZXROYW1lc3BhY2VVUkkoKSkgPyBub2RlVHlwZShub2RlLmdldExvY2FsTmFtZSgpKSA6IC0xOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGlzIHRoZSBXU0RMIG5hbWVzcGFjZSBvciBub3QuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgYSBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gbmFtZXNwYWNlIGlzIHRoZSBXU0RMIG5hbWVzcGFjZSBvciBub3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXU0RMTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpCi0gIHsKLSAgICByZXR1cm4gV1NETF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2UpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmdOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZTEsIFN0cmluZyBuYW1lc3BhY2UyKQotICB7Ci0gICAgcmV0dXJuIChuYW1lc3BhY2UxID09IG51bGwgPyBuYW1lc3BhY2UyID09IG51bGwgOiBuYW1lc3BhY2UxLmVxdWFscyhuYW1lc3BhY2UyKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA/IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExSZXNvdXJjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9XU0RMUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDg1NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL1dTRExSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5EZWZpbml0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZTwvYj4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtb2RlbC4KLSAqIFRoaXMgc3BlY2lhbGl6ZWQgcmVzb3VyY2UgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgaXQncyBvd24gd2F5IG9mIG1ha2luZyBrZXlzIGFuZCAKLSAqIGhyZWZzLCBhbmQgaXQncyBvd24gc2VyaWFsaXphdGlvbi4gVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgZm9yIHN1YmNsYXNzaW5nIAotICogb3V0c2lkZSBvZiB0aGUgbW9kZWwgaW1wbGVtZW50YXRpb247IGl0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgaXMgd2l0aCB0aGUgCi0gKiBSZXNvdXJjZSBmcmFtZXdvcmsuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFJlc291cmNlSW1wbCBleHRlbmRzIFJlc291cmNlSW1wbCAKLXsKLQotICBwcml2YXRlIGJvb2xlYW4gdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRpbnVlT25Mb2FkRXJyb3IgPSB0cnVlOwotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9FWFRFTlNJT05fRkFDVE9SSUVTID0gIlVTRV9FWFRFTlNJT05fRkFDVE9SSUVTIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVElOVUVfT05fTE9BRF9FUlJPUiA9ICJDT05USU5VRV9PTl9MT0FEX0VSUk9SIjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETF9FTkNPRElORyA9ICJXU0RMX0VOQ09ESU5HIjsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuIAotICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAqIAotICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4gCi0gICAqIEBnZW5lcmF0ZWQKLSAgICovCi0gIHB1YmxpYyBXU0RMUmVzb3VyY2VJbXBsKFVSSSB1cmkpCi0gIHsKLSAgICBzdXBlcih1cmkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvcywgTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZ2V0RGVmaW5pdGlvbigpOwotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgICBpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgKChEZWZpbml0aW9uSW1wbCkgZGVmaW5pdGlvbikudXBkYXRlRG9jdW1lbnQoKTsKLSAgICAgICAgZG9jdW1lbnQgPSBkZWZpbml0aW9uLmdldERvY3VtZW50KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZWZpbml0aW9uLmdldEVsZW1lbnQoKSA9PSBudWxsKQotICAgICAgewotICAgICAgICAoKERlZmluaXRpb25JbXBsKSBkZWZpbml0aW9uKS51cGRhdGVFbGVtZW50KCk7Ci0gICAgICB9Ci0KLSAgICAgIGRvU2VyaWFsaXplKG9zLCBkb2N1bWVudCwgb3B0aW9ucyA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIG9wdGlvbnMuZ2V0KFdTRExfRU5DT0RJTkcpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UncyBEZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29udGVudHMoKS5zaXplKCkgPT0gMSAmJiBnZXRDb250ZW50cygpLmdldCgwKSBpbnN0YW5jZW9mIERlZmluaXRpb24gPyAoRGVmaW5pdGlvbikgZ2V0Q29udGVudHMoKS5nZXQoMCkgOiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1NlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBkb1NlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGRvY3VtZW50LCBudWxsKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZG9TZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7Ci0gICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk1FVEhPRCwgInhtbCIpOwotICAgICAgCi0gICAgICAvLyBVbmxlc3MgYSB3aWR0aCBpcyBzZXQsIHRoZXJlIHdpbGwgYmUgb25seSBsaW5lIGJyZWFrcyBidXQgbm8gaW5kZW50YXRpb24uCi0gICAgICAvLyBUaGUgSUJNIEpESyBhbmQgdGhlIFN1biBKREsgZG9uJ3QgYWdyZWUgb24gdGhlIHByb3BlcnR5IG5hbWUsCi0gICAgICAvLyBzbyB3ZSBzZXQgdGhlbSBib3RoLgotICAgICAgLy8KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOwotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsKLSAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBlbmNvZGluZyk7Ci0gICAgICB9Ci0KLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMb2FkcyBhIG5ldyB7QGxpbmsgV1NETFJlc291cmNlSW1wbH0gaW50byB0aGUgcmVzb3VyY2Ugc2V0LgotICAgKiBAcGFyYW0gcmVzb3VyY2VTZXQgdGhlIHJlc291cmNlIHNldCB0byBob2xkIHRoZSBuZXcgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcgcmVzb3VyY2UuCi0gICAqIEBwYXJhbSBvcHRpb25zIGFueSBvcHRpb25zIHRvIGluZmx1ZW5jZSBsb2FkaW5nIGJlaGF2aW9yLgotICAgKiBAcmV0dXJuIGEgbmV3IFdTRExSZXNvdXJjZUltcGwuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFRoaXMgcGF0dGVybiBhdm9pZHMgbG9hZGluZyB0aGUgSVByb2dyZXNzTW9uaXRvciBjbGFzcyB3aGVuIHRoZXJlIGlzIG5vIHByb2dyZXNzIG1vbml0b3IuCi0gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHN0YW5kLWFsb25lIGV4ZWN1dGlvbiB0byB3b3JrIGNvcnJlY3RseS4KLSAgICAvLwotICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLSAgICBPYmplY3QgbW9uaXRvciA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLmdldCgiV1NETF9QUk9HUkVTU19NT05JVE9SIik7Ci0gICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9ncmVzc01vbml0b3IgPSAoSVByb2dyZXNzTW9uaXRvcikgbW9uaXRvcjsKLSAgICAgIHByb2dyZXNzTW9uaXRvci5zZXRUYXNrTmFtZShXU0RMUGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Jlc291cmNlTG9hZF9wcm9ncmVzcyIpKTsKLSAgICAgIHByb2dyZXNzTW9uaXRvci5zdWJUYXNrKGdldFVSSSgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIE9iamVjdCBiaW5kaW5ncyA9IG9wdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBvcHRpb25zLmdldChVU0VfRVhURU5TSU9OX0ZBQ1RPUklFUyk7Ci0gICAgaWYgKGJpbmRpbmdzICE9IG51bGwgJiYgYmluZGluZ3MgaW5zdGFuY2VvZiBCb29sZWFuKSAKLSAgICAgIC8vIHRydWUgYnkgZGVmYXVsdAotICAgICAgdXNlRXh0ZW5zaW9uRmFjdG9yaWVzID0gKChCb29sZWFuKWJpbmRpbmdzKS5ib29sZWFuVmFsdWUoKTsKLSAKLSAgICBPYmplY3QgY29udGludWVPbkVycm9yID0gb3B0aW9ucyA9PSBudWxsID8gbnVsbCA6IG9wdGlvbnMuZ2V0KENPTlRJTlVFX09OX0xPQURfRVJST1IpOwotICAgIGlmIChjb250aW51ZU9uRXJyb3IgIT0gbnVsbCAmJiBjb250aW51ZU9uRXJyb3IgaW5zdGFuY2VvZiBCb29sZWFuKSAKLSAgICAgIC8vIHRydWUgYnkgZGVmYXVsdAotICAgIAljb250aW51ZU9uTG9hZEVycm9yID0gKChCb29sZWFuKWNvbnRpbnVlT25FcnJvcikuYm9vbGVhblZhbHVlKCk7Ci0gICAgCi0gICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgYSBET00gZG9jdW1lbnQKLSAgICAgIGRvYyA9IGdldERvY3VtZW50KGlucHV0U3RyZWFtLCBuZXcgSW50ZXJuYWxFcnJvckhhbmRsZXIoKSk7Ci0KLSAgICAgIGlmIChkb2MgIT0gbnVsbCAmJiBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFmaW5kRGVmaW5pdGlvbihkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGNvbnRpbnVlT25Mb2FkRXJyb3IpCi0gICAgICAgICAgICBoYW5kbGVEZWZpbml0aW9uRWxlbWVudChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihXU0RMUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX0VSUk9SX0lOVkFMSURfV1NETCIpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBoYW5kbGVEZWZpbml0aW9uRWxlbWVudChudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBpZiAoY29udGludWVPbkxvYWRFcnJvcikKLSAgICAgIHsKLSAgICAgICAgV1NETFBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLSAgICAgICAgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQobnVsbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAJdGhyb3cgZXhjZXB0aW9uOwotICAgIH0KLQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGkubmV4dCgpOwotCi0gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICAgIFR5cGVzIHR5cGVzID0gZGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCBlbCA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaiA9IHR5cGVzLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBlbCA9IChYU0RTY2hlbWFFeHRlbnNpYmlsaXR5RWxlbWVudCkgai5uZXh0KCk7Ci0gICAgICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IGVsLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIHNjaGVtYS5zZXRTY2hlbWFMb2NhdGlvbihnZXRVUkkoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZHMgYSBkb2N1bWVudCB1c2luZyBYZXJjZXMuCi0gICAqIEBwYXJhbSBpbnB1dFN0cmVhbSB0aGUgY29udGVudHMgdG8gcGFyc2UuCi0gICAqIEBwYXJhbSBlcnJvckhhbmRsZXIgdGhlIGhhbmRsZWQgdXNlZCBieSB0aGUgcGFyc2VyLgotICAgKiBAcmV0dXJuIGEgZG9jdW1lbnQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBDbGFzc0xvYWRlciBwcmV2aW91c0NsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLQotICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIGRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0KLSAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCi0gICAgICAvLyBUQkQgLSBSZXZpc2l0Ci0gICAgICAvL0VudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyID0gY3JlYXRlRW50aXR5UmVzb2x2ZXIoKTsKLSAgICAgIC8vZG9jdW1lbnRCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKLQotICAgICAgZG9jdW1lbnRCdWlsZGVyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpOwotCi0gICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShpbnB1dFN0cmVhbSk7Ci0gICAgICByZXR1cm4gZG9jdW1lbnQ7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSU9XcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJT1dyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZpb3VzQ2xhc3NMb2FkZXIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBmaW5kRGVmaW5pdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBpZiAoV1NETENvbnN0YW50cy5ub2RlVHlwZShlbGVtZW50KSA9PSBXU0RMQ29uc3RhbnRzLkRFRklOSVRJT04pCi0gICAgewotICAgICAgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAvKgotICAgICAgZm9yIChOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChmaW5kRGVmaW5pdGlvbigoRWxlbWVudCkgY2hpbGQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAqLwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaGFuZGxlRGVmaW5pdGlvbkVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICBpZiAoZWxlbWVudCA9PSBudWxsKQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgICAgKChEZWZpbml0aW9uSW1wbClkZWZpbml0aW9uKS5zZXRVc2VFeHRlbnNpb25GYWN0b3JpZXModXNlRXh0ZW5zaW9uRmFjdG9yaWVzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uSW1wbC5jcmVhdGVEZWZpbml0aW9uCi0JICAgIChlbGVtZW50LGdldFVSSSgpLnRvU3RyaW5nKCksdXNlRXh0ZW5zaW9uRmFjdG9yaWVzKTsKLSAgICB9Ci0gICAgZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0gICAgLy8gRG8gd2UgbmVlZCB0aGUgbmV4dCBsaW5lPwotICAgICgoRGVmaW5pdGlvbkltcGwpIGRlZmluaXRpb24pLnJlY29uY2lsZVJlZmVyZW5jZXModHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgc2VyaWFsaXplKG91dHB1dFN0cmVhbSwgZG9jdW1lbnQsIG51bGwpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGVuY29kaW5nKQotICB7Ci0gICAgZG9TZXJpYWxpemUob3V0cHV0U3RyZWFtLCBkb2N1bWVudCwgZW5jb2RpbmcpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBzZXJpYWxpemUob3V0cHV0U3RyZWFtLCBlbGVtZW50LCBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZW5jb2RpbmcpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBkb1NlcmlhbGl6ZShvdXRwdXRTdHJlYW0sIGVsZW1lbnQsIGVuY29kaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0gICAgewotICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZG9TZXJpYWxpemUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQotICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7Ci0gICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgZW5jb2RpbmcpOwotICAgICAgfQotCi0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShlbGVtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXRTdHJlYW0pKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgICB7Ci0gICAgICBXU0RMUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotICAgIH0KLSAgfQotIAotICBwcml2YXRlIGNsYXNzIEludGVybmFsRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV1NETCBQQVJTRSBFUlJPUjogIiArIGUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXU0RMIFBBUlNFIEZBVEFMIEVSUk9SOiAiICsgZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldTREwgUEFSU0UgV0FSTklORzogIiArIGUpOwotICAgIH0KLSAgfSAKLSAgCi0gIAotICBwdWJsaWMgdm9pZCBhdHRhY2hlZChFT2JqZWN0IGVPYmplY3QpCi0gIHsKLSAgICBzdXBlci5hdHRhY2hlZChlT2JqZWN0KTsKLSAgICAgCi0gICAgLy8gd2UgbmVlZCB0byBhdHRhY2ggYSBYU0RTY2hlbWFMb2NhdG9yIGluIG9yZGVyIHRvIHJlc29sdmUgaW5saW5lIHNjaGVtYSBsb2NhdGlvbnMKLSAgICAvLyBpZiB0aGVyZSdzIG5vdCBhbHJlYWR5IG9uZSBhdHRhY2hlZAotICAgIFhTRFNjaGVtYUxvY2F0b3IgeHNkU2NoZW1hTG9jYXRvciA9IChYU0RTY2hlbWFMb2NhdG9yKUVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBYU0RTY2hlbWFMb2NhdG9yLmNsYXNzKTsKLSAgICBpZiAoeHNkU2NoZW1hTG9jYXRvciA9PSBudWxsKQotICAgIHsKLSAgICAgIGdldFJlc291cmNlU2V0KCkuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5KCkpOyAgCi0gICAgfSAKLSAgICAKLSAgICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIERlZmluaXRpb25JbXBsKQotICAgIHsKLSAgICAgIERlZmluaXRpb25JbXBsIGRlZmluaXRpb24gPSAoRGVmaW5pdGlvbkltcGwpIGVPYmplY3Q7Ci0gICAgICBkZWZpbml0aW9uLnNldElubGluZVNjaGVtYUxvY2F0aW9ucyh0aGlzKTsgICAgCi0gICAgfQotICB9Ci0gIC8qCi0gIHB1YmxpYyB2b2lkIHNldElubGluZVNjaGVtYUxvY2F0aW9ucyhEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBpbmxpbmUgc2NoZW1hcyBsb2NhdGlvbiAKLSAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24uZ2V0RVR5cGVzKCk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBqID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGoubmV4dCgpOwotICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZWwuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgc2NoZW1hLnNldFNjaGVtYUxvY2F0aW9uKGdldFVSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9ICAKLSAgICAgIH0gICAgICAgIAotICAgIH0gICAgICAKLSAgfSovCi19IC8vV1NETFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9wYWNrYWdlLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRlYjc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08aHRtbD4KLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uLy4uLy4uLy4uLy4uLy9hcGlzdHlsZXMuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08dGl0bGU+V1NETCBNb2RlbCBBUEkgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08cD4KLSAgICAgICAgVGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIHdvcmsgd2l0aCB0aGUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L3A+Ci08dGFibGUgd2lkdGg9IjUwMCI+Ci08dHI+Ci08dGQ+Ci08cD4KLQkJVGhlIFdTREwgbW9kZWwgQVBJIGFsbG93cyBjbGllbnRzIHRvIGxvYWQsIG1vZGlmeSwgYW5kIHNhdmUgV1NETCAxLjEgZG9jdW1lbnRzLgotCQk8L3A+Ci08L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvcGFja2FnZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL3V0aWwvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNWEwZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC91dGlsL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxodG1sPgotCTxoZWFkPgotCQk8bWV0YQotCQkJbmFtZT0icm9vdCIKLQkKLQkJCWNvbnRlbnQ9Ii4uLy4uLy4uLy4uLy4uLy4uLyIgLz4KLQkJPHRpdGxlPldTREwgTW9kZWwgQVBJIE92ZXJ2aWV3PC90aXRsZT4KLQk8L2hlYWQ+Ci0KLQk8Ym9keT4KLQkJPGFic3RyYWN0PgotICAgICAgICBUaGUgV1NETCBtb2RlbCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gd29yayB3aXRoIHRoZSBXU0RMIDEuMSBkb2N1bWVudHMuCi0JCTwvYWJzdHJhY3Q+Ci0JCTxwPgotCQlUaGUgV1NETCBtb2RlbCBBUEkgYWxsb3dzIGNsaWVudHMgdG8gbG9hZCwgbW9kaWZ5LCBhbmQgc2F2ZSBXU0RMIDEuMSBkb2N1bWVudHMuCi0JCTwvcD4gCi0JPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1YjM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWM2ZDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi13c2l1aS5qYXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTExMTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2kudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjhiZjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2kudWkKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogd3NpdWkuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmNvbXBhdGliaWxpdHkuUGx1Z2luQWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlX1BST1ZJREVSX05BTUUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuYWN0aW9ucy5hY3Rpb25EZWxlZ2F0ZXMsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLmljb25zLAotIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLndpemFyZHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLndzdC53c2ksCi0gb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSwKLSBvcmcud3NkbDRqLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iMi4xIgotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKLVBsdWdpbi1DbGFzczogb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lVSVBsdWdpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4ZjVmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHdzaXVpLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZS53c2l1aS5qYXIgPSBzcmMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB3c2l1aS5qYXIKLW91dHB1dC53c2l1aS5qYXIgPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlYjExNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvaWNvbnMvZnVsbC9vYmoxNi92YWxpZGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvaWNvbnMvd3NpX2xvZ2ZpbGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy93c2lfbG9nZmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGIxMTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9pY29ucy93c2lfbG9nZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjA0ZTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIS0tIENvbnN0YW50cyBmb3Igc3RyaW5ncyAgCi0KLV9QTFVHSU5fTkFNRSAgICAgICAgICAgICAgICAgID0gU29hcCBNb25pdG9yCi1fUFJPVklERVJfTkFNRSAgICAgICAgICAgICAgICA9IEVjbGlwc2Uub3JnCi1fVUlfWE1MX0VESVRPUiAgICAgICAgICAgICAgICA9IFhNTCBFZGl0b3IKLV9VSV9XU0lfVkFMSURBVE9SICAgICAgICAgICAgID0gV1MtSSBNZXNzYWdlIFZhbGlkYXRvcgotX1VJX0FDVElPTl9WQUxJREFURSAgICAgICAgICAgPSBWYWxpZGF0ZSBXUy1JIExvZyBGaWxlCi1fVUlfV0laQVJEX1ZBTElEQVRFX0xPR19USVRMRSA9IFZhbGlkYXRlIFdTLUkgTWVzc2FnZSBMb2cgRmlsZQotCi0KLV9VSV9WSUVXX1NTX0ZJTEVfSU1QT1JUX0JVVFRPTiA9IEltcG9ydCBGaWxlcy4uLgotX1VJX1ZJRVdfU1NfRklMRV9TT1VSQ0VfRklMRVMgPSBXb3JrYmVuY2ggRmlsZXMKLQotX1VJX0RJQUxPR19TU19GSUxFX1NIRUxMX1RFWFQgID0gU2VsZWN0IEZpbGUKLV9VSV9ESUFMT0dfU1NfRklMRV9USVRMRSAgICAgICA9IFNlbGVjdCBhIEZpbGUKLV9VSV9ESUFMT0dfU1NfRklMRV9ERVNDUklQVElPTiA9IFNlbGVjdCBhIGZpbGUgZnJvbSB0aGUgd29ya2JlbmNoLgotCi1fVUlfV0laQVJEX1ZfU0VMRUNUX0xPR19GSUxFTkFNRV9IRUFESU5HICAgPSBTcGVjaWZ5IHRoZSBXUy1JIE1lc3NhZ2UgTG9nIEZpbGUgTmFtZQotX1VJX1dJWkFSRF9WX1NFTEVDVF9MT0dfRklMRU5BTUVfRVhQTCAgICAgID0gU2VsZWN0IGEgZm9sZGVyIGFuZCBzcGVjaWZ5IGEgbWVzc2FnZSBsb2cgZmlsZSBuYW1lCi1fVUlfV0laQVJEX1ZfU0VMRUNUX1dTRExfRklMRU5BTUVfSEVBRElORyAgPSBJbmNsdWRlIFdTREwgRmlsZQotX1VJX1dJWkFSRF9WX1NFTEVDVF9XU0RMX0ZJTEVOQU1FX0VYUEwgICAgID0gT3B0aW9uYWxseSBzZWxlY3QgYSBXU0RMIGZpbGUgZm9yIHRoZSBXZWIgc2VydmljZQotX1VJX1dJWkFSRF9WX1NFTEVDVF9XU0RMX0VMRU1FTlRfSEVBRElORyAgID0gU3BlY2lmeSB0aGUgV1NETCBlbGVtZW50IHRvIGJlIEFuYWx5emVkCi1fVUlfV0laQVJEX1ZfU0VMRUNUX1dTRExfRUxFTUVOVF9FWFBMICAgICAgPSBJbmRpY2F0ZSB0aGUgbmFtZSwgdHlwZSwgYW5kIG5hbWVzcGFjZSBvZiB0aGUgV1NETCBlbGVtZW50IHRvIGJlIGFuYWx5emVkCi0KLV9VSV9XSVpBUkRfVl9JTkNMVURFX1dTRExfQlVUVE9OICAgICAgICAgICA9IEluY2x1ZGUgV1NETCBkb2N1bWVudCBmb3IgV2ViIHNlcnZpY2UKLV9VSV9XSVpBUkRfVl9JTkNMVURFX1dTRExfTEFCRUwgICAgICAgICAgICA9IEVudGVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgV1NETCBkb2N1bWVudCBmb3IgdGhlIFdlYiBzZXJ2aWNlCi1fVUlfV0laQVJEX1ZfVkFMSURfV1NETF9MQUJFTCAgICAgICAgICAgICAgPSAqTm90ZTogWW91IGNhbiBvbmx5IHNlbGVjdCB0aGUgTmV4dCBidXR0b24gaWYgdGhlIFdTREwgZG9jdW1lbnQgaXMgdmFsaWQuCi1fVUlfV0laQVJEX1ZfV09SS0JFTkNIX0JVVFRPTiAgICAgICAgICAgICAgPSBXb3JrYmVuY2guLi4KLV9VSV9XSVpBUkRfVl9CUk9XU0VfQlVUVE9OICAgICAgICAgICAgICAgICA9IEJyb3dzZS4uLgotX1VJX1dJWkFSRF9WX1NFQVJDSF9VRERJX0JVVFRPTiAgICAgICAgICAgID0gU2VhcmNoIFVEREkuLi4KLQotX1VJX1dJWkFSRF9WX0dST1VQX1RFWFRfRUxFTUVOVCAgICAgICAgICAgID0gVGhlIFdTREwgZWxlbWVudAotX1VJX1dJWkFSRF9WX0dST1VQX1RFWFRfVFlQRSAgICAgICAgICAgICAgID0gdHlwZQotX1VJX1dJWkFSRF9WX1JBRElPX1BPUlQgICAgICAgICAgICAgICAgICAgID0gcG9ydAotX1VJX1dJWkFSRF9WX1JBRElPX0JJTkRJTkcgICAgICAgICAgICAgICAgID0gYmluZGluZwotX1VJX1dJWkFSRF9WX1JBRElPX1BPUlRfVFlQRSAgICAgICAgICAgICAgID0gcG9ydFR5cGUKLV9VSV9XSVpBUkRfVl9SQURJT19PUEVSQVRJT04gICAgICAgICAgICAgICA9IG9wZXJhdGlvbgotX1VJX1dJWkFSRF9WX1JBRElPX01FU1NBR0UgICAgICAgICAgICAgICAgID0gbWVzc2FnZQotX1VJX1dJWkFSRF9WX0xBQkVMX05BTUUgICAgICAgICAgICAgICAgICAgID0gbmFtZToKLV9VSV9XSVpBUkRfVl9MQUJFTF9OQU1FU1BBQ0UgICAgICAgICAgICAgICA9IG5hbWVzcGFjZToKLV9VSV9XSVpBUkRfVl9MQUJFTF9QQVJFTlQgICAgICAgICAgICAgICAgICA9IHBhcmVudDoKLQotX1VJX0xPR19FRElUT1IgICAgICAgICAgICAgICAgICAgID0gVGV4dCBFZGl0b3IKLV9VSV9XU0lfVkFMSURBVE9SICAgICAgICAgICAgICAgICA9IFdTLUkgTWVzc2FnZSBWYWxpZGF0b3IKLV9VSV9BQ1RJT05fVkFMSURBVEUgICAgICAgICAgICAgICA9IFZhbGlkYXRlIFdTLUkgTG9nIEZpbGUKLV9VSV9XSVpBUkRfVkFMSURBVEVfTE9HX1RJVExFICAgICAgICAgICA9IFZhbGlkYXRlIFdTLUkgTWVzc2FnZSBMb2cgRmlsZQotX1VJX1dJWkFSRF9TRUxFQ1RfTE9HX0ZJTEVOQU1FX0hFQURJTkcgID0gU3BlY2lmeSB0aGUgV1MtSSBNZXNzYWdlIExvZyBGaWxlIE5hbWUKLV9VSV9XSVpBUkRfU0VMRUNUX0xPR19GSUxFTkFNRV9FWFBMICAgICA9IFNlbGVjdCBhIGZvbGRlciBhbmQgc3BlY2lmeSBhIG1lc3NhZ2UgbG9nIGZpbGUgbmFtZQotCi1fVUlfVkFMSURBVElPTl9GQUlMRUQgICAgICAgICAgICAgPSBWYWxpZGF0aW9uIEZhaWxlZAotX1VJX1VOQUJMRV9UT19WQUxJREFURSAgICAgICAgICAgID0gVW5hYmxlIHRvIFZhbGlkYXRlCi1fVUlfVEhFX1dTSU1TR19GSUxFX0lTX05PVF9WQUxJRCAgPSBUaGUgV1MtSSBNZXNzYWdlIExvZyBmaWxlIGlzIG5vdCB2YWxpZC4gIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIHRoZSB2YWxpZGF0aW9uIGVycm9ycy4KLV9VSV9QUk9CTEVNU19SRUFESU5HX1dTSU1TR19GSUxFICA9IFByb2JsZW1zIHJlYWRpbmcgdGhlIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4gIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIGVycm9ycy4KLV9VSV9WQUxJREFUSU9OX1NVQ0VFREVEICAgICAgICAgICA9IFZhbGlkYXRpb24gU3VjY2VlZGVkCi1fVUlfVkFMSURBVElPTl9XQVJOSU5HU19ERVRFQ1RFRCAgPSBIb3dldmVyIHdhcm5pbmdzIGhhdmUgYmVlbiBpc3N1ZWQuIFNlZSB0aGUgUHJvYmxlbXMgdmlldyBmb3IgYSBsaXN0IG9mIHRoZSB2YWxpZGF0aW9uIHdhcm5pbmdzLgotX1VJX1RIRV9XU0lNU0dfRklMRV9JU19WQUxJRCAgICAgID0gVGhlIFdTLUkgTWVzc2FnZSBMb2cgZmlsZSBpcyB2YWxpZC4KLV9VSV9WQUxJREFUSU9OX0ZBSUxFRCAgICAgICAgICAgICA9IFZhbGlkYXRpb24gRmFpbGVkCi1fVUlfTUVTU0FHRV9MSU1JVEVfRVhDRUVERUQgICAgICAgPSBUaGUgV1MtSSBNZXNzYWdlIExvZyBmaWxlIGlzIG5vdCB2YWxpZC4gIFRoZSBtZXNzYWdlIGxpbWl0IGZvciB0aGUgUHJvYmxlbXMgdmlldyBoYXMgYmVlbiBleGNlZWRlZC4gIFBsZWFzZSBpbmNyZWFzZSB0aGUgbGltaXQgYW5kIHRyeSBhZ2Fpbi4KLQotX0VSUk9SX0lOVkFMSURfTE9HX0ZJTEVfRVhURU5TSU9OID0gVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gY2FuIG9ubHkgYmUgIi53c2ltc2ciLgotX1dBUk5JTkdfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgID0gV2FybmluZzogVGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4uIAotX0VSUk9SX0lOVkFMSURfTE9HX0ZJTEVfRVhURU5TSU9OID0gVGhlIGZpbGUgbmFtZSBleHRlbnNpb24gY2FuIG9ubHkgYmUgIi53c2ltc2ciLgotX1dBUk5JTkdfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgID0gV2FybmluZzogVGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4uIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2U3MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4gCi0KLTxwbHVnaW4+Ci0KLSAgICAKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gUHVycG9zZTogQWRkIHZhbGlkYXRvciBhY3Rpb24gdG8gVENQSVAgbW9uaXRvci4gICAgICAgICAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS51aS52aWV3QWN0aW9ucyAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld0FjdGlvbnMiPgotICAgICAgPHZpZXdDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QubW9uaXRvci52aWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmFydGljbGVzLmFjdGlvbi5jb250cmlidXRpb24udmlldyI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iV1MtSSBQcm9maWxlIFZhbGlkYXRvciIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJV9VSV9XSVpBUkRfVkFMSURBVEVfTE9HX1RJVExFIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuYWN0aW9ucy5hY3Rpb25EZWxlZ2F0ZXMuVmFsaWRhdGVXU0lQcm9maWxlQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iZ3JvdXAxIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuYWN0aW9uRGVsZWdhdGVzLlZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC92aWV3Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24tLT4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBQdXJwb3NlOiBUbyByZWdpc3RlciBXUy1JIG1lc3NhZ2UgdmFsaWRhdG9yLiAgICAgICAgICAgIC0tPgotPCEtLSBFeHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLnVpLnZpZXdBY3Rpb25zICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLWV4dGVuc2lvbgotICAgICAgICAgaWQ9IndzaVZhbGlkYXRvciIKLSAgICAgICAgIG5hbWU9IiVfVUlfV1NJX1ZBTElEQVRPUiIKLSAgICAgICAgIHBvaW50PSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIqLndzaW1zZyI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxoZWxwZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJjb20uaWJtLmV0b29scy54bWwudG9vbHMudmFsaWRhdGlvbi5IZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0iIGNvbS5pYm0uZXRvb2xzLndzaS50ZXN0LnRvb2xzLnZhbGlkYXRlLldTSU1lc3NhZ2VWYWxpZGF0b3IiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uLS0+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9Mb2dCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvTG9nQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI5YTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9Mb2dCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5CYXNlNjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uQWRkU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLmltcGwuQWRkU3R5bGVTaGVldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZ1dyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLmltcGwuTG9nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLmltcGwuTG9nV3JpdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLmltcGwuTWVzc2FnZUVudHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuTWFuSW5UaGVNaWRkbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLmltcGwuQ29tbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLmltcGwuTWFuSW5UaGVNaWRkbGVJbXBsOwotCi0vKioKLSAqIEdpdmVuIGEgbGlzdCBvZiBSZXF1ZXN0UmVzcG9uc2VzIGZyb20gYSBUQ1BJUCBNb25pdG9yLCAKLSAqIHRoaXMgY2xhc3MgYnVpbGRzIGEgV1MtSSBjb21wbGlhbnQgTWVzc2FnZSBMb2cgZmlsZS4KLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICovCi1wdWJsaWMgY2xhc3MgTG9nQnVpbGRlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMCwgMjAwMi4iOwotCi0gIC8qKgotICAgKiBJRHMgdG8gaWRlbnRpZnkgcmVxdWVzdHMgYW5kIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBjb252ZXJzYXRpb25JZCA9IDE7Ci0KLSAgLyoqCi0gICAqIElEcyB0byB1bmlxdWVseSBpZGVudGlmeSBlYWNoIGFuZCBldmVyeSBtZXNzYWdlIHdpdGhpbiB0aGUgbG9nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGlkID0gMTsKLQotICAvKioKLSAgICogVGhlIGxpc3Qgb2YgUmVxdWVzdFJlc3BvbmNlcyBmcm9tIGEgVENQSVAgTW9uaXRvciB1c2VkIHRvIGdlbmVyYXRlIHRoZSBsb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBSZXF1ZXN0W10gcmVxdWVzdFJlc3BvbnNlczsKLQotICAvKioKLSAgICogVGhlIGFjdHVhbCBsb2cgb2JqZWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIExvZyBsb2cgPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgbG9nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgSUZpbGUgaWZpbGU7Ci0KLSAgLyoqCi0gICAqIFRvb2wgaW5mb3JtYXRpb24gcHJvcGVydHkgdmFsdWVzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTkFNRSA9ICJNb25pdG9yIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfVkVSU0lPTiA9ICIxLjAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTF9SRUxFQVNFX0RBVEUgPSAiMjAwMy0wMy0yMCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX0lNUExFTUVOVEVSID0gIklCTSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX0xPQ0FUSU9OID0gIiI7Ci0KLSAgLyoqCi0gICAqIFByb3BlcnRpZXMgb2YgYSBSZXF1ZXN0UmVzcG9uc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUkVRVUVTVF9IRUFERVIgPSAicmVxdWVzdC1oZWFkZXIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfUkVTUE9OU0VfSEVBREVSID0gInJlc3BvbnNlLWhlYWRlciI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFUVVFU1RfQk9EWSA9ICJodHRwLXJlcXVlc3QtYm9keSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFU1BPTlNFX0JPRFkgPSAiaHR0cC1yZXNwb25zZS1ib2R5IjsKLQotICAvKioKLSAgICogQ29tbW9uIHRpbWVzdGFtcCBmb3JtYXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgdGltZXN0YW1wRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQgKCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTJ1onIik7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gaWZpbGU6IHRoZSBmaWxlIGhhbmRsZXIgZm9yIHRoZSBsb2cuCi0gICAqLwotICBwdWJsaWMgTG9nQnVpbGRlcihJRmlsZSBpZmlsZSkKLSAgewotICAgIHRoaXMuaWZpbGUgPSBpZmlsZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGJ1aWxkcyBhbmQgdGhlbiByZXR1cm5zIGEgbG9nIGJhc2VkIG9uIHRoZSBsaXN0IG9mIHJlcXVlc3QtcmVzcG9uc2UgcGFpcnMuCi0gICAqIEBwYXJhbSByZXF1ZXN0UmVzcG9uc2VzOiBhIGxpc3Qgb2YgbWVzc2FnZXMgaW4gdGhlIGZvcm0gb2YgcmVxdWVzdC1yZXNwb25zZSBwYWlycy4KLSAgICogQHJldHVybiBhIGxvZyBiYXNlZCBvbiBhIGxpc3Qgb2YgcmVxdWVzdC1yZXNwb25zZSBwYWlycy4KLSAgICovCi0gIHB1YmxpYyBMb2cgYnVpbGRMb2coUmVxdWVzdFtdIHJlcXVlc3RSZXNwb25zZXMpCi0gIHsKLSAgICB0aGlzLnJlcXVlc3RSZXNwb25zZXMgPSByZXF1ZXN0UmVzcG9uc2VzOwotCi0gICAgbG9nID0gbmV3IExvZ0ltcGwoKTsKLSAgICBsb2dNb25pdG9ySW5mb3JtYXRpb24oKTsKLQotICAgIC8vIGxvZyB0aGUgbWVzc2FnZXMKLSAgICBmb3IgKGludCBpPTA7IGk8cmVxdWVzdFJlc3BvbnNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBSZXF1ZXN0IHJyID0gcmVxdWVzdFJlc3BvbnNlc1tpXTsKLSAgICAgIGlmICgocnIgIT0gbnVsbCkgJiYgKCFvbWl0UmVxdWVzdFJlc3BvbnNlKHJyKSkpCi0gICAgICB7Ci0gICAgICAgIGxvZ1JlcXVlc3RSZXNwb25zZShycik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsb2c7Ci0gIH0KLQotICAvKioKLSAgICogQ3VycmVudGx5IGEgbm8tb3AuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2dNb25pdG9ySW5mb3JtYXRpb24oKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogTG9nIHRoZSByZXF1ZXN0LXJlc3BvbnNlIHBhaXIuCi0gICAqQHBhcmFtIHJyOiBhIHJlcXVlc3QtcmVzcG9uc2UgcGFpci4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGxvZ1JlcXVlc3RSZXNwb25zZShSZXF1ZXN0IHJyKQotICB7Ci0gICAgaWYgKHJyICE9IG51bGwpCi0gICAgewotICAgICAgYnl0ZVtdIHJlcXVlc3QgPSByci5nZXRSZXF1ZXN0KFJlcXVlc3QuQUxMKTsKLSAgICAgIGJ5dGVbXSByZXNwb25zZSA9IHJyLmdldFJlc3BvbnNlKFJlcXVlc3QuQUxMKTsKLSAgICAgICAgCi0gICAgICBTdHJpbmcgcmVxdWVzdEhlYWRlciA9IG5ldyBTdHJpbmcocnIuZ2V0UmVxdWVzdChSZXF1ZXN0LlRSQU5TUE9SVCkpOwotICAgICAgU3RyaW5nIHJlc3BvbnNlSGVhZGVyID0gbmV3IFN0cmluZyhyci5nZXRSZXNwb25zZShSZXF1ZXN0LlRSQU5TUE9SVCkpOwotICAgICAgYnl0ZVtdIHVuY2h1bmtlZFJlcXVlc3RCb2R5ID0gcnIuZ2V0UmVxdWVzdChSZXF1ZXN0LkNPTlRFTlQpOwotICAgICAgYnl0ZVtdIHVuY2h1bmtlZFJlc3BvbnNlQm9keSA9IHJyLmdldFJlc3BvbnNlKFJlcXVlc3QuQ09OVEVOVCk7Ci0gICAgICBTdHJpbmcgcmVxdWVzdEJvZHkgPSBudWxsOwotICAgICAgU3RyaW5nIHJlc3BvbnNlQm9keSA9IG51bGw7Ci0KLSAgICAgIGlmICh1bmNodW5rZWRSZXF1ZXN0Qm9keSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXF1ZXN0Qm9keSA9IG5ldyBTdHJpbmcoQmFzZTY0LmVuY29kZSh1bmNodW5rZWRSZXF1ZXN0Qm9keSkpOyAKLSAgICAgIH0KLQotICAgICAgaWYgKHVuY2h1bmtlZFJlc3BvbnNlQm9keSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXNwb25zZUJvZHkgPSBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUodW5jaHVua2VkUmVzcG9uc2VCb2R5KSk7IAotICAgICAgfQotCi0gICAgICBsb25nIHRpbWVzdGFtcCA9IHJyLmdldERhdGUoKS5nZXRUaW1lKCk7Ci0gICAgICBTdHJpbmcgbG9jYWxIb3N0QW5kUG9ydCA9ICJsb2NhbGhvc3Q6IiArIHJyLmdldExvY2FsUG9ydCgpOwotICAgICAgU3RyaW5nIHJlbW90ZUhvc3RBbmRQb3J0ID0gcnIuZ2V0UmVtb3RlSG9zdCgpICsgIjoiICsgcnIuZ2V0UmVtb3RlUG9ydCgpOwotCi0gICAgICBpbnQgcmVxdWVzdElkICA9IGdldE5leHRBdmFpbGFibGVJZCgpOwotICAgICAgaW50IHJlc3BvbnNlSWQgPSBnZXROZXh0QXZhaWxhYmxlSWQoKTsKLSAgICAgIGludCBjb252ZXJzYXRpb25JZCA9IGdldE5leHRBdmFpbGFibGVDb252ZXJzYXRpb25JZCgpOwotCi0gICAgICBNZXNzYWdlRW50cnkgbWVzc2FnZUVudHJ5UmVxdWVzdCA9IGNyZWF0ZU1lc3NhZ2VFbnRyeShyZXF1ZXN0SWQsIGNvbnZlcnNhdGlvbklkLCAKLSAgICAgICAgICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNULCB0aW1lc3RhbXAsIGxvY2FsSG9zdEFuZFBvcnQsCi0gICAgICAgICAgICAgICAgcmVtb3RlSG9zdEFuZFBvcnQsIHJlcXVlc3RCb2R5LCByZXF1ZXN0SGVhZGVyKTsKLQotICAgICAgTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeVJlc3BvbnNlID0gY3JlYXRlTWVzc2FnZUVudHJ5KHJlc3BvbnNlSWQsIGNvbnZlcnNhdGlvbklkLCAKLSAgICAgICAgICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSwgdGltZXN0YW1wICsgcnIuZ2V0UmVzcG9uc2VUaW1lKCksIHJlbW90ZUhvc3RBbmRQb3J0LAotICAgICAgICAgICAgICAgIGxvY2FsSG9zdEFuZFBvcnQsIHJlc3BvbnNlQm9keSwgcmVzcG9uc2VIZWFkZXIpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmICgobWVzc2FnZUVudHJ5UmVxdWVzdCAhPSBudWxsKSAmJiBpc01lc3NhZ2VXaXRoQnJhY2tldHMocmVxdWVzdEJvZHkpKQotICAgICAgICB7Ci0gICAgICAgICAgIGlmIChtZXNzYWdlRW50cnlSZXNwb25zZSAhPSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgbG9nLmFkZExvZ0VudHJ5KG1lc3NhZ2VFbnRyeVJlcXVlc3QpOwotICAgICAgICAgICAgIGxvZy5hZGRMb2dFbnRyeShtZXNzYWdlRW50cnlSZXNwb25zZSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBpZ25vcmUgdGhlIHJlcXVlc3QgcmVzcG9uc2UgcGFpcgotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgaGFzIGF0IGxlYXN0Ci0gICAqIG9uZSBsZWZ0IGFuZCBvbmUgcmlnaHQgYnJhY2tldC4KLSAgICogQHBhcmFtIG1lc3NhZ2U6IGEgbWVzc2FnZSBjb250ZW50LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIG1lc3NhZ2UgaGFzIGF0IGxlYXN0Ci0gICAqICAgICAgICAgb25lIGxlZnQgYW5kIG9uZSByaWdodCBicmFja2V0LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlV2l0aEJyYWNrZXRzKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgcmV0dXJuICgobWVzc2FnZSAhPSBudWxsKSAmJiAKLSAgICAgICAgICAgIChtZXNzYWdlLmluZGV4T2YoIjwiKSE9IC0xKSAmJiAKLSAgICAgICAgICAgIChtZXNzYWdlLmluZGV4T2YoIj4iKSAhPSAtMSkpOwotICB9Ci0gICAgICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIGxvZyBlbnRyeS4KLSAgICogQHBhcmFtIGlkOiB1bmlxdWUgbWVzc2FnZSBpZCB3aXRoaW4gdGhlIGxvZy4KLSAgICogQHBhcmFtIGNvbnZlcnNhdGlvbklkOiBjb252ZXJzYXRpb24gaWQgdG8gaWRlbnRpZnkgcmVxdWVzdC1yZXNwb25zZSBwYWlycy4KLSAgICogQHBhcmFtIHR5cGU6IHR5cGUgaW5kaWNhdGluZyBhIHJlcXVlc3Qgb3IgcmVzcG9uc2UuCi0gICAqIEBwYXJhbSB0aW1lc3RhbXA6IHRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2VuZGVySG9zdEFuZFBvcnQ6IHRoZSBob3N0IGFuZCBwb3J0IG9mIHRoZSBzZW5kZXIuCi0gICAqIEBwYXJhbSByZWNlaXZlckhvc3RBbmRQb3J0OiB0aGUgaG9zdCBhbmQgcG9ydCBvZiB0aGUgcmVjZWl2ZXIuCi0gICAqIEBwYXJhbSBtZXNzYWdlQ29udGVudDogdGhlIGNvbnRlbnQgb3IgYm9keSBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGhlYWRlcjogdGhlIGhlYWRlciBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHJldHVybiBhIGxvZyBlbnRyeS4KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlRW50cnkgY3JlYXRlTWVzc2FnZUVudHJ5KGludCBpZCwgaW50IGNvbnZlcnNhdGlvbklkLCBTdHJpbmcgdHlwZSwgbG9uZyB0aW1lc3RhbXAsIAotICAgICAgICBTdHJpbmcgc2VuZGVySG9zdEFuZFBvcnQsIFN0cmluZyByZWNlaXZlckhvc3RBbmRQb3J0LCBTdHJpbmcgbWVzc2FnZUNvbnRlbnQsIFN0cmluZyBoZWFkZXIpIAotICB7Ci0gCS8vIENyZWF0ZSBsb2cgZW50cnkKLSAgICBNZXNzYWdlRW50cnkgbWVzc2FnZUVudHJ5ID0gbmV3IE1lc3NhZ2VFbnRyeUltcGwoKTsKLQltZXNzYWdlRW50cnkuc2V0SFRUUEhlYWRlcnMoaGVhZGVyKTsKLQltZXNzYWdlRW50cnkuc2V0TWVzc2FnZShtZXNzYWdlQ29udGVudCk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldElkKFN0cmluZy52YWx1ZU9mKGlkKSk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldENvbnZlcnNhdGlvbklkKFN0cmluZy52YWx1ZU9mKGNvbnZlcnNhdGlvbklkKSk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldFR5cGUodHlwZSk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldFRpbWVzdGFtcChnZXRUaW1lc3RhbXAobmV3IERhdGUodGltZXN0YW1wKSkpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRTZW5kZXJIb3N0QW5kUG9ydChzZW5kZXJIb3N0QW5kUG9ydCk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldFJlY2VpdmVySG9zdEFuZFBvcnQocmVjZWl2ZXJIb3N0QW5kUG9ydCk7Ci0gICAgICAgICAgICAKLSAgICByZXR1cm4gbWVzc2FnZUVudHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIGlkLCB0aGVuIGluY3JlbWVudHMgdGhlIGlkIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF2YWlsYWJsZSBpZC4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgZ2V0TmV4dEF2YWlsYWJsZUlkKCkKLSAgewotICAgIHJldHVybiBpZCsrOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIGNvbnZlcnNhdGlvbiBpZCwgdGhlbiBpbmNyZW1lbnRzIHRoZSBjb252ZXJzYXRpb24gaWQgdmFsdWUuCi0gICAqIEEgY29udmVyc2F0aW9uIGlkIGlkZW50ZmllcyBhIHJlcXVlc3QgYW5kIGl0cyBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgotICAgKiBAcmV0dXJuIHRoZSBuZXh0IGF2YWlsYWJsZSBjb252ZXJhc2F0aW9uaWQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGdldE5leHRBdmFpbGFibGVDb252ZXJzYXRpb25JZCgpCi0gIHsKLSAgICByZXR1cm4gY29udmVyc2F0aW9uSWQrKzsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBmb3IgSFRUUCBtZXNzYWdlcyB0aGF0IHNob3VsZCBub3QgYmUgbG9nZ2VkLgotICAgKiBAcGFyYW0gcnI6IGEgcmVxdWVzdC1yZXNwb25zZSBwYWlyLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlcXVlc3QtcmVzcG9uc2UgcGFpciBzaG91bGQgYmUgb21pdHRlZCBmcm9tIHRoZSBsb2cuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gb21pdFJlcXVlc3RSZXNwb25zZShSZXF1ZXN0IHJyKSAKLSAgewotICAgIGJvb2xlYW4gb21pdCA9IGZhbHNlOwotICAgIGlmIChyciAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyByZXF1ZXN0ID0gcnIuZ2V0UmVxdWVzdChSZXF1ZXN0LlRSQU5TUE9SVCkudG9TdHJpbmcoKTsKLSAgICAgIGlmICgocmVxdWVzdCAhPSBudWxsKSAmJgotICAgICAgICAgICgocmVxdWVzdC5zdGFydHNXaXRoKCJDT05ORUNUIikpIHx8Ci0gICAgICAgICAgIChyZXF1ZXN0LnN0YXJ0c1dpdGgoIlRSQUNFIikpIHx8IAotICAgICAgICAgICAocmVxdWVzdC5zdGFydHNXaXRoKCJERUxFVEUiKSkgfHwgCi0gICAgICAgICAgIChyZXF1ZXN0LnN0YXJ0c1dpdGgoIk9QVElPTlMiKSkgfHwgCi0gICAgICAgICAgIChyZXF1ZXN0LnN0YXJ0c1dpdGgoIkhFQUQiKSkpKQotICAgICAgeyAKLSAgICAgICAgb21pdCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvbWl0OwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGxvZyBvdXQgdG8gZmlsZS4KLSAgICogQHBhcmFtIGxvZzogbG9nIHRvIGJlIHdyaXR0ZW4gdG8gZmlsZS4KLSAgICovCi0KLSAgcHVibGljIHZvaWQgd3JpdGVMb2coTG9nIGxvZykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBsb2cgd3JpdGVyCi0gICAgICBMb2dXcml0ZXIgbG9nV3JpdGVyID0gbmV3IExvZ1dyaXRlckltcGwoKTsKLSAgICAKLSAgICAgIGxvZ1dyaXRlci5zZXRXcml0ZXIoaWZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotICAgICAgCi0gICAgICAvLyBXcml0ZSBzdGFydCBvZiBsb2cgZmlsZQotICAgICAgbG9nV3JpdGVyLndyaXRlKG5ldyBTdHJpbmdSZWFkZXIobG9nLmdldFN0YXJ0WE1MU3RyaW5nKCIiKSkpOwotICAgIAotICAgICAgLy8gV3JpdGUgbW9uaXRvciB0b29sIGluZm9ybWF0aW9uCi0gICAgICBTdHJpbmcgbW9uaXRvckluZm8gPSBnZW5lcmF0ZU1vbml0b3JUb29sSW5mbygpOwotICAgICAgbG9nV3JpdGVyLndyaXRlKG5ldyBTdHJpbmdSZWFkZXIobW9uaXRvckluZm8pKTsKLQotICAgICAgZm9yIChpbnQgaT0wOyBpPGxvZy5nZXRFbnRyeUNvdW50KCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTWVzc2FnZUVudHJ5IG1lID0gbG9nLmdldExvZ0VudHJ5KGkpOwotICAgICAgICBsb2dXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihtZS50b1hNTFN0cmluZygiIikpKTsKLSAgICAgIH0KLSAgICAgIGxvZ1dyaXRlci53cml0ZShuZXcgU3RyaW5nUmVhZGVyKGxvZy5nZXRFbmRYTUxTdHJpbmcoIiIpKSk7Ci0gICAgICBsb2dXcml0ZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHRocm93biB3aGVuIHByaW50aW5nIGxvZyBmaWxlLiIpOwotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgWE1MIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgTW9uaXRvciB0b29sLgotICAgKiBAcmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE1vbml0b3IgdG9vbC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVNb25pdG9yVG9vbEluZm8oKQotICB7Ci0KLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOyAKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFRvb2wgaW5mb3JtYXRpb24KLSAgICAgIFRvb2xJbmZvIHRvb2xJbmZvID0gbmV3IFRvb2xJbmZvKFRPT0xfTkFNRSwgVE9PTF9WRVJTSU9OLCBUT09MX1JFTEVBU0VfREFURSwgVE9PTF9JTVBMRU1FTlRFUiwgVE9PTF9MT0NBVElPTik7Ci0KLSAgICAgIERvY3VtZW50RmFjdG9yeSBkb2N1bWVudEZhY3RvcnkgPSBEb2N1bWVudEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIE1vbml0b3JDb25maWcgbW9uaXRvckNvbmZpZyA9IGRvY3VtZW50RmFjdG9yeS5uZXdNb25pdG9yQ29uZmlnKCk7Ci0gICAgCi0gICAgICBDb21tZW50IGNvbW1lbnQgPSBuZXcgQ29tbWVudEltcGwoKTsKLSAgICAgIGNvbW1lbnQuc2V0VGV4dCgiQ29tbWVudCIpOwotICAgICAgbW9uaXRvckNvbmZpZy5zZXRDb21tZW50KGNvbW1lbnQpOwotICAgICAgbW9uaXRvckNvbmZpZy5zZXRMb2dMb2NhdGlvbigiVVJMIik7Ci0gICAgICBtb25pdG9yQ29uZmlnLnNldFJlcGxhY2VMb2codHJ1ZSk7Ci0KLSAgICAgIEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldCA9IG5ldyBBZGRTdHlsZVNoZWV0SW1wbCgpOwotICAgICAgbW9uaXRvckNvbmZpZy5zZXRBZGRTdHlsZVNoZWV0KGFkZFN0eWxlU2hlZXQpOwotCi0gICAgICBtb25pdG9yQ29uZmlnLnNldExvZ0R1cmF0aW9uKDYwMCk7Ci0gICAgICBtb25pdG9yQ29uZmlnLnNldFRpbWVvdXQoMyk7Ci0gICAgIAotICAgICAgTWFuSW5UaGVNaWRkbGUgbWFuSW5UaGVNaWRkbGUgPSBuZXcgTWFuSW5UaGVNaWRkbGVJbXBsKCk7Ci0gICAgICBtb25pdG9yQ29uZmlnLnNldE1hbkluVGhlTWlkZGxlKG1hbkluVGhlTWlkZGxlKTsKLQotICAgICAgbW9uaXRvckNvbmZpZy5zZXRMb2NhdGlvbigiZG9jdW1lbnRVUkkiKTsKLSAgICAgIG1vbml0b3JDb25maWcuc2V0VmVyYm9zZU9wdGlvbihmYWxzZSk7Ci0KLSAgICAgIC8vIFN0YXJ0ICAgICAKLSAgICAgIHB3LnByaW50KHRvb2xJbmZvLmdldFN0YXJ0WE1MU3RyaW5nKCIiKSk7Ci0gICAgCi0gICAgICAvLyBDb25maWcKLSAgICAgIHB3LnByaW50KG1vbml0b3JDb25maWcudG9YTUxTdHJpbmcoV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX01PTklUT1JfQ09ORklHKSk7Ci0KLSAgICAgIC8vIEVuZAotICAgICAgcHcucHJpbnRsbih0b29sSW5mby5nZXRFbmRYTUxTdHJpbmcoIiIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBnaXZlbiBkYXRlIGFuZCB0aW1lIGFzIGEgdGltZXN0YW1wLgotICAgKiBAcGFyYW0gZGF0ZTogYSBkYXRlIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgZ2l2ZW4gZGF0ZSBhbmQgdGltZSBhcyBhIHRpbWVzdGFtcC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpbWVzdGFtcChEYXRlIGRhdGUpCi0gIHsKLSAgICB0aW1lc3RhbXBGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKLSAgICByZXR1cm4gdGltZXN0YW1wRm9ybWF0LmZvcm1hdChkYXRlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1Jlc291cmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiMjBjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogR0lGIGNvbnN0YW50cwotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2UKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfV1NJX0xPR0ZJTEVfV0laID0gImFjdGlvbnMvaWNvbnMvd3NpX2xvZ2ZpbGVfd2l6LmdpZiI7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvUmVzb3VyY2VGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9SZXNvdXJjZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjgxMzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9SZXNvdXJjZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciAKLXsKLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGZFeHRlbnNpb25zOwotICBwcm90ZWN0ZWQgSUZpbGVbXSBmRXhjbHVkZWRGaWxlczsKLSAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZkV4Y2x1ZGVzOwotCQotICBwdWJsaWMgUmVzb3VyY2VGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucywgQ29sbGVjdGlvbiBleGNsdWRlKSAKLSAgewotICAgIGZFeHRlbnNpb25zPSBleHRlbnNpb25zOwotICAgIGZFeGNsdWRlcz0gZXhjbHVkZTsKLSAgICBmRXhjbHVkZWRGaWxlcyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgUmVzb3VyY2VGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucywgSUZpbGVbXSBleGNsdWRlZEZpbGVzLCBDb2xsZWN0aW9uIGV4Y2x1ZGUpIAotICB7Ci0gICAgZkV4dGVuc2lvbnM9IGV4dGVuc2lvbnM7Ci0gICAgZkV4Y2x1ZGVzPSBleGNsdWRlOwotICAgIGZFeGNsdWRlZEZpbGVzID0gZXhjbHVkZWRGaWxlczsKLSAgfQotCQotICBwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIAotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0JCi0gIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgCi0gIHsKLSAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICB7Ci0gICAgICBpZiAoZkV4Y2x1ZGVzICE9IG51bGwgJiYgZkV4Y2x1ZGVzLmNvbnRhaW5zKGVsZW1lbnQpKSAKLSAgICAgIHsKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgbmFtZT0gKChJRmlsZSllbGVtZW50KS5nZXROYW1lKCk7Ci0gICAgICBpZiAoZkV4Y2x1ZGVkRmlsZXMgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGo9IDA7IGogPCBmRXhjbHVkZWRGaWxlcy5sZW5ndGg7IGorKykgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICgoSUZpbGUpZWxlbWVudCkuZ2V0TG9jYXRpb24oKS4KLSAgICAgICAgICAgICAgIHRvT1NTdHJpbmcoKS5jb21wYXJlVG8oKChJRmlsZSlmRXhjbHVkZWRGaWxlc1tqXSkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpID09IDAgKQotICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAoZkV4dGVuc2lvbnMubGVuZ3RoID09IDApIAotICAgICAgewotICAgICAgICAvLyBhc3N1bWUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGZpbHRlciBhbnkgZmlsZXMgYmFzZWQgb24gCi0gICAgICAgIC8vIGV4dGVuc2lvbgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBmRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgCi0gICAgICB7Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKGZFeHRlbnNpb25zW2ldKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gCi0gICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIAotICAgIHsgLy8gSVByb2plY3QsIElGb2xkZXIKLSAgICAgIHRyeSAKLSAgICAgIHsKLSAgICAgIAlJUmVzb3VyY2VbXSByZXNvdXJjZXM9ICgoSUNvbnRhaW5lcillbGVtZW50KS5tZW1iZXJzKCk7Ci0JZm9yIChpbnQgaT0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgCi0gICAgICAgIHsKLQkgIC8vIHJlY3Vyc2l2ZSEKLQkgIGlmIChzZWxlY3Qodmlld2VyLCBwYXJlbnQsIHJlc291cmNlc1tpXSkpIAotICAgICAgICAgIHsKLQkgICAgcmV0dXJuIHRydWU7Ci0JICB9Ci0JfQotICAgICAgfSAKLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIAotICAgICAgewotICAgICAgfQkJCQkKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvV1NJTWVzc2FnZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSU1lc3NhZ2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4NzgxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvV1NJTWVzc2FnZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLldTSVZhbGlkYXRlQWN0aW9uOwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsLkRlZmF1bHRSZXBvcnRlcjsKLQotLyoqCi0gKiBBIFZhbGlkYXRvciB0aGF0IHBlcmZvcm1zIHZhbGlkYXRpb24gb24gYSBXUy1JIE1lc3NhZ2UgTG9nIGZpbGUuIAotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0lNZXNzYWdlVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgSVJlcG9ydGVyIHJlcG9ydGVyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0lfTUVTU0FHRV9WQUxJREFUT1JfSUQgPSAid3NpbWVzc2FnZXZhbGlkYXRvciIuaW50ZXJuKCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZhbGlkYXRlLklWYWxpZGF0b3IjdmFsaWRhdGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRmlsZSBmaWxlKQotICB7ICAKLSAgICBXU0lWYWxpZGF0ZUFjdGlvbiB2YWxpZGF0ZUFjdGlvbiA9IG5ldyBXU0lWYWxpZGF0ZUFjdGlvbihmaWxlLCBmYWxzZSk7Ci0gICAgLy92YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IodGhpcyk7Ci0gICAgdmFsaWRhdGVBY3Rpb24uc2V0UmVwb3J0ZXIoZ2V0UmVwb3J0ZXIoKSk7Ci0gICAgdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS5JVmFsaWRhdG9yI2dldFJlcG9ydGVyKCkKLSAgICovCi0gIHB1YmxpYyBJUmVwb3J0ZXIgZ2V0UmVwb3J0ZXIoKQotICB7Ci0gICAgaWYgKHJlcG9ydGVyID09IG51bGwpCi0gICAgewotICAgICAgLy9yZXBvcnRlciA9IG5ldyBEZWZhdWx0UmVwb3J0ZXIoV1NJX01FU1NBR0VfVkFMSURBVE9SX0lEKTsJCi0gICAgfQkKLSAgICByZXR1cm4gcmVwb3J0ZXI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudmFsaWRhdGUuSVZhbGlkYXRvciNzZXRSZXBvcnRlcihvcmcuZWNsaXBzZS52YWxpZGF0ZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLSAgCXRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjsKLSAgfQotCi1wdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkKLX0KLQotcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbgotIHsKLQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YmY1YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBXU0lWYWxpZGF0ZVBsdWdpbiBpcyBhIHBsdWdpbiB0aGF0IGludGVncmF0ZXMgd2l0aCB0aGUgRWNsaXBzZSBwbGF0Zm9ybSBVSS4gCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotCi1wdWJsaWMgY2xhc3MgV1NJVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBwbHVnaW5SQiA9IG51bGw7Ci0gIC8qKgotICAgKiBUaGUgc2luZ2xldG9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBXU0lVSVBsdWdpbiBpbnN0YW5jZTsgICAgICAgICAgICAgICAgCi0KLS8vICAvKioKLS8vICAgKiBNZXNzYWdlIExvZ2dlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbHVnaW4uCi0vLyAgICovCi0vLyAgcHJpdmF0ZSBzdGF0aWMgTXNnTG9nZ2VyIG15TXNnTG9nZ2VyOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBXU0lVSVBsdWdpbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICB7Ci0gICAgc3VwZXIoZGVzY3JpcHRvcik7Ci0gICAgaW5zdGFuY2UgPSB0aGlzOwotICAgIHBsdWdpblJCID0gZGVzY3JpcHRvci5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotICB9ICAgIAotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24uIChCYXNlZCBvbiB0aGUgU2luZ2xldG9uIFBhdHRlcm4pLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXU0lVSVBsdWdpbiBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmllbmNlIEFQSS4gIAotICAgKiBGaW5kcyB0aGUgc3BlY2lmaWVkIGltYWdlIHN0b3JlZCBpbiB0aGlzIHBsdWctaW4ncyBpbWFnZSByZWdpc3RyeS4KLSAgICogQHBhcmFtIGljb25OYW1lOiB0aGUgbmFtZSBvZiB0aGUgaW1hZ2UuCi0gICAqIEByZXR1cm4gdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0UmVzb3VyY2VJbWFnZShTdHJpbmcgaWNvbk5hbWUpCi0gIHsKLSAgICByZXR1cm4gaW5zdGFuY2UuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpY29uTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmllbmNlIEFQSS4gICAgIAotICAgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZSBiYXNlZCBvbiB0aGUga2V5LgotICAgKiBAcGFyYW0ga2V5OiBrZXkgYXNzb2NpYXRlZCB3aXRoYSBzdHJpbmcgcmVzb3VyY2UuCi0gICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpCi0gIHsKLSAgCQotICAgIHJldHVybiBpbnN0YW5jZS5wbHVnaW5SQi5nZXRTdHJpbmcoa2V5KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL1dTSVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NDQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9XU0lWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuV1NJVmFsaWRhdGVBY3Rpb247Ci0KLS8qKgotICogQSBzaW1wbGUgaW50ZXJmYWNlIHRvIHRoZSBXUy1JIG1lc3NhZ2UgbG9nIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgV1NJVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBXU0lWYWxpZGF0b3IoKQotCXsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGdpdmVuIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIFRoZSBsb2cgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRmlsZSBmaWxlKQotCXsKLQkJV1NJTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbmV3IFdTSU1lc3NhZ2VWYWxpZGF0b3IoKTsKLQkJV1NJVmFsaWRhdGVBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgV1NJVmFsaWRhdGVBY3Rpb24oZmlsZSwgdHJ1ZSk7Ci0JCXZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcihtZXNzYWdlVmFsaWRhdG9yKTsKLQkJdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBnaXZlbiBsb2cgZmlsZSB3aXRoIGEgV1NETCBkb2N1bWVudCBzcGVjaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGZpbGUgVGhlIGxvZyBmaWxlIHRvIHZhbGlkYXRlLgotCSAqIEBwYXJhbSB3c2RsZmlsZSBUaGUgV1NETCBmaWxlIHRvIHVzZSBmb3IgdmFsaWRhdGlvbi4KLQkgKiBAcGFyYW0gZWxlbWVudG5hbWUgVGhlIFdTREwgZWxlbWVudCB0byB2YWxpZGF0ZS4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIFdTREwgZWxlbWVudCB0byB2YWxpZGF0ZS4KLQkgKiBAcGFyYW0gcGFyZW50bmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQgdG8gdmFsaWRhdGUuCi0JICovCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGdpdmVuIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIFRoZSBsb2cgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRmlsZSBmaWxlLCBTdHJpbmcgd3NkbGZpbGUsIFN0cmluZyBlbGVtZW50bmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHBhcmVudG5hbWUsIFN0cmluZyB0eXBlKQotCXsKLQkJV1NJTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbmV3IFdTSU1lc3NhZ2VWYWxpZGF0b3IoKTsKLQkJV1NJVmFsaWRhdGVBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgV1NJVmFsaWRhdGVBY3Rpb24oZmlsZSwgdHJ1ZSwgd3NkbGZpbGUsIGVsZW1lbnRuYW1lLCBuYW1lc3BhY2UsIHBhcmVudG5hbWUsIHR5cGUpOwotCQl2YWxpZGF0ZUFjdGlvbi5zZXRWYWxpZGF0b3IobWVzc2FnZVZhbGlkYXRvcik7Ci0JCXZhbGlkYXRlQWN0aW9uLnJ1bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL1dTSVZhbGlkYXRlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9XU0lWYWxpZGF0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTViZmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL1dTSVZhbGlkYXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0vL2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmFuYWx5emVyLk1lc3NhZ2VBbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmFuYWx5emVyLldTSUFuYWx5emVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLS8qKgotICogQWN0aW9uIGZvciBydW5uaW5nIHRoZSB2YWxpZGF0b3IuCi0gKiAKLSAqIEBhdXRob3IgRGF2aWQgTGF1em9uLCBJQk0KLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIFdTSVZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgVmFsaWRhdGVBY3Rpb24KLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOiI7Ci0gIHByb3RlY3RlZCBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLSAgCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbGZpbGUgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRuYW1lID0gbnVsbDsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhcmVudG5hbWUgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBudWxsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiB3c2Rsc3BlY2lmaWVkID0gZmFsc2U7Ci0gIHByb3RlY3RlZCBib29sZWFuIGV4Y2VwdGlvbkNhdWdodCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBmIFRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEBwYXJhbSBzaG93RGlhbG9nIFdoZXRoZXIgb3Igbm90IHRvIHNob3cgYSBzdGF0dXMgZGlhbG9nIGFmdGVyIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgV1NJVmFsaWRhdGVBY3Rpb24oSUZpbGUgZiwgYm9vbGVhbiBzaG93RGlhbG9nKQotICB7Ci0gIAlzdXBlcihmLCBzaG93RGlhbG9nKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIHdpdGggV1NETCBlbGVtZW50IHNwZWNpZmllZC4KLSAgICogCi0gICAqIEBwYXJhbSBmIFRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gc2hvd0RpYWxvZyBXaGV0aGVyIG9yIG5vdCB0byBzaG93IGEgc3RhdHVzIGRpYWxvZyBhZnRlciB2YWxpZGF0aW9uLgotICAgKiBAcGFyYW0gd3NkbGZpbGUgVGhlIFdTREwgZmlsZSB0byB1c2UgZm9yIHZhbGlkYXRpb24uCi0gICAqIEBwYXJhbSBlbGVtZW50bmFtZSBUaGUgbmFtZSBvZiB0aGUgV1NETCBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIFdTREwgZWxlbWVudCB0byB2YWxpZGF0ZQotICAgKiBAcGFyYW0gcGFyZW50bmFtZSBUaGUgcGFyZW50IG5hbWUgb2YgdGhlIFdTREwgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICovCi0gIHB1YmxpYyBXU0lWYWxpZGF0ZUFjdGlvbihJRmlsZSBmLCBib29sZWFuIHNob3dEaWFsb2csIFN0cmluZyB3c2RsZmlsZSwgU3RyaW5nIGVsZW1lbnRuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50bmFtZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgCXRoaXMoZiwgc2hvd0RpYWxvZyk7Ci0gIAl0aGlzLndzZGxmaWxlID0gd3NkbGZpbGU7Ci0gIAl0aGlzLmVsZW1lbnRuYW1lID0gZWxlbWVudG5hbWU7Ci0gIAl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgCXRoaXMucGFyZW50bmFtZSA9IHBhcmVudG5hbWU7Ci0gIAl0aGlzLnR5cGUgPSB0eXBlOwotICAJdGhpcy53c2Rsc3BlY2lmaWVkID0gdHJ1ZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS5WYWxpZGF0ZUFjdGlvbiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKGZpbmFsIElGaWxlIGZpbGUpCi0gIHsKLSAgCWZpbmFsIE1lc3NhZ2VBbmFseXplciBtZXNzYWdlYW5hbHl6ZXI7Ci0gIAkKLSAgCWlmKHdzZGxzcGVjaWZpZWQpCi0gIAl7Ci0gIAkgIG1lc3NhZ2VhbmFseXplciA9IG5ldyBNZXNzYWdlQW5hbHl6ZXIoRklMRV9QUk9UT0NPTCArIGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIHdzZGxmaWxlLCBlbGVtZW50bmFtZSwgbmFtZXNwYWNlLCBwYXJlbnRuYW1lLCB0eXBlKTsJCi0gIAl9Ci0gIAllbHNlCi0gIAl7CQotICAJICBtZXNzYWdlYW5hbHl6ZXIgPSBuZXcgTWVzc2FnZUFuYWx5emVyKEZJTEVfUFJPVE9DT0wgKyBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLSAgCX0KLSAgCQotICAJSVdvcmtzcGFjZVJ1bm5hYmxlIG9wID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIAotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgY2xlYXJNYXJrZXJzKGZpbGUpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIG1lc3NhZ2VhbmFseXplci52YWxpZGF0ZUNvbmZvcm1hbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFdTSUFuYWx5emVyRXhjZXB0aW9uIGFlKQotICAgICAgICB7Ci0gICAgICAgIAlpZiAoYWUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBTQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgICAgCXsKLSAgICAgICAgCSAgZXhjZXB0aW9uQ2F1Z2h0ID0gdHJ1ZTsKLS8vICAgICAgICAJICBjcmVhdGVNYXJrZXIoZmlsZSwgYWUsIEVSUk9SX01BUktFUik7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLS8vICAgICAgICBjcmVhdGVNYXJrZXJzKGZpbGUsIG1lc3NhZ2VhbmFseXplci5nZXRBc3NlcnRpb25XYXJuaW5ncygpLCBXQVJOSU5HX01BUktFUik7Ci0vLyAgICAgICAgY3JlYXRlTWFya2VycyhmaWxlLCBtZXNzYWdlYW5hbHl6ZXIuZ2V0QXNzZXJ0aW9uRXJyb3JzKCksIEVSUk9SX01BUktFUik7Ci0vLwotCQl9Ci0gICAgfTsKLSAgIAotICAgIAotICAgICB0cnkKLSAgICB7Ci0gICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wLCBudWxsKTsKLSAgICAgaWYgKHNob3dEaWFsb2cpCi0gICAgICB7Ci0gICAgICAgIGlmIChleGNlcHRpb25DYXVnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLSAgICAgICAgICAJCVdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfVU5BQkxFX1RPX1ZBTElEQVRFIiksIAotICAgICAgICAgIAkJV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9QUk9CTEVNU19SRUFESU5HX1dTSU1TR19GSUxFIikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1lc3NhZ2VhbmFseXplci5nZXRBc3NlcnRpb25FcnJvcnMoKS5zaXplKCkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIAotICAgICAgICAgIAkJV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9WQUxJREFUSU9OX0ZBSUxFRCIpLCAKLSAgICAgICAgICAJCVdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfVEhFX1dTSU1TR19GSUxFX0lTX05PVF9WQUxJRCIpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChtZXNzYWdlYW5hbHl6ZXIuZ2V0QXNzZXJ0aW9uV2FybmluZ3MoKS5zaXplKCkgIT0gMCkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIHRpdGxlID0gV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9WQUxJREFUSU9OX1NVQ0VFREVEIik7Ci0gICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1ZBTElEQVRJT05fV0FSTklOR1NfREVURUNURUQiKTsKLSAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHRpdGxlID0gV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9WQUxJREFUSU9OX1NVQ0VFREVEIik7Ci0gICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1RIRV9XU0lNU0dfRklMRV9JU19WQUxJRCIpOwotICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSl7fQotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgbWFya2VyIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRoYXQgCi0gICAqIEBwYXJhbSBhZSB0aGUgV1MtSSBBbmFseXplciBleGNlcHRpb24KLSAgICogQHBhcmFtIGVycm9yX21hcmtlciBmbGFnIGluZGljYXRpbmcgc2V2ZXJpdHkgb2YgcHJvYmxlbQotICAgKi8KLS8vICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYXJrZXIoSVJlc291cmNlIHJlc291cmNlLCBXU0lBbmFseXplckV4Y2VwdGlvbiBhZSwgaW50IGVycm9yX21hcmtlcikgCi0vLyAgewotLy8gCVRocm93YWJsZSB0aHJvd2FibGUgPSBhZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLS8vCi0vLwlpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pCi0vLwl7Ci0vLwkJaW50IG4gPSAoKFNBWFBhcnNlRXhjZXB0aW9uKXRocm93YWJsZSkuZ2V0TGluZU51bWJlcigpOwotLy8JCWludCBjID0gKChTQVhQYXJzZUV4Y2VwdGlvbil0aHJvd2FibGUpLmdldENvbHVtbk51bWJlcigpOwotLy8JCQotLy8JCWdldE9yQ3JlYXRlUmVwb3J0ZXIoKS5hZGRFcnJvck1lc3NhZ2UocmVzb3VyY2UsICgoU0FYUGFyc2VFeGNlcHRpb24pdGhyb3dhYmxlKS5nZXRNZXNzYWdlKCksIG4sIGMpOwotLy8JfQotLy8JZWxzZQotLy8JewotLy8JCWdldE9yQ3JlYXRlUmVwb3J0ZXIoKS5hZGRFcnJvck1lc3NhZ2UocmVzb3VyY2UsIGFlLmdldE1lc3NhZ2UoKSwgMCwgMCk7Ci0vLwl9Ci0vLyAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS52YWxpZGF0ZS5WYWxpZGF0ZUFjdGlvbiNjcmVhdGVNYXJrZXJzKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSwgamF2YS51dGlsLkxpc3QsIGludCkKLSAgICovCi0vLyAgcHVibGljIHZvaWQgY3JlYXRlTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UsIExpc3QgbGlzdCwgaW50IG1hcmtlcikKLS8vICB7IAotLy8gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotLy8gICAgewotLy8gICAgICBBc3NlcnRpb25FcnJvciBhc3NlcnRpb25FcnJvciA9IChBc3NlcnRpb25FcnJvcikgaS5uZXh0KCk7Ci0vLwotLy8gICAgICBpbnQgbiA9IGFzc2VydGlvbkVycm9yLmdldExpbmUoKTsKLS8vICAgICAgaW50IGMgPSBhc3NlcnRpb25FcnJvci5nZXRDb2x1bW4oKTsKLS8vICAgICAgCi0vLyAgICAgIGlmKG1hcmtlciA9PSBXQVJOSU5HX01BUktFUikKLS8vICAgICAgewotLy8gICAgICAgIGdldE9yQ3JlYXRlUmVwb3J0ZXIoKS5hZGRXYXJuaW5nTWVzc2FnZShyZXNvdXJjZSwgYXNzZXJ0aW9uRXJyb3IuZ2V0RXJyb3JNZXNzYWdlKCksIG4sIGMpOwotLy8gICAgICB9Ci0vLyAgICAgIGVsc2UgaWYgKG1hcmtlciA9PSBFUlJPUl9NQVJLRVIpCi0vLyAgICAgIHsKLS8vICAgICAgICBnZXRPckNyZWF0ZVJlcG9ydGVyKCkuYWRkRXJyb3JNZXNzYWdlKHJlc291cmNlLCBhc3NlcnRpb25FcnJvci5nZXRFcnJvck1lc3NhZ2UoKSwgbiwgYyk7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICB9Ci0gIAotICAvKioKLSAgICogQ2xlYXIgYWxsIHRoZSBtYXJrZXJzIG9uIHRoZSBnaXZlbiByZXNvdXJjZSBnZW5lcmF0ZWQgYnkgdGhpcyB2YWxpZGF0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHJlc291cmNlIHdpdGggdGhlIG1hcmtlcnMgdG8gY2xlYXIuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGNsZWFyTWFya2VycyhJUmVzb3VyY2UgcmVzb3VyY2UpCi0vLyAgewotLy8gICAgZ2V0T3JDcmVhdGVSZXBvcnRlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKHJlc291cmNlKTsKLS8vICB9Ci0KLSAvKioKLSAgKiBJZiBhIHJlcG9ydGVyIGRvZXNuJ3QgZXhpc3QgY3JlYXRlcyBpdCBvciB1c2VzIHRoZSByZXBvcnRlciBhbHJlYWR5IGNyZWF0ZWQuCi0gICogCi0gICogQHJldHVybiBUaGUgcmVwb3J0ZXIuCi0gICovCi0vLyAgcHJvdGVjdGVkIElSZXBvcnRlciBnZXRPckNyZWF0ZVJlcG9ydGVyKCkKLS8vICB7Ci0vLyAgICBpZiAocmVwb3J0ZXIgPT0gbnVsbCkKLS8vICAgIHsKLS8vICAgICAgcmVwb3J0ZXIgPSBSZXBvcnRlclJlZ2lzdGVyLmdldEluc3RhbmNlKCkuZ2V0UmVwb3J0ZXIoV1NJTWVzc2FnZVZhbGlkYXRvci5XU0lfTUVTU0FHRV9WQUxJREFUT1JfSUQpOwotLy8gICAgfQotLy8gICAgcmV0dXJuIHJlcG9ydGVyOwotLy8gIH0KLQotIC8qKgotICAqIEdldHMgdGhlIHZhbGlkYXRvci4KLSAgKiAKLSAgKiBAcmV0dXJuIFJldHVybnMgYSBJVmFsaWRhdG9yLgotICAqLwotICBwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkYXRvcjsKLSAgfQotCi0gLyoqCi0gICogU2V0cyB0aGUgdmFsaWRhdG9yLgotICAqIAotICAqIEBwYXJhbSB2YWxpZGF0b3IgVGhlIHZhbGlkYXRvciB0byBzZXQuCi0gICovCi0gIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihJVmFsaWRhdG9yIHZhbGlkYXRvcikKLSAgewotICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9hY3Rpb25EZWxlZ2F0ZXMvVmFsaWRhdGVXU0lMb2dGaWxlQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2FjdGlvbkRlbGVnYXRlcy9WYWxpZGF0ZVdTSUxvZ0ZpbGVBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQxMGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9hY3Rpb25zL2FjdGlvbkRlbGVnYXRlcy9WYWxpZGF0ZVdTSUxvZ0ZpbGVBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5hY3Rpb25zLmFjdGlvbkRlbGVnYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuV1NJVmFsaWRhdGVBY3Rpb247Ci0KLQotLyoqCi0gKiBBY3Rpb24gZGVsZWdhdGUgZm9yIHZhbGlkYXRpbmcgYSBXUy1JIGxvZyBmaWxlLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0ZVdTSUxvZ0ZpbGVBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZQotewotICAvKioKLSAgICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbi4KLSAgICovCi0gIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0ZVdTSUxvZ0ZpbGVBY3Rpb25EZWxlZ2F0ZSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCAgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKW9iajsKLSAgICAgICAgICBXU0lNZXNzYWdlVmFsaWRhdG9yIG1lc3NhZ2VWYWxpZGF0b3IgPSBuZXcgV1NJTWVzc2FnZVZhbGlkYXRvcigpOwotICAgICAgICAgIFdTSVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gbmV3IFdTSVZhbGlkYXRlQWN0aW9uKGZpbGUsIHRydWUpOwotICAgICAgICAgIHZhbGlkYXRlQWN0aW9uLnNldFZhbGlkYXRvcihtZXNzYWdlVmFsaWRhdG9yKTsKLSAgICAgICAgICB2YWxpZGF0ZUFjdGlvbi5ydW4oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvYWN0aW9uRGVsZWdhdGVzL1ZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9hY3Rpb25EZWxlZ2F0ZXMvVmFsaWRhdGVXU0lQcm9maWxlQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmM0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9hY3Rpb25EZWxlZ2F0ZXMvVmFsaWRhdGVXU0lQcm9maWxlQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmFjdGlvbnMuYWN0aW9uRGVsZWdhdGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLkxvZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC53aXphcmRzLlZhbGlkYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lckdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLQotLyoqCi0gKiBBY3Rpb24gZGVsZWdhdGUgZm9yIHRoZSBXUy1JIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVXU0lQcm9maWxlQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlCi17Ci0gIC8qKgotICAgKiBUaGUgZGVmYXVsdCBXUy1JIE1lc3NhZ2UgTG9nIGZpbGVuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dfRklMRU5BTUUgPSAibG9nLndzaW1zZyI7Ci0KLSAgLyoqCi0gICAqIFRoZSBIVFRQIHByb3RvY29sLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUCA9ICJodHRwOi8vIjsKLSAgCi0gIAotICAvKioKLSAgICogVGhlIGRlZmF1bHQgdGFnIGZvciBXU0RMIGxvY2F0aW9ucy4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFdTREwgPSAiP1dTREwiOwotICAKLSAgLyoqCi0gICAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uCi0gICAqLwotICBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAvKioKLSAgICogVGhlIGxpc3Qgb2YgbWVzc2FnZXMgaW4gdGhlIGZvcm0gb2YgcmVxdWVzdC1yZXNwb25zZSBwYWlycy4KLSAgICovCi0gIFJlcXVlc3RbXSByZXF1ZXN0UmVzcG9uc2VzOwotCi0gIC8qKgotICAgKiBUaGUgdmlldyB0aGF0IHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGlzIGRlbGVnYXRlLgotICAgKi8KLSAgSVZpZXdQYXJ0IHZpZXc7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRlV1NJUHJvZmlsZUFjdGlvbkRlbGVnYXRlKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpCi0gIHsKLSAgICB0aGlzLnZpZXcgPSB2aWV3OwotICB9Ci0KLSAgLyoqIAotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pCi0gIHsKLSAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpCi0gICAgewotICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikKLSAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRlKHByb2dyZXNzTW9uaXRvcik7Ci0gICAgICB9Ci0gICAgfTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBvcGVyYXRpb24ucnVuKG51bGwpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgdmFsaWRhdGUgYWN0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBWYWxpZGF0aW9uV2l6YXJkIHZhbGlkYXRlV2l6YXJkID0gbmV3IFZhbGlkYXRpb25XaXphcmQoREVGQVVMVF9MT0dfRklMRU5BTUUpOwotCi0gICAgICAvL1RPRE8gcmVxdWVzdFJlc3BvbnNlcyA9IE1vbml0b3JDb3JlLmdldFJlcXVlc3RzKCk7Ci0gICAgICBMaXN0IHdzZGxsb2NzID0gbmV3IFZlY3RvcigpOwotICAgICAgaWYocmVxdWVzdFJlc3BvbnNlcyAhPSBudWxsKQotICAgICAgewotICAgICAgIAlmb3IgKGludCBpPTA7IGk8cmVxdWVzdFJlc3BvbnNlcy5sZW5ndGg7IGkrKykKLSAgICAgIAl7Ci0gICAgICAJICBSZXF1ZXN0IHJlcXJlc3AgPSByZXF1ZXN0UmVzcG9uc2VzW2ldOwotICAgICAgCSAgU3RyaW5nIHJlbW90ZWhvc3QgPSByZXFyZXNwLmdldFJlbW90ZUhvc3QoKTsKLSAgICAgIAkgIGludCByZW1vdGVwb3J0ID0gcmVxcmVzcC5nZXRSZW1vdGVQb3J0KCk7Ci0gICAgICAJICBTdHJpbmcgcmVtb3RlbGFiZWwgPSByZXFyZXNwLmdldE5hbWUoKTsKLSAgICAgIAkgIFN0cmluZyBsb2NhdGlvbiA9IEhUVFAgKyByZW1vdGVob3N0ICsgIjoiICsgcmVtb3RlcG9ydCArIHJlbW90ZWxhYmVsICsgV1NETDsKLSAgICAgIAkgIGlmKCF3c2RsbG9jcy5jb250YWlucyhsb2NhdGlvbikpCi0gICAgICAJICB7Ci0gICAgICAJICAgIHdzZGxsb2NzLmFkZChsb2NhdGlvbik7Ci0gICAgICAJICB9Ci0gICAgICAJfQotICAgICAgfQotICAgICAgdmFsaWRhdGVXaXphcmQuc2V0V1NETExvY2F0aW9ucygoU3RyaW5nW10pd3NkbGxvY3MudG9BcnJheShuZXcgU3RyaW5nW3dzZGxsb2NzLnNpemUoKV0pKTsKLSAgICAgIFNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLSAgICAgIFdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB2YWxpZGF0ZVdpemFyZCk7Ci0gICAgICB3aXphcmREaWFsb2cuY3JlYXRlKCk7Ci0KLSAgICAgIGludCByZXN1bHQgPSB3aXphcmREaWFsb2cub3BlbigpOwotCi0gICAgICBpZiAodmFsaWRhdGVXaXphcmQuaXNWYWxpZCgpICYmIChyZXN1bHQgIT0gb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdy5DQU5DRUwpKQotICAgICAgewotICAgICAgICAvLyBJZiB0aGUgY29udGFpbmVyIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdCBub3cKLSAgICAgICAgY2hlY2tBbmRDcmVhdGVDb250YWluZXIodmFsaWRhdGVXaXphcmQuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSk7Ci0KLSAgICAgICAgSUZpbGUgZmlsZSA9IHZhbGlkYXRlV2l6YXJkLmdldEZpbGUoKTsKLSAgICAgICAgLy9TdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotICAgICAgICAvL0lNb25pdG9yIG1vbml0b3IgPSBNb25pdG9yQ29yZS5nZXRSZXF1ZXN0cygpOwotICAgICAgICAvL21vbml0b3IuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgTG9nQnVpbGRlciBidWlsZGVyID0gbmV3IExvZ0J1aWxkZXIoZmlsZSk7Ci0gICAgICAgIExvZyBsb2cgPSBidWlsZGVyLmJ1aWxkTG9nKHJlcXVlc3RSZXNwb25zZXMpOwotCi0gICAgICAgIGJ1aWxkZXIud3JpdGVMb2cobG9nKTsKLSAgICAgICAgZmlsZS5yZWZyZXNoTG9jYWwoMSwgcHJvZ3Jlc3NNb25pdG9yKTsKLSAgICAgICAgCi0gICAgICAgIFdTSVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbmV3IFdTSVZhbGlkYXRvcigpOwotICAgICAgICBpZih2YWxpZGF0ZVdpemFyZC5pbmNsdWRlV1NETEZpbGUoKSkKLSAgICAgICAgewkKLSAgICAgICAgCVN0cmluZyB3c2RsZmlsZSA9IHZhbGlkYXRlV2l6YXJkLmdldFdTRExGaWxlKCk7Ci0gICAgICAgIAlTdHJpbmcgbmFtZSA9IHZhbGlkYXRlV2l6YXJkLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgIAlTdHJpbmcgbmFtZXNwYWNlID0gdmFsaWRhdGVXaXphcmQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIAlTdHJpbmcgcGFyZW50bmFtZSA9IHZhbGlkYXRlV2l6YXJkLmdldFBhcmVudE5hbWUoKTsKLSAgICAgICAgCVN0cmluZyB0eXBlID0gdmFsaWRhdGVXaXphcmQuZ2V0VHlwZSgpOwotICAgICAgICAJbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZShmaWxlLCB3c2RsZmlsZSwgbmFtZSwgbmFtZXNwYWNlLCBwYXJlbnRuYW1lLCB0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsJCi0gICAgICAgIAltZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlKGZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIC8vV1NJVmFsaWRhdGVBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBuZXcgV1NJVmFsaWRhdGVBY3Rpb24oZmlsZSwgdHJ1ZSk7Ci0vLyAgICAgICAgdmFsaWRhdGVBY3Rpb24uc2V0VmFsaWRhdG9yKG1lc3NhZ2VWYWxpZGF0b3IpOwotICAgICAgICAvL3ZhbGlkYXRlQWN0aW9uLnJ1bigpOwotLy8gICAgICAgIFdTSVZhbGlkYXRvciB3c2lWYWxpZGF0b3IgPSBuZXcgV1NJVmFsaWRhdG9yKCk7Ci0vLyAgICAgICAgd3NpVmFsaWRhdG9yLnZhbGlkYXRlKGZpbGUpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotIAotICAvKioKLSAgICogSWYgdGhlIGNvbnRhaW5lciBkb2Vzbid0IGV4aXN0IGZvciB0aGUgc2VsZWN0ZWQgSUZpbGUsIGNyZWF0ZSBpdCBub3cuCi0gICAqIAotICAgKiBAcGFyYW0gY29udGFpbmVyUGF0aCBUaGUgY29udGFpbmVyIGZvciB0aGUgc2VsZWN0ZWQgSUZpbGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tBbmRDcmVhdGVDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCkKLSAgewotICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihjb250YWluZXJQYXRoKTsKLSAgICAKLSAgICAvLyBJZiB0aGUgY29udGFpbmVyIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZSwgY3JlYXRlIGl0LgotICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSAKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgQ29udGFpbmVyR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBDb250YWluZXJHZW5lcmF0b3IoY29udGFpbmVyUGF0aCk7Ci0gICAgICAgIGdlbmVyYXRvci5nZW5lcmF0ZUNvbnRhaW5lcihudWxsKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9pY29ucy93c2lfbG9nZmlsZV93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2FjdGlvbnMvaWNvbnMvd3NpX2xvZ2ZpbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjOGQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvYWN0aW9ucy9pY29ucy93c2lfbG9nZmlsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0U2luZ2xlRmlsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDUyYzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFNpbmdsZUZpbGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLklERUludGVybmFsV29ya2JlbmNoSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLldTSVVJUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nCi17ICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTZWxlY3RTaW5nbGVGaWxlVmlldyBzZWxlY3RTaW5nbGVGaWxlVmlldzsgCi0gIHByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0gCi0gIHB1YmxpYyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIGJvb2xlYW4gaXNGaWxlTWFuZGF0b3J5KSAKLSAgewotICAgIHN1cGVyKHBhcmVudFNoZWxsKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHNlbGVjdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0gICAgfQotICAgIHNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVWaWV3KHNlbGVjdGlvbiwgaXNGaWxlTWFuZGF0b3J5KQotICAgIHsKLQkgIHB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkKLQkgIHsKLQkJU2VsZWN0U2luZ2xlRmlsZURpYWxvZy50aGlzLmNyZWF0ZUZpbHRlckNvbnRyb2woY29tcG9zaXRlKTsKLQkgIH0KLSAgICB9OyAgCi0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICBnZC53aWR0aEhpbnQgPSAzNTA7Ci0gICAgZ2QuaGVpZ2h0SGludCA9IDM1MDsKLSAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7ICAgCi0gICAgICAgICAgICAKLSAgICBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lcigpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoaXNDb21wbGV0ZSk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotICAgIHJldHVybiBkaWFsb2dBcmVhOwotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLSAgICBva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLSAgfSAgCi0gICAgICAgCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZSgpCi0gIHsKLSAgICBzdXBlci5jcmVhdGUoKTsKLSAgICBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRWaXNpYmxlSGVscGVyKHRydWUpOwotICAgIGdldFNoZWxsKCkuc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX0RJQUxPR19TU19GSUxFX1NIRUxMX1RFWFQiKSk7Ci0gICAgc2V0VGl0bGUoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9ESUFMT0dfU1NfRklMRV9USVRMRSIpKTsKLSAgICBzZXRNZXNzYWdlKFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfRElBTE9HX1NTX0ZJTEVfREVTQ1JJUFRJT04iKSk7Ci0gICAgc2V0VGl0bGVJbWFnZShJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0RMR0JBTl9TQVZFQVNfRExHKS5jcmVhdGVJbWFnZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUZpbHRlckNvbWJvKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gIHsKLSAgfSAKLQotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpCi0gIHsgIAotICAgIHJldHVybiBzZWxlY3RTaW5nbGVGaWxlVmlldy5nZXRGaWxlKCk7Ci0gIH0gICAKLQotICBwdWJsaWMgdm9pZCBhZGRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpCi0gIHsgCi0gICAgc2VsZWN0U2luZ2xlRmlsZVZpZXcuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY3JlYXRlRmlsdGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKQotICB7IAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlM2YzOTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZU5hdmlnYXRvcjsKLQotLyoqCi0gKiBUaGlzIHdpemFyZCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIAotICogV1MtSSBNZXNzYWdlIExvZyBmaWxlIGZvciBwdXJwb3NlcyBvZiB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQKLXsKLSAgLyoqCi0gICAqIFdpemFyZCBwYWdlIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSAKLSAgICogV1MtSSBNZXNzYWdlIExvZyBmaWxlIGZvciBwdXJwb3NlcyBvZiB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFZhbGlkYXRpb25XaXphcmRMb2dQYWdlIGxvZ1BhZ2U7Ci0KLSAgLyoqCi0gICAqIFdpemFyZCBwYWdlIHRvIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgbG9jYXRpb24KLSAgICogb2YgdGhlIFdTREwgZG9jdW1lbnQgZm9yIHRoZSBXZWIgc2VydmljZS4KLSAgICovCi0gIHByb3RlY3RlZCBWYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2Ugd3NkbFBhZ2U7Ci0KLSAgLyoqCi0gICAqIFdpemFyZCBwYWdlIHRvIHNwZWNpZnkgdGhlIG5hbWUsIHR5cGUgYW5kIG5hbWVzcGFjZQotICAgKiBmb3IgdGhlIFdTREwgZWxlbWVudCB0byBhbmFseXplLgotICAgKi8KLSAgcHJvdGVjdGVkIFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2Ugd3NkbENvbnRlbnRQYWdlOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IFdTLUkgTWVzc2FnZSBmaWxlbmFtZSBwYXNzZWQgaW4gdGhlIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZTsKLQotICAvKioKLSAgICogVGhlIHNlbGVjdGVkIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJRmlsZSBmaWxlOwotCi0gIC8qKgotICAgKiBUaGUgY29udGFpbmVyIGhvbGRpbmcgdGhlIHNlbGVjdGVkIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBJUGF0aCBjb250YWluZXJGdWxsUGF0aDsKLQotICAvKioKLSAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgc2VsZWN0ZWQgZmlsZSBpcyB2YWxpZC4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQ7Ci0KLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50bmFtZTsKLQotICAvKioKLSAgICogVGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZXNwYWNlOwotCi0gIC8qKgotICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50IHRvIHZhbGlkYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRuYW1lOwotCi0gIC8qKgotICAgKiBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0byB2YWxpZGF0ZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQotICAvKioKLSAgICogVGhlIFdTREwgZmlsZSB0byB1c2UgZm9yIHZhbGlkYXRpb247Ci0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxmaWxlOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIGEgV1NETCBmaWxlIGlzIGluY2x1ZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRld3NkbGZpbGU7Ci0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGxpc3Qgb2YgV1NETCBsb2NhdGlvbnMgdGhlIHVzZXIgY2FuIGNob29zZSBmcm9tLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIHdzZGxsb2NhdGlvbnMgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZmlsZW5hbWUgRGVmYXVsdCBtZXNzYWdlIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbldpemFyZChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7Ci0gICAgdGhpcy5zZXRXaW5kb3dUaXRsZShXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WQUxJREFURV9MT0dfVElUTEUiKSk7Ci0gICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoCi0gICAgICBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoV1NJVUlQbHVnaW4uY2xhc3MsIFJlc291cmNlLlZBTElEQVRFX1dTSV9MT0dGSUxFX1dJWikpOwotICAgIHNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjYWRkUGFnZXMoKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFnZXMoKQotICB7Ci0gICAgbG9nUGFnZSA9IG5ldyBWYWxpZGF0aW9uV2l6YXJkTG9nUGFnZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFJlc291cmNlTmF2aWdhdG9yU2VsZWN0aW9uKCksIGZpbGVuYW1lKTsKLSAgICB3c2RsUGFnZSA9IG5ldyBWYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2UoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRSZXNvdXJjZU5hdmlnYXRvclNlbGVjdGlvbigpKTsKLSAgICB3c2RsQ29udGVudFBhZ2UgPSBuZXcgVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZSgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFJlc291cmNlTmF2aWdhdG9yU2VsZWN0aW9uKCkpOwotICAgIGFkZFBhZ2UobG9nUGFnZSk7Ci0gICAgYWRkUGFnZSh3c2RsUGFnZSk7Ci0gICAgYWRkUGFnZSh3c2RsQ29udGVudFBhZ2UpOwotCi0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBUcnVlIGlmIGEgV1NETCBmaWxlIGlzIGluY2x1ZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlV1NETEZpbGUoKQotICB7Ci0gICAgaWYgKCFpc1ZhbGlkKQotICAgIHsKLSAgICAgIHJldHVybiB3c2RsUGFnZS5pbmNsdWRlV1NETEZpbGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluY2x1ZGV3c2RsZmlsZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVsZW1lbnQgbmFtZSB0byB2YWxpZGF0ZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgbmFtZSB0byB2YWxpZGF0ZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZXNwYWNlIGZvciB0aGUgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkKLSAgewotICAgIHJldHVybiBwYXJlbnRuYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFdTRExGaWxlKCkKLSAgewotICAgIGlmICghaXNWYWxpZCkKLSAgICB7Ci0gICAgICByZXR1cm4gd3NkbFBhZ2UuZ2V0V1NETEZpbGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxmaWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjZ2V0TmV4dFBhZ2Uob3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlKQotICAgKi8KLSAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIGN1cnJlbnRQYWdlKQotICB7Ci0gICAgaWYgKGN1cnJlbnRQYWdlID09IHdzZGxQYWdlKQotICAgIHsKLSAgICAgIGlmICghd3NkbFBhZ2UuaW5jbHVkZVdTRExGaWxlKCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFdTRExGYWN0b3J5IGZhY3RvcnkgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIFdTRExSZWFkZXIgcmVhZGVyID0gZmFjdG9yeS5uZXdXU0RMUmVhZGVyKCk7Ci0gICAgICAgICAgRGVmaW5pdGlvbiBkZWZFbGVtID0gcmVhZGVyLnJlYWRXU0RMKGdldFdTRExGaWxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBXU0RMIGZpbGUgdGhlcmUgaXMgbm8gbmV4dCBwYWdlLgotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXROZXh0UGFnZShjdXJyZW50UGFnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RlZCBmaWxlIGlzIGEgdmFsaWQgV1MtSSBNZXNzYWdlIExvZyBmaWxlbmFtZS4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2VsZWN0ZWQgZmlsZSBpcyBhIHZhbGlkIFdTLUkgTWVzc2FnZSBMb2cgZmlsZW5hbWUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkKLSAgewotICAgIHJldHVybiBpc1ZhbGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkKLSAgewotICAgIGZpbGUgPSBsb2dQYWdlLmdldEZpbGUoKTsKLSAgICBjb250YWluZXJGdWxsUGF0aCA9IGxvZ1BhZ2UuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLSAgICBpbmNsdWRld3NkbGZpbGUgPSB3c2RsUGFnZS5pbmNsdWRlV1NETEZpbGUoKTsKLSAgICB3c2RsZmlsZSA9IHdzZGxQYWdlLmdldFdTRExGaWxlKCk7Ci0gICAgZWxlbWVudG5hbWUgPSB3c2RsQ29udGVudFBhZ2UuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICBuYW1lc3BhY2UgPSB3c2RsQ29udGVudFBhZ2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgcGFyZW50bmFtZSA9IHdzZGxDb250ZW50UGFnZS5nZXRQYXJlbnROYW1lKCk7Ci0gICAgdHlwZSA9IHdzZGxDb250ZW50UGFnZS5nZXRUeXBlKCk7Ci0gICAgaXNWYWxpZCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmlsZSBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiB0aGUgY2hvb3NlIHBhZ2UuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBmaWxlIHNlbGVjdGVkYnkgdGhlIHVzZXIgaW4gdGhlIGNob29zZSBwYWdlLgotICAgKi8KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSVBhdGggY29udGFpbmluZyB0aGUgc2VsZWN0ZWQgSUZpbGUuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBJUGF0aCBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBJRmlsZS4KLSAgICovCi0gIHB1YmxpYyBJUGF0aCBnZXRDb250YWluZXJGdWxsUGF0aCgpCi0gIHsKLSAgICByZXR1cm4gY29udGFpbmVyRnVsbFBhdGg7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGluIHRoZSBSZXNvdXJjZSBOYXZpZ2F0b3Igdmlldy4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHNlbGVjdGlvbiBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcuCi0gICAqLwotICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRSZXNvdXJjZU5hdmlnYXRvclNlbGVjdGlvbigpCi0gIHsKLSAgICBJVmlld1JlZmVyZW5jZSB2aWV3UGFydHNbXSA9Ci0gICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRWaWV3UmVmZXJlbmNlcygpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2aWV3UGFydHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKHZpZXdQYXJ0c1tpXSBpbnN0YW5jZW9mIFJlc291cmNlTmF2aWdhdG9yKQotICAgICAgewotICAgICAgICByZXR1cm4gKChSZXNvdXJjZU5hdmlnYXRvcikgdmlld1BhcnRzW2ldKS5nZXRWaWV3U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgbGlzdCBvZiBXU0RMIGxvY2F0aW9ucyB0byBsZXQgdGhlIHVzZXIgY2hvb3NlIGZyb20uCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbGxvY2F0aW9ucyBBIGxpc3Qgb2YgV1NETCBkb2N1bWVudCBsb2NhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMTG9jYXRpb25zKFN0cmluZ1tdIHdzZGxsb2NhdGlvbnMpIAotICB7Ci0JdGhpcy53c2RsbG9jYXRpb25zID0gd3NkbGxvY2F0aW9uczsKLQkKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBXU0RMIGxvY2F0aW9ucyB0aGUgdXNlciBjYW4gY2hvb3NlIGZyb20uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFdTREwgbG9jYXRpb25zLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldFdTRExMb2NhdGlvbnMoKQotICB7Ci0gIAlyZXR1cm4gd3NkbGxvY2F0aW9uczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmRMb2dQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MmM0ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJVUlQbHVnaW47Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIAotICogV1MtSSBNZXNzYWdlIExvZyBmaWxlIGZvciBwdXJwb3NlcyBvZiB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25XaXphcmRMb2dQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZQotewotICAvKioKLSAgICogUmVjb21tZW5kZWQgZXh0ZW5zaW9uIGZvciBhIFdTLUkgTWVzc2FnZSBMb2cgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTSV9MT0dfRVhURU5TSU9OID0gIndzaW1zZyI7Ci0gCi0gIC8qKgotICAgKiBEZWZhdWx0IFdTLUkgTWVzc2FnZSBmaWxlbmFtZSBwYXNzZWQgaW4gdGhlIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZTsKLSAgCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBzZWxlY3Rpb246IHNlbGVjdGlvbiBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcuCi0gICAqIEBwYXJhbSBmaWxlbmFtZTogZGVmYXVsdCBtZXNzYWdlIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICBzdXBlcigiVmFsaWRhdGlvbldpemFyZExvZ1BhZ2UiLCBzZWxlY3Rpb24pOwotICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICB0aGlzLnNldFRpdGxlKFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfU0VMRUNUX0xPR19GSUxFTkFNRV9IRUFESU5HIikpOwotICAgIHRoaXMuc2V0RGVzY3JpcHRpb24oV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9TRUxFQ1RfTE9HX0ZJTEVOQU1FX0VYUEwiKSk7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotICAgKi8KLSAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLSAgICBzdXBlci5zZXRGaWxlTmFtZShmaWxlbmFtZSk7Ci0gICAgc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGVkIGZpbGUuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCBJRmlsZS4gIAotICAgKi8KLSAgcHVibGljIElGaWxlIGdldEZpbGUoKQotICB7Ci0gICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLSAgICBTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IChuZXcgUGF0aChmaWxlTmFtZSkpLmdldEZpbGVFeHRlbnNpb24oKTsKLSAgICAKLSAgICBpZiAoZmlsZUV4dGVuc2lvbiA9PSBudWxsKQotICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5jb25jYXQoIi4iICsgV1NJX0xPR19FWFRFTlNJT04pOwotICAgICAgCi0gICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShnZXRDb250YWluZXJGdWxsUGF0aCgpLmFwcGVuZChmaWxlTmFtZSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBzZWxlY3RlZCBmaWxlIGlzIGEgdmFsaWQgV1MtSSBNZXNzYWdlIExvZyBmaWxlbmFtZS4KLSAgICogCi0gICAqIFNpbmNlIHRoZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIGRvZXMgbm90IHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvCi0gICAqIGFsbG93IHRoZSBmaWxlIHNwZWNpZmllZCB0byBhbHJlYWR5IGV4aXN0IChpdCBnaXZlcyBhbiBlcnJvciB0aGF0IHRoZQotICAgKiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgYW4gbm8gd2F5IG9mIGFsbG93aW5nIGl0IHRvIHBhc3MpLCBhbmQgd2Ugd2FudAotICAgKiB0byBhbGxvdyB0aGUgZmlsZSB0byBleGlzdCwgc28gdGhhdCB3ZSBjYW4gb3ZlcndyaXRlIGl0LCB3ZSBoYXZlIHRvCi0gICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBhbmQgZG8gc29tZSBtYWdpYyB0byBhbGxvdyB0aGlzIGNhc2UgdG8gcGFzcy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHNlbGVjdGVkIGZpbGUgaXMgYSB2YWxpZCBXUy1JIE1lc3NhZ2UgTG9nIGZpbGVuYW1lLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSN2YWxpZGF0ZVBhZ2UoKQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgCi0gIHsKLSAgICBTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IChuZXcgUGF0aChnZXRGaWxlTmFtZSgpKSkuZ2V0RmlsZUV4dGVuc2lvbigpOwotICAgIGlmIChmaWxlRXh0ZW5zaW9uICE9IG51bGwpIAotICAgIHsKLSAgICAgIGlmIChmaWxlRXh0ZW5zaW9uLmNvbXBhcmVUbyhXU0lfTE9HX0VYVEVOU0lPTikgIT0gMCkKLSAgICAgIHsgICAgICAgIAotICAgICAgICBzZXRFcnJvck1lc3NhZ2UoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9FUlJPUl9JTlZBTElEX0xPR19GSUxFX0VYVEVOU0lPTiIpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBFc3NlbnRpYWxseSwgd2UgdGFrZSB0aGUgY29udGFpbmVyIGFuZCBjb25jYXQgdGhlIGZpbGUgdG8gaXQsIGFuZAotICAgIC8vIGNoZWNrIGlmIGl0cyBpbiB0aGUgd29ya3NwYWNlLCBpZiBpdCBpcywgdGhlbiBpdCBleGlzdHMgYW5kIHdlIGNhbiAKLSAgICAvLyBwcm9jZWVkLiBPdGhlcndpc2UsIGNvbnRpbnVlIHdpdGggdGhlIGRlZmF1bHQgdmFsaWRhdGluZy4KLSAgICBpZiAoIChnZXRDb250YWluZXJGdWxsUGF0aCgpICE9IG51bGwpICYmIChnZXRDb250YWluZXJGdWxsUGF0aCgpLmlzRW1wdHkoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgJiYgKGdldEZpbGVOYW1lKCkuY29tcGFyZVRvKCIiKSAhPSAwKSkKLSAgICB7Ci0gICAgICBQYXRoIGZ1bGxQYXRoOwotICAgICAgICAgICAgCi0gICAgICBpZiAoZmlsZUV4dGVuc2lvbiAhPSBudWxsKQotICAgICAgICBmdWxsUGF0aCA9IG5ldyBQYXRoKGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGdldEZpbGVOYW1lKCkpOwotICAgICAgZWxzZQotICAgICAgICBmdWxsUGF0aCA9IG5ldyBQYXRoKGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGdldEZpbGVOYW1lKCkgKyAiLiIgKyBXU0lfTE9HX0VYVEVOU0lPTik7Ci0gICAgICAKLSAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmdWxsUGF0aCk7Ci0gICAgICAKLSAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKQotICAgICAgICBzZXRNZXNzYWdlKFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfV0FSTklOR19GSUxFX0FMUkVBRFlfRVhJU1RTIikpOwotICAgICAgZWxzZQotICAgICAgICBzZXRNZXNzYWdlKG51bGwpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1N2E0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdWkvaW50ZXJuYWwvd2l6YXJkcy9WYWxpZGF0aW9uV2l6YXJkV1NETENvbnRlbnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5XU0lVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFdpemFyZCBwYWdlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSAKLSAqIFdTREwgZG9jdW1lbnQgZm9yIHRoZSBXZWIgc2VydmljZS4KLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uV2l6YXJkV1NETENvbnRlbnRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi17Ci0gIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUID0gInBvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJT04gPSAib3BlcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORElORyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVFRZUEUgPSAicG9ydHR5cGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIm1lc3NhZ2UiOwotICAvKioKLSAgICogQWNjZXNzIHRvIHRoZSBpbmNsdWRlV1NETCBmbGFnLiAgCi0gICAqLwotICBwcm90ZWN0ZWQgQnV0dG9uIHdzZGxQb3J0QnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIHdzZGxCaW5kaW5nQnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIHdzZGxQb3J0VHlwZUJ1dHRvbjsKLSAgcHJvdGVjdGVkIEJ1dHRvbiB3c2RsT3BlcmF0aW9uQnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIHdzZGxNZXNzYWdlQnV0dG9uOwotCi0gIHByb3RlY3RlZCBDb21ibyBuYW1lQ29tYm87Ci0gIHByb3RlY3RlZCBUZXh0IG5hbWVzcGFjZVRleHQ7Ci0gIC8vcHJvdGVjdGVkIENvbWJvIHBhcmVudENvbWJvOwotICAvL3Byb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotICBwcm90ZWN0ZWQgVGV4dCBwYXJlbnRuYW1lVGV4dDsKLQotICBwcm90ZWN0ZWQgTGlzdCBwb3J0cyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IG9wZXJhdGlvbnMgPSBudWxsOwotICBwcm90ZWN0ZWQgTGlzdCBiaW5kaW5ncyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IHBvcnR0eXBlcyA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IG1lc3NhZ2VzID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gc2VsZWN0aW9uOiBzZWxlY3Rpb24gaW4gdGhlIFJlc291cmNlIE5hdmlnYXRvciB2aWV3LgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgc3VwZXIoIlZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UiKTsKLSAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICB0aGlzLnNldFRpdGxlKFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfU0VMRUNUX1dTRExfRUxFTUVOVF9IRUFESU5HIikpOwotICAgIHRoaXMuc2V0RGVzY3JpcHRpb24oV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9TRUxFQ1RfV1NETF9FTEVNRU5UX0VYUEwiKSk7Ci0gIH0KLQotICAvKioKLSAgICogQWx3YXlzIHJldHVybnMgdHJ1ZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkKLSAgewotICAgIGlmICgoKFZhbGlkYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5pbmNsdWRlV1NETEZpbGUoKSkKLSAgICB7Ci0gICAgICBpbnQgc2VsZWN0aW9uID0gbmFtZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uICE9IC0xICYmICFuYW1lQ29tYm8uZ2V0SXRlbShzZWxlY3Rpb24pLmVxdWFscygiIikpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qCi0gICAqIENyZWF0ZXMgdGhlIHRvcCBsZXZlbCBjb250cm9sIGZvciB0aGlzIHBhZ2UgdW5kZXIgdGhlIGdpdmVuIAotICAgKiBwYXJlbnQgY29tcG9zaXRlLiBJbXBsZW1lbnRvcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZwotICAgKiB0aGF0IHRoZSBjcmVhdGVkIGNvbnRyb2wgY2FuIGJlIGFjY2Vzc2VkIHZpYSBnZXRDb250cm9sIAotICAgKgotICAgKiBAcGFyYW0gcGFyZW50IC0gdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBiYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBHcmlkRGF0YSBkYXRhOwotCi0gICAgLy8gY3JlYXRlIGEgZ3JvdXAKLSAgICBHcm91cCB3c2RsRWxlbWVudEdyb3VwID0gbmV3IEdyb3VwKGJhc2UsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICB3c2RsRWxlbWVudEdyb3VwLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9HUk9VUF9URVhUX0VMRU1FTlQiKSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICB3c2RsRWxlbWVudEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICB3c2RsRWxlbWVudEdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0gICAgLy8gY3JlYXRlIGEgYmFzZSBwYW5lbCB3aXRoIDIgY29sdW1ucwotICAgIENvbXBvc2l0ZSBiYXNlUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHdzZGxFbGVtZW50R3JvdXAsIFNXVC5OT05FKTsKLSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0gICAgYmFzZVBhbmVsLnNldExheW91dChsYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgYmFzZVBhbmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBjb250ZW50IGZvciBmaXJzdCBjb2x1bW4KLSAgICBjcmVhdGVXU0RMRWxlbWVudFR5cGVDb250ZW50KGJhc2VQYW5lbCk7Ci0KLSAgICAvLyBjb250ZW50IGZvciBzZWNvbmQgY29sdW1uCi0gICAgY3JlYXRlV1NETEVsZW1lbnRDb250ZW50KGJhc2VQYW5lbCk7Ci0KLSAgICBzZXRDb250cm9sKGJhc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGdyb3VwIG9mIHJhZGlvIGJ1dHRvbnMgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBXU0RMIGVsZW1lbnQuCi0gICAqIFRoZSBmaXZlIHRwZXMgYXJlOiBwb3J0LCBiaW5kaW5nLCBwb3J0VHlwZSwgb3BlcmF0aW9uIGFuZCBtZXNzYWdlLgotICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udGFpbmVyLiAKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVdTRExFbGVtZW50VHlwZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIC8vIGNyZWF0ZSBhIGdyb3VwCi0gICAgR3JvdXAgd3NkbFR5cGVHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5TSEFET1dfRVRDSEVEX0lOKTsKLSAgICB3c2RsVHlwZUdyb3VwLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9HUk9VUF9URVhUX1RZUEUiKSk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0gICAgd3NkbFR5cGVHcm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgd3NkbFR5cGVHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotICAgIHdzZGxQb3J0QnV0dG9uID0gbmV3IEJ1dHRvbih3c2RsVHlwZUdyb3VwLCBTV1QuUkFESU8pOwotICAgIHdzZGxQb3J0QnV0dG9uLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9SQURJT19QT1JUIikpOwotICAgIHdzZGxQb3J0QnV0dG9uLnNldERhdGEoIndzZGxQb3J0QnV0dG9uIik7Ci0gICAgd3NkbFBvcnRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgIHdzZGxQb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBQb3J0QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLSAgICB3c2RsQmluZGluZ0J1dHRvbiA9IG5ldyBCdXR0b24od3NkbFR5cGVHcm91cCwgU1dULlJBRElPKTsKLSAgICB3c2RsQmluZGluZ0J1dHRvbi5zZXREYXRhKCJ3c2RsQmluZGluZ0J1dHRvbiIpOwotICAgIHdzZGxCaW5kaW5nQnV0dG9uLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9SQURJT19CSU5ESU5HIikpOwotICAgIHdzZGxCaW5kaW5nQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgd3NkbEJpbmRpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IEJpbmRpbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotICAgIHdzZGxQb3J0VHlwZUJ1dHRvbiA9IG5ldyBCdXR0b24od3NkbFR5cGVHcm91cCwgU1dULlJBRElPKTsKLSAgICB3c2RsUG9ydFR5cGVCdXR0b24uc2V0RGF0YSgid3NkbFBvcnRUeXBlQnV0dG9uIik7Ci0gICAgd3NkbFBvcnRUeXBlQnV0dG9uLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9SQURJT19QT1JUX1RZUEUiKSk7Ci0gICAgd3NkbFBvcnRUeXBlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgd3NkbFBvcnRUeXBlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBQb3J0VHlwZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0gICAgd3NkbE9wZXJhdGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24od3NkbFR5cGVHcm91cCwgU1dULlJBRElPKTsKLSAgICB3c2RsT3BlcmF0aW9uQnV0dG9uLnNldERhdGEoIndzZGxPcGVyYXRpb25CdXR0b24iKTsKLSAgICB3c2RsT3BlcmF0aW9uQnV0dG9uLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9SQURJT19PUEVSQVRJT04iKSk7Ci0gICAgd3NkbE9wZXJhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIHdzZGxPcGVyYXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IE9wZXJhdGlvbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0gICAgd3NkbE1lc3NhZ2VCdXR0b24gPSBuZXcgQnV0dG9uKHdzZGxUeXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgd3NkbE1lc3NhZ2VCdXR0b24uc2V0RGF0YSgid3NkbE1lc3NhZ2VCdXR0b24iKTsKLSAgICB3c2RsTWVzc2FnZUJ1dHRvbi5zZXRUZXh0KFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfUkFESU9fTUVTU0FHRSIpKTsKLSAgICB3c2RsTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgIHdzZGxNZXNzYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBNZXNzYWdlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgcGFuZWwgdG8gY2FwdHVyZSB0aGUgbmFtZSwgbmFtZXNwYWNlIGFuZCBwYXJlbnQgb2YgYW4KLSAgICogV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udGFpbmVyLiAKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVdTRExFbGVtZW50Q29udGVudChDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgLy8gY3JlYXRlIGEgZ3JvdXBpbmcgd2l0aCAyIGNvbHVtbnMsIG9uZSBmb3IgbGFiZWxzIGFuZCB0aGVvdGhlciBmb3IgZmllbGRzCi0gICAgQ29tcG9zaXRlIGZpZWxkQ29sdW1uID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLSAgICBmaWVsZENvbHVtbi5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGZpZWxkQ29sdW1uLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBUaGUgV1NETCBlbGVtZW50IG5hbWUgbGFiZWwKLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChmaWVsZENvbHVtbiwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9MQUJFTF9OQU1FIikpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBUaGUgV1NETCBlbGVtZW50IG5hbWUgZmllbGQKLSAgICBuYW1lQ29tYm8gPSBuZXcgQ29tYm8oZmllbGRDb2x1bW4sIFNXVC5SRUFEX09OTFkpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgbmFtZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBOYW1lU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0gICAgLy9uYW1lVGV4dCA9IG5ldyBUZXh0KGZpZWxkQ29sdW1uLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgLy9kYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgLy9kYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIC8vZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAvL2RhdGEud2lkdGhIaW50ID0gNTA7Ci0gICAgLy9uYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIC8vbmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFRleHRCb3hMaXN0ZW5lcigpKTsKLQotICAgIC8vIFRoZSBXU0RMIGVsZW1lbnQgbmFtZXNwYWNlIGxhYmVsCi0gICAgbGFiZWwgPSBuZXcgTGFiZWwoZmllbGRDb2x1bW4sIFNXVC5MRUZUKTsKLSAgICBsYWJlbC5zZXRUZXh0KFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfTEFCRUxfTkFNRVNQQUNFIikpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICAvLyBUaGUgV1NETCBlbGVtZW50IG5hbWVzcGFjZSBmaWVsZAotICAgIG5hbWVzcGFjZVRleHQgPSBuZXcgVGV4dChmaWVsZENvbHVtbiwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGF0YS53aWR0aEhpbnQgPSA1MDsKLSAgICBuYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgbmFtZXNwYWNlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgVGV4dEJveExpc3RlbmVyKCkpOwotICAgIG5hbWVzcGFjZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0gICAgLy8gVGhlIFdTREwgZWxlbWVudCBwYXJlbnQgbGFiZWwKLSAgICBsYWJlbCA9IG5ldyBMYWJlbChmaWVsZENvbHVtbiwgU1dULkxFRlQpOwotICAgIGxhYmVsLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9MQUJFTF9QQVJFTlQiKSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIC8vIFRoZSBXU0RMIGVsZW1lbnQgcGFyZW50IGZpZWxkCi0gICAgLy8gICAgcGFyZW50Q29tYm8gPSBuZXcgQ29tYm8oZmllbGRDb2x1bW4sIFNXVC5SRUFEX09OTFkpOwotICAgIC8vICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAvLyAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIC8vICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgLy8gICAgcGFyZW50Q29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICBwYXJlbnRuYW1lVGV4dCA9IG5ldyBUZXh0KGZpZWxkQ29sdW1uLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkYXRhLndpZHRoSGludCA9IDUwOwotICAgIHBhcmVudG5hbWVUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgcGFyZW50bmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IFRleHRCb3hMaXN0ZW5lcigpKTsKLSAgICBwYXJlbnRuYW1lVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogQWx3YXlzIHJldHVybiB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZW50IHdoZW4gZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotICAgKiBAcGFyYW0gZSAtIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0KLSAgLyoqCi0gICAqIEhhbmRsZXMgdGhlIGluY2x1ZGVXU0RMIGNoZWNrYm94LgotICAgKiBTZW50IHdoZW4gc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4gCi0gICAqIEBwYXJhbSBlIC0gYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICB7fQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGVsZW1lbnQgbmFtZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKQotICB7Ci0gICAgaW50IHNlbGVjdGlvbiA9IG5hbWVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgIGlmKHNlbGVjdGlvbiAhPSAtMSkKLSAgICB7ICAKLSAgICAgIHJldHVybiBuYW1lQ29tYm8uZ2V0SXRlbShzZWxlY3Rpb24pOwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlVGV4dC5nZXRUZXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKQotICB7Ci0gICAgLy9yZXR1cm4gcGFyZW50Q29tYm8uZ2V0SXRlbShwYXJlbnRDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLSAgICByZXR1cm4gcGFyZW50bmFtZVRleHQuZ2V0VGV4dCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgaWYgKHdzZGxCaW5kaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIHJldHVybiBCSU5ESU5HOwotICAgIH0KLSAgICBlbHNlIGlmICh3c2RsTWVzc2FnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgICByZXR1cm4gTUVTU0FHRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAod3NkbE9wZXJhdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgICByZXR1cm4gT1BFUkFUSU9OOwotICAgIH0KLSAgICBlbHNlIGlmICh3c2RsUG9ydEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkKLSAgICB7Ci0gICAgICByZXR1cm4gUE9SVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAod3NkbFBvcnRUeXBlQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgIHsKLSAgICAgIHJldHVybiBQT1JUVFlQRTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50KQotICB7Ci0gICAgaWYgKHBvcnRzID09IG51bGwpCi0gICAgewotICAgICAgcmVzZXRFbGVtZW50cygpOwotICAgIH0KLSAgICBpZiAodHlwZS5lcXVhbHMoUE9SVCkpCi0gICAgewotICAgICAgcG9ydHMuYWRkKG5ldyBXU0RMRWxlbWVudChuYW1lLCBuYW1lc3BhY2UsIHBhcmVudCkpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoT1BFUkFUSU9OKSkKLSAgICB7Ci0gICAgICBvcGVyYXRpb25zLmFkZChuZXcgV1NETEVsZW1lbnQobmFtZSwgbmFtZXNwYWNlLCBwYXJlbnQpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKEJJTkRJTkcpKQotICAgIHsKLSAgICAgIGJpbmRpbmdzLmFkZChuZXcgV1NETEVsZW1lbnQobmFtZSwgbmFtZXNwYWNlLCBwYXJlbnQpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKFBPUlRUWVBFKSkKLSAgICB7Ci0gICAgICBwb3J0dHlwZXMuYWRkKG5ldyBXU0RMRWxlbWVudChuYW1lLCBuYW1lc3BhY2UsIHBhcmVudCkpOwotICAgIH0KLSAgICBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoTUVTU0FHRSkpCi0gICAgewotICAgICAgbWVzc2FnZXMuYWRkKG5ldyBXU0RMRWxlbWVudChuYW1lLCBuYW1lc3BhY2UsIHBhcmVudCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlc2V0RWxlbWVudHMoKQotICB7Ci0gICAgcG9ydHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgb3BlcmF0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgICBiaW5kaW5ncyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwb3J0dHlwZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgbmFtZUNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgbmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB2YWx1ZSB0byB0aGUgbGlzdCBib3gKLSAgICovCi0gIGNsYXNzIFdvcmtzcGFjZUJ1dHRvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBsaXN0IGJveAotICAgKi8KLSAgY2xhc3MgQnJvd3NlQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgdmFsdWUgdG8gdGhlIGxpc3QgYm94Ci0gICAqLwotICBjbGFzcyBTZWFyY2hVRERJQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLSAgfQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBmaWxlIGZpZWxkLgotICAgKi8KLSAgY2xhc3MgVGV4dEJveExpc3RlbmVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIKLSAgewotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpCi0gICAgewotICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCi0gICAgfQotCi0gIH0KLSAgcHJpdmF0ZSBjbGFzcyBXU0RMRWxlbWVudAotICB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcGFyZW50OwotCi0gICAgcHVibGljIFdTRExFbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50KQotICAgIHsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKQotICAgIHsKLSAgICAgIHJldHVybiBuYW1lc3BhY2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIChub24tSmF2YWRvYykKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkKLSAgewotICAgIHJlc2V0RWxlbWVudHMoKTsKLSAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotICAgIGlmICh2aXNpYmxlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgV1NETFJlYWRlciByZWFkZXIgPSBmYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZFbGVtID0gcmVhZGVyLnJlYWRXU0RMKCgoVmFsaWRhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLmdldFdTRExGaWxlKCkpOwotICAgICAgICBRTmFtZSBkZWZRTmFtZSA9IGRlZkVsZW0uZ2V0UU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGRlZm5hbWUgPSAiIjsKLSAgICAgICAgaWYgKGRlZlFOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBkZWZuYW1lID0gZGVmUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGRlZkVsZW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0KLSAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIHBvcnRzCi0gICAgICAgIE1hcCBzZXJ2bWFwID0gZGVmRWxlbS5nZXRTZXJ2aWNlcygpOwotICAgICAgICBpZiAoc2Vydm1hcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBzZXJ2cyA9IHNlcnZtYXAudmFsdWVzKCk7Ci0gICAgICAgICAgaWYgKHNlcnZzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3Igc2Vydkl0ZXIgPSBzZXJ2cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKHNlcnZJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIHNlcnZuYW1lID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCi0gICAgICAgICAgICAgIE1hcCBwb3J0bWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgICBpZiAocG9ydG1hcCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBwb3J0cyA9IHBvcnRtYXAudmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcnRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgcG9ydEl0ZXIgPSBwb3J0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgd2hpbGUgKHBvcnRJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwb3J0LmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkRWxlbWVudChWYWxpZGF0aW9uV2l6YXJkV1NETENvbnRlbnRQYWdlLlBPUlQsIG5hbWUsIG5hbWVzcGFjZSwgc2Vydm5hbWUpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBCaW5kaW5ncwotICAgICAgICBNYXAgYmluZGluZ21hcCA9IGRlZkVsZW0uZ2V0QmluZGluZ3MoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdtYXAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIENvbGxlY3Rpb24gYmluZGluZ3MgPSBiaW5kaW5nbWFwLnZhbHVlcygpOwotICAgICAgICAgIGlmIChiaW5kaW5ncyAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGJpbmRJdGVyID0gYmluZGluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChiaW5kSXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBiaW5kSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICBhZGRFbGVtZW50KFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuQklORElORywgbmFtZSwgbmFtZXNwYWNlLCBkZWZuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWdpc3RlciB0aGUgUG9ydFR5cGVzIGFuZCBPcGVyYXRpb25zCi0gICAgICAgIE1hcCBwb3J0dHlwZW1hcCA9IGRlZkVsZW0uZ2V0UG9ydFR5cGVzKCk7Ci0gICAgICAgIGlmIChwb3J0dHlwZW1hcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBwb3J0dHlwZXMgPSBwb3J0dHlwZW1hcC52YWx1ZXMoKTsKLSAgICAgICAgICBpZiAocG9ydHR5cGVzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgcG9ydHR5cGVJdGVyID0gcG9ydHR5cGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocG9ydHR5cGVJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydHR5cGUgPSAoUG9ydFR5cGUpIHBvcnR0eXBlSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgIFN0cmluZyBwb3J0dHlwZW5hbWUgPSBwb3J0dHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICBhZGRFbGVtZW50KFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuUE9SVFRZUEUsIHBvcnR0eXBlbmFtZSwgbmFtZXNwYWNlLCBkZWZuYW1lKTsKLQotICAgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgT3BlcmF0aW9ucwotICAgICAgICAgICAgICBMaXN0IG9wZXJhdGlvbnMgPSBwb3J0dHlwZS5nZXRPcGVyYXRpb25zKCk7Ci0gICAgICAgICAgICAgIGlmIChvcGVyYXRpb25zICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBvcGVySXRlciA9IG9wZXJhdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAob3Blckl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcGVySXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICBhZGRFbGVtZW50KFZhbGlkYXRpb25XaXphcmRXU0RMQ29udGVudFBhZ2UuT1BFUkFUSU9OLCBuYW1lLCBuYW1lc3BhY2UsIHBvcnR0eXBlbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1hcCBtZXNzYWdlbWFwID0gZGVmRWxlbS5nZXRNZXNzYWdlcygpOwotICAgICAgICBpZiAobWVzc2FnZW1hcCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBtZXNzYWdlcyA9IG1lc3NhZ2VtYXAudmFsdWVzKCk7Ci0gICAgICAgICAgaWYgKG1lc3NhZ2VzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgSXRlcmF0b3IgbWVzc0l0ZXIgPSBtZXNzYWdlcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKG1lc3NJdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1lc3NJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgICAgIGFkZEVsZW1lbnQoVmFsaWRhdGlvbldpemFyZFdTRExDb250ZW50UGFnZS5NRVNTQUdFLCBuYW1lLCBuYW1lc3BhY2UsIGRlZm5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgICBpbnQgbnVtRWxlbXMgPSBwb3J0cy5zaXplKCk7Ci0gICAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgcG9ydHMudG9BcnJheShuZXcgV1NETEVsZW1lbnRbbnVtRWxlbXNdKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZUNvbWJvLmFkZChlbGVtc1tpXS5nZXROYW1lKCksIGkpOwotICAgICAgICAgIGlmIChpID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldFBhcmVudE5hbWUoKSk7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd3NkbFBvcnRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB3c2RsQmluZGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB3c2RsTWVzc2FnZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICB3c2RsT3BlcmF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHdzZGxQb3J0VHlwZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBUaGUgV1NETCBmaWxlIGlzIG5vdCB2YWxpZC4KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc2V0RWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgfQotCi0gIGNsYXNzIFBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgIH0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgbmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgaW50IG51bUVsZW1zID0gcG9ydHMuc2l6ZSgpOwotICAgICAgV1NETEVsZW1lbnRbXSBlbGVtcyA9IChXU0RMRWxlbWVudFtdKSBwb3J0cy50b0FycmF5KG5ldyBXU0RMRWxlbWVudFtudW1FbGVtc10pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtczsgaSsrKQotICAgICAgewotICAgICAgICBuYW1lQ29tYm8uYWRkKGVsZW1zW2ldLmdldE5hbWUoKSwgaSk7Ci0gICAgICAgIGlmIChpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lQ29tYm8uc2VsZWN0KDApOwotICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXRQYXJlbnROYW1lKCkpOwotCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotICBjbGFzcyBCaW5kaW5nQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIG5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIGludCBudW1FbGVtcyA9IGJpbmRpbmdzLnNpemUoKTsKLSAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgYmluZGluZ3MudG9BcnJheShuZXcgV1NETEVsZW1lbnRbbnVtRWxlbXNdKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbmFtZUNvbWJvLmFkZChlbGVtc1tpXS5nZXROYW1lKCksIGkpOwotICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0UGFyZW50TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotCi0gIH0KLSAgY2xhc3MgUG9ydFR5cGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyCi0gIHsKLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICB3aWRnZXRTZWxlY3RlZChlKTsKLQotICAgIH0KLQotICAgIC8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgbmFtZUNvbWJvLnJlbW92ZUFsbCgpOwotICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoIiIpOwotICAgICAgaW50IG51bUVsZW1zID0gcG9ydHR5cGVzLnNpemUoKTsKLSAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgcG9ydHR5cGVzLnRvQXJyYXkobmV3IFdTRExFbGVtZW50W251bUVsZW1zXSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVsZW1zOyBpKyspCi0gICAgICB7Ci0gICAgICAgIG5hbWVDb21iby5hZGQoZWxlbXNbaV0uZ2V0TmFtZSgpLCBpKTsKLSAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgICAgbmFtZXNwYWNlVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KGVsZW1zW2ldLmdldFBhcmVudE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLQotICB9Ci0gIGNsYXNzIE9wZXJhdGlvbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIHdpZGdldFNlbGVjdGVkKGUpOwotCi0gICAgfQotCi0gICAgLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICB7Ci0gICAgICBuYW1lQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoIiIpOwotICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBpbnQgbnVtRWxlbXMgPSBvcGVyYXRpb25zLnNpemUoKTsKLSAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgb3BlcmF0aW9ucy50b0FycmF5KG5ldyBXU0RMRWxlbWVudFtudW1FbGVtc10pOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtczsgaSsrKQotICAgICAgewotICAgICAgICBuYW1lQ29tYm8uYWRkKGVsZW1zW2ldLmdldE5hbWUoKSwgaSk7Ci0gICAgICAgIGlmIChpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lQ29tYm8uc2VsZWN0KDApOwotICAgICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dChlbGVtc1tpXS5nZXRQYXJlbnROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgfQotICBjbGFzcyBNZXNzYWdlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIG5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICBwYXJlbnRuYW1lVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgIGludCBudW1FbGVtcyA9IG1lc3NhZ2VzLnNpemUoKTsKLSAgICAgIFdTRExFbGVtZW50W10gZWxlbXMgPSAoV1NETEVsZW1lbnRbXSkgbWVzc2FnZXMudG9BcnJheShuZXcgV1NETEVsZW1lbnRbbnVtRWxlbXNdKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbXM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbmFtZUNvbWJvLmFkZChlbGVtc1tpXS5nZXROYW1lKCksIGkpOwotICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZUNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgICBuYW1lc3BhY2VUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICAgIHBhcmVudG5hbWVUZXh0LnNldFRleHQoZWxlbXNbaV0uZ2V0UGFyZW50TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgfQotCi0gIH0KLQotICBjbGFzcyBOYW1lU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0KLSAgICB9Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIGludCBzZWxlY3Rpb24gPSAoKENvbWJvKSBlLmdldFNvdXJjZSgpKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgU3RyaW5nIHR5cGUgPSBnZXRUeXBlKCk7Ci0gICAgICBXU0RMRWxlbWVudCBlbGVtID0gbnVsbDsKLSAgICAgIGlmICh0eXBlLmVxdWFscyhQT1JUKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbSA9IChXU0RMRWxlbWVudCkgcG9ydHMuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhCSU5ESU5HKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbSA9IChXU0RMRWxlbWVudCkgYmluZGluZ3MuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhQT1JUVFlQRSkpCi0gICAgICB7Ci0gICAgICAgIGVsZW0gPSAoV1NETEVsZW1lbnQpIHBvcnR0eXBlcy5nZXQoc2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHR5cGUuZXF1YWxzKE9QRVJBVElPTikpCi0gICAgICB7Ci0gICAgICAgIGVsZW0gPSAoV1NETEVsZW1lbnQpIG9wZXJhdGlvbnMuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlLmVxdWFscyhNRVNTQUdFKSkKLSAgICAgIHsKLSAgICAgICAgZWxlbSA9IChXU0RMRWxlbWVudCkgbWVzc2FnZXMuZ2V0KHNlbGVjdGlvbik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlbGVtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzcGFjZVRleHQuc2V0VGV4dChlbGVtLmdldE5hbWVzcGFjZSgpKTsKLSAgICAgICAgcGFyZW50bmFtZVRleHQuc2V0VGV4dChlbGVtLmdldFBhcmVudE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS91aS9pbnRlcm5hbC93aXphcmRzL1ZhbGlkYXRpb25XaXphcmRXU0RMUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDY4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3VpL2ludGVybmFsL3dpemFyZHMvVmFsaWRhdGlvbldpemFyZFdTRExQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kudWkuaW50ZXJuYWwuV1NJVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS51aS5pbnRlcm5hbC5kaWFsb2dzLlNlbGVjdFNpbmdsZUZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIAotICogV1NETCBkb2N1bWVudCBmb3IgdGhlIFdlYiBzZXJ2aWNlLgotICogCi0gKiBAYXV0aG9yIERhdmlkIExhdXpvbiwgSUJNCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25XaXphcmRXU0RMUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotewotCi0gIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiB3c2RsaW52YWxpZCA9IGZhbHNlOwotICAvKioKLSAgICogQWNjZXNzIHRvIHRoZSBpbmNsdWRlV1NETCBmbGFnLiAgCi0gICAqLwotICBwcm90ZWN0ZWQgQnV0dG9uIGluY2x1ZGVXU0RMQnV0dG9uOwotCi0gIC8qKgotICAgKiBBY2Nlc3MgdG8gdGhlIHdzZGwgZG9jdW1lbnQgZ3JvdXAuCi0gICAqLwotICBwcm90ZWN0ZWQgR3JvdXAgZG9jdW1lbnRHcm91cDsKLSAgcHJvdGVjdGVkIFRleHQgZG9jdW1lbnRMb2NhdGlvblRleHQ7Ci0gIHByb3RlY3RlZCBDb21ibyBmaWxlRmllbGQ7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBzZWxlY3Rpb246IHNlbGVjdGlvbiBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcuCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbldpemFyZFdTRExQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIHN1cGVyKCJWYWxpZGF0aW9uV2l6YXJkV1NETFBhZ2UiKTsKLSAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICB0aGlzLnNldFRpdGxlKFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfU0VMRUNUX1dTRExfRklMRU5BTUVfSEVBRElORyIpKTsKLSAgICB0aGlzLnNldERlc2NyaXB0aW9uKFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfU0VMRUNUX1dTRExfRklMRU5BTUVfRVhQTCIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbHdheXMgcmV0dXJucyB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKQotICB7Ci0gICAgaWYgKGluY2x1ZGVXU0RMRmlsZSgpKQotICAgIHsKLQotICAgICAgaWYgKGZpbGVGaWVsZC5nZXRUZXh0KCkgPT0gbnVsbCB8fCBmaWxlRmllbGQuZ2V0VGV4dCgpLmVxdWFscygiIikgfHwgd3NkbGludmFsaWQpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKgotICAgKiBDcmVhdGVzIHRoZSB0b3AgbGV2ZWwgY29udHJvbCBmb3IgdGhpcyBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQKLSAgICogY29tcG9zaXRlLiBJbXBsZW1lbnRvcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBjcmVhdGVkCi0gICAqIGNvbnRyb2wgY2FuIGJlIGFjY2Vzc2VkIHZpYSBnZXRDb250cm9sCi0gICAqIAotICAgKiBAcGFyYW0gcGFyZW50IC0gdGhlIHBhcmVudCBjb21wb3NpdGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICBiYXNlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLSAgICBHcmlkRGF0YSBkYXRhOwotCi0gICAgLy8gYWRkIGluY2x1ZGVXU0RMIGZsYWcKLSAgICBpbmNsdWRlV1NETEJ1dHRvbiA9IG5ldyBCdXR0b24oYmFzZSwgU1dULkNIRUNLKTsKLSAgICBpbmNsdWRlV1NETEJ1dHRvbi5zZXRUZXh0KFdTSVVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJfVUlfV0laQVJEX1ZfSU5DTFVERV9XU0RMX0JVVFRPTiIpKTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBpbmNsdWRlV1NETEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGluY2x1ZGVXU0RMQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIGluY2x1ZGVXU0RMQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0KLSAgICAvLyBjcmVhdGUgYSBXU0RMIGRvY3VtZW50IGdyb3VwCi0gICAgZG9jdW1lbnRHcm91cCA9IG5ldyBHcm91cChiYXNlLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBkb2N1bWVudEdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBkb2N1bWVudEdyb3VwLnNldExheW91dChsYXlvdXQpOwotICAgIGRvY3VtZW50R3JvdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLSAgICBjcmVhdGVEb2N1bWVudEdyb3VwQ29udGVudHMoZG9jdW1lbnRHcm91cCk7Ci0KLSAgICBzZXRDb250cm9sKGJhc2UpOwotICB9Ci0KLSAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRG9jdW1lbnRHcm91cENvbnRlbnRzKENvbXBvc2l0ZSBkb2N1bWVudEdyb3VwKQotICB7Ci0gICAgLy9yYWRpbyBidXR0b25zJyBjb250YWluZXIKLSAgICBDb21wb3NpdGUgYmFzZVBhbmVsID0gbmV3IENvbXBvc2l0ZShkb2N1bWVudEdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0gICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLSAgICBiYXNlUGFuZWwuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICBiYXNlUGFuZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIENvbXBvc2l0ZSBncm91cDEgPSBuZXcgQ29tcG9zaXRlKGJhc2VQYW5lbCwgU1dULk5PTkUpOwotICAgIGdyb3VwMS5zZXRGb250KGdldEZvbnQoKSk7Ci0gICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0gICAgZ3JvdXAxLnNldExheW91dChsYXlvdXQpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdyb3VwMS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgTGFiZWwgZG9jdW1lbnRMYWJlbCA9IG5ldyBMYWJlbChncm91cDEsIFNXVC5MRUZUKTsKLSAgICBkb2N1bWVudExhYmVsLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9JTkNMVURFX1dTRExfTEFCRUwiKSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZG9jdW1lbnRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIC8qKgotCSAqIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGJhc2VQYW5lbCwgU1dULkxFRlQpOyBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JICogZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JICogbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkgKi8KLSAgICBmaWxlRmllbGQgPSBuZXcgQ29tYm8oZ3JvdXAxLCBTV1QuRFJPUF9ET1dOKTsKLSAgICBTdHJpbmdbXSB3c2RsbG9jYXRpb25zID0gKChWYWxpZGF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuZ2V0V1NETExvY2F0aW9ucygpOwotICAgIGlmKHdzZGxsb2NhdGlvbnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnQgbnVtbG9jcyA9IHdzZGxsb2NhdGlvbnMubGVuZ3RoOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bWxvY3M7IGkrKykKLSAgICAgIHsKLSAgICAgIAlmaWxlRmllbGQuYWRkKHdzZGxsb2NhdGlvbnNbaV0pOwotICAgICAgfQotICAgIH0KLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotICAgIGRhdGEud2lkdGhIaW50ID0gMzA7Ci0gICAgZmlsZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgZmlsZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBGaWxlRmllbGRMaXN0ZW5lcigpKTsKLQotICAgIExhYmVsIHdzZGxMYWJlbCA9IG5ldyBMYWJlbChncm91cDEsIFNXVC5MRUZUKTsKLSAgICB3c2RsTGFiZWwuc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1ZBTElEX1dTRExfTEFCRUwiKSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZG9jdW1lbnRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgLy8gZG9jdW1lbnRMb2NhdGlvblRleHQgPSBuZXcgVGV4dChkb2N1bWVudEdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgLy8gZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIC8vIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgLy8gZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAvLyBkYXRhLndpZHRoSGludCA9IDMwOwotICAgIC8vIGRvY3VtZW50TG9jYXRpb25UZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLSAgICBDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKGJhc2VQYW5lbCwgU1dULk5PTkUpOwotICAgIGdyb3VwLnNldEZvbnQoZ2V0Rm9udCgpKTsKLSAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGxheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICBncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLSAgICBncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgQnV0dG9uIHdvcmtzcGFjZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLSAgICB3b3Jrc3BhY2VCdXR0b24uc2V0VGV4dChXU0lVSVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiX1VJX1dJWkFSRF9WX1dPUktCRU5DSF9CVVRUT04iKSk7Ci0gICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgd29ya3NwYWNlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgd29ya3NwYWNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBXb3Jrc3BhY2VCdXR0b25MaXN0ZW5lcigpKTsKLQotICAgIEJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgYnJvd3NlQnV0dG9uLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9CUk9XU0VfQlVUVE9OIikpOwotICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLSAgICBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgQnJvd3NlQnV0dG9uTGlzdGVuZXIoKSk7Ci0KLSAgICAvLyBCdXR0b24gc2VhcmNoVURESUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLSAgICAvLyBzZWFyY2hVRERJQnV0dG9uLnNldFRleHQoV1NJVUlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIl9VSV9XSVpBUkRfVl9TRUFSQ0hfVURESV9CVVRUT04iKSk7Ci0gICAgLy8gZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgIC8vIGRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgLy8gc2VhcmNoVURESUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgIC8vIHNlYXJjaFVERElCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlYXJjaFVERElCdXR0b25MaXN0ZW5lcigpKTsKLQotICAgIHJldHVybiBkb2N1bWVudEdyb3VwOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaW5jbHVkZVdTRExGaWxlKCkKLSAgewotICAgIHJldHVybiBpbmNsdWRlV1NETEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGZpbGVGaWVsZC5nZXRUZXh0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQWx3YXlzIHJldHVybiB0cnVlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZW50IHdoZW4gZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotICAgKiAKLSAgICogQHBhcmFtIGUgLQotICAgKiAgICAgICAgICAgIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHt9Ci0KLSAgLyoqCi0gICAqIEhhbmRsZXMgdGhlIGluY2x1ZGVXU0RMIGNoZWNrYm94LiBTZW50IHdoZW4gc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUKLSAgICogY29udHJvbC4KLSAgICogCi0gICAqIEBwYXJhbSBlIC0KLSAgICogICAgICAgICAgICBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWxlY3Rpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIHsKLSAgICBpZiAoZS53aWRnZXQgPT0gaW5jbHVkZVdTRExCdXR0b24pCi0gICAgewotICAgICAgaWYgKGluY2x1ZGVXU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpKQotICAgICAgewotICAgICAgICBkb2N1bWVudEdyb3VwLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGRvY3VtZW50R3JvdXAuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBnZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0V1NETEludmFsaWQoKQotICB7Ci0gICAgd3NkbGludmFsaWQgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB2YWx1ZSB0byB0aGUgbGlzdCBib3gKLSAgICovCi0gIGNsYXNzIFdvcmtzcGFjZUJ1dHRvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgewotICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKQotICAgIHsKLSAgICAgIFNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdFNpbmdsZUZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgc2VsZWN0aW9uLCBmYWxzZSk7Ci0gICAgICBkaWFsb2cuYWRkRmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiLndzZGwiIH0pOwotICAgICAgaW50IHJlc3VsdCA9IGRpYWxvZy5vcGVuKCk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKQotICAgICAgewotICAgICAgICBJRmlsZSBjdXJyZW50SUZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotICAgICAgICBpZiAoY3VycmVudElGaWxlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmaWxlRmllbGQuYWRkKGN1cnJlbnRJRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksIDApOwotICAgICAgICAgIGZpbGVGaWVsZC5zZWxlY3QoMCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBsaXN0IGJveAotICAgKi8KLSAgY2xhc3MgQnJvd3NlQnV0dG9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAge30KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgewotICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICAgIGRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLndzZGwiIH0pOwotICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IGRpYWxvZy5vcGVuKCk7Ci0gICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZpbGVGaWVsZC5hZGQoc2VsZWN0aW9uLCAwKTsKLSAgICAgICAgZmlsZUZpZWxkLnNlbGVjdCgwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBsaXN0IGJveAotICAgKi8KLSAgLy8gY2xhc3MgU2VhcmNoVURESUJ1dHRvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIKLSAgLy8gewotICAvLyAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gIC8vICB7fQotICAvLwotICAvLyAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgLy8gIHsKLSAgLy8gICAgU3RyaW5nIHRpdGxlID0gIkluZm9ybWF0aW9uIjsKLSAgLy8gICAgU3RyaW5nIG1lc3NhZ2UgPSAiVGhlIGNob3NlbiBvcGVyYXRpb24gaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuIjsKLSAgLy8gICAgTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotICAvLyAgfQotICAvL30KLQotICAvKioKLSAgICogQWRkIHZhbHVlIHRvIHRoZSBmaWxlIGZpZWxkLgotICAgKi8KLSAgY2xhc3MgRmlsZUZpZWxkTGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lcgotICB7Ci0KLSAgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIjbW9kaWZ5VGV4dChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50KQotCSAqLwotICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkKLSAgICB7Ci0gICAgICB3c2RsaW52YWxpZCA9IGZhbHNlOwotICAgICAgZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCi0gICAgfQotCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2N2RmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id3NpY29yZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndzaXZhbGlkYXRlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzMyYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotd3NpY29yZS5qYXIKLXdzaXZhbGlkYXRlLmphcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYwYzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC53c2k8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTAwZDllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2k7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB3c2ljb3JlLmphciwKLSB3c2l2YWxpZGF0ZS5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tcGF0aWJpbGl0eS5QbHVnaW5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6ICVfUFJPVklERVJfTkFNRQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogLiwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuYW5hbHl6ZXIsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplciwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uaW1wbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LmltcGwsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZywKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLmltcGwsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLmltcGwsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2UsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaSwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLAotIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2QsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbCwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbSwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmpheHAsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5zY2hlbWEsCi0gb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5kb2N1bWVudCwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnJlcG9ydCwKLSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnZhbGlkYXRlLndzZGwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS52aWV3cywKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LndzLnVpLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLndzZGw0aiwKLSBvcmcuYXBhY2hlLmF4aXMxMSwKLSBvcmcudWRkaTRqLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iMi4xLjAiCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQotUGx1Z2luLUNsYXNzOiBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLldTSVRlc3RUb29sc1BsdWdpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5OTZjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXNvdXJjZS53c2ljb3JlLmphciA9IHdzaWNvcmUvCi1iaW4uaW5jbHVkZXMgPSB3c2ljb3JlLmphcixcCi0gICAgICAgICAgICAgICB3c2l2YWxpZGF0ZS5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLWphcnMuY29tcGlsZS5vcmRlciA9IHdzaWNvcmUuamFyLFwKLSAgICAgICAgICAgICAgICAgICAgIHdzaXZhbGlkYXRlLmphcgotc291cmNlLndzaXZhbGlkYXRlLmphciA9IHdzaXZhbGlkYXRlLwotb3V0cHV0LndzaWNvcmUuamFyID0gYmluLwotb3V0cHV0LndzaXZhbGlkYXRlLmphciA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMmNhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LndzaSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LndzaS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzY1ZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotX1BMVUdJTl9OQU1FICAgPSBXU0kgQ29uZm9ybWFuY2UgVG9vbHMKLV9VSV9XU0RMX1dTSV9WQUxJREFUT1IgPSBXU0RMIFdTLUkgVmFsaWRhdG9yCi1fUFJPVklERVJfTkFNRSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGEzOTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+IAotCi08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ3c2RsV1NJVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iJV9VSV9XU0RMX1dTSV9WQUxJREFUT1IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5leHR2YWxpZGF0b3IiPgotICAgICAgPGV4dHZhbGlkYXRvcgotICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnZhbGlkYXRlLndzZGwuV1NETFZhbGlkYXRvciIKLSAgICAgICAgICAgIHJlc291cmNlYnVuZGxlPSJ3c2l2YWxpZGF0ZSI+Ci0gICAgICA8L2V4dHZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1Rvb2xFbnZpcm9ubWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1Rvb2xFbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGJlZTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9Ub29sRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuWE1MSW5mbzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIFRvb2wgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFRvb2xFbnZpcm9ubWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fRU5WSVJPTk1FTlQ7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0gbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0NPTU1PTiwgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogVG9vbCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcnVudGltZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEucnVudGltZS5uYW1lIik7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcnVudGltZVZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEucnVudGltZS52ZXJzaW9uIik7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLSAgcHJvdGVjdGVkIFN0cmluZyBvc1ZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIHhtbFBhcnNlck5hbWUgPSAiPyI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgeG1sUGFyc2VyVmVyc2lvbiA9ICI/IjsKLQotICAvKioKLSAgICogQWRkaXRpb25hbCB0b29sIGVudmlyb25tZW50IGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTEluZm8geG1sSW5mbyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRvb2wgcnVudGltZSBlbnZpcm9ubWVudC4KLSAgICovCi0gIHB1YmxpYyBUb29sRW52aXJvbm1lbnQoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotCi0gICAgICAvLyBGVVRVUkU6IG1hZGUgY29tcGF0aWJsZSB3aXRoIGxhdGVyIHZlcnNpb25zIG9mIFhlcmNlcyB3aGVyZSBnZXRWZXJzaW9uCi0gICAgICAvLyBpcyBubyBsb25nZXIgc3RhdGljYWxseSBhdmFpbGFibGUuCi0gICAgICAvLyB4bWxQYXJzZXJWZXJzaW9uID0gbmV3IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuVmVyc2lvbigpLmdldFZlcnNpb24oKTsKLSAgICAgIHhtbFBhcnNlclZlcnNpb24gPSBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlZlcnNpb24uZ2V0VmVyc2lvbigpOwotCi0gICAgICB4bWxQYXJzZXJOYW1lID0gIkFwYWNoZSBYZXJjZXMiOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBBREQ6IEhvdyBlbHNlIGNhbiB3ZSBnZXQgdGhlIG5hbWUgdmVyc2lvbiBudW1iZXIKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXJyb3IgZXJyKQotICAgIHsKLSAgICAgIC8vIEFERDogSG93IGVsc2UgY2FuIHdlIGdldCB0aGUgbmFtZSB2ZXJzaW9uIG51bWJlcgotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0b29sIHJ1bnRpbWUgZW52aXJvbm1lbnQuCi0gICAqIEBwYXJhbSB4bWxJbmZvIGFkZGl0aW9uYWwgdG9vbCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyBUb29sRW52aXJvbm1lbnQoWE1MSW5mbyB4bWxJbmZvKQotICB7Ci0gICAgdGhpcy54bWxJbmZvID0geG1sSW5mbzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBvc05hbWUuCi0gICAqIEByZXR1cm4gdGhlIG9zTmFtZS4KLSAgICogQHNlZSAjc2V0T1NOYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE9TTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gb3NOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG9zVmVyc2lvbi4KLSAgICogQHJldHVybiB0aGUgb3NWZXJzaW9uLgotICAgKiBAc2VlICNzZXRPU1ZlcnNpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T1NWZXJzaW9uKCkKLSAgewotICAgIHJldHVybiBvc1ZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcGFyc2VyTmFtZS4KLSAgICogQHJldHVybiB0aGUgcGFyc2VyTmFtZS4KLSAgICogQHNlZSAjc2V0WE1MUGFyc2VyTmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRYTUxQYXJzZXJOYW1lKCkKLSAgewotICAgIHJldHVybiB4bWxQYXJzZXJOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhcnNlclZlcnNpb24uCi0gICAqIEByZXR1cm4gdGhlIHBhcnNlclZlcnNpb24uCi0gICAqIEBzZWUgI3NldFhNTFBhcnNlclZlcnNpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0WE1MUGFyc2VyVmVyc2lvbigpCi0gIHsKLSAgICByZXR1cm4geG1sUGFyc2VyVmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBydW50aW1lTmFtZS4KLSAgICogQHJldHVybiB0aGUgcnVudGltZU5hbWUuCi0gICAqIEBzZWUgI3NldFJ1bnRpbWVOYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVOYW1lKCkKLSAgewotICAgIHJldHVybiBydW50aW1lTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBydW50aW1lVmVyc2lvbi4KLSAgICogQHJldHVybiB0aGUgcnVudGltZVZlcnNpb24uCi0gICAqIEBzZWUgI3NldFJ1bnRpbWVWZXJzaW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVWZXJzaW9uKCkKLSAgewotICAgIHJldHVybiBydW50aW1lVmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBvc05hbWUuCi0gICAqIEBwYXJhbSBvc05hbWUgdGhlIG9zTmFtZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldE9TTmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T1NOYW1lKFN0cmluZyBvc05hbWUpCi0gIHsKLSAgICB0aGlzLm9zTmFtZSA9IG9zTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBvc1ZlcnNpb24uCi0gICAqIEBwYXJhbSBvc1ZlcnNpb24gdGhlIG9zVmVyc2lvbiB0byBzZXQuCi0gICAqIEBzZWUgI2dldE9TVmVyc2lvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0T1NWZXJzaW9uKFN0cmluZyBvc1ZlcnNpb24pCi0gIHsKLSAgICB0aGlzLm9zVmVyc2lvbiA9IG9zVmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBwYXJzZXJOYW1lLgotICAgKiBAcGFyYW0geG1sUGFyc2VyTmFtZSB0aGUgcGFyc2VyTmFtZSB0byBzZXQuCi0gICAqIEBzZWUgI2dldFhNTFBhcnNlck5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFhNTFBhcnNlck5hbWUoU3RyaW5nIHhtbFBhcnNlck5hbWUpCi0gIHsKLSAgICB0aGlzLnhtbFBhcnNlck5hbWUgPSB4bWxQYXJzZXJOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHBhcnNlclZlcnNpb24uCi0gICAqIEBwYXJhbSB4bWxQYXJzZXJWZXJzaW9uIHRoZSBwYXJzZXJWZXJzaW9uIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0WE1MUGFyc2VyVmVyc2lvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0WE1MUGFyc2VyVmVyc2lvbihTdHJpbmcgeG1sUGFyc2VyVmVyc2lvbikKLSAgewotICAgIHRoaXMueG1sUGFyc2VyVmVyc2lvbiA9IHhtbFBhcnNlclZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcnVudGltZU5hbWUuCi0gICAqIEBwYXJhbSBydW50aW1lTmFtZSB0aGUgcnVudGltZU5hbWUgdG8gc2V0LgotICAgKiBAc2VlICNnZXRSdW50aW1lTmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UnVudGltZU5hbWUoU3RyaW5nIHJ1bnRpbWVOYW1lKQotICB7Ci0gICAgdGhpcy5ydW50aW1lTmFtZSA9IHJ1bnRpbWVOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJ1bnRpbWVWZXJzaW9uLgotICAgKiBAcGFyYW0gcnVudGltZVZlcnNpb24gdGhlIHJ1bnRpbWVWZXJzaW9uIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0UnVudGltZVZlcnNpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJ1bnRpbWVWZXJzaW9uKFN0cmluZyBydW50aW1lVmVyc2lvbikKLSAgewotICAgIHRoaXMucnVudGltZVZlcnNpb24gPSBydW50aW1lVmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBhZGRpdGlvbmFsIGVudmlyb25tZW50IGluZm9ybWF0aW9uLgotICAgKiBAcGFyYW0geG1sSW5mbyBhZGRpdGlvbmFsIHRvb2wgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsVG9vbEVudmlyb25tZW50KFhNTEluZm8geG1sSW5mbykKLSAgewotICAgIHRoaXMueG1sSW5mbyA9IHhtbEluZm87Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSAgdGhlIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEByZXR1cm4gdGhlIFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuIAotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoIW5zTmFtZS5lcXVhbHMoIiIpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIFN0YXJ0IGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcHcucHJpbnQoIiAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fUlVOVElNRSArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSArICI9XCIiICsgcnVudGltZU5hbWUgKyAiXCIgIik7Ci0gICAgcHcucHJpbnRsbihXU0lDb25zdGFudHMuQVRUUl9WRVJTSU9OICsgIj1cIiIgKyBydW50aW1lVmVyc2lvbiArICJcIi8+Iik7Ci0gICAgcHcucHJpbnQoIiAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fT1BFUkFUSU5HX1NZU1RFTSArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSArICI9XCIiICsgb3NOYW1lICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTiArICI9XCIiICsgb3NWZXJzaW9uICsgIlwiLz4iKTsKLSAgICBwdy5wcmludCgiICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9YTUxfUEFSU0VSICsgIiAiKTsKLSAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9OQU1FICsgIj1cIiIgKyB4bWxQYXJzZXJOYW1lICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTiArICI9XCIiICsgeG1sUGFyc2VyVmVyc2lvbiArICJcIi8+Iik7Ci0KLSAgICAvLyBJZiBhZGR0aW9uYWwgaW5mbywgdGhlbiBnZXQgaXQKLSAgICBpZiAoeG1sSW5mbyAhPSBudWxsKQotICAgICAgcHcucHJpbnQoeG1sSW5mby50b1hNTFN0cmluZyhuc05hbWUpKTsKLQotICAgIC8vIEVuZCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiICAgIDwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1Rvb2xJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvVG9vbEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1N2E0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvVG9vbEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlhNTEluZm87Ci0KLS8qKgotICogSW5mb3JtYXRpb24gdGhhdCBkZXNjcmliZXMgYSBjb25mb3JtYW5jZSB0b29sLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFRvb2xJbmZvCi17Ci0gIC8qKgotICAgKiBUb29sIGluZm9ybWF0aW9uIHByb3BlcnR5IG5hbWVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9UT09MX1ZFUlNJT04gPSAid3NpLnRvb2wudmVyc2lvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVE9PTF9SRUxFQVNFX0RBVEUgPSAid3NpLnRvb2wucmVsZWFzZS5kYXRlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9UT09MX0lNUExFTUVOVEVSID0gIndzaS50b29sLmltcGxlbWVudGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9UT09MX0xPQ0FUSU9OID0gIndzaS50b29sLmxvY2F0aW9uIjsKLQotICAvKioKLSAgICogRGVmYXVsdCB0b29sIGluZm9ybWF0aW9uIHByb3BlcnR5IHZhbHVlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfVE9PTF9WRVJTSU9OID0gIjEuMC4xIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9UT09MX1JFTEVBU0VfREFURSA9ICIyMDA0LTAxLTIyIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9UT09MX0lNUExFTUVOVEVSID0gIkVjbGlwc2Uub3JnIE9yZ2FuaXphdGlvbiI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfVE9PTF9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzdnQiOwotCi0gIC8qKgotICAgKiBUb29sIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVsZWFzZURhdGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgaW1wbGVtZW50ZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247Ci0KLSAgLyoqCi0gICAqIFRvb2wgZW52aXJvbm1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgVG9vbEVudmlyb25tZW50IHRvb2xFbnZpcm9ubWVudCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRvb2wgaW5mbyBwcm9wZXJ0aWVzIGZpbGVuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9GSUxFTkFNRSA9ICJvcmcud3NpLnRlc3QudG9vbGluZm8iOwotCi0gIC8qKgotICAgKiBDcmVhdGUgdG9vbCBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyBUb29sSW5mbygpCi0gIHsKLSAgICB0aGlzLnRvb2xFbnZpcm9ubWVudCA9IG5ldyBUb29sRW52aXJvbm1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgdG9vbCBpbmZvcm1hdGlvbiBmcm9tIGluZm9ybWF0aW9uIGluIHRoZSB0b29saW5mby5wcm9wZXJ0aWVzIGZpbGUuCi0gICAqIEBwYXJhbSBuYW1lICB0aGUgdG9vbCBuYW1lLgotICAgKi8KLSAgcHVibGljIFRvb2xJbmZvKFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLQotICAgIGdldFByb3BlcnRpZXMoKTsKLQotICAgIHRoaXMudG9vbEVudmlyb25tZW50ID0gbmV3IFRvb2xFbnZpcm9ubWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSB0b29sIGluZm9ybWF0aW9uLgotICAgKiBAcGFyYW0gbmFtZSAgICAgICAgIHRoZSB0b29sIG5hbWUuCi0gICAqIEBwYXJhbSB2ZXJzaW9uICAgICAgdGhlIHZlcnNpb24gb2YgdGhlIHRvb2wuCi0gICAqIEBwYXJhbSByZWxlYXNlRGF0ZSAgdGhlIHJlbGVhc2UgZGF0ZSBvZiB0aGUgdG9vbC4KLSAgICogQHBhcmFtIGltcGxlbWVudGVyICB0aGUgaW1wbGVtZW50ZXIgb2YgdGhlIHRvb2wuCi0gICAqIEBwYXJhbSBsb2NhdGlvbiAgICAgdGhlIGltcGxlbWVudGVyIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIFRvb2xJbmZvKAotICAgIFN0cmluZyBuYW1lLAotICAgIFN0cmluZyB2ZXJzaW9uLAotICAgIFN0cmluZyByZWxlYXNlRGF0ZSwKLSAgICBTdHJpbmcgaW1wbGVtZW50ZXIsCi0gICAgU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIHRoaXMucmVsZWFzZURhdGUgPSByZWxlYXNlRGF0ZTsKLSAgICB0aGlzLmltcGxlbWVudGVyID0gaW1wbGVtZW50ZXI7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0gICAgdGhpcy50b29sRW52aXJvbm1lbnQgPSBuZXcgVG9vbEVudmlyb25tZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHRvb2wgaW5mb3JtYXRpb24gd2l0aCB0b29sIHVuaXF1ZSBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIG5hbWUgICAgICAgICB0aGUgdG9vbCBuYW1lLgotICAgKiBAcGFyYW0gdmVyc2lvbiAgICAgIHRoZSB2ZXJzaW9uIG9mIHRoZSB0b29sLgotICAgKiBAcGFyYW0gcmVsZWFzZURhdGUgIHRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIHRvb2wuCi0gICAqIEBwYXJhbSBpbXBsZW1lbnRlciAgdGhlIGltcGxlbWVudGVyIG9mIHRoZSB0b29sLgotICAgKiBAcGFyYW0gbG9jYXRpb24gICAgIHRoZSBpbXBsZW1lbnRlciBsb2NhdGlvbi4KLSAgICogQHBhcmFtIHhtbEluZm8gICAgICBhZGRpdGlvbmFsIHRvb2wgZW52aXJvbm1lbnQgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgVG9vbEluZm8oCi0gICAgU3RyaW5nIG5hbWUsCi0gICAgU3RyaW5nIHZlcnNpb24sCi0gICAgU3RyaW5nIHJlbGVhc2VEYXRlLAotICAgIFN0cmluZyBpbXBsZW1lbnRlciwKLSAgICBTdHJpbmcgbG9jYXRpb24sCi0gICAgWE1MSW5mbyB4bWxJbmZvKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIHRoaXMucmVsZWFzZURhdGUgPSByZWxlYXNlRGF0ZTsKLSAgICB0aGlzLmltcGxlbWVudGVyID0gaW1wbGVtZW50ZXI7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0gICAgdGhpcy50b29sRW52aXJvbm1lbnQgPSBuZXcgVG9vbEVudmlyb25tZW50KHhtbEluZm8pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBuYW1lLgotICAgKiBAcmV0dXJuIG5hbWUuCi0gICAqIEBzZWUgI3NldE5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdmVyc2lvbi4KLSAgICogQHJldHVybiB2ZXJzaW9uLgotICAgKiBAc2VlICNzZXRWZXJzaW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIHZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHJlbGVhc2UgZGF0ZS4KLSAgICogQHJldHVybiByZWxlYXNlIGRhdGUuCi0gICAqIEBzZWUgI3NldFJlbGVhc2VEYXRlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlbGVhc2VEYXRlKCkKLSAgewotICAgIHJldHVybiByZWxlYXNlRGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgaW1wbGVtZW50ZXIuCi0gICAqIEByZXR1cm4gaW1wbGVtZW50ZXIuCi0gICAqIEBzZWUgI3NldEltcGxlbWVudGVyCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGVyKCkKLSAgewotICAgIHJldHVybiBpbXBsZW1lbnRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgaW1wbGVtZW50ZXIgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gaW1wbGVtZW50ZXIgbG9jYXRpb24uCi0gICAqIEBzZWUgI3NldExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0b29sRW52aXJvbm1lbnQuCi0gICAqIEByZXR1cm4gVG9vbEVudmlyb25tZW50Ci0gICAqIEBzZWUgI3NldFRvb2xFbnZpcm9ubWVudAotICAgKi8KLSAgcHVibGljIFRvb2xFbnZpcm9ubWVudCBnZXRUb29sRW52aXJvbm1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHRvb2xFbnZpcm9ubWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBpbXBsZW1lbnRlci4KLSAgICogQHBhcmFtIGltcGxlbWVudGVyIHRoZSBpbXBsZW1lbnRlciB0byBzZXQuCi0gICAqIEBzZWUgI2dldEltcGxlbWVudGVyCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRlcihTdHJpbmcgaW1wbGVtZW50ZXIpCi0gIHsKLSAgICB0aGlzLmltcGxlbWVudGVyID0gaW1wbGVtZW50ZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gdG8gc2V0LgotICAgKiBAc2VlICNnZXRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUuCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0TmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVsZWFzZURhdGUuCi0gICAqIEBwYXJhbSByZWxlYXNlRGF0ZSB0aGUgcmVsZWFzZURhdGUgdG8gc2V0LgotICAgKiBAc2VlICNnZXRSZWxlYXNlRGF0ZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVsZWFzZURhdGUoU3RyaW5nIHJlbGVhc2VEYXRlKQotICB7Ci0gICAgdGhpcy5yZWxlYXNlRGF0ZSA9IHJlbGVhc2VEYXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHRvb2xFbnZpcm9ubWVudC4KLSAgICogQHBhcmFtIHRvb2xFbnZpcm9ubWVudCB0aGUgdG9vbEVudmlyb25tZW50IHRvIHNldC4KLSAgICogQHNlZSAjZ2V0VG9vbEVudmlyb25tZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUb29sRW52aXJvbm1lbnQoVG9vbEVudmlyb25tZW50IHRvb2xFbnZpcm9ubWVudCkKLSAgewotICAgIHRoaXMudG9vbEVudmlyb25tZW50ID0gdG9vbEVudmlyb25tZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHRvb2xFbnZpcm9ubWVudC4KLSAgICogQHBhcmFtIHhtbEluZm8gYWRkaXRpb25hbCB0b29sIGVudmlyb25tZW50IGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbFRvb2xFbnZpcm9ubWVudChYTUxJbmZvIHhtbEluZm8pCi0gIHsKLSAgICB0aGlzLnRvb2xFbnZpcm9ubWVudC5zZXRBZGRpdGlvbmFsVG9vbEVudmlyb25tZW50KHhtbEluZm8pOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZlcnNpb24uCi0gICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIHRvIHNldC4KLSAgICogQHNlZSAjZ2V0VmVyc2lvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKLSAgewotICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHN0YXJ0IFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lICB0aGUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHJldHVybiB0aGUgc3RhcnQgWE1MIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0WE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICghbnNOYW1lLmVxdWFscygiIikpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgcHcucHJpbnQoIiAgPCIgKyBuc05hbWUgKyBnZXROYW1lKCkudG9Mb3dlckNhc2UoKSArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTiArICI9XCIiICsgZ2V0VmVyc2lvbigpICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9SRUxFQVNFX0RBVEUgKyAiPVwiIiArIGdldFJlbGVhc2VEYXRlKCkgKyAiXCI+Iik7Ci0KLSAgICBwdy5wcmludCgiICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fSU1QTEVNRU5URVIgKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX05BTUUgKyAiPVwiIiArIGdldEltcGxlbWVudGVyKCkgKyAiXCIgIik7Ci0gICAgcHcucHJpbnRsbihXU0lDb25zdGFudHMuQVRUUl9MT0NBVElPTiArICI9XCIiICsgZ2V0TG9jYXRpb24oKSArICJcIi8+Iik7Ci0KLSAgICAvLyBFbnZpcm9ubWVudAotICAgIHB3LnByaW50KHRvb2xFbnZpcm9ubWVudC50b1hNTFN0cmluZyhuYW1lc3BhY2VOYW1lKSk7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGVuZCBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSAgdGhlIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEByZXR1cm4gdGhlIGVuZCBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICghbnNOYW1lLmVxdWFscygiIikpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgcHcucHJpbnRsbigiICA8LyIgKyBuc05hbWUgKyBnZXROYW1lKCkudG9Mb3dlckNhc2UoKSArICI+Iik7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdmFsdWVzIGZyb20gdGhlIHRvb2xzLnByb3BlcnRpZXMgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGdldFByb3BlcnRpZXMoKQotICB7Ci0gICAgLy9Qcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFRyeSB0byBsb2FkIHByb3BlcnRpZXMgZnJvbSB3c2kucHJvcGVydGllcwotICAgICAgLy9JbnB1dFN0cmVhbSBpcyA9IFV0aWxzLmdldElucHV0U3RyZWFtKFBST1BfRklMRU5BTUUpOwotCi0gICAgICAvLyBMb2FkIHByb3BlcnRpZXMgZnJvbSBmaWxlCi0gICAgICAvL3Byb3BzLmxvYWQoaXMpOwotCi0gICAgICAvLyBHZXQgcmVzb3VyY2UKLSAgICAgIHJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFBST1BfRklMRU5BTUUpOwotCi0gICAgICAvLyBHZXQgcHJvcGVydHkgdmFsdWVzCi0gICAgICB0aGlzLnZlcnNpb24gPQotICAgICAgICBnZXRQcm9wZXJ0eShyZXNvdXJjZUJ1bmRsZSwgUFJPUF9UT09MX1ZFUlNJT04sIERFRl9UT09MX1ZFUlNJT04pOwotICAgICAgdGhpcy5yZWxlYXNlRGF0ZSA9Ci0gICAgICAgIGdldFByb3BlcnR5KAotICAgICAgICAgIHJlc291cmNlQnVuZGxlLAotICAgICAgICAgIFBST1BfVE9PTF9SRUxFQVNFX0RBVEUsCi0gICAgICAgICAgREVGX1RPT0xfUkVMRUFTRV9EQVRFKTsKLSAgICAgIHRoaXMuaW1wbGVtZW50ZXIgPQotICAgICAgICBnZXRQcm9wZXJ0eSgKLSAgICAgICAgICByZXNvdXJjZUJ1bmRsZSwKLSAgICAgICAgICBQUk9QX1RPT0xfSU1QTEVNRU5URVIsCi0gICAgICAgICAgREVGX1RPT0xfSU1QTEVNRU5URVIpOwotICAgICAgdGhpcy5sb2NhdGlvbiA9Ci0gICAgICAgIGdldFByb3BlcnR5KHJlc291cmNlQnVuZGxlLCBQUk9QX1RPT0xfTE9DQVRJT04sIERFRl9UT09MX0xPQ0FUSU9OKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkKLSAgICB7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gbG9hZGluZyBwcm9wZXJ0aWVzOiAgIiArIGUudG9TdHJpbmcoKSk7Ci0KLSAgICAgIC8vIFNldCBkZWZhdWx0IHByb3BlcnR5IHZhbHVlcwotICAgICAgdGhpcy52ZXJzaW9uID0gREVGX1RPT0xfVkVSU0lPTjsKLSAgICAgIHRoaXMucmVsZWFzZURhdGUgPSBERUZfVE9PTF9SRUxFQVNFX0RBVEU7Ci0gICAgICB0aGlzLmltcGxlbWVudGVyID0gREVGX1RPT0xfSU1QTEVNRU5URVI7Ci0gICAgICB0aGlzLmxvY2F0aW9uID0gREVGX1RPT0xfTE9DQVRJT047Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBwcm9wZXJ0eS4KLSAgICogQHBhcmFtIHJlc291cmNlQnVuZGxlICBhIHJlc291cmNlIGJ1bmRsZS4KLSAgICogQHBhcmFtIGtleSAgICAgICAgICAgICBhIGtleS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgICBhIGRlZmF1bHQgdmFsdWUuCi0gICAqIEByZXR1cm4gcHJvcGVydHkuIElmIG5vdCBmb3VuZCByZXR1cm4gZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHkoCi0gICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsCi0gICAgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgZGVmYXVsdFZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHZhbHVlOwotCi0gICAgaWYgKCh2YWx1ZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpKSA9PSBudWxsKQotICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogRm9ybWF0IHRvb2wgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBsb2NhdGlvbiAgdG9vbCBsb2NhdGlvbi4KLSAgICogQHJldHVybiBmb3JtYXR0ZWQgdG9vbCBsb2NhdGlvbi4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGZvcm1hdFRvb2xMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pCi0gIHsKLSAgICAvLyBTdGFydCB3aXRoIHNwZWNpZmllZCBsb2NhdGlvbgotICAgIFN0cmluZyByZXR1cm5Mb2NhdGlvbiA9IGxvY2F0aW9uOwotCi0gICAgLy8gTWFrZSBzdXJlIHN0cmluZyBlbmRzIHRoZSAiLyIKLSAgICBpZiAoIXJldHVybkxvY2F0aW9uLmVuZHNXaXRoKCIvIikpCi0gICAgICByZXR1cm5Mb2NhdGlvbiArPSAiLyI7Ci0KLSAgICAvLyBBZGQgdG9vbCBuYW1lIGFuZCAuaHRtbAotICAgIHJldHVybiByZXR1cm5Mb2NhdGlvbiArIGdldE5hbWUoKSArICIuaHRtbCI7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHRoZSB0b29scy5wcm9wZXJ0aWVzIGZpbGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotICAgKiBUaGUgaW5wdXQgYXJndWVtZW50cyBhcmU6Ci0gICAqIDxvbD4KLSAgICogPGxpPkZpbGVuYW1lIGZvciB0aGUgcHJvcGVydGllcyBmaWxlIHRvIGNyZWF0ZQotICAgKiA8bGk+VmVyc2lvbiBudW1iZXIKLSAgICogPGxpPgotICAgKiA8L29sPgotICAgKiBAcGFyYW0gYXJncyAgdGhlIGFyZ3VtZW50cyBmb3IgbWFpbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBpbnQgc3RhdHVzQ29kZSA9IDA7Ci0gICAgU3RyaW5nIGZpbGVuYW1lID0gUFJPUF9GSUxFTkFNRTsKLSAgICBTdHJpbmcgdmVyc2lvbiA9IERFRl9UT09MX1ZFUlNJT047Ci0gICAgU3RyaW5nIGltcGxlbWVudGVyID0gREVGX1RPT0xfSU1QTEVNRU5URVI7Ci0gICAgU3RyaW5nIGxvY2F0aW9uID0gREVGX1RPT0xfTE9DQVRJT047Ci0KLSAgICAvLyBTZXQgdGhlIGZpbGUgbmFtZQotICAgIGlmIChhcmdzLmxlbmd0aCA+PSAxKQotICAgICAgZmlsZW5hbWUgPSBhcmdzWzBdOwotCi0gICAgaWYgKGFyZ3MubGVuZ3RoID49IDIpCi0gICAgICB2ZXJzaW9uID0gYXJnc1sxXTsKLQotICAgIGlmIChhcmdzLmxlbmd0aCA+PSAzKQotICAgICAgaW1wbGVtZW50ZXIgPSBhcmdzWzJdOwotCi0gICAgaWYgKGFyZ3MubGVuZ3RoID49IDQpCi0gICAgICBsb2NhdGlvbiA9IGFyZ3NbM107Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgZmlsZSB3cml0ZXIKLSAgICAgIEZpbGVXcml0ZXIgZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKLQotICAgICAgLy8gQ3JlYXRlIHByaW50IHdyaXRlcgotICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoZmlsZVdyaXRlcik7Ci0KLSAgICAgIC8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBwcm9wZXJ0aWVzIGZpbGUKLSAgICAgIHByaW50V3JpdGVyLnByaW50bG4oQ09NTUVOVFMpOwotICAgICAgcHJpbnRXcml0ZXIucHJpbnRsbihQUk9QX1RPT0xfVkVSU0lPTiArICI9IiArIHZlcnNpb24pOwotICAgICAgcHJpbnRXcml0ZXIucHJpbnRsbihQUk9QX1RPT0xfUkVMRUFTRV9EQVRFICsgIj0iICsgVXRpbHMuZ2V0RGF0ZSgpKTsKLSAgICAgIHByaW50V3JpdGVyLnByaW50bG4oUFJPUF9UT09MX0lNUExFTUVOVEVSICsgIj0iICsgaW1wbGVtZW50ZXIpOwotICAgICAgcHJpbnRXcml0ZXIucHJpbnRsbihQUk9QX1RPT0xfTE9DQVRJT04gKyAiPSIgKyBsb2NhdGlvbik7Ci0KLSAgICAgIC8vIENsb3NlIGZpbGUgd3JpdGVyCi0gICAgICBmaWxlV3JpdGVyLmNsb3NlKCk7Ci0KLSAgICAgIC8vIERvbmUKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBbIiArIGZpbGVuYW1lICsgIl0gY3JlYXRlZC4iKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgc3RhdHVzQ29kZSA9IDE7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVYQ0VQVElPTjogIiArIGlvZS50b1N0cmluZygpKTsKLSAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgICAvLyBFeGl0Ci0gICAgU3lzdGVtLmV4aXQoc3RhdHVzQ29kZSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVFMgPSAiIjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9XU0lDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9XU0lDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjNGE3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlOwotCi0vKioKLSAqIFdTLUkgY29uc3RhbnRzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIEppbSBDbHVuZQotICogQGF1dGhvciBHcmFoYW0gVHVycmVsbCAoZ3R1cnJlbGxAdWsuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0lDb25zdGFudHMgewotCS8qKgotCSAqIENvcHlyaWdodCBub3RpY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUID0gIkNvcHlyaWdodCAoQykgMjAwMi0yMDAzIGJ5IFRoZSBXZWIgU2VydmljZXMtSW50ZXJvcGVyYWJpbGl0eSBPcmdhbml6YXRpb24gYW5kIENlcnRhaW4gIgotCQkJKyAib2YgaXRzIE1lbWJlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5Vc2Ugb2YgdGhpcyBNYXRlcmlhbCBpcyBnb3Zlcm5lZCBieSBXUy1JIGxpY2Vuc2VzIGluY2x1ZGVkIHdpdGhpbiB0aGUgZG9jdW1lbnRhdGlvbi4iOwotCi0JLyoqCi0JICogWE1MIGRlY2xhcmF0aW9uIHN0YXRlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVDTCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iOwotCi0JLyoqCi0JICogWE1MIG5hbWVzcGFjZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1hNTE5TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfWE1MID0gICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiOwotCS8qKgotCSAqIFhNTCBzY2hlbWEgbmFtZXNwYWNlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfWFNEID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQotCS8qKgotCSAqIFhNTCBzY2hlbWEgbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX1NDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QiOwotCi0JLyoqCi0JICogWE1MIHNjaGVtYSBuYW1lc3BhY2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19OQU1FX1hTRCA9ICJ4c2QiOwotCi0JLyoqCi0JICogWE1MIHNjaGVtYSBpbnN0YW5jZSBuYW1lc3BhY2UgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9YU0kgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOwotCi0JLyoqCi0JICogWE1MIHNjaGVtYSBuYW1lc3BhY2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19OQU1FX1hTSSA9ICJ4c2kiOwotCi0KLQkvKioKLQkgKiBXUy1JIG1lc3NhZ2UgbG9nIG5hbWVzcGFjZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTSV9MT0cgPSAiaHR0cDovL3d3dy53cy1pLm9yZy90ZXN0aW5nLzIwMDQvMDcvbG9nLyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19OQU1FX1dTSV9MT0cgPSAid3NpLWxvZyI7Ci0KLQkvKioKLQkgKiBXUy1JIGNvbmZvcm1hbmNlIHJlcG9ydCBuYW1lc3BhY2UgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfUkVQT1JUID0gImh0dHA6Ly93d3cud3MtaS5vcmcvdGVzdGluZy8yMDA0LzA3L3JlcG9ydC8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX05BTUVfV1NJX1JFUE9SVCA9ICJ3c2ktcmVwb3J0IjsKLQotCS8qKgotCSAqIFdTLUkgcHJvZmlsZSB0ZXN0IGFzc2VydGlvbnMgbmFtZXNwYWNlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfV1NJX0FTU0VSVElPTlNfMjAwMyA9ICJodHRwOi8vd3d3LndzLWkub3JnL3Rlc3RpbmcvMjAwMy8wMy9hc3NlcnRpb25zLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTSV9BU1NFUlRJT05TID0gImh0dHA6Ly93d3cud3MtaS5vcmcvdGVzdGluZy8yMDA0LzA3L2Fzc2VydGlvbnMvIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX05BTUVfV1NJX0FTU0VSVElPTlMgPSAid3NpLWFzc2VydGlvbnMiOwotCi0JLyoqCi0JICogV1MtSSBtb25pdG9yIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lc2FwY2UgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfTU9OSVRPUl9DT05GSUdfMjAwMyA9ICJodHRwOi8vd3d3LndzLWkub3JnL3Rlc3RpbmcvMjAwMy8wMy9tb25pdG9yQ29uZmlnLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRyA9ICJodHRwOi8vd3d3LndzLWkub3JnL3Rlc3RpbmcvMjAwNC8wNy9tb25pdG9yQ29uZmlnLyI7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19OQU1FX1dTSV9NT05JVE9SX0NPTkZJRyA9ICJ3c2ktbW9uQ29uZmlnIjsKLQotCS8qKgotCSAqIFdTLUkgYW5hbHl6ZXIgY29uZmlndXJhdGlvbiBmaWxlIG5hbWVzYXBjZSBVUkkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTSV9BTkFMWVpFUl9DT05GSUdfMjAwMyA9ICJodHRwOi8vd3d3LndzLWkub3JnL3Rlc3RpbmcvMjAwMy8wMy9hbmFseXplckNvbmZpZy8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfQU5BTFlaRVJfQ09ORklHID0gImh0dHA6Ly93d3cud3MtaS5vcmcvdGVzdGluZy8yMDA0LzA3L2FuYWx5emVyQ29uZmlnLyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfTkFNRV9XU0lfQU5BTFlaRVJfQ09ORklHID0gIndzaS1hbmFseXplckNvbmZpZyI7Ci0KLQkvKioKLQkgKiBXUy1JIGNvbW1vbiBuYW1lc2FwY2UgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1VSSV9XU0lfQ09NTU9OXzIwMDMgPSAiaHR0cDovL3d3dy53cy1pLm9yZy90ZXN0aW5nLzIwMDMvMDMvY29tbW9uLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJX1dTSV9DT01NT04gPSAiaHR0cDovL3d3dy53cy1pLm9yZy90ZXN0aW5nLzIwMDQvMDcvY29tbW9uLyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfTkFNRV9XU0lfQ09NTU9OID0gIndzaS1jb21tb24iOwotCi0JLyoqCi0JICogU09BUCBWMS4xIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19VUklfU09BUCA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7Ci0KLQkvKioKLQkgKiBTT0FQLzEuMSBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19VUklfU09BUF9FTkNPRElORyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU19VUklfU09BUF9ORVhUX0FDVE9SID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCIgOwotCS8qKgotCSAqIEhUVFAgdHJhbnNwb3J0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9TT0FQX0hUVFAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIjsKLQotCS8qKgotCSAqIFdTREwgVjEuMSBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX1dTREwgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOwotCi0JLyoqCi0JICogV1NETCBTT0FQIGJpbmRpbmcgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9XU0RMX1NPQVAgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19OQU1FX1dTRExfU09BUCA9ICJzb2FwIjsKLQotCS8qKgotCSAqIFdTREwgTUlNRSBiaW5kaW5nIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19OQU1FX1dTRExfTUlNRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIjsKLQotCS8qKgotCSAqIFdTREwgSFRUUCBHRVQgJiBQT1NUIGJpbmRpbmcgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX05BTUVfV1NETF9IVFRQID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iOwotCi0JLyoqCi0JICogV1NETCBESU1FIGJpbmRpbmcgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX05BTUVfV1NETF9ESU1FID0gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDIvMDQvZGltZS93c2RsLyI7Ci0KLQkvKioKLQkgKiBDb25mb3JtYW5jZSBDbGFpbSBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX0NMQUlNID0gImh0dHA6Ly93cy1pLm9yZy9zY2hlbWFzL2NvbmZvcm1hbmNlQ2xhaW0vIjsKLQotCS8qKgotCSAqIFVEREkgVjIgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9VRERJX1YyID0gInVybjp1ZGRpLW9yZzphcGlfdjIiOwotCi0JLyoqCi0JICogVGhlIFhNTCBTY2hlbWEgZm9yIHRoZSB0eXBlIHVzZWQgdG8gcmVmZXIgdG8gYXR0YWNobWVudHMgZnJvbSB0aGUgU09BUAotCSAqIGVudmVsb3BlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9TV0FfUkVGID0gImh0dHA6Ly93cy1pLm9yZy9wcm9maWxlcy9iYXNpYy8xLjEveHNkIjsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNDSEVNQV9UWVBFX1NXQV9SRUYgPSAic3dhUmVmIjsKLQotCS8qKgotCSAqIEVsZW1lbnQgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BRERfU1RZTEVfU0hFRVQgPSAiYWRkU3R5bGVTaGVldCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FERElUSU9OQUxfRU5UUllfVFlQRV9MSVNUID0gImFkZGl0aW9uYWxFbnRyeVR5cGVMaXN0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQU5BTFlaRVJfRkFJTFVSRSA9ICJhbmFseXplckZhaWx1cmUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BUlRJRkFDVCA9ICJhcnRpZmFjdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FSVElGQUNUX1JFRkVSRU5DRSA9ICJhcnRpZmFjdFJlZmVyZW5jZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FTU0VSVElPTl9DT1ZFUkFHRSA9ICJhc3NlcnRpb25Db3ZlcmFnZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FTU0VSVElPTl9ERVNDUklQVElPTiA9ICJhc3NlcnRpb25EZXNjcmlwdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0FTU0VSVElPTl9SRVNVTFQgPSAiYXNzZXJ0aW9uUmVzdWx0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQVNTRVJUSU9OX1JFU1VMVF9TVU1NQVJZID0gImFzc2VydGlvblJlc3VsdFN1bW1hcnkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BU1NFUlRJT05fUkVTVUxUUyA9ICJhc3NlcnRpb25SZXN1bHRzIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQ0xFQU5VUF9USU1FT1VUX1NFQ09ORFMgPSAiY2xlYW51cFRpbWVvdXRTZWNvbmRzIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fQ09ORklHID0gImNvbmZpZ3VyYXRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DT01NRU5UID0gImNvbW1lbnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9DT05URVhUID0gImNvbnRleHQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9ERVRBSUwgPSAiZGV0YWlsIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fREVUQUlMX0RFU0NSSVBUSU9OID0gImRldGFpbERlc2NyaXB0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9FTlZJUk9OTUVOVCA9ICJlbnZpcm9ubWVudCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0VOVFJZID0gImVudHJ5IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fRkFJTFVSRV9ERVRBSUwgPSAiZmFpbHVyZURldGFpbCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBSUxVUkVfREVUQUlMX0RFU0NSSVBUSU9OID0gImZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0ZBSUxVUkVfTUVTU0FHRSA9ICJmYWlsdXJlTWVzc2FnZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0hUVFBfSEVBREVSUyA9ICJodHRwSGVhZGVycyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0lNUExFTUVOVEVSID0gImltcGxlbWVudGVyIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fSU5RVUlSWV9VUkwgPSAiaW5xdWlyeVVSTCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0xJU1RFTl9QT1JUID0gImxpc3RlblBvcnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9MT0cgPSAibG9nIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTE9HX0RVUkFUSU9OID0gImxvZ0R1cmF0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTE9HX0ZJTEUgPSAibG9nRmlsZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01BTl9JTl9USEVfTUlERExFID0gIm1hbkluVGhlTWlkZGxlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTUFYX0NPTk5FQ1RJT05TID0gIm1heENvbm5lY3Rpb25zIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTUVTU0FHRV9DT05URU5UID0gIm1lc3NhZ2VDb250ZW50IjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTID0gIm1lc3NhZ2VDb250ZW50V2l0aEF0dGFjaG1lbnRzIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01FU1NBR0VfRU5UUlkgPSAibWVzc2FnZUVudHJ5IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTUVTU0FHRV9JTlBVVCA9ICJtZXNzYWdlSW5wdXQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9NT05JVE9SID0gIm1vbml0b3IiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9PUEVSQVRJTkdfU1lTVEVNID0gIm9wZXJhdGluZ1N5c3RlbSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BSRVJFUV9GQUlMRURfTElTVCA9ICJwcmVyZXFGYWlsZWRMaXN0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fUFJFUkVRX0xJU1QgPSAicHJlcmVxTGlzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BST0ZJTEUgPSAicHJvZmlsZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BST0ZJTEVfQVNTRVJUSU9OUyA9ICJwcm9maWxlQXNzZXJ0aW9ucyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1JFQURfVElNRU9VVF9TRUNPTkRTID0gInJlYWRUaW1lb3V0U2Vjb25kcyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1JFQ0VJVkVSX0hPU1RfQU5EX1BPUlQgPSAicmVjZWl2ZXJIb3N0QW5kUG9ydCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1JFRElSRUNUID0gInJlZGlyZWN0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fUkVQT1JUID0gInJlcG9ydCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1JFUE9SVF9GSUxFID0gInJlcG9ydEZpbGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9SVU5USU1FID0gInJ1bnRpbWUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9TQ0hFTUVfQU5EX0hPU1RQT1JUID0gInNjaGVtZUFuZEhvc3RQb3J0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fU0VOREVSX0hPU1RfQU5EX1BPUlQgPSAic2VuZGVySG9zdEFuZFBvcnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9TRVJWSUNFX0xPQ0FUSU9OID0gInNlcnZpY2VMb2NhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1NVTU1BUlkgPSAic3VtbWFyeSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1RFU1RfQVNTRVJUSU9OID0gInRlc3RBc3NlcnRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9URVNUX0FTU0VSVElPTlNfRklMRSA9ICJ0ZXN0QXNzZXJ0aW9uc0ZpbGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9URVNUX0FTU0VSVElPTl9JRCA9ICJ0ZXN0QXNzZXJ0aW9uSUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9URVNUX0NPVkVSQUdFID0gInRlc3RDb3ZlcmFnZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1VERElfRU5UUlkgPSAidWRkaUVudHJ5IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVURESV9LRVkgPSAidWRkaUtleSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1VERElfUkVGRVJFTkNFID0gInVkZGlSZWZlcmVuY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9WRVJCT1NFID0gInZlcmJvc2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9XU0RMX0VMRU1FTlQgPSAid3NkbEVsZW1lbnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9XU0RMX0lOUFVUID0gIndzZGxJbnB1dCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1dTRExfUkVGRVJFTkNFID0gIndzZGxSZWZlcmVuY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9XU0RMX1VSSSA9ICJ3c2RsVVJJIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fWE1MX1BBUlNFUiA9ICJ4bWxQYXJzZXIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTUlNRV9QQVJUID0gIm1pbWVQYXJ0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTUlNRV9IRUFERVJTID0gIm1pbWVIZWFkZXJzIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX01JTUVfQ09OVEVOVCA9ICJtaW1lQ29udGVudCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX0JPVU5EQVJZX1NUUklORyA9ICJib3VuZGFyeVN0cmluZyI7Ci0KLQkvKioKLQkgKiBBdHRyaWJ1dGUgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTFRFUk5BVEUgPSAiYWx0ZXJuYXRlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVJSQVlfVFlQRSA9ICJhcnJheVR5cGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BU1NFUlRJT05fREVTQ1JJUFRJT04gPSAiYXNzZXJ0aW9uRGVzY3JpcHRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CT00gPSAiQk9NIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0hBUlNFVCA9ICJjaGFyc2V0IjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09ERSA9ICJjb2RlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09MVU1OX05VTUJFUiA9ICJjb2x1bW5OdW1iZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT05WRVJTQVRJT05fSUQgPSAiY29udmVyc2F0aW9uSUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DT1JSRUxBVElPTl9UWVBFID0gImNvcnJlbGF0aW9uVHlwZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RBVEUgPSAiZGF0ZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VOQUJMRUQgPSAiZW5hYmxlZCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0VOVFJZX1RZUEUgPSAiZW50cnlUeXBlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRkFJTFVSRV9NRVNTQUdFID0gImZhaWx1cmVNZXNzYWdlIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRkFJTFVSRV9ERVRBSUwgPSAiZmFpbHVyZURldGFpbCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hSRUYgPSAiaHJlZiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSURfVUMgPSAiSUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JTVBMRU1FTlRFUiA9ICJpbXBsZW1lbnRlciI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xJTkVfTlVNQkVSID0gImxpbmVOdW1iZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9MT0NBVElPTiA9ICJsb2NhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FRElBID0gIm1lZGlhIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVTU0FHRV9FTlRSWSA9ICJtZXNzYWdlRW50cnkiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRVNTQUdFUyA9ICJtZXNzYWdlcyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QQVJFTlRfRUxFTUVOVF9OQU1FID0gInBhcmVudEVsZW1lbnROYW1lIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVGRVJFTkNFX0lEID0gInJlZmVyZW5jZUlEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVGRVJFTkNFX1RZUEUgPSAicmVmZXJlbmNlVHlwZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFTEVBU0VfREFURSA9ICJyZWxlYXNlRGF0ZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFUExBQ0UgPSAicmVwbGFjZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1JFU1VMVCA9ICJyZXN1bHQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRVJWSUNFX05BTUUgPSAic2VydmljZU5hbWUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TUEVDSUZJQ0FUSU9OID0gInNwZWNpZmljYXRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVElUTEUgPSAidGl0bGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFID0gInR5cGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WRVJTSU9OID0gInZlcnNpb24iOwotCi0JLyoqCi0JICogRGVmYXVsdCB2YWx1ZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVBPUlRfVVJJID0gInJlcG9ydC54bWwiOwotCi0JLy8gVEVNUDogVXNlIHRoZSBmb2xsb3dpbmcgcmVwb3J0IHRpdGxlIGZvciB0aGUgZHJhZnQgcmVsZWFzZSBvbmx5LgotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVBPUlRfVElUTEUgPSAiV1MtSSBQcm9maWxlCi0JLy8gQ29uZm9ybWFuY2UgUmVwb3J0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JFUE9SVF9USVRMRSA9ICJXUy1JIEJhc2ljIFByb2ZpbGUgQ29uZm9ybWFuY2UgUmVwb3J0LiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RFU1RfQVNTRVJUSU9OU19ET0NVTUVOVF9VUkkgPSAiaHR0cDovL3d3dy53cy1pLm9yZy9UZXN0aW5nL1Rvb2xzLzIwMDQvMTIvQVAxMF9CUDExX1NTQlAxMF9UQUQueG1sIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HX1hTTCA9ICIuLi9jb21tb24veHNsL2xvZy54c2wiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRVBPUlRfWFNMID0gIi4uL2NvbW1vbi94c2wvcmVwb3J0LnhzbCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1hTTF9UWVBFID0gInRleHQveHNsIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfWE1MX0VOQ09ESU5HID0gIlVURi04IjsKLQotCS8qKgotCSAqIEJPTSBjb25zdGFudHMuCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IEJPTV9VVEYxNiA9IDB4RkZGRTsKLQotCXB1YmxpYyBzdGF0aWMgaW50IEJPTV9VVEYxNl9CSUdfRU5ESUFOID0gMHhGRUZGOwotCi0JcHVibGljIHN0YXRpYyBpbnQgQk9NX1VURjggPSAweEVGQkJCRjsKLQotCS8qKgotCSAqIFZhbGlkYXRpb24gY29uc3RhbnRzLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUID0gImxpdGVyYWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0VOQyA9ICJlbmNvZGVkIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQyA9ICJkb2N1bWVudCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMgPSAicnBjIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJWQUxfQ09SUkVMQVRJT05fVFlQRV9FTkRQT0lOVCA9ICJlbmRwb2ludCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0KLQkvKioKLQkgKiBXUy1JIGNvbnN0YW50cyAtIGF0dHJpYnV0ZXMgZm9yIGNvbmZvcm1hbmNlIGNsYWltcyAoZGlzY292ZXJ5KS4KLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX1VERElfQ0xBSU1fS0VZVkFMVUUgPSAiaHR0cDovL3dzLWkub3JnL3Byb2ZpbGVzL2Jhc2ljLzEuMCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSVkFMX1VERElfQ0xBSU1fVE1PREVMS0VZID0gInV1aWQ6NjU3MTkxNjgtNzJjNi0zZjI5LThjMjAtNjJkZWZiMDk2MWMwIjsKLQotCS8qKgotCSAqIFdTLUkgbmFtZXMgYW5kIHZlcnNpb25zIG9mIHRoZSBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uIGRvY3VtZW50IHN1cHBvcnRlZAotCSAqIGluIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRlc3QgdG9vbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfUFJPRklMRV9UQURfTkFNRSA9ICJCYXNpYyBQcm9maWxlIFRlc3QgQXNzZXJ0aW9ucyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19QUk9GSUxFXzFfMV9UQURfTkFNRSA9ICJCYXNpYyBQcm9maWxlIDEuMSBUZXN0IEFzc2VydGlvbnMiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNUExFX1NPQVBfQklORElOR1NfUFJPRklMRV9UQURfTkFNRSA9ICJTaW1wbGUgU29hcCBCaW5kaW5nIFByb2ZpbGUgWzEuMF0gKHdpdGggQmFzaWMgUHJvZmlsZSBbMS4xXSkgVGVzdCBBc3NlcnRpb25zIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSE1FTlRTX1BST0ZJTEVfVEFEX05BTUUgPSAiQXR0YWNobWVudHMgUHJvZmlsZSBbMS4wXSAod2l0aCBCYXNpYyBQcm9maWxlIFsxLjFdIGFuZCBTaW1wbGUgU29hcCBCaW5kaW5nIFByb2ZpbGUgWzEuMF0pIFRlc3QgQXNzZXJ0aW9ucyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19QUk9GSUxFX1RBRF9WRVJTSU9OID0gIjEuMS4wIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX1BST0ZJTEVfMV8xX1RBRF9WRVJTSU9OID0gIjEuMS4wIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTVBMRV9TT0FQX0JJTkRJTkdTX1BST0ZJTEVfVEFEX1ZFUlNJT04gPSAiMS4wLjAiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNITUVOVFNfUFJPRklMRV9UQURfVkVSU0lPTiA9ICIxLjAuMCI7Ci0KLQkvKioKLQkgKiBTeXN0ZW0gZGVwZW5kZW50IGxpbmUgc2VwYXJhdG9yIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUEFSQVRPUiA9IFN5c3RlbQotCQkJLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCi0JLyoqCi0JICogU3lzdGVtIGRlcGVuZGVudCBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSBTeXN0ZW0KLQkJCS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKTsKLQotCS8qKgotCSAqIEZpbGUgd2hpY2ggY29udGFpbnMgdGhlIGNvcHlyaWdodCwgbGljZW5zZSBhbmQgZmVlZGJhY2sgY29tbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVFNfRklMRSA9ICJjb21tZW50cy54bWwiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX1RFWFRfWE1MID0gInRleHQveG1sIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9NVUxUSVBBUlQgPSAibXVsdGlwYXJ0L3JlbGF0ZWQiOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzkzNDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9XU0lFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLS8qKgotICogUHJpbWFyeSBXUy1JIGV4Y2VwdGlvbi4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0lFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgLyoqCi0gICAqIFRocm93YWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBUaHJvd2FibGUgdGhyb3dhYmxlID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGV4Y2VwdGlvbiB3aXRob3V0IGEgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBXU0lFeGNlcHRpb24oKQotICB7Ci0gICAgLy8gRXhjZXB0aW9uCi0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gZXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1zZyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBXU0lFeGNlcHRpb24oU3RyaW5nIG1zZykKLSAgewotICAgIC8vIEV4Y2VwdGlvbgotICAgIHN1cGVyKG1zZyk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBhbmQgcmVsYXRlZCBleGNlcHRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbXNnICAgICAgICB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICogQHBhcmFtIHRocm93YWJsZSAgdGhyb3dhYmxlIHRoYXQgaXMgcmVsYXRlZCB0byB0aGlzIGV4Y2VwdGlvbgotICAgKi8KLSAgcHVibGljIFdTSUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKQotICB7Ci0gICAgLy8gRXhjZXB0aW9uCi0gICAgc3VwZXIobXNnKTsKLQotICAgIC8vIFNhdmUgaW5wdXQgcmVmZXJlbmNlCi0gICAgdGhpcy50aHJvd2FibGUgPSB0aHJvd2FibGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0J3MgdmFsdWVzLgotICAgKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRldGFpbCBtZXNzYWdlIG9mIHRoaXMgdGhyb3dhYmxlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdCdzIHZhbHVlcy4KLSAgICoKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXRhaWwgbWVzc2FnZSBvZiB0aGlzIHRocm93YWJsZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIC8vU3RyaW5nV3JpdGVyIHN3OwotICAgIC8vUHJpbnRXcml0ZXIgcHc7Ci0KLSAgICAvLyBBbHdheXMgZ2V0IG1lc3NhZ2UgZnJvbSBzdXBlciBjbGFzcwotICAgIFN0cmluZyBtc2cgPSBzdXBlci5nZXRNZXNzYWdlKCk7Ci0KLSAgICAvLyBJZiB0aGlzIGV4Y2VwdGlvbiBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGV4Y2VwdGlvbiwKLSAgICAvLyB0aGVuIGFkZCBpdCB0byB0aGUgbWVzc2FnZQotICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBtc2cgKz0gIlxuIgotICAgICAgICArICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKLSAgICAgICAgKyAiICBOZXN0ZWQgZXhjZXB0aW9uIGlzOiBcblxuICAiCi0gICAgICAgICsgdGhyb3dhYmxlLnRvU3RyaW5nKCkKLSAgICAgICAgKyAiXG4iOwotCi0gICAgICAvLyBJZiB0aHJvd2FibGUgaXMgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLCAKLSAgICAgIC8vIHRoZW4gYWRkIGNsYXNzIG5hbWUgYW5kIGtleSB0byBvdXRwdXQKLSAgICAgIGlmICh0aHJvd2FibGUgaW5zdGFuY2VvZiBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUgPSAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKSB0aHJvd2FibGU7Ci0KLSAgICAgICAgLy8gR2V0IGNsYXNzIG5hbWUgYW5kIGtleQotICAgICAgICBtc2cgKz0gIiAtICIKLSAgICAgICAgICArIG1yZS5nZXRLZXkoKQotICAgICAgICAgICsgIlxuXHQiCi0gICAgICAgICAgKyAiW0NsYXNzIE5hbWU6ICIKLSAgICAgICAgICArIG1yZS5nZXRDbGFzc05hbWUoKQotICAgICAgICAgICsgIl0iOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aHJvd2FibGUgaXMgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgCi0gICAgICAvLyB0aGVuIHRhcmdldCBvZiBleGNlcHRpb24KLSAgICAgIGVsc2UgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlID0gKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHRocm93YWJsZTsKLQotICAgICAgICAvLyBHZXQgdGFyZ2V0Ci0gICAgICAgIG1zZyArPSAiIC0gIiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKS50b1N0cmluZygpOwotICAgICAgfQotCi0gICAgICAvLyBBREQ6IFByaW50IHN0YWNrIHRyYWNlCi0gICAgICAvL3N3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgLy9wdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0gICAgICAvL3Rocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHcpOwotCi0gICAgICAvLyBBZGQgaXQgdG8gdGhlIG1lc3NhZ2UKLSAgICAgIC8vbXNnICs9IHN3LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIG1lc3NhZ2UKLSAgICByZXR1cm4gbXNnOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbiB0byBiZSBjcmVhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlbmNhcHN1bGF0ZWQgdGhyb3dhYmxlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGFyZ2V0RXhjZXB0aW9uKCkKLSAgewotICAgIC8vIFJldHVybiB0aHJvd2FibGUKLSAgICByZXR1cm4gdGhyb3dhYmxlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTIzOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhbiBhdHRlbXB0IHRvIG9wZW4gdGhlIGZpbGUgZGVub3RlZCBieSBhIHNwZWNpZmllZCAKLSAqIHBhdGhuYW1lIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0lGaWxlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBXU0lFeGNlcHRpb24KLXsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0lGaWxlTm90Rm91bmRFeGNlcHRpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLgotICAgKiBAcGFyYW0gbXNnICB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gIAotICAgKi8KLSAgcHVibGljIFdTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbXNnKQotICB7Ci0gICAgc3VwZXIobXNnKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uLgotICAgKiBAcGFyYW0gbXNnICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgIGluaXRpYWwgZXhjZXB0aW9uIHRocm93bi4KLSAgICovCi0gIHB1YmxpYyBXU0lGaWxlTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkKLSAgewotICAgIHN1cGVyKG1zZywgdGhyb3dhYmxlKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSVJ1bnRpbWVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4MGUzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBydW50aW1lIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBhZnRlciBwcm9jZXNzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgV1NJUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFdTSUV4Y2VwdGlvbgotewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgV1NJUnVudGltZUV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0lSdW50aW1lRXhjZXB0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTSVJ1bnRpbWVFeGNlcHRpb24uCi0gICAqIEBwYXJhbSBtc2cgIHRoZSBkZXRhaWwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBXU0lSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtc2cpCi0gIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBXU0lSdW50aW1lRXhjZXB0aW9uLgotICAgKiBAcGFyYW0gbXNnICAgICAgICB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgIHRoZSBpbml0aWFsIGV4Y2VwdGlvbiB0aHJvd24uCi0gIAotICAgKi8KLSAgcHVibGljIFdTSVJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkKLSAgewotICAgIHN1cGVyKG1zZywgdGhyb3dhYmxlKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvV1NJVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYjM0MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL1dTSVRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFRhZ3M7Ci0KLS8qKgotICogV1MtSSBjb25zdGFudHMuICAKLSAqICAKLSAqIEBhdXRob3IgS3VsaWsKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0lUYWcgZXh0ZW5kcyBYTUxUYWdzCi17Ci0gIC8qKgotICAgKiBRdWFsaWZpZWQgbmFtZXMgb2YgV1NETCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgV1NETF9JTVBPUlQgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJpbXBvcnQiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX1RZUEVTID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAidHlwZXMiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX01FU1NBR0UgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJtZXNzYWdlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgV1NETF9ET0NVTUVOVEFUSU9OID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAiZG9jdW1lbnRhdGlvbiIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfREVGSU5JVElPTlMgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJkZWZpbml0aW9ucyIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfQklORElORyA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgImJpbmRpbmciKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX09QRVJBVElPTiA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgIm9wZXJhdGlvbiIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfUEFSVCA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgInBhcnQiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX0lOUFVUID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAiaW5wdXQiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX09VVFBVVCA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgIm91dHB1dCIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfRkFVTFQgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJmYXVsdCIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFdTRExfU0VSVklDRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgInNlcnZpY2UiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBXU0RMX1BPUlQgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJwb3J0Iik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgV1NETF9QT1JUVFlQRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCwgInBvcnRUeXBlIik7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBXU0RMX1NPQVBfQklORElORyA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQLCAiYmluZGluZyIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfU09BUF9CT0RZID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVAsICJib2R5Iik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NETF9TT0FQX0hFQURFUiA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQLCAiaGVhZGVyIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NETF9TT0FQX0hFQURFUkZBVUxUID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVAsICJoZWFkZXJmYXVsdCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfU09BUF9GQVVMVCA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQLCAiZmF1bHQiKTsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfTUlNRV9DT05URU5UID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NETF9NSU1FLCAiY29udGVudCIpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFdTRExfTUlNRV9YTUwgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfTkFNRV9XU0RMX01JTUUsICJtaW1lWG1sIik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NETF9NSU1FX1BBUlQgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfTkFNRV9XU0RMX01JTUUsICJwYXJ0Iik7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgV1NETF9NSU1FX01VTFRJUEFSVCA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19OQU1FX1dTRExfTUlNRSwgIm11bHRpcGFydFJlbGF0ZWQiKTsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfV1NETF9BUlJBWVRZUEUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTREwsICJhcnJheVR5cGUiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBBVFRSX1dTRExfTkFNRVNQQUNFID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAibmFtZXNwYWNlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9XU0RMX0xPQ0FUSU9OID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMLCAibG9jYXRpb24iKTsKLQotICAvKioKLSAgICogTmFtZXNwYWNlcy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9DTEFJTSA9Ci0gICAgImh0dHA6Ly93cy1pLm9yZy9zY2hlbWFzL2NvbmZvcm1hbmNlQ2xhaW0vIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTlNfVVJJX1NPQVAgPQotICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9TT0FQRU5DID0KLSAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOU19VUklfQkFTSUNfUFJPRklMRTEwID0KLSAgICAiaHR0cDovL3dzaS5vcmcvcHJvZmlsZXMvYmFzaWMxLjAvIjsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIFNPQVBFTkNfQVJSQVkgPSBuZXcgUU5hbWUoTlNfVVJJX1NPQVBFTkMsICJBcnJheSIpOwotCi0gIC8qKgotICAgKiBRdWFsaWZpZWQgbmFtZXMgb2YgV1MtSSBjbGFpbSBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgV1NJX0NMQUlNID0gbmV3IFFOYW1lKE5TX1VSSV9DTEFJTSwgIkNsYWltIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9DTEFJTV9DT05GT1JNU1RPID0KLSAgICBuZXcgUU5hbWUoTlNfVVJJX0NMQUlNLCAiY29uZm9ybXNUbyIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfU09BUF9NVVNUVU5ERVJTVEFORCA9Ci0gICAgbmV3IFFOYW1lKE5TX1VSSV9TT0FQLCAibXVzdFVuZGVyc3RhbmQiKTsKLQotICAvKioKLSAgICogUXVhbGlmaWVkIG5hbWVzIG9mIFNPQVAgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEVMRU1fU09BUF9FTlZFTE9QRSA9IG5ldyBRTmFtZShOU19VUklfU09BUCwgIkVudmVsb3BlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRUxFTV9TT0FQX0JPRFkgPSBuZXcgUU5hbWUoTlNfVVJJX1NPQVAsICJCb2R5Iik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRUxFTV9TT0FQX0ZBVUxUID0gbmV3IFFOYW1lKE5TX1VSSV9TT0FQLCAiRmF1bHQiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBFTEVNX1NPQVBfSEVBREVSID0gbmV3IFFOYW1lKE5TX1VSSV9TT0FQLCAiSGVhZGVyIik7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQW5hbHl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9BbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGUzYzFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9BbmFseXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotCi0vKioKLSAqIFRoZSBBbmFseXplciB3aWxsIHByb2Nlc3MgYWxsIFByb2ZpbGUgY29uZm9ybWFuY2UgZnVuY3Rpb25zLgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgc3ViLWNsYXNzZWQgZm9yIGVhY2ggcHJvZmlsZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBKaW0gQ2x1bmUKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5hbHl6ZXIKLXsKLSAgLyoqCi0gICAqIE1lc3NhZ2UgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCA9IG51bGw7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfQlVORExFX05BTUUgPQotICAgICJvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXIiOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTQUdFX01FU1NBR0UgPQotICAgICJVc2FnZTogQW5hbHl6ZXIgLWNvbmZpZyA8Y29uZmlnRmlsZW5hbWU+IjsKLQotICBwcm90ZWN0ZWQgUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCA9IG51bGw7Ci0gIHByb3RlY3RlZCBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZUluZm8gPSBudWxsOwotCi0gIC8qKgotICAgKiBBbmFseXplciB0b29sIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFRvb2xJbmZvIHRvb2xJbmZvID0gbnVsbDsKLQotICAvKioKLSAgICogUHJvZmlsZSB2YWxpZGF0b3IgZmFjdG9yeS4KLSAgICovCi0gIHByb3RlY3RlZCBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotICAvKioKLSAgICogUHJvZmlsZSB2YWxpZGF0b3IgZmFjdG9yeS4KLSAgICovCi0gIHByb3RlY3RlZCBEb2N1bWVudEZhY3RvcnkgZG9jdW1lbnRGYWN0b3J5ID0gbnVsbDsKLQotICAvKioKLSAgICogQW5hbHl6ZXIgY29uZmlnIGZpbGUgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGFuYWx5emVyQ29uZmlnTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJvdGVjdGVkIGludCBhbmFseXplckNvbmZpZ0luZGV4ID0gMDsKLQotICAvKioKLSAgICogUHJvZmlsZSBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIFByb2ZpbGVBc3NlcnRpb25zIHByb2ZpbGVBc3NlcnRpb25zID0gbnVsbDsKLQotICAvKioKLSAgICogTG9nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgTG9nIGxvZyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYW5hbHl6ZXIgdG9vbC4KLSAgICogQHBhcmFtIGFyZ3MgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKiBAcGFyYW0gdG9vbEluZm8gIGFuYWx5emVyIHRvb2wgaW5mb3JtYXRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIGNyZWF0aW5nIHRoZSBpbnN0YW5jZSBvZiB0aGUgYW5hbHl6ZXIgdG9vbC4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplcihTdHJpbmdbXSBhcmdzLCBUb29sSW5mbyB0b29sSW5mbykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgaW5pdCh0b29sSW5mbyk7Ci0KLSAgICAvLyBHZXQgbmV3IGNvbmZpZyBvYmplY3QgICAKLSAgICB0aGlzLmFuYWx5emVyQ29uZmlnTGlzdC5hZGQoCi0gICAgICBhbmFseXplckNvbmZpZ0luZGV4LAotICAgICAgZG9jdW1lbnRGYWN0b3J5Lm5ld0FuYWx5emVyQ29uZmlnKCkpOwotICAgIGdldEFuYWx5emVyQ29uZmlnKCkuaW5pdChtZXNzYWdlTGlzdCk7Ci0KLSAgICAvLyBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgZ2V0QW5hbHl6ZXJDb25maWcoKS5wYXJzZUFyZ3MoYXJncywgdHJ1ZSk7Ci0KLSAgICAvLyBEaXNwbGF5IGNvcHlyaWdodCBhbmQgb3B0aW9ucyB0aGF0IHdlcmUgc3BlY2lmaWVkCi0gICAgVGVzdFV0aWxzLnByaW50VG9vbEluZm8odG9vbEluZm8pOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBbmFseXplckNvbmZpZygpLnRvU3RyaW5nKCkpOwotCi0gICAgLy8gRGlzcGxheSBtZXNzYWdlCi0gICAgcHJpbnRNZXNzYWdlKAotICAgICAgInByb2dyZXNzMDEiLAotICAgICAgbnVsbCwKLSAgICAgICJQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgc3BlY2lmaWVkIGFydGlmYWN0cyBhcmUgYW5hbHl6ZWQuLi4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGFuYWx5emVyIHRvb2wuCi0gICAqIEBwYXJhbSBhcmdzICAgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICogQHBhcmFtIHRvb2xJbmZvICBhbmFseXplciB0b29sIGluZm9ybWF0aW9uLgotICAgKiBAcGFyYW0gdmFsaWRhdGUgIGZsYWcgZm9yIGNvbmZpZyBvcHRpb25zIHZhbGlkYXRpb24uIAotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBjcmVhdGluZyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFuYWx5emVyIHRvb2wuCi0gICAqLwotICBwdWJsaWMgQW5hbHl6ZXIoU3RyaW5nW10gYXJncywgVG9vbEluZm8gdG9vbEluZm8sIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGluaXQodG9vbEluZm8pOwotCi0gICAgLy8gR2V0IG5ldyBjb25maWcgb2JqZWN0ICAgCi0gICAgdGhpcy5hbmFseXplckNvbmZpZ0xpc3QuYWRkKAotICAgICAgICBhbmFseXplckNvbmZpZ0luZGV4LAotICAgICAgICBkb2N1bWVudEZhY3RvcnkubmV3QW5hbHl6ZXJDb25maWcoKSk7Ci0gICAgZ2V0QW5hbHl6ZXJDb25maWcoKS5pbml0KG1lc3NhZ2VMaXN0KTsKLQotICAgIC8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICBnZXRBbmFseXplckNvbmZpZygpLnBhcnNlQXJncyhhcmdzLCB2YWxpZGF0ZSk7Ci0KLSAgICAvLyBEaXNwbGF5IGNvcHlyaWdodCBhbmQgb3B0aW9ucyB0aGF0IHdlcmUgc3BlY2lmaWVkCi0gICAgVGVzdFV0aWxzLnByaW50VG9vbEluZm8odG9vbEluZm8pOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBbmFseXplckNvbmZpZygpLnRvU3RyaW5nKCkpOwotCi0gICAgLy8gRGlzcGxheSBtZXNzYWdlCi0gICAgcHJpbnRNZXNzYWdlKAotICAgICAgICAicHJvZ3Jlc3MwMSIsCi0gICAgICAgIG51bGwsCi0gICAgIlBsZWFzZSB3YWl0IHdoaWxlIHRoZSBzcGVjaWZpZWQgYXJ0aWZhY3RzIGFyZSBhbmFseXplZC4uLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgYW5hbHl6ZXIgdG9vbC4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29uZmlnTGlzdCAgYW5hbHl6ZXIgY29uZmlnIGZpbGUgbGlzdC4KLSAgICogQHBhcmFtIHRvb2xJbmZvICAgICAgICAgICAgYW5hbHl6ZXIgdG9vbCBpbmZvcm1hdGlvbi4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgY3JlYXRpbmcgdGhlIGluc3RhbmNlIG9mIHRoZSBhbmFseXplciB0b29sLgotICAgKi8KLSAgcHVibGljIEFuYWx5emVyKExpc3QgYW5hbHl6ZXJDb25maWdMaXN0LCBUb29sSW5mbyB0b29sSW5mbykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBpbml0KHRvb2xJbmZvKTsKLQotICAgIHRoaXMuYW5hbHl6ZXJDb25maWdMaXN0ID0gYW5hbHl6ZXJDb25maWdMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIENvbW1vbiBpbml0aWFsaXphdGlvbi4KLSAgICogQHBhcmFtIHRvb2xJbmZvICBhbmFseXplciB0b29sIGluZm9ybWF0aW9uLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgY29tbW9uIGluaXRpYWxpemF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdChUb29sSW5mbyB0b29sSW5mbykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy50b29sSW5mbyA9IHRvb2xJbmZvOwotCi0gICAgLy8gQ3JlYXRlIG1lc3NhZ2UgbGlzdAotICAgIG1lc3NhZ2VMaXN0ID0gbmV3IE1lc3NhZ2VMaXN0KFJFU09VUkNFX0JVTkRMRV9OQU1FKTsKLQotICAgIC8vIENyZWF0ZSBwcm9maWxlIHZhbGlkYXRvciBmYWN0b3J5Ci0gICAgZmFjdG9yeSA9IFByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLSAgICAvLyBDcmVhdGUgZG9jdW1lbnQgZmFjdG9yeQotICAgIGRvY3VtZW50RmFjdG9yeSA9IERvY3VtZW50RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgYWxsIGNvbmZvcm1hbmNlIHZhbGlkYXRpb24gZnVuY3Rpb25zLgotICAgKiBAcmV0dXJuIHN0YXR1cyBjb2RlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBpbnQgdmFsaWRhdGVBbGwoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgc3RhdHVzQ29kZSA9IDA7Ci0gICAgaW50IHRlbXBTdGF0dXNDb2RlOwotCi0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGFuYWx5emVyQ29uZmlnTGlzdC5zaXplKCk7IGluZGV4KyspCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiaW5kZXg6ICIgKyBpbmRleCk7Ci0KLSAgICAgIC8vIFNldCBjdXJyZW50IGFuYWx5emVyIGNvbmZpZyBpbmRleCAKLSAgICAgIHNldEFuYWx5emVyQ29uZmlnKGluZGV4KTsKLQotICAgICAgaWYgKCh0ZW1wU3RhdHVzQ29kZSA9IHZhbGlkYXRlQ29uZm9ybWFuY2UoKSkgPiBzdGF0dXNDb2RlKQotICAgICAgICBzdGF0dXNDb2RlID0gdGVtcFN0YXR1c0NvZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1c0NvZGU7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBhbGwgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBmdW5jdGlvbnMuCi0gICAqIEByZXR1cm4gc3RhdHVzIGNvZGUuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBjb25mb3JtYW5jZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCB2YWxpZGF0ZUNvbmZvcm1hbmNlKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0IHRvb2wgaW5mb3JtYXRpb24uCi0gICAqIEByZXR1cm4gdGhlIHRvb2wgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgVG9vbEluZm8gZ2V0VG9vbEluZm8oKQotICAKLSAgewotICAgIHJldHVybiB0aGlzLnRvb2xJbmZvOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBjdXJyZW50IGFuYWx5emVyIGNvbmZpZ3VyYXRpb24uCi0gICAqIEBwYXJhbSBpbmRleCAgdXJyZW50IGFuYWx5emVyIGNvbmZpZ3VyYXRpb24uCi0gICAqIEBzZWUgI2dldEFuYWx5emVyQ29uZmlnCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRBbmFseXplckNvbmZpZyhpbnQgaW5kZXgpCi0gIHsKLSAgICB0aGlzLmFuYWx5emVyQ29uZmlnSW5kZXggPSBpbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW5hbHl6ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHJldHVybiBhbmFseXplciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgKiBAc2VlICNzZXRBbmFseXplckNvbmZpZwotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29uZmlnIGdldEFuYWx5emVyQ29uZmlnKCkKLSAgewotICAgIHJldHVybiAoQW5hbHl6ZXJDb25maWcpIHRoaXMuYW5hbHl6ZXJDb25maWdMaXN0LmdldChhbmFseXplckNvbmZpZ0luZGV4KTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBhIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgIGEga2V5LgotICAgKiBAcGFyYW0gbWVzc2FnZURhdGEgICAgIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlICBhIGRlZmF1bHQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50TWVzc2FnZSgKLSAgICBTdHJpbmcga2V5LAotICAgIFN0cmluZyBtZXNzYWdlRGF0YSwKLSAgICBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBtZXNzYWdlTGlzdC5wcmludE1lc3NhZ2Uoa2V5LCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgYSBrZXkuCi0gICAqIEBwYXJhbSBtZXNzYWdlRGF0YSAgICAgbWVzc2FnZSBkYXRhLgotICAgKiBAcGFyYW0gZGVmYXVsdE1lc3NhZ2UgIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXRpY1ByaW50TWVzc2FnZSgKLSAgICBTdHJpbmcga2V5LAotICAgIFN0cmluZyBtZXNzYWdlRGF0YSwKLSAgICBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBNZXNzYWdlTGlzdC5wcmludE1lc3NhZ2UoCi0gICAgICBSRVNPVVJDRV9CVU5ETEVfTkFNRSwKLSAgICAgIGtleSwKLSAgICAgIG1lc3NhZ2VEYXRhLAotICAgICAgZGVmYXVsdE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSAgYSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcmV0dXJuIFhNTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIC8vIFN0YXJ0ICAgICAKLSAgICBwdy5wcmludCh0b29sSW5mby5nZXRTdGFydFhNTFN0cmluZyhuYW1lc3BhY2VOYW1lKSk7Ci0KLSAgICAvLyBDb25maWcKLSAgICBwdy5wcmludCgKLSAgICAgIGdldEFuYWx5emVyQ29uZmlnKCkudG9YTUxTdHJpbmcoCi0gICAgICAgIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9BTkFMWVpFUl9DT05GSUcpKTsKLQotICAgIC8vIEVuZAotICAgIHB3LnByaW50bG4odG9vbEluZm8uZ2V0RW5kWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2UgYSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgaWYgKGdldEFuYWx5emVyQ29uZmlnKCkuZ2V0VmVyYm9zZU9wdGlvbigpKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9BbmFseXplci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0FuYWx5emVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NmNiNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0FuYWx5emVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqLwotCi0jCi0jIEFuYWx5emVyIHJlc291cmNlIGJ1bmRsZS4KLSMKLXVzYWdlMDE9VXNhZ2U6IEFuYWx5emVyIC1jb25maWcgPGNvbmZpZ0ZpbGVuYW1lPgotY3JlYXRlZDAxPUNvbmZvcm1hbmNlIHJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkLgotcHJvZ3Jlc3MwMT1QbGVhc2Ugd2FpdCB3aGlsZSB0aGUgc3BlY2lmaWVkIGFydGlmYWN0cyBhcmUgYW5hbHl6ZWQuLi4KLWVycm9yMDE9QW5hbHl6ZXIgRXJyb3I6Ci1lcnJvcjAyPUFuYWx5emVyIFN0b3BwZWQgQnkgRXhjZXB0aW9uOgotZXJyb3IwMz1UaGUgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBwcm9jZXNzIGZhaWxlZC4KLWV4Y2VwdGlvbjAxPUV4Y2VwdGlvbjoKLWNvbmZpZzAxPUFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgbm90IGZvdW5kLiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcwMj1Db3VsZCBub3QgZmluZCBsb2cgZmlsZS4gIFNwZWNpZmllZCBmaWxlIGxvY2F0aW9uOgotY29uZmlnMDM9Q291bGQgbm90IGZpbmQgV1NETCBmaWxlLiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcwND1DYW4gbm90IHNwZWNpZnkgYm90aCB0aGUgV1NETCByZWZlcmVuY2UgYW5kIFVEREkgcmVmZXJlbmNlIG9wdGlvbnMuCi1jb25maWcwNT1XU0RMIGRvY3VtZW50IHdhcyBlaXRoZXIgbm90IGZvdW5kIG9yIGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuCi1jb25maWcwNj1JbnZhbGlkIGFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZWxlbWVudDoKLWNvbmZpZzA3PUJvdGggdGhlIDx3c2RsRWxlbWVudD4gYW5kIDx3c2RsVVJJPiBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KLWNvbmZpZzA4PUNvdWxkIG5vdCByZWFkIGFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNwZWNpZmllZCBmaWxlIGxvY2F0aW9uOgotY29uZmlnMDk9VGhlIHBhcmVudEVsZW1lbnROYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIGEgV1NETCB0eXBlIG9mIHBvcnQgb3Igb3BlcmF0aW9uLgotY29uZmlnMTA9VGhlIC13c2RsRWxlbWVudCBvcHRpb24gbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlIC13c2RsVVJJIG9yIC11ZGRpS2V5IG9wdGlvbnMuCi1jb25maWcxMT1UaGUgLXNlcnZpY2VMb2NhdGlvbiBvcHRpb24gbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlIC13c2RsVVJJIG9yIC11ZGRpS2V5IG9wdGlvbnMuCi1jb25maWcxMj1UaGUgc3BlY2lmaWVkIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkOgotY29uZmlnMTM9T3B0aW9uIGRpZCBub3QgY29udGFpbiBhIHZhbHVlLiAgU3BlY2lmaWVkIG9wdGlvbjoKLWNvbmZpZzE0PUNvdWxkIG5vdCBmaW5kIHRlc3QgYXNzZXJ0aW9uIGRvY3VtZW50LiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcxNT1SZXBvcnQgZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgcmVwbGFjZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1jb25maWcxNj1UZXN0IGFzc2VydGlvbiBkb2N1bWVudCBsb2NhdGlvbiBtdXN0IGJlIHNwZWNpZmllZC4KLWNvbmZpZzE3PUNvdWxkIG5vdCBnZXQgcmVwb3J0IGZpbGUgbG9jYXRpb24uCi1jb25maWcxOD1JbnZhbGlkIGNvcnJlbGF0aW9uIHR5cGUgc3BlY2lmaWVkLgotY29uZmlnMTk9VGhlIFdTREwgZWxlbWVudCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0FuYWx5emVyQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0FuYWx5emVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzIxZjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9BbmFseXplckNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxEb2N1bWVudENhY2hlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgY29udGV4dHVhbCBpbmZvcm1hdGlvbiB3aGljaCBpcyByZXF1aXJlZCBieSB0ZXN0IGFzc2VydGlvbnMgYWNyb3NzIGFsbCBhcnRpZmFjdHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFseXplckNvbnRleHQKLXsKLSAgcHJvdGVjdGVkIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZUluZm8gPSBudWxsOwotICBwcm90ZWN0ZWQgWE1MRG9jdW1lbnRDYWNoZSBkb2N1bWVudExpc3QgPSBuZXcgWE1MRG9jdW1lbnRDYWNoZSgpOwotCi0gIC8qKgotICAgKiBEbyBub3QgYWxsb3cgdGhlIHVzYWdlIG9mIHRoZSBudWxsIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJpdmF0ZSBBbmFseXplckNvbnRleHQoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFuYWx5emVyIGNvbnRleHQgd2l0aCBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2UgYSBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbnRleHQoU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlUmVmZXJlbmNlID0gc2VydmljZVJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEByZXR1cm4gc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldFNlcnZpY2VSZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZlcmVuY2UoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2VydmljZVJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIGEgc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldFNlcnZpY2VSZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VSZWZlcmVuY2UoU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlUmVmZXJlbmNlID0gc2VydmljZVJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGVJbmZvLgotICAgKiBAcmV0dXJuIENhbmRpZGF0ZUluZm8uCi0gICAqIEBzZWUgI3NldENhbmRpZGF0ZUluZm8KLSAgICovCi0gIHB1YmxpYyBDYW5kaWRhdGVJbmZvIGdldENhbmRpZGF0ZUluZm8oKQotICB7Ci0gICAgcmV0dXJuIGNhbmRpZGF0ZUluZm87Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY2FuZGlkYXRlSW5mby4KLSAgICogQHBhcmFtIGNhbmRpZGF0ZUluZm8gdGhlIGNhbmRpZGF0ZUluZm8gdG8gc2V0LgotICAgKiBAc2VlICNnZXRDYW5kaWRhdGVJbmZvCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDYW5kaWRhdGVJbmZvKENhbmRpZGF0ZUluZm8gY2FuZGlkYXRlSW5mbykKLSAgewotICAgIHRoaXMuY2FuZGlkYXRlSW5mbyA9IGNhbmRpZGF0ZUluZm87Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBsaXN0IG9mIGNhY2hlZCBkb2N1bWVudHMuCi0gICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY2FjaGVkIGRvY3VtZW50cy4KLSAgICogQHNlZSAjc2V0RG9jdW1lbnRMaXN0Ci0gICAqLwotICBwdWJsaWMgWE1MRG9jdW1lbnRDYWNoZSBnZXREb2N1bWVudExpc3QoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGxpc3Qgb2YgY2FjaGVkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIGRvY3VtZW50TGlzdCBhIGxpc3Qgb2YgY2FjaGVkIGRvY3VtZW50cy4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRMaXN0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExpc3QoWE1MRG9jdW1lbnRDYWNoZSBkb2N1bWVudExpc3QpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50TGlzdCA9IGRvY3VtZW50TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBkb2N1bWVudCB0byB0aGUgbGlzdCBvZiBjYWNoZWQgZG9jdW1lbnRzLgotICAgKiBAcGFyYW0ga2V5IGEga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBnaXZlbiBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRvY3VtZW50IGEgZG9jdW1lbnQgdG8gYmUgaWRlbnRpZmllZCB3aXRoIHRoZSBnaXZlbiBrZXkuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGREb2N1bWVudChPYmplY3Qga2V5LCBPYmplY3QgZG9jdW1lbnQpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50TGlzdC5wdXQoa2V5LCBkb2N1bWVudCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvbkZhaWxFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9Bc3NlcnRpb25GYWlsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZjVhMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvbkZhaWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplcjsKLQotLyoqCi0gKiBCYXNlIEV4Y2VwdGlvbiBmb3IgQXNzZXJ0aW9uIEZhaWwuCi0gKiAKLSAqIEBhdXRob3IgZ3R1cnJlbGwKLSAqICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgotewotCi0gIC8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzAwNzYzNTc0MzI1ODkzM0w7Ci0KLQkvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbkV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbkV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGFyZzAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvbkZhaWxFeGNlcHRpb24oU3RyaW5nIGFyZzApCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzNGE1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBmb3IgQXNzZXJ0aW9uIE5vdCBBcHBsaWNhYmxlLgotICogCi0gKiBAYXV0aG9yIGd0dXJyZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLSAgLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTA1NTIzNzgyOTk0MTEyNTY0TDsKLQotCS8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24uCi0gICAqIEBwYXJhbSBhcmcwIHRoZSBkZXRhaWwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKFN0cmluZyBhcmcwKQotICB7Ci0gICAgc3VwZXIoYXJnMCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvblBhc3NFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9Bc3NlcnRpb25QYXNzRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTdkNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvblBhc3NFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplcjsKLQotLyoqCi0gKiBFeGNlcHRpb24gZm9yIEFzc2VydGlvbiBQYXNzLgotICogCi0gKiBAYXV0aG9yIGd0dXJyZWxsCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTcyODU4NDIyODM1NDE4MTBMOwotCi0JLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBBc3NlcnRpb25QQXNzRXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblBhc3NFeGNlcHRpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQXNzZXJ0aW9uUEFzc0V4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGFyZzAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblBhc3NFeGNlcHRpb24oU3RyaW5nIGFyZzApCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDVhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Fzc2VydGlvblJlc3VsdEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi0vKioKLSAqIEV4Y2VwdGlvbiBmb3IgQXNzZXJ0aW9uIFJlc3VsdC4KLSAqIAotICogQGF1dGhvciBndHVycmVsbAotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLSAgLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU2NzIwNjg0NzAwMTUyNjMyTDsKLQlwcml2YXRlIFN0cmluZyBkZXRhaWxNZXNzYWdlOwotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbnJlc3VsdEV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHRFeGNlcHRpb24oKQotICB7Ci0gICAgc3VwZXIoKTsKLSAgICBkZXRhaWxNZXNzYWdlID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uLgotICAgKiBAcGFyYW0gYXJnMCB0aGUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0RXhjZXB0aW9uKFN0cmluZyBhcmcwKQotICB7Ci0gICAgc3VwZXIoYXJnMCk7Ci0gICAgZGV0YWlsTWVzc2FnZSA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvblJlc3VsdEV4Y2VwdGlvbi4KLSAgICogQHBhcmFtIGFyZzAgdGhlIGRldGFpbCBtZXNzYWdlLgotICAgKiBAcGFyYW0gYXJnMSAgZnVydGhlciBkZXRhaWxlZCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdEV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0gIHsKLSAgICBzdXBlcihhcmcwKTsKLSAgICBkZXRhaWxNZXNzYWdlID0gYXJnMTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXRhaWxNZXNzYWdlLgotICAgKiBAcmV0dXJuIHRoZSBkZXRhaWxNZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXRhaWxNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiBkZXRhaWxNZXNzYWdlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9CYXNpY1Byb2ZpbGVBbmFseXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Jhc2ljUHJvZmlsZUFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzk0ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Jhc2ljUHJvZmlsZUFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQsIEJlYWNvbiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIEJlYWNvbklUIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnZlbG9wZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuVURESVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuV1NETFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFydGlmYWN0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5EZWZhdWx0UmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuQXJ0aWZhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTSVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETERvY3VtZW50OwotaW1wb3J0IG9yZy51ZGRpNGoudHJhbnNwb3J0LlRyYW5zcG9ydEZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBBbmFseXplcyBsb2cgZmlsZXMgdG8gY29uZmlybSBjb25mb3JtYW5jZSB0byBhIHByb2ZpbGUuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgSmltIENsdW5lCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljUHJvZmlsZUFuYWx5emVyIGV4dGVuZHMgQW5hbHl6ZXIKLXsKLSAgLyoqCi0gICAqIFRvb2wgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX05BTUUgPSAiQW5hbHl6ZXIiOwotCi0gIC8qKgotICAgKiBXU0RMIGRvY3VtZW50IHRvIGFuYWx5emUuCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgYSBCYXNpYyBwcm9maWxlIGFuYWx5emVyLgotICAgKi8KLSAgcHVibGljIEJhc2ljUHJvZmlsZUFuYWx5emVyKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFyZ3MsIG5ldyBUb29sSW5mbyhUT09MX05BTUUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBCYXNpYyBwcm9maWxlIGFuYWx5emVyLgotICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKiBAcGFyYW0gdmFsaWRhdGUgZmxhZyBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHZhbGlkYXRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgYSBCYXNpYyBwcm9maWxlIGFuYWx5emVyLgotICAgKi8KLSAgcHVibGljIEJhc2ljUHJvZmlsZUFuYWx5emVyKFN0cmluZ1tdIGFyZ3MsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFyZ3MsIG5ldyBUb29sSW5mbyhUT09MX05BTUUpLCB2YWxpZGF0ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQmFzaWMgcHJvZmlsZSBhbmFseXplci4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29uZmlnTGlzdCBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBhbmFseXplci4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqLwotICBwdWJsaWMgQmFzaWNQcm9maWxlQW5hbHl6ZXIoTGlzdCBhbmFseXplckNvbmZpZ0xpc3QpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFuYWx5emVyQ29uZmlnTGlzdCwgbmV3IFRvb2xJbmZvKFRPT0xfTkFNRSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqIEBwYXJhbSBhbmFseXplckNvbmZpZ0xpc3QgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUgYW5hbHl6ZXIuCi0gICAqIEBwYXJhbSB3c2RsVVJJIGEgd3NkbCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIEJhc2ljIHByb2ZpbGUgYW5hbHl6ZXIuCi0gICAqLwotICBwdWJsaWMgQmFzaWNQcm9maWxlQW5hbHl6ZXIoTGlzdCBhbmFseXplckNvbmZpZ0xpc3QsIFN0cmluZyB3c2RsVVJJKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFuYWx5emVyQ29uZmlnTGlzdCwgbmV3IFRvb2xJbmZvKFRPT0xfTkFNRSkpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0IHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgICBpZiAod3NkbFVSSSAhPSBudWxsKQotICAgICAgICB0aGlzLndzZGxEb2N1bWVudCA9IG5ldyBXU0RMRG9jdW1lbnQod3NkbFVSSSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gd2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbih3ZS5nZXRNZXNzYWdlKCksIHdlKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFsbCBjb25mb3JtYW5jZSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4KLSAgICogQHJldHVybiBzdGF0dXMgY29kZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBwcm9jZXNzIGZhaWxlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgdmFsaWRhdGVDb25mb3JtYW5jZSgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGludCBzdGF0dXNDb2RlID0gMDsKLQotICAgIFJlcG9ydCByZXBvcnQgPSBudWxsOwotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0ID0gbnVsbDsKLSAgICBTdHJpbmcgd3NkbFVSSSA9IG51bGw7Ci0gICAgLy9XU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50ID0gbnVsbDsKLQotICAgIC8vIFNldCB1cCBpbml0aWFsIGFuYWx5emVyIGNvbnRleHQgYmFzZWQgb24gZW50cmllcyBpbiB0aGUgY29uZmlnIGZpbGUKLSAgICB0aGlzLmFuYWx5emVyQ29udGV4dCA9Ci0gICAgICBuZXcgQW5hbHl6ZXJDb250ZXh0KG5ldyBTZXJ2aWNlUmVmZXJlbmNlKGdldEFuYWx5emVyQ29uZmlnKCkpKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFJlYWQgcHJvZmlsZSBhc3NlcnRpb25zCi0gICAgICBQcm9maWxlQXNzZXJ0aW9uc1JlYWRlciBwcm9maWxlQXNzZXJ0aW9uc1JlYWRlciA9Ci0gICAgICAgIGRvY3VtZW50RmFjdG9yeS5uZXdQcm9maWxlQXNzZXJ0aW9uc1JlYWRlcigpOwotICAgICAgdGhpcy5wcm9maWxlQXNzZXJ0aW9ucyA9Ci0gICAgICAgIHByb2ZpbGVBc3NlcnRpb25zUmVhZGVyLnJlYWRQcm9maWxlQXNzZXJ0aW9ucygKLSAgICAgICAgICBnZXRBbmFseXplckNvbmZpZygpLmdldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbigpKTsKLQotICAgICAgLy8gQ3JlYXRlIHJlcG9ydCBmcm9tIGRvY3VtZW50IGZhY3RvcnkKLSAgICAgIHJlcG9ydCA9IGRvY3VtZW50RmFjdG9yeS5uZXdSZXBvcnQoKTsKLSAgICAgIHJlcG9ydC5zZXRMb2NhdGlvbihnZXRBbmFseXplckNvbmZpZygpLmdldFJlcG9ydExvY2F0aW9uKCkpOwotCi0gICAgICAvLyBDcmVhdGUgcmVwb3J0IGNvbnRleHQKLSAgICAgIFJlcG9ydENvbnRleHQgcmVwb3J0Q29udGV4dCA9Ci0gICAgICAgIG5ldyBSZXBvcnRDb250ZXh0KAotICAgICAgICAgIFdTSUNvbnN0YW50cy5ERUZBVUxUX1JFUE9SVF9USVRMRSwKLSAgICAgICAgICBwcm9maWxlQXNzZXJ0aW9ucywKLSAgICAgICAgICB0aGlzKTsKLSAgICAgIHJlcG9ydC5zZXRSZXBvcnRDb250ZXh0KHJlcG9ydENvbnRleHQpOwotCi0gICAgICAvLyBDcmVhdGUgcmVwb3J0IHdyaXRlcgotICAgICAgUmVwb3J0V3JpdGVyIHJlcG9ydFdyaXRlciA9IGRvY3VtZW50RmFjdG9yeS5uZXdSZXBvcnRXcml0ZXIoKTsKLSAgICAgIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVCAKLSAgICAgIC8vcmVwb3J0V3JpdGVyLnNldFdyaXRlcihuZXcgRmlsZVdyaXRlcihhbmFseXplckNvbmZpZy5nZXRSZXBvcnRMb2NhdGlvbigpKSk7Ci0gICAgICByZXBvcnRXcml0ZXIuc2V0V3JpdGVyKGdldEFuYWx5emVyQ29uZmlnKCkuZ2V0UmVwb3J0TG9jYXRpb24oKSk7Ci0KLSAgICAgIC8vIENyZWF0ZSByZXBvcnRlcgotICAgICAgdGhpcy5yZXBvcnRlciA9IG5ldyBEZWZhdWx0UmVwb3J0ZXIocmVwb3J0LCByZXBvcnRXcml0ZXIpOwotCi0gICAgICAvLyBTdGFydCB3cml0aW5nIHJlcG9ydAotICAgICAgdGhpcy5yZXBvcnRlci5zdGFydFJlcG9ydCgpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gRElTQ09WRVJZIEFSVElGQUNUOgotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgLy8gU2V0IGN1cnJlbnQgYXJ0aWZhY3QKLSAgICAgIHJlcG9ydEFydGlmYWN0ID0gc2V0Q3VycmVudEFydGlmYWN0KEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX0RJU0NPVkVSWSk7Ci0KLSAgICAgIC8vIElmIFVEREkgb3B0aW9ucyBzcGVjaWZpZWQsIHRoZW4gcHJvY2VzcyBVRERJIHRlc3QgYXNzZXJ0aW9ucwotICAgICAgaWYgKCh3c2RsVVJJID0gdmFsaWRhdGVVRERJKHJlcG9ydEFydGlmYWN0LCBmYWN0b3J5Lm5ld1VERElWYWxpZGF0b3IoKSkpCi0gICAgICAgID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChnZXRBbmFseXplckNvbmZpZygpLmlzV1NETFJlZmVyZW5jZVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgV1NETCBvcHRpb25zIHRvIGdldCB0aGUgV1NETCBsb2NhdGlvbgotICAgICAgICAgIHdzZGxVUkkgPSBnZXRBbmFseXplckNvbmZpZygpLmdldFdTRExMb2NhdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGFydGlmYWN0Ci0gICAgICB0aGlzLnJlcG9ydGVyLmVuZEN1cnJlbnRBcnRpZmFjdCgpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gREVTQ1JJUFRJT04gQVJUSUZBQ1Q6Ci0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAvLyBTZXQgY3VycmVudCBhcnRpZmFjdAotICAgICAgcmVwb3J0QXJ0aWZhY3QgPQotICAgICAgICBzZXRDdXJyZW50QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfREVTQ1JJUFRJT04pOwotCi0gICAgICAvLyBDYWxsIFdTRExWYWxpZGF0b3IgCi0gICAgICB3c2RsRG9jdW1lbnQgPQotICAgICAgICB2YWxpZGF0ZVdTREwoCi0gICAgICAgICAgcmVwb3J0QXJ0aWZhY3QsCi0gICAgICAgICAgZmFjdG9yeS5uZXdXU0RMVmFsaWRhdG9yKCksCi0gICAgICAgICAgd3NkbFVSSSwKLSAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotCi0gICAgICAvLyBJZiBXU0RMIGRvY3VtZW50IG9iamVjdCBpcyBudWxsLCB0aGVuIHRocm93IGV4Y2VwdGlvbgotICAgICAgaWYgKCh3c2RsRG9jdW1lbnQgPT0gbnVsbCkgJiYgKGdldEFuYWx5emVyQ29uZmlnKCkuaXNXU0RMUmVmZXJlbmNlU2V0KCkpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgICAiY29uZmlnMDUiLAotICAgICAgICAgICAgIldTREwgZG9jdW1lbnQgd2FzIGVpdGhlciBub3QgZm91bmQgb3IgY291bGQgbm90IGJlIHByb2Nlc3NlZC4iKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGFydGlmYWN0Ci0gICAgICB0aGlzLnJlcG9ydGVyLmVuZEN1cnJlbnRBcnRpZmFjdCgpOwotCi0gICAgICAvLyBSRU1PVkU6Ci0gICAgICAvLyBJZiBwcm9jZXNzaW5nIGxvZyBlbnRyaWVzIGFuZCB0aGVyZSBpc24ndCBhIFdTREwgVVJJLCAKLSAgICAgIC8vIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uIHNpbmNlIGl0IGlzIHJlcXVpcmVkIHRvIHByb2Nlc3MgdGhlIGxvZyBlbnRyaWVzCi0gICAgICAvL2lmICgod3NkbFVSSSA9PSBudWxsKSAmJiAoYW5hbHl6ZXJDb25maWcuZ2V0TG9nTG9jYXRpb24oKSAhPSBudWxsKSkgewotICAgICAgLy8gIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIk11c3Qgc3BlY2lmeSB0aGUgV1NETCBkb2N1bWVudCBsb2NhdGlvbiB0byB2YWxpZGF0ZSBtZXNzYWdlIGxvZy4iKTsKLSAgICAgIC8vfQotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgLy8gTUVTU0FHRSBBUlRJRkFDVDoKLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIC8vIFNldCBjdXJyZW50IGFydGlmYWN0Ci0gICAgICByZXBvcnRBcnRpZmFjdCA9IHNldEN1cnJlbnRBcnRpZmFjdChBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9NRVNTQUdFKTsKLQotICAgICAgLy8gUHJvY2VzcyB0ZXN0IGFzc2VydGlvbnMgZm9yIHRoZSBtZXNzYWdlcwotICAgICAgdmFsaWRhdGVNZXNzYWdlcygKLSAgICAgICAgcmVwb3J0QXJ0aWZhY3QsCi0gICAgICAgIGZhY3RvcnkubmV3TWVzc2FnZVZhbGlkYXRvcigpLAotICAgICAgICB3c2RsRG9jdW1lbnQpOwotCi0gICAgICAvLyBJbmRpY2F0ZSB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhpcyBhcnRpZmFjdAotICAgICAgdGhpcy5yZXBvcnRlci5lbmRDdXJyZW50QXJ0aWZhY3QoKTsKLQotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIC8vIEVOVkVMT1BFIEFSVElGQUNUOgotICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgLy8gSWYgdGhhdCBpcyBub3QgdGhlIEJhc2ljIFByb2ZpbGUgMS4wLCB0aGVuIHByb2Nlc3MKLSAgICAgIC8vIHRoZSBlbnZlbG9wZSBhcnRpZmFjdAotICAgICAgaWYgKCFwcm9maWxlQXNzZXJ0aW9ucy5nZXRUQUROYW1lKCkKLSAgICAgICAgLmVxdWFscyhXU0lDb25zdGFudHMuQkFTSUNfUFJPRklMRV9UQURfTkFNRSkpCi0gICAgICB7Ci0KLSAgICAgICAgLy8gU2V0IGN1cnJlbnQgYXJ0aWZhY3QKLSAgICAgICAgcmVwb3J0QXJ0aWZhY3QgPSBzZXRDdXJyZW50QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfRU5WRUxPUEUpOwotCi0gICAgICAgIC8vIFByb2Nlc3MgdGVzdCBhc3NlcnRpb25zIGZvciB0aGUgZW52ZWxvcGVzCi0gICAgICAgIHZhbGlkYXRlRW52ZWxvcGVzKAotICAgICAgICAgIHJlcG9ydEFydGlmYWN0LAotICAgICAgICAgIGZhY3RvcnkubmV3RW52ZWxvcGVWYWxpZGF0b3IoKSwKLSAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotCi0gICAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGFydGlmYWN0Ci0gICAgICAgIHRoaXMucmVwb3J0ZXIuZW5kQ3VycmVudEFydGlmYWN0KCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZpbmlzaCB0aGUgY29uZm9ybWFuY2UgcmVwb3J0Ci0gICAgICByZXBvcnRlci5maW5pc2hSZXBvcnQoKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgICBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgImVycm9yMDMiLAotICAgICAgICAgICJUaGUgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBwcm9jZXNzIGZhaWxlZC4iKTsKLQotICAgICAgLy8gRmluaXNoIHJlcG9ydAotICAgICAgaWYgKHJlcG9ydGVyICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHB3LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgiZXhjZXB0aW9uMDEiLCAiRXhjZXB0aW9uOiAiKQotICAgICAgICAgICAgKyBlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOwotICAgICAgICByZXBvcnRlci5maW5pc2hSZXBvcnRXaXRoRXJyb3Ioc3cudG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChlIGluc3RhbmNlb2YgV1NJRXhjZXB0aW9uKQotICAgICAgICB0aHJvdyAoV1NJRXhjZXB0aW9uKSBlOwotICAgICAgZWxzZQotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKG1lc3NhZ2UsIGUpOwotICAgIH0KLQotICAgIGlmIChyZXBvcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdGF0dXNDb2RlID0KLSAgICAgICAgKHJlcG9ydC5nZXRTdW1tYXJ5UmVzdWx0KCkuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEKQotICAgICAgICAgID8gMAotICAgICAgICAgIDogMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1c0NvZGU7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIFVEREkgdGVzdCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVVRERJKAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFVERElWYWxpZGF0b3IgdWRkaVZhbGlkYXRvcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgd3NkbFVSSSA9IG51bGw7Ci0KLSAgICAvLyBJbml0IFVERElWYWxpZGF0b3IKLSAgICB1ZGRpVmFsaWRhdG9yLmluaXQoCi0gICAgICB0aGlzLmFuYWx5emVyQ29udGV4dCwKLSAgICAgIHRoaXMucHJvZmlsZUFzc2VydGlvbnMuZ2V0QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLlRZUEVfRElTQ09WRVJZKSwKLSAgICAgIHJlcG9ydEFydGlmYWN0LAotICAgICAgZ2V0QW5hbHl6ZXJDb25maWcoKS5nZXRVRERJUmVmZXJlbmNlKCksCi0gICAgICB0aGlzLnJlcG9ydGVyKTsKLQotICAgIC8vIENhbGwgVURESVZhbGlkYXRvciAKLSAgICBpZiAoZ2V0QW5hbHl6ZXJDb25maWcoKS5pc1VERElSZWZlcmVuY2VTZXQoKSkKLSAgICB7Ci0gICAgICB3c2RsVVJJID0gdWRkaVZhbGlkYXRvci52YWxpZGF0ZSgpOwotCi0gICAgICAvLyBDbGVhbnVwCi0gICAgICB1ZGRpVmFsaWRhdG9yLmNsZWFudXAoKTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gU2V0IGFsbCBtaXNzaW5nSW5wdXQKLSAgICAgIHVkZGlWYWxpZGF0b3Iuc2V0QWxsTWlzc2luZ0lucHV0KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdzZGxVUkk7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIFdTREwgdGVzdCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJpdmF0ZSBXU0RMRG9jdW1lbnQgdmFsaWRhdGVXU0RMKAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFdTRExWYWxpZGF0b3Igd3NkbFZhbGlkYXRvciwKLSAgICBTdHJpbmcgd3NkbFVSSSwKLSAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFdTRExEb2N1bWVudCByZXR1cm5XU0RMRG9jdW1lbnQgPSBudWxsOwotCi0gICAgLy8gSW5pdCBXU0RMVmFsaWRhdG9yCi0gICAgd3NkbFZhbGlkYXRvci5pbml0KAotICAgICAgdGhpcy5hbmFseXplckNvbnRleHQsCi0gICAgICB0aGlzLnByb2ZpbGVBc3NlcnRpb25zLmdldEFydGlmYWN0KEFydGlmYWN0VHlwZS5UWVBFX0RFU0NSSVBUSU9OKSwKLSAgICAgIHJlcG9ydEFydGlmYWN0LAotICAgICAgd3NkbFVSSSwKLSAgICAgIHdzZGxEb2N1bWVudCwKLSAgICAgIHRoaXMucmVwb3J0ZXIpOwotCi0gICAgLy8gSWYgYSBXU0RMIFVSSSB3YXMgc3BlY2lmaWVkIG9yIGxvY2F0ZWQgaW4gYSBVRERJIHJlZ2lzdHJ5LCB0aGVuIHByb2Nlc3MgdGhlIFdTREwgdGVzdHMKLSAgICBpZiAod3NkbFVSSSAhPSBudWxsIHx8IHdzZGxEb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIENhbGwgV1NETFZhbGlkYXRvciAKLSAgICAgIHJldHVybldTRExEb2N1bWVudCA9IHdzZGxWYWxpZGF0b3IudmFsaWRhdGUoKTsKLQotICAgICAgLy8gQ2xlYW51cAotICAgICAgd3NkbFZhbGlkYXRvci5jbGVhbnVwKCk7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFNldCBhbGwgbWlzc2luZ0lucHV0Ci0gICAgICB3c2RsVmFsaWRhdG9yLnNldEFsbE1pc3NpbmdJbnB1dCgpOwotICAgIH0KLQotICAgIHJldHVybiByZXR1cm5XU0RMRG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUnVuIG1lc3NhZ2UgdGVzdCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWVzc2FnZXMoCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yLAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy9Mb2cgbG9nID0gbnVsbDsKLSAgICAvL01lc3NhZ2VFbnRyeSBsb2dFbnRyeSA9IG51bGw7Ci0KLSAgICAvLyBJbml0IE1lc3NhZ2VWYWxpZGF0b3IKLSAgICBtZXNzYWdlVmFsaWRhdG9yLmluaXQoCi0gICAgICB0aGlzLmFuYWx5emVyQ29udGV4dCwKLSAgICAgIHRoaXMucHJvZmlsZUFzc2VydGlvbnMuZ2V0QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLlRZUEVfTUVTU0FHRSksCi0gICAgICByZXBvcnRBcnRpZmFjdCwKLSAgICAgIHdzZGxEb2N1bWVudCwKLSAgICAgIHRoaXMucmVwb3J0ZXIpOwotCi0gICAgLy8gSWYgdGhlIGxvZyBmaWxlIGxvY2F0aW9uIHdhcyBzcGVjaWZpZWQsIHRoZW4gcHJvY2VzcyB0ZXN0IGFzc2VydGlvbnMgZm9yIHRoZSBtZXNzYWdlcwotICAgIGlmIChnZXRBbmFseXplckNvbmZpZygpLmdldExvZ0xvY2F0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIGxvZyBmaWxlIHJlYWRlcgotICAgICAgTG9nUmVhZGVyIGxvZ1JlYWRlciA9IGRvY3VtZW50RmFjdG9yeS5uZXdMb2dSZWFkZXIoKTsKLQotICAgICAgLy8gQ3JlYXRlIGxvZyByZWFkZXIgY2FsbGJhY2sKLSAgICAgIE1lc3NhZ2VQcm9jZXNzb3IgbWVzc2FnZVByb2Nlc3NvciA9Ci0gICAgICAgIG5ldyBNZXNzYWdlUHJvY2Vzc29yKG1lc3NhZ2VWYWxpZGF0b3IpOwotCi0gICAgICAvLyBTdGFydCByZWFkaW5nIHRoZSBsb2cgZmlsZQotICAgICAgbG9nUmVhZGVyLnJlYWRMb2coZ2V0QW5hbHl6ZXJDb25maWcoKS5nZXRMb2dMb2NhdGlvbigpLCBtZXNzYWdlUHJvY2Vzc29yKTsKLQotICAgICAgLy8gQ2xlYW51cAotICAgICAgbWVzc2FnZVZhbGlkYXRvci5jbGVhbnVwKCk7Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlIGFsbCBhcmUgbWlzc2luZ0lucHV0Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFNldCBhbGwgbWlzc2luZ0lucHV0Ci0gICAgICBtZXNzYWdlVmFsaWRhdG9yLnNldEFsbE1pc3NpbmdJbnB1dCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSdW4gZW52ZWxvcGUgdGVzdCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRW52ZWxvcGVzKAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIEVudmVsb3BlVmFsaWRhdG9yIGVudmVsb3BlVmFsaWRhdG9yLAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gSW5pdCBlbnZlbG9wZVZhbGlkYXRvcgotICAgIGVudmVsb3BlVmFsaWRhdG9yLmluaXQoCi0gICAgICB0aGlzLmFuYWx5emVyQ29udGV4dCwKLSAgICAgIHRoaXMucHJvZmlsZUFzc2VydGlvbnMuZ2V0QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlLlRZUEVfRU5WRUxPUEUpLAotICAgICAgcmVwb3J0QXJ0aWZhY3QsCi0gICAgICB3c2RsRG9jdW1lbnQsCi0gICAgICB0aGlzLnJlcG9ydGVyKTsKLQotICAgIC8vIElmIHRoZSBsb2cgZmlsZSBsb2NhdGlvbiB3YXMgc3BlY2lmaWVkLCB0aGVuIHByb2Nlc3MgdGVzdCBhc3NlcnRpb25zIGZvciB0aGUgbWVzc2FnZXMKLSAgICBpZiAoZ2V0QW5hbHl6ZXJDb25maWcoKS5nZXRMb2dMb2NhdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBsb2cgZmlsZSByZWFkZXIKLSAgICAgIExvZ1JlYWRlciBsb2dSZWFkZXIgPSBkb2N1bWVudEZhY3RvcnkubmV3TG9nUmVhZGVyKCk7Ci0KLSAgICAgIC8vIENyZWF0ZSBsb2cgcmVhZGVyIGNhbGxiYWNrCi0gICAgICBFbnZlbG9wZVByb2Nlc3NvciBlbnZlbG9wZVByb2Nlc3NvciA9Ci0gICAgICAgIG5ldyBFbnZlbG9wZVByb2Nlc3NvcihlbnZlbG9wZVZhbGlkYXRvcik7Ci0KLSAgICAgIC8vIFN0YXJ0IHJlYWRpbmcgdGhlIGxvZyBmaWxlCi0gICAgICBsb2dSZWFkZXIucmVhZExvZyhnZXRBbmFseXplckNvbmZpZygpLmdldExvZ0xvY2F0aW9uKCksIGVudmVsb3BlUHJvY2Vzc29yKTsKLQotICAgICAgLy8gQ2xlYW51cAotICAgICAgZW52ZWxvcGVWYWxpZGF0b3IuY2xlYW51cCgpOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSBhbGwgYXJlIG1pc3NpbmdJbnB1dAotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTZXQgYWxsIG1pc3NpbmdJbnB1dAotICAgICAgZW52ZWxvcGVWYWxpZGF0b3Iuc2V0QWxsTWlzc2luZ0lucHV0KCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbW1hbmQgbGluZSBpbnRlcmZhY2UgZm9yIHRoZSBhbmFseXplciB0b29sLgotICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIElPIHByb2JsZW1zIG9jY3VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpbnQgc3RhdHVzQ29kZSA9IDA7Ci0gICAgQW5hbHl6ZXIgYW5hbHl6ZXIgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU2V0IGRvY3VtZW50IGJ1aWxkZXIgZmFjdG9yeSBjbGFzcwotICAgICAgU3lzdGVtLnNldFByb3BlcnR5KAotICAgICAgICBXU0lQcm9wZXJ0aWVzLlBST1BfSkFYUF9ET0NVTUVOVF9GQUNUT1JZLAotICAgICAgICBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFdTSVByb3BlcnRpZXMuUFJPUF9KQVhQX0RPQ1VNRU5UX0ZBQ1RPUlkpKTsKLQotICAgICAgLy8gU2V0IHRoZSBzeXN0ZW0gcHJvcGVydHkgZm9yIFVEREk0SiB0cmFuc3BvcnQKLSAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgKLSAgICAgICAgVHJhbnNwb3J0RmFjdG9yeS5QUk9QRVJUWV9OQU1FLAotICAgICAgICBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KFRyYW5zcG9ydEZhY3RvcnkuUFJPUEVSVFlfTkFNRSkpOwotCi0gICAgICAvLyBDcmVhdGUgdGhlIGFuYWx5emVyIG9iamVjdAotICAgICAgYW5hbHl6ZXIgPSBuZXcgQmFzaWNQcm9maWxlQW5hbHl6ZXIoYXJncyk7Ci0KLSAgICAgIC8vIEhhdmUgaXQgcHJvY2VzcyB0aGUgY29uZm9ybWFuY2UgdmFsaWRhdGlvbiBmdW5jdGlvbnMKLSAgICAgIHN0YXR1c0NvZGUgPSBhbmFseXplci52YWxpZGF0ZUNvbmZvcm1hbmNlKCk7Ci0KLSAgICAgIC8vIERpc3BsYXkgbWVzc2FnZQotICAgICAgYW5hbHl6ZXIucHJpbnRNZXNzYWdlKAotICAgICAgICAiY3JlYXRlZDAxIiwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgIkNvbmZvcm1hbmNlIHJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkLiIpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBzdGF0dXNDb2RlID0gMTsKLQotICAgICAgYm9vbGVhbiBwcmludFN0YWNrVHJhY2UgPSB0cnVlOwotICAgICAgU3RyaW5nIG1lc3NhZ2VJRDsKLSAgICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZTsKLSAgICAgIFN0cmluZyBtZXNzYWdlRGF0YTsKLQotICAgICAgaWYgKChlIGluc3RhbmNlb2YgV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotICAgICAgICB8fCAoZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikpCi0gICAgICB7Ci0gICAgICAgIC8vcHJpbnRTdGFja1RyYWNlID0gZmFsc2U7Ci0gICAgICAgIG1lc3NhZ2VJRCA9ICJlcnJvcjAxIjsKLSAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSAiQW5hbHl6ZXIgRXJyb3I6IjsKLSAgICAgICAgbWVzc2FnZURhdGEgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvL3ByaW50U3RhY2tUcmFjZSA9IHRydWU7Ci0gICAgICAgIG1lc3NhZ2VJRCA9ICJlcnJvcjAyIjsKLSAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSAiQW5hbHl6ZXIgU3RvcHBlZCBCeSBFeGNlcHRpb246IjsKLSAgICAgICAgbWVzc2FnZURhdGEgPSBlLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChhbmFseXplciAhPSBudWxsKQotICAgICAgICBhbmFseXplci5wcmludE1lc3NhZ2UobWVzc2FnZUlELCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotICAgICAgZWxzZQotICAgICAgICBBbmFseXplci5zdGF0aWNQcmludE1lc3NhZ2UobWVzc2FnZUlELCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotCi0gICAgICBpZiAoYW5hbHl6ZXIgIT0gbnVsbAotICAgICAgICAmJiBhbmFseXplci5nZXRBbmFseXplckNvbmZpZygpICE9IG51bGwKLSAgICAgICAgJiYgYW5hbHl6ZXIuZ2V0QW5hbHl6ZXJDb25maWcoKS5nZXRWZXJib3NlT3B0aW9uKCkpCi0gICAgICAgIGR1bXAoZSk7Ci0gICAgfQotCi0gICAgLy8gRXhpdAotICAgIFN5c3RlbS5leGl0KHN0YXR1c0NvZGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBjdXJyZW50IGFydGlmYWN0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3RUeXBlIGFuIEFydGlmYWN0VHlwZSBvYmplY3QuCi0gICAqIEByZXR1cm4gYSBSZXBvcnRBcnRpZmFjdCBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIGNyZWF0aW5nIHJlcG9ydCBhcnRpZmFjdC4KLSAgICovCi0gIHByb3RlY3RlZCBSZXBvcnRBcnRpZmFjdCBzZXRDdXJyZW50QXJ0aWZhY3QoQXJ0aWZhY3RUeXBlIGFydGlmYWN0VHlwZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYXJ0aWZhY3QKLSAgICBSZXBvcnRBcnRpZmFjdCByZXBvcnRBcnRpZmFjdCA9IHJlcG9ydGVyLmNyZWF0ZUFydGlmYWN0KCk7Ci0gICAgcmVwb3J0QXJ0aWZhY3Quc2V0VHlwZShhcnRpZmFjdFR5cGUpOwotCi0gICAgLy8gQWRkIGFydGlmYWN0IHRvIHJlcG9ydAotICAgIHRoaXMucmVwb3J0ZXIuc2V0Q3VycmVudEFydGlmYWN0KHJlcG9ydEFydGlmYWN0KTsKLQotICAgIHJldHVybiByZXBvcnRBcnRpZmFjdDsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBleGNlcHRpb24uCi0gICAqIEBwYXJhbSB0IGEgVGhyb3dhYmxlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKFRocm93YWJsZSB0KQotICB7Ci0gICAgd2hpbGUgKHQgaW5zdGFuY2VvZiBXU0lFeGNlcHRpb24pCi0gICAgewotICAgICAgVGhyb3dhYmxlIG5lc3RlZCA9ICgoV1NJRXhjZXB0aW9uKSB0KS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgIGlmIChuZXN0ZWQgPT0gbnVsbCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBlbHNlCi0gICAgICAgIHQgPSBuZXN0ZWQ7Ci0gICAgfQotICAgIHQucHJpbnRTdGFja1RyYWNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogTWVzc2FnZSBwcm9jZXNzb3IgY2xhc3MuCi0gICAqLwotICBjbGFzcyBNZXNzYWdlUHJvY2Vzc29yIGltcGxlbWVudHMgTWVzc2FnZUVudHJ5SGFuZGxlcgotICB7Ci0gICAgTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBtZXNzYWdlIHByb2Nlc3NvciBhcyBhIGxvZyByZWFkZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICovCi0gICAgTWVzc2FnZVByb2Nlc3NvcihNZXNzYWdlVmFsaWRhdG9yIG1lc3NhZ2VWYWxpZGF0b3IpCi0gICAgewotICAgICAgdGhpcy5tZXNzYWdlVmFsaWRhdG9yID0gbWVzc2FnZVZhbGlkYXRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGFydGlmYWN0IHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQXJ0aWZhY3RSZWZlcmVuY2UoQXJ0aWZhY3RSZWZlcmVuY2UgYXJ0aWZhY3RSZWZlcmVuY2UpCi0gICAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gICAgewotICAgICAgcmVwb3J0ZXIuYWRkQXJ0aWZhY3RSZWZlcmVuY2UoYXJ0aWZhY3RSZWZlcmVuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYSBzaW5nbGUgbG9nIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NMb2dFbnRyeShFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gICAgewotICAgICAgLy8gVmFsaWRhdGUgbWVzc2FnZQotICAgICAgbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZShlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIEVudmVsb3BlIHByb2Nlc3NvciBjbGFzcy4KLSAgICovCi0gIGNsYXNzIEVudmVsb3BlUHJvY2Vzc29yIGltcGxlbWVudHMgTWVzc2FnZUVudHJ5SGFuZGxlcgotICB7Ci0gICAgRW52ZWxvcGVWYWxpZGF0b3IgZW52ZWxvcGVWYWxpZGF0b3IgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGVudmVsb3BlIHByb2Nlc3NvciBhcyBhIGxvZyByZWFkZXIgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICovCi0gICAgRW52ZWxvcGVQcm9jZXNzb3IoRW52ZWxvcGVWYWxpZGF0b3IgZW52ZWxvcGVWYWxpZGF0b3IpCi0gICAgewotICAgICAgdGhpcy5lbnZlbG9wZVZhbGlkYXRvciA9IGVudmVsb3BlVmFsaWRhdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgYXJ0aWZhY3QgcmVmZXJlbmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NBcnRpZmFjdFJlZmVyZW5jZShBcnRpZmFjdFJlZmVyZW5jZSBhcnRpZmFjdFJlZmVyZW5jZSkKLSAgICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgICB7Ci0gICAgICByZXBvcnRlci5hZGRBcnRpZmFjdFJlZmVyZW5jZShhcnRpZmFjdFJlZmVyZW5jZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBhIHNpbmdsZSBsb2cgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xvZ0VudHJ5KEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgICB7Ci0gICAgICAvLyBWYWxpZGF0ZSBlbnZlbG9wZXMKLSAgICAgIGVudmVsb3BlVmFsaWRhdG9yLnZhbGlkYXRlKGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9DYW5kaWRhdGVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvQ2FuZGlkYXRlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU4MmI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9DYW5kaWRhdGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMVXRpbHM7Ci0KLS8qKgotICogUHJvdmlkZSBhIG5vcm1hbGl6ZWQgc2V0IG9mIGRhdGEgcmVsYXRpbmcgdG8gdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KLSAqIEZvciBleGFtcGxlLCB3aXRoIGVuZHBvaW50IGNvcnJlbGF0aW9uIGFuZCB3c2RsRWxlbWVudCBvZiB0eXBlICJtZXNzYWdlIiAKLSAqIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIG1hdGNoZXMgZm9yIG1vc3QgZWxlbWVudCB0eXBlcyBpbmNsdWRpbmcgV1NETCBTZXJ2aWNlLgotICogKHRob3VnaCB0aGUgb2JqZWN0aXZlIGlzIHRvIGVuc3VyZSBmaWx0ZXJpbmcgdG8gYSBzaW5nbGUgc2VydmljZSBpZiBhdCBhbGwgcG9zc2libGUpLiAKLSAqIAotICogQGF1dGhvciBndHVycmVsbAotICovCi0KLS8vIEFERDpjb3VsZCBiZSBiZXR0ZXIgYXMgYSBzaW5nbGV0b24/Ci0KLXB1YmxpYyBjbGFzcyBDYW5kaWRhdGVJbmZvCi17Ci0KLSAgLy8gTm9ybWFsaXplZCBmaXhlZCBjb3JyZWxhdGlvbiBkYXRhIGRlcml2ZWQgZnJvbSB0aGUgYW5hbHl6ZXIgY29uZmlnIGFuZCB0aGUgd3NkbCwKLSAgLy8gcmVwcmVzZW50aW5nIHdoYXQgd2Uga25vdyBhYm91dCB0aGUgc2VydmljZSBmcm9tIHRoZXNlIHR3byBzb3VyY2VzLiAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbltdIGRlZmluaXRpb25zID0gbnVsbDsKLQotICBwcml2YXRlIEltcG9ydFtdIGltcG9ydHMgPSBudWxsOwotICBwcml2YXRlIFR5cGVzW10gdHlwZXMgPSBudWxsOwotCi0gIHByaXZhdGUgTWVzc2FnZVtdIG1lc3NhZ2VzID0gbnVsbDsKLSAgcHJpdmF0ZSBPcGVyYXRpb25bXSBvcGVyYXRpb25zID0gbnVsbDsKLSAgcHJpdmF0ZSBQb3J0VHlwZVtdIHBvcnRUeXBlcyA9IG51bGw7Ci0gIHByaXZhdGUgQmluZGluZ1tdIGJpbmRpbmdzID0gbnVsbDsKLSAgcHJpdmF0ZSBQb3J0W10gcG9ydHMgPSBudWxsOwotCi0gIHByaXZhdGUgVVJJW10gZW5kUG9pbnRzID0gbnVsbDsgLy8gbGlzdCBvYnRhaW5hYmxlIGZyb20gYSBwb3J0Ci0KLSAgcHJpdmF0ZSBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50OyAvLyByZWZlcmVuY2UgcHJvYmFibHkgbm90IGRlc2lyYWJsZSBoZXJlCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBDYW5kaWRhdGVJbmZvLgotICAgKiBFeHRyYWN0IG5vcm1hbGlzZWQgZW50cnkgZGF0YSBmcm9tIHdzZGwsIGFjY29yZGluZyB0byBjb25maWcgd3NkbEVsZW1lbnQgJiBzZXJ2aWNlTG9jYXRpb24KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2UgYSBTZXJ2aWNlUmVmZXJlbmNlIG9iamVjdC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCBhIFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGNyZWF0aW5nIENhbmRpZGF0ZUluZm8gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIENhbmRpZGF0ZUluZm8oCi0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlLAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBBREQ6IGNoZWNrIGZvciBudWxsIGRvY3VtZW50PwotCi0gICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCk7Ci0KLSAgICB0aGlzLndzZGxEb2N1bWVudCA9IHdzZGxEb2N1bWVudDsKLQotICAgIC8qCi0gICAgICogR2VuZXJhbGlzZWQgZmllbGRzIGluZGVwZW5kZW50IG9mIHdzZGxFbGVtZW50OgotICAgICAqLwotICAgIC8vIEFERDogY2hlY2sgd2hldGhlciB0aGVzZSBuZWVkIHRvIGJlIGVpdGhlciBleHBhbmRlZCBvciBmaWx0ZXJlZCBkb3duLgotICAgIC8vIEFzc3VtZSBXU0RMNEogcHVsbHMgaW50IHRoZSBmdWxsIHRyZWUgYXQgdGhlIHJvb3QgZG9jdW1lbnQgZm9yIG5vdwkJCi0gICAgLy90aGlzLmltcG9ydHMgPSB3c2RsRG9jdW1lbnQuZ2V0SW1wb3J0cygpOwotCi0gICAgLy8gLi4uIG9yIGlmIG9ubHkgZG93biB0byBmaXJzdCBsZXZlbC4uLi4KLSAgICB0aGlzLmltcG9ydHMgPQotICAgICAgKEltcG9ydFtdKSBnZXRBbGxJbXBvcnRzKAotICAgICAgICB3c2RsRG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKSkudG9BcnJheShuZXcgSW1wb3J0W10gewotICAgIH0pOwotCi0gICAgLyogRGVmaW5pdGlvbnMuIAotICAgICAqIE5vdGUgdGhhdCB0aGUgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgaXMgZm9yIHRoZSByb290IGRvYwotICAgICAqIHdoaWNoIGNvbnRhaW5zIGFsbCBXU0RMIGVsZW1lbnRzIGluIHNjb3BlIHZpYSA8aW1wb3J0PiBkZWNsYXJhdGlvbnMsCi0gICAgICogYXMgd2VsbCBhcyB0aGUgcm9vdCBkb2N1bWVudCBpdHNlbGYuIFRoZXJlZm9yZSB0aGUgc2Vjb25kIGRlZmluaXRpb25zIAotICAgICAqIGFycmF5IGVsZW1lbnQgYW5kIGFib3ZlIGFyZSByZWR1bmRhbnQsIGJ1dCAqbWF5KiBwcm92ZSB1c2VmdWwgdG8gdGhlIGFzc2VydGlvbgotICAgICAqIGNvZGUuCi0gICAgICovCi0KLSAgICB0aGlzLmRlZmluaXRpb25zID0gbmV3IERlZmluaXRpb25baW1wb3J0cy5sZW5ndGggKyAxXTsKLSAgICAvLyBhbGxvdyByb29tIGZvciByb290IGRvYwkJCi0KLSAgICB0aGlzLmRlZmluaXRpb25zWzBdID0gd3NkbERvY3VtZW50LmdldERlZmluaXRpb25zKCk7IC8vIHJvb3QgZG9jdW1lbnQgICAgCi0KLSAgICAvLyBBbGxvY2F0ZSBhcnJheSBmb3IgdHlwZXMgZWxlbWVudHMKLSAgICBUeXBlc1tdIHRlbXBUeXBlcyA9IG5ldyBUeXBlc1tkZWZpbml0aW9ucy5sZW5ndGhdOwotCi0gICAgaW50IHR5cGVzQ291bnQgPSAwOwotCi0gICAgaWYgKGRlZmluaXRpb25zWzBdLmdldFR5cGVzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0ZW1wVHlwZXNbMF0gPSB0aGlzLmRlZmluaXRpb25zWzBdLmdldFR5cGVzKCk7IC8vIHJvb3QgZG9jdW1lbnQJCi0gICAgICB0eXBlc0NvdW50Kys7Ci0gICAgfQotCi0gICAgLy8gRGVmaW5pdGlvbnMgZnJvbSBvdGhlciAoaW1wb3J0ZWQpIHdzZGxzIGNvcnJlbGF0aW5nIHRvIHRoZSBjYW5kaWRhdGUKLSAgICAvLyBPbmx5IG9uZSBsZXZlbCBkb3duIGZvciBub3cKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKCgoZGVmaW5pdGlvbnNbaSArIDFdID0gaW1wb3J0c1tpXS5nZXREZWZpbml0aW9uKCkpICE9IG51bGwpCi0gICAgICAgICYmIChkZWZpbml0aW9uc1tpICsgMV0uZ2V0VHlwZXMoKSAhPSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgdGVtcFR5cGVzW3R5cGVzQ291bnRdID0gZGVmaW5pdGlvbnNbaSArIDFdLmdldFR5cGVzKCk7Ci0gICAgICAgIHR5cGVzQ291bnQrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHlwZXNDb3VudCA+IDApCi0gICAgewotICAgICAgdGhpcy50eXBlcyA9IG5ldyBUeXBlc1t0eXBlc0NvdW50XTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlc0NvdW50OyBpKyspCi0gICAgICAgIHRoaXMudHlwZXNbaV0gPSB0ZW1wVHlwZXNbaV07Ci0gICAgfQotICAgIC8qIAotICAgICAqIFBvcHVsYXRlIGVsZW1lbnQgaGllcmFjaHk6Ci0gICAgICogUG9ydAotICAgICAqIEJpbmRpbmcKLSAgICAgKiBQb3J0VHlwZQotICAgICAqIG9wZXJhdGlvbihzKQotICAgICAqIG1lc3NhZ2UocykKLSAgICAgKi8KLQotICAgIGlmICh3c2RsRWxlbWVudC5pc1BvcnQoKSkKLSAgICB7Ci0KLSAgICAgIFBvcnQgcG9ydCA9IG51bGw7Ci0KLSAgICAgIC8vIFVzZSBwYXJlbnRFbGVtZW50TmFtZSB0byBxdWFsaWZ5IHRoZSBwb3J0IHdpdGhpbiBhIHNlcnZpY2UuCQkKLSAgICAgIFFOYW1lIHNlcnZpY2VOYW1lID0gd3NkbEVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudFFOYW1lKCk7Ci0gICAgICBTZXJ2aWNlW10gcyA9IHdzZGxEb2N1bWVudC5nZXRTZXJ2aWNlcygpOwotICAgICAgU3RyaW5nIHBvcnROYW1lID0gd3NkbEVsZW1lbnQuZ2V0TmFtZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCAmJiBwb3J0ID09IG51bGw7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHNbaV0uZ2V0UU5hbWUoKS5lcXVhbHMoc2VydmljZU5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgcG9ydCA9IHNbaV0uZ2V0UG9ydChwb3J0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHBvcnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAiV1NETCBQb3J0IFwnIgotICAgICAgICAgICAgKyBwb3J0TmFtZQotICAgICAgICAgICAgKyAiXCcgZm9yIFNlcnZpY2UgXCciCi0gICAgICAgICAgICArIHNlcnZpY2VOYW1lCi0gICAgICAgICAgICArICJcJyBub3QgZm91bmQgaW4gc2VydmljZSBkZXNjcmlwdGlvbiIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aGlzLnBvcnRzID0gbmV3IFBvcnRbXSB7IHBvcnQgfTsKLSAgICAgICAgLy8gQUREOiBkbyBzZXJ2aWNlTG9jYXRpb24gY2hlY2sgZm9yIHNvYXBiaW5kOmFkZHJlc3M/Ci0gICAgICAgIGRlc2NlbmRlbnRzKHBvcnQpOwotICAgICAgfQotCi0gICAgICAvLyBBREQ6IHRoZSBmb2xsb3dpbmcgY291bGQgYmUgaW5zdGFudGlhdGVkIGhlcmUgaW5zdGVhZCB0byByZWZpbmUgY29udGV4dCBpbmZvCi0gICAgICAvLyBkZWZpbml0aW9ucyAKLSAgICAgIC8vIGltcG9ydHMgCi0gICAgICAvLyB0eXBlcwotCi0gICAgfQotCi0gICAgZWxzZSBpZiAod3NkbEVsZW1lbnQuaXNCaW5kaW5nKCkpCi0gICAgewotICAgICAgaWYgKHdzZGxFbGVtZW50LmdldFFOYW1lKCkgIT0gbnVsbAotICAgICAgICAmJiB3c2RsRWxlbWVudC5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpICE9IG51bGwKLSAgICAgICAgJiYgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKS5sZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmcgYmluZGluZyA9Ci0gICAgICAgICAgd3NkbERvY3VtZW50LmdldERlZmluaXRpb25zKCkuZ2V0QmluZGluZyh3c2RsRWxlbWVudC5nZXRRTmFtZSgpKTsKLQotICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICJXU0RMIEJpbmRpbmcgbmFtZWQgXCciCi0gICAgICAgICAgICAgICsgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKQotICAgICAgICAgICAgICArICJcJyBub3QgZm91bmQgaW4gc2VydmljZSBkZXNjcmlwdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRoaXMuYmluZGluZ3MgPSBuZXcgQmluZGluZ1tdIHsgYmluZGluZyB9OwotCi0gICAgICAgICAgLy8gdGhlIHJlc3QgLi4uIGJlbG93IGJpbmRpbmc6CQotICAgICAgICAgIC8vIHBvcnRUeXBlcyBmcm9tIGJpbmRpbmcKLSAgICAgICAgICAvLyBvcGVyYXRpb25zIGZyb20gcG9ydFR5cGVzCi0gICAgICAgICAgLy8gbWVzc2FnZXMgZnJvbSBvcGVyYXRpb25zCi0gICAgICAgICAgZGVzY2VuZGVudHMoYmluZGluZyk7Ci0KLSAgICAgICAgICAvLyBhYm92ZSBiaW5kaW5nOgotICAgICAgICAgIC8vIHBvcnRzCi0gICAgICAgICAgLy8gZGVmaW5pdGlvbnMsIGltcG9ydHMsIHR5cGVzIChmdXR1cmU/KQkJCQkKLSAgICAgICAgICAvLyBhbmNlc3RvcnMoYmluZGluZ3MpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZWxzZSBpZiAod3NkbEVsZW1lbnQuaXNQb3J0VHlwZSgpKQotICAgIHsKLQotICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPQotICAgICAgICB3c2RsRG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKS5nZXRQb3J0VHlwZSh3c2RsRWxlbWVudC5nZXRRTmFtZSgpKTsKLSAgICAgIHRoaXMucG9ydFR5cGVzID0gbmV3IFBvcnRUeXBlW10geyBwb3J0VHlwZSB9OwotCi0gICAgICBpZiAocG9ydFR5cGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAiV1NETCBQb3J0VHlwZSBuYW1lZCBcJyIKLSAgICAgICAgICAgICsgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKQotICAgICAgICAgICAgKyAiXCcgbm90IGZvdW5kIGluIHNlcnZpY2UgZGVzY3JpcHRpb24iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhpcy5wb3J0VHlwZXMgPSBuZXcgUG9ydFR5cGVbXSB7IHBvcnRUeXBlIH07Ci0gICAgICAgIC8vIHRoZSByZXN0IC4uLiBiZWxvdyBwb3J0VHlwZToJCi0gICAgICAgIGRlc2NlbmRlbnRzKHBvcnRUeXBlKTsKLQotICAgICAgICAvLyBhYm92ZSBwb3J0VHlwZToKLSAgICAgICAgLy8gcG9ydHMKLSAgICAgICAgLy8gZGVmaW5pdGlvbnMsIGltcG9ydHMsIHR5cGVzIChmdXR1cmUpID8KLSAgICAgICAgLy9hbmNlc3RvcnMocG9ydFR5cGVzKTsJCQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh3c2RsRWxlbWVudC5pc09wZXJhdGlvbigpKQotICAgIHsKLQotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7Ci0gICAgICBTdHJpbmcgY29uZmlnT3BOYW1lID0gd3NkbEVsZW1lbnQuZ2V0TmFtZSgpOwotCi0gICAgICAvLyBVc2UgcGFyZW50RWxlbWVudE5hbWUgdG8gcXVhbGlmeSB0aGUgb3BlcmF0aW9uIHdpdGhpbiBhIHBvcnRUeXBlLgotICAgICAgUU5hbWUgcG9ydFR5cGVOYW1lID0gd3NkbEVsZW1lbnQuZ2V0UGFyZW50RWxlbWVudFFOYW1lKCk7Ci0gICAgICBQb3J0VHlwZVtdIHAgPSB3c2RsRG9jdW1lbnQuZ2V0UG9ydFR5cGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHAubGVuZ3RoICYmIG9wZXJhdGlvbiA9PSBudWxsOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChwW2ldLmdldFFOYW1lKCkuZXF1YWxzKHBvcnRUeXBlTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB3c2RsNGogYXZhaWxhYmxlIG1ldGhvZCBjYWxsIGJlbG93IGltcGxpZXMgdGhhdCBvbmx5IAotICAgICAgICAgIC8vIG5hbWUraW5wdXRuYW1lK291dHB1dG5hbWUgdW5pcXVlbHkgZGVmaW5lcyBvcGVyYXRpb24hIAotICAgICAgICAgIC8vIFNpbmNlIHdlIGRvIG5vdCBoYXZlIDxpbnB1dD4gJiA8b3V0cHV0PiBuYW1lIGluZm9ybWF0aW9uCi0gICAgICAgICAgLy8gYXZhaWxhYmxlIGluIHRoZSBjb25maWcsIHVzZSB0aGlzIGluc3RlYWQgZm9yIG5vdzogLSAKLSAgICAgICAgICAvLyBHZXQgdGhlIGZpcnN0IG9wZXJhdGlvbiB3ZSBmaW5kOgotICAgICAgICAgIEl0ZXJhdG9yIG9wSXQgPSBwW2ldLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgICAgIE9wZXJhdGlvbiBvcCA9IG51bGw7Ci0gICAgICAgICAgd2hpbGUgKG9wSXQuaGFzTmV4dCgpICYmIG9wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wID0gKE9wZXJhdGlvbikgb3BJdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoY29uZmlnT3BOYW1lLmVxdWFscyhvcC5nZXROYW1lKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcGVyYXRpb24gPSBvcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICJObyBXU0RMIE9wZXJhdGlvbiBuYW1lZCBcJyIKLSAgICAgICAgICAgICsgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKQotICAgICAgICAgICAgKyAiXCcgZm91bmQgaW4gc2VydmljZSBkZXNjcmlwdGlvbiIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aGlzLm9wZXJhdGlvbnMgPSBuZXcgT3BlcmF0aW9uW10geyBvcGVyYXRpb24gfTsKLQotICAgICAgICBkZXNjZW5kZW50cyhvcGVyYXRpb24pOwotICAgICAgICAvL2FuY2VzdG9ycyhvcGVyYXRpb25zKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlbHNlIGlmICh3c2RsRWxlbWVudC5pc01lc3NhZ2UoKSkKLSAgICB7Ci0KLSAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICAgIHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpLmdldE1lc3NhZ2Uod3NkbEVsZW1lbnQuZ2V0UU5hbWUoKSk7Ci0gICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICJObyBXU0RMIE1lc3NhZ2UgbmFtZWQgXCciCi0gICAgICAgICAgICArIHdzZGxFbGVtZW50LmdldFFOYW1lKCkKLSAgICAgICAgICAgICsgIlwnIGZvdW5kIGluIHNlcnZpY2UgZGVzY3JpcHRpb24iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG5ldyBNZXNzYWdlW10geyBtZXNzYWdlIH07Ci0KLSAgICAgICAgLy9hbmNlc3RvcnMobWVzc2FnZXMpOyAKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgIlVucmVjb2duaXNlZCA8V1NETEVsZW1lbnQgdHlwZT4gaW4gY29uZmlnOiAiICsgd3NkbEVsZW1lbnQuZ2V0VHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBnZXQgaW5mbyBhYm91dCB0aGUgZWZmZWN0aXZlIHNlcnZpY2UgbG9jYXRpb24gKHMpCi0gICAgLy90aGlzLmVuZFBvaW50cyA9IGRlcml2ZUVuZHBvaW50cyhhbmFseXplckNvbmZpZywgdGhpcy5wb3J0cywgdGhpcy5kZWZpbml0aW9ucyk7Ci0gICAgdGhpcy5lbmRQb2ludHMgPQotICAgICAgZGVyaXZlRW5kcG9pbnRzKHNlcnZpY2VSZWZlcmVuY2UsIHRoaXMucG9ydHMsIHRoaXMuZGVmaW5pdGlvbnMpOwotICB9Ci0KLSAgLyoqIAotICAgICAqIGFuY2VzdG9yIGNvZGUgaXMgbm90IHVzZWQgYXQgcHJlc2VudC4KLSAgICAgKiAKLSAgICAgKi8KLSAgLyogICAKLSAgICAgcHJvdGVjdGVkIHZvaWQgYW5jZXN0b3JzKFBvcnRbXSBwb3J0cykgewotICAgICAJLy8gbm8gYW5jZXN0b3JzIG9mIFBvcnQgcmVxdWlyZWQgKGZvciBub3cpCi0gICAgIH0gCSAgICAKLSAgICAgcHJvdGVjdGVkIHZvaWQgYW5jZXN0b3JzKEJpbmRpbmdbXSBiaW5kaW5ncykgewkgICAgCi0gICAgCQkvLyBQb3J0cyBmcm9tIEJpbmRpbmdzICAxLTItMQotICAgICAJCi0gICAgIAkvLyAqKiogY2hlYXQgZm9yIG5vdyAtIGdldCBwb3J0cyBmcm9tIGFsbCBzZXJ2aWNlcyBpbiB0aGUgd3NkbCBkb2MKLSAgICAgCS8vIEFERDogZmluZCBjb3JyZWN0IG1hcHBpbmcgYmFzZWQgb24gdGhlIHN1cHBsaWVkIGJpbmRpbmdzCi0gICAgIAlTZXJ2aWNlW10gc2VydmljZSA9IHdzZGxEb2N1bWVudC5nZXRTZXJ2aWNlcygpOwotICAgICAJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAJCWZvciAoaW50IGk9MDsgaT5zZXJ2aWNlLmxlbmd0aDsgaSsrKSB7Ci0gIAkJCXNldC5hZGQoc2VydmljZVtpXS5nZXRQb3J0cygpKTsgIAotICAJCX0KLSAgCQkJCi0gIAkJLy8gYXNzaWduIHRoZSBwYXJlbnQgZ3JvdXAgYW5kIHByb2Nlc3MgdGhlIGdyYW5kcGFyZW50cyBpZiBhbnkJCQkJCQkJCQotICAJCWFuY2VzdG9ycyh0aGlzLnBvcnRzID0gKFBvcnRbXSlzZXQudG9BcnJheSh0aGlzLnBvcnRzID0gbmV3IFBvcnRbMF0pKTsKLSAgICAgfQotICAgICBwcm90ZWN0ZWQgdm9pZCBhbmNlc3RvcnMoUG9ydFR5cGVbXSBwb3J0VHlwZXMpIHsJICAgIAotICAgIAkJLy8gQmluZGluZ3MgZnJvbSBQb3J0VHlwZXMgIDEtMi0xCi0gICAgIAkKLSAgICAgCS8vIGFkZCBoYXZlIHRvIHN0YXJ0IHdpdGggYWxsIGJpbmRpbmdzIGluIGRvYyBhbmQgc2VhcmNoIGZvciB0aG9zZQotICAgICAJLy8gd2l0aCB0aGUgcG9ydFR5cGUgIAotICAgICAJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotICAJCWZvciAoaW50IGk9MDsgaT5wb3J0VHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgCQkvLyBzZXQuYWRkKHBvcnRUeXBlc1tpXS5nZXQoKSk7ICAKLSAgCQl9Ci0gIAkJCQotICAJCS8vIGFzc2lnbiB0aGUgcGFyZW50IGdyb3VwIGFuZCBwcm9jZXNzIHRoZSBncmFuZHBhcmVudHMgaWYgYW55CQkJCQkJCQkKLSAgCQlhbmNlc3RvcnModGhpcy5iaW5kaW5ncyA9IChCaW5kaW5nW10pc2V0LnRvQXJyYXkodGhpcy5iaW5kaW5ncyA9IG5ldyBCaW5kaW5nWzBdKSk7Ci0gICAgIH0KLSAgICAgcHJvdGVjdGVkIHZvaWQgYW5jZXN0b3JzKE9wZXJhdGlvbltdIG9wZXJhdGlvbnMpIHsJICAgIAotICAgIAkJLy8gUG9ydFR5cGVzIGZyb20gT3BlcmF0aW9ucyAgMS0yLTEKLSAgICAgCSAgCi0gICAgIAlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gIAkJZm9yIChpbnQgaT0wOyBpPm9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgCQkJLy8gc2V0LmFkZChvcGVyYXRpb25zW2ldLmdldCgpKTsgIAotICAJCX0KLSAgCQkJCi0gIAkJLy8gYXNzaWduIHRoZSBwYXJlbnQgZ3JvdXAgYW5kIHByb2Nlc3MgdGhlIGdyYW5kcGFyZW50cyBpZiBhbnkJCQkJCQkJCQotICAJCWFuY2VzdG9ycyh0aGlzLnBvcnRUeXBlcyA9IChQb3J0VHlwZVtdKXNldC50b0FycmF5KHRoaXMucG9ydFR5cGVzID0gbmV3IFBvcnRUeXBlWzBdKSk7Ci0gICAgIH0KLSAgICAgcHJvdGVjdGVkIHZvaWQgYW5jZXN0b3JzKE1lc3NhZ2VbXSBtZXNzYWdlcykgewkgICAgCi0gICAgCQkvLyBPcGVyYXRpb25zIGZyb20gTWVzc2FnZXMgIDEtMi0xCi0gICAgIAkvLyBBREQgZml4IGl0ISAgCi0gICAgIAlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gIAkJZm9yIChpbnQgaT0wOyBpPm1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0gIAkJCS8vIHNldC5hZGQobWVzc2FnZXNbaV0uZ2V0KCkpOyAgCi0gIAkJfQotICAJCQkKLSAgCQkvLyBhc3NpZ24gdGhlIHBhcmVudCBncm91cCAJCi0gIAkJdGhpcy5wb3J0VHlwZXMgPSAoUG9ydFR5cGVbXSlzZXQudG9BcnJheSh0aGlzLnBvcnRUeXBlcyA9IG5ldyBQb3J0VHlwZVswXSk7Ci0gICAgIH0KLSAgKi8KLQotICAvKioKLSAgICogRGVzY2VuZGFudCBtZXRob2QgZm9yIGNvbXBsZXRpbmcgY2FuZGlkYXRlIHNlcnZpY2UgY29udGV4dCBjcmVhdGlvbi4KLSAgICogQHBhcmFtIHBvcnQgIGEgUG9ydCBvYmplY3QKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcG9ydCBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGVzY2VuZGVudHMoUG9ydCBwb3J0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBCaW5kaW5nIGZyb20gUG9ydCAgMS0yLTEKLQotICAgIGlmIChwb3J0ID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGV4cGVjdGVkIGEgUG9ydCB2YWx1ZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhpcy5iaW5kaW5ncyA9IG5ldyBCaW5kaW5nW10geyBwb3J0LmdldEJpbmRpbmcoKX07Ci0gICAgICBpZiAodGhpcy5iaW5kaW5nc1swXSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvKiBBc3NpZ24gdGhlIGNoaWxkIGdyb3VwIGFuZCBwcm9jZXNzIHRoZSBncmFuZGNoaWxkcmVuIGlmIGFueS4KLSAgICAgICAgKiBOdWxsIGFyZ3VtZW50IHZhbHVlIHBhc3NlZCBpbnRvIHRoZSBmb2xsb3dpbmcgbWV0aG9kIHdvdWxkIAotICAgICAgICAqIHN1Z2dlc3QgYSBXU0RMIGRlZmluaXRpb24gaW5jb25zaXN0ZW5jeQotICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcGlja2VkIHVwIGR1cmluZyBEZXNjcmlwdGlvbiBBcnRpZmFjdCBUQSB0ZXN0aW5nLgotICAgICAgICAqLwotICAgICAgICBkZXNjZW5kZW50cyh0aGlzLmJpbmRpbmdzWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGVzY2VuZGFudCBtZXRob2QgZm9yIGNvbXBsZXRpbmcgY2FuZGlkYXRlIHNlcnZpY2UgY29udGV4dCBjcmVhdGlvbi4KLSAgICogQHBhcmFtIGJpbmRpbmcgIGEgQmluZGluZyBvYmplY3QKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgYmluZGluZyBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGVzY2VuZGVudHMoQmluZGluZyBiaW5kaW5nKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBwb3J0VHlwZSBmcm9tIEJpbmRpbmcgMS0yLTEKLQotICAgIGlmIChiaW5kaW5nID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGV4cGVjdGVkIGEgQmluZGluZyB2YWx1ZSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhpcy5wb3J0VHlwZXMgPSBuZXcgUG9ydFR5cGVbXSB7IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKX07Ci0gICAgICBpZiAodGhpcy5wb3J0VHlwZXNbMF0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLyogQXNzaWduIHRoZSBjaGlsZCBncm91cCBhbmQgcHJvY2VzcyB0aGUgZ3JhbmRjaGlsZHJlbiBpZiBhbnkuCi0gICAgICAgIAkqIE51bGwgYXJndW1lbnQgdmFsdWUgcGFzc2VkIGludG8gdGhlIGZvbGxvd2luZyBtZXRob2Qgd291bGQgCi0gICAgICAgIAkqIHN1Z2dlc3QgYSBXU0RMIGRlZmluaXRpb24gaW5jb25zaXN0ZW5jeQotICAgICAgICAJKiB3aGljaCB3aWxsIGJlIHBpY2tlZCB1cCBkdXJpbmcgRGVzY3JpcHRpb24gQXJ0aWZhY3QgVEEgdGVzdGluZy4KLSAgICAgICAgCSovCi0gICAgICAgIGRlc2NlbmRlbnRzKHRoaXMucG9ydFR5cGVzWzBdKTsKLQotICAgICAgICAvLyBHZXQgYW55IG1lc3NhZ2VzIHRoYXQgYXJlIHJlZmVyZW5jZWQgZnJvbSBoZWFkZXJzIGFuZCBoZWFkZXJmYXVsdHMKLQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0KLSAgICAgICAgLy8gR2V0IHJlZmVyZW5jZSB0byBkZWZpbml0aW9uCi0gICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zWzBdOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGFyZSBtZXNzYWdlcyBhbHJlYWR5LCB0aGVuIGdldCB0aGVtIGFzIGEgY29sbGVjdGlvbgotICAgICAgICBIYXNoU2V0IG1lc3NhZ2VTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBpZiAobWVzc2FnZXMgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZVNldC5hZGQobWVzc2FnZXNbaV0pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldCB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBvbmx5IGJ5IGEgYmluZGluZyAKLSAgICAgICAgSGFzaFNldCBiaW5kaW5nTWVzc2FnZXMgPSBXU0RMVXRpbHMuZmluZE1lc3NhZ2VzKGRlZmluaXRpb24sIGJpbmRpbmcpOwotCi0gICAgICAgIC8vIEFkZCB0aGVzZSBtZXNzYWdlcyB0byB0aGUgY29tcGxldGUgbWVzc2FnZSBsaXN0ICAKLSAgICAgICAgbWVzc2FnZVNldC5hZGRBbGwoYmluZGluZ01lc3NhZ2VzKTsKLQotICAgICAgICAvLyBDcmVhdGUgYXJyYXkgZnJvbSBtZXNzYWdlIHNldAotICAgICAgICB0aGlzLm1lc3NhZ2VzID0KLSAgICAgICAgICAoTWVzc2FnZVtdKSBtZXNzYWdlU2V0LnRvQXJyYXkodGhpcy5tZXNzYWdlcyA9IG5ldyBNZXNzYWdlWzBdKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGVzY2VuZGFudCBtZXRob2QgZm9yIGNvbXBsZXRpbmcgY2FuZGlkYXRlIHNlcnZpY2UgY29udGV4dCBjcmVhdGlvbi4KLSAgICogQHBhcmFtIHBvcnRUeXBlICBhIFBvcnRUeXBlIG9iamVjdAotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwb3J0VHlwZSBpcyBudWxsLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZGVzY2VuZGVudHMoUG9ydFR5cGUgcG9ydFR5cGUpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIE9wZXJhdGlvbnMgZnJvbSBQb3J0VHlwZSAxLTItbgotCi0gICAgaWYgKHBvcnRUeXBlID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IGV4cGVjdGVkIGEgUG9ydFR5cGUgdmFsdWUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRoaXMub3BlcmF0aW9ucyA9Ci0gICAgICAgIChPcGVyYXRpb25bXSkgKHBvcnRUeXBlCi0gICAgICAgICAgLmdldE9wZXJhdGlvbnMoKQotICAgICAgICAgIC50b0FycmF5KHRoaXMub3BlcmF0aW9ucyA9IG5ldyBPcGVyYXRpb25bMF0pKTsKLSAgICAgIGlmICh0aGlzLm9wZXJhdGlvbnMubGVuZ3RoID4gMCkKLSAgICAgIHsKLSAgICAgICAgZGVzY2VuZGVudHModGhpcy5vcGVyYXRpb25zKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICAgKiBEZXNjZW5kYW50IG1ldGhvZCBmb3IgY29tcGxldGluZyBjYW5kaWRhdGUgc2VydmljZSBjb250ZXh0IGNyZWF0aW9uLgotICAgICAqIEBwYXJhbSBvcGVyYXRpb24gIGEgT3BlcmF0aW9uIG9iamVjdAotICAgICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG9wZXJhdGlvbiBpcyBudWxsLgotICAgICAqLwotICBwcm90ZWN0ZWQgdm9pZCBkZXNjZW5kZW50cyhPcGVyYXRpb24gb3BlcmF0aW9uKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBNZXNzYWdlcyBmcm9tIE9wZXJhdGlvbgotCi0gICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBleHBlY3RlZCBhbiBPcGVyYXRpb24gdmFsdWUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGRlc2NlbmRlbnRzKG5ldyBPcGVyYXRpb25bXSB7IG9wZXJhdGlvbiB9KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRGVzY2VuZGFudCBtZXRob2QgZm9yIGNvbXBsZXRpbmcgY2FuZGlkYXRlIHNlcnZpY2UgY29udGV4dCBjcmVhdGlvbi4KLSAgICogQHBhcmFtIG9wZXJhdGlvbnMgIGFuIGFycmF5IG9mIG9wZXJhdGlvbnMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG9wZXJhdGlvbnMgaXMgbnVsbC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGRlc2NlbmRlbnRzKE9wZXJhdGlvbltdIG9wZXJhdGlvbnMpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIE1lc3NhZ2VzIGZyb20gT3BlcmF0aW9ucyAxLTItbgotCi0gICAgaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogZXhwZWN0ZWQgYW4gT3BlcmF0aW9uW10gdmFsdWUiKTsKLSAgICB9Ci0KLSAgICBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChvcGVyYXRpb25zW2ldLmdldElucHV0KCkgIT0gbnVsbCkKLSAgICAgICAgc2V0LmFkZChvcGVyYXRpb25zW2ldLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpKTsgLy8xLTItMQotICAgICAgaWYgKG9wZXJhdGlvbnNbaV0uZ2V0T3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgc2V0LmFkZChvcGVyYXRpb25zW2ldLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKSk7IC8vMS0yLTEKLQotICAgICAgLy8gZ2V0IG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCBmYXVsdHMgZm9yIHRoaXMgb3BlcmF0aW9uIAotICAgICAgLy8gMS0yLW4KLSAgICAgIEl0ZXJhdG9yIGl0ID0gb3BlcmF0aW9uc1tpXS5nZXRGYXVsdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgc2V0LmFkZCgoKEZhdWx0KSBpdC5uZXh0KCkpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHRoaXMubWVzc2FnZXMgPSAoTWVzc2FnZVtdKSBzZXQudG9BcnJheSh0aGlzLm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VbMF0pOwotICAgIC8vIG5vIGRlc2NlbmRlbnRzIG9mIG1lc3NhZ2VzIHNvIHN0b3AuCi0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZSBhIHJlY3Vyc2l2ZSBub24tcmVwZWF0aW5nIGxpc3Qgb2YgaW1wb3J0cyBmb3IgdGhlIHNwZWNpZmllZAotICAgKiBXU0RMIGRvY3VtZW50IGRlZmluaXRpb24uCi0gICAqLwotICAvKiAgIHByaXZhdGUgSGFzaFNldCBnZXRBbGxJbXBvcnRzKERlZmluaXRpb24gcm9vdERlZikgdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0gICAgIAkKLSAgICAgCUhhc2hTZXQgaW1wb3J0U2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgCQotICAgICAJQ29sbGVjdGlvbiBpbXBvcnRMaXN0ID0gIHJvb3REZWYuZ2V0SW1wb3J0cygpLnZhbHVlcygpOwotICAgICAJSXRlcmF0b3IgaSA9IGltcG9ydExpc3QuaXRlcmF0b3IoKTsKLSAgICAgCQotICAgICAJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgIAkJSW1wb3J0IG5leHRJbXBvcnQgPSAoSW1wb3J0KShpLm5leHQoKSk7Ci0gICAgIAkJaWYgKG5leHRJbXBvcnQgIT0gbnVsbCkgewotICAgICAJCQkvLyBpdHMgYSB3c2RsIGRvY3VtZW50Ci0gICAgIAkJCWltcG9ydFNldC5hZGRBbGwoZ2V0QWxsSW1wb3J0cyhuZXh0SW1wb3J0LmdldERlZmluaXRpb24oKSkpOwotICAgICAJCX0gICAJCQkKLSAgICAgCX0KLSAgICAgCQotICAgICAJcmV0dXJuIChpbXBvcnRTZXQpOwotICAgICB9Ci0gICAqLwotICBwcml2YXRlIEhhc2hTZXQgZ2V0QWxsSW1wb3J0cyhEZWZpbml0aW9uIHJvb3REZWYpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgSGFzaFNldCBpbXBvcnRTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgTWFwIGltcG9ydE1hcCA9IHJvb3REZWYuZ2V0SW1wb3J0cygpOwotICAgIEl0ZXJhdG9yIGkgPSBpbXBvcnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBMaXN0IG5leHRJbXBvcnRMaXN0ID0gKExpc3QpIChpLm5leHQoKSk7Ci0gICAgICBJdGVyYXRvciBsaXN0SXQgPSBuZXh0SW1wb3J0TGlzdC5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGxpc3RJdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEltcG9ydCBuZXh0SW1wb3J0ID0gKEltcG9ydCkgbGlzdEl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG5leHRJbXBvcnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIGl0cyBhIHdzZGwgZG9jdW1lbnQKLSAgICAgICAgICBpbXBvcnRTZXQuYWRkKG5leHRJbXBvcnQpOwotICAgICAgICAgIGlmIChuZXh0SW1wb3J0LmdldERlZmluaXRpb24oKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEhhc2hTZXQgc3ViVHJlZUltcG9ydHMgPSBnZXRBbGxJbXBvcnRzKG5leHRJbXBvcnQuZ2V0RGVmaW5pdGlvbigpKTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIHN1Ykl0ID0gc3ViVHJlZUltcG9ydHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChzdWJJdC5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGltcG9ydFNldC5hZGQoKEltcG9ydCkgKHN1Ykl0Lm5leHQoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAoaW1wb3J0U2V0KTsKLSAgfQotCi0gIC8qKgotICAgKiBnZXQgYWxsIHNlcnZpY2UgbG9jYXRpb24gZW5kcG9pbnQgdmFsdWVzCi0gICAqIHJlbGV2YW50IHRvIHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QuCi0gICAqIAotICAgKiBJZiB0aGUgc2VydmljZSBsb2NhdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZyB3ZSB1c2UKLSAgICoganVzdCB0aGF0LgotICAgKiBPdGhlcndpc2UsIGlmIHRoZSBwb3J0IGlzIHNwZWNpZmllZCwgd2UgZ2V0IGFsbCBlbmRwb2ludHMKLSAgICogYXNzb2NpYXRlZCB3aXRoIHRoYXQgcG9ydC4KLSAgICogSWYgd2UgaGF2ZSBuZWl0aGVyIHRoZSBzZXJ2aWNlIGxvY2F0aW9uIHZhbHVlIG9yIHRoZSBwb3J0LAotICAgKiB0aGVuIGFsbCBlbmRwb2ludHMgaW4gdGhlIGRlZmluaXRpb24gYXJlIHVzZWQuCi0gICAqLwotICBwcml2YXRlIFVSSVtdIGRlcml2ZUVuZHBvaW50cygKLSAgLy9BbmFseXplckNvbmZpZyBhbmFseXplckNvbmZpZywgCi0gIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSwgUG9ydFtdIHBvcnRzLCBEZWZpbml0aW9uW10gZGVmaW5pdGlvbnMpCi0gIHsKLQotICAgIFVSSVtdIGVuZHAgPSBudWxsOwotICAgIC8vUG9ydCBwb3J0ID0gbnVsbDsJCi0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIHNlcnZpY2VMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAvLyB0cnkgc2VydmljZSBsb2NhdGlvbi4uLgotICAgICAgLy9pZiAoKHNlcnZpY2VMb2NhdGlvbiA9IGFuYWx5emVyQ29uZmlnLmdldFNlcnZpY2VMb2NhdGlvbigpKSAhPSBudWxsKSB7ICAgICAgCi0gICAgICBpZiAoKHNlcnZpY2VMb2NhdGlvbiA9IHNlcnZpY2VSZWZlcmVuY2UuZ2V0U2VydmljZUxvY2F0aW9uKCkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGVuZHAgPSBuZXcgVVJJW10geyBuZXcgVVJJKHNlcnZpY2VMb2NhdGlvbil9OwotICAgICAgfQotICAgICAgLy9lbHNlIGlmIChhbmFseXplckNvbmZpZy5nZXRXU0RMRWxlbWVudCgpLmlzUG9ydCgpKSB7Ci0gICAgICBlbHNlIGlmIChzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuaXNQb3J0KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChwb3J0cy5sZW5ndGggIT0gMSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkludGVybmFsIGVycm9yIC0gZXhwZWN0ZWQgMS1lbGVtZW50IFBvcnQgYXJyYXkiKTsKLSAgICAgICAgfQotICAgICAgICAvL2Vsc2UgewotICAgICAgICAvLwlwb3J0ID0gcG9ydHNbMF07IC8vIGlmIFBvcnQgd2FzIGdpdmVuIGluIGNvbmZpZywgdGhlcmUgaXMganVzdCBvbmUKLSAgICAgICAgLy99Ci0gICAgICAgIC8vUU5hbWUgc29hcEFkZHJlc3MgPSBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVAsICJhZGRyZXNzIik7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBwb3J0c1swXS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkgJiYgc2VydmljZUxvY2F0aW9uID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAoZXh0RWxlbSBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vaWYgKGV4dEVsLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKHNvYXBBZGRyZXNzKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGVsZW1lbnQgaXMgb3VyIFNPQVBBZGRyZXNzIC0gZ2V0IHRoZSBsb2NhdGlvbgotICAgICAgICAgICAgc2VydmljZUxvY2F0aW9uID0gKChTT0FQQWRkcmVzcykgZXh0RWxlbSkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgICAgIGVuZHAgPSBuZXcgVVJJW10geyBuZXcgVVJJKHNlcnZpY2VMb2NhdGlvbil9OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAvLyBubyBwb3J0IGluZm8gZnJvbSBjb25maWcsIHNvIHN1cHBseSBhbGwgaW4gZG9jdW1lbnQKLSAgICAgICAgLy8gUU5hbWUgc29hcEFkZHJlc3MgPSBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMX1NPQVAsICJhZGRyZXNzIik7Ci0gICAgICAgIEhhc2hTZXQgZW5kcG9pbnRTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICBJdGVyYXRvciBpID0gZGVmaW5pdGlvbnNbMF0uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGV4dEVsZW0gaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL2lmIChleHRFbC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhzb2FwQWRkcmVzcykgewotICAgICAgICAgICAgLy8gdGhpcyBlbGVtZW50IGlzIG91ciBTT0FQQWRkcmVzcyAtIGdldCB0aGUgbG9jYXRpb24KLSAgICAgICAgICAgIGVuZHBvaW50U2V0LmFkZCgoKFNPQVBBZGRyZXNzKSBleHRFbGVtKS5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ29udmVydCB0aGUgZGVyaXZlZCBMaXN0IHRvIGEgVVJJIGFycmF5Ci0gICAgICAgIGVuZHAgPSAoVVJJW10pIGVuZHBvaW50U2V0LnRvQXJyYXkoZW5kcCA9IG5ldyBVUklbMF0pOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICByZXR1cm4gZW5kcDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nLgotICAgKiBAcmV0dXJuIEJpbmRpbmcKLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nW10gZ2V0QmluZGluZ3MoKQotICB7Ci0gICAgcmV0dXJuIGJpbmRpbmdzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVuZFBvaW50cy4KLSAgICogQHJldHVybiBVUklbXQotICAgKi8KLSAgcHVibGljIFVSSVtdIGdldEVuZFBvaW50cygpCi0gIHsKLSAgICAvLyBnZXQgbGlzdCBvZiBtYXRjaGluZyBlbmRwb2ludChzKSBhc3NvY2lhdGVkIHdpdGggc2VydmljZS4KLSAgICByZXR1cm4gZW5kUG9pbnRzOwotICB9Ci0KLSAgLyoqCi0gICogUmV0dXJucyB0aGUgZW5kUG9pbnRzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4KLSAgKiBAcGFyYW0gaG9zdEFuZFBvcnQgIGhvc3QgYW5kIHBvcnQgbG9jYXRpb24uCi0gICogQHJldHVybiBVUklbXSBpZiBtYXRjaGVkLCBudWxsIG90aGVyd2lzZS4KLSAgKi8KLSAgcHVibGljIFVSSVtdIGdldEVuZFBvaW50cyhTdHJpbmcgaG9zdEFuZFBvcnQpCi0gIHsKLSAgICAvLyBnZXQgbGlzdCBvZiBtYXRjaGluZyBlbmRwb2ludHMgYXNzb2NpYXRlZCB3aXRoIHNlcnZpY2UsCi0gICAgLy8gaGF2aW5nIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydCBjb25maWd1cmF0aW9uCi0gICAgU3RyaW5nIHBvcnQ7Ci0KLSAgICBWZWN0b3IgbWF0Y2hlZEVuZHBvaW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZFBvaW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAvLyBQQjogSWYgdGhlIGVuZHBvaW50IGRvZXMgbm90IGNvbnRhaW4gYSBwb3J0IG51bWJlciwgdGhlbiBkZWZhdWx0IGl0IHRvICI4MCIKLSAgICAgIHBvcnQgPQotICAgICAgICAoZW5kUG9pbnRzW2ldLmdldFBvcnQoKSA9PSAtMSkKLSAgICAgICAgICA/ICI4MCIKLSAgICAgICAgICA6IFN0cmluZy52YWx1ZU9mKGVuZFBvaW50c1tpXS5nZXRQb3J0KCkpOwotICAgICAgaWYgKGhvc3RBbmRQb3J0LmVxdWFscyhlbmRQb2ludHNbaV0uZ2V0SG9zdCgpICsgIjoiICsgcG9ydCkpCi0gICAgICB7Ci0gICAgICAgIG1hdGNoZWRFbmRwb2ludHMuYWRkKGVuZFBvaW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoVVJJW10pIG1hdGNoZWRFbmRwb2ludHMudG9BcnJheShuZXcgVVJJWzBdKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gT3BlcmF0aW9uCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uW10gZ2V0T3BlcmF0aW9ucygpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwb3J0VHlwZS4KLSAgICogQHJldHVybiBQb3J0VHlwZQotICAgKi8KLSAgcHVibGljIFBvcnRUeXBlW10gZ2V0UG9ydFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHBvcnRUeXBlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGhvc3RBbmRQb3J0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIGNvbnRleHQgZW5kcG9pbnQuCi0gICAqIEBwYXJhbSBob3N0QW5kUG9ydFN0cmluZyBhIGhvc3QgYW5kIHBvcnQgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaG9zdEFuZFBvcnQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgY29udGV4dCBlbmRwb2ludC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgZ2l2ZW4gaG9zdGFuZFBvcnQgU3RyaW5nIGRvZXMgbm90IGNvbnZlcnQgdG8gVVJJLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzSG9zdEFuZFBvcnQoU3RyaW5nIGhvc3RBbmRQb3J0U3RyaW5nKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBVUkkgaG9zdEFuZFBvcnQ7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaG9zdEFuZFBvcnQgPSBuZXcgVVJJKGhvc3RBbmRQb3J0U3RyaW5nKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICJDb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gVVJJOiAiICsgaG9zdEFuZFBvcnRTdHJpbmcpOwotICAgIH0KLSAgICBTdHJpbmcgaG9zdCA9IGhvc3RBbmRQb3J0LmdldEhvc3QoKTsKLSAgICBpbnQgcG9ydCA9IGhvc3RBbmRQb3J0LmdldFBvcnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZW5kUG9pbnRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh0aGlzLmVuZFBvaW50c1tpXS5nZXRIb3N0KCkuZXF1YWxzKGhvc3QpCi0gICAgICAgICYmIHRoaXMuZW5kUG9pbnRzW2ldLmdldFBvcnQoKSA9PSBwb3J0KQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOyAvLyBmb3Igbm93Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVmaW5pdGlvbnMuCi0gICAqIEByZXR1cm4gRGVmaW5pdGlvbltdCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbltdIGdldERlZmluaXRpb25zKCkKLSAgewotICAgIHJldHVybiBkZWZpbml0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbXBvcnRzLgotICAgKiBAcmV0dXJuIEltcG9ydFtdCi0gICAqLwotICBwdWJsaWMgSW1wb3J0W10gZ2V0SW1wb3J0cygpCi0gIHsKLSAgICByZXR1cm4gaW1wb3J0czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlcy4KLSAgICogQHJldHVybiBNZXNzYWdlW10KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlW10gZ2V0TWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBvcnRzLgotICAgKiBAcmV0dXJuIFBvcnRbXQotICAgKi8KLSAgcHVibGljIFBvcnRbXSBnZXRQb3J0cygpCi0gIHsKLSAgICByZXR1cm4gcG9ydHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9ydFR5cGVzLgotICAgKiBAcmV0dXJuIFBvcnRUeXBlW10KLSAgICovCi0gIHB1YmxpYyBQb3J0VHlwZVtdIGdldFBvcnRUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gcG9ydFR5cGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHR5cGVzLgotICAgKiBAcmV0dXJuIFR5cGVzW10KLSAgICovCi0gIHB1YmxpYyBUeXBlc1tdIGdldFR5cGVzKCkKLSAgewotICAgIHJldHVybiB0eXBlczsKLSAgfQotICAvKioKLSAgICogUmV0dXJucyB0aGUgd3NkbERvY3VtZW50LgotICAgKiBAcmV0dXJuIFdTRExEb2N1bWVudAotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudCBnZXRXc2RsRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGRlZmluaXRpb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSB0eXBlcyBlbGVtZW50LgotICAgKiBAcGFyYW0gdHlwZXMgYSBUeXBlcyBvYmplY3QuCi0gICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSB0eXBlcyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIERlZmluaXRpb24gZ2V0RGVmaW5pdGlvbihUeXBlcyB0eXBlcykKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgVHlwZXMgY2hlY2tUeXBlczsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoICYmIGRlZmluaXRpb24gPT0gbnVsbDsgaSsrKQotICAgIHsKLSAgICAgIGlmICgoKGNoZWNrVHlwZXMgPSBkZWZpbml0aW9uc1tpXS5nZXRUeXBlcygpKSAhPSBudWxsKQotICAgICAgICAmJiAoY2hlY2tUeXBlcy5lcXVhbHModHlwZXMpKSkKLSAgICAgIHsKLSAgICAgICAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zW2ldOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGJpbmRpbmcgZWxlbWVudC4KLSAgICogQHBhcmFtIGJpbmRpbmcgYSBCaW5kaW5nIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGJpbmRpbmcgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBEZWZpbml0aW9uIGdldERlZmluaXRpb24oQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoICYmIGRlZmluaXRpb24gPT0gbnVsbDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChkZWZpbml0aW9uc1tpXS5nZXRCaW5kaW5nKGJpbmRpbmcuZ2V0UU5hbWUoKSkgIT0gbnVsbCkKLSAgICAgICAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb25zW2ldOwotICAgIH0KLQotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBhIFBvcnRUeXBlIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHBvcnRUeXBlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5pdGlvbnMubGVuZ3RoICYmIGRlZmluaXRpb24gPT0gbnVsbDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChkZWZpbml0aW9uc1tpXS5nZXRQb3J0VHlwZShwb3J0VHlwZS5nZXRRTmFtZSgpKSAhPSBudWxsKQotICAgICAgICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbnNbaV07Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlZmluaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBkZWZpbml0aW9uIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2UgYSBNZXNzYWdlIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlZmluaXRpb25zLmxlbmd0aCAmJiBkZWZpbml0aW9uID09IG51bGw7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZGVmaW5pdGlvbnNbaV0uZ2V0TWVzc2FnZShtZXNzYWdlLmdldFFOYW1lKCkpICE9IG51bGwpCi0gICAgICAgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uc1tpXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvRW52aXJvbm1lbnRJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvRW52aXJvbm1lbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2ViNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL0Vudmlyb25tZW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuWE1MSW5mbzsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1haW50YWlucyB0aGUgRW52aXJvbm1lbnQgaW5mb3JtYXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudEluZm8gaW1wbGVtZW50cyBYTUxJbmZvCi17Ci0gIC8qKgotICAgKiBMb2cgdGltZXN0YW1wLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2dUaW1lc3RhbXAgPSBudWxsOwotCi0gIC8qKgotICAgKiBNb25pdG9yIGNvbmZpZyBjb21tZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBtb25pdG9yQ29uZmlnQ29tbWVudCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBvYmplY3QuCi0gICAqIEBwYXJhbSBsb2dUaW1lc3RhbXAgdGhlIGxvZyB0aW1lc3RhbXAuCi0gICAqIEBwYXJhbSBtb25pdG9yQ29uZmlnQ29tbWVudCB0aGUgTW9uaXRvciBjb25maWcgY29tbWVudC4KLSAgICovCi0gIHB1YmxpYyBFbnZpcm9ubWVudEluZm8oU3RyaW5nIGxvZ1RpbWVzdGFtcCwgU3RyaW5nIG1vbml0b3JDb25maWdDb21tZW50KQotICB7Ci0gICAgdGhpcy5sb2dUaW1lc3RhbXAgPSBsb2dUaW1lc3RhbXA7Ci0gICAgdGhpcy5tb25pdG9yQ29uZmlnQ29tbWVudCA9IG1vbml0b3JDb25maWdDb21tZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuWE1MSW5mbyN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICghbnNOYW1lLmVxdWFscygiIikpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gU3RhcnQgZWxlbWVudAotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0xPRyArICIgIik7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1RJTUVTVEFNUCArICI9XCIiICsgdGhpcy5sb2dUaW1lc3RhbXAgKyAiXCIvPiIpOwotCi0gICAgcHcucHJpbnQoCi0gICAgICAiICAgICAgICA8IgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9MT0cKLSAgICAgICAgKyBXU0lDb25zdGFudHMuRUxFTV9DT01NRU5UCi0gICAgICAgICsgIj4iKTsKLSAgICBwdy5wcmludCh0aGlzLm1vbml0b3JDb25maWdDb21tZW50KTsKLSAgICBwdy5wcmludGxuKAotICAgICAgIiAgICAgICAgPC8iCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX0xPRwotICAgICAgICArIFdTSUNvbnN0YW50cy5FTEVNX0NPTU1FTlQKLSAgICAgICAgKyAiPiIpOwotCi0gICAgLy8gRW5kIGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTE9HICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9TZXJ2aWNlUmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvU2VydmljZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzNlNDg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9TZXJ2aWNlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIG5lZWRlZCB0byBwcm9jZXNzIGRlc2NyaXB0aW9uIHRlc3QgYXNzZXJ0aW9ucy4gIFRoZSBpbmZyb21hdGlvbgotICogaW4gdGhpcyBvYmplY3Qgd2lsbCBiZSBkZXJpdmVkIGZyb20gYW5hbHl6ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiwgVURESSBlbnRyaWVzLCBvciB0aGUgV1NETCBwb3J0IGVsZW1lbnQuIAotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZmVyZW5jZQotewotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbExvY2F0aW9uOwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VMb2NhdGlvbjsKLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZpY2UgcmVmZXJlbmNlIHdpdGhvdXQgcmVmZXJlbmNlcy4gIEFsbCBvZiB0aGVtIHdpbGwgYmUgc2V0IGxhdGVyIGFzIHRlc3QgYXNzZXJ0aW9ucyBhcmUgCi0gICAqIGJlaW5nIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBzZXJ2aWNlIHJlZmVyZW5jZSBmcm9tIGVudHJpZXMgc3BlY2lmaWVkIGluIHRoZSBhbmFseXplciBjb25maWcgZmlsZS4gIFRoaXMgaW5mb3JtYXRpb24gbWF5IGluY2x1ZGUKLSAgICogdGhlIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIHRoZSB3c2RsRWxlbWVudCwgd3NkbFVSSSBhbmQgc2VydmljZUxvY2F0aW9uIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gYW5hbHl6ZXJDb25maWcgYW4gQW5hbHl6ZXJDb25maWcgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFNlcnZpY2VSZWZlcmVuY2UoQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWcpCi0gIHsKLSAgICB0aGlzLndzZGxFbGVtZW50ID0gYW5hbHl6ZXJDb25maWcuZ2V0V1NETEVsZW1lbnQoKTsKLSAgICB0aGlzLndzZGxMb2NhdGlvbiA9IGFuYWx5emVyQ29uZmlnLmdldFdTRExMb2NhdGlvbigpOwotICAgIHRoaXMuc2VydmljZUxvY2F0aW9uID0gYW5hbHl6ZXJDb25maWcuZ2V0U2VydmljZUxvY2F0aW9uKCk7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFdTREwgZWxlbWVudCB3aGVyZSBhbmFseXNpcyBzaG91bGQgYmVnaW4uCi0gICAqIEByZXR1cm4gaGUgV1NETCBlbGVtZW50IHdoZXJlIGFuYWx5c2lzIHNob3VsZCBiZWdpbi4KLSAgICogQHNlZSAjc2V0V1NETEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy53c2RsRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIFdTREwgZWxlbWVudCB3aGVyZSBhbmFseXNpcyBzaG91bGQgYmVnaW4uCi0gICAqIEBwYXJhbSB3c2RsRWxlbWVudCB0aGUgV1NETCBlbGVtZW50IHdoZXJlIGFuYWx5c2lzIHNob3VsZCBiZWdpbi4KLSAgICogQHNlZSAjZ2V0V1NETEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdTRExFbGVtZW50KFdTRExFbGVtZW50IHdzZGxFbGVtZW50KQotICB7Ci0gICAgdGhpcy53c2RsRWxlbWVudCA9IHdzZGxFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBzZWUgI3NldFdTRExMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMud3NkbExvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldFdTRExMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgV2ViIHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gV2ViIHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEBzZWUgI3NldFNlcnZpY2VMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2VydmljZUxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBXZWIgc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHBhcmFtIHNlcnZpY2VMb2NhdGlvbiBlYiBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKiBAc2VlICNnZXRTZXJ2aWNlTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VMb2NhdGlvbihTdHJpbmcgc2VydmljZUxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlTG9jYXRpb24gPSBzZXJ2aWNlTG9jYXRpb247Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQW5hbHl6ZXJDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQW5hbHl6ZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhMjE5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL0FuYWx5emVyQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5XU0lEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBhbmFsenllciBjb25maWd1cmF0aW9uIGZpbGUuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBBbmFseXplckNvbmZpZyBleHRlbmRzIFdTSURvY3VtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9DT05GSUc7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FOQUxZWkVSX0NPTkZJRywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogQ29ycmVsYXRpb24gdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JSRUxBVElPTl9UWVBFX09QRVJBVElPTiA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JSRUxBVElPTl9UWVBFX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JSRUxBVElPTl9UWVBFX0VORFBPSU5UID0gImVuZHBvaW50IjsKLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhbmFseXplciBjb25maWcuCi0gICAqIEBwYXJhbSBtZXNzYWdlTGlzdCBhIE1lc3NhZ2VMaXN0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QpOwotCi0gIC8qKgotICAgKiBHZXQgb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gICAqIEBzZWUgI3NldERlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uICBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICogQHNlZSAjZ2V0RGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbik7Ci0KLSAgLyoqCi0gICAqIEdldCB2ZXJib3NlIG9wdGlvbi4KLSAgICogQHJldHVybiB0cnVlIGlmIHZlcmJvc2UuCi0gICAqIEBzZWUgI3NldFZlcmJvc2VPcHRpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFZlcmJvc2VPcHRpb24oKTsKLQotICAvKioKLSAgICogU2V0IHZlcmJvc2Ugb3B0aW9uLgotICAgKiBAcGFyYW0gdmVyYm9zZSB2ZXJib3NlIG9wdGlvbi4KLSAgICogQHNlZSAjZ2V0VmVyYm9zZU9wdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmVyYm9zZU9wdGlvbihib29sZWFuIHZlcmJvc2UpOwotCi0gIC8qKgotICAgKiBHZXQgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKiBAcmV0dXJuIGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICogQHNlZSAjc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdHNPcHRpb24gZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbiAgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKiBAc2VlICNnZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKEFzc2VydGlvblJlc3VsdHNPcHRpb24gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbik7Ci0KLSAgLyoqCi0gICAqIEdldCByZXBsYWNlIHJlcG9ydCBmaWxlIG9wdGlvbi4KLSAgICogQHJldHVybiByZXBsYWNlIHJlcG9ydCBmaWxlIG9wdGlvbi4KLSAgICogQHNlZSAjc2V0UmVwbGFjZVJlcG9ydAotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0UmVwbGFjZVJlcG9ydCgpOwotCi0gIC8qKgotICAgKiBTZXQgcmVwbGFjZSByZXBvcnQgZmlsZSBvcHRpb24uCi0gICAqIEBwYXJhbSByZXBsYWNlUmVwb3J0ICBlcGxhY2UgcmVwb3J0IGZpbGUgb3B0aW9uLgotICAgKiBAc2VlICNnZXRSZXBsYWNlUmVwb3J0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlUmVwb3J0KGJvb2xlYW4gcmVwbGFjZVJlcG9ydCk7Ci0KLSAgLyoqCi0gICAqIEdldCByZXBvcnQgZmlsZSBsb2NhdGlvbi4KLSAgICogQHJldHVybiByZXBvcnQgZmlsZSBsb2NhdGlvbi4KLSAgICogQHNlZSAjc2V0UmVwb3J0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3J0TG9jYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0IHJlcGxhY2UgcmVwb3J0IGZpbGUgb3B0aW9uLgotICAgKiBAcGFyYW0gcmVwb3J0VVJJIHJlcG9ydCBsb2NhdGlvbi4KLSAgICogQHNlZSAjZ2V0UmVwb3J0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcG9ydExvY2F0aW9uKFN0cmluZyByZXBvcnRVUkkpOwotCi0gIC8qKgotICAgKiBHZXQgc3R5bGUgc2hlZXQuCi0gICAqIEByZXR1cm4gc3R5bGUgc2hlZXQuCi0gICAqIEBzZWUgI3NldEFkZFN0eWxlU2hlZXQKLSAgICovCi0gIHB1YmxpYyBBZGRTdHlsZVNoZWV0IGdldEFkZFN0eWxlU2hlZXQoKTsKLQotICAvKioKLSAgICogU2V0IHN0eWxlIHNoZWV0LgotICAgKiBAcGFyYW0gYWRkU3R5bGVTaGVldCBhIHN0eWxlIHNoZWV0LgotICAgKiBAc2VlICNnZXRBZGRTdHlsZVNoZWV0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBZGRTdHlsZVNoZWV0KEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldCk7Ci0KLSAgLyoqCi0gICAqIEdldCBwcm9maWxlIHRlc3QgYXNzZXJ0aW9ucyBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHJldHVybiByb2ZpbGUgdGVzdCBhc3NlcnRpb25zIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBwcm9maWxlIHRlc3QgYXNzZXJ0aW9ucyBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIHRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkkgcHJvZmlsZSB0ZXN0IGFzc2VydGlvbnMgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKFN0cmluZyB0ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJKTsKLQotICAvKioKLSAgICogR2V0IG1lc2FnZSBsb2cgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gbWVzYWdlIGxvZyBsb2NhdGlvbi4KLSAgICogQHNlZSAjc2V0TG9nTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9nTG9jYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0IG1lc3NhZ2UgbG9nIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gbG9nVVJJIG1lc3NhZ2UgbG9nIGxvY2F0aW9uLgotICAgKiBAc2VlICNnZXRMb2dMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nTG9jYXRpb24oU3RyaW5nIGxvZ1VSSSk7Ci0KLSAgLyoqCi0gICAqIElzIG1lc3NhZ2UgbG9nIGxvY2F0aW9uIHNwZWNpZmllZC4KLSAgICogQHJldHVybiB0cnVlIGlmIG1lc3NhZ2UgbG9nIGxvY2F0aW9uIGlzIHNldC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTG9nU2V0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCBjb3JyZWxhdGlvbiB0eXBlLgotICAgKiBAcmV0dXJuIGNvcnJlbGF0aW9uIHR5cGUuCi0gICAqIEBzZWUgI3NldENvcnJlbGF0aW9uVHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb3JyZWxhdGlvblR5cGUoKTsKLQotICAvKioKLSAgICogU2V0IGNvcnJlbGF0aW9uIHR5cGUuCi0gICAqIEBwYXJhbSBjb3JyZWxhdGlvblR5cGUgY29ycmVsYXRpb24gdHlwZS4KLSAgICogQHNlZSAjZ2V0Q29ycmVsYXRpb25UeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb3JyZWxhdGlvblR5cGUoU3RyaW5nIGNvcnJlbGF0aW9uVHlwZSk7Ci0KLSAgLyoqCi0gICAqIElzIFdTREwgcmVmZXJlbmNlIHNldC4KLSAgICogQHJldHVybiB0cnVlIGlmIFdTREwgcmVmZXJlbmNlIGlzIHNldC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETFJlZmVyZW5jZVNldCgpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCByZWZlcmVuY2UuCi0gICAqIEByZXR1cm4gV1NETCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldFdTRExSZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyBXU0RMUmVmZXJlbmNlIGdldFdTRExSZWZlcmVuY2UoKTsKLQotICAvKioKLSAgICogU2V0IFdTREwgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gd3NkbFJlZmVyZW5jZSBXU0RMIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0V1NETFJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETFJlZmVyZW5jZShXU0RMUmVmZXJlbmNlIHdzZGxSZWZlcmVuY2UpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBlbGVtZW50LgotICAgKiBAcmV0dXJuIFdTREwgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHJldHVybiBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oKTsKLQotICAvKioKLSAgICogR2V0IHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gc2VydmljZSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUxvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIElzIFVEREkgcmVmZXJlbmNlIHNldC4KLSAgICogQHJldHVybiB0cnVlIGlmIFVEREkgcmVmZXJlbmNlIGlzIHNldC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVURESVJlZmVyZW5jZVNldCgpOwotCi0gIC8qKgotICAgKiBHZXQgVURESSByZWZlcmVuY2UuCi0gICAqIEByZXR1cm4gVURESSByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldFVERElSZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyBVRERJUmVmZXJlbmNlIGdldFVERElSZWZlcmVuY2UoKTsKLQotICAvKioKLSAgICogU2V0IFVEREkgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gdWRkaVJlZmVyZW5jZSBVRERJIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0VURESVJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VURESVJlZmVyZW5jZShVRERJUmVmZXJlbmNlIHVkZGlSZWZlcmVuY2UpOwotCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICogQHBhcmFtIGFyZ3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAqIEBwYXJhbSB2YWxpZGF0ZSBmbGFnIGZvciBjb21tYW5kIGxpbmUgdmFsaWRhdGlvbi4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlQXJncyhTdHJpbmdbXSBhcmdzLCBib29sZWFuIHZhbGlkYXRlKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKiBAcmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQW5hbHl6ZXJDb25maWdSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQW5hbHl6ZXJDb25maWdSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzNjRmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL0FuYWx5emVyQ29uZmlnUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLQotCi0vKioKLSAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIHRvIHJlYWQgdGhlIGFuYWx5emVyIGNvbmZpZyBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBBbmFseXplckNvbmZpZ1JlYWRlciBleHRlbmRzIERvY3VtZW50UmVhZGVyIHsKLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhbmFseXplciBjb25maWcgcmVhZGVyLgotICAgKiBAcGFyYW0gbWVzc2FnZUxpc3QgYSBNZXNzYWdlTGlzdCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KE1lc3NhZ2VMaXN0IG1lc3NhZ2VMaXN0KTsKLSAgCi0gIC8qKgotICAgKiBSZWFkIHRoZSBhbmFseXplciBjb25maWcgZmlsZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29uZmlnVVJJIHRoZSBhbmFseXplciBjb25maWcgZmlsZSBsb2NhdGlvbi4KLSAgICogQHJldHVybiB0aGUgQW5hbHl6ZXJDb25maWcgb2JqZWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gcmVhZCB0aGUgYW5hbHl6ZXIgY29uZmlnIGZpbGUuCi0gICAqLwotICBwdWJsaWMgQW5hbHl6ZXJDb25maWcgcmVhZEFuYWx5emVyQ29uZmlnKFN0cmluZyBhbmFseXplckNvbmZpZ1VSSSkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLSAgCi0gIC8qKgotICAgKiBSZWFkIHRoZSBhbmFseXplciBjb25maWcgZmlsZS4KLSAgICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0gICAqIEByZXR1cm4gdGhlIEFuYWx5emVyQ29uZmlnIG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIHBhcnNlIHRoZSBhbmFseXplciBjb25maWcgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbmZpZyByZWFkQW5hbHl6ZXJDb25maWcoUmVhZGVyIHJlYWRlcikgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLX0KLQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL0Fzc2VydGlvblJlc3VsdFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQXNzZXJ0aW9uUmVzdWx0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjBjOWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvQXNzZXJ0aW9uUmVzdWx0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0IGFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnRpb25SZXN1bHRUeXBlCi17Ci0gIC8qKgotICAgKiBUaGlzIHR5cGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyByZXN1bHRUeXBlID0gX0FMTDsKLQotICAvKioKLSAgICogU3RyaW5nIHZlcnNpb24gb2YgcmVzdWx0IHR5cGVzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9BTEwgPSAiYWxsIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9OT1RfSU5GTyA9ICJub3RJbmZvIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9PTkxZX0ZBSUxFRCA9ICJvbmx5RmFpbGVkIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9OT1RfUEFTU0VEID0gIm5vdFBhc3NlZCI7Ci0KLSAgLyoqCi0gICAqIFJlc3VsdCB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQXNzZXJ0aW9uUmVzdWx0VHlwZSBBTEwgPSBuZXcgQXNzZXJ0aW9uUmVzdWx0VHlwZShfQUxMKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBBc3NlcnRpb25SZXN1bHRUeXBlIE5PVF9JTkZPID0gbmV3IEFzc2VydGlvblJlc3VsdFR5cGUoX05PVF9JTkZPKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBBc3NlcnRpb25SZXN1bHRUeXBlIE9OTFlfRkFJTEVEID0KLSAgICBuZXcgQXNzZXJ0aW9uUmVzdWx0VHlwZShfT05MWV9GQUlMRUQpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFzc2VydGlvblJlc3VsdFR5cGUgTk9UX1BBU1NFRCA9Ci0gICAgbmV3IEFzc2VydGlvblJlc3VsdFR5cGUoX05PVF9QQVNTRUQpOwotCi0gIC8qKgotICAgKiBEbyBub3QgYWxsb3cgdGhpcyBvYmplY3QgdG8gYmUgY3JlYXRlZCB3aXRoIG51bGwgY29uc3RydWN0b3IuCi0gICAqLwotICBwcml2YXRlIEFzc2VydGlvblJlc3VsdFR5cGUoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHJlc3VsdCB0eXBlLgotICAgKiBAcGFyYW0gcmVzdWx0VHlwZSBhIHJlc3VsdCB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBBc3NlcnRpb25SZXN1bHRUeXBlKFN0cmluZyByZXN1bHRUeXBlKQotICB7Ci0gICAgdGhpcy5yZXN1bHRUeXBlID0gcmVzdWx0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyByZXN1bHQgdHlwZSBhbGwuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgYWxsLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBbGwoKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFR5cGUuZXF1YWxzKF9BTEwpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHJlc3VsdCB0eXBlIGZhaWxlZCBvbmx5LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdCB0eXBlIGlzIGZhaWxlZCBvbmx5LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGYWlsZWRPbmx5KCkKLSAgewotICAgIHJldHVybiByZXN1bHRUeXBlLmVxdWFscyhfT05MWV9GQUlMRUQpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHJlc3VsdCB0eXBlIG5vdCBwYXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgbm90IHBhc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTm90UGFzc2VkKCkKLSAgewotICAgIHJldHVybiByZXN1bHRUeXBlLmVxdWFscyhfTk9UX1BBU1NFRCk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgcmVzdWx0IHR5cGUgbm90IGluZm8uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgbm90IGluZm8uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc05vdEluZm8oKQotICB7Ci0gICAgcmV0dXJuIHJlc3VsdFR5cGUuZXF1YWxzKF9OT1RfSU5GTyk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHJlc3VsdCB0eXBlLgotICAgKiBAcmV0dXJuIHJlc3VsdCB0eXBlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiByZXN1bHRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBuZXcgYXNzZXJ0aW9uIHJlc3VsdCB0eXBlLgotICAgKiBAcGFyYW0gcmVzdWx0VHlwZSBhbiBhc3NlcnRpb24gcmVzdWx0IHR5cGUuCi0gICAqIEByZXR1cm4gbmV3IGFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgaW52YWxpZCBhc3NlcnRpb24gcmVzdWx0IHR5cGUgd2FzIHNwZWNpZmllZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQXNzZXJ0aW9uUmVzdWx0VHlwZSBuZXdJbnN0YW5jZShTdHJpbmcgcmVzdWx0VHlwZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBBc3NlcnRpb25SZXN1bHRUeXBlIGFzc2VydGlvblJlc3VsdFR5cGUgPSBudWxsOwotCi0gICAgaWYgKHJlc3VsdFR5cGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhc3NlcnRpb25SZXN1bHRUeXBlID0gTk9UX0lORk87Ci0gICAgfQotCi0gICAgZWxzZSBpZiAocmVzdWx0VHlwZS5lcXVhbHMoX0FMTCkpCi0gICAgewotICAgICAgYXNzZXJ0aW9uUmVzdWx0VHlwZSA9IEFMTDsKLSAgICB9Ci0KLSAgICBlbHNlIGlmIChyZXN1bHRUeXBlLmVxdWFscyhfT05MWV9GQUlMRUQpKQotICAgIHsKLSAgICAgIGFzc2VydGlvblJlc3VsdFR5cGUgPSBPTkxZX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICBlbHNlIGlmIChyZXN1bHRUeXBlLmVxdWFscyhfTk9UX1BBU1NFRCkpCi0gICAgewotICAgICAgYXNzZXJ0aW9uUmVzdWx0VHlwZSA9IE5PVF9QQVNTRUQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHJlc3VsdFR5cGUuZXF1YWxzKF9OT1RfSU5GTykpCi0gICAgewotICAgICAgYXNzZXJ0aW9uUmVzdWx0VHlwZSA9IE5PVF9JTkZPOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAiQW4gaW52YWxpZCBhc3NlcnRpb24gcmVzdWx0IHR5cGUgd2FzIHNwZWNpZmllZDogIiArIHJlc3VsdFR5cGUgKyAiLiIpOwotICAgIH0KLQotICAgIHJldHVybiBhc3NlcnRpb25SZXN1bHRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gcmVzdWx0VHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9Bc3NlcnRpb25SZXN1bHRzT3B0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL0Fzc2VydGlvblJlc3VsdHNPcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlZDU2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL0Fzc2VydGlvblJlc3VsdHNPcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBhIGRlZmluaXRpb24gb2YgdGhlIGFzc2VydGlvbiByZXN1bHRzIHRoYXQgCi0gKiBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4gIEl0IGFsc28gY29udGFpbnMgaW5mb3JtYXRpb24gCi0gKiB0aGF0IGluZGljYXRlcyB3aGljaCBtZXNzYWdlcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc2VydGlvblJlc3VsdHNPcHRpb24gZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24gcmVzdWx0IHR5cGUuCi0gICAqIEByZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdCB0eXBlLgotICAgKiBAc2VlICNzZXRBc3NlcnRpb25SZXN1bHRUeXBlCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0VHlwZSBnZXRBc3NlcnRpb25SZXN1bHRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBhc3NlcnRpb24gcmVzdWx0IHR5cGUuCi0gICAqIEBwYXJhbSByZXN1bHRUeXBlIGFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAgICogQHNlZSAjZ2V0QXNzZXJ0aW9uUmVzdWx0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uUmVzdWx0VHlwZShBc3NlcnRpb25SZXN1bHRUeXBlIHJlc3VsdFR5cGUpOwotCi0gIC8qKgotICAgKiBHZXQgc2hvdyBtZXNzYWdlIGVudHJ5IGluZGljYXRvci4KLSAgICogQHJldHVybiBzaG93IG1lc3NhZ2UgZW50cnkgaW5kaWNhdG9yLgotICAgKiBAc2VlICNzZXRTaG93TWVzc2FnZUVudHJ5Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93TWVzc2FnZUVudHJ5KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBzaG93IG1lc3NhZ2UgZW50cnkgaW5kaWN0b3IuCi0gICAqIEBwYXJhbSBzaG93TWVzc2FnZUVudHJ5IHNob3cgbWVzc2FnZSBlbnRyeSBpbmRpY3Rvci4KLSAgICogQHNlZSAjZ2V0U2hvd01lc3NhZ2VFbnRyeQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2hvd01lc3NhZ2VFbnRyeShib29sZWFuIHNob3dNZXNzYWdlRW50cnkpOwotCi0gIC8qKgotICAgKiBHZXQgc2hvdyBhc3NlcnRpb24gZGVzY3JpcHRpb24gaW5kaWNhdG9yLgotICAgKiBAcmV0dXJuIHNob3cgYXNzZXJ0aW9uIGRlc2NyaXB0aW9uIGluZGljYXRvci4KLSAgICogQHNlZSAjc2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgICogU2V0IHNob3cgYXNzZXJ0aW9uIGRlc2NyaXB0aW9uIGluZGljdG9yLgotICAgKiBAcGFyYW0gc2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uIHNob3cgYXNzZXJ0aW9uIGRlc2NyaXB0aW9uIGluZGljdG9yLgotICAgKiBAc2VlICNnZXRTaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dBc3NlcnRpb25EZXNjcmlwdGlvbihib29sZWFuIHNob3dBc3NlcnRpb25EZXNjcmlwdGlvbik7Ci0KLSAgLyoqCi0gICAqIEdldCBzaG93IGZhaWx1cmUgbWVzc2FnZSBpbmRpY2F0b3IuCi0gICAqIEByZXR1cm4gc2hvdyBmYWlsdXJlIG1lc3NhZ2UgaW5kaWNhdG9yLgotICAgKiBAc2VlICNzZXRTaG93RmFpbHVyZU1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dGYWlsdXJlTWVzc2FnZSgpOwotCi0gIC8qKgotICAgKiBTZXQgc2hvdyBmYWlsdXJlIG1lc3NhZ2UgaW5kaWNhdG9yLgotICAgKiBAcGFyYW0gc2hvd0ZhaWx1cmVNZXNzYWdlIHNob3cgZmFpbHVyZSBtZXNzYWdlIGluZGljYXRvci4KLSAgICogQHNlZSAjZ2V0U2hvd0ZhaWx1cmVNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93RmFpbHVyZU1lc3NhZ2UoYm9vbGVhbiBzaG93RmFpbHVyZU1lc3NhZ2UpOwotCi0gIC8qKgotICAgKiBHZXQgc2hvdyBlcnJvciBkZXRhaWwgaW5kaWNhdG9yLgotICAgKiBAcmV0dXJuIHNob3cgZXJyb3IgZGV0YWlsIGluZGljYXRvci4KLSAgICogQHNlZSAjc2V0U2hvd0ZhaWx1cmVEZXRhaWwKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dGYWlsdXJlRGV0YWlsKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBzaG93IGVycm9yIGRldGFpbCBpbmRpY2F0b3IuCi0gICAqIEBwYXJhbSBzaG93ZmFpbHVyZURldGFpbCBzaG93IGVycm9yIGRldGFpbCBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI2dldFNob3dGYWlsdXJlRGV0YWlsCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93RmFpbHVyZURldGFpbChib29sZWFuIHNob3dmYWlsdXJlRGV0YWlsKTsKLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL1VERElSZWZlcmVuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvVURESVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTNiY2QyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvVURESVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWc7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmVmZXJlbmNlIHRvIGEgZGlzY292ZXJ5IGFydGlmYWN0LiAgCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVURESVJlZmVyZW5jZSBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fVURESV9SRUZFUkVOQ0U7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FOQUxZWkVSX0NPTkZJRywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogVURESSBrZXkgdHlwZTogYmluZGluZ0tleS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfS0VZID0gImJpbmRpbmdLZXkiOwotCi0gIC8qKgotICAgKiBVRERJIGtleSB0eXBlOiB0TW9kZWxLZXkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUTU9ERUxfS0VZID0gInRNb2RlbEtleSI7Ci0KLSAgLyoqCi0gICAqIEdldCBVRERJICBrZXkgdHlwZS4KLSAgICogQHJldHVybiBVRERJICBrZXkgdHlwZS4KLSAgICogQHNlZSAjc2V0S2V5VHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRLZXlUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBVRERJIGtleSB0eXBlLgotICAgKiBAcGFyYW0ga2V5VHlwZSBVRERJIGtleSB0eXBlLgotICAgKiBAc2VlICNnZXRLZXlUeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRLZXlUeXBlKFN0cmluZyBrZXlUeXBlKTsKLQotICAvKioKLSAgICogR2V0IFVEREkga2V5LgotICAgKiBAcmV0dXJuIFVEREkga2V5LgotICAgKiBAc2VlICNzZXRLZXkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBVRERJIGtleS4KLSAgICogQHBhcmFtIGtleSBVRERJIGtleS4KLSAgICogQHNlZSAjZ2V0S2V5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSk7Ci0KLSAgLyoqCi0gICAqIEdldCBVRERJIGlucXVpcnkgVVJMLgotICAgKiBAcmV0dXJuIFVEREkgaW5xdWlyeSBVUkwuCi0gICAqIEBzZWUgI3NldElucXVpcnlVUkwKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5xdWlyeVVSTCgpOwotCi0gIC8qKgotICAgKiBTZXQgVURESSBpbnF1aXJ5VVJMLgotICAgKiBAcGFyYW0gaW5xdWlyeVVSTCBVRERJIGlucXVpcnlVUkwuCi0gICAqIEBzZWUgI2dldElucXVpcnlVUkwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBlbGVtZW50LgotICAgKiBAcmV0dXJuIFdTREwgZWxlbWVudC4KLSAgICogQHNlZSAjc2V0V1NETEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpOwotCi0gIC8qKgotICAgKiBTZXQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gd3NkbEVsZW1lbnQgV1NETCBlbGVtZW50LgotICAgKiBAc2VlICNnZXRXU0RMRWxlbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETEVsZW1lbnQoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBHZXQgc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHJldHVybiBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRTZXJ2aWNlTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUxvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gc2VydmljZUxvY2F0aW9uIHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldFNlcnZpY2VMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2VydmljZUxvY2F0aW9uKFN0cmluZyBzZXJ2aWNlTG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9XU0RMRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9XU0RMRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmUzM2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvV1NETEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgYmFzZSBpbnRlcmZhY2UgZm9yIFdTREwgZGVmaW5pdGlvbnMuIAotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdTRExFbGVtZW50IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9XU0RMX0VMRU1FTlQ7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FOQUxZWkVSX0NPTkZJRywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IFdTREwgZWxlbWVudCB0eXBlLgotICAgKiBAcmV0dXJuIFdTREwgZWxlbWVudCB0eXBlLgotICAgKiBAc2VlICNzZXRUeXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLQotICAvKioKLSAgICogU2V0IFdTREwgZWxlbWVudCB0eXBlLgotICAgKiBAcGFyYW0gdHlwZSBXU0RMIGVsZW1lbnQgdHlwZS4KLSAgICogQHNlZSAjZ2V0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGVsZW1lbnQgbmFtZXNwYWNlLgotICAgKiBAcmV0dXJuIFdTREwgZWxlbWVudCBuYW1lc3BhY2UuCi0gICAqIEBzZWUgI3NldE5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKTsKLQotICAvKioKLSAgICogU2V0IFdTREwgZWxlbWVudCBuYW1lc3BhY2UuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgV1NETCBlbGVtZW50IG5hbWVzcGFjZS4KLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGVsZW1lbnQgbmFtZS4KLSAgICogQHJldHVybiBXU0RMIGVsZW1lbnQgbmFtZS4KLSAgICogQHNlZSAjc2V0TmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIGVsZW1lbnQgbmFtZS4KLSAgICogQHBhcmFtIG5hbWUgV1NETCBlbGVtZW50IG5hbWUuCi0gICAqIEBzZWUgI2dldE5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBlbGVtZW50IHF1YWxpZmllZCBuYW1lLgotICAgKiBAcmV0dXJuIFdTREwgZWxlbWVudCBxdWFsaWZpZWQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBwYXJlbnQgZWxlbWVudCBuYW1lLgotICAgKiBAcmV0dXJuIFdTREwgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHNlZSAjc2V0UGFyZW50RWxlbWVudE5hbWUKLSAgICogCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudEVsZW1lbnROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBwYXJhbSBwYXJlbnRFbGVtZW50TmFtZSBXU0RMIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBzZWUgI2dldFBhcmVudEVsZW1lbnROYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50TmFtZShTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBwYXJlbnQgZWxlbWVudCBRTmFtZS4KLSAgICogQHJldHVybiBXU0RMIHBhcmVudCBlbGVtZW50IFFOYW1lLgotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFBhcmVudEVsZW1lbnRRTmFtZSgpOwotCi0gIC8qKgotICAgKiBJcyBwb3J0IGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBhIHBvcnQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1BvcnQoKTsKLQotICAvKioKLSAgICogSXMgYmluZGluZyBlbGVtZW50LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGxlbWVudCBpcyBhIGJpbmRpbmcuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0JpbmRpbmcoKTsKLQotICAvKioKLSAgICogSXMgcG9ydFR5cGUgZWxlbWVudC4KLSAgICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgaXMgYSBwb3J0IHR5cGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1BvcnRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIElzIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgYW4gb3BlcmF0aW9uLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPcGVyYXRpb24oKTsKLQotICAvKioKLSAgICogSXMgbWVzc2FnZSBlbGVtZW50LgotICAgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBpcyBhIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvV1NETFJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9XU0RMUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNTUwYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9XU0RMUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJlZmVyZW5jZSB0byBhIGRlc2NyaXB0aW9uIGFydGlmYWN0LiAgCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETFJlZmVyZW5jZSBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9SRUZFUkVOQ0U7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FOQUxZWkVSX0NPTkZJRywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IFdTREwgZWxlbWVudC4KLSAgICogQHJldHVybiBXU0RMIGVsZW1lbnQuCi0gICAqIEBzZWUgI3NldFdTRExFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgV1NETEVsZW1lbnQgZ2V0V1NETEVsZW1lbnQoKTsKLQotICAvKioKLSAgICogU2V0IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHdzZGxFbGVtZW50IFdTREwgZWxlbWVudC4KLSAgICogQHNlZSAjZ2V0V1NETEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdTRExFbGVtZW50KFdTRExFbGVtZW50IHdzZGxFbGVtZW50KTsKLQotICAvKioKLSAgICogR2V0IFdTREwgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gV1NETCBsb2NhdGlvbi4KLSAgICogQHNlZSAjc2V0V1NETExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgV1NETCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIHdzZGxMb2NhdGlvbiBXU0RMIGxvY2F0aW9uLgotICAgKiBAc2VlICNnZXRXU0RMTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdTRExMb2NhdGlvbihTdHJpbmcgd3NkbExvY2F0aW9uKTsKLQotICAvKioKLSAgICogR2V0IHNlcnZpY2UgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHNlZSAjc2V0U2VydmljZUxvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgc2VydmljZSBsb2NhdGlvbi4KLSAgICogQHBhcmFtIHNlcnZpY2VMb2NhdGlvbiBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKiBAc2VlICNnZXRTZXJ2aWNlTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VMb2NhdGlvbihTdHJpbmcgc2VydmljZUxvY2F0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9BbmFseXplckNvbmZpZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9BbmFseXplckNvbmZpZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVlZTc0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvQW5hbHl6ZXJDb25maWdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWdSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQXNzZXJ0aW9uUmVzdWx0c09wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLlVERElSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uaW1wbC5BZGRTdHlsZVNoZWV0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhbmFseXplciBjb25maWd1cmF0aW9uIGZpbGUgaW50ZXJmYWNlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBBbmFseXplckNvbmZpZ0ltcGwgaW1wbGVtZW50cyBBbmFseXplckNvbmZpZwotewotICAvKioKLSAgICogTWVzc2FnZSBsaXN0IHJlZmVyZW5jZS4KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEFuYWx5emVyIGNvbmZpZ3VyYXRpb24gZmlsZSBVUkkuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ1VSSSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFZlcmJvc2Ugb3B0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBBc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb25SZXN1bHRzT3B0aW9uID0KLSAgICBuZXcgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbkltcGwoKTsKLQotICAvKioKLSAgICogUmVwb3J0IGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXBvcnRVUkkgPSBXU0lDb25zdGFudHMuREVGQVVMVF9SRVBPUlRfVVJJOwotCi0gIC8qKgotICAgKiBSZXBsYWNlIHJlcG9ydCBpbmRpY2F0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXBsYWNlUmVwb3J0ID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIEFkZCBzdHlsZSBzaGVldC4KLSAgICovCi0gIHByb3RlY3RlZCBBZGRTdHlsZVNoZWV0IGFkZFN0eWxlU2hlZXQ7Ci0KLSAgLyoqCi0gICAqIFByb2ZpbGUgdGVzdCBhc3NlcnRpb25zIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB0ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJID0KLSAgICBXU0lDb25zdGFudHMuREVGQVVMVF9URVNUX0FTU0VSVElPTlNfRE9DVU1FTlRfVVJJOwotCi0gIC8qKgotICAgKiBNZXNzYWdlIGxvZyBsb2NhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9nVVJJID0gbnVsbDsKLQotICAvKioKLSAgICogTWVzc2FnZSBjb3JyZWxhdGlvbiB0eXBlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjb3JyZWxhdGlvblR5cGUgPQotICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfT1BFUkFUSU9OOwotCi0gIC8qKgotICAgKiBXU0RMIHJlZmVyZW5jZS4KLSAgICovCi0gIHByb3RlY3RlZCBXU0RMUmVmZXJlbmNlIHdzZGxSZWZlcmVuY2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBVRERJIHJlZmVyZW5jZS4KLSAgICovCi0gIHByb3RlY3RlZCBVRERJUmVmZXJlbmNlIHVkZGlSZWZlcmVuY2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIEFuYWx5emVyQ29uZmlnSW1wbCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciB3aXRoIGFsbCBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gdmVyYm9zZSAgICAgICAgICAgICAgICAgICAgdGhlIHZlcmJvc2Ugb3B0aW9uLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbiAgICAgYW4gYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKiBAcGFyYW0gcmVwb3J0VVJJICAgICAgICAgICAgICAgICAgcmVwb3J0IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gcmVwbGFjZVJlcG9ydCAgICAgICAgICAgICAgYSByZXBsYWNlIHJlcG9ydCBpbmRpY2F0b3IuCi0gICAqIEBwYXJhbSBhZGRTdHlsZVNoZWV0ICAgICAgICAgICAgICBhZGQgc3R5bGUgc2hlZXQuCi0gICAqIEBwYXJhbSB0ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJICBwcm9maWxlIHRlc3QgYXNzZXJ0aW9ucyBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIGxvZ1VSSSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgbG9nIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gY29ycmVsYXRpb25UeXBlICAgICAgICAgICAgbWVzc2FnZSBjb3JyZWxhdGlvbiB0eXBlLgotICAgKiBAcGFyYW0gd3NkbFJlZmVyZW5jZSAgICAgICAgICAgICAgYSBXU0RMIHJlZmVyZW5jZS4uCi0gICAqIEBwYXJhbSB1ZGRpUmVmZXJlbmNlICAgICAgICAgICAgICBhIFVVRERJIHJlZmVyZW5jZS4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbmZpZ0ltcGwoCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgIGJvb2xlYW4gdmVyYm9zZSwKLSAgICBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFzc2VydGlvblJlc3VsdHNPcHRpb24sCi0gICAgU3RyaW5nIHJlcG9ydFVSSSwKLSAgICBib29sZWFuIHJlcGxhY2VSZXBvcnQsCi0gICAgQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0LAotICAgIFN0cmluZyB0ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJLAotICAgIFN0cmluZyBsb2dVUkksCi0gICAgU3RyaW5nIGNvcnJlbGF0aW9uVHlwZSwKLSAgICBXU0RMUmVmZXJlbmNlIHdzZGxSZWZlcmVuY2UsCi0gICAgVURESVJlZmVyZW5jZSB1ZGRpUmVmZXJlbmNlKQotICB7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgdGhpcy5hc3NlcnRpb25SZXN1bHRzT3B0aW9uID0gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbjsKLSAgICB0aGlzLnJlcG9ydFVSSSA9IHJlcG9ydFVSSTsKLSAgICB0aGlzLnJlcGxhY2VSZXBvcnQgPSByZXBsYWNlUmVwb3J0OwotICAgIHRoaXMuYWRkU3R5bGVTaGVldCA9IGFkZFN0eWxlU2hlZXQ7Ci0gICAgdGhpcy50ZXN0QXNzZXJ0aW9uc0RvY3VtZW50VVJJID0gdGVzdEFzc2VydGlvbnNEb2N1bWVudFVSSTsKLSAgICB0aGlzLmxvZ1VSSSA9IGxvZ1VSSTsKLSAgICB0aGlzLmNvcnJlbGF0aW9uVHlwZSA9IGNvcnJlbGF0aW9uVHlwZTsKLSAgICB0aGlzLndzZGxSZWZlcmVuY2UgPSB3c2RsUmVmZXJlbmNlOwotICAgIHRoaXMudWRkaVJlZmVyZW5jZSA9IHVkZGlSZWZlcmVuY2U7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhbmFseXplciBjb25maWcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KE1lc3NhZ2VMaXN0IG1lc3NhZ2VMaXN0KQotICB7Ci0gICAgdGhpcy5tZXNzYWdlTGlzdCA9IG1lc3NhZ2VMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAgICogQHNlZSAjc2V0RGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0IG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNnZXREZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI3NldFZlcmJvc2VPcHRpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFZlcmJvc2VPcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudmVyYm9zZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlICNnZXRWZXJib3NlT3B0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlT3B0aW9uKGJvb2xlYW4gdmVyYm9zZSkKLSAgewotICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICogQHNlZSAjc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdHNPcHRpb24gZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5hc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqIEBzZWUgI2dldEFzc2VydGlvblJlc3VsdHNPcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFzc2VydGlvblJlc3VsdHNPcHRpb24oQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb25SZXN1bHRzT3B0aW9uKQotICB7Ci0gICAgdGhpcy5hc3NlcnRpb25SZXN1bHRzT3B0aW9uID0gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlICNzZXRSZXBvcnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZXBvcnRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZXBvcnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjZ2V0UmVwb3J0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcG9ydExvY2F0aW9uKFN0cmluZyByZXBvcnRVUkkpCi0gIHsKLSAgICB0aGlzLnJlcG9ydFVSSSA9IHJlcG9ydFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVwbGFjZSByZXBvcnQgZmlsZSBvcHRpb24uCi0gICAqIEBzZWUgI3NldFJlcGxhY2VSZXBvcnQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFJlcGxhY2VSZXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVwbGFjZVJlcG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVwb3J0IGZpbGUgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldFJlcGxhY2VSZXBvcnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VSZXBvcnQoYm9vbGVhbiByZXBsYWNlUmVwb3J0KQotICB7Ci0gICAgdGhpcy5yZXBsYWNlUmVwb3J0ID0gcmVwbGFjZVJlcG9ydDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYWRkIHN0eWxlIHNoZWV0LgotICAgKiBAc2VlICNzZXRBZGRTdHlsZVNoZWV0Ci0gICAqLwotICBwdWJsaWMgQWRkU3R5bGVTaGVldCBnZXRBZGRTdHlsZVNoZWV0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmFkZFN0eWxlU2hlZXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHJlcGxhY2UgcmVwb3J0IGZpbGUgb3B0aW9uLgotICAgKiBAc2VlICNnZXRBZGRTdHlsZVNoZWV0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBZGRTdHlsZVNoZWV0KEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldCkKLSAgewotICAgIHRoaXMuYWRkU3R5bGVTaGVldCA9IGFkZFN0eWxlU2hlZXQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjc2V0VGVzdEFzc2VydGlvbkRvY3VtZW50TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLnRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjZ2V0VGVzdEFzc2VydGlvbkRvY3VtZW50TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbihTdHJpbmcgdGVzdEFzc2VydGlvbnNEb2N1bWVudFVSSSkKLSAgewotICAgIHRoaXMudGVzdEFzc2VydGlvbnNEb2N1bWVudFVSSSA9IHRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjc2V0TG9nTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9nTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGxvZ1VSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlICNnZXRMb2dMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nTG9jYXRpb24oU3RyaW5nIGxvZ1VSSSkKLSAgewotICAgIHRoaXMubG9nVVJJID0gbG9nVVJJOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNMb2dTZXQoKQotICB7Ci0gICAgcmV0dXJuIChsb2dVUkkgIT0gbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGNvcnJlbGF0aW9uIHR5cGUuCi0gICAqIEBzZWUgI3NldENvcnJlbGF0aW9uVHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb3JyZWxhdGlvblR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuY29ycmVsYXRpb25UeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBjb3JyZWxhdGlvbiB0eXBlLgotICAgKiBAc2VlICNnZXRDb3JyZWxhdGlvblR5cGUKLSAgICogCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb3JyZWxhdGlvblR5cGUoU3RyaW5nIGNvcnJlbGF0aW9uVHlwZSkKLSAgewotICAgIHRoaXMuY29ycmVsYXRpb25UeXBlID0gY29ycmVsYXRpb25UeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIFdTREwgcmVmZXJlbmNlIHNldC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzV1NETFJlZmVyZW5jZVNldCgpCi0gIHsKLSAgICByZXR1cm4gKHRoaXMud3NkbFJlZmVyZW5jZSA9PSBudWxsID8gZmFsc2UgOiB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgV1NETCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI3NldFdTRExSZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyBXU0RMUmVmZXJlbmNlIGdldFdTRExSZWZlcmVuY2UoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMud3NkbFJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgV1NETCByZWZlcmVuY2UuCi0gICAqIEBzZWUgI2dldFdTRExSZWZlcmVuY2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdTRExSZWZlcmVuY2UoV1NETFJlZmVyZW5jZSB3c2RsUmVmZXJlbmNlKQotICB7Ci0gICAgdGhpcy53c2RsUmVmZXJlbmNlID0gd3NkbFJlZmVyZW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgV1NETCBlbGVtZW50LgotICAgKiAKLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gKHRoaXMud3NkbFJlZmVyZW5jZSA9PSBudWxsKQotICAgICAgPyBudWxsCi0gICAgICA6IHRoaXMud3NkbFJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzZXJ2aWNlIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuICh0aGlzLndzZGxSZWZlcmVuY2UgPT0gbnVsbCkKLSAgICAgID8gbnVsbAotICAgICAgOiB0aGlzLndzZGxSZWZlcmVuY2UuZ2V0U2VydmljZUxvY2F0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnI2dldFdTRExMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFdTRExMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gKHRoaXMud3NkbFJlZmVyZW5jZSA9PSBudWxsKQotICAgICAgPyBudWxsCi0gICAgICA6IHRoaXMud3NkbFJlZmVyZW5jZS5nZXRXU0RMTG9jYXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWcjaXNVZGRpUmVmZXJlbmNlU2V0KQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNVRERJUmVmZXJlbmNlU2V0KCkKLSAgewotICAgIHJldHVybiAodGhpcy51ZGRpUmVmZXJlbmNlID09IG51bGwgPyBmYWxzZSA6IHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBVRERJIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjc2V0VURESVJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIFVERElSZWZlcmVuY2UgZ2V0VURESVJlZmVyZW5jZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy51ZGRpUmVmZXJlbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBVRERJIHJlZmVyZW5jZS4KLSAgICogQHNlZSAjZ2V0VURESVJlZmVyZW5jZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VURESVJlZmVyZW5jZShVRERJUmVmZXJlbmNlIHVkZGlSZWZlcmVuY2UpCi0gIHsKLSAgICB0aGlzLnVkZGlSZWZlcmVuY2UgPSB1ZGRpUmVmZXJlbmNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI3NldExvY2F0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBjb25maWdVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBnZXRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGNvbmZpZ1VSSSkKLSAgewotICAgIHRoaXMuY29uZmlnVVJJID0gY29uZmlnVVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LldTSURvY3VtZW50I3RvWE1MU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIFN0YXJ0IGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgLy8gVmVyYm9zZSBvcHRpb24KLSAgICBwdy5wcmludCgiICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9WRVJCT1NFICsgIj4iKTsKLSAgICBwdy5wcmludChnZXRWZXJib3NlT3B0aW9uKCkpOwotICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1ZFUkJPU0UgKyAiPiIpOwotCi0gICAgLy8gR2V0IGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbgotICAgIHB3LnByaW50KGFzc2VydGlvblJlc3VsdHNPcHRpb24udG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0KLSAgICAvLyByZXBvcnQgZmlsZQotICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fUkVQT1JUX0ZJTEUgKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX1JFUExBQ0UgKyAiPVwiIiArIGdldFJlcGxhY2VSZXBvcnQoKSArICJcIiAiKTsKLSAgICBwdy5wcmludGxuKAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04gKyAiPVwiIiArIGdldFJlcG9ydExvY2F0aW9uKCkgKyAiXCI+Iik7Ci0gICAgcHcucHJpbnQoZ2V0QWRkU3R5bGVTaGVldCgpLnRvWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLSAgICBwdy5wcmludGxuKCIgICAgICAgIDwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1JFUE9SVF9GSUxFICsgIj4iKTsKLQotICAgIC8vIHRlc3QgYXNzZXJ0aW9uIGZpbGUKLSAgICBwdy5wcmludCgKLSAgICAgICIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fVEVTVF9BU1NFUlRJT05TX0ZJTEUgKyAiPiIpOwotICAgIHB3LnByaW50KGdldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbigpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9URVNUX0FTU0VSVElPTlNfRklMRSArICI+Iik7Ci0KLSAgICAvLyBsb2cgZmlsZQotICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0ZJTEUpOwotICAgIHB3LnByaW50KAotICAgICAgIiAiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLkFUVFJfQ09SUkVMQVRJT05fVFlQRQotICAgICAgICArICI9XCIiCi0gICAgICAgICsgdGhpcy5jb3JyZWxhdGlvblR5cGUKLSAgICAgICAgKyAiXCI+Iik7Ci0gICAgcHcucHJpbnQoZ2V0TG9nTG9jYXRpb24oKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0ZJTEUgKyAiPiIpOwotCi0gICAgLy8gV1NETCByZWZlcmVuY2UgCi0gICAgaWYgKHRoaXMud3NkbFJlZmVyZW5jZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50KGdldFdTRExSZWZlcmVuY2UoKS50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBVRERJIFJlZmVyZW5jZQotICAgIGlmICh0aGlzLnVkZGlSZWZlcmVuY2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludChnZXRVRERJUmVmZXJlbmNlKCkudG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0gICAgfQotCi0gICAgLy8gRW5kIGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICAvLyB2ZXJib3NlIG9wdGlvbgotICAgIHB3LnByaW50bG4oIiAgdmVyYm9zZSAuLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy52ZXJib3NlKTsKLQotICAgIC8vIGFzc2VydGlvblJlc3VsdHMgb3B0aW9ucwotICAgIHB3LnByaW50KHRoaXMuYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi50b1N0cmluZygpKTsKLQotICAgIC8vIHJlcG9ydEZpbGUgb3B0aW9ucwotICAgIHB3LnByaW50bG4oIiAgUmVwb3J0IEZpbGU6Iik7Ci0gICAgcHcucHJpbnRsbigiICAgIHJlcGxhY2UgLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLnJlcGxhY2VSZXBvcnQpOwotICAgIHB3LnByaW50bG4oIiAgICBsb2NhdGlvbiAuLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5yZXBvcnRVUkkpOwotICAgIGlmICh0aGlzLmFkZFN0eWxlU2hlZXQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludGxuKCIgICAgU3R5bGUgU2hlZXQ6Iik7Ci0gICAgICBpZiAodGhpcy5hZGRTdHlsZVNoZWV0LmdldEhyZWYoKSAhPSBudWxsKQotICAgICAgICBwdy5wcmludGxuKAotICAgICAgICAgICIgICAgICBocmVmIC4uLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMuYWRkU3R5bGVTaGVldC5nZXRIcmVmKCkpOwotICAgICAgaWYgKHRoaXMuYWRkU3R5bGVTaGVldC5nZXRUeXBlKCkgIT0gbnVsbCkKLSAgICAgICAgcHcucHJpbnRsbigKLSAgICAgICAgICAiICAgICAgdHlwZSAuLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmFkZFN0eWxlU2hlZXQuZ2V0VHlwZSgpKTsKLSAgICAgIGlmICh0aGlzLmFkZFN0eWxlU2hlZXQuZ2V0VGl0bGUoKSAhPSBudWxsKQotICAgICAgICBwdy5wcmludGxuKAotICAgICAgICAgICIgICAgICB0aXRsZSAuLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMuYWRkU3R5bGVTaGVldC5nZXRUaXRsZSgpKTsKLSAgICAgIGlmICh0aGlzLmFkZFN0eWxlU2hlZXQuZ2V0TWVkaWEoKSAhPSBudWxsKQotICAgICAgICBwdy5wcmludGxuKAotICAgICAgICAgICIgICAgICBtZWRpYSAuLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMuYWRkU3R5bGVTaGVldC5nZXRNZWRpYSgpKTsKLSAgICAgIGlmICh0aGlzLmFkZFN0eWxlU2hlZXQuZ2V0Q2hhcnNldCgpICE9IG51bGwpCi0gICAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICAgIiAgICAgIGNoYXJzZXQgLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5hZGRTdHlsZVNoZWV0LmdldENoYXJzZXQoKSk7Ci0gICAgICBpZiAodGhpcy5hZGRTdHlsZVNoZWV0LmdldEFsdGVybmF0ZSgpICE9IG51bGwpCi0gICAgICAgIHB3LnByaW50bG4oCi0gICAgICAgICAgIiAgICAgIGFsdGVybmF0ZSAuLi4uLi4uLi4uLi4uLiAiCi0gICAgICAgICAgICArIHRoaXMuYWRkU3R5bGVTaGVldC5nZXRBbHRlcm5hdGUoKSk7Ci0gICAgfQotCi0gICAgLy8gdGVzdEFzc2VydGlvbnNGaWxlIHBhcmFtZXRlcgotICAgIHB3LnByaW50bG4oCi0gICAgICAiICB0ZXN0QXNzZXJ0aW9uc0ZpbGUgLi4uLi4uLi4uICIgKyB0aGlzLnRlc3RBc3NlcnRpb25zRG9jdW1lbnRVUkkpOwotCi0gICAgLy8gbG9nRmlsZSBvcHRpb25zCi0gICAgaWYgKHRoaXMubG9nVVJJICE9IG51bGwpCi0gICAgewotICAgICAgcHcucHJpbnRsbigiICBNZXNzYWdlIExvZyBGaWxlOiIpOwotICAgICAgcHcucHJpbnRsbigiICAgIGxvY2F0aW9uIC4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmxvZ1VSSSk7Ci0gICAgICBwdy5wcmludGxuKCIgICAgY29ycmVsYXRpb25UeXBlIC4uLi4uLi4uLi4gIiArIHRoaXMuY29ycmVsYXRpb25UeXBlKTsKLSAgICB9Ci0KLSAgICAvLyB3c2RsUmVmZXJlbmNlIG9wdGlvbnMgICAKLSAgICBpZiAodGhpcy5pc1dTRExSZWZlcmVuY2VTZXQoKSkKLSAgICB7Ci0gICAgICBwdy5wcmludCh0aGlzLndzZGxSZWZlcmVuY2UudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLy8gdWRkaVJlZmVyZW5jZSBvcHRpb25zCi0gICAgaWYgKHRoaXMuaXNVRERJUmVmZXJlbmNlU2V0KCkpCi0gICAgewotICAgICAgcHcucHJpbnQodGhpcy51ZGRpUmVmZXJlbmNlLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8vIGRlc2NyaXB0aW9uIHBhcmFtZXRlcgotICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgcHcucHJpbnRsbigiICBkZXNjcmlwdGlvbiAuLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgY29uZmlnIHZhbHVlcyBmcm9tIGFub3RoZXIgYW5hbHl6ZXIgY29uZmlnIG9iamVjdC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRDb25maWcoQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWcpCi0gIHsKLSAgICB0aGlzLmNvbmZpZ1VSSSA9IGFuYWx5emVyQ29uZmlnLmdldExvY2F0aW9uKCk7Ci0gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGFuYWx5emVyQ29uZmlnLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgdGhpcy52ZXJib3NlID0gYW5hbHl6ZXJDb25maWcuZ2V0VmVyYm9zZU9wdGlvbigpOwotICAgIHRoaXMuYXNzZXJ0aW9uUmVzdWx0c09wdGlvbiA9IGFuYWx5emVyQ29uZmlnLmdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKTsKLSAgICB0aGlzLnJlcG9ydFVSSSA9IGFuYWx5emVyQ29uZmlnLmdldFJlcG9ydExvY2F0aW9uKCk7Ci0gICAgdGhpcy5yZXBsYWNlUmVwb3J0ID0gYW5hbHl6ZXJDb25maWcuZ2V0UmVwbGFjZVJlcG9ydCgpOwotICAgIHRoaXMubG9nVVJJID0gYW5hbHl6ZXJDb25maWcuZ2V0TG9nTG9jYXRpb24oKTsKLSAgICB0aGlzLmNvcnJlbGF0aW9uVHlwZSA9IGFuYWx5emVyQ29uZmlnLmdldENvcnJlbGF0aW9uVHlwZSgpOwotICAgIHRoaXMudGVzdEFzc2VydGlvbnNEb2N1bWVudFVSSSA9Ci0gICAgICBhbmFseXplckNvbmZpZy5nZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oKTsKLSAgICB0aGlzLmFkZFN0eWxlU2hlZXQgPSBhbmFseXplckNvbmZpZy5nZXRBZGRTdHlsZVNoZWV0KCk7Ci0gICAgdGhpcy53c2RsUmVmZXJlbmNlID0gYW5hbHl6ZXJDb25maWcuZ2V0V1NETFJlZmVyZW5jZSgpOwotICAgIHRoaXMudWRkaVJlZmVyZW5jZSA9IGFuYWx5emVyQ29uZmlnLmdldFVERElSZWZlcmVuY2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VBcmdzKFN0cmluZ1tdIGFyZ3MsIGJvb2xlYW4gdmFsaWRhdGUpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFdTRExSZWZlcmVuY2Ugd3NkbFJlZmVyZW5jZSA9IG51bGw7Ci0gICAgVURESVJlZmVyZW5jZSB1ZGRpUmVmZXJlbmNlID0gbnVsbDsKLQotICAgIC8vIEdldCBuZXcgY29uZmlnIHJlYWRlcgotICAgIEFuYWx5emVyQ29uZmlnUmVhZGVyIGFuYWx5emVyQ29uZmlnUmVhZGVyID0gbmV3IEFuYWx5emVyQ29uZmlnUmVhZGVySW1wbCgpOwotICAgIGFuYWx5emVyQ29uZmlnUmVhZGVyLmluaXQodGhpcy5tZXNzYWdlTGlzdCk7Ci0KLSAgICAvLyBBbmFseXplciBjb25maWcgb2JqZWN0IHdoaWNoIHdpbGwgYmUgbWVyZ2VkIGFmdGVyIGFsbCBvZiB0aGUgaW5wdXQgcGFybXMgYXJlIHByb2Nlc3NlZAotICAgIEFuYWx5emVyQ29uZmlnIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3MgPSBudWxsOwotCi0gICAgLy8gQXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uCi0gICAgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb25SZXN1bHRzT3B0aW9uID0gbnVsbDsKLQotICAgIC8vIElmIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlbiB0aHJvdyBleGNlcHRpb24KLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAvLyBBREQ6IAotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgidXNhZ2UwMSIsIEFuYWx5emVyLlVTQUdFX01FU1NBR0UpKTsKLSAgICB9Ci0KLSAgICAvLyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBsb2NhdGUgdGhlIGNvbmZpZyBmaWxlIG9wdGlvbiAoaWYgaXQgd2FzIHNwZWNpZmllZCkKLSAgICBmb3IgKGludCBhcmdDb3VudCA9IDA7IGFyZ0NvdW50IDwgYXJncy5sZW5ndGg7IGFyZ0NvdW50KyspCi0gICAgewotICAgICAgLy8gLWNvbmZpZwotICAgICAgaWYgKChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItY29uZmlnIikpCi0gICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1jIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzID0KLSAgICAgICAgICBhbmFseXplckNvbmZpZ1JlYWRlci5yZWFkQW5hbHl6ZXJDb25maWcoCi0gICAgICAgICAgICBnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIGNvbmZpZyBmaWxlIHdhcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGNyZWF0ZSBhbmFseXplciBjb25maWcgb2JqZWN0Ci0gICAgaWYgKGFuYWx5emVyQ29uZmlnRnJvbUFyZ3MgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzID0gbmV3IEFuYWx5emVyQ29uZmlnSW1wbCgpOwotICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5pbml0KHRoaXMubWVzc2FnZUxpc3QpOwotICAgIH0KLQotICAgIC8vIEdldCBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24KLSAgICBpZiAoKGFzc2VydGlvblJlc3VsdHNPcHRpb24gPQotICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5nZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKCkpCi0gICAgICA9PSBudWxsKQotICAgIHsKLSAgICAgIGFzc2VydGlvblJlc3VsdHNPcHRpb24gPSBuZXcgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbkltcGwoKTsKLSAgICAgIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3Muc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbihhc3NlcnRpb25SZXN1bHRzT3B0aW9uKTsKLSAgICB9Ci0KLSAgICAvLyBQYXJzZSBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICBmb3IgKGludCBhcmdDb3VudCA9IDA7IGFyZ0NvdW50IDwgYXJncy5sZW5ndGg7IGFyZ0NvdW50KyspCi0gICAgewotICAgICAgLy8gLWNvbmZpZwotICAgICAgaWYgKChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItY29uZmlnIikpCi0gICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1jIikpKQotICAgICAgewotICAgICAgICAvLyBTa2lwIHRoaXMgb3B0aW9uIHNpbmNlIGl0IHdhcyBhbHJlYWR5IHByb2Nlc3NlZAotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgfQotCi0gICAgICAvLyAtdmVyYm9zZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItdmVyYm9zZSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi12IikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBhbmFseXplckNvbmZpZ0Zyb21BcmdzLnNldFZlcmJvc2VPcHRpb24oCi0gICAgICAgICAgQm9vbGVhbi52YWx1ZU9mKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgfQotCi0gICAgICAvLyAtYXNzZXJ0aW9uUmVzdWx0cwotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItYXNzZXJ0aW9uUmVzdWx0cyIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1hIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldEFzc2VydGlvblJlc3VsdFR5cGUoCi0gICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0VHlwZS5uZXdJbnN0YW5jZShnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLW1lc3NhZ2VFbnRyeQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItbWVzc2FnZUVudHJ5IikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLU0iKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGFzc2VydGlvblJlc3VsdHNPcHRpb24uc2V0U2hvd01lc3NhZ2VFbnRyeSgKLSAgICAgICAgICBCb29sZWFuLnZhbHVlT2YoZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1hc3NlcnRpb25EZXNjcmlwdGlvbgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItYXNzZXJ0aW9uRGVzY3JpcHRpb24iKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItQSIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5zZXRTaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24oCi0gICAgICAgICAgQm9vbGVhbi52YWx1ZU9mKGFyZ3NbYXJnQ291bnRdKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1mYWlsdXJlTWVzc2FnZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItZmFpbHVyZU1lc3NhZ2UiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItRiIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5zZXRTaG93RmFpbHVyZU1lc3NhZ2UoCi0gICAgICAgICAgQm9vbGVhbi52YWx1ZU9mKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgfQotCi0gICAgICAvLyAtZmFpbHVyZURldGFpbAotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItZmFpbHVyZURldGFpbCIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1EIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldFNob3dGYWlsdXJlRGV0YWlsKAotICAgICAgICAgIEJvb2xlYW4udmFsdWVPZihnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLWxvZ0ZpbGUKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLWxvZ0ZpbGUiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItbCIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRMb2dMb2NhdGlvbihnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpOwotICAgICAgfQotCi0gICAgICAvLyAtdGVzdEFzc2VydGlvbkZpbGUKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLXRlc3RBc3NlcnRpb25GaWxlIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLXQiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3Muc2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKAotICAgICAgICAgIGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1yZXBvcnRGaWxlCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1yZXBvcnRGaWxlIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLXIiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3Muc2V0UmVwb3J0TG9jYXRpb24oCi0gICAgICAgICAgZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLXJlcGxhY2UKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLXJlcGxhY2UiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItUiIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRSZXBsYWNlUmVwb3J0KAotICAgICAgICAgIEJvb2xlYW4udmFsdWVPZihnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gLWNvcnJlbGF0aW9uVHlwZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItY29ycmVsYXRpb25UeXBlIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLUMiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3Muc2V0Q29ycmVsYXRpb25UeXBlKAotICAgICAgICAgIGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC13c2RsRWxlbWVudAotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItd3NkbEVsZW1lbnQiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItVyIpKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG9wdGlvbk5hbWUgPSBhcmdzW2FyZ0NvdW50XTsKLSAgICAgICAgYXJnQ291bnQrKzsKLQotICAgICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IG5ldyBXU0RMRWxlbWVudEltcGwoKTsKLSAgICAgICAgd3NkbEVsZW1lbnQuc2V0TmFtZShnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCwgb3B0aW9uTmFtZSkpOwotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICB3c2RsRWxlbWVudC5zZXRUeXBlKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50LCBvcHRpb25OYW1lKSk7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIHdzZGxFbGVtZW50LnNldE5hbWVzcGFjZShnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCwgb3B0aW9uTmFtZSkpOwotICAgICAgICBpZiAoIWFyZ3NbYXJnQ291bnRdLnN0YXJ0c1dpdGgoIi0iKSkKLSAgICAgICAgewotICAgICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgICAgd3NkbEVsZW1lbnQuc2V0UGFyZW50RWxlbWVudE5hbWUoCi0gICAgICAgICAgICBnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCwgb3B0aW9uTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdzZGxSZWZlcmVuY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHdzZGxSZWZlcmVuY2Uuc2V0V1NETEVsZW1lbnQod3NkbEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHVkZGlSZWZlcmVuY2UgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVkZGlSZWZlcmVuY2Uuc2V0V1NETEVsZW1lbnQod3NkbEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgICAiY29uZmlnMTAiLAotICAgICAgICAgICAgICAiVGhlIC13c2RsRWxlbWVudCBvcHRpb24gbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlIC13c2RsVVJJIG9yIC11ZGRpS2V5IG9wdGlvbnMuIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRXU0RMUmVmZXJlbmNlKHdzZGxSZWZlcmVuY2UpOwotICAgICAgfQotCi0gICAgICAvLyAtc2VydmljZUxvY2F0aW9uCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1zZXJ2aWNlTG9jYXRpb24iKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItUyIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLQotICAgICAgICBpZiAod3NkbFJlZmVyZW5jZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgd3NkbFJlZmVyZW5jZS5zZXRTZXJ2aWNlTG9jYXRpb24oZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh1ZGRpUmVmZXJlbmNlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB1ZGRpUmVmZXJlbmNlLnNldFNlcnZpY2VMb2NhdGlvbihnZXRPcHRpb25WYWx1ZShhcmdzLCBhcmdDb3VudCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgICAiY29uZmlnMTEiLAotICAgICAgICAgICAgICAiVGhlIC1zZXJ2aWNlTG9jYXRpb24gb3B0aW9uIG11c3QgYXBwZWFyIGFmdGVyIHRoZSAtd3NkbFVSSSBvciAtdWRkaUtleSBvcHRpb25zLiIpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyAtd3NkbFVSSQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItd3NkbFVSSSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1XIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBpZiAod3NkbFJlZmVyZW5jZSA9PSBudWxsKQotICAgICAgICAgIHdzZGxSZWZlcmVuY2UgPSBuZXcgV1NETFJlZmVyZW5jZUltcGwoKTsKLSAgICAgICAgd3NkbFJlZmVyZW5jZS5zZXRXU0RMTG9jYXRpb24oZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKTsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRXU0RMUmVmZXJlbmNlKHdzZGxSZWZlcmVuY2UpOwotICAgICAgfQotCi0gICAgICAvLyAtdWRkaUtleVR5cGUKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLXVkZGlLZXlUeXBlIikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLUsiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIGlmICh1ZGRpUmVmZXJlbmNlID09IG51bGwpCi0gICAgICAgICAgdWRkaVJlZmVyZW5jZSA9IG5ldyBVRERJUmVmZXJlbmNlSW1wbCgpOwotICAgICAgICB1ZGRpUmVmZXJlbmNlLnNldEtleVR5cGUoZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKTsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRVRERJUmVmZXJlbmNlKHVkZGlSZWZlcmVuY2UpOwotICAgICAgfQotCi0gICAgICAvLyAtdWRkaUtleQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItdWRkaUtleSIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1rIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBpZiAodWRkaVJlZmVyZW5jZSA9PSBudWxsKQotICAgICAgICAgIHVkZGlSZWZlcmVuY2UgPSBuZXcgVURESVJlZmVyZW5jZUltcGwoKTsKLSAgICAgICAgdWRkaVJlZmVyZW5jZS5zZXRLZXkoZ2V0T3B0aW9uVmFsdWUoYXJncywgYXJnQ291bnQpKTsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRVRERJUmVmZXJlbmNlKHVkZGlSZWZlcmVuY2UpOwotICAgICAgfQotCi0gICAgICAvLyAtaW5xdWlyeVVSTAotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItaW5xdWlyeVVSTCIpKQotICAgICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1pIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBpZiAodWRkaVJlZmVyZW5jZSA9PSBudWxsKQotICAgICAgICAgIHVkZGlSZWZlcmVuY2UgPSBuZXcgVURESVJlZmVyZW5jZUltcGwoKTsKLSAgICAgICAgdWRkaVJlZmVyZW5jZS5zZXRJbnF1aXJ5VVJMKGdldE9wdGlvblZhbHVlKGFyZ3MsIGFyZ0NvdW50KSk7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnRnJvbUFyZ3Muc2V0VURESVJlZmVyZW5jZSh1ZGRpUmVmZXJlbmNlKTsKLSAgICAgIH0KLQotICAgICAgLy8gQUREOiBOZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBvdGhlciBvcHRpb25zICgtY29uZmlnLCAtYmluZGluZywgZXRjLikKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgImNvbmZpZzEyIiwKLSAgICAgICAgICAgIGFyZ3NbYXJnQ291bnRdLAotICAgICAgICAgICAgIlRoZSBzcGVjaWZpZWQgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQ6IikpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIGFkZFN0eWxlU2hlZXQgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gY3JlYXRlIGEgY29tbWVudCB2ZXJzaW9uIG9mIGl0Ci0gICAgaWYgKGFuYWx5emVyQ29uZmlnRnJvbUFyZ3MuZ2V0QWRkU3R5bGVTaGVldCgpID09IG51bGwpCi0gICAgewotICAgICAgQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0ID0gbmV3IEFkZFN0eWxlU2hlZXRJbXBsKCk7Ci0gICAgICBhZGRTdHlsZVNoZWV0LnNldEhyZWYoV1NJQ29uc3RhbnRzLkRFRkFVTFRfUkVQT1JUX1hTTCk7Ci0gICAgICBhZGRTdHlsZVNoZWV0LnNldFR5cGUoV1NJQ29uc3RhbnRzLkRFRkFVTFRfWFNMX1RZUEUpOwotICAgICAgYWRkU3R5bGVTaGVldC5zZXRDb21tZW50KHRydWUpOwotICAgICAgYW5hbHl6ZXJDb25maWdGcm9tQXJncy5zZXRBZGRTdHlsZVNoZWV0KGFkZFN0eWxlU2hlZXQpOwotICAgIH0KLQotICAgIC8vIE1lcmdlIGNvbmZpZyBpbmZvIGludG8gdGhpcyBvYmplY3QKLSAgICBzZXRDb25maWcoYW5hbHl6ZXJDb25maWdGcm9tQXJncyk7Ci0KLSAgICBpZiAodmFsaWRhdGUpCi0gICAgeyAgCi0gICAgICAvLyBWZXJpZnkgdGhhdCBhbGwgcmVxdWlyZWQgb3B0aW9ucyB3ZXJlIHNwZWNpZmllZCBhbmQgCi0gICAgICAvLyB0aGF0IHRoZSBzcGVjaWZpZWQgb25lcyB3ZXJlIGNvcnJlY3QKLSAgICAgIGNoZWNrQ29uZmlnT3B0aW9ucygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZnkgY29uZmlnIG9wdGlvbnMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tDb25maWdPcHRpb25zKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZpbGVMb2NhdGlvbjsKLQotICAgIC8vIElmIHdzZGxSZWZlcmVuY2UgYW5kIHVkZGlSZWZlcmVuY2Ugc3BlY2lmaWVkLCB0aGVuIHRocm93IGV4Y2VwdGlvbgotICAgIGlmICgodGhpcy5pc1dTRExSZWZlcmVuY2VTZXQoKSkgJiYgKHRoaXMuaXNVRERJUmVmZXJlbmNlU2V0KCkpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzA0IiwKLSAgICAgICAgICAiQ2FuIG5vdCBzcGVjaWZ5IGJvdGggdGhlIFdTREwgcmVmZXJlbmNlIGFuZCBVRERJIHJlZmVyZW5jZSBvcHRpb25zIikpOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHRlc3QgYXNzZXJ0aW9uIGZpbGUgZXhpc3RzCi0gICAgaWYgKChmaWxlTG9jYXRpb24gPSB0aGlzLmdldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbigpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzE2IiwKLSAgICAgICAgICAiVGVzdCBhc3NlcnRpb24gZG9jdW1lbnQgbG9jYXRpb24gbXVzdCBiZSBzcGVjaWZpZWQuIikpOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFVdGlscy5maWxlRXhpc3RzKGZpbGVMb2NhdGlvbikpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTQiLAotICAgICAgICAgIGZpbGVMb2NhdGlvbiwKLSAgICAgICAgICAiQ291bGQgbm90IGZpbmQgdGVzdCBhc3NlcnRpb24gZG9jdW1lbnQuICBTcGVjaWZpZWQgZmlsZSBsb2NhdGlvbjoiKSk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgaWYgbG9nIGZpbGUgZXhpc3RzCi0gICAgaWYgKChmaWxlTG9jYXRpb24gPSB0aGlzLmdldExvZ0xvY2F0aW9uKCkpICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKCFVdGlscy5maWxlRXhpc3RzKGZpbGVMb2NhdGlvbikpCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICJjb25maWcwMiIsCi0gICAgICAgICAgICBmaWxlTG9jYXRpb24sCi0gICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgbG9nIGZpbGU6IikpOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIFdTREwgZmlsZSBleGlzdHMKLSAgICBpZiAoKHRoaXMuZ2V0V1NETFJlZmVyZW5jZSgpICE9IG51bGwpCi0gICAgICAmJiAoZmlsZUxvY2F0aW9uID0gdGhpcy5nZXRXU0RMUmVmZXJlbmNlKCkuZ2V0V1NETExvY2F0aW9uKCkpICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKCFVdGlscy5maWxlRXhpc3RzKGZpbGVMb2NhdGlvbikpCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICJjb25maWcwMyIsCi0gICAgICAgICAgICBmaWxlTG9jYXRpb24sCi0gICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgV1NETCBmaWxlOiIpKTsKLSAgICB9Ci0KLSAgICBGaWxlIGZpbGUgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBmaWxlIG9iamVjdCBmb3IgcmVwb3J0IGZpbGUKLSAgICAgIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmdldFJlcG9ydExvY2F0aW9uKCkpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBtZXNzYWdlTGlzdC5nZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxNyIsCi0gICAgICAgICAgIkNvdWxkIG5vdCBnZXQgcmVwb3J0IGZpbGUgbG9jYXRpb24uIikpOwotICAgIH0KLQotICAgIC8vIElmIHJlcGxhY2UgZmxhZyBpcyBmYWxzZSBhbmQgZmlsZSBleGlzdHMsIHRoZW4gdGhyb3cgZXhjZXB0aW9uCi0gICAgaWYgKGZpbGUuZXhpc3RzKCkgJiYgIXRoaXMuZ2V0UmVwbGFjZVJlcG9ydCgpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzE1IiwKLSAgICAgICAgICAiUmVwb3J0IGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIHJlcGxhY2Ugb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLiIpKTsKLSAgICB9Ci0KLSAgICBpZiAoY29ycmVsYXRpb25UeXBlICE9IG51bGwKLSAgICAgICYmICF0aGlzLmNvcnJlbGF0aW9uVHlwZS5lcXVhbHMoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfRU5EUE9JTlQpCi0gICAgICAmJiAhdGhpcy5jb3JyZWxhdGlvblR5cGUuZXF1YWxzKAotICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9DT1JSRUxBVElPTl9UWVBFX05BTUVTUEFDRSkKLSAgICAgICYmICF0aGlzLmNvcnJlbGF0aW9uVHlwZS5lcXVhbHMoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfT1BFUkFUSU9OKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBtZXNzYWdlTGlzdC5nZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxOCIsCi0gICAgICAgICAgIkludmFsaWQgY29ycmVsYXRpb24gdHlwZSBzcGVjaWZpZWQuIikpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgb3B0aW9uIHZhbHVlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3B0aW9uVmFsdWUoU3RyaW5nW10gYXJncywgaW50IGluZGV4KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gZ2V0T3B0aW9uVmFsdWUoYXJncywgaW5kZXgsIGFyZ3NbaW5kZXggLSAxXSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG9wdGlvbiB2YWx1ZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE9wdGlvblZhbHVlKFN0cmluZ1tdIGFyZ3MsIGludCBpbmRleCwgU3RyaW5nIG9wdGlvbk5hbWUpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gSWYgaW5kZXggZ3JlYXRlciB0aGFuIGFycmF5IGxlbmd0aCwgdGhlbiB0aHJvdyBleGNlcHRpb24KLSAgICBpZiAoaW5kZXggPj0gYXJncy5sZW5ndGgpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTMiLAotICAgICAgICAgIG9wdGlvbk5hbWUsCi0gICAgICAgICAgIk9wdGlvbiBkaWQgbm90IGNvbnRhaW4gYSB2YWx1ZS4gIFNwZWNpZmllZCBvcHRpb246IikpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBhbiBvcHRpb24gKGkuZS4gc3RhcnRzIHdpdGggYSAiLSIpLCB0aGVuIHRocm93IGV4Y2VwdGlvbgotICAgIGlmIChhcmdzW2luZGV4XS5zdGFydHNXaXRoKCItIikpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTMiLAotICAgICAgICAgIG9wdGlvbk5hbWUsCi0gICAgICAgICAgIk9wdGlvbiBkaWQgbm90IGNvbnRhaW4gYSB2YWx1ZS4gIFNwZWNpZmllZCBvcHRpb246IikpOwotICAgIH0KLQotICAgIHJldHVybiAoYXJnc1tpbmRleF0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBtZXNzYWdlIGZyb20gcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZUlELCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZShtZXNzYWdlSUQsIG51bGwsIGRlZmF1bHRNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbWVzc2FnZSBmcm9tIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoCi0gICAgU3RyaW5nIG1lc3NhZ2VJRCwKLSAgICBTdHJpbmcgbWVzc2FnZURhdGEsCi0gICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSBkZWZhdWx0TWVzc2FnZTsKLSAgICBpZiAobWVzc2FnZUxpc3QgIT0gbnVsbCkKLSAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlTGlzdC5nZXRNZXNzYWdlKG1lc3NhZ2VJRCwgbWVzc2FnZURhdGEsIGRlZmF1bHRNZXNzYWdlKTsKLSAgICBlbHNlIGlmIChtZXNzYWdlRGF0YSAhPSBudWxsKQotICAgICAgbWVzc2FnZSArPSAiICIgKyBtZXNzYWdlRGF0YSArICIuIjsKLQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvQW5hbHl6ZXJDb25maWdSZWFkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvQW5hbHl6ZXJDb25maWdSZWFkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTQzYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9pbXBsL0FuYWx5emVyQ29uZmlnUmVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lGaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQXNzZXJ0aW9uUmVzdWx0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFzc2VydGlvblJlc3VsdHNPcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uQWRkU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLmltcGwuQWRkU3R5bGVTaGVldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHJlYWQgdGhlIGFuYWx5emVyIGNvbmZpZyBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEFuYWx5emVyQ29uZmlnUmVhZGVySW1wbCBpbXBsZW1lbnRzIEFuYWx5emVyQ29uZmlnUmVhZGVyCi17Ci0gIC8qKgotICAgKiBNZXNzYWdlIGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3Q7Ci0KLSAgLyoqCi0gICAqIERvY3VtZW50IGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkb2N1bWVudFVSSTsKLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBhbmFseXplciBjb25maWcgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCkKLSAgewotICAgIHRoaXMubWVzc2FnZUxpc3QgPSBtZXNzYWdlTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWdSZWFkZXIjcmVhZEFuYWx5emVyQ29uZmlnKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbmZpZyByZWFkQW5hbHl6ZXJDb25maWcoU3RyaW5nIGFuYWx5emVyQ29uZmlnVVJJKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIEZpbGVSZWFkZXIgZmlsZVJlYWRlciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGFuYWx5emVyQ29uZmlnVVJJKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMDEiLAotICAgICAgICAgIGFuYWx5emVyQ29uZmlnVVJJLAotICAgICAgICAgICJDb3VsZCBub3QgZmluZCBhbmFseXplciBjb25maWcgZmlsZTogIiksCi0gICAgICAgIGZuZmUpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcwOCIsCi0gICAgICAgICAgYW5hbHl6ZXJDb25maWdVUkksCi0gICAgICAgICAgIkNvdWxkIG5vdCByZWFkIGFuYWx5emVyIGNvbmZpZyBmaWxlOiAiKSwKLSAgICAgICAgZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlYWRBbmFseXplckNvbmZpZyhmaWxlUmVhZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWdSZWFkZXIjcmVhZEFuYWx5emVyQ29uZmlnKFJlYWRlcikKLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbmZpZyByZWFkQW5hbHl6ZXJDb25maWcoUmVhZGVyIHJlYWRlcikgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWcgPSBuZXcgQW5hbHl6ZXJDb25maWdJbXBsKCk7Ci0KLSAgICAvLyBQYXJzZSBYTUwKLSAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5wYXJzZVhNTChyZWFkZXIpOwotCi0gICAgLy8gUGFyc2UgZWxlbWVudHMgaW4gdGhlIGNvbmZpZyBkb2N1bWVudAotICAgIHBhcnNlQ29uZmlnRWxlbWVudChhbmFseXplckNvbmZpZywgZG9jLmdldERvY3VtZW50RWxlbWVudCgpKTsKLQotICAgIHJldHVybiBhbmFseXplckNvbmZpZzsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlciNnZXRMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmRvY3VtZW50VVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyI3NldExvY2F0aW9uKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBkb2N1bWVudFVSSSkKLSAgewotICAgIHRoaXMuZG9jdW1lbnRVUkkgPSBkb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBjb25maWcgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwYXJzZUNvbmZpZ0VsZW1lbnQoCi0gICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWcsCi0gICAgRWxlbWVudCBlbGVtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEFERDogR2V0IG5hbWUgYW5kIHZlcnNpb24KLQotICAgIC8vIEFERDogVmVyaWZ5IHRoYXQgdGhpcyBpcyB0aGUgY29uZmlnIGVsZW1lbnQKLQotICAgIC8vIEdldCBmaXJzdCBjaGlsZCBlbGVtZW50Ci0gICAgRWxlbWVudCBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICAvLyBERUJVRzoKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCBuYW1lOiAiICsgbmV4dEVsZW1lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICB3aGlsZSAobmV4dEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyA8ZGVzY3JpcHRpb24+Ci0gICAgICBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9ERVNDUklQVElPTikpCi0gICAgICB7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnLnNldERlc2NyaXB0aW9uKFhNTFV0aWxzLmdldFRleHQobmV4dEVsZW1lbnQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gPHZlcmJvc2U+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1ZFUkJPU0UpKQotICAgICAgewotICAgICAgICBhbmFseXplckNvbmZpZy5zZXRWZXJib3NlT3B0aW9uKAotICAgICAgICAgIFhNTFV0aWxzLmdldEJvb2xlYW5WYWx1ZShuZXh0RWxlbWVudCwgZmFsc2UpKTsKLSAgICAgIH0KLQotICAgICAgLy8gPGFzc2VydGlvblJlc3VsdHM+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0FTU0VSVElPTl9SRVNVTFRTKSkKLSAgICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbiBvYmplY3QKLSAgICAgICAgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb25SZXN1bHRzT3B0aW9uID0KLSAgICAgICAgICBuZXcgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbkltcGwoKTsKLSAgICAgICAgYW5hbHl6ZXJDb25maWcuc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbihhc3NlcnRpb25SZXN1bHRzT3B0aW9uKTsKLQotICAgICAgICAvLyBTZXQgcmVzdWx0IHR5cGUKLSAgICAgICAgU3RyaW5nIHJlc3VsdFR5cGUgPQotICAgICAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuQVRUUl9UWVBFKTsKLSAgICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5zZXRBc3NlcnRpb25SZXN1bHRUeXBlKAotICAgICAgICAgIEFzc2VydGlvblJlc3VsdFR5cGUubmV3SW5zdGFuY2UocmVzdWx0VHlwZSkpOwotCi0gICAgICAgIC8vIFNldCBzaG93IGxvZyBlbnRyeQotICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldFNob3dNZXNzYWdlRW50cnkoCi0gICAgICAgICAgWE1MVXRpbHMuZ2V0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgbmV4dEVsZW1lbnQsCi0gICAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUl9NRVNTQUdFX0VOVFJZLAotICAgICAgICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5nZXRTaG93TWVzc2FnZUVudHJ5KCkpKTsKLQotICAgICAgICAvLyBTZXQgc2hvdyBmYWlsdXJlIG1lc3NhZ2UKLSAgICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5zZXRTaG93RmFpbHVyZU1lc3NhZ2UoCi0gICAgICAgICAgWE1MVXRpbHMuZ2V0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgbmV4dEVsZW1lbnQsCi0gICAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUl9GQUlMVVJFX01FU1NBR0UsCi0gICAgICAgICAgICBhc3NlcnRpb25SZXN1bHRzT3B0aW9uLmdldFNob3dGYWlsdXJlTWVzc2FnZSgpKSk7Ci0KLSAgICAgICAgLy8gU2V0IHNob3cgZmFpbHVyZSBkZXRhaWwKLSAgICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5zZXRTaG93RmFpbHVyZURldGFpbCgKLSAgICAgICAgICBYTUxVdGlscy5nZXRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICBuZXh0RWxlbWVudCwKLSAgICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0ZBSUxVUkVfREVUQUlMLAotICAgICAgICAgICAgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5nZXRTaG93RmFpbHVyZURldGFpbCgpKSk7Ci0KLSAgICAgICAgLy8gUkVNT1ZFOiBTZXQgc2hvdyB3YXJuaW5nIG1lc3NhZ2UKLSAgICAgICAgLy9hc3NlcnRpb25SZXN1bHRzT3B0aW9uLnNldFNob3dXYXJuaW5nTWVzc2FnZShYTUxVdGlscy5nZXRCb29sZWFuVmFsdWUobmV4dEVsZW1lbnQsIAotICAgICAgICAvLyAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1dBUk5JTkdfTUVTU0FHRSwgYXNzZXJ0aW9uUmVzdWx0c09wdGlvbi5nZXRTaG93V2FybmluZ01lc3NhZ2UoKSkpOwotICAgICAgfQotCi0gICAgICAvLyA8cmVwb3J0RmlsZT4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fUkVQT1JUX0ZJTEUpKQotICAgICAgewotICAgICAgICBwYXJzZVJlcG9ydEZpbGVFbGVtZW50KGFuYWx5emVyQ29uZmlnLCBuZXh0RWxlbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDx0ZXN0QXNzZXJ0aW9uRmlsZT4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fVEVTVF9BU1NFUlRJT05TX0ZJTEUpKQotICAgICAgewotICAgICAgICBhbmFseXplckNvbmZpZy5zZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oCi0gICAgICAgICAgWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgfQotCi0gICAgICAvLyA8bG9nRmlsZT4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0ZJTEUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgY29ycmVsYXRpb25UeXBlID0KLSAgICAgICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgICAgIG5leHRFbGVtZW50LAotICAgICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfQ09SUkVMQVRJT05fVFlQRSk7Ci0gICAgICAgIGFuYWx5emVyQ29uZmlnLnNldENvcnJlbGF0aW9uVHlwZSgKLSAgICAgICAgICBjb3JyZWxhdGlvblR5cGUgPT0gbnVsbCA/ICJvcGVyYXRpb24iIDogY29ycmVsYXRpb25UeXBlKTsKLSAgICAgICAgYW5hbHl6ZXJDb25maWcuc2V0TG9nTG9jYXRpb24oWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgfQotCi0gICAgICAvLyA8d3NkbFJlZmVyZW5jZT4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9SRUZFUkVOQ0UpKQotICAgICAgewotICAgICAgICBwYXJzZVdzZGxSZWZlcmVuY2UoYW5hbHl6ZXJDb25maWcsIG5leHRFbGVtZW50KTsKLSAgICAgIH0KLQotICAgICAgLy8gPHVkZGlSZWZlcmVuY2U+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1VERElfUkVGRVJFTkNFKSkKLSAgICAgIHsKLSAgICAgICAgcGFyc2VVZGRpUmVmZXJlbmNlKGFuYWx5emVyQ29uZmlnLCBuZXh0RWxlbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICJjb25maWcwNiIsCi0gICAgICAgICAgICBuZXh0RWxlbWVudC5nZXRMb2NhbE5hbWUoKSwKLSAgICAgICAgICAgICJJbnZhbGlkIGFuYWx5emVyIGNvbmZpZyBlbGVtZW50OiIpKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0IG5leHQgZWxlbWVudAotICAgICAgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhuZXh0RWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHJlcG9ydEZpbGUgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwYXJzZVJlcG9ydEZpbGVFbGVtZW50KAotICAgIEFuYWx5emVyQ29uZmlnIGFuYWx5emVyQ29uZmlnLAotICAgIEVsZW1lbnQgZWxlbWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXQgcmVwb3J0IGxvY2F0aW9uIGFuZCByZXBsYWNlIGluZGljYXRvcgotICAgIGFuYWx5emVyQ29uZmlnLnNldFJlcGxhY2VSZXBvcnQoCi0gICAgICBYTUxVdGlscy5nZXRCb29sZWFuVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfUkVQTEFDRSwgZmFsc2UpKTsKLSAgICBhbmFseXplckNvbmZpZy5zZXRSZXBvcnRMb2NhdGlvbigKLSAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKAotICAgICAgICBlbGVtZW50LAotICAgICAgICBXU0lDb25zdGFudHMuQVRUUl9MT0NBVElPTiwKLSAgICAgICAgV1NJQ29uc3RhbnRzLkRFRkFVTFRfUkVQT1JUX1VSSSkpOwotCi0gICAgLy8gQUREOiBJZiB0aGUgcmVwb3J0IGxvY2F0aW9uIHdhc24ndCBzcGVjaWZpZWQsIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgLy9pZiAoYW5hbHl6ZXJDb25maWcuZ2V0UmVwb3J0TG9jYXRpb24oKSA9PSBudWxsKQotICAgIC8vICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJUaGUgYW5hbHl6ZXIgY29uZmlndXJhdGlvbiBmaWxlIG11c3QgY29udGFpbiB0aGUgcmVwb3J0IGZpbGUgbG9jYXRpb24uIik7Ci0KLSAgICAvLyBHZXQgZmlyc3QgY2hpbGQgZWxlbWVudAotICAgIEVsZW1lbnQgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW1lbnQpOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICB3aGlsZSAobmV4dEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyA8YWRkU3R5bGVTaGVldD4KLSAgICAgIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0FERF9TVFlMRV9TSEVFVCkpCi0gICAgICB7Ci0gICAgICAgIEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldCA9IG5ldyBBZGRTdHlsZVNoZWV0SW1wbCgpOwotCi0gICAgICAgIC8vIFBhcnNlIHRoZSBlbGVtZW50ICAKLSAgICAgICAgVGVzdFV0aWxzLnBhcnNlQWRkU3R5bGVTaGVldCgKLSAgICAgICAgICBuZXh0RWxlbWVudCwKLSAgICAgICAgICBhZGRTdHlsZVNoZWV0LAotICAgICAgICAgIFdTSUNvbnN0YW50cy5ERUZBVUxUX1JFUE9SVF9YU0wpOwotCi0gICAgICAgIC8vIFNldCBhZGQgc3R5bGUgc2hlZXQKLSAgICAgICAgYW5hbHl6ZXJDb25maWcuc2V0QWRkU3R5bGVTaGVldChhZGRTdHlsZVNoZWV0KTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgImNvbmZpZzA2IiwKLSAgICAgICAgICAgIG5leHRFbGVtZW50LmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgIkludmFsaWQgYW5hbHl6ZXIgY29uZmlnIGVsZW1lbnQ6IikpOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgbmV4dCBlbGVtZW50Ci0gICAgICBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKG5leHRFbGVtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2Ugd3NkbCByZWZlcmVuY2UgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwYXJzZVdzZGxSZWZlcmVuY2UoCi0gICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWcsCi0gICAgRWxlbWVudCBlbGVtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBVRERJIHJlZmVyZW5jZQotICAgIFdTRExSZWZlcmVuY2Ugd3NkbFJlZmVyZW5jZSA9IG5ldyBXU0RMUmVmZXJlbmNlSW1wbCgpOwotCi0gICAgLy8gU2V0IFdTREwgcmVmZXJlbmNlCi0gICAgYW5hbHl6ZXJDb25maWcuc2V0V1NETFJlZmVyZW5jZSh3c2RsUmVmZXJlbmNlKTsKLQotICAgIC8vIEdldCBmaXJzdCBjaGlsZCBlbGVtZW50Ci0gICAgRWxlbWVudCBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIHdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIDx3c2RsVVJJPgotICAgICAgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9VUkkpKQotICAgICAgewotICAgICAgICAvLyBTZXQgV1NETCBsb2NhdGlvbgotICAgICAgICB3c2RsUmVmZXJlbmNlLnNldFdTRExMb2NhdGlvbihYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxzZXJ2aWNlTG9jYXRpb24+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1NFUlZJQ0VfTE9DQVRJT04pKQotICAgICAgewotICAgICAgICAvLyBTZXQgc2VydmljZSBsb2NhdGlvbgotICAgICAgICB3c2RsUmVmZXJlbmNlLnNldFNlcnZpY2VMb2NhdGlvbihYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDx3c2RsRWxlbWVudD4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9FTEVNRU5UKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2V0IFdTREwgZWxlbWVudAotICAgICAgICB3c2RsUmVmZXJlbmNlLnNldFdTRExFbGVtZW50KHBhcnNlV3NkbEVsZW1lbnQobmV4dEVsZW1lbnQpKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgImNvbmZpZzA2IiwKLSAgICAgICAgICAgIG5leHRFbGVtZW50LmdldExvY2FsTmFtZSgpLAotICAgICAgICAgICAgIkludmFsaWQgYW5hbHl6ZXIgY29uZmlnIGVsZW1lbnQ6IikpOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgbmV4dCBlbGVtZW50Ci0gICAgICBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKG5leHRFbGVtZW50KTsKLSAgICB9Ci0KLSAgICAvLyBJZiBXU0RMIGVsZW1lbnQgb3IgV1NMIFVSSSBub3Qgc3BlY2lmaWVkLCB0aGVuIHRocm93IGV4Y2VwdGlvbgotICAgIGlmICgod3NkbFJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpID09IG51bGwpCi0gICAgICB8fCAod3NkbFJlZmVyZW5jZS5nZXRXU0RMTG9jYXRpb24oKSA9PSBudWxsKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcwNyIsCi0gICAgICAgICAgIkJvdGggdGhlIDx3c2RsRWxlbWVudD4gYW5kIDx3c2RsVVJJPiBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4iKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgdHlwZSBpcyBwb3J0IG9yIG9wZXJhdGlvbiwgdGhlbiBwYXJlbnQgZWxlbWVudCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgaWYgKCgod3NkbFJlZmVyZW5jZQotICAgICAgLmdldFdTRExFbGVtZW50KCkKLSAgICAgIC5nZXRUeXBlKCkKLSAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1BPUlQpKQotICAgICAgfHwgKHdzZGxSZWZlcmVuY2UKLSAgICAgICAgLmdldFdTRExFbGVtZW50KCkKLSAgICAgICAgLmdldFR5cGUoKQotICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04pKSkKLSAgICAgICYmICh3c2RsUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudE5hbWUoKSA9PSBudWxsKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcwOSIsCi0gICAgICAgICAgIlRoZSBwYXJlbnRFbGVtZW50TmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCBhIFdTREwgdHlwZSBvZiAiCi0gICAgICAgICAgICArIEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1BPUlQKLSAgICAgICAgICAgICsgIiBvciAiCi0gICAgICAgICAgICArIEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTgotICAgICAgICAgICAgKyAiLiIpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgdWRkaSByZWZlcmVuY2UuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcGFyc2VVZGRpUmVmZXJlbmNlKAotICAgIEFuYWx5emVyQ29uZmlnIGFuYWx5emVyQ29uZmlnLAotICAgIEVsZW1lbnQgZWxlbWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgVURESSByZWZlcmVuY2UKLSAgICBVRERJUmVmZXJlbmNlIHVkZGlSZWZlcmVuY2UgPSBuZXcgVURESVJlZmVyZW5jZUltcGwoKTsKLQotICAgIC8vIFNldCBVRERJIHJlZmVyZW5jZQotICAgIGFuYWx5emVyQ29uZmlnLnNldFVERElSZWZlcmVuY2UodWRkaVJlZmVyZW5jZSk7Ci0KLSAgICAvLyBHZXQgZmlyc3QgY2hpbGQgZWxlbWVudAotICAgIEVsZW1lbnQgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW1lbnQpOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICB3aGlsZSAobmV4dEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyA8aW5xdWlyeVVSTD4KLSAgICAgIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0lOUVVJUllfVVJMKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2V0IGlucXVpcnkgVVJMCi0gICAgICAgIHVkZGlSZWZlcmVuY2Uuc2V0SW5xdWlyeVVSTChYTUxVdGlscy5nZXRUZXh0KG5leHRFbGVtZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDx1ZGRpS2V5PgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9VRERJX0tFWSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFNldCBVRERJIGtleSBhbmQga2V5IHR5cGUKLSAgICAgICAgdWRkaVJlZmVyZW5jZS5zZXRLZXkoWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgICB1ZGRpUmVmZXJlbmNlLnNldEtleVR5cGUoCi0gICAgICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5BVFRSX1RZUEUpKTsKLSAgICAgIH0KLQotICAgICAgLy8gPHdzZGxFbGVtZW50PgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9XU0RMX0VMRU1FTlQpKQotICAgICAgewotICAgICAgICAvLyBTZXQgV1NETCBlbGVtZW50Ci0gICAgICAgIHVkZGlSZWZlcmVuY2Uuc2V0V1NETEVsZW1lbnQocGFyc2VXc2RsRWxlbWVudChuZXh0RWxlbWVudCkpOwotICAgICAgfQotCi0gICAgICAvLyA8c2VydmljZUxvY2F0aW9uPgotICAgICAgZWxzZSBpZiAoaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9TRVJWSUNFX0xPQ0FUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2V0IHNlcnZpY2UgbG9jYXRpb24KLSAgICAgICAgdWRkaVJlZmVyZW5jZS5zZXRTZXJ2aWNlTG9jYXRpb24oWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgfQotCi0gICAgICAvKiBSRU1PVkU6Ci0gICAgICAvLyA8d3NkbEVsZW1lbnQ+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1dTRExfRUxFTUVOVCkpIHsKLSAgICAgICAgLy8gU2V0IHNlcnZpY2UgbG9jYXRpb24KLSAgICAgICAgcGFyc2VXc2RsRWxlbWVudChhbmFseXplckNvbmZpZywgbmV4dEVsZW1lbnQpOwotICAgICAgIH0KLSAgICAgICAqLwotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAiY29uZmlnMDYiLAotICAgICAgICAgICAgbmV4dEVsZW1lbnQuZ2V0TG9jYWxOYW1lKCksCi0gICAgICAgICAgICAiSW52YWxpZCBhbmFseXplciBjb25maWcgZWxlbWVudDoiKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldCBuZXh0IGVsZW1lbnQKLSAgICAgIG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcobmV4dEVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBXU0RMIGVsZW1lbnQuCi0gICAqLwotICBwcml2YXRlIFdTRExFbGVtZW50IHBhcnNlV3NkbEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IG5ldyBXU0RMRWxlbWVudEltcGwoKTsKLQotICAgIC8vIFNldCB0eXBlLCBuYW1lc3BhY2UsIHBhcmVudCBlbGVtZW50IG5hbWUgYW5kIG5hbWUKLSAgICB3c2RsRWxlbWVudC5zZXRUeXBlKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSkpOwotICAgIHdzZGxFbGVtZW50LnNldE5hbWVzcGFjZSgKLSAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIFdTSUNvbnN0YW50cy5BVFRSX05BTUVTUEFDRSkpOwotICAgIHdzZGxFbGVtZW50LnNldFBhcmVudEVsZW1lbnROYW1lKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoCi0gICAgICAgIGVsZW1lbnQsCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1BBUkVOVF9FTEVNRU5UX05BTUUpKTsKLQotICAgIFN0cmluZyB3c2RsRWxlbWVudE5hbWUgPSBYTUxVdGlscy5nZXRUZXh0KGVsZW1lbnQpOwotICAgIGlmICh3c2RsRWxlbWVudE5hbWUuZXF1YWxzKCIiKSkKLSAgICB7Ci0gICAgICAvLyBUaHJvdyBleGNlcHRpb24KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoImNvbmZpZzE5IiwgIlRoZSBXU0RMIGVsZW1lbnQgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4iKSk7Ci0gICAgfQotICAgIHdzZGxFbGVtZW50LnNldE5hbWUod3NkbEVsZW1lbnROYW1lKTsKLQotICAgIHJldHVybiB3c2RsRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhpcyBlbGVtZW50IG1hdGNoZXMgc3BlY2lmaWVkIGxvY2FsIG5hbWUgaW4gdGhlIGFuYWx5emVyIGNvbmZpZyBuYW1lc3BhY2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIHJldHVybiBpc0VsZW1lbnQoCi0gICAgICBlbGVtZW50LAotICAgICAgZ2V0VmFsaWRXU0lBbmFseXplckNvbmZpZ05hbWVzcGFjZXMoKSwKLSAgICAgIGxvY2FsTmFtZSk7Ci0gIH0KLQotICAKLSAgc3RhdGljIHB1YmxpYyBMaXN0IGdldFZhbGlkV1NJQW5hbHl6ZXJDb25maWdOYW1lc3BhY2VzKCkKLSAgewotICAJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlsaXN0LmFkZChXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9BTkFMWVpFUl9DT05GSUdfMjAwMyk7Ci0gIAlsaXN0LmFkZChXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9BTkFMWVpFUl9DT05GSUcpOwotICAJcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhpcyBlbGVtZW50IG1hdGNoZXMgc3BlY2lmaWVkIGxvY2FsIG5hbWUgaW4gdGhlIGFuYWx5emVyIGNvbmZpZyBuYW1lc3BhY2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNFbGVtZW50KAotICAgIEVsZW1lbnQgZWxlbWVudCwKLSAgICBMaXN0IG5hbWVzcGFjZXMsCi0gICAgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIHJldHVybiBYTUxVdGlscy5pc0VsZW1lbnQoZWxlbWVudCwgbmFtZXNwYWNlcywgbG9jYWxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhpcyBlbGVtZW50IG1hdGNoZXMgc3BlY2lmaWVkIGxvY2FsIG5hbWUgaW4gdGhlIGFuYWx5emVyIGNvbmZpZyBuYW1lc3BhY2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNFbGVtZW50KAotICAgIEVsZW1lbnQgZWxlbWVudCwKLSAgICBTdHJpbmcgbmFtZXNwYWNlLAotICAgIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICByZXR1cm4gWE1MVXRpbHMuaXNFbGVtZW50KGVsZW1lbnQsIG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbWVzc2FnZSBmcm9tIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJRCwgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2UobWVzc2FnZUlELCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG1lc3NhZ2UgZnJvbSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKAotICAgIFN0cmluZyBtZXNzYWdlSUQsCi0gICAgU3RyaW5nIG1lc3NhZ2VEYXRhLAotICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIFN0cmluZyBtZXNzYWdlID0gZGVmYXVsdE1lc3NhZ2U7Ci0gICAgaWYgKG1lc3NhZ2VMaXN0ICE9IG51bGwpCi0gICAgICBtZXNzYWdlID0gbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZShtZXNzYWdlSUQsIG1lc3NhZ2VEYXRhLCBkZWZhdWx0TWVzc2FnZSk7Ci0gICAgZWxzZQotICAgICAgbWVzc2FnZSArPSAiICIgKyBtZXNzYWdlRGF0YSArICIuIjsKLQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvQXNzZXJ0aW9uUmVzdWx0c09wdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9Bc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmUzZDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9Bc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBJQk0gQ29ycG9yYXRpb24sIFBhcmFzb2Z0IGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBQYXJhc29mdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQXNzZXJ0aW9uUmVzdWx0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFzc2VydGlvblJlc3VsdHNPcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uIGRlZmluaXRpb24uCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEFzc2VydGlvblJlc3VsdHNPcHRpb25JbXBsIGltcGxlbWVudHMgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbgotewotICAvKioKLSAgICogQXNzZXJ0aW9uIHJlc3VsdCB0eXBlLgotICAgKi8KLSAgcHJvdGVjdGVkIEFzc2VydGlvblJlc3VsdFR5cGUgcmVzdWx0VHlwZSA9IEFzc2VydGlvblJlc3VsdFR5cGUuQUxMOwotCi0gIC8qKgotICAgKiBTaG93IG1lc3NhZ2UgZW50cnkgaW5kaWNhdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd01lc3NhZ2VFbnRyeSA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIFNob3cgYXNzZXJ0aW9uIGRlc2NyaXB0aW9uIGluZGljYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3dBc3NlcnRpb25EZXNjcmlwdGlvbiA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBTaG93IGZhaWx1cmUgbWVzc2FnZSBpbmRpY2F0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG93RmFpbHVyZU1lc3NhZ2UgPSB0cnVlOwotCi0gIC8qKgotICAgKiBTaG93IGZhaWx1cmUgZGV0YWlsIGluZGljYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNob3dGYWlsdXJlRGV0YWlsID0gdHJ1ZTsKLQotICAvKioKLSAgICogR2V0IGFzc2VydGlvbiByZXN1bHQgdHlwZS4KLSAgICogQHNlZSAjc2V0QXNzZXJ0aW9uUmVzdWx0VHlwZQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdFR5cGUgZ2V0QXNzZXJ0aW9uUmVzdWx0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gcmVzdWx0VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgYXNzZXJ0aW9uIHJlc3VsdCB0eXBlLgotICAgKiBAc2VlICNnZXRBc3NlcnRpb25SZXN1bHRUeXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb25SZXN1bHRUeXBlKEFzc2VydGlvblJlc3VsdFR5cGUgcmVzdWx0VHlwZSkKLSAgewotICAgIHRoaXMucmVzdWx0VHlwZSA9IHJlc3VsdFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHNob3cgbWVzc2FnZSBlbnRyeSBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI3NldFNob3dNZXNzYWdlRW50cnkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dNZXNzYWdlRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2hvd01lc3NhZ2VFbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgc2hvdyBtZXNzYWdlIGVudHJ5IGluZGljdG9yLgotICAgKiBAc2VlICNnZXRTaG93TWVzc2FnZUVudHJ5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93TWVzc2FnZUVudHJ5KGJvb2xlYW4gc2hvd01lc3NhZ2VFbnRyeSkKLSAgewotICAgIHRoaXMuc2hvd01lc3NhZ2VFbnRyeSA9IHNob3dNZXNzYWdlRW50cnk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHNob3cgYXNzZXJ0aW9uIGRlc2NyaXB0aW9uIGluZGljYXRvci4KLSAgICogQHNlZSAjc2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBnZXRTaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBzaG93IGFzc2VydGlvbiBkZXNjcmlwdGlvbiBpbmRpY3Rvci4KLSAgICogQHNlZSAjZ2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24oYm9vbGVhbiBzaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLnNob3dBc3NlcnRpb25EZXNjcmlwdGlvbiA9IHNob3dBc3NlcnRpb25EZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc2hvdyBmYWlsdXJlIG1lc3NhZ2UgaW5kaWNhdG9yLgotICAgKiBAc2VlICNzZXRTaG93RmFpbHVyZU1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dGYWlsdXJlTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5zaG93RmFpbHVyZU1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHNob3cgZmFpbHVyZSBtZXNhZ2UgaW5kaWNhdG9yLgotICAgKiBAc2VlICNnZXRTaG93RmFpbHVyZU1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dGYWlsdXJlTWVzc2FnZShib29sZWFuIHNob3dGYWlsdXJlTWVzc2FnZSkKLSAgewotICAgIHRoaXMuc2hvd0ZhaWx1cmVNZXNzYWdlID0gc2hvd0ZhaWx1cmVNZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzaG93IGZhaWx1cmUgZGV0YWlsIGluZGljYXRvci4KLSAgICogQHNlZSAjc2V0U2hvd0ZhaWx1cmVEZXRhaWwKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFNob3dGYWlsdXJlRGV0YWlsKCkKLSAgewotICAgIHJldHVybiB0aGlzLnNob3dGYWlsdXJlRGV0YWlsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBzaG93IGZhaWx1cmUgZGV0YWlsIGluZGljYXRvci4KLSAgICogQHNlZSAjZ2V0U2hvd0ZhaWx1cmVEZXRhaWwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNob3dGYWlsdXJlRGV0YWlsKGJvb2xlYW4gc2hvd0ZhaWx1cmVEZXRhaWwpCi0gIHsKLSAgICB0aGlzLnNob3dGYWlsdXJlRGV0YWlsID0gc2hvd0ZhaWx1cmVEZXRhaWw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIHB3LnByaW50bG4oIiAgQXNzZXJ0aW9uIFJlc3VsdHM6Iik7Ci0gICAgcHcucHJpbnRsbigiICAgIHR5cGUgLi4uLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLnJlc3VsdFR5cGUpOwotICAgIHB3LnByaW50bG4oIiAgICBtZXNzYWdlRW50cnkgLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5zaG93TWVzc2FnZUVudHJ5KTsKLSAgICBwdy5wcmludGxuKAotICAgICAgIiAgICBhc3NlcnRpb25EZXNjcmlwdGlvbiAuLi4uLiAiICsgdGhpcy5zaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24pOwotICAgIHB3LnByaW50bG4oIiAgICBmYWlsdXJlTWVzc2FnZSAuLi4uLi4uLi4uLiAiICsgdGhpcy5zaG93RmFpbHVyZU1lc3NhZ2UpOwotICAgIHB3LnByaW50bG4oIiAgICBmYWlsdXJlRGV0YWlsIC4uLi4uLi4uLi4uLiAiICsgdGhpcy5zaG93RmFpbHVyZURldGFpbCk7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QgYXMgYW4gWE1MIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENvbmZpZyBvcHRpb25zCi0gICAgcHcucHJpbnQoIiAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fQVNTRVJUSU9OX1JFU1VMVFMgKyAiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX1RZUEUgKyAiPVwiIiArIGdldEFzc2VydGlvblJlc3VsdFR5cGUoKSArICJcIiAiKTsKLSAgICBwdy5wcmludCgKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX01FU1NBR0VfRU5UUlkgKyAiPVwiIiArIGdldFNob3dNZXNzYWdlRW50cnkoKSArICJcIiAiKTsKLSAgICBwdy5wcmludCgKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0FTU0VSVElPTl9ERVNDUklQVElPTgotICAgICAgICArICI9XCIiCi0gICAgICAgICsgZ2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKCkKLSAgICAgICAgKyAiXCIgIik7Ci0gICAgcHcucHJpbnQoCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9GQUlMVVJFX01FU1NBR0UKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIGdldFNob3dGYWlsdXJlTWVzc2FnZSgpCi0gICAgICAgICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9GQUlMVVJFX0RFVEFJTAotICAgICAgICArICI9XCIiCi0gICAgICAgICsgZ2V0U2hvd0ZhaWx1cmVEZXRhaWwoKQotICAgICAgICArICJcIi8+Iik7Ci0gICAgLy8gUkVNT1ZFOgotICAgIC8vcHcucHJpbnRsbihXU0lDb25zdGFudHMuQVRUUl9XQVJOSU5HX01FU1NBR0UgKyAiPVwiIiArIGdldFNob3dXYXJuaW5nTWVzc2FnZSgpICsgIlwiLz4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvVURESVJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9VRERJUmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM3YjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9VRERJUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLlVERElSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMRWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaWltcGxlbWVudGF0aW9uIGZvciBhIHJlZmVyZW5jZSB0byBhIGRpc2NvdmVyeSBhcnRpZmFjdC4gIAotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgVURESVJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBVRERJUmVmZXJlbmNlCi17Ci0gIC8qKgotICAgKiBVRERJIGtleSB0eXBlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBrZXlUeXBlID0gbnVsbDsKLQotICAvKioKLSAgICogVURESSBrZXkuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGtleSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFVEREkgaW5xdWlyeSBVUkwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGlucXVpcnlVUkwgPSBudWxsOwotCi0gIC8qKgotICAgKiBXU0RMIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSBudWxsOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlIGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlTG9jYXRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuVURESVJlZmVyZW5jZSNnZXRLZXlUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2V5VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5rZXlUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlI3NldEtleVR5cGUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0S2V5VHlwZShTdHJpbmcga2V5VHlwZSkKLSAgewotICAgIGlmIChrZXlUeXBlLmVxdWFscyhCSU5ESU5HX0tFWSkgfHwga2V5VHlwZS5lcXVhbHMoVE1PREVMX0tFWSkpCi0gICAgICB0aGlzLmtleVR5cGUgPSBrZXlUeXBlOwotICAgIGVsc2UKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJJbnZhbGlkIFVEREkga2V5IHR5cGU6IFsiICsga2V5VHlwZSArICJdLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlI2dldEtleSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5rZXk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLlVERElSZWZlcmVuY2Ujc2V0S2V5KFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KQotICB7Ci0gICAgdGhpcy5rZXkgPSBrZXk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLlVERElSZWZlcmVuY2UjZ2V0SW5xdWlyeVVSTCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElucXVpcnlVUkwoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuaW5xdWlyeVVSTDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuVURESVJlZmVyZW5jZSNzZXRJbnF1aXJ5VVJMKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElucXVpcnlVUkwoU3RyaW5nIGlucXVpcnlVUkwpCi0gIHsKLSAgICB0aGlzLmlucXVpcnlVUkwgPSBpbnF1aXJ5VVJMOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlI2dldFdTRExFbGVtZW50KCkKLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudCBnZXRXU0RMRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy53c2RsRWxlbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETFJlZmVyZW5jZSNzZXRXU0RMRWxlbWVudChXU0RMRWxlbWVudCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdTRExFbGVtZW50KFdTRExFbGVtZW50IHdzZGxFbGVtZW50KQotICB7Ci0gICAgdGhpcy53c2RsRWxlbWVudCA9IHdzZGxFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlI2dldFNlcnZpY2VMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5zZXJ2aWNlTG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2Ujc2V0U2VydmljZUxvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFNlcnZpY2VMb2NhdGlvbihTdHJpbmcgc2VydmljZUxvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5zZXJ2aWNlTG9jYXRpb24gPSBzZXJ2aWNlTG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIHB3LnByaW50bG4oIiAgVURESSBSZWZlcmVuY2U6ICIpOwotICAgIHB3LnByaW50bG4oIiAgICBVRERJIEtleTogIik7Ci0gICAgcHcucHJpbnRsbigiICAgICAgdHlwZSAuLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmtleVR5cGUpOwotICAgIHB3LnByaW50bG4oIiAgICAgIGtleSAuLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5rZXkpOwotICAgIHB3LnByaW50bG4oIiAgICBpbnF1aXJ5VVJMIC4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5pbnF1aXJ5VVJMKTsKLSAgICBpZiAodGhpcy5zZXJ2aWNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHB3LnByaW50bG4oIiAgICBzZXJ2aWNlTG9jYXRpb24gLi4uLi4uLi4uLiAiICsgdGhpcy5zZXJ2aWNlTG9jYXRpb24pOwotICAgIGlmICh0aGlzLndzZGxFbGVtZW50ICE9IG51bGwpCi0gICAgICBwdy5wcmludCh0aGlzLndzZGxFbGVtZW50LnRvU3RyaW5nKCkpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIEVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0gICAgcHcucHJpbnQoIiAgICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9VRERJX0tFWSArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSArICI9XCIiICsgZ2V0S2V5VHlwZSgpICsgIlwiPiIpOwotICAgIHB3LnByaW50KGdldEtleSgpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9VRERJX0tFWSArICI+Iik7Ci0gICAgcHcucHJpbnQoIiAgICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9JTlFVSVJZX1VSTCArICI+Iik7Ci0gICAgcHcucHJpbnQoZ2V0SW5xdWlyeVVSTCgpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9JTlFVSVJZX1VSTCArICI+Iik7Ci0KLSAgICBpZiAodGhpcy53c2RsRWxlbWVudCAhPSBudWxsKQotICAgICAgcHcucHJpbnQoZ2V0V1NETEVsZW1lbnQoKS50b1hNTFN0cmluZyhuc05hbWUpKTsKLQotICAgIGlmICh0aGlzLnNlcnZpY2VMb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fU0VSVklDRV9MT0NBVElPTiArICI+Iik7Ci0gICAgICBwdy5wcmludChnZXRTZXJ2aWNlTG9jYXRpb24oKSk7Ci0gICAgICBwdy5wcmludGxuKAotICAgICAgICAiICAgICAgICA8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9TRVJWSUNFX0xPQ0FUSU9OICsgIj4iKTsKLSAgICB9Ci0KLSAgICBwdy5wcmludGxuKCIgICAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2FuYWx5emVyL2NvbmZpZy9pbXBsL1dTRExFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjE0Yjg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9XU0RMRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FbnRyeVR5cGU7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIGZvciBXU0RMIGRlZmluaXRpb25zLiAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFdTRExFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdTRExFbGVtZW50Ci17Ci0gIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZTsKLQotICAvKioKLSAgICogQHNlZSAjc2V0VHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiB0aGlzLnR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjZ2V0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjc2V0TmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSAjZ2V0TmFtZXNwYWNlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI3NldE5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5uYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgI2dldE5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIFFOYW1lIGdldFFOYW1lKCkKLSAgewotICAgIHJldHVybiBuZXcgUU5hbWUodGhpcy5uYW1lc3BhY2UsIHRoaXMubmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFdTREwgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHNlZSAjc2V0UGFyZW50RWxlbWVudE5hbWUKLSAgCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudEVsZW1lbnROYW1lKCkKLSAgewotICAgIHJldHVybiB0aGlzLnBhcmVudEVsZW1lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBzZWUgI2dldFBhcmVudEVsZW1lbnROYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50TmFtZShTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUpCi0gIHsKLSAgICB0aGlzLnBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QuYW5hbHl6ZXIuY29uZmlnLldTRExFbGVtZW50I2dldFBhcmVudEVsZW1lbnRRTmFtZSgpCi0gICAqLwotICBwdWJsaWMgUU5hbWUgZ2V0UGFyZW50RWxlbWVudFFOYW1lKCkKLSAgewotICAgIHJldHVybiBuZXcgUU5hbWUodGhpcy5uYW1lc3BhY2UsIHRoaXMucGFyZW50RWxlbWVudE5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIHBvcnQgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUG9ydCgpCi0gIHsKLSAgICByZXR1cm4gdHlwZS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVCk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgYmluZGluZyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiB0eXBlLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9CSU5ESU5HKTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyBwb3J0VHlwZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNQb3J0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdHlwZS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVFRZUEUpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIG9wZXJhdGlvbiBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHR5cGUuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTik7Ci0gIH0KLQotICAvKioKLSAgICogSXMgbWVzc2FnZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiB0eXBlLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9NRVNTQUdFKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgcHcucHJpbnRsbigiICAgIFdTREwgRWxlbWVudDogIik7Ci0gICAgcHcucHJpbnRsbigiICAgICAgdHlwZSAuLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLnR5cGUpOwotICAgIHB3LnByaW50bG4oIiAgICAgIG5hbWVzcGFjZSAuLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5uYW1lc3BhY2UpOwotICAgIHB3LnByaW50bG4oIiAgICAgIG5hbWUgLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5uYW1lKTsKLQotICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgICBwdy5wcmludGxuKCIgICAgICBwYXJlbnRFbGVtZW50TmFtZSAuLi4uLi4gIiArIHRoaXMucGFyZW50RWxlbWVudE5hbWUpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0IGFzIGFuIFhNTCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDb25maWcgb3B0aW9ucwotICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIiAiKTsKLSAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9UWVBFICsgIj1cIiIgKyBnZXRUeXBlKCkgKyAiXCIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRVNQQUNFICsgIj1cIiIgKyBnZXROYW1lc3BhY2UoKSArICJcIiAiKTsKLSAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50TmFtZSAhPSBudWxsKQotICAgICAgcHcucHJpbnQoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1BBUkVOVF9FTEVNRU5UX05BTUUKLSAgICAgICAgICArICI9XCIiCi0gICAgICAgICAgKyBnZXRQYXJlbnRFbGVtZW50TmFtZSgpCi0gICAgICAgICAgKyAiXCIiKTsKLSAgICBwdy5wcmludCgiPiIpOwotICAgIHB3LnByaW50KGdldE5hbWUoKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvYW5hbHl6ZXIvY29uZmlnL2ltcGwvV1NETFJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9XU0RMUmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJmZjQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9hbmFseXplci9jb25maWcvaW1wbC9XU0RMUmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIGZvciBhIHJlZmVyZW5jZSB0byBhIGRlc2NyaXB0aW9uIGFydGlmYWN0LiAgCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUmVmZXJlbmNlSW1wbCBpbXBsZW1lbnRzIFdTRExSZWZlcmVuY2UKLXsKLSAgLyoqCi0gICAqIFdTREwgZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VMb2NhdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETFJlZmVyZW5jZUltcGwoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3Igd2l0aCBhbGwgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSB3c2RsRWxlbWVudCAgICAgIGEgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gd3NkbExvY2F0aW9uICAgICBhIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBzZXJ2aWNlTG9jYXRpb24gIGEgc2VydmljZSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0RMUmVmZXJlbmNlSW1wbCgKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCwKLSAgICBTdHJpbmcgd3NkbExvY2F0aW9uLAotICAgIFN0cmluZyBzZXJ2aWNlTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLndzZGxFbGVtZW50ID0gd3NkbEVsZW1lbnQ7Ci0gICAgdGhpcy53c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247Ci0gICAgdGhpcy5zZXJ2aWNlTG9jYXRpb24gPSBzZXJ2aWNlTG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2UjZ2V0V1NETEVsZW1lbnQoKQotICAgKi8KLSAgcHVibGljIFdTRExFbGVtZW50IGdldFdTRExFbGVtZW50KCkKLSAgewotICAgIHJldHVybiB0aGlzLndzZGxFbGVtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlI3NldFdTRExFbGVtZW50KFdTRExFbGVtZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETEVsZW1lbnQoV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQpCi0gIHsKLSAgICB0aGlzLndzZGxFbGVtZW50ID0gd3NkbEVsZW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExSZWZlcmVuY2UjZ2V0V1NETExvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLndzZGxMb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETFJlZmVyZW5jZSNzZXRXU0RMTG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETExvY2F0aW9uKFN0cmluZyB3c2RsTG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLndzZGxMb2NhdGlvbiA9IHdzZGxMb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETFJlZmVyZW5jZSNnZXRTZXJ2aWNlTG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2VydmljZUxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlI3NldFNlcnZpY2VMb2NhdGlvbigpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTG9jYXRpb24oU3RyaW5nIHNlcnZpY2VMb2NhdGlvbikKLSAgewotICAgIHRoaXMuc2VydmljZUxvY2F0aW9uID0gc2VydmljZUxvY2F0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBwdy5wcmludGxuKCIgIFdTREwgUmVmZXJlbmNlOiIpOwotICAgIHB3LnByaW50KHRoaXMud3NkbEVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgcHcucHJpbnRsbigiICAgIHdzZGxVUkkgLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLndzZGxMb2NhdGlvbik7Ci0gICAgaWYgKHRoaXMuc2VydmljZUxvY2F0aW9uICE9IG51bGwpCi0gICAgICBwdy5wcmludGxuKCIgIHNlcnZpY2VMb2NhdGlvbiAuLi4uLi4uLi4uICIgKyB0aGlzLnNlcnZpY2VMb2NhdGlvbik7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gRWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLSAgICBwdy5wcmludChnZXRXU0RMRWxlbWVudCgpLnRvWE1MU3RyaW5nKG5zTmFtZSkpOwotICAgIHB3LnByaW50KCIgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9VUkkgKyAiPiIpOwotICAgIHB3LnByaW50KGdldFdTRExMb2NhdGlvbigpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9XU0RMX1VSSSArICI+Iik7Ci0KLSAgICBpZiAodGhpcy5zZXJ2aWNlTG9jYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludCgiICAgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1NFUlZJQ0VfTE9DQVRJT04gKyAiPiIpOwotICAgICAgcHcucHJpbnQoWE1MVXRpbHMueG1sRXNjYXBlZFN0cmluZyhnZXRTZXJ2aWNlTG9jYXRpb24oKSkpOwotICAgICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fU0VSVklDRV9MT0NBVElPTiArICI+Iik7Ci0gICAgfQotCi0gICAgcHcucHJpbnRsbigiICAgICAgPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9jb21tb24vQWRkU3R5bGVTaGVldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2NvbW1vbi9BZGRTdHlsZVNoZWV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZGY3ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2NvbW1vbi9BZGRTdHlsZVNoZWV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBBZGRTdHlsZVNoZWV0IGVsZW1lbnQuIAotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFkZFN0eWxlU2hlZXQgZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIEVsZW1lbnQgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fTkFNRSA9IFdTSUNvbnN0YW50cy5FTEVNX0FERF9TVFlMRV9TSEVFVDsKLQotICAvKioKLSAgICogR2V0IGhyZWYuCi0gICAqIEByZXR1cm4gaHJlZi4KLSAgICogQHNlZSAjc2V0SHJlZgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIcmVmKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBocmVmLgotICAgKiBAcGFyYW0gaHJlZiBhIGhyZWYuCi0gICAqIEBzZWUgI2dldEhyZWYKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpOwotCi0gIC8qKgotICAgKiBHZXQgdHlwZS4KLSAgICogQHJldHVybiB0eXBlLgotICAgKiBAc2VlICNzZXRUeXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLQotICAvKioKLSAgICogU2V0IHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlIGEgdHlwZS4KLSAgICogQHNlZSAjZ2V0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aXRsZS4KLSAgICogQHJldHVybiB0aXRsZS4KLSAgICogQHNlZSAjc2V0VGl0bGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKTsKLQotICAvKioKLSAgICogU2V0IHRpdGxlLgotICAgKiBAcGFyYW0gdGl0bGUgYSB0aXRsZS4KLSAgICogQHNlZSAjZ2V0VGl0bGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBtZWRpYS4KLSAgICogQHJldHVybiBtZWRpYS4KLSAgICogQHNlZSAjc2V0TWVkaWEKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVkaWEoKTsKLQotICAvKioKLSAgICogU2V0IHRpdGxlLgotICAgKiBAcGFyYW0gbWVkaWEgbWVkaWEuCi0gICAqIEBzZWUgI2dldE1lZGlhCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZWRpYShTdHJpbmcgbWVkaWEpOwotCi0gIC8qKgotICAgKiBHZXQgY2hhcnNldC4KLSAgICogQHJldHVybiBjaGFyc2V0LgotICAgKiBAc2VlICNzZXRDaGFyc2V0Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENoYXJzZXQoKTsKLQotICAvKioKLSAgICogU2V0IGNoYXJzZXQuCi0gICAqIEBwYXJhbSBjaGFyc2V0IGNoYXJzZXQuCi0gICAqIEBzZWUgI2dldENoYXJzZXQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENoYXJzZXQoU3RyaW5nIGNoYXJzZXQpOwotCi0gIC8qKgotICAgKiBHZXQgYWx0ZXJuYXRlLgotICAgKiBAcmV0dXJuIGFsdGVybmF0ZS4KLSAgICogQHNlZSAjc2V0QWx0ZXJuYXRlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0ZSgpOwotCi0gIC8qKgotICAgKiBTZXQgYWx0ZXJuYXRlLgotICAgKiBAcGFyYW0gYWx0ZXJuYXRlIGFsdGVybmF0ZS4KLSAgICogQHNlZSAjZ2V0QWx0ZXJuYXRlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGUoU3RyaW5nIGFsdGVybmF0ZSk7Ci0KLSAgLyoqCi0gICAqIFNldCBpZiB0aGUgc3R5bGUgc2hlZXQgZGVjbGFyYXRpb24gc2hvdWxkIGJlIGEgY29tbWVudC4KLSAgICogQHBhcmFtIGNvbW1lbnQgYSBib29sZWFuLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tbWVudChib29sZWFuIGNvbW1lbnQpOwotCi0gIC8qKgotICAgKiBHZXQgc3R5bGUgc2hlZXQgZGVjbGFyYXRpb24uCi0gICAqIEByZXR1cm4gc3R5bGUgc2hlZXQgZGVjbGFyYXRpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlU2hlZXRTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9jb21tb24vaW1wbC9BZGRTdHlsZVNoZWV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2NvbW1vbi9pbXBsL0FkZFN0eWxlU2hlZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjVkMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2NvbW1vbi9pbXBsL0FkZFN0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgQWRkU3R5bGVTaGVldCBlbGVtZW50LiAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEFkZFN0eWxlU2hlZXRJbXBsIGltcGxlbWVudHMgQWRkU3R5bGVTaGVldAotewotICAvKioKLSAgICogQXR0cmlidXRlIHZhbHVlcy4KLSAgICovCi0gIHByb3RlY3RlZCBUcmVlTWFwIGF0dHJpYnV0ZVZhbHVlTGlzdCA9IG5ldyBUcmVlTWFwKCk7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2YgYXR0cmlidXRlcy4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBhdHRyaWJ1dGVOYW1lTGlzdCA9Ci0gICAgewotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfSFJFRiwKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1RZUEUsCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9USVRMRSwKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX01FRElBLAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfQ0hBUlNFVCwKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0FMVEVSTkFURSB9OwotCi0gIC8qKgotICAgKiBTZXQgaWYgdGhlIHN0eWxlIHNoZWV0IGRlY2xhcmF0aW9uIHNob3VsZCBiZSBhIGNvbW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21tZW50ID0gZmFsc2U7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNnZXRIcmVmKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SHJlZigpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgdGhpcy5hdHRyaWJ1dGVWYWx1ZUxpc3QuZ2V0KFdTSUNvbnN0YW50cy5BVFRSX0hSRUYpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNzZXRIcmVmKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlTGlzdC5wdXQoV1NJQ29uc3RhbnRzLkFUVFJfSFJFRiwgaHJlZik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I2dldFR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKSB0aGlzLmF0dHJpYnV0ZVZhbHVlTGlzdC5nZXQoV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I3NldFR5cGUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LnB1dChXU0lDb25zdGFudHMuQVRUUl9UWVBFLCB0eXBlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuY29tbW9uLkFkZFN0eWxlU2hlZXQjZ2V0VGl0bGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgdGhpcy5hdHRyaWJ1dGVWYWx1ZUxpc3QuZ2V0KFdTSUNvbnN0YW50cy5BVFRSX1RJVExFKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuY29tbW9uLkFkZFN0eWxlU2hlZXQjc2V0VGl0bGUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKQotICB7Ci0gICAgdGhpcy5hdHRyaWJ1dGVWYWx1ZUxpc3QucHV0KFdTSUNvbnN0YW50cy5BVFRSX1RJVExFLCB0aXRsZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I2dldE1lZGlhKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVkaWEoKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LmdldChXU0lDb25zdGFudHMuQVRUUl9NRURJQSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I3NldE1lZGlhKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1lZGlhKFN0cmluZyBtZWRpYSkKLSAgewotICAgIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LnB1dChXU0lDb25zdGFudHMuQVRUUl9NRURJQSwgbWVkaWEpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNnZXRDaGFyc2V0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcnNldCgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgdGhpcy5hdHRyaWJ1dGVWYWx1ZUxpc3QuZ2V0KFdTSUNvbnN0YW50cy5BVFRSX0NIQVJTRVQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5jb21tb24uQWRkU3R5bGVTaGVldCNzZXRDaGFyc2V0KFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENoYXJzZXQoU3RyaW5nIGNoYXJzZXQpCi0gIHsKLSAgICB0aGlzLmF0dHJpYnV0ZVZhbHVlTGlzdC5wdXQoV1NJQ29uc3RhbnRzLkFUVFJfQ0hBUlNFVCwgY2hhcnNldCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I2dldEFsdGVybmF0ZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0ZSgpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZykgdGhpcy5hdHRyaWJ1dGVWYWx1ZUxpc3QuZ2V0KFdTSUNvbnN0YW50cy5BVFRSX0FMVEVSTkFURSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmNvbW1vbi5BZGRTdHlsZVNoZWV0I3NldEFsdGVybmF0ZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGUoU3RyaW5nIGFsdGVybmF0ZSkKLSAgewotICAgIHRoaXMuYXR0cmlidXRlVmFsdWVMaXN0LnB1dChXU0lDb25zdGFudHMuQVRUUl9BTFRFUk5BVEUsIGFsdGVybmF0ZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIFNldCBpZiB0aGUgc3R5bGUgc2hlZXQgZGVjbGFyYXRpb24gc2hvdWxkIGJlIGEgY29tbWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoYm9vbGVhbiBjb21tZW50KQotICB7Ci0gICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuY29tbW9uLkFkZFN0eWxlU2hlZXQjZ2V0U3R5bGVTaGVldFN0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0eWxlU2hlZXRTdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIHN0eWxlU2hlZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBpZiAoY29tbWVudCkKLSAgICAgIHN0eWxlU2hlZXQuYXBwZW5kKCI8IS0tICIpOwotCi0gICAgc3R5bGVTaGVldC5hcHBlbmQoIjw/eG1sLXN0eWxlc2hlZXQiKTsKLQotICAgIFN0cmluZyB2YWx1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU5hbWVMaXN0Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgPSAoU3RyaW5nKSBhdHRyaWJ1dGVWYWx1ZUxpc3QuZ2V0KGF0dHJpYnV0ZU5hbWVMaXN0W2ldKSkKLSAgICAgICAgIT0gbnVsbCkKLSAgICAgICAgc3R5bGVTaGVldC5hcHBlbmQoIiAiICsgYXR0cmlidXRlTmFtZUxpc3RbaV0gKyAiPVwiIiArIHZhbHVlICsgIlwiIik7Ci0gICAgfQotCi0gICAgLy8gRW5kIGVsZW1lbnQKLSAgICBzdHlsZVNoZWV0LmFwcGVuZCgiID8+Iik7Ci0KLSAgICBpZiAoY29tbWVudCkKLSAgICAgIHN0eWxlU2hlZXQuYXBwZW5kKCIgLS0+Iik7Ci0KLSAgICByZXR1cm4gc3R5bGVTaGVldC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBnZXRTdHlsZVNoZWV0U3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDb25maWcgb3B0aW9ucwotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfSFJFRiArICI9XCIiICsgZ2V0SHJlZigpICsgIlwiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX1RZUEUgKyAiPVwiIiArIGdldFR5cGUoKSArICJcIiAiKTsKLSAgICBpZiAoZ2V0VGl0bGUoKSAhPSBudWxsKQotICAgICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfVElUTEUgKyAiPVwiIiArIGdldFRpdGxlKCkgKyAiXCIgIik7Ci0gICAgaWYgKGdldE1lZGlhKCkgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX01FRElBICsgIj1cIiIgKyBnZXRNZWRpYSgpICsgIlwiICIpOwotICAgIGlmIChnZXRDaGFyc2V0KCkgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX0NIQVJTRVQgKyAiPVwiIiArIGdldENoYXJzZXQoKSArICJcIiAiKTsKLSAgICBpZiAoZ2V0QWx0ZXJuYXRlKCkgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX0FMVEVSTkFURSArICI9XCIiICsgZ2V0QWx0ZXJuYXRlKCkgKyAiXCIgIik7Ci0gICAgcHcucHJpbnRsbigiLz4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudEVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2ZDI3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgZm9yIGFsbCBDb25mb3JtYW5jZSBYTUwgZG9jdW1lbnRzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBSZXR1cm4gWE1MIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgIGEgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHJldHVybiBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlOTBjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWdSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWdSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnNSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuV1NJUHJvcGVydGllczsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIGRlZmluZXMgdGhlIGZhY3RvcnkgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gCi0gKiByZWFkIGFuZCB3cml0ZSBhbGwgb2YgdGhlIENvbmZvcm1hbmNlIFhNTCBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERvY3VtZW50RmFjdG9yeQotewotICAvKioKLSAgICogR2V0IGEgbmV3IGluc3RhbmNlIG9mIGEgRG9jdW1lbnRGYWN0b3J5LgotICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGEgRG9jdW1lbnRGYWN0b3J5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgY3JlYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIERvY3VtZW50RmFjdG9yeSBuZXdJbnN0YW5jZSgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJldHVybiBpbnN0YW5jZSBvZiBmYWN0b3J5Ci0gICAgcmV0dXJuIG5ld0luc3RhbmNlKGdldEZhY3RvcnlDbGFzc05hbWUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbmV3IGluc3RhbmNlIG9mIGEgRG9jdW1lbnRGYWN0b3J5IHVzaW5nIHRoZSBzcGVjaWZpZWQKLSAgICogZmFjdG9yeSBjbGFzcyBuYW1lLgotICAgKiBAcGFyYW0gZmFjdG9yeUNsYXNzTmFtZSBmYWN0b3J5IGNsYXNzIG5hbWUuCi0gICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgYSBEb2N1bWVudEZhY3RvcnkuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBjcmVhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRG9jdW1lbnRGYWN0b3J5IG5ld0luc3RhbmNlKFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIERvY3VtZW50RmFjdG9yeSBkb2N1bWVudEZhY3RvcnkgPSBudWxsOwotCi0gICAgLy8gSWYgYSBmYWN0b3J5IGNsYXNzIG5hbWUgd2FzIHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgb2JqZWN0Ci0gICAgaWYgKGZhY3RvcnlDbGFzc05hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IGNsYXNzIG9iamVjdAotICAgICAgICBDbGFzcyBmYWN0b3J5Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGZhY3RvcnlDbGFzc05hbWUpOwotCi0gICAgICAgIC8vIENyZWF0ZSBuZXcgZmFjdG9yeQotICAgICAgICBkb2N1bWVudEZhY3RvcnkgPSAoRG9jdW1lbnRGYWN0b3J5KSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgIH0KLQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICJDb3VsZCBub3QgaW5zdGFudGlhdGUgZG9jdW1lbnQgZmFjdG9yeSBjbGFzczogIgotICAgICAgICAgICAgKyBmYWN0b3J5Q2xhc3NOYW1lCi0gICAgICAgICAgICArICIuIiwKLSAgICAgICAgICBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkEgV1NJRG9jdW1lbnRGYWN0b3J5IGltcGxlbWVudGF0aW9uIGNsYXNzIHdhcyBub3QgZm91bmQuIik7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGZhY3RvcnkKLSAgICByZXR1cm4gZG9jdW1lbnRGYWN0b3J5OwotICB9Ci0KLSAgLy8gRE9DVU1FTlQgVFlQRVMKLQotICAvKioKLSAgICogQ3JlYXRlIGxvZyBmaWxlLgotICAgKiBAcmV0dXJuIGxvZyBmaWxlLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IExvZyBuZXdMb2coKTsKLQotICAvKioKLSAgICogQ3JlYXRlIG1vbml0b3IgY29uZmlnLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgbW9uaXRvciBjb25maWcuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgTW9uaXRvckNvbmZpZyBuZXdNb25pdG9yQ29uZmlnKCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbmFseXplciBjb25maWcuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBhbmFseXplciBjb25maWcuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQW5hbHl6ZXJDb25maWcgbmV3QW5hbHl6ZXJDb25maWcoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIHByb2ZpbGUgYXNzZXJ0aW9ucy4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHByb2ZpbGUgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBQcm9maWxlQXNzZXJ0aW9ucyBuZXdQcm9maWxlQXNzZXJ0aW9ucygpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgcmVwb3J0LgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgcmVwb3J0LgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFJlcG9ydCBuZXdSZXBvcnQoKTsKLQotICAvLyBSRUFERVJTCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBwcm9maWxlIGFzc2VydGlvbnMgcmVhZGVyLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgcHJvZmlsZSBhc3NlcnRpb25zIHJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBQcm9maWxlQXNzZXJ0aW9uc1JlYWRlciBuZXdQcm9maWxlQXNzZXJ0aW9uc1JlYWRlcigpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgbW9uaXRvciBjb25maWcgcmVhZGVyLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgbW9uaXRvciBjb25maWcgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IE1vbml0b3JDb25maWdSZWFkZXIgbmV3TW9uaXRvckNvbmZpZ1JlYWRlcigpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYW5hbHl6ZXIgY29uZmlnIHJlYWRlci4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIGFuYWx5emVyIGNvbmZpZyByZWFkZXIuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQW5hbHl6ZXJDb25maWdSZWFkZXIgbmV3QW5hbHl6ZXJDb25maWdSZWFkZXIoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGxvZyByZWFkZXIuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBsb2cgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IExvZ1JlYWRlciBuZXdMb2dSZWFkZXIoKTsKLQotICAvLyBBREQ6IEFkZCBvdGhlciByZWFkZXJzCi0KLSAgLy8gV1JJVEVSUwotCi0gIC8qKgotICAgKiBDcmVhdGUgcmVwb3J0IHdyaXRlci4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHJlcG9ydCB3cml0ZXIuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgUmVwb3J0V3JpdGVyIG5ld1JlcG9ydFdyaXRlcigpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgbG9nIHdyaXRlci4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIGxvZyB3cml0ZXIuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgTG9nV3JpdGVyIG5ld0xvZ1dyaXRlcigpOwotCi0gIC8vIEFERDogQWRkIG90aGVyIHdyaXRlcnMKLQotICAvKioKLSAgICogRmluZCB0aGUgZmFjdG9yeSBjbGFzcyBuYW1lIHdoaWNoIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSBKYXZhIHByb3BlcnR5LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzc05hbWUoKQotICB7Ci0gICAgLy8gR2V0IHByb3BlcnR5IHZhbHVlCi0gICAgcmV0dXJuIFdTSVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoCi0gICAgICBXU0lQcm9wZXJ0aWVzLlBST1BfRE9DVU1FTlRfRkFDVE9SWSwKLSAgICAgIFdTSVByb3BlcnRpZXMuREVGX0RPQ1VNRU5UX0ZBQ1RPUlkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODdjZTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50OwotCi0vKioKLSAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIHRvIHJlYWQgdGhlIENvbmZvcm1hbmNlIFhNTCBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFJlYWRlcgotewotICAvKioKLSAgICogR2V0IGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBkb2N1bWVudFVSSSBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHNlZSAjZ2V0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBkb2N1bWVudFVSSSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvRG9jdW1lbnRXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzg4OTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9Eb2N1bWVudFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgdG8gd3JpdGUgdGhlIENvbmZvcm1hbmNlIFhNTCBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFdyaXRlcgotewotICAvKioKLSAgICogR2V0IHRoZSBEb2N1bWVudCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQ29uZm9ybWFuY2UgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gdGhlIERvY3VtZW50IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb25mb3JtYW5jZSBkb2N1bWVudC4KLSAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogU2V0IHdyaXRlci4KLSAgICogQHBhcmFtIGRvY3VtZW50TG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBkb2N1bWVudC4KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBmYWlsZWQgb3IgaW50ZXJydXB0ZWQgSS9PIG9wZXJhdGlvbnMuIAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFN0cmluZyBkb2N1bWVudExvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFdyaXRlIG91dCBvbmx5IGEgcGFydCBvZiBhIGRvY3VtZW50IHRvIHRoZSBsb2NhdGlvbgotICAgKiB0aGF0IHdhcyBwcmV2aW91c2x5IHNldCB1c2luZyB0aGUgc2V0TG9jYXRpb24gbWV0aG9kLgotICAgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyIG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgdHJvdWJsZSB3cml0aW5nIG91dCB0aGUgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGludm9rZWQgCi0gICAqICAgICAgICAgYXQgYW4gaWxsZWdhbCBvciBpbmFwcHJvcHJpYXRlIHRpbWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShSZWFkZXIgcmVhZGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFdyaXRlIG91dCBvbmx5IGEgcGFydCBvZiBhIGRvY3VtZW50LgotICAgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyIG9iamVjdC4KLSAgICogQHBhcmFtIHdyaXRlciBhIFdyaXRlciBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIHRyb3VibGUgd3JpdGluZyBvdXQgdGhlIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVhZGVyIHJlYWRlciwgV3JpdGVyIHdyaXRlcikgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ2xvc2Ugd3JpdGVyLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyB0cm91YmxlIGNsb3NpbmcgdGhlIHdyaXRlci4KLSAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gaGFzIGJlZW4gaW52b2tlZCAKLSAgICogICAgICAgICBhdCBhbiBpbGxlZ2FsIG9yIGluYXBwcm9wcmlhdGUgdGltZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L1dTSURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvV1NJRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhkYjBkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvV1NJRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudDsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCBmb3IgYWxsIENvbmZvcm1hbmNlIFhNTCBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0lEb2N1bWVudCBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBkb2N1bWVudC4KLSAgICogQHNlZSAjc2V0TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBkb2N1bWVudFVSSSB0aGUgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50LgotICAgKiBAc2VlICNnZXRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGRvY3VtZW50VVJJKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9pbXBsL0RvY3VtZW50RmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9kb2N1bWVudC9pbXBsL0RvY3VtZW50RmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyNGQ4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvaW1wbC9Eb2N1bWVudEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWdSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsLkFuYWx5emVyQ29uZmlnSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLmltcGwuQW5hbHl6ZXJDb25maWdSZWFkZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsLkxvZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsLkxvZ1JlYWRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsLkxvZ1dyaXRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWdSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLmltcGwuTW9uaXRvckNvbmZpZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLmltcGwuTW9uaXRvckNvbmZpZ1JlYWRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnNSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuaW1wbC5Qcm9maWxlQXNzZXJ0aW9uc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuaW1wbC5Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsLlJlcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsLlJlcG9ydFdyaXRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuV1NJUHJvcGVydGllczsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29uZm9ybWFuY2UgZG9jdW1lbnQgZmFjdG9yeSB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8KLSAqIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZG9jdW1lbnRzLCByZWFkZXJzIGFuZCB3cml0ZXJzLiAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGYWN0b3J5SW1wbCBleHRlbmRzIERvY3VtZW50RmFjdG9yeQotewotICAvKioKLSAgICogRG9jdW1lbnQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEZhY3RvcnlJbXBsKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBsb2cgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBMb2cgbmV3TG9nKCkKLSAgewotICAgIHJldHVybiBuZXcgTG9nSW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBtb25pdG9yIGNvbmZpZy4KLSAgICovCi0gIHB1YmxpYyBNb25pdG9yQ29uZmlnIG5ld01vbml0b3JDb25maWcoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBNb25pdG9yQ29uZmlnSW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbmFseXplciBjb25maWcuCi0gICAqLwotICBwdWJsaWMgQW5hbHl6ZXJDb25maWcgbmV3QW5hbHl6ZXJDb25maWcoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBbmFseXplckNvbmZpZ0ltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgcHJvZmlsZSBhc3NlcnRpb25zLgotICAgKi8KLSAgcHVibGljIFByb2ZpbGVBc3NlcnRpb25zIG5ld1Byb2ZpbGVBc3NlcnRpb25zKCkKLSAgewotICAgIHJldHVybiBuZXcgUHJvZmlsZUFzc2VydGlvbnNJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHJlcG9ydC4KLSAgICovCi0gIHB1YmxpYyBSZXBvcnQgbmV3UmVwb3J0KCkKLSAgewotICAgIHJldHVybiBuZXcgUmVwb3J0SW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBtb25pdG9yIGNvbmZpZyByZWFkZXIuCi0gICAqLwotICBwdWJsaWMgTW9uaXRvckNvbmZpZ1JlYWRlciBuZXdNb25pdG9yQ29uZmlnUmVhZGVyKCkKLSAgewotICAgIHJldHVybiBuZXcgTW9uaXRvckNvbmZpZ1JlYWRlckltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW5hbHl6ZXIgY29uZmlnIHJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbmZpZ1JlYWRlciBuZXdBbmFseXplckNvbmZpZ1JlYWRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IEFuYWx5emVyQ29uZmlnUmVhZGVySW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBwcm9maWxlIGFzc2VydGlvbnMgcmVhZGVyLgotICAgKi8KLSAgcHVibGljIFByb2ZpbGVBc3NlcnRpb25zUmVhZGVyIG5ld1Byb2ZpbGVBc3NlcnRpb25zUmVhZGVyKCkKLSAgewotICAgIC8vIFJldHVybiBpbXBsZW1lbnRhdGlvbgotICAgIHJldHVybiBuZXcgUHJvZmlsZUFzc2VydGlvbnNSZWFkZXJJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGxvZyByZWFkZXIuCi0gICAqLwotICBwdWJsaWMgTG9nUmVhZGVyIG5ld0xvZ1JlYWRlcigpCi0gIHsKLSAgICAvLyBSZXR1cm4gaW1wbGVtZW50YXRpb24KLSAgICByZXR1cm4gbmV3IExvZ1JlYWRlckltcGwoKTsKLSAgfQotCi0gIC8vIFdSSVRFUlMKLQotICAvKioKLSAgICogQ3JlYXRlIGxvZyB3cml0ZXIuCi0gICAqLwotICBwdWJsaWMgTG9nV3JpdGVyIG5ld0xvZ1dyaXRlcigpCi0gIHsKLSAgICByZXR1cm4gbmV3IExvZ1dyaXRlckltcGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBEb2N1bWVudFJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBSZXBvcnRXcml0ZXIgbmV3UmVwb3J0V3JpdGVyKCkKLSAgewotICAgIC8vIFJldHVybiBpbXBsZW1lbnRhdGlvbgotICAgIHJldHVybiBuZXcgUmVwb3J0V3JpdGVySW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmQgdGhlIGZhY3RvcnkgY2xhc3MgbmFtZSB3aGljaCBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgSmF2YSBwcm9wZXJ0eS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCkKLSAgewotICAgIC8vIEdldCBwcm9wZXJ0eSB2YWx1ZQotICAgIHJldHVybiBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KAotICAgICAgV1NJUHJvcGVydGllcy5QUk9QX0RPQ1VNRU5UX0ZBQ1RPUlksCi0gICAgICBXU0lQcm9wZXJ0aWVzLkRFRl9ET0NVTUVOVF9GQUNUT1JZKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2RvY3VtZW50L2ltcGwvRG9jdW1lbnRXcml0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvaW1wbC9Eb2N1bWVudFdyaXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxZTZkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvZG9jdW1lbnQvaW1wbC9Eb2N1bWVudFdyaXRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgSUJNIENvcnBvcmF0aW9uLCBCZWFjb24gSW5mb3JtYXRpb24gVGVjaG5vbG9neSBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBCZWFjb25JVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50V3JpdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIERlZmluZXMgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gd3JpdGUgdGhlIENvbmZvcm1hbmNlIFhNTCAKLSAqIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRG9jdW1lbnRXcml0ZXJJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRXcml0ZXIKLXsKLSAgLyoqCi0gICAqIERvY3VtZW50IHdyaXRlci4KLSAgICovCi0gIHByb3RlY3RlZCBXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50V3JpdGVyI2dldERvY3VtZW50KCkKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudCgpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQUREOgotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudFdyaXRlciNzZXRXcml0ZXIoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V3JpdGVyKFN0cmluZyBkb2N1bWVudExvY2F0aW9uKQotICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgewotICAgIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVCAKLSAgICB0aGlzLndyaXRlciA9Ci0gICAgICBuZXcgUHJpbnRXcml0ZXIoCi0gICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oZG9jdW1lbnRMb2NhdGlvbiksCi0gICAgICAgICAgIlVURi04IikpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudFdyaXRlciN3cml0ZShSZWFkZXIpCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoUmVhZGVyIHJlYWRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgewotICAgIC8vIElmIHRoZSB3cml0ZXIgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgaWYgKHdyaXRlciA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGRvY3VtZW50IHNpbmNlIHdyaXRlciB3YXMgbm90IHNldC4iKTsKLQotICAgIHdyaXRlKHJlYWRlciwgd3JpdGVyKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRXcml0ZXIjd3JpdGUoUmVhZGVyLCBXcml0ZXIpCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoUmVhZGVyIHJlYWRlciwgV3JpdGVyIHdyaXRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgYnVmZmVyZWQgcmVhZGVyCi0gICAgQnVmZmVyZWRSZWFkZXIgYnVmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0KLSAgICAvLyBDcmVhdGUgcHJpbnQgd3JpdGVyCi0gICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLQotICAgIFN0cmluZyBuZXh0TGluZSA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBSZWFkIGVhY2ggbGluZSBmcm9tIHRoZSByZWFkZXIKLSAgICAgIHdoaWxlICgobmV4dExpbmUgPSBidWZSZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gV3JpdGUgdGV4dCBhbmQgZmx1c2ggc3RyZWFtCi0gICAgICAgIHByaW50V3JpdGVyLnByaW50bG4obmV4dExpbmUpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3Qgd3JpdGUgZG9jdW1lbnQuIiwgZSk7Ci0gICAgfQotCi0gICAgLy8gRmx1c2ggYW5kIGNsb3NlIHRoZSB3cml0ZXIKLSAgICBwcmludFdyaXRlci5mbHVzaCgpOwotICAgIC8vcHJpbnRXcml0ZXIuY2xvc2UoKTsgICAgCi0gIH0KLQotICAvKioKLSAgICogQ2xvc2Ugd3JpdGVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgV1NJRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgewotICAgIC8vIElmIHRoZSB3cml0ZXIgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgaWYgKHdyaXRlciA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ291bGQgbm90IHdyaXRlIGxvZyBmaWxlIHNpbmNlIHdyaXRlciB3YXMgbm90IHNldC4iKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIENsb3NlIHRoZSB3cml0ZXIKLSAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgIH0KLQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihpb2UudG9TdHJpbmcoKSwgaW9lKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9Mb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTg2YjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9Mb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgdGhlIG1lc3NhZ2UgbG9nIGZpbGUuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2cgZXh0ZW5kcyBXU0lEb2N1bWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fTE9HOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9MT0csIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIEFkZCBtZXNzYWdlIHRvIGxvZyBmaWxlLiAgVGhlIG1lc3NhZ2Ugd2lsbCBjb250YWluIGJvdGggCi0gICAqIHRyYW5zcG9ydCBhbmQgY29udGVudCBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIGxvZ0VudHJ5IG1lc3NhZ2UgY29udGFpbmluZyBib3RoIHRyYW5zcG9ydCBhbmQgY29udGVudCBpbmZvcm1hdGlvbi4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgYWRkaW5nIHRoZSBtZXNzYWdlIHRvIGxvZyBmaWxlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTG9nRW50cnkoTWVzc2FnZUVudHJ5IGxvZ0VudHJ5KSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG51bWJlciBvZiBsb2cgZW50cmllcy4KLSAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxvZyBlbnRyaWVzLiAKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RW50cnlDb3VudCgpOwotCi0gIC8qKgotICAgKiBHZXQgYSBzcGVjaWZpYyBsb2cgZmlsZSBlbnRyeS4gCi0gICAqIEBwYXJhbSBpbmRleCBpbmRleCBpbnRvIGxvZyBlbnRyaWVzLgotICAgKiBAcmV0dXJuIGxvZyBmaWxlIGVudHJ5IGF0IHNwZWNpZmllZCBpbmRleC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgZ2V0TG9nRW50cnkoaW50IGluZGV4KTsKLQotICAvKioKLSAgICogR2V0IGxvZyBlbnRyeSBsaXN0LgotICAgKiBAcmV0dXJuIGxpc3Qgb2YgbG9nIGVudHJpZXMuCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldExvZ0VudHJ5TGlzdCgpOwotCi0gIC8qKgotICAgKiBHZXQgbGFzdCBsb2cgZW50cnkuCi0gICAqIEByZXR1cm4gYXN0IGxvZyBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgZ2V0TGFzdExvZ0VudHJ5KCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBsb2cgZW50cnkgb2JqZWN0LgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgbG9nIGVudHJ5LgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VFbnRyeSBjcmVhdGVMb2dFbnRyeSgpOwotCi0gIC8qKgotICAgKiBTZXQgc3R5bGUgc2hlZXQgc3RyaW5nLgotICAgKiBAcGFyYW0gc3R5bGVTaGVldFN0cmluZyBhIHN0eWxlIHNoZWV0IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0eWxlU2hlZXRTdHJpbmcoU3RyaW5nIHN0eWxlU2hlZXRTdHJpbmcpOwotCi0gIC8qKgotICAgKiBHZXQgc3RhcnQgZWxlbWVudCBzdHJpbmcuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lIGEgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHJldHVybiBzdGFydCBlbGVtZW50IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpOwotCi0gIC8qKgotICAgKiBHZXQgZW5kIGVsZW1lbnQgc3RyaW5nLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBhIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEByZXR1cm4gZW5kIGVsZW1lbnQgc3RyaW5nLiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW5kWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTG9nUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL0xvZ1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYwMTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTG9nUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCB0byByZWFkIHRoZSBMb2cgZmlsZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgTmVpbCBEZWxpbWEgKG5kZGVsaW1hQGNhLmlibS5jb20pCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2dSZWFkZXIgZXh0ZW5kcyBEb2N1bWVudFJlYWRlcgotewotICAvKioKLSAgICogU3RhcnQgcmVhZGluZyBsb2cgZW50cmllcyBmcm9tIGEgc3BlY2lmaWVkIFVSSSBsb2NhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrLgotICAgKiAKLSAgICogQHBhcmFtIGxvZ1VSSSB0aGUgbG9jYXRpb24gb2YgdGhlIGxvZyBmaWxlLgotICAgKiBAcGFyYW0gbG9nRW50cnlIYW5kbGVyIHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHRvIHByb2Nlc3MgZWFjaCBsb2cgZW50cnkuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gcmVhZGluZyBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkTG9nKFN0cmluZyBsb2dVUkksIE1lc3NhZ2VFbnRyeUhhbmRsZXIgbG9nRW50cnlIYW5kbGVyKQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IHJlYWRpbmcgbG9nIGVudHJpZXMgZnJvbSBhIHJlYWRlciB1c2luZyB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrLgotICAgKiAKLSAgICogQHBhcmFtIHJlYWRlciB0aGUgc291cmNlIGZvciB0aGUgbG9nIGZpbGUuCi0gICAqIEBwYXJhbSBsb2dFbnRyeUhhbmRsZXIgdGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gcHJvY2VzcyBlYWNoIGxvZyBlbnRyeS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSByZWFkaW5nIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWRMb2coUmVhZGVyIHJlYWRlciwgTWVzc2FnZUVudHJ5SGFuZGxlciBsb2dFbnRyeUhhbmRsZXIpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvLyBBREQ6IERvIHdlIG5lZWQgdG8gYWRkIGZ1bmN0aW9ucyB0aGF0IHdpbGwgcmVhZCB0aGUgZW50aXJlIGxvZyBmaWxlPwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9Mb2dXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTG9nV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTMzZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9Mb2dXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2c7Ci0KLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50V3JpdGVyOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIHRvIHdyaXRlIHRoZSBMb2cgZmlsZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgTmVpbCBEZWxpbWEgKG5kZGVsaW1hQGNhLmlibS5jb20pCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2dXcml0ZXIgZXh0ZW5kcyBEb2N1bWVudFdyaXRlcgotewotICAvKioKLSAgICogV3JpdGUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgdXNpbmcgdGhlIGxvY2F0aW9uCi0gICAqIHRoYXQgd2FzIHByZXZpb3VzbHkgc2V0IHVzaW5nIHRoZSBzZXRMb2NhdGlvbiBtZXRob2QuCi0gICAqIEBwYXJhbSBsb2cgdGhlIExvZyBvYmplY3QuCi0gICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGludm9rZWQgCi0gICAqICAgICAgICAgYXQgYW4gaWxsZWdhbCBvciBpbmFwcHJvcHJpYXRlIHRpbWUKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHRoZSB3cml0aW5nIG9mIAotICAgKiAgICAgICAgIHRoZSBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShMb2cgbG9nKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50LgotICAgKiBAcGFyYW0gbG9nIHRoZSBMb2cgb2JqZWN0LgotICAgKiBAcGFyYW0gd3JpdGVyIGEgV3JpdGVyIG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHRoZSB3cml0aW5nIG9mIAotICAgKiAgICAgICAgIHRoZSBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShMb2cgbG9nLCBXcml0ZXIgd3JpdGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NZXNzYWdlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTWVzc2FnZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNThmZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NZXNzYWdlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5FbGVtZW50TG9jYXRpb247Ci0KLS8qKgotKiBNZXNzYWdlIGVudHJ5IGludGVyZmFjZS4KLSoKLSogQHZlcnNpb24gMS4wLjEKLSogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0qLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlRW50cnkgZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQKLXsKLSAvKioKLSAgKiBFbGVtZW50IG5hbWUuCi0gICovCi0gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9FTlRSWTsKLQotIC8qKgotICAqIFFOYW1lLgotICAqLwotIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0xPRywgRUxFTV9OQU1FKTsKLQotIC8qKgotICAqIFR5cGUgb2YgbG9nIGVudHJ5LgotICAqLwotIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUkVRVUVTVCA9ICJyZXF1ZXN0IjsKLSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1JFU1BPTlNFID0gInJlc3BvbnNlIjsKLQotIC8qKgotICAqIEdldHMgdGhlIGlkLgotICAqIEByZXR1cm4gdGhlIGlkLgotICAqIEBzZWUgI3NldElkCi0gICovCi0gcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0gLyoqCi0gICogU2V0cyB0aGUgaWQuCi0gICogQHBhcmFtIGlkIHRoZSBpZGVudGlmaWVyIGZvciB0aGUgbG9nIGVudHJ5LgotICAqIEBzZWUgI2dldElkCi0gICovCi0gcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLQotIC8qKgotICAqIEdldHMgdGhlIGNvbnZlcnNhdGlvbiBpZC4KLSAgKiBAcmV0dXJuIHRoZSBjb252ZXJzYXRpb24gaWQuCi0gICogQHNlZSAjc2V0Q29udmVyc2F0aW9uSWQKLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldENvbnZlcnNhdGlvbklkKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBjb252ZXJzYXRpb24gaWQuCi0gICogQHBhcmFtIGNvbnZlcnNhdGlvbklkIHRoZSBjb252ZXJzYXRpb24gaWQuCi0gICogQHNlZSAjZ2V0Q29udmVyc2F0aW9uSWQKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRDb252ZXJzYXRpb25JZChTdHJpbmcgY29udmVyc2F0aW9uSWQpOwotCi0gLyoqCi0gICogR2V0cyB0aGUgdGltZXN0YW1wLgotICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcC4KLSAgKiBAc2VlICNzZXRUaW1lc3RhbXAKLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldFRpbWVzdGFtcCgpOwotCi0gLyoqCi0gICogU2V0cyB0aGUgdGltZXN0YW1wLgotICAqIEBwYXJhbSB0aW1lc3RhbXAgdGhlIHRpbWVzdGFtcC4KLSAgKiBAc2VlICNnZXRUaW1lc3RhbXAKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAoU3RyaW5nIHRpbWVzdGFtcCk7Ci0KLSAvKioKLSAgKiBHZXRzIHRoZSB0eXBlLgotICAqIEByZXR1cm4gdGhlIHR5cGUuCi0gICogQHNlZSAjc2V0VHlwZQotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCi0gLyoqCi0gICogU2V0cyB0aGUgdHlwZS4KLSAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZS4KLSAgKiBAc2VlICNnZXRUeXBlCi0gICovCi0gcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0KLSAvKioKLSAgKiBHZXRzIHRoZSBzZW5kZXIgaG9zdCBhbmQgcG9ydC4KLSAgKiBAcmV0dXJuICB0aGUgc2VuZGVyIGhvc3QgYW5kIHBvcnQuCi0gICogQHNlZSAjc2V0U2VuZGVySG9zdEFuZFBvcnQKLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldFNlbmRlckhvc3RBbmRQb3J0KCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBzZW5kZXIgaG9zdCBhbmQgcG9ydC4KLSAgKiBAcGFyYW0gc2VuZGVySG9zdEFuZFBvcnQgdGhlIHNlbmRlciBob3N0IGFuZCBwb3J0LgotICAqIEBzZWUgI2dldFNlbmRlckhvc3RBbmRQb3J0Ci0gICovCi0gcHVibGljIHZvaWQgc2V0U2VuZGVySG9zdEFuZFBvcnQoU3RyaW5nIHNlbmRlckhvc3RBbmRQb3J0KTsKLQotIC8qKgotICAqIEdldHMgdGhlIHJlY2VpdmVyIGhvc3QgYW5kIHBvcnQuCi0gICogQHJldHVybiB0aGUgcmVjZWl2ZXIgaG9zdCBhbmQgcG9ydC4KLSAgKiBAc2VlICNzZXRSZWNlaXZlckhvc3RBbmRQb3J0Ci0gICovCi0gcHVibGljIFN0cmluZyBnZXRSZWNlaXZlckhvc3RBbmRQb3J0KCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSByZWNlaXZlciBob3N0IGFuZCBwb3J0LgotICAqIEBwYXJhbSByZWNlaXZlckhvc3RBbmRQb3J0IHRoZSByZWNlaXZlciBob3N0IGFuZCBwb3J0LgotICAqIEBzZWUgI2dldFJlY2VpdmVySG9zdEFuZFBvcnQKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRSZWNlaXZlckhvc3RBbmRQb3J0KFN0cmluZyByZWNlaXZlckhvc3RBbmRQb3J0KTsKLQotIC8qKgotICAqIEdldHMgdGhlIG1lc3NhZ2UuCi0gICogQHJldHVybiB0aGUgbWVzc2FnZS4KLSAgKiBAc2VlICNzZXRNZXNzYWdlCi0gICovCi0gcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBtZXNzYWdlLgotICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgotICAqIEBzZWUgI2dldE1lc3NhZ2UKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKTsKLQotIC8qKgotICAqIFNldHMgdGhlIGVuY29kaW5nLgotICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcuCi0gICogQHNlZSAjZ2V0TWVzc2FnZQotICAqLwotIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZyk7Ci0KLSAvKioKLSAgKiBHZXRzIHRoZSBCT00uCi0gICogQHJldHVybiB0aGUgQk9NLgotICAqIEBzZWUgI3NldEJPTQotICAqLwotIHB1YmxpYyBpbnQgZ2V0Qk9NKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBCT00uCi0gICogQHBhcmFtIGJvbSB0aGUgQk9NLgotICAqIEBzZWUgI2dldEJPTQotICAqLwotIHB1YmxpYyB2b2lkIHNldEJPTShpbnQgYm9tKTsKLQotIC8qKgotICAqIEdldHMgdGhlIEhUVFAgaGVhZGVycy4KLSAgKiBAcmV0dXJuIHRoZSBIVFRQIGhlYWRlcnMuCi0gICogQHNlZSAjc2V0SFRUUEhlYWRlcnMKLSAgKi8KLSBwdWJsaWMgU3RyaW5nIGdldEhUVFBIZWFkZXJzKCk7Ci0KLSAvKioKLSAgKiBTZXRzIHRoZSBIVFRQIGhlYWRlcnMuCi0gICogQHBhcmFtIGh0dHBIZWFkZXJzIHRoZSBIVFRQIGhlYWRlcnMuCi0gICogQHNlZSAjZ2V0SFRUUEhlYWRlcnMKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRIVFRQSGVhZGVycyhTdHJpbmcgaHR0cEhlYWRlcnMpOwotCi0gLyoqCi0gICogR2V0cyBlbGVtZW50IGxvY2F0aW9uLgotICAqIEByZXR1cm4gZWxlbWVudCBsb2NhdGlvbi4KLSAgKiBAc2VlICNzZXRFbGVtZW50TG9jYXRpb24KLSAgKi8KLSBwdWJsaWMgRWxlbWVudExvY2F0aW9uIGdldEVsZW1lbnRMb2NhdGlvbigpOwotCi0gLyoqCi0gICogU2V0cyBlbGVtZW50IGxvY2F0aW9uLgotICAqIEBwYXJhbSBlbGVtZW50TG9jYXRpb24gZWxlbWVudCBsb2NhdGlvbi4KLSAgKiBAc2VlICNnZXRFbGVtZW50TG9jYXRpb24KLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRFbGVtZW50TG9jYXRpb24oRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbik7Ci0gCi0gLyoqCi0gICogSWYgY29udGVudCBpcyBNSU1FIHR5cGUgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgZmFsc2UgIAotICAqIEByZXR1cm4gaWYgY29udGVudCBpcyBNSU1FIHR5cGUgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgZmFsc2UKLSAgKi8KLSBwdWJsaWMgYm9vbGVhbiBpc01pbWVDb250ZW50KCk7Ci0gCi0gLyoqCi0gICogU2V0IGZsYWcgdG8gZGV0ZXJtaW5lIGlmIGNvbnRlbnQgaXMgTUlNRSB0eXBlLiAKLSAgKiBAcGFyYW0gaXNNaW1lQ29udGVudCBhIGJvb29sZWFuIHZhbHVlCi0gICovCi0gcHVibGljIHZvaWQgc2V0TWltZUNvbnRlbnQoYm9vbGVhbiBpc01pbWVDb250ZW50KTsKLQotIC8qKgotICAqIFJldHVybnMgYXJyYXkgb2YgdGhlIE1JTUUgcGFydHMgb2YgdGhlIG1lc3NhZ2UuCi0gICogQHJldHVybiBhcnJheSBvZiB0aGUgTUlNRSBwYXJ0cyBvZiB0aGUgbWVzc2FnZS4KLSAgKiBAc2VlICNpc01JTUVDb250ZW50KCkgCi0gICovCi0gcHVibGljIE1pbWVQYXJ0cyBnZXRNaW1lUGFydHMoKTsKLSAKLSAvKioKLSAgKiBTZXRzIHRoZSBNSU1FIHBhcnRzIG9mIHRoZSBtZXNzYWdlLgotICAqIEBwYXJhbSBtaW1lUGFydHMgaGUgTUlNRSBwYXJ0cyBvZiB0aGUgbWVzc2FnZS4KLSAgKiBAc2VlICNnZXRNaW1lUGFydHMKLSAgKi8KLSBwdWJsaWMgdm9pZCBzZXRNaW1lUGFydHMoTWltZVBhcnRzIG1pbWVQYXJ0cyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTWVzc2FnZUVudHJ5SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NZXNzYWdlRW50cnlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDFlMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NZXNzYWdlRW50cnlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXJ0aWZhY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgTWVzc2FnZUVudHJ5IGhhbmRsZXIuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwgKGd0dXJyZWxsQHVrLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUVudHJ5SGFuZGxlcgotewotICAvKioKLSAgICogUHJvY2VzcyBhcnRpZmFjdCByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBhcnRpZmFjdFJlZmVyZW5jZSBhcnRpZmFjdCByZWZlcmVuY2UuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIHdoaWxlIHByb2Nlc3NpbmcgYXJ0aWZhY3QgcmVmZXJlbmNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2Vzc0FydGlmYWN0UmVmZXJlbmNlKEFydGlmYWN0UmVmZXJlbmNlIGFydGlmYWN0UmVmZXJlbmNlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgYSBzaW5nbGUgbG9nIGVudHJ5LgotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGEgc2luZ2xlIGxvZyBlbnRyeS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgd2hpbGUgcHJvY2Vzc2luZyBhIHNpbmdsZSBsb2cgZW50cnkuCi0gIAotICAgKi8KLSAgcHVibGljIHZvaWQgcHJvY2Vzc0xvZ0VudHJ5KEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpIHRocm93cyBXU0lFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01pbWVQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL01pbWVQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjg3OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NaW1lUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDIyLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGxhdXpvbmQKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0KLSAqIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1pbWVQYXJ0IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50IHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgZm9yIHRoZSBtaW1lIHBhcnQuCi0JICogCi0JICogQHJldHVybiB0aGUgbWltZSBjb250ZW50LgotCSAqIEBzZWUgI3NldENvbnRlbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRlbnQgZm9yIHRoZSBtaW1lIHBhcnQuCi0JICogCi0JICogQHBhcmFtIG1pbWVDb250ZW50Ci0JICogICAgICAgICAgICB0aGUgbWltZSBjb250ZW50LgotCSAqIEBzZWUgI2dldENvbnRlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KFN0cmluZyBtaW1lQ29udGVudCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBoZWFkZXJzIGZvciB0aGUgbWltZSBwYXJ0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1pbWUgaGVhZGVycy4KLQkgKiBAc2VlICNzZXRNaW1lSGVhZGVycwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgaGVhZGVycyBmb3IgdGhlIG1pbWUgcGFydC4KLQkgKiAKLQkgKiBAcGFyYW0gbWltZUhlYWRlcnMKLQkgKiAgICAgICAgICAgIHRoZSBtaW1lIGhlYWRlcnMuCi0JICogQHNlZSAjZ2V0SGVhZGVycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhlYWRlcnMoU3RyaW5nIG1pbWVIZWFkZXJzKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGJvdW5kYXJ5IHN0cmluZ3MgZm9yIHRoZSBtaW1lIHBhcnQuIE5vdGUgdGhhdCB0aGUgbGFzdCBwYXJ0IG9mIGEKLQkgKiBtdWx0aXBhcnQvIHJlbGF0ZWQgbWVzc2FnZSB3aWxsIGhhdmUgMiBib3VuZGFyeSBzdHJpbmdzLiBBbGwgb3RoZXIgcGFydHMKLQkgKiB3aWxsIGhhdmUgb25lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJvdW5kYXJ5IHN0cmluZ3MuCi0JICogQHNlZSAjc2V0Qm91bmRhcnlTdHJpbmdzCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEJvdW5kYXJ5U3RyaW5ncygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgYm91bmRhcnkgc3RyaW5ncyBmb3IgdGhlIG1pbWUgcGFydC4gTm90ZSB0aGF0IHRoZSBsYXN0IHBhcnQgb2YgYQotCSAqIG11bHRpcGFydC8gcmVsYXRlZCBtZXNzYWdlIHdpbGwgaGF2ZSAyIGJvdW5kYXJ5IHN0cmluZ3MuIEFsbCBvdGhlciBwYXJ0cwotCSAqIHdpbGwgaGF2ZSBvbmUuCi0JICogCi0JICogQHBhcmFtIGJvdW5kYXJ5U3RyaW5ncwotCSAqICAgICAgICAgICAgdGhlIGJvdW5kYXJ5IHN0cmluZ3MuCi0JICogQHNlZSAjZ2V0Qm91bmRhcnlTdHJpbmdzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm91bmRhcnlTdHJpbmdzKFN0cmluZ1tdIG1pbWVIZWFkZXJzKTsKLQotCXB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NaW1lUGFydHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvTWltZVBhcnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTNmMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9NaW1lUGFydHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBNaW1lIHBhcnRzIGludGVyZmFjZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBEYXZpZCBMYXV6b24gKGxhdXpvbmRAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBNaW1lUGFydHMKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHN0YXJ0IGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIHRoZSAuCi0gICAqIEByZXR1cm4gdGhlIGhlIHN0YXJ0IGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICogQHNlZSAjc2V0Um9vdFBhcnQKLSAgICovCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByb290IHBhcnQsIG90aGVyd2lzZSBudWxsLgotICAgKiBAcmV0dXJuIHRoZSByb290IHBhcnQuCi0gICAqIEBzZWUgI3NldFJvb3RQYXJ0Ci0gICAqLwotICBwdWJsaWMgTWltZVBhcnQgZ2V0Um9vdFBhcnQoKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgcm9vdCBwYXJ0LgotICAgKiBAcGFyYW0gcm9vdFBhcnQgdGhlIHJvb3QgcGFydC4KLSAgICogQHNlZSAjZ2V0Um9vdFBhcnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3RQYXJ0KE1pbWVQYXJ0IHJvb3RQYXJ0KTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcnRzLgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFydHMuCi0gICAqLwotICBwdWJsaWMgaW50IGNvdW50KCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGNvbnZlcnNhdGlvbiBpZC4KLSAgICogQHJldHVybiB0aGUgY29udmVyc2F0aW9uIGlkLgotICAgKiBAc2VlICNzZXRDb252ZXJzYXRpb25JZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFydChNaW1lUGFydCBwYXJ0KTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgbWltZSBwYXJ0cy4KLSAgICogQHJldHVybiBhIGxpc3Qgb2YgbWltZSBwYXJ0cy4KLSAgICovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldFBhcnRzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9pbXBsL0xvZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkNzhhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBtZXNzYWdlIGxvZyBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dJbXBsIGltcGxlbWVudHMgTG9nCi17Ci0gIC8qKgotICAgKiBMb2cgVVJJLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2dVUkkgPSBudWxsOwotCi0gIC8qKgotICAgKiBTdGFydCB0aW1lIHN0YW1wLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBzdGFydFRpbWVzdGFtcCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIExvZyBlbnRyaWVzLgotICAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBsb2dFbnRyeUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgLyoqCi0gICAqIExhc3QgbG9nIGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2VFbnRyeSBsYXN0TG9nRW50cnkgPSBudWxsOwotCi0gIC8qKgotICAgKiBMb2cgdGl0bGUuCi0gICAqLwotICAvLyBBREQ6IFNob3VsZCB3ZSBwcm92aWRlIGEgd2F5IHRvIHNldCB0aGUgbG9nIHRpdGxlPwotICBwcm90ZWN0ZWQgU3RyaW5nIGxvZ1RpdGxlID0gIk1lc3NhZ2UgTG9nIEZpbGUiOwotCi0gIC8qKgotICAgKiBTdHlsZSBzaGVldCBzdHJpbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHN0eWxlU2hlZXRTdHJpbmcgPSBudWxsOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nI2FkZExvZ0VudHJ5KExvZ0VudHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTG9nRW50cnkoTWVzc2FnZUVudHJ5IGxvZ0VudHJ5KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTYXZlIGxhc3QgbG9nIGVudHJ5Ci0gICAgbGFzdExvZ0VudHJ5ID0gbG9nRW50cnk7Ci0KLSAgICAvLyBBZGQgbG9nIGVudHJ5Ci0gICAgbG9nRW50cnlMaXN0LmFkZChsb2dFbnRyeSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZyNnZXRFbnRyeUNvdW50KCkKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0RW50cnlDb3VudCgpCi0gIHsKLSAgICByZXR1cm4gbG9nRW50cnlMaXN0LnNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nI2dldExvZ0VudHJ5KGludCkKLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgZ2V0TG9nRW50cnkoaW50IGluZGV4KQotICB7Ci0gICAgcmV0dXJuIChNZXNzYWdlRW50cnkpIGxvZ0VudHJ5TGlzdC5lbGVtZW50QXQoaW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2cjZ2V0TG9nRW50cnlMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBWZWN0b3IgZ2V0TG9nRW50cnlMaXN0KCkKLSAgewotICAgIHJldHVybiBsb2dFbnRyeUxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGxhc3QgbG9nIGVudHJ5LgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VFbnRyeSBnZXRMYXN0TG9nRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIGxhc3RMb2dFbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgbG9nIGVudHJ5IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgY3JlYXRlTG9nRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBNZXNzYWdlRW50cnlJbXBsKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5sb2dVUkk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGRvY3VtZW50VVJJKQotICB7Ci0gICAgdGhpcy5sb2dVUkkgPSBkb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgc3R5bGUgc2hlZXQgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3R5bGVTaGVldFN0cmluZyhTdHJpbmcgc3R5bGVTaGVldFN0cmluZykKLSAgewotICAgIHRoaXMuc3R5bGVTaGVldFN0cmluZyA9IHN0eWxlU2hlZXRTdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0YXJ0IGVsZW1lbnQgc3RyaW5nLiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENyZWF0ZSByZXBvcnQgZWxlbWVudCAKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5YTUxfREVDTCk7Ci0gICAgaWYgKHRoaXMuc3R5bGVTaGVldFN0cmluZyAhPSBudWxsKQotICAgICAgcHcucHJpbnRsbih0aGlzLnN0eWxlU2hlZXRTdHJpbmcpOwotCi0gICAgLy8gQWRkIFhNTCBjb21tZW50Ci0gICAgU3RyaW5nIGNvbW1lbnQ7Ci0gICAgaWYgKChjb21tZW50ID0gVGVzdFV0aWxzLmdldFhNTENvbW1lbnQoKSkgIT0gbnVsbCkKLSAgICAgIHB3LnByaW50KGNvbW1lbnQpOwotCi0gICAgLy8gTG9nCi0gICAgcHcucHJpbnQoIjwiICsgbnNOYW1lICsgRUxFTV9OQU1FKTsKLQotICAgIC8vIFJFTU9WRUQ6IE5vIGxvbmdlciByZXF1aXJlZCBieSB0aGUgbW9uaXRvciBzcGVjCi0gICAgLy9wdy5wcmludCgiICIgKyBXU0lDb25zdGFudHMuQVRUUl9OQU1FICsgIj1cIiIgKyBsb2dUaXRsZSArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICIgKyBXU0lDb25zdGFudHMuQVRUUl9USU1FU1RBTVAgKyAiPVwiIiArIFV0aWxzLmdldFRpbWVzdGFtcCgpICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigiICAgIHhtbG5zPVwiIiArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0xPRyArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgIHhtbG5zOiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTU9OSVRPUl9DT05GSUcKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHCi0gICAgICAgICsgIlwiIik7Ci0gICAgLy9wdy5wcmludGxuKCIgICAgeG1sbnM6IiArIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9DT01NT04gKyAiPVwiIiArIAotICAgIC8vICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQ09NTU9OICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICIgICAgeG1sbnM6IgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19OQU1FX1hTSQotICAgICAgICArICI9XCIiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX1VSSV9YU0kKLSAgICAgICAgKyAiXCI+Iik7Ci0KLSAgICAvLyBBZGQgIG1vbml0b3IgdG9vbCBpbmZvCi0gICAgLy9wdy5wcmludGxuKG1vbml0b3IudG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0KLSAgICAvLyBSZXR1cm4gWE1MIHN0cmluZwotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBlbmQgZWxlbWVudCBzdHJpbmcuIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIEVuZCBsb2cgZWxlbWVudCAKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgLy8gUmV0dXJuIFhNTCBzdHJpbmcKLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIC8vIEFERDoKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nUmVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9pbXBsL0xvZ1JlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyOTcxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nUmVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5Ub29sRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZ1JlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuaW1wbC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXJ0aWZhY3RSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGwuQXJ0aWZhY3RSZWZlcmVuY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5FbnRyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb20uRWxlbWVudExvY2F0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHJlYWQgdGhlIExvZyBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBOZWlsIERlbGltYSAobmRkZWxpbWFAY2EuaWJtLmNvbSkKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQGF1dGhvciBHcmFoYW0gVHVycmVsbCAoZ3R1cnJlbGxAdWsuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIExvZ1JlYWRlckltcGwgaW1wbGVtZW50cyBMb2dSZWFkZXIKLXsKLSAgLyoqCi0gICAqIERvY3VtZW50IGxvY2F0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZG9jdW1lbnRVUkk7Ci0KLSAgLyoqIFVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGltcGxlbWVudGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50IGFmdGVyIHRoZSBsb2cgZWxlbWVudCAqKi8KLSAgcHJpdmF0ZSBpbnQgZmlyc3RMb2dFbGVtZW50ID0gMDsKLSAgcHJpdmF0ZSBpbnQgZWxlbWVudENvdW50ID0gMDsKLSAgcHJpdmF0ZSBib29sZWFuIGJNb25pdG9yRmlyc3QgPSBmYWxzZTsKLQotICBwcml2YXRlIFdTSUV4Y2VwdGlvbiB3c2lFeGNlcHRpb24gPSBudWxsOwotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nUmVhZGVyI3JlYWRMb2coU3RyaW5nLCBMb2dFbnRyeUhhbmRsZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkTG9nKFN0cmluZyBsb2dVUkksIE1lc3NhZ2VFbnRyeUhhbmRsZXIgbG9nUmVhZGVyQ2FsbGJhY2spCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gUmVhZCB0aGUgbG9nIGZpbGUgZW50cmllcwotICAgIHJlYWRMb2cobmV3IElucHV0U291cmNlKGxvZ1VSSSksIGxvZ1JlYWRlckNhbGxiYWNrKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nUmVhZGVyI3JlYWRMb2coUmVhZGVyLCBMb2dFbnRyeUhhbmRsZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCByZWFkTG9nKFJlYWRlciByZWFkZXIsIE1lc3NhZ2VFbnRyeUhhbmRsZXIgbG9nUmVhZGVyQ2FsbGJhY2spCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gUmVhZCB0aGUgbG9nIGZpbGUgZW50cmllcwotICAgIHJlYWRMb2cobmV3IElucHV0U291cmNlKHJlYWRlciksIGxvZ1JlYWRlckNhbGxiYWNrKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGFuZCBwYXJzZSB0aGUgbG9nIGZpbGUuCi0gICAqIEBwYXJhbSBpbnB1dFNvdXJjZSAgICAgICAgICBhbiBJbnB1dFNvdXJjZSBvYmplY3QKLSAgICogQHBhcmFtIG1lc3NhZ2VFbnRyeUhhbmRsZXIgIGEgTWVzc2FnZUVudHJ5SGFuZGxlciBvYmplY3QKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycyB3aGlsZSByZWFkaW5nIHRoZSBsb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRMb2coCi0gICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UsCi0gICAgTWVzc2FnZUVudHJ5SGFuZGxlciBtZXNzYWdlRW50cnlIYW5kbGVyKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgWE1MIHJlYWRlcgotICAgICAgWE1MUmVhZGVyIHhtbFJlYWRlciA9IFhNTFV0aWxzLmdldFhNTFJlYWRlcigpOwotCi0gICAgICAvKiogVE8gRE86ICBUaGUgTG9nRmlsZSBtdXN0IGJlIHZhbGlkIHdydCBpdHMgc2NoZW1hLiAgVGhlIHNjaGVtYUxvY2F0aW9uIHByb2JhYmx5Ci0gICAgICAgKiBuZWVkcyB0byBiZSBzZXQgaW4gc29tZSBwcm9wZXJ0aWVzIGZpbGUuCi0gICAgICAgKiBUaGVzZSB0d28gYXJlIHRvIHR1cm4gb24gdmFsaWRhdGlvbiAKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKEZFQVRVUkVfVkFMSURBVElPTix0cnVlKTsKLSAgICAgICovCi0KLSAgICAgIC8vIFNldCB0aGUgY29udGVudCBoYW5kbGVyCi0gICAgICB4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IExvZ0ZpbGVIYW5kbGVyKG1lc3NhZ2VFbnRyeUhhbmRsZXIpKTsKLQotICAgICAgLy8gU3RhcnQgcGFyc2luZyB0aGUgZmlsZQotICAgICAgeG1sUmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQotICAgICAgLy8gQUREOiBOZWVkIHRvIGZpbmQgYSB3YXkgdG8gZGV0ZXJtaW5lIHdoZW4gdGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biwgCi0gICAgICAvLyBzaW5jZSBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSBhbGwgb2YgdGhlIHRlc3QgYXNzZXJ0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotICAgICAgLy8gQWxzbywgb25seSB0aGUgbGFzdCBleGNlcHRpb24gaXMgcHJvcG9nYXRlZCBiYWNrLiAgU2hvdWxkIGFsbCBvZiB0aGUgZXhjZXB0aW9ucwotICAgICAgLy8gYmUgY2FwdHVyZWQgYW5kIHByb3BvZ2F0ZWQgYmFjaz8KLSAgICAgIGlmICh3c2lFeGNlcHRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVEVNUDogRm9yIG5vdywgZG9uJ3QgdGhyb3cgdGhlIGV4Y2VwdGlvbgotICAgICAgICAvL3Rocm93IHdzaUV4Y2VwdGlvbjsKLSAgICAgIH0KLQotICAgICAgLy9SZXF1aXJlbWVudCwgdGhlIG1vbml0b3IgTVVTVCBiZSB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxvZy4KLSAgICAgIC8vUGVyaGFwcyB3ZSBuZWVkIHRvIHByZXByb2Nlc3MgdGhlIGxvZyBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjb25kaXRpb24gdG8gYmUgbWV0LgotICAgICAgaWYgKCFiTW9uaXRvckZpcnN0KQotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICJUaGUgRWxlbWVudCBcIiIKLSAgICAgICAgICAgICsgV1NJQ29uc3RhbnRzLkVMRU1fTU9OSVRPUgotICAgICAgICAgICAgKyAiXCIgaXMgbm90IHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgRWxlbWVudCBcImxvZ1wiIik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgbWVzc2FnZSBsb2cgZmlsZS4iLAotICAgICAgICBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXIjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlciNzZXRMb2NhdGlvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgZG9jdW1lbnRVUkkpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50VVJJID0gZG9jdW1lbnRVUkk7Ci0gIH0KLQotICAvKioKLSAgKiBQcm9jZXNzIGFuZCBoYW5kbGVzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGUgaW4gdGhlIGxvZyBmaWxlIGFuZCBpbnZva2VzCi0gICogbWVzc2FnZSB2YWxpZGF0aW9uIGFzc2VydGlvbnMgc2VyaWFsbHkgYXMgdGhlIGZpbGUgaXMgYmVpbmcgcHJvY2Vzc2VkLAotICAqIGlmIGEgbWVzc2FnZXZhbGlkYXRvciBleGlzdHMuCi0gICovCi0gIHByaXZhdGUgY2xhc3MgTG9nRmlsZUhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotICB7Ci0KLSAgICAvKiogcHJpdmF0ZSBtZW1iZXJzIHRoYXQgcmVwcmVzZW50IGEgTWVzc2FnZUVudHJ5LiovCi0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29udmVyc2F0aW9uSUQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLSAgICBwcml2YXRlIFN0cmluZyB0aW1lc3RhbXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgc2VuZGVySG9zdEFuZFBvcnQgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHJlY2VpdmVySG9zdEFuZFBvcnQgID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBtZXNzYWdlQ29udGVudCAgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGh0dHBIZWFkZXJzICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYm91bmRhcnkgID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBtaW1lSGVhZGVycyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbWltZUNvbnRlbnQgPSBudWxsOwotICAgIHByaXZhdGUgTWltZVBhcnRzIG1pbWVQYXJ0cyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0IGJvdW5kYXJpZXMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBpbnQgYm9tID0gMDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGxvZ1RpbWVzdGFtcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgbW9uaXRvckNvbW1lbnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZUNvbW1lbnQgPSBmYWxzZTsKLQotICAgIC8qKiBPdGhlciBwcml2YXRlIG1lbWJlcnMgKi8KLSAgICBwcml2YXRlIFN0cmluZyBjdXJyZW50RWxlbWVudDsKLQotICAgIHByaXZhdGUgRWxlbWVudExvY2F0aW9uIGVudHJ5RWxlbWVudExvY2F0aW9uID0gbnVsbDsKLQotICAgIHByaXZhdGUgVG9vbEluZm8gdG9vbEluZm8gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBWZWN0b3IgbWVzc2FnZUVudHJ5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHByaXZhdGUgTWVzc2FnZUVudHJ5SGFuZGxlciBsb2dFbnRyeUhhbmRsZXIgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogTG9nIGZpbGUgaGFuZGxlci4gCi0gICAgICovCi0gICAgcHVibGljIExvZ0ZpbGVIYW5kbGVyKE1lc3NhZ2VFbnRyeUhhbmRsZXIgbG9nRW50cnlIYW5kbGVyKQotICAgIHsKLSAgICAgIHRoaXMubG9nRW50cnlIYW5kbGVyID0gbG9nRW50cnlIYW5kbGVyOwotCi0gICAgICB0b29sSW5mbyA9IG5ldyBUb29sSW5mbygpOwotICAgICAgdG9vbEluZm8uc2V0VG9vbEVudmlyb25tZW50KG5ldyBUb29sRW52aXJvbm1lbnQoKSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFN0YXJ0IGRvY3VtZW50LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFNldCBkb2N1bWVudCBsb2NhdG8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKExvY2F0b3IgbG9jYXRvcikKLSAgICB7Ci0gICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotCi0gICAgICAvLyBERUJVRzoKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJsaW5lOiAiICsgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgKyAiLCBjb2x1bW46ICIgKyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgICogU3RhcnQgZWxlbWVudC4gCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgIFN0cmluZyBsb2NhbE5hbWUsCi0gICAgICBTdHJpbmcgcU5hbWUsCi0gICAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibG9jYWxOYW1lOiIgKyBsb2NhbE5hbWUgKyAiLCBsaW5lOiAiICsgbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgKyAiLCBjb2x1bW46ICIgKyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKTsKLQotICAgICAgLy9SZXF1aXJlbWVudCwgdGhlIGltcGxlbWVudGVyIE1VU1QgYmUgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBsb2cgICAgICAgCi0gICAgICBpZiAoZWxlbWVudENvdW50ID09IDIpCi0gICAgICAgIGlmIChmaXJzdExvZ0VsZW1lbnQgPT0gMSkKLSAgICAgICAgICBiTW9uaXRvckZpcnN0ID0gdHJ1ZTsKLQotICAgICAgZWxlbWVudENvdW50Kys7Ci0KLSAgICAgIC8vIDxsb2c+Ci0gICAgICBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX0xPRykKLSAgICAgIHsKLSAgICAgICAgLy8gU2F2ZSB0aGUgdGltZXN0YW1wIHZhbHVlCi0gICAgICAgIHRoaXMubG9nVGltZXN0YW1wID0gYXR0cmlidXRlcy5nZXRWYWx1ZShXU0lDb25zdGFudHMuQVRUUl9USU1FU1RBTVApOwotICAgICAgfQotCi0gICAgICAvLyA8d3NpLWNvbmZpZzpjb25maWd1cmF0aW9uPgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fQ09ORklHKQotICAgICAgICAgICYmIChuYW1lc3BhY2VVUkkgPT0gV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfTU9OSVRPUl9DT05GSUcpKQotICAgICAgewotICAgICAgICAvLyBTYXZlIGNvbW1lbnQgZWxlbWVudCBpZiBpdCBleGlzdHMKLSAgICAgICAgaWdub3JlQ29tbWVudCA9IGZhbHNlOwotICAgICAgfQotCi0gICAgICAvLyA8d3NpLWNvbmZpZzpjb21tZW50PgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fQ09NTUVOVCkKLSAgICAgICAgICAmJiAobmFtZXNwYWNlVVJJID09IFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHKSkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgY29tbWVudCBlbGVtZW50IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LCB0aGVuIGdldCBpdHMgY29udGVudAotICAgICAgICBpZiAoIWlnbm9yZUNvbW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICBjdXJyZW50RWxlbWVudCA9IFdTSUNvbnN0YW50cy5FTEVNX0NPTU1FTlQ7Ci0gICAgICAgICAgbW9uaXRvckNvbW1lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gPHdzaS1jb25maWc6cmVkaXJlY3Q+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGxvY2FsTmFtZSA9PSBXU0lDb25zdGFudHMuRUxFTV9SRURJUkVDVCkKLSAgICAgICAgICAmJiAobmFtZXNwYWNlVVJJID09IFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHKSkKLSAgICAgIHsKLSAgICAgICAgLy8gQWZ0ZXIgaGl0dGluZyB0aGUgZmlyc3QgcmVkaXJlY3Qgc3RhdGVtZW50LCBpZ25vcmUgYWxsIGNvbW1lbnQgZWxlbWVudHMKLSAgICAgICAgaWdub3JlQ29tbWVudCA9IHRydWU7Ci0gICAgICAgIG1vbml0b3JDb21tZW50ID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgLy8gPG1vbml0b3I+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTU9OSVRPUikKLSAgICAgIHsKLSAgICAgICAgZmlyc3RMb2dFbGVtZW50Kys7Ci0gICAgICAgIHRvb2xJbmZvLnNldE5hbWUoV1NJQ29uc3RhbnRzLkVMRU1fTU9OSVRPUik7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBtb25pdG9yIHZlcnNpb24gYW5kIHJlbGVhc2UgZGF0ZQotICAgICAgICB0b29sSW5mby5zZXRWZXJzaW9uKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTikpOwotICAgICAgICB0b29sSW5mby5zZXRSZWxlYXNlRGF0ZSgKLSAgICAgICAgICBhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX1JFTEVBU0VfREFURSkpOwotICAgICAgfQotCi0gICAgICAvLyA8aW1wbGVtZW50ZXI+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fSU1QTEVNRU5URVIpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fSU1QTEVNRU5URVI7Ci0gICAgICAgIHRvb2xJbmZvLnNldEltcGxlbWVudGVyKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICB0b29sSW5mby5zZXRMb2NhdGlvbihhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX0xPQ0FUSU9OKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxydW50aW1lPgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX1JVTlRJTUUpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fUlVOVElNRTsKLSAgICAgICAgdG9vbEluZm8uZ2V0VG9vbEVudmlyb25tZW50KCkuc2V0UnVudGltZU5hbWUoCi0gICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZShXU0lDb25zdGFudHMuQVRUUl9OQU1FKSk7Ci0gICAgICAgIHRvb2xJbmZvLmdldFRvb2xFbnZpcm9ubWVudCgpLnNldFJ1bnRpbWVWZXJzaW9uKAotICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTikpOwotICAgICAgfQotCi0gICAgICAvLyA8b3BlcmF0aW5nU3lzdGVtPgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX09QRVJBVElOR19TWVNURU0pCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fT1BFUkFUSU5HX1NZU1RFTTsKLSAgICAgICAgdG9vbEluZm8uZ2V0VG9vbEVudmlyb25tZW50KCkuc2V0T1NOYW1lKAotICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICB0b29sSW5mby5nZXRUb29sRW52aXJvbm1lbnQoKS5zZXRPU1ZlcnNpb24oCi0gICAgICAgICAgYXR0cmlidXRlcy5nZXRWYWx1ZShXU0lDb25zdGFudHMuQVRUUl9WRVJTSU9OKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDx4bWxQYXJzZXI+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fWE1MX1BBUlNFUikKLSAgICAgIHsKLSAgICAgICAgY3VycmVudEVsZW1lbnQgPSBXU0lDb25zdGFudHMuRUxFTV9YTUxfUEFSU0VSOwotICAgICAgICB0b29sSW5mby5nZXRUb29sRW52aXJvbm1lbnQoKS5zZXRYTUxQYXJzZXJOYW1lKAotICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICB0b29sSW5mby5nZXRUb29sRW52aXJvbm1lbnQoKS5zZXRYTUxQYXJzZXJWZXJzaW9uKAotICAgICAgICAgIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVkVSU0lPTikpOwotICAgICAgfQotCi0gICAgICAvLyA8bWVzc2FnZUVudHJ5PgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfRU5UUlkpCi0gICAgICB7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9FTlRSWTsKLSAgICAgICAgZW50cnlFbGVtZW50TG9jYXRpb24gPSBuZXcgRWxlbWVudExvY2F0aW9uKHRoaXMubG9jYXRvcik7Ci0gICAgICAgIHRpbWVzdGFtcCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfVElNRVNUQU1QKTsKLSAgICAgICAgY29udmVyc2F0aW9uSUQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX0NPTlZFUlNBVElPTl9JRCk7Ci0gICAgICAgIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZShXU0lDb25zdGFudHMuQVRUUl9JRF9VQyk7Ci0gICAgICAgIHR5cGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX1RZUEUpOwotICAgICAgfQotCi0gICAgICAvLyA8aHR0cEhlYWRlcnM+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fSFRUUF9IRUFERVJTKQotICAgICAgewotICAgICAgICAvL05vdGU6IENoYXJhY3RlciBkYXRhIGNvdWxkIGJlIHNwbGl0IHVwIGFuZCByZXR1cm5lZCAKLSAgICAgICAgLy9pbiBtb3JlIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVycyBjYWxsLiAKLSAgICAgICAgaHR0cEhlYWRlcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fSFRUUF9IRUFERVJTOwotICAgICAgfQotCi0gICAgICAvLyA8bWVzc2FnZUNvbnRlbnQ+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9DT05URU5UKQotICAgICAgewotICAgICAgICBtZXNzYWdlQ29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgbWltZVBhcnRzID0gbnVsbDsKLSAgICAgICAgY3VycmVudEVsZW1lbnQgPSBXU0lDb25zdGFudHMuRUxFTV9NRVNTQUdFX0NPTlRFTlQ7Ci0gICAgICAgIFN0cmluZyBib21TdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX0JPTSk7Ci0gICAgICAgIGlmIChib21TdHJpbmcgIT0gbnVsbCkKLSAgICAgICAgICBib20gPSBJbnRlZ2VyLnZhbHVlT2YoYm9tU3RyaW5nKS5pbnRWYWx1ZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYm9tID0gMDsKLSAgICAgIH0KLQotICAgICAgLy8gPG1lc3NhZ2VDb250ZW50V2l0aEF0dGFjaG1lbnRzPgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTKQotICAgICAgewotICAgICAgICBtZXNzYWdlQ29udGVudCA9IG51bGw7Ci0gICAgICAgIG1pbWVQYXJ0cyA9IG5ldyBNaW1lUGFydHNJbXBsKCk7Ci0KLSAgICAgICAgU3RyaW5nIGJvbVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV1NJQ29uc3RhbnRzLkFUVFJfQk9NKTsKLSAgICAgICAgaWYgKGJvbVN0cmluZyAhPSBudWxsKQotICAgICAgICAgIGJvbSA9IEludGVnZXIudmFsdWVPZihib21TdHJpbmcpLmludFZhbHVlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBib20gPSAwOwotICAgICAgfQotCi0gICAgICAvLyA8bWltZVBhcnQ+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9QQVJUKQotICAgICAgewotICAgICAgICBpZiAoYm91bmRhcmllcyA9PSBudWxsKQotICAgICAgICAgIGJvdW5kYXJpZXMgPSBuZXcgQXJyYXlMaXN0KDIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYm91bmRhcmllcy5jbGVhcigpOwotICAgICAgfQotCi0gICAgICAvLyA8Ym91bmRhcnlTdHJpbmc+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fQk9VTkRBUllfU1RSSU5HKQotICAgICAgewotICAgICAgICBib3VuZGFyeSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgY3VycmVudEVsZW1lbnQgPSBXU0lDb25zdGFudHMuRUxFTV9CT1VOREFSWV9TVFJJTkc7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtaW1lSGVhZGVycz4KLSAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZSA9PSBXU0lDb25zdGFudHMuRUxFTV9NSU1FX0hFQURFUlMpCi0gICAgICB7Ci0gICAgICAgIG1pbWVIZWFkZXJzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBjdXJyZW50RWxlbWVudCA9IFdTSUNvbnN0YW50cy5FTEVNX01JTUVfSEVBREVSUzsKLSAgICAgIH0KLQotICAgICAgLy8gPG1pbWVDb250ZW50PgotICAgICAgZWxzZSBpZiAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX01JTUVfQ09OVEVOVCkKLSAgICAgIHsKLSAgICAgICAgbWltZUNvbnRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGN1cnJlbnRFbGVtZW50ID0gV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9DT05URU5UOwotICAgICAgfQotCi0gICAgICAvLyA8c2VuZGVySG9zdEFuZFBvcnQ+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fU0VOREVSX0hPU1RfQU5EX1BPUlQpCi0gICAgICB7Ci0gICAgICAgIHNlbmRlckhvc3RBbmRQb3J0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBjdXJyZW50RWxlbWVudCA9IFdTSUNvbnN0YW50cy5FTEVNX1NFTkRFUl9IT1NUX0FORF9QT1JUOwotICAgICAgfQotCi0gICAgICAvLyA8cmVjZWl2ZXJIb3N0QW5kUG9ydD4KLSAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZSA9PSBXU0lDb25zdGFudHMuRUxFTV9SRUNFSVZFUl9IT1NUX0FORF9QT1JUKQotICAgICAgewotICAgICAgICByZWNlaXZlckhvc3RBbmRQb3J0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBjdXJyZW50RWxlbWVudCA9IFdTSUNvbnN0YW50cy5FTEVNX1JFQ0VJVkVSX0hPU1RfQU5EX1BPUlQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIAotICAgICogQ2hhcmFjdGVycyBjYWxsYmFjay4gCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQotICAgIHsKLSAgICAgIC8vIElnbm9yaW5nIENSTEYgdGhhdCBhcHBlYXJzIGluIGxvZyBlbGVtZW50cwotICAgICAgaW50IGFsdFN0YXJ0ID0gc3RhcnQ7Ci0gICAgICBpbnQgYWx0TGVuZ3RoID0gbGVuZ3RoOwotICAgICAgaWYgKHN0YXJ0ID4gMCAmJiBjaFtzdGFydC0xXSA9PSAxMyAmJiBjaFtzdGFydF0gPT0gMTApCi0gICAgICB7Ci0gICAgICAgIGFsdFN0YXJ0Kys7Ci0gICAgICAgIGFsdExlbmd0aC0tOwotICAgICAgfQotCi0gICAgICAvLyA8d3NpLW1vbkNvbmZpZzpjb21tZW50PgotICAgICAgaWYgKG1vbml0b3JDb21tZW50ICE9IG51bGwgJiYgY3VycmVudEVsZW1lbnQgPT0gV1NJQ29uc3RhbnRzLkVMRU1fQ09NTUVOVCkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvckNvbW1lbnQuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPG1lc3NhZ2VDb250ZW50PgotICAgICAgZWxzZSBpZiAobWVzc2FnZUNvbnRlbnQgIT0gbnVsbAotICAgICAgICAmJiBjdXJyZW50RWxlbWVudCA9PSBXU0lDb25zdGFudHMuRUxFTV9NRVNTQUdFX0NPTlRFTlQpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VDb250ZW50LmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxodHRwSGVhZGVycz4KLSAgICAgIGVsc2UgaWYgKGh0dHBIZWFkZXJzICE9IG51bGwKLSAgICAgICAgJiYgY3VycmVudEVsZW1lbnQgPT0gV1NJQ29uc3RhbnRzLkVMRU1fSFRUUF9IRUFERVJTKQotICAgICAgewotICAgICAgICBodHRwSGVhZGVycy5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8Ym91bmRhcnlTdHJpbmc+Ci0gICAgICBlbHNlIGlmIChib3VuZGFyeSAhPSBudWxsCi0gICAgICAgICYmIGN1cnJlbnRFbGVtZW50ID09IFdTSUNvbnN0YW50cy5FTEVNX0JPVU5EQVJZX1NUUklORykKLSAgICAgIHsKLSAgICAgICAgYm91bmRhcnkuYXBwZW5kKGNoLCBhbHRTdGFydCwgYWx0TGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPG1pbWVIZWFkZXJzPgotICAgICAgZWxzZSBpZiAobWltZUhlYWRlcnMgIT0gbnVsbAotICAgICAgICAmJiBjdXJyZW50RWxlbWVudCA9PSBXU0lDb25zdGFudHMuRUxFTV9NSU1FX0hFQURFUlMpCi0gICAgICB7Ci0gICAgICAgIG1pbWVIZWFkZXJzLmFwcGVuZChjaCwgYWx0U3RhcnQsIGFsdExlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtaW1lQ29udGVudD4KLSAgICAgIGVsc2UgaWYgKG1pbWVDb250ZW50ICE9IG51bGwKLSAgICAgICAgJiYgY3VycmVudEVsZW1lbnQgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9DT05URU5UKQotICAgICAgewotICAgICAgICBtaW1lQ29udGVudC5hcHBlbmQoY2gsIGFsdFN0YXJ0LCBhbHRMZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8c2VuZGVySG9zdEFuZFBvcnQ+Ci0gICAgICBlbHNlIGlmIChzZW5kZXJIb3N0QW5kUG9ydCAhPSBudWxsCi0gICAgICAgICYmIGN1cnJlbnRFbGVtZW50ID09IFdTSUNvbnN0YW50cy5FTEVNX1NFTkRFUl9IT1NUX0FORF9QT1JUKQotICAgICAgewotICAgICAgICBzZW5kZXJIb3N0QW5kUG9ydC5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8cmVjZWl2ZXJIb3N0QW5kUG9ydD4KLSAgICAgIGVsc2UgaWYgKHJlY2VpdmVySG9zdEFuZFBvcnQgIT0gbnVsbAotICAgICAgICAmJiBjdXJyZW50RWxlbWVudCA9PSBXU0lDb25zdGFudHMuRUxFTV9SRUNFSVZFUl9IT1NUX0FORF9QT1JUKQotICAgICAgewotICAgICAgICByZWNlaXZlckhvc3RBbmRQb3J0LmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIEVuZCBFbGVtZW50LiAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKLSAgICB7Ci0gICAgICAvLyA8d3NpLWNvbmZpZzpjb21tZW50PgotICAgICAgaWYgKAotICAgICAgICAobG9jYWxOYW1lID09IFdTSUNvbnN0YW50cy5FTEVNX0NPTU1FTlQpCi0gICAgICAgICAgJiYgKG5hbWVzcGFjZVVSSSA9PSBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRykpCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHdlIHNhdmVkIHRoZSBjb21tZW50LCB0aGVuIHByb2Nlc3MgaXQgYW5kIHRoZSBsb2cgdGltZXN0YW1wCi0gICAgICAgIGlmICh0aGlzLm1vbml0b3JDb21tZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBBcnRpZmFjdFJlZmVyZW5jZSBhcnRpZmFjdFJlZmVyZW5jZSA9IG5ldyBBcnRpZmFjdFJlZmVyZW5jZUltcGwoKTsKLSAgICAgICAgICBhcnRpZmFjdFJlZmVyZW5jZS5zZXRUaW1lc3RhbXAodGhpcy5sb2dUaW1lc3RhbXApOwotICAgICAgICAgIENvbW1lbnQgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotICAgICAgICAgIGNvbW1lbnQuc2V0VGV4dChtb25pdG9yQ29tbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICBhcnRpZmFjdFJlZmVyZW5jZS5zZXREb2N1bWVudEVsZW1lbnQoCi0gICAgICAgICAgICBjb21tZW50LAotICAgICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX01PTklUT1JfQ09ORklHKTsKLSAgICAgICAgICBwcm9jZXNzQXJ0aWZhY3RSZWZlcmVuY2UoYXJ0aWZhY3RSZWZlcmVuY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxib3VuZGFyeVN0cmluZz4KLSAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZSA9PSBXU0lDb25zdGFudHMuRUxFTV9CT1VOREFSWV9TVFJJTkcpCi0gICAgICB7Ci0gICAgICAgIC8vIEFkZGluZyBib3VuZGFyeSBzdHJpbmcgdG8gYSBsaXN0Ci0gICAgICAgIGJvdW5kYXJpZXMuYWRkKGJvdW5kYXJ5LnRvU3RyaW5nKCkpOwotICAgICAgfQotCi0gICAgICAvLyA8bWltZVBhcnQ+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9QQVJUKQotICAgICAgewotICAgICAgICAvLyBDcmVhdGluZyBhIE1lc3NhZ2VNSU1FUGFydCBpbnN0YW5jZQotICAgICAgICBNaW1lUGFydCBwYXJ0ID0gbmV3IE1pbWVQYXJ0SW1wbCgpOwotICAgICAgICBwYXJ0LnNldEhlYWRlcnMobWltZUhlYWRlcnMudG9TdHJpbmcoKSk7Ci0gICAgICAgIHBhcnQuc2V0Q29udGVudChtaW1lQ29udGVudC50b1N0cmluZygpKTsKLSAgICAgICAgcGFydC5zZXRCb3VuZGFyeVN0cmluZ3MoKFN0cmluZ1tdKWJvdW5kYXJpZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0KLSAgICAgICAgbWltZVBhcnRzLmFkZFBhcnQocGFydCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtZXNzYWdlRW50cnk+Ci0gICAgICBlbHNlIGlmIChsb2NhbE5hbWUgPT0gV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9FTlRSWSkKLSAgICAgIHsKLSAgICAgICAgLy8gQXNzdW1wdGlvbjogUmVsYXRlZCBtZXNzYWdlcyBhcmUgc2VxdWVudGlhbGx5IGF2YWlsYWJsZSBpbiB0aGUgbWVzc2FnZSBsb2cuCi0gICAgICAgIGlmIChNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNULmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDcmVhdGUgbG9nIGVudHJ5Ci0gICAgICAgICAgTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeVJlcXVlc3QgPQotICAgICAgICAgICAgY3JlYXRlTWVzc2FnZUVudHJ5KAotICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklELAotICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgIHNlbmRlckhvc3RBbmRQb3J0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgcmVjZWl2ZXJIb3N0QW5kUG9ydC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50ID09IG51bGwgPyAiIiA6IG1lc3NhZ2VDb250ZW50LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgaHR0cEhlYWRlcnMudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBtaW1lUGFydHMsCi0gICAgICAgICAgICAgICAgZW50cnlFbGVtZW50TG9jYXRpb24pOwotCi0gICAgICAgICAgLy8gQWRkIGxvZyBlbnRyeSB0byB0aGUgbGlzdAotICAgICAgICAgIG1lc3NhZ2VFbnRyeUxpc3QuYWRkKG1lc3NhZ2VFbnRyeVJlcXVlc3QpOwotCi0gICAgICAgICAgLy8gUmVxdWVzdCBpcyBub3cgcHJvY2Vzc2VkIG9ubHkgd2hlbiB0aGUgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuICAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSBpZiAoTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIENyZWF0ZSBsb2cgZW50cnkKLSAgICAgICAgICBNZXNzYWdlRW50cnkgbWVzc2FnZUVudHJ5UmVzcG9uc2UgPQotICAgICAgICAgICAgY3JlYXRlTWVzc2FnZUVudHJ5KAotICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklELAotICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgIHNlbmRlckhvc3RBbmRQb3J0LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgcmVjZWl2ZXJIb3N0QW5kUG9ydC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50ID09IG51bGwgPyAiIiA6IG1lc3NhZ2VDb250ZW50LnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgaHR0cEhlYWRlcnMudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBtaW1lUGFydHMsCi0gICAgICAgICAgICAgICAgZW50cnlFbGVtZW50TG9jYXRpb24pOwotCi0gICAgICAgICAgLy8gQWRkIGxvZyBlbnRyeSB0byB0aGUgbGlzdAotICAgICAgICAgIG1lc3NhZ2VFbnRyeUxpc3QuYWRkKG1lc3NhZ2VFbnRyeVJlc3BvbnNlKTsKLQotICAgICAgICAgIGlmIChsb2dFbnRyeUhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBsb29rIHVwIHRoZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIElTU1VFIDogbmVlZCB0byB0aHJvdyAmIGNhdGNoIGEgbnVsbHBvaW50ZXJleGNlcHRpb24gaW4gaGVyZS4uLgotICAgICAgICAgICAgTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeVJlcXVlc3QgPSBmaW5kUmVsYXRlZFJlcXVlc3QobWVzc2FnZUVudHJ5UmVzcG9uc2UpOwotCi0gICAgICAgICAgICBpZiAobWVzc2FnZUVudHJ5UmVxdWVzdCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgICAgICAgICAgIC8vIEFERDogTmVlZCB0byBjcmVhdGUgZW50cnkgZnJvbSByZXBvcnQKLSAgICAgICAgICAgICAgLy9FbnRyeSBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICAgICAgICAgICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnlJbXBsKCk7Ci0gICAgICAgICAgICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgICAgICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVFVRVNUKSk7Ci0gICAgICAgICAgICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKG1lc3NhZ2VFbnRyeVJlcXVlc3QuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKG1lc3NhZ2VFbnRyeVJlcXVlc3QpOwotCi0gICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgY29udGV4dCBmb3IgdGhlIHJlcXVlc3QtcmVzcG9uc2UgcGFpcgotICAgICAgICAgICAgICBFbnRyeUNvbnRleHQgcmVxdWVzdFRhcmdldENvbnRleHQgPQotICAgICAgICAgICAgICAgIG5ldyBFbnRyeUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRW50cnlSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlRW50cnlSZXNwb25zZSk7Ci0gICAgICAgICAgICAgIGlmIChyZXF1ZXN0VGFyZ2V0Q29udGV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHByb2Nlc3NMb2dFbnRyeShyZXF1ZXN0VGFyZ2V0Q29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBlbnRyeSAKLSAgICAgICAgICAgIC8vIEFERDogTmVlZCB0byBjcmVhdGUgZW50cnkgZnJvbSByZXBvcnQKLSAgICAgICAgICAgIC8vRW50cnkgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICAgICAgICBFbnRyeSBlbnRyeSA9IG5ldyBFbnRyeUltcGwoKTsKLSAgICAgICAgICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVTUE9OU0UpKTsKLSAgICAgICAgICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKG1lc3NhZ2VFbnRyeVJlc3BvbnNlLmdldElkKCkpOwotICAgICAgICAgICAgZW50cnkuc2V0RW50cnlEZXRhaWwobWVzc2FnZUVudHJ5UmVzcG9uc2UpOwotCi0gICAgICAgICAgICBFbnRyeUNvbnRleHQgcmVzcG9uc2VUYXJnZXRDb250ZXh0ID0KLSAgICAgICAgICAgICAgbmV3IEVudHJ5Q29udGV4dCgKLSAgICAgICAgICAgICAgICAgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgbWVzc2FnZUVudHJ5UmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2VFbnRyeVJlc3BvbnNlKTsKLSAgICAgICAgICAgIGlmIChyZXNwb25zZVRhcmdldENvbnRleHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgcHJvY2Vzc0xvZ0VudHJ5KHJlc3BvbnNlVGFyZ2V0Q29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGN1cnJlbnRFbGVtZW50ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogCi0gICAgKiBFbmQgRG9jdW1lbnQuIAotICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIC8vSWYgd2Ugd2FudCB0byBzZXJpYWxseSBwcm9jZXNzIHRoZSBsb2cgZmlsZS4gIEludm9rZSB2YWxpZGF0ZU1lc3NhZ2VzIHdpdGgKLSAgICAgIC8vbXNnVmFsaWRhdG9yIT1udWxsLiAgSGVyZSB3ZSBoYXZlIHRoZSBvcHRpb24gb2YgY2xlYXJpbmcgdGhlIGxvZ0VudHJ5IHZlY3RvcgotICAgICAgLy9vbmNlIG1lc3NhZ2UgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgLy9pZiAobXNnVmFsaWRhdG9yIT1udWxsKQotICAgICAgLy9sb2dFbnRyeUxpc3QuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIHRoZSBtZXNzYWdlIGluIHRoZSBsb2cgZW50cnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJvY2Vzc0xvZ0VudHJ5KEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vQmVmb3JlIHZhbGlkYXRpbmcgYW55IG1lc3NhZ2VzIGNoZWNrIGlmIGltcGxlbWVudGVyIGlzIHRoZSBmaXJzdCBlbGVtZW50LgotICAgICAgICBsb2dFbnRyeUhhbmRsZXIucHJvY2Vzc0xvZ0VudHJ5KGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHdzaUV4Y2VwdGlvbiA9Ci0gICAgICAgICAgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgICAgICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB2YWxpZGF0aW5nIgotICAgICAgICAgICAgICArICIgdGhlIG1lc3NhZ2UgbG9nRW50cnk6ICIKLSAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SWQoKSwKLSAgICAgICAgICAgIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb2Nlc3MgdGhlIGFydGlmYWN0IHJlZmVyZW5jZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0FydGlmYWN0UmVmZXJlbmNlKEFydGlmYWN0UmVmZXJlbmNlIGFydGlmYWN0UmVmZXJlbmNlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvL0JlZm9yZSB2YWxpZGF0aW5nIGFueSBtZXNzYWdlcyBjaGVjayBpZiBpbXBsZW1lbnRlciBpcyB0aGUgZmlyc3QgZWxlbWVudC4KLSAgICAgICAgbG9nRW50cnlIYW5kbGVyLnByb2Nlc3NBcnRpZmFjdFJlZmVyZW5jZShhcnRpZmFjdFJlZmVyZW5jZSk7Ci0gICAgICB9Ci0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgd3NpRXhjZXB0aW9uID0KLSAgICAgICAgICBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICAgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmciCi0gICAgICAgICAgICAgICsgIiB0aGUgYXJ0aWZhY3QgcmVmZXJlbmNlOiAiCi0gICAgICAgICAgICAgICsgYXJ0aWZhY3RSZWZlcmVuY2UudG9TdHJpbmcoKSwKLSAgICAgICAgICAgIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAgICogRmluZCB0aGUgcmVsYXRlZCBSZXF1ZXN0IExvZ0VudHJ5LiAgVGhlIGN1cnJlbnQgcnVsZSBmb3IgcmVsYXRlZCBsb2cgZW50aXJlcyBpcwotICAgICAgICogdGhhdCBhIHJlcXVlc3Qgd2lsbCBhbHdheXMgcHJlY2VkZSBpdHMgcmVzcG9uc2UuCi0gICAgICAgKiBJU1NVRTogU2VxdWVuY2UgaW4gbG9nIGZpbGUgaXMgdGltZXN0YW1wIGRyaXZlbiAobW9uaXRvciBzcGVjKS4gCi0gICAgICAgKiBBc3NlcnRpb24gaXMgdGhhdCBmb3IgYSBnaXZlbiBjb252ZXJzYXRpb25JRCwgYSBzZWNvbmQgcmVxdWVzdCBpcyBub3Qgc2VudCAKLSAgICAgICAqIHVudGlsIGl0cyByZXNwb25zZSBpcyByZWNlaXZlZCAoY2hyb25vbG9naWNhbGx5KS4gCi0gICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGhhdmUgdG8gYmUgbW9kaWZpZWQgaWYgdGhlIHJ1bGUgY2hhbmdlcy4KLSAgICAgICAqLwotICAgIC8vIGNvdWxkIGJlIG1hZGUgbW9yZSBlZmZpY2llbnQgYnkga2VlcGluZyBhIG11Y2ggc21hbGxlciBsaXN0IG9mIHVucmVzcG9uZGVkIHJlcXVlc3RzLi4uCi0gICAgcHVibGljIE1lc3NhZ2VFbnRyeSBmaW5kUmVsYXRlZFJlcXVlc3QoTWVzc2FnZUVudHJ5IGxvZ0VudHJ5UmVzcG9uc2UpCi0gICAgewotICAgICAgZm9yIChpbnQgZW50cnkgPSBtZXNzYWdlRW50cnlMaXN0LnNpemUoKSAtIDE7IGVudHJ5ID49IDA7IGVudHJ5LS0pCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCB0aGUgbG9nIGVudHJ5IG9mIHRoZSBtYXRjaGluZyByZXF1ZXN0Ci0gICAgICAgIE1lc3NhZ2VFbnRyeSBsb2dFbnRyeSA9IChNZXNzYWdlRW50cnkpIG1lc3NhZ2VFbnRyeUxpc3QuZ2V0KGVudHJ5KTsKLSAgICAgICAgLy8gSWdub3JlIG93biBlbnRyeQotICAgICAgICBpZiAoIWxvZ0VudHJ5UmVzcG9uc2UuZXF1YWxzKGxvZ0VudHJ5KSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChsb2dFbnRyeVJlc3BvbnNlCi0gICAgICAgICAgICAuZ2V0Q29udmVyc2F0aW9uSWQoKQotICAgICAgICAgICAgLmVxdWFscyhsb2dFbnRyeS5nZXRDb252ZXJzYXRpb25JZCgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBmb3VuZCB0aGUgbW9zdCByZWNlbnRseSByZWFkIG1lc3NhZ2Ugd2l0aCB0aGUgc2FtZSBjb252ZXJzYXRpb25JRC4KLSAgICAgICAgICAgIC8vIEZyb20gYWJvdmUsIHRoaXMgc2hvdWxkIGJlIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVlc3QuIENoZWNrIGFzIGZhciBhcyBwb3NzaWJsZS4KLSAgICAgICAgICAgIGlmIChsb2dFbnRyeS5nZXRUeXBlKCkuZXF1YWxzKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gbG9nRW50cnk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBleHBlY3RlZCBhIHJlcXVlc3QuIG5lZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAvLyBjb252ZXJzYXRpb25JRCBtYXRjaCBub3QgZm91bmQgYW55d2hlcmUuIG5lZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBsb2cgZW50cnkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlRW50cnkgY3JlYXRlTWVzc2FnZUVudHJ5KAotICAgICAgU3RyaW5nIGlkLAotICAgICAgU3RyaW5nIGNvbnZlcnNhdGlvbklkLAotICAgICAgU3RyaW5nIHR5cGUsCi0gICAgICBTdHJpbmcgdGltZXN0YW1wLAotICAgICAgU3RyaW5nIHNlbmRlcklQUG9ydCwKLSAgICAgIFN0cmluZyByZWNlaXZlcklQUG9ydCwKLSAgICAgIFN0cmluZyBtZXNzYWdlQ29udGVudCwKLSAgICAgIFN0cmluZyBodHRwSGVhZGVycywKLSAgICAgIE1pbWVQYXJ0cyBtaW1lUGFydHMsCi0gICAgICBFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uKQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSBsb2cgZW50cnkKLSAgICAgIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBuZXcgTWVzc2FnZUVudHJ5SW1wbCgpOwotICAgICAgbWVzc2FnZUVudHJ5LnNldElkKGlkKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRDb252ZXJzYXRpb25JZChjb252ZXJzYXRpb25JRCk7Ci0gICAgICBtZXNzYWdlRW50cnkuc2V0VHlwZSh0eXBlKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRTZW5kZXJIb3N0QW5kUG9ydChzZW5kZXJJUFBvcnQpOwotICAgICAgbWVzc2FnZUVudHJ5LnNldFJlY2VpdmVySG9zdEFuZFBvcnQocmVjZWl2ZXJJUFBvcnQpOwotICAgICAgbWVzc2FnZUVudHJ5LnNldEhUVFBIZWFkZXJzKGh0dHBIZWFkZXJzKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRCT00oYm9tKTsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRFbGVtZW50TG9jYXRpb24oZWxlbWVudExvY2F0aW9uKTsKLQotICAgICAgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKLSAgICAgIGlmIChtaW1lUGFydHMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IHRoZSBlbmNvZGluZyBmb3IgdGhpcyBtZXNzYWdlIGNvbnRlbnQKLSAgICAgICAgZW5jb2RpbmcgPSBVdGlscy5nZXRYTUxFbmNvZGluZyhtZXNzYWdlQ29udGVudCk7Ci0gICAgICAgIG1lc3NhZ2VFbnRyeS5zZXRNZXNzYWdlKG1lc3NhZ2VDb250ZW50KTsKLSAgICAgICAJbWVzc2FnZUVudHJ5LnNldE1pbWVDb250ZW50KGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAJbWVzc2FnZUVudHJ5LnNldE1pbWVQYXJ0cyhtaW1lUGFydHMpOwotICAgICAgIAlNaW1lUGFydCByb290ID0gVXRpbHMuZmluZFJvb3RQYXJ0KGh0dHBIZWFkZXJzLCBtaW1lUGFydHMuZ2V0UGFydHMoKSk7Ci0gICAgICAgCWlmIChyb290ICE9IG51bGwpCi0gICAgICAgCXsKLSAgICAgICAgICAvLyBHZXQgdGhlIGVuY29kaW5nIGZvciB0aGlzIG1lc3NhZ2UgY29udGVudAotICAgICAgICAgIGVuY29kaW5nID0gVXRpbHMuZ2V0WE1MRW5jb2Rpbmcocm9vdC5nZXRDb250ZW50KCkpOwotICAgICAgICAgIG1pbWVQYXJ0cy5zZXRSb290UGFydChyb290KTsKLSAgICAgICAJfQotICAgCQkvLyBlbHNlIGVtcHR5IGJvZHkKLSAgICAgICAJbWVzc2FnZUVudHJ5LnNldE1pbWVDb250ZW50KHRydWUpOwotICAgICAgfQotICAgICAgaWYgKChlbmNvZGluZyA9PSBudWxsKSB8fCAoZW5jb2RpbmcuZXF1YWxzKCIiKSkpCi0gICAgICAgICBlbmNvZGluZyA9IFdTSUNvbnN0YW50cy5ERUZBVUxUX1hNTF9FTkNPRElORzsKLSAgICAgIG1lc3NhZ2VFbnRyeS5zZXRFbmNvZGluZyhlbmNvZGluZyk7Ci0KLSAgICAgIHJldHVybiBtZXNzYWdlRW50cnk7Ci0gICAgfQotCi0gIH0gLy9FbmQgQ29udGVudEhhbmRsZXIKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nV3JpdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9pbXBsL0xvZ1dyaXRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlZTk4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTG9nV3JpdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5pbXBsLkRvY3VtZW50V3JpdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLkxvZ1dyaXRlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHdyaXRlIHRoZSBMb2cgZmlsZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgTmVpbCBEZWxpbWEgKG5kZGVsaW1hQGNhLmlibS5jb20pCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIExvZ1dyaXRlckltcGwgZXh0ZW5kcyBEb2N1bWVudFdyaXRlckltcGwgaW1wbGVtZW50cyBMb2dXcml0ZXIKLXsKLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dXcml0ZXIjd3JpdGUoTG9nKQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKExvZyBsb2cpCi0gICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBJZiB0aGUgd3JpdGVyIHdhcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRocm93IGFuIGV4Y2VwdGlvbgotICAgIGlmICh3cml0ZXIgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCB3cml0ZSBsb2cgZmlsZSBzaW5jZSB3cml0ZXIgd2FzIG5vdCBzZXQuIik7Ci0KLSAgICAvLyBXcml0ZSBsb2cgZmlsZQotICAgIHdyaXRlKGxvZywgd3JpdGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nV3JpdGVyI3dyaXRlKExvZywgV3JpdGVyKQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKExvZyBsb2csIFdyaXRlciB3cml0ZXIpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEFERDoKLSAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJXcml0ZSBlbnRpcmUgbG9nIGZpbGUgZnVuY3Rpb24gbm90IHN1cHBvcnRlZCB5ZXQuIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9NZXNzYWdlRW50cnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTWVzc2FnZUVudHJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmM3YTNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9NZXNzYWdlRW50cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5FbGVtZW50TG9jYXRpb247Ci0KLS8qKgotICogTWVzc2FnZSBlbnRyeSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUVudHJ5SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VFbnRyeQotewotICAvKioKLSAgICogTG9nIGVudHJ5IGlkLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZDsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnNhdGlvbklkOwotICBwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdGltZXN0YW1wOwotICBwcm90ZWN0ZWQgU3RyaW5nIHNlbmRlckhvc3RBbmRQb3J0OwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlY2VpdmVySG9zdEFuZFBvcnQ7Ci0gIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9ICIiOwotICBwcm90ZWN0ZWQgU3RyaW5nIGh0dHBIZWFkZXJzID0gIiI7Ci0gIHByb3RlY3RlZCBpbnQgYm9tOwotICBwcm90ZWN0ZWQgU3RyaW5nIGVuY29kaW5nID0gIiI7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzTWltZUNvbnRlbnQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIE1pbWVQYXJ0cyBtaW1lUGFydHMgPSBuZXcgTWltZVBhcnRzSW1wbCgpOwotCi0gIHByb3RlY3RlZCBFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogRW1wdHkgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUVudHJ5SW1wbCgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjZ2V0SWQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5pZDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I3NldElkKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLSAgewotICAgIHRoaXMuaWQgPSBpZDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I2dldENvbnZlcnNhdGlvbklkKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udmVyc2F0aW9uSWQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuY29udmVyc2F0aW9uSWQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNzZXRDb252ZXJzYXRpb25JZChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb252ZXJzYXRpb25JZChTdHJpbmcgY29udmVyc2F0aW9uSWQpCi0gIHsKLSAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNnZXRUaW1lc3RhbXAoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudGltZXN0YW1wOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjc2V0VGltZXN0YW1wKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgdGltZXN0YW1wKQotICB7Ci0gICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNnZXRUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50eXBlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjc2V0VHlwZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKQotICB7Ci0gICAgdGhpcy50eXBlID0gdHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I2dldFNlbmRlckhvc3RBbmRQb3J0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U2VuZGVySG9zdEFuZFBvcnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuc2VuZGVySG9zdEFuZFBvcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNzZXRTZW5kZXJIb3N0QW5kUG9ydChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTZW5kZXJIb3N0QW5kUG9ydChTdHJpbmcgc2VuZGVySG9zdEFuZFBvcnQpCi0gIHsKLSAgICB0aGlzLnNlbmRlckhvc3RBbmRQb3J0ID0gc2VuZGVySG9zdEFuZFBvcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNnZXRSZWNlaXZlckhvc3RBbmRQb3J0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVjZWl2ZXJIb3N0QW5kUG9ydCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZWNlaXZlckhvc3RBbmRQb3J0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjc2V0UmVjZWl2ZXJIb3N0QW5kUG9ydChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWNlaXZlckhvc3RBbmRQb3J0KFN0cmluZyByZWNlaXZlckhvc3RBbmRQb3J0KQotICB7Ci0gICAgdGhpcy5yZWNlaXZlckhvc3RBbmRQb3J0ID0gcmVjZWl2ZXJIb3N0QW5kUG9ydDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I2dldE1lc3NhZ2UoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkKLSAgewotICAJaWYgKCF0aGlzLmlzTWltZUNvbnRlbnQpCi0gICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTsKLSAgCWVsc2UKLSAgCXsKLSAgCSAgIGlmICh0aGlzLm1pbWVQYXJ0cy5nZXRSb290UGFydCgpID09IG51bGwpIHJldHVybiAiIjsKLSAgCSAgIGVsc2UgcmV0dXJuIHRoaXMubWltZVBhcnRzLmdldFJvb3RQYXJ0KCkuZ2V0Q29udGVudCgpOwotICAJfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTG9nRW50cnkjc2V0TWVzc2FnZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I3NldEVuY29kaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1lc3NhZ2VFbnRyeSNnZXRCT00oKQotICAgKi8KLSAgcHVibGljIGludCBnZXRCT00oKQotICB7Ci0gICAgcmV0dXJuIGJvbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1lc3NhZ2VFbnRyeSNzZXRCT00oaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Qk9NKGludCBib20pCi0gIHsKLSAgICB0aGlzLmJvbSA9IGJvbTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLkxvZ0VudHJ5I2dldEhUVFBIZWFkZXJzKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SFRUUEhlYWRlcnMoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuaHR0cEhlYWRlcnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5Mb2dFbnRyeSNzZXRIVFRQSGVhZGVycyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRIVFRQSGVhZGVycyhTdHJpbmcgaHR0cEhlYWRlcnMpCi0gIHsKLSAgICB0aGlzLmh0dHBIZWFkZXJzID0gaHR0cEhlYWRlcnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NZXNzYWdlRW50cnkjZ2V0RWxlbWVudExvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBFbGVtZW50TG9jYXRpb24gZ2V0RWxlbWVudExvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmVsZW1lbnRMb2NhdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1lc3NhZ2VFbnRyeSNzZXRFbGVtZW50TG9jYXRpb24ob3JnLndzaS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRMb2NhdGlvbihFbGVtZW50TG9jYXRpb24gZWxlbWVudExvY2F0aW9uKQotICB7Ci0gICAgdGhpcy5lbGVtZW50TG9jYXRpb24gPSBlbGVtZW50TG9jYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIHRvWE1MU3RyaW5nKFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9MT0cpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gQUREOiBOZWVkIHRvIGFkZCB3YXkgdG8gaW5kaWNhdGUgWE1MIHNjaGVtYSB0eXBlIGZvciBsb2dFbnRyeQotICAgIC8vIEFkZCBsb2cgZW50cnkKLSAgICBwdy5wcmludCgiPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiICIpOwotICAgIHB3LnByaW50KAotICAgICAgInhzaTp0eXBlPVwiaHR0cE1lc3NhZ2VFbnRyeVwiICIpOwotICAgIHB3LnByaW50KFdTSUNvbnN0YW50cy5BVFRSX0lEX1VDICsgIj1cIiIgKyBpZCArICJcIiAiKTsKLSAgICBwdy5wcmludCgKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0NPTlZFUlNBVElPTl9JRCArICI9XCIiICsgY29udmVyc2F0aW9uSWQgKyAiXCIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSArICI9XCIiICsgdHlwZSArICJcIiAiKTsKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5BVFRSX1RJTUVTVEFNUCArICI9XCIiICsgdGltZXN0YW1wICsgIlwiPiIpOwotCi0gICAgaWYgKGlzTWltZUNvbnRlbnQoKSkKLSAgICB7Ci0gICAgICAgIC8vIEFkZCBtZXNzYWdlIGNvbnRlbnQgd2l0aCBhdHRhY2htZW50cyBlbGVtZW50Ci0gICAgICAgIHB3LnByaW50KCI8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTKTsKLSAgICAgICAgaWYgKGJvbSAhPSAwKQotICAgICAgICAgIHB3LnByaW50KCIgIiArIFdTSUNvbnN0YW50cy5BVFRSX0JPTSArICI9XCIiICsgYm9tICsgIlwiIik7Ci0gICAgICAgIHB3LnByaW50KCI+Iik7Ci0KLSAgICAgICAgQ29sbGVjdGlvbiBwYXJ0TGlzdCA9IG1pbWVQYXJ0cy5nZXRQYXJ0cygpOwotICAgICAgICBpZiAoIXBhcnRMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgCUl0ZXJhdG9yIGlNaW1lUGFydHMgPSBwYXJ0TGlzdC5pdGVyYXRvcigpOwotICAgICAgICAJd2hpbGUgKGlNaW1lUGFydHMuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAJICBNaW1lUGFydCBtaW1lUGFydCA9IChNaW1lUGFydClpTWltZVBhcnRzLm5leHQoKTsKLSAgICAgICAgIAkgIHB3LnByaW50KG1pbWVQYXJ0LnRvWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBlbmQgbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTICsgIj4iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEFkZCBtZXNzYWdlIGNvbnRlbnQgZWxlbWVudAotICAgICAgcHcucHJpbnQoIjwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9DT05URU5UKTsKLSAgICAgIGlmIChib20gIT0gMCkKLSAgICAgICAgcHcucHJpbnQoIiAiICsgV1NJQ29uc3RhbnRzLkFUVFJfQk9NICsgIj1cIiIgKyBib20gKyAiXCIiKTsKLSAgICAgIHB3LnByaW50KCI+Iik7Ci0KLSAgICAgIC8vIEFkZCBlbmNvZGVkIG1lc3NhZ2UKLSAgICAgIHB3LnByaW50KFhNTFV0aWxzLnhtbEVzY2FwZWRTdHJpbmcobWVzc2FnZSkpOwotICAgICAgCi0gICAgICAvLyBBZGQgZW5kIG1lc3NhZ2UgZWxlbWVudAotICAgICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9DT05URU5UICsgIj4iKTsKLSAgICB9Ci0KLSAgICAvLyBBZGQgc2VuZGVySVBQb3J0IGVsZW1lbnQKLSAgICBwdy5wcmludGxuKAotICAgICAgIjwiCi0gICAgICAgICsgbnNOYW1lCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLkVMRU1fU0VOREVSX0hPU1RfQU5EX1BPUlQKLSAgICAgICAgKyAiPiIKLSAgICAgICAgKyBzZW5kZXJIb3N0QW5kUG9ydAotICAgICAgICArICI8LyIKLSAgICAgICAgKyBuc05hbWUKLSAgICAgICAgKyBXU0lDb25zdGFudHMuRUxFTV9TRU5ERVJfSE9TVF9BTkRfUE9SVAotICAgICAgICArICI+Iik7Ci0KLSAgICAvLyBBZGQgcmVjZWl2ZXJJUCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigKLSAgICAgICI8IgotICAgICAgICArIG5zTmFtZQotICAgICAgICArIFdTSUNvbnN0YW50cy5FTEVNX1JFQ0VJVkVSX0hPU1RfQU5EX1BPUlQKLSAgICAgICAgKyAiPiIKLSAgICAgICAgKyByZWNlaXZlckhvc3RBbmRQb3J0Ci0gICAgICAgICsgIjwvIgotICAgICAgICArIG5zTmFtZQotICAgICAgICArIFdTSUNvbnN0YW50cy5FTEVNX1JFQ0VJVkVSX0hPU1RfQU5EX1BPUlQKLSAgICAgICAgKyAiPiIpOwotCi0gICAgLy8gQWRkIEhUVFBIZWFkZXJzIGVsZW1lbnQKLSAgICBwdy5wcmludCgiPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9IVFRQX0hFQURFUlMgKyAiPiIpOwotCi0gICAgLy8gQUREOiBEb2VzIHRoaXMgc3RyaW5nIG5lZWQgdG8gYmUgWE1MIGVuY29kZWQ/Ci0gICAgLy8gQWRkIEhUVFAgaGVhZGVycwotICAgIHB3LnByaW50KFhNTFV0aWxzLnhtbEVzY2FwZWRTdHJpbmcoaHR0cEhlYWRlcnMpKTsKLQotICAgIC8vIEVuZCBIVFRQSGVhZGVycyBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fSFRUUF9IRUFERVJTICsgIj4iKTsKLQotICAgIC8vIEVuZCBsb2cgZW50cnkKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgLy8gUmV0dXJuIHN0cmluZwotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWVzc2FnZUVudHJ5I2lzTWltZUNvbnRlbnQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNaW1lQ29udGVudCgpCi0gIHsKLSAgICByZXR1cm4gaXNNaW1lQ29udGVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1lc3NhZ2VFbnRyeSNzZXRNaW1lQ29udGVudCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNaW1lQ29udGVudChib29sZWFuIGlzTWltZUNvbnRlbnQpCi0gIHsKLSAgICB0aGlzLmlzTWltZUNvbnRlbnQgPSBpc01pbWVDb250ZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWVzc2FnZUVudHJ5I2dldE1JTUVQYXJ0cygpCi0gICAqLwotICBwdWJsaWMgTWltZVBhcnRzIGdldE1pbWVQYXJ0cygpCi0gIHsKLSAgICByZXR1cm4gbWltZVBhcnRzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWVzc2FnZUVudHJ5I3NldE1pbWVQYXJ0cygpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNaW1lUGFydHMoTWltZVBhcnRzIG1pbWVQYXJ0cykKLSAgewotICAgIHRoaXMubWltZVBhcnRzID0gbWltZVBhcnRzOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9NaW1lUGFydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9sb2cvaW1wbC9NaW1lUGFydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAyNWZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTWltZVBhcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDIyLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLS8qKgotICogQGF1dGhvciBsYXV6b25kCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgTWltZVBhcnRJbXBsIGltcGxlbWVudHMgTWltZVBhcnQgCi17Ci0gIHByaXZhdGUgU3RyaW5nIG1pbWVDb250ZW50OwotICBwcml2YXRlIFN0cmluZyBtaW1lSGVhZGVyczsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBib3VuZGFyeVN0cmluZ3MgPSBuZXcgU3RyaW5nWzBdOwotICAKLSAgcHVibGljIE1pbWVQYXJ0SW1wbCAoKQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1pbWVQYXJ0I2dldENvbnRlbnQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkKLSAgewotICAgIHJldHVybiB0aGlzLm1pbWVDb250ZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWltZVBhcnQjc2V0Q29udGVudChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KFN0cmluZyBtaW1lQ29udGVudCkKLSAgewotICAJdGhpcy5taW1lQ29udGVudCA9IG1pbWVDb250ZW50OwotICB9Ci0KLSAgLyoqCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0I2dldEhlYWRlcnMoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJzKCkKLSAgewotICAJcmV0dXJuIHRoaXMubWltZUhlYWRlcnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NaW1lUGFydCNzZXRIZWFkZXJzKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhlYWRlcnMoU3RyaW5nIG1pbWVIZWFkZXJzKQotICB7Ci0gIAl0aGlzLm1pbWVIZWFkZXJzID0gbWltZUhlYWRlcnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NaW1lUGFydCNnZXRCb3VuZGFyeVN0cmluZ3MoKQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEJvdW5kYXJ5U3RyaW5ncygpCi0gIHsKLSAgCXJldHVybiB0aGlzLmJvdW5kYXJ5U3RyaW5nczsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1pbWVQYXJ0I3NldEJvdW5kYXJ5U3RyaW5ncyhTdHJpbmdbXSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEJvdW5kYXJ5U3RyaW5ncyhTdHJpbmdbXSBib3VuZGFyeVN0cmluZ3MpCi0gIHsKLSAgCXRoaXMuYm91bmRhcnlTdHJpbmdzID0gYm91bmRhcnlTdHJpbmdzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiB0b1hNTFN0cmluZyhXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTE9HKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIEFkZCBtaW1lUGFydCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9NSU1FX1BBUlQgICsgIj4iKTsKLSAgICAKLSAgICAvLyBBZGQgYm91bmRhcnkgc3RyaW5nIGVsZW1lbnQKLSAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZGFyeVN0cmluZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgICBwdy5wcmludCgiPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9CT1VOREFSWV9TVFJJTkcgKyAiPiIpOwotICAgICAgICBwdy5wcmludChib3VuZGFyeVN0cmluZ3NbaV0pOwotICAgICAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9CT1VOREFSWV9TVFJJTkcgKyAiPiIpOwotICAgIH0KLSAgIAotICAgIC8vIEFkZCBtaW1lSGVhZGVycyBlbGVtZW50Ci0gICAgcHcucHJpbnQoIjwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9IRUFERVJTICsgIj4iKTsKLSAgICBwdy5wcmludChYTUxVdGlscy54bWxFc2NhcGVkU3RyaW5nKG1pbWVIZWFkZXJzKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9IRUFERVJTICsgIj4iKTsKLQotICAgIC8vIEFkZCBlbmNvZGVkIGNvbnRlbnQKLSAgICBwdy5wcmludCgiPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9NSU1FX0NPTlRFTlQgKyAiPiIpOwotICAgIGlmICgobWltZUNvbnRlbnQuaW5kZXhPZigiPCIpICE9IC0xKSAgfHwgCi0gICAgICAgIChtaW1lQ29udGVudC5pbmRleE9mKCI+IikgIT0gLTEpICB8fCAKLQkJKG1pbWVDb250ZW50LmluZGV4T2YoIlwiIikgIT0gLTEpIHx8Ci0JCShtaW1lQ29udGVudC5pbmRleE9mKCJcJyIpICE9IC0xKSkKLSAgICAJcHcucHJpbnQoWE1MVXRpbHMueG1sRXNjYXBlZFN0cmluZyhtaW1lQ29udGVudCkpOwotICAgIGVsc2UKLSAgICAgICAgcHcucHJpbnQoZ2V0Q29udGVudCgpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9NSU1FX0NPTlRFTlQgKyAiPiIpOwotIAotICAgIC8vIEFkZCBlbmQgbWVzc2FnZSBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUlNRV9QQVJUICsgIj4iKTsKLQotICAgIC8vIFJldHVybiBzdHJpbmcKLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTWltZVBhcnRzSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL2xvZy9pbXBsL01pbWVQYXJ0c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzOTJjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbG9nL2ltcGwvTWltZVBhcnRzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci0KLS8qKgotICogTWltZVBhcnRzSW1wbCBjbGFzcy4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBEYXZpZCBMYXV6b24gKGxhdXpvbmRAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIE1pbWVQYXJ0c0ltcGwgaW1wbGVtZW50cyBNaW1lUGFydHMKLXsKLQkKLSAgcHJvdGVjdGVkIE1pbWVQYXJ0IHJvb3RQYXJ0OwotICBwcm90ZWN0ZWQgQ29sbGVjdGlvbiBtaW1lUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgcHVibGljIE1pbWVQYXJ0c0ltcGwoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NaW1lUGFydHMjZ2V0Um9vdFBhcnQoKQotICAgKi8KLSAgcHVibGljIE1pbWVQYXJ0IGdldFJvb3RQYXJ0KCkKLSAgewotCXJldHVybiByb290UGFydDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1pbWVQYXJ0cyNzZXRSb290UGFydChNaW1lUGFydCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJvb3RQYXJ0KE1pbWVQYXJ0IHJvb3RQYXJ0KQotICB7Ci0gIAl0aGlzLnJvb3RQYXJ0ID0gcm9vdFBhcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmxvZy5NaW1lUGFydHMjY291bnQoKQotICAgKi8KLSAgcHVibGljIGludCBjb3VudCgpCi0gIHsKLQlyZXR1cm4gbWltZVBhcnRzLnNpemUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubG9nLk1pbWVQYXJ0cyNhZGRQYXJ0KE1pbWVQYXJ0KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUGFydChNaW1lUGFydCBwYXJ0KQotICB7Ci0gIAlpZiAocGFydCAhPSBudWxsKQotICAJICBtaW1lUGFydHMuYWRkKHBhcnQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5sb2cuTWltZVBhcnRzI2dldFBhcnRzKCkKLSAgICovCi0gIHB1YmxpYyBDb2xsZWN0aW9uIGdldFBhcnRzKCkKLSAgewotICAJcmV0dXJuIG1pbWVQYXJ0czsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvQ2h1bmtlZERhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL0NodW5rZWREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYjhhZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvQ2h1bmtlZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdpbGwgcHJvY2VzcyBjaHVua2VkIGRhdGEuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDaHVua2VkRGF0YQotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBtb3JlQ2h1bmtlZERhdGEgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBjaHVua2VkRGF0YSA9ICIiOwotICBwcm90ZWN0ZWQgU29ja2V0SGFuZGxlciBzb2NrZXRIYW5kbGVyID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIENodW5rZWREYXRhIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBDaHVua2VkRGF0YSgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgQ2h1bmtlZERhdGEgb2JqZWN0LgotICAgKiBAcGFyYW0gc29ja2V0SGFuZGxlciBzb2NrZXQgaGFuZGxlci4KLSAgICogQHBhcmFtIG1vcmVDaHVua2VkRGF0YSBjaHVua2VkIGRhdGEuCi0gICAqLwotICBwdWJsaWMgQ2h1bmtlZERhdGEoU29ja2V0SGFuZGxlciBzb2NrZXRIYW5kbGVyLCBib29sZWFuIG1vcmVDaHVua2VkRGF0YSkKLSAgewotICAgIHRoaXMuc29ja2V0SGFuZGxlciA9IHNvY2tldEhhbmRsZXI7Ci0gICAgdGhpcy5tb3JlQ2h1bmtlZERhdGEgPSBtb3JlQ2h1bmtlZERhdGE7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIENodW5rZWREYXRhIG9iamVjdC4KLSAgICogQHBhcmFtIHNvY2tldEhhbmRsZXIgc29ja2V0IGhhbmRsZXIuCi0gICAqIEBwYXJhbSBjaHVua2VkRGF0YSBjaHVua2VkIGRhdGEuCi0gICAqLwotICBwdWJsaWMgQ2h1bmtlZERhdGEoU29ja2V0SGFuZGxlciBzb2NrZXRIYW5kbGVyLCBTdHJpbmcgY2h1bmtlZERhdGEpCi0gIHsKLSAgICB0aGlzLnNvY2tldEhhbmRsZXIgPSBzb2NrZXRIYW5kbGVyOwotICAgIHRoaXMuY2h1bmtlZERhdGEgPSBjaHVua2VkRGF0YTsKLSAgICB0aGlzLm1vcmVDaHVua2VkRGF0YSA9IGNoZWNrRGF0YShjaHVua2VkRGF0YSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIHRoZSBjaHVua2VkIGRhdGEgdG8gdGhlIGJ1ZmZlci4KLSAgICogQHBhcmFtIGNodW5rZWREYXRhIGNodW5rZWQgZGF0YS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZERhdGEoU3RyaW5nIGNodW5rZWREYXRhKQotICB7Ci0gICAgdGhpcy5jaHVua2VkRGF0YSArPSBjaHVua2VkRGF0YTsKLSAgICB0aGlzLm1vcmVDaHVua2VkRGF0YSA9IGNoZWNrRGF0YShjaHVua2VkRGF0YSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGRhdGEgYnVmZmVyLgotICAgKiBAcmV0dXJuICBkYXRhIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5jaHVua2VkRGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhciBkYXRhIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyRGF0YSgpCi0gIHsKLSAgICB0aGlzLmNodW5rZWREYXRhID0gIiI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG1vcmUgY2h1bmtlZCBkYXRhLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgbW9yZSBjaHVua2VkIGRhdGEuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc01vcmVDaHVua2VkRGF0YSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5tb3JlQ2h1bmtlZERhdGE7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGFuZCBhZGQgZGF0YSB0byB0aGUgYnVmZmVyLgotICAgKiBAcGFyYW0gbWVzc2FnZUJ1ZmZlciBhIFN0cmluZ0J1ZmZlciBvYmplY3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBkYXRhIGlzIGFkZGVkIHRvIHRoZSBidWZmZXIuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBkZWNvZGVBbmRBZGREYXRhVG9CdWZmZXIoU3RyaW5nQnVmZmVyIG1lc3NhZ2VCdWZmZXIpCi0gIHsKLSAgICBib29sZWFuIG1vcmVDaHVua2VkRGF0YSA9IGZhbHNlOwotICAgIGlmICghdGhpcy5tb3JlQ2h1bmtlZERhdGEpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICBkZWJ1ZygiZGVjb2RlQW5kQWRkRGF0YVRvQnVmZmVyIiwgImNodW5rZWREYXRhOiAiICsgY2h1bmtlZERhdGEpOwotCi0gICAgICBtb3JlQ2h1bmtlZERhdGEgPSBkZWNvZGVEYXRhKGNodW5rZWREYXRhLCBtZXNzYWdlQnVmZmVyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9yZUNodW5rZWREYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGRhdGEuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tEYXRhKFN0cmluZyBjaHVua2VkRGF0YSkKLSAgewotICAgIGJvb2xlYW4gbW9yZUNodW5rZWREYXRhID0gZmFsc2U7Ci0gICAgaW50IGluZGV4OwotCi0gICAgLy8gTG9vayBmb3IgW0NSTEZdWzBdW0NSTEZdIGluIHRoZSBjaHVua2VkIGRhdGEgICAgICAKLSAgICBpZiAoKGluZGV4ID0KLSAgICAgIGNodW5rZWREYXRhLmluZGV4T2YoU29ja2V0SGFuZGxlci5DUkxGICsgIjAiICsgU29ja2V0SGFuZGxlci5DUkxGKSkKLSAgICAgICE9IC0xKQotICAgIHsKLSAgICAgIG1vcmVDaHVua2VkRGF0YSA9IGZhbHNlOwotCi0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKAotICAgICAgICAiY2hlY2tEYXRhIiwKLSAgICAgICAgIkNodW5rIGNvbnRhaW5zIFtDUkxGXVswXVtDUkxGXSwgc28gdGhlcmUgaXMgbm8gbW9yZSBkYXRhLiIpOwotICAgIH0KLQotICAgIC8vIExvb2sgZm9yIFswXVtDUkxGXSBhdCBzdGFydCBvZiBjaHVua2VkIGRhdGEgICAgICAKLSAgICBlbHNlIGlmIChjaHVua2VkRGF0YS5zdGFydHNXaXRoKCIwIiArIFNvY2tldEhhbmRsZXIuQ1JMRikpCi0gICAgewotICAgICAgbW9yZUNodW5rZWREYXRhID0gZmFsc2U7Ci0KLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoCi0gICAgICAgICJjaGVja0RhdGEiLAotICAgICAgICAiQ2h1bmsgZGF0YSBzdGFydHMgd2l0aCBbMF1bQ1JMRl0sIHNvIHRoZXJlIGlzIG5vIG1vcmUgZGF0YS4iKTsKLSAgICB9Ci0KLSAgICAvLyBPdGhlcndpc2Ugc3RlcCB0aHJvdWdoIGl0IHRvIHNlZSBpZiB3ZSBoYXZlIGFsbCBvZiB0aGUgZGF0YQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtb3JlQ2h1bmtlZERhdGEgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBtb3JlQ2h1bmtlZERhdGE7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGNodW5rZWQgZGF0YS4KLSAgICogCi0gICAqIERhdGEgZm9ybWF0OgotICAgKiA8cHJlPgotICAgKiAgIFtDaHVuayBTaXplXVtDUkxGXVtEYXRhIENodW5rXVtDUkxGXVtDaHVuayBTaXplXVtDUkxGXVtEYXRhIENodW5rXVtDUkxGXS4uLlswXVtDUkxGXVtPcHRpb25hbCBGb290ZXJdW0NSTEZdCi0gICAqIDwvcHJlPgotICAgKiAKLSAgICogQHBhcmFtIGNodW5rZWREYXRhCi0gICAqIEBwYXJhbSBtZXNzYWdlTG9nZ2luZ0J1ZmZlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGRlY29kZURhdGEoU3RyaW5nIGNodW5rZWREYXRhLCBTdHJpbmdCdWZmZXIgbWVzc2FnZUJ1ZmZlcikKLSAgewotICAgIGJvb2xlYW4gZW5kT2ZEYXRhID0gZmFsc2U7Ci0gICAgaW50IG5leHRJbmRleCA9IDA7Ci0gICAgaW50IHByZXZJbmRleCA9IDA7Ci0gICAgaW50IGNodW5rU2l6ZSA9IDA7Ci0KLSAgICBTdHJpbmcgbmV4dENodW5rRGF0YSA9IG51bGw7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2h1bmsgb2YgZGF0YQotICAgIHdoaWxlICghKGVuZE9mRGF0YSkKLSAgICAgICYmIChuZXh0SW5kZXggPCBjaHVua2VkRGF0YS5sZW5ndGgoKSkKLSAgICAgICYmIChuZXh0SW5kZXggPSBjaHVua2VkRGF0YS5pbmRleE9mKFNvY2tldEhhbmRsZXIuQ1JMRiwgcHJldkluZGV4KSkgIT0gLTEpCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBkYXRhIGxlbmd0aCB3aGljaCBpcyByaWdodCBhZnRlciB0aGlzCi0gICAgICBTdHJpbmcgaGV4Q2h1bmtlZFNpemUgPSBjaHVua2VkRGF0YS5zdWJzdHJpbmcocHJldkluZGV4LCBuZXh0SW5kZXgpOwotCi0gICAgICAvLyBEZWNvZGUgbGVuZ3RoCi0gICAgICBjaHVua1NpemUgPSBJbnRlZ2VyLmRlY29kZSgiMHgiICsgaGV4Q2h1bmtlZFNpemUpLmludFZhbHVlKCk7Ci0KLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoImRlY29kZURhdGEiLCAiY2h1bmtlZFNpemU6ICIgKyBjaHVua1NpemUpOwotCi0gICAgICAvLyBJZiBzaXplIGlzIHplcm8sIHRoZW4gd2UgaGF2ZSBoaXQgdGhlIGVuZCBvZiB0aGUgY2h1bmtlZCBkYXRhCi0gICAgICBpZiAoY2h1bmtTaXplID09IDApCi0gICAgICB7Ci0gICAgICAgIGVuZE9mRGF0YSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYWxsIG9mIHRoZSBkYXRhIHRoZW4gc3RvcAotICAgICAgZWxzZSBpZiAobmV4dEluZGV4ICsgMiArIGNodW5rU2l6ZSA+IGNodW5rZWREYXRhLmxlbmd0aCgpKQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBuZXh0Q2h1bmtEYXRhID0KLSAgICAgICAgICBjaHVua2VkRGF0YS5zdWJzdHJpbmcobmV4dEluZGV4ICsgMiwgbmV4dEluZGV4ICsgMiArIGNodW5rU2l6ZSk7Ci0KLSAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgIGRlYnVnKCJkZWNvZGVEYXRhIiwgIm5leHRDaHVua0RhdGE6ICIgKyBuZXh0Q2h1bmtEYXRhKTsKLQotICAgICAgICAvLyBHZXQgbWVzc2FnZSBiYXNlZCBvbiBsZW5ndGgKLSAgICAgICAgaWYgKG1lc3NhZ2VCdWZmZXIgIT0gbnVsbCkKLSAgICAgICAgICBtZXNzYWdlQnVmZmVyLmFwcGVuZChuZXh0Q2h1bmtEYXRhKTsKLSAgICAgIH0KLQotICAgICAgLy8gUG9pbnQgYXQgdGhlIG5leHQgY2h1bmsgc2l6ZQotICAgICAgcHJldkluZGV4ID0gbmV4dEluZGV4ICsgMiArIGNodW5rU2l6ZSArIDI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVuZE9mRGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWJ1Zy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHRoaXMuc29ja2V0SGFuZGxlci5kZWJ1ZygiQ2h1bmtlZERhdGEiLCBtZXRob2QsIG1lc3NhZ2UpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGNlOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBmb3IgcmVjZWl2aW5nIGNvbm5lY3Rpb24gZXZlbnRzLgotICogCi0gKiBAYXV0aG9yIFNlcmdleSBTdWhvcnVjaGtpbgotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uTGlzdGVuZXIKLXsKLSAgLyoqCi0gICAqIEludm9rZWQgd2hlbiBjb25uZWN0aW9uIGlzIGNsb3NlZC4KLSAgICogQHBhcmFtIGNvbm5lY3Rpb24gc29ja2V0IGNvbm5lY3Rpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb25uZWN0aW9uQ2xvc2VkKFNvY2tldENvbm5lY3Rpb24gY29ubmVjdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9NZXNzYWdlRW50cnlRdWV1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvTWVzc2FnZUVudHJ5UXVldWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljYzA0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9NZXNzYWdlRW50cnlRdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgcXVldWUgdGhhdCBpcyB1c2VkIHRvIHdyaXRlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzCi0gKiB0byB0aGUgbG9nIGZpbGUgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUVudHJ5UXVldWUKLXsKLSAgLyoqCi0gICAqIFJlcXVlc3QgdHlwZSBtZXNzYWdlIGVudHJ5IHF1ZXVlLgotICAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciByZXF1ZXN0TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKioKLSAgICogUmVzcG9uc2UgdHlwZSBtZXNzYWdlIGVudHJ5IHF1ZXVlLgotICAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciByZXNwb25zZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgLyoqCi0gICAqIE1vbml0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgTW9uaXRvciBtb25pdG9yID0gbnVsbDsKLQotICAvKioKLSAgICogTG9nIGZpbGUuCi0gICAqLwotICBwcm90ZWN0ZWQgTG9nIGxvZyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIExvZyB3cml0ZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgTG9nV3JpdGVyIGxvZ1dyaXRlciA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIExpc3QgbG9jay4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbGlzdExvY2sgPSAibGlzdExvY2siOwotCi0gIC8qKgotICAgKiBNZXNzYWdlIElEIHdoaWNoIGlzIGluY3JlbWVudGVkIHdoZW4gYSBuZXcgbG9nIGVudHJ5IGlzIGFkZGVkIHRvIHRoZSBsb2cgZmlsZS4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgbWVzc2FnZUlkID0gMTsKLQotICAvKioKLSAgICogQ3JlYXRlIG1lc3NhZ2UgZW50cnkgcXVldWUuCi0gICAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvci4KLSAgICogQHBhcmFtIGxvZyB0aGUgbG9nLgotICAgKiBAcGFyYW0gbG9nV3JpdGVyIGEgbG9nIHdyaXRlci4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnlRdWV1ZShNb25pdG9yIG1vbml0b3IsIExvZyBsb2csIExvZ1dyaXRlciBsb2dXcml0ZXIpCi0gIHsKLSAgICAvLyBTYXZlIGlucHV0IHJlZmVyZW5jZXMKLSAgICB0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotICAgIHRoaXMubG9nID0gbG9nOwotICAgIHRoaXMubG9nV3JpdGVyID0gbG9nV3JpdGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBsb2cgZW50cnkgdG8gcXVldWUuCi0gICAqIEBwYXJhbSBtZXNzYWdlRW50cnkgYSBtZXNzYWdlIGVudHJ5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpcyB0aGVyZSBpcyBhIHByb2JsZW0gYWRkaW5nIHRoZSBsb2cgCi0gICAqICAgICAgICAgZW50cnkgdG8gdGhlIHF1ZXVlLgotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZE1lc3NhZ2VFbnRyeShNZXNzYWdlRW50cnkgbWVzc2FnZUVudHJ5KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN5bmNocm9uaXplZCAobGlzdExvY2spCi0gICAgewotICAgICAgLy8gSWYgdGhpcyBpcyBhIHJlcXVlc3QgdHlwZSBvZiBtZXNzYWdlIGVudHJ5LCB0aGVuIGFkZCB0byByZXF1ZXN0IGxpc3QKLSAgICAgIGlmIChtZXNzYWdlRW50cnkuZ2V0VHlwZSgpLmVxdWFscyhNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKSkKLSAgICAgIHsKLSAgICAgICAgcmVxdWVzdExpc3QuYWRkKG1lc3NhZ2VFbnRyeSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIE90aGVyd2lzZSB0aGlzIGlzIGEgcmVzcG9uc2UgdHlwZSBvZiBtZXNzYWdlIGVudHJ5Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3BvbnNlTGlzdC5hZGQobWVzc2FnZUVudHJ5KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUZWxsIHRoZSBsb2cgZW50cnkgd3JpdGVyIHRocmVhZCB0byBydW4KLSAgICB3cml0ZUZyb21RdWV1ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiBhbnkgbG9nIGVudHJpZXMgbmVlZCB0byBiZSB3cml0dGVuLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpcyB0aGVyZSBpcyBhIHByb2JsZW0gYWRkaW5nIGxvZyBlbnRyaWVzLgotICAKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZUZyb21RdWV1ZSgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIE1lc3NhZ2VFbnRyeSByZXF1ZXN0TWVzc2FnZUVudHJ5ID0gbnVsbDsKLSAgICBNZXNzYWdlRW50cnkgcmVzcG9uc2VNZXNzYWdlRW50cnkgPSBudWxsOwotICAgIGJvb2xlYW4gcmVzcG9uc2VGb3VuZCA9IGZhbHNlOwotCi0gICAgLy8gQ3JlYXRlIGFycmF5IHRoYXQgd2lsbCBjb250YWluIGxpc3Qgb2YgaW5kZXggdG8gcmVtb3ZlIGZyb20gcmVxdWVzdCBsaXN0Ci0gICAgaW50W10gcmVxdWVzdEluZGV4TGlzdCA9IG5ldyBpbnRbcmVxdWVzdExpc3Quc2l6ZSgpXTsKLSAgICBpbnQgcmVxSW5kZXhDb3VudCA9IDA7Ci0KLSAgICBzeW5jaHJvbml6ZWQgKGxpc3RMb2NrKQotICAgIHsKLSAgICAgIC8vIElmIHRoZXJlIGFyZSBlbnRyaWVzIGluIHRoZSByZXF1ZXN0IHF1ZXVlLAotICAgICAgLy8gdGhlbiB0cnkgdG8gbWF0Y2ggdGhlbSB3aXRoIGVudHJpZXMgaW4gdGhlIHJlc3BvbnNlIHF1ZXVlCi0gICAgICBmb3IgKGludCByZXFJbmRleCA9IDA7IHJlcUluZGV4IDwgcmVxdWVzdExpc3Quc2l6ZSgpOyByZXFJbmRleCsrKQotICAgICAgewotICAgICAgICAvLyBHZXQgcmVxdWVzdCBsb2cgZW50cnkKLSAgICAgICAgcmVxdWVzdE1lc3NhZ2VFbnRyeSA9IChNZXNzYWdlRW50cnkpIHJlcXVlc3RMaXN0LmVsZW1lbnRBdChyZXFJbmRleCk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgZWFjaCByZXNwb25zZSBsb2cgZW50cnkgdG8gc2VlIGlmIHRoZSBjb252ZXJzYXRpb25JZCBtYXRjaGVzCi0gICAgICAgIHJlc3BvbnNlRm91bmQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgcmVzcEluZGV4ID0gMDsKLSAgICAgICAgICByZXNwSW5kZXggPCByZXNwb25zZUxpc3Quc2l6ZSgpICYmICFyZXNwb25zZUZvdW5kOwotICAgICAgICAgIHJlc3BJbmRleCsrKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0IHJlc3BvbnNlIGxvZyBlbnRyeQotICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZUVudHJ5ID0KLSAgICAgICAgICAgIChNZXNzYWdlRW50cnkpIHJlc3BvbnNlTGlzdC5lbGVtZW50QXQocmVzcEluZGV4KTsKLQotICAgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBoYXZlIHRoZSBzYW1lIGNvbnZlcnNhdGlvbklkLAotICAgICAgICAgIC8vIHRoZW4gd3JpdGUgdGhlbSBvdXQgdG8gdGhlIGxvZyBmaWxlCi0gICAgICAgICAgaWYgKHJlcXVlc3RNZXNzYWdlRW50cnkKLSAgICAgICAgICAgIC5nZXRDb252ZXJzYXRpb25JZCgpCi0gICAgICAgICAgICAuZXF1YWxzKHJlc3BvbnNlTWVzc2FnZUVudHJ5LmdldENvbnZlcnNhdGlvbklkKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3BvbnNlRm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIGlkIGZvciB0aGUgbG9nIGVudHJpZXMKLSAgICAgICAgICAgIHJlcXVlc3RNZXNzYWdlRW50cnkuc2V0SWQoZ2V0TmV4dE1lc3NhZ2VJZCgpKTsKLSAgICAgICAgICAgIHJlc3BvbnNlTWVzc2FnZUVudHJ5LnNldElkKGdldE5leHRNZXNzYWdlSWQoKSk7Ci0KLSAgICAgICAgICAgIC8vIFdyaXRlIG91dCByZXF1ZXN0IGFuZCB0aGVuIHJlc3BvbnNlCi0gICAgICAgICAgICAvLz09PT0gU1Mgc3RhcnQgOiB3aGF0IHRoaXMgbGluZSBpcyB1c2VkIGZvcj8/PyAtIGNhdXNlcyBtZW1vcnkgbGVhaywgYXMgbm8gcmVtb3ZlTG9nRW50cnkgaXMgY2FsbGVkID09PT0KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgbG9nLmFkZExvZ0VudHJ5KHJlcXVlc3RNZXNzYWdlRW50cnkpOwotICAgICAgICAgICAgLy89PT09IFNTIGVuZCA9PT0KLSAgICAgICAgICAgIFN0cmluZ1JlYWRlciByZXF1ZXN0UmVhZGVyID0KLSAgICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcihyZXF1ZXN0TWVzc2FnZUVudHJ5LnRvWE1MU3RyaW5nKCIiKSk7Ci0gICAgICAgICAgICBsb2dXcml0ZXIud3JpdGUocmVxdWVzdFJlYWRlcik7Ci0KLSAgICAgICAgICAgIC8vIERpc3BsYXkgbWVzc2FnZQotICAgICAgICAgICAgcHJpbnRNZXNzYWdlKHJlcXVlc3RNZXNzYWdlRW50cnkpOwotCi0gICAgICAgICAgICAvLyBXcml0ZSBvdXQgcmVzcG9uc2UKLSAgICAgICAgICAgIC8vPT09PSBTUyBzdGFydCA6IHdoYXQgdGhpcyBsaW5lIGlzIHVzZWQgZm9yPz8/IC0gY2F1c2VzIG1lbW9yeSBsZWFrLCBhcyBubyByZW1vdmVMb2dFbnRyeSBpcyBjYWxsZWQgPT09PQotICAgICAgICAgICAgLy8gICAgICAgICAgICBsb2cuYWRkTG9nRW50cnkocmVzcG9uc2VNZXNzYWdlRW50cnkpOwotICAgICAgICAgICAgLy89PT09IFNTIGVuZCA9PT0KLSAgICAgICAgICAgIFN0cmluZ1JlYWRlciByZXNwb25zZVJlYWRlciA9Ci0gICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIocmVzcG9uc2VNZXNzYWdlRW50cnkudG9YTUxTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgIGxvZ1dyaXRlci53cml0ZShyZXNwb25zZVJlYWRlcik7Ci0KLSAgICAgICAgICAgIC8vIERpc3BsYXkgbWVzc2FnZQotICAgICAgICAgICAgcHJpbnRNZXNzYWdlKHJlc3BvbnNlTWVzc2FnZUVudHJ5KTsKLQotICAgICAgICAgICAgLy8gQWRkIHJlcXVlc3QgdG8gbGlzdCBzbyB0aGF0IGl0IGNhbiBiZSByZW1vdmVkIGxhdGVyCi0gICAgICAgICAgICByZXF1ZXN0SW5kZXhMaXN0W3JlcUluZGV4Q291bnQrK10gPSByZXFJbmRleDsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGxvZyBlbnRyeSBmcm9tIHJlc3BvbnNlIGxpc3QKLSAgICAgICAgICAgIHJlc3BvbnNlTGlzdC5yZW1vdmUocmVzcEluZGV4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gUmVtb3ZlIHJlcXVlc3RzIHRoYXQgd2VyZSB3cml0dGVuIG91dAotICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IHJlcUluZGV4Q291bnQ7IGNvdW50KyspCi0gICAgICAgIHJlcXVlc3RMaXN0LnJlbW92ZShyZXF1ZXN0SW5kZXhMaXN0W2NvdW50XSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbmV4dCBtZXNzYWdlIGlkZW50aWZpZXIuCi0gICAqIEByZXR1cm4gdGhlIG5leHQgbWVzc2FnZSBpZGVudGlmaWVyLgotICAgKi8KLSAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TmV4dE1lc3NhZ2VJZCgpCi0gIHsKLSAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YobWVzc2FnZUlkKyspOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc3BsYXkgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VFbnRyeSBhIG1lc3NhZ2UgZW50cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcmludE1lc3NhZ2UoTWVzc2FnZUVudHJ5IG1lc3NhZ2VFbnRyeSkKLSAgewotICAgIC8vIERpc3BsYXkgbWVzc2FnZQotICAgIG1vbml0b3IucHJpbnRNZXNzYWdlKAotICAgICAgImxvZzAxIiwKLSAgICAgIG1lc3NhZ2VFbnRyeS5nZXRJZCgpCi0gICAgICAgICsgIiwgIgotICAgICAgICArIG1lc3NhZ2VFbnRyeS5nZXRUeXBlKCkKLSAgICAgICAgKyAiLCAiCi0gICAgICAgICsgbWVzc2FnZUVudHJ5LmdldFNlbmRlckhvc3RBbmRQb3J0KCksCi0gICAgICAiTG9nIG1lc3NhZ2UgZW50cnkgLSAgSUQ6ICIKLSAgICAgICAgKyBtZXNzYWdlRW50cnkuZ2V0SWQoKQotICAgICAgICArICIsIFR5cGU6ICIKLSAgICAgICAgKyBtZXNzYWdlRW50cnkuZ2V0VHlwZSgpCi0gICAgICAgICsgIiwgU2VuZGVyOiAiCi0gICAgICAgICsgbWVzc2FnZUVudHJ5LmdldFNlbmRlckhvc3RBbmRQb3J0KCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9Nb25pdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9Nb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1M2EwMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLlRvb2xJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2dXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1hbkluVGhlTWlkZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci0KLS8qKgotICogTWVzc2FnZSBNb25pdG9yLgotICoKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJici51cy5pYm0uY29tKQotICovCi0KLXB1YmxpYyBjbGFzcyBNb25pdG9yCi17Ci0gIC8qKgotICAgKiBNZXNzYWdlIGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QgPSBudWxsOwotCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9CVU5ETEVfTkFNRSA9Ci0gICAgIm9yZy53c2kudGVzdC5tb25pdG9yLk1vbml0b3IiOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTQUdFX01FU1NBR0UgPQotICAgICJVc2FnZTogTW9uaXRvciAtY29uZmlnIDxjb25maWdGaWxlbmFtZT4iOwotCi0gIC8qKgotICAgKiBDb252ZXJzdGF0aW9uIElELgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgY29udmVyc2F0aW9uSWQgPSAxOwotCi0gIHByaXZhdGUgTG9nIGxvZyA9IG51bGw7Ci0gIHByaXZhdGUgTG9nV3JpdGVyIGxvZ1dyaXRlciA9IG51bGw7Ci0gIHByaXZhdGUgTW9uaXRvckNvbmZpZyBtb25pdG9yQ29uZmlnID0gbnVsbDsKLQotICAvKioKLSAgKiBUb29sIGluZm9ybWF0aW9uLgotICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX05BTUUgPSAiTW9uaXRvciI7Ci0KLSAgcHJvdGVjdGVkIFRvb2xJbmZvIHRvb2xJbmZvID0gbnVsbDsKLQotICBwcm90ZWN0ZWQgVmVjdG9yIGxpc3RlbmVyTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICBwcm90ZWN0ZWQgTWVzc2FnZUVudHJ5UXVldWUgbWVzc2FnZUVudHJ5UXVldWUgPSBudWxsOwotCi0gIC8qKgotICAgKiBNZXNzYWdlIG1vbml0b3IuCi0gICAqIEBwYXJhbSBhcmdzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBjcmVhdGluZyBhIE1vbml0b3Igb2JqZWN0LgotICAgKi8KLSAgcHVibGljIE1vbml0b3IoU3RyaW5nW10gYXJncykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIG1lc3NhZ2UgbGlzdAotICAgIHRoaXMubWVzc2FnZUxpc3QgPSBuZXcgTWVzc2FnZUxpc3QoUkVTT1VSQ0VfQlVORExFX05BTUUpOwotCi0gICAgLy8gVG9vbCBpbmZvcm1hdGlvbgotICAgIHRvb2xJbmZvID0gbmV3IFRvb2xJbmZvKFRPT0xfTkFNRSk7Ci0KLSAgICAvLyBDcmVhdGUgZG9jdW1lbnQgZmFjdG9yeQotICAgIERvY3VtZW50RmFjdG9yeSBkb2N1bWVudEZhY3RvcnkgPSBEb2N1bWVudEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotICAgIC8vIEdldCBuZXcgY29uZmlnIG9iamVjdAotICAgIG1vbml0b3JDb25maWcgPSBkb2N1bWVudEZhY3RvcnkubmV3TW9uaXRvckNvbmZpZygpOwotICAgIG1vbml0b3JDb25maWcuaW5pdCh0aGlzLm1lc3NhZ2VMaXN0KTsKLQotICAgIC8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICBtb25pdG9yQ29uZmlnLnBhcnNlQXJncyhhcmdzKTsKLQotICAgIFN0cmluZyBsb2dMb2NhdGlvbiA9IG1vbml0b3JDb25maWcuZ2V0TG9nTG9jYXRpb24oKTsKLSAgICBpZiAobG9nTG9jYXRpb24uaW5kZXhPZihXU0lDb25zdGFudHMuUEFUSF9TRVBBUkFUT1IpID4gLTEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTEiLAotICAgICAgICAgIG1vbml0b3JDb25maWcuZ2V0TG9nTG9jYXRpb24oKSwKLSAgICAgICAgICAiVGhlIGxvZyBmaWxlIGxvY2F0aW9uIHZhbHVlIGNhbm5vdCBjb250YWluIHRoZSBwYXNzIHNlcGFyYXRvciBjaGFyYWN0ZXI6IikpOwotICAgIH0KLQotICAgIEZpbGUgZmlsZSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0IGZpbGUgb2JqZWN0IGZvciBsb2cgZmlsZQotICAgICAgZmlsZSA9IG5ldyBGaWxlKG1vbml0b3JDb25maWcuZ2V0TG9nTG9jYXRpb24oKSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoImNvbmZpZzA3IiwgIkNvdWxkIG5vdCBnZXQgbG9nIGZpbGUgbG9jYXRpb24uIiksCi0gICAgICAgIGUpOwotICAgIH0KLQotICAgIC8vIElmIHJlcGxhY2UgZmxhZyBpcyBmYWxzZSBhbmQgZmlsZSBleGlzdHMsIHRoZW4gdGhyb3cgZXhjZXB0aW9uCi0gICAgaWYgKGZpbGUuZXhpc3RzKCkgJiYgIW1vbml0b3JDb25maWcuZ2V0UmVwbGFjZUxvZygpKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzA4IiwKLSAgICAgICAgICBtb25pdG9yQ29uZmlnLmdldExvZ0xvY2F0aW9uKCksCi0gICAgICAgICAgIkxvZyBmaWxlIGFscmVhZHkgZXhpc3RzOiIpKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgb3V0cHV0IGZpbGUKLSAgICAgIGxvZyA9IGRvY3VtZW50RmFjdG9yeS5uZXdMb2coKTsKLQotICAgICAgLy8gU2V0IHN0eWxlIHNoZWV0IHN0cmluZwotICAgICAgbG9nLnNldFN0eWxlU2hlZXRTdHJpbmcoCi0gICAgICAgIG1vbml0b3JDb25maWcuZ2V0QWRkU3R5bGVTaGVldCgpLmdldFN0eWxlU2hlZXRTdHJpbmcoKSk7Ci0KLSAgICAgIC8vIEdldCBsb2cgd3JpdGVyCi0gICAgICBsb2dXcml0ZXIgPSBkb2N1bWVudEZhY3RvcnkubmV3TG9nV3JpdGVyKCk7Ci0gICAgICBsb2dXcml0ZXIuc2V0V3JpdGVyKG1vbml0b3JDb25maWcuZ2V0TG9nTG9jYXRpb24oKSk7Ci0KLSAgICAgIC8vIFdyaXRlIHN0YXJ0IG9mIGxvZyBmaWxlCi0gICAgICBsb2dXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihsb2cuZ2V0U3RhcnRYTUxTdHJpbmcoIiIpKSk7Ci0KLSAgICAgIC8vIFdyaXRlIG1vbml0b3IgdG9vbCBpbmZvcm1hdGlvbgotICAgICAgbG9nV3JpdGVyLndyaXRlKG5ldyBTdHJpbmdSZWFkZXIodG9YTUxTdHJpbmcoIiIpKSk7Ci0KLSAgICAgIC8vIENyZWF0ZSBsb2cgZW50cnkgcXVldWUKLSAgICAgIG1lc3NhZ2VFbnRyeVF1ZXVlID0gbmV3IE1lc3NhZ2VFbnRyeVF1ZXVlKHRoaXMsIGxvZywgbG9nV3JpdGVyKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiZXJyb3IwMyIsCi0gICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgbG9nIG9yIGxvZyB3cml0ZXIuIiksCi0gICAgICAgIGUpOwotICAgIH0KLQotICAgIC8vIEdldCBtYW5JblRoZU1pZGRsZSBzZXR0aW5ncwotICAgIE1hbkluVGhlTWlkZGxlIG1hbkluVGhlTWlkZGxlID0gbW9uaXRvckNvbmZpZy5nZXRNYW5JblRoZU1pZGRsZSgpOwotCi0gICAgLy8gR2V0IGxpc3Qgb2YgcmVkaXJlY3RzCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtYW5JblRoZU1pZGRsZS5nZXRSZWRpcmVjdExpc3QoKS5pdGVyYXRvcigpOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIHJlZGlyZWN0Ci0gICAgUmVkaXJlY3QgcmVkaXJlY3Q7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgbmV4dCByZWRpcmVjdAotICAgICAgcmVkaXJlY3QgPSAoUmVkaXJlY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQgc29ja2V0IGxpc3RlbmVyCi0gICAgICBsaXN0ZW5lckxpc3QuYWRkKG5ldyBTZXJ2ZXJTb2NrZXRMaXN0ZW5lcih0aGlzLCByZWRpcmVjdCkpOwotICAgIH0KLQotICAgIC8vIEFkZCBzaHV0ZG93biBob29rCi0gICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBTaHV0ZG93bkhvb2soKSk7Ci0KLSAgICAvLyBDcmVhdGUgYW5kIHN0YXJ0IGNvbnNvbGUKLSAgICBDb25zb2xlIGNvbnNvbGUgPSBuZXcgQ29uc29sZSgpOwotICAgIGNvbnNvbGUuc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1vbml0b3IgY29uZmlnIGZpbGUuCi0gICAqIEByZXR1cm4gdGhlIG1vbml0b3IgY29uZmlnIGZpbGUuCi0gICAqLwotICBwdWJsaWMgTW9uaXRvckNvbmZpZyBnZXRNb25pdG9yQ29uZmlnKCkKLSAgewotICAgIHJldHVybiBtb25pdG9yQ29uZmlnOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbG9nIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgbG9nIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBMb2cgZ2V0TG9nKCkKLSAgewotICAgIHJldHVybiB0aGlzLmxvZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvZyBlbnRyeSBxdWV1ZSBvYmplY3QuCi0gICAqIEByZXR1cm4gdGhlIGxvZyBlbnRyeSBxdWV1ZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUVudHJ5UXVldWUgZ2V0TWVzc2FnZUVudHJ5UXVldWUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMubWVzc2FnZUVudHJ5UXVldWU7Ci0gIH0KLQotICAvKioKLSAgICogVGVybWluYXRlIHRoZSBtb25pdG9yLgotICAgKi8KLSAgdm9pZCBleGl0TW9uaXRvcigpCi0gIHsKLSAgICBwcmludE1lc3NhZ2UoInN0b3BwaW5nMDEiLCAiU3RvcHBpbmcgdGhlIG1vbml0b3IuLi4iKTsKLSAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdG9wIHRoZSBtb25pdG9yIGJlY2F1c2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLgotICAgKi8KLSAgdm9pZCBleGl0TW9uaXRvcihFeGNlcHRpb24gZSkKLSAgewotICAgIC8vIERpc3BsYXkgZXJyb3IgbWVzc2FnZQotICAgIHByaW50TWVzc2FnZSgKLSAgICAgICJzdG9wcGluZzAyIiwKLSAgICAgICJTdG9wcGluZyBtb25pdG9yIGJlY2F1c2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLiIpOwotICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVhDRVBUSU9OOiAiICsgZS50b1N0cmluZygpKTsKLSAgICBpZiAodGhpcy5tb25pdG9yQ29uZmlnLmdldFZlcmJvc2VPcHRpb24oKSkKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0KLSAgICAvLyBFeGl0IG1vbml0b3IKLSAgICBleGl0TW9uaXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFN0b3AgdGhlIG1vbml0b3IuCi0gICAqLwotICB2b2lkIHN0b3BNb25pdG9yKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBsaXN0IG9mIGxpc3RlbmVycyB0byBzdG9wCi0gICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGxpc3RlbmVyTGlzdC5pdGVyYXRvcigpOwotCi0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICAoKFNlcnZlclNvY2tldExpc3RlbmVyKSBpdGVyYXRvci5uZXh0KCkpLnNodXRkb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdhaXQgZm9yIHRoZSBjbGVhbnVwIHRpbWVvdXQgc2Vjb25kcwotICAgICAgVGhyZWFkLnNsZWVwKG1vbml0b3JDb25maWcuZ2V0VGltZW91dCgpICogMTAwMCk7Ci0KLSAgICAgIC8vIFdyaXRlIGVuZCBvZiBsb2cgZmlsZQotICAgICAgaWYgKGxvZ1dyaXRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICBsb2dXcml0ZXIud3JpdGUobmV3IFN0cmluZ1JlYWRlcihsb2cuZ2V0RW5kWE1MU3RyaW5nKCIiKSkpOwotCi0gICAgICAgIGxvZ1dyaXRlci5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBBREQ6IEhvdyBzaG91bGQgdGhpcyBleGVjcHRpb24gYmUgaGFuZGxlZD8KLSAgICB9Ci0KLSAgICBwcmludE1lc3NhZ2UoInN0b3BwZWQwMSIsICJNb25pdG9yIHN0b3BwZWQuIik7Ci0gIH0KLQotICAvKioKLSAgICogQ29tbWFuZCBsaW5lIGludGVyZmFjZS4KLSAgICogQHBhcmFtIGFyZ3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBNb25pdG9yIG1vbml0b3IgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nIGNvbmZpZ0ZpbGVOYW1lOwotICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikKLSAgICAgIHsKLSAgICAgICAgc3RhdGljUHJpbnRNZXNzYWdlKCJ1c2FnZTAxIiwgVVNBR0VfTUVTU0FHRSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICBpZiAoIWFyZ3NbMF0uZXF1YWxzSWdub3JlQ2FzZSgiLWNvbmZpZyIpKQotICAgICAgewotICAgICAgICBzdGF0aWNQcmludE1lc3NhZ2UoInVzYWdlMDEiLCBVU0FHRV9NRVNTQUdFKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFJ1biB0aGUgbW9uaXRvcgotICAgICAgbW9uaXRvciA9IG5ldyBNb25pdG9yKGFyZ3MpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBib29sZWFuIHByaW50U3RhY2tUcmFjZSA9IHRydWU7Ci0gICAgICBTdHJpbmcgbWVzc2FnZUlEOwotICAgICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlOwotICAgICAgU3RyaW5nIG1lc3NhZ2VEYXRhOwotCi0gICAgICBpZiAoKGUgaW5zdGFuY2VvZiBXU0lGaWxlTm90Rm91bmRFeGNlcHRpb24pCi0gICAgICAgIHx8IChlIGluc3RhbmNlb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSkKLSAgICAgIHsKLSAgICAgICAgcHJpbnRTdGFja1RyYWNlID0gZmFsc2U7Ci0gICAgICAgIG1lc3NhZ2VJRCA9ICJlcnJvcjAxIjsKLSAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSAiTW9uaXRvciBFcnJvcjoiOwotICAgICAgICBtZXNzYWdlRGF0YSA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByaW50U3RhY2tUcmFjZSA9IHRydWU7Ci0gICAgICAgIG1lc3NhZ2VJRCA9ICJlcnJvcjAyIjsKLSAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSAiTW9uaXRvciBTdG9wcGVkIEJ5IEV4Y2VwdGlvbjoiOwotICAgICAgICBtZXNzYWdlRGF0YSA9IGUudG9TdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgbW9uaXRvci5wcmludE1lc3NhZ2UobWVzc2FnZUlELCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotICAgICAgZWxzZQotICAgICAgICBNb25pdG9yLnN0YXRpY1ByaW50TWVzc2FnZShtZXNzYWdlSUQsIG1lc3NhZ2VEYXRhLCBkZWZhdWx0TWVzc2FnZSk7Ci0KLSAgICAgIGlmIChwcmludFN0YWNrVHJhY2UpCi0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0KLSAgICAgIC8vIEV4aXQKLSAgICAgIGlmIChtb25pdG9yICE9IG51bGwpCi0gICAgICAgIG1vbml0b3IuZXhpdE1vbml0b3IoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgU3lzdGVtLmV4aXQoMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50IGEgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBrZXkgYSBrZXkuCi0gICAqIEBwYXJhbSBkZWZhdWx0TWVzc2FnZSBhIGRlZmF1bHQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBwcmludE1lc3NhZ2Uoa2V5LCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgYSBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICogQHBhcmFtIGtleSBhIGtleS4KLSAgICogQHBhcmFtIG1lc3NhZ2VEYXRhIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRNZXNzYWdlKAotICAgIFN0cmluZyBrZXksCi0gICAgU3RyaW5nIG1lc3NhZ2VEYXRhLAotICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIG1lc3NhZ2VMaXN0LnByaW50TWVzc2FnZShrZXksIG1lc3NhZ2VEYXRhLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBhIGtleS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXRpY1ByaW50TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBzdGF0aWNQcmludE1lc3NhZ2Uoa2V5LCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBhIGtleS4KLSAgICogQHBhcmFtIG1lc3NhZ2VEYXRhIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlIGEgZGVmYXVsdCBtZXNzYWdlLgotICAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGF0aWNQcmludE1lc3NhZ2UoCi0gICAgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgbWVzc2FnZURhdGEsCi0gICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgTWVzc2FnZUxpc3QucHJpbnRNZXNzYWdlKAotICAgICAgUkVTT1VSQ0VfQlVORExFX05BTUUsCi0gICAgICBrZXksCi0gICAgICBtZXNzYWdlRGF0YSwKLSAgICAgIGRlZmF1bHRNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG5leHQgY29udmVyc2F0aW9uIGlkZW50aWZpZXIuCi0gICAqIEByZXR1cm4gdGhlIG5leHQgY29udmVyc2F0aW9uIGlkZW50aWZpZXIuCi0gICAqLwotICBzeW5jaHJvbml6ZWQgaW50IGdldE5leHRDb252ZXJzYXRpb25JZCgpCi0gIHsKLSAgICByZXR1cm4gY29udmVyc2F0aW9uSWQrKzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gWE1MIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHJldHVybiBYTUwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICAvLyBTdGFydAotICAgIHB3LnByaW50KHRvb2xJbmZvLmdldFN0YXJ0WE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLQotICAgIC8vIENvbmZpZwotICAgIHB3LnByaW50KAotICAgICAgbW9uaXRvckNvbmZpZy50b1hNTFN0cmluZyhXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfTU9OSVRPUl9DT05GSUcpKTsKLQotICAgIC8vIEVuZAotICAgIHB3LnByaW50bG4odG9vbEluZm8uZ2V0RW5kWE1MU3RyaW5nKG5hbWVzcGFjZU5hbWUpKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNodXRkb3duIGhvb2suCi0gICAqLwotICBjbGFzcyBTaHV0ZG93bkhvb2sgZXh0ZW5kcyBUaHJlYWQKLSAgewotICAgIC8qKgotICAgICAqIFJ1biBzaHV0ZG93biBwcm9jZWR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBzdG9wTW9uaXRvcigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSdW4gY29tbWFuZCBmcm9tIGNvbnNvbGUuCi0gICAqLwotICBjbGFzcyBDb25zb2xlIGV4dGVuZHMgVGhyZWFkCi0gIHsKLSAgICAvKioKLSAgICAgKiBQcm9tcHQgdXNlciBhbmQgd2FpdCBmb3IgaW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0KLSAgICAgIC8vIEdldCB0aGUgZXhpdCBzdHJpbmcKLSAgICAgIFN0cmluZyBleGl0U3RyaW5nID0gbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZSgiZXhpdDAxIiwgImV4aXQiKTsKLQotICAgICAgLy8gRGlzcGxheSBvcHRpb25zIGFuZCBob3cgdG8gc3RvcCBhcHBsaWNhdGlvbgotICAgICAgVGVzdFV0aWxzLnByaW50VG9vbEluZm8odG9vbEluZm8pOwotICAgICAgU3lzdGVtLm91dC5wcmludChtb25pdG9yQ29uZmlnLnRvU3RyaW5nKCkpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIik7Ci0gICAgICBwcmludE1lc3NhZ2UoCi0gICAgICAgICJzdGFydDAxIiwKLSAgICAgICAgIlRoZSAiCi0gICAgICAgICAgKyB0b29sSW5mby5nZXROYW1lKCkKLSAgICAgICAgICArICIgdG9vbCBpcyByZWFkeSB0byBpbnRlcmNlcHQgYW5kIGxvZyB3ZWIgc2VydmljZSBtZXNzYWdlcy4iKTsKLSAgICAgIHByaW50TWVzc2FnZSgKLSAgICAgICAgInN0YXJ0MDIiLAotICAgICAgICAiVHlwZSBcImV4aXRcIiB0byBzdG9wIHRoZSAiICsgdG9vbEluZm8uZ2V0TmFtZSgpICsgIi4iKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICIpOwotCi0gICAgICAvLyBHZXQgdGhlIHRpbWUgdG8gc3RvcCBhY2NlcHRpbmcgY29ubmVjdGlvbnMKLSAgICAgIGxvbmcgc3RvcFRpbWUgPQotICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIChtb25pdG9yQ29uZmlnLmdldExvZ0R1cmF0aW9uKCkgKiAxMDAwKTsKLSAgICAgIC8vIFNTCi0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBHZXQgc3RkaW4gYXMgYSBidWZmZXJlZCByZWFkZXIKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KLSAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOwotCi0gICAgICAgIC8vIFByb2Nlc3MgaW5wdXQgZnJvbSBjb25zb2xlCi0gICAgICAgIGJvb2xlYW4gZXhpdCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAoKCFleGl0KSAmJiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBzdG9wVGltZSkpCi0gICAgICAgIHsgLy8gU1MKLSAgICAgICAgICAvLyBTbGVlcAotICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotCi0gICAgICAgICAgLy8gQ2hlY2sgZm9yIHVzZXIgaW5wdXQKLSAgICAgICAgICBpZiAocmVhZGVyLnJlYWR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlYWRlci5yZWFkTGluZSgpLmVxdWFsc0lnbm9yZUNhc2UoZXhpdFN0cmluZykpCi0gICAgICAgICAgICAgIGV4aXQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIEFERDogSG93IHNob3VsZCB0aGlzIGJlIGhhbmRsZWQ/Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQotCi0gICAgICAvLyBFeGl0Ci0gICAgICBleGl0TW9uaXRvcigpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvTW9uaXRvci5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvTW9uaXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGQ2MDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL01vbml0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jCi0jIE1vbml0b3IgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUuCi0jCi11c2FnZTAxPVVzYWdlOiBNb25pdG9yIC1jb25maWcgPGNvbmZpZ0ZpbGVuYW1lPgotc3RvcHBlZDAxPU1vbml0b3Igc3RvcHBlZC4KLWVycm9yMDE9TW9uaXRvciBFcnJvcjoKLWVycm9yMDI9TW9uaXRvciBTdG9wcGVkIEJ5IEV4Y2VwdGlvbjogCi1lcnJvcjAzPUNvdWxkIG5vdCBjcmVhdGUgbG9nIG9yIGxvZyB3cml0ZXIuCi1lcnJvcjA0PU1vbml0b3IgY2Fubm90IGNvbm5lY3QgdG8gYSByZWRpcmVjdCBob3N0Ogotc3RvcHBpbmcwMT1TdG9wcGluZyB0aGUgbW9uaXRvci4uLgotc3RvcHBpbmcwMj1TdG9wcGluZyBtb25pdG9yIGJlY2F1c2UgYW4gZXhjZXB0aW9uIG9jY3VycmVkLgotbG9nMDE9TG9nIG1lc3NhZ2UgZW50cnkgW0lELCBUeXBlLCBTZW5kZXJdOgotc3RhcnQwMT1UaGUgTW9uaXRvciB0b29sIGlzIHJlYWR5IHRvIGludGVyY2VwdCBhbmQgbG9nIHdlYiBzZXJ2aWNlIG1lc3NhZ2VzLgotc3RhcnQwMj1UeXBlICJleGl0IiB0byBzdG9wIHRoZSBNb25pdG9yLgotZXhpdDAxPWV4aXQKLWNvbmZpZzAxPVRoZSBzcGVjaWZpZWQgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQ6Ci1jb25maWcwMj1Nb25pdG9yIGNvbmZpZ3VyYXRpb24gZmlsZSB3YXMgbm90IGZvdW5kLiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcwMz1Db3VsZCBub3QgcmVhZCBtb25pdG9yIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNwZWNpZmllZCBmaWxlIGxvY2F0aW9uOgotY29uZmlnMDQ9RWxlbWVudCBtdXN0IGNvbnRhaW4gYW4gaW50ZWdlciB2YWx1ZS4gIEVsZW1lbnQgbmFtZToKLWNvbmZpZzA1PU1vbml0b3IgY29uZmlndXJhdGlvbiBmaWxlIGRpZCBub3QgY29udGFpbiBhbnkgcmVkaXJlY3Qgc3RhdGVtZW50cy4KLWNvbmZpZzA2PU1vbml0b3IgY29uZmlndXJhdGlvbiBmaWxlIGRpZCBub3QgY29udGFpbiB0aGUgbG9nIGZpbGUgVVJJLgotY29uZmlnMDc9Q291bGQgbm90IGdldCBsb2cgZmlsZSBsb2NhdGlvbi4KLWNvbmZpZzA4PUxvZyBmaWxlIGFscmVhZHkgZXhpc3RzLiAgU3BlY2lmaWVkIGZpbGUgbG9jYXRpb246Ci1jb25maWcwOT1FbGVtZW50IGlzIG1pc3NpbmcuIEVsZW1lbnQgbmFtZToKLWNvbmZpZzEwPVBhcmFtZXRlciB2YWx1ZSBjYW4ndCBiZSBuZWdhdGl2ZS4gRWxlbWVudCBuYW1lOgotY29uZmlnMTE9VGhlIGxvZyBmaWxlIGxvY2F0aW9uIHZhbHVlIGNhbm5vdCBjb250YWluIHRoZSBwYXNzIHNlcGFyYXRvciBjaGFyYWN0ZXI6Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL1NlcnZlclNvY2tldExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9TZXJ2ZXJTb2NrZXRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTE2YzhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL1NlcnZlclNvY2tldExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLlJlZGlyZWN0OwotCi0vKioKLSAqIEEgc2VydmVyIHNvY2tldCBsaXN0ZW5lci4KLSAqCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyU29ja2V0TGlzdGVuZXIKLSAgZXh0ZW5kcyBUaHJlYWQKLSAgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgLy8gU1MKLXsKLSAgcHJvdGVjdGVkIE1vbml0b3IgbW9uaXRvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBSZWRpcmVjdCByZWRpcmVjdCA9IG51bGw7Ci0KLSAgcHJvdGVjdGVkIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBudWxsOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzdG9wU2VydmVyU29ja2V0ID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIFZlY3RvciBjb25uZWN0aW9uTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIHNlcnZlciBzb2NrZXQgbGlzdGVuZXIuCi0gICAqIEBwYXJhbSBtb25pdG9yIGEgTW9uaXRvciBvYmplY3QuCi0gICAqIEBwYXJhbSByZWRpcmVjdCBhIFJlZGlyZWN0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTZXJ2ZXJTb2NrZXRMaXN0ZW5lcihNb25pdG9yIG1vbml0b3IsIFJlZGlyZWN0IHJlZGlyZWN0KQotICB7Ci0gICAgdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLSAgICB0aGlzLnJlZGlyZWN0ID0gcmVkaXJlY3Q7Ci0KLSAgICAvLyBTdGFydCBsaXN0ZW5pbmcKLSAgICBzdGFydCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJ1biB0aGUgdGhyZWFkIGFuZCBsaXN0ZW4gZm9yIGEgY29ubmVjdGlvbiBvbiB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgcnVuKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICBzZXJ2ZXJTb2NrZXQgPQotICAgICAgICBuZXcgU2VydmVyU29ja2V0KAotICAgICAgICAgIHJlZGlyZWN0LmdldExpc3RlblBvcnQoKSwKLSAgICAgICAgICByZWRpcmVjdC5nZXRNYXhDb25uZWN0aW9ucygpKTsKLSAgICAgIC8vIFNTCi0KLSAgICAgIC8vIFNldCB0aW1lb3V0IHNvIHRoYXQgc2VydmVyIHNvY2tldCB3aWxsIGNvbnRpbnVlIHRvIGFjY2VwdCBjb25uZWN0aW9ucwotICAgICAgc2VydmVyU29ja2V0LnNldFNvVGltZW91dCgwKTsKLQotICAgICAgLy8gTGlzdGVuIGZvciBjb25uZWN0aW9ucyB1bnRpbCBpbnRlcnJ1cHRlZAotICAgICAgd2hpbGUgKCFzdG9wU2VydmVyU29ja2V0KQotICAgICAgewotICAgICAgICAvLyBBY2NlcHQgY29ubmVjdGlvbnMKLSAgICAgICAgU29ja2V0IHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKLQotICAgICAgICAvLyBJZiB0aGUgc2VydmVyIHNvY2tldCB3YXMgTk9UIHN0b3BwZWQsIHByb2Nlc3MgY29ubmVjdGlvbgotICAgICAgICBpZiAoIXN0b3BTZXJ2ZXJTb2NrZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDcmVhdGUgbmV3IGNvbm5lY3Rpb24KLSAgICAgICAgICBTb2NrZXRDb25uZWN0aW9uIHNvY2tldENvbm5lY3Rpb24gPQotICAgICAgICAgICAgbmV3IFNvY2tldENvbm5lY3Rpb24odGhpcy5tb25pdG9yLCB0aGlzLnJlZGlyZWN0LCBzb2NrZXQpOwotCi0gICAgICAgICAgLy9yZWdpc3RlciBhcyBhIGxpc3RlbmVyCi0gICAgICAgICAgc29ja2V0Q29ubmVjdGlvbi5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcyk7IC8vIFNTCi0KLSAgICAgICAgICAvLyBBZGQgdG8gY29ubmVjdGlvbiBsaXN0Ci0gICAgICAgICAgY29ubmVjdGlvbkxpc3QuYWRkKHNvY2tldENvbm5lY3Rpb24pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIElmIHRoZSBleGNlcHRpb24gd2FzIE5PVCBjYXVzZWQgYnkgY2xvc2luZyB0aGUgc29ja2V0LCB0aGVuIHN0b3AgbW9uaXRvcgotICAgICAgaWYgKCFlLmdldE1lc3NhZ2UoKS5lcXVhbHMoInNvY2tldCBjbG9zZWQiKSkKLSAgICAgIHsKLSAgICAgICAgbW9uaXRvci5leGl0TW9uaXRvcihlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RvcCBsaXN0ZW5pbmcgZm9yIGEgY29ubmVjdGlvbiBvbiB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2h1dGRvd24oKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU2h1dGRvd24gYWxsIGFjdGl2ZSBjb25uZWN0aW9ucwotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9uTGlzdC5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgKChTb2NrZXRDb25uZWN0aW9uKSBpdGVyYXRvci5uZXh0KCkpLnNodXRkb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRlbGwgdGhlIHNlcnZlciBzb2NrZXQgbGlzdGVuaW5nIHRocmVhZCB0byBzdG9wCi0gICAgICB0aGlzLnN0b3BTZXJ2ZXJTb2NrZXQgPSB0cnVlOwotCi0gICAgICAvLyBTZXQgdGhlIHNlcnZlciBzb2NrZXQgdGltZW91dCB0byAxIG1zCi0gICAgICBzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KDEpOwotCi0gICAgICAvLyBDbG9zZSB0aGUgc2VydmVyIHNvY2tldAotICAgICAgaWYgKHNlcnZlclNvY2tldCAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfQotCi0gIC8vID09PT0gU1Mgc3RhcnQgPT09PQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuQ29ubmVjdGlvbkxpc3RlbmVyI2Nvbm5lY3Rpb25DbG9zZWQoKQotICAgKi8KLSAgcHVibGljIHZvaWQgY29ubmVjdGlvbkNsb3NlZChTb2NrZXRDb25uZWN0aW9uIGNvbm5lY3Rpb24pCi0gIHsKLSAgICBjb25uZWN0aW9uTGlzdC5yZW1vdmUoY29ubmVjdGlvbik7Ci0gIH0KLSAgLy8gPT09PSBTUyBlbmQgPT09PQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvU29ja2V0Q29ubmVjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvU29ja2V0Q29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJhMGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL1NvY2tldENvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLlJlZGlyZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi0vKioKLSAqIEEgc29ja2V0IGNvbm5lY3Rpb24uCi0gKgotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIFNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBUaHJlYWQKLXsKLSAgcHJvdGVjdGVkIE1vbml0b3IgbW9uaXRvcjsKLSAgcHJvdGVjdGVkIFJlZGlyZWN0IHJlZGlyZWN0OwotICBwcm90ZWN0ZWQgU29ja2V0IGluU29ja2V0OwotICBwcm90ZWN0ZWQgU29ja2V0IG91dFNvY2tldDsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGh0dHBQcm94eUhvc3QgPSBudWxsOwotICBwcm90ZWN0ZWQgaW50IGh0dHBQcm94eVBvcnQ7Ci0KLSAgcHJvdGVjdGVkIFNvY2tldEhhbmRsZXIgcmVxdWVzdFNvY2tldEhhbmRsZXIgPSBudWxsOwotICBwcm90ZWN0ZWQgU29ja2V0SGFuZGxlciByZXNwb25zZVNvY2tldEhhbmRsZXIgPSBudWxsOwotCi0gIHByaXZhdGUgVmVjdG9yIGxpc3RlbmVycyA9IG5ldyBWZWN0b3IoKTsgLy8gU1MKLQotICAvKioKLSAgICogQ3JlYXRlIHNvY2tldCBjb25uZWN0aW9uLgotICAgKiBAcGFyYW0gbW9uaXRvciAgYSBNb25pdG9yIG9iamVjdC4KLSAgICogQHBhcmFtIHJlZGlyZWN0IGEgUmVkaXJlY3Qgb2JqZWN0LgotICAgKiBAcGFyYW0gaW5Tb2NrZXQgaW4gc29ja2V0LgotICAgKi8KLSAgcHVibGljIFNvY2tldENvbm5lY3Rpb24oTW9uaXRvciBtb25pdG9yLCBSZWRpcmVjdCByZWRpcmVjdCwgU29ja2V0IGluU29ja2V0KQotICB7Ci0gICAgdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLSAgICB0aGlzLnJlZGlyZWN0ID0gcmVkaXJlY3Q7Ci0gICAgdGhpcy5pblNvY2tldCA9IGluU29ja2V0OwotCi0gICAgLy8gU3RhcnQgcHJvY2Vzc2luZyB0aGUgY29ubmVjdGlvbgotICAgIHN0YXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgLy8gR2V0IHRoZSBIVFRQIHByb3h5IHNldHRpbmdzIGlmIHRoZXJlIGFyZSBhbnkgc2V0IChub3QgdXNlZCBjdXJyZW50bHkpCi0gICAgbG9hZEh0dHBQcm94eVNldHRpbmdzKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBPcGVuIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIKLSAgICAgIHRoaXMub3V0U29ja2V0ID0gbmV3IFNvY2tldChyZWRpcmVjdC5nZXRUb0hvc3QoKSwgcmVkaXJlY3QuZ2V0VG9Qb3J0KCkpOwotCi0gICAgICAvLyBTZXQgdGhlIHJlYWQgdGltZW91dCBmb3IgdGhlIGlucHV0IHNvY2tldAotICAgICAgdGhpcy5pblNvY2tldC5zZXRTb1RpbWVvdXQocmVkaXJlY3QuZ2V0UmVhZFRpbWVvdXRTZWNvbmRzKCkgKiAxMDAwKTsKLQotICAgICAgLy8gR2V0IHRoZSBuZXh0IGNvbnZlcnNhdGlvbiBJRAotICAgICAgaW50IGNvbnZlcnNhdGlvbklkID0gbW9uaXRvci5nZXROZXh0Q29udmVyc2F0aW9uSWQoKTsKLQotICAgICAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgaGFuZGxlcnMgd2hpY2ggYXJlIHVzZWQgdG8gc2VuZCB0aGUgZGF0YSBmcm9tCi0gICAgICAvLyB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXIKLSAgICAgIHJlcXVlc3RTb2NrZXRIYW5kbGVyID0KLSAgICAgICAgbmV3IFNvY2tldEhhbmRsZXIoCi0gICAgICAgICAgdGhpcywKLSAgICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNULAotICAgICAgICAgIGNvbnZlcnNhdGlvbklkLAotICAgICAgICAgIHJlZGlyZWN0LmdldFRvSG9zdCgpLAotICAgICAgICAgIHRoaXMuaW5Tb2NrZXQsCi0gICAgICAgICAgdGhpcy5vdXRTb2NrZXQsCi0gICAgICAgICAgcmVkaXJlY3QuZ2V0UmVhZFRpbWVvdXRTZWNvbmRzKCkpOwotICAgICAgcmVzcG9uc2VTb2NrZXRIYW5kbGVyID0KLSAgICAgICAgbmV3IFNvY2tldEhhbmRsZXIoCi0gICAgICAgICAgdGhpcywKLSAgICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSwKLSAgICAgICAgICBjb252ZXJzYXRpb25JZCwKLSAgICAgICAgICByZWRpcmVjdC5nZXRUb0hvc3QoKSwKLSAgICAgICAgICB0aGlzLm91dFNvY2tldCwKLSAgICAgICAgICB0aGlzLmluU29ja2V0LAotICAgICAgICAgIHJlZGlyZWN0LmdldFJlYWRUaW1lb3V0U2Vjb25kcygpKTsKLQotICAgICAgLy8gVGVsbCBlYWNoIHNvY2tldEhhbmRsZXIgYWJvdXQgdGhlIG90aGVyIG9uZQotICAgICAgcmVxdWVzdFNvY2tldEhhbmRsZXIuc2V0UGFpcmVkU29ja2V0SGFuZGxlcihyZXNwb25zZVNvY2tldEhhbmRsZXIpOwotICAgICAgcmVzcG9uc2VTb2NrZXRIYW5kbGVyLnNldFBhaXJlZFNvY2tldEhhbmRsZXIocmVxdWVzdFNvY2tldEhhbmRsZXIpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBNb25pdG9yLnN0YXRpY1ByaW50TWVzc2FnZSgKLSAgICAgICAgImVycm9yMDQiLAotICAgICAgICByZWRpcmVjdC5nZXRUb0hvc3QoKSwKLSAgICAgICAgIk1vbml0b3IgY2Fubm90IGNvbm5lY3QgdG8gYSByZWRpcmVjdCBob3N0OiIpOwotCi0gICAgICBzaHV0ZG93bigpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdGhpcy5pblNvY2tldC5jbG9zZSgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMb2cgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbnZlcnNhdGlvbklEICAgICAgdGhlIGNvdmVyc2F0aW9uIGlkLgotICAgKiBAcGFyYW0gY29ubmVjdGlvblR5cGUgICAgICB0aGUgY29ubmVjdGlvbiB0eXBlLgotICAgKiBAcGFyYW0gdGltZXN0YW1wICAgICAgICAgICB0aGUgdGltZXN0YW1wLgotICAgKiBAcGFyYW0gc2VuZGVySG9zdEFuZFBvcnQgICB0aGUgc2VuZGVyIGhvc3QgYW5kIHBvcnQuCi0gICAqIEBwYXJhbSByZWNlaXZlckhvc3RBbmRQb3J0IHRoZSByZWNlaXZlciBob3N0IGFuZCBwb3J0LgotICAgKiBAcGFyYW0gbWVzc2FnZUJ1ZmZlciAgICAgICB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGJvbSAgICAgICAgICAgICAgICAgdGhlIEJPTS4KLSAgICogQHBhcmFtIGVuY29kaW5nICAgICAgICAgICAgdGhlIGVuY29kaW5nLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiAgdGhlcmUgaXMgYSBwcm9ibGVtIGxvZ2dpbmcgbWVzc2FnZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgbG9nTWVzc2FnZSgKLSAgICBpbnQgY29udmVyc2F0aW9uSUQsCi0gICAgU3RyaW5nIGNvbm5lY3Rpb25UeXBlLAotICAgIFN0cmluZyB0aW1lc3RhbXAsCi0gICAgU3RyaW5nIHNlbmRlckhvc3RBbmRQb3J0LAotICAgIFN0cmluZyByZWNlaXZlckhvc3RBbmRQb3J0LAotICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlQnVmZmVyLAotICAgIGludCBib20sCi0gICAgU3RyaW5nIGVuY29kaW5nKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBudWxsOwotCi0gICAgLy8gQ3JlYXRlIG1lc3NhZ2UgZW50cnkKLSAgICBtZXNzYWdlRW50cnkgPQotICAgICAgY3JlYXRlTWVzc2FnZUVudHJ5KAotICAgICAgICBjb252ZXJzYXRpb25JRCwKLSAgICAgICAgY29ubmVjdGlvblR5cGUsCi0gICAgICAgIHRpbWVzdGFtcCwKLSAgICAgICAgc2VuZGVySG9zdEFuZFBvcnQsCi0gICAgICAgIHJlY2VpdmVySG9zdEFuZFBvcnQsCi0gICAgICAgIG1lc3NhZ2VCdWZmZXIudG9TdHJpbmcoKSwKLSAgICAgICAgYm9tLAotICAgICAgICBlbmNvZGluZyk7Ci0KLSAgICAvLyBERUJVRzoKLSAgICAvL2RlYnVnKCJsb2dNZXNzYWdlIiwgIiBtZXNzYWdlRW50cnk6ICIgKyBtZXNzYWdlRW50cnkpOwotCi0gICAgLy8gQWRkIGVudHJ5IHRvIHRoZSBxdWV1ZQotICAgIG1vbml0b3IuZ2V0TWVzc2FnZUVudHJ5UXVldWUoKS5hZGRNZXNzYWdlRW50cnkobWVzc2FnZUVudHJ5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBsb2cgZW50cnkgZnJvbSBhbGwgb2YgdGhlIGRhdGEgdGhhdCB3YXMgZ2F0aGVyZWQuCi0gICAqLwotICBwcml2YXRlIE1lc3NhZ2VFbnRyeSBjcmVhdGVNZXNzYWdlRW50cnkoCi0gICAgaW50IGNvbnZlcnNhdGlvbklELAotICAgIFN0cmluZyBtZXNzYWdlVHlwZSwKLSAgICBTdHJpbmcgdGltZXN0YW1wLAotICAgIFN0cmluZyBzZW5kZXJIb3N0QW5kUG9ydCwKLSAgICBTdHJpbmcgcmVjZWl2ZXJIb3N0QW5kUG9ydCwKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBpbnQgYm9tLAotICAgIFN0cmluZyBlbmNvZGluZykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgbG9nIGVudHJ5IG9iamVjdAotICAgIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBtb25pdG9yLmdldExvZygpLmNyZWF0ZUxvZ0VudHJ5KCk7Ci0KLSAgICAvLyBTZXQgaW5wdXQgaW5mb3JtYXRpb24gaW4gbG9nIGVudHJ5Ci0gICAgLy8gTk9URTogIFRoZSBJRCBpcyBzZXQganVzdCBiZWZvcmUgdGhlIGxvZyBlbnRyeSBpcyB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZSBpbiBMb2dFbnRyeVF1ZXVlCi0gICAgLy9sb2dFbnRyeS5zZXRJZChpZCk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldENvbnZlcnNhdGlvbklkKFN0cmluZy52YWx1ZU9mKGNvbnZlcnNhdGlvbklEKSk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldFR5cGUobWVzc2FnZVR5cGUpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICBtZXNzYWdlRW50cnkuc2V0U2VuZGVySG9zdEFuZFBvcnQoc2VuZGVySG9zdEFuZFBvcnQpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRSZWNlaXZlckhvc3RBbmRQb3J0KHJlY2VpdmVySG9zdEFuZFBvcnQpOwotICAgIG1lc3NhZ2VFbnRyeS5zZXRFbmNvZGluZyhlbmNvZGluZyk7Ci0KLSAgICAvLyBHZXQgSFRUUCBoZWFkZXJzIGZyb20gZnVsbCBtZXNzYWdlCi0gICAgU3RyaW5nIGh0dHBIZWFkZXJzID0gVXRpbHMuZ2V0SFRUUEhlYWRlcnMobWVzc2FnZSk7Ci0gICAgbWVzc2FnZUVudHJ5LnNldEhUVFBIZWFkZXJzKGh0dHBIZWFkZXJzKTsKLQkKLSAgIGlmIChVdGlscy5pc011bHRpcGFydFJlbGF0ZWRNZXNzYWdlKGh0dHBIZWFkZXJzKSkKLSAgICB7Ci0gICAgCU1pbWVQYXJ0cyBtaW1lUGFydHMgPSBVdGlscy5wYXJzZU11bHRpcGFydFJlbGF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGh0dHBIZWFkZXJzLCBlbmNvZGluZyk7Ci0gICAgCWlmIChtaW1lUGFydHMgPT0gbnVsbCkKLSAgICAJewotICAgIAkgIC8vIHByb2JsZW0gY3JlYXRpbmcgTWltZXBhcnRzIC0tIHRyZWF0IGl0IGFzIHNpbXBsZSBTT0FQIG1lc3NhZ2UKLSAgICAJICBTdHJpbmcgY29udGVudCA9IFV0aWxzLmdldENvbnRlbnQobWVzc2FnZSk7Ci0gICAgCSAgbWVzc2FnZUVudHJ5LnNldE1lc3NhZ2UoY29udGVudCk7Ci0gICAgCSAgbWVzc2FnZUVudHJ5LnNldE1pbWVDb250ZW50KGZhbHNlKTsKLSAgICAJfQotICAgIAllbHNlCi0gICAgCXsKLSAgICAgICAgICBtZXNzYWdlRW50cnkuc2V0TWltZVBhcnRzKG1pbWVQYXJ0cyk7Ci0gICAgICAgICAgbWVzc2FnZUVudHJ5LnNldE1pbWVDb250ZW50KHRydWUpOwotICAgIAl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBHZXQgdGhlIG1lc3NhZ2UgY29udGVudAotICAgICAgU3RyaW5nIGNvbnRlbnQgPSBVdGlscy5nZXRDb250ZW50KG1lc3NhZ2UpOwotICAgICAgbWVzc2FnZUVudHJ5LnNldE1lc3NhZ2UoY29udGVudCk7Ci0gICAgICBtZXNzYWdlRW50cnkuc2V0TWltZUNvbnRlbnQoZmFsc2UpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgQk9NLCBpZiB0aGVyZSBpcyBvbmUKLSAgICBpZiAoYm9tICE9IDApCi0gICAgICBtZXNzYWdlRW50cnkuc2V0Qk9NKGJvbSk7Ci0KLSAgICByZXR1cm4gbWVzc2FnZUVudHJ5OwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWQgSFRUUCBwcm94eSBzZXR0aW5ncy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvYWRIdHRwUHJveHlTZXR0aW5ncygpCi0gIHsKLSAgICAvLyBHZXQgdGhlIEhUVFAgcHJveHkgaG9zdCBzZXR0aW5nCi0gICAgdGhpcy5odHRwUHJveHlIb3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIpOwotICAgIGlmICh0aGlzLmh0dHBQcm94eUhvc3QgIT0gbnVsbCAmJiBodHRwUHJveHlIb3N0LmVxdWFscygiIikpCi0gICAgICB0aGlzLmh0dHBQcm94eUhvc3QgPSBudWxsOwotCi0gICAgLy8gSWYgdGhlcmUgd2FzIGFuIEhUVFAgcHJveHkgaG9zdCBzZXR0aW5nLCB0aGVuIGdldCB0aGUgcG9ydAotICAgIGlmICh0aGlzLmh0dHBQcm94eUhvc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcG9ydFN0cmluZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBvcnQiKTsKLQotICAgICAgLy8gU2V0IGRlZmF1bHQgdG8gODAKLSAgICAgIGlmIChwb3J0U3RyaW5nID09IG51bGwgfHwgcG9ydFN0cmluZy5lcXVhbHMoIiIpKQotICAgICAgICB0aGlzLmh0dHBQcm94eVBvcnQgPSA4MDsKLSAgICAgIGVsc2UKLSAgICAgICAgaHR0cFByb3h5UG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydFN0cmluZyk7Ci0gICAgfQotICB9Ci0KLSAgTW9uaXRvciBnZXRNb25pdG9yKCkKLSAgewotICAgIHJldHVybiB0aGlzLm1vbml0b3I7Ci0gIH0KLQotICBzeW5jaHJvbml6ZWQgdm9pZCB3YWtlVXAoKQotICB7Ci0gICAgZmlyZUNvbm5lY3Rpb25DbG9zZWQoKTsgLy8gU1MKLSAgICBub3RpZnlBbGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTaHV0ZG93bi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNodXRkb3duKCkKLSAgewotICAgIGlmICh0aGlzLnJlcXVlc3RTb2NrZXRIYW5kbGVyICE9IG51bGwpCi0gICAgICB0aGlzLnJlcXVlc3RTb2NrZXRIYW5kbGVyLnNodXRkb3duKCk7Ci0gICAgaWYgKHRoaXMucmVzcG9uc2VTb2NrZXRIYW5kbGVyICE9IG51bGwpCi0gICAgICB0aGlzLnJlc3BvbnNlU29ja2V0SGFuZGxlci5zaHV0ZG93bigpOwotICB9Ci0KLSAgLy8gPT09PSBTUyBzdGFydCA9PT09Ci0gIC8qKgotICAgKiBBZGQgY29ubmVjdGlvbiBldmVudCBsaXN0ZW5lci4KLSAgICogQHBhcmFtIGxpc3RlbmVyIGV2ZW50IGxpc3RlbmVyLgotICAgKiBAc2VlICNyZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLSAgfQotICAvKioKLSAgICogUmVtb3ZlIGNvbm5lY3Rpb24gZXZlbnQgbGlzdGVuZXIuCi0gICAqIEBwYXJhbSBsaXN0ZW5lciBldmVudCBsaXN0ZW5lci4KLSAgICogQHNlZSAjYWRkQ29ubmVjdGlvbkxpc3RlbmVyCi0gICAqLwotICBwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0KLSAgLyoqCi0gICAqIE5vdGlmeSBsaXN0ZW5lcnMgb24gY29ubmVjdGlvbiBjbG9zZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBmaXJlQ29ubmVjdGlvbkNsb3NlZCgpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IChDb25uZWN0aW9uTGlzdGVuZXIpIGkubmV4dCgpOwotICAgICAgbGlzdGVuZXIuY29ubmVjdGlvbkNsb3NlZCh0aGlzKTsKLSAgICB9Ci0gIH0KLSAgLy8gPT09PSBTUyBlbmQgPT09PQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvU29ja2V0SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvU29ja2V0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTAwNDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL1NvY2tldEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgSUJNIENvcnBvcmF0aW9uLCBCZWFjb24gSW5mb3JtYXRpb24gVGVjaG5vbG9neSBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gICAgICAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBCZWFjb25JVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi0vKioKLSAqIFNvY2tldCBIYW5kbGVyLgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgU29ja2V0SGFuZGxlciBleHRlbmRzIFRocmVhZAotewotICBwcm90ZWN0ZWQgU29ja2V0Q29ubmVjdGlvbiBzb2NrZXRDb25uZWN0aW9uOwotICBwcm90ZWN0ZWQgU29ja2V0SGFuZGxlciBwYWlyZWRTb2NrZXRIYW5kbGVyOwotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25UeXBlOwotICBwcm90ZWN0ZWQgaW50IGNvbnZlcnNhdGlvbklEOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldEhvc3Q7Ci0gIHByb3RlY3RlZCBpbnQgcmVhZFRpbWVvdXRTZWNvbmRzOwotCi0gIHByb3RlY3RlZCBTb2NrZXQgaW5Tb2NrZXQ7Ci0gIHByb3RlY3RlZCBTb2NrZXQgb3V0U29ja2V0OwotICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHJlYWRUaW1lZE91dCA9IGZhbHNlOwotCi0gIC8vIEkxOE46IDIwMDMuMDIuMjYgbW9kaWZpZWQgYnkgSy5OYWthZ29tZUBCZWFjb25JVAotICBwcml2YXRlIFN0cmluZyBtaW1lQ2hhcnNldCA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIHhtbEVuY29kaW5nID0gbnVsbDsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkxGID0gIlxyXG4iOwotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfMTAwX0NPTlRJTlVFID0KLSAgICAiMTAwIENvbnRpbnVlIi50b1VwcGVyQ2FzZSgpOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSFVOS0VEID0KLSAgICAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiLnRvVXBwZXJDYXNlKCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIVU5LRURfV0lUSF9RVU9URVMgPQotICAgICJUcmFuc2Zlci1FbmNvZGluZzogXCJjaHVua2VkXCIiLnRvVXBwZXJDYXNlKCk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfTEVOR1RIID0KLSAgICAiQ29udGVudC1MZW5ndGg6Ii50b1VwcGVyQ2FzZSgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgc29ja2V0IGhhbmRsZXIuCi0gICAqIEBwYXJhbSBzb2NrZXRDb25uZWN0aW9uICAgc29ja2V0IGNvbm5lY3Rpb24uCi0gICAqIEBwYXJhbSBjb25uZWN0aW9uVHlwZSAgICAgY29ubmVjdGlvbiB0eXBlLgotICAgKiBAcGFyYW0gY29udmVyc2F0aW9uSUQgICAgIGNvbnZlcnNhdGlvbiBpZC4KLSAgICogQHBhcmFtIHRhcmdldEhvc3QgICAgICAgICB0YXJnZXQgaG9zdC4KLSAgICogQHBhcmFtIGluU29ja2V0ICAgICAgICAgICBpbiBzb2NrZXQuCi0gICAqIEBwYXJhbSBvdXRTb2NrZXQgICAgICAgICAgb3V0IHNvY2tldC4KLSAgICogQHBhcmFtIHJlYWRUaW1lb3V0U2Vjb25kcyByZWFkIHRpbWVvdXQgc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBTb2NrZXRIYW5kbGVyKAotICAgIFNvY2tldENvbm5lY3Rpb24gc29ja2V0Q29ubmVjdGlvbiwKLSAgICBTdHJpbmcgY29ubmVjdGlvblR5cGUsCi0gICAgaW50IGNvbnZlcnNhdGlvbklELAotICAgIFN0cmluZyB0YXJnZXRIb3N0LAotICAgIFNvY2tldCBpblNvY2tldCwKLSAgICBTb2NrZXQgb3V0U29ja2V0LAotICAgIGludCByZWFkVGltZW91dFNlY29uZHMpCi0gIHsKLSAgICB0aGlzLnNvY2tldENvbm5lY3Rpb24gPSBzb2NrZXRDb25uZWN0aW9uOwotICAgIHRoaXMuY29ubmVjdGlvblR5cGUgPSBjb25uZWN0aW9uVHlwZTsKLSAgICB0aGlzLmNvbnZlcnNhdGlvbklEID0gY29udmVyc2F0aW9uSUQ7Ci0gICAgdGhpcy50YXJnZXRIb3N0ID0gdGFyZ2V0SG9zdDsKLSAgICB0aGlzLmluU29ja2V0ID0gaW5Tb2NrZXQ7Ci0gICAgdGhpcy5vdXRTb2NrZXQgPSBvdXRTb2NrZXQ7Ci0gICAgdGhpcy5yZWFkVGltZW91dFNlY29uZHMgPSByZWFkVGltZW91dFNlY29uZHM7Ci0KLSAgICAvLyBBREQ6Ci0gICAgdmVyYm9zZSA9Ci0gICAgICBzb2NrZXRDb25uZWN0aW9uLmdldE1vbml0b3IoKS5nZXRNb25pdG9yQ29uZmlnKCkuZ2V0VmVyYm9zZU9wdGlvbigpOwotCi0gICAgc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcGFpcmVkIHNvY2tldCBoYW5kbGVyLgotICAgKiBAcGFyYW0gcGFpcmVkU29ja2V0SGFuZGxlciBwYWlyZWQgc29ja2V0IGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYWlyZWRTb2NrZXRIYW5kbGVyKFNvY2tldEhhbmRsZXIgcGFpcmVkU29ja2V0SGFuZGxlcikKLSAgewotICAgIHRoaXMucGFpcmVkU29ja2V0SGFuZGxlciA9IHBhaXJlZFNvY2tldEhhbmRsZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2VuZCB0aGUgZGF0YSBmcm9tIHRoZSBpbnB1dCBzb2NrZXQgdG8gdGhlIG91dHB1dCBzb2NrZXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBydW4oKQotICB7Ci0gICAgaW50IHJlYWRMZW47Ci0gICAgU3RyaW5nIHJlYWRNc2c7Ci0gICAgTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQgPSBudWxsOwotCi0gICAgLy8gQ3JlYXRlIHJlYWQgYnVmZmVyICAgICAgCi0gICAgYnl0ZVtdIHJlYWRCdWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zCi0gICAgICB0aGlzLmlucHV0U3RyZWFtID0gdGhpcy5pblNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgdGhpcy5vdXRwdXRTdHJlYW0gPSB0aGlzLm91dFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKLQotICAgICAgLy8gUHJvY2VzcyB3aGlsZSB0aGUgY29ubmVjdGlvbiBpcyBhY3RpdmUgCi0gICAgICAvLyAoTk9URTogdGhlcmUgbWlnaHQgYmUgbW9yZSB0aGFuIDEgbWVzc2FnZSBwZXIgY29ubmVjdGlvbikKLSAgICAgIGJvb2xlYW4gY29ubmVjdGlvbkFjdGl2ZSA9IHRydWU7Ci0gICAgICB3aGlsZSAoY29ubmVjdGlvbkFjdGl2ZSkKLSAgICAgIHsKLSAgICAgICAgLy8gUmVzZXQgYWxsIGRhdGEKLSAgICAgICAgcmVhZExlbiA9IDA7Ci0gICAgICAgIG1lc3NhZ2VDb250ZXh0ID0gbmV3IE1lc3NhZ2VDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gUmVhZCB1bnRpbCBtZXNzYWdlIGlzIGNvbXBsZXRlCi0gICAgICAgIGJvb2xlYW4gbWVzc2FnZUNvbXBsZXRlID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlICghbWVzc2FnZUNvbXBsZXRlKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgICAgICBkZWJ1ZygicnVuIiwgIlJlYWQgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIik7Ci0KLSAgICAgICAgICAgIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgICAgICAgIHJlYWRMZW4gPSBpbnB1dFN0cmVhbS5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoKTsKLQotICAgICAgICAgICAgLy8gUmVzZXQgcmVhZCB0aW1lb3V0IGZsYWcKLSAgICAgICAgICAgIHJlYWRUaW1lZE91dCA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBERUJVRzoKLSAgICAgICAgICAgIGRlYnVnKCJydW4iLCAicmVhZExlbjogIiArIHJlYWRMZW4pOwotCi0gICAgICAgICAgICBpZiAocmVhZExlbiA9PSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29ubmVjdGlvbkFjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgICBtZXNzYWdlQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiBkYXRhIHdhcyByZWFkLCB0aGVuIGNoZWNrIGZvciAxMDAgY29udGludWUKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlYWRMZW4gPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkYXRhIHRoYXQgd2FzIHJlYWQsIHRoZW4gZ2V0IHRoZSB0aW1lc3RhbXAKLSAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VDb250ZXh0LnRpbWVzdGFtcCA9PSBudWxsKQotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LnRpbWVzdGFtcCA9IFV0aWxzLmdldFRpbWVzdGFtcCgpOwotCi0gICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uVHlwZS5lcXVhbHMoTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gdG9Ib3N0ID0KLSAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHNvY2tldENvbm5lY3Rpb24ucmVkaXJlY3QuZ2V0VG9Ib3N0KCkKLSAgICAgICAgICAgICAgICAgICAgICArICI6IgotICAgICAgICAgICAgICAgICAgICAgICsgc29ja2V0Q29ubmVjdGlvbi5yZWRpcmVjdC5nZXRUb1BvcnQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldEJ5dGVzKCk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG5ldyBTdHJpbmcocmVhZEJ1ZmZlciwgMCwgcmVhZExlbik7Ci0KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtZXNzYWdlLmluZGV4T2YoQ1JMRiArICJIb3N0OiAiKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpbmRleCArPSA4OwotICAgICAgICAgICAgICAgICAgaW50IHNlY29uZFBhcnQgPSBtZXNzYWdlLmluZGV4T2YoQ1JMRiwgaW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgdGhlbiBnbyBmb3JtYXQgaXQKLSAgICAgICAgICAgICAgICAgIHdyaXRlKHRoaXMub3V0cHV0U3RyZWFtLCByZWFkQnVmZmVyLCAwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICB3cml0ZSh0aGlzLm91dHB1dFN0cmVhbSwgdG9Ib3N0LCAwLCB0b0hvc3QubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgIHdyaXRlKAotICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgcmVhZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2Vjb25kUGFydCwKLSAgICAgICAgICAgICAgICAgICAgcmVhZExlbiAtIHNlY29uZFBhcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBzdHJlYW0gYW5kIHRoZW4gZ28gZm9ybWF0IGl0Ci0gICAgICAgICAgICAgICAgICB3cml0ZSh0aGlzLm91dHB1dFN0cmVhbSwgcmVhZEJ1ZmZlciwgMCwgcmVhZExlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB0aGVuIGdvIGZvcm1hdCBpdAotICAgICAgICAgICAgICAgIHdyaXRlKHRoaXMub3V0cHV0U3RyZWFtLCByZWFkQnVmZmVyLCAwLCByZWFkTGVuKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8vIERFQlVHOgotICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBidWZmZXJTdHJpbmcgPSBuZXcgU3RyaW5nKHJlYWRCdWZmZXIsIDAsIHJlYWRMZW4pOwotICAgICAgICAgICAgICAgIGRlYnVnKCJydW4iLCAiYnVmZmVyIGFzIHN0cmluZzogWyIgKyBidWZmZXJTdHJpbmcgKyAiXSIpOwotICAgICAgICAgICAgICAgIGlmIChidWZmZXJTdHJpbmcubGVuZ3RoKCkgPD0gNTApCi0gICAgICAgICAgICAgICAgICBkZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgInJ1biIsCi0gICAgICAgICAgICAgICAgICAgICJidWZmZXIgYXMgaGV4c3RyaW5nOiBbIgotICAgICAgICAgICAgICAgICAgICAgICsgVXRpbHMudG9IZXhTdHJpbmcoYnVmZmVyU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAgICsgIl0iKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBkZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgInJ1biIsCi0gICAgICAgICAgICAgICAgICAgICJidWZmZXIgYXMgaGV4c3RyaW5nOiBbIgotICAgICAgICAgICAgICAgICAgICAgICsgVXRpbHMudG9IZXhTdHJpbmcoYnVmZmVyU3RyaW5nLnN1YnN0cmluZygwLCA1MCkpCi0gICAgICAgICAgICAgICAgICAgICAgKyAiIC4uLl0iKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8vIFNlZSBpZiB0aGlzIHBhcnQgb2YgdGhlIGJ1ZmZlciBjb250YWlucyB0aGUgQk9NCi0gICAgICAgICAgICAgIGlmIChtZXNzYWdlQ29udGV4dC5ib20gPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb250ZXh0LmJvbSA9IGdldEJPTShyZWFkQnVmZmVyKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8vIERFQlVHCi0gICAgICAgICAgICAgIGRlYnVnKCJydW4iLCAiYm9tOiAiICsgbWVzc2FnZUNvbnRleHQuYm9tKTsKLQotICAgICAgICAgICAgICBTdHJpbmcgZW5jb2Rpbmc7Ci0KLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGdldEVuY29kaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVhZE1zZyA9Ci0gICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICByZWFkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICByZWFkTGVuLAotICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXRKYXZhRW5jb2RpbmcoZW5jb2RpbmcpKTsKLSAgICAgICAgICAgICAgICBzZXRFbmNvZGluZyhyZWFkTXNnKTsKLSAgICAgICAgICAgICAgICBpZiAoIWVuY29kaW5nLmVxdWFscyhnZXRFbmNvZGluZygpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGdldEVuY29kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICByZWFkTXNnID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICByZWFkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgcmVhZExlbiwKLSAgICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXRKYXZhRW5jb2RpbmcoZW5jb2RpbmcpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWJ1ZygicnVuIiwgIkVYQ0VQVElPTiAoMyk6ICIgKyB1ZWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odWVlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgLy8gU2V0IGVuY29kaW5nIGluIHRoZSBtZXNzYWdlIGNvbnRleHQKLSAgICAgICAgICAgICAgbWVzc2FnZUNvbnRleHQuZW5jb2RpbmcgPSBlbmNvZGluZzsKLQotICAgICAgICAgICAgICAvLyBERUJVRwotICAgICAgICAgICAgICBkZWJ1ZygicnVuIiwgImVuY29kaW5nOiAiICsgbWVzc2FnZUNvbnRleHQuZW5jb2RpbmcpOwotCi0gICAgICAgICAgICAgIC8vIFByb2Nlc3MgbWVzc2FnZQotICAgICAgICAgICAgICBtZXNzYWdlQ29udGV4dCA9IHByb2Nlc3NNZXNzYWdlKHJlYWRMZW4sIHJlYWRNc2csIG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgbWVzc2FnZSBpcyBjb21wbGV0ZSwgdGhlbiBsb2cgaXQgYW5kIHJlc2V0IGJ1ZmZlcgotICAgICAgICAgICAgaWYgKChpc01lc3NhZ2VDb21wbGV0ZShtZXNzYWdlQ29udGV4dCkpCi0gICAgICAgICAgICAgIHx8ICgocmVhZExlbiA9PSAtMSkgJiYgKG1lc3NhZ2VDb250ZXh0Lm1lc3NhZ2VCdWZmZXIubGVuZ3RoKCkgPiAwKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIExvZyBtZXNzYWdlCi0gICAgICAgICAgICAgIGxvZ01lc3NhZ2UobWVzc2FnZUNvbnRleHQpOwotCi0gICAgICAgICAgICAgIC8vIFNldCBtZXNzYWdlIGNvbXBsZXRlCi0gICAgICAgICAgICAgIG1lc3NhZ2VDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkSU9FeGNlcHRpb24gaWUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gU2V0IHJlYWQgdGltZW91dCBmbGFnCi0gICAgICAgICAgICByZWFkVGltZWRPdXQgPSB0cnVlOwotCi0gICAgICAgICAgICBkZWJ1ZygicnVuIiwgIkludGVycnVwdGVkSU9FeGNlcHRpb246ICIgKyBpZS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHJlYWQgaXMgbm90IGRvbmUsIHRoZW4gc2h1dGRvd24gCi0gICAgICAgICAgICBpZiAocGFpcmVkU29ja2V0SGFuZGxlciAhPSBudWxsCi0gICAgICAgICAgICAgICYmIHBhaXJlZFNvY2tldEhhbmRsZXIuaXNSZWFkV2FpdGluZygpCi0gICAgICAgICAgICAgICYmIHBhaXJlZFNvY2tldEhhbmRsZXIuaXNSZWFkVGltZWRPdXQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgICAgICAgIGRlYnVnKCJydW4iLCAicmVhZCB0aW1lZCBvdXQgb24gYm90aCBzb2NrZXRzIik7Ci0KLSAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgZGF0YSBpbiB0aGUgbWVzc2FnZSBidWZmZXIgYW5kIGl0IGlzIGNvbXBsZXRlLCB0aGVuIGxvZyBpdAotICAgICAgICAgICAgICBpZiAoKGlzTWVzc2FnZUNvbXBsZXRlKG1lc3NhZ2VDb250ZXh0KSkKLSAgICAgICAgICAgICAgICB8fCAobWVzc2FnZUNvbnRleHQubWVzc2FnZUJ1ZmZlci5sZW5ndGgoKSA+IDApKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTG9nIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICBsb2dNZXNzYWdlKG1lc3NhZ2VDb250ZXh0KTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8vIFNldCBtZXNzYWdlIGNvbXBsZXRlCi0gICAgICAgICAgICAgIGNvbm5lY3Rpb25BY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgbWVzc2FnZUNvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUyKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIERFQlVHOgotICAgICAgICAgICAgZGVidWcoCi0gICAgICAgICAgICAgICJydW4iLAotICAgICAgICAgICAgICAiRVhDRVBUSU9OICgyKTogIgotICAgICAgICAgICAgICAgICsgZTIudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICsgIlxuIgotICAgICAgICAgICAgICAgICsgVXRpbHMuZ2V0RXhjZXB0aW9uRGV0YWlscyhlMikpOwotICAgICAgICAgICAgLy9lMi5wcmludFN0YWNrVHJhY2UoKTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgZGF0YSBpbiB0aGUgbWVzc2FnZSBidWZmZXIgYW5kIGl0IGlzIGNvbXBsZXRlLCB0aGVuIGxvZyBpdAotICAgICAgICAgICAgaWYgKChpc01lc3NhZ2VDb21wbGV0ZShtZXNzYWdlQ29udGV4dCkpCi0gICAgICAgICAgICAgIHx8IChtZXNzYWdlQ29udGV4dC5tZXNzYWdlQnVmZmVyLmxlbmd0aCgpID4gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIExvZyBtZXNzYWdlCi0gICAgICAgICAgICAgIGxvZ01lc3NhZ2UobWVzc2FnZUNvbnRleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgbWVzc2FnZSBjb21wbGV0ZQotICAgICAgICAgICAgY29ubmVjdGlvbkFjdGl2ZSA9IGZhbHNlOwotICAgICAgICAgICAgbWVzc2FnZUNvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICBkZWJ1ZygKLSAgICAgICAgInJ1biIsCi0gICAgICAgICJFWENFUFRJT04gKDEpOiAiCi0gICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKQotICAgICAgICAgICsgIlxuIgotICAgICAgICAgICsgVXRpbHMuZ2V0RXhjZXB0aW9uRGV0YWlscyhlKSk7Ci0gICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEVycm9yIGVycikKLSAgICB7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKCJydW4iLCAiRVJST1I6ICIgKyBlcnIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIC8vZXJyLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBzaHV0ZG93bigpOwotICAgICAgc29ja2V0Q29ubmVjdGlvbi53YWtlVXAoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHByaXZhdGUgTWVzc2FnZUNvbnRleHQgcHJvY2Vzc01lc3NhZ2UoCi0gICAgaW50IHJlYWRMZW4sCi0gICAgU3RyaW5nIHJlYWRNc2csCi0gICAgTWVzc2FnZUNvbnRleHQgaW5NZXNzYWdlQ29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGNvbnRpbnVlUmVhZCA9IGZhbHNlOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBtZXNzYWdlIGNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBNZXNzYWdlQ29udGV4dCBtZXNzYWdlQ29udGV4dCA9IGluTWVzc2FnZUNvbnRleHQ7Ci0KLSAgICAvLyBHZXQgbWVzc2FnZSBidWZmZXIgYW5kIGNodW5rZWQgZGF0YSBmcm9tIG1lc3NhZ2UgY29udGV4dAotICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlQnVmZmVyID0gbWVzc2FnZUNvbnRleHQubWVzc2FnZUJ1ZmZlcjsKLSAgICBDaHVua2VkRGF0YSBjaHVua2VkRGF0YSA9IG1lc3NhZ2VDb250ZXh0LmNodW5rZWREYXRhOwotCi0gICAgLy8gSWYgYWxsIHdlIHJlY2VpdmVkIHdhcyB0aGUgaGVhZGVyIHdpdGggMTAwIGNvbnRpbnVlLCB0aGVuIGlnbm9yZSBpdAotICAgIGlmICgocmVhZE1zZy50b1VwcGVyQ2FzZSgpLmluZGV4T2YoSFRUUF8xMDBfQ09OVElOVUUpICE9IC0xKQotICAgICAgJiYgKHJlYWRMZW4gPj0gMjUpKQotICAgIHsKLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoInByb2Nlc3NNZXNzYWdlIiwgIklnbm9yZSBIVFRQIDEwMCBDb250aW51ZS4iKTsKLQotICAgICAgLy8gRmluZCB0aGUgZW5kIG9mIHRoZSBIVFRQIDEwMCBtZXNzYWdlCi0gICAgICBpbnQgaW5kZXggPSBVdGlscy5nZXRGaXJzdENSTEZDUkxGKHJlYWRNc2cpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IHRoZSBIVFRQIDEwMCBtZXNzYWdlLCB0aGVuIGp1c3QgaWdub3JlIGl0Ci0gICAgICBpZiAoaW5kZXggPT0gcmVhZE1zZy5sZW5ndGgoKSkKLSAgICAgICAgY29udGludWVSZWFkID0gdHJ1ZTsKLQotICAgICAgLy8gT3RoZXJ3aXNlIHJlbW92ZSB0aGUgSFRUUCAxMDAgbWVzc2FnZSBhbmQgY29udGludWUKLSAgICAgIGVsc2UKLSAgICAgICAgcmVhZE1zZyA9IHJlYWRNc2cuc3Vic3RyaW5nKGluZGV4KTsKLSAgICB9Ci0KLSAgICAvLyBBREQ6IFdoYXQgaWYgYSBieXBhc3NlZCBtZXNzYWdlIGNvbnRhaW5zIGFub3RoZXIgbWVzc2FnZSBhZnRlciBpdD8KLSAgICBpZiAoIWNvbnRpbnVlUmVhZCAmJiBieXBhc3NNZXNzYWdlKHJlYWRNc2cpKQotICAgIHsKLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoCi0gICAgICAgICJwcm9jZXNzTWVzc2FnZSIsCi0gICAgICAgICJEbyBub3QgbG9nIG1lc3NhZ2UgYXMgZGVmaW5lZCBpbiB0aGUgbW9uaXRvciBzcGVjLCBidXQgaXQgd2lsbCBiZSBzZW50LiIpOwotCi0gICAgICBjb250aW51ZVJlYWQgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICghY29udGludWVSZWFkKQotICAgIHsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIGNodW5rZWQgZGF0YSwgdGhlbiBnZXQgdGhlIGxlbmd0aAotICAgICAgaWYgKChyZWFkTXNnLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihDSFVOS0VEKSAhPSAtMSkKLSAgICAgICAgfHwgKHJlYWRNc2cudG9VcHBlckNhc2UoKS5pbmRleE9mKENIVU5LRURfV0lUSF9RVU9URVMpICE9IC0xKSkKLSAgICAgIHsKLSAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgIGRlYnVnKCJwcm9jZXNzTWVzc2FnZSIsICJQcm9jZXNzaW5nIGNodW5rZWQgZGF0YS4uLiIpOwotCi0gICAgICAgIC8vIEdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpcnN0IENGTEYKLSAgICAgICAgaWYgKChpbmRleCA9IHJlYWRNc2cuaW5kZXhPZihDUkxGICsgQ1JMRikpID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IGxvY2F0ZSBlbmQgb2YgSFRUUCBoZWFkZXIuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbmNsdWRlIHRoZSBDUkxGK0NSTEYgaW4gdGhlIGluZGV4Ci0gICAgICAgIGluZGV4ICs9IDQ7Ci0KLSAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgIGRlYnVnKAotICAgICAgICAgICJwcm9jZXNzTWVzc2FnZSIsCi0gICAgICAgICAgIkFkZCBoZWFkZXIgYmVmb3JlIGRlY29kaW5nIGNodW5rZWQgZGF0YTogWyIKLSAgICAgICAgICAgICsgcmVhZE1zZy5zdWJzdHJpbmcoMCwgaW5kZXgpCi0gICAgICAgICAgICArICJdIik7Ci0KLSAgICAgICAgLy8gQWRkIEhUVFAgaGVhZGVyIHRvIGJ1ZmZlcgotICAgICAgICBtZXNzYWdlQnVmZmVyLmFwcGVuZChyZWFkTXNnLnN1YnN0cmluZygwLCBpbmRleCkpOwotCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSAoaS5lLiBoZWFkZXIgb25seSksIHRoZW4ganVzdCBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG1vcmUgY2h1bmtlZCBkYXRhCi0gICAgICAgIGlmIChyZWFkTXNnLmxlbmd0aCgpID09IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgY2h1bmtlZERhdGEgPSBuZXcgQ2h1bmtlZERhdGEodGhpcywgdHJ1ZSk7Ci0KLSAgICAgICAgICAvLyBERUJVRzoKLSAgICAgICAgICBkZWJ1ZygKLSAgICAgICAgICAgICJwcm9jZXNzTWVzc2FnZSIsCi0gICAgICAgICAgICAiVGhlcmUgaXMgY2h1bmsgZGF0YSwgYnV0IG5vbmUgaW4gdGhpcyBwYXJ0IG9mIHRoZSBtZXNzYWdlLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSByZW1haW5kZXIgb2YgdGhlIGRhdGEgaXMgY29tcGxldGUgKGkuZS4gZW5kcyB3aXRoIFswXVtDUkxGXVtPcHRpb25hbCBGb290ZXJdW0NSTEZdKQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDcmVhdGUgY2h1bmtlZCBkYXRhIG9iamVjdAotICAgICAgICAgIGNodW5rZWREYXRhID0gbmV3IENodW5rZWREYXRhKHRoaXMsIHJlYWRNc2cuc3Vic3RyaW5nKGluZGV4KSk7Ci0KLSAgICAgICAgICBpZiAoIWNodW5rZWREYXRhLmlzTW9yZUNodW5rZWREYXRhKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2h1bmtlZERhdGEuZGVjb2RlQW5kQWRkRGF0YVRvQnVmZmVyKG1lc3NhZ2VCdWZmZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlIGlmIChjaHVua2VkRGF0YSAhPSBudWxsICYmIGNodW5rZWREYXRhLmlzTW9yZUNodW5rZWREYXRhKCkpCi0gICAgICB7Ci0gICAgICAgIC8vIERFQlVHOgotICAgICAgICBkZWJ1ZygicHJvY2Vzc01lc3NhZ2UiLCAiUHJvY2Vzc2luZyBNT1JFIGNodW5rZWQgZGF0YS4uLiIpOwotCi0gICAgICAgIC8vIEFkZCBkYXRhCi0gICAgICAgIGNodW5rZWREYXRhLmFkZERhdGEocmVhZE1zZyk7Ci0KLSAgICAgICAgLy8gRGVjb2RlIGRhdGEKLSAgICAgICAgaWYgKCFjaHVua2VkRGF0YS5pc01vcmVDaHVua2VkRGF0YSgpKQotICAgICAgICB7Ci0gICAgICAgICAgY2h1bmtlZERhdGEuZGVjb2RlQW5kQWRkRGF0YVRvQnVmZmVyKG1lc3NhZ2VCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIEVsc2UganVzdCBhcHBlbmQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlcgotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBERUJVRzoKLSAgICAgICAgZGVidWcoCi0gICAgICAgICAgInByb2Nlc3NNZXNzYWdlIiwKLSAgICAgICAgICAiQWRkIGRhdGEgdG8gbWVzc2FnZSBlbnRyeSBidWZmZXI6IFsiICsgcmVhZE1zZyArICJdIik7Ci0KLSAgICAgICAgbWVzc2FnZUJ1ZmZlci5hcHBlbmQocmVhZE1zZyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2V0IHVwZGF0ZWQgbWVzc2FnZSBidWZmZXIgYW5kIGNodW5rZWQgZGF0YSBpbiBtZXNzYWdlIGNvbnRleHQgICAgCi0gICAgbWVzc2FnZUNvbnRleHQubWVzc2FnZUJ1ZmZlciA9IG1lc3NhZ2VCdWZmZXI7Ci0gICAgbWVzc2FnZUNvbnRleHQuY2h1bmtlZERhdGEgPSBjaHVua2VkRGF0YTsKLQotICAgIC8vIFJldHVybiBtZXNzYWdlIGNvbnRleHQgCi0gICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNodXRkb3duIGlucHV0IHNvY2tldCBhbmQgY2xvc2UgaW5wdXQgc3RyZWFtLgotICAgKiBAcGFyYW0gaW5Tb2NrZXQgaW4gc29ja2V0LgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc3RvcElucHV0KFNvY2tldCBpblNvY2tldCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGVyZSBpcyBhIGlucHV0IHNvY2tldCwgdGhlbiBzaHV0ZG93biB0aGUgaW5wdXQKLSAgICAgIGlmIChpblNvY2tldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpblNvY2tldC5zaHV0ZG93bklucHV0KCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGlucHV0IHN0cmVhbSB0aGVuIGNsb3NlIGl0Ci0gICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIElnbm9yZSBzaW5jZSB3ZSBhcmUgc3RvcHBpbmcgZXZlcnl0aGluZwotICAgIH0KLQotICAgIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTaHV0ZG93biBvdXRwdXQgc29ja2V0IGFuZCBjbG9zZSBvdXRwdXQgc3RyZWFtLgotICAgKiBAcGFyYW0gb3V0U29ja2V0IG91dCBzb2NrZXQuCi0gICAqIEBwYXJhbSBvdXRwdXRTdHJlYW0gb3V0cHV0IHN0cmVhbS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHN0b3BPdXRwdXQoU29ja2V0IG91dFNvY2tldCwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIElmIHRoZXJlIGlzIGFuIG91dHB1dCBzdHJlYW0sIHRoZW4gZmx1c2ggaXQKLSAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgaW5wdXQgc29ja2V0LCB0aGVuIHNodXRkb3duIHRoZSBpbnB1dAotICAgICAgaWYgKG91dFNvY2tldCAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXRTb2NrZXQuc2h1dGRvd25PdXRwdXQoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gb3V0cHV0IHN0cmVhbSB0aGVuIGNsb3NlIGl0Ci0gICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBJZ25vcmUgc2luY2Ugd2UgYXJlIHN0b3BwaW5nIGV2ZXJ5dGhpbmcKLSAgICB9Ci0KLSAgICBvdXRwdXRTdHJlYW0gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNodXRkb3duIGhhbmRsZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpCi0gIHsKLSAgICAvLyBTdG9wIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQKLSAgICBzdG9wSW5wdXQodGhpcy5pblNvY2tldCwgdGhpcy5pbnB1dFN0cmVhbSk7Ci0gICAgc3RvcE91dHB1dCh0aGlzLm91dFNvY2tldCwgdGhpcy5vdXRwdXRTdHJlYW0pOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc3BsYXkgZGVidWcgbWVzc2FnZXMuCi0gICAqLwotICB2b2lkIGRlYnVnKFN0cmluZyBtZXRob2QsIFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgZGVidWcoIlNvY2tldEhhbmRsZXIiLCBtZXRob2QsIG1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc3BsYXkgZGVidWcgbWVzc2FnZXMuCi0gICAqLwotICB2b2lkIGRlYnVnKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2QsIFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgaWYgKHZlcmJvc2UpCi0gICAgICBwcmludChjbGFzc05hbWUsIG1ldGhvZCwgbWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogRGlzcGxheSBtZXNzYWdlcy4KLSAgICovCi0gIHZvaWQgcHJpbnQoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAiWyIKLSAgICAgICAgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQotICAgICAgICArICJdIFsiCi0gICAgICAgICsgY2xhc3NOYW1lCi0gICAgICAgICsgIi4iCi0gICAgICAgICsgbWV0aG9kCi0gICAgICAgICsgIl0gWyIKLSAgICAgICAgKyB0aGlzLmNvbm5lY3Rpb25UeXBlCi0gICAgICAgICsgIl0gIgotICAgICAgICArIG1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqIAotICAgKiBXcml0ZSBkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlKAotICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sCi0gICAgYnl0ZVtdIGJ1ZmZlciwKLSAgICBpbnQgc3RhcnQsCi0gICAgaW50IGxlbmd0aCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKCJ3cml0ZSIsICJDb3VsZCBub3Qgd3JpdGUgYnVmZmVyIGJlY2F1c2Ugb3V0cHV0IHN0cmVhbSBpcyBudWxsLiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICBkZWJ1Zygid3JpdGUiLCAiYnVmZmVyOiBbIiArIG5ldyBTdHJpbmcoYnVmZmVyLCBzdGFydCwgbGVuZ3RoKSArICJdIik7Ci0KLSAgICAgIG91dHB1dFN0cmVhbS53cml0ZShidWZmZXIsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLSAgfQotCi0gIC8qKiAKLSAgICogQ2hlY2sgaWYgbWVzc2FnZSBpcyBjb21wbGV0ZS4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlQ29udGV4dAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzTWVzc2FnZUNvbXBsZXRlKE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGludCBpbmRleCwgaW5kZXgyLCBjb250ZW50TGVuOwotICAgIGJvb2xlYW4gbWVzc2FnZUNvbXBsZXRlID0gZmFsc2U7Ci0KLSAgICBib29sZWFuIG1vcmVDaHVua2VkRGF0YSA9IG1lc3NhZ2VDb250ZXh0LmNodW5rZWREYXRhLmlzTW9yZUNodW5rZWREYXRhKCk7Ci0KLSAgICBTdHJpbmcgbWVzc2FnZSA9IG1lc3NhZ2VDb250ZXh0Lm1lc3NhZ2VCdWZmZXIudG9TdHJpbmcoKTsKLQotICAgIC8vIEZpbmQgdGhlIGZpcnN0IENSTEYgKyBDUkxGIHdoaWNoIG1hcmtzIHRoZSBlbmQgb2YgdGhlIEhUVFAgaGVhZGVyCi0gICAgU3RyaW5nIGh0dHBIZWFkZXI7Ci0gICAgaW5kZXggPSBVdGlscy5nZXRGaXJzdENSTEZDUkxGKG1lc3NhZ2UpOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIGh0dHBIZWFkZXIgPSBtZXNzYWdlOwotICAgIGVsc2UKLSAgICAgIGh0dHBIZWFkZXIgPSBtZXNzYWdlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLSAgICAvLyBJZiBjaHVua2VkIGRhdGEsIHRoZW4gY29tcGxldGUgb25seSBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEKLSAgICBpZiAoKChodHRwSGVhZGVyLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihDSFVOS0VEKSAhPSAtMSkKLSAgICAgIHx8IChodHRwSGVhZGVyLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihDSFVOS0VEX1dJVEhfUVVPVEVTKSAhPSAtMSkpCi0gICAgICAmJiAoIW1vcmVDaHVua2VkRGF0YSkpCi0gICAgewotICAgICAgZGVidWcoCi0gICAgICAgICJpc01lc3NhZ2VDb21wbGV0ZSIsCi0gICAgICAgICJIVFRQIGhlYWRlciBpbmRpY2F0ZXMgY2h1bmtlZCBkYXRhIGFuZCB0aGVyZSBpcyBubyBtb3JlIGNodW5rZWQgZGF0YSIpOwotICAgICAgbWVzc2FnZUNvbXBsZXRlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBmb3IgY29udGVudCBsZW5ndGgKLSAgICBlbHNlIGlmICgoaW5kZXggPSBodHRwSGVhZGVyLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihDT05URU5UX0xFTkdUSCkpID09IC0xKQotICAgIHsKLSAgICAgIGRlYnVnKCJpc01lc3NhZ2VDb21wbGV0ZSIsICJIVFRQIGhlYWRlciBkb2VzIG5vdCBjb250YWluIGNvbnRlbnQgbGVuZ3RoIik7Ci0KLSAgICAgIC8vIFNob3VsZCBub3QgaGF2ZSBjb21wbGV0ZSBQT1NUIGhlYWRlciB3aXRob3V0IGNvbnRlbnQgbGVuZ3RoCi0gICAgICBpZiAoaHR0cEhlYWRlci5zdGFydHNXaXRoKCJQT1NUIikpCi0gICAgICB7Ci0gICAgICAgIGlmIChodHRwSGVhZGVyLmVuZHNXaXRoKENSTEYgKyBDUkxGKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2NhdGUgY29udGVudC1sZW5ndGggaW4gSFRUUCBQT1NUIGhlYWRlci4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1lc3NhZ2VDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgfQotCi0gICAgICAvLyBUaGlzIGNvdWxkIGJlIGEgR0VULCBzbyBzZWUgaWYgdGhlIHRoZSBjb21wbGV0ZSBoZWFkZXIgaGFzIGJlZW4gcmVjZWl2ZWQKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICBodHRwSGVhZGVyLnN0YXJ0c1dpdGgoIkdFVCIpCi0gICAgICAgICAgJiYgKG1lc3NhZ2UubGVuZ3RoKCkgPT0gaHR0cEhlYWRlci5sZW5ndGgoKQotICAgICAgICAgICAgJiYgbWVzc2FnZS5lbmRzV2l0aChDUkxGICsgQ1JMRikpKQotICAgICAgewotICAgICAgICBtZXNzYWdlQ29tcGxldGUgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2VDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIGNvbnRlbnQgbGVuZ3RoLCB0aGVuIHNlZSBpZiB0aGUgZW50aXJlIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQKLSAgICBlbHNlIGlmICgoaW5kZXggPSBodHRwSGVhZGVyLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihDT05URU5UX0xFTkdUSCkpICE9IC0xKQotICAgIHsKLSAgICAgIC8vIEZpbmQgZW5kIG9mIGNvbnRlbnQgbGVuZ3RoIHZhbHVlCi0gICAgICBpbmRleDIgPSBodHRwSGVhZGVyLmluZGV4T2YoQ1JMRiwgaW5kZXgpOwotCi0gICAgICBkZWJ1ZygiaXNNZXNzYWdlQ29tcGxldGUiLCAiQ1JMRjogIiArIFV0aWxzLnRvSGV4U3RyaW5nKENSTEYpKTsKLSAgICAgIGRlYnVnKAotICAgICAgICAiaXNNZXNzYWdlQ29tcGxldGUiLAotICAgICAgICAiaHR0cEhlYWRlci9pbmRleDogIiArIFV0aWxzLnRvSGV4U3RyaW5nKGh0dHBIZWFkZXIuc3Vic3RyaW5nKGluZGV4KSkpOwotCi0gICAgICAvLyBHZXQgY29udGVudCBsZW5ndGgKLSAgICAgIGNvbnRlbnRMZW4gPQotICAgICAgICBJbnRlZ2VyCi0gICAgICAgICAgLmRlY29kZSgKLSAgICAgICAgICAgIGh0dHBIZWFkZXIuc3Vic3RyaW5nKGluZGV4ICsgQ09OVEVOVF9MRU5HVEgubGVuZ3RoKCkgKyAxLCBpbmRleDIpKQotICAgICAgICAgIC5pbnRWYWx1ZSgpOwotCi0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKCJpc01lc3NhZ2VDb21wbGV0ZSIsICJjb250ZW50TGVuOiAiICsgY29udGVudExlbik7Ci0KLSAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IENSTEYgKyBDUkxGIHdoaWNoIG1hcmtzIHRoZSBlbmQgb2YgdGhlIEhUVFAgaGVhZGVyCi0gICAgICBpbmRleCA9IFV0aWxzLmdldEZpcnN0Q1JMRkNSTEYobWVzc2FnZSk7Ci0KLSAgICAgIC8vIERFQlVHOgotICAgICAgZGVidWcoCi0gICAgICAgICJpc01lc3NhZ2VDb21wbGV0ZSIsCi0gICAgICAgICJhY3R1YWwgcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGg6ICIgKyAobWVzc2FnZS5sZW5ndGgoKSAtIChpbmRleCkpKTsKLQotICAgICAgLy8gSWYgY29udGVudCBsZW5ndGggaXMgZXF1YWwgdG8gYWN0dWFsIG1lc3NhZ2UgY29udGVudCBsZW5ndGgsIHRoZW4gbWVzc2FnZSBpcyBjb21wbGV0ZQotICAgICAgaWYgKGNvbnRlbnRMZW4gPT0gbWVzc2FnZS5sZW5ndGgoKSAtIGluZGV4KQotICAgICAgewotICAgICAgICBtZXNzYWdlQ29tcGxldGUgPSB0cnVlOwotCi0gICAgICAgIC8vIERFQlVHOgotICAgICAgICBkZWJ1ZygKLSAgICAgICAgICAiaXNNZXNzYWdlQ29tcGxldGUiLAotICAgICAgICAgICJjb250ZW50TGVuID0gYWN0dWFsIHJlY2VpdmVkIG1lc3NhZ2UgbGVuZ3RoLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE1lc3NhZ2UgaXMgbm90IGNvbXBsZXRlCi0gICAgZWxzZQotICAgIHsKLSAgICAgIG1lc3NhZ2VDb21wbGV0ZSA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIERFQlVHOgotICAgIGRlYnVnKCJpc01lc3NhZ2VDb21wbGV0ZSIsICJtZXNzYWdlQ29tcGxldGU6ICIgKyBtZXNzYWdlQ29tcGxldGUpOwotCi0gICAgcmV0dXJuIG1lc3NhZ2VDb21wbGV0ZTsKLSAgfQotCi0gIC8qKiAKLSAgICogTG9nIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZUJ1ZmZlcgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvZ01lc3NhZ2UoTWVzc2FnZUNvbnRleHQgbWVzc2FnZUNvbnRleHQpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBudWxsOwotCi0gICAgLy8gRGV0ZXJtaW5lIHNlbmRlciBhbmQgcmVjZWl2ZXIgaG9zdC9wb3J0Ci0gICAgU3RyaW5nIHNlbmRlckhvc3RBbmRQb3J0LCByZWNlaXZlckhvc3RBbmRQb3J0OwotCi0gICAgLy8gUmVxdWVzdAotICAgIGlmIChjb25uZWN0aW9uVHlwZS5lcXVhbHMoTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkpCi0gICAgewotICAgICAgc2VuZGVySG9zdEFuZFBvcnQgPQotICAgICAgICBpblNvY2tldC5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkgKyAiOiIgKyBpblNvY2tldC5nZXRQb3J0KCk7Ci0gICAgICByZWNlaXZlckhvc3RBbmRQb3J0ID0gdGFyZ2V0SG9zdCArICI6IiArIG91dFNvY2tldC5nZXRQb3J0KCk7Ci0gICAgfQotCi0gICAgLy8gUmVzcG9uc2UgICAgICAKLSAgICBlbHNlCi0gICAgewotICAgICAgc2VuZGVySG9zdEFuZFBvcnQgPSB0YXJnZXRIb3N0ICsgIjoiICsgaW5Tb2NrZXQuZ2V0UG9ydCgpOwotICAgICAgcmVjZWl2ZXJIb3N0QW5kUG9ydCA9Ci0gICAgICAgIG91dFNvY2tldC5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkgKyAiOiIgKyBvdXRTb2NrZXQuZ2V0UG9ydCgpOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSBtZXNzYWdlIGVudHJ5Ci0gICAgdGhpcy5zb2NrZXRDb25uZWN0aW9uLmxvZ01lc3NhZ2UoCi0gICAgICBjb252ZXJzYXRpb25JRCwKLSAgICAgIHRoaXMuY29ubmVjdGlvblR5cGUsCi0gICAgICBtZXNzYWdlQ29udGV4dC50aW1lc3RhbXAsCi0gICAgICBzZW5kZXJIb3N0QW5kUG9ydCwKLSAgICAgIHJlY2VpdmVySG9zdEFuZFBvcnQsCi0gICAgICBtZXNzYWdlQ29udGV4dC5tZXNzYWdlQnVmZmVyLAotICAgICAgbWVzc2FnZUNvbnRleHQuYm9tLAotICAgICAgbWVzc2FnZUNvbnRleHQuZW5jb2RpbmcpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGZvciBIVFRQIG1lc3NhZ2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBsb2dnZWQuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYnlwYXNzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIGJvb2xlYW4gYnlwYXNzID0gZmFsc2U7Ci0gICAgaWYgKChtZXNzYWdlLnN0YXJ0c1dpdGgoIkNPTk5FQ1QiKSkKLSAgICAgIHx8IChtZXNzYWdlLnN0YXJ0c1dpdGgoIlRSQUNFIikpCi0gICAgICB8fCAobWVzc2FnZS5zdGFydHNXaXRoKCJERUxFVEUiKSkKLSAgICAgIHx8IChtZXNzYWdlLnN0YXJ0c1dpdGgoIk9QVElPTlMiKSkKLSAgICAgIHx8IChtZXNzYWdlLnN0YXJ0c1dpdGgoIkhFQUQiKSkpCi0gICAgewotICAgICAgYnlwYXNzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYnlwYXNzOwotICB9Ci0KLSAgLy8gSTE4TjogMjAwMy4wMi4yNiBtb2RpZmllZCBieSBLLk5ha2Fnb21lQEJlYWNvbklUCi0gIC8qKgotICAgKiBTZXQgRW5jb2RpbmcgUGFyYW1ldGVycwotICAgKiBAcGFyYW0gbWVzc2FnZUZyYWdtZW50IFN0cmluZyBvZiBhIEhUVFAgbWVzc2FnZSBmcmFnbWVudC4KLSAgICogQGF1dGhvciBLLk5ha2Fnb21lQEJlYWNvbklUIEphcGFuIFNJRyAKLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgbWVzc2FnZUZyYWdtZW50KQotICB7Ci0gICAgaWYgKG1pbWVDaGFyc2V0ID09IG51bGwgfHwgbWltZUNoYXJzZXQubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICBtaW1lQ2hhcnNldCA9IFV0aWxzLmdldEhUVFBDaGFyc2V0KG1lc3NhZ2VGcmFnbWVudCk7Ci0gICAgfQotICAgIGlmICh4bWxFbmNvZGluZyA9PSBudWxsIHx8IHhtbEVuY29kaW5nLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgeG1sRW5jb2RpbmcgPSBVdGlscy5nZXRYTUxFbmNvZGluZyhtZXNzYWdlRnJhZ21lbnQpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBJMThOOiAyMDAzLjAyLjI2IG1vZGlmaWVkIGJ5IEsuTmFrYWdvbWVAQmVhY29uSVQKLSAgLyoqCi0gICAqIEdldCBFbmNvZGluZyBQYXJhbWV0ZXIKLSAgICogQHJldHVybiBDaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgSFRUUCBtZXNzYWdlLgotICAgKiBAYXV0aG9yIEsuTmFrYWdvbWVAQmVhY29uSVQgSmFwYW4gU0lHIAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0RW5jb2RpbmcoKQotICB7Ci0gICAgU3RyaW5nIGVuY29kaW5nID0gV1NJQ29uc3RhbnRzLkRFRkFVTFRfWE1MX0VOQ09ESU5HOwotICAgIGlmIChtaW1lQ2hhcnNldCAhPSBudWxsICYmIG1pbWVDaGFyc2V0Lmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICBlbmNvZGluZyA9IG1pbWVDaGFyc2V0OwotICAgIH0KLSAgICBpZiAoeG1sRW5jb2RpbmcgIT0gbnVsbCAmJiB4bWxFbmNvZGluZy5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgZW5jb2RpbmcgPSB4bWxFbmNvZGluZzsKLSAgICB9Ci0gICAgcmV0dXJuIGVuY29kaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgQnl0ZSBPcmRlciBNYXJrIGZyb20gdGhlIG1lc3NhZ2UgKGlmIHRoZXJlIGlzIG9uZSkuCi0gICAqLwotICBwcml2YXRlIGludCBnZXRCT00oYnl0ZVtdIG1lc3NhZ2UpCi0gIHsKLSAgICBpbnQgYm9tID0gMDsKLQotICAgIGJ5dGUgRkYgPSAoYnl0ZSkgMHhGRjsKLSAgICBieXRlIEZFID0gKGJ5dGUpIDB4RkU7Ci0gICAgYnl0ZSBFRiA9IChieXRlKSAweEVGOwotICAgIGJ5dGUgQkIgPSAoYnl0ZSkgMHhCQjsKLSAgICBieXRlIEJGID0gKGJ5dGUpIDB4QkY7Ci0KLSAgICAvLyBTZWFyY2ggdGhyb3VnaCB0aGUgYnl0ZSBhcnJheSBmb3IgQ1JMRitDUkxGLiAgVGhpcyB3aWxsIG1hcmsgdGhlIGVuZCBvZiB0aGUgaGVhZGVyLgotICAgIGludCBpID0gVXRpbHMuZ2V0Rmlyc3RDUkxGQ1JMRihtZXNzYWdlLCAwKTsKLSAgICBpZiAoaSAhPSAtMSkKLSAgICB7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIGRlYnVnKAotICAgICAgICAiZ2V0Qk9NIiwKLSAgICAgICAgIm1lc3NhZ2VbaV06ICIKLSAgICAgICAgICArIG1lc3NhZ2VbaV0KLSAgICAgICAgICArICIsIG1lc3NhZ2VbaSsxXTogIgotICAgICAgICAgICsgbWVzc2FnZVtpKzFdKTsKLQotICAgICAgLy8gQ2hlY2sgZm9yIFVURi04IEJPTQotICAgICAgaWYgKCgoaSArIDIpIDwgbWVzc2FnZS5sZW5ndGgpCi0gICAgICAgICYmIG1lc3NhZ2VbaV0gPT0gRUYKLSAgICAgICAgJiYgbWVzc2FnZVtpKzFdID09IEJCCi0gICAgICAgICYmIG1lc3NhZ2VbaSsyXSA9PSBCRikKLSAgICAgIHsKLSAgICAgICAgYm9tID0gMHhFRkJCQkY7Ci0gICAgICB9Ci0gICAgICAvLyBDaGVjayBmb3IgVVRGLTE2IGJpZy1lbmRpYW4gQk9NCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKChpKzEpIDwgbWVzc2FnZS5sZW5ndGgpCi0gICAgICAgICAgJiYgbWVzc2FnZVtpXSA9PSBGRQotICAgICAgICAgICYmIG1lc3NhZ2VbaSArIDFdID09IEZGKQotICAgICAgewotICAgICAgICBib20gPSAweEZFRkY7Ci0gICAgICB9Ci0gICAgICAvLyBDaGVjayBmb3IgVVRGLTE2IGxpdHRsZS1lbmRpYW4gQk9NCi0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKChpKzEpIDwgbWVzc2FnZS5sZW5ndGgpCi0gICAgICAgICAgJiYgbWVzc2FnZVtpXSA9PSBGRgotICAgICAgICAgICYmIG1lc3NhZ2VbaSsxXSA9PSBGRSkKLSAgICAgIHsKLSAgICAgICAgYm9tID0gMHhGRkZFOwotICAgICAgfQotICAgICAgLy8gQUREOiBEbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBvdGhlciBCT01zCi0gICAgfQotICAgIHJldHVybiBib207Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSByZWFkIGlzIHN0aWxsIHdhaXRpbmcgZm9yIGRhdGEuCi0gICAqLwotICBib29sZWFuIGlzUmVhZFdhaXRpbmcoKQotICB7Ci0gICAgYm9vbGVhbiByZWFkV2FpdGluZyA9IGZhbHNlOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gREVCVUc6Ci0gICAgICBkZWJ1ZygKLSAgICAgICAgImlzUmVhZFdhaXRpbmciLAotICAgICAgICAiaW5Tb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKS5hdmFpbGFibGUoKTogIgotICAgICAgICAgICsgaW5Tb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKS5hdmFpbGFibGUoKSk7Ci0KLSAgICAgIGlmIChpblNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLmF2YWlsYWJsZSgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHJlYWRXYWl0aW5nID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVhZFdhaXRpbmc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHJlYWQgdGltZWQgb3V0IGZsYWcuCi0gICAqLwotICBib29sZWFuIGlzUmVhZFRpbWVkT3V0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnJlYWRUaW1lZE91dDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXNzYWdlIGNvbnRleHQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lc3NhZ2UgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQuCi0gICAqLwotICBjbGFzcyBNZXNzYWdlQ29udGV4dAotICB7Ci0gICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2VCdWZmZXI7Ci0gICAgQ2h1bmtlZERhdGEgY2h1bmtlZERhdGE7Ci0gICAgU3RyaW5nIHRpbWVzdGFtcDsKLSAgICBpbnQgYm9tOwotICAgIFN0cmluZyBlbmNvZGluZzsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBuZXcgbWVzc2FnZSBjb250ZXh0LgotICAgICAqLwotICAgIE1lc3NhZ2VDb250ZXh0KCkKLSAgICB7Ci0gICAgICBtZXNzYWdlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgY2h1bmtlZERhdGEgPSBuZXcgQ2h1bmtlZERhdGEoKTsKLSAgICAgIHRpbWVzdGFtcCA9IG51bGw7Ci0gICAgICBib20gPSAwOwotICAgICAgZW5jb2RpbmcgPSBXU0lDb25zdGFudHMuREVGQVVMVF9YTUxfRU5DT0RJTkc7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvQ29tbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlNGFkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBtb25pdG9yIGNvbmZpZyBDb21tZW50IGVsZW1lbnQuICAKLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50IGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9DT01NRU5UOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IGNvbW1lbnQgdGV4dC4KLSAgICogQHJldHVybiBjb21tZW50IHRleHQuCi0gICAqIEBzZWUgI3NldFRleHQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCi0gIC8qKgotICAgKiBTZXQgY29tbWVudCB0ZXh0LgotICAgKiBAcGFyYW0gdGV4dCB0aGUgY29tbWVudCB0ZXh0LgotICAgKiBAc2VlICNnZXRUZXh0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9NYW5JblRoZU1pZGRsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL01hbkluVGhlTWlkZGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzBhYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL01hbkluVGhlTWlkZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgbW9uaXRvciBjb25maWcgTWFuSW5UaGVNaWRkbGUgZWxlbWVudC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbkluVGhlTWlkZGxlIGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9NQU5fSU5fVEhFX01JRERMRTsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfTU9OSVRPUl9DT05GSUcsIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIEdldCBjb21tZW50LgotICAgKiBAcmV0dXJuIGNvbW1lbnQuCi0gICAqIEBzZWUgI3NldENvbW1lbnQKLSAgICovCi0gIHB1YmxpYyBDb21tZW50IGdldENvbW1lbnQoKTsKLQotICAvKioKLSAgICogU2V0IGNvbW1lbnQuCi0gICAqIEBwYXJhbSBjb21tZW50IHRoZSBDb21tZW50IG9iamVjdC4KLSAgICogQHNlZSAjZ2V0Q29tbWVudAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tbWVudChDb21tZW50IGNvbW1lbnQpOwotCi0gIC8qKgotICAgKiBHZXQgcmVkaXJlY3RzLgotICAgKiBAcmV0dXJuIHRoZSByZWRpcmlyZWN0cy4KLSAgICogQHNlZSAjc2V0UmVkaXJlY3RMaXN0Ci0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFJlZGlyZWN0TGlzdCgpOwotCi0gIC8qKgotICAgKiBBZGQgcmVkaXJlY3QuCi0gICAqIEBwYXJhbSByZWRpcmVjdCB0aGUgUmVkaXJlY3Qgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUmVkaXJlY3QoUmVkaXJlY3QgcmVkaXJlY3QpOwotCi0gIC8qKgotICAgKiBTZXQgcmVkaXJlY3RzLgotICAgKiBAcGFyYW0gcmVkaXJlY3RMaXN0IGEgbGlzdCBvZiB0aGUgcmVkaXJlY3RzLgotICAgKiBAc2VlICNnZXRSZWRpcmVjdExpc3QgCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWRpcmVjdExpc3QoVmVjdG9yIHJlZGlyZWN0TGlzdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvTW9uaXRvckNvbmZpZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL01vbml0b3JDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkZjFlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvTW9uaXRvckNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZzsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5XU0lEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NZXNzYWdlTGlzdDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBtb25pdG9yIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vbml0b3JDb25maWcgZXh0ZW5kcyBXU0lEb2N1bWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fQ09ORklHOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRywgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBtb25pdG9yIGNvbmZpZy4KLSAgICogQHBhcmFtIG1lc3NhZ2VMaXN0IGEgbE1lc3NhZ2VMaXN0IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QpOwotCi0gIC8qKgotICAgKiBHZXQgY29tbWVudC4KLSAgICogQHJldHVybiBjb21tZW50LgotICAgKiBAc2VlICNzZXRDb21tZW50Ci0gICAqLwotICBwdWJsaWMgQ29tbWVudCBnZXRDb21tZW50KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBjb21tZW50LgotICAgKiBAcGFyYW0gY29tbWVudCBhIENvbW1lbnQgb2JqZWN0LgotICAgKiBAc2VlICNnZXRDb21tZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KENvbW1lbnQgY29tbWVudCk7Ci0KLSAgLyoqCi0gICAqIEdldCBsb2cgZmlsZSBsb2NhdGlvbi4KLSAgICogQHJldHVybiBsb2cgZmlsZSBsb2NhdGlvbi4KLSAgICogQHNlZSAjc2V0TG9nTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9nTG9jYXRpb24oKTsKLQotICAvKioKLSAgICogU2V0IGxvZyBmaWxlIGxvY2F0aW9uLgotICAgKiBAcGFyYW0gbG9nVVJJIGxvZyBmaWxlIGxvY2F0aW9uLgotICAgKiBAc2VlICNnZXRMb2dMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nTG9jYXRpb24oU3RyaW5nIGxvZ1VSSSk7Ci0KLSAgLyoqCi0gICAqIEdldCByZXBsYWNlIGxvZy4KLSAgICogQHJldHVybiByZXBsYWNlIGxvZy4KLSAgICogQHNlZSAjc2V0UmVwbGFjZUxvZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0UmVwbGFjZUxvZygpOwotCi0gIC8qKgotICAgKiBTZXQgcmVwbGFjZSBsb2cuCi0gICAqIEBwYXJhbSByZXBsYWNlTG9nIGEgcmVwbGFjZSBsb2cuCi0gICAqIEBzZWUgI2dldFJlcGxhY2VMb2cKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VMb2coYm9vbGVhbiByZXBsYWNlTG9nKTsKLQotICAvKioKLSAgICogR2V0IGFkZCBzdHlsZSBzaGVldC4KLSAgICogQHJldHVybiBhZGQgc3R5bGUgc2hlZXQuCi0gICAqIEBzZWUgI3NldEFkZFN0eWxlU2hlZXQKLSAgICovCi0gIHB1YmxpYyBBZGRTdHlsZVNoZWV0IGdldEFkZFN0eWxlU2hlZXQoKTsKLQotICAvKioKLSAgICogU2V0IGFkZCBzdHlsZSBzaGVldC4KLSAgICogQHBhcmFtIGFkZFN0eWxlU2hlZXQgYWRkIHN0eWxlIHNoZWV0LgotICAgKiBAc2VlICNnZXRBZGRTdHlsZVNoZWV0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBZGRTdHlsZVNoZWV0KEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldCk7Ci0KLSAgLyoqCi0gICAqIEdldCBsb2cgZHVyYXRpb24uCi0gICAqIEByZXR1cm4gbG9nIGR1cmF0aW9uLgotICAgKiBAc2VlICNzZXRMb2dEdXJhdGlvbgotICAgKi8KLSAgcHVibGljIGludCBnZXRMb2dEdXJhdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgbG9nIGR1cmF0aW9uLgotICAgKiBAcGFyYW0gbG9nRHVyYXRpb24gbG9nIGR1cmF0aW9uLgotICAgKiBAc2VlICNnZXRMb2dEdXJhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nRHVyYXRpb24oaW50IGxvZ0R1cmF0aW9uKTsKLQotICAvKioKLSAgICogR2V0IHRpbWVvdXQuCi0gICAqIEByZXR1cm4gdGltZW91dC4KLSAgICogQHNlZSAjc2V0VGltZW91dAotICAgKi8KLSAgcHVibGljIGludCBnZXRUaW1lb3V0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aW1lb3V0LgotICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0LgotICAgKiBAc2VlICNnZXRUaW1lb3V0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KTsKLQotICAvKioKLSAgICogR2V0IG1hbi1pbi10aGUtbWlkZGxlIGluZm9ybWF0aW9uLgotICAgKiBAcmV0dXJuIG1hbi1pbi10aGUtbWlkZGxlIGluZm9ybWF0aW9uLgotICAgKiBAc2VlICNzZXRNYW5JblRoZU1pZGRsZQotICAgKi8KLSAgcHVibGljIE1hbkluVGhlTWlkZGxlIGdldE1hbkluVGhlTWlkZGxlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBtYW4taW4tdGhlLW1pZGRsZSBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIG1hbkluVGhlTWlkZGxlIG1hbi1pbi10aGUtbWlkZGxlIGluZm9ybWF0aW9uLgotICAgKiBAc2VlICNnZXRNYW5JblRoZU1pZGRsZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWFuSW5UaGVNaWRkbGUoTWFuSW5UaGVNaWRkbGUgbWFuSW5UaGVNaWRkbGUpOwotCi0gIC8qKgotICAgKiBHZXQgdmVyYm9zZSBvcHRpb24uCi0gICAqIEByZXR1cm4gdmVyYm9zZSBvcHRpb24uCi0gICAqIEBzZWUgI3NldFZlcmJvc2VPcHRpb24KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFZlcmJvc2VPcHRpb24oKTsKLQotICAvKioKLSAgICogU2V0IHZlcmJvc2Ugb3B0aW9uLgotICAgKiBAcGFyYW0gdmVyYm9zZSB2ZXJib3NlIG9wdGlvbi4KLSAgICogQHNlZSAjZ2V0VmVyYm9zZU9wdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmVyYm9zZU9wdGlvbihib29sZWFuIHZlcmJvc2UpOwotCi0gIC8qKgotICAgKiBQYXJzZSB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KLSAgICogQHBhcmFtIGFyZ3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIHdoaWxlIHBhcnNpbmcgdGhlIAotICAgKiAgICAgICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsCi0gICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZUFyZ3MoU3RyaW5nW10gYXJncykgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9Nb25pdG9yQ29uZmlnUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvTW9uaXRvckNvbmZpZ1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGZiZDA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9Nb25pdG9yQ29uZmlnUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWc7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VMaXN0OwotCi0vKioKLSAqIERlZmluZXMgdGhlIGludGVyZmFjZSB1c2VkIHRvIHJlYWQgdGhlIG1vbml0b3IgY29uZmlnIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vbml0b3JDb25maWdSZWFkZXIgZXh0ZW5kcyBEb2N1bWVudFJlYWRlcgotewotICAvKioKLSAgICogSW5pdGlhbGl6ZSBtb25pdG9yIGNvbmZpZy4KLSAgICogQHBhcmFtIG1lc3NhZ2VMaXN0IGEgTWVzc2FnZUxpc3Qgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgaW5pdChNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCk7Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIG1vbml0b3IgY29uZmlnIGZpbGUuCi0gICAqIEBwYXJhbSBtb25pdG9yQ29uZmlnVVJJIHRoZSBtb25pdG9yIGNvbmZpZyBmaWxlIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIGEgTW9uaXRvckNvbmZpZyBvYmplY3QKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgd2hpbGUgcmVhZGluZyBtb25pdG9yIGNvbmZpZyBmaWxlLgotICAgKi8KLSAgcHVibGljIE1vbml0b3JDb25maWcgcmVhZE1vbml0b3JDb25maWcoU3RyaW5nIG1vbml0b3JDb25maWdVUkkpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUmVhZCB0aGUgbW9uaXRvciBjb25maWcgZmlsZS4KLSAgICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0gICAqIEByZXR1cm4gYSBNb25pdG9yQ29uZmlnIG9iamVjdAotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciB3aGlsZSByZWFkaW5nIG1vbml0b3IgY29uZmlnIGZpbGUuCi0gICAqLwotICBwdWJsaWMgTW9uaXRvckNvbmZpZyByZWFkTW9uaXRvckNvbmZpZyhSZWFkZXIgcmVhZGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL1JlZGlyZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvUmVkaXJlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzMDgyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvUmVkaXJlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWc7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIG1vbml0b3IgY29uZmlnIFJlZGlyZWN0IGVsZW1lbnQuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWRpcmVjdCBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fUkVESVJFQ1Q7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX01PTklUT1JfQ09ORklHLCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBHZXQgY29tbWVudC4KLSAgICogQHJldHVybiBjb21tZW50LgotICAgKiBAc2VlICNzZXRDb21tZW50Ci0gICAqLwotICBwdWJsaWMgQ29tbWVudCBnZXRDb21tZW50KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBjb21tZW50LgotICAgKiBAcGFyYW0gY29tbWVudCBhIENvbW1lbnRvYmplY3QuCi0gICAqIEBzZWUgI2dldENvbW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoQ29tbWVudCBjb21tZW50KTsKLQotICAvKioKLSAgICogR2V0IGxpc3RlbiBwb3J0LgotICAgKiBAcmV0dXJuIGxpc3RlbiBwb3J0LgotICAgKiBAc2VlICNzZXRMaXN0ZW5Qb3J0Ci0gICAqLwotICBwdWJsaWMgaW50IGdldExpc3RlblBvcnQoKTsKLQotICAvKioKLSAgICogU2V0IGxpc3RlbiBwb3J0LgotICAgKiBAcGFyYW0gbGlzdGVuUG9ydCBsaXN0ZW4gcG9ydC4KLSAgICogQHNlZSAjZ2V0TGlzdGVuUG9ydAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGlzdGVuUG9ydChpbnQgbGlzdGVuUG9ydCk7Ci0KLSAgLyoqCi0gICAqIEdldCBob3N0LgotICAgKiBAcmV0dXJuIGhvc3QuCi0gICAqIEBzZWUgI3NldEhvc3QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpOwotCi0gIC8qKgotICAgKiBTZXQgaG9zdC4KLSAgICogQHBhcmFtIGhvc3QgIGhvc3QuCi0gICAqIEBzZWUgI2dldEhvc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpOwotCi0gIC8qKgotICAgKiBHZXQgc2VuZCB0byBwb3J0LgotICAgKiBAcmV0dXJuIHNlbmQgdG8gcG9ydC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VG9Qb3J0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCBzZW5kIHRvIGhvc3QuCi0gICAqIEByZXR1cm4gc2VuZCB0byBob3N0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUb0hvc3QoKTsKLQotICAvKioKLSAgICogR2V0IHNlbmQgdG8gcHJvdG9jb2wuCi0gICAqIEByZXR1cm4gc2VuZCB0byBwcm90b2NvbC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VG9Qcm90b2NvbCgpOwotCi0gIC8qKgotICAgKiBHZXQgbWF4aW11bSBjb25uZWN0aW9ucy4KLSAgICogQHJldHVybiBtYXhpbXVtIGNvbm5lY3Rpb25zLgotICAgKiBAc2VlICNzZXRNYXhDb25uZWN0aW9ucwotICAgKi8KLSAgcHVibGljIGludCBnZXRNYXhDb25uZWN0aW9ucygpOwotCi0gIC8qKgotICAgKiBTZXQgbWF4aW11bSBjb25uZWN0aW9ucy4KLSAgICogQHBhcmFtIG1heENvbm5lY3Rpb25zIG1heGltdW0gY29ubmVjdGlvbnMuCi0gICAqIEBzZWUgI2dldE1heENvbm5lY3Rpb25zCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNYXhDb25uZWN0aW9ucyhpbnQgbWF4Q29ubmVjdGlvbnMpOwotCi0gIC8qKgotICAgKiBHZXQgcmVhZCB0aW1lb3V0IHNlY29uZHMuCi0gICAqIEByZXR1cm4gcmVhZCB0aW1lb3V0IHNlY29uZHMuCi0gICAqIEBzZWUgI3NldFJlYWRUaW1lb3V0U2Vjb25kcwotICAgKi8KLSAgcHVibGljIGludCBnZXRSZWFkVGltZW91dFNlY29uZHMoKTsKLQotICAvKioKLSAgICogU2V0IHJlYWQgdGltZW91dCBzZWNvbmRzLgotICAgKiBAcGFyYW0gcmVhZFRpbWVvdXRTZWNvbmRzIHJlYWQgdGltZW91dCBzZWNvbmRzLgotICAgKiBAc2VlICNnZXRSZWFkVGltZW91dFNlY29uZHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlYWRUaW1lb3V0U2Vjb25kcyhpbnQgcmVhZFRpbWVvdXRTZWNvbmRzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL0NvbW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9Db21tZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWMwOWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL0NvbW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuQ29tbWVudDsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIG1vbml0b3IgY29uZmlnIENvbW1lbnQgZWxlbWVudC4gCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50SW1wbCBpbXBsZW1lbnRzIENvbW1lbnQKLXsKLSAgLyoqCi0gICAqIENvbW1lbnQgdGV4dC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Db21tZW50I2dldFRleHQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnRleHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLkNvbW1lbnQjc2V0VGV4dChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KQotICB7Ci0gICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENvbmZpZyBvcHRpb25zCi0gICAgLy9wdy5wcmludCgiICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIiB4bWxucz1cIiIgKyBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRyArICJcIj4iKTsgICAgCi0gICAgcHcucHJpbnQoIiAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0gICAgcHcucHJpbnQodGhpcy50ZXh0KTsKLQotICAgIC8vIEVuZCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gdGV4dDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9NYW5JblRoZU1pZGRsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL01hbkluVGhlTWlkZGxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NThmYTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL01hbkluVGhlTWlkZGxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5NYW5JblRoZU1pZGRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuUmVkaXJlY3Q7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbW9uaXRvciBjb25maWcgTWFuSW5UaGVNaWRkbGUgZWxlbWVudC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgTWFuSW5UaGVNaWRkbGVJbXBsIGltcGxlbWVudHMgTWFuSW5UaGVNaWRkbGUKLXsKLSAgLyoqCi0gICAqIENvbW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29tbWVudCBjb21tZW50OwotCi0gIC8qKgotICAgKiBSZWRpcmVjdCBsaXN0LgotICAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciByZWRpcmVjdExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5NYW5JblRoZU1pZGRsZSNnZXRDb21tZW50KCkKLSAgICovCi0gIHB1YmxpYyBDb21tZW50IGdldENvbW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuY29tbWVudDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTWFuSW5UaGVNaWRkbGUjc2V0Q29tbWVudChDb21tZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gIHsKLSAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5NYW5JblRoZU1pZGRsZSNnZXRSZWRpcmVjdExpc3QoKQotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRSZWRpcmVjdExpc3QoKQotICB7Ci0gICAgcmV0dXJuIHJlZGlyZWN0TGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTWFuSW5UaGVNaWRkbGUjYWRkUmVkaXJlY3QoUmVkaXJlY3QpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRSZWRpcmVjdChSZWRpcmVjdCByZWRpcmVjdCkKLSAgewotICAgIHJlZGlyZWN0TGlzdC5hZGQocmVkaXJlY3QpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5NYW5JblRoZU1pZGRsZSNzZXRSZWRpcmVjdExpc3QoVmVjdG9yKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVkaXJlY3RMaXN0KFZlY3RvciByZWRpcmVjdExpc3QpCi0gIHsKLSAgICB0aGlzLnJlZGlyZWN0TGlzdCA9IHJlZGlyZWN0TGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIHB3LnByaW50bG4oIiAgbWFuLWluLXRoZS1taWRkbGUgY29tbWVudCAuLi4gIiArIHRoaXMuY29tbWVudCk7Ci0KLSAgICAvLyBSZWRpcmVjdCBsaXN0Ci0gICAgaW50IGNvdW50ID0gMTsKLSAgICBSZWRpcmVjdCByZWRpcmVjdDsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHJlZGlyZWN0TGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgLy8gR2V0IG5leHQgcmVkaXJlY3QgZWxlbWVudAotICAgICAgcmVkaXJlY3QgPSAoUmVkaXJlY3QpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHB3LnByaW50bG4oIiAgcmVkaXJlY3QgWyIgKyBjb3VudCsrICsiXSIpOwotICAgICAgcHcucHJpbnQocmVkaXJlY3QudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBTdGFydCBlbGVtZW50Ci0gICAgcHcucHJpbnRsbigiICAgICAgPCIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgLy8gQ29tbWVudAotICAgIGlmICh0aGlzLmNvbW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludGxuKHRoaXMuY29tbWVudC50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBSZWRpcmVjdAotICAgIFJlZGlyZWN0IHJlZGlyZWN0OwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVkaXJlY3RMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgbmV4dCByZWRpcmVjdCBlbGVtZW50Ci0gICAgICByZWRpcmVjdCA9IChSZWRpcmVjdCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgcHcucHJpbnQocmVkaXJlY3QudG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0gICAgfQotCi0gICAgLy8gRW5kIGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCIgICAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvTW9uaXRvckNvbmZpZ0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9tb25pdG9yL2NvbmZpZy9pbXBsL01vbml0b3JDb25maWdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Njk2NmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvTW9uaXRvckNvbmZpZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uaW1wbC5BZGRTdHlsZVNoZWV0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5Nb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5NYW5JblRoZU1pZGRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZ1JlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuUmVkaXJlY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTWVzc2FnZUxpc3Q7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtb25pdG9yIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgTW9uaXRvckNvbmZpZ0ltcGwgaW1wbGVtZW50cyBNb25pdG9yQ29uZmlnCi17Ci0gIC8qKgotICAgKiBNZXNzYWdlIGxpc3QgcmVmZXJlbmNlLgotICAgKi8KLSAgcHJvdGVjdGVkIE1lc3NhZ2VMaXN0IG1lc3NhZ2VMaXN0ID0gbnVsbDsKLQotICAvKioKLSAgICogTW9uaXRvciBjb25maWd1cmF0aW9uIGZpbGUgVVJJLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkb2N1bWVudFVSSSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENvbW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29tbWVudCBjb21tZW50ID0gbnVsbDsKLQotICAvKioKLSAgICogTG9nIGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBsb2dVUkk7Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2UgbG9nIGluZGljYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHJlcGxhY2VMb2cgPSBmYWxzZTsKLQotICAvKioKLSAgICogU3R5bGUgc2hlZXQgZGVjbGFyYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgQWRkU3R5bGVTaGVldCBhZGRTdHlsZVNoZWV0OwotCi0gIC8qKgotICAgKiBMb2cgZHVyYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IGxvZ0R1cmF0aW9uID0gNjAwOwotCi0gIC8qKgotICAgKiBUaW1lb3V0LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCB0aW1lb3V0ID0gMzsKLQotICAvKioKLSAgICogTWFuLWluLXRoZS1taWRkbGUgc2V0dGluZ3MuCi0gICAqLwotICBwcm90ZWN0ZWQgTWFuSW5UaGVNaWRkbGUgbWFuSW5UaGVNaWRkbGUgPSBudWxsOwotCi0gIC8qKgotICAgKiBWZXJib3NlIG9wdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBtb25pdG9yIGNvbmZpZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QpCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2VMaXN0ID0gbWVzc2FnZUxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjZ2V0Q29tbWVudCgpCi0gICAqLwotICBwdWJsaWMgQ29tbWVudCBnZXRDb21tZW50KCkKLSAgewotICAgIHJldHVybiB0aGlzLmNvbW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjc2V0Q29tbWVudChDb21tZW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gIHsKLSAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI2dldExvZ0xvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9nTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMubG9nVVJJOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI3NldExvZ0xvY2F0aW9uKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvZ0xvY2F0aW9uKFN0cmluZyBsb2dVUkkpCi0gIHsKLSAgICB0aGlzLmxvZ1VSSSA9IGxvZ1VSSTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNnZXRSZXBsYWNlTG9nKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFJlcGxhY2VMb2coKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVwbGFjZUxvZzsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNzZXRSZXBsYWNlTG9nKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlTG9nKGJvb2xlYW4gcmVwbGFjZUxvZykKLSAgewotICAgIHRoaXMucmVwbGFjZUxvZyA9IHJlcGxhY2VMb2c7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjZ2V0QWRkU3R5bGVTaGVldCgpCi0gICAqLwotICBwdWJsaWMgQWRkU3R5bGVTaGVldCBnZXRBZGRTdHlsZVNoZWV0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmFkZFN0eWxlU2hlZXQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjc2V0QWRkU3R5bGVTaGVldChvcmcud3NpLnRlc3QuY29tbW9uLkFkZFN0eWxlU2hlZXQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBZGRTdHlsZVNoZWV0KEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldCkKLSAgewotICAgIHRoaXMuYWRkU3R5bGVTaGVldCA9IGFkZFN0eWxlU2hlZXQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjZ2V0TG9nRHVyYXRpb24oKQotICAgKi8KLSAgcHVibGljIGludCBnZXRMb2dEdXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbG9nRHVyYXRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjc2V0TG9nRHVyYXRpb24oaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nRHVyYXRpb24oaW50IGxvZ0R1cmF0aW9uKQotICB7Ci0gICAgdGhpcy5sb2dEdXJhdGlvbiA9IGxvZ0R1cmF0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI2dldFRpbWVvdXQoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRUaW1lb3V0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnRpbWVvdXQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWcjc2V0VGltZW91dChpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KQotICB7Ci0gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNnZXRNYW5JblRoZU1pZGRsZSgpCi0gICAqLwotICBwdWJsaWMgTWFuSW5UaGVNaWRkbGUgZ2V0TWFuSW5UaGVNaWRkbGUoKQotICB7Ci0gICAgcmV0dXJuIG1hbkluVGhlTWlkZGxlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5Nb25pdG9yQ29uZmlnI3NldE1hbkluVGhlTWlkZGxlKE1hbkluVGhlTWlkZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TWFuSW5UaGVNaWRkbGUoTWFuSW5UaGVNaWRkbGUgbWFuSW5UaGVNaWRkbGUpCi0gIHsKLSAgICB0aGlzLm1hbkluVGhlTWlkZGxlID0gbWFuSW5UaGVNaWRkbGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LldTSURvY3VtZW50I2dldExvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRVUkk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LldTSURvY3VtZW50I3NldExvY2F0aW9uKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBkb2N1bWVudFVSSSkKLSAgewotICAgIHRoaXMuZG9jdW1lbnRVUkkgPSBkb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNnZXRWZXJib3NlT3B0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGdldFZlcmJvc2VPcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudmVyYm9zZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZyNzZXRWZXJib3NlT3B0aW9uKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlT3B0aW9uKGJvb2xlYW4gdmVyYm9zZSkKLSAgewotICAgIHRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDb25maWcgb3B0aW9ucwotICAgIHB3LnByaW50bG4oIiAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICAvLyBDb21tZW50Ci0gICAgaWYgKHRoaXMuY29tbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50KGNvbW1lbnQudG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0gICAgfQotCi0gICAgLy8gTG9nIGZpbGUKLSAgICBwdy5wcmludCgiICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9MT0dfRklMRSArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfUkVQTEFDRSArICI9XCIiICsgdGhpcy5yZXBsYWNlTG9nICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04gKyAiPVwiIiArIHRoaXMubG9nVVJJICsgIlwiPiIpOwotICAgIHB3LnByaW50KGdldEFkZFN0eWxlU2hlZXQoKS50b1hNTFN0cmluZyhuYW1lc3BhY2VOYW1lKSk7Ci0gICAgcHcucHJpbnRsbigiICAgIDwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0xPR19GSUxFICsgIj4iKTsKLQotICAgIC8vIExvZyBkdXJhdGlvbgotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0xPR19EVVJBVElPTiArICI+Iik7Ci0gICAgcHcucHJpbnQodGhpcy5sb2dEdXJhdGlvbik7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTE9HX0RVUkFUSU9OICsgIj4iKTsKLQotICAgIC8vIFRpbWVvdXQKLSAgICBwdy5wcmludCgKLSAgICAgICIgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0NMRUFOVVBfVElNRU9VVF9TRUNPTkRTICsgIj4iKTsKLSAgICBwdy5wcmludCh0aGlzLnRpbWVvdXQpOwotICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0NMRUFOVVBfVElNRU9VVF9TRUNPTkRTICsgIj4iKTsKLQotICAgIC8vIE1hbi1pbi10aGUtbWlkZGxlCi0gICAgaWYgKHRoaXMubWFuSW5UaGVNaWRkbGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludChtYW5JblRoZU1pZGRsZS50b1hNTFN0cmluZyhuc05hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBFbmQgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIHB3LnByaW50bG4oIiAgY29tbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMuY29tbWVudCk7Ci0gICAgcHcucHJpbnRsbigiICBsb2dVUkkgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5sb2dVUkkpOwotICAgIHB3LnByaW50bG4oIiAgcmVwbGFjZUxvZyAuLi4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMucmVwbGFjZUxvZyk7Ci0gICAgcHcucHJpbnRsbigiICBsb2dEdXJhdGlvbiAuLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5sb2dEdXJhdGlvbik7Ci0gICAgcHcucHJpbnRsbigiICB0aW1lb3V0IC4uLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy50aW1lb3V0KTsKLQotICAgIC8vIGFkZFN0eWxlU2hlZXQKLSAgICBpZiAodGhpcy5hZGRTdHlsZVNoZWV0ICE9IG51bGwpCi0gICAgICBwdy5wcmludGxuKAotICAgICAgICAiICBhZGRTdHlsZVNoZWV0IC4uLi4uLi4uLi4uLi4uLiAiICsgdGhpcy5hZGRTdHlsZVNoZWV0LnRvU3RyaW5nKCkpOwotCi0gICAgLy8gTWFuLWluLXRoZS1taWRkbGUKLSAgICBpZiAodGhpcy5tYW5JblRoZU1pZGRsZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50KHRoaXMubWFuSW5UaGVNaWRkbGUudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGNvbmZpZyB2YWx1ZXMgZnJvbSBhbm90aGVyIG1vbml0b3IgY29uZmlnIG9iamVjdC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBzZXRDb25maWcoTW9uaXRvckNvbmZpZyBtb25pdG9yQ29uZmlnKQotICB7Ci0gICAgLy8gQUREOiBTaG91bGQgdGhpcyBiZSBhIGNsb25lIG9wZXJhdGlvbj8KLSAgICB0aGlzLmNvbW1lbnQgPSBtb25pdG9yQ29uZmlnLmdldENvbW1lbnQoKTsKLSAgICB0aGlzLmRvY3VtZW50VVJJID0gbW9uaXRvckNvbmZpZy5nZXRMb2NhdGlvbigpOwotICAgIHRoaXMubG9nVVJJID0gbW9uaXRvckNvbmZpZy5nZXRMb2dMb2NhdGlvbigpOwotICAgIHRoaXMucmVwbGFjZUxvZyA9IG1vbml0b3JDb25maWcuZ2V0UmVwbGFjZUxvZygpOwotICAgIHRoaXMubG9nRHVyYXRpb24gPSBtb25pdG9yQ29uZmlnLmdldExvZ0R1cmF0aW9uKCk7Ci0gICAgdGhpcy50aW1lb3V0ID0gbW9uaXRvckNvbmZpZy5nZXRUaW1lb3V0KCk7Ci0gICAgdGhpcy5tYW5JblRoZU1pZGRsZSA9IG1vbml0b3JDb25maWcuZ2V0TWFuSW5UaGVNaWRkbGUoKTsKLSAgICB0aGlzLmFkZFN0eWxlU2hlZXQgPSBtb25pdG9yQ29uZmlnLmdldEFkZFN0eWxlU2hlZXQoKTsKLSAgICB0aGlzLnZlcmJvc2UgPSBtb25pdG9yQ29uZmlnLmdldFZlcmJvc2VPcHRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZnkgY29uZmlnIG9wdGlvbnMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29uZmlnKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gSWYgbm8gcmVkaXJlY3Qgc3RhdGVtZW50cywgdGhlbiBleGl0Ci0gICAgaWYgKCh0aGlzLm1hbkluVGhlTWlkZGxlID09IG51bGwpCi0gICAgICB8fCAodGhpcy5tYW5JblRoZU1pZGRsZS5nZXRSZWRpcmVjdExpc3QoKSA9PSBudWxsKQotICAgICAgfHwgKHRoaXMubWFuSW5UaGVNaWRkbGUuZ2V0UmVkaXJlY3RMaXN0KCkuc2l6ZSgpID09IDApKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzA1IiwKLSAgICAgICAgICAiTW9uaXRvciBjb25maWcgZmlsZSBkaWQgbm90IGNvbnRhaW4gYW55IHJlZGlyZWN0IHN0YXRlbWVudHMuIikpOwotICAgIH0KLQotICAgIGlmICh0aGlzLmxvZ1VSSSA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzA2IiwKLSAgICAgICAgICAiTW9uaXRvciBjb25maWcgZmlsZSBkaWQgbm90IGNvbnRhaW4gdGhlIGxvZyBmaWxlIFVSSS4iKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VBcmdzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCBuZXcgY29uZmlnIHJlYWRlcgotICAgIE1vbml0b3JDb25maWdSZWFkZXIgbW9uaXRvckNvbmZpZ1JlYWRlciA9IG5ldyBNb25pdG9yQ29uZmlnUmVhZGVySW1wbCgpOwotCi0gICAgLy8gTW9uaXRvciBjb25maWcgb2JqZWN0IHdoaWNoIHdpbGwgYmUgbWVyZ2VkIGFmdGVyIGFsbCBvZiB0aGUgaW5wdXQgcGFybXMgYXJlIHByb2Nlc3NlZAotICAgIE1vbml0b3JDb25maWcgbW9uaXRvckNvbmZpZ0Zyb21BcmdzID0gbnVsbDsKLQotICAgIC8vIElmIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlbiB0aHJvdyBleGNlcHRpb24KLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAvLyBBREQ6IAotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgidXNhZ2UwMSIsIE1vbml0b3IuVVNBR0VfTUVTU0FHRSkpOwotICAgIH0KLQotICAgIC8vIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIGxvY2F0ZSB0aGUgY29uZmlnIGZpbGUgb3B0aW9uIChpZiBpdCB3YXMgc3BlY2lmaWVkKQotICAgIGZvciAoaW50IGFyZ0NvdW50ID0gMDsgYXJnQ291bnQgPCBhcmdzLmxlbmd0aDsgYXJnQ291bnQrKykKLSAgICB7Ci0gICAgICAvLyAtY29uZmlnRmlsZQotICAgICAgaWYgKChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItY29uZmlnIikpCi0gICAgICAgIHx8IChhcmdzW2FyZ0NvdW50XS5lcXVhbHMoIi1jIikpKQotICAgICAgewotICAgICAgICBhcmdDb3VudCsrOwotICAgICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3MgPQotICAgICAgICAgIG1vbml0b3JDb25maWdSZWFkZXIucmVhZE1vbml0b3JDb25maWcoYXJnc1thcmdDb3VudF0pOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIGNvbmZpZyBmaWxlIHdhcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGNyZWF0ZSBhbmFseXplciBjb25maWcgb2JqZWN0Ci0gICAgaWYgKG1vbml0b3JDb25maWdGcm9tQXJncyA9PSBudWxsKQotICAgIHsKLSAgICAgIG1vbml0b3JDb25maWdGcm9tQXJncyA9IG5ldyBNb25pdG9yQ29uZmlnSW1wbCgpOwotICAgICAgbW9uaXRvckNvbmZpZ0Zyb21BcmdzLmluaXQodGhpcy5tZXNzYWdlTGlzdCk7Ci0gICAgfQotCi0gICAgLy8gUGFyc2UgYWxsIG9mIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgZm9yIChpbnQgYXJnQ291bnQgPSAwOyBhcmdDb3VudCA8IGFyZ3MubGVuZ3RoOyBhcmdDb3VudCsrKQotICAgIHsKLSAgICAgIC8vIC1jb25maWdGaWxlCi0gICAgICBpZiAoKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1jb25maWciKSkKLSAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLWMiKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFNraXAgdGhpcyBvcHRpb24gc2luY2UgaXQgd2FzIGFscmVhZHkgcHJvY2Vzc2VkCi0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1jb21tZW50Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1jb21tZW50IikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLUMiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIENvbW1lbnQgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotICAgICAgICBjb21tZW50LnNldFRleHQoYXJnc1thcmdDb3VudF0pOwotICAgICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3Muc2V0Q29tbWVudChjb21tZW50KTsKLSAgICAgIH0KLQotICAgICAgLy8gLWxvZ0ZpbGUKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLWxvZ0ZpbGUiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItbCIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgbW9uaXRvckNvbmZpZ0Zyb21BcmdzLnNldExvZ0xvY2F0aW9uKGFyZ3NbYXJnQ291bnRdKTsKLSAgICAgIH0KLQotICAgICAgLy8gLXJlcGxhY2UKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLXJlcGxhY2UiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItciIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgbW9uaXRvckNvbmZpZ0Zyb21BcmdzLnNldFJlcGxhY2VMb2coCi0gICAgICAgICAgQm9vbGVhbi52YWx1ZU9mKGFyZ3NbYXJnQ291bnRdKS5ib29sZWFuVmFsdWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1sb2dEdXJhdGlvbgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItbG9nRHVyYXRpb24iKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItZCIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgbW9uaXRvckNvbmZpZ0Zyb21BcmdzLnNldExvZ0R1cmF0aW9uKAotICAgICAgICAgIEludGVnZXIudmFsdWVPZihhcmdzW2FyZ0NvdW50XSkuaW50VmFsdWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC10aW1lb3V0Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi10aW1lb3V0IikpCi0gICAgICAgICAgfHwgKGFyZ3NbYXJnQ291bnRdLmVxdWFscygiLXQiKSkpCi0gICAgICB7Ci0gICAgICAgIGFyZ0NvdW50Kys7Ci0gICAgICAgIG1vbml0b3JDb25maWdGcm9tQXJncy5zZXRUaW1lb3V0KAotICAgICAgICAgIEludGVnZXIudmFsdWVPZihhcmdzW2FyZ0NvdW50XSkuaW50VmFsdWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1tYW5JblRoZU1pZGRsZQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhcmdzW2FyZ0NvdW50XS5lcXVhbHNJZ25vcmVDYXNlKCItbWFuSW5UaGVNaWRkbGUiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItbSIpKSkKLSAgICAgIHsKLSAgICAgICAgTWFuSW5UaGVNaWRkbGUgbWFuSW5UaGVNaWRkbGUgPSBudWxsOwotCi0gICAgICAgIC8vIEluY3JlbWVudCBhcmcgY291bnQKLSAgICAgICAgYXJnQ291bnQrKzsKLQotICAgICAgICAvLyBHZXQgdGhlIG1hbi1pbi10aGUtbWlkZGxlIG9iamVjdAotICAgICAgICBpZiAoKG1hbkluVGhlTWlkZGxlID0gbW9uaXRvckNvbmZpZ0Zyb21BcmdzLmdldE1hbkluVGhlTWlkZGxlKCkpCi0gICAgICAgICAgPT0gbnVsbCkKLSAgICAgICAgICBtYW5JblRoZU1pZGRsZSA9IG5ldyBNYW5JblRoZU1pZGRsZUltcGwoKTsKLQotICAgICAgICAvLyBBREQ6IENoZWNrIGZvciBjb3JyZWN0IG51bWJlciBvZiByZW1haW5pbmcgYXJncwotCi0gICAgICAgIC8vIENyZWF0ZSByZWRpcmVjdAotICAgICAgICBSZWRpcmVjdCByZWRpcmVjdCA9IG5ldyBSZWRpcmVjdEltcGwoKTsKLQotICAgICAgICAvLyBHZXQgdGhlIHJlZGlyZWN0IHZhbHVlcyAKLSAgICAgICAgcmVkaXJlY3Quc2V0TGlzdGVuUG9ydChJbnRlZ2VyLnZhbHVlT2YoYXJnc1thcmdDb3VudCsrXSkuaW50VmFsdWUoKSk7Ci0gICAgICAgIHJlZGlyZWN0LnNldEhvc3QoYXJnc1thcmdDb3VudCsrXSk7Ci0gICAgICAgIHJlZGlyZWN0LnNldE1heENvbm5lY3Rpb25zKAotICAgICAgICAgIEludGVnZXIudmFsdWVPZihhcmdzW2FyZ0NvdW50KytdKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgcmVkaXJlY3Quc2V0UmVhZFRpbWVvdXRTZWNvbmRzKAotICAgICAgICAgIEludGVnZXIudmFsdWVPZihhcmdzW2FyZ0NvdW50KytdKS5pbnRWYWx1ZSgpKTsKLQotICAgICAgICAvLyBBZGQgcmVkaXJlY3QKLSAgICAgICAgbWFuSW5UaGVNaWRkbGUuYWRkUmVkaXJlY3QocmVkaXJlY3QpOwotCi0gICAgICAgIC8vIFNldCB0aGUgbWFuLWluLXRoZS1taWRkbGUKLSAgICAgICAgbW9uaXRvckNvbmZpZ0Zyb21BcmdzLnNldE1hbkluVGhlTWlkZGxlKG1hbkluVGhlTWlkZGxlKTsKLSAgICAgIH0KLQotICAgICAgLy8gLXZlcmJvc2UKLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoYXJnc1thcmdDb3VudF0uZXF1YWxzSWdub3JlQ2FzZSgiLXZlcmJvc2UiKSkKLSAgICAgICAgICB8fCAoYXJnc1thcmdDb3VudF0uZXF1YWxzKCItdiIpKSkKLSAgICAgIHsKLSAgICAgICAgYXJnQ291bnQrKzsKLSAgICAgICAgLy9tb25pdG9yQ29uZmlnRnJvbUFyZ3Muc2V0VmVyYm9zZU9wdGlvbihCb29sZWFuLnZhbHVlT2YoYXJnc1thcmdDb3VudF0pLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgbW9uaXRvckNvbmZpZ0Zyb21BcmdzLnNldFZlcmJvc2VPcHRpb24odHJ1ZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIC1HVUkKLSAgICAgIGVsc2UgaWYgKGFyZ3NbYXJnQ291bnRdLmVxdWFsc0lnbm9yZUNhc2UoIi1HVUkiKSkKLSAgICAgIHsKLSAgICAgICAgLy8gSWdub3JlIC1HVUkgb3B0aW9uCi0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgImNvbmZpZzAxIiwKLSAgICAgICAgICAgIGFyZ3NbYXJnQ291bnRdLAotICAgICAgICAgICAgIlRoZSBzcGVjaWZpZWQgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIikpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIGFkZFN0eWxlU2hlZXQgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gY3JlYXRlIGEgY29tbWVudCB2ZXJzaW9uIG9mIGl0Ci0gICAgaWYgKG1vbml0b3JDb25maWdGcm9tQXJncy5nZXRBZGRTdHlsZVNoZWV0KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBBZGRTdHlsZVNoZWV0IGFkZFN0eWxlU2hlZXQgPSBuZXcgQWRkU3R5bGVTaGVldEltcGwoKTsKLSAgICAgIGFkZFN0eWxlU2hlZXQuc2V0SHJlZihXU0lDb25zdGFudHMuREVGQVVMVF9MT0dfWFNMKTsKLSAgICAgIGFkZFN0eWxlU2hlZXQuc2V0VHlwZShXU0lDb25zdGFudHMuREVGQVVMVF9YU0xfVFlQRSk7Ci0gICAgICBhZGRTdHlsZVNoZWV0LnNldENvbW1lbnQodHJ1ZSk7Ci0gICAgICBtb25pdG9yQ29uZmlnRnJvbUFyZ3Muc2V0QWRkU3R5bGVTaGVldChhZGRTdHlsZVNoZWV0KTsKLSAgICB9Ci0KLSAgICAvLyBNZXJnZSBjb25maWcgaW5mbyBpbnRvIHRoaXMgb2JqZWN0Ci0gICAgc2V0Q29uZmlnKG1vbml0b3JDb25maWdGcm9tQXJncyk7Ci0KLSAgICAvLyBWZXJpZnkgY29uZmlnIG9wdGlvbnMKLSAgICB2ZXJpZnlDb25maWcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbWVzc2FnZSBmcm9tIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2VJRCwgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2UobWVzc2FnZUlELCBudWxsLCBkZWZhdWx0TWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG1lc3NhZ2UgZnJvbSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKAotICAgIFN0cmluZyBtZXNzYWdlSUQsCi0gICAgU3RyaW5nIG1lc3NhZ2VEYXRhLAotICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIFN0cmluZyBtZXNzYWdlID0gZGVmYXVsdE1lc3NhZ2U7Ci0gICAgaWYgKG1lc3NhZ2VMaXN0ICE9IG51bGwpCi0gICAgICBtZXNzYWdlID0gbWVzc2FnZUxpc3QuZ2V0TWVzc2FnZShtZXNzYWdlSUQsIG1lc3NhZ2VEYXRhLCBkZWZhdWx0TWVzc2FnZSk7Ci0gICAgZWxzZQotICAgICAgbWVzc2FnZSArPSAiICIgKyBtZXNzYWdlRGF0YSArICIuIjsKLQotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9Nb25pdG9yQ29uZmlnUmVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvTW9uaXRvckNvbmZpZ1JlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0YWJjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9Nb25pdG9yQ29uZmlnUmVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5tb25pdG9yLmNvbmZpZy5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lGaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uaW1wbC5BZGRTdHlsZVNoZWV0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuTWFuSW5UaGVNaWRkbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWdSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLlJlZGlyZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCB0byByZWFkIHRoZSBtb25pdG9yIGNvbmZpZyBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIE1vbml0b3JDb25maWdSZWFkZXJJbXBsIGltcGxlbWVudHMgTW9uaXRvckNvbmZpZ1JlYWRlcgotewotICAvKioKLSAgICogTWVzc2FnZSBsaXN0IHJlZmVyZW5jZS4KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlTGlzdCBtZXNzYWdlTGlzdCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIERvY3VtZW50IGxvY2F0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkb2N1bWVudFVSSTsKLQotICAvKioKLSAgICogSW5pdGlhbGl6ZSBtb25pdG9yIGNvbmZpZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoTWVzc2FnZUxpc3QgbWVzc2FnZUxpc3QpCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2VMaXN0ID0gbWVzc2FnZUxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLk1vbml0b3JDb25maWdSZWFkZXIjcmVhZE1vbml0b3JDb25maWcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIE1vbml0b3JDb25maWcgcmVhZE1vbml0b3JDb25maWcoU3RyaW5nIG1vbml0b3JDb25maWdVUkkpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgRmlsZVJlYWRlciBmaWxlUmVhZGVyID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihtb25pdG9yQ29uZmlnVVJJKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUZpbGVOb3RGb3VuZEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgiY29uZmlnMDIiLCBtb25pdG9yQ29uZmlnVVJJLCAiQ291bGQgbm90IGZpbmQgZmlsZToiKSwKLSAgICAgICAgZm5mZSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoImNvbmZpZzAzIiwgbW9uaXRvckNvbmZpZ1VSSSwgIkNvdWxkIG5vdCByZWFkIGZpbGU6IiksCi0gICAgICAgIGUpOwotICAgIH0KLQotICAgIHJldHVybiByZWFkTW9uaXRvckNvbmZpZyhmaWxlUmVhZGVyKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QubW9uaXRvci5jb25maWcuTW9uaXRvckNvbmZpZ1JlYWRlciNyZWFkTW9uaXRvckNvbmZpZyhSZWFkZXIpCi0gICAqLwotICBwdWJsaWMgTW9uaXRvckNvbmZpZyByZWFkTW9uaXRvckNvbmZpZyhSZWFkZXIgcmVhZGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBNb25pdG9yQ29uZmlnIG1vbml0b3JDb25maWcgPSBuZXcgTW9uaXRvckNvbmZpZ0ltcGwoKTsKLQotICAgIC8vIFBhcnNlIFhNTAotICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKHJlYWRlcik7Ci0KLSAgICAvLyBQYXJzZSBlbGVtZW50cyBpbiB0aGUgY29uZmlnIGRvY3VtZW50Ci0gICAgcGFyc2VDb25maWdFbGVtZW50KG1vbml0b3JDb25maWcsIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0KLSAgICByZXR1cm4gbW9uaXRvckNvbmZpZzsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXIjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXIjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGRvY3VtZW50VVJJKQotICB7Ci0gICAgdGhpcy5kb2N1bWVudFVSSSA9IGRvY3VtZW50VVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGNvbmZpZyBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlQ29uZmlnRWxlbWVudChNb25pdG9yQ29uZmlnIG1vbml0b3JDb25maWcsIEVsZW1lbnQgZWxlbWVudCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBBREQ6IFZlcmlmeSB0aGF0IHRoaXMgaXMgdGhlIGNvbmZpZyBlbGVtZW50Ci0KLSAgICAvLyBHZXQgZmlyc3QgY2hpbGQgZWxlbWVudAotICAgIEVsZW1lbnQgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW1lbnQpOwotCi0gICAgYm9vbGVhbiBpc0xvZ0R1cmF0aW9uRGVmaW5lID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpc0NsZWFudXBUaW1lb3V0U2Vjb25kc0RlZmluZSA9IGZhbHNlOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICB3aGlsZSAobmV4dEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyA8bG9nRmlsZT4KLSAgICAgIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0xPR19GSUxFKSkKLSAgICAgIHsKLSAgICAgICAgLy8gUGFyc2UgdGhlIGxvZyBlbGVtZW50Ci0gICAgICAgIHBhcnNlTG9nRmlsZUVsZW1lbnQobW9uaXRvckNvbmZpZywgbmV4dEVsZW1lbnQpOwotICAgICAgfQotCi0gICAgICAvLyA8bG9nRHVyYXRpb24+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0xPR19EVVJBVElPTikpCi0gICAgICB7Ci0gICAgICAgIG1vbml0b3JDb25maWcuc2V0TG9nRHVyYXRpb24oZ2V0SW50VmFsdWUobmV4dEVsZW1lbnQpKTsKLSAgICAgICAgaWYgKG1vbml0b3JDb25maWcuZ2V0TG9nRHVyYXRpb24oKSA8IDApCi0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICJjb25maWcwOSIsCi0gICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5FTEVNX0xPR19EVVJBVElPTiwKLSAgICAgICAgICAgICAgIlBhcmFtZXRlciB2YWx1ZSBjYW4ndCBiZSBuZWdhdGl2ZS4gRWxlbWVudCBuYW1lOiIpKTsKLSAgICAgICAgaXNMb2dEdXJhdGlvbkRlZmluZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxjbGVhbnVwVGltZW91dFNlY29uZHM+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgaXNFbGVtZW50KG5leHRFbGVtZW50LCBXU0lDb25zdGFudHMuRUxFTV9DTEVBTlVQX1RJTUVPVVRfU0VDT05EUykpCi0gICAgICB7Ci0gICAgICAgIG1vbml0b3JDb25maWcuc2V0VGltZW91dChnZXRJbnRWYWx1ZShuZXh0RWxlbWVudCkpOwotICAgICAgICBpZiAobW9uaXRvckNvbmZpZy5nZXRUaW1lb3V0KCkgPCAwKQotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICAgICAiY29uZmlnMDkiLAotICAgICAgICAgICAgICBXU0lDb25zdGFudHMuRUxFTV9DTEVBTlVQX1RJTUVPVVRfU0VDT05EUywKLSAgICAgICAgICAgICAgIlBhcmFtZXRlciB2YWx1ZSBjYW4ndCBiZSBuZWdhdGl2ZS4gRWxlbWVudCBuYW1lOiIpKTsKLSAgICAgICAgaXNDbGVhbnVwVGltZW91dFNlY29uZHNEZWZpbmUgPSB0cnVlOwotICAgICAgfQotCi0gICAgICAvLyA8bWFuSW5UaGVNaWRkbGU+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX01BTl9JTl9USEVfTUlERExFKSkKLSAgICAgIHsKLSAgICAgICAgTWFuSW5UaGVNaWRkbGUgbWFuSW5UaGVNaWRkbGUgPSBuZXcgTWFuSW5UaGVNaWRkbGVJbXBsKCk7Ci0gICAgICAgIG1vbml0b3JDb25maWcuc2V0TWFuSW5UaGVNaWRkbGUobWFuSW5UaGVNaWRkbGUpOwotICAgICAgICBwYXJzZU1hbkluVGhlTWlkZGxlRWxlbWVudChtYW5JblRoZU1pZGRsZSwgbmV4dEVsZW1lbnQpOwotICAgICAgfQotCi0gICAgICAvLyA8Y29tbWVudD4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fQ09NTUVOVCkpCi0gICAgICB7Ci0gICAgICAgIENvbW1lbnQgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotICAgICAgICBjb21tZW50LnNldFRleHQoWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgICBtb25pdG9yQ29uZmlnLnNldENvbW1lbnQoY29tbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gQUREOiBoYW5kbGUgaW52YWxpZCBlbGVtZW50cwotICAgICAgfQotCi0gICAgICAvLyBHZXQgbmV4dCBlbGVtZW50Ci0gICAgICBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKG5leHRFbGVtZW50KTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzTG9nRHVyYXRpb25EZWZpbmUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTAiLAotICAgICAgICAgIFdTSUNvbnN0YW50cy5FTEVNX0xPR19EVVJBVElPTiwKLSAgICAgICAgICAiRWxlbWVudCBpcyBtaXNzaW5nLiBFbGVtZW50IG5hbWU6IikpOwotICAgIH0KLSAgICBpZiAoIWlzQ2xlYW51cFRpbWVvdXRTZWNvbmRzRGVmaW5lKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgIGdldE1lc3NhZ2UoCi0gICAgICAgICAgImNvbmZpZzEwIiwKLSAgICAgICAgICBXU0lDb25zdGFudHMuRUxFTV9DTEVBTlVQX1RJTUVPVVRfU0VDT05EUywKLSAgICAgICAgICAiRWxlbWVudCBpcyBtaXNzaW5nLiBFbGVtZW50IG5hbWU6IikpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBsb2dGaWxlIGVsZW1lbnQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcGFyc2VMb2dGaWxlRWxlbWVudCgKLSAgICBNb25pdG9yQ29uZmlnIG1vbml0b3JDb25maWcsCi0gICAgRWxlbWVudCBlbGVtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCB0aGUgbG9jYXRpb24gYXR0cmlidXRlCi0gICAgbW9uaXRvckNvbmZpZy5zZXRMb2dMb2NhdGlvbigKLSAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIFdTSUNvbnN0YW50cy5BVFRSX0xPQ0FUSU9OKSk7Ci0KLSAgICAvLyBHZXQgdGhlIHJlcGxhY2UgYXR0cmlidXRlCi0gICAgbW9uaXRvckNvbmZpZy5zZXRSZXBsYWNlTG9nKAotICAgICAgWE1MVXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGVsZW1lbnQsIFdTSUNvbnN0YW50cy5BVFRSX1JFUExBQ0UsIGZhbHNlKSk7Ci0KLSAgICAvLyBHZXQgZmlyc3QgY2hpbGQgZWxlbWVudAotICAgIEVsZW1lbnQgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW1lbnQpOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICB3aGlsZSAobmV4dEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyA8YWRkU3R5bGVTaGVldD4KLSAgICAgIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0FERF9TVFlMRV9TSEVFVCkpCi0gICAgICB7Ci0gICAgICAgIEFkZFN0eWxlU2hlZXQgYWRkU3R5bGVTaGVldCA9IG5ldyBBZGRTdHlsZVNoZWV0SW1wbCgpOwotCi0gICAgICAgIC8vIFBhcnNlIHRoZSBlbGVtZW50ICAKLSAgICAgICAgVGVzdFV0aWxzLnBhcnNlQWRkU3R5bGVTaGVldCgKLSAgICAgICAgICBuZXh0RWxlbWVudCwKLSAgICAgICAgICBhZGRTdHlsZVNoZWV0LAotICAgICAgICAgIFdTSUNvbnN0YW50cy5ERUZBVUxUX0xPR19YU0wpOwotCi0gICAgICAgIC8vIFNldCBhZGQgc3R5bGUgc2hlZXQKLSAgICAgICAgbW9uaXRvckNvbmZpZy5zZXRBZGRTdHlsZVNoZWV0KGFkZFN0eWxlU2hlZXQpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIEFERDogaGFuZGxlIGludmFsaWQgZWxlbWVudHMKLSAgICAgIH0KLQotICAgICAgLy8gR2V0IG5leHQgZWxlbWVudAotICAgICAgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhuZXh0RWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIG1hbkludGhlTWlkZGxlIGVsZW1lbnQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcGFyc2VNYW5JblRoZU1pZGRsZUVsZW1lbnQoCi0gICAgTWFuSW5UaGVNaWRkbGUgbWFuSW5UaGVNaWRkbGUsCi0gICAgRWxlbWVudCBlbGVtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCBmaXJzdCBjaGlsZCBlbGVtZW50Ci0gICAgRWxlbWVudCBuZXh0RWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICAvLyBQcm9jZXNzIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIHdoaWxlIChuZXh0RWxlbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIDxyZWRpcmVjdD4KLSAgICAgIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1JFRElSRUNUKSkKLSAgICAgIHsKLSAgICAgICAgUmVkaXJlY3QgcmVkaXJlY3QgPSBuZXcgUmVkaXJlY3RJbXBsKCk7Ci0gICAgICAgIG1hbkluVGhlTWlkZGxlLmFkZFJlZGlyZWN0KHJlZGlyZWN0KTsKLSAgICAgICAgcGFyc2VSZWRpcmVjdEVsZW1lbnQocmVkaXJlY3QsIG5leHRFbGVtZW50KTsKLSAgICAgIH0KLQotICAgICAgLy8gPGNvbW1lbnQ+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0NPTU1FTlQpKQotICAgICAgewotICAgICAgICBDb21tZW50IGNvbW1lbnQgPSBuZXcgQ29tbWVudEltcGwoKTsKLSAgICAgICAgY29tbWVudC5zZXRUZXh0KFhNTFV0aWxzLmdldFRleHQobmV4dEVsZW1lbnQpKTsKLSAgICAgICAgbWFuSW5UaGVNaWRkbGUuc2V0Q29tbWVudChjb21tZW50KTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBBREQ6IGhhbmRsZSBpbnZhbGlkIGVsZW1lbnRzCi0gICAgICB9Ci0KLSAgICAgIC8vIEdldCBuZXh0IGVsZW1lbnQKLSAgICAgIG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcobmV4dEVsZW1lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSByZWRpcmVjdCBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHBhcnNlUmVkaXJlY3RFbGVtZW50KFJlZGlyZWN0IHJlZGlyZWN0LCBFbGVtZW50IGVsZW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IGZpcnN0IGNoaWxkIGVsZW1lbnQKLSAgICBFbGVtZW50IG5leHRFbGVtZW50ID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChlbGVtZW50KTsKLQotICAgIGJvb2xlYW4gaXNMaXN0ZW5Qb3J0RGVmaW5lID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpc1NjaGVtZUFuZEhvc3RQb3J0RGVmaW5lID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpc01heENvbm5lY3Rpb25zRGVmaW5lID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpc1JlYWRUaW1lb3V0U2Vjb25kc0RlZmluZSA9IGZhbHNlOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICB3aGlsZSAobmV4dEVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyA8bGlzdGVuUG9ydD4KLSAgICAgIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX0xJU1RFTl9QT1JUKSkKLSAgICAgIHsKLSAgICAgICAgcmVkaXJlY3Quc2V0TGlzdGVuUG9ydChnZXRJbnRWYWx1ZShuZXh0RWxlbWVudCkpOwotICAgICAgICBpc0xpc3RlblBvcnREZWZpbmUgPSB0cnVlOwotICAgICAgfQotCi0gICAgICAvLyA8c2NoZW1lQW5kSG9zdFBvcnQ+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1NDSEVNRV9BTkRfSE9TVFBPUlQpKQotICAgICAgewotICAgICAgICByZWRpcmVjdC5zZXRIb3N0KFhNTFV0aWxzLmdldFRleHQobmV4dEVsZW1lbnQpKTsKLSAgICAgICAgaXNTY2hlbWVBbmRIb3N0UG9ydERlZmluZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtYXhDb25uZWN0aW9ucz4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fTUFYX0NPTk5FQ1RJT05TKSkKLSAgICAgIHsKLSAgICAgICAgcmVkaXJlY3Quc2V0TWF4Q29ubmVjdGlvbnMoZ2V0SW50VmFsdWUobmV4dEVsZW1lbnQpKTsKLSAgICAgICAgaXNNYXhDb25uZWN0aW9uc0RlZmluZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxyZWFkVGltZW91dFNlY29uZHM+Ci0gICAgICBlbHNlIGlmIChpc0VsZW1lbnQobmV4dEVsZW1lbnQsIFdTSUNvbnN0YW50cy5FTEVNX1JFQURfVElNRU9VVF9TRUNPTkRTKSkKLSAgICAgIHsKLSAgICAgICAgcmVkaXJlY3Quc2V0UmVhZFRpbWVvdXRTZWNvbmRzKGdldEludFZhbHVlKG5leHRFbGVtZW50KSk7Ci0gICAgICAgIGlmIChyZWRpcmVjdC5nZXRSZWFkVGltZW91dFNlY29uZHMoKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgImNvbmZpZzA5IiwKLSAgICAgICAgICAgICAgV1NJQ29uc3RhbnRzLkVMRU1fUkVBRF9USU1FT1VUX1NFQ09ORFMsCi0gICAgICAgICAgICAgICJQYXJhbWV0ZXIgdmFsdWUgY2FuJ3QgYmUgbmVnYXRpdmUuIEVsZW1lbnQgbmFtZToiKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaXNSZWFkVGltZW91dFNlY29uZHNEZWZpbmUgPSB0cnVlOwotICAgICAgfQotCi0gICAgICAvLyA8Y29tbWVudD4KLSAgICAgIGVsc2UgaWYgKGlzRWxlbWVudChuZXh0RWxlbWVudCwgV1NJQ29uc3RhbnRzLkVMRU1fQ09NTUVOVCkpCi0gICAgICB7Ci0gICAgICAgIENvbW1lbnQgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotICAgICAgICBjb21tZW50LnNldFRleHQoWE1MVXRpbHMuZ2V0VGV4dChuZXh0RWxlbWVudCkpOwotICAgICAgICByZWRpcmVjdC5zZXRDb21tZW50KGNvbW1lbnQpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIEFERDogaGFuZGxlIGludmFsaWQgZWxlbWVudHMKLSAgICAgIH0KLQotICAgICAgLy8gR2V0IG5leHQgZWxlbWVudAotICAgICAgbmV4dEVsZW1lbnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhuZXh0RWxlbWVudCk7Ci0gICAgfQotCi0gICAgaWYgKCFpc0xpc3RlblBvcnREZWZpbmUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTAiLAotICAgICAgICAgIFdTSUNvbnN0YW50cy5FTEVNX0xJU1RFTl9QT1JULAotICAgICAgICAgICJFbGVtZW50IGlzIG1pc3NpbmcuIEVsZW1lbnQgbmFtZToiKSk7Ci0gICAgfQotICAgIGlmICghaXNTY2hlbWVBbmRIb3N0UG9ydERlZmluZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxMCIsCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkVMRU1fU0NIRU1FX0FORF9IT1NUUE9SVCwKLSAgICAgICAgICAiRWxlbWVudCBpcyBtaXNzaW5nLiBFbGVtZW50IG5hbWU6IikpOwotCi0gICAgfQotICAgIGlmICghaXNNYXhDb25uZWN0aW9uc0RlZmluZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICBnZXRNZXNzYWdlKAotICAgICAgICAgICJjb25maWcxMCIsCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkVMRU1fTUFYX0NPTk5FQ1RJT05TLAotICAgICAgICAgICJFbGVtZW50IGlzIG1pc3NpbmcuIEVsZW1lbnQgbmFtZToiKSk7Ci0gICAgfQotICAgIGlmICghaXNSZWFkVGltZW91dFNlY29uZHNEZWZpbmUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMTAiLAotICAgICAgICAgIFdTSUNvbnN0YW50cy5FTEVNX1JFQURfVElNRU9VVF9TRUNPTkRTLAotICAgICAgICAgICJFbGVtZW50IGlzIG1pc3NpbmcuIEVsZW1lbnQgbmFtZToiKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGlzIGVsZW1lbnQgbWF0Y2hlcyBzcGVjaWZpZWQgbG9jYWwgbmFtZSBpbiB0aGUgYW5hbHl6ZXIgY29uZmlnIG5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0VsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgcmV0dXJuIGlzRWxlbWVudCgKLSAgICAgIGVsZW1lbnQsCi0gICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRywKLSAgICAgIGxvY2FsTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoaXMgZWxlbWVudCBtYXRjaGVzIHNwZWNpZmllZCBsb2NhbCBuYW1lIGluIHRoZSBhbmFseXplciBjb25maWcgbmFtZXNwYWNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzRWxlbWVudCgKLSAgICBFbGVtZW50IGVsZW1lbnQsCi0gICAgU3RyaW5nIG5hbWVzcGFjZSwKLSAgICBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgcmV0dXJuIFhNTFV0aWxzLmlzRWxlbWVudChlbGVtZW50LCBuYW1lc3BhY2UsIGxvY2FsTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGVsZW1lbnQgdGV4dCBhcyBhbiBpbnQuCi0gICAqLwotICBwcml2YXRlIGludCBnZXRJbnRWYWx1ZShFbGVtZW50IGVsZW1lbnQpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGludCByZXR1cm5WYWx1ZTsKLSAgICBTdHJpbmcgaW50VmFsdWUgPSBudWxsOwotCi0gICAgLy8gR2V0IHZhbHVlIGFzIGEgc3RyaW5nCi0gICAgaWYgKChpbnRWYWx1ZSA9IFhNTFV0aWxzLmdldFRleHQoZWxlbWVudCkpID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgZ2V0TWVzc2FnZSgKLSAgICAgICAgICAiY29uZmlnMDQiLAotICAgICAgICAgIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkgKyAiRWxlbWVudCBtdXN0IGNvbnRhaW4gYW4gaW50ZWdlciB2YWx1ZToiKSk7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVyblZhbHVlID0gSW50ZWdlci52YWx1ZU9mKGludFZhbHVlKS5pbnRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBpbnQKLSAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG1lc3NhZ2UgZnJvbSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlSUQsIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIHJldHVybiBnZXRNZXNzYWdlKG1lc3NhZ2VJRCwgbnVsbCwgZGVmYXVsdE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBtZXNzYWdlIGZyb20gcmVzb3VyY2UgYnVuZGxlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZSgKLSAgICBTdHJpbmcgbWVzc2FnZUlELAotICAgIFN0cmluZyBtZXNzYWdlRGF0YSwKLSAgICBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICBTdHJpbmcgbWVzc2FnZSA9IGRlZmF1bHRNZXNzYWdlOwotICAgIGlmIChtZXNzYWdlTGlzdCAhPSBudWxsKQotICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VMaXN0LmdldE1lc3NhZ2UobWVzc2FnZUlELCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpOwotICAgIGVsc2UKLSAgICAgIG1lc3NhZ2UgKz0gIiAiICsgbWVzc2FnZURhdGEgKyAiLiI7Ci0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL21vbml0b3IvY29uZmlnL2ltcGwvUmVkaXJlY3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9SZWRpcmVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkMTY5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvbW9uaXRvci9jb25maWcvaW1wbC9SZWRpcmVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubW9uaXRvci5jb25maWcuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLm1vbml0b3IuY29uZmlnLlJlZGlyZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLS8qKgotICogIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbW9uaXRvciBjb25maWcgUmVkaXJlY3QgZWxlbWVudC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgUmVkaXJlY3RJbXBsIGltcGxlbWVudHMgUmVkaXJlY3QKLXsKLSAgLyoqCi0gICAqIENvbW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgQ29tbWVudCBjb21tZW50OwotCi0gIC8qKgotICAgKiBMaXN0ZW4gcG9ydC4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgbGlzdGVuUG9ydDsKLQotICAvKioKLSAgICogSG9zdC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaG9zdDsKLQotICAvKioKLSAgICogVG8gcHJvdG9jb2wuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHRvUHJvdG9jb2w7Ci0KLSAgLyoqCi0gICAqIFRvIHBvcnQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IHRvUG9ydDsKLQotICAvKioKLSAgICogVG8gaG9zdC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdG9Ib3N0OwotCi0gIC8qKgotICAgKiBNYXhpbXVtIGNvbm5lY3Rpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBtYXhDb25uZWN0aW9uczsKLQotICAvKioKLSAgICogUmVhZCB0aW1lb3V0IHNlY29uZHMuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50IHJlYWRUaW1lb3V0U2Vjb25kczsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLlJlZGlyZWN0I2dldENvbW1lbnQoKQotICAgKi8KLSAgcHVibGljIENvbW1lbnQgZ2V0Q29tbWVudCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5jb21tZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNzZXRDb21tZW50KGNvbW1lbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KENvbW1lbnQgY29tbWVudCkKLSAgewotICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLlJlZGlyZWN0I2dldExpc3RlblBvcnQoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRMaXN0ZW5Qb3J0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmxpc3RlblBvcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLlJlZGlyZWN0I3NldExpc3RlblBvcnQoaW50KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TGlzdGVuUG9ydChpbnQgbGlzdGVuUG9ydCkKLSAgewotICAgIHRoaXMubGlzdGVuUG9ydCA9IGxpc3RlblBvcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLlJlZGlyZWN0I2dldEhvc3QoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRIb3N0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmhvc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLlJlZGlyZWN0I3NldEhvc3QoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCkKLSAgewotICAgIHRoaXMuaG9zdCA9IGhvc3Q7Ci0KLSAgICAvLyBQYXJzZSBsb2NhdGlvbiB0byBnZXQgcHJvdG9jb2wsIGhvc3QgYW5kIHBvcnQKLSAgICBVUkwgdXJsOwotICAgIHRyeQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwoaG9zdCk7Ci0gICAgICB0aGlzLnRvUHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKTsKLSAgICAgIHRoaXMudG9Ib3N0ID0gdXJsLmdldEhvc3QoKTsKLSAgICAgIHRoaXMudG9Qb3J0ID0gdXJsLmdldFBvcnQoKTsKLSAgICAgIGlmICh0aGlzLnRvUG9ydCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHRoaXMudG9Qcm90b2NvbC5lcXVhbHNJZ25vcmVDYXNlKCJodHRwIikpCi0gICAgICAgICAgdGhpcy50b1BvcnQgPSA4MDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHRoaXMudG9Qb3J0ID0gODA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgIlRoZSAiCi0gICAgICAgICAgKyBXU0lDb25zdGFudHMuRUxFTV9TQ0hFTUVfQU5EX0hPU1RQT1JUCi0gICAgICAgICAgKyAiIG9wdGlvbiBjb250YWlucyBhbiBpbnZhbGlkIHZhbHVlOiAiCi0gICAgICAgICAgKyBob3N0KTsKLSAgICB9Ci0KLSAgICBpZiAoKHVybC5nZXRQYXRoKCkgIT0gbnVsbCAmJiAhdXJsLmdldFBhdGgoKS5lcXVhbHMoIiIpKQotICAgICAgfHwgKHVybC5nZXRRdWVyeSgpICE9IG51bGwgJiYgIXVybC5nZXRRdWVyeSgpLmVxdWFscygiIikpKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgIlRoZSAiCi0gICAgICAgICAgKyBXU0lDb25zdGFudHMuRUxFTV9TQ0hFTUVfQU5EX0hPU1RQT1JUCi0gICAgICAgICAgKyAiIG9wdGlvbiBtdXN0IGNvbnRhaW4gb25seSBhIHNjaGVtZSwgaG9zdCBhbmQgcG9ydDogIgotICAgICAgICAgICsgaG9zdCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRvIHBvcnQuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNnZXRUb1BvcnQoKQotICAgKi8KLSAgcHVibGljIGludCBnZXRUb1BvcnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudG9Qb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0byBob3N0LgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kubW9uaXRvci5jb25maWcuUmVkaXJlY3QjZ2V0VG9Ib3N0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VG9Ib3N0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnRvSG9zdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdG8gcHJvdG9jb2wuCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNnZXRUb1Byb3RvY29sKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VG9Qcm90b2NvbCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50b1Byb3RvY29sOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNnZXRNYXhDb25uZWN0aW9ucygpCi0gICAqLwotICBwdWJsaWMgaW50IGdldE1heENvbm5lY3Rpb25zKCkKLSAgewotICAgIHJldHVybiB0aGlzLm1heENvbm5lY3Rpb25zOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5tb25pdG9yLmNvbmZpZy5SZWRpcmVjdCNzZXRNYXhDb25uZWN0aW9ucyhpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRNYXhDb25uZWN0aW9ucyhpbnQgbWF4Q29ubmVjdGlvbnMpCi0gIHsKLSAgICB0aGlzLm1heENvbm5lY3Rpb25zID0gbWF4Q29ubmVjdGlvbnM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLlJlZGlyZWN0I2dldFJlYWRUaW1lb3V0U2Vjb25kcygpCi0gICAqLwotICBwdWJsaWMgaW50IGdldFJlYWRUaW1lb3V0U2Vjb25kcygpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZWFkVGltZW91dFNlY29uZHM7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0Lm1vbml0b3IuY29uZmlnLlJlZGlyZWN0I3NldFJlYWRUaW1lb3V0U2Vjb25kcyhpbnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWFkVGltZW91dFNlY29uZHMoaW50IHJlYWRUaW1lb3V0U2Vjb25kcykKLSAgewotICAgIHRoaXMucmVhZFRpbWVvdXRTZWNvbmRzID0gcmVhZFRpbWVvdXRTZWNvbmRzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBwdy5wcmludGxuKCIgICAgY29tbWVudCAuLi4uLi4uLi4uLi4uLi4uLi4uICIgKyB0aGlzLmNvbW1lbnQpOwotICAgIHB3LnByaW50bG4oIiAgICBsaXN0ZW5Qb3J0IC4uLi4uLi4uLi4uLi4uLi4gIiArIHRoaXMubGlzdGVuUG9ydCk7Ci0gICAgcHcucHJpbnRsbigiICAgIGhvc3QgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAiICsgY3V0SG9zdCh0aGlzLmhvc3QpKTsKLSAgICBwdy5wcmludGxuKCIgICAgbWF4Q29ubmVjdGlvbnMgLi4uLi4uLi4uLi4uICIgKyB0aGlzLm1heENvbm5lY3Rpb25zKTsKLSAgICBwdy5wcmludGxuKCIgICAgcmVhZFRpbWVvdXRTZWNvbmRzIC4uLi4uLi4uICIgKyB0aGlzLnJlYWRUaW1lb3V0U2Vjb25kcyk7Ci0KLSAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBGb3JtYXRzIGhvc3QgbmFtZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gKHBhdGggaXMgb21taXRlZCkuCi0gICAqIEBwYXJhbSBob3N0Ci0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGN1dEhvc3QoU3RyaW5nIGhvc3QpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBVUkwgdXJsID0gbmV3IFVSTChob3N0KTsKLSAgICAgIFN0cmluZyBwb3J0ID0gdXJsLmdldFBvcnQoKSA+IC0xID8gU3RyaW5nLnZhbHVlT2YodXJsLmdldFBvcnQoKSkgOiAiODAiOwotICAgICAgLy8gUkVNT1ZFRDogVGhpcyBjb2RlIG9ubHkgd29ya3Mgb24gMS40Ci0gICAgICAvLyBTdHJpbmcudmFsdWVPZih1cmwuZ2V0RGVmYXVsdFBvcnQoKSk7Ci0gICAgICByZXR1cm4gdXJsLmdldFByb3RvY29sKCkgKyAiOi8vIiArIHVybC5nZXRIb3N0KCkgKyAiOiIgKyBwb3J0OwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIGhvc3Q7Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gU3RhcnQgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9SRURJUkVDVCArICI+Iik7Ci0KLSAgICAvLyBDb21tZW50Ci0gICAgaWYgKHRoaXMuY29tbWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50bG4odGhpcy5jb21tZW50LnRvWE1MU3RyaW5nKG5zTmFtZSkpOwotICAgIH0KLQotICAgIC8vIGxpc3RlblBvcnQKLSAgICBwdy5wcmludCgiICAgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTElTVEVOX1BPUlQgKyAiPiIpOwotICAgIHB3LnByaW50KGdldExpc3RlblBvcnQoKSk7Ci0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTElTVEVOX1BPUlQgKyAiPiIpOwotCi0gICAgLy8gc2NoZW1lQW5kSG9zdFBvcnQKLSAgICBwdy5wcmludCgKLSAgICAgICIgICAgICAgICAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9TQ0hFTUVfQU5EX0hPU1RQT1JUICsgIj4iKTsKLSAgICBwdy5wcmludChYTUxVdGlscy54bWxFc2NhcGVkU3RyaW5nKGdldEhvc3QoKSkpOwotICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1NDSEVNRV9BTkRfSE9TVFBPUlQgKyAiPiIpOwotCi0gICAgLy8gbWF4Q29ubmVjdGlvbnMKLSAgICBwdy5wcmludCgiICAgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fTUFYX0NPTk5FQ1RJT05TICsgIj4iKTsKLSAgICBwdy5wcmludChnZXRNYXhDb25uZWN0aW9ucygpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9NQVhfQ09OTkVDVElPTlMgKyAiPiIpOwotCi0gICAgLy8gcmVhZFRpbWVvdXRTZWNvbmRzCi0gICAgcHcucHJpbnQoCi0gICAgICAiICAgICAgICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fUkVBRF9USU1FT1VUX1NFQ09ORFMgKyAiPiIpOwotICAgIHB3LnByaW50KGdldFJlYWRUaW1lb3V0U2Vjb25kcygpKTsKLSAgICBwdy5wcmludGxuKCI8LyIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9SRUFEX1RJTUVPVVRfU0VDT05EUyArICI+Iik7Ci0KLSAgICAvLyBFbmQgRWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICAgICAgPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fUkVESVJFQ1QgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvRW50cnlUeXBlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvRW50cnlUeXBlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhkMTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL0VudHJ5VHlwZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1haW50YWluIGEgcHJvZmlsZSBFbnRyeVR5cGVMaXN0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudHJ5VHlwZUxpc3QgZXh0ZW5kcyBEb2N1bWVudEVsZW1lbnQKLXsKLSAgLyoqCi0gICAqIExvZyBpbnB1dC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19JTlBVVF9OT05FID0gIm5vbmUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfSU5QVVRfUkVRVUVTVCA9ICJyZXF1ZXN0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0lOUFVUX1JFU1BPTlNFID0gInJlc3BvbnNlIjsKLQotICAvKioKLSAgICogV1NETCBpbnB1dC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfSU5QVVRfTk9ORSA9ICJub25lIjsKLQotICAvKioKLSAgICogVURESSBpbnB1dC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVERElfSU5QVVRfTk9ORSA9ICJub25lIjsKLQotICAvKioKLSAgICogR2V0IGxvZyBpbnB1dC4KLSAgICogQHJldHVybiBsb2cgaW5wdXQuCi0gICAqIEBzZWUgI3NldExvZ0lucHV0Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvZ0lucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBsb2cgaW5wdXQuCi0gICAqIEBwYXJhbSBsb2dJbnB1dCBsb2cgaW5wdXQuCi0gICAqIEBzZWUgI2dldExvZ0lucHV0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2dJbnB1dChTdHJpbmcgbG9nSW5wdXQpOwotCi0gIC8qKgotICAgKiBHZXQgV1NETCBpbnB1dC4KLSAgICogQHJldHVybiBXU0RMIGlucHV0LgotICAgKiBAc2VlICNzZXRXU0RMSW5wdXQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETElucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIGlucHV0LgotICAgKiBAcGFyYW0gd3NkbElucHV0IFdTREwgaW5wdXQuCi0gICAqIEBzZWUgI2dldFdTRExJbnB1dAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0V1NETElucHV0KFN0cmluZyB3c2RsSW5wdXQpOwotCi0gIC8qKgotICAgKiBHZXQgVURESSBpbnB1dC4KLSAgICogQHJldHVybiBVRERJIGlucHV0LgotICAgKiBAc2VlICNzZXRVRERJSW5wdXQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VURESUlucHV0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBVRERJIGlucHV0LgotICAgKiBAcGFyYW0gdWRkaUlucHV0IFVEREkgaW5wdXQuCi0gICAqIEBzZWUgI2dldFVERElJbnB1dAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VURESUlucHV0KFN0cmluZyB1ZGRpSW5wdXQpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9Qcm9maWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9Qcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzI2YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gbWFpbnRhaW4gUHJvZmlsZSBpbmZvcm1hdGlvbi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9maWxlIGV4dGVuZHMgRG9jdW1lbnRFbGVtZW50Ci17Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL1Byb2ZpbGVBcnRpZmFjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZUFydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzRmMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZUFydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkFydGlmYWN0VHlwZTsKLQotLyoqCi0gKiBBbiBhcnRpZmFjdCBjb250YWlucyBhIHNldCBvZiByZWxhdGVkIHRlc3QgYXNzZXJ0aW9ucy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2ZpbGVBcnRpZmFjdCBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fQVJUSUZBQ1Q7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FTU0VSVElPTlMsIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIEdldCB0eXBlLgotICAgKiBAcmV0dXJuIGFydGlmYWN0IHR5cGUuCi0gICAqIEBzZWUgI3NldFR5cGUKLSAgICovCi0gIHB1YmxpYyBBcnRpZmFjdFR5cGUgZ2V0VHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXQgdHlwZS4KLSAgICogQHBhcmFtIHR5cGUgYW4gYXJ0aWZhY3QgdHlwZS4KLSAgICogQHNlZSAjZ2V0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShBcnRpZmFjdFR5cGUgdHlwZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBzcGVjaWZpY2F0aW9uIGxpc3QuCi0gICAqIEByZXR1cm4gc3BlY2lmaWNhdGlvbiBsaXN0LgotICAgKiBAc2VlICNzZXRTcGVjaWZpY2F0aW9uTGlzdAotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRTcGVjaWZpY2F0aW9uTGlzdCgpOwotCi0gIC8qKgotICAgKiBTZXQgc3BlY2lmaWNhdGlvbiBsaXN0LgotICAgKiBAcGFyYW0gc3BlY2lmaWNhdGlvbkxpc3Qgc3BlY2lmaWNhdGlvbiBsaXN0LgotICAgKiBAc2VlICNnZXRTcGVjaWZpY2F0aW9uTGlzdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U3BlY2lmaWNhdGlvbkxpc3QoVmVjdG9yIHNwZWNpZmljYXRpb25MaXN0KTsKLQotICAvKioKLSAgICogR2V0IHRlc3QgYXNzZXJ0aW9uIGxpc3QuCi0gICAqIEByZXR1cm4gdGVzdCBhc3NlcnRpb24gbGlzdC4KLSAgICovCi0gIHB1YmxpYyBMaW5rZWRMaXN0IGdldFRlc3RBc3NlcnRpb25MaXN0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIGlkIHRlc3QgYXNzZXJ0aW9uIGlkLgotICAgKiBAcmV0dXJuIHRlc3QgYXNzZXJ0aW9uLgotICAgKi8KLSAgcHVibGljIFRlc3RBc3NlcnRpb24gZ2V0VGVzdEFzc2VydGlvbihTdHJpbmcgaWQpOwotCi0gIC8qKgotICAgKiBBZGQgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBwYXJhbSB0ZXN0QXNzZXJ0aW9uIHRlc3QgYXNzZXJ0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVGVzdEFzc2VydGlvbihUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZUFzc2VydGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL1Byb2ZpbGVBc3NlcnRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjc3NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZUFzc2VydGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgbWFpbnRhaW5zIHByb2ZpbGUgYXNzZXJ0aW9ucy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9maWxlQXNzZXJ0aW9ucyBleHRlbmRzIFdTSURvY3VtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9QUk9GSUxFX0FTU0VSVElPTlM7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FTU0VSVElPTlMsIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIEdldCBsaXN0IG9mIHByb2ZpbGVzLgotICAgKiBAcmV0dXJuIGxpc3Qgb2YgcHJvZmlsZXMuCi0gICAqIEBzZWUgI3NldFByb2ZpbGVMaXN0Ci0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFByb2ZpbGVMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBsaXN0IG9mIHByb2ZpbGVzLgotICAgKiBAcGFyYW0gcHJvZmlsZUxpc3QgbGlzdCBvZiBwcm9maWxlcy4KLSAgICogQHNlZSAjZ2V0UHJvZmlsZUxpc3QKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2ZpbGVMaXN0KFZlY3RvciBwcm9maWxlTGlzdCk7Ci0KLSAgLyoqCi0gICAqIEFkZCBwcm9maWxlLgotICAgKiBAcGFyYW0gcHJvZmlsZSBwcm9maWxlLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUHJvZmlsZShQcm9maWxlIHByb2ZpbGUpOwotCi0gIC8qKgotICAgKiBHZXQgbGlzdCBvZiBhcnRpZmFjdHMuCi0gICAqIEByZXR1cm4gbGlzdCBvZiBhcnRpZmFjdHMuCi0gICAqIEBzZWUgI3NldEFydGlmYWN0TGlzdAotICAgKi8KLSAgcHVibGljIFRyZWVNYXAgZ2V0QXJ0aWZhY3RMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHR5cGUgYW4gYXJ0aWZhY3QgdHlwZS4KLSAgICogQHJldHVybiBhIHByb2ZpbGUgYXJ0aWZhY3QgYmFzZWQgb24gdGhlIGdpdmVuIHR5cGUuCi0gICAqLwotICBwdWJsaWMgUHJvZmlsZUFydGlmYWN0IGdldEFydGlmYWN0KFN0cmluZyB0eXBlKTsKLQotICAvKioKLSAgICogU2V0IGxpc3Qgb2YgYXJ0aWZhY3RzLgotICAgKiBAcGFyYW0gYXJ0aWZhY3RMaXN0IGEgbGlzdCBwZiBwcm9maWxlIGFydGlmaWFjdHMuCi0gICAqIEBzZWUgI2dldEFydGlmYWN0TGlzdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RMaXN0KFRyZWVNYXAgYXJ0aWZhY3RMaXN0KTsKLQotICAvKioKLSAgICogQWRkIGFydGlmYWN0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3QgcHJvZmlsZSBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFydGlmYWN0KFByb2ZpbGVBcnRpZmFjdCBhcnRpZmFjdCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIGlkIHRlc3QgYXNzZXJ0aW9uIGlkLgotICAgKiBAcmV0dXJuIHRlc3QgYXNzZXJ0aW9uLgotICAgKi8KLSAgcHVibGljIFRlc3RBc3NlcnRpb24gZ2V0VGVzdEFzc2VydGlvbihTdHJpbmcgaWQpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYXJ0aWZhY3QuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBwcm9maWxlIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIFByb2ZpbGVBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC4gCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRBRE5hbWUoKTsKLQotICAvKioKLSAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uIGRvY3VtZW50LgotICAgKiBAcGFyYW0gZG9jdW1lbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRBRE5hbWUoU3RyaW5nIGRvY3VtZW50TmFtZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIHByb2ZpbGUgdGVzdCBhc3NlcnRpb24gZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUQURWZXJzaW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvZmlsZSB0ZXN0IGFzc2VydGlvbiBkb2N1bWVudC4KLSAgICogQHBhcmFtIGRvY3VtZW50VmVyc2lvbiB0aGUgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUQURWZXJzaW9uKFN0cmluZyBkb2N1bWVudFZlcnNpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZUFzc2VydGlvbnNSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL1Byb2ZpbGVBc3NlcnRpb25zUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjBhM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvUHJvZmlsZUFzc2VydGlvbnNSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgdXNlZCB0byByZWFkIGEgcHJvZmlsZSBhc3NlcnRpb25zIGRvY3VtZW50cy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2ZpbGVBc3NlcnRpb25zUmVhZGVyIGV4dGVuZHMgRG9jdW1lbnRSZWFkZXIKLXsKLSAgLyoqCi0gICAqIFJlYWQgdGhlIHByb2ZpbGUgYXNzZXJ0aW9ucyBmaWxlLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uc1VSSSBoZSBwcm9maWxlIGFzc2VydGlvbnMgZmlsZSBsb2NhdGlvbi4KLSAgICogQHJldHVybiB0aGUgUHJvZmlsZUFzc2VydGlvbnMgb2JqZWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIG9jY3VyIHdoaWxlIHJlYWRpbmcgdGhlIGZpbGUuCi0gICAqLwotICBwdWJsaWMgUHJvZmlsZUFzc2VydGlvbnMgcmVhZFByb2ZpbGVBc3NlcnRpb25zKFN0cmluZyBhc3NlcnRpb25zVVJJKQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIHByb2ZpbGUgYXNzZXJ0aW9ucyAgZmlsZS4KLSAgICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0gICAqIEByZXR1cm4gdGhlIFByb2ZpbGVBc3NlcnRpb25zIG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gIGlmIHByb2JsZW0gb2NjdXIgd2hpbGUgcmVhZGluZyB0aGUgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXNzZXJ0aW9ucyByZWFkUHJvZmlsZUFzc2VydGlvbnMoUmVhZGVyIHJlYWRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvVGVzdEFzc2VydGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvVGVzdEFzc2VydGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjUzNDc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL1Rlc3RBc3NlcnRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8qKgotICogQSB0ZXN0IGFzc2VydGlvbiBpcyBvbmUgYXNzZXJ0aW9uIGluIGEgcHJvZmlsZSBkZWZpbml0aW9uLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXN0QXNzZXJ0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU5GT1JNQVRJT05BTCA9ICJpbmZvcm1hdGlvbmFsIjsKLSAgCi0gIC8qKgotICAgKiBHZXQgdGVzdCBhc3NlcnRpb24gaWQuCi0gICAqIEByZXR1cm4gdGVzdCBhc3NlcnRpb24gaWQuCi0gICAqIEBzZWUgI3NldElkCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0ZXN0IGFzc2VydGlvbiBpZC4KLSAgICogQHBhcmFtIGlkIHRlc3QgYXNzZXJ0aW9uIGlkLgotICAgKiBAc2VlICNnZXRJZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLQotICAvKioKLSAgICogR2V0IHRlc3QgYXNzZXJ0aW9uIHR5cGUuCi0gICAqIEByZXR1cm4gdGVzdCBhc3NlcnRpb24gdHlwZS4KLSAgICogQHNlZSAjc2V0VHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0ZXN0IGFzc2VydGlvbiB0eXBlLgotICAgKiBAcGFyYW0gIHR5cGUgdGVzdCBhc3NlcnRpb24gdHlwZS4KLSAgICogQHNlZSAjZ2V0VHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0KLSAgLyoqCi0gICAqIEdldCB0ZXN0IGFzc2VydGlvbiBwcmltYXJ5IGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHJldHVybiB0ZXN0IGFzc2VydGlvbiBwcmltYXJ5IGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHNlZSAjc2V0RW50cnlUeXBlTmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbnRyeVR5cGVOYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0ZXN0IGFzc2VydGlvbiBwcmltYXJ5IGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHBhcmFtIGVudHJ5VHlwZU5hbWUgdGVzdCBhc3NlcnRpb24gcHJpbWFyeSBlbnRyeSB0eXBlIG5hbWUuCi0gICAqIEBzZWUgI2dldEVudHJ5VHlwZU5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZU5hbWUoU3RyaW5nIGVudHJ5VHlwZU5hbWUpOwotCi0gIC8qKgotICAgKiBHZXQgZW5hYmxlZCBpbmRpY2F0b3IuCi0gICAqIEByZXR1cm4gZW5hYmxlZCBpbmRpY2F0b3IuCi0gICAqIEBzZWUgI3NldEVuYWJsZWQKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpOwotCi0gIC8qKgotICAgKiBTZXQgIGVuYWJsZWQgaW5kaWNhdG9yLgotICAgKiBAcGFyYW0gZW5hYmxlZCBlbmFibGVkIGluZGljYXRvci4KLSAgICogQHNlZSAjaXNFbmFibGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7Ci0KLSAgLyoqCi0gICAqIEdldCBjb250ZXh0LgotICAgKiBAcmV0dXJuIGNvbnRleHQuCi0gICAqIEBzZWUgI3NldENvbnRleHQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpOwotCi0gIC8qKgotICAgKiBTZXQgY29udGV4dC4KLSAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dC4KLSAgICogQHNlZSAjZ2V0Q29udGV4dAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgY29udGV4dCk7Ci0KLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24gZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gYXNzZXJ0aW9uIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNzZXRBc3NlcnRpb25EZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBc3NlcnRpb25EZXNjcmlwdGlvbigpOwotCi0gIC8qKgotICAgKiBTZXQgYXNzZXJ0aW9uIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uRGVzY3JpcHRpb24gYXNzZXJ0aW9uIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNnZXRBc3NlcnRpb25EZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uRGVzY3JpcHRpb24oU3RyaW5nIGFzc2VydGlvbkRlc2NyaXB0aW9uKTsKLQotICAvKioKLSAgICogR2V0IGZhaWx1cmUgbWVzc2FnZS4KLSAgICogQHJldHVybiBmYWlsdXJlIG1lc3NhZ2UuCi0gICAqIEBzZWUgI3NldEZhaWx1cmVNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhaWx1cmVNZXNzYWdlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBmYWlsdXJlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmYWlsdXJlTWVzc2FnZSBmYWlsdXJlIG1lc3NhZ2UuCi0gICAqIEBzZWUgI2dldEZhaWx1cmVNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlTWVzc2FnZShTdHJpbmcgZmFpbHVyZU1lc3NhZ2UpOwotCi0gIC8qKgotICAgKiBHZXQgZmFpbHVyZSBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gZmFpbHVyZSBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEBzZWUgI3NldEZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24oKTsKLQotICAvKioKLSAgICogU2V0IGZhaWx1cmUgZGV0YWlsIGRlc2NyaXB0aW9uLgotICAgKiBAcGFyYW0gZmFpbHVyZURldGFpbERlc2NyaXB0aW9uIGZhaWx1cmUgZGV0YWlsIGRlc2NyaXB0aW9uLgotICAgKiBAc2VlICNnZXRGYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbihTdHJpbmcgZmFpbHVyZURldGFpbERlc2NyaXB0aW9uKTsKLQotICAvKioKLSAgICogR2V0IGRldGFpbCBkZXNjcmlwdGlvbi4KLSAgICogQHJldHVybiBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEBzZWUgI3NldERldGFpbERlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERldGFpbERlc2NyaXB0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBkZXRhaWxEZXNjcmlwdGlvbiBkZXRhaWwgZGVzY3JpcHRpb24uCi0gICAqIEBzZWUgI2dldERldGFpbERlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXRhaWxEZXNjcmlwdGlvbihTdHJpbmcgZGV0YWlsRGVzY3JpcHRpb24pOwotCi0gIC8qKgotICAgKiBHZXQgYWRkaXRpb25hbCBlbnRyeSB0eXBlIGxpc3QuCi0gICAqIEByZXR1cm4gYWRkaXRpb25hbCBlbnRyeSB0eXBlIGxpc3QuCi0gICAqIEBzZWUgI3NldEFkZGl0aW9uYWxFbnRyeVR5cGVMaXN0Ci0gICAqLwotICBwdWJsaWMgRW50cnlUeXBlTGlzdCBnZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdCgpOwotCi0gIC8qKgotICAgKiBTZXQgYWRkaXRpb25hbCBlbnRyeSB0eXBlIGxpc3QuCi0gICAqIEBwYXJhbSBlbnRyeVR5cGVMaXN0IGFkZGl0aW9uYWwgZW50cnkgdHlwZSBsaXN0LgotICAgKiBAc2VlICNnZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEVudHJ5VHlwZUxpc3QoRW50cnlUeXBlTGlzdCBlbnRyeVR5cGVMaXN0KTsKLQotICAvKioKLSAgICogR2V0IGxpc3Qgb2YgcHJlcmVxIGlkcy4KLSAgICogQHJldHVybiBsaXN0IG9mIHByZXJlcSBpZHMuCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFByZXJlcUlkTGlzdCgpOwotCi0gIC8qKgotICAgKiBBZGQgcHJlcmVxIHRlc3QgYXNzZXJ0aW9uIGlkLgotICAgKiBAcGFyYW0gIHByZXJlcUlkIHByZXJlcSB0ZXN0IGFzc2VydGlvbiBpZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFByZXJlcUlkKFN0cmluZyBwcmVyZXFJZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9pbXBsL0VudHJ5VHlwZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9pbXBsL0VudHJ5VHlwZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkODFmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9FbnRyeVR5cGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLkVudHJ5VHlwZUxpc3Q7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIG1haW50YWluIGEgcHJvZmlsZSBFbnRyeVR5cGVMaXN0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgRW50cnlUeXBlTGlzdEltcGwgaW1wbGVtZW50cyBFbnRyeVR5cGVMaXN0Ci17Ci0gIC8qKgotICAgKiBMb2cgaW5wdXQuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGxvZ0lucHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogV1NETCBpbnB1dC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgd3NkbElucHV0ID0gbnVsbDsKLQotICAvKioKLSAgICogVURESSBpbnB1dC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdWRkaUlucHV0ID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuRW50cnlUeXBlTGlzdCNnZXRMb2dJbnB1dCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvZ0lucHV0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmxvZ0lucHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLkVudHJ5VHlwZUxpc3Qjc2V0TG9nSW5wdXQoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9nSW5wdXQoU3RyaW5nIGxvZ0lucHV0KQotICB7Ci0gICAgdGhpcy5sb2dJbnB1dCA9IGxvZ0lucHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLkVudHJ5VHlwZUxpc3QjZ2V0V1NETElucHV0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0V1NETElucHV0KCkKLSAgewotICAgIHJldHVybiB0aGlzLndzZGxJbnB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5FbnRyeVR5cGVMaXN0I3NldFdTRExJbnB1dChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRXU0RMSW5wdXQoU3RyaW5nIHdzZGxJbnB1dCkKLSAgewotICAgIHRoaXMud3NkbElucHV0ID0gd3NkbElucHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLkVudHJ5VHlwZUxpc3QjZ2V0VURESUlucHV0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VURESUlucHV0KCkKLSAgewotICAgIHJldHVybiB0aGlzLnVkZGlJbnB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5FbnRyeVR5cGVMaXN0I3NldFVERElJbnB1dChTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVRERJSW5wdXQoU3RyaW5nIHVkZGlJbnB1dCkKLSAgewotICAgIHRoaXMudWRkaUlucHV0ID0gdWRkaUlucHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL2ltcGwvUHJvZmlsZUFydGlmYWN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXJ0aWZhY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YWIzYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXJ0aWZhY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkFydGlmYWN0VHlwZTsKLQotLyoqCi0gKiBBbiBhcnRpZmFjdCBjb250YWlucyBhIHNldCBvZiByZWxhdGVkIHRlc3QgYXNzZXJ0aW9ucy4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVBcnRpZmFjdEltcGwgaW1wbGVtZW50cyBQcm9maWxlQXJ0aWZhY3QKLXsKLSAgLyoqCi0gICAqIEFydGlmYWN0IHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgQXJ0aWZhY3RUeXBlIHR5cGU7Ci0KLSAgLyoqCi0gICAqIFRlc3QgYXNzZXJ0aW9uIG1hcC4KLSAgICovCi0gIHByb3RlY3RlZCBUcmVlTWFwIHRlc3RBc3NlcnRpb25NYXAgPSBuZXcgVHJlZU1hcCgpOwotCi0gIC8qKgotICAgKiBUZXN0IGFzc2VydGlvbiBsaXN0LgotICAgKi8KLSAgcHJvdGVjdGVkIExpbmtlZExpc3QgdGVzdEFzc2VydGlvbkxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNnZXRUeXBlKCkKLSAgICovCi0gIHB1YmxpYyBBcnRpZmFjdFR5cGUgZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50eXBlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlJlcG9ydEFydGlmYWN0I3NldFR5cGUoQXJ0aWZhY3RUeXBlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShBcnRpZmFjdFR5cGUgdHlwZSkKLSAgewotICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuUmVwb3J0QXJ0aWZhY3QjZ2V0U3BlY2lmaWNhdGlvbkxpc3QoKQotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRTcGVjaWZpY2F0aW9uTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNzZXRTcGVjaWZpY2F0aW9uTGlzdChWZWN0b3IpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTcGVjaWZpY2F0aW9uTGlzdChWZWN0b3Igc3BlY2lmaWNhdGlvbkxpc3QpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNnZXRUZXN0QXNzZXJ0aW9uTGlzdCgpCi0gICAqLwotICBwdWJsaWMgTGlua2VkTGlzdCBnZXRUZXN0QXNzZXJ0aW9uTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50ZXN0QXNzZXJ0aW9uTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNnZXRUZXN0QXNzZXJ0aW9uKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBUZXN0QXNzZXJ0aW9uIGdldFRlc3RBc3NlcnRpb24oU3RyaW5nIGlkKQotICB7Ci0gICAgcmV0dXJuIChUZXN0QXNzZXJ0aW9uKSB0aGlzLnRlc3RBc3NlcnRpb25NYXAuZ2V0KGlkKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5SZXBvcnRBcnRpZmFjdCNhZGRUZXN0QXNzZXJ0aW9uKFRlc3RBc3NlcnRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRUZXN0QXNzZXJ0aW9uKFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbikKLSAgewotICAgIC8vIEFERDogTmVlZCB0byBtZXJnZSB0aGUgbGlzdCBhbmQgbWFwCi0gICAgdGhpcy50ZXN0QXNzZXJ0aW9uTWFwLnB1dCh0ZXN0QXNzZXJ0aW9uLmdldElkKCksIHRlc3RBc3NlcnRpb24pOwotICAgIHRoaXMudGVzdEFzc2VydGlvbkxpc3QuYWRkKHRlc3RBc3NlcnRpb24pOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gUmVwb3J0QXJ0aWZhY3QKLSAgICBwdy5wcmludGxuKCIgICAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICBwdy5wcmludGxuKCIgICAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXNzZXJ0aW9uc0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL2ltcGwvUHJvZmlsZUFzc2VydGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjODE0MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9Qcm9maWxlQXNzZXJ0aW9uc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgLi4uCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9maWxlQXNzZXJ0aW9uc0ltcGwgaW1wbGVtZW50cyBQcm9maWxlQXNzZXJ0aW9ucwotewotICAvKioKLSAgICogTG9jYXRpb24gb2YgdGhlIHByb2ZpbGUgZGVmaW5pdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZG9jdW1lbnRVUkk7Ci0KLSAgLyoqCi0gICAqIE5hbWUgb2YgdGhlIHByb2ZpbGUgdGVzdCBhc3NlcnRpb24gZG9jdW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGRvY3VtZW50TmFtZTsKLQotICAvKioKLSAgICogVmVyc2lvbiBvZiB0aGUgcHJvZmlsZSB0ZXN0IGFzc2VydGlvbiBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZG9jdW1lbnRWZXJzaW9uOwotCi0gIC8vIEFERDogQSBwcm9maWxlIGRlZmluaXRpb24gc2hvdWxkIGFsc28gaGF2ZSBhIGRlc2NyaXB0aW9uLgotCi0gIC8qKgotICAgKiBMaXN0IG9mIHByb2ZpbGVzLgotICAgKi8KLSAgVmVjdG9yIHByb2ZpbGVMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIGFydGlmYWN0cy4KLSAgICovCi0gIFRyZWVNYXAgYXJ0aWZhY3RMaXN0ID0gbmV3IFRyZWVNYXAoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnMjZ2V0UHJvZmlsZUxpc3QoKQotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRQcm9maWxlTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5wcm9maWxlTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNzZXRQcm9maWxlTGlzdChWZWN0b3IpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9maWxlTGlzdChWZWN0b3IgcHJvZmlsZUxpc3QpCi0gIHsKLSAgICB0aGlzLnByb2ZpbGVMaXN0ID0gcHJvZmlsZUxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnMjYWRkUHJvZmlsZShQcm9maWxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUHJvZmlsZShQcm9maWxlIHByb2ZpbGUpCi0gIHsKLSAgICB0aGlzLnByb2ZpbGVMaXN0LmFkZChwcm9maWxlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNnZXRBcnRpZmFjdExpc3QoKQotICAgKi8KLSAgcHVibGljIFRyZWVNYXAgZ2V0QXJ0aWZhY3RMaXN0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmFydGlmYWN0TGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNnZXRBcnRpZmFjdChqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFByb2ZpbGVBcnRpZmFjdCBnZXRBcnRpZmFjdChTdHJpbmcgdHlwZSkKLSAgewotICAgIHJldHVybiAoUHJvZmlsZUFydGlmYWN0KSB0aGlzLmFydGlmYWN0TGlzdC5nZXQodHlwZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnMjc2V0QXJ0aWZhY3RMaXN0KFRyZWVNYXApCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdExpc3QoVHJlZU1hcCBhcnRpZmFjdExpc3QpCi0gIHsKLSAgICB0aGlzLmFydGlmYWN0TGlzdCA9IGFydGlmYWN0TGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNhZGRBcnRpZmFjdChSZXBvcnRBcnRpZmFjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFydGlmYWN0KFByb2ZpbGVBcnRpZmFjdCBhcnRpZmFjdCkKLSAgewotICAgIHRoaXMuYXJ0aWZhY3RMaXN0LnB1dChhcnRpZmFjdC5nZXRUeXBlKCksIGFydGlmYWN0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9ucyNnZXRUZXN0QXNzZXJ0aW9uKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBUZXN0QXNzZXJ0aW9uIGdldFRlc3RBc3NlcnRpb24oU3RyaW5nIGlkKQotICB7Ci0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uID0gbnVsbDsKLQotICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgYXJ0aWZhY3RzIGFuZCBmaW5kIHRoZSB0ZXN0IGFzc2VydGlvbiAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGFydGlmYWN0TGlzdC52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlICgoaXRlcmF0b3IuaGFzTmV4dCgpKSAmJiAodGVzdEFzc2VydGlvbiA9PSBudWxsKSkKLSAgICB7Ci0gICAgICB0ZXN0QXNzZXJ0aW9uID0gKChQcm9maWxlQXJ0aWZhY3QpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0VGVzdEFzc2VydGlvbihpZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRlc3RBc3NlcnRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnMjY3JlYXRlQXJ0aWZhY3QoKQotICAgKi8KLSAgcHVibGljIFByb2ZpbGVBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFByb2ZpbGVBcnRpZmFjdEltcGwoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuV1NJRG9jdW1lbnQjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kb2N1bWVudFVSSTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuV1NJRG9jdW1lbnQjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGRvY3VtZW50VVJJKQotICB7Ci0gICAgdGhpcy5kb2N1bWVudFVSSSA9IGRvY3VtZW50VVJJOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnMjZ2V0VEFETmFtZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRBRE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnMjc2V0VEFETmFtZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUQUROYW1lKFN0cmluZyBkb2N1bWVudE5hbWUpCi0gIHsKLSAgICB0aGlzLmRvY3VtZW50TmFtZSA9IGRvY3VtZW50TmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zI2dldFRBRFZlcnNpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUQURWZXJzaW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmRvY3VtZW50VmVyc2lvbjsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zI3NldFRBRFZlcnNpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VEFEVmVyc2lvbihTdHJpbmcgZG9jdW1lbnRWZXJzaW9uKQotICB7Ci0gICAgdGhpcy5kb2N1bWVudFZlcnNpb24gPSBkb2N1bWVudFZlcnNpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL2ltcGwvUHJvZmlsZUFzc2VydGlvbnNSZWFkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS9pbXBsL1Byb2ZpbGVBc3NlcnRpb25zUmVhZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDkxODA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL2ltcGwvUHJvZmlsZUFzc2VydGlvbnNSZWFkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5FbnRyeVR5cGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9uc1JlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkFydGlmYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyAuLi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVBc3NlcnRpb25zUmVhZGVySW1wbCBpbXBsZW1lbnRzIFByb2ZpbGVBc3NlcnRpb25zUmVhZGVyCi17Ci0gIC8qKgotICAgKiBQcm9maWxlIGFzc2VydGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgUHJvZmlsZUFzc2VydGlvbnMgcHJvZmlsZUFzc2VydGlvbnM7Ci0KLSAgLyoqCi0gICAqIFJlcG9ydEFydGlmYWN0IGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgVHJlZU1hcCBhcnRpZmFjdExpc3QgPSBuZXcgVHJlZU1hcCgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgbmV3IHJlYWRlci4KLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXNzZXJ0aW9uc1JlYWRlckltcGwoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuUHJvZmlsZUFzc2VydGlvbnNSZWFkZXIjcmVhZFByb2ZpbGVBc3NlcnRpb25zKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBQcm9maWxlQXNzZXJ0aW9ucyByZWFkUHJvZmlsZUFzc2VydGlvbnMoU3RyaW5nIGFzc2VydGlvbnNVUkkpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRQcm9maWxlQXNzZXJ0aW9ucyhuZXcgSW5wdXRTb3VyY2UoYXNzZXJ0aW9uc1VSSSkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zUmVhZGVyI3JlYWRQcm9maWxlQXNzZXJ0aW9ucyhSZWFkZXIpCi0gICAqLwotICBwdWJsaWMgUHJvZmlsZUFzc2VydGlvbnMgcmVhZFByb2ZpbGVBc3NlcnRpb25zKFJlYWRlciByZWFkZXIpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHJlYWRQcm9maWxlQXNzZXJ0aW9ucyhuZXcgSW5wdXRTb3VyY2UocmVhZGVyKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBwcm9maWxlIGFzc2VydGlvbnMuCi0gICAqLwotICBwcml2YXRlIFByb2ZpbGVBc3NlcnRpb25zIHJlYWRQcm9maWxlQXNzZXJ0aW9ucyhJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgcHJvZmlsZSBhc3NlcnRpb25zCi0gICAgcHJvZmlsZUFzc2VydGlvbnMgPSBuZXcgUHJvZmlsZUFzc2VydGlvbnNJbXBsKCk7Ci0KLSAgICAvLyBQcm9maWxlIHBhcnRzIGFyZSBwdXQgaW50byBhIHZlY3RvcgotICAgIGFydGlmYWN0TGlzdCA9IG5ldyBUcmVlTWFwKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBDcmVhdGUgeG1sIHJlYWRlcgotICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IFhNTFV0aWxzLmdldFhNTFJlYWRlcigpOwotCi0gICAgICAvLyBTZXQgY29udGVudCBoYW5kbGVyIHRvIGlubmVyIGNsYXNzCi0gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IFByb2ZpbGVBc3NlcnRpb25zSGFuZGxlcigpKTsKLQotICAgICAgLy8gUGFyc2UgcHJvZmlsZSBkZWZpbml0aW9uIGZpbGUKLSAgICAgIHJlYWRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCByZWFkIGFuZCBwYXJzZSBwcm9maWxlIGRlZmluaXRpb24uIiwgZSk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICAvL0NoZWNrIHRvIHNlZSBpZiB0aGUgdmVyc2lvbiBvZiB0ZXN0IGFzc3NlcnRpb24gZG9jdW1lbnQgaXMgc3VwcG9ydGVkCi0gICAgICBpZiAoIVV0aWxzLmlzVmFsaWRQcm9maWxlVEFEVmVyc2lvbihwcm9maWxlQXNzZXJ0aW9ucykpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICAgIlxuVmVyc2lvbiAiCi0gICAgICAgICAgICArIHByb2ZpbGVBc3NlcnRpb25zLmdldFRBRFZlcnNpb24oKQotICAgICAgICAgICAgKyAiIG9mIHRoZSBcIiIKLSAgICAgICAgICAgICsgcHJvZmlsZUFzc2VydGlvbnMuZ2V0VEFETmFtZSgpCi0gICAgICAgICAgICArICJcIlxuIgotICAgICAgICAgICAgKyAiZG9jdW1lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHZlcnNpb24gb2YiCi0gICAgICAgICAgICArICJcbiIKLSAgICAgICAgICAgICsgInRoZSB0ZXN0IHRvb2xzLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSBhc3NlcnRpb25zIGZyb20gdGhlIFRBRCBhcmUgcmVvcmRlcmVkIGZvciBwdXJwb3NlcyBvZiBwcm9jZXNzaW5nLiBBbGwKLSAgICAvLyBhc3NlcnRpb25zIG9mIGFuIGFydGlmYWN0IGFyZSByZW9yZGVyZWQgc3VjaCB0aGF0IHByZXJlcXVpc2l0ZXMgb2NjdXIKLSAgICAvLyBiZWZvcmUgdGhlIGFzc2VydGlvbnMgdGhleSBwcmVyZXEuIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgIHByZXJlcXVpc2l0ZXMgZG8KLSAgICAvLyBub3QgY3Jvc3MgYXJ0aWZhY3QgdHlwZXMuCi0gICAgLy8KLSAgICBJdGVyYXRvciBpdCA9IGFydGlmYWN0TGlzdC5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIC8vIGZvciBlYWNoIGFydGlmYWN0IHR5cGUgZG8gcmVvcmRlcmluZyBhc3NlcnRpb24gCi0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0ID0gKFByb2ZpbGVBcnRpZmFjdCkgYXJ0aWZhY3RMaXN0LmdldChpdC5uZXh0KCkpOwotICAgICAgLy8gcmVzdWx0IGxpc3Qgb2YgdGhlIHJlb3JkZXJpbmcgYXNzZXJ0aW9ucyAKLSAgICAgIExpbmtlZExpc3QgcmVzID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgIEl0ZXJhdG9yIGl0MiA9IGFydC5nZXRUZXN0QXNzZXJ0aW9uTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAvLyBzb3J0IHRoZSBhcnRpZmFjdCBhc3NlcnRpb25zIGludG8gcmVzdWx0IGxpc3QgCi0gICAgICB3aGlsZSAoaXQyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gY2FsbCBmb3IgZWFjaCBhc3NlcnRpb24gLCAKLSAgICAgICAgLy8gaWYgdGhlIGFzc2VydGlvbiBoYXMgdGhlIHByZXJlcSwgdGhlIHByZXJlcSB3aWxsIGFkZGVkIGZpcnN0IGludG8gcmVzIGxpc3QKLSAgICAgICAgc29ydFRlc3RBc3NlcnRpb25zKGFydCwgKFRlc3RBc3NlcnRpb24pIGl0Mi5uZXh0KCksIHJlcyk7Ci0gICAgICB9Ci0gICAgICAvLyByZXBsYWNlIHRoZSBvcmlnaW5hbCBhc3NlcnRpb25zIGxpc3QgdG8gdGhlIHByZXJlcSByZW9yZGVyaW5nIGFzc2VydGlvbnMgbGlzdAotICAgICAgYXJ0LmdldFRlc3RBc3NlcnRpb25MaXN0KCkuY2xlYXIoKTsKLSAgICAgIGFydC5nZXRUZXN0QXNzZXJ0aW9uTGlzdCgpLmFkZEFsbChyZXMpOwotICAgIH0KLSAgICAvLyBQdXQgdGhlIHByb2ZpbGUgcGFydHMgaW50byB0aGUgcHJvZmlsZSBkZWZpbml0aW9uCi0gICAgcHJvZmlsZUFzc2VydGlvbnMuc2V0QXJ0aWZhY3RMaXN0KGFydGlmYWN0TGlzdCk7Ci0KLSAgICByZXR1cm4gcHJvZmlsZUFzc2VydGlvbnM7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXIjZ2V0TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXIjc2V0TG9jYXRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGRvY3VtZW50VVJJKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogUmVjdXJzaXZlIHdhbGsgdG8gb3JkZXIgYXNzZXJ0aW9ucyBzbyB0aGF0IGFzc2VydGlvbnMgYXJlIAotICAgKiBwcm9jZXNzZWQgZm9sbG93aW5nIHRoZSBvbmVzIHRoYXQgcHJlcmVxIHRoZW0uCi0gICAqIElmIGFzc2VydGlvbiBoYXMgcHJlcmVxLCB0aGVuIGFkZCBpdCB0byB0aGUgcmVzdWx0IGxpc3QgZmlyc3QuCi0gICAqICAKLSAgICogQHBhcmFtIGFydCBwcm9maWxlIGFydGlmYWN0IGZvciBjYWxsIEBsaW5rIFByb2ZpbGVBcnRpZmFjdCNnZXRUZXN0QXNzZXJ0aW9uKFN0cmluZykKLSAgICogQHBhcmFtIGFzcnQgdGVzdCBhc3NlcnRpb24KLSAgICogQHBhcmFtIGxpc3QgcmVzdWx0IGxpc3QgdG8gc29ydAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNvcnRUZXN0QXNzZXJ0aW9ucyhQcm9maWxlQXJ0aWZhY3QgYXJ0LCBUZXN0QXNzZXJ0aW9uIGFzcnQsIExpc3QgbGlzdCkKLSAgewotICAgIC8vIGlmIGFzc2VydGlvbiBpcyBudWxsIG9yIGRvZXMgbm90IGV4aXN0LCB0aGVuIGV4aXQKLSAgICBpZigoYXNydCA9PSBudWxsKSB8fCBsaXN0LmNvbnRhaW5zKGFzcnQpKSAKLSAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBpZiBpdCBoYXMgbm90IHByZXJlcSwgYWRkIHRoZSBhc2VydGlvbiBhbmQgZXhpdAotICAgIGlmKGFzcnQuZ2V0UHJlcmVxSWRMaXN0KCkuaXNFbXB0eSgpKSAKLSAgICB7Ci0gICAgICBsaXN0LmFkZChhc3J0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gZ2V0IGxpc3QgcHJlcmVxIGFzc2VydGlvbiBhbmQgcmVxdXJzaXZlIGNhbGwgc29ydFRlc3RBc3NlcnRpb25zIHRoaXMgZWFjaCAgICAKLSAgICBJdGVyYXRvciBpdCA9IGFzcnQuZ2V0UHJlcmVxSWRMaXN0KCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAgIFN0cmluZyBpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgIHNvcnRUZXN0QXNzZXJ0aW9ucyhhcnQsIGFydC5nZXRUZXN0QXNzZXJ0aW9uKGlkKSwgbGlzdCk7Ci0gICAgfQotICAgIGxpc3QuYWRkKGFzcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIElubmVyIGNsYXNzOiBQcm9maWxlQXNzZXJ0aW9uc0hhbmRsZXIKLSAgICovCi0gIGNsYXNzIFByb2ZpbGVBc3NlcnRpb25zSGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsKLSAgICBwcml2YXRlIFByb2ZpbGVBcnRpZmFjdCBhcnRpZmFjdCA9IHByb2ZpbGVBc3NlcnRpb25zLmNyZWF0ZUFydGlmYWN0KCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgY29udGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYXNzZXJ0aW9uRGVzY3JpcHRpb24gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGZhaWx1cmVNZXNzYWdlID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24gPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIGRldGFpbERlc2NyaXB0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciB0ZXN0QXNzZXJ0aW9uSWQgPSBudWxsOwotICAgIC8vICAgIHByaXZhdGUgVmVjdG9yIHByZXJlcUlkTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcml2YXRlIFRyZWVNYXAgYXNzZXJ0aW9ucyA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudEVsZW1lbnQgPSBudWxsOwotICAgIHByaXZhdGUgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBsb2dJbnB1dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgd3NkbElucHV0ID0gbnVsbDsKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciB1ZGRpSW5wdXQgPSBudWxsOwotICAgIHByaXZhdGUgRW50cnlUeXBlTGlzdCBlbnRyeVR5cGVMaXN0ID0gbnVsbDsKLQotICAgIC8vIFByb2Nlc3Mgc3RhcnQgZWxlbWVudCBldmVudAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgICBTdHJpbmcgbG9jYWxOYW1lLAotICAgICAgU3RyaW5nIHFOYW1lLAotICAgICAgQXR0cmlidXRlcyBhdHRzKQotICAgIHsKLSAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbAotICAgICAgICAmJiAobmFtZXNwYWNlVVJJLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9BU1NFUlRJT05TXzIwMDMpCi0gICAgICAgIHx8ICBuYW1lc3BhY2VVUkkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FTU0VSVElPTlMpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2F2ZSBlbGVtZW50IG5hbWUKLSAgICAgICAgY3VycmVudEVsZW1lbnQgPSBsb2NhbE5hbWU7Ci0KLSAgICAgICAgLy8gPGFydGlmYWN0PgotICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9BUlRJRkFDVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcHJvZmlsZSBhcnRpZmFjdCBvYmplY3QKLSAgICAgICAgICBhcnRpZmFjdCA9IHByb2ZpbGVBc3NlcnRpb25zLmNyZWF0ZUFydGlmYWN0KCk7Ci0KLSAgICAgICAgICAvLyBTZXQgdHlwZQotICAgICAgICAgIGFydGlmYWN0LnNldFR5cGUoCi0gICAgICAgICAgICBBcnRpZmFjdFR5cGUubmV3QXJ0aWZhY3RUeXBlKAotICAgICAgICAgICAgICBhdHRzLmdldFZhbHVlKFdTSUNvbnN0YW50cy5BVFRSX1RZUEUpKSk7Ci0KLSAgICAgICAgICAvLyBBREQ6IEdldCBzcGVjaWZpY2F0aW9uIGxpc3QKLQotICAgICAgICAgIC8vIEFkZCBhcnRpZmFjdCB0byBsaXN0IG9mIGFydGlmYWN0IGxpc3QKLSAgICAgICAgICBhcnRpZmFjdExpc3QucHV0KGFydGlmYWN0LmdldFR5cGUoKS5nZXRUeXBlTmFtZSgpLCBhcnRpZmFjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8dGVzdEFzc2VydGlvbj4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9URVNUX0FTU0VSVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDcmVhdGUgdGVzdCBhc3NlcnRpb24KLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uID0gbmV3IFRlc3RBc3NlcnRpb25JbXBsKCk7Ci0KLSAgICAgICAgICAvLyBHZXQgYXR0cmlidXRlIHZhbHVlcwotICAgICAgICAgIHRlc3RBc3NlcnRpb24uc2V0SWQoYXR0cy5nZXRWYWx1ZSgiIiwgV1NJQ29uc3RhbnRzLkFUVFJfSUQpKTsKLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLnNldFR5cGUoYXR0cy5nZXRWYWx1ZSgiIiwgV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSkpOwotICAgICAgICAgIHRlc3RBc3NlcnRpb24uc2V0RW50cnlUeXBlTmFtZSgKLSAgICAgICAgICAgIGF0dHMuZ2V0VmFsdWUoIiIsIFdTSUNvbnN0YW50cy5BVFRSX0VOVFJZX1RZUEUpKTsKLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLnNldEVuYWJsZWQoCi0gICAgICAgICAgICBCb29sZWFuCi0gICAgICAgICAgICAgIC52YWx1ZU9mKGF0dHMuZ2V0VmFsdWUoIiIsIFdTSUNvbnN0YW50cy5BVFRSX0VOQUJMRUQpKQotICAgICAgICAgICAgICAuYm9vbGVhblZhbHVlKCkpOwotCi0gICAgICAgICAgLy8gQWRkIHRlc3QgYXNzZXJ0aW9uIHRvIGFydGlmYWN0Ci0gICAgICAgICAgYXJ0aWZhY3QuYWRkVGVzdEFzc2VydGlvbih0ZXN0QXNzZXJ0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxjb250ZXh0PgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0NPTlRFWFQpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxhc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9BU1NFUlRJT05fREVTQ1JJUFRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgYXNzZXJ0aW9uRGVzY3JpcHRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8ZmFpbHVyZU1lc3NhZ2U+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fRkFJTFVSRV9NRVNTQUdFKSkKLSAgICAgICAgewotICAgICAgICAgIGZhaWx1cmVNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPGZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbj4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9GQUlMVVJFX0RFVEFJTF9ERVNDUklQVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8ZGV0YWlsRGVzY3JpcHRpb24+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fREVUQUlMX0RFU0NSSVBUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIGRldGFpbERlc2NyaXB0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPHRlc3RBc3NlcnRpb25JRD4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9URVNUX0FTU0VSVElPTl9JRCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uSWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8YWRkaXRpb25hbEVudHJ5VHlwZUxpc3Q+Ci0gICAgICAgIGVsc2UgaWYgKAotICAgICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fQURESVRJT05BTF9FTlRSWV9UWVBFX0xJU1QpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ3JlYXRlIGVudHJ5IHR5cGUgbGlzdAotICAgICAgICAgIGVudHJ5VHlwZUxpc3QgPSBuZXcgRW50cnlUeXBlTGlzdEltcGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxtZXNzYWdlSW5wdXQ+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fTUVTU0FHRV9JTlBVVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBsb2dJbnB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDx3c2RsSW5wdXQ+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9JTlBVVCkpCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsSW5wdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gPHByb2ZpbGVBc3NlcnRpb25zPgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX1BST0ZJTEVfQVNTRVJUSU9OUykpCi0gICAgICAgIHsKLSAgICAgICAgICBwcm9maWxlQXNzZXJ0aW9ucy5zZXRUQUROYW1lKAotICAgICAgICAgICAgYXR0cy5nZXRWYWx1ZSgiIiwgV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkpOwotICAgICAgICAgIHByb2ZpbGVBc3NlcnRpb25zLnNldFRBRFZlcnNpb24oCi0gICAgICAgICAgICBhdHRzLmdldFZhbHVlKCIiLCBXU0lDb25zdGFudHMuQVRUUl9WRVJTSU9OKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSRU1PVkU6ICAgICAKLSAgICAgICAgLy8gPHVkZGlJbnB1dD4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9VRERJX0lOUFVUKSkgewotICAgICAgICAgIHVkZGlJbnB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgfSAKLSAgICAgICAgKi8KLSAgICAgIH0KLSAgICB9IC8vIEVORCBzdGFydEVsZW1lbnQKLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFuYW1lKQotICAgIHsKLSAgICAgIC8vIElmIHRoaXMgaXMgdGhlIHByb2ZpbGUgbmFtZXNwYWNlLCB0aGVuIGNoZWNrIGZvciBhbmQgcHJvY2VzcyBzZWxlY3RlZCBlbGVtZW50cwotICAgICAgaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsCi0gICAgICAgICYmIChuYW1lc3BhY2VVUkkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0FTU0VSVElPTlNfMjAwMykKLSAgICAgICAgfHwgbmFtZXNwYWNlVVJJLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9BU1NFUlRJT05TKSkpCi0gICAgICB7Ci0gICAgICAgIC8vIDxjb250ZXh0PgotICAgICAgICBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9DT05URVhUKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFNldCBjb250ZXh0IGluIHRlc3QgYXNzZXJ0aW9uCi0gICAgICAgICAgdGVzdEFzc2VydGlvbi5zZXRDb250ZXh0KGNvbnRleHQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgY29udGV4dCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fQVNTRVJUSU9OX0RFU0NSSVBUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFNldCBhc3NlcnRpb24gZGVzY3JpcHRpb24gaW4gdGVzdCBhc3NlcnRpb24KLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLnNldEFzc2VydGlvbkRlc2NyaXB0aW9uKAotICAgICAgICAgICAgYXNzZXJ0aW9uRGVzY3JpcHRpb24udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgYXNzZXJ0aW9uRGVzY3JpcHRpb24gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gPGZhaWx1cmVNZXNzYWdlPgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0ZBSUxVUkVfTUVTU0FHRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBTZXQgZmFpbHVyZSBtZXNzYWdlIGluIHRlc3QgYXNzZXJ0aW9uCi0gICAgICAgICAgdGVzdEFzc2VydGlvbi5zZXRGYWlsdXJlTWVzc2FnZShmYWlsdXJlTWVzc2FnZS50b1N0cmluZygpKTsKLSAgICAgICAgICBmYWlsdXJlTWVzc2FnZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8ZmFpbHVyZURldGFpbERlc2NyaXB0aW9uPgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0ZBSUxVUkVfREVUQUlMX0RFU0NSSVBUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFNldCBmYWlsdXJlIGRldGFpbCBkZXNjcmlwdGlvbiBpbiB0ZXN0IGFzc2VydGlvbgotICAgICAgICAgIHRlc3RBc3NlcnRpb24uc2V0RmFpbHVyZURldGFpbERlc2NyaXB0aW9uKAotICAgICAgICAgICAgZmFpbHVyZURldGFpbERlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8ZGV0YWlsRGVzY3JpcHRpb24+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fREVUQUlMX0RFU0NSSVBUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFNldCBkZXRhaWwgZGVzY3JpcHRpb24gaW4gdGVzdCBhc3NlcnRpb24KLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLnNldERldGFpbERlc2NyaXB0aW9uKGRldGFpbERlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGRldGFpbERlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDx0ZXN0QXNzZXJ0aW9uSUQ+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fVEVTVF9BU1NFUlRJT05fSUQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2V0IHRlc3QgYXNzZXJ0aW9uIGlkIGluIHByZXJlcSBsaXN0Ci0gICAgICAgICAgdGVzdEFzc2VydGlvbi5hZGRQcmVyZXFJZCh0ZXN0QXNzZXJ0aW9uSWQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgdGVzdEFzc2VydGlvbklkID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIDxhZGR0aW9uYWxFbnRyeVR5cGVMaXN0PgotICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICBsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0FERElUSU9OQUxfRU5UUllfVFlQRV9MSVNUKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFNldCB0YXJnZXQgbGlzdAotICAgICAgICAgIHRlc3RBc3NlcnRpb24uc2V0QWRkaXRpb25hbEVudHJ5VHlwZUxpc3QoZW50cnlUeXBlTGlzdCk7Ci0gICAgICAgICAgZW50cnlUeXBlTGlzdCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8bWVzc2FnZUlucHV0PgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfSU5QVVQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2V0IHRlc3QgYXNzZXJ0aW9uIGlkIGluIHByZXJlcSBsaXN0Ci0gICAgICAgICAgZW50cnlUeXBlTGlzdC5zZXRMb2dJbnB1dChsb2dJbnB1dC50b1N0cmluZygpKTsKLSAgICAgICAgICBsb2dJbnB1dCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8d3NkbElucHV0PgotICAgICAgICBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX1dTRExfSU5QVVQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gU2V0IHRlc3QgYXNzZXJ0aW9uIGlkIGluIHByZXJlcSBsaXN0Ci0gICAgICAgICAgZW50cnlUeXBlTGlzdC5zZXRXU0RMSW5wdXQod3NkbElucHV0LnRvU3RyaW5nKCkpOwotICAgICAgICAgIHdzZGxJbnB1dCA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyA8cHJvZmlsZUFzc2VydGlvbnM+Ci0gICAgICAgIGVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fUFJPRklMRV9BU1NFUlRJT05TKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGEgbm8tb3AKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFJFTU9WRToKLSAgICAgICAgLy8gPHVkZGlJbnB1dD4KLSAgICAgICAgZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9VRERJX0lOUFVUKSkgewotICAgICAgICAgIC8vIFNldCB0ZXN0IGFzc2VydGlvbiBpZCBpbiBwcmVyZXEgbGlzdAotICAgICAgICAgICBlbnRyeVR5cGVMaXN0LnNldFVERElJbnB1dCh1ZGRpSW5wdXQudG9TdHJpbmcoKSk7ICAgICAgICAgCi0gICAgICAgICAgdWRkaUlucHV0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAqLwotICAgICAgfQotICAgIH0gLy8gRU5EIGVuZEVsZW1lbnQKLQotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgewotICAgICAgLy8gPGNvbnRleHQ+Ci0gICAgICBpZiAoKGNvbnRleHQgIT0gbnVsbCkKLSAgICAgICAgJiYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9DT05URVhUKSkpCi0gICAgICB7Ci0gICAgICAgIGNvbnRleHQuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPGFzc2VydGlvbkRlc2NyaXB0aW9uPgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChhc3NlcnRpb25EZXNjcmlwdGlvbiAhPSBudWxsKQotICAgICAgICAgICYmIChjdXJyZW50RWxlbWVudC5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fQVNTRVJUSU9OX0RFU0NSSVBUSU9OKSkpCi0gICAgICB7Ci0gICAgICAgIGFzc2VydGlvbkRlc2NyaXB0aW9uLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxmYWlsdXJlTWVzc2FnZT4KLSAgICAgIGVsc2UgaWYgKAotICAgICAgICAoZmFpbHVyZU1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAmJiAoY3VycmVudEVsZW1lbnQuZXF1YWxzKFdTSUNvbnN0YW50cy5FTEVNX0ZBSUxVUkVfTUVTU0FHRSkpKQotICAgICAgewotICAgICAgICBmYWlsdXJlTWVzc2FnZS5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgfQotCi0gICAgICAvLyA8ZmFpbHVyZURldGFpbERlc2NyaXB0aW9uPgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24gIT0gbnVsbCkgJiYgKAotICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9GQUlMVVJFX0RFVEFJTF9ERVNDUklQVElPTikpKQotICAgICAgewotICAgICAgICBmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24uYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLy8gPGRldGFpbERlc2NyaXB0aW9uPgotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIChkZXRhaWxEZXNjcmlwdGlvbiAhPSBudWxsKQotICAgICAgICAgICYmIChjdXJyZW50RWxlbWVudC5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fREVUQUlMX0RFU0NSSVBUSU9OKSkpCi0gICAgICB7Ci0gICAgICAgIGRldGFpbERlc2NyaXB0aW9uLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDx0ZXN0QXNzZXJ0aW9uSUQ+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKHRlc3RBc3NlcnRpb25JZCAhPSBudWxsKQotICAgICAgICAgICYmIChjdXJyZW50RWxlbWVudC5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fVEVTVF9BU1NFUlRJT05fSUQpKSkKLSAgICAgIHsKLSAgICAgICAgdGVzdEFzc2VydGlvbklkLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDxtZXNzYWdlSW5wdXQ+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKGxvZ0lucHV0ICE9IG51bGwpCi0gICAgICAgICAgJiYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9NRVNTQUdFX0lOUFVUKSkpCi0gICAgICB7Ci0gICAgICAgIGxvZ0lucHV0LmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIDx3c2RsSW5wdXQ+Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgKHdzZGxJbnB1dCAhPSBudWxsKQotICAgICAgICAgICYmIChjdXJyZW50RWxlbWVudC5lcXVhbHMoV1NJQ29uc3RhbnRzLkVMRU1fV1NETF9JTlBVVCkpKQotICAgICAgewotICAgICAgICB3c2RsSW5wdXQuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgIH0KLQotICAgICAgLyogUkVNT1ZFOgotICAgICAgLy8gPHVkZGlJbnB1dD4KLSAgICAgIGVsc2UgaWYgKCh1ZGRpSW5wdXQgIT0gbnVsbCkgJiYgKGN1cnJlbnRFbGVtZW50LmVxdWFscyhXU0lDb25zdGFudHMuRUxFTV9VRERJX0lOUFVUKSkpIHsKLSAgICAgICAgdWRkaUlucHV0LmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICAqLwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9UZXN0QXNzZXJ0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvaW1wbC9UZXN0QXNzZXJ0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njk3NTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL2ltcGwvVGVzdEFzc2VydGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLkVudHJ5VHlwZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIC4uLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFzc2VydGlvbkltcGwgaW1wbGVtZW50cyBUZXN0QXNzZXJ0aW9uCi17Ci0gIC8qKgotICAgKiBUZXN0IGFzc2VydGlvbiBpZC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBudWxsOwotCi0gIC8qKgotICAgKiBUZXN0IGFzc2VydGlvbiB0eXBlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gbnVsbDsKLQotICAvKioKLSAgICogVGVzdCBhc3NlcnRpb24gcHJpbWFyeSBlbnRyeSB0eXBlIG5hbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGVudHJ5VHlwZU5hbWUgPSBudWxsOwotCi0gIC8qKgotICAgKiBUZXN0IGFzc2VydGlvbiBlbmFibGVkIGluZGljYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0gIC8qKgotICAgKiBDb250ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQotICAvKioKLSAgICogQXNzZXJ0aW9uIGRlc2NyaXB0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBhc3NlcnRpb25EZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEZhaWx1cmUgbWVzc2FnZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZmFpbHVyZU1lc3NhZ2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBGYWlsdXJlIGRldGFpbCBkZXNjcmlwdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZmFpbHVyZURldGFpbERlc2NyaXB0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogRGV0YWlsIGRlc2NyaXB0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBkZXRhaWxEZXNjcmlwdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEFkZHRpb25hbCBlbnRyeSB0eXBlIGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgRW50cnlUeXBlTGlzdCBlbnRyeVR5cGVMaXN0ID0gbnVsbDsKLQotICAvKioKLSAgICogUHJlcmVxIElEIGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIHByZXJlcUlkTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiB0aGlzLmlkOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jc2V0SWQoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgdGhpcy5pZCA9IGlkOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jZ2V0VHlwZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI3NldFR5cGUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkKLSAgewotICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNnZXRFbnRyeVR5cGVOYW1lKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RW50cnlUeXBlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbnRyeVR5cGVOYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jc2V0RW50cnlUeXBlTmFtZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbnRyeVR5cGVOYW1lKFN0cmluZyBlbnRyeVR5cGVOYW1lKQotICB7Ci0gICAgdGhpcy5lbnRyeVR5cGVOYW1lID0gZW50cnlUeXBlTmFtZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2lzRW5hYmxlZCgpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQotICB7Ci0gICAgcmV0dXJuIGVuYWJsZWQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNzZXRFbmFibGVkKGJvb2xlYW4pCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKLSAgewotICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNnZXRDb250ZXh0KCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpCi0gIHsKLSAgICByZXR1cm4gY29udGV4dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI3NldENvbnRleHQoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29udGV4dChTdHJpbmcgY29udGV4dCkKLSAgewotICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNnZXRBc3NlcnRpb25EZXNjcmlwdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFzc2VydGlvbkRlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiB0aGlzLmFzc2VydGlvbkRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jc2V0QXNzZXJ0aW9uRGVzY3JpcHRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uRGVzY3JpcHRpb24oU3RyaW5nIGFzc2VydGlvbkRlc2NyaXB0aW9uKQotICB7Ci0gICAgdGhpcy5hc3NlcnRpb25EZXNjcmlwdGlvbiA9IGFzc2VydGlvbkRlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jZ2V0RmFpbHVyZU1lc3NhZ2UoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGYWlsdXJlTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5mYWlsdXJlTWVzc2FnZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI3NldEZhaWx1cmVNZXNzYWdlKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVNZXNzYWdlKFN0cmluZyBmYWlsdXJlTWVzc2FnZSkKLSAgewotICAgIHRoaXMuZmFpbHVyZU1lc3NhZ2UgPSBmYWlsdXJlTWVzc2FnZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2dldEZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbigpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5mYWlsdXJlRGV0YWlsRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNzZXRGYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24oU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmFpbHVyZURldGFpbERlc2NyaXB0aW9uKFN0cmluZyBmYWlsdXJlRGV0YWlsRGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLmZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbiA9IGZhaWx1cmVEZXRhaWxEZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2dldERldGFpbERlc2NyaXB0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZGV0YWlsRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNzZXREZXRhaWxEZXNjcmlwdGlvbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXRhaWxEZXNjcmlwdGlvbihTdHJpbmcgZGV0YWlsRGVzY3JpcHRpb24pCi0gIHsKLSAgICB0aGlzLmRldGFpbERlc2NyaXB0aW9uID0gZGV0YWlsRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNnZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdCgpCi0gICAqLwotICBwdWJsaWMgRW50cnlUeXBlTGlzdCBnZXRBZGRpdGlvbmFsRW50cnlUeXBlTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbnRyeVR5cGVMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24jc2V0QWRkaXRpb25hbEVudHJ5VHlwZUxpc3Qob3JnLndzaS50ZXN0LnByb2ZpbGUuRW50cnlUeXBlTGlzdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxFbnRyeVR5cGVMaXN0KEVudHJ5VHlwZUxpc3QgZW50cnlUeXBlTGlzdCkKLSAgewotICAgIHRoaXMuZW50cnlUeXBlTGlzdCA9IGVudHJ5VHlwZUxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiNnZXRQcmVyZXFJZExpc3QoKQotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRQcmVyZXFJZExpc3QoKQotICB7Ci0gICAgcmV0dXJuIHByZXJlcUlkTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uI2FkZFByZXJlcUlkKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFByZXJlcUlkKFN0cmluZyBwcmVyZXFJZCkKLSAgewotICAgIHRoaXMucHJlcmVxSWRMaXN0LmFkZChwcmVyZXFJZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvQmFzZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjg5ZWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgdGhlIHByb2ZpbGUgdmFsaWRhdG9yLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFNldCBhbGwgdGVzdCBhc3NlcnRpb25zIGZvciBhbiBhcnRpZmFjdCB0byBtaXNzaW5nSW5wdXQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFueSBwcm9ibGVtcyB3aGlsZSBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWxsTWlzc2luZ0lucHV0KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQ2xlYW51cCBhZnRlciBwcm9jZXNzaW5nIGFsbCBvZiB0aGUgdGVzdCBhc3NlcnRpb25zIGZvciBhbiBhcnRpZmFjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW55IHByb2JsZW1zIGR1cmluZyBjbGVhbnVwLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYW51cCgpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAgICogUGFyc2UgWE1MIGRvY3VtZW50IGFuZCB2YWxpZGF0ZSB3aXRoIGEgc2NoZW1hIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSB1cmxTdHJpbmcgWE1MIGRvY3VtZW50IGxvY2F0aW9uLgotICAgICAqIEBwYXJhbSBiYXNlVVJJIGEgYmFzZSB1cmwgdG8gYXNzaXN0IGluIGxvY2F0aW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIHNjaGVtYSB0aGUgcmVsYXRlZCBYTUwgc2NoZW1hLgotICAgICAqIEByZXR1cm4gWE1MIGRvY3VtZW50LgotICAgICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBhbnkgcHJvYmxlbXMgd2hpbGUgcGFyc2luZyBvciAKLSAgICAgKiAgICAgICAgIHZhbGlkYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICAgKi8KLSAgcHVibGljIERvY3VtZW50IHBhcnNlWE1MRG9jdW1lbnRVUkwoCi0gICAgU3RyaW5nIHVybFN0cmluZywKLSAgICBTdHJpbmcgYmFzZVVSSSwKLSAgICBTdHJpbmcgc2NoZW1hKQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvRW50cnlDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvRW50cnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmI5OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL0VudHJ5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIHRhcmdldCBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgYSB0ZXN0IGFzc2VydGlvbi4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwgKGd0dXJyZWxsQHVrLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRyeUNvbnRleHQKLXsKLSAgcHJvdGVjdGVkIEVudHJ5IGVudHJ5ID0gbnVsbDsKLQotICBwcm90ZWN0ZWQgTWVzc2FnZUVudHJ5IHJlcXVlc3QgPSBudWxsOwotICBwcm90ZWN0ZWQgTWVzc2FnZUVudHJ5IHJlc3BvbnNlID0gbnVsbDsKLSAgcHJvdGVjdGVkIE1lc3NhZ2VFbnRyeSBtZXNzYWdlRW50cnkgPSBudWxsOwotCi0gIHByb3RlY3RlZCBEb2N1bWVudCByZXF1ZXN0RG9jdW1lbnQgPSBudWxsOwotICBwcm90ZWN0ZWQgRG9jdW1lbnQgcmVzcG9uc2VEb2N1bWVudCA9IG51bGw7Ci0gIHByb3RlY3RlZCBEb2N1bWVudCBtZXNzYWdlRW50cnlEb2N1bWVudCA9IG51bGw7Ci0KLSAgcHJvdGVjdGVkIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQgPSBudWxsOwotCi0gIHByb3RlY3RlZCBBbmFseXplckNvbnRleHQgYW5hbHl6ZXJDb250ZXh0ID0gbnVsbDsKLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5IGNvbnRleHQuCi0gICAqIEBwYXJhbSBlbnRyeSAgICBhIG1lc3NhZ2UgZW50cnkuCi0gICAqIEBwYXJhbSByZXF1ZXN0ICB0aGUgcmVxdWVzdC4KLSAgICogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXNwb25zZS4KLSAgICovCi0gIHB1YmxpYyBFbnRyeUNvbnRleHQoRW50cnkgZW50cnksIE1lc3NhZ2VFbnRyeSByZXF1ZXN0LCBNZXNzYWdlRW50cnkgcmVzcG9uc2UpCi0gIHsKLSAgICB0aGlzKGVudHJ5LCByZXF1ZXN0LCByZXNwb25zZSwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5IGNvbnRleHQuCi0gICAqIEBwYXJhbSBlbnRyeSAgICAgICAgICAgYSBtZXNzYWdlIGVudHJ5LgotICAgKiBAcGFyYW0gcmVxdWVzdCAgICAgICAgIHRoZSByZXF1ZXN0LgotICAgKiBAcGFyYW0gcmVzcG9uc2UgICAgICAgIHRoZSByZXNwb25zZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGV4dCgKLSAgICBFbnRyeSBlbnRyeSwKLSAgICBNZXNzYWdlRW50cnkgcmVxdWVzdCwKLSAgICBNZXNzYWdlRW50cnkgcmVzcG9uc2UsCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCkKLSAgewotICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKLSAgICB0aGlzLmFuYWx5emVyQ29udGV4dCA9IGFuYWx5emVyQ29udGV4dDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFBhcnNlIGFsbCBkb2N1bWVudHMKLSAgICAgIGlmKHJlcXVlc3QuaXNNaW1lQ29udGVudCgpKSAKLSAgICAgIHsKLSAgICAgIAlNaW1lUGFydCBwYXJ0ID0gcmVxdWVzdC5nZXRNaW1lUGFydHMoKS5nZXRSb290UGFydCgpOwotICAgICAgICBpZiAoKHBhcnQgIT0gbnVsbCkgJiYgKHBhcnQuZ2V0Q29udGVudCgpLmxlbmd0aCgpID4gMCkpCi0gICAgICAgICAgcmVxdWVzdERvY3VtZW50ID0gWE1MVXRpbHMucGFyc2VYTUwocGFydC5nZXRDb250ZW50KCkpOwotICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICByZXF1ZXN0RG9jdW1lbnQgPSBYTUxVdGlscy5wYXJzZVhNTChyZXF1ZXN0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmKHJlc3BvbnNlLmlzTWltZUNvbnRlbnQoKSkgCi0gICAgICB7Ci0gICAgICAJTWltZVBhcnQgcGFydCA9IHJlc3BvbnNlLmdldE1pbWVQYXJ0cygpLmdldFJvb3RQYXJ0KCk7Ci0gICAgICAJaWYgKChwYXJ0ICE9IG51bGwpICYmIChwYXJ0LmdldENvbnRlbnQoKS5sZW5ndGgoKSA+IDApKQotICAgICAgICAgIHJlc3BvbnNlRG9jdW1lbnQgPSBYTUxVdGlscy5wYXJzZVhNTChwYXJ0LmdldENvbnRlbnQoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIAotICAgICAgewotICAgICAgICBpZiAocmVzcG9uc2UuZ2V0TWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICByZXNwb25zZURvY3VtZW50ID0gWE1MVXRpbHMucGFyc2VYTUwocmVzcG9uc2UuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIHdlKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBuZWVkIHNvbWUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIGhlcmUgYW5kIG1vcmUgY2FyZWZ1bCBjaGVja2luZwotICAgIGlmIChlbnRyeS5nZXRFbnRyeVR5cGUoKS5lcXVhbHMoRW50cnlUeXBlLkVOVFJZX1RZUEVfUkVRVUVTVCkpCi0gICAgewotICAgICAgdGhpcy5tZXNzYWdlRW50cnkgPSByZXF1ZXN0OwotICAgICAgdGhpcy5tZXNzYWdlRW50cnlEb2N1bWVudCA9IHJlcXVlc3REb2N1bWVudDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRoaXMubWVzc2FnZUVudHJ5ID0gcmVzcG9uc2U7Ci0gICAgICB0aGlzLm1lc3NhZ2VFbnRyeURvY3VtZW50ID0gcmVzcG9uc2VEb2N1bWVudDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5IGNvbnRleHQuCi0gICAqIEBwYXJhbSBlbnRyeSBhIG1lc3NhZ2UgZW50cnkuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgYSBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGV4dChFbnRyeSBlbnRyeSwgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCkKLSAgewotICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICB0aGlzLndzZGxEb2N1bWVudCA9IHdzZGxEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgZW50cnkgY29udGV4dC4KLSAgICogQHBhcmFtIGVudHJ5IGEgbWVzc2FnZSBlbnRyeS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGV4dChFbnRyeSBlbnRyeSwgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCkKLSAgewotICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKLSAgICB0aGlzLmFuYWx5emVyQ29udGV4dCA9IGFuYWx5emVyQ29udGV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlbnRyeS4gCi0gICAqIEByZXR1cm4gdGhlIGVudHJ5LiAKLSAgICovCi0gIHB1YmxpYyBFbnRyeSBnZXRFbnRyeSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0LgotICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0LgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VFbnRyeSBnZXRSZXF1ZXN0KCkKLSAgewotICAgIHJldHVybiByZXF1ZXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3BvbnNlLgotICAgKiBAcmV0dXJuIHRoZSByZXNwb25zZS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlRW50cnkgZ2V0UmVzcG9uc2UoKQotICB7Ci0gICAgcmV0dXJuIHJlc3BvbnNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxvZyBlbnRyeSB3aGljaCBpcyBub3QgbnVsbC4KLSAgICogQHJldHVybiB0aGUgbG9nIGVudHJ5LgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VFbnRyeSBnZXRNZXNzYWdlRW50cnkoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VFbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0LgotICAgKiBAcmV0dXJuIE1lc3NhZ2VFbnRyeQotICAgKi8KLSAgcHVibGljIERvY3VtZW50IGdldFJlcXVlc3REb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gcmVxdWVzdERvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlc3BvbnNlLgotICAgKiBAcmV0dXJuIHRoZSByZXNwb25zZS4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBnZXRSZXNwb25zZURvY3VtZW50KCkKLSAgewotICAgIHJldHVybiByZXNwb25zZURvY3VtZW50OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxvZyBlbnRyeSB3aGljaCBpcyBub3QgbnVsbC4KLSAgICogQHJldHVybiB0aGUgbG9nIGVudHJ5LgotICAgKi8KLSAgcHVibGljIERvY3VtZW50IGdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkKLSAgewotICAgIHJldHVybiBtZXNzYWdlRW50cnlEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudCBnZXRXU0RMRG9jdW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIHdzZGxEb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuYWx5emVyQ29udGV4dC4KLSAgICogQHJldHVybiBhbmFseXplckNvbnRleHQKLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbnRleHQgZ2V0QW5hbHl6ZXJDb250ZXh0KCkKLSAgewotICAgIHJldHVybiB0aGlzLmFuYWx5emVyQ29udGV4dDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL0VudmVsb3BlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvRW52ZWxvcGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxZjNjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvRW52ZWxvcGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgZW52ZWxvcGUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbnZlbG9wZVZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3IKLXsKLQotICAvKioKLSAgICogSW5pdGlhaWxpemUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3QgICAgICAgIGFuIHByb2ZpbGUgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSByZXBvcnRBcnRpZmFjdCAgdGhlIHJlcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCB0aGUgV2ViIHNlcnZpY2UgZGVmaW5pdGlvbgotICAgKiBAcGFyYW0gcmVwb3J0ZXIgdGhlIHJlcG9ydGVyIHdoaWNoIGlzIHVzZWQgdG8gYWRkIGVycm9ycyB0byB0aGUgY29uZm9ybWFuY2UgcmVwb3J0Ci0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG1lc3NhZ2UgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZW52ZWxvcGUgbG9jYXRlZCBieSB0aGUgbG9nIGVudHJ5LiAKLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCBhIGxvZyBlbnRyeSBsb2NhdGluZyBhbiBlbnZlbG9wZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZQotICAgKiAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGxvZyBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpIHRocm93cyBXU0lFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL01lc3NhZ2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9NZXNzYWdlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNjE4YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL01lc3NhZ2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgbWVzc2FnZSB2YWxpZGF0aW9uIHRlc3QgcHJvY2VkdXJlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwgKGd0dXJyZWxsQHVrLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZVZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIEhUVFAgMS4wIHZlcnNpb24gaW5kaWNhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9WRVJTSU9OXzFfMCA9ICJIVFRQLzEuMCI7Ci0KLSAgLyoqCi0gICAqIEhUVFAgMS4xIHZlcnNpb24gaW5kaWNhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9WRVJTSU9OXzFfMSA9ICJIVFRQLzEuMSI7Ci0KLSAgLyoqCi0gICAqIEhUVFAgUE9TVCBtZXNzYWdlIGluZGljYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUE9TVCA9ICJQT1NUIjsKLQotICAvKioKLSAgICogSW5pdGlhaWxpemUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3QgICAgICAgIGFuIHByb2ZpbGUgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSByZXBvcnRBcnRpZmFjdCAgdGhlIHJlcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCB0aGUgV2ViIHNlcnZpY2UgZGVmaW5pdGlvbgotICAgKiBAcGFyYW0gcmVwb3J0ZXIgdGhlIHJlcG9ydGVyIHdoaWNoIGlzIHVzZWQgdG8gYWRkIGVycm9ycyB0byB0aGUgY29uZm9ybWFuY2UgcmVwb3J0Ci0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG1lc3NhZ2UgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgbWVzc2FnZSBsb2NhdGVkIGJ5IHRoZSBsb2cgZW50cnkuIAotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGEgbG9nIGVudHJ5IGxvY2F0aW5nIGEgbWVzc2FnZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSAKLSAgICogICAgICAgICBwcm9jZXNzaW5nIHRoZSBsb2cgZW50cnkuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL1Byb2ZpbGVWYWxpZGF0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExOTM5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuV1NJUHJvcGVydGllczsKLQotLyoqCi0qIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBhY2Nlc3MgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeSBhYnN0cmFjdCBjbGFzcy4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeQotewotICAvKiogCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFVEREkgdmFsaWRhdG9yLgotICAgKiBAcmV0dXJuICBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBXU0RMVmFsaWRhdG9yIGludGVyZmFjZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgVURESSB2YWxpZGF0b3IgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgVURESVZhbGlkYXRvciBuZXdVRERJVmFsaWRhdG9yKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKiogCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhIFdTREwgdmFsaWRhdG9yLgotICAgKiBAcmV0dXJuIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIFdTRExWYWxpZGF0b3IgaW50ZXJmYWNlLiAKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgV1NETCB2YWxpZGF0b3IgY2Fubm90IGJlIGluc3RhbnRpYXRlZC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBXU0RMVmFsaWRhdG9yIG5ld1dTRExWYWxpZGF0b3IoKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKiAKLSAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgbWVzc2FnZSB2YWxpZGF0b3IuCi0gICAqIE5PVEU6IERvIHdlIG5lZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB0cmFucG9ydCBhbmQgU09BUCAKLSAgICogbWVzc2FnZSB2YWxpZGF0b3I/Ci0gICAqCi0gICAqIEByZXR1cm4gYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgTWVzc2FnZVZhbGlkYXRvciBpbnRlcmZhY2UuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIG1lc3NhZ2UgdmFsaWRhdG9yY2Fubm90IGJlIGluc3RhbnRpYXRlZC4gCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZVZhbGlkYXRvciBuZXdNZXNzYWdlVmFsaWRhdG9yKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKiogCi0gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBhbiBlbnZlbG9wZSB2YWxpZGF0b3IuCi0gICAqIEByZXR1cm4gYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgRW52ZWxvcGVWYWxpZGF0b3IgaW50ZXJmYWNlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBtZXNzYWdlIHZhbGlkYXRvciBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLiAKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBFbnZlbG9wZVZhbGlkYXRvciBuZXdFbnZlbG9wZVZhbGlkYXRvcigpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEluc3RhbnRpYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkgY2xhc3MuCi0gICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhpcyBpbnRlcmZhY2UgaXMgc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgCi0gICAqIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICAgKiA8VUw+Ci0gICAqICAgPExJPndzaS5wcm9maWxlLnZhbGlkYXRvci5mYWN0b3J5Ci0gICAqIDwvVUw+Ci0gICAqCi0gICAqIEByZXR1cm4gdGhlIFByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5IG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgZmFjdG9yeSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeSBuZXdJbnN0YW5jZSgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotICAgIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBmYWN0b3J5IGNsYXNzIG5hbWUKLSAgICAgIGZhY3RvcnlDbGFzc05hbWUgPQotICAgICAgICBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KAotICAgICAgICAgIFdTSVByb3BlcnRpZXMuUFJPUF9WQUxJREFUT1JfRkFDVE9SWSwKLSAgICAgICAgICBXU0lQcm9wZXJ0aWVzLkRFRl9WQUxJREFUT1JfRkFDVE9SWSk7Ci0KLSAgICAgIC8vIENyZWF0ZSB0aGUgZmFjdG9yeSBjbGFzcwotICAgICAgQ2xhc3MgZmFjdG9yeUNsYXNzID0gQ2xhc3MuZm9yTmFtZShmYWN0b3J5Q2xhc3NOYW1lKTsKLQotICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIGZhY3RvcnkgCi0gICAgICBmYWN0b3J5ID0gKFByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5KSBmYWN0b3J5Q2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBmYWN0b3J5IGNsYXNzOiAiICsgZmFjdG9yeUNsYXNzTmFtZSArICIuIiwKLSAgICAgICAgZSk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGZhY3RvcnkKLSAgICByZXR1cm4gZmFjdG9yeTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9VRERJVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvVURESVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE4MzYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9VRERJVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5VRERJUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydEFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci0KLS8qKgotICogVGhlIFdTREwgdmFsaWRhdG9yIHdpbGwgdmVyaWZ5IHRoYXQgdGhlIFdTREwgYW5kIGFzc29jaWF0ZWQgWE1MIHNjaGVtYSBkZWZpbml0aW9ucwotICogYXJlIGluIGNvbmZvcm1hbmNlIHdpdGggdGhlIHByb2ZpbGUuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVERElWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBJbml0aWFpbGl6ZSB2YWxpZGF0aW9uIHRlc3QgcHJvY2VkdXJlLgotICAgKiBAcGFyYW0gYW5hbHl6ZXJDb250ZXh0IHRoZSBhbmFseXplckNvbnRleHQuCi0gICAqIEBwYXJhbSBhcnRpZmFjdCAgICAgICAgYW4gcHJvZmlsZSBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHJlcG9ydEFydGlmYWN0ICB0aGUgcmVwb3J0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gdWRkaVJlZmVyZW5jZSAgIGEgVURESSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSByZXBvcnRlciAgICAgICAgYSBSZXBvcnRlciBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIFVEREkgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgVURESVJlZmVyZW5jZSB1ZGRpUmVmZXJlbmNlLAotICAgIFJlcG9ydGVyIHJlcG9ydGVyKQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBVRERJIGJhc2VkIHNlcnZpY2UgZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gSWYgdGhlIFVEREkgZW50cmllcyBhcmUgdmFsaWQsIHRoZW4gdGhlIHZhbHVlIHJldHVybmVkIAotICAgKiAgICAgICAgIGlzIHRoZSBVUkwgZm9yIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBXU0lFeGNlcHRpb24gaWYgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZAotICAgKiAgICAgICAgIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFVEREllbnRyaWVzLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB2YWxpZGF0ZSgpIHRocm93cyBXU0lFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvV1NETFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL1dTRExWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyYmQyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvV1NETFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydEFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETERvY3VtZW50OwotCi0vKioKLSAqIFRoZSBXU0RMIHZhbGlkYXRvciB3aWxsIHZlcmlmeSB0aGF0IHRoZSBXU0RMIGFuZCBhc3NvY2lhdGVkIFhNTCBzY2hlbWEgZGVmaW5pdGlvbnMKLSAqIGFyZSBpbiBjb25mb3JtYW5jZSB3aXRoIHRoZSBwcm9maWxlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMVmFsaWRhdG9yIGV4dGVuZHMgQmFzZVZhbGlkYXRvcgotewotICAvKioKLSAgICogSW5pdGlhaWxpemUgdmFsaWRhdGlvbiB0ZXN0IHByb2NlZHVyZS4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29udGV4dCB0aGUgYW5hbHl6ZXJDb250ZXh0LgotICAgKiBAcGFyYW0gYXJ0aWZhY3QgICAgICAgIHRoZSBwcm9maWxlIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcmVwb3J0QXJ0aWZhY3QgIHRoZSByZXBvcnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSB3c2RsVVJMICAgICAgICAgdGhlIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgICAgdGhlIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSByZXBvcnRlciAgICAgICAgYSBSZXBvcnRlciBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIFdTREwgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgYXJ0aWZhY3QsCi0gICAgUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QsCi0gICAgU3RyaW5nIHdzZGxVUkwsCi0gICAgV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBiYXNlZCBzZXJ2aWNlIGRlc2NyaXB0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBhbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkCi0gICAqICAgICAgICAgd2hpbGUgdmFsaWRhdGluZyBoZSBXU0RMIGJhc2VkIHNlcnZpY2UgZGVzY3JpcHRpb24uCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50IHZhbGlkYXRlKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Fzc2VydGlvblByb2Nlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Fzc2VydGlvblByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhM2QyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9Bc3NlcnRpb25Qcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRmFpbHVyZURldGFpbDsKLQotCi0vKioKLSAqIFByb2Nlc3MgYXNzZXJ0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdDsKLSAgcHJvdGVjdGVkIFN0cmluZyBmYWlsdXJlRGV0YWlsTWVzc2FnZTsKLSAgcHJvdGVjdGVkIEZhaWx1cmVEZXRhaWwgZmFpbHVyZURldGFpbDsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlVmFsaWRhdG9ySW1wbCBiYXNlX3ZhbGlkYXRvcjsKLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZVZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25Qcm9jZXNzKEJhc2VWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICB0aGlzLmJhc2VfdmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICovCi0gIHZvaWQgcmVzZXQoKQotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSBudWxsOwotICAgIGZhaWx1cmVEZXRhaWwgPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFzc2VydGlvbi4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCB0YXJnZXRDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFZlcmJvc2Ugb3V0cHV0LgotICAgKi8KLSAgcHVibGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBpZiAoKGJhc2VfdmFsaWRhdG9yICE9IG51bGwpICYmIGJhc2VfdmFsaWRhdG9yLnZlcmJvc2VPcHRpb24pCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Fzc2VydGlvblByb2Nlc3NWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdiMGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Fzc2VydGlvblByb2Nlc3NWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogUHJvY2VzcyBhc3NlcnRpb24gdXNpbmcgV1NETFZpc2l0b3IgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IKLSAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi0gIGltcGxlbWVudHMgV1NETFZpc2l0b3IKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlVmFsaWRhdG9ySW1wbCBiYXNlX3ZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IoQmFzZVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMuYmFzZV92YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdChQYXJ0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoU2VydmljZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVzIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoT3BlcmF0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoSW5wdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChPdXRwdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChGYXVsdCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmcgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBCaW5kaW5nT3BlcmF0aW9uIG9iaiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIEJpbmRpbmdJbnB1dCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBCaW5kaW5nT3V0cHV0IG9iaiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIEJpbmRpbmdGYXVsdCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChJbXBvcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChFbGVtZW50IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoTWVzc2FnZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChQb3J0VHlwZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KERlZmluaXRpb24gb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQmluZGluZyBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEhlYWRlciBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXJGYXVsdCBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQRmF1bHQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQT3BlcmF0aW9uIG9iaiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvQmFzZU1lc3NhZ2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Jhc2VNZXNzYWdlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODgwMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvQmFzZU1lc3NhZ2VWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlVSSTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU0NvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFuYWx5emVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQ2FuZGlkYXRlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFuYWx5emVyQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbC5XU0RMVmFsaWRhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkZhaWx1cmVEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET00yV3JpdGVyOwotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET01VdGlsczsKLQotLyoqCi0gKiBUaGUgV1NETCB2YWxpZGF0b3Igd2lsbCB2ZXJpZnkgdGhhdCB0aGUgV1NETCBhbmQgYXNzb2NpYXRlZCBYTUwgc2NoZW1hIGRlZmluaXRpb25zCi0gKiBhcmUgaW4gY29uZm9ybWFuY2Ugd2l0aCB0aGUgcHJvZmlsZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIEppbSBDbHVuZQotICogQGF1dGhvciBHcmFoYW0gVHVycmVsbCAoZ3R1cnJlbGxAdWsuaWJtLmNvbSkKLSAqIEBhdXRob3IgTmVpbCBEZWxpbWEgKG5kZGVsaW1hQGNhLmlibS5jb20pIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgZXh0ZW5kcyBCYXNlVmFsaWRhdG9ySW1wbAotewotICAvKioKLSAgKiBXU0RMIGRvY3VtZW50LgotICAqLwotICBwcml2YXRlIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQ7Ci0KLSAgLyoqCi0gICAqIExvZyBlbnRyeS4KLSAgICovCi0gIHByb3RlY3RlZCBNZXNzYWdlRW50cnkgbG9nRW50cnk7Ci0gIHByb3RlY3RlZCBMb2cgbG9nOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuTWVzc2FnZVZhbGlkYXRvciNpbml0KG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplckNvbnRleHQsIG9yZy53c2kudGVzdC5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdCwgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRBcnRpZmFjdCwgb3JnLndzaS53c2RsLldTRExEb2N1bWVudCwgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgcHJvZmlsZUFydGlmYWN0LAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQsCi0gICAgUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQmFzZVZhbGlkYXRvckltcGwKLSAgICBzdXBlci5pbml0KGFuYWx5emVyQ29udGV4dCwgcHJvZmlsZUFydGlmYWN0LCByZXBvcnRBcnRpZmFjdCwgcmVwb3J0ZXIpOwotCi0gICAgLy8gU2F2ZSBpbnB1dCByZWZlcmVuY2VzCi0gICAgdGhpcy53c2RsRG9jdW1lbnQgPSB3c2RsRG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3c2RsRG9jdW1lbnQKLSAgICogQHJldHVybiB3c2RsRG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyBXU0RMRG9jdW1lbnQgZ2V0V1NETERvY3VtZW50KCkKLSAgewotICAgIHJldHVybiB3c2RsRG9jdW1lbnQ7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5NZXNzYWdlVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvL0VudHJ5IGVudHJ5ID0gbnVsbDsKLQotICAgIC8vIFNhdmUgbG9nIGVudHJ5IHRvIGJlIHJlZmVyZW5jZWQgYnkgb3RoZXIgbWV0aG9kcwotICAgIHRoaXMubG9nRW50cnkgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCk7Ci0KLSAgICAvLyBHZXQgcmVmZXJlbmNlIHRvIHRoZSBhbmFseXplciBjb25maWcgb2JqZWN0Ci0gICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJDb25maWcgPQotICAgICAgcmVwb3J0ZXIuZ2V0UmVwb3J0KCkuZ2V0UmVwb3J0Q29udGV4dCgpLmdldEFuYWx5emVyKCkuZ2V0QW5hbHl6ZXJDb25maWcoKTsKLQotICAgIC8qIElmIFNlcnZpY2UgRGVzY3JpcHRpb24gKFdTREwvVURESSkgTk9UIHN1cHBsaWVkIGluIGFuYWx5emVyIGNvbmZpZyBPUgotICAgICAqIFNlcnZpY2UgRGVzY3JpcHRpb24gSVMgc3VwcGxpZWQgYW5kIHRoZSBjdXJyZW50IG1lc3NhZ2UgY29ycmVsYXRlcyB0byBpdC4uLgotICAgICAqLwotICAgIGlmICgod3NkbERvY3VtZW50ID09IG51bGwpCi0gICAgICB8fCBtZXNzYWdlQ29ycmVsYXRlc1RvU2VydmljZSgKLSAgICAgICAgZW50cnlDb250ZXh0LAotICAgICAgICBhbmFseXplckNvbmZpZy5nZXRDb3JyZWxhdGlvblR5cGUoKSkpCi0gICAgewotICAgICAgLy8gbm93IGlubmVyIGNsYXNzZXMgbW92ZWQgb3V0IGZyb20gdGhlIHZhbGlkYXRvcgotICAgICAgLy9TdHJpbmcgY2xhc3NQcmVmaXggPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiQiOwotICAgICAgU3RyaW5nIGNsYXNzUHJlZml4ID0gdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkrIi4iOwotCi0gICAgICAvLyBQcm9jZXNzIGFzc2VydGlvbnMgZm9yIHRoaXMgYXJ0aWZhY3QgYWdhaW5zdCB0aGUgdGFyZ2V0IGNvbnRleHQKLSAgICAgIHByb2Nlc3NBc3NlcnRpb25zKGNsYXNzUHJlZml4LCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB3aGV0aGVyIHRoZSBtZXNzYWdlIGNvcnJlbGF0ZXMgdG8gdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KLSAgICogVXNlIHRoZSByZXF1ZXN0IHBhcnQgb2YgdGhlIHJlcXVlc3QtcmVzcG9uc2UgcGFpciwgZnJvbSB3aGljaCB0aGUgY29ycmVsYXRpb24gb2YgdGhlIHJlc3BvbnNlIGlzIGltcGxpZWQuCi0gICAqIEVudGl0aWVzIGZyb20gdGhlIFNlcnZpY2UgdW5kZXIgdGVzdCBhcmUgZGV0ZXJtaW5lZCBvbmNlIGZvciBhbGwuCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgICAgYW4gZW50cnkgY29udGV4dC4KLSAgICogQHBhcmFtIGNvcnJlbGF0aW9uVHlwZSBhIGNvcnJlbGF0aW9uIHR5cGUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb3JyZWxhdGVzIHRvIHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIGNvcnJlbGF0aW9uIHR5cGUgaXMgbm90IGFwcHJvcHJpYXRlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG1lc3NhZ2VDb3JyZWxhdGVzVG9TZXJ2aWNlKAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQsCi0gICAgU3RyaW5nIGNvcnJlbGF0aW9uVHlwZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIFVSSVtdIGVuZHBvaW50cyA9IG51bGw7Ci0gICAgYm9vbGVhbiBjb3JyZWxhdGlvbiA9IGZhbHNlOwotCi0gICAgLyogVEVNUDogR2V0IGl0IGZyb20gYW5hbHl6ZXIgY29uZmlnIHBhc3NlZCBpbiBvbiBpbml0IG1ldGhvZAotICAgIENhbmRpZGF0ZUluZm8gY2FuZGlkYXRlID0gZW50cnlDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QW5hbHl6ZXJDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCk7Ci0gICAgKi8KLSAgICBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZSA9IGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCk7Ci0KLSAgICAvLyBTZXJ2aWNlIHJlZmVyZW5jZSAKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UgPSBhbmFseXplckNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZSgpOwotCi0gICAgLy8gR2V0IHRoZSBkZWZpbml0aW9uIGVsZW1lbnQKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBjYW5kaWRhdGUuZ2V0V3NkbERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKTsKLQotICAgIEJpbmRpbmcgYmluZGluZyA9IG51bGw7Ci0gICAgaWYgKHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5pc1BvcnQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgc2VydmljZQotICAgICAgU2VydmljZSBzZXJ2aWNlID0KLSAgICAgICAgZGVmaW5pdGlvbi5nZXRTZXJ2aWNlKAotICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXRQYXJlbnRFbGVtZW50UU5hbWUoKSk7Ci0KLSAgICAgIC8vIEdldCBwb3J0Ci0gICAgICBQb3J0IHBvcnQgPSBzZXJ2aWNlLmdldFBvcnQoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldE5hbWUoKSk7Ci0KLSAgICAgIC8vIEdldCBiaW5kaW5nCi0gICAgICBiaW5kaW5nID0gcG9ydC5nZXRCaW5kaW5nKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5pc0JpbmRpbmcoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgYmluZGluZwotICAgICAgYmluZGluZyA9Ci0gICAgICAgIGRlZmluaXRpb24uZ2V0QmluZGluZyhzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0UU5hbWUoKSk7Ci0gICAgfQotCi0gICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKChlbmRwb2ludHMgPSBob3N0QW5kUG9ydENvcnJlbGF0aW9uKGVudHJ5Q29udGV4dCkpICE9IG51bGwKLSAgICAgICYmIHVybFBhdGhDb3JyZWxhdGlvbihlbnRyeUNvbnRleHQsIGVuZHBvaW50cykpCi0gICAgewotCi0gICAgICAvKiBJZiBjb3JyZWxhdGlvbiB0eXBlIGlzICJlbmRwb2ludCIsIHRoaXMgaXMgYWxsIHRoZSBjb3JyZWxhdGlvbiB0aGF0IGNhbiBiZSBkb25lLgotICAgICAgICogKE5vdGUgLSB0aGlzIGlzIGluY29tcGxldGUgY29ycmVsYXRpb24gc2luY2UgPjEgc2VydmljZSBjb3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVuZHBvaW50LgotICAgICAgICogIFRoZXJlZm9yZSAsIGlmIG1lc3NhZ2VzIGZvciBkaWZmZXJlbnQgc2VydmljZXMgb24gdGhlIHNhbWUgZW5kcG9pbnQgYXBwZWFyIGluIHRoZSBsb2cgZmlsZQotICAgICAgICogIGFuZCBjb3JyZWxhdGlvbiB0eXBlIGlzICJlbmRwb2ludCIsIGFsbCB0aG9zZSBtZXNzYWdlcyB3aWxsIGJlIGFuYWx5emVkKS4KLSAgICAgICAqLwotICAgICAgaWYgKGNvcnJlbGF0aW9uVHlwZQotICAgICAgICAuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfRU5EUE9JTlQpKQotICAgICAgewotICAgICAgICBjb3JyZWxhdGlvbiA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIGFsd2F5cyBhbGxvdyBHRVQgcmVxdWVzdHMgcmlnaHQgdGhyb3VnaCBpZiB0aGV5J3ZlIHBhc3NlZCBFbmRwb2ludCBDb3JyZWxhdGlvbgotICAgICAgICBTdHJpbmcgcmVxdWVzdFR5cGUgPSBnZXRIdHRwUmVxdWVzdFR5cGUoZW50cnlDb250ZXh0KTsKLSAgICAgICAgaWYgKChyZXF1ZXN0VHlwZSAhPSBudWxsKSAmJiByZXF1ZXN0VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJHRVQiKSkKLSAgICAgICAgewotICAgICAgICAgIGNvcnJlbGF0aW9uID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBUaGUgY29ycmVsYXRpb25UeXBlIGlzIG5vdCAiZW5kcG9pbnQiIHNvIGNvbnRpbnVlIG9uIHRvIHByb2Nlc3NpbmcgZm9yIGF0IGxlYXN0IAotICAgICAgICAgIC8vICJuYW1lc3BhY2UiIGNvcnJlbGF0aW9uLi4uCi0KLSAgICAgICAgICAvLyBnZXQgdGhlIG9wZXJhdGlvbiBzaWduYXR1cmUgKGlucHV0ICYgb3V0cHV0KSBmcm9tIHJlcXVlc3QgJiByZXNwb25zZSBtZXNzYWdlcy4uLgkgICAKLSAgICAgICAgICAvLyBhbmQgZG8gYSBxdWljayBET00gcGFyc2UgCi0gICAgICAgICAgRG9jdW1lbnQgcmVxdWVzdE1lc3NhZ2UgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0KLSAgICAgICAgICAvLyBDaGVjayBpZiBuYW1lc3BhY2UgaXMgZm91bmQgaW4gcmVxdWVzdCBtZXNzYWdlIG9ubHkKLSAgICAgICAgICBpZiAobmFtZXNwYWNlQ29ycmVsYXRpb24oYmluZGluZywgcmVxdWVzdE1lc3NhZ2UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIG5hbWVzcGFjZSBmb3VuZCBhbmQgdGhlIGNvcnJlbGF0aW9uIHR5cGUgaXMgbmFtZXNwYWNlLCB0aGVuIHByb2Nlc3MgbWVzc2FnZXMKLSAgICAgICAgICAgIGlmIChjb3JyZWxhdGlvblR5cGUKLSAgICAgICAgICAgICAgLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9DT1JSRUxBVElPTl9UWVBFX05BTUVTUEFDRSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgb3BlcmF0aW9uIGlzIGZvdW5kIGFuZCBjb3JyZWxhdGlvbiB0eXBlIGlzIG9wZXJhdGlvbiwgdGhlbiBwcm9jZXNzIG1lc3NhZ2VzCi0gICAgICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICAgICAgKG9wZXJhdGlvbkNvcnJlbGF0aW9uKGJpbmRpbmcsIHJlcXVlc3RNZXNzYWdlKSkKLSAgICAgICAgICAgICAgICAmJiAoY29ycmVsYXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICAuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX0NPUlJFTEFUSU9OX1RZUEVfT1BFUkFUSU9OKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGlmIGNvbmZpZyBzY2hlbWEgd2FzIGZvbGxvd2VkIGNvcnJlY3RseQotICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJCYWQgY29ycmVsYXRpb24gdHlwZSBmb3VuZCBpbiBjb25maWc6ICIgKyBjb3JyZWxhdGlvblR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBjb3JyZWxhdGlvbjsKLSAgfQotCi0gIC8qKiAKLSAgICogIENvcnJlbGF0aW9uIENoZWNrIDE6IFNlcnZpY2UgRGVzY3JpcHRpb24gZW5kcG9pbnQgdnMgSFRUUCBIZWFkZXIgKHRlc3QgMSkKLSAgICogIENoZWNrIGlmIHJlY2VpdmVySG9zdEFuZFBvcnQgZnJvbSByZXF1ZXN0IG1lc3NhZ2UgbG9nIG1hdGNoZXMgaG9zdCAmIHBvcnQgZnJvbSBXU0RMIFNPQVAgYmluZGluZyBmb3IKLSAgICogIHRoZSBTZXJ2aWNlIHVuZGVyIHRlc3QuCi0gICAqICBJZiBpdCBkb2VzIG5vdCwgc3RvcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZSBwYWlyLgotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGFuIGVudHJ5IGNvbnRleHQuCi0gICAqIEByZXR1cm4gaWYgcmVjZWl2ZXJIb3N0QW5kUG9ydCBmcm9tIHJlcXVlc3QgbWVzc2FnZSBsb2cgbWF0Y2hlcyAKLSAgICogICAgICAgICBob3N0ICYgcG9ydCBmcm9tIFdTREwgU09BUCBiaW5kaW5nIGZvciB0aGUgU2VydmljZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIGNvcnJlbGF0aW9uIGNoZWNrLgotICAgKi8KLSAgcHJpdmF0ZSBVUklbXSBob3N0QW5kUG9ydENvcnJlbGF0aW9uKEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBnZXQgPHJlY2VpdmVySG9zdEFuZFBvcnQ+IGZyb20gcmVxdWVzdCBtZXNzYWdlCi0gICAgU3RyaW5nIGh0dHBIb3N0QW5kUG9ydCA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0UmVjZWl2ZXJIb3N0QW5kUG9ydCgpOwotICAgIC8vIFNlYXJjaCBlbmRwb2ludCBsaXN0IGZvciBhIG1hdGNoIHdpdGggPHJlY2VpdmVySG9zdEFuZFBvcnQ+Ci0KLSAgICAvKiBURU1QOiBHZXQgaXQgZnJvbSBhbmFseXplciBjb25maWcgcGFzc2VkIGluIG9uIGluaXQgbWV0aG9kCi0gICAgcmV0dXJuIGVudHJ5Q29udGV4dC5nZXRBbmFseXplckNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAgICAgICAgICAgIC5nZXRFbmRQb2ludHMoaHR0cEhvc3RBbmRQb3J0KTsKLSAgICAqLwotICAgIHJldHVybiBhbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEVuZFBvaW50cyhodHRwSG9zdEFuZFBvcnQpOwotICB9Ci0KLSAgLyoqIAotICAgKiBDb3JyZWxhdGlvbiBDaGVjayAyOiBTZXJ2aWNlIERlc2NyaXB0aW9uIGVuZHBvaW50IHZzIEhUVFAgSGVhZGVyICh0ZXN0IDIpCi0gICAqIAotICAgKiBVc2UgYW5hbHl6ZXIgY29uZmlnIGhvc3QgJiBwb3J0LCBwbHVzIFVSTCBwYXRoIChmcm9tIHJlcXVlc3QgbWVzc2FnZSBoZWFkZXIgSFRUUCBQT1NUKQotICAgKiB0byBsb29rIGZvciB0aGUgY29ycmVzcG9uZGluZyBlbmRwb2ludCBpbiB0aGUgU2VydmljZSBEZWZpbml0aW9uLgotICAgKiBJZiBpdCBkb2VzIG5vdCwgc3RvcCBwcm9jZXNzaW5nIHRoaXMgbWVzc2FnZSBwYWlyLgotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0IGFuIGVudHJ5IGNvbnRleHQuCi0gICAqIEBwYXJhbSBlbmRwb2ludHMgYW4gYXJyYXkgb2YgZW5kcG9pbnRzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgY29ycmVzcG9uZGluZyBlbmRwb2ludHMgYXJlIGZvdW5kIGluIHRoZSBTZXJ2aWNlIERlZmluaXRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBjb3JyZWxhdGlvbiBjaGVjay4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB1cmxQYXRoQ29ycmVsYXRpb24oCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCwKLSAgICBVUklbXSBlbmRwb2ludHMpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBjb21wYXJlczogcHJvdG9jb2wgKG11c3QgYmUgaHR0cCBmb3IgUE9TVCksIGhvc3QsIHBvcnQgYW5kIHBhdGguCi0KLSAgICAvLyBnZXQgUE9TVCBVUkkgcGF0aCBmcm9tIG1lc3NhZ2UgdXNpbmcgVG9rZW5pemVyCQotICAgIFZlY3RvciByZXF1ZXN0TGluZSA9Ci0gICAgICBnZXRIdHRwUmVxdWVzdChlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCkpOwotICAgIGlmIChyZXF1ZXN0TGluZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsgLy8gYW4gdW5leHBlY3RlZCBIVFRQIHJlcXVlc3QgdHlwZSAhCi0gICAgfQotCi0gICAgU3RyaW5nIHJlcXVlc3RQYXRoID0gKFN0cmluZykgcmVxdWVzdExpbmUuZ2V0KDEpOwotICAgIC8vIFBhdGggaW1tZWRpYXRlbHkgZm9sbG93cyBQT1NUCi0KLSAgICAvLyBjb21wYXJlIHBhdGggd2l0aCB0aG9zZSBpbiB0aGUgcHJldmlvdXMgZ2VuZXJhdGVkIFVSSSBsaXN0CQotICAgIFZlY3RvciBmaWx0ZXJlZEVuZHBvaW50cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuZHBvaW50cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZW5kcG9pbnRzW2ldLnRvU3RyaW5nKCkuZW5kc1dpdGgocmVxdWVzdFBhdGgpKQotICAgICAgewotICAgICAgICBmaWx0ZXJlZEVuZHBvaW50cy5hZGQoZW5kcG9pbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZmlsdGVyZWRFbmRwb2ludHMuc2l6ZSgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyB0aGlzIFVSSSBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBXU0RMIC0gdGhlcmUgc2hvdWxkIGJlIGF0IG1vc3Qgb25lIG1hdGNoCi0gICAgLy8gYnV0IGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lLCB0aGF0J3Mgc3VmZmljaWVudCB0byBhY2NlcHQgdGhlIG1lc3NhZ2UKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqIAotICAgKiBDb3JyZWxhdGlvbiBDaGVjayAzOiBTZXJ2aWNlIERlc2NyaXB0aW9uIG5hbWVzcGFjZS4KLSAgICogCi0gICAqIERldGVybWluZSBpZiB0aGUgU2VydmljZSBEZXNjcmlwdGlvbiBkZWNsYXJlcyB0aGUgbmFtZXNwYWNlIHRoYXQgYXBwZWFycyBpbiB0aGUgKHJlcXVlc3Q/KSBtZXNzYWdlIHNvYXAgYm9keS4KLSAgICogTG9jYXRpb24gb2YgcmVsZXZlbnQgbmFtZXNwYWNlIDoKLSAgICogT3BlcmF0aW9uIHR5cGUgICAgICAgICAgICAgICAgICAgIAktIE1lc3NhZ2UgTmFtZXNwYWNlOiAoY29tcGFyZSB3aXRoKSAgU2VydmljZSBEZWZpbml0aW9uIE5hbWVzcGFjZToKLSAgICogKGZyb20gbWVzc2FnZT8gZW5kcG9pbnQ/IHdoZXJlPykKLSAgICogcnBjLWxpdGVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c29hcDpCb2R5Jmd0OyBjaGlsZCBuYW1lc3BhY2UuICAgICAgICAmbHQ7c29hcGJpbmQ6Ym9keSZndDsgbmFtZXNwYWNlLgotICAgKiBkb2MtbGl0ZXJhbAkJCSAgICAgICAgICAgICAgICAgJmx0O3NvYXA6Qm9keSZndDsgY2hpbGQgbmFtZXNwYWNlLiAgICAgICB0YXJnZXROYW1lU3BhY2Ugb2Ygc2NoZW1hIHRoYXQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZXMgICZsdDtzb2FwOmJvZHkmZ3Q7IGNoaWxkLgotICAgKiBJZiBpdCBkb2Vzbid0IG1hdGNoLCBzdG9wIHByb2Nlc3NpbmcgdGhpcyBtZXNzYWdlIHBhaXIuCi0gICAqIEBwYXJhbSBiaW5kaW5nIGEgYmluZGluZy4KLSAgICogQHBhcmFtIHJlcXVlc3QgYSByZXF1ZXN0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgZGVzY3JpcHRpb24gZGVjbGFyZWQgaW4gdGhlIGRlc2NyaXB0aW9uIGFyZSB0aGUgCi0gICAqICAgICAgICAgc2FtZSBhcyB0aG9zZSB0aGF0IGFwcGVhciBpbiB0aGUgbWVzc2FnZSBzb2FwIGJvZHkuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBjb3JyZWxhdGlvbmNoZWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gbmFtZXNwYWNlQ29ycmVsYXRpb24oQmluZGluZyBiaW5kaW5nLCBEb2N1bWVudCByZXF1ZXN0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gbmFtZXNwYWNlRm91bmQgPSBmYWxzZTsKLSAgICBTdHJpbmcgYmluZGluZ1N0eWxlID0gV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQzsKLQotICAgIC8vIEdldCBvcGVyYXRpb24gbmFtZXNwYWNlIGZyb20gdGhlIHJlcXVlc3Qgc29hcCBtZXNzYWdlCi0gICAgU3RyaW5nIHNvYXBPcE5TID0gZ2V0U29hcEJvZHlDaGlsZChyZXF1ZXN0KS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgIC8vIEdldCBzb2FwYmluZDpiaW5kaW5nCi0gICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSBudWxsOwotICAgIGlmICgoc29hcEJpbmRpbmcgPSBXU0RMVXRpbHMuZ2V0U29hcEJpbmRpbmcoYmluZGluZykpICE9IG51bGwpCi0gICAgewotICAgICAgYmluZGluZ1N0eWxlID0gc29hcEJpbmRpbmcuZ2V0U3R5bGUoKTsKLSAgICB9Ci0KLSAgICAvLyBHbyB0aHJvdWdoIGVhY2ggb3BlcmF0aW9uIGluIHRoZSBiaW5kaW5nIGFuZCBjaGVjayBmb3IgbmFtZXNwYWNlIG1hdGNoCi0gICAgSXRlcmF0b3Igb3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSAmJiAhKG5hbWVzcGFjZUZvdW5kKSkKLSAgICB7Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgb3BlcmF0aW9ucy5uZXh0KCk7Ci0KLSAgICAgIC8vIElmIHJwYy1saXRlcmFsLCB0aGVuIGxvb2sgYXQgbmFtZXNwYWNlIGF0dHJpYnV0ZSBvbiBzb2FwYmluZDpib2R5Ci0gICAgICBpZiAoV1NETFV0aWxzLmlzUnBjTGl0ZXJhbChiaW5kaW5nU3R5bGUsIGJpbmRpbmdPcGVyYXRpb24pKQotICAgICAgewotICAgICAgICAvLyBHZXQgc29hcGJpbmQ6Ym9keSBlbGVtZW50IAotICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IFdTRExVdGlscy5nZXRJbnB1dFNvYXBCb2R5KGJpbmRpbmdPcGVyYXRpb24pOwotCi0gICAgICAgIGlmICgoc29hcEJvZHkuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkKLSAgICAgICAgICAmJiAoc29hcEJvZHkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHNvYXBPcE5TKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2VGb3VuZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgZG9jLWxpdGVyYWwsIHRoZW4gY2hlY2sgbmFtZXNwYWNlCi0gICAgICBlbHNlIGlmIChXU0RMVXRpbHMuaXNEb2NMaXRlcmFsKGJpbmRpbmdTdHlsZSwgYmluZGluZ09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIGludCBwYXJ0Q291bnQ7Ci0gICAgICAgIEl0ZXJhdG9yIHBhcnRzSXRlcmF0b3IgPSBudWxsOwotCi0gICAgICAgIC8vIEdldCBmaXJzdCBwYXJ0IG5hbWUgZnJvbSBzb2FwYmluZDpib2R5IGVsZW1lbnQgcGFydHMgYXR0cmlidXRlCi0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IGdldEZpcnN0UGFydE5hbWUoYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHBhcnRzIGZyb20gdGhlIG1lc3NhZ2UgICAgICAgICAgIAotICAgICAgICBNYXAgcGFydHNNYXAgPSBudWxsOwotICAgICAgICBpZiAoKHBhcnRzTWFwID0KLSAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpLmdldFBhcnRzKCkpCi0gICAgICAgICAgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHBhcnRzSXRlcmF0b3IgPSBwYXJ0c01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgLy8gSWYgdGhlIHBhcnQgbmFtZSB3YXNuJ3Qgc3BlY2lmaWVkIG9uIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQsIHRoZW4gcHJvY2VzcyBqdXN0IHRoZSBmaXJzdCBvbmUKLSAgICAgICAgICBpZiAocGFydE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHBhcnRDb3VudCA9IDE7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgcGFydENvdW50ID0gcGFydHNNYXAuc2l6ZSgpOwotCi0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0Q291bnQgJiYgIW5hbWVzcGFjZUZvdW5kOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0IG5leHQgcGFydAotICAgICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIHBhcnRzSXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAvLyBJZiBwYXJ0IG5hbWUgbWF0Y2hlcyBvciB0aGVyZSBpcyBubyBwYXJ0IG5hbWUsIHRoZW4gY2hlY2sgbmFtZXNwYWNlCi0gICAgICAgICAgICBpZiAoKHBhcnROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgIHx8ICgocGFydE5hbWUgIT0gbnVsbCkgJiYgKHBhcnQuZ2V0TmFtZSgpLmVxdWFscyhwYXJ0TmFtZSkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKChwYXJ0LmdldEVsZW1lbnROYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiAocGFydC5nZXRFbGVtZW50TmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhzb2FwT3BOUykpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWVzcGFjZUZvdW5kOwotICB9Ci0KLSAgLyoqIAotICAqIENvcnJlbGF0aW9uIENoZWNrIDQgOiBTZXJ2aWNlIERlc2NyaXB0aW9uICJvcGVyYXRpb24iCi0gICoKLSAgKiBDaGVjayBpZiB0aGUgbWVzc2FnZSBjb250ZW50IG1hdGNoZXMgYW55IG9mIHRoZSBjYW5kaWRhdGUgb3BlcmF0aW9uIGRlZmluaXRpb25zIAotICAqIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZSBpbiB0aGUgU2VydmljZSBEZXNjcmlwdGlvbi4KLSAgKiAgCi0gICogRm9yIGJvdGggcmVxdWVzdCBhbmQgcmVzcG9uc2UsIGxvb2sgZm9yIHRoZSBzb2FwIGJvZHkgY2hpbGQgZWxlbWVudCBuYW1lCi0gICogaW4gdGhlIGxpc3Qgb2YgY2FuZGlkYXRlIG9wZXJhdGlvbiBuYW1lcy4KLSAgKiBAcGFyYW0gYmluZGluZyAgICAgICAgYSBiaW5kaW5nLgotICAqIEBwYXJhbSByZXF1ZXN0TWVzc2FnZSBhIHJlcXVlc3QgbWVzc2FnZS4KLSAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgY29udGVudCBtYXRjaGVzIGFueSBvZiB0aGUgY2FuZGlkYXRlIAotICAqICAgICAgICAgb3BlcmF0aW9uIGRlZmluaXRpb25zIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZSBpbiB0aGUgCi0gICogICAgICAgICBTZXJ2aWNlIERlc2NyaXB0aW9uLgotICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBjb3JyZWxhdGlvbmNoZWNrLgotICAqLwotICBwcml2YXRlIGJvb2xlYW4gb3BlcmF0aW9uQ29ycmVsYXRpb24oCi0gICAgQmluZGluZyBiaW5kaW5nLAotICAgIERvY3VtZW50IHJlcXVlc3RNZXNzYWdlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGJvb2xlYW4gb3BlcmF0aW9uRm91bmQgPSBmYWxzZTsKLQotICAgIFN0cmluZyBiaW5kaW5nU3R5bGUgPSBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DOwotCi0gICAgLy8gR2V0IHNvYXBiaW5kOmJpbmRpbmcKLSAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IG51bGw7Ci0gICAgaWYgKChzb2FwQmluZGluZyA9IFdTRExVdGlscy5nZXRTb2FwQmluZGluZyhiaW5kaW5nKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBiaW5kaW5nU3R5bGUgPSBzb2FwQmluZGluZy5nZXRTdHlsZSgpOwotICAgIH0KLQotICAgIC8vIEdldCB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBmcm9tIHRoZSBzb2FwIGJvZHkKLSAgICBFbGVtZW50IHNvYXBCb2R5Q2hpbGQgPSBnZXRTb2FwQm9keUNoaWxkKHJlcXVlc3RNZXNzYWdlKTsKLQotICAgIC8vIElmIHRoZXJlIGlzIGEgY2hpbGQgZWxlbWVudCwgdGhlbiBjaGVjayBpdAotICAgIGlmIChzb2FwQm9keUNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR2V0IG9wZXJhdGlvbiBuYW1lIGZyb20gdGhlIHNvYXA6Ym9keQotICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBzb2FwQm9keUNoaWxkLmdldExvY2FsTmFtZSgpOwotCi0gICAgICAvLyBHZXQgb3BlcmF0aW9uIFFOYW1lCi0gICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9Ci0gICAgICAgIG5ldyBRTmFtZShzb2FwQm9keUNoaWxkLmdldE5hbWVzcGFjZVVSSSgpLCBvcGVyYXRpb25OYW1lKTsKLQotICAgICAgLy8gR28gdGhyb3VnaCBlYWNoIG9wZXJhdGlvbiBpbiB0aGUgYmluZGluZyBhbmQgY2hlY2sgZm9yIG5hbWVzcGFjZSBtYXRjaAotICAgICAgSXRlcmF0b3Igb3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKG9wZXJhdGlvbnMuaGFzTmV4dCgpICYmICEob3BlcmF0aW9uRm91bmQpKQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgIChCaW5kaW5nT3BlcmF0aW9uKSBvcGVyYXRpb25zLm5leHQoKTsKLQotICAgICAgICAvLyBJZiBycGMtbGl0ZXJhbCwgdGhlbiBsb29rIGF0IG5hbWVzcGFjZSBhdHRyaWJ1dGUgb24gc29hcGJpbmQ6Ym9keQotICAgICAgICBpZiAoV1NETFV0aWxzLmlzUnBjTGl0ZXJhbChiaW5kaW5nU3R5bGUsIGJpbmRpbmdPcGVyYXRpb24pKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0IHNvYXBiaW5kOmJvZHkgZWxlbWVudCAKLSAgICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkuZXF1YWxzKG9wZXJhdGlvbk5hbWUpKQotICAgICAgICAgICAgb3BlcmF0aW9uRm91bmQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgZG9jLWxpdGVyYWwsIHRoZW4gY2hlY2sgbmFtZXNwYWNlCi0gICAgICAgIGVsc2UgaWYgKFdTRExVdGlscy5pc0RvY0xpdGVyYWwoYmluZGluZ1N0eWxlLCBiaW5kaW5nT3BlcmF0aW9uKSkKLSAgICAgICAgewotICAgICAgICAgIGludCBwYXJ0Q291bnQ7Ci0gICAgICAgICAgSXRlcmF0b3IgcGFydHNJdGVyYXRvciA9IG51bGw7Ci0KLSAgICAgICAgICAvLyBHZXQgZmlyc3QgcGFydCBuYW1lIGZyb20gc29hcGJpbmQ6Ym9keSBlbGVtZW50IHBhcnRzIGF0dHJpYnV0ZQotICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IGdldEZpcnN0UGFydE5hbWUoYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFydHMgZnJvbSB0aGUgbWVzc2FnZSAgICAgICAgICAgCi0gICAgICAgICAgTWFwIHBhcnRzTWFwID0gbnVsbDsKLSAgICAgICAgICBpZiAoKHBhcnRzTWFwID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkuZ2V0UGFydHMoKSkKLSAgICAgICAgICAgICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFydHNJdGVyYXRvciA9IHBhcnRzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IG5hbWUgd2Fzbid0IHNwZWNpZmllZCBvbiB0aGUgc29hcGJpbmQ6Ym9keSBlbGVtZW50LCB0aGVuIHByb2Nlc3MganVzdCB0aGUgZmlyc3Qgb25lCi0gICAgICAgICAgICBpZiAocGFydE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgcGFydENvdW50ID0gMTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcGFydENvdW50ID0gcGFydHNNYXAuc2l6ZSgpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRDb3VudCAmJiAhb3BlcmF0aW9uRm91bmQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gR2V0IG5leHQgcGFydAotICAgICAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgcGFydHNJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgLy8gSWYgcGFydCBuYW1lIG1hdGNoZXMgb3IgdGhlcmUgaXMgbm8gcGFydCBuYW1lLCB0aGVuIGNoZWNrIG5hbWVzcGFjZQotICAgICAgICAgICAgICBpZiAoKHBhcnROYW1lID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKChwYXJ0TmFtZSAhPSBudWxsKSAmJiAocGFydC5nZXROYW1lKCkuZXF1YWxzKHBhcnROYW1lKSkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChwYXJ0LmdldEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICYmIChwYXJ0LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG9wZXJhdGlvblFOYW1lKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIEdvIHRocm91Z2ggZWFjaCBvcGVyYXRpb24gdG8gZmluZCBhIG1hdGNoCi0gICAgcmV0dXJuIG9wZXJhdGlvbkZvdW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBmYWlsdXJlIGRldGFpbC4KLSAgICogQHBhcmFtIG1lc3NhZ2UgICAgICAgYSBtZXNzYWdlLgotICAgKiBAcGFyYW0gZW50cnlDb250ZXh0ICBhbiBlbnRyeSBjb250ZXh0LgotICAgKiBAcmV0dXJuIGZhaWx1cmUgZGV0YWlsLgotICAgKi8KLSAgcHVibGljIEZhaWx1cmVEZXRhaWwgY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICB7Ci0gICAgRmFpbHVyZURldGFpbCBmYWlsdXJlRGV0YWlsID0gcmVwb3J0ZXIuY3JlYXRlRmFpbHVyZURldGFpbCgpOwotICAgIGZhaWx1cmVEZXRhaWwuc2V0RmFpbHVyZU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgZmFpbHVyZURldGFpbC5zZXRFbGVtZW50TG9jYXRpb24oCi0gICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0RWxlbWVudExvY2F0aW9uKCkpOwotICAgIHJldHVybiBmYWlsdXJlRGV0YWlsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsI2lzTm90QXBwbGljYWJsZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RBcHBsaWNhYmxlKFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbikKLSAgewotICAgIGJvb2xlYW4gbm90QXBwbGljYWJsZSA9IGZhbHNlOwotCi0gICAgLy8gSWYgdGhlIGFkZGl0aW9uYWwgZW50cnkgaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBzZXQgbm90QXBwbGljYWJsZQotICAgIGlmICh0ZXN0QXNzZXJ0aW9uLmdldEFkZGl0aW9uYWxFbnRyeVR5cGVMaXN0KCkuZ2V0V1NETElucHV0KCkgIT0gbnVsbAotICAgICAgJiYgIXRlc3RBc3NlcnRpb24uZ2V0QWRkaXRpb25hbEVudHJ5VHlwZUxpc3QoKS5nZXRXU0RMSW5wdXQoKS5lcXVhbHMoIm5vbmUiKQotICAgICAgJiYgYW5hbHl6ZXJDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoKS5nZXRXU0RMTG9jYXRpb24oKSA9PSBudWxsKQotICAgIHsKLSAgICAgIG5vdEFwcGxpY2FibGUgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBub3RBcHBsaWNhYmxlOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0IFBPU1QgcmVxdWVzdC4KLSAgICogQHBhcmFtIGh0dHBIZWFkZXIgYW4gSFRUUCAKLSAgICogQHJldHVybiBQT1NUIHJlcXVlc3QuCi0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldFBvc3RSZXF1ZXN0KFN0cmluZyBodHRwSGVhZGVyKQotICB7Ci0gICAgLy9SZXF1ZXN0LUxpbmUgICA9IE1ldGhvZCBTUCBSZXF1ZXN0LVVSSSBTUCBIVFRQLVZlcnNpb24gQ1JMRgotICAgIFZlY3RvciByZXF1ZXN0TGluZSA9IG5ldyBWZWN0b3IoKTsKLSAgICBTdHJpbmcgc3RhcnRMaW5lID0gbnVsbDsKLQotICAgIFN0cmluZ1Rva2VuaXplciBodHRwTWVzc2FnZVRva2VuaXplciA9Ci0gICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGh0dHBIZWFkZXIsICJcblxyXGYiKTsKLQotICAgIGlmIChodHRwTWVzc2FnZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgc3RhcnRMaW5lID0gaHR0cE1lc3NhZ2VUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgfQotCi0gICAgaWYgKHN0YXJ0TGluZS5zdGFydHNXaXRoKCJQT1NUIikpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0YXJ0TGluZVRva2VuaXplciA9Ci0gICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RhcnRMaW5lLCAiXHUwMDIwIik7Ci0gICAgICB3aGlsZSAoc3RhcnRMaW5lVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIHsKLSAgICAgICAgcmVxdWVzdExpbmUuYWRkKHN0YXJ0TGluZVRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXF1ZXN0TGluZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgSFRUUCByZXF1ZXN0LgotICAgKiBAcGFyYW0gaHR0cEhlYWRlciBhbiBIVFRQIAotICAgKiBAcmV0dXJuIEhUVFAgcmVxdWVzdC4KLSAgKi8KLSAgcHJpdmF0ZSBWZWN0b3IgZ2V0SHR0cFJlcXVlc3QoU3RyaW5nIGh0dHBIZWFkZXIpCi0gIHsKLSAgICAvL1JlcXVlc3QtTGluZSAgID0gTWV0aG9kIFNQIFJlcXVlc3QtVVJJIFNQIEhUVFAtVmVyc2lvbiBDUkxGCi0gICAgVmVjdG9yIHJlcXVlc3RMaW5lID0gbmV3IFZlY3RvcigpOwotICAgIFN0cmluZyBzdGFydExpbmUgPSBudWxsOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIGh0dHBNZXNzYWdlVG9rZW5pemVyID0KLSAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoaHR0cEhlYWRlciwgIlxuXHJcZiIpOwotCi0gICAgaWYgKGh0dHBNZXNzYWdlVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICB7Ci0gICAgICBzdGFydExpbmUgPSBodHRwTWVzc2FnZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhcnRMaW5lLnN0YXJ0c1dpdGgoIlBPU1QiKSB8fCBzdGFydExpbmUuc3RhcnRzV2l0aCgiR0VUIikpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0YXJ0TGluZVRva2VuaXplciA9Ci0gICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RhcnRMaW5lLCAiXHUwMDIwIik7Ci0gICAgICB3aGlsZSAoc3RhcnRMaW5lVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIHsKLSAgICAgICAgcmVxdWVzdExpbmUuYWRkKHN0YXJ0TGluZVRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXF1ZXN0TGluZSA9IG51bGw7IC8vIHNpZ25pZnkgbm90IFBPU1Qgb3IgR0VUCi0gICAgfQotCi0gICAgcmV0dXJuIHJlcXVlc3RMaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBIVFRQIHJlcXVlc3QgdHlwZS4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCBhbiBlbnRyeSBjb250ZXh0LgotICAgKiBAcmV0dXJuIEhUVFAgcmVxdWVzdCB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SHR0cFJlcXVlc3RUeXBlKEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gIHsKLSAgICAvL1JlcXVlc3QtTGluZSAgID0gTWV0aG9kIFNQIFJlcXVlc3QtVVJJIFNQIEhUVFAtVmVyc2lvbiBDUkxGCi0KLSAgICBTdHJpbmcgaHR0cEhlYWRlciA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICBTdHJpbmcgaHR0cFJlcXVlc3RUeXBlID0gbnVsbDsKLSAgICBTdHJpbmcgc3RhcnRMaW5lID0gbnVsbDsKLQotICAgIFN0cmluZ1Rva2VuaXplciBodHRwTWVzc2FnZVRva2VuaXplciA9Ci0gICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGh0dHBIZWFkZXIsICJcblxyXGYiKTsKLQotICAgIGlmIChodHRwTWVzc2FnZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgc3RhcnRMaW5lID0gaHR0cE1lc3NhZ2VUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3RhcnRMaW5lVG9rZW5pemVyID0KLSAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihzdGFydExpbmUsICJcdTAwMjAiKTsKLSAgICAgIGlmIChzdGFydExpbmVUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICBodHRwUmVxdWVzdFR5cGUgPSBzdGFydExpbmVUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBodHRwUmVxdWVzdFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoZSBtZXNzYWdlIGlzIGEgcmVzcG9uc2UgZm9yIGEgb25lLXdheSBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgYW4gZW50cnkgY29udGV4dC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGlzIGEgcmVzcG9uc2UgZm9yIGEgb25lLXdheSBvcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc09uZVdheVJlc3BvbnNlKEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gIHsKLSAgICBib29sZWFuIG9uZXdheSA9IGZhbHNlOwotCi0gICAgLy8gVEVNUDogSWYgdGhpcyBpcyBhIHJlc3BvbnNlIG1lc3NhZ2UgYW5kIHRoZXJlIGlzIG5vIGNvbnRlbnQsIHRoZW4gc2V0IG9uZS13YXkgdG8gdHJ1ZQotICAgIC8vIFRFTVA6IE5lZWQgdG8gZmluZCBhIHdheSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3BvbnNlIGlzIGZvciBhIG9uZS13YXkgbWVzc2FnZQotICAgIGlmIChlbnRyeUNvbnRleHQKLSAgICAgIC5nZXRNZXNzYWdlRW50cnkoKQotICAgICAgLmdldFR5cGUoKQotICAgICAgLmVxdWFsc0lnbm9yZUNhc2UoTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UpCi0gICAgICAmJiBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgb25ld2F5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb25ld2F5OwotICB9Ci0KLSAgLyoqCi0gICAqIG1lc3NhZ2VJc0RvY0xpdFNjaGVtYVZhbGlkLgotICAgKgotICAgKiBWYWxpZGF0ZXMgdGhlIGRvYy1saXQgbWVzc2FnZXMgYWdhaW5zdCB0aGUgc2NoZW1hIGZvdW5kIGluIGEgY2FuZGlkYXRlIHdzZGwgZG9jdW1lbnQuCi0gICAqCi0gICAqIElkZW50aWZ5IChvciBiZSBnaXZlbikgYSByZWZlcmVuY2UgaW4gdGhlIHdzZGwgdG8gZWxlbWVudHMgKGZvdW5kIGluICZsdDt3c2RsOnR5cGVzJmd0OyZsdDtzY2hlbWEmZ3Q7Li4uKQotICAgKiB0aGF0IGFyZSBpbW1lZGlhdGUgY2hpbGRyZW4gZWxlbWVudHMgaW4gdGhlIHNvYXAgYm9keS4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCBhbiBlbnRyeSBjb250ZXh0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRvY3VtZW50IGxpdGVyYWwgbWVzc2FnZSBpcyBjb21wbGlhbnQgdG8gdGhlIAotICAgKiAgICAgICAgIHNjaGVtYSBmb3VuZCBpbiBhIGNhbmRpZGF0ZSBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHBhcnNpbmcgcHJvYmxlbSBkdXJpbmcgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIG1lc3NhZ2VJc0RvY0xpdFNjaGVtYVZhbGlkKEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgdXNlIGEgdmFsaWRhdGluZyBwYXJzZXIgdGhhdCBpcyBjYXBhYmxlIG9mIGFjY2VwcHRpbmcgbXVsdGlwbGUgc2NoZW1hIHJlZmVyZW5jZXMKLSAgICAvLyBwcm9ncmFtbWF0aWNhbGx5LiBUaGVuLCBldmVyeSBzY2hlbWEgaW4gY2FuZGlkYXRlIHdzZGwgY2FuIGJlIHBhc3NlZCBpbiB0byB0aGUgdmFsaWRhdG9yLiBUaGlzIGF2b2lkcyB0aGUKLSAgICAvLyBuZWVkIHRvIHBpbnBvaW50IGEgcGFydGljdWxhciBzY2hlbWEgZWxlbWVudCBmcm9tIGFsbCBjYW5kaWRhdGUgd3NkbDp0eXBlcywgY29ycmVzcG9uZGluZyB0byB0aGUgCi0gICAgLy8gd3NkbDpvcGVyYXRpb24gYmVpbmcgdXNlZC4gVGhlIHBpbnBvaW50aW5nIGlzIGFuIGluY29tcGxldGUgd29ya2Fyb3VuZCBmb3IgcGFyc2VycyBub3QgY2FwYWJsZSAKLSAgICAvLyBvZiBhY2NlcHRpbmcgYXJyYXlzIG9mIHNjZWhtYSByZWZlcmVuY2VzIAotICAgIC8vIFsgaS5lLiB0aGUgRE9NIGZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BIFNPVVJDRSwgT2JqZWN0W10gey4uLn0pIF0KLSAgICAvLyBnZXQgYWxsIHhzOnNjaGVtYSBmcm9tIGFsbCBjYW5kaWRhdGUgd3NkbDp0eXBlcyAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gYWRkIGVhY2ggPHNjaGVtYT4gdG8gYW4gYXJyYXkgYW5kIHBhc3MgdGhpcyBhcnJheSB0byB0aGUgdmFsaWRhdGluZyBwYXJzZXIKLSAgICAvLyB3aGVuIHZhbGlkYXRpbmcgdGhlL2VhY2ggc29hcCBib2R5IGNoaWxkLgotCi0gICAgLy8gdXNlIHRoZSByZWZlcmVuY2VkIFdTREwgZmlsZSBhbmQgaXRzIGltcG9ydGVkIGZpbGVzIHRvIGZpbmQgc2NoZW1hcwotICAgIExpc3Qgc2NoZW1hV1NETHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgTGlzdCBpbmxpbmVTY2hlbWFzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIExpc3Qgc2NoZW1hU3RyaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIERlZmluaXRpb25bXSBhbGxEZWZzID0KLSAgICAgIGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RGVmaW5pdGlvbnMoKTsKLSAgICBmb3IgKGludCB0aGlzRGVmID0gMDsgdGhpc0RlZiA8IGFsbERlZnMubGVuZ3RoOyB0aGlzRGVmKyspCi0gICAgewotICAgICAgc2NoZW1hV1NETHMuYWRkKGFsbERlZnNbdGhpc0RlZl0uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgIH0KLSAgICBJdGVyYXRvciBmaWxlSXRlcmF0b3IgPSBzY2hlbWFXU0RMcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChmaWxlSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIC8vIHBhcnNlIGZpbGUgaWYgcG9zc2libGUKLSAgICAgIERvY3VtZW50IHdzZGxEb2MgPSBudWxsOwotICAgICAgU3RyaW5nIHdzZGxVUkkgPSAoU3RyaW5nKSBmaWxlSXRlcmF0b3IubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHdzZGxEb2MgPSBYTUxVdGlscy5wYXJzZVhNTERvY3VtZW50VVJMKHdzZGxVUkksIG51bGwpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIEVsZW1lbnQgcm9vdCA9IHdzZGxEb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAvLyBmaW5kIHRoZSBzY2hlbWEKLSAgICAgIE5vZGVMaXN0IHNjaGVtYUVsZW1lbnRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICBXU0lUYWcuRUxFTV9YU0RfU0NIRU1BLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICBXU0lUYWcuRUxFTV9YU0RfU0NIRU1BLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgZm9yIChpbnQgZWxlbSA9IDA7IGVsZW0gPCBzY2hlbWFFbGVtZW50cy5nZXRMZW5ndGgoKTsgZWxlbSsrKQotICAgICAgeyAgICAgCi0gICAgICAgIEVsZW1lbnQgc2NoZW1hID0gKEVsZW1lbnQpIHNjaGVtYUVsZW1lbnRzLml0ZW0oZWxlbSk7Ci0gICAgICAgIC8vIGNvcHlpbmcgYWxsIHRoZSBOUyBkZWNsYXJhdGlvbnMgZnJvbSB3c2RsOmRlZmluaXRpb25zIHdzZGw6dHlwZXMKLSAgICAgICAgY29weU5TRGVjbGFyYXRpb25zKHJvb3QsIHNjaGVtYSk7Ci0gICAgICAgIGNvcHlOU0RlY2xhcmF0aW9ucygoRWxlbWVudCkgc2NoZW1hLmdldFBhcmVudE5vZGUoKSwgc2NoZW1hKTsKLSAgICAgICAgLy8gUmVwbGFjaW5nIGFsbCByZWxhdGl2ZSBzY2hlbWFMb2NhdGlvbiBVUklzIHdpdGggYWJzb2x1dGUgb25lcwotICAgICAgICByZXBsYWNlUmVsYXRpdmVVUklzKHNjaGVtYSwgd3NkbFVSSSk7Ci0gICAgICAgIGlubGluZVNjaGVtYXMuYWRkKHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm90ZSB0aGF0IHRoZSBYZXJjZXMgcGFyc2VyIE9OTFkgYWNjZXB0cyBhbiBhcnJheQotICAgIC8vIG9mIHNjaGVtYXMgd2l0aCB1bmlxdWUgbmFtZXNwYWNlcy4KLSAgICBpZiAoIWR1cGxpY2F0ZU5hbWVzcGFjZXNEZXRlY3RlZChpbmxpbmVTY2hlbWFzKSkKLSAgICB7Ci0gICAgICAvLyBTZXJpYWxpemUgdGhlIHNjaGVtYSBlbGVtZW50cyBpbnNpZGUgdGhlIFR5cGVzLCB0aGVuIHVzZSB0aGlzIGFzCi0gICAgICAvLyB0aGUgc2NoZW1hIHN0cmluZyBmb3IgdGhlIHZhbGlkYXRpb24KLSAgICAgIEl0ZXJhdG9yIGkgPSBpbmxpbmVTY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgCUVsZW1lbnQgc2NoZW1hID0gKEVsZW1lbnQpaS5uZXh0KCk7IAotICAgICAgICBTdHJpbmcgc2NoZW1hU3RyaW5nID0gRE9NMldyaXRlci5ub2RlVG9TdHJpbmcoc2NoZW1hKTsKLSAgICAgICAgc2NoZW1hU3RyaW5ncy5hZGQoc2NoZW1hU3RyaW5nKTsKLSAgICAgIH0KLQotICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3QgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKQotICAgICAgICAuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lUYWcuRUxFTV9TT0FQX0JPRFkuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICBXU0lUYWcuRUxFTV9TT0FQX0JPRFkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgaWYgKGVsZW1lbnRMaXN0ID09IG51bGwgfHwgZWxlbWVudExpc3QuZ2V0TGVuZ3RoKCkgIT0gMSkKLSAgICAgIHsKLSAgICAgICAgLy8gc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc29hcCBib2R5ICEKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBwcm9iYWJseSBhbiBlcnJvciBjb25kaXRpb24gdGhvdWdoCi0gICAgICB9Ci0KLSAgICAgIE5vZGVMaXN0IHNvYXBCb2R5Q2hpbGRMaXN0ID0gKChFbGVtZW50KWVsZW1lbnRMaXN0Lml0ZW0oMCkpLmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGZvciAoaW50IGNoaWxkID0gMDsgY2hpbGQgPCBzb2FwQm9keUNoaWxkTGlzdC5nZXRMZW5ndGgoKTsgY2hpbGQrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBzb2FwQm9keUNoaWxkID0gc29hcEJvZHlDaGlsZExpc3QuaXRlbShjaGlsZCk7Ci0gICAgICAgIGlmIChzb2FwQm9keUNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBkbyBhbGwgZm9yIG5vdwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdyaXRlIG91dCBlbGVtZW50IHRyZWUgdG8gU3RyaW5nCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZUNvbnRlbnQgPSBET00yV3JpdGVyLm5vZGVUb1N0cmluZyhzb2FwQm9keUNoaWxkKTsKLSAgICAgICAgICAgIC8vIHBhcnNlIHRoZSBjaGlsZCBlbGVtZW50LCB2YWxpZGF0aW5nIGFnYWluc3QgdGhlIHNjaGVtYSAKLSAgICAgICAgICAgIFhNTFV0aWxzLnBhcnNlWE1MKG1lc3NhZ2VDb250ZW50LCBzY2hlbWFTdHJpbmdzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgU0FYRXhjZXB0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uIGZhaWxlZAotICAgICAgICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJWYWxpZGF0aW5nIFBhcnNpbmcgcHJvYmxlbSIsIGUpOwotICAgICAgICAgICAgLy8gQmFkIHRoaW5ncyBoYXZlIGhhcHBlbmVkCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9ICAgCi0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIENvcHkgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuCi0gICAqIEBwYXJhbSBwYXJlbnQgYSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY2hpbGQgYSBzdHJpcHBlZCBtZXNzYWdlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNvcHlOU0RlY2xhcmF0aW9ucyhFbGVtZW50IHBhcmVudCwgRWxlbWVudCBjaGlsZCkKLSAgewotICAgIE5hbWVkTm9kZU1hcCBub2RlTWFwID0gcGFyZW50LmdldEF0dHJpYnV0ZXMoKTsKLSAgICBmb3IgKGludCBub2RlSWQgPSAwOyBub2RlSWQgPCBub2RlTWFwLmdldExlbmd0aCgpOyBub2RlSWQrKykKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSBub2RlTWFwLml0ZW0obm9kZUlkKTsKLQotICAgICAgaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgICAgJiYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5zdGFydHNXaXRoKCJ4bWxuczoiKSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgLy8gSWYgYW4gTlMgYmVpbmcgY29waWVkIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY2hpbGQgZWxlbWVudCBoYXMsIGNvcHkgaXQKLSAgICAgICAgaWYgKCFjaGlsZC5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgoCi0gICAgICAgICAgbm9kZU5hbWUuc3Vic3RyaW5nKG5vZGVOYW1lLmluZGV4T2YoIjoiKSArIDEpICsgIjoiKSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBub2RlVmFsdWUgPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShub2RlLmdldE5vZGVOYW1lKCksIG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2VzIGFsbCByZWxhdGl2ZSBVUklzIGZvciBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGVzLgotICAgKiBAcGFyYW0gc2NoZW1hIGFuIHhzZDpzY2hlbWEgZWxlbWVudC4KLSAgICogQHBhcmFtIHdzZGxVUkkgYW4gVVJJIG9mIFdTREwgdGhhdCBjb250YWlucyB4c2Q6c2NoZW1hIGJlaW5nIHByb2Nlc3NlZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlUmVsYXRpdmVVUklzKEVsZW1lbnQgc2NoZW1hLCBTdHJpbmcgd3NkbFVSSSkKLSAgewotICAgIC8vIFJldHJpZXZpbmcgYWxsIHhzZDppbXBvcnQgZWxlbWVudHMKLSAgICBOb2RlTGlzdCBpbXBvcnRzID0gc2NoZW1hLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICBXU0lUYWcuRUxFTV9YU0RfSU1QT1JULmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgV1NJVGFnLkVMRU1fWFNEX0lNUE9SVC5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IGltcCA9IChFbGVtZW50KSBpbXBvcnRzLml0ZW0oaSk7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLSAgICAgIEF0dHIgc2NoZW1hTG9jYXRpb24gPQotICAgICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoaW1wLCBXU0lUYWcuQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04pOwotICAgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50Ci0gICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gVHJ5aW5nIHRvIGNyZWF0ZSBhbiBVUkkgb2JqZWN0IHVzaW5nIGF0dHJpYnV0ZSdzIHZhbHVlCi0gICAgICAgIFVSSSB1cmkgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHVyaSA9IG5ldyBVUkkoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IGFuIGFic29sdXRlIFVSSSAodGhlIFVSSSBjb25zdHJ1Y3RvciB0aHJvd3MgdGhlCi0gICAgICAgIC8vIE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiksIGNyZWF0aW5nIHRoZSBhYnNvbHV0ZSBVUkkgdXNpbmcgd3NkbFVSSQotICAgICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbmV3VVJJID0gd3NkbFVSSS5zdWJzdHJpbmcoMCwgd3NkbFVSSS5sYXN0SW5kZXhPZigiLyIpICsgMSkKLSAgICAgICAgICAgICsgc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1cmkgPSBuZXcgVVJJKG5ld1VSSSk7Ci0gICAgICAgICAgICAvLyBTZXR0aW5nIGEgbmV3IFVSSSBhcyBhIHZhbHVlIGZvciB0aGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0gICAgICAgICAgICBzY2hlbWFMb2NhdGlvbi5zZXRWYWx1ZSh1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGJpbmRpbmcgb3BlcmF0aW9uIG1hdGNoZWQgZm9yIFNPQVAgbWVzc2FnZS4KLSAgICogQHBhcmFtIGVudHJ5VHlwZSBtZXNzYWdlIGVudHJ5IHR5cGUuCi0gICAqIEBwYXJhbSBkb2MgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIGFueSBiaW5kaW5nIG9wZXJhdGlvbiBtYXRjaGVkLCBudWxsIGlmIGl0IGlzIG5vdCBmb3VuZC4KLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGdldE9wZXJhdGlvbk1hdGNoKEVudHJ5VHlwZSBlbnRyeVR5cGUsIERvY3VtZW50IGRvYykgCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IFNPQVAgQm9keSBjaGlsZCBlbGVtZW50Ci0gICAgICBRTmFtZSBvcGVyYXRpb24gPSBnZXRPcGVyYXRpb25Gcm9tTWVzc2FnZShkb2MpOwotICAgICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBSZXRyaWV2aW5nIGFsbCB0aGUgUlBDIGJpbmRpbmcgb3BlcmF0aW9ucyBmcm9tIHdzZGw6YmluZGluZwotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uW10gcnBjQmluZGluZ09wcyA9IGdldE1hdGNoaW5nQmluZGluZ09wcygKLSAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDLAotICAgICAgICAgIGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKSk7Ci0gICAgICAgIC8vIFJldHJpZXZpbmcgYmluZGluZyBvcGVyYXRpb24gYnkgdGhlIGdpdmVuIG9wZXJhdGlvbiBuYW1lCi0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24gPSBnZXRPcGVyYXRpb25NYXRjaCgKLSAgICAgICAgICBlbnRyeVR5cGUsIG9wZXJhdGlvbiwgcnBjQmluZGluZ09wcyk7Ci0gICAgICAgIC8vIElmIG5vIG9uZSBSUEMgb3BlcmF0aW9uIG1hdGNoZWQKLSAgICAgICAgaWYoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmV0cmlldmluZyBhbGwgdGhlIGRvY3VtZW50IGJpbmRpbmcgb3BlcmF0aW9ucyBmcm9tIHdzZGw6YmluZGluZwotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBkb2NCaW5kaW5nT3BlcmF0aW9ucyA9IGdldE1hdGNoaW5nQmluZGluZ09wcygKLSAgICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MsCi0gICAgICAgICAgICBhbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKCkpOwotICAgICAgICAgIC8vIFJldHJpZXZpbmcgYmluZGluZyBvcGVyYXRpb24gYnkgZ2l2ZW4gZWxlbWVudCBuYW1lCi0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbltdIHBvdGVudGlhbERvY0xpdE9wcyA9Ci0gICAgICAgICAgICBnZXREb2NMaXRPcGVyYXRpb25zKGVudHJ5VHlwZSwgb3BlcmF0aW9uLCBkb2NCaW5kaW5nT3BlcmF0aW9ucyk7Ci0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgb3BlcmF0aW9uIG1hdGNoZWQKLSAgICAgICAgICBpZiAocG90ZW50aWFsRG9jTGl0T3BzLmxlbmd0aCA9PSAxKQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbiA9IHBvdGVudGlhbERvY0xpdE9wc1swXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0KLSAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBNYXRjaCBlaXRoZXIgSW5wdXQgb3IgT3V0cHV0LgotICAgKiBAcGFyYW0gbWVzc2FnZUVudHJ5VHlwZSBtZXNzYWdlIGVudHJ5IHR5cGUuCi0gICAqIEBwYXJhbSBzb2FwTWVzc2FnZSBzb2FwIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBvcCBiaW5kaW5nIG9wZXJhdGlvbnMuCi0gICAqIEByZXR1cm4gbWF0Y2hlZCBvcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb25NYXRjaCgKLSAgICBFbnRyeVR5cGUgbWVzc2FnZUVudHJ5VHlwZSwKLSAgICBEb2N1bWVudCBzb2FwTWVzc2FnZSwKLSAgICBCaW5kaW5nT3BlcmF0aW9uW10gb3ApCi0gIHsKLSAgICAvLyBHZXQgb3BlcmF0aW9uIGZyb20gbWVzc2FnZQotICAgIFFOYW1lIG9wZXJhdGlvbiA9IGdldE9wZXJhdGlvbkZyb21NZXNzYWdlKHNvYXBNZXNzYWdlKTsKLSAgICAvLyBsaXN0IG9mIFFOYW1lcwotCi0gICAgcmV0dXJuIGdldE9wZXJhdGlvbk1hdGNoKG1lc3NhZ2VFbnRyeVR5cGUsIG9wZXJhdGlvbiwgb3ApOwotICB9Ci0KLSAgLyoqCi0gICAqIE1hdGNoIGVpdGhlciBJbnB1dCBvciBPdXRwdXQuCi0gICAqIEBwYXJhbSBtZXNzYWdlRW50cnlUeXBlIG1lc3NhZ2UgZW50cnkgdHlwZS4KLSAgICogQHBhcmFtIG9wZXJhdGlvbiBTT0FQIG9wZXJhdGlvbiBuYW1lLgotICAgKiBAcGFyYW0gb3AgYmluZGluZyBvcGVyYXRpb25zLgotICAgKiBAcmV0dXJuIG1hdGNoZWQgb3BlcmF0aW9uLgotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgRW50cnlUeXBlIG1lc3NhZ2VFbnRyeVR5cGUsCi0gICAgUU5hbWUgb3BlcmF0aW9uLAotICAgIEJpbmRpbmdPcGVyYXRpb25bXSBvcCkKLSAgewotICAgIFFOYW1lIGNoZWNrT3BlcmF0aW9uOwotCi0gICAgLy8gTG9vayBmb3IgYSBjYW5kaWRhdGUgb3BlcmF0aW9uIGluIHRoZSB3c2RsIHRoYXQgbWF0Y2hlcyB0aGlzIHNpZ25hdHVyZS4KLSAgICBmb3IgKGludCBrID0gMDsgayA8IG9wLmxlbmd0aDsgaysrKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgIExpc3QgZXh0ZW5zaWJsZXMgPSBudWxsOwotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPSBvcFtrXTsKLQotICAgICAgaWYgKG1lc3NhZ2VFbnRyeVR5cGUuaXNUeXBlKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVRVUVTVCkKLSAgICAgICAgJiYgKGJpbmRpbmdPcC5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpICE9IG51bGwpKQotICAgICAgewotICAgICAgICBuYW1lID0gYmluZGluZ09wLmdldE9wZXJhdGlvbigpLmdldE5hbWUoKTsKLSAgICAgICAgZXh0ZW5zaWJsZXMgPSBiaW5kaW5nT3AuZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgKLSAgICAgICAgbWVzc2FnZUVudHJ5VHlwZS5pc1R5cGUoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVNQT05TRSkKLSAgICAgICAgICAmJiAoYmluZGluZ09wLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpICE9IG51bGwpKQotICAgICAgewotICAgICAgICBuYW1lID0gYmluZGluZ09wLmdldE9wZXJhdGlvbigpLmdldE5hbWUoKSArICJSZXNwb25zZSI7Ci0gICAgICAgIGV4dGVuc2libGVzID0gYmluZGluZ09wLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0IHNvYXA6Ym9keQotICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBnZXRTb2FwQm9keShleHRlbnNpYmxlcyk7Ci0gICAgICBpZiAoc29hcEJvZHkgPT0gbnVsbCkKLSAgICAgICAgY2hlY2tPcGVyYXRpb24gPSBuZXcgUU5hbWUobmFtZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGNoZWNrT3BlcmF0aW9uID0gbmV3IFFOYW1lKHNvYXBCb2R5LmdldE5hbWVzcGFjZVVSSSgpLCBuYW1lKTsKLQotICAgICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsICYmIG9wZXJhdGlvbi5lcXVhbHMoY2hlY2tPcGVyYXRpb24pKQotICAgICAgewotICAgICAgICByZXR1cm4gKGJpbmRpbmdPcCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIE1hdGNoIGVpdGhlciBJbnB1dCBvciBPdXRwdXQuCi0gICAqIEBwYXJhbSBtZXNzYWdlRW50cnlUeXBlIGEgbWVzc2FnZSBlbnRyeSB0eXBlLgotICAgKiBAcGFyYW0gc29hcE1lc3NhZ2UgYSBzb2FwIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBvcCBiaW5zaW5nIG9wZXJhdGlvbnMuCi0gICAqIEByZXR1cm4gbWF0Y2hlZCBvcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb25QYXJ0c01hdGNoKAotICAgIEVudHJ5VHlwZSBtZXNzYWdlRW50cnlUeXBlLAotICAgIERvY3VtZW50IHNvYXBNZXNzYWdlLAotICAgIEJpbmRpbmdPcGVyYXRpb25bXSBvcCkKLSAgewotICAgIE1hcCBwYXJ0cyA9IGdldFBhcnRMaXN0RnJvbU1lc3NhZ2Uoc29hcE1lc3NhZ2UpOyAvLyBsaXN0IG9mIFFOYW1lcwotCi0gICAgLy8gTG9vayBmb3IgYSBjYW5kaWRhdGUgb3BlcmF0aW9uIGluIHRoZSB3c2RsIHRoYXQgbWF0Y2hlcyB0aGlzIHNpZ25hdHVyZS4KLSAgICBmb3IgKGludCBrID0gMDsgayA8IG9wLmxlbmd0aDsgaysrKQotICAgIHsKLQotICAgICAgTWVzc2FnZSB3c2RsTWVzc2FnZSA9IG51bGw7Ci0gICAgICBMaXN0IGV4dGVuc2libGVzID0gbnVsbDsKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wID0gb3Bba107Ci0KLSAgICAgIGlmIChtZXNzYWdlRW50cnlUeXBlLmlzVHlwZShFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFUVVFU1QpCi0gICAgICAgICYmIChiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKSAhPSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgd3NkbE1lc3NhZ2UgPSBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGV4dGVuc2libGVzID0gYmluZGluZ09wLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoCi0gICAgICAgIG1lc3NhZ2VFbnRyeVR5cGUuaXNUeXBlKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVTUE9OU0UpCi0gICAgICAgICAgJiYgKGJpbmRpbmdPcC5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKSAhPSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgd3NkbE1lc3NhZ2UgPSBiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICBleHRlbnNpYmxlcyA9IGJpbmRpbmdPcC5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICAvL3dzZGxGYXVsdFBhcnRzID0gb3Bba10uZ2V0RmF1bHRzKCk7Ci0gICAgICAvLyBBREQ6IGNoZWNrIGZvciBjYXNlIHdoZW4gcmVzcG9uc2UgbWVzc2FnZSBpcyBhIGZhdWx0Ci0KLSAgICAgIGlmIChzYW1lUGFydHMocGFydHMsIHdzZGxNZXNzYWdlLCBnZXRTb2FwSGVhZGVyKGV4dGVuc2libGVzKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoYmluZGluZ09wKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiogCi0gICAqIEJpbmRpbmdPcGVyYXRpb24gZ2V0T3BlcmF0aW9uUGFydHNNYXRjaCguLikuCi0gICAqIAotICAgKiBGaW5kIG9uZSBvciBtb3JlIG1hdGNoaW5nIGJpbmRpbmcgb3BlcmF0aW9ucyBmcm9tIHRoZSBXU0RMIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAqIGdpdmVuIHJlcXVlc3QtcmVzcG9uc2Ugc2lnbmF0dXJlLgotICAgKiAKLSAgICogVGhpcyBvdmVybG9hZGVkIHZlcnNpb24gaXMgaW50ZW5kZWQgZm9yIHBvc3NpYmxlIENvcnJlbGF0aW9uIG9ubHkgKG5vdCBhc3NlcnRpb25zKSwKLSAgICogc2luY2UgaXQgY2hlY2tzIGZvciBhbiBvcGVyYXRpb24gc2lnbmF0dXJlIG9uIGEgcmVxdWVzdC1yZXNwb25zZSBwYWlyLgotICAgKiBBc3NlcnRpb25zIG5vdyBjaGVjayByZXF1ZXN0ICYgcmVzcG9uc2UgbWVzc2FnZXMgaW5kZXBlbmRlbnRseS4gCi0gICAqIEBwYXJhbSByZXF1ZXN0TWVzc2FnZSBhIHJlcXVlc3QgbWVzc2FnZS4KLSAgICogQHBhcmFtIHJlc3BvbnNlTWVzc2FnZSBhIHJlc3BvbnNlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBvcCBiaW5kaW5nIG9wZXJhdGlvbnMuCi0gICAqIEByZXR1cm4gbWF0Y2hlZCBvcGVyYXRpb24uCi0gICAqLwotICBwcml2YXRlIEJpbmRpbmdPcGVyYXRpb24gZ2V0T3BlcmF0aW9uUGFydHNNYXRjaCgKLSAgICBEb2N1bWVudCByZXF1ZXN0TWVzc2FnZSwKLSAgICBEb2N1bWVudCByZXNwb25zZU1lc3NhZ2UsCi0gICAgQmluZGluZ09wZXJhdGlvbltdIG9wKQotICB7Ci0gICAgTWFwIGluUGFydHMgPSBnZXRQYXJ0TGlzdEZyb21NZXNzYWdlKHJlcXVlc3RNZXNzYWdlKTsgLy8gbGlzdCBvZiBRTmFtZXMKLSAgICBNYXAgb3V0UGFydHMgPSBnZXRQYXJ0TGlzdEZyb21NZXNzYWdlKHJlc3BvbnNlTWVzc2FnZSk7Ci0gICAgLy8gbGlzdCBvZiBRTmFtZXMKLQotICAgIC8vIExvb2sgZm9yIGEgY2FuZGlkYXRlIG9wZXJhdGlvbiBpbiB0aGUgd3NkbCB0aGF0IG1hdGNoZXMgdGhpcyBzaWduYXR1cmUuCi0gICAgZm9yIChpbnQgayA9IDA7IGsgPCBvcC5sZW5ndGg7IGsrKykKLSAgICB7Ci0KLSAgICAgIC8vTWFwIHdzZGxGYXVsdFBhcnRzID0gbnVsbDsKLSAgICAgIE1lc3NhZ2Ugd3NkbEluTWVzc2FnZSA9IG51bGw7Ci0gICAgICBNZXNzYWdlIHdzZGxPdXRNZXNzYWdlID0gbnVsbDsKLQotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPSBvcFtrXTsKLSAgICAgIGlmIChiaW5kaW5nT3AuZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB3c2RsSW5NZXNzYWdlID0gYmluZGluZ09wLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgfQotCi0gICAgICBpZiAoYmluZGluZ09wLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHdzZGxPdXRNZXNzYWdlID0gYmluZGluZ09wLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgIH0KLSAgICAgIC8vd3NkbEZhdWx0UGFydHMgPSBvcFtrXS5nZXRGYXVsdHMoKTsKLSAgICAgIC8vIEFERDogY2hlY2sgZm9yIGNhc2Ugd2hlbiByZXNwb25zZSBtZXNzYWdlIGlzIGEgZmF1bHQKLQotICAgICAgaWYgKHNhbWVQYXJ0cyhpblBhcnRzLAotICAgICAgICB3c2RsSW5NZXNzYWdlLAotICAgICAgICBnZXRTb2FwSGVhZGVyKGJpbmRpbmdPcC5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkpKQotICAgICAgewotICAgICAgICAvLyBtYXRjaCBvbiB0aGUgcmVxdWVzdCAtIG5vdyBjaGVjayByZXNwb25zZSBpZiBpdHMgbm90IGEgZmF1bHQKLSAgICAgICAgaWYgKHJlc3BvbnNlTWVzc2FnZSAhPSBudWxsICYmIGlzRmF1bHQocmVzcG9uc2VNZXNzYWdlKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiAoYmluZGluZ09wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgKLSAgICAgICAgICBzYW1lUGFydHMoCi0gICAgICAgICAgICBvdXRQYXJ0cywKLSAgICAgICAgICAgIHdzZGxPdXRNZXNzYWdlLAotICAgICAgICAgICAgZ2V0U29hcEhlYWRlcigKLSAgICAgICAgICAgICAgYmluZGluZ09wLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSXQgZG9lcyBtYXRjaCBzbyB0cmVhdCB0aGlzIGFzIGEgcmVsZXZhbnQgbWVzc2FnZSBwYWlyLiAKLSAgICAgICAgICAvLyBMZXQgdGhlIG1lc3NhZ2UgdGhyb3VnaCBmb3IgdmFsaWRhdGlvbi4KLSAgICAgICAgICAvL0FERDogY291bGQgcGFzcyB0aGUgb3BlcmF0aW9ucyBsaXN0IGJhY2sgdG8gdGhlIGVudHJ5Q29udGV4dCBmb3IgdGhlIG1lc3NhZ2UuCi0gICAgICAgICAgcmV0dXJuIChiaW5kaW5nT3ApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgc29hcDpib2R5IGZyb20gYSBMaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBleHRFbGVtcyBhIGxpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICogQHJldHVybiB0aGUgc29hcDpib2R5IGZyb20gYSBMaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAqLwotICBwcml2YXRlIFNPQVBCb2R5IGdldFNvYXBCb2R5KExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICAvLyBGaW5kIHRoZSBzb2FwIGJvZHkKLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dEVsZW1zLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaSk7Ci0gICAgICAgIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTSVRhZy5XU0RMX1NPQVBfQk9EWSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gKFNPQVBCb2R5KSBleHRFbGVtOwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICBlbHNlIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTSVRhZy5XU0RMX01JTUVfTVVMVElQQVJUKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIG1pbWU6cGFydCBlbGVtZW50cyBvZiB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgICAgTGlzdCBtaW1lUGFydHMgPSAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtKS5nZXRNSU1FUGFydHMoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzCi0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtaW1lUGFydHMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1pbWU6Y29udGVudCBlbGVtZW50cyBvZiB0aGlzIG1pbWU6cGFydAotICAgICAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBnZXRTb2FwQm9keSgKLSAgICAgICAgICAgICAgKChNSU1FUGFydCkgbWltZVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgaWYgKHNvYXBCb2R5ICE9IG51bGwpCi0gICAgICAgICAgICAgIHJldHVybiBzb2FwQm9keTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIFNPQVBIZWFkZXIgZnJvbSBhIExpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICogQHBhcmFtIGV4dGVuc2libGVzIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRoZSBTT0FQSGVhZGVyIGZyb20gYSBMaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAqLwotICBwcml2YXRlIFNPQVBIZWFkZXIgZ2V0U29hcEhlYWRlcihMaXN0IGV4dGVuc2libGVzKQotICB7Ci0gICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gbnVsbDsKLQotICAgIC8vIGZpbmQgdGhlIHNvYXAgaGVhZGVyCi0gICAgaWYgKGV4dGVuc2libGVzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaSA9IGV4dGVuc2libGVzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaS5oYXNOZXh0KCkgJiYgc29hcEhlYWRlciA9PSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHNvYXBIZWFkZXIgPSAoU09BUEhlYWRlcikgaS5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvYXBIZWFkZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGZpcnN0IHBhcnQgbmFtZSBmcm9tIHNvYXBiaW5kOmJvZHkgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldEZpcnN0UGFydE5hbWUoQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgU3RyaW5nIHBhcnROYW1lID0gbnVsbDsKLSAgICBMaXN0IGV4dExpc3QgPSBudWxsOwotICAgIEl0ZXJhdG9yIHBhcnRzSXRlcmF0b3IgPSBudWxsOwotCi0gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgbGlzdCBvZiBwYXJ0cyBieSBmaW5kaW5nIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQKLSAgICBpZiAoKGV4dExpc3QgPQotICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSkKLSAgICAgICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCBwYXJ0c0xpc3QgPSBudWxsOwotICAgICAgSXRlcmF0b3IgZXh0SXRlcmF0b3IgPSBleHRMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZXh0SXRlcmF0b3IuaGFzTmV4dCgpICYmIChwYXJ0TmFtZSA9PSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IGV4dEVsZW1lbnQgPSBleHRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChleHRFbGVtZW50IGluc3RhbmNlb2YgU09BUEJvZHkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoKHBhcnRzTGlzdCA9ICgoU09BUEJvZHkpIGV4dEVsZW1lbnQpLmdldFBhcnRzKCkpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFydHNJdGVyYXRvciA9IHBhcnRzTGlzdC5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgZG9jIGxpdGVyYWwgYmluZGluZyB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgcGFydCBuYW1lCi0gICAgICAgICAgICBpZiAocGFydHNJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgIHBhcnROYW1lID0gKFN0cmluZykgcGFydHNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhcnROYW1lOwotICB9Ci0KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb25bXSBnZXREb2NMaXRPcGVyYXRpb25zKAotICAgIEVudHJ5VHlwZSBtZXNzYWdlVHlwZSwKLSAgICBRTmFtZSBwYXJ0RWxlbWVudFFOYW1lLAotICAgIEJpbmRpbmdPcGVyYXRpb25bXSB3c2RsT3BlcmF0aW9ucykKLSAgewotCi0gICAgaWYgKG1lc3NhZ2VUeXBlLmlzVHlwZShFbnRyeVR5cGUuRU5UUllfVFlQRV9SRVFVRVNUKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0SW5wdXREb2NMaXRPcGVyYXRpb25zKHBhcnRFbGVtZW50UU5hbWUsIHdzZGxPcGVyYXRpb25zKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobWVzc2FnZVR5cGUuaXNUeXBlKEVudHJ5VHlwZS5FTlRSWV9UWVBFX1JFU1BPTlNFKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0T3V0cHV0RG9jTGl0T3BlcmF0aW9ucyhwYXJ0RWxlbWVudFFOYW1lLCB3c2RsT3BlcmF0aW9ucyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsgLy8gc2hvdWxkIGJlIG9uZSBvciB0aGUgb3RoZXIKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIEJpbmRpbmdPcGVyYXRpb25bXSBnZXRJbnB1dERvY0xpdE9wZXJhdGlvbnMoCi0gICAgUU5hbWUgcGFydEVsZW1lbnRRTmFtZSwKLSAgICBCaW5kaW5nT3BlcmF0aW9uW10gd3NkbE9wZXJhdGlvbnMpCi0gIHsKLQotICAgIFZlY3RvciBwb3RlbnRpYWxPcHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxPcGVyYXRpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh3c2RsT3BlcmF0aW9uc1tpXS5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IHdzZGxPcGVyYXRpb25zW2ldLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICAvLyBJZiBTT0FQIEJvZHkgY2hpbGQgZWxlbWVudCBpcyBub3QgcHJlc2VudCBhbmQgd3NkbDptZXNzYWdlIGRvZXMgbm90IGhhdmUgYW55IHdzZGw6cGFydHMsIHRoYXQgaXMgdGhlIG1hdGNoIAotICAgICAgICBpZiAocGFydEVsZW1lbnRRTmFtZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0UGFydHMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBwb3RlbnRpYWxPcHMuYWRkKHdzZGxPcGVyYXRpb25zW2ldKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yIHBhcnRzSXQgPSBtZXNzYWdlLmdldFBhcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHBhcnRzSXQuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBuZXh0UGFydCA9IChQYXJ0KSBwYXJ0c0l0Lm5leHQoKTsKLSAgICAgICAgICBpZiAocGFydEVsZW1lbnRRTmFtZS5lcXVhbHMobmV4dFBhcnQuZ2V0RWxlbWVudE5hbWUoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcGFydCBmb3VuZCAoZG9jLWxpdCkgLSBhZGQgdG8gbGlzdCBvZiBwb3NzaWJsZSBvcGVyYXRpb24gbWF0Y2hlcwotICAgICAgICAgICAgcG90ZW50aWFsT3BzLmFkZCh3c2RsT3BlcmF0aW9uc1tpXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChCaW5kaW5nT3BlcmF0aW9uW10pIHBvdGVudGlhbE9wcy50b0FycmF5KG5ldyBCaW5kaW5nT3BlcmF0aW9uWzBdKTsKLSAgfQotCi0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbltdIGdldE91dHB1dERvY0xpdE9wZXJhdGlvbnMoCi0gICAgUU5hbWUgcGFydEVsZW1lbnRRTmFtZSwKLSAgICBCaW5kaW5nT3BlcmF0aW9uW10gd3NkbE9wZXJhdGlvbnMpCi0gIHsKLQotICAgIFZlY3RvciBwb3RlbnRpYWxPcHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxPcGVyYXRpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIGlmICh3c2RsT3BlcmF0aW9uc1tpXS5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSB3c2RsT3BlcmF0aW9uc1tpXS5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIC8vIElmIFNPQVAgQm9keSBjaGlsZCBlbGVtZW50IGlzIG5vdCBwcmVzZW50IGFuZCB3c2RsOm1lc3NhZ2UgZG9lcyBub3QgaGF2ZSBhbnkgd3NkbDpwYXJ0cywgdGhhdCBpcyB0aGUgbWF0Y2gKLSAgICAgICAgaWYgKHBhcnRFbGVtZW50UU5hbWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtZXNzYWdlLmdldFBhcnRzKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgcG90ZW50aWFsT3BzLmFkZCh3c2RsT3BlcmF0aW9uc1tpXSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBJdGVyYXRvciBwYXJ0c0l0ID0gbWVzc2FnZS5nZXRQYXJ0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChwYXJ0c0l0Lmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFBhcnQgbmV4dFBhcnQgPSAoUGFydCkgcGFydHNJdC5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHBhcnRFbGVtZW50UU5hbWUuZXF1YWxzKG5leHRQYXJ0LmdldEVsZW1lbnROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIG1hdGNoaW5nIHBhcnQgZm91bmQgKGRvYy1saXQpIC0gYWRkIHRvIGxpc3Qgb2YgcG9zc2libGUgb3BlcmF0aW9uIG1hdGNoZXMKLSAgICAgICAgICAgIHBvdGVudGlhbE9wcy5hZGQod3NkbE9wZXJhdGlvbnNbaV0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAoQmluZGluZ09wZXJhdGlvbltdKSBwb3RlbnRpYWxPcHMudG9BcnJheShuZXcgQmluZGluZ09wZXJhdGlvblswXSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcGFyZSBzb2FwIG1lc3NhZ2UgZWxlbWVudCBwYXJ0IG5hbWVzIHdpdGggUGFydHMgZnJvbSBzcGVjaWZpZWQgd3NkbCBPcGVyYXRpb24KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzYW1lUGFydHMoSGFzaFNldCBtZXNzYWdlUGFydHMsIE1hcCB3c2RsUGFydHMpCi0gIHsKLQotICAgIC8vIGxvb2sgZm9yIHRoZSBzb2FwLW1lc3NhZ2Ugb3BlcmF0aW9uIHNpZ25hdHVyZQotICAgIEl0ZXJhdG9yIGkgPSB3c2RsUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAvLyBidWlsZCBhIHNldCBvZiBQYXJ0IG5hbWVzCi0gICAgSGFzaFNldCBoID0gbmV3IEhhc2hTZXQoKTsKLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUGFydCBwID0gKFBhcnQpIGkubmV4dCgpOwotICAgICAgaC5hZGQocC5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8vIGNvbXBhcmUgd2l0aCB0aGUgcGFydHMgbGlzdCBmcm9tIHRoZSBtZXNzYWdlCSh1bm9yZGVyZWQpCi0gICAgcmV0dXJuIChoLmVxdWFscyhtZXNzYWdlUGFydHMpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wYXJlIHNvYXAgbWVzc2FnZSBlbGVtZW50IHBhcnQgbmFtZXMgd2l0aCBQYXJ0cyBmcm9tIHNwZWNpZmllZCB3c2RsIE9wZXJhdGlvbgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHNhbWVQYXJ0cygKLSAgICBNYXAgbWVzc2FnZVBhcnRzLAotICAgIE1lc3NhZ2Ugd3NkbE1lc3NhZ2UsCi0gICAgU09BUEhlYWRlciBzb2FwSGVhZGVyKQotICB7Ci0KLSAgICBTdHJpbmcgc29hcEhlYWRlclBhcnQgPSBudWxsOwotICAgIGlmIChzb2FwSGVhZGVyICE9IG51bGwpCi0gICAgICBzb2FwSGVhZGVyUGFydCA9IHNvYXBIZWFkZXIuZ2V0UGFydCgpOwotCi0gICAgLy8gY2hlY2sgbnVsbCBjb25kaXRpb25zCi0gICAgaWYgKG1lc3NhZ2VQYXJ0cyA9PSBudWxsICYmIHdzZGxNZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7IC8vIHNpbXBsZSBlcXVhbGl0eSB0ZXN0Ci0gICAgfQotICAgIGVsc2UgaWYgKG1lc3NhZ2VQYXJ0cyA9PSBudWxsIHx8IHdzZGxNZXNzYWdlID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIC8vTGlzdCB3c2RsUGFydHMgPSB3c2RsTWVzc2FnZS5nZXRPcmRlcmVkUGFydHMobnVsbCk7Ci0gICAgTWFwIHdzZGxQYXJ0cyA9IG51bGw7Ci0gICAgaWYgKHdzZGxNZXNzYWdlLmdldFBhcnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB3c2RsUGFydHMgPSB3c2RsTWVzc2FnZS5nZXRQYXJ0cygpOwotICAgICAgLy8gbG9vayBmb3IgdGhlIHNvYXAtbWVzc2FnZSBvcGVyYXRpb24gc2lnbmF0dXJlCi0gICAgICBJdGVyYXRvciBpID0gd3NkbFBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAvLyBidWlsZCBhIHNldCBvZiBQYXJ0IG5hbWVzICAgIAotICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQYXJ0IHAgPSAoUGFydCkgaS5uZXh0KCk7Ci0gICAgICAgIC8vIGRvIG5vdCBpbmNsdWRlIHRoZSBwYXJ0IGZvciB0aGUgc29hcDpoZWFkZXIgKGlmIGFueSkKLSAgICAgICAgaWYgKCFwLmdldE5hbWUoKS5lcXVhbHMoc29hcEhlYWRlclBhcnQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgcGFydCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNvYXA6Ym9keQotICAgICAgICAgIHYuYWRkKG5ldyBRTmFtZShwLmdldE5hbWUoKSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBpZiBvbmUgb2YgdGhlIHBhcnRzIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNvYXA6aGVhZGVyIGluIHRoZSBiaW5kaW5nCi0gICAgICAvLyAoYnkgPHNvYXA6aGVhZGVyIHBhcnQ9IntwYXJ0bmFtZX0iPiksIHJlbW92ZSB0aGlzIGZyb20gdGhlIHNldAotCi0gICAgfQotCi0gICAgLy8gY29tcGFyZSB3aXRoIHRoZSBwYXJ0cyBsaXN0IGZyb20gdGhlIG1lc3NhZ2UJKG9yZGVyZWQpCi0gICAgaWYgKHYuaXNFbXB0eSgpICYmIG1lc3NhZ2VQYXJ0cy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gUEI6IENoYW5nZWQgdG8gY29udGFpbnNBbGwoKSBzaW5jZSBlcXVhbHMoKSBmYWlscyB3aGVuIHVzaW5nIEpSRSAxLjQKLSAgICBpZiAodi5jb250YWluc0FsbChtZXNzYWdlUGFydHMua2V5U2V0KCkpCi0gICAgICAmJiAodi5zaXplKCkgPT0gbWVzc2FnZVBhcnRzLnNpemUoKSkpCi0gICAgewotICAgICAgLy8gQ2hlY2sgZm9yIHhzaTp0eXBlIG1pc21hdGNoCi0gICAgICBJdGVyYXRvciBwYXJ0cyA9IG1lc3NhZ2VQYXJ0cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgUU5hbWUgcGFydE5hbWUsIHhzaVR5cGU7Ci0gICAgICB3aGlsZSAocGFydHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBwYXJ0TmFtZSA9IChRTmFtZSkgcGFydHMubmV4dCgpOwotCi0gICAgICAgIC8vIEdldCB4c2k6dHlwZSBRTmFtZQotICAgICAgICBpZiAoKHhzaVR5cGUgPSAoUU5hbWUpIG1lc3NhZ2VQYXJ0cy5nZXQocGFydE5hbWUpKSAhPSBudWxsCi0gICAgICAgICAgJiYgd3NkbFBhcnRzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgdGhlIFdTREwgcGFydCBkZWZpbml0aW9uCi0gICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIHdzZGxQYXJ0cy5nZXQocGFydE5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAgICAgLy8gSWYgeHNpVHlwZSBpcyBOT1QgZGVyaXZlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcGFydAotICAgICAgICAgIGlmICghaXNEZXJpdmVkVHlwZSh4c2lUeXBlLCBwYXJ0LmdldFR5cGVOYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vcmV0dXJuICh2LmVxdWFscyhtZXNzYWdlUGFydHMpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciBvbmUgc2NoZW1hIHR5cGUgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIuCi0gICAqIEBwYXJhbSBleHRUeXBlIGFuIGFzc3VtZWQgZGVyaXZlZCB0eXBlLgotICAgKiBAcGFyYW0gdHlwZSBhbiBhc3N1bWVkIGJhc2UgdHlwZS4KLSAgICogQHJldHVybiB0cnVlIGlmIGV4dFR5cGUgaXMgZGVyaXZlZCBmcm9tIHR5cGUsIGZhbHNlIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNEZXJpdmVkVHlwZShRTmFtZSBleHRUeXBlLCBRTmFtZSB0eXBlKQotICB7Ci0gICAgLy8gSWYgZWl0aGVyIG9mIHR5cGVzIGlzIG51bGwsIHJldHVybiBmYWxzZQotICAgIGlmIChleHRUeXBlID09IG51bGwgfHwgdHlwZSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vIElmIHRoZSB0eXBlcyBhcmUgZXF1YWwsIHJldHVybiB0cnVlCi0gICAgaWYgKGV4dFR5cGUuZXF1YWxzKHR5cGUpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCBzY2hlbWFzIAotICAgIEl0ZXJhdG9yIGkgPSB3c2RsRG9jdW1lbnQuZ2V0U2NoZW1hcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFhTTW9kZWwgeHNNb2RlbCA9IChYU01vZGVsKSBpLm5leHQoKTsKLSAgICAgIC8vIFJldHJpZXZpbmcgdGhlIGRlcml2ZWQgdHlwZSBkZWZpbml0aW9uCi0gICAgICBYU1R5cGVEZWZpbml0aW9uIHhzVHlwZSA9IHhzTW9kZWwuZ2V0VHlwZURlZmluaXRpb24oCi0gICAgICAgIGV4dFR5cGUuZ2V0TG9jYWxQYXJ0KCksIGV4dFR5cGUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgLy8gSWYgaXQgaXMgZm91bmQgYW5kIGRlcml2ZWQgZnJvbSB0aGUgYmFzZSB0eXBlLCByZXR1cm4gdHJ1ZQotICAgICAgaWYgKHhzVHlwZSAhPSBudWxsICYmIHhzVHlwZS5kZXJpdmVkRnJvbSh0eXBlLmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICB0eXBlLmdldExvY2FsUGFydCgpLCBYU0NvbnN0YW50cy5ERVJJVkFUSU9OX05PTkUpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZXh0VHlwZSBpcyBub3QgZGVyaXZlZCBmcm9tIHR5cGUsIHJldHVybiBmYWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAJKiBHZXQgYSBsaXN0IG9mIFFOYW1lcyBvZiBwYXJ0cyBmcm9tIHRoZSBzb2FwIGJvZHkgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlCi0gIAkqLwotICBwdWJsaWMgRWxlbWVudCBnZXRTb2FwQm9keUNoaWxkKERvY3VtZW50IGRvYykKLSAgewotCi0gICAgRWxlbWVudCBvcEVsZW0gPSBudWxsOwotICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBOb2RlTGlzdCBib2RpZXMgPQotICAgICAgICByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiQm9keSIpOwotICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHNvYXA6Ym9keSBjaGlsZCBlbGVtZW50IG5hbWVzIGZyb20gdGhlIHJlcXVlc3QgbWVzc2FnZQotICAgICAgaWYgKGJvZGllcyAhPSBudWxsICYmIGJvZGllcy5nZXRMZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgYm9keSA9IChFbGVtZW50KSBib2RpZXMuaXRlbSgwKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBib2R5LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKSAmJiBvcEVsZW0gPT0gbnVsbDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBuID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgb3BFbGVtID0gKEVsZW1lbnQpIG47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvcEVsZW07Ci0gIH0KLQotICAvKiogQ2hlY2sgd2hldGhlciB0aGlzIG1lc3NhZ2UgaXMgYSBzb2FwIGZhdWx0Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZhdWx0KERvY3VtZW50IGRvYykKLSAgewotICAgIGJvb2xlYW4gaXNGYXVsdCA9IGZhbHNlOwotCi0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIGlzRmF1bHQgPQotICAgICAgICAocm9vdAotICAgICAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwgIkZhdWx0IikKLSAgICAgICAgICAuZ2V0TGVuZ3RoKCkKLSAgICAgICAgICA+IDApOwotICAgIH0KLQotICAgIHJldHVybiBpc0ZhdWx0OwotICB9Ci0KLSAgLyoqIAotICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVzc2FnZSBoYXMgYSBzb2FwIGJvZHkgd2l0aCBhIGNoaWxkIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1NvYXBCb2R5V2l0aENoaWxkKERvY3VtZW50IGRvYykKLSAgewotICAgIGJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQotICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBjb250YWlucyA9ICgoZ2V0U29hcEJvZHlDaGlsZChkb2MpID09IG51bGwpID8gZmFsc2UgOiB0cnVlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29udGFpbnM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFNPQVBBY3Rpb24gdmFsdWUgZnJvbSB0aGUgSFRUUCBoZWFkZXJzLgotICAgKiBAcGFyYW0gaGVhZGVycyBIVFRQIGhlYWRlcnMKLSAgICogQHJldHVybiBTT0FQQWN0aW9uIHZhbHVlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFNvYXBBY3Rpb24oU3RyaW5nIGhlYWRlcnMpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIGdldCBTT0FQQWN0aW9uCi0gICAgU3RyaW5nIGFjdGlvbiA9IG51bGw7Ci0gICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkKLSAgICAgIGFjdGlvbiA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsICI6IikuZ2V0KCJTT0FQQWN0aW9uIi50b1VwcGVyQ2FzZSgpKTsKLSAgICByZXR1cm4gYWN0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgUU5hbWVzIG9mIHBhcnRzIGZyb20gdGhlIHNvYXAgYm9keSBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0gICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgUlBDIHN0eWxlIG1lc3NhZ2UgY29udGVudAotICAgKi8KLSAgcHJpdmF0ZSBRTmFtZSBnZXRPcGVyYXRpb25Gcm9tTWVzc2FnZShEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBRTmFtZSBvcGVyYXRpb24gPSBudWxsOwotICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBOb2RlTGlzdCBib2RpZXMgPQotICAgICAgICByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiQm9keSIpOwotICAgICAgaWYgKGJvZGllcyAhPSBudWxsICYmIGJvZGllcy5nZXRMZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgYm9keSA9IChFbGVtZW50KSBib2RpZXMuaXRlbSgwKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBib2R5LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBuID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgICAgICAvLyBJZiBlbGVtZW50LCB0aGVuIHRoaXMgaXMgdGhlIG9wZXJhdGlvbiBuYW1lCi0gICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wZXJhdGlvbiA9IG5ldyBRTmFtZShuLmdldE5hbWVzcGFjZVVSSSgpLCBuLmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3BlcmF0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgUU5hbWVzIG9mIHBhcnRzIGZyb20gdGhlIHNvYXAgYm9keSBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0gICAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgUlBDIHN0eWxlIG1lc3NhZ2UgY29udGVudAotICAgKi8KLSAgcHJpdmF0ZSBNYXAgZ2V0UGFydExpc3RGcm9tTWVzc2FnZShEb2N1bWVudCBkb2MpCi0gIHsKLSAgICBNYXAgcGFydHMgPSBuZXcgSGFzaE1hcCgpOwotICAgIGlmIChkb2MgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBOb2RlTGlzdCBib2RpZXMgPQotICAgICAgICByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiQm9keSIpOwotICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHNvYXA6Ym9keSBncmFuZC1jaGlsZCBlbGVtZW50IG5hbWVzIGZyb20gdGhlIHJlcXVlc3QgbWVzc2FnZQotICAgICAgLy8gKGltbWVkaWF0ZSBjaGlsZCBpcyB0aGUgbWVzc2FnZSBuYW1lKQotICAgICAgaWYgKGJvZGllcyAhPSBudWxsICYmIGJvZGllcy5nZXRMZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgYm9keSA9IChFbGVtZW50KSBib2RpZXMuaXRlbSgwKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBib2R5LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZSBuID0gY2hpbGRyZW4uaXRlbShpKTsKLSAgICAgICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgb3BlcmF0aW9uIG5hbWUuIEl0cyBjaGlsZHJlbiBhcmUgdGhlIHBhcnRzCi0gICAgICAgICAgICBOb2RlTGlzdCBncmFuZENoaWxkcmVuID0gbi5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGdyYW5kQ2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTm9kZSBtID0gZ3JhbmRDaGlsZHJlbi5pdGVtKGopOwotICAgICAgICAgICAgICBpZiAobSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIHBhcnQgaGFzIGFuIHhzaTp0eXBlCi0gICAgICAgICAgICAgICAgQXR0ciBhdHRyID0KLSAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnQpIG0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1hTSSwgInR5cGUiKSk7Ci0KLSAgICAgICAgICAgICAgICBRTmFtZSB4c2lUeXBlID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIHhzaTp0eXBlIGF0dHJpYnV0ZSwgdGhlbiBnZXQgdGhlIHZhbHVlIGFzIGEgUU5hbWUgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgeHNpVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgRE9NVXRpbHMuZ2V0UU5hbWUoYXR0ci5nZXROb2RlVmFsdWUoKSwgKEVsZW1lbnQpIG0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uIHdlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgdG8gdGhlIGNoaWxkIGVsZW1lbnQgbGlzdAotICAgICAgICAgICAgICAgIHBhcnRzLnB1dCgKLSAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZShtLmdldE5hbWVzcGFjZVVSSSgpLCBtLmdldExvY2FsTmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgIHhzaVR5cGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwYXJ0czsKLSAgfQotCi0gIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uW10gZ2V0TWF0Y2hpbmdCaW5kaW5nT3BzKAotICAgIFN0cmluZyBiaW5kaW5nU3R5bGUsCi0gICAgQmluZGluZ1tdIGJpbmRpbmdzKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgSGFzaFNldCBiaW5kaW5nT3BlcmF0aW9uc1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAvLyB3aGl6eiB0aHJvdWdoIHRoZSBiaW5kaW5ncywgY2hlY2tpbmcgZm9yIGEgYmluZGluZ09wZXJhdGlvbiBtYXRjaGluZyB0aGUgbWVzc2FnZQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspCi0gICAgewotCi0gICAgICBCaW5kaW5nIHRyeUJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKLSAgICAgIExpc3QgYmluZGluZ09wcyA9IHRyeUJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAgICAgaWYgKGJpbmRpbmdPcHMgIT0gbnVsbCkKLSAgICAgIHsKLQotICAgICAgICAvLyBzZWFyY2ggdGhyb3VnaCBiaW5kaW5nIE9wZXJhdGlvbnMKLSAgICAgICAgSXRlcmF0b3IgYmluZGluZ09wSXQgPSB0cnlCaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGJpbmRpbmdPcEl0Lmhhc05leHQoKSkKLSAgICAgICAgewotCi0gICAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3AgPSAoQmluZGluZ09wZXJhdGlvbikgYmluZGluZ09wSXQubmV4dCgpOwotICAgICAgICAgIC8vIGNoZWNrIGRlcGVuZHMgb24gd2hpY2ggYmluZGluZyBzdHlsZSBpcyBkZWNsYXJlZCBpbiB0aGUgd3NkbAotICAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wID0gV1NETFZhbGlkYXRvckltcGwuZ2V0U29hcE9wZXJhdGlvbihiaW5kaW5nT3ApOwotICAgICAgICAgIC8vR1Q6IG1vdmUgdGhpcyBtZXRob2QgdG8gdXRpbHMKLQotICAgICAgICAgIFN0cmluZyBzdHlsZTsKLSAgICAgICAgICBpZiAoKHNvYXBPcCA9PSBudWxsKSB8fCAoc3R5bGUgPSBzb2FwT3AuZ2V0U3R5bGUoKSkgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyB1c2UgdGhlIHN0eWxlIG9mIHRoZSBwYXJlbnQgYmluZGluZ09wCi0KLSAgICAgICAgICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kID0gV1NETFZhbGlkYXRvckltcGwuZ2V0U29hcEJpbmRpbmcodHJ5QmluZGluZyk7Ci0gICAgICAgICAgICAvL0dUOiBtb3ZlIHRoaXMgbWV0aG9kIHRvIHV0aWxzCi0gICAgICAgICAgICBpZiAoKHN0eWxlID0gc29hcEJpbmQuZ2V0U3R5bGUoKSkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3R5bGUgPSBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DOwotICAgICAgICAgICAgICAvL2RlZmF1bHQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0eWxlLmVxdWFscyhiaW5kaW5nU3R5bGUpKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbnNTZXQuYWRkKGJpbmRpbmdPcCk7Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gLy8gY3VycmVudCBiaW5kaW5nIGhhcyBubyBiaW5kaW5nT3BlcmF0aW9ucywgaWdub3JlCi0gICAgfQotICAgIHJldHVybiAoQmluZGluZ09wZXJhdGlvbltdKSBiaW5kaW5nT3BlcmF0aW9uc1NldC50b0FycmF5KAotICAgICAgbmV3IEJpbmRpbmdPcGVyYXRpb25bMF0pOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHNvYXA6Ym9keSBlbGVtZW50IGlzIGxpdGVyYWwuCi0gICAqIEBwYXJhbSBleHRFbGVtZW50cyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIG9mIHdzZGw6aW5wdXQgb3Igd3NkbDpvdXRwdXQKLSAgICogb2YgYSBiaW5kaW5nCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0xpdGVyYWwoTGlzdCBleHRFbGVtcykKLSAgewotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gZ2V0U09BUEJvZHkoZXh0RWxlbXMpOwotICAgIGlmIChzb2FwQm9keSAhPSBudWxsCi0gICAgICAmJiBzb2FwQm9keS5nZXRVc2UoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIE9yZGVycyB3c2RsOnBhcnQgbmFtZXMga2VlcGluZyBpbiBtaW5kIHRoZSAicGFydHMiIGF0dHJpYnV0ZSBvZiBXU0RMIHNvYXA6Ym9keQotICAgKiBAcGFyYW0gbWVzc2FnZVBhcnRzIGEgbGlzdCBvZiB3c2RsOnBhcnRTCi0gICAqIEBwYXJhbSBleHRFbGVtcyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nCi0gICAqIEByZXR1cm4gdGhlIG9yZGVyZWQgbGlzdCBvZiBwYXJ0IG5hbWVzCi0gICAqLwotICBwdWJsaWMgTGlzdCBvcmRlclBhcnROYW1lcyhMaXN0IG1lc3NhZ2VQYXJ0cywgTGlzdCBleHRFbGVtcykKLSAgewotICAgIExpc3Qgb3JkZXJlZFBhcnROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBMaXN0IGJvZHlQYXJ0cyA9IG51bGw7Ci0KLSAgICBTT0FQQm9keSBzb2FwQm9keSA9IGdldFNPQVBCb2R5KGV4dEVsZW1zKTsKLSAgICBpZiAoc29hcEJvZHkgIT0gbnVsbCkKLSAgICAgIGJvZHlQYXJ0cyA9IHNvYXBCb2R5LmdldFBhcnRzKCk7Ci0KLSAgICBJdGVyYXRvciBpID0gbWVzc2FnZVBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJ0TmFtZSA9ICgoUGFydCkgaS5uZXh0KCkpLmdldE5hbWUoKTsKLSAgICAgIC8vIElmIHRoZSBwYXJ0cyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCBvciBjb250YWlucwotICAgICAgLy8gdGhlIHdzZGw6cGFydCBuYW1lLCB0aGVuIGFkZGluZyBwYXJ0IG5hbWUgdG8gdGhlIG9yZGVyZWQgbGlzdAotICAgICAgaWYgKGJvZHlQYXJ0cyA9PSBudWxsIHx8IGJvZHlQYXJ0cy5jb250YWlucyhwYXJ0TmFtZSkpCi0gICAgICAgIG9yZGVyZWRQYXJ0TmFtZXMuYWRkKHBhcnROYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3JkZXJlZFBhcnROYW1lczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXRyaWV2ZXMgdGhlIFNPQVBCb2R5IG9iamVjdCBmcm9tIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsbWVudHMgaW4gYmluZGluZwotICAgKiBAcGFyYW0gZXh0RWxlbXMgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgKiBAcmV0dXJuIHRoZSBTT0FQQm9keSBlbGVtZW50Ci0gICAqLwotICBwdWJsaWMgU09BUEJvZHkgZ2V0U09BUEJvZHkoTGlzdCBleHRFbGVtcykKLSAgewotICAgIGlmIChleHRFbGVtcyA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gZXh0RWxlbXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE9iamVjdCBvYmogPSBpLm5leHQoKTsKLSAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgICAgcmV0dXJuIChTT0FQQm9keSkgb2JqOwotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci0gCi0gIHB1YmxpYyBMaXN0IHJlc29sdmVTYW1lTmFtZXNwYWNlcyhMaXN0IHNjaGVtYUVsZW1lbnRzKQotICB7Ci0gIAlMaXN0IG5hbWVzcGFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIAlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgCUl0ZXJhdG9yIGkgPSBzY2hlbWFFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFbGVtZW50IHNjaGVtYSA9IChFbGVtZW50KSBpLm5leHQoKTsKLSAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzY2hlbWEuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgaWYgKCFuYW1lc3BhY2VzLmNvbnRhaW5zKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICB7Ci0gICAgICAgIG5hbWVzcGFjZXMuYWRkKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgCUxpc3Qgc2NoZW1hcyA9IGdldFNjaGVtYXNXaXRoU2FtZU5hbWVzcGFjZShzY2hlbWFFbGVtZW50cywgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAJaWYgKHNjaGVtYXMuc2l6ZSgpID09IDEpCi0gICAgICAJewotICAgICAgCSAgcmVzdWx0LmFkZChzY2hlbWEpOwotICAgICAgCX0KLSAgICAJZWxzZQotICAgIAl7Ci0gICAgCQkvLyBjb3B5aW5nIGFsbCB0aGUgTlMgZGVjbGFyYXRpb25zIGZyb20gd3NkbDpkZWZpbml0aW9ucyB3c2RsOnR5cGVzCi0gICAgICAvL2NvcHlOU0RlY2xhcmF0aW9ucyhyb290LCBzY2hlbWEpOwotICAgICAgY29weU5TRGVjbGFyYXRpb25zKChFbGVtZW50KSBzY2hlbWEuZ2V0UGFyZW50Tm9kZSgpLCBzY2hlbWEpOwotICAgICAgLy8gUmVwbGFjaW5nIGFsbCByZWxhdGl2ZSBzY2hlbWFMb2NhdGlvbiBVUklzIHdpdGggYWJzb2x1dGUgb25lcwotICAgICAgLy9yZXBsYWNlUmVsYXRpdmVVUklzKHNjaGVtYSwgd3NkbFVSSSk7Ci0gICAgICAvLyBTZXJpYWxpemUgdGhlIHNjaGVtYSBlbGVtZW50cyBpbnNpZGUgdGhlIFR5cGVzLCB0aGVuIHVzZSB0aGlzIGFzCi0gICAgICAvLyB0aGUgc2NoZW1hIHN0cmluZyBmb3IgdGhlIHZhbGlkYXRpb24KLSAgICAgIFN0cmluZyBzY2hlbWFTdHJpbmcgPQotICAgICAgICBET00yV3JpdGVyLm5vZGVUb1N0cmluZyhzY2hlbWEpOwotICAgICAgIC8vIHNjaGVtYVN0cmluZ3MuYWRkKHNjaGVtYVN0cmluZyk7Ci0gICAgICAJfQotICAgICAgfQotICAgIH0KLSAgCXJldHVybiBudWxsOwotICB9Ci0gIAkKLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hc1dpdGhTYW1lTmFtZXNwYWNlKExpc3Qgc2NoZW1hRWxlbWVudHMsIFN0cmluZyB0YXJnZXROYW1lc3BhY2UpCi0gIHsgCi0gIAlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpID0gc2NoZW1hRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRWxlbWVudCBzY2hlbWEgPSAoRWxlbWVudClpLm5leHQoKTsKLSAgICAgIFN0cmluZyBzY2hlbWFUYXJnZXROYW1lc3BhY2UgPSBzY2hlbWEuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgaWYgKHNjaGVtYVRhcmdldE5hbWVzcGFjZSA9PSBudWxsKQotICAgICAgIAlzY2hlbWFUYXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgCi0gICAgICBpZiAoc2NoZW1hVGFyZ2V0TmFtZXNwYWNlLmVxdWFscyh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgewotICAgICAgIAlyZXN1bHQuYWRkKHNjaGVtYSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVOYW1lc3BhY2VzRGV0ZWN0ZWQoTGlzdCBzY2hlbWFFbGVtZW50cykKLSAgeyAKLSAgCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgTGlzdCBuYW1lc3BhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGkgPSBzY2hlbWFFbGVtZW50cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgCUVsZW1lbnQgc2NoZW1hID0gKEVsZW1lbnQpaS5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBzY2hlbWEuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlID09IG51bGwpCi0gICAgICAgIAl0YXJnZXROYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgCi0gICAgICAgIGlmIChuYW1lc3BhY2VzLmNvbnRhaW5zKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgCXJlc3VsdCA9IHRydWU7Ci0gICAgICAgIAlicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgCW5hbWVzcGFjZXMuYWRkKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Jhc2VWYWxpZGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9CYXNlVmFsaWRhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzc4ZTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL0Jhc2VWYWxpZGF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5CYXNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudmVsb3BlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5GYWlsdXJlRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUHJlcmVxRmFpbGVkTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydEFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsLlByZXJlcUZhaWxlZExpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTERvY3VtZW50Q2FjaGVVc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbjsKLQotLyoqCi0gKiBUaGUgV1NETCB2YWxpZGF0b3Igd2lsbCB2ZXJpZnkgdGhhdCB0aGUgV1NETCBhbmQgYXNzb2NpYXRlZCBYTUwgc2NoZW1hIGRlZmluaXRpb25zCi0gKiBhcmUgaW4gY29uZm9ybWFuY2Ugd2l0aCB0aGUgcHJvZmlsZS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAYXV0aG9yIEdyYWhhbSBUdXJyZWxsICAgKGd0dXJyZWxsQHVrLmlibS5jb20pCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVmFsaWRhdG9ySW1wbAotICBleHRlbmRzIFhNTERvY3VtZW50Q2FjaGVVc2VyCi0gIGltcGxlbWVudHMgQmFzZVZhbGlkYXRvcgotewotCi0gIC8qKgotICAgKiBBIGhhc2h0YWJsZSB0aGF0IG1hcHMgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gdGhlaXIgcHJpb3JpdGllcywgMCBpcyBsb3dlc3QKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2h0YWJsZSByZXN1bHRQcmlvcml0eSA9IG5ldyBIYXNodGFibGUoNik7Ci0gIHN0YXRpYyB7Ci0gICAgcmVzdWx0UHJpb3JpdHkucHV0KEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VELCBuZXcgSW50ZWdlcigwKSk7Ci0gICAgcmVzdWx0UHJpb3JpdHkucHV0KEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEUsIG5ldyBJbnRlZ2VyKDEpKTsKLSAgICByZXN1bHRQcmlvcml0eS5wdXQoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9NSVNTSU5HX0lOUFVULCBuZXcgSW50ZWdlcigyKSk7Ci0gICAgcmVzdWx0UHJpb3JpdHkucHV0KEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORywgbmV3IEludGVnZXIoMykpOwotICAgIHJlc3VsdFByaW9yaXR5LnB1dChBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BSRVJFUV9GQUlMRUQsIG5ldyBJbnRlZ2VyKDQpKTsKLSAgICByZXN1bHRQcmlvcml0eS5wdXQoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQsIG5ldyBJbnRlZ2VyKDUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBiZWluZyBwYXNzZWQgd2hlbiBwcm9jZXNzaW5nIHByZS1yZXF1aXNpdGVzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZBTElEX1BSSU9SSVRZID0gMTsKLQotICAvKioKLSAgICogQW5hbHl6ZXIgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyBBbmFseXplckNvbnRleHQgYW5hbHl6ZXJDb250ZXh0OwotCi0gIC8qKgotICAgKiBQcm9maWxlIGFydGlmYWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIFByb2ZpbGVBcnRpZmFjdCBwcm9maWxlQXJ0aWZhY3Q7Ci0KLSAgLyoqCi0gICAqIFJlcG9ydGVyLgotICAgKi8KLSAgcHJvdGVjdGVkIFJlcG9ydGVyIHJlcG9ydGVyOwotCi0gIC8qKgotICAgKiBFbnRyeS4KLSAgICovCi0gIC8vIHByb3RlY3RlZCBFbnRyeSBlbnRyeTsKLQotICAvKioKLSAgICogUmVwb3J0IGFydGlmYWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0OwotCi0gIC8qKgotICAgKiBWZXJib3NlIG9wdGlvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHZlcmJvc2VPcHRpb24gPSBmYWxzZTsKLQotICAvKioKLSAgICogVGVzdCBhc3NlcnRpb24gcHJvY2Vzc2VkIGNvdW50LgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBhc3NlcnRpb25Db3VudCA9IDA7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIEJhc2VWYWxpZGF0b3JJbXBsKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEluaXRpYWlsaXplIHZhbGlkYXRpb24gdGVzdCBwcm9jZWR1cmUuCi0gICAqIEBwYXJhbSBhbmFseXplckNvbnRleHQgdGhlIGFuYWx5emVyQ29udGV4dC4KLSAgICogQHBhcmFtIHByb2ZpbGVBcnRpZmFjdCB0aGUgcHJvZmlsZSBhcnRpZmlhY3QuCi0gICAqIEBwYXJhbSByZXBvcnRBcnRpZmFjdCAgdGhlIHJlcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHJlcG9ydGVyICAgICAgICBhIFJlcG9ydGVyIG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdmFsaWRhdG9yIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgcHJvZmlsZUFydGlmYWN0LAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFJlcG9ydGVyIHJlcG9ydGVyKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFNhdmUgaW5wdXQgcmVmZXJlbmNlcwotICAgIHRoaXMuYW5hbHl6ZXJDb250ZXh0ID0gYW5hbHl6ZXJDb250ZXh0OwotICAgIHRoaXMucHJvZmlsZUFydGlmYWN0ID0gcHJvZmlsZUFydGlmYWN0OwotICAgIHRoaXMucmVwb3J0QXJ0aWZhY3QgPSByZXBvcnRBcnRpZmFjdDsKLSAgICB0aGlzLnJlcG9ydGVyID0gcmVwb3J0ZXI7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgWE1MIGRvY3VtZW50IGNhY2hlIGlzIHVwZGF0ZWQgaW4gdGhlIGFuYWx5emVyIGNvbnRleHQKLSAgICB0aGlzLmRvY3VtZW50TGlzdCA9IHRoaXMuYW5hbHl6ZXJDb250ZXh0LmdldERvY3VtZW50TGlzdCgpOwotCi0gICAgLy8gR2V0IHZlcmJvc2Ugb3B0aW9uICAgIAotICAgIHZlcmJvc2VPcHRpb24gPQotICAgICAgcmVwb3J0ZXIKLSAgICAgICAgLmdldFJlcG9ydCgpCi0gICAgICAgIC5nZXRSZXBvcnRDb250ZXh0KCkKLSAgICAgICAgLmdldEFuYWx5emVyKCkKLSAgICAgICAgLmdldEFuYWx5emVyQ29uZmlnKCkKLSAgICAgICAgLmdldFZlcmJvc2VPcHRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGFsbCBvZiB0aGUgdGVzdCBhc3NlcnRpb25zIGZvciBvbmUgZW50cnkuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBhIGNsYXNzIHByZWZpeC4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCBhbiBlbnRyeSBjb250ZXh0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBzZXJpb3VzIHByb2JsZW1zIG9jY3VyIHdoaWxlIHByb2Nlc3NpbmcgCi0gICAqICAgICAgICAgYWxsIG9mIHRoZSB0ZXN0IGFzc2VydGlvbnMgZm9yIGFuIGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0Fzc2VydGlvbnMoCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgbG9uZyBzdGFydFRpbWUgPSAwOwotCi0gICAgSGFzaE1hcCBwcm9jZXNzTGlzdCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uID0gbnVsbDsKLSAgICBBc3NlcnRpb25Qcm9jZXNzIGFzc2VydGlvblByb2Nlc3M7Ci0gICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdDsKLQotICAgIFRyZWVNYXAgcHJlUmVxUmVzdWx0czsKLSAgICBQcmVyZXFGYWlsZWRMaXN0IHByZXJlcUZhaWxlZExpc3Q7Ci0gICAgU3RyaW5nIHByZVJlcUlkOwotCi0gICAgQ2xhc3NbXSBwYXJhbVR5cGVzID0gbmV3IENsYXNzWzFdOwotICAgIC8vIElmIHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVZhbGlkYXRvciBvciBFbnZlbG9wZVZhbGlkYXRvcgotICAgIC8vIHRoZW4gdXNlIEJhc2VNZXNzYWdlVmFsaWRhdG9yIGFzIGEgcGFyYW0gdHlwZSBvZiBhc3NlcnRpb25zIGNvbnN0cnVjdG9yCi0gICAgcGFyYW1UeXBlc1swXSA9IHRoaXMgaW5zdGFuY2VvZiBCYXNlTWVzc2FnZVZhbGlkYXRvciA/Ci0gICAgICBCYXNlTWVzc2FnZVZhbGlkYXRvci5jbGFzcyA6IHRoaXMuZ2V0Q2xhc3MoKTsKLQotICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbMV07Ci0gICAgcGFyYW1zWzBdID0gdGhpczsKLQotICAgIC8vIEdldCBlbnRyeSBmcm9tIGNvbnRleHQKLSAgICBFbnRyeSBlbnRyeSA9IGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpOwotCi0gICAgLy8gQWRkIGVudHJ5IHRvIGFydGlmYWN0Ci0gICAgdGhpcy5yZXBvcnRBcnRpZmFjdC5hZGRFbnRyeShlbnRyeSk7Ci0KLSAgICAvLyBBZGQgZW50cnkgdG8gcmVwb3J0Ci0gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBFbnZlbG9wZVZhbGlkYXRvcikKLSAgICAgCXRoaXMucmVwb3J0ZXIuc2V0Q3VycmVudEVudmVsb3BlRW50cnkoZW50cnkpOyAKLQllbHNlIHRoaXMucmVwb3J0ZXIuc2V0Q3VycmVudEVudHJ5KGVudHJ5KTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgdGVzdCBhc3NlcnRpb25zIGZvciB0aGUgYXJ0aWZhY3QKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvZmlsZUFydGlmYWN0LmdldFRlc3RBc3NlcnRpb25MaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCBuZXh0IHRlc3QgYXNzZXJ0aW9uCi0gICAgICAgIHRlc3RBc3NlcnRpb24gPSAoVGVzdEFzc2VydGlvbikgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgIC8vIFJlc2V0IHZhcmlhYmxlcwotICAgICAgICBhc3NlcnRpb25SZXN1bHQgPSBudWxsOwotCi0gICAgICAgIC8vIElmIHRoZSB0ZXN0IGFzc2VydGlvbiBpcyBlbmFibGVkLCB0aGVuIGNvbnRpbnVlCi0gICAgICAgIC8vICAgICAgICBpZiAoKHRlc3RBc3NlcnRpb24uaXNFbmFibGVkKCkpICYmIAotICAgICAgICAvLyAgICAgICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RW50cnlUeXBlTmFtZSgpLmVxdWFscyh0YXJnZXRDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCkuZ2V0VHlwZU5hbWUoKSkpIHsgCi0gICAgICAgIGlmICh0ZXN0QXNzZXJ0aW9uLmlzRW5hYmxlZCgpCi0gICAgICAgICAgJiYgaXNQcmltYXJ5RW50cnlUeXBlTWF0Y2godGVzdEFzc2VydGlvbiwgZW50cnlDb250ZXh0KSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFkZCAxIHRvIGFzc2VydGlvbiBwcm9jZXNzZWQgY291bnQKLSAgICAgICAgICAgIGFzc2VydGlvbkNvdW50Kys7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBhc3NlcnRpb24gcHJvY2VzcyBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCwgdGhlbiBjcmVhdGUgaXQKLSAgICAgICAgICAgIGlmICgoYXNzZXJ0aW9uUHJvY2VzcyA9Ci0gICAgICAgICAgICAgIChBc3NlcnRpb25Qcm9jZXNzKSBwcm9jZXNzTGlzdC5nZXQodGVzdEFzc2VydGlvbi5nZXRJZCgpKSkKLSAgICAgICAgICAgICAgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYXNzZXJ0aW9uIHByb2Nlc3MKLSAgICAgICAgICAgICAgQ2xhc3MgYXNzZXJ0aW9uQ2xhc3MgPQotICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoY2xhc3NQcmVmaXggKyB0ZXN0QXNzZXJ0aW9uLmdldElkKCkpOwotCi0gICAgICAgICAgICAgIGFzc2VydGlvblByb2Nlc3MgPQotICAgICAgICAgICAgICAgIChBc3NlcnRpb25Qcm9jZXNzKSBhc3NlcnRpb25DbGFzcy5nZXRDb25zdHJ1Y3RvcigKLSAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZXMpLm5ld0luc3RhbmNlKAotICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKLQotICAgICAgICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgcHJvY2Vzc0xpc3QucHV0KHRlc3RBc3NlcnRpb24uZ2V0SWQoKSwgYXNzZXJ0aW9uUHJvY2Vzcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgZW50cnkgaXMgbnVsbAotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEVudHJ5RGV0YWlsKCkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXNzZXJ0aW9uUmVzdWx0ID0KLSAgICAgICAgICAgICAgICBjcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICAgICAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLAotICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9NSVNTSU5HX0lOUFVULAotICAgICAgICAgICAgICAgICAgKFN0cmluZykgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdGVzdCBhc3NlcnRpb24gc2hvdWxkIGJlIHJ1bgotICAgICAgICAgICAgLy9pZiAoaXNOb3RBcHBsaWNhYmxlKHRlc3RBc3NlcnRpb24sIGVudHJ5Q29udGV4dCkpIHsKLSAgICAgICAgICAgIGVsc2UgaWYgKGlzTm90QXBwbGljYWJsZSh0ZXN0QXNzZXJ0aW9uKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXNzZXJ0aW9uUmVzdWx0ID0KLSAgICAgICAgICAgICAgICBjcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICAgICAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLAotICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSwKLSAgICAgICAgICAgICAgICAgIChTdHJpbmcpIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGFsbCB0aGUgYXNzZXJ0aW9uIHByZS1yZXF1aXNpdGVzCi0KLSAgICAgICAgICAgICAgcHJlUmVxUmVzdWx0cyA9IG51bGw7Ci0gICAgICAgICAgICAgIHByZXJlcUZhaWxlZExpc3QgPSBudWxsOwotICAgICAgICAgICAgICAvLyBHZXQgbGlzdCBvZiBwcmUtcmVxcyBmb3Igc3BlY2lmaWVkIGFzc2VydGlvbgotICAgICAgICAgICAgICBJdGVyYXRvciBpID0gdGVzdEFzc2VydGlvbi5nZXRQcmVyZXFJZExpc3QoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHJlUmVxUmVzdWx0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgcHJlUmVxUmVzdWx0cyA9IG5ldyBUcmVlTWFwKCk7Ci0gICAgICAgICAgICAgICAgLy8gR2V0IG5leHQgaWQKLSAgICAgICAgICAgICAgICBwcmVSZXFJZCA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcHJlcmVxIHJlc3VsdAotICAgICAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBwcmVSZXFSZXN1bHQgPSByZXBvcnRlci5nZXRBc3NlcnRpb25SZXN1bHQocHJlUmVxSWQpOwotCi0gICAgICAgICAgICAgICAgLy8gQWRkaW5nIGEgcmVzdWx0IHByaW9yaXR5IHZhbHVlIHRvIHByZVJlcVJlc3VsdHMKLSAgICAgICAgICAgICAgICBwcmVSZXFSZXN1bHRzLnB1dCgKLSAgICAgICAgICAgICAgICAgIHJlc3VsdFByaW9yaXR5LmdldChwcmVSZXFSZXN1bHQuZ2V0UmVzdWx0KCkpLAotICAgICAgICAgICAgICAgICAgcHJlUmVxUmVzdWx0LmdldFJlc3VsdCgpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwcmVyZXEgZmFpbGVkLCB0aGVuIGFkZCBpdCB0byB0aGUgbGlzdAotICAgICAgICAgICAgICAgIGlmICgoKEludGVnZXIpcmVzdWx0UHJpb3JpdHkuZ2V0KHByZVJlcVJlc3VsdC5nZXRSZXN1bHQoKSkpLmludFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgID4gTUFYX1ZBTElEX1BSSU9SSVRZKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIEFkZGluZyBmYWlsZWQgcHJlcmVxIElEIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICBpZiAocHJlcmVxRmFpbGVkTGlzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBwcmVyZXFGYWlsZWRMaXN0ID0gbmV3IFByZXJlcUZhaWxlZExpc3RJbXBsKCk7Ci0gICAgICAgICAgICAgICAgICBwcmVyZXFGYWlsZWRMaXN0LmFkZFRlc3RBc3NlcnRpb25JRChwcmVSZXFJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKHByZXJlcUZhaWxlZExpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgdGhlIGhpZ2hlc3QgcHJlLXJlcXVpc2l0ZXMnIHJlc3VsdAotICAgICAgICAgICAgICAgIEludGVnZXIgbWF4UmVzID0gKEludGVnZXIpcHJlUmVxUmVzdWx0cy5sYXN0S2V5KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc1N0cmluZyA9IChTdHJpbmcpcHJlUmVxUmVzdWx0cy5nZXQobWF4UmVzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzU3RyaW5nLmVxdWFscyhBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCkKLSAgICAgICAgICAgICAgICAgIHx8cmVzU3RyaW5nLmVxdWFscyhBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkcpKSB7Ci0gICAgICAgICAgICAgICAgICByZXNTdHJpbmcgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BSRVJFUV9GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhc3NlcnRpb24gcmVzdWx0IGJhc2VkIG9uIHByZS1yZXF1aXNpdGVzIHdoaWNoIGFyZSBub3QgcGFzc2VkCi0gICAgICAgICAgICAgICAgYXNzZXJ0aW9uUmVzdWx0ID0gY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc1N0cmluZywgcHJlcmVxRmFpbGVkTGlzdCk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAvLyBQcmUtcmVxdWlzaXRlcyBhcmUgcGFzc2VkLCB2YWxpZGF0ZSBjdXJyZW50IGFzc2VydGlvbgotICAgICAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRlc3QgYXNzZXJ0aW9uCi0gICAgICAgICAgICAgICAgYXNzZXJ0aW9uUHJvY2Vzcy5yZXNldCgpOwotCi0gICAgICAgICAgICAgICAgLy8gIFZFUkJPU0UKLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZU9wdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICIgIFByb2Nlc3NpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICsgdGVzdEFzc2VydGlvbi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBlbnRyeSByZWZlcmVuY2UgSUQgWyIKLSAgICAgICAgICAgICAgICAgICAgICArIGVudHJ5LmdldFJlZmVyZW5jZUlEKCkKLSAgICAgICAgICAgICAgICAgICAgICArICJdIC4uLiIpOwotICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHRhcmdldAotICAgICAgICAgICAgICAgIGFzc2VydGlvblJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICBhc3NlcnRpb25Qcm9jZXNzLnZhbGlkYXRlKHRlc3RBc3NlcnRpb24sIGVudHJ5Q29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgWE1MIGRvY3VtZW50IGNhY2hlIGlzIHVwZGF0ZWQgaW4gdGhlIGFuYWx5emVyIGNvbnRleHQKLSAgICAgICAgICAgICAgICB0aGlzLmFuYWx5emVyQ29udGV4dC5zZXREb2N1bWVudExpc3QoZG9jdW1lbnRMaXN0KTsKLQotICAgICAgICAgICAgICAgIC8vICBWRVJCT1NFCi0gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2VPcHRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAiICAgIEVsYXBzZWQgdGltZTogIgotICAgICAgICAgICAgICAgICAgICAgICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKQotICAgICAgICAgICAgICAgICAgICAgICsgIm1zIik7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgcmVzdWx0IHRvIHRoZSByZXBvcnQKLSAgICAgICAgICAgIHJlcG9ydGVyLmFkZEFzc2VydGlvblJlc3VsdChhc3NlcnRpb25SZXN1bHQpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gREVCVUc6Ci0gICAgICAgICAgICBpZiAodGVzdEFzc2VydGlvbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXBvcnRlcgotICAgICAgICAgICAgICAgIC5nZXRSZXBvcnQoKQotICAgICAgICAgICAgICAgIC5nZXRSZXBvcnRDb250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0QW5hbHl6ZXIoKQotICAgICAgICAgICAgICAgIC5wcmludE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgIldBUk5JTkc6ICIKLSAgICAgICAgICAgICAgICAgICsgdGVzdEFzc2VydGlvbi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICArICIgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVhFQ0VQVElPTjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIGlmICh2ZXJib3NlT3B0aW9uKQotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCi0gICAgICBpZiAoZSBpbnN0YW5jZW9mIFdTSUV4Y2VwdGlvbikKLSAgICAgICAgdGhyb3cgKFdTSUV4Y2VwdGlvbikgZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgfQotCi0gICAgZmluYWxseQotICAgIHsKLSAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGFzc2VydGlvbiB0YXJnZXQKLSAgICAgIHRoaXMucmVwb3J0ZXIuZW5kQ3VycmVudEVudHJ5KCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERldGVybWluZSBpZiB0aGUgdGVzdCBhc3NlcnRpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBmb3IgdGhlIGN1cnJlbnQgZW50cnkuCi0gICAqIEBwYXJhbSB0ZXN0QXNzZXJ0aW9uIGEgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgIHRoZSBlbnRyeSBjb250ZXh0LgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRlc3QgYXNzZXJ0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNQcmltYXJ5RW50cnlUeXBlTWF0Y2goCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpOwotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIHRlc3QgYXNzZXJ0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgotICAgKiBAcGFyYW0gdGVzdEFzc2VydGlvbiAgYSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIGVudHJ5ICAgICAgICAgIGFuIEVudHJ5IG9iamVjdAotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRlc3QgYXNzZXJ0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgZm9yIHRoZSBjdXJyZW50IGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmltYXJ5RW50cnlUeXBlTWF0Y2goCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5IGVudHJ5KQotICB7Ci0gICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCi0gICAgLy8gSWYgdGhlIHRlc3QgYXNzZXJ0aW9uIGVudHJ5IHR5cGUgbWF0Y2hlcyB0aGUgdGFyZ2V0IGNvbnRleHQgZW50cnkgdHlwZSwgdGhlbiBjb250aW5lCi0gICAgaWYgKHRlc3RBc3NlcnRpb24KLSAgICAgIC5nZXRFbnRyeVR5cGVOYW1lKCkKLSAgICAgIC5lcXVhbHMoZW50cnkuZ2V0RW50cnlUeXBlKCkuZ2V0VHlwZU5hbWUoKSkpCi0gICAgewotICAgICAgbWF0Y2ggPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBtYXRjaDsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgaWYgdGhlIHRlc3QgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLgotICAgKiBAcGFyYW0gdGVzdEFzc2VydGlvbiBhIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRlc3QgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNOb3RBcHBsaWNhYmxlKFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbik7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5CYXNlVmFsaWRhdG9yI2NsZWFudXAoKQotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYW51cCgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIElmIG5vIGFzc2VydGlvbnMgd2VyZSBwcm9jZXNzZWQsIHRoZW4gc2V0IGFsbCBtaXNzaW5nSW5wdXQKLSAgICBpZiAoYXNzZXJ0aW9uQ291bnQgPT0gMCkKLSAgICAgIHNldEFsbE1pc3NpbmdJbnB1dCgpOwotCi0gICAgLy8gU2V0IGNhY2hlZCBkb2N1bWVudCBsaXN0IGluIGNhc2UgaXQgd2FzIHVwZGF0ZWQKLSAgICB0aGlzLmFuYWx5emVyQ29udGV4dC5zZXREb2N1bWVudExpc3QodGhpcy5kb2N1bWVudExpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhc3NlcnRpb24gcmVzdWx0LgotICAgKiBAcGFyYW0gdGVzdEFzc2VydGlvbiBhIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gcmVzdWx0ICAgICAgICBhIFN0cmluZyBvYmplY3QuCi0gICAqIEBwYXJhbSBmYWlsdXJlRGV0YWlsIGEgRmFpbHVyZURldGFpbCBvYmplY3QuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCB0ZXN0IHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBTdHJpbmcgcmVzdWx0LAotICAgIEZhaWx1cmVEZXRhaWwgZmFpbHVyZURldGFpbCkKLSAgewotICAgIFZlY3RvciBmYWlsdXJlRGV0YWlsTGlzdCA9IG51bGw7Ci0KLSAgICAvLyBDcmVhdGUgZmFpbHVyZSBkZXRhaWwgbGlzdAotICAgIGlmIChmYWlsdXJlRGV0YWlsICE9IG51bGwpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmYWlsdXJlRGV0YWlsTGlzdC5hZGQoZmFpbHVyZURldGFpbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWxMaXN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHBhcmFtIHRlc3RBc3NlcnRpb24gICAgICAgICBhIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gcmVzdWx0ICAgICAgICAgICAgICAgIGEgU3RyaW5nIG9iamVjdC4KLSAgICogQHBhcmFtIGZhaWx1cmVEZXRhaWxNZXNzYWdlICBhIGZhaWx1cmUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCB0ZXN0IHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBTdHJpbmcgcmVzdWx0LAotICAgIFN0cmluZyBmYWlsdXJlRGV0YWlsTWVzc2FnZSkKLSAgewotICAgIHJldHVybiBjcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLAotICAgICAgcmVzdWx0LAotICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UsCi0gICAgICBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHBhcmFtIHRlc3RBc3NlcnRpb24gICAgICAgICBhIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gcmVzdWx0ICAgICAgICAgICAgICAgIGEgU3RyaW5nIG9iamVjdC4KLSAgICogQHBhcmFtIGZhaWx1cmVEZXRhaWxNZXNzYWdlICBhIGZhaWx1cmUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBlbGVtZW50TG9jYXRpb24gICAgICAgZWxlbWVudCBsb2NhdGlvbi4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHRlc3QgcmVzdWx0LgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBjcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIFN0cmluZyByZXN1bHQsCi0gICAgU3RyaW5nIGZhaWx1cmVEZXRhaWxNZXNzYWdlLAotICAgIEVsZW1lbnRMb2NhdGlvbiBlbGVtZW50TG9jYXRpb24pCi0gIHsKLSAgICAvLyBDcmVhdGUgZmFpbHVyZSBkZXRhaWwgbGlzdAotICAgIFZlY3RvciBmYWlsdXJlRGV0YWlsTGlzdCA9IG51bGw7Ci0gICAgaWYgKGZhaWx1cmVEZXRhaWxNZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBGYWlsdXJlRGV0YWlsIGZhaWx1cmVEZXRhaWwgPSByZXBvcnRlci5jcmVhdGVGYWlsdXJlRGV0YWlsKCk7Ci0gICAgICBmYWlsdXJlRGV0YWlsLnNldEZhaWx1cmVNZXNzYWdlKGZhaWx1cmVEZXRhaWxNZXNzYWdlKTsKLSAgICAgIGZhaWx1cmVEZXRhaWwuc2V0RWxlbWVudExvY2F0aW9uKGVsZW1lbnRMb2NhdGlvbik7Ci0gICAgICBmYWlsdXJlRGV0YWlsTGlzdC5hZGQoZmFpbHVyZURldGFpbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWxMaXN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHBhcmFtIHRlc3RBc3NlcnRpb24gICAgIGEgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBwYXJhbSByZXN1bHQgICAgICAgICAgICBhIFN0cmluZyBvYmplY3QuCi0gICAqIEBwYXJhbSBmYWlsdXJlRGV0YWlsTGlzdCBhIGZhaWx1cmUgZGV0YWlsIGxpc3QuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCB0ZXN0IHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBTdHJpbmcgcmVzdWx0LAotICAgIFZlY3RvciBmYWlsdXJlRGV0YWlsTGlzdCkKLSAgewotICAgIC8vIENyZWF0ZSBhc3NlcnRpb24gcmVzdWx0Ci0gICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdCA9IHJlcG9ydGVyLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgpOwotCi0gICAgLy8gU2V0IHZhbHVlcyBpbiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEFzc2VydGlvbih0ZXN0QXNzZXJ0aW9uKTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0UmVzdWx0KHJlc3VsdCk7Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEVudHJ5KHJlcG9ydGVyLmdldFJlcG9ydCgpLmdldEN1cnJlbnRFbnRyeSgpKTsKLQotICAgIC8vIFNldCBmYWlsdXJlIGRldGFpbCBsaXN0Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEZhaWx1cmVEZXRhaWxMaXN0KGZhaWx1cmVEZXRhaWxMaXN0KTsKLQotICAgIHJldHVybiBhc3NlcnRpb25SZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFzc2VydGlvbiByZXN1bHQuCi0gICAqIEBwYXJhbSB0ZXN0QXNzZXJ0aW9uICAgICBhIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAcGFyYW0gcmVzdWx0ICAgICAgICAgICAgYSBTdHJpbmcgb2JqZWN0LgotICAgKiBAcGFyYW0gcHJlcmVxRmFpbGVkTGlzdCAgYSBsaXN0IGZhaWxlZCBwcmUtcmVxdWlzaXRlIGFzc2VydGlvbnMuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCB0ZXN0IHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBTdHJpbmcgcmVzdWx0LAotICAgIFByZXJlcUZhaWxlZExpc3QgcHJlcmVxRmFpbGVkTGlzdCkKLSAgewotICAgIC8vIENyZWF0ZSBhc3NlcnRpb24gcmVzdWx0Ci0gICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdCA9IHJlcG9ydGVyLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgpOwotCi0gICAgLy8gU2V0IHZhbHVlcyBpbiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEFzc2VydGlvbih0ZXN0QXNzZXJ0aW9uKTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0UmVzdWx0KHJlc3VsdCk7Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEVudHJ5KHJlcG9ydGVyLmdldFJlcG9ydCgpLmdldEN1cnJlbnRFbnRyeSgpKTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0UHJlcmVxRmFpbGVkTGlzdChwcmVyZXFGYWlsZWRMaXN0KTsKLQotICAgIHJldHVybiBhc3NlcnRpb25SZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGFzc2VydGlvbiByZXN1bHQgdG8gcmVwb3J0LgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uSWQgIGFzc2VydGlvbiBpZC4KLSAgICogQHBhcmFtIHJlc3VsdCAgICAgICBhc3NlcnRpb24gcmVzdWx0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBjYW5ub3QgYmUgYWRkZWQgdG8gdGhlIHJlcG9ydC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEFzc2VydGlvblJlc3VsdChTdHJpbmcgYXNzZXJ0aW9uSWQsIFN0cmluZyByZXN1bHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIHRlc3QgYXNzZXJ0aW9uIHJlc3VsdAotICAgIEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQgPSByZXBvcnRlci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoKTsKLQotICAgIC8vIFNldCBhc3NlcnRpb24sIHJlc3VsdCBhbmQgdGFyZ2V0Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEFzc2VydGlvbihwcm9maWxlQXJ0aWZhY3QuZ2V0VGVzdEFzc2VydGlvbihhc3NlcnRpb25JZCkpOwotICAgIGFzc2VydGlvblJlc3VsdC5zZXRSZXN1bHQocmVzdWx0KTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0RW50cnkocmVwb3J0ZXIuZ2V0UmVwb3J0KCkuZ2V0Q3VycmVudEVudHJ5KCkpOwotCi0gICAgLy8gQWRkIGl0IHRvIHRoZSByZXBvcnQKLSAgICByZXBvcnRlci5hZGRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uUmVzdWx0KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYXNzZXJ0aW9uIHJlc3VsdCB0byByZXBvcnQgd2l0aCBhbiBlcnJvciBkZXRhaWwgbWVzc2FnZS4KLSAgICogQHBhcmFtIGFzc2VydGlvbklkICAgICAgICAgIGFzc2VydGlvbiBpZC4KLSAgICogQHBhcmFtIHJlc3VsdCAgICAgICAgICAgICAgIGFzc2VydGlvbiByZXN1bHQuCi0gICAqIEBwYXJhbSBmYWlsdXJlRGV0YWlsTWVzc2FnZSBhbiBlcnJvciBkZXRhaWwgbWVzc2FnZS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlIGFzc2VydGlvbiByZXN1bHQgY2Fubm90IGJlIGFkZGVkIHRvIHRoZSByZXBvcnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRBc3NlcnRpb25SZXN1bHQoCi0gICAgU3RyaW5nIGFzc2VydGlvbklkLAotICAgIFN0cmluZyByZXN1bHQsCi0gICAgU3RyaW5nIGZhaWx1cmVEZXRhaWxNZXNzYWdlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENvbnZlcnQgbWVzc2FnZSB0byB2ZWN0b3IKLSAgICBWZWN0b3IgZmFpbHVyZURldGFpbExpc3QgPSBudWxsOwotICAgIGlmIChmYWlsdXJlRGV0YWlsTWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWxMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgRmFpbHVyZURldGFpbCBmYWlsdXJlRGV0YWlsID0gcmVwb3J0ZXIuY3JlYXRlRmFpbHVyZURldGFpbCgpOwotICAgICAgZmFpbHVyZURldGFpbExpc3QuYWRkKGZhaWx1cmVEZXRhaWwpOwotICAgIH0KLQotICAgIC8vIEFkZCBhc3NlcnRpb24gcmVzdWx0Ci0gICAgYWRkQXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvbklkLCByZXN1bHQsIGZhaWx1cmVEZXRhaWxMaXN0KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYXNzZXJ0aW9uIHJlc3VsdCB0byByZXBvcnQuCi0gICAqIEBwYXJhbSBhc3NlcnRpb25JZCAgICAgICAgYXNzZXJ0aW9uIGlkLgotICAgKiBAcGFyYW0gcmVzdWx0ICAgICAgICAgICAgIGFzc2VydGlvbiByZXN1bHQuCi0gICAqIEBwYXJhbSBmYWlsdXJlRGV0YWlsTGlzdCAgYSBsaXN0IG9mIGVycm9yIGRldGFpbCBtZXNzYWdlcy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlIGFzc2VydGlvbiByZXN1bHQgY2Fubm90IGJlIGFkZGVkIHRvIHRoZSByZXBvcnQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRBc3NlcnRpb25SZXN1bHQoCi0gICAgU3RyaW5nIGFzc2VydGlvbklkLAotICAgIFN0cmluZyByZXN1bHQsCi0gICAgVmVjdG9yIGZhaWx1cmVEZXRhaWxMaXN0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSB0ZXN0IGFzc2VydGlvbiByZXN1bHQKLSAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0ID0gcmVwb3J0ZXIuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KCk7Ci0KLSAgICAvLyBTZXQgYXNzZXJ0aW9uLCByZXN1bHQgYW5kIHRhcmdldAotICAgIGFzc2VydGlvblJlc3VsdC5zZXRBc3NlcnRpb24ocHJvZmlsZUFydGlmYWN0LmdldFRlc3RBc3NlcnRpb24oYXNzZXJ0aW9uSWQpKTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0UmVzdWx0KHJlc3VsdCk7Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEVudHJ5KHJlcG9ydGVyLmdldFJlcG9ydCgpLmdldEN1cnJlbnRFbnRyeSgpKTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0RmFpbHVyZURldGFpbExpc3QoZmFpbHVyZURldGFpbExpc3QpOwotCi0gICAgLy8gQWRkIGl0IHRvIHRoZSByZXBvcnQKLSAgICByZXBvcnRlci5hZGRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uUmVzdWx0KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgbWlzc2luZ0lucHV0IGFzc2VydGlvbiByZXN1bHQgdG8gcmVwb3J0LgotICAgKiBAcGFyYW0gdGVzdEFzc2VydGlvbiBhIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbnkgcHJvYmxlbSBhZGRpbmcgbWlzc2luZ0lucHV0IAotICAgKiAJCSBhc3NlcnRpb24gcmVzdWx0IHRvIHJlcG9ydC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZE1pc3NpbmdJbnB1dFJlc3VsdChUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24pCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ3JlYXRlIHRlc3QgYXNzZXJ0aW9uIHJlc3VsdAotICAgIEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQgPSByZXBvcnRlci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoKTsKLQotICAgIC8vIFNldCBhc3NlcnRpb24sIHJlc3VsdCBhbmQgdGFyZ2V0Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEFzc2VydGlvbih0ZXN0QXNzZXJ0aW9uKTsKLSAgICBhc3NlcnRpb25SZXN1bHQuc2V0UmVzdWx0KEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTUlTU0lOR19JTlBVVCk7Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEVudHJ5KHJlcG9ydGVyLmdldFJlcG9ydCgpLmdldEN1cnJlbnRFbnRyeSgpKTsKLQotICAgIC8vIEFkZCBpdCB0byB0aGUgcmVwb3J0Ci0gICAgcmVwb3J0ZXIuYWRkQXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvblJlc3VsdCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkJhc2VWYWxpZGF0b3Ijc2V0QWxsTWlzc2luZ0lucHV0KCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFsbE1pc3NpbmdJbnB1dCgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIElmIHByb2ZpbGUgYXJ0aWZhY3QgaXMgc2V0Ci0gICAgaWYgKHByb2ZpbGVBcnRpZmFjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbjsKLSAgCi0gICAgICAvLyBDcmVhdGUgZW50cnkKLSAgICAgIEVudHJ5IGVudHJ5ID0gdGhpcy5yZXBvcnRlci5nZXRSZXBvcnQoKS5jcmVhdGVFbnRyeSgpOwotICAgICAgZW50cnkuc2V0QXJ0aWZhY3ROYW1lKHRoaXMucmVwb3J0QXJ0aWZhY3QuZ2V0VHlwZSgpLmdldFR5cGVOYW1lKCkpOwotICAKLSAgICAgIC8vIEFkZCBlbnRyeSB0byBhcnRpZmFjdAotICAgICAgdGhpcy5yZXBvcnRBcnRpZmFjdC5hZGRFbnRyeShlbnRyeSk7Ci0gIAotICAgICAgLy8gQWRkIGVudHJ5IHRvIHJlcG9ydAotICAgICAgdGhpcy5yZXBvcnRlci5zZXRDdXJyZW50RW50cnkoZW50cnkpOwotICAKLSAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgdGVzdCBhc3NlcnRpb25zIGZvciB0aGUgYXJ0aWZhY3QKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvZmlsZUFydGlmYWN0LmdldFRlc3RBc3NlcnRpb25MaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCBuZXh0IHRlc3QgYXNzZXJ0aW9uCi0gICAgICAgIHRlc3RBc3NlcnRpb24gPSAoVGVzdEFzc2VydGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAKLSAgICAgICAgLy8gQWRkIG1pc3NpbmdJbnB1dCByZXN1bHQKLSAgICAgICAgaWYgKHRlc3RBc3NlcnRpb24uaXNFbmFibGVkKCkpCi0gICAgICAgICAgYWRkTWlzc2luZ0lucHV0UmVzdWx0KHRlc3RBc3NlcnRpb24pOwotICAgICAgfQotICAKLSAgICAgIC8vIEluZGljYXRlIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGFzc2VydGlvbiB0YXJnZXQKLSAgICAgIHRoaXMucmVwb3J0ZXIuZW5kQ3VycmVudEVudHJ5KCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBhbGwgcmVzdWx0cyBmb3IgYW4gZW50cnkgdHlwZSB0byBtaXNzaW5nSW5wdXQuCi0gICAqIEBwYXJhbSBlbnRyeVR5cGUgYW4gRW50cnlUeXBlIG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW55IHByb2JsZW0gd2hpbGUgcHJvY2Vzc2luZy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldE1pc3NpbmdJbnB1dChFbnRyeVR5cGUgZW50cnlUeXBlKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb247Ci0KLSAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgRW50cnkgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgZW50cnkuc2V0RW50cnlUeXBlKGVudHJ5VHlwZSk7Ci0gICAgZW50cnkuc2V0UmVmZXJlbmNlSUQoIlsiICsgZW50cnlUeXBlLmdldFR5cGVOYW1lKCkgKyAiXSIpOwotCi0gICAgLy8gQWRkIGVudHJ5IHRvIGFydGlmYWN0Ci0gICAgdGhpcy5yZXBvcnRBcnRpZmFjdC5hZGRFbnRyeShlbnRyeSk7Ci0KLSAgICAvLyBBZGQgZW50cnkgdG8gcmVwb3J0Ci0gICAgdGhpcy5yZXBvcnRlci5zZXRDdXJyZW50RW50cnkoZW50cnkpOwotCi0gICAgLy90cnkgewotICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgdGVzdCBhc3NlcnRpb25zIGZvciB0aGUgYXJ0aWZhY3QKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHByb2ZpbGVBcnRpZmFjdC5nZXRUZXN0QXNzZXJ0aW9uTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgbmV4dCB0ZXN0IGFzc2VydGlvbgotICAgICAgdGVzdEFzc2VydGlvbiA9IChUZXN0QXNzZXJ0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBpZiAodGVzdEFzc2VydGlvbi5pc0VuYWJsZWQoKQotICAgICAgICAmJiBpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaCh0ZXN0QXNzZXJ0aW9uLCBlbnRyeSkpCi0gICAgICB7Ci0gICAgICAgIGFkZE1pc3NpbmdJbnB1dFJlc3VsdCh0ZXN0QXNzZXJ0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJbmRpY2F0ZSB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhpcyBlbnRyeQotICAgIHRoaXMucmVwb3J0ZXIuZW5kQ3VycmVudEVudHJ5KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL1Byb2ZpbGVWYWxpZGF0b3JGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvUHJvZmlsZVZhbGlkYXRvckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZGQxNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvUHJvZmlsZVZhbGlkYXRvckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudmVsb3BlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5NZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5Qcm9maWxlVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuVURESVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuV1NETFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5FbnZlbG9wZVZhbGlkYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZS5NZXNzYWdlVmFsaWRhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpLlVERElWYWxpZGF0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGwuV1NETFZhbGlkYXRvckltcGw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV1NJTERvY3VtZW50RmFjdG9yeS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvcjogUGV0ZXIgQnJpdHRlbmhhbQotICovCi1wdWJsaWMgY2xhc3MgUHJvZmlsZVZhbGlkYXRvckZhY3RvcnlJbXBsIGV4dGVuZHMgUHJvZmlsZVZhbGlkYXRvckZhY3RvcnkKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5Qcm9maWxlVmFsaWRhdG9yRmFjdG9yeSNuZXdVRERJVmFsaWRhdG9yKCkKLSAgICovCi0gIHB1YmxpYyBVRERJVmFsaWRhdG9yIG5ld1VERElWYWxpZGF0b3IoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgbmV3IFVEREkgdmFsaWRhdG9yIAotICAgIFVERElWYWxpZGF0b3IgdWRkaVZhbGlkYXRvciA9IG5ldyBVRERJVmFsaWRhdG9ySW1wbCgpOwotICAgIC8vIFJldHVybiB2YWxpZGF0b3IKLSAgICByZXR1cm4gdWRkaVZhbGlkYXRvcjsKLSAgfQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5I25ld1dTRExWYWxpZGF0b3IoKQotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3IgbmV3V1NETFZhbGlkYXRvcigpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBuZXcgV1NETCB2YWxpZGF0b3IgCi0gICAgV1NETFZhbGlkYXRvciB3c2RsVmFsaWRhdG9yID0gbmV3IFdTRExWYWxpZGF0b3JJbXBsKCk7Ci0KLSAgICAvLyBSZXR1cm4gdmFsaWRhdG9yCi0gICAgcmV0dXJuIHdzZGxWYWxpZGF0b3I7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5I25ld01lc3NhZ2VWYWxpZGF0b3IoKQotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VWYWxpZGF0b3IgbmV3TWVzc2FnZVZhbGlkYXRvcigpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBuZXcgbWVzc2FnZSB2YWxpZGF0b3IgCi0gICAgTWVzc2FnZVZhbGlkYXRvciBtZXNzYWdlVmFsaWRhdG9yID0gbmV3IE1lc3NhZ2VWYWxpZGF0b3JJbXBsKCk7Ci0gICAgLy8gUmV0dXJuIHZhbGlkYXRvcgotICAgIHJldHVybiBtZXNzYWdlVmFsaWRhdG9yOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5Qcm9maWxlVmFsaWRhdG9yRmFjdG9yeSNuZXdFbnZlbG9wZVZhbGlkYXRvcigpCi0gICAqLwotICBwdWJsaWMgRW52ZWxvcGVWYWxpZGF0b3IgbmV3RW52ZWxvcGVWYWxpZGF0b3IoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgbmV3IGVudmVsb3BlIHZhbGlkYXRvciAKLSAgICBFbnZlbG9wZVZhbGlkYXRvciBlbnZlbG9wZVZhbGlkYXRvciA9IG5ldyBFbnZlbG9wZVZhbGlkYXRvckltcGwoKTsKLSAgICAvLyBSZXR1cm4gdmFsaWRhdG9yCi0gICAgcmV0dXJuIGVudmVsb3BlVmFsaWRhdG9yOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQVAxOTIwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9BUDE5MjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmMmViZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9BUDE5MjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLQotLyoqCi0gKiBBUDE5MjAKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYW4gZW52ZWxvcGUgaW4gYSByZXNwb25zZSBtZXNzYWdlCi0gKiBjb250YWluaW5nIGEgc29hcDpGYXVsdCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkluIGEgZGVzY3JpcHRpb24sIGlmIGFuZCBvbmx5IGlmLCB0aGUgd3NkbDpvdXRwdXQKLSAqIGVsZW1lbnQgaXMgZGVzY3JpYmVkIHVzaW5nIFdTREwgTUlNRSBiaW5kaW5nLCB0aGVuIHRoZSBlbnZlbG9wZSBpbiB0aGUKLSAqIHJlc3BvbnNlIG1lc3NhZ2UgY2FuIGNvbnRhaW4gZmF1bHRzIHdpdGggYXR0YWNobWVudHMuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkyMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTkyMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkgCi0gICAgewotICAgICAgaWYgKCFlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuaXNNaW1lQ29udGVudCgpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBjaGVjayBmb3IgYSBmYXVsdCBlbGVtZW50IHdpdGhpbiB0aGUgbWVzc2FnZSAKLSAgICAgIGlmKChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSA9PSBudWxsKSB8fCAKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKS4KLSAgICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTSVRhZy5FTEVNX1NPQVBfRkFVTFQuZ2V0TmFtZXNwYWNlVVJJKCksIAotICAgICAgICAgICAgICBXU0lUYWcuRUxFTV9TT0FQX0ZBVUxULmdldExvY2FsUGFydCgpKS5nZXRMZW5ndGgoKSAhPSAxKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFUVVFU1QpLAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKSk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1hdGNoZWQgb3BlcmF0aW9uLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgLy8gSWYgdGhlIGVudmVsb3BlIGluIGEgcmVzcG9uc2UgbWVzc2FnZSBjb250YWlucyBhIGZhdWx0IHdpdGggYXR0YWNobWVudHMKLSAgICAgIC8vIGFuZCB0aGUgY29ycmVzcG9uZGluZyB3c2RsOm91dHB1dCBlbGVtZW50IGluIHRoZSBkZXNjcmlwdGlvbiBpcyBub3QgCi0gICAgICAvLyBkZXNjcmliZWQgdXNpbmcgdGhlIFdTREwgTUlNRSBiaW5kaW5nLCB0aGUgYXNzZXJ0aW9uIGlzIGZhaWxlZCAgCi0gICAgICBpZiAoKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKS5jb3VudCgpID4gMSkgJiYKLSAgICAgICAgICAoZ2V0TXVsdGlwYXJ0UmVsYXRlZEJpbmRpbmdzKGJpbmRpbmdPcGVyYXRpb24pID09IG51bGwpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IAotICAgICAgICAgIHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKCJUaGUgbWVzc2FnZSBjb250YWlucyBcIiIgKyAKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpLmNvdW50KCkgKyAiXCIgcGFydChzKSIsIAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7IAotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgTXVsdGlwYXJ0IHJlbGF0ZWQgYmluZGluZ3MsIGlmIGRvZXMgbm90IGZvdW5kLCByZXR1cm5zIG51bGwuCi0gICAqIEBwYXJhbSBvcCBiaW5kaW5nIG9wZXJhdGlvbgotICAgKiBAcmV0dXJuIE11bHRpcGFydCByZWxhdGVkIGJpbmRpbmdzLCBpZiBkb2VzIG5vdCBmb3VuZCwgcmV0dXJucyBudWxsLgotICAgKi8KLSAgcHJpdmF0ZSBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBnZXRNdWx0aXBhcnRSZWxhdGVkQmluZGluZ3MoCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIG9wKSAKLSAgewotICAgIC8vIEZpbmRpbmcgb3BlcmF0aW9uIGV4dGVuc2liaWxpdHkgZWxlbXMKLSAgICAvLyBpbiB0aGUgYmluZGluZyBkZXBlbmRpbmcgb24gbWVzc2FnZSB0eXBlCi0gICAgTGlzdCBleHRFbGVtcyA9IG9wLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAvLyBjaGVjayBsaXN0IG9uIGZpcnN0IGVsZW1lbnQKLSAgICBpZigoZXh0RWxlbXMgPT0gbnVsbCkgfHwgKGV4dEVsZW1zLnNpemUoKSA9PSAwKSB8fCAKLSAgICAgICAhKGV4dEVsZW1zLmdldCgwKSBpbnN0YW5jZW9mIE1JTUVNdWx0aXBhcnRSZWxhdGVkKSkKLSAgICAgIHJldHVybiBudWxsOwotICAgIHJldHVybiAoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW1zLmdldCgwKTsgCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9BUDE5MjguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0FQMTkyOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTY1ZmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0FQMTkyOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU1BhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTVGVybTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU1R5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTUlNRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NSU1FVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEFQMTkyOAotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBlbnZlbG9wZSBjb250YWluaW5nIGEgVVJJIHJlZmVyZW5jZQotICogdGhhdCBpcyB0eXBlZCB1c2luZyB0aGUgcmVmOnN3YVJlZiBzY2hlbWEgdHlwZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5JbiBhbiBlbnZlbG9wZSwgYSBVUkkgcmVmZXJlbmNlIHRoYXQgaXMgdHlwZWQgdXNpbmcKLSAqIHRoZSByZWY6c3dhUmVmIHNjaGVtYSB0eXBlIHJlc29sdmVzIHRvIGEgTUlNRSBwYXJ0IGluIHRoZSBzYW1lIG1lc3NhZ2UKLSAqIGFzIHRoZSBlbnZlbG9wZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTI4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTI4KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICghZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIC8vIGdldCB0aGUgcnJvdCBwYXJ0IG9mIGEgbXVsdGlwYXJ0L3JlbGF0ZWQgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgcm9vdCA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgTWltZVBhcnRzIG1pbWVQYXJ0cyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKTsKLQotICAgICAgLy8gZ2V0IGFuIG9wZXJhdGlvbiBtYXRjaGVkIGZvciB0aGUgbWVzc2FnZQotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwgcm9vdCk7Ci0gCi0gICAgICAvLyBpZiBubyBvbmUgb3BlcmF0aW9uIG1hdGNoZXMsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIGdldCB0aGUgY29ycmVzcG9uZGluZyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGFuZCBtZXNzYWdlCi0gICAgICBMaXN0IGV4dEVsZW1zOwotICAgICAgTWVzc2FnZSBtZXNzYWdlOwotICAgICAgaWYgKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QKLSAgICAgICAgLmVxdWFscyhlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSkpCi0gICAgICB7Ci0gICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSA9PSBudWxsID8gbnVsbAotICAgICAgICAgIDogYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgbWVzc2FnZSA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKSA9PSBudWxsID8gbnVsbAotICAgICAgICAgIDogYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSA9PSBudWxsID8gbnVsbAotICAgICAgICAgIDogYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgIG1lc3NhZ2UgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgOiBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgaW4gdGhlIFdTREwgYmluZGluZyBvcGVyYXRpb24sCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoZXh0RWxlbXMgPT0gbnVsbCB8fCBleHRFbGVtcy5zaXplKCkgPCAxKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBDb2xsZWN0aW5nIHRoZSBuYW1lcyBvZiBzY2hlbWEgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZAotICAgICAgLy8gd2l0aCB0aGUgcmVmOnN3YVJlZiBzY2hlbWEgdHlwZQotICAgICAgTGlzdCBzd2FSZWZzID0gZ2V0U3dhUmVmcygoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0RWxlbXMuZ2V0KDApLCBtZXNzYWdlKTsKLSAgICAgIC8vIElmIHN1Y2ggc2NoZW1hIGVsZW1lbnRzIGFyZSBub3QgZm91bmQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChzd2FSZWZzLmlzRW1wdHkoKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIHNjaGVtYSBlbGVtZW50IG5hbWVzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN3YVJlZnMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFFOYW1lIGVsZW1OYW1lID0gKFFOYW1lKSBzd2FSZWZzLmdldChpKTsKLSAgICAgICAgLy8gTG9va2luZyBmb3Igc3VjaCBlbGVtZW50cyBpbiB0aGUgcm9vdCBNSU1FIHBhcnQKLSAgICAgICAgTm9kZUxpc3QgZWxlbXMgPSByb290LmdldERvY3VtZW50RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgICBlbGVtTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgZWxlbU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgcmVmOnN3YVJlZiByZWZlcmVuY2VzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZWxlbXMuZ2V0TGVuZ3RoKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgZWxlbSA9IGVsZW1zLml0ZW0oaik7Ci0gICAgICAgICAgLy8gR2V0dGluZyBhIHZhbHVlIG9mIHRoaXMgcmVmZXJlbmNlCi0gICAgICAgICAgU3RyaW5nIHJlZiA9IGVsZW0uZ2V0Rmlyc3RDaGlsZCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICA6IGVsZW0uZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChyZWYgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgZWxlbWVudCAiICsgZWxlbS5nZXROb2RlTmFtZSgpCi0gICAgICAgICAgICAgICsgIiBvZiB0aGUgcmVmOnN3YVJlZiBzY2hlbWEgdHlwZSBpcyBzcGVjaWZpZWQsIGJ1dCBpdHMgdmF1bGUiCi0gICAgICAgICAgICAgICsgIiBpcyBpbnZhbGlkLiIpOwotICAgICAgICAgIC8vIElmIHRoZSBVUkkgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgImNpZDoiIGNvbnRlbnQtaWQgcHJlZml4Ci0gICAgICAgICAgLy8gVGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIXJlZi5zdGFydHNXaXRoKCJjaWQ6IikpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBVUkkgIiArIHJlZgotICAgICAgICAgICAgICArICIgb2YgdGhlIHJlZjpzd2FSZWYgc2NoZW1hIHR5cGUgbXVzdCB1c2UgdGhlIGNpZDogcHJlZml4LiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBib29sZWFuIHJlZkZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgSXRlcmF0b3IgaU1pbWVQYXJ0cyA9IG1pbWVQYXJ0cy5nZXRQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIE1JTUUgcGFydHMgb2YgdGhlIFNPQVAgbWVzc2FnZQotICAgICAgICAgIHdoaWxlIChpTWltZVBhcnRzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNaW1lUGFydCBtaW1lUGFydCA9IChNaW1lUGFydClpTWltZVBhcnRzLm5leHQoKTsKLSAgICAgICAgICAgIC8vIEdldHRpbmcgcGFydCdzIENvbnRlbnQtSUQgaGVhZGVyCi0gICAgICAgICAgICBTdHJpbmcgY2lkID0gTUlNRVV0aWxzLmdldE1pbWVIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgbWltZVBhcnQuZ2V0SGVhZGVycygpLCBNSU1FQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0lEKTsKLSAgICAgICAgICAgIGlmIChjaWQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gSWYgdGhlIGhlYWRlciB2YWx1ZSBlcXVhbHMgdGhlIHJlZmVyZW5jZSBVUkksCi0gICAgICAgICAgICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIE1JTUUgcGFydCBpcyBmb3VuZAotICAgICAgICAgICAgICBpZiAoY2lkLmVxdWFscygnPCcgKyByZWYuc3Vic3RyaW5nKDQpICsgJz4nKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlZkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBJZiB0aGUgY29ycmVzcG9uZGluZyBNSU1FIHBhcnQgaXMgbm90IGZvdW5kCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIXJlZkZvdW5kKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBTT0FQIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiIKLSAgICAgICAgICAgICAgKyAiIGEgTUlNRSBwYXJ0IHdpdGggdGhlIDwiICsgcmVmLnN1YnN0cmluZyg0KSArICI+IENvbnRlbnQtSUQuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIG5hbWVzIG9mIHNjaGVtYSBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIHdpdGggdGhlIHJlZjpzd2FSZWYKLSAgICogc2NoZW1hIHR5cGUuCi0gICAqIEBwYXJhbSBleHRFbGVtIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgZWxlbWVudC4KLSAgICogQHJldHVybiBhIGxpc3Qgb2Ygc3VjaCBuYW1lcyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRTd2FSZWZzKEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0sIE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIExpc3Qgc3dhUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfTVVMVElQQVJUKSkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSByb290IG1pbWU6cGFydAotICAgICAgTGlzdCBtaW1lUGFydHMgPSAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtKS5nZXRNSU1FUGFydHMoKTsKLSAgICAgIGlmIChtaW1lUGFydHMuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0dGluZyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIG9mIHRoZSBmaXJzdCBtaW1lOnBhcnQKLSAgICAgICAgTGlzdCBlbGVtcyA9ICgoTUlNRVBhcnQpIG1pbWVQYXJ0cy5nZXQoMCkpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBMaXN0IGJvdW5kUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBNSU1FIHBhcnQncyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZWxlbXMuc2l6ZSgpOyBrICsrKQotICAgICAgICB7Ci0gICAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZWxlbXMuZ2V0KGspOwotICAgICAgICAgIC8vIElmIHRoYXQgaXMgYSBzb2FwOmJvZHkKLSAgICAgICAgICBpZiAoZWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfQk9EWSkgJiYgbWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldHRpbmcgcGFydHMgc3BlY2lmaWVkIGJ5IHRoZSBwYXJ0cyBhdHRyaWJ1dGUKLSAgICAgICAgICAgIExpc3QgYm9keVBhcnRzID0gKChTT0FQQm9keSkgZWxlbSkuZ2V0UGFydHMoKTsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtZXNzYWdlIHBhcnRzIGJvdW5kIGJ5IHRoaXMgc29hcGJpbmQ6Ym9keQotICAgICAgICAgICAgSXRlcmF0b3IgaSA9IG1lc3NhZ2UuZ2V0UGFydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChib2R5UGFydHMgPT0gbnVsbCB8fCBib2R5UGFydHMuY29udGFpbnMocGFydC5nZXROYW1lKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm91bmRQYXJ0cy5hZGQocGFydCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gZWxzZSBpZiB0aGF0IGlzIGEgc29hcDpoZWFkZXIKLSAgICAgICAgICBlbHNlIGlmIChlbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfU09BUF9IRUFERVIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFFOYW1lIG1zZ05hbWU7Ci0gICAgICAgICAgICBTdHJpbmcgcGFydE5hbWU7Ci0gICAgICAgICAgICBpZiAoZWxlbSBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFNPQVBIZWFkZXIgaGVhZGVyID0gKFNPQVBIZWFkZXIpIGVsZW07Ci0gICAgICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IGlzIGJvdW5kIGJ5IHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICBtc2dOYW1lID0gaGVhZGVyLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgcGFydE5hbWUgPSBoZWFkZXIuZ2V0UGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gV1NETDRKIDEuNCBkb2VzIG5vdCByZWNvZ25pemUgc29hcDpoZWFkZXIgZWxlbWVudHMgdGhhdAotICAgICAgICAgICAgLy8gYXJlIGVuY2xvc2VkIGluIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCwgc28gdXNpbmcgYSB3b3JrYXJvdW5kCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEVsZW1lbnQgaGVhZGVyID0KLSAgICAgICAgICAgICAgICAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZWxlbSkuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBlbGVtZW50J3MgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgU3RyaW5nIG1zZ1ZhbCA9IGhlYWRlci5nZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiKTsKLSAgICAgICAgICAgICAgLy8gZmluZGluZyB0aGUgY29sb24gZGVsaW1pdGVyCi0gICAgICAgICAgICAgIGludCBjb2xvblBvcyA9IG1zZ1ZhbC5pbmRleE9mKCI6Iik7Ci0gICAgICAgICAgICAgIFN0cmluZyBucyA9IG51bGw7Ci0gICAgICAgICAgICAgIC8vIEdldHRpbmcgYSBsb2NhbCBwYXJ0Ci0gICAgICAgICAgICAgIFN0cmluZyBscCA9IGNvbG9uUG9zID4gLTEgPyBtc2dWYWwuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSkgOiBtc2dWYWw7Ci0gICAgICAgICAgICAgIC8vIElmIHRoZSBkZWxpbWl0ZXIgaXMgZm91bmQKLSAgICAgICAgICAgICAgaWYgKGNvbG9uUG9zID4gLTEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBSZXRyaWV2aW5nIGEgbmFtZXNwYWNlIFVSSQotICAgICAgICAgICAgICAgIG5zID0gdmFsaWRhdG9yLmdldFdTRExEb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgLmdldERlZmluaXRpb25zKCkuZ2V0TmFtZXNwYWNlKG1zZ1ZhbC5zdWJzdHJpbmcoMCwgY29sb25Qb3MpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtc2dOYW1lID0gbmV3IFFOYW1lKG5zLCBscCk7Ci0gICAgICAgICAgICAgIHBhcnROYW1lID0gaGVhZGVyLmdldEF0dHJpYnV0ZSgicGFydCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgcmVmZXJlbmNlZCBieSB0aGlzIHNvYXBiaW5kOmhlYWRlciBlbGVtZW50Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IAotICAgICAgICAgICAgICB2YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKS5nZXRNZXNzYWdlKG1zZ05hbWUpOwotICAgICAgICAgICAgaWYgKG1zZyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBBZGRpbmcgdGhlIHBhcnQgdG8gdGhlIGxpc3Qgb2YgYm91bmQgcGFydHMKLSAgICAgICAgICAgICAgUGFydCBwYXJ0ID0gbXNnLmdldFBhcnQocGFydE5hbWUpOwotICAgICAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGJvdW5kUGFydHMuYWRkKHBhcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsbCB0aGUgYm91bmQgcGFydHMgZnJvbSBzb2FwYmluZDpib2R5IGFuZCBzb2FwYmluZDpoZWFkZXIKLSAgICAgICAgLy8gYXJlIGNvbGxlY3RlZCwgZmluZGluZyBzd2FSZWYgcmVmZXJlbmNlcy4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZFBhcnRzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGJvdW5kUGFydHMuZ2V0KGkpOwotICAgICAgICAgIFFOYW1lIHJlZjsKLSAgICAgICAgICBzaG9ydCB0eXBlOwotICAgICAgICAgIC8vIEdldHRpbmcgZWl0aGVyIHBhcnQncyBlbGVtZW50IHJlZmVyZW5jZSBvciB0eXBlIHJlZmVyZW5jZQotICAgICAgICAgIGlmICgocmVmID0gcGFydC5nZXRUeXBlTmFtZSgpKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGUgPSBYU0NvbnN0YW50cy5UWVBFX0RFRklOSVRJT047Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKChyZWYgPSBwYXJ0LmdldEVsZW1lbnROYW1lKCkpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHlwZSA9IFhTQ29uc3RhbnRzLkVMRU1FTlRfREVDTEFSQVRJT047Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFRoZSBwYXJ0IGNvbmF0aW5zIG5laXRoZXIgZWxlbWVudCBub3IgdHlwZSBhdHRyaWJ1dGUsCi0gICAgICAgICAgLy8gcHJvY2VlZGluZyB3aXRoIHRoZSBuZXh0IHBhcnQKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIEdldHRpbmcgYSBsaXN0IG9mIHNjaGVtYXMgZGVmaW5lZAotICAgICAgICAgIE1hcCBzY2hlbWFzID0gdmFsaWRhdG9yLmdldFdTRExEb2N1bWVudCgpLmdldFNjaGVtYXMoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBzY2hlbWFzCi0gICAgICAgICAgSXRlcmF0b3IgaXQgPSBzY2hlbWFzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBYU01vZGVsIHhzTW9kZWwgPSAoWFNNb2RlbCkgaXQubmV4dCgpOwotICAgICAgICAgICAgWFNUeXBlRGVmaW5pdGlvbiB4c1R5cGUgPSBudWxsOwotICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyBwYXJ0IHR5cGUKLSAgICAgICAgICAgIGlmICh0eXBlID09IFhTQ29uc3RhbnRzLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIEdldHRpbmcgc2NoZW1hIGVsZW1lbnQKLSAgICAgICAgICAgICAgWFNFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9IHhzTW9kZWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKAotICAgICAgICAgICAgICAgIHJlZi5nZXRMb2NhbFBhcnQoKSwgcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgICAgICAgICAgaWYgKGVsZW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEdldHRpbmcgZWxlbWVudCdzIHR5cGUKLSAgICAgICAgICAgICAgICB4c1R5cGUgPSBlbGVtLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICAgICAgLy8gSWYgaXQgaXMgcmVmOnN3YVJlZgotICAgICAgICAgICAgICAgIGlmIChXU0lDb25zdGFudHMuTlNfVVJJX1NXQV9SRUYuZXF1YWxzKHhzVHlwZS5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAmJiBXU0lDb25zdGFudHMuU0NIRU1BX1RZUEVfU1dBX1JFRi5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgIHhzVHlwZS5nZXROYW1lc3BhY2UoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICAgICAgICBzd2FSZWZzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFFOYW1lKGVsZW0uZ2V0TmFtZXNwYWNlKCksIGVsZW0uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHhzVHlwZSA9IHhzTW9kZWwuZ2V0VHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICAgICAgcmVmLmdldExvY2FsUGFydCgpLCByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIGVsZW1lbnQgbmFtZXMsYWRkaW5nIGVsZW1lbnQgbmFtZXMgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgIHN3YVJlZnMuYWRkQWxsKGNvbGxlY3RTd2FSZWZzKHhzVHlwZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3dhUmVmczsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBuYW1lcyBvZiBzY2hlbWEgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCB3aXRoIHRoZSByZWY6c3dhUmVmCi0gICAqIHNjaGVtYSB0eXBlLgotICAgKiBAcGFyYW0geHNUeXBlIGEgc2NoZW1hIHR5cGUuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIG5hbWVzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGNvbGxlY3RTd2FSZWZzKFhTVHlwZURlZmluaXRpb24geHNUeXBlKQotICB7Ci0gICAgTGlzdCBzd2FSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh4c1R5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGlzIGlzIGEgY29tcGxleCB0eXBlCi0gICAgICBpZiAoeHNUeXBlLmdldFR5cGVDYXRlZ29yeSgpID09IFhTVHlwZURlZmluaXRpb24uQ09NUExFWF9UWVBFKQotICAgICAgewotICAgICAgICBYU0NvbXBsZXhUeXBlRGVmaW5pdGlvbiB4c0NvbXBsZXhUeXBlID0KLSAgICAgICAgICAoWFNDb21wbGV4VHlwZURlZmluaXRpb24pIHhzVHlwZTsKLSAgICAgICAgLy8gSWYgaXQgY29udGFpbnMgbWl4ZWQgY29udGV4dAotICAgICAgICBpZiAoeHNDb21wbGV4VHlwZS5nZXRQYXJ0aWNsZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjb2xsZWN0aW5nIGVsZW1lbnQgbmFtZXMgCi0gICAgICAgICAgc3dhUmVmcy5hZGRBbGwoY29sbGVjdFN3YVJlZnMoeHNDb21wbGV4VHlwZS5nZXRQYXJ0aWNsZSgpLmdldFRlcm0oKSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzd2FSZWZzOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIG5hbWVzIG9mIHNjaGVtYSBlbGVtZW50cyB0aGF0IGFyZSBkZWZpbmVkIHdpdGggdGhlIHJlZjpzd2FSZWYKLSAgICogc2NoZW1hIHR5cGUuCi0gICAqIEBwYXJhbSB0ZXJtIGEgc2NoZW1hIHRlcm0uCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIG5hbWVzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGNvbGxlY3RTd2FSZWZzKFhTVGVybSB0ZXJtKQotICB7Ci0gICAgTGlzdCBzd2FSZWZzID0gbmV3IEFycmF5TGlzdCgpOyAKLSAgICAvLyBJZiBhIHRlcm0gaXMgYW4gZWxlbWVudCBkZWNsYXJhdGlvbgotICAgIGlmICh0ZXJtLmdldFR5cGUoKSA9PSBYU0NvbnN0YW50cy5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgIHsKLSAgICAgIFhTRWxlbWVudERlY2xhcmF0aW9uIGVsZW0gPSAoWFNFbGVtZW50RGVjbGFyYXRpb24pIHRlcm07Ci0gICAgICBYU1R5cGVEZWZpbml0aW9uIHhzVHlwZSA9IGVsZW0uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIC8vIElmIGVsZW1lbnQncyB0eXBlIGlzIHJlZjpzd2FSZWYKLSAgICAgIGlmIChXU0lDb25zdGFudHMuTlNfVVJJX1NXQV9SRUYuZXF1YWxzKHhzVHlwZS5nZXROYW1lc3BhY2UoKSkKLSAgICAgICAgJiYgV1NJQ29uc3RhbnRzLlNDSEVNQV9UWVBFX1NXQV9SRUYuZXF1YWxzKHhzVHlwZS5nZXROYW1lKCkpKQotICAgICAgewotICAgICAgICAvLyBBZGQgZWxlbWVudCdzIG5hbWUgdG8gdGhlIGxpc3QKLSAgICAgICAgc3dhUmVmcy5hZGQoCi0gICAgICAgICAgbmV3IFFOYW1lKGVsZW0uZ2V0TmFtZXNwYWNlKCksIGVsZW0uZ2V0TmFtZSgpKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIGVsc2UgY29sbGVjdGluZyBlbGVtZW50IG5hbWVzIGZyb20gZWxlbWVudCdzIHR5cGUKLSAgICAgICAgc3dhUmVmcy5hZGRBbGwoY29sbGVjdFN3YVJlZnMoeHNUeXBlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGVsc2UgaWYgYSB0ZXJtIGlzIGEgbW9kZWwgZ3JvdXAKLSAgICBlbHNlIGlmKHRlcm0uZ2V0VHlwZSgpID09IFhTQ29uc3RhbnRzLk1PREVMX0dST1VQKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBsaXN0IG9mIFBhcnRpY2xlIHNjaGVtYSBjb21wb25lbnRzCi0gICAgICBYU09iamVjdExpc3QgbGlzdCA9ICgoWFNNb2RlbEdyb3VwKSB0ZXJtKS5nZXRQYXJ0aWNsZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICAvLyBDb2xsZWN0aW5nIGVsZW1lbnQgbmFtZXMKLSAgICAgICAgc3dhUmVmcy5hZGRBbGwoY29sbGVjdFN3YVJlZnMoKChYU1BhcnRpY2xlKSBsaXN0Lml0ZW0oaSkpLmdldFRlcm0oKSkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3dhUmVmczsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAwNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDA1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYTQ2NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk9wZXJhdGlvblNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTAwNS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAwNSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAwNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBQYXJzZSBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgLy8gSWYgdGhpcyBpcyBhIGZhdWx0IG1lc2FnZSwgdGhlbiBpdCBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzRmF1bHQoZG9jKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBzb2FwIGJvZHkgZWxlbWVudAotICAgICAgaWYgKCF0aGlzLnZhbGlkYXRvci5jb250YWluc1NvYXBCb2R5V2l0aENoaWxkKGRvYykpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFBhcnNlIHJlcXVlc3QgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jUmVxdWVzdCA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKTsKLQotICAgICAgLy8gZ2V0IFNPQVBBY3Rpb24KLSAgICAgIFN0cmluZyBoZWFkZXJzID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRIVFRQSGVhZGVycygpOwotICAgICAgU3RyaW5nIGFjdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgICAgICBhY3Rpb24gPSAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhoZWFkZXJzLCAiOiIpLmdldCgiU09BUEFjdGlvbiIudG9VcHBlckNhc2UoKSk7Ci0KLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKClbMF07Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICB2YWxpZGF0b3IpOwotICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLk9wZXJhdGlvbk1hdGNoIG1hdGNoID0KLSAgICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLm1hdGNoT3BlcmF0aW9uKAotICAgICAgICAgIGRvY1JlcXVlc3QsCi0gICAgICAgICAgYWN0aW9uLAotICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgcmVnaXN0cnkpOwotICAgICAgaWYgKG1hdGNoID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG1hdGNoLmdldE9wZXJhdGlvbigpOwotCi0gICAgICAvLyBJcyBycGMgc3R5bGU/Ci0gICAgICBpZiAoIVdTSUNvbnN0YW50cwotICAgICAgICAuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDCi0gICAgICAgIC5lcXVhbHMobWF0Y2guZ2V0T3BlcmF0aW9uU3R5bGUoKSkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIExpc3QgZXh0RWxlbWVudHMgPSBudWxsOwotCi0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgZXh0RWxlbWVudHMgPQotICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotCi0gICAgICAvLyBJcyBtZXNzYWdlIFJQQy1saXRlcmFsPwotICAgICAgaWYgKCF2YWxpZGF0b3IuaXNMaXRlcmFsKGV4dEVsZW1lbnRzKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy9HZXQgbWVzc2FnZQotCi0gICAgICAvLyBHZXRzIGJvZHkKLSAgICAgIE5vZGVMaXN0IHNvYXBCb2R5TGlzdCA9Ci0gICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fQk9EWSk7Ci0gICAgICBpZiAoc29hcEJvZHlMaXN0LmdldExlbmd0aCgpID09IDAgfHwgc29hcEJvZHlMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgbm90IGEgYm9keSBvciBtb3JlIHRoYW4gb25lIGJvZGllcyBpbiB0aGUgZW52bG9wZS4KLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIEVsZW1lbnQgc29hcEJvZHlFbGVtID0gKEVsZW1lbnQpIHNvYXBCb2R5TGlzdC5pdGVtKDApOwotCi0gICAgICAvLyBGaW5kIHdyYXBwZXIgZWxlbWVudCBpbiB0aGUgYm9keQotICAgICAgRWxlbWVudCB3cmFwcGVyRWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoc29hcEJvZHlFbGVtKTsKLSAgICAgIGlmICh3cmFwcGVyRWxlbWVudCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBpZiAod3JhcHBlckVsZW1lbnQKLSAgICAgICAgLmdldExvY2FsTmFtZSgpCi0gICAgICAgIC5lcXVhbHMoYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiUmVzcG9uc2UiKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgfQotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5NDg2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi0vKioKLSAqIEJQMTAwNwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlLCBpbiB0aGUgbWVzc2FnZSBsb2cgZmlsZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5EVERzIHJlbGF0aW5nIHRvIHNvYXA6aGVhZGVyIG9yIHNvYXA6Ym9keSBkb2N1bWVudHMsIGFyZSBub3QgcHJlc2VudCBpbiB0aGUgbWVzc2FnZTogbm8gRE9DVFlQRSBlbGVtZW50IGlzIHByZXNlbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAwNyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAwNyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBQYXJzZSBsb2cgbWVzc2FnZSAKLSAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgewotICAgICAgLy8gbWVzc2FnZSBpcyBlbXB0eSBvciBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICAvLyBlbHNlIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIGEgRG9jdW1lbnQgVHlwZSBEZWNsYXJhdGlvbiwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICBlbHNlIGlmIChkb2MuZ2V0RG9jdHlwZSgpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RmFpbHVyZURldGFpbERlc2NyaXB0aW9uKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDA4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMDIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk9wZXJhdGlvblNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTAwOC4KLSAqIE1lc3NhZ2UgaGFzIHBhcnQgYWNjZXNzb3IgZWxlbWVudHMgZm9yIHBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZSwgaW4gbm8gbmFtZXNwYWNlcywgCi0gKiBidXQgdGhlIGNoaWxkcmVuIG9mIHRoZXNlIGFyZSBuYW1lc3BhY2UgcXVhbGlmaWVkIHdpdGggdGhlIHNhbWUgdGFyZ2V0TmFtZXNwYWNlIHdpdGggd2hpY2ggCi0gKiB0aGVpciB0eXBlcyBhcmUgZGVmaW5lZC4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAwOCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAwOChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotCi0gICAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFKTsKLQotICAgICAgLy8gUGFyc2UgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1lc3NhZ2UsIHRoZW4gdGhyb3cgZmFpbCBleGNlcHRpb24KLSAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLQotICAgICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzRmF1bHQoZG9jKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc29hcCBib2R5IGVsZW1lbnQKLSAgICAgIGlmICghdGhpcy52YWxpZGF0b3IuY29udGFpbnNTb2FwQm9keVdpdGhDaGlsZChkb2MpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBQYXJzZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvY1JlcXVlc3QgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0KLSAgICAgIC8vIGdldCBTT0FQQWN0aW9uCi0gICAgICBTdHJpbmcgYWN0aW9uID0KLSAgICAgICAgdmFsaWRhdG9yLmdldFNvYXBBY3Rpb24oZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRIVFRQSGVhZGVycygpKTsKLQotICAgICAgQmluZGluZyBiaW5kaW5nID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXTsKLSAgICAgIC8vRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gZW50cnlDb250ZXh0LmdldEFuYWx5emVyQ29udGV4dCgpLmdldENhbmRpZGF0ZUluZm8oKS5nZXREZWZpbml0aW9ucygpWzBdOwotICAgICAgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSA9Ci0gICAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCksCi0gICAgICAgICAgdmFsaWRhdG9yKTsKLSAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5PcGVyYXRpb25NYXRjaCBtYXRjaCA9Ci0gICAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5tYXRjaE9wZXJhdGlvbigKLSAgICAgICAgICBkb2NSZXF1ZXN0LAotICAgICAgICAgIGFjdGlvbiwKLSAgICAgICAgICBiaW5kaW5nLAotICAgICAgICAgIHJlZ2lzdHJ5KTsKLSAgICAgIGlmIChtYXRjaCA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBtYXRjaC5nZXRPcGVyYXRpb24oKTsKLQotICAgICAgLy8gSXMgcnBjIHN0eWxlPwotICAgICAgaWYgKCFXU0lDb25zdGFudHMKLSAgICAgICAgLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQwotICAgICAgICAuZXF1YWxzKG1hdGNoLmdldE9wZXJhdGlvblN0eWxlKCkpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFKTsKLQotICAgICAgLy8gR2V0cyBib2R5Ci0gICAgICBOb2RlTGlzdCBzb2FwQm9keUxpc3QgPQotICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0JPRFkpOwotICAgICAgaWYgKHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKSA9PSAwIHx8IHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKSA+IDEpCi0gICAgICB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vdCBhIGJvZHkgb3IgbW9yZSB0aGFuIG9uZSBib2RpZXMgaW4gdGhlIGVudmxvcGUuCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBFbGVtZW50IHNvYXBCb2R5RWxlbSA9IChFbGVtZW50KSBzb2FwQm9keUxpc3QuaXRlbSgwKTsKLQotICAgICAgcmVzdWx0ID0gbnVsbDsKLQotICAgICAgLy8gRmluZCBvcGVyYXRpb24gaW4gdGhlIGJvZHkKLSAgICAgIEVsZW1lbnQgc29hcE9wZXJhdGlvbiA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoc29hcEJvZHlFbGVtKTsKLSAgICAgIGlmIChzb2FwT3BlcmF0aW9uID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZpbmQgb3BlcmF0aW9uIG1lc3NhZ2UgYW5kIGV4dC4gZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcKLSAgICAgIE1lc3NhZ2Ugb3BlcmF0aW9uTWVzc2FnZSA9IG51bGw7Ci0gICAgICBMaXN0IGV4dEVsZW1lbnRzID0gbnVsbDsKLSAgICAgIGlmIChNZXNzYWdlRW50cnkKLSAgICAgICAgLlRZUEVfUkVRVUVTVAotICAgICAgICAuZXF1YWxzKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkpKQotICAgICAgewotICAgICAgICBvcGVyYXRpb25NZXNzYWdlID0KLSAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgICAgIGV4dEVsZW1lbnRzID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChNZXNzYWdlRW50cnkKLSAgICAgICAgICAuVFlQRV9SRVNQT05TRQotICAgICAgICAgIC5lcXVhbHMoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvcGVyYXRpb25NZXNzYWdlID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKSAhPSBudWxsKQotICAgICAgICAgICAgZXh0RWxlbWVudHMgPQotICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJcyBtZXNzYWdlIFJQQy1saXRlcmFsPwotICAgICAgaWYgKCF2YWxpZGF0b3IuaXNMaXRlcmFsKGV4dEVsZW1lbnRzKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSk7Ci0KLSAgICAgIC8vIGdldHMgZmlyc3QgY2hpbGQgb2YgbWVzc2FnZQotICAgICAgRWxlbWVudCBzb2FwTWVzc2FnZVBhcnQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKHNvYXBPcGVyYXRpb24pOwotICAgICAgaWYgKHNvYXBNZXNzYWdlUGFydCA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICB3aGlsZSAoc29hcE1lc3NhZ2VQYXJ0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgcGFydCBhY2Nlc3NvciBvciByZXR1cm4gYXJlIGluIG5vIG5hbWVzcGFjZQkJICAgIAkJCi0KLSAgICAgICAgaWYgKHNvYXBNZXNzYWdlUGFydC5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsCi0gICAgICAgICAgfHwgIiIuZXF1YWxzKHNvYXBNZXNzYWdlUGFydC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gICAgY2hlY2sgd2hldGhlciBjaGlsZHJlbiBhcmUgbmFtZXNwYWNlIHF1YWxpZmllZCAKLSAgICAgICAgLy8gIHdpdGggdGhlIHNhbWUgdGFyZ2V0TmFtZXNwYWNlIHdpdGggd2hpY2ggdGhlaXIgdHlwZXMgYXJlIGRlZmluZWQKLSAgICAgICAgU3RyaW5nIHR5cGVzVGFyZ2V0TlMgPQotICAgICAgICAgIGdldFR5cGVOUyhvcGVyYXRpb25NZXNzYWdlLCBzb2FwTWVzc2FnZVBhcnQuZ2V0TG9jYWxOYW1lKCkpOwotCi0gICAgICAgIGlmICh0eXBlc1RhcmdldE5TID09IG51bGwpCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLQotICAgICAgICBpZiAoIWNoZWNrQ2hpbGRyZW5OYW1lc3BhY2Uoc29hcE1lc3NhZ2VQYXJ0LCB0eXBlc1RhcmdldE5TKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzb2FwTWVzc2FnZVBhcnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhzb2FwTWVzc2FnZVBhcnQpOwotICAgICAgfQotCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGUuZ2V0TWVzc2FnZSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgcmVzdWx0ID0gZS5nZXRNZXNzYWdlKCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKG51bGwsIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgcGFydCB0eXBlIE5TLgotICAgKiBAcGFyYW0gbWVzc2FnZQotICAgKiBAcGFyYW0gcGFydE5hbWUKLSAgICogQHJldHVybiBTdHJpbmcKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldFR5cGVOUyhNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBwYXJ0TmFtZSkKLSAgewotICAgIFBhcnQgcGFydCA9IG1lc3NhZ2UuZ2V0UGFydChwYXJ0TmFtZSk7Ci0gICAgaWYgKHBhcnQgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBwYXJ0LmdldFR5cGVOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIGNoaWxkcmVuIGVsZW1lbnRzJyBuYW1lc3BhY2UuCi0gICAqIEBwYXJhbSBub2RlCi0gICAqIEBwYXJhbSB0eXBlc1RhcmdldE5TCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLQotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDaGlsZHJlbk5hbWVzcGFjZShFbGVtZW50IG5vZGUsIFN0cmluZyB0eXBlc1RhcmdldE5TKQotICB7Ci0gICAgTm9kZUxpc3QgcGFydHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5nZXRMZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcGFydCA9IChFbGVtZW50KSBwYXJ0cy5pdGVtKGkpOwotICAgICAgaWYgKCF0eXBlc1RhcmdldE5TLmVxdWFscyhwYXJ0LmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKCFjaGVja0NoaWxkcmVuTmFtZXNwYWNlKHBhcnQsIHR5cGVzVGFyZ2V0TlMpKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMDkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYxZTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAwOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb25UeXBlOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuT3BlcmF0aW9uU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMDA5LgotICogTWVzc2FnZSBpbmNsdWRlcyBhbGwgc29hcGJpbmQ6aGVhZGVycyBzcGVjaWZpZWQgaW4gdGhlIHdzZGw6aW5wdXQgCi0gKiAoaWYgcmVxdWVzdCkgb3Igd3NkbDpvdXRwdXQgKGlmIHJlc3BvbnNlKSBvZiB0aGUgb3BlcmF0aW9uIHJlZmVycmVkIAotICogdG8gYnkgaXRzIHdzZGw6YmluZGluZywgYW5kIG1heSBhbHNvIGluY2x1ZGUgaGVhZGVycyB0aGF0IHdlcmUgbm90IHNwZWNpZmllZC4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAwOSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAwOShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFBhcnNlIG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICAvLyBQYXJzZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvY1JlcXVlc3QgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0KLSAgICAgIGlmIChkb2MgPT0gbnVsbCB8fCBkb2NSZXF1ZXN0ID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc29hcCBib2R5IGVsZW1lbnQKLSAgICAgIGlmICghdGhpcy52YWxpZGF0b3IuY29udGFpbnNTb2FwQm9keVdpdGhDaGlsZChkb2MpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNGYXVsdChkb2MpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFKTsKLSAgICAgIH0KLQotICAgICAgLy8gZ2V0IFNPQVBBY3Rpb24KLSAgICAgIFN0cmluZyBoZWFkZXJzID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRIVFRQSGVhZGVycygpOwotICAgICAgU3RyaW5nIGFjdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaGVhZGVycyAhPSBudWxsKQotICAgICAgICBhY3Rpb24gPSAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhoZWFkZXJzLCAiOiIpLmdldCgiU09BUEFjdGlvbiIudG9VcHBlckNhc2UoKSk7Ci0KLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKClbMF07Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICB2YWxpZGF0b3IpOwotICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLk9wZXJhdGlvbk1hdGNoIG1hdGNoID0KLSAgICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLm1hdGNoT3BlcmF0aW9uKAotICAgICAgICAgIGRvY1JlcXVlc3QsCi0gICAgICAgICAgYWN0aW9uLAotICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgcmVnaXN0cnkpOwotCi0gICAgICBpZiAobWF0Y2ggPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbWF0Y2guZ2V0T3BlcmF0aW9uKCk7Ci0KLSAgICAgIC8vIElmIHRoaXMgaXMgYSBvbmUtd2F5IG9wZXJhdGlvbiBhbmQgd2UgYXJlIHByb2Nlc3NpbmcgYSByZXNwb25zZSwgdGhlbiBzZXQgcmVzdWx0IHRvIG5vdEFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgIC5nZXRPcGVyYXRpb24oKQotICAgICAgICAuZ2V0U3R5bGUoKQotICAgICAgICAuZXF1YWxzKE9wZXJhdGlvblR5cGUuT05FX1dBWSkKLSAgICAgICAgJiYgKGVudHJ5Q29udGV4dAotICAgICAgICAgIC5nZXRNZXNzYWdlRW50cnkoKQotICAgICAgICAgIC5nZXRUeXBlKCkKLSAgICAgICAgICAuZXF1YWxzKE1lc3NhZ2VFbnRyeS5UWVBFX1JFU1BPTlNFKSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGZpbmQgYm9keQotICAgICAgTm9kZUxpc3Qgc29hcEJvZHlMaXN0ID0KLSAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLAotICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9CT0RZKTsKLSAgICAgIGlmIChzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCB8fCBzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKQotICAgICAgewotICAgICAgICAvLyBUaGVyZSBpcyBub3QgYSBib2R5IG9yIG1vcmUgdGhhbiBvbmUgYm9kaWVzIGluIHRoZSBlbnZsb3BlLgotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgRWxlbWVudCBzb2FwQm9keUVsZW0gPSAoRWxlbWVudCkgc29hcEJvZHlMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgIC8vIGZpbmQgaGVhZGVycwotICAgICAgTm9kZUxpc3Qgc29hcEhlYWRlcnMgPQotICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICBXU0lUYWcuRUxFTV9TT0FQX0hFQURFUi5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICBXU0lUYWcuRUxFTV9TT0FQX0hFQURFUi5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgIC8vZmluZCBhbGwgb3BlcmF0aW9uCi0gICAgICAvL0VsZW1lbnQgc29hcE9wZXJhdGlvbiA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoc29hcEJvZHlFbGVtKTsKLQotICAgICAgLy8gZ2V0cyBzb2FwYmluZDpoZWFkZXJzCi0gICAgICBMaXN0IGJpbmRpbmdIZWFkZXJzID0gbnVsbDsKLSAgICAgIGlmIChlbnRyeUNvbnRleHQKLSAgICAgICAgLmdldE1lc3NhZ2VFbnRyeSgpCi0gICAgICAgIC5nZXRUeXBlKCkKLSAgICAgICAgLmVxdWFscyhNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICAgICAgICBiaW5kaW5nSGVhZGVycyA9Ci0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoZW50cnlDb250ZXh0Ci0gICAgICAgICAgLmdldE1lc3NhZ2VFbnRyeSgpCi0gICAgICAgICAgLmdldFR5cGUoKQotICAgICAgICAgIC5lcXVhbHMoTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICAgICAgICBiaW5kaW5nSGVhZGVycyA9Ci0gICAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChiaW5kaW5nSGVhZGVycyA9PSBudWxsIHx8IGJpbmRpbmdIZWFkZXJzLnNpemUoKSA9PSAwKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGJpbmRpbmdIZWFkZXJzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3QgYmluZGluZ0hlYWRlciA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKGJpbmRpbmdIZWFkZXIgaW5zdGFuY2VvZiBTT0FQSGVhZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gZmluZCBzb2FwYmluZDpoZWFkZXIgaW4gU09BUCBtZXNzYWdlCi0gICAgICAgICAgaWYgKCFpc0JpbmRpbmdIZWFkZXJJblNPQVBNZXNzYWdlKGVudHJ5Q29udGV4dCwKLSAgICAgICAgICAgIHNvYXBIZWFkZXJzLAotICAgICAgICAgICAgKFNPQVBIZWFkZXIpIGJpbmRpbmdIZWFkZXIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZS5nZXRNZXNzYWdlKCkubGVuZ3RoKCkgPiAwKQotICAgICAgICByZXN1bHQgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQgPT0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwobnVsbCwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgKiBDaGVja3Mgd2hldGhlciBzcGVjaWZpZWQgU09BUEhlYWRlciBpcyBpbiB0aGUgU09BUE1lc3NhZ2UuCi0gICogQHBhcmFtIHNvYXBIZWFkZXJMaXN0Ci0gICogQHBhcmFtIFNPQVBIZWFkZXIKLSAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzQmluZGluZ0hlYWRlckluU09BUE1lc3NhZ2UoCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCwKLSAgICBOb2RlTGlzdCBzb2FwSGVhZGVycywKLSAgICBTT0FQSGVhZGVyIGJpbmRpbmdIZWFkZXIpCi0gIHsKLQotICAgIE1lc3NhZ2UgbXNnID0gZ2V0TWVzc2FnZUJ5UU5hbWUoZW50cnlDb250ZXh0LCBiaW5kaW5nSGVhZGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgaWYgKG1zZyA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgUGFydCBwYXJ0ID0gbXNnLmdldFBhcnQoYmluZGluZ0hlYWRlci5nZXRQYXJ0KCkpOwotICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBRTmFtZSBwYXJ0RWxlbWVudE5hbWUgPSBwYXJ0LmdldEVsZW1lbnROYW1lKCk7Ci0gICAgUU5hbWUgcGFydFR5cGVOYW1lID0gcGFydC5nZXRUeXBlTmFtZSgpOwotCi0gICAgaWYgKHBhcnRUeXBlTmFtZSA9PSBudWxsICYmIHBhcnRFbGVtZW50TmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHNvYXBIZWFkZXJzID09IG51bGwgfHwgc29hcEhlYWRlcnMuZ2V0TGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFZlY3RvciBoZWFkZXJzTGlzdCA9Ci0gICAgICBYTUxVdGlscy5nZXRDaGlsZEVsZW1lbnRzKChFbGVtZW50KSBzb2FwSGVhZGVycy5pdGVtKDApKTsKLQotICAgIGZvciAoaW50IGluZGV4SGVhZGVyID0gMDsKLSAgICAgIGluZGV4SGVhZGVyIDwgaGVhZGVyc0xpc3Quc2l6ZSgpOwotICAgICAgaW5kZXhIZWFkZXIrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IHNvYXBIZWFkZXJQYXJ0ID0gKEVsZW1lbnQpIGhlYWRlcnNMaXN0LmdldChpbmRleEhlYWRlcik7Ci0gICAgICBpZiAoc29hcEhlYWRlclBhcnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgUU5hbWUgc29hcEhlYWRlclBhcnRRTmFtZSA9Ci0gICAgICAgICAgbmV3IFFOYW1lKAotICAgICAgICAgICAgc29hcEhlYWRlclBhcnQuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICBzb2FwSGVhZGVyUGFydC5nZXRMb2NhbE5hbWUoKSk7Ci0gICAgICAgIGlmICgocGFydFR5cGVOYW1lICE9IG51bGwKLSAgICAgICAgICAmJiBwYXJ0VHlwZU5hbWUuZXF1YWxzKHNvYXBIZWFkZXJQYXJ0UU5hbWUpKQotICAgICAgICAgIHx8IChwYXJ0RWxlbWVudE5hbWUgIT0gbnVsbAotICAgICAgICAgICAgJiYgcGFydEVsZW1lbnROYW1lLmVxdWFscyhzb2FwSGVhZGVyUGFydFFOYW1lKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIG1lc3NhZ2UgYnkgUU5hbWUuCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQKLSAgICogQHBhcmFtIG1lc3NhZ2VOYW1lCi0gICAqIEByZXR1cm4gTWVzc2FnZQotICAgKi8KLSAgcHJpdmF0ZSBNZXNzYWdlIGdldE1lc3NhZ2VCeVFOYW1lKAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQsCi0gICAgUU5hbWUgbWVzc2FnZU5hbWUpCi0gIHsKLSAgICBEZWZpbml0aW9uW10gZGVmcyA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb25zKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIE1lc3NhZ2UgbXNnID0gZGVmc1tpXS5nZXRNZXNzYWdlKG1lc3NhZ2VOYW1lKTsKLSAgICAgIGlmIChtc2cgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAxMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDdhNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblBhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIEJQMTAxMS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAxMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAxMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBUT0RPIG5lZWQgdG8gaGFuZGxlIHNvYXAgd2l0aCBhdHRhY2htZW50cwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0gICAgICAJIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAKLSAgICAgIEJpbmRpbmdbXSBiaW5kaW5ncyA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKCk7Ci0KLSAgICAgIC8vIGdldCBzb2FwIG1lc3NhZ2UgY2hpbGQgbmFtZQotICAgICAgLy8gR2V0IHRoZSBET00gY29udGVudHMgb2YgdGhlIG1lc3NhZ2Ugc29hcDpib2R5IChpZiBub24tZW1wdHkpCi0gICAgICBEb2N1bWVudCBtZXNzYWdlRG9jID0gbnVsbDsKLQotICAgICAgUU5hbWUgbWVzc2FnZVBhcnRFbGVtZW50UU5hbWUgPSBudWxsOwotCi0gICAgICBpZiAoIWVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZURvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgICAvL21lc3NhZ2VEb2MgPSBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLCAKLSAgICAgICAgLy8JV1NJUHJvcGVydGllcy5ERUZfU09BUF9TQ0hFTUEpOwotICAgICAgICAvLyBnZXQgc29hcCBvcGVyYXRpb24gbmFtZSBmcm9tIHRoZSBzb2FwOmJvZHkKLQotICAgICAgICAvLyBOT1RFOiBnZXRTb2FwQm9keUNoaWxkKCkgbWF5IHJldHVybiBudWxsLCBpZiB0aGUgc29hcDpib2R5IGRpZCBub3QgY29udGFpbiBhbnkgY2hpbGQgZWxlbWVudHMKLSAgICAgICAgRWxlbWVudCBzb2FwTWVzc2FnZUVsZW1lbnQgPSB2YWxpZGF0b3IuZ2V0U29hcEJvZHlDaGlsZChtZXNzYWdlRG9jKTsKLQotICAgICAgICAvLyBmb3IgZG9jLWxpdC4uLiBmaW5kIHRoZSB3c2RsOnBhcnQgZnJvbSBvbmUgb2YgdGhlIHNwZWNpZmllZCBvcGVyYXRpb25zIHRoYXQgaGFzIAotICAgICAgICAvLyB0aGUgc29hcCBlbGVtZW50IHVzZWQgaW4gdGhlIG1lc3NhZ2UuICAgICAgCi0gICAgICAgIC8vIHdlIGFyZSBsb29raW5nIGZvciBhIHBhcnQgd2l0aCBhbiBlbGVtZW50IGF0dHJpYiB2YWwgbWF0Y2hpbmcgdGhlIHNvYXAgbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgIGlmIChzb2FwTWVzc2FnZUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG1lc3NhZ2VQYXJ0RWxlbWVudFFOYW1lID0KLSAgICAgICAgICAgIG5ldyBRTmFtZSgKLSAgICAgICAgICAgICAgc29hcE1lc3NhZ2VFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpLAotICAgICAgICAgICAgICBzb2FwTWVzc2FnZUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICgobWVzc2FnZURvYyA9PSBudWxsKSB8fCB0aGlzLnZhbGlkYXRvci5pc0ZhdWx0KG1lc3NhZ2VEb2MpKQotICAgICAgewotICAgICAgICAvLyBlbXB0eSBtZXNzYWdlcyBhbmQgZmF1bHQgbWVzc2FnZXMgZG8gbm90IHF1YWxpZnkgZm9yIHRoaXMgVEEKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gbG9vayBmb3IgbWF0Y2gocykgaW4gZG9jIG9wZXJhdGlvbnMKLSAgICAgIC8vIGlmIGZvdW5kLCB3ZSdyZSBkb25lLCBlbHNlCi0gICAgICAvLyBsb29rIGZvciBtYXRjaChzKSBpbiBycGMgb3BlcmF0aW9ucwotCi0gICAgICAvKiBEb2MtbGl0IAotICAgICAgICogZ2V0IGxpc3Qgb2Ygb3BlcmF0aW9ucyAoZnJvbSBjYW5kaWRhdGVzKSBmb3Igd2hpY2ggdGhlIGZpcnN0IHNvYXA6Ym9keSBjaGlsZCBRTmFtZSBpcyB0aGUKLSAgICAgICAqIDxwYXJ0IGVsZW1lbnQ9Ii4uLiI+IHZhbHVlIG9mIHRoYXQgb3BlcmF0aW9uJ3MgPHdzZGw6aW5wdXQ+IG9yIDx3c2RsOm91dHB1dD4gZWxlbWVudCAoZGVwZW5kaW5nCi0gICAgICAgKiBvbiB3aGV0aGVyIG1lc3NhZ2UgaXMgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2UpLgotICAgICAgICovCi0KLSAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBkb2NCaW5kaW5nT3BlcmF0aW9ucyA9Ci0gICAgICAgIHZhbGlkYXRvci5nZXRNYXRjaGluZ0JpbmRpbmdPcHMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQywKLSAgICAgICAgICBiaW5kaW5ncyk7Ci0gICAgICAvLyBsaXN0IG9mIG9wZXJhdGlvbnMgdGhhdCBtYXRjaCB0aGUgPHdzZGw6aW5wdXQ+IG9yIDx3c2RsOm91dHB1dD4gKGRlcGVuZGluZyBvbiBlbnRyeVR5cGUpCi0gICAgICAvLyBmb3IgcGFydCBlbGVtZW50PSIuLi4iCi0gICAgICAvLyAoSVNTVUU6IHdoYXQgYWJvdXQgcGFydCB0eXBlPSIuLi4iPykKLSAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBwb3RlbnRpYWxEb2NMaXRPcHMgPQotICAgICAgICB2YWxpZGF0b3IuZ2V0RG9jTGl0T3BlcmF0aW9ucygKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwKLSAgICAgICAgICBtZXNzYWdlUGFydEVsZW1lbnRRTmFtZSwKLSAgICAgICAgICBkb2NCaW5kaW5nT3BlcmF0aW9ucyk7Ci0gICAgICBpZiAocG90ZW50aWFsRG9jTGl0T3BzLmxlbmd0aCAhPSAwKQotICAgICAgewotICAgICAgICAvLyBmb3VuZCBhdCBsZWFzdCBvbmUgZG9jIGxpdCBtYXRjaAotCi0gICAgICAgIC8vICoqKiBOb3cgd2Uga25vdyBpdCdzIGRvY3VtZW50LWxpdGVyYWwsIHNjaGVtYS12YWxpZGF0ZSB0aGUgU09BUCBwYXlsb2FkIGFjY29yZGluZ2x5ICAgICAgICAgICAgCQkKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIGlzU2NoZW1hVmFsaWQgPSB0aGlzLnZhbGlkYXRvci5tZXNzYWdlSXNEb2NMaXRTY2hlbWFWYWxpZChlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvKiBzb2FwIG1lc3NhZ2UgaXMgbm90IGRvYy1saXQgc28gdHJ5IDoKLSAgICAgICAqIFJwYy1saXQKLSAgICAgICAqLwotICAgICAgQmluZGluZ09wZXJhdGlvbltdIHJwY0JpbmRpbmdPcGVyYXRpb25zID0KLSAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0TWF0Y2hpbmdCaW5kaW5nT3BzKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMsCi0gICAgICAgICAgYmluZGluZ3MpOwotCi0gICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlcmUgaXMgYW4gb3BlcmF0aW9uIG1hdGNoCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIHJjcE9wTWF0Y2ggPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRPcGVyYXRpb25NYXRjaCgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwKLSAgICAgICAgICBtZXNzYWdlRG9jLAotICAgICAgICAgIHJwY0JpbmRpbmdPcGVyYXRpb25zKTsKLSAgICAgIGlmIChyY3BPcE1hdGNoICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgcGFydHMgbWF0Y2gKLSAgICAgICAgcmNwT3BNYXRjaCA9Ci0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0T3BlcmF0aW9uUGFydHNNYXRjaCgKLSAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgICAgbWVzc2FnZURvYywKLSAgICAgICAgICAgIHJwY0JpbmRpbmdPcGVyYXRpb25zKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHJjcE9wTWF0Y2ggPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy9ub3QgbWF0Y2hlZCB3aXRoIHJwYyBlaXRoZXIuIFByZXBhcmUgYXNzZXJ0aW9uIGZhaWx1cmUuCi0gICAgICAgIFN0cmluZ0J1ZmZlciBycGNPcGVyYXRpb25MaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJwY0JpbmRpbmdPcGVyYXRpb25zLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgcnBjT3BlcmF0aW9uTGlzdC5hcHBlbmQocnBjQmluZGluZ09wZXJhdGlvbnNbaV0udG9TdHJpbmcoKSArICJcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGRvY09wZXJhdGlvbkxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jQmluZGluZ09wZXJhdGlvbnMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBkb2NPcGVyYXRpb25MaXN0LmFwcGVuZChkb2NCaW5kaW5nT3BlcmF0aW9uc1tpXS50b1N0cmluZygpICsgIlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAiLS1NRVNTQUdFOlxuIgotICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICArICJcbi0tQ0FORElEQVRFIFJQQyBTVFlMRSBPUEVSQVRJT05TICgiCi0gICAgICAgICAgICArIChycGNCaW5kaW5nT3BlcmF0aW9ucy5sZW5ndGggIT0gMAotICAgICAgICAgICAgICA/IChycGNCaW5kaW5nT3BlcmF0aW9ucy5sZW5ndGggKyAiKTpcbiIgKyBycGNPcGVyYXRpb25MaXN0KQotICAgICAgICAgICAgICA6ICJOT05FKSIpCi0gICAgICAgICAgICArICJcbi0tQ0FORElEQVRFIERPQ1VNRU5UIFNUWUxFIE9QRVJBVElPTlMgKCIKLSAgICAgICAgICAgICsgKGRvY0JpbmRpbmdPcGVyYXRpb25zLmxlbmd0aCAhPSAwCi0gICAgICAgICAgICAgID8gKGRvY0JpbmRpbmdPcGVyYXRpb25zLmxlbmd0aCArICIpOlxuIiArIGRvY09wZXJhdGlvbkxpc3QpCi0gICAgICAgICAgICAgIDogIk5PTkUpIikpOwotCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDEyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZDRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBCUDEwMTIuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEwMTIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEwMTIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gbG9vayBmb3IgPHNvYXA6RW52ZWxvcGU+IGVsZW1lbnRzOgotICAgICAgLy8gKE5vdGU6IHNpbmNlIHRoaXMgaXMgYSBTb2FwIG1lc3NhZ2Ugd2UgZXhwZWN0IGV4YWN0bHkgb25lIHNvYXAgZW52ZWxvcGUsIGJ1dCB3ZSBkbyBub3QgYXNzdW1lIGl0KS4KLSAgICAgIERvY3VtZW50IHJlcXVlc3REb2MgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0KLSAgICAgIC8vIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKHJlcXVlc3REb2MgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgRWxlbWVudCBlbnZFbGVtID0gcmVxdWVzdERvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vTm9kZUxpc3Qgc29hcEVudkxpc3QgPSByZXF1ZXN0RG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiRW52ZWxvcGUiKTsKLQotICAgICAgLy8gSWYgdGhlIGRvY3VtZW50IGVsZW1lbnQgdGFnIG5hbWUgaXMgbm90IEVudmVsb3BlCi0gICAgICAvLyBvciB0aGUgbmFtZXNwYWNlIGlzIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvCi0gICAgICBpZiAoIWVudkVsZW0uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhNTFV0aWxzLlNPQVBfRUxFTV9FTlZFTE9QRSkKLSAgICAgICAgfHwgZW52RWxlbS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQKSkKLSAgICAgICAgLy8gUmVxdWVzdCBjb250YWlucyBwcm9wZXIgc29hcCBFbnZlbG9wZSBlbGVtZW50Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIHdlIGV4cGVjdCBhIFNvYXAgRmF1bHQgYXMgYSByZXNwb25zZQkKLSAgICAgIERvY3VtZW50IHJlc3BvbnNlRG9jID0KLSAgICAgICAgWE1MVXRpbHMucGFyc2VYTUwoZW50cnlDb250ZXh0LmdldFJlc3BvbnNlKCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIE5vZGVMaXN0IHNvYXBGYXVsdExpc3QgPQotICAgICAgICByZXNwb25zZURvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICAiRmF1bHQiKTsKLSAgICAgIC8vIEFERCBleHRyYSBjaGVjayBoZXJlIHRoYXQgdGhlIDxzb2FwOkZhdWx0PiBpcyBhIGNoaWxkIG9mIDxzb2FwOkVudmVsb3BlPiA/PwkJICAgICAgCQkJCQotICAgICAgaWYgKChzb2FwRmF1bHRMaXN0ID09IG51bGwpIHx8IChzb2FwRmF1bHRMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgewotICAgICAgICAvLyBObyBTb2FwIGZhdWx0IGZvdW5kLgotICAgICAgICAvLyBBc3NlcnRpb24gZmFpbGVkIChBREQgaGlnaGxpZ2h0IHRoZSBjaGlsZCBoZXJlID8pCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICItLS0gUkVRVUVTVDpcbiIKLSAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICsgIlxuLS0tIFJFU1BPTlNFOlxuIgotICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVzcG9uc2UoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAxMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNmY4ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0KLQotLyoqCi0gKiBCUDEwMTMuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEwMTMgZXh0ZW5kcyBCUDEwMTEKLXsKLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAxMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEwMzEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAzMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmJkYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAzMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogQlAxMDMxLgotICogCi0gKiBAYXV0aG9yOiBHcmFoYW0gVHVycmVsbCwgSUJNIFVLCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEwMzEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEwMzEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgZmFpbHVyZURldGFpbCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRG9jdW1lbnQgZG9jOwotICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBvbmUgd2F5IHJlc3BvbnNlCi0gICAgICAvLyBvciBtZXNzYWdlIGlzIG1lcHR5IG9yIGludmFsaWQKLSAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkKLSAgICAgICAgICB8fCAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghdGhpcy52YWxpZGF0b3IuaXNGYXVsdChkb2MpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBOb2RlTGlzdCBmYXVsdENvZGVzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmYXVsdGNvZGUiKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRDb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBOb2RlTGlzdCBmYXVsdENvZGVOb2RlcyA9IChmYXVsdENvZGVzLml0ZW0oaSkpLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmYXVsdENvZGVOb2Rlcy5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGZhdWx0Q29kZU5vZGVzLml0ZW0oaikgaW5zdGFuY2VvZiBUZXh0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFRleHQgZmF1bHRDb2RlVGV4dCA9IChUZXh0KSBmYXVsdENvZGVOb2Rlcy5pdGVtKGopOwotICAgICAgICAgICAgaWYgKGZhdWx0Q29kZVRleHQuZ2V0RGF0YSgpLmluZGV4T2YoJy4nKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgIC8vIGRvdHRlZCBub3RhdGlvbiB1c2VkLgotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgLy8gbm8gZG90dGVkIG5vdGF0aW9uIHVzZWQgaW4gYSBmYXVsdGNvZGUgZWxlbWVudAotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAzMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDEzMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0KLS8qKgotICogQlAxMDMyCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGVudmVsb3BlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBzb2FwOkVudmVsb3BlLCBzb2FwOkhlYWRlciwgYW5kIHNvYXA6Qm9keSBlbGVtZW50cyBkbyBub3QgaGF2ZSBhbnkgYXR0cmlidXRlcyBpbiB0aGUgbmFtZXNwYWNlICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAxMDMyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDMyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBlbXB0eSBvciBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSByb290IGVsZW1lbnQKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgLy8gQXNzdW1pbmcgdGhhdCByb290IGVsZW1lbnQgc2hvdWxkIGJlIHNvYXA6RW52ZWxvcGUKLSAgICAgIC8vIElmIG5vdCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fRU5WRUxPUEUpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBsb29raW5nIGZvciBhbnkgYXR0cmlidXRlIG9mIHNvYXA6RW52ZWxvcGUgaW4gdGhlIG5hbWVzcGFjZQotICAgICAgLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIgotICAgICAgLy8gSWYgYXQgbGVhc3Qgb25lIGF0dHJpYnV0ZSBpcyBmb3VuZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgIEF0dHIgYXR0ciA9IGdldEF0dHJpYnV0ZShlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigic29hcDpFbnZlbG9wZSBhdHRyaWJ1dGUgbmFtZSBpcyAiCi0gICAgICAgICAgKyBhdHRyLmdldE5hbWUoKSk7Ci0KLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IGNoaWxkIG9mIHNvYXA6RW52ZWxvcGUKLSAgICAgIGVsZW1lbnQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW1lbnQpOwotCi0gICAgICAvLyBJZiB0aGUgY2hpbGQgaXMgc29hcDpIZWFkZXIKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwKLSAgICAgICAgJiYgZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWE1MVXRpbHMuU09BUF9FTEVNX0hFQURFUikpCi0gICAgICB7Ci0gICAgICAgIC8vIGxvb2tpbmcgZm9yIGFueSBhdHRyaWJ1dGUgb2Ygc29hcDpIZWFkZXIgaW4gdGhlIG5hbWVzcGFjZQotICAgICAgICAvLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAgICAgIC8vIElmIGF0IGxlYXN0IG9uZSBhdHRyaWJ1dGUgaXMgZm91bmQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgIGF0dHIgPSBnZXRBdHRyaWJ1dGUoZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkpOwotICAgICAgICBpZiAoYXR0ciAhPSBudWxsKQotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJzb2FwOkhlYWRlciBhdHRyaWJ1dGUgbmFtZSBpcyAiCi0gICAgICAgICAgICArIGF0dHIuZ2V0TmFtZSgpKTsKLQotICAgICAgICAvLyBNb3ZpbmcgdG8gdGhlIG5leHQgc29hcDpFbnZlbG9wZSBjaGlsZAotICAgICAgICBlbGVtZW50ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoZWxlbWVudCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZSBjaGlsZCBpcyBzb2FwOkJvZHkKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwKLSAgICAgICAgJiYgZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWE1MVXRpbHMuU09BUF9FTEVNX0JPRFkpKQotICAgICAgewotICAgICAgICAvLyBsb29raW5nIGZvciBhbnkgYXR0cmlidXRlIG9mIHNvYXA6Qm9keSBpbiB0aGUgbmFtZXNwYWNlCi0gICAgICAgIC8vICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIKLSAgICAgICAgLy8gSWYgYXQgbGVhc3Qgb25lIGF0dHJpYnV0ZSBpcyBmb3VuZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgYXR0ciA9IGdldEF0dHJpYnV0ZShlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oInNvYXA6Qm9keSBhdHRyaWJ1dGUgbmFtZSBpcyAiCi0gICAgICAgICAgICArIGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogTG9va3MgZm9yIGFuIGF0dHJpYnV0ZSB0aGF0IGlzIGluIHRoZSBuYW1lc3BhY2UKLSAgICogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8KLSAgICogQHBhcmFtIGF0dHJzIGEgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGVzCi0gICAqIEByZXR1cm4gYW4gYXR0cmlidXRlIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlIG9yIG51bGwKLSAgICovCi0gIHByaXZhdGUgQXR0ciBnZXRBdHRyaWJ1dGUoTmFtZWROb2RlTWFwIGF0dHJzKQotICB7Ci0gICAgQXR0ciByZXQgPSBudWxsOwotICAgIGlmIChhdHRycyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLSAgICAgICAgaWYgKGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbAotICAgICAgICAgICYmIGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXQgPSBhdHRyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTAzMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZWM4YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMDMzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEJQMTAzMwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBlbnZlbG9wZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgU09BUCBlbnZlbG9wZSBkb2VzIG5vdCBjb250YWluIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24geG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDEwMzMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEwMzMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIHRoZSByb290IGVsZW1lbnQKLSAgICAgIEVsZW1lbnQgZWxlbSA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vIElmIGl0IGlzIG5vdCB0aGUgc29hcDpFbnZlbG9wZSwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFlbGVtLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVApCi0gICAgICAgIHx8ICFlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fRU5WRUxPUEUpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgZW52ZWxvcGUgY29udGFpbnMgdGhlIHhtbG5zOnhtbCBuYW1lc3BhY2UgZGVjbGFyYXRpb24sCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgU3RyaW5nIGluY29ycmVjdEVsZW1lbnROYW1lID0gZ2V0SW5jb3JyZWN0RWxlbWVudE5hbWUoZWxlbSk7Ci0gICAgICBpZiAoaW5jb3JyZWN0RWxlbWVudE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBuYW1lIG9mIGFuIGVsZW1lbnQgY29udGFpbmluZyAiCi0gICAgICAgICAgKyAic3VjaCBuYW1lc3BhY2UgZGVjbGFyYXRpb24gaXMgXCIiICsgaW5jb3JyZWN0RWxlbWVudE5hbWUgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3IgYW55IGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgYXR0cmlidXRlIHhtbG5zOnhtbD0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIi4gCi0gICAqIEBwYXJhbSBlbGVtIHRoZSByb290IGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgYW4gZWxlbWVudCBmb3VuZCBvciBudWxsLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW5jb3JyZWN0RWxlbWVudE5hbWUoRWxlbWVudCBlbGVtKQotICB7Ci0gICAgLy8gR2V0dGluZyBhIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgeG1sbnM6eG1sCi0gICAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlTlMoCi0gICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1hNTE5TLCAieG1sIik7Ci0gICAgLy8gSWYgaXQgZXF1YWxzIHRvICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAotICAgIC8vIHJldHVybiBhbiBlbGVtZW50IG5hbWU7Ci0gICAgaWYgKFdTSUNvbnN0YW50cy5OU19VUklfWE1MLmVxdWFscyhhdHRyVmFsdWUpKQotICAgIHsKLSAgICAgIHJldHVybiBlbGVtLmdldE5vZGVOYW1lKCk7Ci0gICAgfQotICAgIC8vIEdvaW5nIHRocm91Z2ggZWxlbWVudCdzIGNoaWxkcmVuCi0gICAgRWxlbWVudCBjaGlsZCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbSk7Ci0gICAgd2hpbGUgKGNoaWxkICE9IG51bGwpCi0gICAgewotICAgICAgLy8gSWYgYW55IG9mIHRoZW0gaGFzIHhtbG5zOnhtbCBhdHRyaWJ1dGUsIHJldHVybiBhIHZhbHVlCi0gICAgICBTdHJpbmcgbmFtZSA9IGdldEluY29ycmVjdEVsZW1lbnROYW1lKGNoaWxkKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgICAgfQotICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBlbGVtZW50J3MgY2hpbGQKLSAgICAgIGNoaWxkID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotICAgIH0KLSAgICAvLyBObyB4bWxuczp4bWwgYXR0cmlidXRlcyBmb3VuZCwgcmV0dXJuIG51bGwKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTEwMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMTAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYmFkNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMTAwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTEwMC4KLSAqIEEgbWVzc2FnZSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBTT0FQIGZhdWx0IFNIT1VMRCB1c2UgYSAiMjAwIE9LIiAKLSAqIEhUVFAgc3RhdHVzIGNvZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDExMDAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDExMDAoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBsb29rIGZvciA8c29hcDpGYXVsdD4gZWxlbWVudDoKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIE5vZGVMaXN0IGZhdWx0TGlzdCA9Ci0gICAgICAgICAgcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwgIkZhdWx0Iik7Ci0KLSAgICAgICAgLy8gSWYgcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhIHNvYXA6RmF1bHQsIHRoZW4gY2hlY2sgaXQKLSAgICAgICAgaWYgKChmYXVsdExpc3QgPT0gbnVsbCkgfHwgKGZhdWx0TGlzdC5nZXRMZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIFJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gYSBzb2FwOkZhdWx0Ci0gICAgICAgICAgLy8gY2hlY2sgSFRUUCBzdGF0dXMgY29kZQotICAgICAgICAgIFN0cmluZyBodHRwU3RhdHVzID0KLSAgICAgICAgICAgIFV0aWxzLmdldEhUVFBTdGF0dXNDb2RlKAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSk7Ci0gICAgICAgICAgaWYgKCEiMjAwIi5lcXVhbHMoaHR0cFN0YXR1cykpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICAgICAgLy9mYWlsdXJlRGV0YWlsTWVzc2FnZSA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgICAiXG5SZXNwb25zZSBtZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCkKLSAgICAgICAgICAgICAgICAgICsgIlxuTWVzc2FnZTpcbiIKLSAgICAgICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGl0IGlzIGEgc29hcDpGYXVsdCwgdGhlbiB0aGUgcmVzdWx0IG11c3QgYmUgbm90QXBwbGljYWJsZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMTA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDExMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjODY5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDExMDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5OdWxsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5PcGVyYXRpb25TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogQlAxMTA3LgotICogVGhlIGNvbnRhaW5lZCBzb2FwYmluZDpmYXVsdCBpcyBkZWZpbmVkIGluIHRoZSB3c2RsOmJpbmRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDExMDcgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvcgotewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDExMDcoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgT3BlcmF0aW9uU2lnbmF0dXJlIHJlc3BvbnNlU2lnID0gbnVsbDsKLSAgcHJpdmF0ZSBWZWN0b3IgZmF1bHRzID0gbnVsbDsKLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBGYXVsdCwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBGYXVsdCBmYXVsdCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLQotICAgIGlmIChmYXVsdE5hbWUgPT0gbnVsbCkKLSAgICAgIGZhdWx0TmFtZSA9IGN0eC5nZXRCaW5kaW5nRmF1bHQoKS5nZXROYW1lKCk7Ci0KLSAgICBPcGVyYXRpb24gb3AgPSBjdHguZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpOwotICAgIGlmIChvcCA9PSBudWxsIC8qIHx8IGZhdWx0TmFtZSA9PSBudWxsKi8KLSAgICAgICkgLy8gbWF5IGJlIGl0J3MgcG9zc2libGUgdG8gaGF2ZSBsZWdhbCBmYXVsdCB3aXRoIG51bGwgbmFtZQotICAgICAgcmV0dXJuOwotCi0gICAgLy8gd2Ugc3VwcG9zZSB0aGF0IFNPQVBGYXVsdC5nZXROYW1lKCkgY29ycmVzcG9uZHMgdG8gdGhlIGFic3RyYWN0IG9wZXJhdGlvbidzIGZhdWx0IG5hbWUgICAgICAgICAgIAotICAgIEZhdWx0IGYgPSBvcC5nZXRGYXVsdChmYXVsdE5hbWUpOwotICAgIGlmIChmID09IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICBNZXNzYWdlIG0gPSBmLmdldE1lc3NhZ2UoKTsKLSAgICAvLyBtZXNzYWdlIHNob3VsZCBoYXZlIG9ubHkgb25lIHBhcnQKLSAgICBpZiAobSA9PSBudWxsIHx8IG0uZ2V0UGFydHMoKSA9PSBudWxsIHx8IG0uZ2V0UGFydHMoKS5zaXplKCkgIT0gMSkKLSAgICAgIHJldHVybjsKLQotICAgIC8vUGFydCBmYXVsdFBhcnQgPSBXU0RMVXRpbC5nZXRQYXJ0KG0sIGZhdWx0TmFtZSk7Ci0gICAgUGFydCBmYXVsdFBhcnQgPSAoUGFydCkgbS5nZXRQYXJ0cygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgVHlwZXNSZWdpc3RyeSB0UmVnID0gKFR5cGVzUmVnaXN0cnkpIGN0eC5nZXRQYXJhbWV0ZXIoIlR5cGVzUmVnaXN0cnkiKTsKLSAgICBRTmFtZSBlbGVtUU5hbWUgPSBmYXVsdFBhcnQuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICBRTmFtZSB0eXBlUU5hbWUgPSBmYXVsdFBhcnQuZ2V0VHlwZU5hbWUoKTsKLSAgICBpZiAodHlwZVFOYW1lID09IG51bGwpCi0gICAgICB0eXBlUU5hbWUgPSB0UmVnLmdldFR5cGUoZmF1bHRQYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgIGlmICh0eXBlUU5hbWUgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcnQgdHlwZSBjYW4gbm90IGJlIG51bGwuIik7Ci0KLSAgICAvLyBmb3IgYWxsIGZhdWx0czsgaWYgaXQgcHJlc2VudHMgaW4gdGhlIGRlZmluaXRpb24gcmVtb3ZlIGl0IGZyb20gbGlzdAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmF1bHRzLnNpemUoKTspCi0gICAgewotICAgICAgRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpIGZhdWx0cy5nZXQoaSk7Ci0KLSAgICAgIC8vIFRPRE86IEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhpcyBpcyBoZXJlLiAgT25seSB0aGUgZWxlbWVudCBzZXR0aW5nIHNob3VsZCBiZSBjaGVja2VkLiAKLSAgICAgIC8vYm9vbGVhbiBtYXRjaEJ5VHlwZSA9Ci0gICAgICAvLyAgZWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHModHlwZVFOYW1lLmdldExvY2FsUGFydCgpKSAmJiBOdWxsVXRpbC5lcXVhbHMoZWxlbS5nZXROYW1lc3BhY2VVUkkoKSwgdHlwZVFOYW1lLmdldE5hbWVzcGFjZVVSSSgpKTsKLQotICAgICAgYm9vbGVhbiBtYXRjaEJ5RWxlbWVudCA9Ci0gICAgICAgIGVsZW1RTmFtZSAhPSBudWxsCi0gICAgICAgICAgJiYgZWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoZWxlbVFOYW1lLmdldExvY2FsUGFydCgpKQotICAgICAgICAgICYmIE51bGxVdGlsLmVxdWFscygKLSAgICAgICAgICAgIGVsZW0uZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICBlbGVtUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCi0gICAgICAvL2lmIChtYXRjaEJ5VHlwZSB8fCBtYXRjaEJ5RWxlbWVudCkKLSAgICAgIGlmIChtYXRjaEJ5RWxlbWVudCkKLSAgICAgICAgZmF1bHRzLnJlbW92ZShpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgaSsrOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFBhcnNlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvY1JlcXVlc3QgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0gICAgICBEb2N1bWVudCBkb2NSZXNwb25zZSA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICBpZiAoKGRvY1JlcXVlc3QgPT0gbnVsbCkgfHwgKGRvY1Jlc3BvbnNlID09IG51bGwpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIXRoaXMudmFsaWRhdG9yLmlzRmF1bHQoZG9jUmVzcG9uc2UpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBjcmVhdGUgcmVxdWVzdCBzaWduYXR1cmUKLSAgICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLk9wZXJhdGlvbk1hdGNoIG1hdGNoID0KLSAgICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgICBkb2NSZXF1ZXN0LAotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0U29hcEFjdGlvbihlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCkpLAotICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXSwKLSAgICAgICAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQKLSAgICAgICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAgICAgLmdldFdzZGxEb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgLmdldERlZmluaXRpb25zKCksCi0gICAgICAgICAgICAgICAgdmFsaWRhdG9yKSk7Ci0KLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICAgICAgICBpZiAobWF0Y2ggIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIE1PVkVEOiBQYXJzZSByZXNwb25zZSBtZXNzYWdlCi0gICAgICAgICAgLy9kb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgICAgIHJlc3BvbnNlU2lnID0gbmV3IE9wZXJhdGlvblNpZ25hdHVyZShkb2NSZXNwb25zZSk7Ci0gICAgICAgICAgaWYgKFdTSUNvbnN0YW50cwotICAgICAgICAgICAgLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQwotICAgICAgICAgICAgLmVxdWFscyhtYXRjaC5nZXRPcGVyYXRpb25TdHlsZSgpKSkKLSAgICAgICAgICAgIHJlc3BvbnNlU2lnLmNyZWF0ZVJQQ1NpZ25hdHVyZSgpOwotCi0gICAgICAgICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgICAgICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgICAgICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgICAgICAgdHJhdmVyc2FsLnZpc2l0U09BUEZhdWx0KHRydWUpOwotICAgICAgICAgIHRyYXZlcnNhbC5pZ25vcmVCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgICB0cmF2ZXJzYWwuaWdub3JlQmluZGluZ091dHB1dCgpOwotCi0gICAgICAgICAgaWYgKHJlc3BvbnNlU2lnID09IG51bGwgfHwgIXJlc3BvbnNlU2lnLmlzRmF1bHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZVNpZyAhPSBudWxsICYmIHJlc3BvbnNlU2lnLmlzRmF1bHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleHRyYWN0IGFsbCBmYXVsdHMgYW5kIHRyeSBmaW5kIHRoZW0gaW4gdGhlIGRlZmluaXRpb24KLSAgICAgICAgICAgIC8vIGV4dHJhY3RzIG9ubHkgZmF1bHRzIHdpdGggbmFtZXNwYWNlCi0gICAgICAgICAgICBFbGVtZW50IGJvZHkgPQotICAgICAgICAgICAgICBYTUxVdGlscy5maW5kQ2hpbGRFbGVtZW50KAotICAgICAgICAgICAgICAgIGRvY1Jlc3BvbnNlLmdldERvY3VtZW50RWxlbWVudCgpLAotICAgICAgICAgICAgICAgIFdTSVRhZy5FTEVNX1NPQVBfQk9EWSk7Ci0gICAgICAgICAgICBFbGVtZW50IGZhdWx0ID0KLSAgICAgICAgICAgICAgWE1MVXRpbHMuZmluZENoaWxkRWxlbWVudChib2R5LCBXU0lUYWcuRUxFTV9TT0FQX0ZBVUxUKTsKLSAgICAgICAgICAgIEVsZW1lbnQgZGV0YWlsID0gWE1MVXRpbHMuZ2V0RWxlbWVudCgiZGV0YWlsIiwgZmF1bHQpOwotICAgICAgICAgICAgaWYgKGRldGFpbCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgICAgICAgICAgICBmYXVsdHMgPSBYTUxVdGlscy5nZXRDaGlsZEVsZW1lbnRzKGRldGFpbCk7Ci0KLSAgICAgICAgICAgICAgLy8gUkVNT1ZFOiBXaHkgZG8gdGhlIGZhdWx0cyBoYXZlIHRvIGJlIG5hbWVzcGFjZWQgcXVhbGlmaWVkPwotICAgICAgICAgICAgICAvL1hNTFV0aWxzLnJlbW92ZUFsbEVsZW1lbnRzV2l0aG91dE5TKGZhdWx0cyk7Ci0KLSAgICAgICAgICAgICAgLy8gaWYgZmF1bHRzIGV4aXN0IHRyeSB0byB2YWxpZGF0ZSBpdAotICAgICAgICAgICAgICBpZiAoZmF1bHRzLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYXAgbSA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgICAgICAgICAgV1NETFV0aWwuZXhwYW5kRGVmaW5pdGlvbigKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRXc2RsRG9jdW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSk7Ci0gICAgICAgICAgICAgICAgbS5wdXQoCi0gICAgICAgICAgICAgICAgICAiZGVmaW5pdGlvbiIsCi0gICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFdzZGxEb2N1bWVudCgpCi0gICAgICAgICAgICAgICAgICAgIC5nZXREZWZpbml0aW9ucygpKTsKLSAgICAgICAgICAgICAgICBUeXBlc1JlZ2lzdHJ5IHRSZWcgPQotICAgICAgICAgICAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgICAgICAgICAgICAuZ2V0V3NkbERvY3VtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IpOwotICAgICAgICAgICAgICAgIG0ucHV0KCJUeXBlc1JlZ2lzdHJ5IiwgdFJlZyk7Ci0gICAgICAgICAgICAgICAgdHJhdmVyc2FsLnRyYXZlcnNlKG1hdGNoLmdldE9wZXJhdGlvbigpLCBtKTsKLSAgICAgICAgICAgICAgICBpZiAoZmF1bHRzLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmYXVsdHMuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuc2VyaWFsaXplRWxlbWVudCgoRWxlbWVudCkgZmF1bHRzLmdldChpKSwgc3cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3cuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAgICAgICAgICJcbkZhdWx0czpcbiIgKyBzdy50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmNjkzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBCUDEyMDEuCi0gKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSBzb2FwOkVudmVsb3BlIGluIHRoZSBtZXNzYWdlIGhhcyB2YWx1ZTogaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8uIAotICovCi1wdWJsaWMgY2xhc3MgQlAxMjAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMjAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIERvY3VtZW50IGRvYzsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSB3YXkgcmVzcG9uc2Ugb3IgbWVzc2FnZSBpcyBtZXB0eSBvciBpbnZhbGlkCi0gICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSB8fAotICAgICAgKGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBTdHJpbmcgbnMgPSByb290LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgU3RyaW5nIGxvY2FsID0gcm9vdC5nZXRMb2NhbE5hbWUoKTsKLSAgICAgIGlmICghRUxFTV9TT0FQX0VOVkVMT1BFLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhucykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgIlJvb3QgZWxlbWVudCBoYXMgbmFtZXNwYWNlOiAiICsgbnMsIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCFFTEVNX1NPQVBfRU5WRUxPUEUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKGxvY2FsKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAiUm9vdCBlbGVtZW50IGhhcyBsb2NhbCBuYW1lOiAiICsgbG9jYWwsIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWFiZWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTIwMi4gCi0gKiBFYWNoIGNoaWxkIGVsZW1lbnQgKGlmIGFueSkgb2YgdGhlIHNvYXA6Qm9keSBlbGVtZW50IGlzIG5hbWVzcGFjZSBxdWFsaWZpZWQgKG5vdCB0aGUgZ3JhbmRjaGlsZHJlbikuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEyMDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEyMDIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gUGFyc2UgbG9nIG1lc3NhZ2UgCi0gICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICBpZiAodmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc29hcCBib2R5IGVsZW1lbnQKLSAgICBlbHNlIGlmICghdmFsaWRhdG9yLmNvbnRhaW5zU29hcEJvZHlXaXRoQ2hpbGQoZG9jKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gR2V0IHRoZSByb290IGVsZW1lbnQKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgLy8gR2V0IGEgbm9kZSBsaXN0IHdoaWNoIHNob3VsZCBjb250YWluIHRoZSBzb2FwOkJvZHkgZWxlbWVudAotICAgICAgTm9kZUxpc3Qgcm9vdE5vZGVMaXN0ID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICBFTEVNX1NPQVBfQk9EWS5nZXROYW1lc3BhY2VVUkkoKSwgRUxFTV9TT0FQX0JPRFkuZ2V0TG9jYWxQYXJ0KCkpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgc29hcDpCb2R5IGVsZW1lbnQsCi0gICAgICAvLyB0aGVuIG1ha2Ugc3VyZSB0aGF0IGVhY2ggY2hpbGQgaXMgbmFtZXNwYWNlIHF1YWxpZmllZAotICAgICAgaWYgKHJvb3ROb2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCB0aGUgc29hcDpCb2R5IGVsZW1lbnQKLSAgICAgICAgRWxlbWVudCBib2R5ID0gKEVsZW1lbnQpIHJvb3ROb2RlTGlzdC5pdGVtKDApOwotCi0gICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBzb2FwOkJvZHkgY2hpbGQgZWxlbWVudHMgCi0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gYm9keS5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgZWFjaCBjaGlsZCBlbGVtZW50IGlzIG5hbWVzcGFjZSBxdWFsaWZpZWQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7Ci0gICAgICAgICAgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpICYmIHJlc3VsdCA9PSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgICArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICBOb2RlIG4gPSBjaGlsZHJlbi5pdGVtKGkpOwotICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgbnMgPSBuLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgICAgaWYgKG5zID09IG51bGwgfHwgbnMubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3MGFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBCUDEyMDMuIAotICogVGhlIG5hbWVzcGFjZSBvZiB0aGUgZGV0YWlsIGVsZW1lbnQgb2YgYSBxdWFsaWZpZWQgYXR0cmlidXRlIGluIHRoZSBzb2FwOkZhdWx0IGlzIGEgCi0gKiBmb3JlaWduIG5hbWVzcGFjZSwgZGlmZmVyZW50IGZyb20gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIi4KLSAqLwotcHVibGljIGNsYXNzIEJQMTIwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTIwMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIHF1YWxpZmllZEF0dHJpYnV0ZXMgPSBmYWxzZTsKLQotICAgIERvY3VtZW50IGRvYzsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSB3YXkgcmVzcG9uc2Ugb3IgbWVzc2FnZSBpcyBtZXB0eSBvciBpbnZhbGlkCi0gICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KQotICAgICAgICB8fCAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIEFERDogTmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBjaGVjayBpcyByZXF1aXJlZCwgc2luY2UgaXQgc2hvdWxkIGFscmVhZHkgYmUgZG9uZQotICAgICAgLy8gQXBwbGljYWJsZSB0byByZXNwb25zZSBtZXNzYWdlcyBvbmx5Ci0gICAgICBpZiAoZW50cnlDb250ZXh0Ci0gICAgICAgIC5nZXRNZXNzYWdlRW50cnkoKQotICAgICAgICAuZ2V0VHlwZSgpCi0gICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKE1lc3NhZ2VFbnRyeS5UWVBFX1JFU1BPTlNFKSkKLSAgICAgIHsKLSAgICAgICAgLy8gbG9vayBmb3IgPHNvYXA6RmF1bHQ+IGVsZW1lbnQ6Ci0gICAgICAgIE5vZGVMaXN0IGZhdWx0TGlzdCA9Ci0gICAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFQpOwotICAgICAgICBpZiAoKGZhdWx0TGlzdCA9PSBudWxsKSB8fCAoZmF1bHRMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gUmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhIHNvYXA6RmF1bHQKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gd2UgaGF2ZSBhIHNvYXA6RmF1bHQuIAotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBsb29rIGF0IGVhY2ggc29hcDpGYXVsdCBpbiB0dXJuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhdWx0TGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFbGVtZW50IHNvYXBGYXVsdCA9IChFbGVtZW50KSBmYXVsdExpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgLy8gZmluZCB0aGUgZGV0YWlsIGVsZW1lbnQocykgaWYgYW55Ci0gICAgICAgICAgICAgIE5vZGVMaXN0IGRldGFpbExpc3QgPQotICAgICAgICAgICAgICAgIHNvYXBGYXVsdC5nZXRFbGVtZW50c0J5VGFnTmFtZShYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFRfREVUQUlMKTsKLSAgICAgICAgICAgICAgaWYgKGRldGFpbExpc3QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIGRldGFpbCBlbGVtZW50Li4uICAgICAJCQkJCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXRhaWxMaXN0LmdldExlbmd0aCgpOyBqKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIGRldGFpbEF0dHJpYnMgPQotICAgICAgICAgICAgICAgICAgICBkZXRhaWxMaXN0Lml0ZW0oaikuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGFueSBxdWFsaWZpZWQgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgaWYgKGRldGFpbEF0dHJpYnMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBkZXRhaWxBdHRyaWJzLmdldExlbmd0aCgpOyBrKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBBdHRyIG5leHRBdHRyID0gKEF0dHIpIChkZXRhaWxBdHRyaWJzLml0ZW0oaykpOwotICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIHF1YWxpZmllZCBhdHRyaWJ1dGUsIGNoZWNrIHRoYXQgCi0gICAgICAgICAgICAgICAgICAgICAgLy8gcW5hbWUgIT0gaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZQotICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0QXR0ci5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZEF0dHJpYnV0ZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRBdHRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHVuZXhwZWN0ZWQgcW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcXVhbGlmaWVkQXR0cmlidXRlcykKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyB0YXJnZXQgbWVzc2FnZSBpcyBub3QgYSBSZXNwb25zZQotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjQ4MGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5PcGVyYXRpb25TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBCUDEyMDQuCi0gKiBUaGUgc2VyaWFsaXplZCBhcnJheSBmb3JtIGluIHRoZSBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gdGhlIAotICogc29hcGVuYzphcnJheVR5cGUgYXR0cmlidXRlLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEyMDQgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEyMDQoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0KLSAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIFBhcnNlIG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvYyA9Ci0gICAgICAgIFhNTFV0aWxzLnBhcnNlWE1MKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNGYXVsdChkb2MpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBQYXJzZSByZXF1ZXN0IG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvY1JlcXVlc3QgPQotICAgICAgICBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgIC8vIGdldCBTT0FQQWN0aW9uCi0gICAgICBTdHJpbmcgaGVhZGVycyA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICAgIFN0cmluZyBhY3Rpb24gPSBudWxsOwotICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIlNPQVBBY3Rpb24iLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpWzBdOwotICAgICAgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSA9Ci0gICAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCksCi0gICAgICAgICAgdmFsaWRhdG9yKTsKLSAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5PcGVyYXRpb25NYXRjaCBtYXRjaCA9Ci0gICAgICAgIE9wZXJhdGlvblNpZ25hdHVyZS5tYXRjaE9wZXJhdGlvbigKLSAgICAgICAgICBkb2NSZXF1ZXN0LAotICAgICAgICAgIGFjdGlvbiwKLSAgICAgICAgICBiaW5kaW5nLAotICAgICAgICAgIHJlZ2lzdHJ5KTsKLQotICAgICAgaWYgKG1hdGNoID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0KLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG1hdGNoLmdldE9wZXJhdGlvbigpOwotCi0gICAgICBNZXNzYWdlIG9wZXJhdGlvbk1lc3NhZ2UgPSBudWxsOwotICAgICAgaWYgKE1lc3NhZ2VFbnRyeQotICAgICAgICAuVFlQRV9SRVFVRVNUCi0gICAgICAgIC5lcXVhbHMoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKSkKLSAgICAgICAgJiYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKSAhPSBudWxsKSkKLSAgICAgIHsKLSAgICAgICAgb3BlcmF0aW9uTWVzc2FnZSA9Ci0gICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKE1lc3NhZ2VFbnRyeQotICAgICAgICAgIC5UWVBFX1JFU1BPTlNFCi0gICAgICAgICAgLmVxdWFscyhlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpKQotICAgICAgICAgICYmIChiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpICE9IG51bGwpKQotICAgICAgICB7Ci0gICAgICAgICAgb3BlcmF0aW9uTWVzc2FnZSA9Ci0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAob3BlcmF0aW9uTWVzc2FnZSA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotCi0gICAgICBib29sZWFuIGlzQ29udGFpbkFycmF5ID0gZmFsc2U7Ci0KLSAgICAgIENvbGxlY3Rpb24gcGFydHMgPSBvcGVyYXRpb25NZXNzYWdlLmdldFBhcnRzKCkudmFsdWVzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJ0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpdGVyLm5leHQoKTsKLQotICAgICAgICBRTmFtZSB0eXBlID0gbnVsbDsKLQotICAgICAgICBpZiAocGFydC5nZXRUeXBlTmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0eXBlID0gcmVnaXN0cnkuZ2V0VHlwZShwYXJ0LmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHR5cGUgPSBwYXJ0LmdldFR5cGVOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpc0NvbnRhaW5BcnJheSA9Ci0gICAgICAgICAgcmVnaXN0cnkuaXNFeHRlbmRzQXJyYXkodHlwZSkKLSAgICAgICAgICAgIHx8IHJlZ2lzdHJ5LmlzVXNlc1dTRExBcnJheVR5cGUodHlwZSkKLSAgICAgICAgICAgIHx8IGlzQXJyYXlUeXBlKHR5cGUpOwotICAgICAgICBpZiAoaXNDb250YWluQXJyYXkpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0NvbnRhaW5BcnJheSkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0cyBib2R5Ci0gICAgICAgIE5vZGVMaXN0IHNvYXBCb2R5TGlzdCA9Ci0gICAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fQk9EWSk7Ci0gICAgICAgIGlmIChzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCB8fCBzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVsZW1lbnQgc29hcEJvZHlFbGVtID0gKEVsZW1lbnQpIHNvYXBCb2R5TGlzdC5pdGVtKDApOwotCi0gICAgICAgIE5vZGVMaXN0IHNvYXBCb2R5Q2lsZHJlbkxpc3QgPQotICAgICAgICAgIHNvYXBCb2R5RWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCIqIiwgIioiKTsKLSAgICAgICAgZm9yIChpbnQgaW5kZXhDaGlsZCA9IDA7Ci0gICAgICAgICAgaW5kZXhDaGlsZCA8IHNvYXBCb2R5Q2lsZHJlbkxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgaW5kZXhDaGlsZCsrKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpIHNvYXBCb2R5Q2lsZHJlbkxpc3QuaXRlbShpbmRleENoaWxkKTsKLSAgICAgICAgICBpZiAoZWxlbQotICAgICAgICAgICAgLmhhc0F0dHJpYnV0ZU5TKAotICAgICAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVBfRU5DT0RJTkcsCi0gICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX0FSUkFZX1RZUEUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0eXBlIHVzZXMgYW4gYXJyYXkgb3Igbm90LgotICAgKiBAcGFyYW0gdHlwZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0FycmF5VHlwZShRTmFtZSB0eXBlKQotICB7Ci0gICAgYm9vbGVhbiBhcnJheVR5cGUgPSBmYWxzZTsKLQotICAgIEVsZW1lbnQgdHlwZUVsZW1lbnQgPSBnZXRUeXBlRWxlbWVudCh0eXBlKTsKLSAgICBpZiAodHlwZUVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBOb2RlTGlzdCBsaXN0ID0KLSAgICAgICAgdHlwZUVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1hTRCwKLSAgICAgICAgICAic2VxdWVuY2UiKTsKLSAgICAgIGlmIChsaXN0LmdldExlbmd0aCgpID4gMCkKLSAgICAgICAgYXJyYXlUeXBlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYXJyYXlUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgWE1MIGVsZW1lbnQgZGVmaW5pbmcgdGhlIHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlCi0gICAqIEByZXR1cm4gRWxlbWVudAotICAgKi8KLSAgcHJpdmF0ZSBFbGVtZW50IGdldFR5cGVFbGVtZW50KFFOYW1lIHR5cGUpCi0gIHsKLSAgICBUeXBlc1tdIGFsbFR5cGVzID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0VHlwZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgYWxsVHlwZXMgIT0gbnVsbCAmJiBpIDwgYWxsVHlwZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgRWxlbWVudCB0eXBlc0VsZW1lbnQgPSBudWxsOwotICAgICAgaWYgKGFsbFR5cGVzW2ldICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHR5cGVzRWxlbWVudCA9IGFsbFR5cGVzW2ldLmdldERvY3VtZW50YXRpb25FbGVtZW50KCk7Ci0gICAgICAgIGlmICh0eXBlc0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIExpc3QgZXh0TGlzdCA9IGFsbFR5cGVzW2ldLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGV4dExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoZXh0RWxlbQotICAgICAgICAgICAgICAuZ2V0RWxlbWVudFR5cGUoKQotICAgICAgICAgICAgICAuZXF1YWxzKG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1hTRCwgInNjaGVtYSIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHlwZXNFbGVtZW50ID0KLSAgICAgICAgICAgICAgICAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbSkuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVzRWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTm9kZUxpc3QgY29tcGxleFR5cGVzTGlzdCA9Ci0gICAgICAgICAgICB0eXBlc0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9YU0QsCi0gICAgICAgICAgICAgICJjb21wbGV4VHlwZSIpOwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29tcGxleFR5cGVzTGlzdC5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgdHlwZUVsZW0gPSAoRWxlbWVudCkgY29tcGxleFR5cGVzTGlzdC5pdGVtKGopOwotICAgICAgICAgICAgaWYgKHR5cGUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKHR5cGVFbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHR5cGVFbGVtOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjA4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2YWY5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFRyYXZlcnNhbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci0KLQotLyoqCi0gKiBCUDEyMDggTk9UIEZVTExZIFRFU1RFRC4KLSAqLwotcHVibGljIGNsYXNzIEJQMTIwOCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTIwOChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBQYXJzZSBsb2cgbWVzc2FnZSAKLSAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLSAgICBpZiAoZG9jID09IG51bGwpIHsKLSAgICAgIC8vbWVzc2FnZSBpcyBlbXB0eSBvciBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgfSBlbHNlIHsKLQotICAgICAgLy8gVHJhdmVyc2UgZG9jdW1lbnQgbG9va2luZyBmb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMuCi0gICAgICAvLyBJU1NVRTogdGhpcyBpbm5lciBjbGFzcyBuZWVkcyAuLi4gcmV2aXNpdGluZy9yZXBsYWNpbmcKLSAgICAgIC8vIEVHLiBEbyB3ZSB3YW50IHRvIGxpc3QgYWxsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCAKLSAgICAgIC8vIG9yIGlzIHRoZSBmaXJzdCBzdWZmaWNpZW50PwotICAgICAgWE1MVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBYTUxUcmF2ZXJzYWwoKQotICAgICAgewotICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICAgIlRhcmdldDogIiArIHBpLmdldFRhcmdldCgpICsgIiwgRGF0YTogIiArIHBpLmdldERhdGEoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFERDogSG93IHNob3VsZCB0aGlzIGV4Y2VwdGlvbiBiZSBoYW5kbGVkPwotICAgICAgICAgIH0KLQotICAgICAgICAgIHN1cGVyLnZpc2l0KHBpKTsKLSAgICAgICAgfQotICAgICAgfTsKLQotICAgICAgdHJhdmVyc2FsLnZpc2l0KGRvYyk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQKLSAgICAgICAgJiYgZmFpbHVyZURldGFpbE1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZmFpbHVyZURldGFpbE1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxMzNiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5PcGVyYXRpb25TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxUYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogQlAxMjExLgotICogCi0gKiBDb250ZXh0OiAKLSAqIEZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGxvZyBmaWxlLCB0aGF0IGlzIHJlZmVycmVkIGJ5IGEgYmluZGluZyBzdHlsZSBSUEMtbGl0ZXJhbAotICogCi0gKiBEZXNjcmlwdGlvbjoKLSAqIFBhcnQgYWNjZXNzb3IgZWxlbWVudHMgaW4gdGhlIG1lc3NhZ2UgZG8gbm90IGhhdmUgYW4geHNpOm5pbCBhdHRyaWJ1dGUgd2l0aCBhIHZhbHVlIG9mICIxIiBvciAidHJ1ZSIuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEyMTEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgWE1MVGFncwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMjExKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIFBhcnNlIG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotICAgICAgRG9jdW1lbnQgZG9jUmVxdWVzdCA9IGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0RG9jdW1lbnQoKTsKLQotICAgICAgRWxlbWVudCBzb2FwT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgRmF1bHQgZW50cnkgb3Igbm8gYm9keSBlbnRyaWVzLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKHZhbGlkYXRvci5pc0ZhdWx0KGRvYykKLSAgICAgICAgfHwgKHNvYXBPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0U29hcEJvZHlDaGlsZChkb2MpKSA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBHZXQgU09BUEFjdGlvbgotICAgICAgU3RyaW5nIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpCi0gICAgICAgIGFjdGlvbiA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsICI6IikuZ2V0KCJTT0FQQWN0aW9uIi50b1VwcGVyQ2FzZSgpKTsKLQotICAgICAgLy8gR2V0IHRoZSBiaW5kaW5nIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkICAgICAgICAgICAgICAgIAotICAgICAgQmluZGluZyBiaW5kaW5nID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXTsKLQotICAgICAgLy9DcmVhdGUgdGhlIHR5cGVzIHJlZ2lzdHJ5Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICB2YWxpZGF0b3IpOwotCi0gICAgICAvLyBGaW5kIGFuIG9wZXJhdGlvbiBtYXRjaCAgICAgICAgCi0gICAgICBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgZG9jUmVxdWVzdCwKLSAgICAgICAgICBhY3Rpb24sCi0gICAgICAgICAgYmluZGluZywKLSAgICAgICAgICByZWdpc3RyeSk7Ci0gICAgICBpZiAobWF0Y2ggPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR2V0IHRoZSBiaW5kaW5nIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgbWF0Y2gKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG1hdGNoLmdldE9wZXJhdGlvbigpOwotCi0gICAgICAvLyBJZiB0aGlzIGlzIG5vdCBycGMtbGl0ZXJhbCwgdGhlbiByZXR1cm4gbm90QXBwbGljYWJsZSByZXN1bHQKLSAgICAgIGlmICghV1NETFV0aWxzCi0gICAgICAgIC5pc1JwY0xpdGVyYWwobWF0Y2guZ2V0T3BlcmF0aW9uU3R5bGUoKSwgYmluZGluZ09wZXJhdGlvbikpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBhY2Nlc3NvcnMKLSAgICAgIEVsZW1lbnQgYWNjZXNzb3IgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKHNvYXBPcGVyYXRpb24pOwotICAgICAgd2hpbGUgKGFjY2Vzc29yICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShhY2Nlc3NvciwgQVRUUl9YU0lfTklMKTsKLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgeHNpOm5pbCBhdHRyaWJ1dGUgYW5kIGl0cyB2YWx1ZSBpcyAiMSIgb3IgInRydWUiCi0gICAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgIGlmIChhdHRyICE9IG51bGwKLSAgICAgICAgICAmJiAoYXR0ci5nZXRWYWx1ZSgpLmVxdWFscygiMSIpIHx8IGF0dHIuZ2V0VmFsdWUoKS5lcXVhbHMoInRydWUiKSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGFjY2Vzc29yIG5hbWUgaXMgIgotICAgICAgICAgICAgKyBhY2Nlc3Nvci5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBHZXR0aW5nIHRoZSBuZXh0IGFjY2Vzc29yCi0gICAgICAgIGFjY2Vzc29yID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoYWNjZXNzb3IpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzFmNzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEJQMTIxMgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBub24tZmF1bHQgZW52ZWxvcGUgY29udGFpbmluZyBhIHNvYXA6Ym9keSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBlbnZlbG9wZSBjb250YWlucyBleGFjdGx5IG9uZSBwYXJ0IGFjY2Vzc29yIGVsZW1lbnQgZm9yIGVhY2ggb2YgdGhlIHdzZGw6cGFydCBlbGVtZW50cyBib3VuZCB0byB0aGUgZW52ZWxvcGUncyBjb3JyZXNwb25kaW5nIHNvYXBiaW5kOmJvZHkgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAxMjEyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTIxMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAodmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICBFbGVtZW50IHNvYXBPcGVyYXRpb24gPSBudWxsOwotICAgICAgLy8gSWYgdGhlcmUgaXMgYSBGYXVsdCBlbnRyeSBvciBubyBib2R5IGVudHJpZXMsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAodmFsaWRhdG9yLmlzRmF1bHQoZG9jKQotICAgICAgICB8fCAoc29hcE9wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRTb2FwQm9keUNoaWxkKGRvYykpID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIENyZWF0aW5nIGEgcXVhbGlmaWVkIG5hbWUgb2YgcG90ZW50aWFsIFNPQVAgb3BlcmF0aW9uCi0gICAgICBRTmFtZSBvcGVyYXRpb25RTmFtZSA9IG5ldyBRTmFtZSgKLSAgICAgICAgc29hcE9wZXJhdGlvbi5nZXROYW1lc3BhY2VVUkkoKSwgc29hcE9wZXJhdGlvbi5nZXRMb2NhbE5hbWUoKSk7Ci0KLSAgICAgIC8vIFJldHJpZXZpbmcgYWxsIHRoZSBSUEMgYmluZGluZyBvcGVyYXRpb25zIGZyb20gd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uW10gcnBjQmluZGluZ09wZXJhdGlvbnMgPQotICAgICAgICB2YWxpZGF0b3IuZ2V0TWF0Y2hpbmdCaW5kaW5nT3BzKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMsCi0gICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKSk7Ci0KLSAgICAgIC8vIFJldHJpZXZpbmcgYmluZGluZyBvcGVyYXRpb24gYnkgZ2l2ZW4gb3BlcmF0aW9uIG5hbWUKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRPcGVyYXRpb25NYXRjaCgKLSAgICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCksCi0gICAgICAgIG9wZXJhdGlvblFOYW1lLAotICAgICAgICBycGNCaW5kaW5nT3BlcmF0aW9ucyk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1hdGNoZWQgb3BlcmF0aW9uLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBGaW5kaW5nIG9wZXJhdGlvbiBtZXNzYWdlIHBhcnRzIGFuZCBleHRlbnNpYmlsaXR5IGVsZW1zCi0gICAgICAvLyBpbiB0aGUgYmluZGluZyBkZXBlbmRpbmcgb24gbWVzc2FnZSB0eXBlCi0gICAgICBMaXN0IG9wZXJhdGlvbk1lc3NhZ2VQYXJ0cyA9IG51bGw7Ci0gICAgICBMaXN0IGV4dEVsZW1zID0gbnVsbDsKLSAgICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkpCi0gICAgICB7Ci0gICAgICAgIG9wZXJhdGlvbk1lc3NhZ2VQYXJ0cyA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkKLSAgICAgICAgICAuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkuZ2V0T3JkZXJlZFBhcnRzKG51bGwpOwotICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgICAgIGV4dEVsZW1zID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9wZXJhdGlvbk1lc3NhZ2VQYXJ0cyA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkKLSAgICAgICAgICAuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpLmdldE9yZGVyZWRQYXJ0cyhudWxsKTsKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICAgICAgZXh0RWxlbXMgPQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldHRpbmcgYWxsIHRoZSBhY2Nlc3NvcnMgb2YgdGhlIG9wZXJhdGlvbiBlbGVtZW50Ci0gICAgICBMaXN0IGFjY2Vzc29ycyA9IFhNTFV0aWxzLmdldENoaWxkRWxlbWVudHMoc29hcE9wZXJhdGlvbik7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBvcmRlcmVkIGxpc3Qgb2Ygd3NkbDpwYXJ0IG5hbWVzCi0gICAgICBMaXN0IG9yZGVyZWRQYXJ0TmFtZXMgPQotICAgICAgICB2YWxpZGF0b3Iub3JkZXJQYXJ0TmFtZXMob3BlcmF0aW9uTWVzc2FnZVBhcnRzLCBleHRFbGVtcyk7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgd3NkbDpwYXJ0IG5hbWVzCi0gICAgICBJdGVyYXRvciBpID0gb3JkZXJlZFBhcnROYW1lcy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm90IGV4YWN0bHkgb25lIGFjY2Vzc29yIGZvciB0aGUgcGFydCBzcGVjaWZpZWQsCi0gICAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgIGlmIChnZXRQYXJ0c0NvdW50KGFjY2Vzc29ycywgcGFydE5hbWUpICE9IDEpCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAiVGhlIG5hbWUgb2Ygd3NkbDpwYXJ0IGlzICIgKyBwYXJ0TmFtZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb3VudHMgdGhlIGFtb3VudCBvZiBhY2Nlc3NvcnMgb2YgYSBzcGVjaWZpYyBuYW1lCi0gICAqIEBwYXJhbSBhY2Nlc3NvcnMgYSBsaXN0IG9mIGFjY2Vzc29ycwotICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhY2Nlc3NvciBlbGVtZW50cyB0byBiZSBjb3VudGVkCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgaW50IGdldFBhcnRzQ291bnQoTGlzdCBhY2Nlc3NvcnMsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgaW50IGNvdW50ID0gMDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWNjZXNzb3JzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnQgYWNjZXNzb3IgPSAoRWxlbWVudCkgYWNjZXNzb3JzLmdldChpKTsKLSAgICAgIGlmIChhY2Nlc3Nvci5nZXRMb2NhbE5hbWUoKS5lcXVhbHMobmFtZSkpCi0gICAgICAgIGNvdW50Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvdW50OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjEzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1ZDg0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEyMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEJQMTIxMwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBub24tZmF1bHQgZW52ZWxvcGUgY29udGFpbmluZyBhIHNvYXA6Qm9keSBlbGVtZW50LCBhbmQgaXMgcmVmZXJyZWQgYnkgYSBkb2MtbGl0ZXJhbCBiaW5kaW5nPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBlbnZlbG9wZSBoYXMgbm8gZWxlbWVudCBjb250ZW50IGluIHRoZSBzb2FwOkJvZHkgZWxlbWVudCBpZiB0aGUgdmFsdWUgb2YgdGhlIHBhcnRzIGF0dHJpYnV0ZSBvZiB0aGUgc29hcGJpbmQ6Ym9keSBpcyBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZG9jLWxpdGVyYWwgZGVzY3JpcHRpb24uPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMTIxMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEyMTMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSBtZXNzYWdlIGRvY3VtZW50Ci0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgRWxlbWVudCBtZXNzYWdlRWxlbWVudCA9IG51bGw7Ci0gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBlbXB0eSBvciBpbnZhbGlkIG9yIHRoZXJlIGlzIGEgRmF1bHQgZW50cnkKLSAgICAgIC8vIG9yIHRoZXJlIGlzIG5vIGJvZHkgZW50cmllcywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsCi0gICAgICAgIHx8IHZhbGlkYXRvci5pc0ZhdWx0KGRvYykKLSAgICAgICAgfHwgKG1lc3NhZ2VFbGVtZW50ID0gdmFsaWRhdG9yLmdldFNvYXBCb2R5Q2hpbGQoZG9jKSkgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR2V0dGluZyBhIHF1YWxpZmllZCBuYW1lIG9mIG1lc3NhZ2UgZWxlbWVudAotICAgICAgUU5hbWUgbWVzc2FnZVBhcnRFbGVtZW50UU5hbWUgPSBuZXcgUU5hbWUoCi0gICAgICAgIG1lc3NhZ2VFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpLCBtZXNzYWdlRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0KLSAgICAgIC8vIFJldHJpZXZpbmcgYWxsIHRoZSBkb2N1bWVudCBiaW5kaW5nIG9wZXJhdGlvbnMgZnJvbSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBkb2NCaW5kaW5nT3BlcmF0aW9ucyA9Ci0gICAgICAgIHZhbGlkYXRvci5nZXRNYXRjaGluZ0JpbmRpbmdPcHMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQywKLSAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpKTsKLQotICAgICAgLy8gUmV0cmlldmluZyBiaW5kaW5nIG9wZXJhdGlvbiBieSBnaXZlbiBlbGVtZW50IG5hbWUKLSAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBwb3RlbnRpYWxEb2NMaXRPcHMgPQotICAgICAgICB2YWxpZGF0b3IuZ2V0RG9jTGl0T3BlcmF0aW9ucygKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwKLSAgICAgICAgICBtZXNzYWdlUGFydEVsZW1lbnRRTmFtZSwKLSAgICAgICAgICBkb2NCaW5kaW5nT3BlcmF0aW9ucyk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vdCBleGFjdGx5IG9uZSBvcGVyYXRpb24gbWF0Y2hlZCwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChwb3RlbnRpYWxEb2NMaXRPcHMubGVuZ3RoICE9IDEpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEZpbmRpbmcgb3BlcmF0aW9uIGV4dGVuc2liaWxpdHkgZWxlbXMKLSAgICAgIC8vIGluIHRoZSBiaW5kaW5nIGRlcGVuZGluZyBvbiBtZXNzYWdlIHR5cGUKLSAgICAgIExpc3QgZXh0RWxlbXMgPSBudWxsOwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKQotICAgICAgICAmJiBwb3RlbnRpYWxEb2NMaXRPcHNbMF0uZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBwb3RlbnRpYWxEb2NMaXRPcHNbMF0KLSAgICAgICAgICAuZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UpCi0gICAgICAgICYmIHBvdGVudGlhbERvY0xpdE9wc1swXS5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBwb3RlbnRpYWxEb2NMaXRPcHNbMF0KLSAgICAgICAgICAuZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotCi0gICAgICAvLyBHZXR0aW5nIHRoZSBwYXJ0cyBhdHRyaWJ1dGUgZnJvbSBzb2FwYmluZDpib2R5Ci0gICAgICBMaXN0IHBhcnRzID0gbnVsbDsKLSAgICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gdmFsaWRhdG9yLmdldFNPQVBCb2R5KGV4dEVsZW1zKTsKLSAgICAgIGlmIChzb2FwQm9keSAhPSBudWxsKQotICAgICAgICBwYXJ0cyA9IHNvYXBCb2R5LmdldFBhcnRzKCk7Ci0KLSAgICAgIC8vIGlmIHRoZSBwYXJ0cyBhdHRyaWJ1dGUgaXMgYW4gZW1wdHkgc3RyaW5nIGFuZCB0aGVyZSBpcwotICAgICAgLy8gYXQgbGVhc3Qgb25lIGFjY2Vzc29yLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgaWYgKHBhcnRzICE9IG51bGwgJiYgcGFydHMuaXNFbXB0eSgpCi0gICAgICAgICYmICFYTUxVdGlscy5nZXRDaGlsZEVsZW1lbnRzKG1lc3NhZ2VFbGVtZW50KS5pc0VtcHR5KCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJ3c2RsOm9wZXJhdGlvbiBuYW1lIGlzICIKLSAgICAgICAgICArIHBvdGVudGlhbERvY0xpdE9wc1swXS5nZXROYW1lKCkpOwotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTIxNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTEzNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMjE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBCUDEyMTQKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgbm9uLWZhdWx0IGVudmVsb3BlIGNvbnRhaW5pbmcgYSBzb2FwOkJvZHkgZWxlbWVudCwgYW5kIGlzIHJlZmVycmVkIGJ5IGEgcnBjLWxpdGVyYWwgYmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgZW52ZWxvcGUgZG9lcyBub3QgY29udGFpbiBhbnkgcGFydCBhY2Nlc3NvciBlbGVtZW50cyBpZiB0aGUgdmFsdWUgb2YgdGhlIHBhcnRzIGF0dHJpYnV0ZSBvZiB0aGUgc29hcGJpbmQ6Ym9keSBpcyBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcnBjLWxpdGVyYWwgZGVzY3JpcHRpb24uPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMTIxNCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEyMTQoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKHZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSBtZXNzYWdlIGRvY3VtZW50Ci0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgRWxlbWVudCBzb2FwT3BlcmF0aW9uID0gbnVsbDsKLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgRmF1bHQgZW50cnkgb3Igbm8gYm9keSBlbnRyaWVzLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKHZhbGlkYXRvci5pc0ZhdWx0KGRvYykKLSAgICAgICAgfHwgKHNvYXBPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0U29hcEJvZHlDaGlsZChkb2MpKSA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBDcmVhdGluZyBhIHF1YWxpZmllZCBuYW1lIG9mIHBvdGVudGlhbCBTT0FQIG9wZXJhdGlvbgotICAgICAgUU5hbWUgb3BlcmF0aW9uUU5hbWUgPSBuZXcgUU5hbWUoCi0gICAgICAgIHNvYXBPcGVyYXRpb24uZ2V0TmFtZXNwYWNlVVJJKCksIHNvYXBPcGVyYXRpb24uZ2V0TG9jYWxOYW1lKCkpOwotCi0gICAgICAvLyBSZXRyaWV2aW5nIGFsbCB0aGUgUlBDIGJpbmRpbmcgb3BlcmF0aW9ucyBmcm9tIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZ09wZXJhdGlvbltdIHJwY0JpbmRpbmdPcGVyYXRpb25zID0KLSAgICAgICAgdmFsaWRhdG9yLmdldE1hdGNoaW5nQmluZGluZ09wcygKLSAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDLAotICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKCkpOwotCi0gICAgICAvLyBSZXRyaWV2aW5nIGJpbmRpbmcgb3BlcmF0aW9uIGJ5IGdpdmVuIG9wZXJhdGlvbiBuYW1lCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICBvcGVyYXRpb25RTmFtZSwKLSAgICAgICAgcnBjQmluZGluZ09wZXJhdGlvbnMpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVkIG9wZXJhdGlvbiwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gRmluZGluZyBvcGVyYXRpb24gZXh0ZW5zaWJpbGl0eSBlbGVtcwotICAgICAgLy8gaW4gdGhlIGJpbmRpbmcgZGVwZW5kaW5nIG9uIG1lc3NhZ2UgdHlwZQotICAgICAgTGlzdCBleHRFbGVtcyA9IG51bGw7Ci0gICAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldFR5cGUoKS5lcXVhbHMoCi0gICAgICAgIE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpCi0gICAgICAgICYmIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPQotICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UpCi0gICAgICAgICYmIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dEVsZW1zID0KLSAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgbm90IGxpdGVyYWwsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghdmFsaWRhdG9yLmlzTGl0ZXJhbChleHRFbGVtcykpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgdGhlIHBhcnRzIGF0dHJpYnV0ZSBmcm9tIHNvYXBiaW5kOmJvZHkKLSAgICAgIExpc3QgcGFydHMgPSBudWxsOwotICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSB2YWxpZGF0b3IuZ2V0U09BUEJvZHkoZXh0RWxlbXMpOwotICAgICAgaWYgKHNvYXBCb2R5ICE9IG51bGwpCi0gICAgICAgIHBhcnRzID0gc29hcEJvZHkuZ2V0UGFydHMoKTsKLQotICAgICAgLy8gaWYgdGhlIHBhcnRzIGF0dHJpYnV0ZSBpcyBhbiBlbXB0eSBzdHJpbmcgYW5kIHRoZXJlIGlzCi0gICAgICAvLyBhdCBsZWFzdCBvbmUgYWNjZXNzb3IsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICBpZiAocGFydHMgIT0gbnVsbCAmJiBwYXJ0cy5pc0VtcHR5KCkKLSAgICAgICAgJiYgIVhNTFV0aWxzLmdldENoaWxkRWxlbWVudHMoc29hcE9wZXJhdGlvbikuaXNFbXB0eSgpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigid3NkbDpvcGVyYXRpb24gbmFtZSBpcyAiCi0gICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhMjBjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTMwMS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTMwMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTMwMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vR2V0IHRoZSByZXF1ZXRzIG1lc3NhZ2UgYW5kIGNoZWNrIHRoZSB2YWx1ZSBvZiBtdXN0VW5kZXJzdGFuZC4KLSAgICBTdHJpbmcgbWVzc2FnZSA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCk7Ci0gICAgT2JqZWN0W10gbXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzID0gZ2V0TXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzKG1lc3NhZ2UpOwotCi0gICAgaWYgKG11c3RVbmRlcnN0YW5kQXR0cmlidXRlcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbXVzdFVuZGVyc3RhbmRBdHRyaWJ1dGVzLmxlbmd0aDsgaW5kZXgrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKChtdXN0VW5kZXJzdGFuZEF0dHJpYnV0ZXNbaW5kZXhdICE9IG51bGwpCi0gICAgICAgICAgJiYgKG11c3RVbmRlcnN0YW5kQXR0cmlidXRlc1tpbmRleF0uZXF1YWxzKCIxIikKLSAgICAgICAgICAgIHx8IG11c3RVbmRlcnN0YW5kQXR0cmlidXRlc1tpbmRleF0uZXF1YWxzKCIwIikpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAiVGhlIFNPQVAgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIHdhcyBwcmVzZW50ICIKLSAgICAgICAgICAgICAgICArICIgYW5kIGl0cyB2YWx1ZSB3YXMgICIKLSAgICAgICAgICAgICAgICArIG11c3RVbmRlcnN0YW5kQXR0cmlidXRlc1tpbmRleF0sCi0gICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0gLy9FbmQgaWYKLSAgICAgIH0gLy9FbmQgZm9yCi0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLy9SZXRyZWl2ZXMgdGhlIHZhbHVlIG9mIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgZnJvbSBBTEwgU09BUCBoZWFkZXIKLSAgLy9JZiB0aGUgSGVhZGVyIGlzIG1pc3Npbmcgb3IgaWYgaXQgZG9lcyBub3QgY29udGFpbiBhbnkgdGFyZ2V0cyBvciBpZgotICAvL3RoZSBoZWFkZXIgZG9lcyBub3QgY29udGFpbiBhIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSB0aGVuIHNldCB0aGUKLSAgLy9hc3NlcnRpb25SZXN1bHQgdG8gUkVTVUxUX05PVF9BUFBMSUNBQkxFLgotICBwcml2YXRlIE9iamVjdFtdIGdldE11c3RVbmRlcnN0YW5kQXR0cmlidXRlcyhTdHJpbmcgbWVzc2FnZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAobWVzc2FnZSA9PSBudWxsIHx8IG1lc3NhZ2UudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIERvY3VtZW50IGRvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKG1lc3NhZ2UpOwotICAgIE5vZGVMaXN0IGhlYWRlcnMgPQotICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiSGVhZGVyIik7Ci0KLSAgICAvL0lmIGEgaGVhZGVyIG5vdCBwcmVzZW50IHNldCByZXN1bHQgdG8gbm90QXBwbGljYWJsZQotICAgIC8vZWxzZSBwcm9jZXNzIGVhY2ggaGVhZGVyRW50cnkKLSAgICBpZiAoaGVhZGVycy5nZXRMZW5ndGgoKSA8PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgVmVjdG9yIG11c3RVbmRlcnN0YW5kQXR0cmlidXRlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIEVsZW1lbnQgaGVhZGVyID0gKEVsZW1lbnQpIGhlYWRlcnMuaXRlbSgwKTsKLSAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgIE5vZGVMaXN0IGhlYWRlckVudHJpZXMgPSBoZWFkZXIuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgLy9Gb3IgZWFjaCBoZWFkZXIgZW50cnkgY2hlY2sgcmV0cmVpdmUgdGhlIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZSAKLSAgICAgIC8vaWYgYW55LCBlbHNlIHNldCB0aGUgdGVzdCByZXN1bHQgdG8gbm90QXBwbGljYWJsZQotCi0gICAgICAvL1RoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiBhIGhlYWRlciBjb250YWluZWQgYW55IGNoaWxkIEVsZW1lbnRzCi0gICAgICBib29sZWFuIGhlYWRlclRhcmdldHMgPSBmYWxzZTsKLQotICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGhlYWRlckVudHJpZXMuZ2V0TGVuZ3RoKCk7ICsraW5kZXgpCi0gICAgICB7Ci0gICAgICAgIE5vZGUgaGVhZGVyRW50cnkgPSBoZWFkZXJFbnRyaWVzLml0ZW0oaW5kZXgpOwotICAgICAgICBpZiAoaGVhZGVyRW50cnkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIGhlYWRlclRhcmdldHMgPSB0cnVlOwotICAgICAgICAgIEF0dHIgbXVzdFVuZGVyc3RhbmQgPQotICAgICAgICAgICAgKChFbGVtZW50KSBoZWFkZXJFbnRyeSkuZ2V0QXR0cmlidXRlTm9kZU5TKAotICAgICAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgICAgICJtdXN0VW5kZXJzdGFuZCIpOwotICAgICAgICAgIC8vUmV0cmVpdmUgdGhlIHZhbHVlIG9mIHRoZSBtdXN0VW5kZXJzdGFuZCBhdHRyaWJ1dGUgb2YgdGhlIHJlcXVlc3QuCi0gICAgICAgICAgaWYgKG11c3RVbmRlcnN0YW5kICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG11c3RVbmRlcnN0YW5kVmFsdWUgPSBtdXN0VW5kZXJzdGFuZC5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgIG11c3RVbmRlcnN0YW5kQXR0cmlidXRlcy5hZGQobXVzdFVuZGVyc3RhbmRWYWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgICAgLy9UaGUgU09BUCBIZWFkZXIgZG9lcyBub3QgY29udGFpbiBhIG11c3RVbmRlcnN0YW5kIGF0dHJpYnV0ZS4iCi0gICAgICAgICAgfSAvLwltdXN0VW5kZXJzdGFuZCAhPSBudWxsCi0gICAgICAgIH0KLSAgICAgIH0gLy9FbmQgZm9yCi0KLSAgICAgIGlmICghaGVhZGVyVGFyZ2V0cykKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgLy9UaGUgU09BUCBIZWFkZXIgZG9lcyBub3QgY29udGFpbiBhbnkgaGVhZGVyIGVudHJpZXMuCi0gICAgICB9Ci0KLSAgICAgIHJldHVybiBtdXN0VW5kZXJzdGFuZEF0dHJpYnV0ZXMudG9BcnJheSgpOwotICAgIH0gLy9FbmQgSWYgaGVhZGVycy5nZXRMZW5ndGgoKSA8IDAJCi0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgb2JqZWN0IGlzIG11c3QgdW5kZXJzdGFuZCBmYXVsdCBjb2RlLgotICAgKiBAcGFyYW0gZmF1bHRDb2RlRWxlbSB1bmRlcnN0YW5kIGZhdWx0IGNvZGUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIG9iamVjdCBpcyBtdXN0IHVuZGVyc3RhbmQgZmF1bHQgY29kZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTXVzdFVuZGVyc3RhbmRGYXVsdENvZGUoRWxlbWVudCBmYXVsdENvZGVFbGVtKQotICB7Ci0gICAgLy9BIGZhdWx0Y29kZSBtYXkgb3IgbWF5bm90IGhhdmUgYSBwcmVmaXgsIGlmIGl0IGRvZXMgaXRzIG5hbWVzcGFjZSBzaG91bGQgYmUgCi0gICAgLy9odHQ6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUgd2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIGZhdWx0Y29kZSBlbGVtZW50LgotICAgIC8vSWYgYSBwcmVmaXggaXMgcHJlc2VudCBhbmQgaXQgY29ycmVzcG9uZHMgdG8gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIG9yIGlzIG51bGwgCi0gICAgLy90aGVuIHRoaXMgcmV0dXJucyBmYWxzZS4gIFRoZSBsb2NhbCBwYXJ0IG9mIHRoZSBmYXVsdGNvZGUgaXMgdGhlbiBjaGVjayB0byBzZWUKLSAgICAvL2lmIGl0IGlzIG9uZSBvZiB0aGUgcGVybWl0dGVkIHZhbHVlcy4KLSAgICBpZiAoZmF1bHRDb2RlRWxlbSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3RyaW5nIGZhdWx0Q29kZSA9IGZhdWx0Q29kZUVsZW0uZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLSAgICBpZiAoZmF1bHRDb2RlID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmcgZmF1bHRDb2RlRWxlbVByZWZpeCA9IGZhdWx0Q29kZUVsZW0uZ2V0UHJlZml4KCk7Ci0gICAgU3RyaW5nIGZhdWx0Q29kZVByZWZpeCA9IGZhdWx0Q29kZS5zdWJzdHJpbmcoMCwgZmF1bHRDb2RlLmluZGV4T2YoJzonKSk7Ci0gICAgU3RyaW5nIGZhdWx0Q29kZU5hbWUgPQotICAgICAgZmF1bHRDb2RlLnN1YnN0cmluZyhmYXVsdENvZGUuaW5kZXhPZignOicpICsgMSwgZmF1bHRDb2RlLmxlbmd0aCgpKTsKLQotICAgIGlmICgoZmF1bHRDb2RlRWxlbVByZWZpeCAhPSBudWxsIHx8IGZhdWx0Q29kZVByZWZpeCAhPSBudWxsKSkKLSAgICB7Ci0gICAgICBpZiAoZmF1bHRDb2RlUHJlZml4LmVxdWFscyhmYXVsdENvZGVFbGVtUHJlZml4KQotICAgICAgICAmJiAoZmF1bHRDb2RlTmFtZS5lcXVhbHMoIk11c3RVbmRlcnN0YW5kIikKLSAgICAgICAgICB8fCBmYXVsdENvZGVOYW1lLnN0YXJ0c1dpdGgoIk11c3RVbmRlcnN0YW5kLiIpKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmYXVsdENvZGUuZXF1YWxzKCJNdXN0VW5kZXJzdGFuZCIpCi0gICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuc3RhcnRzV2l0aCgiTXVzdFVuZGVyc3RhbmQuIikpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhY2Q1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gICAqIEJQMTMwMi4KLSAgICogVGhlIHNvYXA6ZmF1bHRjb2RlIHZhbHVlIGluIHRoZSBzb2FwOkZhdWx0IGVsZW1lbnQgb2YgdGhlIHJlc3BvbnNlIAotICAgKiBtZXNzYWdlIGlzIG5vdCBjdXN0b20sIGFuZCBpcyBvbmUgb2Y6IFZlcnNpb25NaXNtYXRjaCwgTXVzdFVuZGVyc3RhbmQsIENsaWVudCwgU2VydmVyLgotICAgKi8KLXB1YmxpYyBjbGFzcyBCUDEzMDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEzMDIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8vU09BUCBmYXVsdCBjb2RlIHZhbHVlcyBzaG91bGQgbm90IGJlIGN1c3RvbTogb25seSBzdGFuZGFyZCBjb2RlIHF1YWxpZmllcnMgCi0gIC8vYXJlIHVzZWQ6IFZlcnNpb25NaXNtYXRjaCwgTXVzdFVuZGVyc3RhbmQsIENsaWVudCwgU2VydmVyCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvL1N0cmluZyByZXF1ZXN0TWVzc2FnZSA9IG51bGw7Ci0gICAgU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9IG51bGw7Ci0KLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvL0dldCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBjaGVjayB0aGUgZmF1bHRjb2RlLgotICAgICAgTWVzc2FnZUVudHJ5IGxvZ0VudHJ5UmVzcG9uc2UgPSBlbnRyeUNvbnRleHQuZ2V0UmVzcG9uc2UoKTsKLSAgICAgIGlmIChsb2dFbnRyeVJlc3BvbnNlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3BvbnNlTWVzc2FnZSA9IGxvZ0VudHJ5UmVzcG9uc2UuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgIERvY3VtZW50IHRhcmdldERvYyA9IFhNTFV0aWxzLnBhcnNlWE1MKHJlc3BvbnNlTWVzc2FnZSk7Ci0gICAgICAgIE5vZGVMaXN0IGZhdWx0Q29kZXMgPSB0YXJnZXREb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImZhdWx0Y29kZSIpOwotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiZmF1bHRjb2RlIik7Ci0KLSAgICAgICAgaWYgKGZhdWx0Q29kZXMuZ2V0TGVuZ3RoKCkgPD0gMCkKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAvL05vIGZhdWx0Y29kZQkKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhdWx0Q29kZXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgZmF1bHRDb2RlRWxlbSA9IGZhdWx0Q29kZXMuaXRlbShpKTsKLSAgICAgICAgICAvL0lmIHRoZSBmYXVsdGNvZGUgd2FzIE11c3RVbmRlcnN0YW5kLCBjaGVjayB0aGUgdmFsdWUgb2YgCi0gICAgICAgICAgLy90aGUgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlIGluIHRoZSByZXF1ZXN0LgotICAgICAgICAgIGlmIChmYXVsdENvZGVFbGVtID09IG51bGwpCi0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgIGVsc2UgaWYgKGZhdWx0Q29kZUVsZW0uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNWYWxpZEZhdWx0Q29kZSgoRWxlbWVudCkgZmF1bHRDb2RlRWxlbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwocmVzcG9uc2VNZXNzYWdlLCBlbnRyeUNvbnRleHQpOwotICAgICAgICAgICAgICAvL2ZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICAvLyAgICAiVGhlIGZhdWx0Y29kZSB2YWx1ZSB3YXMgOiAiCi0gICAgICAgICAgICAgIC8vICAgICAgICArIGZhdWx0Q29kZUVsZW0uZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLSAgICAgICAgICAgIH0gLy9FbmQgaWYgKGZhdWx0Q29kZS5lcXVhbHMuLi4pCi0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgIH0KLSAgICAgICAgfSAvL0VuZCBmb3IJCi0gICAgICB9IC8vRW5kIGlmIGxvZ0VudHJ5UmVzcG9uc2UhPSBudWxsCi0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGZhdWx0Q29kZS4KLSAgICogQHBhcmFtIGZhdWx0Q29kZUVsZW0gYSBmYXVsdGNvZGUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBmYXVsdGNvZGUgaXMgdmFsaWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRmF1bHRDb2RlKEVsZW1lbnQgZmF1bHRDb2RlRWxlbSkKLSAgewotICAgIC8vQSBmYXVsdGNvZGUgbWF5IG9yIG1heW5vdCBoYXZlIGEgcHJlZml4LCBpZiBpdCBkb2VzIGl0cyBuYW1lc3BhY2Ugc2hvdWxkIGJlIAotICAgIC8vaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZSB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgZmF1bHRjb2RlIGVsZW1lbnQuCi0gICAgLy9JZiBhIHByZWZpeCBpcyBwcmVzZW50IGFuZCBpdCBjb3JyZXNwb25kcyB0byBhIGRpZmZlcmVudCBuYW1lc3BhY2Ugb3IgaXMgbnVsbCAKLSAgICAvL3RoZW4gdGhpcyByZXR1cm5zIGZhbHNlLiAgVGhlIGxvY2FsIHBhcnQgb2YgdGhlIGZhdWx0Y29kZSBpcyB0aGVuIGNoZWNrIHRvIHNlZQotICAgIC8vaWYgaXQgaXMgb25lIG9mIHRoZSBwZXJtaXR0ZWQgdmFsdWVzLgotICAgIGlmIChmYXVsdENvZGVFbGVtID09IG51bGwpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFN0cmluZyBmYXVsdENvZGUgPSBmYXVsdENvZGVFbGVtLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0gICAgaWYgKGZhdWx0Q29kZSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRklYOiBUaGlzIGlzIG5vdCBjb3JyZWN0LCBzaW5jZSB0aGlzIGVsZW1lbnQgY2FuIG5vdCBiZSBuYW1lc3BhY2UgcXVhbGlmaWVkCi0gICAgU3RyaW5nIGZhdWx0Q29kZUVsZW1QcmVmaXggPSBmYXVsdENvZGVFbGVtLmdldFBhcmVudE5vZGUoKS5nZXRQcmVmaXgoKTsKLQotICAgIC8vIElmIHRoaXMgaXMgbm90IGEgUU5hbWUgdGhlbiByZXR1cm4gZmFsc2UKLSAgICBpbnQgaW5kZXg7Ci0gICAgU3RyaW5nIGZhdWx0Q29kZVByZWZpeCA9IG51bGw7Ci0gICAgU3RyaW5nIGZhdWx0Q29kZU5hbWUgPSBmYXVsdENvZGU7Ci0gICAgaWYgKChpbmRleCA9IGZhdWx0Q29kZS5pbmRleE9mKCc6JykpICE9IC0xKQotICAgIHsKLSAgICAgIGZhdWx0Q29kZVByZWZpeCA9IGZhdWx0Q29kZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgZmF1bHRDb2RlTmFtZSA9IGZhdWx0Q29kZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBmYXVsdENvZGUubGVuZ3RoKCkpOwotICAgIH0KLQotICAgIGlmICgoZmF1bHRDb2RlRWxlbVByZWZpeCAhPSBudWxsICYmIGZhdWx0Q29kZVByZWZpeCAhPSBudWxsKSkKLSAgICB7Ci0gICAgICBpZiAoZmF1bHRDb2RlUHJlZml4LmVxdWFscyhmYXVsdENvZGVFbGVtUHJlZml4KSkKLSAgICAgIHsKLSAgICAgICAgaWYgKChmYXVsdENvZGVOYW1lLmVxdWFscygiTXVzdFVuZGVyc3RhbmQiKQotICAgICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuZXF1YWxzKCJWZXJzaW9uTWlzbWF0Y2giKQotICAgICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuZXF1YWxzKCJDbGllbnQiKQotICAgICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuZXF1YWxzKCJTZXJ2ZXIiKSkpCi0gICAgICAgICAgLyogUkVNT1ZFOgotICAgICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuc3RhcnRzV2l0aCgiTXVzdFVuZGVyc3RhbmQuIikKLSAgICAgICAgICB8fCBmYXVsdENvZGVOYW1lLnN0YXJ0c1dpdGgoIlZlcnNpb25NaXNtYXRjaC4iKQotICAgICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuc3RhcnRzV2l0aCgiQ2xpZW50LiIpCi0gICAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5zdGFydHNXaXRoKCJTZXJ2ZXIuIikpKQotICAgICAgICAgICovCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGZhdWx0Q29kZU5hbWUuZXF1YWxzKCJNdXN0VW5kZXJzdGFuZCIpCi0gICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuZXF1YWxzKCJWZXJzaW9uTWlzbWF0Y2giKQotICAgICAgICB8fCBmYXVsdENvZGVOYW1lLmVxdWFscygiQ2xpZW50IikKLSAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5lcXVhbHMoIlNlcnZlciIpCi0gICAgICAgIHx8IGZhdWx0Q29kZU5hbWUuc3RhcnRzV2l0aCgiTXVzdFVuZGVyc3RhbmQuIikKLSAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5zdGFydHNXaXRoKCJWZXJzaW9uTWlzbWF0Y2guIikKLSAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5zdGFydHNXaXRoKCJDbGllbnQuIikKLSAgICAgICAgfHwgZmF1bHRDb2RlTmFtZS5zdGFydHNXaXRoKCJTZXJ2ZXIuIikpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzA1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3OTc2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICAgKiBCUDEzMDUuCi0gICAqIEl0IGlzIGluIGFuIEhUVFAgNTAwIG1lc3NhZ2Ugd2l0aCAiU2VydmVyIiBFcnJvciBjb2RlLgotICAgKi8KLXB1YmxpYyBjbGFzcyBCUDEzMDUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEzMDUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBEb2N1bWVudCBkb2M7Ci0gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBvbmUgd2F5IHJlc3BvbnNlCi0gICAgLy8gb3IgbWVzc2FnZSBpcyBtZXB0eSBvciBpbnZhbGlkCi0gICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KQotICAgICAgfHwgKGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBsb29rIGZvciA8c29hcDpGYXVsdD4gZWxlbWVudDoKLSAgICAgIE5vZGVMaXN0IGZhdWx0TGlzdCA9Ci0gICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFQpOwotICAgICAgaWYgKChmYXVsdExpc3QgPT0gbnVsbCkgfHwgKGZhdWx0TGlzdC5nZXRMZW5ndGgoKSA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgLy8gUmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhIHNvYXA6ZmF1bHQKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gd2UgaGF2ZSBhIHNvYXA6RmF1bHQuIENoZWNrIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIGEgSFRUUCA1MDAgbWVzc2FnZQotICAgICAgICAvLyBHVCA6IGJhc2UgSFRUUCBIZWFkZXIgcGFyc2luZyBvbiBCUDEwMDEgLSB0aGlzIHNob3VsZCBiZSBmYWN0b3JlZCB0byBhIAotICAgICAgICAvLyBnZW5lcmFsLXB1cnBvc2UgSFRUUCBtZXNzYWdlIHBhcnNpbmcgbWV0aG9kIG9yIG1ldGhvZHMgKHJlcXVlc3QgJiByZXNwb25zZSkKLSAgICAgICAgU3RyaW5nIGh0dHBIZWFkZXIgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICAgICAgLy9SZXNwb25zZS1MaW5lICAgPSBIVFRQLVZlcnNpb24gUmVzcG9uc2VDb2RlIFJlc3BvbnNlTXNnIFNQIENSTEYKLSAgICAgICAgVmVjdG9yIHJlc3BvbnNlTGluZSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgU3RyaW5nIHN0YXJ0TGluZSA9IG51bGw7Ci0gICAgICAgIC8vU3RyaW5nIGh0dHBWZXJzaW9uID0gbnVsbDsKLSAgICAgICAgLy9TdHJpbmcgcmVzcG9uc2VDb2RlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHN0YXR1c0NvZGUgPSBudWxsOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgaHR0cE1lc3NhZ2VUb2tlbml6ZXIgPQotICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoaHR0cEhlYWRlciwgIlxuXHJcZiIpOwotCi0gICAgICAgIGlmIChodHRwTWVzc2FnZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgc3RhcnRMaW5lID0gaHR0cE1lc3NhZ2VUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0KLSAgICAgICAgaWYgKHN0YXJ0TGluZS5zdGFydHNXaXRoKCJIVFRQIikpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RhcnRMaW5lVG9rZW5pemVyID0KLSAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RhcnRMaW5lLCAiXHUwMDIwIik7Ci0KLSAgICAgICAgICB3aGlsZSAoc3RhcnRMaW5lVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNwb25zZUxpbmUuYWRkKHN0YXJ0TGluZVRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy9odHRwVmVyc2lvbiA9IChTdHJpbmcpIHJlc3BvbnNlTGluZS5nZXQoMCk7Ci0KLSAgICAgICAgICAvLyBQQjogQ2hlY2sgZm9yIDUwMCBzdGF0dXMgY29kZSB3aGljaCBzaG91bGQgYmUgdGhlIHNlY29uZCB0b2tlbiBpbiB0aGUgc3RyaW5nCi0gICAgICAgICAgc3RhdHVzQ29kZSA9IChTdHJpbmcpIHJlc3BvbnNlTGluZS5nZXQoMSk7Ci0KLSAgICAgICAgICAvL3Jlc3BvbnNlQ29kZSA9IChTdHJpbmcpIHJlc3BvbnNlTGluZS5nZXQoMSk7Ci0gICAgICAgICAgLy9zdGF0dXNDb2RlID0gKFN0cmluZykgcmVzcG9uc2VMaW5lLmdldCgyKTsKLSAgICAgICAgfQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIC8vIFBCOiBKdXN0IGNoZWNrIGZvciA1MDAgc3RhdHVzIGNvZGUKLSAgICAgICAgICBpZiAoIXN0YXR1c0NvZGUKLSAgICAgICAgICAgIC5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9JTlRFUk5BTF9FUlJPUikpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vaWYgKCFyZXNwb25zZUNvZGUuZXF1YWxzSWdub3JlQ2FzZSgiT0siKSB8fAotICAgICAgICAgICAgLy8JKCFzdGF0dXNDb2RlLmVxdWFsc0lnbm9yZUNhc2UoIlNlcnZlckVycm9yIikpKSB7ICAgICAJCQkKLSAgICAgICAgICAgIC8vIEFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKGh0dHBIZWFkZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2U0MGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAgICogQlAxMzA2LgotICAgKiBUaGUgc29hcDpGYXVsdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgY2hpbGRyZW4gb3RoZXIgdGhhbiBzb2FwOmZhdWx0Y29kZSwgc29hcDpmYXVsdHN0cmluZywgc29hcDpmYXVsdGFjdG9yIG9yIHNvYXA6ZGV0YWlsLgotICAgKi8KLXB1YmxpYyBjbGFzcyBCUDEzMDYgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEzMDYoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBEb2N1bWVudCBkb2M7Ci0gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBvbmUgd2F5IHJlc3BvbnNlCi0gICAgLy8gb3IgbWVzc2FnZSBpcyBtZXB0eSBvciBpbnZhbGlkCi0gICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KQotIAkgICAgfHwgKGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBsb29rIGZvciA8c29hcDpGYXVsdD4gZWxlbWVudDoKLSAgICAgIE5vZGVMaXN0IGZhdWx0TGlzdCA9Ci0gICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFQpOwotICAgICAgaWYgKChmYXVsdExpc3QgPT0gbnVsbCkgfHwgKGZhdWx0TGlzdC5nZXRMZW5ndGgoKSA9PSAwKSkKLSAgICAgIHsKLSAgICAgICAgLy8gUmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBhIHNvYXA6ZmF1bHQKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gY2hlY2sgdGhhdCBubyBzb2FwOmZhdWx0IGNvbnRhaW5zIG9ubHkgZmF1bHRjb2RlLCBmYXVsdHN0cmluZywgZmF1bHRhY3RvciwgZGV0YWlsLgotICAgICAgICAvLyBJZiBpdCBkb2VzLCBmdXJ0aGVyIGNoZWNrIHRoYXQgaXQgaXMgdW5xdWFsaWZpZWQuCi0gICAgICAgIC8vIEZvciBlYWNoIDxzb2FwOkZhdWx0PgotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgZmF1bHRMaXN0LmdldExlbmd0aCgpOyBuKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgZm9yIChOb2RlIGNoaWxkID0gZmF1bHRMaXN0Lml0ZW0obikuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICBjaGlsZCAhPSBudWxsOwotICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICgoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICAgICAgICAmJiAhKGNoaWxkCi0gICAgICAgICAgICAgICAgICAuZ2V0TG9jYWxOYW1lKCkKLSAgICAgICAgICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVF9DT0RFKQotICAgICAgICAgICAgICAgICAgfHwgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLSAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0ZBVUxUX1NUUklORykKLSAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVF9BQ1RPUikKLSAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVF9ERVRBSUwpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFBCOiBUaGlzIGlzIGNoZWNrZWQgaW4gMTMxNiBub3cKLSAgICAgICAgICAgICAgICAvL3x8IChjaGlsZC5nZXROYW1lc3BhY2VVUkkoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIC8vIEFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NmRkNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogQlAxMzA3LgotICogVGhlIGVsZW1lbnRzIG9mIHRoZSBtZXNzYWdlIHRoYXQgYXJlIG5hbWVzcGFjZWQgCi0gKiAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIGRvIG5vdCBoYXZlIGEgc29hcDplbmNvZGluZ1N0eWxlIGF0dHJpYnV0ZS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTMwNyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTMwNyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIERvY3VtZW50IGRvYzsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSB3YXkgcmVzcG9uc2UKLSAgICAvLyBvciBtZXNzYWdlIGlzIG1lcHR5IG9yIGludmFsaWQKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpCi0gICAgICB8fCAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGxvb2sgZm9yIDxzb2FwOnh4eD4gZWxlbWVudHM6Ci0gICAgICBOb2RlTGlzdCBzb2FwTGlzdCA9Ci0gICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwgIioiKTsKLSAgICAgIGlmICgoc29hcExpc3QgPT0gbnVsbCkgfHwgKHNvYXBMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgewotICAgICAgICAvLyBSZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGFueSBzb2FwIGVudmVsb3BlIGVsZW1lbnRzCi0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIGNoZWNrIHRoYXQgbm8gPHNvYXA6eHh4PiBlbGVtZW50cyBjb250YWlucyBhIHNvYXA6ZW5jb2RpbmdTdHlsZSBhdHRyaWJ1dGUKLSAgICAgICAgLy8gRm9yIGVhY2ggPHNvYXA6eHh4PgotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgc29hcExpc3QuZ2V0TGVuZ3RoKCk7IG4rKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IG5leHRFbGVtID0gKEVsZW1lbnQpIHNvYXBMaXN0Lml0ZW0obik7Ci0gICAgICAgICAgICBpZiAobmV4dEVsZW0KLSAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZU5vZGVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJlbmNvZGluZ1N0eWxlIikKLSAgICAgICAgICAgICAgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy8gQXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzA4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjMGE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTMwOC4KLSAqIFRoZSBjaGlsZHJlbiBlbGVtZW50cyBvZiBzb2FwOkJvZHkgZG8gbm90IGhhdmUgYSBzb2FwOmVuY29kaW5nU3R5bGUgYXR0cmlidXRlLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMzA4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMzA4KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBtZXNzYWdlIGRvY3VtZW50Ci0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gbG9vayBmb3Igc29hcDpCb2R5IGVsZW1lbnRzOgotICAgICAgTm9kZUxpc3Qgc29hcEJvZHlMaXN0ID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgIEVMRU1fU09BUF9CT0RZLmdldE5hbWVzcGFjZVVSSSgpLCBFTEVNX1NPQVBfQk9EWS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgIC8vIFRoZSBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYW55IHNvYXA6Qm9keSwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKChzb2FwQm9keUxpc3QgPT0gbnVsbCkgfHwgKHNvYXBCb2R5TGlzdC5nZXRMZW5ndGgoKSA9PSAwKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gY2hlY2sgdGhhdCBubyBzb2FwOkJvZHkgY2hpbGQgZWxlbWVudHMgY29udGFpbiBhIHNvYXA6ZW5jb2RpbmdTdHlsZSBhdHRyaWJ1dGUKLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHNvYXA6Qm9keSBjaGlsZCBlbGVtZW50Ci0gICAgICBFbGVtZW50IGNoaWxkID0KLSAgICAgICAgWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZCgoRWxlbWVudCkgc29hcEJvZHlMaXN0Lml0ZW0oMCkpOwotICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChjaGlsZC5nZXRBdHRyaWJ1dGVOb2RlTlMoCi0gICAgICAgICAgRUxFTV9TT0FQX0JPRFkuZ2V0TmFtZXNwYWNlVVJJKCksICJlbmNvZGluZ1N0eWxlIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgY2hpbGQgZWxlbWVudCBuYW1lIGlzIFwiIiArCi0gICAgICAgICAgICBjaGlsZC5nZXROb2RlTmFtZSgpICsgIlwiLiIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgc29hcDpCb2R5IGNoaWxkIGVsZW1lbnQKLSAgICAgICAgY2hpbGQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxMzA5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzYjZhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBCUDEzMDkuCi0gKiBUaGUgc29hcDpFbnZlbG9wZSBkb2VzIG5vdCBoYXZlIGRpcmVjdCBjaGlsZHJlbiBhZnRlciB0aGUgc29hcDpCb2R5IGVsZW1lbnQgCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEzMDkgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEzMDkoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBEb2N1bWVudCBkb2M7Ci0gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBvbmUgd2F5IHJlc3BvbnNlCi0gICAgLy8gb3IgbWVzc2FnZSBpcyBtZXB0eSBvciBpbnZhbGlkCi0gICAgaWYgKHRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KQotICAgICAgfHwgKGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBsb29rIGZvciA8c29hcDpFbnZlbG9wZT4gZWxlbWVudHM6Ci0gICAgICAvLyAoTm90ZTogc2luY2UgdGhpcyBpcyBhIFNvYXAgbWVzc2FnZSB3ZSBleHBlY3QgZXhhY3RseSBvbmUgc29hcCBlbnZlbG9wZSwgYnV0IHdlIGRvIG5vdCBhc3N1bWUgaXQpLgotICAgICAgTm9kZUxpc3Qgc29hcEVudkxpc3QgPQotICAgICAgICBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0VOVkVMT1BFKTsKLSAgICAgIGlmICgoc29hcEVudkxpc3QgPT0gbnVsbCkgfHwgKHNvYXBFbnZMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgewotICAgICAgICAvLyBSZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGFueSBzb2FwIEVudmVsb3BlIGVsZW1lbnQocykKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gY2hlY2sgdGhhdCBpZiBhIDxzb2FwOkJvZHk+IGV4aXN0cyBpbiBhIDxzb2FwOkVudmVsb3BlPiwgdGhhdCBpdHMgdGhlIGxhc3QgaW4gdGhlIGVudmVsb3BlICAgICAgICAJCSAgICAgIAkJCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRm9yIGVhY2ggPHNvYXA6RW52ZWxvcGU+Ci0gICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBzb2FwRW52TGlzdC5nZXRMZW5ndGgoKTsgbisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBhbGwgZWxlbWVudHMgaW4gdGhlIEVudmVsb3BlICAgICAgIAkJCQkKLSAgICAgICAgICAgIEVsZW1lbnQgc29hcEVudiA9IChFbGVtZW50KSBzb2FwRW52TGlzdC5pdGVtKG4pOwotICAgICAgICAgICAgTm9kZUxpc3QgZW52Q2hpbGRMaXN0ID0gc29hcEVudi5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgICAgICBWZWN0b3IgZW52Q2hpbGRFbGVtTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGZvciAoaW50IHYgPSAwOyB2IDwgZW52Q2hpbGRMaXN0LmdldExlbmd0aCgpOyB2KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIE5vZGUgbmV4dE5vZGUgPSBlbnZDaGlsZExpc3QuaXRlbSh2KTsKLSAgICAgICAgICAgICAgaWYgKG5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnZDaGlsZEVsZW1MaXN0LmFkZEVsZW1lbnQoKEVsZW1lbnQpIG5leHROb2RlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU2VhcmNoIHRoZSBsaXN0IGZvciA8c29hcDpCb2R5PgotICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBlbnZDaGlsZEVsZW1MaXN0LnNpemUoKTsgbSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBFbGVtZW50IGVudkNoaWxkRWxlbSA9IChFbGVtZW50KSBlbnZDaGlsZEVsZW1MaXN0LmVsZW1lbnRBdChtKTsKLSAgICAgICAgICAgICAgaWYgKGVudkNoaWxkRWxlbQotICAgICAgICAgICAgICAgIC5nZXROYW1lc3BhY2VVUkkoKQotICAgICAgICAgICAgICAgIC5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQKQotICAgICAgICAgICAgICAgICYmIGVudkNoaWxkRWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWE1MVXRpbHMuU09BUF9FTEVNX0JPRFkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gZm91bmQgYSA8c29hcDpCb2R5PiBzbyBjaGVjayBpdHMgdGhlIGxhc3QgaW4gdGhlIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMgb2YgdGhlIEVudmVsb3BlCi0gICAgICAgICAgICAgICAgaWYgKGVudkNoaWxkRWxlbSAhPSBlbnZDaGlsZEVsZW1MaXN0Lmxhc3RFbGVtZW50KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMTYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQxODJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMxNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQMTMxNi4KLSAqIFRoZSBzb2FwOkZhdWx0IGVsZW1lbnQgY2hpbGRyZW4gKHNvYXA6ZmF1bHRjb2RlLCBzb2FwOmZhdWx0c3RyaW5nLCBzb2FwOmZhdWx0YWN0b3Igb3Igc29hcDpkZXRhaWwpIGFyZSB1bnF1YWxpZmllZC4KLSAqLwotcHVibGljIGNsYXNzIEJQMTMxNiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTMxNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIERvY3VtZW50IGRvYzsKLSAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSB3YXkgcmVzcG9uc2UKLSAgICAvLyBvciBtZXNzYWdlIGlzIG1lcHR5IG9yIGludmFsaWQKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpCi0gICAgICB8fCAoZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGxvb2sgZm9yIDxzb2FwOkZhdWx0PiBlbGVtZW50OgotICAgICAgTm9kZUxpc3QgZmF1bHRMaXN0ID0KLSAgICAgICAgZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLAotICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVCk7Ci0gICAgICBpZiAoKGZhdWx0TGlzdCA9PSBudWxsKSB8fCAoZmF1bHRMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgewotICAgICAgICAvLyBSZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGEgc29hcDpmYXVsdAotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBjaGVjayB0aGF0IG5vIHNvYXA6ZmF1bHQgY29udGFpbnMgb25seSBmYXVsdGNvZGUsIGZhdWx0c3RyaW5nLCBmYXVsdGFjdG9yLCBkZXRhaWwuCi0gICAgICAgIC8vIElmIGl0IGRvZXMsIGZ1cnRoZXIgY2hlY2sgdGhhdCBpdCBpcyB1bnF1YWxpZmllZC4KLSAgICAgICAgLy8gRm9yIGVhY2ggPHNvYXA6RmF1bHQ+Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBmYXVsdExpc3QuZ2V0TGVuZ3RoKCk7IG4rKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKE5vZGUgY2hpbGQgPSBmYXVsdExpc3QuaXRlbShuKS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgICAgICAgIGNoaWxkICE9IG51bGw7Ci0gICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgICYmIChjaGlsZAotICAgICAgICAgICAgICAgICAgLmdldExvY2FsTmFtZSgpCi0gICAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFRfQ09ERSkKLSAgICAgICAgICAgICAgICAgIHx8IGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0gICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9GQVVMVF9TVFJJTkcpCi0gICAgICAgICAgICAgICAgICB8fCBjaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFRfQUNUT1IpCi0gICAgICAgICAgICAgICAgICB8fCBjaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5TT0FQX0VMRU1fRkFVTFRfREVUQUlMKSkKLSAgICAgICAgICAgICAgICAmJiAoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBBc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDEzMTguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTgwODAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTMxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuT3BlcmF0aW9uU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotCSAqIEJQMTMxOAotCSAqIAotCSAqIFRoZSBncmFuZGNoaWxkcmVuIGVsZW1lbnRzIG9mIHNvYXA6Qm9keSBkbyBub3QgaGF2ZSBhIHNvYXA6ZW5jb2RpbmdTdHlsZSBhdHRyaWJ1dGUuCi0JICovCi1wdWJsaWMgY2xhc3MgQlAxMzE4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMzE4KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIFBhcnNlIG1lc3NhZ2UKLSAgICAgIERvY3VtZW50IHJlc3BvbnNlRG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0gICAgICBEb2N1bWVudCByZXF1ZXN0RG9jID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3REb2N1bWVudCgpOwotCi0gICAgICAvLyBtZXNzYWdlcyBhcmUgZW1wdHkgb3IgaW52YWxpZCwgRE9NIG9iamVjdHMgYXJlIG51bGwKLSAgICAgIGlmIChyZXNwb25zZURvYyA9PSBudWxsIHx8IHJlcXVlc3REb2MgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvL2lmIChpc0ZhdWx0KHJlc3BvbnNlRG9jKSkKLSAgICAgIC8vICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBHZXQgU09BUEFjdGlvbgotICAgICAgU3RyaW5nIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpCi0gICAgICAgIGFjdGlvbiA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsICI6IikuZ2V0KCJTT0FQQWN0aW9uIi50b1VwcGVyQ2FzZSgpKTsKLQotICAgICAgLy8gR2V0IHRoZSBiaW5kaW5nIHRoYXQgaXMgYmVpbmcgcHJvY2Vzc2VkICAgICAgICAgICAgICAgIAotICAgICAgQmluZGluZyBiaW5kaW5nID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXTsKLQotICAgICAgLy9DcmVhdGUgdGhlIHR5cGVzIHJlZ2lzdHJ5Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICB2YWxpZGF0b3IpOwotCi0gICAgICAvLyBGaW5kIGFuIG9wZXJhdGlvbiBtYXRjaCAgICAgICAgCi0gICAgICBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgcmVxdWVzdERvYywKLSAgICAgICAgICBhY3Rpb24sCi0gICAgICAgICAgYmluZGluZywKLSAgICAgICAgICByZWdpc3RyeSk7Ci0gICAgICBpZiAobWF0Y2ggPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gR2V0IHRoZSBiaW5kaW5nIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgbWF0Y2gKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG1hdGNoLmdldE9wZXJhdGlvbigpOwotCi0gICAgICAvLyBJZiB0aGlzIGlzIG5vdCBycGMtbGl0ZXJhbCwgdGhlbiByZXR1cm4gbm90QXBwbGljYWJsZSByZXN1bHQKLSAgICAgIGlmICghV1NETFV0aWxzCi0gICAgICAgIC5pc1JwY0xpdGVyYWwobWF0Y2guZ2V0T3BlcmF0aW9uU3R5bGUoKSwgYmluZGluZ09wZXJhdGlvbikpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAvLyBsb29rIGZvciA8c29hcDpCb2R5PiBlbGVtZW50czoKLSAgICAgIE5vZGVMaXN0IHNvYXBCb2R5TGlzdCA9Ci0gICAgICAgIHJlc3BvbnNlRG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLAotICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9CT0RZKTsKLSAgICAgIGlmICgoc29hcEJvZHlMaXN0ID09IG51bGwpIHx8IChzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkpCi0gICAgICAgIC8vIFJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gYW55IHNvYXAgQm9keSBlbGVtZW50cwotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBjaGVjayB0aGF0IG5vIDxzb2FwOkJvZHk+IGNoaWxkIG9yIGdyYW5kY2hpbGQgZWxlbWVudHMgY29udGFpbnMgYSBzb2FwOmVuY29kaW5nU3R5bGUgYXR0cmlidXRlCi0gICAgICAvLyBGb3IgZWFjaCA8c29hcDpCb2R5PgotICAgICAgYm9vbGVhbiBncmFuZENoaWxkRm91bmQgPSBmYWxzZTsKLSAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgc29hcEJvZHlMaXN0LmdldExlbmd0aCgpOyBuKyspCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgbmV4dEJvZHlFbGVtID0gKEVsZW1lbnQpIHNvYXBCb2R5TGlzdC5pdGVtKG4pOwotICAgICAgICAvLyBSRU1PVkU6IFRoaXMgd2lsbCBnZXQgYWxsIG5vZGVzIChjaGlsZCwgZ3JhbmRjaGlsZHJlbiwgZXRjLikKLSAgICAgICAgLy9Ob2RlTGlzdCBjaGlsZExpc3QgPSBuZXh0Qm9keUVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKLSAgICAgICAgTm9kZUxpc3QgY2hpbGRMaXN0ID0gbmV4dEJvZHlFbGVtLmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgaWYgKGNoaWxkTGlzdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY2hlY2sgYWxsIGNoaWxkIGVsZW1lbnRzCi0gICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCBjaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IG0rKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRMaXN0Lml0ZW0obSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWxlbWVudCBuZXh0Q2hpbGRFbGVtID0gKEVsZW1lbnQpIGNoaWxkTGlzdC5pdGVtKG0pOwotICAgICAgICAgICAgICAvLyBjaGVjayBjaGlsZHJlbiBvZiB0aGlzIGNoaWxkCi0gICAgICAgICAgICAgIC8vIFJFTU9WRTogVGhpcyB3aWxsIGdldCBhbGwgbm9kZXMgKGNoaWxkLCBncmFuZGNoaWxkcmVuLCBldGMuKQotICAgICAgICAgICAgICBOb2RlTGlzdCBncmFuZENoaWxkTGlzdCA9IG5leHRDaGlsZEVsZW0uZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgICAgICBpZiAoZ3JhbmRDaGlsZExpc3QgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgZ3JhbmRDaGlsZExpc3QuZ2V0TGVuZ3RoKCk7IHArKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoZ3JhbmRDaGlsZExpc3QuaXRlbShwKS5nZXROb2RlVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgCWdyYW5kQ2hpbGRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbmV4dEdyYW5kQ2hpbGRFbGVtID0KLSAgICAgICAgICAgICAgICAgICAgICAoRWxlbWVudCkgZ3JhbmRDaGlsZExpc3QuaXRlbShwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRHcmFuZENoaWxkRWxlbQotICAgICAgICAgICAgICAgICAgICAgIC5nZXRBdHRyaWJ1dGVOb2RlTlMoCi0gICAgICAgICAgICAgICAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RpbmdTdHlsZSIpCi0gICAgICAgICAgICAgICAgICAgICAgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIC8vIEFzc2VydGlvbiBmYWlsZWQgKEFERCBoaWdobGlnaHQgdGhlIGNoaWxkIGhlcmUgPykKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIWdyYW5kQ2hpbGRGb3VuZCkKLSAgICAgIHsKLSAgICAgIAl0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxNjAwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDE2MDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4YzViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDE2MDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotCi0vKioKLSAqIEJQMTYwMAotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBlbnZlbG9wZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgZW52ZWxvcGUgY29uZm9ybXMgdG8gdGhlIHN0cnVjdHVyZSBzcGVjaWZpZWQgaW4gU09BUCAxLjEgU2VjdGlvbiA0LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDE2MDAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDE2MDAoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIG1lc3NhZ2UgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpOwotCi0gICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpcyBlbXB0eSBvciBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgewotICAgICAgCWlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgICAJCXRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIAl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGxvZyBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQuIik7Ci0gICAgICB9Ci0gICAgICAvLyBTT0FQIDEuMSBzcGVjaWZpY2F0aW9ucywgU2VjdGlvbiA0LgotICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9OT1RFLVNPQVAtMjAwMDA1MDgvI19Ub2M0NzgzODM0OTQKLQotICAgICAgLy8gVGhlIG5hbWVzcGFjZSBpZGVudGlmaWVyIGZvciB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZGVmaW5lZAotICAgICAgLy8gaW4gdGhpcyBzZWN0aW9uIGlzICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIuCi0KLSAgICAgIC8vICBvIFRoZSBFbnZlbG9wZSBpcyB0aGUgdG9wIGVsZW1lbnQgb2YgdGhlIFhNTCBkb2N1bWVudCByZXByZXNlbnRpbmcgdGhlIG1lc3NhZ2UuCi0KLSAgICAgIC8vIFJ1bGUgMS4gRW52ZWxvcGUKLSAgICAgIC8vICBvIFRoZSBlbGVtZW50IG5hbWUgaXMgIkVudmVsb3BlIi4KLSAgICAgIC8vICBvIFRoZSBlbGVtZW50IE1VU1QgYmUgcHJlc2VudCBpbiBhIFNPQVAgbWVzc2FnZQotICAgICAgLy8gIG8gVGhlIGVsZW1lbnQgTUFZIGNvbnRhaW4gbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgYXR0cmlidXRlcy4KLSAgICAgIC8vICAgIElmIHByZXNlbnQsIHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGVzIE1VU1QgYmUgbmFtZXNwYWNlLXF1YWxpZmllZC4gU2ltaWxhcmx5LAotICAgICAgLy8gICAgdGhlIGVsZW1lbnQgTUFZIGNvbnRhaW4gYWRkaXRpb25hbCBzdWIgZWxlbWVudHMuIElmIHByZXNlbnQgdGhlc2UgZWxlbWVudHMKLSAgICAgIC8vICAgIE1VU1QgYmUgbmFtZXNwYWNlLXF1YWxpZmllZCBhbmQgTVVTVCBmb2xsb3cgdGhlIFNPQVAgQm9keSBlbGVtZW50LgotCi0gICAgICAvLyBHZXR0aW5nIHRoZSB0b3AgZWxlbWVudAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCi0gICAgICAvLyBBc3N1bWluZyB0aGF0IHRoZSB0b3AgZWxlbWVudCBzaG91bGQgYmUgc29hcDpFbnZlbG9wZQotICAgICAgLy8gSWYgbm90LCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgaWYgKCFlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fRU5WRUxPUEUpCi0gICAgICAgIHx8ICFpc1NPQVBOYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgdG9wIGVsZW1lbnQgaXMgbm90IHNvYXA6RW52ZWxvcGUiKTsKLQotICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMKLSAgICAgIENvbGxlY3Rpb24gZW52ZWxvcGVOYW1lc3BhY2VzID0gY29sbGVjdE5hbWVzcGFjZXMoZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkpOwotICAgICAgZW52ZWxvcGVOYW1lc3BhY2VzLmFkZChXU0lDb25zdGFudHMuTlNfVVJJX1hNTE5TKTsKLQotICAgICAgLy8gR2V0dGluZyBhbiBhdHRyaWJ1dGUgdGhhdCBpcyBub3QgaW4gYW55IG9mIHRoZSBuYW1lc3BhY2VzCi0gICAgICBBdHRyIG5vdFZhbGlkQXR0ciA9IGdldE5vdFZhbGlkQXR0cigKLSAgICAgICAgZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCksCi0gICAgICAgIGVudmVsb3BlTmFtZXNwYWNlcyk7Ci0KLSAgICAgIC8vIElmIGZvdW5kIG9uZSwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgIGlmIChub3RWYWxpZEF0dHIgIT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBhdHRyaWJ1dGUgIgotICAgICAgICAgICsgbm90VmFsaWRBdHRyLmdldE5vZGVOYW1lKCkgKyAiIGlzIG5vdCBuYW1lc3BhY2UtcXVhbGlmaWVkIik7Ci0KLQotICAgICAgLy8gUnVsZSAyLiBIZWFkZXIgCi0gICAgICAvLyAgbyBUaGUgZWxlbWVudCBuYW1lIGlzICJIZWFkZXIiLgotICAgICAgLy8gIG8gVGhlIGVsZW1lbnQgTUFZIGJlIHByZXNlbnQgaW4gYSBTT0FQIG1lc3NhZ2UuIElmIHByZXNlbnQsIHRoZSBlbGVtZW50Ci0gICAgICAvLyAgICBNVVNUIGJlIHRoZSBmaXJzdCBpbW1lZGlhdGUgY2hpbGQgZWxlbWVudCBvZiBhIFNPQVAgRW52ZWxvcGUgZWxlbWVudC4KLSAgICAgIC8vICBvIFRoZSBlbGVtZW50IE1BWSBjb250YWluIGEgc2V0IG9mIGhlYWRlciBlbnRyaWVzIGVhY2ggYmVpbmcgYW4gaW1tZWRpYXRlCi0gICAgICAvLyAgICBjaGlsZCBlbGVtZW50IG9mIHRoZSBTT0FQIEhlYWRlciBlbGVtZW50LiBBbGwgaW1tZWRpYXRlIGNoaWxkIGVsZW1lbnRzCi0gICAgICAvLyAgICBvZiB0aGUgU09BUCBIZWFkZXIgZWxlbWVudCBNVVNUIGJlIG5hbWVzcGFjZS1xdWFsaWZpZWQuCi0KLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHN1YiBlbGVtZW50IG9mIHRoZSBlbnZlbG9wZQotICAgICAgZWxlbWVudCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0KLSAgICAgIC8vIElmIHRoZSBjaGlsZCBpcyBzb2FwOkhlYWRlcgotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbAotICAgICAgICAmJiBlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fSEVBREVSKQotICAgICAgICAmJiBpc1NPQVBOYW1lc3BhY2UoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICB7Ci0KLSAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIEhlYWRlciBlbnRyaWVzCi0gICAgICAgIEVsZW1lbnQgaGVhZGVyRW50cnkgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW1lbnQpOwotICAgICAgICB3aGlsZSAoaGVhZGVyRW50cnkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBuYW1lc3BhY2VzIGZvciB0aGUgY3VycmVudCBlbnRyeQotICAgICAgICAgIENvbGxlY3Rpb24gaGVhZGVyRW50cnlOYW1lc3BhY2VzID0gY29sbGVjdE5hbWVzcGFjZXMoCi0gICAgICAgICAgICBoZWFkZXJFbnRyeS5nZXRBdHRyaWJ1dGVzKCkpOwotCi0gICAgICAgICAgLy8gSWYgdGhlIGVudHJ5IGlzIG5vdCBpbiB0aGUgbmFtZXNwYWNlcywgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIWVudmVsb3BlTmFtZXNwYWNlcy5jb250YWlucyhoZWFkZXJFbnRyeS5nZXROYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgICAgICYmICFoZWFkZXJFbnRyeU5hbWVzcGFjZXMuY29udGFpbnMoaGVhZGVyRW50cnkuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBoZWFkZXIgZW50cnkgIgotICAgICAgICAgICAgICArIGhlYWRlckVudHJ5LmdldE5vZGVOYW1lKCkgKyAiIGlzIG5vdCBuYW1lc3BhY2UtcXVhbGlmaWVkIik7Ci0KLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBuZXh0IEhlYWRlciBlbnRyeQotICAgICAgICAgIGhlYWRlckVudHJ5ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoaGVhZGVyRW50cnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBzdWIgZWxlbWVudCBvZiB0aGUgZW52ZWxvcGUKLSAgICAgICAgZWxlbWVudCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKGVsZW1lbnQpOwotICAgICAgfQotCi0KLSAgICAgIC8vIFJ1bGUgMy4gQm9keQotICAgICAgLy8gIG8gVGhlIGVsZW1lbnQgbmFtZSBpcyAiQm9keSIuCi0gICAgICAvLyAgbyBUaGUgZWxlbWVudCBNVVNUIGJlIHByZXNlbnQgaW4gYSBTT0FQIG1lc3NhZ2UgYW5kIE1VU1QgYmUgYW4gaW1tZWRpYXRlCi0gICAgICAvLyAgICBjaGlsZCBlbGVtZW50IG9mIGEgU09BUCBFbnZlbG9wZSBlbGVtZW50LiBJdCBNVVNUIGRpcmVjdGx5IGZvbGxvdyB0aGUKLSAgICAgIC8vICAgIFNPQVAgSGVhZGVyIGVsZW1lbnQgaWYgcHJlc2VudC4gT3RoZXJ3aXNlIGl0IE1VU1QgYmUgdGhlIGZpcnN0IGltbWVkaWF0ZQotICAgICAgLy8gICAgY2hpbGQgZWxlbWVudCBvZiB0aGUgU09BUCBFbnZlbG9wZSBlbGVtZW50LgotICAgICAgLy8gIG8gVGhlIGVsZW1lbnQgTUFZIGNvbnRhaW4gYSBzZXQgb2YgYm9keSBlbnRyaWVzIGVhY2ggYmVpbmcgYW4gaW1tZWRpYXRlCi0gICAgICAvLyAgICBjaGlsZCBlbGVtZW50IG9mIHRoZSBTT0FQIEJvZHkgZWxlbWVudC4gSW1tZWRpYXRlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZQotICAgICAgLy8gICAgU09BUCBCb2R5IGVsZW1lbnQgTUFZIGJlIG5hbWVzcGFjZS1xdWFsaWZpZWQuIFNPQVAgZGVmaW5lcyB0aGUgU09BUCBGYXVsdAotICAgICAgLy8gICAgZWxlbWVudCwgd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZSBlcnJvciBtZXNzYWdlcy4KLQotICAgICAgLy8gaWYgdGhlIFNPQVAgQm9keSBlbGVtZW50IGlzIG5vdCBwcmVzZW50ZWQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICBpZiAoZWxlbWVudCA9PSBudWxsCi0gICAgICAgIHx8ICFlbGVtZW50LmdldExvY2FsTmFtZSgpLmVxdWFscyhYTUxVdGlscy5TT0FQX0VMRU1fQk9EWSkKLSAgICAgICAgfHwgIWlzU09BUE5hbWVzcGFjZShlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBzb2FwOkJvZHkgZWxlbWVudCBpcyBub3QgcHJlc2VudGVkICIKLSAgICAgICAgICArICJvciBmb2xsb3dzIGFuIGFkZGl0aW9uYWwgc3ViIGVsZW1lbnQgb2Ygc29hcDpFbnZlbG9wZSIpOwotCi0gICAgICAvLyBQcm9jZXNzaW5nIGFsbCBvdGhlciBzdWIgZWxlbWVudHMgb2YgdGhlIGVudmVsb3BlCi0gICAgICBlbGVtZW50ID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoZWxlbWVudCk7Ci0gICAgICB3aGlsZSAoZWxlbWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBDaGVja2luZyBmb3IgdGhlIFNPQVAgSGVhZGVyIGVsZW1lbnQKLSAgICAgICAgaWYgKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFhNTFV0aWxzLlNPQVBfRUxFTV9IRUFERVIpCi0gICAgICAgICAgJiYgaXNTT0FQTmFtZXNwYWNlKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJUaGUgc29hcDpIZWFkZXIgZWxlbWVudCBjYW5ub3QgZm9sbG93IHRoZSBzb2FwOkJvZHkgZWxlbWVudCIpOwotCi0gICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBuYW1lc3BhY2VzIGZvciB0aGUgY3VycmVudCBlbGVtZW50Ci0gICAgICAgIENvbGxlY3Rpb24gZWxlbWVudE5hbWVzcGFjZXMgPSBjb2xsZWN0TmFtZXNwYWNlcygKLSAgICAgICAgICBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbm90IGluIHRoZSBuYW1lc3BhY2VzLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBpZiAoIWVudmVsb3BlTmFtZXNwYWNlcy5jb250YWlucyhlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICYmICFlbGVtZW50TmFtZXNwYWNlcy5jb250YWlucyhlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIHN1YiBlbnZlbG9wZSBlbGVtZW50ICIKLSAgICAgICAgICAgICsgZWxlbWVudC5nZXROb2RlTmFtZSgpICsgIiBpcyBub3QgbmFtZXNwYWNlLXF1YWxpZmllZCIpOwotCi0gICAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgc3ViIGVsZW1lbnQgb2YgdGhlIGVudmVsb3BlCi0gICAgICAgIGVsZW1lbnQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0JewotCSAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQl9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYWxsIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGZyb20gYXR0cmlidXRlcyBjb2xsZWN0aW9uCi0gICAqIEBwYXJhbSBhdHRycyBhbiBhdHRyaWJ1dGVzIGNvbGxlY3Rpb24KLSAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgbmFtZXNwYWNlcwotICAgKi8KLSAgcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbGxlY3ROYW1lc3BhY2VzKE5hbWVkTm9kZU1hcCBhdHRycykKLSAgewotICAgIENvbGxlY3Rpb24gbnMgPSBuZXcgSGFzaFNldCgpOwotICAgIGlmIChhdHRycyAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBBdHRyIGF0dHIgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLSAgICAgICAgaWYgKGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCkgIT0gbnVsbAotICAgICAgICAgICYmIGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfWE1MTlMpKQotICAgICAgICAgIG5zLmFkZChhdHRyLmdldFZhbHVlKCkpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXRyaWV2ZXMgYW4gYXR0cmlidXRlIHRoYXQgaXMgbm90IGluIG5hbWVzcGFjZXMKLSAgICogQHBhcmFtIGF0dHJzIGFuIGF0dHJpYnV0ZXMgY29sbGVjdGlvbgotICAgKiBAcGFyYW0gbnMgYSBuYW1lc3BhY2VzIGNvbGxlY3Rpb24KLSAgICogQHJldHVybiBhbiBhdHRyaWJ0dWUgdGhhdCBpcyBub3QgaW4gYW55IG9mIHRoZSBuYW1lc3BhY2VzIHNwZWNpZmllZAotICAgKi8KLSAgcHJpdmF0ZSBBdHRyIGdldE5vdFZhbGlkQXR0cihOYW1lZE5vZGVNYXAgYXR0cnMsIENvbGxlY3Rpb24gbnMpCi0gIHsKLSAgICBBdHRyIHJldCA9IG51bGw7Ci0gICAgaWYgKGF0dHJzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotICAgICAgICBpZiAoYXR0ci5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsCi0gICAgICAgICAgfHwgIW5zLmNvbnRhaW5zKGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0ID0gYXR0cjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgLyoqCi0gICAqIFF1YWxpZmllcyB3aGV0aGVyIGEgbmFtZXNwYWNlIGlzIHRoZSBTT0FQIG5hbWVzcGFjZQotICAgKiAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iCi0gICAqIEBwYXJhbSBucyBhIG5hbWVzcGFjZSB0byBiZSBxdWFsaWZpZWQKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lc3BhY2UgaXMgcXVhbGlmaWVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc1NPQVBOYW1lc3BhY2UoU3RyaW5nIG5zKQotICB7Ci0gICAgaWYgKG5zID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gbnMuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDE2MDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTYwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU3YzQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTYwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0KLS8qKgotICogQlAxNjAxLgotICovCi1wdWJsaWMgY2xhc3MgQlAxNjAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxNjAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIE9uZS13YXkgcmVzcG9uc2VzIHdpbGwgbm90IGNvbnRhaW4gYSBTT0FQIG1lc3NhZ2UKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSBTT0FQIG1lc3NhZ2UKLSAgICAgICAgLy9Eb2N1bWVudCBkb2MgPSBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgWE1MVXRpbHMucGFyc2VYTUwoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgU0FYRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICBlLmdldFRhcmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTcwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxNzAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Yjk0NTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlAxNzAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuRE9NMldyaXRlcjsKLQotCi0vKioKLSAqIEJQMTcwMS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTcwMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTcwMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gVEVNUDogVXNlIGxvY2FsIGNvcHkgb2Ygc2NoZW1hIGZvciBub3cKLSAgICAgICAgLy8gRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMucGFyc2VYTUwoZW50cnlDb250ZXh0LmdldExvZ0VudHJ5KCkuZ2V0TWVzc2FnZSgpLCBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVApOwotICAgICAgICAvLyBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0TG9nRW50cnkoKS5nZXRNZXNzYWdlKCksICJzY2hlbWFzL3NvYXBFbnZlbG9wZS54c2QiKTsKLQotICAgICAgICAvLyBHZXQgYSBub24tdmFsaWRhdGVkIGJ1dCAod2VsbC1mb3JtZWQpIERPTSB0cmVlIG9mIHRoZSBtZXNzYWdlIGNvbnRlbnQKLSAgICAgICAgRG9jdW1lbnQgZG9jID0KLSAgICAgICAgICBYTUxVdGlscy5wYXJzZVhNTChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgYW55IHhzaTp0eXBlcyBhdHRyaWJ1dGVzIGZyb20gdGhlIG1lc3NhZ2UgKFNPQVAgSGVhZGVyLCBCb2R5IGFuZCBFbnZlbG9wZSBpdHNlbGYpCi0KLSAgICAgICAgTm9kZUxpc3QgZWxlbWVudExpc3QgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKLSAgICAgICAgaWYgKGVsZW1lbnRMaXN0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRMaXN0LmdldExlbmd0aCgpOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGVsZW1lbnRMaXN0Lml0ZW0oaSk7Ci0gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5TKFdTSUNvbnN0YW50cy5OU19VUklfWFNJLCAidHlwZSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdyaXRlIG91dCB0aGUgKHBvdGVudGlhbGx5KSBtb2RpZmllZCB0cmVlIHRvIFN0cmluZwotICAgICAgICBTdHJpbmcgZmlsdGVyZWRNZXNzYWdlID0gRE9NMldyaXRlci5ub2RlVG9TdHJpbmcoZG9jKTsKLQotICAgICAgICAvLyBQYXJzZSB0aGUgcmVzdWx0IHdpdGggdmFsaWRhdGlvbiAib24iCi0gICAgICAgIERvY3VtZW50IHZhbGlkYXRpb25Eb2MgPQotICAgICAgICAgIFhNTFV0aWxzLnBhcnNlWE1MKAotICAgICAgICAgICAgZmlsdGVyZWRNZXNzYWdlLAotICAgICAgICAgICAgVGVzdFV0aWxzLmdldFNPQVBTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgIFV0aWxzLmdldEV4Y2VwdGlvbkRldGFpbHMoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSksCi0gICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoVXRpbHMuZ2V0RXhjZXB0aW9uRGV0YWlscyhlKSwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDE3NTUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTc1NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjgzZWUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQMTc1NS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEJQMTc1NQotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBub24tZmF1bHQgZW52ZWxvcGUgY29udGFpbmluZyBhIHNvYXA6Ym9keSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50LCBhbmQgdGhhdCBpcyByZWZlcnJlZCBieSBhIGJpbmRpbmcgc3R5bGUgUlBDLWxpdGVyYWw8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RWFjaCBwYXJ0IGFjY2Vzc29yIGVsZW1lbnQgaW4gdGhlIGVudmVsb3BlIGhhcyBhIGxvY2FsIG5hbWUgb2YgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG5hbWUgYXR0cmlidXRlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6cGFydCBlbGVtZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDE3NTUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIHsKLQotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxNzU1KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICh2YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBHZXR0aW5nIGEgbWVzc2FnZSBkb2N1bWVudAotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIEVsZW1lbnQgc29hcE9wZXJhdGlvbiA9IG51bGw7Ci0gICAgICAvLyBJZiB0aGVyZSBpcyBhIEZhdWx0IGVudHJ5IG9yIG5vIGJvZHkgZW50cmllcywKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICh2YWxpZGF0b3IuaXNGYXVsdChkb2MpCi0gICAgICAgIHx8IChzb2FwT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldFNvYXBCb2R5Q2hpbGQoZG9jKSkgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLQotICAgICAgLy8gQ3JlYXRpbmcgYSBxdWFsaWZpZWQgbmFtZSBvZiBwb3RlbnRpYWwgU09BUCBvcGVyYXRpb24KLSAgICAgIFFOYW1lIG9wZXJhdGlvblFOYW1lID0gbmV3IFFOYW1lKAotICAgICAgICBzb2FwT3BlcmF0aW9uLmdldE5hbWVzcGFjZVVSSSgpLCBzb2FwT3BlcmF0aW9uLmdldExvY2FsTmFtZSgpKTsKLQotICAgICAgLy8gUmV0cmlldmluZyBhbGwgdGhlIFJQQyBiaW5kaW5nIG9wZXJhdGlvbnMgZnJvbSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmdPcGVyYXRpb25bXSBycGNCaW5kaW5nT3BlcmF0aW9ucyA9Ci0gICAgICAgIHZhbGlkYXRvci5nZXRNYXRjaGluZ0JpbmRpbmdPcHMoCi0gICAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQywKLSAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXRCaW5kaW5ncygpKTsKLQotICAgICAgLy8gUmV0cmlldmluZyBiaW5kaW5nIG9wZXJhdGlvbiBieSBnaXZlbiBvcGVyYXRpb24gbmFtZQotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwKLSAgICAgICAgb3BlcmF0aW9uUU5hbWUsCi0gICAgICAgIHJwY0JpbmRpbmdPcGVyYXRpb25zKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2hlZCBvcGVyYXRpb24sIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEZpbmRpbmcgb3BlcmF0aW9uIG1lc3NhZ2UgcGFydHMgYW5kIGV4dGVuc2liaWxpdHkgZWxlbXMKLSAgICAgIC8vIGluIHRoZSBiaW5kaW5nIGRlcGVuZGluZyBvbiBtZXNzYWdlIHR5cGUKLSAgICAgIExpc3Qgb3BlcmF0aW9uTWVzc2FnZVBhcnRzID0gbnVsbDsKLSAgICAgIExpc3QgZXh0RWxlbXMgPSBudWxsOwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKSkKLSAgICAgIHsKLSAgICAgICAgb3BlcmF0aW9uTWVzc2FnZVBhcnRzID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKQotICAgICAgICAgIC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKS5nZXRPcmRlcmVkUGFydHMobnVsbCk7Ci0gICAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICAgICAgZXh0RWxlbXMgPQotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3BlcmF0aW9uTWVzc2FnZVBhcnRzID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKQotICAgICAgICAgIC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkuZ2V0T3JkZXJlZFBhcnRzKG51bGwpOwotICAgICAgICBpZiAoYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgICBleHRFbGVtcyA9Ci0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgbm90IGxpdGVyYWwsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghdmFsaWRhdG9yLmlzTGl0ZXJhbChleHRFbGVtcykpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLQotICAgICAgLyogQmFzaWMgUHJvZmlsZSBWZXJzaW9uIDEuMSAoaHR0cDovL3d3dy53cy1pLm9yZy9Qcm9maWxlcy9CYXNpYy8yMDAzLTEyL0Jhc2ljUHJvZmlsZS0xLjEuaHRtKQotICAgICAgICogc2F5cyB0aGF0IHRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNvYXA6Ym9keSBvZiBhbiBFTlZFTE9QRSBNVVNUIGJlCi0gICAgICAgKiB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSB3c2RsOnBhcnRzIGluIHRoZSB3c2RsOm1lc3NhZ2UgdGhhdCBkZXNjcmliZXMgaXQuCi0gICAgICAgKiBIb3dldmVyLCB3ZSBzaG91bGQga2VlcCBpbiBtaW5kIHRoZXJlIGlzIHRoZSAicGFydHMiIGF0dHJpYnV0ZSBvZiBzb2FwYmluZDpib2R5Ci0gICAgICAgKiB0aGF0IGluZGljYXRlcyB3aGljaCBwYXJ0cyBhcHBlYXIgd2l0aGluIHRoZSBTT0FQIEJvZHkuIAotICAgICAgICovCi0KLSAgICAgIC8vIEdldHRpbmcgdGhlIG9yZGVyZWQgbGlzdCBvZiB3c2RsOnBhcnQgbmFtZXMKLSAgICAgIExpc3Qgb3JkZXJlZFBhcnROYW1lcyA9Ci0gICAgICAgIHZhbGlkYXRvci5vcmRlclBhcnROYW1lcyhvcGVyYXRpb25NZXNzYWdlUGFydHMsIGV4dEVsZW1zKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSBvcmRlcmVkUGFydE5hbWVzLml0ZXJhdG9yKCk7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBmaXJzdCBhY2Nlc3NvcgotICAgICAgRWxlbWVudCBhY2Nlc3NvciA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoc29hcE9wZXJhdGlvbik7Ci0gICAgICB3aGlsZSAoYWNjZXNzb3IgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gdGhlIGNvcnJlc3BvbmRpbmcgd3NkbDpwYXJ0IGVsZW1lbnQKLSAgICAgICAgLy8gZm9yIGFuIGFjY2Vzc29yLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBpZiAoIWkuaGFzTmV4dCgpKQotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICAgIlRoZSBwYXJ0IGFjY2Vzc29yIGVsZW1lbnQgJyIgKyBhY2Nlc3Nvci5nZXRMb2NhbE5hbWUoKQotICAgICAgICAgICAgKyAiJyBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6cGFydCBlbGVtZW50LiIpOwotCi0gICAgICAgIC8vIElmIGxvY2FsIG5hbWUgb2YgYWNjZXNzb3IgZG9lcyBub3QgZXF1YWwgdG8gdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgd3NkbDpwYXJ0IGVsZW1lbnQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotICAgICAgICBpZiAoIWFjY2Vzc29yLmdldExvY2FsTmFtZSgpLmVxdWFscyhwYXJ0TmFtZSkpCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAiVGhlIGFjY2Vzc29yIGxvY2FsIG5hbWUgaXMgIiArIGFjY2Vzc29yLmdldExvY2FsTmFtZSgpCi0gICAgICAgICAgICArICIsIHRoZSBjb3JyZXNwb25kaW5nIHBhcnQgZWxlbWVudCBuYW1lIGlzICIgKyBwYXJ0TmFtZSk7Ci0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBhY2Nlc3NvcgotICAgICAgICBhY2Nlc3NvciA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKGFjY2Vzc29yKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlA0MTAwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwOWMwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLQotLyoqCi0gKiBCUDQxMDAKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBlbnZlbG9wZSBjb250YWluaW5nIGEgaGVhZGVyIGJsb2NrIHRoYXQgaXMgZWl0aGVyIG1hbmRhdG9yeSBvciBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSB3c2RsOmJpbmRpbmcuPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkFuIGVudmVsb3BlIGNvbnRhaW5zIGEgaGVhZGVyIGJsb2NrIHRoYXQgaXMgZWl0aGVyIG1hbmRhdG9yeSBvciBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSB3c2RsOmJpbmRpbmcuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQNDEwMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDQxMDAoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gUGFyc2luZyB0aGUgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyBoZWFkZXIgZWxlbWVudHMgZnJvbSBlbnZlbG9wZQotICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgTm9kZUxpc3QgaGVhZGVyTGlzdCA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCBYTUxVdGlscy5TT0FQX0VMRU1fSEVBREVSKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gaGVhZGVyLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoaGVhZGVyTGlzdCA9PSBudWxsIHx8IGhlYWRlckxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyB0aGUgaGVhZGVyIGVsZW1lbnQKLSAgICAgIE5vZGUgaGVhZGVyID0gaGVhZGVyTGlzdC5pdGVtKDApOwotCi0gICAgICAvLyBHZXR0aW5nIHRoZSBpbW1lZGlhdGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGhlYWRlcgotICAgICAgTm9kZUxpc3QgZWxlbXMgPSBoZWFkZXIuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY2hpbGQgZWxlbWVudHMgb2YgdGhlIGhlYWRlcgotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGVsZW1zID09IG51bGwgfHwgZWxlbXMuZ2V0TGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gV2Fsa2luZyB0aHJvdWdoIGNoaWxkIGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1zLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0KLSAgICAgICAgaWYgKGVsZW1zLml0ZW0oaSkuaGFzQXR0cmlidXRlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbXVzdFVuZGVyc3RhbmQgYXR0cmlidXRlCi0gICAgICAgICAgTm9kZSBtdU5vZGUgPSBlbGVtcy5pdGVtKGkpLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oCi0gICAgICAgICAgICByb290LmdldFByZWZpeCgpICsgIjoiICsgWE1MVXRpbHMuU09BUF9BVFRSX01VU1RfVU5ERVJTVEFORCk7Ci0gICAgICAgICAgLy8gSWYgYSBoZWFkZXIgYmxvY2sgaXMgbWFuZGF0b3J5LCB0aGVuIHRoZSBhc3NlcnRpb24gcGFzc2VkCi0gICAgICAgICAgaWYgKG11Tm9kZSAhPSBudWxsICYmIG11Tm9kZS5nZXROb2RlVmFsdWUoKS5lcXVhbHMoIjEiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldHRpbmcgaGVhZGVyIGJsb2NrIG5hbWUKLSAgICAgICAgU3RyaW5nIGJsb2NrTmFtZSA9IGVsZW1zLml0ZW0oaSkuZ2V0TG9jYWxOYW1lKCk7Ci0gICAgICAgIC8vIElmIHRoZSBuYW1lIGlzIG5vdCBwcmVzZW50ZWQgKG9jY3VycyB3aGVuIGVsZW1lbnQgaXMgZW1wdHkgc3RyaW5nKQotICAgICAgICAvLyB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgZWxlbWVudAotICAgICAgICBpZiAoYmxvY2tOYW1lID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gYmxvY2tOYW1lRXhpc3RzID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gR2V0dGluZyBXU0RMIGJpbmRpbmdzCi0gICAgICAgIEJpbmRpbmdbXSBiaW5kaW5ncyA9IHZhbGlkYXRvci5nZXRXU0RMRG9jdW1lbnQoKS5nZXRCaW5kaW5ncygpOwotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJpbmRpbmdzLmxlbmd0aDsgaisrKSAKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldHRpbmcgd3NkbDpvcGVyYXRpb25zCi0gICAgICAgICAgTGlzdCBvcGVyYXRpb25zID0gYmluZGluZ3Nbal0uZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLSAgICAgICAgICBJdGVyYXRvciBrID0gb3BlcmF0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChrLmhhc05leHQoKSAmJiAhYmxvY2tOYW1lRXhpc3RzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGsubmV4dCgpOwotCi0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcmVxdWVzdCBtZXNzYWdlLAotICAgICAgICAgICAgLy8gdGhlbiBnZXR0aW5nIHdzZGw6aW5wdXQgZm9yIGFuIG9wZXJhdGlvbiAKLSAgICAgICAgICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEJpbmRpbmdJbnB1dCBvcElucHV0ID0gb3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICAgICAgICBpZiAob3BJbnB1dCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd3NkbDppbnB1dCBpcyBwcmVzZW50ZWQgdGhlbiBjaGVja2luZwotICAgICAgICAgICAgICAgIC8vIHdoZXRoZXIgdGhlIGJsb2NrIG5hbWUgaXMgZGVzY3JpYmVkIHRoZXJlIG9yIG5vdAotICAgICAgICAgICAgICAgIGJsb2NrTmFtZUV4aXN0cyA9IGJsb2NrTmFtZUV4aXN0cygKLSAgICAgICAgICAgICAgICAgIG9wSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCksIGJsb2NrTmFtZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYSByZXNwb25zZSBtZXNzYWdlLAotICAgICAgICAgICAgLy8gdGhlbiBnZXR0aW5nIHdzZGw6b3V0cHV0IGZvciBhbiBvcGVyYXRpb24KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgQmluZGluZ091dHB1dCBvcE91dHB1dCA9IG9wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0gICAgICAgICAgICAgIGlmIChvcE91dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd3NkbDpvdXRwdXQgaXMgcHJlc2VudGVkIHRoZW4gY2hlY2tpbmcKLSAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRoZSBibG9jayBuYW1lIGlzIGRlc2NyaWJlZCB0aGVyZSBvciBub3QKLSAgICAgICAgICAgICAgICBibG9ja05hbWVFeGlzdHMgPSBibG9ja05hbWVFeGlzdHMoCi0gICAgICAgICAgICAgICAgICBvcE91dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgYmxvY2tOYW1lKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGEgaGVhZGVyIGJsb2NrIGlzIG5vdCBkZXNjcmliZWQgaW4gdGhlIGFwcHJvcHJpYXRlIHdzZGw6YmluZGluZwotICAgICAgICAvLyB0aGVuIHRoZSBhc3NlcnRpb24gcGFzc2VkCi0gICAgICAgIGlmICghYmxvY2tOYW1lRXhpc3RzKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBObyBvbmUgaGVhZGVyIGJsb2NrIGlzIGVpdGhlciBtYW5kYXRvcnkgb3IgaXMgbm90IGRlc2NyaWJlZCBpbiB0aGUKLSAgICAgIC8vIGFwcHJvcHJpYXRlIHdzZGw6YmluZGluZywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbiBhcGUpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICB0ZXN0QXNzZXJ0aW9uLmdldERldGFpbERlc2NyaXB0aW9uKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRoZSBleGlzdGVuc2Ugb2YgYmxvY2tOYW1lIGluIHdzZGxzb2FwOmhlYWRlciwgaWYgaXQgaXMgZm91bmQgaW4KLSAgICogYSBsaXN0IG9mIEV4dGVuc2liaWxpdHlFbGVtZW50IG9iamVjdHMKLSAgICogCi0gICAqIEBwYXJhbSBlbGVtcyBBIGxpc3Qgb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqZWN0cwotICAgKiBAcGFyYW0gYmxvY2tOYW1lIFRoZSBuYW1lIHRoYXQgd2lsbCBiZSBjaGVja2VkIGZvciBleGlzdGVuY2UKLSAgICogQHJldHVybiB0cnVlIGlmIGJsb2NrTmFtZSBpcyBkZXNjcmliZWQgaW4gdGhlIHdzZGxzb2FwOmhlYWRlciBleHRlbnNpYmlsaXR5IGVsZW1lbnQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBibG9ja05hbWVFeGlzdHMoTGlzdCBlbGVtcywgU3RyaW5nIGJsb2NrTmFtZSkKLSAgewotICAgIGlmIChlbGVtcyA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBJdGVyYXRvciBpID0gZWxlbXMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcgZWxlbU5hbWUgPSBlbGVtLmdldEVsZW1lbnRUeXBlKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICBpZiAoZWxlbU5hbWUuZXF1YWxzKCJoZWFkZXIiKSkKLSAgICAgIHsKLSAgICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpIGVsZW07Ci0gICAgICAgIGlmIChzb2FwSGVhZGVyLmdldFBhcnQoKS5lcXVhbHMoYmxvY2tOYW1lKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlA0MTAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkOTNmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQlA0MTAxCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgZW52ZWxvcGUgY29udGFpbmluZyBhIHNvYXA6YWN0b3IgYXR0cmlidXRlIHdpdGggYSB2YWx1ZSBvdGhlciB0aGFuIHRoZSBzcGVjaWFsIHVyaSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0Ii48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QSBoZWFkZXIgZWxlbWVudCBpbiB0aGUgZW52ZWxvcGUgY29udGFpbnMgYSBzb2FwOmFjdG9yIGF0dHJpYnV0ZSB3aXRoIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGUgc3BlY2lhbCB1cmkgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQNDEwMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDQxMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5IHsKLQotICAgICAgLy8gUGFyc2luZyB0aGUgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyBoZWFkZXIgZWxlbWVudHMgZnJvbSBlbnZlbG9wZQotICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgTm9kZUxpc3QgaGVhZGVyTGlzdCA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKLSAgICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCBYTUxVdGlscy5TT0FQX0VMRU1fSEVBREVSKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gaGVhZGVyLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoaGVhZGVyTGlzdCA9PSBudWxsIHx8IGhlYWRlckxpc3QuZ2V0TGVuZ3RoKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyB0aGUgaGVhZGVyIGVsZW1lbnQKLSAgICAgIE5vZGUgaGVhZGVyID0gaGVhZGVyTGlzdC5pdGVtKDApOwotCi0gICAgICAvLyBHZXR0aW5nIHRoZSBpbW1lZGlhdGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGhlYWRlcgotICAgICAgTm9kZUxpc3QgZWxlbXMgPSBoZWFkZXIuZ2V0Q2hpbGROb2RlcygpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBjaGlsZCBlbGVtZW50cyBvZiB0aGUgaGVhZGVyCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoZWxlbXMgPT0gbnVsbCB8fCBlbGVtcy5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBXYWxraW5nIHRocm91Z2ggY2hpbGQgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbXMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0dGluZyBub2RlIGF0dHJpYnV0ZXMKLSAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbXMuaXRlbShpKS5nZXRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIG5vZGUgZG9lcyBub3QgaGF2ZSBhdHRyaWJ1dGVzIHRoZW4gY29udGludWUKLSAgICAgICAgaWYgKGF0dHJzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEdldHRpbmcgYWN0b3IgYXR0cmlidXRlCi0gICAgICAgIE5vZGUgYWN0b3IgPSBhdHRycy5nZXROYW1lZEl0ZW0ocm9vdC5nZXRQcmVmaXgoKQotICAgICAgICAgICsgIjoiICsgWE1MVXRpbHMuU09BUF9BVFRSX0FDVE9SKTsKLQotICAgICAgICAvLyBJZiB0aGUgYWN0b3IgYXR0cmlidXRlIGlzIHByZXNlbnRlZCBhbmQgZG9lcyBub3QgZXF1YWwKLSAgICAgICAgLy8gdG8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvYWN0b3IvbmV4dCIsCi0gICAgICAgIC8vIHRoZW4gdGhlIGFzc2VydGlvbiBwYXNzZWQKLSAgICAgICAgaWYgKGFjdG9yICE9IG51bGwKLSAgICAgICAgICAmJiAhYWN0b3IuZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfU09BUF9ORVhUX0FDVE9SKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gTm8gb25lIGFjdG9yIGF0dHJpYnV0ZSBoYXMgYSB2YWx1ZSBvdGhlciB0aGFuCi0gICAgICAvLyAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9hY3Rvci9uZXh0IiwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUgCi0gICAgICByZXN1bHQgID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbiBhcGUpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICB0ZXN0QXNzZXJ0aW9uLmdldERldGFpbERlc2NyaXB0aW9uKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9CUDQxMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQNDEwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmUxNzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQNDEwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEJQNDEwMgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGVudmVsb3BlIGNvbnRhaW5pbmcgYSBmYXVsdCB3aXRoIGEgbm9uLWVtcHR5IGRldGFpbCBlbGVtZW50LjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIEZhdWx0IGVsZW1lbnQgaW4gYW4gZW52ZWxvcGUgY29udGFpbnMgYSBub24tZW1wdHkgZGV0YWlsIGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQNDEwMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDQxMDIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5IHsKLQotICAgICAgLy8gUGFyc2luZyB0aGUgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyBGYXVsdCBlbGVtZW50cyBmcm9tIGVudmVsb3BlCi0gICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICBOb2RlTGlzdCBmYXVsdExpc3QgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwgWE1MVXRpbHMuU09BUF9FTEVNX0ZBVUxUKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gRmF1bHQgZWxlbWVudCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGZhdWx0TGlzdCA9PSBudWxsIHx8IGZhdWx0TGlzdC5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBGYXVsdCBlbGVtZW50IG11c3Qgbm90IGFwcGVhciBtb3JlIHRoYW4gb25jZQotICAgICAgLy8gd2l0aGluIGEgQm9keSBlbGVtZW50LCBzbyBnZXR0aW5nIHRoZSBmaXJzdCBvbmUKLSAgICAgIEVsZW1lbnQgZmF1bHQgPSAoRWxlbWVudCkgZmF1bHRMaXN0Lml0ZW0oMCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgRnVhbHQncyBkZXRhaWwgZWxlbWVudHMKLSAgICAgIE5vZGVMaXN0IGRldGFpbHMgPSBmYXVsdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgKLSAgICAgICAgWE1MVXRpbHMuU09BUF9FTEVNX0ZBVUxUX0RFVEFJTCk7Ci0gICAgICAvLyBJZiB0aGVyZSBpcyBhIG5vbi1lbXB0eSBkZXRhaWwgZWxlbWVudCwgdGhlbiB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgICAgaWYgKGRldGFpbHMgIT0gbnVsbAotICAgICAgICAmJiBkZXRhaWxzLmdldExlbmd0aCgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgTm9kZUxpc3QgbGlzdCA9IGRldGFpbHMuaXRlbSgwKS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIC8vIHNlYXJjaCBmaXJzdCBlbGVtZW50IG5vZGUgCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoKGxpc3QuaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSAKLSAgICAgICAgICAmJiAobGlzdC5pdGVtKGkpLmdldExvY2FsTmFtZSgpICE9IG51bGwpICkgCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gVGhlcmUgaXMgbm8gZGV0YWlsIGVsZW1lbnQgaW4gRmF1bHQsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGFwZSkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0JQNDEwOS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlA0MTA5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjhkMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvQlA0MTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblBhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEJQNDEwOQotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBlbnZlbG9wZSBjb250YWluaW5nIGEgc29hcDpCb2R5IGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGVzPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkFuIGVudmVsb3BlIGNvbnRhaW5zIGEgYSBzb2FwOkJvZHkgZWxlbWVudCB3aXRoIGF0dHJpYnV0ZXMuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQNDEwOSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDQxMDkoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5IHsKLQotICAgICAgLy8gUGFyc2luZyB0aGUgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyB0aGUgc29hcDpCb2R5IGVsZW1lbnRzIGZyb20gZW52ZWxvcGUKLSAgICAgIE5vZGVMaXN0IGJvZHlMaXN0ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCi0gICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwgWE1MVXRpbHMuU09BUF9FTEVNX0JPRFkpOwotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBCb2R5IGVsZW1lbnQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChib2R5TGlzdCA9PSBudWxsIHx8IGJvZHlMaXN0LmdldExlbmd0aCgpID09IDApCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHNvYXA6Qm9keSBlbGVtZW50Ci0gICAgICBFbGVtZW50IGJvZHkgPSAoRWxlbWVudCkgYm9keUxpc3QuaXRlbSgwKTsKLQotICAgICAgLy8gSWYgdGhlIEJvZHkgZWxlbWVudCBoYXMgYXR0cmlidXRlcyAoZXhjbHVkaW5nIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMpLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBwYXNzZWQKLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IGJvZHkuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaWYgKGF0dHJzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICgoQXR0cikgYXR0cnMuaXRlbShpKSkuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmICghYXR0ck5hbWUuZXF1YWxzKCJ4bWxucyIpICYmICFhdHRyTmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbiBhcGUpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICB0ZXN0QXNzZXJ0aW9uLmdldERldGFpbERlc2NyaXB0aW9uKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9FbnZlbG9wZVZhbGlkYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0VudmVsb3BlVmFsaWRhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTIwMTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL0VudmVsb3BlVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudmVsb3BlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVudmVsb3BlVmFsaWRhdG9ySW1wbAotICBleHRlbmRzIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gIGltcGxlbWVudHMgRW52ZWxvcGVWYWxpZGF0b3IKLXsKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsI2lzUHJpbWFyeUVudHJ5VHlwZU1hdGNoKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaCgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgewotICAgIGJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQotICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBlbnRyeSBhbmQgdGVzdCBhc3NlcnRpb24gaGF2ZSB0aGUgc2FtZSBwcmltYXJ5IGNvbnRleHQKLSAgICBpZiAoKHRlc3RBc3NlcnRpb24uZ2V0RW50cnlUeXBlTmFtZSgpLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9FTlZFTE9QRV9BTlkpKQotICAgICAgfHwgKHRlc3RBc3NlcnRpb24uZ2V0RW50cnlUeXBlTmFtZSgpLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9FTlZFTE9QRV9SRVFVRVNUKQotICAgICAgICAmJiAoZW50cnlDb250ZXh0Ci0gICAgICAgICAgLmdldEVudHJ5KCkKLSAgICAgICAgICAuZ2V0RW50cnlUeXBlKCkKLSAgICAgICAgICAuZ2V0VHlwZU5hbWUoKQotICAgICAgICAgIC5lcXVhbHMoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVFVRVNUKSkpCi0gICAgICB8fCAodGVzdEFzc2VydGlvbi5nZXRFbnRyeVR5cGVOYW1lKCkuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX0VOVkVMT1BFX1JFU1BPTlNFKQotICAgICAgICAmJiAoZW50cnlDb250ZXh0Ci0gICAgICAgICAgLmdldEVudHJ5KCkKLSAgICAgICAgICAuZ2V0RW50cnlUeXBlKCkKLSAgICAgICAgICAuZ2V0VHlwZU5hbWUoKQotICAgICAgICAgIC5lcXVhbHMoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVNQT05TRSkpKSkKLSAgICB7Ci0gICAgICBtYXRjaCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvU1NCUDE2MDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL1NTQlAxNjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOWQzNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvZW52ZWxvcGUvU1NCUDE2MDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogU1NCUDE2MDEKLSAqLwotcHVibGljIGNsYXNzIFNTQlAxNjAxIGV4dGVuZHMgQlAxNjAxCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFNTQlAxNjAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL1NTQlA5NzA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9lbnZlbG9wZS9TU0JQOTcwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzU1MjZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL2VudmVsb3BlL1NTQlA5NzA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFNTQlA5NzA0Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIGVudmVsb3BlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBFTlZFTE9QRSBkb2VzIG5vdCBjb250YWluIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24geG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTU0JQOTcwNCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFNTQlA5NzA0KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBtZXNzYWdlIGRvY3VtZW50Ci0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGVtcHR5IG9yIGludmFsaWQsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0dGluZyB0aGUgcm9vdCBlbGVtZW50Ci0gICAgICBFbGVtZW50IGVsZW0gPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAvLyBJZiBpdCBpcyBub3QgdGhlIHNvYXA6RW52ZWxvcGUsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghZWxlbS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQKQotICAgICAgICB8fCAhZWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWE1MVXRpbHMuU09BUF9FTEVNX0VOVkVMT1BFKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIGVudmVsb3BlIGNvbnRhaW5zIHRoZSB4bWxuczp4bWwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgIFN0cmluZyBpbmNvcnJlY3RFbGVtZW50TmFtZSA9IGdldEluY29ycmVjdEVsZW1lbnROYW1lKGVsZW0pOwotICAgICAgaWYgKGluY29ycmVjdEVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgbmFtZSBvZiBhbiBlbGVtZW50IGNvbnRhaW5pbmcgIgotICAgICAgICAgICsgInN1Y2ggbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGlzIFwiIiArIGluY29ycmVjdEVsZW1lbnROYW1lICsgIlwiLiIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogTG9va3MgZm9yIGFueSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZSB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIuIAotICAgKiBAcGFyYW0gZWxlbSB0aGUgcm9vdCBlbGVtZW50LgotICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIGFuIGVsZW1lbnQgZm91bmQgb3IgbnVsbC4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldEluY29ycmVjdEVsZW1lbnROYW1lKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIC8vIEdldHRpbmcgYSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHhtbG5zOnhtbAotICAgIFN0cmluZyBhdHRyVmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZU5TKAotICAgICAgV1NJQ29uc3RhbnRzLk5TX1VSSV9YTUxOUywgInhtbCIpOwotICAgIC8vIElmIGl0IGVxdWFscyB0byAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKLSAgICAvLyByZXR1cm4gYW4gZWxlbWVudCBuYW1lOwotICAgIGlmIChXU0lDb25zdGFudHMuTlNfVVJJX1hNTC5lcXVhbHMoYXR0clZhbHVlKSkKLSAgICB7Ci0gICAgICByZXR1cm4gZWxlbS5nZXROb2RlTmFtZSgpOwotICAgIH0KLSAgICAvLyBHb2luZyB0aHJvdWdoIGVsZW1lbnQncyBjaGlsZHJlbgotICAgIEVsZW1lbnQgY2hpbGQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGVsZW0pOwotICAgIHdoaWxlIChjaGlsZCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIElmIGFueSBvZiB0aGVtIGhhcyB4bWxuczp4bWwgYXR0cmlidXRlLCByZXR1cm4gYSB2YWx1ZQotICAgICAgU3RyaW5nIG5hbWUgPSBnZXRJbmNvcnJlY3RFbGVtZW50TmFtZShjaGlsZCk7Ci0gICAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgIH0KLSAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgZWxlbWVudCdzIGNoaWxkCi0gICAgICBjaGlsZCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICB9Ci0gICAgLy8gTm8geG1sbnM6eG1sIGF0dHJpYnV0ZXMgZm91bmQsIHJldHVybiBudWxsCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTAwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDEwMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmZjM3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTAwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMTAwMwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBub24tbXVsdGlwYXJ0L3JlbGF0ZWQgbWVzc2FnZSBpbiB0aGUgbG9nIGZpbGUsIHdoaWNoIGhhcyBhIG5vbi1lbXB0eSBlbnRpdHktYm9keTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqICBUaGUgbG9nZ2VkIFNPQVAgZW52ZWxvcGUgaXMgYSBVVEYtOCB0cmFuc2NyaXB0IG9mIGFuIGVudmVsb3BlIG9yaWdpbmFsbHkgZW5jb2RlZCBhcyBVVEYtOCBvciBVVEYtMTYuIAotICogIFRoZSBIVFRQIENvbnRlbnQtVHlwZSBoZWFkZXIncyBjaGFyc2V0IHZhbHVlIGlzIGVpdGhlciBVVEYtOCBvciBVVEYtMTYuIExvb2tpbmcgYXQgdGhlIG1lc3NhZ2VDb250ZW50IAotICogIGVsZW1lbnQgb2YgdGhlIGxvZ2dlZCBtZXNzYWdlLCBlaXRoZXIgCi0gKiAgICAoMSkgaXQgaGFzIGEgQk9NIGF0dHJpYnV0ZSB3aGljaCBtYXBzIHRoZSBjaGFyc2V0IHZhbHVlIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLCBvciAKLSAqICAgICgyKSBpdCBoYXMgaXQgaGFzIGFuIFhNTCBkZWNsYXJhdGlvbiB3aGljaCBtYXRjaGVzIHRoZSBjaGFyc2V0IHZhbHVlIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLCBvciAKLSAqICAgICgzKSB0aGVyZSBpcyBubyBCT00gYXR0cmlidXRlIGFuZCBubyBYTUwgZGVjbGFyYXRpb24sIGFuZCB0aGUgY2hhcnNldCB2YWx1ZSBpcyBVVEYtOC4KLSAqIDwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKgotICogQGF1dGhvciBsYXV6b25kCi0gKi8KLXB1YmxpYyBjbGFzcyBBUDEwMDMgZXh0ZW5kcyBTU0JQMTAwMyB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW1wbAotCSAqLwotCXB1YmxpYyBBUDEwMDMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkgCi0JewotCQlzdXBlcihpbXBsKTsKLQl9Ci0KLQlwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotCSAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotCSAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLQkgIHRocm93cyBXU0lFeGNlcHRpb24KLQl7Ci0JICAvLyBJZiB0aGVyZSBpcyBhIFNPQVAgTWVzc2FnZSB3aXRoIEF0dGFjaG1lbnRzLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0JICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLQkgIHsKLQkgIAlyZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFLCBmYWlsdXJlRGV0YWlsKTsKLQkgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHRlc3RBc3NlcnRpb24sIGVudHJ5Q29udGV4dCk7Ci0JICB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOTAwZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMTkwMgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkluIGEgZGVzY3JpcHRpb24sIGlmIHRoZSB3c2RsOmlucHV0IG9yIHdzZGw6b3V0cHV0Ci0gKiBlbGVtZW50IGluIHRoZSB3c2RsOmJpbmRpbmcgc3BlY2lmaWVzIFdTREwgTUlNRSBiaW5kaW5nLCB0aGVuIHRoZSBtZXNzYWdlCi0gKiBjYW4gY29udGFpbiBTT0FQIGF0dGFjaG1lbnRzLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MDIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhbiBvcGVyYXRpb24gbWF0Y2hlZCBmb3IgYSBtZXNzYWdlCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSk7Ci0gICAgICAvLyBJZiBubyBvbmUgb3BlcmF0aW9uIG1hdGNoZXMsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgIExpc3QgZXh0RWxlbXM7Ci0gICAgICBTdHJpbmcgdHlwZTsKLSAgICAgIGlmIChNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUCi0gICAgICAgIC5lcXVhbHMoZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCkpKQotICAgICAgewotICAgICAgICB0eXBlID0gImlucHV0IjsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgOiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0eXBlID0gIm91dHB1dCI7Ci0gICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICA6IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgfQotICAgICAgLy8gSWYgdGhlIE1JTUUgYmluZGluZyBpcyBub3QgdXNlZCwgYnV0IHRoZSBtZXNzYWdlIGhhcwotICAgICAgLy8gYXQgbGVhc3Qgb25lIG5vbi1yb290IE1JTUUgcGFydCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgIGlmICghdXNlc01pbWVCaW5kaW5nKGV4dEVsZW1zKQotICAgICAgICAmJiBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCkuY291bnQoKSA+IDEpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgd3NkbDoiICsgdHlwZSArICIgb2YgdGhlIFwiIgotICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZmlyc3QgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZC4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB1c2VzTWltZUJpbmRpbmcoTGlzdCBleHRFbGVtcykgewotICAgIC8vIElmIHRoZSBmaXJzdCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkLAotICAgIC8vIHJldHVybiB0cnVlCi0gICAgaWYgKGV4dEVsZW1zICE9IG51bGwgJiYgZXh0RWxlbXMuc2l6ZSgpID4gMAotICAgICAgJiYgKChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5nZXQoMCkpCi0gICAgICAuZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIC8vIG90aGVyd2lzZSByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkxNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MTUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1Mjk3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NSU1FQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1JTUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLQotLyoqCi0gKiBBUDE5MTUKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgcm9vdC1wYXJ0IG9mIGEgbXVsdGlwYXJ0L3JlbGF0ZWQgbWVzc2FnZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgZW50aXR5IGJvZHkgb2YgdGhlIHJvb3QtcGFydCBvZiBhCi0gKiBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlIGlzIHNlcmlhbGl6ZWQgdXNpbmcgZWl0aGVyIFVURi04IG9yIFVURi0xNgotICogY2hhcmFjdGVyIGVuY29kaW5nLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MTUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MTUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gZ2V0IE1JTUUgcGFydHMKLSAgICBpZiAoIWVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIE1pbWVQYXJ0cyBtaW1lUGFydHMgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCk7ICAgIAkKLSAgICAgIE1pbWVQYXJ0IHBhcnQgPSBtaW1lUGFydHMuZ2V0Um9vdFBhcnQoKTsKLSAgICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB4bWxFbmNvZGluZyA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBjaGFyc2V0ID0gTUlNRVV0aWxzLmdldE1pbWVIZWFkZXJTdWJBdHRyaWJ1dGUoCi0gICAgICAgICAgcGFydC5nZXRIZWFkZXJzKCksCi0gICAgICAgICAgTUlNRUNvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCAKLSAgICAgICAgICAiY2hhcnNldCIpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIC8vIFRoZSBIVFRQIENvbnRlbnQtVHlwZSBoZWFkZXIncyBjaGFyc2V0IHZhbHVlIGlzIGVpdGhlciBVVEYtOCBvciBVVEYtMTYuIAotICAgICAgICAgIGlmKChjaGFyc2V0ICE9IG51bGwpICYmIChjaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UoInV0Zi04IikgfHwKLSAgICAgICAgICAgICAgY2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtMTYiKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gTG9va2luZyBhdCB0aGUgbWVzc2FnZUNvbnRlbnQgZWxlbWVudCBvZiB0aGUgbG9nZ2VkIG1lc3NhZ2UsIGVpdGhlciAKLSAgICAgICAgICAgIC8vICgxKSBpdCBoYXMgYSBCT00gYXR0cmlidXRlIHdoaWNoIG1hcHMgdGhlIGNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIsIG9yIAotICAgICAgICAgICAgaW50IGJvbSA9IDA7Ci0gICAgICAgICAgICBpZiAoKGJvbSA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRCT00oKSkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKChib20gPT0gV1NJQ29uc3RhbnRzLkJPTV9VVEY4Ci0gICAgICAgICAgICAgICAgJiYgIWNoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZSgidXRmLTgiKSkKLSAgICAgICAgICAgICAgICB8fCAoKGJvbSA9PSBXU0lDb25zdGFudHMuQk9NX1VURjE2Ci0gICAgICAgICAgICAgICAgICAmJiAhY2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtMTYiKSkpCi0gICAgICAgICAgICAgICAgfHwgKChib20gPT0gV1NJQ29uc3RhbnRzLkJPTV9VVEYxNl9CSUdfRU5ESUFOCi0gICAgICAgICAgICAgICAgICAmJiAhY2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtMTYiKSkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBCT00gKCIgKyBib20gKyAKLSAgICAgICAgICAgICAgICAgICAgIikgYW5kIGNoYXJzZXQgdmFsdWUgKCIgKyBjaGFyc2V0ICsgIilkbyBub3QgbWF0Y2guIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vICgyKSBpdCBoYXMgYW4gWE1MIGRlY2xhcmF0aW9uIHdoaWNoIG1hdGNoZXMgdGhlIGNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIsIG9yIAotICAgICAgICAgICAgZWxzZSBpZiAoKCh4bWxFbmNvZGluZyA9IAotICAgICAgICAgICAgICBVdGlscy5nZXRYTUxFbmNvZGluZyhwYXJ0LmdldENvbnRlbnQoKSkpICE9IG51bGwpICYmCi0gICAgICAgICAgICAgICF4bWxFbmNvZGluZy5lcXVhbHMoIiIpKSAgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmKCF4bWxFbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBYTUwgZGVjbGFyYXRpb24gZW5jb2RpbmcgKCIgKyAKLSAgICAgICAgICAgICAgICAgICAgeG1sRW5jb2RpbmcgKyAiKSBhbmQgY2hhcnNldCB2YWx1ZSAoIiArIGNoYXJzZXQgKyAKLSAgICAgICAgICAgICAgICAgICAgIikgZG8gbm90IG1hdGNoLiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vICgzKSB0aGVyZSBpcyBubyBCT00gYXR0cmlidXRlIGFuZCBubyBYTUwgZGVjbGFyYXRpb24sIGFuZCB0aGUgY2hhcnNldCB2YWx1ZSBpcyBVVEYtOC4KLSAgICAgICAgICAgIGVsc2UgaWYoIWNoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZSgidXRmLTgiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBubyBCT00gYXR0cmlidXRlIGFuZCBubyBYTUwgIisKLSAgICAgICAgICAgICAgICAgICJkZWNsYXJhdGlvbiwgYW5kIHRoZSBjaGFyc2V0IHZhbHVlIGlzICgiICsgY2hhcnNldCArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGhlYWRlciBkbyBub3QgZm91bmQgb3IgaW5jb3JyZWN0IGNoYXJzZXQgdmFsdWUKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJFaXRoZXIgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaXMgbm90ICIrCi0gICAgICAgICAgICAgICAgInByZXNlbnQgaW4gdGhlIFJvb3QgUGFydCBvciBhIGNoYXJzZXQgdmFsdWUgaXMgaW52YWxpZC4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkgCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkxNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyZDBkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLQotLyoqCi0gKiBBUDE5MTcKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgbWVzc2FnZSBjb250YWluaW5nIHplcm8gYXR0YWNobWVudCBwYXJ0czwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIG1lc3NhZ2UgY29udGFpbmluZyB6ZXJvIGF0dGFjaG1lbnQgcGFydHMgaXMgc2VudAotICogdXNpbmcgYSBjb250ZW50LXR5cGUgb2YgZWl0aGVyICJ0ZXh0L3htbCIgYXMgdGhvdWdoIGEgU09BUCBIVFRQIGJpbmRpbmcgd2VyZQotICogdXNlZCBvciAibXVsdGlwYXJ0L3JlbGF0ZWQiIHdoZW4gdGhlIFdTREwgZGVzY3JpcHRpb24gZm9yIHRoZSBtZXNzYWdlCi0gKiBzcGVjaWZpZXMgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50IG9uIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6aW5wdXQKLSAqIG9yIHdzZGw6b3V0cHV0IGVsZW1lbnQgaW4gaXRzIHdzZGw6YmluZGluZy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTE3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTE3KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIG5vdCBhcHBsaWNhYmxlIGlmIHRoZXJlIGFyZSBhdHRhY2htZW50cwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCkuY291bnQoKSA+IDEpCi0gICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IHZhbGlkYXRvci5nZXRPcGVyYXRpb25NYXRjaCgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSk7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1hdGNoZWQgb3BlcmF0aW9uLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoYmluZGluZ09wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICAvLyBGaW5kaW5nIG9wZXJhdGlvbiBleHRlbnNpYmlsaXR5IGVsZW1zCi0gICAgICAvLyBpbiB0aGUgYmluZGluZyBkZXBlbmRpbmcgb24gbWVzc2FnZSB0eXBlCi0gICAgICBMaXN0IGV4dEVsZW1zID0gbnVsbDsKLSAgICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkKLSAgICAgICAgJiYgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRFbGVtcyA9IGJpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAuZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UpCi0gICAgICAgICYmIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgIC5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGNoZWNrIGxpc3QKLSAgICAgIGlmKChleHRFbGVtcyA9PSBudWxsKSB8fCAoZXh0RWxlbXMuc2l6ZSgpID09IDApKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBkZXRlcm1pbmUgdHlwZSAKLSAgICAgIGJvb2xlYW4gaXNNdWx0aVBhcnQgPSBmYWxzZTsKLSAgICAgIAotICAgICAgLy8gaWYgTUlNRU11bHRpcGFydFJlbGF0ZWQgdGhlbiBvbmx5IHJvb3QtcGFydCBhbGxvd2VkIAotICAgICAgaWYoZXh0RWxlbXMuZ2V0KDApIGluc3RhbmNlb2YgTUlNRU11bHRpcGFydFJlbGF0ZWQpCi0gICAgICB7Ci0gICAgICAgIGlmKCgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW1zLmdldCgwKSkuZ2V0TUlNRVBhcnRzKCkuc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGlzTXVsdGlQYXJ0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIC8vIGVsc2UgaWYgbm90IHNvYXBiaW5kOmJvZHkgcm9vdCBlbGVtZW50Ci0gICAgICBlbHNlIGlmKCEoZXh0RWxlbXMuZ2V0KDApIGluc3RhbmNlb2YgU09BUEJvZHkpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvLyBnZXQgSFRUUCBjb250ZW50IHR5cGUKLSAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyQXR0cmlidXRlKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpLAotICAgICAgICAgIEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSk7Ci0gCi0gICAgICAvL2FsbG93ICJ0ZXh0L3htbCIgb3IgCi0gICAgICAvLygibXVsdGlwYXJ0L3JlbGF0ZWQiIGFuZCAibWltZTptdWx0aXBhcnRSZWxhdGVkIiBXU0RMIGJpbmRpbmdzKQotICAgICAgaWYoKGNvbnRlbnRUeXBlID09IG51bGwpIHx8IAotICAgICAgICAgKCFjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFdTSUNvbnN0YW50cy5DT05URU5UX1RZUEVfTVVMVElQQVJUKSAmJgotICAgICAgICAgIWNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9URVhUX1hNTCkpIHx8Ci0gICAgICAgICAoKGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9NVUxUSVBBUlQpICYmIAotICAgICAgICAgICAgICFpc011bHRpUGFydCkpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIgZmllbGQgICIgKwotICAgICAgICAgICAgInZhbHVlIFwiIiArIGNvbnRlbnRUeXBlICsgIlwiIGlzIGluY29ycmVjdCIpOwotICAgICAgfQotICAgIH0gCi0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IAotICAgICAgICB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkyNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MjUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1MDFmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLQotLyoqCi0gKiBBUDE5MjUKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgbWVzc2FnZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5JZiB0aGUgV1NETCBkZXNjcmlwdGlvbiBsaXN0cyBhdCBsZWFzdCBvbmUgbm9uLXJvb3QKLSAqIE1JTUUgcGFydCwgdGhlbiB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlIGhhcyBhIENvbnRlbnQtVHlwZSBIVFRQIGhlYWRlcgotICogZmllbGQtdmFsdWUgd2l0aCBhIG1lZGlhLXR5cGUgb2YgIm11bHRpcGFydC9yZWxhdGVkLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MjUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MjUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKTsKLSAgCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVkIG9wZXJhdGlvbiwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgCi0gICAgICAvLyBGaW5kaW5nIG9wZXJhdGlvbiBleHRlbnNpYmlsaXR5IGVsZW1zCi0gICAgICAvLyBpbiB0aGUgYmluZGluZyBkZXBlbmRpbmcgb24gbWVzc2FnZSB0eXBlCi0gICAgICBMaXN0IGV4dEVsZW1zID0gbnVsbDsKLSAgICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVCkKLSAgICAgICAgJiYgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBleHRFbGVtcyA9IGJpbmRpbmdPcGVyYXRpb24KLSAgICAgICAgICAuZ2V0QmluZGluZ0lucHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscygKLSAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVTUE9OU0UpCi0gICAgICAgICYmIGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgIC5nZXRCaW5kaW5nT3V0cHV0KCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICB9Ci0gICAgICAvLyBjaGVjayBsaXN0IG9uIGZpcnN0IGVsZW1lbnQKLSAgICAgIGlmKChleHRFbGVtcyA9PSBudWxsKSB8fCAoZXh0RWxlbXMuc2l6ZSgpID09IDApIHx8IAotICAgICAgICAgIShleHRFbGVtcy5nZXQoMCkgaW5zdGFuY2VvZiBNSU1FTXVsdGlwYXJ0UmVsYXRlZCkpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAKLSAgICAgIC8vIGdldCBsaXN0IG1pbWUgcGFydHMgZnJvbSBkZWZpbml0aW9uCi0gICAgICBNSU1FTXVsdGlwYXJ0UmVsYXRlZCBtaW1lID0gKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtcy5nZXQoMCk7Ci0gICAgICBMaXN0IHBhcnRzID0gbWltZS5nZXRNSU1FUGFydHMoKTsKLSAgICAgIC8vIGlmIHBhcnRzIGNvdW50IGlzIG1vcmUgdGhhbiBvbmUsIHRoYW4gYXNzZXJ0aW9uIGlzIG5vdEFwcGxpY2FibGUKLSAgICAgIGlmKHBhcnRzLnNpemUoKSA8PSAxKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgU3RyaW5nIGNvbnRlbnRUeXBlID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCksCi0gICAgICAgICAgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFKTsgCi0gICAgICBpZigoY29udGVudFR5cGUgPT0gbnVsbCkgfHwgCi0gICAgICAgICAhY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShXU0lDb25zdGFudHMuQ09OVEVOVF9UWVBFX01VTFRJUEFSVCkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJJbmNvcnJlY3QgQ29udGVudC1UeXBlIHZhbHVlIFwiIiArCi0gICAgICAgICAgICBjb250ZW50VHlwZSArICJcIiBpbiBIVFRQIGhlYWRlciIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gCi0gICAgICAgIHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwYXJ0IHZhbHVlIGZyb20gTUlNRUNvbnRlbnQgZWxlbWVudAotICAgKiBAcGFyYW0gcGFydCBNSU1FUGFydCBlbGVtZW50Ci0gICAqIEByZXR1cm4gdGhlIHBhcnQgdmFsdWUgZnJvbSBNSU1FQ29udGVudCBlbGVtZW50Ci0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRNSU1FQ29udGVudFBhcnQoTUlNRVBhcnQgcGFydCkgewotICAgIExpc3QgbGlzdCA9IHBhcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYobGlzdC5zaXplKCkgPT0gMCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIHJldHVybiAoKE1JTUVDb250ZW50KSBsaXN0LmdldCgwKSkuZ2V0UGFydCgpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MjYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTI2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZjI0ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MjYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1JTUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTUlNRVV0aWxzOwotCi0vKioKLSAqIEFQMTkyNgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkEgbWVzc2FnZSBpbmNsdWRlcyBhbGwgb2YgdGhlIE1JTUUgcGFydHMgZGVzY3JpYmVkIGJ5Ci0gKiBpdHMgV1NETCBNSU1FIGJpbmRpbmcuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkyNiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTkyNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZighZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gZ2V0IG1lc3NhZ2UgbWltZSBwYXJ0cwotICAgICAgTWltZVBhcnRzIG1pbWVQYXJ0cyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKTsKLSAgICAgIAotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2hlZCBvcGVyYXRpb24sIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEZpbmRpbmcgb3BlcmF0aW9uIGV4dGVuc2liaWxpdHkgZWxlbXMKLSAgICAgIC8vIGluIHRoZSBiaW5kaW5nIGRlcGVuZGluZyBvbiBtZXNzYWdlIHR5cGUKLSAgICAgIExpc3QgZXh0RWxlbXMgPSBudWxsOwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKQotICAgICAgICAmJiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgIC5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkKLSAgICAgICAgJiYgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIC8vIGNoZWNrIGxpc3QgZm9yIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICBpZigoZXh0RWxlbXMgPT0gbnVsbCkgfHwgKGV4dEVsZW1zLnNpemUoKSA9PSAwKSB8fCAKLSAgICAgICAgICEoZXh0RWxlbXMuZ2V0KDApIGluc3RhbmNlb2YgTUlNRU11bHRpcGFydFJlbGF0ZWQpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgCi0gICAgICAvLyBnZXQgbGlzdCBtaW1lIHBhcnRzIGZyb20gZGVmaW5pdGlvbgotICAgICAgTUlNRU11bHRpcGFydFJlbGF0ZWQgbWltZSA9IChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbXMuZ2V0KDApOwotICAgICAgTGlzdCBwYXJ0cyA9IG1pbWUuZ2V0TUlNRVBhcnRzKCk7Ci0KLSAgICAgIGlmKG1pbWVQYXJ0cy5nZXRSb290UGFydCgpID09IG51bGwgfHwgbWltZVBhcnRzLmNvdW50KCk9PTApCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICAvLyBza2lwIHJvb3QgcGFydAotICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJ0cy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcnROYW1lID0gZ2V0TUlNRUNvbnRlbnRQYXJ0KChNSU1FUGFydCkgcGFydHMuZ2V0KGkpKTsKLSAgICAgICAgLy8gZmluZCB0aGUgY29ycmVzcG9uZGluZyBNSU1FIHBhcnQKLSAgICAgICAgaWYgKGZpbmRNSU1FUGFydChtaW1lUGFydHMuZ2V0UGFydHMoKSwgcGFydE5hbWUpID09IG51bGwpIAotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBjb3JyZXNwb25kaW5nIGJpbmRpbmcgIiArCi0gICAgICAgICAgICAgICJvcGVyYXRpb24gXCIiICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAKLSAgICAgICAgICAgICAgIlwiIGRvZXMgbm90IGNvbnRhaW4gcGFydCBcIiIgKyBwYXJ0TmFtZSArICJcIiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSAKLSAgICAgICAgdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIGZpbmQgY29ycmVzcG9uZGluZyBNSU1FIHBhcnQKLSAgICogQHBhcmFtIHBhcnRzIGFycmF5IG9mIHNvYXAgTUlNRSBwYXJ0cwotICAgKiBAcGFyYW0gcGFydE5hbWUgcGFydCBuYW1lIHRvIGZpbmQKLSAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIE1JTUUgcGFydCAiQ29udGVudC1JRCIgdmFsdWUsIAotICAgKiBpZiB0aGUgcGFydCBkb2VzbnQgZm91bmQsIHJldHVucyBudWxsCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBmaW5kTUlNRVBhcnQoQ29sbGVjdGlvbiBwYXJ0cywgU3RyaW5nIHBhcnROYW1lKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIGlmKHBhcnROYW1lID09IG51bGwpCi0gICAgICAgcmV0dXJuIG51bGw7Ci0gICAgSXRlcmF0b3IgaXBhcnRzID0gcGFydHMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXBhcnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBNaW1lUGFydCBwYXJ0ID0gKE1pbWVQYXJ0KWlwYXJ0cy5uZXh0KCk7Ci0gICAgICBTdHJpbmcgbV9wYXJ0TmFtZSA9IE1JTUVVdGlscy5nZXRNaW1lSGVhZGVyQXR0cmlidXRlKAotICAgICAgICAgIHBhcnQuZ2V0SGVhZGVycygpLCBNSU1FQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0lEKTsKLQotICAgICAgLy8gY2hlY2sgdmFsdWUgZm9ybWF0IDxwYXJ0bmFtZT1VSURAaG9zdD4KLSAgICAgIGlmICgobV9wYXJ0TmFtZSAhPSBudWxsKSAmJiAobV9wYXJ0TmFtZS5zdGFydHNXaXRoKCI8IikpICYmIAotICAgICAgICAgIChtX3BhcnROYW1lLmluZGV4T2YoIj0iKSAhPSAtMSkgJiYgCi0gICAgICAgICAgKGVuY29kZVBhcnROYW1lKG1fcGFydE5hbWUuc3Vic3RyaW5nKDEsIG1fcGFydE5hbWUuaW5kZXhPZigiPSIpKSkuZXF1YWxzKHBhcnROYW1lKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBtX3BhcnROYW1lOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwYXJ0IHZhbHVlIGZyb20gTUlNRUNvbnRlbnQgZWxlbWVudAotICAgKiBAcGFyYW0gcGFydCBNSU1FUGFydCBlbGVtZW50Ci0gICAqIEByZXR1cm4gdGhlIHBhcnQgdmFsdWUgZnJvbSBNSU1FQ29udGVudCBlbGVtZW50Ci0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRNSU1FQ29udGVudFBhcnQoTUlNRVBhcnQgcGFydCkgewotICAgIExpc3QgbGlzdCA9IHBhcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYobGlzdC5zaXplKCkgPT0gMCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIHJldHVybiAoKE1JTUVDb250ZW50KSBsaXN0LmdldCgwKSkuZ2V0UGFydCgpOwotICB9Ci0gIAotICAvKioKLSAgICogRW5jb2RlIHN0cmluZyBmcm9tICVISCB0byBVVEYKLSAgICogQHBhcmFtIHN0ciBzdHJpbmcKLSAgICogQHJldHVybiBlbmNvZGVkIHN0cmluZyBmcm9tICVISCBmb3JtYXQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGVuY29kZVBhcnROYW1lKFN0cmluZyBzdHIpIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBpZigoc3RyLmNoYXJBdChpKSA9PSAnJScpICYmIChzdHIubGVuZ3RoKCkgPiBpKzIpKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0ci5jaGFyQXQoaSsxKSkgKwotICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzdHIuY2hhckF0KGkrMikpLCAxNik7Ci0gICAgICAgICAgcmVzLmFwcGVuZCgoY2hhcikgdmFsdWUpOwotICAgICAgICAgIGkgKz0yOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXt9Ci0gICAgICB9IAotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgcmVzLmFwcGVuZChzdHIuY2hhckF0KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcy50b1N0cmluZygpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTMxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxY2RmYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEFQMTkzMQotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSByb290LXBhcnQgb2YgYSBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBlbnRpdHkgYm9keSBvZiB0aGUgcm9vdC1wYXJ0IG9mIG11bHRpcGFydC9yZWxhdGVkCi0gKiBtZXNzYWdlIGlzIGEgc29hcDpFbnZlbG9wZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTMxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTMxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIGNoZWNrIGZvciB0aGUgcm9vdCBwYXJ0Ci0gICAgaWYoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSAmJgotICAgICAgIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCkuZ2V0Um9vdFBhcnQoKSAhPSBudWxsKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgIC8vIHBhcnNlIHJvb3QgcGFydCBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5wYXJzZVhNTCgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCkuZ2V0Um9vdFBhcnQoKS5nZXRDb250ZW50KCkpOwotICAgICAgCi0gICAgICAvLyBnZXQgZW50aXR5IGJvZHkKLSAgICAgIEVsZW1lbnQgZWwgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAKLSAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBzb2FwOkVudmVsb3BlLCB0aGVuIGZhaWwgIAotICAgICAgaWYoIWVsLmdldExvY2FsTmFtZSgpLmVxdWFscyhXU0lUYWcuRUxFTV9TT0FQX0VOVkVMT1BFLmdldExvY2FsUGFydCgpKSB8fAotICAgICAgICAgIWVsLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0lUYWcuRUxFTV9TT0FQX0VOVkVMT1BFLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICJ0aGUgZW50aXR5IGJvZHkgb2YgdGhlIHJvb3QgcGFydCBpcyB7IiArCi0gICAgICAgICAgICBlbC5nZXROYW1lc3BhY2VVUkkoKSArICJ9IiArIGVsLmdldExvY2FsTmFtZSgpLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgICAgfSAKLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICJ0aGUgZW50aXR5IGJvZHkgb2YgdGhlIHJvb3QgcGFydCBkb2VzIG5vdCBjb250YWluICIgKwotICAgICAgICAgICAgIlwic29hcDpFbnZlbG9wZVwiIGVsZW1lbnQiLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0gCi0gICAgZWxzZSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTMyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWMwZmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTMyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotCi0vKioKLSAqIEFQMTkzMgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlIGNvbnRhaW5pbmcgYSBDb250ZW50LVR5cGUgSFRUUCBoZWFkZXIKLSAqIGZpZWxkLXZhbHVlIHdpdGggYSBtZWRpYSB0eXBlIG9mICJtdWx0aXBhcnQvcmVsYXRlZCI8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+SW4gYSBtZXNzYWdlLCB0aGUgQ29udGVudC1UeXBlIEhUVFAgaGVhZGVyIGZpZWxkLXZhbHVlCi0gKiBoYXMgYSB0eXBlIHBhcmFtZXRlciB3aXRoIGEgdmFsdWUgb2YgInRleHQveG1sIiB3aGVuIGl0IGhhcyBhIG1lZGlhIHR5cGUgb2YKLSAqICJtdWx0aXBhcnQvcmVsYXRlZCIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkzMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTkzMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBjaGVjayBmb3IgbXVsdGlwYXJ0L3JlbGF0ZWQgY29udGVudCB0eXBlCi0gICAgU3RyaW5nIGNvbnRlbnRfdHlwZSA9IEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyQXR0cmlidXRlKAotICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSwgCi0gICAgICAgIEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSk7Ci0gICAgCi0gICAgaWYoKGNvbnRlbnRfdHlwZSA9PSBudWxsKSB8fCAKLSAgICAgICAoIWNvbnRlbnRfdHlwZS5lcXVhbHNJZ25vcmVDYXNlKFdTSUNvbnN0YW50cy5DT05URU5UX1RZUEVfTVVMVElQQVJUKSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9IAotICAgIGVsc2UgIAotICAgIHsKLSAgICAgIFN0cmluZyBzdWJUeXBlID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJTdWJBdHRyaWJ1dGUoCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCksIAotICAgICAgICAgIEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwgInR5cGUiKTsKLSAgICAgIGlmKChzdWJUeXBlID09IG51bGwpCi0gICAgICAgIHx8ICFzdWJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9URVhUX1hNTCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAiVGhlIFwidHlwZVwiIHBhcmFtZXRlciB2YWx1ZSBpcyBcIiIgKyBzdWJUeXBlICsgIlwiIiwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ0OTFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NSU1FQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1JTUVVdGlsczsKLQotLyoqCi0gKiBBUDE5MzMKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgbWVzc2FnZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5JZiBhIGRlc2NyaXB0aW9uIGJpbmRzIGEgd3NkbDptZXNzYWdlIHBhcnQgdG8gYQotICogbWltZTpjb250ZW50IGVsZW1lbnQsIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgTUlNRSBwYXJ0IGluIGEgbWVzc2FnZSBoYXMgYQotICogY29udGVudC1pZCBoZWFkZXIgd2l0aCBhIGdsb2JhbGx5IHVuaXF1ZSB2YWx1ZSBvZiB0aGUgZm9ybQotICogJmx0O3BhcnRuYW1lPUlEQGhvc3RuYW1lJmd0Oywgd2hlcmUgJ3BhcnRuYW1lJyBpcyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgYXR0cmlidXRlIG9mCi0gKiB0aGUgd3NkbDpwYXJ0IGVsZW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgbWltZTpjb250ZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MzMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MzMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZighZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gZ2V0IG1lc3NhZ2UgbWltZSBwYXJ0cwotICAgICAgTWltZVBhcnRzIG1pbWVQYXJ0cyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKTsKLSAgICAgIAotICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gdmFsaWRhdG9yLmdldE9wZXJhdGlvbk1hdGNoKAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2hlZCBvcGVyYXRpb24sIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmIChiaW5kaW5nT3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0KLSAgICAgIC8vIEZpbmRpbmcgb3BlcmF0aW9uIGV4dGVuc2liaWxpdHkgZWxlbXMKLSAgICAgIC8vIGluIHRoZSBiaW5kaW5nIGRlcGVuZGluZyBvbiBtZXNzYWdlIHR5cGUKLSAgICAgIExpc3QgZXh0RWxlbXMgPSBudWxsOwotICAgICAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKQotICAgICAgICAmJiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgIC5nZXRCaW5kaW5nSW5wdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRUeXBlKCkuZXF1YWxzKAotICAgICAgICBNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkKLSAgICAgICAgJiYgYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZXh0RWxlbXMgPSBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIH0KLSAgICAgIC8vIGNoZWNrIGxpc3QgZm9yIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICBpZigoZXh0RWxlbXMgPT0gbnVsbCkgfHwgKGV4dEVsZW1zLnNpemUoKSA9PSAwKSB8fCAKLSAgICAgICAgICEoZXh0RWxlbXMuZ2V0KDApIGluc3RhbmNlb2YgTUlNRU11bHRpcGFydFJlbGF0ZWQpKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgCi0gICAgICAvLyBnZXQgbGlzdCBtaW1lIHBhcnRzIGZyb20gZGVmaW5pdGlvbgotICAgICAgTUlNRU11bHRpcGFydFJlbGF0ZWQgbWltZSA9IChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbXMuZ2V0KDApOwotICAgICAgTGlzdCBwYXJ0cyA9IG1pbWUuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAKLSAgICAgIC8vIHNraXAgcm9vdCBwYXJ0Ci0gICAgICBmb3IgKGludCBpID0gMTsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBTdHJpbmcgcGFydE5hbWUgPSBnZXRNSU1FQ29udGVudFBhcnQoKE1JTUVQYXJ0KSBwYXJ0cy5nZXQoaSkpOwotICAgICAgICAvLyBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIE1JTUUgcGFydAotICAgICAgICBpZiAoZmluZE1JTUVQYXJ0KG1pbWVQYXJ0cy5nZXRQYXJ0cygpLCBwYXJ0TmFtZSkgPT0gbnVsbCkgCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZyAiICsKLSAgICAgICAgICAgICAgIm9wZXJhdGlvbiBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArIAotICAgICAgICAgICAgICAiXCIgZG9lcyBub3QgY29udGFpbiBwYXJ0IFwiIiArIHBhcnROYW1lICsgIlwiIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IAotICAgICAgICB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBmaW5kIGNvcnJlc3BvbmRpbmcgTUlNRSBwYXJ0Ci0gICAqIEBwYXJhbSBwYXJ0cyBhcnJheSBvZiBzb2FwIE1JTUUgcGFydHMKLSAgICogQHBhcmFtIHBhcnROYW1lIHBhcnQgbmFtZSB0byBmaW5kCi0gICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBNSU1FIHBhcnQgIkNvbnRlbnQtSUQiIHZhbHVlLCAKLSAgICogaWYgdGhlIHBhcnQgZG9lc250IGZvdW5kLCByZXR1bnMgbnVsbAotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZmluZE1JTUVQYXJ0KENvbGxlY3Rpb24gcGFydHMsIFN0cmluZyBwYXJ0TmFtZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uLCBBc3NlcnRpb25GYWlsRXhjZXB0aW9uCi0gIHsKLSAgICBpZihwYXJ0TmFtZSA9PSBudWxsKQotICAgICAgIHJldHVybiBudWxsOwotICAgIAotICAgIEl0ZXJhdG9yIGlwYXJ0cyA9IHBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlIChpcGFydHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGkgPSBpICsgMTsKLSAgICAgIE1pbWVQYXJ0IHBhcnQgPSAoTWltZVBhcnQpaXBhcnRzLm5leHQoKTsKLSAgICAgIFN0cmluZyBtX3BhcnROYW1lID0gTUlNRVV0aWxzLmdldE1pbWVIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgICAgcGFydC5nZXRIZWFkZXJzKCksIE1JTUVDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfSUQpOwotCi0gICAgICAvLyBjaGVjayB2YWx1ZSBmb3JtYXQgPHBhcnRuYW1lPVVJREBob3N0bmFtZT4KLSAgICAgIGlmICgobV9wYXJ0TmFtZSAhPSBudWxsKSAmJiBtX3BhcnROYW1lLnN0YXJ0c1dpdGgoIjwiKSAmJiBtX3BhcnROYW1lLmVuZHNXaXRoKCI+IikpIAotICAgICAgewotICAgICAgICBpbnQgaWR4LCBhdElkeDsKLSAgICAgICAgU3RyaW5nIGVuUGFydE5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgdWlkID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGhvc3QgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgLy8gZ2V0IHBhcnQgbmFtZSBmcm9tIGNvbnRlbnQtaWQKLSAgICAgICAgaWYgKChpZHggPSBtX3BhcnROYW1lLmluZGV4T2YoIj0iKSkgIT0gLTEpIAotICAgICAgICB7Ci0gICAgICAgICAgZW5QYXJ0TmFtZSA9IGVuY29kZVBhcnROYW1lKG1fcGFydE5hbWUuc3Vic3RyaW5nKDEsIGlkeCkpOyAKLSAgICAgICAgfQotICAgICAgICAvLyBnZXQgdWlkIGFuZCBob3N0bmFtZSBmcm9tIGNvbnRlbnQtaWQKLSAgICAgICAgaWYgKCgoYXRJZHggPSBtX3BhcnROYW1lLmluZGV4T2YoIkAiKSkgIT0gLTEpICYmIChhdElkeCA+IGlkeCkpIAotICAgICAgICB7Ci0gICAgICAgICAgdWlkID0gbV9wYXJ0TmFtZS5zdWJzdHJpbmcoaWR4KzEsIGF0SWR4KTsKLSAgICAgICAgICBob3N0ID0gbV9wYXJ0TmFtZS5zdWJzdHJpbmcoYXRJZHgrMSwgbV9wYXJ0TmFtZS5sZW5ndGgoKS0xKTsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBwYXJ0IG5hbWVzIG1hdGNoLCB2YWxpZGF0ZSBmb3JtYXQKLSAgICAgICAgaWYoKGVuUGFydE5hbWUgIT0gbnVsbCkgJiYgZW5QYXJ0TmFtZS5lcXVhbHMocGFydE5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoKHVpZCA9PSBudWxsKSB8fCAodWlkLmxlbmd0aCgpID09IDApKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBcIkNvbnRlbnQtSURcIiBhdHRyaWJ1dGUgb2YgdGhlIHBhcnQgXCIiKyhpKzEpKwotICAgICAgICAgICAgICAgICJcImNvbnRhaW5zIHZhbHVlIFwiIisgbV9wYXJ0TmFtZSsKLSAgICAgICAgICAgICAgICAiXCIgd2hpY2ggaGFzIGEgaW5jb3JyZWN0IFVJRCBmb3JtYXQiKTsKLSAgICAgICAgICBpZihob3N0ID09IG51bGwpIAotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBcIkNvbnRlbnQtSURcIiBhdHRyaWJ1dGUgb2YgdGhlIHBhcnQgXCIiKyhpKzEpKwotICAgICAgICAgICAgICAgICJcImNvbnRhaW5zIHZhbHVlIFwiIisgbV9wYXJ0TmFtZSsKLSAgICAgICAgICAgICAgICAiXCIgd2hpY2ggaGFzIGEgaW5jb3JyZWN0IGhvc3QgZm9ybWF0Iik7Ci0gICAgICAgICAgLy8gY2hlY2sgZm9yIG1hbGZvcm1lZCBVUkwKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuZXcgVVJMKCJIVFRQIiwgaG9zdCwgIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBcIkNvbnRlbnQtSURcIiBhdHRyaWJ1dGUgb2YgdGhlIHBhcnQgXCIiKyhpKzEpKwotICAgICAgICAgICAgICAgICJcImNvbnRhaW5zIHZhbHVlIFwiIisgbV9wYXJ0TmFtZSsKLSAgICAgICAgICAgICAgICAiXCIgd2hpY2ggaGFzIGEgaW5jb3JyZWN0IGhvc3QgZm9ybWF0Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBtX3BhcnROYW1lOwotICAgICAgICB9IAotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBhcnQgdmFsdWUgZnJvbSBNSU1FQ29udGVudCBlbGVtZW50Ci0gICAqIEBwYXJhbSBwYXJ0IE1JTUVQYXJ0IGVsZW1lbnQKLSAgICogQHJldHVybiB0aGUgcGFydCB2YWx1ZSBmcm9tIE1JTUVDb250ZW50IGVsZW1lbnQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldE1JTUVDb250ZW50UGFydChNSU1FUGFydCBwYXJ0KSAKLSAgewotICAgIExpc3QgbGlzdCA9IHBhcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYobGlzdC5zaXplKCkgPT0gMCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIHJldHVybiAoKE1JTUVDb250ZW50KSBsaXN0LmdldCgwKSkuZ2V0UGFydCgpOwotICB9Ci0gIAotICAvKioKLSAgICogRW5jb2RlIHN0cmluZyBmcm9tICVISCB0byBVVEYKLSAgICogQHBhcmFtIHN0ciBzdHJpbmcKLSAgICogQHJldHVybiBlbmNvZGVkIHN0cmluZyBmcm9tICVISCBmb3JtYXQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGVuY29kZVBhcnROYW1lKFN0cmluZyBzdHIpIHsKLSAgICBTdHJpbmdCdWZmZXIgcmVzID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBpZigoc3RyLmNoYXJBdChpKSA9PSAnJScpICYmIChzdHIubGVuZ3RoKCkgPiBpKzIpKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQoCi0gICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHN0ci5jaGFyQXQoaSsxKSkgKwotICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzdHIuY2hhckF0KGkrMikpLCAxNik7Ci0gICAgICAgICAgcmVzLmFwcGVuZCgoY2hhcikgdmFsdWUpOwotICAgICAgICAgIGkgKz0yOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKXt9Ci0gICAgICB9IAotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgcmVzLmFwcGVuZChzdHIuY2hhckF0KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlcy50b1N0cmluZygpOwotICB9ICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwNjA1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTUlNRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5NSU1FVXRpbHM7Ci0KLS8qKgotICogQVAxOTM0Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHBhcnQgb2YgYSBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGZpZWxkIG9mIGEgcGFydCBpbiBhCi0gKiBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlIGhhcyBhIHZhbHVlIG9mICI3Yml0IiwgIjhiaXQiLCAiYmluYXJ5IiwKLSAqICJxdW90ZWQtcHJpbnRhYmxlIiBvciAiYmFzZTY0Ii48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAxOTM0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAxOTM0KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIGNoZWNrIGZvciBtdWx0aXBhcnQvcmVsYXRlZCBjb250ZW50IHR5cGUKLSAgICBpZighZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmlzTWltZUNvbnRlbnQoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0gCi0gICAgZWxzZSAKLSAgICB7Ci0gICAgICAvLyBnZXQgTUlNRSBwYXJ0cwotICAgICAgTWltZVBhcnRzIHBhcnRzID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpOwotICAgICAgaWYocGFydHMuY291bnQoKSA9PSAwKSAKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgIAlJdGVyYXRvciBpcGFydHMgPSBwYXJ0cy5nZXRQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIC8vIGNoZWNrIGVhY2ggcGFydCBmb3IgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgZmllbGQKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoaXBhcnRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIE1pbWVQYXJ0IHBhcnQgPSAoTWltZVBhcnQpaXBhcnRzLm5leHQoKTsKLSAgICAgICAgICBTdHJpbmcgdHlwZV92YWx1ZSA9IE1JTUVVdGlscy5nZXRNaW1lSGVhZGVyQXR0cmlidXRlKAotICAgICAgICAgICAgICBwYXJ0LmdldEhlYWRlcnMoKSwKLSAgICAgICAgICAgICAgTUlNRUNvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORyk7Ci0gICAgICAgICAgaWYgKHR5cGVfdmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZigodHlwZV92YWx1ZSA9PSBudWxsKSB8fCAhKHR5cGVfdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiN2JpdCIpIHx8Ci0gICAgICAgICAgICAgICAgdHlwZV92YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCI4Yml0IikgfHwgCi0gICAgICAgICAgICAgICAgdHlwZV92YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJiYXNlNjQiKSB8fAotICAgICAgICAgICAgICAgIHR5cGVfdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgicXVvdGVkLXByaW50YWJsZSIpIHx8Ci0gICAgICAgICAgICAgICAgdHlwZV92YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJiaW5hcnkiKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICAgICAiKCIgKyAoaSsxKSArCi0gICAgICAgICAgICAgICAgICAiKSwgcGFydCBoZWFkZXIgZmllbGQgXCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nXCIgaGFzIGluY29ycmVjdCB2YWx1ZSBcIiIrCi0gICAgICAgICAgICAgICAgICB0eXBlX3ZhbHVlKyJcIiIsIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTM1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOGZjZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5MzUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci0KLS8qKgotICogQVAxOTM1Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHBhcnQgb2YgYSBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBlbmNvZGluZyBvZiB0aGUgYm9keSBvZiBhIHBhcnQgaW4gYQotICogbXVsdGlwYXJ0L3JlbGF0ZWQgbWVzc2FnZSBjb25mb3JtcyB0byB0aGUgZW5jb2RpbmcgaW5kaWNhdGVkIGJ5IHRoZQotICogQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBmaWVsZC12YWx1ZSwKLSAqIGFzIHNwZWNpZmllZCBieSBSRkMyMDQ1LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5MzUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDE5MzUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgaWYoIWVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9IAotICAgIGVsc2UgCi0gICAgewotICAgICAgLy8gZ2V0IE1JTUUgcGFydHMKLSAgICAgIE1pbWVQYXJ0cyBwYXJ0cyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNaW1lUGFydHMoKTsKLSAgICAgIGlmKHBhcnRzLmNvdW50KCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gY2hlY2sgZWFjaCBwYXJ0IGZvciB0aGUgZW5jb2RpbmcgbWF0Y2gKLSAgICAgIAlJdGVyYXRvciBpcGFydHMgPSBwYXJ0cy5nZXRQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgICAJaW50IGkgPSAwOwotICAgICAgCU1pbWVQYXJ0IHJvb3QgPSBwYXJ0cy5nZXRSb290UGFydCgpOwotICAgICAgICB3aGlsZSAoaXBhcnRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGkgPSBpID0gMTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgIAlNaW1lUGFydCBwYXJ0ID0gKE1pbWVQYXJ0KWlwYXJ0cy5uZXh0KCk7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIC8vIGdldCBlbmNvZGluZyBmcm9tIGhlYWRlcgotICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyQXR0cmlidXRlKHBhcnQuZ2V0SGVhZGVycygpLCAKLSAgICAgICAgICAgIAlIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HKTsKLSAgICAgICAgICAKLSAgICAgICAgICAgCWlmICgocGFydCA9PSByb290KSB8fCAKLSAgICAgICAgICAgCQkoKGVuY29kaW5nICE9IG51bGwpICYmIGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoImJhc2U2NCIpKSkKLSAgICAgICAgICAgICAgY2hlY2tQYXJ0KHBhcnQsIGVuY29kaW5nLCBmYWxzZSk7Ci0gICAgICAgICAgCWVsc2UgCi0gICAgICAgICAgCSAgY2hlY2tQYXJ0KHBhcnQsIGVuY29kaW5nLCB0cnVlKTsKLSAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICAgInBhcnQgIisoaSsxKSsiIEVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0gIC8qKgotICAgKiBDaGVjayBtZXNzYWdlIGVudHJ5IHRvIGVuY29kaW5nIGNvbmZvcm1pdHkgCi0gICAqIEBwYXJhbSBlbnRyeSBtZXNzYWdlIGVudHJ5Ci0gICAqIEB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBpZiBtZXNzYWdlIGRvZXMgbm90IGVuY29kaW5nIGNvbmZvcm1pdHkgIAotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiAKLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja1BhcnQoTWltZVBhcnQgcGFydCwgU3RyaW5nICBlbmNvZGluZywgYm9vbGVhbiBlbmNvZGVkKSAKLSAgICB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiwgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgY29udGVudCA9IG51bGw7Ci0gICAgaWYgKGVuY29kZWQpCi0gICAgICAgY29udGVudCA9IG5ldyBTdHJpbmcoVXRpbHMuZGVjb2RlQmFzZTY0KHBhcnQuZ2V0Q29udGVudCgpKSk7Ci0gICAgIGVsc2UKLSAgICAJY29udGVudCA9IHBhcnQuZ2V0Q29udGVudCgpOwotICAgIAotICAgIGlmKGVuY29kaW5nID09IG51bGwpIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgLy8gY2hlY2sgN2JpdAotICAgIH0gZWxzZSBpZihlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCI3Yml0IikpIHsKLSAgICAgIGNoZWNrT243Yml0KGNvbnRlbnQpOwotICAgIC8vIGNoZWNrIDhiaXQKLSAgICB9IGVsc2UgaWYoZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiOGJpdCIpKSB7Ci0gICAgICBjaGVja09uOGJpdChjb250ZW50KTsKLSAgICAvLyBjaGVjayBxdW90ZWQtcHJpbnRhYmxlCi0gICAgfSBlbHNlIGlmKGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoInF1b3RlZC1wcmludGFibGUiKSkgewotICAgICAgY2hlY2tPblF1b3RlZFByaW50YWJsZShjb250ZW50KTsKLSAgICAvLyBjaGVjayBiYXNlNjQKLSAgICB9IGVsc2UgaWYoZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgiYmFzZTY0IikpIHsKLSAgICAgIGNoZWNrT25CYXNlNjQoY29udGVudCk7Ci0gICAgfQotICAgIC8vIHdlIGRvbnQgY2hlY2sgYmluYXJ5IGVuY29kaW5nLCBzaW5jZSBtZXNzYWdlIGNhbiBjb250YWlucyBhbnkgY2hhcnMgCi0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgYSA3Yml0IGVuY29kZWQgbWVzc2FnZSAoUkZDMjA0NSkKLSAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBjaGVjawotICAgKiBAdGhyb3dzIEFzc2VydGlvbkZhaWxFeGNlcHRpb24gaWYgbWVzc2FnZSBkb2VzIG5vdCBjb25mb3JtCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tPbjdiaXQoU3RyaW5nIG1lc3NhZ2UpIAotICAgIHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmdbXSBzdHJzID0gc3BsaXQobWVzc2FnZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdHJzW2ldOwotICAgICAgCi0gICAgICAvLyBjaGVjayBzdHJpbmcgbGVuZ3RoCi0gICAgICBpZihzdHIubGVuZ3RoKCkgPiA5OTgpIAotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGxlbmd0aCAoIiArIHN0ci5sZW5ndGgoKSArIAotICAgICAgICAgICAgIikgb2YgdGhlIGxpbmUgKCIgKyAoaSsxKSArICIpIGdyZWF0ZXIgdGhhbiA5OTgiKTsKLSAgICAgIH0KLSAgICAgIC8vIE5vIG9jdGV0cyB3aXRoIGRlY2ltYWwgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxMjcKLSAgICAgIC8vIGFyZSBhbGxvd2VkIGFuZCBuZWl0aGVyIGFyZSBOVUxzIChvY3RldHMgd2l0aCBkZWNpbWFsIHZhbHVlIDApLiAgQ1IKLSAgICAgIC8vKGRlY2ltYWwgdmFsdWUgMTMpIGFuZCBMRiAoZGVjaW1hbCB2YWx1ZSAxMCkgb2N0ZXRzIG9ubHkgb2NjdXIgYXMKLSAgICAgIC8vIHBhcnQgb2YgQ1JMRiBsaW5lIHNlcGFyYXRpb24gc2VxdWVuY2VzLgotICAgICAgY2hhcltdIGNoYXJzID0gc3RyLnRvQ2hhckFycmF5KCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBpZigoY2hhcnNbal0gPiAxMjcpIHx8IChjaGFyc1tqXSA9PSAwKSB8fCAKLSAgICAgICAgICAgIChjaGFyc1tqXSA9PSAxMCkgfHwgKGNoYXJzW2pdID09IDEzKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgY2hhciAoIiArIGNoYXJzW2pdICsgCi0gICAgICAgICAgICAgICIpW2NvZGU9IiArIChieXRlKSBjaGFyc1tqXSArICIgcG9zaXRpb249IiArIGogKyAKLSAgICAgICAgICAgICAgIl0gZG9lcyBub3QgYWxsb3dzIGluIDdiaXQgZW5jb2RpbmcgY29udGVudCIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFuIDhiaXQgZW5jb2RlZCBtZXNzYWdlIChSRkMyMDQ1KQotICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGNoZWNrCi0gICAqIEB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBpZiBtZXNzYWdlIGRvZXMgbm90IGNvbmZvcm0KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja09uOGJpdChTdHJpbmcgbWVzc2FnZSkgCi0gICAgdGhyb3dzIEFzc2VydGlvbkZhaWxFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1tdIHN0cnMgPSBzcGxpdChtZXNzYWdlKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHN0cnNbaV07Ci0gICAgICAKLSAgICAgIC8vIGNoZWNrIHN0cmluZyBsZW5ndGgKLSAgICAgIGlmKHN0ci5sZW5ndGgoKSA+IDk5OCkgCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgbGVuZ3RoICgiICsgc3RyLmxlbmd0aCgpICsgCi0gICAgICAgICAgICAiKSBvZiB0aGUgbGluZSAoIiArIChpKzEpICsgIikgZ3JlYXRlciB0aGFuIDk5OCIpOwotICAgICAgfQotICAgICAgLy8gb2N0ZXRzIHdpdGggZGVjaW1hbCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNwotICAgICAgLy8gbWF5IGJlIHVzZWQuICBBcyB3aXRoICI3Yml0IGRhdGEiIENSIGFuZCBMRiBvY3RldHMgb25seSBvY2N1ciBhcyBwYXJ0Ci0gICAgICAvLyBvZiBDUkxGIGxpbmUgc2VwYXJhdGlvbiBzZXF1ZW5jZXMgYW5kIG5vIE5VTHMgYXJlIGFsbG93ZWQuIAotICAgICAgY2hhcltdIGNoYXJzID0gc3RyLnRvQ2hhckFycmF5KCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBpZigoY2hhcnNbal0gPT0gMCkgfHwgKGNoYXJzW2pdID09IDEwKSB8fCAoY2hhcnNbal0gPT0gMTMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBjaGFyICgiICsgY2hhcnNbal0gKyAKLSAgICAgICAgICAgICAgIilbY29kZT0iICsgKGJ5dGUpIGNoYXJzW2pdICsgIiBwb3NpdGlvbj0iICsgaiArIAotICAgICAgICAgICAgICAiXSBkb2VzIG5vdCBhbGxvd3MgaW4gOGJpdCBlbmNvZGluZyBjb250ZW50Iik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgYSBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZSAoUkZDMjA0NSkKLSAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBjaGVjawotICAgKiBAdGhyb3dzIEFzc2VydGlvbkZhaWxFeGNlcHRpb24gaWYgbWVzc2FnZSBkb2VzIG5vdCBjb25mb3JtCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tPblF1b3RlZFByaW50YWJsZShTdHJpbmcgbWVzc2FnZSkKLSAgICB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nW10gc3RycyA9IHNwbGl0KG1lc3NhZ2UpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICAvLyBjaGVjayBsZW5ndGgKLSAgICAgIC8vIFJGQzIwNDUKLSAgICAgIC8vICg1KSAgIChTb2Z0IExpbmUgQnJlYWtzKSBUaGUgUXVvdGVkLVByaW50YWJsZSBlbmNvZGluZwotICAgICAgLy9SRVFVSVJFUyB0aGF0IGVuY29kZWQgbGluZXMgYmUgbm8gbW9yZSB0aGFuIDc2Ci0gICAgICAvL2NoYXJhY3RlcnMgbG9uZy4gIElmIGxvbmdlciBsaW5lcyBhcmUgdG8gYmUgZW5jb2RlZAotICAgICAgLy93aXRoIHRoZSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kaW5nLCAic29mdCIgbGluZSBicmVha3MKLSAgICAgIC8vbXVzdCBiZSB1c2VkLiAgQW4gZXF1YWwgc2lnbiBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIgb24gYQotICAgICAgLy9lbmNvZGVkIGxpbmUgaW5kaWNhdGVzIHN1Y2ggYSBub24tc2lnbmlmaWNhbnQgKCJzb2Z0IikKLSAgICAgIC8vbGluZSBicmVhayBpbiB0aGUgZW5jb2RlZCB0ZXh0LgotICAgICAgaWYoKChzdHJzW2ldLmluZGV4T2YoIlx0IikgIT0gLTEpIHx8IChzdHJzW2ldLmluZGV4T2YoIiAiKSAhPSAtMSkpICYmCi0gICAgICAgICAgKHN0cnNbaV0ubGVuZ3RoKCkgPiA3NikpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgbGVuZ3RoICgiICsgc3Ryc1tpXS5sZW5ndGgoKSArIAotICAgICAgICAgICAgIikgb2YgdGhlIGxpbmUgKCIgKyAoaSsxKSArIAotICAgICAgICAgICAgIikgZ3JlYXRlciB0aGFuIDc2LCBcInNvZnRcIiBsaW5lIGJyZWFrcyBtdXN0IGJlIHVzZWQiKTsKLSAgICAgIH0KLQotICAgICAgY2hhcltdIGNoYXJzID0gc3Ryc1tpXS50b0NoYXJBcnJheSgpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGFycy5sZW5ndGg7IGorKykKLSAgICAgIHsKLSAgICAgICAgLy8oMSkgICAoR2VuZXJhbCA4Yml0IHJlcHJlc2VudGF0aW9uKSBBbnkgb2N0ZXQsIGV4Y2VwdCBhIENSIG9yCi0gICAgICAgIC8vTEYgdGhhdCBpcyBwYXJ0IG9mIGEgQ1JMRiBsaW5lIGJyZWFrIG9mIHRoZSBjYW5vbmljYWwKLSAgICAgICAgLy8oc3RhbmRhcmQpIGZvcm0gb2YgdGhlIGRhdGEgYmVpbmcgZW5jb2RlZCwgbWF5IGJlCi0gICAgICAgIC8vcmVwcmVzZW50ZWQgYnkgYW4gIj0iIGZvbGxvd2VkIGJ5IGEgdHdvIGRpZ2l0Ci0gICAgICAgIC8vaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9jdGV0J3MgdmFsdWUuICBUaGUKLSAgICAgICAgLy9kaWdpdHMgb2YgdGhlIGhleGFkZWNpbWFsIGFscGhhYmV0LCBmb3IgdGhpcyBwdXJwb3NlLAotICAgICAgICAvL2FyZSAiMDEyMzQ1Njc4OUFCQ0RFRiIuICBVcHBlcmNhc2UgbGV0dGVycyBtdXN0IGJlCi0gICAgICAgIC8vdXNlZDsgbG93ZXJjYXNlIGxldHRlcnMgYXJlIG5vdCBhbGxvd2VkLiAgVGh1cywgZm9yCi0gICAgICAgIC8vZXhhbXBsZSwgdGhlIGRlY2ltYWwgdmFsdWUgMTIgKFVTLUFTQ0lJIGZvcm0gZmVlZCkgY2FuCi0gICAgICAgIC8vYmUgcmVwcmVzZW50ZWQgYnkgIj0wQyIsIGFuZCB0aGUgZGVjaW1hbCB2YWx1ZSA2MSAoVVMtCi0gICAgICAgIC8vQVNDSUkgRVFVQUwgU0lHTikgY2FuIGJlIHJlcHJlc2VudGVkIGJ5ICI9M0QiLiAgVGhpcwotICAgICAgICAvL3J1bGUgbXVzdCBiZSBmb2xsb3dlZCBleGNlcHQgd2hlbiB0aGUgZm9sbG93aW5nIHJ1bGVzCi0gICAgICAgIC8vYWxsb3cgYW4gYWx0ZXJuYXRpdmUgZW5jb2RpbmcuCi0gICAgICAgIC8vICgyKSAgIChMaXRlcmFsIHJlcHJlc2VudGF0aW9uKSBPY3RldHMgd2l0aCBkZWNpbWFsIHZhbHVlcyBvZgotICAgICAgICAvLzMzIHRocm91Z2ggNjAgaW5jbHVzaXZlLCBhbmQgNjIgdGhyb3VnaCAxMjYsIGluY2x1c2l2ZSwKLSAgICAgICAgLy9NQVkgYmUgcmVwcmVzZW50ZWQgYXMgdGhlIFVTLUFTQ0lJIGNoYXJhY3RlcnMgd2hpY2gKLSAgICAgICAgLy9jb3JyZXNwb25kIHRvIHRob3NlIG9jdGV0cyAoRVhDTEFNQVRJT04gUE9JTlQgdGhyb3VnaAotICAgICAgICAvL0xFU1MgVEhBTiwgYW5kIEdSRUFURVIgVEhBTiB0aHJvdWdoIFRJTERFLAotICAgICAgICAvL3Jlc3BlY3RpdmVseSkuCi0gICAgICAgIGlmKChjaGFyc1tqXSA9PSA2MSkgJiYgKGNoYXJzLmxlbmd0aCA+IGorMikpIAotICAgICAgICB7Ci0gICAgICAgICAgaWYoIWlzSGV4KGNoYXJzW2orMV0pIHx8ICFpc0hleChjaGFyc1tqKzJdKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigidGhlIHF1b3RlZCBjaGFyICgiICsgCi0gICAgICAgICAgICAgICAgIGNoYXJzW2pdICsgY2hhcnNbaisxXSArIGNoYXJzW2orMl0gKyAiKSBpcyBpbmNvcnJlY3QiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaiArPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgLy8gY2hlY2sgZm9yIHNwYWNlIGFuZCB0YWIKLSAgICAgICAgZWxzZSBpZigoY2hhcnNbal0gIT0gOSkgJiYgKGNoYXJzW2pdICE9IDMyKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGNoZWNrIGludmFsaWQgc3ltYm9sCi0gICAgICAgICAgaWYoKGNoYXJzW2pdID09IDApIHx8IChjaGFyc1tqXSA9PSAxMCkgfHwgKGNoYXJzW2pdID09IDEzKSB8fAotICAgICAgICAgICAgIChjaGFyc1tqXSA8IDMzKSB8fCAoY2hhcnNbal0gPiAxMjYpIHx8IChjaGFyc1tqXSA9PSA2MSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBjaGFyICgiICsgY2hhcnNbal0gKyAKLSAgICAgICAgICAgICAgICAiKVtjb2RlPSIgKyAoYnl0ZSkgY2hhcnNbal0gKyAiIHBvc2l0aW9uPSIgKyBqICsgCi0gICAgICAgICAgICAgICAgIl0gbXVzdCBiZSBxdW90ZWQiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgYSBiYXNlNjQgZW5jb2RlZCBtZXNzYWdlIChSRkMzNTQ4KQotICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGNoZWNrCi0gICAqIEB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBpZiBtZXNzYWdlIGRvZXMgbm90IGNvbmZvcm0KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja09uQmFzZTY0KFN0cmluZyBtZXNzYWdlKQotICB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nW10gc3RycyA9IHNwbGl0KG1lc3NhZ2UpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3Ryc1tpXTsKLSAgICAgIAotICAgICAgLy8gY2hlY2sgc3RyaW5nIGxlbmd0aAotICAgICAgaWYoc3RyLmxlbmd0aCgpID4gNzYpIAotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGxlbmd0aCAoIiArIHN0ci5sZW5ndGgoKSArIAotICAgICAgICAgICAgIikgb2YgdGhlIGxpbmUgKCIgKyAoaSsxKSArICIpIGdyZWF0ZXIgdGhhbiA5OTgiKTsKLSAgICAgIH0KLSAgICAgIC8vIGNoZWNrIGZvciAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS8rIgotICAgICAgY2hhcltdIGNoYXJzID0gc3RyLnRvQ2hhckFycmF5KCk7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoYXJzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBjaGFyIGMgPSBjaGFyc1tpXTsKLSAgICAgICAgaWYoKGMgPCA0NykgfHwgKGMgPiAxMjIpIHx8ICgoYyA+IDU3KSAmJiAoYyA8IDY1KSkgfHwgCi0gICAgICAgICAgICgoYyA+IDkwKSAmJiAoYyA8IDk3KSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGNoYXIgKCIgKyBjaGFyc1tqXSArIAotICAgICAgICAgICAgICAiKVtjb2RlPSIgKyAoYnl0ZSkgY2hhcnNbal0gKyAiIHBvc2l0aW9uPSIgKyBqICsgCi0gICAgICAgICAgICAgICJdIGRvZXMgbm90IGFsbG93cyBpbiBiYXNlNjQgZW5jb2RpbmcgY29udGVudCIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogc3BsaXQgc3RyaW5nIHRvIGFycmF5IG9mIHN0cmluZ3MgYW5kIHVzZSBhcyBkZWxpbWV0ZXIgQ1JMRgotICAgKiBAcGFyYW0gc3RyIG9yaWdpbmFsIHN0cmluZwotICAgKiBAcmV0dXJuIGFycmF5IG9mIHN0cmluZ3MKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHN0cikKLSAgewotICAgIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvcihpbnQgaWR4ID0gc3RyLmluZGV4T2YoIlxyXG4iKTsgaWR4ICE9IC0xOyBpZHggPSBzdHIuaW5kZXhPZigiXHJcbiIpKQotICAgIHsKLSAgICAgIGxpc3QuYWRkKHN0ci5zdWJzdHJpbmcoMCwgaWR4KSk7Ci0gICAgICBzdHIgPSBzdHIuc3Vic3RyaW5nKGlkeCsyKTsKLSAgICB9Ci0gICAgbGlzdC5hZGQoc3RyKTsKLSAgICByZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIGJ5dGUgaXMgIjAxMjM0NTY3ODlBQkNERUYiIHJhbmdlLCBmYWxzZSBvdGhld2lzZQotICAgKiBAcGFyYW0gYyBjaGFyCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBieXRlIGlzICIwMTIzNDU2Nzg5QUJDREVGIiByYW5nZSwgZmFsc2Ugb3RoZXdpc2UKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc0hleChjaGFyIGMpIHsKLSAgICByZXR1cm4gKCgoYyA+PSA0OCkgJiYgKGMgPD0gNTcpKSB8fCAoKGMgPj0gNjUpICYmIChjIDw9IDcwKSkpOyAKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTM2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTkzNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjhhZTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTM2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotLyoqCi0gKiBBUDE5MzYKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkluIGEgbWVzc2FnZSwgYWxsIE1JTUUgZW5jYXBzdWxhdGlvbiBib3VuZGFyeSBzdHJpbmdzIAotICogYXJlIHByZWNlZGVkIHdpdGggdGhlIGFzY2lpIGNoYXJhY3RlcnMgQ1IgKDEzKSBhbmQgTEYgKDEwKSAKLSAqIGluIHRoYXQgc2VxdWVuY2UuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTkzNiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEFQMTkzNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBpZiBib3VuZGFyeSBlcXVhbHMgbnVsbCwgdGhlbiByZXN1bHQgaXMgbm90IGFwcGxpY2FibGUKLSAgICBpZiAoIWVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9ICAgIAotICAgIC8vIG90aGVyd2lzZSBpdCBpcyB0cnVlIC0tIGNoZWNrZWQgaW4gbW9uaXRvcgotICAgIC8vIE1pbWVQYXJ0cyBtaW1lUGFydHMgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWltZVBhcnRzKCk7Ci0gICAgLy8gSXRlcmF0b3IgaSA9IG1pbWVQYXJ0cy5nZXRQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgLy8gYm9vbGVhbiBpbnZhbGlkQm91bmRhcnlTdHJpbmdGb3VuZCA9IGZhbHNlOwotICAgIC8vd2hpbGUgKGkuaGFzTmV4dCgpICYmICFpbnZhbGlkQm91bmRhcnlTdHJpbmdGb3VuZCkKLSAgICAvL3sKLSAgICAvLwlNaW1lUGFydCBwYXJ0ID0gKE1pbWVQYXJ0KWkubmV4dCgpOwotICAgIC8vCVN0cmluZ1tdIGJvdW5kYXJpZXMgPSBwYXJ0LmdldEJvdW5kYXJ5U3RyaW5ncygpOwotICAgIC8vCWZvciAoaW50IGogPSAwOyBqPGJvdW5kYXJpZXMubGVuZ3RoOyBqKyspCi0gICAgLy8JewotICAgIC8vCQlpZiAoIWJvdW5kYXJpZXNbal0uc3RhcnRzV2l0aCgiJiN4ZDtcbiIpKQotICAgIC8vCQl7Ci0gICAgLy8JCQlpbnZhbGlkQm91bmRhcnlTdHJpbmdGb3VuZCA9IHRydWU7Ci0gICAgLy8JCQlyZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAvLwkJCWZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChib3VuZGFyaWVzW2pdLCBlbnRyeUNvbnRleHQpOwotICAgIC8vCQkJYnJlYWs7Ci0gICAgLy8JCX0KLSAgICAvLwl9Ci0gICAgLy99Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTk0Mi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDE5NDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiNzk3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTk0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWltZVBhcnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1JTUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTUlNRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogQVAxOTQyCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHBhcnQgb2YgYSBtdWx0aXBhcnQvcmVsYXRlZCBtZXNzYWdlIHRoYXQgaXMgYm91bmQKLSAqIHRvIGEgbWltZTpjb250ZW50IHRoYXQgcmVmZXJzIHRvIGdsb2JhbCBlbGVtZW50IGRlY2xhcmF0aW9uICh2aWEgdGhlIGVsZW1lbnQKLSAqIGF0dHJpYnV0ZSBvZiB0aGUgd3NkbDpwYXJ0IGVsZW1lbnQpPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBib3VuZCBtZXNzYWdlIHBhcnQgaXMgc2VyaWFsaXplZCB3aXRoaW4gdGhlIE1JTUUKLSAqIHBhcnQgYXMgYSBzZXJpYWxpemF0aW9uIG9mIGFuIFhNTCBpbmZvc2V0IHdob3NlIHJvb3QgZWxlbWVudCBpcyBkZXNjcmliZWQgYnkKLSAqIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTk0MiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTk0MihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoIWVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0gICAgICB7Ci0gICAgICAJdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgIAlNaW1lUGFydHMgbWltZVBhcnRzID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpOwotICAgICAgCi0gICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gbm9uLXJvb3QgTUlNRSBwYXJ0cwotICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICAgIGlmIChtaW1lUGFydHMuY291bnQoKTwgMikKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgCi0gICAgICAgIC8vIEdldHRpbmcgYW4gb3BlcmF0aW9uIG1hdGNoZWQgZm9yIGEgbWVzc2FnZQotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSB2YWxpZGF0b3IuZ2V0T3BlcmF0aW9uTWF0Y2goCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlUeXBlKCksCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCkpOwotICAgICAgICAvLyBJZiBubyBvbmUgb3BlcmF0aW9uIG1hdGNoZXMsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgICAgLy8gR2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGFuZCBtZXNzYWdlCi0gICAgICAgIExpc3QgZXh0RWxlbXM7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgICAgaWYgKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QKLSAgICAgICAgICAuZXF1YWxzKGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIGV4dEVsZW1zID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKSA9PSBudWxsID8gbnVsbAotICAgICAgICAgICAgOiBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgIG1lc3NhZ2UgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgIDogYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBleHRFbGVtcyA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICA6IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgIG1lc3NhZ2UgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICA6IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgICAvLyBtaW1lOmNvbnRlbnQgZWxlbWVudCB0aGF0IHJlZmVycyB0byBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbiAKLSAgICAgICAgYm9vbGVhbiBtaW1lQ29udGVudEZvdW5kID0gZmFsc2U7Ci0gICAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG1lc3NhZ2UgTUlNRSBwYXJ0cwotICAgICAgICBJdGVyYXRvciBpTWltZVBhcnRzID0gbWltZVBhcnRzLmdldFBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICB3aGlsZSAoaU1pbWVQYXJ0cy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgIAkgIGkgPSBpICsgMTsKLSAgICAgICAgICAvLyBHZXR0aW5nIGEgTUlNRSBwYXJ0Ci0gICAgICAgICAgTWltZVBhcnQgbWltZVBhcnQgPSAoTWltZVBhcnQpaU1pbWVQYXJ0cy5uZXh0KCk7Ci0gICAgICAgICAgLy8gR2V0dGluZyBhIHBhcnQgbmFtZSBmb3JtIHRoZSBDb250ZW50LUlEIGhlYWRlcgotICAgICAgICAgIFN0cmluZyBwYXJ0TmFtZSA9IE1JTUVVdGlscy5nZXRNaW1lSGVhZGVyQXR0cmlidXRlKAotICAgICAgICAgICAgbWltZVBhcnQuZ2V0SGVhZGVycygpLCBNSU1FQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0lEKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaWR4ID0gcGFydE5hbWUuaW5kZXhPZigiPSIpOwotICAgICAgICAgICAgaWYoKGlkeCAhPSAtMSkgJiYgcGFydE5hbWUuc3RhcnRzV2l0aCgiPCIpKQotICAgICAgICAgICAgICBwYXJ0TmFtZSA9IGVuY29kZVBhcnROYW1lKHBhcnROYW1lLnN1YnN0cmluZygxLCBpZHgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvdWxkIG5vdCBleHRyYWN0IGEgcGFydCBuYW1lIGZyb20gdGhlIGhlYWRlciwKLSAgICAgICAgICAgIC8vIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBNSU1FIHBhcnQKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IGlzIGJvdW5kIGJ5IGEgbWltZTpjb250ZW50IGVsZW1lbnQKLSAgICAgICAgICBpZiAoYm91bmRUb01pbWVDb250ZW50KGV4dEVsZW1zLCBwYXJ0TmFtZSkgJiYgbWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcGFydAotICAgICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIG1lc3NhZ2UuZ2V0UGFydHMoKS5nZXQocGFydE5hbWUpOwotICAgICAgICAgICAgUU5hbWUgcmVmTmFtZTsKLSAgICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IHJlZmVycyB0byBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbgotICAgICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCAmJiAocmVmTmFtZSA9IHBhcnQuZ2V0RWxlbWVudE5hbWUoKSkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWltZUNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgIC8vIFRyeWluZyB0byBwYXJzZSBwYXJ0IGNvbnRlbnQKLSAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBYTUxVdGlscy5wYXJzZVhNTChtaW1lUGFydC5nZXRDb250ZW50KCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgbm90IGFuIFhNTCBpbmZvc2V0LCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgICAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGJvdW5kIG1lc3NhZ2UgcGFydCBvZiB0aGUgIgotICAgICAgICAgICAgICAgICAgKyAiTUlNRSBwYXJ0IG51bWJlciAiICsgKGkgKyAxKSArICIgaXMgaW52YWxpZCBYTUwgaW5mb3NldC4iKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAvLyBDcmVhdGluZyBhIFFOYW1lIG9iamVjdCBvZiB0aGUgcm9vdCBlbGVtZW50Ci0gICAgICAgICAgICAgIFFOYW1lIHJvb3ROYW1lID0gbmV3IFFOYW1lKAotICAgICAgICAgICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgICBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0TG9jYWxOYW1lKCkpOwotICAgICAgICAgICAgICAvLyBJZiB0aGUgbmFtZXMgb2YgdGhlIHJvb3QgZWxlbWVudCBhbmQgdGhlIHJlZmVyZW5jZWQgZWxlbWVudAotICAgICAgICAgICAgICAvLyBhcmUgbm90IGVxdWFsLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgICAgICBpZiAoIXJlZk5hbWUuZXF1YWxzKHJvb3ROYW1lKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgcm9vdCBlbGVtZW50IG5hbWUgaXMgIgotICAgICAgICAgICAgICAgICAgKyByb290TmFtZSArICIsIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgaXMgIgotICAgICAgICAgICAgICAgICAgKyByZWZOYW1lICsgIi4iKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBJZiBubyBtaW1lOmNvbnRlbnRTIGZvdW5kLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICAgIGlmICghbWltZUNvbnRlbnRGb3VuZCkKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhIHBhcnQgaXMgYm91bmQgYnkgYSBtaW1lOmNvbnRlbnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gcGFydCBhIHBhcnQgbmFtZS4KLSAgICogQHJldHVybiB0cnVlIGlmIGEgcGFydCBpcyBib3VuZCBieSBtaW1lOmNvbnRlbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBib3VuZFRvTWltZUNvbnRlbnQoTGlzdCBleHRFbGVtcywgU3RyaW5nIHBhcnQpCi0gIHsKLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCAmJiBleHRFbGVtcy5zaXplKCkgPiAwKQotICAgIHsKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldCgwKTsKLSAgICAgIC8vIEV4cGVjdGVkIHRoZSBmaXJzdCBleHQgZWxlbSBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9NVUxUSVBBUlQpKQotICAgICAgewotICAgICAgICAvLyBHZXR0aW5nIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgb2YgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbWVQYXJ0cy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIG1pbWU6cGFydCBlbGVtZW50IG5lZWRlZAotICAgICAgICAgIExpc3QgZWxlbXMgPSAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGkpKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICBpZiAoZWxlbXMuc2l6ZSgpID4gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBmaXJzdCBlbGVtZW50Ci0gICAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBlbGVtcy5nZXQoMCk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBtaW1lOmNvbnRlbnQgYW5kIGl0IGJpbmRzIGEgcGFydAotICAgICAgICAgICAgaWYgKGVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX0NPTlRFTlQpCi0gICAgICAgICAgICAgICYmIHBhcnQuZXF1YWxzKCgoTUlNRUNvbnRlbnQpZWxlbSkuZ2V0UGFydCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEVuY29kZSBzdHJpbmcgZnJvbSAlSEggdG8gVVRGCi0gICAqIEBwYXJhbSBzdHIgc3RyaW5nCi0gICAqIEByZXR1cm4gZW5jb2RlZCBzdHJpbmcgZnJvbSAlSEggZm9ybWF0Ci0gICAqLwotICBwcml2YXRlIFN0cmluZyBlbmNvZGVQYXJ0TmFtZShTdHJpbmcgc3RyKSB7Ci0gICAgU3RyaW5nQnVmZmVyIHJlcyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgaWYoKHN0ci5jaGFyQXQoaSkgPT0gJyUnKSAmJiAoc3RyLmxlbmd0aCgpID4gaSsyKSkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzdHIuY2hhckF0KGkrMSkpICsKLSAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2Yoc3RyLmNoYXJBdChpKzIpKSwgMTYpOwotICAgICAgICAgIHJlcy5hcHBlbmQoKGNoYXIpIHZhbHVlKTsKLSAgICAgICAgICBpICs9MjsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSl7fQotICAgICAgfSAKLSAgICAgIGVsc2UgCi0gICAgICB7Ci0gICAgICAgIHJlcy5hcHBlbmQoc3RyLmNoYXJBdChpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXMudG9TdHJpbmcoKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTQ1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTk0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJmMzEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTQ1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotCi0vKioKLSAqIEFQMTk0NQotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2U8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIENvbnRlbnQtVHlwZSBIVFRQIGhlYWRlciBmaWVsZC12YWx1ZSBpbiBhIG1lc3NhZ2UgCi0gKiBpcyBlaXRoZXIgIm11bHRpcGFydC9yZWxhdGVkIiBvciAidGV4dC94bWwiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDE5NDUgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBBUDE5NDUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGhlYWRlck5hbWUgPSBIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEU7Ci0KLSAgICAvLyBHZXR0aW5nIGEgaGVhZGVyCi0gICAgU3RyaW5nIGhlYWRlclZhbHVlID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJBdHRyaWJ1dGUoCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpLAotICAgICAgICBoZWFkZXJOYW1lKTsKLSAgICAvLyBJZiBoZWFkZXJWYWx1ZSBpcyBudWxsLCB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgaWYgKGhlYWRlclZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9IAotICAgIC8vIElmIHRoZSBoZWFkZXIgaXMgIm11bHRpcGFydC9yZWxhdGVkIiBvciAidGV4dC94bWwiLAotICAgIC8vIHRoZW4gdGhlIGFzc2VydGlvbiBwYXNzZWQKLSAgICBlbHNlIGlmIChoZWFkZXJWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFdTSUNvbnN0YW50cy5DT05URU5UX1RZUEVfTVVMVElQQVJUKQotICAgICAgICB8fCBoZWFkZXJWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFdTSUNvbnN0YW50cy5DT05URU5UX1RZUEVfVEVYVF9YTUwpKQotICAgIHsKLSAgICB9Ci0gICAgLy8gZWxzZSB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgIGVsc2UgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgaGVhZGVyVmFsdWUsIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTQ2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQMTk0Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWYwZjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVAxOTQ2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotLyoqCi0gKiBBUDE5NDYKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgbXVsdGlwYXJ0L3JlbGF0ZWQgbWVzc2FnZQotICogY29udGFpbmluZyBub24tcm9vdCBwYXJ0czwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgY2FuZGlkYXRlIG11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2UKLSAqIGNvbnRhaW5pbmcgbm9uLXJvb3QgcGFydHMuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMTk0NiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMTk0NihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBNSU1FIHBhcnRzLCB0aGUgYXNzZXJ0aW9uIHBhc3NlZCAKLSAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1pbWVQYXJ0cygpLmNvdW50KCkgPiAxKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLmdldERldGFpbERlc2NyaXB0aW9uKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQNTEwMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9BUDUxMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUwZTY2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQNTEwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQNTEwMAotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSAgbm9uLW11bHRpcGFydC9yZWxhdGVkIG1lc3NhZ2UgaW4gdGhlIGxvZyBmaWxlLCB3aXRoIGFuIEhUVFAgZW50aXR5LWJvZHkuPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBTT0FQIGVudmVsb3BlIGlzIHRoZSBleGNsdXNpdmUgcGF5bG9hZCBvZiB0aGUgSFRUUCBlbnRpdHktYm9keS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICoKLSAqIEBhdXRob3IgbGF1em9uZAotICovCi1wdWJsaWMgY2xhc3MgQVA1MTAwIGV4dGVuZHMgU1NCUDUxMDAgCi17Ci0JLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0JICogQHBhcmFtIGltcGwKLQkgKi8KLQlwdWJsaWMgQVA1MTAwKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpIAotCXsKLQkJc3VwZXIoaW1wbCk7Ci0JfQotCi0JcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLQkgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLQkgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0JICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0JewotCSAgLy8gSWYgdGhlcmUgaXMgYSBTT0FQIE1lc3NhZ2Ugd2l0aCBBdHRhY2htZW50cywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotCSAgaWYgKGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5pc01pbWVDb250ZW50KCkpCi0JICB7Ci0JICAJcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSwgZmFpbHVyZURldGFpbCk7Ci0JICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzdXBlci52YWxpZGF0ZSh0ZXN0QXNzZXJ0aW9uLCBlbnRyeUNvbnRleHQpOwotCSAgfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVA1MTAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0FQNTEwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmEyY2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQVA1MTAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIHBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQNTEwMQotICogPGNvbnRleHQ+Rm9yIGEgbm9uLW11bHRpcGFydC9yZWxhdGVkIGNhbmRpZGF0ZSBtZXNzYWdlIGluIHRoZSBsb2cgZmlsZS48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QSBtZXNzYWdlIG11c3QgaGF2ZSBhICJDb250ZW50LVR5cGUiIEhUVFAgaGVhZGVyIGZpZWxkLiAgVGhlICJDb250ZW50LVR5cGUiIEhUVFAgaGVhZGVyIGZpZWxkIG11c3QgaGF2ZSBhIGZpZWxkLXZhbHVlIHdob3NlIG1lZGlhIHR5cGUgaXMgInRleHQveG1sIi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICogCi0gKiBAYXV0aG9yIGxhdXpvbmQKLSAqLwotcHVibGljIGNsYXNzIEFQNTEwMSBleHRlbmRzIFNTQlA1MTAxIHsKLQotCS8qKgotCSAqIEBwYXJhbSBpbXBsCi0JICovCi0JcHVibGljIEFQNTEwMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKSAKLQl7Ci0JCXN1cGVyKGltcGwpOwotCX0KLQotCXB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0JICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0JICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotCSAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotCXsKLQkgIC8vIElmIHRoZXJlIGlzIGEgU09BUCBNZXNzYWdlIHdpdGggQXR0YWNobWVudHMsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLQkgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuaXNNaW1lQ29udGVudCgpKQotCSAgewotCSAgCXJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEUsIGZhaWx1cmVEZXRhaWwpOwotCSAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gc3VwZXIudmFsaWRhdGUodGVzdEFzc2VydGlvbiwgZW50cnlDb250ZXh0KTsKLQkgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiY2JjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5NZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBCUDEwMDEuCi0gKiBJZiBpdCBpcyBhIHJlcXVlc3QsIHRoZSBhcmcgIzIgb2YgUE9TVCBpcyAmbHQ7SFRUUC8xLjEmZ3Q7LiBJZiBhYnNlbnQsIGZpcnN0IGxpbmUgb2YgdGhlIAotICogYm9keSBpczogSFRUUC1WZXJzaW9uID0gSFRUUC8xLjEuIElmIGl0IGlzIGEgcmVzcG9uc2UsIGl0IHN0YXJ0cyB3aXRoICZsdDtIVFRQLzEuMSZndDsuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDEwMDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDEwMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGh0dHBIZWFkZXIgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKTsKLQotICAgIC8vIElmIHRoaXMgaXMgYSByZXF1ZXN0IG1lc3NhZ2UsIHRoZW4gY2hlY2sgUE9TVCBoZWFkZXIKLSAgICBpZiAoZW50cnlDb250ZXh0Ci0gICAgICAuZ2V0TWVzc2FnZUVudHJ5KCkKLSAgICAgIC5nZXRUeXBlKCkKLSAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpKQotICAgIHsKLSAgICAgIFZlY3RvciByZXF1ZXN0TGluZTsKLSAgICAgIGlmICgoKHJlcXVlc3RMaW5lID0gdGhpcy52YWxpZGF0b3IuZ2V0UG9zdFJlcXVlc3QoaHR0cEhlYWRlcikpID09IG51bGwpCi0gICAgICAgIHx8IChyZXF1ZXN0TGluZS5zaXplKCkgPT0gMCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBtZXRob2QgPSAoU3RyaW5nKSByZXF1ZXN0TGluZS5nZXQoMCk7Ci0gICAgICAgIC8vU3RyaW5nIHJlcXVlc3RVUkkgPSAoU3RyaW5nKSByZXF1ZXN0TGluZS5nZXQoMSk7Ci0gICAgICAgIFN0cmluZyBodHRwVmVyc2lvbiA9IChTdHJpbmcpIHJlcXVlc3RMaW5lLmdldCgyKTsKLQotICAgICAgICAvL0ZvciBlYWNoIHJlcXVlc3QgbWVzc2FnZSB0aGF0IGlzIGFuIEhUVFAgUE9TVAotICAgICAgICBpZiAobWV0aG9kLmVxdWFscyhNZXNzYWdlVmFsaWRhdG9yLkhUVFBfUE9TVCkgJiYgaHR0cFZlcnNpb24gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChodHRwVmVyc2lvbi5lcXVhbHMoTWVzc2FnZVZhbGlkYXRvci5IVFRQX1ZFUlNJT05fMV8xKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGh0dHBIZWFkZXIsIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT3RoZXJ3aXNlIGl0IG11c3QgYmUgYSByZXNwb25zZQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaHR0cEhlYWRlci5zdGFydHNXaXRoKE1lc3NhZ2VWYWxpZGF0b3IuSFRUUF9WRVJTSU9OXzFfMSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGh0dHBIZWFkZXIsIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NjRjMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NZXNzYWdlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5NZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBCUDEwMDIuCi0gKiBJZiBpdCBpcyBhIHJlcXVlc3QsIHRoZSBhcmcgIzIgb2YgUE9TVCBpcyAmbHQ7SFRUUC8xLjEmZ3Q7IG9yICZsdDtIVFRQLzEuMCZndDsuIElmIGFic2VudCwgZmlyc3QgbGluZSAKLSAqIG9mIHRoZSBib2R5IGlzOiBIVFRQLVZlcnNpb24gPSBIVFRQLzEuMS4gKG9yIEhUVFAvMS4wKS4gSWYgaXQgaXMgYSByZXNwb25zZSwgaXQgc3RhcnRzIHdpdGggCi0gKiAmbHQ7SFRUUC8xLjEmZ3Q7IG9yICZsdDtIVFRQLzEuMCZndDsgb3IgaGlnaGVyOwotICovCi1wdWJsaWMgY2xhc3MgQlAxMDAyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMDAyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBodHRwSGVhZGVyID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCk7Ci0KLSAgICAvLyBJZiB0aGlzIGlzIGEgcmVxdWVzdCBtZXNzYWdlLCB0aGVuIGNoZWNrIFBPU1QgZm9yIDEuMSBvciAxLjAKLSAgICBpZiAoZW50cnlDb250ZXh0Ci0gICAgICAuZ2V0TWVzc2FnZUVudHJ5KCkKLSAgICAgIC5nZXRUeXBlKCkKLSAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKE1lc3NhZ2VFbnRyeS5UWVBFX1JFUVVFU1QpKQotICAgIHsKLSAgICAgIC8vIEdldCBlYWNoIGVudHJ5IGluIHRoZSBwb3N0IGhlYWRlcgotICAgICAgU3RyaW5nVG9rZW5pemVyIHBvc3RNZXNzYWdlID0gbmV3IFN0cmluZ1Rva2VuaXplcihodHRwSGVhZGVyLCAiIFxyXG4iKTsKLQotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gdGhpcmQgdG9rZW4sIHRoZW4gZmFpbAotICAgICAgaWYgKHBvc3RNZXNzYWdlLmNvdW50VG9rZW5zKCkgPCAzKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoaHR0cEhlYWRlciwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IHRoZSAzcmQgdG9rZW4gKHRoZXJlIG11c3QgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXM/KQotICAgICAgICBTdHJpbmcgaHR0cFZlcnNpb24gPSAiIjsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2VUeXBlID0gIiI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gTWVzc2FnZSB0eXBlCi0gICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgIG1lc3NhZ2VUeXBlID0gcG9zdE1lc3NhZ2UubmV4dFRva2VuKCk7Ci0gICAgICAgICAgZWxzZSBpZiAoaSA9PSAyKQotICAgICAgICAgICAgaHR0cFZlcnNpb24gPSBwb3N0TWVzc2FnZS5uZXh0VG9rZW4oKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwb3N0TWVzc2FnZS5uZXh0VG9rZW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbWVzc2FnZVR5cGUuZXF1YWxzKCJQT1NUIikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIHRoaXJkIHRva2VuIGlzIG5vdCBIVFRQLzEuMSBvdCBIVFRQLzEuMCwgdGhlbiBmYWlsCi0gICAgICAgIGVsc2UgaWYgKAotICAgICAgICAgICghaHR0cFZlcnNpb24uZXF1YWxzSWdub3JlQ2FzZShNZXNzYWdlVmFsaWRhdG9yLkhUVFBfVkVSU0lPTl8xXzEpKQotICAgICAgICAgICAgJiYgKCFodHRwVmVyc2lvbi5lcXVhbHNJZ25vcmVDYXNlKE1lc3NhZ2VWYWxpZGF0b3IuSFRUUF9WRVJTSU9OXzFfMCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoaHR0cEhlYWRlciwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIEVsc2UgaXQgaXMgYSByZXNwb25zZSBtZXNzYWdlCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFJlc3BvbnNlLUxpbmUgKDFzdCkgPSBIVFRQLVZlcnNpb24gU1AgUmVzcG9uc2UtY29kZSBTUCBSZXNwb25zZS10ZXh0IENSTEYKLSAgICAgIFN0cmluZ1Rva2VuaXplciBodHRwTWVzc2FnZVRva2VuaXplciA9Ci0gICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoaHR0cEhlYWRlciwgIlxuXHJcZiIpOwotCi0gICAgICBTdHJpbmcgc3RhcnRMaW5lID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpZiAoaHR0cE1lc3NhZ2VUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RhcnRMaW5lID0gaHR0cE1lc3NhZ2VUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSFRUUCB2ZXJzaW9uIGluZm8gZXhwZWN0ZWQgYnV0IG5vdCBmb3VuZAotICAgICAgICAgIC8vIChzdGF0ZSB0aGUgZmFjdCBpbiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2U/KQotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKGh0dHBIZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCBwcm90b2NvbCB2ZXJzaW9uIGluZGljYXRlcyBIVFRQLzEuMCBvciBIVFRQLzEuMQotICAgICAgICBpZiAoIXN0YXJ0TGluZS5zdGFydHNXaXRoKE1lc3NhZ2VWYWxpZGF0b3IuSFRUUF9WRVJTSU9OXzFfMSkKLSAgICAgICAgICAmJiAhc3RhcnRMaW5lLnN0YXJ0c1dpdGgoTWVzc2FnZVZhbGlkYXRvci5IVFRQX1ZFUlNJT05fMV8wKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKGh0dHBIZWFkZXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMDZhZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLk1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMTAwNC4gCi0gKiBUaGUgcmVxdWVzdCBtZXNzYWdlIGlzIGEgUE9TVCBtZXNzYWdlLCB3aXRob3V0IGFueSB1c2Ugb2YgZnJhbWV3b3JrIGV4dGVuc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAwNCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAwNChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgaHR0cEhlYWRlciA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpOwotICAgIFN0cmluZ1Rva2VuaXplciBodHRwTWVzc2FnZVRva2VuaXplciA9Ci0gICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGh0dHBIZWFkZXIsICJcblxyXGYiKTsKLQotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBQT1NUIG1lc3NhZ2UKLSAgICBpZiAoIWh0dHBIZWFkZXIuc3RhcnRzV2l0aChNZXNzYWdlVmFsaWRhdG9yLkhUVFBfUE9TVCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChodHRwSGVhZGVyLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIFN0cmluZyBsaW5lID0gbnVsbDsKLSAgICB3aGlsZSAoaHR0cE1lc3NhZ2VUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpCi0gICAgICAmJiAocmVzdWx0LmVxdWFscyhBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRCkpKQotICAgIHsKLSAgICAgIGxpbmUgPSBodHRwTWVzc2FnZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgIGlmICgobGluZSAhPSBudWxsKQotICAgICAgICAmJiAobGluZS5zdGFydHNXaXRoKCJNLVBPU1QiKSB8fCBsaW5lLnN0YXJ0c1dpdGgoIkV4dDoiKSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChodHRwSGVhZGVyLCBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0gLy9FbmQgV2hpbGUKLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDA2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY3Y2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMDA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotCi0KLS8qKgotICogQlAxMDA2LiAKLSAqLwotcHVibGljIGNsYXNzIEJQMTAwNiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAwNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBQYXJzZSB0aGUgSFRUUCBoZWFkZXIKLSAgICBTdHJpbmcgcmF3SFRUUEhlYWRlciA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpOwotICAgIE1hcCBodHRwSGVhZGVyID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMocmF3SFRUUEhlYWRlciwgIjoiKTsKLQotICAgIC8vIEdldCB0aGUgc29hcCBhY3Rpb24gaGVhZGVyCi0gICAgU3RyaW5nIHNvYXBBY3Rpb24gPSAoU3RyaW5nKSBodHRwSGVhZGVyLmdldCgiU09BUEFjdGlvbiIudG9VcHBlckNhc2UoKSk7Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBubyBzb2FwIGFjdGlvbiBoZWFkZXIsIHRoZW4gTkEKLSAgICBpZiAoc29hcEFjdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCEoc29hcEFjdGlvbi5zdGFydHNXaXRoKCJcIiIpKSB8fCAhKHNvYXBBY3Rpb24uZW5kc1dpdGgoIlwiIikpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgIkhUVFAgSGVhZGVyOiBcIiIgKyByYXdIVFRQSGVhZGVyICsgIlwiLiIsCi0gICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAxMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDEwMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhYzczNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTAxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuT3BlcmF0aW9uU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBCUDEwMTAuCi0gKiBJdCBNVVNUIE5PVCBjb250YWluIGEgU09BUCBFbnZlbG9wZTogdGhlIEhUVFAgZW50aXR5LWJvZHkgbXVzdCBiZSBlbXB0eS4KLSAqLwotcHVibGljIGNsYXNzIEJQMTAxMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTAxMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gUGFyc2UgcmVxdWVzdCBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2NSZXF1ZXN0ID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3REb2N1bWVudCgpOwotCi0gICAgICAvLyBnZXQgU09BUEFjdGlvbgotICAgICAgU3RyaW5nIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpCi0gICAgICAgIGFjdGlvbiA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsICI6IikuZ2V0KCJTT0FQQWN0aW9uIi50b1VwcGVyQ2FzZSgpKTsKLQotICAgICAgQmluZGluZyBiaW5kaW5nID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKVswXTsKLSAgICAgIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPQotICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLAotICAgICAgICAgIHZhbGlkYXRvcik7Ci0gICAgICBPcGVyYXRpb25TaWduYXR1cmUuT3BlcmF0aW9uTWF0Y2ggbWF0Y2ggPQotICAgICAgICBPcGVyYXRpb25TaWduYXR1cmUubWF0Y2hPcGVyYXRpb24oCi0gICAgICAgICAgZG9jUmVxdWVzdCwKLSAgICAgICAgICBhY3Rpb24sCi0gICAgICAgICAgYmluZGluZywKLSAgICAgICAgICByZWdpc3RyeSk7Ci0KLSAgICAgIGlmIChtYXRjaCA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCi0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG1hdGNoLmdldE9wZXJhdGlvbigpOwotICAgICAgICAvL2ZpbmQgb3BlcmF0aW9uIGluIHBvcnQgdHlwZQotICAgICAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG9wZXJhdGlvbi5nZXRPdXRwdXQoKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQpCi0gICAgICB7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKG51bGwsIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTEwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWVjYWMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLQotCi0vKioKLSAqIEJQMTEwMS4KLSAqIEEgcmVzcG9uc2UgbWVzc2FnZSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBTT0FQIG1lc3NhZ2UgU0hPVUxEIGJlIHNlbnQgCi0gKiB1c2luZyBlaXRoZXIgYSAiMjAwIE9LIiBvciAiMjAyIEFjY2VwdGVkIiBIVFRQIHN0YXR1cyBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgQlAxMTAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgQlAxMTAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyByZXNwb25zZSBkb2VzIG5vdCBjb250YWlucyBTT0FQIG1lc3NhZ2UKLSAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSA9PSBudWxsCi0gICAgICB8fCAiIi5lcXVhbHMoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSkpCi0gICAgewotICAgICAgLy8gY2hlY2sgSFRUUCBzdGF0dXMgY29kZSAKLSAgICAgIFN0cmluZyBodHRwU3RhdHVzID0KLSAgICAgICAgVXRpbHMuZ2V0SFRUUFN0YXR1c0NvZGUoCi0gICAgICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCkpOwotICAgICAgaWYgKCIyMDAiLmVxdWFscyhodHRwU3RhdHVzKSk7Ci0gICAgICBlbHNlIGlmICgiMjAyIi5lcXVhbHMoaHR0cFN0YXR1cykpOwotCi0gICAgICAvLyBJZiA0eHgsIHRoZW4gcmVzdWx0IGlzIG5vdEFwcGxpY2FibGUKLSAgICAgIGVsc2UgaWYgKGh0dHBTdGF0dXMuc3RhcnRzV2l0aCgiNCIpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAiXG5SZXNwb25zZSBtZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKQotICAgICAgICAgICAgICArICJNZXNzYWdlOlxuIgotICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gcmVzcG9uc2UgY29udGFpbnMgU09BUCBtZXNzYWdlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDA5MzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLQotCi0vKioKLSAqIEJQMTEwMy4KLSAqIFRoZSByZXF1ZXN0IG1lc3NhZ2Ugc2hvdWxkIG5vdCBjb250YWluIGEgUE9TVCBtZXRob2QuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDExMDMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDExMDMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIE1lc3NhZ2VFbnRyeSByZXF1ZXN0ID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKTsKLSAgICBTdHJpbmcgcmVxdWVzdEhlYWRlcnMgPSByZXF1ZXN0LmdldEhUVFBIZWFkZXJzKCk7Ci0KLSAgICAvLyBHZXQgSFRUUCBzdGF0dXMgY29kZQotICAgIFN0cmluZyBodHRwU3RhdHVzID0KLSAgICAgIFV0aWxzLmdldEhUVFBTdGF0dXNDb2RlKAotICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSk7Ci0KLSAgICBpZiAocmVxdWVzdEhlYWRlcnMuc3RhcnRzV2l0aCgiUE9TVCAiKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlIGlmICghIjQwNSIuZXF1YWxzKGh0dHBTdGF0dXMpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICJcblJlcXVlc3QgbWVzc2FnZTpcbkhlYWRlcnM6XG4iCi0gICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SFRUUEhlYWRlcnMoKQotICAgICAgICAgICAgKyAiXG5NZXNzYWdlOlxuIgotICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldE1lc3NhZ2UoKQotICAgICAgICAgICAgKyAiXG5cblJlc3BvbnNlIG1lc3NhZ2U6XG5IZWFkZXJzOlxuIgotICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVzcG9uc2UoKS5nZXRIVFRQSGVhZGVycygpCi0gICAgICAgICAgICArICJcbk1lc3NhZ2U6XG4iCi0gICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQMTEwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmNkYmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTA0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotCi0KLS8qKgotICogQlAxMTA0LgotICogVGhlIHJlcXVlc3QgbWVzc2FnZSBzaG91bGQgbm90IGNvbnRhaW4gYSBjb250ZW50LXR5cGUgb2YgInRleHQveG1sIi4KLSAqLwotcHVibGljIGNsYXNzIEJQMTEwNCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQMTEwNChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIGNoZWNrIHJlcXVlc3QgZm9yIHRoZSAidGV4dC94bWwiIGNvbnRlbnQgdHlwZQotICAgIE1lc3NhZ2VFbnRyeSByZXF1ZXN0ID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKTsKLSAgICBTdHJpbmcgaGVhZGVycyA9IHJlcXVlc3QuZ2V0SFRUUEhlYWRlcnMoKTsKLSAgICBTdHJpbmcgY29udGVudFR5cGUgPSAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhoZWFkZXJzLCAiOiIpCi0gICAgICAuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRS50b1VwcGVyQ2FzZSgpKTsKLQotICAgIC8vIEdldCBIVFRQIHN0YXR1cyBjb2RlCi0gICAgU3RyaW5nIGh0dHBTdGF0dXMgPQotICAgICAgVXRpbHMuZ2V0SFRUUFN0YXR1c0NvZGUoCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpKTsKLQotICAgIC8vIElmIHRoZSByZXF1ZXN0IG1lc3NhZ2UgaGFzIGEgY29udGVudCB0eXBlIG9mIHRleHQveG1sLAotICAgIC8vIHRoZW4gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsCi0gICAgICAmJiBjb250ZW50VHlwZS5pbmRleE9mKFdTSUNvbnN0YW50cy5DT05URU5UX1RZUEVfVEVYVF9YTUwpICE9IC0xKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBjaGVjayBIVFRQIHN0YXR1cyBjb2RlCi0gICAgICBpZiAoISI0MTUiLmVxdWFscyhodHRwU3RhdHVzKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgIlxuUmVxdWVzdCBtZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCkKLSAgICAgICAgICAgICAgKyAiXG5NZXNzYWdlOlxuIgotICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICAgICsgIlxuXG5SZXNwb25zZSBtZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVzcG9uc2UoKS5nZXRIVFRQSGVhZGVycygpCi0gICAgICAgICAgICAgICsgIlxuTWVzc2FnZTpcbiIKLSAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVzcG9uc2UoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMTYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlAxMTE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MGY4NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDExMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5PcGVyYXRpb25TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBCUDExMTYuCi0gKiBTT0FQQWN0aW9uIGhlYWRlciBzaG91bGQgY29udGFpbiBhIHF1b3RlZCBzdHJpbmcgdGhhdCBoYXMgc2FtZSAKLSAqIHZhbHVlIGFzIHRoZSB2YWx1ZSBvZiB0aGUgc29hcGJpbmQ6b3BlcmF0aW9uL0Bzb2FwQWN0aW9uIGF0dHJpYnV0ZSwgCi0gKiBhbmQgYW4gZW1wdHkgc3RyaW5nICgiIikgaWYgdGhlcmUgaXMgbm8gc3VjaCBhdHRyaWJ1dGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDExMTYgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvcgotewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDExMTYoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFjdGlvbiA9IG51bGw7Ci0gIHByaXZhdGUgU3RyaW5nIGhlYWRlcnMgPSBudWxsOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHNvYXBBY3Rpb24gPSBzb2FwT3Blci5nZXRTb2FwQWN0aW9uVVJJKCk7Ci0gICAgaWYgKHNvYXBBY3Rpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoISIiLmVxdWFscyhhY3Rpb24pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAgICJcbkhUVFAgaGVhZGVyczpcbiIgKyBoZWFkZXJzICsgIlxuc29hcEFjdGlvbjpcbiIgKyBzb2FwQWN0aW9uOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCFzb2FwQWN0aW9uLmVxdWFscyhhY3Rpb24pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAgICJcbkhUVFAgaGVhZGVyczpcbiIgKyBoZWFkZXJzICsgIlxuc29hcEFjdGlvbjpcbiIgKyBzb2FwQWN0aW9uOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFBhcnNlIHJlcXVlc3QgbWVzc2FnZQotICAgICAgRG9jdW1lbnQgZG9jID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeURvY3VtZW50KCk7Ci0KLSAgICAgIC8vIGdldCBTT0FQQWN0aW9uCi0gICAgICBoZWFkZXJzID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRIVFRQSGVhZGVycygpOwotICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkKLSAgICAgICAgYWN0aW9uID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIlNPQVBBY3Rpb24iLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgICBpZiAoYWN0aW9uID09IG51bGwpIAotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotCi0gICAgICBpZiAoYWN0aW9uLmxlbmd0aCgpID4gMQotICAgICAgICAmJiBhY3Rpb24uY2hhckF0KDApID09ICciJwotICAgICAgICAmJiBhY3Rpb24uY2hhckF0KGFjdGlvbi5sZW5ndGgoKSAtIDEpID09ICciJykKLSAgICAgIHsKLSAgICAgICAgYWN0aW9uID0gYWN0aW9uLnN1YnN0cmluZygxLCBhY3Rpb24ubGVuZ3RoKCkgLSAxKTsKLSAgICAgIH0KLQotICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLk9wZXJhdGlvbk1hdGNoIG1hdGNoID0KLSAgICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLm1hdGNoT3BlcmF0aW9uKAotICAgICAgICAgIGRvYywKLSAgICAgICAgICBudWxsLAotICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKClbMF0sCi0gICAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQKLSAgICAgICAgICAgICAgLmdldENhbmRpZGF0ZUluZm8oKQotICAgICAgICAgICAgICAuZ2V0V3NkbERvY3VtZW50KCkKLSAgICAgICAgICAgICAgLmdldERlZmluaXRpb25zKCksCi0gICAgICAgICAgICAgIHZhbGlkYXRvciksCi0gICAgICAgICAgZmFsc2UpOwotCi0gICAgICBpZiAobWF0Y2ggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgICAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgICAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICAgICAgdHJhdmVyc2FsLnZpc2l0U09BUE9wZXJhdGlvbih0cnVlKTsKLSAgICAgICAgdHJhdmVyc2FsLnRyYXZlcnNlKG1hdGNoLmdldE9wZXJhdGlvbigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCA9PSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRAotICAgICAgJiYgZmFpbHVyZURldGFpbE1lc3NhZ2UgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChmYWlsdXJlRGV0YWlsTWVzc2FnZSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzYTVjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotCi0vKioKLSAqIEJQNDEwMwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGxvZyBmaWxlPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBtZXNzYWdlIGNvbnRhaW5zIGFuIEhUVFAgQXV0aGVudGljYXRpb24gaGVhZGVyIGZpZWxkPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQNDEwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX0FVVEhfU0NIRU1FX0JBU0lDID0gIkJhc2ljIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQVVUSF9TQ0hFTUVfRElHRVNUID0gIkRpZ2VzdCI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXR0aW5nIG1lc3NhZ2UgaGVhZGVycwotICAgIFN0cmluZyBoZWFkZXJzID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgLy8gSWYgdGhpcyBpcyBhIHJlcXVlc3QgbWVzc2FnZQotICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpLmVxdWFscyhNZXNzYWdlRW50cnkuVFlQRV9SRVFVRVNUKSkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgcmVxdWVzdCBoZWFkZXJzIGNvbnRhaW4gYXV0aGVudGljYXRpb24gc2NoZW1lICJCYXNpYyIgb3IgIkRpZ2VzdCIKLSAgICAgIC8vIG9yIHRoZXJlIGFyZSBubyBIVFRQIEF1dGhlbnRpY2F0aW9uIGhlYWRlcnMsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghY29udGFpbnNJbnZhbGlkQXV0aChoZWFkZXJzLCBIVFRQQ29uc3RhbnRzLkhFQURFUl9BVVRIT1JJWkFUSU9OKQotICAgICAgICAmJiAhY29udGFpbnNJbnZhbGlkQXV0aChoZWFkZXJzLCBIVFRQQ29uc3RhbnRzLkhFQURFUl9QUk9YWV9BVVRIT1JJWkFUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZWxzZSB0aGlzIGlzIGEgcmVzcG9uc2UKLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIGhlYWRlcnMgY29udGFpbiBhdXRoZW50aWNhdGlvbiBzY2hlbWUgIkJhc2ljIiBvciAiRGlnZXN0IgotICAgICAgLy8gb3IgdGhlcmUgYXJlIG5vIEhUVFAgQXV0aGVudGljYXRpb24gaGVhZGVycywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFjb250YWluc0ludmFsaWRBdXRoKGhlYWRlcnMsIEhUVFBDb25zdGFudHMuSEVBREVSX1dXV19BVVRIRU5USUNBVEUpCi0gICAgICAgICYmICFjb250YWluc0ludmFsaWRBdXRoKGhlYWRlcnMsIEhUVFBDb25zdGFudHMuSEVBREVSX1BST1hZX0FVVEhFTlRJQ0FURSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQXNzZXJ0aW9uIHJlc3VsdCBoYXMgbm90IGJlZW4gY2hhbmdlZCwgSFRUUCBBdXRoZW50aWNhdGlvbiBoZWFkZXJzCi0gICAgLy8gZG9lcyBub3QgY29udGFpbiBhdXRoZW50aWNhdGlvbiBzY2hlbWUgIkJhc2ljIiBvciAiRGlnZXN0IiwKLSAgICAvLyB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgIGlmIChyZXN1bHQuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEKSkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciBIVFRQIGhlYWRlcnMgY29udGFpbiBIVFRQIEF1dGhlbnRpY2F0aW9uIGhlYWRlcnMgdGhhdCB1c2VzCi0gICAqIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSBvdGhlciB0aGFuICJCYXNpYyIgb3IgIkRpZ2VzdCIuCi0gICAqIEBwYXJhbSBoZWFkZXJzIEhUVFAgaGVhZGVycy4KLSAgICogQHBhcmFtIGhlYWRlciBhIGhlYWRlciBuYW1lIGJlaW5nIHJldHJpZXZlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBIVFRQIEF1dGhlbnRpY2F0aW9uIGhlYWRlciB0aGF0IHVzZXMgYXV0aGVudGljYXRpb24KLSAgICogc2NoZW1lIG90aGVyIHRoYW4gIkJhc2ljIiBvciAiRGlnZXN0IiBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSW52YWxpZEF1dGgoU3RyaW5nIGhlYWRlcnMsIFN0cmluZyBoZWFkZXIpCi0gIHsKLSAgICAvLyBHZXR0aW5nIGEgaGVhZGVyIHZhbHVlCi0gICAgU3RyaW5nIGhlYWRlclZhbHVlID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBoZWFkZXJWYWx1ZSA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsIjoiKQotICAgICAgICAuZ2V0KGhlYWRlci50b1VwcGVyQ2FzZSgpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCi0gICAgLy8gSWYgdGhlIGhlYWRlciBpcyBwcmVzZW50ZWQKLSAgICBpZiAoaGVhZGVyVmFsdWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBSZXRyaWV2aW5nIGF1dGhlbnRpY2F0aW9uIHNjaGVtZQotICAgICAgaW50IGlkeFNQID0gaGVhZGVyVmFsdWUuaW5kZXhPZigiICIpOwotICAgICAgaWYgKGlkeFNQID4gLTEpCi0gICAgICB7Ci0gICAgICAgIGhlYWRlclZhbHVlID0gaGVhZGVyVmFsdWUuc3Vic3RyaW5nKDAsIGlkeFNQKTsKLSAgICAgIH0KLSAgICAgIC8vIElmIGEgc2NoZW1lIGlzIG5laXRoZXIgIkJhc2ljIiBub3IgIkRpZ2VzdCIsIHJldHVybiB0cnVlCi0gICAgICBpZiAoIWhlYWRlclZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoSFRUUF9BVVRIX1NDSEVNRV9CQVNJQykKLSAgICAgICAgJiYgIWhlYWRlclZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoSFRUUF9BVVRIX1NDSEVNRV9ESUdFU1QpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDBjZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLS8qKgotICogQlA0MTA0Ci0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZSBsb2cgZmlsZSBjb250YWluaW5nIGFuIEhUVFAgSGVhZGVyIGZpZWxkIHRoYXQgaXMgbm90IGZyb20gdGhlIGZvbGxvd2luZyBsaXN0IG9mIHNwZWNpZmllZCBoZWFkZXIgZmllbGRzOiAoaHR0cDovL3d3dy5tbm90Lm5ldC9kcmFmdHMvZHJhZnQtbm90dGluZ2hhbS1odHRwLWhlYWRlci1yZWctMDAudHh0KTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgbWVzc2FnZSBjb250YWlucyBhbiBIVFRQIEhlYWRlciBmaWVsZCB0aGF0IGlzIG5vdCBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiBzcGVjaWZpZWQgaGVhZGVyIGZpZWxkczogKGh0dHA6Ly93d3cubW5vdC5uZXQvZHJhZnRzL2RyYWZ0LW5vdHRpbmdoYW0taHR0cC1oZWFkZXItcmVnLTAwLnR4dCk8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTA0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgcHJpdmF0ZSBMaXN0IGtub3duSGVhZGVyTmFtZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIEJQNDEwNChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICAgIGtub3duSGVhZGVyTmFtZXMgPSBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0IGdldEFsbEtub3duSGVhZGVyTmFtZXMoKSB7Ci0gICAgaWYgKGtub3duSGVhZGVyTmFtZXMgPT0gbnVsbCkgewotICAgICAga25vd25IZWFkZXJOYW1lcyA9IEhUVFBDb25zdGFudHMuZ2V0QWxsS25vd25IZWFkZXJOYW1lcygpOwotICAgIH0KLSAgICByZXR1cm4ga25vd25IZWFkZXJOYW1lczsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBnZXR0aW5nIEhUVFAgSGVhZGVycwotICAgIE1hcCBobWFwID0gSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoCi0gICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSwgIjoiKTsKLQotICAgIEl0ZXJhdG9yIGkgPSBobWFwLmtleVNldCgpLml0ZXJhdG9yKCkgOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLSAgICAgIC8vIElmIGhlYWRlciBuYW1lIGlzIG5vdCBrbm93biwgdGhlbiB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgICAgaWYgKCFnZXRBbGxLbm93bkhlYWRlck5hbWVzKCkuY29udGFpbnMoaGVhZGVyTmFtZS50b1VwcGVyQ2FzZSgpKSkKLSAgICAgIHsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBubyBIVFRQIGhlYWRlciB0aGF0IGlzIG5vdCBmcm9tIGEgbGlzdCwKLSAgICAvLyB0aGVuIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUgCi0gICAgaWYgKGZhaWx1cmVEZXRhaWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTA1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRmNzc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTA1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLQotLyoqCi0gKiBCUDQxMDUKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGxvZyBmaWxlIGNvbnRhaW5pbmcgYSBDb250ZW50LWVuY29kaW5nIEhUVFAgaGVhZGVyIGZpZWxkIHdpdGggYSB2YWx1ZSBvdGhlciB0aGFuICJnemlwIiwgImNvbXByZXNzIiBvciAiZGVmbGF0ZSI8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGNvbnRhaW5lZCBDb250ZW50LWVuY29kaW5nIEhUVFAgaGVhZGVyIGZpZWxkIGhhcyBhIHZhbHVlIG90aGVyIHRoYW4gImd6aXAiLCAiY29tcHJlc3MiIG9yICJkZWZsYXRlIi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlA0MTA1IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgLy8gQWxsIHRoZSByZWdpc3RlcmVkIGNvbnRlbnQtY29kaW5nIHZhbHVlIHRva2VucyAoUkZDMjYxNikgZXhjZXB0ICJpZGVudGl0eSIKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdaSVBfVkFMVUUgPSAiZ3ppcCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU19WQUxVRSA9ICJjb21wcmVzcyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZMQVRFX1ZBTFVFID0gImRlZmxhdGUiOwotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDQxMDUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBHZXR0aW5nIHRoZSBDb250ZW50LUVuY29kaW5nIEhUVFAgaGVhZGVyIHZhbHVlCi0gICAgU3RyaW5nIGNvbnRlbnRFbmNvZGluZyA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKAotICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCksCi0gICAgICAiOiIpLmdldChIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0VOQ09ESU5HLnRvVXBwZXJDYXNlKCkpOwotCi0gICAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIExvd2VyaW5nIHZhbHVlJ3MgY2FzZSBiZWNhdXNlIFJGQzI2MTYgc2F5cwotICAgICAgLy8gdGhhdCBhbGwgY29udGVudC1jb2RpbmcgdmFsdWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlCi0gICAgICBjb250ZW50RW5jb2RpbmcgPSBjb250ZW50RW5jb2RpbmcudG9Mb3dlckNhc2UoKTsKLQotICAgICAgLy8gTXVsdGlwbGUgZW5jb2RpbmdzIGNhbiBiZSBhcHBsaWVkIHRvIGFuIGVudGl0eSwKLSAgICAgIC8vIHNvIGJyZWFraW5nIHRoZSB2YWx1ZSBpbnRvIHRva2VucwotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjb250ZW50RW5jb2RpbmcsICIsIik7Ci0gICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICBTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgIC8vIElmIGEgdG9rZW4gZG9lcyBub3QgZXF1YWwgdG8gYW55IHJlZ2lzdGVyZWQgb25lCi0gICAgICAgIC8vIHRoZW4gdGhlIGFzc2VydGlvbiBwYXNzZWQKLSAgICAgICAgaWYgKCAhdG9rZW4uZXF1YWxzKEdaSVBfVkFMVUUpCi0gICAgICAgICAgJiYgIXRva2VuLmVxdWFscyhDT01QUkVTU19WQUxVRSkKLSAgICAgICAgICAmJiAhdG9rZW4uZXF1YWxzKERFRkxBVEVfVkFMVUUpKSB7Ci0KLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICB0ZXN0QXNzZXJ0aW9uLmdldERldGFpbERlc2NyaXB0aW9uKCksIGVudHJ5Q29udGV4dCk7Ci0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIG5vIHVucmVnaXN0ZXJlZCB2YWx1ZSBvZiBDb250ZW50LUVuY29kaW5nLAotICAgIC8vIHRoZW4gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZSAKLSAgICBpZiAoZmFpbHVyZURldGFpbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvQlA0MTA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzg2MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotCi0KLS8qKgotICogQlA0MTA2Ci0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgcmVzcG9uc2UgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZSBsb2cgZmlsZSB0aGF0IGNvbnRhaW5zIGEgdHJhbnNmZXItZW5jb2RpbmcgSFRUUCBoZWFkZXIgZmllbGQuPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBjb250YWluZWQgdHJhbnNmZXItZW5jb2RpbmcgSFRUUCBoZWFkZXIgZmllbGQgaGFzIGEgdmFsdWUgb2YgImNodW5rZWQiPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQNDEwNiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSFVOS0VEX1ZBTFVFID0gImNodW5rZWQiOwotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDQxMDYoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBHZXR0aW5nIGEgVHJhbnNmZXItRW5jb2RpbmcgSFRUUCBoZWFkZXIgdmFsdWUKLSAgICBTdHJpbmcgdHJhbnNmZXJFbmNvZGluZyA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKAotICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCksCi0gICAgICAiOiIpLmdldChIVFRQQ29uc3RhbnRzLkhFQURFUl9UUkFOU0ZFUl9FTkNPRElORy50b1VwcGVyQ2FzZSgpKTsKLQotICAgIGlmICh0cmFuc2ZlckVuY29kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgLy8gTG93ZXJpbmcgdmFsdWUncyBjYXNlIGJlY2F1c2UgUkZDMjYxNiBzYXlzCi0gICAgICAvLyB0aGF0IGFsbCB0cmFuc2Zlci1jb2RpbmcgdmFsdWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlCi0gICAgICB0cmFuc2ZlckVuY29kaW5nID0gdHJhbnNmZXJFbmNvZGluZy50b0xvd2VyQ2FzZSgpOwotCi0gICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgb3RoZXIgdGhhbiAiY2h1bmtlZCIsIHRoZW4gdGhlIGFzc2VydGlvbiBwYXNzZWQKLSAgICAgIGlmICghdHJhbnNmZXJFbmNvZGluZy5lcXVhbHMoQ0hVTktFRF9WQUxVRSkpIHsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBubyBUcmFuZmVyLUVuY29kaW5nIG9yIGl0cyB2YWx1ZSBpcyAiY2h1bmtlZCIsCi0gICAgLy8gdGhlbiB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIAotICAgIGlmIChmYWlsdXJlRGV0YWlsID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9CUDQxMDcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5OWEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL0JQNDEwNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLQotLyoqCi0gKiBCUDQxMDcKLSAqIDxjb250ZXh0PkZvciBhIHJlcXVlc3QgbWVzc2FnZSBjb250YWluaW5nIGFuIFVwZ3JhZGUgZmllbGQgaW4gdGhlIEhUVFAgSGVhZGVycy48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHJlcXVlc3QgbWVzc2FnZSBjb250YWlucyBhbiBVcGdyYWRlIGZpZWxkIGluIHRoZSBIVFRQIEhlYWRlcnMuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQNDEwNyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBCUDQxMDcoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0dGluZyB0aGUgVXBncmFkZSBIVFRQIGhlYWRlciB2YWx1ZQotICAgIFN0cmluZyB1cGdyYWdlID0gKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoCi0gICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSwKLSAgICAgICI6IikuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX1VQR1JBREUudG9VcHBlckNhc2UoKSk7IAotCi0gICAgLy8gSWYgdGhlIGhlYWRlciBpcyBwcmVzZW50ZWQsIHRoZW4gdGhlIGFzc2VydGlvbiBwYXNzZWQKLSAgICBpZiAodXBncmFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgdGVzdEFzc2VydGlvbi5nZXREZXRhaWxEZXNjcmlwdGlvbigpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBlbHNlIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL01lc3NhZ2VWYWxpZGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL01lc3NhZ2VWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNWJmZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9NZXNzYWdlVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNICAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgUGFyYXNvZnQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5NZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVudHJ5VHlwZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VWYWxpZGF0b3JJbXBsCi0gIGV4dGVuZHMgQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgaW1wbGVtZW50cyBNZXNzYWdlVmFsaWRhdG9yCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbCNpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaChvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmltYXJ5RW50cnlUeXBlTWF0Y2goCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gIHsKLSAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0KLSAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZW50cnkgYW5kIHRlc3QgYXNzZXJ0aW9uIGhhdmUgdGhlIHNhbWUgcHJpbWFyeSBjb250ZXh0Ci0gICAgaWYgKCh0ZXN0QXNzZXJ0aW9uLmdldEVudHJ5VHlwZU5hbWUoKS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9BTlkpKQotICAgICAgfHwgKHRlc3RBc3NlcnRpb24uZ2V0RW50cnlUeXBlTmFtZSgpLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFUVVFU1QpCi0gICAgICAgICYmIChlbnRyeUNvbnRleHQKLSAgICAgICAgICAuZ2V0RW50cnkoKQotICAgICAgICAgIC5nZXRFbnRyeVR5cGUoKQotICAgICAgICAgIC5nZXRUeXBlTmFtZSgpCi0gICAgICAgICAgLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFUVVFU1QpKSkKLSAgICAgIHx8ICh0ZXN0QXNzZXJ0aW9uLmdldEVudHJ5VHlwZU5hbWUoKS5lcXVhbHMoRW50cnlUeXBlLlRZUEVfTUVTU0FHRV9SRVNQT05TRSkKLSAgICAgICAgJiYgKGVudHJ5Q29udGV4dAotICAgICAgICAgIC5nZXRFbnRyeSgpCi0gICAgICAgICAgLmdldEVudHJ5VHlwZSgpCi0gICAgICAgICAgLmdldFR5cGVOYW1lKCkKLSAgICAgICAgICAuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVTUE9OU0UpKSkKLSAgICAgIHx8IHRlc3RBc3NlcnRpb24uZ2V0RW50cnlUeXBlTmFtZSgpLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NSU1FX1JPT1RfUEFSVCkKLSAgICAgIHx8IHRlc3RBc3NlcnRpb24uZ2V0RW50cnlUeXBlTmFtZSgpLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NSU1FX1BBUlQpKQotICAgIHsKLSAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWF0Y2g7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1NTQlAxMDAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1NTQlAxMDAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MWVhZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9TU0JQMTAwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25QYXNzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLQotCi0vKioKLSAqIFNTQlAxMDAzLgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBub24tbXVsdGlwYXJ0L3JlbGF0ZWQgbWVzc2FnZSBpbiB0aGUgbG9nIGZpbGUsIHdoaWNoIGhhcyBhIG5vbi1lbXB0eSBlbnRpdHktYm9keTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqICBUaGUgbG9nZ2VkIFNPQVAgZW52ZWxvcGUgaXMgYSBVVEYtOCB0cmFuc2NyaXB0IG9mIGFuIGVudmVsb3BlIG9yaWdpbmFsbHkgZW5jb2RlZCBhcyBVVEYtOCBvciBVVEYtMTYuIAotICogIFRoZSBIVFRQIENvbnRlbnQtVHlwZSBoZWFkZXIncyBjaGFyc2V0IHZhbHVlIGlzIGVpdGhlciBVVEYtOCBvciBVVEYtMTYuIExvb2tpbmcgYXQgdGhlIG1lc3NhZ2VDb250ZW50IAotICogIGVsZW1lbnQgb2YgdGhlIGxvZ2dlZCBtZXNzYWdlLCBlaXRoZXIgCi0gKiAgICAoMSkgaXQgaGFzIGEgQk9NIGF0dHJpYnV0ZSB3aGljaCBtYXBzIHRoZSBjaGFyc2V0IHZhbHVlIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLCBvciAKLSAqICAgICgyKSBpdCBoYXMgaXQgaGFzIGFuIFhNTCBkZWNsYXJhdGlvbiB3aGljaCBtYXRjaGVzIHRoZSBjaGFyc2V0IHZhbHVlIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLCBvciAKLSAqICAgICgzKSB0aGVyZSBpcyBubyBCT00gYXR0cmlidXRlIGFuZCBubyBYTUwgZGVjbGFyYXRpb24sIGFuZCB0aGUgY2hhcnNldCB2YWx1ZSBpcyBVVEYtOC4KLSAqIDwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKgotICogQGF1dGhvciBsYXV6b25kCi0gKi8gCi1wdWJsaWMgY2xhc3MgU1NCUDEwMDMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFNTQlAxMDAzKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVzcG9uc2UgbWVzc2FnZSBmb3Igb25lLXdheSBvcGVyYXRpb24sIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICh2YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBTdHJpbmcgaHR0cEhlYWRlciA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpOwotCi0gICAgICBNYXAgaHR0cEhlYWRlck1hcCA9IEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGh0dHBIZWFkZXIsICI6Iik7Ci0gICAgICBTdHJpbmcgY29udGVudFR5cGUgPSAoU3RyaW5nKSBodHRwSGVhZGVyTWFwLmdldCgiQ29udGVudC1UeXBlIi50b1VwcGVyQ2FzZSgpKTsKLQotICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICJUaGUgQ29udGVudC1UeXBlIGhlYWRlciBpcyBub3QgcHJlc2VudC4iKTsKLSAgICAgIH0KLQotICAgICAgY29udGVudFR5cGUgPSBjb250ZW50VHlwZS50cmltKCk7Ci0gICAgICBTdHJpbmcgY2hhcnNldCA9IGNvbnRlbnRUeXBlLnN1YnN0cmluZygKLSAgICAgICAgY29udGVudFR5cGUuaW5kZXhPZigiOyIpICsgMSwgY29udGVudFR5cGUubGVuZ3RoKCkpOwotICAgICAgY2hhcnNldCA9IGNoYXJzZXQudHJpbSgpOwotICAgICAgaWYgKCFjaGFyc2V0LnN0YXJ0c1dpdGgoImNoYXJzZXQiKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgIk1pc3Npbmcgb3IgYmFkIFwiY2hhcnNldFwiIGF0dHJpYnV0ZSBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlcjogIgotICAgICAgICAgICsgY2hhcnNldCk7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyBjaGFyc2V0VmFsdWUgPSBjaGFyc2V0LnN1YnN0cmluZygKLSAgICAgICAgY2hhcnNldC5pbmRleE9mKCI9IikgKyAxLCBjaGFyc2V0Lmxlbmd0aCgpKTsKLSAgICAgIGlmIChjaGFyc2V0VmFsdWUuc3RhcnRzV2l0aCgiXCIiKSkKLSAgICAgIHsKLSAgICAgICAgY2hhcnNldFZhbHVlID0gY2hhcnNldFZhbHVlLnN1YnN0cmluZygxLCBjaGFyc2V0VmFsdWUubGVuZ3RoKCkgLSAxKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFjaGFyc2V0VmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidXRmLTgiKQotICAgICAgICAgICYmICFjaGFyc2V0VmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidXRmLTE2IikpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgdmFsdWUgb2YgdGhlIFwiY2hhcnNldFwiICIKLSAgICAgICAgICArICJhdHRyaWJ1dGUgb2YgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaXMgIiArIGNvbnRlbnRUeXBlKTsKLSAgICAgIH0KLSAgICAgIC8vIFBhcnNlIGxvZyBtZXNzYWdlCi0gICAgICAvL2dldHMgZmlyc3Qgc3RyaW5nCi0gICAgICBpbnQgaWR4ID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKS5pbmRleE9mKCI8P3htbCIpOwotICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgaW50IGlkeDIgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIj8+Iik7Ci0gICAgICBpZiAoaWR4MiA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHhtbERlY2xhcmF0aW9uID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKQotICAgICAgICAuc3Vic3RyaW5nKGlkeCwgaWR4MiArICI/PiIubGVuZ3RoKCkpOwotCi0gICAgICBpZHggPSB4bWxEZWNsYXJhdGlvbi5pbmRleE9mKCJlbmNvZGluZyIpOwotICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoYXJzZXRWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtOCIpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBYTUwgZGVjbGFyYXRpb24gYW5kIHRoZSIKLSAgICAgICAgICAgICsgIiBjaGFyc2V0IHZhbHVlIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGlzIG5vdCBVVEYtOC4iCi0gICAgICAgICAgICArICJcbkNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXI6ICIgKyBjaGFyc2V0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGludCBpZHhRID0geG1sRGVjbGFyYXRpb24uaW5kZXhPZignXCcnLCBpZHgpOwotICAgICAgaW50IGlkeFFRID0geG1sRGVjbGFyYXRpb24uaW5kZXhPZignXCInLCBpZHgpOwotICAgICAgaW50IGlkeFF1b3RlID0gLTE7Ci0gICAgICBjaGFyIHFvdXRlQ2ggPSAnXDAnOwotICAgICAgaWYgKGlkeFEgPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlkeFF1b3RlID0gaWR4UVE7Ci0gICAgICAgIHFvdXRlQ2ggPSAnXCInOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoaWR4UVEgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBpZHhRdW90ZSA9IGlkeFE7Ci0gICAgICAgICAgcW91dGVDaCA9ICdcJyc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlkeFFRIDwgaWR4USkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZHhRdW90ZSA9IGlkeFFROwotICAgICAgICAgICAgcW91dGVDaCA9ICdcIic7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZHhRdW90ZSA9IGlkeFE7Ci0gICAgICAgICAgICBxb3V0ZUNoID0gJ1wnJzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGlkeFF1b3RlID09IC0xIHx8IHFvdXRlQ2ggPT0gJ1wwJykKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgaW50IGlkeExRb3V0ZSA9IHhtbERlY2xhcmF0aW9uLmluZGV4T2YocW91dGVDaCwgaWR4UXVvdGUgKyAxKTsKLQotICAgICAgaWYgKGlkeExRb3V0ZSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHhtbEVuY29kaW5nID0KLSAgICAgICAgeG1sRGVjbGFyYXRpb24uc3Vic3RyaW5nKGlkeFF1b3RlICsgMSwgaWR4TFFvdXRlKTsKLSAgICAgIGlmIChjaGFyc2V0VmFsdWUuZXF1YWxzSWdub3JlQ2FzZSh4bWxFbmNvZGluZykpCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgQk9NLCB0aGVuIGNoZWNrIHRoYXQgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIHhtbEVuY29kaW5nCi0gICAgICAgIGludCBib20gPSAwOwotICAgICAgICBpZiAoKGJvbSA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRCT00oKSkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgIGlmICgoYm9tID09IFdTSUNvbnN0YW50cy5CT01fVVRGOAotICAgICAgICAgICAgJiYgIXhtbEVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoInV0Zi04IikpCi0gICAgICAgICAgICB8fCAoKGJvbSA9PSBXU0lDb25zdGFudHMuQk9NX1VURjE2Ci0gICAgICAgICAgICAgICYmICF4bWxFbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJ1dGYtMTYiKSkpCi0gICAgICAgICAgICB8fCAoKGJvbSA9PSBXU0lDb25zdGFudHMuQk9NX1VURjE2X0JJR19FTkRJQU4KLSAgICAgICAgICAgICAgJiYgIXhtbEVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoInV0Zi0xNiIpKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJUaGUgQk9NIGFuZCBYTUwgZGVjbGFyYXRpb24gZG8gbm90IG1hdGNoLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGVyZSBpcyBhbiBYTUwgZGVjbGFyYXRpb24sIGJ1dCBpdHMgIgotICAgICAgICAgICsgImVuY29kaW5nIHZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBjaGFyc2V0IHZhbHVlLlxuIgotICAgICAgICAgICsgIkNoYXJzZXQgdmFsdWUgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXI6ICIgKyBjaGFyc2V0VmFsdWUKLSAgICAgICAgICArICJcbkVuY29kaW5nIGluIHRoZSBYTUwgZGVjbGFyYXRpb246ICIgKyB4bWxFbmNvZGluZyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9TU0JQNTEwMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9TU0JQNTEwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjIxNTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvU1NCUDUxMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBTU0JQNTEwMAotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIG1lc3NhZ2UgaW4gdGhlIGxvZyBmaWxlLCB3aXRoIGFuIEhUVFAgZW50aXR5LWJvZHkuPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBTT0FQIGVudmVsb3BlIGlzIHRoZSBleGNsdXNpdmUgcGF5bG9hZCBvZiB0aGUgSFRUUCBlbnRpdHktYm9keS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgU1NCUDUxMDAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIHsKLQotICBwcm90ZWN0ZWQgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBTU0JQNTEwMChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBtZXNzYWdlIGRvY3VtZW50Ci0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLSAgICAgIAotICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgb3IgaW52YWxpZCwgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgeyAKLSAgICAgIAlpZiAodGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKQotICAgICAgCQkgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIAllbHNlCQotICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoIWRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoWE1MVXRpbHMuU09BUF9FTEVNX0VOVkVMT1BFKSkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RmFpbHVyZU1lc3NhZ2UoKSwKLSAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9TU0JQNTEwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9TU0JQNTEwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmFlNTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvU1NCUDUxMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci0KLS8qKgotICogU1NCUDUxMDEKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBtZXNzYWdlIGluIHRoZSBsb2cgZmlsZS48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QSBtZXNzYWdlIG11c3QgaGF2ZSBhICJDb250ZW50LVR5cGUiIEhUVFAgaGVhZGVyIGZpZWxkLiAgVGhlICJDb250ZW50LVR5cGUiIEhUVFAgaGVhZGVyIGZpZWxkIG11c3QgaGF2ZSBhIGZpZWxkLXZhbHVlIHdob3NlIG1lZGlhIHR5cGUgaXMgInRleHQveG1sIi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICogCi0gKiBAYXV0aG9yIGxhdXpvbmQKLSAqLwotcHVibGljIGNsYXNzIFNTQlA1MTAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyB7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgU1NCUDUxMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBnZXR0aW5nIENvbnRlbnQtVHlwZSBIVFRQIGhlYWRlcgotICAgIFN0cmluZyBjb250ZW50VHlwZSA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKAotICAgICAgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCksCi0gICAgICAiOiIpLmdldChIVFRQQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEUudG9VcHBlckNhc2UoKSk7Ci0KLSAgICAvLyBpZiBDb250ZW50LVR5cGUgaGVhZGVyIGlzIG5vdCBwcmVzZW50ZWQKLSAgICAvLyBvciBkb2VzIG5vdCBlcXVhbCB0byB0ZXh0L3htbCwgdGhlbiB0aGUgYXNzZXJ0aW9uIGlzIGZhaWxlZAotICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsCi0gICAgICB8fCAhY29udGVudFR5cGUuc3RhcnRzV2l0aChXU0lDb25zdGFudHMuQ09OVEVOVF9UWVBFX1RFWFRfWE1MKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgdGVzdEFzc2VydGlvbi5nZXRGYWlsdXJlTWVzc2FnZSgpLAotICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm4gdGhpcy52YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDY2YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJMTAwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAwMSBleHRlbmRzIEJQMTAwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNDMwOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJMTAwMgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAwMiBleHRlbmRzIEJQMTAwMgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDAyKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMDQxMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJMTAwMwotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAwMyBleHRlbmRzIFNTQlAxMDAzCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMDMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmYWQ4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBXU0kxMDA0Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDA0IGV4dGVuZHMgQlAxMDA0Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMDQoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxYzAwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEwMDU7Ci0KLS8qKgotICogV1NJMTAwNQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAwNSBleHRlbmRzIEJQMTAwNQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDA1KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZDZmODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJMTAwNgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAwNiBleHRlbmRzIEJQMTAwNgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDA2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzODVhYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMDA3OwotCi0vKioKLSAqIFdTSTEwMDcKLSAqLwotcHVibGljIGNsYXNzIFdTSTEwMDcgZXh0ZW5kcyBCUDEwMDcKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTAwNyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmNkMGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTAwODsKLQotLyoqCi0gKiBXU0kxMDA4Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDA4IGV4dGVuZHMgQlAxMDA4Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMDgoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDA5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2OGViZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEwMDk7Ci0KLS8qKgotICogV1NJMTAwOQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAwOSBleHRlbmRzIEJQMTAwOQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDA5KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAxMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmQ5ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJMTAxMAotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAxMCBleHRlbmRzIEJQMTAxMAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDEwKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAxMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGNkY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMDExOwotCi0vKioKLSAqIFdTSTEwMTEKLSAqLwotcHVibGljIGNsYXNzIFdTSTEwMTEgZXh0ZW5kcyBCUDEwMTEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTAxMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y1NzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAxMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTAxMjsKLQotLyoqCi0gKiBXU0kxMDEyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMDEyIGV4dGVuZHMgQlAxMDEyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEwMTIoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDEzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3ZTU5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEwMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEwMTM7Ci0KLS8qKgotICogV1NJMTAxMwotICovCi1wdWJsaWMgY2xhc3MgV1NJMTAxMyBleHRlbmRzIEJQMTAxMwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMDEzKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTAzMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDMxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDM5MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMDMxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMDMxOwotCi0vKioKLSAqIFdTSTEwMzEKLSAqLwotcHVibGljIGNsYXNzIFdTSTEwMzEgZXh0ZW5kcyBCUDEwMzEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTAzMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzIwYTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTEwMDsKLQotLyoqCi0gKiBXU0kxMTAwCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTAwIGV4dGVuZHMgQlAxMTAwCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTExMDAoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiMTEzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBXU0kxMTAxCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTAxIGV4dGVuZHMgQlAxMTAxCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTExMDEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzODMyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkhUVFBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IdHRwSGVhZGVyc1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBCUFdTSTQuCi0gKiBUaGUgcmVxdWVzdCBtZXNzYWdlIHNob3VsZCBiZSBpbnZhbGlkIChIVFRQIHJlcXVlc3QgbWFsZm9ybWVkLCAKLSAqIFhNTCBub3Qgd2VsbCBmb3JtZWQsIC4uLikuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTAyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEwMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBTdHJpbmcgaHR0cEhlYWRlciA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpOwotCi0gICAgU3RyaW5nIHJlcXVlc3RNZXNzYWdlID0gbnVsbDsKLSAgICAvL1N0cmluZyByZXNwb25zZU1lc3NhZ2UgPSBudWxsOwotICAgIFN0cmluZyBjb250ZW50VHlwZSA9IG51bGw7Ci0gICAgcmVzdWx0ID0gbnVsbDsKLSAgICAvLwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gY2hlY2sgSFRUUCBzdGF0dXMgY29kZQotICAgICAgU3RyaW5nIGh0dHBTdGF0dXMgPQotICAgICAgICBVdGlscy5nZXRIVFRQU3RhdHVzQ29kZSgKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKSk7Ci0gICAgICBpZiAoIjQwMCIuZXF1YWxzKGh0dHBTdGF0dXMpKQotICAgICAgewotCi0gICAgICAgIHJlcXVlc3RNZXNzYWdlID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRNZXNzYWdlKCk7Ci0KLSAgICAgICAgU3RyaW5nIHJlcXVlc3RIVFRQSGVhZGVycyA9Ci0gICAgICAgICAgZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRIVFRQSGVhZGVycygpOwotCi0gICAgICAgIC8vY2hlY2sgcmVxdWVzdCBIVFRQIEhlYWRlcnMKLQotICAgICAgICAvL0h0dHBIZWFkZXJzVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBIdHRwSGVhZGVyc1ZhbGlkYXRvcigpOwotCi0gICAgICAgIGlmICghSHR0cEhlYWRlcnNWYWxpZGF0b3IKLSAgICAgICAgICAudmFsaWRhdGVIdHRwUmVxdWVzdEhlYWRlcnMocmVxdWVzdEhUVFBIZWFkZXJzKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9jaGVjayByZXF1ZXN0IHhtbCBtZXNzYWdlCi0KLSAgICAgICAgY29udGVudFR5cGUgPSAoU3RyaW5nKSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlclRva2VucyhodHRwSGVhZGVyLCAiOiIpCi0gICAgICAgICAuZ2V0KEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRS50b1VwcGVyQ2FzZSgpKTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoV1NJQ29uc3RhbnRzLkNPTlRFTlRfVFlQRV9URVhUX1hNTCkgIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgLy9Eb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHJlcXVlc3RNZXNzYWdlKSkpOwotICAgICAgICAgICAgICBidWlsZGVyLnBhcnNlKAotICAgICAgICAgICAgICAgIG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHJlcXVlc3RNZXNzYWdlKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5ldyBXU0lFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICJcblJlcXVlc3QgbWVzc2FnZTpcbkhlYWRlcnM6XG4iCi0gICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCkKLSAgICAgICAgICAgICAgICArICJNZXNzYWdlOlxuIgotICAgICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldFJlcXVlc3QoKS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICArICJcblxuUmVzcG9uc2UgbWVzc2FnZTpcbkhlYWRlcnM6XG4iCi0gICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0UmVzcG9uc2UoKS5nZXRIVFRQSGVhZGVycygpCi0gICAgICAgICAgICAgICAgKyAiTWVzc2FnZTpcbiIKLSAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRSZXNwb25zZSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIHdzaWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQ2NTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTExMDMKLSAqLwotcHVibGljIGNsYXNzIFdTSTExMDMgZXh0ZW5kcyBCUDExMDMKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEwMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjJlNDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTExMDQuCi0gKiBUaGUgcmVxdWVzdCBtZXNzYWdlIHNob3VsZCBub3QgY29udGFpbiBhIGNvbnRlbnQtdHlwZSBvZiAidGV4dC94bWwiLgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTEwNCBleHRlbmRzIEJQMTEwNAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTA0KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxYTNiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5IVFRQVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuU2V0Q29va2llMlZhbGlkYXRvcjsKLQotCi0vKioKLSAqIEJQV1NJNC4KLSAqIFRoZSBDb29raWVzIHNob3VsZCBjb25mb3JtIHRvIFJGQzI5NjUuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTA1IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEwNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgU2V0Q29va2llMlZhbGlkYXRvciBjb29raWVWYWwgPSBuZXcgU2V0Q29va2llMlZhbGlkYXRvcigpOwotICAgIFN0cmluZyBoZWFkZXJzID0gZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgaWYgKGVudHJ5Q29udGV4dAotICAgICAgLmdldE1lc3NhZ2VFbnRyeSgpCi0gICAgICAuZ2V0VHlwZSgpCi0gICAgICAuZXF1YWxzSWdub3JlQ2FzZShNZXNzYWdlRW50cnkuVFlQRV9SRVNQT05TRSkpCi0gICAgewotICAgICAgLy8gaWYgcmVzcG9uc2UgdHJvbSBzZXJ2ZXIKLSAgICAgIFN0cmluZyBzZXRDb29raWUyID0KLSAgICAgICAgKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIlNldC1Db29raWUyIi50b1VwcGVyQ2FzZSgpKTsKLSAgICAgIGlmIChzZXRDb29raWUyID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmIChjb29raWVWYWwuaXNTZXRDb29raWUyKHNldENvb2tpZTIudHJpbSgpKSkKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgIlxuTWVzc2FnZTpcbkhlYWRlcnM6XG4iCi0gICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0SFRUUEhlYWRlcnMoKQotICAgICAgICAgICAgICAgICsgIlxuU09BUCBtZXNzYWdlOlxuIgotICAgICAgICAgICAgICAgICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gaWYgcmVxdWVzdCB0byB0aGUgc2VydmVyCi0gICAgICBTdHJpbmcgY29va2llID0KLSAgICAgICAgKFN0cmluZykgSFRUUFV0aWxzLmdldEh0dHBIZWFkZXJUb2tlbnMoaGVhZGVycywgIjoiKS5nZXQoIkNvb2tpZSIpOwotICAgICAgaWYgKGNvb2tpZSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoY29va2llVmFsLmlzQ29va2llKGNvb2tpZS50cmltKCkpKQotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAiXG5NZXNzYWdlOlxuSGVhZGVyczpcbiIKLSAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRIVFRQSGVhZGVycygpCi0gICAgICAgICAgICAgICAgKyAiXG5TT0FQIG1lc3NhZ2U6XG4iCi0gICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTEzZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMTA3OwotCi0vKioKLSAqIFdTSTExMDcKLSAqLwotcHVibGljIGNsYXNzIFdTSTExMDcgZXh0ZW5kcyBCUDExMDcKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEwNyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTIzNmU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1lc3NhZ2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuTnVsbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuT3BlcmF0aW9uU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIEJQV1NJNC4KLSAqIEVhY2ggc29hcGJpbmQgZXh0ZW5zaW9uIGVsZW1lbnQgd2l0aCBhIHdzZGw6cmVxdWlyZWQgCi0gKiBhdHRyaWJ1dGUgb2YgZmFsc2UgbXVzdCBhcHBlYXIgaW4gYSBtZXNzYWdlLgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTEwOCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0KLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTExMDgoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgT3BlcmF0aW9uU2lnbmF0dXJlLk9wZXJhdGlvbk1hdGNoIG1hdGNoID0gbnVsbDsKLSAgcHJpdmF0ZSBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0ID0gbnVsbDsKLSAgcHJpdmF0ZSBPcGVyYXRpb25TaWduYXR1cmUgcmVzcG9uc2VTaWcgPSBudWxsOwotICBwcml2YXRlIFZlY3RvciBoZWFkZXJSYXJ0cyA9IG51bGw7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdEZhdWx0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBleGlzdFNPQVBIZWFkZXIgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gaXNSZXF1ZXN0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBleGlzdFNPQVBIZWFkZXJGYXVsdCA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChTT0FQQm9keSwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IGJvZHksIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotCi0gICAgLy8gaWYgIndzZGw6cmVxdWlyZWQiIGlzIHRydWUgdGhlbiByZXR1cm4KLSAgICBpZiAoYm9keS5nZXRSZXF1aXJlZCgpICE9IG51bGwKLSAgICAgICYmIGJvZHkuZ2V0UmVxdWlyZWQoKS5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKQotICAgICAgcmV0dXJuOwotCi0gICAgLy8gYXNzZXJ0IHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJvcCA9IGN0eC5nZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgaWYgKGJvcC5nZXRPcGVyYXRpb24oKSA9PSBudWxsCi0gICAgICB8fCBib3AuZ2V0T3BlcmF0aW9uKCkuZ2V0T3V0cHV0KCkgPT0gbnVsbAotICAgICAgfHwgYm9wLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIE1lc3NhZ2UgbXNnID0gYm9wLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICBMaXN0IHBhcnRzID0KLSAgICAgIFdTRExVdGlsLmdldFBhcnRzKAotICAgICAgICBib3AuZ2V0T3BlcmF0aW9uKCksCi0gICAgICAgIG1zZywKLSAgICAgICAgYm9keSwKLSAgICAgICAgbWF0Y2guZ2V0T3BlcmF0aW9uU3R5bGUoKSk7Ci0KLSAgICBRTmFtZSBhZGRpdGlvbmFsTmFtZSA9IG51bGw7Ci0gICAgLy8gaWYgb3BlcmF0aW9uIGlzIHJwYywgYWRkIHRvIHBhcnRzIHFuYW1lIHFpdGggZnVuY3Rpb24gbmFtZQotICAgIGlmIChXU0lDb25zdGFudHMKLSAgICAgIC5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMKLSAgICAgIC5lcXVhbHMobWF0Y2guZ2V0T3BlcmF0aW9uU3R5bGUoKSkpCi0gICAgewotICAgICAgLy8gZm91bmQgb3V0IHRhcmdldCBuYW1lc3BhY2UKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBib2R5LmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgaWYgKG5hbWVzcGFjZSA9PSBudWxsIHx8IG5hbWVzcGFjZS5sZW5ndGgoKSA9PSAwKQotICAgICAgICAvLyAhISBBVFRFTlRJT04KLSAgICAgICAgLy8gbmFtZXNwYWNlIHNob3VsZCBiZSByZXRyaWV2ZWQgZnJvbSBzZXJ2aWNlIHRhcmdldCBuYW1lYXBjZSAgICAgICAgICAgIAotICAgICAgICBuYW1lc3BhY2UgPSBjdHguZ2V0QmluZGluZygpLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgIC8vIGluc2VydCBvcGVyYXRpb24gbmFtZSBhcyBmaXJzdCBzaWduYXR1cmUgcGFydAotICAgICAgYWRkaXRpb25hbE5hbWUgPQotICAgICAgICBuZXcgUU5hbWUoCi0gICAgICAgICAgbmFtZXNwYWNlLAotICAgICAgICAgIGJvcAotICAgICAgICAgICAgLmdldE9wZXJhdGlvbigpCi0gICAgICAgICAgICAuZ2V0T3V0cHV0KCkKLSAgICAgICAgICAgIC5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgIC5nZXRRTmFtZSgpCi0gICAgICAgICAgICAuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSB0aGUgc2lnbmF0dXJlIG9mIHRoaXMgb3BlcmF0aW9uCi0gICAgT3BlcmF0aW9uU2lnbmF0dXJlIG9wID0KLSAgICAgIG5ldyBPcGVyYXRpb25TaWduYXR1cmUoCi0gICAgICAgIHBhcnRzLAotICAgICAgICBudWxsLAotICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQKLSAgICAgICAgICAgIC5nZXRDYW5kaWRhdGVJbmZvKCkKLSAgICAgICAgICAgIC5nZXRXc2RsRG9jdW1lbnQoKQotICAgICAgICAgICAgLmdldERlZmluaXRpb25zKCksCi0gICAgICAgICAgICB2YWxpZGF0b3IpLAotICAgICAgICBmYWxzZSk7Ci0gICAgaWYgKGFkZGl0aW9uYWxOYW1lICE9IG51bGwpCi0gICAgICBvcC5nZXRTaWduYXR1cmUoKS5hZGQoMCwgYWRkaXRpb25hbE5hbWUpOwotCi0gICAgaWYgKG9wLmdldFNpZ25hdHVyZSgpLmVxdWFscyhyZXNwb25zZVNpZy5nZXRTaWduYXR1cmUoKSkpCi0gICAgewotICAgICAgLy8gICAgICAgICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgc2lnbmF0dXJlIG9mIHRoaXMgb3BlcmF0aW9uCi0gICAgICBvcCA9Ci0gICAgICAgIG5ldyBPcGVyYXRpb25TaWduYXR1cmUoCi0gICAgICAgICAgcGFydHMsCi0gICAgICAgICAgbnVsbCwKLSAgICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAgIC5nZXRXc2RsRG9jdW1lbnQoKQotICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICAgICAgdmFsaWRhdG9yKSwKLSAgICAgICAgICB0cnVlKTsKLQotICAgICAgaWYgKGFkZGl0aW9uYWxOYW1lICE9IG51bGwpCi0gICAgICAgIG9wLmdldFNpZ25hdHVyZSgpLmFkZCgwLCBhZGRpdGlvbmFsTmFtZSk7Ci0gICAgICBpZiAob3AuZ2V0U2lnbmF0dXJlKCkuZXF1YWxzKHJlc3BvbnNlU2lnLmdldFNpZ25hdHVyZSgpKSkKLSAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICJcbk1lc3NhZ2U6XG4iICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXIsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQSGVhZGVyIGhlYWRlciwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotCi0gICAgaWYgKGV4aXN0U09BUEhlYWRlckZhdWx0ID09IGZhbHNlKQotICAgIHsKLSAgICAgIGV4aXN0U09BUEhlYWRlciA9IGZhbHNlOwotICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIGlmICJ3c2RsOnJlcXVpcmVkIiBpcyB0cnVlIHRoZW4gcmV0dXJuCi0gICAgaWYgKGhlYWRlci5nZXRSZXF1aXJlZCgpICE9IG51bGwKLSAgICAgICYmIGhlYWRlci5nZXRSZXF1aXJlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0gICAgICByZXR1cm47Ci0gICAgLy8gZmluZCBoZWFkciBwYXJ0Ci0gICAgRGVmaW5pdGlvbiBkID0gKERlZmluaXRpb24pIGN0eC5nZXRQYXJhbWV0ZXIoImRlZmluaXRpb24iKTsKLSAgICBUeXBlc1JlZ2lzdHJ5IHRSZWcgPSAoVHlwZXNSZWdpc3RyeSkgY3R4LmdldFBhcmFtZXRlcigiVHlwZXNSZWdpc3RyeSIpOwotICAgIFBhcnQgbWVzUGFydCA9Ci0gICAgICBXU0RMVXRpbC5nZXRQYXJ0KGQuZ2V0TWVzc2FnZShoZWFkZXIuZ2V0TWVzc2FnZSgpKSwgaGVhZGVyLmdldFBhcnQoKSk7Ci0KLSAgICAvLyB0ZXN0IHRoaXMgcGFydCBhbmQgcGFydHMgZnJvbSBoZWFkZXIgICAgICAgIAotICAgIFFOYW1lIHBhcnRRTmFtZSA9IG1lc1BhcnQuZ2V0VHlwZU5hbWUoKTsKLSAgICBpZiAocGFydFFOYW1lID09IG51bGwpCi0gICAgICBwYXJ0UU5hbWUgPSB0UmVnLmdldFR5cGUobWVzUGFydC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICBpZiAocGFydFFOYW1lID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiUGFydCB0eXBlIGNhbiBub3QgYmUgbnVsbC4iICsgbWVzUGFydC5nZXRFbGVtZW50TmFtZSgpLnRvU3RyaW5nKCkpOwotICAgIFN0cmluZyBsb2NhbCA9IHBhcnRRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICBTdHJpbmcgbnMgPSBwYXJ0UU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICBleGlzdFNPQVBIZWFkZXIgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlclJhcnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbSA9IChFbGVtZW50KSBoZWFkZXJSYXJ0cy5nZXQoaSk7Ci0gICAgICBpZiAoZWxlbS5nZXRMb2NhbE5hbWUoKS5lcXVhbHMobG9jYWwpCi0gICAgICAgICYmIE51bGxVdGlsLmVxdWFscyhucywgZWxlbS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICB7Ci0gICAgICAgIGV4aXN0U09BUEhlYWRlciA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZXhpc3RTT0FQSGVhZGVyID09IHRydWUpCi0gICAgICBjdHguY2FuY2VsU09BUEhlYWRlclByb2Nlc3NpbmcoKTsKLSAgICBpZiAoaXNSZXF1ZXN0ID09IHRydWUpCi0gICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICBpZiAoZXhpc3RTT0FQSGVhZGVyID09IGZhbHNlICYmIGlzUmVxdWVzdCA9PSBmYWxzZSkKLSAgICAgIGV4aXN0U09BUEhlYWRlckZhdWx0ID0gZmFsc2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQSGVhZGVyRmF1bHQgaGVhZGVyRmF1bHQsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICAvLyBmaW5kIGhlYWRyIHBhcnQKLSAgICBEZWZpbml0aW9uIGQgPSAoRGVmaW5pdGlvbikgY3R4LmdldFBhcmFtZXRlcigiZGVmaW5pdGlvbiIpOwotICAgIFR5cGVzUmVnaXN0cnkgdFJlZyA9IChUeXBlc1JlZ2lzdHJ5KSBjdHguZ2V0UGFyYW1ldGVyKCJUeXBlc1JlZ2lzdHJ5Iik7Ci0gICAgUGFydCBtZXNQYXJ0ID0KLSAgICAgIFdTRExVdGlsLmdldFBhcnQoCi0gICAgICAgIGQuZ2V0TWVzc2FnZShoZWFkZXJGYXVsdC5nZXRNZXNzYWdlKCkpLAotICAgICAgICBoZWFkZXJGYXVsdC5nZXRQYXJ0KCkpOwotCi0gICAgLy8gdGVzdCB0aGlzIHBhcnQgYW5kIHBhcnRzIGZyb20gaGVhZGVyZmF1bHQKLSAgICBRTmFtZSBwYXJ0UU5hbWUgPSBtZXNQYXJ0LmdldFR5cGVOYW1lKCk7Ci0gICAgaWYgKHBhcnRRTmFtZSA9PSBudWxsKQotICAgICAgcGFydFFOYW1lID0gdFJlZy5nZXRUeXBlKG1lc1BhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgaWYgKHBhcnRRTmFtZSA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgIlBhcnQgdHlwZSBjYW4gbm90IGJlIG51bGwuIiArIG1lc1BhcnQuZ2V0RWxlbWVudE5hbWUoKS50b1N0cmluZygpKTsKLSAgICBTdHJpbmcgbG9jYWwgPSBwYXJ0UU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgU3RyaW5nIG5zID0gcGFydFFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJSYXJ0cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBFbGVtZW50IGVsZW0gPSAoRWxlbWVudCkgaGVhZGVyUmFydHMuZ2V0KGkpOwotICAgICAgaWYgKGVsZW0uZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGxvY2FsKQotICAgICAgICAmJiBOdWxsVXRpbC5lcXVhbHMobnMsIGVsZW0uZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgewotICAgICAgICBleGlzdFNPQVBIZWFkZXJGYXVsdCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZXhpc3RTT0FQSGVhZGVyRmF1bHQgPT0gdHJ1ZSkKLSAgICAgIGN0eC5jYW5jZWxTT0FQSGVhZGVyUHJvY2Vzc2luZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEZhdWx0IGZhdWx0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICAvLyBzZXQgaW4gdHJ1ZSBpZiBhbnkgU09BUEZhdWx0IGV4aXN0Ci0gICAgdmlzaXRGYXVsdCA9IHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIGlmICh0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRoaXMuZW50cnlDb250ZXh0ID0gZW50cnlDb250ZXh0OwotICAgICAgLy8gUGFyc2UgcmVxdWVzdCBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdERvY3VtZW50KCk7Ci0gICAgICAvLyBjcmVhdGUgcmVxdWVzdCBzaWduYXR1cmUKLSAgICAgIG1hdGNoID0KLSAgICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLm1hdGNoT3BlcmF0aW9uKAotICAgICAgICAgIGRvYywKLSAgICAgICAgICBudWxsLAotICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKClbMF0sCi0gICAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQKLSAgICAgICAgICAgICAgLmdldENhbmRpZGF0ZUluZm8oKQotICAgICAgICAgICAgICAuZ2V0V3NkbERvY3VtZW50KCkKLSAgICAgICAgICAgICAgLmdldERlZmluaXRpb25zKCksCi0gICAgICAgICAgICAgIHZhbGlkYXRvciksCi0gICAgICAgICAgZmFsc2UpOwotCi0gICAgICAvLyBpZiBzdWNoIG9wZXJhdGlvbiBleGlzdCAgICAgIAotICAgICAgaWYgKG1hdGNoICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlzUmVxdWVzdCA9Ci0gICAgICAgICAgTWVzc2FnZUVudHJ5LlRZUEVfUkVRVUVTVC5lcXVhbHMoCi0gICAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0VHlwZSgpKTsKLSAgICAgICAgLy8gUGFyc2UgbWVzc2FnZQotICAgICAgICBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLQotICAgICAgICBpZiAoIWlzUmVxdWVzdCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3BvbnNlU2lnID0gbmV3IE9wZXJhdGlvblNpZ25hdHVyZShkb2MpOwotICAgICAgICAgIGlmIChXU0lDb25zdGFudHMKLSAgICAgICAgICAgIC5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMKLSAgICAgICAgICAgIC5lcXVhbHMobWF0Y2guZ2V0T3BlcmF0aW9uU3R5bGUoKSkpCi0gICAgICAgICAgICByZXNwb25zZVNpZy5jcmVhdGVSUENTaWduYXR1cmUoKTsKLSAgICAgICAgfQotICAgICAgICAvLyBleHRyYWN0IGFsbCBoZWFkZXJzIGZyb20gbWVzc2FnZQotICAgICAgICBFbGVtZW50IGhlYWRlckVsZW0gPQotICAgICAgICAgIFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoCi0gICAgICAgICAgICBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksCi0gICAgICAgICAgICBXU0lUYWcuRUxFTV9TT0FQX0hFQURFUik7Ci0gICAgICAgIGhlYWRlclJhcnRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBpZiAoaGVhZGVyRWxlbSAhPSBudWxsKQotICAgICAgICAgIGhlYWRlclJhcnRzID0gWE1MVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cyhoZWFkZXJFbGVtKTsKLQotICAgICAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgICAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQm9keSh0cnVlKTsKLSAgICAgICAgdHJhdmVyc2FsLnZpc2l0U09BUEhlYWRlcih0cnVlKTsKLSAgICAgICAgdHJhdmVyc2FsLnZpc2l0U09BUEhlYWRlckZhdWx0KHRydWUpOwotICAgICAgICB0cmF2ZXJzYWwudmlzaXRTT0FQRmF1bHQodHJ1ZSk7Ci0KLSAgICAgICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICAgICAgdHJhdmVyc2FsLmlnbm9yZUJpbmRpbmdJbnB1dDJTT0FQQm9keSgpOwotCi0gICAgICAgIGlmIChpc1JlcXVlc3QpCi0gICAgICAgICAgdHJhdmVyc2FsLmlnbm9yZUJpbmRpbmdPdXRwdXQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHRyYXZlcnNhbC5pZ25vcmVCaW5kaW5nSW5wdXQyU09BUEhlYWRlcigpOwotCi0gICAgICAgIGlmIChyZXNwb25zZVNpZyAhPSBudWxsICYmIHJlc3BvbnNlU2lnLmlzRmF1bHQoKSkKLSAgICAgICAgICB0cmF2ZXJzYWwuaWdub3JlQmluZGluZ091dHB1dCgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgdHJhdmVyc2FsLmlnbm9yZUJpbmRpbmdGYXVsdCgpOwotCi0gICAgICAgIGV4aXN0U09BUEhlYWRlckZhdWx0ID0gdHJ1ZTsKLSAgICAgICAgTWFwIG0gPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBXU0RMVXRpbC5leHBhbmREZWZpbml0aW9uKAotICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgLmdldENhbmRpZGF0ZUluZm8oKQotICAgICAgICAgICAgLmdldFdzZGxEb2N1bWVudCgpCi0gICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSk7Ci0gICAgICAgIG0ucHV0KAotICAgICAgICAgICJkZWZpbml0aW9uIiwKLSAgICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0Ci0gICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAuZ2V0V3NkbERvY3VtZW50KCkKLSAgICAgICAgICAgIC5nZXREZWZpbml0aW9ucygpKTsKLSAgICAgICAgVHlwZXNSZWdpc3RyeSB0UmVnID0KLSAgICAgICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgICAgICAgdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dAotICAgICAgICAgICAgICAuZ2V0Q2FuZGlkYXRlSW5mbygpCi0gICAgICAgICAgICAgIC5nZXRXc2RsRG9jdW1lbnQoKQotICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICAgICAgdmFsaWRhdG9yKTsKLSAgICAgICAgbS5wdXQoIlR5cGVzUmVnaXN0cnkiLCB0UmVnKTsKLSAgICAgICAgdHJhdmVyc2FsLnRyYXZlcnNlKG1hdGNoLmdldE9wZXJhdGlvbigpLCBtKTsKLQotICAgICAgICBpZiAoaXNSZXF1ZXN0ID09IGZhbHNlKQotICAgICAgICAgIGlmIChleGlzdFNPQVBIZWFkZXJGYXVsdCA9PSB0cnVlKQotICAgICAgICAgICAgZXhpc3RTT0FQSGVhZGVyID0gdHJ1ZTsKLQotICAgICAgICBpZiAocmVzcG9uc2VTaWcgIT0gbnVsbAotICAgICAgICAgICYmIHJlc3BvbnNlU2lnLmlzRmF1bHQoKQotICAgICAgICAgICYmIHZpc2l0RmF1bHQgPT0gZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICJcbk1lc3NhZ2U6XG4iICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhpc3RTT0FQSGVhZGVyID09IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAiXG5NZXNzYWdlOlxuIiArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTExMDkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmY0NGNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEwOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIFdTSTExMDkuCi0gKiBBbnkgY29uZm9ybWFuY2UgY2xhaW1zIE1VU1QgYmUgY2hpbGRyZW4gb2YgdGhlIHNvYXA6SGVhZGVyIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTA5IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEwOShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgaWYgKChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkgIT0gbnVsbCkKLSAgICAgICYmICghdGhpcy52YWxpZGF0b3IuaXNPbmVXYXlSZXNwb25zZShlbnRyeUNvbnRleHQpKSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gUGFyc2UgbWVzc2FnZQotICAgICAgICBEb2N1bWVudCBkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKTsKLSAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAvLyBmaW5kICJIZWFkZXIiIGVsZW1lbnQKLSAgICAgICAgTm9kZUxpc3QgaGVhZGVyTGlzdCA9Ci0gICAgICAgICAgcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwgIkhlYWRlciIpOwotICAgICAgICBFbGVtZW50IGhlYWRlckVsZW0gPSBudWxsOwotICAgICAgICBpZiAoaGVhZGVyTGlzdCAhPSBudWxsICYmIGhlYWRlckxpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkKLSAgICAgICAgICBoZWFkZXJFbGVtID0gKEVsZW1lbnQpIGhlYWRlckxpc3QuaXRlbSgwKTsKLQotICAgICAgICAvLyBmaW5kICJDbGFpbSIgZWxlbWVudAotICAgICAgICBOb2RlTGlzdCBjbGFpbUxpc3QgPQotICAgICAgICAgIHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhXU0lDb25zdGFudHMuTlNfVVJJX0NMQUlNLCAiQ2xhaW0iKTsKLSAgICAgICAgaWYgKGNsYWltTGlzdCA9PSBudWxsIHx8IGNsYWltTGlzdC5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYWltTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoZWFkZXJFbGVtID09IG51bGwKLSAgICAgICAgICAgICAgfHwgY2xhaW1MaXN0Lml0ZW0oaSkuZ2V0UGFyZW50Tm9kZSgpICE9IGhlYWRlckVsZW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAgICAgIlxuU09BUCBtZXNzYWdlOlxuIgotICAgICAgICAgICAgICAgICAgICArIGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTExMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiM2I5ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBXU0kxMTEwLgotICogQW55IGNvbmZvcm1hbmNlIGNsYWltcyBNVVNUIGFkaGVyZSB0byB0aGUgV1MtSSBjb25mb3JtYW5jZSAKLSAqIGNsYWltIHNjaGVtYSBkZWZpbmVkIGluIHRoZSBCYXNpYyBQcm9maWxlLgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTExMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBCYXNlTWVzc2FnZVZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTExMTAoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIERvY3VtZW50IGRvYzsKLSAgICBpZiAoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpICE9IG51bGwKLSAgICAgICYmICF0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCkKLSAgICAgICYmIChkb2MgPSBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5RG9jdW1lbnQoKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAvLyBmaW5kICJDbGFpbSIgZWxlbWVudAotICAgICAgTm9kZUxpc3QgY2xhaW1MaXN0ID0KLSAgICAgICAgcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFdTSUNvbnN0YW50cy5OU19VUklfQ0xBSU0sICJDbGFpbSIpOwotICAgICAgaWYgKGNsYWltTGlzdCA9PSBudWxsIHx8IGNsYWltTGlzdC5nZXRMZW5ndGgoKSA9PSAwKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYWltTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpIGNsYWltTGlzdC5pdGVtKGkpOwotICAgICAgICAgIC8vIGNoZWNrICJjb25mb3Jtc1RvIiBhdHRyaWJ1dGUKLSAgICAgICAgICBOb2RlIG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImNvbmZvcm1zVG8iKTsKLSAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICAgIlxuU09BUCBtZXNzYWdlOlxuIgotICAgICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLyogVGhpcyBpcyBjaGVja2VkIGluIFdTSTExMTEKLSAgICAgICAgICAvLyBjaGVjayAibXVzdFVuZGVyc3RhbmQiIGF0dHJpYnV0ZQotICAgICAgICAgIG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGVOUyhXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsICJtdXN0VW5kZXJzdGFuZCIpOwotICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gY3JlYXRlRmFpbHVyZURldGFpbCgiXG5TT0FQIG1lc3NhZ2U6XG4iICsgZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAqLwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTExMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NGUzZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBXU0kxMTExLgotICogQW55IGNvbmZvcm1hbmNlIGNsYWltcyBNVVNUIE5PVCB1c2Ugc29hcDptdXN0VW5kZXJzdGFuZD0nMScuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTExIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTExMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgRG9jdW1lbnQgZG9jOwotICAgIGlmIChlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkgIT0gbnVsbAotICAgICAgJiYgIXRoaXMudmFsaWRhdG9yLmlzT25lV2F5UmVzcG9uc2UoZW50cnlDb250ZXh0KQotICAgICAgJiYgKGRvYyA9IGVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnlEb2N1bWVudCgpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgIC8vIGZpbmQgIkNsYWltIiBlbGVtZW50Ci0gICAgICBOb2RlTGlzdCBjbGFpbUxpc3QgPQotICAgICAgICByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9DTEFJTSwgIkNsYWltIik7Ci0gICAgICBpZiAoY2xhaW1MaXN0ICE9IG51bGwgJiYgY2xhaW1MaXN0LmdldExlbmd0aCgpICE9IDApCi0gICAgICB7Ci0gICAgICAgIC8vIGlmIGNvbnRhaW5zICJDbGFpbSIgZWxlbWVudCBmaW5kIGFsbCAiSGVhZGVyIiBlbGVtZW50cwotICAgICAgICBOb2RlTGlzdCBoZWFkZXJMaXN0ID0KLSAgICAgICAgICByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQLCAiSGVhZGVyIik7Ci0gICAgICAgIGlmIChoZWFkZXJMaXN0ICE9IG51bGwgJiYgaGVhZGVyTGlzdC5nZXRMZW5ndGgoKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaUhlYWRlciA9IDA7IGlIZWFkZXIgPCBoZWFkZXJMaXN0LmdldExlbmd0aCgpOyBpSGVhZGVyKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gZmluZCBhbGwgIkhlYWRlciIgY2hpbGQgZWxlbWVudHMKLSAgICAgICAgICAgIE5vZGUgY2hpbGQgPSBoZWFkZXJMaXN0Lml0ZW0oaUhlYWRlcikuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgY29udGFpbnMgIm11c3RVbmRlcnN0YW5kIiAtPiBmYWlsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJWYWwgPQotICAgICAgICAgICAgICAgICAgKChFbGVtZW50KSBjaGlsZCkuZ2V0QXR0cmlidXRlTlMoCi0gICAgICAgICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfU09BUCwKLSAgICAgICAgICAgICAgICAgICAgIm11c3RVbmRlcnN0YW5kIik7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWwgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGF0dHJWYWwpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICAgICAgICAgIlxuU09BUCBtZXNzYWdlOlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeUNvbnRleHQuZ2V0TWVzc2FnZUVudHJ5KCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICBpSGVhZGVyID0gaGVhZGVyTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTExNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyODlkZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci0KLS8qKgotICogV1NJMTExNgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTExNiBleHRlbmRzIEJQMTExNgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMTE2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTEyMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiM2ViYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMTIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBCUFdTSTQuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMTIxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIEJhc2VNZXNzYWdlVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTEyMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdUOiAtLSBzdGFydDogYmFzZSBvbiB3c2kxMDExIC0gc2hvdWxkIHJlZmFjdG9yIHRoaXMKLQotICAgICAgQmluZGluZ1tdIGJpbmRpbmdzID0gdmFsaWRhdG9yLmFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0QmluZGluZ3MoKTsKLQotICAgICAgLy8gZ2V0IHNvYXAgbWVzc2FnZSBjaGlsZCBuYW1lCi0gICAgICAvLyBHZXQgdGhlIERPTSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSBzb2FwOmJvZHkgKGlmIG5vbi1lbXB0eSkKLSAgICAgIERvY3VtZW50IG1lc3NhZ2VEb2MgPSBudWxsOwotCi0gICAgICBRTmFtZSBtZXNzYWdlUGFydEVsZW1lbnRRTmFtZSA9IG51bGw7Ci0gICAgICBpZiAoIWVudHJ5Q29udGV4dC5nZXRNZXNzYWdlRW50cnkoKS5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZURvYyA9Ci0gICAgICAgICAgWE1MVXRpbHMucGFyc2VYTUwoZW50cnlDb250ZXh0LmdldE1lc3NhZ2VFbnRyeSgpLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIC8vIGdldCBzb2FwIG9wZXJhdGlvbiBuYW1lIGZyb20gdGhlIHNvYXA6Ym9keQotCi0gICAgICAgIC8vIE5PVEU6IGdldFNvYXBCb2R5Q2hpbGQoKSBtYXkgcmV0dXJuIG51bGwsIGlmIHRoZSBzb2FwOmJvZHkgZGlkIG5vdCBjb250YWluIGFueSBjaGlsZCBlbGVtZW50cwotICAgICAgICBFbGVtZW50IHNvYXBNZXNzYWdlRWxlbWVudCA9IHRoaXMudmFsaWRhdG9yLmdldFNvYXBCb2R5Q2hpbGQobWVzc2FnZURvYyk7Ci0KLSAgICAgICAgLy8gZm9yIGRvYy1saXQuLi4gZmluZCB0aGUgd3NkbDpwYXJ0IGZyb20gb25lIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9ucyB0aGF0IGhhcyAKLSAgICAgICAgLy8gdGhlIHNvYXAgZWxlbWVudCB1c2VkIGluIHRoZSBtZXNzYWdlLiAgICAgIAotICAgICAgICAvLyB3ZSBhcmUgbG9va2luZyBmb3IgYSBwYXJ0IHdpdGggYW4gZWxlbWVudCBhdHRyaWIgdmFsIG1hdGNoaW5nIHRoZSBzb2FwIG1lc3NhZ2UgZWxlbWVudAotICAgICAgICBpZiAoc29hcE1lc3NhZ2VFbGVtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlUGFydEVsZW1lbnRRTmFtZSA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgIHNvYXBNZXNzYWdlRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSwKLSAgICAgICAgICAgICAgc29hcE1lc3NhZ2VFbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoKG1lc3NhZ2VEb2MgPT0gbnVsbCkgfHwgdGhpcy52YWxpZGF0b3IuaXNGYXVsdChtZXNzYWdlRG9jKSkKLSAgICAgIHsKLSAgICAgICAgLy8gZW1wdHkgbWVzc2FnZXMgYW5kIG1lc3NhZ2VzIGNvbnRhaW5pbmcgc29hcDpGYXVsdHMgZG8gbm90IHF1YWxpZnkgZm9yIHRoaXMgVEEKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgQmluZGluZ09wZXJhdGlvbltdIGRvY0JpbmRpbmdPcGVyYXRpb25zID0KLSAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0TWF0Y2hpbmdCaW5kaW5nT3BzKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MsCi0gICAgICAgICAgYmluZGluZ3MpOwotICAgICAgLy8gbGlzdCBvZiBvcGVyYXRpb25zIHRoYXQgbWF0Y2ggdGhlIDx3c2RsOmlucHV0PiBvciA8d3NkbDpvdXRwdXQ+IChkZXBlbmRpbmcgb24gZW50cnlUeXBlKQotICAgICAgLy8gZm9yIHBhcnQgZWxlbWVudD0iLi4uIgotICAgICAgLy8gKElTU1VFOiB3aGF0IGFib3V0IHBhcnQgdHlwZT0iLi4uIj8pCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uW10gcG90ZW50aWFsRG9jTGl0T3BzID0KLSAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0RG9jTGl0T3BlcmF0aW9ucygKLSAgICAgICAgICBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKSwKLSAgICAgICAgICBtZXNzYWdlUGFydEVsZW1lbnRRTmFtZSwKLSAgICAgICAgICBkb2NCaW5kaW5nT3BlcmF0aW9ucyk7Ci0gICAgICAvLyBHVDogLS0tIGVuZDogYmFzZSBvbiB3c2kxMDExCi0KLSAgICAgIC8vICAgICAgICAgICAgICAgCi0gICAgICBpZiAocG90ZW50aWFsRG9jTGl0T3BzLmxlbmd0aCA9PSAwKQotICAgICAgewotICAgICAgICAvLyBub3QgZG9jLWxpdCBzbyBxdWl0Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdlIGtub3cgdGhlcmUgaXMgYSBkb2MtbGl0IG1hdGNoLCBzbyBub3cgdHJ5IHRvIHZhbGlkYXRlIHRoZSBzb2FwIG1lc3NhZ2UgYWdhaW5zdCB0aGUKLSAgICAgIC8vIHJlZmVyZW5jZWQgc2NoZW1hCi0KLSAgICAgIC8vIEdUIC0gaG93IHRvIHJlZmVyZW5jZSB0aGUgc2NoZW1hIGRvY3VtZW50Pz8gbmVlZCB0byB1c2UgdGhlIDx3c2RsOnBhcnQ+LCBvciBkbyBpdCBwdXJlbHkKLSAgICAgIC8vIGZyb20gdGhlIHNvYXAgbWVzc2FnZSBlbGVtZW50cz8KLSAgICAgIC8vIGllIGJvZHksIGVudmVsb3BlIG9yIHdzZGw/PwotCi0gICAgICAvLyA8ZXhwZXJpbWVudD4KLQotICAgICAgYm9vbGVhbiBpc1NjaGVtYVZhbGlkOwotICAgICAgCi0gICAgICB0cnkgewotICAgICAgCQlpc1NjaGVtYVZhbGlkID0gdGhpcy52YWxpZGF0b3IubWVzc2FnZUlzRG9jTGl0U2NoZW1hVmFsaWQoZW50cnlDb250ZXh0KTsgICAgICAgICAKLSAgICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgIAkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgIAl9Ci0gICAgICAvLyA8L2V4cGVyaW1lbnQ+Ci0gICAgICAKLQotICAgICAgLy9pc1NjaGVtYVZhbGlkID0gdHJ1ZTsgLy8gZm9yIG5vdywgZ2V0dGluZyB0aGlzIGZhciBkb2VzIGl0Ci0KLSAgICAgIGlmIChpc1NjaGVtYVZhbGlkKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25QYXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2ZjA4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEyMDE7Ci0KLS8qKgotICogV1NJMTIwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTIwMSBleHRlbmRzIEJQMTIwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMjAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzFjZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMjAyOwotCi0vKioKLSAqIFdTSTEyMDIKLSAqLwotcHVibGljIGNsYXNzIFdTSTEyMDIgZXh0ZW5kcyBCUDEyMDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTIwMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjNiY2JmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTIwMzsKLQotLyoqCi0gKiBXU0kxMjAzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMjAzIGV4dGVuZHMgQlAxMjAzCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEyMDMoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkZGE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEyMDQ7Ci0KLS8qKgotICogV1NJMTIwNAotICovCi1wdWJsaWMgY2xhc3MgV1NJMTIwNCBleHRlbmRzIEJQMTIwNAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMjA0KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIwOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOTQ5NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMjA4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMjA4OwotCi0vKioKLSAqIFdTSTEyMDgKLSAqLwotcHVibGljIGNsYXNzIFdTSTEyMDggZXh0ZW5kcyBCUDEyMDgKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTIwOChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEyMTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y1N2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTIxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTIxMTsKLQotLyoqCi0gKiBXU0kxMjExCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMjExIGV4dGVuZHMgQlAxMjExCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEyMTEoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwZWI4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEzMDE7Ci0KLS8qKgotICogV1NJMTMwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTMwMSBleHRlbmRzIEJQMTMwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMzAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTc2ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMzAyOwotCi0vKioKLSAqIFdTSTEzMDIKLSAqLwotcHVibGljIGNsYXNzIFdTSTEzMDIgZXh0ZW5kcyBCUDEzMDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTMwMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjJlMTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTMwNTsKLQotLyoqCi0gKiBXU0kxMzA1Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMzA1IGV4dGVuZHMgQlAxMzA1Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEzMDUoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxMDYyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEzMDY7Ci0KLS8qKgotICogV1NJMTMwNgotICovCi1wdWJsaWMgY2xhc3MgV1NJMTMwNiBleHRlbmRzIEJQMTMwNgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMzA2KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzA1YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMzA3OwotCi0vKioKLSAqIFdTSTEzMDcKLSAqLwotcHVibGljIGNsYXNzIFdTSTEzMDcgZXh0ZW5kcyBCUDEzMDcKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTMwNyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI3MWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTMwODsKLQotLyoqCi0gKiBXU0kxMzA4Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMzA4IGV4dGVuZHMgQlAxMzA4Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEzMDgoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzA5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2NDM1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDEzMDk7Ci0KLS8qKgotICogV1NJMTMwOQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTMwOSBleHRlbmRzIEJQMTMwOQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMzA5KEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMxMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOThmYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblBhc3NFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuSFRUUFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk9wZXJhdGlvblNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqIEJQV1NJNC4KLSAqIFRoZSByZXNwb25zZSAoU09BUCBlbnZlbG9wZSkgc2hvdWxkIGJlIGNhcnJpZWQgYnkgYW4gSFRUUCAKLSAqIHJlc3BvbnNlLCBvdmVyIHNhbWUgSFRUUCBjb25uZWN0aW9uIGFzIHRoZSBSZXF1ZXN0LiAKLSAqLwotcHVibGljIGNsYXNzIFdTSTEzMTEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgQmFzZU1lc3NhZ2VWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxMzExKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKFRlc3RBc3NlcnRpb24sIEVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICBib29sZWFuIGlzT25lV2F5UmVzcG9uc2UgPSB0aGlzLnZhbGlkYXRvci5pc09uZVdheVJlc3BvbnNlKGVudHJ5Q29udGV4dCk7Ci0KLSAgICBEb2N1bWVudCBkb2NSZXNwb25zZSA9IG51bGw7Ci0gICAgaWYgKCFpc09uZVdheVJlc3BvbnNlKQotICAgICAgZG9jUmVzcG9uc2UgPSBlbnRyeUNvbnRleHQuZ2V0UmVzcG9uc2VEb2N1bWVudCgpOwotCi0gICAgLy9pZiBmYXVsdAotICAgIGlmICghaXNPbmVXYXlSZXNwb25zZSAmJiB0aGlzLnZhbGlkYXRvci5pc0ZhdWx0KGRvY1Jlc3BvbnNlKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgLy8gbm90IGZhdWx0Ci0gICAgICAvLyAxLiBnZXQgYW4gb3BlcmF0aW9uIGZyb20gcmVxdWVzdAotICAgICAgLy8gUGFyc2UgcmVxdWVzdCBtZXNzYWdlCi0gICAgICBEb2N1bWVudCBkb2NSZXF1ZXN0ID0gZW50cnlDb250ZXh0LmdldFJlcXVlc3REb2N1bWVudCgpOwotCi0gICAgICAvLyBnZXQgU09BUEFjdGlvbgotICAgICAgU3RyaW5nIGhlYWRlcnMgPSBlbnRyeUNvbnRleHQuZ2V0UmVxdWVzdCgpLmdldEhUVFBIZWFkZXJzKCk7Ci0gICAgICBTdHJpbmcgYWN0aW9uID0gbnVsbDsKLSAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpCi0gICAgICAgIGFjdGlvbiA9IChTdHJpbmcpIEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyVG9rZW5zKGhlYWRlcnMsICI6IikuZ2V0KCJTT0FQQWN0aW9uIi50b1VwcGVyQ2FzZSgpKTsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKClbMF07Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KCkuZ2V0RGVmaW5pdGlvbnMoKSwKLSAgICAgICAgICB2YWxpZGF0b3IpOwotICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLk9wZXJhdGlvbk1hdGNoIG1hdGNoID0KLSAgICAgICAgT3BlcmF0aW9uU2lnbmF0dXJlLm1hdGNoT3BlcmF0aW9uKAotICAgICAgICAgIGRvY1JlcXVlc3QsCi0gICAgICAgICAgYWN0aW9uLAotICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgcmVnaXN0cnkpOwotCi0gICAgICBpZiAobWF0Y2ggPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLQotICAgICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IG1hdGNoLmdldE9wZXJhdGlvbigpOwotICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBudWxsOwotCi0gICAgICAgICAgLy8gICAgQ2hlY2sgd2hldGhlciB0aGUgdHJhbnNwb3J0IGF0dHJpYnV0ZSBoYXMgdGhlIHZhbHVlIAotICAgICAgICAgIC8vICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi4gCi0gICAgICAgICAgTGlzdCBleHRFbGVtID0gYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGluZGV4ID0gZXh0RWxlbS5pdGVyYXRvcigpOyBpbmRleC5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gKE9iamVjdCkgaW5kZXgubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTT0FQQmluZGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIG87Ci0gICAgICAgICAgICAgIGlmICghV1NJQ29uc3RhbnRzCi0gICAgICAgICAgICAgICAgLk5TX1VSSV9TT0FQX0hUVFAKLSAgICAgICAgICAgICAgICAuZXF1YWxzKHNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydFVSSSgpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vZmluZCBvcGVyYXRpb24gaW4gcG9ydCB0eXBlCi0gICAgICAgICAgb3BlcmF0aW9uID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKTsKLSAgICAgICAgICBpZiAob3BlcmF0aW9uID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoaXNPbmVXYXlSZXNwb25zZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3BlcmF0aW9uLmdldE91dHB1dCgpID09IG51bGwpCi0gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25QYXNzRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gICAgY2hlY2sgd2hldGhlciB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBsb2cgCi0gICAgICAgICAgLy8gIGNvbnRhaW5zIHRoZSBvdXRwdXQgbWVzc2FnZQotICAgICAgICAgIE5vZGVMaXN0IHNvYXBCb2R5TGlzdCA9Ci0gICAgICAgICAgICBkb2NSZXNwb25zZS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKAotICAgICAgICAgICAgICBXU0lDb25zdGFudHMuTlNfVVJJX1NPQVAsCi0gICAgICAgICAgICAgIFhNTFV0aWxzLlNPQVBfRUxFTV9CT0RZKTsKLSAgICAgICAgICBpZiAoKHNvYXBCb2R5TGlzdCA9PSBudWxsKSB8fCAoc29hcEJvZHlMaXN0LmdldExlbmd0aCgpID09IDApKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gYW55IHNvYXAgQm9keSBlbGVtZW50cwotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb2FwQm9keUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBFbGVtZW50IG5leHRCb2R5RWxlbSA9IChFbGVtZW50KSBzb2FwQm9keUxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgIEVsZW1lbnQgc29hcE1lc3NhZ2VFbGVtZW50ID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChuZXh0Qm9keUVsZW0pOwotICAgICAgICAgICAgd2hpbGUgKHNvYXBNZXNzYWdlRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBvcGVyYXRpb24gb3V0cHV0IGhhcyBtZXNzYWdlIGZyb20gU09BUCByZXNwb25zZQotICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvcGVyYXRpb24uZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICBRTmFtZSBzb2FwTWVzc2FnZVFOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgUU5hbWUoCi0gICAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCksCi0gICAgICAgICAgICAgICAgICBzb2FwTWVzc2FnZUVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCi0gICAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBzb2FwTWVzc2FnZVFOYW1lLmVxdWFscyhtZXNzYWdlLmdldFFOYW1lKCkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblBhc3NFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHNvYXBNZXNzYWdlRWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoc29hcE1lc3NhZ2VFbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uUGFzc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEKQotICAgIHsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKG51bGwsIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMxNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZDMxNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxMzE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxMzE2OwotCi0vKioKLSAqIFdTSTEzMTYKLSAqLwotcHVibGljIGNsYXNzIFdTSTEzMTYgZXh0ZW5kcyBCUDEzMTYKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTMxNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTEzMTguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTNjZDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTMxOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQMTMxODsKLQotLyoqCi0gKiBXU0kxMzE4Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kxMzE4IGV4dGVuZHMgQlAxMzE4Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTEzMTgoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxNjAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTE2MDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5MjBmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTE2MDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDE2MDE7Ci0KLS8qKgotICogV1NJMTYwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMTYwMSBleHRlbmRzIEJQMTYwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0kxNjAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJMTcwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxNzAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhN2JlZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0kxNzAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlAxNzAxOwotCi0vKioKLSAqIFdTSTE3MDEKLSAqLwotcHVibGljIGNsYXNzIFdTSTE3MDEgZXh0ZW5kcyBCUDE3MDEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJMTcwMShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWMxYTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLmVudmVsb3BlLkJQNDEwMDsKLQotLyoqCi0gKiBXU0k0MTAwCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0k0MTAwIGV4dGVuZHMgQlA0MTAwCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBCYXNlTWVzc2FnZVZhbGlkYXRvcgotICAgKi8KLSAgcHVibGljIFdTSTQxMDAoQmFzZU1lc3NhZ2VWYWxpZGF0b3IgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMTY1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLm1lc3NhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlTWVzc2FnZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5lbnZlbG9wZS5CUDQxMDE7Ci0KLS8qKgotICogV1NJNDEwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJNDEwMSBleHRlbmRzIEJQNDEwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gQmFzZU1lc3NhZ2VWYWxpZGF0b3IKLSAgICovCi0gIHB1YmxpYyBXU0k0MTAxKEJhc2VNZXNzYWdlVmFsaWRhdG9yIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNWZmYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvbWVzc2FnZS9XU0k0MTAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5tZXNzYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZU1lc3NhZ2VWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuZW52ZWxvcGUuQlA0MTAyOwotCi0vKioKLSAqIFdTSTQxMDIKLSAqLwotcHVibGljIGNsYXNzIFdTSTQxMDIgZXh0ZW5kcyBCUDQxMDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJNDEwMihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTYxZDA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTQxMDMKLSAqLwotcHVibGljIGNsYXNzIFdTSTQxMDMgZXh0ZW5kcyBCUDQxMDMKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJNDEwMyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE3NmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTQxMDQKLSAqLwotcHVibGljIGNsYXNzIFdTSTQxMDQgZXh0ZW5kcyBCUDQxMDQKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJNDEwNChCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmZmOGQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTQxMDUKLSAqLwotcHVibGljIGNsYXNzIFdTSTQxMDUgZXh0ZW5kcyBCUDQxMDUKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJNDEwNShCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2E0NGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTQxMDYKLSAqLwotcHVibGljIGNsYXNzIFdTSTQxMDYgZXh0ZW5kcyBCUDQxMDYKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJNDEwNihCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC9tZXNzYWdlL1dTSTQxMDcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ1MjQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL21lc3NhZ2UvV1NJNDEwNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwubWVzc2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VNZXNzYWdlVmFsaWRhdG9yOwotCi0vKioKLSAqIFdTSTQxMDcKLSAqLwotcHVibGljIGNsYXNzIFdTSTQxMDcgZXh0ZW5kcyBCUDQxMDcKLXsKLQotICAvKioKLSAgICogQHBhcmFtIEJhc2VNZXNzYWdlVmFsaWRhdG9yCi0gICAqLwotICBwdWJsaWMgV1NJNDEwNyhCYXNlTWVzc2FnZVZhbGlkYXRvciBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL0JQMzAwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9CUDMwMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwNmNkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL0JQMzAwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLnVkZGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5PdmVydmlld0RvYzsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci0KLQotLyoqCi0gKiBCUDMwMDEgLSBUaGUgdE1vZGVsIGVsZW1lbnQgdXNlcyBXU0RMIGFzIHRoZSBkZXNjcmlwdGlvbiBsYW5ndWFnZToKLSAqIHRoZSB1ZGRpOm92ZXJ2aWV3RG9jL3VkZGk6b3ZlcnZpZXdVUkwgZWxlbWVudCBjb250YWlucyBhIHJlZmVyZW5jZQotICogdG8gYSBXU0RMIGRlZmluaXRpb24sIHdoaWNoIHVzZXMgYSBuYW1lc3BhY2UKLSAqIG9mIGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvLgotICogVGhlIHVkZGk6b3ZlcnZpZXdVUkwgbWF5IHVzZSB0aGUgZnJhZ21lbnQgbm90YXRpb24gdG8gcmVzb2x2ZQotICogdG8gYSB3c2RsOmJpbmRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDMwMDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgVURESVZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gVURESVZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDMwMDEoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZXN1bHQgdmFyaWFibGUgdG8gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQgdmFsdWUgYW5kCi0gICAqIHBsYWNlcyBhIHRNb2RlbCBrZXkgaW4gdGhlIGZhdWx0IGRldGFpbCBtZXNzYWdlLgotICAgKiBAcGFyYW0gdE1vZGVsS2V5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgc2V0RmF1bHRNZXNzYWdlKFN0cmluZyB0TW9kZWxLZXkpCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9ICJUaGUgdE1vZGVsIGtleSBpczogWyIgKyB0TW9kZWxLZXkgKyAiXS4iOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIEJpbmRpbmcgYmluZGluZyA9IG51bGw7Ci0KLSAgICAvLyBHZXQgdGhlIHRNb2RlbCBmcm9tIHRoZSBlbnRyeUNvbnRleHQKLSAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbCkgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIElmIHRoZSB0TW9kZWwgZG9lcyBub3QgZXhpc3QsIHRoZW4gZmFpbAotICAgIGlmICh0TW9kZWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gIkNvdWxkIG5vdCBsb2NhdGUgYSB0TW9kZWwuIjsKLSAgICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgICB0ZXN0QXNzZXJ0aW9uLAotICAgICAgICByZXN1bHQsCi0gICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcga2V5ID0gdE1vZGVsLmdldFRNb2RlbEtleSgpOwotCi0gICAgT3ZlcnZpZXdEb2MgZG9jID0gdE1vZGVsLmdldE92ZXJ2aWV3RG9jKCk7Ci0gICAgaWYgKGRvYyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyB1cmxUZXh0ID0gZG9jLmdldE92ZXJ2aWV3VVJMU3RyaW5nKCk7Ci0KLSAgICAgIC8vIFRyeSB0byByZXNvbHZlIHRoZSBVUkwgJiBjaGVjayB0aGUgV1NETAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQgPSBuZXcgV1NETERvY3VtZW50KHVybFRleHQpOwotICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsRG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKTsKLSAgICAgICAgTWFwIG5hbWVzcGFjZXMgPSBkZWZpbml0aW9uLmdldE5hbWVzcGFjZXMoKTsKLSAgICAgICAgaWYgKCFuYW1lc3BhY2VzLmNvbnRhaW5zVmFsdWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0RMKSkKLSAgICAgICAgewotICAgICAgICAgIHVybFRleHQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IGJpbmRpbmcKLSAgICAgICAgYmluZGluZyA9IHZhbGlkYXRvci5nZXRCaW5kaW5nKHVybFRleHQsIHdzZGxEb2N1bWVudCk7Ci0KLSAgICAgICAgLy8gU2VlIGlmIHRoZSBiaW5kaW5nIGlzIGluIHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgICAgIGlmIChiaW5kaW5nID09IG51bGwKLSAgICAgICAgICB8fCBkZWZpbml0aW9uLmdldEJpbmRpbmcoYmluZGluZy5nZXRRTmFtZSgpKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdXJsVGV4dCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICB1cmxUZXh0ID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgaWYgKHVybFRleHQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGZyYWdtZW50SUQgPSBudWxsOwotICAgICAgICBpbnQgaW5kZXggPSB1cmxUZXh0LmluZGV4T2YoIiMiKTsKLSAgICAgICAgaWYgKGluZGV4ID4gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBmcmFnbWVudElEID0gdXJsVGV4dC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZnJhZ21lbnRJRCAhPSBudWxsKQotICAgICAgICAgICYmIChmcmFnbWVudElELmxlbmd0aCgpICE9IDApCi0gICAgICAgICAgJiYgKGZyYWdtZW50SUQudG9VcHBlckNhc2UoKS5pbmRleE9mKCJ4cG9pbnRlcigiLnRvVXBwZXJDYXNlKCkpID09IC0xCi0gICAgICAgICAgICB8fCBmcmFnbWVudElELmxhc3RJbmRleE9mKCIpIikgIT0gZnJhZ21lbnRJRC5sZW5ndGgoKSAtIDEpKQotICAgICAgICB7Ci0gICAgICAgICAgc2V0RmF1bHRNZXNzYWdlKGtleSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzZXRGYXVsdE1lc3NhZ2Uoa2V5KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2V0RmF1bHRNZXNzYWdlKGtleSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCA9PSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRCkKLSAgICB7Ci0gICAgICAvLyBTZXQgdGhlIGJpbmRpbmcgdGhhdCB3aWxsIGJlIHVzZWQKLSAgICAgIHZhbGlkYXRvci5zZXRXU0RMQmluZGluZyhiaW5kaW5nKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9CUDMwMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvQlAzMDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmNkZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9CUDMwMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLnVkZGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5CaW5kaW5nVGVtcGxhdGU7Ci0KLQotLyoqCi0gKiBCUDMwMDIgLSBUaGUgdWRkaTpiaW5kaW5nVGVtcGxhdGUgZWxlbWVudCBjb250YWlucyBhIHVkZGk6YWNjZXNzUG9pbnQgZWxlbWVudCwKLSAqIHdpdGggYSBub24tZW1wdHkgdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDMwMDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgVURESVZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gVURESVZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDMwMDIoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBzZXJ2aWNlTG9jYXRpb24gPSBudWxsOwotCi0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAvLyBHZXQgdGhlIGJpbmRpbmdUZW1wbGF0ZSBmcm9tIHRoZSBlbnRyeUNvbnRleHQKLSAgICBCaW5kaW5nVGVtcGxhdGUgYmluZGluZ1RlbXBsYXRlID0KLSAgICAgIChCaW5kaW5nVGVtcGxhdGUpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBJZiB0aGUgYmluZGluZ1RlbXBsYXRlIGRvZXMgbm90IGNvbnRhaW4gYW4gYWNjZXNzUG9pbnQsIHRoZW4gZmFpbAotICAgIGlmICgoYmluZGluZ1RlbXBsYXRlLmdldEFjY2Vzc1BvaW50KCkgPT0gbnVsbCkKLSAgICAgIHx8ICgoc2VydmljZUxvY2F0aW9uID0gYmluZGluZ1RlbXBsYXRlLmdldEFjY2Vzc1BvaW50KCkuZ2V0VGV4dCgpKQotICAgICAgICA9PSBudWxsKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgIlRoZSBiaW5kaW5nVGVtcGF0ZSBrZXkgaXM6IFsiCi0gICAgICAgICAgKyBiaW5kaW5nVGVtcGxhdGUuZ2V0QmluZGluZ0tleSgpCi0gICAgICAgICAgKyAiXS4iOwotICAgIH0KLQotICAgIC8vIEVsc2Ugc2F2ZSB0aGUgc2VydmljZSBsb2NhdGlvbiBpbiB0aGUgYXNzZXJ0aW9uIHJlc3VsdAotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBTYXZlIHNlcnZpY2UgbG9jYXRpb24gaW4gYW5hbHl6ZXIgY29udGV4dAotICAgICAgZW50cnlDb250ZXh0Ci0gICAgICAgIC5nZXRBbmFseXplckNvbnRleHQoKQotICAgICAgICAuZ2V0U2VydmljZVJlZmVyZW5jZSgpCi0gICAgICAgIC5zZXRTZXJ2aWNlTG9jYXRpb24oCi0gICAgICAgIHNlcnZpY2VMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWxNZXNzYWdlKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvQlAzMDAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL0JQMzAwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGUwNGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvQlAzMDAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci0KLQotLyoqCi0gKiBCUDMwMDMgLSBUaGUgdWRkaTp0TW9kZWwgaXMgY2F0ZWdvcml6ZWQgdXNpbmcgdGhlIHVkZGk6dHlwZXMgdGF4b25vbXksCi0gKiBhcyAid3NkbFNwZWMiOiB0aGUgdWRkaTprZXllZFJlZmVyZW5jZSBlbGVtZW50IGhhcyBhbiBhdHRyaWJ1dGUga2V5VmFsdWUKLSAqIGVxdWFsIHRvICJ3c2RsU3BlYyIsIGFuZCBrZXlOYW1lIGVxdWFsIHRvICJ1ZGRpLW9yZzp0eXBlcyIgb3IgInR5cGVzIi4KLSAqLwotcHVibGljIGNsYXNzIEJQMzAwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMzAwMyhVRERJVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAvLyBHZXQgdGhlIHRNb2RlbCBmcm9tIHRoZSBlbnRyeUNvbnRleHQKLSAgICBUTW9kZWwgdE1vZGVsID0gKFRNb2RlbCkgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIElmIHRoZSB0TW9kZWwgZG9lcyBub3QgZXhpc3QsIHRoZW4gZmFpbAotICAgIGlmICh0TW9kZWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgYSB0TW9kZWwgd2l0aCBhIGNhdGVnb3JpemF0aW9uIG9mICd3c2RsU3BlYycuIjsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBhIHRNb2RlbCBhbmQgaXQgaXMgbm90IGNhdGVnb3JpemVkIGFzICJ3c2RsU3BlYyIsIHRoZW4gZmFpbAotICAgIGVsc2UgaWYgKCEodmFsaWRhdG9yLmlzV3NkbFNwZWModE1vZGVsKSkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICJUaGUgdE1vZGVsIGtleSBpczogWyIKLSAgICAgICAgICArIHRNb2RlbC5nZXRUTW9kZWxLZXkoKQotICAgICAgICAgICsgIl1cbiIKLSAgICAgICAgICArICJUaGUgY2F0ZWdvcnlCYWcgaXM6IFsiCi0gICAgICAgICAgKyB0aGlzLnZhbGlkYXRvci5jYXRlZ29yeUJhZ1RvU3RyaW5nKHRNb2RlbC5nZXRDYXRlZ29yeUJhZygpKQotICAgICAgICAgICsgIl0iOwotICAgIH0KLQotICAgIC8vIEVsc2UgZ2V0IHRoZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uIGFuZCBzZXQgaXQgYW5kIHRoZSBiaW5kaW5nIGVsZW1lbnQgaW4gYW5hbHl6ZXIgY29udGV4dAotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBzZXQgV1NETCBsb2NhdGlvbiBpbiBhbmFseXplciBjb250ZXh0Ci0gICAgICB2YWxpZGF0b3Iuc2V0V1NETExvY2F0aW9uKHZhbGlkYXRvci5nZXRXU0RMTG9jYXRpb24odmFsaWRhdG9yLmdldE92ZXJ2aWV3VVJMKHRNb2RlbCkpKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9VRERJVmFsaWRhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9VRERJVmFsaWRhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY1NTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvVURESVZhbGlkYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5TZXJ2aWNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuVURESVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5XU0RMRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuVURESVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVURESVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExEb2N1bWVudDsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkJpbmRpbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJpbmRpbmcuVE1vZGVsSW5zdGFuY2VJbmZvOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLkJpbmRpbmdEZXRhaWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5UTW9kZWxEZXRhaWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIFRoZSBVRERJIHZhbGlkYXRvciB3aWxsIHZlcmlmeSB0aGF0IGEgd2ViIHNlcnZpY2UgZGVzY3JpcHRpb24gd2FzIHB1Ymxpc2hlZCBjb3JyZWN0bHkgaW4gYSBVRERJIHJlZ2lzdHJ5LgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFVERElWYWxpZGF0b3JJbXBsCi0gIGV4dGVuZHMgQmFzZVZhbGlkYXRvckltcGwKLSAgaW1wbGVtZW50cyBVRERJVmFsaWRhdG9yCi17Ci0gIC8qKgotICAgKiBVRERJIHJlZmVyZW5jZS4KLSAgICovCi0gIHByb3RlY3RlZCBVRERJUmVmZXJlbmNlIHVkZGlSZWZlcmVuY2U7Ci0gIC8qKgotICAgKiBVRERJIHByb3h5LgotICAgKi8KLSAgcHJvdGVjdGVkIFVERElQcm94eSB1ZGRpUHJveHk7Ci0KLSAgLyoqCi0gICAqIFdTREwgYmluZGluZy4KLSAgICovCi0gIHByaXZhdGUgQmluZGluZyBiaW5kaW5nID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLlVERElWYWxpZGF0b3IjaW5pdChvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXJDb250ZXh0LCBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3QsIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0QXJ0aWZhY3QsIG9yZy53c2kudGVzdC5hbmFseXplci5jb25maWcuVURESVJlZmVyZW5jZSwgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGluaXQoCi0gICAgQW5hbHl6ZXJDb250ZXh0IGFuYWx5emVyQ29udGV4dCwKLSAgICBQcm9maWxlQXJ0aWZhY3QgcHJvZmlsZUFydGlmYWN0LAotICAgIFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0LAotICAgIFVERElSZWZlcmVuY2UgdWRkaVJlZmVyZW5jZSwKLSAgICBSZXBvcnRlciByZXBvcnRlcikKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBCYXNlVmFsaWRhdG9ySW1wbAotICAgIHN1cGVyLmluaXQoYW5hbHl6ZXJDb250ZXh0LCBwcm9maWxlQXJ0aWZhY3QsIHJlcG9ydEFydGlmYWN0LCByZXBvcnRlcik7Ci0KLSAgICAvLyBTYXZlIGlucHV0IHJlZmVyZW5jZXMKLSAgICB0aGlzLnVkZGlSZWZlcmVuY2UgPSB1ZGRpUmVmZXJlbmNlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5VRERJVmFsaWRhdG9yI3ZhbGlkYXRlKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGUoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgd3NkbFVSTCA9IG51bGw7Ci0gICAgRW50cnkgZW50cnkgPSBudWxsOwotCi0gICAgQmluZGluZ1RlbXBsYXRlIGJpbmRpbmdUZW1wbGF0ZSA9IG51bGw7Ci0gICAgVE1vZGVsIHRNb2RlbCA9IG51bGw7Ci0KLSAgICAvLyBpdCBkZXByaWNhdGVkIGFmdGVyIHJlZmFjdG9yaW5nIAotICAgIC8vIG5vdyB0aGUgaW5uZXIgY2xhc3NlcyBtb3ZlZCBvdXQgZnJvbSB2YWxpZGF0b3IKLSAgICAvL1N0cmluZyBjbGFzc1ByZWZpeCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJCI7Ci0gICAgU3RyaW5nIGNsYXNzUHJlZml4ID0gdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkrIi4iOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gU2V0IHVwIGEgcmVmZXJlbmNlIHRvIHRoZSBVRERJIHJlZ2lzdHJ5Ci0gICAgICB1ZGRpUHJveHkgPSBuZXcgVURESVByb3h5KCk7Ci0KLSAgICAgIC8vbmV3IFNvY2tldChuZXcgSW5ldEFkZHJlc3ModWRkaVJlZmVyZW5jZS5nZXRJbnF1aXJ5VVJMKCkpKTsKLSAgICAgIHVkZGlQcm94eS5zZXRJbnF1aXJ5VVJMKHVkZGlSZWZlcmVuY2UuZ2V0SW5xdWlyeVVSTCgpKTsKLSAgICAgIGJvb2xlYW4gd2FzRXggPSBmYWxzZTsKLSAgICAgIElucHV0U3RyZWFtIHN0cmVhbTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBVUkwgdXJsID0gU3RyaW5nVXRpbHMuZ2V0VVJMKG51bGwsIHVkZGlSZWZlcmVuY2UuZ2V0SW5xdWlyeVVSTCgpKTsKLSAgICAgICAgc3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBleCkKLSAgICAgIHsKLSAgICAgICAgd2FzRXggPSB0cnVlOwotICAgICAgfQotCi0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghd2FzRXgpCi0gICAgICB7Ci0KLSAgICAgICAgLy8gSWYgdGhlIFVEREkgcmVmZXJlbmNlIGlzIHRvIGEgYmluZGluZ1RlbXBsYXRlIHRoZW4gZ2V0IGl0Ci0gICAgICAgIGlmICh1ZGRpUmVmZXJlbmNlLmdldEtleVR5cGUoKS5lcXVhbHMoVURESVJlZmVyZW5jZS5CSU5ESU5HX0tFWSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgYmluZGluZyBkZXRhaWwgd2hpY2ggd2lsbCBjb250YWluIHRoZSBiaW5kaW5nVGVtcGxhdGUKLSAgICAgICAgICBCaW5kaW5nRGV0YWlsIGJpbmRpbmdEZXRhaWwgPQotICAgICAgICAgICAgdWRkaVByb3h5LmdldF9iaW5kaW5nRGV0YWlsKHVkZGlSZWZlcmVuY2UuZ2V0S2V5KCkpOwotCi0gICAgICAgICAgLy8gR2V0IGJpbmRpbmdUZW1wbGF0ZQotICAgICAgICAgIGJpbmRpbmdUZW1wbGF0ZSA9Ci0gICAgICAgICAgICAoQmluZGluZ1RlbXBsYXRlKSBiaW5kaW5nRGV0YWlsCi0gICAgICAgICAgICAgIC5nZXRCaW5kaW5nVGVtcGxhdGVWZWN0b3IoKQotICAgICAgICAgICAgICAuZWxlbWVudEF0KAotICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAgIGlmICh2ZXJib3NlT3B0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgICAgIiAgICBCaW5kaW5nVGVtcGxhdGUgLSAiCi0gICAgICAgICAgICAgICAgKyBVRERJVXRpbHMuYmluZGluZ1RlbXBsYXRlVG9TdHJpbmcoYmluZGluZ1RlbXBsYXRlKSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gR2V0IHRoZSB3c2RsU3BlYyB0TW9kZWwKLSAgICAgICAgICB0TW9kZWwgPSBmaW5kVE1vZGVsKHVkZGlQcm94eSwgYmluZGluZ1RlbXBsYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVsc2UgaXQgaGFzIHRvIGJlIGEgdE1vZGVsCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFRNb2RlbERldGFpbCB0TW9kZWxEZXRhaWwgPQotICAgICAgICAgICAgdWRkaVByb3h5LmdldF90TW9kZWxEZXRhaWwodWRkaVJlZmVyZW5jZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgdE1vZGVsID0gKFRNb2RlbCkgdE1vZGVsRGV0YWlsLmdldFRNb2RlbFZlY3RvcigpLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2ZXJib3NlT3B0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICAgICAgIiAgICBUTW9kZWwgc3BlY2lmaWVkIG9yIGZvdW5kIGluIGJpbmRpbmdUZW1wbGF0ZSAtICIKLSAgICAgICAgICAgICAgKyBVRERJVXRpbHMudE1vZGVsVG9TdHJpbmcodE1vZGVsKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGJpbmRpbmdUZW1wbGF0ZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ESVNDT1ZFUllfQklORElOR1RFTVBMQVRFKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZXJlIGlzIGEgYmluZGluZ1RlbXBsYXRlLCB0aGVuIHByb2Nlc3MgdGVzdCBhc3NlcnRpb25zIGZvciBpdAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBDcmVhdGUgZW50cnkKLSAgICAgICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICAgIGVudHJ5LnNldEVudHJ5VHlwZSgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RJU0NPVkVSWV9CSU5ESU5HVEVNUExBVEUpKTsKLSAgICAgICAgZW50cnkuc2V0UmVmZXJlbmNlSUQoYmluZGluZ1RlbXBsYXRlLmdldEJpbmRpbmdLZXkoKSk7Ci0gICAgICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKGJpbmRpbmdUZW1wbGF0ZSk7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyB0ZXN0IGFzc2VydGlvbnMKLSAgICAgICAgcHJvY2Vzc0Fzc2VydGlvbnMoCi0gICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgbmV3IEVudHJ5Q29udGV4dChlbnRyeSwgdGhpcy5hbmFseXplckNvbnRleHQpKTsKLSAgICAgIH0KLQotICAgICAgLy8gTk9URTogRnJvbSB0aGlzIHBvaW50IGZvcndhcmQsIGlmIGEgYmluZGluZ1RlbXBsYXRlIGRvZXMgTk9UIGhhdmUgYSB3c2RsU3BlYyB0TW9kZWwsCi0gICAgICAvLyAgICAgICB0aGUgdE1vZGVsIHdpbGwgYmUgTlVMTC4KLQotICAgICAgLy9QYXJzZSBXU0RMIGRvY3VtZW50LCBhbmQgZ2V0IFdTREwgZG9jdW1lbnQgdXJsLCBiaW5kaW5nIG5hbWUgYW5kIG5hbWVzcGFjZQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBvdmVydmlld1VSTCA9IGdldE92ZXJ2aWV3VVJMKHRNb2RlbCk7Ci0gICAgICAgIHdzZGxVUkwgPSBnZXRXU0RMTG9jYXRpb24ob3ZlcnZpZXdVUkwpOwotICAgICAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50ID0gZ2V0V1NETERvY3VtZW50KHdzZGxVUkwpOwotCi0gICAgICAgIC8vIEFERDogVGhlIFdTREwgYmluZGluZyBpcyB1c2VkIGluIFdTSTMwMDEgYW5kIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgZW50cnlDb250ZXh0Ci0gICAgICAgIGJpbmRpbmcgPSBnZXRCaW5kaW5nKG92ZXJ2aWV3VVJMLCB3c2RsRG9jdW1lbnQpOwotICAgICAgfQotCi0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIEFERDoKLSAgICAgICAgaWYgKHZlcmJvc2VPcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICBFWENFUFRJT046ICIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIENyZWF0ZSBlbnRyeQotICAgICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfRElTQ09WRVJZX1RNT0RFTCkpOwotICAgICAgZW50cnkuc2V0UmVmZXJlbmNlSUQoCi0gICAgICAgICh0TW9kZWwgPT0gbnVsbCA/ICJbdE1vZGVsXSIgOiB0TW9kZWwuZ2V0VE1vZGVsS2V5KCkpKTsKLSAgICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKHRNb2RlbCk7Ci0KLSAgICAgIC8vIFByb2Nlc3MgdGVzdCBhc3NlcnRpb25zCi0gICAgICBwcm9jZXNzQXNzZXJ0aW9ucygKLSAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgIG5ldyBFbnRyeUNvbnRleHQoZW50cnksIHRoaXMuYW5hbHl6ZXJDb250ZXh0KSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFRocm93IFdTSUV4Y2VwdGlvbgotICAgICAgaWYgKGUgaW5zdGFuY2VvZiBXU0lFeGNlcHRpb24pCi0gICAgICAgIHRocm93IChXU0lFeGNlcHRpb24pIGU7Ci0gICAgICBlbHNlCi0gICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICAgIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkaXNjb3ZlcnkgdGVzdCBhc3NlcnRpb25zLiIsCi0gICAgICAgICAgZSk7Ci0gICAgfQotCi0gICAgLy8gQ2xlYW51cAotICAgIGNsZWFudXAoKTsKLQotICAgIC8vIEdldCBXU0RMIGxvY2F0aW9uCi0gICAgd3NkbFVSTCA9IHRoaXMuYW5hbHl6ZXJDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoKS5nZXRXU0RMTG9jYXRpb24oKTsKLQotICAgIC8vIFJldHVybiBXU0RMIFVSTAotICAgIHJldHVybiB3c2RsVVJMOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBXU0RMIGJpbmRpbmcgaW4gdGhlIHNlcnZpY2UgcmVmZXJlbmNlIHBvcnRpb24gb2YgdGhlIGFuYWx5emVyIGNvbnRleHQuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRXU0RMQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgYmluZGluZ05hbWUgPQotICAgICAgYmluZGluZyA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0KLSAgICAgIGJpbmRpbmcgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAvLyBTZXQgdGhlIFdTREwgZG9jdW1lbnQgbG9jYXRpb24gaW4gYW5hbHl6ZXJDb250ZXh0Ci0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlID0KLSAgICAgIHRoaXMuYW5hbHl6ZXJDb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoKTsKLQotICAgIC8vIElmIHRoZSB3c2RsRWxlbWVudCBkb2VzIG5vdCBleGlzdCwgdGhlbiBzZXQgaXQKLSAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudDsKLSAgICBpZiAoKHdzZGxFbGVtZW50ID0gc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpKSA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgV1NETCBiaW5kaW5nIGZyb20gdGhlIG92ZXJ2aWV3VVJMIGFuZCBzZXQgaW4gYW5hbHl6ZXJDb250ZXh0Ci0gICAgICB3c2RsRWxlbWVudCA9IG5ldyBXU0RMRWxlbWVudEltcGwoKTsKLSAgICAgIHdzZGxFbGVtZW50LnNldE5hbWUoYmluZGluZ05hbWUpOwotICAgICAgd3NkbEVsZW1lbnQuc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICB3c2RsRWxlbWVudC5zZXRUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX0JJTkRJTkcpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgd3NkbEVsZW1lbnQgaW4gdGhlIHNlcnZpY2UgcmVmZXJlbmNlCi0gICAgc2VydmljZVJlZmVyZW5jZS5zZXRXU0RMRWxlbWVudCh3c2RsRWxlbWVudCk7Ci0KLSAgICAvLyBTZXQgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIGJhY2sgaW50byB0aGUgYW5hbHl6ZXJDb250ZXh0Ci0gICAgYW5hbHl6ZXJDb250ZXh0LnNldFNlcnZpY2VSZWZlcmVuY2Uoc2VydmljZVJlZmVyZW5jZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBXU0RMIGxvY2F0aW9uIGluIHRoZSBzZXJ2aWNlIHJlZmVyZW5jZSBwb3J0aW9uIG9mIHRoZSBhbmFseXplciBjb250ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0V1NETExvY2F0aW9uKFN0cmluZyB3c2RsVVJMKQotICB7Ci0gICAgLy8gU2V0IHRoZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uIGluIGFuYWx5emVyQ29udGV4dAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSA9Ci0gICAgICB0aGlzLmFuYWx5emVyQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCk7Ci0gICAgc2VydmljZVJlZmVyZW5jZS5zZXRXU0RMTG9jYXRpb24od3NkbFVSTCk7Ci0KLSAgICAvLyBTZXQgdGhlIHNlcnZpY2UgcmVmZXJlbmNlIGJhY2sgaW50byB0aGUgYW5hbHl6ZXJDb250ZXh0Ci0gICAgYW5hbHl6ZXJDb250ZXh0LnNldFNlcnZpY2VSZWZlcmVuY2Uoc2VydmljZVJlZmVyZW5jZSk7Ci0gIH0KLQotICAvKioKLSAgICogRmluZCB0aGUgd3NkbFNwZWMgdE1vZGVsIGFzc29jaWF0ZWQgd2l0aCBhIGJpbmRpbmcuCi0gICAqLwotICBwcml2YXRlIFRNb2RlbCBmaW5kVE1vZGVsKAotICAgIFVERElQcm94eSB1ZGRpUHJveHksCi0gICAgQmluZGluZ1RlbXBsYXRlIGJpbmRpbmdUZW1wbGF0ZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBUTW9kZWwgdE1vZGVsID0gbnVsbDsKLQotICAgIC8vIEdldCB0aGUgbGlzdCBvZiB0TW9kZWwgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBiaW5kaW5nVGVtcGxhdGUKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9Ci0gICAgICBiaW5kaW5nVGVtcGxhdGUKLSAgICAgICAgLmdldFRNb2RlbEluc3RhbmNlRGV0YWlscygpCi0gICAgICAgIC5nZXRUTW9kZWxJbnN0YW5jZUluZm9WZWN0b3IoKQotICAgICAgICAuaXRlcmF0b3IoKTsKLQotICAgIC8vIFByb2Nlc3MgZWFjaCB0TW9kZWwgcmVmZXJlbmNlCi0gICAgVmVjdG9yIHRNb2RlbEtleUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgdE1vZGVsSW5zdGFuY2VJbmZvCi0gICAgICBUTW9kZWxJbnN0YW5jZUluZm8gdE1vZGVsSW5zdGFuY2VJbmZvID0KLSAgICAgICAgKFRNb2RlbEluc3RhbmNlSW5mbykgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAvLyBBZGQga2V5IHRvIGxpc3QKLSAgICAgIHRNb2RlbEtleUxpc3QuYWRkKHRNb2RlbEluc3RhbmNlSW5mby5nZXRUTW9kZWxLZXkoKSk7Ci0gICAgfQotCi0gICAgLy8gR2V0IHRoZSB0TW9kZWxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluZGluZ1RlbXBsYXRlCi0gICAgaWYgKHRNb2RlbEtleUxpc3Quc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IHRoZSB0TW9kZWwgZGV0YWlscwotICAgICAgICBUTW9kZWxEZXRhaWwgdE1vZGVsRGV0YWlsID0gdWRkaVByb3h5LmdldF90TW9kZWxEZXRhaWwodE1vZGVsS2V5TGlzdCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHRNb2RlbHMKLSAgICAgICAgSXRlcmF0b3IgdE1vZGVsSXRlcmF0b3IgPSB0TW9kZWxEZXRhaWwuZ2V0VE1vZGVsVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQotICAgICAgICAvL2Jvb2xlYW4gdE1vZGVsRm91bmQgPSBmYWxzZTsKLSAgICAgICAgVE1vZGVsIG5leHRUTW9kZWwgPSBudWxsOwotCi0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgdE1vZGVscwotICAgICAgICB3aGlsZSAoKHRNb2RlbEl0ZXJhdG9yLmhhc05leHQoKSkgJiYgKHRNb2RlbCA9PSBudWxsKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldCBuZXh0IHRNb2RlbCBpbiBsaXN0Ci0gICAgICAgICAgbmV4dFRNb2RlbCA9IChUTW9kZWwpIHRNb2RlbEl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgIGlmICh2ZXJib3NlT3B0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICAgICAgIiAgICAgIFRNb2RlbCByZWZlcmVuY2VkIGZyb20gYmluZGluZ1RlbXBsYXRlIC0gIgotICAgICAgICAgICAgICAgICsgVURESVV0aWxzLnRNb2RlbFRvU3RyaW5nKG5leHRUTW9kZWwpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgd3NkbFNwZWMgdE1vZGVsLCB0aGVuIHRoaXMgaXMgdGhlIHRNb2RlbCB3ZSB3YW50Ci0gICAgICAgICAgaWYgKGlzV3NkbFNwZWMobmV4dFRNb2RlbCkpCi0gICAgICAgICAgICB0TW9kZWwgPSBuZXh0VE1vZGVsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy8gVGhyb3cgV1NJRXhjZXB0aW9uCi0gICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgdE1vZGVsIGRldGFpbHMuIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFRocm93IGV4Y2VwdGlvbgotICAgICAgLy90aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJVRERJIGJpbmRpbmdUZW1wbGF0ZSBkaWQgbm90IGNvbnRhaW4gYW55IHRNb2RlbCByZWZlcmVuY2VzLiIpOwotICAgIH0KLQotICAgIHJldHVybiB0TW9kZWw7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB3c2RsU3BlYyB0TW9kZWwuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1dzZGxTcGVjKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBib29sZWFuIHRNb2RlbEZvdW5kID0gZmFsc2U7Ci0gICAgQ2F0ZWdvcnlCYWcgY2F0ZWdvcnlCYWcgPSBudWxsOwotICAgIEl0ZXJhdG9yIGNhdGVnb3J5QmFnSXRlcmF0b3IgPSBudWxsOwotCi0gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYXRldGdvcnlCYWcgY29udGFpbnMgd3NkbFNwZWMKLSAgICBpZiAoKGNhdGVnb3J5QmFnID0gdE1vZGVsLmdldENhdGVnb3J5QmFnKCkpICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIGtleWVkIHJlZmVyZW5jZXMKLSAgICAgIGNhdGVnb3J5QmFnSXRlcmF0b3IgPSBjYXRlZ29yeUJhZy5nZXRLZXllZFJlZmVyZW5jZVZlY3RvcigpLml0ZXJhdG9yKCk7Ci0KLSAgICAgIEtleWVkUmVmZXJlbmNlIGtleWVkUmVmZXJlbmNlID0gbnVsbDsKLQotICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBrZXllZCByZWZlcmVuY2VzCi0gICAgICB3aGlsZSAoY2F0ZWdvcnlCYWdJdGVyYXRvci5oYXNOZXh0KCkgJiYgISh0TW9kZWxGb3VuZCkpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCBuZXh0IGtleWVkIHJlZmVyZW5jZQotICAgICAgICBrZXllZFJlZmVyZW5jZSA9IChLZXllZFJlZmVyZW5jZSkgY2F0ZWdvcnlCYWdJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHR5cGVzIHRheG9ub215IHRNb2RlbCBhbmQgdGhlIHZhbHVlIGlzIHdzZGxTcGVjLCB0aGVuIHRoaXMgaXMgdGhlIHRNb2RlbCB3ZSB3YW50Ci0gICAgICAgIC8vIFJFTU9WRTogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjaGVjayB0aGUga2V5IG5hbWUKLSAgICAgICAgLy9pZiAoa2V5ZWRSZWZlcmVuY2UuZ2V0VE1vZGVsS2V5KCkuZXF1YWxzSWdub3JlQ2FzZShUTW9kZWwuVFlQRVNfVE1PREVMX0tFWSkgJiYKLSAgICAgICAgLy8gICAid3NkbFNwZWMiLmVxdWFscyhrZXllZFJlZmVyZW5jZS5nZXRLZXlWYWx1ZSgpKSAmJgotICAgICAgICAvLyAgICgidHlwZXMiLmVxdWFscyhrZXllZFJlZmVyZW5jZS5nZXRLZXlOYW1lKCkpIHx8Ci0gICAgICAgIC8vICAgICJ1ZGRpLW9yZzp0eXBlcyIuZXF1YWxzKGtleWVkUmVmZXJlbmNlLmdldEtleU5hbWUoKSkpKSB7Ci0gICAgICAgIC8vICB0TW9kZWxGb3VuZCA9IHRydWU7Ci0gICAgICAgIC8vfQotICAgICAgICBpZiAoa2V5ZWRSZWZlcmVuY2UKLSAgICAgICAgICAuZ2V0VE1vZGVsS2V5KCkKLSAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShUTW9kZWwuVFlQRVNfVE1PREVMX0tFWSkKLSAgICAgICAgICAmJiAid3NkbFNwZWMiLmVxdWFscyhrZXllZFJlZmVyZW5jZS5nZXRLZXlWYWx1ZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHRNb2RlbEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0TW9kZWxGb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW4gT3ZlcnZpZXdVUkwgZnJvbSB0TW9kZWwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJ2aWV3VVJMKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBpZiAodE1vZGVsICE9IG51bGwKLSAgICAgICYmIHRNb2RlbC5nZXRPdmVydmlld0RvYygpICE9IG51bGwKLSAgICAgICYmIHRNb2RlbC5nZXRPdmVydmlld0RvYygpLmdldE92ZXJ2aWV3VVJMKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdE1vZGVsLmdldE92ZXJ2aWV3RG9jKCkuZ2V0T3ZlcnZpZXdVUkwoKS5nZXRUZXh0KCk7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRXU0RMTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbikKLSAgewotICAgIGludCBpbmRleDsKLQotICAgIC8vIENoZWNrIGlmIHRoZSBvdmVydmlld1VSTCBjb250YWlucyBhIGZyYWdtZW50IGlkZW50aWZpZXIKLSAgICBpZiAoKGluZGV4ID0gd3NkbExvY2F0aW9uLmluZGV4T2YoIiMiKSkgPiAtMSkKLSAgICB7Ci0gICAgICB3c2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb24uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHdzZGxMb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgV1NETCBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBXU0RMRG9jdW1lbnQgZ2V0V1NETERvY3VtZW50KFN0cmluZyB3c2RsTG9jYXRpb24pCi0gICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIG5ldyBXU0RMRG9jdW1lbnQoZ2V0V1NETExvY2F0aW9uKHdzZGxMb2NhdGlvbikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBXU0RMIGJpbmRpbmcgZnJvbSB0aGUgb3ZlcnZpZXdVUkwgaW4gdGhlIHRNb2RlbC4KLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIGdldEJpbmRpbmcoU3RyaW5nIG92ZXJ2aWV3VVJMLCBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICB7Ci0gICAgaW50IGluZGV4OwotICAgIGludCBuYW1lSW5kZXg7Ci0KLSAgICBCaW5kaW5nW10gYmluZGluZ3MgPSB3c2RsRG9jdW1lbnQuZ2V0QmluZGluZ3MoKTsKLSAgICBpZiAoYmluZGluZ3MgPT0gbnVsbCB8fCBiaW5kaW5ncy5sZW5ndGggPT0gMCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgaWYgKG92ZXJ2aWV3VVJMICE9IG51bGwpCi0gICAgewotICAgICAgLy8gQ2hlY2sgaWYgdGhlIG92ZXJ2aWV3VVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQgaWRlbnRpZmllcgotICAgICAgaWYgKChpbmRleCA9IG92ZXJ2aWV3VVJMLmluZGV4T2YoIiMiKSkgPiAtMSkKLSAgICAgIHsKLSAgICAgICAgLy8gVEVNUDogTmVlZCB0byB1c2UgYSByZWFsIFhQYXRoIGV2YWx1YXRvciBsaWtlIFhhbGFuCi0gICAgICAgIFN0cmluZyBuYW1lQXR0cmlidXRlID0gIkBuYW1lPSI7Ci0KLSAgICAgICAgLy8gTG9jYXRlIG5hbWUgcmVmZXJlbmNlCi0gICAgICAgIGlmICgobmFtZUluZGV4ID0KLSAgICAgICAgICBvdmVydmlld1VSTC5zdWJzdHJpbmcoaW5kZXggKyAxKS5pbmRleE9mKG5hbWVBdHRyaWJ1dGUpKQotICAgICAgICAgID4gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgY2hhcmFjdGVyIHdoaWNoIHNob3VsZCBiZSBhIHF1b3RlCi0gICAgICAgICAgaW50IGZpcnN0UXVvdGVJbmRleCA9IGluZGV4ICsgMSArIG5hbWVJbmRleCArIG5hbWVBdHRyaWJ1dGUubGVuZ3RoKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1b3RlID0KLSAgICAgICAgICAgIG92ZXJ2aWV3VVJMLnN1YnN0cmluZyhmaXJzdFF1b3RlSW5kZXgsIGZpcnN0UXVvdGVJbmRleCArIDEpOwotCi0gICAgICAgICAgLy8gR2V0IHRoZSBwYXJ0IG9mIHRoZSBVUkwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gdGhlIGJpbmRpbmcgbmFtZQotICAgICAgICAgIFN0cmluZyB1cmxQYXJ0ID0gb3ZlcnZpZXdVUkwuc3Vic3RyaW5nKGZpcnN0UXVvdGVJbmRleCArIDEpOwotCi0gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBxdW90ZQotICAgICAgICAgIGludCBuZXh0UXVvdGVJbmRleDsKLSAgICAgICAgICBpZiAoKG5leHRRdW90ZUluZGV4ID0gdXJsUGFydC5pbmRleE9mKHF1b3RlKSkgPiAtMSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ05hbWUgPSB1cmxQYXJ0LnN1YnN0cmluZygwLCBuZXh0UXVvdGVJbmRleCk7Ci0gICAgICAgICAgICAvL2xvb2sgZm9yIGJpbmRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChiaW5kaW5nTmFtZS5lcXVhbHMoYmluZGluZ3NbaV0uZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBiaW5kaW5nc1swXTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNhdGVnb3J5QmFnLgotICAgKiBAcGFyYW0gY2F0ZWdvcnlCYWcgYSBDYXRlZ29yeUJhZyBvYmplY3QuCi0gICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNhdGVnb3J5QmFnLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeUJhZ1RvU3RyaW5nKENhdGVnb3J5QmFnIGNhdGVnb3J5QmFnKQotICB7Ci0gICAgU3RyaW5nIHRvU3RyaW5nID0gIiI7Ci0KLSAgICBpZiAoY2F0ZWdvcnlCYWcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3Iga2V5ZWRSZWZlcmVuY2VMaXN0ID0gbnVsbDsKLSAgICAgIGlmICgoKGtleWVkUmVmZXJlbmNlTGlzdCA9IGNhdGVnb3J5QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCkpCi0gICAgICAgID09IG51bGwpCi0gICAgICAgIHx8IChrZXllZFJlZmVyZW5jZUxpc3Quc2l6ZSgpID09IDApKQotICAgICAgewotICAgICAgICB0b1N0cmluZyArPSAiTm8gS2V5ZWRSZWZlcmVuY2VzIjsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbnQgY291bnQgPSAxOwotICAgICAgICBLZXllZFJlZmVyZW5jZSBrZXllZFJlZmVyZW5jZTsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBrZXllZFJlZmVyZW5jZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGtleWVkUmVmZXJlbmNlID0gKEtleWVkUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgdG9TdHJpbmcgKz0gIlxuICBbIgotICAgICAgICAgICAgKyBjb3VudCsrCi0gICAgICAgICAgICArICJdIHRNb2RlbEtleTogIgotICAgICAgICAgICAgKyBrZXllZFJlZmVyZW5jZS5nZXRUTW9kZWxLZXkoKQotICAgICAgICAgICAgKyAiLCBrZXlOYW1lOiAiCi0gICAgICAgICAgICArIGtleWVkUmVmZXJlbmNlLmdldEtleU5hbWUoKQotICAgICAgICAgICAgKyAiLCBrZXlWYWx1ZTogIgotICAgICAgICAgICAgKyBrZXllZFJlZmVyZW5jZS5nZXRLZXlWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0b1N0cmluZyA9ICJudWxsIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG9TdHJpbmc7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwjaXNQcmltYXJ5RW50cnlUeXBlTWF0Y2gob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzUHJpbWFyeUVudHJ5VHlwZU1hdGNoKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgdGFyZ2V0Q29udGV4dCkKLSAgewotICAgIGJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQotICAgIC8vIElmIHRoZSB0ZXN0IGFzc2VydGlvbiBlbnRyeSB0eXBlIG1hdGNoZXMgdGhlIHRhcmdldCBjb250ZXh0IGVudHJ5IHR5cGUsIHRoZW4gY29udGluZQotICAgIGlmICh0ZXN0QXNzZXJ0aW9uCi0gICAgICAuZ2V0RW50cnlUeXBlTmFtZSgpCi0gICAgICAuZXF1YWxzKHRhcmdldENvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeVR5cGUoKS5nZXRUeXBlTmFtZSgpKSkKLSAgICB7Ci0gICAgICBtYXRjaCA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsI2lzTm90QXBwbGljYWJsZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RBcHBsaWNhYmxlKFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbikKLSAgewotICAgIGJvb2xlYW4gbm90QXBwbGljYWJsZSA9IGZhbHNlOwotCi0gICAgLy8gQUREOgotCi0gICAgcmV0dXJuIG5vdEFwcGxpY2FibGU7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDAxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2ODRiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLnVkZGk7Ci0KLS8qKgotICogV1NJMzAwMQotICovCi1wdWJsaWMgY2xhc3MgV1NJMzAwMSBleHRlbmRzIEJQMzAwMQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gVURESVZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kzMDAxKFVERElWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGRkMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi0vKioKLSAqIFdTSTMwMDIKLSAqLwotcHVibGljIGNsYXNzIFdTSTMwMDIgZXh0ZW5kcyBCUDMwMDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFVERElWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMzAwMihVRERJVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIwMTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaTsKLQotLyoqCi0gKiBXU0kzMDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kzMDAzIGV4dGVuZHMgQlAzMDAzCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTMwMDMoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NDgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlVERElVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuS2V5ZWRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIFdTSTMwMDQgLSBUaGUgY29uZm9ybWFuY2UgY2xhaW1zIGluIHRoZSB1ZGRpOnRNb2RlbCBhcmUgdGhlIHNhbWUKLSAqIGFzIHRob3NlIGluIHRoZSB3c2RsOmJpbmRpbmcgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSB0aGUgdWRkaTp0TW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kzMDA0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTMwMDQoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUU19QQVJBTSA9ICJwb3J0cyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5ESU5HX1BBUkFNID0gImJpbmRpbmciOwotCi0gIC8qKgotICAgKiBHZXRzIFdTSSBjb25mb3JtYW5jZSBjbGFpbXMgZnJvbSBhIHRNb2RlbC4KLSAgICogQHBhcmFtIHRNb2RlbAotICAgKiBAcmV0dXJuIEhhc2hTZXQKLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24KLSAgICovCi0gIHByaXZhdGUgSGFzaFNldCBnZXRDb25mb3JtYW5jZUNsYWltc0Zyb21VRERJKFRNb2RlbCB0TW9kZWwpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGNvbmZvcm1hbmNlS2V5ID0gVURESVV0aWxzLmdldFdTSUNvbmZvcm1hbmNlVE1vZGVsS2V5KHZhbGlkYXRvci51ZGRpUHJveHkpOwotCi0gICAgSGFzaFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgQ2F0ZWdvcnlCYWcgYmFnID0gdE1vZGVsLmdldENhdGVnb3J5QmFnKCk7Ci0gICAgaWYgKGJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciByZWZlcmVuY2VzID0gYmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIHJlZiA9IChLZXllZFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0KLSAgICAgICAgaWYgKHJlZi5nZXRUTW9kZWxLZXkoKS5lcXVhbHNJZ25vcmVDYXNlKGNvbmZvcm1hbmNlS2V5KSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5hZGQocmVmLmdldEtleVZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIFdTSSBjb25mb3JtYW5jZSBjbGFpbXMgZnJvbSBXU0RMIGJpbmRpbmcKLSAgICogdGhhdCByZWZlcmVuY2VzIHNwZWNpZmllZCB0TW9kZWwuIEFkZGl0aW9uYWxseSwKLSAgICogV1NETCBwb3J0cywgd2hpY2ggdXNlcyB0aGUgYmluZGluZywgYXJlIHByb2Nlc3NlZC4KLSAgICoKLSAgICogQHBhcmFtIHRNb2RlbAotICAgKiBAcmV0dXJuIEhhc2hTZXQKLSAgICovCi0gIHByaXZhdGUgSGFzaFNldCBnZXRDb25mb3JtYW5jZUNsYWltc0Zyb21XU0RMKFRNb2RlbCB0TW9kZWwpCi0gIHsKLSAgICBIYXNoU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBSZWFkIHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgICBTdHJpbmcgb3ZlcnZpZXdVUkwgPSB2YWxpZGF0b3IuZ2V0T3ZlcnZpZXdVUkwodE1vZGVsKTsKLSAgICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQgPSB2YWxpZGF0b3IuZ2V0V1NETERvY3VtZW50KG92ZXJ2aWV3VVJMKTsKLQotICAgICAgLy8gR2V0IGJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHZhbGlkYXRvci5nZXRCaW5kaW5nKG92ZXJ2aWV3VVJMLCB3c2RsRG9jdW1lbnQpOwotICAgICAgU3RyaW5nIGJpbmRpbmdOYW1lID0gYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCi0gICAgICAvLyBHZXQgY2xhaW1zCi0gICAgICByZXN1bHQgPQotICAgICAgICBnZXRDbGFpbXNGcm9tRWxlbWVudChiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIHJlc3VsdCk7Ci0KLSAgICAgIC8vIEdldCBwb3J0cywgd2hpY2ggcmVmZXJlbmNlIHRoaXMgYmluZGluZywgYmVjYXVzZToKLSAgICAgIC8vICJBIGNsYWltIG9uIGEgd3NkbDpwb3J0IGlzIGluaGVyaXRlZCBieSB0aGUgcmVmZXJlbmNlZCB3c2RsOmJpbmRpbmdzLiIKLSAgICAgIFZlY3RvciBwb3J0cyA9IGdldFBvcnRzKHdzZGxEb2N1bWVudCwgYmluZGluZ05hbWUpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3J0cy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRzLmdldChpKTsKLQotICAgICAgICByZXN1bHQgPSBnZXRDbGFpbXNGcm9tRWxlbWVudChwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIHJlc3VsdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBBREQ6Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIFdTSSBjb25mb3JtYW5jZSBjbGFpbXMgZnJvbSB0aGUgJ2RvY3VtZW50YXRpb24nIFhNTCBlbGVtZW50Ci0gICAqIGFuZCBwdXRzIHRoZW0gaW50byB0aGUgSGFzaFNldC4KLSAgICogQHBhcmFtIGRvY0VsZW1lbnQKLSAgICogQHBhcmFtIHJlc3VsdAotICAgKiBAcmV0dXJuIEhhc2hTZXQKLSAgICovCi0gIHByaXZhdGUgSGFzaFNldCBnZXRDbGFpbXNGcm9tRWxlbWVudChFbGVtZW50IGRvY0VsZW1lbnQsIEhhc2hTZXQgcmVzdWx0KQotICB7Ci0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKGRvY0VsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBFbGVtZW50IGNsYWltRWxlbWVudCA9IFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoZG9jRWxlbWVudCwgV1NJX0NMQUlNKTsKLSAgICAgIHdoaWxlIChjbGFpbUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgTm9kZSBhdHRyID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGNsYWltRWxlbWVudCwgQVRUUl9DTEFJTV9DT05GT1JNU1RPKTsKLSAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgICAgCXJlc3VsdC5hZGQoYXR0ci5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgICovCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9Ci0gICAgICAgICAgY2xhaW1FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NMQUlNX0NPTkZPUk1TVE8uZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICByZXN1bHQuYWRkKHZhbHVlKTsKLQotICAgICAgICBjbGFpbUVsZW1lbnQgPSBYTUxVdGlscy5maW5kRWxlbWVudChjbGFpbUVsZW1lbnQsIFdTSV9DTEFJTSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHdzZGw6cG9ydHMsIHdoaWNoIHVzZSBzcGVjaWZpZWQgYmluZGluZy4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudAotICAgKiBAcGFyYW0gYmluZGluZ05hbWUKLSAgICogQHJldHVybiBWZWN0b3IKLSAgICovCi0gIHByaXZhdGUgVmVjdG9yIGdldFBvcnRzKFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQsIFN0cmluZyBiaW5kaW5nTmFtZSkKLSAgewotICAgIFZlY3RvciBwb3J0cyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIE1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotICAgIHBhcmFtcy5wdXQoUE9SVFNfUEFSQU0sIHBvcnRzKTsKLSAgICBwYXJhbXMucHV0KEJJTkRJTkdfUEFSQU0sIGJpbmRpbmdOYW1lKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdFBvcnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpLCBwYXJhbXMpOwotCi0gICAgcmV0dXJuIHBvcnRzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5Qb3J0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBwb3J0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAocG9ydAotICAgICAgLmdldEJpbmRpbmcoKQotICAgICAgLmdldFFOYW1lKCkKLSAgICAgIC5nZXRMb2NhbFBhcnQoKQotICAgICAgLmVxdWFscyhjdHguZ2V0UGFyYW1ldGVyKEJJTkRJTkdfUEFSQU0pLnRvU3RyaW5nKCkpKQotICAgIHsKLSAgICAgICgoVmVjdG9yKSBjdHguZ2V0UGFyYW1ldGVyKFBPUlRTX1BBUkFNKSkuYWRkKHBvcnQpOwotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgdE1vZGVsIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gSWYgdGhlIHRNb2RlbCBkb2VzIG5vdCBleGlzdCwgdGhlbiBmYWlsCi0gICAgaWYgKHRNb2RlbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSAiQ291bGQgbm90IGxvY2F0ZSBhIHRNb2RlbC4iOwotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIGEgdE1vZGVsCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBIYXNoU2V0IGNsYWltc0Zyb21VRERJID0gZ2V0Q29uZm9ybWFuY2VDbGFpbXNGcm9tVURESSh0TW9kZWwpOwotICAgICAgICBIYXNoU2V0IGNsYWltc0Zyb21XU0RMID0gZ2V0Q29uZm9ybWFuY2VDbGFpbXNGcm9tV1NETCh0TW9kZWwpOwotCi0gICAgICAgIGlmIChjbGFpbXNGcm9tVURESS5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNsYWltc0Zyb21VRERJLnNpemUoKSA9PSBjbGFpbXNGcm9tV1NETC5zaXplKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgY291bnRlciA9IDA7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gY2xhaW1zRnJvbVdTREwuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFpbSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIyID0gY2xhaW1zRnJvbVVEREkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgaXRlcjIuaGFzTmV4dCgpOwotICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN0cmluZyB1ZGRpQ2xhaW0gPSAoU3RyaW5nKSBpdGVyMi5uZXh0KCk7Ci0gICAgICAgICAgICAgIGlmIChjbGFpbS5lcXVhbHNJZ25vcmVDYXNlKHVkZGlDbGFpbSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb3VudGVyKys7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoY291bnRlciAhPSBjbGFpbXNGcm9tV1NETC5zaXplKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gZmFpbGVkCi0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICAgIlRoZSB0TW9kZWwga2V5IGlzOiBbIiArIHRNb2RlbC5nZXRUTW9kZWxLZXkoKSArICJdLiI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8vIGZhaWxlZAotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICJUaGUgdE1vZGVsIGtleSBpczogWyIgKyB0TW9kZWwuZ2V0VE1vZGVsS2V5KCkgKyAiXS4iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICAgIlRoZSB0TW9kZWwga2V5IGlzOiBbIiArIHRNb2RlbC5nZXRUTW9kZWxLZXkoKSArICJdLiI7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA1X09CU09MRVRFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDVfT0JTT0xFVEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2ZjVhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMDVfT0JTT0xFVEUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVURESVV0aWxzOwotaW1wb3J0IG9yZy51ZGRpNGouY2xpZW50LlVERElQcm94eTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbC5UTW9kZWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotCi0vKioKLSAqIFdTSTMwMDVfT0JTT0xFVEUgLSBBIHVkZGk6dE1vZGVsIHdoaWNoIGNsYWltcyBjb25mb3JtYW5jZSB3aXRoIGEgV1MtSSBwcm9maWxlCi0gKiBtdXN0IGJlIGNhdGVnb3JpemVkIHVzaW5nIHRoZSB3cy1pLW9yZzpjb25mb3Jtc1RvIHRheG9ub215LgotICovCi1wdWJsaWMgY2xhc3MgV1NJMzAwNV9PQlNPTEVURSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTMwMDVfT0JTT0xFVEUoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgdE1vZGVsIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gSWYgdGhlIHRNb2RlbCBkb2VzIG5vdCBleGlzdCwgdGhlbiBmYWlsCi0gICAgaWYgKHRNb2RlbCA9PSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSAiQ291bGQgbm90IGxvY2F0ZSBhIHRNb2RlbC4iOwotICAgIH0KLQotICAgIC8vIElmIHRoZXJlIGlzIGEgdE1vZGVsCi0gICAgZWxzZQotICAgIHsKLSAgICAgIENhdGVnb3J5QmFnIGJhZyA9IHRNb2RlbC5nZXRDYXRlZ29yeUJhZygpOwotCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFjaGVja0NhdGVnb3J5QmFnKHRoaXMudmFsaWRhdG9yLnVkZGlQcm94eSwgYmFnKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIGZhaWxlZAotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICJUaGUgdE1vZGVsIGtleSBpczogWyIgKyB0TW9kZWwuZ2V0VE1vZGVsS2V5KCkgKyAiXS4iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICAgIlRoZSBVRERJIHJlZ2lzdHJ5IGRvZXMgbm90IGNvbnRhaW4gV1NJIGNvbmZvcm1hbmNlIHRheG9ub215IgotICAgICAgICAgICAgKyAiIHRNb2RlbCAoXCJ3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTJcIikuIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyBhIGNhdGVnb3J5IGJhZy4KLSAgICogQHBhcmFtIHByb3h5Ci0gICAqIEBwYXJhbSBiYWcKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDYXRlZ29yeUJhZyhVRERJUHJveHkgcHJveHksIENhdGVnb3J5QmFnIGJhZykKLSAgewotICAgIFN0cmluZyBjb25mb3JtYW5jZUtleSA9IFVERElVdGlscy5nZXRXU0lDb25mb3JtYW5jZVRNb2RlbEtleShwcm94eSk7Ci0KLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgaWYgKGJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciByZWZlcmVuY2VzID0gYmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpICYmICFyZXN1bHQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2UgcmVmID0gKEtleWVkUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQotICAgICAgICByZXN1bHQgPSByZWYuZ2V0VE1vZGVsS2V5KCkuZXF1YWxzSWdub3JlQ2FzZShjb25mb3JtYW5jZUtleSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGMwMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvblJlc3VsdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VRERJVXRpbHM7Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi0KLS8qKgotICogV1NJMzAwNiAtIFRoZSB1ZGRpOnRNb2RlbCB1c2VzIHRoZSB3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTIgY2F0ZWdvcml6YXRpb24KLSAqIHZhbHVlIG9mICJodHRwOi8vd3MtaS5vcmcvcHJvZmlsZXMvYmFzZS8xLjAiLiBUaGUgY2F0ZWdvcnlCYWcgaW4gdGhlIHRNb2RlbAotICogY29udGFpbnMgYSBrZXllZFJlZmVyZW5jZSB3aXRoIGEgdE1vZGVsS2V5IHRoYXQgY29udGFpbnMgdGhlIGtleSB2YWx1ZQotICogdXVpZDo2NTcxOTE2OC03MmM2LTNmMjktOGMyMC02MmRlZmIwOTYxYzAgZm9yIHRoZSB3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTIKLSAqIHRNb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFdTSTMwMDYgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgVURESVZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotICAvKioKLSAgICogQHBhcmFtIFVERElWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMzAwNihVRERJVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gbnVsbDsKLSAgICBLZXllZFJlZmVyZW5jZSBjbGFpbUtleWVkUmVmID0gbnVsbDsKLQotICAgIC8vIGNoZWNrIHdoZXRoZXIgYSBVRERJIGNvbmZvcm1hbmNlIGNsYWltIGlzIGJlaW5nIG1hZGUuLi4KLQotICAgIC8vIEdldCB0aGUgdE1vZGVsIGZyb20gdGhlIGVudHJ5Q29udGV4dAotICAgIFRNb2RlbCB0TW9kZWwgPSAoVE1vZGVsKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICgoY2xhaW1LZXllZFJlZiA9IGNvbmZvcm1hbmNlQ2xhaW1NYWRlKHRNb2RlbCkpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25SZXN1bHRFeGNlcHRpb24oCi0gICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHdlIGhhdmUgYSBjb25mb3JtYW5jZSBjbGFpbSwgc28gY2hlY2sgdGhlIGtleWVkUmVmZXJlbmNlIGtleVZhbHVlCi0gICAgICBpZiAoIWNsYWltS2V5ZWRSZWYKLSAgICAgICAgLmdldEtleVZhbHVlKCkKLSAgICAgICAgLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9VRERJX0NMQUlNX0tFWVZBTFVFKSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvblJlc3VsdEV4Y2VwdGlvbigKLSAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCwKLSAgICAgICAgICAiVGhlIHRNb2RlbCBrZXkgaXM6IFsiCi0gICAgICAgICAgICArIHRNb2RlbC5nZXRUTW9kZWxLZXkoKQotICAgICAgICAgICAgKyAiXS5cblRoZSBjYXRlZ29yeUJhZyBpczogWyIKLSAgICAgICAgICAgICsgdE1vZGVsLmdldENhdGVnb3J5QmFnKCkKLSAgICAgICAgICAgICsgIl0uIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25SZXN1bHRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlLmdldE1lc3NhZ2UoKTsKLSAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gZS5nZXREZXRhaWxNZXNzYWdlKCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWxNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgYSBjYXRlZ29yeSBiYWcgYW5kIGV4dHJhY3RzIEtleWVkUmVmZXJlbmNlIGNvbnRhaW5pbmcKLSAgICogdGhlIGNvbmZvcm1hbmNlIGNsYWltLgotICAgKiBAcGFyYW0gcHJveHkKLSAgICogQHBhcmFtIGJhZwotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgS2V5ZWRSZWZlcmVuY2UgY2hlY2tDYXRlZ29yeUJhZyhVRERJUHJveHkgcHJveHksIENhdGVnb3J5QmFnIGJhZykKLSAgewotICAgIFN0cmluZyBjb25mb3JtYW5jZUtleSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY29uZm9ybWFuY2VLZXkgPSBVRERJVXRpbHMuZ2V0V1NJQ29uZm9ybWFuY2VUTW9kZWxLZXkocHJveHkpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBLZXllZFJlZmVyZW5jZSBjb25mb3JtYW5jZVJlZiA9IG51bGw7Ci0KLSAgICBpZiAoYmFnICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIHJlZmVyZW5jZXMgPSBiYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCkgJiYgcmVzdWx0OyBpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIHJlZiA9IChLZXllZFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0KLSAgICAgICAgaWYgKHJlZgotICAgICAgICAgIC5nZXRUTW9kZWxLZXkoKQotICAgICAgICAgIC5lcXVhbHNJZ25vcmVDYXNlKGNvbmZvcm1hbmNlS2V5KSAvLyYmIHJlZi5nZXRLZXlWYWx1ZSgpLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9VRERJX0NMQUlNX0tFWVZBTFVFKQotICAgICAgICAvLyB3ZSBuZWVkIG9ubHkgdE1vZGVsIGtleQotICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgIGNvbmZvcm1hbmNlUmVmID0gcmVmOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbmZvcm1hbmNlUmVmOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIEtleWVkUmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIGNvbmZvcm1hbmNlIGNsYWltLgotICAgKiBAcGFyYW0gdE1vZGVsCi0gICAqIEByZXR1cm4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24KLSAgICovCi0gIHByaXZhdGUgS2V5ZWRSZWZlcmVuY2UgY29uZm9ybWFuY2VDbGFpbU1hZGUoVE1vZGVsIHRNb2RlbCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIElmIHRoZSB0TW9kZWwgZG9lcyBub3QgZXhpc3QsIHRoZW4gZmFpbAotICAgIGlmICh0TW9kZWwgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0TW9kZWwgY2Fubm90IGJlIG51bGwiKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBhIHRNb2RlbAotICAgIGVsc2UKLSAgICB7Ci0gICAgICBDYXRlZ29yeUJhZyBiYWcgPSB0TW9kZWwuZ2V0Q2F0ZWdvcnlCYWcoKTsKLSAgICAgIHJldHVybiBjaGVja0NhdGVnb3J5QmFnKHRoaXMudmFsaWRhdG9yLnVkZGlQcm94eSwgYmFnKTsKLSAgICB9Ci0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3VkZGkvV1NJMzAwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjNlZjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwudWRkaTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlVERElVdGlsczsKLWltcG9ydCBvcmcudWRkaTRqLmNsaWVudC5VRERJUHJveHk7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLkJpbmRpbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLkNhdGVnb3J5QmFnOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5LZXllZFJlZmVyZW5jZTsKLQotCi0vKioKLSAqIFdTSTMwMDcgLSBBIHVkZGk6YnVzaW5lc3NFbnRpdHkgb3IgdWRkaTpidXNpbmVzc1NlcnZpY2UgYXNzb2NpYXRlZAotICogd2l0aCB0aGlzIHVkZGk6YmluZGluZ1RlbXBsYXRlIGlzIG5vdCBjYXRlZ29yaXplZCB1c2luZwotICogdGhlIHdzLWktb3JnOmNvbmZvcm1zVG86MjAwMl8xMiB0YXhvbm9teS4KLSAqLwotcHVibGljIGNsYXNzIFdTSTMwMDcgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgVURESVZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gVURESVZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kzMDA3KFVERElWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBzZXJ2aWNlTG9jYXRpb24gPSBudWxsOwotCi0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAvLyBHZXQgdGhlIGJpbmRpbmdUZW1wbGF0ZSBmcm9tIHRoZSBlbnRyeUNvbnRleHQKLSAgICBCaW5kaW5nVGVtcGxhdGUgYmluZGluZ1RlbXBsYXRlID0KLSAgICAgIChCaW5kaW5nVGVtcGxhdGUpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICBib29sZWFuIHZhbGlkU2VydmljZSA9IGZhbHNlOwotICAgIGJvb2xlYW4gdmFsaWRCdXNpbmVzcyA9IGZhbHNlOwotCi0gICAgU3RyaW5nIHNlcnZpY2VLZXkgPSBudWxsOwotICAgIFN0cmluZyBidXNpbmVzc0tleSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc2VydmljZUtleSA9IGJpbmRpbmdUZW1wbGF0ZS5nZXRTZXJ2aWNlS2V5KCk7Ci0gICAgICBCdXNpbmVzc1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgIFVERElVdGlscy5nZXRCdXNpbmVzc1NlcnZpY2VCeUtleSh0aGlzLnZhbGlkYXRvci51ZGRpUHJveHksIHNlcnZpY2VLZXkpOwotCi0gICAgICBidXNpbmVzc0tleSA9IHNlcnZpY2UuZ2V0QnVzaW5lc3NLZXkoKTsKLSAgICAgIEJ1c2luZXNzRW50aXR5IGJ1c2luZXNzID0KLSAgICAgICAgVURESVV0aWxzLmdldEJ1c2luZXNzQnlLZXkodGhpcy52YWxpZGF0b3IudWRkaVByb3h5LCBidXNpbmVzc0tleSk7Ci0KLSAgICAgIHZhbGlkU2VydmljZSA9IGNoZWNrQ2F0ZWdvcnlCYWcodGhpcy52YWxpZGF0b3IudWRkaVByb3h5LCBzZXJ2aWNlLmdldENhdGVnb3J5QmFnKCkpOwotICAgICAgdmFsaWRCdXNpbmVzcyA9IGNoZWNrQ2F0ZWdvcnlCYWcodGhpcy52YWxpZGF0b3IudWRkaVByb3h5LCBidXNpbmVzcy5nZXRDYXRlZ29yeUJhZygpKTsKLQotICAgICAgaWYgKCF2YWxpZEJ1c2luZXNzIHx8ICF2YWxpZFNlcnZpY2UpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgICAgIGlmICghdmFsaWRCdXNpbmVzcykKLSAgICAgICAgewotICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICJUaGUgYnVzaW5lc3NFbnRpdHkga2V5IGlzOiBbIiArIGJ1c2luZXNzS2V5ICsgIl0uIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghdmFsaWRTZXJ2aWNlKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCF2YWxpZEJ1c2luZXNzKQotICAgICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgKz0gIiAiOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gIiI7Ci0KLSAgICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSArPSAiVGhlIGJ1c2luZXNzU2VydmljZSBrZXkgaXM6IFsiCi0gICAgICAgICAgICArIHNlcnZpY2VLZXkKLSAgICAgICAgICAgICsgIl0uIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICJUaGUgVURESSByZWdpc3RyeSBkb2VzIG5vdCBjb250YWluIFdTSSBjb25mb3JtYW5jZSB0YXhvbm9teSIKLSAgICAgICAgICArICIgdE1vZGVsIChcIndzLWktb3JnOmNvbmZvcm1zVG86MjAwMl8xMlwiKS4iOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigKLSAgICAgICAgIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkaXNjb3ZlcnkgdGVzdCBhc3NlcnRpb25zLiIsCi0gICAgICAgIGUpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsTWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhdGVnb3J5IGJhZyBjb250YWlucyB0aGUgY29uZm9ybWFuY2UgY2xhaW0uCi0gICAqIFJldHVybnMgPGI+dHJ1ZTwvYj4gaWYgdGhlIGJhZyBkb2VzIG5vdCBjb250YWluIHRoZSBjb25mb3JtYW5jZSBjbGFpbS4KLSAgICogQHBhcmFtIHByb3h5Ci0gICAqIEBwYXJhbSBiYWcKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDYXRlZ29yeUJhZyhVRERJUHJveHkgcHJveHksIENhdGVnb3J5QmFnIGJhZykKLSAgewotICAgIFN0cmluZyBjb25mb3JtYW5jZUtleSA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgY29uZm9ybWFuY2VLZXkgPSBVRERJVXRpbHMuZ2V0V1NJQ29uZm9ybWFuY2VUTW9kZWxLZXkocHJveHkpOwotICAgIH0KLSAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLSAgICBpZiAoYmFnICE9IG51bGwpCi0gICAgewotICAgICAgVmVjdG9yIHJlZmVyZW5jZXMgPSBiYWcuZ2V0S2V5ZWRSZWZlcmVuY2VWZWN0b3IoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCkgJiYgcmVzdWx0OyBpKyspCi0gICAgICB7Ci0gICAgICAgIEtleWVkUmVmZXJlbmNlIHJlZiA9IChLZXllZFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0KLSAgICAgICAgcmVzdWx0ID0gIXJlZi5nZXRUTW9kZWxLZXkoKS5lcXVhbHNJZ25vcmVDYXNlKGNvbmZvcm1hbmNlS2V5KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvdWRkaS9XU0kzMDIxLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MzUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC91ZGRpL1dTSTMwMjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC51ZGRpOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVURESVV0aWxzOwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLlRNb2RlbDsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuQ2F0ZWdvcnlCYWc7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi0KLS8qKgotKiBXU0kzMDIxIC0gVGhlIHVkZGk6dE1vZGVsIGhhcyBhICJuYW1lIiBlbGVtZW50IG9mIHZhbHVlICJ3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTIiICwKLSogaGFzIGFuIG92ZXJ2aWV3VVJMIHZhbHVlIG9mICJodHRwOi8vd3MtaS5vcmcvc2NoZW1hcy9jb25mb3JtYW5jZUNsYWltLyIsIGFuZCBoYXMKLSogYSBrZXllZFJlZmVyZW5jZSBlbGVtZW50IHdpdGgga2V5TmFtZSBhdHRyaWJ1dGUgdmFsdWUgb2YgInVkZGktb3JnOnR5cGVzOmNhdGVnb3JpemF0aW9uIi4KLSovCi1wdWJsaWMgY2xhc3MgV1NJMzAyMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBVRERJVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBVRERJVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTMwMjEoVURESVZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBUTW9kZWwgdE1vZGVsID0KLSAgICAgIFVERElVdGlscy5nZXRUTW9kZWxCeUtleSgKLSAgICAgICAgdGhpcy52YWxpZGF0b3IudWRkaVByb3h5LAotICAgICAgICBVRERJVXRpbHMuZ2V0V1NJQ29uZm9ybWFuY2VUTW9kZWxLZXkodGhpcy52YWxpZGF0b3IudWRkaVByb3h5KSk7Ci0KLSAgICAvLyBJZiB0aGUgdE1vZGVsIGRvZXMgbm90IGV4aXN0LCB0aGVuIGZhaWwKLSAgICBpZiAodE1vZGVsID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9ICJDb3VsZCBub3QgbG9jYXRlIGEgdE1vZGVsLiI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIHZhbGlkVVJMID0KLSAgICAgICAgdE1vZGVsLmdldE92ZXJ2aWV3RG9jKCkgIT0gbnVsbAotICAgICAgICAgICYmICJodHRwOi8vd3MtaS5vcmcvc2NoZW1hcy9jb25mb3JtYW5jZUNsYWltLyIuZXF1YWxzKAotICAgICAgICAgICAgdE1vZGVsLmdldE92ZXJ2aWV3RG9jKCkuZ2V0T3ZlcnZpZXdVUkxTdHJpbmcoKSk7Ci0gICAgICBib29sZWFuIHZhbGlkQ2F0ZWdvcnkgPSBjaGVja0NhdGVnb3J5QmFnKHRNb2RlbC5nZXRDYXRlZ29yeUJhZygpKTsKLQotICAgICAgaWYgKHZhbGlkVVJMICYmIHZhbGlkQ2F0ZWdvcnkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSB0aGlzLnZhbGlkYXRvci51ZGRpUmVmZXJlbmNlLmdldElucXVpcnlVUkwoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbE1lc3NhZ2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYXRlZ29yeSBiYWcgbWVldHMgdGhlIFdTSSdzIHJlcXVpcmVtZW50cy4KLSAgICogQHBhcmFtIGJhZwotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDYXRlZ29yeUJhZyhDYXRlZ29yeUJhZyBiYWcpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgaWYgKGJhZyAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciByZWZlcmVuY2VzID0gYmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMuc2l6ZSgpICYmICFyZXN1bHQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2UgcmVmID0gKEtleWVkUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQotICAgICAgICByZXN1bHQgPQotICAgICAgICAgICJ1ZGRpLW9yZzp0eXBlczpjYXRlZ29yaXphdGlvbiIuZXF1YWxzKHJlZi5nZXRLZXlOYW1lKCkpCi0gICAgICAgICAgICAmJiAiY2F0ZWdvcml6YXRpb24iLmVxdWFscyhyZWYuZ2V0S2V5VmFsdWUoKSkKLSAgICAgICAgICAgICYmICJ1dWlkOkMxQUNGMjZELTk2NzItNDQwNC05RDcwLTM5Qjc1NkU2MkFCNCIuZXF1YWxzKAotICAgICAgICAgICAgICByZWYuZ2V0VE1vZGVsS2V5KCkpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlNTYxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjkwMQotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIGRlc2NyaXB0aW9uIHVzZXMgZWl0aGVyIHRoZSBXU0RMIE1JTUUgQmluZGluZyBhcyBkZXNjcmliZWQgaW4gV1NETCAxLjEgU2VjdGlvbiA1Ci0gKiBvciBXU0RMIFNPQVAgYmluZGluZyBhcyBkZXNjcmliZWQgaW4gV1NETCAxLjEgU2VjdGlvbiAzCi0gKiBvbiBlYWNoIG9mIHRoZSB3c2RsOmlucHV0IG9yIHdzZGw6b3V0cHV0IGVsZW1lbnRzIG9mIGEgd3NkbDpiaW5kaW5nLiA8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICAvKioKLSAgICogV1NETFZhbGlkYXRvcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgcHJpdmF0ZSBDb2xsZWN0aW9uIG1pbWVFbGVtZW50czsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTAxKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0KLSAgICBtaW1lRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgIG1pbWVFbGVtZW50cy5hZGQoV1NETF9NSU1FX0NPTlRFTlQpOwotICAgIG1pbWVFbGVtZW50cy5hZGQoV1NETF9NSU1FX1hNTCk7Ci0gICAgbWltZUVsZW1lbnRzLmFkZChXU0RMX01JTUVfTVVMVElQQVJUKTsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgaXRzIHdzZGw6b3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBMaXN0IG9wcyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgb3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wcy5nZXQoaSk7Ci0KLSAgICAgICAgLy8gR2V0dGluZyB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dCBlbGVtZW50cyBvZiBhbiBvcGVyYXRpb24KLSAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpOwotCi0gICAgICAgIFFOYW1lIGluYXBwbGljYWJsZUVsZW1lbnQgPSBudWxsOwotICAgICAgICAvLyBHZXR0aW5nIGFuIGluYXBwbGljYWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgb2Ygd3NkbDppbnB1dAotICAgICAgICAvLyBJZiBzdWNoIGVsZW1lbnQgZXhpc3RzLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBpZiAoYmluZGluZ0lucHV0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIGFuIGluYXBwbGljYWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgb2Ygd3NkbDppbnB1dAotICAgICAgICAgIC8vIElmIHN1Y2ggZWxlbWVudCBleGlzdHMsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaW5hcHBsaWNhYmxlRWxlbWVudCA9IGdldEluYXBwbGljYWJsZUVsZW1lbnQoYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAgIGlmIChpbmFwcGxpY2FibGVFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbihpbmFwcGxpY2FibGVFbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBHZXR0aW5nIGFuIGluYXBwbGljYWJsZSBleHRlbnNpYmlsaXR5IGVsZW1lbnQgb2Ygd3NkbDpvdXRwdXQKLSAgICAgICAgLy8gSWYgc3VjaCBlbGVtZW50IGV4aXN0cywgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgaWYgKGJpbmRpbmdPdXRwdXQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGluYXBwbGljYWJsZUVsZW1lbnQgPQotICAgICAgICAgICAgZ2V0SW5hcHBsaWNhYmxlRWxlbWVudChiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgICBpZiAoaW5hcHBsaWNhYmxlRWxlbWVudCAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oaW5hcHBsaWNhYmxlRWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIExvb2tzIGZvciBhbnkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IG9mIHdzZGw6aW5wdXQgb3Igd3NkbDpvdXRwdXQKLSAgICogdGhhdCBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBTT0FQIGJpbmRpbmcgb3IgdGhlIE1JTUUgYmluZGluZy4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAqIEByZXR1cm4gdGhlIFFOYW1lIG9mIGFuIGluYXBwbGljYWJsZSBlbGVtZW50Ci0gICAqLwotICBwcml2YXRlIFFOYW1lIGdldEluYXBwbGljYWJsZUVsZW1lbnQoTGlzdCBleHRFbGVtcykKLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgUU5hbWUgZWxlbWVudE5hbWUgPQotICAgICAgICAoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaSkpLmdldEVsZW1lbnRUeXBlKCk7Ci0KLSAgICAgIGlmICghbWltZUVsZW1lbnRzLmNvbnRhaW5zKGVsZW1lbnROYW1lKSAmJgotICAgICAgICAgICFlbGVtZW50TmFtZS5lcXVhbHMoV1NETF9TT0FQX0JPRFkpICYmCi0gICAgICAgICAgIWVsZW1lbnROYW1lLmVxdWFscyhXU0RMX1NPQVBfSEVBREVSKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGVsZW1lbnROYW1lOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYmMzMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FQ29udGVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FTXVsdGlwYXJ0UmVsYXRlZDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZS5NSU1FUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotLyoqCi0gKiBBUDI5MDMKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIHdpdGggYXQgbGVhc3Qgb25lIG1pbWU6Y29udGVudCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBwYXJ0IGF0dHJpYnV0ZSBvZiBlYWNoIG1pbWU6Y29udGVudCBlbGVtZW50IGluIGEgd3NkbDpiaW5kaW5nIHJlZmVyZW5jZXMKLSAqIGEgd3NkbDpwYXJ0IGVsZW1lbnQgb2YgYSB3c2RsOm1lc3NhZ2UgdGhhdCBpcyBwcmVzZW50IGluIHRoZSByZXNwZWN0aXZlIHdzZGw6aW5wdXQgb3Igd3NkbDpvdXRwdXQgb2YgdGhlCi0gKiBjb3JyZXNwb25kaW5nIHdzZGw6b3BlcmF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6cG9ydFR5cGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjkwMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIGEgYmluZGluZyBjb250YWlucyBhdCBsZWFzdCBvbmUKLSAgICAgIC8vIG1pbWU6Y29udGVudCBlbGVtZW50Ci0gICAgICBib29sZWFuIG1pbWVDb250ZW50c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIGZyb20gd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQKLSAgICAgICAgTGlzdCBpbnB1dE1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50RWxlbWVudHMoCi0gICAgICAgICAgYmluZGluZ0lucHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgTGlzdCBvdXRwdXRNaW1lQ29udGVudHMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdPdXRwdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDppbnB1dCBjb250YWlucyBtaW1lOmNvbnRlbnQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFpbnB1dE1pbWVDb250ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW1lQ29udGVudHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgSW5wdXQgcG9ydFR5cGVJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGluIHdzZGw6cG9ydFR5cGUsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocG9ydFR5cGVJbnB1dCA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJUaGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZ2luZyB3c2RsOmlucHV0IGluIHRoZSB3c2RsOnBvcnRUeXBlIgotICAgICAgICAgICAgICArICIgb3BlcmF0aW9uIGZvciB0aGUgd3NkbDppbnB1dCBvZiB0aGUgXCIiCi0gICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0KLSAgICAgICAgICAvLyBJZiB0aGUgd3NkbDpwb3J0VHlwZSBpbnB1dCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IHdzZGw6bWVzc2FnZSwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChwb3J0VHlwZUlucHV0LmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE5hbWUoKSArICJcIiB3c2RsOnBvcnRUeXBlICIKLSAgICAgICAgICAgICAgKyAib3BlcmF0aW9uIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgd3NkbDptZXNzYWdlLiIpOwotCi0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgcGFydCBuYW1lIHRoYXQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgd3NkbDptZXNzYWdlCi0gICAgICAgICAgLy8gdGhlIGlucHV0IG9mIHdzZGw6cG9ydFR5cGUgcmVmZXJzIHRvCi0gICAgICAgICAgU3RyaW5nIHBhcnQgPSBnZXRJbnZhbGlkTWltZUNvbnRlbnRQYXJ0KAotICAgICAgICAgICAgaW5wdXRNaW1lQ29udGVudHMsIHBvcnRUeXBlSW5wdXQuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAgIC8vIElmIHN1Y2ggcGFydCBpcyBmb3VuZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oInBhcnQ9XCIiICsgcGFydCArCi0gICAgICAgICAgICAgICJcIiwgdGhlIGlucHV0IG9mIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6b3V0cHV0IGNvbnRhaW5zIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAgICAgICBpZiAoIW91dHB1dE1pbWVDb250ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW1lQ29udGVudHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgT3V0cHV0IHBvcnRUeXBlT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGluIHdzZGw6cG9ydFR5cGUsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocG9ydFR5cGVPdXRwdXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiVGhlcmUgaXMgbm8gdGhlIGNvcnJlc3Bvbmdpbmcgd3NkbDpvdXRwdXQgaW4gdGhlIHdzZGw6cG9ydFR5cGUiCi0gICAgICAgICAgICAgICsgIiBvcGVyYXRpb24gZm9yIHRoZSB3c2RsOm91dHB1dCBvZiB0aGUgXCIiCi0gICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0KLSAgICAgICAgICAvLyBJZiB0aGUgd3NkbDpwb3J0VHlwZSBvdXRwdXQgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB3c2RsOm1lc3NhZ2UsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE5hbWUoKSArICJcIiB3c2RsOnBvcnRUeXBlICIKLSAgICAgICAgICAgICAgKyAib3BlcmF0aW9uIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgd3NkbDptZXNzYWdlLiIpOwotCi0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgcGFydCBuYW1lIHRoYXQgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgd3NkbDptZXNzYWdlCi0gICAgICAgICAgLy8gdGhlIG91dHB1dCBvZiB3c2RsOnBvcnRUeXBlIHJlZmVycyB0bwotICAgICAgICAgIFN0cmluZyBwYXJ0ID0gZ2V0SW52YWxpZE1pbWVDb250ZW50UGFydCgKLSAgICAgICAgICAgICAgb3V0cHV0TWltZUNvbnRlbnRzLCBwb3J0VHlwZU91dHB1dC5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgICAgLy8gSWYgc3VjaCBwYXJ0IGlzIGZvdW5kLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigicGFydD1cIiIgKyBwYXJ0ICsKLSAgICAgICAgICAgICAgICAiXCIsIHRoZSBvdXRwdXQgb2YgdGhlIGJpbmRpbmcgb3BlcmF0aW9uIFwiIgotICAgICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIiKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgYmluZGluZyBjb250YWlucyBubyBtaW1lOmNvbnRlbnQgZWxlbWVudHMsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoIW1pbWVDb250ZW50c0ZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgbWltZTpjb250ZW50IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhhdCBjYW4gY29udGFpbiBtaW1lOmNvbnRlbnRTLgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1pbWU6Y29udGVudCBlbGVtZW50cyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRNaW1lQ29udGVudEVsZW1lbnRzKExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICBMaXN0IG1pbWVDb250ZW50RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRFbGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbXMuZ2V0KGkpOwotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgb2YgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudHMgb2YgdGhpcyBtaW1lOnBhcnQKLSAgICAgICAgICAgIExpc3QgZWxlbXMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgICBtaW1lQ29udGVudEVsZW1lbnRzLmFkZEFsbChlbGVtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEVsc2UgaWYgdGhlIGVsZW1lbnQgaXMgbWltZTpjb250ZW50Ci0gICAgICAgIGVsc2UgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX0NPTlRFTlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgbWltZUNvbnRlbnRFbGVtZW50cy5hZGQoZXh0RWxlbSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWltZUNvbnRlbnRFbGVtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHBhcnQgbmFtZSBzcGVjaWZpZWQgaW4gbWltZTpjb250ZW50IGVsZW1lbnQgdGhhdCBpcyBub3QgcHJlc2VudGVkIGluIHdzZGw6bWVzc2FnZQotICAgKiBAcGFyYW0gbWltZUNvbnRlbnRzIGEgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMgd2hpY2ggcGFydCBhdHRyaWJ1dGVzIGFyZSB2YWxpZGF0ZWQKLSAgICogQHBhcmFtIG1lc3NhZ2UgYSB3c2RsOm1lc3NhZ2UKLSAgICogQHJldHVybiBhIHBhcnQgbmFtZQotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW52YWxpZE1pbWVDb250ZW50UGFydChMaXN0IG1pbWVDb250ZW50cywgTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgLy8gR29pbmcgdGhyb3VnIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lQ29udGVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgLy8gR2V0dGluZyB0aGUgcGFydCBuYW1lIG9mIGEgbWltZTplbGVtZW50Ci0gICAgICBTdHJpbmcgcGFydCA9ICgoTUlNRUNvbnRlbnQpIG1pbWVDb250ZW50cy5nZXQoaSkpLmdldFBhcnQoKTsKLSAgICAgIC8vIElmIHRoZSB3c2RsOm1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBzdWNoIHBhcnQsIHJldHVybiB0aGUgcGFydAotICAgICAgaWYgKCFtZXNzYWdlLmdldFBhcnRzKCkua2V5U2V0KCkuY29udGFpbnMocGFydCkpCi0gICAgICAgIHJldHVybiBwYXJ0OwotICAgIH0KLSAgICAvLyBSZXR1cm4gbnVsbCBpZiBubyBvbmUgcGFydCBpcyBmb3VuZAotICAgIHJldHVybiBudWxsOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWMxNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotLyoqCi0gKiBBUDI5MDQKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbWltZTpjb250ZW50IGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHBhcnQgYXR0cmlidXRlIG9mIGVhY2ggbWltZTpjb250ZW50IGVsZW1lbnQgaW4gYSB3c2RsOmJpbmRpbmcKLSAqIGRvZXMgbm90IHJlZmVyZW5jZSBhIHN1Yi1jb21wb25lbnQgb2YgYSB3c2RsOnBhcnQgb2YgdGhlIHdzZGw6bWVzc2FnZSB0aGF0IGlzIHByZXNlbnQgaW4gdGhlCi0gKiByZXNwZWN0aXZlIHdzZGw6aW5wdXQgb3Igd3NkbDpvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgd3NkbDpvcGVyYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcKLSAqIHdzZGw6cG9ydFR5cGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkwNCBleHRlbmRzIEFQMjkwMwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTA0KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHN1cGVyLnZhbGlkYXRlKHRlc3RBc3NlcnRpb24sIGVudHJ5Q29udGV4dCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5YzdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwNi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjkwNgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgY29udGFpbmluZyBhIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkEgbm9uLXJvb3QgTUlNRSBwYXJ0IGluIGEgd3NkbDpiaW5kaW5nIGRvZXMgbm90IGNvbnRhaW4gYSBzb2FwYmluZDpoZWFkZXIgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTA2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTA2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgLy8gbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnQKLSAgICAgIGJvb2xlYW4gbXVsdGlwYXJ0c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzIGZyb20gd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQKLSAgICAgICAgTGlzdCBpbnB1dE11bHRpcGFydHMgPSBnZXRNaW1lTXVsdGlwYXJ0RWxlbWVudHMoCi0gICAgICAgICAgYmluZGluZ0lucHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgTGlzdCBvdXRwdXRNdWx0aXBhcnRzID0gZ2V0TWltZU11bHRpcGFydEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdPdXRwdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDppbnB1dCBjb250YWlucyBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFpbnB1dE11bHRpcGFydHMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgbXVsdGlwYXJ0c0ZvdW5kID0gdHJ1ZTsKLQotICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgc29hcDpoZWFkZXIgaW4gdGhlIG5vbi1yb290IG1pbWU6cGFydCwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChjb250YWluc0ludmFsaWRNaW1lUGFydChpbnB1dE11bHRpcGFydHMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgaW52YWxpZCBtaW1lOnBhcnQgZWxlbWVudCAiCi0gICAgICAgICAgICAgICsgImlzIGluIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDpvdXRwdXQgY29udGFpbnMgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgICAgIGlmICghb3V0cHV0TXVsdGlwYXJ0cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtdWx0aXBhcnRzRm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzb2FwOmhlYWRlciBpbiB0aGUgbm9uLXJvb3QgbWltZTpwYXJ0LAotICAgICAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKGNvbnRhaW5zSW52YWxpZE1pbWVQYXJ0KG91dHB1dE11bHRpcGFydHMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgaW52YWxpZCBtaW1lOnBhcnQgZWxlbWVudCAiCi0gICAgICAgICAgICAgICAgKyAiaXMgaW4gdGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gSWYgdGhlIGJpbmRpbmcgY29udGFpbnMgbm8gb25lIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFtdWx0aXBhcnRzRm91bmQpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIExvb2tzIGZvciBzdWNoIG5vbi1yb290IG1pbWU6cGFydCBlbGVtZW50IGZyb20gYSBsaXN0IG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cwotICAgKiB0aGF0IGNvbnRhaW5zIGEgc29hcDpoZWFkZXIgZWxlbWVudC4KLSAgICogQHBhcmFtIG11bHRpcGFydHMgYSBsaXN0IG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cwotICAgKiBAcmV0dXJuIHRydWUsIGlmIHN1Y2ggZWxlbWVudCBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNJbnZhbGlkTWltZVBhcnQoTGlzdCBtdWx0aXBhcnRzKQotICB7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCBhIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdWx0aXBhcnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBsaXN0IG9mIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgTGlzdCBtaW1lUGFydHMgPQotICAgICAgICAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBtdWx0aXBhcnRzLmdldChpKSkuZ2V0TUlNRVBhcnRzKCk7Ci0KLSAgICAgIC8vIExvb2tpbmcgZm9yIG5vbi1yb290IG1pbWU6cGFydFMKLSAgICAgIGlmIChtaW1lUGFydHMuc2l6ZSgpID4gMSkKLSAgICAgIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCBtaW1lUGFydHMuc2l6ZSgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIG9mIGEgbWltZTpwYXJ0Ci0gICAgICAgICAgTGlzdCBleHRFbGVtcyA9Ci0gICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBleHRFbGVtcy5zaXplKCk7IGsrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBhbiBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgYSBzb2FwOmhlYWRlciwKLSAgICAgICAgICAgIC8vIHJldHVybiB0cnVlCi0gICAgICAgICAgICBpZiAoKChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5nZXQoaykpCi0gICAgICAgICAgICAgIC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfSEVBREVSKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIHJldHVybiBmYWxzZSwgaWYgdGhlIGVsZW1lbnQgaXMgbm90IGZvdW5kCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIGFsbCBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBleHRFbGVtcyBhIGxpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGF0IGNhbiBjb250YWluIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cy4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0TWltZU11bHRpcGFydEVsZW1lbnRzKExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICBMaXN0IG1pbWVNdWx0aXBhcnRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmIChleHRFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dEVsZW1zLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaSk7Ci0gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfTVVMVElQQVJUKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEFkZGluZyB0aGUgZWxlbWVudCB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgIG1pbWVNdWx0aXBhcnRFbGVtZW50cy5hZGQoZXh0RWxlbSk7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1pbWVQYXJ0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzIG9mIHRoaXMgbWltZTpwYXJ0Ci0gICAgICAgICAgICBMaXN0IGVsZW1zID0gZ2V0TWltZU11bHRpcGFydEVsZW1lbnRzKAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgICBtaW1lTXVsdGlwYXJ0RWxlbWVudHMuYWRkQWxsKGVsZW1zKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWltZU11bHRpcGFydEVsZW1lbnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDQ0NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjkwNwotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmc8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RWFjaCBNSU1FIHBhcnQgaW4gYSBkZXNjcmlwdGlvbiBpcyBkZWZpbmVkIHVzaW5nCi0gKiBhbiBlbGVtZW50IHdpdGggYSBsb2NhbCBuYW1lIG9mIHBhcnQgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGUKLSAqIFdTREwgTUlNRSBCaW5kaW5nIGV4dGVuc2lvbi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTA3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTA3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDhjOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQVAyOTA4Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgbWltZTpwYXJ0IGVsZW1lbnQgaW4gYSBERVNDUklQVElPTiBkb2VzIG5vdCBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkwOCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjkwOChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nIHdzZGxCaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAgIC8vIFNpbmNlIFdTREw0SiAxLjQgaWdub3JlcyBhbnkgYXR0cmlidXRlcyBvZiBtaW1lOnBhcnQsIHVzZSBYZXJjZXMgMi42LjIgaW5zdGVhZAotICAgICAgRG9jdW1lbnQgZG9jID0gWE1MVXRpbHMucGFyc2VYTUxEb2N1bWVudCh2YWxpZGF0b3Iud3NkbFVSTCk7Ci0KLSAgICAgIC8vIEZpbmRpbmcgdGhlIHdzZGw6YmluZGluZyBlbGVtZW50IGJlaW5nIHByb2Nlc3NlZAotICAgICAgRWxlbWVudCBiaW5kaW5nID0gZ2V0QmluZGluZ0VsZW1lbnQoCi0gICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwgd3NkbEJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0KLSAgICAgIExpc3Qgb3BzID0gZ2V0Q2hpbGRFbGVtZW50cyhiaW5kaW5nLCBXU0RMX09QRVJBVElPTik7Ci0KLSAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgLy8gbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnQKLSAgICAgIGJvb2xlYW4gbXVsdGlwYXJ0c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgYmluZGluZ09wZXJhdGlvbiA9IChFbGVtZW50KSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEVsZW1lbnQgYmluZGluZ0lucHV0ID0gZ2V0Q2hpbGRFbGVtZW50KGJpbmRpbmdPcGVyYXRpb24sIFdTRExfSU5QVVQpOwotICAgICAgICBFbGVtZW50IGJpbmRpbmdPdXRwdXQgPSBnZXRDaGlsZEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbiwgV1NETF9PVVRQVVQpOwotCi0gICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMgZnJvbSB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dAotICAgICAgICBMaXN0IGlucHV0TXVsdGlwYXJ0cyA9IGdldE1pbWVNdWx0aXBhcnRFbGVtZW50cyhiaW5kaW5nSW5wdXQpOwotICAgICAgICBMaXN0IG91dHB1dE11bHRpcGFydHMgPSBnZXRNaW1lTXVsdGlwYXJ0RWxlbWVudHMoYmluZGluZ091dHB1dCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6aW5wdXQgY29udGFpbnMgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgICAgIGlmICghaW5wdXRNdWx0aXBhcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG11bHRpcGFydHNGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6cGFydCBlbGVtZW50IGNvbnRhaW5pbmcgYSBuYW1lIGF0dHJpYnV0ZSwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChjb250YWluc0ludmFsaWRNaW1lUGFydChpbnB1dE11bHRpcGFydHMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgaW52YWxpZCAiCi0gICAgICAgICAgICAgICAgKyAibWltZTpwYXJ0IGVsZW1lbnQgaXMgaW4gdGhlIHdzZGw6aW5wdXQgb2YgdGhlIFwiIgotICAgICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXRBdHRyaWJ1dGUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkKLSAgICAgICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDpvdXRwdXQgY29udGFpbnMgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgICAgIGlmICghb3V0cHV0TXVsdGlwYXJ0cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtdWx0aXBhcnRzRm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBtaW1lOnBhcnQgZWxlbWVudCBjb250YWluaW5nIGEgbmFtZSBhdHRyaWJ1dGUsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoY29udGFpbnNJbnZhbGlkTWltZVBhcnQob3V0cHV0TXVsdGlwYXJ0cykpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBpbnZhbGlkICIKLSAgICAgICAgICAgICAgICArICJtaW1lOnBhcnQgZWxlbWVudCBpcyBpbiB0aGUgd3NkbDpvdXRwdXQgb2YgdGhlIFwiIgotICAgICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXRBdHRyaWJ1dGUoV1NJQ29uc3RhbnRzLkFUVFJfTkFNRSkKLSAgICAgICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGNvbnRhaW5zIG5vIG9uZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudCwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghbXVsdGlwYXJ0c0ZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgbWltZTpwYXJ0IGVsZW1lbnRzIGZvciBlYWNoIG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LgotICAgKiBAcGFyYW0gbXVsdGlwYXJ0cyBhIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUsIGlmIGFueSBtaW1lOnBhcnQgY29udGFpbnMgYSBuYW1lIGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zSW52YWxpZE1pbWVQYXJ0KExpc3QgbXVsdGlwYXJ0cykgewotICAgIC8vIEdvaW5nIHRocm91Z2ggYSBsaXN0IG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXVsdGlwYXJ0cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgbGlzdCBvZiBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgIExpc3QgbWltZVBhcnRzID0KLSAgICAgICAgZ2V0Q2hpbGRFbGVtZW50cygoRWxlbWVudCkgbXVsdGlwYXJ0cy5nZXQoaSksIFdTRExfTUlNRV9QQVJUKTsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgewotICAgICAgICBFbGVtZW50IG1pbWVQYXJ0ID0gKEVsZW1lbnQpIG1pbWVQYXJ0cy5nZXQoaik7Ci0gICAgICAgIC8vIElmIHRoZSBtaW1lOnBhcnQgZWxlbWVudCBjb250YWlucyBhIG5hbWUgYXR0cmlidXRlLAotICAgICAgICAvLyByZXR1cm4gdHJ1ZQotICAgICAgICBpZiAobWltZVBhcnQuZ2V0QXR0cmlidXRlTm9kZShXU0lDb25zdGFudHMuQVRUUl9OQU1FKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gTm8gb25lIGludmFsaWQgbWltZTpwYXJ0IGVsZW1lbnQgaXMgZm91bmQsIHJldHVybiBmYWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gcGFyZW50IGFuIGVsZW1lbnQgd2hpY2ggdGhlIGNoaWxkIGVsZW1lbnRzIGFyZSBnYXRoZXJlZCBmcm9tLgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRNaW1lTXVsdGlwYXJ0RWxlbWVudHMoRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBMaXN0IG1pbWVNdWx0aXBhcnRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBJZiB0aGUgcGFyZW50IGlzIG5vdCBudWxsCi0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHBhcmVudCdzIGNoaWxkCi0gICAgICBFbGVtZW50IGNoaWxkID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChwYXJlbnQpOwotICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZSBjaGlsZCBpcyBhIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50Ci0gICAgICAgIGlmIChjaGlsZC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVC5nZXROYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgICAmJiBjaGlsZC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVC5nZXRMb2NhbFBhcnQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnQgdG8gdGhlIGxpc3QgYmVpbmcgcmV0dXJuZWQKLSAgICAgICAgICBtaW1lTXVsdGlwYXJ0RWxlbWVudHMuYWRkKGNoaWxkKTsKLQotICAgICAgICAgIC8vIEdldHRpbmcgbWltZTpwYXJ0UyBmcm9tIHRoZSBlbGVtZW50Ci0gICAgICAgICAgTGlzdCBtaW1lUGFydHMgPSBnZXRDaGlsZEVsZW1lbnRzKGNoaWxkLCBXU0RMX01JTUVfUEFSVCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWltZVBhcnRzLnNpemUoKTsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMgb2YgdGhpcyBtaW1lOnBhcnQKLSAgICAgICAgICAgIExpc3QgZWxlbXMgPSBnZXRNaW1lTXVsdGlwYXJ0RWxlbWVudHMoKEVsZW1lbnQpIG1pbWVQYXJ0cy5nZXQoaSkpOwotICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50cyB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgICAgbWltZU11bHRpcGFydEVsZW1lbnRzLmFkZEFsbChlbGVtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgY2hpbGQKLSAgICAgICAgY2hpbGQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVNdWx0aXBhcnRFbGVtZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3IgYW4gZWxlbWVudCdzIGNoaWxkIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGNoaWxkTmFtZSBhIHF1YWxpZmllZCBlbGVtZW50IG5hbWUgYmVpbmcgZm91bmQuCi0gICAqIEByZXR1cm4gYW4gZWxlbWVudCBvciBudWxsIGlmIGl0IGlzIG5vdCBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgRWxlbWVudCBnZXRDaGlsZEVsZW1lbnQoRWxlbWVudCBwYXJlbnQsIFFOYW1lIGNoaWxkTmFtZSkKLSAgewotICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHBhcmVudCdzIGNoaWxkCi0gICAgRWxlbWVudCBjaGlsZCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQocGFyZW50KTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBJZiB0aGUgY2hpbGQgaGFzIHRoZSByZXF1aXJlZCBxdWFsaWZpZWQgbmFtZQotICAgICAgaWYgKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhjaGlsZE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICYmIGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUuZ2V0TG9jYWxQYXJ0KCkpKQotICAgICAgewotICAgICAgICAvLyByZXR1cm4gdGhlIGNoaWxkCi0gICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgIH0KLSAgICAgIC8vIEdldHRpbmcgdGhlIG5leHQgY2hpbGQKLSAgICAgIGNoaWxkID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBlbGVtZW50J3MgY2hpbGQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgZWxlbWVudC4KLSAgICogQHBhcmFtIGNoaWxkTmFtZSBhIHF1YWxpZmllZCBlbGVtZW50IG5hbWUgYmVpbmcgZm91bmQuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIGVsZW1lbnRzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGdldENoaWxkRWxlbWVudHMoRWxlbWVudCBwYXJlbnQsIFFOYW1lIGNoaWxkTmFtZSkKLSAgewotICAgIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IHBhcmVudCdzIGNoaWxkCi0gICAgICBFbGVtZW50IGNoaWxkID0gWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChwYXJlbnQpOwotICAgICAgd2hpbGUgKGNoaWxkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZSBjaGlsZCBoYXMgdGhlIHJlcXVpcmVkIHF1YWxpZmllZCBuYW1lCi0gICAgICAgIGlmIChjaGlsZC5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoY2hpbGROYW1lLmdldE5hbWVzcGFjZVVSSSgpKQotICAgICAgICAgICYmIGNoaWxkLmdldExvY2FsTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUuZ2V0TG9jYWxQYXJ0KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRkaW5nIHRoZSBjaGlsZCB0byB0aGUgbGlzdAotICAgICAgICAgIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBiaW5kaW5nJ3MgY2hpbGQKLSAgICAgICAgY2hpbGQgPSBYTUxVdGlscy5nZXROZXh0U2libGluZyhjaGlsZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGlsZHJlbjsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3Igd3NkbDpiaW5kaW5nIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9ucyBhIHdzZGw6ZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHBhcmFtIGJpbmRpbmdOYW1lIGEgbmFtZSBvZiB3c2RsOmJpbmRpbmcgZWxlbWVudC4KLSAgICogQHJldHVybiBhIHdzZGw6YmluZGluZyBlbGVtZW50IG9yIG51bGwgaWYgaXQgaXMgbm90IGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBFbGVtZW50IGdldEJpbmRpbmdFbGVtZW50KEVsZW1lbnQgZGVmaW5pdGlvbnMsIFN0cmluZyBiaW5kaW5nTmFtZSkKLSAgewotICAgIC8vIEdldHRpbmcgdGhlIGZpcnN0IGRlZmluaXRpb25zJyBjaGlsZAotICAgIEVsZW1lbnQgY2hpbGQgPSBYTUxVdGlscy5nZXRGaXJzdENoaWxkKGRlZmluaXRpb25zKTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBJZiBkZWZpbml0aW9ucycgY2hpbGQgaXMgd3NkbDpiaW5kaW5nIGVsZW1lbnQKLSAgICAgIC8vIGFuZCBpcyB0aGUgc2FtZSB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZCBieSBXU0RMVmFsaWRhdG9yCi0gICAgICBpZiAoY2hpbGQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTRExfQklORElORy5nZXROYW1lc3BhY2VVUkkoKSkKLSAgICAgICAgJiYgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFdTRExfQklORElORy5nZXRMb2NhbFBhcnQoKSkKLSAgICAgICAgJiYgY2hpbGQuZ2V0QXR0cmlidXRlKFdTSUNvbnN0YW50cy5BVFRSX05BTUUpLmVxdWFscyhiaW5kaW5nTmFtZSkpCi0gICAgICB7Ci0gICAgICAgIC8vIHJldHVybiB0aGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQKLSAgICAgICAgcmV0dXJuIGNoaWxkOwotICAgICAgfQotICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBkZWZpbml0aW9ucycgY2hpbGQKLSAgICAgIGNoaWxkID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotICAgIH0KLSAgICAvLyByZXR1cm4gbnVsbCwgaXMgdGhlcmUgaXMgbm8gc3VjaCB3c2RsOmJpbmRpbmcKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkwOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjY4MWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAyOTA5Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5NdWx0aXBsZSBtaW1lOmNvbnRlbnQgY2hpbGQgZWxlbWVudHMgb2YgYSBtaW1lOnBhcnQgZWxlbWVudAotICogaW4gYSBkZXNjaXB0aW9uIHJlZmVyZW5jZSB0aGUgc2FtZSB3c2RsOnBhcnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkwOSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLy8gQSB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyBhIGJpbmRpbmcgY29udGFpbnMKLSAgLy8gbXVsdGlwbGUgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gIHByaXZhdGUgYm9vbGVhbiBtdWx0aXBsZUNvbnRlbnRGb3VuZDsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTA5KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJlc2V0dGluZyB0aGUgdmFyaWFibGUKLSAgICBtdWx0aXBsZUNvbnRlbnRGb3VuZCA9IGZhbHNlOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0dGluZyBhIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgaXRzIHdzZGw6b3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBMaXN0IG9wcyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgb3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wcy5nZXQoaSk7Ci0KLSAgICAgICAgLy8gR2V0dGluZyB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dCBlbGVtZW50cyBvZiBhbiBvcGVyYXRpb24KLSAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpOwotCi0gICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgZnJvbSB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dAotICAgICAgICBMaXN0IGlucHV0TWltZVBhcnRzID0gZ2V0TWltZVBhcnRzKAotICAgICAgICAgIGJpbmRpbmdJbnB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgIExpc3Qgb3V0cHV0TWltZVBhcnRzID0gZ2V0TWltZVBhcnRzKAotICAgICAgICAgIGJpbmRpbmdPdXRwdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6cGFydCBjb250YWluaW5nIG11bHRpcGxlIG1pbWU6Y29udGVudFMKLSAgICAgICAgLy8gd2hpY2ggcmVmZXJlbmNlIGRpZmZlcmVudCB3c2RsOnBhcnRTLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBpZiAoY29udGFpbnNJbnZhbGlkTWltZVBhcnQoaW5wdXRNaW1lUGFydHMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBpbnZhbGlkIG1pbWU6cGFydCBlbGVtZW50ICIKLSAgICAgICAgICAgICsgImlzIGluIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6cGFydCBjb250YWluaW5nIG11bHRpcGxlIG1pbWU6Y29udGVudFMKLSAgICAgICAgLy8gd2hpY2ggcmVmZXJlbmNlIGRpZmZlcmVudCB3c2RsOnBhcnRTLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICBpZiAoY29udGFpbnNJbnZhbGlkTWltZVBhcnQob3V0cHV0TWltZVBhcnRzKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgaW52YWxpZCBtaW1lOnBhcnQgZWxlbWVudCAiCi0gICAgICAgICAgICArICJpcyBpbiB0aGUgd3NkbDpvdXRwdXQgb2YgdGhlIFwiIiArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgICAvLyBJZiB0aGUgYmluZGluZyBkb2VzIG5vdCBjb250YWluIGEgbWltZTpwYXJ0IHdpdGggbXVsdGlwbGUKLSAgICAgIC8vIG1pbWU6Y29udGVudCBlbGVtZW50cywgdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFtdWx0aXBsZUNvbnRlbnRGb3VuZCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyBtaW1lOnBhcnQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBtaW1lUGFydHMgYSBsaXN0IG9mIG1pbWU6cGFydCBlbGVtZW50cy4KLSAgICogQHJldHVybiB0cnVlIGlmIG11bHRpcGxlIG1pbWU6Y29udGVudFMgb2YgYSBtaW1lOnBhcnQKLSAgICogcmVmZXJlbmNlIGRpZmZlcmVudCB3c2RsOnBhcnRTLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNJbnZhbGlkTWltZVBhcnQoTGlzdCBtaW1lUGFydHMpCi0gIHsKLSAgICAvLyBHb2luZyB0aHJvdWdoIGEgbGlzdCBvZiBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbWVQYXJ0cy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIHRoZSBtaW1lOnBhcnQgY29udGFpbnMKLSAgICAgIC8vIGF0IGxlYXN0IG9uZSBtaW1lOmNvbnRlbnQgZWxlbWVudAotICAgICAgYm9vbGVhbiBtaW1lQ29udGVudEZvdW5kID0gZmFsc2U7Ci0gICAgICBTdHJpbmcgbWltZUNvbnRlbnRQYXJ0ID0gbnVsbDsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCBtaW1lOnBhcnQgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgTGlzdCBleHRFbGVtcyA9ICgoTUlNRVBhcnQpIG1pbWVQYXJ0cy5nZXQoaSkpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHRFbGVtcy5zaXplKCk7IGorKykKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgYW4gZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGlzIG1pbWU6Y29udGVudAotICAgICAgICBpZiAoKChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5nZXQoaikpCi0gICAgICAgICAgLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9DT05URU5UKSkKLSAgICAgICAgewotICAgICAgICAgIE1JTUVDb250ZW50IG1pbWVDb250ZW50ICA9IChNSU1FQ29udGVudCkgZXh0RWxlbXMuZ2V0KGopOwotICAgICAgICAgIC8vIElmIGEgbWltZTpjb250ZW50IGVsZW1lbnQgd2FzIGFscmVhZHkgZm91bmQgaW4gdGhpcyBtaW1lOnBhcnQKLSAgICAgICAgICBpZiAobWltZUNvbnRlbnRGb3VuZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtdWx0aXBsZUNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBJZiBhIG1pbWU6Y29udGVudCByZWZlcmVuY2VzIG90aGVyIHdzZGw6cGFydCB0aGFuIHRoZQotICAgICAgICAgICAgLy8gcHJldmlvdXMgbWltZTpjb250ZW50IGRvLCByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgaWYgKG1pbWVDb250ZW50LmdldFBhcnQoKSA9PSBudWxsCi0gICAgICAgICAgICAgIHx8ICFtaW1lQ29udGVudC5nZXRQYXJ0KCkuZXF1YWxzKG1pbWVDb250ZW50UGFydCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBtaW1lOmNvbnRlbnQgZWxlbWVudCBvZiBtaW1lOnBhcnQKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgbWltZUNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBtaW1lQ29udGVudFBhcnQgPSBtaW1lQ29udGVudC5nZXRQYXJ0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRoZXJlIGFyZSBubyBpbnZhbGlkIG1pbWU6cGFydCBlbGVtZW50cywgcmV0dXJuIGZhbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIGFsbCBtaW1lOnBhcnQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBleHRFbGVtcyBhIGxpc3Qgb2YgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cyB0aGF0IGNhbiBjb250YWluIG1pbWU6cGFydCBlbGVtZW50cy4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBtaW1lOnBhcnQgZWxlbWVudHMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0TWltZVBhcnRzKExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICBMaXN0IG1pbWVQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGlmIChleHRFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dEVsZW1zLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaSk7Ci0gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfTVVMVElQQVJUKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIG1pbWU6cGFydCBlbGVtZW50cyBvZiB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgICAgTGlzdCBtUGFydHMgPSAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtKS5nZXRNSU1FUGFydHMoKTsKLSAgICAgICAgICBtaW1lUGFydHMuYWRkQWxsKG1QYXJ0cyk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3QgZWxlbXMgPSBnZXRNaW1lUGFydHMoCi0gICAgICAgICAgICAgICAgKChNSU1FUGFydCkgbVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgICAgIG1pbWVQYXJ0cy5hZGRBbGwoZWxlbXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWltZVBhcnRzOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MTAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmQzMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5MTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRUNvbnRlbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAyOTEwCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIG1pbWU6Y29udGVudCBpbiBhIERFU0NSSVBUSU9OIHJlZmVyZW5jZXMKLSAqIGEgd3NkbDpwYXJ0IHRoYXQgaXMgZGVmaW5lZCB1c2luZyBlaXRoZXIgdGhlIHR5cGUgYXR0cmlidXRlCi0gKiBvciB0aGUgZWxlbWVudCBhdHRyaWJ1dGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkxMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjkxMChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIGEgYmluZGluZyBjb250YWlucyBhdCBsZWFzdCBvbmUKLSAgICAgIC8vIG1pbWU6Y29udGVudCBlbGVtZW50Ci0gICAgICBib29sZWFuIG1pbWVDb250ZW50c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIGZyb20gd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQKLSAgICAgICAgTGlzdCBpbnB1dE1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50RWxlbWVudHMoCi0gICAgICAgICAgYmluZGluZ0lucHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLSAgICAgICAgTGlzdCBvdXRwdXRNaW1lQ29udGVudHMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdPdXRwdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nT3V0cHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKTsKLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDppbnB1dCBjb250YWlucyBtaW1lOmNvbnRlbnQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFpbnB1dE1pbWVDb250ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW1lQ29udGVudHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgSW5wdXQgcG9ydFR5cGVJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGluIHdzZGw6cG9ydFR5cGUKLSAgICAgICAgICAvLyBvciB0aGUgd3NkbDppbnB1dCBkb2VzIG5vdCBzcGVjaWZ5IGEgbWVzc2FnZSBhdHRyaWJ1dGUsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocG9ydFR5cGVJbnB1dCA9PSBudWxsIHx8IHBvcnRUeXBlSW5wdXQuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIlRoZSBjb3JyZXNwb25naW5nIG9wZXJhdGlvbiBpbiB0aGUgd3NkbDpwb3J0VHlwZSBmb3IgdGhlIFwiIgotICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uIGlzIGludmFsaWQuIik7Ci0gICAgICAgICAgLy8gR2V0dGluZyBhIG1pbWU6Y29udGVudCByZWZlcmVuY2luZyBhbiBpbnZhbGlkIHdzZGw6cGFydCAKLSAgICAgICAgICBTdHJpbmcgcGFydCA9IGdldEludmFsaWRNaW1lQ29udGVudFBhcnQoCi0gICAgICAgICAgICBpbnB1dE1pbWVDb250ZW50cywgcG9ydFR5cGVJbnB1dC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgIC8vIElmIHN1Y2ggcGFydCBpcyBmb3VuZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAocGFydCAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oInBhcnQ9XCIiICsgcGFydCArCi0gICAgICAgICAgICAgICJcIiwgdGhlIGlucHV0IG9mIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6b3V0cHV0IGNvbnRhaW5zIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAgICAgICBpZiAoIW91dHB1dE1pbWVDb250ZW50cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBtaW1lQ29udGVudHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgT3V0cHV0IHBvcnRUeXBlT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOm91dHB1dCBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgICAgLy8gb3IgdGhlIHdzZGw6b3V0cHV0IGRvZXMgbm90IHNwZWNpZnkgYSBtZXNzYWdlIGF0dHJpYnV0ZSwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmIChwb3J0VHlwZU91dHB1dCA9PSBudWxsIHx8IHBvcnRUeXBlT3V0cHV0LmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJUaGUgY29ycmVzcG9uZ2luZyBvcGVyYXRpb24gaW4gdGhlIHdzZGw6cG9ydFR5cGUgZm9yIHRoZSBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiBiaW5kaW5nIG9wZXJhdGlvbiBpcyBpbnZhbGlkLiIpOwotICAgICAgICAgIC8vIEdldHRpbmcgYSBtaW1lOmNvbnRlbnQgcmVmZXJlbmNpbmcgYW4gaW52YWxpZCB3c2RsOnBhcnQKLSAgICAgICAgICBTdHJpbmcgcGFydCA9IGdldEludmFsaWRNaW1lQ29udGVudFBhcnQoCi0gICAgICAgICAgICAgIG91dHB1dE1pbWVDb250ZW50cywgcG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAvLyBJZiBzdWNoIHBhcnQgaXMgZm91bmQsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKHBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJwYXJ0PVwiIiArIHBhcnQgKwotICAgICAgICAgICAgICAgICJcIiwgdGhlIG91dHB1dCBvZiB0aGUgYmluZGluZyBvcGVyYXRpb24gXCIiCi0gICAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGRvZXMgbm90IGNvbnRhaW4gbWltZTpjb250ZW50IGVsZW1lbnRzLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFtaW1lQ29udGVudHNGb3VuZCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyBldmVyeSBtaW1lOmNvbnRlbnQgZWxlbWVudC4gSWYgaXQgcmVmZXJlbmNlcyBhIHdzZGw6cGFydCB0aGF0Ci0gICAqIGlzIGRlZmluZWQgdXNpbmcgbmVpdGhlciB0aGUgdHlwZSBhdHRyaWJ1dGUgbm9yIHRoZSBlbGVtZW50IGF0dHJpYnV0ZQotICAgKiBvciB1c2luZyB0aGVtIHRvZ2V0aGVyLCBpdCBpcyBpbnZhbGlkLgotICAgKiBAcGFyYW0gbWltZUNvbnRlbnRzIGEgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6bWVzc2FnZSBlbGVtZW50IGZvciBtaW1lOmNvbnRlbnRTLgotICAgKiBAcmV0dXJuIGEgdmFsdWUgb2YgdGhlIHBhcnQgYXR0cmlidXRlIG9mIGFuIGludmFsaWQgbWltZTpjb250ZW50Ci0gICAqIG9yIG51bGwgaWYgYWxsIHRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudHMgYXJlIHZhbGlkLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0SW52YWxpZE1pbWVDb250ZW50UGFydChMaXN0IG1pbWVDb250ZW50cywgTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgLy8gR29pbmcgdGhyb3VnIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lQ29udGVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgLy8gR2V0dGluZyBhIHZhbHVlIG9mIHRoZSBwYXJ0IGF0dHJpYnV0ZSBmcm9tIGEgbWltZTplbGVtZW50Ci0gICAgICBTdHJpbmcgcGFydE5hbWUgPSAoKE1JTUVDb250ZW50KSBtaW1lQ29udGVudHMuZ2V0KGkpKS5nZXRQYXJ0KCk7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBjb3JyZXNwb25naW5nIHdzZGw6cGFydAotICAgICAgUGFydCBwYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KHBhcnROYW1lKTsKLSAgICAgIC8vIGlmIGl0IGlzIGRlZmluZWQgYW5kIHVzZSBuZWl0aGVyIHRoZSB0eXBlIGF0dHJpYnV0ZQotICAgICAgLy8gbm9yIHRoZSBlbGVtZW50IGF0dHJpYnV0ZSBvciB1c2UgdGhlbSB0b2dldGhlciwgcmV0dXJuIHBhcnQgdmFsdWUKLSAgICAgIGlmIChwYXJ0ICE9IG51bGwKLSAgICAgICAgJiYgKChwYXJ0LmdldFR5cGVOYW1lKCkgPT0gbnVsbCAmJiBwYXJ0LmdldEVsZW1lbnROYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgfHwgKHBhcnQuZ2V0VHlwZU5hbWUoKSAhPSBudWxsICYmIHBhcnQuZ2V0RWxlbWVudE5hbWUoKSAhPSBudWxsKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBwYXJ0TmFtZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIG51bGwgaWYgbm8gb25lIHBhcnQgaXMgZm91bmQKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgbWltZTpjb250ZW50IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhhdCBjYW4gY29udGFpbiBtaW1lOmNvbnRlbnRTLgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIG1pbWU6Y29udGVudCBlbGVtZW50cyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRNaW1lQ29udGVudEVsZW1lbnRzKExpc3QgZXh0RWxlbXMpCi0gIHsKLSAgICBMaXN0IG1pbWVDb250ZW50RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRFbGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbXMuZ2V0KGkpOwotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgb2YgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudHMgb2YgdGhpcyBtaW1lOnBhcnQKLSAgICAgICAgICAgIExpc3QgZWxlbXMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgICBtaW1lQ29udGVudEVsZW1lbnRzLmFkZEFsbChlbGVtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEVsc2UgaWYgdGhlIGVsZW1lbnQgaXMgbWltZTpjb250ZW50Ci0gICAgICAgIGVsc2UgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX0NPTlRFTlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBsaXN0IGJlaW5nIHJldHVybmVkCi0gICAgICAgICAgbWltZUNvbnRlbnRFbGVtZW50cy5hZGQoZXh0RWxlbSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWltZUNvbnRlbnRFbGVtZW50czsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDMzODNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRU11bHRpcGFydFJlbGF0ZWQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUuTUlNRVBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAyOTExCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzIGluIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3VwdXQgZWxlbWVudHMKLSAqIG9mIG9wZXJhdGlvbnMgaW4gYSB3c2RsOmJpbmRpbmcsIGNvbnRhaW4gZXhhY3RseSBvbmUgbWltZTpwYXJ0IGNoaWxkIGVsZW1lbnQgdGhhdCBjb250YWlucwotICogYSBzb2FwYmluZDpib2R5IGNoaWxkIGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjkxMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjkxMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBIHZhcmlhYmxlIHRoYXQgaW5kaWNhdGVzIGEgYmluZGluZyBjb250YWlucyBhdCBsZWFzdCBvbmUKLSAgICAgIC8vIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50Ci0gICAgICBib29sZWFuIG11bHRpcGFydHNGb3VuZCA9IGZhbHNlOwotCi0gICAgICAvLyBHZXR0aW5nIGEgd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgICAgLy8gR2V0dGluZyBpdHMgd3NkbDpvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIExpc3Qgb3BzID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotCi0gICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgb3BzLmdldChpKTsKLQotICAgICAgICAvLyBHZXR0aW5nIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3V0cHV0IGVsZW1lbnRzIG9mIGFuIG9wZXJhdGlvbgotICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cyBmcm9tIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3V0cHV0Ci0gICAgICAgIExpc3QgaW5wdXRNdWx0aXBhcnRzID0gZ2V0TWltZU11bHRpcGFydEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdJbnB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgIExpc3Qgb3V0cHV0TXVsdGlwYXJ0cyA9IGdldE1pbWVNdWx0aXBhcnRFbGVtZW50cygKLSAgICAgICAgICBiaW5kaW5nT3V0cHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6aW5wdXQgY29udGFpbnMgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgICAgIGlmICghaW5wdXRNdWx0aXBhcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG11bHRpcGFydHNGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBub3QgZXhhY3RseSBvbmUgbWltZTpwYXJ0IGVsZW1lbnQgY29udGFpbmluZwotICAgICAgICAgIC8vIGEgc29hcGJpbmQ6Ym9keSBjaGlsZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIWNvbnRhaW5zT25lU29hcEJvZHkoaW5wdXRNdWx0aXBhcnRzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGludmFsaWQgIgotICAgICAgICAgICAgICAgICsgIm1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50IGlzIGluIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSB3c2RsOm91dHB1dCBjb250YWlucyBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFvdXRwdXRNdWx0aXBhcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG11bHRpcGFydHNGb3VuZCA9IHRydWU7Ci0KLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBub3QgZXhhY3RseSBvbmUgbWltZTpwYXJ0IGVsZW1lbnQgY29udGFpbmluZwotICAgICAgICAgIC8vIGEgc29hcGJpbmQ6Ym9keSBjaGlsZCwgdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIWNvbnRhaW5zT25lU29hcEJvZHkob3V0cHV0TXVsdGlwYXJ0cykpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBpbnZhbGlkICIKLSAgICAgICAgICAgICAgICArICJtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudCBpcyBpbiB0aGUgd3NkbDpvdXRwdXQgb2YgdGhlIFwiIgotICAgICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLSAgICAgIC8vIElmIHRoZSBiaW5kaW5nIGNvbnRhaW5zIG5vIG9uZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudCwKLSAgICAgIC8vIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghbXVsdGlwYXJ0c0ZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogTG9va3MgZm9yIG1pbWU6cGFydCBlbGVtZW50cyBjb250YWluaW5nIGEgc29hcDpib2R5IGNoaWxkCi0gICAqIGZvciBlYWNoIG9mIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LgotICAgKiBAcGFyYW0gbXVsdGlwYXJ0cyBhIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgbWltZTpwYXJ0IGNvbnRhaW5pbmcgYSBzb2FwOmJvZHkKLSAgICogY2hpbGQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc09uZVNvYXBCb2R5KExpc3QgbXVsdGlwYXJ0cykKLSAgewotICAgIC8vIEEgdmFyaWFibGUgaW5kaWNhdGVzIHRoYXQgYSBzb2FwOmJvZHkgZWxlbWVudCBpcyBmb3VuZAotICAgIGJvb2xlYW4gc29hcEJvZHlGb3VuZCA9IGZhbHNlOwotCi0gICAgLy8gR29pbmcgdGhyb3VnaCBhIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdWx0aXBhcnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBsaXN0IG9mIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgTGlzdCBtaW1lUGFydHMgPQotICAgICAgICAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBtdWx0aXBhcnRzLmdldChpKSkuZ2V0TUlNRVBhcnRzKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgewotICAgICAgICAvLyBHZXR0aW5nIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIG9mIGEgbWltZTpwYXJ0Ci0gICAgICAgIExpc3QgZXh0RWxlbXMgPQotICAgICAgICAgICgoTUlNRVBhcnQpIG1pbWVQYXJ0cy5nZXQoaikpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZXh0RWxlbXMuc2l6ZSgpOyBrKyspCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBJZiBhbiBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgYSBzb2FwOmJvZHkKLSAgICAgICAgICBpZiAoKChFeHRlbnNpYmlsaXR5RWxlbWVudClleHRFbGVtcy5nZXQoaykpCi0gICAgICAgICAgICAuZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9TT0FQX0JPRFkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIGEgc29hcDpib2R5IGVsZW1lbnQgd2FzIGFscmVhZHkgZm91bmQsCi0gICAgICAgICAgICAvLyByZXR1cm4gdHJ1ZQotICAgICAgICAgICAgaWYgKHNvYXBCb2R5Rm91bmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGVsc2Ugc2V0IHRoZSB2YXJpYWJsZSB0byB0aGUgdHJ1ZSB2YWx1ZQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzb2FwQm9keUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc29hcEJvZHlGb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgdGhhdCBjYW4gY29udGFpbiBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGdldE1pbWVNdWx0aXBhcnRFbGVtZW50cyhMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgTGlzdCBtaW1lTXVsdGlwYXJ0RWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRFbGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgZXh0RWxlbXMuZ2V0KGkpOwotICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGRpbmcgdGhlIGVsZW1lbnQgdG8gdGhlIGxpc3QgYmVpbmcgcmV0dXJuZWQKLSAgICAgICAgICBtaW1lTXVsdGlwYXJ0RWxlbWVudHMuYWRkKGV4dEVsZW0pOwotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIG1pbWU6cGFydCBlbGVtZW50cyBvZiB0aGUgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgICAgTGlzdCBtaW1lUGFydHMgPSAoKE1JTUVNdWx0aXBhcnRSZWxhdGVkKSBleHRFbGVtKS5nZXRNSU1FUGFydHMoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzCi0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtaW1lUGFydHMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50cyBvZiB0aGlzIG1pbWU6cGFydAotICAgICAgICAgICAgTGlzdCBlbGVtcyA9IGdldE1pbWVNdWx0aXBhcnRFbGVtZW50cygKLSAgICAgICAgICAgICAgKChNSU1FUGFydCkgbWltZVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50cyB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgICAgbWltZU11bHRpcGFydEVsZW1lbnRzLmFkZEFsbChlbGVtcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVNdWx0aXBhcnRFbGVtZW50czsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTMwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjkzMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTczNGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTMwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjkzMAotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmc8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QSB3c2RsOmZhdWx0IGVsZW1lbnQgaW4gYSBkZXNjcmlwdGlvbiBkb2VzIG5vdCBoYXZlCi0gKiBtaW1lOm11bHRpcGFydFJlbGF0ZWQgZWxlbWVudCBhcyBpdHMgY2hpbGQgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTMwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTMwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgLy8gd3NkbDpmYXVsdCBlbGVtZW50Ci0gICAgICBib29sZWFuIGZhdWx0c0ZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDpmYXVsdCBlbGVtZW50cwotICAgICAgICBDb2xsZWN0aW9uIGZhdWx0cyA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0ZhdWx0cygpLnZhbHVlcygpOwotICAgICAgICBpZiAoIWZhdWx0cy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBmYXVsdHNGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCBlbGVtZW50LAotICAgICAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKGNvbnRhaW5zTWltZU11bHRpcGFydHMoZmF1bHRzKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgYmluZGluZyBvcGVyYXRpb24gaXMgXCIiCi0gICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIGJpbmRpbmcgZG9lcyBub3QgY29udGFpbiB3c2RsOmZhdWx0IGVsZW1lbnRzLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFmYXVsdHNGb3VuZCkKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb24gYW5hZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgIGFmZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB3c2RsOmZhdWx0IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gZmF1bHRzIGEgY29sbGVjdGlvbiBvZiB3c2RsOmZhdWx0IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IHdzZGw6ZmF1bHQgaGFzIGEgbWltZTptdWx0aXBhcnRSZWxhdGVkIGNoaWxkCi0gICAqIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc01pbWVNdWx0aXBhcnRzKENvbGxlY3Rpb24gZmF1bHRzKQotICB7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIHdzZGw6ZmF1bHRTCi0gICAgSXRlcmF0b3IgaSA9IGZhdWx0cy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIHdzZGw6ZmF1bHQncyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICBMaXN0IGV4dEVsZW1zID0gKChCaW5kaW5nRmF1bHQpIGkubmV4dCgpKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0RWxlbXMuc2l6ZSgpOyBqKyspCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnQsIHJldHVybiB0cnVlCi0gICAgICAgIGlmICgoKEV4dGVuc2liaWxpdHlFbGVtZW50KWV4dEVsZW1zLmdldChqKSkKLSAgICAgICAgICAuZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBUaGVyZSBhcmUgbm8gbWltZTptdWx0aXBhcnRSZWxhdGVkIGVsZW1lbnRzLCByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0MC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5NDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5MmExZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuZHYuWFNTaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueHMuWFNNb2RlbEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTT2JqZWN0TGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU1BhcnRpY2xlOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTVGVybTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU1R5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQVAyOTQwCi0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5JbiBhIGRlc2NyaXB0aW9uLCBhIHdzZGw6cGFydCBkZWZpbmVkIHdpdGggdGhlCi0gKiByZWY6c3dhUmVmIHNjaGVtYSB0eXBlIGlzIGJvdW5kIHRvIGEgc29hcGJpbmQ6Ym9keSwgb3IgYSBzb2FwYmluZDpoZWFkZXIKLSAqIGluIGEgTUlNRSBiaW5kaW5nLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDI5NDAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBBUDI5NDAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQSB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyB3c2RsOnBvcnRUeXBlIHJlZmVyZW5jZXMgYXQgbGVhc3Qgb25lCi0gICAgICAvLyB3c2RsOnBhcnQgZGVmaW5lZCB3aXRoIHRoZSByZWY6c3dhUmVmIHNjaGVtYSB0eXBlCi0gICAgICBib29sZWFuIHN3YVJlZkZvdW5kID0gZmFsc2U7Ci0KLSAgICAgIC8vIEdldHRpbmcgYSB3c2RsOmJpbmRpbmcKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgICAvLyBHZXR0aW5nIGl0cyB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgTGlzdCBvcHMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0KLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIG9wZXJhdGlvbiBlbGVtZW50cwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IChCaW5kaW5nT3BlcmF0aW9uKSBvcHMuZ2V0KGkpOwotCi0gICAgICAgIC8vIEdldHRpbmcgd3NkbDppbnB1dCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudHMgb2YgYW4gb3BlcmF0aW9uCi0gICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLQotICAgICAgICBJbnB1dCBwb3J0VHlwZUlucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpOwotICAgICAgICBPdXRwdXQgcG9ydFR5cGVPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldE91dHB1dCgpOwotICAgICAgICAvLyBJZiB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGV4aXN0cyBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgIC8vIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgaWYgKHBvcnRUeXBlSW5wdXQgIT0gbnVsbCAmJiBwb3J0VHlwZUlucHV0LmdldE1lc3NhZ2UoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1lc3NhZ2UncyBwYXJ0cyBkZWZpbmVkIHdpdGggcmVmOnN3YVJlZgotICAgICAgICAgIExpc3Qgc3dhUmVmUGFydHMgPSBnZXRTd2FSZWZQYXJ0cyhwb3J0VHlwZUlucHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgaWYgKCFzd2FSZWZQYXJ0cy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3dhUmVmRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgLy8gR2V0dGluZyBhIHdzZGw6cGFydCB0aGF0IGlzIHVuYm91bmQKLSAgICAgICAgICAgIFN0cmluZyB1bmJvdW5kUGFydCA9IGdldFVuYm91bmRQYXJ0KHN3YVJlZlBhcnRzLAotICAgICAgICAgICAgICBwb3J0VHlwZUlucHV0LmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICBiaW5kaW5nSW5wdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gSWYgc3VjaCB3c2RsOnBhcnQgZXhpc3RzLCBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgICBpZiAodW5ib3VuZFBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBwYXJ0IFwiIiArIHVuYm91bmRQYXJ0Ci0gICAgICAgICAgICAgICAgKyAiXCIgaXMgbm90IGJvdW5kIHByb3Blcmx5IHRvIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6b3V0cHV0IGV4aXN0cyBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgIC8vIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgaWYgKHBvcnRUeXBlT3V0cHV0ICE9IG51bGwgJiYgcG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWVzc2FnZSdzIHBhcnRzIGRlZmluZWQgd2l0aCByZWY6c3dhUmVmCi0gICAgICAgICAgTGlzdCBzd2FSZWZQYXJ0cyA9IGdldFN3YVJlZlBhcnRzKHBvcnRUeXBlT3V0cHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgaWYgKCFzd2FSZWZQYXJ0cy5pc0VtcHR5KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3dhUmVmRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgLy8gR2V0dGluZyBhIHdzZGw6cGFydCB0aGF0IGlzIHVuYm91bmQKLSAgICAgICAgICAgIFN0cmluZyB1bmJvdW5kUGFydCA9IGdldFVuYm91bmRQYXJ0KHN3YVJlZlBhcnRzLAotICAgICAgICAgICAgICBwb3J0VHlwZU91dHB1dC5nZXRNZXNzYWdlKCkuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgYmluZGluZ091dHB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gSWYgc3VjaCB3c2RsOnBhcnQgZXhpc3RzLCBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgICBpZiAodW5ib3VuZFBhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBwYXJ0IFwiIiArIHVuYm91bmRQYXJ0Ci0gICAgICAgICAgICAgICAgKyAiXCIgaXMgbm90IGJvdW5kIHByb3Blcmx5IHRvIHRoZSB3c2RsOmlucHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGJpbmRpbmcgb3BlcmF0aW9uLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyB3c2RsOnBhcnRTIGRlZmluZWQgd2l0aCB0aGUgcmVmOnN3YVJlZgotICAgICAgLy8gc2NoZW1hIHR5cGUsIHRoZSBhc3NlcnRpb24gaXMgbm90IGFwcGxpY2FibGUKLSAgICAgIGlmICghc3dhUmVmRm91bmQpCi0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uIGFuYWUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFzc2VydGlvbkZhaWxFeGNlcHRpb24gYWZlKQotICAgIHsKLSAgICAgIC8vIFRoZSBhc3NlcnRpb24gaXMgInJlY29tbWVuZGVkIiwgdXNpbmcgdGhlICJ3YXJuaW5nIiByZXN1bHQKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBMb29rcyBmb3IgYSB3c2RsOnBhcnQgdGhhdCBpcyBub3QgYm91bmQgdG8gZWl0aGVyIHNvYXA6Ym9keSBvciBzb2FwOmhlYWRlcgotICAgKiBpbiBhIE1JTUUgYmluZGluZy4KLSAgICogQHBhcmFtIHN3YVJlZlBhcnRzIGEgbGlzdCBvZiB3c2RsOnBhcnQgbmFtZXMgdGhhdCBhcmUgZGVmaW5lZCB3aXRoIHRoZQotICAgKiByZWY6c3dhUmVmIHNjaGVtYSB0eXBlLgotICAgKiBAcGFyYW0gbWVzc2FnZU5hbWUgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSB3c2RsOm1lc3NhZ2UgYmVpbmcgdmFsaWRhdGVkLgotICAgKiBAcGFyYW0gZXh0RWxlbXMgYSBsaXN0IG9mIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgb2YgZWl0aGVyIHdzZGw6aW5wdXQgb3IKLSAgICogd3NkbDpvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gYSB3c2RsOnBhcnQgbmFtZSB0aGF0IGlzIG5vdCBib3VuZCBwcm9wZXJseSwgb3IgbnVsbC4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldFVuYm91bmRQYXJ0KExpc3Qgc3dhUmVmUGFydHMsIFFOYW1lIG1lc3NhZ2VOYW1lLCBMaXN0IGV4dEVsZW1zKSB7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCB3c2RsOnBhcnQgbmFtZXMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN3YVJlZlBhcnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBwYXJ0ID0gKFN0cmluZykgc3dhUmVmUGFydHMuZ2V0KGkpOwotICAgICAgYm9vbGVhbiBib3VuZFByb3Blcmx5ID0gZmFsc2U7Ci0gICAgICBpZiAoZXh0RWxlbXMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXh0RWxlbXMuc2l6ZSgpICYmICFib3VuZFByb3Blcmx5OyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtcy5nZXQoaik7Ci0gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgICAgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBmaXJzdCBtaW1lOnBhcnQgZWxlbWVudCB3aGVyZSBzb2FwOmJvZHkKLSAgICAgICAgICAgIC8vIGFuZCBzb2FwOmhlYWRlciBjb3VsZCBhcHBlYXIKLSAgICAgICAgICAgIGlmIChtaW1lUGFydHMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTGlzdCBlbGVtcyA9ICgoTUlNRVBhcnQpIG1pbWVQYXJ0cy5nZXQoMCkpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgTUlNRSBwYXJ0J3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGVsZW1zLnNpemUoKTsgayArKykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsZW1zLmdldChrKTsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGF0IGlzIGEgc29hcDpib2R5Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9TT0FQX0JPRFkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIExpc3QgcHRzID0gKChTT0FQQm9keSkgZWxlbSkuZ2V0UGFydHMoKTsKLSAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYXJ0IGlzIGJvdW5kIGJ5IHRoaXMgZWxlbWVudAotICAgICAgICAgICAgICAgICAgaWYgKHB0cyA9PSBudWxsIHx8IHB0cy5jb250YWlucyhwYXJ0KSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm91bmRQcm9wZXJseSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBlbHNlIGlmIHRoYXQgaXMgYSBzb2FwOmhlYWRlcgotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9TT0FQX0hFQURFUikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBTT0FQSGVhZGVyKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTT0FQSGVhZGVyIGhlYWRlciA9IChTT0FQSGVhZGVyKSBlbGVtOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFydCBpcyBib3VuZCBieSB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VOYW1lLmVxdWFscyhoZWFkZXIuZ2V0TWVzc2FnZSgpKQotICAgICAgICAgICAgICAgICAgICAgICYmIGhlYWRlci5nZXRQYXJ0KCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICYmIGhlYWRlci5nZXRQYXJ0KCkuZXF1YWxzKHBhcnQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgYm91bmRQcm9wZXJseSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIC8vIFdTREw0SiAxLjQgZG9lcyBub3QgcmVjb2duaXplIHNvYXA6aGVhZGVyIGVsZW1lbnRzIHRoYXQKLSAgICAgICAgICAgICAgICAgIC8vIGFyZSBlbmNsb3NlZCBpbiBtaW1lOm11bHRpcGFydFJlbGF0ZWQsIHNvIHVzaW5nIGEgd29ya2Fyb3VuZAotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhlYWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsZW0pLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBoZWFkZXIgcmVmZXJlbmNlcyB0aGUgY29ycmVzcG9uZGluZyBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgcGFydCBpcyBib3VuZCBieSB0aGlzIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZXNNZXNzYWdlKGhlYWRlciwgbWVzc2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgJiYgaGVhZGVyLmdldEF0dHJpYnV0ZSgicGFydCIpLmVxdWFscyhwYXJ0KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGJvdW5kUHJvcGVybHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBJZiB0aGlzIHBhcnQgaXMgdW5ib3VuZCBwcm9wZXJseSwgcmV0dXJuIGl0Ci0gICAgICBpZiAoIWJvdW5kUHJvcGVybHkpCi0gICAgICAgIHJldHVybiBwYXJ0OwotICAgIH0KLSAgICAvLyBBbGwgdGhlIHBhcnRzIGFyZSBib3VuZCBwcm9wZXJseSwgcmV0dXJuIG51bGwKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBlbGVtZW50IGNvbnRhaW5zIGEgbWVzc2FnZSBhdHRyaWJ1dGUgdGhhdCByZWZlcmVuY2VzCi0gICAqIGEgbWVzc2FnZSB0aGF0IGhhdmUgdGhlIHF1YWxpZmllZCBuYW1lIHNwZWNpZmllZC4KLSAgICogQHBhcmFtIGVsZW0gYW4gZWxlbWVudCB0byBiZSB2YWxpZGF0ZWQuCi0gICAqIEBwYXJhbSBtZXNzYWdlTmFtZSB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gZWxlbWVudCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlZmVyZW5jZXNNZXNzYWdlKEVsZW1lbnQgZWxlbSwgUU5hbWUgbWVzc2FnZU5hbWUpCi0gIHsKLSAgICAvLyBHZXR0aW5nIHRoZSBlbGVtZW50J3MgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICBTdHJpbmcgbWVzc2FnZSA9IGVsZW0uZ2V0QXR0cmlidXRlKCJtZXNzYWdlIik7Ci0gICAgLy8gZmluZGluZyB0aGUgY29sb24gZGVsaW1pdGVyCi0gICAgaW50IGNvbG9uUG9zID0gbWVzc2FnZS5pbmRleE9mKCI6Iik7Ci0gICAgU3RyaW5nIG5zID0gbnVsbDsKLSAgICAvLyBHZXR0aW5nIGEgbG9jYWwgcGFydAotICAgIFN0cmluZyBscCA9IGNvbG9uUG9zID4gLTEgPyBtZXNzYWdlLnN1YnN0cmluZyhjb2xvblBvcyArIDEpIDogbWVzc2FnZTsKLSAgICAvLyBJZiB0aGUgZGVsaW1pdGVyIGlzIGZvdW5kCi0gICAgaWYgKGNvbG9uUG9zID4gLTEpCi0gICAgewotICAgICAgLy8gUmV0cmlldmluZyBhIG5hbWVzcGFjZSBVUkkKLSAgICAgIG5zID0gdmFsaWRhdG9yLndzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpCi0gICAgICAgIC5nZXROYW1lc3BhY2UobWVzc2FnZS5zdWJzdHJpbmcoMCwgY29sb25Qb3MpKTsKLSAgICB9Ci0gICAgLy8gSWYgdGhlIGxvY2FsIHBhcnQgYW5kIHRoZSBuYW1lc3BhY2UgVVJJIGFyZSB0aGUgc2FtZSBhcyBhIG1lc3NhZ2UgaGF2ZQotICAgIGlmIChtZXNzYWdlTmFtZS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMobHApCi0gICAgICAmJiBtZXNzYWdlTmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMobnMpKQotICAgIHsKLSAgICAgIC8vIGVsZW1lbnQgaXMgdmFsaWQsIHJldHVybiB0cnVlCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgLy8gZWxlbWVudCBpcyBub3QgdmFsaWQsIHJldHVybiBmYWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgdGhlIHdzZGw6cGFydCBkZWZpbmVkIHdpdGggdGhlIHJlZjpzd2FSZWYgc2NoZW1hIHR5cGUuCi0gICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZSBjb250YWluaWcgd3NkbDpwYXJ0IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB3c2RsOnBhcnQgbmFtZXMuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0U3dhUmVmUGFydHMoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgTGlzdCBzd2FSZWZQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIC8vIEdvaW5nIHRocm91Z2ggbWVzc2FnZSdzIHBhcnRzCi0gICAgSXRlcmF0b3IgaXQgPSBtZXNzYWdlLmdldFBhcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpdC5uZXh0KCk7Ci0gICAgICBRTmFtZSByZWY7Ci0gICAgICBzaG9ydCB0eXBlOwotICAgICAgLy8gR2V0dGluZyBlaXRoZXIgcGFydCdzIGVsZW1lbnQgcmVmZXJlbmNlIG9yIHR5cGUgcmVmZXJlbmNlCi0gICAgICBpZiAoKHJlZiA9IHBhcnQuZ2V0VHlwZU5hbWUoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHlwZSA9IFhTQ29uc3RhbnRzLlRZUEVfREVGSU5JVElPTjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKChyZWYgPSBwYXJ0LmdldEVsZW1lbnROYW1lKCkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHR5cGUgPSBYU0NvbnN0YW50cy5FTEVNRU5UX0RFQ0xBUkFUSU9OOwotICAgICAgfQotICAgICAgLy8gVGhlIHBhcnQgZG9lcyBjb25hdGlucyBuZWl0aGVyIGVsZW1lbnQgbm9yIHR5cGUgYXR0cmlidXRlLAotICAgICAgLy8gcHJvY2VlZGluZyB3aXRoIHRoZSBuZXh0IHBhcnQKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAvLyBHZXR0aW5nIGEgbGlzdCBvZiBzY2hlbWFzIGRlZmluZWQKLSAgICAgIE1hcCBzY2hlbWFzID0gdmFsaWRhdG9yLndzZGxEb2N1bWVudC5nZXRTY2hlbWFzKCk7Ci0gICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBzY2hlbWFzCi0gICAgICBJdGVyYXRvciBpdDIgPSBzY2hlbWFzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgWFNNb2RlbCB4c01vZGVsID0gKFhTTW9kZWwpIGl0Mi5uZXh0KCk7Ci0gICAgICAgIFhTVHlwZURlZmluaXRpb24gcGFydFR5cGUgPSBudWxsOwotICAgICAgICAvLyBHZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHBhcnQgdHlwZQotICAgICAgICBpZiAodHlwZSA9PSBYU0NvbnN0YW50cy5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgICAgICB7Ci0gICAgICAgICAgWFNFbGVtZW50RGVjbGFyYXRpb24gZWxlbSA9IHhzTW9kZWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKAotICAgICAgICAgICAgcmVmLmdldExvY2FsUGFydCgpLCByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICAgIGlmIChlbGVtICE9IG51bGwpCi0gICAgICAgICAgICBwYXJ0VHlwZSA9IGVsZW0uZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBwYXJ0VHlwZSA9IHhzTW9kZWwuZ2V0VHlwZURlZmluaXRpb24oCi0gICAgICAgICAgICByZWYuZ2V0TG9jYWxQYXJ0KCksIHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlIHBhcnQgdHlwZSBpcyBkZWZpbmVkIHVzaW5nIHRoZSByZWY6c3dhUmVmIHNjaGVtYSB0eXBlCi0gICAgICAgIGlmIChyZWZlcmVuY2VzU3dhUmVmKHBhcnRUeXBlLCBuZXcgQXJyYXlMaXN0KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQWRkaW5nIHRoZSBwYXJ0J3MgbmFtZSB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgIHN3YVJlZlBhcnRzLmFkZChwYXJ0LmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIHRoZSBsaXN0Ci0gICAgcmV0dXJuIHN3YVJlZlBhcnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHNjaGVtYSB0eXBlIHdoZXRoZXIgaXQgY29udGFpbnMgcmVmOnN3YVJlZiBzaW1wbGUgc2NoZW1hIHR5cGUKLSAgICogb3IgaGFzIGFuIGF0dHJpYnV0ZSBvZiB0aGlzIHNjaGVtYSB0eXBlLgotICAgKiBAcGFyYW0geHNUeXBlIGEgc2NoZW1hIHR5cGUgZGVmaW5pdGlvbiBlbGVtZW50Ci0gICAqIEByZXR1cm4gdHJ1ZSwgaWYgc2NoZW1hIHR5cGUgY29udGFpbnMgcmVmOnN3YVJlZiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlZmVyZW5jZXNTd2FSZWYoWFNUeXBlRGVmaW5pdGlvbiB4c1R5cGUsIExpc3QgdHlwZXMpCi0gIHsKLSAgICBpZiAoKHhzVHlwZSAhPSBudWxsKSAmJiAoIXR5cGVzLmNvbnRhaW5zKHhzVHlwZSkpKQotICAgIHsKLSAgICAgIHR5cGVzLmFkZCh4c1R5cGUpOwotICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbXBsZXggdHlwZQotICAgICAgaWYgKHhzVHlwZS5nZXRUeXBlQ2F0ZWdvcnkoKSA9PSBYU1R5cGVEZWZpbml0aW9uLkNPTVBMRVhfVFlQRSkKLSAgICAgIHsKLSAgICAgICAgWFNDb21wbGV4VHlwZURlZmluaXRpb24geHNDb21wbGV4VHlwZSA9Ci0gICAgICAgICAgKFhTQ29tcGxleFR5cGVEZWZpbml0aW9uKSB4c1R5cGU7Ci0gICAgICAgIC8vIElmIGl0IGNvbnRhaW5zIG1peGVkIGNvbnRleHQKLSAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgY29udGV4dCBjb250YWlucyByZWY6c3dhUmVmCi0gICAgICAgIGlmICh4c0NvbXBsZXhUeXBlLmdldFBhcnRpY2xlKCkgIT0gbnVsbAotICAgICAgICAgICYmIHJlZmVyZW5jZXNTd2FSZWYoeHNDb21wbGV4VHlwZS5nZXRQYXJ0aWNsZSgpLmdldFRlcm0oKSwgdHlwZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgdHlwZSdzIGF0dHJpYnV0ZXMKLSAgICAgICAgWFNPYmplY3RMaXN0IGF0dHJMaXN0ID0geHNDb21wbGV4VHlwZS5nZXRBdHRyaWJ1dGVVc2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFhTQXR0cmlidXRlVXNlIHhzQXR0clVzZSA9IChYU0F0dHJpYnV0ZVVzZSkgYXR0ckxpc3QuaXRlbShpKTsKLSAgICAgICAgICAvLyBJZiBhbiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCB1c2luZyByZWY6c3dhUmVmLCByZXR1cm4gdHJ1ZQotICAgICAgICAgIGlmIChyZWZlcmVuY2VzU3dhUmVmKAotICAgICAgICAgICAgeHNBdHRyVXNlLmdldEF0dHJEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCksIHR5cGVzKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIGVsc2UgaWYgdGhpcyBpcyBhIHNpbXBsZSB0eXBlCi0gICAgICBlbHNlIGlmICh4c1R5cGUuZ2V0VHlwZUNhdGVnb3J5KCkgPT0gWFNUeXBlRGVmaW5pdGlvbi5TSU1QTEVfVFlQRSkKLSAgICAgIHsKLSAgICAgICAgWFNTaW1wbGVUeXBlIHhzU2ltcGxlVHlwZSA9IChYU1NpbXBsZVR5cGUpIHhzVHlwZTsKLSAgICAgICAgLy8gSWYgdGhpcyB0eXBlIGlzIHJlZjpzd2FSZWYsIHJldHVybiB0cnVlCi0gICAgICAgIGlmICh4c1NpbXBsZVR5cGUuZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfU1dBX1JFRikKLSAgICAgICAgICAmJiB4c1NpbXBsZVR5cGUuZ2V0TmFtZSgpLmVxdWFscyhXU0lDb25zdGFudHMuU0NIRU1BX1RZUEVfU1dBX1JFRikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBUaGUgc2NoZW1hIHR5cGUgZG9lcyBub3QgY29udGFpbiBhbnkgZWxlbWVudCBkZWZpbmVkIHdpdGggdGhlIHJlZjpzd2FSZWYKLSAgICAvLyByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIGEgdGVybSB3aGV0aGVyIGl0IGlzIGRlZmluZWQgd2l0aCByZWY6c3dhUmVmLgotICAgKiBAcGFyYW0gdGVybSBhIHRlcm0gdGhhdCBjYW4gYmUgb25lIG9mIGEgbW9kZWwgZ3JvdXAgb3IgYW4KLSAgICogZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICogQHJldHVybiB0cnVlIGlmIGEgdGVybSBpcyBkZWZpbmVkIHdpdGggcmVmOnN3YVJlZiwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlZmVyZW5jZXNTd2FSZWYoWFNUZXJtIHRlcm0sIExpc3QgdHlwZXMpCi0gIHsKLSAgICAvLyBJZiBhIHRlcm0gaXMgYW4gZWxlbWVudCBkZWNsYXJhdGlvbgotICAgIGlmICh0ZXJtLmdldFR5cGUoKSA9PSBYU0NvbnN0YW50cy5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotICAgIHsKLSAgICAgIC8vIElmIGVsZW1lbnQncyB0eXBlIGlzIGRlZmluZWQgd2l0aCB0aGUgcmVmOnN3YVJlZiwgcmV0dXJuIHRydWUKLSAgICAgIGlmIChyZWZlcmVuY2VzU3dhUmVmKAotICAgICAgICAoKFhTRWxlbWVudERlY2xhcmF0aW9uKSB0ZXJtKS5nZXRUeXBlRGVmaW5pdGlvbigpLCB0eXBlcykpCi0gICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGVsc2UgaWYgYSB0ZXJtIGlzIGEgbW9kZWwgZ3JvdXAKLSAgICBlbHNlIGlmKHRlcm0uZ2V0VHlwZSgpID09IFhTQ29uc3RhbnRzLk1PREVMX0dST1VQKQotICAgIHsKLSAgICAgIC8vIEdldHRpbmcgYSBsaXN0IG9mIFBhcnRpY2xlIHNjaGVtYSBjb21wb25lbnRzCi0gICAgICBYU09iamVjdExpc3QgbGlzdCA9ICgoWFNNb2RlbEdyb3VwKSB0ZXJtKS5nZXRQYXJ0aWNsZXMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICAvLyBJZiB0aGUgdGVybSBvZiBhIHBhcnRpY2xlIGlzIGRlZmluZWQgd2l0aCB0aGUgcmVmOnN3YVJlZiwKLSAgICAgICAgLy8gcmV0dXJuIHRydWUKLSAgICAgICAgaWYgKHJlZmVyZW5jZXNTd2FSZWYoKChYU1BhcnRpY2xlKSBsaXN0Lml0ZW0oaSkpLmdldFRlcm0oKSwgdHlwZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5NDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2E3YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5NDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBUDI5NDEKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkEgd3NkbDpiaW5kaW5nIGluIGEgZGVzY3JpcHRpb24gYmluZHMgZXZlcnkgd3NkbDpwYXJ0Ci0gKiBvZiBhIHdzZGw6bWVzc2FnZSBpbiB0aGUgd3NkbDpwb3J0VHlwZSB0byB3aGljaCBpdCByZWZlcnMgdG8gb25lIG9mCi0gKiBzb2FwYmluZDpib2R5LCBzb2FwYmluZDpoZWFkZXIsIHNvYXBiaW5kOmZhdWx0ICwgc29hcGJpbmQ6aGVhZGVyZmF1bHQsCi0gKiBvciBtaW1lOmNvbnRlbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEFQMjk0MSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEFQMjk0MShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgICAgLy8gR2V0dGluZyBpdHMgd3NkbDpvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIExpc3Qgb3BzID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotCi0gICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgb3BzLmdldChpKTsKLSAgICAgICAgSW5wdXQgcG9ydFR5cGVJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgT3V0cHV0IHBvcnRUeXBlT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgLy8gSWYgdGhlIGNvcnJlc3BvbmRpbmcgd3NkbDppbnB1dCBleGlzdHMgaW4gd3NkbDpwb3J0VHlwZQotICAgICAgICAvLyBhbmQgaW5jbHVkZXMgdGhlIG1lc3NhZ2UgYXR0cmlidXRlCi0gICAgICAgIGlmIChwb3J0VHlwZUlucHV0ICE9IG51bGwgJiYgcG9ydFR5cGVJbnB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIGxpc3Qgb2YgYWxsIHRoZSBwYXJ0cyBib3VuZCBieSB3c2RsOmlucHV0J3MgY2hpbGQgZWxlbWVudHMKLSAgICAgICAgICBMaXN0IGlucHV0UGFydHMgPSBnZXRCaW5kaW5nUGFydHMoCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLAotICAgICAgICAgICAgcG9ydFR5cGVJbnB1dC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgIC8vIElmIG5vdCB0cnVlIHRoYXQgYWxsIHRoZSB3c2RsOnBhcnRTIGFyZSBib3VuZCwKLSAgICAgICAgICAvLyB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgICAgIGlmICghaW5wdXRQYXJ0cwotICAgICAgICAgICAgLmNvbnRhaW5zQWxsKHBvcnRUeXBlSW5wdXQuZ2V0TWVzc2FnZSgpLmdldFBhcnRzKCkua2V5U2V0KCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgd3NkbDppbnB1dCBvZiB0aGUgXCIiCi0gICAgICAgICAgICAgICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkgKyAiXCIgYmluZGluZyBvcGVyYXRpb24gZG9lcyBub3QgIgotICAgICAgICAgICAgICArICJiaW5kIGFsbCB0aGUgY29ycmVzcG9uZGluZyB3c2RsOnBhcnRTLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6b3V0cHV0IGV4aXN0cyBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgIC8vIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgaWYgKHBvcnRUeXBlT3V0cHV0ICE9IG51bGwgJiYgcG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBsaXN0IG9mIGFsbCB0aGUgcGFydHMgYm91bmQgYnkgd3NkbDpvdXRwdXQncyBjaGlsZCBlbGVtZW50cwotICAgICAgICAgIExpc3Qgb3V0cHV0UGFydHMgPSBnZXRCaW5kaW5nUGFydHMoCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgIHBvcnRUeXBlT3V0cHV0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgLy8gSWYgbm90IHRydWUgdGhhdCBhbGwgdGhlIHdzZGw6cGFydFMgYXJlIGJvdW5kLAotICAgICAgICAgIC8vIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKCFvdXRwdXRQYXJ0cwotICAgICAgICAgICAgLmNvbnRhaW5zQWxsKHBvcnRUeXBlT3V0cHV0LmdldE1lc3NhZ2UoKS5nZXRQYXJ0cygpLmtleVNldCgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIKLSAgICAgICAgICAgICAgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSArICJcIiBiaW5kaW5nIG9wZXJhdGlvbiBkb2VzIG5vdCAiCi0gICAgICAgICAgICAgICsgImJpbmQgYWxsIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6cGFydFMuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSUYgdGhlcmUgYXJlIHdzZGw6ZmF1bHRTIGluIHRoZSB3c2RsOnBvcnRUeXBlIG9wZXJhdGlvbgotICAgICAgICBpZiAoIWJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0RmF1bHRzKCkuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIHNvYXA6ZmF1bHQgbmFtZXMKLSAgICAgICAgICBMaXN0IGZhdWx0TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgQ29sbGVjdGlvbiBmYXVsdHMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdGYXVsdHMoKS52YWx1ZXMoKTsKLSAgICAgICAgICAvLyBHb2luZyB0aHJvdWdoIGFsbCB0aGUgd3NkbDpmYXVsdFMKLSAgICAgICAgICBJdGVyYXRvciBpdCA9IGZhdWx0cy5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0dGluZyB3c2RsOmZhdWx0J3MgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cwotICAgICAgICAgICAgTGlzdCBleHRFbGVtcyA9ICgoQmluZGluZ0ZhdWx0KSBpdC5uZXh0KCkpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHRFbGVtcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0RWxlbXMuZ2V0KGopKQotICAgICAgICAgICAgICAgIC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfRkFVTFQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmF1bHROYW1lcy5hZGQoKChTT0FQRmF1bHQpZXh0RWxlbXMuZ2V0KGopKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIElmIG5vdCB0cnVlIHRoYXQgYWxsIHRoZSB3c2RsOmZhdWx0UyBhcmUgYm91bmQsCi0gICAgICAgICAgLy8gdGhlIGFzc2VydGlvbiBmYWlsZWQKLSAgICAgICAgICBpZiAoIWZhdWx0TmFtZXMuY29udGFpbnNBbGwoCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLmdldEZhdWx0cygpLmtleVNldCgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJUaGUgYmluZGluZyBvcGVyYXRpb24gXCIiCi0gICAgICAgICAgICAgICAgICArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpICsgIlwiIGRvZXMgbm90ICIKLSAgICAgICAgICAgICAgICAgICsgImJpbmQgYWxsIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6ZmF1bHRTLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBhZmUpCi0gICAgewotICAgICAgLy8gVGhlIGFzc2VydGlvbiBpcyAicmVjb21tZW5kZWQiLCB1c2luZyB0aGUgIndhcm5pbmciIHJlc3VsdAotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICBhZmUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KAotICAgICAgdGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb2xsZWN0cyBhbGwgdGhlIHBhcnRzIGJvdW5kIGJ5IGV4dGVuc2liaWxpdHkgZWxlbWVudHMuCi0gICAqIEBwYXJhbSBleHRFbGVtcyBhIGxpdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgd3NkbDptZXNzYWdlIGVsZW1lbnQgY29ycmVzcG9uZ2luZwotICAgKiB0byB0aGUgZXh0ZW5zaWJpbGl0eSBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIGxpc3Qgb2Ygd3NkbDpwYXJ0IG5hbWVzIGJvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBMaXN0IGdldEJpbmRpbmdQYXJ0cyhMaXN0IGV4dEVsZW1zLCBNZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBMaXN0IHBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChleHRFbGVtcyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEdvaW5nIHRocm91Z2ggdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldChpKTsKLSAgICAgICAgLy8gSWYgdGhhdCBpcyBhIHNvYXA6Ym9keQotICAgICAgICBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfQk9EWSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGRpbmcgYWxsIHRoZSBwYXJ0cyBib3VuZCB0byB0aGUgbGlzdAotICAgICAgICAgIExpc3QgcHRzID0gKChTT0FQQm9keSkgZXh0RWxlbSkuZ2V0UGFydHMoKTsKLSAgICAgICAgICBpZiAocHRzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgcGFydHMuYWRkQWxsKHB0cyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIGVsc2UgdGhlIHBhcnRzIGF0dHJpYnV0ZSBpcyBvbWl0dGVkLAotICAgICAgICAgIC8vIGFsbCBwYXJ0cyBkZWZpbmVkIGJ5IHRoZSBtZXNzYWdlIGFyZSBhc3N1bWVkIHRvIGJlIGluY2x1ZGVkCi0gICAgICAgICAgLy8gaW4gdGhlIFNPQVAgQm9keSBwb3J0aW9uLgotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwYXJ0cy5hZGRBbGwobWVzc2FnZS5nZXRQYXJ0cygpLmtleVNldCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBpZiB0aGF0IGlzIGEgc29hcDpoZWFkZXIKLSAgICAgICAgZWxzZSBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX1NPQVBfSEVBREVSKSkKLSAgICAgICAgewotICAgICAgICAgIExpc3QgaGVhZGVyRmF1bHRzID0gbnVsbDsKLSAgICAgICAgICBpZiAoZXh0RWxlbSBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpCi0gICAgICAgICAgewotICAgICAgICAgICAgU09BUEhlYWRlciBoZWFkZXIgPSAoU09BUEhlYWRlcikgZXh0RWxlbTsKLSAgICAgICAgICAgIC8vIElmIGEgaGVhZGVyIHJlZmVyZW5jZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgIC8vIGFkZGluZyBwYXJ0IG5hbWUgdG8gdGhlIGxpc3QgCi0gICAgICAgICAgICBpZiAobWVzc2FnZS5nZXRRTmFtZSgpLmVxdWFscyhoZWFkZXIuZ2V0TWVzc2FnZSgpKSkKLSAgICAgICAgICAgICAgcGFydHMuYWRkKGhlYWRlci5nZXRQYXJ0KCkpOwotCi0gICAgICAgICAgICBoZWFkZXJGYXVsdHMgPSBoZWFkZXIuZ2V0U09BUEhlYWRlckZhdWx0cygpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBXU0RMNEogMS40IGRvZXMgbm90IHJlY29nbml6ZSBzb2FwOmhlYWRlciBlbGVtZW50cyB0aGF0IGFyZSBlbmNsb3NlZAotICAgICAgICAgIC8vIGluIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZCwgc28gdXNpbmcgYSB3b3JrYXJvdW5kCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgaGVhZGVyID0KLSAgICAgICAgICAgICAgKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW0pLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgIC8vIElmIGEgaGVhZGVyIHJlZmVyZW5jZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWVzc2FnZSwKLSAgICAgICAgICAgIC8vIGFkZGluZyBwYXJ0IG5hbWUgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VzTWVzc2FnZShoZWFkZXIsIG1lc3NhZ2UuZ2V0UU5hbWUoKSkpCi0gICAgICAgICAgICAgIHBhcnRzLmFkZChoZWFkZXIuZ2V0QXR0cmlidXRlKCJwYXJ0IikpOwotICAgICAgICAgICAgLy8gQ29sbGVjdGluZyBzb2FwOmhlYWRlcmZhdWx0IGVsZW1lbnRzIGZvciB0aGUgaGVhZGVyCi0gICAgICAgICAgICBoZWFkZXJGYXVsdHMgPSBnZXRIZWFkZXJGYXVsdHMoaGVhZGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgc29hcDpoZWFkZXJmYXVsdFMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGhlYWRlckZhdWx0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyRmF1bHRzLmdldChqKSBpbnN0YW5jZW9mIFNPQVBIZWFkZXJGYXVsdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU09BUEhlYWRlckZhdWx0IHNoZiA9IChTT0FQSGVhZGVyRmF1bHQpIGhlYWRlckZhdWx0cy5nZXQoaik7Ci0gICAgICAgICAgICAgIC8vIElmIGEgc29hcDpoZWFkZXJmYXVsdCByZWZlcmVuY2VzIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAgIC8vIG1lc3NhZ2UsIGFkZGluZyBwYXJ0IG5hbWUgdG8gdGhlIGxpc3QKLSAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXF1YWxzKHNoZi5nZXRNZXNzYWdlKCkpKQotICAgICAgICAgICAgICAgIHBhcnRzLmFkZChzaGYuZ2V0UGFydCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHRoZSBzYW1lIHdvcmthcm91bmQuLi4KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRWxlbWVudCBzaGYgPSAoRWxlbWVudCkgaGVhZGVyRmF1bHRzLmdldChqKTsKLSAgICAgICAgICAgICAgLy8gSWYgYSBzb2FwOmhlYWRlcmZhdWx0IHJlZmVyZW5jZXMgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgICAgICAgLy8gbWVzc2FnZSwgYWRkaW5nIHBhcnQgbmFtZSB0byB0aGUgbGlzdAotICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlc01lc3NhZ2Uoc2hmLCBtZXNzYWdlLmdldFFOYW1lKCkpKQotICAgICAgICAgICAgICAgIHBhcnRzLmFkZChzaGYuZ2V0QXR0cmlidXRlKCJwYXJ0IikpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlbHNlIGlmIHRoYXQgaXMgYSBtaW1lOmNvbnRlbnQKLSAgICAgICAgZWxzZSBpZiAoZXh0RWxlbS5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0RMX01JTUVfQ09OVEVOVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBhZGRpbmcgcGFydCBuYW1lIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgcGFydHMuYWRkKCgoTUlNRUNvbnRlbnQpIGV4dEVsZW0pLmdldFBhcnQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZSBpZiB0aGF0IGlzIGEgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgIGVsc2UgaWYgKGV4dEVsZW0uZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoV1NETF9NSU1FX01VTFRJUEFSVCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXR0aW5nIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMgb2YgdGhlIG1pbWU6bXVsdGlwYXJ0UmVsYXRlZAotICAgICAgICAgIExpc3QgbWltZVBhcnRzID0gKChNSU1FTXVsdGlwYXJ0UmVsYXRlZCkgZXh0RWxlbSkuZ2V0TUlNRVBhcnRzKCk7Ci0gICAgICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIG1pbWU6cGFydCBlbGVtZW50cwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWltZVBhcnRzLnNpemUoKTsgaisrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSB2YWx1ZXMgb2YgcGFydCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAvLyBvZiBtaW1lOnBhcnQncyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgICAgICAgICBwYXJ0cy5hZGRBbGwoZ2V0QmluZGluZ1BhcnRzKAotICAgICAgICAgICAgICAoKE1JTUVQYXJ0KSBtaW1lUGFydHMuZ2V0KGopKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgbWVzc2FnZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFydHM7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gZWxlbWVudCBjb250YWlucyBhIG1lc3NhZ2UgYXR0cmlidXRlIHRoYXQgcmVmZXJlbmNlcwotICAgKiBhIG1lc3NhZ2UgdGhhdCBoYXZlIHRoZSBxdWFsaWZpZWQgbmFtZSBzcGVjaWZpZWQuCi0gICAqIEBwYXJhbSBlbGVtIGFuIGVsZW1lbnQgdG8gYmUgdmFsaWRhdGVkLgotICAgKiBAcGFyYW0gbWVzc2FnZU5hbWUgdGhlIHF1YWxpZmllZCBuYW1lIG9mIGEgbWVzc2FnZS4KLSAgICogQHJldHVybiB0cnVlIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZWZlcmVuY2VzTWVzc2FnZShFbGVtZW50IGVsZW0sIFFOYW1lIG1lc3NhZ2VOYW1lKQotICB7Ci0gICAgLy8gR2V0dGluZyB0aGUgZWxlbWVudCdzIG1lc3NhZ2UgYXR0cmlidXRlCi0gICAgU3RyaW5nIG1lc3NhZ2UgPSBlbGVtLmdldEF0dHJpYnV0ZSgibWVzc2FnZSIpOwotICAgIC8vIGZpbmRpbmcgdGhlIGNvbG9uIGRlbGltaXRlcgotICAgIGludCBjb2xvblBvcyA9IG1lc3NhZ2UuaW5kZXhPZigiOiIpOwotICAgIFN0cmluZyBucyA9IG51bGw7Ci0gICAgLy8gR2V0dGluZyBhIGxvY2FsIHBhcnQKLSAgICBTdHJpbmcgbHAgPSBjb2xvblBvcyA+IC0xID8gbWVzc2FnZS5zdWJzdHJpbmcoY29sb25Qb3MgKyAxKSA6IG1lc3NhZ2U7Ci0gICAgLy8gSWYgdGhlIGRlbGltaXRlciBpcyBmb3VuZAotICAgIGlmIChjb2xvblBvcyA+IC0xKQotICAgIHsKLSAgICAgIC8vIFJldHJpZXZpbmcgYSBuYW1lc3BhY2UgVVJJCi0gICAgICBucyA9IHZhbGlkYXRvci53c2RsRG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKQotICAgICAgICAuZ2V0TmFtZXNwYWNlKG1lc3NhZ2Uuc3Vic3RyaW5nKDAsIGNvbG9uUG9zKSk7Ci0gICAgfQotICAgIC8vIElmIHRoZSBsb2NhbCBwYXJ0IGFuZCB0aGUgbmFtZXNwYWNlIFVSSSBhcmUgdGhlIHNhbWUgYXMgYSBtZXNzYWdlIGhhdmUKLSAgICBpZiAobWVzc2FnZU5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKGxwKQotICAgICAgJiYgbWVzc2FnZU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5zKSkKLSAgICB7Ci0gICAgICAvLyBlbGVtZW50IGlzIHZhbGlkLCByZXR1cm4gdHJ1ZQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIC8vIGVsZW1lbnQgaXMgbm90IHZhbGlkLCByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYWxsIHRoZSBlbGVtZW50J3MgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHNvYXA6aGVhZGVyZmF1bHQgdHlwZS4KLSAgICogQHBhcmFtIGVsZW1lbnQgYW4gZWxlbWVudCB0aGF0IGNhbiBoYXZlIHNvYXA6aGVhZGVyZmF1bHQgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc29hcDpoZWFkZXJmYXVsdCBlbGVtZW50cyBmb3VuZC4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRIZWFkZXJGYXVsdHMoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTGlzdCBoZWFkZXJGYXVsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBmaXJzdCBoZWFkZXIncyBjaGlsZAotICAgICAgRWxlbWVudCBjaGlsZCA9IFhNTFV0aWxzLmdldEZpcnN0Q2hpbGQoZWxlbWVudCk7Ci0gICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIHNvYXA6aGVhZGVyZmF1bHQKLSAgICAgICAgaWYgKGNoaWxkLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0RMX1NPQVBfSEVBREVSRkFVTFQuZ2V0TmFtZXNwYWNlVVJJKCkpCi0gICAgICAgICAgJiYgY2hpbGQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKFdTRExfU09BUF9IRUFERVJGQVVMVC5nZXRMb2NhbFBhcnQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBBZGRpbmcgdGhlIGNoaWxkIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgaGVhZGVyRmF1bHRzLmFkZChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gR2V0dGluZyB0aGUgbmV4dCBoZWFkZXIncyBjaGlsZAotICAgICAgICBjaGlsZCA9IFhNTFV0aWxzLmdldE5leHRTaWJsaW5nKGNoaWxkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGhlYWRlckZhdWx0czsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTQ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTkzYTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQVAyOTQ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLS8qKgotICogQVAyOTQ0Ci0gKgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZzwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5JbiBhIERFU0NSSVBUSU9OLCBpZiBhIHdzZGw6cGFydCBlbGVtZW50IHJlZmVycyB0byBhCi0gKiBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbiAodmlhIHRoZSBlbGVtZW50IGF0dHJpYnV0ZSBvZiB0aGUgd3NkbDpwYXJ0IGVsZW1lbnQpCi0gKiB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBhdHRyaWJ1dGUgb2YgYSBtaW1lOmNvbnRlbnQgZWxlbWVudCB0aGF0IGJpbmRzIHRoYXQgcGFydAotICogaXMgYSBjb250ZW50IHR5cGUgc3VpdGFibGUgZm9yIGNhcnJ5aW5nIGFuIFhNTCBzZXJpYWxpemF0aW9uLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBUDI5NDQgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAvLyB0aGF0IGJpbmQgd3NkbDpwYXJ0UyBkZWZpbmVkIHdpdGggdGhlIGVsZW1lbnQgYXR0cmlidXRlCi0gIHByaXZhdGUgYm9vbGVhbiBtaW1lQ29udGVudEZvdW5kOwotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTQ0KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIFJlc2V0dGluZyB0aGUgdmFyaWFibGUKLSAgICBtaW1lQ29udGVudEZvdW5kID0gZmFsc2U7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIGEgd3NkbDpiaW5kaW5nCi0gICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgICAgLy8gR2V0dGluZyBpdHMgd3NkbDpvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIExpc3Qgb3BzID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotCi0gICAgICAvLyBHb2luZyB0aHJvdWdoIHRoZSBvcGVyYXRpb24gZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BzLnNpemUoKTsgaSsrKQotICAgICAgewotICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbikgb3BzLmdldChpKTsKLQotICAgICAgICAvLyBHZXR0aW5nIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3V0cHV0IGVsZW1lbnRzIG9mIGFuIG9wZXJhdGlvbgotICAgICAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgQmluZGluZ091dHB1dCBiaW5kaW5nT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nT3V0cHV0KCk7Ci0KLSAgICAgICAgLy8gQ29sbGVjdGluZyBhbGwgdGhlIG1pbWU6Y29udGVudCBlbGVtZW50cyBmcm9tIHdzZGw6aW5wdXQgYW5kIHdzZGw6b3V0cHV0Ci0gICAgICAgIExpc3QgaW5wdXRNaW1lQ29udGVudHMgPSBnZXRNaW1lQ29udGVudEVsZW1lbnRzKAotICAgICAgICAgIGJpbmRpbmdJbnB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0gICAgICAgIExpc3Qgb3V0cHV0TWltZUNvbnRlbnRzID0gZ2V0TWltZUNvbnRlbnRFbGVtZW50cygKLSAgICAgICAgICBiaW5kaW5nT3V0cHV0ID09IG51bGwgPyBudWxsIDogYmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6aW5wdXQgY29udGFpbnMgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgICAgIGlmICghaW5wdXRNaW1lQ29udGVudHMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgSW5wdXQgcG9ydFR5cGVJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGUgY29ycmVzcG9uZGluZyB3c2RsOmlucHV0IGV4aXN0cyBpbiB3c2RsOnBvcnRUeXBlCi0gICAgICAgICAgLy8gYW5kIGluY2x1ZGVzIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZQotICAgICAgICAgIGlmIChwb3J0VHlwZUlucHV0ICE9IG51bGwgJiYgcG9ydFR5cGVJbnB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBpbnZhbGlkIG1pbWU6Y29udGVudCBlbGVtZW50Ci0gICAgICAgICAgICBNSU1FQ29udGVudCBpbWMgPSBnZXRJbnZhbGlkTWltZUNvbnRlbnQoCi0gICAgICAgICAgICAgICAgaW5wdXRNaW1lQ29udGVudHMsIHBvcnRUeXBlSW5wdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGlmIChpbWMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudCBpbiAiCi0gICAgICAgICAgICAgICAgKyAidGhlIHdzZGw6aW5wdXQgb2YgdGhlIFwiIiArIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiXCIgdGhhdCBiaW5kcyB0aGUgXCIiICsgaW1jLmdldFBhcnQoKQotICAgICAgICAgICAgICAgICsgIlwiIHdzZGw6cGFydCB1c2VzIHRoZSBpbnZhbGlkIGNvbnRlbnQgdHlwZSBcIiIKLSAgICAgICAgICAgICAgICArIGltYy5nZXRUeXBlKCkgKyAiXCIuICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZSB3c2RsOm91dHB1dCBjb250YWlucyBtaW1lOmNvbnRlbnQgZWxlbWVudHMKLSAgICAgICAgaWYgKCFvdXRwdXRNaW1lQ29udGVudHMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgT3V0cHV0IHBvcnRUeXBlT3V0cHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKS5nZXRPdXRwdXQoKTsKLSAgICAgICAgICAvLyBJZiB0aGUgY29ycmVzcG9uZGluZyB3c2RsOm91dHB1dCBleGlzdHMgaW4gd3NkbDpwb3J0VHlwZQotICAgICAgICAgIC8vIGFuZCBpbmNsdWRlcyB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLSAgICAgICAgICBpZiAocG9ydFR5cGVPdXRwdXQgIT0gbnVsbCAmJiBwb3J0VHlwZU91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBpbnZhbGlkIG1pbWU6Y29udGVudCBlbGVtZW50Ci0gICAgICAgICAgICBNSU1FQ29udGVudCBpbWMgPSBnZXRJbnZhbGlkTWltZUNvbnRlbnQoCi0gICAgICAgICAgICAgIG91dHB1dE1pbWVDb250ZW50cywgcG9ydFR5cGVPdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIGlmIChpbWMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudCBpbiAiCi0gICAgICAgICAgICAgICAgKyAidGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIlwiIHRoYXQgYmluZHMgdGhlIFwiIiArIGltYy5nZXRQYXJ0KCkKLSAgICAgICAgICAgICAgICArICJcIiB3c2RsOnBhcnQgdXNlcyB0aGUgaW52YWxpZCBjb250ZW50IHR5cGUgXCIiCi0gICAgICAgICAgICAgICAgKyBpbWMuZ2V0VHlwZSgpICsgIlwiLiAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIElmIG1pbWU6Y29udGVudCBlbGVtZW50cyBhcmUgbm90IGZvdW5kLAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKCFtaW1lQ29udGVudEZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgYW55IG1pbWU6Y29udGVudCBlbGVtZW50IGJpbmRzIHdzZGw6cGFydCB0aGF0IGlzIGRlZmluZWQKLSAgICogd2l0aCB0aGUgZWxlbWVudCBhdHRyaWJ1dGUgYW5kIHVzZXMgdGhlIGNvbnRlbnQgdHlwZSAidGV4dC94bWwiLgotICAgKiBAcGFyYW0gbWltZUNvbnRlbnRzIGEgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMgb2YgYmluZGluZyBvcGVyYXRpb24uCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBjb3JyZXNwb25kaW5nIHdzZGw6bWVzc2FnZSBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgbWltZTpjb250ZW50IGVsZW1lbnQgdGhhdCB1c2VzIGEgY29udGVudCB0eXBlIG90aGVyIHRoYW4KLSAgICogInRleHQveG1sIiwgbnVsbCBpZiBubyBvbmUgc3VjaCBlbGVtZW50IGlzIGZvdW5kLgotICAgKi8KLSAgcHJpdmF0ZSBNSU1FQ29udGVudCBnZXRJbnZhbGlkTWltZUNvbnRlbnQoTGlzdCBtaW1lQ29udGVudHMsIE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIC8vIEdvaW5nIHRocm91Z2ggYSBsaXN0IG9mIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWltZUNvbnRlbnRzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIE1JTUVDb250ZW50IG1pbWVDb250ZW50ID0gKE1JTUVDb250ZW50KSBtaW1lQ29udGVudHMuZ2V0KGkpOwotICAgICAgLy8gR2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyB3c2RsOnBhcnQKLSAgICAgIFBhcnQgcGFydCA9IG1lc3NhZ2UuZ2V0UGFydChtaW1lQ29udGVudC5nZXRQYXJ0KCkpOwotICAgICAgLy8gSWYgdGhlIHBhcnQgaXMgZGVmaW5lZCB3aXRoIHRoZSBlbGVtZW50IGF0dHJpYnV0ZQotICAgICAgaWYgKHBhcnQgIT0gbnVsbCAmJiBwYXJ0LmdldEVsZW1lbnROYW1lKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbWltZUNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgIC8vIElmIHRoZSB0eXBlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBvdGhlciB0aGFuICJ0ZXh0L3htbCIKLSAgICAgICAgaWYgKCFXU0lDb25zdGFudHMuQ09OVEVOVF9UWVBFX1RFWFRfWE1MLmVxdWFscyhtaW1lQ29udGVudC5nZXRUeXBlKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gcmV0dXJuIHRoZSBpbnZhbGlkIGVsZW1lbnQKLSAgICAgICAgICByZXR1cm4gbWltZUNvbnRlbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYWxsIG1pbWU6Y29udGVudCBlbGVtZW50cy4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXQgY2FuIGNvbnRhaW4gbWltZTpjb250ZW50Uy4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0TWltZUNvbnRlbnRFbGVtZW50cyhMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgTGlzdCBtaW1lQ29udGVudEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKGV4dEVsZW1zICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldChpKTsKLSAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9NVUxUSVBBUlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1pbWVQYXJ0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIG9mIHRoaXMgbWltZTpwYXJ0Ci0gICAgICAgICAgICBMaXN0IGVsZW1zID0gZ2V0TWltZUNvbnRlbnRFbGVtZW50cygKLSAgICAgICAgICAgICAgKChNSU1FUGFydCkgbWltZVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50cyB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgICAgbWltZUNvbnRlbnRFbGVtZW50cy5hZGRBbGwoZWxlbXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBFbHNlIGlmIHRoZSBlbGVtZW50IGlzIG1pbWU6Y29udGVudAotICAgICAgICBlbHNlIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9DT05URU5UKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEFkZGluZyB0aGUgZWxlbWVudCB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgIG1pbWVDb250ZW50RWxlbWVudHMuYWRkKGV4dEVsZW0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVDb250ZW50RWxlbWVudHM7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0Ni5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9BUDI5NDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1NTczOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0FQMjk0Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVDb250ZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVNdWx0aXBhcnRSZWxhdGVkOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLk1JTUVQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0vKioKLSAqIEFQMjk0NgotICoKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgIHdpdGggYXQgbGVhc3Qgb25lIG1pbWU6Y29udGVudCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkluIGEgREVTQ1JJUFRJT04sIGEgbWltZTpjb250ZW50IGVsZW1lbnQKLSAqIGluY2x1ZGVzIHRoZSBwYXJ0IGF0dHJpYnV0ZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQVAyOTQ2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQVAyOTQ2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgYSBiaW5kaW5nIGNvbnRhaW5zIGF0IGxlYXN0IG9uZQotICAgICAgLy8gbWltZTpjb250ZW50IGVsZW1lbnQKLSAgICAgIGJvb2xlYW4gbWltZUNvbnRlbnRzRm91bmQgPSBmYWxzZTsKLQotICAgICAgLy8gR2V0dGluZyBhIHdzZGw6YmluZGluZwotICAgICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAgIC8vIEdldHRpbmcgaXRzIHdzZGw6b3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBMaXN0IG9wcyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKLQotICAgICAgLy8gR29pbmcgdGhyb3VnaCB0aGUgb3BlcmF0aW9uIGVsZW1lbnRzCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wcy5nZXQoaSk7Ci0KLSAgICAgICAgLy8gR2V0dGluZyB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dCBlbGVtZW50cyBvZiBhbiBvcGVyYXRpb24KLSAgICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpOwotCi0gICAgICAgIC8vIENvbGxlY3RpbmcgYWxsIHRoZSBtaW1lOmNvbnRlbnQgZWxlbWVudHMgZnJvbSB3c2RsOmlucHV0IGFuZCB3c2RsOm91dHB1dAotICAgICAgICBMaXN0IGlucHV0TWltZUNvbnRlbnRzID0gZ2V0TWltZUNvbnRlbnRFbGVtZW50cygKLSAgICAgICAgICBiaW5kaW5nSW5wdXQgPT0gbnVsbCA/IG51bGwgOiBiaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICBMaXN0IG91dHB1dE1pbWVDb250ZW50cyA9IGdldE1pbWVDb250ZW50RWxlbWVudHMoCi0gICAgICAgICAgYmluZGluZ091dHB1dCA9PSBudWxsID8gbnVsbCA6IGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotCi0gICAgICAgIC8vIElmIHRoZSB3c2RsOmlucHV0IGNvbnRhaW5zIG1pbWU6Y29udGVudCBlbGVtZW50cwotICAgICAgICBpZiAoIWlucHV0TWltZUNvbnRlbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG1pbWVDb250ZW50c0ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6Y29udGVudCB0aGF0IGRvZXMgbm90IGluY2x1ZGUKLSAgICAgICAgICAvLyB0aGUgcGFydCBhdHRyaWJ1dGUsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKGhhc0ludmFsaWRNaW1lQ29udGVudChpbnB1dE1pbWVDb250ZW50cykpCi0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiVGhlIGludmFsaWQgbWltZTpjb250ZW50IGVsZW1lbnQiCi0gICAgICAgICAgICAgICsgIiBpcyBpbiB0aGUgd3NkbDppbnB1dCBvZiB0aGUgXCIiICsgYmluZGluZ09wZXJhdGlvbi5nZXROYW1lKCkKLSAgICAgICAgICAgICAgKyAiXCIgYmluZGluZyBvcGVyYXRpb24uIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgd3NkbDpvdXRwdXQgY29udGFpbnMgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgICAgIGlmICghb3V0cHV0TWltZUNvbnRlbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIG1pbWVDb250ZW50c0ZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG1pbWU6Y29udGVudCB0aGF0IGRvZXMgbm90IGluY2x1ZGUKLSAgICAgICAgICAvLyB0aGUgcGFydCBhdHRyaWJ1dGUsIHRoZSBhc3NlcnRpb24gZmFpbGVkCi0gICAgICAgICAgaWYgKGhhc0ludmFsaWRNaW1lQ29udGVudChvdXRwdXRNaW1lQ29udGVudHMpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oIlRoZSBpbnZhbGlkIG1pbWU6Y29udGVudCBlbGVtZW50IgotICAgICAgICAgICAgICArICIgaXMgaW4gdGhlIHdzZGw6b3V0cHV0IG9mIHRoZSBcIiIgKyBiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKQotICAgICAgICAgICAgICArICJcIiBiaW5kaW5nIG9wZXJhdGlvbi4iKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGUgYmluZGluZyBjb250YWlucyBubyBtaW1lOmNvbnRlbnQgZWxlbWVudHMsCi0gICAgICAvLyB0aGUgYXNzZXJ0aW9uIGlzIG5vdCBhcHBsaWNhYmxlCi0gICAgICBpZiAoIW1pbWVDb250ZW50c0ZvdW5kKQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGFmZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgYWZlLmdldE1lc3NhZ2UoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYWxsIG1pbWU6Y29udGVudCBlbGVtZW50cy4KLSAgICogQHBhcmFtIGV4dEVsZW1zIGEgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIHRoYXQgY2FuIGNvbnRhaW4gbWltZTpjb250ZW50Uy4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBtaW1lOmNvbnRlbnQgZWxlbWVudHMgZm91bmQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0TWltZUNvbnRlbnRFbGVtZW50cyhMaXN0IGV4dEVsZW1zKQotICB7Ci0gICAgTGlzdCBtaW1lQ29udGVudEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgaWYgKGV4dEVsZW1zICE9IG51bGwpCi0gICAgewotICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIGV4dGVuc2liaWxpdHkgZWxlbWVudHMKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbXMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW0gPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldChpKTsKLSAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbWltZTptdWx0aXBhcnRSZWxhdGVkCi0gICAgICAgIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9NVUxUSVBBUlQpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gR2V0dGluZyB0aGUgbWltZTpwYXJ0IGVsZW1lbnRzIG9mIHRoZSBtaW1lOm11bHRpcGFydFJlbGF0ZWQKLSAgICAgICAgICBMaXN0IG1pbWVQYXJ0cyA9ICgoTUlNRU11bHRpcGFydFJlbGF0ZWQpIGV4dEVsZW0pLmdldE1JTUVQYXJ0cygpOwotICAgICAgICAgIC8vIEdvaW5nIHRocm91Z2ggYWxsIHRoZSBtaW1lOnBhcnQgZWxlbWVudHMKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1pbWVQYXJ0cy5zaXplKCk7IGorKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb2xsZWN0aW5nIGFsbCB0aGUgbWltZTpjb250ZW50IGVsZW1lbnRzIG9mIHRoaXMgbWltZTpwYXJ0Ci0gICAgICAgICAgICBMaXN0IGVsZW1zID0gZ2V0TWltZUNvbnRlbnRFbGVtZW50cygKLSAgICAgICAgICAgICAgKChNSU1FUGFydCkgbWltZVBhcnRzLmdldChqKSkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkpOwotICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBlbGVtZW50cyB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgICAgbWltZUNvbnRlbnRFbGVtZW50cy5hZGRBbGwoZWxlbXMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBFbHNlIGlmIHRoZSBlbGVtZW50IGlzIG1pbWU6Y29udGVudAotICAgICAgICBlbHNlIGlmIChleHRFbGVtLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKFdTRExfTUlNRV9DT05URU5UKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEFkZGluZyB0aGUgZWxlbWVudCB0byB0aGUgbGlzdCBiZWluZyByZXR1cm5lZAotICAgICAgICAgIG1pbWVDb250ZW50RWxlbWVudHMuYWRkKGV4dEVsZW0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1pbWVDb250ZW50RWxlbWVudHM7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGVzIG1pbWU6Y29udGVudCBlbGVtZW50cy4KLSAgICogQHBhcmFtIG1pbWVDb250ZW50cyBhIGxpc3Qgb2YgbWltZTpjb250ZW50IGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG1pbWU6Y29udGVudCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwYXJ0IGF0dHJpYnV0ZSwKLSAgICogZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaGFzSW52YWxpZE1pbWVDb250ZW50KExpc3QgbWltZUNvbnRlbnRzKQotICB7Ci0gICAgLy8gR29pbmcgdGhyb3VnaCBhIGxpc3Qgb2YgbWltZTpjb250ZW50IGVsZW1lbnRzCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW1lQ29udGVudHMuc2l6ZSgpOyBpKyspCi0gICAgewotICAgICAgLy8gSWYgYSBtaW1lOmNvbnRlbnQgZG9lcyBub3QgaW5jbHVkZSB0aGUgcGFydCBhdHRyaWJ1dGUsIHJldHVybiB0cnVlCi0gICAgICBpZiAoKChNSU1FQ29udGVudCkgbWltZUNvbnRlbnRzLmdldChpKSkuZ2V0UGFydCgpID09IG51bGwpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvLyBUaGVyZSBhcmUgbm8gaW52YWxpZCBtaW1lOmNvbnRlbnRTLCByZXR1cm4gZmFsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1MTkzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSogQlAyMDEwLgotKiAiTmFtZSIgYXR0cmlidXRlcyBvZiBPcGVyYXRpb25zIGFyZSB1bmlxdWUgYWNyb3NzIHRoZSB3c2RsOnBvcnRUeXBlIGRlZmluaXRpb24gCi0qCi0qIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSogQGF1dGhvciBWaXRhbGkgRmVkb3NlbmtvCi0qKi8KLXB1YmxpYyBjbGFzcyBCUDIwMTAgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMTAoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBHZXQgdGhlIHBvcnRUeXBlIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIENoZWNrIHRoZSBvcGVyYXRpb25zIG5hbWVzIGZvciB1bmlxdWVuZXNzIHdpdGhpbiB0aGUgY2FuZGlkYXRlIFBvcnQgVHlwZSBpbiB0aGUgV1NETCAKLSAgICBJdGVyYXRvciBvcHM7Ci0gICAgSGFzaFNldCBuYW1lc1NlZW4gPSBuZXcgSGFzaFNldCgpOwotICAgIEhhc2hTZXQgZHVwbGljYXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgTGlzdCBvcHNMaXN0ID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpOwotICAgICAgaWYgKG9wc0xpc3QgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgLy8gbm8gb3BlcmF0aW9ucyBmb3VuZCBpbiBwb3J0VHlwZQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvcHMgPSBvcHNMaXN0Lml0ZXJhdG9yKCk7IC8vIHdpbGwgdXNlIENhbmRpZGF0ZS5nZXRPcGVyYXRpb25zKCkKLSAgICAgICAgd2hpbGUgKG9wcy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcHMubmV4dCgpOwotICAgICAgICAgIFN0cmluZyBvcE5hbWUgPSBvcC5nZXROYW1lKCk7Ci0gICAgICAgICAgaWYgKG5hbWVzU2Vlbi5jb250YWlucyhvcE5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKG9wTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc1NlZW4uYWRkKG9wTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZHVwbGljYXRlcy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBmYWlsSW5mbyA9Ci0gICAgICAgICAgbmV3IFN0cmluZ0J1ZmZlcigKLSAgICAgICAgICAgICJEdXBsaWNhdGUgb3BlcmF0aW9uIG5hbWVzIGluIHBvcnRUeXBlICIKLSAgICAgICAgICAgICAgKyBwb3J0VHlwZS5nZXRRTmFtZSgpCi0gICAgICAgICAgICAgICsgIjogIik7Ci0gICAgICAgIEl0ZXJhdG9yIGkgPSBkdXBsaWNhdGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGZhaWxJbmZvLmFwcGVuZCgoU3RyaW5nKSBpLm5leHQoKSArICI7ICIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKGZhaWxJbmZvLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkKLSAgICB7IC8vID8/IG5vIG9wZXJhdGlvbnMgZm91bmQsIGJ1dCBkb2VzIG5vdCBmYWlsIHRoZSBhc3NlcnRpb24uCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCwgcG9ydFR5cGUpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDExLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UxNWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQlAyMDExLgotICogVGhlIGltcG9ydGVkIFhNTCBzY2hlbWEgaXMgYSB3ZWxsLWZvcm1lZCBYTUwgMS4wIGRvY3VtZW50IGFuZCBpZiBpdCBjb250YWlucyBhbiAKLSAqIFhNTCBkZWNsYXJhdGlvbiwgaXQgaXMgdmVyc2lvbiAxLjAuIAotICoKLSAqIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSAqIEBhdXRob3IgVml0YWxpIEZlZG9zZW5rbwotKiovCi1wdWJsaWMgY2xhc3MgQlAyMDExIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDExKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gT01NSVRFRF9YTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyA9Ci0gICAgbmV3IGNoYXJbXSB7IDB4MjAsIDB4OSwgMHhELCAweEEsICdcJycsICdcIicgfTsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMgPSBuZXcgY2hhcltdIHsgJz0nIH07Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFZFUlNJT05fVE9LRU4gPSAidmVyc2lvbiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMS4wIjsKLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICAgIC8vRGVmaW5pdGlvbiBkZWYgPSAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIExpc3QgZXh0cyA9IG51bGw7Ci0gICAgLy9pZiAoZGVmLmdldFR5cGVzKCkhPW51bGwpCi0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgZXh0cyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIH0KLSAgICBpZiAoZXh0cyAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoKGRlZmluaXRpb24gPQotICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXREZWZpbml0aW9uKHR5cGVzKSkKLSAgICAgICAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgdHlwZXMgZGVmaW5pdGlvbiBpbiBhbnkgV1NETCBkb2N1bWVudC4iKTsKLSAgICAgIH0KLQotICAgICAgSXRlcmF0b3IgaXQgPSBleHRzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlbCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgICAgc2VhcmNoRm9yU2NoZW1hKCgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbCkuZ2V0RWxlbWVudCgpLAotICAgICAgICAgICAgICBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9IC8qZWxzZQotICAgICAgICAgCQkJcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ki8KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKiBTZWFyY2ggeHNkIHNjaGVtYSBvciB4c2QgaW1wb3J0IGZyb20gbm9kZS4gSWYgbm9kZSBpcyB4c2QgaW1wb3J0IGl0J3MgbG9hZGluZyBzY2hlbWEuCi0gICAqIEBwYXJhbSBuIC0gVW5rbm93bkV4dGVuY2liaWxpdHlFbGVtZW50Ci0gICovCi0gIHByaXZhdGUgdm9pZCBzZWFyY2hGb3JTY2hlbWEoTm9kZSBuLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gc2VhcmNoZXMgZm9yIHhzZDppbXBvcnQgZWxlbWVudAotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgeHNkOnNjaGVtYSBlbGVtZW50IGlzIGZvdW5kIC0+IHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgICBwcm9jZXNzU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgLy8gaWYgeHNkOmltcG9ydCBlbGVtZW50IGlzIGZvdW5kIC0+IGxvYWQgc2NoZW1hIGFuZCBwcm9jZXNzIHNjaGVtYQotICAgICAgICAgIC8vIEZJWEVEOiBpZiB4c2Q6aW1wb3J0IGlzIGZvdW5kIGFuZCBwYXJlbnQgZWxlbWVudCBpcyB4c2Q6c2NoZW1hCi0gICAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpCi0gICAgICAgICAgICAmJiBYTUxVdGlscy5lcXVhbHMobi5nZXRQYXJlbnROb2RlKCksIEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgICAgICBsb2FkU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8vIGVsc2UgaXRlcmF0ZSBlbGVtZW50IHJlY3Vyc2l2ZWx5Ci0gICAgICAgICAgICBzZWFyY2hGb3JTY2hlbWEobi5nZXRGaXJzdENoaWxkKCksIGNvbnRleHQpOwotICAgICAgfQotICAgICAgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBJdCBsb2FkcyB4c2Qgc2NoZW1hIGFuZCB0aGVuIGNoZWNrIHRoZSB2ZXJzaW9uIDEuMCBhbmQgbG9va2luZyBmb3IgeHNkOnNjaGVtYSBlbGVtZW50IGZvciBuZXh0IHByb2Nlc3MuCi0gICAqIEBwYXJhbSBpbXBvcnROb2RlIHhzZCBzY2hlbWEKLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIGxvYWRTY2hlbWEoTm9kZSBpbXBvcnROb2RlLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIEVsZW1lbnQgaW0gPSAoRWxlbWVudCkgaW1wb3J0Tm9kZTsKLSAgICBBdHRyIHNjaGVtYUxvY2F0aW9uID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9TQ0hFTUFMT0NBVElPTik7Ci0gICAgLy8gdHJ5IHRvIHBhcnNlIGltcG9ydGVkIFhTRAotICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgYW55IGVycm9yIG9yIHJvb3QgZWxlbWVudCBpcyBub3QgWFNEIHNjaGVtYSAtPiBlcnJvcgotICAgICAgICBTdHJpbmcgZGVjbCA9Ci0gICAgICAgICAgcmVhZFhNTERlY2xhcmF0aW9uU3RhdGVtZW50KHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpOwotICAgICAgICBpZiAoIXZhbGlkVmVyc2lvbihkZWNsKSkKLSAgICAgICAgewotICAgICAgICAgIEF0dHIgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfTkFNRVNQQUNFKTsKLSAgICAgICAgICBlcnJvcnMuYWRkKChhICE9IG51bGwpID8gYS5nZXRWYWx1ZSgpIDogIiIpOwotICAgICAgICB9Ci0gICAgICAgIERvY3VtZW50IHNjaGVtYSA9Ci0gICAgICAgICAgdmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY29udGV4dCk7Ci0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMoc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICB7Ci0gICAgICAgICAgQXR0ciBhID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9OQU1FU1BBQ0UpOwotICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiOwotICAgICAgICAgIHByb2Nlc3NTY2hlbWEoc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLAotICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlVVJMU3RyaW5nKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gZWxzZSBpZiB0aGVyZSBpcyBvbmx5IHRoZSBuYW1lc3BhY2UgYXR0cmlidXRlLCB0aGUgaW1wb3J0IHJlbGF0ZXMgdG8gaW5saW5lIHNjaGVtYQotICAgIGVsc2UgaWYgKFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfTkFNRVNQQUNFKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqIFJlYWRzIGFuIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuCi0gICogQHBhcmFtIGxvY2F0aW9uCi0gICogQHJldHVybiBTdHJpbmcKLSAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVhZFhNTERlY2xhcmF0aW9uU3RhdGVtZW50KFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIGJhc2VVUkkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIC8vIG5vdGhpbmcKLSAgICAgIGludCBpID0gYmFzZVVSSS5sYXN0SW5kZXhPZignLycpOwotICAgICAgaW50IGogPSBiYXNlVVJJLmxhc3RJbmRleE9mKCdcXCcpOwotICAgICAgaWYgKGogPiBpKQotICAgICAgICBpID0gajsKLSAgICAgIGxvY2F0aW9uID0gYmFzZVVSSS5zdWJzdHJpbmcoMCwgaSArIDEpICsgbG9jYXRpb247Ci0gICAgfQotCi0gICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgdXJsID0gbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2Ugc2hvdWxkIHRyeSB0byBhY2Nlc3MgbG9jYXRpb24gYXMgZmlsZQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHVybCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvY2F0aW9uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgY2hhckNvZGU7Ci0gICAgICAgIGJvb2xlYW4gZW5kID0gZmFsc2U7Ci0gICAgICAgIGlmIChyZWFkZXIucmVhZHkoKSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXJDb2RlID0gcmVhZGVyLnJlYWQoKTsKLQotICAgICAgICAgIHdoaWxlIChyZWFkZXIucmVhZHkoKSAmJiAhKGNoYXJDb2RlID09ICc8JykpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hhckNvZGUgPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgaWYgKGNoYXJDb2RlID09ICc8JykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKSBjaGFyQ29kZSk7Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyLnJlYWR5KCkgJiYgIWVuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2hhckNvZGUgPSByZWFkZXIucmVhZCgpOwotICAgICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKSBjaGFyQ29kZSk7Ci0KLSAgICAgICAgICAgICAgZW5kID0gY2hhckNvZGUgPT0gJz4nOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gTk9URTogVGhpcyByZXN1bHQgZG9lcyBub3QgZ2V0IHByb3BvZ2F0ZWQgYmFjayEKLSAgICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPQotICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdGhlIFhNTCBkZWNsYXJhdGlvbiBzdGF0ZW1lbnQuIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICByZXN1bHQgPSBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgZmluYWxseQotICAgICAgewotICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogQHBhcmFtIHhtbERlY2wgLSB4bWwgZGVjbGFyYXRpb24KLSAgICogQHJldHVybiBpZiB4bWwgZGVjbGFyYXRpb24gY29udGFpbnMgdmVyc2lvbj0iMS4wIiBpdCByZXRpcm5zIHRydWUuIAotICAqLwotICBwcml2YXRlIGJvb2xlYW4gdmFsaWRWZXJzaW9uKFN0cmluZyB4bWxEZWNsKQotICB7Ci0gICAgLy9ib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBpZiAoeG1sRGVjbCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9Ci0gICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgT01NSVRFRF9YTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUywKLSAgICAgICAgICBYTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyk7Ci0gICAgICBFbnVtZXJhdGlvbiB0b2tlbnMgPSBzdC5wYXJzZSh4bWxEZWNsKTsKLSAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgIHdoaWxlICh0b2tlbnMuaGFzTW9yZUVsZW1lbnRzKCkgJiYgIWZvdW5kKQotICAgICAgewotICAgICAgICBTdHJpbmcgdG9rZW4gPSAoU3RyaW5nKSB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShWRVJTSU9OX1RPS0VOKSkKLSAgICAgICAgewotICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLQotICAgICAgICAgIHRva2Vucy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZyB2ZXIgPSAoU3RyaW5nKSB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgIHJlc3VsdCA9IFZFUlNJT04uZXF1YWxzKHZlcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogSXQncyBsb2tpbmcgZm9yIHhzZCBpbXBvcnQgYW5kIGxvYWQgaXQgaWYgZmluZC4KLSAgICogQHBhcmFtIHNjaGVtYSB4c2Qgc2NoZW1hCi0gICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzU2NoZW1hKE5vZGUgc2NoZW1hLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIE5vZGUgbiA9IHNjaGVtYS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpCi0gICAgICAgICYmIFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICBsb2FkU2NoZW1hKG4sIGNvbnRleHQpOwotCi0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDEyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMzYzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDEyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsLldTRExWYWxpZGF0b3JJbXBsLkJpbmRpbmdNYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAgKiBCUDIwMTIuCi0gICogRXhhbXBsZToKLSAgKiAKLSAgKiA8bWVzc2FnZSBuYW1lPSJnZXRDb25maWd1cmF0aW9uT3B0aW9uc1JlcXVlc3QiPgotICAqIAk8cGFydCBuYW1lPSJyZWZyZXNoIiBlbGVtZW50PSJjZmc6cmVmcmVzaCIgLz4gCi0gICogPC9tZXNzYWdlPgotICAqIDxwb3J0VHlwZSBuYW1lPSJDb25maWd1cmF0b3JQb3J0VHlwZSI+Ci0gICogCTxvcGVyYXRpb24gbmFtZT0iZ2V0Q29uZmlndXJhdGlvbk9wdGlvbnMiPgotICAqIAkJPGlucHV0IG1lc3NhZ2U9InRuczpnZXRDb25maWd1cmF0aW9uT3B0aW9uc1JlcXVlc3QiIC8+IAotICAqIAkJPG91dHB1dCAuLi4uLiAvPiAKLSAgKiAJCTxmYXVsdCAuLi4uLiAvPiAKLSAgKiAJPC9vcGVyYXRpb24+Ci0gICogPC9wb3J0VHlwZT4KLSAgKiA8YmluZGluZyBuYW1lPSJDb25maWd1cmF0b3JCaW5kaW5nIiB0eXBlPSJ0bnM6Q29uZmlndXJhdG9yUG9ydFR5cGUiPgotICAqIAk8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0iZG9jdW1lbnQiIC8+IAotICAqIAk8b3BlcmF0aW9uIG5hbWU9ImdldENvbmZpZ3VyYXRpb25PcHRpb25zIj4KLSAgKgkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly93d3cuenp6LmNvbS96enoud3NkbC9nZXRDb25maWd1cmF0aW9uT3B0aW9ucyIgLz4gCi0gICogCQk8aW5wdXQ+Ci0gICogCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3d3dy56enouY29tL3p6ei53c2RsIiAvPiAKLSAgKiAJCTwvaW5wdXQ+Ci0gICogCQk8b3V0cHV0Pi4uLi4uPC9vdXRwdXQ+Ci0gICoJCTxmYXVsdD4uLi4uLi48L2ZhdWx0PgotICAqIAk8L29wZXJhdGlvbj4KLSAgKiA8L2JpbmRpbmc+Ci0gICogCi0gICogQWJvdmUsIHRoZSB0ZXN0IGZvciB0aGlzIGFzc2VydGlvbiBtaWdodCBiZSB0aGF0IHRoZSBlbGVtZW50IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgaW4gdGhlICJyZWZyZXNoIiAKLSAgKiBwYXJ0IG9mIHRoZSBnZXRDb25maWd1cmF0aW9uT3B0aW9uc1JlcXVlc3QgbWVzc2FnZS4gCi0gICogCi0gICogQ29udGV4dCA6IGZvciA8YmluZGluZz4gIkNvbmZpZ3VyYXRvckJpbmRpbmciLCA8c29hcDpiaW5kaW5nPiBzdHlsZT1kb2N1bWVudDsgPHNvYXA6Ym9keT4gdXNlPWxpdGVyYWwKLSAgKiBmb3IgdGhlIDxpbnB1dD4gb2YgYmluZGluZyBvcGVyYXRpb24gImdldENvbmZpZ3VyYXRpb25PcHRpb25zIi4gCi0gICogKDxpbnB1dD4gaXMgYW4gZXhhbXBsZS4gQ291bGQgYmUgPG91dHB1dD4gb3IgPGZhdWx0PiBlcXVhbGx5KS4KLSAgKiBBY3Rpb246IGNoZWNrIHRoZSBwYXJ0KHMpIG9mIHRoZSBtZXNzYWdlIHNwZWNpZmllZCBpbiB0aGUgPGlucHV0PiBlbGVtZW50IChpbiBleGFtcGxlKSBvZiB0aGUgPHBvcnRUeXBlPiwKLSAgKiBuYW1lbHkgdG5zOmdldENvbmZpZ3VyYXRpb25PcHRpb25zUmVxdWVzdCwgdGhhdCB0aGUgZWxlbWVudCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZQotICAqIDxwYXJ0IG5hbWU9InJlZnJlc2giIGVsZW1lbnQ9ImNmZzpyZWZyZXNoIiAvPiwgc28gdGhlIHRlc3QgcGFzc2VzLgotICAqIEFsbCBzdWNoIHBhcnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzZXJ0aW9uIGNhbmRpZGF0ZSBiaW5kaW5nKHMpIG11c3QgYmUgc2ltaWxhcmx5IGNoZWNrZWQgZm9yIHRoaXMgYXNzZXJ0aW9uCi0gICogdG8gcGFzcy4KLSAgKi8KLXB1YmxpYyBjbGFzcyBCUDIwMTIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMTIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIAotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCBiaW5kaW5nIGZyb20gZW50cnkgY29udGV4dAotCi0gICAgLy8gT2xlZydzICYgR3JhaGFtJ3MgdmVyc2lvbjoKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIHRvIHVzZSBvcmlnaW5hbCB2ZXJzaW9uIHJlcXVpcmUgYSBiaW5kaW5nIGFycmF5Ci0gICAgLy9CaW5kaW5nW10gYmluZGluZyA9IHsoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKX07Ci0KLSAgICAvLyBnZXQgbGlzdCBvZiBjYW5kaWRhdGUgbWF0Y2hlcwotICAgIEJpbmRpbmdNYXRjaFtdIGJpbmRpbmdNYXRjaCA9Ci0gICAgICB0aGlzLnZhbGlkYXRvci5nZXRCaW5kaW5nTWF0Y2hlcygKLSAgICAgICAgYmluZGluZywKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQywKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpOwotICAgIGlmIChiaW5kaW5nTWF0Y2gubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmICghdGhpcy52YWxpZGF0b3IuY2hlY2tQYXJ0QXR0cmlidXRlcyhiaW5kaW5nTWF0Y2gsICJ1c2VJbnB1dCIsICJ1c2VFbGVtZW50IikKLSAgICAgICAgICB8fCAhdGhpcy52YWxpZGF0b3IuY2hlY2tQYXJ0QXR0cmlidXRlcyhiaW5kaW5nTWF0Y2gsICJ1c2VPdXRwdXQiLCAidXNlRWxlbWVudCIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oImRpYWdub3N0aWM6IGludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IhIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQsIGJpbmRpbmcpOwotICAgICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5M2EzNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbC5XU0RMVmFsaWRhdG9ySW1wbC5CaW5kaW5nTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBCUDIwMTMuCi0gKiBUaGUgYmluZGluZyAoaW4gc29hcGJpbmQ6Ym9keSBlbGVtZW50cykgb25seSByZWZlcnMgdG8gcGFydCBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIHVzaW5nIHRoZSAidHlwZSIgYXR0cmlidXRlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSAqIEBhdXRob3IgVml0YWxpIEZlZG9zZW5rbwotICovCi1wdWJsaWMgY2xhc3MgQlAyMDEzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDEzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCBiaW5kaW5nIGZyb20gZW50cnkgY29udGV4dAotCi0gICAgLy8gT2xlZydzICYgR3JhaGFtJ3MgdmVyc2lvbjoKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIHRvIHVzZSBvcmlnaW5hbCB2ZXJzaW9uIHJlcXVpcmUgYSBiaW5kaW5nIGFycmF5Ci0gICAgLy9CaW5kaW5nW10gYmluZGluZyA9IHsoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKX07Ci0KLSAgICAvLyBnZXQgbGlzdCBvZiBjYW5kaWRhdGUgbWF0Y2hlcwotICAgIEJpbmRpbmdNYXRjaFtdIGJpbmRpbmdNYXRjaCA9Ci0gICAgICB0aGlzLnZhbGlkYXRvci5nZXRCaW5kaW5nTWF0Y2hlcygKLSAgICAgICAgYmluZGluZywKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQywKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpOwotICAgIGlmIChiaW5kaW5nTWF0Y2gubGVuZ3RoID09IDApCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmICghdGhpcy52YWxpZGF0b3IuY2hlY2tQYXJ0QXR0cmlidXRlcyhiaW5kaW5nTWF0Y2gsICJ1c2VJbnB1dCIsICJ1c2VUeXBlIikKLSAgICAgICAgICB8fCAhdGhpcy52YWxpZGF0b3IuY2hlY2tQYXJ0QXR0cmlidXRlcyhiaW5kaW5nTWF0Y2gsICJ1c2VPdXRwdXQiLCAidXNlVHlwZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oImRpYWdub3N0aWM6IGludGVybmFsIHByb2Nlc3NpbmcgZXJyb3IhIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGUuZ2V0TWVzc2FnZSgpLCBlbnRyeUNvbnRleHQsIGJpbmRpbmcpOwotICAgICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMTA4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIwMTQuCi0gKiBDb250ZXh0OgotICogRm9yIGEgY2FuZGlkYXRlIHdzZGw6b3BlcmF0aW9uLCBpZiByZWZlcnJlZCB0byBieSBhIGNhbmRpZGF0ZSBycGMtbGl0ZXJhbCB3c2RsOmJpbmRpbmcgZWxlbWVudAotICogSWYgdGhlIHBhcmFtZXRlck9yZGVyIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCBpdCBvbWl0cyBhdCBtb3N0IDEgcGFydCBmcm9tIG91dHB1dCB3c2RsOm1lc3NhZ2UuCi0gKiovCi1wdWJsaWMgY2xhc3MgQlAyMDE0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjAxNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qCi0gICAqIEBwYXJhbSBiaW5kaW5nIC0gYmluZGluZwotICAgKiBAcmV0dXJuIEl0IHJldHVybnMgc3R5bGUgb2Ygc29hcCBiaW5kaW5nIG9mIGJpbmRpbmcuIElmIHN0eWxlIG9taXR0ZWQgcmV0dXJucyAiZG9jdW1lbnQiIHN0eWxlLiAgIAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0U09BUEJpbmRpbmdTdHlsZShCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPSBudWxsOwotICAgIExpc3QgbGlzdCA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChsaXN0LmdldChpKSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQotICAgICAgewotICAgICAgICBzdHlsZSA9ICgoU09BUEJpbmRpbmcpIGxpc3QuZ2V0KGkpKS5nZXRTdHlsZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICBzdHlsZSA9IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0M7Ci0gICAgcmV0dXJuIHN0eWxlOwotICB9Ci0KLSAgLyoKLSAgICogQHBhcmFtIGxpc3QgLSBMaXN0IG9mIGV4dGVuY2liaWxpdHkgZWxlbWVudHMgZnJvbSBiaW5kaW5nIG91dHB1dAotICAgKiBAcmV0dXJuIGZpcnN0IHNvYXAgYm9keSBpbiBsaXN0LgotICAgKi8KLSAgcHJpdmF0ZSBTT0FQQm9keSBnZXRTT0FQQm9keShMaXN0IGxpc3QpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCi0gICAgICBpZiAobGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgICAgcmV0dXJuIChTT0FQQm9keSkgbGlzdC5nZXQoaSk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKgotICAgKiBAcGFyYW0gbGlzdCAtIExpc3Qgb2YgZXh0ZW5jaWJpbGl0eSBlbGVtZW50cyBvZiBiaW5kaW5nIG9wZXJhdGlvbgotICAgKiBAcmV0dXJuIEZpcnN0IHNvYXAgb3BlcmF0aW9uIGluIGxpc3QuCi0gICAqLwotICBwcml2YXRlIFNPQVBPcGVyYXRpb24gZ2V0U09BUE9wZXJhdGlvbihMaXN0IGxpc3QpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCi0gICAgICBpZiAobGlzdC5nZXQoaSkgaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgICByZXR1cm4gKFNPQVBPcGVyYXRpb24pIGxpc3QuZ2V0KGkpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgLyogICAgICAgICAgCi0gICAqIEBwYXJhbSBvcGVyIC0gb3BlcmF0aW9uCi0gICAqIEBwYXJhbSBiaW5kaW5nIC0gYmluZGluZwotICAgKiBAcmV0dXJuIGlmIHN0eWxlIG9mIHNvYXAgYmluZGluZyBvZiBiaW5kaW5nIGlzIHJwYyBhbmQgdXNlIG9mIHNvYXAgYm9keSBvZiBiaW5kaW5nIG91dHB1dCBvZiBiaW5kaW5nIG9wZXJhdGlvbiBpcyBsaXRlcmFsIHRoZW4gaXQgcmV0dXJucyB0cnVlLiAKLSAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUnBjTGl0ZXJhbChCaW5kaW5nT3BlcmF0aW9uIG9wZXIsIEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIExpc3QgbGlzdCA9IG9wZXIuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgU09BUE9wZXJhdGlvbiBzb3AgPSBnZXRTT0FQT3BlcmF0aW9uKGxpc3QpOwotICAgIGlmIChzb3AgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgKHNvcC5nZXRTdHlsZSgpID09IG51bGwKLSAgICAgICAgPyBnZXRTT0FQQmluZGluZ1N0eWxlKGJpbmRpbmcpCi0gICAgICAgIDogc29wLmdldFN0eWxlKCkpOwotICAgIGlmICghc3R5bGUuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGxpc3QgPSBvcGVyLmdldEJpbmRpbmdPdXRwdXQoKS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBTT0FQQm9keSBib2R5ID0gZ2V0U09BUEJvZHkobGlzdCk7Ci0gICAgaWYgKGJvZHkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmcgdXNlID0gYm9keS5nZXRVc2UoKTsKLSAgICBpZiAodXNlID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdXNlLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCk7Ci0gIH0KLQotICAvKiBJdCBjaGVja3Mgb3BlcmF0aW9uIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgcGFydCBpbiBwYXJhbWV0ZXIgb3JkZXIgCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE9wZXJhdGlvbiBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIEJpbmRpbmdbXSBiaW5kaW5ncyA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldEJpbmRpbmdzKCk7Ci0gICAgaWYgKG9iai5nZXRQYXJhbWV0ZXJPcmRlcmluZygpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYmluZGluZ3MgPT0gbnVsbCB8fCBvYmogPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChvYmouZ2V0T3V0cHV0KCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChvYmouZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGb3IgZWFjaCBiaW5kaW5nCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBiaW5kaW5nc1tpXS5nZXRCaW5kaW5nT3BlcmF0aW9ucygpOwotICAgICAgLy8gRm9yIGVhY2ggYmluZGluZyBvcGVyYXRpb24KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGlzdC5zaXplKCk7IGorKykKLSAgICAgIHsKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbiBvcGVyID0gKEJpbmRpbmdPcGVyYXRpb24pIGxpc3QuZ2V0KGopOwotCi0gICAgICAgIC8vIElmIHRoZSBpbnB1dCBvcGVyYXRpb24gbmFtZSBhbmQgYmluZGluZyBvcGVyYXRpbm8gbmFtZSBhcmUgbm90IG51bGwKLSAgICAgICAgaWYgKG9iai5nZXROYW1lKCkgIT0gbnVsbCAmJiBvcGVyLmdldE5hbWUoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgdGhlIG9wZXJhdGlvbiBuYW1lcyBhcmUgZXF1YWwKLSAgICAgICAgICBpZiAob2JqLmdldE5hbWUoKS5lcXVhbHMob3Blci5nZXROYW1lKCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBvcGVyYXRpb24gaXMgUlBDIGxpdGVyYWwKLSAgICAgICAgICAgIGlmIChjaGVja1JwY0xpdGVyYWwob3BlciwgYmluZGluZ3NbaV0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFydHMgaW4gdGhlIHBhcmFtZXRlck9yZGVyIGF0dHJpYnV0ZQkJCQkKLSAgICAgICAgICAgICAgTGlzdCBwYXJ0cyA9IG9iai5nZXRQYXJhbWV0ZXJPcmRlcmluZygpOwotCi0gICAgICAgICAgICAgIE91dHB1dCBvdXRwdXQgPSBudWxsOwotICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICAgICAgICBNYXAgbWVzc2FnZVBhcnRzID0gbnVsbDsKLQotICAgICAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFydHMgZm9yIHRoZSBvdXRwdXQgbWVzc2FnZQotICAgICAgICAgICAgICBpZiAoKG91dHB1dCA9IG9iai5nZXRPdXRwdXQoKSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZSA9IG91dHB1dC5nZXRNZXNzYWdlKCkpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcnRzID0gbWVzc2FnZS5nZXRQYXJ0cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBwYXJ0cyBpbiB0aGUgcGFyYW1ldGVyT3JkZXIgYXR0cmlidXRlIAotICAgICAgICAgICAgICAvLyBhbmQgdGhlcmUgYXJlIG91dHB1dCBtZXNzYWdlIHBhcnRzLCB0aGVuIHByb2Nlc3MgYXNzZXJ0aW9uCi0gICAgICAgICAgICAgIGlmIChwYXJ0cyAhPSBudWxsICYmIG1lc3NhZ2VQYXJ0cyAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHBhcnRDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFydE5hbWU7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy8gR2V0IHBhcnQgbmFtZSBmcm9tIHBhcmFtZXRlck9yZGVyIGxpc3QKLSAgICAgICAgICAgICAgICAgIHBhcnROYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgICAvLyBDaGVjayBlYWNoIG91dHB1dCBtZXNzYWdlIHBhcnQgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2gKLSAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlUGFydHMuY29udGFpbnNLZXkocGFydE5hbWUpKQotICAgICAgICAgICAgICAgICAgICBwYXJ0Q291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKHBhcnRDb3VudCA9PSBtZXNzYWdlUGFydHMuc2l6ZSgpKQotICAgICAgICAgICAgICAgICAgfHwgKHBhcnRDb3VudCA9PSBtZXNzYWdlUGFydHMuc2l6ZSgpIC0gMSkpCi0gICAgICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZChvYmouZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgIGN0eC5jYW5jZWxPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwYXJ0cyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdE9wZXJhdGlvbih0cnVlKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChPcGVyYXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgZXJyb3JzLnRvU3RyaW5nKCksCi0gICAgICAgICAgZW50cnlDb250ZXh0LAotICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotICAgIH0KLSAgICAvL2Vsc2UKLSAgICAvLyAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjQ1OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMjAxNy4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmc8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlICJzdHlsZSIgYXR0cmlidXRlIG9mIGVhY2ggb3BlcmF0aW9uIGluIHRoZSBjb250YWluZWQgc29hcDpiaW5kaW5nIGhhcyB0aGUgc2FtZSB2YWx1ZSBvZiAiZG9jdW1lbnQiIG9yICJycGMiLCBmb3IgYWxsIG9wZXJhdGlvbnMgb2YgdGhlIHdzZGw6YmluZGluZy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMDE3IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDE3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vU3RyaW5nIGZpcnN0U3R5bGUgPSBudWxsOyAvLyBHVDogaXMgdGhpcyBuZWVkZWQ/PwotICAgIFZlY3RvciBmYWlsdXJlRGV0YWlsTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIEdldCB0aGUgYmluZGluZyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsTGlzdCk7Ci0gICAgfQotICAgIFNPQVBCaW5kaW5nIHNvYXBCID0gV1NETFZhbGlkYXRvckltcGwuZ2V0U29hcEJpbmRpbmcoYmluZGluZyk7Ci0gICAgaWYgKHNvYXBCID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbExpc3QpOwotICAgIH0KLSAgICBTdHJpbmcgc3R5bGVCID0KLSAgICAgIChzb2FwQi5nZXRTdHlsZSgpID09IG51bGwKLSAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgIDogc29hcEIuZ2V0U3R5bGUoKSk7Ci0KLSAgICAvLyBUcnkgdG8gZ2V0IHRoZSBTT0FQIG9wZXJhdGlvbnMKLSAgICBIYXNoTWFwIHNvYXBPcGVyYXRpb25MaXN0ID0gdmFsaWRhdG9yLmdldFNvYXBPcGVyYXRpb25zKGJpbmRpbmcpOwotCi0gICAgaWYgKHNvYXBPcGVyYXRpb25MaXN0LmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gY2hlY2sgdGhhdCB0aGV5IGFsbCBoYXZlIHRoZSBzYW1lIHN0eWxlIGVsZW1lbnQgdmFsdWUKLSAgICAgIFN0cmluZyBzdHlsZSA9IG51bGw7Ci0gICAgICBTdHJpbmcgY2hlY2tTdHlsZTsKLSAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbjsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc29hcE9wZXJhdGlvbkxpc3Qua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHNvYXBPcGVyYXRpb24gPSAoU09BUE9wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBjaGVja1N0eWxlID0gc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgICAgICBpZiAoY2hlY2tTdHlsZSA9PSBudWxsKQotICAgICAgICAgIGNoZWNrU3R5bGUgPSBzdHlsZUI7Ci0gICAgICAgIGlmIChjaGVja1N0eWxlICE9IG51bGwKLSAgICAgICAgICAmJiAhY2hlY2tTdHlsZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQykKLSAgICAgICAgICAmJiAhY2hlY2tTdHlsZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQykpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsTGlzdC5hZGQoCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAiT3BlcmF0aW9uIE5hbWU6ICIKLSAgICAgICAgICAgICAgICArIHNvYXBPcGVyYXRpb25MaXN0LmdldChzb2FwT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgICsgIlxuU09BUCBPcGVyYXRpb246ICIKLSAgICAgICAgICAgICAgICArIHNvYXBPcGVyYXRpb24udG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0LAotICAgICAgICAgICAgICBzb2FwT3BlcmF0aW9uKSk7Ci0gICAgICAgICAgLy8gUkVNT1ZFOiBOZWVkIHRvIHByb2Nlc3MgYWxsIG9wZXJhdGlvbnMKLSAgICAgICAgICAvL2JyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHlsZSA9IGNoZWNrU3R5bGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0eWxlLmVxdWFscyhjaGVja1N0eWxlKSB8fCAhc3R5bGUuZXF1YWxzKHN0eWxlQikpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsTGlzdC5hZGQoCi0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAiT3BlcmF0aW9uIE5hbWU6ICIKLSAgICAgICAgICAgICAgICArIHNvYXBPcGVyYXRpb25MaXN0LmdldChzb2FwT3BlcmF0aW9uKQotICAgICAgICAgICAgICAgICsgIlxuU09BUCBPcGVyYXRpb246ICIKLSAgICAgICAgICAgICAgICArIHNvYXBPcGVyYXRpb24udG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgZW50cnlDb250ZXh0LAotICAgICAgICAgICAgICBzb2FwT3BlcmF0aW9uKSk7Ci0gICAgICAgICAgLy8gUkVNT1ZFOiBOZWVkIHRvIHByb2Nlc3MgYWxsIG9wZXJhdGlvbnMKLSAgICAgICAgICAvL2JyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzdHlsZSA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBubyBzdHlsZSBhdHRyaWJ1dGUgd2FzIGZvdW5kIGluIHRoZSBTT0FQIG9wZXJhdGlvbihzKSBvZiB0aGUgYmluZGluZy4KLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWxMaXN0KTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ2N2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBCUDIwMTguIAotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIFdlYiBzZXJ2aWNlIGRlZmluaXRpb248L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHdzZGw6dHlwZXMgZWxlbWVudCBvY2N1cnMgZWl0aGVyIGFzIHRoZSBmaXJzdCBjaGlsZCBpbiB0aGUgV1NETCBuYW1lc3BhY2Ugb2YgdGhlIHdzZGw6ZGVmaW5pdGlvbnMgZWxlbWVudCBpZiBubyB3c2RsOmRvY3VtZW50YXRpb24gb3Igd3NkbDppbXBvcnQgZWxlbWVudCBpcyBwcmVzZW50OyBvciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHdzZGw6ZG9jdW1lbnRhdGlvbiBlbGVtZW50KHMpIGlmIHRoZXkgYXJlIHByZXNlbnQgYnV0IHdzZGw6aW1wb3J0KHMpIGFyZSBub3QsIG9yIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBib3RoIHRoZSB3c2RsOmRvY3VtZW50YXRpb24gYW5kIHdzZGw6aW1wb3J0IGVsZW1lbihzKSBpZiBwcmVzZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIwMTggZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMTgoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qCi0gICAqIEBwYXJhbSBlbCAtIHhtbCBlbGVtZW50Ci0gICAqIEByZXR1cm4gaWYgZWxlbWVudCBpcyBleHRlbnNpYmlsaXR5IGVsZW1lbnQgcmV0dXJucyB0cnVlLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRWxlbWVudCBlbCkKLSAgewotICAgIGJvb2xlYW4gaXNFeCA9IHRydWU7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9CSU5ESU5HKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0RFRklOSVRJT05TKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0RPQ1VNRU5UQVRJT04pOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfRkFVTFQpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfSU1QT1JUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0lOUFVUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX01FU1NBR0UpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfT1BFUkFUSU9OKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX09VVFBVVCk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9QQVJUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX1BPUlQpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfUE9SVFRZUEUpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfU0VSVklDRSk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9UWVBFUyk7Ci0KLSAgICByZXR1cm4gaXNFeDsKLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFBhcnNlIHRoZSBXU0RMIGRvY3VtZW50IGFzIGFuIFhNTCBmaWxlCi0gICAgICBEb2N1bWVudCBkb2MgPQotICAgICAgICB2YWxpZGF0b3IucGFyc2VYTUxEb2N1bWVudFVSTChkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLCBudWxsKTsKLQotICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOyAvLyBnZXQgZGVmaW5pdGlvbgotCi0gICAgICBFbGVtZW50IHR5cGVzID0gWE1MVXRpbHMuZmluZENoaWxkRWxlbWVudCgoRWxlbWVudCkgcm9vdCwgV1NETF9UWVBFUyk7Ci0KLSAgICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsID0gWE1MVXRpbHMuZmluZFByZXZpb3VzU2libGluZyh0eXBlcyk7Ci0gICAgICAgIHdoaWxlIChlbCAhPSBudWxsKQotCQl7Ci0gICAgICAgICAgaWYgKCFpc0V4dGVuc2liaWxpdHlFbGVtZW50KGVsKSAmJgotCQkJICAgKCghWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0lNUE9SVCkpICYmCi0JCQkgICAgKCFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfRE9DVU1FTlRBVElPTikpKSkKLQkJICB7Ci0JCSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQkJCVN0cmluZyBtZXNzYWdlID0gIlRoZSAiICsgZWwuZ2V0TG9jYWxOYW1lKCkgKyAiIGVsZW1lbnQgbXVzdCBub3QgcHJlY2VkZSB0aGUgdHlwZXMgZWxlbWVudC4iOwotCQkgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwobWVzc2FnZSwgZW50cnlDb250ZXh0KTsKLSAgCQkgICAgYnJlYWs7Ci0JCSAgfQotICAgICAgICAgIGVsID0gWE1MVXRpbHMuZmluZFByZXZpb3VzU2libGluZyhlbCk7Ci0JCX0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkb2N1bWVudCBhdCAiCi0gICAgICAgICAgICArIGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkKLSAgICAgICAgICAgICsgIi5cblxuIgotICAgICAgICAgICAgKyBVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKHQpLAotICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAxOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWEwN2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDE5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLQotCi0vKioKLSAqIEJQMjAxOS4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudCwgaWYgdGhlIGNvbnRhaW5lZCBzb2FwOmJpbmRpbmcgZWxlbWVudCBoYXMgYSAic3R5bGUiIGF0dHJpYnV0ZSBlcXVhbCB0byAiZG9jdW1lbnQiIGFuZCBzb2FwOm9wZXJhdGlvbnMgaGF2ZSAidXNlIiBhdHRyaWJ1dGUgZXF1YWwgdG8gImxpdGVyYWwiOjwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgIm5hbWVzcGFjZSIgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQgaW4gYW55IGNvbnRhaW5lZCBzb2FwYmluZDpib2R5LCBzb2FwYmluZDpoZWFkZXIsIHNvYXBiaW5kOjpoZWFkZXJmYXVsdCwgc29hcGJpbmQ6ZmF1bHQgZWxlbWVudHMgPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSAqIEBhdXRob3IgVml0YWxpIEZlZG9zZW5rbwotICovCi1wdWJsaWMgY2xhc3MgQlAyMDE5IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDE5KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBkb2NMaXRGb3VuZCA9IGZhbHNlOwotICAgIFN0cmluZyBlcnJhbnRFbGVtZW50cyA9IG5ldyBTdHJpbmcoIiIpOwotICAgIFN0cmluZyBzb2FwRXh0ZW5zaWJsZVdpdGhOYW1lc3BhY2UgPSBudWxsOwotCi0gICAgLy8gR2V0IHRoZSBiaW5kaW5nIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIFRyeSB0byBnZXQgdGhlIFNPQVAgYmluZGluZwotICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gV1NETFZhbGlkYXRvckltcGwuZ2V0U29hcEJpbmRpbmcoYmluZGluZyk7Ci0KLSAgICBpZiAoc29hcEJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgICAoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsKQotICAgICAgICAgID8gV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQwotICAgICAgICAgIDogc29hcEJpbmRpbmcuZ2V0U3R5bGUoKTsKLSAgICAgIGlmIChzdHlsZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQykpCi0gICAgICB7Ci0gICAgICAgIFZlY3RvciBzb2FwRWxlbWVudHMgPSBVdGlscy5hcnJheVRvVmVjdG9yKHRoaXMudmFsaWRhdG9yLmdldFNvYXBCb2RpZXMoYmluZGluZykpOwotICAgICAgICBzb2FwRWxlbWVudHMuYWRkQWxsKFV0aWxzLmFycmF5VG9WZWN0b3IodGhpcy52YWxpZGF0b3IuZ2V0U29hcEZhdWx0cyhiaW5kaW5nKSkpOwotICAgICAgICBzb2FwRWxlbWVudHMuYWRkQWxsKFV0aWxzLmFycmF5VG9WZWN0b3IodGhpcy52YWxpZGF0b3IuZ2V0U29hcEhlYWRlcnMoYmluZGluZykpKTsKLSAgICAgICAgc29hcEVsZW1lbnRzLmFkZEFsbCgKLSAgICAgICAgICBVdGlscy5hcnJheVRvVmVjdG9yKHRoaXMudmFsaWRhdG9yLmdldFNvYXBIZWFkZXJGYXVsdHMoYmluZGluZykpKTsKLQotICAgICAgICBJdGVyYXRvciBpID0gc29hcEVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IHNvYXBFbGVtZW50ID0KLSAgICAgICAgICAgIChFeHRlbnNpYmlsaXR5RWxlbWVudCkgKGkubmV4dCgpKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0b3IuaXNMaXRlcmFsKHNvYXBFbGVtZW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZG9jTGl0Rm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0b3IubmFtZXNwYWNlRm91bmRJblNvYXBMaXRlcmFsKHNvYXBFbGVtZW50KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycmFudEVsZW1lbnRzICs9ICJcbi0tLSAiICsgKHNvYXBFbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfSAvLyBjb250aW51ZSB3aXRoIGNsZW5jaGVkIHRlZXRoCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWRvY0xpdEZvdW5kKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBJZiBhIG5hbWVzcGFjZSB3YXMgbm90IGZvdW5kIHRoZW4gdGVzdCBhc3NlcnRpb24gcGFzc2VkCi0gICAgICBpZiAoZXJyYW50RWxlbWVudHMubGVuZ3RoKCkgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAiRmFpbGluZyBlbGVtZW50czoiICsgZXJyYW50RWxlbWVudHMsCi0gICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDIwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAyMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhiZjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuVVJJLk1hbGZvcm1lZFVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0qIEJQMjAyMC4KLSogICAgPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZyBlbGVtZW50LCBpZiB0aGUgc3R5bGUgYXR0cmlidXRlIG9mIHRoZSBjb250YWluZWQgc29hcGJpbmQ6YmluZGluZyBpcyAicnBjIiAKLSogICAgICAgYW5kIHRoZSB1c2UgYXR0cmlidXRlIGlzICJsaXRlcmFsIi48L2NvbnRleHQ+Ci0qICAgIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgb24gYWxsIHNvYXBiaW5kOmJvZHkgZWxlbWVudHMgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgCi0qIG5hbWVzcGFjZSBhdHRyaWJ1dGUgaXMgYW4gYWJzb2x1dGUgVVJJLiA8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotKiBAdmVyc2lvbiAxLjAuMSAyNy4wNi4yMDAzCi0qIEBhdXRob3IgVml0YWxpIEZlZG9zZW5rbwotKiovCi1wdWJsaWMgY2xhc3MgQlAyMDIwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDIwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgIGJvb2xlYW4gcnBjTGl0Rm91bmQgPSBmYWxzZTsKLQotICAgIC8vIEdldCB0aGUgYmluZGluZyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBUcnkgdG8gZ2V0IHRoZSBTT0FQIGJpbmRpbmcKLSAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IFdTRExWYWxpZGF0b3JJbXBsLmdldFNvYXBCaW5kaW5nKGJpbmRpbmcpOwotCi0gICAgLy8gVGVzdCB0aGUgYXNzZXJ0aW9uIAotICAgIC8vIENoZWNrIHN0eWxlIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHJwYyAtIHRoZSBzdWJqZWN0IG9mIHRoZSBhc3NlcnRpb24KLSAgICBTdHJpbmcgc3R5bGUgPSBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DOwotICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKQotICAgICAgc3R5bGUgPQotICAgICAgICAoc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsCi0gICAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgICAgOiBzb2FwQmluZGluZy5nZXRTdHlsZSgpKTsKLQotICAgIGlmICgoc29hcEJpbmRpbmcgIT0gbnVsbCkKLSAgICAgICYmIChzdHlsZS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQykpKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgbGlzdCBvZiBTT0FQIGJvZHkgZWxlbWVudHMKLSAgICAgIFNPQVBCb2R5W10gc29hcEJvZGllcyA9IHRoaXMudmFsaWRhdG9yLmdldFNvYXBCb2RpZXMoYmluZGluZyk7Ci0KLSAgICAgIC8vIENoZWNrIGZvciBTb2FwIG9wZXJhdGlvbiBuYW1lc3BhY2UKLSAgICAgIGJvb2xlYW4gYXNzZXJ0aW9uRmFpbHVyZSA9IGZhbHNlOwotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvYXBCb2RpZXMubGVuZ3RoICYmICEoYXNzZXJ0aW9uRmFpbHVyZSk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU09BUEJvZHkgc29hcEJvZHkgPSBzb2FwQm9kaWVzW2ldOwotICAgICAgICAvLyBBZGRlZCBjaGVjayBmb3IgbnVsbCB1c2UgdmFsdWUsIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGxpdGVyYWwKLSAgICAgICAgaWYgKHNvYXBCb2R5LmdldFVzZSgpID09IG51bGwKLSAgICAgICAgICB8fCBzb2FwQm9keS5nZXRVc2UoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpKQotICAgICAgICB7Ci0gICAgICAgICAgcnBjTGl0Rm91bmQgPSB0cnVlOwotICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSwgdGhlbiBmbGFnIGFzIGEgZmFpbHVyZQotICAgICAgICAgIGlmICgobmFtZXNwYWNlVVJJID0gc29hcEJvZHkuZ2V0TmFtZXNwYWNlVVJJKCkpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0aW9uRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgICAiLS0tIFNPQVAgQk9EWTpcbiIKLSAgICAgICAgICAgICAgICAgICsgc29hcEJvZHkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgKyAiXG4tLS0gQklORElORyBRTkFNRTpcbiIKLSAgICAgICAgICAgICAgICAgICsgYmluZGluZy5nZXRRTmFtZSgpLAotICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gRWxzZSwgdmVyaWZ5IHRoYXQgdGhlIG5hbWVzcGFjZSBpcyBhbiBhYnNvbHV0ZSBVUkkKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vVVJMIHVybCA9IG5ldyBVUkwobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgVVJJIHVyaSA9IG5ldyBVUkkobmFtZXNwYWNlVVJJKTsKLSAgICAgICAgICAgICAgaWYgKHVyaS5nZXRTY2hlbWUoKSA9PSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gbm8gc2NoZW1lIGltcGxpZXMgbm90IGFuIGFic29sdXRlIFVSSQotICAgICAgICAgICAgICAgIGFzc2VydGlvbkZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICAgICAgICAgIi0tLSBTT0FQIEJPRFk6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgKyBzb2FwQm9keS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgKyAiXG4tLS0gQklORElORyBRTkFNRTpcbiIKLSAgICAgICAgICAgICAgICAgICAgICArIGJpbmRpbmcuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSSUV4Y2VwdGlvbiBtdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFzc2VydGlvbkZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgICAgICAgIi0tLSBTT0FQIEJPRFk6XG4iCi0gICAgICAgICAgICAgICAgICAgICsgc29hcEJvZHkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICArICJcbi0tLSBCSU5ESU5HIFFOQU1FOlxuIgotICAgICAgICAgICAgICAgICAgICArIGJpbmRpbmcuZ2V0UU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghcnBjTGl0Rm91bmQpCi0gICAgICB7Ci0gICAgICAgIC8vIHN0eWxlIGlzIHJwYyBidXQgbm8gZG9jdW1lbnQgdXNlIGVsZW1lbnRzCi0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPSBudWxsOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIWFzc2VydGlvbkZhaWx1cmUpCi0gICAgICB7IC8vIElmIG5vIGFzc2VydGlvbiBmYWlsdXJlLCB0aGVuIHNldCByZXN1bHQgdG8gcGFzc2VkCi0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHN0eWxlIGlzIG5vdCBycGMKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAyMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1MDg2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLQotLyoqCi0qICBCUDIwMjEuCi0qICAgICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQ8L2NvbnRleHQ+Ci0qICAgICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHdzZGw6aW5wdXQgZWxlbWVudCBhbmQgd3NkbDpvdXRwdXQgZWxlbWVudCBvZiBlYWNoIG9wZXJhdGlvbiB1c2VzIHRoZSBhdHRyaWJ1dGUgbmFtZSAicGFydCIgd2l0aCBhIFNjaGVtYSB0eXBlIG9mICJOTVRPS0VOIiBhbmQgZG9lcyBub3QgdXNlICJwYXJ0cyIsIGZvciBib3RoIHNvYXBiaW5kOmhlYWRlciBlbGVtZW50cyBhbmQgc29hcGJpbmQ6aGVhZGVyZmF1bHQgZWxlbWVudHMuIDwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0qCi0qIEB2ZXJzaW9uIDEuMC4xIDI3LjA2LjIwMDMKLSogQGF1dGhvciBWaXRhbGkgRmVkb3NlbmtvCi0qKi8KLXB1YmxpYyBjbGFzcyBCUDIwMjEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMjEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy9PcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKLQotICAgIC8vIEdldCB0aGUgYmluZGluZyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBHZXQgU09BUCBoZWFkZXJzIGZvciB0aGlzIGJpbmRpbmcKLSAgICBTT0FQSGVhZGVyW10gc29hcEhlYWRlcnMgPSB0aGlzLnZhbGlkYXRvci5nZXRTb2FwSGVhZGVycyhiaW5kaW5nKTsKLQotICAgIGlmIChzb2FwSGVhZGVycy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gQ2hlY2sgZWFjaCBoZWFkZXIgdG8gc2VlIGlmIGl0IGhhcyBwYXJ0IGVsZW1lbnQgd2l0aCBOTVRPS0VOIHR5cGUKLSAgICAgIGZvciAoaW50IGhlYWRlciA9IDA7Ci0gICAgICAgIGhlYWRlciA8IHNvYXBIZWFkZXJzLmxlbmd0aAotICAgICAgICAgICYmIHJlc3VsdC5lcXVhbHMoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQpOwotICAgICAgICBoZWFkZXIrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKChzb2FwSGVhZGVyc1toZWFkZXJdLmdldFBhcnQoKSA9PSBudWxsKQotICAgICAgICAgIHx8ICghWE1MVXRpbHMuaXNObXRva2VuKHNvYXBIZWFkZXJzW2hlYWRlcl0uZ2V0UGFydCgpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoc29hcEhlYWRlcnNbaGVhZGVyXS50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEVsc2UsIGNoZWNrIHRoZSBoZWFkZXJmYXVsdCBpZiB0aGVyZSBpcyBvbmUKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgTGlzdCBzb2FwSGVhZGVyRmF1bHRMaXN0ID0KLSAgICAgICAgICAgIHNvYXBIZWFkZXJzW2hlYWRlcl0uZ2V0U09BUEhlYWRlckZhdWx0cygpOwotICAgICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc29hcEhlYWRlckZhdWx0TGlzdC5pdGVyYXRvcigpOwotCi0gICAgICAgICAgLy8gQ2hlY2sgZWFjaCBoZWFkZXIgZmF1bHQgdG8gc2VlIGlmIGl0IGhhcyBwYXJ0IGVsZW1lbnQgd2l0aCBOTVRPS0VOIHR5cGUKLSAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpCi0gICAgICAgICAgICAmJiByZXN1bHQuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTT0FQSGVhZGVyRmF1bHQgc29hcEhlYWRlckZhdWx0ID0KLSAgICAgICAgICAgICAgKFNPQVBIZWFkZXJGYXVsdCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgaWYgKChzb2FwSGVhZGVyRmF1bHQuZ2V0UGFydCgpID09IG51bGwpCi0gICAgICAgICAgICAgIHx8ICghWE1MVXRpbHMuaXNObXRva2VuKHNvYXBIZWFkZXJGYXVsdC5nZXRQYXJ0KCkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoc29hcEhlYWRlckZhdWx0LnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDVkN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAgKiBCUDIwMjIuCi0gICogICAgPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZyBlbGVtZW50PC9jb250ZXh0PgotICAqICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+dGhlIG5hbWUgYXR0cmlidXRlIGlzIHNwZWNpZmllZCBvbiB0aGUgc29hcGJpbmQ6ZmF1bHQgZWxlbWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotKiovCi1wdWJsaWMgY2xhc3MgQlAyMDIyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDIyKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCB0aGUgYmluZGluZyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBHZXQgbGlzdCBvZiBTT0FQIGZhdWx0cyBmb3IgdGhlIGJpbmRpbmcKLSAgICBTT0FQRmF1bHRbXSBzb2FwRmF1bHRzID0gdGhpcy52YWxpZGF0b3IuZ2V0U29hcEZhdWx0cyhiaW5kaW5nKTsKLQotICAgIGlmIChzb2FwRmF1bHRzID09IG51bGwgfHwgc29hcEZhdWx0cy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBjaGVjayBhbGwgc29hcDpmYXVsdHMuIAotICAgICAgLy8gTVVTVCBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcEZhdWx0cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHNvYXBGYXVsdHNbaV07Ci0gICAgICAgIGlmIChzb2FwRmF1bHQuZ2V0TmFtZSgpID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICAgICJzb2FwYmluZDpmYXVsdCBlbGVtZW50IDogIiArIHNvYXBGYXVsdC50b1N0cmluZygpLAotICAgICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDIzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzYwYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0KLS8qKgotICogQlAyMDIzLgotICogICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQsIHdpdGggdGhlICJ1c2UiIGF0dHJpYnV0ZSBwcmVzZW50IG9uIHRoZSBzb2FwYmluZDpmYXVsdCBlbGVtZW50PC9jb250ZXh0PgotICogICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaXMgImxpdGVyYWwiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIwMjMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMjMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IHRoZSBiaW5kaW5nIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIEdldCBsaXN0IG9mIFNPQVAgZmF1bHRzIGZvciB0aGUgYmluZGluZwotICAgIFNPQVBGYXVsdFtdIHNvYXBGYXVsdHMgPSB0aGlzLnZhbGlkYXRvci5nZXRTb2FwRmF1bHRzKGJpbmRpbmcpOwotCi0gICAgaWYgKHNvYXBGYXVsdHMgPT0gbnVsbCB8fCBzb2FwRmF1bHRzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIGNoZWNrIGFsbCBzb2FwOmZhdWx0cy4gCi0gICAgICAvLyBNVVNUIGhhdmUgYSBuYW1lIGF0dHJpYnV0ZSwgYW5kIGlmIGEgdXNlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIGl0IE1VU1QgYmUgdmFsdWUgImxpdGVyYWwiCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvYXBGYXVsdHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzb2FwRmF1bHRzW2ldOwotICAgICAgICBpZiAoKHNvYXBGYXVsdC5nZXRVc2UoKSAhPSBudWxsKQotICAgICAgICAgICYmICghc29hcEZhdWx0Ci0gICAgICAgICAgICAuZ2V0VXNlKCkKLSAgICAgICAgICAgIC5lcXVhbHMoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQpKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKHNvYXBGYXVsdC50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMzIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZDk2ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMjAzMi4KLSAqICAgPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZyBlbGVtZW50PC9jb250ZXh0PgotICogICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+dGhlIG5hbWUgYXR0cmlidXRlIHRoYXQgaXMgc3BlY2lmaWVkIG9uIHRoZSBzb2FwYmluZDpmYXVsdCBlbGVtZW50IG1hdGNoZXMgdGhlIHZhbHVlIHNwZWNpZmllZCBvbiB0aGUgcGFyZW50IGVsZW1lbnQgd3NkbDpmYXVsdC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMDMyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDMyKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCB0aGUgYmluZGluZyBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgQmluZGluZyBiaW5kaW5nID0gKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBHZXQgbGlzdCBvZiBCaW5kaW5nIGZhdWx0cyBmb3IgdGhlIGJpbmRpbmcKLSAgICBCaW5kaW5nRmF1bHRbXSBiaW5kaW5nRmF1bHRzID0gdGhpcy52YWxpZGF0b3IuZ2V0QWxsQmluZGluZ0ZhdWx0cyhiaW5kaW5nKTsKLQotICAgIGlmIChiaW5kaW5nRmF1bHRzID09IG51bGwgfHwgYmluZGluZ0ZhdWx0cy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gZm9yIGVhY2ggYmluZGluZyBmYXVsdCwgY29tcGFyZSB0aGUgY2hpbGQgc29hcDpmYXVsdCBuYW1lIHdpdGggdGhlIGJpbmRpbmcgZmF1bHQgbmFtZSAKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaW5kaW5nRmF1bHRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gYmluZGluZ0ZhdWx0c1tpXTsKLSAgICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IHRoaXMudmFsaWRhdG9yLmdldFNvYXBGYXVsdChiaW5kaW5nRmF1bHQpOwotICAgICAgICBpZiAoc29hcEZhdWx0ID09IG51bGwKLSAgICAgICAgICB8fCBzb2FwRmF1bHQuZ2V0TmFtZSgpID09IG51bGwKLSAgICAgICAgICB8fCBiaW5kaW5nRmF1bHQuZ2V0TmFtZSgpID09IG51bGwKLSAgICAgICAgICB8fCAhYmluZGluZ0ZhdWx0LmdldE5hbWUoKS5lcXVhbHMoc29hcEZhdWx0LmdldE5hbWUoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgc29hcEZhdWx0ID09IG51bGwgPyBudWxsIDogc29hcEZhdWx0LnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAzNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwMzQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhlNjFlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjAzNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotLyoqCi0gKiBCUDIwMzQKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgZGVzY3JpcHRpb24gd2l0aGluIGEgV1NETCBkb2N1bWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgY2FuZGlkYXRlIGRlc2NyaXB0aW9uIGRvZXMgbm90IGNvbnRhaW4gdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiB4bWxuczp4bWw9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4gCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDIwMzQgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIwMzQoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0dGluZyB3c2RsOmRlZmluaXRpb24gZWxlbWVudAotICAgIERlZmluaXRpb24gZGVmID0gKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgVHlwZXMgdHlwZXM7Ci0gICAgLy8gR2V0dGluZyB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHhtbG5zOnhtbAotICAgIFN0cmluZyB4bWxOcyA9IChTdHJpbmcpIGRlZi5nZXROYW1lc3BhY2VzKCkuZ2V0KCJ4bWwiKTsKLSAgICAvLyBJZiBpdCBleGlzdHMgYW5kIGVxdWFscyB0byAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICAgIGlmICh4bWxOcyAhPSBudWxsICYmIHhtbE5zLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1hNTCkpCi0gICAgewotICAgICAgLy8gc2V0dGluZyBhc3NlcnRpb24gcmVzdWx0IHRvIHdhcm5pbmcKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICB9Ci0gICAgLy8gdGhlcmUgaXMgbm8gbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHhtbG5zOnhtbCBpbiB0aGUgd3NkbDpkZWZpbml0aW9uCi0gICAgLy8gZWxlbWVudCwgY2hlY2tpbmcgd2hldGhlciB0aGUgZGVmaW5pdGlvbiBoYXMgd3NkbDp0eXBlIGVsZW1lbnQKLSAgICBlbHNlIGlmICgodHlwZXMgPSBkZWYuZ2V0VHlwZXMoKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBHZXR0aW5nIHRoZSBsaXN0IG9mIHdzZGw6c2NoZW1hUwotICAgICAgTGlzdCBleHRFbGVtcyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRFbGVtcy5zaXplKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0dGluZyB3c2RsOnNjaGVtYSBlbGVtZW50Ci0gICAgICAgIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCBzY2hlbWEgPQotICAgICAgICAgIChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1zLmdldChpKTsKLSAgICAgICAgLy8gR2V0dGluZyBhIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgeG1sbnM6eG1sCi0gICAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBzY2hlbWEuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZU5TKAotICAgICAgICAgIFdTSUNvbnN0YW50cy5OU19VUklfWE1MTlMsICJ4bWwiKTsKLSAgICAgICAgLy8gSWYgaXQgZXF1YWxzIHRvICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAotICAgICAgICBpZiAoV1NJQ29uc3RhbnRzLk5TX1VSSV9YTUwuZXF1YWxzKGF0dHJWYWx1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBzZXR0aW5nIGFzc2VydGlvbiByZXN1bHQgdG8gd2FybmluZwotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoIlRoZSBuYW1lc3BhY2UgIgotICAgICAgICAgICAgKyAiZGVjbGFyYXRpb24gbmVzdGVkIGluIHdzZGw6c2NoZW1hIGVsZW1lbnQuIiwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwOTguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMDk4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYjY1M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIwOTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci0KLQotLyoqCi0gKiBCUDIwOTguCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDppbXBvcnQgZWxlbWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgImxvY2F0aW9uIiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGZvciB0aGUgd3NkbDppbXBvcnQgZWxlbWVudCwgYW5kIGhhcyBhIG5vbi1lbXB0eSB2YWx1ZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMDk4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMDk4KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIEltcG9ydCBpbSA9IChJbXBvcnQpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0gICAgLy8gc3VwcG9zZSB0aGF0IGlmIGxvY2F0aW9uIGlzIGludmFsaWQsIHRoZSBkZWZpbml0aW9uIGVxdWFscyB0byBudWxsCi0gICAgaWYgKGltLmdldExvY2F0aW9uVVJJKCkgPT0gbnVsbCB8fCBpbS5nZXRMb2NhdGlvblVSSSgpID09ICIiKQotICAgICAgZXJyb3JzLmFkZChpbS5nZXROYW1lc3BhY2VVUkkoKSwgaW0uZ2V0TG9jYXRpb25VUkkoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOWFjODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotCi0vKioKLSAqIEJQMjEwMS4KLSAgICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6ZGVmaW5pdGlvbiwgaWYgaXQgY29udGFpbnMgd3NkbDppbXBvcnQgc3RhdGVtZW50czwvY29udGV4dD4KLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkVhY2ggd3NkbDppbXBvcnQgc3RhdGVtZW50IGlzIG9ubHkgdXNlZCB0byBpbXBvcnQgYW5vdGhlciBXU0RMIGRlc2NyaXB0aW9uLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTAxKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgYm9vbGVhbiBpbXBvcnRGb3VuZCA9IGZhbHNlOwotCi0gIC8qIENyZWF0ZSBmYWx1cmUgcmVwb3J0IGlmIGltcG9ydCBjb250YWlucyByZWZlcmVuY2UgdG8gbm9uIFdTREwgZGVzY3JpcHRpb24uIAotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5JbXBvcnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJbXBvcnQgaW0sIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGltcG9ydEZvdW5kID0gdHJ1ZTsKLQotICAgIC8vIGJ5IHRoZSB3YXkgOiBXU0RMNEogdGhyb3dzIEV4Y2VwdGlvbiBpZiBpbXBvcnRlZCBXU0RMIGlzIG5vdCByZXNvbHZlZAotICAgIC8vIGJ1dCBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBpbS5nZXREZWZpbml0aW9uKCkgd2lsbCBiZSBlcXVhbCB0byBudWxsCi0gICAgaWYgKGltLmdldERlZmluaXRpb24oKSA9PSBudWxsKQotICAgICAgZXJyb3JzLmFkZCgKLSAgICAgICAgaW0uZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICAgICAgICArICI6IgotICAgICAgICAgICsgaW0uZ2V0TG9jYXRpb25VUkkoKQotICAgICAgICAgICsgIlxuSW1wb3J0IGVsZW1lbnQgZG9lcyBub3QgcmVmZXJlbmNlIGEgV1NETCBkZWZpbml0aW9uLiIpOwotICAgIGVsc2UKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyB0cnkgdG8gcGFyc2UgV1NETCBhY2NvcmRpbmcgdG8gdGhlIFdTREwgc2NoZW1hCi0gICAgICAgIERvY3VtZW50IGRvYyA9Ci0gICAgICAgICAgdmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwoCi0gICAgICAgICAgICBpbS5nZXRMb2NhdGlvblVSSSgpLAotICAgICAgICAgICAgKChEZWZpbml0aW9uKXBhcmVudCkuZ2V0RG9jdW1lbnRCYXNlVVJJKCksCi0gICAgICAgICAgICBUZXN0VXRpbHMuZ2V0V1NETFNjaGVtYUxvY2F0aW9uKCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgICBlcnJvcnMuYWRkKAotICAgICAgICAgIGltLmdldE5hbWVzcGFjZVVSSSgpCi0gICAgICAgICAgICArICI6IgotICAgICAgICAgICAgKyBpbS5nZXRMb2NhdGlvblVSSSgpCi0gICAgICAgICAgICArICJcbiIKLSAgICAgICAgICAgICsgVXRpbHMuZ2V0RXhjZXB0aW9uRGV0YWlscyh0KSk7Ci0gICAgICB9Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0SW1wb3J0KHRydWUpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFpbXBvcnRGb3VuZCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjcyYjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIEJQMjEwMi4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOnR5cGVzIGVsZW1lbnQsIHdpdGggWE1MIHNjaGVtYSBpbXBvcnQgZWxlbWVudHM8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RWFjaCBYTUwgc2NoZW1hIGltcG9ydCBzdGF0ZW1lbnQgKHhzZDppbXBvcnQpIGlzIG9ubHkgdXNlZCB0byBkaXJlY3RseSByZWZlcmVuY2UgYW4gWE1MIHNjaGVtYSBkZWZpbml0aW9uLCB3aGljaCBoYXMgInNjaGVtYSIgZnJvbSBYTUwgbmFtZXNwYWNlICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgYXMgcm9vdCBlbGVtZW50LiAgSXQgZG9lcyBub3QgY29udGFpbiBhIHJlZmVyZW5jZSB0byBhbm90aGVyIGRvY3VtZW50IGVtYmVkZGluZyB0aGUgWE1MIHNjaGVtYSBkZWZpbml0aW9uIChlLmcuIFdTREwpLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMDIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpbXBvcnRGb3VuZCA9IGZhbHNlOwotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIHBhcnNlIFdTREwgYXMgWE1MCi0gICAgdHJ5Ci0gICAgewotICAgICAgVHlwZXMgdCA9IChUeXBlcykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICAgIExpc3QgZXh0cyA9IHQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoKGRlZmluaXRpb24gPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXREZWZpbml0aW9uKHQpKQotICAgICAgICA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCB0eXBlcyBkZWZpbml0aW9uIGluIGFueSBXU0RMIGRvY3VtZW50LiIpOwotICAgICAgfQotCi0gICAgICBpZiAoZXh0cyAhPSBudWxsKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBpdCA9IGV4dHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgICAgaWYgKGVsIGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgICAgICAgICAmJiBlbC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICAgICAgdGVzdE5vZGUoKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsKS5nZXRFbGVtZW50KCksCi0gICAgICAgICAgICAgIGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotCi0gICAgICAgICAgaWYgKHJlc3VsdC5lcXVhbHMoQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGZhaWx1cmVEZXRhaWxNZXNzYWdlLCBlbnRyeUNvbnRleHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIWltcG9ydEZvdW5kKQotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIGNhdGNoIChUaHJvd2FibGUgdHQpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICJXU0RMIGRvY3VtZW50IGNhbiBub3QgYmUgcHJvY2Vzc2VkIiwKLSAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKgotICAgKiBDaGVjayBub2RlIGlzIHhzZCBpbXBvcnQgYW5kIGl0IGlzIAotICAgKiBvbmx5IHVzZWQgdG8gZGlyZWN0bHkgcmVmZXJlbmNlIGFuIFhNTCBzY2hlbWEgZGVmaW5pdGlvbiwgd2hpY2ggaGFzICJzY2hlbWEiIAotICAgKiBmcm9tIFhNTCBuYW1lc3BhY2UgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBhcyByb290IGVsZW1lbnQuICAKLSAgICogQW5kIGl0IGRvZXMgbm90IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYW5vdGhlciBkb2N1bWVudCBlbWJlZGRpbmcgdGhlIFhNTCBzY2hlbWEgCi0gICAqIGRlZmluaXRpb24gKGUuZy4gV1NETCkuCi0gICogQHBhcmFtIG4gLSBVbmtub3duIGV4dGVuc2liaWxpdHkgZWxlbWVudAotICAqLwotICBwcml2YXRlIHZvaWQgdGVzdE5vZGUoTm9kZSBuLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gc2VhcmNoZXMgZm9yIHhzZDppbXBvcnQgZWxlbWVudAotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0Rm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgRWxlbWVudCBpbSA9IChFbGVtZW50KSBuOwotICAgICAgICAgIC8vIEdldHRpbmcgdGhlIHNjaGVtYUxvY2F0aW9uIGFuZCB0aGUgbmFtZXNwYWNlIGF0dHJpYnV0ZXMKLSAgICAgICAgICBBdHRyIHNjaGVtYUxvY2F0aW9uID0KLSAgICAgICAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04pOwotICAgICAgICAgIEF0dHIgbmFtZXNwYWNlID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9OQU1FU1BBQ0UpOwotICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgdGhlIG5hbWVzcGFjZSBhdHRyaWJ1dGUgb2YgaW1wb3J0IGVsZW1lbnQKLSAgICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gPT0gbnVsbCAmJiBuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBHZXR0aW5nIGFsbCB0aGUgaW5saW5lIHNjaGVtYXMgb2YgdGhlIHdzZGwgZGVmaW5pdGlvbgotICAgICAgICAgICAgTWFwIHNjaGVtYXNNYXAgPSB2YWxpZGF0b3Iud3NkbERvY3VtZW50LmdldFNjaGVtYXMoKTsKLSAgICAgICAgICAgIC8vIElmIGFuIGlubGluZSBzY2hlbWEgaW1wb3J0ZWQgaXMgZGVmaW5lZAotICAgICAgICAgICAgaWYgKHNjaGVtYXNNYXAua2V5U2V0KCkuY29udGFpbnMobmFtZXNwYWNlLmdldFZhbHVlKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBJZiBhbiBpbmxpbmUgc2NoZW1hIGltcG9ydGVkIGlzIGRlZmluZWQKLSAgICAgICAgICAgICAgLy8gKHRoYXQgbWVhbnMgdGhlIHNjaGVtYSBpcyB2YWxpZCksCi0gICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgZWxlbWVudAotICAgICAgICAgICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm8gc2NoZW1hTG9jYXRpb24gc28gdHJ5IHRoZSBuYW1lc3BhY2UgCi0gICAgICAgICAgICBzY2hlbWFMb2NhdGlvbiA9IG5hbWVzcGFjZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyB0cnkgdG8gcGFyc2UgaW1wb3J0ZWQgWFNECi0gICAgICAgICAgaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBpZiBhbnkgZXJyb3Igb3Igcm9vdCBlbGVtZW50IGlzIG5vdCBYU0Qgc2NoZW1hIC0+IGVycm9yCi0gICAgICAgICAgICAgIC8vICEhIEFUVEVOVElPTgotICAgICAgICAgICAgICAvLyByb290IFhTRCBTQ0hFTUEgU0NIRU1BIGlzIG5vdCB2YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy9Eb2N1bWVudCBzY2hlbWEgPSBYTUxVdGlscy5wYXJzZVhNTERvY3VtZW50VVJMKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIFhTRF9TQ0hFTUFMT0NBVElPTiwgY29udGV4dCk7Ci0gICAgICAgICAgICAgIERvY3VtZW50IHNjaGVtYSA9Ci0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY29udGV4dCk7Ci0KLSAgICAgICAgICAgICAgLy8gSWYgdGhlIGltcG9ydCBpcyB2YWxpZCwgdGhlbiBjaGVjayBpdHMgY29udGVudHMKLSAgICAgICAgICAgICAgaWYgKFhNTFV0aWxzCi0gICAgICAgICAgICAgICAgLmVxdWFscyhzY2hlbWEuZ2V0RG9jdW1lbnRFbGVtZW50KCksIEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBjb250ZW50IG9mIGltcG9ydGVkIGRvY3VtZW50Ci0gICAgICAgICAgICAgICAgdGVzdE5vZGUoc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLmdldEZpcnN0Q2hpbGQoKSwKLSAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZVVSTFN0cmluZyhzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLCBjb250ZXh0KSk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0gc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL3Jlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICAgInNjaGVtYUxvY2F0aW9uID09IG51bGwgYW5kIG5hbWVzcGFjZSA9PSBudWxsIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0ZXN0Tm9kZShuLmdldEZpcnN0Q2hpbGQoKSwgY29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTAzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmRhOTcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBCUDIxMDMuCi0gICAqIDxjb250ZXh0PkZvciBlYWNoIGEgY2FuZGlkYXRlIHdzZGw6ZGVmaW5pdGlvbnM8L2NvbnRleHQ+Ci0gICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5Gb3IgdGhlIHJlZmVyZW5jZWQgZGVmaW5pdGlvbnMgYXMgd2VsbCBhcyBhbGwgaW1wb3J0ZWQgCi0gICAqIGRlc2NyaXB0aW9ucywgVGhlIFhNTCBzY2hlbWEgaW1wb3J0IHN0YXRlbWVudCBpcyBvbmx5IHVzZWQgd2l0aGluIGFuIHhzZDpzY2hlbWEgCi0gICAqIGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjEwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMDMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiBDaGVjayBhbGwgdW5rbm93biBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGl0IGlzIG5vdCB4c2QgaW1wb3J0LgotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZWwsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAoZWwgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICBzZWFyY2hGb3JJbXBvcnQoKChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGVsKS5nZXRFbGVtZW50KCkpOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgLy9wcm9jZXNzV1NETChlbnRyeUNvbnRleHQuZ2V0V1NETERvY3VtZW50KCkuZ2V0RmlsZW5hbWUoKSk7Ci0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC52aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KHRydWUpOwotCi0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qCi0gICAqIENyZWF0ZSBmYWx1cmUgcmVwb3J0IGlmIG5vZGUgaXMgeHNkIGltcG9ydC4gCi0gICAqIEBwYXJhbSBuIC0gbm9kZQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNlYXJjaEZvckltcG9ydChOb2RlIG4pCi0gIHsKLSAgICB3aGlsZSAobiAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHNlYXJjaGVzIGZvciB4c2Q6aW1wb3J0IGVsZW1lbnQKLSAgICAgIGlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBuLmdldE5vZGVUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfSU1QT1JUKSkKLSAgICAgICAgewotICAgICAgICAgIEF0dHIgYSA9Ci0gICAgICAgICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoKEVsZW1lbnQpIG4sIEFUVFJfWFNEX1NDSEVNQUxPQ0FUSU9OKTsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiOwotICAgICAgICAgIGEgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoKEVsZW1lbnQpIG4sIEFUVFJfWFNEX05BTUVTUEFDRSk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChhICE9IG51bGwpID8gYS5nZXRWYWx1ZSgpIDogIiI7Ci0gICAgICAgICAgZXJyb3JzLmFkZChuZXcgUU5hbWUobmFtZXNwYWNlLCBzY2hlbWFMb2NhdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgeHNkOnNjaGVtYSBlbGVtZW50IGlzIGZvdW5kIC0+IHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgICAgaWYgKCFYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgICAgIHNlYXJjaEZvckltcG9ydChuLmdldEZpcnN0Q2hpbGQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyZjM2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk51bGxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSAqIEJQMjEwNC4KLSAgICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6aW1wb3J0PC9jb250ZXh0PgotICAgKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHRhcmdldE5hbWVzcGFjZSBhdHRyaWJ1dGUgb24gdGhlIHdzZGw6ZGVmaW5pdGlvbnMgZWxlbWVudCBmb3IgdGhlIGltcG9ydGVkIFdTREwgZGVzY3JpcHRpb24gaGFzIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBuYW1lc3BhY2UgYXR0cmlidXRlIG9uIHRoZSB3c2RsOmltcG9ydCBlbGVtZW50IHRoYXQgaW1wb3J0ZWQgdGhlIFdTREwgZGVzY3JpcHRpb24uPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjEwNCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMDQoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICBwcml2YXRlIGJvb2xlYW4gaW1wb3J0Rm91bmQgPSBmYWxzZTsKLQotICAvKiBDcmVhdGUgZmFsdXJlIHJlcG9ydCBpZiBuYW1lc3BhY2Ugb2Ygd3NkbDppbXBvcnQgZG9lcyBub3QgZXF1YWwgdGFyZ2V0bmFtZXNwYWNlIGluIHJlZmVyZW5jZWQgd3NkbC4gIAotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5JbXBvcnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJbXBvcnQgaW0sIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGltcG9ydEZvdW5kID0gdHJ1ZTsKLSAgICBEZWZpbml0aW9uIGRlZiA9IGltLmdldERlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKCFOdWxsVXRpbC5lcXVhbHMoaW0uZ2V0TmFtZXNwYWNlVVJJKCksIGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKSkpCi0gICAgICAgIGVycm9ycy5hZGQoCi0gICAgICAgICAgbmV3IFFOYW1lKGltLmdldE5hbWVzcGFjZVVSSSgpLCBpbS5nZXRMb2NhdGlvblVSSSgpKSwKLSAgICAgICAgICBuZXcgUU5hbWUoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpLCBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKTsKLSAgICB9Ci0gIH0KLQotICAvKiAKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0SW1wb3J0KHRydWUpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFpbXBvcnRGb3VuZCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwNS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwNGM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gICogQlAyMTA1LgotICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmRlZmluaXRpb25zPC9jb250ZXh0PgotICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5Gb3IgdGhlIHJlZmVyZW5jZWQgZGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgYWxsIGltcG9ydGVkIGRlc2NyaXB0aW9ucywgaW4gdGhlIFdTREwgbmFtZXNwYWNlIHVuZGVyIHRoZSB3c2RsOmRlZmludGl0aW9ucyBlbGVtZW50LCB0aGUgd3NkbDppbXBvcnQgZWxlbWVudCBpcyBlaXRoZXIgZGlyZWN0bHkgYWZ0ZXIgdGhlIHdzZGw6ZG9jdW1lbnRhdGlvbiBlbGVtZW50IG9yIGlzIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50IGlmIHRoZSB3c2RsOmRvY3VtZW50YXRpb24gZWxlbWVudCBpcyBub3QgcHJlc2VudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICAqLwotcHVibGljIGNsYXNzIEJQMjEwNSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMDUoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICBwcml2YXRlIGJvb2xlYW4gaW1wb3J0Rm91bmQgPSBmYWxzZTsKLQotICAvKiAKLSAgICogQ2hlY2sgd3NsZCBpbXBvcnQgZWxlbWVudCBpcyBlaXRoZXIgZGlyZWN0bHkgYWZ0ZXIgdGhlIHdzZGw6ZG9jdW1lbnRhdGlvbiBlbGVtZW50IAotICAgKiBvciBpcyB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBpZiB0aGUgd3NkbDpkb2N1bWVudGF0aW9uIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkltcG9ydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEltcG9ydCBpbSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaW1wb3J0Rm91bmQgPSB0cnVlOwotICAgIGlmIChpbS5nZXREZWZpbml0aW9uKCkgIT0gbnVsbCAmJiBpbS5nZXRMb2NhdGlvblVSSSgpICE9IG51bGwpCi0gICAgICBwcm9jZXNzV1NETChpbS5nZXREZWZpbml0aW9uKCkuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICB9Ci0KLSAgLyoKLSAgICogQ2hlY2sgZWxlbWVudCBpcyBleHRlbnNpYmlsaXR5LgotICAgKiBAcGFyYW0gZWwgLSB4bWwgZWxlbWVudAotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzRXh0ZW5zaWJpbGl0eUVsZW1lbnQoRWxlbWVudCBlbCkKLSAgewotICAgIGJvb2xlYW4gaXNFeCA9IHRydWU7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9CSU5ESU5HKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0RFRklOSVRJT05TKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0RPQ1VNRU5UQVRJT04pOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfRkFVTFQpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfSU1QT1JUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0lOUFVUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX01FU1NBR0UpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfT1BFUkFUSU9OKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX09VVFBVVCk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9QQVJUKTsKLSAgICBpc0V4ID0gaXNFeCAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX1BPUlQpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfUE9SVFRZUEUpOwotICAgIGlzRXggPSBpc0V4ICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfU0VSVklDRSk7Ci0gICAgaXNFeCA9IGlzRXggJiYgIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9UWVBFUyk7Ci0KLSAgICByZXR1cm4gaXNFeDsKLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIC8vIEdldCB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgd2lsbCBiZSBhbmFseXplZCAgICAgICAKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPQotICAgICAgKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBJZiBpdCBkb2Vzbid0IGNvbnRhaW4gYW55IGltcG9ydHMsIHRoZW4gdGhlIHJlc3VsdCBpcyBub3RBcHBsaWNhYmxlCi0gICAgaWYgKChkZWZpbml0aW9uLmdldEltcG9ydHMoKSA9PSBudWxsKQotICAgICAgfHwgKGRlZmluaXRpb24uZ2V0SW1wb3J0cygpLnNpemUoKSA9PSAwKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIEVsc2UgYW5hbHl6ZSB0aGUgCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHByb2Nlc3NXU0RMKGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotCi0gICAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgICB0cmF2ZXJzYWwudmlzaXRJbXBvcnQodHJ1ZSk7Ci0KLSAgICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgICB0cmF2ZXJzYWwudHJhdmVyc2UoCi0gICAgICAgIChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCFpbXBvcnRGb3VuZCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoKLSAgICogdGhlIG1ldGhvZCBsb2FkcyBXU0RMIGFuZCBjaGVjayBzdHJ1Y3R1cmUKLSAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAqLwotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1dTREwoU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gcGFyc2VzIFdTREwKLSAgICAgIERvY3VtZW50IGRvYyA9IHZhbGlkYXRvci5wYXJzZVhNTERvY3VtZW50VVJMKGxvY2F0aW9uLCBudWxsKTsKLSAgICAgIGNoZWNrV1NETChkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOyAvLyBnZXQgZGVmaW5pdGlvbgotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgLy8gQUREOiBhZGQgZXhjZXB0aW9uIGhhbmRsaW5nCi0gICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbigiMjEwNSAtIFdTREwgbG9hZCBmYWlsZWQiKTsKLSAgICAgIGVycm9ycy5hZGQodC50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICAvKgotICAgKiBDcmVhdGUgZmFsdXJlIHJlcG9ydCBjb250YWlucyBpbmZvcm1hdGlvbiBvZiBub2RlLgotICAgKiBAcGFyYW0gcm9vdAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZhaWxlZChOb2RlIHJvb3QpCi0gIHsKLSAgICBBdHRyIGEgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoKEVsZW1lbnQpIHJvb3QsIEFUVFJfV1NETF9MT0NBVElPTik7Ci0gICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uID0gKGEgIT0gbnVsbCkgPyBhLmdldFZhbHVlKCkgOiAiIjsKLSAgICBhID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKChFbGVtZW50KSByb290LCBBVFRSX1dTRExfTkFNRVNQQUNFKTsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gKGEgIT0gbnVsbCkgPyBhLmdldFZhbHVlKCkgOiAiIjsKLSAgICBlcnJvcnMuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIHNjaGVtYUxvY2F0aW9uKSk7Ci0gIH0KLQotICAvKgotICAgKiBDaGVjayB3c2RsIGNvcnJlc3BvbnMgYXNzZXJ0aW9uIGRlc2NyaXB0aW9uLgotICAqIEBwYXJhbSByb290IC0gZGVmaW5pdGlvbgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrV1NETChOb2RlIHJvb3QpCi0gIHsKLSAgICBpZiAocm9vdCAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGltcG9ydCBlbGVtZW50Ci0gICAgICBFbGVtZW50IGltID0gWE1MVXRpbHMuZmluZENoaWxkRWxlbWVudCgoRWxlbWVudCkgcm9vdCwgV1NETF9JTVBPUlQpOwotCi0gICAgICAvLyBEZXRlcm1pbmUgaWYgYSBkb2N1bWVudGF0aW9uIGVsZW1lbnQgaXMgcHJlc2VudCBpbiB0aGUgV1NETCBkb2N1bWVudAotICAgICAgYm9vbGVhbiBkb2N1bWVudElzUHJlc2VudCA9Ci0gICAgICAgIChYTUxVdGlscy5maW5kQ2hpbGRFbGVtZW50KChFbGVtZW50KSByb290LCBXU0RMX0RPQ1VNRU5UQVRJT04pCi0gICAgICAgICAgIT0gbnVsbCk7Ci0KLSAgICAgIC8vIFZlcmlmeSB0aGF0IGFsbCBpbXBvcnQgZWxlbWVudHMgb2NjdXIgYWZ0ZXIgYSBkb2N1bWVudGF0aW9uIGVsZW1lbnQKLSAgICAgIHdoaWxlIChpbSAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBGaW5kIGVsZW1lbnRzIHRoYXQgYXJlIHByZXZpb3VzIHRvIHRoZSBpbXBvcnQgZWxlbWVudAotICAgICAgICBFbGVtZW50IGVsID0gWE1MVXRpbHMuZmluZFByZXZpb3VzU2libGluZyhpbSk7Ci0gICAgICAgIGlmIChlbCAhPSBudWxsKQotICAgICAgICAgIHdoaWxlIChpc0V4dGVuc2liaWxpdHlFbGVtZW50KGVsKSAmJiBlbCAhPSBudWxsKQotICAgICAgICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICAgICAgICAgIGVsID0gWE1MVXRpbHMuZmluZFByZXZpb3VzU2libGluZyhlbCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIHdzZGw6ZG9jdW1lbnQgZWxlbW50IGlzIHByZXNlbnQKLSAgICAgICAgaWYgKGRvY3VtZW50SXNQcmVzZW50ICYmIGVsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIVhNTFV0aWxzLmVxdWFscyhlbCwgV1NETF9ET0NVTUVOVEFUSU9OKSAmJiAhWE1MVXRpbHMuZXF1YWxzKGVsLCBXU0RMX0lNUE9SVCkpCi0gICAgICAgICAgICBjcmVhdGVGYWlsZWQocm9vdCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbHNlIGNoZWNrIGlmIGl0IGlzIGFub3RoZXIgd3NkbDogZWxlbWVudAotICAgICAgICBlbHNlIGlmIChlbCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgbm90IHRoZSBkZWZpbml0aW9ucyBlbGVtZW50LCB0aGVuIGNoZWNrIGZvciBvdGhlciB3c2RsOiBlbGVtZW50Ci0gICAgICAgICAgaWYgKCFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfREVGSU5JVElPTlMpICYmICFYTUxVdGlscy5lcXVhbHMoZWwsIFdTRExfSU1QT1JUKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZWwuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCkpCi0gICAgICAgICAgICAgIGNyZWF0ZUZhaWxlZChyb290KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIG5leHQgaW1wb3J0IGVsZW1lbnQKLSAgICAgICAgaW0gPSBYTUxVdGlscy5maW5kRWxlbWVudChpbSwgV1NETF9JTVBPUlQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTA3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEwNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWM1ZWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBCUDIxMDcuCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDp0eXBlcyBlbGVtZW50IGNvbnRhaW5pbmcgYW4geHNkOnNjaGVtYSBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB4c2Q6c2NoZW1hIGVsZW1lbnQgY29udGFpbnMgYSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlIHdpdGggYSB2YWxpZCBhbmQgbm9uLW51bGwgdmFsdWUgdW5sZXNzIHRoZSB4c2Q6c2NoZW1hIGVsZW1lbnQgaGFzIHhzZDppbXBvcnQgYW5kL29yIHhzZDphbm5vdGF0aW9uIGFzIGl0cyBvbmx5IGNoaWxkIGVsZW1lbnQocykuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjEwNyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjEwNyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHNjaGVtYUZvdW5kID0gZmFsc2U7Ci0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLSAgcHJpdmF0ZSBTdHJpbmcgY29udGV4dDsKLQotICAvKiAKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgVHlwZXMgdCA9IChUeXBlcykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICBMaXN0IGV4dHMgPSB0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGlmIChleHRzICE9IG51bGwpCi0gICAgewotICAgICAgY29udGV4dCA9Ci0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLmdldERvY3VtZW50QmFzZVVSSSgpOwotICAgICAgSXRlcmF0b3IgaXQgPSBleHRzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlbCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotICAgICAgICBpZiAoZWwgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgICAgc2VhcmNoRm9yU2NoZW1hKCgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbCkuZ2V0RWxlbWVudCgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwkJCSAgY29udGV4dCA9IGVudHJ5Q29udGV4dC5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLmdldERvY3VtZW50QmFzZVVSSSgpOwotICAgIC8vCQkJICBwcm9jZXNzV1NETChlbnRyeUNvbnRleHQuZ2V0V1NETERvY3VtZW50KCkuZ2V0RmlsZW5hbWUoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICghc2NoZW1hRm91bmQpCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoKLSAgICogQ2hlY2sgbm9kZSBzY2hlbWEgb3IgbG9hZCBzY2hlbWEgZnJvbSBpbm1wb3J0IGlmIGl0IGV4aXN0cyBhbmQgcHJvY2VzcyBpdC4gCi0gICAqIEBwYXJhbSBuIC0gbm9kZQotICAqLwotICBwcml2YXRlIHZvaWQgc2VhcmNoRm9yU2NoZW1hKE5vZGUgbikKLSAgewotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gc2VhcmNoZXMgZm9yIHhzZDppbXBvcnQgZWxlbWVudAotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgeHNkOnNjaGVtYSBlbGVtZW50IGlzIGZvdW5kIC0+IHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgewotICAgICAgICAgIHNjaGVtYUZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICBwcm9jZXNzU2NoZW1hKG4sIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLy8gaWYgeHNkOmltcG9ydCBlbGVtZW50IGlzIGZvdW5kIC0+IGxvYWQgc2NoZW1hIGFuZCBwcm9jZXNzIHNjaGVtYQotICAgICAgICAgIC8vaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICAgIC8vICBsb2FkU2NoZW1hKG4pOwotICAgICAgICAgIC8vZWxzZQotICAgICAgICAgIC8vIGVsc2UgaXRlcmF0ZSBlbGVtZW50IHJlY3Vyc2l2ZWx5Ci0gICAgICAgICAgc2VhcmNoRm9yU2NoZW1hKG4uZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIExvYWQgc2NoZW1hIGFuZCBwcm9jZXNzIGl0LgotICAgKiBAcGFyYW0gaW1wb3J0Tm9kZSAtIHhzZDppbXBvcnQgZWxlbWVudAotICAqLwotICBwcml2YXRlIHZvaWQgbG9hZFNjaGVtYShOb2RlIGltcG9ydE5vZGUpCi0gIHsKLSAgICBFbGVtZW50IGltID0gKEVsZW1lbnQpIGltcG9ydE5vZGU7Ci0gICAgQXR0ciBzY2hlbWFMb2NhdGlvbiA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04pOwotICAgIC8vIHRyeSB0byBwYXJzZSBpbXBvcnRlZCBYU0QKLSAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpICE9IG51bGwpCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgYW55IGVycm9yIG9yIHJvb3QgZWxlbWVudCBpcyBub3QgWFNEIHNjaGVtYSAtPiBlcnJvcgotICAgICAgICBEb2N1bWVudCBzY2hlbWEgPQotICAgICAgICAgIHZhbGlkYXRvci5wYXJzZVhNTERvY3VtZW50VVJMKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpOwotICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKHNjaGVtYS5nZXREb2N1bWVudEVsZW1lbnQoKSwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgewotICAgICAgICAgIEF0dHIgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfTkFNRVNQQUNFKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gKGEgIT0gbnVsbCkgPyBhLmdldFZhbHVlKCkgOiAiIjsKLSAgICAgICAgICBwcm9jZXNzU2NoZW1hKHNjaGVtYS5nZXREb2N1bWVudEVsZW1lbnQoKSwgbmFtZXNwYWNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgICAvLyBub3RoaW5nLiBpdCdzIG5vdCBhIHNjaGVtYQotICAgICAgfQotICB9Ci0KLSAgLyoKLSAgICogQ3JlYXRlIGZhbHVyZSByZXBvcnQgaWYgaXQncyBub3QgY29ycmVzcG9ucyBhc3NlcnRpb24gZGVzY3JpcHRpb24uCi0gICAqIEBwYXJhbSBzY2hlbWEgLSB4c2Q6c2NoZW1hCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBuYW1lc3BhY2Ugb2Ygc2NoZW1hCi0gICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzU2NoZW1hKE5vZGUgc2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgQXR0ciBhID0KLSAgICAgIFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgc2NoZW1hLCBBVFRSX1hTRF9UQVJHRVROQU1FU1BBQ0UpOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6IG51bGw7Ci0KLSAgICBOb2RlIG4gPSBzY2hlbWEuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIC8vCSAgICEhIHdlIHN1cHBvc2UgdGhhdCB4c2Q6aW1wb3J0IGVsZW1lbnQgaXMgb2NjdXJlZCBvbmx5IHdpdGhpbiB4c2Q6c2NoZW1hIGVsZW1lbnQKLSAgICBib29sZWFuIGNvbnRhaW5zT25seUltcG9ydEFuZEFubm90YXRpb24gPSB0cnVlOwotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgY29udGFpbnNPbmx5SW1wb3J0QW5kQW5ub3RhdGlvbgotICAgICAgICAgICY9IChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfSU1QT1JUKQotICAgICAgICAgICAgfHwgWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX0FOTk9UQVRJT04pKTsKLSAgICAgIH0KLQotICAgICAgLy9pZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpICYmIFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgLy8JbG9hZFNjaGVtYShuKTsKLQotICAgICAgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyBub3Qgc2V0IGFuZCB0aGVyZSBhcmUgZWxlbWVudHMgaW4gYWRkaXRpb24gdG8gaW1wb3J0IGFuZCBhbm5vdGF0aW9uLCB0aGVuIGVycm9yCi0gICAgaWYgKCh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCB8fCB0YXJnZXROYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICYmICghY29udGFpbnNPbmx5SW1wb3J0QW5kQW5ub3RhdGlvbikpCi0gICAgewotICAgICAgZXJyb3JzLmFkZCh0YXJnZXROYW1lc3BhY2UsIFhNTFV0aWxzLnNlcmlhbGl6ZSgoRWxlbWVudCkgc2NoZW1hKSk7Ci0gICAgfQotCi0gICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsICYmICFuYW1lc3BhY2UuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSkpCi0gICAgewotICAgICAgZXJyb3JzLmFkZChuYW1lc3BhY2UsIFhNTFV0aWxzLnNlcmlhbGl6ZSgoRWxlbWVudCkgc2NoZW1hKSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzMzZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UeXBlc1JlZ2lzdHJ5OwotCi0KLS8qKgotCSAqIEJQMjEwOC4KLSAgICAgKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDp0eXBlcywgd2l0aCBBcnJheSBkZWNsYXJhdGlvbnMgZWl0aGVyIGxvY2FsbHkgZGVmaW5lZCBvciBmcm9tIGFuIGltcG9ydGVkIGRlc2NyaXB0aW9uPC9jb250ZXh0PgotICAgICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgdHlwZSBzb2FwZW5jOkFycmF5IGRvZXMgbm90IGFwcGVhciBpbiB0aGVzZSBkZWNsYXJhdGlvbnMsIGFuZCB0aGUgd3NkbDphcnJheVR5cGUgYXR0cmlidXRlIGlzIG5vdCB1c2VkIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0JICovCi1wdWJsaWMgY2xhc3MgQlAyMTA4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTA4KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyogCi0gICAqIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIFR5cGVzIHQgPSAoVHlwZXMpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICAvLyBTZWFyY2ggdGhlIGRlZmluaXRpb25zIGluIENhbmRpZGF0ZUluZm8gdG8gbG9jYXRlIHRoZSBkZWZpbml0aW9uIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHR5cGVzIGVsZW1lbnQKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotICAgIGlmICgoZGVmaW5pdGlvbiA9IHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb24odCkpCi0gICAgICA9PSBudWxsKQotICAgIHsKLSAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMgdGhlbiB0aHJvdyBhbiBleGVjcHRpb24KLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2NhdGUgdHlwZXMgZWxlbWVudCBkZWZpbml0aW9uLiIpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgICAgdCwKLSAgICAgICAgICBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpLAotICAgICAgICAgIHZhbGlkYXRvcik7Ci0KLSAgICAgIEl0ZXJhdG9yIGl0ID0gcmVnaXN0cnkuZ2V0QXJyYXlUeXBlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgICBlcnJvcnMuYWRkKChRTmFtZSkgaXQubmV4dCgpKTsKLQotICAgICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5YjZmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci0KLQotLyoqCi0gKiBCUDIxMTAuCi0gICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOnR5cGVzPC9jb250ZXh0PgotICAgKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QXJyYXkgZGVjbGFyYXRpb24gd3JhcHBlciBlbGVtZW50cyBkb2VzIG5vdCB1c2UgdGhlIG5hbWluZyBjb252ZW50aW9uIEFycmF5T2ZYWFguPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjExMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjExMChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1dBUk5JTkc7Ci0KLSAgICBUeXBlcyB0ID0gKFR5cGVzKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gU2VhcmNoIHRoZSBkZWZpbml0aW9ucyBpbiBDYW5kaWRhdGVJbmZvIHRvIGxvY2F0ZSB0aGUgZGVmaW5pdGlvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCB0eXBlcyBlbGVtZW50Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICBpZiAoKGRlZmluaXRpb24gPSB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXREZWZpbml0aW9uKHQpKQotICAgICAgPT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBpZiBpdCBkb2VzIHRoZW4gdGhyb3cgYW4gZXhlY3B0aW9uCi0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9jYXRlIHR5cGVzIGVsZW1lbnQgZGVmaW5pdGlvbi4iKTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSA9Ci0gICAgICAgIG5ldyBUeXBlc1JlZ2lzdHJ5KAotICAgICAgICAgIHQsCi0gICAgICAgICAgZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSwKLSAgICAgICAgICB2YWxpZGF0b3IpOwotCi0gICAgICBJdGVyYXRvciBpdCA9IHJlZ2lzdHJ5LmdldEVsZW1lbnRMaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFFOYW1lIHR5cGUgPSAoUU5hbWUpIGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKHR5cGUuZ2V0TG9jYWxQYXJ0KCkuc3RhcnRzV2l0aCgiQXJyYXlPZiIpKQotICAgICAgICAgIGVycm9ycy5hZGQodHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDk0MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotICogQlAyMTExLgotICAgKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nLCB3aGljaCBjb250YWlucyBhIGRvY3VtZW50LWxpdGVyYWwgc29hcDpiaW5kaW5nPC9jb250ZXh0PgotICAgKiAKLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPklmIHRoZSAicGFydHMiIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQocykgaGF2ZSBhdCBtb3N0IG9uZSBwYXJ0IGxpc3RlZCBpbiB0aGUgcGFydHMgYXR0cmlidXRlLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMTEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTExKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZG9jTGl0ZXJhbEZvdW5kID0gZmFsc2U7Ci0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiAKLSAgICogUHV0IGluIGNvbnRleHQgc29hcCBiaW5kaW5nJ3Mgc3R5bGUKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQQmluZGluZyBiaW5kaW5nLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0KLSAgICAgIChiaW5kaW5nLmdldFN0eWxlKCkgPT0gbnVsbCkKLSAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgIDogYmluZGluZy5nZXRTdHlsZSgpOwotICAgIGN0eC5hZGRQYXJhbWV0ZXIoInN0eWxlIiwgc3R5bGUpOwotICB9Ci0KLSAgLyogCi0gICAqIFZlcmlmeSBzdHlsZSBvZiBzb2FwIG9wZXJhdGlvbiBpcyAiZG9jdW1lbnQiIGlmIG5vdCB0aGVuIGl0J3MgY2FuY2VsZWQgcHJvY2Vzcy4gCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgPT0gbnVsbCkKLSAgICAgIHN0eWxlID0gKFN0cmluZykgY3R4LmdldFBhcmFtZXRlcigic3R5bGUiKTsKLSAgICAvLyBhc3NlcnQgc3R5bGUgIT0gbnVsbAotICAgIGlmICghV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQy5lcXVhbHMoc3R5bGUpKQotICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gIH0KLQotICAvKiAKLSAgICogSWYgdXNlIG9mIHNvYXAgYm9keSBpcyAibGl0ZXJhbCIgYW5kIHBhcnRzIG9mIHNvYXAgYm9keSBpcyBtb3JlIHRoYW4gb25lIGl0IGNyZWF0ZXMgZmFsdXJlIHJlcG9ydC4gCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IGJvZHksIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIGFzc2VydCBzdHlsZSA9PSAiZG9jdW1lbnQiCi0gICAgaWYgKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElULmVxdWFscyhib2R5LmdldFVzZSgpKSkKLSAgICB7Ci0gICAgICBkb2NMaXRlcmFsRm91bmQgPSB0cnVlOwotCi0gICAgICBMaXN0IHBhcnRzID0gYm9keS5nZXRQYXJ0cygpOwotICAgICAgaWYgKHBhcnRzICE9IG51bGwgJiYgcGFydHMuc2l6ZSgpID4gMSkKLSAgICAgICAgLy9ob3cgdG8gcGljayBvdXQgb25lIGJvZHkgZnJvbSBhbm90aGVyIG9uZSA/CQkJCQkJCi0gICAgICAgIGVycm9ycy5hZGQoYm9keS5nZXRFbGVtZW50VHlwZSgpLCBib2R5LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKiAKLSAgICogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7OwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBCaW5kaW5nKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBCb2R5KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBPcGVyYXRpb24odHJ1ZSk7Ci0KLSAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVJbXBvcnQoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoIWRvY0xpdGVyYWxGb3VuZCkKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5YTNiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTRExVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSAqIEJQMjExMi4KLSAgICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6YmluZGluZywgd2l0aCBhIHN0eWxlICJycGMiIGF0dHJpYnV0ZSBhbmQgY29udGFpbmluZyBhdCBsZWFzdCBhIHNvYXBiaW5kOmJvZHkgZWxlbWVudDwvY29udGV4dD4KLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPk5vIHdzZGw6cGFydCByZWZlcnJlZCBieSBzdWNoIGEgc29hcGJpbmQ6Ym9keSBlbGVtZW50IGlzIGRlZmluZWQgdXNpbmcgdGhlICJlbGVtZW50IiBhdHRyaWJ1dGUuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjExMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMTIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBycGNMaXRlcmFsRm91bmQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotICBwcml2YXRlIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0KLSAgLyogCi0gICAqIFB1dCBpbiBjb250ZXh0IHNvYXAgYmluZGluZydzIHN0eWxlCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUEJpbmRpbmcgYmluZGluZywKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIFN0cmluZyBzdHlsZSA9Ci0gICAgICAoYmluZGluZy5nZXRTdHlsZSgpID09IG51bGwpCi0gICAgICAgID8gV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQwotICAgICAgICA6IGJpbmRpbmcuZ2V0U3R5bGUoKTsKLSAgICBjdHguYWRkUGFyYW1ldGVyKCJiaW5kaW5nU3R5bGUiLCBzdHlsZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBCaW5kaW5nT3BlcmF0aW9uIG9wLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlbW92ZVBhcmFtZXRlcigib3BlcmF0aW9uU3R5bGUiKTsKLSAgfQotCi0gIC8qIAotICAgKiBWZXJpZnkgc3R5bGUgb2Ygc29hcCBvcGVyYXRpb24gaXMgInJwYyIgaWYgbm90IHRoZW4gaXQncyBjYW5jZWxlZCBwcm9jZXNzLiAKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5hZGRQYXJhbWV0ZXIoIm9wZXJhdGlvblN0eWxlIiwgb3BlcmF0aW9uLmdldFN0eWxlKCkpOwotICB9Ci0KLSAgLyogCi0gICAqIElmIHVzZSBvZiBzb2FwIGJvZHkgaXMgImxpdGVyYWwiIGFuZCBpZiBhdCBsZWFzdCBvbmUgcGFydCBpcyBkZWZpbmUgdXNpbmcgImVsZW1lbnQiIGF0dHJpYnV0ZSBpdCBjcmVhdGVzIGZhbHVyZSByZXBvcnQuICAgIAotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHksIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQm9keSBib2R5LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgb3BTdHlsZSA9IChTdHJpbmcpIGN0eC5nZXRQYXJhbWV0ZXIoIm9wZXJhdGlvblN0eWxlIik7Ci0gICAgU3RyaW5nIGJTdHlsZSA9IChTdHJpbmcpIGN0eC5nZXRQYXJhbWV0ZXIoImJpbmRpbmdTdHlsZSIpOwotCi0gICAgaWYgKChvcFN0eWxlID09IG51bGwKLSAgICAgICAgJiYgIVdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMuZXF1YWxzKGJTdHlsZSkpCi0gICAgICB8fCAob3BTdHlsZSAhPSBudWxsIAotICAgICAgCSYmICFXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDLmVxdWFscyhvcFN0eWxlKSkpCi0gICAgewotICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIGFzc2VydCB1c2UgPT0gImxpdGVyYWwiCi0gICAgaWYgKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElULmVxdWFscyhib2R5LmdldFVzZSgpKSkKLSAgICB7Ci0gICAgICBycGNMaXRlcmFsRm91bmQgPSB0cnVlOwotCi0gICAgICAvLyBmaW5kIGNvcnJlc3BvbmRpbmcgbWVzc2FnZQotICAgICAgT3BlcmF0aW9uIG9wID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKTsKLSAgICAgIC8vIGlmIHNvbWUgbGlua3MgYXJlIGJyb2tlbiwgY2FuY2VsIHByb2Nlc3NpbmcKLSAgICAgIGlmIChvcCA9PSBudWxsCi0gICAgICAgIHx8IChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQgJiYgb3AuZ2V0SW5wdXQoKSA9PSBudWxsKQotICAgICAgICB8fCAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCAmJiBvcC5nZXRPdXRwdXQoKSA9PSBudWxsKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBNZXNzYWdlIG0gPQotICAgICAgICAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotICAgICAgICAgID8gb3AuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICA6IG9wLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgIC8vIFJFTU9WRTogY3VycmVudCBtZXNzYWdlIHNob3VsZCBlcXVhbHMgdG8gbWVzc2FnZSBnaXZlbiBhcyBlbnRyeQotICAgICAgLy9pZiAobSA9PSBudWxsIHx8IG1lc3NhZ2UgIT0gbSkKLSAgICAgIGlmIChtID09IG51bGwpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgTGlzdCBwYXJ0cyA9Ci0gICAgICAgIFdTRExVdGlsLmdldFBhcnRzKAotICAgICAgICAgIG9wLAotICAgICAgICAgIG0sCi0gICAgICAgICAgYm9keSwKLSAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDKTsKLSAgICAgIGlmIChwYXJ0cyA9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIC8qIGNoZWNrIHdoZXRoZXIgcGFydHMgbGlzdCBjb250YWlucyBhIHBhcnRzIHdoaWNoIHVzZXMKLSAgICAgICAqIGVsZW1lbnQgYXR0cmlidXRlLiBJZiBzbywgcGFydCBuYW1lIHdpbGwgYmUgYWRkZWQgaW50bwotICAgICAgICogZXJyb3JzIHNldC4KLSAgICAgICAqLwotICAgICAgSXRlcmF0b3IgaXQgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSAhPSBudWxsKQotICAgICAgICAgIGVycm9ycy5hZGQocGFydC5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIAotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgLy8gc2F2ZSBtZXNzYWdlIAotICAgIC8vbWVzc2FnZSA9IChNZXNzYWdlKWVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCk7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTs7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJpbmRpbmcodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0QmluZGluZ09wZXJhdGlvbih0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQT3BlcmF0aW9uKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBCb2R5KHRydWUpOwotCi0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0KLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgZWxzZSBpZiAoIXJwY0xpdGVyYWxGb3VuZCkKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzMWNkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuV1NETFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotICogQlAyMTEzLgotICAgKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgc29hcGJpbmQ6aGVhZGVyLCBzb2FwYmluZDpoZWFkZXJmYXVsdCBhbmQgc29hcGJpbmQ6ZmF1bHQgZWxlbWVudHMgb25seSByZWZlciB0byB3c2RsOnBhcnQgZWxlbWVudChzKSB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIHVzaW5nIHRoZSAiZWxlbWVudCIgYXR0cmlidXRlLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMTMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTEzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyogCi0gICAqIFZlcmlmeSBzb2FwIGhlYWRlciB1c2VzIHBhcnQgaXMgZGVmaW5lIHVzaW5nICJlbGVtZW50IiBhdHRyaWJ1dGUgICAKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXIsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQSGVhZGVyIGhlYWRlciwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIERlZmluaXRpb24gZCA9IChEZWZpbml0aW9uKSBjdHguZ2V0UGFyYW1ldGVyKCJkZWZpbml0aW9uIik7Ci0gICAgTWVzc2FnZSBtID0gZC5nZXRNZXNzYWdlKGhlYWRlci5nZXRNZXNzYWdlKCkpOwotICAgIGlmIChtICE9IG51bGwpCi0gICAgICBjaGVja1BhcnQobS5nZXRQYXJ0KGhlYWRlci5nZXRQYXJ0KCkpLCBjdHguZ2V0QmluZGluZygpKTsKLSAgfQotCi0gIC8qIAotICAgKiBWZXJpZnkgc29hcCBoZWFkZXJmYXVsdCB1c2VzIHBhcnQgaXMgZGVmaW5lIHVzaW5nICJlbGVtZW50IiBhdHRyaWJ1dGUKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXJGYXVsdCBmYXVsdCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIERlZmluaXRpb24gZCA9IChEZWZpbml0aW9uKSBjdHguZ2V0UGFyYW1ldGVyKCJkZWZpbml0aW9uIik7Ci0gICAgTWVzc2FnZSBtID0gZC5nZXRNZXNzYWdlKGZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgLy8gaWYgbWVzc2FnZSBvciBwYXJ0IGlzIG5vdCBmb3VuZCAtIE5PVF9BUFBMSUNBQkxFID8/Pz8KLSAgICBpZiAobSAhPSBudWxsKQotICAgICAgY2hlY2tQYXJ0KG0uZ2V0UGFydChmYXVsdC5nZXRQYXJ0KCkpLCBjdHguZ2V0QmluZGluZygpKTsKLSAgfQotCi0gIC8qIAotICAgKiBWZXJpZnkgc29hcCBmYXVsdCB1c2VzIHBhcnQgaXMgZGVmaW5lIHVzaW5nICJlbGVtZW50IiBhdHRyaWJ1dGUKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBGYXVsdCBmYXVsdCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICBpZiAoZmF1bHROYW1lID09IG51bGwpCi0gICAgICBmYXVsdE5hbWUgPSBjdHguZ2V0QmluZGluZ0ZhdWx0KCkuZ2V0TmFtZSgpOwotICAgIE9wZXJhdGlvbiBvcCA9IGN0eC5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0T3BlcmF0aW9uKCk7Ci0gICAgaWYgKG9wID09IG51bGwgLyogfHwgZmF1bHROYW1lID09IG51bGwqLwotICAgICAgKSAvLyBtYXkgYmUgaXQncyBwb3NzaWJsZSB0byBoYXZlIGxlZ2FsIGZhdWx0IHdpdGggbnVsbCBuYW1lCi0gICAgICByZXR1cm47Ci0gICAgLy8gd2Ugc3VwcG9zZSB0aGF0IFNPQVBGYXVsdC5nZXROYW1lKCkgY29ycmVzcG9uZHMgdG8gdGhlIGFic3RyYWN0IG9wZXJhdGlvbidzIGZhdWx0IG5hbWUJCQkKLSAgICBGYXVsdCBmID0gb3AuZ2V0RmF1bHQoZmF1bHROYW1lKTsKLSAgICBpZiAoZiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIE1lc3NhZ2UgbSA9IGYuZ2V0TWVzc2FnZSgpOwotICAgIC8vIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgb25seSBvbmUgcGFydAotICAgIGlmIChtID09IG51bGwgfHwgbS5nZXRQYXJ0cygpID09IG51bGwgfHwgbS5nZXRQYXJ0cygpLnNpemUoKSAhPSAxKQotICAgICAgcmV0dXJuOwotICAgIGNoZWNrUGFydCgoUGFydCkgbS5nZXRPcmRlcmVkUGFydHMobnVsbCkuZ2V0KDApLCBjdHguZ2V0QmluZGluZygpKTsKLSAgfQotCi0gIC8qCi0gICAqIFZlcmlmeSBwYXJ0IGlzIGRlZmluZSB1c2luZyAiZWxlbWVudCIgYXR0cmlidXRlLgotICAgKiBAcGFyYW0gcCAtIHBhcnQKLSAgICogQHBhcmFtIGIgLSBiaW5kaW5nCi0gICovCi0gIC8vIHJlZmFjdG9yaW5nCi0gIHByaXZhdGUgdm9pZCBjaGVja1BhcnQoUGFydCBwLCBCaW5kaW5nIGIpCi0gIHsKLSAgICBpZiAocCAhPSBudWxsICYmIHAuZ2V0RWxlbWVudE5hbWUoKSA9PSBudWxsKQotICAgICAgZXJyb3JzLmFkZChiLmdldFFOYW1lKCksIHAuZ2V0TmFtZSgpKTsKLSAgfQotCi0gIC8qIAotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTs7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEhlYWRlcih0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQSGVhZGVyRmF1bHQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEZhdWx0KHRydWUpOwotCi0gICAgTWFwIG0gPSBuZXcgSGFzaE1hcCgpOwotICAgIERlZmluaXRpb24gZGVmID0gZW50cnlDb250ZXh0LmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCk7Ci0gICAgV1NETFV0aWwuZXhwYW5kRGVmaW5pdGlvbihkZWYpOwotICAgIG0ucHV0KCJkZWZpbml0aW9uIiwgZGVmKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCksIG0pOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjU0OWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMTQuCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiAKLSAqIAotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkV2ZXJ5IHdzZGw6cGFydCBmcm9tIGVhY2ggd3NkbDptZXNzYWdlIGluIHRoZSBhc3NvY2lhdGVkIAotICogd3NkbDpwb3J0VHlwZSBpcyByZWZlcmVuY2VkIGVpdGhlciBieSB0aGUgc29hcGJpbmQ6Ym9keSwgc29hcGJpbmQ6aGVhZGVyLCAKLSAqIHNvYXBiaW5kOmZhdWx0LCBvciBzb2FwYmluZDpoZWFkZXJmYXVsdC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTE0IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjExNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotICAvLyBtYXAgTWVzc2FnZSBRTmFtZSAtPiBzZXQoUGFydCBuYW1lKQotICBwdWJsaWMgTWFwIG1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKiAKLSAgICogQWRkIHRvIE1hcCBwYXJ0cyB3aGljaCB1c2VkIGJ5IG1lc3NhZ2UKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuTWVzc2FnZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE1lc3NhZ2UgbSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKG0gIT0gbnVsbAotICAgICAgJiYgIW1lc3NhZ2VzLmNvbnRhaW5zS2V5KG0pCi0gICAgICAmJiBtLmdldE9yZGVyZWRQYXJ0cyhudWxsKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFNldCBzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gbS5nZXRPcmRlcmVkUGFydHMobnVsbCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgIHMuYWRkKCgoUGFydCkgaXQubmV4dCgpKS5nZXROYW1lKCkpOwotCi0gICAgICAvL21lc3NhZ2VzLnB1dChtLmdldFFOYW1lKCksIHMpOwotICAgICAgaWYgKHMuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZXMucHV0KG0uZ2V0UU5hbWUoKSwgcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogCi0gICAqIFB1dCBpbiBjb250ZXh0IHN0eWxlIG9mIHNvYXAgYmluZGluZwotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmcsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQQmluZGluZyBiaW5kaW5nLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0KLSAgICAgIChiaW5kaW5nLmdldFN0eWxlKCkgPT0gbnVsbCkKLSAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgIDogYmluZGluZy5nZXRTdHlsZSgpOwotICAgIGN0eC5hZGRQYXJhbWV0ZXIoInN0eWxlIiwgc3R5bGUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0gb3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgaWYgKHN0eWxlICE9IG51bGwpCi0gICAgICBjdHguYWRkUGFyYW1ldGVyKCJzdHlsZSIsIHN0eWxlKTsKLSAgfQotCi0gIC8qIAotICAgKiBSZW1vdmUgcGFydHMgb2Ygc29hcCBib2R5IGZyb20gTWFwLiAgCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IGJvZHksIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIFN0cmluZyBzdHlsZSA9IChTdHJpbmcpY3R4LmdldFBhcmFtZXRlcigic3R5bGUiKTsKLQotICAgIC8vIGZpbmQgY29ycmVzcG9uZGluZyBtZXNzYWdlCi0gICAgT3BlcmF0aW9uIG9wID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKTsKLSAgICAvLyBpZiBzb21lIGxpbmtzIGFyZSBicm9rZW4sIGNhbmNlbCBwcm9jZXNzaW5nCi0gICAgaWYgKG9wID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgTWVzc2FnZSBtID0gbnVsbDsKLSAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotICAgIHsKLSAgICAgIGlmIChvcC5nZXRJbnB1dCgpID09IG51bGwpCi0gICAgICAgIHJldHVybjsKLSAgICAgIG0gPSBvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkKLSAgICB7Ci0gICAgICBpZiAob3AuZ2V0T3V0cHV0KCkgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgbSA9IG9wLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgaWYgKG0gPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLQotICAgIC8vIGdldCBwYXJ0cwotICAgIExpc3QgcGFydHMgPSBXU0RMVXRpbC5nZXRQYXJ0cyhvcCwgbSwgYm9keSwgbnVsbCk7Ci0gICAgaWYgKHBhcnRzID09IG51bGwpCi0gICAgICByZXR1cm47Ci0KLSAgICAvLyBpdGVyYXRlIGFsbCBwYXJ0cyBhbmQgY2hlY2sKLSAgICBJdGVyYXRvciBpdCA9IHBhcnRzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHJlbW92ZVBhcnQobS5nZXRRTmFtZSgpLCAoKFBhcnQpIGl0Lm5leHQoKSkuZ2V0TmFtZSgpKTsKLSAgfQotCi0gIC8qIAotICAgKiBSZW1vdmUgcGFydHMgb2Ygc29hcCBoZWFkZXIgZnJvbSBNYXAuCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUEhlYWRlciBoZWFkZXIsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICAvLyB3ZSBzdXBwb3NlIHRoYXQgaXQgcG9zc2libGUgdG8gaGF2ZSBsZWdhbCBtZXNzYWdlIGFuZCBwYXJ0IHdpdGggbnVsbCBuYW1lcwotICAgIC8vIEFUVEVOVElPTgotICAgIC8vIHNob3VsZCB3ZSBhZGQgbWVzc2FnZSB3aGljaCBpcyByZWZlcmVuY2VkIGJ5IGhlYWRlciBvciBoZWFkZXJmYXVsdCB0byBtZXNzYWdlcyA/Ci0gICAgcmVtb3ZlUGFydChoZWFkZXIuZ2V0TWVzc2FnZSgpLCBoZWFkZXIuZ2V0UGFydCgpKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBIZWFkZXJGYXVsdCBmYXVsdCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIHdlIHN1cHBvc2UgdGhhdCBpdCBwb3NzaWJsZSB0byBoYXZlIGxlZ2FsIG1lc3NhZ2UgYW5kIHBhdHIgd2l0aCBudWxsIG5hbWVzCi0gICAgUU5hbWUgbWVzc2FnZU5hbWUgPSBmYXVsdC5nZXRNZXNzYWdlKCk7Ci0gICAgaWYgKG1lc3NhZ2VOYW1lID09IG51bGwpCi0gICAgICBtZXNzYWdlTmFtZSA9IGN0eC5nZXRTT0FQSGVhZGVyKCkuZ2V0TWVzc2FnZSgpOwotICAgIHJlbW92ZVBhcnQobWVzc2FnZU5hbWUsIGZhdWx0LmdldFBhcnQoKSk7Ci0gIH0KLQotICAvKiAKLSAgICogUmVtb3ZlIHBhcnRzIG9mIHNvYXAgZmF1bHQgZnJvbSBNYXAuCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQRmF1bHQgZmF1bHQsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIFN0cmluZyBmYXVsdE5hbWUgPSBmYXVsdC5nZXROYW1lKCk7Ci0gICAgaWYgKGZhdWx0TmFtZSA9PSBudWxsKQotICAgICAgZmF1bHROYW1lID0gY3R4LmdldEJpbmRpbmdGYXVsdCgpLmdldE5hbWUoKTsKLSAgICBPcGVyYXRpb24gb3AgPSBjdHguZ2V0QmluZGluZ09wZXJhdGlvbigpLmdldE9wZXJhdGlvbigpOwotICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgLy8gd2Ugc3VwcG9zZSB0aGF0IFNPQVBGYXVsdC5nZXROYW1lKCkgY29ycmVzcG9uZHMgdG8gdGhlIGFic3RyYWN0IG9wZXJhdGlvbidzIGZhdWx0IG5hbWUgICAgICAgICAgIAotICAgIEZhdWx0IGYgPSBvcC5nZXRGYXVsdChmYXVsdE5hbWUpOwotCi0gICAgLy8gZmF1bHQgbWVzc2FnZSBzaG91bGQgaGF2ZSAxIHBhcnQKLSAgICBpZiAoZiA9PSBudWxsCi0gICAgICB8fCBmLmdldE1lc3NhZ2UoKSA9PSBudWxsCi0gICAgICB8fCBmLmdldE1lc3NhZ2UoKS5nZXRQYXJ0cygpLnNpemUoKSAhPSAxKQotICAgICAgcmV0dXJuOwotCi0gICAgUGFydCBwID0gKFBhcnQpIGYuZ2V0TWVzc2FnZSgpLmdldE9yZGVyZWRQYXJ0cyhudWxsKS5nZXQoMCk7Ci0gICAgcmVtb3ZlUGFydChmLmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpLCBwLmdldE5hbWUoKSk7Ci0gIH0KLQotICAvKgotICAgKiBSZW1vdmUgcGFydCBmcm9tIE1hcC4gCi0gICogQHBhcmFtIG1lc3NhZ2VOYW1lIC0gbWVzc2FnZQotICAqIEBwYXJhbSBwYXJ0TmFtZSAtIHBhcnQKLSAgKi8KLSAgLy8gcmVmYXRvcmluZwotICBwcml2YXRlIHZvaWQgcmVtb3ZlUGFydChRTmFtZSBtZXNzYWdlTmFtZSwgU3RyaW5nIHBhcnROYW1lKQotICB7Ci0gICAgU2V0IHBhcnRzID0gKFNldCkgbWVzc2FnZXMuZ2V0KG1lc3NhZ2VOYW1lKTsKLSAgICBpZiAocGFydHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJ0cy5yZW1vdmUocGFydE5hbWUpOwotICAgICAgaWYgKHBhcnRzLnNpemUoKSA9PSAwKQotICAgICAgICBtZXNzYWdlcy5yZW1vdmUobWVzc2FnZU5hbWUpOwotICAgIH0KLSAgfQotCi0gIC8qIAotICAgKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0TWVzc2FnZSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQm9keSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQSGVhZGVyKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBIZWFkZXJGYXVsdCh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQRmF1bHQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUE9wZXJhdGlvbih0cnVlKTsKLQotICAgIEJpbmRpbmcgYiA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZShiKTsKLQotICAgIGlmIChtZXNzYWdlcy5zaXplKCkgPiAwKQotICAgICAgZXJyb3JzLmFkZChiLmdldFFOYW1lKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORzsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk4Mjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE1LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlR5cGVzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotICogQlAyMTE1LgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6bWVzc2FnZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BbiAiZWxlbWVudCIgYXR0cmlidXRlIG9uIGFueSB3c2RsOnBhcnQgZWxlbWVudCByZWZlcnMgdG8gYSBnbG9iYWwgZWxlbWVudCBkZWNsYXJhdGlvbi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTE1IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjExNShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotICBwcml2YXRlIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuUGFydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBhcnQgcGFydCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSAhPSBudWxsCi0gICAgICAmJiByZWdpc3RyeS5nZXRUeXBlKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlcnJvcnMuYWRkKGN0eC5nZXRNZXNzYWdlKCkuZ2V0UU5hbWUoKSk7Ci0gICAgICBjdHguY2FuY2VsTWVzc2FnZVByb2Nlc3NpbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICByZWdpc3RyeSA9Ci0gICAgICBuZXcgVHlwZXNSZWdpc3RyeSgKLSAgICAgICAgZW50cnlDb250ZXh0LmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCksCi0gICAgICAgIHZhbGlkYXRvcik7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRQYXJ0KHRydWUpOwotCi0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChNZXNzYWdlKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTlmZjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSAqIEJQMjExNi4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOm1lc3NhZ2UgZWxlbWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgd3NkbDptZXNzYWdlIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBwYXJ0IGVsZW1lbnRzIHRoYXQgdXNlIGJvdGggInR5cGUiIGFuZCAiZWxlbWVudCIgYXR0cmlidXRlcy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTE2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLQotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTE2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLlBhcnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBhcnQgcGFydCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSAhPSBudWxsICYmIHBhcnQuZ2V0VHlwZU5hbWUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGVycm9ycy5hZGQoY3R4LmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpKTsKLSAgICAgIGN0eC5jYW5jZWxNZXNzYWdlUHJvY2Vzc2luZygpOwotICAgIH0KLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRQYXJ0KHRydWUpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoTWVzc2FnZSkgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDlmYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMTcuCi0gICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudCwgcmVmZXJyZWQgdG8gYnkgYW4gcnBjLWxpdGVyYWwgc29hcDpiaW5kaW5nPC9jb250ZXh0PgotICAgKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHJwYy1saXRlcmFsIGJpbmRpbmcgZG9lcyBub3QgaGF2ZSBhIG5hbWVzcGFjZSBhdHRyaWJ1dGUgc3BlY2lmaWVkIG9uIGEgY29udGFpbmVkIHNvYXBiaW5kOmhlYWRlciwgc29hcGJpbmQ6aGVhZGVyZmF1bHQsIGFuZCBzb2FwYmluZDpmYXVsdCBlbGVtZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMTcgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTE3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gcnBjTGl0ZXJhbEZvdW5kID0gZmFsc2U7Ci0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgKGJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsKQotICAgICAgICA/IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MKLSAgICAgICAgOiBiaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgY3R4LmFkZFBhcmFtZXRlcigic3R5bGUiLCBzdHlsZSk7Ci0gIH0KLQotICAvKiAKLSAgICogSWYgdXNlIG9mIHNvYXAgYm9keSBpcyAibGl0ZXJhbCIgYW5kIGlmIGF0IGxlYXN0IG9uZSBwYXJ0IGlzIGRlZmluZSB1c2luZyAiZWxlbWVudCIgYXR0cmlidXRlIGl0IGNyZWF0ZXMgZmFsdXJlIHJlcG9ydC4gICAgCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IGJvZHksIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIGFzc2VydCB1c2UgPT0gImxpdGVyYWwiCi0gICAgaWYgKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElULmVxdWFscyhib2R5LmdldFVzZSgpKQotICAgICAgJiYgKChTdHJpbmcpIGN0eC5nZXRQYXJhbWV0ZXIoInN0eWxlIikpLmVxdWFscygKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQykpCi0gICAgewotICAgICAgcnBjTGl0ZXJhbEZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBpZiAoc3R5bGUgPT0gbnVsbCkKLSAgICAgIHN0eWxlID0gKFN0cmluZykgY3R4LmdldFBhcmFtZXRlcigic3R5bGUiKTsKLQotICAgIC8vIGFzc2VydCBzdHlsZSAhPSBudWxsCi0gICAgaWYgKCFXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDLmVxdWFscyhzdHlsZSkpCi0gICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXIsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQSGVhZGVyIGhlYWRlciwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGNoZWNrKGhlYWRlci5nZXRVc2UoKSwgaGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpLCBjdHgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUEhlYWRlckZhdWx0IGZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY2hlY2soZmF1bHQuZ2V0VXNlKCksIGZhdWx0LmdldE5hbWVzcGFjZVVSSSgpLCBjdHgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEZhdWx0IGZhdWx0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjaGVjayhmYXVsdC5nZXRVc2UoKSwgZmF1bHQuZ2V0TmFtZXNwYWNlVVJJKCksIGN0eCk7Ci0gIH0KLQotICAvLyByZWZhY3RvcmluZwotICAvLyBjaGVjayBMSVRFUkFMIHVzZSBhbmQgIT0gbmFtZXNwYWNlCi0gIC8vIGNhbmNlbGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcKLSAgcHJpdmF0ZSB2b2lkIGNoZWNrKFN0cmluZyB1c2UsIFN0cmluZyBuYW1lc3BhY2UsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVC5lcXVhbHModXNlKQotICAgICAgJiYgbmFtZXNwYWNlICE9IG51bGwpCi0gICAgewotICAgICAgZXJyb3JzLmFkZChjdHguZ2V0QmluZGluZygpLmdldFFOYW1lKCkpOwotICAgICAgLy8gICAgICAgICAgICAgIHN1cHByZXNzZXMgc3Vic2VxdWVudCBwcm9jZXNzaW5nLCBiZWNhdXNlIGVycm9yIGxpc3QgY29udGFpbnMgb25seSBmYWlsZWQgYmluZGluZwotICAgICAgY3R4LmNhbmNlbFByb2Nlc3NpbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKiBWYWxpZGF0ZXMgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQQm9keSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQSGVhZGVyKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFNPQVBIZWFkZXJGYXVsdCh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRTT0FQRmF1bHQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUE9wZXJhdGlvbih0cnVlKTsKLQotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICghcnBjTGl0ZXJhbEZvdW5kKQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRhNzMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotICogQlAyMTE4LgotICAgKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgbGlzdCAob3Igc2V0KSBvZiB3c2RsOm9wZXJhdGlvbiBlbGVtZW50cyBmb3IgdGhlIGNvbnRhaW5lZCB3c2RsOmJpbmRpbmcgaXMgdGhlIHNhbWUgYXMgdGhlIGxpc3Qgb2Ygd3NkbDpvcGVyYXRpb25zIGZvciB0aGUgcmVmZXJyZWQgd3NkbDpwb3J0VHlwZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTE4IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLQotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTE4KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5PcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChPcGVyYXRpb24gb3AsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIGFzc2VydCBwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3BlcmF0aW9uCi0gICAgaWYgKG9wID09IG51bGwpCi0gICAgewotICAgICAgZXJyb3JzLmFkZChjdHguZ2V0QmluZGluZygpLmdldFFOYW1lKCkpOwotICAgICAgLy8JCQkJc3VwcHJlc3NlcyBzdWJzZXF1ZW50IHByb2Nlc3NpbmcsIGJlY2F1c2UgZXJyb3IgbGlzdCBjb250YWlucyBvbmx5IGZhaWxlZCBiaW5kaW5nCi0gICAgICBjdHguY2FuY2VsQmluZGluZ1Byb2Nlc3NpbmcoKTsKLSAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgIH0KLSAgfQotCi0gIC8qIFZhbGlkYXRlcyB0aGUgdGVzdCBhc3NlcnRpb24uCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIEJpbmRpbmcgYiA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIC8vIGlmIG9wZXJhdGlvbnMgY291bnQgaW4gcG9ydCB0eXBlIGFuZCBiaW5kaW5nIGlzIGRpZmZlciAtPiBlcnJvcgotICAgIGlmIChiLmdldFBvcnRUeXBlKCkgPT0gbnVsbAotICAgICAgfHwgYi5nZXRQb3J0VHlwZSgpLmdldE9wZXJhdGlvbnMoKS5zaXplKCkKLSAgICAgICAgIT0gYi5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLnNpemUoKSkKLSAgICAgIGVycm9ycy5hZGQoYi5nZXRRTmFtZSgpKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgICAgLy9WaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgICAgdHJhdmVyc2FsLnZpc2l0T3BlcmF0aW9uKHRydWUpOwotICAgICAgdHJhdmVyc2FsLnRyYXZlcnNlKGIpOwotICAgIH0KLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExOS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlMWE4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjExOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMTkuCi0gICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcsIHdoaWNoIGlzIG9mIHR5cGUgZG9jdW1lbnQtbGl0ZXJhbDwvY29udGV4dD4KLSAgICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPklmIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIHBhcnRzIGF0dHJpYnV0ZSBvbiBhIHNvYXBiaW5kOmJvZHkgZWxlbWVudCwgdGhlIGNvcnJlc3BvbmRpbmcgYWJzdHJhY3Qgd3NkbDptZXNzYWdlIGRlZmluZXMgemVybyBvciBvbmUgd3NkbDpwYXJ0LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMTkgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTE5KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZG9jTGl0ZXJhbEZvdW5kID0gZmFsc2U7Ci0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBCaW5kaW5nIGJpbmRpbmcsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBTdHJpbmcgc3R5bGUgPQotICAgICAgKGJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsKQotICAgICAgICA/IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MKLSAgICAgICAgOiBiaW5kaW5nLmdldFN0eWxlKCk7Ci0gICAgY3R4LmFkZFBhcmFtZXRlcigic3R5bGUiLCBzdHlsZSk7Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0gb3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICBzdHlsZSA9IChTdHJpbmcpIGN0eC5nZXRQYXJhbWV0ZXIoInN0eWxlIik7Ci0gICAgLy8gYXNzZXJ0IHN0eWxlICE9IG51bGwKLSAgICBpZiAoIVdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MuZXF1YWxzKHN0eWxlKSkKLSAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJvZHkgYm9keSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHVzZSA9Ci0gICAgICAoYm9keS5nZXRVc2UoKSA9PSBudWxsKQotICAgICAgICA/IFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUCi0gICAgICAgIDogYm9keS5nZXRVc2UoKTsKLQotICAgIC8vIGFzc2VydCBzdHlsZSA9PSAiZG9jdW1lbnQiCi0gICAgaWYgKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElULmVxdWFscyh1c2UpKQotICAgIHsKLSAgICAgIGRvY0xpdGVyYWxGb3VuZCA9IHRydWU7Ci0gICAgICBpZiAoYm9keS5nZXRQYXJ0cygpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIE9wZXJhdGlvbiBvcCA9IGN0eC5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0T3BlcmF0aW9uKCk7Ci0gICAgICAgIGlmIChvcCA9PSBudWxsKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBNYXAgcGFydHMgPSBudWxsOwotICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ0lucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG9wLmdldElucHV0KCkgPT0gbnVsbCB8fCBvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIHBhcnRzID0gb3AuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkuZ2V0UGFydHMoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nT3V0cHV0KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG9wLmdldE91dHB1dCgpID09IG51bGwgfHwgb3AuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgcGFydHMgPSBvcC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkuZ2V0UGFydHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJ0cyAhPSBudWxsICYmIHBhcnRzLnNpemUoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvcnMuYWRkKGN0eC5nZXRCaW5kaW5nKCkuZ2V0UU5hbWUoKSk7Ci0gICAgICAgICAgLy8JCQkJCQlzdXBwcmVzc2VzIHN1YnNlcXVlbnQgcHJvY2Vzc2luZywgYmVjYXVzZSBlcnJvciBsaXN0IGNvbnRhaW5zIG9ubHkgZmFpbGVkIGJpbmRpbmcKLSAgICAgICAgICBjdHguY2FuY2VsQmluZGluZ1Byb2Nlc3NpbmcoKTsKLSAgICAgICAgICBjdHguY2FuY2VsQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICAgICAgICBjdHguY2FuY2VsQmluZGluZ0lucHV0UHJvY2Vzc2luZygpOwotICAgICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3V0cHV0UHJvY2Vzc2luZygpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJpbmRpbmcodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJvZHkodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUE9wZXJhdGlvbih0cnVlKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpKTsKLQotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFkb2NMaXRlcmFsRm91bmQpCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMjAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjcyODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMjAuCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPkVhY2ggb3BlcmF0aW9uIHJlZmVyZW5jZWQgYnkgdGhlIGJpbmRpbmcgcmVzdWx0cyBpbiBhIHVuaXF1ZSB3aXJlIHNpZ25hdHVyZS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMTIwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjEyMChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotICBwcml2YXRlIFNldCB3YXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmcsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQQmluZGluZyBiaW5kaW5nLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0KLSAgICAgIChiaW5kaW5nLmdldFN0eWxlKCkgPT0gbnVsbCkKLSAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgIDogYmluZGluZy5nZXRTdHlsZSgpOwotICAgIGN0eC5hZGRQYXJhbWV0ZXIoInN0eWxlIiwgc3R5bGUpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0gb3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgaWYgKHN0eWxlICE9IG51bGwpCi0gICAgICBjdHguYWRkUGFyYW1ldGVyKCJzdHlsZSIsIHN0eWxlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJvZHkgYm9keSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgTGlzdCBzaWduYXR1cmUgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0gICAgU3RyaW5nIHN0eWxlID0gKFN0cmluZykgY3R4LmdldFBhcmFtZXRlcigic3R5bGUiKTsKLQotICAgIC8vIGZpbmQgY29ycmVzcG9uZGluZyBtZXNzYWdlCi0gICAgT3BlcmF0aW9uIG9wID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXRPcGVyYXRpb24oKTsKLQotICAgIC8vIGlmIHNvbWUgbGlua3MgYXJlIGJyb2tlbiwgY2FuY2VsIHByb2Nlc3NpbmcKLSAgICBpZiAob3AgPT0gbnVsbAotICAgICAgfHwgb3AuZ2V0SW5wdXQoKSA9PSBudWxsCi0gICAgICB8fCBvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKSA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIE1lc3NhZ2UgbSA9IG9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpOwotCi0gICAgTGlzdCBwYXJ0cyA9IFdTRExVdGlsLmdldFBhcnRzKG9wLCBtLCBib2R5LCBzdHlsZSk7Ci0gICAgaWYgKHBhcnRzID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgLy8gISEgQVRURU5USU9OCi0gICAgLy8gbWF5IGJlIHJlcXVpcmVkIHRvIGFkZCB0eXBlcyBpbnN0ZWFkIG9mIHBhcnQgaW50byBzaWduYXR1cmUgPwotCi0gICAgLy8gY3JlYXRlIHNpZ25hdHVyZQotICAgIHNpZ25hdHVyZS5hZGRBbGwocGFydHMpOwotCi0gICAgLy8gc3VwcG9zZSB0aGF0IHdpcmUgc2lnbmF0dXJlIGZvcgotICAgIC8vIC0gcnBjIHN0eWxlID0gb3BlcmF0aW9uIG5hbWUgKyBwYXJ0cycgcW5hbWUKLSAgICAvLyAtIGRvY3VtZW50IHN0eWxlID0gcGFydHMnIHFuYW1lCi0gICAgaWYgKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMuZXF1YWxzKHN0eWxlKSkKLSAgICAgIHNpZ25hdHVyZS5hZGQoMCwgb3AuZ2V0TmFtZSgpKTsKLQotICAgIGlmIChzYW1lU2lnbmF0dXJlKHdhcmVzLCBzaWduYXR1cmUpKQotICAgICAgZXJyb3JzLmFkZChvcC5nZXROYW1lKCkpOwotICAgIGVsc2UKLSAgICAgIHdhcmVzLmFkZChzaWduYXR1cmUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSBzaWduYXR1cmUgaXMgaW4gdGhlIHNldCBtYXRjaC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzYW1lU2lnbmF0dXJlKFNldCBzaWduYXR1cmVTZXQsIExpc3Qgc2lnbmF0dXJlKQotICB7Ci0gICAgYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0KLSAgICAvLyBHZXQgaXRlcmF0b3IgZm9yIHNldAotICAgIEl0ZXJhdG9yIHNldCA9IHNpZ25hdHVyZVNldC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChzZXQuaGFzTmV4dCgpICYmICFzYW1lKQotICAgIHsKLSAgICAgIC8vIEdldCBuZXh0IHNpZ25hdHVyZSBmcm9tIHRoZSBzZXQKLSAgICAgIExpc3QgbmV4dFNpZ25hdHVyZSA9IChMaXN0KSBzZXQubmV4dCgpOwotCi0gICAgICAvLyBPbmx5IGNvbnRpbnVlIGlmIHRoZSBzaWduYXR1cmVzIGFyZSB0aGUgc2FtZSBzaXplCi0gICAgICBpZiAobmV4dFNpZ25hdHVyZS5zaXplKCkgPT0gc2lnbmF0dXJlLnNpemUoKSkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IxID0gbmV4dFNpZ25hdHVyZS5pdGVyYXRvcigpOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvcjIgPSBzaWduYXR1cmUuaXRlcmF0b3IoKTsKLQotICAgICAgICAvLyBBc3N1bWUgc2FtZSB1bnRpbCBhIGRpZmZlcmVuY2UgaXMgZm91bmQKLSAgICAgICAgc2FtZSA9IHRydWU7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGxpc3QgdW50aWwgYSBkaWZmZXJlbmNlIGlzIGZvdW5kCi0gICAgICAgIHdoaWxlIChpdGVyYXRvcjEuaGFzTmV4dCgpICYmIGl0ZXJhdG9yMi5oYXNOZXh0KCkgJiYgc2FtZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCBlbGVtZW50cwotICAgICAgICAgIE9iamVjdCBlbGVtZW50MSA9IGl0ZXJhdG9yMS5uZXh0KCk7Ci0gICAgICAgICAgT2JqZWN0IGVsZW1lbnQyID0gaXRlcmF0b3IyLm5leHQoKTsKLQotICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGEgc3RyaW5nLCB0aGVuIGlmIGVxdWFsIGNoZWNrIHBhcnRzCi0gICAgICAgICAgaWYgKChlbGVtZW50MSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgICYmIChlbGVtZW50MiBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgICYmICgoKFN0cmluZykgZWxlbWVudDEpLmVxdWFscygoU3RyaW5nKSBlbGVtZW50MikpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNhbWUgPSB0cnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50cyBhcmUgcGFydHMsIHRoZW4gY2hlY2sgaWYgdGhleSBhcmUgZXF1YWwKLSAgICAgICAgICBlbHNlIGlmICgoZWxlbWVudDEgaW5zdGFuY2VvZiBQYXJ0KSAmJiAoZWxlbWVudDIgaW5zdGFuY2VvZiBQYXJ0KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzYW1lID0gc2FtZVBhcnRzKChQYXJ0KSBlbGVtZW50MSwgKFBhcnQpIGVsZW1lbnQyKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2FtZSA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHR3byBwYXJ0cyBhcmUgdGhlIHNhbWUuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gc2FtZVBhcnRzKFBhcnQgcGFydDEsIFBhcnQgcGFydDIpCi0gIHsKLSAgICBib29sZWFuIHNhbWUgPSBmYWxzZTsKLQotICAgIC8vIElmIHRoZSBwYXJ0IGhhcyBhbiBlbGVtZW50IHRoZW4gc2VlIGlmIHRoZXkgYXJlIHRoZSBzYW1lCi0gICAgaWYgKHBhcnQxLmdldEVsZW1lbnROYW1lKCkgIT0gbnVsbAotICAgICAgJiYgcGFydDIuZ2V0RWxlbWVudE5hbWUoKSAhPSBudWxsCi0gICAgICAmJiBwYXJ0MS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhwYXJ0Mi5nZXRFbGVtZW50TmFtZSgpKSkKLSAgICB7Ci0gICAgICBzYW1lID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgcGFydCBoYXMgYW4gdHlwZSB0aGVuIHNlZSBpZiB0aGV5IGFyZSB0aGUgc2FtZQotICAgIGVsc2UgaWYgKAotICAgICAgcGFydDEuZ2V0VHlwZU5hbWUoKSAhPSBudWxsCi0gICAgICAgICYmIHBhcnQyLmdldFR5cGVOYW1lKCkgIT0gbnVsbAotICAgICAgICAmJiBwYXJ0MS5nZXRUeXBlTmFtZSgpLmVxdWFscyhwYXJ0Mi5nZXRUeXBlTmFtZSgpKSkKLSAgICB7Ci0gICAgICBzYW1lID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2FtZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiBzYW1lOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJpbmRpbmcodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJvZHkodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUE9wZXJhdGlvbih0cnVlKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlQmluZGluZ091dHB1dCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICAvLyAhISBBVFRFTlRJT04KLSAgICAvLyBBbmFseXplIHNvYXBiaW5kOmJvZHk6bmFtZXNwYWNlIGFuZCBzZXJ2aWNlIHRhcmdldE5hbWVzcGFjZSAgICAgICAgICAgIAotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGVycm9ycy50b1N0cmluZygpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEyMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIxMjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkNTk0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEyMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUE9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVHlwZXNSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5XU0RMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci0KLQotLyoqCi0gKiBCUDIxMjEuCi0gKiBDb250ZXh0OgotICogRm9yICBhIHdzZGw6YmluZGluZyBlbGVtZW50IHdoaWNoIGlzIHJlZmVyZW5jZWQgZGlyZWN0bHkgb3IgYXNzb2NpYXRlZAotICogd2l0aCBhIHNwZWNpZmllZCB3c2RsOnBvcnQuCi0gKiAKLSAqIEFzc2VydGlvbiBEZXNjcmlwdGlvbjoKLSAqIEVhY2ggIG9wZXJhdGlvbiByZWZlcmVuY2VkIGJ5IGEgZG9jdW1lbnQtbGl0ZXJhbCBiaW5kaW5nIG11c3QgaGF2ZSBhCi0gKiBtZXNzYWdlIGRlZmluaXRpb24gd2hlcmUgdGhlIHdzZGw6cGFydCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQKLSAqIGRlZmluaXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMjEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotCi0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMjEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9ycyA9IG5ldyBFcnJvckxpc3QoKTsKLSAgcHJpdmF0ZSBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbnVsbDsKLQotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQQmluZGluZyBiaW5kaW5nLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0KLSAgICAgIChiaW5kaW5nLmdldFN0eWxlKCkgPT0gbnVsbCkKLSAgICAgICAgPyBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfRE9DCi0gICAgICAgIDogYmluZGluZy5nZXRTdHlsZSgpOwotICAgIGN0eC5hZGRQYXJhbWV0ZXIoInN0eWxlIiwgc3R5bGUpOwotICB9Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIFNPQVBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgU3RyaW5nIHN0eWxlID0gb3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgaWYgKHN0eWxlID09IG51bGwpCi0gICAgICBzdHlsZSA9IChTdHJpbmcpIGN0eC5nZXRQYXJhbWV0ZXIoInN0eWxlIik7Ci0gICAgLy8gYXNzZXJ0IHN0eWxlICE9IG51bGwKLSAgICBpZiAoIVdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MuZXF1YWxzKHN0eWxlKSkKLSAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJvZHkgYm9keSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgLy8gISEgQVRURU5USU9OCi0gICAgLy8gd2Ugc3VwcG9zZSB0aGF0IHNvYXBib2R5IGNoaWxkIGVsZW1lbnRzIGlzIGl0cyBwYXJ0cy4KLSAgICAvLyBhc3NlcnQgc3R5bGUgPT0gImRvY3VtZW50IgotICAgIGlmIChXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVC5lcXVhbHMoYm9keS5nZXRVc2UoKSkpCi0gICAgewotICAgICAgLy8gZmluZCBjb3JyZXNwb25kaW5nIG1lc3NhZ2UKLSAgICAgIE9wZXJhdGlvbiBvcCA9IGN0eC5nZXRCaW5kaW5nT3BlcmF0aW9uKCkuZ2V0T3BlcmF0aW9uKCk7Ci0gICAgICAvLyBpZiBzb21lIGxpbmtzIGFyZSBicm9rZW4sIGNhbmNlbCBwcm9jZXNzaW5nCi0gICAgICBpZiAob3AgPT0gbnVsbAotICAgICAgICB8fCAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ0lucHV0ICYmIG9wLmdldElucHV0KCkgPT0gbnVsbCkKLSAgICAgICAgfHwgKHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdPdXRwdXQgJiYgb3AuZ2V0T3V0cHV0KCkgPT0gbnVsbCkpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgTWVzc2FnZSBtID0KLSAgICAgICAgKHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdJbnB1dCkKLSAgICAgICAgICA/IG9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgOiBvcC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCk7Ci0gICAgICBpZiAobSA9PSBudWxsKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIC8vIGZpbmQgcGFydHMgd2hpY2ggYXJlIGludm9sdmVkIGluIHRoZSBnaXZlbiBib2R5Ci0gICAgICBMaXN0IHBhcnRzID0KLSAgICAgICAgV1NETFV0aWwuZ2V0UGFydHMoCi0gICAgICAgICAgb3AsCi0gICAgICAgICAgbSwKLSAgICAgICAgICBib2R5LAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MpOwotICAgICAgaWYgKHBhcnRzID09IG51bGwpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgLy8gY2hlY2sgcGFydHMKLSAgICAgIEl0ZXJhdG9yIGl0ID0gcGFydHMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcCA9IChQYXJ0KSBpdC5uZXh0KCk7Ci0gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgcCBkZWNsYXJlZCBhcyBnbG9iYWwgZWxlbWVudAotICAgICAgICBpZiAocC5nZXRFbGVtZW50TmFtZSgpID09IG51bGwKLSAgICAgICAgICB8fCByZWdpc3RyeS5nZXRUeXBlKHAuZ2V0RWxlbWVudE5hbWUoKSkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGVycm9ycy5hZGQob3AuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAvLwkJCQkJCXN1cHByZXNzZXMgc3Vic2VxdWVudCBwcm9jZXNzaW5nLCBiZWNhdXNlIGVycm9yIGxpc3QgY29udGFpbnMgb25seSBmYWlsZWQgb3BlcmF0aW9uCi0gICAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgcmVnaXN0cnkgPQotICAgICAgbmV3IFR5cGVzUmVnaXN0cnkoCi0gICAgICAgIGVudHJ5Q29udGV4dC5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLAotICAgICAgICB2YWxpZGF0b3IpOwotCi0gICAgLy8gY29sbGVjdCBhbGwgdHlwZXMgZnJvbSBtZXNzYWdlcyB0byBjaGVja2VkUGFydHMgbWFwCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJpbmRpbmcodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJvZHkodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUE9wZXJhdGlvbih0cnVlKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVJbXBvcnQoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoKEJpbmRpbmcpIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5RGV0YWlsKCkpOwotCi0gICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JzLnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWUxZWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotCi0KLS8qKgotICogQlAyMTIyLiAKLSAqICAgIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOnR5cGVzIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiAgICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIGRhdGEgdHlwZSBkZWZpbml0aW9uIGlmIGFueSB3aXRoaW4gdGhlIHdzZGw6dHlwZXMgZWxlbWVudCBpcyBhbiBYTUwgc2NoZW1hIGRlZmluaXRpb24gZGVmaW5lZCBpbiB0aGUgWE1MIFNjaGVtYSAxLjAgUmVjb21tZW5kYXRpb24gd2l0aCB0aGUgbmFtZXNwYWNlIFVSSSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMjIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIxMjIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGNvbnRleHQ7Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShUZXN0QXNzZXJ0aW9uLCBFbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIEVycm9yTGlzdCBlcnJvckxpc3QgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgICAvLyBHZXQgdGhlIHR5cGVzIGZyb20gdGhlIGVudHJ5IGNvbnRleHQKLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0KLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoKGRlZmluaXRpb24gPQotICAgICAgICB2YWxpZGF0b3IuYW5hbHl6ZXJDb250ZXh0LmdldENhbmRpZGF0ZUluZm8oKS5nZXREZWZpbml0aW9uKHR5cGVzKSkKLSAgICAgICAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgdHlwZXMgZGVmaW5pdGlvbiBpbiBhbnkgV1NETCBkb2N1bWVudC4iKTsKLSAgICAgIH0KLQotICAgICAgY29udGV4dCA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0KLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQ7Ci0gICAgICBMaXN0IGV4dEVsZW1lbnRzID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0KLSAgICAgIC8vIFByb2Nlc3MgZWFjaCBleHQuIGVsZW1lbnQKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0RWxlbWVudHMuc2l6ZSgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIC8vIElmIGl0IGlzIGFuIHVua25vd24gZXh0LiBlbGVtZW50IGFuZCBpdCBpcyBhIHNjaGVtYSwgdGhlbiBjaGVjayBpdAotICAgICAgICBpZiAoKGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGV4dEVsZW1lbnRzLmdldChpKSkKLSAgICAgICAgICBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghZXh0RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLmVxdWFscyhXU0lUYWcuRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiBpdCBpcyBub3QgYSBzY2hlbWEgZGVmaW5pdGlvbiwgdGhlbiBpdCBpcyBhbiBlcnJvcgotICAgICAgICAgICAgZXJyb3JMaXN0LmFkZCgKLSAgICAgICAgICAgICAgZXh0RWxlbWVudC5nZXRFbGVtZW50VHlwZSgpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIgY2FuIG5vdCBiZSBhIGNoaWxkIG9mIHRoZSB3c2RsOnR5cGVzIGVsZW1lbnQuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gSWYgWE1MU2NoZW1hVmFsaWRhdG9yIGNvdWxkIG5vdCBmaW5kIGFueSBlcnJvcnMsIGNoZWNrIGVycm9ycyBmcm9tIHRoZSBpbmxpbmUgc2NoZW1hIHZhbGlkYXRvcgotICAgIGlmIChlcnJvckxpc3QuaXNFbXB0eSgpKQotICAgICAgZXJyb3JMaXN0LmFkZCh2YWxpZGF0b3Iud3NkbERvY3VtZW50LmdldFNjaGVtYXNWYWxpZGF0aW9uRXJyb3JzKCkpOwotCi0gICAgaWYgKCFlcnJvckxpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JMaXN0LnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjEyMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjVmODMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMTIzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIEJQMjEyMy4gCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9ucywgaWYgaXQgY29udGFpbnMgYSB3c2RsOnBvcnQsIHdzZGw6YmluZGluZywgd3NkbDpwb3J0VHlwZSwgd3NkbDpvcGVyYXRpb24sIG9yIHdzZGw6bWVzc2FnZTwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5Db250YWluZWQgV1NETCBleHRlbnNpb24gZWxlbWVudHMgZG8gbm90IHVzZSB0aGUgd3NkbDpyZXF1aXJlZCBhdHRyaWJ1dGUgdmFsdWUgb2YgInRydWUiLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIxMjMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMTIzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gY2xhaW1Gb3VuZCA9IGZhbHNlOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX0tFWSA9ICJwb3J0IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkdfS0VZID0gImJpbmRpbmciOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9UWVBFX0tFWSA9ICJwb3J0IHR5cGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OX0tFWSA9ICJvcGVyYXRpb24iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9LRVkgPSAibWVzc2FnZSI7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLlBvcnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnQgcG9ydCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKHBvcnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoY29udGFpbnNMZWdhbENsYWltKHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkpCi0gICAgICB7Ci0gICAgICAgIGNsYWltRm91bmQgPSB0cnVlOwotICAgICAgICBjdHguYWRkUGFyYW1ldGVyKFBPUlRfS0VZLCBCb29sZWFuLlRSVUUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjdHguYWRkUGFyYW1ldGVyKFBPUlRfS0VZLCBCb29sZWFuLkZBTFNFKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkJpbmRpbmcsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChCaW5kaW5nIGJpbmRpbmcsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChiaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgQm9vbGVhbiBwb3J0ID0gKEJvb2xlYW4pIGN0eC5nZXRQYXJhbWV0ZXIoUE9SVF9LRVkpOwotCi0gICAgICBpZiAocG9ydC5ib29sZWFuVmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgY3R4LmFkZFBhcmFtZXRlcihCSU5ESU5HX0tFWSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2xhaW1Gb3VuZCA9IGNvbnRhaW5zQ2xhaW0oYmluZGluZy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgICAgY3R4LmFkZFBhcmFtZXRlcigKLSAgICAgICAgICBCSU5ESU5HX0tFWSwKLSAgICAgICAgICBuZXcgQm9vbGVhbihjb250YWluc0xlZ2FsQ2xhaW0oYmluZGluZy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKSkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuUG9ydFR5cGUsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChQb3J0VHlwZSB0eXBlLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAodHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIEJvb2xlYW4gYmluZGluZyA9IChCb29sZWFuKSBjdHguZ2V0UGFyYW1ldGVyKEJJTkRJTkdfS0VZKTsKLQotICAgICAgaWYgKGJpbmRpbmcuYm9vbGVhblZhbHVlKCkpCi0gICAgICB7Ci0gICAgICAgIGN0eC5hZGRQYXJhbWV0ZXIoUE9SVF9UWVBFX0tFWSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2xhaW1Gb3VuZCA9IGNvbnRhaW5zQ2xhaW0odHlwZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgICAgY3R4LmFkZFBhcmFtZXRlcigKLSAgICAgICAgICBQT1JUX1RZUEVfS0VZLAotICAgICAgICAgIG5ldyBCb29sZWFuKGNvbnRhaW5zTGVnYWxDbGFpbSh0eXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5PcGVyYXRpb24sIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKG9wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIEJvb2xlYW4gdHlwZSA9IChCb29sZWFuKSBjdHguZ2V0UGFyYW1ldGVyKFBPUlRfVFlQRV9LRVkpOwotCi0gICAgICBpZiAodHlwZS5ib29sZWFuVmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgY3R4LmFkZFBhcmFtZXRlcihPUEVSQVRJT05fS0VZLCBCb29sZWFuLlRSVUUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjbGFpbUZvdW5kID0gY29udGFpbnNDbGFpbShvcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgICAgIGN0eC5hZGRQYXJhbWV0ZXIoCi0gICAgICAgICAgT1BFUkFUSU9OX0tFWSwKLSAgICAgICAgICBuZXcgQm9vbGVhbigKLSAgICAgICAgICAgIGNvbnRhaW5zTGVnYWxDbGFpbShvcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk1lc3NhZ2UsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChtZXNzYWdlICE9IG51bGwpCi0gICAgewotICAgICAgQm9vbGVhbiBvcGVyYXRpb24gPSAoQm9vbGVhbikgY3R4LmdldFBhcmFtZXRlcihPUEVSQVRJT05fS0VZKTsKLQotICAgICAgaWYgKG9wZXJhdGlvbi5ib29sZWFuVmFsdWUoKSkKLSAgICAgIHsKLSAgICAgICAgY3R4LmFkZFBhcmFtZXRlcihNRVNTQUdFX0tFWSwgQm9vbGVhbi5UUlVFKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2xhaW1Gb3VuZCA9IGNvbnRhaW5zQ2xhaW0obWVzc2FnZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAgICAgY3R4LmFkZFBhcmFtZXRlcigKLSAgICAgICAgICBNRVNTQUdFX0tFWSwKLSAgICAgICAgICBuZXcgQm9vbGVhbihjb250YWluc0xlZ2FsQ2xhaW0obWVzc2FnZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKSkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpIHsKLSAgCWlmIChvcGVyYXRpb24gIT0gbnVsbCkgewotICAJCWlmIChjb250YWluc0xlZ2FsQ2xhaW0ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpKSB7Ci0gIAkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmluZGluZyBvcGVyYXRpb24gZm91bmQiKTsKLSAgCQl9IGVsc2UgewotICAJCQkKLSAgCQl9Ci0gIAl9Ci0gIH0KLSAgKi8KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgYm9vbGVhbiByZXF1aXJlZCA9Ci0gICAgICBlbCAhPSBudWxsCi0gICAgICAgICYmIGVsLmdldFJlcXVpcmVkKCkgIT0gbnVsbAotICAgICAgICAmJiBlbC5nZXRSZXF1aXJlZCgpLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgaWYgKGlzUGFyZW50Q29uZm9ybXMocGFyZW50LCBjdHgpKQotICAgIHsKLSAgICAgIGlmIChyZXF1aXJlZCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9XQVJOSU5HOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9IGVsLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBwYXJlbnQgZWxlbWVudCBjb25mb3JtcyB0byB0aGUgYmFzaWMgcHJvZmlsZS4KLSAgICogQHBhcmFtIHBhcmVudAotICAgKiBAcGFyYW0gY3R4Ci0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzUGFyZW50Q29uZm9ybXMoT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBQb3J0KQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQm9vbGVhbikgY3R4LmdldFBhcmFtZXRlcihQT1JUX0tFWSkpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLSAgICBlbHNlIGlmICgKLSAgICAgIHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmcKLSAgICAgICAgfHwgcGFyZW50IGluc3RhbmNlb2YgQmluZGluZ09wZXJhdGlvbgotICAgICAgICB8fCBwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQKLSAgICAgICAgfHwgcGFyZW50IGluc3RhbmNlb2YgQmluZGluZ091dHB1dAotICAgICAgICB8fCBwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nRmF1bHQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChCb29sZWFuKSBjdHguZ2V0UGFyYW1ldGVyKEJJTkRJTkdfS0VZKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFBvcnRUeXBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9ICgoQm9vbGVhbikgY3R4LmdldFBhcmFtZXRlcihQT1JUX1RZUEVfS0VZKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKAotICAgICAgcGFyZW50IGluc3RhbmNlb2YgT3BlcmF0aW9uCi0gICAgICAgIHx8IHBhcmVudCBpbnN0YW5jZW9mIElucHV0Ci0gICAgICAgIHx8IHBhcmVudCBpbnN0YW5jZW9mIE91dHB1dAotICAgICAgICB8fCBwYXJlbnQgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICB7Ci0gICAgICByZXN1bHQgPSAoKEJvb2xlYW4pIGN0eC5nZXRQYXJhbWV0ZXIoT1BFUkFUSU9OX0tFWSkpLmJvb2xlYW5WYWx1ZSgpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXNzYWdlIHx8IHBhcmVudCBpbnN0YW5jZW9mIFBhcnQpCi0gICAgewotICAgICAgcmVzdWx0ID0gKChCb29sZWFuKSBjdHguZ2V0UGFyYW1ldGVyKE1FU1NBR0VfS0VZKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUoVGVzdEFzc2VydGlvbiwgRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEV4cGVjdCB3c2RsOmRlZmludGlvbnMKLSAgICBEZWZpbml0aW9uIGRlZiA9IChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIC8vKChTZXJ2aWNlKWRlZi5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLnRvQXJyYXkoKVswXSkuZ2V0UG9ydHMoKQotICAgIC8vIFRyYXZlcnNlIFdTREwKLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgLy8gVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0T3BlcmF0aW9uKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdEJpbmRpbmcodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0TWVzc2FnZSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRQb3J0KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFBvcnRUeXBlKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KHRydWUpOwotCi0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVEZWZpbml0aW9uMkJpbmRpbmcoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlRGVmaW5pdGlvbjJFbGVtZW50KCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZURlZmluaXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlRGVmaW5pdGlvbjJNZXNzYWdlKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZURlZmluaXRpb24yUG9ydFR5cGUoKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlRGVmaW5pdGlvbjJUeXBlcygpOwotCi0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKGRlZik7Ci0KLSAgICBpZiAoIWNsYWltRm91bmQpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmIChyZXN1bHQuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfV0FSTklORykpCi0gICAgewotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZmFpbHVyZURldGFpbE1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50IHdoZXRoZXIgY29udGFpbnMgY29uZm9ybWFuY2UgY2xhaW1zLgotICAgKiBSZXR1cm5zIHRydWUgaWYgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGNvbnRhaW5zIGNvbmZvcm1hbmNlIGNsYWltIHdpdGgKLSAgICogbGVnYWwgc2NoZW1hIGRlZmluaXRpb24gVVJJLiAKLSAgICogbGVnYWwgaXMgJ2h0dHA6Ly93cy1pLm9yZy9zY2hlbWFzL2NvbmZvcm1hbmNlQ2xhaW0vJwotICAgKiBAcGFyYW0gZWwKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNDbGFpbShFbGVtZW50IGVsKQotICB7Ci0gICAgaWYgKGVsID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLy8gZmluZCBjbGFpbQotICAgIGVsID0gWE1MVXRpbHMuZmluZENoaWxkRWxlbWVudChlbCwgV1NJX0NMQUlNKTsKLSAgICBpZiAoZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQgd2hldGhlciBjb250YWlucyBjb25mb3JtYW5jZSBjbGFpbXMuCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBkb2N1bWVudGF0aW9uIGVsZW1lbnQgY29udGFpbnMgY29uZm9ybWFuY2UgY2xhaW0gd2l0aAotICAgKiBsZWdhbCBzY2hlbWEgZGVmaW5pdGlvbiBVUkkuIAotICAgKiBsZWdhbCBpcyAnaHR0cDovL3dzLWkub3JnL3NjaGVtYXMvY29uZm9ybWFuY2VDbGFpbS8nCi0gICAqIEBwYXJhbSBlbAotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0xlZ2FsQ2xhaW0oRWxlbWVudCBlbCkKLSAgewotICAgIGlmIChlbCA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vIGZpbmQgY2xhaW0KLSAgICBlbCA9IFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoZWwsIFdTSV9DTEFJTSk7Ci0gICAgd2hpbGUgKGVsICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHZhbHVlID0gZWwuZ2V0QXR0cmlidXRlKEFUVFJfQ0xBSU1fQ09ORk9STVNUTy5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICBpZiAodmFsdWUgIT0gbnVsbAotICAgICAgICAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKFdTSUNvbnN0YW50cy5BVFRSVkFMX1VERElfQ0xBSU1fS0VZVkFMVUUpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgZWwgPSBYTUxVdGlscy5maW5kRWxlbWVudChlbCwgV1NJX0NMQUlNKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIyMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNGRkZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIyMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBCUDIyMDEuIAotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIFdlYiBzZXJ2aWNlIGRlZmluaXRpb24gd2l0aGluIGEgV1NETCBkb2N1bWVudCB3aXRoIGEgWE1MIGRlY2xhcmF0aW9uIHN0YXRlbWVudC4gPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBYTUwgZGVjbGFyYXRpb24gc3RhdGVtZW50IHVzZXMgVVRGLTggb3IgVVRGLTE2IGZvciB0aGUgZW5jb2RpbmcuIDwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIyMDEgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIyMDEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgY2hhcltdIE9NTUlURURfWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMgPSBuZXcgY2hhcltdezB4MjAsCi0gICAgICAweDksIDB4RCwgMHhBLCAnXCcnLCAnXCInfTsKLSAgcHJpdmF0ZSBmaW5hbCBjaGFyW10gWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMgPSBuZXcgY2hhcltdeyc9J307Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFVURl84X0VOQ09ESU5HID0gIlVURi04IjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVVRGXzE2X0VOQ09ESU5HID0gIlVURi0xNiI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RPS0VOID0gImVuY29kaW5nIjsKLSAgLyoKLSAgICogKG5vbi1KYXZhZG9jKQotICAgKiAKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sCi0gICAqICAgICAgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpCi0gICAgICAgIC5nZXRFbnRyeURldGFpbCgpOwotICAgIFN0cmluZyBsb2NhdGlvbiA9IGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCk7Ci0gICAgU3RyaW5nIHhtbERlY2wgPSByZWFkWE1MRGVjbGFyYXRpb25TdGF0ZW1lbnQobG9jYXRpb24pOwotICAgIGlmICh4bWxEZWNsID09IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRTsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIXZhbGlkRW5jb2RpbmcoeG1sRGVjbCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0gdmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoeG1sRGVjbCwgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0gIC8qKgotICAgKiBSZWFkcyBhbiBYTUwgZGVjbGFyYXRpb24gc3RhdGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGxvY2F0aW9uCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwcml2YXRlIFN0cmluZyByZWFkWE1MRGVjbGFyYXRpb25TdGF0ZW1lbnQoU3RyaW5nIGxvY2F0aW9uKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgVVJMIHVybCA9IG51bGw7Ci0gICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIHdlIHNob3VsZCB0cnkgdG8gYWNjZXNzIGxvY2F0aW9uIGFzIGZpbGUKLSAgICAgICAgfQotICAgICAgICBpZiAodXJsICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsLm9wZW5TdHJlYW0oKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0obG9jYXRpb24pKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgY2hhckNvZGU7Ci0gICAgICAgIGJvb2xlYW4gZW5kID0gZmFsc2U7Ci0gICAgICAgIGlmIChyZWFkZXIucmVhZHkoKSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXJDb2RlID0gcmVhZGVyLnJlYWQoKTsKLSAgICAgICAgICB3aGlsZSAocmVhZGVyLnJlYWR5KCkgJiYgIShjaGFyQ29kZSA9PSAnPCcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXJDb2RlID0gcmVhZGVyLnJlYWQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hhcltdIGMgPSBuZXcgY2hhcls0XTsKLSAgICAgICAgICByZWFkZXIucmVhZChjKTsKLSAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgIGlmIChuZXcgU3RyaW5nKGMpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCI/eG1sIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgiPD94bWwiKTsKLSAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucmVhZHkoKSAmJiAhZW5kKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjaGFyQ29kZSA9IHJlYWRlci5yZWFkKCk7Ci0gICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKGNoYXIpIGNoYXJDb2RlKTsKLSAgICAgICAgICAgICAgZW5kID0gY2hhckNvZGUgPT0gJz4nOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgcmVzdWx0IGRvZXMgbm90IGdldCBwcm9wb2dhdGVkIGJhY2shCi0gICAgICAgICAgICB0aGlzLnJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0ID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvL1ZFUkJPU0UKLSAgICAgICAgaWYgKHZhbGlkYXRvci52ZXJib3NlT3B0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgIFtXU0kyMjAxXSBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZmluYWxseQotICAgICAgewotICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgLyoKLSAgICogVmVyaWZ5IHhtbCBkZWNsYXJhdGlvbiBjb250YWlucyB1dGYtMTYgb3IgdXRmLTggZW5jb2RpbmcuIEBwYXJhbSB4bWxEZWNsIC0KLSAgICogeG1sIGRlY2xhcmF0aW9uIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB2YWxpZEVuY29kaW5nKFN0cmluZyB4bWxEZWNsKQotICB7Ci0gICAgLy9ib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBpZiAoeG1sRGVjbCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgT01NSVRFRF9YTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUywgWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMpOwotICAgICAgRW51bWVyYXRpb24gdG9rZW5zID0gc3QucGFyc2UoeG1sRGVjbCk7Ci0gICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVFbGVtZW50cygpICYmICFmb3VuZCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRva2VuID0gKFN0cmluZykgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmICh0b2tlbi5lcXVhbHMoRU5DT0RJTkdfVE9LRU4pKQotICAgICAgICB7Ci0gICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgIHRva2Vucy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZyBlbmMgPSAoU3RyaW5nKSB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICByZXN1bHQgPSBVVEZfOF9FTkNPRElORy5lcXVhbHNJZ25vcmVDYXNlKGVuYykKLSAgICAgICAgICAgICAgfHwgVVRGXzE2X0VOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoZW5jKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjIwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIyMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkODg2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjIwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIEJQMjIwMi4KLSAqICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDp0eXBlcyBlbGVtZW50IHdpdGhpbiBhIFdTREwgZG9jdW1lbnQgd2hpY2ggaW1wb3J0cyBhbiBYTUwgc2NoZW1hIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBpbXBvcnRlZCBzY2hlbWEgdXNlcyBVVEYtOCBvciBVVEYtMTYgZm9yIHRoZSBlbmNvZGluZy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyMjAyIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcyBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyMjAyKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvcnMgPSBuZXcgRXJyb3JMaXN0KCk7Ci0gIHByaXZhdGUgYm9vbGVhbiBpbXBvcnRGb3VuZCA9IGZhbHNlOwotCi0gIHByaXZhdGUgZmluYWwgY2hhcltdIE9NTUlURURfWE1MX0RFQ0xBUkFUSU9OX0RFTElNSVRFUlMgPQotICAgIG5ldyBjaGFyW10geyAweDIwLCAweDksIDB4RCwgMHhBLCAnXCcnLCAnXCInIH07Ci0gIHByaXZhdGUgZmluYWwgY2hhcltdIFhNTF9ERUNMQVJBVElPTl9ERUxJTUlURVJTID0gbmV3IGNoYXJbXSB7ICc9JyB9OwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBVVEZfOF9FTkNPRElORyA9ICJVVEYtOCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFVURl8xNl9FTkNPRElORyA9ICJVVEYtMTYiOwotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RPS0VOID0gImVuY29kaW5nIjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVkVSU0lPTl9UT0tFTiA9ICJ2ZXJzaW9uIjsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgLy9EZWZpbml0aW9uIGRlZiA9IChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIFR5cGVzIHR5cGVzID0gKFR5cGVzKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgIExpc3QgZXh0cyA9IG51bGw7Ci0gICAgLy9pZiAoZGVmLmdldFR5cGVzKCkgIT0gbnVsbCkKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgIC8vZXh0cyA9IGRlZi5nZXRUeXBlcygpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgICAgZXh0cyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGlmIChleHRzICE9IG51bGwpCi0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICAgIGlmICgoZGVmaW5pdGlvbiA9Ci0gICAgICAgIHZhbGlkYXRvci5hbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb24odHlwZXMpKQotICAgICAgICA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCB0eXBlcyBkZWZpbml0aW9uIGluIGFueSBXU0RMIGRvY3VtZW50LiIpOwotICAgICAgfQotCi0gICAgICBJdGVyYXRvciBpdCA9IGV4dHMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgICAgICYmIGVsLmdldEVsZW1lbnRUeXBlKCkuZXF1YWxzKEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgICAgc2VhcmNoRm9yU2NoZW1hKCgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbCkuZ2V0RWxlbWVudCgpLAotICAgICAgICAgICAgICBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICghaW1wb3J0Rm91bmQpCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotCi0gICAgZWxzZQotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoKLSAgICogU2VhcmNoIHhzZCBzY2hlbWEgb3IgeHNkIGltcG9ydCBmcm9tIG5vZGUuIElmIG5vZGUgaXMgeHNkIGltcG9ydCBpdCdzIGxvYWRpbmcgc2NoZW1hLgotICAgKiBAcGFyYW0gbiAtIG5vZGUKLSAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNlYXJjaEZvclNjaGVtYShOb2RlIG4sIFN0cmluZyBjb250ZXh0KQotICB7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBzZWFyY2hlcyBmb3IgeHNkOmltcG9ydCBlbGVtZW50Ci0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpKQotICAgICAgewotICAgICAgICAvLyBpZiB4c2Q6c2NoZW1hIGVsZW1lbnQgaXMgZm91bmQgLT4gcHJvY2VzcyBzY2hlbWEKLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc1NjaGVtYShuLCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpZiB4c2Q6aW1wb3J0IGVsZW1lbnQgaXMgZm91bmQgLT4gbG9hZCBzY2hlbWEgYW5kIHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltcG9ydEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIGxvYWRTY2hlbWEobiwgY29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8vIGVsc2UgaXRlcmF0ZSBlbGVtZW50IHJlY3Vyc2l2ZWx5Ci0gICAgICAgICAgICBzZWFyY2hGb3JTY2hlbWEobi5nZXRGaXJzdENoaWxkKCksIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIEl0IGxvYWRzIHhzZCBzY2hlbWEgYW5kIHRoZW4gY2hlY2sgdmFsaWQgZW5jb2RpbmcgYW5kIGxvb2tpbmcgZm9yIHhzZDpzY2hlbWEgZWxlbWVudCBmb3IgbmV4dCBwcm9jZXNzLiAKLSAgICogQHBhcmFtIGltcG9ydE5vZGUgLSB4c2Qgc2NoZW1hCi0gICovCi0gIHByaXZhdGUgdm9pZCBsb2FkU2NoZW1hKE5vZGUgaW1wb3J0Tm9kZSwgU3RyaW5nIGNvbnRleHQpCi0gIHsKLSAgICBFbGVtZW50IGltID0gKEVsZW1lbnQpIGltcG9ydE5vZGU7Ci0gICAgQXR0ciBzY2hlbWFMb2NhdGlvbiA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShpbSwgQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04pOwotICAgIC8vIHRyeSB0byBwYXJzZSBpbXBvcnRlZCBYU0QKLSAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpICE9IG51bGwpCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgYW55IGVycm9yIG9yIHJvb3QgZWxlbWVudCBpcyBub3QgWFNEIHNjaGVtYSAtPiBlcnJvcgotICAgICAgICBTdHJpbmcgZGVjbCA9Ci0gICAgICAgICAgcmVhZFhNTERlY2xhcmF0aW9uU3RhdGVtZW50KHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpOwotICAgICAgICBpZiAoIXZhbGlkRGVjbGFyYXRpb24oZGVjbCwKLSAgICAgICAgICBFTkNPRElOR19UT0tFTiwKLSAgICAgICAgICBuZXcgU3RyaW5nW10geyBVVEZfOF9FTkNPRElORywgVVRGXzE2X0VOQ09ESU5HIH0pKQotICAgICAgICB7Ci0gICAgICAgICAgQXR0ciBhID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGltLCBBVFRSX1hTRF9OQU1FU1BBQ0UpOwotICAgICAgICAgIGVycm9ycy5hZGQoKGEgIT0gbnVsbCkgPyBhLmdldFZhbHVlKCkgOiAiIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXZhbGlkRGVjbGFyYXRpb24oZGVjbCwgInZlcnNpb24iLCBuZXcgU3RyaW5nW10geyAiMS4wIiB9KSkKLSAgICAgICAgewotICAgICAgICAgIGVycm9ycy5hZGQoCi0gICAgICAgICAgICAiVmVyc2lvbiBudW1iZXIgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIG5vdCAxLjAuICBYTUwgc2NoZW1hIGZpbGU6ICIKLSAgICAgICAgICAgICAgKyBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERFQlVHOgotICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSArICI6IiArIGNvbnRleHQpOwotCi0gICAgICAgIERvY3VtZW50IHNjaGVtYSA9Ci0gICAgICAgICAgdmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY29udGV4dCk7Ci0KLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhzY2hlbWEuZ2V0RG9jdW1lbnRFbGVtZW50KCksIEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgIHsKLSAgICAgICAgICBBdHRyIGEgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoaW0sIEFUVFJfWFNEX05BTUVTUEFDRSk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IChhICE9IG51bGwpID8gYS5nZXRWYWx1ZSgpIDogIiI7Ci0gICAgICAgICAgcHJvY2Vzc1NjaGVtYShzY2hlbWEuZ2V0RG9jdW1lbnRFbGVtZW50KCksCi0gICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZVVSTFN0cmluZyhzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLCBjb250ZXh0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICB7Ci0gICAgICB9Ci0gIH0KLQotICAvKioKLSAgKiBSZWFkcyBhbiBYTUwgZGVjbGFyYXRpb24gc3RhdGVtZW50LgotICAqIEBwYXJhbSBsb2NhdGlvbgotICAqIEByZXR1cm4gU3RyaW5nCi0gICovCi0gIHByaXZhdGUgU3RyaW5nIHJlYWRYTUxEZWNsYXJhdGlvblN0YXRlbWVudChTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBiYXNlVVJJKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbmV3IFVSTChsb2NhdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICAvLyBub3RoaW5nCi0gICAgICBpbnQgaSA9IGJhc2VVUkkubGFzdEluZGV4T2YoJy8nKTsKLSAgICAgIGludCBqID0gYmFzZVVSSS5sYXN0SW5kZXhPZignXFwnKTsKLSAgICAgIGlmIChqID4gaSkKLSAgICAgICAgaSA9IGo7Ci0gICAgICBsb2NhdGlvbiA9IGJhc2VVUkkuc3Vic3RyaW5nKDAsIGkgKyAxKSArIGxvY2F0aW9uOwotICAgIH0KLQotICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIHdlIHNob3VsZCB0cnkgdG8gYWNjZXNzIGxvY2F0aW9uIGFzIGZpbGUKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1cmwgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShsb2NhdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGNoYXJDb2RlOwotICAgICAgICBib29sZWFuIGVuZCA9IGZhbHNlOwotICAgICAgICBpZiAocmVhZGVyLnJlYWR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyQ29kZSA9IHJlYWRlci5yZWFkKCk7Ci0KLSAgICAgICAgICB3aGlsZSAocmVhZGVyLnJlYWR5KCkgJiYgIShjaGFyQ29kZSA9PSAnPCcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXJDb2RlID0gcmVhZGVyLnJlYWQoKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgIGlmIChjaGFyQ29kZSA9PSAnPCcpCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgoY2hhcikgY2hhckNvZGUpOwotICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5yZWFkeSgpICYmICFlbmQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNoYXJDb2RlID0gcmVhZGVyLnJlYWQoKTsKLSAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoY2hhcikgY2hhckNvZGUpOwotCi0gICAgICAgICAgICAgIGVuZCA9IGNoYXJDb2RlID09ICc+JzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgcmVzdWx0IGRvZXMgbm90IGdldCBwcm9wb2dhdGVkIGJhY2shCi0gICAgICAgICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHRoZSBYTUwgZGVjbGFyYXRpb24gc3RhdGVtZW50LiI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcmVzdWx0ID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZXJyb3JzLmFkZChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKgotICAgKiBAcGFyYW0geG1sRGVjbCAtIHhtbCBkZWNsYXJhdGlvbgotICAgKiBAcmV0dXJuIGlmIHhtbCBkZWNsYXJhdGlvbiBjb250YWlucyBlbmNvZGluZz0idXRmLTE2IiBvciBlbmNvZGluZz0idXRmLTgiIGl0IHJldGlybnMgdHJ1ZS4gCi0gICovCi0KLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkRW5jb2RpbmcoU3RyaW5nIHhtbERlY2wpCi0gIHsKLSAgICAvL2Jvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIGlmICh4bWxEZWNsICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0KLSAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICBPTU1JVEVEX1hNTF9ERUNMQVJBVElPTl9ERUxJTUlURVJTLAotICAgICAgICAgIFhNTF9ERUNMQVJBVElPTl9ERUxJTUlURVJTKTsKLSAgICAgIEVudW1lcmF0aW9uIHRva2VucyA9IHN0LnBhcnNlKHhtbERlY2wpOwotICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlRWxlbWVudHMoKSAmJiAhZm91bmQpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IChTdHJpbmcpIHRva2Vucy5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgIGlmICh0b2tlbi5lcXVhbHMoRU5DT0RJTkdfVE9LRU4pKQotICAgICAgICB7Ci0gICAgICAgICAgZm91bmQgPSB0cnVlOwotCi0gICAgICAgICAgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgU3RyaW5nIGVuYyA9IChTdHJpbmcpIHRva2Vucy5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgICAgcmVzdWx0ID0KLSAgICAgICAgICAgIFVURl84X0VOQ09ESU5HLmVxdWFsc0lnbm9yZUNhc2UoZW5jKQotICAgICAgICAgICAgICB8fCBVVEZfMTZfRU5DT0RJTkcuZXF1YWxzSWdub3JlQ2FzZShlbmMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0geG1sRGVjbCAtIHhtbCBkZWNsYXJhdGlvbgotICAgKiBAcmV0dXJuIGlmIHhtbCBkZWNsYXJhdGlvbiBjb250YWlucyB2YWxpZCB2ZXJzaW9uIG51bWJlciB0aGVuIHRydWUgaXMgcmV0dXJuZWQuIAotICAqLwotICBwcml2YXRlIGJvb2xlYW4gdmFsaWREZWNsYXJhdGlvbigKLSAgICBTdHJpbmcgeG1sRGVjbCwKLSAgICBTdHJpbmcgdG9rZW5OYW1lLAotICAgIFN0cmluZ1tdIGNoZWNrVmFsdWVMaXN0KQotICB7Ci0gICAgLy9ib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBpZiAoeG1sRGVjbCAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9Ci0gICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgT01NSVRFRF9YTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUywKLSAgICAgICAgICBYTUxfREVDTEFSQVRJT05fREVMSU1JVEVSUyk7Ci0gICAgICBFbnVtZXJhdGlvbiB0b2tlbnMgPSBzdC5wYXJzZSh4bWxEZWNsKTsKLQotICAgICAgaWYgKHRva2Vucy5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVFbGVtZW50cygpICYmICFmb3VuZCkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyB0b2tlbiA9IChTdHJpbmcpIHRva2Vucy5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgICAgaWYgKHRva2VuLmVxdWFscyh0b2tlbk5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgICAgICAgICB0b2tlbnMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0b2tlblZhbHVlID0gKFN0cmluZykgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tWYWx1ZUxpc3QubGVuZ3RoICYmICFyZXN1bHQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKGNoZWNrVmFsdWVMaXN0W2ldLmVxdWFsc0lnbm9yZUNhc2UodG9rZW5WYWx1ZSkpCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHRva2VucyB0aGVuIGl0IGlzIG5vdCBhIHZhbGlkIGRlY2xhcmFjdGlvbgotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoKLSAgICogSXQncyBsb29raW5nIGZvciB4c2QgaW1wb3J0IGFuZCBsb2FkIGl0IGlmIGZpbmQuCi0gICAqIEBwYXJhbSBzY2hlbWEgLSB4c2Qgc2NoZW1hCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBuYW1lc3BhY2Ugb2Ygc2NoZW1hCi0gICAqLwotICBwcml2YXRlIHZvaWQgcHJvY2Vzc1NjaGVtYShOb2RlIHNjaGVtYSwgU3RyaW5nIGNvbnRleHQpCi0gIHsKLSAgICBOb2RlIG4gPSBzY2hlbWEuZ2V0Rmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKQotICAgICAgICAmJiBYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfSU1QT1JUKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0Rm91bmQgPSB0cnVlOwotICAgICAgICBsb2FkU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgfQotCi0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIyMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyMjA4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTk2MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDIyMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotCi0KLS8qKgotICogQlAyMjA4LgotICogPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6b3BlcmF0aW9uIGluIGEgd3NkbDpwb3J0VHlwZSBkZWZpbml0aW9uPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB3c2RsOm9wZXJhdGlvbiBlbGVtZW50IGlzIGVpdGhlciBhIFdTREwgcmVxdWVzdC9yZXNwb25zZSBvciBhIG9uZS13YXkgb3BlcmF0aW9uIChubyBOb3RpZmljYXRpb24gb3IgU29sbGljaXQtUmVzcG9uc2UpLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDIyMDggZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDIyMDgoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPQotICAgICAgKE9wZXJhdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICBPcGVyYXRpb25UeXBlIG9wVHlwZSA9IG9wZXJhdGlvbi5nZXRTdHlsZSgpOwotICAgIGlmICgob3BUeXBlID09IG51bGwpCi0gICAgICB8fCAoIW9wVHlwZS5lcXVhbHMoT3BlcmF0aW9uVHlwZS5PTkVfV0FZKQotICAgICAgICAmJiAhb3BUeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGlmIChvcFR5cGUgPT0gbnVsbCkKLSAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBvcGVyYXRpb24gdHlwZSBmb3IgIgotICAgICAgICAgICAgICArIG9wZXJhdGlvbi5nZXROYW1lKCkKLSAgICAgICAgICAgICAgKyAiLiIsCi0gICAgICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgICAgZWxzZQotICAgICAgICBmYWlsdXJlRGV0YWlsID0gbnVsbDsgLy8gbm9uZSBkZWZpbmVkIGluIFRBRCBhdCBwcmVzZW50IAotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjQwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGYzZGE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMjQwMi4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQgaGFzIGEgc29hcGJpbmQ6YmluZGluZyBjaGlsZCBlbGVtZW50LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBCUDI0MDIgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDI0MDIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLQotICAgIC8vIEdldCB0aGUgcG9ydCBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgLy9Qb3J0IHBvcnQgPSAoUG9ydCkgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIFRyeSB0byBnZXQgdGhlIFNPQVAgYmluZGluZwotICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gV1NETFZhbGlkYXRvckltcGwuZ2V0U29hcEJpbmRpbmcoYmluZGluZyk7Ci0KLSAgICAvLyBUZXN0IHRoZSBhc3NlcnRpb24gCi0gICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgU09BUCBCaW5kaW5nCi0gICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjQwNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI0MDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZThkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjQwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAqIEJQMjQwNC4KLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmJpbmRpbmcgZWxlbWVudDwvY29udGV4dD4KLSAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgY29udGFpbmVkIHNvYXA6YmluZGluZyBlbGVtZW50IGhhcyBhICJ0cmFuc3BvcnQiIGF0dHJpYnV0ZSwgd2hpY2ggaGFzIHZhbHVlOiBodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjQwNCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjQwNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAvLyBHZXQgdGhlIGJpbmRpbmcgZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gVHJ5IHRvIGdldCB0aGUgU09BUCBiaW5kaW5nCi0gICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSBXU0RMVmFsaWRhdG9ySW1wbC5nZXRTb2FwQmluZGluZyhiaW5kaW5nKTsKLQotICAgIC8vIFRlc3QgdGhlIGFzc2VydGlvbiAKLSAgICAvLyBDaGVjayBmb3IgU29hcCBiaW5kaW5nIG5hbWVzcGFjZSAKLSAgICBpZiAoKHNvYXBCaW5kaW5nID09IG51bGwpCi0gICAgICB8fCAoc29hcEJpbmRpbmcuZ2V0VHJhbnNwb3J0VVJJKCkgPT0gbnVsbCkKLSAgICAgIHx8ICFzb2FwQmluZGluZy5nZXRUcmFuc3BvcnRVUkkoKS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9TT0FQX0hUVFApKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgc29hcEJpbmRpbmcgPT0gbnVsbAotICAgICAgICAgID8gIldTREwgZG9jdW1lbnQgZG9lcyBub3QgY29udGFpbiBTT0FQIGJpbmRpbmcgZWxlbWVudC4iCi0gICAgICAgICAgOiBzb2FwQmluZGluZy50b1N0cmluZygpLAotICAgICAgICBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDA2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjQwNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDVkOGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDA2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQm9keTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBCUDI0MDYuCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQsIGlmIHRoZSB1c2UgYXR0cmlidXRlIGlzIHNwZWNpZmllZCBvbiB0aGUgc29hcGJpbmQ6Ym9keSwgc29hcGJpbmQ6ZmF1bHQsIHNvYXBiaW5kOmhlYWRlciwgb3Igc29hcGJpbmQ6aGVhZGVyZmF1bHQgZWxlbWVudHMuPC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB1c2UgYXR0cmlidXRlIGhhcyBhIHZhbHVlIG9mICJsaXRlcmFsIi48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyNDA2IGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyNDA2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICAvLyBHZXQgdGhlIGJpbmRpbmcgZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgIEJpbmRpbmcgYmluZGluZyA9IChCaW5kaW5nKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gR2V0IFNPQVAgYm9keSBlbGVtZW50cyAgICAgIAotICAgIFNPQVBCb2R5W10gc29hcEJvZGllcyA9IHRoaXMudmFsaWRhdG9yLmdldFNvYXBCb2RpZXMoYmluZGluZyk7Ci0KLSAgICAvLyBBREQ6IFdoYXQgaGFwcGVucyBpZiB0aGVyZSBhcmUgbm8gc29hcCBib2R5IGVsZW1lbnRzPyAgUmlnaHQgbm93IHRoZSBUQSByZXN1bHQgaXMgTkEuICAgICAgCi0KLSAgICAvLyBUZXN0IHRoZSBhc3NlcnRpb24gCi0gICAgLy8gQ2hlY2sgZm9yIGNvcnJlY3QgdXNlIHZhbHVlIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcEJvZGllcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTT0FQQm9keSBzb2FwQm9keSA9IHNvYXBCb2RpZXNbaV07Ci0gICAgICBpZiAoc29hcEJvZHkuZ2V0VXNlKCkgIT0gbnVsbAotICAgICAgICAmJiAhc29hcEJvZHkuZ2V0VXNlKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoc29hcEJvZHkudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IFNPQVAgZmF1bHQgZWxlbWVudHMgICAgICAKLSAgICBTT0FQRmF1bHRbXSBzb2FwRmF1bHRzID0gdGhpcy52YWxpZGF0b3IuZ2V0U29hcEZhdWx0cyhiaW5kaW5nKTsKLQotICAgIC8vIFRlc3QgdGhlIGFzc2VydGlvbiAKLSAgICAvLyBDaGVjayBmb3IgY29ycmVjdCB1c2UgdmFsdWUgCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb2FwRmF1bHRzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFNPQVBGYXVsdCBzb2FwRmF1bHQgPSBzb2FwRmF1bHRzW2ldOwotICAgICAgaWYgKHNvYXBGYXVsdC5nZXRVc2UoKSAhPSBudWxsCi0gICAgICAgICYmICFzb2FwRmF1bHQuZ2V0VXNlKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWxNZXNzYWdlID0KLSAgICAgICAgICAoZmFpbHVyZURldGFpbE1lc3NhZ2UgPT0gbnVsbAotICAgICAgICAgICAgPyBzb2FwRmF1bHQudG9TdHJpbmcoKQotICAgICAgICAgICAgOiBmYWlsdXJlRGV0YWlsTWVzc2FnZSArICJcblxuIiArIHNvYXBGYXVsdC50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKGZhaWx1cmVEZXRhaWwgPT0gbnVsbCkKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZmFpbHVyZURldGFpbE1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsLnNldEZhaWx1cmVNZXNzYWdlKGZhaWx1cmVEZXRhaWxNZXNzYWdlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IFNPQVAgaGVhZGVyIGVsZW1lbnRzICAgICAgCi0gICAgU09BUEhlYWRlcltdIHNvYXBIZWFkZXJzID0gdGhpcy52YWxpZGF0b3IuZ2V0U29hcEhlYWRlcnMoYmluZGluZyk7Ci0KLSAgICAvLyBUZXN0IHRoZSBhc3NlcnRpb24gCi0gICAgLy8gQ2hlY2sgZm9yIGNvcnJlY3QgdXNlIHZhbHVlIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcEhlYWRlcnMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU09BUEhlYWRlciBzb2FwSGVhZGVyID0gc29hcEhlYWRlcnNbaV07Ci0gICAgICBpZiAoc29hcEhlYWRlci5nZXRVc2UoKSAhPSBudWxsCi0gICAgICAgICYmICFzb2FwSGVhZGVyLmdldFVzZSgpLmVxdWFscyhXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICAgKGZhaWx1cmVEZXRhaWxNZXNzYWdlID09IG51bGwKLSAgICAgICAgICAgID8gc29hcEhlYWRlci50b1N0cmluZygpCi0gICAgICAgICAgICA6IGZhaWx1cmVEZXRhaWxNZXNzYWdlICsgIlxuXG4iICsgc29hcEhlYWRlci50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKGZhaWx1cmVEZXRhaWwgPT0gbnVsbCkKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZmFpbHVyZURldGFpbE1lc3NhZ2UsIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBmYWlsdXJlRGV0YWlsLnNldEZhaWx1cmVNZXNzYWdlKGZhaWx1cmVEZXRhaWxNZXNzYWdlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IFNPQVAgaGVhZGVyIGZhdWx0IGVsZW1lbnRzICAgICAgCi0gICAgU09BUEhlYWRlckZhdWx0W10gc29hcEhlYWRlckZhdWx0cyA9IHRoaXMudmFsaWRhdG9yLmdldFNvYXBIZWFkZXJGYXVsdHMoYmluZGluZyk7Ci0KLSAgICAvLyBUZXN0IHRoZSBhc3NlcnRpb24gCi0gICAgLy8gQ2hlY2sgZm9yIGNvcnJlY3QgdXNlIHZhbHVlIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29hcEhlYWRlckZhdWx0cy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTT0FQSGVhZGVyRmF1bHQgc29hcEhlYWRlckZhdWx0ID0gc29hcEhlYWRlckZhdWx0c1tpXTsKLSAgICAgIGlmIChzb2FwSGVhZGVyRmF1bHQuZ2V0VXNlKCkgIT0gbnVsbAotICAgICAgICAmJiAhc29hcEhlYWRlckZhdWx0LmdldFVzZSgpLmVxdWFscygKLSAgICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsTWVzc2FnZSA9Ci0gICAgICAgICAgKGZhaWx1cmVEZXRhaWxNZXNzYWdlID09IG51bGwKLSAgICAgICAgICAgID8gc29hcEhlYWRlckZhdWx0LnRvU3RyaW5nKCkKLSAgICAgICAgICAgIDogZmFpbHVyZURldGFpbE1lc3NhZ2UgKyAiXG5cbiIgKyBzb2FwSGVhZGVyRmF1bHQudG9TdHJpbmcoKSk7Ci0gICAgICAgIGlmIChmYWlsdXJlRGV0YWlsID09IG51bGwpCi0gICAgICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGZhaWx1cmVEZXRhaWxNZXNzYWdlLCBlbnRyeUNvbnRleHQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZmFpbHVyZURldGFpbC5zZXRGYWlsdXJlTWVzc2FnZShmYWlsdXJlRGV0YWlsTWVzc2FnZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIHRoZSByZXN1bHQgaXMgcGFzc2VkLCBidXQgdGhlcmUgd2FzIG5vdGhpbmcgdG8gY2hlY2sgdGhlbiBzZXQgdG8gbm90QXBwbGljYWJsZQotICAgIGlmIChyZXN1bHQgPT0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQKLSAgICAgICYmIChzb2FwQm9kaWVzID09IG51bGwgfHwgc29hcEJvZGllcy5sZW5ndGggPT0gMCkKLSAgICAgICYmIChzb2FwRmF1bHRzID09IG51bGwgfHwgc29hcEZhdWx0cy5sZW5ndGggPT0gMCkKLSAgICAgICYmIChzb2FwSGVhZGVycyA9PSBudWxsIHx8IHNvYXBIZWFkZXJzLmxlbmd0aCA9PSAwKQotICAgICAgJiYgKHNvYXBIZWFkZXJGYXVsdHMgPT0gbnVsbCB8fCBzb2FwSGVhZGVyRmF1bHRzLmxlbmd0aCA9PSAwKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDE2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjQxNi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTFlYmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLQotCi0vKioKLSogQlAyNDE2LiAKLSogICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9uczwvY29udGV4dD4KLSogICA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RXZlcnkgUU5hbWUgaW4gdGhlIFdTREwgZG9jdW1lbnQgYW5kIGl0cyBpbXBvcnRzLCBpcyByZWZlcmVuY2luZyBhbiBlbGVtZW50IGluIGEgbmFtZXNwYWNlIHRoYXQgaGFzIGVpdGhlciBiZWVuIGltcG9ydGVkIG9yIGRlZmluZWQgaW4gdGhlIFdTREwgZG9jdW1lbnQgdGhhdCBjb250YWlucyB0aGUgcmVmZXJlbmNlLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0qLwotcHVibGljIGNsYXNzIEJQMjQxNiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDI0MTYoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOU19MSVNUX0tFWSA9ICJuYW1lc3BhY2VzIjsKLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5hbWVzcGFjZSBpcyBkZWZpbmVkIG9yIGltcG9ydGVkIGluIHRoZSBkZWZpbml0aW9uLgotICAgKiBAcGFyYW0gcW5hbWUKLSAgICogQHBhcmFtIGN0eAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrTmFtZXNwYWNlKFFOYW1lIHFuYW1lLCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZXNwYWNlID0gcW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBuYW1lc3BhY2VzID0gKExpc3QpIGN0eC5nZXRQYXJhbWV0ZXIoTlNfTElTVF9LRVkpOwotCi0gICAgICAgIGlmICghbmFtZXNwYWNlcy5jb250YWlucyhuYW1lc3BhY2UpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbE1lc3NhZ2UgPSBuYW1lc3BhY2U7Ci0KLSAgICAgICAgICBjdHguY2FuY2VsUHJvY2Vzc2luZygpOwotICAgICAgICB9Ci0gICAgICB9IC8vID8/PyBzaG91bGQgd2UgZG8gc29tZXRoaW5nIG90aGVyd2lzZSAgCi0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5Qb3J0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBwb3J0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAocG9ydCAhPSBudWxsKQotICAgIHsKLSAgICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0QmluZGluZygpOwotICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY2hlY2tOYW1lc3BhY2UoYmluZGluZy5nZXRRTmFtZSgpLCBjdHgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuQmluZGluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmcgYmluZGluZywgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBQb3J0VHlwZSBwVHlwZSA9IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKTsKLSAgICAgIGlmIChwVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBjaGVja05hbWVzcGFjZShwVHlwZS5nZXRRTmFtZSgpLCBjdHgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRJbnB1dCgpOwotICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNoZWNrTmFtZXNwYWNlKGlucHV0LmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpLCBjdHgpOwotICAgICAgfQotCi0gICAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldE91dHB1dCgpOwotICAgICAgaWYgKG91dHB1dCAhPSBudWxsICYmIG91dHB1dC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY2hlY2tOYW1lc3BhY2Uob3V0cHV0LmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpLCBjdHgpOwotICAgICAgfQotCi0gICAgICBNYXAgZmF1bHRzID0gb3BlcmF0aW9uLmdldEZhdWx0cygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZmF1bHRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgRmF1bHQgZmF1bHQgPSAoRmF1bHQpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgIGlmIChmYXVsdC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGNoZWNrTmFtZXNwYWNlKGZhdWx0LmdldE1lc3NhZ2UoKS5nZXRRTmFtZSgpLCBjdHgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5NZXNzYWdlLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgLyogUkVNT1ZFOiBUaGlzIGlzIGFscmVhZHkgZG9uZSBpbiBXU0kyNDE3Ci0gIHB1YmxpYyB2b2lkIHZpc2l0KE1lc3NhZ2UgbWVzc2FnZSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KSB7Ci0gICBpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgIE1hcCBwYXJ0cyA9IG1lc3NhZ2UuZ2V0UGFydHMoKTsKLSAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIGl0ZXIubmV4dCgpOwotICAgICAgIAotICAgICAgIGNoZWNrTmFtZXNwYWNlKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSwgY3R4KTsgICAgICAgICAgICAgICAgCi0gICAgICAgY2hlY2tOYW1lc3BhY2UocGFydC5nZXRUeXBlTmFtZSgpLCBjdHgpOwotICAgICB9Ci0gICB9Ci0gIH0KLSAgKi8KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAvLyBHZXQgdGhlIGRlZmluaXRpb24gZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9Ci0gICAgICAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIC8vIGdldCBsaXN0IG9mIG5hbWVzcGFjZXMgaW1wb3J0ZWQgYW5kIGRlZmluZWQgaW4gdGhlIGRlZmluaXRpb24KLSAgICBMaXN0IG5hbWVzcGFjZXMgPSB0aGlzLnZhbGlkYXRvci5nZXRXU0RMVGFyZ2V0TmFtZXNwYWNlTGlzdChkZWZpbml0aW9uKTsKLQotICAgIC8vIFJFTU9WRToKLSAgICAvL01hcCBuYW1lc3BhY2VzID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0KLSAgICAvLyB0cmF2ZXJzZSBkZWZpbml0aW9uIHRvIGNoZWNrIG5hbWVzcGFjZXMKLSAgICBNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwYXJhbXMucHV0KE5TX0xJU1RfS0VZLCBuYW1lc3BhY2VzKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvLyBWaXNpdG9yQWRhcHRvci5hZGFwdCh0aGlzKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRPcGVyYXRpb24odHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0QmluZGluZyh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRNZXNzYWdlKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFBvcnQodHJ1ZSk7Ci0KLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoZGVmaW5pdGlvbiwgcGFyYW1zKTsKLQotICAgIGlmIChyZXN1bHQuZXF1YWxzKEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEKSkKLSAgICB7Ci0gICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKGZhaWx1cmVEZXRhaWxNZXNzYWdlLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDE3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjQxNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzQzZDQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNDE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotICogQlAyNDE3LiAKLSAqICAgPGNvbnRleHQ+Rm9yIGEgY2FuZGlkYXRlIHdzZGw6ZGVmaW5pdGlvbnM8L2NvbnRleHQ+Ci0gKiAgIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5FdmVyeSBRTmFtZSBpbiB0aGUgV1NETCBkb2N1bWVudCBhbmQgaXRzIGltcG9ydHMgYW5kIHRoYXQgCi0gKiAgICAgIGlzIHJlZmVycmluZyB0byBhIHNjaGVtYSBjb21wb25lbnQsIHVzZXMgdGhlIG5hbWVzcGFjZSBkZWZpbmVkIGluIHRoZSB0YXJnZXROYW1lc3BhY2UgCi0gKiAgICAgIGF0dHJpYnV0ZSBvbiB0aGUgeHM6c2NoZW1hIGVsZW1lbnQsIG9yIGEgbmFtZXNwYWNlIGRlZmluZWQgaW4gdGhlIG5hbWVzcGFjZSBhdHRyaWJ1dGUgCi0gKiAgICAgIG9uIGFuIHhzOmltcG9ydCBlbGVtZW50IHdpdGhpbiB0aGUgeHM6c2NoZW1hIGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjQxNyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDI0MTcoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9yTGlzdCA9IG5ldyBFcnJvckxpc3QoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX0xJU1RfS0VZID0gIm5hbWVzcGFjZXMiOwotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbmFtZXNwYWNlIGlzIGRlZmluZWQgb3IgaW1wb3J0ZWQgaW4gdGhlIGRlZmluaXRpb24uCi0gICAqIEBwYXJhbSBxbmFtZQotICAgKiBAcGFyYW0gY3R4Ci0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tOYW1lc3BhY2UoUU5hbWUgcW5hbWUsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBxbmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQotICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBMaXN0IG5hbWVzcGFjZUxpc3QgPSAoTGlzdCkgY3R4LmdldFBhcmFtZXRlcihOU19MSVNUX0tFWSk7Ci0KLSAgICAgICAgaWYgKChuYW1lc3BhY2VMaXN0ICE9IG51bGwpICYmICFuYW1lc3BhY2VMaXN0LmNvbnRhaW5zKG5hbWVzcGFjZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvckxpc3QuYWRkKHFuYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5NZXNzYWdlLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoTWVzc2FnZSBtZXNzYWdlLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIE1hcCBwYXJ0cyA9IG1lc3NhZ2UuZ2V0UGFydHMoKTsKLQotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBQYXJ0IHBhcnQgPSAoUGFydCkgaXRlci5uZXh0KCk7Ci0KLSAgICAgICAgY2hlY2tOYW1lc3BhY2UocGFydC5nZXRFbGVtZW50TmFtZSgpLCBjdHgpOwotICAgICAgICBjaGVja05hbWVzcGFjZShwYXJ0LmdldFR5cGVOYW1lKCksIGN0eCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIC8vIEdldCB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZSBlbnRyeSBjb250ZXh0Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLy8gR2V0IGEgbGlzdCBvZiBhbGwgc2NoZW1hIHRhcmdldE5hbWVzcGFjZXMKLSAgICBMaXN0IHRuc0xpc3QgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmICgodG5zTGlzdCA9IHRoaXMudmFsaWRhdG9yLmdldFNjaGVtYU5hbWVzcGFjZUxpc3QoZGVmaW5pdGlvbikpID09IG51bGwpCi0gICAgICAgIHRuc0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIHdvdWxkIGluZGljYXRlIHRoYXQgdGhlIHNjaGVtYSBkZWZpbml0aW9uIGhhZCBhIHByb2JsZW0KLSAgICAgIHRuc0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgfQotCi0gICAgLy8gQWx3YXlzIGFkZCBYTUwgc2NoZW1hIG5hbWVzcGFjZSB0byBjb3ZlciBidWlsdC1pbiB0eXBlcwotICAgIHRuc0xpc3QuYWRkKFdTSUNvbnN0YW50cy5OU19VUklfWFNEKTsKLQotICAgIC8vIFRyYXZlcnNlIGRlZmluaXRpb24gdG8gY2hlY2sgc2NoZW1hIG5hbWVzcGFjZXMKLSAgICBNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLSAgICBwYXJhbXMucHV0KE5TX0xJU1RfS0VZLCB0bnNMaXN0KTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRNZXNzYWdlKHRydWUpOwotCi0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLnRyYXZlcnNlKGRlZmluaXRpb24sIHBhcmFtcyk7Ci0KLSAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vIGVycm9ycywgdGhlbiB0aGUgYXNzZXJ0aW9uIHBhc3NlZAotICAgIGlmIChlcnJvckxpc3QuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgIH0KLQotICAgIC8vIE90aGVyd2lzZSBpdCBmYWlsZWQgLyBjcmVhdGUgdGhlIGZhaWx1cmUgZGV0YWlsIHVzaW5nIHRoZSBRTmFtZXMgdGhhdCB3ZXJlIGluIGVycm9yCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoZXJyb3JMaXN0LnRvU3RyaW5nKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI3MDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyNzAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjIzMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI3MDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAgKiBCUDI3MDAuCi0gICogICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9ucyBlbGVtZW50IHdpdGhpbiBhIFdTREwgZG9jdW1lbnQuPC9jb250ZXh0PgotICAqICAgPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB3c2RsOmRlZmluaXRpb25zIGlzIGEgd2VsbC1mb3JtZWQgWE1MIDEuMCBkb2N1bWVudC48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICAqLwotcHVibGljIGNsYXNzIEJQMjcwMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjcwMChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvL1N0cmluZyB3c2RsVVJJID0gZW50cnlDb250ZXh0LmdldFdTRExEb2N1bWVudCgpLmdldERlZmluaXRpb25zKCkuZ2V0RG9jdW1lbnRCYXNlVVJJKCk7ICAKLSAgICAgIC8vIFRFTVA6IE5lZWQgdG8gZGVmaW5lIGEgYmV0dGVyIHdheSB0byBnZXQgdGhlIFdTREwgVVJJCi0gICAgICBTdHJpbmcgd3NkbFVSSSA9IGVudHJ5Q29udGV4dC5nZXRFbnRyeSgpLmdldFJlZmVyZW5jZUlEKCk7Ci0gICAgICAvLyBub24tdmFsaWRhdGluZyBwYXJzZQotICAgICAgWE1MVXRpbHMucGFyc2VYTUxEb2N1bWVudCh3c2RsVVJJKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBTQVhFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgICB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgICAgVXRpbHMuZ2V0RXhjZXB0aW9uRGV0YWlscyhlLmdldFRhcmdldEV4Y2VwdGlvbigpKSwKLSAgICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgZmFpbHVyZURldGFpbCA9Ci0gICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoVXRpbHMuZ2V0RXhjZXB0aW9uRGV0YWlscyhlKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjcwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI3MDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0YzFmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjcwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLQotCi0vKioKLSAgKiBCUDI3MDEuCi0gICogICA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9ucyBlbGVtZW50IHdpdGhpbiBhIFdTREwgZG9jdW1lbnQuPC9jb250ZXh0PgotICAqICAgPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB3c2RsOmRlZmluaXRpb25zIG5hbWVzcGFjZSBoYXMgdmFsdWU6IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gICovCi1wdWJsaWMgY2xhc3MgQlAyNzAxIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyNzAxKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBEZWZpbml0aW9uIGRlZiA9IChEZWZpbml0aW9uKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgLyoKLSAgICBpZiAoZGVmICE9IG51bGwpIHsKLSAgICAJUU5hbWUgcW5hbWUgPSBkZWYuZ2V0UU5hbWUoKTsKLSAgICAJCQkJCi0gICAgCWlmIChxbmFtZSAhPSBudWxsKSB7CQotICAgIAkJLy9pZiAoZGVmLmdldE5hbWVzcGFjZSgiIikuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCkgewotICAgIAkJaWYgKHFuYW1lLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1dTREwpKSB7Ci0gICAgCQkJcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0gICAgKi8KLQotICAgIHRyeQotICAgIHsKLSAgICAgIFN0cmluZyBzY2hlbWFVc2VkID0gdGhpcy52YWxpZGF0b3IuZ2V0U2NoZW1hVXNlZChkZWYpOwotICAgICAgaWYgKHNjaGVtYVVzZWQuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChBc3NlcnRpb25GYWlsRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAvL0FERDogZmFpbHVyZSBkZXNjcmlwdGlvbj8KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjcwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI3MDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzYTY5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQMjcwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLyoqCi0gKiBCUDI3MDMuCi0gKiAgIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSBkZXNjcmlwdGlvbiB3aXRoaW4gYSBXU0RMIGRvY3VtZW50LCBpZiBpdCB1c2VzIHRoZSBXU0RMIG5hbWVzcGFjZTwvY29udGV4dD4KLSAqICAgPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSBkZWZpbml0aW9uIGNvbmZvcm1zIHRvIHRoZSBXU0RMIHNjaGVtYSBsb2NhdGVkIGF0IGh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvMjAwMy0wMi0xMS54c2Q8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgQlAyNzAzIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2VzcwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlAyNzAzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgICAgaWYgKGRlZiA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiRGVmaW5pdGlvbiBudWxsIik7Ci0gICAgICB9Ci0KLSAgICAgIFN0cmluZyB3c2RsVVJJID0gZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0UmVmZXJlbmNlSUQoKTsKLQotICAgICAgTWFwIG5hbWVzcGFjZXMgPSBkZWYuZ2V0TmFtZXNwYWNlcygpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbmFtZXNwYWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCi0gICAgICAgIGlmIChXU0lDb25zdGFudHMuTlNfVVJJX1dTREwuZXF1YWxzSWdub3JlQ2FzZShucykpCi0gICAgICAgIHsKLSAgICAgICAgCVhNTFV0aWxzLnBhcnNlWE1MRG9jdW1lbnQod3NkbFVSSSwgVGVzdFV0aWxzLmdldFdTRExTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChXU0lDb25zdGFudHMuTlNfVVJJX1dTRExfU09BUC5lcXVhbHNJZ25vcmVDYXNlKG5zKSkKLSAgICAgICAgewotICAgICAgICAJWE1MVXRpbHMucGFyc2VYTUxEb2N1bWVudCh3c2RsVVJJLCBUZXN0VXRpbHMuZ2V0V1NETFNPQVBTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICAgIGZhaWx1cmVEZXRhaWwgPQotICAgICAgICAgIHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICAgICAgICBVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpLAotICAgICAgICAgICAgZW50cnlDb250ZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0KLSAgICAgICAgdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChVdGlscy5nZXRFeGNlcHRpb25EZXRhaWxzKGUpLCBlbnRyeUNvbnRleHQpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBhc3NlcnRpb24gcmVzdWx0Ci0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI4MDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlAyODAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjAyYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDI4MDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbkZhaWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLkFzc2VydGlvbk5vdEFwcGxpY2FibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci0KLQotLyoqCi0gKiBCUDI4MDMKLSAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmltcG9ydCBlbGVtZW50PC9jb250ZXh0PgotICogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSAibmFtZXNwYWNlIiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGZvciB0aGUgd3NkbDppbXBvcnQgZWxlbWVudCwgYW5kIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyBub3QgYSByZWxhdGl2ZSBVUkkuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIEJQMjgwMyBleHRlbmRzIEFzc2VydGlvblByb2Nlc3MKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIEJQMjgwMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICBUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24sCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIC8vIEdldHRpbmcgd3NkbDppbXBvcnQKLSAgICBJbXBvcnQgaW0gPSAoSW1wb3J0KSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gdGhlICJuYW1lc3BhY2UiIGF0dHJpYnV0ZSBpbiB0aGUgaW1wb3J0LAotICAgICAgLy8gdGhlIGFzc2VydGlvbiBpcyBub3QgYXBwbGljYWJsZQotICAgICAgaWYgKGltLmdldE5hbWVzcGFjZVVSSSgpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25Ob3RBcHBsaWNhYmxlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIGEgbmFtZXNwYWNlIFVSSSBpcyByZWxhdGl2ZSBvciBpbnZhbGlkLCB0aGUgYXNzZXJ0aW9uIGZhaWxlZAotICAgICAgVVJJIHVyaSA9IG5ldyBVUkkoaW0uZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgaWYgKCF1cmkuaXNBYnNvbHV0ZSgpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigKLSAgICAgICAgICBpbS5nZXROYW1lc3BhY2VVUkkoKSArICIgaXMgcmVsYXRpdmUgVVJJLiIpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQXNzZXJ0aW9uTm90QXBwbGljYWJsZUV4Y2VwdGlvbiBhbmFlKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRDsKLSAgICAgIGZhaWx1cmVEZXRhaWwgPSB2YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICAgICAgZS5nZXRNZXNzYWdlKCksIGVudHJ5Q29udGV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQoCi0gICAgICB0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDQyMDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlA0MjAwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzczMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDQyMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEJQNDIwMC4gCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9ucyB0aGF0IGNvbnRhaW5zIGEgd3NkbCBleHRlbnNpb24gZWxlbWVudCBvciBhdHRyaWJ1dGUgZnJvbSBhIG5hbWVzcGFjZSBvdGhlciB0aGFuICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+Q29udGFpbmVkIFdTREwgZXh0ZW5zaW9uIGVsZW1lbnRzIHRoYXQgZG8gbm90IGJlbG9uZyB0byB0aGUgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIG5hbWVzcGFjZXMgbWF5IHJlcXVpcmUgb3V0IG9mIGJhbmQgbmVnb3RpYXRpb24uPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSovCi1wdWJsaWMgY2xhc3MgQlA0MjAwIGV4dGVuZHMgQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3IgaW1wbGVtZW50cyBXU0lUYWcKLXsKLSAgcHJpdmF0ZSBmaW5hbCBXU0RMVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3I7Ci0gIHByaXZhdGUgRXJyb3JMaXN0IGVycm9yTGlzdCA9IG5ldyBFcnJvckxpc3QoKTsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgQlA0MjAwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChFeHRlbnNpYmlsaXR5RWxlbWVudCBvYmosIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgLy8gSWYgYSBjaGlsZCBlbGVtZW50IG9mIHdzZGw6dHlwZXMgaXMgZnJvbSBhIG5hbWVzcGFjZSBvdGhlciB0aGFuCi0gICAgLy8gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBUeXBlcykKLSAgICB7Ci0gICAgICAvL2lmICghb2JqLmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKAotICAgICAgLy8gIFdTSUNvbnN0YW50cy5OU19VUklfWFNEKSkKLSAgICAgIC8vewotICAgICAgLy8gIEFkZCBlbGVtZW50IG5hbWUgdG8gZXJyb3IgbGlzdAotICAgICAgLy8gIGVycm9yTGlzdC5hZGQob2JqLmdldEVsZW1lbnRUeXBlKCkpOwotICAgICAgLy99Ci0gICAgfQotICAgIC8vIG9yIGFueSBvdGhlciBleHQgZWxlbWVudCBjb21pbmcgZnJvbSBhIG5hbWVzcGFjZSBvdGhlciB0aGFuCi0gICAgLy8gImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0gICAgZWxzZSBpZiAoIW9iai5nZXRFbGVtZW50VHlwZSgpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscyhXU0lDb25zdGFudHMuTlNfVVJJX1dTRExfU09BUCkKLSAgICAJICAmJiAhb2JqLmdldEVsZW1lbnRUeXBlKCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCkpCi0gICAgewotICAgICAgLy8gQWRkIGVsZW1lbnQgbmFtZSB0byBlcnJvciBsaXN0Ci0gICAgICBlcnJvckxpc3QuYWRkKG9iai5nZXRFbGVtZW50VHlwZSgpKTsgCi0gICAgfQotICB9Ci0KLSAgIC8qKgotICAqICAobm9uLUphdmFkb2MpCi0gICogIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwuQXNzZXJ0aW9uUHJvY2VzcyN2YWxpZGF0ZShvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBHZXQgdGhlIGRlZmluaXRpb24gZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9Ci0gICAgICAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLQotICAgIHRyYXZlcnNhbC52aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdEVsZW1lbnQodHJ1ZSk7Ci0KLSAgICB0cmF2ZXJzYWwuaWdub3JlSW1wb3J0KCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZVJlZmVyZW5jZXMoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoZGVmaW5pdGlvbik7Ci0KLSAgICB0cnkKLQl7Ci0gICAgICAvLyBnZXR0aW5nIFdTREwgZG9jdW1lbnQuCi0gICAgICBEb2N1bWVudCBkb2MgPSBYTUxVdGlscy5wYXJzZVhNTERvY3VtZW50KGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgICAgaWYgKGRvYyAhPSBudWxsKQotICAgICAgeyAgIAotICAgICAgICBjaGVja0VsZW1lbnQoZG9jLmdldERvY3VtZW50RWxlbWVudCgpKTsKLQotICAgICAgICBpZiAoZXJyb3JMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfTk9UX0FQUExJQ0FCTEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmFpbHVyZURldGFpbCA9IHZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKAotICAgICAgICAgIHRlc3RBc3NlcnRpb24uZ2V0RGV0YWlsRGVzY3JpcHRpb24oKSArICJcblxuIiArIGVycm9yTGlzdC50b1N0cmluZygpLAotICAgICAgICAgIGVudHJ5Q29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQl9ICAgCi0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLQl9Ci0gICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCgKLSAgICAgIHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgb24gd3NkbCBlbGVtZW50cyByZWN1cnNpdmVseSB3aGV0aGVyIHRoZXkgY29udGFpbiBleHRlbnNpb24gYXR0cmlidXRlcy4KLSAgICogQHBhcmFtIGVsZW0gRWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja0VsZW1lbnQoRWxlbWVudCBlbGVtKQotICB7Ci0gICAgd2hpbGUgKGVsZW0gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZWxlbU5TID0gZWxlbS5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRycyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgaWYgKGF0dHJzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotICAgICAgICAgIFN0cmluZyBhdHRyTlMgPSBhdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgICAgIGlmIChhdHRyTlMgIT0gbnVsbAotICAgICAgICAgICAgJiYgIWF0dHJOUy5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9YTUxOUykKLSAgICAgICAgICAgICYmICFhdHRyTlMuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NETCkKLQkJCSYmICFhdHRyTlMuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19VUklfV1NETF9TT0FQKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvckxpc3QuYWRkKCJFeHRlbnNpYmlsaXR5IGF0dHJpYnV0ZSAiICsgYXR0ci5nZXROYW1lKCkKLSAgICAgICAgICAgICAgKyAiZm9yIHRoZSAiICsgZWxlbS5nZXROb2RlTmFtZSgpICsgIiBlbGVtZW50IGlzIGZvdW5kLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIWVsZW1OUy5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX1VSSV9YU0QpKQotICAgICAgewotICAgICAgICBjaGVja0VsZW1lbnQoWE1MVXRpbHMuZ2V0Rmlyc3RDaGlsZChlbGVtKSk7Ci0gICAgICB9Ci0gICAgICBlbGVtID0gWE1MVXRpbHMuZ2V0TmV4dFNpYmxpbmcoZWxlbSk7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDQyMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlA0MjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjEzMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9CUDQyMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotCi0KLS8qKgotKiBCUDQyMDEuIAotKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDppbXBvcnQgZWxlbWVudCwgd2hlcmUgdGhlIGxvY2F0aW9uIGF0dHJpYnV0ZSBvciB0aGUgbmFtZXNwYWNlIGF0dHJpYnV0ZSBoYXMgYSB2YWx1ZSB0aGF0IGlzIGEgcmVsYXRpdmUgVVJJLCBvciBhIGZvciBzb2FwOmFkZHJlc3MgZWxlbWVudCB3aGVyZSB0aGUgbG9jYXRpb24gYXR0cmlidXRlIGlzIGEgcmVsYXRpdmUgVVJJLjwvY29udGV4dD4KLSogPGFzc2VydGlvbkRlc2NyaXB0aW9uPlRoZSB1c2Ugb2YgYSByZWxhdGl2ZSBVUkkgYXMgdGhlIHZhbHVlIGZvciBhIHdzZGw6aW1wb3J0IGxvY2F0aW9uIG9yIG5hbWVzcGFjZSBhdHRyaWJ1dGUsIG9yIGZvciBhIHNvYXA6YWRkcmVzcyBsb2NhdGlvbiBhdHRyaWJ1dGUgbWF5IHJlcXVpcmUgb3V0IG9mIGJhbmQgY29vcmRpbmF0aW9uLjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0qLwotcHVibGljIGNsYXNzIEJQNDIwMSBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDQyMDEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotICBwcml2YXRlIEVycm9yTGlzdCBlcnJvckxpc3QgPSBuZXcgRXJyb3JMaXN0KCk7Ci0KLSAgLyoqIAotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChJbXBvcnQsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJbXBvcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZihvYmogIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZihpc1JlbGF0aXZlVVJJKG9iai5nZXROYW1lc3BhY2VVUkkoKSkgfHwgCi0gICAgICAgICAgaXNSZWxhdGl2ZVVSSShvYmouZ2V0TG9jYXRpb25VUkkoKSkpCi0gICAgICB7Ci0gICAgICAgIGVycm9yTGlzdC5hZGQob2JqLmdldE5hbWVzcGFjZVVSSSgpLCBvYmouZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqIAotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChQb3J0LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmKG9iaiAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICAgT2JqZWN0IGUgPSAoT2JqZWN0KSBpdC5uZXh0KCk7Ci0gICAgICAgICAvLyBmb3IgZWFjaCBTT0FQQWRkcmVzcyBlbGVtZW50cyBjaGVjayBMb2NhdGlvblVSSSAKLSAgICAgICAgIGlmKGUgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotICAgICAgICAgICBpZihpc1JlbGF0aXZlVVJJKCgoU09BUEFkZHJlc3MpIGUpLmdldExvY2F0aW9uVVJJKCkpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgZXJyb3JMaXN0LmFkZCgoKFNPQVBBZGRyZXNzKSBlKS5nZXRFbGVtZW50VHlwZSgpICsgCi0gICAgICAgICAgICAgICAgICI6IiArICgoU09BUEFkZHJlc3MpIGUpLmdldExvY2F0aW9uVVJJKCkpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqICAobm9uLUphdmFkb2MpCi0gICAqICBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9QQVNTRUQ7Ci0KLSAgICAvLyBHZXQgdGhlIGRlZmluaXRpb24gZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9Ci0gICAgICAoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih0aGlzKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRJbXBvcnQodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0UG9ydCh0cnVlKTsKLSAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZShkZWZpbml0aW9uKTsKLQotICAgIGlmIChlcnJvckxpc3QuaXNFbXB0eSgpKSAKLSAgICB7Ci0gICAgICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgCi0gICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9OT1RfQVBQTElDQUJMRSwgKFN0cmluZykgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIGZhaWx1cmVEZXRhaWwgPSB0aGlzLnZhbGlkYXRvci5jcmVhdGVGYWlsdXJlRGV0YWlsKHRlc3RBc3NlcnRpb24uZ2V0RmFpbHVyZU1lc3NhZ2UoKSArIAotICAgICAgICAiXG5cbiIgKyBlcnJvckxpc3QudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAvLyBSZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdAotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiBVUkkgaXMgcmVsYXRpdmUgCi0gICAqIEBwYXJhbSBzIC0gVVJJCi0gICAqIEByZXR1cm4gdHJ1ZSAtIGlmIFVSSSBpcyByZWxhdGl2ZSwgZmFsc2UgLSBpbiBvdGhlciBjYXNlICAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc1JlbGF0aXZlVVJJKFN0cmluZyBzKQotICB7Ci0gICAgaWYocyA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHRyeQotICAgIHsKLSAgICAgIGlmKG5ldyBqYXZhLm5ldC5VUkkocykuaXNBYnNvbHV0ZSgpKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlA0MjAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL0JQNDIwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDdjYmJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvQlA0MjAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkFzc2VydGlvblByb2Nlc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkVycm9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxEb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuc2NoZW1hLlhNTFNjaGVtYVByb2Nlc3NvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBCUDQyMDIuIAotICogPGNvbnRleHQ+Rm9yIGFuIFhNTCBzY2hlbWEgZGVmaW5pdGlvbiBkZWZpbmVkIGluIHRoZSB3c2RsOnR5cGVzIGVsZW1lbnQsIG9yIGltcG9ydGVkIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgYnkgYSBzY2hlbWEgZGVmaW5pdGlvbiBkZWZpbmVkIGluIHRoZSB3c2RsOnR5cGVzIGVsZW1lbnQsIHdoaWNoIGNvbnRhaW5zIGFueSBzY2hlbWEgYW5ub3RhdGlvbiBlbGVtZW50cy48L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+QW4gWE1MIHNjaGVtYSBkZWZpbml0aW9uIGRlZmluZWQgaW4gdGhlIHdzZGw6dHlwZXMgZWxlbWVudCwgb3IgaW1wb3J0ZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBieSBhIHNjaGVtYSBkZWZpbml0aW9uIGRlZmluZWQgaW4gdGhlIHdzZGw6dHlwZXMgZWxlbWVudCwgbWF5IHVzZSBzY2hlbWEgYW5ub3RhdGlvbiBlbGVtZW50cyBhcyBhbiBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbS48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi0gcHVibGljIGNsYXNzIEJQNDIwMiBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnIAotIHsKLSAgIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBCUDQyMDIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0tFWSA9ICJhbm5vdGF0aW9uIjsKLSAgIAotICAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JMaXN0ID0gbmV3IEVycm9yTGlzdCgpOwotICAgcHJpdmF0ZSBBbm5vdGF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvcjsKLQotICAgLyoqIAotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KE1lc3NhZ2UsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgKi8KLSAgIHB1YmxpYyB2b2lkIHZpc2l0KEV4dGVuc2liaWxpdHlFbGVtZW50IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgewotICAgICBpZigob2JqICE9IG51bGwpICYmIChvYmogaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpKQotICAgICB7Ci0gICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGVsID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgb2JqOwotICAgICAgIHRyeSB7Ci0gICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc0FsbFNjaGVtYShlbC5nZXRFbGVtZW50KCkpOwotICAgICAgIH0gY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKSB7fQotICAgICB9Ci0gICB9Ci0KLSAgIC8qKgotICAgICogIChub24tSmF2YWRvYykKLSAgICAqICBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICAqLwotICAgcHVibGljIEFzc2VydGlvblJlc3VsdCB2YWxpZGF0ZSgKLSAgICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gICB7Ci0gICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VEOwotCi0gICAgIC8vIEdldCB0aGUgdHlwZXMgZnJvbSB0aGUgZW50cnkgY29udGV4dAotICAgICBUeXBlcyB0eXBlcyA9Ci0gICAgICAgKFR5cGVzKSBlbnRyeUNvbnRleHQuZ2V0RW50cnkoKS5nZXRFbnRyeURldGFpbCgpOwotICAgICAKLSAgICAgcHJvY2Vzc29yID0gbmV3IEFubm90YXRpb25Qcm9jZXNzb3IoCi0gICAgICAgICAgIGVudHJ5Q29udGV4dC5nZXRXU0RMRG9jdW1lbnQoKS5nZXREZWZpbml0aW9ucygpLmdldERvY3VtZW50QmFzZVVSSSgpLCAKLSAgICAgICAgICAgdmFsaWRhdG9yLmdldERvY3VtZW50TGlzdCgpKTsKLSAgICAgCi0gICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgIHRyYXZlcnNhbC52aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KHRydWUpOwotICAgICB0cmF2ZXJzYWwuaWdub3JlUmVmZXJlbmNlcygpOwotICAgICB0cmF2ZXJzYWwudHJhdmVyc2UodHlwZXMpOwotICAgICAKLSAgICAgaWYgKGVycm9yTGlzdC5pc0VtcHR5KCkpIAotICAgICB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIAotICAgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFLCAoU3RyaW5nKSBudWxsKTsKLSAgICAgfQotICAgICAKLSAgICAgZmFpbHVyZURldGFpbCA9IHRoaXMudmFsaWRhdG9yLmNyZWF0ZUZhaWx1cmVEZXRhaWwodGVzdEFzc2VydGlvbi5nZXRGYWlsdXJlTWVzc2FnZSgpICsgCi0gICAgICAgICAiXG5cbiIgKyBlcnJvckxpc3QudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgLy8gUmV0dXJuIGFzc2VydGlvbiByZXN1bHQKLSAgICAgcmV0dXJuIHZhbGlkYXRvci5jcmVhdGVBc3NlcnRpb25SZXN1bHQodGVzdEFzc2VydGlvbiwgcmVzdWx0LCBmYWlsdXJlRGV0YWlsKTsKLSAgIH0KLSAgIAotICAgLyoqCi0gICAgKiBDbGFzcyBmb3IgcGFyc2Ugc2NoZW1hIGFuZCBzZWFyY2ggYW5ub3RhdGlvbiBlbGVtZW50cyAKLSAgICAqLwotICAgY2xhc3MgQW5ub3RhdGlvblByb2Nlc3NvciBleHRlbmRzIFhNTFNjaGVtYVByb2Nlc3NvcgotICAgewotICAgICBwdWJsaWMgQW5ub3RhdGlvblByb2Nlc3NvcigKLSAgICAgICBTdHJpbmcgY29udGV4dCwKLSAgICAgICBYTUxEb2N1bWVudENhY2hlIGRvY3VtZW50TGlzdCkKLSAgICAgewotICAgICAgIHN1cGVyKGNvbnRleHQsIGRvY3VtZW50TGlzdCwgZmFsc2UpOwotICAgICB9Ci0KLSAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1NjaGVtYShFbGVtZW50IGVsZW1lbnQpCi0gICAgIHsKLSAgICAgICBjaGVja0ZvckFubm90YXRpb24oZWxlbWVudCk7Ci0gICAgIH0KLSAgICAgCi0gICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvckFubm90YXRpb24oTm9kZSBub2RlKSAKLSAgICAgewotICAgICAgIGlmKChub2RlLmdldExvY2FsTmFtZSgpICE9IG51bGwpICYmIChub2RlLmdldExvY2FsTmFtZSgpLmVxdWFscyhBTk5PVEFUSU9OX0tFWSkpKSB7Ci0gICAgICAgICBlcnJvckxpc3QuYWRkKG5vZGUudG9TdHJpbmcoKSk7Ci0gICAgICAgfQotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgICB7Ci0gICAgICAgICBjaGVja0ZvckFubm90YXRpb24obm9kZS5nZXRDaGlsZE5vZGVzKCkuaXRlbShpKSk7Ci0gICAgICAgfQotICAgICB9Ci0gICB9Ci0gfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvU1NCUDIyMDkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvU1NCUDIyMDkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0ZGQwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1NTQlAyMjA5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0KLS8qKgotICogU1NCUDIyMDkKLSAqCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+VGhlIHdzZGw6YmluZGluZyBiaW5kcyBldmVyeSB3c2RsOnBhcnQgb2YgYSB3c2RsOm1lc3NhZ2UgaW4gdGhlIHdzZGw6cG9ydFR5cGUgdG8gd2hpY2ggaXQgcmVmZXJzIHRvIG9uZSBvZiBzb2FwYmluZDpib2R5LCBzb2FwYmluZDpoZWFkZXIsIHNvYXBiaW5kOmZhdWx0IG9yIHNvYXBiaW5kOmhlYWRlcmZhdWx0LjwvYXNzZXJ0aW9uRGVzY3JpcHRpb24+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTU0JQMjIwOSBleHRlbmRzIEJQMjExNAotewotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgU1NCUDIyMDkoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9TU0JQMjQwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9TU0JQMjQwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjkxZjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvU1NCUDI0MDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogU1NCUDI0MDIKLSAqLwotcHVibGljIGNsYXNzIFNTQlAyNDAyIGV4dGVuZHMgQlAyNDAyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFNTQlAyNDAyKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvU1NCUDI0MDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvU1NCUDI0MDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxMzIwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1NTQlAyNDAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLlVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVHJhdmVyc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogU1NCUDI0MDMuCi0gKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQ8L2NvbnRleHQ+Ci0gKiA8YXNzZXJ0aW9uRGVzY3JpcHRpb24+RGVzY2VuZGFudCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB0aGUgd3NkbDpiaW5kaW5nIGFyZSBub3QgZnJvbSB0aGUgbmFtZXNwYWNlcyBmb3IgdGhlIFdTREwgTUlNRSwgSFRUUCBHRVQvUE9TVCBvciBESU1FIGJpbmRpbmcgZXh0ZW5zaW9ucy48L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgU1NCUDI0MDMgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgU1NCUDI0MDMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICAgIHRoaXMudmFsaWRhdG9yID0gaW1wbDsKLSAgfQotCi0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRoZSBuYW1lc3BhY2Ugc3BlY2lmaWVzIGFueSBXU0RMIE1JTUUsCi0gICAqIEhUVFAgR0VUL1BPU1Qgb3IgRElNRSBiaW5kaW5nIGV4dGVuc2lvbnMuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgYSBuYW1lc3BhY2UuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGhlIG5hbWVzcGFjZSBzcGVjaWZpZXMgYW55IFdTREwgTUlNRSwKLSAgICogICAgICAgICBIVFRQIEdFVC9QT1NUIG9yIERJTUUgYmluZGluZyBleHRlbnNpb25zLgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzTm9uQ29uZm9ybWFudEJpbmRpbmdFeHRlbnNpb24oU3RyaW5nIG5hbWVzcGFjZSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChuYW1lc3BhY2UuZXF1YWxzKFdTSUNvbnN0YW50cy5OU19OQU1FX1dTRExfTUlNRSkKLSAgICAgICAgfHwgbmFtZXNwYWNlLmVxdWFscyhXU0lDb25zdGFudHMuTlNfTkFNRV9XU0RMX0hUVFApCi0gICAgICAgIHx8IG5hbWVzcGFjZS5lcXVhbHMoV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NETF9ESU1FKSkKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4ZWwsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAoaXNOb25Db25mb3JtYW50QmluZGluZ0V4dGVuc2lvbihleGVsCi0gICAgICAuZ2V0RWxlbWVudFR5cGUoKQotICAgICAgLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgIGVycm9ycy5hZGQoZXhlbC5nZXRFbGVtZW50VHlwZSgpKTsKLSAgICBlbHNlCi0gICAgewotICAgIAkvLyBleHRlbnNpYmlsaXR5IGVsZW1lbnQgaXMgb2ssIGNoZWNrIHRoZSBkZXNjZW5kYW50cwotICAgICAgaWYgKGV4ZWwgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgZWwgPSAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZXhlbCkuZ2V0RWxlbWVudCgpOwotCi0gICAgICAgIC8vIHRyYXZlcnNlIGFsbCBvZiB0aGUgZGVzY2VuZGFudHMgYW5kIGNoZWNrIGZvciBub24gY29tcGxpYW50IGJpbmRpbmcgZXh0ZW5zaW9ucwotICAgICAgICBYTUxUcmF2ZXJzYWxDaGVja2luZ0V4dGVuc2lvbnMgdHJhdmVyc2FsID0KLSAgICAgICAgICBuZXcgWE1MVHJhdmVyc2FsQ2hlY2tpbmdFeHRlbnNpb25zKCk7Ci0gICAgICAgIHRyYXZlcnNhbC52aXNpdChlbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5pbXBsLkJhc2VWYWxpZGF0b3JJbXBsLkFzc2VydGlvblByb2Nlc3MjdmFsaWRhdGUob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbiwgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgdmFsaWRhdGUoCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCBlbnRyeUNvbnRleHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0KLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0RWxlbWVudCh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCh0cnVlKTsKLQotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoQmluZGluZykgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQ7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBBIHNwZWNpYWxpemVkIFhNTFRyYXZlcnNhbCBjbGFzcyB0byBjaGVjayBpZiB0aGUgd3NkbDpiaW5kaW5nIGVsZW1lbnQgaGFzIGFueSAKLSAgICogZGVzY2VuZGFudCBlbGVtZW50cy9hdHRyaWJ1dGVzIGZyb20gdGhlIG5hbWVzcGFjZXMgZm9yIHRoZSBXU0RMIE1JTUUsIAotICAgKiBIVFRQIEdFVC9QT1NUIG9yIERJTUUgYmluZGluZyBleHRlbnNpb25zLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBYTUxUcmF2ZXJzYWxDaGVja2luZ0V4dGVuc2lvbnMgZXh0ZW5kcyBYTUxUcmF2ZXJzYWwKLSAgewotICAgIGJvb2xlYW4gbm9uQ29uZm9ybWFudEV4dGVuc2lvbkZvdW5kID0gZmFsc2U7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLnhtbC5YTUxUcmF2ZXJzYWwjYWN0aW9uKG9yZy53M2MuZG9tLk5vZGUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gYWN0aW9uKE5vZGUgbikKLSAgICB7Ci0gICAgICByZXR1cm4gIW5vbkNvbmZvcm1hbnRFeHRlbnNpb25Gb3VuZDsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLnhtbC5YTUxWaXNpdG9yI3Zpc2l0KG9yZy53M2MuZG9tLkF0dHIpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoQXR0ciBub2RlKQotICAgIHsKLSAgICAgIGlmIChhY3Rpb24obm9kZSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc05vbkNvbmZvcm1hbnRCaW5kaW5nRXh0ZW5zaW9uKG5vZGUuZ2V0TmFtZXNwYWNlVVJJKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3JzLmFkZChub2RlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgbm9uQ29uZm9ybWFudEV4dGVuc2lvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kueG1sLlhNTFZpc2l0b3IjdmlzaXQob3JnLnczYy5kb20uRWxlbWVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChFbGVtZW50IG5vZGUpCi0gICAgewotICAgICAgaWYgKGFjdGlvbihub2RlKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGlzTm9uQ29uZm9ybWFudEJpbmRpbmdFeHRlbnNpb24obm9kZS5nZXROYW1lc3BhY2VVUkkoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvcnMuYWRkKG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgICAgbm9uQ29uZm9ybWFudEV4dGVuc2lvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBlbGVtZW50IGlzIGNvbXBsaWFudCwgY2hlY2sgYXR0cmlidXRlcyBhbmQgZGVzY2VuZGFudHMKLSAgICAgICAgICB2aXNpdChub2RlLmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgICAgZm9yIChOb2RlIG4gPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIG4gIT0gbnVsbDsKLSAgICAgICAgICAgIG4gPSBuLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZG9WaXNpdChuKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTRExWYWxpZGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTRExWYWxpZGF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2E4NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0RMVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5Bc3NlcnRpb25GYWlsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5DYW5kaWRhdGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5TZXJ2aWNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuUHJvZmlsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuV1NETFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5GYWlsdXJlRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwuV1NETERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLldTRExFbGVtZW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb20uRWxlbWVudExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuc2NoZW1hLlRhcmdldE5hbWVzcGFjZVByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLnNjaGVtYS5YTUxTY2hlbWFWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIFRoZSBXU0RMIHZhbGlkYXRvciB3aWxsIHZlcmlmeSB0aGF0IHRoZSBXU0RMIGFuZCBhc3NvY2lhdGVkIFhNTCBzY2hlbWEgZGVmaW5pdGlvbnMKLSAqIGFyZSBpbiBjb25mb3JtYW5jZSB3aXRoIHRoZSBwcm9maWxlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEBhdXRob3IgR3JhaGFtIFR1cnJlbGwgCShndHVycmVsbEB1ay5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRvckltcGwKLSAgZXh0ZW5kcyBCYXNlVmFsaWRhdG9ySW1wbAotICBpbXBsZW1lbnRzIFdTRExWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIFdTREwgVVJMLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsVVJMOwotCi0gIC8qKgotICAgKiBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQgPSBudWxsOwotCi0gIC8qKgotICAgKiBFbnRyeSBjb250YWluZXIgbWFwLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2hNYXAgY29udGFpbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLldTRExWYWxpZGF0b3IjaW5pdChvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQW5hbHl6ZXJDb250ZXh0LCBvcmcud3NpLnRlc3QucHJvZmlsZS5Qcm9maWxlQXJ0aWZhY3QsIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0QXJ0aWZhY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy53c2kud3NkbC5XU0RMRG9jdW1lbnQsIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbml0KAotICAgIEFuYWx5emVyQ29udGV4dCBhbmFseXplckNvbnRleHQsCi0gICAgUHJvZmlsZUFydGlmYWN0IHByb2ZpbGVBcnRpZmFjdCwKLSAgICBSZXBvcnRBcnRpZmFjdCByZXBvcnRBcnRpZmFjdCwKLSAgICBTdHJpbmcgd3NkbFVSTCwKLSAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50LAotICAgIFJlcG9ydGVyIHJlcG9ydGVyKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEJhc2VWYWxpZGF0b3JJbXBsCi0gICAgc3VwZXIuaW5pdChhbmFseXplckNvbnRleHQsIHByb2ZpbGVBcnRpZmFjdCwgcmVwb3J0QXJ0aWZhY3QsIHJlcG9ydGVyKTsKLQotICAgIHRoaXMud3NkbERvY3VtZW50ID0gd3NkbERvY3VtZW50OwotICAgIGlmICh3c2RsRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgIHRoaXMud3NkbFVSTCA9IHdzZGxEb2N1bWVudC5nZXRMb2NhdGlvbigpOwotCi0gICAgaWYgKHdzZGxVUkwgIT0gbnVsbCkKLSAgICAgIHRoaXMud3NkbFVSTCA9IHdzZGxVUkw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLldTRExWYWxpZGF0b3IjdmFsaWRhdGUoKQotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudCB2YWxpZGF0ZSgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vV1NETERvY3VtZW50IHdzZGxEb2N1bWVudCA9IG51bGw7Ci0gICAgRW50cnkgZW50cnkgPSBudWxsOwotCi0gICAgU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLSAgICBQb3J0IHBvcnQgPSBudWxsOwotICAgIEJpbmRpbmcgYmluZGluZyA9IG51bGw7Ci0gICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBudWxsOwotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBudWxsOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0KLSAgICAvLyBpdCBkZXByaWNhdGVkIGFmdGVyIHJlZmFjdG9yaW5nIAotICAgIC8vIG5vdyB0aGUgaW5uZXIgY2xhc3NlcyBtb3ZlZCBvdXQgZnJvbSB2YWxpZGF0b3IKLSAgICAvL1N0cmluZyBjbGFzc1ByZWZpeCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJCI7Ci0gICAgU3RyaW5nIGNsYXNzUHJlZml4ID0gdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkrIi4iOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gVmFsaWRhdGUgdGhlIFdTREwgc2VydmljZSBkZXNjcmlwdGlvbgotICAgICAgaWYgKHRoaXMud3NkbERvY3VtZW50ID09IG51bGwpCi0gICAgICAgIHRoaXMud3NkbERvY3VtZW50ID0gbmV3IFdTRExEb2N1bWVudCh3c2RsVVJMKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gQUREOiBDZXJ0YWluIGV4Y2VwdGlvbnMgc2hvdWxkIHJlc3VsdCBpbiB2YWxpZGF0aW9uIGVycm9ycwotCi0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgdGhlIGRlZmluaXRpb24gZWxlbWVudAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxEb2N1bWVudC5nZXREZWZpbml0aW9ucygpOwotCi0gICAgLy8gR2V0IHNlcnZpY2UgcmVmZXJlbmNlIGZyb20gYW5hbHl6ZXIgY29udGV4dAotICAgIFNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZVJlZmVyZW5jZSA9IGFuYWx5emVyQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKCk7Ci0KLSAgICAvLyBDcmVhdGUgbm9ybWFsaXplZCBkYXRhIGFib3V0IHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QuCi0gICAgQ2FuZGlkYXRlSW5mbyBjYW5kaWRhdGUgPSBuZXcgQ2FuZGlkYXRlSW5mbyhzZXJ2aWNlUmVmZXJlbmNlLCB3c2RsRG9jdW1lbnQpOwotCi0gICAgYW5hbHl6ZXJDb250ZXh0LnNldENhbmRpZGF0ZUluZm8oY2FuZGlkYXRlKTsKLQotICAgIC8vIFNldCBwcmVyZXEgdHlwZSB0byBlbnRyeSBjb250YWluZXIKLSAgICByZXBvcnRlci5zZXRQcmVyZXFUeXBlKFJlcG9ydGVyLlBSRVJFUV9UWVBFX0VOVFJZX0NPTlRBSU5FUik7Ci0KLSAgICAvLyBhbHdheXMgcHJvY2VzcyBJbXBvcnQsIERlZmluaXRpb25zICYgVHlwZXMgYXNzZXJ0aW9ucyAKLSAgICAvLyBURU1QOgotICAgIHByb2Nlc3NEZWZpbml0aW9uQXNzZXJ0aW9ucyhjbGFzc1ByZWZpeCwgY2FuZGlkYXRlKTsKLSAgICBwcm9jZXNzVHlwZXNBc3NlcnRpb25zKGNsYXNzUHJlZml4LCBjYW5kaWRhdGUpOwotICAgIHByb2Nlc3NJbXBvcnRBc3NlcnRpb25zKGNsYXNzUHJlZml4LCBjYW5kaWRhdGUpOwotCi0gICAgLy8gUHJvY2VzcyB0aGUgZWxlbWVudCBoaWVyYXJjaHkgaW4gdGhlIFdTREwgZG9jdW1lbnQgc3RhcnRpbmcgd2l0aCB0aGUgb25lIHRoYXQgd2FzIHNwZWNpZmllZCAgCi0gICAgLy8gRklYOiBFbGVtZW50IGZpbmRpbmcgYWxyZWFkeSBjb21wbGV0ZWQgYnkgQ2FuZGlkYXRlSW5mbyBjb25zdHJ1Y3RvciAtIHNvIHVzZSB0aGF0IHJhdGhlciB0aGFuIHJldGVzdCBoZXJlICAKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHdzZGw6cG9ydAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGlmIChzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuaXNQb3J0KCkpCi0gICAgewotICAgICAgLy8gRmluZCB0aGUgc2VydmljZSBlbGVtZW50Ci0gICAgICBpZiAoKHNlcnZpY2UgPQotICAgICAgICBkZWZpbml0aW9uLmdldFNlcnZpY2UoCi0gICAgICAgICAgc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldFBhcmVudEVsZW1lbnRRTmFtZSgpKSkKLSAgICAgICAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFdTSVJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgV1NETCBzZXJ2aWNlOiAiCi0gICAgICAgICAgICArIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXRQYXJlbnRFbGVtZW50TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gRmluZCB0aGUgcG9ydCBlbGVtZW50Ci0gICAgICBpZiAoKHBvcnQgPSBzZXJ2aWNlLmdldFBvcnQoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldE5hbWUoKSkpCi0gICAgICAgID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIFdTREwgcG9ydDogIgotICAgICAgICAgICAgKyBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gVEVNUDogUmVtb3ZlIHVudGlsIHRoZXJlIGFyZSBwb3J0IHRlc3QgYXNzZXJ0aW9ucyAgICAgIAotICAgICAgLy9wcm9jZXNzUG9ydEFzc2VydGlvbnMocG9ydCwgc2VydmljZVJlZmVyZW5jZSwgY2xhc3NQcmVmaXgsIHdzZGxEb2N1bWVudCk7CSAgICAgCi0KLSAgICAgIC8vIE5leHQsIHByb2Nlc3MgdGhlIGJpbmRpbmcKLSAgICAgIGlmICgoKGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKSkgPT0gbnVsbCkgfHwgKGJpbmRpbmcuaXNVbmRlZmluZWQoKSkpCi0gICAgICB7Ci0gICAgICAgIC8vdGhyb3cgbmV3IFdTSVJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBsb2NhdGUgV1NETCBiaW5kaW5nIGZvciBwb3J0OiAiICsgcG9ydC5nZXROYW1lKCkpOyAgCi0gICAgICAgIC8vIFNldCBtaXNzaW5nSW5wdXQgZm9yIGFsbCBiaW5kaW5nLCBwb3J0VHlwZSwgb3BlcmF0aW9uIGFuZCBtZXNzYWdlIHRlc3QgYXNzZXJ0aW9ucyAKLSAgICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fQklORElORykpOwotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9QT1JUVFlQRSkpOwotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04pKTsKLSAgICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fTUVTU0FHRSkpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByb2Nlc3NCaW5kaW5nQXNzZXJ0aW9ucygKLSAgICAgICAgICBiaW5kaW5nLAotICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgd3NkbERvY3VtZW50KTsKLQotICAgICAgICAvLyBOZXh0LCBwcm9jZXNzIHRoZSBwb3J0VHlwZQotICAgICAgICBpZiAoKChwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0UG9ydFR5cGUoKSkgPT0gbnVsbCkKLSAgICAgICAgICB8fCAocG9ydFR5cGUuaXNVbmRlZmluZWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvL3Rocm93IG5ldyBXU0lSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgbG9jYXRlIFdTREwgcG9ydFR5cGUgZm9yIGJpbmRpbmc6ICIgKyBiaW5kaW5nLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgIC8vIFNldCBtaXNzaW5nSW5wdXQgZm9yIGFsbCBwb3J0VHlwZSwgb3BlcmF0aW9uIGFuZCBtZXNzYWdlIHRlc3QgYXNzZXJ0aW9ucyAKLSAgICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1BPUlRUWVBFKSk7Ci0gICAgICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04pKTsKLSAgICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX01FU1NBR0UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHByb2Nlc3NNZXNzYWdlQXNzZXJ0aW9ucygKLSAgICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgICAgICAgIHByb2Nlc3NQb3J0VHlwZUFzc2VydGlvbnMoCi0gICAgICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICAgICAgcHJvY2Vzc09wZXJhdGlvbkFzc2VydGlvbnMoCi0gICAgICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB3c2RsOmJpbmRpbmcKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBlbHNlIGlmIChzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuaXNCaW5kaW5nKCkpCi0gICAgewotICAgICAgV1NETEVsZW1lbnQgd3NkbEVsZW1lbnQgPSBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCk7Ci0gICAgICAvLyBGaW5kIHRoZSBiaW5kaW5nIGVsZW1lbnQKLSAgICAgIGlmICh3c2RsRWxlbWVudC5nZXRRTmFtZSgpICE9IG51bGwKLSAgICAgICAgJiYgd3NkbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKSAhPSBudWxsCi0gICAgICAgICYmIHdzZGxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBpZiAoKChiaW5kaW5nID0KLSAgICAgICAgICBkZWZpbml0aW9uLmdldEJpbmRpbmcoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldFFOYW1lKCkpKQotICAgICAgICAgID09IG51bGwpCi0gICAgICAgICAgfHwgKGJpbmRpbmcuaXNVbmRlZmluZWQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgV1NJUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIFdTREwgYmluZGluZzogIgotICAgICAgICAgICAgICArIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc0JpbmRpbmdBc3NlcnRpb25zKAotICAgICAgICAgIGJpbmRpbmcsCi0gICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgICAgICBwcm9jZXNzTWVzc2FnZUFzc2VydGlvbnMoCi0gICAgICAgICAgYmluZGluZywKLSAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0KLSAgICAgICAgLy8gTmV4dCwgcHJvY2VzcyB0aGUgcG9ydFR5cGUKLSAgICAgICAgaWYgKCgocG9ydFR5cGUgPSBiaW5kaW5nLmdldFBvcnRUeXBlKCkpID09IG51bGwpCi0gICAgICAgICAgfHwgKHBvcnRUeXBlLmlzVW5kZWZpbmVkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgLy90aHJvdyBuZXcgV1NJUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGxvY2F0ZSBXU0RMIFBvcnRUeXBlIGZvciBCaW5kaW5nOiAiICsgYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLQotICAgICAgICAgIC8vIFNldCBtaXNzaW5nSW5wdXQgZm9yIGFsbCBwb3J0VHlwZSwgb3BlcmF0aW9uIGFuZCBtZXNzYWdlIHRlc3QgYXNzZXJ0aW9ucyAKLSAgICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1BPUlRUWVBFKSk7Ci0gICAgICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04pKTsKLSAgICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX01FU1NBR0UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHByb2Nlc3NQb3J0VHlwZUFzc2VydGlvbnMoCi0gICAgICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICAgICAgcHJvY2Vzc09wZXJhdGlvbkFzc2VydGlvbnMoCi0gICAgICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0KLSAgICAgICAgICAvLyBQcm9jZXNzIGVhY2ggbWVzc2FnZSB3aXRoaW4gZWFjaCBvcGVyYXRpb24gb2YgdGhlIHBvcnRUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluZGluZwotICAgICAgICAgIHByb2Nlc3NNZXNzYWdlQXNzZXJ0aW9ucygKLSAgICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIGJpbmRpbmcgZWxlbWVudCBzcGVjaWZpY2F0aW9uLiAgVGhpcyBjYW4gCi0gICAgICAvLyBoYXBwZW4gd2hlbiBhIFVEREkgdE1vZGVsIGRpZCBub3QgaGF2ZSBhIHZhbGlkIGJpbmRpbmcgcmVmZXJlbmNlLgotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBTZXQgbWlzc2luZ0lucHV0IGZvciBhbGwgYmluZGluZywgcG9ydFR5cGUsIG9wZXJhdGlvbiBhbmQgbWVzc2FnZSB0ZXN0IGFzc2VydGlvbnMgCi0gICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX0JJTkRJTkcpKTsKLSAgICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVFRZUEUpKTsKLSAgICAgICAgc2V0TWlzc2luZ0lucHV0KAotICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fT1BFUkFUSU9OKSk7Ci0gICAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX01FU1NBR0UpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyB3c2RsOnBvcnRUeXBlCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZWxzZSBpZiAoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmlzUG9ydFR5cGUoKSkKLSAgICB7Ci0gICAgICAvLyBGaW5kIHRoZSBQb3J0VHlwZSBlbGVtZW50Ci0gICAgICBpZiAoKChwb3J0VHlwZSA9Ci0gICAgICAgIGRlZmluaXRpb24uZ2V0UG9ydFR5cGUoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldFFOYW1lKCkpKQotICAgICAgICA9PSBudWxsKQotICAgICAgICB8fCAocG9ydFR5cGUuaXNVbmRlZmluZWQoKSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIFdTREwgUG9ydFR5cGU6ICIKLSAgICAgICAgICAgICsgc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFNldCBtaXNzaW5nSW5wdXQgZm9yIGFsbCBiaW5kaW5nIHRlc3QgYXNzZXJ0aW9ucyAKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9CSU5ESU5HKSk7Ci0KLSAgICAgIHByb2Nlc3NQb3J0VHlwZUFzc2VydGlvbnMoCi0gICAgICAgIHBvcnRUeXBlLAotICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICAgIHByb2Nlc3NPcGVyYXRpb25Bc3NlcnRpb25zKAotICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgIHdzZGxEb2N1bWVudCk7Ci0KLSAgICAgIC8vIFByb2Nlc3MgZWFjaCBtZXNzYWdlIHdpdGhpbiBlYWNoIG9wZXJhdGlvbiBvZiB0aGUgcG9ydFR5cGUKLSAgICAgIHByb2Nlc3NNZXNzYWdlQXNzZXJ0aW9ucygKLSAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHdzZGw6b3BlcmF0aW9uCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgZWxzZSBpZiAoc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmlzT3BlcmF0aW9uKCkpCi0gICAgewotICAgICAgLy8gRmluZCB0aGUgb3BlcmF0aW9uCi0gICAgICAvLyBnZXQgcG9ydFR5cGUgZnJvbSBjb25maWcgcGFyZW50IGVsZW1lbnQKLSAgICAgIGlmICgoKHBvcnRUeXBlID0KLSAgICAgICAgZGVmaW5pdGlvbi5nZXRQb3J0VHlwZSgKLSAgICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudFFOYW1lKCkpKQotICAgICAgICA9PSBudWxsKQotICAgICAgICB8fCAocG9ydFR5cGUuaXNVbmRlZmluZWQoKSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIFdTREwgcG9ydFR5cGU6ICIKLSAgICAgICAgICAgICsgc2VydmljZVJlZmVyZW5jZS5nZXRXU0RMRWxlbWVudCgpLmdldFBhcmVudEVsZW1lbnRRTmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCgob3BlcmF0aW9uID0KLSAgICAgICAgZ2V0T3BlcmF0aW9uRnJvbVBvcnRUeXBlKAotICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXROYW1lKCkpKQotICAgICAgICA9PSBudWxsKQotICAgICAgICB8fCAob3BlcmF0aW9uLmlzVW5kZWZpbmVkKCkpKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgV1NJUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiQ291bGQgbm90IGxvY2F0ZSBXU0RMIE9wZXJhdGlvbjogIgotICAgICAgICAgICAgKyBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICArICJpbiBwb3J0VHlwZTogIgotICAgICAgICAgICAgKyBwb3J0VHlwZS5nZXRRTmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gU2V0IG1pc3NpbmdJbnB1dCBmb3IgYWxsIGJpbmRpbmcgYW5kIHBvcnRUeXBlIHRlc3QgYXNzZXJ0aW9ucyAKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9CSU5ESU5HKSk7Ci0gICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVFRZUEUpKTsKLQotICAgICAgcHJvY2Vzc09wZXJhdGlvbkFzc2VydGlvbnMoCi0gICAgICAgIG9wZXJhdGlvbiwKLSAgICAgICAgcG9ydFR5cGUsCi0gICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICBvcGVyYXRpb24sCi0gICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgIGNsYXNzUHJlZml4LAotICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHdzZGw6bWVzc2FnZQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGVsc2UgaWYgKHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5pc01lc3NhZ2UoKSkKLSAgICB7Ci0gICAgICAvLyBGaW5kIHRoZSBtZXNzYWdlCi0gICAgICBpZiAoKChtZXNzYWdlID0KLSAgICAgICAgZGVmaW5pdGlvbi5nZXRNZXNzYWdlKHNlcnZpY2VSZWZlcmVuY2UuZ2V0V1NETEVsZW1lbnQoKS5nZXRRTmFtZSgpKSkKLSAgICAgICAgPT0gbnVsbCkKLSAgICAgICAgfHwgKG1lc3NhZ2UuaXNVbmRlZmluZWQoKSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIFdTREwgTWVzc2FnZTogIgotICAgICAgICAgICAgKyBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gU2V0IG1pc3NpbmdJbnB1dCBmb3IgYWxsIGJpbmRpbmcsIHBvcnRUeXBlLCBhbmQgb3BlcmF0aW9uIHRlc3QgYXNzZXJ0aW9ucyAKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9CSU5ESU5HKSk7Ci0gICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fUE9SVFRZUEUpKTsKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04pKTsKLQotICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICBtZXNzYWdlLAotICAgICAgICBzZXJ2aWNlUmVmZXJlbmNlLAotICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgd3NkbERvY3VtZW50KTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgdGhyb3cgbmV3IFdTSVJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJUaGUgZm9sbG93aW5nIFdTREwgdHlwZSBpcyBub3Qgc3VwcG9ydGVkOiAiCi0gICAgICAgICAgKyBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0VHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBDbGVhbnVwCi0gICAgY2xlYW51cCgpOwotCi0gICAgLy8gUmV0dXJuIFdTREwgZG9jdW1lbnQKLSAgICByZXR1cm4gdGhpcy53c2RsRG9jdW1lbnQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGVudHJ5IGNvbnRhaW5lciB1c2luZyB0aGUgZmlsZW5hbWUgZm9yIFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBhIGZpbGUgbmFtZS4KLSAgICogQHJldHVybiBlbnRyeSBjb250YWluZXIgdXNpbmcgdGhlIGZpbGVuYW1lIGZvciBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHJvdGVjdGVkIEVudHJ5Q29udGFpbmVyIGdldEVudHJ5Q29udGFpbmVyKFN0cmluZyBmaWxlbmFtZSkKLSAgewotICAgIEVudHJ5Q29udGFpbmVyIGVudHJ5Q29udGFpbmVyID0gbnVsbDsKLQotICAgIC8vIElmIHRoZSBlbnRyeSBjb250YWluZXIgYWxyZWFkeSBleGlzdHMsIHRoZW4gdXNlIGl0Ci0gICAgaWYgKChlbnRyeUNvbnRhaW5lciA9IChFbnRyeUNvbnRhaW5lcikgY29udGFpbmVyTWFwLmdldChmaWxlbmFtZSkpID09IG51bGwpCi0gICAgewotICAgICAgLy8gQ3JlYXRlIG5ldyBlbnRyeSBjb250YWluZXIKLSAgICAgIGVudHJ5Q29udGFpbmVyID0gdGhpcy5yZXBvcnRlci5jcmVhdGVFbnRyeUNvbnRhaW5lcigpOwotCi0gICAgICAvLyBTZXQgY29udGFpbmVyIGlkIHVzaW5nIHRoZSBmaWxlbmFtZSBmb3IgdGhlIFdTREwgZG9jdW1lbnQKLSAgICAgIGVudHJ5Q29udGFpbmVyLnNldElkKGZpbGVuYW1lKTsKLQotICAgICAgLy8gUHV0IHRoZSBuZXcgZW50cnkgY29udGFpbmVyIGludG8gdGhlIGNvbnRhaW5lciBtYXAKLSAgICAgIGNvbnRhaW5lck1hcC5wdXQoZmlsZW5hbWUsIGVudHJ5Q29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZW50cnlDb250YWluZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IG9wZXJhdGlvbiBmcm9tIHBvcnQgdHlwZS4KLSAgICogQHBhcmFtIHBvcnRUeXBlIHBvcnQgdHlwZS4KLSAgICogQHBhcmFtIG9wZXJhdGlvbk5hbWUgb3BlcmF0aW9uIG5hbWUuCi0gICAqIEByZXR1cm4gb3BlcmF0aW9uIGZyb20gcG9ydCB0eXBlLgotICAgKi8KLSAgcHJvdGVjdGVkIE9wZXJhdGlvbiBnZXRPcGVyYXRpb25Gcm9tUG9ydFR5cGUoCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUsCi0gICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUpCi0gIHsKLSAgICAvLyBGSVg6IHdzZGw0aiBhdmFpbGFibGUgbWV0aG9kIGNhbGwgYmVsb3cgaW1wbGllcyB0aGF0IG9ubHkgCi0gICAgLy8gbmFtZStpbnB1dG5hbWUrb3V0cHV0bmFtZSB1bmlxdWVseSBkZWZpbmVzIG9wZXJhdGlvbiAKLSAgICAvLyBVc2UgdGhpcyBpbnN0ZWFkIGZvciBub3c6IC0gZ2V0IHRoZSBmaXJzdCBvcGVyYXRpb24gd2UgZmluZC4uLgotICAgIE9wZXJhdGlvbiBvcCA9IG51bGw7Ci0gICAgaWYgKHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIG9wSXQgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQotICAgICAgd2hpbGUgKG9wSXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBvcCA9IChPcGVyYXRpb24pIG9wSXQubmV4dCgpOwotICAgICAgICBpZiAob3BlcmF0aW9uTmFtZS5lcXVhbHMob3AuZ2V0TmFtZSgpKSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBvcDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBudWxsOyAvLyBubyBtYXRjaGluZyBvcGVyYXRpb24gZm91bmQKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIGRlZmluaXRpb24gYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIGNsYXNzUHJlZml4IGNsYXNzIHByZWZpeC4KLSAgICogQHBhcmFtIGNhbmRpZGF0ZSBjYW5kaWRhdGUuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0RlZmluaXRpb25Bc3NlcnRpb25zKAotICAgIFN0cmluZyBjbGFzc1ByZWZpeCwKLSAgICBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLQotICAgIERlZmluaXRpb25bXSB3c2RsRGVmaW5pdGlvbnMgPSBjYW5kaWRhdGUuZ2V0RGVmaW5pdGlvbnMoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbERlZmluaXRpb25zLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxEZWZpbml0aW9uc1tpXTsKLSAgICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgLy8gQ3JlYXRlIGVudHJ5IAotICAgICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fREVGSU5JVElPTlMpKTsKLSAgICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgICAgZW50cnkuc2V0RW50cnlEZXRhaWwoZGVmaW5pdGlvbik7Ci0KLSAgICAgIC8vIFNldCBlbnRyeSBjb250YWluZXIKLSAgICAgIGVudHJ5LnNldEVudHJ5Q29udGFpbmVyKAotICAgICAgICBnZXRFbnRyeUNvbnRhaW5lcihkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKSk7Ci0KLSAgICAgIC8vIFByb2Nlc3MgYWxsIG9mIHRoZSBkZWZpbml0aW9uIHJlbGF0ZWQgdGVzdCBhc3NlcnRpb25zCi0gICAgICBwcm9jZXNzQXNzZXJ0aW9ucygKLSAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgIG5ldyBFbnRyeUNvbnRleHQoZW50cnksIGNhbmRpZGF0ZS5nZXRXc2RsRG9jdW1lbnQoKSkpOwotICAgICAgLy8gQUREOiBuZWVkIHRvIHVzZSBoZXJlIHRoZSBzcGVjaWZpYyBkb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZWZpbml0aW9uPz8KLQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIHR5cGVzIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSBjYW5kaWRhdGUgY2FuZGlkYXRlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZyAKLSAgICogICAgICAgICB0eXBlIGFzc2VydGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVHlwZXNBc3NlcnRpb25zKAotICAgIFN0cmluZyBjbGFzc1ByZWZpeCwKLSAgICBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0KLSAgICBUeXBlc1tdIHdzZGxUeXBlcyA9IGNhbmRpZGF0ZS5nZXRUeXBlcygpOwotICAgIERlZmluaXRpb25bXSB3c2RsRGVmaW5pdGlvbnMgPSBjYW5kaWRhdGUuZ2V0RGVmaW5pdGlvbnMoKTsKLQotICAgIC8vIElmIHRoZXJlIGFyZSBubyB0eXBlcyBlbGVtZW50cywgdGhlbiBzZXQgYWxsIHJlc3VsdHMgdG8gbWlzc2luZ0lucHV0ICAgCi0gICAgaWYgKHdzZGxUeXBlcyA9PSBudWxsIHx8IHdzZGxUeXBlcy5sZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAvLyBTZXQgbWlzc2luZ0lucHV0IGZvciBhbGwgdGVzdCBhc3NlcnRpb25zIHdpdGggdGhpcyBlbnRyeSB0eXBlCi0gICAgICBzZXRNaXNzaW5nSW5wdXQoRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9UWVBFUykpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGxUeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgVHlwZXMgdHlwZXMgPSB3c2RsVHlwZXNbaV07Ci0gICAgICAgIGlmICh0eXBlcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gbm8gVHlwZXMgZWxlbWVudCBpbiBpLXRoIGRvY3VtZW50Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgICAgIGVudHJ5ID0gdGhpcy5yZXBvcnRlci5nZXRSZXBvcnQoKS5jcmVhdGVFbnRyeSgpOwotICAgICAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9UWVBFUykpOwotICAgICAgICBlbnRyeS5zZXRSZWZlcmVuY2VJRCgKLSAgICAgICAgICBjYW5kaWRhdGUuZ2V0RGVmaW5pdGlvbih0eXBlcykuZ2V0RG9jdW1lbnRCYXNlVVJJKCkgKyAiLVR5cGVzIik7Ci0gICAgICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKHR5cGVzKTsKLQotICAgICAgICAvLyBTZXQgZW50cnkgY29udGFpbmVyCi0gICAgICAgIGVudHJ5LnNldEVudHJ5Q29udGFpbmVyKAotICAgICAgICAgIGdldEVudHJ5Q29udGFpbmVyKHdzZGxEZWZpbml0aW9uc1tpXS5nZXREb2N1bWVudEJhc2VVUkkoKSkpOwotCi0gICAgICAgIC8vIFByb2Nlc3MgYWxsIG9mIHRoZSBUeXBlcyByZWxhdGVkIHRlc3QgYXNzZXJ0aW9ucwotICAgICAgICBwcm9jZXNzQXNzZXJ0aW9ucygKLSAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICBuZXcgRW50cnlDb250ZXh0KGVudHJ5LCBjYW5kaWRhdGUuZ2V0V3NkbERvY3VtZW50KCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBpbXBvcnQgYXNzZXJ0aW9ucy4gCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSBjYW5kaWRhdGUgY2FuZGlkYXRlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZyAKLSAgICogICAgICAgICBpbXBvcnQgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbXBvcnRBc3NlcnRpb25zKAotICAgIFN0cmluZyBjbGFzc1ByZWZpeCwKLSAgICBDYW5kaWRhdGVJbmZvIGNhbmRpZGF0ZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLQotICAgIEltcG9ydFtdIHdzZGxJbXBvcnRzID0gY2FuZGlkYXRlLmdldEltcG9ydHMoKTsKLQotICAgIC8vIElmIHRoZXJlIGFyZSBubyBpbXBvcnQgZWxlbWVudHMsIHRoZW4gc2V0IGFsbCByZXN1bHRzIHRvIG1pc3NpbmdJbnB1dCAgIAotICAgIGlmICh3c2RsSW1wb3J0cyA9PSBudWxsIHx8IHdzZGxJbXBvcnRzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIC8vIFNldCBtaXNzaW5nSW5wdXQgZm9yIGFsbCB0ZXN0IGFzc2VydGlvbnMgd2l0aCB0aGlzIGVudHJ5IHR5cGUKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9JTVBPUlQpKTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsSW1wb3J0cy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgSW1wb3J0IHdzZGxJbXBvcnQgPSB3c2RsSW1wb3J0c1tpXTsKLSAgICAgICAgLy8gQ3JlYXRlIGVudHJ5IAotICAgICAgICBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICAgICAgZW50cnkuc2V0RW50cnlUeXBlKAotICAgICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fSU1QT1JUKSk7Ci0gICAgICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKHdzZGxJbXBvcnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBlbnRyeS5zZXRFbnRyeURldGFpbCh3c2RsSW1wb3J0KTsKLQotICAgICAgICAvLyBTZXQgZW50cnkgY29udGFpbmVyCi0gICAgICAgIGVudHJ5LnNldEVudHJ5Q29udGFpbmVyKGdldEVudHJ5Q29udGFpbmVyKHdzZGxJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKSkpOwotCi0gICAgICAgIC8vIFByb2Nlc3MgYWxsIG9mIHRoZSBpbXBvcnQgcmVsYXRlZCB0ZXN0IGFzc2VydGlvbnMKLSAgICAgICAgcHJvY2Vzc0Fzc2VydGlvbnMoCi0gICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgbmV3IEVudHJ5Q29udGV4dChlbnRyeSwgY2FuZGlkYXRlLmdldFdzZGxEb2N1bWVudCgpKSk7Ci0gICAgICAgIC8vIEFERDogbmVlZCB0byB1c2UgaGVyZSB0aGUgc3BlY2lmaWMgZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgaW1wb3J0ISEKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBwb3J0IGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBwb3J0IGEgcG9ydC4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcgCi0gICAqICAgICAgICAgcG9ydCBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1BvcnRBc3NlcnRpb25zKAotICAgIFBvcnQgcG9ydCwKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgRW50cnkgZW50cnkgPSBudWxsOwotCi0gICAgLy8gQ3JlYXRlIGVudHJ5IAkgIAotICAgIGVudHJ5ID0gdGhpcy5yZXBvcnRlci5nZXRSZXBvcnQoKS5jcmVhdGVFbnRyeSgpOwotICAgIGVudHJ5LnNldEVudHJ5VHlwZShFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX1BPUlQpKTsKLSAgICBlbnRyeS5zZXRSZWZlcmVuY2VJRChwb3J0LmdldE5hbWUoKSk7Ci0gICAgZW50cnkuc2V0UGFyZW50RWxlbWVudE5hbWUoCi0gICAgICBzZXJ2aWNlUmVmZXJlbmNlLmdldFdTRExFbGVtZW50KCkuZ2V0UGFyZW50RWxlbWVudE5hbWUoKSk7Ci0gICAgZW50cnkuc2V0RW50cnlEZXRhaWwocG9ydCk7Ci0KLSAgICAvLyBQcm9jZXNzIGFzc2VydGlvbnMgZm9yIHRoaXMgYXJ0aWZhY3QgYWdhaW5zdCB0aGUgdGFyZ2V0IGNvbnRleHQKLSAgICBwcm9jZXNzQXNzZXJ0aW9ucyhjbGFzc1ByZWZpeCwgbmV3IEVudHJ5Q29udGV4dChlbnRyeSwgd3NkbERvY3VtZW50KSk7Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBiaW5kaW5nIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBiaW5kaW5nIGJpbmRpbmcuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2UgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gY2xhc3NQcmVmaXggY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIGJpbmRpbmcgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NCaW5kaW5nQXNzZXJ0aW9ucygKLSAgICBCaW5kaW5nIGJpbmRpbmcsCi0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlLAotICAgIFN0cmluZyBjbGFzc1ByZWZpeCwKLSAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICBRTmFtZSBiaW5kaW5nUU5hbWUgPSBiaW5kaW5nLmdldFFOYW1lKCk7Ci0KLSAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgZW50cnkuc2V0RW50cnlUeXBlKAotICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9CSU5ESU5HKSk7Ci0gICAgZW50cnkuc2V0UmVmZXJlbmNlSUQoYmluZGluZ1FOYW1lLnRvU3RyaW5nKCkpOwotICAgIGVudHJ5LnNldEVudHJ5RGV0YWlsKGJpbmRpbmcpOwotCi0gICAgLy8gU2V0IGVudHJ5IGNvbnRhaW5lcgotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9Ci0gICAgICBhbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb24oYmluZGluZyk7Ci0gICAgZW50cnkuc2V0RW50cnlDb250YWluZXIoCi0gICAgICBnZXRFbnRyeUNvbnRhaW5lcigKLSAgICAgICAgKGRlZmluaXRpb24gPT0gbnVsbCA/IG51bGwgOiBkZWZpbml0aW9uLmdldERvY3VtZW50QmFzZVVSSSgpKSkpOwotCi0gICAgLy8gUHJvY2VzcyBiaW5kaW5nIHRlc3QgYXNzZXJ0aW9ucwotICAgIHByb2Nlc3NBc3NlcnRpb25zKGNsYXNzUHJlZml4LCBuZXcgRW50cnlDb250ZXh0KGVudHJ5LCB3c2RsRG9jdW1lbnQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcm9jZXNzIHBvcnQgdHlwZSBhc3NlcnRpb25zLgotICAgKiBAcGFyYW0gcG9ydFR5cGUgcG9ydCB0eXBlLgotICAgKiBAcGFyYW0gc2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIGNsYXNzUHJlZml4IGNsYXNzIHByZWZpeC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZyAKLSAgICogICAgICAgICBwb3J0IHR5cGUgYXNzZXJ0aW9ucy4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1BvcnRUeXBlQXNzZXJ0aW9ucygKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgUU5hbWUgcG9ydFR5cGVRTmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCk7Ci0KLSAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgZW50cnkuc2V0RW50cnlUeXBlKAotICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9QT1JUVFlQRSkpOwotICAgIGVudHJ5LnNldFJlZmVyZW5jZUlEKHBvcnRUeXBlUU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgZW50cnkuc2V0RW50cnlEZXRhaWwocG9ydFR5cGUpOwotCi0gICAgLy8gU2V0IGVudHJ5IGNvbnRhaW5lcgotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9Ci0gICAgICBhbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb24ocG9ydFR5cGUpOwotICAgIGVudHJ5LnNldEVudHJ5Q29udGFpbmVyKAotICAgICAgZ2V0RW50cnlDb250YWluZXIoCi0gICAgICAgIChkZWZpbml0aW9uID09IG51bGwgPyBudWxsIDogZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSkpKTsKLQotICAgIC8vIFByb2Nlc3MgdGVzdCBhc3NlcnRpb25zCi0gICAgcHJvY2Vzc0Fzc2VydGlvbnMoY2xhc3NQcmVmaXgsIG5ldyBFbnRyeUNvbnRleHQoZW50cnksIHdzZGxEb2N1bWVudCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3Mgb3BlcmF0aW9uIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBvcGVyYXRpb24gYW4gb3BlcmF0aW9uLgotICAgKiBAcGFyYW0gcG9ydFR5cGUgcG9ydCB0eXBlLgotICAgKiBAcGFyYW0gc2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlIHJlZmVyZW5jZS4KLSAgICogQHBhcmFtIGNsYXNzUHJlZml4IGNsYXNzIHByZWZpeC4KLSAgICogQHBhcmFtIHdzZGxEb2N1bWVudCBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcHJvY2Vzc2luZyAKLSAgICogICAgICAgICBvcGVyYXRpb24gYXNzZXJ0aW9ucy4KLSAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc09wZXJhdGlvbkFzc2VydGlvbnMoCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gcXVhbGlmeSBvcGVyYXRpb24gd2l0aCBzZXJ2aWNlIGxvY2F0aW9uIGZyb20gY29uZmlnLgkKLSAgICBFbnRyeSBlbnRyeSA9IG51bGw7Ci0KLSAgICAvLyBDcmVhdGUgZW50cnkgCi0gICAgZW50cnkgPSB0aGlzLnJlcG9ydGVyLmdldFJlcG9ydCgpLmNyZWF0ZUVudHJ5KCk7Ci0gICAgZW50cnkuc2V0RW50cnlUeXBlKAotICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04pKTsKLSAgICBlbnRyeS5zZXRSZWZlcmVuY2VJRChvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICBlbnRyeS5zZXRQYXJlbnRFbGVtZW50TmFtZShwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBlbnRyeS5zZXRFbnRyeURldGFpbChvcGVyYXRpb24pOwotCi0gICAgLy8gU2V0IGVudHJ5IGNvbnRhaW5lcgotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9Ci0gICAgICBhbmFseXplckNvbnRleHQuZ2V0Q2FuZGlkYXRlSW5mbygpLmdldERlZmluaXRpb24ocG9ydFR5cGUpOwotICAgIGVudHJ5LnNldEVudHJ5Q29udGFpbmVyKAotICAgICAgZ2V0RW50cnlDb250YWluZXIoCi0gICAgICAgIChkZWZpbml0aW9uID09IG51bGwgPyBudWxsIDogZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSkpKTsKLQotICAgIC8vIFByb2Nlc3MgdGVzdCBhc3NlcnRpb25zCi0gICAgcHJvY2Vzc0Fzc2VydGlvbnMoY2xhc3NQcmVmaXgsIG5ldyBFbnRyeUNvbnRleHQoZW50cnksIHdzZGxEb2N1bWVudCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3Mgb3BlcmF0aW9uIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBwb3J0IHR5cGUuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2UgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gY2xhc3NQcmVmaXggY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIG9wZXJhdGlvbiBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc09wZXJhdGlvbkFzc2VydGlvbnMoCi0gICAgUG9ydFR5cGUgcG9ydFR5cGUsCi0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlLAotICAgIFN0cmluZyBjbGFzc1ByZWZpeCwKLSAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIEZvciBlYWNoIG9wZXJhdGlvbiwgCi0gICAgaWYgKHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIHNldE1pc3NpbmdJbnB1dCgKLSAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9PUEVSQVRJT04pKTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLSAgICAgIEl0ZXJhdG9yIG9wSXQgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChvcEl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgb3BJdC5uZXh0KCk7Ci0gICAgICAgIGlmIChvcGVyYXRpb24gPT0gbnVsbCB8fCBvcGVyYXRpb24uaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcHJvY2Vzc09wZXJhdGlvbkFzc2VydGlvbnMoCi0gICAgICAgICAgICBvcGVyYXRpb24sCi0gICAgICAgICAgICBwb3J0VHlwZSwKLSAgICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgbWVzc2FnZSBhc3NlcnRpb25zLgotICAgKiBAcGFyYW0gbWVzc2FnZSBhIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2UgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gY2xhc3NQcmVmaXggY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIG1lc3NhZ2UgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNZXNzYWdlQXNzZXJ0aW9ucygKLSAgICBNZXNzYWdlIG1lc3NhZ2UsCi0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlLAotICAgIFN0cmluZyBjbGFzc1ByZWZpeCwKLSAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgRW50cnkgZW50cnkgPSBudWxsOwotICAgIFFOYW1lIG1lc3NhZ2VRTmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKTsKLQotICAgIC8vIENyZWF0ZSBlbnRyeSAKLSAgICBlbnRyeSA9IHRoaXMucmVwb3J0ZXIuZ2V0UmVwb3J0KCkuY3JlYXRlRW50cnkoKTsKLSAgICBlbnRyeS5zZXRFbnRyeVR5cGUoCi0gICAgICBFbnRyeVR5cGUuZ2V0RW50cnlUeXBlKEVudHJ5VHlwZS5UWVBFX0RFU0NSSVBUSU9OX01FU1NBR0UpKTsKLSAgICBlbnRyeS5zZXRSZWZlcmVuY2VJRChtZXNzYWdlUU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgZW50cnkuc2V0RW50cnlEZXRhaWwobWVzc2FnZSk7Ci0KLSAgICAvLyBTZXQgZW50cnkgY29udGFpbmVyCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0KLSAgICAgIGFuYWx5emVyQ29udGV4dC5nZXRDYW5kaWRhdGVJbmZvKCkuZ2V0RGVmaW5pdGlvbihtZXNzYWdlKTsKLSAgICBlbnRyeS5zZXRFbnRyeUNvbnRhaW5lcigKLSAgICAgIGdldEVudHJ5Q29udGFpbmVyKAotICAgICAgICAoZGVmaW5pdGlvbiA9PSBudWxsID8gbnVsbCA6IGRlZmluaXRpb24uZ2V0RG9jdW1lbnRCYXNlVVJJKCkpKSk7Ci0KLSAgICAvLyBQcm9jZXNzIGJpbmRpbmcgdGVzdCBhc3NlcnRpb25zCi0gICAgcHJvY2Vzc0Fzc2VydGlvbnMoY2xhc3NQcmVmaXgsIG5ldyBFbnRyeUNvbnRleHQoZW50cnksIHdzZGxEb2N1bWVudCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgbWVzc2FnZSBhc3NlcnRpb25zLgotICAgKiBAcGFyYW0gYmluZGluZyBhIGJpbmRpbmcuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2UgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gY2xhc3NQcmVmaXggY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIG1lc3NhZ2UgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNZXNzYWdlQXNzZXJ0aW9ucygKLSAgICBCaW5kaW5nIGJpbmRpbmcsCi0gICAgU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmZXJlbmNlLAotICAgIFN0cmluZyBjbGFzc1ByZWZpeCwKLSAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIEhhc2hTZXQgbWVzc2FnZVNldDsKLQotICAgIGlmIChiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkgIT0gbnVsbCkKLSAgICB7IC8vIGNhbiBkbyBub3RoaW5nIGlmIGhhdmUgbm8gb3BlcmF0aW9ucyBkZWZpbmVkCi0gICAgICBtZXNzYWdlU2V0ID0KLSAgICAgICAgV1NETFV0aWxzLmZpbmRNZXNzYWdlcyh3c2RsRG9jdW1lbnQuZ2V0RGVmaW5pdGlvbnMoKSwgYmluZGluZyk7Ci0KLSAgICAgIC8vIFByb2Nlc3MgYW55IG1lc3NhZ2VzIHRoYXQgd2VyZSBmb3VuZCAgICAKLSAgICAgIGlmIChtZXNzYWdlU2V0LnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIG1lc3NhZ2VJdCA9IG1lc3NhZ2VTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG1lc3NhZ2VJdC5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgbWVzc2FnZUl0Lm5leHQoKTsKLSAgICAgICAgICBpZiAoIW1lc3NhZ2UuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlQXNzZXJ0aW9ucygKLSAgICAgICAgICAgICAgbWVzc2FnZSwKLSAgICAgICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgY2xhc3NQcmVmaXgsCi0gICAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBtZXNzYWdlIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBwb3J0VHlwZSBwb3J0IHR5cGUuCi0gICAqIEBwYXJhbSBzZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2UgcmVmZXJlbmNlLgotICAgKiBAcGFyYW0gY2xhc3NQcmVmaXggY2xhc3MgcHJlZml4LgotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFdTREwgZG9jdW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIAotICAgKiAgICAgICAgIG1lc3NhZ2UgYXNzZXJ0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NNZXNzYWdlQXNzZXJ0aW9ucygKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBIYXNoU2V0IG1lc3NhZ2VTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgaWYgKHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGNhbiBkbyBub3RoaW5nIGlmIGhhdmUgbm8gb3BlcmF0aW9ucyBkZWZpbmVkCi0KLSAgICAgIEl0ZXJhdG9yIG9wSXQgPSBwb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQotICAgICAgd2hpbGUgKG9wSXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPcGVyYXRpb24gb3AgPSAoT3BlcmF0aW9uKSBvcEl0Lm5leHQoKTsKLQotICAgICAgICAvLyBTaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB3ZSBoYXZlIGJvdGggYW5kIGlucHV0IGFuZCBvdXRwdXQgbWVzc2FnZSwgCi0gICAgICAgIC8vIGNoZWNrIGZvciBpdHMgZXhpc3RlbmNlIGJlZm9yZSBhZGRpbmcgaXQKLSAgICAgICAgaWYgKG9wLmdldElucHV0KCkgIT0gbnVsbCAmJiAhb3AuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgICBtZXNzYWdlU2V0LmFkZChvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgaWYgKG9wLmdldE91dHB1dCgpICE9IG51bGwKLSAgICAgICAgICAmJiAhb3AuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpLmlzVW5kZWZpbmVkKCkpCi0gICAgICAgICAgbWVzc2FnZVNldC5hZGQob3AuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpKTsKLQotICAgICAgICAvLyBhbHNvIG1lc3NhZ2VzIGZyb20gYW55IEZhdWx0cyBkZWZpbmVkIHdpdGhpbiB0aGUgb3BlcmF0aW9uCi0gICAgICAgIGlmIChvcC5nZXRGYXVsdHMoKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSXRlcmF0b3IgZmF1bHRJdCA9IG9wLmdldEZhdWx0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgTWVzc2FnZSBtZXNzYWdlOwotICAgICAgICAgIHdoaWxlIChmYXVsdEl0Lmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlID0gKChGYXVsdCkgZmF1bHRJdC5uZXh0KCkpLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmICghbWVzc2FnZS5pc1VuZGVmaW5lZCgpKQotICAgICAgICAgICAgICBtZXNzYWdlU2V0LmFkZChtZXNzYWdlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG1lc3NhZ2VTZXQuc2l6ZSgpID09IDApCi0gICAgICB7Ci0gICAgICAgIC8vIFNldCBhbGwgbWVzc2FnZSB0ZXN0IGFzc2VydGlvbiByZXN1bHRzIHRvIG1pc3NpbmdJbnB1dAotICAgICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgICAgRW50cnlUeXBlLmdldEVudHJ5VHlwZShFbnRyeVR5cGUuVFlQRV9ERVNDUklQVElPTl9NRVNTQUdFKSk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gbm93IHN0ZXAgdGhyb3VnaCBlYWNoIGRlcml2ZWQgTWVzc2FnZQotICAgICAgICBJdGVyYXRvciBtZXNzYWdlSXQgPSBtZXNzYWdlU2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChtZXNzYWdlSXQuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICAgICAgKE1lc3NhZ2UpIChtZXNzYWdlSXQubmV4dCgpKSwKLSAgICAgICAgICAgIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICAgIHdzZGxEb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvY2VzcyBtZXNzYWdlIGFzc2VydGlvbnMuCi0gICAqIEBwYXJhbSBvcCAtIG9wZXJhdGlvbi4KLSAgICogQHBhcmFtIHNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZSByZWZlcmVuY2UuCi0gICAqIEBwYXJhbSBjbGFzc1ByZWZpeCBjbGFzcyBwcmVmaXguCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgV1NETCBkb2N1bWVudC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHByb2Nlc3NpbmcgCi0gICAqICAgICAgICAgbWVzc2FnZSBhc3NlcnRpb25zLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgIE9wZXJhdGlvbiBvcCwKLSAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VSZWZlcmVuY2UsCi0gICAgU3RyaW5nIGNsYXNzUHJlZml4LAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBIYXNoU2V0IG1lc3NhZ2VTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgIGlmIChvcC5nZXRJbnB1dCgpICE9IG51bGwgJiYgIW9wLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpLmlzVW5kZWZpbmVkKCkpCi0gICAgICBtZXNzYWdlU2V0LmFkZChvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICBpZiAob3AuZ2V0T3V0cHV0KCkgIT0gbnVsbCAmJiAhb3AuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpLmlzVW5kZWZpbmVkKCkpCi0gICAgICBtZXNzYWdlU2V0LmFkZChvcC5nZXRPdXRwdXQoKS5nZXRNZXNzYWdlKCkpOwotCi0gICAgLy8gYWxzbyBtZXNzYWdlcyBmcm9tIGFueSBGYXVsdHMgZGVmaW5lZCB3aXRoaW4gdGhlIG9wZXJhdGlvbgotICAgIEl0ZXJhdG9yIGZhdWx0SXQgPSBvcC5nZXRGYXVsdHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICB3aGlsZSAoZmF1bHRJdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgbWVzc2FnZSA9ICgoRmF1bHQpIGZhdWx0SXQubmV4dCgpKS5nZXRNZXNzYWdlKCk7Ci0gICAgICBpZiAoIW1lc3NhZ2UuaXNVbmRlZmluZWQoKSkKLSAgICAgICAgbWVzc2FnZVNldC5hZGQobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgaWYgKG1lc3NhZ2VTZXQuc2l6ZSgpID09IDApCi0gICAgewotICAgICAgLy8gU2V0IGFsbCBtZXNzYWdlIHRlc3QgYXNzZXJ0aW9uIHJlc3VsdHMgdG8gbWlzc2luZ0lucHV0Ci0gICAgICBzZXRNaXNzaW5nSW5wdXQoCi0gICAgICAgIEVudHJ5VHlwZS5nZXRFbnRyeVR5cGUoRW50cnlUeXBlLlRZUEVfREVTQ1JJUFRJT05fTUVTU0FHRSkpOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBub3cgc3RlcCB0aHJvdWdoIGVhY2ggZGVyaXZlZCBNZXNzYWdlCi0gICAgICBJdGVyYXRvciBtZXNzYWdlSXQgPSBtZXNzYWdlU2V0Lml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAobWVzc2FnZUl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgcHJvY2Vzc01lc3NhZ2VBc3NlcnRpb25zKAotICAgICAgICAgIChNZXNzYWdlKSAobWVzc2FnZUl0Lm5leHQoKSksCi0gICAgICAgICAgc2VydmljZVJlZmVyZW5jZSwKLSAgICAgICAgICBjbGFzc1ByZWZpeCwKLSAgICAgICAgICB3c2RsRG9jdW1lbnQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbCNpc1ByaW1hcnlFbnRyeVR5cGVNYXRjaChvcmcud3NpLnRlc3QucHJvZmlsZS5UZXN0QXNzZXJ0aW9uLCBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuRW50cnlDb250ZXh0KQotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmltYXJ5RW50cnlUeXBlTWF0Y2goCi0gICAgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uLAotICAgIEVudHJ5Q29udGV4dCB0YXJnZXRDb250ZXh0KQotICB7Ci0gICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCi0gICAgLy8gSWYgdGhlIHRlc3QgYXNzZXJ0aW9uIGVudHJ5IHR5cGUgbWF0Y2hlcyB0aGUgdGFyZ2V0IGNvbnRleHQgZW50cnkgdHlwZSwgdGhlbiBjb250aW5lCi0gICAgaWYgKHRlc3RBc3NlcnRpb24KLSAgICAgIC5nZXRFbnRyeVR5cGVOYW1lKCkKLSAgICAgIC5lcXVhbHModGFyZ2V0Q29udGV4dC5nZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpLmdldFR5cGVOYW1lKCkpKQotICAgIHsKLSAgICAgIG1hdGNoID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWF0Y2g7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQmFzZVZhbGlkYXRvckltcGwjaXNOb3RBcHBsaWNhYmxlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdEFwcGxpY2FibGUoVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uKQotICB7Ci0gICAgYm9vbGVhbiBub3RBcHBsaWNhYmxlID0gZmFsc2U7Ci0KLSAgICAvLyBBREQ6Ci0KLSAgICByZXR1cm4gbm90QXBwbGljYWJsZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0U29hcEZhdWx0cy4KLSAgICogCi0gICAqIEBwYXJhbSBpbkJpbmRpbmcgaW4gYmluZGluZy4KLSAgICogQHJldHVybiBzb2FwIGZhdWx0cy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgd2hpbGUgcHJvY2Vzc2luZyBiaW5kaW5nIGZhdWx0cy4KLSAgICovCi0gIHByb3RlY3RlZCBTT0FQRmF1bHRbXSBnZXRTb2FwRmF1bHRzKEJpbmRpbmcgaW5CaW5kaW5nKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIFZlY3RvciBzb2FwRmF1bHRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gR28gdGhyb3VnaCBlYWNoIGJpbmRpbmdGYXVsdCBvbmUgYXQgYSB0aW1lCi0gICAgQmluZGluZ0ZhdWx0W10gYmluZGluZ0ZhdWx0cyA9IGdldEFsbEJpbmRpbmdGYXVsdHMoaW5CaW5kaW5nKTsKLSAgICBmb3IgKGludCBmYXVsdCA9IDA7IGZhdWx0IDwgYmluZGluZ0ZhdWx0cy5sZW5ndGg7IGZhdWx0KyspCi0gICAgewotICAgICAgU09BUEZhdWx0IHNvYXBGYXVsdCA9IGdldFNvYXBGYXVsdChiaW5kaW5nRmF1bHRzW2ZhdWx0XSk7Ci0gICAgICBpZiAoc29hcEZhdWx0ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHNvYXBGYXVsdHMuYWRkKHNvYXBGYXVsdCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgU09BUEZhdWx0W10gc29hcEZhdWx0QXJyYXkgPSBuZXcgU09BUEZhdWx0W3NvYXBGYXVsdHMuc2l6ZSgpXTsKLSAgICBzb2FwRmF1bHRzLmNvcHlJbnRvKHNvYXBGYXVsdEFycmF5KTsKLQotICAgIHJldHVybiBzb2FwRmF1bHRBcnJheTsKLSAgfQotCi0gIC8qKgotICAqIE1ldGhvZCBnZXRBbGxCaW5kaW5nRmF1bHRzLgotICAqIAotICAqIEBwYXJhbSBpbkJpbmRpbmcgYmluZGluZy4KLSAgKiBAcmV0dXJuIGFsbCBiaW5kaW5nIGZhdWx0cy4KLSAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgKi8KLSAgcHJvdGVjdGVkIEJpbmRpbmdGYXVsdFtdIGdldEFsbEJpbmRpbmdGYXVsdHMoQmluZGluZyBpbkJpbmRpbmcpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBWZWN0b3IgZmF1bHRzID0gbmV3IFZlY3RvcigpOwotCi0gICAgdHJ5Ci0gICAgewotCi0gICAgICBJdGVyYXRvciBiaW5kaW5nT3BlcmF0aW9ucyA9IGluQmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgIHdoaWxlIChiaW5kaW5nT3BlcmF0aW9ucy5oYXNOZXh0KCkpCi0gICAgICB7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvID0gKEJpbmRpbmdPcGVyYXRpb24pIGJpbmRpbmdPcGVyYXRpb25zLm5leHQoKTsKLSAgICAgICAgICBJdGVyYXRvciBiaW5kaW5nRmF1bHRzID0gYm8uZ2V0QmluZGluZ0ZhdWx0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGJpbmRpbmdGYXVsdHMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgZmF1bHRzLmFkZCgoQmluZGluZ0ZhdWx0KSBiaW5kaW5nRmF1bHRzLm5leHQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBubyBiaW5kaW5nIG9wZXJhdGlvbnMgaW4gdGhpcyBiaW5kaW5nIC0gaWdub3JlICYgY29udGludWUKLSAgICB9Ci0KLSAgICBCaW5kaW5nRmF1bHRbXSBmYXVsdEFycmF5ID0gbmV3IEJpbmRpbmdGYXVsdFtmYXVsdHMuc2l6ZSgpXTsKLSAgICBmYXVsdHMuY29weUludG8oZmF1bHRBcnJheSk7Ci0KLSAgICByZXR1cm4gZmF1bHRBcnJheTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0V1NETEZhdWx0cy4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nRmF1bHQgYSBiaW5kaW5nIGZhdWx0LgotICAgKiBAcmV0dXJuIFdTREwgZmF1bHRzLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgICovCi0gIHByb3RlY3RlZCBTT0FQRmF1bHQgZ2V0U29hcEZhdWx0KEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBTT0FQRmF1bHQgc29hcEZhdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBmYXVsdEV4dGVuc2libGVzID0KLSAgICAgICAgYmluZGluZ0ZhdWx0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgIHdoaWxlIChmYXVsdEV4dGVuc2libGVzLmhhc05leHQoKSAmJiBzb2FwRmF1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBzb2FwRmF1bHQgPSAoU09BUEZhdWx0KSBmYXVsdEV4dGVuc2libGVzLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsgLy8gaWdub3JlIGV2ZXJ5dGhpbmcgYnV0IFNPQVAgRmF1bHQgZWxlbWVudHMuCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLQotICAgIHJldHVybiBzb2FwRmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldFNvYXBIZWFkZXIuCi0gICAqIAotICAgKiBAcGFyYW0gaW5CaW5kaW5nIGEgYmluZGluZy4KLSAgICogQHJldHVybiBTT0FQIGhlYWRlcnMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHJvdGVjdGVkIFNPQVBIZWFkZXJbXSBnZXRTb2FwSGVhZGVycyhCaW5kaW5nIGluQmluZGluZykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IGFsbCBiaW5kaW5ncwotICAgIEJpbmRpbmdbXSBiaW5kaW5nTGlzdCA9IG5ldyBCaW5kaW5nWzFdOwotICAgIGJpbmRpbmdMaXN0WzBdID0gaW5CaW5kaW5nOwotCi0gICAgVmVjdG9yIHNvYXBIZWFkZXJMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gR28gdGhyb3VnaCBlYWNoIGJpbmRpbmcgb25lIGF0IGEgdGltZQotICAgIGZvciAoaW50IGJpbmRpbmcgPSAwOyBiaW5kaW5nIDwgYmluZGluZ0xpc3QubGVuZ3RoOyBiaW5kaW5nKyspCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBiaW5kaW5nIE9wZXJhdGlvbnMKLSAgICAgICAgQmluZGluZ09wZXJhdGlvbltdIGJpbmRpbmdPcGVyYXRpb25zID0KLSAgICAgICAgICAoQmluZGluZ09wZXJhdGlvbltdKSBiaW5kaW5nTGlzdFtiaW5kaW5nXQotICAgICAgICAgICAgLmdldEJpbmRpbmdPcGVyYXRpb25zKCkKLSAgICAgICAgICAgIC50b0FycmF5KAotICAgICAgICAgICAgbmV3IEJpbmRpbmdPcGVyYXRpb25bMF0pOwotCi0gICAgICAgIC8vIGdldCByZWZlcmVuY2VzIHRvIHRoZSBleHRlbnNpYmxlIGVsZW1lbnRzIHdpdGhpbiB0aGUgPGlucHV0PiBhbmQgPG91dHB1dD4gZWxlbWVudHMgb2YgdGhpcyBiaW5kaW5nIDxvcGVyYXRpb24+LiAKLSAgICAgICAgZm9yIChpbnQgYm8gPSAwOyBibyA8IGJpbmRpbmdPcGVyYXRpb25zLmxlbmd0aDsgYm8rKykKLSAgICAgICAgewotCi0gICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBpbnB1dC9vdXRwdXQgZXh0ZW5zaWJsZXMsIGxvb2tpbmcgZm9yIDxTT0FQOkJvZHk+IGVsZW1lbnRzLgotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEJpbmRpbmdJbnB1dCBiaW5kaW5nSW5wdXQgPSBiaW5kaW5nT3BlcmF0aW9uc1tib10uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICAgICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPQotICAgICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uc1tib10uZ2V0QmluZGluZ091dHB1dCgpOwotCi0gICAgICAgICAgICBJdGVyYXRvciBleHRFbGVtZW50cyA9Ci0gICAgICAgICAgICAgIGJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGV4dEVsZW1lbnRzLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzb2FwSGVhZGVyTGlzdC5hZGQoKFNPQVBIZWFkZXIpIGV4dEVsZW1lbnRzLm5leHQoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICB7IC8vIGlnbm9yZSBldmVyeXRoaW5nIGJ1dCBTT0FQIEhlYWRlci4KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleHRFbGVtZW50cyA9IGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChleHRFbGVtZW50cy5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc29hcEhlYWRlckxpc3QuYWRkKChTT0FQSGVhZGVyKSBleHRFbGVtZW50cy5uZXh0KCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgeyAvLyBpZ25vcmUgZXZlcnl0aGluZyBidXQgU09BUCBIZWFkZXIuCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgeyAvLyBubyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciA8aW5wdXQ+IG9yIDxvdXRwdXQ+IC0gaWdub3JlIDogbm90IGNoZWNraW5nIHRoaXMgaGVyZS4KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvLyBubyBiaW5kaW5nIG9wZXJhdGlvbnMgaW4gdGhpcyBiaW5kaW5nIC0gaWdub3JlICYgY29udGludWUKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBTT0FQSGVhZGVyW10gc29hcEhlYWRlckFycmF5ID0gbmV3IFNPQVBIZWFkZXJbc29hcEhlYWRlckxpc3Quc2l6ZSgpXTsKLSAgICBzb2FwSGVhZGVyTGlzdC5jb3B5SW50byhzb2FwSGVhZGVyQXJyYXkpOwotCi0gICAgcmV0dXJuIHNvYXBIZWFkZXJBcnJheTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0U29hcEhlYWRlckZhdWx0cy4KLSAgICogCi0gICAqIFdTRExEb2N1bWVudCBnZXR0ZXIgbWV0aG9kIC0gbWF5YmUgYmV0dGVyIG9mZiBpbiBjbGFzcyBXU0RMRG9jdW1lbnQuLi4KLSAgICogCi0gICAqIEBwYXJhbSBpbkJpbmRpbmcgYSBiaW5kaW5nLgotICAgKiBAcmV0dXJuIFNPQVAgaGVhZGVyIGZhdWx0cy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgU09BUEhlYWRlckZhdWx0W10gZ2V0U29hcEhlYWRlckZhdWx0cyhCaW5kaW5nIGluQmluZGluZykKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICBWZWN0b3Igc29hcEhlYWRlckZhdWx0TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIEdldCB0aGUgbGlzdCBvZiBTT0FQIGhlYWRlcnMKLSAgICBTT0FQSGVhZGVyW10gc29hcEhlYWRlckFycmF5ID0gZ2V0U29hcEhlYWRlcnMoaW5CaW5kaW5nKTsKLQotICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3QgYW5kIGdldCB0aGUgaGVhZGVyIGZhdWx0cwotICAgIExpc3QgbGlzdCA9IG51bGw7Ci0gICAgZm9yIChpbnQgaGVhZGVyID0gMDsgaGVhZGVyIDwgc29hcEhlYWRlckFycmF5Lmxlbmd0aDsgaGVhZGVyKyspCi0gICAgewotICAgICAgLy8gR2V0IGxpc3QgZm9yIHRoaXMgaGVhZGVyCi0gICAgICBpZiAoKGxpc3QgPSBzb2FwSGVhZGVyQXJyYXlbaGVhZGVyXS5nZXRTT0FQSGVhZGVyRmF1bHRzKCkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEFkZCB0byBwcmltYXJ5IGxpc3QgICAgICAKLSAgICAgICAgc29hcEhlYWRlckZhdWx0TGlzdC5hZGRBbGwobGlzdCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgU09BUEhlYWRlckZhdWx0W10gc29hcEhlYWRlckZhdWx0QXJyYXkgPQotICAgICAgbmV3IFNPQVBIZWFkZXJGYXVsdFtzb2FwSGVhZGVyRmF1bHRMaXN0LnNpemUoKV07Ci0gICAgc29hcEhlYWRlckZhdWx0TGlzdC5jb3B5SW50byhzb2FwSGVhZGVyRmF1bHRBcnJheSk7Ci0KLSAgICByZXR1cm4gc29hcEhlYWRlckZhdWx0QXJyYXk7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldFNvYXBCb2RpZXMuCi0gICAqIAotICAgKiBXU0RMRG9jdW1lbnQgZ2V0dGVyIG1ldGhvZCAtIG1heWJlIGJldHRlciBvZmYgaW4gY2xhc3MgV1NETERvY3VtZW50Li4uCi0gICAqIAotICAgKiBAcGFyYW0gaW5CaW5kaW5nIGEgYmluZGluZy4KLSAgICogQHJldHVybiBTT0FQIGJvZGllcy4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgaWYgcHJvYmxlbXMgb2NjdXIgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgU09BUEJvZHlbXSBnZXRTb2FwQm9kaWVzKEJpbmRpbmcgaW5CaW5kaW5nKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBSRU1PVkU6IEdldCBhbGwgYmluZGluZ3MKLSAgICAvL0JpbmRpbmdbXSBiaW5kaW5nTGlzdCA9IHdzZGxEb2N1bWVudC5nZXRCaW5kaW5ncygpOwotICAgIEJpbmRpbmdbXSBiaW5kaW5nTGlzdCA9IG5ldyBCaW5kaW5nWzFdOwotICAgIGJpbmRpbmdMaXN0WzBdID0gaW5CaW5kaW5nOwotCi0gICAgVmVjdG9yIHNvYXBCb2RpZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvLyBHbyB0aHJvdWdoIGVhY2ggYmluZGluZyBvbmUgYXQgYSB0aW1lCi0gICAgZm9yIChpbnQgYmluZGluZyA9IDA7IGJpbmRpbmcgPCBiaW5kaW5nTGlzdC5sZW5ndGg7IGJpbmRpbmcrKykKLSAgICB7Ci0gICAgICAvLyBnZXQgdGhlIGxpc3Qgb2YgYmluZGluZyBPcGVyYXRpb25zCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uW10gYmluZGluZ09wZXJhdGlvbnMgPQotICAgICAgICAoQmluZGluZ09wZXJhdGlvbltdKSBiaW5kaW5nTGlzdFtiaW5kaW5nXQotICAgICAgICAgIC5nZXRCaW5kaW5nT3BlcmF0aW9ucygpCi0gICAgICAgICAgLnRvQXJyYXkoCi0gICAgICAgICAgbmV3IEJpbmRpbmdPcGVyYXRpb25bMF0pOwotCi0gICAgICAvLyBnZXQgcmVmZXJlbmNlcyB0byB0aGUgZXh0ZW5zaWJsZSBlbGVtZW50cyB3aXRoaW4gdGhlIDxpbnB1dD4gYW5kIDxvdXRwdXQ+IGVsZW1lbnRzIG9mIHRoaXMgYmluZGluZyA8b3BlcmF0aW9uPi4gCi0gICAgICBmb3IgKGludCBibyA9IDA7IGJvIDwgYmluZGluZ09wZXJhdGlvbnMubGVuZ3RoOyBibysrKQotICAgICAgewotCi0gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgaW5wdXQvb3V0cHV0IGV4dGVuc2libGVzLCBsb29raW5nIGZvciA8U09BUDpCb2R5PiBlbGVtZW50cy4KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpbnB1dEV4dGVuc2libGVzID0KLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb25zW2JvXQotICAgICAgICAgICAgICAuZ2V0QmluZGluZ0lucHV0KCkKLSAgICAgICAgICAgICAgLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpCi0gICAgICAgICAgICAgIC5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpbnB1dEV4dGVuc2libGVzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc29hcEJvZGllcy5hZGQoKFNPQVBCb2R5KSBpbnB1dEV4dGVuc2libGVzLm5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7IC8vIGlnbm9yZSBldmVyeXRoaW5nIGJ1dCBTT0FQIEJvZHkgZWxlbWVudHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgICAgICB7IC8vIG5vIGV4dGVuc2liaWxpdHkgZWxlbWVudHMgZm9yIDxpbnB1dD4gLSBpZ25vcmUgOiBub3QgY2hlY2tpbmcgdGhpcyBoZXJlLgotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBvdXRwdXRFeHRlbnNpYmxlcyA9Ci0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uc1tib10KLSAgICAgICAgICAgICAgLmdldEJpbmRpbmdPdXRwdXQoKQotICAgICAgICAgICAgICAuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkKLSAgICAgICAgICAgICAgLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKG91dHB1dEV4dGVuc2libGVzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc29hcEJvZGllcy5hZGQoKFNPQVBCb2R5KSBvdXRwdXRFeHRlbnNpYmxlcy5uZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgeyAvLyBpZ25vcmUgZXZlcnl0aGluZyBidXQgU09BUCBCb2R5IGVsZW1lbnRzLgotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkKLSAgICAgICAgeyAvLyBubyBleHRlbnNpYmlsaXR5IGVsZW1lbnRzIGZvciA8b3V0cHV0Pi4KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIFNPQVBCb2R5W10gc29hcEJvZHlBcnJheSA9IG5ldyBTT0FQQm9keVtzb2FwQm9kaWVzLnNpemUoKV07Ci0gICAgc29hcEJvZGllcy5jb3B5SW50byhzb2FwQm9keUFycmF5KTsKLQotICAgIHJldHVybiBzb2FwQm9keUFycmF5OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRTb2FwQm9keS4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nSW5wdXQgYSBCaW5kaW5nSW5wdXQgb2JqZWN0LgotICAgKiBAcmV0dXJuICBib2R5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgICovCi0gIHByb3RlY3RlZCBTT0FQQm9keSBnZXRTb2FwQm9keShCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0KSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbnVsbDsKLQotICAgIEl0ZXJhdG9yIGV4dGVuc2libGVzID0gYmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGV4dGVuc2libGVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3QgZXh0ZW5zaWJsZSA9IGV4dGVuc2libGVzLm5leHQoKTsKLSAgICAgIGlmIChleHRlbnNpYmxlIGluc3RhbmNlb2YgU09BUEJvZHkpCi0gICAgICB7Ci0gICAgICAgIHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBleHRlbnNpYmxlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvYXBCb2R5OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRTb2FwQm9keS4KLSAgICogCi0gICAqIEBwYXJhbSBiaW5kaW5nT3V0cHV0IGEgQmluZGluZ091dHB1dCBvYmplY3QuCi0gICAqIEByZXR1cm4gU09BUCBib2R5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBkdXJpbmcgcHJvY2Vzc2luZy4KLSAgICovCi0gIHByb3RlY3RlZCBTT0FQQm9keSBnZXRTb2FwQm9keShCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0KLSAgICBTT0FQQm9keSBzb2FwQm9keSA9IG51bGw7Ci0KLSAgICBJdGVyYXRvciBleHRlbnNpYmxlcyA9IGJpbmRpbmdPdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoZXh0ZW5zaWJsZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIE9iamVjdCBleHRlbnNpYmxlID0gZXh0ZW5zaWJsZXMubmV4dCgpOwotICAgICAgaWYgKGV4dGVuc2libGUgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgIHsKLSAgICAgICAgc29hcEJvZHkgPSAoU09BUEJvZHkpIGV4dGVuc2libGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc29hcEJvZHk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHNjaGVtYSB1c2VkLgotICAgKiBAcGFyYW0gZGVmIGRlZmluaXRpb24uCi0gICAqIEByZXR1cm4gU2NoZW1hIHVzZWQuCi0gICAqIEB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBpZiBwcm9ibGVtIGdldHRpbmcgV1NETCBkZWZpbnRpb25zIAotICAgKiAgICAgICAgIG5hbWVzcGFjZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hVXNlZChEZWZpbml0aW9uIGRlZikgdGhyb3dzIEFzc2VydGlvbkZhaWxFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBzY2hlbWFVc2VkID0gIiI7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBOZWVkIHRvIHJlYWQgdGhlIGZpbGUgZGlyZWN0bHksIHNpbmNlIFdTREw0SiBhbHdheXMgcHV0cyBpbiB0aGUgZGVmYXVsdCBXU0RMIG5hbWVzcGFjZQotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJzZVhNTERvY3VtZW50VVJMKGRlZi5nZXREb2N1bWVudEJhc2VVUkkoKSwgbnVsbCk7Ci0KLSAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBHZXQgdGhlIHJvb3QgZWxlbWVudAotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICAvLyBHZXQgdGhlIG5hbWVzcGFjZSBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgc2NoZW1hVXNlZCA9IGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiB3ZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigicHJvYmxlbSBnZXR0aW5nIFdTREwgZGVmaW50aW9ucyBuYW1lc3BhY2UiKTsKLSAgICB9Ci0KLSAgICAvKgotICAgIC8vIEdldCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICBTdHJpbmcgc2NoZW1hVXNlZCA9IGRlZi5nZXROYW1lc3BhY2UoIiIpOwotICAgIAotICAgIC8vIElmIHRoZSBkZWZhdWx0IHdhcyBzZXQsIHRoZW4gcHJvY2VzcyBpdCB0byBnZXQgdGhlIG5hbWVzcGFjZQotICAgIGlmIChzY2hlbWFVc2VkID09IG51bGwpIHsKLSAgICAgIC8vIGRvIGl0IHRoZSBoYXJkIHdheSAoc3RpbGwgYmV0dGVyIHRoYW4gYW5vdGhlciBET00gcGFyc2UpLi4uIAkJCQkKLSAgICAgIC8vV1NETFdyaXRlciB3ID0gbmV3IFdTRExXcml0ZXJJbXBsKCk7Ci0gICAgICB0cnkgewotICAgICAgICBXU0RMV3JpdGVyIHcgPSBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1dTRExXcml0ZXIoKTsKLSAgICAgIAlEb2N1bWVudCBkb2MgPSB3LmdldERvY3VtZW50KGRlZik7Ci0gICAgICAJRWxlbWVudCBlID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgCXNjaGVtYVVzZWQgPSBlLmdldE5hbWVzcGFjZVVSSSgpOwotICAgICAgfSAKLSAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oInByb2JsZW0gZ2V0dGluZyBXU0RMIGRlZmludGlvbnMgbmFtZXNwYWNlIik7Ci0gICAgICB9IAotICAgICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gZSkgewotICAgICAgCXRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKCJwcm9ibGVtIGdldHRpbmcgZG9jdW1lbnQgZGVmaW50aW9uIik7Ci0gICAgICB9ICAgICAgCQotICAgIH0KLSAgICAqLwotCi0gICAgcmV0dXJuIHNjaGVtYVVzZWQ7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldFNvYXBCaW5kaW5nLgotICAgKiAKLSAgICogR2V0IHRoZSBTT0FQIGJpbmRpbmcgZm9yIGEgQmluZGluZy4KLSAgICAqIAotICAgKiBAcGFyYW0gYmluZGluZyBhIGJpbmRpbmcuCi0gICAqIEByZXR1cm4gYSBTT0FQIGJpbmRpbmcuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTT0FQQmluZGluZyBnZXRTb2FwQmluZGluZyhCaW5kaW5nIGJpbmRpbmcpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gbnVsbDsKLQotICAgIC8vIEdldCB0aGUgbGlzdCBvZiBleHRlbnNpYmlsaXR5IGVsZW1lbnRzCi0gICAgTGlzdCBleEVsZW1lbnRzID0gYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICBpZiAoZXhFbGVtZW50cyAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCi0gICAgICAvLyAgQ2hlY2sgZm9yIDxzb2FwOmJpbmRpbmc+IGVsZW1lbnQKLSAgICAgIHdoaWxlICgoaXRlcmF0b3IuaGFzTmV4dCgpKSAmJiAoc29hcEJpbmRpbmcgPT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsgLy8gaWdub3JlIGV2ZXJ5dGhpbmcgYnV0IFNPQVAgQmluZGluZyBlbGVtZW50Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc29hcEJpbmRpbmc7Ci0gIH0KLQotICAvKiogCi0gICAqIENyZWF0ZSBYTUwgc2NoZW1hIHZhbGlkYXRvci4gIFRoaXMgaXMgZG9uZSBoZXJlIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgZG8gbm90IGFsbG93Ci0gICAqIHRoZSBkb2N1bWVudExpc3QgZmllbGQgdG8gYmUgYWNjZXNzZWQgZnJvbSB3aXRoaW4gYW4gaW5uZXIgY2xhc3MuCi0gICAqIEBwYXJhbSBkb2N1bWVudEJhc2VVUkkgdGhlIGJhc2UgVVJMLgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgWE1MIHNjaGVtYSB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MU2NoZW1hVmFsaWRhdG9yIGNyZWF0ZVhNTFNjaGVtYVZhbGlkYXRvcihTdHJpbmcgZG9jdW1lbnRCYXNlVVJJKQotICB7Ci0gICAgLy8gQ3JlYXRlIFhNTCBzY2hlbWEgdmFsaWRhdG9yCi0gICAgcmV0dXJuIG5ldyBYTUxTY2hlbWFWYWxpZGF0b3IoZG9jdW1lbnRCYXNlVVJJLCBkb2N1bWVudExpc3QpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNlYXJjaCB4c2Qgc2NoZW1hIG9yIHhzZCBpbXBvcnQgZnJvbSBub2RlLiBJZiBub2RlIGlzIHhzZCBpbXBvcnQgaXQncyBsb2FkaW5nIHNjaGVtYS4KLSAgICogQHBhcmFtIGRlZmluaXRpb24gYSBEZWZpbml0aW9uIG9iamVjdC4KLSAgICogQHJldHVybiBhIGxpc3Qgb2Ygc2NoZW1hIHRhcmdldCBuYW1lc3BhY2VzLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtIGR1cmluZyBwcm9jZXNzaW5nIG1ldGhvZC4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGdldFNjaGVtYVRhcmdldE5hbWVzcGFjZUxpc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIExpc3QgbGlzdCA9IG51bGwsIG5leHRMaXN0ID0gbnVsbDsKLQotICAgIC8vIEdldCBsaXN0IG9mIGV4dGVuc2lvbiBlbGVtZW50cyB3aXRoaW4gdGhlIHR5cGVzIGVsZW1lbnQKLSAgICBUeXBlcyB0eXBlcyA9IG51bGw7Ci0gICAgaWYgKCh0eXBlcyA9IGRlZmluaXRpb24uZ2V0VHlwZXMoKSkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQgPSBudWxsOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IG5leHQgZXh0LiBlbGVtZW50Ci0gICAgICAgIGV4dEVsZW1lbnQgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiB1bmtub3duIGV4dC4gZWxlbWVudCwgdGhlbiBzZWUgaWYgaXQgaXMgYSBzY2hlbWEgZWxlbWVudAotICAgICAgICBUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IgdG5zUHJvY2Vzc29yID0gbnVsbDsKLSAgICAgICAgaWYgKGV4dEVsZW1lbnQgaW5zdGFuY2VvZiBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICB0bnNQcm9jZXNzb3IgPQotICAgICAgICAgICAgbmV3IFRhcmdldE5hbWVzcGFjZVByb2Nlc3NvcigKLSAgICAgICAgICAgICAgZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKSwKLSAgICAgICAgICAgICAgZG9jdW1lbnRMaXN0KTsKLQotICAgICAgICAgIGlmICgobmV4dExpc3QgPQotICAgICAgICAgICAgdG5zUHJvY2Vzc29yLnByb2Nlc3NBbGxTY2hlbWEoCi0gICAgICAgICAgICAgICgoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtZW50KS5nZXRFbGVtZW50KCkpKQotICAgICAgICAgICAgIT0gbnVsbCkKLSAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpCi0gICAgICAgICAgICAgIGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgbGlzdC5hZGRBbGwobmV4dExpc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAvKioKLSAgICogU2VhcmNoIHhzZCBzY2hlbWEgb3IgeHNkIGltcG9ydCBmcm9tIG5vZGUuIElmIG5vZGUgaXMgeHNkIGltcG9ydCBpdCdzIGxvYWRpbmcgc2NoZW1hLgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbiBhIERlZmluaXRpb24gb2JqZWN0LgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzY2hlbWEgdGFyZ2V0IG5hbWVzcGFjZXMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW0gZHVyaW5nIHByb2Nlc3NpbmcgbWV0aG9kLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0U2NoZW1hTmFtZXNwYWNlTGlzdChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIAotICAgIC8vIEFsd2F5cyBhZGQgY3VycmVudCBkb2N1bWVudCB0YXJnZXROYW1lc3BhY2UKLSAgICBMaXN0IHRhcmdldE5hbWVzcGFjZUxpc3QgPSBnZXRTY2hlbWFUYXJnZXROYW1lc3BhY2VMaXN0KGRlZmluaXRpb24pOwotICAgIAotICAgIGlmICgodGFyZ2V0TmFtZXNwYWNlTGlzdCAhPSBudWxsKSAmJiAhdGFyZ2V0TmFtZXNwYWNlTGlzdC5pc0VtcHR5KCkpCi0gICAgICBsaXN0LmFkZEFsbCh0YXJnZXROYW1lc3BhY2VMaXN0KTsKLSAgICAKLSAgICAvLyBHZXQgbGlzdCBvZiBpbXBvcnRlZCBXU0RMIGRvY3VtZW50cwotICAgIE1hcCBpbXBvcnRNYXAgPSBkZWZpbml0aW9uLmdldEltcG9ydHMoKTsKLQotICAgIEltcG9ydCBpbXA7Ci0KLSAgICAvLyBBZGQgZWFjaCBpbXBvcnRzIHRhcmdldE5hbWVzcGFjZSB0byB0aGUgbGlzdAotICAgIGlmIChpbXBvcnRNYXAgIT0gbnVsbCAmJiAhaW1wb3J0TWFwLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBJdGVyYXRvciB2YWx1ZXMgPSBpbXBvcnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIExpc3QgaW1wb3J0TGlzdDsKLSAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBpbXBvcnRMaXN0ID0gKExpc3QpIHZhbHVlcy5uZXh0KCk7Ci0gICAgICAgIEl0ZXJhdG9yIGltcG9ydHMgPSBpbXBvcnRMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbXBvcnRzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIGltcCA9IChJbXBvcnQpIGltcG9ydHMubmV4dCgpOwotICAgICAgICAgIGlmIChpbXAgIT0gbnVsbCAmJiBpbXAuZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpCi0gICAgICAgICAgCWxpc3QuYWRkQWxsKGdldFNjaGVtYU5hbWVzcGFjZUxpc3QoaW1wLmdldERlZmluaXRpb24oKSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogQnVpbGQgbGlzdCBvZiBXU0RMIHRhcmdldE5hbWVzcGFjZXMuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uIGEgRGVmaW5pdGlvbiBvYmplY3QuCi0gICAqIEByZXR1cm4gbGlzdCBvZiBXU0RMIHRhcmdldE5hbWVzcGFjZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBnZXRXU0RMVGFyZ2V0TmFtZXNwYWNlTGlzdChEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvLyBBbHdheXMgYWRkIGN1cnJlbnQgZG9jdW1lbnQgdGFyZ2V0TmFtZXNwYWNlCi0gICAgaWYgKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgIT0gbnVsbCkKLSAgICAgIGxpc3QuYWRkKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCi0gICAgLy8gR2V0IGxpc3Qgb2YgaW1wb3J0ZWQgV1NETCBkb2N1bWVudHMKLSAgICBNYXAgaW1wb3J0TWFwID0gZGVmaW5pdGlvbi5nZXRJbXBvcnRzKCk7Ci0KLSAgICBJbXBvcnQgaW1wOwotCi0gICAgLy8gQWRkIGVhY2ggaW1wb3J0cyB0YXJnZXROYW1lc3BhY2UgdG8gdGhlIGxpc3QKLSAgICBpZiAoaW1wb3J0TWFwICE9IG51bGwgJiYgIWltcG9ydE1hcC5pc0VtcHR5KCkpCi0gICAgewotICAgICAgSXRlcmF0b3IgdmFsdWVzID0gaW1wb3J0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICBMaXN0IGltcG9ydExpc3Q7Ci0gICAgICB3aGlsZSAodmFsdWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0TGlzdCA9IChMaXN0KSB2YWx1ZXMubmV4dCgpOwotICAgICAgICBJdGVyYXRvciBpbXBvcnRzID0gaW1wb3J0TGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaW1wb3J0cy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbXAgPSAoSW1wb3J0KSBpbXBvcnRzLm5leHQoKTsKLSAgICAgICAgICBpZiAoaW1wICE9IG51bGwgJiYgaW1wLmdldERlZmluaXRpb24oKSAhPSBudWxsKQotICAgICAgICAgIGxpc3QuYWRkQWxsKGdldFdTRExUYXJnZXROYW1lc3BhY2VMaXN0KGltcC5nZXREZWZpbml0aW9uKCkpKTsKLSAgICAgICAgICAgIC8vIGxpc3QuYWRkKGltcC5nZXREZWZpbml0aW9uKCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgQmluZGluZ01hdGNoCi0gIHsKLSAgICBwcml2YXRlIEJpbmRpbmcgYmluZGluZzsKLSAgICBwcml2YXRlIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbjsKLSAgICBwcml2YXRlIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nOwotICAgIC8vcHJpdmF0ZSBWZWN0b3IgYmluZGluZ0FyZ3M7IC8vIHNldCBvZiBCaW5kaW5nSW5wdXRzIGFuZCBCaW5kaW5nT3V0cHV0cwotICAgIHByaXZhdGUgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dDsKLSAgICBwcml2YXRlIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dDsKLQotICAgIC8vIEFERDogbmVlZCB0byBpbmNsdWRlIEJpbmRpbmdGYXVsdCBzdXBwb3J0Li4uCi0gICAgcHVibGljIEJpbmRpbmdNYXRjaCgKLSAgICAgIEJpbmRpbmcgYiwKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gYm8sCi0gICAgICBTT0FQQmluZGluZyBzYiwKLSAgICAgIEJpbmRpbmdJbnB1dCBiaW4sCi0gICAgICBCaW5kaW5nT3V0cHV0IGJvdXQpCi0gICAgewotICAgICAgYmluZGluZyA9IGI7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uID0gYm87Ci0gICAgICBzb2FwQmluZGluZyA9IHNiOwotICAgICAgLy9iaW5kaW5nQXJncyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIC8vaWYgKGJpbiAgIT0gbnVsbCkgeyBiaW5kaW5nQXJncy5hZGQoYmluKTsgIH0KLSAgICAgIC8vaWYgKGJvdXQgIT0gbnVsbCkgeyBiaW5kaW5nQXJncy5hZGQoYm91dCk7IH0KLSAgICAgIGJpbmRpbmdJbnB1dCA9IGJpbjsKLSAgICAgIGJpbmRpbmdPdXRwdXQgPSBib3V0OwotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nTWF0Y2goCi0gICAgICBCaW5kaW5nIGIsCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvLAotICAgICAgU09BUEJpbmRpbmcgc2IsCi0gICAgICBCaW5kaW5nSW5wdXQgYmluKQotICAgIHsKLSAgICAgIHRoaXMoYiwgYm8sIHNiLCBiaW4sIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBCaW5kaW5nTWF0Y2goCi0gICAgICBCaW5kaW5nIGIsCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvLAotICAgICAgU09BUEJpbmRpbmcgc2IsCi0gICAgICBCaW5kaW5nT3V0cHV0IGJvdXQpCi0gICAgewotICAgICAgdGhpcyhiLCBibywgc2IsIG51bGwsIGJvdXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNvYXBCaW5kaW5nLgotICAgICAqIEByZXR1cm4gU09BUEJpbmRpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU09BUEJpbmRpbmcgZ2V0U29hcEJpbmRpbmcoKQotICAgIHsKLSAgICAgIHJldHVybiBzb2FwQmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBiaW5kaW5nT3BlcmF0aW9uLgotICAgICAqIEByZXR1cm4gQmluZGluZ09wZXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBCaW5kaW5nT3BlcmF0aW9uIGdldEJpbmRpbmdPcGVyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBiaW5kaW5nT3BlcmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJpbmRpbmdJbnB1dC4KLSAgICAgKiBAcmV0dXJuIEJpbmRpbmdJbnB1dAotICAgICAqLwotICAgIHB1YmxpYyBCaW5kaW5nSW5wdXQgZ2V0QmluZGluZ0lucHV0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmluZGluZ0lucHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJpbmRpbmdPdXRwdXQuCi0gICAgICogQHJldHVybiBCaW5kaW5nT3V0cHV0Ci0gICAgICovCi0gICAgcHVibGljIEJpbmRpbmdPdXRwdXQgZ2V0QmluZGluZ091dHB1dCgpCi0gICAgewotICAgICAgcmV0dXJuIGJpbmRpbmdPdXRwdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQmluZGluZ0lucHV0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKHRoaXMuYmluZGluZ0lucHV0ICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0JpbmRpbmdPdXRwdXQoKQotICAgIHsKLSAgICAgIHJldHVybiAodGhpcy5iaW5kaW5nT3V0cHV0ICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGJpbmRpbmcuCi0gICAgICogQHJldHVybiBCaW5kaW5nCi0gICAgICovCi0gICAgcHVibGljIEJpbmRpbmcgZ2V0QmluZGluZygpCi0gICAgewotICAgICAgcmV0dXJuIGJpbmRpbmc7Ci0gICAgfQotCi0gIH0KLQotICAvKioKLSAgICogR2V0IGJpbmRpbmcgbWF0Y2hlcy4KLSAgKiBAcGFyYW0gYmluZGluZyBhIGJpbmRpbmcuCi0gICogQHBhcmFtIHNvYXBCaW5kaW5nU3R5bGUgc29hcCBiaW5kaW5nIHN0eWxlLgotICAqIEBwYXJhbSBzb2FwQm9keVVzZSBzb2FwIGJvZHkgdXNlLgotICAqIEByZXR1cm4gYmluZGluZyBtYXRjaGVzLgotICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGR1cmluZyBwcm9jZXNzaW5nLgotICAqLwotICBwdWJsaWMgQmluZGluZ01hdGNoW10gZ2V0QmluZGluZ01hdGNoZXMoCi0gICAgQmluZGluZyBiaW5kaW5nLAotICAgIFN0cmluZyBzb2FwQmluZGluZ1N0eWxlLAotICAgIFN0cmluZyBzb2FwQm9keVVzZSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLQotICAgIFZlY3RvciBiaW5kaW5nTWF0Y2hlcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIENoZWNrIGJpbmRpbmcKLSAgICBTT0FQQmluZGluZyBzb2FwQmluZGluZyA9IGdldFNvYXBCaW5kaW5nKGJpbmRpbmcpOwotCi0gICAgLy8gY2hlY2sgdGhhdCB0aGUgc29hcDpiaW5kaW5nIGZvciB0aGlzIFdTREwgYmluZGluZyBpcyB0aGUgc3BlY2lmaWVkIHN0eWxlCi0gICAgLy8gQUREOiBjaGVjayBmb3IgbnVsbCBwb2ludGVyCi0gICAgaWYgKHNvYXBCaW5kaW5nICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGRlZmF1bHRTdHlsZSA9IHNvYXBCaW5kaW5nLmdldFN0eWxlKCk7Ci0KLSAgICAgIGlmIChkZWZhdWx0U3R5bGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZGVmYXVsdFN0eWxlID0gV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQzsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0IHRoZSBzZXQgb2Ygb3BlcmF0aW9ucyBmb3IgdGhpcyBXU0RMIGJpbmRpbmcKLSAgICAgIExpc3QgYmluZGluZ09wc0xpc3QgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCk7Ci0gICAgICBpZiAoYmluZGluZ09wc0xpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgYmluZGluZ09wcyA9IGJpbmRpbmdPcHNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIC8vIGZvciBlYWNoIGJpbmRpbmcgb3BlcmF0aW9uOgotICAgICAgICB3aGlsZSAoYmluZGluZ09wcy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9IChCaW5kaW5nT3BlcmF0aW9uKSBiaW5kaW5nT3BzLm5leHQoKTsKLQotICAgICAgICAgIFNPQVBPcGVyYXRpb24gc29hcE9wID0gZ2V0U29hcE9wZXJhdGlvbihiaW5kaW5nT3ApOwotCi0gICAgICAgICAgaWYgKChzb2FwT3AgPT0gbnVsbCAmJiBkZWZhdWx0U3R5bGUuZXF1YWxzKHNvYXBCaW5kaW5nU3R5bGUpKQotICAgICAgICAgICAgfHwgKHNvYXBPcCAhPSBudWxsCi0gICAgICAgICAgICAgICYmIHNvYXBPcC5nZXRTdHlsZSgpID09IG51bGwKLSAgICAgICAgICAgICAgJiYgZGVmYXVsdFN0eWxlLmVxdWFscyhzb2FwQmluZGluZ1N0eWxlKSkKLSAgICAgICAgICAgIHx8IChzb2FwT3AgIT0gbnVsbAotICAgICAgICAgICAgICAmJiBzb2FwT3AuZ2V0U3R5bGUoKSAhPSBudWxsCi0gICAgICAgICAgICAgICYmIHNvYXBPcC5nZXRTdHlsZSgpLmVxdWFscyhzb2FwQmluZGluZ1N0eWxlKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gY2hlY2sgYmluZGluZyBpbnB1dCAmIG91dHB1dAotICAgICAgICAgICAgQmluZGluZ0lucHV0IGJJbnB1dCA9IGJpbmRpbmdPcC5nZXRCaW5kaW5nSW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChiSW5wdXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU09BUEJvZHkgaW5wdXRTb2FwQm9keSA9IGdldFNvYXBCb2R5KGJJbnB1dCk7Ci0gICAgICAgICAgICAgIGlmIChpbnB1dFNvYXBCb2R5ID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCAoaW5wdXRTb2FwQm9keS5nZXRVc2UoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAmJiAhaW5wdXRTb2FwQm9keS5nZXRVc2UoKS5lcXVhbHMoc29hcEJvZHlVc2UpKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJJbnB1dCA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQmluZGluZ091dHB1dCBiT3V0cHV0ID0gYmluZGluZ09wLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgICAgICAgICAgIGlmIChiT3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFNPQVBCb2R5IG91dHB1dFNvYXBCb2R5ID0gZ2V0U29hcEJvZHkoYk91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgaWYgKG91dHB1dFNvYXBCb2R5ID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCAob3V0cHV0U29hcEJvZHkuZ2V0VXNlKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgJiYgIW91dHB1dFNvYXBCb2R5LmdldFVzZSgpLmVxdWFscyhzb2FwQm9keVVzZSkpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYk91dHB1dCA9IG51bGw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChiT3V0cHV0ICE9IG51bGwpIHx8IChiSW5wdXQgIT0gbnVsbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBtYXRjaCwgYWRkIHRvIHRoZSB2ZWN0b3IKLSAgICAgICAgICAgICAgYmluZGluZ01hdGNoZXMuYWRkKAotICAgICAgICAgICAgICAgIG5ldyBCaW5kaW5nTWF0Y2goCi0gICAgICAgICAgICAgICAgICBiaW5kaW5nLAotICAgICAgICAgICAgICAgICAgYmluZGluZ09wLAotICAgICAgICAgICAgICAgICAgc29hcEJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICBiSW5wdXQsCi0gICAgICAgICAgICAgICAgICBiT3V0cHV0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQmluZGluZ01hdGNoW10gQmluZGluZ01hdGNoQXJyYXkgPSBuZXcgQmluZGluZ01hdGNoW2JpbmRpbmdNYXRjaGVzLnNpemUoKV07Ci0gICAgYmluZGluZ01hdGNoZXMuY29weUludG8oQmluZGluZ01hdGNoQXJyYXkpOwotICAgIHJldHVybiBCaW5kaW5nTWF0Y2hBcnJheTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0U29hcE9wZXJhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGJpbmRpbmdPcGVyYXRpb24gYSBiaW5kaW5nIG9wZXJhdGlvbi4KLSAgICogQHJldHVybiBhIHNvYXAgb3BlcmF0aW9uLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiBwcm9ibGVtcyB3aGlsZSBwcm9jZXNzaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTT0FQT3BlcmF0aW9uIGdldFNvYXBPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotCi0gICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBJdGVyYXRvciBleHRlbnNpYmxlcyA9Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGV4dGVuc2libGVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBPYmplY3QgZXh0ZW5zaWJsZSA9IGV4dGVuc2libGVzLm5leHQoKTsKLSAgICAgIGlmIChleHRlbnNpYmxlIGluc3RhbmNlb2YgU09BUE9wZXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChTT0FQT3BlcmF0aW9uKSBleHRlbnNpYmxlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qIAotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIFNPQVBPcGVyYXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdzZGw6YmluZGluZyBzdXBwbGllZC4KLSAgICovCi0gIHByb3RlY3RlZCBIYXNoTWFwIGdldFNvYXBPcGVyYXRpb25zKEJpbmRpbmcgYmluZGluZykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgSGFzaE1hcCBzb2FwT3BlcmF0aW9uTGlzdCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBpZiAoYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLy9WZWN0b3Igc29hcE9wVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0gICAgLy8gR2V0IHRoZSBsaXN0IG9mIGJpbmRpbmcgb3BlcmF0aW9ucwotICAgIEl0ZXJhdG9yIG9wZXJhdGlvbnMgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLQotICAgIC8vIENoZWNrIGVhY2ggYmluZGluZyBvcGVyYXRpb24gdG8gc2VlIGlmIGl0IGhhcyBhIHNvYXAgb3BlcmF0aW9uIGVsZW1lbnQKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSBudWxsOwotICAgIHdoaWxlIChvcGVyYXRpb25zLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIG9wZXJhdGlvbnMubmV4dCgpOwotICAgICAgSXRlcmF0b3IgZXh0ZW5zaWJsZXMgPQotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZXh0ZW5zaWJsZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3QgZXh0ZW5zaWJsZSA9IGV4dGVuc2libGVzLm5leHQoKTsKLSAgICAgICAgaWYgKGV4dGVuc2libGUgaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgc29hcE9wZXJhdGlvbkxpc3QucHV0KGV4dGVuc2libGUsIGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vcmV0dXJuIChTT0FQT3BlcmF0aW9uW10pc29hcE9wVmVjdG9yLnRvQXJyYXkobmV3IFNPQVBPcGVyYXRpb25bXSB7fSk7Ci0gICAgcmV0dXJuIHNvYXBPcGVyYXRpb25MaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHBhcnQgYXR0cmlidXRlcy4KLSAgICogQHBhcmFtIGJpbmRpbmdNYXRjaCBhbiBhcnJheSBvZiBCaW5kaW5nTWF0Y2ggb2JqZWN0cy4KLSAgICogQHBhcmFtIGluT3JPdXQgYSBTdHJpbmcgb2JqZWN0LgotICAgKiBAcGFyYW0gYXR0cmliIGF0dHJpYnV0ZS4KLSAgICogQHJldHVybiBhIGJvb2xlYW4uCi0gICAqIEB0aHJvd3MgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbiBpZiB0aGUgcGFydCBpcyBub3QgY29tcGxpYW50LgotICAgKi8KLSAgLy8gR1QgLSByZXdvcmsgdGhpcyBtZXRob2Qgd2l0aCBhIGJldHRlciB3YXkgb2YgcGFyYW1ldGVyaXppbmcgdGhlIGdldHRlcnMgcmVxdWlyZWQgZm9yIHRoZSBpbnZvY2F0aW9uLgotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1BhcnRBdHRyaWJ1dGVzKAotICAgIEJpbmRpbmdNYXRjaFtdIGJpbmRpbmdNYXRjaCwKLSAgICBTdHJpbmcgaW5Pck91dCwKLSAgICBTdHJpbmcgYXR0cmliKQotICAgIHRocm93cyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uCi0gIHsKLQotICAgIGlmICghKGluT3JPdXQuZXF1YWxzKCJ1c2VJbnB1dCIpIHx8IGluT3JPdXQuZXF1YWxzKCJ1c2VPdXRwdXQiKSkKLSAgICAgIHx8ICEoYXR0cmliLmVxdWFscygidXNlVHlwZSIpIHx8IGF0dHJpYi5lcXVhbHMoInVzZUVsZW1lbnQiKSkpCi0gICAgewotICAgICAgLy8gaW52YWxpZCBhcmd1bWVudCB2YWx1ZSBzdXBwbGllZCBieSBjYWxsaW5nIG1ldGhvZCAtICJpbnRlcm5hbCBlcnJvciIKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpbmRpbmdNYXRjaC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBCaW5kaW5nTWF0Y2ggbmV4dE1hdGNoID0gYmluZGluZ01hdGNoW2ldOwotCi0gICAgICAvLyBjaGVjayB0aGUgYXNzb2NpYXRlZCBwYXJ0cwotICAgICAgTWVzc2FnZSBtc2c7Ci0gICAgICBNYXAgcGFydHM7Ci0gICAgICBJdGVyYXRvciBwYXJ0SXRlcmF0aW9uOwotCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcCA9IG5leHRNYXRjaC5nZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICBpZiAoYmluZGluZ09wID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbnRpbnVlOyAvLyBubyBCaW5kaW5nIE9wZXJhdGlvbiBmb3Igc29tZSByZWFzb24KLSAgICAgIH0KLQotICAgICAgT3BlcmF0aW9uIG9wID0gYmluZGluZ09wLmdldE9wZXJhdGlvbigpOwotCi0gICAgICAvKglBREQ6IGhhbmRsZSBzb2FwOmZhdWx0cyBpbiBzaW1pbGFyIHdheQkgICAJCQotICAgICAgdHJ5IHsKLSAgICAgIC8vIGNoZWNrIGZhdWx0cyAtIHJlbWFya2FibHkgc2ltaWxhci4uLi4gKG5lZWQgdG8gcmV0YWluIG9wZXJhdGlvbiBpZCBmb3IgZmFpbHVyZWRldGFpbCBtc2cpCi0gICAgICAJaWYgKG5leHRNYXRjaC5oYXNCaW5kaW5nRmF1bHQoKSkgewotICAgICAgCQkJCQotICAgICAgCQltc2cgPSBvcC5nZXRGYXVsdCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgIAkJcGFydHMgPSBtc2cuZ2V0UGFydHMoKTsKLSAgICAgIAkJCQkgICAgCQkJCQkgICAgIAkJCQotICAgICAgCQkvL2NoZWNrIHRoYXQgZWFjaCBwYXJ0IGhhcyBhbiBlbGVtZW50IGF0dHJpYnV0ZSAgICAJCQkKLSAgICAgIAkJcGFydEl0ZXJhdGlvbiA9IHBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAJCXdoaWxlIChwYXJ0SXRlcmF0aW9uLmhhc05leHQoKSkgewotICAgICAgCQkJUGFydCBwYXJ0ID0gKFBhcnQpcGFydEl0ZXJhdGlvbi5uZXh0KCk7Ci0gICAgICAJCQlpZiAocGFydC5nZXRFbGVtZW50TmFtZSgpID09IG51bGwpIHsKLSAgICAgIAkJCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbigiT1BFUkFUSU9OOiAiICsgb3AgKyAiTUVTU0FHRTogIiArIG1zZyk7Ci0gICAgICAJCQl9Ci0gICAgICAJCX0JIAkJCQotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBuKSB7Ci0gICAgICAJLy8gbm8gcGFydHMgZm91bmQgLSB0aGlzIHF1YWxpZmllcyBhbiBhc3NlcnRpb24gZmFpbHVyZQotICAgICAgCXRocm93IG5ldyBBc3NlcnRpb25GYWlsRXhjZXB0aW9uKG4uZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICAgICovCi0KLSAgICAgIHRyeQotICAgICAgewotCi0gICAgICAgIFFOYW1lIGF0dHJpYnV0ZU5hbWU7Ci0KLSAgICAgICAgLy9HVDogRG8gd2UgbmVlZCB0byBjaGVjayBCaW5kaW5nSW5wdXQgLyBPdXRwdXQgaGVyZSA/PwotCi0gICAgICAgIGlmIChpbk9yT3V0LmVxdWFscygidXNlSW5wdXQiKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChvcC5nZXRJbnB1dCgpID09IG51bGwgfHwgIW5leHRNYXRjaC5oYXNCaW5kaW5nSW5wdXQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBObyBJbnB1dCBzbyBub3RoaW5nIHRvIGNoZWNrCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtc2cgPSBvcC5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAvLyBMb29raW5nIGZvciBPdXRwdXQKLSAgICAgICAgICBpZiAob3AuZ2V0T3V0cHV0KCkgPT0gbnVsbCB8fCAhbmV4dE1hdGNoLmhhc0JpbmRpbmdPdXRwdXQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBObyBPdXRwdXQgc28gbm90aGluZyB0byBjaGVjawotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgbXNnID0gb3AuZ2V0T3V0cHV0KCkuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1zZyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7IC8vIG5vdGhpbmcgdG8gY2hlY2sgZnJvbSB0aGlzIEJpbmRpbmcgTWF0Y2ggKD8pCi0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgcGFydHMgCi0gICAgICAgIHBhcnRzID0gbXNnLmdldFBhcnRzKCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwYXJ0cyBhdHRyaWJ1dGUsIHRoZW4gb25seSBwcm9jZXNzIHRob3NlIHBhcnRzCi0gICAgICAgIExpc3QgcGFydHNOYW1lTGlzdCA9IG51bGw7Ci0gICAgICAgIGlmICgocGFydHNOYW1lTGlzdCA9IGdldFBhcnRzTGlzdChuZXh0TWF0Y2gsIGluT3JPdXQpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgVmVjdG9yIHBhcnRzTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICBJdGVyYXRvciBwYXJ0c05hbWVJdGVyYXRvciA9IHBhcnRzTmFtZUxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICB3aGlsZSAocGFydHNOYW1lSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBhcnRzTGlzdC5hZGQocGFydHMuZ2V0KChTdHJpbmcpIHBhcnRzTmFtZUl0ZXJhdG9yLm5leHQoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwYXJ0SXRlcmF0aW9uID0gcGFydHNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPdGhlcndpc2UgdXNlIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHBhcnRzCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHBhcnRJdGVyYXRpb24gPSBwYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9jaGVjayB0aGF0IGVhY2ggcGFydCBoYXMgYW4gZWxlbWVudCBvciB0eXBlIGF0dHJpYnV0ZSAgICAJCQkKLSAgICAgICAgd2hpbGUgKHBhcnRJdGVyYXRpb24uaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgUGFydCBwYXJ0ID0gKFBhcnQpIHBhcnRJdGVyYXRpb24ubmV4dCgpOwotICAgICAgICAgIGlmIChhdHRyaWIuZXF1YWxzKCJ1c2VFbGVtZW50IikpCi0gICAgICAgICAgewotICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9IHBhcnQuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsgLy8gInVzZVR5cGUiCi0gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gcGFydC5nZXRUeXBlTmFtZSgpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJOYW1lIG9mIG9wZXJhdGlvbiB0aGF0IGZhaWxlZDogIgotICAgICAgICAgICAgICAgICsgb3AuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiXG4iCi0gICAgICAgICAgICAgICAgKyBvcC50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgKyAiXG4iCi0gICAgICAgICAgICAgICAgKyAiXG5OYW1lIG9mIG1lc3NhZ2UgdGhhdCBmYWlsZWQ6ICIKLSAgICAgICAgICAgICAgICArIG1zZy5nZXRRTmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiXG4iCi0gICAgICAgICAgICAgICAgKyBtc2cudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbikKLSAgICAgIHsKLSAgICAgICAgLy8gbm8gcGFydHMgZm91bmQgLSB0aGlzIHF1YWxpZmllcyBhbiBhc3NlcnRpb24gZmFpbHVyZQotICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbEV4Y2VwdGlvbihuLnRvU3RyaW5nKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsgLy8gdGVzdHMgc3VjY2Vzc2Z1bAotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBwYXJ0cyBsaXN0IGZyb20gYSBzb2FwYmluZDpib2R5IGVsZW1lbnQuCi0gICAqLwotICBwcml2YXRlIExpc3QgZ2V0UGFydHNMaXN0KEJpbmRpbmdNYXRjaCBiaW5kaW5nTWF0Y2gsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgTGlzdCBwYXJ0c0xpc3QgPSBudWxsOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbnVsbDsKLQotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gR2V0IHRoZSBiaW5kaW5nIG9wZXJhdGlvbgotICAgICAgYmluZGluZ09wID0gYmluZGluZ01hdGNoLmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLQotICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiBjb250YWlucyBhIHNvYXBiaW5kOmJvZHkgd2l0aCBhIHBhcnRzIGF0dHJpYnV0ZQotICAgICAgaWYgKHR5cGUuZXF1YWxzKCJ1c2VJbnB1dCIpKQotICAgICAgewotICAgICAgICBpdGVyYXRvciA9Ci0gICAgICAgICAgYmluZGluZ09wLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGl0ZXJhdG9yID0KLSAgICAgICAgICBiaW5kaW5nT3AuZ2V0QmluZGluZ091dHB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgICAgLy8gZWl0aGVyIG5vIGJpbmRpbmcgb3BlcmF0aW9uLCBiaW5kaW5nIGlucHV0L291dHB1dCwgb3IgU09BUCBlbGVtZW50Ci0gICAgfQotCi0gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBiaW5kaW5nIG9wZXJhdGlvbiBjb250YWlucyBhIHNvYXBiaW5kOmJvZHkgd2l0aCBhIHBhcnRzIGF0dHJpYnV0ZQotICAgIHdoaWxlICgoaXRlcmF0b3IuaGFzTmV4dCgpKSAmJiAocGFydHNMaXN0ID09IG51bGwpKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBTT0FQQm9keSBzb2FwQm9keSA9IChTT0FQQm9keSkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBwYXJ0c0xpc3QgPSBzb2FwQm9keS5nZXRQYXJ0cygpOwotICAgICAgfQotICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpCi0gICAgICB7IC8vIG5vdCBhIFNPQVBCb2R5IGV4dGVuc2liaWxpdHkgZWxlbWVudCBzbyBpZ25vcmUKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcGFydHNMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBlbGVtZW50IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gd3NkbERvY3VtZW50IFdTREwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSB3c2RsRWxlbWVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gZWxlbWVudCBsb2NhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBFbGVtZW50TG9jYXRpb24gZ2V0RWxlbWVudExvY2F0aW9uKAotICAgIFdTRExEb2N1bWVudCB3c2RsRG9jdW1lbnQsCi0gICAgT2JqZWN0IHdzZGxFbGVtZW50KQotICB7Ci0gICAgRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbiA9IG51bGw7Ci0gICAgV1NETEVsZW1lbnRMaXN0IHdzZGxFbGVtZW50TGlzdDsKLQotICAgIGlmICgod3NkbEVsZW1lbnRMaXN0ID0gd3NkbERvY3VtZW50LmdldEVsZW1lbnRMaXN0KCkpICE9IG51bGwpCi0gICAgewotICAgICAgZWxlbWVudExvY2F0aW9uID0gd3NkbEVsZW1lbnRMaXN0LmdldEVsZW1lbnRMb2NhdGlvbih3c2RsRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVsZW1lbnRMb2NhdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgZmFpbHVyZSBkZXRhaWwuCi0gICAqIEBwYXJhbSBtZXNzYWdlIGEgbWVzc2FnZS4KLSAgICogQHBhcmFtIGVudHJ5Q29udGV4dCBlbnRyeSBjb250ZXh0LgotICAgKiBAcmV0dXJuIGZhaWx1cmUgZGV0YWlsLgotICAgKi8KLSAgcHJvdGVjdGVkIEZhaWx1cmVEZXRhaWwgY3JlYXRlRmFpbHVyZURldGFpbCgKLSAgICBTdHJpbmcgbWVzc2FnZSwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgICBtZXNzYWdlLAotICAgICAgZW50cnlDb250ZXh0LAotICAgICAgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGZhaWx1cmUgZGV0YWlsLgotICAgKiBAcGFyYW0gbWVzc2FnZSBhIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBlbnRyeUNvbnRleHQgZW50cnkgY29udGV4dC4KLSAgICogQHBhcmFtIHdzZGxFbGVtZW50IFdTREwgZWxlbWVudC4KLSAgICogQHJldHVybiBmYWlsdXJlIGRldGFpbC4KLSAgICovCi0gIHByb3RlY3RlZCBGYWlsdXJlRGV0YWlsIGNyZWF0ZUZhaWx1cmVEZXRhaWwoCi0gICAgU3RyaW5nIG1lc3NhZ2UsCi0gICAgRW50cnlDb250ZXh0IGVudHJ5Q29udGV4dCwKLSAgICBPYmplY3Qgd3NkbEVsZW1lbnQpCi0gIHsKLSAgICBGYWlsdXJlRGV0YWlsIGZhaWx1cmVEZXRhaWwgPSByZXBvcnRlci5jcmVhdGVGYWlsdXJlRGV0YWlsKCk7Ci0gICAgZmFpbHVyZURldGFpbC5zZXRGYWlsdXJlTWVzc2FnZShtZXNzYWdlKTsKLSAgICBmYWlsdXJlRGV0YWlsLnNldEVsZW1lbnRMb2NhdGlvbigKLSAgICAgIGdldEVsZW1lbnRMb2NhdGlvbihlbnRyeUNvbnRleHQuZ2V0V1NETERvY3VtZW50KCksIHdzZGxFbGVtZW50KSk7Ci0gICAgcmV0dXJuIGZhaWx1cmVEZXRhaWw7Ci0gIH0KLQotICAvKiogCi0gICAqIFNPQVBCb2R5LCBTT0FQRmF1bHQsIFNPQVBIZWFkZXIgYW5kIFNPQVBIZWFkZXJGYXVsdCBjbGFzcyAKLSAgICogaW50ZXJmYWNlcyBoYXZlIGNvbXBhdGlibGUgZ2V0VXNlKCkgYW5kIGdldE5hbWVzcGFjZVVSSSgpIAotICAgKiBtZXRob2RzLCBidXQgd3NkbDRqIGRvZXMgbm90IGRlY2xhcmUgdGhlbSBhdCB0aGUgcGFyZW50IGludGVyZmFjZS4gCi0gICAqIFRoZXJlZm9yZSB1c2UgcmVmbGVjdGlvbiB0byBhY2Nlc3MgdGhlc2UgY29tbW9uIG1ldGhvZHMuCi0gICAqIAotICAgKiBAcGFyYW0gZXh0RWxlbWVudCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgaXMgZm91bmQgaW4gU09BUCBsaXRlcmFsLgotICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgZm91bmQuCi0gICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZiBwcm9ibGVtcyBvY2N1ciBpbiBhbiBpbnZva2VkIG1ldGhvZCBvciBjb25zdHJ1Y3RvcgotICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW0gYXR0ZW1wdCB0byBsb2FkIGEKLSAgICogICAgICAgICBjbGFzcyB0aGF0IGl0IGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gbmFtZXNwYWNlRm91bmRJblNvYXBMaXRlcmFsKEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQpCi0gICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotICB7Ci0gICAgQ2xhc3MgYyA9IGV4dEVsZW1lbnQuZ2V0Q2xhc3MoKTsKLSAgICBNZXRob2QgZ2V0VXNlTWV0aG9kID0gYy5nZXRNZXRob2QoImdldFVzZSIsIG5ldyBDbGFzc1swXSk7Ci0gICAgTWV0aG9kIGdldE5hbWVzcGFjZVVSSU1ldGhvZCA9IGMuZ2V0TWV0aG9kKCJnZXROYW1lc3BhY2VVUkkiLCBuZXcgQ2xhc3NbMF0pOwotCi0gICAgLy8gKHVzZSBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGJ1dCB0aGUgbnVsbCBjYXNlIGlzIGNoZWNrZWQgZm9yIHNpbmNlIGEgbWlzc2luZyB1c2UgaXMgbm90Ci0gICAgLy8gY2hlY2tlZCB3aXRoIHRoaXMgVEEuIElmIGl0cyBtaXNzaW5nIGl0cyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgd2UgaGF2ZSBkb2MtbGl0KS4gICAgIAkJCi0gICAgaWYgKGdldFVzZU1ldGhvZC5pbnZva2UoZXh0RWxlbWVudCwgbnVsbCkgPT0gbnVsbAotICAgICAgfHwgIWdldFVzZU1ldGhvZC5pbnZva2UoZXh0RWxlbWVudCwgbnVsbCkuZXF1YWxzKAotICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIHJldHVybiB0cnVlIGlmIG5hbWVzcGFjZSBmb3VuZAotICAgIGJvb2xlYW4gbmFtZXNwYWNlRm91bmQgPQotICAgICAgKGdldE5hbWVzcGFjZVVSSU1ldGhvZC5pbnZva2UoZXh0RWxlbWVudCwgbnVsbCkgIT0gbnVsbCk7Ci0KLSAgICAvLyByZXR1cm4gdHJ1ZSBpZiBuYW1lc3BhY2UgZm91bmQKLSAgICByZXR1cm4gbmFtZXNwYWNlRm91bmQ7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZnkgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHVzZXMgbGl0ZXJhbC4KLSAgICogQHBhcmFtIGV4dGVuc2libGUgLSBleHRlbnNpYmlsaXR5IGVsZW1lbnQKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSBmb3VuZC4KLSAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIHByb2JsZW1zIG9jY3VyIGluIGFuIGludm9rZWQgbWV0aG9kIG9yIGNvbnN0cnVjdG9yCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbSBhdHRlbXB0IHRvIGxvYWQgYQotICAgKiAgICAgICAgIGNsYXNzIHRoYXQgaXQgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8uCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpdGVyYWwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJsZSkKLSAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0gIHsKLQotICAgIENsYXNzIGMgPSBleHRlbnNpYmxlLmdldENsYXNzKCk7Ci0gICAgTWV0aG9kIGdldFVzZU1ldGhvZCA9IGMuZ2V0TWV0aG9kKCJnZXRVc2UiLCBuZXcgQ2xhc3NbMF0pOwotCi0gICAgLy8gKHVzZSBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5IGJ1dCB0aGUgbnVsbCBjYXNlIGlzIGNoZWNrZWQgZm9yIHNpbmNlIGEgbWlzc2luZyB1c2UgaXMgbm90Ci0gICAgLy8gY2hlY2tlZCB3aXRoIHRoaXMgVEEuIElmIGl0cyBtaXNzaW5nIGl0cyBpbnZhbGlkIGJ1dCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgd2UgaGF2ZSBkb2MtbGl0KS4gICAgIAkJCi0gICAgaWYgKGdldFVzZU1ldGhvZC5pbnZva2UoZXh0ZW5zaWJsZSwgbnVsbCkgPT0gbnVsbAotICAgICAgfHwgIWdldFVzZU1ldGhvZC5pbnZva2UoZXh0ZW5zaWJsZSwgbnVsbCkuZXF1YWxzKAotICAgICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIHJldHVybiB0cnVlIGlmIHNob3duIHRvIGhhdmUgdXNlPSJsaXRlcmFsIgotICAgIHJldHVybiB0cnVlOwotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDEwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzliNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwMTAKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwMTAgZXh0ZW5kcyBCUDIwMTAKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjAxMChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ1ZGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMDExCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMDExIGV4dGVuZHMgQlAyMDExCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIwMTEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDEyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFkOWVmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjAxMgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjAxMiBleHRlbmRzIEJQMjAxMgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDEyKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDEzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjAxY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwMTMKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwMTMgZXh0ZW5kcyBCUDIwMTMKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjAxMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI2YTZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMDE0Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMDE0IGV4dGVuZHMgQlAyMDE0Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIwMTQoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDE3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlOTgyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjAxNwotICovCi1wdWJsaWMgY2xhc3MgV1NJMjAxNyBleHRlbmRzIEJQMjAxNwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDE3KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxOC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDE4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDVlMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDE4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwMTgKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwMTggZXh0ZW5kcyBCUDIwMTgKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjAxOChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMTkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjE5N2YyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAxOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMDE5Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMDE5IGV4dGVuZHMgQlAyMDE5Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIwMTkoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDIwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmMDIwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjAyMAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjAyMCBleHRlbmRzIEJQMjAyMAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDIwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAyMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzN2YxYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwMjEKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwMjEgZXh0ZW5kcyBCUDIwMjEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjAyMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjY5OTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjAyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMDIyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMDIyIGV4dGVuZHMgQlAyMDIyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIwMjIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDMyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwN2FjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwMzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjAzMgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjAzMiBleHRlbmRzIEJQMjAzMgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMDMyKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjA5OC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDk4LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTkwNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMDk4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIwOTgKLSAqLwotcHVibGljIGNsYXNzIFdTSTIwOTggZXh0ZW5kcyBCUDIwOTgKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjA5OChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIwOTkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjA5OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTRiNTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjA5OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLkVudHJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Bc3NlcnRpb25Qcm9jZXNzVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FcnJvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIFdTSTIwOTkuCi0gICAqIDxjb250ZXh0PkZvciBhIGNhbmRpZGF0ZSB3c2RsOmRlZmluaXRpb25zLCA8L2NvbnRleHQ+Ci0gICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5BIFdTLUkgY29uZm9ybWFuY2UgYW5ub3RhdGlvbiBkb2VzIG5vdCBhcHBlYXIgb3V0c2lkZSBhIHdzZGw6cG9ydCwgd3NkbDpiaW5kaW5nLCB3c2RsOnBvcnRUeXBlLCB3c2RsOm9wZXJhdGlvbiwgb3Igd3NkbDptZXNzYWdlIGVsZW1lbnQuPC9hc3NlcnRpb25EZXNjcmlwdGlvbj4KLSAqLwotcHVibGljIGNsYXNzIFdTSTIwOTkgZXh0ZW5kcyBBc3NlcnRpb25Qcm9jZXNzVmlzaXRvciBpbXBsZW1lbnRzIFdTSVRhZwotewotICBwcml2YXRlIGZpbmFsIFdTRExWYWxpZGF0b3JJbXBsIHZhbGlkYXRvcjsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjA5OShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gICAgdGhpcy52YWxpZGF0b3IgPSBpbXBsOwotICB9Ci0KLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNDbGFpbXMgPSBmYWxzZTsKLQotICAvKioKLSAgICogIENoZWNrIGEgV1MtSSBjb25mb3JtYW5jZSBhbm5vdGF0aW9uIGRvZXMgbm90IGFwcGVhciBvdXRzaWRlIGEgd3NkbDpwb3J0LCB3c2RsOmJpbmRpbmcsIHdzZGw6cG9ydFR5cGUsIHdzZGw6b3BlcmF0aW9uLCBvciB3c2RsOm1lc3NhZ2UgZWxlbWVudCBpZiBub3QgaXQgY3JlYXRlcyBmYWlsdXJlIHJlcG9ydC4KLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQob3JnLnczYy5kb20uRWxlbWVudCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEVsZW1lbnQgZWwsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIC8vIGNvbmZvcm1hbmNlIGNsYWltIHNob3VsZCBiZSB3aXRoaW4gOiBwb3J0LCBiaW5kaW5nLCBwb3J0dHlwZSwgb3BlcmF0aW9uLCBtZXNzYWdlCi0gICAgaWYgKGNvbnRhaW5zQ29uZm9ybWFuY2VDbGFpbShlbCkpCi0gICAgewotICAgICAgY29udGFpbnNDbGFpbXMgPSB0cnVlOwotCi0gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ0ZhdWx0KQotICAgICAgICBlcnJvcnMuYWRkKFdTRExfRkFVTFQsICgoQmluZGluZ0ZhdWx0KSBwYXJlbnQpLmdldE5hbWUoKSk7Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCaW5kaW5nSW5wdXQpCi0gICAgICAgIGVycm9ycy5hZGQoV1NETF9JTlBVVCwgKChCaW5kaW5nSW5wdXQpIHBhcmVudCkuZ2V0TmFtZSgpKTsKLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJpbmRpbmdPcGVyYXRpb24pCi0gICAgICAgIGVycm9ycy5hZGQoV1NETF9PUEVSQVRJT04sICgoQmluZGluZ09wZXJhdGlvbikgcGFyZW50KS5nZXROYW1lKCkpOwotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQmluZGluZ091dHB1dCkKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX09VVFBVVCwgKChCaW5kaW5nT3V0cHV0KSBwYXJlbnQpLmdldE5hbWUoKSk7Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBEZWZpbml0aW9uKQotICAgICAgICBlcnJvcnMuYWRkKFdTRExfREVGSU5JVElPTlMsICgoRGVmaW5pdGlvbikgcGFyZW50KS5nZXRRTmFtZSgpKTsKLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNlcnZpY2UpCi0gICAgICAgIGVycm9ycy5hZGQoV1NETF9TRVJWSUNFLCAoKFNlcnZpY2UpIHBhcmVudCkuZ2V0UU5hbWUoKSk7Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGYXVsdCkKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX0ZBVUxULCAoKEZhdWx0KSBwYXJlbnQpLmdldE5hbWUoKSk7Ci0gICAgICBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBPdXRwdXQpCi0gICAgICAgIGVycm9ycy5hZGQoV1NETF9JTlBVVCwgKChPdXRwdXQpIHBhcmVudCkuZ2V0TmFtZSgpKTsKLSAgICAgIGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEltcG9ydCkKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX0lNUE9SVCwgKChJbXBvcnQpIHBhcmVudCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgSW5wdXQpCi0gICAgICAgIGVycm9ycy5hZGQoV1NETF9JTlBVVCwgKChJbnB1dCkgcGFyZW50KS5nZXROYW1lKCkpOwotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgUGFydCkKLSAgICAgICAgZXJyb3JzLmFkZChXU0RMX1BBUlQsICgoUGFydCkgcGFyZW50KS5nZXROYW1lKCkpOwotICAgICAgZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgVHlwZXMpCi0gICAgICAgIGVycm9ycy5hZGQoV1NETF9UWVBFUyk7Ci0gICAgfQotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0RWxlbWVudCh0cnVlKTsKLSAgICAvKgotICAgIHRyYXZlcnNhbC4KLSAgICAJaWdub3JlUG9ydDJFbGVtZW50KCkuCi0gICAgCWlnbm9yZU1lc3NhZ2UyRWxlbWVudCgpLgotICAgIAlpZ25vcmVCaW5kaW5nMkVsZW1lbnQoKS4KLSAgICAJaWdub3JlUG9ydFR5cGUyRWxlbWVudCgpLgotICAgIAlpZ25vcmVPcGVyYXRpb24yRWxlbWVudCgpOwkJCi0gICAgICAqLwotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZGV0YWlsIG1lc3NhZ2Ugd2l0aCB0aGUgbGlzdCBvZiBlcnJvciBlbGVtZW50cwotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFjb250YWluc0NsYWltcykKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZUFzc2VydGlvblJlc3VsdCh0ZXN0QXNzZXJ0aW9uLCByZXN1bHQsIGZhaWx1cmVEZXRhaWwpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQgd2hldGhlciBjb250YWlucyBjb25mb3JtYW5jZSBjbGFpbXMuIAotICAgKiBSZXR1cm5zIHRydWUgaWYgZG9jdW1lbnRhdGlvbiBlbGVtZW50IGNvbnRhaW5zIGNvbmZvcm1hbmNlIGNsYWltLiAKLSAgICogQHBhcmFtIGVsCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zQ29uZm9ybWFuY2VDbGFpbShFbGVtZW50IGVsKQotICB7Ci0gICAgaWYgKGVsID09IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZWwgPSBYTUxVdGlscy5maW5kQ2hpbGRFbGVtZW50KGVsLCBXU0lfQ0xBSU0pOwotICAgIHJldHVybiAoZWwgIT0gbnVsbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTE1NTg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5UZXN0QXNzZXJ0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuQXNzZXJ0aW9uUHJvY2Vzc1Zpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRXJyb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBXU0kyMTAwLgotICAgKiA8Y29udGV4dD5Gb3IgYSBjYW5kaWRhdGUgd3NkbDpkZWZpbml0aW9ucywgaWYgaXQgY29udGFpbnMgYSB3c2RsOnBvcnQsIHdzZGw6YmluZGluZywgd3NkbDpwb3J0VHlwZSwgd3NkbDpvcGVyYXRpb24sIG9yIHdzZGw6bWVzc2FnZSwgd2hpY2ggaW4gdHVybiBjb250YWlucyBhIGNvbmZvcm1hbmNlIGFubm90YXRpb248L2NvbnRleHQ+Ci0gICAqIDxhc3NlcnRpb25EZXNjcmlwdGlvbj5UaGUgY29uZm9ybWFuY2UgYW5ub3RhdGlvbiBvZiB0aGUgd3NkbDpwb3J0LCB3c2RsOmJpbmRpbmcsIHdzZGw6cG9ydFR5cGUsIHdzZGw6b3BlcmF0aW9uLCBvciB3c2RsOm1lc3NhZ2UsIHZhbGlkYXRlcyB0byB0aGUgc2NoZW1hIGRlZmluZWQgaW4gdGhlIEJhc2ljIFByb2ZpbGUsIGFuZCBpcyBkaXJlY3QgY2hpbGQgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCBmb3IgdGhlIFdTREwgZWxlbWVudC4gVGhlIHNjaGVtYSBkZWZpbml0aW9uIHVzZXMgImh0dHA6Ly93cy1pLm9yZy9zY2hlbWFzL2NvbmZvcm1hbmNlQ2xhaW0vIiBhcyB0aGUgdGFyZ2V0TmFtZXNwYWNlLiA8L2Fzc2VydGlvbkRlc2NyaXB0aW9uPgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjEwMCBleHRlbmRzIEFzc2VydGlvblByb2Nlc3NWaXNpdG9yIGltcGxlbWVudHMgV1NJVGFnCi17Ci0gIHByaXZhdGUgZmluYWwgV1NETFZhbGlkYXRvckltcGwgdmFsaWRhdG9yOwotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTAwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgICB0aGlzLnZhbGlkYXRvciA9IGltcGw7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNDbGFpbXMgPSBmYWxzZTsKLSAgcHJpdmF0ZSBFcnJvckxpc3QgZXJyb3JzID0gbmV3IEVycm9yTGlzdCgpOwotCi0gIC8qIENyZWF0ZSBmYWx1cmUgcmVwb3J0IGlmIHBvcnQgY29udGFpbnMgaWxsZWdhbCBjbGFpbS4KLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuUG9ydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnQgcG9ydCwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKHBvcnQgIT0gbnVsbCAmJiAhY29udGFpbnNMZWdhbENsYWltKHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkpCi0gICAgICBlcnJvcnMuYWRkKFdTRExfUE9SVCwgcG9ydC5nZXROYW1lKCkpOwotICB9Ci0KLSAgLyogQ3JlYXRlIGZhbHVyZSByZXBvcnQgaWYgYmluZGluZyBjb250YWlucyBpbGxlZ2FsIGNsYWltLgotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5CaW5kaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZyBiaW5kaW5nLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsCi0gICAgICAmJiAhY29udGFpbnNMZWdhbENsYWltKGJpbmRpbmcuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSkpCi0gICAgICBlcnJvcnMuYWRkKFdTRExfQklORElORywgYmluZGluZy5nZXRRTmFtZSgpKTsKLSAgfQotCi0gIC8qIENyZWF0ZSBmYWx1cmUgcmVwb3J0IGlmIHBvcnQgdHlwZSBjb250YWlucyBpbGxlZ2FsIGNsYWltLgotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoamF2YXgud3NkbC5Qb3J0VHlwZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnRUeXBlIHR5cGUsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmICh0eXBlICE9IG51bGwgJiYgIWNvbnRhaW5zTGVnYWxDbGFpbSh0eXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpKQotICAgICAgZXJyb3JzLmFkZChXU0RMX1BPUlRUWVBFLCB0eXBlLmdldFFOYW1lKCkpOwotICB9Ci0KLSAgLyogQ3JlYXRlIGZhbHVyZSByZXBvcnQgaWYgb3BlcmF0aW9uIGNvbnRhaW5zIGlsbGVnYWwgY2xhaW0uCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk9wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBpZiAob3BlcmF0aW9uICE9IG51bGwKLSAgICAgICYmICFjb250YWluc0xlZ2FsQ2xhaW0ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpKQotICAgICAgZXJyb3JzLmFkZChXU0RMX09QRVJBVElPTiwgb3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gIH0KLQotICAvKiBDcmVhdGUgZmFsdXJlIHJlcG9ydCBpZiBtZXNzYWdlIGNvbnRhaW5zIGlsbGVnYWwgY2xhaW0uCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLk1lc3NhZ2UsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChNZXNzYWdlIG1lc3NhZ2UsIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGlmIChtZXNzYWdlICE9IG51bGwKLSAgICAgICYmICFjb250YWluc0xlZ2FsQ2xhaW0obWVzc2FnZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKSkKLSAgICAgIGVycm9ycy5hZGQoV1NETF9NRVNTQUdFLCBtZXNzYWdlLmdldFFOYW1lKCkpOwotICB9Ci0KLSAgLyogVmFsaWRhdGVzIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSBvcmcud3NpLnRlc3QucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5CYXNlVmFsaWRhdG9ySW1wbC5Bc3NlcnRpb25Qcm9jZXNzI3ZhbGlkYXRlKG9yZy53c2kudGVzdC5wcm9maWxlLlRlc3RBc3NlcnRpb24sIG9yZy53c2kudGVzdC5wcm9maWxlLnZhbGlkYXRvci5FbnRyeUNvbnRleHQpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IHZhbGlkYXRlKAotICAgIFRlc3RBc3NlcnRpb24gdGVzdEFzc2VydGlvbiwKLSAgICBFbnRyeUNvbnRleHQgZW50cnlDb250ZXh0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotCi0gICAgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWwgPSBuZXcgV1NETFRyYXZlcnNhbCgpOwotICAgIC8vVmlzaXRvckFkYXB0b3IuYWRhcHQodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnNldFZpc2l0b3IodGhpcyk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0T3BlcmF0aW9uKHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdEJpbmRpbmcodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0TWVzc2FnZSh0cnVlKTsKLSAgICB0cmF2ZXJzYWwudmlzaXRQb3J0KHRydWUpOwotICAgIHRyYXZlcnNhbC52aXNpdFBvcnRUeXBlKHRydWUpOwotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUltcG9ydCgpOwotICAgIHRyYXZlcnNhbC50cmF2ZXJzZSgoRGVmaW5pdGlvbikgZW50cnlDb250ZXh0LmdldEVudHJ5KCkuZ2V0RW50cnlEZXRhaWwoKSk7Ci0KLSAgICAvLyBjcmVhdGUgZGV0YWlsIG1lc3NhZ2Ugd2l0aCB0aGUgbGlzdCBvZiBlcnJvciBlbGVtZW50cwotICAgIGlmICghZXJyb3JzLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBmYWlsdXJlRGV0YWlsID0gdGhpcy52YWxpZGF0b3IuY3JlYXRlRmFpbHVyZURldGFpbChlcnJvcnMudG9TdHJpbmcoKSwgZW50cnlDb250ZXh0KTsKLSAgICAgIHJlc3VsdCA9IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfRkFJTEVEOwotICAgIH0KLQotICAgIGVsc2UgaWYgKCFjb250YWluc0NsYWltcykKLSAgICB7Ci0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX05PVF9BUFBMSUNBQkxFOwotICAgIH0KLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRDsKLQotICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KHRlc3RBc3NlcnRpb24sIHJlc3VsdCwgZmFpbHVyZURldGFpbCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCB3aGV0aGVyIGNvbnRhaW5zIGNvbmZvcm1hbmNlIGNsYWltcy4KLSAgICogUmV0dXJucyB0cnVlIGlmIGRvY3VtZW50YXRpb24gZWxlbWVudCBjb250YWlucyBjb25mb3JtYW5jZSBjbGFpbSB3aXRoCi0gICAqIGlsbGVnYWwgc2NoZW1hIGRlZmluaXRpb24gVVJJLiAKLSAgICogbGVnYWwgaXMgJ2h0dHA6Ly93cy1pLm9yZy9zY2hlbWFzL2NvbmZvcm1hbmNlQ2xhaW0vJwotICAgKiBAcGFyYW0gZWwKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNMZWdhbENsYWltKEVsZW1lbnQgZWwpCi0gIHsKLSAgICBpZiAoZWwgPT0gbnVsbCkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIC8vIGZpbmQgY2xhaW0KLSAgICBlbCA9IFhNTFV0aWxzLmZpbmRDaGlsZEVsZW1lbnQoZWwsIFdTSV9DTEFJTSk7Ci0KLSAgICBpZiAoZWwgIT0gbnVsbCkKLSAgICAgIGNvbnRhaW5zQ2xhaW1zID0gdHJ1ZTsKLQotICAgIHdoaWxlIChlbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChYTUxVdGlscy5nZXRBdHRyaWJ1dGUoZWwsIEFUVFJfQ0xBSU1fQ09ORk9STVNUTykgPT0gbnVsbAotICAgICAgICB8fCBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoZWwsIEFUVFJfU09BUF9NVVNUVU5ERVJTVEFORCkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgZWwgPSBYTUxVdGlscy5maW5kRWxlbWVudChlbCwgV1NJX0NMQUlNKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGYwOWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTAxCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTAxIGV4dGVuZHMgQlAyMTAxCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMDEoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTAyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2MjdkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjEwMgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjEwMiBleHRlbmRzIEJQMjEwMgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTAyKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwMy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNzVmMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMDMKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMDMgZXh0ZW5kcyBCUDIxMDMKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjEwMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzQyNzc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTA0Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTA0IGV4dGVuZHMgQlAyMTA0Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMDQoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTA1LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiZGRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjEwNQotICovCi1wdWJsaWMgY2xhc3MgV1NJMjEwNSBleHRlbmRzIEJQMjEwNQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTA1KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTA3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTc0MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTA3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMDcKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMDcgZXh0ZW5kcyBCUDIxMDcKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjEwNyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDZiZWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEwOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTA4Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTA4IGV4dGVuZHMgQlAyMTA4Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMDgoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTEwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwY2M0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjExMAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjExMCBleHRlbmRzIEJQMjExMAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTEwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTI4NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMTEKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMTEgZXh0ZW5kcyBCUDIxMTEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjExMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDQwYWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTEyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTEyIGV4dGVuZHMgQlAyMTEyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMTIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTEzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxMTg5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjExMwotICovCi1wdWJsaWMgY2xhc3MgV1NJMjExMyBleHRlbmRzIEJQMjExMwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTEzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExNC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTVhMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMTQKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMTQgZXh0ZW5kcyBCUDIxMTQKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjExNChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTZlZjdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTE1Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTE1IGV4dGVuZHMgQlAyMTE1Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMTUoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzNThlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjExNgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjExNiBleHRlbmRzIEJQMjExNgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTE2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExNy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjM3N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMTcKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMTcgZXh0ZW5kcyBCUDIxMTcKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjExNyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmQzMzA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjExOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTE4Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTE4IGV4dGVuZHMgQlAyMTE4Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMTgoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTE5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxNmNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMTkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjExOQotICovCi1wdWJsaWMgY2xhc3MgV1NJMjExOSBleHRlbmRzIEJQMjExOQotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTE5KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEyMC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMmUyMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIxMjAKLSAqLwotcHVibGljIGNsYXNzIFdTSTIxMjAgZXh0ZW5kcyBCUDIxMjAKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjEyMChXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMjIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEyMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjk5NGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjEyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMTIyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMTIyIGV4dGVuZHMgQlAyMTIyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIxMjIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMTIzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMjMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmMDVhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIxMjMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjEyMwotICovCi1wdWJsaWMgY2xhc3MgV1NJMjEyMyBleHRlbmRzIEJQMjEyMwotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMTIzKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjIwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjQ1N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMjAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTIyMDEKLSAqLwotcHVibGljIGNsYXNzIFdTSTIyMDEgZXh0ZW5kcyBCUDIyMDEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjIwMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIyMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjIwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmI1OWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjIwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyMjAyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyMjAyIGV4dGVuZHMgQlAyMjAyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTIyMDIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyMjA4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIyMDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNzEzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTIyMDguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjIwOAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjIwOCBleHRlbmRzIEJQMjIwOAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyMjA4KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwMi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzU3ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTI0MDIKLSAqLwotcHVibGljIGNsYXNzIFdTSTI0MDIgZXh0ZW5kcyBCUDI0MDIKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjQwMihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFjZDQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyNDAzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyNDAzIGV4dGVuZHMgU1NCUDI0MDMKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjQwMyhXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZhOGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQwNC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyNDA0Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyNDA0IGV4dGVuZHMgQlAyNDA0Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTI0MDQoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDA2LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkNDIwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MDYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjQwNgotICovCi1wdWJsaWMgY2xhc3MgV1NJMjQwNiBleHRlbmRzIEJQMjQwNgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyNDA2KFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQxNi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MGJmM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNDE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTI0MTYKLSAqLwotcHVibGljIGNsYXNzIFdTSTI0MTYgZXh0ZW5kcyBCUDI0MTYKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjQxNihXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI0MTcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQxNy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzIzODM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjQxNy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyNDE3Ci0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyNDE3IGV4dGVuZHMgQlAyNDE3Ci17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTI0MTcoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNzAwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI3MDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliYmIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI3MDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJMjcwMAotICovCi1wdWJsaWMgY2xhc3MgV1NJMjcwMCBleHRlbmRzIEJQMjcwMAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0kyNzAwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjcwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNzAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMzdmNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0kyNzAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTI3MDEKLSAqLwotcHVibGljIGNsYXNzIFdTSTI3MDEgZXh0ZW5kcyBCUDI3MDEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJMjcwMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTI3MDMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjcwMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDYzNzA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJMjcwMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0kyNzAzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0kyNzAzIGV4dGVuZHMgQlAyNzAzCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTI3MDMoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0k0MjAwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTQyMDAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0M2E3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTQyMDAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5pbXBsLndzZGw7Ci0KLS8qKgotICogV1NJNDIwMAotICovCi1wdWJsaWMgY2xhc3MgV1NJNDIwMCBleHRlbmRzIEJQNDIwMAotewotCi0gIC8qKgotICAgKiBAcGFyYW0gV1NETFZhbGlkYXRvckltcGwKLSAgICovCi0gIHB1YmxpYyBXU0k0MjAwKFdTRExWYWxpZGF0b3JJbXBsIGltcGwpCi0gIHsKLSAgICBzdXBlcihpbXBsKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJNDIwMS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0k0MjAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjMzZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Byb2ZpbGUvdmFsaWRhdG9yL2ltcGwvd3NkbC9XU0k0MjAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC53c2RsOwotCi0vKioKLSAqIFdTSTQyMDEKLSAqLwotcHVibGljIGNsYXNzIFdTSTQyMDEgZXh0ZW5kcyBCUDQyMDEKLXsKLQotICAvKioKLSAgICogQHBhcmFtIFdTRExWYWxpZGF0b3JJbXBsCi0gICAqLwotICBwdWJsaWMgV1NJNDIwMShXU0RMVmFsaWRhdG9ySW1wbCBpbXBsKQotICB7Ci0gICAgc3VwZXIoaW1wbCk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcHJvZmlsZS92YWxpZGF0b3IvaW1wbC93c2RsL1dTSTQyMDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJNDIwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ5YmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9wcm9maWxlL3ZhbGlkYXRvci9pbXBsL3dzZGwvV1NJNDIwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwud3NkbDsKLQotLyoqCi0gKiBXU0k0MjAyCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0k0MjAyIGV4dGVuZHMgQlA0MjAyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBXU0RMVmFsaWRhdG9ySW1wbAotICAgKi8KLSAgcHVibGljIFdTSTQyMDIoV1NETFZhbGlkYXRvckltcGwgaW1wbCkKLSAgewotICAgIHN1cGVyKGltcGwpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9BcnRpZmFjdFJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9BcnRpZmFjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTg5OWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvQXJ0aWZhY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotCi0vKioKLSAqIEFuIGFydGlmYWN0IHJlZmVyZW5jZS4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdFJlZmVyZW5jZSBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fQVJUSUZBQ1RfUkVGRVJFTkNFOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9SRVBPUlQsIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aW1lc3RhbXAuCi0gICAqIEByZXR1cm4gdGltZXN0YW1wLgotICAgKiBAc2VlICNzZXRUaW1lc3RhbXAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGltZXN0YW1wKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB0aW1lc3RhbXAuCi0gICAqIEBwYXJhbSB0aW1lc3RhbXAgYSB0aW1lc3RhbXAuCi0gICAqIEBzZWUgI2dldFRpbWVzdGFtcAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKFN0cmluZyB0aW1lc3RhbXApOwotCi0gIC8qKgotICAgKiBHZXQgZG9jdW1lbnQgZWxlbWVudC4KLSAgICogQHJldHVybiBkb2N1bWVudCBlbGVtZW50LgotICAgKiBAc2VlICNzZXREb2N1bWVudEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEVsZW1lbnQgZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBkb2N1bWVudCBlbGVtZW50LgotICAgKiBAcGFyYW0gZG9jdW1lbnRFbGVtZW50IGRvY3VtZW50IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lICAgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHNlZSAjZ2V0RG9jdW1lbnRFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEVsZW1lbnQoCi0gICAgRG9jdW1lbnRFbGVtZW50IGRvY3VtZW50RWxlbWVudCwKLSAgICBTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0Fzc2VydGlvblJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9Bc3NlcnRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUxMTNlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0Fzc2VydGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLQotLyoqCi0gKiBUZXN0IGFzc2VydGlvbiByZXN1bHQuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc2VydGlvblJlc3VsdCBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fQVNTRVJUSU9OX1JFU1VMVDsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfUkVQT1JULCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBSZXN1bHQgdmFsdWVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX1BBU1NFRCA9ICJwYXNzZWQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfRkFJTEVEID0gImZhaWxlZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9QUkVSRVFfRkFJTEVEID0gInByZXJlcUZhaWxlZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9NSVNTSU5HX0lOUFVUID0gIm1pc3NpbmdJbnB1dCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9XQVJOSU5HID0gIndhcm5pbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfTk9UX0FQUExJQ0FCTEUgPSAibm90QXBwbGljYWJsZSI7Ci0KLSAgLyoqCi0gICAqIEdldCByZXN1bHQuCi0gICAqIEByZXR1cm4gcmVzdWx0LgotICAgKiBAc2VlICNzZXRSZXN1bHQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCByZXN1bHQuCi0gICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCB2YWx1ZS4KLSAgICogQHNlZSAjZ2V0UmVzdWx0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoU3RyaW5nIHJlc3VsdCk7Ci0KLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24uCi0gICAqIEByZXR1cm4gcHJvZmlsZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSAjc2V0QXNzZXJ0aW9uCi0gICAqLwotICBwdWJsaWMgVGVzdEFzc2VydGlvbiBnZXRBc3NlcnRpb24oKTsKLQotICAvKioKLSAgICogU2V0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIHByb2ZpbGVBc3NlcnRpb24gcHJvZmlsZSB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHNlZSAjZ2V0QXNzZXJ0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb24oVGVzdEFzc2VydGlvbiBwcm9maWxlQXNzZXJ0aW9uKTsKLQotICAvKioKLSAgICogR2V0IGVudHJ5LgotICAgKiBAcmV0dXJuIGVudHJ5LgotICAgKiBAc2VlICNzZXRFbnRyeQotICAgKi8KLSAgcHVibGljIEVudHJ5IGdldEVudHJ5KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBlbnRyeS4KLSAgICogQHBhcmFtIGVudHJ5IGFuIGVudHJ5LgotICAgKiBAc2VlICNnZXRFbnRyeQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW50cnkoRW50cnkgZW50cnkpOwotCi0gIC8qKgotICAgKiBHZXQgZmFpbHVyZSBkZXRhaWwgbWVzc2FnZXMuCi0gICAqIEByZXR1cm4gZmFpbHVyZSBkZXRhaWwgbWVzc2FnZXMuCi0gICAqIEBzZWUgI3NldEZhaWx1cmVEZXRhaWxMaXN0Ci0gICAqLwotICBwdWJsaWMgVmVjdG9yIGdldEZhaWx1cmVEZXRhaWxMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBmYWlsdXJlIGRldGFpbCBtZXNzYWdlcy4KLSAgICogQHBhcmFtIGZhaWx1cmVEZXRhaWxMaXN0IGZhaWx1cmUgZGV0YWlsIG1lc3NhZ2VzLgotICAgKiBAc2VlICNnZXRGYWlsdXJlRGV0YWlsTGlzdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmFpbHVyZURldGFpbExpc3QoVmVjdG9yIGZhaWx1cmVEZXRhaWxMaXN0KTsKLQotICAvKioKLSAgICogR2V0IHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqIEByZXR1cm4gd2FybmluZyBtZXNzYWdlcy4KLSAgICogQHNlZSAjc2V0V2FybmluZ01lc3NhZ2VzCi0gICAqLwotICAvL3B1YmxpYyBWZWN0b3IgZ2V0V2FybmluZ01lc3NhZ2VzKCk7Ci0KLSAgLyoqCi0gICAqIFNldCB3YXJuaW5nIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gd2FybmluZ01lc3NhZ2VzIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAqIEBzZWUgI2dldFdhcm5pbmdNZXNzYWdlcwotICAgKi8KLSAgLy9wdWJsaWMgdm9pZCBzZXRXYXJuaW5nTWVzc2FnZXMoVmVjdG9yIHdhcm5pbmdNZXNzYWdlcyk7Ci0KLSAgLyoqCi0gICAqIEdldCBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqIEByZXR1cm4gc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqIEBzZWUgI3NldEFzc2VydGlvblJlc3VsdHNPcHRpb24KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKTsKLQotICAvKioKLSAgICogU2V0IGFzc2VydGlvbiByZXN1bHRzIG9wdGlvbi4KLSAgICogQHBhcmFtIGFzc2VydGlvblJlc3VsdHNPcHRpb24gYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKiBAc2VlICNnZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKEFzc2VydGlvblJlc3VsdHNPcHRpb24gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbik7Ci0KLSAgLyoqCi0gICAqIEdldCBwcmVyZXEgZmFpbGVkIGxpc3QuCi0gICAqIEByZXR1cm4gcHJlcmVxIGZhaWxlZCBsaXN0LgotICAgKiBAc2VlICNzZXRQcmVyZXFGYWlsZWRMaXN0Ci0gICAqLwotICBwdWJsaWMgUHJlcmVxRmFpbGVkTGlzdCBnZXRQcmVyZXFGYWlsZWRMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIFNldCBwcmVyZXEgZmFpbGVkIGxpc3QuCi0gICAqIEBwYXJhbSBwcmVyZXFGYWlsZWRMaXN0IHByZXJlcSBmYWlsZWQgbGlzdC4KLSAgICogQHNlZSAjZ2V0UHJlcmVxRmFpbGVkTGlzdAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJlcmVxRmFpbGVkTGlzdChQcmVyZXFGYWlsZWRMaXN0IHByZXJlcUZhaWxlZExpc3QpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9CdWlsZFJlcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9CdWlsZFJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWRiYzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvQnVpbGRSZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBQcm9maWxlIHJlcG9ydC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJ1aWxkUmVwb3J0Ci17Ci0gIC8qKgotICAgKiBQcmVyZXEgdHlwZSAtIGVudHJ5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFUkVRX1RZUEVfRU5UUlkgPSAiZW50cnkiOwotCi0gIC8qKgotICAgKiBQcmVyZXEgdHlwZSAtIGVudHJ5IGNvbnRhaW5lci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVJFUV9UWVBFX0VOVFJZX0NPTlRBSU5FUiA9ICJlbnRyeUNvbnRhaW5lciI7Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGN1cnJlbnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSByZXBvcnRBcnRpZmFjdCBjdXJyZW50IHJlcG9ydCBhcnRpZmFjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gdGhlIGJhc2UgV1MtSSBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50QXJ0aWZhY3QoUmVwb3J0QXJ0aWZhY3QgcmVwb3J0QXJ0aWZhY3QpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogQWRkIGFydGlmYWN0IHJlZmVyZXJlbmNlLgotICAgKiBAcGFyYW0gYXJ0aWZhY3RSZWZlcmVuY2UgYXJ0aWZhY3QgcmVmZXJlbmNlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFydGlmYWN0UmVmZXJlbmNlKEFydGlmYWN0UmVmZXJlbmNlIGFydGlmYWN0UmVmZXJlbmNlKQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEVuZCBjdXJyZW50IGFydGlmYWN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEN1cnJlbnRBcnRpZmFjdCgpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGN1cnJlbnQgZW50cnkuCi0gICAqIEBwYXJhbSBlbnRyeSB0aGUgY3VycmVudCBlbnRyeS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gdGhlIGJhc2UgV1MtSSBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RW50cnkoRW50cnkgZW50cnkpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFN0YXJ0IGN1cnJlbnQgZW50cnkuCi0gICAqIEBwYXJhbSBlbnRyeSB0aGUgY3VycmVudCBlbnRyeS4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gdGhlIGJhc2UgV1MtSSBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RW52ZWxvcGVFbnRyeShFbnRyeSBlbnRyeSkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLSAgLyoqCi0gICAqIEVuZCBjdXJyZW50IGVudHJ5LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEN1cnJlbnRFbnRyeSgpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEFkZCB0ZXN0IGFzc2VydGlvbiByZXN1bHQuCi0gICAqIEBwYXJhbSBhc3NlcnRpb25SZXN1bHQgdGVzdCBhc3NlcnRpb24gcmVzdWx0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiB0aGUgYmFzZSBXUy1JIGV4Y2VwdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFzc2VydGlvblJlc3VsdChBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBmb3IgYSBzcGVjaWZpYyB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIGFzc2VydGlvbklkIHRoZSB0ZXN0IGFzc2VydGlvbiBJRC4KLSAgICogQHJldHVybiAgdGhlIGFzc2VydGlvbiByZXN1bHQgZm9yIHRoZSBzcGVjaWZpZWQgdGVzdCBhc3NlcnRpb24gSUQuCi0gICAqICAgICAgICAgIElmIGFuIGFzc2VydGlvbiByZXN1bHQgd2FzIG5vdCBmb3VuZCwgdGhlbiBudWxsIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBnZXRBc3NlcnRpb25SZXN1bHQoU3RyaW5nIGFzc2VydGlvbklkKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGFzc2VydGlvbiByZXN1bHQuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBhc3NlcnRpb24gcmVzdWx0LgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBjcmVhdGVBc3NlcnRpb25SZXN1bHQoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5LgotICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgZW50cnkuCi0gICAqLwotICBwdWJsaWMgRW50cnkgY3JlYXRlRW50cnkoKTsKLQotICAvKioKLSAgICogQ3JlYXRlIGVudHJ5IGNvbnRhaW5lci4KLSAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIGVudHJ5IGNvbnRhaW5lci4KLSAgICovCi0gIHB1YmxpYyBFbnRyeUNvbnRhaW5lciBjcmVhdGVFbnRyeUNvbnRhaW5lcigpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYXJ0aWZhY3QuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyBSZXBvcnRBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgZmFpbHVyZSBkZXRhaWwuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBmYWlsdXJlIGRldGFpbC4KLSAgICovCi0gIHB1YmxpYyBGYWlsdXJlRGV0YWlsIGNyZWF0ZUZhaWx1cmVEZXRhaWwoKTsKLQotICAvKioKLSAgICogU2V0IHR5cGUgb2YgcHJlcmVxIHByb2Nlc3NpbmcgLSBlaXRoZXIgZW50cnkgb3IgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBwcmVyZXFUeXBlIHR5cGUgb2YgcHJlcmVxIHByb2Nlc3NpbmcgLSBlaXRoZXIgZW50cnkgb3IgZG9jdW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcmVyZXFUeXBlKFN0cmluZyBwcmVyZXFUeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljZDg5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuRW50cnlUeXBlOwotCi0vKioKLSAqIFRlc3QgYXNzZXJ0aW9uIHRhcmdldC4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW50cnkgZXh0ZW5kcyBFbnRyeVJlc3VsdCwgRG9jdW1lbnRFbGVtZW50Ci17Ci0gIC8qKgotICAgKiBFbGVtZW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9FTlRSWTsKLQotICAvKioKLSAgICogUU5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFFOYW1lIFFOQU1FID0KLSAgICBuZXcgUU5hbWUoV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfUkVQT1JULCBFTEVNX05BTUUpOwotCi0gIC8qKgotICAgKiBHZXQgYXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKi8KLSAgLy9wdWJsaWMgQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBnZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBhc3NlcnRpb24gcmVzdWx0cyBvcHRpb24uCi0gICAqLwotICAvL3B1YmxpYyB2b2lkIHNldEFzc2VydGlvblJlc3VsdHNPcHRpb24oQXNzZXJ0aW9uUmVzdWx0c09wdGlvbiBhc3NlcnRpb25SZXN1bHRzT3B0aW9uKTsKLQotICAvKioKLSAgICogR2V0IGVudHJ5IHR5cGUuCi0gICAqIEByZXR1cm4gZW50cnkgdHlwZS4KLSAgICogQHNlZSAjc2V0RW50cnlUeXBlCi0gICAqLwotICBwdWJsaWMgRW50cnlUeXBlIGdldEVudHJ5VHlwZSgpOwotCi0gIC8qKgotICAgKiBTZXQgZW50cnkgdHlwZS4KLSAgICogQHBhcmFtIGVudHJ5VHlwZSBlbnRyeSB0eXBlLgotICAgKiBAc2VlICNnZXRFbnRyeVR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShFbnRyeVR5cGUgZW50cnlUeXBlKTsKLQotICAvKioKLSAgICogR2V0IGFydGlmYWN0IG5hbWUuCi0gICAqIEByZXR1cm4gYXJ0aWZhY3QgbmFtZS4KLSAgICogQHNlZSAjc2V0QXJ0aWZhY3ROYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0TmFtZSgpOwotCi0gIC8qKgotICAgKiBTZXQgYXJ0aWZhY3QgbmFtZS4KLSAgICogQHBhcmFtIGFydGlmYWN0TmFtZSBhcnRpZmFjdCBuYW1lLgotICAgKiBAc2VlICNnZXRBcnRpZmFjdE5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFydGlmYWN0TmFtZShTdHJpbmcgYXJ0aWZhY3ROYW1lKTsKLQotICAvKioKLSAgICogR2V0IHJlZmVyZW5jZSBJRC4KLSAgICogQHJldHVybiByZWZlcmVuY2UgSUQuCi0gICAqIEBzZWUgI3NldFJlZmVyZW5jZUlECi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZUlEKCk7Ci0KLSAgLyoqCi0gICAqIFNldCByZWZlcmVuY2UgSUQuCi0gICAqIEBwYXJhbSByZWZlcmVuY2VJRCByZWZlcmVuY2VJRC4KLSAgICogQHNlZSAjZ2V0UmVmZXJlbmNlSUQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZUlEKFN0cmluZyByZWZlcmVuY2VJRCk7Ci0KLSAgLyoqCi0gICAqIEdldCBwYXJlbnQgZWxlbWVudCBuYW1lLgotICAgKiBAcmV0dXJuIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBzZWUgI3NldFBhcmVudEVsZW1lbnROYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudEVsZW1lbnROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBwYXJlbnQgZWxlbWVudCBuYW1lLgotICAgKiBAcGFyYW0gcGFyZW50RWxlbWVudE5hbWUgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHNlZSAjZ2V0UGFyZW50RWxlbWVudE5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFBhcmVudEVsZW1lbnROYW1lKFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBlbnRyeSBkZXRhaWwuCi0gICAqIEByZXR1cm4gZW50cnkgZGV0YWlsLgotICAgKiBAc2VlICNzZXRFbnRyeURldGFpbAotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRFbnRyeURldGFpbCgpOwotCi0gIC8qKgotICAgKiBTZXQgZW50cnkgZGV0YWlsLgotICAgKiBAcGFyYW0gZGV0YWlsIGVudHJ5IGRldGFpbC4KLSAgICogQHNlZSAjZ2V0RW50cnlEZXRhaWwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5RGV0YWlsKE9iamVjdCBkZXRhaWwpOwotCi0gIC8qKgotICAgKiBHZXQgZW50cnkgY29udGFpbmVyLgotICAgKiBAcmV0dXJuIGVudHJ5IGNvbnRhaW5lci4KLSAgICogQHNlZSAjc2V0RW50cnlDb250YWluZXIKLSAgICovCi0gIHB1YmxpYyBFbnRyeUNvbnRhaW5lciBnZXRFbnRyeUNvbnRhaW5lcigpOwotCi0gIC8qKgotICAgKiBTZXQgZW50cnkgY29udGFpbmVyLgotICAgKiBAcGFyYW0gZW50cnlDb250YWluZXIgZW50cnkgY29udGFpbmVyLgotICAgKiBAc2VlICNnZXRFbnRyeUNvbnRhaW5lcgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW50cnlDb250YWluZXIoRW50cnlDb250YWluZXIgZW50cnlDb250YWluZXIpOwotCi0gIC8qKgotICAgKiBHZXQgc3RhcnQgZWxlbWVudCBzdHJpbmcuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lIG5hbWVzcGFjZSBwcmVmaXguCi0gICAqIEBwYXJhbSBzaG93TG9nRW50cnkgc2hvdyBsb2cgZW50cnkgb3B0aW9uLgotICAgKiBAcmV0dXJuIHN0YXJ0IFhNTCBlbGVtZW50IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUsIGJvb2xlYW4gc2hvd0xvZ0VudHJ5KTsKLQotICAvKioKLSAgICogR2V0IHN0YXJ0IGVsZW1lbnQgc3RyaW5nLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcGFyYW0gc2hvd0xvZ0VudHJ5IHNob3cgbG9nIGVudHJ5IG9wdGlvbi4KLSAgICogQHJldHVybiBzdGFydCBYTUwgZWxlbWVudCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0WE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lLCBib29sZWFuIHNob3dMb2dFbnRyeSwgYm9vbGVhbiBlbnZlbG9wZUFydGlmYWN0VHlwZSk7Ci0gIC8qKgotICAgKiBHZXQgZW5kIGVsZW1lbnQgc3RyaW5nLgotICAgKiBAcGFyYW0gbmFtZXNwYWNlTmFtZSBuYW1lc3BhY2UgcHJlZml4LgotICAgKiBAcmV0dXJuIGVuZCBYTUwgZWxlbWVudCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuZFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0VudHJ5Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0VudHJ5Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTFlMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9FbnRyeUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjb250YWluZXIgd2hpY2ggaGFzIG9uZSBvciBtb3JlIGVudHJpZXMuCi0gKiBGb3IgZXhhbXBsZSwgYSBXU0RMIGRvY3VtZW50IGNvbnRhaW5zIG9uZSBvciBtb3JlIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudHJ5Q29udGFpbmVyIGV4dGVuZHMgRW50cnlSZXN1bHQKLXsKLSAgLyoqCi0gICAqIEdldCBjb250YWluZXIgaWQuCi0gICAqIEByZXR1cm4gY29udGFpbmVyIGlkLgotICAgKiBAc2VlICNzZXRJZAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRJZCgpOwotCi0gIC8qKgotICAgKiBTZXQgY29udGFpbmVyIGlkLgotICAgKiBAcGFyYW0gaWQgY29udGFpbmVyIGlkLgotICAgKiBAc2VlICNnZXRJZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRW50cnlSZXN1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRW50cnlSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhNGY1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L0VudHJ5UmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLS8qKgotICogUmVzdWx0IGZvciBhIHNwZWNpZmljIHRlc3QgYXNzZXJ0aW9uLgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudHJ5UmVzdWx0Ci17Ci0gIC8qKgotICAgKiBBZGQgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICogQHBhcmFtIGFzc2VydGlvblJlc3VsdCBhc3NlcnRpb24gcmVzdWx0LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXNzZXJ0aW9uUmVzdWx0KEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQpOwotCi0gIC8qKgotICAgKiBHZXQgYXNzZXJ0aW9uIHJlc3VsdHMuCi0gICAqIEByZXR1cm4gYXNzZXJ0aW9uIHJlc3VsdHMuCi0gICAqLwotICBwdWJsaWMgVHJlZU1hcCBnZXRBc3NlcnRpb25SZXN1bHRMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYXNzZXJ0aW9uIHJlc3VsdCBmb3IgYSBzcGVjaWZpYyB0ZXN0IGFzc2VydGlvbi4KLSAgICogQHBhcmFtIGFzc2VydGlvbklkIHRlc3QgYXNzZXJ0aW9uIGlkLgotICAgKiBAcmV0dXJuIHRoZSBhc3NlcnRpb24gcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIHRlc3QgYXNzZXJ0aW9uIElELgotICAgKiAgICAgICAgIElmIGFuIGFzc2VydGlvbiByZXN1bHQgd2FzIG5vdCBmb3VuZCwgdGhlbiBudWxsIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBnZXRBc3NlcnRpb25SZXN1bHQoU3RyaW5nIGFzc2VydGlvbklkKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvRmFpbHVyZURldGFpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9GYWlsdXJlRGV0YWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOGFjYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9GYWlsdXJlRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LkRvY3VtZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5FbGVtZW50TG9jYXRpb247Ci0KLS8qKgotICogRmFpbHVyZSBkZXRhaWwuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmFpbHVyZURldGFpbCBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fRkFJTFVSRV9ERVRBSUw7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVCwgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IGZhaWx1cmUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gZmFpbHVyZSBkZXRhaWwgbWVzc2FnZS4KLSAgICogQHNlZSAjc2V0RmFpbHVyZU1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmFpbHVyZU1lc3NhZ2UoKTsKLQotICAvKioKLSAgICogU2V0IGZhaWx1cmUgZGV0YWlsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmYWlsdXJlTWVzc2FnZSBmYWlsdXJlIGRldGFpbCBtZXNzYWdlLgotICAgKiBAc2VlICNnZXRGYWlsdXJlTWVzc2FnZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmFpbHVyZU1lc3NhZ2UoU3RyaW5nIGZhaWx1cmVNZXNzYWdlKTsKLQotICAvKioKLSAgICogR2V0IHJlZmVyZW5jZSB0eXBlLgotICAgKiBAcmV0dXJuIHJlZmVyZW5jZSB0eXBlLgotICAgKiBAc2VlICNzZXRSZWZlcmVuY2VUeXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZVR5cGUoKTsKLQotICAvKioKLSAgICogU2V0IHJlZmVyZW5jZSB0eXBlLgotICAgKiBAcGFyYW0gcmVmZXJlbmNlVHlwZSByZWZlcmVuY2UgdHlwZS4KLSAgICogQHNlZSAjZ2V0UmVmZXJlbmNlVHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVHlwZShTdHJpbmcgcmVmZXJlbmNlVHlwZSk7Ci0KLSAgLyoqCi0gICAqIEdldCByZWZlcmVuY2UgSUQuCi0gICAqIEByZXR1cm4gcmVmZXJlbmNlIElELgotICAgKiBAc2VlICNzZXRSZWZlcmVuY2VJRG4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlSUQoKTsKLQotICAvKioKLSAgICogU2V0IHJlZmVyZW5jZSBJRC4KLSAgICogQHBhcmFtIHJlZmVyZW5jZUlEIHJlZmVyZW5jZSBJRC4KLSAgICogQHNlZSAjZ2V0UmVmZXJlbmNlSUQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZUlEbihTdHJpbmcgcmVmZXJlbmNlSUQpOwotCi0gIC8qKgotICAgKiBHZXQgZWxlbWVudCBsb2NhdGlvbi4KLSAgICogQHJldHVybiBlbGVtZW50IGxvY2F0aW9uLgotICAgKiBAc2VlICNzZXRFbGVtZW50TG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBFbGVtZW50TG9jYXRpb24gZ2V0RWxlbWVudExvY2F0aW9uKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBlbGVtZW50IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gZWxlbWVudExvY2F0aW9uIGVsZW1lbnQgbG9jYXRpb24uCi0gICAqIEBzZWUgI2dldEVsZW1lbnRMb2NhdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudExvY2F0aW9uKEVsZW1lbnRMb2NhdGlvbiBlbGVtZW50TG9jYXRpb24pOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1ByZXJlcUZhaWxlZExpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUHJlcmVxRmFpbGVkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTA1OWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUHJlcmVxRmFpbGVkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBtYWludGFpbiBhbmQgYWNjZXNzIHRoZSBQcmVyZXF1aXNpdGUgRmFpbGVkIExpc3QuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJlcmVxRmFpbGVkTGlzdCBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICAqIEVsZW1lbnQgbmFtZS4KLSAgICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX05BTUUgPSBXU0lDb25zdGFudHMuRUxFTV9QUkVSRVFfRkFJTEVEX0xJU1Q7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVCwgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogQWRkIHRlc3QgYXNzZXJ0aW9uIElELgotICAgKiBAcGFyYW0gYXNzZXJ0aW9uSUQgdGVzdCBhc3NlcnRpb24gSUQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRUZXN0QXNzZXJ0aW9uSUQoU3RyaW5nIGFzc2VydGlvbklEKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMGFkNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuV1NJRG9jdW1lbnQ7Ci0KLS8qKgotICogQ29uZm9ybWFuY2UgdGVzdCByZXBvcnQuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9ydCBleHRlbmRzIFdTSURvY3VtZW50LCBCdWlsZFJlcG9ydAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fUkVQT1JUOwotCi0gIC8qKgotICAgKiBRTmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUU5hbWUgUU5BTUUgPQotICAgIG5ldyBRTmFtZShXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9SRVBPUlQsIEVMRU1fTkFNRSk7Ci0KLSAgLyoqCi0gICAqIEdldCByZXBvcnQgY29udGV4dC4KLSAgICogQHJldHVybiByZXBvcnQgY29udGV4dC4KLSAgICogQHNlZSAjc2V0UmVwb3J0Q29udGV4dAotICAgKi8KLSAgcHVibGljIFJlcG9ydENvbnRleHQgZ2V0UmVwb3J0Q29udGV4dCgpOwotCi0gIC8qKgotICAgKiBTZXQgcmVwb3J0IGNvbnRleHQuCi0gICAqIEBwYXJhbSByZXBvcnRDb250ZXh0IHJlcG9ydCBjb250ZXh0LgotICAgKiBAc2VlICNnZXRSZXBvcnRDb250ZXh0Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRDb250ZXh0KFJlcG9ydENvbnRleHQgcmVwb3J0Q29udGV4dCk7Ci0KLSAgLyoqCi0gICAqIEdldCBjdXJyZW50IGFydGlmYWN0LgotICAgKiBAcmV0dXJuIGN1cnJlbnQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgUmVwb3J0QXJ0aWZhY3QgZ2V0Q3VycmVudEFydGlmYWN0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCBjdXJyZW50IGVudHJ5LgotICAgKiBAcmV0dXJuIGN1cnJlbnQgZW50cnkuCi0gICAqLwotICBwdWJsaWMgRW50cnkgZ2V0Q3VycmVudEVudHJ5KCk7Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRFbnRyaWVzLgotICAgKiBAcmV0dXJuIGVudHJ5IGxpc3QuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRFbnRyaWVzKCk7Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRBcnRpZmFjdHMuCi0gICAqIEByZXR1cm4gYXJ0aWZhY3RzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QXJ0aWZhY3RzKCk7Ci0KLSAgLyoqCi0gICAqIEdldCBzdGFydCBlbGVtZW50IHN0cmluZy4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgbmFtZXNwYWNlIHByZWZpeAotICAgKiBAcmV0dXJuIHN0YXJ0IGVsZW1lbnQgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdGFydFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci0KLSAgLyoqCi0gICAqIEdldCBlbmQgZWxlbWVudCBzdHJpbmcuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lIG5hbWVzcGFjZSBwcmVmaXgKLSAgICogQHJldHVybiBlbmQgZWxlbWVudCBzdHJpbmcuIAotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpOwotCi0gIC8qKgotICAgKiBHZXQgZXJyb3IgWE1MIHN0cmluZy4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHBhcmFtIGVycm9yRGV0YWlsIGFuIGVycm9yIGRldGFpbC4KLSAgICogQHJldHVybiBlcnJvciBYTUwgc3RyaW5nLiAKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBlcnJvckRldGFpbCk7Ci0KLSAgLyoqCi0gICAqIEdldCBzdW1tYXJ5IHJlc3VsdC4gCi0gICAqIEByZXR1cm4gc3VtbWFyeSByZXN1bHQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnlSZXN1bHQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRBcnRpZmFjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRBcnRpZmFjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTFmYjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0QXJ0aWZhY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuQXJ0aWZhY3RUeXBlOwotCi0vKioKLSAqIFJlcG9ydCBhcnRpZmFjdC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvcnRBcnRpZmFjdCBleHRlbmRzIERvY3VtZW50RWxlbWVudAotewotICAvKioKLSAgICogRWxlbWVudCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9OQU1FID0gV1NJQ29uc3RhbnRzLkVMRU1fQVJUSUZBQ1Q7Ci0KLSAgLyoqCi0gICAqIFFOYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBRTmFtZSBRTkFNRSA9Ci0gICAgbmV3IFFOYW1lKFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVCwgRUxFTV9OQU1FKTsKLQotICAvKioKLSAgICogR2V0IGFydGlmYWN0IHR5cGUuCi0gICAqIEByZXR1cm4gYXJ0aWZhY3QgdHlwZS4KLSAgICogQHNlZSAjc2V0VHlwZQotICAgKi8KLSAgcHVibGljIEFydGlmYWN0VHlwZSBnZXRUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIFNldCBhcnRpZmFjdCB0eXBlLgotICAgKiBAcGFyYW0gYXJ0aWZhY3RUeXBlIGFydGlmYWN0IHR5cGUuCi0gICAqIEBzZWUgI2dldFR5cGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFR5cGUoQXJ0aWZhY3RUeXBlIGFydGlmYWN0VHlwZSk7Ci0KLSAgLyoqCi0gICAqIEFkZCBlbnRyeS4KLSAgICogQHBhcmFtIGVudHJ5IGFuIGVudHJ5LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRW50cnkoRW50cnkgZW50cnkpOwotCi0gIC8qKgotICAgKiBHZXQgZW50cnkgbGlzdC4KLSAgICogQHJldHVybiBlbnRyeSBsaXN0LgotICAgKi8KLSAgcHVibGljIFRyZWVNYXAgZ2V0RW50cnlMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCBzdGFydCBlbGVtZW50IHN0cmluZy4KLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHJldHVybiBzdGFydCBlbGVtZW50IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpOwotCi0gIC8qKgotICAgKiBHZXQgZW5kIGVsZW1lbnQgc3RyaW5nLiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZU5hbWUgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHJldHVybiBlbmQgZWxlbWVudCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuZFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1JlcG9ydENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjUwN2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5BbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS5Qcm9maWxlQXNzZXJ0aW9uczsKLQotLyoqCi0gKiBSZXBvcnQgY29udGV4dC4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRDb250ZXh0Ci17Ci0gIC8qKgotICAgKiBSZXBvcnQgdGl0bGUuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlcG9ydFRpdGxlID0gV1NJQ29uc3RhbnRzLkRFRkFVTFRfUkVQT1JUX1RJVExFOwotCi0gIC8qKgotICAgKiBQcm9maWxlIGRlZmluaXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgUHJvZmlsZUFzc2VydGlvbnMgcHJvZmlsZUFzc2VydGlvbnM7Ci0KLSAgLyoqCi0gICAqIEFuYWx5emVyLgotICAgKi8KLSAgcHJvdGVjdGVkIEFuYWx5emVyIGFuYWx5emVyOwotCi0gIC8qKgotICAgKiBDcmVhdGUgcmVwb3J0IGNvbnRleHQuCi0gICAqIEBwYXJhbSByZXBvcnRUaXRsZSByZXBvcnQgdGl0bGUuCi0gICAqIEBwYXJhbSBwcm9maWxlQXNzZXJ0aW9ucyBwcm9maWxlIHRlc3QgYXNzZXJ0aW9ucy4KLSAgICogQHBhcmFtIGFuYWx5emVyIGFuIEFuYWx5emVyIG9iamVjdC4KLSAgKi8KLSAgcHVibGljIFJlcG9ydENvbnRleHQoCi0gICAgU3RyaW5nIHJlcG9ydFRpdGxlLAotICAgIFByb2ZpbGVBc3NlcnRpb25zIHByb2ZpbGVBc3NlcnRpb25zLAotICAgIEFuYWx5emVyIGFuYWx5emVyKQotICB7Ci0gICAgdGhpcy5yZXBvcnRUaXRsZSA9IHJlcG9ydFRpdGxlOwotICAgIHRoaXMucHJvZmlsZUFzc2VydGlvbnMgPSBwcm9maWxlQXNzZXJ0aW9uczsKLSAgICB0aGlzLmFuYWx5emVyID0gYW5hbHl6ZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHJlcG9ydCB0aXRsZS4KLSAgICogQHJldHVybiByZXBvcnQgdGl0bGUuCi0gICAqIEBzZWUgI3NldFJlcG9ydFRpdGxlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlcG9ydFRpdGxlKCkKLSAgewotICAgIHJldHVybiB0aGlzLnJlcG9ydFRpdGxlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCByZXBvcnQgdGl0bGUuCi0gICAqIEBwYXJhbSByZXBvcnRUaXRsZSByZXBvcnQgdGl0bGUuCi0gICAqIEBzZWUgI2dldFJlcG9ydFRpdGxlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXBvcnRUaXRsZShTdHJpbmcgcmVwb3J0VGl0bGUpCi0gIHsKLSAgICB0aGlzLnJlcG9ydFRpdGxlID0gcmVwb3J0VGl0bGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHByb2ZpbGUgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiBwcm9maWxlIGRlZmluaXRpb24uCi0gICAqIEBzZWUgI3NldFByb2ZpbGVBc3NlcnRpb25zCi0gICAqLwotICBwdWJsaWMgUHJvZmlsZUFzc2VydGlvbnMgZ2V0UHJvZmlsZUFzc2VydGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucHJvZmlsZUFzc2VydGlvbnM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHByb2ZpbGUgZGVmaW5pdGlvbi4KLSAgICogQHBhcmFtIHByb2ZpbGVBc3NlcnRpb25zIHByb2ZpbGUgZGVmaW5pdGlvbi4KLSAgICogQHNlZSAjZ2V0UHJvZmlsZUFzc2VydGlvbnMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb2ZpbGVBc3NlcnRpb25zKFByb2ZpbGVBc3NlcnRpb25zIHByb2ZpbGVBc3NlcnRpb25zKQotICB7Ci0gICAgdGhpcy5wcm9maWxlQXNzZXJ0aW9ucyA9IHByb2ZpbGVBc3NlcnRpb25zOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhbmFseXplci4KLSAgICogQHJldHVybiBhbmFseXplci4KLSAgICogQHNlZSAjc2V0QW5hbHl6ZXIKLSAgICovCi0gIHB1YmxpYyBBbmFseXplciBnZXRBbmFseXplcigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5hbmFseXplcjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgYW5hbHl6ZXIuCi0gICAqIEBwYXJhbSBhbmFseXplciBhbiBBbmFseXplciBvYmplY3QuCi0gICAqIEBzZWUgI2dldEFuYWx5emVyCi0gICAqIAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QW5hbHl6ZXIoQW5hbHl6ZXIgYW5hbHl6ZXIpCi0gIHsKLSAgICB0aGlzLmFuYWx5emVyID0gYW5hbHl6ZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0V3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1JlcG9ydFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTdmYzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0V3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0OwotCi1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRXcml0ZXI7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgdG8gd3JpdGUgdGhlIHJlcG9ydCBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvcnRXcml0ZXIgZXh0ZW5kcyBEb2N1bWVudFdyaXRlcgotewotICAvKioKLSAgICogV3JpdGUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgdXNpbmcgdGhlIGxvY2F0aW9uCi0gICAqIHRoYXQgd2FzIHByZXZpb3VzbHkgc2V0IHVzaW5nIHRoZSBzZXRMb2NhdGlvbiBtZXRob2QuCi0gICAqIEBwYXJhbSByZXBvcnQgYSByZXBvcnQuCi0gICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGludm9rZWQgCi0gICAqICAgICAgICAgYXQgYW4gaWxsZWdhbCBvciBpbmFwcHJvcHJpYXRlIHRpbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFJlcG9ydCByZXBvcnQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50LgotICAgKiBAcGFyYW0gcmVwb3J0IGEgcmVwb3J0LgotICAgKiBAcGFyYW0gd3JpdGVyIGEgV3JpdGVyIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFJlcG9ydCByZXBvcnQsIFdyaXRlciB3cml0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9SZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWE3ODQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQ7Ci0KLS8qKgotICogQ29uZm9ybWFuY2UgdGVzdCByZXBvcnRlciBpbnRlcmZhY2UuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlcG9ydGVyIGV4dGVuZHMgQnVpbGRSZXBvcnQsIFdyaXRlUmVwb3J0Ci17Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1dyaXRlUmVwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L1dyaXRlUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzBkOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9Xcml0ZVJlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyAuLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGVSZXBvcnQKLXsKLSAgLyoqCi0gICAqIFN0YXJ0IGNvbmZvcm1hbmNlIHJlcG9ydC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gdGhlIGJhc2UgV1MtSSBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydFJlcG9ydCgpIHRocm93cyBXU0lFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEZpbmlzaCB0aGUgY29uZm9ybWFuY2UgcmVwb3J0IGJ5IGFkZGluZyB0aGUgc3VtbWFyeSBhbmQgdGVzdCBjb3ZlcmFnZSBpbmZvcm1hdGlvbi4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gdGhlIGJhc2UgV1MtSSBleGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCBmaW5pc2hSZXBvcnQoKSB0aHJvd3MgV1NJRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBGaW5pc2ggdGhlIGNvbmZvcm1hbmNlIHJlcG9ydCBiZWNhdXNlIG9mIGFuIGFuYWx5emVyIGVycm9yLgotICAgKiBAcGFyYW0gZXJyb3JEZXRhaWwgYW5hbHl6ZXIgZXJyb3IuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIHRoZSBiYXNlIFdTLUkgZXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgZmluaXNoUmVwb3J0V2l0aEVycm9yKFN0cmluZyBlcnJvckRldGFpbCkgdGhyb3dzIFdTSUV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0IHJlcG9ydC4KLSAgICogQHJldHVybiByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgUmVwb3J0IGdldFJlcG9ydCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0FydGlmYWN0UmVmZXJlbmNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0FydGlmYWN0UmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGI0NmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9BcnRpZmFjdFJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXJ0aWZhY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogQW4gYXJ0aWZhY3QgcmVmZXJlbmNlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RSZWZlcmVuY2VJbXBsIGltcGxlbWVudHMgQXJ0aWZhY3RSZWZlcmVuY2UKLXsKLSAgLyoqCi0gICAqIFRpbWVzdGFtcC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgdGltZXN0YW1wID0gbnVsbDsKLQotICAvKioKLSAgICogT3B0aW9uYWwgZG9jdW1lbnQgZWxlbWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBEb2N1bWVudEVsZW1lbnQgZG9jdW1lbnRFbGVtZW50ID0gbnVsbDsKLQotICAvKioKLSAgICogT3B0aW9uYWwgZG9jdW1lbnQgZWxlbWVudCBuYW1lc3BhY2UgbmFtZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudE5hbWVzcGFjZU5hbWUgPSBudWxsOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFydGlmYWN0UmVmZXJlbmNlI2dldFRpbWVzdGFtcCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFRpbWVzdGFtcCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy50aW1lc3RhbXA7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZSNzZXRUaW1lc3RhbXAoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKFN0cmluZyB0aW1lc3RhbXApCi0gIHsKLSAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFydGlmYWN0UmVmZXJlbmNlI2dldERvY3VtZW50RWxlbWVudCgpCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnRFbGVtZW50IGdldERvY3VtZW50RWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5kb2N1bWVudEVsZW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZSNzZXREb2N1bWVudEVsZW1lbnQoRG9jdW1lbnRFbGVtZW50LCBTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudEVsZW1lbnQoCi0gICAgRG9jdW1lbnRFbGVtZW50IGRvY3VtZW50RWxlbWVudCwKLSAgICBTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIHRoaXMuZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnRFbGVtZW50OwotICAgIHRoaXMuZWxlbWVudE5hbWVzcGFjZU5hbWUgPSBuYW1lc3BhY2VOYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgcHcucHJpbnRsbigiICBBcnRpZmFjdCBSZWZlcmVuY2U6ICIpOwotICAgIHB3LnByaW50bG4oIiAgICB0aW1lc3RhbXAgLi4uLi4uLi4uLi4gIiArIHRoaXMudGltZXN0YW1wKTsKLQotICAgIGlmICh0aGlzLmRvY3VtZW50RWxlbWVudCAhPSBudWxsKQotICAgICAgcHcucHJpbnRsbigKLSAgICAgICAgIiAgICBkb2N1bWVudEVsZW1lbnQgLi4uLi4gIgotICAgICAgICAgICsgdGhpcy5kb2N1bWVudEVsZW1lbnQudG9YTUxTdHJpbmcodGhpcy5lbGVtZW50TmFtZXNwYWNlTmFtZSkpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDcmVhdGUgZWxlbWVudCAKLSAgICBwdy5wcmludCgiICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIiAiKTsKLSAgICBwdy5wcmludGxuKFdTSUNvbnN0YW50cy5BVFRSX1RJTUVTVEFNUCArICI9XCIiICsgZ2V0VGltZXN0YW1wKCkgKyAiXCI+Iik7Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBhIGRvY3VtZW50IGVsZW1lbnQsIHRoZW4gYWRkIGl0Ci0gICAgaWYgKHRoaXMuZG9jdW1lbnRFbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgcHcucHJpbnQoZG9jdW1lbnRFbGVtZW50LnRvWE1MU3RyaW5nKHRoaXMuZWxlbWVudE5hbWVzcGFjZU5hbWUpKTsKLSAgICB9Ci0KLSAgICAvLyBFbmQgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0Fzc2VydGlvblJlc3VsdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9Bc3NlcnRpb25SZXN1bHRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMmQ4Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0Fzc2VydGlvblJlc3VsdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFzc2VydGlvblJlc3VsdHNPcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsLkFzc2VydGlvblJlc3VsdHNPcHRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkZhaWx1cmVEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5QcmVyZXFGYWlsZWRMaXN0OwotCi1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLkRPTVV0aWxzOwotCi0vKioKLSAqIFRlc3QgYXNzZXJ0aW9uIHJlc3VsdC4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlcnRpb25SZXN1bHRJbXBsIGltcGxlbWVudHMgQXNzZXJ0aW9uUmVzdWx0Ci17Ci0gIC8qKgotICAgKiBBc3NlcnRpb24gcmVzdWx0LgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gIC8qKgotICAgKiBFbnRyeS4KLSAgICovCi0gIHByb3RlY3RlZCBFbnRyeSBlbnRyeSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFByb2ZpbGUgdGVzdCBhc3NlcnRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgVGVzdEFzc2VydGlvbiB0ZXN0QXNzZXJ0aW9uID0gbnVsbDsKLQotICAvKioKLSAgICogRmFpbHVyZSBkZXRhaWwgbWVzc2FnZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGZhaWx1cmVEZXRhaWxMaXN0ID0gbnVsbDsKLQotICAvKioKLSAgICogQXNzZXJ0aW9uIHJlc3VsdHMgb3B0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIEFzc2VydGlvblJlc3VsdHNPcHRpb24gYXNzZXJ0aW9uUmVzdWx0c09wdGlvbiA9Ci0gICAgbmV3IEFzc2VydGlvblJlc3VsdHNPcHRpb25JbXBsKCk7Ci0KLSAgLyoqCi0gICAqIFByZXJlcSBmYWlsZWQgbGlzdC4KLSAgICovCi0gIHByb3RlY3RlZCBQcmVyZXFGYWlsZWRMaXN0IHByZXJlcUZhaWxlZExpc3QgPSBudWxsOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgYXNzZXJ0aW9uIHJlc3VsdC4KLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHRJbXBsKCkKLSAgewotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I2dldFJlc3VsdCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZXN1bHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQjc2V0UmVzdWx0KGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXN1bHQoU3RyaW5nIHJlc3VsdCkKLSAgewotICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I2dldEFzc2VydGlvbigpCi0gICAqLwotICBwdWJsaWMgVGVzdEFzc2VydGlvbiBnZXRBc3NlcnRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMudGVzdEFzc2VydGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNzZXRBc3NlcnRpb24ob3JnLndzaS50ZXN0LnByb2ZpbGUuVGVzdEFzc2VydGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFzc2VydGlvbihUZXN0QXNzZXJ0aW9uIHRlc3RBc3NlcnRpb24pCi0gIHsKLSAgICB0aGlzLnRlc3RBc3NlcnRpb24gPSB0ZXN0QXNzZXJ0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I2dldEVudHJ5KCkKLSAgICovCi0gIHB1YmxpYyBFbnRyeSBnZXRFbnRyeSgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbnRyeTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNzZXRFbnRyeShvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW50cnkoRW50cnkgZW50cnkpCi0gIHsKLSAgICB0aGlzLmVudHJ5ID0gZW50cnk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQjZ2V0RmFpbHVyZURldGFpbExpc3QoKQotICAgKi8KLSAgcHVibGljIFZlY3RvciBnZXRGYWlsdXJlRGV0YWlsTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5mYWlsdXJlRGV0YWlsTGlzdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkFzc2VydGlvblJlc3VsdCNzZXRGYWlsdXJlRGV0YWlsTGlzdChqYXZhLnV0aWwuVmVjdG9yKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmFpbHVyZURldGFpbExpc3QoVmVjdG9yIGZhaWx1cmVEZXRhaWxMaXN0KQotICB7Ci0gICAgdGhpcy5mYWlsdXJlRGV0YWlsTGlzdCA9IGZhaWx1cmVEZXRhaWxMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I2dldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdHNPcHRpb24gZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5hc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I3NldEFzc2VydGlvblJlc3VsdHNPcHRpb24ob3JnLndzaS50ZXN0LmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbihBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFzc2VydGlvblJlc3VsdHNPcHRpb24pCi0gIHsKLSAgICB0aGlzLmFzc2VydGlvblJlc3VsdHNPcHRpb24gPSBhc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I2dldFByZXJlcUZhaWxlZExpc3QoKQotICAgKi8KLSAgcHVibGljIFByZXJlcUZhaWxlZExpc3QgZ2V0UHJlcmVxRmFpbGVkTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5wcmVyZXFGYWlsZWRMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0I3NldFByZXJlcUZhaWxlZExpc3Qob3JnLndzaS50ZXN0LnJlcG9ydC5QcmVyZXFGYWlsZWRMaXN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJlcmVxRmFpbGVkTGlzdChQcmVyZXFGYWlsZWRMaXN0IHByZXJlcUZhaWxlZExpc3QpCi0gIHsKLSAgICB0aGlzLnByZXJlcUZhaWxlZExpc3QgPSBwcmVyZXFGYWlsZWRMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENyZWF0ZSBlbGVtZW50IAotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICIgIik7Ci0gICAgcHcucHJpbnQoV1NJQ29uc3RhbnRzLkFUVFJfSUQgKyAiPVwiIiArIHRoaXMudGVzdEFzc2VydGlvbi5nZXRJZCgpICsgIlwiICIpOwotICAgIHB3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfUkVTVUxUICsgIj1cIiIgKyB0aGlzLnJlc3VsdCArICJcIj4iKTsKLQotICAgIC8vIEFERDogQWRkIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgdGFyZ2V0cwotCi0gICAgLy8gQWRkIHByZXJlcSBmYWlsZWQgbGlzdAotICAgIGlmICh0aGlzLnByZXJlcUZhaWxlZExpc3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludChwcmVyZXFGYWlsZWRMaXN0LnRvWE1MU3RyaW5nKG5zTmFtZSkpOwotICAgIH0KLQotICAgIC8vIEFERDogQWRkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGxhbmd1YWdlcwotICAgIC8vIElmIHJlc3VsdCBpcyBmYWlsZWQgb3Igd2FybmluZywgdGhlbiBhZGQgZmFpbHVyZSBtZXNzYWdlCi0gICAgaWYgKChyZXN1bHQuZXF1YWxzKFJFU1VMVF9GQUlMRUQpIHx8IHJlc3VsdC5lcXVhbHMoUkVTVUxUX1dBUk5JTkcpKQotICAgICAgJiYgKGFzc2VydGlvblJlc3VsdHNPcHRpb24uZ2V0U2hvd0ZhaWx1cmVNZXNzYWdlKCkpKQotICAgIHsKLSAgICAgIHB3LnByaW50KAotICAgICAgICAiICAgICAgICA8IgotICAgICAgICAgICsgbnNOYW1lCi0gICAgICAgICAgKyBXU0lDb25zdGFudHMuRUxFTV9GQUlMVVJFX01FU1NBR0UKLSAgICAgICAgICArICIgeG1sOmxhbmc9XCJlblwiPiIpOwotICAgICAgcHcucHJpbnQoRE9NVXRpbHMuY2xlYW5TdHJpbmcodGhpcy50ZXN0QXNzZXJ0aW9uLmdldEZhaWx1cmVNZXNzYWdlKCkpKTsKLSAgICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0ZBSUxVUkVfTUVTU0FHRSArICI+Iik7Ci0gICAgfQotCi0gICAgLy8gQUREOiBBZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgbGFuZ3VhZ2VzCi0gICAgLy8gSWYgYW55IGZhaWx1cmUgZGV0YWlsIG1lc3NhZ2VzIHdlcmUgc3BlY2lmaWVkLCB0aGVuIGFkZCB0aGVtCi0gICAgaWYgKChmYWlsdXJlRGV0YWlsTGlzdCAhPSBudWxsKQotICAgICAgJiYgKGFzc2VydGlvblJlc3VsdHNPcHRpb24uZ2V0U2hvd0ZhaWx1cmVEZXRhaWwoKSkpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWlsdXJlRGV0YWlsTGlzdC5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgcHcucHJpbnQoKChGYWlsdXJlRGV0YWlsKSBpdGVyYXRvci5uZXh0KCkpLnRvWE1MU3RyaW5nKG5zTmFtZSkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEVuZCB0aGUgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICAgIDwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICAvLyBSZXR1cm4gc3RyaW5nCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9EZWZhdWx0UmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9EZWZhdWx0UmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmZGMzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRGVmYXVsdFJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiwgUGFyYXNvZnQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIFBhcmFzb2Z0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5GYWlsdXJlRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRlcjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciByZXBvcnRpbmcgZXJyb3JzIGZyb20gdGhlIGFuYWx5emVyLgotICogRXh0ZW5kIHRoaXMgY2xhc3MgZm9yIHNwZWNpZmljIHR5cGVzIG9mIHJlcG9ydGluZywgc3VjaCBhcyByZXBvcnRpbmcKLSAqIGluIGRpZmZlcmVudCBmb3JtYXRzLCByZXBvcnRpbmcgdG8gZmlsZXMsIHJlcG9ydGluZyB0byBhIEdVSS4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBKaW0gQ2x1bmUKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFJlcG9ydGVyIGltcGxlbWVudHMgUmVwb3J0ZXIKLXsKLSAgLyoqCi0gICAqIENvbmZvcm1hbmNlIHJlcG9ydC4KLSAgICovCi0gIHByb3RlY3RlZCBSZXBvcnQgcmVwb3J0OwotCi0gIC8qKgotICAgKiBEb2N1bWVudCB3cml0ZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgUmVwb3J0V3JpdGVyIHJlcG9ydFdyaXRlcjsKLQotICAvKioKLSAgICogQW5hbHl6ZXIgY29uZmlnLgotICAgKi8KLSAgcHJvdGVjdGVkIEFuYWx5emVyQ29uZmlnIGFuYWx5emVyQ29uZmlnOwotCi0gIC8qKgotICAgKiBBc3NlcnRvaW4gcmVzdWx0IHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgQXNzZXJ0aW9uUmVzdWx0VHlwZSBhc3NlcnRpb25SZXN1bHRUeXBlOwotCi0gIC8qKgotICAgKiBEbyBub3QgYWxsb3cgdGhlIHJlcG9ydGVyIHRvIGJlIGNyZWF0ZWQgd2l0aCBudWxsIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJpdmF0ZSBEZWZhdWx0UmVwb3J0ZXIoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIHJlc3VsdCByZXBvcnRlci4KLSAgICogQHBhcmFtIHJlcG9ydCBhIFJlcG9ydCBvYmplY3QuCi0gICAqIEBwYXJhbSByZXBvcnRXcml0ZXIgYSBSZXBvcnRXcml0ZXJPYmplY3QuCi0gICAqLwotICBwdWJsaWMgRGVmYXVsdFJlcG9ydGVyKFJlcG9ydCByZXBvcnQsIFJlcG9ydFdyaXRlciByZXBvcnRXcml0ZXIpCi0gIHsKLSAgICB0aGlzLnJlcG9ydCA9IHJlcG9ydDsKLSAgICB0aGlzLnJlcG9ydFdyaXRlciA9IHJlcG9ydFdyaXRlcjsKLQotICAgIC8vIEFERDogVmVyaWZ5IHRoYXQgd3JpdGVyIHNldCBpbiByZXBvcnRXcml0ZXIKLQotICAgIC8vIEdldCByZXBvcnQgY29udGV4dAotICAgIHRoaXMuYW5hbHl6ZXJDb25maWcgPQotICAgICAgcmVwb3J0LmdldFJlcG9ydENvbnRleHQoKS5nZXRBbmFseXplcigpLmdldEFuYWx5emVyQ29uZmlnKCk7Ci0gICAgdGhpcy5hc3NlcnRpb25SZXN1bHRUeXBlID0KLSAgICAgIHRoaXMuYW5hbHl6ZXJDb25maWcuZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpLmdldEFzc2VydGlvblJlc3VsdFR5cGUoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I3NldEN1cnJlbnRBcnRpZmFjdChvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydEFydGlmYWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEFydGlmYWN0KFJlcG9ydEFydGlmYWN0IHJlcG9ydEFydGlmYWN0KQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlcG9ydC5zZXRDdXJyZW50QXJ0aWZhY3QocmVwb3J0QXJ0aWZhY3QpOwotICAgIHJlcG9ydFdyaXRlci53cml0ZShuZXcgU3RyaW5nUmVhZGVyKHJlcG9ydEFydGlmYWN0LmdldFN0YXJ0WE1MU3RyaW5nKCIiKSkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjZW5kQ3VycmVudEFydGlmYWN0KCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEN1cnJlbnRBcnRpZmFjdCgpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHJlcG9ydFdyaXRlci53cml0ZSgKLSAgICAgIG5ldyBTdHJpbmdSZWFkZXIocmVwb3J0LmdldEN1cnJlbnRBcnRpZmFjdCgpLmdldEVuZFhNTFN0cmluZygiIikpKTsKLSAgICByZXBvcnQuZW5kQ3VycmVudEFydGlmYWN0KCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNhZGRBcnRpZmFjdFJlZmVyZW5jZShvcmcud3NpLnRlc3QucmVwb3J0LkFydGlmYWN0UmVmZXJlbmNlKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXJ0aWZhY3RSZWZlcmVuY2UoQXJ0aWZhY3RSZWZlcmVuY2UgYXJ0aWZhY3RSZWZlcmVuY2UpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVwb3J0V3JpdGVyLndyaXRlKG5ldyBTdHJpbmdSZWFkZXIoYXJ0aWZhY3RSZWZlcmVuY2UudG9YTUxTdHJpbmcoIiIpKSk7Ci0KLSAgICAvLyBBZGQgYXJ0aWZhY3QgcmVmZXJlbmNlIHRvIHJlcG9ydAotICAgIHJlcG9ydC5hZGRBcnRpZmFjdFJlZmVyZW5jZShhcnRpZmFjdFJlZmVyZW5jZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNzZXRDdXJyZW50RW50cnkob3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRFbnRyeShFbnRyeSBlbnRyeSkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVwb3J0LnNldEN1cnJlbnRFbnRyeShlbnRyeSk7Ci0gICAgcmVwb3J0V3JpdGVyLndyaXRlKAotICAgICAgbmV3IFN0cmluZ1JlYWRlcigKLSAgICAgICAgZW50cnkuZ2V0U3RhcnRYTUxTdHJpbmcoCi0gICAgICAgICAgIiIsCi0gICAgICAgICAgdGhpcwotICAgICAgICAgICAgLnJlcG9ydAotICAgICAgICAgICAgLmdldFJlcG9ydENvbnRleHQoKQotICAgICAgICAgICAgLmdldEFuYWx5emVyKCkKLSAgICAgICAgICAgIC5nZXRBbmFseXplckNvbmZpZygpCi0gICAgICAgICAgICAuZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpCi0gICAgICAgICAgICAuZ2V0U2hvd01lc3NhZ2VFbnRyeSgpKSkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjc2V0Q3VycmVudEVudHJ5KG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50RW52ZWxvcGVFbnRyeShFbnRyeSBlbnRyeSkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmVwb3J0LnNldEN1cnJlbnRFbnRyeShlbnRyeSk7Ci0gICAgcmVwb3J0V3JpdGVyLndyaXRlKAotICAgICAgbmV3IFN0cmluZ1JlYWRlcigKLSAgICAgICAgZW50cnkuZ2V0U3RhcnRYTUxTdHJpbmcoCi0gICAgICAgICAgIiIsCi0gICAgICAgICAgdGhpcwotICAgICAgICAgICAgLnJlcG9ydAotICAgICAgICAgICAgLmdldFJlcG9ydENvbnRleHQoKQotICAgICAgICAgICAgLmdldEFuYWx5emVyKCkKLSAgICAgICAgICAgIC5nZXRBbmFseXplckNvbmZpZygpCi0gICAgICAgICAgICAuZ2V0QXNzZXJ0aW9uUmVzdWx0c09wdGlvbigpCi0gICAgICAgICAgICAuZ2V0U2hvd01lc3NhZ2VFbnRyeSgpLAotCQkgIHRydWUpKSk7Ci0gIH0KLS8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2VuZEN1cnJlbnRFbnRyeSgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRDdXJyZW50RW50cnkoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXBvcnRXcml0ZXIud3JpdGUoCi0gICAgICBuZXcgU3RyaW5nUmVhZGVyKHJlcG9ydC5nZXRDdXJyZW50RW50cnkoKS5nZXRFbmRYTUxTdHJpbmcoIiIpKSk7Ci0gICAgcmVwb3J0LmVuZEN1cnJlbnRFbnRyeSgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjYWRkQXNzZXJ0aW9uUmVzdWx0KG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXNzZXJ0aW9uUmVzdWx0KEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQmFzZWQgb24gdGhlIGNvbmZpZyBvcHRpb25zLCB3cml0ZSBvdXQgYXNzZXJ0aW9uIHJlc3VsdAotICAgIGlmICgoYXNzZXJ0aW9uUmVzdWx0VHlwZS5pc0FsbCgpKQotICAgICAgfHwgKChhc3NlcnRpb25SZXN1bHRUeXBlLmlzRmFpbGVkT25seSgpKQotICAgICAgICAmJiAoYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdCgpLmVxdWFscyhBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCkpKQotICAgICAgfHwgKChhc3NlcnRpb25SZXN1bHRUeXBlLmlzTm90UGFzc2VkKCkpCi0gICAgICAgICYmICghYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdCgpLmVxdWFscyhBc3NlcnRpb25SZXN1bHQuUkVTVUxUX1BBU1NFRCkpKQotCSAgICAgIHx8ICgoYXNzZXJ0aW9uUmVzdWx0VHlwZS5pc05vdEluZm8oKSkKLQkgICAgICAgICAgICAmJiAoIWFzc2VydGlvblJlc3VsdC5nZXRBc3NlcnRpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFRlc3RBc3NlcnRpb24uVFlQRV9JTkZPUk1BVElPTkFMKSkpKQotICAgIHsKLSAgICAgIHJlcG9ydFdyaXRlci53cml0ZShuZXcgU3RyaW5nUmVhZGVyKGFzc2VydGlvblJlc3VsdC50b1hNTFN0cmluZygiIikpKTsKLSAgICB9Ci0KLSAgICAvLyBBZGQgYXNzZXJ0aW9uIHRvIHJlcG9ydAotICAgIHJlcG9ydC5hZGRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uUmVzdWx0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2dldEFzc2VydGlvblJlc3VsdChqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBnZXRBc3NlcnRpb25SZXN1bHQoU3RyaW5nIGFzc2VydGlvbklkKQotICB7Ci0gICAgLy8gR2V0IHRoZSBhc3NlcnRpb24gcmVzdWx0IGZyb20gdGhlIGN1cnJlbnQgYXNzZXJ0aW9uIHRhcmdldAotICAgIHJldHVybiByZXBvcnQuZ2V0QXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvbklkKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LldyaXRlUmVwb3J0I3N0YXJ0UmVwb3J0KCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0UmVwb3J0KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gV3JpdGUgb3V0IHN0YXJ0IG9mIHJlcG9ydAotICAgIHJlcG9ydFdyaXRlci53cml0ZShuZXcgU3RyaW5nUmVhZGVyKHJlcG9ydC5nZXRTdGFydFhNTFN0cmluZygiIikpKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LldyaXRlUmVwb3J0I2ZpbmlzaFJlcG9ydCgpCi0gICAqLwotICBwdWJsaWMgdm9pZCBmaW5pc2hSZXBvcnQoKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBFbmQgdGhlIHJlcG9ydCBmaWxlCi0gICAgcmVwb3J0V3JpdGVyLndyaXRlKG5ldyBTdHJpbmdSZWFkZXIocmVwb3J0LmdldEVuZFhNTFN0cmluZygiIikpKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LldyaXRlUmVwb3J0I2ZpbmlzaFJlcG9ydFdpdGhFcnJvcihqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgZmluaXNoUmVwb3J0V2l0aEVycm9yKFN0cmluZyBlcnJvckRldGFpbCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQ2hlY2sgaWYgZW50cnkgb3IgYXJ0aWZhY3QgbmVlZCB0byBiZSBjbG9zZWQKLSAgICBpZiAodGhpcy5yZXBvcnQuZ2V0Q3VycmVudEVudHJ5KCkgIT0gbnVsbCkKLSAgICAgIGVuZEN1cnJlbnRFbnRyeSgpOwotICAgIGlmICh0aGlzLnJlcG9ydC5nZXRDdXJyZW50QXJ0aWZhY3QoKSAhPSBudWxsKQotICAgICAgZW5kQ3VycmVudEFydGlmYWN0KCk7Ci0KLSAgICAvLyBFbmQgdGhlIHJlcG9ydCBmaWxlCi0gICAgcmVwb3J0V3JpdGVyLndyaXRlKAotICAgICAgbmV3IFN0cmluZ1JlYWRlcihyZXBvcnQuZ2V0RXJyb3JYTUxTdHJpbmcoIiIsIGVycm9yRGV0YWlsKSkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KCkKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KCkKLSAgewotICAgIHJldHVybiByZXBvcnQuY3JlYXRlQXNzZXJ0aW9uUmVzdWx0KCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNjcmVhdGVBcnRpZmFjdCgpCi0gICAqLwotICBwdWJsaWMgUmVwb3J0QXJ0aWZhY3QgY3JlYXRlQXJ0aWZhY3QoKQotICB7Ci0gICAgcmV0dXJuIHJlcG9ydC5jcmVhdGVBcnRpZmFjdCgpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjY3JlYXRlRW50cnkoKQotICAgKi8KLSAgcHVibGljIEVudHJ5IGNyZWF0ZUVudHJ5KCkKLSAgewotICAgIHJldHVybiByZXBvcnQuY3JlYXRlRW50cnkoKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2NyZWF0ZUVudHJ5Q29udGFpbmVyKCkKLSAgICovCi0gIHB1YmxpYyBFbnRyeUNvbnRhaW5lciBjcmVhdGVFbnRyeUNvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gcmVwb3J0LmNyZWF0ZUVudHJ5Q29udGFpbmVyKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNjcmVhdGVGYWlsdXJlRGV0YWlsKCkKLSAgICovCi0gIHB1YmxpYyBGYWlsdXJlRGV0YWlsIGNyZWF0ZUZhaWx1cmVEZXRhaWwoKQotICB7Ci0gICAgcmV0dXJuIHJlcG9ydC5jcmVhdGVGYWlsdXJlRGV0YWlsKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5Xcml0ZVJlcG9ydCNnZXRSZXBvcnQoKQotICAgKi8KLSAgcHVibGljIFJlcG9ydCBnZXRSZXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVwb3J0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjc2V0UHJlcmVxVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJlcmVxVHlwZShTdHJpbmcgcHJlcmVxVHlwZSkKLSAgewotICAgIHRoaXMucmVwb3J0LnNldFByZXJlcVR5cGUocHJlcmVxVHlwZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9FbnRyeUNvbnRhaW5lckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9FbnRyeUNvbnRhaW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2ZDA4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRW50cnlDb250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgSUJNIENvcnBvcmF0aW9uLCBQYXJhc29mdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNICAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgUGFyYXNvZnQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5Q29udGFpbmVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNvbnRhaW5lciBmb3Igb25lIG9yIG1vcmUgZW50cmllcy4gIAotICogQW4gZXhhbXBsZSB3b3VsZCBiZSBhIFdTREwgZG9jdW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRyeUNvbnRhaW5lckltcGwKLSAgZXh0ZW5kcyBFbnRyeVJlc3VsdEltcGwKLSAgaW1wbGVtZW50cyBFbnRyeUNvbnRhaW5lcgotewotICAvKioKLSAgICogQ29udGFpbmVyIElELgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBpZDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeUNvbnRhaW5lciNnZXRJZCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldElkKCkKLSAgewotICAgIHJldHVybiB0aGlzLmlkOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnlDb250YWluZXIjc2V0SWQoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKQotICB7Ci0gICAgdGhpcy5pZCA9IGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiAiWyIgKyB0aGlzLmlkICsgIl0gIiArIHRoaXMuYXNzZXJ0aW9uUmVzdWx0TGlzdDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRW50cnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvRW50cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MWExYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0VudHJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuTWVzc2FnZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5FbnRyeVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZW50cnkgaW4gYSByZXBvcnQuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRyeUltcGwgZXh0ZW5kcyBFbnRyeVJlc3VsdEltcGwgaW1wbGVtZW50cyBFbnRyeQotewotICAvKioKLSAgICogRW50cnkgdHlwZS4KLSAgICovCi0gIHByb3RlY3RlZCBFbnRyeVR5cGUgZW50cnlUeXBlID0gbnVsbDsKLQotICAvKioKLSAgICogQXJ0aWZhY3QgbmFtZSAob3B0aW9uYWwpLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBhcnRpZmFjdE5hbWUgPSBudWxsOwotCi0gIC8qKgotICAgKiBSZWZlcmVuY2UgSUQuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZUlEID0gbnVsbDsKLQotICAvKioKLSAgICogUGFyZW50IGVsZW1lbnQgbmFtZSAob25seSB1c2VkIHdoZW4gZW50cnkgdHlwZSBpcyAicG9ydCIgb3IgIm9wZXJhdGlvbiIpLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwYXJlbnRFbGVtZW50TmFtZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEVudHJ5IGRldGFpbCBvYmplY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgT2JqZWN0IGVudHJ5RGV0YWlsID0gbnVsbDsKLQotICAvKioKLSAgICogRW50cnkgY29udGFpbmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIEVudHJ5Q29udGFpbmVyIGVudHJ5Q29udGFpbmVyID0gbnVsbDsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSNnZXRFbnRyeVR5cGUoKQotICAgKi8KLSAgcHVibGljIEVudHJ5VHlwZSBnZXRFbnRyeVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZW50cnlUeXBlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjc2V0RW50cnlUeXBlKEVudHJ5VHlwZSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShFbnRyeVR5cGUgZW50cnlUeXBlKQotICB7Ci0gICAgdGhpcy5lbnRyeVR5cGUgPSBlbnRyeVR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSNnZXRBcnRpZmFjdE5hbWUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuYXJ0aWZhY3ROYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjc2V0QXJ0aWZhY3ROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdE5hbWUoU3RyaW5nIGFydGlmYWN0TmFtZSkKLSAgewotICAgIHRoaXMuYXJ0aWZhY3ROYW1lID0gYXJ0aWZhY3ROYW1lOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjZ2V0UmVmZXJlbmNlSUQoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VJRCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2VJRDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I3NldFJlZmVyZW5jZUlEKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZUlEKFN0cmluZyByZWZlcmVuY2VJRCkKLSAgewotICAgIHRoaXMucmVmZXJlbmNlSUQgPSByZWZlcmVuY2VJRDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I2dldFBhcmVudEVsZW1lbnROYW1lKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50RWxlbWVudE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucGFyZW50RWxlbWVudE5hbWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSNzZXRQYXJlbnRFbGVtZW50TmFtZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRFbGVtZW50TmFtZShTdHJpbmcgcGFyZW50RWxlbWVudE5hbWUpCi0gIHsKLSAgICB0aGlzLnBhcmVudEVsZW1lbnROYW1lID0gcGFyZW50RWxlbWVudE5hbWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSNnZXRFbnRyeURldGFpbCgpCi0gICAqLwotICBwdWJsaWMgT2JqZWN0IGdldEVudHJ5RGV0YWlsKCkKLSAgewotICAgIHJldHVybiB0aGlzLmVudHJ5RGV0YWlsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjc2V0RW50cnlEZXRhaWwoT2JqZWN0KQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW50cnlEZXRhaWwoT2JqZWN0IGVudHJ5RGV0YWlsKQotICB7Ci0gICAgdGhpcy5lbnRyeURldGFpbCA9IGVudHJ5RGV0YWlsOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjZ2V0RW50cnlDb250YWluZXIoKQotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGFpbmVyIGdldEVudHJ5Q29udGFpbmVyKCkKLSAgewotICAgIHJldHVybiB0aGlzLmVudHJ5Q29udGFpbmVyOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjc2V0RW50cnlDb250YWluZXIob3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeUNvbnRhaW5lcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEVudHJ5Q29udGFpbmVyKEVudHJ5Q29udGFpbmVyIGVudHJ5Q29udGFpbmVyKQotICB7Ci0gICAgdGhpcy5lbnRyeUNvbnRhaW5lciA9IGVudHJ5Q29udGFpbmVyOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnlSZXN1bHQjYWRkQXNzZXJ0aW9uUmVzdWx0KEFzc2VydGlvblJlc3VsdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEFzc2VydGlvblJlc3VsdChBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0KQotICB7Ci0gICAgc3VwZXIuYWRkQXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvblJlc3VsdCk7Ci0KLSAgICBpZiAodGhpcy5lbnRyeUNvbnRhaW5lciAhPSBudWxsKQotICAgICAgdGhpcy5lbnRyeUNvbnRhaW5lci5hZGRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uUmVzdWx0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I2dldFN0YXJ0WE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUsIGJvb2xlYW4gc2hvd0xvZ0VudHJ5LCBib29sZWFuIGVudmVsb3BlQXJ0aWZhY3RUeXBlKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDcmVhdGUgZWxlbWVudCAKLSAgICBwdy5wcmludCgiICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIiAiKTsKLQotICAgIGlmICh0aGlzLmVudHJ5VHlwZSAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChlbnZlbG9wZUFydGlmYWN0VHlwZSkKLQkgIHsKLSAgICAgIAkvLyB3ZSB1c2UgdGhlIHNhbWUgYWN0dWFsIGVudHJ5IGZvciBib3RoIG1lc3NhZ2UgYW5kIGVudmVsb3BlIGFydGlmYWN0cwotICAgICAgCS8vIHdlIG5vdyBuZWVkIHRvIG91dHB1dCBlbnRyeSB0eXBlIG5hbWVzIHRoYXQgYWN0dWFsbHkgcGVydGFpbiB0byB0aGUgYXJ0aWZhY3QgdHlwZQotICAgICAgCXB3LnByaW50KAotICAgICAgICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1RZUEUgKyAiPVwiIiArIGdldENvcnJlc3BvbmRpbmdFbnZlbG9wZUVudHJ5VHlwZU5hbWUodGhpcy5lbnRyeVR5cGUuZ2V0VHlwZU5hbWUoKSkgKyAiXCIgIik7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0gICAgICAgIHB3LnByaW50KAotICAgICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1RZUEUgKyAiPVwiIiArIHRoaXMuZW50cnlUeXBlLmdldFR5cGVOYW1lKCkgKyAiXCIgIik7Ci0JICB9Ci0gICAgfQotCi0gICAgZWxzZSBpZiAodGhpcy5hcnRpZmFjdE5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwdy5wcmludChXU0lDb25zdGFudHMuQVRUUl9UWVBFICsgIj1cIlsiICsgdGhpcy5hcnRpZmFjdE5hbWUgKyAiXVwiICIpOwotICAgIH0KLQotICAgIGlmICh0aGlzLnJlZmVyZW5jZUlEICE9IG51bGwpCi0gICAgICBwdy5wcmludCgKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfUkVGRVJFTkNFX0lEICsgIj1cIiIgKyBYTUxVdGlscy54bWxFc2NhcGVkU3RyaW5nKHRoaXMucmVmZXJlbmNlSUQpICsgIlwiIik7Ci0KLSAgICAvLyBJZiBzZXJ2aWNlIG5hbWUgd2FzIHNldCB0aGVuIGFkZCBpdAotICAgIC8vaWYgKHBhcmVudEVsZW1lbnROYW1lICE9IG51bGwpIHsKLSAgICAvLyAgcHcucHJpbnQoIiAiICsgV1NJQ29uc3RhbnRzLkFUVFJfUEFSRU5UX0VMRU1FTlRfTkFNRSArICI9XCIiICsgdGhpcy5wYXJlbnRFbGVtZW50TmFtZSArICJcIiIpOwotICAgIC8vfQotCi0gICAgLy8gRW5kIGVsZW1lbnQKLSAgICBwdy5wcmludGxuKCI+Iik7Ci0KLSAgICAvLyBBREQ6IE5lZWQgdG8gY2hlY2sgZm9yIGNvbmZpZyBvcHRpb24gdGhhdCBzcGVjaWZpZXMgCi0gICAgLy8gICAgICB0aGF0IGxvZyBlbnRyaWVzIHNob3VsZCBiZSBhZGRlZAotCi0gICAgLy8gSWYgdGFyZ2V0IGlzIGEgbG9nIGVudHJ5LCB0aGVuIGFkZCByZWZlcmVuY2UgdG8gaXQKLSAgICBpZiAoKGVudHJ5VHlwZSAhPSBudWxsKQotICAgICAgJiYgKGVudHJ5VHlwZS5nZXRBcnRpZmFjdFR5cGUoKS5pc01lc3NhZ2VzKCkpCi0gICAgICAmJiAoc2hvd0xvZ0VudHJ5KSkKLSAgICB7Ci0gICAgICBNZXNzYWdlRW50cnkgbG9nRW50cnkgPSAoTWVzc2FnZUVudHJ5KSBlbnRyeURldGFpbDsKLSAgICAgIHB3LnByaW50bG4obG9nRW50cnkudG9YTUxTdHJpbmcoV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX0xPRykpOwotICAgIH0KLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnkjZ2V0U3RhcnRYTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRTdGFydFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSwgYm9vbGVhbiBzaG93TG9nRW50cnkpCi0gIHsKLSAgCXJldHVybiBnZXRTdGFydFhNTFN0cmluZyhuYW1lc3BhY2VOYW1lLCBzaG93TG9nRW50cnksIGZhbHNlKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkVudHJ5I2dldEVuZFhNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVuZFhNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICByZXR1cm4gIiAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiI7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LkRvY3VtZW50RWxlbWVudCN0b1hNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvWE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgLy8gUmV0dXJuIHN0cmluZwotICAgIHJldHVybiBnZXRTdGFydFhNTFN0cmluZygiIiwgZmFsc2UpICsgZ2V0RW5kWE1MU3RyaW5nKCIiKTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29ycmVzcG9uZGluZ0VudmVsb3BlRW50cnlUeXBlTmFtZShTdHJpbmcgbWVzc2FnZUVudHJ5VHlwZU5hbWUpCi0gIHsKLSAgCVN0cmluZyBlbnZlbG9wZUVudHJ5VHlwZU5hbWUgPSBtZXNzYWdlRW50cnlUeXBlTmFtZTsKLSAgCWlmIChtZXNzYWdlRW50cnlUeXBlTmFtZSAhPSBudWxsKQotICAJewotICAJaWYgKG1lc3NhZ2VFbnRyeVR5cGVOYW1lLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX0FOWSkpCi0gIAkJZW52ZWxvcGVFbnRyeVR5cGVOYW1lID0gRW50cnlUeXBlLlRZUEVfRU5WRUxPUEVfQU5ZOwotICAJZWxzZSBpZiAobWVzc2FnZUVudHJ5VHlwZU5hbWUuZXF1YWxzKEVudHJ5VHlwZS5UWVBFX01FU1NBR0VfUkVRVUVTVCkpCi0gIAkJZW52ZWxvcGVFbnRyeVR5cGVOYW1lID0gRW50cnlUeXBlLlRZUEVfRU5WRUxPUEVfUkVRVUVTVDsKLSAgCWVsc2UgaWYgKG1lc3NhZ2VFbnRyeVR5cGVOYW1lLmVxdWFscyhFbnRyeVR5cGUuVFlQRV9NRVNTQUdFX1JFU1BPTlNFKSkKLSAgCQllbnZlbG9wZUVudHJ5VHlwZU5hbWUgPSBFbnRyeVR5cGUuVFlQRV9FTlZFTE9QRV9SRVNQT05TRTsKLSAgCX0KLQotICAJcmV0dXJuIGVudmVsb3BlRW50cnlUeXBlTmFtZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0VudHJ5UmVzdWx0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0VudHJ5UmVzdWx0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZmYjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9FbnRyeVJlc3VsdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeVJlc3VsdDsKLQotLyoqCi0gKiBSZXN1bHQgZm9yIGEgc3BlY2lmaWMgdGVzdCBhc3NlcnRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnRyeVJlc3VsdEltcGwgaW1wbGVtZW50cyBFbnRyeVJlc3VsdAotewotICAvKioKLSAgICogQXNzZXJ0aW9uIHJlc3VsdCBsaXN0LgotICAgKi8KLSAgcHJvdGVjdGVkIFRyZWVNYXAgYXNzZXJ0aW9uUmVzdWx0TGlzdCA9IG5ldyBUcmVlTWFwKCk7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnlSZXN1bHQjYWRkQXNzZXJ0aW9uUmVzdWx0KG9yZy53c2kudGVzdC5yZXBvcnQuQXNzZXJ0aW9uUmVzdWx0KQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXNzZXJ0aW9uUmVzdWx0KEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQpCi0gIHsKLSAgICB0aGlzLmFzc2VydGlvblJlc3VsdExpc3QucHV0KAotICAgICAgYXNzZXJ0aW9uUmVzdWx0LmdldEFzc2VydGlvbigpLmdldElkKCksCi0gICAgICBhc3NlcnRpb25SZXN1bHQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnlSZXN1bHQjZ2V0QXNzZXJ0aW9uUmVzdWx0TGlzdCgpCi0gICAqLwotICBwdWJsaWMgVHJlZU1hcCBnZXRBc3NlcnRpb25SZXN1bHRMaXN0KCkKLSAgewotICAgIHJldHVybiBhc3NlcnRpb25SZXN1bHRMaXN0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRW50cnlSZXN1bHQjZ2V0QXNzZXJ0aW9uUmVzdWx0KFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBBc3NlcnRpb25SZXN1bHQgZ2V0QXNzZXJ0aW9uUmVzdWx0KFN0cmluZyBhc3NlcnRpb25JZCkKLSAgewotICAgIHJldHVybiAoQXNzZXJ0aW9uUmVzdWx0KSBhc3NlcnRpb25SZXN1bHRMaXN0LmdldChhc3NlcnRpb25JZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9GYWlsdXJlRGV0YWlsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0ZhaWx1cmVEZXRhaWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2RjNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL0ZhaWx1cmVEZXRhaWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5GYWlsdXJlRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET01VdGlsczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHdpbGwgLi4uCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBGYWlsdXJlRGV0YWlsSW1wbCBpbXBsZW1lbnRzIEZhaWx1cmVEZXRhaWwKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBmYWlsdXJlTWVzc2FnZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlVHlwZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlSUQgPSBudWxsOwotICBwcm90ZWN0ZWQgRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbiA9IG51bGw7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRmFpbHVyZURldGFpbCNnZXRGYWlsdXJlTWVzc2FnZSgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEZhaWx1cmVNZXNzYWdlKCkKLSAgewotICAgIHJldHVybiB0aGlzLmZhaWx1cmVNZXNzYWdlOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRmFpbHVyZURldGFpbCNzZXRGYWlsdXJlTWVzc2FnZShTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlTWVzc2FnZShTdHJpbmcgZmFpbHVyZU1lc3NhZ2UpCi0gIHsKLSAgICB0aGlzLmZhaWx1cmVNZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5GYWlsdXJlRGV0YWlsI2dldFJlZmVyZW5jZVR5cGUoKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlKCkKLSAgewotICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZVR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5GYWlsdXJlRGV0YWlsI3NldFJlZmVyZW5jZVR5cGUoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVHlwZShTdHJpbmcgcmVmZXJlbmNlVHlwZSkKLSAgewotICAgIHRoaXMucmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZVR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5GYWlsdXJlRGV0YWlsI2dldFJlZmVyZW5jZUlEKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlSUQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlSUQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5GYWlsdXJlRGV0YWlsI3NldFJlZmVyZW5jZUlEbihTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VJRG4oU3RyaW5nIHJlZmVyZW5jZUlEKQotICB7Ci0gICAgdGhpcy5yZWZlcmVuY2VJRCA9IHJlZmVyZW5jZUlEOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRmFpbHVyZURldGFpbCNnZXRFbGVtZW50TG9jYXRpb24oKQotICAgKi8KLSAgcHVibGljIEVsZW1lbnRMb2NhdGlvbiBnZXRFbGVtZW50TG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHRoaXMuZWxlbWVudExvY2F0aW9uOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuRmFpbHVyZURldGFpbCNzZXRFbGVtZW50TG9jYXRpb24oRWxlbWVudExvY2F0aW9uKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudExvY2F0aW9uKEVsZW1lbnRMb2NhdGlvbiBlbGVtZW50TG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLmVsZW1lbnRMb2NhdGlvbiA9IGVsZW1lbnRMb2NhdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIENyZWF0ZSBlbGVtZW50IAotICAgIHB3LnByaW50KCIgICAgICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICIgeG1sOmxhbmc9XCJlblwiICIpOwotCi0gICAgaWYgKHRoaXMucmVmZXJlbmNlVHlwZSAhPSBudWxsKQotICAgICAgcHcucHJpbnQoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1JFRkVSRU5DRV9UWVBFICsgIj1cIiIgKyB0aGlzLnJlZmVyZW5jZVR5cGUgKyAiXCIgIik7Ci0KLSAgICBpZiAodGhpcy5yZWZlcmVuY2VJRCAhPSBudWxsKQotICAgICAgcHcucHJpbnQoCi0gICAgICAgIFdTSUNvbnN0YW50cy5BVFRSX1JFRkVSRU5DRV9JRCArICI9XCIiICsgdGhpcy5yZWZlcmVuY2VJRCArICJcIiAiKTsKLQotICAgIC8vIEFERDogTmVlZCB0byB1c2UgYSBkaWZmZXJlbnQgbmFtZXNwYWNlCi0gICAgLyoKLSAgICBpZiAodGhpcy5lbGVtZW50TG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgU3RyaW5nIG5zTmFtZUV4dCA9ICJyZXBvcnRleHQiOwotICAgICAgcHcucHJpbnQoInhtbG5zOiIgKyBuc05hbWVFeHQgKyAiPVwiIiArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVCArICIvZXh0L1wiIik7Ci0gICAgICBwdy5wcmludChuc05hbWVFeHQgKyAiOiIgKyBXU0lDb25zdGFudHMuQVRUUl9MSU5FX05VTUJFUiArICI9XCIiICsgdGhpcy5lbGVtZW50TG9jYXRpb24uZ2V0TGluZU51bWJlcigpICsgIlwiICIpOwotICAgICAgcHcucHJpbnQobnNOYW1lRXh0ICsgIjoiICsgV1NJQ29uc3RhbnRzLkFUVFJfQ09MVU1OX05VTUJFUiArICI9XCIiICsgdGhpcy5lbGVtZW50TG9jYXRpb24uZ2V0Q29sdW1uTnVtYmVyKCkgKyAiXCIgIik7Ci0gICAgfQotICAgICovCi0KLSAgICAvLyBDbG9zZSBzdGFydCBlbGVtZW50Ci0gICAgcHcucHJpbnQoIj4iKTsKLQotICAgIGlmICh0aGlzLmZhaWx1cmVNZXNzYWdlICE9IG51bGwpCi0gICAgICBwdy5wcmludGxuKERPTVV0aWxzLmNsZWFuU3RyaW5nKHRoaXMuZmFpbHVyZU1lc3NhZ2UpKTsKLQotICAgIGlmICh0aGlzLmVsZW1lbnRMb2NhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHB3LnByaW50bG4oIiAiKTsKLSAgICAgIHB3LnByaW50KHRoaXMuZWxlbWVudExvY2F0aW9uLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8vIEVuZCB0aGUgZWxlbWVudAotICAgIHB3LnByaW50bG4oIiAgICAgIDwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICAvLyBSZXR1cm4gc3RyaW5nCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1ByZXJlcUZhaWxlZExpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUHJlcmVxRmFpbGVkTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxZGUyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUHJlcmVxRmFpbGVkTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUHJlcmVxRmFpbGVkTGlzdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1haW50YWluIGFuZCBhY2Nlc3MgdGhlIFByZXJlcXVpc2l0ZSBGYWlsZWQgTGlzdC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFByZXJlcUZhaWxlZExpc3RJbXBsIGltcGxlbWVudHMgUHJlcmVxRmFpbGVkTGlzdAotewotICAvKioKLSAgICogTGlzdCBvZiB0ZXN0IGFzc2VydGlvbiBJRHMuCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGlkTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5QcmVyZXFGYWlsZWRMaXN0I2FkZFRlc3RBc3NlcnRpb25JRChqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVGVzdEFzc2VydGlvbklEKFN0cmluZyBhc3NlcnRpb25JRCkKLSAgewotICAgIGlkTGlzdC5hZGQoYXNzZXJ0aW9uSUQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgaWYgKHRoaXMuaWRMaXN0LnNpemUoKSA+IDApCi0gICAgewotICAgICAgLy8gQ3JlYXRlIGVsZW1lbnQgCi0gICAgICBwdy5wcmludGxuKCIgICAgICAgIDwiICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgICAgLy8gSW5jbHVkZSBlYWNoIHRlc3QgYXNzZXJ0aW9uIElECi0gICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGlkTGlzdC5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgcHcucHJpbnQoCi0gICAgICAgICAgIiAgICAgICAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1RFU1RfQVNTRVJUSU9OX0lEICsgIj4iKTsKLSAgICAgICAgcHcucHJpbnQoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fVEVTVF9BU1NFUlRJT05fSUQgKyAiPiIpOwotICAgICAgfQotCi0gICAgICAvLyBFbmQgZWxlbWVudAotICAgICAgcHcucHJpbnRsbigiICAgICAgICA8LyIgKyBuc05hbWUgKyBFTEVNX05BTUUgKyAiPiIpOwotICAgIH0KLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9SZXBvcnRBcnRpZmFjdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9SZXBvcnRBcnRpZmFjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyOTliOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvcmVwb3J0L2ltcGwvUmVwb3J0QXJ0aWZhY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LlJlcG9ydEFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLkFydGlmYWN0VHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgcmVwb3J0IGFydGlmYWN0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0QXJ0aWZhY3RJbXBsIGltcGxlbWVudHMgUmVwb3J0QXJ0aWZhY3QKLXsKLSAgLyoqCi0gICAqIEFydGlmYWN0IHR5cGUuCi0gICAqLwotICBwcm90ZWN0ZWQgQXJ0aWZhY3RUeXBlIGFydGlmYWN0VHlwZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEVudHJpZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgVHJlZU1hcCBlbnRyeUxpc3QgPSBuZXcgVHJlZU1hcCgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydEFydGlmYWN0I2dldFR5cGUoKQotICAgKi8KLSAgcHVibGljIEFydGlmYWN0VHlwZSBnZXRUeXBlKCkKLSAgewotICAgIHJldHVybiB0aGlzLmFydGlmYWN0VHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydEFydGlmYWN0I3NldFR5cGUoQXJ0aWZhY3RUeXBlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VHlwZShBcnRpZmFjdFR5cGUgYXJ0aWZhY3RUeXBlKQotICB7Ci0gICAgdGhpcy5hcnRpZmFjdFR5cGUgPSBhcnRpZmFjdFR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRBcnRpZmFjdCNhZGRFbnRyeShFbnRyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVudHJ5KEVudHJ5IGVudHJ5KQotICB7Ci0gICAgLy8gQWRkIGVudHJ5Ci0gICAgaWYgKGVudHJ5LmdldEVudHJ5VHlwZSgpICE9IG51bGwpCi0gICAgICB0aGlzLmVudHJ5TGlzdC5wdXQoZW50cnkuZ2V0RW50cnlUeXBlKCkuZ2V0VHlwZU5hbWUoKSwgZW50cnkpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0QXJ0aWZhY3QjZ2V0RW50cnlMaXN0KCkKLSAgICovCi0gIHB1YmxpYyBUcmVlTWFwIGdldEVudHJ5TGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbnRyeUxpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRBcnRpZmFjdCNnZXRTdGFydFhNTFN0cmluZyhTdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0WE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDcmVhdGUgZWxlbWVudCAKLSAgICBwdy5wcmludCgiICA8IiArIG5zTmFtZSArIEVMRU1fTkFNRSArICIgIik7Ci0gICAgcHcucHJpbnQoCi0gICAgICBXU0lDb25zdGFudHMuQVRUUl9UWVBFICsgIj1cIiIgKyB0aGlzLmFydGlmYWN0VHlwZS5nZXRUeXBlTmFtZSgpICsgIlwiPiIpOwotCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRBcnRpZmFjdCNnZXRFbmRYTUxTdHJpbmcoU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgcmV0dXJuICIgIDwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+IjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50I3RvWE1MU3RyaW5nKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9YTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICAvLyBSZXR1cm4gc3RyaW5nCi0gICAgcmV0dXJuIGdldFN0YXJ0WE1MU3RyaW5nKCIiKSArIGdldEVuZFhNTFN0cmluZygiIik7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1JlcG9ydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9SZXBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYjEyZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1JlcG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5Mb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5BcnRpZmFjdFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuRW50cnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5GYWlsdXJlRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0QXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLlRlc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotCi0vKioKLSAqIFdTLUkgY29uZm9ybWFuY2UgdGVzdCByZXBvcnQuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SW1wbCBpbXBsZW1lbnRzIFJlcG9ydAotewotICAvKioKLSAgICogUmVwb3J0IGZpbGVuYW1lLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlcG9ydCBjb250ZXh0LgotICAgKi8KLSAgcHJvdGVjdGVkIFJlcG9ydENvbnRleHQgcmVwb3J0Q29udGV4dCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIExvZyBmaWxlLgotICAgKi8KLSAgcHJvdGVjdGVkIExvZyBsb2cgPSBudWxsOwotCi0gIC8qKgotICAgKiBTdW1tYXJ5IGFsbCBwYXNzZWQgZmxhZy4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGFsbFBhc3NlZCA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIFRlc3QgY292ZXJhZ2UuCi0gICAqLwotICAvL3Byb3RlY3RlZCBUZXN0Q292ZXJhZ2UgdGVzdENvdmVyYWdlOwotCi0gIC8qKgotICAgKiBBcnRpZmFjdCBsaXN0LgotICAgKi8KLSAgcHJvdGVjdGVkIFZlY3RvciBhcnRpZmFjdExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgLyoqCi0gICAqIEVudHJ5IGxpc3QuCi0gICAqLwotICBwcm90ZWN0ZWQgVmVjdG9yIGVudHJ5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAvKioKLSAgICogQ3VycmVudCBhcnRpZmFjdC4KLSAgICovCi0gIHByb3RlY3RlZCBSZXBvcnRBcnRpZmFjdCBjdXJyZW50QXJ0aWZhY3QgPSBudWxsOwotCi0gIC8qKgotICAgKiBDdXJyZW50IGVudHJ5LgotICAgKi8KLSAgcHJvdGVjdGVkIEVudHJ5IGN1cnJlbnRFbnRyeSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFByZXJlcSB0eXBlLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBwcmVyZXFUeXBlOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgY29uZm9ybWFuY2UgcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFJlcG9ydEltcGwoKQotICB7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LldTSURvY3VtZW50I2dldExvY2F0aW9uKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKQotICB7Ci0gICAgLy8gR2V0IHJlcG9ydCBVUkkKLSAgICAvL3JldHVybiByZXBvcnRVUkk7Ci0gICAgcmV0dXJuIHRoaXMuZmlsZW5hbWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LmRvY3VtZW50LldTSURvY3VtZW50I3NldExvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgcmVwb3J0VVJJKQotICB7Ci0gICAgdGhpcy5maWxlbmFtZSA9IHJlcG9ydFVSSTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydCNnZXRSZXBvcnRDb250ZXh0KCkKLSAgICovCi0gIHB1YmxpYyBSZXBvcnRDb250ZXh0IGdldFJlcG9ydENvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMucmVwb3J0Q29udGV4dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydCNzZXRSZXBvcnRDb250ZXh0KG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0Q29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcG9ydENvbnRleHQoUmVwb3J0Q29udGV4dCByZXBvcnRDb250ZXh0KQotICB7Ci0gICAgLy8gU2F2ZSBpbnB1dCByZWZlcmVuY2VzCi0gICAgdGhpcy5yZXBvcnRDb250ZXh0ID0gcmVwb3J0Q29udGV4dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydCNnZXRDdXJyZW50QXJ0aWZhY3QoKQotICAgKi8KLSAgcHVibGljIFJlcG9ydEFydGlmYWN0IGdldEN1cnJlbnRBcnRpZmFjdCgpCi0gIHsKLSAgICAvLyBSZXR1cm4gYXJ0aWZhY3QKLSAgICByZXR1cm4gdGhpcy5jdXJyZW50QXJ0aWZhY3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNzZXRDdXJyZW50QXJ0aWZhY3Qob3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnRBcnRpZmFjdCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRBcnRpZmFjdChSZXBvcnRBcnRpZmFjdCBhcnRpZmFjdCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJ0aWZhY3QKLSAgICBhcnRpZmFjdExpc3QuYWRkKGFydGlmYWN0KTsKLQotICAgIC8vIFNldCBhcyBjdXJyZW50IGFydGlmYWN0Ci0gICAgdGhpcy5jdXJyZW50QXJ0aWZhY3QgPSBhcnRpZmFjdDsKLQotICAgIC8vIFNldCBkZWZhdWx0IHByZXJlcSBwcm9jZXNzaW5nCi0gICAgdGhpcy5wcmVyZXFUeXBlID0gUFJFUkVRX1RZUEVfRU5UUlk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNlbmRDdXJyZW50QXJ0aWZhY3QoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kQ3VycmVudEFydGlmYWN0KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gUmVtb3ZlIGN1cnJlbnQgYXJ0aWZhY3QKLSAgICB0aGlzLmN1cnJlbnRBcnRpZmFjdCA9IG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNhZGRBcnRpZmFjdFJlZmVyZW5jZShvcmcud3NpLnRlc3QucmVwb3J0LkFydGlmYWN0UmVmZXJlbmNlKQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQXJ0aWZhY3RSZWZlcmVuY2UoQXJ0aWZhY3RSZWZlcmVuY2UgYXJ0aWZhY3RSZWZlcmVuY2UpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gQUREOiBIb3cgc2hvdWxkIHRoaXMgYmUgc2F2ZWQ/ICBTaG91bGQgaXQgYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgYXJ0aWZhY3Q/Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnQjZ2V0Q3VycmVudEVudHJ5KCkKLSAgICovCi0gIHB1YmxpYyBFbnRyeSBnZXRDdXJyZW50RW50cnkoKQotICB7Ci0gICAgLy8gUmV0dXJuIGVudHJ5Ci0gICAgcmV0dXJuIHRoaXMuY3VycmVudEVudHJ5OwotICB9Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydCNnZXRDdXJyZW50RW50cnkoKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEVudmVsb3BlRW50cnkoRW50cnkgZW50cnkpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNzZXRDdXJyZW50RW50cnkob3JnLndzaS50ZXN0LnJlcG9ydC5FbnRyeSkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRFbnRyeShFbnRyeSBlbnRyeSkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gU2F2ZSByZWZlcmVuY2UgdG8gZW50cnkKLSAgICBlbnRyeUxpc3QuYWRkKGVudHJ5KTsKLQotICAgIC8vIFNldCBhcyBjdXJyZW50IGVudHJ5Ci0gICAgdGhpcy5jdXJyZW50RW50cnkgPSBlbnRyeTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0RW50cmllcy4KLSAgICogQHJldHVybiBlbnRyeSBsaXN0LgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RW50cmllcygpCi0gIHsKLSAgICByZXR1cm4gZW50cnlMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRBcnRpZmFjdHMuCi0gICAqIEByZXR1cm4gYXJ0aWZhY3RzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QXJ0aWZhY3RzKCkKLSAgewotICAgIHJldHVybiBhcnRpZmFjdExpc3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNlbmRDdXJyZW50RW50cnkoKQotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kQ3VycmVudEVudHJ5KCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gUmVtb3ZlIGN1cnJlbnQgZW50cnkKLSAgICB0aGlzLmN1cnJlbnRFbnRyeSA9IG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNhZGRBc3NlcnRpb25SZXN1bHQob3JnLndzaS50ZXN0LnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRBc3NlcnRpb25SZXN1bHQoQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdCkKLSAgewotICAgIC8vIEFERDogTmVlZCB0byBrZWVwIGp1c3QgYSBzdW1tYXJ5IAotCi0gICAgLy8gQWRkIHJlc3VsdCB0byBjdXJyZW50IGVudHJ5Ci0gICAgaWYgKGN1cnJlbnRFbnRyeSAhPSBudWxsKQotICAgIHsKLSAgICAgIGN1cnJlbnRFbnRyeS5hZGRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uUmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgcmVzdWx0IHdhcyBub3QgcGFzc2VkLCB0aGVuIHNldCBzdW1tYXJ5IGZsYWcKLSAgICBpZiAoYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdCgpLmVxdWFscyhBc3NlcnRpb25SZXN1bHQuUkVTVUxUX0ZBSUxFRCkpCi0gICAgewotICAgICAgYWxsUGFzc2VkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjZ2V0QXNzZXJ0aW9uUmVzdWx0KGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uUmVzdWx0IGdldEFzc2VydGlvblJlc3VsdChTdHJpbmcgYXNzZXJ0aW9uSWQpCi0gIHsKLSAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0ID0gbnVsbDsKLQotICAgIC8vIERldGVybWluZSB3aGVyZSB0byBnZXQgdGhlIGFzc2VydGlvbiByZXN1bHQgZnJvbSAKLSAgICBpZiAodGhpcy5wcmVyZXFUeXBlLmVxdWFscyhQUkVSRVFfVFlQRV9FTlRSWSkpCi0gICAgICByZXN1bHQgPSBjdXJyZW50RW50cnkuZ2V0QXNzZXJ0aW9uUmVzdWx0KGFzc2VydGlvbklkKTsKLSAgICBlbHNlCi0gICAgICByZXN1bHQgPSBjdXJyZW50RW50cnkuZ2V0RW50cnlDb250YWluZXIoKS5nZXRBc3NlcnRpb25SZXN1bHQoYXNzZXJ0aW9uSWQpOwotCi0gICAgLy8gdGhlIGFzc2VydGlvbiByZXN1bHQgaXMgbm90IGZvdW5kIGF0IHRoZSBjdXJyZW50IGVudHJ5LCBnb2luZyB0aHJvdWdoIGFsbCB0aGUgZW50cmllcwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5TGlzdC5zaXplKCk7IGkgKyspCi0gICAgICB7Ci0gICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KSBlbnRyeUxpc3QuZ2V0KGkpOwotICAgICAgICBpZiAoKHJlc3VsdCA9IGVudHJ5LmdldEFzc2VydGlvblJlc3VsdChhc3NlcnRpb25JZCkpICE9IG51bGwpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNjcmVhdGVBc3NlcnRpb25SZXN1bHQoKQotICAgKi8KLSAgcHVibGljIEFzc2VydGlvblJlc3VsdCBjcmVhdGVBc3NlcnRpb25SZXN1bHQoKQotICB7Ci0gICAgQXNzZXJ0aW9uUmVzdWx0IGFzc2VydGlvblJlc3VsdCA9IG5ldyBBc3NlcnRpb25SZXN1bHRJbXBsKCk7Ci0gICAgYXNzZXJ0aW9uUmVzdWx0LnNldEFzc2VydGlvblJlc3VsdHNPcHRpb24oCi0gICAgICByZXBvcnRDb250ZXh0Ci0gICAgICAgIC5nZXRBbmFseXplcigpCi0gICAgICAgIC5nZXRBbmFseXplckNvbmZpZygpCi0gICAgICAgIC5nZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKCkpOwotICAgIHJldHVybiBhc3NlcnRpb25SZXN1bHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNjcmVhdGVFbnRyeSgpCi0gICAqLwotICBwdWJsaWMgRW50cnkgY3JlYXRlRW50cnkoKQotICB7Ci0gICAgRW50cnkgZW50cnkgPSBuZXcgRW50cnlJbXBsKCk7Ci0gICAgLy9lbnRyeS5zZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKHJlcG9ydENvbnRleHQuZ2V0QW5hbHl6ZXIoKS5nZXRBbmFseXplckNvbmZpZygpLmdldEFzc2VydGlvblJlc3VsdHNPcHRpb24oKSk7Ci0gICAgcmV0dXJuIGVudHJ5OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjY3JlYXRlRW50cnlDb250YWluZXIoKQotICAgKi8KLSAgcHVibGljIEVudHJ5Q29udGFpbmVyIGNyZWF0ZUVudHJ5Q29udGFpbmVyKCkKLSAgewotICAgIEVudHJ5Q29udGFpbmVyIGVudHJ5Q29udGFpbmVyID0gbmV3IEVudHJ5Q29udGFpbmVySW1wbCgpOwotICAgIHJldHVybiBlbnRyeUNvbnRhaW5lcjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LkJ1aWxkUmVwb3J0I2NyZWF0ZUFydGlmYWN0KCkKLSAgICovCi0gIHB1YmxpYyBSZXBvcnRBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpCi0gIHsKLSAgICBSZXBvcnRBcnRpZmFjdCByZXBvcnRBcnRpZmFjdCA9IG5ldyBSZXBvcnRBcnRpZmFjdEltcGwoKTsKLSAgICByZXR1cm4gcmVwb3J0QXJ0aWZhY3Q7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5CdWlsZFJlcG9ydCNjcmVhdGVGYWlsdXJlRGV0YWlsKCkKLSAgICovCi0gIHB1YmxpYyBGYWlsdXJlRGV0YWlsIGNyZWF0ZUZhaWx1cmVEZXRhaWwoKQotICB7Ci0gICAgRmFpbHVyZURldGFpbCBmYWlsdXJlRGV0YWlsID0gbmV3IEZhaWx1cmVEZXRhaWxJbXBsKCk7Ci0gICAgcmV0dXJuIGZhaWx1cmVEZXRhaWw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnQjZ2V0U3VtbWFyeVJlc3VsdCgpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnlSZXN1bHQoKQotICB7Ci0gICAgcmV0dXJuICgKLSAgICAgIGFsbFBhc3NlZAotICAgICAgICA/IEFzc2VydGlvblJlc3VsdC5SRVNVTFRfUEFTU0VECi0gICAgICAgIDogQXNzZXJ0aW9uUmVzdWx0LlJFU1VMVF9GQUlMRUQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuQnVpbGRSZXBvcnQjc2V0UHJlcmVxVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UHJlcmVxVHlwZShTdHJpbmcgcHJlcmVxVHlwZSkKLSAgewotICAgIHRoaXMucHJlcmVxVHlwZSA9IHByZXJlcVR5cGU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIC8vIEFERDogCi0gICAgcmV0dXJuICJSZXBvcnQ6ICAiOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0I2dldFN0YXJ0WE1MU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFN0YXJ0WE1MU3RyaW5nKFN0cmluZyBuYW1lc3BhY2VOYW1lKQotICB7Ci0gICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQotICAgIFN0cmluZyBuc05hbWUgPSBuYW1lc3BhY2VOYW1lOwotICAgIGlmICgoIW5zTmFtZS5lcXVhbHMoIiIpICYmICghbnNOYW1lLmVuZHNXaXRoKCI6IikpKSkKLSAgICAgIG5zTmFtZSArPSAiOiI7Ci0KLSAgICAvLyBDcmVhdGUgcmVwb3J0IGVsZW1lbnQgCi0gICAgcHcucHJpbnRsbihXU0lDb25zdGFudHMuWE1MX0RFQ0wpOwotICAgIHB3LnByaW50bG4oCi0gICAgICByZXBvcnRDb250ZXh0Ci0gICAgICAgIC5nZXRBbmFseXplcigpCi0gICAgICAgIC5nZXRBbmFseXplckNvbmZpZygpCi0gICAgICAgIC5nZXRBZGRTdHlsZVNoZWV0KCkKLSAgICAgICAgLmdldFN0eWxlU2hlZXRTdHJpbmcoKSk7Ci0KLSAgICAvLyBBZGQgWE1MIGNvbW1lbnQKLSAgICBTdHJpbmcgY29tbWVudDsKLSAgICBpZiAoKGNvbW1lbnQgPSBUZXN0VXRpbHMuZ2V0WE1MQ29tbWVudCgpKSAhPSBudWxsKQotICAgICAgcHcucHJpbnQoY29tbWVudCk7Ci0KLSAgICAvLyByZXBvcnQKLSAgICBwdy5wcmludCgKLSAgICAgICI8IgotICAgICAgICArIG5zTmFtZQotICAgICAgICArIEVMRU1fTkFNRQotICAgICAgICArICIgIgotICAgICAgICArIFdTSUNvbnN0YW50cy5BVFRSX05BTUUKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIHJlcG9ydENvbnRleHQuZ2V0UmVwb3J0VGl0bGUoKQotICAgICAgICArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgICIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuQVRUUl9USU1FU1RBTVAKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIFV0aWxzLmdldFRpbWVzdGFtcCgpCi0gICAgICAgICsgIlwiIik7Ci0gICAgcHcucHJpbnRsbigiICAgIHhtbG5zPVwiIiArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX1JFUE9SVCArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgIHhtbG5zOiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfUkVQT1JUCi0gICAgICAgICsgIj1cIiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9SRVBPUlQKLSAgICAgICAgKyAiXCIiKTsKLSAgICBwdy5wcmludGxuKAotICAgICAgIiAgICB4bWxuczoiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX0xPRwotICAgICAgICArICI9XCIiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfTE9HCi0gICAgICAgICsgIlwiIik7Ci0gICAgLy9wdy5wcmludGxuKCIgICAgeG1sbnM6IiArIFdTSUNvbnN0YW50cy5OU19OQU1FX1dTSV9DT01NT04gKyAiPVwiIiArIFdTSUNvbnN0YW50cy5OU19VUklfV1NJX0NPTU1PTiArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgIHhtbG5zOiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfQU5BTFlaRVJfQ09ORklHCi0gICAgICAgICsgIj1cIiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9BTkFMWVpFUl9DT05GSUcKLSAgICAgICAgKyAiXCIiKTsKLSAgICBwdy5wcmludGxuKAotICAgICAgIiAgICB4bWxuczoiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX05BTUVfV1NJX01PTklUT1JfQ09ORklHCi0gICAgICAgICsgIj1cIiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfVVJJX1dTSV9NT05JVE9SX0NPTkZJRwotICAgICAgICArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgIHhtbG5zOiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9XU0lfQVNTRVJUSU9OUwotICAgICAgICArICI9XCIiCi0gICAgICAgICsgV1NJQ29uc3RhbnRzLk5TX1VSSV9XU0lfQVNTRVJUSU9OUwotICAgICAgICArICJcIiIpOwotICAgIHB3LnByaW50bG4oCi0gICAgICAiICAgIHhtbG5zOiIKLSAgICAgICAgKyBXU0lDb25zdGFudHMuTlNfTkFNRV9YU0kKLSAgICAgICAgKyAiPVwiIgotICAgICAgICArIFdTSUNvbnN0YW50cy5OU19VUklfWFNJCi0gICAgICAgICsgIlwiPiIpOwotCi0gICAgLy8gQWRkICBhbmFseXplciB0b29sIGluZm8KLSAgICBwdy5wcmludChyZXBvcnRDb250ZXh0LmdldEFuYWx5emVyKCkudG9YTUxTdHJpbmcobnNOYW1lKSk7Ci0KLSAgICAvLyBSZXR1cm4gWE1MIHN0cmluZwotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5yZXBvcnQuUmVwb3J0I2dldEVuZFhNTFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRFbmRYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgU3RyaW5nIG5zTmFtZSA9IG5hbWVzcGFjZU5hbWU7Ci0gICAgaWYgKCghbnNOYW1lLmVxdWFscygiIikgJiYgKCFuc05hbWUuZW5kc1dpdGgoIjoiKSkpKQotICAgICAgbnNOYW1lICs9ICI6IjsKLQotICAgIC8vIEJ1aWxkIHN1bW1hcnkKLSAgICBwdy5wcmludCgiICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX1NVTU1BUlkgKyAiICIpOwotICAgIHB3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfUkVTVUxUICsgIj1cIiIgKyBnZXRTdW1tYXJ5UmVzdWx0KCkgKyAiXCI+Iik7Ci0KLSAgICAvLyBBREQ6ICBEZXRhaWwgc3VtbWFyeQotICAgIC8qCi0gICAgcHcucHJpbnQoIiAgICA8IiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0FSVElGQUNUX1NVTU1BUlkgKyAiICIpOwotICAgIHB3LnByaW50bG4oV1NJQ29uc3RhbnRzLkFUVFJfUkVTVUxUICsgIj1cInh4eHhcIj4iKTsKLSAgICAKLSAgICBwdy5wcmludGxuKCIgICAgPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fQVJUSUZBQ1RfU1VNTUFSWSArICI+Iik7Ci0gICAgKi8KLQotICAgIC8vIEVuZCBlbGVtZW50IAotICAgIHB3LnByaW50bG4oIiAgPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fU1VNTUFSWSArICI+Iik7Ci0KLSAgICAvLyBFbmQgcmVwb3J0IGVsZW1lbnQgCi0gICAgcHcucHJpbnRsbigiPC8iICsgbnNOYW1lICsgRUxFTV9OQU1FICsgIj4iKTsKLQotICAgIC8vIFJldHVybiBYTUwgc3RyaW5nCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS50ZXN0LnJlcG9ydC5SZXBvcnQjZ2V0RXJyb3JYTUxTdHJpbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JYTUxTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZU5hbWUsIFN0cmluZyBlcnJvckRldGFpbCkKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICBTdHJpbmcgbnNOYW1lID0gbmFtZXNwYWNlTmFtZTsKLSAgICBpZiAoKCFuc05hbWUuZXF1YWxzKCIiKSAmJiAoIW5zTmFtZS5lbmRzV2l0aCgiOiIpKSkpCi0gICAgICBuc05hbWUgKz0gIjoiOwotCi0gICAgLy8gQnVpbGQgYW5hbHl6ZXIgZmFpbHVyZQotICAgIHB3LnByaW50bG4oIiAgPCIgKyBuc05hbWUgKyBXU0lDb25zdGFudHMuRUxFTV9BTkFMWVpFUl9GQUlMVVJFICsgIj4iKTsKLQotICAgIC8vIEFkZCBlcnJvciBkZXRhaWwKLSAgICBwdy5wcmludCgiICAgIDwiICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fRkFJTFVSRV9ERVRBSUwgKyAiPiIpOwotICAgIHB3LnByaW50KFhNTFV0aWxzLnhtbEVzY2FwZWRTdHJpbmcoZXJyb3JEZXRhaWwpKTsKLSAgICBwdy5wcmludGxuKCIgICAgPC8iICsgbnNOYW1lICsgV1NJQ29uc3RhbnRzLkVMRU1fRkFJTFVSRV9ERVRBSUwgKyAiPiIpOwotCi0gICAgLy8gRW5kIHJlcG9ydCBlbGVtZW50IAotICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIFdTSUNvbnN0YW50cy5FTEVNX0FOQUxZWkVSX0ZBSUxVUkUgKyAiPiIpOwotCi0gICAgLy8gRW5kIHJlcG9ydCBlbGVtZW50IAotICAgIHB3LnByaW50bG4oIjwvIiArIG5zTmFtZSArIEVMRU1fTkFNRSArICI+Iik7Ci0KLSAgICAvLyBSZXR1cm4gWE1MIHN0cmluZwotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kudGVzdC5kb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQjdG9YTUxTdHJpbmcoamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSkKLSAgewotICAgIHJldHVybiBnZXRTdGFydFhNTFN0cmluZyhuYW1lc3BhY2VOYW1lKSArIGdldEVuZFhNTFN0cmluZyhuYW1lc3BhY2VOYW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1JlcG9ydFdyaXRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS9yZXBvcnQvaW1wbC9SZXBvcnRXcml0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTA0OWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3JlcG9ydC9pbXBsL1JlcG9ydFdyaXRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuaW1wbC5Eb2N1bWVudFdyaXRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnRXcml0ZXI7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgaW50ZXJmYWNlIHVzZWQgdG8gd3JpdGUgdGhlIENvbmZvcm1hbmNlIFhNTCBkb2N1bWVudHMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydFdyaXRlckltcGwKLSAgZXh0ZW5kcyBEb2N1bWVudFdyaXRlckltcGwKLSAgaW1wbGVtZW50cyBSZXBvcnRXcml0ZXIKLXsKLSAgLyoqCi0gICAqIFJlcG9ydCB3cml0ZXIuCi0gICAqLwotICBwdWJsaWMgUmVwb3J0V3JpdGVySW1wbCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCB1c2luZyB0aGUgd3JpdGVyCi0gICAqIHRoYXQgd2FzIHByZXZpb3VzbHkgc2V0IHVzaW5nIHRoZSBzZXRXcml0ZXIgbWV0aG9kLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVwb3J0IHJlcG9ydCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gSWYgd3JpdGVyIHdhcyBub3Qgc2V0IHByZXZpb3VzbHksIHRoZW4gdGhyb3cgZXhjZXB0aW9uCi0gICAgaWYgKHdyaXRlciA9PSBudWxsKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlcG9ydCB3cml0ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgcmVwb3J0LiIpOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHJlcG9ydAotICAgIHdyaXRlKHJlcG9ydCwgdGhpcy53cml0ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVwb3J0IHJlcG9ydCwgV3JpdGVyIHdyaXRlcikKLSAgewotICAgIC8vIENyZWF0ZSBwcmludCB3cml0ZXIKLSAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcih3cml0ZXIpOwotCi0gICAgLy8gQUREOiBXcml0ZSBvdXQgY29tcGxldGUgcmVwb3J0Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS90b29saW5mby5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Rvb2xpbmZvLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMzA0YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3Rvb2xpbmZvLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNICAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqLwotCi13c2kudG9vbC52ZXJzaW9uPTEuMC4wCi13c2kudG9vbC5yZWxlYXNlLmRhdGU9MjAwNS0wNC0xNQotd3NpLnRvb2wuaW1wbGVtZW50ZXI9RWNsaXBzZS5vcmcgT3JnYW5pemF0aW9uCi13c2kudG9vbC5sb2NhdGlvbj1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dzdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvQXJ0aWZhY3RUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9BcnRpZmFjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiZGQ0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9BcnRpZmFjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIC4uLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RUeXBlCi17Ci0gIC8qKgotICAgKiBUaGlzIHR5cGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0eXBlOwotCi0gIC8qKgotICAgKiBSZXBvcnRBcnRpZmFjdCB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRU5WRUxPUEUgPSAiZW52ZWxvcGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FU1NBR0UgPSAibWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RJU0NPVkVSWSA9ICJkaXNjb3ZlcnkiOwotCi0gIC8qKgotICAgKiBSZXBvcnRBcnRpZmFjdCB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJ0aWZhY3RUeXBlIEFSVElGQUNUX1RZUEVfRU5WRUxPUEUgPQotICAgIG5ldyBBcnRpZmFjdFR5cGUoVFlQRV9FTlZFTE9QRSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJ0aWZhY3RUeXBlIEFSVElGQUNUX1RZUEVfTUVTU0FHRSA9Ci0gICAgbmV3IEFydGlmYWN0VHlwZShUWVBFX01FU1NBR0UpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFydGlmYWN0VHlwZSBBUlRJRkFDVF9UWVBFX0RFU0NSSVBUSU9OID0KLSAgICBuZXcgQXJ0aWZhY3RUeXBlKFRZUEVfREVTQ1JJUFRJT04pOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEFydGlmYWN0VHlwZSBBUlRJRkFDVF9UWVBFX0RJU0NPVkVSWSA9Ci0gICAgbmV3IEFydGlmYWN0VHlwZShUWVBFX0RJU0NPVkVSWSk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhcnRpZmFjdCB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBBcnRpZmFjdFR5cGUoU3RyaW5nIHR5cGUpCi0gIHsKLSAgICB0aGlzLnR5cGUgPSB0eXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIGFydGlmYWN0IHR5cGUgZW52ZWxvcGUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhcnRpZmFjdCB0eXBlIGVudmVsb3BlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbnZlbG9wZSgpCi0gIHsKLSAgICByZXR1cm4gdHlwZS5lcXVhbHMoVFlQRV9FTlZFTE9QRSk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgYXJ0aWZhY3QgdHlwZSBtZXNzYWdlcy4KLSAgICogQHJldHVybiB0cnVlIGlmIGFydGlmYWN0IHR5cGUgbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VzKCkKLSAgewotICAgIHJldHVybiB0eXBlLmVxdWFscyhUWVBFX01FU1NBR0UpOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIGFydGlmYWN0IHR5cGUgZGVzY3JpcHRpb24uCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhcnRpZmFjdCB0eXBlIGRlc2NyaXB0aW9uLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNEZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gdHlwZS5lcXVhbHMoVFlQRV9ERVNDUklQVElPTik7Ci0gIH0KLQotICAvKioKLSAgICogSXMgYXJ0aWZhY3QgdHlwZSBkaXNjb3ZlcnkuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBhcnRpZmFjdCB0eXBlIGRpc2NvdmVyeS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRGlzY292ZXJ5KCkKLSAgewotICAgIHJldHVybiB0eXBlLmVxdWFscyhUWVBFX0RJU0NPVkVSWSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFydGlmYWN0IHR5cGUuCi0gICAqIEByZXR1cm4gYXJ0aWZhY3QgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGFydGlmYWN0IHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlTmFtZSBhcnRpZmFjdCB0eXBlIG5hbWUuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCBhcnRpZmFjdCB0eXBlLgotICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgYXJ0aWZhY3QgdHlwZSBuYW1lIGlzIGludmFsaWQgb3IgaW5hcHByb3ByaWF0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQXJ0aWZhY3RUeXBlIG5ld0FydGlmYWN0VHlwZShTdHJpbmcgdHlwZU5hbWUpCi0gICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLSAgewotICAgIEFydGlmYWN0VHlwZSBhcnRpZmFjdFR5cGUgPSBudWxsOwotCi0gICAgaWYgKHR5cGVOYW1lLmVxdWFscyhUWVBFX0RFU0NSSVBUSU9OKSkKLSAgICB7Ci0gICAgICBhcnRpZmFjdFR5cGUgPSBBUlRJRkFDVF9UWVBFX0RFU0NSSVBUSU9OOwotICAgIH0KLQotICAgIGVsc2UgaWYgKHR5cGVOYW1lLmVxdWFscyhUWVBFX01FU1NBR0UpKQotICAgIHsKLSAgICAgIGFydGlmYWN0VHlwZSA9IEFSVElGQUNUX1RZUEVfTUVTU0FHRTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoVFlQRV9FTlZFTE9QRSkpCi0gICAgewotICAgICAgYXJ0aWZhY3RUeXBlID0gQVJUSUZBQ1RfVFlQRV9FTlZFTE9QRTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICh0eXBlTmFtZS5lcXVhbHMoVFlQRV9ESVNDT1ZFUlkpKQotICAgIHsKLSAgICAgIGFydGlmYWN0VHlwZSA9IEFSVElGQUNUX1RZUEVfRElTQ09WRVJZOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgbmV3IGFydGlmYWN0IHR5cGUgdXNpbmcgaW52YWxpZCB0eXBlIG5hbWU6ICIKLSAgICAgICAgICArIHR5cGVOYW1lCi0gICAgICAgICAgKyAiLiIpOwotICAgIH0KLQotICAgIHJldHVybiBhcnRpZmFjdFR5cGU7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9CYXNpY1J1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9CYXNpY1J1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Mzk1NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvQmFzaWNSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdmFsaWRhdGVzIGJhc2ljIGNvbnN0cnVjdHMgb2YgUkZDIDI2MTYuCi0gKiAKLSAqIEBhdXRob3IgVm9sb2RpbgotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNSdWxlcwotewotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDUiA9IDEzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTEYgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNQID0gMzI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBIVCA9IDk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBEUSA9IDM0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkxGID0gIiIgKyBDUiArIExGOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFNFUEFSQVRPUlMgPQotICAgIHsKLSAgICAgICcoJywKLSAgICAgICcpJywKLSAgICAgICc8JywKLSAgICAgICc+JywKLSAgICAgICdAJywKLSAgICAgICcsJywKLSAgICAgICc7JywKLSAgICAgICc6JywKLSAgICAgICdcXCcsCi0gICAgICAnXCInLAotICAgICAgJy8nLAotICAgICAgJ1snLAotICAgICAgJ10nLAotICAgICAgJz8nLAotICAgICAgJz0nLAotICAgICAgJ3snLAotICAgICAgJ30nLAotICAgICAgU1AsCi0gICAgICBIVCB9OwotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlLgotICAgKiAJCU9DVEVUID0gJmx0O2FueSA4LWJpdCBzZXF1ZW5jZSBvZiBkYXRhJmd0OwotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc09DVEVUKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCUNIQVIgPSAmbHQ7YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpJmd0Oy4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDSEFSKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKGNoID49IDAgJiYgY2ggPD0gMTI3KSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCVVQQUxQSEEgPSAmbHQ7YW55IFVTLUFTQ0lJIHVwcGVyY2FzZSBsZXR0ZXIgIkEiLi4iWiImZ3Q7LgotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VQQUxQSEEoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykgPyB0cnVlIDogZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlMT0FMUEhBID0gJmx0O2FueSBVUy1BU0NJSSBsb3dlcmNhc2UgbGV0dGVyICJhIi4uInoiJmd0Oy4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMT0FMUEhBKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSAneicpID8gdHJ1ZSA6IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJQUxQSEEgPSBVUEFMUEhBIHwgTE9BTFBIQS4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBTFBIQShjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChpc0xPQUxQSEEoY2gpIHx8IGlzVVBBTFBIQShjaCkpID8gdHJ1ZSA6IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJRElHSVQgPSAmbHQ7YW55IFVTLUFTQ0lJIGRpZ2l0ICIwIi4uIjkiJmd0Oy4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNESUdJVChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCUNUTCA9ICZsdDthbnkgVVMtQVNDSUkgY29udHJvbCBjaGFyYWN0ZXIgKG9jdGV0cyAwIC0gMzEpIGFuZCBERUwgKDEyNykmZ3Q7LgotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NUTChjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuICgoY2ggPj0gMCAmJiBjaCA8PSAzMSkgfHwgY2ggPT0gMTI3KSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCUNSID0gJmx0O1VTLUFTQ0lJIENSLCBjYXJyaWFnZSByZXR1cm4gKDEzKSZndDsuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIuCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ1IoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPT0gQ1IpID8gdHJ1ZSA6IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJTEYgPSAmbHQ7VVMtQVNDSUkgTEYsIGxpbmVmZWVkICgxMCkmZ3Q7LgotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMRihjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA9PSBMRikgPyB0cnVlIDogZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlTUCA9ICZsdDtVUy1BU0NJSSBTUCwgc3BhY2UgKDMyKSZndDsuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIuCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU1AoY2hhciBjaCkKLSAgewotICAgIHJldHVybiAoY2ggPT0gU1ApID8gdHJ1ZSA6IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJSFQgPSAmbHQ7VVMtQVNDSUkgSFQsIGhvcml6b250YWwtdGFiICg5KSZndDsuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIKLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hUKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKGNoID09IEhUKSA/IHRydWUgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCSZsdDsiJmd0OyA9ICZsdDtVUy1BU0NJSSBkb3VibGUtcXVvdGUgbWFyayAoMzQpJmd0Oy4KLSAgICogQHBhcmFtIGNoIGNoYXJhY3Rlci4KLSAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgY2ggaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb3VibGVRdW90ZShjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIChjaCA9PSBEUSkgPyB0cnVlIDogZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlDUkxGID0gQ1IgTEYuCi0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NSTEYoU3RyaW5nIHN0cikKLSAgewotICAgIHJldHVybiBDUkxGLmVxdWFscyhzdHIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJTFdTID0gW0NSTEZdIDEqKCBTUCB8IEhUICkuCi0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBzdHIgaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMV1MoU3RyaW5nIHN0cikKLSAgewotCi0gICAgaW50IGluZGV4ID0gZ2V0TGFzdEluZGV4TFdTKHN0ciwgMCk7Ci0gICAgaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ICE9IHN0ci5sZW5ndGgoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBpbmRleCBvZiB0aGUgTFdTIHN0cmluZy4KLSAgICogQHBhcmFtIHN0ciBzdHJpbmcuCi0gICAqIEBwYXJhbSBzdGFydEluZGV4IHN0YXJ0IGluZGV4LgotICAgKiBAcmV0dXJuIGludCBhbiBpbmRleCBvZiB0aGUgZmlyc3Qgc3ltYm9sIHdoaWNoIGlzbid0IExXUy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldExhc3RJbmRleExXUyhTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIGludCBpbmRleCA9IHN0ci5pbmRleE9mKENSTEYsIHN0YXJ0SW5kZXgpOwotICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICBlbHNlIGlmIChpbmRleCA9PSBzdGFydEluZGV4KQotICAgICAgaW5kZXggKz0gQ1JMRi5sZW5ndGgoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoIWlzU1Aoc3RyLmNoYXJBdChpbmRleCkpICYmIGlzSFQoc3RyLmNoYXJBdChpbmRleCkpKQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgaW5kZXgrKzsKLSAgICBmb3IgKDsgaW5kZXggPCBzdHIubGVuZ3RoKCk7IGluZGV4KyspCi0gICAgICBpZiAoIWlzU1Aoc3RyLmNoYXJBdChpbmRleCkpICYmIGlzSFQoc3RyLmNoYXJBdChpbmRleCkpKQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBpbmRleCBvZiB0aGUgVEVYVCBzdHJpbmcuCi0gICAqIFRFWFQgPSAmbHQ7YW55IE9DVEVUIGV4Y2VwdCBDVExzLCBidXQgaW5jbHVkaW5nIExXUyZndDsKLSAgICogQHBhcmFtIHN0ciBzdHJpbmcuCi0gICAqIEBwYXJhbSBzdGFydEluZGV4IHN0YXJ0IGluZGV4LgotICAgKiBAcmV0dXJuIGludCBhbiBpbmRleCBvZiB0aGUgZmlyc3Qgc3ltYm9sIHdoaWNoIGlzbid0IFRFWFQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRMYXN0VEVYVChTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIGludCBpbmRleDsKLSAgICBmb3IgKGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPCBzdHIubGVuZ3RoKCk7IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKCFpc09DVEVUKHN0ci5jaGFyQXQoaW5kZXgpKSkKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgaWYgKGlzQ1RMKHN0ci5jaGFyQXQoaW5kZXgpKSkKLSAgICAgIHsKLSAgICAgICAgaW50IGxhc3RMV1MgPSBnZXRMYXN0SW5kZXhMV1Moc3RyLCBpbmRleCk7Ci0gICAgICAgIGlmIChsYXN0TFdTID09IC0xKQotICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgaW5kZXggPSBsYXN0TFdTIC0gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNraW5nIHJ1bGU6Ci0gICAqIAkJSEVYID0gIkEiIHwgIkIiIHwgIkMiIHwgIkQiIHwgIkUiIHwgIkYiIHwgImEiIHwgImIiIHwgImMiIHwgImQiIHwgImUiIHwgImYiIHwgRElHSVQuCi0gICAqIEBwYXJhbSBjaCBjaGFyYWN0ZXIuCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIGNoIGlzIGNvbmZvcm0gdG8gcnVsZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSEVYKGNoYXIgY2gpCi0gIHsKLSAgICByZXR1cm4gKAotICAgICAgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpIHx8IChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB8fCBpc0RJR0lUKGNoKSkKLSAgICAgID8gdHJ1ZQotICAgICAgOiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCXRva2VuID0gMSombHQ7YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycyZndDsuCi0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBzdHIgaXMgY29uZm9ybSB0byBydWxlLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUb2tlbihTdHJpbmcgc3RyKQotICB7Ci0gICAgaWYgKHN0ci5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHN0ci5sZW5ndGgoKTsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpbmRleCk7Ci0gICAgICBpZiAoIWlzQ0hBUihjaCkgfHwgaXNTRVBBUkFUT1IoY2gpIHx8IGlzQ1RMKGNoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBsYXN0IGluZGV4IG9mIHRoZSAidG9rZW4iIHN0cmluZy4KLSAgICogQHBhcmFtIHN0ciBzdHJpbmcuCi0gICAqIEBwYXJhbSBzdGFydEluZGV4IHN0YXJ0IGluZGV4LgotICAgKiBAcmV0dXJuIGludCBhbiBpbmRleCBvZiB0aGUgZmlyc3Qgc3ltYm9sIHdoaWNoIGlzbid0ICJ0b2tlbiIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRMYXN0VG9rZW4oU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGZvciAoOyBpbmRleCA8IHN0ci5sZW5ndGgoKTsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpbmRleCk7Ci0gICAgICBpZiAoIWlzQ0hBUihjaCkgfHwgaXNTRVBBUkFUT1IoY2gpIHx8IGlzQ1RMKGNoKSkKLSAgICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgfQotICAgIHJldHVybiBpbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja2luZyBydWxlOgotICAgKiAJCXNlcGFyYXRvcnMgPSAiKCIgfCAiKSIgfCAiPCIgfCAiPiIgfCAiQCIKLSAgICAgKiAgICAgICAgICAgICAgICAgfCAiLCIgfCAiOyIgfCAiOiIgfCAiXCIgfCA8Ij4KLSAgICAgKiAgICAgICAgICAgICAgICAgfCAiLyIgfCAiWyIgfCAiXSIgfCAiPyIgfCAiPSIKLSAgICAgKiAgICAgICAgICAgICAgICAgfCAieyIgfCAifSIgfCBTUCB8IEhULgotICAgKiBAcGFyYW0gY2ggY2hhcmFjdGVyLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBjaCBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NFUEFSQVRPUihjaGFyIGNoKQotICB7Ci0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IFNFUEFSQVRPUlMubGVuZ3RoOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChjaCA9PSBTRVBBUkFUT1JTW2luZGV4XSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGxhc3QgaW5kZXggb2YgdGhlICJjb21tZW50IiBzdHJpbmcuCi0gICAqIAkJY29tbWVudCA9ICIoIiAqKCBjdGV4dCB8IHF1b3RlZC1wYWlyIHwgY29tbWVudCApICIpIi4KLSAgICogQHBhcmFtIHN0ciBzdHJpbmcuCi0gICAqIEBwYXJhbSBzdGFydEluZGV4IHN0YXJ0IGluZGV4LgotICAgKiBAcmV0dXJuIGludCBhbiBpbmRleCBvZiB0aGUgZmlyc3Qgc3ltYm9sIHdoaWNoIGlzbid0ICJjb21tZW50Ii4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldExhc3RDb21tZW50KFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0KLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGlmIChzdHIubGVuZ3RoKCkgPD0gc3RhcnRJbmRleCkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnKCcpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIGJvb2xlYW4gYkV4aXQgPSBmYWxzZTsKLSAgICBib29sZWFuIGJRdW90ZWRQYWlyID0gZmFsc2U7Ci0gICAgaW50IGlkeCA9IHN0YXJ0SW5kZXggKyAxOwotICAgIHdoaWxlIChiRXhpdCA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICB3aGlsZSAoYlF1b3RlZFBhaXIgPT0gZmFsc2UpCi0gICAgICB7Ci0gICAgICAgIGlkeCA9IGdldExhc3RDdGV4dChzdHIsIGlkeCk7Ci0gICAgICAgIGlmIChpZHggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICAgIHJldHVybiBpZHg7Ci0gICAgICAgIGlmICghaXNRdW90ZWRQYWlyKHN0ciwgaWR4IC0gMSkpCi0gICAgICAgICAgYlF1b3RlZFBhaXIgPSB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaWR4Kys7Ci0gICAgICB9Ci0gICAgICBpZiAoc3RyLmNoYXJBdChpZHgpID09ICcoJykKLSAgICAgIHsKLSAgICAgICAgaW50IGlkeE5ldyA9IGdldExhc3RDb21tZW50KHN0ciwgaWR4KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHN0ci5jaGFyQXQoaWR4KSA9PSAnKScpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBpZHggKyAxOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBpZHg7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBsYXN0IGluZGV4IG9mIHRoZSAiY3RleHQiIHN0cmluZy4KLSAgICogCQljdGV4dCA9ICZsdDthbnkgVEVYVCBleGNsdWRpbmcgIigiIGFuZCAiKSImZ3Q7Ci0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcGFyYW0gc3RhcnRJbmRleCBzdGFydCBpbmRleC4KLSAgICogQHJldHVybiBpbnQgYW4gaW5kZXggb2YgdGhlIGZpcnN0IHN5bWJvbCB3aGljaCBpc24ndCAiY3RleHQiLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExhc3RDdGV4dChTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIGludCBpZHggPSBnZXRMYXN0VEVYVChzdHIsIHN0YXJ0SW5kZXgpOwotICAgIGludCBpQnJhY2tldCA9IHN0YXJ0SW5kZXg7Ci0gICAgZm9yICg7IGlCcmFja2V0IDwgaWR4OyBpQnJhY2tldCsrKQotICAgIHsKLSAgICAgIGlmIChzdHIuY2hhckF0KGlCcmFja2V0KSA9PSAnKCcgfHwgc3RyLmNoYXJBdChpQnJhY2tldCkgPT0gJyknKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGlCcmFja2V0IDwgaWR4KQotICAgICAgaWR4ID0gaUJyYWNrZXQ7Ci0gICAgcmV0dXJuIGlkeDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGxhc3QgaW5kZXggb2YgdGhlICJxZHRleHQiIHN0cmluZy4KLSAgICogCQlxZHRleHQgPSAmbHQ7YW55IFRFWFQgZXhjZXB0ICZsdDsiJmd0OyZndDsKLSAgICogQHBhcmFtIHN0ciBzdHJpbmcuCi0gICAqIEBwYXJhbSBzdGFydEluZGV4IHN0YXJ0IGluZGV4LgotICAgKiBAcmV0dXJuIGludCBhbiBpbmRleCBvZiB0aGUgZmlyc3Qgc3ltYm9sIHdoaWNoIGlzbid0ICJxZHRleHQiLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExhc3RRZHRleHQoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaWR4ID0gZ2V0TGFzdFRFWFQoc3RyLCBzdGFydEluZGV4KTsKLSAgICBpbnQgaUJyYWNrZXQgPSBzdGFydEluZGV4OwotICAgIGZvciAoOyBpQnJhY2tldCA8IGlkeDsgaUJyYWNrZXQrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyLmNoYXJBdChpQnJhY2tldCkgPT0gJ1wiJykKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChpQnJhY2tldCA8IGlkeCkKLSAgICAgIGlkeCA9IGlCcmFja2V0OwotICAgIHJldHVybiBpZHg7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tpbmcgcnVsZToKLSAgICogCQlxdW90ZWQtcGFpciA9ICJcIiBDSEFSLgotICAgKiBAcGFyYW0gc3RyIHN0cmluZy4KLSAgICogQHBhcmFtIHN0YXJ0SW5kZXggc3RhcnQgaW5kZXguCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHN0ciBpcyBjb25mb3JtIHRvIHJ1bGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlZFBhaXIoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpZiAoc3RyLmxlbmd0aCgpID49IHN0YXJ0SW5kZXggKyAyCi0gICAgICAmJiBzdHIuY2hhckF0KHN0YXJ0SW5kZXgpID09ICdcXCcKLSAgICAgICYmIGlzQ0hBUihzdHIuY2hhckF0KHN0YXJ0SW5kZXggKyAxKSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBsYXN0IGluZGV4IG9mIHRoZSAicXVvdGVkLXN0cmluZyIgc3RyaW5nLgotICAgKiAJCXF1b3RlZC1zdHJpbmcgID0gKCAmbHQ7IiZndDsgKihxZHRleHQgfCBxdW90ZWQtcGFpciApICZsdDsiJmd0OyApCi0gICAqIEBwYXJhbSBzdHIgc3RyaW5nLgotICAgKiBAcGFyYW0gc3RhcnRJbmRleCBzdGFydCBpbmRleC4KLSAgICogQHJldHVybiBpbnQgYW4gaW5kZXggb2YgdGhlIGZpcnN0IHN5bWJvbCB3aGljaCBpc24ndCAicXVvdGVkLXN0cmluZyIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBnZXRMYXN0UXVvdGVkU3RyaW5nKFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0KLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGludCBuZXdJbmRleCA9IDA7Ci0KLSAgICAvLyBpZiBlbmQgaWYgdGhlIHN0cmluZwotICAgIGlmIChzdGFydEluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIC8vIGlmIHRoZSBiZWdpbiBpcyBub3QgJyInCi0gICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9IERRKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCsrOwotICAgIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIGluZGV4ID0gZ2V0TGFzdFFkdGV4dChzdHIsIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgaWYgKGlzUXVvdGVkUGFpcihzdHIsIGluZGV4IC0gMSkpCi0gICAgICB7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvLyBpZiB0aGUgZW5kIGlzIG5vdCAnIicKLSAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gRFEpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIGluZGV4Kys7Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9FbnRyeVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0VudHJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjI3NzMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0VudHJ5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIC4uLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgRW50cnlUeXBlCi17Ci0gIC8qKgotICAgKiBSZXBvcnRBcnRpZmFjdCB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBBcnRpZmFjdFR5cGUgYXJ0aWZhY3RUeXBlOwotCi0gIC8qKgotICAgKiBUaGlzIHR5cGUuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQotICAvKioKLSAgICogRW50cnkgdHlwZXMgYWNjZXNzaWJsZSBieSB0eXBlIG5hbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyZWVNYXAgZW50cnlUeXBlTWFwID0gbmV3IFRyZWVNYXAoKTsKLQotICAvKioKLSAgICogRW50cnkgdHlwZSBuYW1lcyBhY2Nlc3NpYmxlIGJ5IGFydGlmYWN0LgotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmVlTWFwIGVudHJ5VHlwZU5hbWVNYXAgPSBuZXcgVHJlZU1hcCgpOwotICBzdGF0aWMgewotICAgIGVudHJ5VHlwZU5hbWVNYXAucHV0KEFydGlmYWN0VHlwZS5UWVBFX0VOVkVMT1BFLCBuZXcgVmVjdG9yKCkpOwotICAgIGVudHJ5VHlwZU5hbWVNYXAucHV0KEFydGlmYWN0VHlwZS5UWVBFX01FU1NBR0UsIG5ldyBWZWN0b3IoKSk7Ci0gICAgZW50cnlUeXBlTmFtZU1hcC5wdXQoQXJ0aWZhY3RUeXBlLlRZUEVfREVTQ1JJUFRJT04sIG5ldyBWZWN0b3IoKSk7Ci0gICAgZW50cnlUeXBlTmFtZU1hcC5wdXQoQXJ0aWZhY3RUeXBlLlRZUEVfRElTQ09WRVJZLCBuZXcgVmVjdG9yKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudmVsb3BlIGVudHJ5IHR5cGVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FTlZFTE9QRV9SRVFVRVNUID0gInJlcXVlc3RFbnZlbG9wZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRU5WRUxPUEVfUkVTUE9OU0UgPSAicmVzcG9uc2VFbnZlbG9wZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRU5WRUxPUEVfQU5ZID0gImFueUVudmVsb3BlIjsKLQotICAvKioKLSAgICogTWVzc2FnZSBlbnRyeSB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVTU0FHRV9SRVFVRVNUID0gInJlcXVlc3RNZXNzYWdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NRVNTQUdFX1JFU1BPTlNFID0gInJlc3BvbnNlTWVzc2FnZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVTU0FHRV9BTlkgPSAiYW55TWVzc2FnZSI7Ci0KLSAgLyoqCi0gICAqIE1JTUUgZW50cnkgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01JTUVfUEFSVCA9ICJwYXJ0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NSU1FX1JPT1RfUEFSVCA9ICJyb290LXBhcnQiOwotCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiBlbnRyeSB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfREVTQ1JJUFRJT05fREVGSU5JVElPTlMgPSAiZGVmaW5pdGlvbnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUSU9OX0lNUE9SVCA9ICJpbXBvcnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUSU9OX1RZUEVTID0gInR5cGVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVElPTl9NRVNTQUdFID0gIm1lc3NhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUSU9OX09QRVJBVElPTiA9ICJvcGVyYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUSU9OX1BPUlRUWVBFID0gInBvcnRUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9ERVNDUklQVElPTl9CSU5ESU5HID0gImJpbmRpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUSU9OX1BPUlQgPSAicG9ydCI7Ci0KLSAgLyoqCi0gICAqIERpc2NvdmVyeSBlbnRyeSB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRElTQ09WRVJZX0JJTkRJTkdURU1QTEFURSA9ICJiaW5kaW5nVGVtcGxhdGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RJU0NPVkVSWV9UTU9ERUwgPSAidE1vZGVsIjsKLQotICAvKioKLSAgICogRW52ZWxvcGUgZW50cnkgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBFTlRSWV9UWVBFX1JFUVVFU1RFTlYgPQotICAgIG5ld0VudHJ5VHlwZShBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9FTlZFTE9QRSwgVFlQRV9FTlZFTE9QRV9SRVFVRVNUKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9SRVNQT05TRUVOViA9Ci0gICAgbmV3RW50cnlUeXBlKEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX0VOVkVMT1BFLCBUWVBFX0VOVkVMT1BFX1JFU1BPTlNFKTsKLQotICAvKioKLSAgICogTWVzc2FnZSBlbnRyeSB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfUkVRVUVTVCA9Ci0gICAgbmV3RW50cnlUeXBlKEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX01FU1NBR0UsIFRZUEVfTUVTU0FHRV9SRVFVRVNUKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9SRVNQT05TRSA9Ci0gICAgbmV3RW50cnlUeXBlKEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX01FU1NBR0UsIFRZUEVfTUVTU0FHRV9SRVNQT05TRSk7Ci0gIC8vICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBFTlRSWV9UWVBFX0FOWUVOVFJZID0gCi0gIC8vICAgICAgICBuZXcgRW50cnlUeXBlKEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX01FU1NBR0VTLCBUWVBFX01FU1NBR0VfQU5ZRU5UUlkpOwotCi0gIC8qKgotICAgKiBEZXNjcmlwdGlvbiBlbnRyeSB0eXBlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfREVGSU5JVElPTlMgPQotICAgIG5ld0VudHJ5VHlwZSgKLSAgICAgIEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX0RFU0NSSVBUSU9OLAotICAgICAgVFlQRV9ERVNDUklQVElPTl9ERUZJTklUSU9OUyk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfSU1QT1JUID0KLSAgICBuZXdFbnRyeVR5cGUoCi0gICAgICBBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9ERVNDUklQVElPTiwKLSAgICAgIFRZUEVfREVTQ1JJUFRJT05fSU1QT1JUKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9UWVBFUyA9Ci0gICAgbmV3RW50cnlUeXBlKAotICAgICAgQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfREVTQ1JJUFRJT04sCi0gICAgICBUWVBFX0RFU0NSSVBUSU9OX1RZUEVTKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9NRVNTQUdFID0KLSAgICBuZXdFbnRyeVR5cGUoCi0gICAgICBBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9ERVNDUklQVElPTiwKLSAgICAgIFRZUEVfREVTQ1JJUFRJT05fTUVTU0FHRSk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfT1BFUkFUSU9OID0KLSAgICBuZXdFbnRyeVR5cGUoCi0gICAgICBBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9ERVNDUklQVElPTiwKLSAgICAgIFRZUEVfREVTQ1JJUFRJT05fT1BFUkFUSU9OKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9QT1JUVFlQRSA9Ci0gICAgbmV3RW50cnlUeXBlKAotICAgICAgQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfREVTQ1JJUFRJT04sCi0gICAgICBUWVBFX0RFU0NSSVBUSU9OX1BPUlRUWVBFKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9CSU5ESU5HID0KLSAgICBuZXdFbnRyeVR5cGUoCi0gICAgICBBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9ERVNDUklQVElPTiwKLSAgICAgIFRZUEVfREVTQ1JJUFRJT05fQklORElORyk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIEVOVFJZX1RZUEVfUE9SVCA9Ci0gICAgbmV3RW50cnlUeXBlKEFydGlmYWN0VHlwZS5BUlRJRkFDVF9UWVBFX0RFU0NSSVBUSU9OLCBUWVBFX0RFU0NSSVBUSU9OX1BPUlQpOwotCi0gIC8qKgotICAgKiBEaXNjb3ZlcnkgZW50cnkgdHlwZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBFTlRSWV9UWVBFX0JJTkRJTkdURU1QTEFURSA9Ci0gICAgbmV3RW50cnlUeXBlKAotICAgICAgQXJ0aWZhY3RUeXBlLkFSVElGQUNUX1RZUEVfRElTQ09WRVJZLAotICAgICAgVFlQRV9ESVNDT1ZFUllfQklORElOR1RFTVBMQVRFKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnRyeVR5cGUgRU5UUllfVFlQRV9UTU9ERUwgPQotICAgIG5ld0VudHJ5VHlwZShBcnRpZmFjdFR5cGUuQVJUSUZBQ1RfVFlQRV9ESVNDT1ZFUlksIFRZUEVfRElTQ09WRVJZX1RNT0RFTCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBlbnRyeSB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBFbnRyeVR5cGUoQXJ0aWZhY3RUeXBlIGFydGlmYWN0VHlwZSwgU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgdGhpcy5hcnRpZmFjdFR5cGUgPSBhcnRpZmFjdFR5cGU7Ci0gICAgdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIElzIGVudHJ5IHR5cGUgZXF1YWwgdG8gc3BlY2lmaWVkIHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlTmFtZSBlbnRyeSB0eXBlIG5hbWUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBlbnRyeSB0eXBlIGVxdWFsIHRvIHNwZWNpZmllZCB0eXBlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNUeXBlKFN0cmluZyB0eXBlTmFtZSkKLSAgewotICAgIHJldHVybiB0aGlzLnR5cGVOYW1lLmVxdWFscyh0eXBlTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogSXMgZW50cnkgdHlwZSBlcXVhbCB0byBzcGVjaWZpZWQgdHlwZS4KLSAgICogQHBhcmFtIGVudHJ5VHlwZSBlbnRyeSB0eXBlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgZW50cnkgdHlwZSBlcXVhbCB0byBzcGVjaWZpZWQgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVHlwZShFbnRyeVR5cGUgZW50cnlUeXBlKQotICB7Ci0gICAgcmV0dXJuIHR5cGVOYW1lLmVxdWFscyhlbnRyeVR5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFydGlmYWN0IHR5cGUuCi0gICAqIEByZXR1cm4gYXJ0aWZhY3QgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBBcnRpZmFjdFR5cGUgZ2V0QXJ0aWZhY3RUeXBlKCkKLSAgewotICAgIHJldHVybiBhcnRpZmFjdFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHJldHVybiBlbnRyeSB0eXBlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkKLSAgewotICAgIHJldHVybiB0eXBlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBJcyB2YWxpZCBlbnRyeSB0eXBlLgotICAgKiBAcGFyYW0gdHlwZU5hbWUgZW50cnkgdHlwZSBuYW1lLgotICAgKiBAcmV0dXJuIHRydWUgaWYgZW50cnkgdHlwZSBuYW1lIGlzIHZhbGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVmFsaWRFbnRyeVR5cGUoU3RyaW5nIHR5cGVOYW1lKQotICB7Ci0gICAgcmV0dXJuIChlbnRyeVR5cGVNYXAuZ2V0KHR5cGVOYW1lKSA9PSBudWxsID8gZmFsc2UgOiB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgZW50cnkgdHlwZS4KLSAgICogQHBhcmFtIHR5cGVOYW1lIGVudHJ5IHR5cGUgbmFtZS4KLSAgICogQHJldHVybiBlbnRyeSB0eXBlLgotICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgZW50cnkgdHlwZSBuYW1lIGlzIGludmFsaWQgb3IgaW5hcHByb3ByaWF0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgRW50cnlUeXBlIGdldEVudHJ5VHlwZShTdHJpbmcgdHlwZU5hbWUpCi0gICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLSAgewotICAgIC8vIEdldCB0aGUgZW50cnkgdHlwZSBieSB0eXBlIG5hbWUKLSAgICBFbnRyeVR5cGUgZW50cnlUeXBlID0gKEVudHJ5VHlwZSkgZW50cnlUeXBlTWFwLmdldCh0eXBlTmFtZSk7Ci0KLSAgICBpZiAoZW50cnlUeXBlID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJDb3VsZCBub3QgZ2V0IGVudHJ5IHR5cGUgYmVjYXVzZSB0eXBlIG5hbWUgaXMgaW52YWxpZDogIgotICAgICAgICAgICsgdHlwZU5hbWUKLSAgICAgICAgICArICIuIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVudHJ5VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbGlzdCBvZiBlbnRyeSB0eXBlIG5hbWVzIGZvciBhIHNwZWNpZmllZCBhcnRpZmFjdCB0eXBlIG5hbWUuCi0gICAqIEBwYXJhbSBhcnRpZmFjdFR5cGVOYW1lIGFydGlmYWN0IHR5cGUgbmFtZS4KLSAgICogQHJldHVybiBsaXN0IG9mIGVudHJ5IHR5cGUgbmFtZXMgZm9yIGEgc3BlY2lmaWVkIGFydGlmYWN0IHR5cGUgbmFtZS4KLSAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGVudHJ5IHR5cGUgbmFtZSBpcyBpbnZhbGlkIG9yIGluYXBwcm9wcmlhdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFZlY3RvciBnZXRFbnRyeVR5cGVOYW1lTGlzdChTdHJpbmcgYXJ0aWZhY3RUeXBlTmFtZSkKLSAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgotICB7Ci0gICAgLy8gR2V0IGxpc3QKLSAgICBWZWN0b3IgZW50cnlUeXBlTmFtZUxpc3QgPSAoVmVjdG9yKSBlbnRyeVR5cGVOYW1lTWFwLmdldChhcnRpZmFjdFR5cGVOYW1lKTsKLQotICAgIC8vIElmIHRoZSBsaXN0IHdhcyBub3QgZm91bmQsIHRoZW4gdGhyb3cgYW4gZXhjZXB0aW9uCi0gICAgaWYgKGVudHJ5VHlwZU5hbWVMaXN0ID09IG51bGwpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJDb3VsZCBub3QgZ2V0IGVudHJ5IHR5cGUgbmFtZSBsaXN0IGJlY2F1c2UgYXJ0aWZhY3QgdHlwZSBuYW1lIGlzIGludmFsaWQ6ICIKLSAgICAgICAgICArIGFydGlmYWN0VHlwZU5hbWUKLSAgICAgICAgICArICIuIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVudHJ5VHlwZU5hbWVMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBsaXN0IG9mIHR5cGUgbmFtZXMgZm9yIGEgc3BlY2lmaWVkIGFydGlmYWN0IHR5cGUgbmFtZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEVudHJ5VHlwZSBuZXdFbnRyeVR5cGUoCi0gICAgQXJ0aWZhY3RUeXBlIGFydGlmYWN0VHlwZSwKLSAgICBTdHJpbmcgdHlwZU5hbWUpCi0gIHsKLSAgICBFbnRyeVR5cGUgZW50cnlUeXBlID0gbnVsbDsKLQotICAgIC8vIENyZWF0ZSBlbnRyeSB0eXBlCi0gICAgZW50cnlUeXBlID0gbmV3IEVudHJ5VHlwZShhcnRpZmFjdFR5cGUsIHR5cGVOYW1lKTsKLQotICAgIC8vIEFkZCB0byBlbnRyeSB0eXBlIG1hcAotICAgIGVudHJ5VHlwZU1hcC5wdXQodHlwZU5hbWUsIGVudHJ5VHlwZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGVudHJ5IHR5cGUgbmFtZSB2ZWN0b3IgZm9yIHRoZSBhcnRpZmFjdCB0eXBlCi0gICAgVmVjdG9yIGVudHJ5VHlwZU5hbWVMaXN0ID0KLSAgICAgIChWZWN0b3IpIGVudHJ5VHlwZU5hbWVNYXAuZ2V0KGFydGlmYWN0VHlwZS5nZXRUeXBlTmFtZSgpKTsKLQotICAgIC8vIEFkZCB0aGUgdHlwZSBuYW1lIHRvIHRoZSBsaXN0Ci0gICAgZW50cnlUeXBlTmFtZUxpc3QuYWRkKHR5cGVOYW1lKTsKLQotICAgIHJldHVybiBlbnRyeVR5cGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0Vycm9yTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvRXJyb3JMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NTk3ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvRXJyb3JMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLS8qKgotICogVGhlIGNsYXNzIGFjY3VtdWxhdGVzIGFsbCBlcnJvciBzdHJpbmdzIGludG8gc3RyaW5nIGJ1ZmZlci4KLSAqIAotICogQGF1dGhvciBLdWxpawotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXJyb3JMaXN0Ci17Ci0gIHByaXZhdGUgU2V0IGVycm9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0gIHByaXZhdGUgTWVzc2FnZUZvcm1hdCBmb3JtYXQgPSBuZXcgTWVzc2FnZUZvcm1hdCgiezB9OnsxfSIpOwotICBwcml2YXRlIEZpZWxkUG9zaXRpb24gcG9zID0gbmV3IEZpZWxkUG9zaXRpb24oMCk7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNPYmplY3QoKQotICAgKi8KLSAgcHVibGljIEVycm9yTGlzdCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgZXJyb3IgbGlzdCB1c2luZyBjb250ZW50cyBvZiBhIGxpc3QuCi0gICAqIEBwYXJhbSBsaXN0IGEgTGlzdCBvYmplY3QuCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNPYmplY3QoKQotICAgKi8KLSAgcHVibGljIEVycm9yTGlzdChMaXN0IGxpc3QpCi0gIHsKLSAgICBhZGQobGlzdCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgZm9ybWF0LgotICAgKiBAcGFyYW0gZiBhIG1lc3NhZ2UgZm9ybWF0LgotICAgKi8KLSAgcHVibGljIEVycm9yTGlzdChNZXNzYWdlRm9ybWF0IGYpCi0gIHsKLSAgICBpZiAoZiAhPSBudWxsKQotICAgICAgZm9ybWF0ID0gZjsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgbGlzdC4gCi0gICAqIEBwYXJhbSBsaXN0IGxpc3Qgb2YgZXJyb3JzLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKExpc3QgbGlzdCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgYWRkKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgZXJyb3IgZGVzY3JpcHRpb24gaW50byB0aGUgbGlzdC4gCi0gICAqIEBwYXJhbSBzMSBhIHN0cmluZy4KLSAgICogQHBhcmFtIHMyIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBzMSwgU3RyaW5nIHMyKQotICB7Ci0gICAgZXJyb3JzLmFkZChuZXcgUGFpcihzMSwgczIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGVycm9yIGRlc2NyaXB0aW9uIGludG8gdGhlIGxpc3QuCi0gICAqIEBwYXJhbSBxIGEgUU5hbWUgb2JqZWN0LgotICAgKiBAcGFyYW0gcyBhIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChRTmFtZSBxLCBTdHJpbmcgcykKLSAgewotICAgIGVycm9ycy5hZGQobmV3IFBhaXIoTnVsbFV0aWwudG9TdHJpbmcocSksIHMpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGVycm9yIGRlc2NyaXB0aW9uIGludG8gdGhlIGxpc3QuCi0gICAqIEBwYXJhbSBxMSBhIFFOYW1lIG9iamVjdC4KLSAgICogQHBhcmFtIHEyIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKFFOYW1lIHExLCBRTmFtZSBxMikKLSAgewotICAgIGVycm9ycy5hZGQobmV3IFBhaXIoTnVsbFV0aWwudG9TdHJpbmcocTEpLCBOdWxsVXRpbC50b1N0cmluZyhxMikpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGVycm9yIGRlc2NyaXB0aW9uIGludG8gdGhlIGxpc3QuLi4KLSAgICogQHBhcmFtIHEgYSBRTmFtZSBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGQoUU5hbWUgcSkKLSAgewotICAgIGVycm9ycy5hZGQobmV3IFBhaXIoTnVsbFV0aWwudG9TdHJpbmcocSksIG51bGwpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGVycm9yIGRlc2NyaXB0aW9uIGludG8gdGhlIGxpc3QuCi0gICAqIEBwYXJhbSBzIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBzKQotICB7Ci0gICAgZXJyb3JzLmFkZChuZXcgUGFpcihzLCBudWxsKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXJyb3IgbGlzdCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIAotICAgKiBAcmV0dXJuIHRoZSBlcnJvciBsaXN0IHN0cmluZyByZXByZXNlbnRhdGlvbi4gCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBJdGVyYXRvciBpdCA9IGVycm9ycy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUGFpciBwID0gKFBhaXIpIGl0Lm5leHQoKTsKLSAgICAgIGlmIChwLmdldEZpcnN0KCkgIT0gbnVsbCAmJiBwLmdldFNlY29uZCgpICE9IG51bGwpCi0gICAgICAgIGZvcm1hdC5mb3JtYXQobmV3IE9iamVjdFtdIHsgcC5nZXRGaXJzdCgpLCBwLmdldFNlY29uZCgpfSwgYnVmLCBwb3MpOwotICAgICAgZWxzZSBpZiAocC5nZXRGaXJzdCgpICE9IG51bGwpCi0gICAgICAgIGJ1Zi5hcHBlbmQocC5nZXRGaXJzdCgpKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYnVmLmFwcGVuZChwLmdldFNlY29uZCgpKTsKLSAgICAgIGlmIChpdC5oYXNOZXh0KCkpCi0gICAgICAgIGJ1Zi5hcHBlbmQoIixcbiIpOwotICAgIH0KLQotICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciBlcnJvciBsaXN0IGlzIGVtcHR5IG9yIG5vdC4KLSAgICogQHJldHVybiB0cnVlIGlmIGVycm9yIGxpc3QgaXMgZW1wdHkuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLSAgewotICAgIHJldHVybiBlcnJvcnMuc2l6ZSgpID09IDA7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0hUVFBDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0hUVFBDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiMDUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9IVFRQQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgc2V0IG9mIEhUVFAgdmFsdWVzIHRoYXQgYXJlIGRlZmluZWQgYnkgTmV0d29yayBXb3JraW5nIEdyb3VwLgotICogaHR0cDovL3d3dy5pZXRmLm9yZy8KLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IgSWx5YSBLYW5vbmlyb3YgKGtpb0Bpc2cuYXhtb3IuY29tKQotICovCi1wdWJsaWMgY2xhc3MgSFRUUENvbnN0YW50cyB7Ci0gIC8vIFRoZSBzdGFuZGFyZGl6ZWQgSFRUUCBIZWFkZXIgZmllbGQtbmFtZXMKLSAgLy8gaHR0cDovL3d3dy5tbm90Lm5ldC9kcmFmdHMvZHJhZnQtbm90dGluZ2hhbS1odHRwLWhlYWRlci1yZWctMDAudHh0Ci0KLSAgLy8gSHlwZXJ0ZXh0IFRyYW5zZmVyIFByb3RvY29sIC0tIEhUVFAvMS4xIChvYnNvbGV0ZXMgUkZDMjA2OCkKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVCA9ICJBY2NlcHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX0NIQVJTRVQgPSAiQWNjZXB0LUNoYXJzZXQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX0VOQ09ESU5HID0gIkFjY2VwdC1FbmNvZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfTEFOR1VBR0UgPSAiQWNjZXB0LUxhbmd1YWdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9SQU5HRVMgPSAiQWNjZXB0LVJhbmdlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BR0UgPSAiQWdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FMTE9XID0gIkFsbG93IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FVVEhPUklaQVRJT04gPSAiQXV0aG9yaXphdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DQUNIRV9DT05UUk9MID0gIkNhY2hlLUNvbnRyb2wiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OTkVDVCA9ICJDb25uZWN0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfRU5DT0RJTkcgPSAiQ29udGVudC1FbmNvZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0xBTkdVQUdFID0gIkNvbnRlbnQtTGFuZ3VhZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9MRU5HVEggPSAiQ29udGVudC1MZW5ndGgiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9MT0NBVElPTiA9ICJDb250ZW50LUxvY2F0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfTUQ1ID0gIkNvbnRlbnQtTUQ1IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfUkFOR0UgPSAiQ29udGVudC1SYW5nZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX1RZUEUgPSAiQ29udGVudC1UeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RBVEUgPSAiRGF0ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9FVEFHID0gIkVUYWciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVhQRUNUID0gIkV4cGVjdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9FWFBJUkVTID0gIkV4cGlyZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRlJPTSA9ICJGcm9tIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0hPU1QgPSAiSG9zdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JRl9NQVRDSCA9ICJJZi1NYXRjaCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JRl9NT0RJRklFRF9TSU5DRSA9ICJJZi1Nb2RpZmllZC1TaW5jZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JRl9OT05FX01BVENIID0gIklmLU5vbmUtTWF0Y2giOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZfUkFOR0UgPSAiSWYtUmFuZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZfVU5NT0RJRklFRF9TSU5DRSA9ICJJZi1Vbm1vZGlmaWVkLVNpbmNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0xBU1RfTU9ESUZJRUQgPSAiTGFzdC1Nb2RpZmllZCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9MT0NBVElPTiA9ICJMb2NhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9NQVhfRk9SV0FSRFMgPSAiTWF4LUZvcndhcmRzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BSQUdNQSA9ICJQcmFnbWEiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPWFlfQVVUSEVOVElDQVRFID0gIlByb3h5LUF1dGhlbnRpY2F0ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUk9YWV9BVVRIT1JJWkFUSU9OID0gIlByb3h5LUF1dGhvcml6YXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUkFOR0UgPSAiUmFuZ2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUkVGRVJFUiA9ICJSZWZlcmVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1JFVFJZX0FGVEVSID0gIlJldHJ5LUFmdGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NFUlZFUiA9ICJTZXJ2ZXIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVEUgPSAiVEUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVFJBSUxFUiA9ICJUcmFpbGVyIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HID0gIlRyYW5zZmVyLUVuY29kaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1VQR1JBREUgPSAiVXBncmFkZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9VU0VSX0FHRU5UID0gIlVzZXItQWdlbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVkFSWSA9ICJWYXJ5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1ZJQSA9ICJWaWEiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfV0FSTklORyA9ICJXYXJuaW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1dXV19BVVRIRU5USUNBVEUgPSAiV1dXLUF1dGhlbnRpY2F0ZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9NSU1FX1ZFUlNJT04gPSAiTUlNRS1WZXJzaW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfRElTUE9TSVRJT04gPSAiQ29udGVudC1EaXNwb3NpdGlvbiI7ICAKLQotICAvLyBIVFRQIEF1dGhlbnRpY2F0aW9uOiBCYXNpYyBhbmQgRGlnZXN0IEFjY2VzcyBBdXRoZW50aWNhdGlvbgotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQVVUSEVOVElDQVRJT05fSU5GTyA9ICJBdXRoZW50aWNhdGlvbi1JbmZvIjsKLQotICAvLyBIVFRQIFN0YXRlIE1hbmFnZW1lbnQgTWVjaGFuaXNtCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TRVRfQ09PS0lFID0gIlNldC1Db29raWUiOwotCi0gIC8vIEhUVFAgU3RhdGUgTWFuYWdlbWVudCBNZWNoYW5pc20gKG9ic29sZXRlcyBSRkMyMTA5KQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09PS0lFID0gIkNvb2tpZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT09LSUUyID0gIkNvb2tpZTIiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfU0VUX0NPT0tJRTIgPSAiU2V0LUNvb2tpZTIiOwotCi0gIC8vIFdlYiBEaXN0cmlidXRlZCBBdXRob3JpbmcgYW5kIFZlcnNpb25pbmcKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RBViA9ICJEQVYiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfREVQVEggPSAiRGVwdGgiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfREVTVElOQVRJT04gPSAiRGVzdGluYXRpb24iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUYgPSAiSWYiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTE9DS19UT0tFTiA9ICJMb2NrLVRva2VuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX09WRVJXUklURSA9ICJPdmVyd3JpdGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfU1RBVFVTX1VSSSA9ICJTdGF0dXMtVVJJIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RJTUVPVVQgPSAiVGltZW91dCI7Ci0KLSAgLy8gSHlwZXJ0ZXh0IFRyYW5zZmVyIFByb3RvY29sIC0tIEhUVFAvMS4xIChQcm9wb3NlZCBTdGFuZGFyZCAtIHRoZXNlIGZpZWxkLW5hbWVzIGFyZSBub3cgY29uc2lkZXJlZCBvYnNvbGV0ZSkKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfQkFTRSA9ICJDb250ZW50LUJhc2UiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFVCTElDID0gIlB1YmxpYyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX1ZFUlNJT04gPSAiQ29udGVudC1WZXJzaW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RFUklWRURfRlJPTSA9ICJEZXJpdmVkLUZyb20iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTElOSyA9ICJMaW5rIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1VSSSA9ICJVUkkiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfS0VFUF9BTElWRSA9ICJLZWVwLUFsaXZlIjsKLQotICAvLyBEZWx0YSBFbmNvZGluZyBpbiBIVFRQCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BX0lNID0gIkEtSU0iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfREVMVEFfQkFTRSA9ICJEZWx0YS1CYXNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0lNID0gIklNIjsKLQotICAvLyBJbnN0YW5jZSBEaWdlc3RzIGluIEhUVFAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RJR0VTVCA9ICJEaWdlc3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfV0FOVF9ESUdFU1QgPSAiV2FudC1EaWdlc3QiOwotCi0gIC8vIFNpbXBsZSBIaXQtTWV0ZXJpbmcgYW5kIFVzYWdlLUxpbWl0aW5nIGZvciBIVFRQCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9NRVRFUiA9ICJNZXRlciI7Ci0KLSAgLy8gVGhlIEtub3duIE5vbi1TdGFuZGFyZGl6ZWQgSFRUUCBIZWFkZXIgZmllbGQtbmFtZXMKLQotICAvLyBUcmFuc3BhcmVudCBDb250ZW50IE5lZ290aWF0aW9uIGluIEhUVFAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0FDQ0VQVF9GRUFUVVJFUyA9ICJBY2NlcHQtRmVhdHVyZXMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUxURVJOQVRFUyA9ICJBbHRlcm5hdGVzIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX05FR09USUFURSA9ICJOZWdvdGlhdGUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVENOID0gIlRDTiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9WQVJJQU5UX1ZBUlkgPSAiVmFyaWFudC1WYXJ5IjsKLQotICAvLyBUaGUgU2FmZSBSZXNwb25zZSBIZWFkZXIgRmllbGQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NBRkUgPSAiU2FmZSI7Ci0KLSAgLy8gSHlwZXIgVGV4dCBDb2ZmZWUgUG90IENvbnRyb2wgUHJvdG9jb2wgKEhUQ1BDUC8xLjApCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfQURESVRJT05TID0gIkFjY2VwdC1BZGRpdGlvbnMiOwotCi0gIC8vIFRoZSBTZWN1cmUgSHlwZXJUZXh0IFRyYW5zZmVyIFByb3RvY29sCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX1BSSVZBQ1lfRE9NQUlOID0gIkNvbnRlbnQtUHJpdmFjeS1Eb21haW4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTUFDX0lORk8gPSAiTUFDLUluZm8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJFQVJSQU5HRURfS0VZX0lORk8gPSAiUHJlYXJyYW5nZWQtS2V5LUluZm8iOwotCi0gIC8vIEFuIEhUVFAgRXh0ZW5zaW9uIEZyYW1ld29yawotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ19FWFQgPSAiQy1FeHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ19NQU4gPSAiQy1NYW4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ19PUFQgPSAiQy1PcHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVhUID0gIkV4dCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9NQU4gPSAiTWFuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX09QVCA9ICJPcHQiOwotCi0gIC8vIFBJQ1MgTGFiZWwgRGlzdHJpYnV0aW9uIExhYmVsIFN5bnRheCBhbmQgQ29tbXVuaWNhdGlvbiBQcm90b2NvbHMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BJQ1NfTEFCRUwgPSAiUElDUy1MYWJlbCI7Ci0KLSAgLy8gUGxhdGZvcm0gRm9yIFByaXZhY3kgUHJlZmVyZW5jZXMgMS4wCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QM1AgPSAiUDNQIjsKLQotICAvLyBQRVAgLSBhbiBFeHRlbnNpb24gTWVjaGFuaXNtIGZvciBIVFRQCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DX1BFUCA9ICJDLVBFUCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DX1BFUF9JTkZPID0gIkMtUEVQLUluZm8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUEVQID0gIlBFUCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QRVBfSU5GTyA9ICJQZXAtSW5mbyI7Ci0KLSAgLy8gVGhlIEhUVFAgRGlzdHJpYnV0aW9uIGFuZCBSZXBsaWNhdGlvbiBQcm90b2NvbAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9JRCA9ICJDb250ZW50LUlEIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RJRkZFUkVOVElBTF9JRCA9ICJEaWZmZXJlbnRpYWwtSUQiOwotCi0gIC8vIEVTSSBBcmNoaXRlY3R1cmUKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NVUlJPR0FURV9DQVBBQklMSVRZID0gIlN1cnJvZ2F0ZS1DYXBhYmlsaXR5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1NVUlJPR0FURV9DT05UUk9MID0gIlN1cnJvZ2F0ZS1Db250cm9sIjsKLQotICAvLyBTZWxlY3RpbmcgUGF5bWVudCBNZWNoYW5pc21zIE92ZXIgSFRUUAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPVE9DT0wgPSAiUHJvdG9jb2wiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPVE9DT0xfSU5GTyA9ICJQcm90b2NvbC1JbmZvIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1RPQ09MX1FVRVJZID0gIlByb3RvY29sLVF1ZXJ5IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST1RPQ09MX1JFUVVFU1QgPSAiUHJvdG9jb2wtUmVxdWVzdCI7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgT1BTIE92ZXIgSFRUUAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfR0VUUFJPRklMRSA9ICJHZXRQcm9maWxlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1BST0ZJTEVPQkpFQ1QgPSAiUHJvZmlsZU9iamVjdCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9TRVRQUk9GSUxFID0gIlNldFByb2ZpbGUiOwotCi0gIC8vIE5vdGlmaWNhdGlvbiBmb3IgUHJveHkgQ2FjaGVzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUk9YWV9GRUFUVVJFUyA9ICJQcm94eS1GZWF0dXJlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9QUk9YWV9JTlNUUlVDVElPTiA9ICJQcm94eS1JbnN0cnVjdGlvbiI7Ci0KLSAgLy8gT2JqZWN0IEhlYWRlciBsaW5lcyBpbiBIVFRQCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HID0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09TVCA9ICJDb3N0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX01FU1NBR0VfSUQgPSAiTWVzc2FnZS1JRCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9USVRMRSA9ICJUaXRsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9WRVJTSU9OID0gIlZlcnNpb24iOwotCi0gIC8vIEEgUHJvcG9zZWQgRXh0ZW5zaW9uIE1lY2hhbmlzbSBmb3IgSFRUUAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfRVhURU5TSU9OID0gIkV4dGVuc2lvbiI7Ci0KLSAgLy8gV0lSRSAtIFczIElkZW50aWZpZXIgUmVzb2x1dGlvbiBFeHRlbnNpb25zCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9PUFRJT05BTCA9ICJPcHRpb25hbCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9SRVNPTFVUSU9OX0hJTlQgPSAiUmVzb2x1dGlvbi1IaW50IjsKLQotICAvLyBEdXBsaWNhdGUgU3VwcHJlc3Npb24gaW4gSFRUUAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfU1VCT0sgPSAiU3ViT0siOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfU1VCU1QgPSAiU3Vic3QiOwotCi0gIC8vIFNwZWNpZmljYXRpb24gb2YgSFRUUC8xLjEgT1BUSU9OUyBtZXNzYWdlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09NUExJQU5DRSA9ICJDb21wbGlhbmNlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX05PTl9DT01QTElBTkNFID0gIk5vbi1Db21wbGlhbmNlIjsKLQotICAvLyBXaWRlbHktdXNlZCB1bmRvY3VtZW50ZWQgaGVhZGVycwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUkVRVUVTVF9SQU5HRSA9ICJSZXF1ZXN0LVJhbmdlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1VBX0NPTE9SID0gIlVBLUNvbG9yIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1VBX0NQVSA9ICJVQS1DUFUiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVUFfT1MgPSAiVUEtT1MiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVUFfUElYRUxTID0gIlVBLVBpeGVscyI7Ci0KLSAgLy8gSW1wbGVtZW50YXRpb24gZXJyb3JzCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9SRUZFUlJFUiA9ICJSZWZlcnJlciI7Ci0KLSAgLy8gUHJpdmF0ZSBmZWF0dXJlcwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09QWVJJR0hUID0gIkNvcHlyaWdodCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UID0gIkNvbnRlbnQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQVVUSE9SID0gIkF1dGhvciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05UQUNUID0gIkNvbnRhY3QiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfS0VZV09SRFMgPSAiS2V5d29yZHMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfR0VORVJBVE9SID0gIkdlbmVyYXRvciI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9ERVNDUklQVElPTiA9ICJEZXNjcmlwdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT01NQU5EID0gIkNvbW1hbmQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfU0VTU0lPTiA9ICJTZXNzaW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RZUEUgPSAiVHlwZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9NRVNTQUdFID0gIk1lc3NhZ2UiOwotCi0gIC8vIEFiYW5kb25lZCBwcm9wb3NhbHMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1VOTEVTU19NT0RJRklFRF9TSU5DRSA9ICJVbmxlc3MtTW9kaWZpZWQtU2luY2UiOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFsbCB0aGUgc3RhbmRhcmRpemVkIEhUVFAgaGVhZGVyIG5hbWVzIHByZXNlbnRlZCBhcyBMaXN0Ci0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2Ygc3RhbmRhcmRpemVkIEhUVFAgaGVhZGVyIG5hbWVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0U3RhbmRhcmRpemVkSGVhZGVyTmFtZXMoKSB7Ci0gICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsKLSAgICAgIEhFQURFUl9BQ0NFUFQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BQ0NFUFRfQ0hBUlNFVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FDQ0VQVF9FTkNPRElORy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FDQ0VQVF9MQU5HVUFHRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FDQ0VQVF9SQU5HRVMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BR0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BTExPVy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FVVEhPUklaQVRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DQUNIRV9DT05UUk9MLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OTkVDVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfRU5DT0RJTkcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX0xBTkdVQUdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9MRU5HVEgudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX0xPQ0FUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9NRDUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX1JBTkdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9UWVBFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREFURS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0VUQUcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9FWFBFQ1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9FWFBJUkVTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfRlJPTS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0hPU1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9JRl9NQVRDSC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lGX01PRElGSUVEX1NJTkNFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSUZfTk9ORV9NQVRDSC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lGX1JBTkdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSUZfVU5NT0RJRklFRF9TSU5DRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0xBU1RfTU9ESUZJRUQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9MT0NBVElPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01BWF9GT1JXQVJEUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BSQUdNQS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1hZX0FVVEhFTlRJQ0FURS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1hZX0FVVEhPUklaQVRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9SQU5HRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1JFRkVSRVIudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9SRVRSWV9BRlRFUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NFUlZFUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVFJBSUxFUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVVBHUkFERS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VTRVJfQUdFTlQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9WQVJZLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVklBLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfV0FSTklORy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1dXV19BVVRIRU5USUNBVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9NSU1FX1ZFUlNJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX0RJU1BPU0lUSU9OLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9BVVRIRU5USUNBVElPTl9JTkZPLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9TRVRfQ09PS0lFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DT09LSUUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT09LSUUyLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfU0VUX0NPT0tJRTIudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0RBVi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RFUFRILnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREVTVElOQVRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9JRi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0xPQ0tfVE9LRU4udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9PVkVSV1JJVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TVEFUVVNfVVJJLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVElNRU9VVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09OVEVOVF9CQVNFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFVCTElDLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9WRVJTSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREVSSVZFRF9GUk9NLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTElOSy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VSSS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0tFRVBfQUxJVkUudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0FfSU0udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9ERUxUQV9CQVNFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSU0udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0RJR0VTVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1dBTlRfRElHRVNULnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9NRVRFUi50b1VwcGVyQ2FzZSgpCi0gICAgfSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbGwgdGhlIG5vbi1zdGFuZGFyZGl6ZWQgSFRUUCBoZWFkZXIgbmFtZXMgcHJlc2VudGVkIGFzIExpc3QKLSAgICogQHJldHVybiBUaGUgbGlzdCBvZiBub24tc3RhbmRhcmRpemVkIEhUVFAgaGVhZGVyIG5hbWVzCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Tm9uU3RhbmRhcmRpemVkSGVhZGVyTmFtZXMoKSB7Ci0gICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsKLSAgICAgIEhFQURFUl9BQ0NFUFRfRkVBVFVSRVMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BTFRFUk5BVEVTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTkVHT1RJQVRFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVENOLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVkFSSUFOVF9WQVJZLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9TQUZFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9BQ0NFUFRfQURESVRJT05TLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DT05URU5UX1BSSVZBQ1lfRE9NQUlOLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTUFDX0lORk8udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUkVBUlJBTkdFRF9LRVlfSU5GTy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ19FWFQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DX01BTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NfT1BULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfRVhULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTUFOLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfT1BULnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9QSUNTX0xBQkVMLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPVE9DT0wudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9UT0NPTF9SRVFVRVNULnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9QM1AudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NfUEVQLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ19QRVBfSU5GTy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BFUC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BFUF9JTkZPLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DT05URU5UX0lELnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfRElGRkVSRU5USUFMX0lELnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9TVVJST0dBVEVfQ0FQQUJJTElUWS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NVUlJPR0FURV9DT05UUk9MLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9QUk9UT0NPTC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1RPQ09MX0lORk8udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9UT0NPTF9RVUVSWS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1RPQ09MX1JFUVVFU1QudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0dFVFBST0ZJTEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9GSUxFT0JKRUNULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfU0VUUFJPRklMRS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUFJPWFlfRkVBVFVSRVMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9YWV9JTlNUUlVDVElPTi50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPU1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9NRVNTQUdFX0lELnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVElUTEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9WRVJTSU9OLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9FWFRFTlNJT04udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX09QVElPTkFMLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUkVTT0xVVElPTl9ISU5ULnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9TVUJPSy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NVQlNULnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DT01QTElBTkNFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTk9OX0NPTVBMSUFOQ0UudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1JFUVVFU1RfUkFOR0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VQV9DT0xPUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VBX0NQVS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VBX09TLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVUFfUElYRUxTLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9SRUZFUlJFUi50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09QWVJJR0hULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FVVEhPUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRBQ1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9LRVlXT1JEUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0dFTkVSQVRPUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RFU0NSSVBUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09NTUFORC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NFU1NJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9UWVBFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTUVTU0FHRS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfVU5MRVNTX01PRElGSUVEX1NJTkNFLnRvVXBwZXJDYXNlKCkKLSAgICB9KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFsbCBrbm93biBIVFRQIGhlYWRlciBuYW1lcyBwcmVzZW50ZWQgYXMgTGlzdAotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGFsbCBrbm93biBIVFRQIGhlYWRlciBuYW1lcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbEtub3duSGVhZGVyTmFtZXMoKSB7Ci0gICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsKLSAgICAgIEhFQURFUl9BQ0NFUFQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BQ0NFUFRfQ0hBUlNFVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FDQ0VQVF9FTkNPRElORy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FDQ0VQVF9MQU5HVUFHRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FDQ0VQVF9SQU5HRVMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BR0UudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BTExPVy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0FVVEhPUklaQVRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DQUNIRV9DT05UUk9MLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OTkVDVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlRfRU5DT0RJTkcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX0xBTkdVQUdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9MRU5HVEgudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX0xPQ0FUSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9NRDUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX1JBTkdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9UWVBFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREFURS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0VUQUcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9FWFBFQ1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9FWFBJUkVTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfRlJPTS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0hPU1QudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9JRl9NQVRDSC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lGX01PRElGSUVEX1NJTkNFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSUZfTk9ORV9NQVRDSC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0lGX1JBTkdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSUZfVU5NT0RJRklFRF9TSU5DRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0xBU1RfTU9ESUZJRUQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9MT0NBVElPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01BWF9GT1JXQVJEUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BSQUdNQS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1hZX0FVVEhFTlRJQ0FURS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1hZX0FVVEhPUklaQVRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9SQU5HRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1JFRkVSRVIudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9SRVRSWV9BRlRFUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NFUlZFUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVFJBSUxFUi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RSQU5TRkVSX0VOQ09ESU5HLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVVBHUkFERS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VTRVJfQUdFTlQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9WQVJZLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVklBLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfV0FSTklORy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1dXV19BVVRIRU5USUNBVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9NSU1FX1ZFUlNJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05URU5UX0RJU1BPU0lUSU9OLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9BVVRIRU5USUNBVElPTl9JTkZPLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9TRVRfQ09PS0lFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DT09LSUUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT09LSUUyLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfU0VUX0NPT0tJRTIudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0RBVi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RFUFRILnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREVTVElOQVRJT04udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9JRi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0xPQ0tfVE9LRU4udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9PVkVSV1JJVEUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TVEFUVVNfVVJJLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVElNRU9VVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09OVEVOVF9CQVNFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFVCTElDLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ09OVEVOVF9WRVJTSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfREVSSVZFRF9GUk9NLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTElOSy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VSSS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0tFRVBfQUxJVkUudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0FfSU0udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9ERUxUQV9CQVNFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfSU0udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0RJR0VTVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1dBTlRfRElHRVNULnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9NRVRFUi50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQUNDRVBUX0ZFQVRVUkVTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQUxURVJOQVRFUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX05FR09USUFURS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RDTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1ZBUklBTlRfVkFSWS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfU0FGRS50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQUNDRVBUX0FERElUSU9OUy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09OVEVOVF9QUklWQUNZX0RPTUFJTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01BQ19JTkZPLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJFQVJSQU5HRURfS0VZX0lORk8udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NfRVhULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfQ19NQU4udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DX09QVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0VYVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01BTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX09QVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUElDU19MQUJFTC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1BST1RPQ09MLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPVE9DT0xfUkVRVUVTVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUDNQLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9DX1BFUC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NfUEVQX0lORk8udG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QRVAudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QRVBfSU5GTy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09OVEVOVF9JRC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0RJRkZFUkVOVElBTF9JRC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfU1VSUk9HQVRFX0NBUEFCSUxJVFkudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TVVJST0dBVEVfQ09OVFJPTC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUFJPVE9DT0wudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9UT0NPTF9JTkZPLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPVE9DT0xfUVVFUlkudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9QUk9UT0NPTF9SRVFVRVNULnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9HRVRQUk9GSUxFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPRklMRU9CSkVDVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1NFVFBST0ZJTEUudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1BST1hZX0ZFQVRVUkVTLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfUFJPWFlfSU5TVFJVQ1RJT04udG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT1NULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfTUVTU0FHRV9JRC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1RJVExFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVkVSU0lPTi50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfRVhURU5TSU9OLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9PUFRJT05BTC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1JFU09MVVRJT05fSElOVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfU1VCT0sudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TVUJTVC50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfQ09NUExJQU5DRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX05PTl9DT01QTElBTkNFLnRvVXBwZXJDYXNlKCksCi0KLSAgICAgIEhFQURFUl9SRVFVRVNUX1JBTkdFLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVUFfQ09MT1IudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VQV9DUFUudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9VQV9PUy50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX1VBX1BJWEVMUy50b1VwcGVyQ2FzZSgpLAotCi0gICAgICBIRUFERVJfUkVGRVJSRVIudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX0NPUFlSSUdIVC50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTlRFTlQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9BVVRIT1IudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9DT05UQUNULnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfS0VZV09SRFMudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9HRU5FUkFUT1IudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9ERVNDUklQVElPTi50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX0NPTU1BTkQudG9VcHBlckNhc2UoKSwKLSAgICAgIEhFQURFUl9TRVNTSU9OLnRvVXBwZXJDYXNlKCksCi0gICAgICBIRUFERVJfVFlQRS50b1VwcGVyQ2FzZSgpLAotICAgICAgSEVBREVSX01FU1NBR0UudG9VcHBlckNhc2UoKSwKLQotICAgICAgSEVBREVSX1VOTEVTU19NT0RJRklFRF9TSU5DRS50b1VwcGVyQ2FzZSgpCi0gICAgfSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9IVFRQVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0hUVFBVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzVlNDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0hUVFBVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTZXQgb2YgSFRUUEwgcmVsYXRlZCB1dGlsaXRpZXMuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbQotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBIVFRQVXRpbHMKLXsKLQotICAvKioKLSAgICogRmluZCB0aGUgVVJMIHN0cmluZyBpbiBhIEhUVFAgUE9TVCBoZWFkZXIuCi0gICAqIEBwYXJhbSBodHRwUG9zdEhlYWRlciAgYSBIVFRQIFBPU1QgaGVhZGVyLiAKLSAgICogQHJldHVybiB0aGUgVVJMIHN0cmluZyBpbiBhIEhUVFAgUE9TVCBoZWFkZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUkxTdHJpbmcoU3RyaW5nIGh0dHBQb3N0SGVhZGVyKQotICB7Ci0gICAgU3RyaW5nIHVybFN0cmluZyA9IG51bGw7Ci0gICAgaW50IHN0YXJ0LCBlbmQ7Ci0KLSAgICAvLyBJZiBQT1NULCB0aGVuIGNvbnRpbnVlCi0gICAgaWYgKGh0dHBQb3N0SGVhZGVyLnN0YXJ0c1dpdGgoIlBPU1QiKSB8fCBodHRwUG9zdEhlYWRlci5zdGFydHNXaXRoKCJHRVQiKSkKLSAgICB7Ci0gICAgICAvLyBTdGFydCBhZnRlciBmaXJzdCBzcGFjZQotICAgICAgc3RhcnQgPSBodHRwUG9zdEhlYWRlci5pbmRleE9mKCcgJykgKyAxOwotCi0gICAgICAvLyBMb29rIGZvciBuZXh0IG5vbi1zcGFjZSBjaGFyYWN0ZXIKLSAgICAgIHdoaWxlIChodHRwUG9zdEhlYWRlci5jaGFyQXQoc3RhcnQpID09ICcgJykKLSAgICAgICAgc3RhcnQrKzsKLQotICAgICAgLy8gRmluZCBuZXh0IHNwYWNlIGNoYXJhY3RlcgotICAgICAgZW5kID0gaHR0cFBvc3RIZWFkZXIuaW5kZXhPZignICcsIHN0YXJ0KTsKLQotICAgICAgLy8gR2V0IFVSTCBzdHJpbmcgd2hpY2ggaXMgbG9jYXRlZCBpbiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQKLSAgICAgIHVybFN0cmluZyA9IGh0dHBQb3N0SGVhZGVyLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICB9Ci0KLSAgICAvLyBFbHNlIHRocm93IGV4Y2VwdGlvbgotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiSFRUUCBoZWFkZXIgZG9lcyBub3QgY29udGFpbiBQT1NUIGRhdGEgKHdhczogIiArIGh0dHBQb3N0SGVhZGVyICsgIikiKTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gVVJMIHN0cmluZwotICAgIHJldHVybiB1cmxTdHJpbmc7Ci0gIH0KLSAgLyoqCi0gICAqIFV0aWxpdHkgdG8gcHJlc2VudCBIVFRQIGhlYWRlciBpbmZvcm1hdGlvbiBhcyBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsIAotICAgKiBiYXNlZCBvbiAnOicgYXMgYXR0cmlidXRlLXZhbHVlIHNlcGFyYXRvci4KLSAgICogQHBhcmFtIGh0dHBIZWFkZXJTdHJpbmcgYW4gSFRUUCBoZWFkZXIgc3RyaW5nLgotICAgKiBAcGFyYW0gc2VwYXJhdG9ycyBhdHRyaWJ1dGUtdmFsdWUgc2VwYXJhdG9yIGxpc3QuCi0gICAqIEByZXR1cm4gSFRUUCBoZWFkZXIgaW5mb3JtYXRpb24gYXMgYXR0cmlidXRlLXZhbHVlIHBhaXJzLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gY3JlYXRlIEhUVFAgaGVhZGVyIGluZm9ybWF0aW9uIAotICAgKiAgICAgICAgIGFzIGF0dHJpYnV0ZS12YWx1ZSBwYWlycy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTWFwIGdldEh0dHBIZWFkZXJUb2tlbnMoU3RyaW5nIGh0dHBIZWFkZXJTdHJpbmcsIFN0cmluZyBzZXBhcmF0b3JzKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGh0dHBIZWFkZXJTdHJpbmcsICJcblxyXGYiKTsKLSAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICBTdHJpbmcgbmFtZSA9IG51bGw7Ci0gICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgewotICAgICAgU3RyaW5nIGxpbmUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICBpbnQgaW5kZXggPSBsaW5lLmluZGV4T2Yoc2VwYXJhdG9ycyk7Ci0gICAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgbGluZS5sZW5ndGgoKSAtIDEpCi0gICAgICB7Ci0gICAgICAJbmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KS50b1VwcGVyQ2FzZSgpOwotICAgICAgICBtYXAucHV0KG5hbWUsIGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgMSkudHJpbSgpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChsaW5lLmxlbmd0aCgpPjApICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGluZS5jaGFyQXQoMCkpKQotICAgICAgICAgICBtYXAucHV0KG5hbWUsIG1hcC5nZXQobmFtZSkgKyAiICIgKyBsaW5lLnRyaW0oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBVdGlsaXR5IHRvIHRha2Ugc3ViIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIEhUVFAgaGVhZGVyCi0gICAqIEBwYXJhbSBodHRwSGVhZGVyU3RyaW5nIGFuIEhUVFAgaGVhZGVyIHN0cmluZy4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgYXR0cmlidXRlIG5hbWUuCi0gICAqIEBwYXJhbSBzdWJBdHRyaWJ1dGVOYW1lIHN1YiBhdHRyaWJ1dGUgbmFtZS4KLSAgICogQHJldHVybiBzdWIgYXR0cmlidXRlIHZhbHVlIGZyb20gSFRUUCBoZWFkZXIuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBnZXQgc3ViIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIEhUVFAgaGVhZGVyLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0dHBIZWFkZXJTdWJBdHRyaWJ1dGUoU3RyaW5nIGh0dHBIZWFkZXJTdHJpbmcsIAotICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBzdWJBdHRyaWJ1dGVOYW1lKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIGdldCBhdHRyaWJ1dGUgdmFsdWUKLSAgICBTdHJpbmcgdmFsdWUgPSAKLSAgICAgIChTdHJpbmcpIGdldEh0dHBIZWFkZXJUb2tlbnMoaHR0cEhlYWRlclN0cmluZywiOiIpLmdldChhdHRyaWJ1dGVOYW1lLnRvVXBwZXJDYXNlKCkpOwotICAgIGlmKHZhbHVlICE9IG51bGwpCi0gICAgewotICAgICAgLy8gc2VhcmNoIHN1YiBhdHRyaWJ1dGUgdG9rZW4KLSAgICAgIGludCBpZHhRID0gdmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKHN1YkF0dHJpYnV0ZU5hbWUudG9VcHBlckNhc2UoKSsiPVwiIik7Ci0gICAgICBpbnQgaWR4ID0gdmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKHN1YkF0dHJpYnV0ZU5hbWUudG9VcHBlckNhc2UoKSsiPSIpOwotICAgICAgLy8gaWYgYXR0cmlidXRlIGlzIHF1b3RlZAotICAgICAgaWYgKGlkeFEgIT0gLTEpIAotICAgICAgewotICAgICAgICBpZHhRICs9IChzdWJBdHRyaWJ1dGVOYW1lKyI9XCIiKS5sZW5ndGgoKTsKLSAgICAgICAgaW50IGVJZHhRID0gdmFsdWUuaW5kZXhPZigiXCIiLCBpZHhRKTsKLSAgICAgICAgaWYgKGVJZHhRICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyhpZHhRLCBlSWR4USk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBpZiBhdHRyaWJ1dGUgZG8gbm90IHF1b3RlZAotICAgICAgZWxzZSBpZiAoaWR4ICE9IC0xKQotICAgICAgewotICAgICAgICBpZHggKz0gKHN1YkF0dHJpYnV0ZU5hbWUrIj0iKS5sZW5ndGgoKTsKLSAgICAgICAgaW50IGVJZHggPSAtMTsKLSAgICAgICAgLy8gZmluZCBlbmQgc3BhY2Ugc2VwYXJhdG9yCi0gICAgICAgIGlmICgoZUlkeCA9IHZhbHVlLmluZGV4T2YoIiAiLCBpZHgpKSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaWR4LCBlSWR4KTsKLSAgICAgICAgfQotICAgICAgICAvLyBmaW5kIGNvbWEgc2VwYXJhdG9yCi0gICAgICAgIGVsc2UgaWYgKChlSWR4ID0gdmFsdWUuaW5kZXhPZigiOyIsIGlkeCkpICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyhpZHgsIGVJZHgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRoaXMgaXMgbGFzdCBhdHRyaWJ1dGUKLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaWR4KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gaWYgYXR0cmlidXRlIGRvIG5vdCBmb3VuZAotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBVdGlsaXR5IHRvIHRha2UgYXR0cmlidXRlIHZhbHVlIGZyb20gSFRUUCBoZWFkZXIKLSAgICogQHBhcmFtIGh0dHBIZWFkZXJTdHJpbmcgYW4gSFRUUCBoZWFkZXIgc3RyaW5nLgotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICogQHJldHVybiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBIVFRQIGhlYWRlci4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGdldCBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBIVFRQIGhlYWRlci4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIdHRwSGVhZGVyQXR0cmlidXRlKFN0cmluZyBodHRwSGVhZGVyU3RyaW5nLCAKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IAotICAgICAgICAoU3RyaW5nKSBnZXRIdHRwSGVhZGVyVG9rZW5zKGh0dHBIZWFkZXJTdHJpbmcsIjoiKS5nZXQoYXR0cmlidXRlTmFtZS50b1VwcGVyQ2FzZSgpKTsKLSAgICAvLyBnZXQgZmlyc3QgdG9rZW4KLSAgICBpZigoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZVZhbHVlLmluZGV4T2YoIjsiKSAhPSAtMSkpIHsKLSAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWUuc3Vic3RyaW5nKDAsIGF0dHJpYnV0ZVZhbHVlLmluZGV4T2YoIjsiKSk7Ci0gICAgfQotICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvSHR0cEhlYWRlcnNWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0h0dHBIZWFkZXJzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjQ4N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvSHR0cEhlYWRlcnNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgc3VuLm5ldC53d3cuTWVzc2FnZUhlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNoZWNrcyBIVFRQIHJlcXVlc3QgaGVhZGVycyBhYm91dCBSRkMgMjYxNi4KLSAqCi0gKiBAYXV0aG9yIFZvbG9kaW4gCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwSGVhZGVyc1ZhbGlkYXRvcgotewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUxMT1cgPSAiQWxsb3ciOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfVFlQRSA9ICJDb250ZW50LVR5cGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfRU5DT0RJTkcgPSAiQ29udGVudC1FbmNvZGluZyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9MQU5HVUFHRSA9ICJDb250ZW50LUxhbmd1YWdlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX0xFTkdIVCA9ICJDb250ZW50LUxlbmd0aCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9MT0NBVElPTiA9ICJDb250ZW50LUxvY2F0aW9uIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX01ENSA9ICJDb250ZW50LU1ENSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9SQU5HRSA9ICJDb250ZW50LVJhbmdlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9FWFBJUkVTID0gIkV4cGlyZXMiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0xBU1RfTU9ESUZJRUQgPSAiTGFzdC1Nb2RpZmllZCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ0FDSEVfQ09OVFJPTCA9ICJDYWNoZS1Db250cm9sIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05ORUNUSU9OID0gIkNvbm5lY3Rpb24iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0RBVEUgPSAiRGF0ZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJBR01BID0gIlByYWdtYSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVFJBSUxFUiA9ICJUcmFpbGVyIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9UUkFOU0ZFUl9FTkNPRElORyA9ICJUcmFuc2Zlci1FbmNvZGluZyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9VUEdSQURFID0gIlVwZ3JhZGUiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1ZJQSA9ICJWaWEiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1dBUk5JTkcgPSAiV2FybmluZyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFQgPSAiQWNjZXB0IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFRfQ0hBUlNFVCA9ICJBY2NlcHQtQ2hhcnNldCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX0VOQ09ESU5HID0gIkFjY2VwdC1FbmNvZGluZyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQUNDRVBUX0xBTkdVQUdFID0gIkFjY2VwdC1MYW5ndWFnZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQVVUSE9SSVpBVElPTiA9ICJBdXRob3JpemF0aW9uIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9FWFBFQ1QgPSAiRXhwZWN0IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9GUk9NID0gIkZyb20iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0hPU1QgPSAiSG9zdCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfSUZfTUFUQ0ggPSAiSWYtTWF0Y2giOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0lGX01PRElGSUVEX1NJTkNFID0gIklmLU1vZGlmaWVkLVNpbmNlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JRl9OT05FX01BVENIID0gIklmLU5vbmUtTWF0Y2giOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0lGX1JBTkdFID0gIklmLVJhbmdlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9JRl9VTk1PRElGSUVEX1NJTkNFID0KLSAgICAiSWYtVW5tb2RpZmllZC1TaW5jZSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTUFYX0ZPUldBUkRTID0gIk1heC1Gb3J3YXJkcyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJPWFlfQVVUSE9SSVpBVElPTiA9Ci0gICAgIlByb3h5LUF1dGhvcml6YXRpb24iOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1JBTkdFID0gIlJhbmdlIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9SRUZFUkVSID0gIlJlZmVyZXIiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RFID0gIlRFIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9VU0VSX0FHRU5UID0gIlVzZXItQWdlbnQiOwotCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGNoZWNrcyBlLW1haWwgc3RyaW5nIGFib3V0IFJGQyA4MjIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1haWxib3hWYWxpZGF0b3IKLSAgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBTUEVDSUFMID0KLSAgICAgIHsgJygnLCAnKScsICc8JywgJz4nLCAnQCcsICcsJywgJzsnLCAnOicsICdcXCcsICdcIicsICcuJywgJ1snLCAnXScgfTsKLQotICAgIC8qKgotICAgIAkqIFZhbGlkYXRlcyBlLW1haWwgc3RyaW5nLgotICAgICogQHBhcmFtIG1haWxib3ggZS1tYWlsIHN0cmluZwotICAgICogQHJldHVybiBib29sZWFuICB0cnVlIGlmIGUtbWFpbCBzdHJpbmcgaXMgY29uZm9ybSB0byBSRkMgODIyLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgKi8KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZU1haWxib3goU3RyaW5nIG1haWxib3gpCi0gICAgewotCi0gICAgICBpZiAoIWlzRnVsbEFkZHIobWFpbGJveCkgJiYgIWlzU2hvcnRBZGRyKG1haWxib3gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc1NpbXBsZUFkZHIuCi0gICAgICogQHBhcmFtIG1haWxib3gKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2hvcnRBZGRyKFN0cmluZyBtYWlsYm94KQotICAgIHsKLSAgICAgIGludCBpbmRleEF0ID0gbWFpbGJveC5pbmRleE9mKCdAJyk7Ci0gICAgICBpZiAoaW5kZXhBdCA9PSAtMSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWlzTG9jYWxQYXJ0KG1haWxib3guc3Vic3RyaW5nKDAsIGluZGV4QXQpKQotICAgICAgICB8fCAhaXNEb21haW4obWFpbGJveC5zdWJzdHJpbmcoaW5kZXhBdCArIDEpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXRob2QgaXNEb21haW0uCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RvbWFpbihTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLCAiLiIpOwotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHN1YkRvbWFpbiA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICBpZiAoIWlzQXRvbShzdWJEb21haW4pICYmICFpc0RvbWFpbkxpdGVyYWwoc3ViRG9tYWluKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc0RvbWFpbkxpdGVyYWwuCi0gICAgICogQHBhcmFtIHN1YkRvbWFpbgotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEb21haW5MaXRlcmFsKFN0cmluZyBzdWJEb21haW4pCi0gICAgewotICAgICAgaWYgKGdldExhc3REb21haW5MaXRlcmFsKHN1YkRvbWFpbiwgMCkgPT0gc3ViRG9tYWluLmxlbmd0aCgpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRMYXN0RG9tYWluTGl0ZXJhbChTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgICB7Ci0KLSAgICAgIGludCBpbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgICAvL2ludCBuZXdJbmRleCA9IDA7Ci0KLSAgICAgIC8vIGlmIGVuZCBpZiB0aGUgc3RyaW5nCi0gICAgICBpZiAoc3RhcnRJbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgLy8gaWYgdGhlIGJlZ2luIGlzIG5vdCAnWycKLSAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnWycpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICBpbmRleCsrOwotICAgICAgd2hpbGUgKHRydWUpCi0gICAgICB7Ci0gICAgICAgIGluZGV4ID0gZ2V0TGFzdER0ZXh0KHN0ciwgaW5kZXgpOwotICAgICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgICBpZiAoQmFzaWNSdWxlcy5pc1F1b3RlZFBhaXIoc3RyLCBpbmRleCAtIDEpKQotICAgICAgICB7Ci0gICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLy8gaWYgdGhlIGVuZCBpcyBub3QgJ10nCi0gICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJ10nKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgaW5kZXgrKzsKLSAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGFzdER0ZXh0KFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICAgIHsKLSAgICAgIGlmIChzdHIubGVuZ3RoKCkgPT0gc3RhcnRJbmRleCkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICBmb3IgKDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKQotICAgICAgewotICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLSAgICAgICAgaSA9IEJhc2ljUnVsZXMuZ2V0TGFzdEluZGV4TFdTKHN0ciwgaSk7Ci0gICAgICAgIGlmICghQmFzaWNSdWxlcy5pc0NIQVIoY2gpCi0gICAgICAgICAgfHwgc3RyLmNoYXJBdChpKSA9PSAnWycKLSAgICAgICAgICB8fCBzdHIuY2hhckF0KGkpID09ICddJwotICAgICAgICAgIHx8IHN0ci5jaGFyQXQoaSkgPT0gJ1xcJwotICAgICAgICAgIHx8IHN0ci5jaGFyQXQoaSkgPT0gQmFzaWNSdWxlcy5DUikKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBpICsgMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGkgKyAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc0xvY2FsUGFydC4KLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsUGFydChTdHJpbmcgc3RyaW5nKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLCAiLiIpOwotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc1dvcmQoc3QubmV4dFRva2VuKCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc1dvcmQuCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEByZXR1cm4gYm9vbGVhbgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXb3JkKFN0cmluZyBzdHJpbmcpCi0gICAgewotICAgICAgaWYgKCFpc0F0b20oc3RyaW5nKSAmJiAhaXNRdW90ZWRTdHJpbmcoc3RyaW5nKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIGlzQXRvbS4KLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0F0b20oU3RyaW5nIHN0cmluZykKLSAgICB7Ci0gICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmICghQmFzaWNSdWxlcy5pc0NIQVIoc3RyaW5nLmNoYXJBdChpKSkKLSAgICAgICAgICB8fCBpc1NwZWNpYWwoc3RyaW5nLmNoYXJBdChpKSkKLSAgICAgICAgICB8fCBzdHJpbmcuY2hhckF0KGkpID09ICcgJwotICAgICAgICAgIHx8IEJhc2ljUnVsZXMuaXNDVEwoc3RyaW5nLmNoYXJBdChpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc1NwZWNpYWwuCi0gICAgICogQHBhcmFtIGMKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3BlY2lhbChjaGFyIGNoKQotICAgIHsKLSAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBTUEVDSUFMLmxlbmd0aDsgaW5kZXgrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoID09IFNQRUNJQUxbaW5kZXhdKQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ldGhvZCBpc0Z1bGxBZGRyLgotICAgICAqIEBwYXJhbSBtYWlsYm94Ci0gICAgICogQHJldHVybiBib29sZWFuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0Z1bGxBZGRyKFN0cmluZyBtYWlsYm94KQotICAgIHsKLSAgICAgIGlmIChtYWlsYm94Lmxlbmd0aCgpID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGludCBpZHhMVCA9IG1haWxib3guaW5kZXhPZignPCcpOwotICAgICAgaWYgKGlkeExUID09IC0xKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8vaXMgcGhyYXNlCi0gICAgICBTdHJpbmcgcGhyYXNlID0gbWFpbGJveC5zdWJzdHJpbmcoMCwgaWR4TFQpOwotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwaHJhc2UsICIgIik7Ci0gICAgICBpZiAoc3QuY291bnRUb2tlbnMoKSA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICBpZiAoIWlzV29yZChzdC5uZXh0VG9rZW4oKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKHBocmFzZS5jaGFyQXQocGhyYXNlLmxlbmd0aCgpIC0gMSkgIT0gQmFzaWNSdWxlcy5TUCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICAvL2lzIHJvdXRlLWFkZHIKLSAgICAgIFN0cmluZyByb3V0ZUFkZHIgPSBtYWlsYm94LnN1YnN0cmluZyhpZHhMVCArIDEpOwotICAgICAgLy8gaXMgcm91dGUKLSAgICAgIGludCBpZHhUd29TcG90ID0gcm91dGVBZGRyLmluZGV4T2YoJzonKTsKLSAgICAgIGlmIChpZHhUd29TcG90ICE9IC0xKQotICAgICAgewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3RSb3V0ZUFkZHIgPQotICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIocm91dGVBZGRyLnN1YnN0cmluZygwLCBpZHhUd29TcG90KSwgIiwiKTsKLSAgICAgICAgaWYgKCFzdFJvdXRlQWRkci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB3aGlsZSAoc3RSb3V0ZUFkZHIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0RvbWFpbihzdFJvdXRlQWRkci5uZXh0VG9rZW4oKSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy9pcyBhZGRyIHNwZWMKLSAgICAgIGludCBpZHhHVCA9IHJvdXRlQWRkci5pbmRleE9mKCc+Jyk7Ci0gICAgICBpZiAoaWR4R1QgPT0gLTEgfHwgaWR4R1QgIT0gKHJvdXRlQWRkci5sZW5ndGgoKSAtIDEpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghaXNTaG9ydEFkZHIocm91dGVBZGRyLnN1YnN0cmluZyhpZHhUd29TcG90ICsgMSwgaWR4R1QpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBWYWxpZGF0ZXMgSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAqIEBwYXJhbSBoZWFkZXJzIEhUVFAgcmVxdWVzdCBoZWFkZXJzCi0gICAqIEByZXR1cm4gYm9vbGVhbiAgdHJ1ZSBpZiBhbGwgSFRUUCBoZWFkZXJzIHN0cmluZyBpcyBjb25mb3JtIHRvIFJGQyAyNjE2LCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZGF0ZUh0dHBSZXF1ZXN0SGVhZGVycyhTdHJpbmcgaGVhZGVycykKLSAgewotCi0gICAgTWVzc2FnZUhlYWRlciBtaCA9IG5ldyBNZXNzYWdlSGVhZGVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbWgucGFyc2VIZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGhlYWRlcnMuZ2V0Qnl0ZXMoKSkpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU3RyaW5nIGhlYWRlciA9IG51bGw7Ci0gICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotICAgIGhlYWRlciA9IG1oLmdldEtleSgwKTsKLSAgICBpZiAoaGVhZGVyICE9IG51bGwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB2YWx1ZSA9IG1oLmdldFZhbHVlKDApOwotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy9tZXRob2QKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiICIpOwotICAgIGlmICghc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotICAgIGlmICghaXNUb2tlbihzdHIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICBpZiAoIWlzVVJJKHN0cikgJiYgIXN0ci5lcXVhbHMoIioiKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0gICAgaWYgKCFpc0hUVFBWZXJzaW9uKHN0cikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpbnQgaSA9IDE7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgd2hpbGUgKChoZWFkZXIgPSBtaC5nZXRLZXkoaSkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gbWguZ2V0VmFsdWUoaSk7Ci0gICAgICAgIGkrKzsKLQotICAgICAgICAvLyBpcyBtZXNzYWdlLWhlYWRlciB0b2tlbgotICAgICAgICBpZiAoIWlzVG9rZW4oaGVhZGVyKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgLy8tLS0tIGVudGl0eS1oZWFkZXJzCi0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0FMTE9XKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZEFsbG93KHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9DT05URU5UX1RZUEUpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc01lZGlhVHlwZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0NPTlRFTlRfRU5DT0RJTkcpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1Rva2VuKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQ09OVEVOVF9MQU5HVUFHRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzTGFuZ3VhZ2VUYWcodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9DT05URU5UX0xFTkdIVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzRGlkZ2l0KHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQ09OVEVOVF9MT0NBVElPTikpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVVJJKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9DT05URU5UX1JBTkdFKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZENvbnRlbnRSYW5nZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfRVhQSVJFUykKLSAgICAgICAgICB8fCBoZWFkZXIuZXF1YWxzKEhFQURFUl9MQVNUX01PRElGSUVEKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNIVFRQRGF0ZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy0tLS0gZ2VuZXJhbC1oZWFkZXJzCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9DQUNIRV9DT05UUk9MKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZENhY2hlQ29udHJvbCh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAvL3JldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0NPTk5FQ1RJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1Rva2VuKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9EQVRFKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNIVFRQRGF0ZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfUFJBR01BKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNQcmFnbWFEZXJlY3RpdmUodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX1RSQUlMRVIpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1Rva2VuKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9UUkFOU0ZFUl9FTkNPRElORykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVHJhbnNmZXJDb2RpbmcodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX1VQR1JBREUpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkVXBncmFkZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfVklBKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNWYWxpZFZpYSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfV0FSTklORykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRXYXJuaW5nKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9BQ0NFUFQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkQWNjZXB0KHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9BQ0NFUFRfQ0hBUlNFVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRBY2NlcHRDaGFyU2V0KHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9BQ0NFUFRfRU5DT0RJTkcpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkQWNjZXB0RW5jb2RpbmcodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0FDQ0VQVF9MQU5HVUFHRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRBY2NlcHRMYW5ndWFnZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfQVVUSE9SSVpBVElPTikKLSAgICAgICAgICB8fCBoZWFkZXIuZXF1YWxzKEhFQURFUl9QUk9YWV9BVVRIT1JJWkFUSU9OKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNDcmVkZW50aWFscyh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0VYUEVDVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzRXhwZWN0YXRpb24odmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0ZST00pKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFNYWlsYm94VmFsaWRhdG9yLnZhbGlkYXRlTWFpbGJveCh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfSUZfTUFUQ0gpCi0gICAgICAgICAgfHwgaGVhZGVyLmVxdWFscyhIRUFERVJfSUZfTk9ORV9NQVRDSCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRJZk1hdGNoKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfSUZfUkFOR0UpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0VudGl0eVRhZyh2YWx1ZSkgJiYgIWlzSFRUUERhdGUodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8tLS0JCQkKLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0lGX01PRElGSUVEX1NJTkNFKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNIVFRQRGF0ZSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX0lGX1VOTU9ESUZJRURfU0lOQ0UpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc0hUVFBEYXRlKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfTUFYX0ZPUldBUkRTKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNEaWRnaXQodmFsdWUpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX1VTRVJfQUdFTlQpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1ZhbGlkVXNlckFnZW50KHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoZWFkZXIuZXF1YWxzKEhFQURFUl9URSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzVmFsaWRURSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfUkFOR0UpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1JhbmdlKHZhbHVlKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVhZGVyLmVxdWFscyhIRUFERVJfSE9TVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzSG9zdCh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhlYWRlci5lcXVhbHMoSEVBREVSX1JFRkVSRVIpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFpc1VSSSh2YWx1ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZElmTWF0Y2guCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZElmTWF0Y2goU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKCIqIi5lcXVhbHModmFsdWUudHJpbSgpKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgIGlmICghaXNFbnRpdHlUYWcoc3RyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRVcGdyYWRlLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRVcGdyYWRlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgaWYgKCFpc1Byb2R1Y3Qoc3RyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ZhbGlkQ2FjaGVDb250cm9sLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDYWNoZUNvbnRyb2woU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgaW50IGluZGV4ID0gc3RyLmluZGV4T2YoJz0nKTsKLSAgICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIHsKLQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIWlzVG9rZW4oc3RyLnN1YnN0cmluZygwLCBpbmRleCkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHN0ckFmdGVyRXEgPSBzdHIuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgIGlmICghaXNUb2tlbihzdHJBZnRlckVxKSAmJiAhaXNRdW90ZWRTdHJpbmcoc3RyQWZ0ZXJFcSkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNIVFRQVmVyc2lvbi4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIVFRQVmVyc2lvbihTdHJpbmcgc3RyKQotICB7Ci0gICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgiSFRUUC8iKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpbnQgaWR4ID0gIkhUVFAvIi5sZW5ndGgoKTsKLQotICAgIGludCBpZHgyID0gc3RyLmluZGV4T2YoIi4iKTsKLQotICAgIC8vIDEqRElHSVQKLSAgICBTdHJpbmcgcyA9IHN0ci5zdWJzdHJpbmcoaWR4LCBpZHgyKTsKLSAgICBpZiAoIWlzRGlkZ2l0KHMpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcyA9IHN0ci5zdWJzdHJpbmcoaWR4MiArIDEpOwotICAgIGlmICghaXNEaWRnaXQocykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZFdhcm5pbmcuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdhcm5pbmcoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiAiKTsKLSAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCk7Ci0KLSAgICBpZiAoc3RyLmxlbmd0aCgpID4gMyB8fCAhaXNEaWRnaXQoc3RyKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotICAgIGlmICghaXNIb3N0KHN0cikgJiYgIWlzVG9rZW4oc3RyKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vaWYoIXN0Lmhhc01vcmVUb2tlbnMoKSkgcmV0dXJuIGZhbHNlOwotICAgIHN0ciA9IHN0Lm5leHRUb2tlbigiIikudHJpbSgpOwotICAgIC8vPz8/Ci0KLSAgICBpbnQgbGFzdFF1b3RlZFN0cmluZyA9IEJhc2ljUnVsZXMuZ2V0TGFzdFF1b3RlZFN0cmluZyhzdHIsIDApOwotICAgIGlmIChsYXN0UXVvdGVkU3RyaW5nID09IHN0ci5sZW5ndGgoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBkYXRhID0gc3RyLnN1YnN0cmluZyhsYXN0UXVvdGVkU3RyaW5nKTsKLSAgICAgIGlmIChkYXRhLmNoYXJBdChkYXRhLmxlbmd0aCgpKSAhPSAnXCInKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoc3RyLmNoYXJBdCgwKSAhPSAnXCInKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIWlzSFRUUERhdGUoc3RyLnN1YnN0cmluZygxLCBkYXRhLmxlbmd0aCgpIC0gMSkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRWaWEuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFZpYShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0KLSAgICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0KLSAgICAgIFN0cmluZ1Rva2VuaXplciBzdDIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgIiAiKTsKLQotICAgICAgLy8gcHJvdG9jb2wvdmVyc2lvbgotICAgICAgc3RyID0gc3QyLm5leHRUb2tlbigpOwotICAgICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCIvIik7Ci0gICAgICBpZiAoaWR4ID09IC0xKQotICAgICAgewotICAgICAgICBpZiAoIWlzVG9rZW4oc3RyKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNUb2tlbihzdHIuc3Vic3RyaW5nKDAsIGlkeCkpCi0gICAgICAgICAgfHwgIWlzVG9rZW4oc3RyLnN1YnN0cmluZyhpZHggKyAxKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICAvL2hvc3QKLSAgICAgIHN0ciA9IHN0Mi5uZXh0VG9rZW4oKTsKLSAgICAgIGlmICghaXNIb3N0KHN0cikgJiYgIWlzVG9rZW4oc3RyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAvL2NvbW1lbnQKLSAgICAgIGlmIChzdDIuaGFzTW9yZVRva2VucygpKQotICAgICAgewotICAgICAgICBzdHIgPSBzdDIubmV4dFRva2VuKCIiKTsKLSAgICAgICAgaWYgKCFpc0NvbW1lbnQoc3RyLnRyaW0oKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNIb3N0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSG9zdChTdHJpbmcgdmFsdWUpCi0gIHsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJodHRwOi8vIiArIHZhbHVlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRBbGxvdy4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQWxsb3coU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgaWYgKCFpc1Rva2VuKHN0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVmFsaWRDb250ZW50UmFuZ2UuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZENvbnRlbnRSYW5nZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoImJ5dGVzIikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgU3RyaW5nIHN0ciA9IHZhbHVlLnN1YnN0cmluZygiYnl0ZXMiLmxlbmd0aCgpKS50cmltKCk7Ci0KLSAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoIi8iKTsKLSAgICBpZiAoaWR4ID09IC0xKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3RyaW5nIGJ5dGVSYW5nZSA9IHN0ci5zdWJzdHJpbmcoMCwgaWR4KTsKLSAgICBpbnQgaWR4MiA9IGJ5dGVSYW5nZS5pbmRleE9mKCItIik7Ci0gICAgaWYgKGlkeDIgPT0gLTEpCi0gICAgewotICAgICAgaWYgKCFieXRlUmFuZ2UuZXF1YWxzKCIqIikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICghaXNEaWRnaXQoYnl0ZVJhbmdlLnN1YnN0cmluZygwLCBpZHgyKSkKLSAgICAgICAgfHwgIWlzRGlkZ2l0KGJ5dGVSYW5nZS5zdWJzdHJpbmcoaWR4MiArIDEpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghaXNEaWRnaXQoc3RyLnN1YnN0cmluZyhpZHggKyAxKSkKLSAgICAgICYmICFzdHIuc3Vic3RyaW5nKGlkeCArIDEpLmVxdWFscygiKiIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzUmFuZ2UuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSYW5nZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIXZhbHVlLnN0YXJ0c1dpdGgoImJ5dGVzPSIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZyBzdHJCeXRlUmFuZ2UgPSB2YWx1ZS5zdWJzdHJpbmcoImJ5dGVzPSIubGVuZ3RoKCkpOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJCeXRlUmFuZ2UsICIsIik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIGludCBpZHggPSBzdHIuaW5kZXhPZigiLSIpOwotICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGlkeCA9PSAwKQotICAgICAgewotICAgICAgICBpZiAoIWlzRGlkZ2l0KHN0ci5zdWJzdHJpbmcoMSkpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKGlkeCA9PSAoc3RyLmxlbmd0aCgpIC0gMSkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlzRGlkZ2l0KHN0ci5zdWJzdHJpbmcoMCwgc3RyLmxlbmd0aCgpIC0gMSkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICghaXNEaWRnaXQoc3RyLnN1YnN0cmluZygwLCBpZHgpKQotICAgICAgICAgICAgfHwgIWlzRGlkZ2l0KHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZFRFLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRURShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICBpZiAoc3QuZXF1YWxzKCJ0cmFpbGVycyIpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCI7Iik7Ci0gICAgICBpZiAoaWR4ID09IC0xKQotICAgICAgewotICAgICAgICBpZiAoIWlzTGFuZ3VhZ2VSYW5nZShzdHIpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIF8xID0gc3RyLnN1YnN0cmluZygwLCBpZHgpLnRyaW0oKTsKLSAgICAgICAgU3RyaW5nIF8yID0gc3RyLnN1YnN0cmluZyhpZHggKyAxKS50cmltKCk7Ci0gICAgICAgIGlmICghaXNMYW5ndWFnZVJhbmdlKF8xKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghaXNRQW5kUVZhbHVlKF8yKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZFVzZXJBZ2VudC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVXNlckFnZW50KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIgIik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIGlmICghaXNQcm9kdWN0KHN0cikgJiYgIWlzQ29tbWVudChzdHIpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNDb21tZW50LgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbW1lbnQoU3RyaW5nIHN0cikKLSAgewotICAgIGlmIChCYXNpY1J1bGVzLmdldExhc3RDb21tZW50KHN0ciwgMCkgIT0gc3RyLmxlbmd0aCgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ZhbGlkQWNjZXB0TGFuZ3VhZ2UuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFjY2VwdExhbmd1YWdlKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoIjsiKTsKLSAgICAgIGlmIChpZHggPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNUb2tlbihzdHIpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIF8xID0gc3RyLnN1YnN0cmluZygwLCBpZHgpLnRyaW0oKTsKLSAgICAgICAgU3RyaW5nIF8yID0gc3RyLnN1YnN0cmluZyhpZHggKyAxKS50cmltKCk7Ci0gICAgICAgIGlmICghaXNUb2tlbihfMSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWlzQWNjZXB0UGFyYW1zKF8yKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNMYW5ndWFnZVJhbmdlLgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xhbmd1YWdlUmFuZ2UoU3RyaW5nIHN0cikKLSAgewotICAgIGlmIChzdHIudHJpbSgpLmVxdWFscygiKiIpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICItIik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIGlmICghaXM4QUxQSEEoc3QubmV4dFRva2VuKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ZhbGlkQWNjZXB0RW5jb2RpbmcuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEFjY2VwdEVuY29kaW5nKFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHIgPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoIjsiKTsKLSAgICAgIGlmIChpZHggPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNUb2tlbihzdHIpICYmICFzdHIuZXF1YWxzKCIqIikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmcgXzEgPSBzdHIuc3Vic3RyaW5nKDAsIGlkeCkudHJpbSgpOwotICAgICAgICBTdHJpbmcgXzIgPSBzdHIuc3Vic3RyaW5nKGlkeCArIDEpLnRyaW0oKTsKLQotICAgICAgICBpZiAoKCFpc1Rva2VuKF8xKSAmJiAhXzEuZXF1YWxzKCIqIikpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFpc1FBbmRRVmFsdWUoXzIpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ZhbGlkQWNjZXB0Q2hhclNldC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQWNjZXB0Q2hhclNldChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOwotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCI7Iik7Ci0gICAgICBpZiAoaWR4ID09IC0xKQotICAgICAgewotICAgICAgICBpZiAoIWlzVG9rZW4oc3RyKSAmJiAhc3RyLmVxdWFscygiKiIpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIF8xID0gc3RyLnN1YnN0cmluZygwLCBpZHgpLnRyaW0oKTsKLSAgICAgICAgU3RyaW5nIF8yID0gc3RyLnN1YnN0cmluZyhpZHggKyAxKS50cmltKCk7Ci0KLSAgICAgICAgaWYgKCghaXNUb2tlbihfMSkgJiYgIV8xLmVxdWFscygiKiIpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghaXNRQW5kUVZhbHVlKF8yKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNWYWxpZEFjY2VwdC4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQWNjZXB0KFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsKLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgIGludCBpZHggPSBzdHIuaW5kZXhPZigiOyIpOwotICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFpc01lZGlhUmFuZ2Uoc3RyKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNNZWRpYVJhbmdlKHN0ci5zdWJzdHJpbmcoMCwgaWR4KS50cmltKCkpCi0gICAgICAgICAgfHwgIWlzQWNjZXB0UGFyYW1zKHN0ci5zdWJzdHJpbmcoaWR4ICsgMSkudHJpbSgpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNBY2NlcHRQYXJhbXMuCi0gICAqIEBwYXJhbSBzdHJpbmcKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQWNjZXB0UGFyYW1zKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBpZiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsICI7Iik7Ci0gICAgU3RyaW5nIHN0ciA9IHN0Lm5leHRUb2tlbigpOwotCi0gICAgaW50IGlkeCA9IHN0ci5pbmRleE9mKCI9Iik7Ci0gICAgaWYgKGlkeCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoc3RyLmVxdWFscygicSIpIHx8ICFpc1Rva2VuKHN0cikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzdHIuc3Vic3RyaW5nKDAsIGlkeCkuZXF1YWxzKCJxIikpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNRVmFsdWUoc3RyLnN1YnN0cmluZyhpZHggKyAxKSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIWlzUGFyYW1ldGVyV2l0aG91dFZhbHVlKHN0cikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBzdHIgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIGlmICghaXNQYXJhbWV0ZXJXaXRob3V0VmFsdWUoc3RyKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNRQW5kUVZhbHVlLgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1FBbmRRVmFsdWUoU3RyaW5nIHN0cikKLSAgewotICAgIHN0ciA9IHN0ci50cmltKCk7Ci0gICAgaWYgKCFzdHIudHJpbSgpLnN0YXJ0c1dpdGgoInE9IikpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFpc1FWYWx1ZShzdHIuc3Vic3RyaW5nKCJxPSIubGVuZ3RoKCkpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNRVmFsdWUuCi0gICAqIEBwYXJhbSBzdHJpbmcKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUVZhbHVlKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBpZiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IGlkeCA9IHN0cmluZy5pbmRleE9mKCIuIik7Ci0gICAgaWYgKGlkeCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISIwIi5lcXVhbHMoc3RyaW5nKSAmJiAhIjEiLmVxdWFscyhzdHJpbmcpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgc3RyRGlnID0gc3RyaW5nLnN1YnN0cmluZyhpZHggKyAxKTsKLSAgICAgIGlmIChzdHJEaWcubGVuZ3RoKCkgPiAzKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJpbmcuc3Vic3RyaW5nKDAsIGlkeCkuZXF1YWxzKCIwIikpCi0gICAgICB7Ci0gICAgICAgIGlmICghaXNEaWRnaXQoc3RyRGlnKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFzdHJpbmcuc3Vic3RyaW5nKDAsIGlkeCkuZXF1YWxzKCIxIikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyRGlnLmxlbmd0aCgpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc3RyRGlnLmNoYXJBdChpKSAhPSAnMCcpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNNZWRpYVJhbmdlLgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01lZGlhUmFuZ2UoU3RyaW5nIHN0cikKLSAgewotICAgIGlmIChzdHIudHJpbSgpLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpbnQgaWR4ID0gc3RyLmluZGV4T2YoIi8iKTsKLSAgICBpZiAoaWR4ID09IC0xKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFpc1Rva2VuKHN0ci5zdWJzdHJpbmcoMCwgaWR4KSkgJiYgIXN0ci5zdWJzdHJpbmcoMCwgaWR4KS5lcXVhbHMoIioiKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIWlzVG9rZW4oc3RyLnN1YnN0cmluZyhpZHggKyAxKSkKLSAgICAgICYmICFzdHIuc3Vic3RyaW5nKGlkeCArIDEpLmVxdWFscygiKiIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzRW50aXR5VGFnLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW50aXR5VGFnKFN0cmluZyB2YWx1ZSkKLSAgewotCi0gICAgaW50IGlkeCA9IDA7Ci0gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIlcvIikpCi0gICAgICBpZHggPSAyOwotICAgIGlmICghaXNRdW90ZWRTdHJpbmcodmFsdWUuc3Vic3RyaW5nKGlkeCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc0V4cGVjdGF0aW9uLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRXhwZWN0YXRpb24oU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmVxdWFscygiMTAwLWNvbnRpbnVlIikpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICI7Iik7Ci0gICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgIHsKLSAgICAgIGlmICghaXNQYXJhbWV0ZXJXaXRob3V0VmFsdWUoc3QubmV4dFRva2VuKCkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzQ3JlZGVudGlhbHMuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDcmVkZW50aWFscyhTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiICIpOwotICAgIGlmICghaXNUb2tlbihzdC5uZXh0VG9rZW4oKSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB3aGlsZSAoc3QuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgewotICAgICAgU3RyaW5nIHBhcmFtID0gc3QubmV4dFRva2VuKCIsIik7Ci0gICAgICBpZiAoIWlzUGFyYW1ldGVyKHBhcmFtKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNQcm9kdWN0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHJvZHVjdChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpbnQgaWR4ID0gdmFsdWUuaW5kZXhPZigiLyIpOwotICAgIGlmIChpZHggPT0gLTEpCi0gICAgewotICAgICAgaWYgKCFpc1Rva2VuKHZhbHVlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCFpc1Rva2VuKHZhbHVlLnN1YnN0cmluZygwLCBpZHgpKQotICAgICAgICB8fCAhaXNUb2tlbih2YWx1ZS5zdWJzdHJpbmcoaWR4ICsgMSkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1RyYW5zZmVyQ29kaW5nLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVHJhbnNmZXJDb2RpbmcoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmVxdWFscygiY2h1bmtlZCIpKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIjsiKTsKLSAgICAgIGlmICghaXNUb2tlbihzdC5uZXh0VG9rZW4oKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBpZiAoIWlzUGFyYW1ldGVyKHN0Lm5leHRUb2tlbigpKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNQYXJhbWV0ZXIuCi0gICAqIEBwYXJhbSBzdHJpbmcKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUGFyYW1ldGVyKFN0cmluZyBzdHJpbmcpCi0gIHsKLQotICAgIC8vIGNoZWNrIHBhcmFtZXRlcgkKLSAgICBpbnQgaWR4ID0gc3RyaW5nLmluZGV4T2YoIj0iKTsKLSAgICBpZiAoIWlzVG9rZW4oc3RyaW5nLnN1YnN0cmluZygwLCBpZHgpKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIFN0cmluZyBwYXJWYWx1ZSA9IHN0cmluZy5zdWJzdHJpbmcoaWR4ICsgMSk7Ci0gICAgaWYgKCFpc1Rva2VuKHBhclZhbHVlKSAmJiAhaXNRdW90ZWRTdHJpbmcocGFyVmFsdWUpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzUGFyYW1ldGVyV2l0aG91dFZhbHVlLgotICAgKiBAcGFyYW0gc3RyaW5nCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BhcmFtZXRlcldpdGhvdXRWYWx1ZShTdHJpbmcgc3RyaW5nKQotICB7Ci0KLSAgICAvLyBjaGVjayBwYXJhbWV0ZXIJCi0gICAgaW50IGlkeCA9IHN0cmluZy5pbmRleE9mKCI9Iik7Ci0gICAgaWYgKGlkeCAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoIWlzVG9rZW4oc3RyaW5nLnN1YnN0cmluZygwLCBpZHgpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgU3RyaW5nIHBhclZhbHVlID0gc3RyaW5nLnN1YnN0cmluZyhpZHggKyAxKTsKLSAgICAgIGlmICghaXNUb2tlbihwYXJWYWx1ZSkgJiYgIWlzUXVvdGVkU3RyaW5nKHBhclZhbHVlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIWlzVG9rZW4oc3RyaW5nKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1ByYWdtYURlcmVjdGl2ZS4KLSAgICogQHBhcmFtIHZhbHVlCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ByYWdtYURlcmVjdGl2ZShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUuZXF1YWxzKCJuby1jYWNoZSIpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGludCBpZHggPSB2YWx1ZS5pbmRleE9mKCI9Iik7Ci0gICAgICBpZiAoaWR4ID09IC0xKQotICAgICAgewotICAgICAgICBpZiAoaXNUb2tlbih2YWx1ZSkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSB2YWx1ZS5zdWJzdHJpbmcoaWR4ICsgMSk7Ci0gICAgICAgIGlmIChpc1Rva2VuKHZhbHVlLnN1YnN0cmluZygwLCBpZHgpKQotICAgICAgICAgICYmIChpc1Rva2VuKHN0cikgfHwgaXNRdW90ZWRTdHJpbmcoc3RyKSkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc0hUVFBEYXRlLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSFRUUERhdGUoU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBTdHJpbmcgcmZjMTEyM19kYXRlID0gIkVFRSwgZGQgTU1NIHl5eXkgaGg6bW06c3MgJ0dNVCciOwotICAgIFN0cmluZyByZmM4NTBfZGF0ZSA9ICJFRUVFLCBkZC1NTU0teXkgaGg6bW06c3MgJ0dNVCciOwotICAgIFN0cmluZyBhc2N0aW1lX2RhdGUgPSAiRUVFIE1NTSBkIGhoOm1tOnNzIHl5eXkiOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChyZmMxMTIzX2RhdGUsIExvY2FsZS5VUyk7Ci0gICAgICBpZiAoc2RmLnBhcnNlKHZhbHVlKSAhPSBudWxsKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQocmZjODUwX2RhdGUsIExvY2FsZS5VUyk7Ci0gICAgICBpZiAoc2RmLnBhcnNlKHZhbHVlKSAhPSBudWxsKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoYXNjdGltZV9kYXRlLCBMb2NhbGUuVVMpOwotICAgICAgaWYgKHNkZi5wYXJzZSh2YWx1ZSkgIT0gbnVsbCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNVUkkuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVUkkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgVVJMIHVybDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwodmFsdWUpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3QiICsgdmFsdWUpOwotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMikKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc0xhbmd1YWdlVGFnLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGFuZ3VhZ2VUYWcoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaW50IGlkeCA9IHZhbHVlLmluZGV4T2YoIi0iKTsKLSAgICBpZiAoaWR4ID09IC0xKQotICAgIHsKLSAgICAgIHJldHVybiBpczhBTFBIQSh2YWx1ZSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIWlzOEFMUEhBKHZhbHVlLnN1YnN0cmluZygwLCBpZHgpKQotICAgICAgICB8fCAhaXM4QUxQSEEodmFsdWUuc3Vic3RyaW5nKGlkeCArIDEpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXM4QUxQSEEuCi0gICAqIEBwYXJhbSBzdHJpbmcKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzOEFMUEhBKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBpZiAoc3RyaW5nLmxlbmd0aCgpID4gOCB8fCAhaXNBTFBIQShzdHJpbmcpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGVsc2UKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc0FMUEhBLgotICAgKiBAcGFyYW0gc3RyaW5nCi0gICAqIEByZXR1cm4gYm9vbGVhbgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FMUEhBKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGgoKTsgaSsrKQotICAgIHsKLSAgICAgIGlmICghQmFzaWNSdWxlcy5pc0NIQVIoc3RyaW5nLmNoYXJBdChpKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNEaWRnaXQuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEaWRnaXQoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2hhcltdIGNocyA9IHZhbHVlLnRvQ2hhckFycmF5KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNoc1tpXSA8ICcwJyB8fCBjaHNbaV0gPiAnOScpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgaXNNZWRpYVR5cGUuCi0gICAqIEBwYXJhbSB2YWx1ZQotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNZWRpYVR5cGUoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIjsiKTsKLSAgICBTdHJpbmcgbWVkaWFUeXBlID0gc3QubmV4dFRva2VuKCk7Ci0KLSAgICBpbnQgaWR4ID0gbWVkaWFUeXBlLmluZGV4T2YoIi8iKTsKLSAgICBpZiAoIWlzVG9rZW4obWVkaWFUeXBlLnN1YnN0cmluZygwLCBpZHgpKQotICAgICAgfHwgIWlzVG9rZW4obWVkaWFUeXBlLnN1YnN0cmluZyhpZHggKyAxKSkpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlIChzdC5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICB7Ci0gICAgICBpZiAoIWlzUGFyYW1ldGVyKHN0Lm5leHRUb2tlbigiOyIpLnRyaW0oKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzUXVvdGVkU3RyaW5nLgotICAgKiBAcGFyYW0gcGFyVmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUXVvdGVkU3RyaW5nKFN0cmluZyBwYXJWYWx1ZSkKLSAgewotICAgIGlmIChCYXNpY1J1bGVzLmdldExhc3RRdW90ZWRTdHJpbmcocGFyVmFsdWUsIDApICE9IHBhclZhbHVlLmxlbmd0aCgpKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGlzVGV4dC4KLSAgICogQHBhcmFtIHRleHQKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGV4dChTdHJpbmcgdGV4dCkKLSAgewotICAgIGNoYXJbXSBjaHMgPSB0ZXh0LnRvQ2hhckFycmF5KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGNoc1tpXSA9PSAnXCInKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc1Rva2VuLgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVG9rZW4oU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgcmV0dXJuIEJhc2ljUnVsZXMuaXNUb2tlbih2YWx1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL0phdmFFbmNvZGluZy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvSmF2YUVuY29kaW5nLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTM1MzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvSmF2YUVuY29kaW5nLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyAgSUJNIENvcnBvcmF0aW9uLCBCZWFjb24gSW5mb3JtYXRpb24gVGVjaG5vbG9neSBJbmMuIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNICAgICAgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICogICBCZWFjb25JVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKiA8L2NvcHlyaWdodD4KLSMgICovCi0jIyBJMThOOiAyMDAzLjAyLjI2IG1vZGlmaWVkIGJ5IEsuTmFrYWdvbWVAQmVhY29uSVQgCi0jIyBQcm9wZXJ0eSBmaWxlIHVzZWQgdG8gZ2V0IEphdmFWTSBzdXBwb3J0ZWQgY2hhcmFjdGVyIGVuY29kaW5nLgotCi1JU084ODU5XzE9SVNPODg1OV8xIAotSVNPODg1OS0xPUlTTzg4NTlfMSAKLXV0Zjg9VVRGOCAKLXV0Zi04PVVURjggCi1VVEYtOD1VVEY4IAotdXRmMTY9VVRGLTE2IAotdXRmLTE2PVVURi0xNiAKLVVURjE2PVVURi0xNiAKLQotIyMgCi1TaGlmdF9KSVM9V2luZG93cy0zMUoKLQotTVM5MzI9V2luZG93cy0zMUoKLSNTSklTPVNoaWZ0X0pJUwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL01JTUVDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL01JTUVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0YjRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9NSU1FQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotLyoqCi0gKiBBIHNldCBvZiBIVFRQIHZhbHVlcyB0aGF0IGFyZSBkZWZpbmVkIGJ5IE5ldHdvcmsgV29ya2luZyBHcm91cC4KLSAqIGh0dHA6Ly93d3cuaWV0Zi5vcmcvCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAYXV0aG9yIElseWEgS2Fub25pcm92IChraW9AaXNnLmF4bW9yLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIE1JTUVDb25zdGFudHMgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQ09OVEVOVF9JRCA9ICJDb250ZW50LUlEIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX0NPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkcgPSAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9DT05URU5UX1RZUEUgPSAiQ29udGVudC1UeXBlIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9NSU1FVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL01JTUVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmZkOTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL01JTUVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTZXQgb2YgSFRUUEwgcmVsYXRlZCB1dGlsaXRpZXMuCi0gKgotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbQotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNSU1FVXRpbHMKLXsKLQotICAvKioKLSAgICogVXRpbGl0eSB0byBwcmVzZW50IE1JTUUgaGVhZGVyIGluZm9ybWF0aW9uIGFzIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywgCi0gICAqIGJhc2VkIG9uICc6JyBhcyBhdHRyaWJ1dGUtdmFsdWUgc2VwYXJhdG9yLgotICAgKiBAcGFyYW0gbWltZUhlYWRlclN0cmluZyBhbiBNSU1FIGhlYWRlciBzdHJpbmcuCi0gICAqIEBwYXJhbSBzZXBhcmF0b3JzIGF0dHJpYnV0ZS12YWx1ZSBzZXBhcmF0b3IgbGlzdC4KLSAgICogQHJldHVybiBNSU1FIGhlYWRlciBpbmZvcm1hdGlvbiBhcyBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgTUlNRSBoZWFkZXIgaW5mb3JtYXRpb24gCi0gICAqICAgICAgICAgYXMgYXR0cmlidXRlLXZhbHVlIHBhaXJzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBNYXAgZ2V0TWltZUhlYWRlclRva2VucyhTdHJpbmcgbWltZUhlYWRlclN0cmluZywgU3RyaW5nIHNlcGFyYXRvcnMpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWltZUhlYWRlclN0cmluZywgIlxuXHJcZiIpOwotICAgIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgIHsKLSAgICAgIFN0cmluZyBsaW5lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgaW50IGluZGV4ID0gbGluZS5pbmRleE9mKHNlcGFyYXRvcnMpOwotICAgICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8IGxpbmUubGVuZ3RoKCkgLSAxKQotICAgICAgewotICAgICAgICBtYXAucHV0KGxpbmUuc3Vic3RyaW5nKDAsIGluZGV4KS50b1VwcGVyQ2FzZSgpLCBsaW5lLnN1YnN0cmluZyhpbmRleCArIDEpLnRyaW0oKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBVdGlsaXR5IHRvIHRha2Ugc3ViIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIE1JTUUgaGVhZGVyCi0gICAqIEBwYXJhbSBtaW1lSGVhZGVyU3RyaW5nIGFuIE1JTUUgaGVhZGVyIHN0cmluZy4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgYXR0cmlidXRlIG5hbWUuCi0gICAqIEBwYXJhbSBzdWJBdHRyaWJ1dGVOYW1lIHN1YiBhdHRyaWJ1dGUgbmFtZS4KLSAgICogQHJldHVybiBzdWIgYXR0cmlidXRlIHZhbHVlIGZyb20gTUlNRSBoZWFkZXIuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBnZXQgc3ViIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIE1JTUUgaGVhZGVyLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1pbWVIZWFkZXJTdWJBdHRyaWJ1dGUoU3RyaW5nIG1pbWVIZWFkZXJTdHJpbmcsIAotICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBzdWJBdHRyaWJ1dGVOYW1lKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIC8vIGdldCBhdHRyaWJ1dGUgdmFsdWUKLSAgICBTdHJpbmcgdmFsdWUgPSAKLSAgICAgIChTdHJpbmcpIGdldE1pbWVIZWFkZXJUb2tlbnMobWltZUhlYWRlclN0cmluZywiOiIpLmdldChhdHRyaWJ1dGVOYW1lLnRvVXBwZXJDYXNlKCkpOwotICAgIGlmKHZhbHVlICE9IG51bGwpCi0gICAgewotICAgICAgLy8gc2VhcmNoIHN1YiBhdHRyaWJ1dGUgdG9rZW4KLSAgICAgIGludCBpZHhRID0gdmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKHN1YkF0dHJpYnV0ZU5hbWUudG9VcHBlckNhc2UoKSsiPVwiIik7Ci0gICAgICBpbnQgaWR4ID0gdmFsdWUudG9VcHBlckNhc2UoKS5pbmRleE9mKHN1YkF0dHJpYnV0ZU5hbWUudG9VcHBlckNhc2UoKSsiPSIpOwotICAgICAgLy8gaWYgYXR0cmlidXRlIGlzIHF1b3RlZAotICAgICAgaWYgKGlkeFEgIT0gLTEpIAotICAgICAgewotICAgICAgICBpZHhRICs9IChzdWJBdHRyaWJ1dGVOYW1lKyI9XCIiKS5sZW5ndGgoKTsKLSAgICAgICAgaW50IGVJZHhRID0gdmFsdWUuaW5kZXhPZigiXCIiLCBpZHhRKTsKLSAgICAgICAgaWYgKGVJZHhRICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyhpZHhRLCBlSWR4USk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBpZiBhdHRyaWJ1dGUgaXMgbm90IHF1b3RlZAotICAgICAgZWxzZSBpZiAoaWR4ICE9IC0xKQotICAgICAgewotICAgICAgICBpZHggKz0gKHN1YkF0dHJpYnV0ZU5hbWUrIj0iKS5sZW5ndGgoKTsKLSAgICAgICAgaW50IGVJZHggPSAtMTsKLSAgICAgICAgLy8gZmluZCBlbmQgc3BhY2Ugc2VwYXJhdG9yCi0gICAgICAgIGlmICgoZUlkeCA9IHZhbHVlLmluZGV4T2YoIiAiLCBpZHgpKSAhPSAtMSkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaWR4LCBlSWR4KTsKLSAgICAgICAgfQotICAgICAgICAvLyBmaW5kIGNvbWEgc2VwYXJhdG9yCi0gICAgICAgIGVsc2UgaWYgKChlSWR4ID0gdmFsdWUuaW5kZXhPZigiOyIsIGlkeCkpICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyhpZHgsIGVJZHgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRoaXMgaXMgbGFzdCBhdHRyaWJ1dGUKLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoaWR4KTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gaWYgYXR0cmlidXRlIGRvIG5vdCBmb3VuZAotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBVdGlsaXR5IHRvIHRha2UgYXR0cmlidXRlIHZhbHVlIGZyb20gTUlNRSBoZWFkZXIKLSAgICogQHBhcmFtIG1pbWVIZWFkZXJTdHJpbmcgYW4gTUlNRSBoZWFkZXIgc3RyaW5nLgotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBhdHRyaWJ1dGUgbmFtZS4KLSAgICogQHJldHVybiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBNSU1FIGhlYWRlci4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGdldCBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBNSU1FIGhlYWRlci4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lSGVhZGVyQXR0cmlidXRlKFN0cmluZyBtaW1lSGVhZGVyU3RyaW5nLCAKLSAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICAgIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IAotICAgICAgICAoU3RyaW5nKSBnZXRNaW1lSGVhZGVyVG9rZW5zKG1pbWVIZWFkZXJTdHJpbmcsIjoiKS5nZXQoYXR0cmlidXRlTmFtZS50b1VwcGVyQ2FzZSgpKTsKLSAgICAvLyBnZXQgZmlyc3QgdG9rZW4KLSAgICBpZigoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgJiYgKGF0dHJpYnV0ZVZhbHVlLmluZGV4T2YoIjsiKSAhPSAtMSkpIHsKLSAgICAgIGF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWUuc3Vic3RyaW5nKDAsIGF0dHJpYnV0ZVZhbHVlLmluZGV4T2YoIjsiKSk7Ci0gICAgfQotICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvTWVzc2FnZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL01lc3NhZ2VMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNGYwOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvTWVzc2FnZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYW5kIG1haW50YWlucyBhIG1lc3NhZ2UgbGlzdC4KLSAqIAotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VMaXN0Ci17Ci0gIC8qKgotICAgKiBNZXNzYWdlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgbWVzc2FnZVJlc291cmNlQnVuZGxlID0gbnVsbDsKLQotICAvKioKLSAgICogRG8gbm90IGFsbG93IHRoaXMgb2JqZWN0IHRvIGJlIGNyZWF0ZWQgd2l0aCBudWxsIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJpdmF0ZSBNZXNzYWdlTGlzdCgpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgTWVzc2FnZUxpc3QuCi0gICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZU5hbWUgIGEgcmVzb3VyY2UgYnVuZGxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUxpc3QoU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkKLSAgewotICAgIHRoaXMubWVzc2FnZVJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEgbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgICAgIGEga2V5LgotICAgKiBAcGFyYW0gZGVmYXVsdE1lc3NhZ2UgICAgICBhIGRlZmF1bHQgbWVzc2FnZS4KLSAgICogQHJldHVybiBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICByZXR1cm4gZ2V0TWVzc2FnZShrZXksIG51bGwsIGRlZmF1bHRNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgICAgYSBrZXkuCi0gICAqIEBwYXJhbSBtZXNzYWdlRGF0YSAgICAgICAgIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlICAgICAgYSBkZWZhdWx0IG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gbWVzc2FnZSBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoCi0gICAgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgbWVzc2FnZURhdGEsCi0gICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSBkZWZhdWx0TWVzc2FnZTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBtZXNzYWdlCi0gICAgICBtZXNzYWdlID0gbWVzc2FnZVJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBJZ25vcmUgYW5kIGp1c3QgdXNlIGRlZmF1bHQgbWVzc2FnZQotICAgIH0KLQotICAgIGlmIChtZXNzYWdlRGF0YSAhPSBudWxsKQotICAgICAgbWVzc2FnZSArPSAiICIgKyBtZXNzYWdlRGF0YTsKLQotICAgIC8vIFJldHVybiBtZXNzYWdlCi0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnQgYSBtZXNzYWdlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLSAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgICAgYSBrZXkuCi0gICAqIEBwYXJhbSBkZWZhdWx0TWVzc2FnZSAgICAgIGEgZGVmYXVsdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcHJpbnRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIHByaW50TWVzc2FnZShrZXksIG51bGwsIGRlZmF1bHRNZXNzYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBhIG1lc3NhZ2UgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgICBhIGtleS4KLSAgICogQHBhcmFtIG1lc3NhZ2VEYXRhICAgICAgICAgbWVzc2FnZSBkYXRhLgotICAgKiBAcGFyYW0gZGVmYXVsdE1lc3NhZ2UgICAgICBhIGRlZmF1bHQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByaW50TWVzc2FnZSgKLSAgICBTdHJpbmcga2V5LAotICAgIFN0cmluZyBtZXNzYWdlRGF0YSwKLSAgICBTdHJpbmcgZGVmYXVsdE1lc3NhZ2UpCi0gIHsKLSAgICAvLyBQcmludCBtZXNzYWdlCi0gICAgU3lzdGVtLm91dC5wcmludGxuKGdldE1lc3NhZ2Uoa2V5LCBtZXNzYWdlRGF0YSwgZGVmYXVsdE1lc3NhZ2UpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdGF0aWMgZ2V0IG1lc3NhZ2UuCi0gICAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZU5hbWUgIHJlc291cmNlIGJ1bmRsZSBuYW1lLgotICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgICBhIGtleS4KLSAgICogQHBhcmFtIG1lc3NhZ2VEYXRhICAgICAgICAgbWVzc2FnZSBkYXRhLgotICAgKiBAcGFyYW0gZGVmYXVsdE1lc3NhZ2UgICAgICBhIGRlZmF1bHQgbWVzc2FnZS4KLSAgICogQHJldHVybiBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZSgKLSAgICBTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lLAotICAgIFN0cmluZyBrZXksCi0gICAgU3RyaW5nIG1lc3NhZ2VEYXRhLAotICAgIFN0cmluZyBkZWZhdWx0TWVzc2FnZSkKLSAgewotICAgIFN0cmluZyBtZXNzYWdlID0gZGVmYXVsdE1lc3NhZ2U7Ci0gICAgUmVzb3VyY2VCdW5kbGUgbWVzc2FnZVJlc291cmNlQnVuZGxlID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCByZXNvdXJjZSBidW5kbGUKLSAgICAgIG1lc3NhZ2VSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZUJ1bmRsZU5hbWUpOwotCi0gICAgICAvLyBHZXQgbWVzc2FnZQotICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gSWdub3JlIGFuZCBqdXN0IHVzZSBkZWZhdWx0IG1lc3NhZ2UKLSAgICB9Ci0KLSAgICBpZiAobWVzc2FnZURhdGEgIT0gbnVsbCkKLSAgICAgIG1lc3NhZ2UgKz0gIiAiICsgbWVzc2FnZURhdGE7Ci0KLSAgICBpZiAoIW1lc3NhZ2UuZW5kc1dpdGgoIi4iKSkKLSAgICAgIG1lc3NhZ2UgKz0gIi4iOwotCi0gICAgLy8gUmV0dXJuIG1lc3NhZ2UKLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludCBtZXNzYWdlLgotICAgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGVOYW1lICByZXNvdXJjZSBidW5kbGUgbmFtZS4KLSAgICogQHBhcmFtIGtleSAgICAgICAgICAgICAgICAgYSBrZXkuCi0gICAqIEBwYXJhbSBtZXNzYWdlRGF0YSAgICAgICAgIG1lc3NhZ2UgZGF0YS4KLSAgICogQHBhcmFtIGRlZmF1bHRNZXNzYWdlICAgICAgYSBkZWZhdWx0IG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRNZXNzYWdlKAotICAgIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUsCi0gICAgU3RyaW5nIGtleSwKLSAgICBTdHJpbmcgbWVzc2FnZURhdGEsCi0gICAgU3RyaW5nIGRlZmF1bHRNZXNzYWdlKQotICB7Ci0gICAgLy8gUHJpbnQgbWVzc2FnZQotICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgIGdldE1lc3NhZ2UocmVzb3VyY2VCdW5kbGVOYW1lLCBrZXksIG1lc3NhZ2VEYXRhLCBkZWZhdWx0TWVzc2FnZSkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL051bGxVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9OdWxsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdjY2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL051bGxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotLyoqCi0gKiBUaGUgdXRpbGl0eSBjbGFzcyB0byBhdXRvbWF0ZSBudWxsIGNoZWNraW5nLgotICogCi0gKiBAYXV0aG9yIEt1bGlrCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsVXRpbAotewotICAvKioKLSAgICogVGhlIG1ldGhvZCBjaGVja3Mgb2JqZWN0cyBvbiBleGlzdGVuY2UgYW5kIGNvbXBhcmUgd2l0aCA8Y29kZT5lcXVhbHM8L2NvZGU+IG1ldGhvZC4KLSAgICogQHBhcmFtIG8xIGZpcnN0IG9iamVjdC4KLSAgICogQHBhcmFtIG8yIHNlY29uZCBvYmplY3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBmaXJzdCBvYmplY3QgaXMgZXF1YWwgdG8gdGhlIHNlY29uZCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICB7Ci0gICAgcmV0dXJuICgobzEgPT0gbnVsbCAmJiBvMiA9PSBudWxsKSB8fCAobzEgIT0gbnVsbCAmJiBvMS5lcXVhbHMobzIpKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBjaGVja3Mgb2JqZWN0IG9uIGV4aXN0ZW5jZSBhbmQgcmV0dXJucyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHdpdGggPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gbWV0aG9kLgotICAgKiBAcGFyYW0gbyBzb3VyY2Ugb2JqZWN0LgotICAgKiBAcmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhPYmplY3QgbykKLSAgewotICAgIHJldHVybiAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL09wZXJhdGlvblNpZ25hdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvT3BlcmF0aW9uU2lnbmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOWEzZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvT3BlcmF0aW9uU2lnbmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGUgY2xhc3MgaW1wbGVtZW50cyBtZWNoYW5pc20gZm9yIGNyZWF0aW5nIHVuaXF1ZSBzaWduYXR1cmUgb2Ygb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEt1bGlrCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBPcGVyYXRpb25TaWduYXR1cmUKLXsKLSAgLy8gdGhlIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIG1lc3NhZ2VzIGlzIHJlcHJlc2VudGVkIGFzIGRvY3VtZW50IHN0eWxlCi0gIC8vIHZpY2UgdmVyc2EgaXMgbm90IGdlbmVyYWxseSB0cnVlCi0gIHByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50U3R5bGUgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gaXNGYXVsdCA9IGZhbHNlOwotCi0gIHByb3RlY3RlZCBMaXN0IHNpZ25hdHVyZSA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gIHByaXZhdGUgRWxlbWVudCBmaXJzdEJvZHkgPSBudWxsOwotCi0gIC8qKgotICAgKiBDbGFzcyBvcGVyYXRlcyBhcyBjb250YWluZXIgZm9yIG1hdGNoZWQgb3BlcmF0aW9uLgotICAqIEBhdXRob3IgS3VsaWsKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgT3BlcmF0aW9uTWF0Y2gKLSAgewotICAgIGZpbmFsIHByaXZhdGUgU3RyaW5nIHN0eWxlOwotICAgIGZpbmFsIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb247Ci0gICAgZmluYWwgcHJpdmF0ZSBMaXN0IHNpZ25hdHVyZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBzdHlsZSBvcGVyYXRpb24gc3R5bGUuCi0gICAgICogQHBhcmFtIHNpZ25hdHVyZSBhIHNpZ25hdHVyZS4KLSAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIGEgYmluZGluZyBvcGVyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9wZXJhdGlvbk1hdGNoKAotICAgICAgU3RyaW5nIHN0eWxlLAotICAgICAgTGlzdCBzaWduYXR1cmUsCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTsKLSAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBHZXRzIG9wZXJhdGlvbiBzdHlsZS4KLSAgICAgKiBAcmV0dXJuIG9wZXJhdGlvbiBzdHlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9wZXJhdGlvblN0eWxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3R5bGU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEdldHMgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBvYmplY3QuCi0gICAgICogQHJldHVybiBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBvcGVyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBvcGVyYXRpb24gc2lnbmF0dXJlIGFzIGxpc3QuCi0gICAgICogQHJldHVybiBvcGVyYXRpb24gc2lnbmF0dXJlIGFzIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIExpc3QgZ2V0U2lnbmF0dXJlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2lnbmF0dXJlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgY2xhc3Mgc2VhcmNoZXMgQmluZGluZ09wZXJhdGlvbiBieSB0aGUgZ2l2ZW4gT3BlcmF0aW9uU2lnYm5hdHVyZS4gCi0gICogQGF1dGhvciBLdWxpawotICAgKi8KLSAgcHVibGljIGZpbmFsIGNsYXNzIFZpc2l0b3IgaW1wbGVtZW50cyBXU0RMVmlzaXRvcgotICB7Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLlBhcnQsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoUGFydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLlNlcnZpY2UsIGphdmEubGFuZy5PYmplY3QsIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoU2VydmljZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLlR5cGVzLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KFR5cGVzIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuT3BlcmF0aW9uLCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KE9wZXJhdGlvbiBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLklucHV0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KElucHV0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuT3V0cHV0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KE91dHB1dCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkZhdWx0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KEZhdWx0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuQmluZGluZywgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChCaW5kaW5nIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbiwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICAgIEJpbmRpbmdPcGVyYXRpb24gb2JqLAotICAgICAgT2JqZWN0IHBhcmVudCwKLSAgICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkJpbmRpbmdJbnB1dCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICAgIEJpbmRpbmdJbnB1dCBvYmosCi0gICAgICBPYmplY3QgcGFyZW50LAotICAgICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuQmluZGluZ091dHB1dCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICAgIEJpbmRpbmdPdXRwdXQgb2JqLAotICAgICAgT2JqZWN0IHBhcmVudCwKLSAgICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChCaW5kaW5nRmF1bHQsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgICBCaW5kaW5nRmF1bHQgb2JqLAotICAgICAgT2JqZWN0IHBhcmVudCwKLSAgICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKSAKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoSW1wb3J0LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KEltcG9ydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKSAKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoRWxlbWVudCwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChFbGVtZW50IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KE1lc3NhZ2UsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoTWVzc2FnZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChQb3J0LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoUG9ydFR5cGUsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoUG9ydFR5cGUgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoRGVmaW5pdGlvbiwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChEZWZpbml0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpIAotICAgICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChFeHRlbnNpYmlsaXR5RWxlbWVudCwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IG9iaiwKLSAgICAgIE9iamVjdCBwYXJlbnQsCi0gICAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykgCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBIZWFkZXIsIE9iamVjdCwgV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdmlzaXQoU09BUEhlYWRlciBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKSAKLSAgICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoU09BUEhlYWRlckZhdWx0LCBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgICAgU09BUEhlYWRlckZhdWx0IG9iaiwKLSAgICAgIE9iamVjdCBwYXJlbnQsCi0gICAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykgCi0gICAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBGYXVsdCwgT2JqZWN0LCBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQRmF1bHQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJlcXVpcmVkU3R5bGUgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHNvYXBBY3Rpb24gPSBudWxsOwotICAgIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBudWxsOwotICAgIHByaXZhdGUgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzU09BUEFjdGlvblJlcXVpcmVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAqIENvbnN0cnVjdG9yLgotICAgICovCi0gICAgcHVibGljIFZpc2l0b3IoKQotICAgIHsKLSAgICAgIHN1cGVyKCk7Ci0gICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gcmVxdWlyZWRTdHlsZSByZXF1aXJlZCBzdHlsZS4KLSAgICAgKiBAcGFyYW0gcmVnaXN0cnkgdHlwZXMgcmVnaXN0cnkuCi0gICAgICovCi0gICAgcHVibGljIFZpc2l0b3IoU3RyaW5nIHJlcXVpcmVkU3R5bGUsIFR5cGVzUmVnaXN0cnkgcmVnaXN0cnkpCi0gICAgewotICAgICAgdGhpcy5yZXF1aXJlZFN0eWxlID0gcmVxdWlyZWRTdHlsZTsKLSAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0aG9kIHJldHVybnMgbWF0Y2hlZCBiaW5kaW5nIG9wZXJhdGlvbi4KLSAgICAgKiBAcmV0dXJuIEJpbmRpbmdPcGVyYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQmluZGluZ09wZXJhdGlvbiBnZXRNYXRjaGVkT3BlcmF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gb3BlcmF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRob2Qgc2V0cyB1cCByZXF1aXJlZCBvcGVyYXRpb24gdG8gYmUgZm91bmQuCi0gICAgICogVGhlIHBvc3NpYmxlIHZhbHVlcyBpcyBycGMgYW5kIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSByZXF1aXJlZFN0eWxlIG9wZXJhdGlvbiBzdHlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZFN0eWxlKFN0cmluZyByZXF1aXJlZFN0eWxlKQotICAgIHsKLSAgICAgIHRoaXMucmVxdWlyZWRTdHlsZSA9IHJlcXVpcmVkU3R5bGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGhvZCBpbmRpY2F0ZXMgd2hldGhlciBTT0FQIEFjdGlvbiBiZSBpbmNsdWRlZCBpbnRvIG9wZXJhdGlvbi4KLSAgICAgKiBzaWduYXR1cmUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIFNPQVAgQWN0aW9uIGlzZCByZXF1aXJlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NPQVBBY3Rpb25SZXF1aXJlZCgpCi0gICAgewotICAgICAgcmV0dXJuIGlzU09BUEFjdGlvblJlcXVpcmVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgU09BUCBhY3Rpb24gdG8gYmUgaW5jbHVkZWQgaW50byBzaWduYXR1cmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U09BUEFjdGlvblJlcXVpcmVkKCkKLSAgICB7Ci0gICAgICBpc1NPQVBBY3Rpb25SZXF1aXJlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW50ZXJuYWwgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgICAgU09BUEJpbmRpbmcgYmluZGluZywKLSAgICAgIE9iamVjdCBwYXJlbnQsCi0gICAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gICAgewotICAgICAgU3RyaW5nIHN0eWxlID0KLSAgICAgICAgKGJpbmRpbmcuZ2V0U3R5bGUoKSA9PSBudWxsKQotICAgICAgICAgID8gV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX0RPQwotICAgICAgICAgIDogYmluZGluZy5nZXRTdHlsZSgpOwotICAgICAgY3R4LmFkZFBhcmFtZXRlcigic3R5bGUiLCBzdHlsZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW50ZXJuYWwgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgICAgU09BUE9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgICBPYmplY3QgcGFyZW50LAotICAgICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICAgIHsKLSAgICAgIHNvYXBBY3Rpb24gPSBudWxsOwotICAgICAgU3RyaW5nIHN0eWxlID0gb3BlcmF0aW9uLmdldFN0eWxlKCk7Ci0gICAgICBpZiAoc3R5bGUgPT0gbnVsbCkKLSAgICAgICAgc3R5bGUgPSAoU3RyaW5nKSBjdHguZ2V0UGFyYW1ldGVyKCJzdHlsZSIpOwotICAgICAgaWYgKCFyZXF1aXJlZFN0eWxlLmVxdWFscyhzdHlsZSkpCi0gICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgICAgZWxzZQotICAgICAgICAvL2lmIChpc1NPQVBBY3Rpb25SZXF1aXJlZCkKLSAgICAgICAgc29hcEFjdGlvbiA9IG9wZXJhdGlvbi5nZXRTb2FwQWN0aW9uVVJJKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogaW50ZXJuYWwgbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBCb2R5IGJvZHksIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgICB7Ci0gICAgICAvLyBhc3NlcnQgcGFyZW50IGluc3RhbmNlb2YgQmluZGluZ0lucHV0Ci0gICAgICBCaW5kaW5nT3BlcmF0aW9uIGJvcCA9IGN0eC5nZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICBpZiAoYm9wLmdldE9wZXJhdGlvbigpID09IG51bGwKLSAgICAgICAgfHwgYm9wLmdldE9wZXJhdGlvbigpLmdldElucHV0KCkgPT0gbnVsbAotICAgICAgICB8fCBib3AuZ2V0T3BlcmF0aW9uKCkuZ2V0SW5wdXQoKS5nZXRNZXNzYWdlKCkgPT0gbnVsbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBNZXNzYWdlIG1zZyA9IGJvcC5nZXRPcGVyYXRpb24oKS5nZXRJbnB1dCgpLmdldE1lc3NhZ2UoKTsKLSAgICAgIExpc3QgcGFydHMgPQotICAgICAgICBXU0RMVXRpbC5nZXRQYXJ0cyhib3AuZ2V0T3BlcmF0aW9uKCksIG1zZywgYm9keSwgcmVxdWlyZWRTdHlsZSk7Ci0KLSAgICAgIFFOYW1lIGFkZGl0aW9uYWxOYW1lID0gbnVsbDsKLSAgICAgIC8vIGlmIG9wZXJhdGlvbiBpcyBycGMsIGFkZCB0byBwYXJ0cyBxbmFtZSBxaXRoIGZ1bmN0aW9uIG5hbWUKLSAgICAgIGlmIChXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDLmVxdWFscyhyZXF1aXJlZFN0eWxlKSkKLSAgICAgIHsKLSAgICAgICAgLy8gZm91bmQgb3V0IHRhcmdldCBuYW1lc3BhY2UKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IGJvZHkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCB8fCBuYW1lc3BhY2UubGVuZ3RoKCkgPT0gMCkKLSAgICAgICAgICAvLyAhISBBVFRFTlRJT04KLSAgICAgICAgICAvLyBuYW1lc3BhY2Ugc2hvdWxkIGJlIHJldHJpZXZlZCBmcm9tIHNlcnZpY2UgdGFyZ2V0IG5hbWVhcGNlICAgICAgICAgICAgCi0gICAgICAgICAgbmFtZXNwYWNlID0gY3R4LmdldEJpbmRpbmcoKS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCi0gICAgICAgIC8vIGluc2VydCBvcGVyYXRpb24gbmFtZSBhcyBmaXJzdCBzaWduYXR1cmUgcGFydAotICAgICAgICBhZGRpdGlvbmFsTmFtZSA9Ci0gICAgICAgICAgbmV3IFFOYW1lKG5hbWVzcGFjZSwgY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKS5nZXROYW1lKCkpOwotICAgICAgfQotCi0gICAgICBPcGVyYXRpb25TaWduYXR1cmUgb3AgPQotICAgICAgICBuZXcgT3BlcmF0aW9uU2lnbmF0dXJlKHBhcnRzLCBudWxsLCByZWdpc3RyeSwgZmFsc2UpOwotCi0gICAgICBpZiAoYWRkaXRpb25hbE5hbWUgIT0gbnVsbCkKLSAgICAgICAgb3AuZ2V0U2lnbmF0dXJlKCkuYWRkKDAsIGFkZGl0aW9uYWxOYW1lKTsKLSAgICAgIC8vaWYgKGlzU09BUEFjdGlvblJlcXVpcmVkKQotICAgICAgLy9pZiAoc29hcEFjdGlvbiAhPSBudWxsKQotICAgICAgaWYgKGlzU09BUEFjdGlvblJlcXVpcmVkICYmIHNvYXBBY3Rpb24gIT0gbnVsbCkKLSAgICAgICAgb3AuZ2V0U2lnbmF0dXJlKCkuYWRkKDAsIHNvYXBBY3Rpb24pOwotICAgICAgaWYgKG9wLmdldFNpZ25hdHVyZSgpLmVxdWFscyhzaWduYXR1cmUpKQotICAgICAgewotICAgICAgICAvLyByZXF1aXJlZCBvcGVyYXRpb24gaXMgZm91bmQKLSAgICAgICAgb3BlcmF0aW9uID0gY3R4LmdldEJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICAgIGN0eC5jYW5jZWxCaW5kaW5nUHJvY2Vzc2luZygpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG9wID0gbmV3IE9wZXJhdGlvblNpZ25hdHVyZShwYXJ0cywgbnVsbCwgcmVnaXN0cnksIHRydWUpOwotICAgICAgICBpZiAoYWRkaXRpb25hbE5hbWUgIT0gbnVsbCkKLSAgICAgICAgICBvcC5nZXRTaWduYXR1cmUoKS5hZGQoMCwgYWRkaXRpb25hbE5hbWUpOwotCi0gICAgICAgIC8vaWYgKGlzU09BUEFjdGlvblJlcXVpcmVkKQotICAgICAgICAvL2lmIChzb2FwQWN0aW9uICE9IG51bGwpCi0gICAgICAgIGlmIChpc1NPQVBBY3Rpb25SZXF1aXJlZCAmJiBzb2FwQWN0aW9uICE9IG51bGwpCi0gICAgICAgICAgb3AuZ2V0U2lnbmF0dXJlKCkuYWRkKDAsIHNvYXBBY3Rpb24pOwotCi0gICAgICAgIGlmIChvcC5nZXRTaWduYXR1cmUoKS5lcXVhbHMoc2lnbmF0dXJlKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIHJlcXVpcmVkIG9wZXJhdGlvbiBpcyBmb3VuZAotICAgICAgICAgIG9wZXJhdGlvbiA9IGN0eC5nZXRCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgICAgICAgY3R4LmNhbmNlbEJpbmRpbmdQcm9jZXNzaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgT3BlcmF0aW9uU2lnbmF0dXJlIGZvciBTT0FQIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBkb2MgYSBEb2N1bWVudCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgT3BlcmF0aW9uU2lnbmF0dXJlKERvY3VtZW50IGRvYykKLSAgewotICAgIEVsZW1lbnQgYm9keSA9Ci0gICAgICBYTUxVdGlscy5maW5kQ2hpbGRFbGVtZW50KAotICAgICAgICBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksCi0gICAgICAgIFdTSVRhZy5FTEVNX1NPQVBfQk9EWSk7Ci0gICAgcHJvY2Vzc1BhcnRzKGJvZHksIGZhbHNlKTsKLSAgICBpc0RvY3VtZW50U3R5bGUgfD0gKHNpZ25hdHVyZS5zaXplKCkgPiAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgY29uc3RydWN0b3IgY3JlYXRlcyBPcGVyYXRpb25TSWduYXR1cmUgZm9yIAotICAgKiBsaXN0IG9mIDxjb2RlPlBhcnQ8L2NvZGU+IG9iamVjdHMgYW5kIGdpdmVuIFdTREwgZG9jdW1lbnQgd2l0aGluIHRoZXNlCi0gICAqIHBhcnRzIGFyZSBkZWZpbmVkLgotICAgKiAKLSAgICogQHBhcmFtIHBhcnRzIGEgbGlzdCBvZiBQYXJ0IG9iamVjdHMuCi0gICAqIEBwYXJhbSB3c2RsRG9jdW1lbnQgYSBXU0RMIGRvY3VtZW50LgotICAgKiBAcGFyYW0gcmVnaXN0cnkgYSB0eXBlcyByZWdpc3RyeS4KLSAgICogQHBhcmFtIHBhcnRpYWwgYSBwYXJ0aWFsIHN0YXR1cy4KLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb25TaWduYXR1cmUoCi0gICAgTGlzdCBwYXJ0cywKLSAgICBEb2N1bWVudCB3c2RsRG9jdW1lbnQsCi0gICAgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSwKLSAgICBib29sZWFuIHBhcnRpYWwpCi0gIHsKLSAgICBpZiAocGFydHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IHBhcnRzLml0ZXJhdG9yKCk7Ci0KLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFBhcnQgcGFydCA9IChQYXJ0KSBpdC5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBsb2NhbE5hbWUgPSAocGFydGlhbCkgPyBwYXJ0LmdldE5hbWUoKSA6IG51bGw7Ci0gICAgICAgIFFOYW1lIHR5cGVOYW1lID0gcGFydC5nZXRUeXBlTmFtZSgpOwotICAgICAgICBRTmFtZSBlbGVtZW50TmFtZSA9IHBhcnQuZ2V0RWxlbWVudE5hbWUoKTsKLQotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gIiI7Ci0KLSAgICAgICAgLy8gSWYgdHlwZSBuYW1lIGlzIG5vdCBudWxsLCB0aGVuIGEgdHlwZSBlbGVtZW50IHdhcyB1c2VkIHNvIGl0IHNob3VsZCBiZSBhbiBSUEMgc3R5bGUgc2lnbmF0dXJlIAotICAgICAgICBpZiAodHlwZU5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIC8vIFBhcnQgd3JhcHBlcnMgZG8gbm90IGhhdmUgbmFtZXNwYWNlcyAKLSAgICAgICAgICBuYW1lc3BhY2UgPSAiIjsKLQotICAgICAgICAgIGlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIGxvY2FsTmFtZSA9IHR5cGVOYW1lLmdldExvY2FsUGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgZWxlbWVudCBuYW1lIGlzIG5vdCBudWxsLCB0aGVuIGl0IHNob3VsZCBiZSBhIGRvY3VtZW50IHN0eWxlIHNpZ25hdHVyZQotICAgICAgICBlbHNlIGlmIChlbGVtZW50TmFtZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlID0gZWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLSAgICAgICAgICBpZiAobG9jYWxOYW1lID09IG51bGwpCi0gICAgICAgICAgICBsb2NhbE5hbWUgPSBlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpZ25hdHVyZS5hZGQobmV3IFFOYW1lKG5hbWVzcGFjZSwgbG9jYWxOYW1lKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaXNDcmVhdGVkID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHJlY3JlYXRlcyBPcGVyYXRpb25TaWduYXR1cmUgd2l0aCBhc3N1bXB0aW9uIHRoYXQgb3BlcmF0aW9uIGlzCi0gICAqIFJQQy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVJQQ1NpZ25hdHVyZSgpCi0gIHsKLSAgICBpc0NyZWF0ZWQgPSBmYWxzZTsKLSAgICBpZiAoZmlyc3RCb2R5ID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgcHJvY2Vzc1BhcnRzKGZpcnN0Qm9keSwgdHJ1ZSk7Ci0gICAgaXNEb2N1bWVudFN0eWxlID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogSW50ZXJuYWwgbWV0aG9kIHByb2Nlc3NlcyBXU0RMIHBhcnRzIGFuZCBjcmVhdGVzIG9wZXJhdGlvbiBzaWduYXR1cmUuCi0gICAqIEBwYXJhbSBwYXJlbnQKLSAgICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzUGFydHMoTm9kZSBwYXJlbnQsIGJvb2xlYW4gcHJvY2Vzc1dyYXBwZXIpCi0gIHsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgewotICAgICAgTm9kZSBuID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQotICAgICAgLy8gdmFyaWFibGUgaW5kaWNhdGVzIHRoYXQgZmlyc3QgdGFnIGlzIHByb2Nlc3NlZAotICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKLSAgICAgIC8vIGl0ZXJhdGUgYWxsIGJvZGllcwotICAgICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0ZpcnN0ICYmIGZpcnN0Qm9keSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIGZpcnN0Qm9keSA9IChFbGVtZW50KSBuOwotICAgICAgICAgICAgLy8gY2hlY2sgc29hcGVudjpmYXVsdAotICAgICAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBXU0lUYWcuRUxFTV9TT0FQX0ZBVUxUKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXNGYXVsdCA9IHRydWU7Ci0gICAgICAgICAgICAgIGlzQ3JlYXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZSA9IG4uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgU3RyaW5nIGxvY2FsTmFtZSA9IG4uZ2V0TG9jYWxOYW1lKCk7Ci0KLSAgICAgICAgICAvKkkgaGF2ZSBubyBpZGVhIHdoeSB0aGlzIGNvZGUgaXMgaW4gaGVyZSBzaW5jZSBpdCBtYWtlcyBubyBzZW5zZSBhdCBhbGwsIHNvIEkgYW0gY29tbWVudGluZyBpdCBvdXQKLSAgICAgICAgICAvLyB0cnkgdG8gZ2V0IHhzaTp0YWcKLSAgICAgICAgICBpZiAoWE1MVXRpbHMuZ2V0QXR0cmlidXRlKChFbGVtZW50KSBuLCBXU0lUYWcuQVRUUl9YU0lfVFlQRSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAvLyB3ZSBzdXBwb3NlIHRoYXQgUlBDIHN0eWxlIGRvZXMgbm90IHVzZSB4c2k6dHlwZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAgaXNEb2N1bWVudFN0eWxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgQXR0ciB4c2lUeXBlID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKChFbGVtZW50KSBuLCBXU0lUYWcuQVRUUl9YU0lfVFlQRSk7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBTdHJpbmcgeHNpVmFsdWUgPSB4c2lUeXBlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICBpbnQgaSA9IHhzaVZhbHVlLmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgICAgaWYgKGkgIT0gLTEpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IFhNTFV0aWxzLmZpbmROYW1lc3BhY2VVUkkobiwgeHNpVmFsdWUuc3Vic3RyaW5nKDAsIGkpKTsKLSAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IHhzaVZhbHVlLnN1YnN0cmluZyhpKzEpOwotICAgICAgICAgICAgICB9IAotICAgICAgICAgIH0KLSAgICAgICAgICAqLwotCi0gICAgICAgICAgLy8gSWYgdGhpcyBpcyBycGMtbGl0ZXJhbCBhbmQgcHJvY2Vzc2luZyBhIHBhcnQgKG5vdCB0aGUgd3JhcHBlciksIHRoZW4gdGhlIHBhcnQgc2hvdWxkIG5vdCBoYXZlIGEgbmFtZXNwYWNlCi0gICAgICAgICAgLy8gQW5kIGlmIGl0IGRvZXMsIHRoZW4gb25lIG9mIHRoZSB0ZXN0IGFzc2VydGlvbnMgd2lsbCBkZXRlY3QgaXQKLSAgICAgICAgICBpZiAoIWlzRG9jdW1lbnRTdHlsZSAmJiBwcm9jZXNzV3JhcHBlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lc3BhY2UgPSAiIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobmFtZXNwYWNlID09IG51bGwgfHwgbmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGlzRG9jdW1lbnRTdHlsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLy9FbGVtZW50IGZpcnN0Q2hpbGQgID0gbnVsbDsKLSAgICAgICAgICAgICAgTm9kZSBpdCA9IG4uZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgICB3aGlsZSAoaXQgIT0gbnVsbCAmJiAhKGl0IGluc3RhbmNlb2YgRWxlbWVudCkpCi0gICAgICAgICAgICAgICAgaXQgPSBpdC5nZXROZXh0U2libGluZygpOwotICAgICAgICAgICAgICBpZiAoaXQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSBpdC5nZXROYW1lc3BhY2VVUkkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBub3JtYWxpemUgbmFtZXNwYWNlcy4gQWxsIGVtcHR5IG5hbWVzcGFjZXMgLT4gbnVsbCAKLSAgICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgbmFtZXNwYWNlLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgICAgICAgLy8gcHV0IHBhcnQgaW50byBzaWduYXR1cmUKLSAgICAgICAgICBzaWduYXR1cmUuYWRkKG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlzQ3JlYXRlZCA9IGZhbHNlOyAvLyBub3QgZm91bmQgPwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlzQ3JlYXRlZCA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3BlcmF0aW9uIGhhcyBkb2N1bWVudCBzdHlsZSBvciBSUEMuIAotICAgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIGhhcyBkb2N1bWVudCBzdHlsZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRG9jdW1lbnRTdHlsZSgpCi0gIHsKLSAgICByZXR1cm4gaXNEb2N1bWVudFN0eWxlOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIFdTREwgZmF1bHQgcGFydHMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gc2lnbmF0dXJlIG9yCi0gICAqIG5vdC4KLSAgICogQHJldHVybiB0cnVlIGlmIFdTREwgZmF1bHQgcGFydHMgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gc2lnbmF0dXJlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gaXNGYXVsdDsKLSAgfQotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgdGhhdCBvcGVyYXRpb24gc2lnbmF0dXJlIHdhcyBjcmVhdGVkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIHNpZ25hdHVyZSB3YXMgY3JlYXRlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ3JlYXRlZCgpCi0gIHsKLSAgICByZXR1cm4gaXNDcmVhdGVkOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgb3BlcmF0aW9uIHNpZ25hdHVyZSBjcmVhdGVkIGZvciBTT0FQIG1lc3NhZ2UuCi0gICAqIEByZXR1cm4gb3BlcmF0aW9uIHNpZ25hdHVyZSBjcmVhdGVkIGZvciBTT0FQIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRTaWduYXR1cmUoKQotICB7Ci0gICAgcmV0dXJuIHNpZ25hdHVyZTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotICAgKi8KLSAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gIHsKLSAgICByZXR1cm4gc2lnbmF0dXJlLmhhc2hDb2RlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhPYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gIHsKLSAgICBpZiAobyBpbnN0YW5jZW9mIE9wZXJhdGlvblNpZ25hdHVyZSkKLSAgICAgIHJldHVybiBzaWduYXR1cmUuZXF1YWxzKCgoT3BlcmF0aW9uU2lnbmF0dXJlKSBvKS5nZXRTaWduYXR1cmUoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgbWF0Y2hlcyBvcGVyYXRpb24gYmFzZWQgb24gdGhlIGdpdmVuIFNPQVAgbWVzc2FnZSByZXF1ZXN0LAotICAgKiBXU0RMIGJpbmRpbmcsIGFuZCBzb2FwQWN0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGlucHV0TWVzc2FnZSBhbiBTT0FQIG1lc3NhZ2UgcmVxdWVzdC4KLSAgICogQHBhcmFtIHNvYXBBY3Rpb24gYSBzb2FwIGFjdGlvbi4KLSAgICogQHBhcmFtIGJpbmRpbmcgYSBXU0RMIGJpbmRpbmcuCi0gICAqIEBwYXJhbSByZWdpc3RyeSBhIHR5cGVzIHJlZ2lzdHJ5LgotICAgKiBAcmV0dXJuIE9wZXJhdGlvbk1hdGNoIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uTWF0Y2ggbWF0Y2hPcGVyYXRpb24oCi0gICAgRG9jdW1lbnQgaW5wdXRNZXNzYWdlLAotICAgIFN0cmluZyBzb2FwQWN0aW9uLAotICAgIEJpbmRpbmcgYmluZGluZywKLSAgICBUeXBlc1JlZ2lzdHJ5IHJlZ2lzdHJ5KQotICB7Ci0gICAgcmV0dXJuIG1hdGNoT3BlcmF0aW9uKGlucHV0TWVzc2FnZSwgc29hcEFjdGlvbiwgYmluZGluZywgcmVnaXN0cnksIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAgICogVGhlIG1ldGhvZCBtYXRjaGVzIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gU09BUCBtZXNzYWdlIHJlcXVlc3QsCi0gICAgICogV1NETCBiaW5kaW5nLCBhbmQgc29hcEFjdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gaW5wdXRNZXNzYWdlIFNPQVAgbWVzc2FnZSByZXF1ZXN0LgotICAgICAqIEBwYXJhbSBzb2FwQWN0aW9uIGEgc29hcCBhY3Rpb24uCi0gICAgICogQHBhcmFtIGJpbmRpbmcgYSBXU0RMIGJpbmRpbmcuCi0gICAgICogQHBhcmFtIHJlZ2lzdHJ5IGEgdHlwZXMgcmVnaXN0cnkuCi0gICAgICogQHBhcmFtIHNvYXBBY3Rpb25SZXF1aXJlZCBtdXN0IHByb2Nlc3MgdGhlIHNvYXBBY3Rpb24gdmFsdWUgZXZlbiBpZiBpdCBpcyBudWxsIAotICAgICAqIEByZXR1cm4gT3BlcmF0aW9uTWF0Y2ggb2JqZWN0LgotICAgICAqLwotICBwdWJsaWMgc3RhdGljIE9wZXJhdGlvbk1hdGNoIG1hdGNoT3BlcmF0aW9uKAotICAgIERvY3VtZW50IGlucHV0TWVzc2FnZSwKLSAgICBTdHJpbmcgc29hcEFjdGlvbiwKLSAgICBCaW5kaW5nIGJpbmRpbmcsCi0gICAgVHlwZXNSZWdpc3RyeSByZWdpc3RyeSwKLSAgICBib29sZWFuIHNvYXBBY3Rpb25SZXF1aXJlZCkKLSAgewotICAgIC8vIFBhcnNlIHJlcXVlc3QgbWVzc2FnZQotICAgIE9wZXJhdGlvblNpZ25hdHVyZSBzaWduYXR1cmUgPSBuZXcgT3BlcmF0aW9uU2lnbmF0dXJlKGlucHV0TWVzc2FnZSk7Ci0gICAgaWYgKCFzaWduYXR1cmUuaXNDcmVhdGVkKCkpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIC8vIGZpcnN0IG9mIGFsbCBsb29raW5nIGZvciBkb2N1bWVudCBzdHlsZQotICAgIC8vIGJlY2F1c2UgcnBjIHN0eWxlIGlzIHN1YnNldCBvZiBkb2N1bWVudCBzdHlsZSAgCi0gICAgT3BlcmF0aW9uU2lnbmF0dXJlLlZpc2l0b3IgcmVzb2x2ZXIgPQotICAgICAgc2lnbmF0dXJlLm5ldyBWaXNpdG9yKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MsIHJlZ2lzdHJ5KTsKLQotICAgIC8vIG5vcm1hbGl6ZSBTT0FQQWN0aW9uCi0gICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbAotICAgICAgJiYgc29hcEFjdGlvbi5sZW5ndGgoKSA+IDEKLSAgICAgICYmIHNvYXBBY3Rpb24uY2hhckF0KDApID09ICciJwotICAgICAgJiYgc29hcEFjdGlvbi5jaGFyQXQoc29hcEFjdGlvbi5sZW5ndGgoKSAtIDEpID09ICciJykKLSAgICAgIHNvYXBBY3Rpb24gPSBzb2FwQWN0aW9uLnN1YnN0cmluZygxLCBzb2FwQWN0aW9uLmxlbmd0aCgpIC0gMSk7Ci0KLSAgICAvLyAgICAgIGlmIHNvYXAgYWN0aW9uIFVSSSBwcm9jZXNzaW5nIHJlcXVpcmVkCi0gICAgLy8gaWYgc29hcCBhY3Rpb24gVVJJIHByb2Nlc3NpbmcgcmVxdWlyZWQgCi0gICAgLy8gYW5hbHl6ZSBTT0FQQWN0aW9uIGFmdGVyIHBhcnRzIGJlaW5nIHByb2Nlc3NlZAotICAgIC8vIHB1dCBTT0FQQWN0aW9uIGludG8gc2lnbmF0dXJlCi0gICAgLy9pZiAoc29hcEFjdGlvbiAhPSBudWxsICYmIHNvYXBBY3Rpb24ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgaWYgKHNvYXBBY3Rpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzaWduYXR1cmUuZ2V0U2lnbmF0dXJlKCkuYWRkKDAsIHNvYXBBY3Rpb24pOwotICAgIH0KLQotICAgIGlmIChzb2FwQWN0aW9uUmVxdWlyZWQpCi0gICAgICByZXNvbHZlci5zZXRTT0FQQWN0aW9uUmVxdWlyZWQoKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHJlc29sdmVyKTsKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcihyZXNvbHZlcik7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJpbmRpbmcodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUEJvZHkodHJ1ZSk7Ci0gICAgdHJhdmVyc2FsLnZpc2l0U09BUE9wZXJhdGlvbih0cnVlKTsKLQotICAgIHRyYXZlcnNhbC5pZ25vcmVSZWZlcmVuY2VzKCk7Ci0gICAgdHJhdmVyc2FsLmlnbm9yZUJpbmRpbmdPdXRwdXQoKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoYmluZGluZyk7Ci0KLSAgICBCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHJlc29sdmVyLmdldE1hdGNoZWRPcGVyYXRpb24oKTsKLSAgICBpZiAob3BlcmF0aW9uID09IG51bGwgJiYgIXNpZ25hdHVyZS5pc0RvY3VtZW50U3R5bGUoKSkKLSAgICB7Ci0gICAgICByZXNvbHZlci5zZXRSZXF1aXJlZFN0eWxlKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9SUEMpOwotICAgICAgc2lnbmF0dXJlLmNyZWF0ZVJQQ1NpZ25hdHVyZSgpOwotICAgICAgdHJhdmVyc2FsLnRyYXZlcnNlKGJpbmRpbmcpOwotICAgICAgb3BlcmF0aW9uID0gcmVzb2x2ZXIuZ2V0TWF0Y2hlZE9wZXJhdGlvbigpOwotICAgICAgaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IE9wZXJhdGlvbk1hdGNoKAotICAgICAgcmVzb2x2ZXIucmVxdWlyZWRTdHlsZSwKLSAgICAgIHNpZ25hdHVyZS5nZXRTaWduYXR1cmUoKSwKLSAgICAgIHJlc29sdmVyLmdldE1hdGNoZWRPcGVyYXRpb24oKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1BhaXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1BhaXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxYTE5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9QYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyBwYWlyIG9mIHZhbHVlcy4KLSAqIAotICogQGF1dGhvciBLdWxpawotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFpcgotewotICBmaW5hbCBwcml2YXRlIE9iamVjdCBmaXJzdDsKLSAgZmluYWwgcHJpdmF0ZSBPYmplY3Qgc2Vjb25kOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogQHBhcmFtIGZpcnN0IG9iamVjdAotICAgKiBAcGFyYW0gc2Vjb25kIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBQYWlyKE9iamVjdCBmaXJzdCwgT2JqZWN0IHNlY29uZCkKLSAgewotICAgIHRoaXMuZmlyc3QgPSBmaXJzdDsKLSAgICB0aGlzLnNlY29uZCA9IHNlY29uZDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGZpcnN0IG9iamVjdC4KLSAgICogQHJldHVybiBPYmplY3QKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0Rmlyc3QoKQotICB7Ci0gICAgcmV0dXJuIGZpcnN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgc2Vjb25kIG9iamVjdC4KLSAgICogQHJldHVybiBPYmplY3QKLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0U2Vjb25kKCkKLSAgewotICAgIHJldHVybiBzZWNvbmQ7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhPYmplY3QpCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gIHsKLSAgICBpZiAobyA9PSBudWxsIHx8ICEobyBpbnN0YW5jZW9mIFBhaXIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIFBhaXIgcCA9IChQYWlyKSBvOwotICAgIHJldHVybiAoCi0gICAgICBOdWxsVXRpbC5lcXVhbHMocC5nZXRGaXJzdCgpLCBmaXJzdCkKLSAgICAgICAgJiYgTnVsbFV0aWwuZXF1YWxzKHAuZ2V0U2Vjb25kKCksIHNlY29uZCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0gICAqLwotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgewotICAgIGludCBjb2RlID0gMDsKLSAgICBpZiAoZmlyc3QgIT0gbnVsbCkKLSAgICAgIGNvZGUgKz0gZmlyc3QuaGFzaENvZGUoKTsKLSAgICBpZiAoc2Vjb25kICE9IG51bGwpCi0gICAgICBjb2RlICs9IHNlY29uZC5oYXNoQ29kZSgpOwotICAgIHJldHVybiBjb2RlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9TZXRDb29raWUyVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9TZXRDb29raWUyVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzE0ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvU2V0Q29va2llMlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIHRoZSBjb29raWVzIGNvbmZvcm0gdG8gUkZDMjk2NS4KLSAqIAotICogQGF1dGhvciBCYWx0YWsKLSAqLwotcHVibGljIGNsYXNzIFNldENvb2tpZTJWYWxpZGF0b3IKLXsKLQotICBwcml2YXRlIFZlY3RvciBjb21tZW50VmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgY29tbWVudFVSTFZlY3QgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIGRvbWFpblZlY3QgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIG1heF9BZ2VWZWN0ID0gbmV3IFZlY3RvcigpOwotICBwcml2YXRlIFZlY3RvciBwYXRoVmVjdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgcG9ydFZlY3QgPSBuZXcgVmVjdG9yKCk7Ci0gIHByaXZhdGUgVmVjdG9yIHZlcnNpb25WZWN0ID0gbmV3IFZlY3RvcigpOwotCi0gIHByaXZhdGUgYm9vbGVhbiBjb21tZW50ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBjb21tZW50VVJMID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBkb21haW4gPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIG1heF9hZ2UgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHBhdGggPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHBvcnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZlcnNpb24gPSBmYWxzZTsKLQotICAvKioKLSAgICogTWV0aG9kIHJlc2V0RmxhZ3MuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcmVzZXRGbGFncygpCi0gIHsKLSAgICBjb21tZW50ID0gZmFsc2U7Ci0gICAgY29tbWVudFVSTCA9IGZhbHNlOwotICAgIGRvbWFpbiA9IGZhbHNlOwotICAgIG1heF9hZ2UgPSBmYWxzZTsKLSAgICBwYXRoID0gZmFsc2U7Ci0gICAgcG9ydCA9IGZhbHNlOwotICAgIHZlcnNpb24gPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVjayBpZiB0aGUgc3RyaW5nIHNhdGlzZnkgdGhlICJTZXQtQ29va2llMiIgaGVhZGVyIHZhbHVlLgotICAgKiBAcGFyYW0gc3RyIFN0cmluZyAKLSAgICogQHJldHVybiBib29sZWFuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1NldENvb2tpZTIoU3RyaW5nIHN0cikKLSAgewotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIGludCBuZXdJbmRleCA9IDA7Ci0gICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgIHsKLSAgICAgICAgbmV3SW5kZXggPSBnZXRMYXN0Q29va2llKHN0ciwgaW5kZXgpOwotICAgICAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyBza2lwIHNwYWNlcwotICAgICAgICBpbmRleCA9IG5ld0luZGV4OwotICAgICAgICBpbmRleCA9IHNraXBTcGFjZXMoc3RyLCBpbmRleCk7Ci0gICAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJywnKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgLy8gc2tpcCBzcGFjZXMKLSAgICAgICAgICBpbmRleCA9IHNraXBTcGFjZXMoc3RyLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQotICAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdENvb2tpZS4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcGFyYW0gc3RhcnRJbmRleAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0TGFzdENvb2tpZShTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotCi0gICAgcmVzZXRGbGFncygpOwotCi0gICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICAvLyBmaW5kIHRva2VuCi0gICAgaW50IG5ld0luZGV4ID0gQmFzaWNSdWxlcy5nZXRMYXN0VG9rZW4oc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCA9IG5ld0luZGV4OwotICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIC8vIGlmIG5vdCAnPScgLSBlcnJvcgotICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnPScpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIGluZGV4Kys7Ci0gICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgLy8gZ2V0IHZhbHVlCi0gICAgbmV3SW5kZXggPSBnZXRMYXN0VmFsdWUoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBpbmRleCA9IG5ld0luZGV4OwotICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJzsnKQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICBpbmRleCsrOwotICAgICAgLy8gc2tpcCBzcGFjZXMKLSAgICAgIGluZGV4ID0gc2tpcFNwYWNlcyhzdHIsIGluZGV4KTsKLQotICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgICBuZXdJbmRleCA9IGdldExhc3RTZXRDb29raWVBdihzdHIsIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRMYXN0VmFsdWUuCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByaXZhdGUgaW50IGdldExhc3RWYWx1ZShTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotCi0gICAgaW50IGluZGV4ID0gQmFzaWNSdWxlcy5nZXRMYXN0VG9rZW4oc3RyLCBzdGFydEluZGV4KTsKLSAgICBpZiAoaW5kZXggIT0gc3RhcnRJbmRleCkKLSAgICAgIHJldHVybiBpbmRleDsKLSAgICBpbmRleCA9IEJhc2ljUnVsZXMuZ2V0TGFzdFF1b3RlZFN0cmluZyhzdHIsIHN0YXJ0SW5kZXgpOwotICAgIGlmIChpbmRleCAhPSBzdGFydEluZGV4KQotICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldExhc3RTZXRDb29raWVBdi4KLSAgICogQHBhcmFtIHN0cgotICAgKiBAcGFyYW0gc3RhcnRJbmRleAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgZ2V0TGFzdFNldENvb2tpZUF2KFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0KLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGludCBuZXdJbmRleCA9IDA7Ci0KLSAgICBTdHJpbmcgdG9rZW4gPSBzdHIuc3Vic3RyaW5nKGluZGV4LCBCYXNpY1J1bGVzLmdldExhc3RUb2tlbihzdHIsIGluZGV4KSk7Ci0KLSAgICBpZiAoc3RyLnN0YXJ0c1dpdGgoIkNvbW1lbnQ9IiwgaW5kZXgpKQotICAgIHsKLSAgICAgIGluZGV4ICs9ICJDb21tZW50PSIubGVuZ3RoKCk7Ci0gICAgICBuZXdJbmRleCA9IGdldExhc3RWYWx1ZShzdHIsIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgICAvLyBkZWJ1ZyAtPgotICAgICAgU3RyaW5nIHFxcSA9IGdldFZhbHVlKHN0ciwgaW5kZXgsIG5ld0luZGV4KTsKLSAgICAgIGNvbW1lbnRWZWN0LmFkZChxcXEpOwotICAgICAgLy8gZGVidWcgPC0KLSAgICAgIGNvbW1lbnQgPSB0cnVlOwotICAgICAgcmV0dXJuIG5ld0luZGV4OwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aCgiQ29tbWVudFVSTD0iLCBpbmRleCkpCi0gICAgewotICAgICAgaW5kZXggKz0gIkNvbW1lbnRVUkw9Ii5sZW5ndGgoKTsKLQotICAgICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICdcIicpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICBuZXdJbmRleCA9IHN0ci5pbmRleE9mKCdcIicsIGluZGV4ICsgMSk7Ci0gICAgICBpZiAobmV3SW5kZXggPT0gLTEpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHN0ci5zdWJzdHJpbmcoaW5kZXggKyAxLCBuZXdJbmRleCkpOwotICAgICAgfQotICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgICAgfQotICAgICAgLy8gZGVidWcgLT4KLSAgICAgIFN0cmluZyBxcXEgPSBnZXRWYWx1ZShzdHIsIGluZGV4ICsgMSwgbmV3SW5kZXgpOwotICAgICAgY29tbWVudFVSTFZlY3QuYWRkKHFxcSk7Ci0gICAgICAvLyBkZWJ1ZyA8LQotICAgICAgbmV3SW5kZXgrKzsKLSAgICAgIGNvbW1lbnRVUkwgPSB0cnVlOwotICAgICAgcmV0dXJuIG5ld0luZGV4OwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aCgiRGlzY2FyZCIsIGluZGV4KSkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RhcnRJbmRleCArICJEaXNjYXJkIi5sZW5ndGgoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoIkRvbWFpbj0iLCBpbmRleCkpCi0gICAgewotICAgICAgaW5kZXggKz0gIkRvbWFpbj0iLmxlbmd0aCgpOwotCi0gICAgICBuZXdJbmRleCA9IGdldExhc3RWYWx1ZShzdHIsIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICAgIC8vIGRlYnVnIC0+Ci0gICAgICBTdHJpbmcgcXFxID0gZ2V0VmFsdWUoc3RyLCBpbmRleCwgbmV3SW5kZXgpOwotICAgICAgZG9tYWluVmVjdC5hZGQocXFxKTsKLSAgICAgIC8vIGRlYnVnIDwtCi0gICAgICBkb21haW4gPSB0cnVlOwotICAgICAgcmV0dXJuIG5ld0luZGV4OwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aCgiTWF4LUFnZT0iLCBpbmRleCkpCi0gICAgewotICAgICAgaW5kZXggKz0gIk1heC1BZ2U9Ii5sZW5ndGgoKTsKLQotICAgICAgbmV3SW5kZXggPSBnZXRMYXN0VmFsdWUoc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICBTdHJpbmcgcXFxID0gZ2V0VmFsdWUoc3RyLCBpbmRleCwgbmV3SW5kZXgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIEludGVnZXIucGFyc2VJbnQocXFxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKQotICAgICAgewotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICAgIH0KLSAgICAgIC8vIGRlYnVnIC0+Ci0gICAgICBtYXhfQWdlVmVjdC5hZGQocXFxKTsKLSAgICAgIC8vIGRlYnVnIDwtCi0gICAgICBtYXhfYWdlID0gdHJ1ZTsKLSAgICAgIHJldHVybiBuZXdJbmRleDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoIlBhdGg9IiwgaW5kZXgpKQotICAgIHsKLSAgICAgIGluZGV4ICs9ICJQYXRoPSIubGVuZ3RoKCk7Ci0KLSAgICAgIG5ld0luZGV4ID0gZ2V0TGFzdFZhbHVlKHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgU3RyaW5nIHFxcSA9IGdldFZhbHVlKHN0ciwgaW5kZXgsIG5ld0luZGV4KTsKLSAgICAgIGlmIChwYXRoID09IGZhbHNlKQotICAgICAgICBwYXRoVmVjdC5hZGQocXFxKTsKLSAgICAgIHBhdGggPSB0cnVlOwotICAgICAgcmV0dXJuIG5ld0luZGV4OwotICAgIH0KLSAgICBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aCgiUG9ydCIsIGluZGV4KSkKLSAgICB7Ci0gICAgICBpbmRleCArPSAiUG9ydCIubGVuZ3RoKCk7Ci0gICAgICBwb3J0ID0gdHJ1ZTsKLSAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnPScpCi0gICAgICAgIHJldHVybiBpbmRleDsKLQotICAgICAgaW5kZXgrKzsKLSAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnXCInKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgaW5kZXgrKzsKLSAgICAgIG5ld0luZGV4ID0gZ2V0TGFzdFBvcnRMaXN0KHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgLy8gZGVidWcgLT4KLSAgICAgIFN0cmluZyBxcXEgPSBnZXRWYWx1ZShzdHIsIGluZGV4LCBuZXdJbmRleCk7Ci0gICAgICBwb3J0VmVjdC5hZGQocXFxKTsKLSAgICAgIC8vIGRlYnVnIDwtCi0KLSAgICAgIGluZGV4ID0gbmV3SW5kZXg7Ci0gICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJ1wiJykKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgICBpbmRleCsrOwotICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgfQotICAgIGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKCJTZWN1cmUiLCBpbmRleCkpCi0gICAgewotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXggKyAiU2VjdXJlIi5sZW5ndGgoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoIlZlcnNpb249IiwgaW5kZXgpKQotICAgIHsKLSAgICAgIGluZGV4ICs9ICJWZXJzaW9uPSIubGVuZ3RoKCk7Ci0KLSAgICAgIG5ld0luZGV4ID0gZ2V0TGFzdERJR0lUKHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgLy8gZGVidWcgLT4KLSAgICAgIFN0cmluZyBxcXEgPSBnZXRWYWx1ZShzdHIsIGluZGV4LCBuZXdJbmRleCk7Ci0gICAgICB2ZXJzaW9uVmVjdC5hZGQocXFxKTsKLSAgICAgIC8vIGRlYnVnIDwtCi0gICAgICB2ZXJzaW9uID0gdHJ1ZTsKLSAgICAgIHJldHVybiBuZXdJbmRleDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdFBvcnRMaXN0LgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEBwYXJhbSBzdGFydEluZGV4Ci0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwcml2YXRlIGludCBnZXRMYXN0UG9ydExpc3QoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGludCBuZXdJbmRleCA9IDA7Ci0KLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBuZXdJbmRleCA9IGdldExhc3RESUdJVChzdHIsIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICAgIGluZGV4ID0gbmV3SW5kZXg7Ci0gICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJywnKQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdERJR0lULgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEBwYXJhbSBzdGFydEluZGV4Ci0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwcml2YXRlIGludCBnZXRMYXN0RElHSVQoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGZvciAoOyBpbmRleCA8IHN0ci5sZW5ndGgoKTsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoIUJhc2ljUnVsZXMuaXNESUdJVChzdHIuY2hhckF0KGluZGV4KSkpCi0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrIGlmIHRoZSBzdHJpbmcgc2F0aXNmeSB0aGUgIkNvb2tpZSIgaGVhZGVyIHZhbHVlLgotICAgKiBAcGFyYW0gc3RyIFN0cmluZwotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzQ29va2llKFN0cmluZyBzdHIpCi0gIHsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGludCBuZXdJbmRleCA9IDA7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBuZXdJbmRleCA9IGdldExhc3RWZXJzaW9uKHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGluZGV4ID0gbmV3SW5kZXg7Ci0gICAgICBpbmRleCA9IHNraXBTcGFjZXMoc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJzsnICYmIHN0ci5jaGFyQXQoaW5kZXgpICE9ICcsJykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpbmRleCsrOwotICAgICAgaW5kZXggPSBza2lwU3BhY2VzKHN0ciwgaW5kZXgpOwotCi0gICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgIHsKLSAgICAgICAgbmV3SW5kZXggPSBnZXRMYXN0Q29va2llc1ZhbHVlKHN0ciwgaW5kZXgpOwotICAgICAgICBpZiAoaW5kZXggPT0gbmV3SW5kZXgpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGluZGV4ID0gbmV3SW5kZXg7Ci0gICAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICc7JyAmJiBzdHIuY2hhckF0KGluZGV4KSAhPSAnLCcpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpbmRleCsrOwotICAgICAgICBpbmRleCA9IHNraXBTcGFjZXMoc3RyLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdFZlcnNpb24uCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByaXZhdGUgaW50IGdldExhc3RWZXJzaW9uKFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0gICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICBpbnQgbmV3SW5kZXggPSAwOwotICAgIGlmICghc3RyLnN0YXJ0c1dpdGgoIiRWZXJzaW9uPSIpKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgaW5kZXggKz0gIiRWZXJzaW9uPSIubGVuZ3RoKCk7Ci0gICAgbmV3SW5kZXggPSBnZXRMYXN0VmFsdWUoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICByZXR1cm4gbmV3SW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldExhc3RDb29raWVzVmFsdWUuCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByaXZhdGUgaW50IGdldExhc3RDb29raWVzVmFsdWUoU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGludCBuZXdJbmRleCA9IDA7Ci0gICAgaW50IG9sZEluZGV4ID0gMDsKLQotICAgIC8vIGZpbmQgdG9rZW4KLSAgICBuZXdJbmRleCA9IEJhc2ljUnVsZXMuZ2V0TGFzdFRva2VuKHN0ciwgaW5kZXgpOwotICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICAvLyBpZiBub3QgJz0nIC0gZXJyb3IKLSAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJz0nKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCsrOwotICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIC8vIGdldCB2YWx1ZQotICAgIG5ld0luZGV4ID0gZ2V0TGFzdFZhbHVlKHN0ciwgaW5kZXgpOwotICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICc7JykKLSAgICAgIHJldHVybiBpbmRleDsKLQotICAgIC8vIHByb2Nlc3MgWyI7IiBwYXRoXSBbIjsiIGRvbWFpbl0gWyI7IiBwb3J0XSAKLSAgICBvbGRJbmRleCA9IGluZGV4OwotICAgIGluZGV4Kys7Ci0gICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgaW5kZXggPSBza2lwU3BhY2VzKHN0ciwgaW5kZXgpOwotICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIC8vIHByb2Nlc3MgcGF0aAotICAgIG5ld0luZGV4ID0gZ2V0TGFzdFBhdGgoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ICE9IG5ld0luZGV4KQotICAgIHsKLSAgICAgIGluZGV4ID0gbmV3SW5kZXg7Ci0gICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnOycpCi0gICAgICAgIHJldHVybiBpbmRleDsKLQotICAgICAgb2xkSW5kZXggPSBpbmRleDsKLSAgICAgIGluZGV4Kys7Ci0gICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgICAgaW5kZXggPSBza2lwU3BhY2VzKHN0ciwgaW5kZXgpOwotICAgICAgaWYgKGluZGV4ID09IHN0ci5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICB9Ci0KLSAgICAvLyBwcm9jZXNzIGRvbWFpbgotICAgIG5ld0luZGV4ID0gZ2V0TGFzdERvbWFpbihzdHIsIGluZGV4KTsKLSAgICBpZiAoaW5kZXggIT0gbmV3SW5kZXgpCi0gICAgewotICAgICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBpbmRleDsKLQotICAgICAgaWYgKHN0ci5jaGFyQXQoaW5kZXgpICE9ICc7JykKLSAgICAgICAgcmV0dXJuIGluZGV4OwotCi0gICAgICBvbGRJbmRleCA9IGluZGV4OwotICAgICAgaW5kZXgrKzsKLSAgICAgIGlmIChpbmRleCA9PSBzdHIubGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgICBpbmRleCA9IHNraXBTcGFjZXMoc3RyLCBpbmRleCk7Ci0gICAgICBpZiAoaW5kZXggPT0gc3RyLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKLQotICAgIH0KLQotICAgIC8vIHByb2Nlc3MgcG9ydAotICAgIG5ld0luZGV4ID0gZ2V0TGFzdFBvcnQoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ICE9IG5ld0luZGV4KQotICAgICAgcmV0dXJuIG5ld0luZGV4OwotICAgIGVsc2UKLSAgICAgIHJldHVybiBvbGRJbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0TGFzdFBhdGguCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByaXZhdGUgaW50IGdldExhc3RQYXRoKFN0cmluZyBzdHIsIGludCBzdGFydEluZGV4KQotICB7Ci0gICAgaW50IGluZGV4ID0gc3RhcnRJbmRleDsKLSAgICBpbnQgbmV3SW5kZXggPSAwOwotCi0gICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgiJFBhdGg9IiwgaW5kZXgpKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0gICAgaW5kZXggKz0gIiRQYXRoPSIubGVuZ3RoKCk7Ci0gICAgbmV3SW5kZXggPSBnZXRMYXN0VmFsdWUoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICByZXR1cm4gbmV3SW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldExhc3REb21haW4uCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIHN0YXJ0SW5kZXgKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHByaXZhdGUgaW50IGdldExhc3REb21haW4oU3RyaW5nIHN0ciwgaW50IHN0YXJ0SW5kZXgpCi0gIHsKLSAgICBpbnQgaW5kZXggPSBzdGFydEluZGV4OwotICAgIGludCBuZXdJbmRleCA9IDA7Ci0KLSAgICBpZiAoIXN0ci5zdGFydHNXaXRoKCIkRG9tYWluPSIsIGluZGV4KSkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIGluZGV4ICs9ICIkRG9tYWluPSIubGVuZ3RoKCk7Ci0gICAgbmV3SW5kZXggPSBnZXRMYXN0VmFsdWUoc3RyLCBpbmRleCk7Ci0gICAgaWYgKGluZGV4ID09IG5ld0luZGV4KQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICByZXR1cm4gbmV3SW5kZXg7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldExhc3RQb3J0LgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEBwYXJhbSBzdGFydEluZGV4Ci0gICAqIEByZXR1cm4gaW50Ci0gICAqLwotICBwcml2YXRlIGludCBnZXRMYXN0UG9ydChTdHJpbmcgc3RyLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIGludCBpbmRleCA9IHN0YXJ0SW5kZXg7Ci0gICAgaW50IG5ld0luZGV4ID0gMDsKLQotICAgIGlmICghc3RyLnN0YXJ0c1dpdGgoIiRQb3J0IiwgaW5kZXgpKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCArPSAiJFBvcnQiLmxlbmd0aCgpOwotICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnPScpCi0gICAgICByZXR1cm4gaW5kZXg7Ci0KLSAgICBpbmRleCsrOwotICAgIGlmIChzdHIuY2hhckF0KGluZGV4KSAhPSAnXCInKQotICAgICAgcmV0dXJuIHN0YXJ0SW5kZXg7Ci0KLSAgICBpbmRleCsrOwotICAgIG5ld0luZGV4ID0gZ2V0TGFzdFBvcnRMaXN0KHN0ciwgaW5kZXgpOwotICAgIGlmIChpbmRleCA9PSBuZXdJbmRleCkKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotCi0gICAgaW5kZXggPSBuZXdJbmRleDsKLSAgICBpZiAoc3RyLmNoYXJBdChpbmRleCkgIT0gJ1wiJykKLSAgICAgIHJldHVybiBzdGFydEluZGV4OwotICAgIGluZGV4Kys7Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBza2lwU3BhY2VzLgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEBwYXJhbSBpbmRleAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgc2tpcFNwYWNlcyhTdHJpbmcgc3RyLCBpbnQgaW5kZXgpCi0gIHsKLSAgICBmb3IgKDsgaW5kZXggPCBzdHIubGVuZ3RoKCk7IGluZGV4KyspCi0gICAgICBpZiAoIUJhc2ljUnVsZXMuaXNTUChzdHIuY2hhckF0KGluZGV4KSkpCi0gICAgICAgIGJyZWFrOwotICAgIHJldHVybiBpbmRleDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0VmFsdWUuCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHBhcmFtIGJlZwotICAgKiBAcGFyYW0gZW5kCi0gICAqIEByZXR1cm4gU3RyaW5nCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRWYWx1ZShTdHJpbmcgc3RyLCBpbnQgYmVnLCBpbnQgZW5kKQotICB7Ci0gICAgU3RyaW5nIHFxcSA9IG51bGw7Ci0gICAgaWYgKHN0ci5jaGFyQXQoYmVnKSA9PSAnXCInKQotICAgICAgcXFxID0gc3RyLnN1YnN0cmluZyhiZWcgKyAxLCBlbmQgLSAxKTsKLSAgICBlbHNlCi0gICAgICBxcXEgPSBzdHIuc3Vic3RyaW5nKGJlZywgZW5kKTsKLSAgICByZXR1cm4gcXFxOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1N0cmluZ1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzcwZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvU3RyaW5nVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi0vKioKLSAqIFN0cmluZyB0b2tlbml6ZXIuCi0gKiAKLSAqIEBhdXRob3I6IEt1bGlrCi0gKi8KLWZpbmFsIHB1YmxpYyBjbGFzcyBTdHJpbmdUb2tlbml6ZXIKLXsKLSAgcHJpdmF0ZSBjaGFyW10gc3BhY2VEZWw7Ci0gIHByaXZhdGUgY2hhcltdIGRlbDsKLSAgcHJpdmF0ZSBjaGFyW10gYWxsRGVsOwotCi0gIC8qKgotICAgKiBFbnVtZXJhdGlvbiBvZiBzdHJpbmdzLgotICAqIEBhdXRob3IgS3VsaWsKLSAgICovCi0gIHByaXZhdGUgY2xhc3MgU3RyaW5nVG9rZW5pemVyRW51bWVyYXRpb24gaW1wbGVtZW50cyBqYXZhLnV0aWwuRW51bWVyYXRpb24KLSAgewotICAgIHByaXZhdGUgZmluYWwgY2hhcltdIHN0cjsKLSAgICBwcml2YXRlIGZpbmFsIGludCBzaXplOwotICAgIHByaXZhdGUgaW50IGluZGV4OwotICAgIHByaXZhdGUgU3RyaW5nIG5leHQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiBAcGFyYW0gcwotICAgICAqLwotICAgIFN0cmluZ1Rva2VuaXplckVudW1lcmF0aW9uKGNoYXJbXSBzKQotICAgIHsKLSAgICAgIHN0ciA9IHM7Ci0gICAgICBzaXplID0gc3RyLmxlbmd0aDsKLSAgICAgIGluZGV4ID0gMDsKLQotICAgICAgLy8gc2tpcCBzcGFjZSBkZWxpbWl0ZXJzCi0gICAgICB3aGlsZSAoaW5kZXggPCBzaXplICYmIGNvbnRhaW4oc3RyW2luZGV4XSwgc3BhY2VEZWwpKQotICAgICAgICBpbmRleCsrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgamF2YS51dGlsLkVudW1lcmF0aW9uI2hhc01vcmVFbGVtZW50cygpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGluZGV4IDwgc2l6ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBqYXZhLnV0aWwuRW51bWVyYXRpb24jbmV4dEVsZW1lbnQoKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKQotICAgIHsKLSAgICAgIGlmIChpbmRleCA+PSBzaXplKQotICAgICAgICB0aHJvdyBuZXcgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgIlN0cmluZ1Rva2VuaXplciBlbnVtZXJhdGlvbiIpOwotCi0gICAgICAvLyBza2lwIGRlbGltaXRlcnMKLSAgICAgIGludCBiZWdTdHIgPSBpbmRleDsKLSAgICAgIGlmIChpbmRleCA8IHNpemUgJiYgY29udGFpbihzdHJbaW5kZXhdLCBkZWwpKQotICAgICAgICBpbmRleCsrOwotCi0gICAgICAvLyBza2lwIHdvcmQKLSAgICAgIGlmIChiZWdTdHIgPT0gaW5kZXgpCi0gICAgICAgIHdoaWxlIChpbmRleCA8IHNpemUgJiYgIWNvbnRhaW4oc3RyW2luZGV4XSwgYWxsRGVsKSkKLSAgICAgICAgICBpbmRleCsrOwotCi0gICAgICBpbnQgZW5kU3RyID0gaW5kZXg7Ci0KLSAgICAgIC8vIHNraXAgc3BhY2UgZGVsaW1pdGVycwotICAgICAgd2hpbGUgKGluZGV4IDwgc2l6ZSAmJiBjb250YWluKHN0cltpbmRleF0sIHNwYWNlRGVsKSkKLSAgICAgICAgaW5kZXgrKzsKLQotICAgICAgcmV0dXJuIFN0cmluZy5jb3B5VmFsdWVPZihzdHIsIGJlZ1N0ciwgZW5kU3RyIC0gYmVnU3RyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgIGludCBpID0gaW5kZXg7Ci0gICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIG5leHRFbGVtZW50KCk7Ci0gICAgICBpbmRleCA9IGk7Ci0gICAgICByZXR1cm4gczsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RyaW5nVG9rZW5pemVyIGNvbnN0cnVjdG9yLgotICAgICAqIEBwYXJhbSBzcGFjZURlbGltaXRlcnMgdGhlIHNldCBvZiBkZWxpbWl0ZXJzIHRvIGJlIGlnbm9yZWQKLSAgICAgKiBAcGFyYW0gZGVsaW1pdGVycyB0aGUgc2V0IG9mIGRlbGltaXRlcnMgdG8gYmUgcmVtYWluZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nVG9rZW5pemVyKGNoYXJbXSBzcGFjZURlbGltaXRlcnMsIGNoYXJbXSBkZWxpbWl0ZXJzKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIGlmIChzcGFjZURlbGltaXRlcnMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzcGFjZURlbCA9IG5ldyBjaGFyW3NwYWNlRGVsaW1pdGVycy5sZW5ndGhdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShzcGFjZURlbGltaXRlcnMsIDAsIHNwYWNlRGVsLCAwLCBzcGFjZURlbGltaXRlcnMubGVuZ3RoKTsKLSAgICAgIHNvcnQoc3BhY2VEZWwpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBzcGFjZURlbCA9IG51bGw7Ci0KLSAgICBpZiAoZGVsaW1pdGVycyAhPSBudWxsKQotICAgIHsKLSAgICAgIGRlbCA9IG5ldyBjaGFyW2RlbGltaXRlcnMubGVuZ3RoXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGVsaW1pdGVycywgMCwgZGVsLCAwLCBkZWxpbWl0ZXJzLmxlbmd0aCk7Ci0gICAgICBzb3J0KGRlbCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGRlbCA9IG51bGw7Ci0KLSAgICBpZiAoZGVsICE9IG51bGwgJiYgc3BhY2VEZWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBhbGxEZWwgPSBuZXcgY2hhcltkZWwubGVuZ3RoICsgc3BhY2VEZWwubGVuZ3RoXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGVsLCAwLCBhbGxEZWwsIDAsIGRlbC5sZW5ndGgpOwotICAgICAgU3lzdGVtLmFycmF5Y29weShzcGFjZURlbCwgMCwgYWxsRGVsLCBkZWwubGVuZ3RoLCBzcGFjZURlbC5sZW5ndGgpOwotICAgIH0KLSAgICBlbHNlIGlmIChkZWwgIT0gbnVsbCkKLSAgICAgIGFsbERlbCA9IGRlbDsKLSAgICBlbHNlCi0gICAgICBhbGxEZWwgPSBzcGFjZURlbDsKLQotICAgIHNvcnQoYWxsRGVsKTsKLSAgfQotICAvKioKLSAgICogUGFyc2VzIHN0cmluZy4KLSAgICogQHJldHVybiBqYXZhLnV0aWwuRW51bWVyYXRpb24KLSAgICogQHBhcmFtIHMgamF2YS5sYW5nLlN0cmluZwotICAgKi8KLSAgcHVibGljIGphdmEudXRpbC5FbnVtZXJhdGlvbiBwYXJzZShTdHJpbmcgcykKLSAgewotICAgIGlmIChzID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmdUb2tlbml6ZXIgOiBTdHJpbmcgY2Fubm90IGJlIE5VTEwiKTsKLQotICAgIHJldHVybiBuZXcgU3RyaW5nVG9rZW5pemVyRW51bWVyYXRpb24ocy50b0NoYXJBcnJheSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBCaW5hcnkgc2VhcmNoLgotICAgKiBAcmV0dXJuIGJvb2xlYW4KLSAgICogQHBhcmFtIGMgY2hhcgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluKGNoYXIgYywgY2hhcltdIGEpCi0gIHsKLSAgICBpZiAoYSA9PSBudWxsKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IGwgPSAwLCByID0gYS5sZW5ndGggLSAxLCBjZW50ZXI7Ci0gICAgd2hpbGUgKGwgPCByKQotICAgIHsKLSAgICAgIGNlbnRlciA9IChsICsgcikgLyAyOwotICAgICAgaWYgKGMgPiBhW2NlbnRlcl0pCi0gICAgICAgIGwgPSBjZW50ZXIgKyAxOwotICAgICAgZWxzZQotICAgICAgICByID0gY2VudGVyOwotICAgIH0KLQotICAgIHJldHVybiBhW2xdID09IGM7Ci0gIH0KLSAgLyoqCi0gICAqIEhlYXAgc29ydAotICAgKiBAcGFyYW0gYyBjaGFyW10KLSAgICovCi0gIHN0YXRpYyBwcml2YXRlIHZvaWQgc29ydChjaGFyW10gYykKLSAgewotICAgIGlmIChjICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGosIGs7Ci0gICAgICBjaGFyIGNpOwotCi0gICAgICAvLyBwdXNoIGhlYXAKLSAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaiA9ICgoayA9IGkpIC0gMSkgLyAyOwotICAgICAgICBjaSA9IGNbaV07Ci0gICAgICAgIHdoaWxlIChrID4gMCAmJiBjW2pdIDwgY2kpCi0gICAgICAgIHsKLSAgICAgICAgICBjW2tdID0gY1tqXTsKLSAgICAgICAgICBqID0gKChrID0gaikgLSAxKSAvIDI7Ci0gICAgICAgIH0KLSAgICAgICAgY1trXSA9IGNpOwotICAgICAgfQotCi0gICAgICAvLyBwb3AgaGVhcAotICAgICAgZm9yIChpbnQgaSA9IGMubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgaiA9IDI7Ci0gICAgICAgIGsgPSAwOwotICAgICAgICBjaSA9IGNbMF07Ci0gICAgICAgIHdoaWxlIChqIDw9IGkpCi0gICAgICAgIHsKLSAgICAgICAgICBjW2tdID0gKGNbaiAtIDFdID4gY1tqXSkgPyBjWy0tal0gOiBjW2pdOwotICAgICAgICAgIGogPSAoKGsgPSBqKSArIDEpICogMjsKLSAgICAgICAgfQotICAgICAgICBjW2tdID0gY1tpXTsKLSAgICAgICAgY1tpXSA9IGNpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvVGVzdFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9UZXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhZTk0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9UZXN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5Ub29sSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uQWRkU3R5bGVTaGVldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogVGVzdCBVdGlsaXR5IGNsYXNzLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFV0aWxzCi17Ci0gIC8qKgotICAgKiBGb3JtYXQgYSBzdHlsZSBzaGVldCBkZWNsYXJhdGlvbiBmcm9tIHRoZSBhZGRTdHlsZVNoZWV0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBlbGVtZW50IGFuIEVsZW1lbnQgb2JqZWN0LgotICAgKiBAcGFyYW0gYWRkU3R5bGVTaGVldCBhbiBhZGRTdHlsZVNoZWV0IGVsZW1lbnQuCi0gICAqIEBwYXJhbSBkZWZhdWx0SHJlZiBkZWZhdWx0IGhyZWYuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcGFyc2VBZGRTdHlsZVNoZWV0KAotICAgIEVsZW1lbnQgZWxlbWVudCwKLSAgICBBZGRTdHlsZVNoZWV0IGFkZFN0eWxlU2hlZXQsCi0gICAgU3RyaW5nIGRlZmF1bHRIcmVmKQotICB7Ci0gICAgYWRkU3R5bGVTaGVldC5zZXRIcmVmKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfSFJFRiwgZGVmYXVsdEhyZWYpKTsKLSAgICBhZGRTdHlsZVNoZWV0LnNldFR5cGUoCi0gICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgZWxlbWVudCwKLSAgICAgICAgV1NJQ29uc3RhbnRzLkFUVFJfVFlQRSwKLSAgICAgICAgV1NJQ29uc3RhbnRzLkRFRkFVTFRfWFNMX1RZUEUpKTsKLSAgICBhZGRTdHlsZVNoZWV0LnNldFRpdGxlKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfVElUTEUpKTsKLSAgICBhZGRTdHlsZVNoZWV0LnNldE1lZGlhKAotICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgV1NJQ29uc3RhbnRzLkFUVFJfTUVESUEpKTsKLSAgICBhZGRTdHlsZVNoZWV0LnNldENoYXJzZXQoCi0gICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBXU0lDb25zdGFudHMuQVRUUl9DSEFSU0VUKSk7Ci0gICAgYWRkU3R5bGVTaGVldC5zZXRBbHRlcm5hdGUoCi0gICAgICBYTUxVdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBXU0lDb25zdGFudHMuQVRUUl9BTFRFUk5BVEUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBEaXNwbGF5IHRvb2wgbmFtZSBhbmQgY29weXJpZ2h0IG5vdGljZS4KLSAgICogQHBhcmFtIHRvb2xJbmZvIGEgVG9vbEluZm8gb2JqZWN0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VG9vbEluZm8oVG9vbEluZm8gdG9vbEluZm8pCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAiQ29uZm9ybWFuY2UgIgotICAgICAgICArIHRvb2xJbmZvLmdldE5hbWUoKQotICAgICAgICArICIgVG9vbCIKLSAgICAgICAgKyAiLCBWZXJzaW9uOiAiCi0gICAgICAgICsgdG9vbEluZm8uZ2V0VmVyc2lvbigpCi0gICAgICAgICsgIiwgUmVsZWFzZSBEYXRlOiAiCi0gICAgICAgICsgdG9vbEluZm8uZ2V0UmVsZWFzZURhdGUoKSk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKFdTSUNvbnN0YW50cy5DT1BZUklHSFQpOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICIpOwotICB9Ci0KLSAgLyoqIAotICAgKiBHZXQgWE1MIGNvbW1lbnQgdXNlZCBpbiBsb2cgYW5kIHJlcG9ydCBmaWxlLgotICAgKiBAcmV0dXJuIFhNTCBjb21tZW50IHVzZWQgaW4gbG9nIGFuZCByZXBvcnQgZmlsZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhNTENvbW1lbnQoKQotICB7Ci0gICAgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotICAgIFN0cmluZyByZWFkTGluZSA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBBZGQgcmVxdWlyZWQgY29tbWVudHMgKGNvcHlyaWdodCwgZXRjLikKLSAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0KLSAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgIFV0aWxzLmdldElucHV0U3RyZWFtKFdTSUNvbnN0YW50cy5DT01NRU5UU19GSUxFKSkpOwotCi0gICAgICAvLyBJbml0aWFsaXplIHN0cmluZyB0byBlbXB0eSBzdHJpbmcKLSAgICAgIGNvbW1lbnQgPSAiIjsKLQotICAgICAgd2hpbGUgKGJ1ZmZlcmVkUmVhZGVyLnJlYWR5KCkpCi0gICAgICB7Ci0gICAgICAgIGlmICgocmVhZExpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKQotICAgICAgICAgIGNvbW1lbnQgKz0gcmVhZExpbmUgKyBXU0lDb25zdGFudHMuTElORV9TRVBBUkFUT1I7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIElnbm9yZSBleGNlcHRpb24gYW5kIGp1c3QgcmV0dXJuIG51bGwKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tbWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc2NoZW1hIGxvY2F0aW9uIGZvciBYTUwgc2NoZW1hLgotICAgKiBAcmV0dXJuIHNjaGVtYSBsb2NhdGlvbiBmb3IgWE1MIHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhNTFNjaGVtYUxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRTY2hlbWFMb2NhdGlvbigKLSAgICAgIFdTSVByb3BlcnRpZXMuUFJPUF9YTUxfU0NIRU1BLAotICAgICAgV1NJUHJvcGVydGllcy5ERUZfWE1MX1NDSEVNQSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFNPQVAgc2NoZW1hIGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIFNPQVAgc2NoZW1hIGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U09BUFNjaGVtYUxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRTY2hlbWFMb2NhdGlvbigKLSAgICAgIFdTSVByb3BlcnRpZXMuUFJPUF9TT0FQX1NDSEVNQSwKLSAgICAgIFdTSVByb3BlcnRpZXMuREVGX1NPQVBfU0NIRU1BKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgV1NETCBzY2hlbWEgbG9jYXRpb24uCi0gICAqIEByZXR1cm4gV1NETCBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU2NoZW1hTG9jYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIGdldFNjaGVtYUxvY2F0aW9uKAotICAgICAgV1NJUHJvcGVydGllcy5QUk9QX1dTRExfU0NIRU1BLAotICAgICAgV1NJUHJvcGVydGllcy5ERUZfV1NETF9TQ0hFTUEpOwotICB9Ci0KLSAgLyoqCi0gICogR2V0IFdTREwgU09BUCBzY2hlbWEgbG9jYXRpb24uCi0gICogQHJldHVybiBXU0RMIFNPQVAgc2NoZW1hIGxvY2F0aW9uLgotICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0RMU09BUFNjaGVtYUxvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBnZXRTY2hlbWFMb2NhdGlvbigKLSAgICAgIFdTSVByb3BlcnRpZXMuUFJPUF9XU0RMX1NPQVBfU0NIRU1BLAotICAgICAgV1NJUHJvcGVydGllcy5ERUZfV1NETF9TT0FQX1NDSEVNQSk7Ci0gIH0KLSAgLyoqCi0gICAqIEdldCBXU0RMIHNjaGVtYSBsb2NhdGlvbi4KLSAgICogQHJldHVybiBXU0RMIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lLAotICAgIFN0cmluZyBkZWZhdWx0VmFsdWUpCi0gIHsKLSAgICAvL1N0cmluZyBzY2hlbWFMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICAvLyBHZXQgdGhlIHdzaS5ob21lIHN5c3RlbSBwcm9wZXJ0eQotICAgIC8vU3RyaW5nIHdzaUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoV1NJUHJvcGVydGllcy5QUk9QX1dTSV9IT01FKTsKLSAgICAvL1N0cmluZyBmaWxlTG9jYXRpb24gPSBXU0lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGVmYXVsdFZhbHVlKTsKLSAgICAvLwotICAgIC8vIElmIHRoZSBmaWxlIGxvY2F0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgd3NpLnByb3BlcnRpZXMgZmlsZSB0aGVuIGJ1aWxkIGxvY2F0aW9uCi0gICAgLy9pZiAoZmlsZUxvY2F0aW9uICE9IG51bGwpCi0gICAgLy97Ci0gICAgLy8gSWYgd3NpLmhvbWUgaXMgc2V0LCB0aGVuIHVzZSBpdAotICAgIC8vICBpZiAod3NpSG9tZSAhPSBudWxsKQotICAgIC8vICB7Ci0gICAgLy8gICAgIHNjaGVtYUxvY2F0aW9uID0gd3NpSG9tZTsKLSAgICAvLyAgIH0KLSAgICAvLyAgIGlmIChzY2hlbWFMb2NhdGlvbiA9PSBudWxsKQotICAgIC8vICAgewotICAgIC8vICAgIHNjaGVtYUxvY2F0aW9uID0gZmlsZUxvY2F0aW9uOwotICAgIC8vICB9Ci0gICAgLy8gIGVsc2UKLSAgICAvLyAgewotICAgIC8vICAgaWYgKCFzY2hlbWFMb2NhdGlvbi5lbmRzV2l0aCgiLyIpKQotICAgIC8vICAgIHsKLSAgICAvLyAgICAgc2NoZW1hTG9jYXRpb24gKz0gIi8iOwotICAgIC8vICAgfQotICAgIC8vCi0gICAgLy8gICAgc2NoZW1hTG9jYXRpb24gKz0gZmlsZUxvY2F0aW9uOwotICAgIC8vICB9Ci0gICAgLy8gfQotICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1R5cGVzUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1R5cGVzUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczZDA1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9UeXBlc1JlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLnZhbGlkYXRvci5CYXNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFRoZSBjbGFzcyBleHRyYWN0cyBYU0Qgc2NoZW1hIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIFdTREwuCi0gKiAKLSAqIEBhdXRob3IgS3VsaWsKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFR5cGVzUmVnaXN0cnkgaW1wbGVtZW50cyBXU0lUYWcsIFdTRExWaXNpdG9yCi17Ci0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuUGFydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBhcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KGphdmF4LndzZGwuU2VydmljZSwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNlcnZpY2Ugb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoVHlwZXMsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChUeXBlcyBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChPcGVyYXRpb24sIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChPcGVyYXRpb24gb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoSW5wdXQsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJbnB1dCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChPdXRwdXQsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChPdXRwdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoRmF1bHQsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChGYXVsdCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChCaW5kaW5nLCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZyBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChCaW5kaW5nT3BlcmF0aW9uLCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgQmluZGluZ09wZXJhdGlvbiBvYmosCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoQmluZGluZ0lucHV0LCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZ0lucHV0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEJpbmRpbmdPdXRwdXQsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChCaW5kaW5nT3V0cHV0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEJpbmRpbmdGYXVsdCwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmdGYXVsdCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChFbGVtZW50LCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoRWxlbWVudCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChNZXNzYWdlLCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoTWVzc2FnZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChQb3J0LCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUG9ydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChQb3J0VHlwZSwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnRUeXBlIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KERlZmluaXRpb24sIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChEZWZpbml0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KEV4dGVuc2liaWxpdHlFbGVtZW50LAotICAgKiBPYmplY3QsIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBCaW5kaW5nLCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJpbmRpbmcgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy53c2kud3NkbC50cmF2ZXJzYWwuV1NETFZpc2l0b3IjdmlzaXQoU09BUEJvZHksIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQm9keSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChTT0FQSGVhZGVyLCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEhlYWRlciBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChTT0FQSGVhZGVyRmF1bHQsIE9iamVjdCwKLSAgICogV1NETFRyYXZlcnNhbENvbnRleHQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdCgKLSAgICBTT0FQSGVhZGVyRmF1bHQgb2JqLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLndzZGwudHJhdmVyc2FsLldTRExWaXNpdG9yI3Zpc2l0KFNPQVBGYXVsdCwgT2JqZWN0LAotICAgKiBXU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFNPQVBGYXVsdCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChTT0FQT3BlcmF0aW9uLCBPYmplY3QsCi0gICAqIFdTRExUcmF2ZXJzYWxDb250ZXh0KQotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUE9wZXJhdGlvbiBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICB9Ci0KLSAgcHJpdmF0ZSBNYXAgZWxlbWVudDJUeXBlID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJpdmF0ZSBTZXQgZXh0ZW5kc0FycmF5ID0gbmV3IEhhc2hTZXQoKTsKLSAgcHJpdmF0ZSBTZXQgdXNlc1dzZGxBcnJheVR5cGUgPSBuZXcgSGFzaFNldCgpOwotCi0gIHByb3RlY3RlZCBCYXNlVmFsaWRhdG9yIGJhc2VWYWxpZGF0b3IgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBjcmVhdGVzIHRoZSB0eXBlcyByZWdpc3RyeS4gYnkgdGhlIGdpdmVuIFdTREwgZGVmaW5pdGlvbgotICAgKiBvYmplY3QuCi0gICAqIAotICAgKiBAcGFyYW0gZGVmIGEgV1NETCBkZWZpbml0aW9uLgotICAgKiBAcGFyYW0gYmFzZVZhbGlkYXRvciBhIGJhc2UgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIFR5cGVzUmVnaXN0cnkoRGVmaW5pdGlvbiBkZWYsIEJhc2VWYWxpZGF0b3IgYmFzZVZhbGlkYXRvcikKLSAgewotICAgIHRoaXMuYmFzZVZhbGlkYXRvciA9IGJhc2VWYWxpZGF0b3I7Ci0gICAgaWYgKGRlZiA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRGVmaW5pdGlvbiBjYW4gbm90IGJlIG51bGwiKTsKLQotICAgIFdTRExUcmF2ZXJzYWwgdHJhdmVyc2FsID0gbmV3IFdTRExUcmF2ZXJzYWwoKTsKLSAgICAvL1Zpc2l0b3JBZGFwdG9yLmFkYXB0KHRoaXMpOwotICAgIHRyYXZlcnNhbC5zZXRWaXNpdG9yKHRoaXMpOwotICAgIHRyYXZlcnNhbC52aXNpdEltcG9ydCh0cnVlKTsKLQotICAgIHByb2Nlc3NUeXBlcyhkZWYuZ2V0VHlwZXMoKSwgZGVmLmdldERvY3VtZW50QmFzZVVSSSgpKTsKLSAgICB0cmF2ZXJzYWwudHJhdmVyc2UoZGVmKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBjcmVhdGVzIHRoZSB0eXBlcyByZWdpc3RyeSBieSBnaXZlbiBXU0RMIHR5cGVzIG9iamVjdCBhbmQKLSAgICogbG9jYXRpb24gY29udGV4dCBVUkkuCi0gICAqIEBwYXJhbSB0eXBlcyBXU0RMIHR5cGVzIG9iamVjdC4KLSAgICogQHBhcmFtIGNvbnRleHQgbG9jYXRpb24gY29udGV4dCBVUkkuCi0gICAqIEBwYXJhbSBiYXNlVmFsaWRhdG9yIGEgYmFzZSB2YWxpZGF0b3IuCi0gICAqLwotICBwdWJsaWMgVHlwZXNSZWdpc3RyeSgKLSAgICBUeXBlcyB0eXBlcywKLSAgICBTdHJpbmcgY29udGV4dCwKLSAgICBCYXNlVmFsaWRhdG9yIGJhc2VWYWxpZGF0b3IpCi0gIHsKLSAgICB0aGlzLmJhc2VWYWxpZGF0b3IgPSBiYXNlVmFsaWRhdG9yOwotICAgIHByb2Nlc3NUeXBlcyh0eXBlcywgY29udGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCByZXR1cm5zIHR5cGUncyBxbmFtZSBieSBnaXZlbiBlbGVtZW50J3MgcW5hbWUuCi0gICAqIEBwYXJhbSBlbGVtZW50TmFtZSBhIHF1YWxpZmllZCBlbGVtZW50IG5hbWUuCi0gICAqIEByZXR1cm4gdHlwZSdzIHFuYW1lIGJ5IGdpdmVuIGVsZW1lbnQncyBxbmFtZS4KLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRUeXBlKFFOYW1lIGVsZW1lbnROYW1lKQotICB7Ci0gICAgcmV0dXJuIChRTmFtZSkgZWxlbWVudDJUeXBlLmdldChlbGVtZW50TmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCByZXR1cm5zIHNldCBvZiB0eXBlcyB3aGljaCBpcyBhcnJheSBhdHRyaWJ1dGUuCi0gICAqIEByZXR1cm4gc2V0IG9mIHR5cGVzIHdoaWNoIGlzIGFycmF5IGF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBTZXQgZ2V0QXJyYXlUeXBlcygpCi0gIHsKLSAgICBTZXQgcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgcy5hZGRBbGwoKENvbGxlY3Rpb24pIHVzZXNXc2RsQXJyYXlUeXBlKTsKLSAgICBzLmFkZEFsbCgoQ29sbGVjdGlvbikgZXh0ZW5kc0FycmF5KTsKLSAgICByZXR1cm4gczsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHJldHVybnMgc2V0IG9mIGVsZW1lbnRzIGRlZmluZWQgaW4gdHlwZXMgZWxlbWVudC4KLSAgICogQHJldHVybiBzZXQgb2YgZWxlbWVudHMgZGVmaW5lZCBpbiB0eXBlcyBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIFNldCBnZXRFbGVtZW50TGlzdCgpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5lbGVtZW50MlR5cGUua2V5U2V0KCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgZGVjbGFyZXMgd3NkbDphcnJheVR5cGUKLSAgICogYXR0cmlidXRlIHdpdGhpbiBkZWNsYXJhdGlvbi4KLSAgICogQHBhcmFtIHR5cGUgYSB0eXBlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHR5cGUgZGVjbGFyZXMgd3NkbDphcnJheVR5cGUKLSAgICogYXR0cmlidXRlIHdpdGhpbiBkZWNsYXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVXNlc1dTRExBcnJheVR5cGUoUU5hbWUgdHlwZSkKLSAgewotICAgIHJldHVybiB1c2VzV3NkbEFycmF5VHlwZS5jb250YWlucyh0eXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBnaXZlbiB0eXBlIGV4dGVuZHMgc29hcGVuYzpBcnJheSB0eXBlLgotICAgKiBAcGFyYW0gdHlwZSBhIHR5cGUuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiB0eXBlIGV4dGVuZHMgc29hcGVuYzpBcnJheSB0eXBlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFeHRlbmRzQXJyYXkoUU5hbWUgdHlwZSkKLSAgewotICAgIHJldHVybiBleHRlbmRzQXJyYXkuY29udGFpbnModHlwZSk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVmlzaXRvciN2aXNpdChqYXZheC53c2RsLkltcG9ydCwgamF2YS5sYW5nLk9iamVjdCwgb3JnLndzaS53c2RsLnRyYXZlcnNhbC5XU0RMVHJhdmVyc2FsQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEltcG9ydCBpbSwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgaWYgKGltLmdldERlZmluaXRpb24oKSAhPSBudWxsKQotICAgICAgcHJvY2Vzc1dTREwoaW0uZ2V0RGVmaW5pdGlvbigpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcm5hbCBtZXRob2QgcHJvY2Vzc2VzIFdTREwgZGVmaW5pdGlvbi4KLSAgICogQHBhcmFtIGRlZiBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzV1NETChEZWZpbml0aW9uIGRlZikKLSAgewotICAgIGlmIChkZWYuZ2V0VHlwZXMoKSAhPSBudWxsKQotICAgICAgcHJvY2Vzc1R5cGVzKGRlZi5nZXRUeXBlcygpLCBkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEludGVybmFsIG1ldGhvZCBwcm9jZXNzZXMgV1NETCB0eXBlcy4KLSAgICogQHBhcmFtIHR5cGVzIFdTREwgdHlwZXMuCi0gICAqIEBwYXJhbSBjb250ZXh0IGEgY29udGV4dC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzVHlwZXMoVHlwZXMgdHlwZXMsIFN0cmluZyBjb250ZXh0KQotICB7Ci0gICAgaWYgKHR5cGVzID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgTGlzdCBleHRzID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgaWYgKGV4dHMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IGV4dHMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVsID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmIChlbCBpbnN0YW5jZW9mIFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgICAgICBzZWFyY2hGb3JTY2hlbWEoCi0gICAgICAgICAgICAoKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgZWwpLmdldEVsZW1lbnQoKSwKLSAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcm5hbCBtZXRob2Qgc2VhcmNoZXMgWFNEIHNjaGVtYSBkZWNsYXJhdGlvbiBhbmQgWFNEIGltcG9ydAotICAgKiBzdGF0ZW1lbnRzLgotICAgKiBAcGFyYW0gbgotICAgKiBAcGFyYW0gY29udGV4dAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHNlYXJjaEZvclNjaGVtYShOb2RlIG4sIFN0cmluZyBjb250ZXh0KQotICB7Ci0gICAgd2hpbGUgKG4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBzZWFyY2hlcyBmb3IgeHNkOmltcG9ydCBlbGVtZW50Ci0gICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpKQotICAgICAgewotICAgICAgICAvLyBpZiB4c2Q6c2NoZW1hIGVsZW1lbnQgaXMgZm91bmQgLT4gcHJvY2VzcyBzY2hlbWEKLSAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICAgIHByb2Nlc3NTY2hlbWEobiwgY29udGV4dCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAvLyBpZiB4c2Q6aW1wb3J0IGVsZW1lbnQgaXMgZm91bmQgLT4gbG9hZCBzY2hlbWEgYW5kIHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgICAgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTVBPUlQpKQotICAgICAgICAgICAgbG9hZFNjaGVtYShuLCBjb250ZXh0KTsKLSAgICAgICAgICAvLyBpZiB4c2Q6aW5jbHVkZSBlbGVtZW50IGlzIGZvdW5kIC0+IGxvYWQgc2NoZW1hIGFuZCBwcm9jZXNzIHNjaGVtYQotICAgICAgICAgIGVsc2UgaWYgKFhNTFV0aWxzLmVxdWFscyhuLCBFTEVNX1hTRF9JTkNMVURFKSkKLSAgICAgICAgICAgIGxvYWRTY2hlbWEobiwgY29udGV4dCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgLy8gZWxzZSBpdGVyYXRlIGVsZW1lbnQgcmVjdXJzaXZlbHkKLSAgICAgICAgICAgIHNlYXJjaEZvclNjaGVtYShuLmdldEZpcnN0Q2hpbGQoKSwgY29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcm5hbCBtZXRob2QgbG9hZHMgWFNEIHNjaGVtYSBieSB1c2luZyBzY2hlbWEgbG9jYXRpb24gYW5kCi0gICAqIGxvY2F0aW9uIGNvbnRleHQuCi0gICAqIEBwYXJhbSBpbXBvcnROb2RlCi0gICAqIEBwYXJhbSBjb250ZXh0Ci0gICAqLwotICBwcml2YXRlIHZvaWQgbG9hZFNjaGVtYShOb2RlIGltcG9ydE5vZGUsIFN0cmluZyBjb250ZXh0KQotICB7Ci0gICAgRWxlbWVudCBpbSA9IChFbGVtZW50KSBpbXBvcnROb2RlOwotICAgIEF0dHIgc2NoZW1hTG9jYXRpb24gPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoaW0sIEFUVFJfWFNEX1NDSEVNQUxPQ0FUSU9OKTsKLSAgICAvLyB0cnkgdG8gcGFyc2UgaW1wb3J0ZWQgWFNECi0gICAgaWYgKHNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSAhPSBudWxsKQotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vIGlmIGFueSBlcnJvciBvciByb290IGVsZW1lbnQgaXMgbm90IFhTRCBzY2hlbWEgLT4gZXJyb3IKLSAgICAgICAgRG9jdW1lbnQgc2NoZW1hID0KLSAgICAgICAgICBiYXNlVmFsaWRhdG9yLnBhcnNlWE1MRG9jdW1lbnRVUkwoCi0gICAgICAgICAgICBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgIG51bGwpOwotICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKHNjaGVtYS5nZXREb2N1bWVudEVsZW1lbnQoKSwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgICAgICBwcm9jZXNzU2NoZW1hKAotICAgICAgICAgICAgc2NoZW1hLmdldERvY3VtZW50RWxlbWVudCgpLAotICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlVVJMU3RyaW5nKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksIGNvbnRleHQpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgIHsKLSAgICAgICAgLy90LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAvLyBub3RoaW5nLiBpdCdzIG5vdCBhIHNjaGVtYQotICAgICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEludGVybmFsIG1ldGhvZCBwcm9jZXNzZXMgWFNEIHNjaGVtYSBhbmQgcmV0cmlldmVzIHR5cGVzIGRlY2xhcmF0aW9uIGZyb20KLSAgICogaXQuCi0gICAqIEBwYXJhbSBzY2hlbWEKLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICovCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzU2NoZW1hKE5vZGUgc2NoZW1hLCBTdHJpbmcgY29udGV4dCkKLSAgewotICAgIEF0dHIgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgc2NoZW1hLCBBVFRSX1hTRF9UQVJHRVROQU1FU1BBQ0UpOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiOwotICAgIC8vIGl0ZXJhdGUgc2NoZW1hCi0gICAgTm9kZSBuID0gc2NoZW1hLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAvLyAhISB3ZSBzdXBwb3NlIHRoYXQgeHNkOmltcG9ydCBlbGVtZW50IGlzIG9jY3VyZWQgb25seSB3aXRoaW4geHNkOnNjaGVtYSBlbGVtZW50ICAgICAgICAKLSAgICB3aGlsZSAobiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBuLmdldE5vZGVUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfRUxFTUVOVCkpCi0gICAgICAgIHsKLSAgICAgICAgICBFbGVtZW50IGVsID0gKEVsZW1lbnQpIG47Ci0gICAgICAgICAgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZShlbCwgQVRUUl9YU0RfTkFNRSk7Ci0gICAgICAgICAgUU5hbWUgZWxlbWVudCA9Ci0gICAgICAgICAgICBuZXcgUU5hbWUodGFyZ2V0TmFtZXNwYWNlLCAoYSAhPSBudWxsKSA/IGEuZ2V0VmFsdWUoKSA6ICIiKTsKLQotICAgICAgICAgIGEgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoZWwsIEFUVFJfWFNEX1RZUEUpOwotICAgICAgICAgIFFOYW1lIHR5cGUgPSBudWxsOwotICAgICAgICAgIGlmIChhICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHQgPSBhLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAvLyBpZiB0eXBlIGNvbnRhaW5zICc6JywgaXQgbWVhbnMgdGhhdCBpdCBjb250YWlucyBxbmFtZQotICAgICAgICAgICAgaW50IGkgPSB0LmluZGV4T2YoJzonKTsKLSAgICAgICAgICAgIGlmIChpICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gdC5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgICAgICAgICAgIFN0cmluZyBuc1VSSSA9IFhNTFV0aWxzLmZpbmROYW1lc3BhY2VVUkkobiwgcHJlZml4KTsKLSAgICAgICAgICAgICAgdHlwZSA9IG5ldyBRTmFtZShuc1VSSSwgdC5zdWJzdHJpbmcoaSArIDEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgdHlwZSA9IG5ldyBRTmFtZSh0YXJnZXROYW1lc3BhY2UsIHQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gc3VwcG9zZSB0aGF0IGVsZW1lbnQgZGlyZWN0bHkgY29udGFpbnMgdHlwZSBkZWNsYXJhdGlvbgotICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICBjaGVja1R5cGUobiwgdHlwZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZWxlbWVudDJUeXBlLnB1dChlbGVtZW50LCB0eXBlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfSU1QT1JUKSkKLSAgICAgICAgICBsb2FkU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgICBlbHNlIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfSU5DTFVERSkpCi0gICAgICAgICAgICBsb2FkU2NoZW1hKG4sIGNvbnRleHQpOwotICAgICAgICBlbHNlIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfQ09NUExFWFRZUEUpKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudCBlbCA9IChFbGVtZW50KSBuOwotICAgICAgICAgIGEgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoZWwsIEFUVFJfWFNEX05BTUUpOwotICAgICAgICAgIFFOYW1lIHR5cGUgPQotICAgICAgICAgICAgbmV3IFFOYW1lKHRhcmdldE5hbWVzcGFjZSwgKGEgIT0gbnVsbCkgPyBhLmdldFZhbHVlKCkgOiAiIik7Ci0gICAgICAgICAgY2hlY2tUeXBlKG4sIHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgIH0KLQotICAgICAgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW50ZXJuYWwgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHNwZWNpZmllZCB0eXBlIGhhcyBXU0RMIGFycmF5IHR5cGUKLSAgICogYXR0cmlidXRlIGluIHRoZSBYU0QgZGVjbGFyYXRpb24uCi0gICAqIEBwYXJhbSBuCi0gICAqIEBwYXJhbSBuYW1lCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tUeXBlKE5vZGUgbiwgUU5hbWUgbmFtZSkKLSAgewotICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKSkKLSAgICAgIHsKLSAgICAgICAgLy8gY2hlY2sgc3VjaCBzZW50ZW5jZQotICAgICAgICAvLyAgICAgICAgICAgICAgeHNkOmF0dHJpYnV0ZSByZWY9InNvYXBlbmM6YXJyYXlUeXBlIiB3c2RsOmFycmF5VHlwZT0idG5zOk15QXJyYXkyVHlwZVtdIi8+Ci0gICAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMobiwgRUxFTV9YU0RfQVRUUklCVVRFKSkKLSAgICAgICAgewotICAgICAgICAgIEF0dHIgYSA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgbiwgQVRUUl9XU0RMX0FSUkFZVFlQRSk7Ci0gICAgICAgICAgaWYgKGEgIT0gbnVsbCkKLSAgICAgICAgICAgIHVzZXNXc2RsQXJyYXlUeXBlLmFkZChuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHJpZXZlIGJhc2UgYXR0cmlidXRlIG1heSBiZSBmcm9tIHJlc3RyaWN0aW9uIG9yIGV4dGVuc2lvbgotICAgICAgICBBdHRyIGEgPSBYTUxVdGlscy5nZXRBdHRyaWJ1dGUoKEVsZW1lbnQpIG4sIEFUVFJfWFNEX0JBU0UpOwotICAgICAgICBpZiAoYSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGJhc2UgPSBhLmdldFZhbHVlKCk7Ci0gICAgICAgICAgaW50IGkgPSBiYXNlLmluZGV4T2YoIjoiKTsKLSAgICAgICAgICBpZiAoaSAhPSAtMSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYmFzZS5zdWJzdHJpbmcoMCwgaSk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWwgPSBiYXNlLnN1YnN0cmluZyhpICsgMSk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gWE1MVXRpbHMuZmluZE5hbWVzcGFjZVVSSShuLCBwcmVmaXgpOwotICAgICAgICAgICAgaWYgKFNPQVBFTkNfQVJSQVkuZXF1YWxzKG5ldyBRTmFtZShuYW1lc3BhY2UsIGxvY2FsKSkpCi0gICAgICAgICAgICAgIGV4dGVuZHNBcnJheS5hZGQobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNoZWNrVHlwZShuLmdldEZpcnN0Q2hpbGQoKSwgbmFtZSk7Ci0gICAgICB9Ci0gICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvVURESVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9VRERJVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3MjM2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9VRERJVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcudWRkaTRqLlVERElFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnVkZGk0ai5jbGllbnQuVURESVByb3h5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZy5CaW5kaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLlRNb2RlbEluc3RhbmNlSW5mbzsKLWltcG9ydCBvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzLkJ1c2luZXNzRW50aXR5OwotaW1wb3J0IG9yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZS5CdXNpbmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLnVkZGk0ai5kYXRhdHlwZS50bW9kZWwuVE1vZGVsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuQnVzaW5lc3NEZXRhaWw7Ci1pbXBvcnQgb3JnLnVkZGk0ai5yZXNwb25zZS5TZXJ2aWNlRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsRGV0YWlsOwotaW1wb3J0IG9yZy51ZGRpNGoucmVzcG9uc2UuVE1vZGVsSW5mbzsKLWltcG9ydCBvcmcudWRkaTRqLnJlc3BvbnNlLlRNb2RlbExpc3Q7Ci1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy51ZGRpNGoudXRpbC5DYXRlZ29yeUJhZzsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcjsKLWltcG9ydCBvcmcudWRkaTRqLnV0aWwuRmluZFF1YWxpZmllcnM7Ci1pbXBvcnQgb3JnLnVkZGk0ai51dGlsLktleWVkUmVmZXJlbmNlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZSBzb21lIHNlcnZpY2UgZnVuY3Rpb25zIHVzZWQgYnkgVURESVZhbGlkYXRvci4KLSAqCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVRERJVXRpbHMKLXsKLSAgc3RhdGljIHB1YmxpYyBmaW5hbCBGaW5kUXVhbGlmaWVycyBFWEFDVF9OQU1FX01BVENIX1FVQUxJRklFUjsKLSAgc3RhdGljIHsKLSAgICBWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotICAgIEVYQUNUX05BTUVfTUFUQ0hfUVVBTElGSUVSID0gbmV3IEZpbmRRdWFsaWZpZXJzKCk7Ci0gICAgdmVjdG9yLmFkZChuZXcgRmluZFF1YWxpZmllcihGaW5kUXVhbGlmaWVyLmV4YWN0TmFtZU1hdGNoKSk7Ci0gICAgdmVjdG9yLmFkZChuZXcgRmluZFF1YWxpZmllcihGaW5kUXVhbGlmaWVyLnNvcnRCeU5hbWVBc2MpKTsKLSAgICBFWEFDVF9OQU1FX01BVENIX1FVQUxJRklFUi5zZXRGaW5kUXVhbGlmaWVyVmVjdG9yKHZlY3Rvcik7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX0lfQ09ORk9STUFOQ0VfVE1PREVMX05BTUUgPQotICAgICJ3cy1pLW9yZzpjb25mb3Jtc1RvOjIwMDJfMTIiOwotCi0gIHN0YXRpYyBwcml2YXRlIEhhc2h0YWJsZSB3c2lDb25mb3JtYW5jZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBHZXRzIGEgYnVzaW5lc3Mgc2VydmljZSBieSBrZXkuCi0gICAqIEBwYXJhbSBwcm94eSAgYSBVRERJIHByb3h5LgotICAgKiBAcGFyYW0ga2V5ICAgIGEga2V5IHRvIGEgYnVzaW5lc3Mgc2VydmljZS4KLSAgICogQHJldHVybiBhIGJ1c2luZXNzIHNlcnZpY2Ugc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBrZXkuCi0gICAqIEB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGVycm9yIG9yaWdpbmF0aW5nIHdpdGhpbiB0aGUgU09BUCB0cmFuc3BvcnQuCi0gICAqIEB0aHJvd3MgVURESUV4Y2VwdGlvbiBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgVURESSBBUEkgY2Fubm90IGluZGljYXRlIGFuIGVycm9yIGNvbmRpdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnVzaW5lc3NTZXJ2aWNlIGdldEJ1c2luZXNzU2VydmljZUJ5S2V5KAotICAgIFVERElQcm94eSBwcm94eSwKLSAgICBTdHJpbmcga2V5KQotICAgIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sIFVERElFeGNlcHRpb24KLSAgewotICAgIEJ1c2luZXNzU2VydmljZSByZXN1bHQgPSBudWxsOwotCi0gICAgU2VydmljZURldGFpbCBzZCA9IHByb3h5LmdldF9zZXJ2aWNlRGV0YWlsKGtleSk7Ci0KLSAgICBpZiAoc2QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBWZWN0b3IgdiA9IHNkLmdldEJ1c2luZXNzU2VydmljZVZlY3RvcigpOwotCi0gICAgICBpZiAodiAhPSBudWxsICYmIHYuc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEJ1c2luZXNzU2VydmljZSkgdi5maXJzdEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYnVzaW5lc3MgZW50aXR5IGJ5IGtleS4KLSAgICogQHBhcmFtIHByb3h5ICBhIFVEREkgcHJveHkuCi0gICAqIEBwYXJhbSBrZXkgICAgYSBrZXkgdG8gYSBidXNpbmVzcyBlbnRpeS4KLSAgICogQHJldHVybiBhIGJ1c2luZXNzIGVudGl0eSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIGtleS4KLSAgICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gaWYgZXJyb3Igb3JpZ2luYXRpbmcgd2l0aGluIHRoZSBTT0FQIHRyYW5zcG9ydC4KLSAgICogQHRocm93cyBVRERJRXhjZXB0aW9uIGlmIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBVRERJIEFQSSBjYW5ub3QgaW5kaWNhdGUgCi0gICAqICAgICAgICAgYW4gZXJyb3IgY29uZGl0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCdXNpbmVzc0VudGl0eSBnZXRCdXNpbmVzc0J5S2V5KFVERElQcm94eSBwcm94eSwgU3RyaW5nIGtleSkKLSAgICB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uLCBVRERJRXhjZXB0aW9uCi0gIHsKLSAgICBCdXNpbmVzc0VudGl0eSByZXN1bHQgPSBudWxsOwotCi0gICAgQnVzaW5lc3NEZXRhaWwgYmQgPSBwcm94eS5nZXRfYnVzaW5lc3NEZXRhaWwoa2V5KTsKLQotICAgIGlmIChiZCAhPSBudWxsKQotICAgIHsKLSAgICAgIFZlY3RvciB2ID0gYmQuZ2V0QnVzaW5lc3NFbnRpdHlWZWN0b3IoKTsKLQotICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2LnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChCdXNpbmVzc0VudGl0eSkgdi5maXJzdEVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB0TW9kZWwgYnkga2V5LgotICAgKiBAcGFyYW0gcHJveHkgIGEgVURESSBwcm94eS4KLSAgICogQHBhcmFtIGtleSAgICBhIGtleSB0byBhIHRNb2RlbC4KLSAgICogQHJldHVybiBhIHRNb2RlbCBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIGtleS4KLSAgICogQHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gaWYgZXJyb3Igb3JpZ2luYXRpbmcgd2l0aGluIHRoZSBTT0FQIHRyYW5zcG9ydC4KLSAgICogQHRocm93cyBVRERJRXhjZXB0aW9uIGlmIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBVRERJIEFQSSBjYW5ub3QgaW5kaWNhdGUgCi0gICAqICAgICAgICAgYW4gZXJyb3IgY29uZGl0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUTW9kZWwgZ2V0VE1vZGVsQnlLZXkoVURESVByb3h5IHByb3h5LCBTdHJpbmcga2V5KQotICB7Ci0gICAgVE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBUTW9kZWxEZXRhaWwgYmQgPSBwcm94eS5nZXRfdE1vZGVsRGV0YWlsKGtleSk7Ci0KLSAgICAgIGlmIChiZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBWZWN0b3IgdiA9IGJkLmdldFRNb2RlbFZlY3RvcigpOwotCi0gICAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5zaXplKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gKFRNb2RlbCkgdi5maXJzdEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgewotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBrZXkgb2YgdGhlIFdTSSBDb25mb3JtYW5jZSB0TW9kZWwuCi0gICAqIEBwYXJhbSBwcm94eSAgYSBVRERJIHByb3h5LgotICAgKiBAcmV0dXJuIHRoZSBrZXkgb2YgdGhlIFdTSSBDb25mb3JtYW5jZSB0TW9kZWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0lDb25mb3JtYW5jZVRNb2RlbEtleShVRERJUHJveHkgcHJveHkpCi0gIHsKLSAgICBpZiAocHJveHkgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVEREkgcHJveHkgY2Fubm90IGJlIG51bGwuIik7Ci0KLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotICAgIGlmICh3c2lDb25mb3JtYW5jZVRhYmxlLmNvbnRhaW5zS2V5KHByb3h5KSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB3c2lDb25mb3JtYW5jZVRhYmxlLmdldChwcm94eSkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldFRNb2RlbEtleUJ5TmFtZShwcm94eSwgV1NfSV9DT05GT1JNQU5DRV9UTU9ERUxfTkFNRSk7Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiV1MtSSBjb25mb3JtYW5jZSB0YXhvbm9teSB0TW9kZWwgd2FzIG5vdCBmb3VuZCIpOwotICAgICAgfQotCi0gICAgICB3c2lDb25mb3JtYW5jZVRhYmxlLnB1dChwcm94eSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB0TW9kZWwga2V5IGJ5IHRNb2RlbCBuYW1lLgotICAgKiBAcGFyYW0gcHJveHkgIGEgVURESSBwcm94eS4KLSAgICogQHBhcmFtIG5hbWUgICBhIHRNb2RlbCBuYW1lLgotICAgKiBAcmV0dXJuIGEgdE1vZGVsIGtleSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHRNb2RlbCBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VE1vZGVsS2V5QnlOYW1lKFVERElQcm94eSBwcm94eSwgU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUTW9kZWxMaXN0IGxpc3QgPQotICAgICAgICBwcm94eS5maW5kX3RNb2RlbChuYW1lLCBudWxsLCBudWxsLCBFWEFDVF9OQU1FX01BVENIX1FVQUxJRklFUiwgMSk7Ci0gICAgICBUTW9kZWxJbmZvIGluZm8gPQotICAgICAgICAoVE1vZGVsSW5mbykgbGlzdC5nZXRUTW9kZWxJbmZvcygpLmdldFRNb2RlbEluZm9WZWN0b3IoKS5maXJzdEVsZW1lbnQoKTsKLSAgICAgIHJlc3VsdCA9IGluZm8uZ2V0VE1vZGVsS2V5KCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJpbmRpbmdUZW1wbGF0ZS4KLSAgICogQHBhcmFtIGJpbmRpbmdUZW1wbGF0ZSAgYSBCaW5kaW5nVGVtcGxhdGUgb2JqZWN0LgotICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJpbmRpbmdUZW1wbGF0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmRpbmdUZW1wbGF0ZVRvU3RyaW5nKEJpbmRpbmdUZW1wbGF0ZSBiaW5kaW5nVGVtcGxhdGUpCi0gIHsKLSAgICBTdHJpbmcgcmV0dXJuU3RyaW5nID0gIiI7Ci0KLSAgICBpZiAoYmluZGluZ1RlbXBsYXRlID09IG51bGwpCi0gICAgICByZXR1cm5TdHJpbmcgPSAibnVsbCI7Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuU3RyaW5nID0KLSAgICAgICAgImFjY2Vzc1BvaW50OiAiCi0gICAgICAgICAgKyAoYmluZGluZ1RlbXBsYXRlLmdldEFjY2Vzc1BvaW50KCkgPT0gbnVsbAotICAgICAgICAgICAgPyAibnVsbCIKLSAgICAgICAgICAgIDogYmluZGluZ1RlbXBsYXRlLmdldEFjY2Vzc1BvaW50KCkuZ2V0VGV4dCgpKTsKLQotICAgICAgaWYgKGJpbmRpbmdUZW1wbGF0ZS5nZXRUTW9kZWxJbnN0YW5jZURldGFpbHMoKSA9PSBudWxsCi0gICAgICAgIHx8IGJpbmRpbmdUZW1wbGF0ZQotICAgICAgICAgIC5nZXRUTW9kZWxJbnN0YW5jZURldGFpbHMoKQotICAgICAgICAgIC5nZXRUTW9kZWxJbnN0YW5jZUluZm9WZWN0b3IoKQotICAgICAgICAgID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVyblN0cmluZyArPSAiLCBbbm8gdE1vZGVsIHJlZmVyZW5jZV0iOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0KLSAgICAgICAgICBiaW5kaW5nVGVtcGxhdGUKLSAgICAgICAgICAgIC5nZXRUTW9kZWxJbnN0YW5jZURldGFpbHMoKQotICAgICAgICAgICAgLmdldFRNb2RlbEluc3RhbmNlSW5mb1ZlY3RvcigpCi0gICAgICAgICAgICAuaXRlcmF0b3IoKTsKLQotICAgICAgICBpbnQgaW5mb0NvdW50ID0gMTsKLSAgICAgICAgVE1vZGVsSW5zdGFuY2VJbmZvIGluZm87Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbmZvID0gKFRNb2RlbEluc3RhbmNlSW5mbykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgIHJldHVyblN0cmluZyArPSAiLCBbIgotICAgICAgICAgICAgKyBpbmZvQ291bnQrKwotICAgICAgICAgICAgKyAiXSB0TW9kZWxLZXk6ICIKLSAgICAgICAgICAgICsgaW5mby5nZXRUTW9kZWxLZXkoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXR1cm5TdHJpbmc7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0TW9kZWwuCi0gICAqIEBwYXJhbSB0TW9kZWwgIGEgVE1vZGVsIG9iamVjdC4KLSAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0TW9kZWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyB0TW9kZWxUb1N0cmluZyhUTW9kZWwgdE1vZGVsKQotICB7Ci0gICAgU3RyaW5nIHJldHVyblN0cmluZyA9ICIiOwotCi0gICAgaWYgKHRNb2RlbCA9PSBudWxsKQotICAgICAgcmV0dXJuU3RyaW5nID0gIm51bGwiOwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVyblN0cmluZyA9Ci0gICAgICAgICJuYW1lOiAiCi0gICAgICAgICAgKyB0TW9kZWwuZ2V0TmFtZVN0cmluZygpCi0gICAgICAgICAgKyAiLCBjYXRlZ29yeUJhZzogIgotICAgICAgICAgICsgKHRNb2RlbC5nZXRDYXRlZ29yeUJhZygpID09IG51bGwKLSAgICAgICAgICAgID8gIm51bGwiCi0gICAgICAgICAgICA6IGNhdGVnb3J5QmFnVG9TdHJpbmcodE1vZGVsLmdldENhdGVnb3J5QmFnKCkpKQotICAgICAgICAgICsgIiwgb3ZlcnZpZXdVUkw6ICIKLSAgICAgICAgICArICh0TW9kZWwuZ2V0T3ZlcnZpZXdEb2MoKSA9PSBudWxsCi0gICAgICAgICAgICA/ICJudWxsIgotICAgICAgICAgICAgOiB0TW9kZWwuZ2V0T3ZlcnZpZXdEb2MoKS5nZXRPdmVydmlld1VSTFN0cmluZygpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dXJuU3RyaW5nOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgY2F0ZWdvcnlCYWcuCi0gICAqIEBwYXJhbSBjYXRlZ29yeUJhZyAgYSBDYXRlZ29yeUJhZyBvYmplY3QuCi0gICAqIEByZXR1cm4gYSB0cmluZyByZXByZXNlbnRhdGlvbiBvZiBjYXRlZ29yeUJhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhdGVnb3J5QmFnVG9TdHJpbmcoQ2F0ZWdvcnlCYWcgY2F0ZWdvcnlCYWcpCi0gIHsKLSAgICBTdHJpbmcgcmV0dXJuU3RyaW5nID0gIiI7Ci0KLSAgICBpZiAoY2F0ZWdvcnlCYWcgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm5TdHJpbmcgKz0gIm51bGwiOwotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm5TdHJpbmcgKz0gIktleWVkUmVmZXJlbmNlTGlzdDogIjsKLQotICAgICAgVmVjdG9yIGtyTGlzdCA9IG51bGw7Ci0gICAgICBpZiAoKGtyTGlzdCA9IGNhdGVnb3J5QmFnLmdldEtleWVkUmVmZXJlbmNlVmVjdG9yKCkpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVyblN0cmluZyArPSAibnVsbCI7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGtyTGlzdC5zaXplKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuU3RyaW5nICs9ICJlbXB0eSI7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgS2V5ZWRSZWZlcmVuY2Uga3IgPSBudWxsOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGtyTGlzdC5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAga3IgPSAoS2V5ZWRSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICByZXR1cm5TdHJpbmcgKz0gInRNb2RlbEtleTogIgotICAgICAgICAgICAgKyBrci5nZXRUTW9kZWxLZXkoKQotICAgICAgICAgICAgKyAiLCBrZXlOYW1lOiAiCi0gICAgICAgICAgICArIGtyLmdldEtleU5hbWUoKQotICAgICAgICAgICAgKyAiLCBrZXlWYWx1ZTogIgotICAgICAgICAgICAgKyBrci5nZXRLZXlWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHVyblN0cmluZzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzY2MjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMyBJQk0gQ29ycG9yYXRpb24sIEJlYWNvbiBJbmZvcm1hdGlvbiBUZWNobm9sb2d5IEluYy4gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgIEJlYWNvbklUIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmxvZy5NaW1lUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLk1pbWVQYXJ0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUubG9nLmltcGwuTWltZVBhcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5sb2cuaW1wbC5NaW1lUGFydHNJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlByb2ZpbGVBc3NlcnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci0KLS8qKgotICogR2VuZXJhbCBzZXQgb2YgdXRpbGl0aWVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVXRpbHMKLXsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIENSID0gKGJ5dGUpICdccic7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBMRiA9IChieXRlKSAnXG4nOwotCi0gIC8qKgotICAgKiBDb21tb24gdGltZXN0YW1wIGZvcm1hdC4KLSAgICovCi0gIC8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCB0aW1lc3RhbXBGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCAoInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1MnWiciKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IHRpbWVzdGFtcEZvcm1hdCA9Ci0gICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1MiKTsKLQotICAvKioKLSAgICogQmFzaWMgZGF0ZSBmb3JtYXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9Ci0gICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQiKTsKLQotICAvKioKLSAgICogV3JhcHBlciBtZXRob2QgZm9yIGVycm9yIGxvZ2dpbmc7Ci0gICAqIGZvciBub3cgaXQganVzdCBnb2VzIHRvIHN0ZGVyci4KLSAgICogQHBhcmFtIGluRXJyb3IgIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGluRXJyb3IpCi0gIHsKLSAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgaW5FcnJvcik7Ci0gIH0KLQotICAvKiogCi0gICAqIEdldCBleGNlcHRpb24gaW5mb3JtYXRpb24gYXMgYSBzdHJpbmcuCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgIGEgVGhyb3dhYmxlIG9iamVjdC4KLSAgICogQHJldHVybiBleGNlcHRpb24gaW5mb3JtYXRpb24gYXMgYSBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBnZXRFeGNlcHRpb25EZXRhaWxzKFRocm93YWJsZSB0aHJvd2FibGUpCi0gIHsKLSAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOwotCi0gICAgcHcucHJpbnRsbigiRXhjZXB0aW9uOiAiKTsKLSAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHB3KTsKLQotICAgIHJldHVybiBzdy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBjdXJyZW50IGRhdGUgYW5kIHRpbWUgYXMgYSB0aW1lc3RhbXAuCi0gICAqIEByZXR1cm4gdXJyZW50IGRhdGUgYW5kIHRpbWUgYXMgYSB0aW1lc3RhbXAuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKQotICB7Ci0gICAgLy8gVXNlIEdNVCB0aW1lem9uZQotICAgIC8vdGltZXN0YW1wRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7Ci0gICAgdGltZXN0YW1wRm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldERlZmF1bHQoKSk7Ci0KLSAgICAvLyBSZXR1cm4gdGltZXN0YW1wCi0gICAgcmV0dXJuIHRpbWVzdGFtcEZvcm1hdC5mb3JtYXQobmV3IERhdGUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgZGF0ZSBmb3IgZGVmYXVsdCB0aW1lIHpvbmUuCi0gICAqIEByZXR1cm4gY3VycmVudCBkYXRlIGZvciBkZWZhdWx0IHRpbWUgem9uZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERhdGUoKQotICB7Ci0gICAgLy8gVXNlIEdNVCB0aW1lem9uZQotICAgIGRhdGVGb3JtYXQuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsKLQotICAgIC8vIFJldHVybiBkYXRlCi0gICAgcmV0dXJuIGRhdGVGb3JtYXQuZm9ybWF0KG5ldyBEYXRlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBIVFRQIHN0YXR1cyBjb2RlLgotICAgKiBAcGFyYW0gaHR0cEhlYWRlcnMgIEhUVFAgaGVhZGVycy4KLSAgICogQHJldHVybiBIVFRQIHN0YXR1cyBjb2RlLgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGUgc3RhdHVzIGNvZGUgaW4gaHR0cCBoZWFkZXJzIHdhcyBub3QgZm91bmQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIVFRQU3RhdHVzQ29kZShTdHJpbmcgaHR0cEhlYWRlcnMpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHN0YXR1c0NvZGUgPSBudWxsOwotCi0gICAgaWYgKGh0dHBIZWFkZXJzLnN0YXJ0c1dpdGgoIkhUVFAiKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgbG9jYXRpb24gb2Ygc3RhdHVzIGNvZGUKLSAgICAgIGludCBpbmRleCA9IGh0dHBIZWFkZXJzLmluZGV4T2YoIiAiKTsKLSAgICAgIGludCBpbmRleDIgPSBodHRwSGVhZGVycy5pbmRleE9mKCIgIiwgaW5kZXggKyAxKTsKLQotICAgICAgaWYgKChpbmRleCA9PSAtMSkgfHwgKGluZGV4MiA9PSAtMSkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oCi0gICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIHN0YXR1cyBjb2RlIGluIGh0dHAgaGVhZGVyczogWyIgKyBodHRwSGVhZGVycyArICJdLiIpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHN0YXR1c0NvZGUgPSBodHRwSGVhZGVycy5zdWJzdHJpbmcoaW5kZXggKyAxLCBpbmRleDIpOwotICAgICAgfQotICAgIH0KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKAotICAgICAgICAiQ291bGQgbm90IGZpbmQgc3RhdHVzIGNvZGUgaW4gaHR0cCBoZWFkZXJzOiBbIiArIGh0dHBIZWFkZXJzICsgIl0uIik7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIHN0YXR1cyBjb2RlCi0gICAgcmV0dXJuIHN0YXR1c0NvZGU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IEhUVFAgaGVhZGVycyBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKiBAcGFyYW0gZnVsbE1lc3NhZ2UgIGEgbWVzc2FnZS4KLSAgICogQHJldHVybiBIVFRQIGhlYWRlcnMgZnJvbSBhIGZ1bGwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEhUVFBIZWFkZXJzKFN0cmluZyBmdWxsTWVzc2FnZSkKLSAgewotICAgIC8vU3RyaW5nIGh0dHBIZWFkZXJzID0gbnVsbDsKLQotICAgIC8vIFRyeSBsb29raW5nIGZvciB0aGUgZG91YmxlIG5ld2xpbmUKLSAgICBpbnQgaW5kZXggPSBmdWxsTWVzc2FnZS5pbmRleE9mKCJcclxuXHJcbiIpOwotICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpbmRleCArPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gY2hlY2sgZm9yIGNhc2UgIlxyXHIuLi5cclxuXHJcci4uLlxuIgotICAgICAgLy8gTm90ZSB0aGUgaW5kZXggdGhhdCBpcyByZXR1cm5lZCBwb2ludHMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciAKLSAgICAgIC8vIGltbWVkaWF0ZWRseSBmb2xsb3dpbmcgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiB0aGUgQ1JMRkNSTEYuIAotICAgICAgaW5kZXggPSBnZXRGaXJzdENSTEZDUkxGKGZ1bGxNZXNzYWdlKTsKLSAgICAgIGlmIChpbmRleCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgbG9nRXJyb3IoCi0gICAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBIVFRQIG1lc3NhZ2UgdG8gZmluZCBoZWFkZXJzLiAgRnVsbCBtZXNzYWdlOiAiCi0gICAgICAgICAgKyBmdWxsTWVzc2FnZSk7Ci0gICAgICAgIHJldHVybiAieC1XU0ktVGVzdC1Ub29sLUVycm9yOiBDb3VsZG4ndCBmaW5kIGhlYWRlcnMuICBGdWxsIG1lc3NhZ2U6IFsiCi0gICAgICAgICAgKyBmdWxsTWVzc2FnZQotICAgICAgICAgICsgIl0uIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gSFRUUCBoZWFkZXJzCi0gICAgcmV0dXJuIGZ1bGxNZXNzYWdlLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IFNPQVAgbWVzc2FnZSBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKiBAcGFyYW0gZnVsbE1lc3NhZ2UgIGEgbWVzc2FnZS4KLSAgICogQHJldHVybiBTT0FQIG1lc3NhZ2UgZnJvbSBhIGZ1bGwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRlbnQoU3RyaW5nIGZ1bGxNZXNzYWdlKQotICB7Ci0gICAgU3RyaW5nIG1lc3NhZ2UgPSAiIjsKLQotICAgIC8vIEZpbmQgc3RhcnQgb2YgbWVzc2FnZQotICAgIGludCBpbmRleCA9IGZ1bGxNZXNzYWdlLmluZGV4T2YoIlxyXG5cclxuIik7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGluZGV4ICs9IDQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBjaGVjayBmb3IgY2FzZSAiXHJcci4uLlxyXG5cclxyLi4uXG4iCi0gICAgICAvLyBOb3RlIHRoZSBpbmRleCB0aGF0IGlzIHJldHVybmVkIHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIAotICAgICAgLy8gaW1tZWRpYXRlZGx5IGZvbGxvd2luZyB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHRoZSBDUkxGQ1JMRi4gCi0gICAgICBpbmRleCA9IGdldEZpcnN0Q1JMRkNSTEYoZnVsbE1lc3NhZ2UpOwotICAgIH0gICAgCQotCi0gICAgaWYgKGluZGV4IDwgMCkKLSAgICB7Ci0gICAgCS8vIElmIHdlIGNvdWxkbid0IGZpbmQgdGhlIGVuZCBvZiB0aGUgSFRUUCBoZWFkZXJzIG9yIHRoZSBzdGFydCBvZiB0aGUgbWVzc2FnZSwgdGhlbiBzaG93IGVycm9yCi0gICAgICBsb2dFcnJvcigKLSAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBtZXNzYWdlIHRvIGdldCBjb250ZW50LiAgRnVsbCBtZXNzYWdlOiAiCi0gICAgICAgICAgKyBmdWxsTWVzc2FnZSk7Ci0gICAgICBtZXNzYWdlID0KLSAgICAgICAgIngtV1NJLVRlc3QtVG9vbC1FcnJvcjogQ291bGRuJ3QgZmluZCBtZXNzYWdlIGNvbnRlbnQuICBGdWxsIG1lc3NhZ2U6IFsiCi0gICAgICAgICAgKyBmdWxsTWVzc2FnZQotICAgICAgICAgICsgIl0uIjsKLSAgICB9Ci0gICAgLy8gSWYgdGhlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoLCB0aGVuIHRoZXJlIGlzIG5vIG1lc3NhZ2UgY29udGVudAotICAgIGVsc2UgaWYgKGluZGV4ID49IGZ1bGxNZXNzYWdlLmxlbmd0aCgpKQotICAgIHsKLSAgICAgIG1lc3NhZ2UgPSAiIjsKLSAgICB9Ci0KLSAgICAvLyBFbHNlIGdldCB0aGUgbWVzc2FnZSBjb250ZW50Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1lc3NhZ2UgPSBmdWxsTWVzc2FnZS5zdWJzdHJpbmcoaW5kZXgpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBTT0FQIG1lc3NhZ2UKLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotIAotICAvKioKLSAgICogR2V0IEhUVFAgaGVhZGVycyBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKiBAcGFyYW0gZnVsbE1lc3NhZ2UgIGEgbWVzc2FnZS4KLSAgICogQHJldHVybiBIVFRQIGhlYWRlcnMgZnJvbSBhIGZ1bGwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldEhUVFBIZWFkZXJzKGJ5dGVbXSBmdWxsTWVzc2FnZSkKLSAgewotICAgIC8vU3RyaW5nIGh0dHBIZWFkZXJzID0gbnVsbDsKLSAgICBpbnQgaW5kZXggPSBnZXRGaXJzdENSTEZDUkxGKGZ1bGxNZXNzYWdlLCAwKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgewotICAgICAgbG9nRXJyb3IoCi0gICAgICAgICJVbmFibGUgdG8gcGFyc2UgSFRUUCBtZXNzYWdlIHRvIGZpbmQgaGVhZGVycy4gIEZ1bGwgbWVzc2FnZTogIgotICAgICAgICAgICsgZnVsbE1lc3NhZ2UpOwotICAgICAgcmV0dXJuICgieC1XU0ktVGVzdC1Ub29sLUVycm9yOiBDb3VsZG4ndCBmaW5kIGhlYWRlcnMuICBGdWxsIG1lc3NhZ2U6IFsiCi0gICAgICAgICsgZnVsbE1lc3NhZ2UgKyAiXS4iKS5nZXRCeXRlcygpOwotICAgIH0KLQotICAgIC8vIFJldHVybiBIVFRQIGhlYWRlcnMKLQlieXRlW10gYiA9IG5ldyBieXRlW2luZGV4XTsKLQlTeXN0ZW0uYXJyYXljb3B5KGZ1bGxNZXNzYWdlLCAwLCBiLCAwLCBpbmRleCk7Ci0KLSAgICByZXR1cm4gYjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgSFRUUCBoZWFkZXJzIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmdWxsTWVzc2FnZSAgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIEhUVFAgaGVhZGVycyBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SFRUUEhlYWRlcnNBc1N0cmluZyhieXRlW10gZnVsbE1lc3NhZ2UsIFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIC8vU3RyaW5nIGh0dHBIZWFkZXJzID0gbnVsbDsKLSAgICBpbnQgaW5kZXggPSBnZXRGaXJzdENSTEZDUkxGKGZ1bGxNZXNzYWdlLCAwKTsKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgewotICAgICAgbG9nRXJyb3IoCi0gICAgICAgICJVbmFibGUgdG8gcGFyc2UgSFRUUCBtZXNzYWdlIHRvIGZpbmQgaGVhZGVycy4gIEZ1bGwgbWVzc2FnZTogIgotICAgICAgICAgICsgZnVsbE1lc3NhZ2UpOwotICAgICAgcmV0dXJuICJ4LVdTSS1UZXN0LVRvb2wtRXJyb3I6IENvdWxkbid0IGZpbmQgaGVhZGVycy4gIEZ1bGwgbWVzc2FnZTogWyIKLSAgICAgICAgKyBmdWxsTWVzc2FnZSArICJdLiI7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIEhUVFAgaGVhZGVycwotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nKGZ1bGxNZXNzYWdlLCAwLCBpbmRleCwgZW5jb2RpbmcpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgICAgbG9nRXJyb3IoCi0gICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIEVuY29kaW5nOiAiICsgZW5jb2RpbmcgKyAiLiAgRnVsbCBtZXNzYWdlOiAiCi0gICAgICAgICAgICAgICAgICArIGZ1bGxNZXNzYWdlKTsKLSAgICAgICAgICAgICAgcmV0dXJuICJ4LVdTSS1UZXN0LVRvb2wtRXJyb3I6IFVuc3VwcG9ydGVkIEVuY29kaW5nIFwiIiArIGVuY29kaW5nICsgIlwiLiAgRnVsbCBtZXNzYWdlOiBbIgotICAgICAgICAgICAgICAgICsgZnVsbE1lc3NhZ2UgKyAiXS4iOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgU09BUCBtZXNzYWdlIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmdWxsTWVzc2FnZSAgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIFNPQVAgbWVzc2FnZSBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudEFzU3RyaW5nKGJ5dGVbXSBtZXNzYWdlKQotICB7Ci0gIAlTdHJpbmcgY29udGVudCA9ICIiOwotICAgIC8vU3RyaW5nIGh0dHBIZWFkZXJzID0gbnVsbDsKLSAgICBpbnQgaW5kZXggPSBnZXRGaXJzdENSTEZDUkxGKG1lc3NhZ2UsIDApOwotCi0gICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCB0aGUgZW5kIG9mIHRoZSBIVFRQIGhlYWRlcnMgb3IgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlLCB0aGVuIHNob3cgZXJyb3IKLSAgICBpZiAoaW5kZXggPCAwKQotICAgIHsKLSAgICAgIGxvZ0Vycm9yKAotICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIG1lc3NhZ2UgdG8gZ2V0IGNvbnRlbnQuICBGdWxsIG1lc3NhZ2U6ICIKLSAgICAgICAgICArIG1lc3NhZ2UpOwotICAgICAgY29udGVudCA9Ci0gICAgICAgICJ4LVdTSS1UZXN0LVRvb2wtRXJyb3I6IENvdWxkbid0IGZpbmQgbWVzc2FnZSBjb250ZW50LiAgRnVsbCBtZXNzYWdlOiBbIgotICAgICAgICAgICsgbWVzc2FnZS50b1N0cmluZygpCi0gICAgICAgICAgKyAiXS4iOwotICAgIH0KLQotICAgIC8vIEVsc2UgZ2V0IHRoZSBtZXNzYWdlIGNvbnRlbnQKLSAgICBlbHNlIGlmIChpbmRleCA8IG1lc3NhZ2UubGVuZ3RoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBjb250ZW50ID0gbmV3IFN0cmluZyhtZXNzYWdlLCBpbmRleCwgbWVzc2FnZS5sZW5ndGggLSBpbmRleCk7Ci0gICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgCWxvZ0Vycm9yKAotICAgICAgCSAgICAgICAgIlVuYWJsZSB0byBwYXJzZSBtZXNzYWdlIHRvIGdldCBjb250ZW50LiAgRnVsbCBtZXNzYWdlOiAiCi0gICAgICAJICAgICAgICAgICsgbWVzc2FnZSk7Ci0gICAgICAJY29udGVudCA9Ci0gICAgICAJICAgICAgICAieC1XU0ktVGVzdC1Ub29sLUVycm9yOiBDb3VsZG4ndCBmaW5kIG1lc3NhZ2UgY29udGVudC4gIEZ1bGwgbWVzc2FnZTogWyIKLSAgICAgIAkgICAgICAgICAgKyBtZXNzYWdlLnRvU3RyaW5nKCkKLSAgICAgIAkgICAgICAgICAgKyAiXS4iOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBTT0FQIG1lc3NhZ2UKLSAgICByZXR1cm4gY29udGVudDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgU09BUCBtZXNzYWdlIGZyb20gYSBmdWxsIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBmdWxsTWVzc2FnZSAgYSBtZXNzYWdlLgotICAgKiBAcmV0dXJuIFNPQVAgbWVzc2FnZSBmcm9tIGEgZnVsbCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Q29udGVudChieXRlW10gbWVzc2FnZSkKLSAgewotICAgIGJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGUgWzBdOwotCi0gICAgLy9TdHJpbmcgaHR0cEhlYWRlcnMgPSBudWxsOwotICAgIGludCBpbmRleCA9IGdldEZpcnN0Q1JMRkNSTEYobWVzc2FnZSwgMCk7Ci0gCi0gICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCB0aGUgZW5kIG9mIHRoZSBIVFRQIGhlYWRlcnMgb3IgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlLCB0aGVuIHNob3cgZXJyb3IKLSAgICBpZiAoaW5kZXggPCAwKQotICAgIHsKLSAgICAgIGxvZ0Vycm9yKAotICAgICAgICAiVW5hYmxlIHRvIHBhcnNlIG1lc3NhZ2UgdG8gZ2V0IGNvbnRlbnQuICBGdWxsIG1lc3NhZ2U6ICIKLSAgICAgICAgICArIG1lc3NhZ2UpOwotICAgICAgbWVzc2FnZSA9Ci0gICAgICAgICgieC1XU0ktVGVzdC1Ub29sLUVycm9yOiBDb3VsZG4ndCBmaW5kIG1lc3NhZ2UgY29udGVudC4gIEZ1bGwgbWVzc2FnZTogWyIKLSAgICAgICAgICArIG1lc3NhZ2UudG9TdHJpbmcoKQotICAgICAgICAgICsgIl0uIikuZ2V0Qnl0ZXMoKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGgsIHRoZW4gdGhlcmUgaXMgbm8gbWVzc2FnZSBjb250ZW50Ci0gICAgLy9lbHNlIGlmIChpbmRleCA+PSBmdWxsTWVzc2FnZS5sZW5ndGgoKSkKLSAgICAvL3sKLSAgICAvLyAgbWVzc2FnZSA9ICIiOwotICAgIC8vfQotCi0gICAgLy8gRWxzZSBnZXQgdGhlIG1lc3NhZ2UgY29udGVudAotICAgIGVsc2UgaWYgKGluZGV4IDwgbWVzc2FnZS5sZW5ndGgpCi0gICAgewotICAgIAlieXRlW10gYiA9IG5ldyBieXRlW21lc3NhZ2UubGVuZ3RoIC0gaW5kZXhdOwotICAgIAlTeXN0ZW0uYXJyYXljb3B5KG1lc3NhZ2UsIGluZGV4LCBiLCAwLCBtZXNzYWdlLmxlbmd0aCAtIGluZGV4KTsKLQotICAgICAgICBjb250ZW50ID0gYjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gU09BUCBtZXNzYWdlCi0gICAgcmV0dXJuIGNvbnRlbnQ7Ci0gIH0KLQotICAKLSAgLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbG9jYXRpb24gb2YgYSBDUkxGLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRGaXJzdENSTEYoYnl0ZVtdIGJ1ZmZlciwgaW50IGluZGV4KSAKLQl7Ci0JCWludCBzaXplID0gYnVmZmVyLmxlbmd0aDsKLQkJaW50IGkgPSBpbmRleDsKLQkJd2hpbGUgKGkgPCBzaXplIC0gMSkgewotCQkJaWYgKGJ1ZmZlcltpXSA9PSBDUiAmJiBidWZmZXJbaSsxXSA9PSBMRikKLQkJCQlyZXR1cm4gaTsKLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbG9jYXRpb24gb2YgYSBDUkxGIGZvbGxvd2VkIGltZWRpYXRlbHkgYnkgYW5vdGhlciBDUkxGLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRGaXJzdENSTEZDUkxGKGJ5dGVbXSBidWZmZXIsIGludCBpbmRleCkgCi0JewotCQlpbnQgc2l6ZSA9IGJ1ZmZlci5sZW5ndGg7Ci0JCWludCBpID0gaW5kZXg7Ci0JCXdoaWxlIChpIDwgc2l6ZSAtIDMpIAotCQl7Ci0JCSAgaWYgKGJ1ZmZlcltpXSA9PSBDUiAmJiBidWZmZXJbaSsxXSA9PSBMRiAmJiBidWZmZXJbaSsyXSA9PSBDUikKLQkJICB7Ci0JCQlpZiAoYnVmZmVyW2krM10gPT0gTEYpCi0JCQl7Ci0JCQkgIHJldHVybiBpKzQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkgIGludCBqID0gaSArIDM7Ci0JCQkgIHdoaWxlIChqIDwgYnVmZmVyLmxlbmd0aCAmJiBidWZmZXJbal0gPT0gQ1IpCi0JCQkgIHsKLQkJCQlqKys7Ci0JCQkgIH0KLQkJCSAgaWYgKGogPCBidWZmZXIubGVuZ3RoICYmIGJ1ZmZlcltqXSA9PSBMRikKLQkJCSAgewotCQkJICAJcmV0dXJuIGogKyAxOwotCQkJICB9Ci0JCQl9Ci0JCSAgfQotCQkgIGkrKzsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbG9jYXRpb24gb2YgYSBDUkxGIGZvbGxvd2VkIGltZWRpYXRlbHkgYnkgYW5vdGhlciBDUkxGLgotCSAqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRGaXJzdENSTEZDUkxGKFN0cmluZyBidWZmZXIpIAotCXsKLQkJaW50IGluZGV4ID0gYnVmZmVyLmluZGV4T2YoIlxyXG5cciIpOwotCQlpZiAoaW5kZXggIT0gLTEpCi0JCXsKLQkJICBpbnQgaSA9IGluZGV4ICszOwotCQkgIHdoaWxlIChpIDwgYnVmZmVyLmxlbmd0aCgpICYmIGJ1ZmZlci5zdGFydHNXaXRoKCJcciIsIGkpKQotCQkgICAgIGkrKzsKLQkJCi0JCSAgaWYgKGkgPCBidWZmZXIubGVuZ3RoKCkgJiYgYnVmZmVyLnN0YXJ0c1dpdGgoIlxuIiwgaSkpCi0JCQlyZXR1cm4gaSsxOwotCQkgIGVsc2UKLQkJCXJldHVybiBnZXRGaXJzdENSTEZDUkxGKGJ1ZmZlci5zdWJzdHJpbmcoaW5kZXggKyAzKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JfQotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBpbmRpY2VzIHdoaWNoIG1hcmtzIHRoZSBzZXBhcmF0aW9uIG9mIHBhcnRzLgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gZ2V0Qm91bmRhcnlJbmRpY2VzKGJ5dGVbXSBtZXNzYWdlLCBTdHJpbmcgYm91bmRhcnlTdHIpCi0JewotCSAgaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbMjU2XTsKLQkgIGludCBpbmRpY2VzSW5kZXggPSAwOwotCSAgdHJ5Ci0JICB7Ci0JICAgIGJ5dGVbXSBib3VuZGFyeSA9ICgiXHJcbi0tIiArIGJvdW5kYXJ5U3RyKS5nZXRCeXRlcygiVVMtQVNDSUkiKTsKLQotCSAgICBpbnQgaW5kZXggPSAwOwotCSAgICBpbnQgc3RhcnQgPSAwOwotCSAgICBpbnQgZW5kID0gbWVzc2FnZS5sZW5ndGg7Ci0JICAgIHdoaWxlIChpbmRleCAhPSAtMSkKLQkgICAgewotCSAgICAgIGluZGV4ID0gaW5kZXhPZihtZXNzYWdlLCBib3VuZGFyeSwgc3RhcnQpOwotCSAgICAgIAotCSAgICAgIGlmIChpbmRleCAhPSAtMSkgCi0JICAgICAgewotCQkgICAgc3RhcnQgPSBpbmRleCArIGJvdW5kYXJ5Lmxlbmd0aDsKLQkgICAgCWluZGljZXNbaW5kaWNlc0luZGV4XSA9IGluZGV4OwotCSAgICAJaW5kaWNlc0luZGV4Kys7Ci0JICAgICAgfQotCSAgICB9Ci0gICAgICAJaW50W10gYiA9IG5ldyBpbnRbaW5kaWNlc0luZGV4XTsKLSAgICAJU3lzdGVtLmFycmF5Y29weShpbmRpY2VzLCAwLCBiLCAwLCBpbmRpY2VzSW5kZXgpOwotICAgIAlpbmRpY2VzID0gYjsKLQkgIH0KLQkgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgIHt9Ci0JICByZXR1cm4gaW5kaWNlczsKLQl9Ci0gCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2Yga2V5IGluIHRoZSBidWZmZXIuCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihieXRlW10gYnVmZmVyLCBieXRlW10ga2V5LCBpbnQgc3RhcnQpCi0JewotCQlpbnQgYnVmZmVyTGVuID0gYnVmZmVyLmxlbmd0aDsKLQkJaW50IGtleUxlbiA9IGtleS5sZW5ndGg7Ci0JCWludCBpLGosayA9IDA7Ci0JCQotCQlpZiAoa2V5TGVuID4gYnVmZmVyTGVuIC0gc3RhcnQpCi0JCXsKLQkJCXJldHVybiAtMTsKLQkJfQotCQotCQlmb3IgKGsgPSBzdGFydCArIGtleUxlbiAtIDE7IGsgPCBidWZmZXJMZW47IGsrKykKLQkJewotICAgICAgICAgICBmb3IgKGogPSBrZXlMZW4gLSAxLCBpID0gazsgKGogPj0gMCkgJiYgKGJ1ZmZlcltpXSA9PSBrZXlbal0pOyBqLS0pIAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICBpZiAoaiA9PSAoLTEpKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gaSArIDE7Ci0gICAgICAgICAgIH0KLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0JLyoqCi0gICAqIEdldCBjb250ZW50cyBvZiBhIHJlc291cmNlIGFuZCByZXR1cm4gYXMgYSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIEBwYXJhbSByZXNvdXJjZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGdldCBhbmQgcmV0dXJuIGFzCi0gICAqICAgICAgICAgICAgICAgICAgICAgIGFuIGlucHV0IHN0cmVhbS4KLSAgICogQHJldHVybiBjb250ZW50cyBvZiBhIHJlc291cmNlIGFzIGFuIGlucHV0IHN0cmVhbS4KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgcmVzb3VyY2UgY291bGQgbm90IGJlIGxvY2F0ZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyByZXNvdXJjZU5hbWUpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0KLSAgICAvLyBJZiByZXNvdXJjZSByZWZlcmVuY2UgaXMgYSBVUkwsIHRoZW4gaW5wdXQgc3RyZWFtIGZyb20gVVJMCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBVUkwKLSAgICAgIFVSTCB1cmxSZXNvdXJjZSA9IG5ldyBVUkwocmVzb3VyY2VOYW1lKTsKLQotICAgICAgLy8gSWYgc3VjY2Vzc2Z1bCwgdGhlbiBnZXQgVVJMIGlucHV0IHN0cmVhbQotICAgICAgaXMgPSBnZXRJbnB1dFN0cmVhbSh1cmxSZXNvdXJjZSk7Ci0gICAgfQotCi0gICAgLy8gRWxzZSB0cnkgdG8gcmVhZCByZXNvdXJjZSBkaXJlY3RseQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKQotICAgIHsKLSAgICAgIGJvb2xlYW4gYlRyeUNsYXNzTG9hZGVyID0gZmFsc2U7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBPcGVuIGZpbGUgaW5wdXQgc3RyZWFtCi0gICAgICAgIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShyZXNvdXJjZU5hbWUpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkKLSAgICAgIHsKLSAgICAgICAgLy8gU2V0IHRyeSBjbGFzcyBsb2FkZXIgZmxhZwotICAgICAgICBiVHJ5Q2xhc3NMb2FkZXIgPSB0cnVlOwotICAgICAgfQotICAgICAgY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKQotICAgICAgewotICAgICAgICAvLyBTZXQgdHJ5IGNsYXNzIGxvYWRlciBmbGFnCi0gICAgICAgIGJUcnlDbGFzc0xvYWRlciA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIC8vIERFQlVHOgotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiBpbiBnZXRJbnB1dFN0cmVhbSA6IiArIGUudG9TdHJpbmcoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRyeSBjbGFzcyBsb2FkZXIsIHRoZW4gdXNlIGl0IHRvIGdldCBpbnB1dCBzdHJlYW0KLSAgICAgIGlmIChiVHJ5Q2xhc3NMb2FkZXIpCi0gICAgICB7Ci0gICAgICAgIC8vIFVzZSBjbGFzcyBsb2FkZXIgdG8gbG9hZCByZXNvdXJjZQotICAgICAgICBpcyA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgaW5wdXQgc3RyZWFtIGlzIG51bGwsIHRoZW4gdGhyb3cgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgaWYgKGlzID09IG51bGwpCi0gICAgewotICAgICAgLy90cnkgdGhpcwotICAgICAgaXMgPQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0oCi0gICAgICAgICAgcmVzb3VyY2VOYW1lKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgaW5wdXQgc3RyZWFtIGlzIG51bGwsIHRoZW4gdGhyb3cgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gICAgaWYgKGlzID09IG51bGwpCi0gICAgewotICAgICAgLy90cnkgdGhpcwotICAgICAgVVJMIGFVUkwgPQotICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlKAotICAgICAgICAgIHJlc291cmNlTmFtZSk7Ci0gICAgICBpZiAoYVVSTCAhPSBudWxsKQotICAgICAgICBpcyA9IGdldElucHV0U3RyZWFtKGFVUkwpOwotICAgIH0KLQotICAgIGlmIChpcyA9PSBudWxsKQotICAgICAgLy8gVGhyb3cgZXhlY3B0aW9uCi0gICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKAotICAgICAgICAiQ291bGQgbm90IGxvY2F0ZSByZXNvdXJjZSBmaWxlOiAiICsgcmVzb3VyY2VOYW1lKTsKLQotICAgIC8vIFJldHVybiBpbnB1dCBzdHJlYW0KLSAgICByZXR1cm4gaXM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBpbnB1dCBzdHJlYW0gZnJvbSBhIFVSTC4KLSAgICogQHBhcmFtIHVybEZpbGUgdGhlIFVSTCB0byBnZXQgdGhlIGlucHV0IHN0cmVhbSBmcm9tLgotICAgKiBAcmV0dXJuIHRoZSBpbnB1dCBzdHJlYW0gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gVVJMLgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGF0dGVtcHQgdG8gb3BlbiB0aGUgZmlsZSBkZW5vdGVkIGJ5IFVSTCBoYXMgZmFpbGVkLgotICAgKiBAdGhyb3dzIENvbm5lY3RFeGNlcHRpb24gaWYgdHJvdWJsZSBjb25uZWN0aW5nIHRvIFVSTC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oVVJMIHVybEZpbGUpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBDb25uZWN0RXhjZXB0aW9uCi0gIHsKLSAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0KLSAgICAvLyBBREQ6IGhvdyBhcmUgVVJMcyB0aGF0IGFyZSBwYXNzd29yZCBwcm90ZWN0ZWQgaGFuZGxlZD8/Pz8KLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIE9wZW4gZmlsZSBpbnB1dCBzdHJlYW0KLSAgICAgIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0odXJsRmlsZS5vcGVuU3RyZWFtKCkpOwotICAgIH0KLQotICAgIGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gUmUtdGhyb3cgdGhpcyBleGNwZXRpb24gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgICB0aHJvdyBuZXcgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbigKLSAgICAgICAgIkNvdWxkIG5vdCBjb25uZWN0IHRvIFVSTDogIiArIHVybEZpbGUudG9FeHRlcm5hbEZvcm0oKSArICIuIik7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGlucHV0IHN0cmVhbQotICAgIHJldHVybiBpczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgY29udGVudHMgb2YgYSByZXNvdXJjZSBhbmQgcmV0dXJuIGFzIGEgaW5wdXQgc3RyZWFtLgotICAgKiBAcGFyYW0gZmlsZUxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4KLSAgICogQHJldHVybiBjb250ZW50cyBvZiBhIHJlc291cmNlIGFzIGEgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVFeGlzdHMoU3RyaW5nIGZpbGVMb2NhdGlvbikKLSAgewotICAgIGJvb2xlYW4gZmlsZUV4aXN0cyA9IGZhbHNlOwotCi0gICAgLy8gSWYgcmVzb3VyY2UgcmVmZXJlbmNlIGlzIGEgVVJMLCB0aGVuIGlucHV0IHN0cmVhbSBmcm9tIFVSTAotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFRyeSB0byBjcmVhdGUgVVJMCi0gICAgICBVUkwgdXJsID0gbmV3IFVSTChmaWxlTG9jYXRpb24pOwotCi0gICAgICAvLyBJZiBzdWNjZXNzZnVsLCB0aGVuIHRyeSB0byBvcGVuIGNvbm5lY3Rpb24KLSAgICAgIElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLQotICAgICAgZmlsZUV4aXN0cyA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gRWxzZSB0cnkgdG8gcmVhZCByZXNvdXJjZSBkaXJlY3RseQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTG9jYXRpb24pOwotCi0gICAgICAgIGZpbGVFeGlzdHMgPSBmaWxlLmV4aXN0cygpOwotICAgICAgfQotCi0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUyKQotICAgICAgewotICAgICAgICBmaWxlRXhpc3RzID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKQotICAgIHsKLSAgICAgIGZpbGVFeGlzdHMgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZmlsZUV4aXN0cyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIFJldHVybiBmaWxlIGV4aXN0cyBpbmRpY2F0b3IKLSAgICByZXR1cm4gZmlsZUV4aXN0czsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgbG9jYWwgaG9zdCBuYW1lLgotICAgKiBAcmV0dXJuIHRoZSBsb2NhbCBob3N0IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbEhvc3ROYW1lKCkKLSAgewotICAgIFN0cmluZyBzTG9jYWxIb3N0TmFtZTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIEdldCBsb2NhbCBob3N0IG5hbWUKLSAgICAgIHNMb2NhbEhvc3ROYW1lID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0SG9zdE5hbWUoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsIGhvc3QgbmFtZQotICAgICAgc0xvY2FsSG9zdE5hbWUgPSAiMTI3LjAuMC4xIjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gbG9jYWwgaG9zdCBuYW1lCi0gICAgcmV0dXJuIHNMb2NhbEhvc3ROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIEJ1aWxkIGEgVVJMIHN0cmluZyBmcm9tIGhvc3RuYW1lLCBwb3J0IGFuZCBVUk4uCi0gICAqCi0gICAqIEBwYXJhbSBob3N0bmFtZSB0aGUgaG9zdG5hbWUuCi0gICAqIEBwYXJhbSBwb3J0IHRoZSBwb3J0LgotICAgKiBAcGFyYW0gdXJuIHRoZSBVUk4uCi0gICAqIEByZXR1cm4gZm9ybWF0dGVkIFVSTCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRVUkwoU3RyaW5nIGhvc3RuYW1lLCBTdHJpbmcgcG9ydCwgU3RyaW5nIHVybikKLSAgewotICAgIC8vIEJ1aWxkIFVSTgotICAgIFN0cmluZyBmb3JtYXRVUk4gPSB1cm47Ci0KLSAgICAvLyBJZiBVUk4gZG9lc24ndCBzdGFydCB3aXRoICIvIiwgdGhlbiBhZGQgaXQKLSAgICBpZiAoIShmb3JtYXRVUk4uc3RhcnRzV2l0aCgiLyIpKSkKLSAgICB7Ci0gICAgICAvLyBBZGQgIi8iIHRvIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nCi0gICAgICBmb3JtYXRVUk4gPSAiLyIgKyB1cm47Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIFVSTCBzdHJpbmcKLSAgICByZXR1cm4gImh0dHA6Ly8iICsgaG9zdG5hbWUgKyAiOiIgKyBwb3J0ICsgZm9ybWF0VVJOOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSBhbGwgb2YgdGhlIG9jY3VyYW5jZXMgb2YgYSBzdHJpbmcKLSAgICogd2l0aCBhIHN1YnN0aXR1dGlvbiBzdHJpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBzVGV4dCBTdHJpbmcgdG8gdWRwYXRlLgotICAgKiBAcGFyYW0gc0ZpbmQgU3RyaW5nIHRvIGZpbmQuCi0gICAqIEBwYXJhbSBzUmVwbGFjZSBTdHJpbmcgdG8gdXNlIGZvciBzdWJzdGl0dXRpb24uCi0gICAqIEByZXR1cm4gdXBkYXRlZCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlU3RyaW5nKAotICAgIFN0cmluZyBzVGV4dCwKLSAgICBTdHJpbmcgc0ZpbmQsCi0gICAgU3RyaW5nIHNSZXBsYWNlKQotICB7Ci0gICAgaW50IGlQcmV2SW5kZXggPSAwOwotCi0gICAgaW50IGlGaW5kTGVuID0gc0ZpbmQubGVuZ3RoKCk7Ci0gICAgaW50IGlSZXBsYWNlTGVuID0gc1JlcGxhY2UubGVuZ3RoKCk7Ci0KLSAgICBTdHJpbmcgc1VwZGF0ZWRUZXh0ID0gc1RleHQ7Ci0KLSAgICAvLyBSZXBsYWNlIGFsbCBvY2N1cmFuY2VzIG9mIHRoZSBmaW5kIHN0cmluZwotICAgIGZvciAoaW50IGlJbmRleCA9IHNVcGRhdGVkVGV4dC5pbmRleE9mKHNGaW5kKTsKLSAgICAgIGlJbmRleCA8IChzVXBkYXRlZFRleHQubGVuZ3RoKCkgLSAxKSAmJiBpSW5kZXggIT0gLTE7Ci0gICAgICBpSW5kZXggPSBzVXBkYXRlZFRleHQuaW5kZXhPZihzRmluZCwgaVByZXZJbmRleCArIGlSZXBsYWNlTGVuKSkKLSAgICB7Ci0gICAgICAvLyBTZXQgdXBkYXRlZCB0ZXh0IGZyb20gdGhlIGZyb250IHBvcnRpb24gKyByZXBsYWNlbWVudCB0ZXh0ICsgYmFjayBwb3J0aW9uCi0gICAgICBzVXBkYXRlZFRleHQgPQotICAgICAgICBzVXBkYXRlZFRleHQuc3Vic3RyaW5nKDAsIGlJbmRleCkKLSAgICAgICAgICArIHNSZXBsYWNlCi0gICAgICAgICAgKyBzVXBkYXRlZFRleHQuc3Vic3RyaW5nKGlJbmRleCArIGlGaW5kTGVuKTsKLQotICAgICAgLy8gU2V0IHRoZSBwcmV2aW91cyBpbmRleCBmaWVsZAotICAgICAgaVByZXZJbmRleCA9IGlJbmRleDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gdXBkYXRlZCB0ZXh0IHN0cmluZwotICAgIHJldHVybiBzVXBkYXRlZFRleHQ7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydCBzdHJpbmcgdG8gaGV4IHN0cmluZy4KLSAgICogQHBhcmFtIGRhdGEgIGEgU3RyaW5nIG9iamVjdC4KLSAgICogQHJldHVybiBoZXggc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9IZXhTdHJpbmcoU3RyaW5nIGRhdGEpCi0gIHsKLSAgICBjaGFyW10gSEVYX0NIQVJTID0KLSAgICAgIHsKLSAgICAgICAgJzAnLAotICAgICAgICAnMScsCi0gICAgICAgICcyJywKLSAgICAgICAgJzMnLAotICAgICAgICAnNCcsCi0gICAgICAgICc1JywKLSAgICAgICAgJzYnLAotICAgICAgICAnNycsCi0gICAgICAgICc4JywKLSAgICAgICAgJzknLAotICAgICAgICAnQScsCi0gICAgICAgICdCJywKLSAgICAgICAgJ0MnLAotICAgICAgICAnRCcsCi0gICAgICAgICdFJywKLSAgICAgICAgJ0YnIH07Ci0KLSAgICAvLyBHZXQgc3RyaW5nIGFzIGJ5dGUgYXJyYXkKLSAgICBieXRlW10gYnl0ZURhdGEgPSBkYXRhLmdldEJ5dGVzKCk7Ci0KLSAgICAvLyBHZXQgbGVuZ3RoCi0gICAgaW50IGxlbmd0aCA9IGJ5dGVEYXRhLmxlbmd0aDsKLQotICAgIC8vIENyZWF0ZSBDaGFyIGJ1ZmZlcgotICAgIGNoYXJbXSBjaGFyQnVmZmVyID0gbmV3IGNoYXJbbGVuZ3RoICogMl07Ci0KLSAgICBpbnQgbmV4dDsKLSAgICBmb3IgKGludCBieXRlQ250ID0gMCwgY2hhckNudCA9IDA7IGJ5dGVDbnQgPCBsZW5ndGg7KQotICAgIHsKLSAgICAgIG5leHQgPSBieXRlRGF0YVtieXRlQ250KytdOwotICAgICAgY2hhckJ1ZmZlcltjaGFyQ250KytdID0gSEVYX0NIQVJTWyhuZXh0ID4+PiA0KSAmIDB4MEZdOwotICAgICAgY2hhckJ1ZmZlcltjaGFyQ250KytdID0gSEVYX0NIQVJTW25leHQgJiAweDBGXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFyQnVmZmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0IGJ5dGUgYnVmZmVyIHRvIGhleCBzdHJpbmcuCi0gICAqIEBwYXJhbSBkYXRhICBhIGJ5dGUgYXJyYXkuCi0gICAqIEByZXR1cm4gaGV4IHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSGV4U3RyaW5nKGJ5dGVbXSBieXRlRGF0YSkKLSAgewotICAgIGNoYXJbXSBIRVhfQ0hBUlMgPQotICAgICAgewotICAgICAgICAnMCcsCi0gICAgICAgICcxJywKLSAgICAgICAgJzInLAotICAgICAgICAnMycsCi0gICAgICAgICc0JywKLSAgICAgICAgJzUnLAotICAgICAgICAnNicsCi0gICAgICAgICc3JywKLSAgICAgICAgJzgnLAotICAgICAgICAnOScsCi0gICAgICAgICdBJywKLSAgICAgICAgJ0InLAotICAgICAgICAnQycsCi0gICAgICAgICdEJywKLSAgICAgICAgJ0UnLAotICAgICAgICAnRicgfTsKLQotCi0gICAgLy8gR2V0IGxlbmd0aAotICAgIGludCBsZW5ndGggPSBieXRlRGF0YS5sZW5ndGg7Ci0KLSAgICAvLyBDcmVhdGUgQ2hhciBidWZmZXIKLSAgICBjaGFyW10gY2hhckJ1ZmZlciA9IG5ldyBjaGFyW2xlbmd0aCAqIDJdOwotCi0gICAgaW50IG5leHQ7Ci0gICAgZm9yIChpbnQgYnl0ZUNudCA9IDAsIGNoYXJDbnQgPSAwOyBieXRlQ250IDwgbGVuZ3RoOykKLSAgICB7Ci0gICAgICBuZXh0ID0gYnl0ZURhdGFbYnl0ZUNudCsrXTsKLSAgICAgIGNoYXJCdWZmZXJbY2hhckNudCsrXSA9IEhFWF9DSEFSU1sobmV4dCA+Pj4gNCkgJiAweDBGXTsKLSAgICAgIGNoYXJCdWZmZXJbY2hhckNudCsrXSA9IEhFWF9DSEFSU1tuZXh0ICYgMHgwRl07Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hhckJ1ZmZlcik7Ci0gIH0KLQotICAvLyBJMThOOiAyMDAzLjAyLjI2IG1vZGlmaWVkIGJ5IEsuTmFrYWdvbWVAQmVhY29uSVQKLSAgLyoqCi0gICAqIEdldCBNSU1FIGNoYXJzZXQgZnJvbSBhIEhUVFAgaGVhZGVycy4KLSAgICogQHBhcmFtIGh0dHBIZWFkZXJzIFN0cmluZyBvZiBIVFRQIGhlYWRlci4KLSAgICogQHJldHVybiB0aGUgTUlNRSBjaGFyc2V0IHN0cmluZy4KLSAgICogQGF1dGhvciBLLk5ha2Fnb21lQEJlYWNvbklUIEphcGFuIFNJRyAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEhUVFBDaGFyc2V0KFN0cmluZyBodHRwSGVhZGVycykKLSAgewotICAgIFN0cmluZyBtaW1lQ2hhcnNldCA9IG51bGw7Ci0KLSAgICBtaW1lQ2hhcnNldCA9IGh0dHBIZWFkZXJzLnRvVXBwZXJDYXNlKCk7Ci0gICAgaW50W10gaW5kZXggPSB7IC0xLCAtMSwgLTEgfTsKLSAgICBpbnQgaW5kZXhTID0gbWltZUNoYXJzZXQuaW5kZXhPZigiQ0hBUlNFVCIpOwotICAgIGludCBpbmRleEUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICBpZiAoaW5kZXhTIDwgMTcpCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICBpbmRleFMgPSBtaW1lQ2hhcnNldC5pbmRleE9mKCI9IiwgaW5kZXhTICsgNyk7Ci0gICAgaWYgKGluZGV4UyA9PSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIGluZGV4UysrOwotICAgIGluZGV4WzBdID0gbWltZUNoYXJzZXQuaW5kZXhPZigiJyIsIGluZGV4Uyk7Ci0gICAgaW5kZXhbMV0gPSBtaW1lQ2hhcnNldC5pbmRleE9mKCJcclxuIiwgaW5kZXhTKTsKLSAgICBpbmRleFsyXSA9IG1pbWVDaGFyc2V0LmluZGV4T2YoIlwiIiwgaW5kZXhTKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaW5kZXhbaV0gIT0gLTEgJiBpbmRleEUgPiBpbmRleFtpXSkKLSAgICAgIHsKLSAgICAgICAgaW5kZXhFID0gaW5kZXhbaV07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGluZGV4RSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkKLSAgICB7Ci0gICAgICBtaW1lQ2hhcnNldCA9IGh0dHBIZWFkZXJzLnN1YnN0cmluZyhpbmRleFMsIGluZGV4RSk7Ci0gICAgICBtaW1lQ2hhcnNldC50cmltKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtaW1lQ2hhcnNldCA9ICIiOwotICAgIH0KLSAgICByZXR1cm4gbWltZUNoYXJzZXQ7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBpcyBhIHNpbXBsZSBTT0FQIG1lc3NhZ2Ugb3Igd2hldGhlciBpdCBpcyBhIFNPQVAgbWVzc2Fnd2Ugd2l0aCBhdHRhY2htZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc011bHRpcGFydFJlbGF0ZWRNZXNzYWdlKFN0cmluZyBodHRwSGVhZGVycykKLSAgewotICAJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICB0cnkgCi0gICAgewotICAgICAgLy8gY2hlY2sgaGVhZGVyIGZvciBtaW1lIHZlcnNpb24gYW5kIGJvdW5kYXJ5Ci0gICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlckF0dHJpYnV0ZShodHRwSGVhZGVycywgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFKTsKLSAgICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyB0aGVyZSBpcyBubyBjb250ZW50VHlwZSwgY2hlY2sgaWYgdGhlcmUgaXMgYSBib3VuZGFyeSBhdHRyaWJ1dGUKLSAgICAgICAgU3RyaW5nIGJvdW5kYXJ5ID0gVXRpbHMuZ2V0SHR0cEhlYWRlclN1YkF0dHJpYnV0ZShodHRwSGVhZGVycywgSFRUUENvbnN0YW50cy5IRUFERVJfQ09OVEVOVF9UWVBFLCAiYm91bmRhcnkiKTsKLSAgICAgICAgaWYgKChib3VuZGFyeSAhPSBudWxsKSAmJiAoIWJvdW5kYXJ5LmVxdWFscygiIikpKQotICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJtdWx0aXBhcnQvcmVsYXRlZCIpOwotICAgICAgfQotICAgIH0gCi0gICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotCXsgCi0gICAgCXJlc3VsdCA9IGZhbHNlOyAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0dHBIZWFkZXJBdHRyaWJ1dGUoU3RyaW5nIGh0dHBIZWFkZXJzLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgeyBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgCXRyeQotICAJewotICAgICByZXN1bHQgPSBIVFRQVXRpbHMuZ2V0SHR0cEhlYWRlckF0dHJpYnV0ZShodHRwSGVhZGVycywgYXR0cmlidXRlTmFtZSk7Ci0gIAl9Ci0gICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotCXsgCi0gICAgCXJlc3VsdCA9IG51bGw7IAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIdHRwSGVhZGVyU3ViQXR0cmlidXRlKFN0cmluZyBodHRwSGVhZGVycywgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBzdWJBdHRyaWJ1dGVOYW1lKQotICB7IFN0cmluZyByZXN1bHQgPSBudWxsOwotICAJdHJ5Ci0gIAl7Ci0gICAgIHJlc3VsdCA9IEhUVFBVdGlscy5nZXRIdHRwSGVhZGVyU3ViQXR0cmlidXRlKGh0dHBIZWFkZXJzLCBhdHRyaWJ1dGVOYW1lLCBzdWJBdHRyaWJ1dGVOYW1lKTsKLSAgCX0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0JeyAKLSAgICAJcmVzdWx0ID0gbnVsbDsgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1pbWVIZWFkZXJBdHRyaWJ1dGUoU3RyaW5nIG1pbWVIZWFkZXJzLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgeyBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgCXRyeQotICAJewotICAgICByZXN1bHQgPSBNSU1FVXRpbHMuZ2V0TWltZUhlYWRlckF0dHJpYnV0ZShtaW1lSGVhZGVycywgYXR0cmlidXRlTmFtZSk7Ci0gIAl9Ci0gICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotCXsgCi0gICAgCXJlc3VsdCA9IG51bGw7IAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotIH0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lSGVhZGVyU3ViQXR0cmlidXRlKFN0cmluZyBtaW1lSGVhZGVycywgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBzdWJBdHRyaWJ1dGVOYW1lKQotICB7IFN0cmluZyByZXN1bHQgPSBudWxsOwotICAJdHJ5Ci0gIAl7Ci0gICAgIHJlc3VsdCA9IE1JTUVVdGlscy5nZXRNaW1lSGVhZGVyU3ViQXR0cmlidXRlKG1pbWVIZWFkZXJzLCBhdHRyaWJ1dGVOYW1lLCBzdWJBdHRyaWJ1dGVOYW1lKTsKLSAgCX0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIGUpCi0JeyAKLSAgICAJcmVzdWx0ID0gbnVsbDsgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gfQotICAvLyBJMThOOiAyMDAzLjAyLjI2IG1vZGlmaWVkIGJ5IEsuTmFrYWdvbWVAQmVhY29uSVQKLSAgLyoqCi0gICAqIEdldCBYTUwgZW5jb2RpbmcgZnJvbSBhIFNPQVAgTWVzc2FnZXMuCi0gICAqIEBwYXJhbSBtZXNzYWdlICBTT0FQIE1lc3NhZ2UgU3RyaW5nLiAKLSAgICogQHJldHVybiBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgWE1MLgotICAgKiBAYXV0aG9yIEsuTmFrYWdvbWVAQmVhY29uSVQgSmFwYW4gU0lHIAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WE1MRW5jb2RpbmcoU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBTdHJpbmcgeG1sRGVmID0gbnVsbDsKLQotICAgIGludCBpbmRleFMgPSBtZXNzYWdlLmluZGV4T2YoIjw/eG1sIik7Ci0gICAgaW50IGluZGV4RSA9IC0xOwotICAgIGlmIChpbmRleFMgIT0gLTEpCi0gICAgewotICAgICAgaW5kZXhFID0gbWVzc2FnZS5pbmRleE9mKCI/PiIsIGluZGV4Uyk7Ci0gICAgICBpZiAoaW5kZXhFID4gaW5kZXhTKQotICAgICAgewotICAgICAgICB4bWxEZWYgPSBtZXNzYWdlLnN1YnN0cmluZyhpbmRleFMsIGluZGV4RSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHhtbERlZiAhPSBudWxsKQotICAgIHsKLSAgICAgIGluZGV4UyA9IHhtbERlZi5pbmRleE9mKCJlbmNvZGluZyIpOwotICAgICAgaWYgKGluZGV4UyA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgeG1sRGVmID0gIiI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHhtbERlZiA9IHhtbERlZi5zdWJzdHJpbmcoaW5kZXhTICsgOCk7Ci0gICAgICAgIHhtbERlZiA9IHhtbERlZi50cmltKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgaWYgKHhtbERlZi5sZW5ndGgoKSA+IDMpCi0gICAgewotICAgICAgaW5kZXhTID0geG1sRGVmLmluZGV4T2YoIj0iKTsKLSAgICAgIGlmIChpbmRleFMgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgeG1sRGVmID0geG1sRGVmLnN1YnN0cmluZygxKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh4bWxEZWYubGVuZ3RoKCkgPiAzKQotICAgIHsKLSAgICAgIFN0cmluZyBlbmQgPSAiXCIiOwotICAgICAgaW5kZXhTID0geG1sRGVmLmluZGV4T2YoZW5kKTsKLSAgICAgIGlmIChpbmRleFMgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgaW5kZXhTID0geG1sRGVmLmluZGV4T2YoKGVuZCA9ICInIikpOwotICAgICAgfQotICAgICAgaWYgKGluZGV4UyA9PSAwKQotICAgICAgewotICAgICAgICBpbmRleEUgPSB4bWxEZWYuaW5kZXhPZihlbmQsIDMpOwotICAgICAgICBpZiAoaW5kZXhFICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgeG1sRGVmID0geG1sRGVmLnN1YnN0cmluZygxLCBpbmRleEUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHhtbERlZiA9ICIiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHhtbERlZiA9ICIiOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4geG1sRGVmOwotICB9Ci0KLSAgLy8gSTE4TjogMjAwMy4wMi4yNiBtb2RpZmllZCBieSBLLk5ha2Fnb21lQEJlYWNvbklUCi0gIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGphdmFFbmNvZGluZ1Jlc291cmNlID0gbnVsbDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRU5DT0RJTkdfUkVTT1VSQ0UgPQotICAgICJvcmcud3NpLnRlc3QudXRpbC5KYXZhRW5jb2RpbmciOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FTkNPRElOR19ERUZBVUxUID0gIlVURi04IjsKLQotICAvLyBJMThOOiAyMDAzLjAyLjI2IG1vZGlmaWVkIGJ5IEsuTmFrYWdvbWVAQmVhY29uSVQKLSAgLyoqCi0gICAqIEdldCBKYXZhIFZNIHN1cHBvcnRlZCBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0gICAqIAotICAgKiBAcGFyYW0gbWltZUVuY29kaW5nICBzdHJpbmcgb2YgTUlNRShJQU5BKSBjaGFyYWN0ZXIgZW5jb2RpbmcuIAotICAgKiBAcmV0dXJuIHN0cmluZyBvZiBjaGFyYWN0ZXIgZW5jb2Rpbmcgc3VwcG9ydGVkIGJ5IEphdmEgVk0uCi0gICAqIEBhdXRob3IgSy5OYWthZ29tZUBCZWFjb25JVCBKYXBhbiBTSUcgCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKYXZhRW5jb2RpbmcoU3RyaW5nIG1pbWVFbmNvZGluZykKLSAgewotICAgIGlmIChtaW1lRW5jb2RpbmcgPT0gbnVsbCB8fCBtaW1lRW5jb2RpbmcubGVuZ3RoKCkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gSkFWQV9FTkNPRElOR19ERUZBVUxUOwotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAoamF2YUVuY29kaW5nUmVzb3VyY2UgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgamF2YUVuY29kaW5nUmVzb3VyY2UgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoSkFWQV9FTkNPRElOR19SRVNPVVJDRSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gamF2YUVuY29kaW5nUmVzb3VyY2UuZ2V0U3RyaW5nKG1pbWVFbmNvZGluZyk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICB7Ci0gICAgICByZXR1cm4gbWltZUVuY29kaW5nOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0IGFuIGFycmF5IHRvIGEgVmVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGFycmF5ICB0aGUgYXJyYXkgdG8gYmUgY29udmVydGVkIC4KLSAgICogQHJldHVybiBjb252ZXJ0ZWQgVmVjdG9yIChudWxsIGlmIGFycmF5IGlzIG51bGwsIGVtcHR5IGlmIGVtcHR5KS4KLSAgICogQGF1dGhvciBHcmFoYW0gVHVycmVsbCBJQk0KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVmVjdG9yIGFycmF5VG9WZWN0b3IoT2JqZWN0W10gYXJyYXkpCi0gIHsKLSAgICBpZiAoYXJyYXkgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcihhcnJheS5sZW5ndGgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICB2LmFkZChhcnJheVtpXSk7Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLSAgLyoqCi0gICAqIENoZWNrcyB0byBlbnN1cmUgdGhhdCB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uIAotICAgKiBkb2N1bWVudCBpcyBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSB0ZXN0IHRvb2xzLgotICAgKiBAcGFyYW0gcHJvZmlsZUFzc2VydGlvbnMgLSBhIHByb2ZpbGUgVEFELgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZlcnNpb24gb2YgdGhlIHByb2ZpbGUgdGVzdCBhc3NlcnRpb24KLSAgICogICAgICAgICBkb2N1ZW1lbnQgaXMgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgdGVzdCB0b29scy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUHJvZmlsZVRBRFZlcnNpb24oUHJvZmlsZUFzc2VydGlvbnMgcHJvZmlsZUFzc2VydGlvbnMpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0gICAgU3RyaW5nIG5hbWUgPSBwcm9maWxlQXNzZXJ0aW9ucy5nZXRUQUROYW1lKCk7Ci0gICAgU3RyaW5nIHZlcnNpb24gPSBwcm9maWxlQXNzZXJ0aW9ucy5nZXRUQURWZXJzaW9uKCk7Ci0KLSAgICBpZiAoV1NJQ29uc3RhbnRzLkJBU0lDX1BST0ZJTEVfVEFEX05BTUUuZXF1YWxzKG5hbWUpKQotICAgIHsKLSAgICAgIHJlc3VsdCA9Ci0gICAgICAgIGNoZWNrVmVyc2lvbk51bWJlcihXU0lDb25zdGFudHMuQkFTSUNfUFJPRklMRV9UQURfVkVSU0lPTiwgdmVyc2lvbik7Ci0gICAgfSBlbHNlIGlmIChXU0lDb25zdGFudHMuQkFTSUNfUFJPRklMRV8xXzFfVEFEX05BTUUuZXF1YWxzKG5hbWUpKQotICAgIHsgIAotICAgICAgcmVzdWx0ID0KLSAgICAgICAgY2hlY2tWZXJzaW9uTnVtYmVyKFdTSUNvbnN0YW50cy5CQVNJQ19QUk9GSUxFXzFfMV9UQURfVkVSU0lPTiwgdmVyc2lvbik7Ci0gICAgfSBlbHNlIGlmIChXU0lDb25zdGFudHMuU0lNUExFX1NPQVBfQklORElOR1NfUFJPRklMRV9UQURfTkFNRS5lcXVhbHMobmFtZSkpCi0gICAgewotICAgICAgcmVzdWx0ID0KLSAgICAgICAgY2hlY2tWZXJzaW9uTnVtYmVyKFdTSUNvbnN0YW50cy5TSU1QTEVfU09BUF9CSU5ESU5HU19QUk9GSUxFX1RBRF9WRVJTSU9OLCB2ZXJzaW9uKTsKLSAgICB9IGVsc2UgaWYgKFdTSUNvbnN0YW50cy5BVFRBQ0hNRU5UU19QUk9GSUxFX1RBRF9OQU1FLmVxdWFscyhuYW1lKSkKLSAgICB7Ci0gICAgICByZXN1bHQgPQotICAgICAgICBjaGVja1ZlcnNpb25OdW1iZXIoV1NJQ29uc3RhbnRzLkFUVEFDSE1FTlRTX1BST0ZJTEVfVEFEX1ZFUlNJT04sIHZlcnNpb24pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB0byBlbnN1cmUgdGhhdCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgYWN0dWFsIHByb2ZpbGUgdGVzdCBhc3NlcnRpb24gCi0gICAqIGRvY3VtZW50IGlzIHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHRlc3QgdG9vbHMuCi0gICAqIEBwYXJhbSBzdXBwb3J0ZWRWZXJzaW9uIC0gc3VwcG9ydGVkIHZlcnNpb24gbnVtYmVyIG9mIHByb2ZpbGUgVEFELgotICAgKiBAcGFyYW0gYWN0dWFsVmVyc2lvbiAgICAtIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBvZiBwcm9maWxlIFRBRC4gCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGFjdHVhbCBwcm9maWxlIHRlc3QgYXNzZXJ0aW9uCi0gICAqICAgICAgICAgZG9jdW1lbnQgaXMgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgdGVzdCB0b29scy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tWZXJzaW9uTnVtYmVyKAotICAgIFN0cmluZyBzdXBwb3J0ZWRWZXJzaW9uLAotICAgIFN0cmluZyBhY3R1YWxWZXJzaW9uKQotICB7Ci0gICAgYm9vbGVhbiB2YWxpZFZlcnNpb24gPSB0cnVlOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHN1cHBvcnRlZFZlcnNpb25Ub2tlbml6ZXIgPQotICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKHN1cHBvcnRlZFZlcnNpb24sICIuIik7Ci0gICAgICBTdHJpbmdUb2tlbml6ZXIgYWN0dWFsVmVyc2lvblRva2VuaXplciA9Ci0gICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoYWN0dWFsVmVyc2lvbiwgIi4iKTsKLQotICAgICAgd2hpbGUgKHN1cHBvcnRlZFZlcnNpb25Ub2tlbml6ZXIuaGFzTW9yZVRva2VucygpICYmIHZhbGlkVmVyc2lvbikKLSAgICAgIHsKLSAgICAgICAgaW50IHN1cHBvcnRlZFZlcnNpb25Ub2tlbiA9Ci0gICAgICAgICAgSW50ZWdlci5wYXJzZUludChzdXBwb3J0ZWRWZXJzaW9uVG9rZW5pemVyLm5leHRUb2tlbigpKTsKLSAgICAgICAgaWYgKGFjdHVhbFZlcnNpb25Ub2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGFjdHVhbFZlcnNpb25Ub2tlbiA9Ci0gICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGFjdHVhbFZlcnNpb25Ub2tlbml6ZXIubmV4dFRva2VuKCkpOwotICAgICAgICAgIGlmIChzdXBwb3J0ZWRWZXJzaW9uVG9rZW4gPiBhY3R1YWxWZXJzaW9uVG9rZW4pIGJyZWFrOwotICAgICAgICAgIGVsc2UgdmFsaWRWZXJzaW9uID0gKHN1cHBvcnRlZFZlcnNpb25Ub2tlbiA+PSBhY3R1YWxWZXJzaW9uVG9rZW4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB2YWxpZFZlcnNpb24gPSBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbGlkVmVyc2lvbjsKLSAgfQotICAKLSAgLyoqCi0gICAqIElkZW50aWZpZXMgdGhlIHJvb3QgcGFydCBpbiB0aGUgbGlzdCB1c2luZyB0aGUgInN0YXJ0IiBhdHRyaWJ1dGUuCi0gICAqIElmIHRoZSAic3RhcnQiIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdCB0aGVuIHRoZSBmaXJzdCBwYXJ0IGlzIGRlc2lnbmF0ZWQgdGhlIHJvb3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE1pbWVQYXJ0IGZpbmRSb290UGFydChTdHJpbmcgaHR0cEhlYWRlcnMsIENvbGxlY3Rpb24gcGFydHMpCi0gIHsKLSAgCU1pbWVQYXJ0IHJvb3QgPSBudWxsOwotICAgIFN0cmluZyBzdGFydCA9IFV0aWxzLmdldEh0dHBIZWFkZXJTdWJBdHRyaWJ1dGUoaHR0cEhlYWRlcnMsIEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwgInN0YXJ0Iik7Ci0gICAgaWYgKCFwYXJ0cy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZmlyc3QgcGFydCBpbiB0aGUgY29sbGVjdGlvbgotICAgICAgcm9vdCA9IChNaW1lUGFydClwYXJ0cy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAJCi0gICAgICBpZiAoKHN0YXJ0ICE9IG51bGwpICYmICghc3RhcnQuZXF1YWxzKCIiKSkpCi0gICAgICB7Ci0gICAgCUl0ZXJhdG9yIGkgPSBwYXJ0cy5pdGVyYXRvcigpOwotICAgIAlib29sZWFuIHJvb3ROb3RGb3VuZCA9IHRydWU7Ci0gICAgCXdoaWxlIChpLmhhc05leHQoKSAmJiByb290Tm90Rm91bmQpCi0gICAgCXsKLSAgICAJICBNaW1lUGFydCBwYXJ0ID0gKE1pbWVQYXJ0KWkubmV4dCgpOwotICAgIAkgIFN0cmluZyBoZWFkZXJzID0gcGFydC5nZXRIZWFkZXJzKCk7Ci0gICAgCSAgaWYgKGhlYWRlcnMgIT0gbnVsbCkKLSAgICAJICB7Ci0gICAgICAgICAgICBTdHJpbmcgY29udGVudElkID0gVXRpbHMuZ2V0TWltZUhlYWRlckF0dHJpYnV0ZShoZWFkZXJzLCBNSU1FQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX0lEKTsKLSAgICAgICAgICAgIGlmIChzdGFydC5lcXVhbHMoY29udGVudElkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcm9vdCA9IHBhcnQ7Ci0JCQkgIHJvb3ROb3RGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgIAkgIH0KLSAgICAJfQotICAgICAgfQotICAgIH0KLSAgCXJldHVybiByb290OwotICB9Ci0gIAotICAvKioKLSAgICogRGVjb2RlcyB0aGUgZ2l2ZW4gZW5jb2RlZCBzdHJpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGVCYXNlNjQoU3RyaW5nIHN0cikKLSAgewotICAJdHJ5Ci0gIAl7Ci0gICAgCXN1bi5taXNjLkJBU0U2NERlY29kZXIgZGVjb2RlciA9ICBuZXcgc3VuLm1pc2MuQkFTRTY0RGVjb2RlcigpOwotICAJICAgIHJldHVybiBkZWNvZGVyLmRlY29kZUJ1ZmZlcihzdHIpOwotICAJfQotICAJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAJewotICAJCXJldHVybiBuZXcgYnl0ZVswXTsKLSAgCX0KLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIHRoZSBnaXZlbiBieXRlIGFycmF5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQmFzZTY0KGJ5dGVbXSBidWZmZXIpCi0gIHsgICAgCi0gIAlzdW4ubWlzYy5CQVNFNjRFbmNvZGVyIGVuY29kZXIgPSAgbmV3IHN1bi5taXNjLkJBU0U2NEVuY29kZXIoKTsKLSAgCXJldHVybiBlbmNvZGVyLmVuY29kZUJ1ZmZlcihidWZmZXIpOyAgCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIE1pbWVQYXJ0cyBwYXJzZU11bHRpcGFydFJlbGF0ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgaHR0cEhlYWRlcnMsIFN0cmluZyBlbmNvZGluZykKLSAgewotICAJYnl0ZVtdIGJ1ZmZlciA9IG51bGw7Ci0gIAl0cnkKLQl7IAotICAJICBidWZmZXIgPSBtZXNzYWdlLmdldEJ5dGVzKGVuY29kaW5nKTsKLQl9Ci0gIAljYXRjaCAoRXhjZXB0aW9uIGUpCi0JewotICAJCXJldHVybiBudWxsOwotCX0KLSAgCXJldHVybiBwYXJzZU11bHRpcGFydFJlbGF0ZWRNZXNzYWdlKGJ1ZmZlciwgaHR0cEhlYWRlcnMsIGVuY29kaW5nKTsKLSAgfQotICBwdWJsaWMgc3RhdGljIE1pbWVQYXJ0cyBwYXJzZU11bHRpcGFydFJlbGF0ZWRNZXNzYWdlKGJ5dGVbXSBtZXNzYWdlLCBTdHJpbmcgaHR0cEhlYWRlcnMsIFN0cmluZyBlbmNvZGluZykKLSAgewotICAgIE1pbWVQYXJ0cyBtaW1lUGFydHMgPSBuZXcgTWltZVBhcnRzSW1wbCgpOwotICAgIFN0cmluZyBib3VuZGFyeSA9IFV0aWxzLmdldEh0dHBIZWFkZXJTdWJBdHRyaWJ1dGUoaHR0cEhlYWRlcnMsIEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwgImJvdW5kYXJ5Iik7Ci0gICAgQXJyYXlMaXN0IHBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIGlmIChib3VuZGFyeSA9PSBudWxsKQotICAgIHsKLSAgICAJLy8gYXNzdW1lIGl0IGlzIGEgc2ltcGxlIFNPQVAgbWVzc2FnZQotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBzdGFydCA9IFV0aWxzLmdldEh0dHBIZWFkZXJTdWJBdHRyaWJ1dGUoaHR0cEhlYWRlcnMsIEhUVFBDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRSwgInN0YXJ0Iik7Ci0gICAgICBpbnRbXSBpbmRpY2VzID0gVXRpbHMuZ2V0Qm91bmRhcnlJbmRpY2VzKG1lc3NhZ2UsIGJvdW5kYXJ5KTsKLSAgICAgIGJvb2xlYW4gcm9vdE5vdEZvdW5kID0gdHJ1ZTsKLSAgICAgIAotICAgICAgZm9yIChpbnQgaT0gaW5kaWNlcy5sZW5ndGggLSAyOyBpPj0wOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIHRyeQotICAgIAl7Ci0gICAgICAgICAgTWltZVBhcnQgcGFydCA9IG5ldyBNaW1lUGFydEltcGwoKTsKLSAgICAgICAgICBpbnQgaW5kZXggPSBVdGlscy5nZXRGaXJzdENSTEZDUkxGKG1lc3NhZ2UsIGluZGljZXNbaV0pOwotICAgICAgICAgIGlmICgoaW5kZXggPiBpbmRpY2VzW2ldKSAmJiAoaW5kZXggPCBpbmRpY2VzW2krMV0pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRoZSBib3VuZGFyeSBzdHJpbmcgJiBtaW1lIGhlYWRlcnMgKGluY2x1ZGUgdGhlIHRyYWlsaW5nIENSTEYgQ1JMRikKLSAgICAgICAgCVN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKG1lc3NhZ2UsIGluZGljZXNbaV0sIChpbmRleCAtIGluZGljZXNbaV0pLCAiVVMtQVNDSUkiKTsKLSAgICAgICAgCVN0cmluZyBkZWxpbWl0ZXIgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5pbmRleE9mKCJcclxuIiwgMikgKyAyKTsKLQotICAgICAgICAJaWYgKGkgPT0gaW5kaWNlcy5sZW5ndGggLTIpCi0gICAgICAgIAl7Ci0gICAgICAgIAkgIFN0cmluZyBlbmREZWxpbWl0ZXIgPSBuZXcgU3RyaW5nKG1lc3NhZ2UsIGluZGljZXNbaSArIDFdLCBtZXNzYWdlLmxlbmd0aCAtIGluZGljZXNbaSArIDFdLCAiVVMtQVNDSUkiKTsKLSAgICAgICAgCSAgaW50IGogPSBzdHIuaW5kZXhPZigiXHJcbiIsIDIpOwotICAgICAgICAJICBpZiAoaiAhPSAtMSkKLSAgICAgICAgCSAgICBlbmREZWxpbWl0ZXIgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5pbmRleE9mKCJcclxuIiwgMikgKyAyKTsKLSAgICAgICAgICAgICAgcGFydC5zZXRCb3VuZGFyeVN0cmluZ3MobmV3IFN0cmluZ1tde2RlbGltaXRlciwgZW5kRGVsaW1pdGVyfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAllbHNlCi0gICAgICAgIAkgIHBhcnQuc2V0Qm91bmRhcnlTdHJpbmdzKG5ldyBTdHJpbmdbXXtkZWxpbWl0ZXJ9KTsKLSAgICAgICAKLSAgICAgICAgCS8vIHRoZSBoZWFkZXJzCi0gICAgICAgIAlTdHJpbmcgaGVhZGVycyA9IHN0ci5zdWJzdHJpbmcoZGVsaW1pdGVyLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXJzLnN0YXJ0c1dpdGgoIlxyXG4iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAJICAvLyBubyBoZWFkZXJzIHByZXNlbnQKLSAgICAgICAgICAJICBwYXJ0LnNldEhlYWRlcnMoIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgIAkgIHBhcnQuc2V0SGVhZGVycyhoZWFkZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gdGhlIGNvbnRlbnQKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50SWQgPSBVdGlscy5nZXRNaW1lSGVhZGVyQXR0cmlidXRlKGhlYWRlcnMsIE1JTUVDb25zdGFudHMuSEVBREVSX0NPTlRFTlRfSUQpOwotICAgICAgICAgICAgaW50IHNpemUgPSBpbmRpY2VzW2krMV0gLSAoaW5kZXgpOwotICAgICAgICAgCWJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICAJICAgIFN5c3RlbS5hcnJheWNvcHkobWVzc2FnZSwgaW5kZXgsIGNvbnRlbnQsIDAsIHNpemUpOwotICAgICAgCSAgCi0gICAgICAgICAgICBpZiAoKHJvb3ROb3RGb3VuZCAmJiAoaSA9PSAwKSkgfHwKLSAgICAgICAgICAgIAkoKHN0YXJ0ICE9IG51bGwpICYmICghc3RhcnQuZXF1YWxzKCIiKSkgJiYgKHN0YXJ0LmVxdWFscyhjb250ZW50SWQpKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHJvb3QgcGFydCAtLSBkbyBub3QgZW5jb2RlCi0gICAgICAgICAgICAgIHBhcnQuc2V0Q29udGVudChuZXcgU3RyaW5nKGNvbnRlbnQsIGVuY29kaW5nKSk7Ci0gICAgICAgICAgICAgIG1pbWVQYXJ0cy5zZXRSb290UGFydChwYXJ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHRyYW5zZmVyRW5jb2RpbmcgPSAgVXRpbHMuZ2V0TWltZUhlYWRlckF0dHJpYnV0ZShoZWFkZXJzLCBNSU1FQ29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HKTsKLSAgIAotICAgICAgICAgICAgICBpZiAoKHRyYW5zZmVyRW5jb2RpbmcgIT0gbnVsbCkgJiYgdHJhbnNmZXJFbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJiYXNlNjQiKSkKLSAgICAgICAgICAgICAgCXBhcnQuc2V0Q29udGVudChuZXcgU3RyaW5nKGNvbnRlbnQsIGVuY29kaW5nKSk7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwYXJ0LnNldENvbnRlbnQoVXRpbHMuZW5jb2RlQmFzZTY0KGNvbnRlbnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgcGFydHMuYWRkKHBhcnQpOwotICAgICAgICAgfQotICAgIAl9Ci0gICAgCWNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAJewotICAgIAkgIHJldHVybiBudWxsOwotICAgIAl9Ci0gICAgICB9Ci0gICAgICBpbnQgc2l6ZSA9IHBhcnRzLnNpemUoKTsKLSAgICAgIGZvciAoaW50IGkgPSBzaXplLTE7IGk+PTA7IGktLSkKLSAgICAgICAgIG1pbWVQYXJ0cy5hZGRQYXJ0KChNaW1lUGFydClwYXJ0cy5nZXQoaSkpOwotICAgIH0KLSAgICByZXR1cm4gbWltZVBhcnRzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9YTUxTdHJpbmcoTWltZVBhcnRzIG1pbWVQYXJ0cykKLSAgewotICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0KLSAgICAvLyBBZGQgbWVzc2FnZSBjb250ZW50IHdpdGggYXR0YWNobWVudHMgZWxlbWVudAotICAgIHB3LnByaW50KCI8IiArIFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTKTsKLSAgICBwdy5wcmludCgiPiIpOwotCi0gICAgQ29sbGVjdGlvbiBwYXJ0TGlzdCA9IG1pbWVQYXJ0cy5nZXRQYXJ0cygpOwotICAgIGlmICghcGFydExpc3QuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAJSXRlcmF0b3IgaU1pbWVQYXJ0cyA9IHBhcnRMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIAl3aGlsZSAoaU1pbWVQYXJ0cy5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgIAkgIE1pbWVQYXJ0IG1pbWVQYXJ0ID0gKE1pbWVQYXJ0KWlNaW1lUGFydHMubmV4dCgpOwotICAgICAgICAgCSAgcHcucHJpbnQobWltZVBhcnQudG9YTUxTdHJpbmcoIiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBlbmQgbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgIHB3LnByaW50bG4oIjwvIiArIFdTSUNvbnN0YW50cy5FTEVNX01FU1NBR0VfQ09OVEVOVF9XSVRIX0FUVEFDSE1FTlRTICsgIj4iKTsKLSAgICAvLyBSZXR1cm4gc3RyaW5nCi0gICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykKLSAgewotICAJdHJ5Ci0JewotICAJICBGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCJkOlxcYi54bWwiKTsKLSAgCSAgaW50IGkgPSBpbnB1dFN0cmVhbS5hdmFpbGFibGUoKTsKLSAgCSAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2ldOwotICAJICBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcik7Ci0gIAkgIFN0cmluZyBtZXNzYWdlID0gbmV3IFN0cmluZyhidWZmZXIpOwotICAJICBtZXNzYWdlID0gWE1MVXRpbHMueG1sUmVtb3ZlRXNjYXBlZFN0cmluZyhtZXNzYWdlKTsKLSAgCSAgU3RyaW5nIGhlYWRlcnMgPSBVdGlscy5nZXRIVFRQSGVhZGVycyhtZXNzYWdlKTsKLSAgCSAgU3RyaW5nIGNvbnRlbnQgPSBVdGlscy5nZXRDb250ZW50KG1lc3NhZ2UpOwotICAJICBNaW1lUGFydHMgcGFydHMgPSBVdGlscy5wYXJzZU11bHRpcGFydFJlbGF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGhlYWRlcnMsIFV0aWxzLkpBVkFfRU5DT0RJTkdfREVGQVVMVCk7Ci0gIAkgIFN5c3RlbS5vdXQucHJpbnRsbihVdGlscy50b1hNTFN0cmluZyhwYXJ0cykpOwotCX0KLSAgCWNhdGNoIChFeGNlcHRpb24gZSl7fQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9XU0RMVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvV1NETFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkY2YwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9XU0RMVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUNvbnN0YW50czsKLQotLyoqCi0gKiBUaGUgdXRpbGl0eSBjbGFzcyB0byBhdXRvbWF0ZSBXU0RMIHByb2Nlc3NpbmcuCi0gKiAKLSAqIEBhdXRob3IgS3VsaWsKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdTRExVdGlsCi17Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgZXh0cmFjdHMgbGlzdCBvZiBwYXJ0cyBmb3IgdGhlIGdpdmVuIHNvYXBiaW5kOmJvZHksCi0gICAqIGJpbmRpbmcgb3BlcmF0aW9uLCBtZXNzYWdlLCBhbmQgc3R5bGUuCi0gICAqIAotICAgKiBAcGFyYW0gb3AgYW4gb3BlcmF0aW9uLgotICAgKiBAcGFyYW0gbSAgYSBtZXNzYWdlLgotICAgKiBAcGFyYW0gYm9keSBhIFNPQVAgYm9keS4KLSAgICogQHBhcmFtIHN0eWxlIGFuIG9wZXJhdGlvbiBzdHlsZS4KLSAgICogQHJldHVybiBsaXN0IG9mIHBhcnRzIGZvciB0aGUgZ2l2ZW4gc29hcGJpbmQ6Ym9keSwKLSAgICogICAgICAgICBiaW5kaW5nIG9wZXJhdGlvbiwgbWVzc2FnZSwgYW5kIHN0eWxlLgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBMaXN0IGdldFBhcnRzKAotICAgIE9wZXJhdGlvbiBvcCwKLSAgICBNZXNzYWdlIG0sCi0gICAgU09BUEJvZHkgYm9keSwKLSAgICBTdHJpbmcgc3R5bGUpCi0gIHsKLSAgICAvLwkJaWYgbnVsbCwgZ2V0IHBhcnRzIGZyb20gbWVzc2FnZSAKLSAgICBpZiAoYm9keS5nZXRQYXJ0cygpID09IG51bGwpCi0gICAgICAvLyBpZiBycGMgc3R5bGUgaXMgdXNlZCwgdHJ5IHRvIHVzZSBwYXJ0T3JkZXIgYXR0cmlidXRlIGZyb20gb3BlcmF0aW9uCi0gICAgICBpZiAoV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CSU5EX1NUWUxFX1JQQy5lcXVhbHMoc3R5bGUpKQotICAgICAgICByZXR1cm4gbS5nZXRPcmRlcmVkUGFydHMob3AuZ2V0UGFyYW1ldGVyT3JkZXJpbmcoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBtLmdldE9yZGVyZWRQYXJ0cyhudWxsKTsKLSAgICBlbHNlCi0gICAgICAvLyBjb252ZXJzZSBwYXJ0cyBuYW1lIHRvIHBhcnRzIG9iamVjdHMKLSAgICAgIHJldHVybiBtLmdldE9yZGVyZWRQYXJ0cyhib2R5LmdldFBhcnRzKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgaXRlcmF0ZXMgYWxsIGltcG9ydHMgZnJvbSB0aGUgZ2l2ZW4gZGVmaW5pdGlvbiBhbmQgZXhwYW5kcyBhbGwKLSAgICogaW1wb3J0ZWQgbWVzc2FnZXMsIHNlcnZpY2UsIHBvcnRUeXBlcywgYW5kIGJpbmRpbmdzIHRvIHRoZSBkZWZpbml0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGRlZiBhIFdTREwgZGVmaW5pdGlvbi4KLSAgICovCi0gIHN0YXRpYyBwdWJsaWMgdm9pZCBleHBhbmREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgaWYgKGRlZiAhPSBudWxsICYmIGRlZi5nZXRJbXBvcnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IGRlZi5nZXRJbXBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIExpc3QgdiA9IChMaXN0KSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpdDIgPSB2Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0Mi5oYXNOZXh0KCkpCi0gICAgICAgICAgICBleHBhbmREZWZpbml0aW9uKGRlZiwgKEltcG9ydCkgaXQyLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGludGVybmFsIG1ldGhvZCB0byBleHBhbmQgZGVmaW5pdGlvbi4KLSAgICogQHBhcmFtIHRhcmdldCBXU0RMIGRlZmluaXRpb24uCi0gICAqIEBwYXJhbSBpbSBpbnRlcm5hbCBtZXRob2QuCi0gICAqLwotICBzdGF0aWMgcHJpdmF0ZSB2b2lkIGV4cGFuZERlZmluaXRpb24oRGVmaW5pdGlvbiB0YXJnZXQsIEltcG9ydCBpbSkKLSAgewotICAgIGlmIChpbSAhPSBudWxsICYmIGltLmdldERlZmluaXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZCA9IGltLmdldERlZmluaXRpb24oKTsKLSAgICAgIGlmIChkLmdldE1lc3NhZ2VzKCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBkLmdldE1lc3NhZ2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgICAgICB0YXJnZXQuYWRkTWVzc2FnZSgoTWVzc2FnZSkgaXQubmV4dCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChkLmdldFBvcnRUeXBlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZC5nZXRQb3J0VHlwZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgICAgIHRhcmdldC5hZGRQb3J0VHlwZSgoUG9ydFR5cGUpIGl0Lm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoZC5nZXRCaW5kaW5ncygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZC5nZXRCaW5kaW5ncygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgICAgdGFyZ2V0LmFkZEJpbmRpbmcoKEJpbmRpbmcpIGl0Lm5leHQoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoZC5nZXRTZXJ2aWNlcygpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGl0ID0gZC5nZXRTZXJ2aWNlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICAgICAgdGFyZ2V0LmFkZFNlcnZpY2UoKFNlcnZpY2UpIGl0Lm5leHQoKSk7Ci0gICAgICB9Ci0KLSAgICAgIEl0ZXJhdG9yIGl0ID0gZC5nZXRJbXBvcnRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIExpc3QgdiA9IChMaXN0KSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpdDIgPSB2Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0Mi5oYXNOZXh0KCkpCi0gICAgICAgICAgICBleHBhbmREZWZpbml0aW9uKHRhcmdldCwgKEltcG9ydCkgaXQyLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBleHRyYWN0cyBwYXJ0IGZyb20gdGhlIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBhIFNPQVAgbWVzc2FnZS4KLSAgICogQHBhcmFtIHBhcnQgYSBwYXJ0IG5hbWUuCi0gICAqIEByZXR1cm4gcGFydCBmcm9tIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLSAgICovCi0gIHN0YXRpYyBwdWJsaWMgUGFydCBnZXRQYXJ0KE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIHBhcnQpCi0gIHsKLSAgICBQYXJ0IG1lc1BhcnQgPSBudWxsOwotICAgIGlmIChwYXJ0ID09IG51bGwpCi0gICAgICBtZXNQYXJ0ID0gKFBhcnQpIG1lc3NhZ2UuZ2V0T3JkZXJlZFBhcnRzKG51bGwpLmdldCgwKTsKLSAgICBlbHNlCi0gICAgICBtZXNQYXJ0ID0gbWVzc2FnZS5nZXRQYXJ0KHBhcnQpOwotICAgIHJldHVybiBtZXNQYXJ0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9XU0lQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC9XU0lQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTQwMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvV1NJUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLnVkZGk0ai50cmFuc3BvcnQuVHJhbnNwb3J0RmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgV1NJIHByb3BlcnRpZXMgY2FuIGJlIGRlZmluZWQgaW4gb25lIG9mIHRocmVlIGxvY2F0aW9ucy4gIAotICoKLSAqICAgMS4gVGhlIHdzaS5wcm9wZXJ0aWVzIGZpbGUgd2hpY2ggY2FuIGJlIGxvY2F0ZWQgYW55d2hlcmUgaW4gdGhlIGNsYXNzcGF0aC4KLSAqICAgMi4gVGhlIHN5c3RlbSBwcm9wZXJ0eSBzZXR0aW5ncy4KLSAqICAgMy4gVGhlIHRocmVhZCBsb2NhbCBwcm9wZXJ0eSBzZXR0aW5ncy4KLSAqIAotICogVGhlIHByb3BlcnRpZXMgYXJlIHNldCBiYXNlZCBvbiB0aGlzIG9yZGVyaW5nLiAgRm9yIGV4YW1wbGUsIHRoZSBwcm9wZXJ0aWVzIAotICogZnJvbSB0aGUgd3NpLnByb3BlcnRpZXMgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHByb3BlcnRpZXMgZnJvbSB0aGUgc3lzdGVtIAotICogcHJvcGVydHkgc2V0dGluZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHRocmVhZCBsb2NhbCBwcm9wZXJ0eSBzZXR0aW5ncy4KLSAqCi0gKiBUaGUgcHJvcGVydGllcyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBjYW4gYmUKLSAqIHNwZWNpZmllZCBhcyBzeXN0ZW0gcHJvcGVydGllcyBvciBhcyBwcm9wZXJ0aWVzIHRoYXQgYXJlIHNldCBpbiBhIHRocmVhZCAKLSAqIGxvY2FsIHZhcmlhYmxlLiAgU3lzdGVtIHByb3BlcnRpZXMgc2hvdWxkIGJlIHVzZWQgaWYgb25seSBvbmUgaW1wbGVtZW50YXRpb24KLSAqIGlzIG5lZWRlZCBwZXIgSlZNLiAgSWYgdHdvIG9yIG1vcmUgaW1wbGVtZW50YXRpb25zIGFyZSBuZWVkZWQgcGVyIEpWTSwgdGhlbgotICogdGhlIHByb3BlcnRpZXMgc2hvdWxkIGJlIHNldCB1c2luZyB0aGUgdGhyZWFkIGxvY2FsIHZhcmlhYmxlLgotICoKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yOiBQZXRlciBCcml0dGVuaGFtCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXU0lQcm9wZXJ0aWVzCi17Ci0gIC8qKgotICAgKiBQcm9wZXJ0aWVzIG9iamVjdC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgUHJvcGVydGllcyB3c2lQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAvKioKLSAgICogRGVmYXVsdCBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeSBjbGFzcyBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGX1ZBTElEQVRPUl9GQUNUT1JZID0KLSAgICAib3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLmltcGwuUHJvZmlsZVZhbGlkYXRvckZhY3RvcnlJbXBsIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeSBjbGFzcyBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9WQUxJREFUT1JfRkFDVE9SWSA9Ci0gICAgIndzaS5wcm9maWxlLnZhbGlkYXRvci5mYWN0b3J5IjsKLQotICAvKioKLSAgICogRGVmYXVsdCBkb2N1bWVudCBmYWN0b3J5IGNsYXNzIG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfRE9DVU1FTlRfRkFDVE9SWSA9Ci0gICAgIm9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5pbXBsLkRvY3VtZW50RmFjdG9yeUltcGwiOwotCi0gIC8qKgotICAgKiBQcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIGRvY3VtZW50IGZhY3RvcnkgY2xhc3MgbmFtZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRE9DVU1FTlRfRkFDVE9SWSA9ICJ3c2kuZG9jdW1lbnQuZmFjdG9yeSI7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgSkFYUCBYTUwgcGFyc2VyIGRvY3VtZW50IGZhY3RvcnkgYnVpbGRlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9KQVhQX0RPQ1VNRU5UX0ZBQ1RPUlkgPQotICAgICJvcmcuYXBhY2hlLnhlcmNlcy5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBKQVhQIFhNTCBwYXJzZXIgZG9jdW1lbnQgZmFjdG9yeSBidWlsZGVyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9KQVhQX0RPQ1VNRU5UX0ZBQ1RPUlkgPQotICAgICJqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IjsKLQotICAvKioKLSAgICogRGVmYXVsdCBXU0RMIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9XU0RMX1NDSEVNQSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7Ci0KLSAgLyoqCi0gICAqIFByb3BlcnR5IHRoYXQgY29udGFpbnMgV1NETCBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dTRExfU0NIRU1BID0gIndzaS5hbmFseXplci53c2RsLnNjaGVtYSI7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgV1NETCBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9XU0RMX1NPQVBfU0NIRU1BID0KLSAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyI7Ci0KLSAgLyoqCi0gICAqIFByb3BlcnR5IHRoYXQgY29udGFpbnMgV1NETCBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfV1NETF9TT0FQX1NDSEVNQSA9Ci0gICAgIndzaS5hbmFseXplci53c2Rsc29hcC5zY2hlbWEiOwotCi0gIC8qKgotICAgKiBEZWZhdWx0IFdTREwgTUlNRSBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZfV1NETF9NSU1FX1NDSEVNQSA9Ci0gICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iOwotCi0gIC8qKgotICAgKiBQcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIFdTREwgU09BUCBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dTRExfTUlNRV9TQ0hFTUEgPQotICAgICJ3c2kuYW5hbHl6ZXIud3NkbG1pbWUuc2NoZW1hIjsKLQotICAvKioKLSAgICogRGVmYXVsdCBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9TT0FQX1NDSEVNQSA9Ci0gICAgImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUvIjsKLQotICAvKioKLSAgICogUHJvcGVydHkgdGhhdCBjb250YWlucyBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU09BUF9TQ0hFTUEgPSAid3NpLmFuYWx5emVyLnNvYXAuc2NoZW1hIjsKLQotICAvKioKLSAgICogRGVmYXVsdCBTT0FQIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRl9YTUxfU0NIRU1BID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLnhzZCI7Ci0KLSAgLyoqCi0gICAqIFByb3BlcnR5IHRoYXQgY29udGFpbnMgU09BUCBzY2hlbWEgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1hNTF9TQ0hFTUEgPSAid3NpLmFuYWx5emVyLnhtbHNjaGVtYS5zY2hlbWEiOwotCi0gIC8qKgotICAgKiBQcm9wZXJ0eSB3aGljaCBjb250YWlucyBXU0lfSE9NRSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfV1NJX0hPTUUgPSAid3NpLmhvbWUiOwotCi0gIC8qKgotICAgKiBQcm9wZXJ0eSBmaWxlIG5hbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0ZJTEVOQU1FID0gIm9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLndzaSI7Ci0KLSAgLyoqCi0gICogVGhyZWFkIGxvY2FsIHZhcmlhYmxlLgotICAqLwotICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbCB0aHJlYWRMb2NhbCA9IG5ldyBUaHJlYWRMb2NhbCgpOwotCi0gIC8vIExvYWQgcHJvZmlsZXMgZmlsZQotICBzdGF0aWMgewotICAgIGxvYWRQcm9wZXJ0aWVzRmlsZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIExvYWQgcHJvcGVydGllcyBmcm9tIHdzaS5wcm9wZXJ0aWVzIGZpbGUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRQcm9wZXJ0aWVzRmlsZSgpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBUcnkgdG8gbG9hZCBwcm9wZXJ0aWVzIGZyb20gd3NpLnByb3BlcnRpZXMKLSAgICAgIC8vSW5wdXRTdHJlYW0gaXMgPSBVdGlscy5nZXRJbnB1dFN0cmVhbShQUk9QX0ZJTEVOQU1FKTsKLQotICAgICAgLy8gTG9hZCBwcm9wZXJ0aWVzIGZyb20gZmlsZQotICAgICAgLy93c2lQcm9wZXJ0aWVzRmlsZS5sb2FkKGlzKTsKLQotICAgICAgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoUFJPUF9GSUxFTkFNRSk7Ci0KLSAgICAgIFN0cmluZyBuZXh0S2V5OwotICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSByZXNvdXJjZUJ1bmRsZS5nZXRLZXlzKCk7Ci0gICAgICB3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIG5leHRLZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotICAgICAgICB3c2lQcm9wZXJ0aWVzLnB1dChuZXh0S2V5LCByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcobmV4dEtleSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKQotICAgIHsKLSAgICAgIC8vIERFQlVHOgotICAgICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICAiV0FSTklORzogIENvdWxkIG5vdCByZWFkICIKLSAgICAgICAgICArIFBST1BfRklMRU5BTUUKLSAgICAgICAgICArICIuICAiCi0gICAgICAgICAgKyAiVmVyaWZ5IHRoYXQgaXQgaXMgaW4gdGhlIENMQVNTUEFUSC4iKTsKLQotICAgICAgLy8gU2V0IHVwIGRlZmF1bHQgdmFsdWVzCi0gICAgICB3c2lQcm9wZXJ0aWVzLnB1dChQUk9QX1ZBTElEQVRPUl9GQUNUT1JZLCBERUZfVkFMSURBVE9SX0ZBQ1RPUlkpOwotICAgICAgd3NpUHJvcGVydGllcy5wdXQoUFJPUF9ET0NVTUVOVF9GQUNUT1JZLCBERUZfRE9DVU1FTlRfRkFDVE9SWSk7Ci0gICAgICB3c2lQcm9wZXJ0aWVzLnB1dChQUk9QX0pBWFBfRE9DVU1FTlRfRkFDVE9SWSwgREVGX0pBWFBfRE9DVU1FTlRfRkFDVE9SWSk7Ci0gICAgICB3c2lQcm9wZXJ0aWVzLnB1dCgKLSAgICAgICAgVHJhbnNwb3J0RmFjdG9yeS5QUk9QRVJUWV9OQU1FLAotICAgICAgICAib3JnLnVkZGk0ai50cmFuc3BvcnQuQXBhY2hlQXhpc1RyYW5zcG9ydCIpOwotICAgIH0KLSAgfQotCi0gIC8qKiAKLSAgICogRG8gbm90IGFsbG93IHRoaXMgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZC4KLSAgICovCi0gIHByaXZhdGUgV1NJUHJvcGVydGllcygpCi0gIHsKLSAgfQotCi0gIC8qKiAKLSAgICAqIEdldCBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBzZXQgZm9yIHRoaXMgdGhyZWFkIG9ubHkuCi0gICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBzZXQgZm9yIHRoaXMgdGhyZWFkIG9ubHkuCi0gICAgKgotICAgICogQHNlZSAjc2V0VGhyZWFkTG9jYWxQcm9wZXJ0aWVzCi0gICAgKi8KLSAgcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGdldFRocmVhZExvY2FsUHJvcGVydGllcygpCi0gIHsKLSAgICAvLyBSZXR1cm4gcHJvcGVydGllcwotICAgIHJldHVybiAoUHJvcGVydGllcykgdGhyZWFkTG9jYWwuZ2V0KCk7Ci0gIH0KLQotICAvKiogCi0gICAqIFNldCBwcm9wZXJ0aWVzIGZvciB0aGlzIHRocmVhZCBvbmx5LgotICAgKiBAcGFyYW0gcHJvcHMgIGEgUHJvcGVydGllcyBvYmplY3QuCi0gICAqCi0gICAqIEBzZWUgI2dldFRocmVhZExvY2FsUHJvcGVydGllcwotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRocmVhZExvY2FsUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKQotICB7Ci0gICAgLy8gU2F2ZSB0aGUgcHJvcGVydGllcyBhcyB0aHJlYWQgbG9jYWwgdmFyaWFibGVzCi0gICAgdGhyZWFkTG9jYWwuc2V0KHByb3BzKTsKLSAgfQotCi0gIC8qKiAKLSAgICogR2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBnaXZlbiB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgYSBwcm9wZXJ0eSBuYW1lLgotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlLiBJZiBub3QgZm91bmQgcmV0dXJuIG51bGwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBudWxsOwotICAgIFByb3BlcnRpZXMgdGhyZWFkTG9jYWxQcm9wcyA9IG51bGw7Ci0KLSAgICAvLyAxLiBMb29rIGluIHRocmVhZCBsb2NhbCBwcm9wZXJ0aWVzIGZpcnN0Ci0gICAgaWYgKCh0aHJlYWRMb2NhbFByb3BzID0gZ2V0VGhyZWFkTG9jYWxQcm9wZXJ0aWVzKCkpICE9IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlWYWx1ZSA9IHRocmVhZExvY2FsUHJvcHMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvLyAyLiBOZXh0IGxvb2sgaW4gc3lzdGVtIHByb3BlcnRpZXMgCi0gICAgaWYgKHByb3BlcnR5VmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9wZXJ0eVZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgLy8gMy4gTGFzdCBsb29rIGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUKLSAgICBpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHByb3BlcnR5VmFsdWUgPSB3c2lQcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIHByb3BlcnR5IHZhbHVlCi0gICAgcmV0dXJuIHByb3BlcnR5VmFsdWU7Ci0gIH0KLQotICAvKiogCi0gICAqIEdldCB0aGUgcHJvcGVydHkgdmFsdWUgZ2l2ZW4gdGhlIHByb3BlcnR5IG5hbWUuCi0gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIGEgcHJvcGVydHkgbmFtZS4KLSAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJvcGVydHkuCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWUuIElmIG5vdCBmb3VuZCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZGVmYXVsdFZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBudWxsOwotCi0gICAgLy8gSWYgdGhlIHByb3BlcnR5VmFsdWUgd2FzIG5vdCBmb3VuZCwgdGhlbiByZXR1cm4gZGVmYXVsdCB2YWx1ZQotICAgIGlmICgocHJvcGVydHlWYWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkpID09IG51bGwpCi0gICAgewotICAgICAgcHJvcGVydHlWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gcHJvcGVydHkgdmFsdWUKLSAgICByZXR1cm4gcHJvcGVydHlWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHVuaXQgdGVzdCB0aGlzIGNsYXNzLgotICAgKiBAcGFyYW0gYXJncyAgdGhlIGFyZ3VtZW50cyBmb3IgbWFpbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBTZXQgcHJvcGVydHkgZm9yIHRoaXMgdGhyZWFkCi0gICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgIHByb3BzLnNldFByb3BlcnR5KFBST1BfVkFMSURBVE9SX0ZBQ1RPUlksICJtYWluIik7Ci0gICAgICBXU0lQcm9wZXJ0aWVzLnNldFRocmVhZExvY2FsUHJvcGVydGllcyhwcm9wcyk7Ci0KLSAgICAgIC8vIFN0YXJ0IGZvdXIgdGhyZWFkcyB0byB2ZXJpZnkgdGhhdCB0aGUgbXVsdGl0aHJlYWRlZCB1c2Ugb2YgdHJlYWQgbG9jYWwgdmFycyB3b3JrcwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCi0gICAgICB7Ci0gICAgICAgIC8vIENyZWF0ZSBuZXcgdGhyZWFkCi0gICAgICAgICAobmV3IFRocmVhZChuZXcgVGhyZWFkVGVzdCgidGVzdCIgKyBpKSkpLnN0YXJ0KCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAvLyBTbGVlcAotICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOwotCi0gICAgICAgICAgLy8gRGlzcGxheSBwcm9wZXJ0aWVzLCB3aGljaCBzaG91bGQgYmUgbWFpbgotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICJQUk9QX1ZBTElEQVRPUl9GQUNUT1JZOiAgIgotICAgICAgICAgICAgICArIFdTSVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9WQUxJREFUT1JfRkFDVE9SWSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5uZXIgY2xhc3MgdXNlZCBmb3IgdW5pdCB0ZXN0LgotICAgKi8KLSAgc3RhdGljIHByaXZhdGUgY2xhc3MgVGhyZWFkVGVzdCBleHRlbmRzIFRocmVhZAotICB7Ci0gICAgU3RyaW5nIG5hbWU7Ci0KLSAgICBUaHJlYWRUZXN0KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICB7Ci0gICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgIHByb3BzLnNldFByb3BlcnR5KFBST1BfVkFMSURBVE9SX0ZBQ1RPUlksIG5hbWUpOwotICAgICAgV1NJUHJvcGVydGllcy5zZXRUaHJlYWRMb2NhbFByb3BlcnRpZXMocHJvcHMpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAiUFJPUF9WQUxJREFUT1JfRkFDVE9SWTogICIKLSAgICAgICAgICArIFdTSVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9WQUxJREFUT1JfRkFDVE9SWSkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvWE1MSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3V0aWwvWE1MSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTIxMTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL1hNTEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgLi4uCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0gIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MSW5mbwotewotICAvKioKLSAgICogR2V0IGFkZHRpb25hbCB0b29sIGVudmlyb25tZW50IGluZm9ybWF0aW9uIGFzIGFuIFhNTCBzdHJpbmcuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2VOYW1lIGEgbmFtZXNwYWNlIHByZWZpeC4KLSAgICogQHJldHVybiBhZGR0aW9uYWwgdG9vbCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvbiBhcyBhbiBYTUwgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1hNTFN0cmluZyhTdHJpbmcgbmFtZXNwYWNlTmFtZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvdXRpbC93c2kucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL3dzaS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU0OGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS91dGlsL3dzaS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAqIAotIyAgKiBDb250cmlidXRvcnM6IAotIyAgKiAgIElCTSAgICAgIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKi8KLSMKLSMgUHJvcGVydHkgZmlsZSB1c2VkIHRvIHNldCBwYXJhbWV0ZXJzIGZvciBDb25mb3JtYW5jZSBUb29scwotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIERvY3VtZW50IGZhY3RvcnkuCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi13c2kuZG9jdW1lbnQuZmFjdG9yeT1vcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuaW1wbC5Eb2N1bWVudEZhY3RvcnlJbXBsCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgUHJvZmlsZSB2YWxpZGF0aW9uIGZhY3RvcnkuCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi13c2kucHJvZmlsZS52YWxpZGF0b3IuZmFjdG9yeT1vcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucHJvZmlsZS52YWxpZGF0b3IuaW1wbC5Qcm9maWxlVmFsaWRhdG9yRmFjdG9yeUltcGwKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBSZWZlcmVuY2UgdG8gSkFYUCBkb2N1bWVudCBidWlsZGVyCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1qYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5PW9yZy5hcGFjaGUueGVyY2VzLmpheHAuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGwKLSNqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5PW9yZy5lY2xpcGUud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVHJhbnNwb3J0IGNsYXNzIHVzZWQgYnkgVURESTRKCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1vcmcudWRkaTRqLlRyYW5zcG9ydENsYXNzTmFtZT1vcmcudWRkaTRqLnRyYW5zcG9ydC5BcGFjaGVBeGlzVHJhbnNwb3J0Ci0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBMb2NhdGlvbiBvZiBYTUwgc2NoZW1hIGRvY3VtZW50cyByZWxhdGl2ZSB0byB0aGUgcGx1Z2luIGRpcmVjdG9yeQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotd3NpLmFuYWx5emVyLnhtbHNjaGVtYS5zY2hlbWE9aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEueHNkCi13c2kuYW5hbHl6ZXIuc29hcC5zY2hlbWE9aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8KLXdzaS5hbmFseXplci53c2RsLnNjaGVtYT1odHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLwotd3NpLmFuYWx5emVyLndzZGxzb2FwLnNjaGVtYT13c2kuYW5hbHl6ZXIud3NkbHNvYXAuc2NoZW1hCi13c2kuYW5hbHl6ZXIud3NkbG1pbWUuc2NoZW1hPWh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL1dTRExEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2Y5ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2QuSW5saW5lU2NoZW1hVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBpbnRlcmZhY2UgdG8gYSBzaW5nbGUgV1NETCBkb2N1bWVudC4KLSAqIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFdTRExEb2N1bWVudAotewotICAvKioKLSAgICogV1NETCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCi0gIC8qKgotICAgKiBEZWZpbml0aW9uIGVsZW1lbnQuCi0gICAqLwotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9ucyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFdTREwgZWxlbWVudCBsaXN0IHdpdGggbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gICAqLwotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnRMaXN0IHdzZGxFbGVtZW50TGlzdCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIE1hcCBvZiB0YXJnZXROYW1lc3BhY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIG9yZy5hcGFjaGUueGVyY2VzLnhzLlhTTW9kZWwgb2Ygc2NoZW1hIGVsZW1lbnRzLgotICAgKi8KLSAgcHJpdmF0ZSBNYXAgc2NoZW1hcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2Ygc2NoZW1hcyB2YWxpZGF0aW9uIGVycm9ycy4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBzY2hlbWFzVmFsaWRhdGlvbkVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAvKioKLSAgICogUmVhZCBXU0RMIGRvY3VtZW50IGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLgotICAgKiBAcGFyYW0gZmlsZU5hbWUgV1NETCBkb2N1bWVudCBsb2NhdGlvbi4KLSAgICogQHRocm93cyBXU0RMRXhjZXB0aW9uIGlmIHByb2JsZW0gcmVhZGluZyBXU0RMIGRvY3VtZW50LgotICAgKi8KLSAgcHVibGljIFdTRExEb2N1bWVudChTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0gICAgQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7ICAgCi0KLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoV1NETERvY3VtZW50LmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyAgICAKLQotICAgICAgLy8gR2V0IHRoZSBXU0RMUmVhZGVyCi0gICAgICBXU0RMUmVhZGVyIHdzZGxSZWFkZXIgPSBuZXcgV1NETFJlYWRlckltcGwoKTsKLQotICAgICAgLy8gU2V0IGZlYXR1cmVzCi0gICAgICB3c2RsUmVhZGVyLnNldEZlYXR1cmUoY29tLmlibS53c2RsLkNvbnN0YW50cy5GRUFUVVJFX1ZFUkJPU0UsIGZhbHNlKTsKLSAgICAgIC8vIERFQlVHOgotICAgICAgLy93c2RsUmVhZGVyLnNldEZlYXR1cmUoY29tLmlibS53c2RsLkNvbnN0YW50cy5GRUFUVVJFX1ZFUkJPU0UsIHRydWUpOwotICAgICAgd3NkbFJlYWRlci5zZXRGZWF0dXJlKAotICAgICAgICBjb20uaWJtLndzZGwuQ29uc3RhbnRzLkZFQVRVUkVfSU1QT1JUX0RPQ1VNRU5UUywKLSAgICAgICAgdHJ1ZSk7Ci0gICAgICAvLyBERUJVRzoKLSAgICAgIC8vd3NkbFJlYWRlci5zZXRGZWF0dXJlKGNvbS5pYm0ud3NkbC5Db25zdGFudHMuRkVBVFVSRV9JTVBPUlRfRE9DVU1FTlRTLHRydWUpOwotCi0gICAgICAvLyBQYXJzZSB0aGUgV1NETCBkb2N1bWVudAotICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlscy5wYXJzZVhNTERvY3VtZW50KGZpbGVOYW1lKTsKLSAgICAgIHRoaXMuZGVmaW5pdGlvbnMgPSB3c2RsUmVhZGVyLnJlYWRXU0RMKGZpbGVOYW1lLCBkb2N1bWVudCk7Ci0KLSAgICAgIC8vIFNpbmNlIGlubGluZSBzY2hlbWEgdmFsaWRhdG9yIGlzIHVzZWQgYnkgc2V2ZXJhbCBhc3NlcnRpb25zLCB2YWxpZGF0ZSBhbGwKLSAgICAgIC8vIHNjaGVtYXMgcmlnaHQgYWZ0ZXIgV1NETCB2YWxpZGF0aW9uCi0gICAgICB2YWxpZGF0ZVNjaGVtYXMoKTsKLQotICAgICAgLy8gR2V0IHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyIHJlZmVyZW5jZXMKLSAgICAgIHRoaXMud3NkbEVsZW1lbnRMaXN0ID0gKChXU0RMUmVhZGVySW1wbCkgd3NkbFJlYWRlcikuZ2V0RWxlbWVudExpc3QoKTsKLQotICAgICAgLy8gREVCVUc6Ci0gICAgICAvL1N5c3RlbS5lcnIucHJpbnRsbih3c2RsRWxlbWVudExpc3QudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gY2NlKQotICAgIHsKLSAgICAgIC8vIFNldCBlbGVtZW50IGxpc3QgdG8gbnVsbAotICAgICAgdGhpcy53c2RsRWxlbWVudExpc3QgPSBudWxsOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgeyAKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cnJlbnRMb2FkZXIpOwotICAgIH0gICAgCi0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIFdTREwgZG9jdW1lbnQgZnJvbSBleGlzdGluZyBEZWZpbml0aW9uIG9iamVjdC4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlTmFtZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbnMgRGVmaW5pdGlvbiBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETERvY3VtZW50KFN0cmluZyBmaWxlTmFtZSwgRGVmaW5pdGlvbiBkZWZpbml0aW9ucykKLSAgewotICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICB0aGlzLmRlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7Ci0gICAgc2NoZW1hcy5jbGVhcigpOwotICAgIHNjaGVtYXNWYWxpZGF0aW9uRXJyb3JzLmNsZWFyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBXU0RMIGRvY3VtZW50IGxvY2F0aW9uLgotICAgKiBAcmV0dXJuIGhlIFdTREwgZG9jdW1lbnQgbG9jYXRpb24uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLSAgewotICAgIC8vIFJldHVybiB0aGUgZG9jdW1lbnQgbG9jYXRpb24KLSAgICByZXR1cm4gdGhpcy5maWxlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGRlZmluaXRpb24gZWxlbWVudCBvZiB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHJldHVybiB0aGUgZGVmaW5pdGlvbiBlbGVtZW50Ci0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9ucygpCi0gIHsKLSAgICAvLyBSZXR1cm4gdGhlIGRlZmluaXRpb24gZWxlbWVudAotICAgIHJldHVybiBkZWZpbml0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYWxsIHRoZSBwb3J0VHlwZSBlbGVtZW50cyBmcm9tIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHBvcnRUeXBlIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIFBvcnRUeXBlW10gZ2V0UG9ydFR5cGVzKCkKLSAgewotICAgIC8vIEdlbmVyYXRlIGFuIGFycmF5IG9mIFBvcnRUeXBlcyBmcm9tIHRoZSBQb3J0VHlwZSBtYXAgZm9yIHRoaXMgRGVmaW5pdGlvbgotICAgIHJldHVybiAoUG9ydFR5cGVbXSkgZGVmaW5pdGlvbnMuZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCkudG9BcnJheSgKLSAgICAgIG5ldyBQb3J0VHlwZVswXSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFsbCB0aGUgYmluZGluZyBlbGVtZW50cyBmcm9tIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGJpbmRpbmcgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgQmluZGluZ1tdIGdldEJpbmRpbmdzKCkKLSAgewotICAgIC8vIEdlbmVyYXRlIGFuIGFycmF5IG9mIEJpbmRpbmdzIGZyb20gdGhlIEJpbmRpbmcgbWFwIGZvciB0aGlzIERlZmluaXRpb24KLSAgICByZXR1cm4gKEJpbmRpbmdbXSkgZGVmaW5pdGlvbnMuZ2V0QmluZGluZ3MoKS52YWx1ZXMoKS50b0FycmF5KAotICAgICAgbmV3IEJpbmRpbmdbMF0pOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhbGwgdGhlIHNlcnZpY2UgZWxlbWVudHMgZnJvbSB0aGUgV1NETCBkb2N1bWVudC4KLSAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzZXJ2aWNlIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIFNlcnZpY2VbXSBnZXRTZXJ2aWNlcygpCi0gIHsKLSAgICAvLyBHZW5lcmF0ZSBhbiBhcnJheSBvZiBTZXJ2aWNlcyBmcm9tIHRoZSBTZXJ2aWNlIG1hcCBmb3IgdGhpcyBEZWZpbml0aW9uCi0gICAgcmV0dXJuIChTZXJ2aWNlW10pIGRlZmluaXRpb25zLmdldFNlcnZpY2VzKCkudmFsdWVzKCkudG9BcnJheSgKLSAgICAgIG5ldyBTZXJ2aWNlWzBdKTsKLSAgfQotCi0gIC8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIC8vIFJldHVybiBzdHJpbmcKLSAgICByZXR1cm4gKGRlZmluaXRpb25zID09IG51bGwpCi0gICAgICA/ICJXU0RMIGRlZmluaXRpb24gZWxlbWVudCBub3QgZm91bmQuIgotICAgICAgOiBkZWZpbml0aW9ucy50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZWxlbWVudCBsaXN0LgotICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGxpc3QuCi0gICAqLwotICBwdWJsaWMgV1NETEVsZW1lbnRMaXN0IGdldEVsZW1lbnRMaXN0KCkKLSAgewotICAgIHJldHVybiB0aGlzLndzZGxFbGVtZW50TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgc2NoZW1hcyBtYXAuCi0gICAqIEByZXR1cm4gYSBtYXAgb2YgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSB2YWx1ZXMgb2YgdGhlIHNjaGVtYSBlbGVtZW50cwotICAgKiB0byB0aGUgY29ycmVzcG9uZGluZyBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsIG9iamVjdCBvZiB0aGF0IHNjaGVtYS4KLSAgICovCi0gIHB1YmxpYyBNYXAgZ2V0U2NoZW1hcygpCi0gIHsKLSAgICByZXR1cm4gc2NoZW1hczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBzY2hlbWFzIHZhbGlkYXRpb24gZXJyb3JzIGNhdXNlZCBieSB0aGUgdmFsaWRhdGVTY2hlbWFzKCkgcHJvY2VkdXJlLgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzY2hlbWFzIHZhbGlkYXRpb24gZXJyb3JzLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0U2NoZW1hc1ZhbGlkYXRpb25FcnJvcnMoKQotICB7Ci0gICAgcmV0dXJuIHNjaGVtYXNWYWxpZGF0aW9uRXJyb3JzOyAKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGludm9rZXMgdGhlIGlubGluZSBzY2hlbWEgdmFsaWRhdG9yIHdoaWNoIHZhbGlkYXRlcyBldmVyeSBzY2hlbWEgZWxlbWVudCBvZiB0aGUgV1NETC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVNjaGVtYXMoKQotICB7Ci0gICAgc2NoZW1hcy5jbGVhcigpOwotICAgIHNjaGVtYXNWYWxpZGF0aW9uRXJyb3JzLmNsZWFyKCk7Ci0KLSAgICAvKiBJTkxJTkUgU0NIRU1BIFZBTElEQVRPUiAqLwotICAgIGlmIChkZWZpbml0aW9ucyAhPSBudWxsCi0gICAgICAmJiBkZWZpbml0aW9ucy5nZXRUeXBlcygpICE9IG51bGwKLSAgICAgICYmIGRlZmluaXRpb25zLmdldFR5cGVzKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJbmxpbmVTY2hlbWFWYWxpZGF0b3Igc2NoZW1hVmFsaWRhdG9yID0gbmV3IElubGluZVNjaGVtYVZhbGlkYXRvcigpOwotCi0gICAgICAvLyBDb2xsZWN0aW5nIHNjaGVtYSdzIHBhcmVudCBlbGVtZW50cwotICAgICAgTGlzdCBwYXJlbnRzID0gbmV3IEFycmF5TGlzdCgyKTsKLSAgICAgIHBhcmVudHMuYWRkKGRlZmluaXRpb25zLmdldFR5cGVzKCkpOwotICAgICAgcGFyZW50cy5hZGQoZGVmaW5pdGlvbnMpOwotICAgICAgLy8gR29pbmcgdGhyb3VnaCBhbGwgdGhlIEV4dGVuc2liaWxpdHlFbGVtZW50UyBvZiB3c2RsOnR5cGVzCi0gICAgICAvLyBzaW5jZSB0aGV5IGFyZSBwb3RlbnRpYWwgc2NoZW1hcwotICAgICAgLy8gU2VlIEphdmEgQVBJcyBmb3IgV1NETCBWMS4wIChKU1IxMTApLCBzZWN0aW9uIDQKLSAgICAgIEl0ZXJhdG9yIGkgPSB0aGlzLmRlZmluaXRpb25zLmdldFR5cGVzKCkuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWwgPSAoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGkubmV4dCgpOwotICAgICAgICBpZiAoZXh0RWwuZ2V0RWxlbWVudFR5cGUoKS5lcXVhbHMoWE1MVGFncy5FTEVNX1hTRF9TQ0hFTUEpKQotICAgICAgICB7Ci0gICAgICAgICAgTWFwIG1hcCA9IG51bGw7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgLy8gVmFsaWRhdGluZyBzY2hlbWEgZWxlbWVudAotICAgICAgICAgICAgbWFwID0gc2NoZW1hVmFsaWRhdG9yLnZhbGlkYXRlKGV4dEVsLCBwYXJlbnRzLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBBZGRpbmcgYW4gZXhjZXB0aW9uIHRvIHRoZSBlcnJvcnMgbGlzdAotICAgICAgICAgICAgc2NoZW1hc1ZhbGlkYXRpb25FcnJvcnMuYWRkKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobWFwICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gQWRkaW5nIHJldHVybmVkIFhTTW9kZWwgdG8gc2NoZW1hcyBtYXAKLSAgICAgICAgICAgIHNjaGVtYXMucHV0QWxsKG1hcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBDb21tYW5kIGxpbmUgaW50ZXJmYWNlLgotICAgKiBAcGFyYW0gYXJncyBmcm9tIGNvbW1hbmQgbGluZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBXU0RMRG9jdW1lbnQgd3NkbERvY3VtZW50ID0gbmV3IFdTRExEb2N1bWVudChhcmdzWzBdKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3c2RsRG9jdW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUudG9TdHJpbmcoKTsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL1dTRExFbGVtZW50TGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETEVsZW1lbnRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTc3ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETEVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIFdTREwgZWxlbWVudCBsaXN0LgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgV1NETEVsZW1lbnRMaXN0Ci17Ci0gIC8qKgotICAgKiBMaXN0IG9mIFdTREwgZWxlbWVudHMgd2l0aCB0aGVpciBsb2NhdGlvbi4KLSAgICovCi0gIEhhc2hNYXAgd3NkbEVsZW1lbnRMaXN0ID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogV1NETCBlbGVtZW50IGxvY2F0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETEVsZW1lbnRMaXN0KCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBlbGVtZW50IHdpdGggbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsRWxlbWVudCAgICAgIGEgV1NETCBlbGVtZW50IGFydGlmYWN0LgotICAgKiBAcGFyYW0gZWxlbWVudExvY2F0aW9uICB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudChPYmplY3Qgd3NkbEVsZW1lbnQsIEVsZW1lbnRMb2NhdGlvbiBlbGVtZW50TG9jYXRpb24pCi0gIHsKLSAgICB0aGlzLndzZGxFbGVtZW50TGlzdC5wdXQod3NkbEVsZW1lbnQsIGVsZW1lbnRMb2NhdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGVsZW1lbnQgbG9jYXRpb24uCi0gICAqIEBwYXJhbSB3c2RsRWxlbWVudCAgYSBXU0RMIGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBFbGVtZW50TG9jYXRpb24gZ2V0RWxlbWVudExvY2F0aW9uKE9iamVjdCB3c2RsRWxlbWVudCkKLSAgewotICAgIHJldHVybiAoRWxlbWVudExvY2F0aW9uKSB0aGlzLndzZGxFbGVtZW50TGlzdC5nZXQod3NkbEVsZW1lbnQpOwotICB9Ci0KLSAgLyogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgU3RyaW5nIHN0cmluZyA9ICJXU0RMRWxlbWVudExpc3Q6IFxuIjsKLQotICAgIC8vIEdldCBsaXN0IGVudHJpZXMgKHZhbHVlcz8pCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLndzZGxFbGVtZW50TGlzdC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgLy8gQWRkIGVhY2ggZW50cnkgaW4gdGhlIGxpc3QgdG8gdGhlIHN0cmluZwotICAgIEVsZW1lbnRMb2NhdGlvbiB3c2RsRWxlbWVudExvY2F0aW9uOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IHdzZGxFbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICBpZiAod3NkbEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nICs9ICIgICIgKyB3c2RsRWxlbWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6ICI7Ci0gICAgICAgIGlmICgod3NkbEVsZW1lbnRMb2NhdGlvbiA9Ci0gICAgICAgICAgKEVsZW1lbnRMb2NhdGlvbikgd3NkbEVsZW1lbnRMaXN0LmdldCh3c2RsRWxlbWVudCkpCi0gICAgICAgICAgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZyArPSAibnVsbFxuIjsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHN0cmluZyArPSAiICAiCi0gICAgICAgICAgICArIHdzZGxFbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICArICI6ICIKLSAgICAgICAgICAgICsgd3NkbEVsZW1lbnRMb2NhdGlvbi5nZXRMaW5lTnVtYmVyKCkKLSAgICAgICAgICAgICsgIiwgIgotICAgICAgICAgICAgKyB3c2RsRWxlbWVudExvY2F0aW9uLmdldENvbHVtbk51bWJlcigpCi0gICAgICAgICAgICArICJcbiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RyaW5nOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC9XU0RMUmVhZGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETFJlYWRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyNWRjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC9XU0RMUmVhZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZmFjdG9yeS5XU0RMRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuZG9tLkVsZW1lbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBjb20uaWJtLndzZGwudXRpbC54bWwuRE9NVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLlFOYW1lVXRpbHM7Ci1pbXBvcnQgY29tLmlibS53c2RsLnV0aWwueG1sLlhQYXRoVXRpbHM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwgaW4gV1NETDRKLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgV1NETFJlYWRlckltcGwgZXh0ZW5kcyBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsCi17Ci0gIC8vIFdTREwgZWxlbWVudCBsaXN0LgotICBwcm90ZWN0ZWQgV1NETEVsZW1lbnRMaXN0IHdzZGxFbGVtZW50TGlzdCA9IG5ldyBXU0RMRWxlbWVudExpc3QoKTsKLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZURlZmluaXRpb25zKGphdmEubGFuZy5TdHJpbmcsIG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmEudXRpbC5NYXApCi0gICAqLwotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBwYXJzZURlZmluaXRpb25zKAotICAgIFN0cmluZyBkb2N1bWVudEJhc2VVUkksCi0gICAgRWxlbWVudCBkZWZFbCwKLSAgICBNYXAgaW1wb3J0ZWREZWZzKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLQkgIERlZmluaXRpb24gZGVmID0gbnVsbDsKLQlDbGFzc0xvYWRlciBjdXJyZW50TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsgICAKLQl0cnkKLQl7Ci0gICAJICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihXU0RMUmVhZGVySW1wbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsgICAKLQkKLSAgICAgIGRlZiA9Ci0gICAgICBzdXBlci5wYXJzZURlZmluaXRpb25zKGRvY3VtZW50QmFzZVVSSSwgZGVmRWwsIGltcG9ydGVkRGVmcyk7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3QoZGVmRWwsIGRlZik7Ci0KLQotCX0KLWNhdGNoIChFeGNlcHRpb24gZSkKLQl7Ci0JfQotICAgIGZpbmFsbHkKLSAgICB7IAotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY3VycmVudExvYWRlcik7Ci0gICAgfSAgCi0gICAgcmV0dXJuIGRlZjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlSW1wb3J0KG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbiwgamF2YS51dGlsLk1hcCkKLSAgICovCi0gIHByb3RlY3RlZCBJbXBvcnQgcGFyc2VJbXBvcnQoRWxlbWVudCBlbGVtZW50LCBEZWZpbml0aW9uIGRlZmluaXRpb24sIE1hcCBtYXApCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIC8qYm9vbGVhbiB3YXNFeCA9IGZhbHNlOwotICAgIGlmIChkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkhPW51bGwpewotICAgIAlGaWxlIGYgPSBuZXcgRmlsZShkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgIAlpZiAoZi5nZXRQYXJlbnQoKSE9bnVsbCAmJiBpbXBvcnRFbC5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIikhPW51bGwpewkJCi0gICAgCSAgIGYgPSBuZXcgRmlsZShmLmdldFBhcmVudCgpKyIvIitpbXBvcnRFbC5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIikpOwotICAgIAkgICAKLSAgICAJfQotICAgIH0gZWxzZSB3YXNFeCA9IGZhbHNlOwotICAgICAgCi0gICAgSW1wb3J0IGltcG9ydERlZiA9IHN1cGVyLnBhcnNlSW1wb3J0KGltcG9ydEVsLCBkZWYsIGltcG9ydGVkRGVmcyk7Ci0gICAgCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGltcG9ydEVsLCBpbXBvcnREZWYpOwotICAgIAotICAgIHJldHVybiBpbXBvcnREZWY7Ki8KLQotICAgIC8qSW1wb3J0IGltcG9ydDEgPSBkZWZpbml0aW9uLmNyZWF0ZUltcG9ydCgpOwotICAgIFN0cmluZyBzID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICJuYW1lc3BhY2UiKTsKLSAgICBTdHJpbmcgczEgPSBET01VdGlscy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgImxvY2F0aW9uIik7Ci0gICAgaWYgKHMgIT0gbnVsbCkKLSAgICAJaW1wb3J0MS5zZXROYW1lc3BhY2VVUkkocyk7Ci0gICAgaWYgKHMxICE9IG51bGwpIHsKLSAgICAJaWYgKGltcG9ydERvY3VtZW50cykgewotICAgIAkJU3RyaW5nIHMyID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAJCXRyeSB7Ci0gICAgCi0gICAgCQkJVVJMIHVybDEgPSBzMiA9PSBudWxsID8gbnVsbCA6IFN0cmluZ1V0aWxzLmdldFVSTChudWxsLCBzMik7Ci0gICAgCQkJVVJMIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTCh1cmwxLCBzMSk7Ci0gICAgCQkJSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0gPQotICAgIAkJCQlTdHJpbmdVdGlscy5nZXRDb250ZW50QXNJbnB1dFN0cmVhbSh1cmwpOwotICAgIAkJCWlucHV0c3RyZWFtLmNsb3NlKCk7Ci0gICAgCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgIAkJCS8vaW1wb3J0MS5zZXRMb2NhdGlvblVSSShudWxsKTsKLSAgICAJCQlhZGRFbGVtZW50VG9MaXN0KGVsZW1lbnQsIGltcG9ydDEpOwotICAgIAkJCXJldHVybiBpbXBvcnQxOwotICAgIAkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0gICAgCQkJdGhyb3cgbmV3IFdTRExFeGNlcHRpb24oCi0gICAgCQkJCSJPVEhFUl9FUlJPUiIsCi0gICAgCQkJCSJVbmFibGUgdG8gcmVzb2x2ZSBpbXBvcnRlZCBkb2N1bWVudCBhdCAnIiArIHMxICsgIicuIiwKLSAgICAJCQkJZXgpOwotICAgIAkJfQotICAgIAotICAgIAl9Ci0gICAgfQotICAgIEltcG9ydCBpbXBvcnREZWYgPSBzdXBlci5wYXJzZUltcG9ydChlbGVtZW50LCBkZWZpbml0aW9uLCBtYXApOwotICAgIGFkZEVsZW1lbnRUb0xpc3QoZWxlbWVudCwgaW1wb3J0RGVmKTsqLwotICAgIEltcG9ydCBpbXBvcnQxID0gZGVmaW5pdGlvbi5jcmVhdGVJbXBvcnQoKTsKLSAgICBTdHJpbmcgcyA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShlbGVtZW50LCAibmFtZXNwYWNlIik7Ci0gICAgU3RyaW5nIHMxID0gRE9NVXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsICJsb2NhdGlvbiIpOwotICAgIGlmIChzICE9IG51bGwpCi0gICAgICBpbXBvcnQxLnNldE5hbWVzcGFjZVVSSShzKTsKLSAgICAvLyBBREQ6IGNoZWNrICJsb2NhdGlvbiIgYXR0cmlidXRlIGZvciBlbXB0eSAKLSAgICAvLyBzdHJpbmcgdG8gcHJldmVudCBzZWxmLWRlZmVuaXRpb24gYXNzaWduaW5nCi0gICAgaWYgKChzMSAhPSBudWxsKSAmJiAoczEubGVuZ3RoKCkgPiAwKSkKLSAgICB7Ci0gICAgICBpbXBvcnQxLnNldExvY2F0aW9uVVJJKHMxKTsKLSAgICAgIGlmIChpbXBvcnREb2N1bWVudHMpCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHMyID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudEJhc2VVUkkoKTsKLSAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24xID0gbnVsbDsKLSAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRzb3VyY2UgPSBudWxsOwotICAgICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICAgIGlmIChsb2MgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dHNvdXJjZSA9IGxvYy5nZXRJbXBvcnRJbnB1dFNvdXJjZShzMiwgczEpOwotICAgICAgICAgICAgU3RyaW5nIHMzID0gbG9jLmdldExhdGVzdEltcG9ydFVSSSgpOwotICAgICAgICAgICAgZGVmaW5pdGlvbjEgPSAoRGVmaW5pdGlvbikgbWFwLmdldChzMyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBVUkwgdXJsMSA9IHMyID09IG51bGwgPyBudWxsIDogU3RyaW5nVXRpbHMuZ2V0VVJMKG51bGwsIHMyKTsKLSAgICAgICAgICAgIHVybCA9IFN0cmluZ1V0aWxzLmdldFVSTCh1cmwxLCBzMSk7Ci0gICAgICAgICAgICBkZWZpbml0aW9uMSA9IChEZWZpbml0aW9uKSBtYXAuZ2V0KHVybC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uMSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaW5wdXRzdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vaW1wb3J0MS5zZXRMb2NhdGlvblVSSShudWxsKTsKLSAgICAgICAgICAgICAgICBhZGRFbGVtZW50VG9MaXN0KGVsZW1lbnQsIGltcG9ydDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnQxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChpbnB1dHN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGlucHV0c291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0c3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlZmluaXRpb24xID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGlucHV0c291cmNlID09IG51bGwpCi0gICAgICAgICAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJPVEhFUl9FUlJPUiIsCi0gICAgICAgICAgICAgICAgIlVuYWJsZSB0byBsb2NhdGUgaW1wb3J0ZWQgZG9jdW1lbnQgYXQgJyIKLSAgICAgICAgICAgICAgICAgICsgczEKLSAgICAgICAgICAgICAgICAgICsgIiciCi0gICAgICAgICAgICAgICAgICArIChzMiAhPSBudWxsID8gIiwgcmVsYXRpdmUgdG8gJyIgKyBzMiArICInLiIgOiAiLiIpKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkb2N1bWVudCA9IGdldERvY3VtZW50KGlucHV0c291cmNlLCBzMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoV1NETEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYWRkRWxlbWVudFRvTGlzdChlbGVtZW50LCBpbXBvcnQxKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5wdXRzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgaW5wdXRzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudDIgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ERUZJTklUSU9OUywgZWxlbWVudDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAiUmV0cmlldmluZyBkb2N1bWVudCBhdCAnIgotICAgICAgICAgICAgICAgICAgICArIHMxCi0gICAgICAgICAgICAgICAgICAgICsgIiciCi0gICAgICAgICAgICAgICAgICAgICsgKHMyICE9IG51bGwgPyAiLCByZWxhdGl2ZSB0byAnIiArIHMyICsgIicuIiA6ICIuIikpOwotICAgICAgICAgICAgICBTdHJpbmcgczQgPQotICAgICAgICAgICAgICAgIGxvYyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICA/IHVybCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICA/IHMxCi0gICAgICAgICAgICAgICAgICA6IHVybC50b1N0cmluZygpIDogbG9jLmdldExhdGVzdEltcG9ydFVSSSgpOwotICAgICAgICAgICAgICBkZWZpbml0aW9uMSA9IHJlYWRXU0RMKHM0LCBlbGVtZW50MiwgbWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgUU5hbWUgcW5hbWUgPSBRTmFtZVV0aWxzLm5ld1FOYW1lKGVsZW1lbnQyKTsKLSAgICAgICAgICAgICAgaWYgKENvbnN0YW50cy5YU0RfUU5BTUVfTElTVC5jb250YWlucyhxbmFtZSkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXU0RMRmFjdG9yeSB3c2RsZmFjdG9yeSA9Ci0gICAgICAgICAgICAgICAgICBmYWN0b3J5SW1wbE5hbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgOiBXU0RMRmFjdG9yeS5uZXdJbnN0YW5jZShmYWN0b3J5SW1wbE5hbWUpOwotICAgICAgICAgICAgICAgIGRlZmluaXRpb24xID0gd3NkbGZhY3RvcnkubmV3RGVmaW5pdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChleHRSZWcgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24xLnNldEV4dGVuc2lvblJlZ2lzdHJ5KGV4dFJlZyk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHM1ID0KLSAgICAgICAgICAgICAgICAgIGxvYyA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gdXJsID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgPyBzMQotICAgICAgICAgICAgICAgICAgICA6IHVybC50b1N0cmluZygpIDogbG9jLmdldExhdGVzdEltcG9ydFVSSSgpOwotICAgICAgICAgICAgICAgIGRlZmluaXRpb24xLnNldERvY3VtZW50QmFzZVVSSShzNSk7Ci0gICAgICAgICAgICAgICAgLyogRG9uJ3QgYWRkIHR5cGVzIGVsZW1lbnQgc2luY2UgaXQgZG9lc24ndCBleGlzdC4gIEFkZGluZyBpdCBjYXVzZXMgcHJvYmxlbXMKLSAgICAgICAgICAgICAgICAgKiBzaW5jZSBpdCB3aWxsIGFkZCBhIHR5cGVzIGVsZW1lbnQgZm9yIHByb2Nlc3NpbmcgdGhhdCBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgICAgICAgICBUeXBlcyB0eXBlcyA9IGRlZmluaXRpb24xLmNyZWF0ZVR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVua25vd25leHRlbnNpYmlsaXR5ZWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgCW5ldyBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB1bmtub3duZXh0ZW5zaWJpbGl0eWVsZW1lbnQuc2V0RWxlbWVudChlbGVtZW50Mik7Ci0gICAgICAgICAgICAgICAgdHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgCXVua25vd25leHRlbnNpYmlsaXR5ZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbjEuc2V0VHlwZXModHlwZXMpOwotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlZmluaXRpb24xICE9IG51bGwpCi0gICAgICAgICAgICBpbXBvcnQxLnNldERlZmluaXRpb24oZGVmaW5pdGlvbjEpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxleGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICB3c2RsZXhjZXB0aW9uLnNldExvY2F0aW9uKFhQYXRoVXRpbHMuZ2V0WFBhdGhFeHByRnJvbU5vZGUoZWxlbWVudCkpOwotICAgICAgICAgIHRocm93IHdzZGxleGNlcHRpb247Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpCi0gICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgV1NETEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJPVEhFUl9FUlJPUiIsCi0gICAgICAgICAgICAiVW5hYmxlIHRvIHJlc29sdmUgaW1wb3J0ZWQgZG9jdW1lbnQgYXQgJyIgKyBzMSArICInLiIsCi0gICAgICAgICAgICB0aHJvd2FibGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoRWxlbWVudCBlbGVtZW50MSA9IERPTVV0aWxzLmdldEZpcnN0Q2hpbGRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgZWxlbWVudDEgIT0gbnVsbDsKLSAgICAgIGVsZW1lbnQxID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KGVsZW1lbnQxKSkKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCBlbGVtZW50MSkpCi0gICAgICAgIGltcG9ydDEuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZWxlbWVudDEpOwotICAgICAgZWxzZQotICAgICAgICBET01VdGlscy50aHJvd1dTRExFeGNlcHRpb24oZWxlbWVudDEpOwotCi0gICAgcmV0dXJuIGltcG9ydDE7Ci0KLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlVHlwZXMob3JnLnczYy5kb20uRWxlbWVudCwgamF2YXgud3NkbC5EZWZpbml0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIFR5cGVzIHBhcnNlVHlwZXMoRWxlbWVudCB0eXBlc0VsLCBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgVHlwZXMgdHlwZXMgPSBzdXBlci5wYXJzZVR5cGVzKHR5cGVzRWwsIGRlZik7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3QodHlwZXNFbCwgdHlwZXMpOwotCi0gICAgcmV0dXJuIHR5cGVzOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VCaW5kaW5nKG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nIHBhcnNlQmluZGluZyhFbGVtZW50IGJpbmRpbmdFbCwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmcgYmluZGluZyA9IHN1cGVyLnBhcnNlQmluZGluZyhiaW5kaW5nRWwsIGRlZik7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3QoYmluZGluZ0VsLCBiaW5kaW5nKTsKLQotICAgIHJldHVybiBiaW5kaW5nOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VCaW5kaW5nT3BlcmF0aW9uKG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuUG9ydFR5cGUsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nT3BlcmF0aW9uIHBhcnNlQmluZGluZ09wZXJhdGlvbigKLSAgICBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbCwKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gbnVsbDsKLQotICAgIC8vIFRoZSBmb2xsb3cgdHJ5LWNhdGNoIHdhcyBhZGRlZCB0byBkZXRlY3Qgd2hlbiBhIGR1cGxpY2F0ZSBvcGVyYXRpb24gbmFtZSB3YXMgZGV0ZWN0ZWQKLSAgICB0cnkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uID0KLSAgICAgICAgc3VwZXIucGFyc2VCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb25FbCwgcG9ydFR5cGUsIGRlZik7Ci0gICAgfQotCi0gICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpCi0gICAgewotICAgICAgaWYgKGlhZS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aCgiRHVwbGljYXRlIikpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24gPQotICAgICAgICAgIHBhcnNlQmluZGluZ09wZXJhdGlvbldpdGhEdXBsaWNhdGVOYW1lcygKLSAgICAgICAgICAgIGJpbmRpbmdPcGVyYXRpb25FbCwKLSAgICAgICAgICAgIHBvcnRUeXBlLAotICAgICAgICAgICAgZGVmKTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0aHJvdyBpYWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBpZiAoYmluZGluZ09wZXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGFkZEVsZW1lbnRUb0xpc3QoYmluZGluZ09wZXJhdGlvbkVsLCBiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYmluZGluZ09wZXJhdGlvbjsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlQmluZGluZ0lucHV0KG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nSW5wdXQgcGFyc2VCaW5kaW5nSW5wdXQoCi0gICAgRWxlbWVudCBiaW5kaW5nSW5wdXRFbCwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IHN1cGVyLnBhcnNlQmluZGluZ0lucHV0KGJpbmRpbmdJbnB1dEVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGJpbmRpbmdJbnB1dEVsLCBiaW5kaW5nSW5wdXQpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdJbnB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlQmluZGluZ091dHB1dChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgQmluZGluZ091dHB1dCBwYXJzZUJpbmRpbmdPdXRwdXQoCi0gICAgRWxlbWVudCBiaW5kaW5nT3V0cHV0RWwsCi0gICAgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9Ci0gICAgICBzdXBlci5wYXJzZUJpbmRpbmdPdXRwdXQoYmluZGluZ091dHB1dEVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGJpbmRpbmdPdXRwdXRFbCwgYmluZGluZ091dHB1dCk7Ci0KLSAgICByZXR1cm4gYmluZGluZ091dHB1dDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlQmluZGluZ0ZhdWx0KG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBCaW5kaW5nRmF1bHQgcGFyc2VCaW5kaW5nRmF1bHQoCi0gICAgRWxlbWVudCBiaW5kaW5nRmF1bHRFbCwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ0ZhdWx0IGJpbmRpbmdGYXVsdCA9IHN1cGVyLnBhcnNlQmluZGluZ0ZhdWx0KGJpbmRpbmdGYXVsdEVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGJpbmRpbmdGYXVsdEVsLCBiaW5kaW5nRmF1bHQpOwotCi0gICAgcmV0dXJuIGJpbmRpbmdGYXVsdDsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlTWVzc2FnZShvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgTWVzc2FnZSBwYXJzZU1lc3NhZ2UoRWxlbWVudCBtc2dFbCwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIE1lc3NhZ2UgbXNnID0gc3VwZXIucGFyc2VNZXNzYWdlKG1zZ0VsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KG1zZ0VsLCBtc2cpOwotCi0gICAgcmV0dXJuIG1zZzsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlUGFydChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgUGFydCBwYXJzZVBhcnQoRWxlbWVudCBwYXJ0RWwsIERlZmluaXRpb24gZGVmKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgLy9QYXJ0IHBhcnQgPSBzdXBlci5wYXJzZVBhcnQocGFydEVsLCBkZWYpOwotCi0gICAgUGFydCBwYXJ0ID0gZGVmLmNyZWF0ZVBhcnQoKTsKLSAgICBTdHJpbmcgbmFtZSA9IERPTVV0aWxzLmdldEF0dHJpYnV0ZShwYXJ0RWwsIENvbnN0YW50cy5BVFRSX05BTUUpOwotCi0gICAgLy8gV1MtSTogVGhlIHRyeS1jYXRjaCB3YXMgYWRkZWQgZm9yIFdTSTI0MTYKLSAgICBRTmFtZSBlbGVtZW50TmFtZTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGVsZW1lbnROYW1lID0KLSAgICAgICAgRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoCi0gICAgICAgICAgcGFydEVsLAotICAgICAgICAgIENvbnN0YW50cy5BVFRSX0VMRU1FTlQsCi0gICAgICAgICAgQ29uc3RhbnRzLkVMRU1fTUVTU0FHRSwKLSAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotCi0gICAgY2F0Y2ggKFdTRExFeGNlcHRpb24gd2UpCi0gICAgewotICAgICAgU3RyaW5nIHByZWZpeGVkVmFsdWUgPQotICAgICAgICBET01VdGlscy5nZXRBdHRyaWJ1dGUocGFydEVsLCBDb25zdGFudHMuQVRUUl9FTEVNRU5UKTsKLSAgICAgIGludCBpbmRleCA9IHByZWZpeGVkVmFsdWUuaW5kZXhPZignOicpOwotICAgICAgU3RyaW5nIHByZWZpeCA9IChpbmRleCAhPSAtMSkgPyBwcmVmaXhlZFZhbHVlLnN1YnN0cmluZygwLCBpbmRleCkgOiBudWxsOwotICAgICAgU3RyaW5nIGxvY2FsUGFydCA9IHByZWZpeGVkVmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0KLSAgICAgIGVsZW1lbnROYW1lID0gbmV3IFFOYW1lKGxvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgUU5hbWUgdHlwZU5hbWUgPQotICAgICAgRE9NVXRpbHMuZ2V0UXVhbGlmaWVkQXR0cmlidXRlVmFsdWUoCi0gICAgICAgIHBhcnRFbCwKLSAgICAgICAgQ29uc3RhbnRzLkFUVFJfVFlQRSwKLSAgICAgICAgQ29uc3RhbnRzLkVMRU1fTUVTU0FHRSwKLSAgICAgICAgZmFsc2UpOwotCi0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwYXJ0LnNldE5hbWUobmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKGVsZW1lbnROYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRFbGVtZW50TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgewotICAgICAgcGFydC5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgfQotCi0gICAgRWxlbWVudCB0ZW1wRWwgPSBET01VdGlscy5nZXRGaXJzdENoaWxkRWxlbWVudChwYXJ0RWwpOwotCi0gICAgd2hpbGUgKHRlbXBFbCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9ET0NVTUVOVEFUSU9OLCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBwYXJ0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHRlbXBFbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIERPTVV0aWxzLnRocm93V1NETEV4Y2VwdGlvbih0ZW1wRWwpOwotICAgICAgfQotCi0gICAgICB0ZW1wRWwgPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQodGVtcEVsKTsKLSAgICB9Ci0KLSAgICBNYXAgZXh0ZW5zaW9uQXR0cmlidXRlcyA9IHBhcnQuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlcygpOwotCi0gICAgZXh0ZW5zaW9uQXR0cmlidXRlcy5wdXRBbGwoZ2V0UGFydEF0dHJpYnV0ZXMocGFydEVsLCBkZWYpKTsKLQotICAgIC8vIE5lZWQgdG8gZG8gc29tZXRoaW5nIGhlcmUgdG8gbG9jYXRlIHBhcnQgZGVmaW5pdGlvbi4KLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChwYXJ0RWwsIHBhcnQpOwotCi0gICAgcmV0dXJuIHBhcnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZVBvcnRUeXBlKG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBQb3J0VHlwZSBwYXJzZVBvcnRUeXBlKEVsZW1lbnQgcG9ydFR5cGVFbCwgRGVmaW5pdGlvbiBkZWYpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gc3VwZXIucGFyc2VQb3J0VHlwZShwb3J0VHlwZUVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KHBvcnRUeXBlRWwsIHBvcnRUeXBlKTsKLQotICAgIHJldHVybiBwb3J0VHlwZTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBjb20uaWJtLndzZGwueG1sLldTRExSZWFkZXJJbXBsI3BhcnNlT3BlcmF0aW9uKG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuUG9ydFR5cGUsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBPcGVyYXRpb24gcGFyc2VPcGVyYXRpb24oCi0gICAgRWxlbWVudCBvcEVsLAotICAgIFBvcnRUeXBlIHBvcnRUeXBlLAotICAgIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBPcGVyYXRpb24gb3AgPSBzdXBlci5wYXJzZU9wZXJhdGlvbihvcEVsLCBwb3J0VHlwZSwgZGVmKTsKLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChvcEVsLCBvcCk7Ci0KLSAgICByZXR1cm4gb3A7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZVNlcnZpY2Uob3JnLnczYy5kb20uRWxlbWVudCwgamF2YXgud3NkbC5EZWZpbml0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIFNlcnZpY2UgcGFyc2VTZXJ2aWNlKEVsZW1lbnQgc2VydmljZUVsLCBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgU2VydmljZSBzZXJ2aWNlID0gc3VwZXIucGFyc2VTZXJ2aWNlKHNlcnZpY2VFbCwgZGVmKTsKLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChzZXJ2aWNlRWwsIHNlcnZpY2UpOwotCi0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZVBvcnQob3JnLnczYy5kb20uRWxlbWVudCwgamF2YXgud3NkbC5EZWZpbml0aW9uKQotICAgKi8KLSAgcHJvdGVjdGVkIFBvcnQgcGFyc2VQb3J0KEVsZW1lbnQgcG9ydEVsLCBEZWZpbml0aW9uIGRlZikgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIFBvcnQgcG9ydCA9IHN1cGVyLnBhcnNlUG9ydChwb3J0RWwsIGRlZik7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3QocG9ydEVsLCBwb3J0KTsKLQotICAgIHJldHVybiBwb3J0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VFeHRlbnNpYmlsaXR5RWxlbWVudChqYXZhLmxhbmcuQ2xhc3MsIG9yZy53M2MuZG9tLkVsZW1lbnQsIGphdmF4LndzZGwuRGVmaW5pdGlvbikKLSAgICovCi0gIHByb3RlY3RlZCBFeHRlbnNpYmlsaXR5RWxlbWVudCBwYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KAotICAgIENsYXNzIHBhcmVudFR5cGUsCi0gICAgRWxlbWVudCBlbCwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbWVudCA9Ci0gICAgICBzdXBlci5wYXJzZUV4dGVuc2liaWxpdHlFbGVtZW50KHBhcmVudFR5cGUsIGVsLCBkZWYpOwotCi0gICAgLy8gVHJ5IHRvIGFkZCBlbGVtZW50IHRvIGxpc3QKLSAgICBhZGRFbGVtZW50VG9MaXN0KGVsLCBleHRFbGVtZW50KTsKLQotICAgIHJldHVybiBleHRFbGVtZW50OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VJbnB1dChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgSW5wdXQgcGFyc2VJbnB1dChFbGVtZW50IGlucHV0RWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBJbnB1dCBpbnB1dCA9IHN1cGVyLnBhcnNlSW5wdXQoaW5wdXRFbCwgZGVmKTsKLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChpbnB1dEVsLCBpbnB1dCk7Ci0KLSAgICByZXR1cm4gaW5wdXQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNwYXJzZU91dHB1dChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgT3V0cHV0IHBhcnNlT3V0cHV0KEVsZW1lbnQgb3V0cHV0RWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBPdXRwdXQgb3V0cHV0ID0gc3VwZXIucGFyc2VPdXRwdXQob3V0cHV0RWwsIGRlZik7Ci0KLSAgICAvLyBUcnkgdG8gYWRkIGVsZW1lbnQgdG8gbGlzdAotICAgIGFkZEVsZW1lbnRUb0xpc3Qob3V0cHV0RWwsIG91dHB1dCk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0ud3NkbC54bWwuV1NETFJlYWRlckltcGwjcGFyc2VGYXVsdChvcmcudzNjLmRvbS5FbGVtZW50LCBqYXZheC53c2RsLkRlZmluaXRpb24pCi0gICAqLwotICBwcm90ZWN0ZWQgRmF1bHQgcGFyc2VGYXVsdChFbGVtZW50IGZhdWx0RWwsIERlZmluaXRpb24gZGVmKQotICAgIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBGYXVsdCBmYXVsdCA9IHN1cGVyLnBhcnNlRmF1bHQoZmF1bHRFbCwgZGVmKTsKLQotICAgIC8vIFRyeSB0byBhZGQgZWxlbWVudCB0byBsaXN0Ci0gICAgYWRkRWxlbWVudFRvTGlzdChmYXVsdEVsLCBmYXVsdCk7Ci0KLSAgICByZXR1cm4gZmF1bHQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmlibS53c2RsLnhtbC5XU0RMUmVhZGVySW1wbCNnZXREb2N1bWVudChvcmcueG1sLnNheC5JbnB1dFNvdXJjZSwgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHByb3RlY3RlZCBEb2N1bWVudCBnZXREb2N1bWVudChJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgU3RyaW5nIGRlc2MpCi0gICAgdGhyb3dzIFdTRExFeGNlcHRpb24KLSAgewotICAgIENsYXNzTG9hZGVyIGN1cnJlbnRMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIHRyeQotCXsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKFdTRExSZWFkZXJJbXBsLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyAgIAkKLQkKLSAgCSAgLy9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICBuZXcgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsKCk7Ci0KLSAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCi0gICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQotICAgICAgcmV0dXJuIGRvYzsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0RMRXhjZXB0aW9uKAotICAgICAgICBXU0RMRXhjZXB0aW9uLlBBUlNFUl9FUlJPUiwKLSAgICAgICAgIlByb2JsZW0gcGFyc2luZyAnIiArIGRlc2MgKyAiJy4iLAotICAgICAgICB0KTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsgCi0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50TG9hZGVyKTsKLSAgICB9ICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBlbGVtZW50IGxpc3QuCi0gICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgbGlzdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMRWxlbWVudExpc3QgZ2V0RWxlbWVudExpc3QoKQotICB7Ci0gICAgcmV0dXJuIHRoaXMud3NkbEVsZW1lbnRMaXN0OwotICB9Ci0KLSAgLyoqIAotICAgKiBBZGQgV1NETCBlbGVtZW50IHRvIGVsZW1lbnQgbGlzdC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhZGRFbGVtZW50VG9MaXN0KEVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHdzZGxFbGVtZW50KQotICB7Ci0gICAgRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbiA9IG51bGw7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBTZWUgaWYgdGhlIGVsZW1lbnQgb2JqZWN0IGlzIGFuIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkVsZW1lbnRJbXBsCi0gICAgICBFbGVtZW50SW1wbCBlbGVtZW50SW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotICAgICAgLy8gSWYgaXQgaXMsIHRoZW4gZ2V0IHRoZSBlbGVtZW50IGxvY2F0aW9uIGluZm9ybWF0aW9uCi0gICAgICBlbGVtZW50TG9jYXRpb24gPQotICAgICAgICAoRWxlbWVudExvY2F0aW9uKSBlbGVtZW50SW1wbC5nZXRVc2VyRGF0YShFbGVtZW50TG9jYXRpb24uS0VZX05BTUUpOwotCi0gICAgICAvLyBBZGQgaXQgdG8gdGhlIGxpc3QKLSAgICAgIHRoaXMud3NkbEVsZW1lbnRMaXN0LmFkZEVsZW1lbnQod3NkbEVsZW1lbnQsIGVsZW1lbnRMb2NhdGlvbik7Ci0gICAgfQotCi0gICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpCi0gICAgewotICAgICAgLy8gQUREOiBTaG91bGQgd2UgYWRkIHRoZSBlbGVtZW50IHdpdGggYSBudWxsIG9yIHplcm8gbG9jYXRpb24/Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgd2hlbiBhIFdTREwgZG9jdW1lbnQgY29udGFpbnMgZHVwbGljYXRlIG9wZXJhdGlvbiBuYW1lcy4KLSAgICogSXQgaXMgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIHBhcnNlQmluZGluZ09wZXJhdGlvbiBtZXRob2QsIGV4Y2VwdCB0aGF0IGl0IHdpbGwKLSAgICoganVzdCBmaW5kIHRoZSBmaXJzdCBvcGVyYXRpb24gdGhhdCBtYXRjaGVzIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBCaW5kaW5nT3BlcmF0aW9uIHBhcnNlQmluZGluZ09wZXJhdGlvbldpdGhEdXBsaWNhdGVOYW1lcygKLSAgICBFbGVtZW50IGJpbmRpbmdPcGVyYXRpb25FbCwKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSwKLSAgICBEZWZpbml0aW9uIGRlZikKLSAgICB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uID0gZGVmLmNyZWF0ZUJpbmRpbmdPcGVyYXRpb24oKTsKLSAgICBTdHJpbmcgbmFtZSA9Ci0gICAgICBET01VdGlscy5nZXRBdHRyaWJ1dGUoYmluZGluZ09wZXJhdGlvbkVsLCBDb25zdGFudHMuQVRUUl9OQU1FKTsKLQotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgewotICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEVsZW1lbnQgdGVtcEVsID0gRE9NVXRpbHMuZ2V0Rmlyc3RDaGlsZEVsZW1lbnQoYmluZGluZ09wZXJhdGlvbkVsKTsKLQotICAgIHdoaWxlICh0ZW1wRWwgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fRE9DVU1FTlRBVElPTiwgdGVtcEVsKSkKLSAgICAgIHsKLSAgICAgICAgYmluZGluZ09wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudCh0ZW1wRWwpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoUU5hbWVVdGlscy5tYXRjaGVzKENvbnN0YW50cy5RX0VMRU1fSU5QVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ0lucHV0KHBhcnNlQmluZGluZ0lucHV0KHRlbXBFbCwgZGVmKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChRTmFtZVV0aWxzLm1hdGNoZXMoQ29uc3RhbnRzLlFfRUxFTV9PVVRQVVQsIHRlbXBFbCkpCi0gICAgICB7Ci0gICAgICAgIGJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChwYXJzZUJpbmRpbmdPdXRwdXQodGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFFOYW1lVXRpbHMubWF0Y2hlcyhDb25zdGFudHMuUV9FTEVNX0ZBVUxULCB0ZW1wRWwpKQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChwYXJzZUJpbmRpbmdGYXVsdCh0ZW1wRWwsIGRlZikpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KAotICAgICAgICAgIHBhcnNlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoQmluZGluZ09wZXJhdGlvbi5jbGFzcywgdGVtcEVsLCBkZWYpKTsKLSAgICAgIH0KLQotICAgICAgdGVtcEVsID0gRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KHRlbXBFbCk7Ci0gICAgfQotCi0gICAgaWYgKHBvcnRUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCk7Ci0gICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdPdXRwdXQoKTsKLSAgICAgIFN0cmluZyBpbnB1dE5hbWUgPSAoYmluZGluZ0lucHV0ICE9IG51bGwgPyBiaW5kaW5nSW5wdXQuZ2V0TmFtZSgpIDogbnVsbCk7Ci0gICAgICBTdHJpbmcgb3V0cHV0TmFtZSA9Ci0gICAgICAgIChiaW5kaW5nT3V0cHV0ICE9IG51bGwgPyBiaW5kaW5nT3V0cHV0LmdldE5hbWUoKSA6IG51bGwpOwotCi0gICAgICAvL09wZXJhdGlvbiBvcCA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbihuYW1lLCBpbnB1dE5hbWUsIG91dHB1dE5hbWUpOwotICAgICAgLy8gR2V0IGFsbCBvcGVyYXRpb25zLCBhbmQgdGhlbiBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBtYXRjaGVzCi0gICAgICBPcGVyYXRpb24gb3AgPSBudWxsLCBjaGVja09wZXJhdGlvbjsKLSAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpICYmIG9wID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIEdldCB0aGUgbmV4dCBvcGVyYXRpb24KLSAgICAgICAgY2hlY2tPcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBvcGVyYXRpb24gbmFtZSwgaW5wdXQgbmFtZSwgYW5kIG91dHB1dCBuYW1lCi0gICAgICAgIFN0cmluZyBjaGVja05hbWUgPSBjaGVja09wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBjaGVja0lucHV0TmFtZSA9Ci0gICAgICAgICAgKGNoZWNrT3BlcmF0aW9uLmdldElucHV0KCkgPT0gbnVsbAotICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICA6IGNoZWNrT3BlcmF0aW9uLmdldElucHV0KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgU3RyaW5nIGNoZWNrT3V0cHV0TmFtZSA9Ci0gICAgICAgICAgKGNoZWNrT3BlcmF0aW9uLmdldE91dHB1dCgpID09IG51bGwKLSAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgOiBjaGVja09wZXJhdGlvbi5nZXRPdXRwdXQoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIElmIHRoZSBuYW1lcyBtYXRjaCwgdGhlbiB0aGF0IG9wZXJhdGlvbgotICAgICAgICBpZiAoKGNoZWNrTmFtZSAhPSBudWxsICYmIGNoZWNrTmFtZS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgJiYgKChjaGVja0lucHV0TmFtZSAhPSBudWxsICYmIGNoZWNrSW5wdXROYW1lLmVxdWFscyhpbnB1dE5hbWUpKQotICAgICAgICAgICAgfHwgKGNoZWNrSW5wdXROYW1lID09IG51bGwgJiYgaW5wdXROYW1lID09IG51bGwpKQotICAgICAgICAgICYmICgoY2hlY2tPdXRwdXROYW1lICE9IG51bGwgJiYgY2hlY2tPdXRwdXROYW1lLmVxdWFscyhvdXRwdXROYW1lKSkKLSAgICAgICAgICAgIHx8IChjaGVja091dHB1dE5hbWUgPT0gbnVsbCAmJiBvdXRwdXROYW1lID09IG51bGwpKSkKLSAgICAgICAgewotICAgICAgICAgIG9wID0gY2hlY2tPcGVyYXRpb247Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG9wID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG9wID0gZGVmLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgICAgICBvcC5zZXROYW1lKG5hbWUpOwotICAgICAgICBwb3J0VHlwZS5hZGRPcGVyYXRpb24ob3ApOwotICAgICAgfQotCi0gICAgICBiaW5kaW5nT3BlcmF0aW9uLnNldE9wZXJhdGlvbihvcCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJpbmRpbmdPcGVyYXRpb247Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvV1NETFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC9XU0RMVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0MDhmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC9XU0RMVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lDb25zdGFudHM7Ci0KLS8qKgotICogU2V0IG9mIFhNTCByZWxhdGVkIHV0aWxpdGllcy4KLSAqIAotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdTRExVdGlscwotewotCi0gIC8qKgotICAgKiBNZXRob2QgaXNScGNMaXRlcmFsLgotICAgKiBAcGFyYW0gYmluZGluZ1N0eWxlIGEgYmluZGluZyBzdHlsZS4KLSAgICogQHBhcmFtIG9wZXJhdGlvbiBhIFdTREwgYmluZGluZyBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBiaW5kaW5nIGlzIHJwYyBsaXRlcmFsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUnBjTGl0ZXJhbCgKLSAgICBTdHJpbmcgYmluZGluZ1N0eWxlLAotICAgIEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgcmV0dXJuIGNoZWNrU3R5bGVBbmRVc2UoCi0gICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JJTkRfU1RZTEVfUlBDLAotICAgICAgV1NJQ29uc3RhbnRzLkFUVFJWQUxfU09BUF9CT0RZX1VTRV9MSVQsCi0gICAgICBiaW5kaW5nU3R5bGUsCi0gICAgICBvcGVyYXRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBpc0RvY0xpdGVyYWwuCi0gICAqIEBwYXJhbSBiaW5kaW5nU3R5bGUgIHRoZSBiaW5kaW5nIHN0eWxlLgotICAgKiBAcGFyYW0gb3BlcmF0aW9uIGEgV1NETCBiaW5kaW5nIG9wZXJhdGlvbi4KLSAgICogQHJldHVybiB0cnVlIGlmIGJpbmRpbmcgaXMgZG9jdW1lbnQgbGl0ZXJhbC4gCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2NMaXRlcmFsKAotICAgIFN0cmluZyBiaW5kaW5nU3R5bGUsCi0gICAgQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICByZXR1cm4gY2hlY2tTdHlsZUFuZFVzZSgKLSAgICAgIFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQklORF9TVFlMRV9ET0MsCi0gICAgICBXU0lDb25zdGFudHMuQVRUUlZBTF9TT0FQX0JPRFlfVVNFX0xJVCwKLSAgICAgIGJpbmRpbmdTdHlsZSwKLSAgICAgIG9wZXJhdGlvbik7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGNoZWNrU3R5bGVBbmRVc2UuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrU3R5bGVBbmRVc2UoCi0gICAgU3RyaW5nIGNoZWNrU3R5bGUsCi0gICAgU3RyaW5nIGNoZWNrVXNlLAotICAgIFN0cmluZyBiaW5kaW5nU3R5bGUsCi0gICAgQmluZGluZ09wZXJhdGlvbiBiaW5kaW5nT3BlcmF0aW9uKQotICB7Ci0gICAgYm9vbGVhbiBzdHlsZUZvdW5kID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBzdHlsZUFuZFVzZUZvdW5kID0gZmFsc2U7Ci0KLSAgICAvLyBGaW5kIHRoZSBzb2FwYmluZDpvcGVyYXRpb24gZWxlbWVudAotICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IGdldFNvYXBPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZXh0IGVsZW1lbnRzLCB0aGVuIGNoZWNrIGFnYWluc3QgYmluZGluZyBzdHlsZQotICAgIGlmICgoc29hcE9wZXJhdGlvbiA9PSBudWxsKSB8fCAoc29hcE9wZXJhdGlvbi5nZXRTdHlsZSgpID09IG51bGwpKQotICAgIHsKLSAgICAgIGlmIChjaGVja1N0eWxlLmVxdWFscyhiaW5kaW5nU3R5bGUpKQotICAgICAgICBzdHlsZUZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKGNoZWNrU3R5bGUuZXF1YWxzKHNvYXBPcGVyYXRpb24uZ2V0U3R5bGUoKSkpCi0gICAgICAgIHN0eWxlRm91bmQgPSB0cnVlOwotICAgIH0KLQotICAgIC8vIElmIHN0eWxlIGZvdW5kIHRoZW4gY2hlY2sgdXNlCi0gICAgaWYgKHN0eWxlRm91bmQpCi0gICAgewotICAgICAgLy8gRmluZCB0aGUgc29hcGJpbmQ6Ym9keSBlbGVtZW50Ci0gICAgICBTT0FQQm9keSBzb2FwQm9keSA9IGdldElucHV0U29hcEJvZHkoYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBzb2FwYmluZDpib2R5LCB0aGVuIGNoZWNrIGFnYWluc3QgZGVmYXVsdCB1c2UgdmFsdWUKLSAgICAgIGlmICgoc29hcEJvZHkgPT0gbnVsbCkgfHwgKHNvYXBCb2R5LmdldFVzZSgpID09IG51bGwpKQotICAgICAgewotICAgICAgICBpZiAoY2hlY2tVc2UuZXF1YWxzKFdTSUNvbnN0YW50cy5BVFRSVkFMX1NPQVBfQk9EWV9VU0VfTElUKSkKLSAgICAgICAgICBzdHlsZUFuZFVzZUZvdW5kID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoY2hlY2tVc2UuZXF1YWxzKHNvYXBCb2R5LmdldFVzZSgpKSkKLSAgICAgICAgICBzdHlsZUFuZFVzZUZvdW5kID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3R5bGVBbmRVc2VGb3VuZDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc29hcGJpbmQ6YmluZGluZy4KLSAgICogQHBhcmFtIGJpbmRpbmcgIGEgQmluZGluZyBvYmplY3QuCi0gICAqIEByZXR1cm4gc29hcGJpbmQ6YmluZGluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmcgZ2V0U29hcEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSBudWxsOwotCi0gICAgTGlzdCBleHRFbGVtZW50cyA9IG51bGw7Ci0KLSAgICAvLyBGaW5kIHRoZSBzb2FwYmluZDpvcGVyYXRpb24gZWxlbWVudAotICAgIGlmICgoZXh0RWxlbWVudHMgPSBiaW5kaW5nLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICBpdGVyYXRvci5oYXNOZXh0KCkgJiYgKHNvYXBCaW5kaW5nID09IG51bGwpOwotICAgICAgICApCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIG9iajsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzb2FwQmluZGluZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgc29hcGJpbmQ6b3BlcmF0aW9uLgotICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbiAgYSBCaW5kaW5nT3BlcmF0aW9uIG9iamVjdC4KLSAgICogQHJldHVybiBzb2FwYmluZDpvcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFNPQVBPcGVyYXRpb24gZ2V0U29hcE9wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24pCi0gIHsKLSAgICBTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24gPSBudWxsOwotCi0gICAgTGlzdCBleHRFbGVtZW50cyA9IG51bGw7Ci0KLSAgICAvLyBGaW5kIHRoZSBzb2FwYmluZDpvcGVyYXRpb24gZWxlbWVudAotICAgIGlmICgoZXh0RWxlbWVudHMgPSBiaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKSAhPSBudWxsKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRFbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICBpdGVyYXRvci5oYXNOZXh0KCkgJiYgKHNvYXBPcGVyYXRpb24gPT0gbnVsbCk7Ci0gICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU09BUE9wZXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgIHNvYXBPcGVyYXRpb24gPSAoU09BUE9wZXJhdGlvbikgb2JqOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvYXBPcGVyYXRpb247Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHNvYXBiaW5kOmJvZHkgZnJvbSBpbnB1dCBlbGVtZW50LgotICAgKiBAcGFyYW0gYmluZGluZ09wZXJhdGlvbiAgdGhlIEJpbmRpbmdPcGVyYXRpb24gb2JqZWN0LgotICAgKiBAcmV0dXJuIHNvYXBiaW5kOmJvZHkgZnJvbSBpbnB1dCBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTT0FQQm9keSBnZXRJbnB1dFNvYXBCb2R5KEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gbnVsbDsKLQotICAgIExpc3QgZXh0RWxlbWVudHMgPSBudWxsOwotCi0gICAgLy8gRmluZCB0aGUgc29hcGJpbmQ6Ym9keSBlbGVtZW50Ci0gICAgaWYgKChleHRFbGVtZW50cyA9Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpKQotICAgICAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZXh0RWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgaXRlcmF0b3IuaGFzTmV4dCgpICYmIChzb2FwQm9keSA9PSBudWxsKTsKLSAgICAgICAgKQotICAgICAgewotICAgICAgICBPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgICAgewotICAgICAgICAgIHNvYXBCb2R5ID0gKFNPQVBCb2R5KSBvYmo7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc29hcEJvZHk7Ci0gIH0KLQotICAvKioKLSAgICogRmluZCBtZXNzYWdlcyByZWZlcmVuY2VkIGJ5IGEgaGVhZGVyIG9yIGhlYWRlcmZhdWx0LgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAgYSBEZWZpbml0aW9uIG9iamVjdC4KLSAgICogQHBhcmFtIGJpbmRpbmcgIGEgQmluZGluZyBvYmplY3QuCi0gICAqIEByZXR1cm4gbWVzc2FnZXMgcmVmZXJlbmNlZCBieSBhIGhlYWRlciBvciBoZWFkZXJmYXVsdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSGFzaFNldCBmaW5kTWVzc2FnZXMoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb247Ci0KLSAgICBIYXNoU2V0IHRlbXBNZXNzYWdlcywgYmluZGluZ01lc3NhZ2VzID0gbmV3IEhhc2hTZXQoKTsKLQotICAgIEhhc2hTZXQgcG9ydFR5cGVNZXNzYWdlcyA9IGZpbmRNZXNzYWdlcyhiaW5kaW5nLmdldFBvcnRUeXBlKCkpOwotCi0gICAgLy8gUHJvY2VzcyBlYWNoIG9wZXJhdGlvbgotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBiaW5kaW5nT3BlcmF0aW9uID0gKEJpbmRpbmdPcGVyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgLy8gUHJvY2VzcyB0aGUgaW5wdXQgYW5kIHRoZW4gdGhlIG91dHB1dAotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0lucHV0KCkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdGVtcE1lc3NhZ2VzID0KLSAgICAgICAgICBmaW5kTWVzc2FnZXMoCi0gICAgICAgICAgICBiaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgICAgICAgIC5nZXRCaW5kaW5nSW5wdXQoKQotICAgICAgICAgICAgICAuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkKLSAgICAgICAgICAgICAgLml0ZXJhdG9yKCksCi0gICAgICAgICAgICBwb3J0VHlwZU1lc3NhZ2VzLAotICAgICAgICAgICAgZGVmaW5pdGlvbik7Ci0KLSAgICAgICAgLy8gQWRkIG1lc3NhZ2VzIHRvIGJpbmRpbmcgbWVzc2FnZSBzZXQKLSAgICAgICAgYmluZGluZ01lc3NhZ2VzLmFkZEFsbCh0ZW1wTWVzc2FnZXMpOwotICAgICAgfQotCi0gICAgICAvLyBQcm9jZXNzIG91dHB1dAotICAgICAgaWYgKGJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRlbXBNZXNzYWdlcyA9Ci0gICAgICAgICAgZmluZE1lc3NhZ2VzKAotICAgICAgICAgICAgYmluZGluZ09wZXJhdGlvbgotICAgICAgICAgICAgICAuZ2V0QmluZGluZ091dHB1dCgpCi0gICAgICAgICAgICAgIC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKQotICAgICAgICAgICAgICAuaXRlcmF0b3IoKSwKLSAgICAgICAgICAgIHBvcnRUeXBlTWVzc2FnZXMsCi0gICAgICAgICAgICBkZWZpbml0aW9uKTsKLQotICAgICAgICAvLyBBZGQgbWVzc2FnZXMgdG8gYmluZGluZyBtZXNzYWdlIHNldAotICAgICAgICBiaW5kaW5nTWVzc2FnZXMuYWRkQWxsKHRlbXBNZXNzYWdlcyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGJpbmRpbmdNZXNzYWdlczsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGEgaGVhZGVyIG9yIGhlYWRlcmZhdWx0LgotICAgKiBAcGFyYW0gcG9ydFR5cGUgYSBQb3J0VHlwZSBvYmplY3QuCi0gICAqIEByZXR1cm4gaGUgbWVzc2FnZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBhIGhlYWRlciBvciBoZWFkZXJmYXVsdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgSGFzaFNldCBmaW5kTWVzc2FnZXMoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBIYXNoU2V0IG1lc3NhZ2VTZXQgPSBuZXcgSGFzaFNldCgpOwotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dEVsZW1lbnQ7Ci0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbjsKLQotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydFR5cGUuZ2V0T3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgbmV4dCBvcGVyYXRpb24gdG8gcHJvY2VzcwotICAgICAgb3BlcmF0aW9uID0gKE9wZXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAvLyBHZXQgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlCi0gICAgICBpZiAob3BlcmF0aW9uLmdldElucHV0KCkgIT0gbnVsbCkKLSAgICAgICAgbWVzc2FnZVNldC5hZGQob3BlcmF0aW9uLmdldElucHV0KCkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIGlmIChvcGVyYXRpb24uZ2V0T3V0cHV0KCkgIT0gbnVsbCkKLSAgICAgICAgbWVzc2FnZVNldC5hZGQob3BlcmF0aW9uLmdldE91dHB1dCgpLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgIC8vIFByb2Nlc3MgYW55IGZhdWx0cwotICAgICAgSXRlcmF0b3IgZmF1bHRzID0gb3BlcmF0aW9uLmdldEZhdWx0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoZmF1bHRzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZVNldC5hZGQoKChGYXVsdCkgZmF1bHRzLm5leHQoKSkuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbWVzc2FnZVNldDsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGEgaGVhZGVyIG9yIGhlYWRlcmZhdWx0LgotICAgKiBAcGFyYW0gZXh0RWxlbWVudExpc3QgYSBsaXN0IG9mIGV4dGVybmFsIGVsZW1lbnRzLgotICAgKiBAcGFyYW0gbWVzc2FnZVNldCBhIHNldCBvZiBtZXNzYWdlcy4KLSAgICogQHBhcmFtIGRlZmluaXRpb24gYSBEZWZpbml0aW9uIG9iamVjdC4KLSAgICogQHJldHVybiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBhIGhlYWRlciBvciBoZWFkZXJmYXVsdC4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgSGFzaFNldCBmaW5kTWVzc2FnZXMoCi0gICAgSXRlcmF0b3IgZXh0RWxlbWVudExpc3QsCi0gICAgSGFzaFNldCBtZXNzYWdlU2V0LAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIEhhc2hTZXQgcmV0dXJuU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRFbGVtZW50OwotICAgIE1lc3NhZ2Ugc2F2ZU1lc3NhZ2UgPSBudWxsOwotCi0gICAgd2hpbGUgKGV4dEVsZW1lbnRMaXN0Lmhhc05leHQoKSkKLSAgICB7Ci0gICAgICAvLyBHZXQgZXh0LiBlbGVtZW50Ci0gICAgICBleHRFbGVtZW50ID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBleHRFbGVtZW50TGlzdC5uZXh0KCk7Ci0KLSAgICAgIFFOYW1lIG1lc3NhZ2VRTmFtZTsKLSAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKLQotICAgICAgLy8gSWYgdGhpcyBpcyBhIHNvYXA6aGVhZGVyIGVsZW1lbnQsIHRoZW4gY2hlY2sgZm9yIG1lc3NhZ2UgcmVmZXJlbmNlCi0gICAgICBpZiAoZXh0RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpCi0gICAgICB7Ci0gICAgICAgIFNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKSBleHRFbGVtZW50OwotICAgICAgICBpZiAoKG1lc3NhZ2VRTmFtZSA9IHNvYXBIZWFkZXIuZ2V0TWVzc2FnZSgpKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgbWVzc2FnZSBub3QgZm91bmQsIHRoZW4gY3JlYXRlIGEgZHVtbXkgbWVzc2FnZSBlbGVtZW50Ci0gICAgICAgICAgaWYgKChtZXNzYWdlID0gZGVmaW5pdGlvbi5nZXRNZXNzYWdlKG1lc3NhZ2VRTmFtZSkpID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZSA9IGRlZmluaXRpb24uY3JlYXRlTWVzc2FnZSgpOwotICAgICAgICAgICAgbWVzc2FnZS5zZXRRTmFtZShtZXNzYWdlUU5hbWUpOwotICAgICAgICAgICAgbWVzc2FnZS5zZXRVbmRlZmluZWQodHJ1ZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCFtZXNzYWdlU2V0LmNvbnRhaW5zKG1lc3NhZ2UpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVyblNldC5hZGQobWVzc2FnZSk7Ci0gICAgICAgICAgICBzYXZlTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBhbnkgaGVhZGVyIGZhdWx0cyB3aXRoaW4gdGhpcyBoZWFkZXIKLSAgICAgICAgSXRlcmF0b3IgaGVhZGVyRmF1bHRMaXN0ID0gc29hcEhlYWRlci5nZXRTT0FQSGVhZGVyRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGhlYWRlckZhdWx0TGlzdC5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgc29hcCBoZWFkZXIgZmF1bHQKLSAgICAgICAgICBTT0FQSGVhZGVyRmF1bHQgc29hcEhlYWRlckZhdWx0ID0KLSAgICAgICAgICAgIChTT0FQSGVhZGVyRmF1bHQpIGhlYWRlckZhdWx0TGlzdC5uZXh0KCk7Ci0gICAgICAgICAgaWYgKChtZXNzYWdlUU5hbWUgPSBzb2FwSGVhZGVyRmF1bHQuZ2V0TWVzc2FnZSgpKSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIG1lc3NhZ2Ugbm90IGZvdW5kLCB0aGVuIGNyZWF0ZSBhIGR1bW15IG1lc3NhZ2UgZWxlbWVudAotICAgICAgICAgICAgaWYgKChtZXNzYWdlID0gZGVmaW5pdGlvbi5nZXRNZXNzYWdlKG1lc3NhZ2VRTmFtZSkpID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1lc3NhZ2UgPSBkZWZpbml0aW9uLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgbWVzc2FnZS5zZXRRTmFtZShtZXNzYWdlUU5hbWUpOwotICAgICAgICAgICAgICBtZXNzYWdlLnNldFVuZGVmaW5lZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgbWVzc2FnZSBub3QgaW4gbWVzc2FnZSBzZXQgYW5kIHJldHVybiBzZXQsIHRoZW4gYWRkIGl0ICAKLSAgICAgICAgICAgIGlmICghbWVzc2FnZVNldC5jb250YWlucyhtZXNzYWdlKQotICAgICAgICAgICAgICAmJiAoKHNhdmVNZXNzYWdlID09IG51bGwpCi0gICAgICAgICAgICAgICAgfHwgKHNhdmVNZXNzYWdlICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICYmICFzYXZlTWVzc2FnZS5nZXRRTmFtZSgpLmVxdWFscyhtZXNzYWdlLmdldFFOYW1lKCkpKSkpCi0gICAgICAgICAgICAgIHJldHVyblNldC5hZGQobWVzc2FnZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHVyblNldDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1Zpc2l0b3JBZGFwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC90cmF2ZXJzYWwvVmlzaXRvckFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM1ZGQ5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC90cmF2ZXJzYWwvVmlzaXRvckFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC50cmF2ZXJzYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoZSBjbGFzcyBhZGFwdHMgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoZSBpbXBsZW1lbnRlZAotICogPGNvZGU+V1NETFZpc2l0b3I8L2NvZGU+IG1ldGhvZHMuCi0gKiAKLSAqIEBhdXRob3IgS3VsaWsKLSAqLwotcHVibGljIGNsYXNzIFZpc2l0b3JBZGFwdG9yIGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIKLXsKLQotICAvLyBvcHRpbWl6YXRpb24gaGludAotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBDbGFzc1tdIG51bGxDbGFzcyA9IG5ldyBDbGFzc1tdIHsKLSAgfTsKLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgT2JqZWN0W10gbnVsbE9iamVjdCA9IG5ldyBPYmplY3RbXSB7Ci0gIH07Ci0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIENsYXNzW10gdmlzaXRvckNsYXNzID0gbmV3IENsYXNzW10geyBXU0RMVmlzaXRvci5jbGFzcyB9OwotCi0gIC8qKgotICAgKiBUaGUgYXJyYXkgaXMgdXNlZCBmb3IgZGV0ZXJtaW5hdGlvbiBvZiBhY3R1YWwgamF2YXgud3NkbCBjbGFzcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NbXSB3c2RsID0KLSAgICBuZXcgQ2xhc3NbXSB7Ci0gICAgICBQYXJ0LmNsYXNzLAotICAgICAgU2VydmljZS5jbGFzcywKLSAgICAgIFR5cGVzLmNsYXNzLAotICAgICAgT3BlcmF0aW9uLmNsYXNzLAotICAgICAgSW5wdXQuY2xhc3MsCi0gICAgICBPdXRwdXQuY2xhc3MsCi0gICAgICBGYXVsdC5jbGFzcywKLSAgICAgIEJpbmRpbmcuY2xhc3MsCi0gICAgICBCaW5kaW5nT3BlcmF0aW9uLmNsYXNzLAotICAgICAgQmluZGluZ0lucHV0LmNsYXNzLAotICAgICAgQmluZGluZ091dHB1dC5jbGFzcywKLSAgICAgIEJpbmRpbmdGYXVsdC5jbGFzcywKLSAgICAgIEltcG9ydC5jbGFzcywKLSAgICAgIEVsZW1lbnQuY2xhc3MsCi0gICAgICBNZXNzYWdlLmNsYXNzLAotICAgICAgUG9ydC5jbGFzcywKLSAgICAgIFBvcnRUeXBlLmNsYXNzLAotICAgICAgRGVmaW5pdGlvbi5jbGFzcywKLSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50LmNsYXNzLAotICAgICAgU09BUEJpbmRpbmcuY2xhc3MsCi0gICAgICBTT0FQQm9keS5jbGFzcywKLSAgICAgIFNPQVBIZWFkZXIuY2xhc3MsCi0gICAgICBTT0FQSGVhZGVyRmF1bHQuY2xhc3MsCi0gICAgICBTT0FQRmF1bHQuY2xhc3MsCi0gICAgICBTT0FQT3BlcmF0aW9uLmNsYXNzIH07Ci0KLSAgZmluYWwgcHJpdmF0ZSBPYmplY3QgdmlzaXRvcjsKLQotICBwcml2YXRlIE1hcCBtZXRob2RzID0gbmV3IEhhc2hNYXAoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIEBwYXJhbSBvICBhIHZpc2l0b3Igb2JqZWN0LgotICAgKi8KLSAgcHJpdmF0ZSBWaXNpdG9yQWRhcHRvcihPYmplY3QgbykKLSAgewotICAgIHRoaXMudmlzaXRvciA9IG87Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBtZXRob2QgdG8gbWV0aG9kIGJpbmRpbmcuCi0gICAqIEBwYXJhbSB3c2RsTWV0aG9kICAgIGEgV1NETCBtZXRob2QuCi0gICAqIEBwYXJhbSB0YXJnZXRNZXRob2QgIGEgIHRhcmdldCBtZXRob2QuCi0gICAqLwotICBwcml2YXRlIHZvaWQgYWRkTWV0aG9kQmluZGluZyhNZXRob2Qgd3NkbE1ldGhvZCwgTWV0aG9kIHRhcmdldE1ldGhvZCkKLSAgewotICAgIG1ldGhvZHMucHV0KHdzZGxNZXRob2QsIHRhcmdldE1ldGhvZCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBwcm94aWVzIGFsbCAidmlzaXQoWFhYKSIgbWV0aG9kcyB0byB0aGUgY29ycmVzcG9uZGluZwotICAgKiAidmlzaXQoWFhYKSIgbWV0aG9kcyBvZiB0aGUgdGFyZ2V0IHZpc2l0b3Igb2JqZWN0LiAKLSAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciNpbnZva2UoT2JqZWN0LCBNZXRob2QsIE9iamVjdFtdKQotICAgKi8KLSAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbSwgT2JqZWN0W10gcGFyYW1zKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgTWV0aG9kIHRhcmdldCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KG0pOwotICAgICAgLy8gYXNzZXJ0IHRhcmdldCAhPSBudWxsCi0gICAgICByZXR1cm4gdGFyZ2V0Lmludm9rZSh2aXNpdG9yLCBwYXJhbXMpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgewotICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBleHRyYWN0IHRoZSBzaG9ydCBjbGFzcyBuYW1lLiAKLSAgICogQHBhcmFtIGMgIGEgY2xhc3MuCi0gICAqIEByZXR1cm4gdGhlIHNob3J0IGNsYXNzIG5hbWUuCi0gICAqLwotICBzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShDbGFzcyBjKQotICB7Ci0gICAgaWYgKGMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGMuZ2V0TmFtZSgpOwotICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGdlbmVyYXRlcyBwcm94eSBmb3IgdGhlIGdpdmVuIHZpc2l0b3IuCi0gICAqIFByb3h5IHJlZGlyZWN0cyBhbGwgdmlzaXQoWFhYKSBjYWxsYmFjayB0byB0aGUgaW1wbGVtZW50ZWQgaW4gdmlzaXRvcgotICAgKiBvYmplY3QuCi0gICAqIEBwYXJhbSB2aXNpdG9yICBhIHZpc3RvciBvYmplY3QuCi0gICAqIEByZXR1cm4gYSBwcm94eSBmb3IgdGhlIGdpdmVuIHZpc2l0b3IuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFdTRExUcmF2ZXJzYWwgYWRhcHQoT2JqZWN0IHZpc2l0b3IpCi0gIHsKLSAgICBXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCA9IG5ldyBXU0RMVHJhdmVyc2FsKCk7Ci0KLSAgICBpZiAodmlzaXRvciA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmlzaXRvciBvYmplY3QgY2FuIG5vdCBiZSBOVUxMIik7Ci0KLSAgICBWaXNpdG9yQWRhcHRvciBhZGFwdG9yID0gbmV3IFZpc2l0b3JBZGFwdG9yKHZpc2l0b3IpOwotCi0gICAgLy8gY2hlY2sgd2hldGhlciBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZAotICAgIC8vIGdldCByZWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAgICBDbGFzcyBjID0gdmlzaXRvci5nZXRDbGFzcygpOwotICAgIC8vIGl0ZXJhdGVzIHRocm91Z2ggd3NkbCBhcnRpZmFjdHMgYW5kIGxvb2tpbmcgZm9yCi0gICAgLy8gdm9pZCB2aXNpdChYWFgpIGltcGxlbWVudGVkIG1ldGhvZHMuICAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdzZGwubGVuZ3RoOyBpKyspCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gaWYgbWV0aG9kIGlzIG5vdCBmb3VuZCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCi0gICAgICAgIE1ldGhvZCBtID0KLSAgICAgICAgICBjLmdldE1ldGhvZCgKLSAgICAgICAgICAgICJ2aXNpdCIsCi0gICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IHdzZGxbaV0sIE9iamVjdC5jbGFzcywgV1NETFRyYXZlcnNhbENvbnRleHQuY2xhc3MgfSk7Ci0gICAgICAgIC8vIHJlZ2lzdGVyIGJpbmRpbmcgV1NETFZpc2l0b3IgbWV0aG9kIC0+IHRhcmdldCB2aXNpdG9yIG1ldGhvZAotICAgICAgICBhZGFwdG9yLmFkZE1ldGhvZEJpbmRpbmcoCi0gICAgICAgICAgV1NETFZpc2l0b3IuY2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgInZpc2l0IiwKLSAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgd3NkbFtpXSwgT2JqZWN0LmNsYXNzLCBXU0RMVHJhdmVyc2FsQ29udGV4dC5jbGFzcyB9KSwKLSAgICAgICAgICBtKTsKLSAgICAgICAgLy8gcmVnaXN0ZXIgdmlzaXRYWFggaW4gV1NETFRyYXZlcnNhbEJ1aWxkZXIKLSAgICAgICAgbSA9Ci0gICAgICAgICAgV1NETFRyYXZlcnNhbC5jbGFzcy5nZXRNZXRob2QoCi0gICAgICAgICAgICAidmlzaXQiICsgZ2V0TmFtZSh3c2RsW2ldKSwKLSAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgYm9vbGVhbi5jbGFzcyB9KTsKLSAgICAgICAgbS5pbnZva2UodHJhdmVyc2FsLCBuZXcgT2JqZWN0W10geyBCb29sZWFuLlRSVUUgfSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAvLyBjb25zdHJ1Y3QgdGhlIFdTRExWaXNpdG9yIGJ5IHVzaW5nIGphdmEubGFuZy5yZWZsZWN0LlByb3h5Ci0gICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICBXU0RMVmlzaXRvciB3c2RsVmlzaXRvciA9Ci0gICAgICAoV1NETFZpc2l0b3IpIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UobG9hZGVyLCB2aXNpdG9yQ2xhc3MsIGFkYXB0b3IpOwotICAgIC8vIHRyYXZlcnNlIFdTREwgZG9jdW1lbnQKLSAgICB0cmF2ZXJzYWwuc2V0VmlzaXRvcih3c2RsVmlzaXRvcik7Ci0gICAgcmV0dXJuIHRyYXZlcnNhbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1dTRExUcmF2ZXJzYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3RyYXZlcnNhbC9XU0RMVHJhdmVyc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMzU2OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1dTRExUcmF2ZXJzYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwudHJhdmVyc2FsOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgaW1wbGVtZW50cyBwbGFpbiB0cmF2ZXJzZSBvdmVyIFdTREwgYXJ0aWZhY3RzLgotICogV1NETFRyYXZlcnNhbCBpcyBjb250ZXh0LWRyaXZlbiB0cmF2ZXJzYWwuIAotICogCi0gKiBAYXV0aG9yIEFuZHJleSBLdWxpawotICovCi1wdWJsaWMgY2xhc3MgV1NETFRyYXZlcnNhbAotewotCi0gIC8qKgotICAgKiBDdXJyZW50IFdTREwgdmlzaXRvciAoY2FsbGJhY2spLgotICAgKi8KLSAgcHJpdmF0ZSBXU0RMVmlzaXRvciB2aXNpdG9yOwotCi0gIC8qKgotICAgKiBGbGFncyB3aGljaCBzcGVjaWZ5IHdoZXRoZXIgdHJhdmVyc2FsIHdpbGwgdHJhdmVycyBmcm9tIG9uZSBXU0RMIGFydGlmYWN0Ci0gICAqIHRvIGFub3RoZXIuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nMkJpbmRpbmdPcGVyYXRpb24gPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nMkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZzJQb3J0VHlwZSA9IHRydWU7IC8vIHJlZmVyZW5jZQotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nRmF1bHQyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdGYXVsdDJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdJbnB1dDJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ0lucHV0MkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nRmF1bHQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdJbnB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ091dHB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMk9wZXJhdGlvbiA9IHRydWU7IC8vIHJlZmVyZW5jZSAgCi0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMkJpbmRpbmcgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlRGVmaW5pdGlvbjJJbXBvcnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMk1lc3NhZ2UgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VEZWZpbml0aW9uMlBvcnRUeXBlID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlRGVmaW5pdGlvbjJTZXJ2aWNlID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlRGVmaW5pdGlvbjJUeXBlcyA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUZhdWx0MkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VGYXVsdDJNZXNzYWdlID0gdHJ1ZTsgLy8gcmVmZXJlbmNlIAotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VJbXBvcnQyRGVmaW5pdGlvbiA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUltcG9ydDJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlSW5wdXQyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZUlucHV0Mk1lc3NhZ2UgPSB0cnVlOyAvLyByZWZlcmVuY2UgCi0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU1lc3NhZ2UyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU1lc3NhZ2UyUGFydCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU9wZXJhdGlvbjJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlT3BlcmF0aW9uMkZhdWx0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlT3BlcmF0aW9uMklucHV0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlT3BlcmF0aW9uMk91dHB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU91dHB1dDJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlT3V0cHV0Mk1lc3NhZ2UgPSB0cnVlOyAvLyByZWZlcmVuY2UgCi0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZVBhcnQyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZVBvcnQyQmluZGluZyA9IHRydWU7IC8vIHJlZmVyZW5jZSAKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlUG9ydDJFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlUG9ydDJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZVBvcnRUeXBlMkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VQb3J0VHlwZTJPcGVyYXRpb24gPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VTZXJ2aWNlMkVsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VTZXJ2aWNlMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlU2VydmljZTJQb3J0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlVHlwZXMyRWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZVR5cGVzMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gdHJ1ZTsKLSAgLy9wcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VTT0FQQm9keTJQYXJ0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlU09BUEhlYWRlcjJTT0FQSGVhZGVyRmF1bHQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nMlNPQVBCaW5kaW5nID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJTT0FQT3BlcmF0aW9uID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ0lucHV0MlNPQVBIZWFkZXIgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEJvZHkgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nT3V0cHV0MlNPQVBIZWFkZXIgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VCaW5kaW5nT3V0cHV0MlNPQVBCb2R5ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlQmluZGluZ0ZhdWx0MlNPQVBGYXVsdCA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIEZsYWdzIHdoaWNoIHNwZWNpZnkgd2hldGhlciB0cmF2ZXJzYWwgd2lsbCB2aXNpdCBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogYXJ0aWZhY3QuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRCaW5kaW5nID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdEJpbmRpbmdGYXVsdCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRCaW5kaW5nSW5wdXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0QmluZGluZ09wZXJhdGlvbiA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRCaW5kaW5nT3V0cHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdERlZmluaXRpb24gPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0RWxlbWVudCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRGYXVsdCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRJbXBvcnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0SW5wdXQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0TWVzc2FnZSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRPcGVyYXRpb24gPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0T3V0cHV0ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFBhcnQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2l0UG9ydCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRQb3J0VHlwZSA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRTZXJ2aWNlID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFR5cGVzID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFNPQVBCaW5kaW5nID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFNPQVBCb2R5ID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFNPQVBGYXVsdCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRTT0FQSGVhZGVyID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiB2aXNpdFNPQVBIZWFkZXJGYXVsdCA9IGZhbHNlOwotICBwcml2YXRlIGJvb2xlYW4gdmlzaXRTT0FQT3BlcmF0aW9uID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNPYmplY3QoKQotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBzcGVjaWZpZXMgdGhhdCB0cmF2ZXJzYWwgd2lsbCBpZ25vcmUgaW5kaXJlY3QgcmVmZXJlbmNlcyBiZXR3ZWVuCi0gICAqIFdTREwgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZToKLSAgICogPG9sPgotICAgKiAgIDxsaT5iaW5kaW5nIHRvIHBvcnQgdHlwZTwvbGk+Ci0gICAqICAgPGxpPmJpbmRpbmcgb3BlcmF0aW9uIHRvIG9wZXJhdGlvbjwvbGk+Ci0gICAqICAgPGxpPmZhdWx0IHRvIG1lc3NhZ2U8L2xpPgotICAgKiAgIDxsaT5pbnB1dCB0byBtZXNzYWdlPC9saT4KLSAgICogICA8bGk+b3V0cHV0IHRvIG1lc3NhZ2U8L2xpPgotICAgKiAgIDxsaT5wb3J0IHRvIGJpbmRpbmc8L2xpPgotICAgKiA8L29sPgotICAgKi8KLSAgcHVibGljIHZvaWQgaWdub3JlUmVmZXJlbmNlcygpCi0gIHsKLSAgICBpZ25vcmVCaW5kaW5nMlBvcnRUeXBlKCk7Ci0gICAgaWdub3JlQmluZGluZ09wZXJhdGlvbjJPcGVyYXRpb24oKTsKLSAgICBpZ25vcmVGYXVsdDJNZXNzYWdlKCk7Ci0gICAgaWdub3JlSW5wdXQyTWVzc2FnZSgpOwotICAgIGlnbm9yZU91dHB1dDJNZXNzYWdlKCk7Ci0gICAgaWdub3JlUG9ydDJCaW5kaW5nKCk7Ci0gICAgLy9pZ25vcmVTT0FQQm9keTJQYXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBzZXRzIHZpc2l0b3IuCi0gICAqIEBwYXJhbSB2aXNpdG9yICBhIFdTREwgdmlzaXRvci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoV1NETFZpc2l0b3IgdmlzaXRvcikKLSAgewotICAgIHRoaXMudmlzaXRvciA9IHZpc2l0b3I7Ci0gIH0KLQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiB0aGUgdHJhdmVyc2FsLgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZzJTT0FQQmluZGluZygpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyU09BUEJpbmRpbmcgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ09wZXJhdGlvbjJTT0FQT3BlcmF0aW9uKCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJTT0FQT3BlcmF0aW9uID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmdJbnB1dDJTT0FQSGVhZGVyKCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ0lucHV0MlNPQVBIZWFkZXIgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ0lucHV0MlNPQVBCb2R5KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ0lucHV0MlNPQVBCb2R5ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmdPdXRwdXQyU09BUEhlYWRlcigpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyU09BUEhlYWRlciA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3V0cHV0MlNPQVBCb2R5KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ091dHB1dDJTT0FQQm9keSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nRmF1bHQyU09BUEZhdWx0KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ0ZhdWx0MlNPQVBGYXVsdCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVTT0FQSGVhZGVyMlNPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICB0cmF2ZXJzZVNPQVBIZWFkZXIyU09BUEhlYWRlckZhdWx0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmcyQmluZGluZ09wZXJhdGlvbigpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyQmluZGluZ09wZXJhdGlvbiA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nMkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nMkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZzJFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZzJQb3J0VHlwZSgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyUG9ydFR5cGUgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ0ZhdWx0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nRmF1bHQyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nRmF1bHQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nRmF1bHQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ0lucHV0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nSW5wdXQyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nSW5wdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nSW5wdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nRmF1bHQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdGYXVsdCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ0lucHV0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ091dHB1dCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ091dHB1dCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3BlcmF0aW9uMkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ09wZXJhdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ09wZXJhdGlvbjJPcGVyYXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMk9wZXJhdGlvbiA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3V0cHV0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3V0cHV0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ091dHB1dDJFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRGVmaW5pdGlvbjJCaW5kaW5nKCkKLSAgewotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJCaW5kaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZURlZmluaXRpb24yRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVEZWZpbml0aW9uMkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVEZWZpbml0aW9uMkltcG9ydCgpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24ySW1wb3J0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZURlZmluaXRpb24yTWVzc2FnZSgpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yTWVzc2FnZSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVEZWZpbml0aW9uMlBvcnRUeXBlKCkKLSAgewotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJQb3J0VHlwZSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVEZWZpbml0aW9uMlNlcnZpY2UoKQotICB7Ci0gICAgdHJhdmVyc2VEZWZpbml0aW9uMlNlcnZpY2UgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRGVmaW5pdGlvbjJUeXBlcygpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yVHlwZXMgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRmF1bHQyRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUZhdWx0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRmF1bHQyTWVzc2FnZSgpCi0gIHsKLSAgICB0cmF2ZXJzZUZhdWx0Mk1lc3NhZ2UgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlSW1wb3J0MkRlZmluaXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VJbXBvcnQyRGVmaW5pdGlvbiA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVJbXBvcnQyRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUltcG9ydDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUlucHV0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VJbnB1dDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUlucHV0Mk1lc3NhZ2UoKQotICB7Ci0gICAgdHJhdmVyc2VJbnB1dDJNZXNzYWdlID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU1lc3NhZ2UyRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZU1lc3NhZ2UyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVNZXNzYWdlMlBhcnQoKQotICB7Ci0gICAgdHJhdmVyc2VNZXNzYWdlMlBhcnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlT3BlcmF0aW9uMkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVPcGVyYXRpb24yRmF1bHQoKQotICB7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yRmF1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlT3BlcmF0aW9uMklucHV0KCkKLSAgewotICAgIHRyYXZlcnNlT3BlcmF0aW9uMklucHV0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU9wZXJhdGlvbjJPdXRwdXQoKQotICB7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yT3V0cHV0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU91dHB1dDJFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlT3V0cHV0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlT3V0cHV0Mk1lc3NhZ2UoKQotICB7Ci0gICAgdHJhdmVyc2VPdXRwdXQyTWVzc2FnZSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQYXJ0MkVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VQYXJ0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlUG9ydDJCaW5kaW5nKCkKLSAgewotICAgIHRyYXZlcnNlUG9ydDJCaW5kaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVBvcnQyRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZVBvcnQyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQb3J0MkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlUG9ydDJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQb3J0VHlwZTJFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlUG9ydFR5cGUyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQb3J0VHlwZTJPcGVyYXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VQb3J0VHlwZTJPcGVyYXRpb24gPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgcmVmZXJlbmNlIGJldHdlZW4gV1NETCBlbGVtZW50cy4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlU2VydmljZTJFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlU2VydmljZTJFbGVtZW50ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNlcnZpY2UyRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgdHJhdmVyc2VTZXJ2aWNlMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIHJlZmVyZW5jZSBiZXR3ZWVuIFdTREwgZWxlbWVudHMuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNlcnZpY2UyUG9ydCgpCi0gIHsKLSAgICB0cmF2ZXJzZVNlcnZpY2UyUG9ydCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVUeXBlczJFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlVHlwZXMyRWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSByZWZlcmVuY2UgYmV0d2VlbiBXU0RMIGVsZW1lbnRzLi4uCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVR5cGVzMkV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIHRyYXZlcnNlVHlwZXMyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdFNPQVBCaW5kaW5nKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB2aXNpdFNPQVBCaW5kaW5nID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0U09BUEJvZHkoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0U09BUEJvZHkgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRTT0FQRmF1bHQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0U09BUEZhdWx0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0U09BUEhlYWRlcihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRTT0FQSGVhZGVyID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0U09BUEhlYWRlckZhdWx0KGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB2aXNpdFNPQVBIZWFkZXJGYXVsdCA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdFNPQVBPcGVyYXRpb24oYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0U09BUE9wZXJhdGlvbiA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdEJpbmRpbmcoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0QmluZGluZyA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdEJpbmRpbmdGYXVsdChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRCaW5kaW5nRmF1bHQgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRCaW5kaW5nSW5wdXQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0QmluZGluZ0lucHV0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0QmluZGluZ09wZXJhdGlvbihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0QmluZGluZ091dHB1dChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRCaW5kaW5nT3V0cHV0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0RGVmaW5pdGlvbihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXREZWZpbml0aW9uID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0RWxlbWVudChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRFbGVtZW50ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRGYXVsdChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRGYXVsdCA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdEltcG9ydChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRJbXBvcnQgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRJbnB1dChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRJbnB1dCA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdE1lc3NhZ2UoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0TWVzc2FnZSA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIHZpc2l0IG9yIG5vdCB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSB2YWx1ZSB0cnVlIGlmIHRoZSBXU0RMIGVsZW1lbnQgc2hvdWxkIGJlIHZpc2l0ZWQsIG90aGVyd2lzZSAtIGZhbHNlLgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCB2aXNpdE9wZXJhdGlvbihib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRPcGVyYXRpb24gPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRPdXRwdXQoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0T3V0cHV0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0UGFydChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRQYXJ0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0UG9ydChib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRQb3J0ID0gdmFsdWU7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gdmlzaXQgb3Igbm90IHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIHZhbHVlIHRydWUgaWYgdGhlIFdTREwgZWxlbWVudCBzaG91bGQgYmUgdmlzaXRlZCwgb3RoZXJ3aXNlIC0gZmFsc2UuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIHZpc2l0UG9ydFR5cGUoYm9vbGVhbiB2YWx1ZSkKLSAgewotICAgIHZpc2l0UG9ydFR5cGUgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRTZXJ2aWNlKGJvb2xlYW4gdmFsdWUpCi0gIHsKLSAgICB2aXNpdFNlcnZpY2UgPSB2YWx1ZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byB2aXNpdCBvciBub3QgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gdmFsdWUgdHJ1ZSBpZiB0aGUgV1NETCBlbGVtZW50IHNob3VsZCBiZSB2aXNpdGVkLCBvdGhlcndpc2UgLSBmYWxzZS4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgdmlzaXRUeXBlcyhib29sZWFuIHZhbHVlKQotICB7Ci0gICAgdmlzaXRUeXBlcyA9IHZhbHVlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZygpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yQmluZGluZyA9IGZhbHNlOwotICAgIHRyYXZlcnNlUG9ydDJCaW5kaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlQmluZGluZ0ZhdWx0KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nRmF1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdJbnB1dCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZUJpbmRpbmdPcGVyYXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nMkJpbmRpbmdPcGVyYXRpb24gPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVCaW5kaW5nT3V0cHV0KCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nT3V0cHV0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRGVmaW5pdGlvbigpCi0gIHsKLSAgICB0cmF2ZXJzZUltcG9ydDJEZWZpbml0aW9uID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlQmluZGluZ0ZhdWx0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmdJbnB1dDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VQb3J0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVNlcnZpY2UyRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlRmF1bHQyRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlT3V0cHV0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUltcG9ydDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VJbnB1dDJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yRWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlTWVzc2FnZTJFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VQYXJ0MkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVBvcnRUeXBlMkVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVR5cGVzMkVsZW1lbnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVFeHRlbnNpYmlsaXR5RWxlbWVudCgpCi0gIHsKLSAgICB0cmF2ZXJzZVNlcnZpY2UyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVBvcnQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmcyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUJpbmRpbmdGYXVsdDJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICAgIHRyYXZlcnNlQmluZGluZ0lucHV0MkV4dGVuc2liaWxpdHlFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkV4dGVuc2liaWxpdHlFbGVtZW50ID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VUeXBlczJFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNPQVBCaW5kaW5nKCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZzJTT0FQQmluZGluZyA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNPQVBPcGVyYXRpb24oKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMlNPQVBPcGVyYXRpb24gPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVTT0FQQm9keSgpCi0gIHsKLSAgICB0cmF2ZXJzZUJpbmRpbmdJbnB1dDJTT0FQQm9keSA9IGZhbHNlOwotICAgIHRyYXZlcnNlQmluZGluZ091dHB1dDJTT0FQQm9keSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVNPQVBIZWFkZXIoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEhlYWRlciA9IGZhbHNlOwotICAgIHRyYXZlcnNlQmluZGluZ091dHB1dDJTT0FQSGVhZGVyID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlU09BUEhlYWRlckZhdWx0KCkKLSAgewotICAgIHRyYXZlcnNlU09BUEhlYWRlcjJTT0FQSGVhZGVyRmF1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVTT0FQRmF1bHQoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nRmF1bHQyU09BUEZhdWx0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlRmF1bHQoKQotICB7Ci0gICAgdHJhdmVyc2VPcGVyYXRpb24yRmF1bHQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVJbXBvcnQoKQotICB7Ci0gICAgdHJhdmVyc2VJbXBvcnQyRGVmaW5pdGlvbiA9IGZhbHNlOyAvLyBmaXgKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVJbnB1dCgpCi0gIHsKLSAgICB0cmF2ZXJzZU9wZXJhdGlvbjJJbnB1dCA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU1lc3NhZ2UoKQotICB7Ci0gICAgdHJhdmVyc2VGYXVsdDJNZXNzYWdlID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VEZWZpbml0aW9uMk1lc3NhZ2UgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZUlucHV0Mk1lc3NhZ2UgPSBmYWxzZTsKLSAgICB0cmF2ZXJzZU91dHB1dDJNZXNzYWdlID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlT3BlcmF0aW9uKCkKLSAgewotICAgIHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJPcGVyYXRpb24gPSBmYWxzZTsKLSAgICB0cmF2ZXJzZVBvcnRUeXBlMk9wZXJhdGlvbiA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZU91dHB1dCgpCi0gIHsKLSAgICB0cmF2ZXJzZU9wZXJhdGlvbjJPdXRwdXQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQYXJ0KCkKLSAgewotICAgIHRyYXZlcnNlTWVzc2FnZTJQYXJ0ID0gZmFsc2U7Ci0gICAgLy90cmF2ZXJzZVNPQVBCb2R5MlBhcnQgPSBmYWxzZTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotICAvKioKLSAgICogSW5zdHJ1Y3RzIHRyYXZlcnNhbCB0byBpZ25vcmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV1NETAotICAgKiBlbGVtZW50LgotICAgKiBAcmV0dXJuIGEgV1NETFRyYXZlcnNhbCBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBpZ25vcmVQb3J0KCkKLSAgewotICAgIHRyYXZlcnNlU2VydmljZTJQb3J0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlUG9ydFR5cGUoKQotICB7Ci0gICAgdHJhdmVyc2VCaW5kaW5nMlBvcnRUeXBlID0gZmFsc2U7Ci0gICAgdHJhdmVyc2VEZWZpbml0aW9uMlBvcnRUeXBlID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgLyoqCi0gICAqIEluc3RydWN0cyB0cmF2ZXJzYWwgdG8gaWdub3JlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdTREwKLSAgICogZWxlbWVudC4KLSAgICogQHJldHVybiBhIFdTRExUcmF2ZXJzYWwgb2JqZWN0LgotICAgKi8KLSAgcHVibGljIFdTRExUcmF2ZXJzYWwgaWdub3JlU2VydmljZSgpCi0gIHsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24yU2VydmljZSA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0gIC8qKgotICAgKiBJbnN0cnVjdHMgdHJhdmVyc2FsIHRvIGlnbm9yZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgY29ycmVzcG9uZGluZyBXU0RMCi0gICAqIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gYSBXU0RMVHJhdmVyc2FsIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0RMVHJhdmVyc2FsIGlnbm9yZVR5cGVzKCkKLSAgewotICAgIHRyYXZlcnNlRGVmaW5pdGlvbjJUeXBlcyA9IGZhbHNlOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXNlWFhYIHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gdGhlIHZpc2l0WFhYIHZhcmlhYmxlcwotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFkanVzdCgpCi0gIHsKLSAgICBhZGp1c3RQYXJ0KCk7Ci0gICAgYWRqdXN0U2VydmljZSgpOwotICAgIGFkanVzdFR5cGVzKCk7Ci0gICAgYWRqdXN0T3BlcmF0aW9uKCk7Ci0gICAgYWRqdXN0SW5wdXQoKTsKLSAgICBhZGp1c3RPdXRwdXQoKTsKLSAgICBhZGp1c3RGYXVsdCgpOwotICAgIGFkanVzdEJpbmRpbmcoKTsKLSAgICBhZGp1c3RCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgYWRqdXN0QmluZGluZ0lucHV0KCk7Ci0gICAgYWRqdXN0QmluZGluZ091dHB1dCgpOwotICAgIGFkanVzdEJpbmRpbmdGYXVsdCgpOwotICAgIGFkanVzdEltcG9ydCgpOwotICAgIGFkanVzdEVsZW1lbnQoKTsKLSAgICBhZGp1c3RNZXNzYWdlKCk7Ci0gICAgYWRqdXN0UG9ydCgpOwotICAgIGFkanVzdFBvcnRUeXBlKCk7Ci0gICAgYWRqdXN0RGVmaW5pdGlvbigpOwotICAgIGFkanVzdEV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgYWRqdXN0U09BUEJpbmRpbmcoKTsKLSAgICBhZGp1c3RTT0FQQm9keSgpOwotICAgIGFkanVzdFNPQVBIZWFkZXIoKTsKLSAgICBhZGp1c3RTT0FQSGVhZGVyRmF1bHQoKTsKLSAgICBhZGp1c3RTT0FQRmF1bHQoKTsKLSAgICBhZGp1c3RTT0FQT3BlcmF0aW9uKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9IHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZUV4dGVuc2liaWxpdHlFbGVtZW50KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RQYXJ0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPSB2aXNpdFBhcnQgfHwgKHRyYXZlcnNlUGFydDJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVBhcnQoKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdFNPQVBIZWFkZXIoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdFNPQVBIZWFkZXIKLSAgICAgICAgfHwgKHRyYXZlcnNlU09BUEhlYWRlcjJTT0FQSGVhZGVyRmF1bHQgJiYgYWRqdXN0U09BUEhlYWRlckZhdWx0KCkpOwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVTT0FQSGVhZGVyKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RCaW5kaW5nT3V0cHV0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRCaW5kaW5nT3V0cHV0Ci0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICAgICAmJiBhZGp1c3RFeHRlbnNpYmlsaXR5RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nT3V0cHV0MlNPQVBCb2R5Ci0gICAgICAgICAgJiYgYWRqdXN0U09BUEJvZHkoKQotICAgICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyU09BUEhlYWRlciAmJiBhZGp1c3RTT0FQSGVhZGVyKCkpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlQmluZGluZ091dHB1dCgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0RWxlbWVudCgpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0gdmlzaXRFbGVtZW50OwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVFbGVtZW50KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RUeXBlcygpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0KLSAgICAgIHZpc2l0VHlwZXMKLSAgICAgICAgfHwgKHRyYXZlcnNlVHlwZXMyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZVR5cGVzMkV4dGVuc2liaWxpdHlFbGVtZW50ICYmIGFkanVzdEV4dGVuc2liaWxpdHlFbGVtZW50KCkpOwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVUeXBlcygpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0U09BUEJpbmRpbmcoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9IHZpc2l0U09BUEJpbmRpbmc7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVNPQVBCaW5kaW5nKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RQb3J0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRQb3J0Ci0gICAgICAgIHx8ICh0cmF2ZXJzZVBvcnQyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZVBvcnQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgJiYgYWRqdXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlUG9ydDJCaW5kaW5nICYmIGFkanVzdEJpbmRpbmcoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVBvcnQoKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdE9wZXJhdGlvbigpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0KLSAgICAgIHZpc2l0T3BlcmF0aW9uCi0gICAgICAgIHx8ICh0cmF2ZXJzZU9wZXJhdGlvbjJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlT3BlcmF0aW9uMklucHV0ICYmIGFkanVzdElucHV0KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZU9wZXJhdGlvbjJPdXRwdXQgJiYgYWRqdXN0T3V0cHV0KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZU9wZXJhdGlvbjJGYXVsdCAmJiBhZGp1c3RGYXVsdCgpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlT3BlcmF0aW9uKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RCaW5kaW5nT3BlcmF0aW9uKCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yQmluZGluZ0ZhdWx0ICYmIGFkanVzdEJpbmRpbmdGYXVsdCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdPdXRwdXQgJiYgYWRqdXN0QmluZGluZ091dHB1dCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMk9wZXJhdGlvbiAmJiBhZGp1c3RPcGVyYXRpb24oKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJCaW5kaW5nSW5wdXQgJiYgYWRqdXN0QmluZGluZ0lucHV0KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdPcGVyYXRpb24yRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICAgICAmJiBhZGp1c3RFeHRlbnNpYmlsaXR5RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMlNPQVBPcGVyYXRpb24gJiYgYWRqdXN0U09BUE9wZXJhdGlvbigpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlQmluZGluZ09wZXJhdGlvbigpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0SW5wdXQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdElucHV0Ci0gICAgICAgIHx8ICh0cmF2ZXJzZUlucHV0MkVsZW1lbnQgJiYgYWRqdXN0RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VJbnB1dDJNZXNzYWdlICYmIGFkanVzdE1lc3NhZ2UoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZUlucHV0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RCaW5kaW5nKCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRCaW5kaW5nCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmcyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmcyQmluZGluZ09wZXJhdGlvbiAmJiBhZGp1c3RCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmcyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgJiYgYWRqdXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlQmluZGluZzJQb3J0VHlwZSAmJiBhZGp1c3RQb3J0VHlwZSgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nMlNPQVBCaW5kaW5nICYmIGFkanVzdFNPQVBCaW5kaW5nKCkpOwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVCaW5kaW5nKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RTT0FQQm9keSgpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0gdmlzaXRTT0FQQm9keTsKLSAgICAvKiB8fCAKLSAgICAJCSh0cmF2ZXJzZVNPQVBCb2R5MlBhcnQgJiYgYWRqdXN0UGFydCgpKTsqLwotICAgIGlmICghdmFsdWUpCi0gICAgICBpZ25vcmVTT0FQQm9keSgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0U09BUEhlYWRlckZhdWx0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPSB2aXNpdFNPQVBIZWFkZXJGYXVsdDsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlU09BUEhlYWRlckZhdWx0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RCaW5kaW5nSW5wdXQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdEJpbmRpbmdJbnB1dAotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nSW5wdXQyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdJbnB1dDJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgICAgICYmIGFkanVzdEV4dGVuc2liaWxpdHlFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZUJpbmRpbmdJbnB1dDJTT0FQQm9keQotICAgICAgICAgICYmIGFkanVzdFNPQVBCb2R5KCkKLSAgICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEhlYWRlciAmJiBhZGp1c3RTT0FQSGVhZGVyKCkpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlQmluZGluZ0lucHV0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RPdXRwdXQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdE91dHB1dAotICAgICAgICB8fCAodHJhdmVyc2VPdXRwdXQyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZU91dHB1dDJNZXNzYWdlICYmIGFkanVzdE1lc3NhZ2UoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZU91dHB1dCgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0QmluZGluZ0ZhdWx0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRCaW5kaW5nRmF1bHQKLSAgICAgICAgfHwgKHRyYXZlcnNlQmluZGluZ0ZhdWx0MkVsZW1lbnQgJiYgYWRqdXN0RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nRmF1bHQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICAgICAmJiBhZGp1c3RFeHRlbnNpYmlsaXR5RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VCaW5kaW5nRmF1bHQyU09BUEZhdWx0ICYmIGFkanVzdFNPQVBGYXVsdCgpKTsKLSAgICBpZiAoIXZhbHVlKQotICAgICAgaWdub3JlQmluZGluZ0ZhdWx0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RTT0FQT3BlcmF0aW9uKCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPSB2aXNpdFNPQVBPcGVyYXRpb247Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVNPQVBPcGVyYXRpb24oKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdERlZmluaXRpb24oKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdERlZmluaXRpb24KLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJJbXBvcnQgJiYgYWRqdXN0SW1wb3J0KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZURlZmluaXRpb24yVHlwZXMgJiYgYWRqdXN0VHlwZXMoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJNZXNzYWdlICYmIGFkanVzdE1lc3NhZ2UoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgICAgICYmIGFkanVzdEV4dGVuc2liaWxpdHlFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZURlZmluaXRpb24yUG9ydFR5cGUgJiYgYWRqdXN0UG9ydFR5cGUoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJCaW5kaW5nICYmIGFkanVzdEJpbmRpbmcoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlRGVmaW5pdGlvbjJTZXJ2aWNlICYmIGFkanVzdFNlcnZpY2UoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZURlZmluaXRpb24oKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdFNPQVBGYXVsdCgpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0gdmlzaXRTT0FQRmF1bHQ7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVNPQVBGYXVsdCgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0SW1wb3J0KCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPSB2aXNpdEltcG9ydCB8fCAodHJhdmVyc2VJbXBvcnQyRGVmaW5pdGlvbgotICAgIC8qICYmIGFkanVzdERlZmluaXRpb24oKSovCi0gICAgICApCi0gICAgfHwgLy8gYXZvaWQgY3ljbGluZyBwcm9ibGVtLiBUaHVzLCB5b3Ugc2hvdWxkIGNhbGwgaWdub3JlSW1wb3J0IG1hbnVhbGx5ICAKLSAgICh0cmF2ZXJzZUltcG9ydDJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZUltcG9ydCgpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCBhZGp1c3RzIHRyYXZlcnNhbCBpZ25vcmUgZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHZpc2l0IGZsYWdzLgotICAgKiBAcmV0dXJuIGJvb2xlYW4gCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0RmF1bHQoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdEZhdWx0Ci0gICAgICAgIHx8ICh0cmF2ZXJzZUZhdWx0MkVsZW1lbnQgJiYgYWRqdXN0RWxlbWVudCgpKQotICAgICAgICB8fCAodHJhdmVyc2VGYXVsdDJNZXNzYWdlICYmIGFkanVzdE1lc3NhZ2UoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZUZhdWx0KCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RQb3J0VHlwZSgpCi0gIHsKLSAgICBib29sZWFuIHZhbHVlID0KLSAgICAgIHZpc2l0UG9ydFR5cGUKLSAgICAgICAgfHwgKHRyYXZlcnNlUG9ydFR5cGUyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZVBvcnRUeXBlMk9wZXJhdGlvbiAmJiBhZGp1c3RPcGVyYXRpb24oKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVBvcnRUeXBlKCk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIGFkanVzdHMgdHJhdmVyc2FsIGlnbm9yZSBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCi0gICAqIGNvcnJlc3BvbmRpbmcgdmlzaXQgZmxhZ3MuCi0gICAqIEByZXR1cm4gYm9vbGVhbiAKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBhZGp1c3RTZXJ2aWNlKCkKLSAgewotICAgIGJvb2xlYW4gdmFsdWUgPQotICAgICAgdmlzaXRTZXJ2aWNlCi0gICAgICAgIHx8ICh0cmF2ZXJzZVNlcnZpY2UyRWxlbWVudCAmJiBhZGp1c3RFbGVtZW50KCkpCi0gICAgICAgIHx8ICh0cmF2ZXJzZVNlcnZpY2UyRXh0ZW5zaWJpbGl0eUVsZW1lbnQgJiYgYWRqdXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlU2VydmljZTJQb3J0ICYmIGFkanVzdFBvcnQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZVNlcnZpY2UoKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgYWRqdXN0cyB0cmF2ZXJzYWwgaWdub3JlIGZsYWdzIGFjY29yZGluZyB0byB0aGUKLSAgICogY29ycmVzcG9uZGluZyB2aXNpdCBmbGFncy4KLSAgICogQHJldHVybiBib29sZWFuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGFkanVzdE1lc3NhZ2UoKQotICB7Ci0gICAgYm9vbGVhbiB2YWx1ZSA9Ci0gICAgICB2aXNpdE1lc3NhZ2UKLSAgICAgICAgfHwgKHRyYXZlcnNlTWVzc2FnZTJFbGVtZW50ICYmIGFkanVzdEVsZW1lbnQoKSkKLSAgICAgICAgfHwgKHRyYXZlcnNlTWVzc2FnZTJQYXJ0ICYmIGFkanVzdFBhcnQoKSk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIGlnbm9yZU1lc3NhZ2UoKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakV4dGVuc2liaWxpdHlFbGVtZW50ICBhIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICAgICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgICAgICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqRXh0ZW5zaWJpbGl0eUVsZW1lbnQsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lRXh0ZW5zaWJpbGl0eUVsZW1lbnRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEV4dGVuc2liaWxpdHlFbGVtZW50KG9iakV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBpZiAodmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqRXh0ZW5zaWJpbGl0eUVsZW1lbnQsIHBhcmVudCwgY3R4KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBhcnQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqUGFydCAgdGhlIFdTREwgcGFydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgIHBhcmVudCBvZiB0aGUgV1NETCBwYXJ0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoUGFydCBvYmpQYXJ0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lUGFydFByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0UGFydChvYmpQYXJ0KTsKLSAgICBpZiAodmlzaXRQYXJ0KQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqUGFydCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1BhcnQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqUGFydCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZVBhcnQyRWxlbWVudCkKLSAgICAgIHRyYXZlcnNlKG9ialBhcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqUGFydCwgY3R4KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgaGVhZGVyIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgCi0gICAqIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTT0FQSGVhZGVyICBhIFdTREwgU09BUCBoZWFkZXIgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgU09BUCBoZWFkZXIgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBTT0FQSGVhZGVyIG9ialNPQVBIZWFkZXIsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lU09BUEhlYWRlclByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0U09BUEhlYWRlcihvYmpTT0FQSGVhZGVyKTsKLSAgICBpZiAodmlzaXRTT0FQSGVhZGVyKQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqU09BUEhlYWRlciwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1NPQVBIZWFkZXIoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqU09BUEhlYWRlciA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZVNPQVBIZWFkZXIyU09BUEhlYWRlckZhdWx0Ci0gICAgICAmJiBvYmpTT0FQSGVhZGVyLmdldFNPQVBIZWFkZXJGYXVsdHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqU09BUEhlYWRlci5nZXRTT0FQSGVhZGVyRmF1bHRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlKChTT0FQSGVhZGVyRmF1bHQpIGl0Lm5leHQoKSwgb2JqU09BUEhlYWRlciwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc1NPQVBIZWFkZXIoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgZWxlbWVudCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpFbGVtZW50ICBhIFdTREwgZWxlbWVudCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgIHBhcmVudCBvZiB0aGUgV1NETCBlbGVtZW50IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgRWxlbWVudCBvYmpFbGVtZW50LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnNldEVsZW1lbnQob2JqRWxlbWVudCk7Ci0gICAgaWYgKHZpc2l0RWxlbWVudCkKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqRWxlbWVudCwgcGFyZW50LCBjdHgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgdHlwZXMgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqVHlwZXMgIGEgV1NETCB0eXBlcyBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICBwYXJlbnQgb2YgdGhlIFdTREwgdHlwZXMgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgVHlwZXMgb2JqVHlwZXMsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lVHlwZXNQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldFR5cGVzKG9ialR5cGVzKTsKLSAgICBpZiAodmlzaXRUeXBlcykKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9ialR5cGVzLCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzVHlwZXMoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqVHlwZXMgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VUeXBlczJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9ialR5cGVzLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIG9ialR5cGVzLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1R5cGVzKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlVHlwZXMyRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICYmIG9ialR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpUeXBlcy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9ialR5cGVzLCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzVHlwZXMoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBiaW5kaW5nIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgCi0gICAqIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTT0FQQmluZGluZyAgYSBXU0RMIFNPQVAgYmluZGluZyBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgU09BUCBiaW5kaW5nIGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIFNPQVBCaW5kaW5nIG9ialNPQVBCaW5kaW5nLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnNldFNPQVBCaW5kaW5nKG9ialNPQVBCaW5kaW5nKTsKLSAgICBpZiAodmlzaXRTT0FQQmluZGluZykKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqU09BUEJpbmRpbmcsIHBhcmVudCwgY3R4KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGRlZmluaXRpb24gYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakRlZmluaXRpb24gIGEgV1NETCBkZWZpbml0aW9uIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgcGFyZW50IG9mIHRoZSBXU0RMIGRlZmluaXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBEZWZpbml0aW9uIG9iakRlZmluaXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lRGVmaW5pdGlvblByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0RGVmaW5pdGlvbihvYmpEZWZpbml0aW9uKTsKLSAgICBpZiAodmlzaXREZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqRGVmaW5pdGlvbiwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0RlZmluaXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqRGVmaW5pdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZURlZmluaXRpb24ySW1wb3J0ICYmIG9iakRlZmluaXRpb24uZ2V0SW1wb3J0cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpEZWZpbml0aW9uLmdldEltcG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgVmVjdG9yIHYgPSAoVmVjdG9yKSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpdDIgPSB2Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGl0Mi5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJhdmVyc2UoKEltcG9ydCkgaXQyLm5leHQoKSwgb2JqRGVmaW5pdGlvbiwgY3R4KTsKLSAgICAgICAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlRGVmaW5pdGlvbjJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iakRlZmluaXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqRGVmaW5pdGlvbiwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlRGVmaW5pdGlvbjJUeXBlcykKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpEZWZpbml0aW9uLmdldFR5cGVzKCksIG9iakRlZmluaXRpb24sIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzRGVmaW5pdGlvbigpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZURlZmluaXRpb24yTWVzc2FnZSAmJiBvYmpEZWZpbml0aW9uLmdldE1lc3NhZ2VzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9iakRlZmluaXRpb24uZ2V0TWVzc2FnZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKE1lc3NhZ2UpIGl0Lm5leHQoKSwgb2JqRGVmaW5pdGlvbiwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0RlZmluaXRpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZURlZmluaXRpb24yUG9ydFR5cGUgJiYgb2JqRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqRGVmaW5pdGlvbi5nZXRQb3J0VHlwZXMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKFBvcnRUeXBlKSBpdC5uZXh0KCksIG9iakRlZmluaXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VEZWZpbml0aW9uMkJpbmRpbmcgJiYgb2JqRGVmaW5pdGlvbi5nZXRCaW5kaW5ncygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpEZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlKChCaW5kaW5nKSBpdC5uZXh0KCksIG9iakRlZmluaXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VEZWZpbml0aW9uMlNlcnZpY2UgJiYgb2JqRGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpEZWZpbml0aW9uLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlKChTZXJ2aWNlKSBpdC5uZXh0KCksIG9iakRlZmluaXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NEZWZpbml0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VEZWZpbml0aW9uMkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgICAmJiBvYmpEZWZpbml0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpEZWZpbml0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKSwgb2JqRGVmaW5pdGlvbiwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0RlZmluaXRpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgcG9ydCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpQb3J0ICBhIFdTREwgcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgIHBhcmVudCBvZiB0aGUgV1NETCBwb3J0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoUG9ydCBvYmpQb3J0LCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lUG9ydFByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0UG9ydChvYmpQb3J0KTsKLSAgICBpZiAodmlzaXRQb3J0KQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqUG9ydCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1BvcnQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqUG9ydCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZVBvcnQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpQb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIG9ialBvcnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzUG9ydCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZVBvcnQyQmluZGluZykKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpQb3J0LmdldEJpbmRpbmcoKSwgb2JqUG9ydCwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NQb3J0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlUG9ydDJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgJiYgb2JqUG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqUG9ydC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9ialBvcnQsIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NQb3J0KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG9wZXJhdGlvbiBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpPcGVyYXRpb24gIGEgV1NETCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBvcGVyYXRpb24gYXJ0aWZhY3R0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBPcGVyYXRpb24gb2JqT3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZU9wZXJhdGlvblByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0T3BlcmF0aW9uKG9iak9wZXJhdGlvbik7Ci0gICAgaWYgKHZpc2l0T3BlcmF0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqT3BlcmF0aW9uLCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9iak9wZXJhdGlvbiA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZU9wZXJhdGlvbjJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iak9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpPcGVyYXRpb24sIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlT3BlcmF0aW9uMklucHV0KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iak9wZXJhdGlvbi5nZXRJbnB1dCgpLCBvYmpPcGVyYXRpb24sIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlT3BlcmF0aW9uMk91dHB1dCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpPcGVyYXRpb24uZ2V0T3V0cHV0KCksIG9iak9wZXJhdGlvbiwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NPcGVyYXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VPcGVyYXRpb24yRmF1bHQgJiYgb2JqT3BlcmF0aW9uLmdldEZhdWx0cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpPcGVyYXRpb24uZ2V0RmF1bHRzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIHRyYXZlcnNlKChGYXVsdCkgaXQubmV4dCgpLCBvYmpPcGVyYXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NPcGVyYXRpb24oKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgaW5wdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqSW5wdXQgIGEgV1NETCBpbnB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICBwYXJlbnQgb2YgdGhlIFdTREwgaW5wdXQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgSW5wdXQgb2JqSW5wdXQsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lSW5wdXRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldElucHV0KG9iaklucHV0KTsKLSAgICBpZiAodmlzaXRJbnB1dCkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iaklucHV0LCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzSW5wdXQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqSW5wdXQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VJbnB1dDJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iaklucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIG9iaklucHV0LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0lucHV0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlSW5wdXQyTWVzc2FnZSkKLSAgICAgIHRyYXZlcnNlKG9iaklucHV0LmdldE1lc3NhZ2UoKSwgb2JqSW5wdXQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBTT0FQIGJvZHkgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9ialNPQVBCb2R5ICBhIFdTREwgU09BUCBib2R5IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBTT0FQIGJvZHkgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgU09BUEJvZHkgb2JqU09BUEJvZHksCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICAvLyAgCWN0eC5yZXN1bWVTT0FQQm9keVByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0U09BUEJvZHkob2JqU09BUEJvZHkpOwotICAgIGlmICh2aXNpdFNPQVBCb2R5KQotICAgICAgLy8JewotICAgICAgdmlzaXRvci52aXNpdChvYmpTT0FQQm9keSwgcGFyZW50LCBjdHgpOwotICAgIC8qCSAgaWYgKCFjdHgucHJvY2Vzc1NPQVBCb2R5KCkpCi0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJaWYgKG9ialNPQVBCb2R5ID09IG51bGwpCi0gICAgCQlyZXR1cm47Ci0gICAgCWlmICh0cmF2ZXJzZVNPQVBCb2R5MlBhcnQgJiYgb2JqU09BUEJvZHkuZ2V0UGFydHMoKSAhPSBudWxsKSB7Ci0gICAgCSAgaWYgKGN0eCkKLSAgICAJICBJdGVyYXRvciBpdCA9IG9ialNPQVBCb2R5LmdldFBhcnRzKCkuaXRlcmF0b3IoKTsKLSAgICAJICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCSAgCQotICAgIAkJdHJhdmVyc2UoKFBhcnQpaXQubmV4dCgpLCBvYmpTT0FQQm9keSwgY3R4KTsKLSAgICAJCWlmICghY3R4LnByb2Nlc3NTT0FQQm9keSgpKQotICAgIAkJICByZXR1cm47Ci0gICAgCSAgfQotICAgIAl9Ci0gICAgKi8KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgaGVhZGVyIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byAKLSAgICogdGhlIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTT0FQSGVhZGVyRmF1bHQgIGEgV1NETCBTT0FQIGhlYWRlciBmYXVsdCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgICAgICAgICAgcGFyZW50IG9mIHRoZSBXU0RMIFNPQVAgaGVhZGVyIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBTT0FQSGVhZGVyRmF1bHQgb2JqU09BUEhlYWRlckZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnNldFNPQVBIZWFkZXJGYXVsdChvYmpTT0FQSGVhZGVyRmF1bHQpOwotICAgIGlmICh2aXNpdFNPQVBIZWFkZXJGYXVsdCkKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqU09BUEhlYWRlckZhdWx0LCBwYXJlbnQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBvdXRwdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqT3V0cHV0ICBhIFdTREwgb3V0cHV0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgcGFyZW50IG9mIHRoZSBXU0RMIG91dHB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKiBAcGFyYW0gcGFyZW50Ci0gICAqIEBwYXJhbSBjdHgKLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBPdXRwdXQgb2JqT3V0cHV0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZU91dHB1dFByb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0T3V0cHV0KG9iak91dHB1dCk7Ci0gICAgaWYgKHZpc2l0T3V0cHV0KQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqT3V0cHV0LCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3V0cHV0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9iak91dHB1dCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZU91dHB1dDJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iak91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpPdXRwdXQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzT3V0cHV0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlT3V0cHV0Mk1lc3NhZ2UpCi0gICAgICB0cmF2ZXJzZShvYmpPdXRwdXQuZ2V0TWVzc2FnZSgpLCBvYmpPdXRwdXQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgCi0gICAqIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpCaW5kaW5nRmF1bHQgIGEgV1NETCBiaW5kaW5nIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgYmluZGluZyBmYXVsdCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgQmluZGluZ0ZhdWx0IG9iakJpbmRpbmdGYXVsdCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVCaW5kaW5nRmF1bHRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEJpbmRpbmdGYXVsdChvYmpCaW5kaW5nRmF1bHQpOwotICAgIGlmICh2aXNpdEJpbmRpbmdGYXVsdCkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iakJpbmRpbmdGYXVsdCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdGYXVsdCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpCaW5kaW5nRmF1bHQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nRmF1bHQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nRmF1bHQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqQmluZGluZ0ZhdWx0LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdGYXVsdCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUJpbmRpbmdGYXVsdDJTT0FQRmF1bHQKLSAgICAgICYmIG9iakJpbmRpbmdGYXVsdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ0ZhdWx0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTT0FQRmF1bHQpCi0gICAgICAgICAgdHJhdmVyc2UoKFNPQVBGYXVsdCkgbywgb2JqQmluZGluZ0ZhdWx0LCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ0ZhdWx0KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nRmF1bHQyRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLSAgICAgICYmIG9iakJpbmRpbmdGYXVsdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ0ZhdWx0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKSwgb2JqQmluZGluZ0ZhdWx0LCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ0ZhdWx0KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyB0byAKLSAgICogdGhlIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTT0FQT3BlcmF0aW9uICBhIFdTREwgU09BUCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgU09BUCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBTT0FQT3BlcmF0aW9uIG9ialNPQVBPcGVyYXRpb24sCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHguc2V0U09BUE9wZXJhdGlvbihvYmpTT0FQT3BlcmF0aW9uKTsKLSAgICBpZiAodmlzaXRTT0FQT3BlcmF0aW9uKQotICAgICAgdmlzaXRvci52aXNpdChvYmpTT0FQT3BlcmF0aW9uLCBwYXJlbnQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGlucHV0IGFydGlmYWN0IGFjY29yZGluZyB0byAKLSAgICogdGhlIHNldHRpbmdzIGluIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpCaW5kaW5nSW5wdXQgIGEgV1NETCBiaW5kaW5nIGlucHV0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgYmluZGluZyBpbnB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgQmluZGluZ0lucHV0IG9iakJpbmRpbmdJbnB1dCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVCaW5kaW5nSW5wdXRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEJpbmRpbmdJbnB1dChvYmpCaW5kaW5nSW5wdXQpOwotICAgIGlmICh2aXNpdEJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iakJpbmRpbmdJbnB1dCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpCaW5kaW5nSW5wdXQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nSW5wdXQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nSW5wdXQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqQmluZGluZ0lucHV0LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgodHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEJvZHkgfHwgdHJhdmVyc2VCaW5kaW5nSW5wdXQyU09BUEhlYWRlcikKLSAgICAgICYmIG9iakJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ0lucHV0LmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKHRyYXZlcnNlQmluZGluZ0lucHV0MlNPQVBCb2R5ICYmIChvIGluc3RhbmNlb2YgU09BUEJvZHkpKQotICAgICAgICAgIHRyYXZlcnNlKChTT0FQQm9keSkgbywgb2JqQmluZGluZ0lucHV0LCBjdHgpOwotICAgICAgICBlbHNlIGlmICh0cmF2ZXJzZUJpbmRpbmdJbnB1dDJTT0FQSGVhZGVyICYmIChvIGluc3RhbmNlb2YgU09BUEhlYWRlcikpCi0gICAgICAgICAgdHJhdmVyc2UoKFNPQVBIZWFkZXIpIG8sIG9iakJpbmRpbmdJbnB1dCwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ0lucHV0MkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgICAmJiBvYmpCaW5kaW5nSW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9iakJpbmRpbmdJbnB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9iakJpbmRpbmdJbnB1dCwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdJbnB1dCgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIG9wZXJhdGlvbiBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gCi0gICAqIHRoZSBzZXR0aW5ncyBpbiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqQmluZGluZ09wZXJhdGlvbiAgYSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgICAgICAgICAgcGFyZW50IG9mIHRoZSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgQmluZGluZ09wZXJhdGlvbiBvYmpCaW5kaW5nT3BlcmF0aW9uLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZUJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEJpbmRpbmdPcGVyYXRpb24ob2JqQmluZGluZ09wZXJhdGlvbik7Ci0gICAgaWYgKHZpc2l0QmluZGluZ09wZXJhdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iakJpbmRpbmdPcGVyYXRpb24sIHBhcmVudCwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9iakJpbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkVsZW1lbnQpCi0gICAgewotICAgICAgdHJhdmVyc2UoCi0gICAgICAgIG9iakJpbmRpbmdPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwKLSAgICAgICAgb2JqQmluZGluZ09wZXJhdGlvbiwKLSAgICAgICAgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJTT0FQT3BlcmF0aW9uCi0gICAgICAmJiBvYmpCaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpCaW5kaW5nT3BlcmF0aW9uLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0Lm5leHQoKTsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgICAgIHRyYXZlcnNlKChTT0FQT3BlcmF0aW9uKSBvLCBvYmpCaW5kaW5nT3BlcmF0aW9uLCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ09wZXJhdGlvbigpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ09wZXJhdGlvbjJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgJiYgb2JqQmluZGluZ09wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ09wZXJhdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9iakJpbmRpbmdPcGVyYXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMk9wZXJhdGlvbikKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nT3BlcmF0aW9uLmdldE9wZXJhdGlvbigpLCBvYmpCaW5kaW5nT3BlcmF0aW9uLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdJbnB1dCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nT3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpLCBvYmpCaW5kaW5nT3BlcmF0aW9uLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdPdXRwdXQpCi0gICAgewotICAgICAgdHJhdmVyc2UoCi0gICAgICAgIG9iakJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpLAotICAgICAgICBvYmpCaW5kaW5nT3BlcmF0aW9uLAotICAgICAgICBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24oKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nT3BlcmF0aW9uMkJpbmRpbmdGYXVsdAotICAgICAgJiYgb2JqQmluZGluZ09wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9iakJpbmRpbmdPcGVyYXRpb24uZ2V0QmluZGluZ0ZhdWx0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoQmluZGluZ0ZhdWx0KSBpdC5uZXh0KCksIG9iakJpbmRpbmdPcGVyYXRpb24sIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9ialNPQVBGYXVsdCAgYSBXU0RMIFNPQVAgZmF1bHQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBTT0FQIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBTT0FQRmF1bHQgb2JqU09BUEZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnNldFNPQVBGYXVsdChvYmpTT0FQRmF1bHQpOwotICAgIGlmICh2aXNpdFNPQVBGYXVsdCkKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqU09BUEZhdWx0LCBwYXJlbnQsIGN0eCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MgaW4KLSAgICogdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakJpbmRpbmcgIGEgV1NETCBiaW5kaW5nIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyZW50ICAgICAgcGFyZW50IG9mIHRoZSBXU0RMIGJpbmRpbmcgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBjdHggICAgICAgICB0aGUgdHJhdmVyc2FsIGNvbnRleC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZSgKLSAgICBCaW5kaW5nIG9iakJpbmRpbmcsCi0gICAgT2JqZWN0IHBhcmVudCwKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpCi0gIHsKLSAgICBjdHgucmVzdW1lQmluZGluZ1Byb2Nlc3NpbmcoKTsKLSAgICBjdHguc2V0QmluZGluZyhvYmpCaW5kaW5nKTsKLSAgICBpZiAodmlzaXRCaW5kaW5nKQotICAgIHsKLSAgICAgIHZpc2l0b3IudmlzaXQob2JqQmluZGluZywgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmcoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2JqQmluZGluZyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGlmICh0cmF2ZXJzZUJpbmRpbmcyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpCaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksIG9iakJpbmRpbmcsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZygpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUJpbmRpbmcyU09BUEJpbmRpbmcKLSAgICAgICYmIG9iakJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9iakJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBvID0gaXQubmV4dCgpOwotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQotICAgICAgICAgIHRyYXZlcnNlKChTT0FQQmluZGluZykgbywgb2JqQmluZGluZywgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmcoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUJpbmRpbmcyUG9ydFR5cGUpCi0gICAgewotICAgICAgdHJhdmVyc2Uob2JqQmluZGluZy5nZXRQb3J0VHlwZSgpLCBvYmpCaW5kaW5nLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0JpbmRpbmcoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VCaW5kaW5nMkJpbmRpbmdPcGVyYXRpb24KLSAgICAgICYmIG9iakJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoQmluZGluZ09wZXJhdGlvbikgaXQubmV4dCgpLCBvYmpCaW5kaW5nLCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZygpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZzJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgJiYgb2JqQmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9iakJpbmRpbmcsIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MgaW4KLSAgICogdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakZhdWx0ICBhIFdTREwgZmF1bHQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgcGFyZW50IG9mIHRoZSBXU0RMIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIEZhdWx0IG9iakZhdWx0LAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZUZhdWx0UHJvY2Vzc2luZygpOwotICAgIGN0eC5zZXRGYXVsdChvYmpGYXVsdCk7Ci0gICAgaWYgKHZpc2l0RmF1bHQpCi0gICAgewotICAgICAgdmlzaXRvci52aXNpdChvYmpGYXVsdCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0ZhdWx0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9iakZhdWx0ID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKHRyYXZlcnNlRmF1bHQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpGYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpGYXVsdCwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NGYXVsdCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUZhdWx0Mk1lc3NhZ2UpCi0gICAgICB0cmF2ZXJzZShvYmpGYXVsdC5nZXRNZXNzYWdlKCksIG9iakZhdWx0LCBjdHgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgc2VydmljZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpTZXJ2aWNlICBhIFdTREwgc2VydmljZSBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBzZXJ2aWNlIGFydGlmYWN0LgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgU2VydmljZSBvYmpTZXJ2aWNlLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZVNlcnZpY2VQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldFNlcnZpY2Uob2JqU2VydmljZSk7Ci0gICAgaWYgKHZpc2l0U2VydmljZSkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9ialNlcnZpY2UsIHBhcmVudCwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NTZXJ2aWNlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9ialNlcnZpY2UgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VTZXJ2aWNlMkVsZW1lbnQpCi0gICAgewotICAgICAgdHJhdmVyc2Uob2JqU2VydmljZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpTZXJ2aWNlLCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1NlcnZpY2UoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodHJhdmVyc2VTZXJ2aWNlMkV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgICAmJiBvYmpTZXJ2aWNlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXQgPSBvYmpTZXJ2aWNlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKSwgb2JqU2VydmljZSwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc1NlcnZpY2UoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZVNlcnZpY2UyUG9ydCAmJiBvYmpTZXJ2aWNlLmdldFBvcnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9ialNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKFBvcnQpIGl0Lm5leHQoKSwgb2JqU2VydmljZSwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc1NlcnZpY2UoKSkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgaW1wb3J0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MgaW4KLSAgICogdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakltcG9ydCAgYSBXU0RMIGltcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgcGFyZW50IG9mIHRoZSBXU0RMIGltcG9ydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgdGhlIHRyYXZlcnNhbCBjb250ZXguCi0gICAqLwotICBwcml2YXRlIHZvaWQgdHJhdmVyc2UoCi0gICAgSW1wb3J0IG9iakltcG9ydCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVJbXBvcnRQcm9jZXNzaW5nKCk7Ci0gICAgY3R4LnNldEltcG9ydChvYmpJbXBvcnQpOwotICAgIGlmICh2aXNpdEltcG9ydCkKLSAgICB7Ci0gICAgICB2aXNpdG9yLnZpc2l0KG9iakltcG9ydCwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0ltcG9ydCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpJbXBvcnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAodHJhdmVyc2VJbXBvcnQyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqSW1wb3J0LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc0ltcG9ydCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZUltcG9ydDJEZWZpbml0aW9uKQotICAgICAgdHJhdmVyc2Uob2JqSW1wb3J0LmdldERlZmluaXRpb24oKSwgb2JqSW1wb3J0LCBjdHgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgYmluZGluZyBvdXRwdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSAKLSAgICogc2V0dGluZ3MgaW4gdGhlIHRyYXZlcnNhbCBjb250ZXh0LgotICAgKiAKLSAgICogQHBhcmFtIG9iakJpbmRpbmdPdXRwdXQgIGEgV1NETCBiaW5kaW5nIG91dHB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgICAgICAgIHBhcmVudCBvZiB0aGUgV1NETCBiaW5kaW5nIG91dHB1dCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIEJpbmRpbmdPdXRwdXQgb2JqQmluZGluZ091dHB1dCwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVCaW5kaW5nT3V0cHV0UHJvY2Vzc2luZygpOwotICAgIGN0eC5zZXRCaW5kaW5nT3V0cHV0KG9iakJpbmRpbmdPdXRwdXQpOwotICAgIGlmICh2aXNpdEJpbmRpbmdPdXRwdXQpCi0gICAgewotICAgICAgdmlzaXRvci52aXNpdChvYmpCaW5kaW5nT3V0cHV0LCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ091dHB1dCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpCaW5kaW5nT3V0cHV0ID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ091dHB1dDJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKAotICAgICAgICBvYmpCaW5kaW5nT3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksCi0gICAgICAgIG9iakJpbmRpbmdPdXRwdXQsCi0gICAgICAgIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ091dHB1dCgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgodHJhdmVyc2VCaW5kaW5nT3V0cHV0MlNPQVBCb2R5IHx8IHRyYXZlcnNlQmluZGluZ091dHB1dDJTT0FQSGVhZGVyKQotICAgICAgJiYgb2JqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0gICAgICAgIGlmICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyU09BUEJvZHkgJiYgKG8gaW5zdGFuY2VvZiBTT0FQQm9keSkpCi0gICAgICAgICAgdHJhdmVyc2UoKFNPQVBCb2R5KSBvLCBvYmpCaW5kaW5nT3V0cHV0LCBjdHgpOwotICAgICAgICBlbHNlIGlmICh0cmF2ZXJzZUJpbmRpbmdPdXRwdXQyU09BUEhlYWRlciAmJiAobyBpbnN0YW5jZW9mIFNPQVBIZWFkZXIpKQotICAgICAgICAgIHRyYXZlcnNlKChTT0FQSGVhZGVyKSBvLCBvYmpCaW5kaW5nT3V0cHV0LCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzQmluZGluZ091dHB1dCgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlQmluZGluZ091dHB1dDJFeHRlbnNpYmlsaXR5RWxlbWVudAotICAgICAgJiYgb2JqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqQmluZGluZ091dHB1dC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKEV4dGVuc2liaWxpdHlFbGVtZW50KSBpdC5uZXh0KCksIG9iakJpbmRpbmdPdXRwdXQsIGN0eCk7Ci0gICAgICAgIGlmICghY3R4LnByb2Nlc3NCaW5kaW5nT3V0cHV0KCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIGluCi0gICAqIHRoZSB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICogCi0gICAqIEBwYXJhbSBvYmpQb3J0VHlwZSAgYSBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmVudCAgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgcG9ydCB0eXBlLgotICAgKiBAcGFyYW0gY3R4ICAgICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIFBvcnRUeXBlIG9ialBvcnRUeXBlLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KQotICB7Ci0gICAgY3R4LnJlc3VtZVBvcnRUeXBlUHJvY2Vzc2luZygpOwotICAgIGN0eC5zZXRQb3J0VHlwZShvYmpQb3J0VHlwZSk7Ci0gICAgaWYgKHZpc2l0UG9ydFR5cGUpCi0gICAgewotICAgICAgdmlzaXRvci52aXNpdChvYmpQb3J0VHlwZSwgcGFyZW50LCBjdHgpOwotICAgICAgaWYgKCFjdHgucHJvY2Vzc1BvcnRUeXBlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9ialBvcnRUeXBlID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKHRyYXZlcnNlUG9ydFR5cGUyRWxlbWVudCkKLSAgICB7Ci0gICAgICB0cmF2ZXJzZShvYmpQb3J0VHlwZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLCBvYmpQb3J0VHlwZSwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NQb3J0VHlwZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0cmF2ZXJzZVBvcnRUeXBlMk9wZXJhdGlvbiAmJiBvYmpQb3J0VHlwZS5nZXRPcGVyYXRpb25zKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpdCA9IG9ialBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgdHJhdmVyc2UoKE9wZXJhdGlvbikgaXQubmV4dCgpLCBvYmpQb3J0VHlwZSwgY3R4KTsKLSAgICAgICAgaWYgKCFjdHgucHJvY2Vzc1BvcnRUeXBlKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG1lc3NhZ2UgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBpbgotICAgKiB0aGUgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqIAotICAgKiBAcGFyYW0gb2JqTWVzc2FnZSAgYSBXU0RMIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBwYXJlbnQgICAgICBwYXJlbnQgb2YgdGhlIFdTREwgbWVzc2FnZS4KLSAgICogQHBhcmFtIGN0eCAgICAgICAgIHRoZSB0cmF2ZXJzYWwgY29udGV4LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlKAotICAgIE1lc3NhZ2Ugb2JqTWVzc2FnZSwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCkKLSAgewotICAgIGN0eC5yZXN1bWVNZXNzYWdlUHJvY2Vzc2luZygpOwotICAgIGN0eC5zZXRNZXNzYWdlKG9iak1lc3NhZ2UpOwotICAgIGlmICh2aXNpdE1lc3NhZ2UpCi0gICAgewotICAgICAgdmlzaXRvci52aXNpdChvYmpNZXNzYWdlLCBwYXJlbnQsIGN0eCk7Ci0gICAgICBpZiAoIWN0eC5wcm9jZXNzTWVzc2FnZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChvYmpNZXNzYWdlID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKHRyYXZlcnNlTWVzc2FnZTJFbGVtZW50KQotICAgIHsKLSAgICAgIHRyYXZlcnNlKG9iak1lc3NhZ2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSwgb2JqTWVzc2FnZSwgY3R4KTsKLSAgICAgIGlmICghY3R4LnByb2Nlc3NNZXNzYWdlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHRyYXZlcnNlTWVzc2FnZTJQYXJ0ICYmIG9iak1lc3NhZ2UuZ2V0UGFydHMoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIEl0ZXJhdG9yIGl0ID0gb2JqTWVzc2FnZS5nZXRQYXJ0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICB0cmF2ZXJzZSgoUGFydCkgaXQubmV4dCgpLCBvYmpNZXNzYWdlLCBjdHgpOwotICAgICAgICBpZiAoIWN0eC5wcm9jZXNzTWVzc2FnZSgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBwYXJ0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgcGFydCBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFBhcnQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgc2VydmljZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIHNlcnZpY2UgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTZXJ2aWNlIGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHR5cGVzIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhIFdTREwgdHlwZXMgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShUeXBlcyBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBvcGVyYXRpb24gYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShPcGVyYXRpb24gYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgaW5wdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBpbnB1dCBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElucHV0IGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG91dHB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIG91dHB1dCBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKE91dHB1dCBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBmYXVsdCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIGZhdWx0IGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoRmF1bHQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgYmluZGluZyBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIGJpbmRpbmcgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nIGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgCi0gICAqIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoQmluZGluZ09wZXJhdGlvbiBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGlucHV0IGFydGlmYWN0IGFjY29yZGluZyB0byAKLSAgICogdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIGJpbmRpbmcgaW5wdXQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nSW5wdXQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgYmluZGluZyBvdXRwdXQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgYmluZGluZyBvdXRwdXQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nT3V0cHV0IGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGJpbmRpbmcgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgYSBXU0RMIGJpbmRpbmcgZmF1bHQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nRmF1bHQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgaW1wb3J0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgaW1wb3J0IGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoSW1wb3J0IGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGVsZW1lbnQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBlbGVtZW50IGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoRWxlbWVudCBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBtZXNzYWdlIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgbWVzc2FnZSBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKE1lc3NhZ2UgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgcG9ydCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIHBvcnQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShQb3J0IGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFBvcnRUeXBlIGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGRlZmluaXRpb24gYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBkZWZpbml0aW9uIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoRGVmaW5pdGlvbiBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBleHRlbnNpYmlsaXR5IGVsbWVudCBhcnRpZmFjdCBhY2NvcmRpbmcgCi0gICAqIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShFeHRlbnNpYmlsaXR5RWxlbWVudCBhKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpKTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBTT0FQIGJpbmRpbmcgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgU09BUCBiaW5kaW5nIGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEJpbmRpbmcgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBib2R5IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgU09BUCBib2R5IGFydGlmYWN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEJvZHkgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBoZWFkZXIgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgIGEgV1NETCBTT0FQIGhlYWRlciBhcnRpZmFjdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFNPQVBIZWFkZXIgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBoZWFkZXIgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgU09BUCBoZWFkZXIgZmF1bHQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTT0FQSGVhZGVyRmF1bHQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBmYXVsdCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgYSBXU0RMIFNPQVAgZmF1bHQgYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTT0FQRmF1bHQgYSkKLSAgewotICAgIGFkanVzdCgpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBvcGVyYXRpb24gYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICBhIFdTREwgU09BUCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTT0FQT3BlcmF0aW9uIGEpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcykpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgcGFydCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgcGFydCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoUGFydCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBzZXJ2aWNlIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBzZXJ2aWNlIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShTZXJ2aWNlIGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHR5cGVzIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCB0eXBlcyBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoVHlwZXMgYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKE9wZXJhdGlvbiBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBpbnB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgaW5wdXQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKElucHV0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG91dHB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgb3V0cHV0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShPdXRwdXQgYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShGYXVsdCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBiaW5kaW5nIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nIGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyAKLSAgICogdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgYmluZGluZyBvcGVyYXRpb24gYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKEJpbmRpbmdPcGVyYXRpb24gYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgYmluZGluZyBpbnB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgCi0gICAqIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIGJpbmRpbmcgaW5wdXQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKEJpbmRpbmdJbnB1dCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBiaW5kaW5nIG91dHB1dCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gCi0gICAqIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIGJpbmRpbmcgb3V0cHV0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShCaW5kaW5nT3V0cHV0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGJpbmRpbmcgZmF1bHQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIAotICAgKiB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBiaW5kaW5nIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoQmluZGluZ0ZhdWx0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGltcG9ydCBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgaW1wb3J0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoSW1wb3J0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIGVsZW1lbnQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShFbGVtZW50IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIG1lc3NhZ2UgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShNZXNzYWdlIGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBvcnQgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIHBvcnQuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShQb3J0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIHBvcnQgdHlwZSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgcG9ydCB0eXBlIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoUG9ydFR5cGUgYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgZGVmaW5pdGlvbiBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgZGVmaW5pdGlvbiBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKERlZmluaXRpb24gYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgYXJ0aWZhY3QuCi0gICAqIEBwYXJhbSBwYXJhbXMgIGEgTWFwIG9iamVjdCByZXByZXNlbnRpbmcgc2V0dGluZ3MuICAgCi0gICAqLwotICBwdWJsaWMgdm9pZCB0cmF2ZXJzZShFeHRlbnNpYmlsaXR5RWxlbWVudCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBTT0FQIGJpbmRpbmcgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIFNPQVAgYmluZGluZyBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFNPQVBCaW5kaW5nIGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgYm9keSBhcnRpZmFjdCBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzLgotICAgKiBAcGFyYW0gYSAgICAgICBhIFdTREwgU09BUCBib2R5IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEJvZHkgYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLSAgLyoqCi0gICAqIFRoZSBtZXRob2QgdHJhdmVyc2VzIGdpdmVuIFdTREwgU09BUCBoZWFkZXIgYXJ0aWZhY3QgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncy4KLSAgICogQHBhcmFtIGEgICAgICAgYSBXU0RMIFNPQVAgaGVhZGVyIGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEhlYWRlciBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBoZWFyZGVyIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBTT0FQIGhlYWRlciBmYXVsdCBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4gICAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFNPQVBIZWFkZXJGYXVsdCBhLCBNYXAgcGFyYW1zKQotICB7Ci0gICAgYWRqdXN0KCk7Ci0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4ID0gbmV3IFdTRExUcmF2ZXJzYWxDb250ZXh0KHRoaXMpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkKLSAgICAgIGN0eC5wYXJhbXMucHV0QWxsKHBhcmFtcyk7Ci0gICAgdHJhdmVyc2UoYSwgbnVsbCwgY3R4KTsKLSAgfQotICAvKioKLSAgICogVGhlIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gV1NETCBTT0FQIGZhdWx0IGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBTT0FQIGZhdWx0IGFydGlmYWN0LgotICAgKiBAcGFyYW0gcGFyYW1zICBhIE1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHNldHRpbmdzLiAgIAotICAgKi8KLSAgcHVibGljIHZvaWQgdHJhdmVyc2UoU09BUEZhdWx0IGEsIE1hcCBwYXJhbXMpCi0gIHsKLSAgICBhZGp1c3QoKTsKLSAgICBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHggPSBuZXcgV1NETFRyYXZlcnNhbENvbnRleHQodGhpcyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKQotICAgICAgY3R4LnBhcmFtcy5wdXRBbGwocGFyYW1zKTsKLSAgICB0cmF2ZXJzZShhLCBudWxsLCBjdHgpOwotICB9Ci0gIC8qKgotICAgKiBUaGUgbWV0aG9kIHRyYXZlcnNlcyBnaXZlbiBXU0RMIFNPQVAgb3BlcmF0aW9uIGFydGlmYWN0IGFjY29yZGluZyB0byB0aGUgc2V0dGluZ3MuCi0gICAqIEBwYXJhbSBhICAgICAgIGEgV1NETCBTT0FQIG9wZXJhdGlvbiBhcnRpZmFjdC4KLSAgICogQHBhcmFtIHBhcmFtcyAgYSBNYXAgb2JqZWN0IHJlcHJlc2VudGluZyBzZXR0aW5ncy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRyYXZlcnNlKFNPQVBPcGVyYXRpb24gYSwgTWFwIHBhcmFtcykKLSAgewotICAgIGFkanVzdCgpOwotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCA9IG5ldyBXU0RMVHJhdmVyc2FsQ29udGV4dCh0aGlzKTsKLSAgICBpZiAocGFyYW1zICE9IG51bGwpCi0gICAgICBjdHgucGFyYW1zLnB1dEFsbChwYXJhbXMpOwotICAgIHRyYXZlcnNlKGEsIG51bGwsIGN0eCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3RyYXZlcnNhbC9XU0RMVHJhdmVyc2FsQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1dTRExUcmF2ZXJzYWxDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNGRiZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwvdHJhdmVyc2FsL1dTRExUcmF2ZXJzYWxDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQSGVhZGVyOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXJGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQT3BlcmF0aW9uOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyBydW50aW1lIGNvbnRleHQgZm9yIHRoZSB0cmF2ZXJzYWwgcHJvY2Vzcy4KLSAqIENvbnRleHQgc3RvcmVzIGFydGlmYWN0cyBiZWluZyBwcm9jZXNzZWQuCi0gKiAKLSAqIEBhdXRob3IgQW5kcmV5IEt1bGlrCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMVHJhdmVyc2FsQ29udGV4dAotewotICAvKioKLSAgICogRmxhZ3Mgd2hpY2ggaW5kaWNhdGUgd2hldGhlciBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudCBzaG91bGQgYmUgcHJvY2Vzc2VkCi0gICAqIG9yIG5vdC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUGFydCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzU2VydmljZSA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzVHlwZXMgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc09wZXJhdGlvbiA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzSW5wdXQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc091dHB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzRmF1bHQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmcgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24gPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmdJbnB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzQmluZGluZ091dHB1dCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzQmluZGluZ0ZhdWx0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NJbXBvcnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0VsZW1lbnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1BvcnQgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1BvcnRUeXBlID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NEZWZpbml0aW9uID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NFeHRlbnNpYmlsaXR5RWxlbWVudCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzU09BUEJpbmRpbmcgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NPQVBIZWFkZXIgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1NPQVBIZWFkZXJGYXVsdCA9IHRydWU7Ci0gIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzU09BUEZhdWx0ID0gdHJ1ZTsKLSAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NTT0FQT3BlcmF0aW9uID0gdHJ1ZTsKLQotICAvKioKLSAgICogTGFzdCBwcm9jZXNzZWQgV1NETCBlbGVtZW50cy4gCi0gICAqLwotICBwcml2YXRlIFBhcnQgYWN0aXZlUGFydCA9IG51bGw7Ci0gIHByaXZhdGUgU2VydmljZSBhY3RpdmVTZXJ2aWNlID0gbnVsbDsKLSAgcHJpdmF0ZSBUeXBlcyBhY3RpdmVUeXBlcyA9IG51bGw7Ci0gIHByaXZhdGUgT3BlcmF0aW9uIGFjdGl2ZU9wZXJhdGlvbiA9IG51bGw7Ci0gIHByaXZhdGUgSW5wdXQgYWN0aXZlSW5wdXQgPSBudWxsOwotICBwcml2YXRlIE91dHB1dCBhY3RpdmVPdXRwdXQgPSBudWxsOwotICBwcml2YXRlIEZhdWx0IGFjdGl2ZUZhdWx0ID0gbnVsbDsKLSAgcHJpdmF0ZSBCaW5kaW5nIGFjdGl2ZUJpbmRpbmcgPSBudWxsOwotICBwcml2YXRlIEJpbmRpbmdPcGVyYXRpb24gYWN0aXZlQmluZGluZ09wZXJhdGlvbiA9IG51bGw7Ci0gIHByaXZhdGUgQmluZGluZ0lucHV0IGFjdGl2ZUJpbmRpbmdJbnB1dCA9IG51bGw7Ci0gIHByaXZhdGUgQmluZGluZ091dHB1dCBhY3RpdmVCaW5kaW5nT3V0cHV0ID0gbnVsbDsKLSAgcHJpdmF0ZSBCaW5kaW5nRmF1bHQgYWN0aXZlQmluZGluZ0ZhdWx0ID0gbnVsbDsKLSAgcHJpdmF0ZSBJbXBvcnQgYWN0aXZlSW1wb3J0ID0gbnVsbDsKLSAgcHJpdmF0ZSBFbGVtZW50IGFjdGl2ZUVsZW1lbnQgPSBudWxsOwotICBwcml2YXRlIE1lc3NhZ2UgYWN0aXZlTWVzc2FnZSA9IG51bGw7Ci0gIHByaXZhdGUgUG9ydCBhY3RpdmVQb3J0ID0gbnVsbDsKLSAgcHJpdmF0ZSBQb3J0VHlwZSBhY3RpdmVQb3J0VHlwZSA9IG51bGw7Ci0gIHByaXZhdGUgRGVmaW5pdGlvbiBhY3RpdmVEZWZpbml0aW9uID0gbnVsbDsKLSAgcHJpdmF0ZSBFeHRlbnNpYmlsaXR5RWxlbWVudCBhY3RpdmVFeHRlbnNpYmlsaXR5RWxlbWVudCA9IG51bGw7Ci0gIHByaXZhdGUgU09BUEJpbmRpbmcgYWN0aXZlU09BUEJpbmRpbmcgPSBudWxsOwotICBwcml2YXRlIFNPQVBCb2R5IGFjdGl2ZVNPQVBCb2R5ID0gbnVsbDsKLSAgcHJpdmF0ZSBTT0FQSGVhZGVyIGFjdGl2ZVNPQVBIZWFkZXIgPSBudWxsOwotICBwcml2YXRlIFNPQVBIZWFkZXJGYXVsdCBhY3RpdmVTT0FQSGVhZGVyRmF1bHQgPSBudWxsOwotICBwcml2YXRlIFNPQVBGYXVsdCBhY3RpdmVTT0FQRmF1bHQgPSBudWxsOwotICBwcml2YXRlIFNPQVBPcGVyYXRpb24gYWN0aXZlU09BUE9wZXJhdGlvbiA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFBhcmFtZXRlcnMgbWFwCi0gICAqLwotICBNYXAgcGFyYW1zID0gbmV3IFRyZWVNYXAoKTsKLQotICAvKioKLSAgICogQWN0aXZlIHRyYXZlcnNhbC4KLSAgICovCi0gIGZpbmFsIHByaXZhdGUgV1NETFRyYXZlcnNhbCB0cmF2ZXJzYWw7Ci0KLSAgLyoqCi0gICAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gdHJhdmVyc2FsCi0gICAqLwotICBXU0RMVHJhdmVyc2FsQ29udGV4dChXU0RMVHJhdmVyc2FsIHRyYXZlcnNhbCkKLSAgewotICAgIHRoaXMudHJhdmVyc2FsID0gdHJhdmVyc2FsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGFjdGl2ZSB0cmF2ZXJzYWwuCi0gICAqIEByZXR1cm4gdGhhIGFjdGl2ZSB0cmF2ZXJzYWwuCi0gICAqLwotICBwdWJsaWMgV1NETFRyYXZlcnNhbCBnZXRUcmF2ZXJzYWwoKQotICB7Ci0gICAgcmV0dXJuIHRyYXZlcnNhbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHBhcmFtZXRlciBmcm9tIGNvbnRleHQgYnkgdGhlIGdpdmVuIGtleS4gCi0gICAqIEBwYXJhbSBrZXkgIGEga2V5IHZhbHVlLgotICAgKiBAcmV0dXJuIGEgcGFyYW1ldGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyKE9iamVjdCBrZXkpCi0gIHsKLSAgICByZXR1cm4gcGFyYW1zLmdldChrZXkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgcGFyYW1ldGVyIGludG8gY29udGV4dCB3aXRoIHRoZSBnaXZlbiBrZXkuCi0gICAqIEBwYXJhbSBrZXkgICAgdGhlIGtleS4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXIoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKQotICB7Ci0gICAgcGFyYW1zLnB1dChrZXksIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmVzIHRoZSBwYXJhbWV0ZXIgZnJvbSBjb250ZXh0IGJ5IHRoZSBnaXZlbiBrZXkuCi0gICAqIEBwYXJhbSBrZXkgIGEga2V5IHZhbHVlLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlUGFyYW1ldGVyKE9iamVjdCBrZXkpCi0gIHsKLSAgICBwYXJhbXMucmVtb3ZlKGtleSk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcGFydC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxQYXJ0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzUGFydCA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBzZXJ2aWNlLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbFNlcnZpY2VQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTZXJ2aWNlID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHR5cGVzLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbFR5cGVzUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzVHlwZXMgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgb3BlcmF0aW9uLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbE9wZXJhdGlvblByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc09wZXJhdGlvbiA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBpbnB1dC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxJbnB1dFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0lucHV0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG91dHB1dC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxPdXRwdXRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NPdXRwdXQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZmF1bHQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsRmF1bHRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NGYXVsdCA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbEJpbmRpbmdQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NCaW5kaW5nID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NCaW5kaW5nT3BlcmF0aW9uID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgaW5wdXQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsQmluZGluZ0lucHV0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzQmluZGluZ0lucHV0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgb3V0cHV0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbEJpbmRpbmdPdXRwdXRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NCaW5kaW5nT3V0cHV0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgZmF1bHQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsQmluZGluZ0ZhdWx0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzQmluZGluZ0ZhdWx0ID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGltcG9ydC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxJbXBvcnRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NJbXBvcnQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxFbGVtZW50UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzRWxlbWVudCA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBtZXNzYWdlLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbE1lc3NhZ2VQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NNZXNzYWdlID0gZmFsc2U7Ci0gIH0KLSAgLyoqCi0gICAqIENhbmNlbHMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBvcnQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsUG9ydFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1BvcnQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcG9ydCB0eXBlLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbFBvcnRUeXBlUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzUG9ydFR5cGUgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZGVmaW5pdGlvbi4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxEZWZpbml0aW9uUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzRGVmaW5pdGlvbiA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsRXh0ZW5zaWJpbGl0eUVsZW1lbnRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NFeHRlbnNpYmlsaXR5RWxlbWVudCA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIGJpbmRpbmcuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsU09BUEJpbmRpbmdQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTT0FQQmluZGluZyA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIGhlYWRlci4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxTT0FQSGVhZGVyUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUEhlYWRlciA9IGZhbHNlOwotICB9Ci0gIC8qKgotICAgKiBDYW5jZWxzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIGhlYWRlciBmYXVsdC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxTT0FQSGVhZGVyRmF1bHRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTT0FQSGVhZGVyRmF1bHQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBmYXVsdC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCBjYW5jZWxTT0FQRmF1bHRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTT0FQRmF1bHQgPSBmYWxzZTsKLSAgfQotICAvKioKLSAgICogQ2FuY2VscyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgb3BlcmF0aW9uLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNhbmNlbFNPQVBPcGVyYXRpb25Qcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTT0FQT3BlcmF0aW9uID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogQ2FuY2VscyBXU0RMIGVsZW1lbnRzIHByb2Nlc3NpbmcuIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FuY2VsUHJvY2Vzc2luZygpCi0gIHsKLSAgICBjYW5jZWxQYXJ0UHJvY2Vzc2luZygpOwotICAgIGNhbmNlbFNlcnZpY2VQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsVHlwZXNQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbElucHV0UHJvY2Vzc2luZygpOwotICAgIGNhbmNlbE91dHB1dFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxGYXVsdFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxCaW5kaW5nUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbEJpbmRpbmdPcGVyYXRpb25Qcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsQmluZGluZ0lucHV0UHJvY2Vzc2luZygpOwotICAgIGNhbmNlbEJpbmRpbmdPdXRwdXRQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsQmluZGluZ0ZhdWx0UHJvY2Vzc2luZygpOwotICAgIGNhbmNlbEltcG9ydFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxFbGVtZW50UHJvY2Vzc2luZygpOwotICAgIGNhbmNlbE1lc3NhZ2VQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsUG9ydFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxQb3J0VHlwZVByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxEZWZpbml0aW9uUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbEV4dGVuc2liaWxpdHlFbGVtZW50UHJvY2Vzc2luZygpOwotICAgIGNhbmNlbFNPQVBCaW5kaW5nUHJvY2Vzc2luZygpOwotICAgIGNhbmNlbFNPQVBIZWFkZXJQcm9jZXNzaW5nKCk7Ci0gICAgY2FuY2VsU09BUEhlYWRlckZhdWx0UHJvY2Vzc2luZygpOwotICAgIGNhbmNlbFNPQVBGYXVsdFByb2Nlc3NpbmcoKTsKLSAgICBjYW5jZWxTT0FQT3BlcmF0aW9uUHJvY2Vzc2luZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBhcnQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lUGFydFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc1BhcnQgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBzZXJ2aWNlLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZVNlcnZpY2VQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTZXJ2aWNlID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgdHlwZXMuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lVHlwZXNQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NUeXBlcyA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG9wZXJhdGlvbi4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVPcGVyYXRpb25Qcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NPcGVyYXRpb24gPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBpbnB1dC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVJbnB1dFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0lucHV0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgb3V0cHV0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZU91dHB1dFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc091dHB1dCA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGZhdWx0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZUZhdWx0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzRmF1bHQgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZUJpbmRpbmdQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NCaW5kaW5nID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZyBvcGVyYXRpb24uIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lQmluZGluZ09wZXJhdGlvblByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0JpbmRpbmdPcGVyYXRpb24gPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIGlucHV0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZUJpbmRpbmdJbnB1dFByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc0JpbmRpbmdJbnB1dCA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgb3V0cHV0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZUJpbmRpbmdPdXRwdXRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NCaW5kaW5nT3V0cHV0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZyBmYXVsdC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVCaW5kaW5nRmF1bHRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NCaW5kaW5nRmF1bHQgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBpbXBvcnQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lSW1wb3J0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzSW1wb3J0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVFbGVtZW50UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzRWxlbWVudCA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG1lc3NhZ2UuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lTWVzc2FnZVByb2Nlc3NpbmcoKQotICB7Ci0gICAgcHJvY2Vzc01lc3NhZ2UgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBwb3J0LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZVBvcnRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NQb3J0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcG9ydCB0eXBlLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZVBvcnRUeXBlUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzUG9ydFR5cGUgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBkZWZpbml0aW9uLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZURlZmluaXRpb25Qcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NEZWZpbml0aW9uID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZUV4dGVuc2liaWxpdHlFbGVtZW50UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnQgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIGJpbmRpbmcuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lU09BUEJpbmRpbmdQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTT0FQQmluZGluZyA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIFJlc3VtZXMgcHJvY2Vzc2luZyBvZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgaGVhZGVyLiAKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc3VtZVNPQVBIZWFkZXJQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTT0FQSGVhZGVyID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBoZWFkZXIgZmF1bHQuIAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzdW1lU09BUEhlYWRlckZhdWx0UHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUEhlYWRlckZhdWx0ID0gdHJ1ZTsKLSAgfQotICAvKioKLSAgICogUmVzdW1lcyBwcm9jZXNzaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBmYXVsdC4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVTT0FQRmF1bHRQcm9jZXNzaW5nKCkKLSAgewotICAgIHByb2Nlc3NTT0FQRmF1bHQgPSB0cnVlOwotICB9Ci0gIC8qKgotICAgKiBSZXN1bWVzIHByb2Nlc3Npbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIG9wZXJhdGlvbi4gCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXN1bWVTT0FQT3BlcmF0aW9uUHJvY2Vzc2luZygpCi0gIHsKLSAgICBwcm9jZXNzU09BUE9wZXJhdGlvbiA9IHRydWU7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcGFydCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBwYXJ0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUGFydCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc1BhcnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgc2VydmljZSBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBzZXJ2aWNlIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzU2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc1NlcnZpY2U7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgdHlwZXMgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgdHlwZXMgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc1R5cGVzOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBvcGVyYXRpb24gc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NPcGVyYXRpb247Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgaW5wdXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgaW5wdXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0lucHV0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG91dHB1dCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBvdXRwdXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NPdXRwdXQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NPdXRwdXQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZmF1bHQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZmF1bHQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ZhdWx0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZyBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0JpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NCaW5kaW5nOwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzQmluZGluZ09wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0JpbmRpbmdPcGVyYXRpb247Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZyBpbnB1dCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIGlucHV0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzQmluZGluZ0lucHV0KCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzQmluZGluZ0lucHV0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgb3V0cHV0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGJpbmRpbmcgb3V0cHV0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzQmluZGluZ091dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0JpbmRpbmdPdXRwdXQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgYmluZGluZyBmYXVsdCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBiaW5kaW5nIGZhdWx0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzQmluZGluZ0ZhdWx0KCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzQmluZGluZ0ZhdWx0OwotICB9Ci0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGltcG9ydCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBpbXBvcnQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NJbXBvcnQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBvcnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZWxlbWVudCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBlbGVtZW50IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzRWxlbWVudCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0VsZW1lbnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgbWVzc2FnZSBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBtZXNzYWdlIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc01lc3NhZ2U7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcG9ydCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBwb3J0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzUG9ydCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc1BvcnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgcG9ydCB0eXBlIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIHBvcnQgdHlwZSBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1BvcnRUeXBlKCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzUG9ydFR5cGU7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZGVmaW5pdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBkZWZpbml0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzRGVmaW5pdGlvbigpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0RlZmluaXRpb247Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIGV4dGVuc2liaWxpdHkgZWxlbWVudCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0V4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBiaW5kaW5nIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgYmluZGluZyBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1NPQVBCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBwcm9jZXNzU09BUEJpbmRpbmc7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBoZWFkZXIgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBoZWFkZXIgc2hvdWxkIGJlIHByb2Nlc3NlZC5uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzU09BUEhlYWRlcigpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc1NPQVBIZWFkZXI7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BUCBoZWFkZXIgZmF1bHQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgU09BIGhlYWRlciBmYXVsdCBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1NPQVBIZWFkZXJGYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc1NPQVBIZWFkZXJGYXVsdDsKLSAgfQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgV1NETCBTT0FQIGZhdWx0IHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIFNPQVAgZmF1bHQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3NTT0FQRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NTT0FQRmF1bHQ7Ci0gIH0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIFdTREwgb3BlcmF0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ycmVzcG9uZGluZyBXU0RMIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc1NPQVBPcGVyYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NTT0FQT3BlcmF0aW9uOwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgcGFydCB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgcGFydCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldFBhcnQoUGFydCB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVBhcnQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIHBhcnQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgcGFydC4KLSAgICovCi0gIHB1YmxpYyBQYXJ0IGdldFBhcnQoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZVBhcnQ7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBzZXJ2aWNlIHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBzZXJ2aWNlIHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0U2VydmljZShTZXJ2aWNlIHZhbHVlKQotICB7Ci0gICAgYWN0aXZlU2VydmljZSA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgc2VydmljZS4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBzZXJ2aWNlLgotICAgKi8KLSAgcHVibGljIFNlcnZpY2UgZ2V0U2VydmljZSgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlU2VydmljZTsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIHR5cGVzIHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCB0eXBlcyB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldFR5cGVzKFR5cGVzIHZhbHVlKQotICB7Ci0gICAgYWN0aXZlVHlwZXMgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIHR5cGVzLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIHR5cGVzLgotICAgKi8KLSAgcHVibGljIFR5cGVzIGdldFR5cGVzKCkKLSAgewotICAgIHJldHVybiBhY3RpdmVUeXBlczsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIG9wZXJhdGlvbiB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgb3BlcmF0aW9uIHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0T3BlcmF0aW9uKE9wZXJhdGlvbiB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZU9wZXJhdGlvbiA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgb3BlcmF0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIG9wZXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBhY3RpdmVPcGVyYXRpb247Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBpbnB1dCB0byBiZSBwcm9jZXNzZWQKLSAgICogQHBhcmFtIHRoZSBXU0RMIGlucHV0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0SW5wdXQoSW5wdXQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVJbnB1dCA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgaW5wdXQuCi0gICAqIEByZXR1cm4gbGFzdCBwcm9jZXNzZWQgV1NETCBpbnB1dC4KLSAgICovCi0gIHB1YmxpYyBJbnB1dCBnZXRJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlSW5wdXQ7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBvdXRwdXQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIG91dHB1dCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldE91dHB1dChPdXRwdXQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVPdXRwdXQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIG91dHB1dC4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBvdXRwdXQuCi0gICAqLwotICBwdWJsaWMgT3V0cHV0IGdldE91dHB1dCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlT3V0cHV0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgZmF1bHQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGZhdWx0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0RmF1bHQoRmF1bHQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVGYXVsdCA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgZmF1bHQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgZmF1bHQuCi0gICAqLwotICBwdWJsaWMgRmF1bHQgZ2V0RmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZUZhdWx0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgYmluZGluZyB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgYmluZGluZyB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldEJpbmRpbmcoQmluZGluZyB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZUJpbmRpbmcgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgYmluZGluZy4KLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nIGdldEJpbmRpbmcoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZUJpbmRpbmc7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBiaW5kaW5nIG9wZXJhdGlvbiB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFNETCBiaW5kaW5nIG9wZXJhdGlvbiB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldEJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZUJpbmRpbmdPcGVyYXRpb24gPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uLgotICAgKi8KLSAgcHVibGljIEJpbmRpbmdPcGVyYXRpb24gZ2V0QmluZGluZ09wZXJhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlQmluZGluZ09wZXJhdGlvbjsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGJpbmRpbmcgaW5wdXQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGJpbmRpbmcgaW5wdXQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlQmluZGluZ0lucHV0ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBiaW5kaW5nIGlucHV0LgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcgaW5wdXQuCi0gICAqLwotICBwdWJsaWMgQmluZGluZ0lucHV0IGdldEJpbmRpbmdJbnB1dCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlQmluZGluZ0lucHV0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgYmluZGluZyBvdXRwdXQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGJpbmRpbmcgb3V0cHV0IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0QmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlQmluZGluZ091dHB1dCA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgYmluZGluZyBvdXRwdXQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgYmluZGluZyBvdXRwdXQuCi0gICAqLwotICBwdWJsaWMgQmluZGluZ091dHB1dCBnZXRCaW5kaW5nT3V0cHV0KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVCaW5kaW5nT3V0cHV0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgYmluZGluZyBmYXVsdCB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgYmluZGluZyBmYXVsdCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldEJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVCaW5kaW5nRmF1bHQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIGJpbmRpbmcgZmF1bHQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgYmluZGluZyBmYXVsdC4KLSAgICovCi0gIHB1YmxpYyBCaW5kaW5nRmF1bHQgZ2V0QmluZGluZ0ZhdWx0KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVCaW5kaW5nRmF1bHQ7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBpbXBvcnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGltcG9ydCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldEltcG9ydChJbXBvcnQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVJbXBvcnQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIGltcG9ydC4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBpbXBvcnQuCi0gICAqLwotICBwdWJsaWMgSW1wb3J0IGdldEltcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlSW1wb3J0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZUVsZW1lbnQgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnQ7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBtZXNzYWdlIHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0TWVzc2FnZShNZXNzYWdlIHZhbHVlKQotICB7Ci0gICAgYWN0aXZlTWVzc2FnZSA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgbWVzc2FnZS4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2UgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlTWVzc2FnZTsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIHBvcnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIHBvcnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRQb3J0KFBvcnQgdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVQb3J0ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBwb3J0LgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIHBvcnQuCi0gICAqLwotICBwdWJsaWMgUG9ydCBnZXRQb3J0KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVQb3J0OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgcG9ydCB0eXBlIHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBwb3J0IHR5cGUgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRQb3J0VHlwZShQb3J0VHlwZSB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVBvcnRUeXBlID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBwb3J0IHR5cGUuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgcG9ydCB0eXBlLgotICAgKi8KLSAgcHVibGljIFBvcnRUeXBlIGdldFBvcnRUeXBlKCkKLSAgewotICAgIHJldHVybiBhY3RpdmVQb3J0VHlwZTsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGRlZmluaXRpb24gdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGRlZmluaXRpb24gdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXREZWZpbml0aW9uKERlZmluaXRpb24gdmFsdWUpCi0gIHsKLSAgICBhY3RpdmVEZWZpbml0aW9uID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBkZWZpbml0aW9uLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIGRlZmluaXRpb24uCi0gICAqLwotICBwdWJsaWMgRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkKLSAgewotICAgIHJldHVybiBhY3RpdmVEZWZpbml0aW9uOwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZUV4dGVuc2liaWxpdHlFbGVtZW50ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgZXh0ZW5zaWJpbGl0eSBlbGVtZW50LgotICAgKi8KLSAgcHVibGljIEV4dGVuc2liaWxpdHlFbGVtZW50IGdldEV4dGVuc2liaWxpdHlFbGVtZW50KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVFeHRlbnNpYmlsaXR5RWxlbWVudDsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRTT0FQQmluZGluZyhTT0FQQmluZGluZyB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVNPQVBCaW5kaW5nID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBTT0FQIGJpbmRpbmcuCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBiaW5kaW5nLgotICAgKi8KLSAgcHVibGljIFNPQVBCaW5kaW5nIGdldFNPQVBCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiBhY3RpdmVTT0FQQmluZGluZzsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIFdTREwgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldFNPQVBCb2R5KFNPQVBCb2R5IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlU09BUEJvZHkgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIFNPQVAgYm9keS4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBTT0FQIGJvZHkuCi0gICAqLwotICBwdWJsaWMgU09BUEJvZHkgZ2V0U09BUEJvZHkoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZVNPQVBCb2R5OwotICB9Ci0gIC8qKgotICAgKiBTZXRzIFdTREwgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIFdTREwgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQuCi0gICAqLwotICB2b2lkIHNldFNPQVBIZWFkZXIoU09BUEhlYWRlciB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVNPQVBIZWFkZXIgPSB2YWx1ZTsKLSAgfQotICAvKioKLSAgICogR2V0cyBsYXN0IHByb2Nlc3NlZCBXU0RMIFNPQVAgaGVhZGVyLgotICAgKiBAcmV0dXJuIHRoZSBsYXN0IHByb2Nlc3NlZCBXU0RMIFNPQVAgaGVhZGVyLgotICAgKi8KLSAgcHVibGljIFNPQVBIZWFkZXIgZ2V0U09BUEhlYWRlcigpCi0gIHsKLSAgICByZXR1cm4gYWN0aXZlU09BUEhlYWRlcjsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZSBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKi8KLSAgdm9pZCBzZXRTT0FQSGVhZGVyRmF1bHQoU09BUEhlYWRlckZhdWx0IHZhbHVlKQotICB7Ci0gICAgYWN0aXZlU09BUEhlYWRlckZhdWx0ID0gdmFsdWU7Ci0gIH0KLSAgLyoqCi0gICAqIEdldHMgbGFzdCBwcm9jZXNzZWQgV1NETCBTT0FQIGhlYWRlciBmYXVsdC4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBTT0FQIGhlYWRlciBmYXVsdC4KLSAgICovCi0gIHB1YmxpYyBTT0FQSGVhZGVyRmF1bHQgZ2V0U09BUEhlYWRlckZhdWx0KCkKLSAgewotICAgIHJldHVybiBhY3RpdmVTT0FQSGVhZGVyRmF1bHQ7Ci0gIH0KLSAgLyoqCi0gICAqIFNldHMgV1NETCBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICogQHBhcmFtIHZhbHVlICB0aGUgV1NETCBlbGVtZW50IHRvIGJlIHByb2Nlc3NlZC4KLSAgICovCi0gIHZvaWQgc2V0U09BUEZhdWx0KFNPQVBGYXVsdCB2YWx1ZSkKLSAgewotICAgIGFjdGl2ZVNPQVBGYXVsdCA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBmYXVsdC4KLSAgICogQHJldHVybiB0aGUgbGFzdCBwcm9jZXNzZWQgV1NETCBTT0FQIGZhdWx0LgotICAgKi8KLSAgcHVibGljIFNPQVBGYXVsdCBnZXRTT0FQRmF1bHQoKQotICB7Ci0gICAgcmV0dXJuIGFjdGl2ZVNPQVBGYXVsdDsKLSAgfQotICAvKioKLSAgICogU2V0cyBXU0RMIGVsZW1lbnQgdG8gYmUgcHJvY2Vzc2VkLgotICAgKiBAcGFyYW0gdmFsdWUgIHRoZVdTREwgZWxlbWVudCB0byBiZSBwcm9jZXNzZWQKLSAgICovCi0gIHZvaWQgc2V0U09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIHZhbHVlKQotICB7Ci0gICAgYWN0aXZlU09BUE9wZXJhdGlvbiA9IHZhbHVlOwotICB9Ci0gIC8qKgotICAgKiBHZXRzIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBvcGVyYXRpb24uCi0gICAqIEByZXR1cm4gdGhlIGxhc3QgcHJvY2Vzc2VkIFdTREwgU09BUCBvcGVyYXRpb24uCi0gICAqLwotICBwdWJsaWMgU09BUE9wZXJhdGlvbiBnZXRTT0FQT3BlcmF0aW9uKCkKLSAgewotICAgIHJldHVybiBhY3RpdmVTT0FQT3BlcmF0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC90cmF2ZXJzYWwvV1NETFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3RyYXZlcnNhbC9XU0RMVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk1ZDdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3RyYXZlcnNhbC9XU0RMVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnRyYXZlcnNhbDsKLQotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdGYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuSW1wb3J0OwotaW1wb3J0IGphdmF4LndzZGwuSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5NZXNzYWdlOwotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuT3V0cHV0OwotaW1wb3J0IGphdmF4LndzZGwuUGFydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgud3NkbC5UeXBlczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAuU09BUEhlYWRlckZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZGVmaW5lcyBjYWxsYmFjayBtZXRob2RzIGR1cmluZyB0cmF2ZXJzZSBXU0RMLgotICogV1NETFZpc2l0b3IgY291bGQgY2FuY2VsIGFydGlmYWN0IHByb2Nlc3NpbmcgYnkgdXNpbmcgdHJhdmVyc2FsIGNvbnRleHQKLSAqIDxjb2RlPmNhbmNlbFhYWFByb2Nlc3Npbmc8L2NvZGU+IG1ldGhvZHMuCi0gKiAKLSAqIEBhdXRob3IgS3VsaWsKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMVmlzaXRvcgotewotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIHBhcnQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoUGFydCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgc2VydmljZSBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTZXJ2aWNlIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCB0eXBlcyBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChUeXBlcyBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgb3BlcmF0aW9uIG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE9wZXJhdGlvbiBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgaW5wdXQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoSW5wdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIG91dHB1dCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChPdXRwdXQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIGZhdWx0IG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEZhdWx0IG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBiaW5kaW5nIG9iamVjdC4KLSAgICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmcgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIGJpbmRpbmcgb3BlcmF0aW9uIG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KAotICAgIEJpbmRpbmdPcGVyYXRpb24gb2JqLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBiaW5kaW5nIGlucHV0IG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEJpbmRpbmdJbnB1dCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgYmluZGluZyBvdXRwdXQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoQmluZGluZ091dHB1dCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgYmluZGluZyBmYXVsdCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChCaW5kaW5nRmF1bHQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIGltcG9ydCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChJbXBvcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIGVsZW1lbnQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoRWxlbWVudCBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgbWVzc2FnZSBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChNZXNzYWdlIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBwb3J0IG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBjdHggY3VycmVudCB0cmF2ZXJzYWwgY29udGV4dC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFBvcnQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIHBvcnQgdHlwZSBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChQb3J0VHlwZSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgZGVmaW5pdGlvbiBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChEZWZpbml0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBleHRlbnNpYmlsaXR5IGVsZW1lbnQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgb2JqLAotICAgIE9iamVjdCBwYXJlbnQsCi0gICAgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLSAgLyoqCi0gICAqIE1ldGhvZCB2aXNpdHMgV1NETCBTT0FQIGJpbmRpbmcgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEJpbmRpbmcgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIFNPQVAgYm9keSBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQQm9keSBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgU09BUCBoZWFkZXIgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoU09BUEhlYWRlciBvYmosIE9iamVjdCBwYXJlbnQsIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgU09BUCBoZWFkZXIgZmF1bHQgb2JqZWN0LgotICAgKiBAcGFyYW0gb2JqIFdTREwgZWxlbWVudCB0byBiZSB2aXNpdGVkLgotICAgKiBAcGFyYW0gcGFyZW50IFdTREwgZWxlbWVudC4KLSAgICogQHBhcmFtIGN0eCBjdXJyZW50IHRyYXZlcnNhbCBjb250ZXh0LgotICAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoCi0gICAgU09BUEhlYWRlckZhdWx0IG9iaiwKLSAgICBPYmplY3QgcGFyZW50LAotICAgIFdTRExUcmF2ZXJzYWxDb250ZXh0IGN0eCk7Ci0gIC8qKgotICAgKiBNZXRob2QgdmlzaXRzIFdTREwgU09BUCBmYXVsdCBvYmplY3QuCi0gICAqIEBwYXJhbSBvYmogV1NETCBlbGVtZW50IHRvIGJlIHZpc2l0ZWQuCi0gICAqIEBwYXJhbSBwYXJlbnQgV1NETCBlbGVtZW50LgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQRmF1bHQgb2JqLCBPYmplY3QgcGFyZW50LCBXU0RMVHJhdmVyc2FsQ29udGV4dCBjdHgpOwotICAvKioKLSAgICogTWV0aG9kIHZpc2l0cyBXU0RMIFNPQVAgb3BlcmF0aW9uIG9iamVjdC4KLSAgICogQHBhcmFtIG9iaiBXU0RMIGVsZW1lbnQgdG8gYmUgdmlzaXRlZC4KLSAgICogQHBhcmFtIHBhcmVudCBXU0RMIGVsZW1lbnQuLgotICAgKiBAcGFyYW0gY3R4IGN1cnJlbnQgdHJhdmVyc2FsIGNvbnRleHQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChTT0FQT3BlcmF0aW9uIG9iaiwgT2JqZWN0IHBhcmVudCwgV1NETFRyYXZlcnNhbENvbnRleHQgY3R4KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9GaWxlRW50aXR5UmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9GaWxlRW50aXR5UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwOTMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvRmlsZUVudGl0eVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBFbnRpdHkgcmVzb2x2ZSB0byByZXNvbHZlIGZpbGUgZW50aXRpZXMuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGNsYXNzIEZpbGVFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXIpCi0gICAqLwotICBwdWJsaWMgWE1MSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShYTUxSZXNvdXJjZUlkZW50aWZpZXIgcmVzb3VyY2UpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHVibGljSWQgPSByZXNvdXJjZS5nZXRQdWJsaWNJZCgpOwotICAgIFN0cmluZyBzeXN0ZW1JZCA9IHJlc291cmNlLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gcmVzb3VyY2UuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgVVJMIHVybCA9IG51bGw7Ci0gICAgaWYoc3lzdGVtSWQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB1cmwgPSBuZXcgVVJMKHN5c3RlbUlkKTsKLSAgICB9Ci0gICAgZWxzZSBpZihwdWJsaWNJZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwocHVibGljSWQpOwotICAgIH0KLSAgICBlbHNlIGlmKG5hbWVzcGFjZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHVybCA9IG5ldyBVUkwobmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgaWYodXJsICE9IG51bGwpCi0gICAgewotICAgICAgSW5wdXRTdHJlYW0gaXMgPSB1cmwub3BlblN0cmVhbSgpOwotICAgICAgcmV0dXJuIG5ldyBYTUxJbnB1dFNvdXJjZShwdWJsaWNJZCwgcmVzb3VyY2UuZ2V0RXhwYW5kZWRTeXN0ZW1JZCgpLCByZXNvdXJjZS5nZXRFeHBhbmRlZFN5c3RlbUlkKCksIGlzLCBudWxsKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL0lubGluZVNjaGVtYUdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL0lubGluZVNjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTE5MDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9JbmxpbmVTY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uaWJtLndzZGwuQ29uc3RhbnRzOwotCi0vKioKLSAqIEdlbmVyYXRlIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NoZW1hIGZvciBhbiBpbmxpbmUgc2NoZW1hLiBXaWxsIGFkZCBpbXBvcnRzIGZvciB1bnJlc29sdmVkCi0gKiBuYW1lc3BhY2VzLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVTY2hlbWFHZW5lcmF0b3IKLXsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTT0FQX0VOQ09ESU5HX1VSSSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVggPSAiZmlsZTovLy8iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUQVJHRVROQU1FU1BBQ0UgPSAidGFyZ2V0TmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBJTVBPUlQgPSAiaW1wb3J0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImluY2x1ZGUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNDSEVNQSA9ICJzY2hlbWEiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFNDSEVNQUxPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBUWVBFID0gInR5cGUiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBpZ25vcmVOYW1lc3BhY2VzID0KLSAgICB7IENvbnN0YW50cy5OU19VUklfWFNEXzE5OTksIENvbnN0YW50cy5OU19VUklfWFNEXzIwMDAsIENvbnN0YW50cy5OU19VUklfWFNEXzIwMDEgfTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIElubGluZVNjaGVtYUdlbmVyYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIElubGluZVNjaGVtYUdlbmVyYXRvcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgaW5saW5lIHNjaGVtYSBnZW5lcmF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIElubGluZVNjaGVtYUdlbmVyYXRvciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBJbmxpbmVTY2hlbWFHZW5lcmF0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NoZW1hIGZyb20gdGhlIGVsZW1lbnQgcHJvdmlkZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBlbGVtZW50cyBBIGxpc3Qgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gICAqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBzY2hlbWEuCi0gICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzY2hlbWEuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVYU0RTdHJpbmcoRWxlbWVudCBlbGVtZW50LCBMaXN0IGVsZW1lbnRzLCBTdHJpbmcgZmlsZWxvY2F0aW9uKQotICB7Ci0gICAgcmV0dXJuIElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcoZWxlbWVudCwgZWxlbWVudHMsIGZpbGVsb2NhdGlvbiwgbmV3IEhhc2h0YWJsZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gIAkqIENyZWF0ZXMgYSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzY2hlbWEgbW9kZWwgd2l0aCB0aGUgcm9vdCBlbGVtZW50IG9mCi0gIAkqIGV4dEVsZW0uIENhbGxzIGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5IHRvIHRha2UgY2FyZSBvZiBidWlsZGluZyB0aGUgU3RyaW5nCi0gIAkqIGFmdGVyIGl0IG9idGFpbnMgdGhlIEVsZW1lbnQgZnJvbSB0aGUgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50LgotICAJKiAKLSAgCSogQHBhcmFtIGVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAJKiBAcGFyYW0gZWxlbWVudHMgQSBsaXN0IHRvIGNvbnRhaW4gdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gIAkqIEBwYXJhbSBmaWxlbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRoZSBzY2hlbWEgaXMgbG9jYXRlZCBpbi4KLSAgCSogQHBhcmFtIHBhcmVudE5TcyBBIGhhc2h0YWJsZSBvZiBwYXJlbnQgbmFtZXNwYWNlcyB0byB1c2VkIHRvIHJlc29sdmUgcHJlZml4ZXMuCi0gIAkqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjaGVtYSB3aXRoIHRoZSByb290IGVsZW1lbnQgJ2VsZW1lbnQnLgotICAJKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlWFNEU3RyaW5nKEVsZW1lbnQgZWxlbWVudCwgTGlzdCBlbGVtZW50cywgU3RyaW5nIGZpbGVsb2NhdGlvbiwgSGFzaHRhYmxlIHBhcmVudE5TcykKLSAgewotICAgIElubGluZVNjaGVtYUdlbmVyYXRvciBzY2hlbWFHZW5lcmF0b3IgPSBJbmxpbmVTY2hlbWFHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgICBIYXNodGFibGUgbnNSZXNvbHZlciA9IHNjaGVtYUdlbmVyYXRvci5nZXROU1Jlc29sdmVyKGVsZW1lbnQpOwotICAgIExpc3QgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0UmVxdWlyZWROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIEhhc2h0YWJsZSByZXFOU0RlY2wgPSBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9IYXNodGFibGUgcmVxTlNEZWNsID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTlNEZWNsYXJhdGlvbnMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgTGlzdCBpbXBvcnROUyA9IHNjaGVtYUdlbmVyYXRvci5nZXRJbXBvcnROYW1lc3BhY2VzKGVsZW1lbnQpOwotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLnJlbW92ZUltcG9ydHMocmVxbnMsIGltcG9ydE5TKTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVMb2NhbE5hbWVzcGFjZXMocmVxbnMsIGVsZW1lbnQpOwotICAgIHJldHVybiBzY2hlbWFHZW5lcmF0b3IuY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkoZWxlbWVudCwgZWxlbWVudHMsIHJlcW5zLCByZXFOU0RlY2wsIGZpbGVsb2NhdGlvbik7Ci0gIH0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2UgaXMgcmVxdWlyZWQgYnV0IG5vdCBpbXBvcnRlZC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gcGFyZW50TlNzIEEgaGFzaHRhYmxlIG9mIHRoZSBwYXJlbnQgbmFtZXNwYWNlcy4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzb2FwIGVuY29kaW5nIG5hbWVzcGFjZSBpcyByZXF1aXJlZCBidXQgbm90IGltcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc29hcEVuY29kaW5nUmVxdWlyZWROb3RJbXBvcnRlZChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBmaWxlbG9jYXRpb24sIEhhc2h0YWJsZSBwYXJlbnROU3MpCi0gIHsKLSAgICBJbmxpbmVTY2hlbWFHZW5lcmF0b3Igc2NoZW1hR2VuZXJhdG9yID0gSW5saW5lU2NoZW1hR2VuZXJhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgSGFzaHRhYmxlIG5zUmVzb2x2ZXIgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0TlNSZXNvbHZlcihlbGVtZW50KTsKLSAgICBMaXN0IHJlcW5zID0gbnVsbDsKLQotICAgIHJlcW5zID0gc2NoZW1hR2VuZXJhdG9yLmdldFJlcXVpcmVkTmFtZXNwYWNlcyhlbGVtZW50KTsKLSAgICBzY2hlbWFHZW5lcmF0b3IucmVzb2x2ZU5hbWVzcGFjZXMocmVxbnMsIG5zUmVzb2x2ZXIsIHBhcmVudE5Tcyk7Ci0gICAgLy9zY2hlbWFHZW5lcmF0b3IucmVzb2x2ZVVuZGVjbGFyZWROYW1lc3BhY2VzKHJlcW5zLCBwYXJlbnROU3MpOwotICAgIExpc3QgaW1wb3J0TlMgPSBzY2hlbWFHZW5lcmF0b3IuZ2V0SW1wb3J0TmFtZXNwYWNlcyhlbGVtZW50KTsKLSAgICByZXFucyA9IHNjaGVtYUdlbmVyYXRvci5yZW1vdmVJbXBvcnRzKHJlcW5zLCBpbXBvcnROUyk7Ci0gICAgcmVxbnMgPSBzY2hlbWFHZW5lcmF0b3IucmVtb3ZlTG9jYWxOYW1lc3BhY2VzKHJlcW5zLCBlbGVtZW50KTsKLQotICAgIHJldHVybiBzY2hlbWFHZW5lcmF0b3IuY2hlY2tTT0FQRW5jb2RpbmdSZXF1aXJlZChyZXFucyk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyByZWN1cnNpdmUgbWV0aG9kIGNyZWF0ZXMgdGhlIHNjaGVtYSBTdHJpbmcgZnJvbSB0aGUgcm9vdCBFbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcGFyYW0gZWxlbWVudHMgQSBsaXN0IHRvIGJlIGNyZWF0ZWQgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEgaW4gb3JkZXIuCi0gICAqIEBwYXJhbSByZXF1aXJlZE5hbWVzcGFjZXMgQSBsaXN0IG9mIHJlcXVpcmVkIG5hbWVzcGFjZXMuCi0gICAqIEBwYXJhbSByZXFOU0RlY2wgQSBoYXNodGFibGUgb2YgcmVxdWlyZWQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4KLSAgICogQHBhcmFtIGZpbGVsb2NhdGlvbiBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhpcyBzY2hlbWEuCi0gICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzY2hlbWEuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZVhTRFN0cmluZ1JlY3Vyc2l2ZWx5KAotICAgIEVsZW1lbnQgZWxlbSwKLSAgICBMaXN0IGVsZW1lbnRzLAotICAgIExpc3QgcmVxdWlyZWROYW1lc3BhY2VzLAotICAgIEhhc2h0YWJsZSByZXFOU0RlY2wsCi0gICAgU3RyaW5nIGZpbGVsb2NhdGlvbikKLSAgewotICAgIGlmIChlbGVtID09IG51bGwpCi0gICAgICByZXR1cm4gIiI7IC8vIGp1c3QgaW4gY2FzZQotCi0gICAgZWxlbWVudHMuYWRkKGVsZW0pOwotCi0gICAgU3RyaW5nQnVmZmVyIHhzZFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtLmdldFRhZ05hbWUoKTsKLSAgICB4c2RTdHJpbmcuYXBwZW5kKCI8IikuYXBwZW5kKGVsZW1lbnROYW1lKTsKLQotICAgIGJvb2xlYW4gZm91bmRTY2hlbWFMb2NhdGlvbiA9IGZhbHNlOyAvLyBmbGFnIGlmIHNjaGVtYWxvY2F0aW9uIGlzIGRlZmluZWQKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gIiI7IC8vIHRoZSBuYW1lc3BhY2UgaWYgd2UncmUgY2hlY2tpbmcgYW4gaW1wb3J0IG9yIGluY2x1ZGUKLSAgICBTdHJpbmcgbmFtZVByZWZpeCA9ICIiOyAvLyB0aGUgeG1sbnMgcHJlZml4IHVzZWQgZm9yIHRoZSBlbGVtZW50cwotICAgIC8vIEdldCBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZWxlbWVudCBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlIHhzZFN0cmluZwotICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gYXR0cy5pdGVtKGkpOwotICAgICAgeHNkU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChuLmdldE5vZGVOYW1lKCkpLmFwcGVuZCgiPVwiIik7Ci0gICAgICBTdHJpbmcgbm9kZU5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICBpZiAobm9kZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShTQ0hFTUFMT0NBVElPTikgJiYgZmlsZWxvY2F0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvdW5kU2NoZW1hTG9jYXRpb24gPSB0cnVlOwotICAgICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgeHNkU3RyaW5nLmFwcGVuZChyZWxhdGl2ZVBhdGgpLmFwcGVuZCgiXCIiKTsgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIGlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5BTUVTUEFDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lc3BhY2UgPSBub2RlVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZ2V0IHRoZSBuYW1lIHByZWZpeCBmb3IgdGhpcyBzY2hlbWEgdG8gdXNlIGluIGdlbmVyYXRpbmcgaW1wb3J0IHN0YXRlbWVudHMKLSAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUuaW5kZXhPZihYTUxOUykgIT0gLTEpCi0gICAgICAgIHsKLQotICAgICAgICAgIGlmIChub2RlVmFsdWUuZXF1YWxzSWdub3JlQ2FzZShlbGVtLmdldE5hbWVzcGFjZVVSSSgpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lUHJlZml4ID0gbm9kZU5hbWU7Ci0gICAgICAgICAgICBpZiAobmFtZVByZWZpeC5lcXVhbHNJZ25vcmVDYXNlKFhNTE5TKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbmFtZVByZWZpeCA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuYW1lUHJlZml4ID0gbmFtZVByZWZpeC5zdWJzdHJpbmcoNikgKyAiOiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFJlcGxhY2Ugb2xkIHNjaGVtYSBuYW1lc3BhY2VzIHdpdGggdGhlIG5ldyBzY2hlbWEgbmFtZXNwYWNlLgotICAgICAgICBpZihub2RlVmFsdWUuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IG5vZGVWYWx1ZS5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgbm9kZVZhbHVlID0gQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMTsKLSAgICAgICAgfQotICAgICAgICB4c2RTdHJpbmcuYXBwZW5kKG5vZGVWYWx1ZSkuYXBwZW5kKCJcIiIpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiaW1wb3J0IikgJiYgIWZvdW5kU2NoZW1hTG9jYXRpb24pCi0gICAgewotICAgICAgeHNkU3RyaW5nLmFwcGVuZCgiICIpLmFwcGVuZChTQ0hFTUFMT0NBVElPTikuYXBwZW5kKCI9XCIiKS5hcHBlbmQobmFtZXNwYWNlKS5hcHBlbmQoIlwiIik7Ci0gICAgfQotICAgIC8vIGFkZCBpbiBhbnkgcmVxdWlyZWQgTlMgZGVjbGFyYXRpb25zIGZyb20gcGFyZW50IGVsZW1lbnRzCi0gICAgaWYgKHJlcU5TRGVjbCAhPSBudWxsKQotICAgIHsKLSAgICAgIEVudW1lcmF0aW9uIGtleXMgPSByZXFOU0RlY2wua2V5cygpOwotICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIGRlY2xOUyA9IChTdHJpbmcpcmVxTlNEZWNsLmdldChrZXkpOwotICAgICAgICBpZihkZWNsTlMuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzE5OTkpIHx8IGRlY2xOUy5lcXVhbHMoQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgZGVjbE5TID0gQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMTsKLSAgICAgICAgfQotICAgICAgICB4c2RTdHJpbmcuYXBwZW5kKCIgIikuYXBwZW5kKGtleSkuYXBwZW5kKCI9XCIiKS5hcHBlbmQoZGVjbE5TKS5hcHBlbmQoIlwiIik7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgeHNkU3RyaW5nLmFwcGVuZCgiPiIpOwotICAgIGlmIChyZXF1aXJlZE5hbWVzcGFjZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBJdGVyYXRvciBpUmVxdWlyZWROYW1lc3BhY2VzID0gcmVxdWlyZWROYW1lc3BhY2VzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaVJlcXVpcmVkTmFtZXNwYWNlcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpaVJlcXVpcmVkTmFtZXNwYWNlcy5uZXh0KCk7Ci0KLSAgICAgICAgeHNkU3RyaW5nCi0gICAgICAgICAgLmFwcGVuZCgiPCIpCi0gICAgICAgICAgLmFwcGVuZChuYW1lUHJlZml4KQotICAgICAgICAgIC5hcHBlbmQoSU1QT1JUKQotICAgICAgICAgIC5hcHBlbmQoIiAiKQotICAgICAgICAgIC5hcHBlbmQoTkFNRVNQQUNFKQotICAgICAgICAgIC5hcHBlbmQoIj1cIiIpCi0gICAgICAgICAgLmFwcGVuZChucykKLSAgICAgICAgICAuYXBwZW5kKCJcIiAiKQotICAgICAgICAgIC5hcHBlbmQoU0NIRU1BTE9DQVRJT04pCi0gICAgICAgICAgLmFwcGVuZCgiPVwiIikKLSAgICAgICAgICAuYXBwZW5kKG5zKQotICAgICAgICAgIC5hcHBlbmQoIlwiLz4iKTsKLSAgICAgIH0KLQotICAgIH0KLSAgICB4c2RTdHJpbmcuYXBwZW5kKCJcbiIpOwotCi0gICAgLy8gY2FsbCB0aGUgbWV0aG9kIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkIGVsZW1lbnQKLSAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgfHwgaSA8IDU7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0gICAgICAvLyB3ZSBvbmx5IHdhbnQgbm9kZXMgdGhhdCBhcmUgRWxlbWVudHMKLSAgICAgIGlmIChuIGluc3RhbmNlb2YgRWxlbWVudCkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCBjaGlsZCA9IChFbGVtZW50KW47Ci0gICAgICAgIHhzZFN0cmluZy5hcHBlbmQoY3JlYXRlWFNEU3RyaW5nUmVjdXJzaXZlbHkoY2hpbGQsIGVsZW1lbnRzLCBudWxsLCBudWxsLCBmaWxlbG9jYXRpb24pKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB4c2RTdHJpbmcuYXBwZW5kKCI8LyIpLmFwcGVuZChlbGVtLmdldFRhZ05hbWUoKSkuYXBwZW5kKCI+Iik7Ci0KLSAgICByZXR1cm4geHNkU3RyaW5nLnRvU3RyaW5nKCk7Ci0KLSAgfQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBhbGwgdGhlIG5hbWVzcGFjZXMgdGhhdCBhcmUgdXNlZCBmb3IgZWxlbWVudHMgb3IgdHlwZXMgaW4gdGhlIHNjaGVtYS4KLSAgICogVGhlc2UgYXJlIHRoZSByZXF1aXJlZCBuYW1lc3BhY2VzIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFsbCB0aGUgZWxtZW50cyBhcmUgdmFsaWQuCi0gICAqIAotICAgKiBAcGFyYW0gZWxlbSBUaGUgZWxlbWVudCB0byBjaGVjayBmb3IgcmVxdWlyZWQgbmFtZXNwYWNlcy4KLSAgICogQHJldHVybiBBIGxpc3Qgb2YgcmVxdWlyZWQgbmFtZXNwYWNlcyBmb3IgdGhlIGVsZW1lbnQgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCi0gICAqLwotICBwcm90ZWN0ZWQgTGlzdCBnZXRSZXF1aXJlZE5hbWVzcGFjZXMoRWxlbWVudCBlbGVtKQotICB7Ci0gICAgTGlzdCBuYW1lc3BhY2UgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvLyBjYWxsIHRoZSBtZXRob2QgcmVjdXJzaXZlbHkgZm9yIGVhY2ggY2hpbGQgZWxlbWVudAotICAgIC8vIHJlZ2lzdGVyIGFsbCB0aGUgY2hpbGQgdHlwZXMgZmlyc3QKLSAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZWxlbS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgaW50IG51bUNoaWxkcmVuID0gY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsKLSAgICAvLyBUT0RPOiB3aHkgaXMgdGhlcmUgYSA8IDUgY29uZGl0aW9uPwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2hpbGRyZW4gLyp8fCBpIDwgNSovOyBpKyspCi0gICAgewotICAgICAgTm9kZSBuID0gY2hpbGROb2Rlcy5pdGVtKGkpOwotICAgICAgLy8gd2Ugb25seSB3YW50IG5vZGVzIHRoYXQgYXJlIEVsZW1lbnRzCi0gICAgICBpZiAobiBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICB7Ci0gICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCluOwotICAgICAgICBMaXN0IGNoaWxkbnMgPSBnZXRSZXF1aXJlZE5hbWVzcGFjZXMoY2hpbGQpOwotICAgICAgICBmb3IgKGludCBqID0gY2hpbGRucy5zaXplKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpY2hpbGRucy5nZXQoaik7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMobnMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZS5hZGQobnMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBBZGQgdGhlIG5hbWVzcGFjZSBvZiB0aGUgY3VycmVudCBlbGVtZW50Ci0gICAgU3RyaW5nIGVsZW1OUyA9IGVsZW0uZ2V0UHJlZml4KCk7Ci0gICAgLy8gaWYgdGhlcmUgaXMgbm8gbmFtZXNwYWNlIHByZWZpeCBzZXQgaXQgdG8gdGhlIGVtcHR5IHByZWZpeC4KLSAgICBpZihlbGVtTlMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBlbGVtTlMgPSAiIjsKLSAgICB9Ci0gICAgaWYgKCFuYW1lc3BhY2UuY29udGFpbnMoZWxlbU5TLmludGVybigpKSkKLSAgICAgewotICAgICAgbmFtZXNwYWNlLmFkZChlbGVtTlMuaW50ZXJuKCkpOwotICAgIH0KLSAgICAvLyBub3cgYWRkIGFsbCBvZiB0aGUgY3VycmVudCBlbGVtZW50J3MgbmFtZXNwYWNlcwotICAgIC8vIGRvbid0IGluY2x1ZGUgaW1wb3J0IGFuZCBzY2hlbWEgZWxlbWVudHMKLSAgICBTdHJpbmcgbG9jYWxuYW1lID0gZWxlbS5nZXRMb2NhbE5hbWUoKTsKLSAgICBpZiAoIWxvY2FsbmFtZS5lcXVhbHMoSU1QT1JUKSAmJiAhbG9jYWxuYW1lLmVxdWFscyhJTkNMVURFKSAmJiAhbG9jYWxuYW1lLmVxdWFscyhTQ0hFTUEpKQotICAgIHsKLSAgICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBuID0gYXR0cy5pdGVtKGkpOwotCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgLy8gcmVtb3ZlZCByZXN0cmljdGlvbiB0aGF0IHdlJ3JlIG9ubHkgbG9va2luZyBhdCB0eXBlcwotICAgICAgICAvLwkJaWYgKG5vZGVOYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFlQRSkpCi0gICAgICAgIC8vCQl7Ci0gICAgICAgIC8vIGRvbid0IHRha2UgbmFtZXNwYWNlIGluZm8gZnJvbSBhdHRyaWJ1dGVzIGRlZmluaW5nIG5hbWVzcGFjZXMuCi0gICAgICAgIC8vIHRoYXQgaW5jbHVkZXMgeG1sbnMsIHRhcmdldE5hbWVzcGFjZQotICAgICAgICAvLyBkb24ndCB0YWtlIG5hbWVzcGFjZSBpbmZvIGZyb20gbmFtZSBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChub2RlTmFtZS5pbmRleE9mKFhNTE5TKSAhPSAtMSB8fCBub2RlTmFtZS5lcXVhbHMoVEFSR0VUTkFNRVNQQUNFKSB8fCBub2RlTmFtZS5lcXVhbHMoTkFNRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbm9kZVZhbHVlID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpbnQgY29sb25JbmRleCA9IG5vZGVWYWx1ZS5pbmRleE9mKCI6Iik7Ci0gICAgICAgIC8vIERvbid0IHRha2UgbmFtZXNwYWNlIGluZm8gZnJvbSBhdHRyaWJ1dGVzIHdpdGggdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCB0aGF0IGlzIGF0dHJpYnV0ZXMKLSAgICAgICAgLy8gdGhhdCBhcmUgbm90IHByZWZpeGVkLiAoY29sb25JbmRleCA9PSAtMSkKLSAgICAgICAgLy8gSWYgdGhlIGNvbG9uSW5kZXggaXMgZm9sbG93ZWQgYnkgYSAvIHRoZW4gaXQgaXMgYSBVUkkgYW5kIG5vdAotICAgICAgICAvLyBuYW1lc3BhY2UgcXVhbGlmaWVkLgotICAgICAgICBpZiAoY29sb25JbmRleCA9PSAtMSB8fCBub2RlVmFsdWUuY2hhckF0KGNvbG9uSW5kZXggKyAxKSA9PSAnLycpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBoZXJlIHdlIGhhdmUgZm91bmQgYSBjb2xvbiBkZWxpbWl0ZXIgc28gd2UgbmVlZCB0aGUgbmFtZXNwYWNlIGRlZmluZWQgaGVyZQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBub2RlVmFsdWUgPSBub2RlVmFsdWUuc3Vic3RyaW5nKDAsIGNvbG9uSW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbmFtZXNwYWNlLmNvbnRhaW5zKG5vZGVWYWx1ZS5pbnRlcm4oKSkpCi0gICAgICAgIHsKLQotICAgICAgICAgIG5hbWVzcGFjZS5hZGQobm9kZVZhbHVlLmludGVybigpKTsKLSAgICAgICAgfQotICAgICAgICAvLwkJfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgbmFtZXNwYWNlcyB0aGF0IGhhdmUgYW4gaW1wb3J0IHN0YXRlbWVudC4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtIFRoZSByb290IGVsZW1lbnQgb2YgdGhlIHNjaGVtYS4KLSAgICogQHJldHVybiBBIGxpc3Qgb2YgYWxsIHRoZSBuYW1lc3BhY2VzIHRoYXQgYXJlIGltcG9ydGVkLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgZ2V0SW1wb3J0TmFtZXNwYWNlcyhFbGVtZW50IGVsZW0pCi0gIHsKLSAgICBMaXN0IG5hbWVzcGFjZSA9IG5ldyBWZWN0b3IoKTsKLQotICAgIC8vIGNhbGwgdGhlIG1ldGhvZCByZWN1cnNpdmVseSBmb3IgZWFjaCBjaGlsZCBlbGVtZW50Ci0gICAgLy8gcmVnaXN0ZXIgYWxsIHRoZSBjaGlsZCB0eXBlcyBmaXJzdAotICAgIE5vZGVMaXN0IGNoaWxkTm9kZXMgPSBlbGVtLmdldENoaWxkTm9kZXMoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSB8fCBpIDwgNTsgaSsrKQotICAgIHsKLSAgICAgIE5vZGUgbiA9IGNoaWxkTm9kZXMuaXRlbShpKTsKLSAgICAgIC8vIHdlIG9ubHkgd2FudCBub2RlcyB0aGF0IGFyZSBFbGVtZW50cwotICAgICAgaWYgKG4gaW5zdGFuY2VvZiBFbGVtZW50KQotICAgICAgewotICAgICAgICBFbGVtZW50IGNoaWxkID0gKEVsZW1lbnQpbjsKLSAgICAgICAgTGlzdCBjaGlsZG5zID0gZ2V0SW1wb3J0TmFtZXNwYWNlcyhjaGlsZCk7Ci0gICAgICAgIGZvciAoaW50IGogPSBjaGlsZG5zLnNpemUoKSAtIDE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyljaGlsZG5zLmdldChqKTsKLSAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhucykpCi0gICAgICAgICAgewotICAgICAgICAgICAgbmFtZXNwYWNlLmFkZChucyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIGlmIHRoaXMgaXMgYW4gaW1wb3J0IGVsZW1lbnQgZ2V0IHRoZSBuYW1lc3BhY2UgYW5kIGFkZCBpdCB0byB0aGUgbGlzdAotICAgIGlmIChlbGVtLmdldExvY2FsTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSU1QT1JUKSkKLSAgICB7Ci0gICAgICBOYW1lZE5vZGVNYXAgYXR0cyA9IGVsZW0uZ2V0QXR0cmlidXRlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbiA9IGF0dHMuaXRlbShpKTsKLQotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBuLmdldE5vZGVOYW1lKCk7Ci0gICAgICAgIGlmIChub2RlTmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5BTUVTUEFDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbm9kZVZhbHVlID0gbi5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICBpZiAoIW5hbWVzcGFjZS5jb250YWlucyhub2RlVmFsdWUuaW50ZXJuKCkpKQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgbmFtZXNwYWNlLmFkZChub2RlVmFsdWUuaW50ZXJuKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuYW1lc3BhY2U7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBIYXNodGFibGUgd2l0aCBuYW1lc3BhY2UgcHJlZml4ZXMgYXMga2V5cyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50LgotICAgKiAKLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIEEgaGFzaHRhYmxlIHdpdGggbmFtZXNwYWNlIHByZWZpeGVzIG1hcHBlZCB0byBuYW1lc3BhY2VzLgotICAgKi8KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXROU1Jlc29sdmVyKEVsZW1lbnQgZWxlbSkKLSAgewotICAgIEhhc2h0YWJsZSBuc1Jlc29sdmVyID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gICAgTmFtZWROb2RlTWFwIGF0dHMgPSBlbGVtLmdldEF0dHJpYnV0ZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHMuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIG4gPSBhdHRzLml0ZW0oaSk7Ci0KLSAgICAgIFN0cmluZyBub2RlTmFtZSA9IG4uZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIGlmIChub2RlTmFtZS5pbmRleE9mKFhNTE5TKSAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5vZGVWYWx1ZSA9IG4uZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lUHJlZml4ID0gbm9kZU5hbWU7Ci0KLSAgICAgICAgaWYgKG5hbWVQcmVmaXguZXF1YWxzSWdub3JlQ2FzZShYTUxOUykpCi0gICAgICAgIHsKLSAgICAgICAgICBuYW1lUHJlZml4ID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZVByZWZpeCA9IG5hbWVQcmVmaXguc3Vic3RyaW5nKDYpOwotICAgICAgICB9Ci0gICAgICAgIG5zUmVzb2x2ZXIucHV0KG5hbWVQcmVmaXgsIG5vZGVWYWx1ZSk7Ci0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5zUmVzb2x2ZXI7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSBuYW1lc3BhY2VzIGluIHRoZSBnaXZlbiBuYW1lc3BhY2VzIGxpc3Qgd2l0aCB0aGUgdHdvIG5hbWVzcGFjZQotICAgKiByZXNvbHZlciBoYXNodGFibGVzIHByb3ZpZGVkLiBSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbmFtZXNwYWNlIHRoYXQgbmVlZAotICAgKiB0byBiZSBkZWNsYXJlZC4KLSAgICogRmlyc3QgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsb2NhbCBuYW1lc3BhY2VzIHdpdGggbnNSZXNvbHZlci4KLSAgICogTmV4dCByZXNvbHZlIGFnYWluc3QgdGhlIHBhcmVudCBuYW1lc3BhY2Ugd2l0aCBwYXJlbnROU1Jlc29sdmVyLgotICAgKiBBIHNpZGUgYWZmZWN0IG9mIHRoaXMgbWV0aG9kIGlzIHRoZSBuYW1lc3BhY2VzIGxpc3QgaXMgbGVmdCB3aXRoIG9ubHkgdGhvc2UgCi0gICAqIG5hbWVzcGFjZXMgdGhhdCBhcmUgcmVzb2x2ZWQgYW5kIHRoZSByZXNvbHZlZCBlbnRpdGllcyBhcmUgcGxhY2VkIGluIHRoZSAKLSAgICogbGlzdCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBlbnRyaWVzLgotICAgKiBGb3IgZXguIElmIHlvdSBwcm92aWRlIGEgbGlzdCBzdWNoIGFzIHt4c2QsIGludGZ9IGFuZCBvbmx5IHhzZCBjYW4gYmUgcmVzb2x2ZWQKLSAgICogeW91IHdpbGwgZW5kIHVwIHdpdGggdGhlIGxpc3Qge2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfQotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB0byByZXNvbHZlLgotICAgKiBAcGFyYW0gbnNSZXNvbHZlciBUaGUgaGFzaHRhYmxlIHRvIGJlIHVzZWQgYXMgdGhlIGxvY2FsIHJlc29sdmVyLgotICAgKiBAcGFyYW0gcGFyZW50TlNSZXNvbHZlciBUaGUgaGFzaHRhYmxlIHRvIGJlIHVzZWQgYXMgdGhlIHBhcmVudCBuYW1lc3BhY2UgcmVzb2x2ZXIuCi0gICAqIEByZXR1cm4gQSBIYXNodGFibGUgb2YgbmFtZXNwYWNlcyB0aGF0IG11c3QgYmUgZGVjbGFyZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHJlc29sdmVOYW1lc3BhY2VzKExpc3QgbmFtZXNwYWNlcywgSGFzaHRhYmxlIG5zUmVzb2x2ZXIsIEhhc2h0YWJsZSBwYXJlbnROU1Jlc29sdmVyKQotICB7Ci0gIAlIYXNodGFibGUgcmVxTlNEZWNsID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwgJiYgIW5hbWVzcGFjZXMuaXNFbXB0eSgpICYmIG5zUmVzb2x2ZXIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gbmFtZXNwYWNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5zID0gKFN0cmluZyluYW1lc3BhY2VzLmdldChpKTsKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgbmFtZXNwYWNlcy5yZW1vdmUoaSk7Ci0gICAgICAgIC8vIEZpcnN0IHRyeSB0byByZXNvbHZlIGFnYWluc3QgdGhlIGxvY2FsIG5hbWVzcGFjZSByZXNvbHZlci4KLSAgICAgICAgaWYgKG5zUmVzb2x2ZXIuY29udGFpbnNLZXkobnMpKQotICAgICAgICB7Ci0gICAgICAgICAgT2JqZWN0IHJlc29sdmVkTlMgPSBuc1Jlc29sdmVyLmdldChucyk7Ci0gICAgICAgICAgLy8gT25seSBhZGQgdGhlIG5hbWVzcGFjZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgIGlmKCFuYW1lc3BhY2VzLmNvbnRhaW5zKHJlc29sdmVkTlMpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVzcGFjZXMuYWRkKGksIG5zUmVzb2x2ZXIuZ2V0KG5zKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE5leHQgdHJ5IHRvIHJlc29sdmUgYWdhaW5zdCB0aGUgcGFyZW50IG5hbWVzcGFjZSByZXNvbHZlci4KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgIAlpZiAobnMuZXF1YWxzKCIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbnMgPSBYTUxOUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbnMgPSBYTUxOUyArICI6IiArIG5zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudE5TUmVzb2x2ZXIuY29udGFpbnNLZXkobnMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBPYmplY3QgcmVzb2x2ZWROUyA9IHBhcmVudE5TUmVzb2x2ZXIuZ2V0KG5zKTsKLSAgICAgICAgICAgICAgLy8gT25seSBhZGQgdGhlIG5hbWVzcGFjZSBpZiBpdCdzIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0LgotICAgICAgICAgICAgICBpZighbmFtZXNwYWNlcy5jb250YWlucyhyZXNvbHZlZE5TKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuYWRkKGksIHJlc29sdmVkTlMpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIC8vIFN0aWxsIG5lZWQgdG8gZGVjbGFyZSB0aGUgbmFtZXNwYWNlIHRob3VnaC4KLSAgICAgICAgICAgICAgcmVxTlNEZWNsLnB1dChucywgcmVzb2x2ZWROUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVxTlNEZWNsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZSBhbnkgbmFtZXNwYWNlIGZyb20gdGhlIG5hbWVzcGFjZXMgbGlzdCBpZiBpdCBpcyBpbiB0aGUgaW1wb3J0IGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlcyBUaGUgbmFtZXNwYWNlcyBsaXN0LgotICAgKiBAcGFyYW0gaW1wb3J0ZWROYW1lc3BhY2VzIEEgbGlzdCBvZiBpbXBvcnRlZCBuYW1lc3BhY2VzLgotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG5hbWVzcGFjZXMgd2l0aG91dCB0aGUgaW1wb3J0ZWQgbmFtZXNwYWNlcy4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IHJlbW92ZUltcG9ydHMoTGlzdCBuYW1lc3BhY2VzLCBMaXN0IGltcG9ydGVkTmFtZXNwYWNlcykKLSAgewotICAgIGlmIChuYW1lc3BhY2VzICE9IG51bGwgJiYgaW1wb3J0ZWROYW1lc3BhY2VzICE9IG51bGwgJiYgIWltcG9ydGVkTmFtZXNwYWNlcy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgSXRlcmF0b3IgaUltcG9ydGVkTlMgPSBpbXBvcnRlZE5hbWVzcGFjZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpSW1wb3J0ZWROUy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpTlMgPSAoU3RyaW5nKWlJbXBvcnRlZE5TLm5leHQoKTsKLQotICAgICAgICBuYW1lc3BhY2VzLnJlbW92ZShpTlMpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYSBhbmQgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoZSBpZ25vcmVOYW1lc3BhY2VzCi0gICAqIGxpc3QgZnJvbSB0aGUgbmFtZXNwYWNlcyBsaXN0IHByb3ZpZGVkLgotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZXMgVGhlIGxpc3Qgb2YgbG9jYWwgbmFtZXNwYWNlcy4KLSAgICogQHBhcmFtIGVsZW0gVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIG5hbWVzcGFjZXMgd2l0aCB0aGUgbG9jYWwgbmFtZXNwYWNlcyByZW1vdmVkLgotICAgKi8KLSAgcHJvdGVjdGVkIExpc3QgcmVtb3ZlTG9jYWxOYW1lc3BhY2VzKExpc3QgbmFtZXNwYWNlcywgRWxlbWVudCBlbGVtKQotICB7Ci0gICAgaWYgKG5hbWVzcGFjZXMgIT0gbnVsbCAmJiBlbGVtICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIG5zID0gZWxlbS5nZXRBdHRyaWJ1dGUoVEFSR0VUTkFNRVNQQUNFKTsKLSAgICAgIG5hbWVzcGFjZXMucmVtb3ZlKG5zKTsKLQotICAgICAgZm9yIChpbnQgaSA9IGlnbm9yZU5hbWVzcGFjZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIC8vIGtlZXAgcmVtb3ZpbmcgdGhlIG5hbWVzcGFjZSB1bnRpbCBpdCBpcyBub3QgaW4gdGhlIGxpc3QKLSAgICAgICAgaWYgKG5hbWVzcGFjZXMucmVtb3ZlKGlnbm9yZU5hbWVzcGFjZXNbaV0pKQotICAgICAgICB7Ci0gICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuYW1lc3BhY2VzOwotICB9Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBTT0FQIGVuY29kaW5nIG5hbWVzcGFjZSBpcyBpbiB0aGUgbGlzdCBvZiByZXF1aXJlZCBuYW1lc3BhY2VzLAotICAgKiBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcGFyYW0gcmVxbnMgVGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyB0byBjaGVjayBmb3IgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlLgotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlcyBpcyBpbiB0aGUgbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tTT0FQRW5jb2RpbmdSZXF1aXJlZChMaXN0IHJlcW5zKQotICB7Ci0gICAgaWYgKHJlcW5zLmNvbnRhaW5zKFNPQVBfRU5DT0RJTkdfVVJJKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvSW5saW5lU2NoZW1hVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvSW5saW5lU2NoZW1hVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NTlkZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL0lubGluZVNjaGVtYVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgY29tLmlibS53c2RsLkNvbnN0YW50czsKLQotLyoqCi0gKiBQbHVnaW4gdmFsaWRhdG9yIGZvciB0aGUgV1NETCBWYWxpZGF0aW9uIGZyYW1ld29yay4gVmFsaWRhdGVzIGlubGluZSBzY2hlbWEgZm91bmQgaW4gYSBXU0RMIGRvY3VtZW50LgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCAobG1hbmRlbEBjYS5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgSW5saW5lU2NoZW1hVmFsaWRhdG9yCi17Ci0gIExpc3QgZWxlbWVudHMgPSBudWxsOwotCi0KLSAgcHVibGljIE1hcCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAJZWxlbWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IGVsZW0gPSAoVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSBlbGVtZW50OwotICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSAoRGVmaW5pdGlvbikgcGFyZW50cy5nZXQocGFyZW50cy5zaXplKCkgLSAxKTsKLSAgICAvLyBBZGQgaW4gdGhlIG5hbWVzcGFjZXMgZGVmaW5lZCBpbiB0aGUgZG9jIGFscmVhZHkgdGhhdCBhcmVuJ3QgZGVmaW5lZCBsb2NhbGx5IGluIHRoaXMgc2NoZW1hLgotICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIG5hbWVzcGFjZXMgb3RoZXIgdGhlbiBpbiB0aGUgZGVmaW50aW9ucyBhbmQgdHlwZXMgZWxlbWVudHMgYXMKLSAgICAvLyBpbmxpbmUgc2NoZW1hIGNhbiBub3QgaGF2ZSBhbnkgb3RoZXIgcGFyZW50cyBhbmQgbXVzdCBoYXZlIHRoZXJlIHR3byBwYXJlbnRzLgotICAgIC8vIEZpcnN0IHRha2UgY2FyZSBvZiB0aGUgZGVmaW5pdGlvbnMgZWxlbWVudAotCi0gICAgLy8gY3JlYXRlIHRoZSBpbmxpbmUgc2NoZW1hIHN0cmluZwotCUVsZW1lbnQgdzNjZWxlbWVudCA9IGVsZW0uZ2V0RWxlbWVudCgpOwotCUhhc2h0YWJsZSBwYXJlbnRuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25zRnJvbVBhcmVudHMod3NkbERlZmluaXRpb24sdzNjZWxlbWVudCk7Ci0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IHczY2VsZW1lbnQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5BVFRSX1RBUkdFVF9OQU1FU1BBQ0UpOwotCS8vIGlmIHRoZSB0YXJnZXROYW1lc3BhY2UgaGFzbid0IGJlZW4gZGVmaW5lZCBmb3IgdGhlIHNjaGVtYSB1c2UgdGhlIAotCS8vIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgZGVmaW5pdGlvbnMgZWxlbWVudAotCS8qaWYodGFyZ2V0TmFtZXNwYWNlID09IG51bGwgfHwgdGFyZ2V0TmFtZXNwYWNlLmVxdWFscygiIikpCi0JIHsKLQkgIHRhcmdldE5hbWVzcGFjZSA9IHdzZGxEZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCSAgdzNjZWxlbWVudC5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSx0YXJnZXROYW1lc3BhY2UpOwotCX0qLwotCi0JU3RyaW5nIHhzZCA9IElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcodzNjZWxlbWVudCwgZWxlbWVudHMsIGZpbGVuYW1lLCBwYXJlbnRuYW1lc3BhY2VzKTsKLQotICAgIC8vIElmIHRoZSBuYW1lc3BhY2UgZ2l2ZW4gaXMgb25lIG9mIHRoZSBvbGQgc2NoZW1hIG5hbWVzcGFjZXMgcHJvZHVjZSBhIHdhcm5pbmcuCi0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IHczY2VsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgaWYobmFtZXNwYWNlLmVxdWFscyhDb25zdGFudHMuTlNfVVJJX1hTRF8xOTk5KSB8fCBuYW1lc3BhY2UuZXF1YWxzKENvbnN0YW50cy5OU19VUklfWFNEXzIwMDApKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgbmFtZXNwYWNlIGlzIHNwZWNpZmllZC4iKTsKLSAgICB9Ci0KLSAgICAvLyBub3cgY3JlYXRlIGFuZCBjYWxsIHRoZSB2YWxpZGF0b3IgZm9yIHRoZSBpbmxpbmUgc2NoZW1hCi0gICAgWFNEVmFsaWRhdG9yIHNjaGVtYXYgPSBuZXcgWFNEVmFsaWRhdG9yKCk7Ci0KLSAgICAvL1N0cmluZyBmaWxlTG9jYXRpb24gPSBuZXcgVVJMKHZhbGlkYXRvcm1hbmFnZXIuZ2V0RmlsZW5hbWUoKSkuZ2V0UGF0aCgpOwotICAgIElubGluZVhTRFJlc29sdmVyIGlubGluZUVudGl0eVJlc29sdmVyID0KLSAgICAgIGdldEVudGl0eVJlc29sdmVyKHdzZGxEZWZpbml0aW9uLCAoVHlwZXMpIHBhcmVudHMuZ2V0KDApLCBmaWxlbmFtZSwgdGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAvLwlhZGQgaW4gdGhlIGV4dGVybmFsIFhTRCBDYXRhbG9nIHRvIHJlc29sdmUgc2NoZW1hcyBvZmZsaW5lCi0gICAgWE1MRW50aXR5UmVzb2x2ZXJDaGFpbiBlbnRpdHlSZXNvbHZlckNoYWluID0gbmV3IFhNTEVudGl0eVJlc29sdmVyQ2hhaW4oKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKGlubGluZUVudGl0eVJlc29sdmVyKTsKLSAgICBlbnRpdHlSZXNvbHZlckNoYWluLmFkZEVudGl0eVJlc29sdmVyKG5ldyBGaWxlRW50aXR5UmVzb2x2ZXIoKSk7Ci0gICAgZW50aXR5UmVzb2x2ZXJDaGFpbi5hZGRFbnRpdHlSZXNvbHZlcihYTUxDYXRhbG9nUmVzb2x2ZXIuZ2V0SW5zdGFuY2UoKSk7Ci0gICAgc2NoZW1hdi52YWxpZGF0ZUlubGluZVNjaGVtYSh4c2QsIHRhcmdldE5hbWVzcGFjZSwgZmlsZW5hbWUsIGVudGl0eVJlc29sdmVyQ2hhaW4sIGlubGluZUVudGl0eVJlc29sdmVyKTsKLQotICAgIC8vIGNoZWNrIGlmIHRoZSBTT0FQIEVuY29kaW5nIG5hbWVzcGFjZSBpcyByZXF1aXJlZCBidXQgbm90IGltcG9ydGVkCi0gICAgaWYgKElubGluZVNjaGVtYUdlbmVyYXRvci5zb2FwRW5jb2RpbmdSZXF1aXJlZE5vdEltcG9ydGVkKGVsZW0uZ2V0RWxlbWVudCgpLCBmaWxlbmFtZSxwYXJlbnRuYW1lc3BhY2VzKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgaW5saW5lIHNjaGVtYSB1c2VzIGFuIGVsZW1lbnQgb3IgdHlwZSBmcm9tICIKLSAgICAgICAgKyAidGhlIFNPQVAgZW5jb2RpbmcgbmFtZXNwYWNlIGJ1dCB0aGUgbmFtZXNwYWNlIGhhcyBub3QgYmVlbiBpbXBvcnRlZC4gIgotICAgICAgICArICJUaGUgU09BUCBlbmNvZGluZyBuYW1lc3BhY2Ugc2hvdWxkIGJlIGltcG9ydGVkIHdpdGggYW4gaW1wb3J0ICIKLSAgICAgICAgKyAic3RhdGVtZW50IGJlZm9yZSBpdCBpcyB1c2VkLiIpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBzY2hlbWEgaXNuJ3QgdmFsaWQKLSAgICBpZiAoIXNjaGVtYXYuaXNWYWxpZCgpKQotICAgIHsKLSAgICAgIC8vIEdhdGhlcmluZyBhbGwgdGhlIGVycm9ycwotICAgICAgU3RyaW5nQnVmZmVyIGV4Y2VwdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIEl0ZXJhdG9yIGkgPSBzY2hlbWF2LmdldEVycm9ycygpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGV4Y2VwdGlvbi5hcHBlbmQoaS5uZXh0KCkpLmFwcGVuZCgnXG4nKTsKLSAgICAgIH0KLSAgICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbgotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihleGNlcHRpb24udG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIC8vIGlmIHRoZSBzY2hlbWEgaXMgdmFsaWQKLSAgICBlbHNlCi0gICAgewotICAgICAgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKDEpOwotICAgICAgbWFwLnB1dCh0YXJnZXROYW1lc3BhY2UsIHNjaGVtYXYuZ2V0WFNNb2RlbCgpKTsKLSAgICAgIHJldHVybiBtYXA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhbiBlbnRpdHkgcmVzb2x2ZXIgdGhhdCB3aWxsIHJlc29sdmUgaW5saW5lIHNjaGVtYXMuICBFdmVyeSBpbmxpbmUgc2NoZW1hIGlzIHByZXJlZ2lzdGVyZWQgd2l0aAotICAgKiB0aGUgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcGFyYW0gd3NkbERlZmluaXRpb24gVGhlIFdTREwgZGVmaW5pdGlvbnMgZWxlbWVudC4KLSAgICogQHBhcmFtIHR5cGVzIFRoZSB0eXBlcyBlbGVtZW50LgotICAgKiBAcGFyYW0gcmVmZXJlbmNlTG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhpcyBzY2hlbWEuCi0gICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldE5hbWVzcGFjZSBvZiB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIEFuIGVudGl0eSByZXNvbHZlciB0aGF0IGNhbiByZXNvbHZlIGlubGluZSBzY2hlbWFzLgotICAgKi8KLSAgcHJvdGVjdGVkIElubGluZVhTRFJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKERlZmluaXRpb24gd3NkbERlZmluaXRpb24sIFR5cGVzIHR5cGVzLCBTdHJpbmcgcmVmZXJlbmNlTG9jYXRpb24sIFN0cmluZyB0YXJnZXROYW1lc3BhY2UpCi0gIHsKLSAgICBJbmxpbmVYU0RSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IG5ldyBJbmxpbmVYU0RSZXNvbHZlcigpOwotLy8gICAgZW50aXR5UmVzb2x2ZXIuc2V0UmVmZXJlbmNlTG9jYXRpb24ocmVmZXJlbmNlTG9jYXRpb24pOwotICAgIExpc3Qgc2NoZW1hcyA9IHR5cGVzLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGlmIChzY2hlbWFzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaVNjaGVtYXMgPSBzY2hlbWFzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaVNjaGVtYXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0RWxlbSA9IChVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIGlTY2hlbWFzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHRoaXNOYW1lc3BhY2UgPSBleHRFbGVtLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkFUVFJfVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmICh0aGlzTmFtZXNwYWNlICE9IG51bGwgJiYgIXRoaXNOYW1lc3BhY2UuZXF1YWxzSWdub3JlQ2FzZSh0YXJnZXROYW1lc3BhY2UpKQotICAgICAgICB7Ci0KLSAgICAgICAgCUVsZW1lbnQgZWxlbWVudCA9IGV4dEVsZW0uZ2V0RWxlbWVudCgpOwotCQkJCi0vLwkJCWNyZWF0ZSB0aGUgaW5saW5lIHNjaGVtYSBzdHJpbmcKLQkJCSAvL0VsZW1lbnQgdzNjZWxlbWVudCA9IGVsZW0uZ2V0RWxlbWVudCgpOwotCQkJIEhhc2h0YWJsZSBwYXJlbnRuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25zRnJvbVBhcmVudHMod3NkbERlZmluaXRpb24sZWxlbWVudCk7Ci0JCQkgU3RyaW5nIHhzZCA9IElubGluZVNjaGVtYUdlbmVyYXRvci5jcmVhdGVYU0RTdHJpbmcoZWxlbWVudCwgZWxlbWVudHMsIHJlZmVyZW5jZUxvY2F0aW9uLCBwYXJlbnRuYW1lc3BhY2VzKTsKLSAgICAgICAgCS8vYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zRnJvbVBhcmVudHMod3NkbERlZmluaXRpb24sZWxlbWVudCk7Ci0gICAgICAgICAgZW50aXR5UmVzb2x2ZXIuYWRkKHRoaXNOYW1lc3BhY2UsIHhzZCk7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZW50aXR5UmVzb2x2ZXI7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgYXMgaW4gdGhlIGZvcm0gCi0gICAqIHhtbG5zPSJzb21lbmFtZXNwYWNlIgotICAgKiBmcm9tIHRoZSBkZWZpbml0aW9ucyBhbmQgdHlwZXMgZWxlbWVudHMgYW5kIGFkZCB0aGVtIHRvIHRoZSBzY2hlbWEgZWxlbWVudCBzbyB0aGUgc2NoZW1hIAotICAgKiB2YWxpZGF0b3Igd2lsbCBoYXZlIGFjY2VzcyB0byB0aGVtLgotICAgKiAKLSAgICogQHBhcmFtIHdzZGxEZWZpbml0aW9uIFRoZSBXU0RMIGRlZmluaXRpb25zIGVsZW1lbnQuCi0gICAqIEBwYXJhbSBlbGVtZW50IFRoZSB0eXBlcyBlbGVtZW50LgotICAgKiBAcmV0dXJuIEEgaGFzaHRhYmxlIHdpdGggdGhlIG5hbWVzcGFjZSBlbGVtZW50cyBmcm9tIHRoZSBlbGVtZW50cyBwcm92aWRlZC4KLSAgICovCi0gIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0TmFtZXNwYWNlRGVjbGFyYXRpb25zRnJvbVBhcmVudHMoRGVmaW5pdGlvbiB3c2RsRGVmaW5pdGlvbiwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gIAlIYXNodGFibGUgbnNzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIEl0ZXJhdG9yIG5hbWVTcGFjZXMgPSB3c2RsRGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotICAgIFN0cmluZyBYTUxOUyA9IENvbnN0YW50cy5BVFRSX1hNTE5TOwotICAgIAotICAgIFN0cmluZyBzY2hlbWFMb2NhdGlvbiA9ICIiOwotICAgIHdoaWxlIChuYW1lU3BhY2VzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnNwcmVmaXggPSBYTUxOUzsKLSAgICAgIFN0cmluZyBucyA9IChTdHJpbmcpIG5hbWVTcGFjZXMubmV4dCgpOwotICAgICAgaWYgKCFucy5lcXVhbHNJZ25vcmVDYXNlKCIiKSkKLSAgICAgIHsKLSAgICAgICAgbnNwcmVmaXggKz0gIjoiOwotICAgICAgfQotICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZShuc3ByZWZpeCArIG5zKSkKLSAgICAgIHsKLSAgICAgIAluc3MucHV0KG5zcHJlZml4ICsgbnMsIHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZShucykpOwotLy8gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5zcHJlZml4ICsgbnMsIHdzZGxEZWZpbml0aW9uLmdldE5hbWVzcGFjZShucykpOwotICAgICAgfQotCi0gICAgfQotICAgIC8vIE5leHQgaGFuZGxlIHRoZSBwYXJlbnQgdHlwZXMgZWxlbWVudAotICAgIE5hbWVkTm9kZU1hcCBhdHRzID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCkuZ2V0QXR0cmlidXRlcygpOwotICAgIGludCBhdHRzbGVuZ3RoID0gYXR0cy5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHNsZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBOb2RlIHRlbXBub2RlID0gYXR0cy5pdGVtKGkpOwotICAgICAgU3RyaW5nIG5vZGVuYW1lID0gdGVtcG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIC8vIGlmIHRoaXMgaXMgYSBuYW1lc3BhY2UgYXR0cmlidXRlCi0gICAgICBpZiAobm9kZW5hbWUuaW5kZXhPZihYTUxOUykgIT0gLTEpCi0gICAgICB7Ci0JCW5zcy5wdXQobm9kZW5hbWUsICB0ZW1wbm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUobm9kZW5hbWUsIHRlbXBub2RlLmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5zczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdpdmVuIGEgbGluZSBudW1iZXIgZm9yIHRoZSBzY2hlbWEgcmV0dXJucyB0aGUgZWxlbWVudCBmb3VuZCBvbiB0aGF0IGxpbmUuIAotICAgKiBVc2VmdWwgZm9yIG9idGFpbmluZyBlbGVtZW50cyBmcm9tIHNjaGVtYSBTdHJpbmdzLgotICAgKiAKLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbnVtYmVyIGZvciB0aGUgc2NoZW1hLgotICAgKiBAcmV0dXJuIFRoZSBvYmplY3QgbG9jYXRlZCBhdCB0aGUgbGluZSBvciBhdCBsaW5lIDAgaWYgdGhlIGxpbmUgaXMgaW52YWxpZC4KLSAgICovCi0gICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdEF0TGluZShpbnQgbGluZSkKLSAgIHsKLSAgIAlpZihsaW5lIDwgMCB8fCBsaW5lID49IGVsZW1lbnRzLnNpemUoKSkKLSAgIAl7Ci0gICAJICBsaW5lID0gMDsKLSAgIAl9Ci0JcmV0dXJuIGVsZW1lbnRzLmdldChsaW5lKTsKLSAgIH0KLSAgIAotICAvKioKLSAgICogUmVwbGFjZSBhbnkgaW5zdGFuY2Ugb2YgdGhlIDIwMDEgc2NoZW1hIG5hbWVzcGFjZSBpbiB0aGUgZ2l2ZW4gbWVzc2FnZSB3aXRoCi0gICAqIHRoZSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byByZXBsYWNlIHRoZSBuYW1lc3BhY2UgaW4uCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZSB1c2VkIGZvciByZXBsYWNlbWVudC4KLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSB3aXRoIHRoZSAyMDAxIHNjaGVtYSBuYW1lc3BhY2UgcmVwbGFjZWQgYnkgdGhlIGdpdmVuIG5hbWVzcGFjZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlcGxhY2VOYW1lc3BhY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBuYW1lc3BhY2UpCi0gICB7Ci0gICAgIFN0cmluZyB4c2QyMDAxID0gQ29uc3RhbnRzLk5TX1VSSV9YU0RfMjAwMTsKLSAgICAgaW50IHN0YXJ0ID0gbWVzc2FnZS5pbmRleE9mKHhzZDIwMDEpOwotICAgICBpbnQgZW5kID0gc3RhcnQgKyB4c2QyMDAxLmxlbmd0aCgpOwotICAgICBpZihzdGFydCA8IDApCi0gICAgIHsKLSAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICAgfQotICAgICBTdHJpbmcgc3RhcnRTdHJpbmcgPSBtZXNzYWdlLnN1YnN0cmluZygwLHN0YXJ0KTsKLSAgICAgU3RyaW5nIGVuZFN0cmluZyA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGVuZCxtZXNzYWdlLmxlbmd0aCgpKTsKLSAgICAgcmV0dXJuIHN0YXJ0U3RyaW5nICsgbmFtZXNwYWNlICsgZW5kU3RyaW5nOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL0lubGluZVhTRFJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzMjY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvSW5saW5lWFNEUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEFuIFhNTEVudGl0eVJlc29sdmVyIHRoYXQgYWxsb3dzIGlubGluZSBzY2hlbWFzIHRvIHJlc29sdmUgZWFjaCBvdGhlciB0aHJvdWdoIGltcG9ydHMuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsIChsbWFuZGVsQGNhLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmxpbmVYU0RSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgZW50aXRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByb3RlY3RlZCBYTUxJbnB1dFNvdXJjZSByZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3R1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBJbmxpbmVYU0RSZXNvbHZlcigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByZXNvdXJjZUlkZW50aWZpZXIpCi0JCSB0aHJvd3MgWE5JRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JU3RyaW5nIHN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsKLQlTdHJpbmcgcHVibGljSWQgPSByZXNvdXJjZUlkZW50aWZpZXIuZ2V0UHVibGljSWQoKTsKLQlTdHJpbmcgbmFtZXNwYWNlID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldE5hbWVzcGFjZSgpOwotCVhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQlTdHJpbmcgc2NoZW1hID0gbnVsbDsKLQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkKLQl7Ci0JICBpZihwdWJsaWNJZCA9PSBudWxsKQotCSAgewotCSAgCWlmKG5hbWVzcGFjZSA9PSBudWxsKQotCSAgCXsJCi0JICAgICAgcmV0dXJuIG51bGw7Ci0JICAJfQotCSAgCWVsc2UKLQkgIAl7Ci0JICAJCXN5c3RlbUlkID0gbmFtZXNwYWNlOwotCSAgCX0KLQkgIH0KLQkgIGVsc2UKLQkgIHsJCi0JICAgIHN5c3RlbUlkID0gcHVibGljSWQ7Ci0JICB9Ci0JfQotCSAgCi0JaWYocmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlICE9IG51bGwgJiYgcmVmZXJyaW5nU2NoZW1hTmFtZXNwYWNlLmVxdWFscyhzeXN0ZW1JZCkpCi0JewotCQlpZihyZWZlcnJpbmdTY2hlbWFJbnB1dFNvdXJjZSE9bnVsbCkKLQkJewotCQkJcmV0dXJuIHJlZmVycmluZ1NjaGVtYUlucHV0U291cmNlOwotCQl9Ci0JfQotCWVsc2UgaWYgKChzY2hlbWEgPSAoU3RyaW5nKSBlbnRpdGllcy5nZXQoc3lzdGVtSWQpKSAhPSBudWxsICYmICFzY2hlbWEuZXF1YWxzKCIiKSkKLQl7Ci0JCWlzID0gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCBzeXN0ZW1JZCwgc3lzdGVtSWQsbmV3IFN0cmluZ1JlYWRlcihzY2hlbWEpLG51bGwpOwotCX0KLQkKLSAgICAvL2lmKGlzID09IG51bGwpCi0gICAgLy97Ci0gICAgLy8JdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0gICAgLy99Ci0JcmV0dXJuIGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBpbmxpbmUgc2NoZW1hLgotICAgKiAKLSAgICogQHBhcmFtIHRhcmdldE5hbWVzcGFjZSAtIHRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEKLSAgICogQHBhcmFtIHNjaGVtYSAtIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzY2hlbWEKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLCBTdHJpbmcgc2NoZW1hKQotICB7Ci0gICAgZW50aXRpZXMucHV0KHRhcmdldE5hbWVzcGFjZSwgc2NoZW1hKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCB0aGUgcmVmZXJyaW5nIGlubGluZSBzY2hlbWEuIAotICAgKiAKLSAgICogQHBhcmFtIGlucHV0U291cmNlIC0gYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5saW5lIHNjaGVtYQotICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW5saW5lIHNjaGVtYQotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUmVmZXJyaW5nU2NoZW1hKFhNTElucHV0U291cmNlIGlucHV0U291cmNlLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgcmVmZXJyaW5nU2NoZW1hSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKLSAgICByZWZlcnJpbmdTY2hlbWFOYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9TY2hlbWFBdHRyaWJ1dGVUYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1NjaGVtYUF0dHJpYnV0ZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTc2MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1NjaGVtYUF0dHJpYnV0ZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwueHNkOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5TY2hlbWFTeW1ib2xzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnV0aWwuU3ltYm9sVGFibGU7Ci0vKioKLSAqIFRoaXMgY2xhc3Mgd2lsbCBhbGxvdyB0aGUgY2FsbGluZyBjb2RlIHRvIHNlZSBpZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQgaW4gc2NoZW1hLgotICogVGhpcyBzZXJ2ZXMgYXMgc2NoZW1hIGZvciBzY2hlbWEuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsIChsbWFuZGVsQGNhLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFBdHRyaWJ1dGVUYWJsZSBleHRlbmRzIFN5bWJvbFRhYmxlCi17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFNjaGVtYUF0dHJpYnV0ZVRhYmxlKCkKLSAgewotICAgIC8vIGFkZCBhbGwgb2YgdGhlIHN5Ym9scyB0byB0aGUgdGFibGUuIFNjaGVtYVN5bWJvbHMgcHJvYmFibHkgc2hvdWxkIGhhdmUKLSAgICAvLyBhIFN5bWJvbFRhYmxlIGZvciB0aGVzZSBidXQgaXQgZG9lc24ndAotCi0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5EQU5ZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFdPUE9VTkRMT0NBTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1RXT1BPVU5ET1RIRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UV09QT1VORFRBUkdFVE5TKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUE9VTkRBTEwpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRV8wKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVFJVRV8xKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQU5ZU0lNUExFVFlQRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0FOWVRZUEUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9BTllVUkkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CQVNFNjRCSU5BUlkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9CT09MRUFOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0NPTExBUFNFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RBVEVUSU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREFZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfREVDSU1BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RPVUJMRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0RVUkFUSU9OKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfRU5USVRJRVMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9FWFRFTlNJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9GQUxTRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0ZMT0FUKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSEVYQklOQVJZKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfSUQpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9JRFJFRik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lEUkVGUyk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0lOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MQU5HVUFHRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xBWCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX0xJU1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9MT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTkFNRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX05FR0FUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX01PTlRIKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTU9OVEhEQVkpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OQ05BTUUpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OTVRPS0VOKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk1UT0tFTlMpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05ORUdBVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT05QT1NJVElWRUlOVEVHRVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9OT1JNQUxJWkVEU1RSSU5HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfTk9UQVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9PUFRJT05BTCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BPU0lUSVZFSU5URUdFUik7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1BSRVNFUlZFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUFJPSElCSVRFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1FOQU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUVVBTElGSUVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVQTEFDRSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1JFUVVJUkVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfUkVTVFJJQ1RJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1NLSVApOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJQ1QpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVFJJTkcpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9TVUJTVElUVVRJT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9USU1FKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVE9LRU4pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9UUlVFKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5CT1VOREVEKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5JT04pOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9VTlFVQUxJRklFRCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVEQllURSk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1VOU0lHTkVESU5UKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURMT05HKTsKLSAgICBzdXBlci5hZGRTeW1ib2woU2NoZW1hU3ltYm9scy5BVFRWQUxfVU5TSUdORURTSE9SVCk7Ci0gICAgc3VwZXIuYWRkU3ltYm9sKFNjaGVtYVN5bWJvbHMuQVRUVkFMX1lFQVIpOwotICAgIHN1cGVyLmFkZFN5bWJvbChTY2hlbWFTeW1ib2xzLkFUVFZBTF9ZRUFSTU9OVEgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvVmFsaWRhdGVFcnJvckhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2E3M2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9WYWxpZGF0ZUVycm9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwueHNkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBYTUxFcnJvckhhbmRsZXIgdGhhdCBjYXB0dXJlcyBlcnJvciBmcm9tIFhlcmNlcy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwgKGxtYW5kZWxAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgWE1MRXJyb3JIYW5kbGVyCi17Ci0gIEFycmF5TGlzdCBlcnJvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgZXJyb3IgbWVzc2FnZXMgY3JlYXRlZCBieSBYZXJjZXMuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBlcnJvcnMgbGlzdC4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEVycm9yTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIGVycm9yTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI2Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgZXJyb3JMaXN0LmFkZCgiRXJyb3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICovCi0gIHB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIGVycm9yTGlzdC5hZGQoIkZhdGFsIGVycm9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVycm9ySGFuZGxlciN3YXJuaW5nKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAqLwotICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gIHsKLSAgICBlcnJvckxpc3QuYWRkKCJXYXJuaW5nOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hNTENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhZmI1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwueHNkOwotCi0vKioKLSAqIFhNTENhdGFsb2cKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIsIG9idGFpbiBhbmQgZGVsZXRlIGFuIGluc3RhbmNlIG9mIGFuIAotICogWE1MIGNhdGFsb2cuIE1ldGhvZCBkZWZpbml0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIHRoZSBjYXRhbG9nIHRvIHNldAotICogYSBsb2NhdGlvbiBpbiB0aGUgY2F0YWxvZyBhbmQgcmVzb2x2ZSBhbiBlbnRpdHkgZnJvbSB0aGUgY2F0YWxvZy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwgKGxtYW5kZWxAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTENhdGFsb2cKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgWE1MQ2F0YWxvZyBpbnN0YW5jZSA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIENsYXNzIHhtbGNhdGFsb2djbGFzcyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIGNhdGFsb2cuIElmIG5vIGluc3RhbmNlIGlzIHJlZ2lzdGVyZWQsCi0gICAqIHJldHVybnMgYSBkZWZhdWx0IGluc3RhbmNlLgotICAgKiAKLSAgICogQHJldHVybiB0aGUgaW5zdGFuY2Ugb2YgdGhlIFhNTCBjYXRhbG9nCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhNTENhdGFsb2cgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHhtbGNhdGFsb2djbGFzcyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIGluc3RhbmNlID0gKFhNTENhdGFsb2cpeG1sY2F0YWxvZ2NsYXNzLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdGFuY2UgPSBuZXcgWE1MQ2F0YWxvZ0ltcGwoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbnN0YW5jZSA9IG5ldyBYTUxDYXRhbG9nSW1wbCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBjbGFzcyBvZiB0aGUgWE1MIGNhdGFsb2cgdG8gYmUgdXNlZC4KLSAgICogCi0gICAqIEBwYXJhbSB4bWxjYXRhbG9nIC0gdGhlIGNsYXNzIG9mIHRoZSBYTUwgY2F0YWxvZyB0byBiZSB1c2VkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0WE1MQ2F0YWxvZyhDbGFzcyB4bWxjYXRhbG9nKQotICB7Ci0gICAgeG1sY2F0YWxvZ2NsYXNzID0geG1sY2F0YWxvZzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIGluc3RhbmNlIG9mIHRoZSBYTUwgY2F0YWxvZyB0byBudWxsLiBBbGxvd3Mgc3dpdGNoaW5nIFhNTCBjYXRhbG9ncy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpCi0gIHsKLSAgICBpbnN0YW5jZSA9IG51bGw7Ci0gICAgeG1sY2F0YWxvZ2NsYXNzID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBwdWJsaWMgaWQgYW5kIGEgbG9jYXRpb24gdG8gdGhlIGNhdGFsb2cuCi0gICAqIAotICAgKiBAcGFyYW0gcHVibGljSWQgLSB0aGUgcHVibGljIGlkIG9mIHRoZSBlbnRyeQotICAgKiBAcGFyYW0gc3lzdGVtSWQgLSB0aGUgc3lzdGVtIGlkIG9mIHRoZSBlbnRyeQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRW50cnlUb0NhdGFsb2coU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotCi0gIC8qKgotICAgKiBSZXNvbHZlIHRoZSBsb2NhdGlvbiBvZiBhbiBlbnRpdHkgZ2l2ZW4gcHVibGljIGFuZCBzeXN0ZW0gaWRzLgotICAgKiAKLSAgICogQHBhcmFtIHB1YmxpY0lkIC0gdGhlIHB1YmxpYyBpZCBvZiB0aGUgZW50aXR5IHRvIGJlIHJlc29sdmVkCi0gICAqIEBwYXJhbSBzeXN0ZW1JZCAtIHRoZSBzeXN0ZW0gaWQgb2YgdGhlIGVudGl0eSB0byBiZSByZXNvbHZlZAotICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgZW50aXR5Ci0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHJlc29sdmVFbnRpdHlMb2NhdGlvbihTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hNTENhdGFsb2dJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MQ2F0YWxvZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNDBlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MQ2F0YWxvZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnhzZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIENhdGFsb2cuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsIChsbWFuZGVsQGNhLmlibS5jb20pCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nSW1wbCBleHRlbmRzIFhNTENhdGFsb2cKLXsKLSAgcHJvdGVjdGVkIE1hcCBjYXRhbG9nID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLnhtbGNvbmZvcm1hbmNlLlhNTENhdGFsb2cjYWRkRW50cnlUb0NhdGFsb2coamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVudHJ5VG9DYXRhbG9nKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgY2F0YWxvZy5wdXQocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLnhtbGNvbmZvcm1hbmNlLlhNTENhdGFsb2cjcmVzb2x2ZUVudGl0eUxvY2F0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHJlc29sdmVFbnRpdHlMb2NhdGlvbihTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgewotICAJLy8gaWYgdGhlcmUncyBubyBzeXN0ZW0gaWQgdXNlIHRoZSBwdWJsaWMgaWQKLSAgICBpZiAoc3lzdGVtSWQgPT0gbnVsbCB8fCBzeXN0ZW1JZC5lcXVhbHMoIiIpKQotICAgIHsKLSAgICAgIHN5c3RlbUlkID0gcHVibGljSWQ7Ci0gICAgfQotICAgIHJldHVybiAoU3RyaW5nKWNhdGFsb2cuZ2V0KHN5c3RlbUlkKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hNTENhdGFsb2dSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hNTENhdGFsb2dSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2VmZGMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YTUxDYXRhbG9nUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS53c2RsLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwotCi0vKioKLSAqIEEgcmVzb2x2ZXIgdG8gcmVzb2x2ZSBlbnRpdGllcyBmcm9tIHRoZSBYTUwgY2F0YWxvZy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwgKGxtYW5kZWxAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgWE1MQ2F0YWxvZ1Jlc29sdmVyIHhtbENhdGFsb2c7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTENhdGFsb2dSZXNvbHZlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGluc3RhbmNlIG9mIHRoaXMgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHJlc29sdmVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFhNTENhdGFsb2dSZXNvbHZlciBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoeG1sQ2F0YWxvZyA9PSBudWxsKQotICAgIHsKLSAgICAgIHhtbENhdGFsb2cgPSBuZXcgWE1MQ2F0YWxvZ1Jlc29sdmVyKCk7Ci0gICAgfQotICAgIHJldHVybiB4bWxDYXRhbG9nOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgKi8KLSAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwdWJsaWNJZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRQdWJsaWNJZCgpOwotICAgIFN0cmluZyBzeXN0ZW1JZCA9IHJlc291cmNlSWRlbnRpZmllci5nZXRFeHBhbmRlZFN5c3RlbUlkKCk7Ci0gICAgU3RyaW5nIGxvY2F0aW9uID0gWE1MQ2F0YWxvZy5nZXRJbnN0YW5jZSgpLnJlc29sdmVFbnRpdHlMb2NhdGlvbihwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIFhNTElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IFhNTElucHV0U291cmNlKHB1YmxpY0lkLCBzeXN0ZW1JZCwgc3lzdGVtSWQsIG5ldyBTdHJpbmdSZWFkZXIobG9jYXRpb24pLCBudWxsKTsKLSAgICAgIHJldHVybiBpbnB1dFNvdXJjZTsKLSAgICB9Ci0gICAgLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsIHRvIHRlbGwgdGhlIHBhcnNlciB0byBsb2NhdGUgdGhlIHN5c3RlbUlkIGFzIGEgVVJJCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YTUxFbnRpdHlSZXNvbHZlckNoYWluLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWE1MRW50aXR5UmVzb2x2ZXJDaGFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzFmODAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS93c2RsL3hzZC9YTUxFbnRpdHlSZXNvbHZlckNoYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC54c2Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE5JRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBIYW5kbGUgYSBjaGFpbiBvZiBlbnRpdHkgcmVzb2x2ZXJzLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCAobG1hbmRlbEBjYS5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgWE1MRW50aXR5UmVzb2x2ZXJDaGFpbiBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi17Ci0gIHByaXZhdGUgTGlzdCBlbnRpdHlSZXNvbHZlcnMgPSBuZXcgVmVjdG9yKCk7Ci0gIAotICAvKioKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyI3Jlc29sdmVFbnRpdHkob3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTFJlc291cmNlSWRlbnRpZmllcikKLSAgICovCi0gIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciB4bWxSZXNvdXJjZUlkZW50aWZpZXIpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBYTUxJbnB1dFNvdXJjZSBpcyA9IG51bGw7Ci0gICAgSXRlcmF0b3IgZW50aXR5UmVzb2x2ZXJJdGVyID0gZW50aXR5UmVzb2x2ZXJzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGVudGl0eVJlc29sdmVySXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgWE1MRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSAoWE1MRW50aXR5UmVzb2x2ZXIpZW50aXR5UmVzb2x2ZXJJdGVyLm5leHQoKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpcyA9IGVudGl0eVJlc29sdmVyLnJlc29sdmVFbnRpdHkoeG1sUmVzb3VyY2VJZGVudGlmaWVyKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChYTklFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgICAgaWYgKGlzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAvLyBUaHJvdyBhbmQgSU9FeGNlcHRpb24gaWYgdGhlIGZpbGUgaXNuJ3QgZm91bmQKLSAgICBpZiAoaXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBsb2NhdGUgZmlsZSIpOwotICAgIH0KLSAgICByZXR1cm4gaXM7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGFuIGVudGl0eSByZXNvbHZlciB0byB0aGlzIGNoYWluLgotICAgKiAKLSAgICogQHBhcmFtIGVudGl0eVJlc29sdmVyIFRoZSByZXNvbHZlciB0byBhZGQgdG8gdGhlIGNoYWluLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkRW50aXR5UmVzb2x2ZXIoWE1MRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpCi0gIHsKLSAgICBlbnRpdHlSZXNvbHZlcnMuYWRkKGVudGl0eVJlc29sdmVyKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hTRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3dzZGwveHNkL1hTRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE3YTQ3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUvd3NkbC94c2QvWFNEVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLndzZGwueHNkOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWE1MR3JhbW1hclByZXBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTEdyYW1tYXJQb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWE1MR3JhbW1hckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycy5YTUxHcmFtbWFyUG9vbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMuWFNHcmFtbWFyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54cy5YU01vZGVsOwotCi0KLS8qKgotICogVmFsaWRhdGUgc2NoZW1hcyBmcm9tIGZpbGVzIG9yIFN0cmluZy4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwgKGxtYW5kZWxAY2EuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIFhTRFZhbGlkYXRvcgotewotICBwcml2YXRlIFhTTW9kZWwgeHNNb2RlbDsKLSAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRYU0Q7Ci0gIHByaXZhdGUgTGlzdCBlcnJvcnM7Ci0gIHByaXZhdGUgU3RyaW5nIGZpbGVsb2NhdGlvbjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgWFNEVmFsaWRhdG9yKCkKLSAgewotICAgIHhzTW9kZWwgPSBudWxsOwotICAgIGlzVmFsaWRYU0QgPSBmYWxzZTsKLSAgICBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gIH0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIGFuIGlubGluZSBzY2hlbWEuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hIEEgc2NoZW1hIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBmaWxlbG9jIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgc2NoZW1hLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVJbmxpbmVTY2hlbWEoU3RyaW5nIHNjaGVtYSwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIGZpbGVsb2MpCi0gIHsKLSAgICB2YWxpZGF0ZUlubGluZVNjaGVtYShzY2hlbWEsIHRhcmdldE5hbWVzcGFjZSwgZmlsZWxvYywgbnVsbCwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogVmFsaWRhdGUgYW4gaW5saW5lIHNjaGVtYSBhbmQgc3BlY2lmeSBhbiBlbnRpdHkgcmVzb2x2ZXIuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hIFRoaXMgc2NoZW1hIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLgotICAgKiBAcGFyYW0gdGFyZ2V0TmFtZXNwYWNlIFRoZSB0YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEuCi0gICAqIEBwYXJhbSBmaWxlbG9jIFRoZSB1cmkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzIHNjaGVtYS4KLSAgICogQHBhcmFtIGVudGl0eVJlc29sdmVyQ2hhaW4gVGhlIGVudGl0eSByZXNvbHZlciBjaGFpbi4KLSAgICogQHBhcmFtIGlubGluZVNjaGVtYUVudGl0eVJlc29sdmVyIEFuIGlubGluZSBzY2hlbWEgcmVzb2x2ZXIgZm9yIHRoaXMgc2NoZW1hLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGVJbmxpbmVTY2hlbWEoCi0gICAgU3RyaW5nIHNjaGVtYSwKLSAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlLAotICAgIFN0cmluZyBmaWxlbG9jLAotICAgIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyQ2hhaW4sCi0gICAgWE1MRW50aXR5UmVzb2x2ZXIgaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIpCi0gIHsKLSAgICBmaWxlbG9jYXRpb24gPSBmaWxlbG9jOwotCi0gICAgdmFsaWRhdGVYU0Qoc2NoZW1hLCB0cnVlLCBlbnRpdHlSZXNvbHZlckNoYWluLHRhcmdldE5hbWVzcGFjZSwgaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBmaWxlIGxvY2F0ZWQgYXQgdGhlIHVyaSBzcGVjaWZpZWQgd2l0aCB0aGUgZ2l2ZW4gZW50aXR5IHJlc29sdmVyLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBBbiBhYnNvbHV0ZSB1cmkgZm9yIHRoZSBzY2hlbWEgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBlbnRpdHlSZXNvbHZlciBBbiBlbnRpdHkgcmVzb2x2ZXIgdG8gYmUgdXNlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKFN0cmluZyB1cmksIFhNTEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyKQotICB7Ci0gICAgdmFsaWRhdGVYU0QodXJpLCBmYWxzZSwgZW50aXR5UmVzb2x2ZXIsIG51bGwsIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBzY2hlbWEuCi0gICAqIAotICAgKiBAcGFyYW0gc2NoZW1hIFRoZSBzY2hlbWEgb3IgaXQncyBsb2NhdGlvbi4KLSAgICogQHBhcmFtIGlubGluZVhTRCBUcnVlIGlmIGFuIGlubGluZSBzY2hlbWEsIGZhbHNlIG90aGVyd2lzZS4KLSAgICogQHBhcmFtIGVudGl0eVJlc29sdmVyIEFuIGVudGl0eSByZXNvbHZlciB0byB1c2UuCi0gICAqIEBwYXJhbSB0YXJnZXROYW1lc3BhY2UgVGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHNjaGVtYSBiZWluZyB2YWxpZGF0ZWQuCi0gICAqIEBwYXJhbSBpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlciBBbiBpbmxpbmUgc2NoZW1hIGVudGl0eSByZXNvbHZlci4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWFNEKFN0cmluZyBzY2hlbWEsIGJvb2xlYW4gaW5saW5lWFNELCBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciwgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSwgWE1MRW50aXR5UmVzb2x2ZXIgaW5saW5lU2NoZW1hRW50aXR5UmVzb2x2ZXIpCi0gIHsKLSAgICBWYWxpZGF0ZUVycm9ySGFuZGxlciBlcnJvckhhbmRsZXIgPSBuZXcgVmFsaWRhdGVFcnJvckhhbmRsZXIoKTsKLSAgICBlcnJvckhhbmRsZXIuZ2V0RXJyb3JNZXNzYWdlcygpLmNsZWFyKCk7Ci0gICAgdHJ5Ci0gICAgewotCQlYTUxHcmFtbWFyUHJlcGFyc2VyIGdyYW1tYXJQcmVwYXJzZXIgPSBuZXcgWE1MR3JhbW1hclByZXBhcnNlcigpOwotCQlYTUxHcmFtbWFyUG9vbCBncmFtbWFyUG9vbCA9IG5ldyBYTUxHcmFtbWFyUG9vbEltcGwoKTsKLQkJZ3JhbW1hclByZXBhcnNlci5zZXRHcmFtbWFyUG9vbChncmFtbWFyUG9vbCk7Ci0JIAotICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKTsKLSAgICAgIGlmIChlbnRpdHlSZXNvbHZlciAhPSBudWxsKQotICAgICAgewotCQlncmFtbWFyUHJlcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKLSAgICAgIH0KLQotICAgICAgdHJ5Ci0gICAgICB7Ci0JCVhNTElucHV0U291cmNlIGlzID0gbnVsbDsKLSAgICAgICAgLy8gdGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgdGhlIGlubGluZSBzY2hlbWEgaW4gV1NETCBkb2N1bWVudHMKLSAgICAgICAgaWYgKGlubGluZVhTRCkKLSAgICAgICAgewotICAgICAgICAJCi0gICAgICAgIAlSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihzY2hlbWEpOwotCQkJaXMgPSBuZXcgWE1MSW5wdXRTb3VyY2UobnVsbCxmaWxlbG9jYXRpb24sZmlsZWxvY2F0aW9uLHJlYWRlcixudWxsKTsKLQkJCQotCQkJKChJbmxpbmVYU0RSZXNvbHZlcilpbmxpbmVTY2hlbWFFbnRpdHlSZXNvbHZlcikuYWRkUmVmZXJyaW5nU2NoZW1hKGlzLHRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgfQotICAgICAgICAvLyBnZXQgdGhlIGlucHV0IHNvdXJjZSBmb3IgYW4gZXh0ZXJuYWwgc2NoZW1hIGZpbGUKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaXMgPSBuZXcgWE1MSW5wdXRTb3VyY2UobnVsbCxzY2hlbWEsc2NoZW1hKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZ3JhbW1hclByZXBhcnNlci5yZWdpc3RlclByZXBhcnNlcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSxudWxsLypzY2hlbWFMb2FkZXIqLyk7Ci0gICAgICAgIFhNTEdyYW1tYXJMb2FkZXIgc2NoZW1hTG9hZGVyID0gZ3JhbW1hclByZXBhcnNlci5nZXRMb2FkZXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEpOwotCi0JCVhTR3JhbW1hciBncmFtbWFyID0gKFhTR3JhbW1hcilncmFtbWFyUHJlcGFyc2VyLnByZXBhcnNlR3JhbW1hcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSxpcyk7Ci0JCXhzTW9kZWwgPSBncmFtbWFyLnRvWFNNb2RlbCgpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICAvL3BhcnNlciB3aWxsIHJldHVybiBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCBpcyBzdHJ1Y3R1cmFsbHkgaW52YWxpZAotICAgICAgICBlcnJvcnMuYWRkKCJTY2hlbWEgaXMgc3RydWN0dXJhbGx5IGludmFsaWQuIik7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9ycy5hZGRBbGwoZXJyb3JIYW5kbGVyLmdldEVycm9yTWVzc2FnZXMoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLSAgICB9Ci0gICAgaWYgKGVycm9ycy5pc0VtcHR5KCkpCi0gICAgewotICAgICAgaXNWYWxpZFhTRCA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFhTTW9kZWwgY3JlYXRlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIFhTTW9kZWwgY3JlYXRlZC4KLSAgICovCi0KLSAgcHVibGljIFhTTW9kZWwgZ2V0WFNNb2RlbCgpCi0gIHsKLSAgCXJldHVybiB4c01vZGVsOwotICB9Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNjaGVtYSBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBzY2hlbWEgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICB7Ci0gICAgcmV0dXJuIGlzVmFsaWRYU0Q7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBlcnJvciBsaXN0LgotICAgKiAKLSAgICogQHJldHVybiBBIGxpc3Qgb2YgZXJyb3IgZnJvbSB0aGUgc2NoZW1hLgotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RXJyb3JzKCkKLSAgewotICAgIHJldHVybiBlcnJvcnM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MQ29udmVydG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTENvbnZlcnRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmIxMzRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MQ29udmVydG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnZlcnRzIGEgWE1MIGRvY3VtZW50IHVzaW5nIGFuIFhTTCBmaWxlLgotICogCi0gKiBAdmVyc2lvbiAxLjAuMQotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtICAocGV0ZXJickB1cy5pYm0uY29tKQotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29udmVydG9yCi17Ci0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybXMgYW4gWE1MIGRvY3VtZW50IHVzaW5nIGFuIFhTTCBmaWxlLgotICAgKiBAcGFyYW0gYXJncyAgYXJndW1lbnRzIGZvciBtYWluLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDMpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAiVXNhZ2U6IFhNTENvbnZlcnRvciA8eHNsRmlsZT4gPGluWE1MRmlsZT4gPG91dEZpbGU+Iik7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gR2V0IHRyYW5zZm9ybWVyIAotICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9Ci0gICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoCi0gICAgICAgICAgICBuZXcgU3RyZWFtU291cmNlKGFyZ3NbMF0pKTsKLQotICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIFhNTCBkb2N1bWVudCB1c2luZyB0aGUgc3BlY2lmaWNlZCBYU0wgZmlsZQotICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oCi0gICAgICAgICAgbmV3IFN0cmVhbVNvdXJjZShhcmdzWzFdKSwKLSAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFyZ3NbMl0pKSk7Ci0KLSAgICAgICAgLy8gRGlzcGxheSByZXN1bHRzCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAiQ3JlYXRlZCAiICsgYXJnc1syXSArICIgZnJvbSAiICsgYXJnc1swXSArICIgYW5kICIgKyBhcmdzWzFdICsgIi4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxEb2N1bWVudENhY2hlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTERvY3VtZW50Q2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzZTY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTERvY3VtZW50Q2FjaGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIEhhc2hNYXAgdG8gY2FjaGUgWE1MIGRvY3VtZW50cy4KLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudENhY2hlIGV4dGVuZHMgSGFzaE1hcAotewotCi0gIC8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzgzNDAyODA0MzcwOTY1NzQwMUw7Ci0KLQkvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhNTERvY3VtZW50Q2FjaGUuCi0gICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5LgotICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgICAgICB0aGUgbG9hZCBmYWN0b3IuIAotICAgKi8KLSAgcHVibGljIFhNTERvY3VtZW50Q2FjaGUoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikKLSAgewotICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3Rvcik7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhNTERvY3VtZW50Q2FjaGUuCi0gICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5LgotICAgKi8KLSAgcHVibGljIFhNTERvY3VtZW50Q2FjaGUoaW50IGluaXRpYWxDYXBhY2l0eSkKLSAgewotICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhNTERvY3VtZW50Q2FjaGUuCi0gICAqLwotICBwdWJsaWMgWE1MRG9jdW1lbnRDYWNoZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBYTUxEb2N1bWVudENhY2hlLgotICAgKiBAcGFyYW0gdCAgdGhlIG1hcCB3aG9zZSBtYXBwaW5ncyBhcmUgdG8gYmUgcGxhY2VkIGluIHRoaXMgbWFwLgotICAgKi8KLSAgcHVibGljIFhNTERvY3VtZW50Q2FjaGUoTWFwIHQpCi0gIHsKLSAgICBzdXBlcih0KTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTERvY3VtZW50Q2FjaGVVc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTERvY3VtZW50Q2FjaGVVc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMWRmNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxEb2N1bWVudENhY2hlVXNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgY2FjaGVkIFhNTCBkb2N1bWVudHMuCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxEb2N1bWVudENhY2hlVXNlcgotewotICAvKioKLSAgICogQ2FjaGUgb2YgcGFyc2VkIGRvY3VtZW50cy4KLSAgICovCi0gIHByb3RlY3RlZCBYTUxEb2N1bWVudENhY2hlIGRvY3VtZW50TGlzdCA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEdldCBkb2N1bWVudCBmcm9tIGNhY2hlLgotICAgKiBAc2VlICNzZXREb2N1bWVudAotICAgKgotICAgKiBAcGFyYW0ga2V5ICBhIFN0cmluZy4gCi0gICAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUga2V5LgotICAgKi8KLSAgcHJvdGVjdGVkIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gKERvY3VtZW50KSBkb2N1bWVudExpc3QuZ2V0KGtleSk7Ci0gIH0KLQotICAvKioKLSAgICogUHV0IGRvY3VtZW50IHdpdGggY29ycmVzcG9uZGluZyBrZXkgaW4gY2FjaGUuCi0gICAqIEBzZWUgI2dldERvY3VtZW50Ci0gICAqCi0gICAqIEBwYXJhbSBrZXkgICAgICAgYSBTdHJpbmcgdXNlZCBhcyBhIGtleSB0byBpZGVudGlmeSBzcGVjaWZpZWQgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBkb2N1bWVudCAgYSBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50KFN0cmluZyBrZXksIE9iamVjdCBkb2N1bWVudCkKLSAgewotICAgIGRvY3VtZW50TGlzdC5wdXQoa2V5LCBkb2N1bWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGRvY3VtZW50IGxpc3QuCi0gICAqIEByZXR1cm4gYSBYTUxEb2N1bWVudENhY2hlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRvY3VtZW50IGxpc3QgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgWE1MRG9jdW1lbnRDYWNoZSBnZXREb2N1bWVudExpc3QoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50TGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBYTUwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSB1cmxTdHJpbmcgIGEgU3RyaW5nIGxvY2F0aW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAqIEBwYXJhbSBiYXNlVVJJICAgIGEgYmFzZSB1cmwgdG8gYXNzaXN0IGluIGxvY2F0aW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIGRvY3VtZW50IGNhbm5vdCBiZSBwYXJzZWQuCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgcGFyc2VYTUxEb2N1bWVudFVSTChTdHJpbmcgdXJsU3RyaW5nLCBTdHJpbmcgYmFzZVVSSSkKLSAgICB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcGFyc2VYTUxEb2N1bWVudFVSTCh1cmxTdHJpbmcsIGJhc2VVUkksIG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIFhNTCBkb2N1bWVudCBhbmQgdmFsaWRhdGUgd2l0aCBhIHNjaGVtYSBkb2N1bWVudC4KLSAgICogQHBhcmFtIHVybFN0cmluZyAgYSBTdHJpbmcgbG9jYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICogQHBhcmFtIGJhc2VVUkkgICAgYSBiYXNlIHVybCB0byBhc3Npc3QgaW4gbG9jYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICogQHBhcmFtIHNjaGVtYSAgICAgYSBTdHJpbmcgaWRlbnRpZnlpbmcgcmVsYXRlZCBzY2hlbWEgZG9jdW1lbnQuCi0gICAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIGRvY3VtZW50IGNhbm5vdCBiZSBwYXJzZWQuCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgcGFyc2VYTUxEb2N1bWVudFVSTCgKLSAgICBTdHJpbmcgdXJsU3RyaW5nLAotICAgIFN0cmluZyBiYXNlVVJJLAotICAgIFN0cmluZyBzY2hlbWEpCi0gICAgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gQ3JlYXRlIFVSTCByZWZlcmVuY2UgdG8gZG9jdW1lbnQKLSAgICAgIFVSTCB1cmwgPSBYTUxVdGlscy5jcmVhdGVVUkwodXJsU3RyaW5nLCBiYXNlVVJJKTsKLSAgICAgICAgICAgICAgIAotICAgICAgLy8gVE9ETzogQWRkIHNjaGVtYSB0byB0aGUgeG1sIGRvY3VtZW50IGNhY2hlLCBzbyB0aGF0IHlvdSBjYW4gZGV0ZWN0IHdoZW4gaXQgaGFzIGFscmVhZHkgCi0gICAgICAvLyAgYmVlbiBwYXJzZWQgdXNpbmcgYSBzcGVjaWZpYyBzY2hlbWEgZGVmaW5pdGlvbiAKLQotICAgICAgLy8gSWYgdGhlIGRvY3VtZW50IGlzIG5vdCBpbiB0aGUgY2FjaGUsIHRoZW4gcmVhZCBhbmQgcGFyc2UgaXQKLSAgIAkgIGlmICgoZG9jdW1lbnQgPSBnZXREb2N1bWVudCh1cmxTdHJpbmcpKSA9PSBudWxsKQotICAgICAgewotICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLnBhcnNlWE1MRG9jdW1lbnRVUkwodXJsLCBzY2hlbWEpOwotICAgICAgICAvLyBBZGQgZG9jdW1lbnQgdG8gY2FjaGUKLSAgICAgICAgc2V0RG9jdW1lbnQodXJsU3RyaW5nLCBkb2N1bWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IGU7Ci0gICAgfQotCi0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotICAgIH0KLQotICAgIHJldHVybiBkb2N1bWVudDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxUYWdzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTFRhZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyZDA0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTFRhZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWw7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaW5mb3JtYXRpb24gb24gWE1MIHRhZ3MuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MVGFncwotewotICAvKioKLSAgICogTmFtZXNwYWNlcy4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9YU0kgPQotICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9YTUxOUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1VSSV9YU0QgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYU0RfU0NIRU1BTE9DQVRJT04gPQotICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QiOwotCi0gIC8qKgotICAgKiBRdWFsaWZpZWQgbmFtZXMgb2YgWFNEIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBFTEVNX1hTRF9BTk5PVEFUSU9OID0KLSAgICBuZXcgUU5hbWUoTlNfVVJJX1hTRCwgImFubm90YXRpb24iKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBFTEVNX1hTRF9JTVBPUlQgPSBuZXcgUU5hbWUoTlNfVVJJX1hTRCwgImltcG9ydCIpOyAgCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRUxFTV9YU0RfSU5DTFVERSA9IG5ldyBRTmFtZShOU19VUklfWFNELCAiaW5jbHVkZSIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEVMRU1fWFNEX1NDSEVNQSA9IG5ldyBRTmFtZShOU19VUklfWFNELCAic2NoZW1hIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgRUxFTV9YU0RfRUxFTUVOVCA9IG5ldyBRTmFtZShOU19VUklfWFNELCAiZWxlbWVudCIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEVMRU1fWFNEX0FUVFJJQlVURSA9Ci0gICAgbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJhdHRyaWJ1dGUiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBFTEVNX1hTRF9DT01QTEVYVFlQRSA9Ci0gICAgbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJjb21wbGV4VHlwZSIpOwotCi0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9YU0lfVFlQRSA9IG5ldyBRTmFtZShOU19VUklfWFNJLCAidHlwZSIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfWFNJX05JTCA9IG5ldyBRTmFtZShOU19VUklfWFNJLCAibmlsIik7Ci0KLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBBVFRSX1hTRF9OQU1FID0gbmV3IFFOYW1lKE5TX1VSSV9YU0QsICJuYW1lIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9YU0RfVFlQRSA9IG5ldyBRTmFtZShOU19VUklfWFNELCAidHlwZSIpOwotICBwdWJsaWMgZmluYWwgc3RhdGljIFFOYW1lIEFUVFJfWFNEX0JBU0UgPSBuZXcgUU5hbWUoTlNfVVJJX1hTRCwgImJhc2UiKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBBVFRSX1hTRF9OQU1FU1BBQ0UgPQotICAgIG5ldyBRTmFtZShOU19VUklfWFNELCAibmFtZXNwYWNlIik7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgUU5hbWUgQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04gPQotICAgIG5ldyBRTmFtZShOU19VUklfWFNELCAic2NoZW1hTG9jYXRpb24iKTsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBRTmFtZSBBVFRSX1hTRF9UQVJHRVROQU1FU1BBQ0UgPQotICAgIG5ldyBRTmFtZShOU19VUklfWFNELCAidGFyZ2V0TmFtZXNwYWNlIik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVHJhdmVyc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTFRyYXZlcnNhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjIzM2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVHJhdmVyc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBXZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgbm9kZSBzb3VyY2UgY29kZSwgc28gdGhpcyBkb2VzCi0gKiBvdXIgZG91YmxlLWRpc3BhdGNoIHRoZSBoYXJkIHdheS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFRyYXZlcnNhbCBleHRlbmRzIFhNTFZpc2l0b3IKLXsKLSAgLyoqCi0gICAgICogUmV0dXJuaW5nIGZhbHNlIGZyb20gYWN0aW9uIHdvdWxkIHRlcm1pbmF0ZXMgdHJhdmVyc2FsLgotICAgICAqIEhvd2V2ZXIsIHRoaXMgYWx3YXlzIHJldHVybnMgdHJ1ZS4gLS0gYSBuby1vcC4KLSAgICAgKiBAcGFyYW0gbiAtIGFuIFhNTCBub2RlLgotICAgICAqIEByZXR1cm4gYWx3YXlzIHRydWUuCi0gICAgICovCi0gIHB1YmxpYyBib29sZWFuIGFjdGlvbihOb2RlIG4pCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KENEQVRBU2VjdGlvbiBzKQotICB7Ci0gICAgYWN0aW9uKHMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXQoRG9jdW1lbnQgZSkKLSAgewotICAgIGlmIChhY3Rpb24oZSkpCi0gICAgewotICAgICAgLy8gVGhpcyBkb2VzIHZpc2l0IERvY3VtZW50VHlwZSwgd2hpY2ggaXMgY29uc2lkZXJlZCBhIGNoaWxkIE5vZGUuCi0gICAgICBmb3IgKE5vZGUgbiA9IGUuZ2V0Rmlyc3RDaGlsZCgpOyBuICE9IG51bGw7IG4gPSBuLmdldE5leHRTaWJsaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGRvVmlzaXQobik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXQoRG9jdW1lbnRUeXBlIHR5cGUpCi0gIHsKLSAgICBpZiAoYWN0aW9uKHR5cGUpKQotICAgIHsKLSAgICAgIHZpc2l0KHR5cGUuZ2V0RW50aXRpZXMoKSk7Ci0gICAgICB2aXNpdCh0eXBlLmdldE5vdGF0aW9ucygpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChBdHRyIGUpCi0gIHsKLSAgICBhY3Rpb24oZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChFbGVtZW50IG5vZGUpCi0gIHsKLSAgICBpZiAoYWN0aW9uKG5vZGUpKQotICAgIHsKLSAgICAgIHZpc2l0KG5vZGUuZ2V0QXR0cmlidXRlcygpKTsKLSAgICAgIGZvciAoTm9kZSBuID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IG4gIT0gbnVsbDsgbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICAgIHsKLSAgICAgICAgZG9WaXNpdChuKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChDb21tZW50IGUpCi0gIHsKLSAgICBhY3Rpb24oZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChUZXh0IGUpCi0gIHsKLSAgICBhY3Rpb24oZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdChFbnRpdHlSZWZlcmVuY2UgZSkKLSAgewotICAgIGFjdGlvbihlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEVudGl0eSBlKQotICB7Ci0gICAgYWN0aW9uKGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXQoTm90YXRpb24gbikKLSAgewotICAgIGFjdGlvbihuKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBpKQotICB7Ci0gICAgYWN0aW9uKGkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXQoTmFtZWROb2RlTWFwIG1hcCkKLSAgewotICAgIGlmIChtYXAgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcC5nZXRMZW5ndGgoKTsgKytpKQotICAgICAgewotICAgICAgICBkb1Zpc2l0KG1hcC5pdGVtKGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLy8gRU5EIE9GIEZJTEUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxNWE4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL1hNTFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5YTUxTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSVRhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5OdWxsVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNoYXJhY3RlckRhdGE7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLlN0cmluZ1V0aWxzOwotCi0vKioKLSAqIFNldCBvZiBYTUwgcmVsYXRlZCB1dGlsaXRpZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKiBAYXV0aG9yIFBldGVyIEJyaXR0ZW5oYW0KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTFV0aWxzCi17Ci0JLyoqCi0JICogU29tZSBzYXggZmVhdHVyZXMgdGhhdCBuZWVkIHRvIGJlIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX05BTUVTUEFDRVMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfVkFMSURBVElPTl9TQ0hFTUEgPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhQX1NDSEVNQV9MQU5HVUFHRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hTGFuZ3VhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFczQ19YTUxfU0NIRU1BID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXM0NfU09BUF8xMl9TQ0hFTUEgPSAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWFBfU0NIRU1BX1NPVVJDRSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvc2NoZW1hU291cmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FWFRFUk5BTF9TQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLXNjaGVtYUxvY2F0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRUxFTV9FTlZFTE9QRSA9ICJFbnZlbG9wZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTEVNX0hFQURFUiA9ICJIZWFkZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRUxFTV9CT0RZID0gIkJvZHkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfRUxFTV9GQVVMVCA9ICJGYXVsdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTEVNX0ZBVUxUX0NPREUgPSAiZmF1bHRjb2RlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0VMRU1fRkFVTFRfU1RSSU5HID0gImZhdWx0c3RyaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQX0VMRU1fRkFVTFRfREVUQUlMID0gImRldGFpbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9FTEVNX0ZBVUxUX0FDVE9SID0gImZhdWx0YWN0b3IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfQVRUUl9NVVNUX1VOREVSU1RBTkQgPSAibXVzdFVuZGVyc3RhbmQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBfQVRUUl9BQ1RPUiA9ICJhY3RvciI7Ci0KLQkvKioKLQkgKiBHZXQgWE1MUmVhZGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFhNTFJlYWRlciB2YWx1ZQotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyBnZXR0aW5nIHRoZSBYTUxSZWFkZXIKLQkgKiAgICAgICAgICAgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxSZWFkZXIgZ2V0WE1MUmVhZGVyKCkgdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCVhNTFJlYWRlciB4bWxSZWFkZXIgPSBudWxsOwotCi0JCXRyeQotCQl7Ci0JCQl4bWxSZWFkZXIgPSAobmV3IG9yZy5hcGFjaGUueGVyY2VzLmpheHAuU0FYUGFyc2VyRmFjdG9yeUltcGwoKSkKLQkJCQkJLm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpOwotCi0JCQkvLyBTZXQgbmFtZXNwYWNlIGF3YXJlCi0JCQl4bWxSZWFkZXIuc2V0RmVhdHVyZShGRUFUVVJFX05BTUVTUEFDRV9QUkVGSVhFUywgdHJ1ZSk7Ci0JCQl4bWxSZWFkZXIuc2V0RmVhdHVyZShGRUFUVVJFX05BTUVTUEFDRVMsIHRydWUpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IFhNTFJlYWRlciBpbXBsZW1lbnRhdGlvbi4iLCBlKTsKLQkJfQotCi0JCXJldHVybiB4bWxSZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGV4dCBzdHJpbmcgYXMgYW4gWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQgWE1MIGRvY3VtZW50IHRleHQuCi0JICogQHBhcmFtIHZhbGlkYXRlIHRydWUgaWYgdGhlIGRvY3VtZW50IHdpbGwgYmUgdmFsaWRhdGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFN0cmluZyB0ZXh0LCBib29sZWFuIHZhbGlkYXRlKQotCQkJdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVhNTChuZXcgU3RyaW5nUmVhZGVyKHRleHQpLCB2YWxpZGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGV4dCBzdHJpbmcgYXMgYW4gWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQgWE1MIGRvY3VtZW50IHRleHQuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUwoU3RyaW5nIHRleHQpIHRocm93cyBXU0lFeGNlcHRpb24gewotCQlyZXR1cm4gcGFyc2VYTUwobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIFhNTCBkb2N1bWVudCBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGV4Y2VwdGlvbiBvZiBzb21lIHNvcnQgaGFzIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUxEb2N1bWVudChTdHJpbmcgdXJpKSAKLQl0aHJvd3MgV1NJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiAKLQl7Ci0JCXJldHVybiBwYXJzZVhNTERvY3VtZW50KHVyaSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIFhNTCBkb2N1bWVudCBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB1cmkgdGhlIGxvY2F0aW9uIG9mIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHBhcmFtIHNjaGVtYSBhIFN0cmluZyBpZGVudGlmeWluZyByZWxhdGVkIHNjaGVtYSBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIGEgRG9jdW1lbnQgb2JqZWN0LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXhjZXB0aW9uIG9mIHNvbWUgc29ydCBoYXMgb2NjdXJyZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50KFN0cmluZyB1cmksIFN0cmluZyBzY2hlbWEpCi0JdGhyb3dzIFdTSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gCi0JewotCSAgICAgIFVSTCB1cmwgPSBTdHJpbmdVdGlscy5nZXRVUkwobnVsbCwgdXJpKTsKLQkgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IChJbnB1dFN0cmVhbSl1cmwuZ2V0Q29udGVudCgpOwotCSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKLQkgICAgICBpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZCh1cmwudG9TdHJpbmcoKSk7Ci0JICAgICAgCi0JICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQotCSAgICAgIAlyZXR1cm4gcGFyc2VYTUwoaW5wdXRTb3VyY2UsIGZhbHNlKTsKLQkgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcGFyc2VYTUwoaW5wdXRTb3VyY2UsIHNjaGVtYSk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgcmVhZGVyIGFuZCByZXR1cm5zIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHVybCBhIFN0cmluZyBsb2NhdGluZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBwYXJhbSBzY2hlbWEgYSBTdHJpbmcgaWRlbnRpZnlpbmcgcmVsYXRlZCBzY2hlbWEgZG9jdW1lbnQuCi0JICogQHBhcmFtIGJhc2VVUkkgYSBiYXNlIHVybCB0byBhc3Npc3QgaW4gbG9jYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIERvY3VtZW50LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50VVJMKFN0cmluZyB1cmwsIFN0cmluZyBzY2hlbWEsCi0JCQlTdHJpbmcgYmFzZVVSSSkgdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQotCQl0cnkKLQkJewotCQkJZG9jdW1lbnQgPSBwYXJzZVhNTERvY3VtZW50VVJMKGNyZWF0ZVVSTCh1cmwsIGJhc2VVUkkpLCBzY2hlbWEpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBwYXJzZVhNTERvY3VtZW50VVJMKHVybCwgc2NoZW1hKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYW4gWE1MIGRvY3VtZW50IGZyb20gYSByZWFkZXIgYW5kIHJldHVybnMgdGhlIGRvY3VtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsIGEgVVJMIG9iamVjdCBpZGVudGlmeWluZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEBwYXJhbSBzY2hlbWEgYSBTdHJpbmcgaWRlbnRpZnlpbmcgcmVsYXRlZCBzY2hlbWEgZG9jdW1lbnQuCi0JICogQHJldHVybiBEb2N1bWVudC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUxEb2N1bWVudFVSTChVUkwgdXJsLCBTdHJpbmcgc2NoZW1hKQotCQkJdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCXRyeQotCQl7Ci0JICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSAoSW5wdXRTdHJlYW0pdXJsLmdldENvbnRlbnQoKTsKLQkgICAgICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSk7Ci0JICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQodXJsLnRvU3RyaW5nKCkpOwotCi0JCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCi0JCQlpZiAoc2NoZW1hID09IG51bGwpCi0JCQkJZG9jID0gcGFyc2VYTUwoaW5wdXRTb3VyY2UpOwotCQkJZWxzZQotCQkJCWRvYyA9IHBhcnNlWE1MKGlucHV0U291cmNlLCBzY2hlbWEpOwotCi0JCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJcmV0dXJuIGRvYzsKLQkJfQotCi0JCWNhdGNoIChXU0lFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgZTsKLQkJfQotCi0JCWNhdGNoIChUaHJvd2FibGUgdCkKLQkJewotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgYW4gWE1MIGRvY3VtZW50IGZyb20gYSByZWFkZXIgYW5kIHJldHVybnMgdGhlIGRvY3VtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsU3RyaW5nIGEgU3RyaW5nIGxvY2F0aW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICogQHBhcmFtIGJhc2VVUkkgYSBiYXNlIHVybCB0byBhc3Npc3QgaW4gbG9jYXRpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUxEb2N1bWVudFVSTChTdHJpbmcgdXJsU3RyaW5nLCBTdHJpbmcgYmFzZVVSSSkKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0KLQkJdHJ5Ci0JCXsKLQkJCVVSTCB1cmwgPSBjcmVhdGVVUkwodXJsU3RyaW5nLCBiYXNlVVJJKTsKLQotCQkJZG9jdW1lbnQgPSBwYXJzZVhNTERvY3VtZW50VVJMKHVybCk7Ci0JCX0KLQotCQljYXRjaCAoV1NJRXhjZXB0aW9uIHdlKQotCQl7Ci0JCQl0aHJvdyB3ZTsKLQkJfQotCi0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgcmVhZGVyIGFuZCByZXR1cm5zIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHVybCBhIFVSTCBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIERvY3VtZW50LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTERvY3VtZW50VVJMKFVSTCB1cmwpIHRocm93cyBXU0lFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0KLQkJdHJ5Ci0JCXsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsLm9wZW5TdHJlYW0oKSk7Ci0JCQlJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UocmVhZGVyKTsKLQkJCXNvdXJjZS5zZXRTeXN0ZW1JZCh1cmwudG9TdHJpbmcoKSk7Ci0JCQlkb2N1bWVudCA9IHBhcnNlWE1MKHNvdXJjZSk7Ci0KLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCi0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIHJlYWRlciBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0JICogQHBhcmFtIHZhbGlkYXRlIHRydWUgaWYgdGhlIGRvY3VtZW50IHdpbGwgYmUgdmFsaWRhdGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKElucHV0U291cmNlIHNvdXJjZSwgYm9vbGVhbiB2YWxpZGF0ZSkKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlDbGFzc0xvYWRlciBjdXJyZW50TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsgICAKLQkJdHJ5Ci0JCXsKLSAgICAJICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsgICAKLQotICAJCSAgLy8gR2V0IHRoZSBkb2N1bWVudCBmYWN0b3J5Ci0JCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuamF4cC5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbCgpOwotCi0JCSAgLy8gU2V0IG5hbWVzcGFjZSBhd2FyZSwgYnV0IGZvciBub3cgZG8gbm90IHZhbGlkYXRlCi0JCSAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJICBmYWN0b3J5LnNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKHRydWUpOwotCi0JCSAgLy8gQUREOiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBzY2hlbWEKLQkJICAvLyBkb2N1bWVudAotCQkgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0KLSAJCSAgLy8gUGFyc2UgdGhlIGRvY3VtZW50Ci0JCSAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkgIGRvYyA9IGJ1aWxkZXIucGFyc2Uoc291cmNlKTsKLQkJICAvLyB3b3JrYXJvdW5kIGZvciBjb21wYXRpYmlsaXR5IFhlcmNlcyAyLjIuMSB3aXRoIFhlcmNlcyAyLjYuMiwKLQkJICAvLyBYZXJjZXMgMi42LjIgc3VwcG9ydGVkIFhNTCAxLjEgYnV0IFdTSS10b29sIGFuZCBYZXJjZXMgMi4yLjEKLQkJICAvLyBzdXBwb3J0ZWQgb25seSBYTUwgMS4wCi0JCSAgaWYgKGRvYyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwpCi0JCSAgewotCQkJaWYgKCgob3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbCkgZG9jKS5nZXRYbWxWZXJzaW9uKCkuZXF1YWxzKAotCQkJCQkJIjEuMSIpKQotCQkJewotCQkJCXRocm93IG5ldyBXU0lFeGNlcHRpb24oIkZhdGFsIEVycm9yOiBYTUwgdmVyc2lvbiAmcXVvdDsxLjEmcXVvdDsgIgotCQkJCQkJKyAiaXMgbm90IHN1cHBvcnRlZCwgb25seSBYTUwgMS4wIGlzIHN1cHBvcnRlZC4iKTsKLQkJCX0KLQkJICB9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgWE1MIGRvY3VtZW50LiIsIGUpOwotCQl9Ci0JICAgIGZpbmFsbHkKLQkgICAgeyAKLQkgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50TG9hZGVyKTsKLQkgICAgfSAgICAKLQotCQkvLyBSZXR1cm4gZG9jdW1lbnQKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIHJlYWRlciBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0JICogQHBhcmFtIHZhbGlkYXRlIHRydWUgaWYgdGhlIGRvY3VtZW50IHdpbGwgYmUgdmFsaWRhdGUsIGZhbHNlIG90aGVyd2lzZQotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFJlYWRlciByZWFkZXIsIGJvb2xlYW4gdmFsaWRhdGUpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7ICAgCi0JCXRyeQotCQl7Ci0JCSAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgCi0JCSAgQ2xhc3NMb2FkZXIgdGVtcExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCQotCQkgIC8vIENyZWF0ZSBpbnB1dCBzb3VyY2UKLQkJICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShyZWFkZXIpOwotCi0JCSAgLy8gR2V0IHRoZSBkb2N1bWVudCBmYWN0b3J5Ci0JCSAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuamF4cC5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbCgpOwotCi0JCSAgLy8gU2V0IG5hbWVzcGFjZSBhd2FyZSwgYnV0IGZvciBub3cgZG8gbm90IHZhbGlkYXRlCi0JCSAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJICBmYWN0b3J5LnNldElnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKHRydWUpOwotCi0JCSAgLy8gQUREOiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBzY2hlbWEKLQkJICAvLyBkb2N1bWVudAotCQkgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0KLQkJICAvLyBQYXJzZSB0aGUgZG9jdW1lbnQKLQkJICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCSAgZG9jID0gYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0JICAgCSAgLy8gd29ya2Fyb3VuZCBmb3IgY29tcGF0aWJpbGl0eSBYZXJjZXMgMi4yLjEgd2l0aCBYZXJjZXMgMi42LjIsCi0JCSAgLy8gWGVyY2VzIDIuNi4yIHN1cHBvcnRlZCBYTUwgMS4xIGJ1dCBXU0ktdG9vbCBhbmQgWGVyY2VzIDIuMi4xCi0JCSAgLy8gc3VwcG9ydGVkIG9ubHkgWE1MIDEuMAotCQkgIGlmIChkb2MgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsKQotCQkgIHsKLQkJCWlmICgoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwpIGRvYykuZ2V0WG1sVmVyc2lvbigpLmVxdWFscygKLQkJCQkJCSIxLjEiKSkKLQkJCXsKLQkJCSAgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiRmF0YWwgRXJyb3I6IFhNTCB2ZXJzaW9uICZxdW90OzEuMSZxdW90OyAiCi0JCQkJCQkJKyAiaXMgbm90IHN1cHBvcnRlZCwgb25seSBYTUwgMS4wIGlzIHN1cHBvcnRlZC4iKTsKLQkJCX0KLQkgICAgICB9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgWE1MIGRvY3VtZW50LiIsIGUpOwotCQl9Ci0JICAgIGZpbmFsbHkKLQkgICAgeyAKLQkgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50TG9hZGVyKTsKLQkgICAgfSAgICAKLQotCQkvLyBSZXR1cm4gZG9jdW1lbnQKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIGlucHV0IHNvdXJjZSBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZSBhIElucHV0U291cmNlIG9iamVjdC4KLQkgKiBAcmV0dXJuIGEgRG9jdW1lbnQgb2JqZWN0LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTChSZWFkZXIgcmVhZGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHBhcnNlWE1MKHJlYWRlciwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgaW5wdXQgc291cmNlIGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlIGEgSW5wdXRTb3VyY2Ugb2JqZWN0LgotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKElucHV0U291cmNlIHNvdXJjZSkgdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVhNTChzb3VyY2UsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0ZXh0IHN0cmluZyBhcyBhbiBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCBYTUwgZG9jdW1lbnQgdGV4dC4KLQkgKiBAcGFyYW0gc2NoZW1hIGEgU3RyaW5nIGlkZW50aWZ5aW5nIHJlbGF0ZWQgc2NoZW1hIGRvY3VtZW50LgotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFN0cmluZyB0ZXh0LCBTdHJpbmcgc2NoZW1hKQotCQkJdGhyb3dzIFdTSUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVhNTChuZXcgU3RyaW5nUmVhZGVyKHRleHQpLCBzY2hlbWEpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRleHQgc3RyaW5nIGFzIGFuIFhNTCBkb2N1bWVudCBhbmQgcmV0dXJuIHRoZSBkb2N1bWVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IFhNTCBkb2N1bWVudCB0ZXh0LgotCSAqIEBwYXJhbSBzY2hlbWFzIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIHNjaGVtYSBkb2N1bWVudHMuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUwoU3RyaW5nIHRleHQsIENvbGxlY3Rpb24gc2NoZW1hcykKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCQlyZXR1cm4gcGFyc2VYTUwobmV3IFN0cmluZ1JlYWRlcih0ZXh0KSwgc2NoZW1hcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQgWE1MIGRvY3VtZW50IHRleHQuCi0JICogQHBhcmFtIHNjaGVtYVN0cmluZyBhIFN0cmluZ1JlYWRlciBvYmplY3QuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGV4Y2VwdGlvbiBvZiBzb21lIHNvcnQgaGFzIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUwoU3RyaW5nIHRleHQsIFN0cmluZ1JlYWRlciBzY2hlbWFTdHJpbmcpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZVhNTChuZXcgU3RyaW5nUmVhZGVyKHRleHQpLCBzY2hlbWFTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyIGEgUmVhZGVyIG9iamVjdC4KLQkgKiBAcGFyYW0gc2NoZW1hIGEgU3RyaW5nIGlkZW50aWZ5aW5nIHJlbGF0ZWQgc2NoZW1hIGRvY3VtZW50LgotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFJlYWRlciByZWFkZXIsIFN0cmluZyBzY2hlbWEpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7ICAgCi0JCXRyeQotCQl7Ci0gICAgCSAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgCi0JCSAgLy8gQ3JlYXRlIGlucHV0IHNvdXJjZQotCQkgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0KLQkJICAvLyBHZXQgdGhlIGRvY3VtZW50IGZhY3RvcnkKLQkJICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsKCk7Ci0KLQkJICAvLyBTZXQgbmFtZXNwYWNlIGF3YXJlLCBidXQgZm9yIG5vdyBkbyBub3QgdmFsaWRhdGUKLQkJICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkgIGZhY3Rvcnkuc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UodHJ1ZSk7Ci0KLQkJICB0cnkKLQkJICB7Ci0JCSAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfTEFOR1VBR0UsIFczQ19YTUxfU0NIRU1BKTsKLSAJCSAgfQotICAgCQkgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLQkJICB7Ci0JCQlTdHJpbmcgZXJyTWVzc2FnZSA9ICJFcnJvcjogSkFYUCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGF0dHJpYnV0ZSBub3QgcmVjb2duaXplZDogIgotCQkJCQkrIEpBWFBfU0NIRU1BX0xBTkdVQUdFCi0JCQkJCSsgIlxuIgotCQkJCQkrICJDaGVjayB0byBzZWUgaWYgcGFyc2VyIGNvbmZvcm1zIHRvIEpBWFAgMS4yIHNwZWMuIjsKLQkJCXRocm93IG5ldyBXU0lFeGNlcHRpb24oZXJyTWVzc2FnZSwgZSk7Ci0JCSAgfQotCQkgIGZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BX1NPVVJDRSwgbmV3IElucHV0U291cmNlKHNjaGVtYSkpOwotCi0JCSAgLy8gUGFyc2UgdGhlIGRvY3VtZW50Ci0JCSAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkgIGJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJIYW5kbGVyKCkpOwotCQkgIGRvYyA9IGJ1aWxkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotCi0JCSAgLy8gd29ya2Fyb3VuZCBmb3IgY29tcGF0aWJpbGl0eSBYZXJjZXMgMi4yLjEgd2l0aCBYZXJjZXMgMi42LjIsCi0JCSAgLy8gWGVyY2VzIDIuNi4yIHN1cHBvcnRlZCBYTUwgMS4xIGJ1dCBXU0ktdG9vbCBhbmQgWGVyY2VzIDIuMi4xCi0JCSAgLy8gc3VwcG9ydGVkIG9ubHkgWE1MIDEuMAotCQkgIGlmIChkb2MgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsKQotCQkgIHsKLQkJCWlmICgoKG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwpIGRvYykuZ2V0WG1sVmVyc2lvbigpLmVxdWFscygiMS4xIikpCi0JCQl7Ci0JCSAJICB0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJGYXRhbCBFcnJvcjogWE1MIHZlcnNpb24gJnF1b3Q7MS4xJnF1b3Q7ICIKLQkJCQkJCQkrICJpcyBub3Qgc3VwcG9ydGVkLCBvbmx5IFhNTCAxLjAgaXMgc3VwcG9ydGVkLiIpOwotCQkJfQotCQkgIH0KLQkgICAgfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBXU0lFeGNlcHRpb24oIkNvdWxkIG5vdCBwYXJzZSBYTUwgZG9jdW1lbnQuIiwgZSk7Ci0JCX0KLQkgICAgZmluYWxseQotCSAgICB7IAotCSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cnJlbnRMb2FkZXIpOwotCSAgICB9ICAgIAotCQkvLyBSZXR1cm4gZG9jdW1lbnQKLSAgICAJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlYWRlciBhIFJlYWRlciBvYmplY3QuCi0JICogQHBhcmFtIHNjaGVtYSBhIFN0cmluZyBpZGVudGlmeWluZyByZWxhdGVkIHNjaGVtYSBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIGEgRG9jdW1lbnQgb2JqZWN0LgotCSAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBwYXJzaW5nIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBwYXJzZVhNTChJbnB1dFNvdXJjZSBzb3VyY2UsIFN0cmluZyBzY2hlbWEpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7ICAgCi0JCXRyeQotCQl7Ci0gICAgCSAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgCi0gCQkgIC8vIEdldCB0aGUgZG9jdW1lbnQgZmFjdG9yeQotCQkgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmpheHAuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGwoKTsKLQotCQkgIC8vIFNldCBuYW1lc3BhY2UgYXdhcmUsIGJ1dCBmb3Igbm93IGRvIG5vdCB2YWxpZGF0ZQotCQkgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCSAgZmFjdG9yeS5zZXRJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSh0cnVlKTsKLQotCQkgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCSAgdHJ5Ci0JCSAgewotCQkJZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfTEFOR1VBR0UsIFczQ19YTUxfU0NIRU1BKTsKLQkJICB9Ci0KLQkJICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0JCSAgewotCQkJU3RyaW5nIGVyck1lc3NhZ2UgPSAiRXJyb3I6IEpBWFAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBhdHRyaWJ1dGUgbm90IHJlY29nbml6ZWQ6ICIKLQkJCQkJKyBKQVhQX1NDSEVNQV9MQU5HVUFHRQotCQkJCQkrICJcbiIKLQkJCQkJKyAiQ2hlY2sgdG8gc2VlIGlmIHBhcnNlciBjb25mb3JtcyB0byBKQVhQIDEuMiBzcGVjLiI7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGVyck1lc3NhZ2UsIGUpOwotCQkgIH0KLQkJICBmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9TT1VSQ0UsIG5ldyBJbnB1dFNvdXJjZShzY2hlbWEpKTsKLQotICAgICAgICAgIC8vIFBhcnNlIHRoZSBkb2N1bWVudAotCQkgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJICBidWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgRXJySGFuZGxlcigpKTsKLQkJICBkb2MgPSBidWlsZGVyLnBhcnNlKHNvdXJjZSk7Ci0KLQkJICAvLyB3b3JrYXJvdW5kIGZvciBjb21wYXRpYmlsaXR5IFhlcmNlcyAyLjIuMSB3aXRoIFhlcmNlcyAyLjYuMiwKLQkJICAvLyBYZXJjZXMgMi42LjIgc3VwcG9ydGVkIFhNTCAxLjEgYnV0IFdTSS10b29sIGFuZCBYZXJjZXMgMi4yLjEKLQkJICAvLyBzdXBwb3J0ZWQgb25seSBYTUwgMS4wCi0JCSAgaWYgKGRvYyBpbnN0YW5jZW9mIG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGwpCi0JCSAgewotCQkJaWYgKCgob3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbCkgZG9jKS5nZXRYbWxWZXJzaW9uKCkuZXF1YWxzKAotCQkJCQkJIjEuMSIpKQotCQkJewotCQkJCXRocm93IG5ldyBXU0lFeGNlcHRpb24oIkZhdGFsIEVycm9yOiBYTUwgdmVyc2lvbiAmcXVvdDsxLjEmcXVvdDsgIgotCQkJCQkJKyAiaXMgbm90IHN1cHBvcnRlZCwgb25seSBYTUwgMS4wIGlzIHN1cHBvcnRlZC4iKTsKLQkJCX0KLQkJICB9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgWE1MIGRvY3VtZW50LiIsIGUpOwotCQl9Ci0JICAgIGZpbmFsbHkKLQkgICAgeyAKLQkgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50TG9hZGVyKTsKLQkgICAgfSAgICAKLQotCQkvLyBSZXR1cm4gZG9jdW1lbnQKLQkJcmV0dXJuIGRvYzsKLQotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBYTUwgZG9jdW1lbnQgYW5kIHJldHVybiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgYSBSZWFkZXIgb2JqZWN0LgotCSAqIEBwYXJhbSBzY2hlbWFTdHJpbmcgYSBTdHJpbmdSZWFkZXIgb2JqZWN0LgotCSAqIEByZXR1cm4gYSBEb2N1bWVudCBvYmplY3QuCi0JICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY3VtZW50IHBhcnNlWE1MKFJlYWRlciBmaWxlbmFtZSwgU3RyaW5nUmVhZGVyIHNjaGVtYVN0cmluZykKLQkJCXRocm93cyBXU0lFeGNlcHRpb24gewotCi0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCUNsYXNzTG9hZGVyIGN1cnJlbnRMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOyAgIAotCQl0cnkKLQkJewotICAgIAkgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKFhNTFV0aWxzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyAgIAotCi0JCSAgLy8gQ3JlYXRlIGlucHV0IHNvdXJjZQotCQkgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGZpbGVuYW1lKTsKLQotCQkgIC8vIEdldCB0aGUgZG9jdW1lbnQgZmFjdG9yeQotCQkgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmpheHAuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGwoKTsKLQotCQkgIC8vIFNldCBuYW1lc3BhY2UgYXdhcmUsIGJ1dCBmb3Igbm93IGRvIG5vdCB2YWxpZGF0ZQotCQkgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCSAgZmFjdG9yeS5zZXRJZ25vcmluZ0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSh0cnVlKTsKLQotCQkgIGZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCSAgdHJ5Ci0JCSAgewotCQkJZmFjdG9yeS5zZXRBdHRyaWJ1dGUoSkFYUF9TQ0hFTUFfTEFOR1VBR0UsIFczQ19YTUxfU0NIRU1BKTsKLQkJICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKLQkJICB7Ci0JCQlTdHJpbmcgZXJyTWVzc2FnZSA9ICJFcnJvcjogSkFYUCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGF0dHJpYnV0ZSBub3QgcmVjb2duaXplZDogIgotCQkJCQkrIEpBWFBfU0NIRU1BX0xBTkdVQUdFCi0JCQkJCSsgIlxuIgotCQkJCQkrICJDaGVjayB0byBzZWUgaWYgcGFyc2VyIGNvbmZvcm1zIHRvIEpBWFAgMS4yIHNwZWMuIjsKLQkJCXRocm93IG5ldyBXU0lFeGNlcHRpb24oZXJyTWVzc2FnZSwgZSk7Ci0JCSAgfQotCQkgIGZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BX1NPVVJDRSwgbmV3IElucHV0U291cmNlKHNjaGVtYVN0cmluZykpOwotCi0JCSAgLy8gUGFyc2UgdGhlIGRvY3VtZW50Ci0JCSAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkgIGJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBFcnJIYW5kbGVyKCkpOwotCQkgIGRvYyA9IGJ1aWxkZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbigiQ291bGQgbm90IHBhcnNlIFhNTCBkb2N1bWVudC4iLCBlKTsKLQkJfQotCSAgICBmaW5hbGx5Ci0JICAgIHsgCi0JICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY3VycmVudExvYWRlcik7Ci0JICAgIH0gICAgCi0KLQkJLy8gUmV0dXJuIGRvY3VtZW50Ci0JCXJldHVybiBkb2M7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gdGhlIGRvY3VtZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lIGEgUmVhZGVyIG9iamVjdAotCSAqIEBwYXJhbSBzY2hlbWFTdHJpbmdzIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIHNjaGVtYSBkb2N1bWVudHMuCi0JICogQHJldHVybiBhIERvY3VtZW50IG9iamVjdC4KLQkgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcGFyc2luZyB0aGUgWE1MIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgcGFyc2VYTUwoUmVhZGVyIGZpbGVuYW1lLCBDb2xsZWN0aW9uIHNjaGVtYVN0cmluZ3MpCi0JCQl0aHJvd3MgV1NJRXhjZXB0aW9uIHsKLQotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlDbGFzc0xvYWRlciBjdXJyZW50TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsgICAKLQkJdHJ5Ci0JCXsKLSAgICAJICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsgICAKLQotCQkgIC8vIENyZWF0ZSBpbnB1dCBzb3VyY2UKLQkJICBJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShmaWxlbmFtZSk7Ci0KLQkJICAvLyBHZXQgdGhlIGRvY3VtZW50IGZhY3RvcnkKLQkJICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwLkRvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsKCk7Ci0KLQkJICAvLyBTZXQgbmFtZXNwYWNlIGF3YXJlLCBidXQgZm9yIG5vdyBkbyBub3QgdmFsaWRhdGUKLQkJICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkgIGZhY3Rvcnkuc2V0SWdub3JpbmdFbGVtZW50Q29udGVudFdoaXRlc3BhY2UodHJ1ZSk7Ci0KLQkJICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkgIHRyeQotCQkgIHsKLQkJCWZhY3Rvcnkuc2V0QXR0cmlidXRlKEpBWFBfU0NIRU1BX0xBTkdVQUdFLCBXM0NfWE1MX1NDSEVNQSk7Ci0JCSAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0JCSAgewotCQkgICAgU3RyaW5nIGVyck1lc3NhZ2UgPSAiRXJyb3I6IEpBWFAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBhdHRyaWJ1dGUgbm90IHJlY29nbml6ZWQ6ICIKLQkJCQkJKyBKQVhQX1NDSEVNQV9MQU5HVUFHRQotCQkJCQkrICJcbiIKLQkJCQkJKyAiQ2hlY2sgdG8gc2VlIGlmIHBhcnNlciBjb25mb3JtcyB0byBKQVhQIDEuMiBzcGVjLiI7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKGVyck1lc3NhZ2UsIGUpOwotCQkgIH0KLQkJICAvLyBjb252ZXJ0IHNjaGVtYSBzdHJpbmdzIHRvIGFycmF5IG9mIElucHV0U291cmNlcwotCQkgIEl0ZXJhdG9yIGkgPSBzY2hlbWFTdHJpbmdzLml0ZXJhdG9yKCk7Ci0JCSAgVmVjdG9yIHJlYWRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCSAgd2hpbGUgKGkuaGFzTmV4dCgpKQotCQkgIHsKLQkJCVN0cmluZyBuZXh0U2NoZW1hID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlyZWFkZXJzLmFkZChuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihuZXh0U2NoZW1hKSkpOwotCQkgIH0KLQkJICBJbnB1dFNvdXJjZVtdIGlucHV0U291cmNlcyA9IChJbnB1dFNvdXJjZVtdKSByZWFkZXJzCi0JCQkJLnRvQXJyYXkobmV3IElucHV0U291cmNlW117fSk7Ci0JCSAgLy8gcGFzcyBhbiBhcnJheSBvZiBzY2hlbWEgc3RyaW5ncyAoZWFjaCBvZiB3aGljaCBjb250YWlucyBhIHNjaGVtYSkKLQkJICBmYWN0b3J5LnNldEF0dHJpYnV0ZShKQVhQX1NDSEVNQV9TT1VSQ0UsIGlucHV0U291cmNlcyk7Ci0KLQkJICAvLyBQYXJzZSB0aGUgZG9jdW1lbnQKLQkJICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCSAgYnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IEVyckhhbmRsZXIoKSk7Ci0JCSAgZG9jID0gYnVpbGRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQl0aHJvdyBuZXcgV1NJRXhjZXB0aW9uKCJDb3VsZCBub3QgcGFyc2UgWE1MIGRvY3VtZW50LiIsIGUpOwotCQl9Ci0JICAgIGZpbmFsbHkKLQkgICAgeyAKLQkgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjdXJyZW50TG9hZGVyKTsKLQkgICAgfSAgICAKLQotCQkvLyBSZXR1cm4gZG9jdW1lbnQKLQkJcmV0dXJuIGRvYzsKLQotCX0KLQotCS8qKgotCSAqIEdldCBhdHRyaWJ1dGUgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBkZWZpbmVkIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gRWxlbWVudCBvYmplY3QuCi0JICogQHBhcmFtIGF0dHJOYW1lIGEgbmFtZSBvZiBhbiBhdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJU3RyaW5nIGF0dHJWYWx1ZSA9IG51bGw7Ci0JCUF0dHIgYXR0ciA9IG51bGw7Ci0KLQkJLy8gR2V0IHRoZSBhdHRyaWJ1dGUgdXNpbmcgaXRzIG5hbWUKLQkJaWYgKChhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJOYW1lKSkgIT0gbnVsbCkKLQkJewotCQkJYXR0clZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpLnRyaW0oKTsKLQkJfQotCi0JCS8vIFJldHVybiBhdHRyaWJ1dGUgdmFsdWUKLQkJcmV0dXJuIGF0dHJWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYXR0cmlidXRlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIEVsZW1lbnQgb2JqZWN0LgotCSAqIEBwYXJhbSBhdHRyTmFtZSBhIG5hbWUgb2YgYW4gYXR0cmlidXRlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgotCSAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpZiBmb3VuZC4gT3RoZXJ3aXNlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdAotCSAqICAgICAgICAgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0ck5hbWUsCi0JCQlTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyByZXR1cm5WYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJU3RyaW5nIGF0dHJWYWx1ZSA9IG51bGw7Ci0KLQkJaWYgKChhdHRyVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBhdHRyTmFtZSkpICE9IG51bGwpCi0JCQlyZXR1cm5WYWx1ZSA9IGF0dHJWYWx1ZTsKLQotCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IG9iamVjdC4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIGEgbmFtZXNwYWNlLgotCSAqIEBwYXJhbSBhdHRyTmFtZSBhIG5hbWUgb2YgYW4gYXR0cmlidXRlCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlTlMoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlLAotCQkJU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCVN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotCQlBdHRyIGF0dHIgPSBudWxsOwotCi0JCS8vIEdldCB0aGUgYXR0cmlidXRlIHVzaW5nIGl0cyBuYW1lCi0JCWlmICgoYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZSwgYXR0ck5hbWUpKSAhPSBudWxsKQotCQl7Ci0JCQlhdHRyVmFsdWUgPSBhdHRyLmdldFZhbHVlKCkudHJpbSgpOwotCQl9Ci0KLQkJLy8gUmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZQotCQlyZXR1cm4gYXR0clZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZmlyc3QgY2hpbGQgZWxlbWVudCBmcm9tIHRoZSBpbnB1dCBlbG1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gRWxlbWVudCBvYmplY3QuCi0JICogQHJldHVybiB0aGUgZmlyc3RjaGlsZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRGaXJzdENoaWxkKEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBSZXR1cm4gdGhlIGZpcnN0IGNoaWxkIGVsZW1lbnQKLQkJcmV0dXJuIGZpbmROZXh0U2libGluZyhlbGVtZW50LmdldEZpcnN0Q2hpbGQoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtIGFuIEVsZW1lbnQgb2JqZWN0LgotCSAqIEByZXR1cm4gdGhlIG5leHQgc2libGluZyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXROZXh0U2libGluZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJLy8gUmV0dXJuIG5leHQgc2libGluZyBlbGVtZW50Ci0JCXJldHVybiBmaW5kTmV4dFNpYmxpbmcoZWxlbWVudC5nZXROZXh0U2libGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnROb2RlIFhNTCBzdGFydCBub2RlLgotCSAqIEByZXR1cm4gdGhlIG5leHQgc2libGluZyBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRWxlbWVudCBmaW5kTmV4dFNpYmxpbmcoTm9kZSBzdGFydE5vZGUpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLQotCQkvLyBGaW5kIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudAotCQlmb3IgKG5vZGUgPSBzdGFydE5vZGU7IG5vZGUgIT0gbnVsbCAmJiByZXR1cm5FbGVtZW50ID09IG51bGw7IG5vZGUgPSBub2RlCi0JCQkJLmdldE5leHRTaWJsaW5nKCkpCi0JCXsKLQkJCS8vIElmIHRoaXMgbm9kZSBpcyBhbiBlbGVtZW50IG5vZGUsIHRoZW4gcmV0dXJuIGl0Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJewotCQkJCXJldHVybkVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCX0KLQkJfQotCi0JCS8vIFJldHVybiBuZXh0IHNpYmxpbmcgZWxlbWVudAotCQlyZXR1cm4gKEVsZW1lbnQpIHJldHVybkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE5vZGUgWE1MIHN0YXJ0IG5vZGUuCi0JICogQHJldHVybiB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBmaW5kUHJldmlvdXNTaWJsaW5nKE5vZGUgc3RhcnROb2RlKSB7Ci0JCWlmIChzdGFydE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXdoaWxlIChzdGFydE5vZGUgIT0gbnVsbCkKLQkJewotCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHN0YXJ0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKHN0YXJ0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybiAoRWxlbWVudCkgc3RhcnROb2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB0ZXh0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IG9iamVjdC4KLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLQkJLy8gR2V0IGZpcnN0IGNoaWxkIGVsZW1lbnQKLQkJTm9kZSBub2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJLy8gTm9kZUxpc3Qgbm9kZUxpc3QgPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQotCQkvLyBpbnQgbGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0KLQkJLy8gUHJvY2VzcyB3aGlsZSB0aGVyZSBhcmUgbm9kZXMgYW5kIHRoZSB0ZXh0IGhhc24ndCBiZWVuIGZvdW5kCi0JCXdoaWxlICgobm9kZSAhPSBudWxsKSAmJiAodGV4dCA9PSBudWxsKSkKLQkJewotCQkJLy8gSWYgYSB0ZXh0IG5vZGUgb3IgY2RhdGEgc2VjdGlvbiBpcyBmb3VuZCwgdGhlbiBnZXQgdGV4dAotCQkJaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCXx8IChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpKQotCQkJewotCQkJCXRleHQgPSAoKENoYXJhY3RlckRhdGEpIG5vZGUpLmdldERhdGEoKTsKLQkJCX0KLQotCQkJLy8gR2V0IG5leHQgc2libGluZwotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JCWlmICh0ZXh0ICE9IG51bGwpCi0JCQl0ZXh0ID0gdGV4dC50cmltKCk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIFFOYW1lLgotCSAqIAotCSAqIEBwYXJhbSBxbmFtZSBhIFFOYW1lIG9iamVjdC4KLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IG9iamVjdC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSB0aGUgUU5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhRTmFtZSBxbmFtZSwgRWxlbWVudCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gZXF1YWxzID0gZmFsc2U7Ci0KLQkJLy8gSWYgYm90aCB0aGUgbmFtZXNwYWNlIFVSSSBhbmQgbG9jYWwgbmFtZSBhcmUgdGhlIHNhbWUsIHRoZW4gdGhleSBhcmUKLQkJLy8gZXF1YWwKLQkJaWYgKChxbmFtZS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSkpCi0JCQkJJiYgKHFuYW1lLmdldExvY2FsUGFydCgpLmVxdWFscyhlbGVtZW50LmdldExvY2FsTmFtZSgpKSkpCi0JCXsKLQkJCWVxdWFscyA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZXF1YWxzOwotCX0KLQotCS8qKgotCSAqIFhNTCBlbmNvZGUgYSB0ZXh0IHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCAtIGEgU3RyaW5nLgotCSAqIEByZXR1cm4gYW4gWE1MIGVuY29kZWQgdGV4dCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sRXNjYXBlZFN0cmluZyhTdHJpbmcgdGV4dCkgCi0JewotCSAgaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuIHRleHQ7Ci0JICBlbHNlCi0JICB7Ci0JICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dC5sZW5ndGgoKSoyKTsKLQkgICAgaW50IHNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotCSAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgY2hhciBjID0gdGV4dC5jaGFyQXQoaSk7Ci0JICAgICAgc3dpdGNoIChjKQotCQkgIHsKLSAgICAgICAgICAgICBjYXNlICc8JzogCi0gICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZsdDsiKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGNhc2UgJz4nOiAKLSAgICAgICAgICAgICAJc2IuYXBwZW5kKCImZ3Q7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAnJic6IAotICAgICAgICAgICAgIAlzYi5hcHBlbmQoIiZhbXA7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAnIic6IAotICAgICAgICAgICAgIAlzYi5hcHBlbmQoIiZxdW90OyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGNhc2UgJ1wnJzogCi0gICAgICAgICAgICAgCXNiLmFwcGVuZCgiJmFwb3M7Iik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgY2FzZSAnXHInOiAKLSAgICAgICAgICAgICAJc2IuYXBwZW5kKCImI3hkOyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgCXNiLmFwcGVuZChjKTsKLQkJICB9Ci0JCX0KLQkgICAgcmV0dXJuICBzYi50b1N0cmluZygpOwotCSAgfQotCX0KLQotCS8qKgotCSAqIFhNTCBlbmNvZGUgYSB0ZXh0IHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCAtIGEgU3RyaW5nLgotCSAqIEByZXR1cm4gYW4gWE1MIGVuY29kZWQgdGV4dCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sUmVtb3ZlRXNjYXBlZFN0cmluZyhTdHJpbmcgdGV4dCkgCi0JewotCSAgaWYgKHRleHQgPT0gbnVsbCkgcmV0dXJuIHRleHQ7Ci0JICBlbHNlCi0JICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIodGV4dCk7Ci0gICAgICAKLQkgICAgaW50IGkgPSBzYi5pbmRleE9mKCImI3hkOyIpOwotCSAgICB3aGlsZShpICE9IC0xKQotCSAgICB7Ci0JICAgICAgc2IucmVwbGFjZShpLCBpKzUsICJcciIpOwotCSAgICAgIGkgPSBzYi5pbmRleE9mKCImI3hkOyIpOwotCSAgICB9Ci0JICAgIAotCSAgICBpID0gc2IuaW5kZXhPZigiJmx0OyIpOwotCSAgICB3aGlsZShpICE9IC0xKQotCSAgICB7Ci0JICAgICAgc2IucmVwbGFjZShpLCBpKzQsICI8Iik7Ci0JICAgICAgaSA9IHNiLmluZGV4T2YoIiZsdDsiKTsKLQkgICAgfQotCi0JICAgIGkgPSBzYi5pbmRleE9mKCImZ3Q7Iik7Ci0JICAgIHdoaWxlKGkgIT0gLTEpCi0JICAgIHsKLQkgICAgICBzYi5yZXBsYWNlKGksIGkrNCwgIj4iKTsKLQkgICAgICBpID0gc2IuaW5kZXhPZigiJmd0OyIpOwotCSAgICB9Ci0KLQkgICAgaSA9IHNiLmluZGV4T2YoIiZxdW90OyIpOwotCSAgICB3aGlsZShpICE9IC0xKQotCSAgICB7Ci0JICAgICAgc2IucmVwbGFjZShpLCBpKzYsICJcIiIpOwotCSAgICAgIGkgPSBzYi5pbmRleE9mKCImcXVvdDsiKTsKLQkgICAgfQotCi0JICAgIGkgPSBzYi5pbmRleE9mKCImYXBvczsiKTsKLQkgICAgd2hpbGUoaSAhPSAtMSkKLQkgICAgewotCSAgICAgIHNiLnJlcGxhY2UoaSwgaSs2LCAiXCciKTsKLQkgICAgICBpID0gc2IuaW5kZXhPZigiJmFwb3M7Iik7Ci0JICAgIH0KLQotCSAgICBpID0gc2IuaW5kZXhPZigiJmFtcDsiKTsKLQkgICAgd2hpbGUoaSAhPSAtMSkKLQkgICAgewotCSAgICAgIHNiLnJlcGxhY2UoaSwgaSs1LCAiJiIpOwotCSAgICAgIGkgPSBzYi5pbmRleE9mKCImYW1wOyIpOwotCSAgICB9Ci0gCSAgICByZXR1cm4gIHNiLnRvU3RyaW5nKCk7Ci0JICB9Ci0JfQotCS8qKgotCSAqIEdldCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSBhIHBhcmVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCB0YWcgdG8gc2VyYWNoIGZvci4KLQkgKiBAcGFyYW0gcGFyZW50RWxlbWVudCB0aGUgcGFyZW50IGVsZW1lbnQuCi0JICogQHJldHVybiBhbiBlbGVtZW50IGdpdmVuIHRoZSBuYW1lIGFuZCB0aGUgcGFyZW50IGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50IHBhcmVudEVsZW1lbnQpIHsKLQkJRWxlbWVudCByZXR1cm5FbGVtZW50ID0gbnVsbDsKLQkJTm9kZUxpc3Qgbmw7Ci0KLQkJLy8gR2V0IHRoZSBsaXN0IG9mIGVsZW1lbnRzCi0JCWlmICgobmwgPSBwYXJlbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGVsZW1lbnROYW1lKSkgIT0gbnVsbCkKLQkJewotCQkJLy8gUmV0dXJuIGZpcnN0IGVsZW1lbnQgZm91bmQKLQkJCXJldHVybkVsZW1lbnQgPSAoRWxlbWVudCkgbmwuaXRlbSgwKTsKLQkJfQotCi0JCS8vIFJldHVybiBlbGVtZW50Ci0JCXJldHVybiByZXR1cm5FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiB0aGlzIGVsZW1lbnQgbWF0Y2hlcyBzcGVjaWZpZWQgbG9jYWwgbmFtZSBpbiB0aGUgc3BlY2lmaWVkCi0JICogbmFtZXNwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIEVsZW1lbnQgb2JqZWN0LgotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUkkgYSBuYW1lc3BhY2UuCi0JICogQHBhcmFtIGxvY2FsTmFtZSBhIGxvY2FsIG5hbWUuCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgZWxlbWVudCBtYXRjaGVzIHNwZWNpZmllZCBsb2NhbCBuYW1lIGluIHRoZSBzcGVjaWZpZWQKLQkgKiAgICAgICAgIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbGVtZW50KEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLQkJCVN0cmluZyBsb2NhbE5hbWUpIHsKLQkJYm9vbGVhbiBpc0VsZW1lbnQgPSBmYWxzZTsKLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQl7Ci0JCQkvLyBDaGVjayBpcwotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKG5hbWVzcGFjZVVSSSkKLQkJCQkJJiYgZWxlbWVudC5nZXRMb2NhbE5hbWUoKS5lcXVhbHMobG9jYWxOYW1lKSkKLQkJCXsKLQkJCQlpc0VsZW1lbnQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGlzRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBlbGVtZW50IG1hdGNoZXMgc3BlY2lmaWVkIGxvY2FsIG5hbWUgaW4gdGhlIHNwZWNpZmllZAotCSAqIG5hbWVzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBhbiBFbGVtZW50IG9iamVjdC4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJcyBhIGxpc3Qgb2YgdmFsaWQgbmFtZXNwYWNlcy4KLQkgKiBAcGFyYW0gbG9jYWxOYW1lIGEgbG9jYWwgbmFtZS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBlbGVtZW50IG1hdGNoZXMgc3BlY2lmaWVkIGxvY2FsIG5hbWUgaW4gdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBMaXN0IG5hbWVzcGFjZVVSSXMsCi0JCQlTdHJpbmcgbG9jYWxOYW1lKSB7Ci0JCWJvb2xlYW4gaXNFbGVtZW50ID0gZmFsc2U7Ci0KLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkJewotCQkJLy8gQ2hlY2sgaXMKLQkJCWlmIChuYW1lc3BhY2VVUklzLmNvbnRhaW5zKGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpCi0JCQkJCSYmIGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGxvY2FsTmFtZSkpCi0JCQl7Ci0JCQkJaXNFbGVtZW50ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpc0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGVsZW1lbnQgdGV4dCBhcyBhIGJvb2xlYW4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgYW4gRWxlbWVudCBvYmplY3QuCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBhIGJvb2xlYW4gdG8gYmUgdXNlZCBhcyBhIGRlZmF1bHQgdmFsdWUuCi0JICogQHJldHVybiBlbGVtZW50IHRleHQgYXMgYSBib29sZWFuIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlib29sZWFuIHJldHVyblZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQlTdHJpbmcgYm9vbGVhblZhbHVlID0gbnVsbDsKLQotCQkvLyBHZXQgdmFsdWUgYXMgYSBzdHJpbmcKLQkJaWYgKChib29sZWFuVmFsdWUgPSBYTUxVdGlscy5nZXRUZXh0KGVsZW1lbnQpKSAhPSBudWxsKQotCQl7Ci0JCQlyZXR1cm5WYWx1ZSA9IEJvb2xlYW4udmFsdWVPZihib29sZWFuVmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJLy8gUmV0dXJuIGJvb2xlYW4KLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldCBhdHRyaWJ1dGUgdmFsdWUgYXMgYSBib29sZWFuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IGFuIEVsZW1lbnQgb2JqZWN0LgotCSAqIEBwYXJhbSBhdHRyTmFtZSBhIG5hbWUgb2YgYW4gYXR0cmlidXRlLgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgYSBib29sZWFuIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0IHZhbHVlLgotCSAqIEByZXR1cm4gYXR0cmlidXRlIHZhbHVlIGFzIGEgYm9vbGVhbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJOYW1lLAotCQkJYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJYm9vbGVhbiByZXR1cm5WYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJU3RyaW5nIGJvb2xlYW5WYWx1ZSA9IG51bGw7Ci0KLQkJLy8gR2V0IHZhbHVlIGFzIGEgc3RyaW5nCi0JCWlmICgoYm9vbGVhblZhbHVlID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0ck5hbWUpKSAhPSBudWxsKQotCQl7Ci0JCQlyZXR1cm5WYWx1ZSA9IEJvb2xlYW4udmFsdWVPZihib29sZWFuVmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJLy8gUmV0dXJuIGJvb2xlYW4KLQkJcmV0dXJuIHJldHVyblZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBRTmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gcW5hbWVTdHJpbmcgYSBxdWFsaWZpZWQgbmFtZS4KLQkgKiBAcmV0dXJuIGEgUU5hbWUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUU5hbWUgY3JlYXRlUU5hbWUoU3RyaW5nIHFuYW1lU3RyaW5nKSB7Ci0JCVFOYW1lIHFuYW1lID0gbnVsbDsKLQotCQkvLyBMb2NhdGUgbG9jYWwgcGFydAotCQlpbnQgaW5kZXggPSBxbmFtZVN0cmluZy5sYXN0SW5kZXhPZigiOiIpOwotCi0JCS8vIENyZWF0ZSBuZXcgUU5hbWUKLQkJaWYgKGluZGV4ICE9IC0xKQotCQl7Ci0JCQlxbmFtZSA9IG5ldyBRTmFtZShxbmFtZVN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpLCBxbmFtZVN0cmluZwotCQkJCQkuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCQl9Ci0KLQkJZWxzZQotCQl7Ci0JCQlxbmFtZSA9IG5ldyBRTmFtZShxbmFtZVN0cmluZyk7Ci0JCX0KLQotCQlyZXR1cm4gcW5hbWU7Ci0JfQotCi0JLyoqCi0JICogRXJyb3IgSGFuZGxlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVyckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIKLQl7Ci0JCS8qKgotCQkgKiBXYXJuaW5nCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICJXYXJuaW5nOiAiICsgc3BlLmdldE1lc3NhZ2UoKTsKLQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQotCQkvKioKLQkJICogRXJyb3IKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvcjogIiArIHNwZS5nZXRNZXNzYWdlKCk7Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZhdGFsIEVycm9yCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIHNwZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICJGYXRhbCBFcnJvcjogIiArIHNwZS5nZXRNZXNzYWdlKCk7Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIHRoZSBzdHJpbmcgaXMgYSBOTVRPS0VOIGRhdGEgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dCBhIHN0cmluZyB2YWx1ZS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIE5NVE9LRU4gZGF0YSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05tdG9rZW4oU3RyaW5nIHRleHQpIHsKLQkJYm9vbGVhbiBubXRva2VuID0gdHJ1ZTsKLQotCQkvLyBBREQ6IE5lZWQgdG8gZmluZCBhIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBkb2VzIHRoaXMgb3Igd3JpdGUgaXQgZnJvbQotCQkvLyBzY3JhdGNoCi0KLQkJcmV0dXJuIG5tdG9rZW47Ci0JfQotCi0JLyoqCi0JICogVGhlIG1ldGhvZCBzZWFyY2hlcyB0aGUgZmlyc3QgZGlyZWN0IGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBnaXZlbgotCSAqIHFuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IERPTSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBRTmFtZSBvZiB0aGUgZWxlbWVudCB0byBiZSBzZWFyY2hlZC4KLQkgKiBAcmV0dXJuIERPTSBlbGVtZW50IGlmIHRoZSByZXF1aXJlZCBlbGVtZW50IGZvdW5kLCBhbmQgbnVsbCBvdGhlcndpc2UuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBFbGVtZW50IGZpbmRDaGlsZEVsZW1lbnQoRWxlbWVudCBwYXJlbnQsIFFOYW1lIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmVudCBlbGVtZW50IGNhbiBub3QgYmUgTlVMTCIpOwotCQlpZiAoZWxlbWVudE5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVsZW1lbnQgbmFtZSBjYW4gbm90IGJlIE5VTEwiKTsKLQkJaWYgKGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiTG9jYWwgcGFydCBvZiB0aGUgZWxlbWVudCBuYW1lIGNhbiBub3QgYmUgTlVMTCIpOwotCi0JCU5vZGUgbiA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCVN0cmluZyBsb2NhbCA9IGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpOwotCQlTdHJpbmcgbnMgPSBlbGVtZW50TmFtZS5nZXROYW1lc3BhY2VVUkkoKTsKLQkJd2hpbGUgKG4gIT0gbnVsbCkKLQkJewotCQkJaWYgKE5vZGUuRUxFTUVOVF9OT0RFID09IG4uZ2V0Tm9kZVR5cGUoKQotCQkJCQkmJiBsb2NhbC5lcXVhbHMobi5nZXRMb2NhbE5hbWUoKSkKLQkJCQkJJiYgTnVsbFV0aWwuZXF1YWxzKG5zLCBuLmdldE5hbWVzcGFjZVVSSSgpKSkKLQkJCQlyZXR1cm4gKEVsZW1lbnQpIG47Ci0JCQluID0gbi5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1ldGhvZCBzZWFyY2hlcyB0aGUgZmlyc3Qgc2libGluZyBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHFuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBhY3RpdmUgRE9NIGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnROYW1lIFFOYW1lIG9mIHRoZSBlbGVtZW50IHRvIGJlIHNlYXJjaGVkLgotCSAqIEByZXR1cm4gRE9NIGVsZW1lbnQgaWYgdGhlIHJlcXVpcmVkIGVsZW1lbnQgZm91bmQsIGFuZCBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEVsZW1lbnQgZmluZEVsZW1lbnQoRWxlbWVudCBhY3RpdmUsIFFOYW1lIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChhY3RpdmUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFjdGl2ZSBlbGVtZW50IGNhbiBub3QgYmUgTlVMTCIpOwotCQlpZiAoZWxlbWVudE5hbWUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVsZW1lbnQgbmFtZSBjYW4gbm90IGJlIE5VTEwiKTsKLQkJaWYgKGVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiTG9jYWwgcGFydCBvZiB0aGUgZWxlbWVudCBuYW1lIGNhbiBub3QgYmUgTlVMTCIpOwotCi0JCU5vZGUgbiA9IGFjdGl2ZS5nZXROZXh0U2libGluZygpOwotCQlTdHJpbmcgbG9jYWwgPSBlbGVtZW50TmFtZS5nZXRMb2NhbFBhcnQoKTsKLQkJU3RyaW5nIG5zID0gZWxlbWVudE5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCXdoaWxlIChuICE9IG51bGwpCi0JCXsKLQkJCWlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBuLmdldE5vZGVUeXBlKCkKLQkJCQkJJiYgbG9jYWwuZXF1YWxzKG4uZ2V0TG9jYWxOYW1lKCkpCi0JCQkJCSYmIE51bGxVdGlsLmVxdWFscyhucywgbi5nZXROYW1lc3BhY2VVUkkoKSkpCi0JCQkJcmV0dXJuIChFbGVtZW50KSBuOwotCQkJbiA9IG4uZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBtZXRob2QgcmV0dXJucyBhdHRyaWJ1dGUgbm9kZSBieSB0aGUgZ2l2ZW4gcW5hbWUuCi0JICogCi0JICogQHBhcmFtIGVsIG93bmVyIGVsZW1lbnQuCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgUU5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBub2RlIHRvIGJlIHNlYXJjaGVkLgotCSAqIEByZXR1cm4gYXR0cmlidXRlIG5vZGUgYnkgdGhlIGdpdmVuIHFuYW1lLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgQXR0ciBnZXRBdHRyaWJ1dGUoRWxlbWVudCBlbCwgUU5hbWUgYXR0cmlidXRlTmFtZSkgewotCQlpZiAoZWwgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVsZW1lbnQgY2FuIG5vdCBiZSBOVUxMIik7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBdHRyaWJ1dGUgbmFtZSBjYW4gbm90IGJlIE5VTEwiKTsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUuZ2V0TG9jYWxQYXJ0KCkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJMb2NhbCBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSBjYW4gbm90IGJlIE5VTEwiKTsKLQotCQlhdHRyaWJ1dGVOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotCQlhdHRyaWJ1dGVOYW1lLmdldExvY2FsUGFydCgpOwotCQlBdHRyIGEgPSBlbC5nZXRBdHRyaWJ1dGVOb2RlTlMoYXR0cmlidXRlTmFtZS5nZXROYW1lc3BhY2VVUkkoKSwKLQkJCQlhdHRyaWJ1dGVOYW1lLmdldExvY2FsUGFydCgpKTsKLQkJaWYgKGEgPT0gbnVsbCkKLQkJCS8vIHRyeSB0byBnZXQgd2l0aCBudWxsIG5hbWVzcGFjZQotCQkJYSA9IGVsLmdldEF0dHJpYnV0ZU5vZGVOUyhudWxsLCBhdHRyaWJ1dGVOYW1lLmdldExvY2FsUGFydCgpKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1ldGhvZCBjb21wYXJlcyBub2RlJ3MgbmFtZSB0byB0aGUgZ2l2ZW4gcW5hbWUuCi0JICogCi0JICogQHBhcmFtIG4gYSBub2RlLgotCSAqIEBwYXJhbSBuYW1lIGEgUU5hbWUgb2JqZWN0LgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSdzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIGdpdmVuIHFuYW1lLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTm9kZSBuLCBRTmFtZSBuYW1lKSB7Ci0JCWlmIChuID09IG51bGwgfHwgbmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKE51bGxVdGlsLmVxdWFscyhuYW1lLmdldExvY2FsUGFydCgpLCBuLmdldExvY2FsTmFtZSgpKSAmJiBOdWxsVXRpbAotCQkJCS5lcXVhbHMobmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgbi5nZXROYW1lc3BhY2VVUkkoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtZXRob2Qgc2VhcmNoZXMgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIGdpdmVuIHByZWZpeC4gVGhlIHNlYXJjaGluZwotCSAqIG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCBhY2NvcmRpbmcgdG8gdGhlICJYTUwgTmFtZXNwYWNlcyByZXNvbHV0aW9uIgotCSAqIGFsZ29yaXRobSAoJ2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtCi0JICogQ29yZS0yMDAzMDIyNi9uYW1lc3BhY2VzLWFsZ29yaXRobXMuaHRtbCcpLgotCSAqIAotCSAqIEBwYXJhbSBuIGEgbm9kZS4KLQkgKiBAcGFyYW0gcHJlZml4IGEgcHJlZml4LgotCSAqIEByZXR1cm4gdGhlIG5hbWVzcGFjZSBVUkkgZm9yIHRoZSBnaXZlbiBwcmVmaXguCi0JICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZmluZE5hbWVzcGFjZVVSSShOb2RlIG4sIFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKHByZWZpeCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJd2hpbGUgKG4gIT0gbnVsbCkKLQkJewotCQkJaWYgKHByZWZpeC5lcXVhbHMobi5nZXRQcmVmaXgoKSkpCi0JCQkJcmV0dXJuIG4uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0KLQkJCWlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBuLmdldE5vZGVUeXBlKCkpCi0JCQl7Ci0JCQkJTmFtZWROb2RlTWFwIG0gPSBuLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlpZiAobSAhPSBudWxsKQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG0uZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJewotCQkJCQkJTm9kZSBhID0gbS5pdGVtKGkpOwotCQkJCQkJaWYgKFdTSVRhZy5OU19VUklfWE1MTlMuZXF1YWxzKGEuZ2V0TmFtZXNwYWNlVVJJKCkpCi0JCQkJCQkJCSYmIHByZWZpeC5lcXVhbHMoYS5nZXRMb2NhbE5hbWUoKSkpCi0JCQkJCQkJcmV0dXJuIGEuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCX0KLQkJCX0KLQotCQkJbiA9IG4uZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2VyaWFsaXplcyBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBuIGEgRE9NIGVsZW1lbnQuCi0JICogQHJldHVybiB0aGUgc2VyaWFsaXplZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZShFbGVtZW50IG4pIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJdHJ5Ci0JCXsKLQkJCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlYTUxTZXJpYWxpemVyIHMgPSBuZXcgWE1MU2VyaWFsaXplcih3cml0ZXIsIG5ldyBPdXRwdXRGb3JtYXQoInhtbCIsCi0JCQkJCSJVVEYtOCIsIHRydWUpKTsKLQkJCXMuc2VyaWFsaXplKG4pOwotCQkJdmFsdWUgPSB3cml0ZXIudG9TdHJpbmcoKTsKLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkKLQkJewotCQkJLy8gbm90aGluZwotCQkJdmFsdWUgPSAiRVhDRVBUSU9OIDogIiArIHQuZ2V0TWVzc2FnZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFRoZSBtZXRob2QgcmV0dXJuIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCBhbiBvcmcudzNjLmRvbS5FbGVtZW50IG9iamVjdC4KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgY2hpbGQgZWxlbWVudHMuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBWZWN0b3IgZ2V0Q2hpbGRFbGVtZW50cyhFbGVtZW50IHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbGVtZW50IGNhbiBub3QgYmUgTlVMTCIpOwotCi0JCVZlY3RvciB2ZWN0ID0gbmV3IFZlY3RvcigpOwotCQlFbGVtZW50IGVsZW0gPSBnZXRGaXJzdENoaWxkKHBhcmVudCk7Ci0JCXdoaWxlIChlbGVtICE9IG51bGwpCi0JCXsKLQkJCXZlY3QuYWRkKGVsZW0pOwotCQkJZWxlbSA9IGdldE5leHRTaWJsaW5nKGVsZW0pOwotCQl9Ci0JCXJldHVybiB2ZWN0OwotCX0KLQotCS8qKgotCSAqIFNlcmlhbGl6ZXMgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRvYyBhbiBvcmcudzNjLmRvbS5Eb2N1bWVudCBvYmplY3QuCi0JICogQHBhcmFtIHdyaXRlciBhIGphdmEuaW8uV3JpdGVyIG9iamVjdC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gc2VyaWFsaXplIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplRG9jKERvY3VtZW50IGRvYywgV3JpdGVyIHdyaXRlcikKLQkJCXRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKLQkJWE1MU2VyaWFsaXplciBzID0gbmV3IFhNTFNlcmlhbGl6ZXIod3JpdGVyLCBuZXcgT3V0cHV0Rm9ybWF0KCJ4bWwiLAotCQkJCSJVVEYtOCIsIHRydWUpKTsKLQkJcy5zZXJpYWxpemUoZG9jKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXJlYWxpemVzIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW0gYW4gb3JnLnczYy5kb20uRWxlbWVudCBvYmplY3QuCi0JICogQHBhcmFtIHdyaXRlciBhIGphdmEuaW8uV3JpdGVyIG9iamVjdC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gc2VyaWFsaXplIHRoZSBET00gZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplRWxlbWVudChFbGVtZW50IGVsZW0sIFdyaXRlciB3cml0ZXIpCi0JCQl0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7Ci0JCVhNTFNlcmlhbGl6ZXIgcyA9IG5ldyBYTUxTZXJpYWxpemVyKHdyaXRlciwgbmV3IE91dHB1dEZvcm1hdCgieG1sIiwKLQkJCQkiVVRGLTgiLCB0cnVlKSk7Ci0JCXMuc2VyaWFsaXplKGVsZW0pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSBsaXN0IHdpdGhvdXQgbmFtZXNwYWNlLgotCSAqIAotCSAqIEBwYXJhbSB2ZWN0IGEgbGlzdCBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsRWxlbWVudHNXaXRob3V0TlMoVmVjdG9yIHZlY3QpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0LnNpemUoKTspCi0JCXsKLQkJCWlmICgoKEVsZW1lbnQpIHZlY3QuZ2V0KGkpKS5nZXROYW1lc3BhY2VVUkkoKSA9PSBudWxsCi0JCQkJCXx8ICgoRWxlbWVudCkgdmVjdC5nZXQoaSkpLmdldE5hbWVzcGFjZVVSSSgpLmVxdWFscygiIikpCi0JCQkJdmVjdC5yZW1vdmUoaSk7Ci0JCQllbHNlCi0JCQkJaSsrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIFVSTCB1c2luZyBiYXNlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsIGEgVVJMIHN0cmluZy4KLQkgKiBAcGFyYW0gYmFzZVVSSSBhIGJhc2UgdXJsIHN0cmluZyB0byBhc3Npc3QgaW4gY3JlYXRpbmcgYSBVUkwuCi0JICogQHJldHVybiBuZXdseSBjcmVhdGVkIFVSTC4KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhIG1hbGZvcm1lZCBVUkwgaGFzIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGNyZWF0ZVVSTChTdHJpbmcgdXJsLCBTdHJpbmcgYmFzZVVSSSkKLQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlVUkwgcmV0dXJuVVJMID0gbnVsbDsKLQkJVVJJIHVyaSA9IG51bGw7Ci0JCXRyeQotCQl7Ci0gICAgICAgICAgICByZXR1cm5VUkwgPSBuZXcgVVJMKHVybCk7Ci0JCQl1cmkgPSBuZXcgVVJJKHVybCk7Ci0JCQl1cmkgPSB1cmkubm9ybWFsaXplKCk7Ci0JCQlyZXR1cm5VUkwgPSAgbmV3IFVSTCh1cmkudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQljYXRjaCAoRXhjZXB0aW9uIG11ZSkKLQkJewotCQkJaW50IGkgPSBiYXNlVVJJLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpbnQgaiA9IGJhc2VVUkkubGFzdEluZGV4T2YoJ1xcJyk7Ci0JCQlpZiAoaiA+IGkpCi0JCQkJaSA9IGo7Ci0JCQl0cnkKLQkJCXsKLQkJCSAgdXJpID0gbmV3IFVSSShiYXNlVVJJLnN1YnN0cmluZygwLCBpICsgMSkgKyB1cmwpOwotCQkJICB1cmkgPSB1cmkubm9ybWFsaXplKCk7Ci0JCQkgIHJldHVyblVSTCA9IHVyaS50b1VSTCgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJICByZXR1cm4gbmV3IFVSTChiYXNlVVJJLnN1YnN0cmluZygwLCBpICsgMSkgKyB1cmwpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXR1cm5VUkw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIFVSTCB1c2luZyBiYXNlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsIGEgVVJMIHN0cmluZy4KLQkgKiBAcGFyYW0gYmFzZVVSSSBhIGJhc2UgdXJsIHN0cmluZyB0byBhc3Npc3QgaW4gY3JlYXRpbmcgYSBVUkwuCi0JICogQHJldHVybiBuZXdseSBjcmVhdGVkIFVSTCBzdHJpbmcuCi0JICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgYSBtYWxmb3JtZWQgVVJMIGhhcyBvY2N1cnJlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVUkxTdHJpbmcoU3RyaW5nIHVybCwgU3RyaW5nIGJhc2VVUkkpCi0JCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVVSTCh1cmwsIGJhc2VVUkkpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBvbmx5IGZvciB1bml0IHRlc3RpbmcuCi0JICogCi0JICogQHBhcmFtIGFyZ3MgYXJndW1lbnRzIGZvciBtYWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJdHJ5Ci0JCXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZW5hbWU6ICIgKyBhcmdzWzBdICsgIiwgc2NoZW1hOiAiICsgYXJnc1sxXSk7Ci0JCQlEb2N1bWVudCBkb2MgPSBwYXJzZVhNTERvY3VtZW50KGFyZ3NbMF0sIGFyZ3NbMV0pOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lLiIpOwotCQl9Ci0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZS50b1N0cmluZygpKTsKLQkJfQotCi0JCVN5c3RlbS5leGl0KDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvWE1MVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOWVhMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9YTUxWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICogV2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIG5vZGUgc291cmNlIGNvZGUsIHNvIHRoaXMgZG9lcwotICogb3VyIGRvdWJsZS1kaXNwYXRjaCB0aGUgaGFyZCB3YXkuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWaXNpdG9yCi17Ci0gIC8qKgotICAqIFZpc2l0IFhNTCBDREFUQVNlY3Rpb24gbm9kZS4KLSAgKiBAcGFyYW0gcyAgYW4gWE1MIENEQVRBU2VjdGlvbiBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChDREFUQVNlY3Rpb24gcykKLSAgewotICB9Ci0KLSAgLyoqCi0gICogVmlzaXQgWE1MIERvY3VtZW50IG5vZGUuCi0gICogQHBhcmFtIGUgIGFuIFhNTCBEb2N1bWVudCBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChEb2N1bWVudCBlKQotICB7Ci0gIH0KLQotICAvKioKLSAgKiBWaXNpdCBYTUwgRG9jdW1lbnRUeXBlIG5vZGUuCi0gICogQHBhcmFtIGUgIGFuIE1MIERvY3VtZW50VHlwZSBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChEb2N1bWVudFR5cGUgZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogVmlzaXQgWE1MIEF0dHJpYnV0ZSBub2RlLgotICAqIEBwYXJhbSBlICBhbiBYTUwgQXRycmlidXRlIG5vZGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEF0dHIgZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICogVmlzaXQgWE1MIEVsZW1lbnQgbm9kZS4KLSAgKiBAcGFyYW0gZSAgYW4gWE1MIEVsZW1lbnQgbm9kZS4KLSAgKi8KLSAgcHVibGljIHZvaWQgdmlzaXQoRWxlbWVudCBlKQotICB7Ci0gIH0KLQotICAvKioKLSAgKiBWaXNpdCBYTUwgQ29tbWVudCBub2RlLgotICAqIEBwYXJhbSBlICBhbiBYTUwgQ29tbWVudCBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChDb21tZW50IGUpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBWaXNpdCBYTUwgVGV4dCBub2RlLgotICAqIEBwYXJhbSBlICBhbiBYTUwgVGV4dCBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChUZXh0IGUpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBWaXNpdCBYTUwgRW50aXR5UmVmZXJlbmNlIG5vZGUuIAotICAqIEBwYXJhbSBlICBhbiBYTUwgRW50aXR5UmVmZXJlbmNlIG5vZGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KEVudGl0eVJlZmVyZW5jZSBlKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVmlzaXQgWE1MIEVudGl0eSBub2RlLiAKLSAgKiBAcGFyYW0gZSAgYW4gWE1MIEVudGl0eSBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChFbnRpdHkgZSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFZpc2l0IFhNTCBOb3RhdGlvbiBub2RlLiAKLSAgKiBAcGFyYW0gbiAgYW4gWE1MIE5vdGF0aW9uIG5vZGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KE5vdGF0aW9uIG4pCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBWaXNpdCBYTUwgUHJvY2Vzc2luZ0luc3RydWN0aW9uIG5vZGUuIAotICAqIEBwYXJhbSBpICBhbiBYTUwgUHJvY2Vzc2luZ0luc3RydWN0aW9uIG5vZGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIHZpc2l0KFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBpKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogVmlzaXQgWE1MIE5hbWVkTm9kZU1hcCBub2RlLiAKLSAgKiBAcGFyYW0gaSAgYW4gWE1MIE5hbWVkTm9kZU1hcCBub2RlLgotICAqLwotICBwdWJsaWMgdm9pZCB2aXNpdChOYW1lZE5vZGVNYXAgaSkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIFZpc2l0IFhNTCBub2RlLiAKLSAgKiBAcGFyYW0gbm9kZSAgYW4gWE1MIG5vZGUuCi0gICovCi0gIHB1YmxpYyB2b2lkIGRvVmlzaXQoT2JqZWN0IG5vZGUpCi0gIHsKLSAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgewotICAgICAgdmlzaXQoKEVsZW1lbnQpIG5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ29tbWVudCkKLSAgICB7Ci0gICAgICB2aXNpdCgoQ29tbWVudCkgbm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb24pCi0gICAgewotICAgICAgLy8gQ0RBVEFTZWN0aW9uIGV4dGVuZHMgVGV4dCwgc28gaXQgbXVzdCBjb21lIGZpcnN0Ci0gICAgICB2aXNpdCgoQ0RBVEFTZWN0aW9uKSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRleHQpCi0gICAgewotICAgICAgdmlzaXQoKFRleHQpIG5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQXR0cikKLSAgICB7Ci0gICAgICB2aXNpdCgoQXR0cikgbm9kZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudCkKLSAgICB7Ci0gICAgICB2aXNpdCgoRG9jdW1lbnQpIG5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5UmVmZXJlbmNlKQotICAgIHsKLSAgICAgIHZpc2l0KChFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5KQotICAgIHsKLSAgICAgIHZpc2l0KChFbnRpdHkpIG5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlKQotICAgIHsKLSAgICAgIHZpc2l0KChEb2N1bWVudFR5cGUpIG5vZGUpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTm90YXRpb24pCi0gICAgewotICAgICAgdmlzaXQoKE5vdGF0aW9uKSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFByb2Nlc3NpbmdJbnN0cnVjdGlvbikKLSAgICB7Ci0gICAgICB2aXNpdCgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkKLSAgICB7Ci0gICAgICB2aXNpdCgoTmFtZWROb2RlTWFwKSBub2RlKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gRU5EIE9GIEZJTEUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvZG9tL0RPTVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9kb20vRE9NUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGI2NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9kb20vRE9NUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuTmFtZXNwYWNlQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3BlY2lhbGl6ZXMgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5ET01QYXJzZXIuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBjbGFzcyBET01QYXJzZXIgZXh0ZW5kcyBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlcgotewotICAvKioKLSAgICogTG9jYXRvci4KLSAgICovCi0gIFhNTExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxEb2N1bWVudEhhbmRsZXIjc3RhcnREb2N1bWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvciwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgKLSAgICBYTUxMb2NhdG9yIGxvY2F0b3IsCi0gICAgU3RyaW5nIGVuY29kaW5nLAotICAgIE5hbWVzcGFjZUNvbnRleHQgY29udGV4dCwKLSAgICBBdWdtZW50YXRpb25zIGF1Z3MpCi0gICAgdGhyb3dzIFhOSUV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLSAgICBzdXBlci5zdGFydERvY3VtZW50KGxvY2F0b3IsIGVuY29kaW5nLCBjb250ZXh0LCBhdWdzKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MRG9jdW1lbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWUsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuQXVnbWVudGF0aW9ucykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudCgKLSAgICBRTmFtZSBxbmFtZSwKLSAgICBYTUxBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsCi0gICAgQXVnbWVudGF0aW9ucyBhdWdzKQotICAgIHRocm93cyBYTklFeGNlcHRpb24KLSAgewotICAgIEVsZW1lbnQgZWxlbWVudDsKLSAgICBFbGVtZW50SW1wbCBlbGVtZW50SW1wbDsKLQotICAgIC8vIERFQlVHOgotICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCIxLWxpbmU6ICIgKyBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSArICIsIGNvbHVtbjogIiArIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0gICAgc3VwZXIuc3RhcnRFbGVtZW50KHFuYW1lLCBhdHRyaWJ1dGVzLCBhdWdzKTsKLQotICAgIC8vIERFQlVHOgotICAgIC8vU3lzdGVtLmVyci5wcmludGxuKCIyLWxpbmU6ICIgKyBsb2NhdG9yLmdldExpbmVOdW1iZXIoKSArICIsIGNvbHVtbjogIiArIGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOyAgICAKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGVsZW1lbnQgPSAoRWxlbWVudCkgZ2V0UHJvcGVydHkoQ1VSUkVOVF9FTEVNRU5UX05PREUpOwotCi0gICAgICBlbGVtZW50SW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotICAgICAgZWxlbWVudEltcGwuc2V0VXNlckRhdGEoCi0gICAgICAgIEVsZW1lbnRMb2NhdGlvbi5LRVlfTkFNRSwKLSAgICAgICAgKEVsZW1lbnRMb2NhdGlvbiluZXcgRWxlbWVudExvY2F0aW9uKGxvY2F0b3IuZ2V0TGluZU51bWJlcigpLCBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpKSwKLSAgICAgICAgbnVsbCk7Ci0gICAgfQotICAgIGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKQotICAgIHsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBzbnNlKQotICAgIHsKLSAgICAgIC8vIERFQlVHOgotICAgICAgLy9TeXN0ZW0uZXJyLnByaW50bG4oc25zZS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24gc25yZSkKLSAgICB7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL2RvbS9FbGVtZW50TG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvZG9tL0VsZW1lbnRMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTkwNTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvZG9tL0VsZW1lbnRMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb207Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIGEgbm9kZSB3aXRoaW4gYW4gWE1MIGRvY3VtZW50LgotICogIAotICogQHZlcnNpb24gMS4wLjEKLSAqIEBhdXRob3IgUGV0ZXIgQnJpdHRlbmhhbSAgKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRMb2NhdGlvbgotewotICAvKioKLSAgICogTGluZSBudW1iZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9IEVsZW1lbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgLyoqCi0gICAqIExpbmUgbnVtYmVyLgotICAgKi8KLSAgcHJvdGVjdGVkIGludCBsaW5lTnVtYmVyID0gMDsKLQotICAvKioKLSAgICogQ29sdW1uIG51bWJlci4KLSAgICovCi0gIHByb3RlY3RlZCBpbnQgY29sdW1uTnVtYmVyID0gMDsKLQotICAvKioKLSAgICogRWxlbWVudCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgICAgYSBsaW5lIG51bWJlci4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciAgYSBjb2x1bW4gbnVtYmVyLgotICAgKi8KLSAgcHVibGljIEVsZW1lbnRMb2NhdGlvbihpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgewotICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgdGhpcy5jb2x1bW5OdW1iZXIgPSBjb2x1bW5OdW1iZXI7Ci0gIH0KLQotICAvKioKLSAgICogRWxlbWVudCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIGxvY2F0b3IgIGEgTG9jYXRvciBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgRWxlbWVudExvY2F0aW9uKExvY2F0b3IgbG9jYXRvcikKLSAgewotICAgIHRoaXMubGluZU51bWJlciA9IGxvY2F0b3IuZ2V0TGluZU51bWJlcigpOwotICAgIHRoaXMuY29sdW1uTnVtYmVyID0gbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpbmUgbnVtYmVyLgotICAgKiBAcmV0dXJuIGFuIGludCByZXByZXNlbnRpbmcgdGhlIGxpbmUgbnVtYmVyIHZhbHVlLgotICAgKi8KLSAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgewotICAgIHJldHVybiB0aGlzLmxpbmVOdW1iZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb2x1bW4gbnVtYmVyLgotICAgKiBAcmV0dXJuIGFuIGludCByZXByZXNlbnRpbmcgdGhlIGNvbHVtbiBudW1iZXIgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgaW50IGdldENvbHVtbk51bWJlcigpCi0gIHsKLSAgICByZXR1cm4gdGhpcy5jb2x1bW5OdW1iZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJFbGVtZW50IExvY2F0aW9uOlxuIgotICAgICAgKyAiICAiCi0gICAgICArIFdTSUNvbnN0YW50cy5BVFRSX0xJTkVfTlVNQkVSCi0gICAgICArICI9IgotICAgICAgKyB0aGlzLmxpbmVOdW1iZXIKLSAgICAgICsgIlxuIjsKLSAgICAvLysgIiAgIiArIFdTSUNvbnN0YW50cy5BVFRSX0NPTFVNTl9OVU1CRVIgKyAiPSIgKyB0aGlzLmNvbHVtbk51bWJlciArICJcbiI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvamF4cC9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9qYXhwL0RvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNTE5NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9qYXhwL0RvY3VtZW50QnVpbGRlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmpheHA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgYSBmYWN0b3J5IEFQSSB0aGF0IGVuYWJsZXMgdXMgdG8gb2J0YWluIGEgcGFyc2VyCi0gKiB0aGF0IHByb2R1Y2VzIERPTSBvYmplY3QgdHJlZXMgZnJvbSBYTUwgZG9jdW1lbnRzLiBOb3RlIHRoaXMgY2xhc3MgCi0gKiBzcGVjaWFsaXplcyBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5LgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUltcGwgZXh0ZW5kcyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci17Ci0KLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBhdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGEgRG9jdW1lbnRCdWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50bHkgCi0gICAqIGNvbmZpZ3VyZWQgcGFyYW1ldGVycy4KLSAgICogCi0gICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgYSBEb2N1bWVudEJ1aWxkZXIuIAotICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgYSBEb2N1bWVudEJ1aWxkZXIgY2Fubm90Ci0gICAqICAgICAgICAgYmUgY3JlYXRlZCB3aGljaCBzYXRpc2ZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkLgotICAgKi8KLSAgcHVibGljIERvY3VtZW50QnVpbGRlciBuZXdEb2N1bWVudEJ1aWxkZXIoKQotICAgIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gbnVsbDsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGRvY3VtZW50QnVpbGRlciA9IG5ldyBEb2N1bWVudEJ1aWxkZXJJbXBsKHRoaXMsIGF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRvY3VtZW50QnVpbGRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBBbGxvd3MgdGhlIHVzZXIgdG8gcmV0cmlldmUgc3BlY2lmaWMgYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyAKLSAgICogaW1wbGVtZW50YXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4gCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGYgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gCi0gICAqICAgICAgICAgZG9lc24ndCByZWNvZ25pemUgdGhlIGF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gYXR0cmlidXRlcy5nZXQobmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQWxsb3dzIHRoZSB1c2VyIHRvIHNldCBzcGVjaWZpYyBhdHRyaWJ1dGVzIG9uIHRoZSB1bmRlcmx5aW5nIAotICAgKiBpbXBsZW1lbnRhdGlvbi4gCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZSAgIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAqIEBwYXJhbSB2YWx1ZSAgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIAotICAgKiAgICAgICAgIGRvZXNuJ3QgcmVjb2duaXplIHRoZSBhdHRyaWJ1dGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkKLSAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gIHsKLSAgICBhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvamF4cC9Eb2N1bWVudEJ1aWxkZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL2pheHAvRG9jdW1lbnRCdWlsZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODU4ZGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvamF4cC9Eb2N1bWVudEJ1aWxkZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5qYXhwOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRE9NSW1wbGVtZW50YXRpb25JbXBsOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmRvbS5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5ET01QYXJzZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFVzaW5nIHRoaXMgY2xhc3MsIHdlIGNhbiBvYnRhaW4gYSBEb2N1bWVudCBmcm9tIFhNTC4gVGhpcyBjbGFzcyBpcyBhIAotICogc3BlY2lhbGl6YXRpb24gb2YgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyLgotICogCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSAKLSAqIERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyIG1ldGhvZC4gT25jZSBhbiBpbnN0YW5jZSAKLSAqIG9mIHRoaXMgY2xhc3MgaXMgb2J0YWluZWQsIFhNTCBjYW4gYmUgcGFyc2VkIGZyb20gYSB2YXJpZXR5IG9mIGlucHV0IAotICogc291cmNlcy4gVGhlc2UgaW5wdXQgc291cmNlcyBhcmUgSW5wdXRTdHJlYW1zLCBGaWxlcywgVVJMcywgYW5kIFNBWCAKLSAqIElucHV0U291cmNlcy4KLQotVGhpcyBjbGFzcyB3aWxsIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkuLi4KLSAqIAotICogQGF1dGhvciBQZXRlciAgQnJpdHRlbmhhbSAocGV0ZXJickB1cy5pYm0uY29tKQotICogQHZlcnNpb24gMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50QnVpbGRlckltcGwgZXh0ZW5kcyBEb2N1bWVudEJ1aWxkZXIKLXsKLSAgcHJvdGVjdGVkIERPTVBhcnNlciBkb21QYXJzZXIgPSBudWxsOwotCi0gIHByb3RlY3RlZCBFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlciA9IG51bGw7Ci0gIHByb3RlY3RlZCBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERlZmF1bHRIYW5kbGVyKCk7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFU19GRUFUVVJFID0KLSAgICBDb25zdGFudHMuU0FYX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLk5BTUVTUEFDRVNfRkVBVFVSRTsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9GRUFUVVJFID0KLSAgICBDb25zdGFudHMuU0FYX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLlZBTElEQVRJT05fRkVBVFVSRTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIERvY3VtZW50QnVpbGRlckltcGwyLgotICAgKgotICAgKiBAcGFyYW0gZGJGYWN0b3J5ICBhIERvY3VtZW50QnVpbGRlckZhY3Rvcnkgb2JqZWN0LgotICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBpZiBhbnkgcGFyc2UgZXJyb3JzIG9jY3VyLiAKLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEJ1aWxkZXJJbXBsKERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJGYWN0b3J5LCBIYXNodGFibGUgYXR0cmlidXRlcykKLSAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBDcmVhdGUgcGFyc2VyCi0gICAgZG9tUGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwotCi0gICAgLy8gU2V0IG5hbWVzcGFjZSBhd2FyZQotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKE5BTUVTUEFDRVNfRkVBVFVSRSwgZGJGYWN0b3J5LmlzTmFtZXNwYWNlQXdhcmUoKSk7Ci0KLSAgICAvLyBTZXQgdmFsaWRhdGluZwotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKFZBTElEQVRJT05fRkVBVFVSRSwgZGJGYWN0b3J5LmlzVmFsaWRhdGluZygpKTsKLSAgICBpZiAoZGJGYWN0b3J5LmlzVmFsaWRhdGluZygpKSBkb21QYXJzZXIuc2V0RmVhdHVyZShYTUxVdGlscy5GRUFUVVJFX1ZBTElEQVRJT05fU0NIRU1BLCB0cnVlKTsKLQotICAgIC8vIERvIG5vdCBkZWZlciBub2RlIGV4cGFuc2lvbgotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKAotICAgICAgQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5ERUZFUl9OT0RFX0VYUEFOU0lPTl9GRUFUVVJFLAotICAgICAgZmFsc2UpOwotCi0gICAgLy8gU2V0IG90aGVyIGZlYXR1cmVzIGZyb20gdGhlIGRvY3VtZW50IGZhY3RvcnkgYnVpbGRlcgotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKAotICAgICAgQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5JTkNMVURFX0lHTk9SQUJMRV9XSElURVNQQUNFLAotICAgICAgIWRiRmFjdG9yeS5pc0lnbm9yaW5nRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkpOwotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKAotICAgICAgQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWAotICAgICAgICArIENvbnN0YW50cy5DUkVBVEVfRU5USVRZX1JFRl9OT0RFU19GRUFUVVJFLAotICAgICAgIWRiRmFjdG9yeS5pc0V4cGFuZEVudGl0eVJlZmVyZW5jZXMoKSk7Ci0gICAgZG9tUGFyc2VyLnNldEZlYXR1cmUoCi0gICAgICBDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLklOQ0xVREVfQ09NTUVOVFNfRkVBVFVSRSwKLSAgICAgICFkYkZhY3RvcnkuaXNJZ25vcmluZ0NvbW1lbnRzKCkpOwotICAgIGRvbVBhcnNlci5zZXRGZWF0dXJlKAotICAgICAgQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5DUkVBVEVfQ0RBVEFfTk9ERVNfRkVBVFVSRSwKLSAgICAgICFkYkZhY3RvcnkuaXNDb2FsZXNjaW5nKCkpOwotICAgCi0gICAgLy8gc2V0IGZlYXR1cmVzIGFuZCBwcm9wZXJ0aWVzIHNwZWNpZmllZCBhdCBmYWN0b3J5IGxldmVsCi0gICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEVudW1lcmF0aW9uIGk9YXR0cmlidXRlcy5rZXlzKCk7IGkuaGFzTW9yZUVsZW1lbnRzKCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gKFN0cmluZylpLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUuZXF1YWxzKFhNTFV0aWxzLkpBWFBfU0NIRU1BX1NPVVJDRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBmb3IgbXVsdGlwbGUgc2NoZW1hIHZhbGlkYXRpb24gbWF5IGJlIGFycmF5IG9mIElucHV0U291cmNlIAotICAgICAgICAgIGlmKGF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZSkgaW5zdGFuY2VvZiBJbnB1dFNvdXJjZVtdKQotICAgICAgICAgICAgZG9tUGFyc2VyLnNldFByb3BlcnR5KGF0dHJpYnV0ZSwgKElucHV0U291cmNlW10pYXR0cmlidXRlcy5nZXQoYXR0cmlidXRlKSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZG9tUGFyc2VyLnNldFByb3BlcnR5KGF0dHJpYnV0ZSwgKElucHV0U291cmNlKWF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRvbVBhcnNlci5zZXRQcm9wZXJ0eShhdHRyaWJ1dGUsIGF0dHJpYnV0ZXMuZ2V0KGF0dHJpYnV0ZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBpbnB1dCBzb3VyY2UgYXMgYW4gWE1MIGRvY3VtZW50IGFuZCByZXR1cm4gYSBuZXcgRE9NLgotICAgKiBAcGFyYW0gaXMgIElucHV0U3RyZWFtIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgdG8gYmUgcGFyc2VkLiAKLSAgICogQHRocm93cyBTQVhFeGNlcHRpb24gaWYgYW55IHBhcnNlIGVycm9ycyBvY2N1ci4gCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW55IElPIGVycm9ycyBvY2N1ci4gCi0gICAqLwotICBwdWJsaWMgRG9jdW1lbnQgcGFyc2UoSW5wdXRTb3VyY2UgaXMpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLQlDbGFzc0xvYWRlciBjdXJyZW50TG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsgICAKLQl0cnkKLQl7Ci0JICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihYTUxVdGlscy5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsgICAKLSAJCi0gICAgICAvLyBTZXQgZW50aXR5IHJlc29sdmVyCi0gICAgICBpZiAodGhpcy5lbnRpdHlSZXNvbHZlciAhPSBudWxsKQotICAgICAgICBkb21QYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIodGhpcy5lbnRpdHlSZXNvbHZlcik7Ci0KLSAgICAgIC8vIFNldCBlcnJvciBoYW5kbGVyICAgIAotICAgICAgaWYgKHRoaXMuZXJyb3JIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIGRvbVBhcnNlci5zZXRFcnJvckhhbmRsZXIodGhpcy5lcnJvckhhbmRsZXIpOwotCi0gICAgICAvLyBQYXJzZSBpbnB1dCBzb3VyY2UKLSAgICAgIGRvbVBhcnNlci5wYXJzZShpcyk7Ci0KLSAgICAgIC8vIFJldHVybiB0aGUgZG9jdW1lbnQgdGhhdCB3YXMgY3JlYXRlZAotICAgICAgcmV0dXJuIGRvbVBhcnNlci5nZXREb2N1bWVudCgpOwotCX0KLSAgICBmaW5hbGx5Ci0gICAgeyAKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cnJlbnRMb2FkZXIpOwotICAgIH0gICAgCi0gIH0KLQotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoaXMgcGFyc2VyIGlzIGNvbmZpZ3VyZWQgdG8gdW5kZXJzdGFuZCBuYW1lc3BhY2VzLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwYXJzZXIgaXMgY29uZmlndXJlZCB0byB1bmRlcnN0YW5kIG5hbWVzcGFjZXM7IGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUoKQotICB7Ci0gICAgYm9vbGVhbiBuYW1lc3BhY2VBd2FyZSA9IGZhbHNlOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgbmFtZXNwYWNlQXdhcmUgPSBkb21QYXJzZXIuZ2V0RmVhdHVyZShOQU1FU1BBQ0VTX0ZFQVRVUkUpOwotICAgIH0KLQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc2UudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5hbWVzcGFjZUF3YXJlOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHBhcnNlciBpcyBjb25maWd1cmVkIHRvIHZhbGlkYXRlIFhNTCBkb2N1bWVudHMuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhcnNlciBpcyBjb25maWd1cmVkIHRvIHZhbGlkYXRlIFhNTCBkb2N1bWVudHM7IGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpCi0gIHsKLSAgICBib29sZWFuIHZhbGlkYXRpbmcgPSBmYWxzZTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIHZhbGlkYXRpbmcgPSBkb21QYXJzZXIuZ2V0RmVhdHVyZShWQUxJREFUSU9OX0ZFQVRVUkUpOwotICAgIH0KLQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gc2UpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc2UudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbGlkYXRpbmc7Ci0gIH0KLQotICAvKioKLSAgICogU3BlY2lmeSB0aGUgRW50aXR5UmVzb2x2ZXIgdG8gYmUgdXNlZCB0byByZXNvbHZlIGVudGl0aWVzIHByZXNlbnQgCi0gICAqIGluIHRoZSBYTUwgZG9jdW1lbnQgdG8gYmUgcGFyc2VkLiBTZXR0aW5nIHRoaXMgdG8gbnVsbCB3aWxsIHJlc3VsdCAKLSAgICogaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gdXNpbmcgaXQncyBvd24gZGVmYXVsdCAKLSAgICogaW1wbGVtZW50YXRpb24gYW5kIGJlaGF2aW9yLgotICAgKiAKLSAgICogQHBhcmFtIGVyICB0aGUgRW50aXR5UmVzb2x2ZXIgdG8gYmUgdXNlZCB0byByZXNvbHZlIGVudGl0aWVzIAotICAgKiAgICAgICAgICAgIHByZXNlbnQgaW4gdGhlIFhNTCBkb2N1bWVudCB0byBiZSBwYXJzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlSZXNvbHZlcihFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikKLSAgewotICAgIHRoaXMuZW50aXR5UmVzb2x2ZXIgPSBlbnRpdHlSZXNvbHZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHRoZSBFcnJvckhhbmRsZXIgdG8gYmUgdXNlZCB0byByZXBvcnQgZXJyb3JzIHByZXNlbnQgaW4gCi0gICAqIHRoZSBYTUwgZG9jdW1lbnQgdG8gYmUgcGFyc2VkLiBTZXR0aW5nIHRoaXMgdG8gbnVsbCB3aWxsIHJlc3VsdCAKLSAgICogaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gdXNpbmcgaXQncyBvd24gZGVmYXVsdCAKLSAgICogaW1wbGVtZW50YXRpb24gYW5kIGJlaGF2aW9yLiAKLSAgICogCi0gICAqIHBhcmFtIGVoICB0aGUgRXJyb3JIYW5kbGVyIHRvIGJlIHVzZWQgdG8gcmVwb3J0IGVycm9ycyBwcmVzZW50IGluIAotICAgKiAgICAgICAgICAgdGhlIFhNTCBkb2N1bWVudCB0byBiZSBwYXJzZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcikKLSAgewotICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyb3JIYW5kbGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIE9idGFpbiBhIG5ldyBpbnN0YW5jZSBvZiBhIERPTSBEb2N1bWVudCBvYmplY3QgdG8gYnVpbGQgYSBET00gCi0gICAqIHRyZWUgd2l0aC4gQW4gYWx0ZXJuYXRpdmUgd2F5IHRvIGNyZWF0ZSBhIERPTSBEb2N1bWVudCBvYmplY3QgCi0gICAqIGlzIHRvIHVzZSB0aGUgZ2V0RE9NSW1wbGVtZW50YXRpb24gbWV0aG9kIHRvIGdldCBhIERPTSBMZXZlbCAyIAotICAgKiBET01JbXBsZW1lbnRhdGlvbiBvYmplY3QgYW5kIHRoZW4gdXNlIERPTSBMZXZlbCAyIG1ldGhvZHMgb24gCi0gICAqIHRoYXQgb2JqZWN0IHRvIGNyZWF0ZSBhIERPTSBEb2N1bWVudCBvYmplY3QuCi0gICAqIAotICAgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIGEgRE9NIERvY3VtZW50IG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudCBuZXdEb2N1bWVudCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IERvY3VtZW50SW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIE9idGFpbiBhbiBpbnN0YW5jZSBvZiBhIERPTUltcGxlbWVudGF0aW9uIG9iamVjdC4gCi0gICAqIEByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgYSBET01JbXBsZW1lbnRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBET01JbXBsZW1lbnRhdGlvbiBnZXRET01JbXBsZW1lbnRhdGlvbigpCi0gIHsKLSAgICByZXR1cm4gbmV3IERPTUltcGxlbWVudGF0aW9uSW1wbCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvc2NoZW1hL1RhcmdldE5hbWVzcGFjZVByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9zY2hlbWEvVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NzlhYTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9zY2hlbWEvVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvY2Vzc2VzIHRhcmdldCBuYW1lc3BhY2VzLiBOb3RlIHRoaXMgY2xhc3MgaXMgYSBzcGVjaWFsaXphdGlvbgotICogb2Ygb3JnLndzaS54bWwuc2NoZW1hLlhNTFNjaGVtYVByb2Nlc3Nvci4KLSAqIAotICogQGF1dGhvciBQZXRlciBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlUHJvY2Vzc29yIGV4dGVuZHMgWE1MU2NoZW1hUHJvY2Vzc29yCi17Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBUYXJnZXROYW1lc3BhY2VQcm9jZXNzLgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogICAgICAgICAgICBkb2N1bWVudCBjb250ZXh0Ci0gICAqIEBwYXJhbSBkb2N1bWVudExpc3QKLSAgICogICAgICAgICAgICBjYWNoZSBvZiBwcmV2aW91c2x5IHBhcnNlZCBkb2N1bWVudHMKLSAgICovCi0gIHB1YmxpYyBUYXJnZXROYW1lc3BhY2VQcm9jZXNzb3IoCi0gICAgU3RyaW5nIGNvbnRleHQsCi0gICAgWE1MRG9jdW1lbnRDYWNoZSBkb2N1bWVudExpc3QpCi0gIHsKLSAgICBzdXBlcihjb250ZXh0LCBkb2N1bWVudExpc3QsIGZhbHNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTY2hlbWEoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgU3RyaW5nIHRucyA9IG51bGw7Ci0gICAgQXR0ciBhdHRyID0gWE1MVXRpbHMuZ2V0QXR0cmlidXRlKGVsZW1lbnQsIEFUVFJfWFNEX1RBUkdFVE5BTUVTUEFDRSk7Ci0KLSAgICAvLyBJZiB0aGUgYXR0cmlidXRlIHdhcyBmb3VuZCBhbmQgdmFsdWUgaXMgbm90IG51bGwsIHRoZW4gYWRkIGl0IHRvIHRoZSBsaXN0Ci0gICAgaWYgKChhdHRyICE9IG51bGwpICYmICgodG5zID0gYXR0ci5nZXRWYWx1ZSgpKSAhPSBudWxsKSkKLSAgICB7Ci0gICAgICAvLyBBZGQgdGhlIHRhcmdldE5hbWVzcGFjZSB0byB0aGUgcmV0dXJuIGxpc3QKLSAgICAgIHJldHVybkxpc3QuYWRkKHRucyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlYXJjaCBmb3IgYWxsIHNjaGVtYSBlbGVtZW50cywgbG9hZCB0aGUgeHNkIGRvY3VtZW50cywgYW5kIHRoZW4gcHJvY2VzcwotICAgKiB0aGVtLgotICAgKiAKLSAgICogQHBhcmFtIG5vZGUKLSAgICogICAgICAgICAgICBub2RlLgotICAgKiBAcmV0dXJuIGEgbGlzdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24KLSAgICogICAgICAgICAgICAgaWYgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBub3QgZm91bmQgb3IgaWYgaXQgaXMgbm90IGZvcm1hdHRlZAotICAgKiAgICAgICAgICAgICBjb3JyZWN0bHkuCi0gICAqLwotICBwdWJsaWMgTGlzdCBwcm9jZXNzQWxsU2NoZW1hKE5vZGUgbm9kZSkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIHByb2Nlc3NBbGxTY2hlbWEobm9kZSwgY29udGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogU2VhcmNoIGZvciBhbGwgc2NoZW1hIGVsZW1lbnRzLCBsb2FkIHRoZSB4c2QgZG9jdW1lbnRzLCBhbmQgdGhlbiBwcm9jZXNzCi0gICAqIHRoZW0uCi0gICAqIAotICAgKiBAcGFyYW0gbm9kZQotICAgKiAgICAgICAgICAgIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbgotICAgKiAgICAgICAgICAgICBpZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCBmb3VuZCBvciBpZiBpdCBpcyBub3QgZm9ybWF0dGVkCi0gICAqICAgICAgICAgICAgIGNvcnJlY3RseS4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBwcm9jZXNzQWxsU2NoZW1hKE5vZGUgbm9kZSwgU3RyaW5nIGN0eCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0JQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7ICAgCi0JdHJ5Ci0JewotICAgCSAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MVXRpbHMuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7ICAgCi0JCi0gICAgICAvLyBpZiB4c2Q6c2NoZW1hIGVsZW1lbnQgaXMgZm91bmQgLT4gcHJvY2VzcyBzY2hlbWEKLSAgICAgIGlmIChYTUxVdGlscy5lcXVhbHMobm9kZSwgRUxFTV9YU0RfU0NIRU1BKSkKLSAgICAgIHsKLSAgICAgICAgcHJvY2Vzc1NjaGVtYSgoRWxlbWVudCkgbm9kZSk7Ci0KLSAgICAgICAgTm9kZSBuID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0gICAgICAgIHdoaWxlIChuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoTm9kZS5FTEVNRU5UX05PREUgPT0gbi5nZXROb2RlVHlwZSgpJiYgWE1MVXRpbHMuZXF1YWxzKG4sIEVMRU1fWFNEX0lNUE9SVCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXR0ciBzY2hlbWFMb2NhdGlvbiA9IFhNTFV0aWxzLmdldEF0dHJpYnV0ZSgoRWxlbWVudCkgbiwgQVRUUl9YU0RfU0NIRU1BTE9DQVRJT04pOwotCi0gICAgICAgICAgICAvLyBUcnkgdG8gcGFyc2UgaW1wb3J0ZWQgWFNECi0gICAgICAgICAgICBpZiAoc2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiBzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAJICBpZiAoIXNjaGVtYUxvY2F0aW9ucy5jb250YWlucyhzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpKSkKLSAgICAgICAgICAJICB7Ci0gICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb25zLmFkZChzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAvLyBSZWFkIGFuZCBwUGFyc2UgdGhlIFhNTCBzY2hlbWEgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gcGFyc2VYTUxEb2N1bWVudFVSTChzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLCBjdHgsIFRlc3RVdGlscy5nZXRYTUxTY2hlbWFMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgIHByb2Nlc3NBbGxTY2hlbWEoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCksIFhNTFV0aWxzLmNyZWF0ZVVSTFN0cmluZyhzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpLCBjdHgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFdTSUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbikgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBbiBleGNlcHRpb24gd2lsbCBvY2N1ciBpZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdAotICAJCQkgICAgIC8vIGZvdW5kIG9yIGlmIGl0IGlzIG5vdCBmb3JtYXR0ZWQgY29ycmVjdGx5Ci0gICAgICAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbikgdGhyb3cgbmV3IFdTSUV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSwgdCk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwotICAgICAgIH0KLSAgICAgfQotCi0gICAgIC8vIFJldHVybiBsaXN0IGNyZWF0ZWQgYnkgdGhlIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGlzIGNsYXNzCi0gICAgIHJldHVybiByZXR1cm5MaXN0OwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgeyAKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGN1cnJlbnRMb2FkZXIpOwotICAgIH0gICAgCi19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL3NjaGVtYS9YTUxTY2hlbWFQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvc2NoZW1hL1hNTFNjaGVtYVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE0MmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2ljb3JlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvY29yZS94bWwvc2NoZW1hL1hNTFNjaGVtYVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuc2NoZW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnV0aWwuVGVzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTERvY3VtZW50Q2FjaGVVc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgaXMgdXNlZCB0byBwcm9jZXNzIGFuIFhNTCBTY2hlbWEuCi0gKiAKLSAqIEBhdXRob3IgUGV0ZXIgIEJyaXR0ZW5oYW0gKHBldGVyYnJAdXMuaWJtLmNvbSkKLSAqIEB2ZXJzaW9uIDEuMC4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBYTUxTY2hlbWFQcm9jZXNzb3IKLSAgZXh0ZW5kcyBYTUxEb2N1bWVudENhY2hlVXNlcgotICBpbXBsZW1lbnRzIFhNTFRhZ3MKLXsKLSAgcHJvdGVjdGVkIExpc3QgcmV0dXJuTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgcHJvdGVjdGVkIFN0cmluZyBjb250ZXh0OwotICBwcm90ZWN0ZWQgYm9vbGVhbiB0aHJvd0V4Y2VwdGlvbiA9IHRydWU7Ci0gIHByb3RlY3RlZCBMaXN0IHNjaGVtYUxvY2F0aW9ucyA9IG5ldyBWZWN0b3IoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhNTFNjaGVtYVByb2Nlc3Nvci4KLSAgICogQHBhcmFtIGNvbnRleHQgICAgICAgZG9jdW1lbnQgY29udGV4dC4gCi0gICAqIEBwYXJhbSBkb2N1bWVudExpc3QgIGNhY2hlIG9mIHByZXZpb3VzbHkgcGFyc2VkIGRvY3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyBYTUxTY2hlbWFQcm9jZXNzb3IoU3RyaW5nIGNvbnRleHQsIFhNTERvY3VtZW50Q2FjaGUgZG9jdW1lbnRMaXN0KQotICB7Ci0gICAgdGhpcyhjb250ZXh0LCBkb2N1bWVudExpc3QsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBYTUxTY2hlbWFQcm9jZXNzb3IuCi0gICAqIEBwYXJhbSBjb250ZXh0ICAgICAgICBkb2N1bWVudCBjb250ZXh0LiAKLSAgICogQHBhcmFtIGRvY3VtZW50TGlzdCAgIGNhY2hlIG9mIHByZXZpb3VzbHkgcGFyc2VkIGRvY3VtZW50cy4KLSAgICogQHBhcmFtIHRocm93RXhjZXB0aW9uIGluZGljYXRlcyBpZiBhbiBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBpZiB0aGVyZSBpcyBhIHBhcnNpbmcgcHJvYmxlbS4KLSAgICovCi0gIHB1YmxpYyBYTUxTY2hlbWFQcm9jZXNzb3IoCi0gICAgU3RyaW5nIGNvbnRleHQsCi0gICAgWE1MRG9jdW1lbnRDYWNoZSBkb2N1bWVudExpc3QsCi0gICAgYm9vbGVhbiB0aHJvd0V4Y2VwdGlvbikKLSAgewotICAgIHN1cGVyKCk7Ci0KLSAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgIHRoaXMuZG9jdW1lbnRMaXN0ID0gZG9jdW1lbnRMaXN0OwotICAgIHRoaXMudGhyb3dFeGNlcHRpb24gPSB0aHJvd0V4Y2VwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2ggZm9yIGFsbCBzY2hlbWEgZWxlbWVudHMsIGxvYWQgdGhlIHhzZCBkb2N1bWVudHMsIGFuZCB0aGVuIHByb2Nlc3MgdGhlbS4KLSAgICogQHBhcmFtIG5vZGUgIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCBmb3VuZCBvciBpZiBpdCBpcyBub3QgZm9ybWF0dGVkIGNvcnJlY3RseS4KLSAgICovCi0gIHB1YmxpYyBMaXN0IHByb2Nlc3NBbGxTY2hlbWEoTm9kZSBub2RlKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcHJvY2Vzc0FsbFNjaGVtYShub2RlLCBjb250ZXh0KTsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2ggZm9yIGFsbCBzY2hlbWEgZWxlbWVudHMsIGxvYWQgdGhlIHhzZCBkb2N1bWVudHMsIGFuZCB0aGVuIHByb2Nlc3MgdGhlbS4KLSAgICogQHBhcmFtIG5vZGUgIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIG5vdCBmb3VuZCBvciBpZiBpdCBpcyBub3QgZm9ybWF0dGVkIGNvcnJlY3RseS4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBwcm9jZXNzQWxsU2NoZW1hKE5vZGUgbm9kZSwgU3RyaW5nIGN0eCkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0JQ2xhc3NMb2FkZXIgY3VycmVudExvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7ICAgCi0JdHJ5Ci0JewotICAgCSAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoWE1MU2NoZW1hUHJvY2Vzc29yLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyAgIAotICAgICAgLy8gUHJvY2VzcyBhbGwgbm9kZXMKLSAgICAgIHdoaWxlIChub2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gZWxlbWVudCBub2RlLCB0aGVuIGNvbnRpbnVlCi0gICAgICAgIGlmIChOb2RlLkVMRU1FTlRfTk9ERSA9PSBub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBpZiB4c2Q6c2NoZW1hIGVsZW1lbnQgaXMgZm91bmQgLT4gcHJvY2VzcyBzY2hlbWEKLSAgICAgICAgICBpZiAoWE1MVXRpbHMuZXF1YWxzKG5vZGUsIEVMRU1fWFNEX1NDSEVNQSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJvY2Vzc1NjaGVtYSgoRWxlbWVudCkgbm9kZSk7Ci0KLSAgICAgICAgICAgIC8vIFByb2Nlc3MgYWxsIGNoaWxkcmVuIG9mIHRoZSBzY2hlbWEgZWxlbWVudAotICAgICAgICAgICAgcHJvY2Vzc0FsbFNjaGVtYShub2RlLmdldEZpcnN0Q2hpbGQoKSwgY3R4KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBpZiB4c2Q6aW1wb3J0IGVsZW1lbnQgaXMgZm91bmQgLT4gbG9hZCBzY2hlbWEgYW5kIHByb2Nlc3Mgc2NoZW1hCi0gICAgICAgICAgZWxzZSBpZiAoWE1MVXRpbHMuZXF1YWxzKG5vZGUsIEVMRU1fWFNEX0lNUE9SVCkpCi0gICAgICAgICAgewotCi0gICAgICAgICAgICBBdHRyIHNjaGVtYUxvY2F0aW9uID0KLSAgICAgICAgICAgICAgWE1MVXRpbHMuZ2V0QXR0cmlidXRlKChFbGVtZW50KSBub2RlLCBBVFRSX1hTRF9TQ0hFTUFMT0NBVElPTik7Ci0KLSAgICAgICAgICAgIC8vIFRyeSB0byBwYXJzZSBpbXBvcnRlZCBYU0QKLSAgICAgICAgICAgIGlmIChzY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAJICBpZiAoIXNjaGVtYUxvY2F0aW9ucy5jb250YWlucyhzY2hlbWFMb2NhdGlvbi5nZXRWYWx1ZSgpKSkKLSAgICAgICAgICAJICB7Ci0gICAgICAgICAgCQlzY2hlbWFMb2NhdGlvbnMuYWRkKHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIFJlYWQgYW5kIHBQYXJzZSB0aGUgWE1MIHNjaGVtYSBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQotICAgICAgICAgICAgICAgICAgICBwYXJzZVhNTERvY3VtZW50VVJMKAotICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgY3R4LAotICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlscy5nZXRYTUxTY2hlbWFMb2NhdGlvbigpKTsKLQotICAgICAgICAgICAgICAgICAgcHJvY2Vzc0FsbFNjaGVtYShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVVUkxTdHJpbmcoc2NoZW1hTG9jYXRpb24uZ2V0VmFsdWUoKSwgY3R4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IEFuIGV4Y2VwdGlvbiB3aWxsIG9jY3VyIGlmIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgbm90IGZvdW5kIG9yIGlmIGl0IGlzIG5vdCBmb3JtYXR0ZWQgY29ycmVjdGx5Ci0gICAgICAgICAgICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXU0lFeGNlcHRpb24odC5nZXRNZXNzYWdlKCksIHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBlbHNlIGl0ZXJhdGUgZWxlbWVudCByZWN1cnNpdmVseQotICAgICAgICAgICAgcHJvY2Vzc0FsbFNjaGVtYShub2RlLmdldEZpcnN0Q2hpbGQoKSwgY3R4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZXQgbmV4dCBzaWJpbGluZwotICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotICAgICAgfQotCi0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7IAotICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY3VycmVudExvYWRlcik7Ci0gICAgfSAgICAKLQotCi0gICAgLy8gUmV0dXJuIGxpc3QgY3JlYXRlZCBieSB0aGUgY2xhc3MgdGhhdCBleHRlbmRzIHRoaXMgY2xhc3MKLSAgICByZXR1cm4gcmV0dXJuTGlzdDsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NTY2hlbWEoRWxlbWVudCBlbGVtZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaWNvcmUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9jb3JlL3htbC9zY2hlbWEvWE1MU2NoZW1hVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL3NjaGVtYS9YTUxTY2hlbWFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzNWQ5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpY29yZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2NvcmUveG1sL3NjaGVtYS9YTUxTY2hlbWFWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLnNjaGVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUudXRpbC5UZXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5YTUxEb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS54bWwuWE1MVXRpbHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGNvbS5pYm0ud3NkbC51dGlsLnhtbC5ET00yV3JpdGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgU2NoZW1hLgotICogCi0gKiBAYXV0aG9yIFBldGVyICBCcml0dGVuaGFtIChwZXRlcmJyQHVzLmlibS5jb20pCi0gKiBAdmVyc2lvbiAxLjAuMQotICovCi1wdWJsaWMgY2xhc3MgWE1MU2NoZW1hVmFsaWRhdG9yIGV4dGVuZHMgWE1MU2NoZW1hUHJvY2Vzc29yCi17Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOU19QUkVGSVggPSAieG1sbnM6IjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFhNTFNjaGVtYVZhbGlkYXRvci4KLSAgICogQHBhcmFtIGNvbnRleHQgICAgICAgZG9jdW1lbnQgY29udGV4dC4gCi0gICAqIEBwYXJhbSBkb2N1bWVudExpc3QgIGNhY2hlIG9mIHByZXZpb3VzbHkgcGFyc2VkIGRvY3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyBYTUxTY2hlbWFWYWxpZGF0b3IoU3RyaW5nIGNvbnRleHQsIFhNTERvY3VtZW50Q2FjaGUgZG9jdW1lbnRMaXN0KQotICB7Ci0gICAgc3VwZXIoY29udGV4dCwgZG9jdW1lbnRMaXN0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NTY2hlbWEoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTmFtZWROb2RlTWFwIGF0dHJMaXN0OwotICAgIFN0cmluZyBlbGVtZW50UHJlZml4ID0gbnVsbDsKLQotICAgIEhhc2hNYXAgZWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgSGFzaE1hcCBuc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBHZXQgc2NoZW1hIGNvbnRlbnQgYXMgYSBzdHJpbmcKLSAgICAgIFN0cmluZyBzY2hlbWEgPSBET00yV3JpdGVyLm5vZGVUb1N0cmluZyhlbGVtZW50KTsKLQotICAgICAgLy8gR2V0IGxpc3Qgb2YgZWxlbWVudCBuYW1lc3BhY2VzCi0gICAgICBpZiAoKGF0dHJMaXN0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkpICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGFkZE5hbWVzcGFjZXMoYXR0ckxpc3QsIGVsZW1lbnRNYXAsIG51bGwpOwotICAgICAgfQotCi0gICAgICAvLyBJZiBlbGVtZW50TWFwIGRvZXMgbm90IGNvbnRhaW4gZW50cnkgZm9yIGl0J3Mgb3duIG5hbWVzcGFjZSwgdGhlbiBhZGQgaXQKLSAgICAgIGlmIChlbGVtZW50TWFwLmdldChYTUxOU19QUkVGSVggKyBlbGVtZW50LmdldFByZWZpeCgpKSA9PSBudWxsKQotICAgICAgewotICAgICAgICBlbGVtZW50TWFwLnB1dCgKLSAgICAgICAgICBYTUxOU19QUkVGSVggKyBlbGVtZW50LmdldFByZWZpeCgpLAotICAgICAgICAgIGVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgZmlyc3QgcGFyZW50IG5vZGUgYW5kIHRoZW4gcHJvY2VzcyBhbGwgb2YgdGhlbSB1bnRpbCB5b3UgaGl0IHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50Ci0gICAgICBOb2RlIHBhcmVudE5vZGUgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgIHdoaWxlIChwYXJlbnROb2RlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIE9ubHkgcHJvY2VzcyBFbGVtZW50IG5vZGVzCi0gICAgICAgIGlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhlIHBhcmVudCBub2RlCi0gICAgICAgICAgYXR0ckxpc3QgPSBwYXJlbnROb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhdHRyaWJ1dGVzLCBsb29rIGZvciB0aGUgeG1sbnM6IGF0dHJpYnV0ZXMKLSAgICAgICAgICBpZiAoYXR0ckxpc3QgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBhZGROYW1lc3BhY2VzKGF0dHJMaXN0LCBuc01hcCwgZWxlbWVudE1hcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgfQotCi0gICAgICAvLyBCdWlsZCBuYW1lc3BhY2UgbGlzdAotICAgICAgaWYgKG5zTWFwLnNpemUoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyOwotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlTGlzdCA9ICIiOwotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG5zTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBhdHRyID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgIG5hbWVzcGFjZUxpc3QgKz0gIiAiICsgYXR0ciArICI9XCIiICsgbnNNYXAuZ2V0KGF0dHIpICsgIlwiIjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBuYW1lc3BhY2Ugc2V0dGluZ3MsIHNpbmNlIHRoZSBET00yV3JpdGVyIHdpbGwgbWlzcyBhbnkgdGhhdCBhcmUgdXNlZCBhcyBhdHRyaWJ1dGUgdmFsdWVzCi0gICAgICAgIGludCBpbmRleCA9IHNjaGVtYS5pbmRleE9mKCI+Iik7Ci0gICAgICAgIGlmIChpbmRleCA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgc3RhcnQgPSBzY2hlbWEuc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICBTdHJpbmcgZW5kID0gc2NoZW1hLnN1YnN0cmluZyhpbmRleCk7Ci0KLSAgICAgICAgICBzY2hlbWEgPSBzdGFydCArIG5hbWVzcGFjZUxpc3QgKyBlbmQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gU2NoZW1hIHZhbGlkYXRlIHRoZSBYTUwgc2NoZW1hIGRvY3VtZW50Ci0gICAgICBEb2N1bWVudCBkb2MgPQotICAgICAgICBYTUxVdGlscy5wYXJzZVhNTChzY2hlbWEsIFRlc3RVdGlscy5nZXRYTUxTY2hlbWFMb2NhdGlvbigpKTsKLSAgICB9Ci0KLSAgICBjYXRjaCAoV1NJRXhjZXB0aW9uIHdlKQotICAgIHsKLSAgICAgIFRocm93YWJsZSB0ID0gd2UuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0gICAgICBpZiAodCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm5MaXN0LmFkZCh0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVzcGFjZXMoTmFtZWROb2RlTWFwIGF0dHJMaXN0LCBNYXAgbnNNYXAsIE1hcCBlbGVtZW50TWFwKQotICB7Ci0gICAgTm9kZSBhdHRyOwotICAgIFN0cmluZyBub2RlTmFtZTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBhdHRyID0gYXR0ckxpc3QuaXRlbShpKTsKLQotICAgICAgLy8gR2V0IHRoZSBhdHRyaWJ1dGUgbm9kZSBuYW1lCi0gICAgICBub2RlTmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQotICAgICAgLy8gSWYgaXQgc3RhcnRzIHdpdGggeG1sbnM6LCB0aGVuIGRldGVybWluZSBpZiBpdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgbmFtZXNwYWNlcyAKLSAgICAgIGlmIChub2RlTmFtZS5zdGFydHNXaXRoKFhNTE5TX1BSRUZJWCkKLSAgICAgICAgJiYgKChlbGVtZW50TWFwID09IG51bGwKLSAgICAgICAgICB8fCAoZWxlbWVudE1hcCAhPSBudWxsICYmIGVsZW1lbnRNYXAuZ2V0KG5vZGVOYW1lKSA9PSBudWxsKSkpKQotICAgICAgewotICAgICAgICBpZiAobnNNYXAuZ2V0KG5vZGVOYW1lKSA9PSBudWxsKQotICAgICAgICAgIG5zTWFwLnB1dChub2RlTmFtZSwgYXR0ci5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1VSSUVuY29kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1VSSUVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4YWY4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9VUklFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICoKLSAqIHBsdWdpbnMvY29tLmlibS5ldG9vbHMueG1sdXRpbGl0eS9zcmMvY29tL2libS9ldG9vbHMveG1sdXRpbGl0eS91cmkvVVJJRW5jb2Rlci5qYXZhLCBjb20uaWJtLmV0b29scy54bWx1dGlsaXR5LCB3c2EueG1sLnY1MSwgMjAwMzA3MThfMTYwNS5vCi0gKgotICogQHZlcnNpb24gMS4zIDcvMTgvMDMKLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkJpdFNldDsKLQotLyoqCi0gKiAgVGhpcyBjbGFzcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgamF2YS5sYW5nLlVSTEVuY29kZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklFbmNvZGVyCi17Ci0gIHN0YXRpYyBCaXRTZXQgZG9udE5lZWRFbmNvZGluZzsKLSAgc3RhdGljIGZpbmFsIGludCBjYXNlRGlmZiA9ICgnYScgLSAnQScpOwotICBzdGF0aWMgU3RyaW5nIGRmbHRFbmNOYW1lID0gbnVsbDsKLQotICBzdGF0aWMgewotICAgIGRvbnROZWVkRW5jb2RpbmcgPSBuZXcgQml0U2V0KDI1Nik7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gJ2EnOyBpIDw9ICd6JzsgaSsrKQotICAgIHsKLSAgICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KGkpOwotICAgIH0KLSAgICBmb3IgKGkgPSAnQSc7IGkgPD0gJ1onOyBpKyspCi0gICAgewotICAgICAgZG9udE5lZWRFbmNvZGluZy5zZXQoaSk7Ci0gICAgfQotICAgIGZvciAoaSA9ICcwJzsgaSA8PSAnOSc7IGkrKykKLSAgICB7Ci0gICAgICBkb250TmVlZEVuY29kaW5nLnNldChpKTsKLSAgICB9Ci0KLSAgICAvL2RvbnROZWVkRW5jb2Rpbmcuc2V0KCcgJyk7IC8vIGNzLi4gcmVtb3ZlZCBzbyB0aGF0IHNwYWNlIGNoYXJhY3RlciB3aWxsIGJlIHJlcGxhY2VkIGJ5ICUyMAotICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCctJyk7Ci0gICAgZG9udE5lZWRFbmNvZGluZy5zZXQoJ18nKTsKLSAgICBkb250TmVlZEVuY29kaW5nLnNldCgnLicpOwotICAgIGRvbnROZWVkRW5jb2Rpbmcuc2V0KCcqJyk7Ci0gICAgZG9udE5lZWRFbmNvZGluZy5zZXQoJzonKTsgLy8gY3MuLiBhZGRlZCAKLSAgICBkb250TmVlZEVuY29kaW5nLnNldCgnLycpOwotICAgIC8vIGNzLi4gYWRkZWQgc28gdGhhdCBzbGFzaGVzIGRvbid0IGdldCBlbmNvZGVkIGFzICUyRgotCi0gICAgLy8gZGZsdEVuY05hbWUgPSAoU3RyaW5nKUFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigiZmlsZS5lbmNvZGluZyIpKTsKLSAgICAvLyBBcyBkaXNjdXNzZWQgd2l0aCBTYW5keSwgd2Ugc2hvdWxkIGVuY29kZSBVUklzIHdpdGggVVRGOAotICAgIGRmbHRFbmNOYW1lID0gIlVURjgiOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJkZmx0RW5jTmFtZSAiICsgZGZsdEVuY05hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFlvdSBjYW4ndCBjYWxsIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHByaXZhdGUgVVJJRW5jb2RlcigpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFuc2xhdGVzIGEgc3RyaW5nIGludG8gPGNvZGU+eC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPgotICAgKiBmb3JtYXQuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBlbmNvZGluZwotICAgKiBhcyB0aGUgZW5jb2Rpbmcgc2NoZW1lIHRvIG9idGFpbiB0aGUgYnl0ZXMgZm9yIHVuc2FmZSBjaGFyYWN0ZXJzLgotICAgKgotICAgKiBAcGFyYW0gICBzICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSB0cmFuc2xhdGVkLgotICAgKiBAcmV0dXJuICB0aGUgdHJhbnNsYXRlZCA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKQotICB7Ci0gICAgU3RyaW5nIHN0ciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgc3RyID0gZW5jb2RlKHMsIGRmbHRFbmNOYW1lKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBUaGUgc3lzdGVtIHNob3VsZCBhbHdheXMgaGF2ZSB0aGUgcGxhdGZvcm0gZGVmYXVsdAotICAgIH0KLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zbGF0ZXMgYSBzdHJpbmcgaW50byA8Y29kZT5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L2NvZGU+Ci0gICAqIGZvcm1hdCB1c2luZyBhIHNwZWNpZmljIGVuY29kaW5nIHNjaGVtZS4gVGhpcyBtZXRob2QgdXNlcyB0aGUKLSAgICogc3VwcGxpZWQgZW5jb2Rpbmcgc2NoZW1lIHRvIG9idGFpbiB0aGUgYnl0ZXMgZm9yIHVuc2FmZQotICAgKiBjaGFyYWN0ZXJzLgotICAgKiA8cD4KLSAgICogPGVtPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIDxhIGhyZWY9Ci0gICAqICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAvYXBwZW5kaXgvbm90ZXMuaHRtbCNub24tYXNjaWktY2hhcnMiPgotICAgKiBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIFJlY29tbWVuZGF0aW9uPC9hPiBzdGF0ZXMgdGhhdAotICAgKiBVVEYtOCBzaG91bGQgYmUgdXNlZC4gTm90IGRvaW5nIHNvIG1heSBpbnRyb2R1Y2UKLSAgICogaW5jb21wYXRpYmlsaXRlcy48L2VtPgotICAgKgotICAgKiBAcGFyYW0gICBzICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB0byBiZSB0cmFuc2xhdGVkLgotICAgKiBAcGFyYW0gICBlbmMgICBUaGUgbmFtZSBvZiBhIHN1cHBvcnRlZCAKLSAgICogICAgPGEgaHJlZj0iLi4vbGFuZy9wYWNrYWdlLXN1bW1hcnkuaHRtbCNjaGFyZW5jIj5jaGFyYWN0ZXIKLSAgICogICAgZW5jb2Rpbmc8L2E+LgotICAgKiBAcmV0dXJuICB0aGUgdHJhbnNsYXRlZCA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgKiBAZXhjZXB0aW9uICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gICAqICAgICAgICAgICAgIElmIHRoZSBuYW1lZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkCi0gICAqIEBzZWUgVVJMRGVjb2RlciNkZWNvZGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgcywgU3RyaW5nIGVuYykKLSAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBuZWVkVG9DaGFuZ2UgPSBmYWxzZTsKLSAgICBib29sZWFuIHdyb3RlVW5lbmNvZGVkQ2hhciA9IGZhbHNlOwotICAgIGludCBtYXhCeXRlc1BlckNoYXIgPSAxMDsgLy8gcmF0aGVyIGFyYml0cmFyeSBsaW1pdCwgYnV0IHNhZmUgZm9yIG5vdwotICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKG1heEJ5dGVzUGVyQ2hhcik7Ci0gICAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0KLSAgICAgIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJ1ZiwgZW5jKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgYyA9IChpbnQpIHMuY2hhckF0KGkpOwotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIkV4YW1pbmluZyBjaGFyYWN0ZXI6ICIgKyBjKTsKLSAgICAgIGlmIChkb250TmVlZEVuY29kaW5nLmdldChjKSkKLSAgICAgIHsKLSAgICAgICAgLy9pZiAoYyA9PSAnICcpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgYyA9ICcrJzsKLSAgICAgICAgLy8gIG5lZWRUb0NoYW5nZSA9IHRydWU7Ci0gICAgICAgIC8vfQotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiU3RvcmluZzogIiArIGMpOwotICAgICAgICBvdXQuYXBwZW5kKChjaGFyKSBjKTsKLSAgICAgICAgd3JvdGVVbmVuY29kZWRDaGFyID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gY29udmVydCB0byBleHRlcm5hbCBlbmNvZGluZyBiZWZvcmUgaGV4IGNvbnZlcnNpb24KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiAod3JvdGVVbmVuY29kZWRDaGFyKQotICAgICAgICAgIHsgLy8gRml4IGZvciA0NDA3NjEwCi0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsIGVuYykpOwotICAgICAgICAgICAgd3JvdGVVbmVuY29kZWRDaGFyID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdyaXRlci53cml0ZShjKTsKLQotICAgICAgICAgIC8vIElmIHRoaXMgY2hhcmFjdGVyIHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIGEgVW5pY29kZQotICAgICAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyLCB0aGVuIHBhc3MgaW4gdHdvIGNoYXJhY3RlcnMuIEl0J3Mgbm90Ci0gICAgICAgICAgLy8gY2xlYXIgd2hhdCBzaG91bGQgYmUgZG9uZSBpZiBhIGJ5dGVzIHJlc2VydmVkIGluIHRoZSAKLSAgICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMgcmFuZ2Ugb2NjdXJzIG91dHNpZGUgb2YgYSBsZWdhbAotICAgICAgICAgIC8vIHN1cnJvZ2F0ZSBwYWlyLiBGb3Igbm93LCBqdXN0IHRyZWF0IGl0IGFzIGlmIGl0IHdlcmUgCi0gICAgICAgICAgLy8gYW55IG90aGVyIGNoYXJhY3Rlci4KLSAgICAgICAgICAvLyAKLSAgICAgICAgICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERCRkYpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gIFN5c3RlbS5vdXQucHJpbnRsbihJbnRlZ2VyLnRvSGV4U3RyaW5nKGMpICsgIiBpcyBoaWdoIHN1cnJvZ2F0ZSIpOwkJCSAgICAgIAotICAgICAgICAgICAgaWYgKChpICsgMSkgPCBzLmxlbmd0aCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnQgZCA9IChpbnQpIHMuY2hhckF0KGkgKyAxKTsKLSAgICAgICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJcdEV4YW1pbmluZyAiICsgSW50ZWdlci50b0hleFN0cmluZyhkKSk7CQkJICAgICAgCi0gICAgICAgICAgICAgIGlmIChkID49IDB4REMwMCAmJiBkIDw9IDB4REZGRikKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgSW50ZWdlci50b0hleFN0cmluZyhkKSArICIgaXMgbG93IHN1cnJvZ2F0ZSIpOwkJCQkKLSAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZCk7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHdyaXRlci5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgYnVmLnJlc2V0KCk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnl0ZVtdIGJhID0gYnVmLnRvQnl0ZUFycmF5KCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBiYS5sZW5ndGg7IGorKykKLSAgICAgICAgewotICAgICAgICAgIG91dC5hcHBlbmQoJyUnKTsKLSAgICAgICAgICBjaGFyIGNoID0gQ2hhcmFjdGVyLmZvckRpZ2l0KChiYVtqXSA+PiA0KSAmIDB4RiwgMTYpOwotICAgICAgICAgIC8vIGNvbnZlcnRpbmcgdG8gdXNlIHVwcGVyY2FzZSBsZXR0ZXIgYXMgcGFydCBvZgotICAgICAgICAgIC8vIHRoZSBoZXggdmFsdWUgaWYgY2ggaXMgYSBsZXR0ZXIuCi0gICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjaCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2ggLT0gY2FzZURpZmY7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dC5hcHBlbmQoY2gpOwotICAgICAgICAgIGNoID0gQ2hhcmFjdGVyLmZvckRpZ2l0KGJhW2pdICYgMHhGLCAxNik7Ci0gICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjaCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2ggLT0gY2FzZURpZmY7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dC5hcHBlbmQoY2gpOwotICAgICAgICB9Ci0gICAgICAgIGJ1Zi5yZXNldCgpOwotICAgICAgICBuZWVkVG9DaGFuZ2UgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKG5lZWRUb0NoYW5nZSA/IG91dC50b1N0cmluZygpIDogcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9XU0lQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI4ZDIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsOwotCi0vKioKLSAqIFdTLUkgdGVzdCB0b29scyBwcm9wZXJ0eS4KLSAqIAotICogQGF1dGhvciBEYXZpZCBMYXV6b24sIElCTQotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgV1NJUHJlZmVyZW5jZXMKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSAiIjsKLSAgcHJvdGVjdGVkIFN0cmluZyB0YWRmaWxlID0gIiI7Ci0gIAotICAvKioKLSAgICogIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTSVByZWZlcmVuY2VzKCkKLSAgewotCWNvbXBsaWFuY2VMZXZlbCA9IFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuV0FSTl9OT05fV1NJOwotCXRhZGZpbGUgPSBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLkRFRkFVTFRfQVNTRVJUSU9OX0ZJTEU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBXUy1JIGNvbXBsaWFuY2UgbGV2ZWwuCi0gICAqIEByZXR1cm4gdGhlIFdTLUkgY29tcGxpYW5jZSBsZXZlbC4KLSAgICogQHNlZSAjc2V0Q29tcGxpYW5jZUxldmVsCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBsaWFuY2VMZXZlbCgpCi0gIHsKLSAgICByZXR1cm4gY29tcGxpYW5jZUxldmVsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgV1MtSSBjb21wbGlhbmNlIGxldmVsLgotICAgKiBAcGFyYW0gY29tcGxpYW5jZSB0aGUgV1MtSSBjb21wbGlhbmNlIGxldmVsLgotICAgKiBAc2VlICNnZXRDb21wbGlhbmNlTGV2ZWwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBsaWFuY2VMZXZlbChTdHJpbmcgY29tcGxpYW5jZSkKLSAgewotICAgIHRoaXMuY29tcGxpYW5jZUxldmVsID0gY29tcGxpYW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgQmFzaWMgUHJvZmlsZSBUZXN0IEFzc2VydGlvbnMgZmlsZS4KLSAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIEJhc2ljIFByb2ZpbGUgVGVzdCBBc3NlcnRpb25zIGZpbGUuCi0gICAqIEBzZWUgI3NldFRBREZpbGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VEFERmlsZSgpCi0gIHsKLSAgICByZXR1cm4gdGFkZmlsZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBCYXNpYyBQcm9maWxlIFRlc3QgQXNzZXJ0aW9ucyBmaWxlLgotICAgKiBAcGFyYW0gZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIEJhc2ljIFByb2ZpbGUgVGVzdCBBc3NlcnRpb25zIGZpbGUuCi0gICAqIEBzZWUgI2dldFRBREZpbGUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRBREZpbGUoU3RyaW5nIGZpbGUpCi0gIHsKLSAgICB0aGlzLnRhZGZpbGUgPSBmaWxlOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVRlc3RUb29sc0VjbGlwc2VQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9XU0lUZXN0VG9vbHNFY2xpcHNlUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDY2MmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVRlc3RUb29sc0VjbGlwc2VQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLQotLyoqCi0gKiBXUy1JIHRlc3QgdG9vbCBwcm9wZXJ0aWVzIHNwZWNpZmljIGZvciBFY2xpcHNlLgotICovCi1wdWJsaWMgY2xhc3MgV1NJVGVzdFRvb2xzRWNsaXBzZVByb3BlcnRpZXMgZXh0ZW5kcyBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzCi17Ci0gLyoqCi0gICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLldTSVRlc3RUb29sc1Byb3BlcnRpZXMjY2hlY2tXU0lQcmVmZXJlbmNlcyhqYXZhLmxhbmcuU3RyaW5nKQotICAqLwotICBwdWJsaWMgc3RhdGljIFdTSVByZWZlcmVuY2VzIGNoZWNrV1NJUHJlZmVyZW5jZXMoU3RyaW5nIGZpbGV1cmkpCi0gIHsKLSAgICBXU0lQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG5ldyBXU0lQcmVmZXJlbmNlcygpOwotICAgIAotICAgIC8vIFJlbW92ZSBmaWxlOiBhbmQgYW55IHNsYXNoZXMgZnJvbSB0aGUgZmlsZXVyaS4gCi0gICAgLy8gRWNsaXBzZSdzIHJlc29sdXRpb24gbWVjaGFuaXNtIG5lZWRzIHRvIHN0YXJ0IHdpdGggdGhlIGRyaXZlLgotICAgIFN0cmluZyB1cmlTdHIgPSB0cmltVVJJKGZpbGV1cmkpOwotCi0gICAgV1NVSVBsdWdpbiB3c3VpID0gV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotICAgIFBlcnNpc3RlbnRXU0lDb250ZXh0IEFQY29udGV4dCA9IHdzdWkuZ2V0V1NJQVBDb250ZXh0KCk7Ci0gICAgUGVyc2lzdGVudFdTSUNvbnRleHQgU1NCUGNvbnRleHQgPSB3c3VpLmdldFdTSVNTQlBDb250ZXh0KCk7Ci0gICAgCi0gICAgSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgodXJpU3RyKSk7Ci0gICAgaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID09IDEpCi0gICAgewotICAgICAgLy9jaGVjayBwcm9qZWN0IGxldmVsIGNvbnBsaWFuY2UKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBmaWxlc1swXS5nZXRQcm9qZWN0KCk7Ci0gICAgICAKLSAgICAgIGlmIChBUGNvbnRleHQucHJvamVjdFN0b3BOb25XU0lDb21wbGlhbmNlcyhwcm9qZWN0KSkKLSAgICAgIHsKLSAgICAgICAgcHJlZmVyZW5jZXMuc2V0VEFERmlsZShBUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbChQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kpOwotICAgICAgfSAKLSAgICAgIGVsc2UgaWYgKEFQY29udGV4dC5wcm9qZWN0V2Fybk5vbldTSUNvbXBsaWFuY2VzKHByb2plY3QpKQotICAgICAgewotICAgICAgICBwcmVmZXJlbmNlcy5zZXRUQURGaWxlKEFQX0FTU0VSVElPTl9GSUxFKTsKLSAgICAgICAgcHJlZmVyZW5jZXMuc2V0Q29tcGxpYW5jZUxldmVsKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChTU0JQY29udGV4dC5wcm9qZWN0U3RvcE5vbldTSUNvbXBsaWFuY2VzKHByb2plY3QpKQotICAgICAgewotICAgICAgICBwcmVmZXJlbmNlcy5zZXRUQURGaWxlKFNTQlBfQVNTRVJUSU9OX0ZJTEUpOwotICAgICAgICBwcmVmZXJlbmNlcy5zZXRDb21wbGlhbmNlTGV2ZWwoUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKFNTQlBjb250ZXh0LnByb2plY3RXYXJuTm9uV1NJQ29tcGxpYW5jZXMocHJvamVjdCkpCi0gICAgICB7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldFRBREZpbGUoU1NCUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbChQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwcmVmZXJlbmNlcy5zZXRUQURGaWxlKERFRkFVTFRfQVNTRVJUSU9OX0ZJTEUpOwotICAgICAgICBwcmVmZXJlbmNlcy5zZXRDb21wbGlhbmNlTGV2ZWwoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gSWYgd2UgY2FuJ3Qgb2J0YWluIHRoZSBwcm9qZWN0IHByZWZlcmVuY2UgdXNlIHRoZSBnbG9iYWwgcHJlZmVyZW5jZS4KLSAgICAgIFN0cmluZyBBUGxldmVsID0gQVBjb250ZXh0LmdldFBlcnNpc3RlbnRXU0lDb21wbGlhbmNlKCk7Ci0gICAgICBTdHJpbmcgU1NCUGxldmVsID0gU1NCUGNvbnRleHQuZ2V0UGVyc2lzdGVudFdTSUNvbXBsaWFuY2UoKTsKLSAgICAgIGlmKEFQbGV2ZWwuZXF1YWxzKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSSkpCi0gICAgICB7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldFRBREZpbGUoQVBfQVNTRVJUSU9OX0ZJTEUpOwotICAgICAgICBwcmVmZXJlbmNlcy5zZXRDb21wbGlhbmNlTGV2ZWwoUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoQVBsZXZlbC5lcXVhbHMoUGVyc2lzdGVudFdTSUNvbnRleHQuV0FSTl9OT05fV1NJKSkKLSAgICAgIHsKLSAgICAgICAgcHJlZmVyZW5jZXMuc2V0VEFERmlsZShBUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbChQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kpOwotICAgICB9Ci0gICAgIGlmKFNTQlBsZXZlbC5lcXVhbHMoUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJKSkKLSAgICAgewotICAgICAgIHByZWZlcmVuY2VzLnNldFRBREZpbGUoU1NCUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgcHJlZmVyZW5jZXMuc2V0Q29tcGxpYW5jZUxldmVsKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSSk7Ci0gICAgIH0KLSAgICAgZWxzZSBpZihTU0JQbGV2ZWwuZXF1YWxzKFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSSkpCi0gICAgIHsKLSAgICAgIHByZWZlcmVuY2VzLnNldFRBREZpbGUoU1NCUF9BU1NFUlRJT05fRklMRSk7Ci0gICAgICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbChQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBwcmVmZXJlbmNlcy5zZXRUQURGaWxlKERFRkFVTFRfQVNTRVJUSU9OX0ZJTEUpOwotICAgICAgICBwcmVmZXJlbmNlcy5zZXRDb21wbGlhbmNlTGV2ZWwoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJlZmVyZW5jZXM7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvV1NJVGVzdFRvb2xzUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9XU0lUZXN0VG9vbHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkMDAyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9XU0lUZXN0VG9vbHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLS8qKgotICogVGhlIFdTLUkgdGVzdCB0b29scyBwbHVnaW4uCi0gKiAKLSAqIEBhdXRob3IgbGF1em9uZAotICovCi0KLXB1YmxpYyBjbGFzcyBXU0lUZXN0VG9vbHNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0gIHByaXZhdGUgc3RhdGljIEFic3RyYWN0VUlQbHVnaW4gaW5zdGFuY2U7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUExVR0lOX1BST1BFUlRJRVMgPSAid3NpdmFsaWRhdGUiOwotICBwcm90ZWN0ZWQgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VidW5kbGUgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciB3c2lUZXN0VG9vbHNQbHVnaW4uCi0gICAqIEBwYXJhbSBkZXNjcmlwdG9yIGFuIElQbHVnaW5EZXNjcmlwdG9yIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBXU0lUZXN0VG9vbHNQbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgewotICAgIHN1cGVyKGRlc2NyaXB0b3IpOwotICAgIGluc3RhbmNlID0gdGhpczsKLQotICAgIC8vIHNldCB0aGUgY3VycmVudCBkaXJlY3RvcnkKLSAgIFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuc2V0SW5zdGFsbERpcihnZXRJbnN0YWxsVVJMKCkpOwotICAgV1NJVGVzdFRvb2xzUHJvcGVydGllcy5zZXRFY2xpcHNlQ29udGV4dCh0cnVlKTsKLSAgIHJlc291cmNlYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFBMVUdJTl9QUk9QRVJUSUVTKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0SW5zdGFuY2UuCi0gICAqIEByZXR1cm4gQWJzdHJhY3RVSVBsdWdpbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBBYnN0cmFjdFVJUGx1Z2luIGdldEluc3RhbmNlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Z2luLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHBsdWdpbi4KLSAgICovCi0gIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpCi0gIHsKLSAgICByZXR1cm4gcmVzb3VyY2VidW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldFBsdWdpbi4KLSAgICogQHJldHVybiBXU0lUb29sc1V0aWxQbHVnaW4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgV1NJVGVzdFRvb2xzUGx1Z2luIGdldFBsdWdpbigpCi0gIHsKLSAgICByZXR1cm4gKFdTSVRlc3RUb29sc1BsdWdpbikgaW5zdGFuY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBpbnN0YWxsYWJsZSBVUkwgZm9yIHRoaXMgcGx1Z2luLgotICAgKiBAcmV0dXJuIGluc3RhbGxhYmxlIFVSTCBmb3IgdGhpcyBwbHVnaW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxVUkwoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoZ2V0RGVzY3JpcHRvcigpLmdldEluc3RhbGxVUkwoKSkuZ2V0RmlsZSgpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVRlc3RUb29sc1Byb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL1dTSVRlc3RUb29sc1Byb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzZWE2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9XU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLldTSVByb3BlcnRpZXM7Ci0KLS8qKgotICogV1MtSSB0ZXN0IHRvb2xzIHByb3BlcnR5LgotICovCi1wdWJsaWMgY2xhc3MgV1NJVGVzdFRvb2xzUHJvcGVydGllcwotewotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBpbnN0YWxsVVJMID0gIiI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHRhZGZpbGUgPSAiIjsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBzY2hlbWFEaXIgPSAiY29tbW9uL3NjaGVtYXMvIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1NCUF9BU1NFUlRJT05fRklMRSA9ICJodHRwOi8vd3d3LndzLWkub3JnL1Rlc3RpbmcvVG9vbHMvMjAwNS8wMS9TU0JQMTBfQlAxMV9UQURfMS0wLnhtbCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFQX0FTU0VSVElPTl9GSUxFID0gImh0dHA6Ly93d3cud3MtaS5vcmcvVGVzdGluZy9Ub29scy8yMDA0LzEyL0FQMTBfQlAxMV9TU0JQMTBfVEFELnhtbCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQVNTRVJUSU9OX0ZJTEUgPSBBUF9BU1NFUlRJT05fRklMRTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1BfTk9OX1dTSSA9ICIwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSTl9OT05fV1NJID0gIjEiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfTk9OX1dTSSA9ICIyIjsKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlQ29udGV4dCA9IGZhbHNlOwotCi0gIC8qKgotICAgKiAgQ29uc3RydWN0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgV1NJVGVzdFRvb2xzUHJvcGVydGllcygpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RWNsaXBzZUNvbnRleHQoYm9vbGVhbiBlY2xpcHNlQWN0aXZlKQotICB7Ci0gICAgZWNsaXBzZUNvbnRleHQgPSBlY2xpcHNlQWN0aXZlOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RWNsaXBzZUNvbnRleHQoKQotICB7Ci0gICAgcmV0dXJuIGVjbGlwc2VDb250ZXh0OwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBzY2hlbWEgbG9jYXRpb24uCi0gICAqIEBwYXJhbSBkaXIgdGhlIHNjaGVtYSBsb2NhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnN0YWxsRGlyKFN0cmluZyBkaXIpCi0gIHsKLSAgICBpbnN0YWxsVVJMID0gZGlyOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IGxvY2FsIHByb3BlcnRpZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9jYWwoKQotICB7Ci0gICAgUHJvcGVydGllcyBzY2hlbWFMb2NhdGlvblByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgIFN0cmluZyBzY2hlbWFVUkwgPSBpbnN0YWxsVVJMICsgc2NoZW1hRGlyOwotICAgIHRyeQotICAgIHsKLSAgICAgIHNjaGVtYUxvY2F0aW9uUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKLSAgICAgICAgIndzaS5hbmFseXplci54bWxzY2hlbWEuc2NoZW1hIiwKLSAgICAgICAgVVJJRW5jb2Rlci5lbmNvZGUoc2NoZW1hVVJMICsgIlhNTFNjaGVtYS54c2QiLCAiVVRGOCIpKTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKLSAgICAgICAgIndzaS5hbmFseXplci53c2RsLnNjaGVtYSIsCi0gICAgICAgIFVSSUVuY29kZXIuZW5jb2RlKHNjaGVtYVVSTCArICJ3c2RsMTEueHNkIiwgIlVURjgiKSk7Ci0gICAgICBzY2hlbWFMb2NhdGlvblByb3BlcnRpZXMuc2V0UHJvcGVydHkoCi0gICAgICAgICJ3c2kuYW5hbHl6ZXIuc29hcC5zY2hlbWEiLAotICAgICAgICBVUklFbmNvZGVyLmVuY29kZShzY2hlbWFVUkwgKyAic29hcEVudmVsb3BlLnhzZCIsICJVVEY4IikpOwotICAgICAgc2NoZW1hTG9jYXRpb25Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KAotICAgICAgICAid3NpLmFuYWx5emVyLndzZGxzb2FwLnNjaGVtYSIsCi0gICAgICAgIFVSSUVuY29kZXIuZW5jb2RlKHNjaGVtYVVSTCArICJ3c2RsU29hcC54c2QiLCAiVVRGOCIpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBzY2hlbWFMb2NhdGlvblByb3BlcnRpZXMuc2V0UHJvcGVydHkoCi0gICAgICAgICJ3c2kuYW5hbHl6ZXIueG1sc2NoZW1hLnNjaGVtYSIsCi0gICAgICAgIFVSSUVuY29kZXIuZW5jb2RlKHNjaGVtYVVSTCArICJYTUxTY2hlbWEueHNkIikpOwotICAgICAgc2NoZW1hTG9jYXRpb25Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KAotICAgICAgICAid3NpLmFuYWx5emVyLndzZGwuc2NoZW1hIiwKLSAgICAgICAgVVJJRW5jb2Rlci5lbmNvZGUoc2NoZW1hVVJMICsgIndzZGwxMS54c2QiKSk7Ci0gICAgICBzY2hlbWFMb2NhdGlvblByb3BlcnRpZXMuc2V0UHJvcGVydHkoCi0gICAgICAgICJ3c2kuYW5hbHl6ZXIuc29hcC5zY2hlbWEiLAotICAgICAgICBVUklFbmNvZGVyLmVuY29kZShzY2hlbWFVUkwgKyAic29hcEVudmVsb3BlLnhzZCIpKTsKLSAgICAgIHNjaGVtYUxvY2F0aW9uUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgKLSAgICAgICAgIndzaS5hbmFseXplci53c2Rsc29hcC5zY2hlbWEiLAotICAgICAgICBVUklFbmNvZGVyLmVuY29kZShzY2hlbWFVUkwgKyAid3NkbFNvYXAueHNkIikpOwotICAgIH0KLSAgICBXU0lQcm9wZXJ0aWVzLnNldFRocmVhZExvY2FsUHJvcGVydGllcyhzY2hlbWFMb2NhdGlvblByb3BlcnRpZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyB0aGUgV1MtSSBwcmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIGZpbGUgYW5kIHJldHVybiB0aGVtIGluIGEKLSAgICogV1NJUHJlZmVyZW5jZXMgb2JqZWN0LgotICAgKiAKLSAgICogQHBhcmFtIGZpbGV1cmkgVGhlIGZpbGUgVVJJIHRvIGNoZWNrIHRoZSBXUy1JIHByZWZlcmVuY2VzIGZvci4KLSAgICogQHJldHVybiBBIFdTSVByZWZlcmVuY2VzIG9iamVjdCBjb250YWluaW5nIHRoZSBwcmVmZXJlbmNlIGZvciB0aGlzIGZpbGUgVVJJLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXU0lQcmVmZXJlbmNlcyBjaGVja1dTSVByZWZlcmVuY2VzKFN0cmluZyBmaWxldXJpKQotICB7Ci0gIAlyZXR1cm4gbmV3IFdTSVByZWZlcmVuY2VzKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZW1vdmUgZmlsZTogYW5kIGFueSBzbGFzaGVzIGZyb20gdGhlIGZpbGV1cmkuIAotICAgKiBFY2xpcHNlJ3MgcmVzb2x1dGlvbiBtZWNoYW5pc20gbmVlZHMgdG8gc3RhcnQgd2l0aCB0aGUgZHJpdmUuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB0cmltVVJJKFN0cmluZyBmaWxldXJpKQotICB7Ci0gIAlTdHJpbmcgdXJpU3RyID0gZmlsZXVyaTsKLSAgCQotICAgIGlmKGZpbGV1cmkuc3RhcnRzV2l0aCgiZmlsZToiKSkKLSAgICB7Ci0gICAgICB1cmlTdHIgPSBmaWxldXJpLnN1YnN0cmluZyg1KTsKLSAgICB9Ci0gICAgd2hpbGUodXJpU3RyLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmlTdHIuc3RhcnRzV2l0aCgiXFwiKSkKLSAgICB7Ci0gICAgICB1cmlTdHIgPSB1cmlTdHIuc3Vic3RyaW5nKDEpOwotICAgIH0KLSAgICByZXR1cm4gdXJpU3RyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL01lc3NhZ2VBbmFseXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvYW5hbHl6ZXIvTWVzc2FnZUFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMTQxNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvYW5hbHl6ZXIvTWVzc2FnZUFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplcjsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5VUklFbmNvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuV1NJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5XU0lUZXN0VG9vbHNFY2xpcHNlUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuV1NJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQW5hbHl6ZXJDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuQXNzZXJ0aW9uUmVzdWx0c09wdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLmltcGwuQXNzZXJ0aW9uUmVzdWx0c09wdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5pbXBsLldTRExFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLmltcGwuV1NETFJlZmVyZW5jZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5BZGRTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5jb21tb24uaW1wbC5BZGRTdHlsZVNoZWV0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuZG9jdW1lbnQuRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5wcm9maWxlLlRlc3RBc3NlcnRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5Bc3NlcnRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGwuRmFpbHVyZURldGFpbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5pbXBsLlJlcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnhtbC5kb20uRWxlbWVudExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwucmVwb3J0LkFzc2VydGlvbkVycm9yOwotCi0vKioKLSAqIE1lc3NhZ2VBbmFseXplcgotICogCi0gKiBBIGNsYXNzIHRoYXQgYWxsb3dzIHNpbXBsZSBhY2Nlc3MgdG8gdGhlIFdTLUkgVGVzdCBUb29scyBpbiBvcmRlciB0byBhbmFseXplCi0gKiBtZXNzYWdlcyBpbiBhIGxvZyBmaWxlLgotICovCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlQW5hbHl6ZXIKLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy53c2kudGVzdC50b29scyI7Ci0gIAotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX1BPUlQgPSAicG9ydCI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfQklORElORyA9ICJiaW5kaW5nIjsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFlQRV9QT1JUVFlQRSA9ICJwb3J0dHlwZSI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfTUVTU0FHRSA9ICJtZXNzYWdlIjsKLQotICAvLyBUZXN0IHJlc3VsdCBTdHJpbmdzCi0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTk9UUEFTU0VEID0gIm5vdFBhc3NlZCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgV0FSTklORyA9ICJ3YXJuaW5nIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBGQUlMRUQgPSAiZmFpbGVkIjsKLSAgCi0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRSA9ICJmaWxlOiI7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBmaWxlbmFtZTsKLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsZmlsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgZWxlbWVudG5hbWUgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcGFyZW50bmFtZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBib29sZWFuIHdzZGxzcGVjaWZpZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIFN0cmluZyB0eXBlICA9IG51bGw7Ci0gIHByb3RlY3RlZCBMaXN0IGFzc2VydGlvbndhcm5pbmdzOwotICBwcm90ZWN0ZWQgTGlzdCBhc3NlcnRpb25lcnJvcnM7Ci0gIHByb3RlY3RlZCBXU0lQcmVmZXJlbmNlcyB3c2lQcmVmZXJlbmNlcyA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIE1lc3NhZ2VBbmFseXplci4KLSAgICogQHBhcmFtIGZpbGVuYW1lIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZUFuYWx5emVyKFN0cmluZyBmaWxlbmFtZSkKLSAgewotICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICAgIGFzc2VydGlvbndhcm5pbmdzID0gbmV3IFZlY3RvcigpOwotICAgIGFzc2VydGlvbmVycm9ycyA9IG5ldyBWZWN0b3IoKTsKLSAgCXRoaXMud3NpUHJlZmVyZW5jZXMgPSBXU0lUZXN0VG9vbHNFY2xpcHNlUHJvcGVydGllcy5jaGVja1dTSVByZWZlcmVuY2VzKGZpbGVuYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBNZXNzYWdlQW5hbHl6ZXIuCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBsb2cgZmlsZSBuYW1lLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VBbmFseXplcihTdHJpbmcgZmlsZW5hbWUsIFdTSVByZWZlcmVuY2VzIHdzaVByZWZlcmVuY2VzKQotICB7Ci0gICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOwotCi0gICAgYXNzZXJ0aW9ud2FybmluZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gICAgYXNzZXJ0aW9uZXJyb3JzID0gbmV3IFZlY3RvcigpOwotICAJdGhpcy53c2lQcmVmZXJlbmNlcyA9IHdzaVByZWZlcmVuY2VzOwotICB9Ci0KLSAgcHVibGljIE1lc3NhZ2VBbmFseXplcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB3c2RsZmlsZSwgU3RyaW5nIGVsZW1lbnRuYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgcGFyZW50bmFtZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgCXRoaXMoZmlsZW5hbWUpOwotICAJd3NkbHNwZWNpZmllZCA9IHRydWU7Ci0gIAkKLSAgCXRoaXMud3NkbGZpbGUgPSB3c2RsZmlsZTsKLSAgCXRoaXMuZWxlbWVudG5hbWUgPSBlbGVtZW50bmFtZTsKLSAgCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotICAJdGhpcy5wYXJlbnRuYW1lID0gcGFyZW50bmFtZTsKLSAgCXRoaXMudHlwZSA9IHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgTWVzc2FnZUFuYWx5emVyKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIHdzZGxmaWxlLCBTdHJpbmcgZWxlbWVudG5hbWUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBwYXJlbnRuYW1lLCBTdHJpbmcgdHlwZSwgV1NJUHJlZmVyZW5jZXMgd3NpUHJlZmVyZW5jZXMpCi0gIHsKLSAgCXRoaXMoZmlsZW5hbWUsIHdzaVByZWZlcmVuY2VzKTsKLSAgCXdzZGxzcGVjaWZpZWQgPSB0cnVlOwotICAJCi0gIAl0aGlzLndzZGxmaWxlID0gd3NkbGZpbGU7Ci0gIAl0aGlzLmVsZW1lbnRuYW1lID0gZWxlbWVudG5hbWU7Ci0gIAl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLSAgCXRoaXMucGFyZW50bmFtZSA9IHBhcmVudG5hbWU7Ci0gIAl0aGlzLnR5cGUgPSB0eXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB2YWxpZGF0ZUNvbmZvcm1hbmNlLgotICAgKiAKLSAgICogQ2hlY2tzIHRoZSBjb25mb3JtYW5jZSBvZiB0aGUgZ2l2ZW4gbG9nZmlsZSBhZ2FpbnN0IHRoZSBXUy1JIEJhc2ljIFByb2ZpbGUuCi0gICAqIElmIHRoZXJlIGFyZSBjb25mb3JtYW5jZSBwcm9ibGVtcyB0aGV5IGNhbiBiZSBvYnRhaW5lZCBmcm9tIGdldEFzc2VydGlvbkVycm9ycy4KLSAgICogCi0gICAqIEB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZm9ybWFuY2UoKSB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLQkgIFdTSVRlc3RUb29sc0VjbGlwc2VQcm9wZXJ0aWVzLnNldExvY2FsKCk7Ci0JICAKLQkgIGlmICh3c2lQcmVmZXJlbmNlcy5nZXRDb21wbGlhbmNlTGV2ZWwoKSAhPSBXU0lUZXN0VG9vbHNFY2xpcHNlUHJvcGVydGllcy5JR05PUkVfTk9OX1dTSSkKLQkgIHsKLSAgICAgICAgRG9jdW1lbnRGYWN0b3J5IGRvY3VtZW50RmFjdG9yeSA9IERvY3VtZW50RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBCYXNpY1Byb2ZpbGVBbmFseXplciB1c2luZyBhbiBhbmFseXplcmNvbmZpZyBvYmplY3QKLSAgICAgICAgQW5hbHl6ZXJDb25maWcgYW5hbHl6ZXJjb25maWcgPSBkb2N1bWVudEZhY3RvcnkubmV3QW5hbHl6ZXJDb25maWcoKTsKLSAgICAgICAgaWYod3NkbHNwZWNpZmllZCkKLSAgICAgICAgewotICAgICAgCSAgV1NETFJlZmVyZW5jZSB3c2RscmVmID0gbmV3IFdTRExSZWZlcmVuY2VJbXBsKCk7Ci0gICAgICAJICB3c2RscmVmLnNldFdTRExMb2NhdGlvbih3c2RsZmlsZSk7Ci0gICAgICAJCi0gICAgICAJICBXU0RMRWxlbWVudCB3c2RsZWxlbSA9IG5ldyBXU0RMRWxlbWVudEltcGwoKTsKLSAgICAgIAkgIHdzZGxlbGVtLnNldE5hbWUoZWxlbWVudG5hbWUpOwotICAgICAgCSAgd3NkbGVsZW0uc2V0TmFtZXNwYWNlKG5hbWVzcGFjZSk7Ci0gICAgICAJICB3c2RsZWxlbS5zZXRQYXJlbnRFbGVtZW50TmFtZShwYXJlbnRuYW1lKTsKLSAgICAgIAkgIHdzZGxlbGVtLnNldFR5cGUodHlwZSk7Ci0gICAgICAJCi0gICAgICAJICB3c2RscmVmLnNldFdTRExFbGVtZW50KHdzZGxlbGVtKTsKLSAgICAgIAkKLSAgICAgIAkgIGFuYWx5emVyY29uZmlnLnNldFdTRExSZWZlcmVuY2Uod3NkbHJlZik7Ci0gICAgICAgIH0KLQotICAgICAgICBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFybyA9IG5ldyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbCgpOwotICAgICAgICBhcm8uc2V0QXNzZXJ0aW9uUmVzdWx0VHlwZShBc3NlcnRpb25SZXN1bHRUeXBlLm5ld0luc3RhbmNlKE5PVFBBU1NFRCkpOwotICAgICAgICBhcm8uc2V0U2hvd0Fzc2VydGlvbkRlc2NyaXB0aW9uKGZhbHNlKTsKLSAgICAgICAgYXJvLnNldFNob3dGYWlsdXJlRGV0YWlsKGZhbHNlKTsKLSAgICAgICAgYXJvLnNldFNob3dGYWlsdXJlTWVzc2FnZShmYWxzZSk7Ci0gICAgICAgIGFyby5zZXRTaG93TWVzc2FnZUVudHJ5KGZhbHNlKTsKLQotICAgICAgICAvLyBhbHRob3VnaCB3ZSBkb24ndCB1c2UgYSBzdHlsZXNoZWV0IGZvciBvdXIgYXBwbGljYXRpb24gaXQgaXMgcmVxdWlyZWQgb3IgdGhlIAotICAgICAgICAvLyBXUy1JIHRvb2xzIHdpbGwgZmFpbAotICAgICAgICBBZGRTdHlsZVNoZWV0IGFkZHN0eWxlc2hlZXQgPSBuZXcgQWRkU3R5bGVTaGVldEltcGwoKTsKLQotICAgICAgICBhbmFseXplcmNvbmZpZy5zZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKGFybyk7Ci0gICAgICAgIGFuYWx5emVyY29uZmlnLnNldEFkZFN0eWxlU2hlZXQoYWRkc3R5bGVzaGVldCk7Ci0gICAgICAKLSAgICAgICAgYW5hbHl6ZXJjb25maWcuc2V0Q29ycmVsYXRpb25UeXBlKCJlbmRwb2ludCIpOwotICAJICAgIHRyeQotCQl7Ci0JCSAgYW5hbHl6ZXJjb25maWcuc2V0TG9nTG9jYXRpb24oVVJJRW5jb2Rlci5lbmNvZGUoZmlsZW5hbWUsICJVVEY4IikpOwotCQkgIGFuYWx5emVyY29uZmlnLnNldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbigKLQkJCSAgIFVSSUVuY29kZXIuZW5jb2RlKHdzaVByZWZlcmVuY2VzLmdldFRBREZpbGUoKSwgIlVURjgiKSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQotCQl7Ci0JCSAgYW5hbHl6ZXJjb25maWcuc2V0TG9nTG9jYXRpb24oVVJJRW5jb2Rlci5lbmNvZGUoZmlsZW5hbWUpKTsKLQkgICAgICBhbmFseXplcmNvbmZpZy5zZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oVVJJRW5jb2Rlci5lbmNvZGUod3NpUHJlZmVyZW5jZXMuZ2V0VEFERmlsZSgpKSk7Ci0JCX0KLSAgICAgICAgLy9hbmFseXplcmNvbmZpZy5zZXRMb2dMb2NhdGlvbihmaWxlbmFtZSk7Ci0gICAgICAgIC8vYW5hbHl6ZXJjb25maWcuc2V0VGVzdEFzc2VydGlvbnNEb2N1bWVudExvY2F0aW9uKGdldEJhc2ljUHJvZmlsZVRlc3RBc3NlcnRpb25zRmlsZSgpKTsKLSAgICAgICAgYW5hbHl6ZXJjb25maWcuc2V0VmVyYm9zZU9wdGlvbihmYWxzZSk7Ci0gICAgICAKLQotICAgICAgICBMaXN0IGFuYWx5emVyQ29uZmlncyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgYW5hbHl6ZXJDb25maWdzLmFkZChhbmFseXplcmNvbmZpZyk7Ci0gICAgICAgIC8vIGhlcmUncyB3aGVyZSB0aGUgdmFsaWRhdGlvbiBhY3R1YWxseSBzdGFydHMgaGFwcGVuaW5nCi0gICAgICAgIFdTSUJhc2ljUHJvZmlsZUFuYWx5emVyIGJwYW5hbHl6ZXIgPSBuZXcgV1NJQmFzaWNQcm9maWxlQW5hbHl6ZXIoYW5hbHl6ZXJDb25maWdzKTsKLQotICAgICAgICBicGFuYWx5emVyLnZhbGlkYXRlQWxsKCk7Ci0gICAgICAgIFJlcG9ydEltcGwgcmVwb3J0ID0gKFJlcG9ydEltcGwpIGJwYW5hbHl6ZXIuZ2V0UmVwb3J0KCk7Ci0KLSAgICAgICAgTGlzdCBlbnRyaWVzID0gcmVwb3J0LmdldEVudHJpZXMoKTsKLQotICAgICAgICAvLyBpZiB0aGVyZSBhcmUgcmVwb3J0IGVudHJpZXMgd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZW0gYW5kIGFkZCBhbGwKLSAgICAgICAgLy8gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgdG8gdGhlIGVycm9yIGxpc3QuCi0gICAgICAgIGlmIChlbnRyaWVzICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBJdGVyYXRvciBpZW50cnkgPSBlbnRyaWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgd2hpbGUgKGllbnRyeS5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgRW50cnkgZW50cnkgPSAoRW50cnkpIGllbnRyeS5uZXh0KCk7Ci0gICAgICAgICAgICBNYXAgYXNzZXJ0aW9uUmVzdWx0cyA9IGVudHJ5LmdldEFzc2VydGlvblJlc3VsdExpc3QoKTsKLQotICAgICAgICAgICAgaWYgKGFzc2VydGlvblJlc3VsdHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSXRlcmF0b3IgaWFzc2VydGlvblJlc3VsdHMgPSBhc3NlcnRpb25SZXN1bHRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgd2hpbGUgKGlhc3NlcnRpb25SZXN1bHRzLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBhciA9IChBc3NlcnRpb25SZXN1bHQpIGlhc3NlcnRpb25SZXN1bHRzLm5leHQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChhci5nZXRSZXN1bHQoKS5lcXVhbHNJZ25vcmVDYXNlKEZBSUxFRCkgJiYgCi0gICAgICAgICAgICAgICAgCXdzaVByZWZlcmVuY2VzLmdldENvbXBsaWFuY2VMZXZlbCgpLmVxdWFscyhXU0lUZXN0VG9vbHNFY2xpcHNlUHJvcGVydGllcy5TVE9QX05PTl9XU0kpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIFRlc3RBc3NlcnRpb24gdGEgPSBhci5nZXRBc3NlcnRpb24oKTsKLSAgICAgICAgICAgICAgICAgIGlmICh0YS5pc0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgZXJyb3JNZXNzYWdlcyA9IGFyLmdldEZhaWx1cmVEZXRhaWxMaXN0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcnJvck1lc3NhZ2VzLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIEZhaWx1cmVEZXRhaWxJbXBsIGZkaSA9IChGYWlsdXJlRGV0YWlsSW1wbCllcnJvck1lc3NhZ2VzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IChTdHJpbmcpIGZkaS5nZXRGYWlsdXJlTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5OdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50TG9jYXRpb24gZWwgPSBmZGkuZ2V0RWxlbWVudExvY2F0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyID0gZWwuZ2V0TGluZU51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyID0gZWwuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBnZXQgYXNzZXJ0aW9uIGxvY2F0aW9ucyBpbiB0aGUgbG9nIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRpb25lcnJvcnMuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFzc2VydGlvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgdGEuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJXUy1JIE1lc3NhZ2UgSUQgIiArIGVudHJ5LmdldFJlZmVyZW5jZUlEKCkgKyAiOiIgKyB0YS5nZXRGYWlsdXJlTWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlcikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyLmdldFJlc3VsdCgpLmVxdWFsc0lnbm9yZUNhc2UoRkFJTEVEKSAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICB3c2lQcmVmZXJlbmNlcy5nZXRDb21wbGlhbmNlTGV2ZWwoKS5lcXVhbHMoV1NJVGVzdFRvb2xzRWNsaXBzZVByb3BlcnRpZXMuV0FSTl9OT05fV1NJKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBUZXN0QXNzZXJ0aW9uIHRhID0gYXIuZ2V0QXNzZXJ0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICBpZiAodGEuaXNFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGVycm9yTWVzc2FnZXMgPSBhci5nZXRGYWlsdXJlRGV0YWlsTGlzdCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICIiOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZXJyb3JNZXNzYWdlcy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlRGV0YWlsSW1wbCBmZGkgPSAoRmFpbHVyZURldGFpbEltcGwpZXJyb3JNZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAoU3RyaW5nKSBmZGkuZ2V0RmFpbHVyZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uTnVtYmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgRWxlbWVudExvY2F0aW9uIGVsID0gZmRpLmdldEVsZW1lbnRMb2NhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IGVsLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciA9IGVsLmdldENvbHVtbk51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGdldCBhc3NlcnRpb24gbG9jYXRpb25zIGluIHRoZSBsb2cgZmlsZQotICAgICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbndhcm5pbmdzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3NlcnRpb25FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBJRCAiICsgZW50cnkuZ2V0UmVmZXJlbmNlSUQoKSArICI6IiArIHRhLmdldEZhaWx1cmVNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gCi0JICB9Ci0gICAgfQotICAgIGNhdGNoIChXU0lFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJQW5hbHl6ZXJFeGNlcHRpb24oIlRoZSBNZXNzYWdlQW5hbHl6ZXIgd2FzIHVuYWJsZSB0byB2YWxpZGF0ZSB0aGUgZ2l2ZW4gbG9nZmlsZS4iLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBXU0lBbmFseXplckV4Y2VwdGlvbigiVGhlIE1lc3NhZ2VBbmFseXplciB3YXMgdW5hYmxlIHRvIHZhbGlkYXRlIHRoZSBnaXZlbiBsb2dmaWxlLiIpOwotICAgIH0KLQotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRBc3NlcnRpb25XYXJuaW5ncy4KLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgYW55IGFzc2VydGlvbiB3YXJuaW5ncyBnZW5lcmF0ZWQgZnJvbSB2YWxpZGF0ZUNvbmZvcm1hbmNlLgotICAgKiBAcmV0dXJuIExpc3QKLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEFzc2VydGlvbldhcm5pbmdzKCkKLSAgewotICAgIHJldHVybiBhc3NlcnRpb253YXJuaW5nczsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgZ2V0QXNzZXJ0aW9uRmFpbHVyZXMuCi0gICAqIFJldHVybnMgYSBsaXN0IG9mIGFueSBhc3NlcnRpb24gZXJyb3JzIGdlbmVyYXRlZCBmcm9tIHZhbGlkYXRlQ29uZm9ybWFuY2UuCi0gICAqIEByZXR1cm4gTGlzdAotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0QXNzZXJ0aW9uRXJyb3JzKCkKLSAgewotICAgIHJldHVybiBhc3NlcnRpb25lcnJvcnM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL1dTRExBbmFseXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvYW5hbHl6ZXIvV1NETEFuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNmRlMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvYW5hbHl6ZXIvV1NETEFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5hbmFseXplcjsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5VUklFbmNvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuV1NJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5XU0lUZXN0VG9vbHNFY2xpcHNlUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLldTSVRlc3RUb29sc1Byb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5BbmFseXplckNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLkFzc2VydGlvblJlc3VsdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuV1NETEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmFuYWx5emVyLmNvbmZpZy5XU0RMUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5Bc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuY29uZmlnLmltcGwuV1NETEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5hbmFseXplci5jb25maWcuaW1wbC5XU0RMUmVmZXJlbmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuY29tbW9uLkFkZFN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmNvbW1vbi5pbXBsLkFkZFN0eWxlU2hlZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5kb2N1bWVudC5Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUuVGVzdEFzc2VydGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkFzc2VydGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5GYWlsdXJlRGV0YWlsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUucmVwb3J0LmltcGwuUmVwb3J0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLmRvbS5FbGVtZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5yZXBvcnQuQXNzZXJ0aW9uRXJyb3I7Ci0KLS8qKgotICogV1NETEFuYWx5emVyCi0gKiBUaGUgaW50ZXJmYWNlIHRvIHRoZSBXUy1JIFRlc3QgVG9vbHMgZm9yIGFuYWx5emluZyBhIFdTREwgZmlsZS4gIEFsbG93cyBhIFdTREwgZmlsZSB0byBiZSBhbmFseXplZAotICogYXQgYW55IG9mIHRoZSBmb2xsb3dpbmcgbGV2ZWxzLgotICogIHBvcnQKLSAqICBiaW5kaW5nCi0gKiAgcG9ydFR5cGUKLSAqICBvcGVyYXRpb24KLSAqICBtZXNzYWdlCi0gKi8KLQotcHVibGljIGNsYXNzIFdTRExBbmFseXplcgotewotICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLndzaS50ZXN0LnRvb2xzIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlQgPSAicG9ydCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkRJTkcgPSAiYmluZGluZyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRUWVBFID0gInBvcnRUeXBlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAibWVzc2FnZSI7Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBOT1RQQVNTRUQgPSAibm90UGFzc2VkIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIndhcm5pbmciOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEZBSUxFRCA9ICJmYWlsZWQiOwotICAKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGU6Ly8iOwotCi0gIHByb3RlY3RlZCBMaXN0IGFuYWx5emVyQ29uZmlnczsKLSAgcHJvdGVjdGVkIFN0cmluZyB3c2RsVVJJOwotICAvLyBhc3NlcnRpb25zIHRvIGlnbm9yZSAtIHVzZWQgZm9yIGFzc2VydGlvbnMgdGhhdCB0aGUgdG9vbHMgaGF2ZSBub3QgaW1wbGVtZW50ZWQgcHJvcGVybHkgeWV0Ci0gIC8vcHJvdGVjdGVkIFN0cmluZ1tdIGlnbm9yZUFzc2VydGlvbnMgPSB7IC8qIldTSTIxMDUiICwgIldTSTIxMTkiKi99OwotICBwcm90ZWN0ZWQgTGlzdCBhc3NlcnRpb25lcnJvcnM7Ci0gIHByb3RlY3RlZCBMaXN0IGFzc2VydGlvbndhcm5pbmdzOwotICBwcm90ZWN0ZWQgV1NJUHJlZmVyZW5jZXMgd3NpUHJlZmVyZW5jZXMgPSBudWxsOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogR2l2ZW4gdGhlIGZpbGUgbmFtZSwgcGFyZW50IGVsZW1lbnQgbmFtZSwgdGhlIGVsZW1lbnQgdG8gYW5hbHl6ZSBhbmQgdGhlIHR5cGUgb2YgZWxlbWVudAotICAgKiBzZXRzIHVwIHRoZSBXU0RMQW5hbHl6ZXIgdG8gYW5hbHl6ZSB0aGUgZmlsZS4KLSAgICogQHBhcmFtIGZpbGVOYW1lIGxvZyBmaWxlIG5hbWUuCi0gICAqIEBwYXJhbSBwYXJlbnROYW1lIHBhcmVudCBlbGVtZW50IG5hbWUuCi0gICAqIEBwYXJhbSBuYW1lc3BhY2UgIGEgbmFtZXNwYWNlLgotICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIGVsZW1lbnQgdG8gYW5hbHl6ZS4KLSAgICogQHBhcmFtIGVsZW1lbnRUeXBlIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gd3NpUHJlZmVyZW5jZXMgdGhlIHByZWZlcmVuY2VzLgotICAgKiBAdGhyb3dzIFdTSUFuYWx5emVyRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBhZGQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHB1YmxpYyBXU0RMQW5hbHl6ZXIoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgZWxlbWVudFR5cGUsIFdTSVByZWZlcmVuY2VzIHdzaVByZWZlcmVuY2VzKSB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24KLSAgewotICAgIHRoaXMoZmlsZU5hbWUsIHdzaVByZWZlcmVuY2VzKTsKLSAgICBhZGRDb25maWd1cmF0aW9uVG9UZXN0KHBhcmVudE5hbWUsIG5hbWVzcGFjZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBHaXZlbiB0aGUgZmlsZSBuYW1lLCBwYXJlbnQgZWxlbWVudCBuYW1lLCB0aGUgZWxlbWVudCB0byBhbmFseXplIGFuZCB0aGUgdHlwZSBvZiBlbGVtZW50Ci0gICAqIHNldHMgdXAgdGhlIFdTRExBbmFseXplciB0byBhbmFseXplIHRoZSBmaWxlLgotICAgKiBAcGFyYW0gZmlsZU5hbWUgbG9nIGZpbGUgbmFtZS4KLSAgICogQHBhcmFtIHBhcmVudE5hbWUgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZSAgYSBuYW1lc3BhY2UuCi0gICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCB0byBhbmFseXplLgotICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGFkZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIFdTRExBbmFseXplcihTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBwYXJlbnROYW1lLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBlbGVtZW50VHlwZSkgdGhyb3dzIFdTSUFuYWx5emVyRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKGZpbGVOYW1lKTsKLSAgICBhZGRDb25maWd1cmF0aW9uVG9UZXN0KHBhcmVudE5hbWUsIG5hbWVzcGFjZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTsKLQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZmlsZU5hbWUgIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgV1NETEFuYWx5emVyKFN0cmluZyBmaWxlTmFtZSwgV1NJUHJlZmVyZW5jZXMgd3NpUHJlZmVyZW5jZXMpCi0gIHsKLSAgICByZXNldChmaWxlTmFtZSk7Ci0gICAgdGhpcy53c2lQcmVmZXJlbmNlcyA9IHdzaVByZWZlcmVuY2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiBAcGFyYW0gZmlsZU5hbWUgIGxvZyBmaWxlIG5hbWUuCi0gICAqLwotICBwdWJsaWMgV1NETEFuYWx5emVyKFN0cmluZyBmaWxlTmFtZSkKLSAgewotICAgIHJlc2V0KGZpbGVOYW1lKTsKLSAgICBpZihXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLmdldEVjbGlwc2VDb250ZXh0KCkpCi0gICAgewotICAgICAgdGhpcy53c2lQcmVmZXJlbmNlcyA9IFdTSVRlc3RUb29sc0VjbGlwc2VQcm9wZXJ0aWVzLmNoZWNrV1NJUHJlZmVyZW5jZXMoZmlsZU5hbWUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAJICB0aGlzLndzaVByZWZlcmVuY2VzID0gV1NJVGVzdFRvb2xzUHJvcGVydGllcy5jaGVja1dTSVByZWZlcmVuY2VzKGZpbGVOYW1lKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgV1NJUHJlZmVyZW5jZXMgZ2V0V1NJUHJlZmVyZW5jZXMoKQotICB7Ci0JICByZXR1cm4gdGhpcy53c2lQcmVmZXJlbmNlczsKLSAgfQotCSAgCi0gIC8qKgotICAgKiB2YWxpZGF0ZUNvbmZvcm1hbmNlLgotICAgKiBWYWxpZGF0ZSB0aGUgV1NETCBmaWxlIGFzIHNldHVwIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICogQHRocm93cyBXU0lBbmFseXplckV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gdmFsaWRhdGUgdGhlIGdpdmVuIFdTREwgRmlsZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZm9ybWFuY2UoKSB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuc2V0TG9jYWwoKTsKLQkgIAotCSAgaWYgKHdzaVByZWZlcmVuY2VzLmdldENvbXBsaWFuY2VMZXZlbCgpICE9IFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuSUdOT1JFX05PTl9XU0kpCi0JICB7Ci0gICAgICAgIC8vIGhlcmUncyB3aGVyZSB0aGUgdmFsaWRhdGlvbiBhY3R1YWxseSBzdGFydHMgaGFwcGVuaW5nCi0gICAgICAgIFdTSUJhc2ljUHJvZmlsZUFuYWx5emVyIGJwYW5hbHl6ZXIgPSBuZXcgV1NJQmFzaWNQcm9maWxlQW5hbHl6ZXIoYW5hbHl6ZXJDb25maWdzLHdzZGxVUkkpOwotICAgICAgICBicGFuYWx5emVyLnZhbGlkYXRlQWxsKCk7Ci0gICAgICAgIFJlcG9ydEltcGwgcmVwb3J0ID0gKFJlcG9ydEltcGwpIGJwYW5hbHl6ZXIuZ2V0UmVwb3J0KCk7Ci0KLSAgICAgICAgTGlzdCBlbnRyaWVzID0gcmVwb3J0LmdldEVudHJpZXMoKTsKLQotICAgICAgICAvLyBpZiB0aGVyZSBhcmUgcmVwb3J0IGVudHJpZXMgd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZW0gYW5kIGFkZCBhbGwKLSAgICAgICAgLy8gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgdG8gdGhlIGVycm9yIGxpc3QuIAotICAgICAgICBpZiAoZW50cmllcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgSXRlcmF0b3IgaWVudHJ5ID0gZW50cmllcy5pdGVyYXRvcigpOwotICAgICAgICAgIHdoaWxlIChpZW50cnkuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpZW50cnkubmV4dCgpOwotICAgICAgICAgICAgTWFwIGFzc2VydGlvblJlc3VsdHMgPSBlbnRyeS5nZXRBc3NlcnRpb25SZXN1bHRMaXN0KCk7Ci0KLSAgICAgICAgICAgIGlmIChhc3NlcnRpb25SZXN1bHRzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEl0ZXJhdG9yIGlhc3NlcnRpb25SZXN1bHRzID0gYXNzZXJ0aW9uUmVzdWx0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgIHdoaWxlIChpYXNzZXJ0aW9uUmVzdWx0cy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgYXIgPSAoQXNzZXJ0aW9uUmVzdWx0KSBpYXNzZXJ0aW9uUmVzdWx0cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgVGVzdEFzc2VydGlvbiB0YSA9IGFyLmdldEFzc2VydGlvbigpOwotICAgICAgICAgICAgICAgIC8vIGFkZCBpbiB0byBza2lwIGVycm9ycyBmb3IgYXNzZXJ0aW9ucyB0aGF0IGFyZSByZXBvcnRpbmcgaW5jb3JyZWN0IHByb2JsZW1zLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIG5vdCByZXBvcnQgaW5jb3JyZWN0IGVycm9ycyByZXBvcnRlZCBpbiB0aGUgdG9vbHMgd2l0aG91dCBkaXNhYmxpbmcgdGhlbQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICBTdHJpbmcgYXNzZXJ0aW9uSWQgPSB0YS5nZXRJZCgpOwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICBib29sZWFuIGlnbm9yZUFzc2VydGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICBmb3IoaW50IGkgPSBpZ25vcmVBc3NlcnRpb25zLmxlbmd0aC0xOyBpID49MDtpLS0pCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgCWlmKGlnbm9yZUFzc2VydGlvbnNbaV0uZXF1YWxzSWdub3JlQ2FzZShhc3NlcnRpb25JZCkpCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIAkJaWdub3JlQXNzZXJ0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICBpZihpZ25vcmVBc3NlcnRpb24pCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgCWNvbnRpbnVlOwotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFyLmdldFJlc3VsdCgpLmVxdWFsc0lnbm9yZUNhc2UoRkFJTEVEKSAmJiAKLSAgICAgICAgICAgICAgICAJd3NpUHJlZmVyZW5jZXMuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZXF1YWxzKFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuU1RPUF9OT05fV1NJKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAodGEuaXNFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgZXJyb3JNZXNzYWdlTGlzdCA9IGFyLmdldEZhaWx1cmVEZXRhaWxMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2VMaXN0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBlcnJvck1lc3NhZ2VzID0gZXJyb3JNZXNzYWdlTGlzdC5pdGVyYXRvcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVycm9yTWVzc2FnZXMuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZhaWx1cmVEZXRhaWxJbXBsIGZkaSA9IChGYWlsdXJlRGV0YWlsSW1wbCkgZXJyb3JNZXNzYWdlcy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IChTdHJpbmcpIGZkaS5nZXRGYWlsdXJlTWVzc2FnZSgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uTnVtYmVyID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudExvY2F0aW9uIGVsID0gZmRpLmdldEVsZW1lbnRMb2NhdGlvbigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciA9IGVsLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyID0gZWwuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbmVycm9ycy5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBc3NlcnRpb25FcnJvcih0YS5nZXRJZCgpLCB0YS5nZXRGYWlsdXJlTWVzc2FnZSgpLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVycm9yTWVzc2FnZUxpc3QgaXMgbnVsbCBidXQgdGhlcmUgaXMgYW4gZXJyb3Igc28gYXNzaWduIGl0IHRvIGxpbmUgMCBmb3Igbm93Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGFzc2VydGlvbmVycm9ycy5hZGQobmV3IEFzc2VydGlvbkVycm9yKHRhLmdldElkKCksIHRhLmdldEZhaWx1cmVNZXNzYWdlKCksIDAsIDApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhci5nZXRSZXN1bHQoKS5lcXVhbHNJZ25vcmVDYXNlKEZBSUxFRCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgd3NpUHJlZmVyZW5jZXMuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZXF1YWxzKFdTSVRlc3RUb29sc1Byb3BlcnRpZXMuV0FSTl9OT05fV1NJKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAodGEuaXNFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3QgZXJyb3JNZXNzYWdlTGlzdCA9IGFyLmdldEZhaWx1cmVEZXRhaWxMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvck1lc3NhZ2VMaXN0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBlcnJvck1lc3NhZ2VzID0gZXJyb3JNZXNzYWdlTGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChlcnJvck1lc3NhZ2VzLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlRGV0YWlsSW1wbCBmZGkgPSAoRmFpbHVyZURldGFpbEltcGwpIGVycm9yTWVzc2FnZXMubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAoU3RyaW5nKSBmZGkuZ2V0RmFpbHVyZU1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbk51bWJlciA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRMb2NhdGlvbiBlbCA9IGZkaS5nZXRFbGVtZW50TG9jYXRpb24oKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBlbC5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlciA9IGVsLmdldENvbHVtbk51bWJlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0aW9ud2FybmluZ3MuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXNzZXJ0aW9uRXJyb3IodGEuZ2V0SWQoKSwgdGEuZ2V0RmFpbHVyZU1lc3NhZ2UoKSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlcnJvck1lc3NhZ2VMaXN0IGlzIG51bGwgYnV0IHRoZXJlIGlzIGFuIGVycm9yIHNvIGFzc2lnbiBpdCB0byBsaW5lIDAgZm9yIG5vdwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRpb253YXJuaW5ncy5hZGQobmV3IEFzc2VydGlvbkVycm9yKHRhLmdldElkKCksIHRhLmdldEZhaWx1cmVNZXNzYWdlKCksIDAsIDApKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCSAgfQotICAgIH0KLQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJQW5hbHl6ZXJFeGNlcHRpb24oZSArICJUaGUgV1NETEFuYWx5emVyIHdhcyB1bmFibGUgdG8gdmFsaWRhdGUgdGhlIGdpdmVuIFdTREwgRmlsZS4iKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIHBhcmVudE5hbWUgcGFyZW50IGVsZW1lbnQgbmFtZS4KLSAgICogQHBhcmFtIG5hbWVzcGFjZSAgYSBuYW1lc3BhY2UuCi0gICAqIEBwYXJhbSBlbGVtZW50TmFtZSB0aGUgZWxlbWVudCB0byBhbmFseXplLgotICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQuCi0gICAqIEB0aHJvd3MgV1NJQW5hbHl6ZXJFeGNlcHRpb24gaWYgdW5hYmxlIHRvIGFkZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvblRvVGVzdCgKLSAgICBTdHJpbmcgcGFyZW50TmFtZSwKLSAgICBTdHJpbmcgbmFtZXNwYWNlLAotICAgIFN0cmluZyBlbGVtZW50TmFtZSwKLSAgICBTdHJpbmcgZWxlbWVudFR5cGUpIHRocm93cyBXU0lBbmFseXplckV4Y2VwdGlvbgotICB7Ci0gIAl0cnkKLSAgCXsKLSAgICAgIFdTRExSZWZlcmVuY2Ugd3NkbFJlZmVyZW5jZSA9IG5ldyBXU0RMUmVmZXJlbmNlSW1wbCgpOwotCi0gICAgICBXU0RMRWxlbWVudCB3c2RsRWxlbWVudCA9IChXU0RMRWxlbWVudCkgbmV3IFdTRExFbGVtZW50SW1wbCgpOwotICAgICAgd3NkbEVsZW1lbnQuc2V0VHlwZShlbGVtZW50VHlwZSk7Ci0gICAgICBpZiAocGFyZW50TmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB3c2RsRWxlbWVudC5zZXRQYXJlbnRFbGVtZW50TmFtZShwYXJlbnROYW1lKTsKLSAgICAgIH0KLSAgICAgIHdzZGxFbGVtZW50LnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotICAgICAgd3NkbEVsZW1lbnQuc2V0TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgICB3c2RsUmVmZXJlbmNlLnNldFdTRExFbGVtZW50KHdzZGxFbGVtZW50KTsKLQotICAgICAgd3NkbFJlZmVyZW5jZS5zZXRXU0RMTG9jYXRpb24oRklMRSArIHdzZGxVUkkpOwotICAgICAgRG9jdW1lbnRGYWN0b3J5IGRvY3VtZW50RmFjdG9yeSA9IERvY3VtZW50RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgQmFzaWNQcm9maWxlQW5hbHl6ZXIgdXNpbmcgYW4gYW5hbHl6ZXJjb25maWcgb2JqZWN0Ci0gICAgICBBbmFseXplckNvbmZpZyBhbmFseXplcmNvbmZpZyA9IGRvY3VtZW50RmFjdG9yeS5uZXdBbmFseXplckNvbmZpZygpOwotCi0gICAgICBBc3NlcnRpb25SZXN1bHRzT3B0aW9uIGFybyA9IG5ldyBBc3NlcnRpb25SZXN1bHRzT3B0aW9uSW1wbCgpOwotICAgICAgYXJvLnNldEFzc2VydGlvblJlc3VsdFR5cGUoQXNzZXJ0aW9uUmVzdWx0VHlwZS5uZXdJbnN0YW5jZShOT1RQQVNTRUQpKTsKLSAgICAgIGFyby5zZXRTaG93QXNzZXJ0aW9uRGVzY3JpcHRpb24oZmFsc2UpOwotICAgICAgYXJvLnNldFNob3dGYWlsdXJlRGV0YWlsKGZhbHNlKTsKLSAgICAgIGFyby5zZXRTaG93RmFpbHVyZU1lc3NhZ2UoZmFsc2UpOwotICAgICAgYXJvLnNldFNob3dNZXNzYWdlRW50cnkoZmFsc2UpOwotCi0gICAgICAvLyBhbHRob3VnaCB3ZSBkb24ndCB1c2UgYSBzdHlsZXNoZWV0IGZvciBvdXIgYXBwbGljYXRpb24gaXQgaXMgcmVxdWlyZWQgb3IgdGhlIAotICAgICAgLy8gV1MtSSB0b29scyB3aWxsIGZhaWwKLSAgICAgIEFkZFN0eWxlU2hlZXQgYWRkc3R5bGVzaGVldCA9IG5ldyBBZGRTdHlsZVNoZWV0SW1wbCgpOwotCi0gICAgICBhbmFseXplcmNvbmZpZy5zZXRBc3NlcnRpb25SZXN1bHRzT3B0aW9uKGFybyk7Ci0gICAgICBhbmFseXplcmNvbmZpZy5zZXRBZGRTdHlsZVNoZWV0KGFkZHN0eWxlc2hlZXQpOwotICAgICAgYW5hbHl6ZXJjb25maWcuc2V0UmVwbGFjZVJlcG9ydCh0cnVlKTsKLSAgICAgIC8vYW5hbHl6ZXJjb25maWcuc2V0TG9nTG9jYXRpb24oZmlsZW5hbWUpOwotCSAgdHJ5Ci0JIHsKLQkgICBhbmFseXplcmNvbmZpZy5zZXRUZXN0QXNzZXJ0aW9uc0RvY3VtZW50TG9jYXRpb24oCi0JCSBVUklFbmNvZGVyLmVuY29kZSh3c2lQcmVmZXJlbmNlcy5nZXRUQURGaWxlKCksICJVVEY4IikpOwotCSB9Ci0JIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlZSkKLQkgewotCSAgIGFuYWx5emVyY29uZmlnLnNldFRlc3RBc3NlcnRpb25zRG9jdW1lbnRMb2NhdGlvbihVUklFbmNvZGVyLmVuY29kZSh3c2lQcmVmZXJlbmNlcy5nZXRUQURGaWxlKCkpKTsKLQotCSB9Ci0gICAgICBhbmFseXplcmNvbmZpZy5zZXRWZXJib3NlT3B0aW9uKGZhbHNlKTsKLQotICAgICAgLy8gc2V0IHRoZSB3c2RsUmVmZXJlbmNlCi0gICAgICBhbmFseXplcmNvbmZpZy5zZXRXU0RMUmVmZXJlbmNlKHdzZGxSZWZlcmVuY2UpOwotICAgICAgYW5hbHl6ZXJDb25maWdzLmFkZChhbmFseXplcmNvbmZpZyk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgV1NJQW5hbHl6ZXJFeGNlcHRpb24oIlVuYWJsZSB0byBhZGQgQW5hbHl6ZXJDb25maWcgdG8gbGlzdC4gIiArIGUpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogTWV0aG9kIGdldEFzc2VydGlvbkZhaWx1cmVzLgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBhc3NlcnRpb24gZmFpbHVyZXMuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBhc3NlcnRpb24gZmFpbHVyZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRBc3NlcnRpb25FcnJvcnMoKQotICB7Ci0gICAgcmV0dXJuIGFzc2VydGlvbmVycm9yczsKLSAgfQotCi0gIC8qKgotICAJICogTWV0aG9kIGdldEFzc2VydGlvbldhcm5pbmdzLgotICAJICogUmV0dXJucyBhIGxpc3Qgb2YgYW55IGFzc2VydGlvbiB3YXJuaW5ncyBnZW5lcmF0ZWQgZnJvbSB2YWxpZGF0ZUNvbmZvcm1hbmNlLgotICAJICogQHJldHVybiBhIGxpc3Qgb2YgYW55IGFzc2VydGlvbiB3YXJuaW5ncyBnZW5lcmF0ZWQgZnJvbSB2YWxpZGF0ZUNvbmZvcm1hbmNlLgotICAJICovCi0gIHB1YmxpYyBMaXN0IGdldEFzc2VydGlvbldhcm5pbmdzKCkKLSAgewotICAgIHJldHVybiBhc3NlcnRpb253YXJuaW5nczsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJlc2V0LgotICAgKiBAcGFyYW0gZmlsZW5hbWUgbG9nIGZpbGUgbmFtZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBmaWxlbmFtZSkKLSAgewotCXRyeQotCXsKLQkgIHdzZGxVUkkgPSBVUklFbmNvZGVyLmVuY29kZShmaWxlbmFtZSwgIlVURjgiKTsKLQl9Ci0JY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKQotCXsKLQkgIHdzZGxVUkkgPSBVUklFbmNvZGVyLmVuY29kZShmaWxlbmFtZSk7Ci0JfQotICAJYW5hbHl6ZXJDb25maWdzID0gbmV3IFZlY3RvcigpOwotICAJYXNzZXJ0aW9uZXJyb3JzID0gbmV3IFZlY3RvcigpOwotICAJYXNzZXJ0aW9ud2FybmluZ3MgPSBuZXcgVmVjdG9yKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL1dTSUFuYWx5emVyRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9hbmFseXplci9XU0lBbmFseXplckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc3ODUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL1dTSUFuYWx5emVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmFuYWx5emVyOwotCi0vKioKLSAqIEFuYWx5emVyRXhjZXB0aW9uCi0gKiAKLSAqIEV4Y2VwdGlvbiB0byBiZSB0aHJvd24gaWYgYW4gYW5hbHl6ZXIgZmFpbHMKLSAqLwotcHVibGljIGNsYXNzIFdTSUFuYWx5emVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gIC8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzgzNTE1ODM1MDIxOTE5NDY3N0w7Ci0JLyoqCi0gICAqIFRocm93YWJsZS4KLSAgICovCi0gIHByb3RlY3RlZCBUaHJvd2FibGUgdGhyb3dhYmxlID0gbnVsbDsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFuYWx5emVyRXhjZXB0aW9uLgotICAgKi8KLSAgcHVibGljIFdTSUFuYWx5emVyRXhjZXB0aW9uKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFuYWx5emVyRXhjZXB0aW9uLgotICAgKiBAcGFyYW0gcyBkZXRhaWwgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBXU0lBbmFseXplckV4Y2VwdGlvbihTdHJpbmcgcykKLSAgewotICAgIHN1cGVyKHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBleGNlcHRpb24gd2l0aCBhIG1lc3NhZ2UgYW5kIHJlbGF0ZWQgZXhjZXB0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIG1zZyAgICAgICAgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAqIEBwYXJhbSB0aHJvd2FibGUgIHRocm93YWJsZSB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhpcyBleGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBXU0lBbmFseXplckV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKQotICB7Ci0gICAgLy8gRXhjZXB0aW9uCi0gICAgc3VwZXIobXNnKTsKLQotICAgIC8vIFNhdmUgaW5wdXQgcmVmZXJlbmNlCi0gICAgdGhpcy50aHJvd2FibGUgPSB0aHJvd2FibGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0J3MgdmFsdWVzLgotICAgKgotICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRldGFpbCBtZXNzYWdlIG9mIHRoaXMgdGhyb3dhYmxlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGlzIGV4Y2VwdGlvbiB0byBiZSBjcmVhdGVkLgotICAgKiAKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBlbmNhcHN1bGF0ZWQgdGhyb3dhYmxlIG9iamVjdC4KLSAgICovCi0gIHB1YmxpYyBUaHJvd2FibGUgZ2V0VGFyZ2V0RXhjZXB0aW9uKCkKLSAgewotICAgIC8vIFJldHVybiB0aHJvd2FibGUKLSAgICByZXR1cm4gdGhyb3dhYmxlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL1dTSUJhc2ljUHJvZmlsZUFuYWx5emVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9hbmFseXplci9XU0lCYXNpY1Byb2ZpbGVBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjliOTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2FuYWx5emVyL1dTSUJhc2ljUHJvZmlsZUFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmFuYWx5emVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuVG9vbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLldTSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUuYW5hbHl6ZXIuQmFzaWNQcm9maWxlQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnByb2ZpbGUudmFsaWRhdG9yLlByb2ZpbGVWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS51dGlsLk1lc3NhZ2VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRGYWN0b3J5SW1wbDsKLQotLyoqCi0gKiBXU0lCYXNpY1Byb2ZpbGVBbmFseXplcgotICogCi0gKiBBbiBleHRlbnNpb24gb2YgdGhlIEJhc2ljUHJvZmlsZUFuYWx5emVyIGZyb20gdGhlIFdTLUkgVGVzdCBUb29scyB0aGF0Ci0gKiBhbGxvd3MgY2FsbGluZyBjb2RlIHRvIGdldCB0aGUgcmVwb3J0IGdlbmVyYXRlZCBmcm9tIFdTLUkgdmFsaWRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFdTSUJhc2ljUHJvZmlsZUFuYWx5emVyIGV4dGVuZHMgQmFzaWNQcm9maWxlQW5hbHl6ZXIKLXsKLSAgLyoqCi0gICAqIERlZmF1bHQgZG9jdW1lbnQgZmFjdG9yeSBjbGFzcyBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGX0RPQ1VNRU5UX0ZBQ1RPUlkgPSAib3JnLmVjbGlwc2Uud3NpLnRlc3QudG9vbHMudXRpbC5kb2N1bWVudC5Eb2N1bWVudEZhY3RvcnlJbXBsIjsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIFdTSUJhc2ljUHJvZmlsZUFuYWx5emVyLgotICAgKiBAcGFyYW0gYW5hbHl6ZXJDb25maWcgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIHdzZGxVUkkgdGhlIGxvY2F0aW9uIG9mIHRoZSBXU0RMIGRvY3VtZW50LgotICAgKiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBAdGhyb3dzIFdTSUV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gY3JlYXRlIGEgQmFzaWMgcHJvZmlsZSBhbmFseXplci4KLSAgICovCi0gIHB1YmxpYyBXU0lCYXNpY1Byb2ZpbGVBbmFseXplcihMaXN0IGFuYWx5emVyQ29uZmlnLCBTdHJpbmcgd3NkbFVSSSkgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgc3VwZXIoYW5hbHl6ZXJDb25maWcsIHdzZGxVUkkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yIGZvciBXU0lCYXNpY1Byb2ZpbGVBbmFseXplci4KLSAgICogQHBhcmFtIGFuYWx5emVyQ29uZmlnIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIEB0aHJvd3MgV1NJRXhjZXB0aW9uIEB0aHJvd3MgV1NJRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgYSBCYXNpYyBwcm9maWxlIGFuYWx5emVyLgotICAgKi8KLSAgcHVibGljIFdTSUJhc2ljUHJvZmlsZUFuYWx5emVyKExpc3QgYW5hbHl6ZXJDb25maWcpIHRocm93cyBXU0lFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKGFuYWx5emVyQ29uZmlnKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21tb24gaW5pdGlhbGl6YXRpb24uCi0gICAqIEBwYXJhbSB0b29sSW5mbyBhIFRvb2xJbmZvIG9iamVjdC4KLSAgICogQHRocm93cyBXU0lFeGNlcHRpb24gaWYgcHJvYmxlbXMgZHVyaW5nIGluaXRpYWxpemF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgaW5pdChUb29sSW5mbyB0b29sSW5mbykgdGhyb3dzIFdTSUV4Y2VwdGlvbgotICB7Ci0gICAgdGhpcy50b29sSW5mbyA9IHRvb2xJbmZvOwotICAgIAotICAgIC8vIENyZWF0ZSBtZXNzYWdlIGxpc3QKLSAgICBtZXNzYWdlTGlzdCA9IG5ldyBNZXNzYWdlTGlzdChSRVNPVVJDRV9CVU5ETEVfTkFNRSk7Ci0KLSAgICAvLyBDcmVhdGUgcHJvZmlsZSB2YWxpZGF0b3IgZmFjdG9yeQotICAgIGZhY3RvcnkgPSBQcm9maWxlVmFsaWRhdG9yRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0gICAgLy8gQ3JlYXRlIGRvY3VtZW50IGZhY3RvcnkKLSAgICBkb2N1bWVudEZhY3RvcnkgPSBuZXcgRG9jdW1lbnRGYWN0b3J5SW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRSZXBvcnQuCi0gICAqIAotICAgKiBSZXR1cm4gdGhlIFJlcG9ydCBnZW5lcmF0ZWQgYnkgdGhlIHZhbGlkYXRpb24uCi0gICAqIEByZXR1cm4gdGhlIFJlcG9ydCBnZW5lcmF0ZWQgYnkgdGhlIHZhbGlkYXRpb24uCi0gICAqLwotICBwdWJsaWMgUmVwb3J0IGdldFJlcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gcmVwb3J0ZXIuZ2V0UmVwb3J0KCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjllYWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuaW1wbC5SZXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwucmVwb3J0LlJlcG9ydE5vV3JpdGVySW1wbDsKLQotLyoqCi0gKiBEb2N1bWVudEZhY3RvcnlJbXBsCi0gKiAKLSAqIEV4dGVuZHMgdGhlIFdTLUkgVGVzdCBUb29scyBkb2N1bWVudCBmYWN0b3J5IHRvIHNwZWNpZnkgc3BlY2lmaWMgUmVwb3J0Ci0gKiBhbmQgUmVwb3J0V3JpdGVyIGNsYXNzZXMgbmVlZGVkIGZvciBpbmNsdXNpb24gb2YgdGhlIHRvb2xzIGluIFdTQUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEZhY3RvcnlJbXBsIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLmRvY3VtZW50LmltcGwuRG9jdW1lbnRGYWN0b3J5SW1wbAotewotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgRG9jdW1lbnRGYWN0b3J5SW1wbC4KLSAgICovCi0gIHB1YmxpYyBEb2N1bWVudEZhY3RvcnlJbXBsKCkKLSAgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGEgRG9jdW1lbnRXcml0ZXIuCi0gICAqLwotICBwdWJsaWMgUmVwb3J0V3JpdGVyIG5ld1JlcG9ydFdyaXRlcigpCi0gIHsKLSAgICAvLyBSZXR1cm4gaW1wbGVtZW50YXRpb24KLSAgICByZXR1cm4gbmV3IFJlcG9ydE5vV3JpdGVySW1wbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSByZXBvcnQuCi0gICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgUmVwb3J0IG5ld1JlcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFJlcG9ydEltcGwoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC9yZXBvcnQvQXNzZXJ0aW9uRXJyb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL3JlcG9ydC9Bc3NlcnRpb25FcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTBlYzgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL3JlcG9ydC9Bc3NlcnRpb25FcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLnJlcG9ydDsKLQotLyoqCi0gKiBBc3NlcnRpb25FcnJvcgotICogCi0gKiBPYmplY3QgdG8gaG9sZCBhbiBhc3NlcnRpb24gZXJyb3IgZ2VuZXJhdGVkIGJ5IHRoZSBXUy1JIFRlc3QgVG9vbHMuCi0gKiBQcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgaW5jbHVkaW5nIHRoZQotICogaWQsIG1lc3NhZ2UgYW5kIGxvY2F0aW9uIGluIHRoZSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgQXNzZXJ0aW9uRXJyb3IKLXsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgYXNzZXJ0aW9uaWQ7Ci0gIHByb3RlY3RlZCBpbnQgY29sdW1uOwotICBwcm90ZWN0ZWQgaW50IGxpbmU7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3RvciBmb3IgQXNzZXJ0aW9uRXJyb3IuCi0gICAqLwotICBwdWJsaWMgQXNzZXJ0aW9uRXJyb3IoKQotICB7Ci0gICAgbWVzc2FnZSA9IGFzc2VydGlvbmlkID0gIiI7Ci0gICAgbGluZSA9IGNvbHVtbiA9IDA7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0b3IgZm9yIEFzc2VydGlvbkVycm9yLgotICAgKiBAcGFyYW0gaWQgYXNzZXJ0aW9uIGlkLgotICAgKiBAcGFyYW0gbWVzc2FnZSBhIGVycm9yIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBsaW5lIGEgbGluZSBudW1iZXIuCi0gICAqIEBwYXJhbSBjb2x1bW4gYSBjb2x1bW4gbnVtYmVyLgotICAgKi8KLSAgcHVibGljIEFzc2VydGlvbkVycm9yKFN0cmluZyBpZCwgU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uKQotICB7Ci0gICAgdGhpcy5hc3NlcnRpb25pZCA9IGlkOwotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgdGhpcy5saW5lID0gbGluZTsKLSAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2Qgc2V0QXNzZXJ0aW9uSUQuCi0gICAqIEBwYXJhbSBpZCBhc3NlcnRpb24gaWQuCi0gICAqIEBzZWUgI2dldEFzc2VydGlvbklECi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBc3NlcnRpb25JRChTdHJpbmcgaWQpCi0gIHsKLSAgICBhc3NlcnRpb25pZCA9IGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRBc3NlcnRpb25JRC4KLSAgICogQHJldHVybiBhc3NlcmlvbiBpZC4KLSAgICogQHNlZSAjc2V0QXNzZXJ0aW9uSUQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXNzZXJ0aW9uSUQoKQotICB7Ci0gICAgcmV0dXJuIGFzc2VydGlvbmlkOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBzZXRFcnJvck1lc3NhZ2UuCi0gICAqIEBwYXJhbSBtZXNzYWdlIGEgZXJyb3IgbWVzc2FnZS4KLSAgICogQHNlZSAjZ2V0RXJyb3JNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRFcnJvck1lc3NhZ2UuCi0gICAqIEByZXR1cm4gZXJyb3IgbWVzc2FnZS4KLSAgICogQHNlZSAjc2V0RXJyb3JNZXNzYWdlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpCi0gIHsKLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2Qgc2V0TGluZS4KLSAgICogQHBhcmFtIGxpbmUgbGluZSBudW1iZXIuCi0gICAqIEBzZWUgI2dldExpbmUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpCi0gIHsKLSAgICB0aGlzLmxpbmUgPSBsaW5lOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCBnZXRMaW5lLgotICAgKiBAcmV0dXJuIGxpbmUgbnVtYmVyLgotICAgKiBAc2VlICNzZXRMaW5lCi0gICAqLwotICBwdWJsaWMgaW50IGdldExpbmUoKQotICB7Ci0gICAgcmV0dXJuIGxpbmU7Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIHNldENvbHVtbi4KLSAgICogQHBhcmFtIGNvbHVtbiBjb2x1bW4gbnVtYmVyLgotICAgKiBAc2VlICNnZXRDb2x1bW4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbHVtbihpbnQgY29sdW1uKQotICB7Ci0gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0gIH0KLQotICAvKioKLSAgICogTWV0aG9kIGdldENvbHVtbi4KLSAgICogQHJldHVybiBjb2x1bW4gbnVtYmVyLgotICAgKiBAc2VlICNzZXRDb2x1bW4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29sdW1uKCkKLSAgewotICAgIHJldHVybiBjb2x1bW47Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvcmVwb3J0L1JlcG9ydE5vV3JpdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL29yZy9lY2xpcHNlL3dzdC93c2kvaW50ZXJuYWwvcmVwb3J0L1JlcG9ydE5vV3JpdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM3MjVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL3JlcG9ydC9SZXBvcnROb1dyaXRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwucmVwb3J0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5XU0lFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzaS5pbnRlcm5hbC5jb3JlLnJlcG9ydC5SZXBvcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogV1MtSSBjb25mb3JtYW5jZSB0ZXN0IFJlcG9ydFdyaXRlciBmb3Igd3NpIHBsdWdpbi4KLSAqIFRoaXMgUmVwb3J0V3JpdGVyIHdyaXRlcyBub3RoaW5nIHNvIG5vIHJlcG9ydCBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydE5vV3JpdGVySW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuY29yZS5yZXBvcnQuUmVwb3J0V3JpdGVyCi17Ci0KLSAgLyoqCi0gICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNPYmplY3QoKQotICAgKi8KLSAgcHVibGljIFJlcG9ydE5vV3JpdGVySW1wbCgpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRXcml0ZXIjZ2V0RG9jdW1lbnQoKQotICAgKi8KLSAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRXcml0ZXIjc2V0V3JpdGVyKFN0cmluZykKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFdyaXRlcihTdHJpbmcgZG9jdW1lbnRMb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRXcml0ZXIjd3JpdGUoUmVhZGVyKQotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoUmVhZGVyIHJlYWRlcikgdGhyb3dzIFdTSUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRXcml0ZXIjd3JpdGUoUmVhZGVyLCBXcml0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShSZWFkZXIgcmVhZGVyLCBXcml0ZXIgd3JpdGVyKSB0aHJvd3MgV1NJRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydFdyaXRlciN3cml0ZShSZXBvcnQpCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShSZXBvcnQgcmVwb3J0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QucmVwb3J0LlJlcG9ydFdyaXRlciN3cml0ZShSZXBvcnQsIFdyaXRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFJlcG9ydCByZXBvcnQsIFdyaXRlciB3cml0ZXIpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcud3NpLnRlc3QuZG9jdW1lbnQuRG9jdW1lbnRXcml0ZXIjY2xvc2UoKQotICAgKi8KLSAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgV1NJRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvb3JnL2VjbGlwc2Uvd3N0L3dzaS9pbnRlcm5hbC92YWxpZGF0ZS93c2RsL1dTRExWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL3ZhbGlkYXRlL3dzZGwvV1NETFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTljMDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzaS93c2l2YWxpZGF0ZS9vcmcvZWNsaXBzZS93c3Qvd3NpL2ludGVybmFsL3ZhbGlkYXRlL3dzZGwvV1NETFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwudmFsaWRhdGUud3NkbDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVdTRExWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uSW5mb0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5leGNlcHRpb24uVmFsaWRhdGVXU0RMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51dGlsLk1lc3NhZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuV1NETDExVmFsaWRhdGlvbkluZm9JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwud3NkbDExLldTRExEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5XU0RMUmVhZGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLldTSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuV1NJVGVzdFRvb2xzUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmFuYWx5emVyLldTRExBbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmFuYWx5emVyLldTSUFuYWx5emVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwucmVwb3J0LkFzc2VydGlvbkVycm9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqIFRoZSBXU0kgdmFsaWRhdG9yIHBsdWdzIGludG8gdGhlIFdTREwgdmFsaWRhdG9yIHRvIHByb3ZpZGUKLSAqIHZhbGlkYXRpb24gZm9yIGEgV1NETCBkb2N1bWVudCB3aXRoIHJlc3BlY3QgdG8gdGhlIFdTLUkgQmFzaWMgUHJvZmlsZSAoY3VycmVudGx5IDEuMCkuCi0gKiBUaGlzIGNsYXNzIGFjdHMgYXMgYW4gYnJpZGdlIGJldHdlZW4gdGhlIFdTLUkgdG9vbHMgYW5kIHRoZSBXU0RMIFZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwgKGxtYW5kZWxAY2EuaWJtLmNvbSkKLSAqIEBhdXRob3IgV2FqaWhhIFJlaG1hbgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgV1NJX1BSRUZJWCA9ICJXUy1JOiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIF9FWENfVU5BQkxFX1RPX1ZBTElEQVRFX1dTSSA9ICJfRVhDX1VOQUJMRV9UT19WQUxJREFURV9XU0kiOwotCi0gIC8vIGluZGljYXRpb25zIGZvciB0eXBlcyBvZiBlcnJvcnMKLSAgcHJvdGVjdGVkIGZpbmFsIGludCBFUlJPUiA9IDI7Ci0gIHByb3RlY3RlZCBmaW5hbCBpbnQgV0FSTklORyA9IDE7Ci0gIAotICBwcm90ZWN0ZWQgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlZ2VuZXJhdG9yID0gbnVsbDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gd3NpVmFsaWQgPSBmYWxzZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgV1NETFZhbGlkYXRvcigpCi0gIHsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLklXU0RMVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy53M2MuZG9tLkRvY3VtZW50LCBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLlZhbGlkYXRpb25JbmZvKQotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoRG9jdW1lbnQgZG9tTW9kZWwsIElWYWxpZGF0aW9uSW5mbyB2YWxJbmZvKSB0aHJvd3MgVmFsaWRhdGVXU0RMRXhjZXB0aW9uCi0gIHsKLQlib29sZWFuIHdpdGhBdHRhY2htZW50cyA9IGZhbHNlOwotCWJvb2xlYW4gd2l0aEJhc2ljID0gZmFsc2U7Ci0JT2JqZWN0IGF0dFZhbHVlID0gdmFsSW5mby5nZXRBdHRyaWJ1dGUoImh0dHA6Ly93cy1pLm9yZy9wcm9maWxlcy9CYXNpY1dpdGhBdHRhY2htZW50cy9Db21wbGlhbmNlTGV2ZWwiKTsKLQlpZihhdHRWYWx1ZSA9PSBudWxsKQotCXsKLQkgIGF0dFZhbHVlID0gdmFsSW5mby5nZXRBdHRyaWJ1dGUoImh0dHA6Ly93cy1pLm9yZy9wcm9maWxlcy9CYXNpYy9Db21wbGlhbmNlTGV2ZWwiKTsKLSAgIAkgIGlmKGF0dFZhbHVlICE9IG51bGwpCi0JICB7Ci0JICAgIHdpdGhCYXNpYyA9IHRydWU7Ci0JICB9Ci0JfQotCWVsc2UKLQl7Ci0JICB3aXRoQXR0YWNobWVudHMgPSB0cnVlOwotCX0KLQlTdHJpbmcgd3NpTGV2ZWwgPSBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLldBUk5fTk9OX1dTSTsKLQlpZihhdHRWYWx1ZSAhPSBudWxsKQotCXsKLQkgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpYXR0VmFsdWU7Ci0JICBpZih2YWx1ZS5lcXVhbHMoIklHTk9SRSIpKQotCSAgewotCSAgCXdzaUxldmVsID0gV1NJVGVzdFRvb2xzUHJvcGVydGllcy5JR05PUkVfTk9OX1dTSTsKLQkgIH0KLQkgIGVsc2UgaWYodmFsdWUuZXF1YWxzKCJSRVFVSVJFIikpCi0JICB7Ci0JICAgCXdzaUxldmVsID0gV1NJVGVzdFRvb2xzUHJvcGVydGllcy5TVE9QX05PTl9XU0k7Ci0JICB9Ci0JfQotCS8vIElmIHdlIGFyZSBpZ25vcmluZyBXUy1JIHRoZW4gZG9uJ3QgcnVuIHRoZSB0ZXN0cy4KLQlpZih3c2lMZXZlbC5lcXVhbHMoV1NJVGVzdFRvb2xzUHJvcGVydGllcy5JR05PUkVfTk9OX1dTSSkpCi0JewotCSAgcmV0dXJuOwotCX0KLQkgICAgCi0gIAl3c2lWYWxpZCA9IHRydWU7Ci0gIAlEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOwotCWJvb2xlYW4gaGFzQW5hbHl6ZXJDb25maWcgPSBmYWxzZTsKLQlTdHJpbmcgdXJpID0gdmFsSW5mby5nZXRGaWxlVVJJKCk7Ci0gIAl0cnkKLSAgCXsKLSAgICAgIC8vV1NETEZhY3RvcnkgZmFjdG9yeSA9IFdTRExGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gCSAgVmFsaWRhdGlvbkluZm9JbXBsIHZhbGkgPSBuZXcgVmFsaWRhdGlvbkluZm9JbXBsKHZhbEluZm8uZ2V0RmlsZVVSSSgpLCBtZXNzYWdlZ2VuZXJhdG9yKTsKLSAgCSAgdmFsaS5zZXRVUklSZXNvbHZlcigoVVJJUmVzb2x2ZXIpdmFsSW5mby5nZXRVUklSZXNvbHZlcigpKTsKLSAgICAgIFdTRExSZWFkZXJJbXBsIHJlYWRlciA9IG5ldyBXU0RMUmVhZGVySW1wbChuZXcgV1NETDExVmFsaWRhdGlvbkluZm9JbXBsKHZhbGkpKTsKLSAgICAgIFdTRExEb2N1bWVudFtdIGRvY3MgPSByZWFkZXIucmVhZFdTREwodXJpLCBkb21Nb2RlbCk7Ci0gICAgICBpbnQgbnVtZG9jcyA9IGRvY3MubGVuZ3RoOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bWRvY3M7IGkrKykKLSAgICAgIHsKLSAgICAgICAgV1NETERvY3VtZW50IHRlbXBEb2MgPSBkb2NzW2ldOwotCQlpZih0ZW1wRG9jLmdldERlZmluaXRpb24oKS5nZXREb2N1bWVudEJhc2VVUkkoKS5lcXVhbHModmFsSW5mby5nZXRGaWxlVVJJKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgZGVmaW5pdGlvbiA9IHRlbXBEb2MuZ2V0RGVmaW5pdGlvbigpOyAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgCX0KLSAgCWNhdGNoKFdTRExFeGNlcHRpb24gZSkKLSAgCXsKLSAgCSAgdGhyb3cgbmV3IFZhbGlkYXRlV1NETEV4Y2VwdGlvbihtZXNzYWdlZ2VuZXJhdG9yLmdldFN0cmluZyhfRVhDX1VOQUJMRV9UT19WQUxJREFURV9XU0ksdXJpKSk7Ci0gIAl9Ci0JICAgIAotICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwgJiYgdmFsSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgICAvLyBnZXQgYWxsIHRoZSBjb2xsZWN0aW9ucyB3ZSBtYXkgbmVlZCB0byB2YWxpZGF0ZQotICAgICAgQ29sbGVjdGlvbiBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKTsKLSAgICAgIENvbGxlY3Rpb24gYmluZGluZ3MgPSBkZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCk7Ci0gICAgICBDb2xsZWN0aW9uIHBvcnRUeXBlcyA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCk7Ci0gICAgICBDb2xsZWN0aW9uIG1lc3NhZ2VzID0gZGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpOwotCi0gICAgICBXU0RMQW5hbHl6ZXIgd3NkbEFuYWx5emVyOwotCSAgaWYod2l0aEF0dGFjaG1lbnRzKQotCSAgewotCSAgCVdTSVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbmV3IFdTSVByZWZlcmVuY2VzKCk7Ci0gICAJICAgIHByZWZlcmVuY2VzLnNldENvbXBsaWFuY2VMZXZlbCh3c2lMZXZlbCk7Ci0JICAgIHByZWZlcmVuY2VzLnNldFRBREZpbGUoV1NJVGVzdFRvb2xzUHJvcGVydGllcy5BUF9BU1NFUlRJT05fRklMRSk7Ci0JICAgIHdzZGxBbmFseXplciA9IG5ldyBXU0RMQW5hbHl6ZXIodXJpLCBwcmVmZXJlbmNlcyk7Ci0JICB9Ci0JICBlbHNlIGlmKHdpdGhCYXNpYykKLQkgIHsKLQkgIAlXU0lQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG5ldyBXU0lQcmVmZXJlbmNlcygpOwotCQlwcmVmZXJlbmNlcy5zZXRDb21wbGlhbmNlTGV2ZWwod3NpTGV2ZWwpOwkKLQkgICAgcHJlZmVyZW5jZXMuc2V0VEFERmlsZShXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLlNTQlBfQVNTRVJUSU9OX0ZJTEUpOwotCSAgICB3c2RsQW5hbHl6ZXIgPSBuZXcgV1NETEFuYWx5emVyKHVyaSwgcHJlZmVyZW5jZXMpOwotCSAgfQotCSAgZWxzZQotCSAgewotCQkvLyBkZWZhdWx0IHByZWZlcmVuY2Ugc2V0dGluZwotCSAgCXdzZGxBbmFseXplciA9IG5ldyBXU0RMQW5hbHl6ZXIodXJpKTsKLQkgIH0KLQotCSAgLy8gVGhlIFdTLUkgY29uZm9ybWFuY2UgdG9vbHMgcmVxdWlyZSB0aGF0IGVhY2ggc2VydmljZSBiZSBhbmFseXplZCBzZXBhcmF0ZWx5LgotCSAgLy8gR2V0IGFsbCB0aGUgc2VydmljZXMgYW5kIGFuYWx5emUgdGhlbS4KLQkgIGlmIChzZXJ2aWNlcyAhPSBudWxsICYmICFzZXJ2aWNlcy5pc0VtcHR5KCkpCi0JICB7Ci0JICAgIEl0ZXJhdG9yIHNlcnZpY2VJdGVyYXRvciA9IHNlcnZpY2VzLml0ZXJhdG9yKCk7Ci0KLQkgICAgd2hpbGUgKHNlcnZpY2VJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZUl0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgIFN0cmluZyBzZXJ2aWNlbmFtZSA9IHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQotICAgICAgICAgIENvbGxlY3Rpb24gcG9ydHMgPSBzZXJ2aWNlLmdldFBvcnRzKCkudmFsdWVzKCk7Ci0gICAgICAgICAgaWYgKHBvcnRzICE9IG51bGwgJiYgIXBvcnRzLmlzRW1wdHkoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGUgV1MtSSB0b29scyBtdXN0IGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIHBvcnQgd2l0aGluIGVhY2ggc2VydmljZS4KLSAgICAgICAgICAgIEl0ZXJhdG9yIHBvcnRJdGVyYXRvciA9IHBvcnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocG9ydEl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3c2RsQW5hbHl6ZXIuYWRkQ29uZmlndXJhdGlvblRvVGVzdChzZXJ2aWNlbmFtZSwgbmFtZXNwYWNlLCBwb3J0LmdldE5hbWUoKSwgV1NETEFuYWx5emVyLlBPUlQpOwotCQkJCWhhc0FuYWx5emVyQ29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXRjaCAoV1NJQW5hbHl6ZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjb2RlIHRvIGxvZyBlcnJvciAKLSAgICAgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiZXhjZXB0aW9uICIgKyBlKTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB2YWxpZGF0ZSBhdCB0aGUgYmluZGluZyBsZXZlbCAtIGNoZWNrIGZvciBldmVyeSBiaW5kaW5nCi0gICAgICBlbHNlIGlmIChiaW5kaW5ncyAhPSBudWxsICYmICFiaW5kaW5ncy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIEl0ZXJhdG9yIGJpbmRpbmdJdGVyYXRvciA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7Ci0KLSAgICAgICAgd2hpbGUgKGJpbmRpbmdJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ0l0ZXJhdG9yLm5leHQoKTsKLQotICAgICAgICAgIFN0cmluZyBiaW5kaW5nbmFtZSA9IGJpbmRpbmcuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3c2RsQW5hbHl6ZXIuYWRkQ29uZmlndXJhdGlvblRvVGVzdChudWxsLCBuYW1lc3BhY2UsIGJpbmRpbmduYW1lLCBXU0RMQW5hbHl6ZXIuQklORElORyk7Ci0JCQloYXNBbmFseXplckNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChXU0lBbmFseXplckV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjb2RlIHRvIGxvZyBlcnJvciAKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJleGNlcHRpb24gIiArIGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gdmFsaWRhdGUgYXQgdGhlIHBvcnRUeXBlIGxldmVsIC0gY2hlY2sgZm9yIGV2ZXJ5IHBvcnRUeXBlCi0gICAgICBlbHNlIGlmIChwb3J0VHlwZXMgIT0gbnVsbCAmJiAhcG9ydFR5cGVzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgSXRlcmF0b3IgcG9ydFR5cGVJdGVyYXRvciA9IHBvcnRUeXBlcy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAocG9ydFR5cGVJdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgcG9ydFR5cGVJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIHBvcnRUeXBlbmFtZSA9IHBvcnRUeXBlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgd3NkbEFuYWx5emVyLmFkZENvbmZpZ3VyYXRpb25Ub1Rlc3QobnVsbCwgbmFtZXNwYWNlLCBwb3J0VHlwZW5hbWUsIFdTRExBbmFseXplci5QT1JUVFlQRSk7Ci0JCQloYXNBbmFseXplckNvbmZpZyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChXU0lBbmFseXplckV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjb2RlIHRvIGxvZyBlcnJvciAKLSAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJleGNlcHRpb24gIiArIGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gdmFsaWRhdGUgYXQgdGhlIG1lc3NhZ2UgbGV2ZWwgLSBjaGVjayBmb3IgZXZlcnkgbWVzc2FnZQotICAgICAgZWxzZSBpZiAobWVzc2FnZXMgIT0gbnVsbCAmJiAhbWVzc2FnZXMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICBJdGVyYXRvciBtZXNzYWdlSXRlcmF0b3IgPSBtZXNzYWdlcy5pdGVyYXRvcigpOwotCi0gICAgICAgIHdoaWxlIChtZXNzYWdlSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1lc3NhZ2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIG1lc3NhZ2VuYW1lID0gbWVzc2FnZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHdzZGxBbmFseXplci5hZGRDb25maWd1cmF0aW9uVG9UZXN0KG51bGwsIG5hbWVzcGFjZSwgbWVzc2FnZW5hbWUsIFdTRExBbmFseXplci5NRVNTQUdFKTsKLQkJCWhhc0FuYWx5emVyQ29uZmlnID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKFdTSUFuYWx5emVyRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNvZGUgdG8gbG9nIGVycm9yIAotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImV4Y2VwdGlvbiAiICsgZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gb25seSBydW4gdGhlIGFuYWx5emVyIGlmIHRoZXJlIGlzIHNvbWV0aGluZyB0byBjaGVjawotCQlpZihoYXNBbmFseXplckNvbmZpZykKLQkJewotCQkgIC8vIHJ1biB0aGUgY29uZm9ybWFuY2UgY2hlY2sgYW5kIGFkZCBlcnJvcnMgYW5kIHdhcm5pbmdzIGFzIG5lZWRlZAotCQkgIHdzZGxBbmFseXplci52YWxpZGF0ZUNvbmZvcm1hbmNlKCk7Ci0JCQkgIAotCQkgIC8vIElmIHRoZSBsZXZlbCBpcyBzdWdnZXN0IGFsbCBlcnJvcnMgc2hvdWxkIGJlIHJlcG9ydGVkIGFzIHdhcm5pbmdzLgotCQkgIGlmKHdzZGxBbmFseXplci5nZXRXU0lQcmVmZXJlbmNlcygpLmdldENvbXBsaWFuY2VMZXZlbCgpLmVxdWFscyhXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLldBUk5fTk9OX1dTSSkpCi0JCSAgewotCQkgICAgYWRkV2FybmluZ3Mod3NkbEFuYWx5emVyLmdldEFzc2VydGlvbkVycm9ycygpLCB2YWxJbmZvKTsKLQkJICB9Ci0JCSAgZWxzZQotCQkgIHsKLQkJICAgIGFkZEVycm9ycyh3c2RsQW5hbHl6ZXIuZ2V0QXNzZXJ0aW9uRXJyb3JzKCksIHZhbEluZm8pOwotCQkgIH0KLQkJICBhZGRXYXJuaW5ncyh3c2RsQW5hbHl6ZXIuZ2V0QXNzZXJ0aW9uV2FybmluZ3MoKSwgdmFsSW5mbyk7Ci0JCX0KLSAgICAgIH0KLQkgIGNhdGNoIChXU0lBbmFseXplckV4Y2VwdGlvbiBlKQotCSAgewotCQkvLyBUT0RPOiBBZGQgY29kZSB0byBsb2cgZXJyb3IgCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIHJ1biBXUy1JIFdTREwgY29uZm9ybWFuY2UgY2hlY2suXG4iICsgZSk7Ci0JICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBlcnJvciBtZXNzYWdlcyB0byB0aGUgdmFsaWRhdGlvbmNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gZXJyb3JzIFRoZSBsaXN0IG9mIGVycm9ycyB0byBhZGQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZEVycm9ycyhMaXN0IGVycm9ycywgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCi0gIHsKLSAgICByZXBvcnRQcm9ibGVtcyhlcnJvcnMsIHZhbEluZm8sIEVSUk9SKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGQgd2FybmluZyBtZXNzYWdlcyB0byB0aGUgdmFsaWRhdGlvbmNvbnRyb2xsZXIuCi0gICAqIAotICAgKiBAcGFyYW0gd2FybmluZ3MgVGhlIGxpc3Qgb2Ygd2FybmluZ3MgdG8gYWRkLgotICAgKiBAcGFyYW0gdmFsSW5mbyBUaGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRXYXJuaW5ncyhMaXN0IHdhcm5pbmdzLCBJVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKLSAgewotICAgIHJlcG9ydFByb2JsZW1zKHdhcm5pbmdzLCB2YWxJbmZvLCBXQVJOSU5HKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXBvcnQgdGhlIHByb2JsZW1zIHNwZWNpZmllZCBmb3IgdGhlIGdpdmVuIHR5cGUgdG8gdGhlIHZhbGlkYXRpb25jb250cm9sbGVyLgotICAgKiAKLSAgICogQHBhcmFtIHByb2JsZW1zIFRoZSBwcm9ibGVtcyB0byByZXBvcnQuCi0gICAqIEBwYXJhbSB2YWxJbmZvIFRoZSBvYmplY3QgdG8gcmVwb3J0IHRoZSBwcm9ibGVtcyB0by4KLSAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZXMgdG8gYWRkLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcmVwb3J0UHJvYmxlbXMoTGlzdCBwcm9ibGVtcywgSVZhbGlkYXRpb25JbmZvIHZhbEluZm8sIGludCB0eXBlKQotICB7Ci0gICAgLy8gaWYgdGhlcmUgd2VyZSBubyBwcm9ibGVtcyBqdXN0IHJldHVybgotICAgIGlmIChwcm9ibGVtcyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotCi0gICAgCi0gICAgSXRlcmF0b3IgcHJvYmxlbXNJdGVyYXRvciA9IHByb2JsZW1zLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKHByb2JsZW1zSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEFzc2VydGlvbkVycm9yIGFzc2VydGlvbmVycm9yID0gKEFzc2VydGlvbkVycm9yKSBwcm9ibGVtc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmICh0eXBlID09IEVSUk9SKQotICAgICAgewotCQl3c2lWYWxpZCA9IGZhbHNlOwotICAgICAgICB2YWxJbmZvLmFkZEVycm9yKAotICAgICAgICAgIFdTSV9QUkVGSVggKyBhc3NlcnRpb25lcnJvci5nZXRFcnJvck1lc3NhZ2UoKSwKLSAgICAgICAgICBhc3NlcnRpb25lcnJvci5nZXRMaW5lKCksCi0gICAgICAgICAgYXNzZXJ0aW9uZXJyb3IuZ2V0Q29sdW1uKCksCi0gICAgICAgICAgdmFsSW5mby5nZXRGaWxlVVJJKCkpOwotCi0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0eXBlID09IFdBUk5JTkcpCi0gICAgICB7Ci0gICAgICAgIHZhbEluZm8uYWRkV2FybmluZygKLSAgICAgICAgICBXU0lfUFJFRklYICsgYXNzZXJ0aW9uZXJyb3IuZ2V0RXJyb3JNZXNzYWdlKCksCi0gICAgICAgICAgYXNzZXJ0aW9uZXJyb3IuZ2V0TGluZSgpLAotICAgICAgICAgIGFzc2VydGlvbmVycm9yLmdldENvbHVtbigpLAotICAgICAgICAgIHZhbEluZm8uZ2V0RmlsZVVSSSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c2RsLnZhbGlkYXRlLmNvbnRyb2xsZXIuSVdTRExWYWxpZGF0b3Ijc2V0UmVzb3VyY2VCdW5kbGUoamF2YS51dGlsLlJlc291cmNlQnVuZGxlKQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VCdW5kbGUoUmVzb3VyY2VCdW5kbGUgcmIpCi0gIHsKLSAgICBtZXNzYWdlZ2VuZXJhdG9yID0gbmV3IE1lc3NhZ2VHZW5lcmF0b3IocmIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5jb250cm9sbGVyLklXU0RMVmFsaWRhdG9yI2lzVmFsaWQoKQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpCi0gIHsKLSAgICByZXR1cm4gd3NpVmFsaWQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NpL3dzaXZhbGlkYXRlL3dzaXZhbGlkYXRlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvd3NpdmFsaWRhdGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5MDZiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2kvd3NpdmFsaWRhdGUvd3NpdmFsaWRhdGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKi8KLQotX0VYQ19VTkFCTEVfVE9fVkFMSURBVEVfV1NJID0gVW5hYmxlIHRvIHZhbGlkYXRlIFdTLUkgY29uZm9ybWFuY2UuICBBbiBlcnJvciBvY2N1cmVkIHJlYWRpbmcgdGhlIFdTREwgZG9jdW1lbnQgezB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ2M2FmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODhlMWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYmZkZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQXhpcyBQZXJmbXNyIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBheGlzUGVyZm1zci5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS5wbHVnaW4uUGVyZm9ybWFuY2VQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6IElCTQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLAotIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UucGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LndzLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLAotIG9yZy5lY2xpcHNlLmplbS51dGlsLAotIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzEyMDUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBidWlsZC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBheGlzUGVyZm1zci5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBheGlzUGVyZm1zci5qYXIKLXNvdXJjZS5heGlzUGVyZm1zci5qYXIgPSBzcmMvCi1vdXRwdXQuYXhpc1BlcmZtc3IuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNjVmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL3BlcmZtc3IvUGVyZm1zckJVSmF2YUF4aXNUQzUwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9heGlzL3RvbWNhdC92NTAvcGVyZm1zci9QZXJmbXNyQlVKYXZhQXhpc1RDNTAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0MWVmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9heGlzL3RvbWNhdC92NTAvcGVyZm1zci9QZXJmbXNyQlVKYXZhQXhpc1RDNTAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5FbnZpcm9ubWVudFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uSjJFRVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLldTV2l6YXJkVG9tY2F0NTBUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuU2NlbmFyaW9Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlTWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotCi0vKioKLSAqIEJvdHRvbSB1cCBwZXJmb3JtYW5jZSBzY2VuYXJpbyB3aXRoIEF4aXMgYW5kIFRvbWNhdCB2NS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJmbXNyQlVKYXZhQXhpc1RDNTAgZXh0ZW5kcyBXU1dpemFyZFRvbWNhdDUwVGVzdCB7Ci0JLy8gQ29uc3RhbnRzCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV1NfUlVOVElNRUlEX0FYSVMgPSAib3JnLmVjbGlwc2UuanN0LndzLnJ1bnRpbWUuYXhpczExIjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiVGVzdEJVV2ViIjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFX05BTUUgPSAiVGVzdEJVV2ViTW9kdWxlIjsKLQotCXByaXZhdGUgSUZpbGUgc291cmNlRmlsZV87Ci0JCi0gIC8qKgotICAgKiBTZXRzIHVwIHRoZSBpbnB1dCBkYXRhOwotICAgKiAtIGNyZWF0ZSBwcm9qZWN0KHMpLAotICAgKiAtIGNvcHkgcmVzb3VyY2VzIHRvIHdvcmtzcGFjZSAKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zdGFsbElucHV0RGF0YSgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCS8vIENyZWF0ZSBhIFdlYiBwcm9qZWN0IChUZXN0V2ViKSB0YXJnZXR0ZWQgdG8gVG9tY2F0IDUuMAotCQlTdGF0dXMgcyA9IEpVbml0VXRpbHMuY3JlYXRlV2ViTW9kdWxlKFBST0pFQ1RfTkFNRSwgV0VCX01PRFVMRV9OQU1FLCBTRVJWRVJUWVBFSURfVEM1MCwgU3RyaW5nLnZhbHVlT2YoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpLCBlbnZfKTsKLQkJaWYgKHMuZ2V0U2V2ZXJpdHkoKSAhPSBTdGF0dXMuT0spIHsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiK3MuZ2V0TWVzc2FnZSgpKTsKLQkJCXRocm93IG5ldyBFeGNlcHRpb24ocy5nZXRUaHJvd2FibGUoKSk7Ci0JCX0KLQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOwotCQlhc3NlcnRUcnVlKHdlYlByb2plY3QuZXhpc3RzKCkpOwotCi0JCQotCQkvLyBDb3B5IHRoZSBjb250ZW50cyBvZiBkYXRhLzx0ZXN0IG5hbWU+IHRvIHRoZSBXZWIgcHJvamVjdCdzIHNvdXJjZSBmb2xkZXIuCi0JCS8vIDxXZWIgUHJvamVjdD4vSmF2YVNvdXJjZS9mb28vRWNoby5qYXZhCi0JCS8vSUZvbGRlciBkZXN0Rm9sZGVyID0gSlVuaXRVdGlscy5nZXRTb3VyY2VGb2xkZXJGb3JXZWJQcm9qZWN0KFdFQl9QUk9KRUNUX05BTUUpOwotICAgICAgICBJUGF0aCBkZXN0UGF0aCA9IFJlc291cmNlVXRpbHMuZ2V0SmF2YVNvdXJjZUxvY2F0aW9uKHdlYlByb2plY3QsIFdFQl9NT0RVTEVfTkFNRSk7Ci0gICAgICAgIElGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2UoZGVzdFBhdGgpOwotCQlKVW5pdFV0aWxzLmNvcHlUZXN0RGF0YSgiQlVKYXZhL3NyYyIsZm9sZGVyLGVudl8pOwotCQlzb3VyY2VGaWxlXyA9IGZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKCJmb28vRWNoby5qYXZhIikpOwotCQlhc3NlcnRUcnVlKHNvdXJjZUZpbGVfLmV4aXN0cygpKTsKLQkJCi0JCS8vIEVuc3VyZSB0aGF0IEVjaG8uY2xhc3MgaXMgYnVpbHQgaW46Ci0JCS8vIDxXZWIgUHJvamVjdD4vV2ViQ29udGVudC9XRUItSU5GL2NsYXNzZXMvZm9vL0VjaG8uY2xhc3MKLQkJSlVuaXRVdGlscy5zeW5jQnVpbGRQcm9qZWN0KHdlYlByb2plY3QsZW52Xyk7Ci0JCS8vYXNzZXJ0VHJ1ZShKVW5pdFV0aWxzLmdldENsYXNzZXNGb2xkZXJGb3JXZWJQcm9qZWN0KFdFQl9QUk9KRUNUX05BTUUpLmdldEZpbGUobmV3IFBhdGgoImZvby9FY2hvLmNsYXNzIikpLmV4aXN0cygpKTsKLQkJCi0JCQotCX0KLQkKLSAgLyoqCi0gICAqIFNldCB0aGUgcGVyc2lzdGVudCBzZXJ2ZXIgcnVudGltZSBjb250ZXh0IHByZWZlcmVuY2VzCi0gICAqLyAgCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEoyRUVXU1J1bnRpbWVTZXJ2ZXJEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCS8vIFNldCBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciBKMkVFIDEuNCBBeGlzIGFuZCBUb21jYXQgNS4wCi0JCUpVbml0VXRpbHMuc2V0SjJFRVdTUnVudGltZVNlcnZlcihTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCksIFdTX1JVTlRJTUVJRF9BWElTLCBTRVJWRVJUWVBFSURfVEM1MCk7CQkKLQl9Ci0JCi0gIC8qKgotICAgKiBTZXQgdGhlIGluaXRpYWwgc2VsZWN0aW9uCi0gICAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRJbml0aWFsU2VsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaW5pdGlhbFNlbGVjdGlvbl8gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3VyY2VGaWxlXyk7Ci0JfQotCQotICAvKioKLSAgICogTGF1bmNoZXMgdGhlIHBvcC11cCBjb21tYW5kIHRvIGluaXRpYXRlIHRoZSBzY2VuYXJpbwotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8gIAotCXB1YmxpYyB2b2lkIHRlc3RCVUphdmFBeGlzVEM1MCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JICAJU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCSAgICBJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JICAgIEpVbml0VXRpbHMuZGlzYWJsZVdTSURpYWxvZyh3ZWJQcm9qZWN0KTsKLQotCSAgICBQZXJmb3JtYW5jZSBwZXJmPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JICAgIFBlcmZvcm1hbmNlTWV0ZXIgcGVyZm9ybWFuY2VNZXRlcj0gcGVyZi5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmYuZ2V0RGVmYXVsdFNjZW5hcmlvSWQodGhpcykpOwkgICAgCi0JICAgIHRyeSB7Ci0gICAgCi0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5zdGFydCgpOwotCSAgICAgIHN0YXR1cyA9IEpVbml0VXRpbHMubGF1bmNoQ3JlYXRpb25XaXphcmQoU2NlbmFyaW9Db25zdGFudHMuV0laQVJESURfQk9UVE9NX1VQLFNjZW5hcmlvQ29uc3RhbnRzLk9CSkVDVF9DTEFTU19JRF9JRklMRSxpbml0aWFsU2VsZWN0aW9uXyk7Ci0JICAgICAgcGVyZm9ybWFuY2VNZXRlci5zdG9wKCk7Ci0KLQkgICAgICBwZXJmb3JtYW5jZU1ldGVyLmNvbW1pdCgpOwotCSAgICAgIHBlcmYuYXNzZXJ0UGVyZm9ybWFuY2UocGVyZm9ybWFuY2VNZXRlcik7Ci0JICAgIH0KLQkgICAgZmluYWxseSB7Ci0JCQlwZXJmb3JtYW5jZU1ldGVyLmRpc3Bvc2UoKTsKLQkgCX0KLQkJCi0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBTdGF0dXMuT0spCi0JCSAgdmVyaWZ5T3V0cHV0KCk7Ci0JCWVsc2UKLQkJICB0aHJvdyBuZXcgRXhjZXB0aW9uKHN0YXR1cy5nZXRUaHJvd2FibGUoKSk7Ci0JCQotCX0KLQkKLSAgLyoqCi0gICAqIFZlcmlmeSB0aGUgc2NlbmFyaW8gY29tcGxldGVkIHN1Y2Nlc3NmdWxseQotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgdmVyaWZ5T3V0cHV0KCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLSAgICAgICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOyAgICAKLQkJSUZvbGRlciB3ZWJDb250ZW50Rm9sZGVyID0gKElGb2xkZXIpSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRDb250YWluZXIod2ViUHJvamVjdCwgV0VCX01PRFVMRV9OQU1FKTsKLSAgICAKLSAgICAgICAgSVBhdGggd2ViSW5mUGF0aCA9IEoyRUVVdGlscy5nZXRXZWJJbmZQYXRoKHdlYlByb2plY3QsIFdFQl9NT0RVTEVfTkFNRSk7Ci0JCUlGb2xkZXIgd2ViSW5mRm9sZGVyID0gKElGb2xkZXIpUmVzb3VyY2VVdGlscy5maW5kUmVzb3VyY2Uod2ViSW5mUGF0aCk7Ci0KLSAgICAgICAgSUZvbGRlciB3c2RsRm9sZGVyID0gd2ViQ29udGVudEZvbGRlci5nZXRGb2xkZXIoIndzZGwiKTsKLQkJYXNzZXJ0VHJ1ZSh3c2RsRm9sZGVyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSh3c2RsRm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPiAwKTsKLQkJYXNzZXJ0VHJ1ZSh3ZWJDb250ZW50Rm9sZGVyLmdldEZvbGRlcigid3NkbCIpLm1lbWJlcnMoKS5sZW5ndGggPiAwKTsKLSAgICAKLSAgICAgICAgLy9UT0RPIENoZWNrIGlmIHdzZGQgY29udGFpbnMgbmV3IFdlYiBzZXJ2aWNlCi0gICAgICAgIC8vVE9ETyBDaGVjayBpZiBXZWIgc2VyaXZjZSBjYW4gYmUgaW52b2tlZCBieSBhIGNsaWVudAotCX0KLQkKLSAgLyoqCi0gICAqIENsZWFyIHdvcmtzcGFjZSBpZiBuZWNlc3NhcnkKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJLy8gUmVtb3ZlIHRoZSBFQVIgZnJvbSB0aGUgc2VydmVyLgotCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFBST0pFQ1RfTkFNRSk7Ci0JCS8vSlVuaXRVdGlscy5yZW1vdmVNb2R1bGVGcm9tU2VydmVyKHNlcnZlcl8sd2ViUHJvamVjdCxlbnZfKTsKLQkJCi0JCS8vIERlbGV0ZSB0aGUgV2ViIHByb2plY3QuCi0JCXdlYlByb2plY3QuZGVsZXRlKHRydWUsdHJ1ZSxFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52XykpOwotICAgICAgICBhc3NlcnRGYWxzZSh3ZWJQcm9qZWN0LmV4aXN0cygpKTsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL2F4aXMvdG9tY2F0L3Y1MC9wZXJmbXNyL1BlcmZtc3JDbGllbnRBeGlzVEM1MC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL3BlcmZtc3IvUGVyZm1zckNsaWVudEF4aXNUQzUwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzk3MWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL3BlcmZtc3IvUGVyZm1zckNsaWVudEF4aXNUQzUwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5XU1dpemFyZFRvbWNhdDUwVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLlNjZW5hcmlvQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZU1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLQotLyoqCi0gKiBDbGllbnQgcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzIGFuZCBUb21jYXQgdjUuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyZm1zckNsaWVudEF4aXNUQzUwIGV4dGVuZHMgV1NXaXphcmRUb21jYXQ1MFRlc3QgewotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFdTX1JVTlRJTUVJRF9BWElTID0gIm9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSI7Ci0gIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIENMSUVOVF9QUk9KRUNUX05BTUUgPSAiVGVzdFdlYkNsaWVudCI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIENMSUVOVF9XRUJfTU9EVUxFX05BTUUgPSAgIlRlc3RXZWJDbGllbnRNb2R1bGUiOwotCi0JcHJpdmF0ZSBJRmlsZSBzb3VyY2VGaWxlXzsKLQotCS8qKgotICAgKiBTZXRzIHVwIHRoZSBpbnB1dCBkYXRhOwotICAgKiAtIGNyZWF0ZSBwcm9qZWN0KHMpLAotICAgKiAtIGNvcHkgcmVzb3VyY2VzIHRvIHdvcmtzcGFjZSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBDcmVhdGUgYW4gYXNzb2NpYXRlZCBXZWIgcHJvamVjdCAoVGVzdFdlYikgdGFyZ2V0dGVkIHRvIFRvbWNhdCB2NS4wIAotCQlTdGF0dXMgcyA9IEpVbml0VXRpbHMuY3JlYXRlV2ViTW9kdWxlKENMSUVOVF9QUk9KRUNUX05BTUUsIENMSUVOVF9XRUJfTU9EVUxFX05BTUUsIFNFUlZFUlRZUEVJRF9UQzUwLCBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCksIGVudl8pOwotCQlpZiAocy5nZXRTZXZlcml0eSgpICE9IFN0YXR1cy5PSykKLQkJCXRocm93IG5ldyBFeGNlcHRpb24ocy5nZXRUaHJvd2FibGUoKSk7Ci0gICAgCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0JCWFzc2VydFRydWUod2ViUHJvamVjdC5leGlzdHMoKSk7Ci0KLSAgICAvLyBDb3B5IEVjaG8ud3NkbCBmaWxlIHRvIFdlYkNvbnRlbnQgZm9sZGVyCi0gICAgSUZvbGRlciBkZXN0Rm9sZGVyID0gKElGb2xkZXIpSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRDb250YWluZXIod2ViUHJvamVjdCwgQ0xJRU5UX1dFQl9NT0RVTEVfTkFNRSk7Ci0JCUpVbml0VXRpbHMuY29weVRlc3REYXRhKCJUREphdmEiLGRlc3RGb2xkZXIsZW52Xyk7Ci0JCXNvdXJjZUZpbGVfID0gZGVzdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKCJFY2hvLndzZGwiKSk7Ci0JCWFzc2VydFRydWUoc291cmNlRmlsZV8uZXhpc3RzKCkpOwotCi0KLQl9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgcGVyc2lzdGVudCBzZXJ2ZXIgcnVudGltZSBjb250ZXh0IHByZWZlcmVuY2VzCi0gICAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRKMkVFV1NSdW50aW1lU2VydmVyRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBTZXQgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgSjJFRSAxLjQgQXhpcyBhbmQgVG9tY2F0IDUuMCAgICAKLQkJSlVuaXRVdGlscy5zZXRKMkVFV1NSdW50aW1lU2VydmVyKFN0cmluZy52YWx1ZU9mKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSwgV1NfUlVOVElNRUlEX0FYSVMsIFNFUlZFUlRZUEVJRF9UQzUwKTsKLQl9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEluaXRpYWxTZWxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdGlhbFNlbGVjdGlvbl8gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3VyY2VGaWxlXyk7Ci0JfQotCi0gIC8qKgotICAgKiBMYXVuY2hlcyB0aGUgcG9wLXVwIGNvbW1hbmQgdG8gaW5pdGlhdGUgdGhlIHNjZW5hcmlvCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotCXB1YmxpYyB2b2lkIHRlc3RDbGllbnRBeGlzVEM1MCgpIHRocm93cyBFeGNlcHRpb24KLQl7CQotCSAgCVN0YXR1cyBzdGF0dXMgPSBuZXcgU2ltcGxlU3RhdHVzKCIiKTsKLQkgIAkKLQkJICBKVW5pdFV0aWxzLmVuYWJsZVByb3h5R2VuZXJhdGlvbih0cnVlKTsKLQkJICBKVW5pdFV0aWxzLmVuYWJsZU92ZXJ3cml0ZSh0cnVlKTsKLQkJUGVyZm9ybWFuY2UgcGVyZj0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlQZXJmb3JtYW5jZU1ldGVyIHBlcmZvcm1hbmNlTWV0ZXI9IHBlcmYuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihwZXJmLmdldERlZmF1bHRTY2VuYXJpb0lkKHRoaXMpKTsJICAgIAotCSAgICB0cnkgewotICAgIAotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuc3RhcnQoKTsKLQkgICAgICBzdGF0dXMgPSBKVW5pdFV0aWxzLmxhdW5jaENyZWF0aW9uV2l6YXJkKFNjZW5hcmlvQ29uc3RhbnRzLldJWkFSRElEX0NMSUVOVCxTY2VuYXJpb0NvbnN0YW50cy5PQkpFQ1RfQ0xBU1NfSURfSUZJTEUsaW5pdGlhbFNlbGVjdGlvbl8pOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuY29tbWl0KCk7Ci0JICAgICAgcGVyZi5hc3NlcnRQZXJmb3JtYW5jZShwZXJmb3JtYW5jZU1ldGVyKTsKLQkgICAgfQotCSAgICBmaW5hbGx5IHsKLQkJCXBlcmZvcm1hbmNlTWV0ZXIuZGlzcG9zZSgpOwotCSAJfQotCSAgICAKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IFN0YXR1cy5PSykgewotCQkgIHZlcmlmeU91dHB1dCgpOwotCQl9IGVsc2UgewotCQkgIHRocm93IG5ldyBFeGNlcHRpb24oc3RhdHVzLmdldFRocm93YWJsZSgpKTsKLQkJfQotCi0JfQotCQotICAvKioKLSAgICogVmVyaWZ5IHRoZSBzY2VuYXJpbyBjb21wbGV0ZWQgc3VjY2VzZnVsbHkKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHZlcmlmeU91dHB1dCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIElQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0gICAgCi0gICAgSVBhdGggZGVzdFBhdGggPSBSZXNvdXJjZVV0aWxzLmdldEphdmFTb3VyY2VMb2NhdGlvbih3ZWJQcm9qZWN0LCBDTElFTlRfV0VCX01PRFVMRV9OQU1FKTsKLSAgICBJRm9sZGVyIHNyY0ZvbGRlciA9IChJRm9sZGVyKVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKGRlc3RQYXRoKTsKLSAgICAKLQkJLy9JRm9sZGVyIHNyY0ZvbGRlciA9IEpVbml0VXRpbHMuZ2V0U291cmNlRm9sZGVyRm9yV2ViUHJvamVjdChDTElFTlRfUFJPSkVDVF9OQU1FKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBzcmNGb2xkZXIuZ2V0Rm9sZGVyKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShmb2xkZXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGZvbGRlci5tZW1iZXJzKCkubGVuZ3RoID4gMCk7Ci0JCQotCQkvL1RPRE8gQ2hlY2sgdGhhdCB0aGUgY2xpZW50IHJ1bnMgICAgCi0KLQl9Ci0JCi0gIC8qKgotICAgKiBSZW1vdmUgd29ya3NwYWNlIGlmIG5lY2Vzc2FyeQotICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVJbnB1dERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBEZWxldGUgdGhlIFdlYiBwcm9qZWN0LgotCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KENMSUVOVF9QUk9KRUNUX05BTUUpOwotCQl3ZWJQcm9qZWN0LmRlbGV0ZSh0cnVlLHRydWUsRW52aXJvbm1lbnRVdGlscy5nZXRJUHJvZ3Jlc3NNb25pdG9yKGVudl8pKTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9heGlzL3RvbWNhdC92NTAvcGVyZm1zci9QZXJmbXNyVERKYXZhQXhpc1RDNTAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL2F4aXMvdG9tY2F0L3Y1MC9wZXJmbXNyL1BlcmZtc3JUREphdmFBeGlzVEM1MC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTczYmM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL2F4aXMvdG9tY2F0L3Y1MC9wZXJmbXNyL1BlcmZtc3JUREphdmFBeGlzVEM1MC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkVudmlyb25tZW50VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAuV1NXaXphcmRUb21jYXQ1MFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnV0aWwuSlVuaXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5TY2VuYXJpb0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VNZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU2ltcGxlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXM7Ci0KLS8qKgotICogVG9wIGRvd24gcGVyZm9ybWFuY2Ugc2NlbmFyaW8gd2l0aCBBeGlzIGFuZCBUb21jYXQgdjUuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyZm1zclRESmF2YUF4aXNUQzUwIGV4dGVuZHMgV1NXaXphcmRUb21jYXQ1MFRlc3QgewotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIFdTX1JVTlRJTUVJRF9BWElTID0gIm9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSI7Ci0gIAotICBwcml2YXRlIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFX05BTUUgPSAiVGVzdFREV2ViTW9kdWxlIjsgIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJUZXN0VERQcm9qZWN0IjsKLQlwcml2YXRlIElGaWxlIHNvdXJjZUZpbGVfOwotCQotCi0gIC8qKgotICAgKiBTZXRzIHVwIHRoZSBpbnB1dCBkYXRhOwotICAgKiAtIGNyZWF0ZSBwcm9qZWN0KHMpLAotICAgKiAtIGNvcHkgcmVzb3VyY2VzIHRvIHdvcmtzcGFjZSAKLSAgICovICAKLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gQ3JlYXRlIGFuIGFzc29jaWF0ZWQgV2ViIHByb2plY3QgKFRlc3RXZWIpIHRhcmdldHRlZCB0byBUb21jYXQgNS4wCi0JCVN0YXR1cyBzID0gSlVuaXRVdGlscy5jcmVhdGVXZWJNb2R1bGUoUFJPSkVDVF9OQU1FLCBXRUJfTU9EVUxFX05BTUUsIFNFUlZFUlRZUEVJRF9UQzUwLCBTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCksIGVudl8pOwotCQlpZiAocy5nZXRTZXZlcml0eSgpICE9IFN0YXR1cy5PSykKLQkJCXRocm93IG5ldyBFeGNlcHRpb24ocy5nZXRUaHJvd2FibGUoKSk7Ci0gICAgCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZSh3ZWJQcm9qZWN0LmV4aXN0cygpKTsKLQotLy8JCUpVbml0VXRpbHMuc3RhcnRTZXJ2ZXIoc2VydmVyXywgZW52Xyk7Ci0gICAgSUZvbGRlciBkZXN0Rm9sZGVyID0gKElGb2xkZXIpSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRDb250YWluZXIod2ViUHJvamVjdCwgV0VCX01PRFVMRV9OQU1FKTsJCQotCQlKVW5pdFV0aWxzLmNvcHlUZXN0RGF0YSgiVERKYXZhIixkZXN0Rm9sZGVyLGVudl8pOwotCQlzb3VyY2VGaWxlXyA9IGRlc3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiRWNoby53c2RsIikpOwotCQlhc3NlcnRUcnVlKHNvdXJjZUZpbGVfLmV4aXN0cygpKTsKLQotCX0KLQotICAvKioKLSAgICogU2V0IHRoZSBwZXJzaXN0ZW50IHNlcnZlciBydW50aW1lIGNvbnRleHQgcHJlZmVyZW5jZXMKLSAgICovICAKLQlwcm90ZWN0ZWQgdm9pZCBpbml0SjJFRVdTUnVudGltZVNlcnZlckRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFNldCBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciBKMkVFIDEuNCwgQXhpcyBhbmQgVG9tY2F0IHY1LjAgc2VydmVyCi0JCUpVbml0VXRpbHMuc2V0SjJFRVdTUnVudGltZVNlcnZlcihTdHJpbmcudmFsdWVPZihKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCksIFdTX1JVTlRJTUVJRF9BWElTLCBTRVJWRVJUWVBFSURfVEM1MCk7CQkKLQl9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24KLSAgICovICAKLQlwcm90ZWN0ZWQgdm9pZCBpbml0SW5pdGlhbFNlbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlpbml0aWFsU2VsZWN0aW9uXyA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNvdXJjZUZpbGVfKTsKLQotCX0KLQotICAvKioKLSAgICogTGF1bmNoZXMgdGhlIHBvcC11cCBjb21tYW5kIHRvIGluaXRpYXRlIHRoZSBzY2VuYXJpbwotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8gIAotCXB1YmxpYyB2b2lkIHRlc3RUREphdmFBeGlzVEM1MCgpIHRocm93cyBFeGNlcHRpb24gewotCSAgCi0JICBTdGF0dXMgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIik7Ci0JCVBlcmZvcm1hbmNlIHBlcmY9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQkJUGVyZm9ybWFuY2VNZXRlciBwZXJmb3JtYW5jZU1ldGVyPSBwZXJmLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIocGVyZi5nZXREZWZhdWx0U2NlbmFyaW9JZCh0aGlzKSk7CSAgICAKLQkgICAgdHJ5IHsKLSAgICAKLQkgICAgICBwZXJmb3JtYW5jZU1ldGVyLnN0YXJ0KCk7Ci0JICAgICAgc3RhdHVzID0gSlVuaXRVdGlscy5sYXVuY2hDcmVhdGlvbldpemFyZChTY2VuYXJpb0NvbnN0YW50cy5XSVpBUkRJRF9UT1BfRE9XTixTY2VuYXJpb0NvbnN0YW50cy5PQkpFQ1RfQ0xBU1NfSURfSUZJTEUsaW5pdGlhbFNlbGVjdGlvbl8pOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOwotCSAgICAgIHBlcmZvcm1hbmNlTWV0ZXIuY29tbWl0KCk7Ci0JICAgICAgcGVyZi5hc3NlcnRQZXJmb3JtYW5jZShwZXJmb3JtYW5jZU1ldGVyKTsKLQkgICAgfQotCSAgICBmaW5hbGx5IHsKLQkJCXBlcmZvcm1hbmNlTWV0ZXIuZGlzcG9zZSgpOwotCSAJfQotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gU3RhdHVzLk9LKQotCQkgIHZlcmlmeU91dHB1dCgpOwotCQllbHNlCi0JCSAgdGhyb3cgbmV3IEV4Y2VwdGlvbihzdGF0dXMuZ2V0VGhyb3dhYmxlKCkpOwotCi0JfQotCi0gIC8qKgotICAgKiBWZXJpZnkgdGhlIHNjZW5hcmlvIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKLSAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIHZlcmlmeU91dHB1dCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0gICAgSVByb2plY3Qgd2ViUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChQUk9KRUNUX05BTUUpOyAgICAKLSAgICBJRm9sZGVyIHdlYkNvbnRlbnRGb2xkZXIgPSAoSUZvbGRlcilKMkVFVXRpbHMuZ2V0V2ViQ29udGVudENvbnRhaW5lcih3ZWJQcm9qZWN0LCBXRUJfTU9EVUxFX05BTUUpOyAgICAKLSAgICAKLSAgICBJUGF0aCB3ZWJJbmZQYXRoID0gSjJFRVV0aWxzLmdldFdlYkluZlBhdGgod2ViUHJvamVjdCwgV0VCX01PRFVMRV9OQU1FKTsKLSAgICBJRm9sZGVyIHdlYkluZkZvbGRlciA9IChJRm9sZGVyKVJlc291cmNlVXRpbHMuZmluZFJlc291cmNlKHdlYkluZlBhdGgpOwotCQkKLQkJSUZvbGRlciB3c2RsRm9sZGVyID0gd2ViQ29udGVudEZvbGRlci5nZXRGb2xkZXIoIndzZGwiKTsKLQkJYXNzZXJ0VHJ1ZSh3c2RsRm9sZGVyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSh3c2RsRm9sZGVyLm1lbWJlcnMoKS5sZW5ndGggPiAwKTsKLQotICAgIC8vVE9ETyBWZXJpZnkgdGhhdCB3c2RkIGNvbnRhaW5zIHRoaXMgV2ViIHNlcnZpY2UKLSAgICAvL1RPRE8gVmVyaWZ5IHRoYXQgdGhlIHNlcnZpY2UgY2FuIGJlIGludm9rZWQgYnkgYSBjbGllbnQKLQl9Ci0JCi0gIC8qKgotICAgKiBDbGVhciB3b3Jrc3BhY2UgaWYgcmVxdWlyZWQKLSAgICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERlbGV0ZSB0aGUgV2ViIHByb2plY3QuCi0JCUlQcm9qZWN0IHdlYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoUFJPSkVDVF9OQU1FKTsKLQkJd2ViUHJvamVjdC5kZWxldGUodHJ1ZSx0cnVlLEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnZfKSk7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvcGVyZm9ybWFuY2UvQWxsUGVyZm9ybWFuY2VUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvcGVyZm9ybWFuY2UvQWxsUGVyZm9ybWFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzAxMDIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbFBlcmZvcm1hbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyQlVKYXZhQXhpc1RDNTA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JDbGllbnRBeGlzVEM1MDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zclRESmF2YUF4aXNUQzUwOwotCi1wdWJsaWMgY2xhc3MgQWxsUGVyZm9ybWFuY2VUZXN0cyB7Ci0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAKLSAgICAvLyBUT0RPOiBDcmVhdGUgYSB0ZXN0IHN1aXRlIAotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZSIpOwotICAgIC8vJEpVbml0LUJFR0lOJAotICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQZXJmbXNyQlVKYXZhQXhpc1RDNTAuY2xhc3MpOwotICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQZXJmbXNyVERKYXZhQXhpc1RDNTAuY2xhc3MpOwotICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShQZXJmbXNyQ2xpZW50QXhpc1RDNTAuY2xhc3MpOwotICAgIC8vJEpVbml0LUVORCQKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3BlcmZvcm1hbmNlL3BsdWdpbi9QZXJmb3JtYW5jZVBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvcGVyZm9ybWFuY2UvcGx1Z2luL1BlcmZvcm1hbmNlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjYwNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvcGVyZm9ybWFuY2UvcGx1Z2luL1BlcmZvcm1hbmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQZXJmb3JtYW5jZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpbiIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJmb3JtYW5jZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUGVyZm9ybWFuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzM5YThmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InBlcmZvcm1hbmNlIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPCEtLSA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2UiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vd29ya3NwYWNlX3dzX3BlcmZvcm1hbmNlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1Eb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTA9JHt0ZXN0RGlyfS8ke3RvbWNhdDUwRGlyfSIvPgotICAgICAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlX3N1aXRlIj4KLSAgCQotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+ICAgIAkKLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLmF4aXMudG9tY2F0LnY1MC5wZXJmbXNyLlBlcmZtc3JCVUphdmFBeGlzVEM1MCIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPiAgICAgIAotICAgIDwvYW50PgotICAJCi0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4gICAgCQotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLnBlcmZtc3IuUGVyZm1zckNsaWVudEF4aXNUQzUwIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+ICAgICAgCi0gICAgPC9hbnQ+Ci0gIAkKLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPiAgICAJCi0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTAucGVyZm1zci5QZXJmbXNyVERKYXZhQXhpc1RDNTAiIC8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4gICAgICAKLSAgICA8L2FudD4gIAkKLSAgCQotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4gIAotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZSIgZGVwZW5kcz0iaW5pdCxwZXJmb3JtYW5jZV9zdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGVyZm9ybWFuY2UqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiYmNjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0NjNhZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MGQ1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzJkOGI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEphdmEgV2ViIFNlcnZpY2VzIFRvb2xzIFRlc3RzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogdGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGx1Z2luLlRlc3RzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBJQk0KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cywKLSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuYXhpcy50b21jYXQudjUwLAotIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS53c3Qud3MudWksCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ2YzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gYnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIGRhdGEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcmVhZG1lLnR4dCxcCi0gICAgICAgICAgICAgICB0ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB0ZXN0cy5qYXIKLXNvdXJjZS50ZXN0cy5qYXIgPSB0ZXN0cy8KLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvZGF0YS9CVUphdmEvY2xpZW50L0VjaG9Qcm94eVRlc3QuanNwIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvQlVKYXZhL2NsaWVudC9FY2hvUHJveHlUZXN0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwZTNiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvZGF0YS9CVUphdmEvY2xpZW50L0VjaG9Qcm94eVRlc3QuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgaW1wb3J0PSJqYXZhLmlvLioiICU+Ci08anNwOnVzZUJlYW4gaWQ9ImVjaG9Qcm94eSIgY2xhc3M9ImZvby5FY2hvUHJveHkiIHNjb3BlPSJyZXF1ZXN0Ii8+Ci08aHRtbD4KLTwlQCBpbmNsdWRlIGZpbGUgPSAiL291dHB1dEZpbGVQYXRoLmpzcGYiICU+Ci08JQotICAgLy8gSFRUUC9QT1NUIHBhcmFtZXRlcjoKLSAgIC8vIHRlc3RJbnB1dCAtIHRoZSBTdHJpbmcgYXJndW1lbnQgdG8gY2FsbCB0aGUgcHJveHkgd2l0aC4KLSAgIFN0cmluZyB0ZXN0SW5wdXQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcigidGVzdElucHV0Iik7Ci0gICAKLSAgIC8vIEV4ZWN1dGUgdGhlIFdlYiBzZXJ2aWNlLgotICAgU3RyaW5nIHJlc3VsdCA9IGVjaG9Qcm94eS5lY2hvU3RyaW5nKHRlc3RJbnB1dCk7Ci0gICAKLSAgIC8vIFdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIG91dHB1dEZpbGVQYXRoLgotICAgUHJpbnRXcml0ZXIgcHcgPSBudWxsOwotICAgdHJ5Ci0gICB7Ci0gICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGVQYXRoKSk7Ci0gICAgIHB3LnByaW50KHJlc3VsdCk7Ci0gICAgIHB3LmZsdXNoKCk7Ci0gICB9ICAgCi0gICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICB7Ci0gICB9Ci0gICBmaW5hbGx5Ci0gICB7Ci0gICAgIGlmIChwdyAhPSBudWxsKQotICAgICAgIHB3LmNsb3NlKCk7Ci0gICB9Ci0lPgotPC9ib2R5PgotPHA+Ci10ZXN0SW5wdXQ6IDwlPXRlc3RJbnB1dCU+Ci08cD4KLW91dHB1dEZpbGVQYXRoOiA8JT1vdXRwdXRGaWxlUGF0aCU+Ci08cD4KLVRoZSByZXN1bHQgaXMgPCU9cmVzdWx0JT4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvZGF0YS9CVUphdmEvc3JjL2Zvby9FY2hvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvZGF0YS9CVUphdmEvc3JjL2Zvby9FY2hvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODkzZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvQlVKYXZhL3NyYy9mb28vRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1wYWNrYWdlIGZvbzsKLQotcHVibGljIGNsYXNzIEVjaG8KLXsKLQlwdWJsaWMgU3RyaW5nIGVjaG9TdHJpbmcoU3RyaW5nIGlucHV0KQotCXsKLQkJcmV0dXJuIGlucHV0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvZGF0YS9UREphdmEvRWNoby53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvVERKYXZhL0VjaG8ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkZjMyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvZGF0YS9UREphdmEvRWNoby53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2ZvbyIgeG1sbnM6aW1wbD0iaHR0cDovL2ZvbyIgeG1sbnM6aW50Zj0iaHR0cDovL2ZvbyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp3c2k9Imh0dHA6Ly93cy1pLm9yZy9wcm9maWxlcy9iYXNpYy8xLjEveHNkIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSA8d3NkbDp0eXBlcz4KLSAgPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9mb28iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6aW1wbD0iaHR0cDovL2ZvbyIgeG1sbnM6aW50Zj0iaHR0cDovL2ZvbyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgPGVsZW1lbnQgbmFtZT0iZWNob1N0cmluZ1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmdSZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9ImVjaG9TdHJpbmciPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iaW5wdXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgPC9zY2hlbWE+Ci0gPC93c2RsOnR5cGVzPgotCi0gICA8d3NkbDptZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0KLSAgICAgIDx3c2RsOnBhcnQgZWxlbWVudD0iaW1wbDplY2hvU3RyaW5nUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KLQotICAgPC93c2RsOm1lc3NhZ2U+Ci0KLSAgIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiPgotCi0gICAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9ImltcGw6ZWNob1N0cmluZyIgbmFtZT0icGFyYW1ldGVycyIvPgotCi0gICA8L3dzZGw6bWVzc2FnZT4KLQotICAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iRWNobyI+Ci0KLSAgICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLQotICAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iaW1wbDplY2hvU3RyaW5nUmVxdWVzdCIgbmFtZT0iZWNob1N0cmluZ1JlcXVlc3QiLz4KLQotICAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImltcGw6ZWNob1N0cmluZ1Jlc3BvbnNlIiBuYW1lPSJlY2hvU3RyaW5nUmVzcG9uc2UiLz4KLQotICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLQotICAgPC93c2RsOnBvcnRUeXBlPgotCi0gICA8d3NkbDpiaW5kaW5nIG5hbWU9IkVjaG9Tb2FwQmluZGluZyIgdHlwZT0iaW1wbDpFY2hvIj4KLQotICAgICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotCi0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0KLSAgICAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0KLSAgICAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImVjaG9TdHJpbmdSZXF1ZXN0Ij4KLQotICAgICAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0KLSAgICAgICAgIDwvd3NkbDppbnB1dD4KLQotICAgICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImVjaG9TdHJpbmdSZXNwb25zZSI+Ci0KLSAgICAgICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotCi0gICAgICAgICA8L3dzZGw6b3V0cHV0PgotCi0gICAgICA8L3dzZGw6b3BlcmF0aW9uPgotCi0gICA8L3dzZGw6YmluZGluZz4KLQotICAgPHdzZGw6c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0KLSAgICAgIDx3c2RsOnBvcnQgYmluZGluZz0iaW1wbDpFY2hvU29hcEJpbmRpbmciIG5hbWU9IkVjaG8iPgotCi0gICAgICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdDo5MDgwL1Rlc3RXZWIvc2VydmljZXMvRWNobyIvPgotCi0gICAgICA8L3dzZGw6cG9ydD4KLQotICAgPC93c2RsOnNlcnZpY2U+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy9kYXRhL3dlYmNsaWVudC9vdXRwdXRGaWxlUGF0aC5qc3BmIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvd2ViY2xpZW50L291dHB1dEZpbGVQYXRoLmpzcGYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YTdhZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL2RhdGEvd2ViY2xpZW50L291dHB1dEZpbGVQYXRoLmpzcGYKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci08L2hlYWQ+ICAKLTwlCi0gICBTdHJpbmcgb3V0cHV0RmlsZVBhdGggPSByZXF1ZXN0LmdldFBhcmFtZXRlcigib3V0cHV0RmlsZVBhdGgiKTsKLSU+ICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNjVmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3JlYWRtZS50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljZGQ4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW4gYXJlOiAKLQotLURldG9vbHNfcGVyZl9jdHJsPSJsb2c9ZDovcGVyZmxvZ3MvdjYwMDE7dGVzdGQ9NTEiIC1EdG9tY2F0LnNlcnZlci52NTA9RTpcXFRvbWNhdFxcVG9tY2F0NS4wCi0KLSwgd2hlcmUgZXRvb2xzX3BlcmZfY3J0bCBpcyB0aGUgbG9nIG91dHB1dCBkaXJlY3RvcnkgYW5kIHRlc3QgaWQsIGFuZCB0b21jYXQuc2VydmVyLnY1MCBpcyB0aGUgaW5zdGFsbCBkaXJlY3Rvcnkgb2YgeW91ciBUb21jYXQgdjUuMCBzZXJ2ZXIuCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZTRjNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSA8IS0tIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+IC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MD0ke3Rlc3REaXJ9LyR7dG9tY2F0NTBEaXJ9Ii8+Ci0JCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpzdC13cy1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanN0X3dzX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anN0LXdzLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0LkFsbFdTSlVuaXRUZXN0cyIgLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPiAgICAJCi0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL1dTV2l6YXJkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9XU1dpemFyZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxNjIyZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL1dTV2l6YXJkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS5lY2xpcHNlLkVjbGlwc2VQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVN0YXR1c0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTV2l6YXJkVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIEVudmlyb25tZW50IGVudl87Ci0JcHJvdGVjdGVkIElSdW50aW1lIHNlcnZlclJ1bnRpbWVfOwotCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcl87Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb25fOwotICAKLSAgcHVibGljIFN0cmluZyBkZWZhdWx0VVJMXyA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAvIjsKLQkKLQkvKioKLQkgKiBTZXQgdXAgdGhlIHdvcmtzcGFjZSBmb3IgdGhlIFdlYiBTZXJ2aWNlIFdpemFyZCBKVW5pdCB0ZXN0LiBTZXR1cCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCSAqIDEpIE9idGFpbiBhbiBpbnN0YW5jZSBvZiB0aGUgZW52aXJvbm1lbnQuCi0JICogMikgSW5zdGFsbCB0aGUgc2VydmVyIHJ1bnRpbWUuCi0JICogMykgSW5zdGFsbCB0aGUgaW5wdXQgZGF0YS4gVGhpcyBtYXkgaW5jbHVkZSBwcm9qZWN0cywgc291cmNlIGZpbGVzIGV0Yy4KLQkgKiA0KSBJbnN0YWxsIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIgaWYgcmVxdWlyZWQuIFRoaXMgbWF5IGFsc28gaW5jbHVkZSBjb25maWd1cmF0aW9uIG9mIHRoZSBpbnB1dCBkYXRhIG9uIHRoZSBzZXJ2ZXIuCi0JICogNSkgSW5pdGlhbGl6ZSB0aGUgSjJFRSwgV2ViIFNlcnZpY2UgUnVudGltZSBhbmQgU2VydmVyIHR5cGUgZGVmYXVsdHMgZm9yIHRoZSBXZWIgU2VydmljZSB3aXphcmQgdG8gdXNlLgotCSAqIDYpIEluaXRpYWxpemUgdGhlIGluaXRpYWwgc2VsZWN0aW9uIG9iamVjdCB0byBzZXQgdGhlIGNvbnRleHQgZm9yIHRoZSBXZWIgU2VydmljZSB3aXphcmQuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCS8vIEdldCBhbiBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCB3aXRoIHRoZSBBY2N1bXVsYXRlU3RhdHVzSGFuZGxlciB0byBtaW5pbWl6ZSBVSSBkaWFsb2cgYmxvY2tzLgotCSAgCVBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQgIHJlc291cmNlQ29udGV4dCA9IFBlcnNpc3RlbnRSZXNvdXJjZUNvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLQkJRWNsaXBzZVN0YXR1c0hhbmRsZXIgICAgICAgaGFuZGxlciAgICAgICAgID0gbmV3IEVjbGlwc2VTdGF0dXNIYW5kbGVyKCk7Ci0JCUVjbGlwc2VQcm9ncmVzc01vbml0b3IgICAgIG1vbml0b3IgICAgICAgICA9IG5ldyBFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCUVjbGlwc2VFbnZpcm9ubWVudCAgICAgICAgIGVudmlyb25tZW50ICAgICA9IG5ldyBFY2xpcHNlRW52aXJvbm1lbnQoIG51bGwsIHJlc291cmNlQ29udGV4dCwgbW9uaXRvciwgaGFuZGxlciApOwotCSAgCi0JCWVudl8gPSBlbnZpcm9ubWVudDsgCi0JCWFzc2VydFRydWUoZW52XyAhPSBudWxsKTsKLQkJCi0JCUlQcm9ncmVzc01vbml0b3IgbnBtID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsgCi0JCW1vbml0b3Iuc2V0TW9uaXRvcihucG0pOwotCQlzZXJ2ZXJfID0gbnVsbDsKLQkJSlVuaXRVdGlscy5oaWRlQWN0aW9uRGlhbG9ncygpOwotICAgICAgICBKVW5pdFV0aWxzLmVuYWJsZUZsZXhQcm9qZWN0UHJlZmVyZW5jZSgpOyAgICAKLQkJaW5zdGFsbFNlcnZlclJ1bnRpbWUoKTsKLQkJaW5zdGFsbFNlcnZlcigpOwotCQlpbnN0YWxsSW5wdXREYXRhKCk7Ci0JCWluaXRKMkVFV1NSdW50aW1lU2VydmVyRGVmYXVsdHMoKTsKLQkJaW5pdEluaXRpYWxTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5zdGFsbCB0aGUgc2VydmVyIHJ1bnRpbWUuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnN0YWxsU2VydmVyUnVudGltZSgpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogSW5zdGFsbHMgdGhlIGlucHV0IGRhdGEgZnJvbSBhbiBhZ2dyZWdhdG9yLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgZW52aXJvbm1lbnQsIHJ1bnRpbWUKLQkgKiBhbmQgc2VydmVyIGFyZSBjb3JyZWN0bHkgc2V0IG9uIHRoZSBhZ2dyZWdhdGUgc2luY2UgaXRzIGxpZmVjeWNsZSBtZXRob2RzIGFyZSBub3QgbmVjZXNzYXJpbHkKLQkgKiBjYWxsZWQuCi0JICogQHBhcmFtIGVudgotCSAqIEBwYXJhbSBzZXJ2ZXJSdW50aW1lCi0JICogQHBhcmFtIHNlcnZlcgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbElucHV0RGF0YShFbnZpcm9ubWVudCBlbnYsSVJ1bnRpbWUgc2VydmVyUnVudGltZSxJU2VydmVyIHNlcnZlcikgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJZW52XyA9IGVudjsKLQkJc2VydmVyUnVudGltZV8gPSBzZXJ2ZXJSdW50aW1lOwotCQlzZXJ2ZXJfID0gc2VydmVyOwotCQlpbnN0YWxsSW5wdXREYXRhKCk7Ci0JfQotCQotCS8qKgotCSAqIEluc3RhbGwgdGhlIGlucHV0IGRhdGEgZm9yIHRoZSB0ZXN0LiBUaGlzIG1heSBpbmNsdWRlIHByb2plY3RzLCBzb3VyY2UgZmlsZXMgZXRjLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5zdGFsbElucHV0RGF0YSgpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogSW5zdGFsbCBhbiBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLiBUaGlzIG1heSBhbHNvIGNvbmZpZ3VyZSBpbnB1dCBkYXRhIG9uIHRoZSBzZXJ2ZXIuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbnN0YWxsU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBKMkVFIGxldmVsLCBXZWIgU2VydmljZSBydW50aW1lIHR5cGUgYW5kIFNlcnZlciBkZWZhdWx0cyBmb3IgdGhlIHRlc3QgY2FzZS4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRKMkVFV1NSdW50aW1lU2VydmVyRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHdoaWNoIGRyaXZlcyB0aGUgV2ViIFNlcnZpY2Ugd2l6YXJkLiBUaGlzIGNvdWxkIGluY2x1ZGUgc291cmNlIEphdmEgZmlsZXMsCi0JICogV1NETCBVUkxzIGFuZCBldmVuIEVKQnMuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0SW5pdGlhbFNlbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogQ2xlYW4gdXAgdGhlIHdvcmtzcGFjZS4gQ2xlYW51cCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCSAqIDEpIERlbGV0ZSB0aGUgaW5wdXQgZGF0YS4gVGhpcyBzaG91bGQgaW5jbHVkZSByZW1vdmFsIG9mIGNvbmZpZ3VyYXRpb24gZGF0YSBvbiB0aGUgc2VydmVyIGlmIG5lY2Vzc2FyeS4KLQkgKiAyKSBTdG9wIHRoZSBzZXJ2ZXIuCi0JICogMykgRGVsZXRlIHRoZSBzZXJ2ZXIuCi0JICogNCkgRGVsZXRlIHRoZSBzZXJ2ZXIgcnVudGltZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXN0b3BTZXJ2ZXIoKTsKLS8vCQlkZWxldGVTZXJ2ZXIoKTsKLS8vICAgICAgZGVsZXRlSW5wdXREYXRhKCk7Ci0vLwkJZGVsZXRlU2VydmVyUnVudGltZSgpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGlucHV0IGRhdGEuIFRoaXMgc2hvdWxkIGluY2x1ZGUgcmVtb3ZhbCBvZiBwcm9qZWN0cywgc3JjIGZpbGVzIGV0Yy4gYXMgd2VsbCBhcyByZW1vdmFsIG9mIGFueSBzZXJ2ZXIgY29uZmlndXJlZCBkYXRhLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGVsZXRlSW5wdXREYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBTdG9wIHRoZSBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZy4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0b3BTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlpZiAoc2VydmVyXyAhPSBudWxsICYmIHNlcnZlcl8uZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpCi0JCQlzZXJ2ZXJfLnN0b3AodHJ1ZSk7Ci0JCWFzc2VydFRydWUoc2VydmVyXy5nZXRTZXJ2ZXJTdGF0ZSgpID09IElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgc2VydmVyLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaWYgKHNlcnZlcl8gIT0gbnVsbCkKLQkJCXNlcnZlcl8uZGVsZXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgc2VydmVyIHJ1bnRpbWUuCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVTZXJ2ZXJSdW50aW1lKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaWYgKHNlcnZlclJ1bnRpbWVfICE9IG51bGwpCi0JCQlzZXJ2ZXJSdW50aW1lXy5kZWxldGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBkZWZhdWx0IFVSTCBpbiB0aGUgZm9ybSBvZjogaHR0cDovL2xvY2FsaG9zdDo5MDgwLzxjb250ZXh0Um9vdD4vPHBhdGg+Ci0JICogQHBhcmFtIHBhdGggLSBhIGZpbGUgb3IgVVJMIHJlbGF0aXZlIHBhdGguCi0JICogQHBhcmFtIGNvbnRleHRSb290IC0gdGhlIGNvbnRleHQgcm9vdCBvZiB0aGUgV2ViIG1vZHVsZSBmb3IgdGhpcyBVUkwuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFVSTChTdHJpbmcgcGF0aCxTdHJpbmcgY29udGV4dFJvb3QpCi0JewotCQlTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcihkZWZhdWx0VVJMXyk7Ci0JCXVybC5hcHBlbmQoY29udGV4dFJvb3QpOwotCQl1cmwuYXBwZW5kKCcvJyk7Ci0JCXVybC5hcHBlbmQocGF0aCk7Ci0JCXJldHVybiB1cmwudG9TdHJpbmcoKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL1dTV2l6YXJkVG9tY2F0NTBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL2F4aXMvdG9tY2F0L3Y1MC9XU1dpemFyZFRvbWNhdDUwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjU4ZGI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvYXhpcy90b21jYXQvdjUwL1dTV2l6YXJkVG9tY2F0NTBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5heGlzLnRvbWNhdC52NTA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMuV1NXaXphcmRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsLkpVbml0VXRpbHM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdTV2l6YXJkVG9tY2F0NTBUZXN0IGV4dGVuZHMgV1NXaXphcmRUZXN0IHsKLSAgCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBTRVJWRVJfSU5TVEFMTF9QQVRIID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIpOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUlVOVElNRVRZUEVJRF9UQzUwID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU0VSVkVSVFlQRUlEX1RDNTAgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiOwotCSAgCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud2FzLnRlc3RzLldTV2l6YXJkVGVzdCNpbnN0YWxsU2VydmVyUnVudGltZSgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsU2VydmVyUnVudGltZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgc2VydmVyUnVudGltZV8gPSBKVW5pdFV0aWxzLmNyZWF0ZVNlcnZlclJ1bnRpbWUoUlVOVElNRVRZUEVJRF9UQzUwLCBTRVJWRVJfSU5TVEFMTF9QQVRIKTsKLSAgfQotCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud2FzLnRlc3RzLldTV2l6YXJkVGVzdCNpbnN0YWxsU2VydmVyKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGluc3RhbGxTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgIHNlcnZlcl8gPSBKVW5pdFV0aWxzLmNyZWF0ZVNlcnZlcigiQXBhY2hlIFRvbWNhdCB2NTAiLCBTRVJWRVJUWVBFSURfVEM1MCwgc2VydmVyUnVudGltZV8sIGVudl8pOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9wbHVnaW4vVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvcGx1Z2luL1Rlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NjgyNTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy9wbHVnaW4vVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBsdWdpbjsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdHNQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMucGx1Z2luLlRlc3RzUGx1Z2luIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3RzUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9BbGxXU0pVbml0VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQWxsV1NKVW5pdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmZjMmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9BbGxXU0pVbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnVuaXR0ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBydW4gYWxsIHRoZSB1bml0dGVzdCB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFdTSlVuaXRUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIC8qKgotICAgKiBNZXRob2QgcGFyc2VBcmdzLgotICAgKiAKLSAgICogQHBhcmFtIGFyZ3MKLSAgICovCi0gIHByaXZhdGUgdm9pZCBwYXJzZUFyZ3MoT2JqZWN0IGFyZ3MpCi0gIHsKLSAgICAvLyB0eXBpY2lhbGx5IGFyZ3MgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncywKLSAgICAvLyBub3Qgc3VyZSB3aGVuIGl0IHdvdWxkbid0IGJlLgotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIG5ldyBBbGxXU0pVbml0VGVzdHMoKS5ydW5NYWluKGFyZ3MpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBydW5NYWluKE9iamVjdCBhcmdzKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVGVzdFJ1bm5lciB0ZXN0UnVubmVyID0gbnVsbDsKLQotICAgICAgcGFyc2VBcmdzKGFyZ3MpOwotCi0gICAgICB0ZXN0UnVubmVyID0gbmV3IFRlc3RSdW5uZXIoU3lzdGVtLm91dCk7Ci0gCi0KLSAgICAgIFRlc3Qgc3VpdGUgPSBzdWl0ZSgpOwotICAgICAgVGVzdFJlc3VsdCB0ZXN0UmVzdWx0ID0gdGVzdFJ1bm5lci5kb1J1bihzdWl0ZSwgZmFsc2UpOwotICAgICAgcHJpbnRIZWFkZXIodGVzdFJlc3VsdCk7ICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBlOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCggQ29tcG9uZW50Q3JlYXRpb25UZXN0cy5zdWl0ZSgpICk7Ci0gICAgdGVzdFN1aXRlLmFkZFRlc3QoIEoyRUVVdGlsc1Rlc3RzLnN1aXRlKCkgKTsKLSAgICB0ZXN0U3VpdGUuYWRkVGVzdCggU2VydmVyQ3JlYXRpb25UZXN0cy5zdWl0ZSgpKTsKLSAgICAvLwl0ZXN0U3VpdGUuYWRkVGVzdCggUmVzb3VyY2VVdGlsc1Rlc3RzLnN1aXRlKCkgKTsKLQotCi0gICAgcmV0dXJuIHRlc3RTdWl0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBQcmludHMgdGhlIGhlYWRlciBvZiB0aGUgcmVwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcmludEhlYWRlcihUZXN0UmVzdWx0IHJlc3VsdCkKLSAgewotICAgIGlmIChyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgU3lzdGVtLm91dC5wcmludCgiT0siKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICgiICsgcmVzdWx0LnJ1bkNvdW50KCkgKyAiIHRlc3RzKSIpOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVMhISEiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgIlRlc3RzIHJ1bjogIgotICAgICAgICAgICsgcmVzdWx0LnJ1bkNvdW50KCkKLSAgICAgICAgICArICIsICBGYWlsdXJlczogIgotICAgICAgICAgICsgcmVzdWx0LmZhaWx1cmVDb3VudCgpCi0gICAgICAgICAgKyAiLCAgRXJyb3JzOiAiCi0gICAgICAgICAgKyByZXN1bHQuZXJyb3JDb3VudCgpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvQ29tcG9uZW50Q3JlYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9Db21wb25lbnRDcmVhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NGNhZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9Db21wb25lbnRDcmVhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudW5pdHRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbWFuZC5jb21tb24uQ3JlYXRlTW9kdWxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbC5KVW5pdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogVGVzdHMgdGhlIHZhcmlvdXMgQ29tcG9uZW50IGNyZWF0aW9uIGNvbW1hbmRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb25lbnRDcmVhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBXU0pVbml0Q29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDb21wb25lbnRDcmVhdGlvblRlc3RzLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFdlYkNvbXBvbmVudENyZWF0aW9uKCl7Ci0KLSAgICAgICAgZW5hYmxlRmxleFByb2plY3RQcmVmZXJlbmNlKCk7Ci0gICAgICAgIGNyZWF0ZVNlcnZlclJ1bnRpbWUoKTsKLSAgICAgICAgY3JlYXRlV2ViTW9kdWxlKHByb2plY3ROYW1lLCB3ZWJDb21wb25lbnROYW1lLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0gICAgICAgIGNyZWF0ZVdlYk1vZHVsZShwcm9qZWN0TmFtZSwgd2ViQ29tcG9uZW50Mk5hbWUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLSAgICAgICAgCi0gICAgICAgIGNyZWF0ZVdlYk1vZHVsZShwcm9qZWN0Mk5hbWUsIHdlYkNvbXAzTmFtZSwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgICBjcmVhdGVXZWJNb2R1bGUocHJvamVjdDJOYW1lLCB3ZWJDb21wNE5hbWUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLSAgICAgICAgCi0JfQotICAKLSAgICBwdWJsaWMgdm9pZCBlbmFibGVGbGV4UHJvamVjdFByZWZlcmVuY2UoKXsKLSAgICAgIEpVbml0VXRpbHMuZW5hYmxlRmxleFByb2plY3RQcmVmZXJlbmNlKCk7Ci0gICAgfQotICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTZXJ2ZXJSdW50aW1lKCl7Ci0gICAgICAKLSAgICAgIHRyeSB7Ci0gICAgICAgIEpVbml0VXRpbHMuY3JlYXRlU2VydmVyUnVudGltZShSVU5USU1FVFlQRUlEX1RDNTAsIFNFUlZFUl9JTlNUQUxMX1BBVEgpOwotICAgICAgfQotICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfSAgICAgIAotICAgICAgCi0gICAgfQotICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlV2ViTW9kdWxlKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNvbXBvbmVudE5hbWUsIGludCBqMmVlVmVyc2lvbil7Ci0KLSAgICAgIENyZWF0ZU1vZHVsZUNvbW1hbmQgY21jID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLSAgICAgIGNtYy5zZXRKMmVlTGV2ZWwobmV3IEludGVnZXIoajJlZVZlcnNpb24pLnRvU3RyaW5nKCkpOwotICAgICAgY21jLnNldE1vZHVsZU5hbWUoY29tcG9uZW50TmFtZSk7Ci0gICAgICBjbWMuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLldFQik7Ci0gICAgICBjbWMuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgY21jLnNldFNlcnZlckZhY3RvcnlJZChTRVJWRVJUWVBFSURfVEM1MCk7Ci0gICAgICBjbWMuZXhlY3V0ZShudWxsKTsKLSAgICAgIAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIGNyZWF0aW5nIFdlYiBjb21wb25lbnQuLi4iK3Byb2plY3ROYW1lKyJcIiIrY29tcG9uZW50TmFtZSk7ICAgICAgCi0gICAgICBJUHJvamVjdCBwID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHAsIGNvbXBvbmVudE5hbWUpOwotICAgICAgYXNzZXJ0VHJ1ZSh2Yy5leGlzdHMoKSk7ICAgICAgCi0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUVKQk1vZHVsZSgpewotICAgICAKLSAgICAgIENyZWF0ZU1vZHVsZUNvbW1hbmQgY21jID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLSAgICAgIGNtYy5zZXRKMmVlTGV2ZWwobmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpLnRvU3RyaW5nKCkpOwotICAgICAgY21jLnNldE1vZHVsZU5hbWUoZWpiQ29tcG9uZW50TmFtZSk7Ci0gICAgICBjbWMuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLkVKQik7Ci0gICAgICBjbWMuc2V0UHJvamVjdE5hbWUoZWpiUHJvamVjdE5hbWUpOwotICAgICAgY21jLnNldFNlcnZlckZhY3RvcnlJZChTRVJWRVJUWVBFSURfVEM1MCk7Ci0gICAgICBjbWMuZXhlY3V0ZShudWxsKTsKLSAgICAgIAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIGNyZWF0aW5nIEVKQiBjb21wb25lbnQuIik7Ci0gICAgICBJUHJvamVjdCBwID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChlamJQcm9qZWN0TmFtZSk7Ci0gICAgICBJVmlydHVhbENvbXBvbmVudCB2YyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHAsIGVqYkNvbXBvbmVudE5hbWUpOwotICAgICAgYXNzZXJ0VHJ1ZSh2Yy5leGlzdHMoKSk7ICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBcHBDbGllbnRNb2R1bGUoKXsKLSAgICAgIENyZWF0ZU1vZHVsZUNvbW1hbmQgY21jID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLSAgICAgIGNtYy5zZXRKMmVlTGV2ZWwobmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpLnRvU3RyaW5nKCkpOwotICAgICAgY21jLnNldE1vZHVsZU5hbWUoYXBwQ2xpZW50Q29tcE5hbWUpOwotICAgICAgY21jLnNldE1vZHVsZVR5cGUoQ3JlYXRlTW9kdWxlQ29tbWFuZC5BUFBDTElFTlQpOwotICAgICAgY21jLnNldFByb2plY3ROYW1lKGFwcENsaWVudFByb2plY3ROYW1lKTsKLSAgICAgIGNtYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoU0VSVkVSVFlQRUlEX1RDNTApOwotICAgICAgY21jLmV4ZWN1dGUobnVsbCk7Ci0gICAgICAKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSBjcmVhdGluZyBBcHAgY2xpZW50IGNvbXBvbmVudC4iKTsKLSAgICAgIElQcm9qZWN0IHAgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KGFwcENsaWVudFByb2plY3ROYW1lKTsKLSAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocCwgYXBwQ2xpZW50Q29tcE5hbWUpOwotICAgICAgYXNzZXJ0VHJ1ZSh2Yy5leGlzdHMoKSk7ICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFQVJNb2R1bGUoKXsKLSAgICAgIENyZWF0ZU1vZHVsZUNvbW1hbmQgY21jID0gbmV3IENyZWF0ZU1vZHVsZUNvbW1hbmQoKTsKLSAgICAgIGNtYy5zZXRKMmVlTGV2ZWwobmV3IEludGVnZXIoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpLnRvU3RyaW5nKCkpOwotICAgICAgY21jLnNldE1vZHVsZU5hbWUoZWFyQ29tcE5hbWUpOwotICAgICAgY21jLnNldE1vZHVsZVR5cGUoQ3JlYXRlTW9kdWxlQ29tbWFuZC5FQVIpOwotICAgICAgY21jLnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLSAgICAgIGNtYy5zZXRTZXJ2ZXJGYWN0b3J5SWQoU0VSVkVSVFlQRUlEX1RDNTApOwotICAgICAgY21jLmV4ZWN1dGUobnVsbCk7Ci0gICAgICAKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSBjcmVhdGluZyBFQVIgY29tcG9uZW50LiIpOwotICAgICAgSVByb2plY3QgcCA9IFJlc291cmNlVXRpbHMuZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwLCBlYXJDb21wTmFtZSk7Ci0gICAgICBhc3NlcnRUcnVlKHZjLmV4aXN0cygpKTsgICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9KMkVFVXRpbHNUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9KMkVFVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDgwMmE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvSjJFRVV0aWxzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1hbmQuY29tbW9uLkFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBzZW5ncGwKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFVXRpbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgV1NKVW5pdENvbnN0YW50c3sKLQotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDEgPSBudWxsOwotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDIgPSBudWxsOwotICAgIHByaXZhdGUgSVByb2plY3QgZWpiUHJvamVjdCA9IG51bGw7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgY29tcDEgPSB3ZWJDb21wb25lbnROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGNvbXAyID0gd2ViQ29tcG9uZW50Mk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29tcDMgPSB3ZWJDb21wM05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY29tcDQgPSB3ZWJDb21wNE5hbWU7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCS8vIFByb2plY3QgYW5kIGNvbXBvbmVudCBuYW1lcyBpbml0aWFsaXplZCBoZXJlIQotCQlwcm9qZWN0MSA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdDEpOwotCQkKLQkJcHJvamVjdDIgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdDJOYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0Mik7Ci0gICAgCi0gICAgICAgIGVqYlByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZWpiUHJvamVjdE5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGVqYlByb2plY3QpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQkvLyBUT0RPIENsZWFyIHRoZSB3b3Jrc3BhY2UKLQkJCi0JfQotCi0JIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0JICB7Ci0JICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEoyRUVVdGlsc1Rlc3RzLmNsYXNzKTsKLQkgIH0KLQkgCi0JICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9uZW50c0V4aXN0KCl7Ci0JCSAgU3lzdGVtLm91dC5wcmludGxuKCI8IEJFR0lOOiB0ZXN0Q29tcG9uZW50RXhpc3RzIC4uLiIpOwotCQkgIElWaXJ0dWFsQ29tcG9uZW50IHZjMSA9IEoyRUVVdGlscy5nZXRWaXJ0dWFsQ29tcG9uZW50KHByb2plY3QxLCBjb21wMSk7Ci0JCSAgSVZpcnR1YWxDb21wb25lbnQgdmMyID0gSjJFRVV0aWxzLmdldFZpcnR1YWxDb21wb25lbnQocHJvamVjdDIuZ2V0TmFtZSgpLCBjb21wMyk7Ci0JCSAgCi0JCSAgYXNzZXJ0VHJ1ZSh2YzEuZXhpc3RzKCkpOwotCQkgIGFzc2VydFRydWUoSjJFRVV0aWxzLmV4aXN0cyhwcm9qZWN0MSwgY29tcDEpKTsKLQkJICBhc3NlcnRUcnVlKHZjMi5leGlzdHMoKSk7Ci0JCSAgYXNzZXJ0VHJ1ZShKMkVFVXRpbHMuZXhpc3RzKHByb2plY3QyLmdldE5hbWUoKSwgY29tcDMpKTsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgRU5EOiB0ZXN0Q29tcG9uZW50RXhpc3RzIC4uLiIpOwotCSAgfQotCSAgCi0JICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25HZXR0ZXJNZXRob2RzKCl7Ci0JCSAgCi0JCSAgU3lzdGVtLm91dC5wcmludGxuKCI8IEJFR0lOOiB0ZXN0TG9jYXRpb25HZXR0ZXJNZXRob2RzIC4uLiIpOwotCQkgIElQYXRoIGxvYzEgPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdDEsY29tcDEpOwotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViQ29udGVudFBhdGggb2YgY29tcDEgPSAiK2xvYzEpOwotCQkgIElSZXNvdXJjZSByZXMgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGxvYzEpOwotCQkgIGFzc2VydFRydWUocmVzLmV4aXN0cygpKTsKLQkJICBhc3NlcnRUcnVlKHJlcy50b1N0cmluZygpLmVuZHNXaXRoKCJXZWJDb250ZW50IikpOwotCQkgIAotCQkgIElQYXRoIGxvYzIgPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdDIsY29tcDMpOwotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViQ29udGVudFBhdGggb2YgY29tcDEgPSAiK2xvYzIpOwotCQkgIElSZXNvdXJjZSByZXMyID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZmluZE1lbWJlcihsb2MyKTsKLQkJICBhc3NlcnRUcnVlKHJlczIuZXhpc3RzKCkpOwotCQkgIGFzc2VydFRydWUocmVzMi50b1N0cmluZygpLmVuZHNXaXRoKCJXZWJDb250ZW50IikpOwkJICAKLQkJICAKLQkJICBJUGF0aCBsb2MzID0gSjJFRVV0aWxzLmdldFdlYkluZlBhdGgocHJvamVjdDEsIGNvbXAyKTsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIldlYi1JTkYgcGF0aCA9ICIrbG9jMyk7Ci0JCSAgSVJlc291cmNlIHJlczMgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5maW5kTWVtYmVyKGxvYzMpOwotCQkgIGFzc2VydFRydWUocmVzMy5leGlzdHMoKSk7Ci0JCSAgYXNzZXJ0VHJ1ZShyZXMzLnRvU3RyaW5nKCkuZW5kc1dpdGgoIldFQi1JTkYiKSk7Ci0JCSAgCi0JCSAgSUNvbnRhaW5lciBjb250YWluZXIgPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudENvbnRhaW5lcihwcm9qZWN0MiwgY29tcDMpOwotCQkgIElSZXNvdXJjZSByZXM0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZmluZE1lbWJlcihjb250YWluZXIuZ2V0RnVsbFBhdGgoKSk7Ci0JCSAgYXNzZXJ0RXF1YWxzKHJlczIsIHJlczQpOwotCQkgIAotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBFTkQ6IHRlc3RMb2NhdGlvbkdldHRlck1ldGhvZHMgLi4uIik7Ci0JCSAgCi0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHRlc3RKMkVFVmVyc2lvbk1ldGhvZHMoKXsKLQkJICAKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgQkVHSU46IHRlc3RKMkVFVmVyc2lvbk1ldGhvZHMgLi4uIik7Ci0JICAKLQkJICBpbnQgajEgPSBKMkVFVXRpbHMuZ2V0SjJFRVZlcnNpb24ocHJvamVjdDIsIGNvbXA0KTsKLQkJICAKLQkJICBJVmlydHVhbENvbXBvbmVudCB2YzIgPSBKMkVFVXRpbHMuZ2V0VmlydHVhbENvbXBvbmVudChwcm9qZWN0MSwgY29tcDIpOwotCQkgIGludCBqMiA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbih2YzIpOwotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiSjJFRVZlcnNpb25zIHAxOiAiK2oyKTsKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIkoyRUVWZXJzaW9ucyBwMjogIitqMSk7CQkgIAotCQkgIGFzc2VydEVxdWFscyhqMSwgajIpOwotCQkgIAotCQkgIFN0cmluZyBqMyA9IEoyRUVVdGlscy5nZXRKMkVFVmVyc2lvbkFzU3RyaW5nKHByb2plY3QxLCBjb21wMSk7Ci0JCSAgU3lzdGVtLm91dC5wcmludGxuKCJKMkVFVmVyc2lvbiBwMSBhcyBTdHJpbmc6ICIrajMpOwotCQkgIGFzc2VydEVxdWFscyhqMywgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVCk7Ci0JCSAgCi0JCSAgU3lzdGVtLm91dC5wcmludGxuKCI8IEVORzogdGVzdEoyRUVWZXJzaW9uTWV0aG9kcyAuLi4iKTsKLQkgIH0KLQotCSAgcHVibGljIHZvaWQgdGVzdENvbXBvbmVudEdldHRlck1ldGhvZHMoKXsKLQkJICAKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgQkVHSU46IHRlc3RDb21wb25lbnRHZXR0ZXJNZXRob2RzIC4uLiIpOwotCQkgIAotCQkgIElWaXJ0dWFsQ29tcG9uZW50W10gdmNzID0gSjJFRVV0aWxzLmdldEFsbENvbXBvbmVudHMoKTsKLQkJICBjaGVja1ZpcnR1YWxDb21wb25lbnRzRXhpc3RzKHZjcyk7Ci0JCSAgCi0JCSAgSVZpcnR1YWxDb21wb25lbnRbXSB2Y3MyID0gSjJFRVV0aWxzLmdldEFsbEVBUkNvbXBvbmVudHMoKTsKLQkJICBjaGVja1ZpcnR1YWxDb21wb25lbnRzRXhpc3RzKHZjczIpOwotCQkgIAotCQkgIElWaXJ0dWFsQ29tcG9uZW50W10gdmNzMyA9IEoyRUVVdGlscy5nZXRBbGxXZWJDb21wb25lbnRzKCk7Ci0JCSAgY2hlY2tWaXJ0dWFsQ29tcG9uZW50c0V4aXN0cyh2Y3MzKTsKLQkJICAKLQkJICBJVmlydHVhbENvbXBvbmVudFtdIHZjczQgPSBKMkVFVXRpbHMuZ2V0V2ViQ29tcG9uZW50cyhwcm9qZWN0MSk7Ci0JCSAgY2hlY2tWaXJ0dWFsQ29tcG9uZW50c0V4aXN0cyh2Y3M0KTsKLQkJICAKLQkJICBTdHJpbmdbXSBuYW1lcyA9IEoyRUVVdGlscy5nZXRXZWJDb21wb25lbnROYW1lcyhwcm9qZWN0Mik7Ci0JCSAgcHJpbnROYW1lU3RyaW5ncyhuYW1lcyk7Ci0JCSAgCi0JCSAgU3RyaW5nW10gbmFtZXMyID0gSjJFRVV0aWxzLnRvQ29tcG9uZW50TmFtZXNBcnJheShKMkVFVXRpbHMuZ2V0Q29tcG9uZW50c0J5VHlwZShwcm9qZWN0MSwgSjJFRVV0aWxzLldFQiB8IEoyRUVVdGlscy5FSkIpKTsKLQkJICBwcmludE5hbWVTdHJpbmdzKG5hbWVzMik7Ci0JCSAgCi0JCSAgSVByb2plY3RbXSBwcm9qZWN0cyA9IEoyRUVVdGlscy5nZXRBbGxGbGV4aWJsZVByb2plY3RzKCk7Ci0JCSAgZm9yIChpbnQgaT0wO2k8cHJvamVjdHMubGVuZ3RoO2krKyl7Ci0JCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiRmxleCBwcm9qZWN0ICIraSsiID0gIitwcm9qZWN0c1tpXSk7Ci0JCSAgfQotCQkgIAotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBFTkQ6IHRlc3RDb21wb25lbnRHZXR0ZXJNZXRob2RzIC4uLiIpOwotCSAgfQotCSAgCi0JICBwcml2YXRlIHZvaWQgY2hlY2tWaXJ0dWFsQ29tcG9uZW50c0V4aXN0cyhJVmlydHVhbENvbXBvbmVudFtdIHZjcyl7Ci0JCSAgaWYgKHZjcy5sZW5ndGggPT0gMCkKLQkJCSAgU3lzdGVtLm91dC5wcmludGxuKCJFbXB0eS4uLi4iKTsKLQkJICAKLQkJICBmb3IgKGludCBpPTA7IGk8dmNzLmxlbmd0aDtpKyspewotCQkJICBJVmlydHVhbENvbXBvbmVudCB2YyA9IHZjc1tpXTsKLQkJCSAgU3lzdGVtLm91dC5wcmludGxuKCJWQzogUHJvamVjdCA9ICIrdmMuZ2V0UHJvamVjdCgpKyIgTmFtZSA9ICIrdmMuZ2V0TmFtZSgpKTsKLQkJCSAgYXNzZXJ0VHJ1ZSh2Yy5leGlzdHMoKSk7Ci0JCQkgIAotCQkgIH0KLQkgIH0KLQkgIAotCSAgcHJpdmF0ZSB2b2lkIHByaW50TmFtZVN0cmluZ3MoU3RyaW5nW10gbmFtZXMpewotCQkgIGZvciAoaW50IGk9MDtpPG5hbWVzLmxlbmd0aDtpKyspewotCQkJICBTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWUiK2krIiA9ICIrbmFtZXNbaV0pOwotCQkgIH0KLQkgIH0KLQkgIAotICAgICAgcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZUNvbXBvbmVudENvbW1hbmQoKXsKLSAgICAgICAgCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBCRUdJTjogdGVzdEFzc29jaWF0ZUNvbXBvbmVudENvbW1hbmQgLi4uIik7Ci0gICAgICAgIAotICAgICAgICBBc3NvY2lhdGVNb2R1bGVXaXRoRUFSQ29tbWFuZCBhbXdlID0gbmV3IEFzc29jaWF0ZU1vZHVsZVdpdGhFQVJDb21tYW5kKCk7Ci0gICAgICAgIGFtd2Uuc2V0RWFyKGVhckNvbXBOYW1lKTsKLSAgICAgICAgYW13ZS5zZXRFQVJQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgYW13ZS5zZXRNb2R1bGUoY29tcDEpOwotICAgICAgICBhbXdlLnNldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBhbXdlLmV4ZWN1dGUobnVsbCk7Ci0gICAgICAgIAotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIjwgRU5EOiB0ZXN0QXNzb2NpYXRlQ29tcG9uZW50Q29tbWFuZCAuLi4iKTsgICAgIAotICAgICAgfQotICAgIAotCSAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jaW5nR2V0dGVyTWV0aG9kcygpewotCQkgIAotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBCRUdJTjogdGVzdFJlZmVyZW5jaW5nR2V0dGVyTWV0aG9kcyAuLi4iKTsKLQkJICAKLQkJICBTeXN0ZW0ub3V0LnByaW50bG4oImlzQ29tcG9uZW50QXNzb2NpYXRlZCAuLiIpOwotCQkgIEoyRUVVdGlscy5pc0NvbXBvbmVudEFzc29jaWF0ZWQocHJvamVjdDEsIGVhckNvbXBOYW1lLCBwcm9qZWN0MSwgY29tcDEpOwotCQkKLQkJICBTdHJpbmdbXSBuYW1lcyA9IEoyRUVVdGlscy50b0NvbXBvbmVudE5hbWVzQXJyYXkoSjJFRVV0aWxzLmdldFJlZmVyZW5jaW5nRUFSQ29tcG9uZW50cyhwcm9qZWN0MSwgY29tcDEpKTsKLQkJICBwcmludE5hbWVTdHJpbmdzKG5hbWVzKTsKLQkJICBTdHJpbmdbXSBuYW1lczIgPSBKMkVFVXRpbHMudG9Db21wb25lbnROYW1lc0FycmF5KEoyRUVVdGlscy5nZXRSZWZlcmVuY2luZ0VBUkNvbXBvbmVudHMocHJvamVjdDIsIGNvbXAzKSk7Ci0JCSAgcHJpbnROYW1lU3RyaW5ncyhuYW1lczIpOwotCQkgIAotCQkgIFN0cmluZ1tdIG5hbWVzMyA9IEoyRUVVdGlscy50b0NvbXBvbmVudE5hbWVzQXJyYXkoSjJFRVV0aWxzLmdldFJlZmVyZW5jaW5nV2ViQ29tcG9uZW50c0Zyb21FQVIocHJvamVjdDEsIGVhckNvbXBOYW1lKSk7Ci0JCSAgcHJpbnROYW1lU3RyaW5ncyhuYW1lczMpOwotCQkgIAotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBFTkQ6IHRlc3RSZWZlcmVuY2luZ0dldHRlck1ldGhvZHMgLi4uIik7Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHRlc3RJc0NvbXBvbmVudE1ldGhvZHMoKXsKLQkJCi0JCSAgU3lzdGVtLm91dC5wcmludGxuKCI8IEJFR0lOOiB0ZXN0SXNDb21wb25lbnRNZXRob2RzIC4uLiIpOwotCQkgIAotCQkgIC8vYXNzZXJ0RmFsc2UoSjJFRVV0aWxzLmlzRUpCMjBDb21wb25lbnQoZWpiUHJvamVjdCwgZWpiQ29tcG9uZW50TmFtZSkpOwotCQkgIGFzc2VydFRydWUoSjJFRVV0aWxzLmlzRUpCMjBDb21wb25lbnQoZWpiUHJvamVjdCwgZWpiQ29tcG9uZW50TmFtZSkpOwotCQkgIAotCQkgIFN5c3RlbS5vdXQucHJpbnRsbigiPCBFTkQ6IHRlc3RJc0NvbXBvbmVudE1ldGhvZHMgLi4uIik7Ci0JICB9Ci0JICAKLQotCSAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L0xhdW5jaFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvTGF1bmNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzJmNmFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvTGF1bmNoVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudW5pdHRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsYXRmb3JtUnVubmFibGU7Ci0KLS8qKgotICogTWluaW1hbCBhcHAgdG8gcnVuIGFzIEVjbGlwc2UgImFwcGxpY2F0aW9uIgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoVGVzdCBpbXBsZW1lbnRzIElQbGF0Zm9ybVJ1bm5hYmxlCi17Ci0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZSNydW4oT2JqZWN0KQotICAgKi8KLSAgcHVibGljIE9iamVjdCBydW4oT2JqZWN0IGFyZ3MpIHRocm93cyBFeGNlcHRpb24KLSAgewotCi0gICAgT2JqZWN0IHJlc3VsdCA9IG5ldyBBbGxXU0pVbml0VGVzdHMoKS5ydW5NYWluKGFyZ3MpOwotCi0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBUaHJvd2FibGUpCi0gICAgICB7Ci0gICAgICAgICgoVGhyb3dhYmxlKSByZXN1bHQpLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RzIGRpZG4ndCByZXR1cm4gJ29rJyIpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0s7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvUmVzb3VyY2VVdGlsc1Rlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1Jlc291cmNlVXRpbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA5YzZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvUmVzb3VyY2VVdGlsc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3Igc2VuZ3BsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlsc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBXU0pVbml0Q29uc3RhbnRzewotCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVzb3VyY2VVdGlsc1Rlc3RzLmNsYXNzKTsKLQl9Ci0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3VuaXR0ZXN0L1NlcnZlckNyZWF0aW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvU2VydmVyQ3JlYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmUwMTZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvU2VydmVyQ3JlYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudW5pdHRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVTZXJ2ZXJDb21tYW5kOwotCi0vKioKLSAqIEBhdXRob3Igc2VuZ3BsCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyQ3JlYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgV1NKVW5pdENvbnN0YW50c3sKLQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlcnZlckNyZWF0aW9uVGVzdHMuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVG9tY2F0djVTZXJ2ZXIoKXsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGluZyBUb21jYXQgdjUgc2VydmVyLiIpOwotCQlDcmVhdGVTZXJ2ZXJDb21tYW5kIGNzYyA9IG5ldyBDcmVhdGVTZXJ2ZXJDb21tYW5kKCk7Ci0JCWNzYy5zZXRTZXJ2ZXJGYWN0b3J5aWQoU0VSVkVSVFlQRUlEX1RDNTApOwotCQljc2MuZXhlY3V0ZShudWxsKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSBjcmVhdGluZyBUb21jYXQgdjUgc2VydmVyLiIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhdHRlbXB0Q3JlYXRlVG9tY2F0djVTZXJ2ZXIoKXsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJBdHRlbXB0aW5nIHRvIGNyZWF0ZSAybmQgVG9tY2F0IHY1IHNlcnZlci4iKTsKLQkJQ3JlYXRlU2VydmVyQ29tbWFuZCBjc2MgPSBuZXcgQ3JlYXRlU2VydmVyQ29tbWFuZCgpOwotCQljc2Muc2V0U2VydmVyRmFjdG9yeWlkKFNFUlZFUlRZUEVJRF9UQzUwKTsKLQkJY3NjLmV4ZWN1dGUobnVsbCk7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgYXR0ZW1wdGluZyAybmQgVG9tY2F0IHY1IHNlcnZlciBjcmVhdGlvbi4iKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdW5pdHRlc3QvV1NKVW5pdENvbnN0YW50cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9XU0pVbml0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOWE1MjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91bml0dGVzdC9XU0pVbml0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51bml0dGVzdDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFdTSlVuaXRDb25zdGFudHMgewotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBTRVJWRVJfSU5TVEFMTF9QQVRIID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MCIpOwotICBwdWJsaWMgZmluYWwgU3RyaW5nIFJVTlRJTUVUWVBFSURfVEM1MCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIjsKLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIFdTX1JVTlRJTUVJRF9BWElTID0gIm9yZy5lY2xpcHNlLmpzdC53cy5ydW50aW1lLmF4aXMxMSI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIFNFUlZFUlRZUEVJRF9UQzUwID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIjsKLSAgCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgd2ViUHJvamVjdE5hbWUgPSAiV2ViUHJvamVjdCI7Ci0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gIkZsZXhQcm9qZWN0IjsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBwcm9qZWN0Mk5hbWUgPSAiRmxleFByb2plY3QyIjsKLSAgcHVibGljIGZpbmFsIFN0cmluZyB3ZWJDb21wb25lbnROYW1lID0gIndlYkNvbXBvbmVudCI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgd2ViQ29tcG9uZW50Mk5hbWUgPSAid2ViQ29tcDIiOwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHdlYkNvbXAzTmFtZSA9ICJ3ZWJDb21wMyI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgd2ViQ29tcDROYW1lID0gIndlYkNvbXA0IjsKLSAgCi0gIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIGVqYlByb2plY3ROYW1lID0gIkZsZXhFSkJQcm9qZWN0IjsKLSAgcHVibGljIGZpbmFsIFN0cmluZyBlamJDb21wb25lbnROYW1lID0gImVqYkNvbXBvbmVudCI7Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBhcHBDbGllbnRQcm9qZWN0TmFtZSA9ICJGbGV4QXBwQ2xpZW50UHJvamVjdCI7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgYXBwQ2xpZW50Q29tcE5hbWUgPSAiYXBwQ2xpZW50Q29tcG9uZW50IjsgIAotICAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBlYXJDb21wTmFtZSA9ICJFQVJDb21wb25lbnQiOwotICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9BY2N1bXVsYXRlU3RhdHVzSGFuZGxlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91dGlsL0FjY3VtdWxhdGVTdGF0dXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOGU3YzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91dGlsL0FjY3VtdWxhdGVTdGF0dXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uQ2hvaWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TaW1wbGVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbW1vbi5TdGF0dXNIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgQWNjdW11bGF0ZVN0YXR1c0hhbmRsZXIgaW1wbGVtZW50cyBTdGF0dXNIYW5kbGVyIHsKLQkgIFZlY3RvciBzdGF0dXNMaXN0XzsKLQkgIAotCSAgcHVibGljIEFjY3VtdWxhdGVTdGF0dXNIYW5kbGVyKCkKLQkgIHsKLQkgICAgcmVzZXRTdGF0dXMoKTsgICAgCi0JICB9Ci0JICAKLQkgIC8qKgotCSAgICogIFJlc2V0cyB0aGUgc3RhdHVzIHNvIHRoYXQgaXQgc3RhcnRzIG91dCBlbXB0eSBhZ2Fpbi4gCi0JICAgKgotCSAgICovCi0JICBwdWJsaWMgdm9pZCByZXNldFN0YXR1cygpCi0JICB7Ci0JICAgIHN0YXR1c0xpc3RfID0gbmV3IFZlY3RvcigpOyAgICAgIAotCSAgfQotCSAgCi0JICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpCi0JICB7Ci0JICAgIFN0YXR1cyB3b3JzdFN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoICIiLCAiIiwgU3RhdHVzLk9LICk7Ci0JICAgIAotCSAgICAvLyBGaW5kIHRoZSB3b3JzdCBlcnJvciBzdGF0dXMgY29kZQotCSAgICBmb3IoIGludCBpbmRleCA9IDA7IGluZGV4IDwgc3RhdHVzTGlzdF8uc2l6ZSgpOyBpbmRleCsrICkKLQkgICAgewotCSAgICAgIFN0YXR1cyBzdGF0dXMgPSAoU3RhdHVzKXN0YXR1c0xpc3RfLmVsZW1lbnRBdCggaW5kZXggKTsKLQkgICAgICAKLQkgICAgICBpZiggc3RhdHVzLmdldFNldmVyaXR5KCkgPiB3b3JzdFN0YXR1cy5nZXRTZXZlcml0eSgpICkKLQkgICAgICB7Ci0JICAgICAgICB3b3JzdFN0YXR1cyA9IHN0YXR1czsKLQkgICAgICB9Ci0JICAgIH0KLQkgICAgCi0JICAgIHJldHVybiBuZXcgU2ltcGxlU3RhdHVzKCB3b3JzdFN0YXR1cy5nZXRJZCgpLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0U3RhdHVzLmdldE1lc3NhZ2UoKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdGF0dXNbXSlzdGF0dXNMaXN0Xy50b0FycmF5KCBuZXcgU3RhdHVzWzBdICkgKTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBAc2VlIG9yZy5lY2xpcHNlLmVudi5jb21tb24uU3RhdHVzSGFuZGxlciNyZXBvcnQob3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXMsIG9yZy5lY2xpcHNlLmVudi5jb21tb24uQ2hvaWNlW10pCi0JICAgKi8KLQkgIHB1YmxpYyBDaG9pY2UgcmVwb3J0KFN0YXR1cyBzdGF0dXMsIENob2ljZVtdIGNob2ljZXMpIAotCSAgewotCSAgCUNob2ljZSByZXN1bHQgPSBudWxsOwotCSAgCQotCSAgCS8vIEFsd2F5cyB0YWtlIHRoZSBmaXJzdCBjaG9pY2UgaWYgYXZhaWxhYmxlLgotCSAgICBpZiggY2hvaWNlcyAhPSBudWxsICYmIGNob2ljZXMubGVuZ3RoID4gMCApCi0JICAgIHsKLQkgICAgCXJlc3VsdCA9IGNob2ljZXNbMF07Ci0JICAgIH0KLQkgICAgCi0JICAgIHN0YXR1c0xpc3RfLmFkZCggc3RhdHVzICk7Ci0JICAgIAotCSAgICByZXR1cm4gcmVzdWx0OwotCSAgfQotCi0JICAvKioKLQkgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW52LmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydChvcmcuZWNsaXBzZS5lbnYuY29tbW9uLlN0YXR1cykKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcmVwb3J0KFN0YXR1cyBzdGF0dXMpIHRocm93cyBTdGF0dXNFeGNlcHRpb24KLQkgIHsKLQkgICAgc3RhdHVzTGlzdF8uYWRkKCBzdGF0dXMgKTsKLQkgIH0KLQkgIAotCSAgLyoKLQkgICAqIFJlcG9ydCBhIHdhcm5pbmcuCi0JICAgKi8KLQkgIHByaXZhdGUgYm9vbGVhbiByZXBvcnRXYXJuaW5nKFN0YXR1cyBzdGF0dXMpCi0JICB7Ci0JICAgIHN0YXR1c0xpc3RfLmFkZCggc3RhdHVzICk7Ci0JICAgIAotCSAgICByZXR1cm4gdHJ1ZTsKLQkgIH0KLQkgCi0JICAvKioKLQkgICAqIEBzZWUgY29tLmlibS5lbnYuY29tbW9uLlN0YXR1c0hhbmRsZXIjcmVwb3J0RXJyb3IoY29tLmlibS5lbnYuY29tbW9uLlN0YXR1cykKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcmVwb3J0RXJyb3IoU3RhdHVzIHN0YXR1cykKLQkgIHsKLQkgICAgc3RhdHVzTGlzdF8uYWRkKCBzdGF0dXMgKTsKLQkgIH0KLQkgIAotCSAgLyoqCi0JICAgKiBAc2VlIGNvbS5pYm0uZW52LmNvbW1vbi5TdGF0dXNIYW5kbGVyI3JlcG9ydEluZm8oY29tLmlibS5lbnYuY29tbW9uLlN0YXR1cykKLQkgICAqLwotCSAgcHVibGljIHZvaWQgcmVwb3J0SW5mbyhTdGF0dXMgc3RhdHVzKQotCSAgewotCSAgICBzdGF0dXNMaXN0Xy5hZGQoIHN0YXR1cyApOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvRHluYW1pY1BvcHVwSlVuaXRXaXphcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9EeW5hbWljUG9wdXBKVW5pdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYzZmY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9EeW5hbWljUG9wdXBKVW5pdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudFJlc291cmNlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFGbG93TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmZyYWdtZW50LkNvbW1hbmRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLmVjbGlwc2UuRWNsaXBzZVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVDb21tYW5kRW5naW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5wb3B1cC5EeW5hbWljUG9wdXBXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlN0YXR1c0hhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBEeW5hbWljUG9wdXBKVW5pdFdpemFyZCBleHRlbmRzIER5bmFtaWNQb3B1cFdpemFyZCB7Ci0JcHJpdmF0ZSBTdGF0dXNIYW5kbGVyIGhhbmRsZXJfOwotCXB1YmxpYyBEeW5hbWljUG9wdXBKVW5pdFdpemFyZChTdGF0dXNIYW5kbGVyIGhhbmRsZXIpCi0JewotCQloYW5kbGVyXyA9IGhhbmRsZXI7Ci0JfQotCXB1YmxpYyB2b2lkIHJ1bkhlYWRMZXNzKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbixJUnVubmFibGVDb250ZXh0IGNvbnRleHQpIHsKLQkJQ29tbWFuZEZyYWdtZW50ICAgICAgICAgICAgcm9vdEZyYWdtZW50ICAgID0gZ2V0Um9vdEZyYWdtZW50KCBzZWxlY3Rpb24sIG51bGwgKTsKLQkJUGVyc2lzdGVudFJlc291cmNlQ29udGV4dCAgcmVzb3VyY2VDb250ZXh0ID0gUGVyc2lzdGVudFJlc291cmNlQ29udGV4dC5nZXRJbnN0YW5jZSgpOwotCQlFY2xpcHNlUHJvZ3Jlc3NNb25pdG9yICAgICBtb25pdG9yICAgICAgICAgPSBuZXcgRWNsaXBzZVByb2dyZXNzTW9uaXRvcigpOwotCQlFY2xpcHNlRW52aXJvbm1lbnQgICAgICAgICBlbnZpcm9ubWVudCAgICAgPSBuZXcgRWNsaXBzZUVudmlyb25tZW50KCBudWxsLCByZXNvdXJjZUNvbnRleHQsIG1vbml0b3IsIGhhbmRsZXJfICk7Ci0JCSAgICAKLQkJRGF0YU1hcHBpbmdSZWdpc3RyeUltcGwgICAgZGF0YVJlZ2lzdHJ5XyAgID0gbmV3IERhdGFNYXBwaW5nUmVnaXN0cnlJbXBsKCk7CSAgICAKLQkJRGF0YUZsb3dNYW5hZ2VyICAgICAgICAgICAgZGF0YU1hbmFnZXIgICAgID0gbmV3IERhdGFGbG93TWFuYWdlciggZGF0YVJlZ2lzdHJ5XywgZW52aXJvbm1lbnQgKTsKLQkJU2ltcGxlQ29tbWFuZEVuZ2luZU1hbmFnZXIgbWFuYWdlciAgICAgICAgID0gbmV3IFNpbXBsZUNvbW1hbmRFbmdpbmVNYW5hZ2VyKGVudmlyb25tZW50LCBkYXRhTWFuYWdlcik7Ci0JCSAgCi0JCWNvbW1hbmRXaWRnZXRCaW5kaW5nXy5yZWdpc3RlckRhdGFNYXBwaW5ncyggZGF0YVJlZ2lzdHJ5XyApOwotCQltYW5hZ2VyLnNldFJvb3RGcmFnbWVudCggcm9vdEZyYWdtZW50ICk7Ci0JCW1hbmFnZXIucnVuRm9yd2FyZFRvTmV4dFN0b3AoIGNvbnRleHQgKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91dGlsL0pVbml0VXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9KVW5pdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Zjk4YTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLnRlc3RzL3Rlc3RzL29yZy9lY2xpcHNlL2pzdC93cy90ZXN0cy91dGlsL0pVbml0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5XZWJOYXR1cmVSdW50aW1lVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uRW52aXJvbm1lbnRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlNlcnZlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5jb21tYW5kLmNvbW1vbi5DcmVhdGVNb2R1bGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29udGV4dC5TY2VuYXJpb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wbHVnaW4uVGVzdHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29tbW9uLkZpbGVSZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb21tb24uV2FpdEZvckF1dG9CdWlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvbnRleHQuUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5wcmVmZXJlbmNlcy5BY3Rpb25EaWFsb2dQcmVmZXJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwucHJvdmlzaW9uYWwuZW52LmNvcmUuY29tbW9uLlNpbXBsZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5wcm92aXNpb25hbC5lbnYuY29yZS5jb21tb24uU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLnByb3Zpc2lvbmFsLmVudi5jb3JlLmNvbnRleHQuUmVzb3VyY2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5GbGV4aWJsZUphdmFQcm9qZWN0UHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLnBsdWdpbi5XU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS53c2kucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEpVbml0VXRpbHMgewotCS8vIEJlZ2luIFNlcnZlciBVdGlsaXRpZXMKLQlwdWJsaWMgc3RhdGljIElSdW50aW1lIGNyZWF0ZVNlcnZlclJ1bnRpbWUoU3RyaW5nIHJ1bnRpbWVUeXBlSWQsU3RyaW5nIHNlcnZlckluc3RhbGxQYXRoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlJUnVudGltZVR5cGUgcnQgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZShydW50aW1lVHlwZUlkKTsKLQkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ0LmNyZWF0ZVJ1bnRpbWUoImFSdW50aW1lIiwgbnVsbCk7Ci0JCXdjLnNldExvY2F0aW9uKG5ldyBQYXRoKHNlcnZlckluc3RhbGxQYXRoKSk7Ci0JCQotCQlyZXR1cm4gd2Muc2F2ZSh0cnVlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgY3JlYXRlU2VydmVyKFN0cmluZyBuYW1lLFN0cmluZyBzZXJ2ZXJUeXBlSWQsSVJ1bnRpbWUgcnVudGltZSxFbnZpcm9ubWVudCBlbnYpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JICBJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyQ29yZS5maW5kU2VydmVyVHlwZShzZXJ2ZXJUeXBlSWQpOwotICAgICAgSVNlcnZlcltdIHNlcnZlcnMgPSBTZXJ2ZXJDb3JlLmdldFNlcnZlcnMoKTsgCi0gICAgICBmb3IgKGludCBpPTA7aTxzZXJ2ZXJzLmxlbmd0aDtpKyspewotICAgICAgICBpZihzZXJ2ZXJzW2ldLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpLmVxdWFscyhzZXJ2ZXJUeXBlLmdldElkKCkpKXsKLSAgICAgICAgICByZXR1cm4gc2VydmVyc1tpXTsgIAotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXYyA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKHNlcnZlclR5cGVJZCxudWxsLEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLQkgIHNlcnZlcldjLnNldE5hbWUobmFtZSk7Ci0JICBzZXJ2ZXJXYy5zZXRSdW50aW1lKHJ1bnRpbWUpOwotICAgICAgSVNlcnZlciBzZXJ2ZXIgPSBzZXJ2ZXJXYy5zYXZlQWxsKHRydWUsIEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLSAgICAgIHJldHVybiBzZXJ2ZXI7Ci0JfQkKLQkKLQkvKioKLQkgKiBjcmVhdGVTZXJ2ZXIgYW5kIGluc3RhbGwgSlJFIGZvciBTZXJ2ZXJzIHJlcXVpcmluZyBhIHNwZWNpZmljIEpSRQotCSAqIEBwYXJhbSBqYXZhUnVudGltZVBhdGggSlJFIGluc3RhbGwgbG9jYXRpb247IGkuZS4gRTpcXEphdmExNDEKLQkgKiBAcGFyYW0ganJlSUQgSlJFIGlkOyBpLmUuIGphdmExNDEKLQkgKiBAcGFyYW0gbmFtZSBzZXJ2ZXIgbmFtZQotCSAqIEBwYXJhbSBzZXJ2ZXJUeXBlSWQgc2VydmVyIHR5cGUgaWQKLQkgKiBAcGFyYW0gcnVudGltZSBJUnVudGltZQotCSAqIEBwYXJhbSBlbnYgRW52aXJvbm1lbnQKLQkgKiBAcmV0dXJuICBzZXJ2ZXIgSVNlcnZlcgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgY3JlYXRlU2VydmVyKFN0cmluZyBqYXZhUnVudGltZVBhdGgsIFN0cmluZyBqcmVJRCwgU3RyaW5nIG5hbWUsU3RyaW5nIHNlcnZlclR5cGVJZCxJUnVudGltZSBydW50aW1lLEVudmlyb25tZW50IGVudikgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJSVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlckNvcmUuZmluZFNlcnZlclR5cGUoc2VydmVyVHlwZUlkKTsKLSAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOyAKLSAgICBmb3IgKGludCBpPTA7aTxzZXJ2ZXJzLmxlbmd0aDtpKyspewotICAgICAgaWYoc2VydmVyc1tpXS5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoc2VydmVyVHlwZS5nZXRJZCgpKSl7Ci0gICAgICAgIHJldHVybiBzZXJ2ZXJzW2ldOyAgCi0gICAgICB9Ci0gICAgfQotCi0JCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXYyA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKHNlcnZlclR5cGVJZCxudWxsLEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihlbnYpKTsKLQkJc2VydmVyV2Muc2V0TmFtZShuYW1lKTsKLQkJc2VydmVyV2Muc2V0UnVudGltZShydW50aW1lKTsKLQkJCi0JCUlTZXJ2ZXIgc2VydmVyID0gc2VydmVyV2Muc2F2ZUFsbCh0cnVlLCBFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0JCQotCQlyZXR1cm4gc2VydmVyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnRTZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIsRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJU2VydmVyIGN1cnJlbnRTZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCWZpbmFsIEVudmlyb25tZW50IGN1cnJlbnRFbnYgPSBlbnY7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJICBjdXJyZW50U2VydmVyLnN0YXJ0KElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLEVudmlyb25tZW50VXRpbHMuZ2V0SVByb2dyZXNzTW9uaXRvcihjdXJyZW50RW52KSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB3cmFwcGVyID0gbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJd3JhcHBlci5zZXRTdGFja1RyYWNlKGUuZ2V0U3RhY2tUcmFjZSgpKTsKLQkJCQkJdGhyb3cgd3JhcHBlcjsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuKHRydWUsZmFsc2UscnVubmFibGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRUFSRnJvbVNlcnZlcihJU2VydmVyIHNlcnZlcixJUHJvamVjdCBlYXJQcm9qZWN0LEVudmlyb25tZW50IGVudikgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaW50IG51bWJlck9mTW9kdWxlcyA9IHNlcnZlci5nZXRNb2R1bGVzKCkubGVuZ3RoOwotCQlpZiAoc2VydmVyICE9IG51bGwpCi0JCXsKLSAgICAgIGZpbmFsIElNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKGVhclByb2plY3QpOwotICAgICAgZmluYWwgSU1vZHVsZSBlYXJQcm9qZWN0TW9kdWxlID0gbW9kdWxlc1swXTsKLQkJCW5ldyBTZXJ2ZXJVdGlscygpLm1vZGlmeU1vZHVsZXMoZW52LCBzZXJ2ZXIsZWFyUHJvamVjdE1vZHVsZSxmYWxzZSxFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0JCSAgCWZpbmFsIElTZXJ2ZXIgY3VycmVudFNlcnZlciA9IHNlcnZlcjsKLQkJICAJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCQl7Ci0JCSAgCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCQl7Ci0JCSAgCQkgIAlmb3IgKGludCBpPTA7aTwxMDAwO2krKykKLQkJICAJCSAgCXsKLQkJICAJCSAgCQlpbnQgbW9kdWxlU3RhdGUgPSBjdXJyZW50U2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZXMpOwotCQkgIAkJICAJCWlmIChtb2R1bGVTdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgbW9kdWxlU3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJICAJCSAgCQl7Ci0JCSAgCQkgIAkJICB0cnkKLQkJICAJCQkJICB7Ci0JCSAgCQkgIAkJICAgIFRocmVhZC5zbGVlcCgzMDApOwotCQkgIAkJCQkgIH0KLQkJICAJCSAgCQkgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotCQkgIAkJCQkgIHsKLQkJICAJCSAgCQkgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJICAJCQkJICB9Ci0JCSAgCQkgIAkJfQotCQkgIAkJICAJCWVsc2UKLQkJICAJCSAgCQkJYnJlYWs7Ci0JCSAgCQkgIAl9ICAJCQkgIAkJCQotCQkJCX0gIAkJCi0JCQl9OwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSxmYWxzZSxydW5uYWJsZSk7Ci0JCQlyZXR1cm4gKHNlcnZlci5nZXRNb2R1bGVzKCkubGVuZ3RoID09IChudW1iZXJPZk1vZHVsZXMtMSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZU1vZHVsZUZyb21TZXJ2ZXIoSVNlcnZlciBzZXJ2ZXIsIElQcm9qZWN0IHdlYlByb2plY3QsIEVudmlyb25tZW50IGVudikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAKLQkgIGludCBudW1iZXJPZk1vZHVsZXMgPSBzZXJ2ZXIuZ2V0TW9kdWxlcygpLmxlbmd0aDsKLQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQl7Ci0gICAgICBmaW5hbCBJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyh3ZWJQcm9qZWN0KTsKLSAgICAgIGZpbmFsIElNb2R1bGUgd2ViUHJvamVjdE1vZHVsZSA9IG1vZHVsZXNbMF07ICAgICAgCi0KLQkJCW5ldyBTZXJ2ZXJVdGlscygpLm1vZGlmeU1vZHVsZXMoZW52LCBzZXJ2ZXIsd2ViUHJvamVjdE1vZHVsZSxmYWxzZSxFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0JCSAgCWZpbmFsIElTZXJ2ZXIgY3VycmVudFNlcnZlciA9IHNlcnZlcjsKLQkJICAJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpCi0JCQl7Ci0JCSAgCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCQl7Ci0JCSAgCQkgIAlmb3IgKGludCBpPTA7aTwxMDAwO2krKykKLQkJICAJCSAgCXsKLQkJICAJCSAgCQlpbnQgbW9kdWxlU3RhdGUgPSBjdXJyZW50U2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZXMpOwotCQkgIAkJICAJCWlmIChtb2R1bGVTdGF0ZSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQgfHwgbW9kdWxlU3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUElORykKLQkJICAJCSAgCQl7Ci0JCSAgCQkgIAkJICB0cnkKLQkJICAJCQkJICB7Ci0JCSAgCQkgIAkJICAgIFRocmVhZC5zbGVlcCgzMDApOwotCQkgIAkJCQkgIH0KLQkJICAJCSAgCQkgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotCQkgIAkJCQkgIHsKLQkJICAJCSAgCQkgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJICAJCQkJICB9Ci0JCSAgCQkgIAkJfQotCQkgIAkJICAJCWVsc2UKLQkJICAJCSAgCQkJYnJlYWs7Ci0JCSAgCQkgIAl9ICAJCQkgIAkJCQotCQkJCX0gIAkJCi0JCQl9OwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5ydW4odHJ1ZSxmYWxzZSxydW5uYWJsZSk7Ci0JCQkvL1RocmVhZC5zbGVlcCg2MDAwKTsKLQkJCXJldHVybiAoc2VydmVyLmdldE1vZHVsZXMoKS5sZW5ndGggPT0gKG51bWJlck9mTW9kdWxlcy0xKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvLyBCZWdpbjogR2VuZXJhbCBFY2xpcHNlIFV0aWxpdGllcwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzeW5jQnVpbGRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCxFbnZpcm9ubWVudFV0aWxzLmdldElQcm9ncmVzc01vbml0b3IoZW52KSk7Ci0JCVdhaXRGb3JBdXRvQnVpbGRDb21tYW5kIGNtZCA9IG5ldyBXYWl0Rm9yQXV0b0J1aWxkQ29tbWFuZCgpOwotCQljbWQuZXhlY3V0ZShlbnYpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlUZXN0RmlsZXMoU3RyaW5nIHBhdGhTdHJpbmcsaW50IHJvb3RTZWdtZW50TGVuZ3RoLElGb2xkZXIgZGVzdEZvbGRlcixFbnZpcm9ubWVudCBlbnYpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCUVudW1lcmF0aW9uIGUgPSBUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnlQYXRocyhwYXRoU3RyaW5nKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCXsKLQkJCVN0cmluZyBmaWxlUGF0aCA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCIvIikpCi0JCQkJY29weVRlc3RGaWxlcyhmaWxlUGF0aCxyb290U2VnbWVudExlbmd0aCxkZXN0Rm9sZGVyLGVudik7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJSVBhdGggZmlsZUlQYXRoID0gbmV3IFBhdGgoZmlsZVBhdGgpOwotCQkJCUZpbGVSZXNvdXJjZVV0aWxzLmNvcHlGaWxlKEVudmlyb25tZW50VXRpbHMuZ2V0UmVzb3VyY2VDb250ZXh0KGVudiksCi0JCQkJCQkgICAgICAgICAgICAgICAgICAgVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLAotCQkJCQkJCQkJCSAgIGZpbGVJUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoZmlsZUlQYXRoLnNlZ21lbnRDb3VudCgpLXJvb3RTZWdtZW50TGVuZ3RoKSwgLy8gL2RhdGEvPHN1YmRpcj4KLQkJCQkJCQkJCQkgICAobmV3IFBhdGgoZmlsZVBhdGgpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHJvb3RTZWdtZW50TGVuZ3RoKSwgLy8gZmlsZXMgYWZ0ZXIgL2RhdGEvPHN1YmRpcj4KLQkJCQkJCQkJCQkgICBkZXN0Rm9sZGVyLmdldEZ1bGxQYXRoKCksCi0JCQkJCQkJCQkJICAgZW52LmdldFByb2dyZXNzTW9uaXRvcigpLAotCQkJCQkJCQkJCSAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VGVzdERhdGEoU3RyaW5nIGRhdGFTdWJkaXJlY3RvcnksSUZvbGRlciBkZXN0Rm9sZGVyLEVudmlyb25tZW50IGVudikgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJU3RyaW5nIHBhdGhTdHJpbmcgPSAiL2RhdGEvIitkYXRhU3ViZGlyZWN0b3J5OwotCQljb3B5VGVzdEZpbGVzKHBhdGhTdHJpbmcsbmV3IFBhdGgocGF0aFN0cmluZykuc2VnbWVudENvdW50KCksZGVzdEZvbGRlcixlbnYpOwotCQkKLQl9Ci0JCi0JLy8gQmVnaW46IFdlYiBTZXJ2aWNlcyBVdGlsaXRpZXMKLQlwdWJsaWMgc3RhdGljIHZvaWQgaGlkZUFjdGlvbkRpYWxvZ3MoKQotCXsKLQkJUGVyc2lzdGVudEFjdGlvbkRpYWxvZ3NDb250ZXh0IGFjdGlvbkRpYWxvZ3NDdHggPSBQZXJzaXN0ZW50QWN0aW9uRGlhbG9nc0NvbnRleHQuZ2V0SW5zdGFuY2UoKTsKLQkJQWN0aW9uRGlhbG9nUHJlZmVyZW5jZVR5cGVbXSBhY3Rpb25EaWFsb2dQcmVmcyAgPSBhY3Rpb25EaWFsb2dzQ3R4LmdldERpYWxvZ3MoKTsKLQkJZm9yIChpbnQgaT0wO2k8YWN0aW9uRGlhbG9nUHJlZnMubGVuZ3RoO2krKykKLQkJCWFjdGlvbkRpYWxvZ3NDdHguc2V0QWN0aW9uRGlhbG9nRW5hYmxlZChhY3Rpb25EaWFsb2dQcmVmc1tpXS5nZXRJZCgpLHRydWUpOwkJCi0JfQotCQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZVByb3h5R2VuZXJhdGlvbihib29sZWFuIGVuYWJsZSkKLQl7Ci0JCVNjZW5hcmlvQ29udGV4dCBjdHggPSBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2NlbmFyaW9Db250ZXh0KCk7Ci0JCWJvb2xlYW4gcHJldmlvdXNTZXR0aW5nID0gY3R4LmdldEdlbmVyYXRlUHJveHkoKTsKLQkJY3R4LnNldEdlbmVyYXRlUHJveHkoZW5hYmxlKTsKLQkJcmV0dXJuIHByZXZpb3VzU2V0dGluZzsKLQl9Ci0JCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZUZsZXhQcm9qZWN0UHJlZmVyZW5jZSgpewotICAgICAgRmxleGlibGVKYXZhUHJvamVjdFByZWZlcmVuY2VVdGlsLnNldE11bHRpcGxlTW9kdWxlc1BlclByb2plY3RQcm9wKCB0cnVlICk7ICAgICAKLSAgICB9Ci0gIAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmFibGVPdmVyd3JpdGUoYm9vbGVhbiBlbmFibGUpCi0JewotCQlSZXNvdXJjZUNvbnRleHQgY3R4ID0gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlQ29udGV4dCgpOwotCQlib29sZWFuIHByZXZpb3VzU2V0dGluZyA9IGN0eC5pc092ZXJ3cml0ZUZpbGVzRW5hYmxlZCgpOwotCQljdHguc2V0T3ZlcndyaXRlRmlsZXNFbmFibGVkKGVuYWJsZSk7Ci0JCXJldHVybiBwcmV2aW91c1NldHRpbmc7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlV1NJRGlhbG9nKElQcm9qZWN0IHByb2plY3QpewotCSAgCi0JICBQZXJzaXN0ZW50V1NJQ29udGV4dCBjdHggPSBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V1NJQVBDb250ZXh0KCk7Ci0JICBjdHgudXBkYXRlUHJvamVjdFdTSUNvbXBsaWFuY2VzKHByb2plY3QsIFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJKTsKLQkgIAotCSAgUGVyc2lzdGVudFdTSUNvbnRleHQgY3R4MiA9IFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXU0lTU0JQQ29udGV4dCgpOwotCSAgY3R4Mi51cGRhdGVQcm9qZWN0V1NJQ29tcGxpYW5jZXMocHJvamVjdCwgUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotCSAgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRKMkVFV1NSdW50aW1lU2VydmVyKFN0cmluZyBqMmVlTGV2ZWwsU3RyaW5nIHdzUnVudGltZUlkLFN0cmluZyBzZXJ2ZXJUeXBlSWQpCi0JewotCQlQZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQgc2VydmVyUnVudGltZUN0eCA9IFdlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2VydmVyUnVudGltZUNvbnRleHQoKTsKLQkJc2VydmVyUnVudGltZUN0eC5zZXRKMkVFVmVyc2lvbihqMmVlTGV2ZWwpOwotCQlzZXJ2ZXJSdW50aW1lQ3R4LnNldFJ1bnRpbWVJZCh3c1J1bnRpbWVJZCk7Ci0JCXNlcnZlclJ1bnRpbWVDdHguc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlclR5cGVJZCk7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RhdHVzIGxhdW5jaFdpemFyZChTdHJpbmcgcGx1Z2luTlMsU3RyaW5nIHdpemFyZElkLFN0cmluZyBvYmplY3RDbGFzc0lkLElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyIpLmdldEV4dGVuc2lvbnMoKTsKLQkJZm9yIChpbnQgaT0wO2k8ZXh0ZW5zaW9ucy5sZW5ndGg7aSsrKQotCQl7Ci0JCQlpZiAoZXh0ZW5zaW9uc1tpXS5nZXROYW1lc3BhY2UoKS5lcXVhbHMocGx1Z2luTlMpKTsKLQkJCXsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaj0wO2o8Y29uZmlnRWxlbWVudHMubGVuZ3RoO2orKykKLQkJCQl7Ci0JCQkJCWlmIChjb25maWdFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoImlkIikuZXF1YWxzKHdpemFyZElkKSAmJiBjb25maWdFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoIm9iamVjdENsYXNzIikuZXF1YWxzKG9iamVjdENsYXNzSWQpKQotCQkJCQl7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgYWN0aW9uRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdLmdldENoaWxkcmVuKClbMF07Ci0JCQkJCQlBY2N1bXVsYXRlU3RhdHVzSGFuZGxlciBzdGF0dXNIYW5kbGVyID0gbmV3IEFjY3VtdWxhdGVTdGF0dXNIYW5kbGVyKCk7Ci0JCQkJCQlEeW5hbWljUG9wdXBKVW5pdFdpemFyZCB3aXphcmQgPSBuZXcgRHluYW1pY1BvcHVwSlVuaXRXaXphcmQoc3RhdHVzSGFuZGxlcik7Ci0JCQkJCQl3aXphcmQuc2V0SW5pdGlhbGl6YXRpb25EYXRhKGFjdGlvbkVsZW1lbnQsbnVsbCxudWxsKTsKLQkJCQkJCXdpemFyZC5zZWxlY3Rpb25DaGFuZ2VkKG51bGwsaW5pdGlhbFNlbGVjdGlvbik7Ci0JCQkJCQl3aXphcmQucnVuKG51bGwpOwotCQkJCQkJcmV0dXJuIHN0YXR1c0hhbmRsZXIuZ2V0U3RhdHVzKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGF0dXMoIiIsIk5vIHdpemFyZCBmb3VuZCBmb3I6ICIsU3RhdHVzLkVSUk9SKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdGF0dXMgbGF1bmNoQ3JlYXRpb25XaXphcmQoU3RyaW5nIHdpemFyZElkLFN0cmluZyBvYmplY3RDbGFzc0lkLElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBsYXVuY2hXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aSIsd2l6YXJkSWQsb2JqZWN0Q2xhc3NJZCxpbml0aWFsU2VsZWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdGF0dXMgbGF1bmNoQ29uc3VtcHRpb25XaXphcmQoU3RyaW5nIHdpemFyZElkLFN0cmluZyBvYmplY3RDbGFzc0lkLElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb24pIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBsYXVuY2hXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aSIsd2l6YXJkSWQsb2JqZWN0Q2xhc3NJZCxpbml0aWFsU2VsZWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdGF0dXMgY3JlYXRlV2ViTW9kdWxlKFN0cmluZyB3ZWJQcm9qZWN0TmFtZSwgU3RyaW5nIG1vZHVsZU5hbWUsIFN0cmluZyBzZXJ2ZXJGYWN0b3J5SWQsIFN0cmluZyBqMmVlVmVyc2lvbiwgRW52aXJvbm1lbnQgZW52KXsKLQotCSAgU3RhdHVzIHN0YXR1cyA9IG5ldyBTaW1wbGVTdGF0dXMoIiIpOwotCSAgdHJ5ewotCSAgICBDcmVhdGVNb2R1bGVDb21tYW5kIGNyZWF0ZVdlYiA9IG5ldyBDcmVhdGVNb2R1bGVDb21tYW5kKCk7Ci0JICAgIGNyZWF0ZVdlYi5zZXRQcm9qZWN0TmFtZSh3ZWJQcm9qZWN0TmFtZSk7Ci0gICAgICAgIGNyZWF0ZVdlYi5zZXRNb2R1bGVOYW1lKG1vZHVsZU5hbWUpOwotICAgICAgICBjcmVhdGVXZWIuc2V0TW9kdWxlVHlwZShDcmVhdGVNb2R1bGVDb21tYW5kLldFQik7Ci0JICAgIGNyZWF0ZVdlYi5zZXRKMmVlTGV2ZWwoajJlZVZlcnNpb24pOwotCSAgICBjcmVhdGVXZWIuc2V0U2VydmVyRmFjdG9yeUlkKHNlcnZlckZhY3RvcnlJZCk7Ci0JICAgIHJldHVybiBjcmVhdGVXZWIuZXhlY3V0ZShlbnYpOwotCSAgfQotCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkgICAgc3RhdHVzID0gbmV3IFNpbXBsZVN0YXR1cygiIixlLmdldE1lc3NhZ2UoKSwgU3RhdHVzLkVSUk9SLCBlKTsKLQkgIH0KLQkgIHJldHVybiBzdGF0dXM7Ci0JICAKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb2plY3ROYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldFNvdXJjZUZvbGRlckZvcldlYlByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKQotCXsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgCi0JCUlGb2xkZXIgc3JjRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoV2ViTmF0dXJlUnVudGltZVV0aWxpdGllcy5nZXREZWZhdWx0SmF2YVNvdXJjZU5hbWUoKSk7Ci0JCXJldHVybiBzcmNGb2xkZXI7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0TmFtZQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBnZXRXZWJDb250ZW50Rm9sZGVyKFN0cmluZyBwcm9qZWN0TmFtZSkKLQl7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlJRm9sZGVyIHdlYkNvbnRlbnRGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihXZWJOYXR1cmVSdW50aW1lVXRpbGl0aWVzLmdldERlZmF1bHRKMkVFV2ViQ29udGVudFBhdGgoKSk7Ci0JCXJldHVybiB3ZWJDb250ZW50Rm9sZGVyOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGb2xkZXIgZ2V0V2ViSW5mRm9sZGVyRm9yV2ViUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpCi0JewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKFdlYk5hdHVyZVJ1bnRpbWVVdGlsaXRpZXMuZ2V0RGVmYXVsdFdFQklORlBhdGgoKSk7Ci0JfQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGb2xkZXIgZ2V0Q2xhc3Nlc0ZvbGRlckZvcldlYlByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKQotCXsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXJldHVybiBwcm9qZWN0LmdldEZvbGRlcihXZWJOYXR1cmVSdW50aW1lVXRpbGl0aWVzLmdldERlZmF1bHRXZWJPdXRwdXRGb2xkZXJQYXRoKCkpOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMvdGVzdHMvb3JnL2VjbGlwc2UvanN0L3dzL3Rlc3RzL3V0aWwvU2NlbmFyaW9Db25zdGFudHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9TY2VuYXJpb0NvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE3ZDgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy90ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvd3MvdGVzdHMvdXRpbC9TY2VuYXJpb0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMudXRpbDsKLQotcHVibGljIGNsYXNzIFNjZW5hcmlvQ29uc3RhbnRzIHsKLQkvLyBCb3R0b20gdXAgSmF2YSBvciBFSkIgdG8gV2ViIFNlcnZpY2Ugd2l6YXJkIElELgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRElEX0JPVFRPTV9VUCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5qYXZhIjsKLQkKLQkvLyBUb3AgZG93biBXU0RMIHRvIFNrZWxldG9uIFdlYiBTZXJ2aWNlIHdpemFyZCBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRJRF9UT1BfRE9XTiA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZC5za2VsZXRvbiI7Ci0JCi0JLy8gV2ViIFNlcnZpY2UgY2xpZW50IHdpemFyZCBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRJRF9DTElFTlQgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpemFyZC5jbGllbnQuY2xpZW50d2l6YXJkIjsJCi0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvcjoKLQkvLyAxKSBKYXZhIHNvdXJjZSAoYm90dG9tLXVwKQotCS8vIDIpIFdTREwgb3IgV1NJTCAodG9wLWRvd24gb3IgY2xpZW50KS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfSUZJTEUgPSAib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiOwotCQotCS8vIE9iamVjdCBjbGFzcyBmb3IgSmF2YSBjb21waWxhdGlvbiB1bml0cyAoaS5lLiBKYXZhIGNsYXNzZXMgc2VsZWN0ZWQgaW4gdGhlIEphdmEgcGVyc3BlY3RpdmUpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9DTEFTU19JRF9DT01QSUxBVElPTlVOSVQgPSAib3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuQ29tcGlsYXRpb25Vbml0IjsKLQkKLQkvLyBPYmplY3QgY2xhc3MgZm9yIGEgc2VydmljZSBzZWxlY3RlZCBpbiB0aGUgSjJFRSBwZXJzcGVjdGl2ZSAodG9wLWRvd24gb3IgY2xpZW50KS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfU0VSVklDRUlNUEwgPSAib3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZSI7Ci0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvciBhIFdTRExSZXNvdXJjZUltcGwgKHRvcC1kb3duIG9yIGNsaWVudCkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX0NMQVNTX0lEX1dTRExTRVJWSUNFSU1QTCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUltcGwiOwotCQotCS8vIE9iamVjdCBjbGFzcyBmb3IgYSBTZXJ2aWNlUmVmICh0b3AtZG93biBvciBjbGllbnQpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9DTEFTU19JRF9TRVJWSUNFUkVGID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZiI7Ci0JCi0JLy8gT2JqZWN0IGNsYXNzIGZvciBhIFNlcnZpY2VJbXBsQmVhbiAoYm90dG9tLXVwKS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfU0VSVklDRUlNUExCRUFOID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW4iOwotCQotCS8vIE9iamVjdCBjbGFzcyBmb3IgYSBCZWFuTGluayAoYm90dG9tLXVwKS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfSURfQkVBTkxJTksgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0MmU0MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwZXJmb3JtYW5jZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzYjNiOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzZlODYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+CQotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0gICAgIAk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0YjBmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UucGVyZm9ybWFuY2UuamFyID0gcGVyZm9ybWFuY2UvCi1vdXRwdXQucGVyZm9ybWFuY2UuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5qYXIsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgZGF0YS8KLXNyYy5pbmNsdWRlcyA9IGRhdGEvLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL2RhdGEvU3RvY2tRdW90ZS9TdG9ja1F1b3RlLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9kYXRhL1N0b2NrUXVvdGUvU3RvY2tRdW90ZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJmOTY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL2RhdGEvU3RvY2tRdW90ZS9TdG9ja1F1b3RlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL1N0b2NrUXVvdGUvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iU3RvY2tRdW90ZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvU3RvY2tRdW90ZS8iPg0KLSAgPHdzZGw6dHlwZXM+DQotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1N0b2NrUXVvdGUvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4NCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2V0UXVvdGVSZXNwb25zZSI+DQotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHNkOmFsbD4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGlja2VyU3ltYm9sIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgIDwveHNkOmFsbD4NCi0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgIDwveHNkOmVsZW1lbnQ+DQotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdldFF1b3RlUmVxdWVzdCI+DQotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICA8eHNkOmFsbD4NCi0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpY2UiIHR5cGU9InhzZDpmbG9hdCIvPg0KLSAgICAgICAgICA8L3hzZDphbGw+DQotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJIZWFkZXJzIj4NCi0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+DQotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhlYWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+DQotICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPg0KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+DQotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPg0KLSAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+DQotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4NCi0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+DQotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4NCi0gICAgICA8L3hzZDplbGVtZW50Pg0KLSAgICA8L3hzZDpzY2hlbWE+DQotICA8L3dzZGw6dHlwZXM+DQotICA8d3NkbDptZXNzYWdlIG5hbWU9ImdldFF1b3RlUmVzcG9uc2UiPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpnZXRRdW90ZVJlc3BvbnNlIiBuYW1lPSJnZXRRdW90ZVJlc3BvbnNlIi8+DQotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOkhlYWRlcnMiIG5hbWU9ImhlYWRlcnMiLz4NCi0gIDwvd3NkbDptZXNzYWdlPg0KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJnZXRRdW90ZVJlcXVlc3QiPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpnZXRRdW90ZVJlcXVlc3QiIG5hbWU9ImdldFF1b3RlUmVxdWVzdCIvPg0KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpIZWFkZXJzIiBuYW1lPSJoZWFkZXJzIi8+DQotICA8L3dzZGw6bWVzc2FnZT4NCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlN0b2NrUXVvdGUiPg0KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0UXVvdGUiPg0KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpnZXRRdW90ZVJlcXVlc3QiLz4NCi0gICAgICA8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmdldFF1b3RlUmVzcG9uc2UiLz4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gIDwvd3NkbDpwb3J0VHlwZT4NCi0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iU3RvY2tRdW90ZVNPQVAiIHR5cGU9InRuczpTdG9ja1F1b3RlIj4NCi0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+DQotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJnZXRRdW90ZSI+DQotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9TdG9ja1F1b3RlL2dldFF1b3RlIi8+DQotICAgICAgPHdzZGw6aW5wdXQ+DQotICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJnZXRRdW90ZVJlcXVlc3QiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgICAgPHNvYXA6aGVhZGVyIG1lc3NhZ2U9InRuczpnZXRRdW90ZVJlcXVlc3QiIHBhcnQ9ImhlYWRlcnMiIHVzZT0ibGl0ZXJhbCIvPg0KLSAgICAgIDwvd3NkbDppbnB1dD4NCi0gICAgICA8d3NkbDpvdXRwdXQ+DQotICAgICAgICA8c29hcDpib2R5IHBhcnRzPSJnZXRRdW90ZVJlc3BvbnNlIiB1c2U9ImxpdGVyYWwiLz4NCi0gICAgICAgIDxzb2FwOmhlYWRlciBtZXNzYWdlPSJ0bnM6Z2V0UXVvdGVSZXNwb25zZSIgcGFydD0iaGVhZGVycyIgdXNlPSJsaXRlcmFsIi8+DQotICAgICAgPC93c2RsOm91dHB1dD4NCi0gICAgPC93c2RsOm9wZXJhdGlvbj4NCi0gIDwvd3NkbDpiaW5kaW5nPg0KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJTdG9ja1F1b3RlIj4NCi0gICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6U3RvY2tRdW90ZVNPQVAiIG5hbWU9IlN0b2NrUXVvdGVTT0FQIj4NCi0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmciLz4NCi0gICAgPC93c2RsOnBvcnQ+DQotICA8L3dzZGw6c2VydmljZT4NCi08L3dzZGw6ZGVmaW5pdGlvbnM+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjY0YTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSCgKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cwotewotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UiKTsKLSAgICAvLyRKVW5pdC1CRUdJTiQKLSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UuY2xhc3MpOwotCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkU3RvY2tRdW90ZVdTRExFTUZUZXN0Q2FzZS5jbGFzcyk7Ci0Jc3VpdGUuYWRkVGVzdFN1aXRlKFZhbGlkYXRlU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgc3VpdGUuYWRkVGVzdFN1aXRlKFZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlLmNsYXNzKTsKLSAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAuY2xhc3MpOwotICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShPcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5jbGFzcyk7Ci0gICAgLy8kSlVuaXQtRU5EJAotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvT3BlbkVkaXRvck9BR0lTV1NETFRlc3RjYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuRWRpdG9yT0FHSVNXU0RMVGVzdGNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxZmQzYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuRWRpdG9yT0FHSVNXU0RMVGVzdGNhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi1wdWJsaWMgY2xhc3MgT3BlbkVkaXRvck9BR0lTV1NETFRlc3RjYXNlIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0Q2FzZQotewotICBwcml2YXRlIGZpbmFsIFN0cmluZyBJRF9XU0RMX0VESVRPUiA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yIjsKLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdTREwoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBvYWdpczgwRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJvYWdpczgwRGlyIik7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwob2FnaXM4MERpcik7Ci0gICAgaWYgKCFvYWdpczgwRGlyLmVuZHNXaXRoKCIvIikgJiYgIW9hZ2lzODBEaXIuZW5kc1dpdGgoIlxcIikpCi0gICAgICBvYWdpczgwRGlyID0gb2FnaXM4MERpciArICIvIjsKLSAgICBGaWxlIGRpciA9IG5ldyBGaWxlKG9hZ2lzODBEaXIgKyAiT0FHSVM4LjAiKTsKLSAgICBpZiAoZGlyLmV4aXN0cygpICYmIGRpci5pc0RpcmVjdG9yeSgpKQotICAgIHsKLSAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoInNwIik7Ci0gICAgICBwcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICAgIHByb2plY3Qub3BlbihudWxsKTsKLSAgICAgIGNvcHkoZGlyLCBwcm9qZWN0KTsKLSAgICAgIGpvaW5CYWNrZ3JvdW5kSm9icygpOwotICAgICAgZmluYWwgTGlzdCB3c2RscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHByb2plY3QuYWNjZXB0Ci0gICAgICAoCi0gICAgICAgIG5ldyBJUmVzb3VyY2VQcm94eVZpc2l0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcHJveHkpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLndzZGwiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgd3NkbHMuYWRkKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgSUNvbnRhaW5lci5JTkNMVURFX1BIQU5UT01TCi0gICAgICApOwotICAgICAgdGFnQXNTdW1tYXJ5KCJPcGVuIE9BR0lTIFdTREwiLCBuZXcgRGltZW5zaW9uW10ge0RpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MsIERpbWVuc2lvbi5XT1JLSU5HX1NFVH0pOwotICAgICAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSB3c2Rscy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotICAgICAgICBvcGVuV1NETCgoSUZpbGUpaXQubmV4dCgpKTsKLSAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZmFpbChkaXIudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weShGaWxlIHNyYywgSUNvbnRhaW5lciBkZXN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gY2hpbGRyZW4gPSBzcmMubGlzdEZpbGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkcmVuW2ldLmdldE5hbWUoKTsKLSAgICAgIGlmIChjaGlsZHJlbltpXS5pc0RpcmVjdG9yeSgpKQotICAgICAgewotICAgICAgICBJRm9sZGVyIGZvbGRlciA9IGRlc3QuZ2V0Rm9sZGVyKG5ldyBQYXRoKG5hbWUpKTsKLSAgICAgICAgZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLSAgICAgICAgY29weShjaGlsZHJlbltpXSwgZm9sZGVyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoIi53c2RsIikgfHwgbmFtZS5lbmRzV2l0aCgiLnhzZCIpKQotICAgICAgewotICAgICAgICBJRmlsZSBmaWxlID0gZGVzdC5nZXRGaWxlKG5ldyBQYXRoKG5hbWUpKTsKLSAgICAgICAgZmlsZS5jcmVhdGUobmV3IEZpbGVJbnB1dFN0cmVhbShjaGlsZHJlbltpXSksIHRydWUsIG51bGwpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBqb2luQmFja2dyb3VuZEpvYnMoKQotICB7Ci0gICAgRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkKLSAgICB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IDUwMDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgZGlzcGxheS5zbGVlcCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9wZW5XU0RMKElGaWxlIGZpbGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbgotICB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBJRF9XU0RMX0VESVRPUiwgdHJ1ZSk7Ci0gICAgd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUVkaXRvcihlZGl0b3IsIGZhbHNlKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5TdG9ja1F1b3RlV1NETFNldHVwLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9PcGVuU3RvY2tRdW90ZVdTRExTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDVjNGNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5TdG9ja1F1b3RlV1NETFNldHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvUGFydDsKLQotcHVibGljIGNsYXNzIE9wZW5TdG9ja1F1b3RlV1NETFNldHVwIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIlByb2plY3QiOwotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShPcGVuU3RvY2tRdW90ZVdTRExTZXR1cC5jbGFzcywgIk9wZW5TdG9ja1F1b3RlV1NETFNldHVwIik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjbG9zZUludHJvKCkKLSAgewotICAgIElJbnRyb01hbmFnZXIgaW50cm9NYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRJbnRyb01hbmFnZXIoKTsKLSAgICBJSW50cm9QYXJ0IGludHJvUGFydCA9IGludHJvTWFuYWdlci5nZXRJbnRybygpOwotICAgIGlmIChpbnRyb1BhcnQgIT0gbnVsbCkKLSAgICAgIGludHJvTWFuYWdlci5jbG9zZUludHJvKGludHJvUGFydCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlU2ltcGxlUHJvamVjdChTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIElQcm9qZWN0IHNpbXBsZVByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0gICAgc2ltcGxlUHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgc2ltcGxlUHJvamVjdC5vcGVuKG51bGwpOwotICAgIHJldHVybiBzaW1wbGVQcm9qZWN0OwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY29weUZpbGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0RmlsZShkZXN0KTsKLSAgICBmaWxlLmNyZWF0ZShQZXJmb3JtYW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoc291cmNlKS5vcGVuU3RyZWFtKCksIHRydWUsIG51bGwpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgam9pbkF1dG9CdWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsKLSAgICBib29sZWFuIGludGVycnVwdGVkID0gdHJ1ZTsKLSAgICB3aGlsZSAoaW50ZXJydXB0ZWQpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0gICAgICAgIGludGVycnVwdGVkID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXR1cCgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGNsb3NlSW50cm8oKTsKLSAgICBJUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlU2ltcGxlUHJvamVjdChQUk9KRUNUX05BTUUpOwotICAgIGNvcHlGaWxlKHByb2plY3QsICJkYXRhL1N0b2NrUXVvdGUvU3RvY2tRdW90ZS53c2RsIiwgIlN0b2NrUXVvdGUud3NkbCIpOwotICAgIGpvaW5BdXRvQnVpbGQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL09wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzc1NzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi1wdWJsaWMgY2xhc3MgT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlCi17Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC51aS5pbnRlcm5hbC5XU0RMRWRpdG9yIjsKLQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoT3BlblN0b2NrUXVvdGVXU0RMVGVzdENhc2UuY2xhc3MsICJPcGVuU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm9qZWN0LmV4aXN0cygpKTsKLSAgICBwcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVByb2plY3QuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotICAgIGpvaW5BdXRvQnVpbGQoKTsKLSAgICByZXR1cm4gcHJvamVjdDsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGpvaW5BdXRvQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IHRydWU7Ci0gICAgd2hpbGUgKGludGVycnVwdGVkKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotICAgICAgICBpbnRlcnJ1cHRlZCA9IGZhbHNlOwotICAgICAgfQotICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIGludGVycnVwdGVkID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgSUVkaXRvclBhcnQgb3BlbkVkaXRvcihJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQsIFN0cmluZyBlZGl0b3JpZCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0gIHsKLSAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0gICAgcmV0dXJuIHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgZWRpdG9yaWQsIHRydWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2xvc2VFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKQotICB7Ci0gICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgIHJldHVybiB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9wZW5TdG9ja1F1b3RlV1NETCgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KE9wZW5TdG9ja1F1b3RlV1NETFNldHVwLlBST0pFQ1RfTkFNRSk7Ci0gICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpcHJvamVjdC5maW5kTWVtYmVyKCJTdG9ja1F1b3RlLndzZGwiKSk7Ci0gICAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gb3BlbkVkaXRvcihlZGl0b3JJbnB1dCwgRURJVE9SX0lEKTsKLSAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0gICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICBjbG9zZUVkaXRvcihlZGl0b3JQYXJ0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OGY0YWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQZXJmb3JtYW5jZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFBlcmZvcm1hbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9SZWFkT0FHSVNXU0RMVGVzdGNhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1JlYWRPQUdJU1dTRExUZXN0Y2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Q1NjZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1JlYWRPQUdJU1dTRExUZXN0Y2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwud3NkbDRqLldTRExSZWFkZXJJbXBsOwotCi1wdWJsaWMgY2xhc3MgUmVhZE9BR0lTV1NETFRlc3RjYXNlIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0Q2FzZQotewotICBwcml2YXRlIExpc3QgZGVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdTREwoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgb2FnaXM4MERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib2FnaXM4MERpciIpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG9hZ2lzODBEaXIpOwotICAgIGlmICghb2FnaXM4MERpci5lbmRzV2l0aCgiLyIpICYmICFvYWdpczgwRGlyLmVuZHNXaXRoKCJcXCIpKQotICAgICAgb2FnaXM4MERpciA9IG9hZ2lzODBEaXIgKyAiLyI7Ci0gICAgRmlsZSBkaXIgPSBuZXcgRmlsZShvYWdpczgwRGlyICsgIk9BR0lTOC4wL3dzL3dzZGwiKTsKLSAgICBpZiAoZGlyLmV4aXN0cygpICYmIGRpci5pc0RpcmVjdG9yeSgpKQotICAgIHsKLSAgICAgIEZpbGVbXSB3c2RscyA9IGRpci5saXN0RmlsZXMKLSAgICAgICgKLSAgICAgICAgbmV3IEZpbGVGaWx0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aCgiLndzZGwiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICk7Ci0gICAgICB0YWdBc1N1bW1hcnkoIlJlYWQgT0FHSVMgV1NETCIsIG5ldyBEaW1lbnNpb25bXSB7RGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUywgRGltZW5zaW9uLldPUktJTkdfU0VUfSk7Ci0gICAgICBzdGFydE1lYXN1cmluZygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2Rscy5sZW5ndGg7IGkrKykKLSAgICAgICAgcmVhZFdTREwod3NkbHNbaV0udG9VUkwoKS50b1N0cmluZygpKTsKLSAgICAgIHN0b3BNZWFzdXJpbmcoKTsKLSAgICAgIGNvbW1pdE1lYXN1cmVtZW50cygpOwotICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZmFpbChkaXIudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVhZFdTREwoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgV1NETFJlYWRlckltcGwgcmVhZGVyID0gbmV3IFdTRExSZWFkZXJJbXBsKCk7Ci0gICAgZGVmcy5hZGQocmVhZGVyLnJlYWRXU0RMKGxvY2F0aW9uKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9SZWFkU3RvY2tRdW90ZVdTRExFTUZUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YjUzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9SZWFkU3RvY2tRdW90ZVdTRExFTUZUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZWFkU3RvY2tRdW90ZVdTRExFTUZUZXN0Q2FzZSBleHRlbmRzIFBlcmZvcm1hbmNlVGVzdENhc2UKLXsKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlYWRTdG9ja1F1b3RlV1NETEVNRlRlc3RDYXNlLmNsYXNzLCAiUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UiKTsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0b2NrUXVvdGVXU0RMX0VNRigpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgVVJMIHdzZGwgPSBQZXJmb3JtYW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGEvU3RvY2tRdW90ZS9TdG9ja1F1b3RlLndzZGwiKTsKLSAgICAKLQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICBXU0RMUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi53c2RsIikpOwotCXJlc291cmNlLnNldFVSSShVUkkuY3JlYXRlVVJJKHdzZGwudG9TdHJpbmcoKSkpOwotICAgIGphdmEudXRpbC5NYXAgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIG1hcC5wdXQoV1NETFJlc291cmNlSW1wbC5DT05USU5VRV9PTl9MT0FEX0VSUk9SLEJvb2xlYW4udmFsdWVPZih0cnVlKSk7Ci0gICAgbWFwLnB1dChXU0RMUmVzb3VyY2VJbXBsLlVTRV9FWFRFTlNJT05fRkFDVE9SSUVTLEJvb2xlYW4udmFsdWVPZih0cnVlKSk7Ci0JcmVzb3VyY2UubG9hZChtYXApOyAKLQlEZWZpbml0aW9uIGRlZmluaXRpb24gPSByZXNvdXJjZS5nZXREZWZpbml0aW9uKCk7Ci0JCi0Jc3RvcE1lYXN1cmluZygpOwotCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1JlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9SZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzhmYzZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1JlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi2gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ai5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBSZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSBleHRlbmRzIFBlcmZvcm1hbmNlVGVzdENhc2UKLXsKLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFJlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlLmNsYXNzLCAiUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFJlYWRTdG9ja1F1b3RlV1NETCgpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN0YXJ0TWVhc3VyaW5nKCk7Ci0gICAgVVJMIHdzZGwgPSBQZXJmb3JtYW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGEvU3RvY2tRdW90ZS9TdG9ja1F1b3RlLndzZGwiKTsKLSAgICBXU0RMRmFjdG9yeUltcGwgZmFjdG9yeSA9IG5ldyBXU0RMRmFjdG9yeUltcGwoKTsKLSAgICBXU0RMUmVhZGVyIHJlYWRlciA9IGZhY3RvcnkubmV3V1NETFJlYWRlcigpOwotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHJlYWRlci5yZWFkV1NETCh3c2RsLnRvU3RyaW5nKCksIG5ldyBJbnB1dFNvdXJjZSh3c2RsLm9wZW5TdHJlYW0oKSkpOwotICAgIHN0b3BNZWFzdXJpbmcoKTsKLQljb21taXRNZWFzdXJlbWVudHMoKTsKLQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9WYWxpZGF0ZU9BR0lTV1NETFRlc3RjYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9WYWxpZGF0ZU9BR0lTV1NETFRlc3RjYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjcxNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvVmFsaWRhdGVPQUdJU1dTRExUZXN0Y2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5XU0RMVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVPQUdJU1dTRExUZXN0Y2FzZSBleHRlbmRzIFBlcmZvcm1hbmNlVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBXU0RMVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkgIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgLy8gU2V0IHRoZSBXUy1JIHByZWZlcmVuY2UgdG8gaWdub3JlIHNvIG9ubHkgV1NETCBlcnJvcnMgd2lsbCBiZSB0ZXN0ZWQuCi0gICAgV1NVSVBsdWdpbiB3c3VpID0gV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotICAgIFBlcnNpc3RlbnRXU0lDb250ZXh0IHdzaWNvbnRleHQgPSB3c3VpLmdldFdTSVNTQlBDb250ZXh0KCk7Ci0gICAgd3NpY29udGV4dC51cGRhdGVXU0lDb21wbGlhbmNlcyhQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSSk7Ci0gICAgd3NpY29udGV4dCA9IHdzdWkuZ2V0V1NJQVBDb250ZXh0KCk7Ci0gICAgd3NpY29udGV4dC51cGRhdGVXU0lDb21wbGlhbmNlcyhQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSSk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlV1NETCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFdTRExFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBvYWdpczgwRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJvYWdpczgwRGlyIik7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwob2FnaXM4MERpcik7Ci0gICAgaWYgKCFvYWdpczgwRGlyLmVuZHNXaXRoKCIvIikgJiYgIW9hZ2lzODBEaXIuZW5kc1dpdGgoIlxcIikpCi0gICAgICBvYWdpczgwRGlyID0gb2FnaXM4MERpciArICIvIjsKLSAgICBGaWxlIGRpciA9IG5ldyBGaWxlKG9hZ2lzODBEaXIgKyAiT0FHSVM4LjAvd3Mvd3NkbCIpOwotICAgIGlmIChkaXIuZXhpc3RzKCkgJiYgZGlyLmlzRGlyZWN0b3J5KCkpCi0gICAgewotICAgICAgRmlsZVtdIHdzZGxzID0gZGlyLmxpc3RGaWxlcwotICAgICAgKAotICAgICAgICBuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIud3NkbCIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgKTsKLSAgICAgIHRhZ0FzU3VtbWFyeSgiVmFsaWRhdGUgT0FHSVMgV1NETCIsIG5ldyBEaW1lbnNpb25bXSB7RGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUywgRGltZW5zaW9uLldPUktJTkdfU0VUfSk7Ci0JICB2YWxpZGF0b3IgPSBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0JICBzdGFydE1lYXN1cmluZygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3c2Rscy5sZW5ndGg7IGkrKykKLSAgICAgICAgdmFsaWRhdGVXU0RMKHdzZGxzW2ldLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0gICAgICBzdG9wTWVhc3VyaW5nKCk7Ci0gICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgIGFzc2VydFBlcmZvcm1hbmNlKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGZhaWwoZGlyLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlV1NETChTdHJpbmcgbG9jYXRpb24pIHRocm93cyBXU0RMRXhjZXB0aW9uCi0gIHsKLSAgICBJVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSB2YWxpZGF0b3IudmFsaWRhdGUobG9jYXRpb24pOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9WYWxpZGF0ZU9BR0lTV1NJVGVzdGNhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1ZhbGlkYXRlT0FHSVNXU0lUZXN0Y2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWUyZjcxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1ZhbGlkYXRlT0FHSVNXU0lUZXN0Y2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuV1NETEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5XU0RMVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVPQUdJU1dTSVRlc3RjYXNlIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0Q2FzZQotewotICBwcml2YXRlIFdTRExWYWxpZGF0b3IgdmFsaWRhdG9yOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIC8vIFNldCB0aGUgV1MtSSBwcmVmZXJlbmNlIHRvIGlnbm9yZSBzbyBvbmx5IFdTREwgZXJyb3JzIHdpbGwgYmUgdGVzdGVkLgotICAgIFdTVUlQbHVnaW4gd3N1aSA9IFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLSAgICBQZXJzaXN0ZW50V1NJQ29udGV4dCB3c2ljb250ZXh0ID0gd3N1aS5nZXRXU0lTU0JQQ29udGV4dCgpOwotICAgIHdzaWNvbnRleHQudXBkYXRlV1NJQ29tcGxpYW5jZXMoUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJKTsKLSAgICB3c2ljb250ZXh0ID0gd3N1aS5nZXRXU0lBUENvbnRleHQoKTsKLSAgICB3c2ljb250ZXh0LnVwZGF0ZVdTSUNvbXBsaWFuY2VzKFBlcnNpc3RlbnRXU0lDb250ZXh0LlNUT1BfTk9OX1dTSSk7Ci0gIH0gCi0KLSAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlV1NETCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFdTRExFeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBvYWdpczgwRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJvYWdpczgwRGlyIik7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwob2FnaXM4MERpcik7Ci0gICAgaWYgKCFvYWdpczgwRGlyLmVuZHNXaXRoKCIvIikgJiYgIW9hZ2lzODBEaXIuZW5kc1dpdGgoIlxcIikpCi0gICAgICBvYWdpczgwRGlyID0gb2FnaXM4MERpciArICIvIjsKLSAgICBGaWxlIGRpciA9IG5ldyBGaWxlKG9hZ2lzODBEaXIgKyAiT0FHSVM4LjAvd3Mvd3NkbCIpOwotICAgIGlmIChkaXIuZXhpc3RzKCkgJiYgZGlyLmlzRGlyZWN0b3J5KCkpCi0gICAgewotICAgICAgRmlsZVtdIHdzZGxzID0gZGlyLmxpc3RGaWxlcwotICAgICAgKAotICAgICAgICBuZXcgRmlsZUZpbHRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIud3NkbCIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgKTsKLSAgICAgIHRhZ0FzU3VtbWFyeSgiVmFsaWRhdGUgT0FHSVMgV1NETCB3aXRoIFdTLUkiLCBuZXcgRGltZW5zaW9uW10ge0RpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MsIERpbWVuc2lvbi5XT1JLSU5HX1NFVH0pOwotCSAgdmFsaWRhdG9yID0gV1NETFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotCSAgc3RhcnRNZWFzdXJpbmcoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd3NkbHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHZhbGlkYXRlV1NETCh3c2Rsc1tpXS50b1VSTCgpLnRvU3RyaW5nKCkpOwotICAgICAgc3RvcE1lYXN1cmluZygpOwotICAgICAgY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0gICAgICBhc3NlcnRQZXJmb3JtYW5jZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBmYWlsKGRpci50b1N0cmluZygpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVdTREwoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgV1NETEV4Y2VwdGlvbgotICB7Ci0gICAgSVZhbGlkYXRpb25SZXBvcnQgdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKGxvY2F0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvVmFsaWRhdGVTdG9ja1F1b3RlV1NETFRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9WYWxpZGF0ZVN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlZWIxOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wZXJmb3JtYW5jZS9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9wZXJmb3JtYW5jZS9WYWxpZGF0ZVN0b2NrUXVvdGVXU0RMVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5XU0RMVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTdG9ja1F1b3RlV1NETFRlc3RDYXNlIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0Q2FzZQotewotICBwcml2YXRlIFdTRExWYWxpZGF0b3IgdmFsaWRhdG9yOwotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIC8vIFNldCB0aGUgV1MtSSBwcmVmZXJlbmNlIHRvIGlnbm9yZSBzbyBvbmx5IFdTREwgZXJyb3JzIHdpbGwgYmUgdGVzdGVkLgotICAgIFdTVUlQbHVnaW4gd3N1aSA9IFdTVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLSAgICBQZXJzaXN0ZW50V1NJQ29udGV4dCB3c2ljb250ZXh0ID0gd3N1aS5nZXRXU0lTU0JQQ29udGV4dCgpOwotICAgIHdzaWNvbnRleHQudXBkYXRlV1NJQ29tcGxpYW5jZXMoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotICAgIHdzaWNvbnRleHQgPSB3c3VpLmdldFdTSUFQQ29udGV4dCgpOwotICAgIHdzaWNvbnRleHQudXBkYXRlV1NJQ29tcGxpYW5jZXMoUGVyc2lzdGVudFdTSUNvbnRleHQuSUdOT1JFX05PTl9XU0kpOwotICB9ICAKLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShWYWxpZGF0ZVN0b2NrUXVvdGVXU0RMVGVzdENhc2UuY2xhc3MsICJWYWxpZGF0ZVN0b2NrUXVvdGVXU0RMVGVzdENhc2UiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlU3RvY2tRdW90ZVdTREwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLQl2YWxpZGF0b3IgPSBXU0RMVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0gICAgVVJMIHdzZGwgPSBQZXJmb3JtYW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGEvU3RvY2tRdW90ZS9TdG9ja1F1b3RlLndzZGwiKTsKLSAgICBTdHJpbmcgcGF0aCA9IHdzZGwudG9TdHJpbmcoKTsKLQkKLSAgICBzdGFydE1lYXN1cmluZygpOwotICAgIElWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZShwYXRoKTsKLQlzdG9wTWVhc3VyaW5nKCk7Ci0JY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvVmFsaWRhdGVTdG9ja1F1b3RlV1NJVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3BlcmZvcm1hbmNlL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3BlcmZvcm1hbmNlL1ZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMGZiYjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGVyZm9ybWFuY2Uvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvcGVyZm9ybWFuY2UvVmFsaWRhdGVTdG9ja1F1b3RlV1NJVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLaAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkucGx1Z2luLldTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnVpLndzaS5wcmVmZXJlbmNlcy5QZXJzaXN0ZW50V1NJQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLklWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuZWNsaXBzZS5XU0RMVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGVTdG9ja1F1b3RlV1NJVGVzdENhc2UgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlCi17Ci0gIHByaXZhdGUgV1NETFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgLy8gU2V0IHRoZSBXUy1JIHByZWZlcmVuY2UgdG8gaWdub3JlIHNvIG9ubHkgV1NETCBlcnJvcnMgd2lsbCBiZSB0ZXN0ZWQuCi0gICAgV1NVSVBsdWdpbiB3c3VpID0gV1NVSVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotICAgIFBlcnNpc3RlbnRXU0lDb250ZXh0IHdzaWNvbnRleHQgPSB3c3VpLmdldFdTSVNTQlBDb250ZXh0KCk7Ci0gICAgd3NpY29udGV4dC51cGRhdGVXU0lDb21wbGlhbmNlcyhQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kpOwotICAgIHdzaWNvbnRleHQgPSB3c3VpLmdldFdTSUFQQ29udGV4dCgpOwotICAgIHdzaWNvbnRleHQudXBkYXRlV1NJQ29tcGxpYW5jZXMoUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmFsaWRhdGVTdG9ja1F1b3RlV1NJVGVzdENhc2UuY2xhc3MsICJWYWxpZGF0ZVN0b2NrUXVvdGVXU0lUZXN0Q2FzZSIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVTdG9ja1F1b3RlV1NJKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JdmFsaWRhdG9yID0gV1NETFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotICAgIFVSTCB3c2RsID0gUGVyZm9ybWFuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhL1N0b2NrUXVvdGUvU3RvY2tRdW90ZS53c2RsIik7Ci0gICAgU3RyaW5nIHBhdGggPSB3c2RsLnRvU3RyaW5nKCk7Ci0JCi0gICAgc3RhcnRNZWFzdXJpbmcoKTsJCi0gICAgSVZhbGlkYXRpb25SZXBvcnQgdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHBhdGgpOwotCXN0b3BNZWFzdXJpbmcoKTsKLQljb21taXRNZWFzdXJlbWVudHMoKTsKLQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyYmZlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgIG5hbWU9IldTREwgUGVyZm9ybWFuY2UgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwZXJmb3JtYW5jZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaWRlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy53c2RsNGoiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3MudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQwNDY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InBlcmZvcm1hbmNlIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0icGVyZi10ZXN0cy1maWxlIiB2YWx1ZT0iJHt0ZXN0RGlyfS9wZXJmb3JtYW5jZS10ZXN0cy54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvYWdpczgwRGlyPSR7dGVzdERpcn0gLVhteDI1Nk0iLz4KLQotICA8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3dvcmtzcGFjZV93c2RsX3BlcmZvcm1hbmNlIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZSoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZV9zdWl0ZSI+Ci0KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InJlYWRPQUdJU1dTRExUZXN0Y2FzZSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0icmVhZE9BR0lTV1NETFRlc3RjYXNlIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJyZWFkT0FHSVNXU0RMVGVzdGNhc2UiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InJlYWRPQUdJU1dTRExUZXN0Y2FzZSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0icmVhZE9BR0lTV1NETFRlc3RjYXNlIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJyZWFkT0FHSVNXU0RMVGVzdGNhc2UiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InJlYWRPQUdJU1dTRExUZXN0Y2FzZSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0icmVhZE9BR0lTV1NETFRlc3RjYXNlIi8+Ci0KLSAgCTxhbnRjYWxsIHRhcmdldD0iVmFsaWRhdGVPQUdJU1dTRExUZXN0Y2FzZSIvPgotICAJPGFudGNhbGwgdGFyZ2V0PSJWYWxpZGF0ZU9BR0lTV1NETFRlc3RjYXNlIi8+Ci0JPGFudGNhbGwgdGFyZ2V0PSJWYWxpZGF0ZU9BR0lTV1NETFRlc3RjYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlT0FHSVNXU0RMVGVzdGNhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iVmFsaWRhdGVPQUdJU1dTRExUZXN0Y2FzZSIvPgotICAJPGFudGNhbGwgdGFyZ2V0PSJWYWxpZGF0ZU9BR0lTV1NETFRlc3RjYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlT0FHSVNXU0RMVGVzdGNhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iVmFsaWRhdGVPQUdJU1dTRExUZXN0Y2FzZSIvPgotCi0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlT0FHSVNXU0lUZXN0Y2FzZSIvPgotICAJPGFudGNhbGwgdGFyZ2V0PSJWYWxpZGF0ZU9BR0lTV1NJVGVzdGNhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iVmFsaWRhdGVPQUdJU1dTSVRlc3RjYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlT0FHSVNXU0lUZXN0Y2FzZSIvPgotICAJPGFudGNhbGwgdGFyZ2V0PSJWYWxpZGF0ZU9BR0lTV1NJVGVzdGNhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iVmFsaWRhdGVPQUdJU1dTSVRlc3RjYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlT0FHSVNXU0lUZXN0Y2FzZSIvPgotICAJPGFudGNhbGwgdGFyZ2V0PSJWYWxpZGF0ZU9BR0lTV1NJVGVzdGNhc2UiLz4KLQotICAgIDxhbnRjYWxsIHRhcmdldD0ib3BlbkVkaXRvck9BR0lTV1NETFRlc3RjYXNlIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJvcGVuRWRpdG9yT0FHSVNXU0RMVGVzdGNhc2UiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9Im9wZW5FZGl0b3JPQUdJU1dTRExUZXN0Y2FzZSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0ib3BlbkVkaXRvck9BR0lTV1NETFRlc3RjYXNlIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJvcGVuRWRpdG9yT0FHSVNXU0RMVGVzdGNhc2UiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9Im9wZW5FZGl0b3JPQUdJU1dTRExUZXN0Y2FzZSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0ib3BlbkVkaXRvck9BR0lTV1NETFRlc3RjYXNlIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJvcGVuRWRpdG9yT0FHSVNXU0RMVGVzdGNhc2UiLz4KLQotICAgIDxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9IlJlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJSZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9IlJlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJSZWFkU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIvPgotICAgIDxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9IlJlYWRTdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0KLSAgCTxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iUmVhZFN0b2NrUXVvdGVXU0RMRU1GVGVzdENhc2UiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9IlJlYWRTdG9ja1F1b3RlV1NETEVNRlRlc3RDYXNlIi8+Ci0KLSAgCTxhbnRjYWxsIHRhcmdldD0iVmFsaWRhdGVTdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIvPgotICAJPGFudGNhbGwgdGFyZ2V0PSJWYWxpZGF0ZVN0b2NrUXVvdGVXU0RMVGVzdENhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iVmFsaWRhdGVTdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIvPgotICAJPGFudGNhbGwgdGFyZ2V0PSJWYWxpZGF0ZVN0b2NrUXVvdGVXU0RMVGVzdENhc2UiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iVmFsaWRhdGVTdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSIvPgotCi0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9IlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0KLSAgCTxhbnRjYWxsIHRhcmdldD0iT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiLz4KLSAgCTxhbnRjYWxsIHRhcmdldD0iT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiLz4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9Ik9wZW5TdG9ja1F1b3RlV1NETFNldHVwIi8+Ci0gIAk8YW50Y2FsbCB0YXJnZXQ9Ik9wZW5TdG9ja1F1b3RlV1NETFNldHVwIi8+Ci0KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJyZWFkT0FHSVNXU0RMVGVzdGNhc2UiPgotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UuUmVhZE9BR0lTV1NETFRlc3RjYXNlIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9IlZhbGlkYXRlT0FHSVNXU0RMVGVzdGNhc2UiPgotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLlZhbGlkYXRlT0FHSVNXU0RMVGVzdGNhc2UiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iVmFsaWRhdGVPQUdJU1dTSVRlc3RjYXNlIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS5WYWxpZGF0ZU9BR0lTV1NJVGVzdGNhc2UiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ib3BlbkVkaXRvck9BR0lTV1NETFRlc3RjYXNlIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS5PcGVuRWRpdG9yT0FHSVNXU0RMVGVzdGNhc2UiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UiPgotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UuUmVhZFN0b2NrUXVvdGVXU0RMVGVzdENhc2UiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJSZWFkU3RvY2tRdW90ZVdTRExFTUZUZXN0Q2FzZSI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy5wZXJmb3JtYW5jZS5SZWFkU3RvY2tRdW90ZVdTRExFTUZUZXN0Q2FzZSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9IlZhbGlkYXRlU3RvY2tRdW90ZVdTRExUZXN0Q2FzZSI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMucGVyZm9ybWFuY2UuVmFsaWRhdGVTdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iVmFsaWRhdGVTdG9ja1F1b3RlV1NJVGVzdENhc2UiPgotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLlZhbGlkYXRlU3RvY2tRdW90ZVdTSVRlc3RDYXNlIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iT3BlblN0b2NrUXVvdGVXU0RMU2V0dXAiPgotICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLk9wZW5TdG9ja1F1b3RlV1NETFNldHVwIi8+Ci0gICAgPC9hbnQ+Ci0gICAgPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7cGVyZi10ZXN0cy1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlLk9wZW5TdG9ja1F1b3RlV1NETFRlc3RDYXNlIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgcGVyZm9ybWFuY2UgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIiBkZXBlbmRzPSJpbml0LHBlcmZvcm1hbmNlX3N1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnBlcmZvcm1hbmNlKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YzVkNDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5jb20uaWJtLmV0b29scy53c2RsPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS54c2Q8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzBmMTE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1zb3VyY2Uud3NkbC50ZXN0cy51aS5qYXIgPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIHdzZGwudGVzdHMudWkuamFyLFwKLSAgICAgICAgICAgICAgIFRlbXBlcmF0dXJlU2VydmljZS53c2RsLFwKLSAgICAgICAgICAgICAgIGphcnMvCi1zcmMuaW5jbHVkZXMgPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBUZW1wZXJhdHVyZVNlcnZpY2Uud3NkbCxcCi0gICAgICAgICAgICAgICAucHJvamVjdCxcCi0gICAgICAgICAgICAgICAuY2xhc3NwYXRoLFwKLSAgICAgICAgICAgICAgIGphcnMvCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRhZDBhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aSIKLSAgIG5hbWU9IldTREwgTW9kZWwgVUkgU2FtcGxlcyIKLSAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ3c2RsLnRlc3RzLnVpLmphciIvPgotICAgPC9ydW50aW1lPgotICAgCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UueHNkIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgPC9yZXF1aXJlcz4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgIG5hbWVGaWx0ZXI9Iioud3NkbCIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkub2JqZWN0X2NvbnRyaWJ1dGlvbiI+Ci0gICAgICAgICA8IS0tCi0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgbGFiZWw9IkdlbmVyYXRlIFdTREwgU2FtcGxlIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS5HZW5lcmF0ZVdTRExBY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS5nZW5lcmF0ZV93c2RsX2FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIC0tPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGxhYmVsPSJDb252ZXJ0IHRvIFdTREwgMi4wIERvY3VtZW50IgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS5Db252ZXJ0V1NETDIwQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkuY29udmVydF93c2RsX2FjdGlvbiI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvQ29udmVydFdTREwyMEFjdGlvbkRlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvQ29udmVydFdTREwyMEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODdmMDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3VpL0NvbnZlcnRXU0RMMjBBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvbkxvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLldTRExDb252ZXJ0ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ29udmVydFdTREwyMEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17Ci0gIHByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIElGaWxlIGlmaWxlID0gbnVsbDsKLSAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgT2JqZWN0IGVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgCWlmaWxlID0gKElGaWxlKSBlbGVtZW50OwotICAgICAgICBJUGF0aCBwYXRoID0gaWZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgSVBhdGggcGF0aDIgPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLSAgICAgICAgU3RyaW5nIG91dHB1dCA9IHBhdGgyLnRvU3RyaW5nKCkgKyAiLyIgKyBnZXROZXdOYW1lKGlmaWxlKTsKLSAgICAgICAgCi0gICAgICAgIHRyeQotCQkgICAgeyAgCi0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZiA9IERlZmluaXRpb25Mb2FkZXIubG9hZCgiZmlsZTovIiArIHBhdGgudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBXU0RMQ29udmVydGVyIGNvbnZlcnRlciA9IG5ldyBXU0RMQ29udmVydGVyKGRlZik7Ci0gICAgICAgICAgICBjb252ZXJ0ZXIuZ2VuZXJhdGUyMChvdXRwdXQpOwotICAgICAgICAgICAgSUNvbnRhaW5lciBmb2xkZXIgPSBpZmlsZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIGZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSxudWxsKTsKLQkJICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQotCQkgICAgewotICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCSAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgIAotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROZXdOYW1lKElGaWxlIGlmaWxlKQotICB7Ci0gICAgLy8gQXNzZXJ0IGN1cnJlbnROYW1lIGhhcyBhIGZpbGUgZXh0ZW5zaW9uLCBlLmcuIGZvby53c2RsLgotICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gZm9vVjIwLndzZGwuCi0gICAgU3RyaW5nIGN1cnJlbnROYW1lID0gaWZpbGUuZ2V0TmFtZSgpOwotICAgIFN0cmluZyBuYW1lID0gY3VycmVudE5hbWUuc3Vic3RyaW5nKDAsY3VycmVudE5hbWUuaW5kZXhPZigiLiIpKTsKLSAgICBTdHJpbmcgZXh0ZW5zaW9uID0gY3VycmVudE5hbWUuc3Vic3RyaW5nKGN1cnJlbnROYW1lLmluZGV4T2YoIi4iKSk7Ci0gICAgU3RyaW5nIG5ld05hbWUgPSBuYW1lICsgIlYyMCIgKyBleHRlbnNpb247Ci0gICAgcmV0dXJuIG5ld05hbWU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWkvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3VpL0dlbmVyYXRlV1NETEFjdGlvbkRlbGVnYXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvR2VuZXJhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhZThjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdWkvR2VuZXJhdGVXU0RMQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLldTRExHZW5lcmF0aW9uVGVzdDsKLQotcHVibGljIGNsYXNzIEdlbmVyYXRlV1NETEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17Ci0gIHByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIElGaWxlIGlmaWxlID0gbnVsbDsKLSAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgewotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgT2JqZWN0IGVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCi0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKQotICAgICAgewotICAgICAgCWlmaWxlID0gKElGaWxlKSBlbGVtZW50OwotICAgICAgICBJUGF0aCBwYXRoID0gaWZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcGF0aC50b1N0cmluZygpICsgIi9NeVNhbXBsZS53c2RsIjsKLSAgICAgICAgCi0gICAgICAgIHRyeQotCQl7Ci0gICAgICAgICAgKG5ldyBXU0RMR2VuZXJhdGlvblRlc3QoKSkuZ2VuZXJhdGVUZW1wZXJhdHVyZVNlcnZpY2Uob3V0cHV0KTsKLQkJfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLSAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAgICAgCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YmZhODQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5jb20uaWJtLmV0b29scy53c2RsPC9wcm9qZWN0PgotCQk8cHJvamVjdD5jb20uaWJtLndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUueGVyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmVtZi5lY29yZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnhzZDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmp1bml0PC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkODQxNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICB0ZXN0UmVzb3VyY2VzLyxcCi0gICAgICAgICAgICAgICBydW50ZXN0cy5iYXQsXAotICAgICAgICAgICAgICAgSlVOSVQuWFNMLFwKLSAgICAgICAgICAgICAgIHJ1bnRpbWUvLFwKLSAgICAgICAgICAgICAgIHdzZGwudGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHNhbXBsZXMvCi1zb3VyY2Uud3NkbC50ZXN0cy5qYXIgPSBzcmMvCi1zcmMuaW5jbHVkZXMgPSB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYnVpbGQueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCi0gICAgICAgICAgICAgICAuY3ZzaWdub3JlLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIEpVTklULlhTTCxcCi0gICAgICAgICAgICAgICBydW50ZXN0cy5iYXQsXAotICAgICAgICAgICAgICAgdGVzdFJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgcnVudGltZS8sXAotICAgICAgICAgICAgICAgUFRBVGltZURpc3RyaWJ1dGlvbi53c2RsLFwKLSAgICAgICAgICAgICAgIFRERGF0YVNldC54c2QsXAotICAgICAgICAgICAgICAgc2FtcGxlcy8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTA5NjY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIgotICAgbmFtZT0iV1NETCBKVW5pdCBUZXN0IgotICAgdmVyc2lvbj0iMS4wLjAiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9IndzZGwudGVzdHMuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Qud3NkbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnhzZCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLndzZGw0aiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjNhNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvTG9hZEFuZFByaW50VGVzdC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJMb2FkQW5kUHJpbnRUZXN0IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9Mb2FkQW5kUHJpbnRUZXN0LyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0xvYWRBbmRQcmludFRlc3QvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkxvYWRBbmRQcmludFRlc3QiPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iTG9hZEFuZFByaW50VGVzdFNPQVAiIHR5cGU9InRuczpMb2FkQW5kUHJpbnRUZXN0Ij4KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvTG9hZEFuZFByaW50VGVzdC9OZXdPcGVyYXRpb24iLz4KLSAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJMb2FkQW5kUHJpbnRUZXN0Ij4KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpMb2FkQW5kUHJpbnRUZXN0U09BUCIgbmFtZT0iTG9hZEFuZFByaW50VGVzdFNPQVAiPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0FsbFRlc3RDYXNlcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0FsbFRlc3RDYXNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRkMTY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9BbGxUZXN0Q2FzZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0Q2FzZXMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gIHB1YmxpYyBBbGxUZXN0Q2FzZXMoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QoSW5saW5lU2NoZW1hVGVzdC5zdWl0ZSgpKTsgIAotICAgIHN1aXRlLmFkZFRlc3QoTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0LnN1aXRlKCkpOwotICAgIHN1aXRlLmFkZFRlc3QoU2VtYW50aWNUZXN0LnN1aXRlKCkpOwotICAgIHN1aXRlLmFkZFRlc3QoV1NETEdlbmVyYXRpb25UZXN0LnN1aXRlKCkpOwotICAgIHN1aXRlLmFkZFRlc3QoV1NETDRKQVBJVGVzdC5zdWl0ZSgpKTsKLSAgICBzdWl0ZS5hZGRUZXN0KFdTRExFTUZBUElUZXN0LnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoVXRpbFRlc3Quc3VpdGUoKSk7Ci0gICAgCi0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9JbmxpbmVTY2hlbWFUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvSW5saW5lU2NoZW1hVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDkyNDI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9JbmxpbmVTY2hlbWFUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLndzZGw0ai5XU0RMRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgSW5saW5lU2NoZW1hVGVzdCBleHRlbmRzIFRlc3RDYXNlIAotewotICBwdWJsaWMgSW5saW5lU2NoZW1hVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotCQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSAKLSAgewotICAgIC8vanVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKElubGluZVNjaGVtYVRlc3QuY2xhc3MpOwotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotCQotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IElubGluZVNjaGVtYVRlc3QoIklubGluZVNjaGVtYSIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLQkgICAgICAgICB0ZXN0SW5saW5lU2NoZW1hKCk7Ci0JICAgICAgIH0KLQkgICAgIH0KLQkgICApOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgSW5saW5lU2NoZW1hVGVzdCgiSW5saW5lU2NoZW1hV2l0aFdTREw0SiIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0SW5saW5lU2NoZW1hV2l0aFdTREw0SigpOwotICAgICAgICAgICB9Ci0JICAgICB9Ci0JICAgKTsKLSAgICAKLQkgIHJldHVybiBzdWl0ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAgIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIudGVhckRvd24oKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJbmxpbmVTY2hlbWEoKSAKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IERlZmluaXRpb25Mb2FkZXIubG9hZCgiLi9zYW1wbGVzL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgICAgLy9EZWZpbml0aW9uIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoIi4vc2FtcGxlcy9nZXRCYWxhbmNlQmluZGluZy53c2RsIik7Ci0gICAgICB0cmF2ZXJzZURlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RJbmxpbmVTY2hlbWFXaXRoV1NETDRKKCkgCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBsb2FkRGVmaW5pdGlvbkZvcldTREw0SigiLi9zYW1wbGVzL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgICAgdHJhdmVyc2VEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdHJhdmVyc2VEZWZpbml0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGVmaW5pdGlvbik7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlciA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBJbXBvcnQgbXlJbXBvcnQgPSAoSW1wb3J0KWl0ZXIubmV4dCgpOwotICAgICAgLy90cmF2ZXJzZUltcG9ydChteUltcG9ydCk7Ci0gICAgfSAgICAKLSAgICAKLSAgICAvLyBHZXQgSW5saW5lIFNjaGVtYQotICAgIFR5cGVzIHR5cGVzID0gKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKWRlZmluaXRpb24uZ2V0VHlwZXMoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiPHR5cGVzPiBpcyBudWxsIix0eXBlcyk7Ci0gICAgaWYgKHR5cGVzICE9IG51bGwpCi0gICAgewotICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRTY2hlbWFzKCkuaXRlcmF0b3IoKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCI8dHlwZXM+IGRvZXMgbm90IGhhdmUgaW5saW5lIDxzY2hlbWE+cyIsaXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSAoWFNEU2NoZW1hKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdHJhdmVyc2VTY2hlbWEoc2NoZW1hKTsKLSAgICAgIH0KLSAgICB9ICAJCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB0cmF2ZXJzZUltcG9ydChJbXBvcnQgbXlJbXBvcnQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIERlZmluaXRpb24gZGVmID0gbXlJbXBvcnQuZ2V0RURlZmluaXRpb24oKTsKLSAgICB0cmF2ZXJzZURlZmluaXRpb24oZGVmKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHRyYXZlcnNlU2NoZW1hKFhTRFNjaGVtYSBzY2hlbWEpCi0gIHsKLSAgCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAJWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbnVsbDsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm8gPGVsZW1lbnQ+cyBhcmUgZm91bmQiLGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gIAl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGVsZW1lbnREZWNsID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbilpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgIGlmIChlbGVtZW50RGVjbC5nZXROYW1lKCkuZXF1YWxzKCJOZXdPcGVyYXRpb25SZXNwb25zZSIpKQotICAgICAgCXRyYXZlcnNlRWxlbWVudERlY2woZWxlbWVudERlY2wpOwotICAgICAgZWxzZSBpZiAoZWxlbWVudERlY2wuZ2V0TmFtZSgpLmVxdWFscygiTmV3T3BlcmF0aW9uUmVxdWVzdCIpKQotICAgICAgICB0cmF2ZXJzZUVsZW1lbnREZWNsKGVsZW1lbnREZWNsKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdHJhdmVyc2VFbGVtZW50RGVjbChYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpCi0gIHsKLSAgICBYU0RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZWxlbWVudERlY2wuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPGVsZW1lbnQ+IGRvZXMgbm90IGhhdmUgPHNpbXBsZVR5cGU+Iix0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pOwotICAgIGlmICh0eXBlLmdldENvbXBsZXhUeXBlKCkgPT0gbnVsbCkgLy8gc2ltcGxlIHR5cGUKLSAgICAgIHJldHVybjsgLy8gVEJEIC0gQ3VycmVudGx5IHRoaXMgYWx3YXlzIHJldHVybnMgYXQgdGhpcyBwb2ludC4KLSAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgY29udGVudCA9IHR5cGUuZ2V0Q29tcGxleFR5cGUoKS5nZXRDb250ZW50KCk7ICAgCi0gICAgdHJhdmVyc2VNb2RlbEdyb3VwKChYU0RNb2RlbEdyb3VwKWNvbnRlbnQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdHJhdmVyc2VNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgWFNEUGFydGljbGVDb250ZW50IHBhcnRpY2xlQ29udGVudCA9IG51bGw7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwYXJ0aWNsZUNvbnRlbnQgPSAoKFhTRFBhcnRpY2xlKWl0ZXJhdG9yLm5leHQoKSkuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTREVsZW1lbnREZWNsYXJhdGlvbikKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCkuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICAgICAgICB0cmF2ZXJzZUVsZW1lbnREZWNsKCgoWFNERWxlbWVudERlY2xhcmF0aW9uKXBhcnRpY2xlQ29udGVudCkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICB0cmF2ZXJzZUVsZW1lbnREZWNsKChYU0RFbGVtZW50RGVjbGFyYXRpb24pcGFydGljbGVDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBsb2FkRGVmaW5pdGlvbihTdHJpbmcgd3NkbEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIERlZmluaXRpb25Mb2FkZXIubG9hZCh3c2RsRmlsZSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBsb2FkRGVmaW5pdGlvbkZvcldTREw0SihTdHJpbmcgd3NkbEZpbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFdTRExSZWFkZXIgcmVhZGVyID0gKG5ldyBXU0RMRmFjdG9yeUltcGwoKSkubmV3V1NETFJlYWRlcigpOwotICAgIElQbHVnaW5EZXNjcmlwdG9yIHBkID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpOwotICAgIFVSTCB1cmwgPSBwZC5nZXRJbnN0YWxsVVJMKCk7Ci0gICAgdXJsID0gbmV3IFVSTCh1cmwsd3NkbEZpbGUpOwotICAgIFN0cmluZyBzID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldEZpbGUoKTsKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSAob3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbilyZWFkZXIucmVhZFdTREwocyxuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShzKSkpOwotICAgIHJldHVybiBkZWZpbml0aW9uOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2FkQW5kU2VyaWFsaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9Mb2FkQW5kU2VyaWFsaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhNWZkNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkRlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17ICAgIAotICAvKioKLSAgICogRXhlY3V0ZXMgYSBzdGFuZC1hbG9uZSB0ZXN0LgotICAgKiBAcGFyYW0gb2JqZWN0cyBhbiBhcnJheSBvZiBTdHJpbmdzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICogQHNlZSAjcnVuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSAKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UuCi0gICAqLwotICBwdWJsaWMgTG9hZEFuZFNlcmlhbGl6YXRpb25UZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCgiTG9hZCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TG9hZCgpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IExvYWRBbmRTZXJpYWxpemF0aW9uVGVzdCgiUHJpbnQiKSAKLSAgICAgICAgewotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICk7Ci0gICAgcmV0dXJuIHN1aXRlOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9ICAKLSAgCi0gIHN0YXRpYyBwcml2YXRlIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gIAotICAvKioKLSAgICogTG9hZCB0aGUgV1NETCBkZWZpbml0aW9ucyBmaWxlIGFuZCBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBpdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RMb2FkKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBEZWZpbml0aW9uTG9hZGVyLmxvYWQoIi4vc2FtcGxlcy9Mb2FkQW5kUHJpbnRUZXN0LndzZGwiKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRlZmluaXRpb24uZVJlc291cmNlKCkgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKTsKLSAgICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbFJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpZGVmaW5pdGlvbi5lUmVzb3VyY2UoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPCEtLSA9PT09PSBEZWZpbml0aW9uIENvbXBvc2l0aW9uID09PT09Iik7Ci0gICAgICBwcmludERlZmluaXRpb25TdGFydChkZWZpbml0aW9uKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0+Iik7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBkZWZpbml0aW9uLmdldEVsZW1lbnQoKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGRlZmluaXRpb24uZ2V0RWxlbWVudCgpKTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIFByaW50IHRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBtb2RlbC4KLSAgICAgICAgLy8KLSAgICAgICAgV1NETFJlc291cmNlSW1wbC5zZXJpYWxpemUoU3lzdGVtLm91dCwgZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICB9ICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFByaW50KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIFRoaXMgcmVtb3ZlcyB0aGUgYXNzb2NpYXRlZCBET00gZWxlbWVudCwgY3JlYXRlcyBhIG5ldyBhc3NvY2lhdGVkIERPTSBlbGVtZW50LCBhbmQgdGhlbiBwcmludHMgaXQuCi0gICAgICAvLyBUaGlzIGlzIGEgZ29vZCB0ZXN0IGZvciBob3cgd2VsbCBzZXJpYWxpemF0aW9uIHdvcmtzIGZvciBhIG1vZGVsIGNyZWF0ZWQgImJvdHRvbSB1cCIuCi0gICAgICAvLwotICAgICAgZGVmaW5pdGlvbi5zZXREb2N1bWVudChudWxsKTsKLSAgICAgIGRlZmluaXRpb24uc2V0RWxlbWVudChudWxsKTsKLSAgICAgICgoRGVmaW5pdGlvbkltcGwpZGVmaW5pdGlvbikudXBkYXRlRWxlbWVudCgpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI8IS0tIFsgZGVmaW5pdGlvbnM6ICIgKyBkZWZpbml0aW9uLmdldFFOYW1lKCkgKyAiIF0gLS0+Iik7Ci0gICAgICBXU0RMUmVzb3VyY2VJbXBsLnNlcmlhbGl6ZShTeXN0ZW0ub3V0LCBkZWZpbml0aW9uLmdldERvY3VtZW50KCkpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgfSAgIAotICB9Ci0gIAotICAvKioKLSAgICogUHJpbnRzIGEgaGVhZGVyIHRhZyBmb3IgdGhlIGdpdmVuIFdTREwgZGVmaW5pdGlvbnMuCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uIGEgV1NETCBkZWZpbml0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgcHJpbnREZWZpbml0aW9uU3RhcnQoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludCgiPGRlZmluaXRpb25zIG5hbWU9XCIiKTsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRRTmFtZSgpICE9IG51bGwpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludChkZWZpbml0aW9uLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50KCJcIiB0YXJnZXROYW1lc3BhY2U9XCIiKTsKLSAgICBpZiAoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnQoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0gICAgfSAgICAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiPiIpOwotICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvTXlSZXNvbHZlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL015UmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjYWE0ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvTXlSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi1wdWJsaWMgY2xhc3MgTXlSZXNvbHZlciBpbXBsZW1lbnRzIEVudGl0eVJlc29sdmVyCi17Ci0gIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgaWYgKHN5c3RlbUlkLmVxdWFscygiaHR0cDovL3d3dy5teWhvc3QuY29tL3RvZGF5IikpCi0gICAgewotICAgICAgLy8gcmV0dXJuIGEgc3BlY2lhbCBpbnB1dCBzb3VyY2UKLSAgICAgIC8vTXlSZWFkZXIgcmVhZGVyID0gbmV3IE15UmVhZGVyKCk7Ci0gICAgICAvL3JldHVybiBuZXcgSW5wdXRTb3VyY2UocmVhZGVyKTsKLSAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2Uoc3lzdGVtSWQpOyAvLyBUQkQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1BhcnNlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9QYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NGQ5ODUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1BhcnNlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgCi0gIHB1YmxpYyBQYXJzZXJUZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IFBhcnNlclRlc3QoIlBhcnNlciIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0UGFyc2VyKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICApOwotICAgIAotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlcigpIAotICB7Ci0gICAgRW50aXR5UmVzb2x2ZXIgbXlSZXNvbHZlciA9IG5ldyBNeVJlc29sdmVyKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIik7Ci0gICAgICBEb2N1bWVudEJ1aWxkZXIgbXlCdWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOwotICAgICAgbXlCdWlsZGVyLnNldEVudGl0eVJlc29sdmVyKG15UmVzb2x2ZXIpOwotICAgICAgRG9jdW1lbnQgZG9jID0gbXlCdWlsZGVyLnBhcnNlKGlzKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJEb2N1bWVudCBpcyBudWxsIixkb2MpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1JlZmFjdG9yaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1JlZmFjdG9yaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmMyOTYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9SZWZhY3RvcmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzOwotCi1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLmludGVybmFsLnV0aWwuU09BUENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1wdWJsaWMgY2xhc3MgUmVmYWN0b3JpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHVibGljIFJlZmFjdG9yaW5nVGVzdCgpCi0gIHsKLSAgICAvL2luaXQoKTsKLSAgfQotICAKLSAgcHVibGljIFJlZmFjdG9yaW5nVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IFJlZmFjdG9yaW5nVGVzdCgiUmVmYWN0b3JpbmciKSAKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVzdFJlZmFjdG9yaW5nKCk7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICApOwotICAgIAotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFJlZmFjdG9yaW5nKCkgCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0JICAvLyBCZWZvcmUgcnVubmluZyB0aGlzIHRlc3QsIG1vZGlmeSB0aGUgbG9jYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBXU0RMIGZpbGUKLSAgICAgIGdlbmVyYXRlV1NETCgiUmVmYWN0b3JpbmdUZXN0LndzZGwiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICAKLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9Ci0KLSAgLy8gZGVmZWN0IDY1OTQKLSAgcHVibGljIHZvaWQgcmVuYW1lT3BlcmF0aW9uKE9wZXJhdGlvbiBvcCkKLSAgewotCUlucHV0IGlucHV0ID0gb3AuZ2V0RUlucHV0KCk7Ci0JQXNzZXJ0LmFzc2VydE5vdE51bGwoaW5wdXQpOwotCU1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0JQXNzZXJ0LmFzc2VydE5vdE51bGwobWVzc2FnZSk7Ci0JCi0Jb3Auc2V0TmFtZSgiUmVuYW1lZCIgKyBvcC5nZXROYW1lKCkpOwotCVFOYW1lIG5ld1FOYW1lID0gbmV3IFFOYW1lKG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2VVUkkoKSwiUmVuYW1lZCIgKyBtZXNzYWdlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotCW1lc3NhZ2Uuc2V0UU5hbWUobmV3UU5hbWUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVdTREwoU3RyaW5nIG91dHB1dEZpbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotICAgIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZUZpbGVVUkkob3V0cHV0RmlsZSkpOwotICAgIHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBEZWZpbml0aW9uIC0gVGVtcGVyYXR1cmUKLSAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgIGRlZmluaXRpb24uc2V0UU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJLCJUZW1wYXJhdHVyZSIpKTsKLSAgICByZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkZWZpbml0aW9uKTsKLSAgICAKLSAgICAvLyBUYXJnZXQgbmFtZXNwYWNlIC0gaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20KLSAgICBkZWZpbml0aW9uLnNldFRhcmdldE5hbWVzcGFjZSgiaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20iKTsKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgidG5zIiwgImh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tIik7Ci0gICAgCi0gICAgLy8gT3RoZXIgbmFtZXNwYWNlcyAtIHdzZGwsIHNvYXAsIHhzZAotICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJ3c2RsIiwgV1NETENvbnN0YW50cy5XU0RMX05BTUVTUEFDRV9VUkkpOwotICAgIGRlZmluaXRpb24uYWRkTmFtZXNwYWNlKCJ4c2QiLCBXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgic29hcCIsIFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJKTsKLQotICAgIC8vCi0gICAgLy8gTGV0J3Mgc3RhcnQgYnVpbGRpbmcgdHdvIG1lc3NhZ2VzCi0gICAgLy8KLSAgICAKLSAgICAvLyBDcmVhdGUgYSBQYXJ0IC0gWmlwQ29kZQotICAgIFBhcnQgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgcGFydC5zZXROYW1lKCJaaXBDb2RlIik7Ci0gICAgcGFydC5zZXRUeXBlTmFtZShuZXcgUU5hbWUoV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwic3RyaW5nIikpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2UgLSBHZXRUZW1wZXJhdHVyZUlucHV0Ci0gICAgTWVzc2FnZSBpbnB1dE1lc3NhZ2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIGlucHV0TWVzc2FnZS5zZXRRTmFtZShuZXcgUU5hbWUoZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKSwgIkdldFRlbXBhcmF0dXJlSW5wdXQiKSk7Ci0gICAgaW5wdXRNZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gICAgZGVmaW5pdGlvbi5hZGRNZXNzYWdlKGlucHV0TWVzc2FnZSk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgUGFydCAtIFRlbXBlcmF0dXJlCi0gICAgcGFydCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJ0KCk7Ci0gICAgcGFydC5zZXROYW1lKCJUZW1wZXJhdHVyZSIpOwotICAgIHBhcnQuc2V0VHlwZU5hbWUobmV3IFFOYW1lKFdTRExDb25zdGFudHMuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDEsImZsb2F0IikpOwotCi0gICAgLy8gQ3JlYXRlIGEgTWVzc2FnZSAtIEdldFRlbXBlcmF0dXJlT3V0cHV0Ci0gICAgTWVzc2FnZSBvdXRwdXRNZXNzYWdlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2UoKTsKLSAgICBvdXRwdXRNZXNzYWdlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCAiR2V0VGVtcGFyYXR1cmVPdXRwdXQiKSk7Ci0gICAgb3V0cHV0TWVzc2FnZS5hZGRQYXJ0KHBhcnQpOwotICAgIGRlZmluaXRpb24uYWRkTWVzc2FnZShvdXRwdXRNZXNzYWdlKTsKLSAgICAKLSAgICAvLwotICAgIC8vIE5leHQsIGJ1aWxkIGEgUG9ydFR5cGUKLSAgICAvLwotICAgIAotICAgIC8vIENyZWF0ZSBhbiBJbnB1dCAtIEdldFRlbXBlcmF0dXJlSW5wdXQKLSAgICBJbnB1dCBpbnB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbnB1dCgpOwotICAgIGlucHV0LnNldE1lc3NhZ2UoaW5wdXRNZXNzYWdlKTsKLQotICAgIC8vIENyZWF0ZSBhbiBPdXRwdXQgLSBHZXRUZW1wZXJhdHVyZU91dHB1dAotICAgIE91dHB1dCBvdXRwdXQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0cHV0KCk7Ci0gICAgb3V0cHV0LnNldE1lc3NhZ2Uob3V0cHV0TWVzc2FnZSk7Ci0gICAKLSAgICAvLyBDcmVhdGUgYW4gT3BlcmF0aW9uIC0gR2V0VGVtcGVyYXR1cmVGb3JaaXBDb2RlCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcGVyYXRpb24oKTsKLSAgICBvcGVyYXRpb24uc2V0TmFtZSgiR2V0VGVtcGVyYXR1cmVGb3JaaXBDb2RlIik7Ci0gICAgb3BlcmF0aW9uLnNldElucHV0KGlucHV0KTsKLSAgICBvcGVyYXRpb24uc2V0T3V0cHV0KG91dHB1dCk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgUG9ydFR5cGUKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0VHlwZSgpOwotICAgIHBvcnRUeXBlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCJHZXRUZW1wYXJhdHVyZUluZm9TT0FQIikpOwotICAgIHBvcnRUeXBlLmFkZE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIGRlZmluaXRpb24uYWRkUG9ydFR5cGUocG9ydFR5cGUpOwotCQotCS8vCi0JLy8gQ3JlYXRlIHRoZSBzZWNvbmQgc2V0IG9wIE9wZXJhdGlvbnMKLQkvLwotCQotICAgIC8vIENyZWF0ZSBhIFBhcnQKLSAgICBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICBwYXJ0LnNldE5hbWUoIlBhcnQyIik7Ci0gICAgcGFydC5zZXRUeXBlTmFtZShuZXcgUU5hbWUoV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwic3RyaW5nIikpOwotICAgIAotICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2UKLSAgICBNZXNzYWdlIGlucHV0TWVzc2FnZTIgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIGlucHV0TWVzc2FnZTIuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksICJJbnB1dE1lc3NhZ2UyIikpOwotICAgIGlucHV0TWVzc2FnZTIuYWRkUGFydChwYXJ0KTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2UoaW5wdXRNZXNzYWdlMik7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgUGFydAotICAgIHBhcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGFydCgpOwotICAgIHBhcnQuc2V0TmFtZSgiUGFydDMiKTsKLSAgICBwYXJ0LnNldFR5cGVOYW1lKG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCJmbG9hdCIpKTsKLQotICAgIC8vIENyZWF0ZSBhIE1lc3NhZ2UgLSBHZXRUZW1wZXJhdHVyZU91dHB1dAotICAgIE1lc3NhZ2Ugb3V0cHV0TWVzc2FnZTIgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIG91dHB1dE1lc3NhZ2UyLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCAiT3V0cHV0TWVzc2FnZTIiKSk7Ci0gICAgb3V0cHV0TWVzc2FnZTIuYWRkUGFydChwYXJ0KTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2Uob3V0cHV0TWVzc2FnZTIpOwkKLQkKLSAgICAvLyBDcmVhdGUgYW4gSW5wdXQKLSAgICBJbnB1dCBpbnB1dDIgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5wdXQoKTsKLSAgICBpbnB1dDIuc2V0TWVzc2FnZShpbnB1dE1lc3NhZ2UyKTsKLQotICAgIC8vIENyZWF0ZSBhbiBPdXRwdXQgLSBHZXRUZW1wZXJhdHVyZU91dHB1dAotICAgIE91dHB1dCBvdXRwdXQyID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dHB1dCgpOwotICAgIG91dHB1dDIuc2V0TWVzc2FnZShvdXRwdXRNZXNzYWdlMik7Ci0gICAKLSAgICAvLyBDcmVhdGUgYW4gT3BlcmF0aW9uIC0gR2V0VGVtcGVyYXR1cmVGb3JaaXBDb2RlCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbjIgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgb3BlcmF0aW9uMi5zZXROYW1lKCJPcGVyYXRpb24yIik7Ci0gICAgb3BlcmF0aW9uMi5zZXRJbnB1dChpbnB1dDIpOwotICAgIG9wZXJhdGlvbjIuc2V0T3V0cHV0KG91dHB1dDIpOwkKLQkKLQlwb3J0VHlwZS5hZGRPcGVyYXRpb24ob3BlcmF0aW9uMik7Ci0gICAgIAotCXJlbmFtZU9wZXJhdGlvbihvcGVyYXRpb24pOwotCXJlbmFtZU9wZXJhdGlvbihvcGVyYXRpb24yKTsKLQkKLSAgICByZXNvdXJjZS5zYXZlKG51bGwpOwotIAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9TZW1hbnRpY1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9TZW1hbnRpY1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhNzM1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvU2VtYW50aWNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LndzZGwuT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgY2xhc3MgU2VtYW50aWNUZXN0IGV4dGVuZHMgRGVmaW5pdGlvblZpc2l0b3IKLXsKLSAgCi0gIC8vcHJpdmF0ZSBTdHJpbmcgd3NkbE5hbWVzcGFjZVByZWZpeDsKLSAgLy9wcml2YXRlIFN0cmluZyB4c2ROYW1lc3BhY2VQcmVmaXg7Ci0gIAotICB7Ci0gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHBsdWdpbi54bWwKLSAgICAvLwotICAgIC8vICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5lbWYuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgLy8gICAgIDxwYXJzZXIgdHlwZT0id3NkbCIgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIvPgotICAgIC8vICAgPC9leHRlbnNpb24+Ci0gICAgLy8KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFNlbWFudGljVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAqLwotICBwdWJsaWMgU2VtYW50aWNUZXN0KERlZmluaXRpb24gZGVmaW5pdGlvbikKLSAgewotICAgIHN1cGVyKGRlZmluaXRpb24pOwotICB9Ci0vKiAgCi0gIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBTb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwieWVzIik7Ci0gICAgdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywiVVRGLTgiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgie2h0dHA6Ly94bWwuYXBhY2hlLm9yZy94c2x0fWluZGVudC1hbW91bnQiLCI0Iik7Ci0gICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKGRvbVNvdXJjZSxuZXcgU3RyZWFtUmVzdWx0KG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSkpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY3JlYXRlRG9jdW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBjcmVhdGVXU0RMRWxlbWVudChTdHJpbmcgbmFtZSkKLSAgewotICAgIEVsZW1lbnQgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbCIsbmFtZSk7Ci0gICAgaWYgKHdzZGxOYW1lc3BhY2VQcmVmaXggIT0gbnVsbCkKLSAgICAgIGVsZW1lbnQuc2V0UHJlZml4KHdzZGxOYW1lc3BhY2VQcmVmaXgpOwotICAgIAotICAgIHJldHVybiBlbGVtZW50OwotICB9Ci0gKi8gCi0gIHByaXZhdGUgdm9pZCB2aXNpdERvY3VtZW50YXRpb24oRWxlbWVudCBkb2NFbGVtZW50KQotICB7Ci0gICAgaWYgKGRvY0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBwcmludGxuKCJkb2N1bWVudGF0aW9uOiAiICsgZG9jRWxlbWVudCk7IC8vIFRCRCAtIHNlcmlhbGl6ZSBkb2NFbGVtZW50Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBwcmludGxuKFN0cmluZyBzKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKHMpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBkZWZpbml0aW9ucy4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihkZWYuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgUU5hbWUgcW5hbWUgPSBkZWYuZ2V0UU5hbWUoKTsKLSAgICBpZiAocW5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBxbmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgCi0gICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpCi0gICAgICBwcmludGxuKCJ0YXJnZXROYW1lc3BhY2U6ICIgKyB0YXJnZXROYW1lc3BhY2UpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldE5hbWVzcGFjZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIHByaW50bG4oIm5hbWVzcGFjZSBwcmVmaXg6ICIgKyBwcmVmaXggKyAiLCBuYW1lc3BhY2UgVVJJOiAiICsgbmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBkZWZpbml0aW9ucy4uLiIpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEltcG9ydChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGltcG9ydC4uLiIpOwotICAgIC8vIERldGVybWluZSBpZiB3ZSA8aW1wb3J0PiBhIHNjaGVtYS4KLSAgICBpZiAoaW1wb3J0aW5nU2NoZW1hKHdzZGxJbXBvcnQpKQotICAgIHsKLSAgICAgIHByaW50bG4oIjxpbXBvcnQ+aW5nIFhNTCBTY2hlbWEiKTsKLSAgICAgIAotICAgICAgLy8gIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbSIgc2NoZW1hTG9jYXRpb249ICJiYXIueHNkIi8+Ci0gICAgICBwcmludGxuKCJuYW1lc3BhY2U6ICIgKyB3c2RsSW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICAgIHByaW50bG4oInNjaGVtYUxvY2F0aW9uOiAiICsgd3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgIHZpc2l0RG9jdW1lbnRhdGlvbih3c2RsSW1wb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAgIAotICAgIH0KLSAgCWVsc2UKLSAgICB7Ci0gICAgICBwcmludGxuKCI8aW1wb3J0PmluZyBXU0RMIik7Ci0gICAgICB2aXNpdERvY3VtZW50YXRpb24od3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICB9Ci0gICAgcHJpbnRsbigiTGVhdmluZyBpbXBvcnQuLi4iKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGltcG9ydGluZ1NjaGVtYShJbXBvcnQgbXlJbXBvcnQpCi0gIHsKLSAgICBpZiAobXlJbXBvcnQuZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpIC8vIGl0IGlzIFdTREwgaW1wb3J0Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFR5cGVzKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcykKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIHR5cGVzLi4uIik7Ci0KLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHR5cGVzLmdldFNjaGVtYXMoKS5pdGVyYXRvcigpOwotICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgc2NoZW1hID0gKFhTRFNjaGVtYSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBwcmludGxuKCJpbi1saW5lIHNjaGVtYTogIiArIHNjaGVtYSk7Ci0gICAgfSAgIAotICAgIHByaW50bG4oIkxlYXZpbmcgdHlwZXMuLi4iKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0UGFydChvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQYXJ0KFBhcnQgcGFydCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIHBhcnQuLi4iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBwb3J0VHlwZS4uLiIpOwotICAJdmlzaXREb2N1bWVudGF0aW9uKHBvcnRUeXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAJCi0gICAgUU5hbWUgcW5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAKLSAgICBzdXBlci52aXNpdFBvcnRUeXBlKHBvcnRUeXBlKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIHBvcnRUeXBlLi4uIik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBvcGVyYXRpb24uLi4iKTsKLSAgICB2aXNpdERvY3VtZW50YXRpb24ob3BlcmF0aW9uLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotCQotICAgIFN0cmluZyBuYW1lID0gb3BlcmF0aW9uLmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG5hbWUpOwotCi0gICAgT3BlcmF0aW9uVHlwZSBvcFR5cGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIGRldGVybWluaW5nIE9wZXJhdGlvbiBUeXBlIixvcFR5cGUpOwotICAgIAotICAgIGlmIChPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZTogIiArICJpbi1vdXQiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLlNPTElDSVRfUkVTUE9OU0UgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAib3V0LWluIik7Ci0gICAgZWxzZSBpZiAoT3BlcmF0aW9uVHlwZS5OT1RJRklDQVRJT04gPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAib3V0LW9ubHkiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLk9ORV9XQVkgPT0gb3BUeXBlKQotICAgICAgcHJpbnRsbigib3AgdHlwZSIgKyAiaW4tb25seSIpOwotICAgIAotICAgIHN1cGVyLnZpc2l0T3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBvcGVyYXRpb24uLi4iKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRJbnB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBwcmludGxuKCJWaXNpdGluZyBpbnB1dC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgbmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLSAgICBpZiAobmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG5hbWUpOwotICAgIAotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGlucHV0LmdldEVNZXNzYWdlKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZXNvbHZlIHRoZSBtZXNzYWdlIixtZXNzYWdlKTsKLSAgICAKLSAgICBwcmludGxuKCJMZWF2aW5nIGlucHV0Li4uIik7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBnZXRQYXJ0RWxlbWVudChNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VSZWYuZ2V0RU1lc3NhZ2UoKS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIC8vIFRCRCAtIGZvciBub3csIHRha2UgdGhlIGZpcnN0IHBhcnQuCi0gICAgUGFydCBwYXJ0ID0gKFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgIEVsZW1lbnQgcGFydEVsZW1lbnQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICByZXR1cm4gcGFydEVsZW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdE91dHB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgb3V0cHV0Li4uIik7Ci0gICAgdmlzaXREb2N1bWVudGF0aW9uKG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgbmFtZSA9IG91dHB1dC5nZXROYW1lKCk7Ci0gICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBuYW1lKTsKLSAgICAKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBvdXRwdXQuZ2V0RU1lc3NhZ2UoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlc29sdmUgdGhlIG1lc3NhZ2UiLG1lc3NhZ2UpOwotICAgIAotICAgIHByaW50bG4oIkxlYXZpbmcgb3V0cHV0Li4uIik7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEZhdWx0KG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGZhdWx0Li4uIik7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBmYXVsdC4uLiIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRCaW5kaW5nKG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmcpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZy4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFFOYW1lIHFuYW1lID0gYmluZGluZy5nZXRRTmFtZSgpOwotICAgIGlmIChxbmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIHFuYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICAKLSAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IGJpbmRpbmcuZ2V0RVBvcnRUeXBlKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkZhaWxlZCB0byByZXNvbHZlIHRoZSBwb3J0VHlwZSIscG9ydFR5cGUpOwotCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nKGJpbmRpbmcpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKCI8c29hcEJvZHk+IGlzIG1pc3NpbmciLHNvYXBCb2R5VmlzaXRlZCk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoIjxzb2FwQmluZGluZz4gaXMgbWlzc2luZyIsc29hcEJpbmRpbmdWaXNpdGVkKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPHNvYXBPcGVyYXRpb24+IGlzIG1pc3NpbmciLHNvYXBPcGVyYXRpb25WaXNpdGVkKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGJpbmRpbmcgb3BlcmF0aW9uLi4uIik7Ci0gICAgdmlzaXREb2N1bWVudGF0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgT3BlcmF0aW9uIG9wZXJhdGlvbiA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVzb2x2ZSB0aGUgb3BlcmF0aW9uIixvcGVyYXRpb24pOwotICAgIAotICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IG9wZXJhdGlvbi5nZXROYW1lKCk7Ci0gICAgICBwcmludGxuKCJuYW1lOiAiICsgb3BlcmF0aW9uTmFtZSk7Ci0gICAgfQotIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ09wZXJhdGlvbihiaW5kaW5nT3BlcmF0aW9uKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgb3BlcmF0aW9uLi4uIik7Ci0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBpbnB1dC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBTdHJpbmcgaW5wdXROYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotICAgIGlmIChpbnB1dE5hbWUgIT0gbnVsbCkKLSAgICAgIHByaW50bG4oIm5hbWU6ICIgKyBpbnB1dE5hbWUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgaW5wdXQuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBvdXRwdXQuLi4iKTsKLSAgICB2aXNpdERvY3VtZW50YXRpb24ob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFN0cmluZyBvdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICBpZiAob3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgcHJpbnRsbigibmFtZTogIiArIG91dHB1dE5hbWUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgYmluZGluZyBvdXRwdXQuLi4iKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgYmluZGluZyBmYXVsdC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBFbGVtZW50IGZhdWx0RWxlbWVudCA9IGZhdWx0LmdldEVsZW1lbnQoKTsKLSAgICBTdHJpbmcgZmF1bHROYW1lID0gZmF1bHQuZ2V0TmFtZSgpOwotICAgIGlmIChmYXVsdE5hbWUgIT0gbnVsbCkKLSAgICAgIGZhdWx0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGZhdWx0TmFtZSk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nRmF1bHQoZmF1bHQpOyAKLSAgICBwcmludGxuKCJMZWF2aW5nIGJpbmRpbmcgZmF1bHQuLi4iKTsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgc2VydmljZS4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihzZXJ2aWNlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFFOYW1lIHFuYW1lID0gc2VydmljZS5nZXRRTmFtZSgpOwotICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJWYWxpZGF0aW9uIEVycm9yOiBzZXJ2aWNlIGlzIG1pc3NpbmcgdGhlIG5hbWUgYXR0cmlidXRlIixxbmFtZSk7Ci0gICAgaWYgKHFuYW1lICE9IG51bGwpCi0gICAgICBwcmludGxuKCJuYW1lOiAiICsgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIAotICAgIHN1cGVyLnZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIHNlcnZpY2UuLi4iKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRQb3J0KG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgcG9ydC4uLiIpOwotICAgIHZpc2l0RG9jdW1lbnRhdGlvbihwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIFN0cmluZyBuYW1lID0gcG9ydC5nZXROYW1lKCk7Ci0gICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIlZhbGlkYXRpb24gRXJyb3I6IHBvcnQgaXMgbWlzc2luZyB0aGUgbmFtZSBhdHRyaWJ1dGUiLHBvcnQpOwotICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICBwcmludGxuKCJuYW1lOiAiICsgcG9ydC5nZXROYW1lKCkpOwotICAgIAotICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLSAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiRmFpbGVkIHRvIHJlc29sdmUgdGhlIGJpbmRpbmciLGJpbmRpbmcpOwotICAgIAotICAgIHN1cGVyLnZpc2l0UG9ydChwb3J0KTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiPHNvYXBBZGRyZXNzPiBpcyBtaXNzaW5nIixzb2FwQWRkcmVzc1Zpc2l0ZWQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgcG9ydC4uLiIpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudCwgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIHByaW50bG4oIlZpc2l0aW5nIGV4dGVuc2liaWxpdHkgZWxlbWVudC4uLiIpOwotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgdmlzaXRTT0FQQm9keSgoU09BUEJvZHkpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICB2aXNpdFNPQVBCaW5kaW5nKChTT0FQQmluZGluZylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgIHZpc2l0U09BUEFkZHJlc3MoKFNPQVBBZGRyZXNzKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB2aXNpdFNPQVBPcGVyYXRpb24oKFNPQVBPcGVyYXRpb24pZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIHByaW50bG4oIkxlYXZpbmcgZXh0ZW5zaWJpbGl0eSBlbGVtZW50Li4uIik7Ci0gIH0KLSAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcE9wZXJhdGlvblZpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUE9wZXJhdGlvbihTT0FQT3BlcmF0aW9uIHNvYXBPcGVyYXRpb24pCi0gIHsKLSAgICBzb2FwT3BlcmF0aW9uVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUE9wZXJhdGlvbi4uLiIpOwotICAgIHByaW50bG4oInNvYXBBY3Rpb246ICIgKyBzb2FwT3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQT3BlcmF0aW9uLi4uIik7Ci0gIH0KLSAgCi0gIC8vTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBCb2R5VmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQm9keShTT0FQQm9keSBzb2FwQm9keSkKLSAgewotICAgIHNvYXBCb2R5VmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEJvZHkuLi4iKTsKLSAgICBwcmludGxuKCJ1c2U6ICIgKyBzb2FwQm9keS5nZXRVc2UoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQm9keS4uLiIpOwotICB9Ci0gIAotICAvL05lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQmluZGluZ1Zpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEJpbmRpbmcoU09BUEJpbmRpbmcgc29hcEJpbmRpbmcpCi0gIHsKLSAgICBzb2FwQmluZGluZ1Zpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBCaW5kaW5nLi4uIik7Ci0gICAgcHJpbnRsbigic3R5bGU6ICIgKyBzb2FwQmluZGluZy5nZXRTdHlsZSgpKTsKLSAgICBwcmludGxuKCJ0cmFuc3BvcnQ6ICIgKyBzb2FwQmluZGluZy5nZXRUcmFuc3BvcnRVUkkoKSk7Ci0gICAgcHJpbnRsbigiTGVhdmluZyBTT0FQQmluZGluZy4uLiIpOyAgCi0gIH0KLSAKLSAgLy8gTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBBZGRyZXNzVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcykKLSAgewotICAgIHNvYXBBZGRyZXNzVmlzaXRlZCA9IHRydWU7Ci0gICAgcHJpbnRsbigiVmlzaXRpbmcgU09BUEFkZHJlc3MuLi4iKTsKLSAgICBwcmludGxuKCJsb2NhdGlvbjogIiArIHNvYXBBZGRyZXNzLmdldExvY2F0aW9uVVJJKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUEFkZHJlc3MuLi4iKTsgCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgU2VtYW50aWNUZXN0KCJNb2RlbFNlbWFudGljVGVzdCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TW9kZWxTZW1hbnRpYygpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFNlbWFudGljKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIix0cnVlKTsKLSAgICAgIFNlbWFudGljVGVzdCB0ZXN0ID0gbmV3IFNlbWFudGljVGVzdChkZWYpOwotICAgICAgdGVzdC52aXNpdCgpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoZS50b1N0cmluZygpKTsKLSAgICB9ICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvVXRpbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9VdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjIyNzU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9VdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEhlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCSAgcHVibGljIFV0aWxUZXN0KFN0cmluZyBuYW1lKSAKLQkgIHsKLQkgICAgc3VwZXIobmFtZSk7Ci0JICB9Ci0JCi0JICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSAKLQkgIHsKLQkgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotCSAgfQotCi0JICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLQkgIHsKLQkgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCSAgICAKLQkgICAgc3VpdGUuYWRkVGVzdAotCSAgICAgIChuZXcgVXRpbFRlc3QoIldTRExDb25zdGFudHMiKSAKLQkgICAgICAgICB7Ci0JICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0JICAgICAgICAgICB7Ci0JCQkJIHRlc3RDb25zdGFudHMoKTsKLQkgICAgICAgICAgIH0KLQkgICAgICAgICB9Ci0JICAgICAgICk7Ci0JICAgIAotCSAgICBzdWl0ZS5hZGRUZXN0Ci0JICAgICAgKG5ldyBVdGlsVGVzdCgiV1NETFJlc291cmNlRmFjdG9yeUltcGwiKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgdGVzdFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCk7Ci0JICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICApOwotCQkKLQkgICAgc3VpdGUuYWRkVGVzdAotCSAgICAgIChuZXcgVXRpbFRlc3QoIldTRExSZXNvdXJjZUltcGwiKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgdGVzdFdTRExSZXNvdXJjZUltcGwoKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgfQotCSAgICAgICk7Ci0JICAgIHN1aXRlLmFkZFRlc3QKLQkgICAgICAobmV3IFV0aWxUZXN0KCJFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkiKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotCSAgICAgICAgICB7Ci0JICAgICAgICAgICAgdGVzdEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSgpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgKTsKLQkgICAgc3VpdGUuYWRkVGVzdAotCSAgICAgIChuZXcgVXRpbFRlc3QoIkV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeVJlZ2lzdHJ5IikgCi0JICAgICAgICB7Ci0JICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLQkgICAgICAgICAgewotCSAgICAgICAgICAgIHRlc3RFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpOwotCSAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgKTsKLQkJCi0KLQkJCi0JICAgIHJldHVybiBzdWl0ZTsKLQkgIH0KLQkgIAotCSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotCSAgewotCSAgICBzdXBlci5zZXRVcCgpOwotCSAgICAKLQkgICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLQkgICAgCi0JICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotCSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0JICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7IAotCSAgfQotCi0JICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gCi0JICB7Ci0JICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0JICB9ICAKLQkgIAotCSAgc3RhdGljIHByaXZhdGUgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLQkgIAotCSAgcHVibGljIHZvaWQgdGVzdENvbnN0YW50cygpCi0JICB7Ci0gICAgICAgIHRyeQotCQl7Ci0JCSAgV1NETENvbnN0YW50cyB3c2RsQ29uc3RhbnRzID0gbmV3IFdTRExDb25zdGFudHMoKTsKLQkJICBpbnQgdHlwZSA9IFdTRExDb25zdGFudHMubm9kZVR5cGUoV1NETENvbnN0YW50cy5QT1JUX0VMRU1FTlRfVEFHKTsKLQkJICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTm9kZSB0eXBlIGlzIG5vdCB0aGF0IG9mIHBvcnQiLCB0eXBlID09IDEwKTsKLQkJICAKLQkgICAgICBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIik7Ci0JICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGVmaW5pdGlvbi5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpOwotCi0JCSAgaW50IGRlZmluaXRpb25Ob2RlVHlwZSA9IFdTRExDb25zdGFudHMubm9kZVR5cGUoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCkpOwotCQkgIEFzc2VydC5hc3NlcnRUcnVlKCJOb2RlIHR5cGUgaXMgbm90IHRoYXQgb2YgZGVmaW5pdGlvbiIsIGRlZmluaXRpb25Ob2RlVHlwZSA9PSAxKTsKLQkJICAKLQkJICBib29sZWFuIGlzV1NETE5hbWVzcGFjZSA9IFdTRExDb25zdGFudHMuaXNXU0RMTmFtZXNwYWNlKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQkgIEFzc2VydC5hc3NlcnRGYWxzZSgiVGhpcyBzaG91bGQgbm90IGJlIHRoZSBXU0RMIE5hbWVzcGFjZSIsIGlzV1NETE5hbWVzcGFjZSk7Ci0JCSAgCi0JCSAgYm9vbGVhbiBpc01hdGNoaW5nID0gV1NETENvbnN0YW50cy5pc01hdGNoaW5nTmFtZXNwYWNlKCJodHRwOi8vd3d3LmV4YW1wbGUub3JnIiwgImh0dHA6Ly93d3cuZXhhbXBsZS5vcmciKTsgIAotCQkgIEFzc2VydC5hc3NlcnRUcnVlKCJpc01hdGNoaW5nTmFtZXNwYWNlIGlzIGluY29ycmVjdCIsIGlzTWF0Y2hpbmcpOwotCQkgIAotCQkgIFN0cmluZyBhdHRyID0gV1NETENvbnN0YW50cy5nZXRBdHRyaWJ1dGUoZGVmaW5pdGlvbi5nZXRFbGVtZW50KCksICJuYW1lIik7Ci0JCSAgQXNzZXJ0LmFzc2VydFRydWUoImdldEF0dHJpYnV0ZSBpcyBpbmNvcnJlY3QiLCBhdHRyLmVxdWFscygiTG9hZEFuZFByaW50VGVzdCIpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgIHsKLQkgICAgICBBc3NlcnQuZmFpbCgiVGVzdCBmYWlsZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbjogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQotCSAgfQotICAKLQkgIHB1YmxpYyB2b2lkIHRlc3RXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JCSAgV1NETFJlc291cmNlRmFjdG9yeUltcGwgZmFjdG9yeUltcGwgPSBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKTsKLQkJICBSZXNvdXJjZSByZXNvdXJjZSA9IGZhY3RvcnlJbXBsLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKCIuL3NhbXBsZXMvY3JlYXRlUmVzb3VyY2VUZXN0LndzZGwiKSk7Ci0gICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlJlc291cmNlIGlzIG5vdCBvZiB0eXBlIFdTRExSZXNvdXJjZUltcGwiLCByZXNvdXJjZSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpOwotCSAgICB9Ci0JICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkgICAgewotCSAgICAgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCSAgICB9ICAgCi0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHRlc3RXU0RMUmVzb3VyY2VJbXBsKCkKLQkgIHsKLQkgICAgdHJ5Ci0JCXsKLQkJICBXU0RMUmVzb3VyY2VJbXBsIHJlc291cmNlSW1wbCA9IG5ldyBXU0RMUmVzb3VyY2VJbXBsKFVSSS5jcmVhdGVGaWxlVVJJKCIuL3NhbXBsZXMvY3JlYXRlUmVzb3VyY2VUZXN0LndzZGwiKSk7Ci0gICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlJlc291cmNlIGlzIG5vdCBvZiB0eXBlIFdTRExSZXNvdXJjZUltcGwiLCByZXNvdXJjZUltcGwgaW5zdGFuY2VvZiBXU0RMUmVzb3VyY2VJbXBsKTsKLQkJICAKLQkgICAgICBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIik7Ci0JICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGVmaW5pdGlvbi5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpOwotCQkgIEVsZW1lbnQgZWxlbWVudCA9IGRlZmluaXRpb24uZ2V0RWxlbWVudCgpOwotCQkgIERvY3VtZW50IGRvY3VtZW50ID0gZGVmaW5pdGlvbi5nZXREb2N1bWVudCgpOwotCi0JICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkgICAgICB7Ci0JICAgICAgICByZXNvdXJjZUltcGwuc2VyaWFsaXplKFN5c3RlbS5vdXQsIGVsZW1lbnQsIG51bGwpOwotCSAgICAgIH0KLQkJICAKLQkJICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJICB7Ci0JCQlyZXNvdXJjZUltcGwuc2VyaWFsaXplKFN5c3RlbS5vdXQsIGRvY3VtZW50LCBudWxsKTsKLQkJICB9Ci0JCSAgCi0JCSAgdHJ5Ci0JCSAgewotCQkgICAgcmVzb3VyY2VJbXBsLmF0dGFjaGVkKGRlZmluaXRpb24pOwotCQkgIH0KLQkJICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCSAgewotCi0JCSAgfQotCSAgCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCSAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gICAKLQkgIH0KLQkgIAotCSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSgpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7Ci0JCSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5KFNPQVBDb25zdGFudHMuU09BUF9OQU1FU1BBQ0VfVVJJKTsKLQkJICAgIGlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCSAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gZmFjdG9yeS5jcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTT0FQQ29uc3RhbnRzLlNPQVBfTkFNRVNQQUNFX1VSSSwgU09BUENvbnN0YW50cy5IRUFERVJfRUxFTUVOVF9UQUcpOwotICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvYmxlbSBjcmVhdGluZyBTT0FQIGV4dGVuc2liaWxpdHkgZWxlbWVudCIsIGVlIGluc3RhbmNlb2YgU09BUEhlYWRlcik7Ci0JCQl9Ci0JICAgIH0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCSAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gICAKLQkgIH0KLQkgIAotCSAgY2xhc3MgVGVzdEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuZHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnRJbXBsIGltcGxlbWVudHMgRXh0ZW5zaWJpbGl0eUVsZW1lbnQKLQkgIHsKLQkJU3RyaW5nIG5zLCBuYW1lOwotCQkKLQkJcHVibGljIFRlc3RFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbnMsIFN0cmluZyBuYW1lKQotCQl7Ci0JCSAgc3VwZXIoKTsKLQkJICB0aGlzLm5zID0gbnM7Ci0JCSAgdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBRTmFtZSBnZXRFbGVtZW50VHlwZSgpCi0JCXsKLQkJICBpZiAoZWxlbWVudFR5cGUgPT0gbnVsbCkKLQkJICB7Ci0JCQllbGVtZW50VHlwZSA9IG5ldyBRTmFtZShucywgbmFtZSk7Ci0JCSAgfQotCSAgICAgIHJldHVybiBlbGVtZW50VHlwZTsKLQkJfQotCSAgfQotCSAgCi0JICBjbGFzcyBXU0RMVGVzdEZhY3RvcnkgaW1wbGVtZW50cyBFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnkKLQkgIHsKLQkJcHVibGljIFdTRExUZXN0RmFjdG9yeSgpCi0JCXsKLQkJfQotCQkJCSAgCi0JCXB1YmxpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBjcmVhdGVFeHRlbnNpYmlsaXR5RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKQotCQl7Ci0JCSAgcmV0dXJuIG5ldyBUZXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQobmFtZXNwYWNlLCBsb2NhbE5hbWUpOwotCQl9Ci0JICB9Ci0JICAKLQkgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpCi0JICB7Ci0JICAgIHRyeQotCSAgICB7CQotCQkgICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gV1NETFBsdWdpbi5JTlNUQU5DRS5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LnJlZ2lzdGVyRmFjdG9yeSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIiwgbmV3IFdTRExUZXN0RmFjdG9yeSgpKTsKLQkJCQotCQkJRXh0ZW5zaWJpbGl0eUVsZW1lbnRGYWN0b3J5IGZhY3RvcnkgPSBXU0RMUGx1Z2luLklOU1RBTkNFLmdldEV4dGVuc2liaWxpdHlFbGVtZW50RmFjdG9yeSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIik7Ci0JCQlFeHRlbnNpYmlsaXR5RWxlbWVudCBlZSA9IGZhY3RvcnkuY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIsICJUZXN0RWxlbWVudCIpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIjEuIFByb2JsZW0gY3JlYXRpbmcgY3VzdG9tIFRlc3QgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IiwgZWUgaW5zdGFuY2VvZiBUZXN0RXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIjIuIFByb2JsZW0gY3JlYXRpbmcgY3VzdG9tIFRlc3QgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IiwgZWUuZ2V0RWxlbWVudFR5cGUoKS5nZXRMb2NhbFBhcnQoKS5lcXVhbHMoIlRlc3RFbGVtZW50IikpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoIjMuIFByb2JsZW0gY3JlYXRpbmcgY3VzdG9tIFRlc3QgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IiwgZWUuZ2V0RWxlbWVudFR5cGUoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpKTsKLQkJCQotCSAgICB9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkgIEFzc2VydC5mYWlsKCJUZXN0IGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9ICAgCi0JICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMNEpBUElUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETDRKQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTNiMTlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMNEpBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5GYXVsdDsKLWltcG9ydCBqYXZheC53c2RsLkltcG9ydDsKLWltcG9ydCBqYXZheC53c2RsLklucHV0OwotaW1wb3J0IGphdmF4LndzZGwuTWVzc2FnZTsKLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk91dHB1dDsKLWltcG9ydCBqYXZheC53c2RsLlBhcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuVHlwZXM7Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5mYWN0b3J5LldTRExGYWN0b3J5OwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuV1NETDRKRGVmaW5pdGlvblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMNEpBUElUZXN0IGV4dGVuZHMgV1NETDRKRGVmaW5pdGlvblZpc2l0b3IKLXsKLSAgcHJpdmF0ZSBXU0RMRmFjdG9yeSBmYWN0b3J5ID0gV1NETFBsdWdpbi5JTlNUQU5DRS5jcmVhdGVXU0RMNEpGYWN0b3J5KCk7IAotICBwcml2YXRlIERlZmluaXRpb24gbmV3RGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBNZXNzYWdlIGN1cnJlbnRNZXNzYWdlOwotICBwcml2YXRlIFNlcnZpY2UgY3VycmVudFNlcnZpY2U7Ci0gIHByaXZhdGUgUG9ydFR5cGUgY3VycmVudFBvcnRUeXBlOwotICBwcml2YXRlIE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uOwotICBwcml2YXRlIEJpbmRpbmcgY3VycmVudEJpbmRpbmc7Ci0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBjdXJyZW50QmluZGluZ09wZXJhdGlvbjsKLSAgIAotICB7Ci0gICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIHBsdWdpbi54bWwKLSAgICAvLwotICAgIC8vICAgPGV4dGVuc2lvbiBwb2ludCA9ICJvcmcuZWNsaXBzZS5lbWYuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgLy8gICAgIDxwYXJzZXIgdHlwZT0id3NkbCIgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLndzZGwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCIvPgotICAgIC8vICAgPC9leHRlbnNpb24+Ci0gICAgLy8KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUGFja2FnZSBwa2cgPSBXU0RMUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIAotICAgIC8vIFdlIG5lZWQgdGhpcyBmb3IgWFNEIDxpbXBvcnQ+LgotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ4c2QiLCBuZXcgWFNEUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBYU0RQYWNrYWdlIHhzZHBrZyA9IFhTRFBhY2thZ2UuZUlOU1RBTkNFOwotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFdTREw0SkFQSVRlc3QoU3RyaW5nIG5hbWUpIAotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBAcGFyYW0gZGVmaW5pdGlvbgotICAgKi8KLSAgcHVibGljIFdTREw0SkFQSVRlc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIoZGVmaW5pdGlvbik7Ci0gIH0KLS8qICAKLSAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCJ5ZXMiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCJVVEYtOCIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsIjQiKTsKLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZG9tU291cmNlLG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZVdTRExFbGVtZW50KFN0cmluZyBuYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsIixuYW1lKTsKLSAgICBpZiAod3NkbE5hbWVzcGFjZVByZWZpeCAhPSBudWxsKQotICAgICAgZWxlbWVudC5zZXRQcmVmaXgod3NkbE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAqLyAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0RG9jdW1lbnRhdGlvbihFbGVtZW50IGRvY0VsZW1lbnQpCi0gIHsKLSAgICBpZiAoZG9jRWxlbWVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIC8vcHJpbnRsbigiZG9jdW1lbnRhdGlvbjogIiArIGRvY0VsZW1lbnQpOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgcHJpbnRsbihTdHJpbmcgcykKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREZWZpbml0aW9uKERlZmluaXRpb24gZGVmKQotICB7Ci0gICAgbmV3RGVmaW5pdGlvbiA9IGZhY3RvcnkubmV3RGVmaW5pdGlvbigpOwotICAgIG5ld0RlZmluaXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZGVmLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBuZXdEZWZpbml0aW9uLnNldFFOYW1lKGRlZi5nZXRRTmFtZSgpKTsgICAgCi0gICAgbmV3RGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICBuZXdEZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldE5hbWVzcGFjZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotCi0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBwcmVmaXggPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG5hbWVzcGFjZSA9IGRlZi5nZXROYW1lc3BhY2UocHJlZml4KTsKLSAgICAgIG5ld0RlZmluaXRpb24uYWRkTmFtZXNwYWNlKHByZWZpeCxuYW1lc3BhY2UpOwotICAgIH0KLSAgICAKLSAgICBzdXBlci52aXNpdERlZmluaXRpb24oZGVmKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRJbXBvcnQoSW1wb3J0IHdzZGxJbXBvcnQpCi0gIHsKLSAgICBJbXBvcnQgbXlJbXBvcnQgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZUltcG9ydCgpOwotICAgIG5ld0RlZmluaXRpb24uYWRkSW1wb3J0KG15SW1wb3J0KTsKLSAgICAKLSAgICAvLyBlLmcuIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbSIgc2NoZW1hTG9jYXRpb249ICJiYXIueHNkIi8+Ci0gICAgbXlJbXBvcnQuc2V0TmFtZXNwYWNlVVJJKHdzZGxJbXBvcnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIG15SW1wb3J0LnNldExvY2F0aW9uVVJJKHdzZGxJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgbXlJbXBvcnQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQod3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICAKLSAgICBteUltcG9ydC5zZXREZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFR5cGVzKFR5cGVzIHR5cGVzKQotICB7Ci0gICAgVHlwZXMgbXlUeXBlcyA9IG5ld0RlZmluaXRpb24uY3JlYXRlVHlwZXMoKTsKLSAgICBteVR5cGVzLnNldERvY3VtZW50YXRpb25FbGVtZW50KHR5cGVzLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdHlwZXMuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICAvKgotICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGVlID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGVlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIG15VHlwZXMuYWRkRXh0ZW5zaWJpbGl0eUVsZW1lbnQoZWUpOwotICAgIH0qLwotICAgIG5ld0RlZmluaXRpb24uc2V0VHlwZXMobXlUeXBlcyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KQotICB7Ci0gICAgUGFydCBteVBhcnQgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZVBhcnQoKTsKLSAgICBteVBhcnQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQocGFydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBteVBhcnQuc2V0TmFtZShwYXJ0LmdldE5hbWUoKSk7Ci0gICAgbXlQYXJ0LnNldEVsZW1lbnROYW1lKHBhcnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgbXlQYXJ0LnNldFR5cGVOYW1lKHBhcnQuZ2V0VHlwZU5hbWUoKSk7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIFFOYW1lIGtleSA9IG51bGw7Ci0gICAgUU5hbWUgdmFsdWUgPSBudWxsOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAga2V5ID0gKFFOYW1lKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZhbHVlID0gKFFOYW1lKXBhcnQuZ2V0RXh0ZW5zaW9uQXR0cmlidXRlKGtleSk7Ci0gICAgICBteVBhcnQuc2V0RXh0ZW5zaW9uQXR0cmlidXRlKGtleSx2YWx1ZSk7Ci0gICAgfQotICAgIGN1cnJlbnRNZXNzYWdlLmFkZFBhcnQobXlQYXJ0KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIGN1cnJlbnRNZXNzYWdlID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgc3VwZXIudmlzaXRNZXNzYWdlKG1lc3NhZ2UpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnRUeXBlKFBvcnRUeXBlIHBvcnRUeXBlKQotICB7Ci0gICAgY3VycmVudFBvcnRUeXBlID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVQb3J0VHlwZSgpOwotICAgIGN1cnJlbnRQb3J0VHlwZS5zZXREb2N1bWVudGF0aW9uRWxlbWVudChwb3J0VHlwZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBjdXJyZW50UG9ydFR5cGUuc2V0UU5hbWUocG9ydFR5cGUuZ2V0UU5hbWUoKSk7Ci0gICAgY3VycmVudFBvcnRUeXBlLnNldFVuZGVmaW5lZChwb3J0VHlwZS5pc1VuZGVmaW5lZCgpKTsKLSAgICBuZXdEZWZpbml0aW9uLmFkZFBvcnRUeXBlKGN1cnJlbnRQb3J0VHlwZSk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBjdXJyZW50T3BlcmF0aW9uID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVPcGVyYXRpb24oKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldERvY3VtZW50YXRpb25FbGVtZW50KG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldE5hbWUob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRTdHlsZShvcGVyYXRpb24uZ2V0U3R5bGUoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXRVbmRlZmluZWQob3BlcmF0aW9uLmlzVW5kZWZpbmVkKCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0UGFyYW1ldGVyT3JkZXJpbmcob3BlcmF0aW9uLmdldFBhcmFtZXRlck9yZGVyaW5nKCkpOwotICAgIGN1cnJlbnRQb3J0VHlwZS5hZGRPcGVyYXRpb24oY3VycmVudE9wZXJhdGlvbik7Ci0gICAKLSAgICBzdXBlci52aXNpdE9wZXJhdGlvbihvcGVyYXRpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KQotICB7Ci0gICAgSW5wdXQgbXlJbnB1dCA9IG5ld0RlZmluaXRpb24uY3JlYXRlSW5wdXQoKTsKLSAgICBteUlucHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGlucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBteUlucHV0LnNldE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLSAgICBteUlucHV0LnNldE1lc3NhZ2UoaW5wdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldElucHV0KG15SW5wdXQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCkKLSAgewotICAgIE91dHB1dCBteU91dHB1dCA9IG5ld0RlZmluaXRpb24uY3JlYXRlT3V0cHV0KCk7Ci0gICAgbXlPdXRwdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15T3V0cHV0LnNldE5hbWUob3V0cHV0LmdldE5hbWUoKSk7Ci0gICAgbXlPdXRwdXQuc2V0TWVzc2FnZShvdXRwdXQuZ2V0TWVzc2FnZSgpKTsKLSAgICBjdXJyZW50T3BlcmF0aW9uLnNldE91dHB1dChteU91dHB1dCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KQotICB7Ci0gICAgRmF1bHQgbXlGYXVsdCA9IG5ld0RlZmluaXRpb24uY3JlYXRlRmF1bHQoKTsKLSAgICBteUZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15RmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotICAgIG15RmF1bHQuc2V0TWVzc2FnZShmYXVsdC5nZXRNZXNzYWdlKCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uYWRkRmF1bHQobXlGYXVsdCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgY3VycmVudEJpbmRpbmcgPSBuZXdEZWZpbml0aW9uLmNyZWF0ZUJpbmRpbmcoKTsKLSAgICBuZXdEZWZpbml0aW9uLmFkZEJpbmRpbmcoY3VycmVudEJpbmRpbmcpOwotICAgIAotICAgIGN1cnJlbnRCaW5kaW5nLnNldERvY3VtZW50YXRpb25FbGVtZW50KGJpbmRpbmcuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgIAotICAgIGN1cnJlbnRCaW5kaW5nLnNldFFOYW1lKGJpbmRpbmcuZ2V0UU5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmcuc2V0UG9ydFR5cGUoYmluZGluZy5nZXRQb3J0VHlwZSgpKTsKLSAgICBjdXJyZW50QmluZGluZy5zZXRVbmRlZmluZWQoYmluZGluZy5pc1VuZGVmaW5lZCgpKTsKLQotICAgIHN1cGVyLnZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoYmluZGluZ09wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbi5nZXRPcGVyYXRpb24oKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0TmFtZShiaW5kaW5nT3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmcuYWRkQmluZGluZ09wZXJhdGlvbihjdXJyZW50QmluZGluZ09wZXJhdGlvbik7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBpbnB1dCkKLSAgewotICAgIEJpbmRpbmdJbnB1dCBteUlucHV0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nSW5wdXQoKTsKLSAgICBteUlucHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGlucHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBteUlucHV0LnNldE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQobXlJbnB1dCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nSW5wdXQoaW5wdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdPdXRwdXQoQmluZGluZ091dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBCaW5kaW5nT3V0cHV0IG15T3V0cHV0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgbXlPdXRwdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQob3V0cHV0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15T3V0cHV0LnNldE5hbWUob3V0cHV0LmdldE5hbWUoKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0QmluZGluZ091dHB1dChteU91dHB1dCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3V0cHV0KG91dHB1dCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0ZhdWx0KEJpbmRpbmdGYXVsdCBmYXVsdCkKLSAgewotICAgIEJpbmRpbmdGYXVsdCBteUZhdWx0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVCaW5kaW5nRmF1bHQoKTsKLSAgICBteUZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15RmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmFkZEJpbmRpbmdGYXVsdChteUZhdWx0KTsKLSAgICAKLSAgICBzdXBlci52aXNpdEJpbmRpbmdGYXVsdChmYXVsdCk7IAotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0U2VydmljZShTZXJ2aWNlIHNlcnZpY2UpCi0gIHsKLSAgICBjdXJyZW50U2VydmljZSA9IG5ld0RlZmluaXRpb24uY3JlYXRlU2VydmljZSgpOwotICAgIGN1cnJlbnRTZXJ2aWNlLnNldERvY3VtZW50YXRpb25FbGVtZW50KHNlcnZpY2UuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgCi0gICAgY3VycmVudFNlcnZpY2Uuc2V0UU5hbWUoc2VydmljZS5nZXRRTmFtZSgpKTsKLSAgICBuZXdEZWZpbml0aW9uLmFkZFNlcnZpY2UoY3VycmVudFNlcnZpY2UpOwotICAgIAotICAgIHN1cGVyLnZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIFBvcnQgbXlQb3J0ID0gbmV3RGVmaW5pdGlvbi5jcmVhdGVQb3J0KCk7Ci0gICAgbXlQb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgbXlQb3J0LnNldE5hbWUocG9ydC5nZXROYW1lKCkpOwotICAgIG15UG9ydC5zZXRCaW5kaW5nKHBvcnQuZ2V0QmluZGluZygpKTsKLSAgICBjdXJyZW50U2VydmljZS5hZGRQb3J0KG15UG9ydCk7Ci0gICAgCi0gICAgc3VwZXIudmlzaXRQb3J0KHBvcnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCb2R5KQotICAgICAgdmlzaXRTT0FQQm9keSgoU09BUEJvZHkpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEJpbmRpbmcpCi0gICAgICB2aXNpdFNPQVBCaW5kaW5nKChTT0FQQmluZGluZylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykKLSAgICAgIHZpc2l0U09BUEFkZHJlc3MoKFNPQVBBZGRyZXNzKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBPcGVyYXRpb24pCi0gICAgICB2aXNpdFNPQVBPcGVyYXRpb24oKFNPQVBPcGVyYXRpb24pZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICB9Ci0gCi0gIC8vIE5lZWQgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBPcGVyYXRpb25WaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uKQotICB7Ci0gICAgc29hcE9wZXJhdGlvblZpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBPcGVyYXRpb24uLi4iKTsKLSAgICBwcmludGxuKCJzb2FwQWN0aW9uOiAiICsgc29hcE9wZXJhdGlvbi5nZXRTb2FwQWN0aW9uVVJJKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUE9wZXJhdGlvbi4uLiIpOwotICB9Ci0gIAotICAvL05lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQm9keVZpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEJvZHkoU09BUEJvZHkgc29hcEJvZHkpCi0gIHsKLSAgICBzb2FwQm9keVZpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBCb2R5Li4uIik7Ci0gICAgcHJpbnRsbigidXNlOiAiICsgc29hcEJvZHkuZ2V0VXNlKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUEJvZHkuLi4iKTsKLSAgfQotICAKLSAgLy9OZWVkcyB0byBpbXByb3ZlIHRoaXMgcGFydAotICBwcml2YXRlIGJvb2xlYW4gc29hcEJpbmRpbmdWaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBCaW5kaW5nKFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nKQotICB7Ci0gICAgc29hcEJpbmRpbmdWaXNpdGVkID0gdHJ1ZTsKLSAgICBwcmludGxuKCJWaXNpdGluZyBTT0FQQmluZGluZy4uLiIpOwotICAgIHByaW50bG4oInN0eWxlOiAiICsgc29hcEJpbmRpbmcuZ2V0U3R5bGUoKSk7Ci0gICAgcHJpbnRsbigidHJhbnNwb3J0OiAiICsgc29hcEJpbmRpbmcuZ2V0VHJhbnNwb3J0VVJJKCkpOwotICAgIHByaW50bG4oIkxlYXZpbmcgU09BUEJpbmRpbmcuLi4iKTsgIAotICB9Ci0gCi0gIC8vIE5lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQWRkcmVzc1Zpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEFkZHJlc3MoU09BUEFkZHJlc3Mgc29hcEFkZHJlc3MpCi0gIHsKLSAgICBzb2FwQWRkcmVzc1Zpc2l0ZWQgPSB0cnVlOwotICAgIHByaW50bG4oIlZpc2l0aW5nIFNPQVBBZGRyZXNzLi4uIik7Ci0gICAgcHJpbnRsbigibG9jYXRpb246ICIgKyBzb2FwQWRkcmVzcy5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICBwcmludGxuKCJMZWF2aW5nIFNPQVBBZGRyZXNzLi4uIik7IAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IFdTREw0SkFQSVRlc3QoIk1vZGVsU2VtYW50aWNUZXN0IikgCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSAKLSAgICAgICAgICAgewotICAgICAgICAgICAgIHRlc3RNb2RlbFNlbWFudGljKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICApOwotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1vZGVsU2VtYW50aWMoKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRGVmaW5pdGlvbiBkZWYgPSBsb2FkRGVmaW5pdGlvbkZvcldTREw0SigiLi9zYW1wbGVzL0xvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICAgICAgV1NETDRKQVBJVGVzdCB0ZXN0ID0gbmV3IFdTREw0SkFQSVRlc3QoZGVmKTsKLSAgICAgIHRlc3QudmlzaXQoKTsKLSAgICAgIHNlcmlhbGl6ZSh0ZXN0Lm5ld0RlZmluaXRpb24sIi4vc2FtcGxlcy9DbG9uZWRMb2FkQW5kUHJpbnRUZXN0LndzZGwiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBBc3NlcnQuZmFpbChlLnRvU3RyaW5nKCkpOwotICAgIH0gICAgCi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBzZXJpYWxpemUoRGVmaW5pdGlvbiBkZWYsIFN0cmluZyBjbG9uZWRGaWxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBXU0RMV3JpdGVyIHdyaXRlciA9IGZhY3RvcnkubmV3V1NETFdyaXRlcigpOwotICAgIElQbHVnaW5EZXNjcmlwdG9yIHBkID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpOwotICAgIFVSTCB1cmwgPSBwZC5nZXRJbnN0YWxsVVJMKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4odXJsLnRvU3RyaW5nKCkpOwotICAgIHVybCA9IG5ldyBVUkwodXJsLGNsb25lZEZpbGUpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHVybC50b1N0cmluZygpKTsKLSAgICAvL1N0cmluZyBzID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldEZpbGUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihQbGF0Zm9ybS5nZXRJbnN0YW5jZUxvY2F0aW9uKCkuZ2V0VVJMKCkudG9TdHJpbmcoKSk7Ci0gICAgLy9TdHJpbmcgcyA9IHVybC50b1N0cmluZygpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKHMpOwotICAgIC8vd3JpdGVyLndyaXRlV1NETChkZWYsbmV3IEZpbGVPdXRwdXRTdHJlYW0ocykpOwotICB9ICAKLSAgCi0gIHByaXZhdGUgRGVmaW5pdGlvbiBsb2FkRGVmaW5pdGlvbkZvcldTREw0SihTdHJpbmcgd3NkbEZpbGUpIHRocm93cyBFeGNlcHRpb24KLSAgeyAgICAKLSAgICBXU0RMUmVhZGVyIHJlYWRlciA9IGZhY3RvcnkubmV3V1NETFJlYWRlcigpOwotICAgIElQbHVnaW5EZXNjcmlwdG9yIHBkID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpOwotICAgIFVSTCB1cmwgPSBwZC5nZXRJbnN0YWxsVVJMKCk7Ci0gICAgdXJsID0gbmV3IFVSTCh1cmwsd3NkbEZpbGUpOwotICAgIFN0cmluZyBzID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldEZpbGUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigibG9hZGluZyAiICsgcyk7Ci0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gcmVhZGVyLnJlYWRXU0RMKHMsbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocykpKTsKLSAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETEVNRkFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMRU1GQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTMzMDIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9XU0RMRU1GQVBJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk1lc3NhZ2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJvZHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBIZWFkZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQSGVhZGVyRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25Mb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMRU1GQVBJVGVzdCBleHRlbmRzIERlZmluaXRpb25WaXNpdG9yCi17Ci0gIHByaXZhdGUgV1NETEZhY3RvcnkgZmFjdG9yeSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRTsKLSAgCi0gIERlZmluaXRpb24gbmV3RGVmaW5pdGlvbjsKLSAgcHJpdmF0ZSBNZXNzYWdlIGN1cnJlbnRNZXNzYWdlOwotICBwcml2YXRlIFNlcnZpY2UgY3VycmVudFNlcnZpY2U7Ci0gIHByaXZhdGUgUG9ydFR5cGUgY3VycmVudFBvcnRUeXBlOwotICBwcml2YXRlIE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uOwotICBwcml2YXRlIEJpbmRpbmcgY3VycmVudEJpbmRpbmc7Ci0gIHByaXZhdGUgQmluZGluZ09wZXJhdGlvbiBjdXJyZW50QmluZGluZ09wZXJhdGlvbjsKLSAgcHJpdmF0ZSBFeHRlbnNpYmxlRWxlbWVudCBjdXJyZW50RXh0ZW5zaWJsZUVsZW1lbnQ7Ci0gICAKLSAgewotICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBwbHVnaW4ueG1sCi0gICAgLy8KLSAgICAvLyAgIDxleHRlbnNpb24gcG9pbnQgPSAib3JnLmVjbGlwc2UuZW1mLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIC8vICAgICA8cGFyc2VyIHR5cGU9IndzZGwiIGNsYXNzPSJjb20uaWJtLmV0b29scy53c2RsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGwiLz4KLSAgICAvLyAgIDwvZXh0ZW5zaW9uPgotICAgIC8vCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOwotICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotICAKLSAgLy8gQWRkZWQgZm9yIEpVbml0Ci0gIHB1YmxpYyBXU0RMRU1GQVBJVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAqLwotICBwdWJsaWMgV1NETEVNRkFQSVRlc3QoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgc3VwZXIoZGVmaW5pdGlvbik7Ci0gIH0KLS8qICAKLSAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCJ5ZXMiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCJVVEYtOCIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsIjQiKTsKLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZG9tU291cmNlLG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZVdTRExFbGVtZW50KFN0cmluZyBuYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsIixuYW1lKTsKLSAgICBpZiAod3NkbE5hbWVzcGFjZVByZWZpeCAhPSBudWxsKQotICAgICAgZWxlbWVudC5zZXRQcmVmaXgod3NkbE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAqLyAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0RG9jdW1lbnRhdGlvbihFbGVtZW50IGRvY0VsZW1lbnQpCi0gIHsKLSAgICBpZiAoZG9jRWxlbWVudCA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIHByaW50bG4oImRvY3VtZW50YXRpb246ICIgKyBkb2NFbGVtZW50KTsgLy8gVEJEIC0gc2VyaWFsaXplIGRvY0VsZW1lbnQKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHByaW50bG4oU3RyaW5nIHMpCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4ocyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIC8vIFVzZSBXU0RMRWxlbWVudCB0byBpbmNyZWFzZSB0aGUgQVBJIGNvdmVyYWdlIGluIHRoZSByZXBvcnRzCi0gICAgV1NETEVsZW1lbnQgcm9vdCA9IGZhY3RvcnkuY3JlYXRlRGVmaW5pdGlvbigpOwotICAgIG5ld0RlZmluaXRpb24gPSAoRGVmaW5pdGlvbilyb290OwotICAgIAotICAgIHJvb3Quc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoZGVmLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIHJvb3QuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKTsKLSAgICByb290LnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgcm9vdC5nZXRFbmNsb3NpbmdEZWZpbml0aW9uKCk7Ci0gICAgcm9vdC5nZXRDb250YWluZXIoKTsKLSAgICAKLSAgICBuZXdEZWZpbml0aW9uLnNldFFOYW1lKGRlZi5nZXRRTmFtZSgpKTsgICAgCi0gICAgbmV3RGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UoZGVmLmdldFRhcmdldE5hbWVzcGFjZSgpKTsKLSAgICBuZXdEZWZpbml0aW9uLnNldERvY3VtZW50QmFzZVVSSShkZWYuZ2V0RG9jdW1lbnRCYXNlVVJJKCkpOwotICAgIG5ld0RlZmluaXRpb24uc2V0TG9jYXRpb24oZGVmLmdldExvY2F0aW9uKCkpOwotICAgIG5ld0RlZmluaXRpb24uc2V0RW5jb2RpbmcoZGVmLmdldEVuY29kaW5nKCkpOwotICAgIAotICAgIC8vIGdldEVOYW1lc3BhY2VzIGRvZXMgbm90IHdvcmsuCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWYuZ2V0RU5hbWVzcGFjZXMoKS5pdGVyYXRvcigpOwotICAgIE5hbWVzcGFjZSBucyA9IG51bGw7ICAgCi0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgU3RyaW5nIHVyaSA9IG51bGw7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBucyA9IGZhY3RvcnkuY3JlYXRlTmFtZXNwYWNlKCk7Ci0gICAgICBwcmVmaXggPSAoKE5hbWVzcGFjZSlpdGVyYXRvci5uZXh0KCkpLmdldFByZWZpeCgpOwotICAgICAgdXJpID0gKChOYW1lc3BhY2UpaXRlcmF0b3IubmV4dCgpKS5nZXRVUkkoKTsKLSAgICAgIG5zLnNldFVSSSh1cmkpOwotICAgICAgbnMuc2V0UHJlZml4KHByZWZpeCk7Ci0gICAgICBuZXdEZWZpbml0aW9uLmdldEVOYW1lc3BhY2VzKCkuYWRkKG5zKTsKLSAgICB9Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0TmFtZXNwYWNlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgcHJlZml4ID0gbnVsbDsKLSAgICBTdHJpbmcgbmFtZXNwYWNlID0gbnVsbDsKLQotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcHJlZml4ID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBuYW1lc3BhY2UgPSBkZWYuZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgICBuZXdEZWZpbml0aW9uLmFkZE5hbWVzcGFjZShwcmVmaXgsbmFtZXNwYWNlKTsKLSAgICB9Ci0gICAgLy9uZXdEZWZpbml0aW9uLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAKLSAgICBjdXJyZW50RXh0ZW5zaWJsZUVsZW1lbnQgPSBkZWY7Ci0gICAgc3VwZXIudmlzaXREZWZpbml0aW9uKGRlZik7Ci0gICAgCi0gICAgcm9vdC5zZXRFbGVtZW50KG51bGwpOwotICAgIHJvb3QudXBkYXRlRWxlbWVudCh0cnVlKTsKLSAgICByb290LmdldEVsZW1lbnQoKTsKLSAgICByb290LnNldEVsZW1lbnQobnVsbCk7Ci0gICAgcm9vdC51cGRhdGVFbGVtZW50KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB3c2RsSW1wb3J0KQotICB7Ci0gICAgSW1wb3J0IG15SW1wb3J0ID0gZmFjdG9yeS5jcmVhdGVJbXBvcnQoKTsKLSAgICBuZXdEZWZpbml0aW9uLmdldEVJbXBvcnRzKCkuYWRkKG15SW1wb3J0KTsKLSAgICAKLSAgICAvLyBlLmcuIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbSIgc2NoZW1hTG9jYXRpb249ICJiYXIueHNkIi8+Ci0gICAgbXlJbXBvcnQuc2V0TmFtZXNwYWNlVVJJKHdzZGxJbXBvcnQuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIG15SW1wb3J0LnNldExvY2F0aW9uVVJJKHdzZGxJbXBvcnQuZ2V0TG9jYXRpb25VUkkoKSk7Ci0gICAgbXlJbXBvcnQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQod3NkbEltcG9ydC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsKLSAgICBteUltcG9ydC5zZXRFRGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgICBteUltcG9ydC5zZXRFU2NoZW1hKHdzZGxJbXBvcnQuZ2V0RVNjaGVtYSgpKTsKLSAgICBteUltcG9ydC5zZXRTY2hlbWEod3NkbEltcG9ydC5nZXRTY2hlbWEoKSk7IC8vIFRCRCAtIHJldmlldwotICAgIG15SW1wb3J0LnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0VHlwZXMoVHlwZXMgdHlwZXMpCi0gIHsKLSAgICBUeXBlcyBteVR5cGVzID0gZmFjdG9yeS5jcmVhdGVUeXBlcygpOwotICAgIG15VHlwZXMuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQodHlwZXMuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSB0eXBlcy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBlZSA9IG51bGw7Ci0gICAgdHlwZXMuZ2V0U2NoZW1hcygiaHR0cDovL3RlbXB1cmkub3JnL0xvYWRBbmRQcmludFRlc3QvIik7Ci0gICAgCi0gICAgY3VycmVudEV4dGVuc2libGVFbGVtZW50ID0gbXlUeXBlczsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGVlID0gKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoZWUpOwotICAgIH0KLSAgICAKLSAgICBteVR5cGVzLnNldEVuY2xvc2luZ0RlZmluaXRpb24obmV3RGVmaW5pdGlvbik7Ci0gICAgbmV3RGVmaW5pdGlvbi5nZXRFVHlwZXMoKTsKLSAgICBuZXdEZWZpbml0aW9uLnNldEVUeXBlcyhteVR5cGVzKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UGFydChQYXJ0IHBhcnQpCi0gIHsKLSAgICBQYXJ0IG15UGFydCA9IGZhY3RvcnkuY3JlYXRlUGFydCgpOwotICAgIG15UGFydC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChwYXJ0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIG15UGFydC5zZXROYW1lKHBhcnQuZ2V0TmFtZSgpKTsKLSAgICBteVBhcnQuc2V0RWxlbWVudE5hbWUocGFydC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICBteVBhcnQuc2V0VHlwZU5hbWUocGFydC5nZXRUeXBlTmFtZSgpKTsKLSAgICBteVBhcnQuc2V0RU1lc3NhZ2UocGFydC5nZXRFTWVzc2FnZSgpKTsKLSAgICBteVBhcnQuc2V0RWxlbWVudERlY2xhcmF0aW9uKHBhcnQuZ2V0RWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIG15UGFydC5zZXRUeXBlRGVmaW5pdGlvbihwYXJ0LmdldFR5cGVEZWZpbml0aW9uKCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFydC5nZXRFeHRlbnNpb25BdHRyaWJ1dGVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBRTmFtZSBrZXkgPSBudWxsOwotICAgIFFOYW1lIHZhbHVlID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGtleSA9IChRTmFtZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2YWx1ZSA9IChRTmFtZSlwYXJ0LmdldEV4dGVuc2lvbkF0dHJpYnV0ZShrZXkpOwotICAgICAgbXlQYXJ0LnNldEV4dGVuc2lvbkF0dHJpYnV0ZShrZXksdmFsdWUpOwotICAgIH0KLSAgICBjdXJyZW50TWVzc2FnZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICAgIGN1cnJlbnRNZXNzYWdlLmFkZFBhcnQobXlQYXJ0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBjdXJyZW50UG9ydFR5cGUgPSBmYWN0b3J5LmNyZWF0ZVBvcnRUeXBlKCk7Ci0gICAgY3VycmVudFBvcnRUeXBlLnNldERvY3VtZW50YXRpb25FbGVtZW50KHBvcnRUeXBlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOwotICAgIGN1cnJlbnRQb3J0VHlwZS5zZXRRTmFtZShwb3J0VHlwZS5nZXRRTmFtZSgpKTsKLSAgICBjdXJyZW50UG9ydFR5cGUuc2V0VW5kZWZpbmVkKHBvcnRUeXBlLmlzVW5kZWZpbmVkKCkpOwotICAgIAotICAgIGN1cnJlbnRQb3J0VHlwZS5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICAgIG5ld0RlZmluaXRpb24uZ2V0RVBvcnRUeXBlcygpLmFkZChjdXJyZW50UG9ydFR5cGUpOwotICAgIAotICAgIHN1cGVyLnZpc2l0UG9ydFR5cGUocG9ydFR5cGUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgY3VycmVudE9wZXJhdGlvbiA9IGZhY3RvcnkuY3JlYXRlT3BlcmF0aW9uKCk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXREb2N1bWVudGF0aW9uRWxlbWVudChvcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgY3VycmVudE9wZXJhdGlvbi5zZXROYW1lKG9wZXJhdGlvbi5nZXROYW1lKCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0U3R5bGUob3BlcmF0aW9uLmdldFN0eWxlKCkpOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0VW5kZWZpbmVkKG9wZXJhdGlvbi5pc1VuZGVmaW5lZCgpKTsKLSAgICBvcGVyYXRpb24uZ2V0RVBhcmFtZXRlck9yZGVyaW5nKCk7IC8vIFRCRAotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0RW5jbG9zaW5nRGVmaW5pdGlvbihuZXdEZWZpbml0aW9uKTsKLSAgICBjdXJyZW50UG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5hZGQoY3VycmVudE9wZXJhdGlvbik7Ci0gICAKLSAgICBzdXBlci52aXNpdE9wZXJhdGlvbihvcGVyYXRpb24pOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJPcGVyYXRpb24gVHlwZSBpczogIiArIG9wZXJhdGlvbi5nZXRTdHlsZSgpKTsKLSAgICAvL29wZXJhdGlvbi5zZXRTdHlsZShPcGVyYXRpb25UeXBlLlJFUVVFU1RfUkVTUE9OU0UpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJPcGVyYXRpb24gVHlwZSBpczogIiArIG9wZXJhdGlvbi5nZXRTdHlsZSgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIGN1cnJlbnRNZXNzYWdlID0gZmFjdG9yeS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgY3VycmVudE1lc3NhZ2Uuc2V0UU5hbWUobWVzc2FnZS5nZXRRTmFtZSgpKTsKLSAgICBjdXJyZW50TWVzc2FnZS5zZXRVbmRlZmluZWQobWVzc2FnZS5pc1VuZGVmaW5lZCgpKTsKLSAgICBuZXdEZWZpbml0aW9uLmFkZE1lc3NhZ2UoY3VycmVudE1lc3NhZ2UpOwotCi0gICAgc3VwZXIudmlzaXRNZXNzYWdlKG1lc3NhZ2UpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KQotICB7Ci0gICAgTWVzc2FnZVJlZmVyZW5jZSBteUlucHV0ID0gZmFjdG9yeS5jcmVhdGVJbnB1dCgpOwotICAgIG15SW5wdXQuc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoaW5wdXQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7ICAgIAotICAgIG15SW5wdXQuc2V0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotICAgIG15SW5wdXQuZ2V0TmFtZSgpOwotICAgIG15SW5wdXQuc2V0RU1lc3NhZ2UoaW5wdXQuZ2V0RU1lc3NhZ2UoKSk7Ci0gICAgbXlJbnB1dC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0RUlucHV0KChJbnB1dClteUlucHV0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3V0cHV0KE91dHB1dCBvdXRwdXQpCi0gIHsKLSAgICBPdXRwdXQgbXlPdXRwdXQgPSBmYWN0b3J5LmNyZWF0ZU91dHB1dCgpOwotICAgIG15T3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBteU91dHB1dC5zZXROYW1lKG91dHB1dC5nZXROYW1lKCkpOwotICAgIG15T3V0cHV0LnNldEVNZXNzYWdlKG91dHB1dC5nZXRFTWVzc2FnZSgpKTsKLSAgICBteU91dHB1dC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0RU91dHB1dChteU91dHB1dCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KQotICB7Ci0gICAgRmF1bHQgbXlGYXVsdCA9IGZhY3RvcnkuY3JlYXRlRmF1bHQoKTsKLSAgICBteUZhdWx0LnNldERvY3VtZW50YXRpb25FbGVtZW50KGZhdWx0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIG15RmF1bHQuc2V0TmFtZShmYXVsdC5nZXROYW1lKCkpOwotICAgIG15RmF1bHQuc2V0RU1lc3NhZ2UoZmF1bHQuZ2V0RU1lc3NhZ2UoKSk7Ci0gICAgbXlGYXVsdC5zZXRFbmNsb3NpbmdEZWZpbml0aW9uKG5ld0RlZmluaXRpb24pOwotICAgIGN1cnJlbnRPcGVyYXRpb24uZ2V0RUZhdWx0cygpLmFkZChteUZhdWx0KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBjdXJyZW50QmluZGluZyA9IGZhY3RvcnkuY3JlYXRlQmluZGluZygpOwotICAgIG5ld0RlZmluaXRpb24uZ2V0RUJpbmRpbmdzKCkuYWRkKGN1cnJlbnRCaW5kaW5nKTsKLSAgICAKLSAgICBjdXJyZW50QmluZGluZy5zZXREb2N1bWVudGF0aW9uRWxlbWVudChiaW5kaW5nLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgICAKLSAgICBjdXJyZW50QmluZGluZy5zZXRRTmFtZShiaW5kaW5nLmdldFFOYW1lKCkpOwotICAgIGN1cnJlbnRCaW5kaW5nLnNldEVQb3J0VHlwZShiaW5kaW5nLmdldEVQb3J0VHlwZSgpKTsKLSAgICBjdXJyZW50QmluZGluZy5zZXRVbmRlZmluZWQoYmluZGluZy5pc1VuZGVmaW5lZCgpKTsKLQotICAgIGN1cnJlbnRFeHRlbnNpYmxlRWxlbWVudCA9IGN1cnJlbnRCaW5kaW5nOwotICAgIHN1cGVyLnZpc2l0QmluZGluZyhiaW5kaW5nKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbikKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uID0gZmFjdG9yeS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoYmluZGluZ09wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRFT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24uZ2V0RU9wZXJhdGlvbigpKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXROYW1lKGJpbmRpbmdPcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICBjdXJyZW50QmluZGluZy5nZXRCaW5kaW5nT3BlcmF0aW9ucygpLmFkZChjdXJyZW50QmluZGluZ09wZXJhdGlvbik7Ci0gICAgCi0gICAgY3VycmVudEV4dGVuc2libGVFbGVtZW50ID0gY3VycmVudEJpbmRpbmdPcGVyYXRpb247Ci0gICAgc3VwZXIudmlzaXRCaW5kaW5nT3BlcmF0aW9uKGJpbmRpbmdPcGVyYXRpb24pOyAgICAKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdJbnB1dChCaW5kaW5nSW5wdXQgaW5wdXQpCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgbXlJbnB1dCA9IGZhY3RvcnkuY3JlYXRlQmluZGluZ0lucHV0KCk7Ci0gICAgbXlJbnB1dC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAgCi0gICAgbXlJbnB1dC5zZXROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gICAgbXlJbnB1dC5zZXRJbnB1dChpbnB1dC5nZXRJbnB1dCgpKTsKLSAgICBteUlucHV0LnNldEVJbnB1dChpbnB1dC5nZXRFSW5wdXQoKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0RUJpbmRpbmdJbnB1dChteUlucHV0KTsKLSAKLSAgICBjdXJyZW50RXh0ZW5zaWJsZUVsZW1lbnQgPSBteUlucHV0OwotICAgIHN1cGVyLnZpc2l0QmluZGluZ0lucHV0KGlucHV0KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgQmluZGluZ091dHB1dCBteU91dHB1dCA9IGZhY3RvcnkuY3JlYXRlQmluZGluZ091dHB1dCgpOwotICAgIG15T3V0cHV0LnNldERvY3VtZW50YXRpb25FbGVtZW50KG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBteU91dHB1dC5zZXROYW1lKG91dHB1dC5nZXROYW1lKCkpOwotICAgIG15T3V0cHV0LnNldE91dHB1dChvdXRwdXQuZ2V0T3V0cHV0KCkpOwotICAgIG15T3V0cHV0LnNldEVPdXRwdXQob3V0cHV0LmdldEVPdXRwdXQoKSk7Ci0gICAgY3VycmVudEJpbmRpbmdPcGVyYXRpb24uc2V0RUJpbmRpbmdPdXRwdXQobXlPdXRwdXQpOwotICAgIAotICAgIGN1cnJlbnRFeHRlbnNpYmxlRWxlbWVudCA9IG15T3V0cHV0OwotICAgIHN1cGVyLnZpc2l0QmluZGluZ091dHB1dChvdXRwdXQpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBCaW5kaW5nRmF1bHQgbXlGYXVsdCA9IGZhY3RvcnkuY3JlYXRlQmluZGluZ0ZhdWx0KCk7Ci0gICAgbXlGYXVsdC5zZXREb2N1bWVudGF0aW9uRWxlbWVudChmYXVsdC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpKTsgICAKLSAgICBteUZhdWx0LnNldE5hbWUoZmF1bHQuZ2V0TmFtZSgpKTsKLSAgICBteUZhdWx0LnNldEVGYXVsdChmYXVsdC5nZXRFRmF1bHQoKSk7Ci0gICAgbXlGYXVsdC5zZXRGYXVsdChmYXVsdC5nZXRGYXVsdCgpKTsKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpLmFkZChteUZhdWx0KTsKLSAgICAKLSAgICBjdXJyZW50RXh0ZW5zaWJsZUVsZW1lbnQgPSBteUZhdWx0OwotICAgIHN1cGVyLnZpc2l0QmluZGluZ0ZhdWx0KGZhdWx0KTsKLSAgfQotIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFNlcnZpY2UoU2VydmljZSBzZXJ2aWNlKQotICB7Ci0gICAgY3VycmVudFNlcnZpY2UgPSBmYWN0b3J5LmNyZWF0ZVNlcnZpY2UoKTsKLSAgICBjdXJyZW50U2VydmljZS5zZXREb2N1bWVudGF0aW9uRWxlbWVudChzZXJ2aWNlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCkpOyAgIAotICAgIGN1cnJlbnRTZXJ2aWNlLnNldFFOYW1lKHNlcnZpY2UuZ2V0UU5hbWUoKSk7Ci0gICAgY3VycmVudFNlcnZpY2Uuc2V0VW5kZWZpbmVkKHNlcnZpY2UuaXNVbmRlZmluZWQoKSk7Ci0gICAgCi0gICAgbmV3RGVmaW5pdGlvbi5nZXRFU2VydmljZXMoKS5hZGQoY3VycmVudFNlcnZpY2UpOwotICAgIAotICAgIHN1cGVyLnZpc2l0U2VydmljZShzZXJ2aWNlKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0KFBvcnQgcG9ydCkKLSAgewotICAgIFBvcnQgbXlQb3J0ID0gZmFjdG9yeS5jcmVhdGVQb3J0KCk7Ci0gICAgbXlQb3J0LnNldERvY3VtZW50YXRpb25FbGVtZW50KHBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSk7Ci0gICAgbXlQb3J0LnNldE5hbWUocG9ydC5nZXROYW1lKCkpOwotICAgIG15UG9ydC5zZXRFQmluZGluZyhwb3J0LmdldEVCaW5kaW5nKCkpOwotICAgIAotICAgIGN1cnJlbnRTZXJ2aWNlLmdldEVQb3J0cygpLmFkZChteVBvcnQpOwotICAgIAotICAgIGN1cnJlbnRFeHRlbnNpYmxlRWxlbWVudCA9IG15UG9ydDsKLSAgICBzdXBlci52aXNpdFBvcnQocG9ydCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2libGVFbGVtZW50IG93bmVyLCBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCkKLSAgewotICAgIC8vIFRvIG1vdmUgdXAgdGhlIEFQSSB0ZXN0IGNvdmVyYWdlCi0gICAgb3duZXIuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIG93bmVyLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGZhY3RvcnkuY3JlYXRlRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICBXU0RMUGx1Z2luLmdldFBsdWdpbigpOwotICAgIFdTRExQbHVnaW4uSU5TVEFOQ0UuZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCk7Ci0gICAgCi0gICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50KQotICB7Ci0gICAgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQgeHNlZSA9IG51bGw7Ci0gICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVlZSA9IG51bGw7Ci0gICAgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgbXlFRSA9IG51bGw7Ci0gICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gICAgewotICAgICAgbXlFRSA9IGZhY3RvcnkuY3JlYXRlWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQoKTsKLSAgICAgIHhzZWUgPSAoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpbXlFRTsKLSAgICAgIHhzZWUuc2V0U2NoZW1hKCgoWFNEU2NoZW1hRXh0ZW5zaWJpbGl0eUVsZW1lbnQpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLmdldFNjaGVtYSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG15RUUgPSBmYWN0b3J5LmNyZWF0ZVVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCgpOwotICAgICAgdWVlID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudClteUVFOwotICAgICAgdWVlLmdldENoaWxkcmVuKCk7IC8vIFRCRAotICAgIH0KLSAgICBteUVFLnNldEVsZW1lbnRUeXBlKGV4dGVuc2liaWxpdHlFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpOwotICAgIG15RUUuc2V0UmVxdWlyZWQoZXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0UmVxdWlyZWQoKSk7Ci0gICAgbXlFRS5zZXRSZXF1aXJlZChleHRlbnNpYmlsaXR5RWxlbWVudC5pc1JlcXVpcmVkKCkpOwotICAgIGlmIChjdXJyZW50RXh0ZW5zaWJsZUVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIGN1cnJlbnRFeHRlbnNpYmxlRWxlbWVudC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChteUVFKTsKLSAgICAKLSAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQm9keSkKLSAgICAgIHZpc2l0U09BUEJvZHkoKFNPQVBCb2R5KWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKQotICAgICAgdmlzaXRTT0FQQmluZGluZygoU09BUEJpbmRpbmcpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICAgIGVsc2UgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpCi0gICAgICB2aXNpdFNPQVBBZGRyZXNzKChTT0FQQWRkcmVzcylleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQT3BlcmF0aW9uKQotICAgICAgdmlzaXRTT0FQT3BlcmF0aW9uKChTT0FQT3BlcmF0aW9uKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBGYXVsdCkKLSAgICAgIHZpc2l0U09BUEZhdWx0KChTT0FQRmF1bHQpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOyAgCi0gICAgZWxzZSBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQSGVhZGVyKQotICAgICAgdmlzaXRTT0FQSGVhZGVyKChTT0FQSGVhZGVyKWV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICBlbHNlIGlmIChleHRlbnNpYmlsaXR5RWxlbWVudCBpbnN0YW5jZW9mIFNPQVBIZWFkZXJGYXVsdCkKLSAgICAgIHZpc2l0U09BUEhlYWRlckZhdWx0KChTT0FQSGVhZGVyRmF1bHQpZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotICB9Ci0KLSAKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEZhdWx0KFNPQVBGYXVsdCBzb2FwRmF1bHQpCi0gIHsKLSAgICBTT0FQRmF1bHQgbXlTb2FwRmF1bHQgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEZhdWx0KCk7Ci0gICAgbXlTb2FwRmF1bHQuc2V0RW5jb2RpbmdTdHlsZXMoc29hcEZhdWx0LmdldEVuY29kaW5nU3R5bGVzKCkpOwotICAgIG15U29hcEZhdWx0LnNldE5hbWUoc29hcEZhdWx0LmdldE5hbWUoKSk7Ci0gICAgbXlTb2FwRmF1bHQuc2V0TmFtZXNwYWNlVVJJKHNvYXBGYXVsdC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgbXlTb2FwRmF1bHQuc2V0VXNlKHNvYXBGYXVsdC5nZXRVc2UoKSk7Ci0gIH0gCi0gIAotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQSGVhZGVyKFNPQVBIZWFkZXIgc29hcEhlYWRlcikKLSAgewotICAgIC8vIFVzZSBTT0FQSGVhZGVyQmFzZSB0byBpbmNyZWFzZSB0aGUgQVBJIGNvdmVyYWdlIHZhbHVlcyBpbiB0aGUgcmVwb3J0cwotICAgIAotICAgIFNPQVBIZWFkZXJCYXNlIHlvdXJTb2FwSGVhZGVyID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXJCYXNlKCk7Ci0gICAgeW91clNvYXBIZWFkZXIuZ2V0RW5jb2RpbmdTdHlsZXMoKTsKLSAgICAKLSAgICBTT0FQSGVhZGVyQmFzZSBteVNvYXBIZWFkZXIgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpOwotICAgIG15U29hcEhlYWRlci5zZXRNZXNzYWdlKHNvYXBIZWFkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICBteVNvYXBIZWFkZXIuZ2V0TWVzc2FnZSgpOwotICAgIG15U29hcEhlYWRlci5zZXRQYXJ0KHNvYXBIZWFkZXIuZ2V0UGFydCgpKTsKLSAgICBteVNvYXBIZWFkZXIuZ2V0UGFydCgpOwotICAgIG15U29hcEhlYWRlci5zZXROYW1lc3BhY2VVUkkoc29hcEhlYWRlci5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgbXlTb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIG15U29hcEhlYWRlci5zZXRVc2Uoc29hcEhlYWRlci5nZXRVc2UoKSk7Ci0gICAgbXlTb2FwSGVhZGVyLmdldFVzZSgpOwotICAgICgoU09BUEhlYWRlcilzb2FwSGVhZGVyKS5nZXRIZWFkZXJGYXVsdHMoKTsgLy8gVEJECi0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBIZWFkZXJGYXVsdChTT0FQSGVhZGVyRmF1bHQgc29hcEhlYWRlckZhdWx0KQotICB7Ci0gICAgU09BUEhlYWRlckZhdWx0IG15U29hcEhlYWRlckZhdWx0ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXJGYXVsdCgpOwotICAgIG15U29hcEhlYWRlckZhdWx0LnNldE1lc3NhZ2Uoc29hcEhlYWRlckZhdWx0LmdldE1lc3NhZ2UoKSk7Ci0gICAgbXlTb2FwSGVhZGVyRmF1bHQuc2V0UGFydChzb2FwSGVhZGVyRmF1bHQuZ2V0UGFydCgpKTsKLSAgICBteVNvYXBIZWFkZXJGYXVsdC5zZXROYW1lc3BhY2VVUkkoc29hcEhlYWRlckZhdWx0LmdldE5hbWVzcGFjZVVSSSgpKTsKLSAgICBteVNvYXBIZWFkZXJGYXVsdC5zZXRVc2Uoc29hcEhlYWRlckZhdWx0LmdldFVzZSgpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBPcGVyYXRpb25WaXNpdGVkID0gZmFsc2U7Ci0gIHByaXZhdGUgdm9pZCB2aXNpdFNPQVBPcGVyYXRpb24oU09BUE9wZXJhdGlvbiBzb2FwT3BlcmF0aW9uKQotICB7Ci0gICAgc29hcE9wZXJhdGlvblZpc2l0ZWQgPSB0cnVlOwotICAgIFNPQVBPcGVyYXRpb24gbXlTb2FwT3BlcmF0aW9uID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBPcGVyYXRpb24oKTsKLSAgICBteVNvYXBPcGVyYXRpb24uc2V0U29hcEFjdGlvblVSSShzb2FwT3BlcmF0aW9uLmdldFNvYXBBY3Rpb25VUkkoKSk7Ci0gICAgbXlTb2FwT3BlcmF0aW9uLnNldFN0eWxlKHNvYXBPcGVyYXRpb24uZ2V0U3R5bGUoKSk7Ci0gIH0KLSAgCi0gIC8vTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBCb2R5VmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQm9keShTT0FQQm9keSBzb2FwQm9keSkKLSAgewotICAgIHNvYXBCb2R5VmlzaXRlZCA9IHRydWU7Ci0gICAgU09BUEJvZHkgbXlTb2FwQm9keSA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQm9keSgpOwotICAgIG15U29hcEJvZHkuc2V0RW5jb2RpbmdTdHlsZXMoc29hcEJvZHkuZ2V0RW5jb2RpbmdTdHlsZXMoKSk7Ci0gICAgbXlTb2FwQm9keS5zZXROYW1lc3BhY2VVUkkoc29hcEJvZHkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIG15U29hcEJvZHkuc2V0UGFydHMoc29hcEJvZHkuZ2V0UGFydHMoKSk7Ci0gICAgbXlTb2FwQm9keS5zZXRVc2Uoc29hcEJvZHkuZ2V0VXNlKCkpOwotICB9Ci0gIAotICAvL05lZWRzIHRvIGltcHJvdmUgdGhpcyBwYXJ0Ci0gIHByaXZhdGUgYm9vbGVhbiBzb2FwQmluZGluZ1Zpc2l0ZWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSB2b2lkIHZpc2l0U09BUEJpbmRpbmcoU09BUEJpbmRpbmcgc29hcEJpbmRpbmcpCi0gIHsKLSAgICBzb2FwQmluZGluZ1Zpc2l0ZWQgPSB0cnVlOwotICAgIFNPQVBCaW5kaW5nIG15U29hcEJpbmRpbmcgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEJpbmRpbmcoKTsKLSAgICBteVNvYXBCaW5kaW5nLnNldFN0eWxlKHNvYXBCaW5kaW5nLmdldFN0eWxlKCkpOwotICAgIG15U29hcEJpbmRpbmcuc2V0VHJhbnNwb3J0VVJJKHNvYXBCaW5kaW5nLmdldFRyYW5zcG9ydFVSSSgpKTsgCi0gIH0KLSAKLSAgLy8gTmVlZHMgdG8gaW1wcm92ZSB0aGlzIHBhcnQKLSAgcHJpdmF0ZSBib29sZWFuIHNvYXBBZGRyZXNzVmlzaXRlZCA9IGZhbHNlOwotICBwcml2YXRlIHZvaWQgdmlzaXRTT0FQQWRkcmVzcyhTT0FQQWRkcmVzcyBzb2FwQWRkcmVzcykKLSAgewotICAgIHNvYXBBZGRyZXNzVmlzaXRlZCA9IHRydWU7Ci0gICAgU09BUEFkZHJlc3MgbXlTb2FwQWRkcmVzcyA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQWRkcmVzcygpOwotICAgIG15U29hcEFkZHJlc3Muc2V0TG9jYXRpb25VUkkoc29hcEFkZHJlc3MuZ2V0TG9jYXRpb25VUkkoKSk7IAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IFdTRExFTUZBUElUZXN0KCJNb2RlbFNlbWFudGljVGVzdCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0TW9kZWxTZW1hbnRpYygpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RlbFNlbWFudGljKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCIuL3NhbXBsZXMvTG9hZEFuZFByaW50VGVzdC53c2RsIix0cnVlKTsKLSAgICAgIFdTRExFTUZBUElUZXN0IHRlc3QgPSBuZXcgV1NETEVNRkFQSVRlc3QoZGVmKTsKLSAgICAgIHRlc3QudmlzaXQoKTsgICAgICAKLSAgICAgIHNlcmlhbGl6ZSh0ZXN0Lm5ld0RlZmluaXRpb24pOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIEFzc2VydC5mYWlsKGUudG9TdHJpbmcoKSk7Ci0gICAgfSAgICAgCi0gIH0gCi0gIAotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKERlZmluaXRpb24gZGVmKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgid3NkbCIsIG5ldyBXU0RMUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKLSAgICBXU0RMUmVzb3VyY2VJbXBsIHdzZGxNYWluUmVzb3VyY2UgPSAoV1NETFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLndzZGwiKSk7Ci0gICAgd3NkbE1haW5SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkZWYpOwotCi0gICAgSVdvcmtzcGFjZVJvb3QgbXlXb3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICBJUHJvamVjdCBteVdlYlByb2plY3QgPSBteVdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdCgib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMiKTsKLSAgICBpZiAoIW15V2ViUHJvamVjdC5leGlzdHMoKSkKLSAgICAgIG15V2ViUHJvamVjdC5jcmVhdGUobnVsbCk7Ci0gICAgCi0gICAgU3RyaW5nIGJhc2VEaXIgPSBteVdlYlByb2plY3QuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotICAgIAotICAgIERlZmluaXRpb25Mb2FkZXIuc3RvcmUoZGVmLGJhc2VEaXIgKyAiL0Nsb25lZExvYWRBbmRQcmludFRlc3Qud3NkbCIpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETEdlbmVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvV1NETEdlbmVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YTBmZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL1dTRExHZW5lcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuYmluZGluZy5zb2FwLlNPQVBCb2R5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmJpbmRpbmcuc29hcC5TT0FQRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuU09BUE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5iaW5kaW5nLnNvYXAuaW50ZXJuYWwudXRpbC5TT0FQQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlRmFjdG9yeUltcGw7Ci0KLXB1YmxpYyBjbGFzcyBXU0RMR2VuZXJhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwdWJsaWMgV1NETEdlbmVyYXRpb25UZXN0KCkKLSAgewotICAgIGluaXQoKTsKLSAgfQotICAKLSAgcHVibGljIFdTRExHZW5lcmF0aW9uVGVzdChTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLSAgewotICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAKLSAgICBzdWl0ZS5hZGRUZXN0Ci0gICAgICAobmV3IFdTRExHZW5lcmF0aW9uVGVzdCgiU2FtcGxlV1NETEdlbmVyYXRpb24iKSAKLSAgICAgICAgIHsKLSAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpIAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdGVzdFNhbXBsZVdTRExHZW5lcmF0aW9uKCk7Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICApOwotICAgIAotICAgIHJldHVybiBzdWl0ZTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFNhbXBsZVdTRExHZW5lcmF0aW9uKCkgCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZW5lcmF0ZVRlbXBlcmF0dXJlU2VydmljZSgiLi9UZW1wZXJhdHVyZVNlcnZpY2Uud3NkbCIpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZmFpbGVkIGR1ZSB0byBhbiBleGNlcHRpb246ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICAgIAotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICAKLSAgICAvLyBXZSBuZWVkIHRoaXMgZm9yIFhTRCA8aW1wb3J0Pi4KLSAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgieHNkIiwgbmV3IFhTRFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgWFNEUGFja2FnZSB4c2Rwa2cgPSBYU0RQYWNrYWdlLmVJTlNUQU5DRTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiAKLSAgewotICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlVGVtcGVyYXR1cmVTZXJ2aWNlKFN0cmluZyBvdXRwdXRGaWxlKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKG91dHB1dEZpbGUpKTsKLSAgICByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCi0gICAgLy8gQ3JlYXRlIGEgRGVmaW5pdGlvbiAtIFRlbXBlcmF0dXJlCi0gICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlZmluaXRpb24oKTsKLSAgICBkZWZpbml0aW9uLnNldFFOYW1lKG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLldTRExfTkFNRVNQQUNFX1VSSSwiVGVtcGFyYXR1cmUiKSk7Ci0gICAgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGVmaW5pdGlvbik7Ci0gICAgCi0gICAgLy8gVGFyZ2V0IG5hbWVzcGFjZSAtIGh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tCi0gICAgZGVmaW5pdGlvbi5zZXRUYXJnZXROYW1lc3BhY2UoImh0dHA6Ly93d3cudGVtcGVyYXR1cmUuY29tIik7Ci0gICAgZGVmaW5pdGlvbi5hZGROYW1lc3BhY2UoInRucyIsICJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbSIpOwotICAgIAotICAgIC8vIE90aGVyIG5hbWVzcGFjZXMgLSB3c2RsLCBzb2FwLCB4c2QKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgid3NkbCIsIFdTRExDb25zdGFudHMuV1NETF9OQU1FU1BBQ0VfVVJJKTsKLSAgICBkZWZpbml0aW9uLmFkZE5hbWVzcGFjZSgieHNkIiwgV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7Ci0gICAgZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCkucHV0KCJzb2FwIiwgU09BUENvbnN0YW50cy5TT0FQX05BTUVTUEFDRV9VUkkpOwotCi0gICAgLy8KLSAgICAvLyBMZXQncyBzdGFydCBidWlsZGluZyB0d28gbWVzc2FnZXMKLSAgICAvLwotICAgIAotICAgIC8vIENyZWF0ZSBhIFBhcnQgLSBaaXBDb2RlCi0gICAgUGFydCBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICBwYXJ0LnNldE5hbWUoIlppcENvZGUiKTsKLSAgICBwYXJ0LnNldFR5cGVOYW1lKG5ldyBRTmFtZShXU0RMQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCJzdHJpbmciKSk7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgTWVzc2FnZSAtIEdldFRlbXBlcmF0dXJlSW5wdXQKLSAgICBNZXNzYWdlIGlucHV0TWVzc2FnZSA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlKCk7Ci0gICAgaW5wdXRNZXNzYWdlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCAiR2V0VGVtcGFyYXR1cmVJbnB1dCIpKTsKLSAgICBpbnB1dE1lc3NhZ2UuYWRkUGFydChwYXJ0KTsKLSAgICBkZWZpbml0aW9uLmFkZE1lc3NhZ2UoaW5wdXRNZXNzYWdlKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBQYXJ0IC0gVGVtcGVyYXR1cmUKLSAgICBwYXJ0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcnQoKTsKLSAgICBwYXJ0LnNldE5hbWUoIlRlbXBlcmF0dXJlIik7Ci0gICAgcGFydC5zZXRUeXBlTmFtZShuZXcgUU5hbWUoV1NETENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSwiZmxvYXQiKSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBNZXNzYWdlIC0gR2V0VGVtcGVyYXR1cmVPdXRwdXQKLSAgICBNZXNzYWdlIG91dHB1dE1lc3NhZ2UgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZSgpOwotICAgIG91dHB1dE1lc3NhZ2Uuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksICJHZXRUZW1wYXJhdHVyZU91dHB1dCIpKTsKLSAgICBvdXRwdXRNZXNzYWdlLmFkZFBhcnQocGFydCk7Ci0gICAgZGVmaW5pdGlvbi5hZGRNZXNzYWdlKG91dHB1dE1lc3NhZ2UpOwotICAgIAotICAgIC8vCi0gICAgLy8gTmV4dCwgYnVpbGQgYSBQb3J0VHlwZQotICAgIC8vCi0gICAgCi0gICAgLy8gQ3JlYXRlIGFuIElucHV0IC0gR2V0VGVtcGVyYXR1cmVJbnB1dAotICAgIElucHV0IGlucHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlucHV0KCk7Ci0gICAgaW5wdXQuc2V0TWVzc2FnZShpbnB1dE1lc3NhZ2UpOwotCi0gICAgLy8gQ3JlYXRlIGFuIE91dHB1dCAtIEdldFRlbXBlcmF0dXJlT3V0cHV0Ci0gICAgT3V0cHV0IG91dHB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRwdXQoKTsKLSAgICBvdXRwdXQuc2V0TWVzc2FnZShvdXRwdXRNZXNzYWdlKTsKLSAgIAotICAgIC8vIENyZWF0ZSBhbiBPcGVyYXRpb24gLSBHZXRUZW1wZXJhdHVyZUZvclppcENvZGUKLSAgICBPcGVyYXRpb24gb3BlcmF0aW9uID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9wZXJhdGlvbigpOwotICAgIG9wZXJhdGlvbi5zZXROYW1lKCJHZXRUZW1wZXJhdHVyZUZvclppcENvZGUiKTsKLSAgICBvcGVyYXRpb24uc2V0SW5wdXQoaW5wdXQpOwotICAgIG9wZXJhdGlvbi5zZXRPdXRwdXQob3V0cHV0KTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBQb3J0VHlwZQotICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRUeXBlKCk7Ci0gICAgcG9ydFR5cGUuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIkdldFRlbXBhcmF0dXJlSW5mb1NPQVAiKSk7Ci0gICAgcG9ydFR5cGUuYWRkT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0gICAgZGVmaW5pdGlvbi5hZGRQb3J0VHlwZShwb3J0VHlwZSk7Ci0gICAgCi0gICAgLy8KLSAgICAvLyBOb3csIGxldCdzIHdvcmsgb24gQmluZGluZwotICAgIC8vCi0gICAgCi0gICAgLy8gQ3JlYXRlIGEgQmluZGluZyAtIEdldFRlbXBlcmF0dXJlSW5mb1NPQVAKLSAgICBCaW5kaW5nIGJpbmRpbmcgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQmluZGluZygpOwotICAgIGJpbmRpbmcuc2V0UU5hbWUobmV3IFFOYW1lKGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCksICJHZXRUZW1wYXJhdHVyZUluZm9TT0FQIikpOwotICAgIGJpbmRpbmcuc2V0UG9ydFR5cGUocG9ydFR5cGUpOwotICAgIGRlZmluaXRpb24uYWRkQmluZGluZyhiaW5kaW5nKTsKLQotICAgIC8vIENyZWF0ZSBhIFNPQVAgQmluZGluZwotICAgIFNPQVBCaW5kaW5nIHNvYXBCaW5kaW5nID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCaW5kaW5nKCk7Ci0gICAgc29hcEJpbmRpbmcuc2V0U3R5bGUoInJwYyIpOwotICAgIHNvYXBCaW5kaW5nLnNldFRyYW5zcG9ydFVSSSgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIik7Ci0gICAgYmluZGluZy5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQmluZGluZyk7Ci0KLSAgICAvLyBDcmVhdGUgYSBCaW5kaW5nIE9wZXJhdGlvbgotICAgIEJpbmRpbmdPcGVyYXRpb24gYmluZGluZ09wZXJhdGlvbiA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3BlcmF0aW9uKCk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXROYW1lKCJHZXRUZW1wZXJhdHVyZUZvclppcENvZGUiKTsKLSAgICBiaW5kaW5nLmFkZEJpbmRpbmdPcGVyYXRpb24oYmluZGluZ09wZXJhdGlvbik7Ci0KLSAgICAvLyBDcmVhdGUgYSBTT0FQIE9wZXJhdGlvbgotICAgIFNPQVBPcGVyYXRpb24gc29hcE9wZXJhdGlvbiA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQT3BlcmF0aW9uKCk7Ci0gICAgc29hcE9wZXJhdGlvbi5zZXRTb2FwQWN0aW9uVVJJKCJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbS9HZXRUZW1wZXJhdHVyZUZvclppcENvZGUiKTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBPcGVyYXRpb24pOyAgICAKLQotICAgIC8vIENyZWF0ZSBhIFNPQVAgQm9keQotICAgIFNPQVBCb2R5IHNvYXBCb2R5ID0gU09BUEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBCb2R5KCk7Ci0gICAgc29hcEJvZHkuc2V0VXNlKCJlbmNvZGVkIik7Ci0gICAgc29hcEJvZHkuZ2V0RW5jb2RpbmdTdHlsZXMoKS5hZGQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIik7Ci0gICAgc29hcEJvZHkuc2V0TmFtZXNwYWNlVVJJKCJodHRwOi8vd3d3LnRlbXBlcmF0dXJlLmNvbS8iKTsKLQotICAgIC8vIENyZWF0ZSBhIEJpbmRpbmcgSW5wdXQKLSAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJpbmRpbmdJbnB1dCgpOwotICAgIGJpbmRpbmdJbnB1dC5hZGRFeHRlbnNpYmlsaXR5RWxlbWVudChzb2FwQm9keSk7Ci0gICAgYmluZGluZ09wZXJhdGlvbi5zZXRCaW5kaW5nSW5wdXQoYmluZGluZ0lucHV0KTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBTT0FQIEJvZHkKLSAgICBzb2FwQm9keSA9IFNPQVBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQQm9keSgpOwotICAgIHNvYXBCb2R5LnNldFVzZSgiZW5jb2RlZCIpOwotICAgIHNvYXBCb2R5LmdldEVuY29kaW5nU3R5bGVzKCkuYWRkKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIpOwotICAgIHNvYXBCb2R5LnNldE5hbWVzcGFjZVVSSSgiaHR0cDovL3d3dy50ZW1wZXJhdHVyZS5jb20vIik7Ci0gICAgCi0gICAgLy8gQ3JlYXRlIGEgQmluZGluZyBPdXRwdXQKLSAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXB1dCA9IFdTRExGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCaW5kaW5nT3V0cHV0KCk7Ci0gICAgYmluZGluZ091cHV0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBCb2R5KTsKLSAgICBiaW5kaW5nT3BlcmF0aW9uLnNldEJpbmRpbmdPdXRwdXQoYmluZGluZ091cHV0KTsKLSAgICAKLSAgICAvLwotICAgIC8vIEZpbmFsbHksIHdlIGFyZSBidWlsZGluZyBhIFNlcnZpY2UKLSAgICAvLwotCi0gICAgLy8gQ3JlYXRlIGEgU09BUCBBZGRyZXNzCi0gICAgU09BUEFkZHJlc3Mgc29hcEFkZHJlc3MgPSBTT0FQRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEFkZHJlc3MoKTsKLSAgICBzb2FwQWRkcmVzcy5zZXRMb2NhdGlvblVSSSgiaHR0cDovL3RvZG8tc29tZS1hZGRyZXNzLyIpOwotCi0gICAgLy8gQ3JlYXRlIGEgUG9ydCAtIEdldFRlbXBlcmF0dXJlSW5mb1NPQVAKLSAgICBQb3J0IHBvcnQgPSBXU0RMRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9ydCgpOwotICAgIHBvcnQuc2V0TmFtZSgiR2V0VGVtcGVyYXR1cmVJbmZvU09BUCIpOwotICAgIHBvcnQuc2V0QmluZGluZyhiaW5kaW5nKTsKLSAgICBwb3J0LmFkZEV4dGVuc2liaWxpdHlFbGVtZW50KHNvYXBBZGRyZXNzKTsKLSAgICAKLSAgICAvLyBDcmVhdGUgYSBTZXJ2aWNlIC0gVGVtcGVyYXR1cmVTZXJ2aWNlCi0gICAgU2VydmljZSBzZXJ2aWNlID0gV1NETEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2UoKTsKLSAgICBzZXJ2aWNlLnNldFFOYW1lKG5ldyBRTmFtZShkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpLCJUZW1wZXJhdHVyZVNlcnZpY2UiKSk7Ci0gICAgc2VydmljZS5hZGRQb3J0KHBvcnQpOwotICAgIGRlZmluaXRpb24uYWRkU2VydmljZShzZXJ2aWNlKTsKLSAgICAKLSAgICAvLwotICAgIC8vIFBoZXcsIHdlIGFyZSBkb25lLiBMZXQncyBzZXJpYWxpemUgaXQuCi0gICAgLy8KLSAgICAKLSAgICByZXNvdXJjZS5zYXZlKG51bGwpOwotIAotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICB7Ci0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoIndzZGwiLCBuZXcgV1NETFJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0gICAgV1NETFBhY2thZ2UgcGtnID0gV1NETFBhY2thZ2UuZUlOU1RBTkNFOyAgCi0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvbkxvYWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvRGVmaW5pdGlvbkxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGVkNWM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL0RlZmluaXRpb25Mb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5XU0RMUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgS2lodXAgQm9vCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWZpbml0aW9uTG9hZGVyCi17Ci0gIHsKLSAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgcGx1Z2luLnhtbAotICAgIC8vCi0gICAgLy8gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLmVtZi5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAvLyAgICAgPHBhcnNlciB0eXBlPSJ3c2RsIiBjbGFzcz0iY29tLmlibS5ldG9vbHMud3NkbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsIi8+Ci0gICAgLy8gICA8L2V4dGVuc2lvbj4KLSAgICAvLwotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIG9ubHkuCi0gICAqLwotICBwcml2YXRlIERlZmluaXRpb25Mb2FkZXIoKQotICB7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIERlZmluaXRpb24gbG9hZChTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIGxvYWQoZmlsZW5hbWUsZmFsc2UpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBEZWZpbml0aW9uIGxvYWQoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIHVzZUV4dGVuc2lvbkZhY3RvcmllcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBVUkkgdXJpOwotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKLSAgICBpZiAoZmlsZS5pc0ZpbGUoKSkKLSAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpLnRvU3RyaW5nKCkpOwotICAgIGVsc2UKLSAgICB7IC8vIEFzc3VtZSB0aGF0IHRoaXMgaXMgcnVuIGFzIGEgSlVuaXQgUGx1Zy1pbiB0ZXN0LgotICAgICAgLy91cmkgPSBVUkkuY3JlYXRlVVJJKGZpbGVuYW1lKTsKLSAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBkID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cyIpOwotICAgICAgVVJMIHVybCA9IHBkLmdldEluc3RhbGxVUkwoKTsKLSAgICAgIHVybCA9IG5ldyBVUkwodXJsLGZpbGVuYW1lKTsKLSAgICAgIFN0cmluZyBzID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldEZpbGUoKTsKLSAgICAgIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHMpOwotICAgIH0KLSAgCi0gICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gICAgcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5KCkpOwotICAgIHJlc291cmNlU2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQobmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSgpKTsKLSAgICAKLSAgICBXU0RMUmVzb3VyY2VJbXBsIHdzZGxNYWluUmVzb3VyY2UgPSAoV1NETFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLndzZGwiKSk7Ci0gICAgd3NkbE1haW5SZXNvdXJjZS5zZXRVUkkodXJpKTsKLSAgICBqYXZhLnV0aWwuTWFwIG1hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICBtYXAucHV0KFdTRExSZXNvdXJjZUltcGwuQ09OVElOVUVfT05fTE9BRF9FUlJPUixCb29sZWFuLnZhbHVlT2YodHJ1ZSkpOwotICAgIG1hcC5wdXQoV1NETFJlc291cmNlSW1wbC5VU0VfRVhURU5TSU9OX0ZBQ1RPUklFUyxCb29sZWFuLnZhbHVlT2YodXNlRXh0ZW5zaW9uRmFjdG9yaWVzKSk7Ci0gICAgd3NkbE1haW5SZXNvdXJjZS5sb2FkKG1hcCk7Ci0gIAotICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciByZXNvdXJjZXMgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyByZXNvdXJjZXMuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JqZWN0IHJlc291cmNlID0gcmVzb3VyY2VzLm5leHQoKTsKLSAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGwpCi0gICAgICB7Ci0gICAgICAgIFdTRExSZXNvdXJjZUltcGwgd3NkbFJlc291cmNlID0gKFdTRExSZXNvdXJjZUltcGwpcmVzb3VyY2U7Ci0gICAgICAgIGRlZmluaXRpb24gPSB3c2RsUmVzb3VyY2UuZ2V0RGVmaW5pdGlvbigpOwotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbjsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIHZvaWQgc3RvcmUoRGVmaW5pdGlvbiBkZWZpbml0aW9uLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWZpbml0aW9uLmVSZXNvdXJjZSgpOwotICAgIHJlc291cmNlLnNldFVSSShVUkkuY3JlYXRlRmlsZVVSSShmaWxlbmFtZSkpOwotICAgIHJlc291cmNlLnNhdmUobnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL0RlZmluaXRpb25WaXNpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9EZWZpbml0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjEzOWE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL0RlZmluaXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nRmF1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ091dHB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2libGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuVHlwZXM7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmluaXRpb25WaXNpdG9yIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgcHJvdGVjdGVkIERlZmluaXRpb24gZGVmaW5pdGlvbjsKLSAgCi0gIC8qKgotICAgKiBVc2UgRGVmaW5pdGlvblZpc2l0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICAgKi8KLSAgcHJpdmF0ZSBEZWZpbml0aW9uVmlzaXRvcigpCi0gIHsKLSAgfQotICAKLSAgLy8gQWRkZWQgZm9yIEpVbml0Ci0gIHB1YmxpYyBEZWZpbml0aW9uVmlzaXRvcihTdHJpbmcgbmFtZSkKLSAgewotICAgIHN1cGVyKG5hbWUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgRGVmaW5pdGlvblZpc2l0b3IoRGVmaW5pdGlvbiBkZWZpbml0aW9uKQotICB7Ci0gICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKLSAgfQotCi0gIC8vIG1haW4gZW50cnkKLSAgcHVibGljIHZvaWQgdmlzaXQoKQotICB7Ci0gICAgdmlzaXREZWZpbml0aW9uKGRlZmluaXRpb24pOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdERlZmluaXRpb24oRGVmaW5pdGlvbiBkZWYpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGRlZi5nZXRFSW1wb3J0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0SW1wb3J0KChJbXBvcnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBUeXBlcyB0eXBlcyA9IGRlZi5nZXRFVHlwZXMoKTsKLSAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgIHZpc2l0VHlwZXModHlwZXMpOwotCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0RU1lc3NhZ2VzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRNZXNzYWdlKChNZXNzYWdlKWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBkZWYuZ2V0RVBvcnRUeXBlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0UG9ydFR5cGUoKFBvcnRUeXBlKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRFQmluZGluZ3MoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEJpbmRpbmcoKEJpbmRpbmcpaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBpdGVyYXRvciA9IGRlZi5nZXRFU2VydmljZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFNlcnZpY2UoKFNlcnZpY2UpaXRlcmF0b3IubmV4dCgpKTsKLQotICAgIGl0ZXJhdG9yID0gZGVmLmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KGRlZiwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLQotICB9Ci0gIAotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCk7Ci0gIAotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdFR5cGVzKFR5cGVzIHR5cGVzKTsKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXNzYWdlLmdldEVQYXJ0cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0UGFydCgoUGFydClpdGVyYXRvci5uZXh0KCkpOyAKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0UGFydChQYXJ0IHBhcnQpOwotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdE9wZXJhdGlvbigoT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRFSW5wdXQoKTsKLSAgICB2aXNpdElucHV0KChJbnB1dClpbnB1dCk7ICAKLSAgICAKLSAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsKLSAgICB2aXNpdE91dHB1dCgoT3V0cHV0KW91dHB1dCk7IAotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEZhdWx0KChGYXVsdClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdElucHV0KElucHV0IGlucHV0KTsKLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZpc2l0T3V0cHV0KE91dHB1dCBvdXRwdXQpOwotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRGYXVsdChGYXVsdCBmYXVsdCk7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nKEJpbmRpbmcgYmluZGluZykKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmluZGluZy5nZXRFQmluZGluZ09wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEJpbmRpbmdPcGVyYXRpb24oKEJpbmRpbmdPcGVyYXRpb24paXRlcmF0b3IubmV4dCgpKTsKLQotICAgIGl0ZXJhdG9yID0gYmluZGluZy5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChiaW5kaW5nLChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdPcGVyYXRpb24oQmluZGluZ09wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBCaW5kaW5nSW5wdXQgaW5wdXQgPSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdJbnB1dCgpOwotICAgIHZpc2l0QmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpaW5wdXQpOyAgCi0gICAgCi0gICAgQmluZGluZ091dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKTsKLSAgICB2aXNpdEJpbmRpbmdPdXRwdXQoKEJpbmRpbmdPdXRwdXQpb3V0cHV0KTsgCi0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBvcGVyYXRpb24uZ2V0RUJpbmRpbmdGYXVsdHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEJpbmRpbmdGYXVsdCgoQmluZGluZ0ZhdWx0KWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBvcGVyYXRpb24uZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQob3BlcmF0aW9uLChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotCi0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nSW5wdXQoQmluZGluZ0lucHV0IGlucHV0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnB1dC5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChpbnB1dCwoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBvdXRwdXQuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQob3V0cHV0LChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmdGYXVsdChCaW5kaW5nRmF1bHQgZmF1bHQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGZhdWx0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KGZhdWx0LChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZS5nZXRFUG9ydHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFBvcnQoKFBvcnQpaXRlcmF0b3IubmV4dCgpKTsKLQotICAgIGl0ZXJhdG9yID0gc2VydmljZS5nZXRFRXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChzZXJ2aWNlLChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBvcnQoUG9ydCBwb3J0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBwb3J0LmdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KHBvcnQsKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50Ci0gICAgKEV4dGVuc2libGVFbGVtZW50IG93bmVyLAotICAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTREw0SkRlZmluaXRpb25WaXNpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMNEpEZWZpbml0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFjZDE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTREw0SkRlZmluaXRpb25WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ0lucHV0OwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZ09wZXJhdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuRmF1bHQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgamF2YXgud3NkbC5JbnB1dDsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PdXRwdXQ7Ci1pbXBvcnQgamF2YXgud3NkbC5QYXJ0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLlR5cGVzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEtpaHVwIEJvbwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV1NETDRKRGVmaW5pdGlvblZpc2l0b3IgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwcm90ZWN0ZWQgRGVmaW5pdGlvbiBkZWZpbml0aW9uOwotICAKLSAgLyoqCi0gICAqIFVzZSBEZWZpbml0aW9uVmlzaXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gICAqLwotICBwcml2YXRlIFdTREw0SkRlZmluaXRpb25WaXNpdG9yKCkKLSAgewotICB9Ci0gIAotICAvLyBBZGRlZCBmb3IgSlVuaXQKLSAgcHVibGljIFdTREw0SkRlZmluaXRpb25WaXNpdG9yKFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBXU0RMNEpEZWZpbml0aW9uVmlzaXRvcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICB0aGlzLmRlZmluaXRpb24gPSBkZWZpbml0aW9uOwotICB9Ci0KLSAgLy8gbWFpbiBlbnRyeQotICBwdWJsaWMgdm9pZCB2aXNpdCgpCi0gIHsKLSAgICB2aXNpdERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVmLmdldEltcG9ydHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0SW1wb3J0KChJbXBvcnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBUeXBlcyB0eXBlcyA9IGRlZi5nZXRUeXBlcygpOwotICAgIGlmICh0eXBlcyAhPSBudWxsKQotICAgICAgdmlzaXRUeXBlcyh0eXBlcyk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRNZXNzYWdlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0TWVzc2FnZSgoTWVzc2FnZSlpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gZGVmLmdldFBvcnRUeXBlcygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0UG9ydFR5cGUoKFBvcnRUeXBlKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRCaW5kaW5ncygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0QmluZGluZygoQmluZGluZylpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGl0ZXJhdG9yID0gZGVmLmdldFNlcnZpY2VzKCkudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRTZXJ2aWNlKChTZXJ2aWNlKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGRlZi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotCi0gIH0KLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0SW1wb3J0KEltcG9ydCB3c2RsSW1wb3J0KTsKLSAgCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0VHlwZXMoVHlwZXMgdHlwZXMpOwotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0TWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2UuZ2V0UGFydHMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdFBhcnQoKFBhcnQpaXRlcmF0b3IubmV4dCgpKTsgCi0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KTsKLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydFR5cGUoUG9ydFR5cGUgcG9ydFR5cGUpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBvcnRUeXBlLmdldE9wZXJhdGlvbnMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdE9wZXJhdGlvbigoT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0T3BlcmF0aW9uKE9wZXJhdGlvbiBvcGVyYXRpb24pCi0gIHsKLSAgICBJbnB1dCBpbnB1dCA9IG9wZXJhdGlvbi5nZXRJbnB1dCgpOwotICAgIHZpc2l0SW5wdXQoKElucHV0KWlucHV0KTsgIAotICAgIAotICAgIE91dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0T3V0cHV0KCk7Ci0gICAgdmlzaXRPdXRwdXQoKE91dHB1dClvdXRwdXQpOyAKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRGYXVsdHMoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RmF1bHQoKEZhdWx0KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZpc2l0SW5wdXQoSW5wdXQgaW5wdXQpOwotICAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRPdXRwdXQoT3V0cHV0IG91dHB1dCk7Ci0gIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KTsKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEJpbmRpbmcoQmluZGluZyBiaW5kaW5nKQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBiaW5kaW5nLmdldEJpbmRpbmdPcGVyYXRpb25zKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKChCaW5kaW5nT3BlcmF0aW9uKWl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICBpdGVyYXRvciA9IGJpbmRpbmcuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3BlcmF0aW9uKEJpbmRpbmdPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgQmluZGluZ0lucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEJpbmRpbmdJbnB1dCgpOwotICAgIHZpc2l0QmluZGluZ0lucHV0KChCaW5kaW5nSW5wdXQpaW5wdXQpOyAgCi0gICAgCi0gICAgQmluZGluZ091dHB1dCBvdXRwdXQgPSBvcGVyYXRpb24uZ2V0QmluZGluZ091dHB1dCgpOwotICAgIHZpc2l0QmluZGluZ091dHB1dCgoQmluZGluZ091dHB1dClvdXRwdXQpOyAKLSAgICAKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG9wZXJhdGlvbi5nZXRCaW5kaW5nRmF1bHRzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEJpbmRpbmdGYXVsdCgoQmluZGluZ0ZhdWx0KWl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBvcGVyYXRpb24uZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLQotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBpbnB1dCkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gaW5wdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nT3V0cHV0KEJpbmRpbmdPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBvdXRwdXQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBmYXVsdC5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICB2aXNpdEV4dGVuc2liaWxpdHlFbGVtZW50KChFeHRlbnNpYmlsaXR5RWxlbWVudClpdGVyYXRvci5uZXh0KCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VydmljZS5nZXRQb3J0cygpLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0UG9ydCgoUG9ydClpdGVyYXRvci5uZXh0KCkpOwotCi0gICAgaXRlcmF0b3IgPSBzZXJ2aWNlLmdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoKEV4dGVuc2liaWxpdHlFbGVtZW50KWl0ZXJhdG9yLm5leHQoKSk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudCgoRXh0ZW5zaWJpbGl0eUVsZW1lbnQpaXRlcmF0b3IubmV4dCgpKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHZpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpOwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMQ29udmVydGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNDcyNTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvV1NETENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC53c2RsLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ0ZhdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdPdXRwdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuT3V0cHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLnV0aWwuV1NETFJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBLaWh1cCBCb28KLSAqLwotcHVibGljIGNsYXNzIFdTRExDb252ZXJ0ZXIgZXh0ZW5kcyBEZWZpbml0aW9uVmlzaXRvcgotewotICBwcml2YXRlIERvY3VtZW50IGRvYzsKLSAgcHJpdmF0ZSBFbGVtZW50IGRlc2NyaXB0aW9uOwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudFR5cGVzOwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudFNlcnZpY2U7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50RW5kcG9pbnQ7Ci0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50SW50ZXJmYWNlOwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudE9wZXJhdGlvbjsKLSAgCi0gIHByaXZhdGUgRWxlbWVudCBjdXJyZW50QmluZGluZzsKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uOwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEJpbmRpbmdJbnB1dDsKLSAgcHJpdmF0ZSBFbGVtZW50IGN1cnJlbnRCaW5kaW5nT3V0cHV0OwotICBwcml2YXRlIEVsZW1lbnQgY3VycmVudEJpbmRpbmdGYXVsdDsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHdzZGxOYW1lc3BhY2VQcmVmaXg7Ci0gIHByaXZhdGUgU3RyaW5nIHhzZE5hbWVzcGFjZVByZWZpeDsKLSAgCi0gIHsKLSAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgcGx1Z2luLnhtbAotICAgIC8vCi0gICAgLy8gICA8ZXh0ZW5zaW9uIHBvaW50ID0gIm9yZy5lY2xpcHNlLmVtZi5leHRlbnNpb25fcGFyc2VyIj4KLSAgICAvLyAgICAgPHBhcnNlciB0eXBlPSJ3c2RsIiBjbGFzcz0iY29tLmlibS5ldG9vbHMud3NkbC51dGlsLldTRExSZXNvdXJjZUZhY3RvcnlJbXBsIi8+Ci0gICAgLy8gICA8L2V4dGVuc2lvbj4KLSAgICAvLwotICAgIFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJ3c2RsIiwgbmV3IFdTRExSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFdTRExQYWNrYWdlIHBrZyA9IFdTRExQYWNrYWdlLmVJTlNUQU5DRTsKLSAgCi0gICAgLy8gV2UgbmVlZCB0aGlzIGZvciBYU0QgPGltcG9ydD4uCi0gICAgUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFeHRlbnNpb25Ub0ZhY3RvcnlNYXAoKS5wdXQoInhzZCIsIG5ldyBYU0RSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotICAgIFhTRFBhY2thZ2UgeHNkcGtnID0gWFNEUGFja2FnZS5lSU5TVEFOQ0U7Ci0gIH0KLSAgCi0gIC8vIEFkZGVkIGZvciBKVW5pdAotICBwdWJsaWMgV1NETENvbnZlcnRlcihTdHJpbmcgbmFtZSkgCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEBwYXJhbSBkZWZpbml0aW9uCi0gICAqLwotICBwdWJsaWMgV1NETENvbnZlcnRlcihEZWZpbml0aW9uIGRlZmluaXRpb24pCi0gIHsKLSAgICBzdXBlcihkZWZpbml0aW9uKTsKLSAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGdlbmVyYXRlMjAoU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBjcmVhdGVEb2N1bWVudCgpOwotICAgIHZpc2l0KCk7Ci0gICAgc2VyaWFsaXplKGZpbGVuYW1lKTsKLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIFNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCJ5ZXMiKTsKLSAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCJVVEYtOCIpOwotICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsIjQiKTsKLSAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oZG9tU291cmNlLG5ldyBTdHJlYW1SZXN1bHQobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBkb2MgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBFbGVtZW50IGNyZWF0ZVdTRExFbGVtZW50KFN0cmluZyBuYW1lKQotICB7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsIixuYW1lKTsKLSAgICBpZiAod3NkbE5hbWVzcGFjZVByZWZpeCAhPSBudWxsKQotICAgICAgZWxlbWVudC5zZXRQcmVmaXgod3NkbE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgCi0gICAgcmV0dXJuIGVsZW1lbnQ7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzRG9jdW1lbnRhdGlvbihFbGVtZW50IGRvY0VsZW1lbnQsIEVsZW1lbnQgcGFyZW50KQotICB7Ci0gICAgaWYgKGRvY0VsZW1lbnQgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLQotICAgIEVsZW1lbnQgYWRvcHRlZERvY0VsZW1lbnQgPSAoRWxlbWVudClkb2MuaW1wb3J0Tm9kZShkb2NFbGVtZW50LHRydWUpOwotICAgIHBhcmVudC5hcHBlbmRDaGlsZChhZG9wdGVkRG9jRWxlbWVudCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0RGVmaW5pdGlvbihEZWZpbml0aW9uIGRlZikKLSAgewotICAgIGRlc2NyaXB0aW9uID0gY3JlYXRlV1NETEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24oZGVmLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksZGVzY3JpcHRpb24pOwotICAgIAotICAgIC8vIFRCRCAtIERldGVybWluZSBsYXRlciBpZiB3ZSB3YW50IHRvIGNvbnZlcnQgdGhlIGRvY3VtZW50IHRvIHVzZSBTT0FQIDEuMi4KLSAgICAvLyBIb3dldmVyIGFkZGluZyB0aGVzZSB0d28gbmFtZXNwYWNlcyBtYXkgbm90IGJlIGhhcm1mdWwuCi0gICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ4bWxuczpzb2FwZW52IiwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3AiKTsKLSAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInhtbG5zOndzb2FwIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC9zb2FwMTIiKTsKLQotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgZGVzY3JpcHRpb24uc2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiLHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgCi0gICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBkZWYuZ2V0TmFtZXNwYWNlcygpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IG51bGw7Ci0gICAgLyoKLQl4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLQkJeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIqLwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgcHJlZml4ID0gKFN0cmluZylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBuYW1lc3BhY2UgPSBkZWYuZ2V0TmFtZXNwYWNlKHByZWZpeCk7Ci0gICAgICAKLSAgICAgIGlmICgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iLmVxdWFscyhuYW1lc3BhY2UpKQotICAgICAgewotICAgICAgCWlmIChwcmVmaXgubGVuZ3RoKCkgPT0gMCkgLy8gbWVhbnQgdG8gYmUgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgIAkgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzA4L3dzZGwiKTsKLSAgICAgIAllbHNlCi0gICAgICAJewotICAgICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC93c2RsIik7Ci0gICAgICAgICAgd3NkbE5hbWVzcGFjZVByZWZpeCA9IHByZWZpeDsKLSAgICAgICAgICBkZXNjcmlwdGlvbi5zZXRQcmVmaXgod3NkbE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAJfQotICAgICAgCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBTT0FQIDEuMgotICAgICAgaWYgKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIi5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgIHsKLSAgICAgIAkvLyBTT0FQIDEuMgotICAgICAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInhtbG5zOiIgKyBwcmVmaXgsImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC1lbnZlbG9wIik7Ci0gICAgICAgIAotICAgICAgICAvLyBXU0RMIDIuMCBiaW5kaW5nIGZvciBTT0FQIDEuMgotICAgICAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInhtbG5zOndzb2FwIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wOC9zb2FwMTIiKTsKLSAgICAgIAljb250aW51ZTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy9pZiAoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi5lcXVhbHMobmFtZXNwYWNlKSkKLSAgICAgIC8vICBjb250aW51ZTsKLSAgICAgIAotICAgICAgaWYgKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgIHhzZE5hbWVzcGFjZVByZWZpeCA9IHByZWZpeDsgLy8gV2Ugd2lsbCB1c2UgdGhpcyBpbiB2aXNpdEltcG9ydCgpLgotICAgICAgCi0gICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID09IDApIC8vIG1lYW50IHRvIGJlIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnMiICsgcHJlZml4LG5hbWVzcGFjZSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF0dHJpYnV0ZSgieG1sbnM6IiArIHByZWZpeCxuYW1lc3BhY2UpOwotICAgIH0KLSAgICAKLSAgICBkb2MuYXBwZW5kQ2hpbGQoZGVzY3JpcHRpb24pOwotICAgIHN1cGVyLnZpc2l0RGVmaW5pdGlvbihkZWYpOwotICAgIAotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEltcG9ydChvcmcuZWNsaXBzZS53c3Qud3NkbC5JbXBvcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEltcG9ydChJbXBvcnQgd3NkbEltcG9ydCkKLSAgewotICAgIC8vIERldGVybWluZSBpZiB3ZSA8aW1wb3J0PiBhIHNjaGVtYS4KLSAgICBpZiAoaW1wb3J0aW5nU2NoZW1hKHdzZGxJbXBvcnQpKQotICAgIHsKLSAgICAgIGN1cnJlbnRUeXBlcyA9IGNyZWF0ZVdTRExFbGVtZW50KCJ0eXBlcyIpOwotICAgICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoY3VycmVudFR5cGVzKTsKLSAgICAgIAotICAgICAgLy8gIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vZm9vLmNvbSIgc2NoZW1hTG9jYXRpb249ICJiYXIueHNkIi8+Ci0gICAgICBFbGVtZW50IHNjaGVtYUltcG9ydCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwiaW1wb3J0Iik7Ci0gICAgICBpZiAoeHNkTmFtZXNwYWNlUHJlZml4ID09IG51bGwpIC8vIG5lZWQgdG8gYWRkIG9uZQotICAgICAgewotICAgICAgICBkZXNjcmlwdGlvbi5zZXRBdHRyaWJ1dGUoInhtbG5zOnhzIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiKTsKLSAgICAgICAgeHNkTmFtZXNwYWNlUHJlZml4ID0gInhzIjsKLSAgICAgICAgc2NoZW1hSW1wb3J0LnNldFByZWZpeCh4c2ROYW1lc3BhY2VQcmVmaXgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoISIiLmVxdWFscyh4c2ROYW1lc3BhY2VQcmVmaXgpKSAvLyBpdCBpcyBub3QgZGVmYXVsdCBuYW1lc3BhY2UKLSAgICAgIAlzY2hlbWFJbXBvcnQuc2V0UHJlZml4KHhzZE5hbWVzcGFjZVByZWZpeCk7Ci0gICAgICAKLSAgICAgIHNjaGVtYUltcG9ydC5zZXRBdHRyaWJ1dGUoIm5hbWVzcGFjZSIsd3NkbEltcG9ydC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICBzY2hlbWFJbXBvcnQuc2V0QXR0cmlidXRlKCJzY2hlbWFMb2NhdGlvbiIsd3NkbEltcG9ydC5nZXRMb2NhdGlvblVSSSgpKTsKLSAgICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHdzZGxJbXBvcnQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxzY2hlbWFJbXBvcnQpOwotICAgICAgY3VycmVudFR5cGVzLmFwcGVuZENoaWxkKHNjaGVtYUltcG9ydCk7Ci0gICAgfQotICAJZWxzZQotICAgIHsKLSAgICAgIEVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IHdzZGxJbXBvcnQuZ2V0RWxlbWVudCgpOwotICAgICAgRWxlbWVudCBhZG9wdGVkSW1wb3J0RWxlbWVudCA9IChFbGVtZW50KWRvYy5pbXBvcnROb2RlKGltcG9ydEVsZW1lbnQsdHJ1ZSk7Ci0gICAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbih3c2RsSW1wb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksYWRvcHRlZEltcG9ydEVsZW1lbnQpOwotICAgICAgZGVzY3JpcHRpb24uYXBwZW5kQ2hpbGQoYWRvcHRlZEltcG9ydEVsZW1lbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGltcG9ydGluZ1NjaGVtYShJbXBvcnQgbXlJbXBvcnQpCi0gIHsKLSAgICBpZiAobXlJbXBvcnQuZ2V0RGVmaW5pdGlvbigpICE9IG51bGwpIC8vIGl0IGlzIFdTREwgaW1wb3J0Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFR5cGVzKG9yZy5lY2xpcHNlLndzdC53c2RsLlR5cGVzKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRUeXBlcyhUeXBlcyB0eXBlcykKLSAgewotICAJLy8gY3VycmVudFR5cGVzIG1heSBoYXZlIGJlZW4gY3JlYXRlZCBpbiB2aXNpdEltcG9ydCgpLgotICAgIGlmIChjdXJyZW50VHlwZXMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBjdXJyZW50VHlwZXMgPSBjcmVhdGVXU0RMRWxlbWVudCgidHlwZXMiKTsKLSAgICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKHR5cGVzLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudFR5cGVzKTsKLSAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRUeXBlcyk7Ci0gICAgfQotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gdHlwZXMuZ2V0U2NoZW1hcygpLml0ZXJhdG9yKCk7Ci0gICAgWFNEU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0gICAgRWxlbWVudCBzY2hlbWFFbGVtZW50ID0gbnVsbDsKLSAgICBFbGVtZW50IGFkb3B0ZWRTY2hlbWFFbGVtZW50ID0gbnVsbDsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHNjaGVtYSA9IChYU0RTY2hlbWEpaXRlcmF0b3IubmV4dCgpOwotICAgICAgc2NoZW1hLnVwZGF0ZUVsZW1lbnQoKTsKLSAgICAgIHNjaGVtYUVsZW1lbnQgPSBzY2hlbWEuZ2V0RWxlbWVudCgpOwotICAgICAgYWRvcHRlZFNjaGVtYUVsZW1lbnQgPSAoRWxlbWVudClkb2MuaW1wb3J0Tm9kZShzY2hlbWFFbGVtZW50LHRydWUpOwotICAgICAgY3VycmVudFR5cGVzLmFwcGVuZENoaWxkKGFkb3B0ZWRTY2hlbWFFbGVtZW50KTsKLSAgICB9ICAgIAotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvblZpc2l0b3IjdmlzaXRQYXJ0KG9yZy5lY2xpcHNlLndzdC53c2RsLlBhcnQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFBhcnQoUGFydCBwYXJ0KQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRQb3J0VHlwZShQb3J0VHlwZSBwb3J0VHlwZSkKLSAgewotICAgIGN1cnJlbnRJbnRlcmZhY2UgPSBjcmVhdGVXU0RMRWxlbWVudCgiaW50ZXJmYWNlIik7Ci0gIAlwcm9jZXNzRG9jdW1lbnRhdGlvbihwb3J0VHlwZS5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRJbnRlcmZhY2UpOwotICAJCi0gICAgRWxlbWVudCBwb3J0VHlwZUVsZW1lbnQgPSBwb3J0VHlwZS5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKHBvcnRUeXBlRWxlbWVudC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkKLSAgICAgIGN1cnJlbnRJbnRlcmZhY2Uuc2V0QXR0cmlidXRlKCJuYW1lIixwb3J0VHlwZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIAotICAgIGRlc2NyaXB0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRJbnRlcmZhY2UpOwotICAgIHN1cGVyLnZpc2l0UG9ydFR5cGUocG9ydFR5cGUpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE9wZXJhdGlvbihPcGVyYXRpb24gb3BlcmF0aW9uKQotICB7Ci0gICAgY3VycmVudE9wZXJhdGlvbiA9IGNyZWF0ZVdTRExFbGVtZW50KCJvcGVyYXRpb24iKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihvcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50T3BlcmF0aW9uKTsKLQkKLSAgICBFbGVtZW50IG9wZXJhdGlvbkVsZW1lbnQgPSBvcGVyYXRpb24uZ2V0RWxlbWVudCgpOwotICAgIGlmIChvcGVyYXRpb25FbGVtZW50Lmhhc0F0dHJpYnV0ZSgibmFtZSIpKQotICAgICAgY3VycmVudE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoIm5hbWUiLG9wZXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotCi0gICAgT3BlcmF0aW9uVHlwZSBvcFR5cGUgPSBvcGVyYXRpb24uZ2V0U3R5bGUoKTsKLSAgICBpZiAoT3BlcmF0aW9uVHlwZS5SRVFVRVNUX1JFU1BPTlNFID09IG9wVHlwZSkKLSAgICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0QXR0cmlidXRlKCJwYXR0ZXJuIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wMy93c2RsL2luLW91dCIpOwotICAgIGVsc2UgaWYgKE9wZXJhdGlvblR5cGUuU09MSUNJVF9SRVNQT05TRSA9PSBvcFR5cGUpCi0gICAgICAgIGN1cnJlbnRPcGVyYXRpb24uc2V0QXR0cmlidXRlKCJwYXR0ZXJuIiwiaHR0cDovL3d3dy53My5vcmcvMjAwNC8wMy93c2RsL291dC1pbiIpOwotICAgIGVsc2UgaWYgKE9wZXJhdGlvblR5cGUuTk9USUZJQ0FUSU9OID09IG9wVHlwZSkKLSAgICAgICAgY3VycmVudE9wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoInBhdHRlcm4iLCJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzAzL3dzZGwvb3V0LW9ubHkiKTsKLSAgICBlbHNlIGlmIChPcGVyYXRpb25UeXBlLk9ORV9XQVkgPT0gb3BUeXBlKQotICAgICAgICBjdXJyZW50T3BlcmF0aW9uLnNldEF0dHJpYnV0ZSgicGF0dGVybiIsImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDMvd3NkbC9pbi1vbmx5Iik7Ci0gICAgCi0gICAgY3VycmVudEludGVyZmFjZS5hcHBlbmRDaGlsZChjdXJyZW50T3BlcmF0aW9uKTsKLSAgICBzdXBlci52aXNpdE9wZXJhdGlvbihvcGVyYXRpb24pOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdElucHV0KG9yZy5lY2xpcHNlLndzdC53c2RsLklucHV0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRJbnB1dChJbnB1dCBpbnB1dCkKLSAgewotICAgIEVsZW1lbnQgY3VycmVudElucHV0ID0gY3JlYXRlV1NETEVsZW1lbnQoImlucHV0Iik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24oaW5wdXQuZ2V0RG9jdW1lbnRhdGlvbkVsZW1lbnQoKSxjdXJyZW50SW5wdXQpOwotICAgIAotICAgIEVsZW1lbnQgaW5wdXRFbGVtZW50ID0gaW5wdXQuZ2V0RWxlbWVudCgpOwotICAgIAotICAgIGlmIChpbnB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50SW5wdXQuc2V0QXR0cmlidXRlKCJtZXNzYWdlTGFiZWwiLGlucHV0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgCi0gICAgRWxlbWVudCBwYXJ0RWxlbWVudCA9IGdldFBhcnRFbGVtZW50KGlucHV0KTsKLSAgICBpZiAocGFydEVsZW1lbnQuaGFzQXR0cmlidXRlKCJlbGVtZW50IikpCi0gICAgICBjdXJyZW50SW5wdXQuc2V0QXR0cmlidXRlKCJlbGVtZW50IixwYXJ0RWxlbWVudC5nZXRBdHRyaWJ1dGUoImVsZW1lbnQiKSk7Ci0gICAgLy8gVEJEIC0gd2hhdCBpZiB0aGUgcGFydCB1c2VzICJ0eXBlIj8KLSAgICAKLSAgICBjdXJyZW50T3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRJbnB1dCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgRWxlbWVudCBnZXRQYXJ0RWxlbWVudChNZXNzYWdlUmVmZXJlbmNlIG1lc3NhZ2VSZWYpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VSZWYuZ2V0RU1lc3NhZ2UoKS5nZXRFUGFydHMoKS5pdGVyYXRvcigpOwotICAgIC8vIFRCRCAtIGZvciBub3csIHRha2UgdGhlIGZpcnN0IHBhcnQuCi0gICAgUGFydCBwYXJ0ID0gKFBhcnQpaXRlcmF0b3IubmV4dCgpOwotICAgIEVsZW1lbnQgcGFydEVsZW1lbnQgPSBwYXJ0LmdldEVsZW1lbnQoKTsKLSAgICByZXR1cm4gcGFydEVsZW1lbnQ7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdE91dHB1dChvcmcuZWNsaXBzZS53c3Qud3NkbC5PdXRwdXQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdE91dHB1dChPdXRwdXQgb3V0cHV0KQotICB7Ci0gICAgRWxlbWVudCBjdXJyZW50T3V0cHV0ID0gY3JlYXRlV1NETEVsZW1lbnQoIm91dHB1dCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRPdXRwdXQpOwotICAgIAotICAgIEVsZW1lbnQgb3V0cHV0RWxlbWVudCA9IG91dHB1dC5nZXRFbGVtZW50KCk7Ci0gICAgCi0gICAgaWYgKG91dHB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50T3V0cHV0LnNldEF0dHJpYnV0ZSgibWVzc2FnZUxhYmVsIixvdXRwdXRFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICAKLSAgICBFbGVtZW50IHBhcnRFbGVtZW50ID0gZ2V0UGFydEVsZW1lbnQob3V0cHV0KTsKLSAgICBpZiAocGFydEVsZW1lbnQuaGFzQXR0cmlidXRlKCJlbGVtZW50IikpCi0gICAgICBjdXJyZW50T3V0cHV0LnNldEF0dHJpYnV0ZSgiZWxlbWVudCIscGFydEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJlbGVtZW50IikpOwotICAgIC8vIFRCRCAtIHdoYXQgaWYgdGhlIHBhcnQgdXNlcyAidHlwZSI/Ci0gICAgCi0gICAgY3VycmVudE9wZXJhdGlvbi5hcHBlbmRDaGlsZChjdXJyZW50T3V0cHV0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0RmF1bHQob3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEZhdWx0KEZhdWx0IGZhdWx0KQotICB7Ci0gICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdEJpbmRpbmcob3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZykKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZyhCaW5kaW5nIGJpbmRpbmcpCi0gIHsKLSAgICBjdXJyZW50QmluZGluZyA9IGNyZWF0ZVdTRExFbGVtZW50KCJiaW5kaW5nIik7Ci0gICAgcHJvY2Vzc0RvY3VtZW50YXRpb24oYmluZGluZy5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRCaW5kaW5nKTsKLSAgICAKLSAgICBFbGVtZW50IGJpbmRpbmdFbGVtZW50ID0gYmluZGluZy5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKGJpbmRpbmdFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibmFtZSIpKQotICAgICAgY3VycmVudEJpbmRpbmcuc2V0QXR0cmlidXRlKCJuYW1lIixiaW5kaW5nRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7Ci0gICAgaWYgKGJpbmRpbmdFbGVtZW50Lmhhc0F0dHJpYnV0ZSgidHlwZSIpKQotICAgICAgY3VycmVudEJpbmRpbmcuc2V0QXR0cmlidXRlKCJpbnRlcmZhY2UiLGJpbmRpbmdFbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpKTsKLSAgICAKLSAgICAvLyBUQkQgLSBpcyB0aGUgbmV4dCBsaW5lIGZpeGVkIGZvciBTT0FQPwotICAgIGN1cnJlbnRCaW5kaW5nLnNldEF0dHJpYnV0ZSgidHlwZSIsImh0dHA6Ly93d3cudzMub3JnLzIwMDQvMDgvd3NkbC9zb2FwMTIiKTsKLSAgICBjdXJyZW50QmluZGluZy5zZXRBdHRyaWJ1dGUoIndzb2FwOnByb3RvY29sIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwL2JpbmRpbmdzL0hUVFAiKTsKLSAgICBjdXJyZW50QmluZGluZy5zZXRBdHRyaWJ1dGUoIndzb2FwOm1lcERlZmF1bHQiLCJodHRwOi8vd3d3LnczLm9yZy4yMDAzLzA1L3NvYXAvbWVwL3JlcXVlc3QtcmVzcG9uc2UiKTsKLQotICAgIGRlc2NyaXB0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRCaW5kaW5nKTsKLSAgICBzdXBlci52aXNpdEJpbmRpbmcoYmluZGluZyk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ09wZXJhdGlvbihCaW5kaW5nT3BlcmF0aW9uIG9wZXJhdGlvbikKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uID0gY3JlYXRlV1NETEVsZW1lbnQoIm9wZXJhdGlvbiIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKG9wZXJhdGlvbi5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uKTsKLSAgICAKLSAgICBFbGVtZW50IG9wZXJhdGlvbkVsZW1lbnQgPSBvcGVyYXRpb24uZ2V0RWxlbWVudCgpOwotICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gb3BlcmF0aW9uLmdldEVPcGVyYXRpb24oKS5nZXROYW1lKCk7Ci0gCi0gICAgLy8gRGV0ZXJtaW5lIHByZWZpeAotICAgIFN0cmluZyBwcmVmaXggPSBudWxsOwotICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBudWxsOwotICAgIERlZmluaXRpb24gZGVmID0gb3BlcmF0aW9uLmdldEVuY2xvc2luZ0RlZmluaXRpb24oKTsKLSAgICBpZiAoZGVmICE9IG51bGwpCi0gICAgICB0YXJnZXROYW1lc3BhY2UgPSBkZWYuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgcHJlZml4ID0gZGVmLmdldFByZWZpeCh0YXJnZXROYW1lc3BhY2UpOwotICAgIAotICAgIGlmIChwcmVmaXggPT0gbnVsbCkKLSAgICAgIHByZWZpeCA9ICIiOwotICAgIGVsc2UKLSAgICAgIHByZWZpeCArPSAiOiI7Ci0gICAgICAKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5zZXRBdHRyaWJ1dGUoInJlZiIscHJlZml4ICsgb3BlcmF0aW9uTmFtZSk7Ci0gICAgCi0gICAgY3VycmVudEJpbmRpbmcuYXBwZW5kQ2hpbGQoY3VycmVudEJpbmRpbmdPcGVyYXRpb24pOwotICAgIHN1cGVyLnZpc2l0QmluZGluZ09wZXJhdGlvbihvcGVyYXRpb24pOwotICB9Ci0gCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ0lucHV0KEJpbmRpbmdJbnB1dCBpbnB1dCkKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nSW5wdXQgPSBjcmVhdGVXU0RMRWxlbWVudCgiaW5wdXQiKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihpbnB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRCaW5kaW5nSW5wdXQpOwotICAgIAotICAgIEVsZW1lbnQgaW5wdXRFbGVtZW50ID0gaW5wdXQuZ2V0RWxlbWVudCgpOwotICAgIFN0cmluZyBpbnB1dE5hbWUgPSBpbnB1dC5nZXROYW1lKCk7Ci0gICAgaWYgKGlucHV0TmFtZSAhPSBudWxsKQotICAgICAgaW5wdXRFbGVtZW50LnNldEF0dHJpYnV0ZSgibmFtZSIsaW5wdXROYW1lKTsKLSAgICAKLSAgICBjdXJyZW50QmluZGluZ09wZXJhdGlvbi5hcHBlbmRDaGlsZChjdXJyZW50QmluZGluZ0lucHV0KTsKLSAgICBzdXBlci52aXNpdEJpbmRpbmdJbnB1dChpbnB1dCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QmluZGluZ091dHB1dChCaW5kaW5nT3V0cHV0IG91dHB1dCkKLSAgewotICAgIGN1cnJlbnRCaW5kaW5nT3V0cHV0ID0gY3JlYXRlV1NETEVsZW1lbnQoIm91dHB1dCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKG91dHB1dC5nZXREb2N1bWVudGF0aW9uRWxlbWVudCgpLGN1cnJlbnRCaW5kaW5nT3V0cHV0KTsKLSAgICAKLSAgICBFbGVtZW50IG91dHB1dEVsZW1lbnQgPSBvdXRwdXQuZ2V0RWxlbWVudCgpOwotICAgIFN0cmluZyBvdXRwdXROYW1lID0gb3V0cHV0LmdldE5hbWUoKTsKLSAgICBpZiAob3V0cHV0TmFtZSAhPSBudWxsKQotICAgICAgb3V0cHV0RWxlbWVudC5zZXRBdHRyaWJ1dGUoIm5hbWUiLG91dHB1dE5hbWUpOwotICAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRCaW5kaW5nT3V0cHV0KTsKLSAgICBzdXBlci52aXNpdEJpbmRpbmdPdXRwdXQob3V0cHV0KTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRCaW5kaW5nRmF1bHQoQmluZGluZ0ZhdWx0IGZhdWx0KQotICB7Ci0gICAgY3VycmVudEJpbmRpbmdGYXVsdCA9IGNyZWF0ZVdTRExFbGVtZW50KCJmYXVsdCIpOwotICAgIHByb2Nlc3NEb2N1bWVudGF0aW9uKGZhdWx0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEJpbmRpbmdGYXVsdCk7Ci0gICAgCi0gICAgRWxlbWVudCBmYXVsdEVsZW1lbnQgPSBmYXVsdC5nZXRFbGVtZW50KCk7Ci0gICAgU3RyaW5nIGZhdWx0TmFtZSA9IGZhdWx0LmdldE5hbWUoKTsKLSAgICBpZiAoZmF1bHROYW1lICE9IG51bGwpCi0gICAgICBmYXVsdEVsZW1lbnQuc2V0QXR0cmlidXRlKCJuYW1lIixmYXVsdE5hbWUpOwotICAgIAotICAgIGN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmFwcGVuZENoaWxkKGN1cnJlbnRCaW5kaW5nRmF1bHQpOwotICAgIHN1cGVyLnZpc2l0QmluZGluZ0ZhdWx0KGZhdWx0KTsgCi0gIH0KLSAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkKLSAgewotICAgIGN1cnJlbnRTZXJ2aWNlID0gY3JlYXRlV1NETEVsZW1lbnQoInNlcnZpY2UiKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihzZXJ2aWNlLmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudFNlcnZpY2UpOwotICAgIAotICAgIEVsZW1lbnQgc2VydmljZUVsZW1lbnQgPSBzZXJ2aWNlLmdldEVsZW1lbnQoKTsKLSAgICBpZiAoc2VydmljZUVsZW1lbnQuaGFzQXR0cmlidXRlKCJuYW1lIikpCi0gICAgICBjdXJyZW50U2VydmljZS5zZXRBdHRyaWJ1dGUoIm5hbWUiLHNlcnZpY2VFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKLSAgICAKLSAgICBkZXNjcmlwdGlvbi5hcHBlbmRDaGlsZChjdXJyZW50U2VydmljZSk7Ci0gICAgc3VwZXIudmlzaXRTZXJ2aWNlKHNlcnZpY2UpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbC5EZWZpbml0aW9uVmlzaXRvciN2aXNpdFBvcnQob3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0UG9ydChQb3J0IHBvcnQpCi0gIHsKLSAgICBjdXJyZW50RW5kcG9pbnQgPSBjcmVhdGVXU0RMRWxlbWVudCgiZW5kcG9pbnQiKTsKLSAgICBwcm9jZXNzRG9jdW1lbnRhdGlvbihwb3J0LmdldERvY3VtZW50YXRpb25FbGVtZW50KCksY3VycmVudEVuZHBvaW50KTsKLSAgICAKLSAgICBFbGVtZW50IHBvcnRFbGVtZW50ID0gcG9ydC5nZXRFbGVtZW50KCk7Ci0gICAgaWYgKHBvcnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibmFtZSIpKQotICAgICAgY3VycmVudEVuZHBvaW50LnNldEF0dHJpYnV0ZSgibmFtZSIscG9ydEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIikpOwotICAgIGlmIChwb3J0RWxlbWVudC5oYXNBdHRyaWJ1dGUoImJpbmRpbmciKSkKLSAgICAgIGN1cnJlbnRFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImJpbmRpbmciLHBvcnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiYmluZGluZyIpKTsKLSAgICAKLSAgICAvLyBBZGQgaW50ZXJmYWNlIHRvIGN1cnJlbnQgc2VydmljZQotICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKLSAgICBpZiAoYmluZGluZyAhPSBudWxsKSAvLyBiaW5kaW5nIGNvdWxkIG5vdCBiZSByZXNvbHZlZAotICAgIHsKLSAgICAgIEVsZW1lbnQgYmluZGluZ0VsZW1lbnQgPSBiaW5kaW5nLmdldEVsZW1lbnQoKTsKLSAgICAgIGlmIChiaW5kaW5nRWxlbWVudC5oYXNBdHRyaWJ1dGUoInR5cGUiKSkKLSAgICAgICAgY3VycmVudFNlcnZpY2Uuc2V0QXR0cmlidXRlKCJpbnRlcmZhY2UiLGJpbmRpbmdFbGVtZW50LmdldEF0dHJpYnV0ZSgidHlwZSIpKTsKLSAgICB9Ci0gICAKLSAgICBjdXJyZW50U2VydmljZS5hcHBlbmRDaGlsZChjdXJyZW50RW5kcG9pbnQpOwotICAgIHN1cGVyLnZpc2l0UG9ydChwb3J0KTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsLkRlZmluaXRpb25WaXNpdG9yI3Zpc2l0RXh0ZW5zaWJpbGl0eUVsZW1lbnQob3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQsIG9yZy5lY2xpcHNlLndzdC53c2RsLkV4dGVuc2liaWxpdHlFbGVtZW50KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHRlbnNpYmlsaXR5RWxlbWVudChFeHRlbnNpYmxlRWxlbWVudCBvd25lciwgRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpCi0gIHsKLSAgICAvLyBUQkQgLSBJdCBpcyBub3QganVzdCBTT0FQIGJpbmRpbmcKLSAgICBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlBvcnRJbXBsKQotICAgIHsKLSAgICAgIEVsZW1lbnQgc29hcEVsZW1lbnQgPSBleHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCk7Ci0gICAgICBpZiAoc29hcEVsZW1lbnQuaGFzQXR0cmlidXRlKCJsb2NhdGlvbiIpKQotICAgICAgICBjdXJyZW50RW5kcG9pbnQuc2V0QXR0cmlidXRlKCJhZGRyZXNzIixzb2FwRWxlbWVudC5nZXRBdHRyaWJ1dGUoImxvY2F0aW9uIikpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRWxlbWVudCBkb21FbGVtZW50ID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0RWxlbWVudCgpOwotICAgICAgRWxlbWVudCBhZG9wdGVkRE9NRWxlbWVudCA9IChFbGVtZW50KWRvYy5pbXBvcnROb2RlKGRvbUVsZW1lbnQsdHJ1ZSk7Ci0gICAgICAKLSAgICAgIGlmIChvd25lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLndzdC53c2RsLmludGVybmFsLmltcGwuRGVmaW5pdGlvbkltcGwpCi0gICAgICAgIGRlc2NyaXB0aW9uLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxkZXNjcmlwdGlvbi5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLlNlcnZpY2VJbXBsKQotICAgICAgICBjdXJyZW50U2VydmljZS5pbnNlcnRCZWZvcmUoYWRvcHRlZERPTUVsZW1lbnQsY3VycmVudFNlcnZpY2UuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgIGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwuaW1wbC5Qb3J0VHlwZUltcGwpCi0gICAgICAJY3VycmVudEludGVyZmFjZS5pbnNlcnRCZWZvcmUoYWRvcHRlZERPTUVsZW1lbnQsY3VycmVudEludGVyZmFjZS5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLk9wZXJhdGlvbkltcGwpCi0gICAgICAJY3VycmVudE9wZXJhdGlvbi5pbnNlcnRCZWZvcmUoYWRvcHRlZERPTUVsZW1lbnQsY3VycmVudE9wZXJhdGlvbi5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkJpbmRpbmdJbXBsKQotICAgICAgCWN1cnJlbnRCaW5kaW5nLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZy5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkJpbmRpbmdPcGVyYXRpb25JbXBsKQotICAgICAgCWN1cnJlbnRCaW5kaW5nT3BlcmF0aW9uLmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZ09wZXJhdGlvbi5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkJpbmRpbmdJbnB1dEltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmdJbnB1dC5pbnNlcnRCZWZvcmUoYWRvcHRlZERPTUVsZW1lbnQsY3VycmVudEJpbmRpbmdJbnB1dC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkJpbmRpbmdPdXRwdXRJbXBsKQotICAgICAgCWN1cnJlbnRCaW5kaW5nT3V0cHV0Lmluc2VydEJlZm9yZShhZG9wdGVkRE9NRWxlbWVudCxjdXJyZW50QmluZGluZ091dHB1dC5nZXRGaXJzdENoaWxkKCkpOwotICAgICAgZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC5pbXBsLkJpbmRpbmdGYXVsdEltcGwpCi0gICAgICAJY3VycmVudEJpbmRpbmdGYXVsdC5pbnNlcnRCZWZvcmUoYWRvcHRlZERPTUVsZW1lbnQsY3VycmVudEJpbmRpbmdGYXVsdC5nZXRGaXJzdENoaWxkKCkpOwotCi0gICAgfQotCi0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIAotICB7Ci0gICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgIAotICAgIHN1aXRlLmFkZFRlc3QKLSAgICAgIChuZXcgV1NETENvbnZlcnRlcigiQ29udmVydCIpIAotICAgICAgICAgewotICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICB0ZXN0Q29udmVydCgpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgKTsKLSAgICByZXR1cm4gc3VpdGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0KCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKCJkOi9lY2xpcHNlMzAxL2VjbGlwc2Uvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL1BUQVRpbWVEaXN0cmlidXRpb24ud3NkbCIpOwotICAgICAgV1NETENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgV1NETENvbnZlcnRlcihkZWYpOwotICAgICAgY29udmVydGVyLmdlbmVyYXRlMjAoImQ6L2VjbGlwc2UzMDEvZWNsaXBzZS93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvUFRBVGltZURpc3RyaWJ1dGlvbjIwLndzZGwiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfSAgICAKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICAvKgotICAgIHRyeQotICAgIHsKLSAgICAgIERlZmluaXRpb24gZGVmID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKGFyZ3NbMF0pOwotICAgICAgV1NETENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgV1NETENvbnZlcnRlcihkZWYpOwotICAgICAgY29udmVydGVyLmdlbmVyYXRlMjAoInRlc3QyMC53c2RsIik7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0qLwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9XU0RMTW9kZWxMb2NhdG9yQWRhcHRlckZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGM1YjNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy91dGlsL1dTRExNb2RlbExvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuaW50ZXJuYWwudXRpbC5XU0RMTW9kZWxMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgV1NETE1vZGVsTG9jYXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gIHByb3RlY3RlZCBDdXN0b21XU0RMTW9kZWxMb2NhdG9yIGN1c3RvbVdTRExNb2RlbExvY2F0b3IgPSBuZXcgQ3VzdG9tV1NETE1vZGVsTG9jYXRvcigpOwotICAKLSAgY2xhc3MgQ3VzdG9tV1NETE1vZGVsTG9jYXRvciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgV1NETE1vZGVsTG9jYXRvcgotICB7Ci0gICAgcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhdGlvbikKLSAgICB7Ci0gICAgICByZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbmFtZXNwYWNlLCBsb2NhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBZGF0cGVyRm9yVHlwZShPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gIHsKLSAgICByZXR1cm4gdHlwZSA9PSBXU0RMTW9kZWxMb2NhdG9yLmNsYXNzOwotICB9Ci0KLSAgcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkKLSAgewotICAgIHJldHVybiBjdXN0b21XU0RMTW9kZWxMb2NhdG9yOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiYmE4Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcjsKLQotcHVibGljIGNsYXNzIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotewotICAgIHByb3RlY3RlZCBYU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbCBzY2hlbWFMb2NhdG9yID0gbmV3IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXJJbXBsKCk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXIuY2xhc3M7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkKLSAgICB7Ci0gICAgICByZXR1cm4gc2NoZW1hTG9jYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL3V0aWwvWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0Mzg3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvdXRpbC9YU0RTY2hlbWFMb2NhdGlvblJlc29sdmVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckltcGwgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIFhTRFNjaGVtYUxvY2F0aW9uUmVzb2x2ZXIKLXsKLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVTY2hlbWFMb2NhdGlvbihYU0RTY2hlbWEgeHNkU2NoZW1hLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgc2NoZW1hTG9jYXRpb25VUkkpCi0gICAgewotICAgICAgU3RyaW5nIGJhc2VMb2NhdGlvbiA9IHhzZFNjaGVtYS5nZXRTY2hlbWFMb2NhdGlvbigpOyAgICAgIAotICAgICAgcmV0dXJuIFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZVVSSSwgc2NoZW1hTG9jYXRpb25VUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYTU4M2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8IS0tIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIiAvPiAtLT4KLQkJCi0JCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQkJPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JCi0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIiAvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0JPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLip4bWwiIC8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLQkJPHByb3BlcnR5IG5hbWU9IndzdC1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vd3N0X2ZvbGRlciIvPgotCQk8ZGVsZXRlIGRpcj0iJHt3c3QtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICAJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAJCTxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d3N0LWZvbGRlcn0iLz4KLSAgICAgIAkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIAkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLkFsbFRlc3RDYXNlcyIgLz4KLSAgIAkJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0JPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotCTwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotCQk8IS0tPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiIC8+LS0+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0JPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotCTx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotCQk8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy4qeG1sIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIiAvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhNmRiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0YmVlZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogV1NETCBWYWxpZGF0b3IgVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB3c2RsdmFsaWRhdGV0ZXN0cy5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWwuV1NETFZhbGlkYXRvclRlc3RzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2Uud3N0LndzLnVpLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudiwKLSBvcmcuYXBhY2hlLmFudAotRWNsaXBzZS1BdXRvU3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhNjg3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS53c2RsdmFsaWRhdGV0ZXN0cy5qYXIgPSBzcmMvCi1vdXRwdXQud3NkbHZhbGlkYXRldGVzdHMuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB3c2RsdmFsaWRhdGV0ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgdGVzdHJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcnVudGVzdHMuYmF0LFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNjVmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3Jlc29sdmVyL1VSSVJlc29sdmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTRkZjJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvcmVzb2x2ZXIvVVJJUmVzb2x2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLnJlc29sdmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVVJJUmVzb2x2ZXIgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUklSZXNvbHZlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwcml2YXRlIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyID0gbnVsbDsKLSAvKioKLSAgKiBDcmVhdGUgYSB0ZXN0cyBzdWl0ZSBmcm9tIHRoaXMgdGVzdCBjbGFzcy4KLSAgKiAKLSAgKiBAcmV0dXJuIEEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoaXMgdGVzdCBjbGFzcy4KLSAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFVSSVJlc29sdmVyVGVzdC5jbGFzcyk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIAotICB7Ci0JdXJpUmVzb2x2ZXIgPSBuZXcgVVJJUmVzb2x2ZXIoKTsJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVBYnNvbHV0ZUZpbGUoKQotICB7Ci0gIAkvLyBTeXN0ZW0gaWQgaXMgYWJzb2x1dGUgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJmaWxlOi9jOi9zb21lcGF0aC9teWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygic3lzdGVtSWQgaXMgYWJzb2x1dGUgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgc3lzdGVtSWQpOwotICAJCi0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGUoKQotICB7Ci0gIAkvLyBTeXN0ZW0gaWQgaXMgcmVsYXRpdmUgCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJteWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygic3lzdGVtSWQgaXMgc2ltcGxlIHJlbGF0aXZlIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVTdGFydHNXaXRoRG90RG90KCkKLSAgewotICAgIC8vIFN5c3RlbSBpZCBpcyByZWxhdGl2ZSB3aXRoIC4uLwotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAiLi4vbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIHJlbGF0aXZlIHdpdGggLi4vIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9jOi9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVTdGFydHNXaXRoRG90RG90VHdpY2UoKQotICB7Ci0gICAgLy8gU3lzdGVtIGlkIGlzIHJlbGF0aXZlIHdpdGggLi4vLi4vCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICIuLi8uLi9teWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygic3lzdGVtSWQgaXMgcmVsYXRpdmUgd2l0aCAuLi8uLi8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L2M6L215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZVN0YXJ0c1dpdGhEb3QoKQotICB7Ci0gICAgLy8gU3lzdGVtIGlkIGlzIHJlbGF0aXZlIHdpdGggLi8KLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovYzovc29tZXBhdGgvc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gIi4vbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIHJlbGF0aXZlIHdpdGggLi8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZVN0YXJ0c1dpdGhEb3RUd2ljZSgpCi0gIHsKLSAgICAvLyBTeXN0ZW0gaWQgaXMgcmVsYXRpdmUgd2l0aCAuLy4vCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICIuLy4vbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIHJlbGF0aXZlIHdpdGggLi8uLyBhbmQgaXMgbm90IG1vZGlmaWVkIGNvcnJlY3RseS4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTovYzovc29tZXBhdGgvc29tZXBhdGgvbXlmaWxlLnR4dCIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlU3RhcnRzV2l0aFNsYXNoKCkKLSAgewotICAgIC8vIFN5c3RlbSBpZCBpcyByZWxhdGl2ZSBiZWdpbm5pbmcgd2l0aCAvCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICIvbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIHJlbGF0aXZlIGJlZ2lubmluZyB3aXRoIC8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZURvdERvdEluTWlkZGxlKCkKLSAgewotICAgIC8vIFN5c3RlbSBpZCBjb250YWlucyAuLi8gaW4gdGhlIG1pZGRsZQotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAic29tZXBhdGgvLi4vbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIHJlbGF0aXZlIGFuZCBjb250YWlucyAuLi8gaW4gdGhlIG1pZGRsZSBhbmQgaXMgbm90IG1vZGlmaWVkIGNvcnJlY3RseS4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTovYzovc29tZXBhdGgvc29tZXBhdGgvbXlmaWxlLnR4dCIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlRm90SW5NaWRkbGUoKQotICB7Ci0gICAgLy8gU3lzdGVtIGlkIGNvbnRhaW5zIC4vIGluIHRoZSBtaWRkbGUKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovYzovc29tZXBhdGgvc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gInNvbWVwYXRoLy4vbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGlzIHJlbGF0aXZlIGFuZCBjb250YWlucyAuLyBpbiB0aGUgbWlkZGxlIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9jOi9zb21lcGF0aC9zb21lcGF0aC9zb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtbGl6ZVJlbGF0aXZlRmlsZURvdERvdEluTWlkZGxlT2ZCYXNlKCkKLSAgewotICAgIC8vIEJhc2UgbG9jYXRpb24gY29udGFpbnMgLi4vIGluIHRoZSBtaWRkbGUKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovYzovc29tZXBhdGgvLi4vc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gIm15ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJiYXNlTG9jYXRpb24gY29udGFpbnMgLi4vIGluIHRoZSBtaWRkbGUgYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L2M6L3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZURvdEluTWlkZGxlT2ZCYXNlKCkKLSAgewotICAgIC8vIEJhc2UgbG9jYXRpb24gY29udGFpbnMgLi8gaW4gdGhlIG1pZGRsZQotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9jOi9zb21lcGF0aC8uL3NvbWVwYXRoL2ZpbGUudHh0IjsKLSAgCVN0cmluZyBzeXN0ZW1JZCA9ICJteWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygiYmFzZUxvY2F0aW9uIGNvbnRhaW5zIC4vIGluIHRoZSBtaWRkbGUgYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L2M6L3NvbWVwYXRoL3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZUJhc2VTdGFydHNXaXRoU2xhc2hEb3REb3QoKQotICB7Ci0gICAgLy8gQmFzZSBsb2NhdGlvbiBzdGFydHMgd2l0aCAvLi4vIAotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi8uLi9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAibXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoImJhc2VMb2NhdGlvbiBzdGFydHMgd2l0aCAuLi8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6Ly4uL3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZUJhc2VTdGFydHNXaXRoU2xhc2hEb3QoKQotICB7Ci0gICAgLy8gQmFzZSBsb2NhdGlvbiBzdGFydHMgd2l0aCAvLi8KLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovLi9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAibXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoImJhc2VMb2NhdGlvbiBzdGFydHMgd2l0aCAuLyBhbmQgaXMgbm90IG1vZGlmaWVkIGNvcnJlY3RseS4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTovc29tZXBhdGgvbXlmaWxlLnR4dCIpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlQmFzZVN0YXJ0c1dpdGhEb3REb3QoKQotICB7Ci0gICAgLy8gQmFzZSBsb2NhdGlvbiBzdGFydHMgd2l0aCAuLi8gCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6Li4vc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gIm15ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJiYXNlTG9jYXRpb24gc3RhcnRzIHdpdGggLi4vIGFuZCBpcyBub3QgbW9kaWZpZWQgY29ycmVjdGx5LiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi4uL3NvbWVwYXRoL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVJlbGF0aXZlRmlsZUJhc2VTdGFydHNXaXRoRG90KCkKLSAgewotICAgIC8vIEJhc2UgbG9jYXRpb24gc3RhcnRzIHdpdGggLi8gCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gImZpbGU6Li9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAibXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoImJhc2VMb2NhdGlvbiBzdGFydHMgd2l0aCAuLyBhbmQgaXMgbm90IG1vZGlmaWVkIGNvcnJlY3RseS4iLCB1cmlSZXNvbHZlci5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgbnVsbCwgc3lzdGVtSWQpLCAiZmlsZTpzb21lcGF0aC9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVTb21lZGlyRG90RG90KCkKLSAgewotICAgIC8vIFN5c3RlbSBpZCBjb250YWlucyBzb21lZGlyLi4vIGluIHRoZSBtaWRkbGUKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSAiZmlsZTovc29tZXBhdGgvZmlsZS50eHQiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gInNvbWVkaXIuLi9teWZpbGUudHh0IjsKLSAgCWFzc2VydEVxdWFscygic3lzdGVtSWQgaGFzIHNvbWVkaXIuLi8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L3NvbWVwYXRoL3NvbWVkaXIuLi9teWZpbGUudHh0Iik7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVSZWxhdGl2ZUZpbGVTb21lZGlyRG90KCkKLSAgewotICAgIC8vIFN5c3RlbSBpZCBjb250YWlucyBzb21lZGlyLi8gaW4gdGhlIG1pZGRsZQotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSAic29tZWRpci4vbXlmaWxlLnR4dCI7Ci0gIAlhc3NlcnRFcXVhbHMoInN5c3RlbUlkIGhhcyBzb21lZGlyLi8gYW5kIGlzIG5vdCBtb2RpZmllZCBjb3JyZWN0bHkuIiwgdXJpUmVzb2x2ZXIucmVzb2x2ZShiYXNlTG9jYXRpb24sIG51bGwsIHN5c3RlbUlkKSwgImZpbGU6L3NvbWVwYXRoL3NvbWVkaXIuL215ZmlsZS50eHQiKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZU51bGxTeXN0ZW1JZCgpCi0gIHsKLSAgICAvLyBTeXN0ZW0gaWQgaXMgbnVsbAotICAJU3RyaW5nIGJhc2VMb2NhdGlvbiA9ICJmaWxlOi9zb21lcGF0aC9maWxlLnR4dCI7Ci0gIAlTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyBudWxsLiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplTnVsbEJhc2VMb2NhdGlvbigpCi0gIHsKLSAgICAvLyBCYXNlIGxvY2F0aW9uIGlzIG51bGwKLSAgCVN0cmluZyBiYXNlTG9jYXRpb24gPSBudWxsOwotICAJU3RyaW5nIHN5c3RlbUlkID0gInNvbWVkaXIuL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyBudWxsLiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplU3lzdGVtSWRBYnNvbHV0ZU51bGxCYXNlTG9jYXRpb24oKQotICB7Ci0gICAgLy8gQmFzZSBsb2NhdGlvbiBpcyBudWxsCi0gIAlTdHJpbmcgYmFzZUxvY2F0aW9uID0gIm51bGwiOwotICAJU3RyaW5nIHN5c3RlbUlkID0gImZpbGU6L3NvbWVkaXIuL215ZmlsZS50eHQiOwotICAJYXNzZXJ0RXF1YWxzKCJzeXN0ZW1JZCBpcyBudWxsLiIsIHVyaVJlc29sdmVyLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBudWxsLCBzeXN0ZW1JZCksICJmaWxlOi9zb21lZGlyLi9teWZpbGUudHh0Iik7Ci0gIH0KLQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvV1NETFZhbGlkYXRlVGFzay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvV1NETFZhbGlkYXRlVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc4NzVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvYW50L1dTRExWYWxpZGF0ZVRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZXhwb3NlIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgV1NETFZhbGlkYXRlIGNsYXNzIGZvciB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgV1NETFZhbGlkYXRlVGFzayBleHRlbmRzIFdTRExWYWxpZGF0ZQotewotCi0gIC8qKgotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50LldTRExWYWxpZGF0ZSNnZXRGaWxlTGlzdCgpCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRGaWxlTGlzdCgpCi0gIHsKLSAgICByZXR1cm4gc3VwZXIuZ2V0RmlsZUxpc3QoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9XU0RMVmFsaWRhdGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL2FudC9XU0RMVmFsaWRhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyY2EyMDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS9hbnQvV1NETFZhbGlkYXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlbmFtZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWwuQmFzZVRlc3RDYXNlOwotCi0vKioKLSAqIFdTRExWYWxpZGF0ZSBhbnQgdGFzayB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0ZVRlc3QgZXh0ZW5kcyBCYXNlVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgQkFTRV9ESVI7OwotICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKLQotIC8qKgotICAqIENyZWF0ZSBhIHRlc3RzIHN1aXRlIGZyb20gdGhpcyB0ZXN0IGNsYXNzLgotICAqIAotICAqIEByZXR1cm4gQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhpcyB0ZXN0IGNsYXNzLgotICAqLwotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoV1NETFZhbGlkYXRlVGVzdC5jbGFzcyk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBCQVNFX0RJUiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIOwotICAgICAgQkFTRV9ESVIgPSBCQVNFX0RJUi5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgIGlmKEJBU0VfRElSLnN0YXJ0c1dpdGgoIlxcIikpCi0gICAgICB7Ci0gICAgICAgIEJBU0VfRElSID0gQkFTRV9ESVIuc3Vic3RyaW5nKDEpOyAgCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIAotICAgIH0KLSAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICBwcm9qZWN0LnNldEJhc2VEaXIobmV3IEZpbGUoQkFTRV9ESVIpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgdGhhdCBhIHNpbmdsZSBmaWxlIHdpdGggYSByZWxhdGl2ZSBsb2NhdGlvbiBpcyByZXNvbHZlZCBwcm9wZXJseS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGl2ZVNpbmdsZUZpbGVMb2NhdGlvbigpCi0gIHsKLSAgICBTdHJpbmcgZmlsZUxvYyA9ICJmaWxlLndzZGwiOwotICAgIFN0cmluZyByZXNvbHZlZExvY2F0aW9uID0gKCJmaWxlOi8vLyIgKyBCQVNFX0RJUiArIGZpbGVMb2MpLnJlcGxhY2UoJ1xcJywnLycpOwotICAgIFdTRExWYWxpZGF0ZVRhc2sgd3NkbFZhbGlkYXRlVGFzayA9IG5ldyBXU0RMVmFsaWRhdGVUYXNrKCk7Ci0gICAgd3NkbFZhbGlkYXRlVGFzay5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgIHdzZGxWYWxpZGF0ZVRhc2suc2V0RmlsZShmaWxlTG9jKTsKLSAgICBMaXN0IGZpbGVMaXN0ID0gd3NkbFZhbGlkYXRlVGFzay5nZXRGaWxlTGlzdCgpOwotICAgIGFzc2VydEVxdWFscygiVGhlIGZpbGUgbGlzdCBkb2VzIG5vdCBjb250YWluIG9ubHkgb25lIGZpbGUuIiwgMSwgZmlsZUxpc3Quc2l6ZSgpKTsKLSAgICAvLyBUaGUgZmlsZSBsb2NhdGlvbnMgYXJlIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlIHRvIGF2b2lkIGRyaXZlIGxldHRlciBjYXNlIGRpZmZlcmVuY2VzIG9uIHdpbmRvd3MuIGllLiBDIHZzIGMuCi0gICAgYXNzZXJ0RXF1YWxzKCJUaGUgZmlsZSBsb2NhdGlvbiAnIiArIGZpbGVMaXN0LmdldCgwKSArICInIGlzIG5vdCBjb3JyZWN0bHkgcmVzb2x2ZWQgdG8gdGhlIGJhc2UgbG9jYXRpb24uIiwgcmVzb2x2ZWRMb2NhdGlvbi50b0xvd2VyQ2FzZSgpLCAoKFN0cmluZylmaWxlTGlzdC5nZXQoMCkpLnRvTG93ZXJDYXNlKCkpOwotICAgIAotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCB0aGF0IGEgc2luZ2xlIGZpbGUgd2l0aCBhbiBhYnNvbHV0ZSBsb2NhdGlvbiBpcyByZXNvbHZlZCBwcm9wZXJseS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZVNpbmdsZUZpbGVMb2NhdGlvbigpCi0gIHsKLSAgICBTdHJpbmcgZmlsZUxvYyA9IEJBU0VfRElSICsgImZpbGUud3NkbCI7Ci0gICAgU3RyaW5nIHJlc29sdmVkTG9jYXRpb24gPSAoRklMRV9QUk9UT0NPTCArIGZpbGVMb2MpLnJlcGxhY2UoJ1xcJywnLycpOwotICAgIFdTRExWYWxpZGF0ZVRhc2sgd3NkbFZhbGlkYXRlVGFzayA9IG5ldyBXU0RMVmFsaWRhdGVUYXNrKCk7Ci0gICAgd3NkbFZhbGlkYXRlVGFzay5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgIHdzZGxWYWxpZGF0ZVRhc2suc2V0RmlsZShmaWxlTG9jKTsKLSAgICBMaXN0IGZpbGVMaXN0ID0gd3NkbFZhbGlkYXRlVGFzay5nZXRGaWxlTGlzdCgpOwotICAgIGFzc2VydEVxdWFscygiVGhlIGZpbGUgbGlzdCBkb2VzIG5vdCBjb250YWluIG9ubHkgb25lIGZpbGUuIiwgMSwgZmlsZUxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIlRoZSBmaWxlIGxvY2F0aW9uICciICsgZmlsZUxvYyArICInIGlzIG1vZGlmaWVkLiIsIHJlc29sdmVkTG9jYXRpb24udG9Mb3dlckNhc2UoKSwgKChTdHJpbmcpZmlsZUxpc3QuZ2V0KDApKS50b0xvd2VyQ2FzZSgpKTsKLSAgICAKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgdGhhdCBhIHNpbmdsZSBmaWxlIHdpdGggYW4gYWJzb2x1dGUsIHJlbW90ZSBsb2NhdGlvbiBpcyByZXNvbHZlZCBwcm9wZXJseS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZVNpbmdsZUZpbGVSZW1vdGVMb2NhdGlvbigpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRMb2NhdGlvbiA9ICJodHRwOi8vd3d3LndzLWkub3JnL1NhbXBsZUFwcGxpY2F0aW9ucy9TdXBwbHlDaGFpbk1hbmFnZW1lbnQvMjAwMy0wNy9DYXRhbG9nLndzZGwiOwotICAgIFN0cmluZyBmaWxlTG9jID0gImh0dHA6Ly93d3cud3MtaS5vcmcvU2FtcGxlQXBwbGljYXRpb25zL1N1cHBseUNoYWluTWFuYWdlbWVudC8yMDAzLTA3L0NhdGFsb2cud3NkbCI7Ci0gICAgV1NETFZhbGlkYXRlVGFzayB3c2RsVmFsaWRhdGVUYXNrID0gbmV3IFdTRExWYWxpZGF0ZVRhc2soKTsKLSAgICB3c2RsVmFsaWRhdGVUYXNrLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgd3NkbFZhbGlkYXRlVGFzay5zZXRGaWxlKGZpbGVMb2MpOwotICAgIExpc3QgZmlsZUxpc3QgPSB3c2RsVmFsaWRhdGVUYXNrLmdldEZpbGVMaXN0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJUaGUgZmlsZSBsaXN0IGRvZXMgbm90IGNvbnRhaW4gb25seSBvbmUgZmlsZS4iLCAxLCBmaWxlTGlzdC5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygiVGhlIGZpbGUgbG9jYXRpb24gJyIgKyBmaWxlTG9jICsgIicgaXMgbW9kaWZpZWQuIiwgcmVzb2x2ZWRMb2NhdGlvbi50b0xvd2VyQ2FzZSgpLCAoKFN0cmluZylmaWxlTGlzdC5nZXQoMCkpLnRvTG93ZXJDYXNlKCkpOwotICAgIAotICB9Ci0gIAotLyoqCi0gICAqIFRlc3QgdGhhdCBhIHNpbmdsZSBmaWxlIGluIGEgZmlsZXNldCB3aXRoIGEgcmVsYXRpdmUgbG9jYXRpb24gaXMgcmVzb2x2ZWQgcHJvcGVybHkKLSAgICogd2hlbiBubyBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlU2luZ2xlRmlsZUluRmlsZXNldE5vRGlyU3BlY2lmaWVkKCkKLSAgewotICAgIFN0cmluZyBmaWxlTG9jID0gIkVtcHR5LndzZGwiOwotICAgIFN0cmluZyBiYXNlX2RpciA9IEJBU0VfRElSICsgU0FNUExFU19ESVIgKyAiV1NETCIgKyBGaWxlLnNlcGFyYXRvciArICJTZWxmQ29udGFpbmVkIjsKLSAgICBTdHJpbmcgcmVzb2x2ZWRMb2NhdGlvbiA9ICgiZmlsZTovLy8iICsgYmFzZV9kaXIgKyAiLyIgKyBmaWxlTG9jKS5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICBiYXNlX2RpciA9IGJhc2VfZGlyLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgIAotICAgIFdTRExWYWxpZGF0ZVRhc2sgd3NkbFZhbGlkYXRlVGFzayA9IG5ldyBXU0RMVmFsaWRhdGVUYXNrKCk7Ci0gICAgd3NkbFZhbGlkYXRlVGFzay5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgIAotICAgIEZpbGVTZXQgZmlsZXNldCA9IHdzZGxWYWxpZGF0ZVRhc2suY3JlYXRlRmlsZXNldCgpOwotICAgIGZpbGVzZXQuc2V0UHJvamVjdChwcm9qZWN0KTsKLSAgICBmaWxlc2V0LnNldERpcihuZXcgRmlsZShiYXNlX2RpcikpOwotICAgCi0gICAgRmlsZW5hbWVTZWxlY3RvciBmaWxlbmFtZVNlbGVjdG9yID0gbmV3IEZpbGVuYW1lU2VsZWN0b3IoKTsKLSAgICBmaWxlbmFtZVNlbGVjdG9yLnNldE5hbWUoZmlsZUxvYyk7Ci0gICAgZmlsZXNldC5hZGRGaWxlbmFtZShmaWxlbmFtZVNlbGVjdG9yKTsKLSAgICAvL2ZpbGVzZXQuc2V0RmlsZShuZXcgRmlsZShmaWxlTG9jKSk7Ci0gICAgCi0gICAgTGlzdCBmaWxlTGlzdCA9IHdzZGxWYWxpZGF0ZVRhc2suZ2V0RmlsZUxpc3QoKTsKLSAgICBhc3NlcnRFcXVhbHMoIlRoZSBmaWxlIGxpc3QgZG9lcyBub3QgY29udGFpbiBvbmx5IG9uZSBmaWxlLiIsIDEsIGZpbGVMaXN0LnNpemUoKSk7Ci0gICAgLy8gVGhlIGZpbGUgbG9jYXRpb25zIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSB0byBhdm9pZCBkcml2ZSBsZXR0ZXIgY2FzZSBkaWZmZXJlbmNlcyBvbiB3aW5kb3dzLiBpZS4gQyB2cyBjLgotICAgIGFzc2VydEVxdWFscygiVGhlIGZpbGUgbG9jYXRpb24gJyIgKyBmaWxlTGlzdC5nZXQoMCkgKyAiJyBpcyBub3QgY29ycmVjdGx5IHJlc29sdmVkIHRvIHRoZSBiYXNlIGxvY2F0aW9uLiIsIHJlc29sdmVkTG9jYXRpb24udG9Mb3dlckNhc2UoKSwgKChTdHJpbmcpZmlsZUxpc3QuZ2V0KDApKS50b0xvd2VyQ2FzZSgpKTsKLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9BbGxXU0RMVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvQWxsV1NETFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NzQxYjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9BbGxXU0RMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwucmVzb2x2ZXIuVVJJUmVzb2x2ZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwudWkuYW50LldTRExWYWxpZGF0ZVRlc3Q7Ci0vKioKLSAqIFRoZSByb290IHRlc3Qgc3VpdGUgdGhhdCBjb250YWlucyBhbGwgb3RoZXIgV1NETCB2YWxpZGF0b3IgdGVzdCBzdWl0ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxXU0RMVGVzdHMgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlCi17Ci0gIC8qKgotICAgKiBDcmVhdGUgdGhpcyB0ZXN0IHN1aXRlLgotICAgKiAKLSAgICogQHJldHVybiBUaGlzIHRlc3Qgc3VpdGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBBbGxXU0RMVGVzdHMoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgQWxsV1NETFRlc3RzKCkKLSAgewotICAgIHN1cGVyKCJBbGxXU0RMVGVzdHMiKTsKLSAgICBhZGRUZXN0KFhTRFRlc3Quc3VpdGUoKSk7Ci0gICAgYWRkVGVzdChXU0RMVGVzdC5zdWl0ZSgpKTsKLSAgICBhZGRUZXN0KFBhdGhzVGVzdC5zdWl0ZSgpKTsKLSAgICBhZGRUZXN0KFVSSVJlc29sdmVyVGVzdC5zdWl0ZSgpKTsKLSAgICBhZGRUZXN0KFdTRExWYWxpZGF0ZVRlc3Quc3VpdGUoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL0Jhc2VUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9CYXNlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3NjU5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL0Jhc2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5Qcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wbHVnaW4uV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwudWkud3NpLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC51aS5lY2xpcHNlLldTRExWYWxpZGF0b3I7Ci0KLS8qKgotICogQmFzZSB0ZXN0IGNhc2UgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgbWV0aG9kcyB0byAKLSAqIC0gY3JlYXRlIGxvZ3MKLSAqIC0gcmVhZCBmcm9tIGxvZ3MKLSAqIC0gcnVuIGxvZyBjb21wYXJpc29uIHRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQotewotICBwcm90ZWN0ZWQgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAKLSAgcHJvdGVjdGVkIFN0cmluZyBQTFVHSU5fQUJTT0xVVEVfUEFUSDsKLSAgcHJvdGVjdGVkIFN0cmluZyBTQU1QTEVTX0RJUiA9ICJ0ZXN0cmVzb3VyY2VzL3NhbXBsZXMvIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBHRU5FUkFURURfUkVTVUxUU19ESVIgPSAidGVzdHJlc291cmNlcy9nZW5lcmF0ZWRSZXN1bHRzLyI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgSURFQUxfUkVTVUxUU19ESVIgPSAidGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvIjsKLSAgcHJvdGVjdGVkIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTiA9ICJyZXN1bHRzLmxvZyI7Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzIjsKLSAgcHJpdmF0ZSBXU0RMVmFsaWRhdG9yIHZhbGlkYXRvciA9IFdTRExWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQotICB7Ci0gICAgUExVR0lOX0FCU09MVVRFX1BBVEggPSBXU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4uZ2V0SW5zdGFsbFVSTCgpOy8vZ2V0UGx1Z2luTG9jYXRpb24oKTsKLSAgICAKLSAgICAvLyBTZXQgdGhlIFdTLUkgcHJlZmVyZW5jZSB0byBpZ25vcmUgc28gb25seSBXU0RMIGVycm9ycyB3aWxsIGJlIHRlc3RlZC4KLSAgICBXU1VJUGx1Z2luIHdzdWkgPSBXU1VJUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0gICAgUGVyc2lzdGVudFdTSUNvbnRleHQgd3NpY29udGV4dCA9IHdzdWkuZ2V0V1NJU1NCUENvbnRleHQoKTsKLSAgICB3c2ljb250ZXh0LnVwZGF0ZVdTSUNvbXBsaWFuY2VzKFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJKTsKLSAgICB3c2ljb250ZXh0ID0gd3N1aS5nZXRXU0lBUENvbnRleHQoKTsKLSAgICB3c2ljb250ZXh0LnVwZGF0ZVdTSUNvbXBsaWFuY2VzKFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJ1biBhIHZhbGlkYXRvciB0ZXN0LiBUaGUgdGVzdCB3aWxsIHJ1biB0aGUgdmFsaWRhdG9yLCBsb2cgdGhlIHJlc3VsdHMgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdHMKLSAgICogd2l0aCB0aGUgaWRlYWwgcmVzdWx0cy4gVGhlIHRlc3Qgd2lsbCBvbmx5IHBhc3MgaWYgdGhlIHR3byBsb2cgZmlsZXMgYXJlIHRoZSBzYW1lLgotICAgKiAKLSAgICogQHBhcmFtIHRlc3RmaWxlIFRoZSBmaWxlIHRvIHJ1biB0aGUgdmFsaWRhdG9yIHRlc3Qgb24uCi0gICAqIEBwYXJhbSBsb2dsb2NhdGlvbiBUaGUgbG9jYXRpb24gdG8gY3JlYXRlIHRoZSBsb2cgZmlsZS4KLSAgICogQHBhcmFtIGlkZWFsbG9nbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBpZGVhbCBsb2cgZmlsZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1blRlc3QoU3RyaW5nIHRlc3RmaWxlLCBTdHJpbmcgbG9nbG9jYXRpb24sIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uKQotICB7Ci0gICAgSVZhbGlkYXRpb25SZXBvcnQgdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHRlc3RmaWxlKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBjcmVhdGVMb2cobG9nbG9jYXRpb24sIHZhbHJlcG9ydCk7Ci0gICAgICBTdHJpbmcgZ2VuZXJhdGVkTG9nID0gZ2V0U3RyaW5nRnJvbUZpbGUobG9nbG9jYXRpb24pOwotICAgICAgU3RyaW5nIGlkZWFsTG9nID0gZ2V0U3RyaW5nRnJvbUZpbGUoaWRlYWxsb2dsb2NhdGlvbik7Ci0gICAgICBhc3NlcnRFcXVhbHMoaWRlYWxMb2csIGdlbmVyYXRlZExvZyk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZmFpbCgiQ291bGQgbm90IGNvbXBhcmUgbG9nIGZpbGVzIik7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gaWYgc3VjY2Vzc2Z1bC4KLSAgICogQHRocm93cyBFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBjcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YWlvbiBvZiB0aGUgZmlsZS4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGdldFN0cmluZ0Zyb21GaWxlKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgaWYoZmlsZW5hbWUuc3RhcnRzV2l0aCgiZmlsZToiKSkKLSAgCXsKLSAgCSAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoNik7Ci0gIAkgIHdoaWxlKGZpbGVuYW1lLnN0YXJ0c1dpdGgoIlxcIikgfHwgZmlsZW5hbWUuc3RhcnRzV2l0aCgiLyIpKQotICAJICB7Ci0gIAkgIAlmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygxKTsKLSAgCSAgfQotICAJfQotICAgIFN0cmluZ0J1ZmZlciBmaWxlc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZnJlYWRlciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0gICAgICBidWZyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKLSAgICAgIHdoaWxlIChidWZyZWFkZXIucmVhZHkoKSkKLSAgICAgIHsKLSAgICAgICAgZmlsZXN0cmluZy5hcHBlbmQoYnVmcmVhZGVyLnJlYWRMaW5lKCkgKyAiXG4iKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0gICAgfSBmaW5hbGx5Ci0gICAgewotICAgICAgYnVmcmVhZGVyLmNsb3NlKCk7Ci0gICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbGVzdHJpbmcudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIGxvZyBmaWxlIGZvciBhbiBYU0QgdGVzdC4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9nIGZpbGUgdG8gY3JlYXRlLgotICAgKiBAcGFyYW0gdmFscmVwb3J0IFRoZSB2YWxpZGF0aW9uIHJlcG9ydCBmb3IgdGhpcyBmaWxlLgotICAgKiBAcmV0dXJuIFRoZSBmaWxlIGNvbnRlbnRzIGFzIGEgc3RyaW5nIGlmIHN1Y2Nlc3NmdWwgb3IgbnVsbCBpZiBub3Qgc3VjY2Vzc2Z1bC4KLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUxvZyhTdHJpbmcgZmlsZW5hbWUsIElWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCkKLSAgewotICAgIGlmKGZpbGVuYW1lLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0gIAl7Ci0gIAkgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDYpOwotICAJICB3aGlsZShmaWxlbmFtZS5zdGFydHNXaXRoKCJcXCIpIHx8IGZpbGVuYW1lLnN0YXJ0c1dpdGgoIi8iKSkKLSAgCSAgewotICAJICAJZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMSk7Ci0gIAkgIH0KLSAgCX0KLSAgICAgSVZhbGlkYXRpb25NZXNzYWdlW10gdmFsbWVzc2FnZXMgPSB2YWxyZXBvcnQuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gICAgIGludCBudW1tZXNzYWdlcyA9IHZhbG1lc3NhZ2VzLmxlbmd0aDsvL3ZhbGlkYXRvci5nZXRFcnJvcnMoKS5zaXplKCkgKyB2YWxpZGF0b3IuZ2V0V2FybmluZ3MoKS5zaXplKCk7Ci0gICAgIFN0cmluZ0J1ZmZlciBlcnJvcnNTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgIFN0cmluZ0J1ZmZlciB3YXJuaW5nc1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgaW50IG51bWVycm9ycyA9IDA7Ci0gICAgIGludCBudW13YXJuaW5ncyA9IDA7Ci0gICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1tZXNzYWdlczsgaSsrKQotICAgICB7Ci0gICAgICAgSVZhbGlkYXRpb25NZXNzYWdlIHZhbG1lcyA9IHZhbG1lc3NhZ2VzW2ldOwotICAgICAgIGlmKHZhbG1lcy5nZXRTZXZlcml0eSgpID09IElWYWxpZGF0aW9uTWVzc2FnZS5TRVZfV0FSTklORykKLSAgICAgICB7Ci0gICAgICAgICBudW13YXJuaW5ncysrOwotICAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgYW55IGZpbGUgcmVmZXJlbmNlcyBtYWtlIHRoZW0gcmVsYXRpdmUuCi0gICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHZhbG1lcy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlQWxsKCInW14nXSoiICsgUExVR0lOX05BTUUgKyAiW14nL10qLyIsICInIik7Ci0gICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlQWxsKCJbKF1bXihdKiIgKyBQTFVHSU5fTkFNRSArICJbXicvXSovIiwgIlsoXSIpOwotICAgICAgICAgd2FybmluZ3NTdHJpbmcuYXBwZW5kKG1lc3NhZ2UgKyAiIFsiICsgdmFsbWVzLmdldExpbmUoKSArIiwgIiArIHZhbG1lcy5nZXRDb2x1bW4oKSArIl1cbiIpOwotICAgICAgICAgd2FybmluZ3NTdHJpbmcuYXBwZW5kKGNyZWF0ZU5lc3RlZE1lc3NhZ2VTdHJpbmcodmFsbWVzLmdldE5lc3RlZE1lc3NhZ2VzKCkpKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIG51bWVycm9ycysrOwotICAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgYW55IGZpbGUgcmVmZXJlbmNlcyBtYWtlIHRoZW0gcmVsYXRpdmUuCi0gICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHZhbG1lcy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlQWxsKCInW14nXSoiICsgUExVR0lOX05BTUUgKyAiW14nL10qLyIsICInIik7Ci0gICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlQWxsKCJbKF1bXihdKiIgKyBQTFVHSU5fTkFNRSArICJbXicvXSovIiwgIigiKTsKLSAgICAgICAgIGVycm9yc1N0cmluZy5hcHBlbmQobWVzc2FnZSArICIgWyIgKyB2YWxtZXMuZ2V0TGluZSgpICsiLCAiICsgdmFsbWVzLmdldENvbHVtbigpICsiXVxuIik7Ci0gICAgICAgICBlcnJvcnNTdHJpbmcuYXBwZW5kKGNyZWF0ZU5lc3RlZE1lc3NhZ2VTdHJpbmcodmFsbWVzLmdldE5lc3RlZE1lc3NhZ2VzKCkpKTsKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgU3RyaW5nQnVmZmVyIGxvZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgbG9nLmFwcGVuZCgibnVtYmVyIG9mIGVycm9ycyAgICAgIDogIiArIG51bWVycm9ycyArICJcbiIpOwotICAgICBsb2cuYXBwZW5kKCJudW1iZXIgb2Ygd2FybmluZ3MgICAgOiAiICsgbnVtd2FybmluZ3MgKyAiXG5cbiIpOwotICAgICBsb2cuYXBwZW5kKCItLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgIGlmKG51bWVycm9ycyA9PSAwKQotICAgICB7Ci0gICAgICAgbG9nLmFwcGVuZCgiKG5vbmUpXG4iKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICBsb2cuYXBwZW5kKGVycm9yc1N0cmluZy50b1N0cmluZygpKTsKLSAgICAgfQotICAgICBsb2cuYXBwZW5kKCItLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgIGlmKG51bXdhcm5pbmdzID09IDApCi0gICAgIHsKLSAgICAgICBsb2cuYXBwZW5kKCIobm9uZSlcbiIpOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIGxvZy5hcHBlbmQod2FybmluZ3NTdHJpbmcudG9TdHJpbmcoKSk7Ci0gICAgIH0KLSAgICAgbG9nLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgCi0gICAgIERhdGFPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbnVsbDsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIGxvZ2ZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0gICAgICBGaWxlIHBhcmVudCA9IGxvZ2ZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIAotICAJewotICAJICBwYXJlbnQubWtkaXJzKCk7Ci0gIAl9Ci0gICAgICBpZihsb2dmaWxlLmV4aXN0cygpKQotICAgICAgewotICAgICAgICBsb2dmaWxlLmRlbGV0ZSgpOwotICAgICAgfQotICAgICAgbG9nZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAKLSAgICAgIG91dFN0cmVhbSA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lLCB0cnVlKSk7Ci0gICAgICBvdXRTdHJlYW0ud3JpdGVCeXRlcyhsb2cudG9TdHJpbmcoKSk7Ci0gICAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLQotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gSWYgd2UgY2FuJ3Qgd3JpdGUgdGhlIGxvZyB0aGVuIGNsZWFyIHRoZSBsb2cuCi0gICAgICBsb2cuZGVsZXRlKDAsIGxvZy5sZW5ndGgoKSk7Ci0gICAgfQotICAgIHJldHVybiBsb2cudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlTmVzdGVkTWVzc2FnZVN0cmluZyhMaXN0IG5lc3RlZE1lc3NhZ2VzKQotICB7Ci0gICAgcmV0dXJuIGNyZWF0ZU5lc3RlZE1lc3NhZ2VTdHJpbmcobmVzdGVkTWVzc2FnZXMsIDApOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBjcmVhdGVOZXN0ZWRNZXNzYWdlU3RyaW5nKExpc3QgbmVzdGVkTWVzc2FnZXMsIGludCBkZXB0aCkKLSAgewotICAgIGlmKG5lc3RlZE1lc3NhZ2VzICE9IG51bGwgJiYgbmVzdGVkTWVzc2FnZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmcgbWVzc2FnZVN0cmluZyA9ICIiOwotICAgICAgSXRlcmF0b3IgbmVzdGVkTWVzSXRlciA9IG5lc3RlZE1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZShuZXN0ZWRNZXNJdGVyLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgSVZhbGlkYXRpb25NZXNzYWdlIG5lc3ZhbG1lcyA9IChJVmFsaWRhdGlvbk1lc3NhZ2UpbmVzdGVkTWVzSXRlci5uZXh0KCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBkZXB0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgbWVzc2FnZVN0cmluZyArPSAiICI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgYW55IGZpbGUgcmVmZXJlbmNlcyBtYWtlIHRoZW0gcmVsYXRpdmUuCi0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gbmVzdmFsbWVzLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZUFsbCgiJ1teJ10qIiArIFBMVUdJTl9OQU1FICsgIlteJy9dKi8iLCAiJyIpOwotICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlQWxsKCJbKF1bXihdKiIgKyBQTFVHSU5fTkFNRSArICJbXicvXSovIiwgIlsoXSIpOwotICAgICAgICBtZXNzYWdlU3RyaW5nICs9ICgiLT4gIiArIG1lc3NhZ2UgKyAiIFsiICsgbmVzdmFsbWVzLmdldExpbmUoKSArIiwgIiArIG5lc3ZhbG1lcy5nZXRDb2x1bW4oKSArIl1cbiIpOwotICAgICAgICBtZXNzYWdlU3RyaW5nICs9IGNyZWF0ZU5lc3RlZE1lc3NhZ2VTdHJpbmcobmVzdmFsbWVzLmdldE5lc3RlZE1lc3NhZ2VzKCksIGRlcHRoICsgMSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWVzc2FnZVN0cmluZzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nW10gZmlsZXMsIFN0cmluZ1tdIHByb2plY3ROYXR1cmVzLCBJUHJvamVjdFtdIHJlZmVyZW5jZWRQcm9qZWN0cykKLSAgewotICAgIGZpbmFsIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIGlmKCFwcm9qZWN0LmV4aXN0cygpKQotICAgIHsKLSAgICAgIHRyeQotCSAgewotICAgICAgICBwcm9qZWN0LmNyZWF0ZShudWxsKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLQkgIHsKLSAgICAgICAgZmFpbCgiQ291bGQgbm90IGNyZWF0ZSBwcm9qZWN0ICIgKyBwcm9qZWN0TmFtZSArIGUpOwotICAgICAgfSAKLSAgICB9Ci0gICAgaWYoIXByb2plY3QuaXNPcGVuKCkpCi0gICAgewotICAgICAgdHJ5Ci0JICB7Ci0gICAgICAgIHByb2plY3Qub3BlbihudWxsKTsKLQkgIH0KLSAgICAgIGNhdGNoKENvcmVFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZmFpbCgiQ291bGQgbm90IG9wZW4gcHJvamVjdCAiICsgcHJvamVjdE5hbWUgKyBlKTsKLQkgIH0KLSAgICB9Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBwcm9qZWN0RGVzY3JpcHRpb24gPSBuZXcgUHJvamVjdERlc2NyaXB0aW9uKCk7Ci0gICAgICBwcm9qZWN0RGVzY3JpcHRpb24uc2V0TmFtZShwcm9qZWN0TmFtZSk7Ci0gICAgICBwcm9qZWN0RGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKHByb2plY3ROYXR1cmVzKTsKLSAgICAgIGlmKHJlZmVyZW5jZWRQcm9qZWN0cyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvamVjdERlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZlcmVuY2VkUHJvamVjdHMpOwotICAgICAgfQotICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihwcm9qZWN0RGVzY3JpcHRpb24sIG51bGwpOwotICAgIH0KLSAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBmYWlsKCJVbmFibGUgdG8gc2V0IHByb2plY3QgcHJvcGVydGllcyBmb3IgcHJvamVjdCAiICsgcHJvamVjdE5hbWUgKyAiLiAiICsgZSk7Ci0gICAgfQotICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgdHJ5Ci0gICB7Ci0gICAgIGphdmFQcm9qZWN0Lm9wZW4obnVsbCk7Ci0gICAgIExpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgZW50cmllcy5hZGQoSmF2YUNvcmUubmV3U291cmNlRW50cnkobmV3IFBhdGgoImRlZmF1bHQiKSkpOwotICAgICAKLSAgICAgaWYocmVmZXJlbmNlZFByb2plY3RzICE9IG51bGwpCi0gICAgIHsKLSAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlZFByb2plY3RzLmxlbmd0aDsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIGVudHJpZXMuYWRkKEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShyZWZlcmVuY2VkUHJvamVjdHNbaV0uZ2V0TG9jYXRpb24oKSkpOwotICAgICAgIH0KLSAgICAgfQotICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoKElDbGFzc3BhdGhFbnRyeVtdKWVudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSksIG51bGwpOwotICAgfQotICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICB7Ci0gICAgIGZhaWwoIkNhbid0IG9wZW4gSmF2YSBwcm9qZWN0OiAiICsgZSk7Ci0gICB9Ci0KLSAgICBpZihmaWxlcyAhPSBudWxsKQotICAgIHsKLSAgICAgIGludCBudW1maWxlcyA9IGZpbGVzLmxlbmd0aDsKLSAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1maWxlczsgaSsrKQotICAgICAgewotICAgICAgICB0cnkKLQkJewotICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVzW2ldKTsKLSAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgIElGaWxlIGlGaWxlID0gcHJvamVjdC5nZXRGaWxlKGZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBpZighaUZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaUZpbGUuY3JlYXRlKGluLCB0cnVlLCBudWxsKTsKLSAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgfQotCQl9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCSAgZmFpbCgiVW5hYmxlIHRvIGxvY2F0ZSBmaWxlICIgKyBmaWxlc1tpXSk7Ci0JCX0gCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm9qZWN0OwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL1BhdGhzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9QYXRoc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwMTAzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL1BhdGhzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVGVzdHMgZm9yIGZpbGUgcGF0aHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoc1Rlc3QgZXh0ZW5kcyBCYXNlVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgUEFUSFNfRElSID0gIlBhdGhzLyI7Ci0gIAotICAvKioKLSAgICogQ3JlYXRlIGEgdGVzdHMgc3VpdGUgZnJvbSB0aGlzIHRlc3QgY2xhc3MuCi0gICAqIAotICAgKiBAcmV0dXJuIEEgdGVzdCBzdWl0ZSBjb250YWluaW5nIHRoaXMgdGVzdCBjbGFzcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gIHsKLSAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShQYXRoc1Rlc3QuY2xhc3MpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkKLSAgewotICAgIHN1cGVyLnNldFVwKCk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBEZWxldGUgdGhlIHNpbXBsZSBwcm9qZWN0IGZvciBJbXBvcnRlZFNjaGVtYVdpdGhTY2hlbWFJbXBvcnQgdGVzdAotICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCAvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNwYWNlSW5QYXRoVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlNwYWNlSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlNwYWNlIEluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlNwYWNlIEluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiU3BhY2UgSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aEludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNwYWNlSW5QYXRoSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiU3BhY2VJblBhdGhJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZSBJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZSBJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlNwYWNlIEluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9BbmdsZUhhdF5JblBhdGgvQW5nbGVIYXRJblBhdGhWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QW5nbGVIYXRJblBhdGhWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiQW5nbGVIYXRJblBhdGhWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXReSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXReSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJBbmdsZUhhdF5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QW5nbGVIYXRJblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJBbmdsZUhhdEluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0XkluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0XkluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXReSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEFuZ2xlSGF0SW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJBbmdsZUhhdF5JbkZpbGVuYW1lVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0QW5nbGVIYXRJbkZpbGVuYW1lSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiQW5nbGVIYXReSW5GaWxlbmFtZUludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkFuZ2xlSGF0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQW5nbGVIYXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0Nsb3NlQnJhY2tldClJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdENsb3NlQnJhY2tldEluUGF0aFZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJDbG9zZUJyYWNrZXRJblBhdGhWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0KUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldClJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldClJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvQ2xvc2VCcmFja2V0KUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUJyYWNrZXRJblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJDbG9zZUJyYWNrZXRJblBhdGhJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJDbG9zZUJyYWNrZXQpSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0KUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0KUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldClJbkZpbGVuYW1lVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdENsb3NlQnJhY2tldEluRmlsZW5hbWVWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiQ2xvc2VCcmFja2V0KUluRmlsZW5hbWVWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXQpSW5GaWxlbmFtZUludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdENsb3NlQnJhY2tldEluRmlsZW5hbWVJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJDbG9zZUJyYWNrZXQpSW5GaWxlbmFtZUludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkNsb3NlQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJDbG9zZUJyYWNrZXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJDbG9zZUJyYWNrZXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RGFzaEluUGF0aFZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJEYXNoSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkRhc2gtSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRGFzaC1JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkRhc2gtSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3REYXNoSW5QYXRoSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiRGFzaEluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkRhc2gtSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRGFzaC1JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkRhc2gtSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZVZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3REYXNoSW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJEYXNoLUluRmlsZW5hbWVWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiRGFzaEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJEYXNoSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRGFzaEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RGFzaEluRmlsZW5hbWVJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJEYXNoLUluRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJEYXNoSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkRhc2hJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJEYXNoSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9FeGNsYW1hdGlvbiFJblBhdGgvRXhjbGFtYXRpb25JblBhdGhWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RXhjbGFtYXRpb25JblBhdGhWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiRXhjbGFtYXRpb25JblBhdGhWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb24hSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb24hSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJFeGNsYW1hdGlvbiFJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvRXhjbGFtYXRpb24hSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RXhjbGFtYXRpb25JblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJFeGNsYW1hdGlvbkluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uIUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uIUluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb24hSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvbiFJbkZpbGVuYW1lVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEV4Y2xhbWF0aW9uSW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJFeGNsYW1hdGlvbiFJbkZpbGVuYW1lVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb25JbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvbiFJbkZpbGVuYW1lSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RXhjbGFtYXRpb25JbkZpbGVuYW1lSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiRXhjbGFtYXRpb24hSW5GaWxlbmFtZUludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIkV4Y2xhbWF0aW9uSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiRXhjbGFtYXRpb25JbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL09wZW5CcmFja2V0KEluUGF0aC9PcGVuQnJhY2tldEluUGF0aFZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RPcGVuQnJhY2tldEluUGF0aFZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJPcGVuQnJhY2tldEluUGF0aFZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJPcGVuQnJhY2tldChJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJPcGVuQnJhY2tldChJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIk9wZW5CcmFja2V0KEluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9PcGVuQnJhY2tldChJblBhdGgvT3BlbkJyYWNrZXRJblBhdGhJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RPcGVuQnJhY2tldEluUGF0aEludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIk9wZW5CcmFja2V0SW5QYXRoSW52YWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXQoSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXQoSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJPcGVuQnJhY2tldChJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0KEluRmlsZW5hbWVWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkJyYWNrZXRJbkZpbGVuYW1lVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIk9wZW5CcmFja2V0KEluRmlsZW5hbWVWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJPcGVuQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0KEluRmlsZW5hbWVJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RPcGVuQnJhY2tldEluRmlsZW5hbWVJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJPcGVuQnJhY2tldChJbkZpbGVuYW1lSW52YWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiT3BlbkJyYWNrZXRJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJPcGVuQnJhY2tldEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UGVyaW9kSW5QYXRoVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlBlcmlvZEluUGF0aFZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2QuSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiUGVyaW9kLkluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiUGVyaW9kLkluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aEludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFBlcmlvZEluUGF0aEludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlBlcmlvZEluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlBlcmlvZC5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2QuSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2QuSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UGVyaW9kSW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJQZXJpb2QuSW5GaWxlbmFtZVZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJQZXJpb2RJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiUGVyaW9kSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiUGVyaW9kSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UGVyaW9kSW5GaWxlbmFtZUludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlBlcmlvZC5JbkZpbGVuYW1lSW52YWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiUGVyaW9kSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlBlcmlvZEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlBlcmlvZEluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvUXVvdGUnSW5QYXRoL1F1b3RlSW5QYXRoVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFF1b3RlSW5QYXRoVmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlF1b3RlSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlJ0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlJ0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiUXVvdGUnSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1F1b3RlJ0luUGF0aC9RdW90ZUluUGF0aEludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFF1b3RlSW5QYXRoSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUXVvdGVJblBhdGhJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZSdJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZSdJblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlJ0luUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGUnSW5GaWxlbmFtZVZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RRdW90ZUluRmlsZW5hbWVWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUXVvdGUnSW5GaWxlbmFtZVZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGUnSW5GaWxlbmFtZUludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFF1b3RlSW5GaWxlbmFtZUludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlF1b3RlJ0luRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJRdW90ZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlF1b3RlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZVZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTcGFjZUluRmlsZW5hbWVWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiU3BhY2UgSW5GaWxlbmFtZVZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlNwYWNlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZUludmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNwYWNlSW5GaWxlbmFtZUludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlNwYWNlIEluRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJTcGFjZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlNwYWNlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9QYXRocy9UaWxkZX5JblBhdGgvVGlsZGVJblBhdGhWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VGlsZGVJblBhdGhWYWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiVGlsZGVJblBhdGhWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGV+SW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGV+SW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJUaWxkZX5JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VGlsZGVJblBhdGhJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJUaWxkZUluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlfkluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlfkluUGF0aC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGV+SW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lVmFsaWQud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFRpbGRlSW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJUaWxkZX5JbkZpbGVuYW1lVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGVJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VGlsZGVJbkZpbGVuYW1lSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiVGlsZGV+SW5GaWxlbmFtZUludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlRpbGRlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVGlsZGVJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhWYWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VW5kZXJzY29yZUluUGF0aFZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJVbmRlcnNjb3JlSW5QYXRoVmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlVuZGVyc2NvcmVfSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZV9JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlVuZGVyc2NvcmVfSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RVbmRlcnNjb3JlSW5QYXRoSW52YWxpZCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiVW5kZXJzY29yZUluUGF0aEludmFsaWQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgUEFUSFNfRElSICsgIlVuZGVyc2NvcmVfSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZV9JblBhdGgvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlVuZGVyc2NvcmVfSW5QYXRoLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZVZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RVbmRlcnNjb3JlSW5GaWxlbmFtZVZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJVbmRlcnNjb3JlX0luRmlsZW5hbWVWYWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJVbmRlcnNjb3JlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBQQVRIU19ESVIgKyAiVW5kZXJzY29yZUluRmlsZW5hbWUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lSW52YWxpZC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VW5kZXJzY29yZUluRmlsZW5hbWVJbnZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJVbmRlcnNjb3JlX0luRmlsZW5hbWVJbnZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFBBVEhTX0RJUiArICJVbmRlcnNjb3JlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgUEFUSFNfRElSICsgIlVuZGVyc2NvcmVJbkZpbGVuYW1lLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFBBVEhTX0RJUiArICJVbmRlcnNjb3JlSW5GaWxlbmFtZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvV1NETFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvV1NETFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3OGYwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL1dTRExUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBXU0RMIHZhbGlkYXRpb24gdGVzdHMgZm9yIHRoZSBXU0RMIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFdTRExUZXN0IGV4dGVuZHMgQmFzZVRlc3RDYXNlCi17Ci0gIHByaXZhdGUgU3RyaW5nIFdTRExfRElSID0gIldTREwvIjsKLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSB0ZXN0cyBzdWl0ZSBmcm9tIHRoaXMgdGVzdCBjbGFzcy4KLSAgICogCi0gICAqIEByZXR1cm4gQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhpcyB0ZXN0IGNsYXNzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgewotICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFdTRExUZXN0LmNsYXNzKTsKLSAgfQotICAKLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpCi0gIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gRGVsZXRlIHRoZSBzaW1wbGUgcHJvamVjdCBmb3IgSW1wb3J0ZWRTY2hlbWFXaXRoU2NoZW1hSW1wb3J0IHRlc3QKLSAgICBzdXBlci50ZWFyRG93bigpOwotICB9Ci0gIAotICAvKioKLSAgICogSU1QT1JUIFRFU1RTCi0gICAqLwotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0LndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydCgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0SW52YWxpZE5TLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUygpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnRJbnZhbGlkTlMiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0V1NETFdpdGhXU0RMKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRXU0RMV2l0aFdTREwiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZE5TLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkTlMoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkltcG9ydFdTRExXaXRoV1NETEludmFsaWROUyI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZEZpbGVuYW1lLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkRmlsZW5hbWUoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkltcG9ydFdTRExXaXRoV1NETEludmFsaWRGaWxlbmFtZSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1R5cGVzLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RXU0RMSW1wb3J0aW5nVHlwZXMoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIldTRExJbXBvcnRpbmdUeXBlcyI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvSW1wb3J0Tm9uRXhpc3RhbnRGaWxlLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnROb25FeGlzdGFudEZpbGUoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkltcG9ydE5vbkV4aXN0YW50RmlsZSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvV1NETE5hbWVzcGFjZUFBQS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0V1NETE5hbWVzcGFjZUFBQSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiV1NETE5hbWVzcGFjZUFBQSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvSW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1NjaGVtYUlubXBvcnRpbmdTY2hlbWEud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFdTRExJbXBvcnRpbmdTY2hlbWFJbm1wb3J0aW5nU2NoZW1hKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJXU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML0ltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC9JbXBvcnRYTUxJbnZhbGlkV1NETC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0WE1MSW52YWxpZFdTREwoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkltcG9ydFhNTEludmFsaWRXU0RMIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RMLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0KLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0ltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoLndzZGwKLSAgICovCi0vLyAgcHVibGljIHZvaWQgdGVzdEltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoKCkKLS8vICB7Ci0vLyAgICBmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLS8vICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRpbmdVc2luZ0NsYXNzcGF0aCI7Ci0vLyAgICBTdHJpbmcgaW1wb3J0aW5nZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArICJJbXBvcnRpbmdVc2luZ0NsYXNzcGF0aC53c2RsIjsKLS8vICAgIGltcG9ydGluZ2ZpbGUgPSBpbXBvcnRpbmdmaWxlLnJlcGxhY2UoJy8nLCdcXCcpOwotLy8gICAgaW1wb3J0aW5nZmlsZSA9IGltcG9ydGluZ2ZpbGUuc3Vic3RyaW5nKDUpOwotLy8gICAgU3RyaW5nIGltcG9ydGVkZmlsZSA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvIiArICJJbXBvcnRlZFVzaW5nQ2xhc3NwYXRoLndzZGwiOwotLy8gICAgaW1wb3J0ZWRmaWxlID0gaW1wb3J0ZWRmaWxlLnJlcGxhY2UoJy8nLCdcXCcpOwotLy8gICAgaW1wb3J0ZWRmaWxlID0gaW1wb3J0ZWRmaWxlLnN1YnN0cmluZyg1KTsKLS8vICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotLy8gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0LyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotLy8gICAgCi0vLyAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSAiUHJvamVjdDEiOwotLy8gICAgU3RyaW5nIHByb2plY3ROYW1lMiA9ICJQcm9qZWN0MiI7Ci0vLyAgICAvLyBDcmVhdGUgYSBzaW1wbGUgcHJvamVjdCBmb3IgSW1wb3J0ZWRTY2hlbWFXaXRoU2NoZW1hSW1wb3J0IHRlc3QuCi0vLyAgICBJUHJvamVjdCBwcm9qZWN0MiA9IGNyZWF0ZVByb2plY3QocHJvamVjdE5hbWUyLCBuZXcgU3RyaW5nW117aW1wb3J0ZWRmaWxlfSxuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiLCAiY29tLmlibS53dHAuamNhLkNvbm5lY3Rvck5hdHVyZSJ9LCBudWxsKTsKLS8vICAgIElQcm9qZWN0IHByb2plY3QxID0gY3JlYXRlUHJvamVjdChwcm9qZWN0TmFtZSwgbmV3IFN0cmluZ1tde2ltcG9ydGluZ2ZpbGV9LG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIsICJjb20uaWJtLnd0cC5qY2EuQ29ubmVjdG9yTmF0dXJlIn0sIG5ldyBJUHJvamVjdFtde3Byb2plY3QyfSk7Ci0vLyAgICAKLS8vICAgIFN0cmluZyB0ZXN0ZmlsZSA9ICJmaWxlOi8iICsgcHJvamVjdDEuZ2V0RmlsZSgiSW1wb3J0aW5nVXNpbmdDbGFzc3BhdGgud3NkbCIpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLS8vICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLS8vICAgIAotLy8gICAgdHJ5Ci0vLyAgICB7Ci0vLyAgICAgIHByb2plY3QxLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLS8vICAgICAgcHJvamVjdDIuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotLy8gICAgfQotLy8gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0vLyAgICB7Ci0vLyAgICB9Ci0vLyAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL0ltcG9ydE9uZUFuZFR3by53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0T25lQW5kVHdvKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRPbmVBbmRUd28iOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL29uZS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0T25lQW5kVHdvX09uZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAib25lIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy90d28ud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEltcG9ydE9uZUFuZFR3b19Ud28oKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gInR3byI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9JbXBvcnQvSW1wb3J0RW1wdHlMb2NhdGlvbi9JbXBvcnRFbXB0eUxvY2F0aW9uLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRFbXB0eUxvY2F0aW9uKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRFbXB0eUxvY2F0aW9uIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRFbXB0eUxvY2F0aW9uLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvSW1wb3J0RW1wdHlMb2NhdGlvbi8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvSW1wb3J0RW1wdHlMb2NhdGlvbi8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML0ltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZS9JbXBvcnRFbXB0eU5hbWVzcGFjZS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0RW1wdHlOYW1lc3BhY2UoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkltcG9ydEVtcHR5TmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML0ltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZUFuZExvY2F0aW9uL0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24ud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24oKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIkltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24iOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24vIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZUFuZExvY2F0aW9uLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIkltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZUFuZExvY2F0aW9uLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvSW1wb3J0L0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUvSW1wb3J0Tm9Mb2NhdGlvbkF0dHJpYnV0ZS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0Tm9Mb2NhdGlvbkF0dHJpYnV0ZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiSW1wb3J0Tm9Mb2NhdGlvbkF0dHJpYnV0ZSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJJbXBvcnQvSW1wb3J0Tm9Mb2NhdGlvbkF0dHJpYnV0ZS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiSW1wb3J0L0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogQ1lDTElDIFRFU1RTCi0gICAqLwotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTEud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFBvcnR0eXBlUmVmTWVzc2FnZTEoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlBvcnR0eXBlUmVmTWVzc2FnZTEiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiQ3ljbGljLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJDeWNsaWMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiQ3ljbGljLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTIud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFBvcnR0eXBlUmVmTWVzc2FnZTIoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlBvcnR0eXBlUmVmTWVzc2FnZTIiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiQ3ljbGljLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJDeWNsaWMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiQ3ljbGljLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvU2VsZkNvbnRhaW5lZC9SZWZlcmVuY2VJbmxpbmVUeXBlcy53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlSW5saW5lVHlwZXMoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlJlZmVyZW5jZUlubGluZVR5cGVzIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML1NlbGZDb250YWluZWQvRW1wdHkud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJFbXB0eSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBXU0RMX0RJUiArICJTZWxmQ29udGFpbmVkLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJTZWxmQ29udGFpbmVkLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTT0FQQm9keUVuY29kZWROb05hbWVzcGFjZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2UiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJTZWxmQ29udGFpbmVkLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1dTREwvU2VsZkNvbnRhaW5lZC9TT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJTT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9XU0RML1NlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlL05vRGVmYXVsdE5hbWVzcGFjZS53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Tm9EZWZhdWx0TmFtZXNwYWNlKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJOb0RlZmF1bHROYW1lc3BhY2UiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiU2VsZkNvbnRhaW5lZC9Ob0RlZmF1bHROYW1lc3BhY2UvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFdTRExfRElSICsgIlNlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvV1NETFZhbGlkYXRvclRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTcwN2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9XU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFdTRExWYWxpZGF0b3JUZXN0c1BsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLSAgLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotICBwcml2YXRlIHN0YXRpYyBXU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4gcGx1Z2luOwotICBwcml2YXRlIHN0YXRpYyBCdW5kbGUgcGx1Z2luQnVuZGxlID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFdTRExWYWxpZGF0b3JUZXN0c1BsdWdpbigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHBsdWdpbiA9IHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCXBsdWdpbkJ1bmRsZSA9IGNvbnRleHQuZ2V0QnVuZGxlKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBXU0RMVmFsaWRhdG9yVGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpCi0gIHsKLSAgICByZXR1cm4gcGx1Z2luOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWdpbi4KLSAgICogCi0gICAqIEByZXR1cm4gdGhlIGluc3RhbGwgdXJsIG9mIHRoaXMgcGx1Z2luCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnN0YWxsVVJMKCkKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIHJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKHBsdWdpbkJ1bmRsZS5nZXRFbnRyeSgiLyIpKS5nZXRGaWxlKCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvWFNEVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9YU0RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjI1MzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9YU0RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBYU0QgdmFsaWRhdGlvbiB0ZXN0cyBmb3IgdGhlIFdTREwgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgWFNEVGVzdCBleHRlbmRzIEJhc2VUZXN0Q2FzZQotewotICBwcml2YXRlIFN0cmluZyBYU0RfRElSID0gIlhTRC8iOwotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIHRlc3RzIHN1aXRlIGZyb20gdGhpcyB0ZXN0IGNsYXNzLgotICAgKiAKLSAgICogQHJldHVybiBBIHRlc3Qgc3VpdGUgY29udGFpbmluZyB0aGlzIHRlc3QgY2xhc3MuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoWFNEVGVzdC5jbGFzcyk7Ci0gIH0KLSAgCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKQotICB7Ci0gICAgc3VwZXIuc2V0VXAoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1hTRC9FbnRpdGllcy9ub3JtYWxpemVFbnRpdGllc1ZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVFbnRpdGllc1ZhbGlkKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJub3JtYWxpemVFbnRpdGllc1ZhbGlkIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFhTRF9ESVIgKyAiRW50aXRpZXMvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiRW50aXRpZXMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgWFNEX0RJUiArICJFbnRpdGllcy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVFbnRpdGllc0ludmFsaWQoKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIm5vcm1hbGl6ZUVudGl0aWVzSW52YWxpZCI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIkVudGl0aWVzLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIkVudGl0aWVzLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiRW50aXRpZXMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS9SZWZlclRvQW5vdGhlcklubGluZVR5cGUud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlZmVyVG9Bbm90aGVySW5saW5lVHlwZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFhTRF9ESVIgKyAiUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIlJlZmVyVG9Bbm90aGVySW5saW5lVHlwZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIlJlZmVyVG9Bbm90aGVySW5saW5lVHlwZS8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9YU0QvSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE5vSW1wb3J0Rm9yVW5wcmVmaXhlZEF0dHJpYnV0ZSgpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiTm9JbXBvcnRGb3JVbnByZWZpeGVkQXR0cmlidXRlIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFhTRF9ESVIgKyAiSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgWFNEX0RJUiArICJJbmxpbmVTY2hlbWFHZW5lcmF0ZWRJbXBvcnRzLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9YU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0T25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJPbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QiOwotICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgWFNEX0RJUiArICJPbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIAotICAgIHJ1blRlc3QodGVzdGZpbGUsIGxvZ2xvY2F0aW9uLCBpZGVhbGxvZ2xvY2F0aW9uKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3QgL1hTRC9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0vU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtLndzZGwKLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0oKQotICB7Ci0gICAgU3RyaW5nIHRlc3RuYW1lID0gIlNjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIlNjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS8iICsgdGVzdG5hbWUgKyAiLndzZGwiOwotICAgIFN0cmluZyBsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgR0VORVJBVEVEX1JFU1VMVFNfRElSICsgWFNEX0RJUiArICJTY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0vIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgWFNEX0RJUiArICJTY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0vIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24ud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbigpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uIjsKLSAgICBTdHJpbmcgdGVzdGZpbGUgPSBGSUxFX1BST1RPQ09MICsgUExVR0lOX0FCU09MVVRFX1BBVEggKyBTQU1QTEVTX0RJUiArIFhTRF9ESVIgKyAiUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIlJlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIlJlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICAKLSAgICBydW5UZXN0KHRlc3RmaWxlLCBsb2dsb2NhdGlvbiwgaWRlYWxsb2dsb2NhdGlvbik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUZXN0IC9YU0QvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUud3NkbAotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlKCkKLSAgewotICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJJbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZSI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIkltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7Ci0gICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIkltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOwotICAgIFN0cmluZyBpZGVhbGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBJREVBTF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdCAvWFNEL1ZhbHVlQ29sb24vVmFsdWVDb2xvbi53c2RsCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVDb2xvbigpCi0gIHsKLSAgICBTdHJpbmcgdGVzdG5hbWUgPSAiVmFsdWVDb2xvbiI7Ci0gICAgU3RyaW5nIHRlc3RmaWxlID0gRklMRV9QUk9UT0NPTCArIFBMVUdJTl9BQlNPTFVURV9QQVRIICsgU0FNUExFU19ESVIgKyBYU0RfRElSICsgIlZhbHVlQ29sb24vIiArIHRlc3RuYW1lICsgIi53c2RsIjsKLSAgICBTdHJpbmcgbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIEdFTkVSQVRFRF9SRVNVTFRTX0RJUiArIFhTRF9ESVIgKyAiVmFsdWVDb2xvbi8iICsgdGVzdG5hbWUgKyAiLndzZGwtbG9nIjsKLSAgICBTdHJpbmcgaWRlYWxsb2dsb2NhdGlvbiA9IFBMVUdJTl9BQlNPTFVURV9QQVRIICsgSURFQUxfUkVTVUxUU19ESVIgKyBYU0RfRElSICsgIlZhbHVlQ29sb24vIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7Ci0gICAgCi0gICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1OWVlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQotICA8IS0tIENvbmZpZ3VyYWJsZSBQcm9wZXJ0aWVzIC0tPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMiLz4KLQotICA8IS0tIEVuZCBDb25maWd1cmFibGUgUHJvcGVydGllcyAtLT4KLQotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPgotICA8cHJvcGVydHkgbmFtZT0iYnZ0d29ya3NwYWNlIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlLWZvbGRlciIgdmFsdWU9IiR7YnZ0d29ya3NwYWNlfS8ke3BsdWdpbi1uYW1lfSIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgIDxkZWxldGU+Ci0gICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLioueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotCi0gICAgPCEtLSBTdGFydCB3aXRoIGNsZWFuIGRhdGEgd29ya3NwYWNlIC0tPiAgCi0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlLWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbC5BbGxXU0RMVGVzdHMiLz4KLSAgICA8L2FudD4KLQotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1MzU3NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWdlbmVyYXRlZFJlc3VsdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVWYWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoSW52YWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0FuZ2xlSGF0XkluUGF0aC9BbmdsZUhhdEluUGF0aEludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0FuZ2xlSGF0XkluUGF0aC9BbmdsZUhhdEluUGF0aFZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQW5nbGVIYXReSW5QYXRoL0FuZ2xlSGF0SW5QYXRoVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoSW52YWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9DbG9zZUJyYWNrZXRcMDUxSW5QYXRoL0Nsb3NlQnJhY2tldEluUGF0aEludmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoSW52YWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoVmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0XDA1MUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhWYWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvQ2xvc2VCcmFja2V0XDA1MUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhWYWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldFwwNTFJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldFwwNTFJbkZpbGVuYW1lVmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Nsb3NlQnJhY2tldEluRmlsZW5hbWUvQ2xvc2VCcmFja2V0XDA1MUluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aEludmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aEludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aFZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRGFzaEluRmlsZW5hbWUvRGFzaC1JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aEludmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25cMDQxSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoSW52YWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25cMDQxSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoSW52YWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aFZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aFZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9FeGNsYW1hdGlvblwwNDFJblBhdGgvRXhjbGFtYXRpb25JblBhdGhWYWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9FeGNsYW1hdGlvbkluRmlsZW5hbWUvRXhjbGFtYXRpb25cMDQxSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lVmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uXDA0MUluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uXDA0MUluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aEludmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRcMDUwSW5QYXRoL09wZW5CcmFja2V0SW5QYXRoSW52YWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRcMDUwSW5QYXRoL09wZW5CcmFja2V0SW5QYXRoSW52YWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aFZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aFZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9PcGVuQnJhY2tldFwwNTBJblBhdGgvT3BlbkJyYWNrZXRJblBhdGhWYWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9PcGVuQnJhY2tldEluRmlsZW5hbWUvT3BlbkJyYWNrZXRcMDUwSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lVmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0XDA1MEluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0XDA1MEluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aEludmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aEludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhWYWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1BlcmlvZC5JblBhdGgvUGVyaW9kSW5QYXRoVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aEludmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVcMDQ3SW5QYXRoL1F1b3RlSW5QYXRoSW52YWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVcMDQ3SW5QYXRoL1F1b3RlSW5QYXRoSW52YWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aFZhbGlkLndzZGwtbG9nIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aFZhbGlkLndzZGwtbG9nIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9RdW90ZVwwNDdJblBhdGgvUXVvdGVJblBhdGhWYWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGVcMDQ3SW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2ciCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lVmFsaWQud3NkbC1sb2ciICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlXDA0N0luRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlXDA0N0luRmlsZW5hbWVWYWxpZC53c2RsLWxvZyIKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoSW52YWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aEludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aFZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2UgSW5QYXRoL1NwYWNlSW5QYXRoVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVWYWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1NwYWNlSW5GaWxlbmFtZS9TcGFjZSBJbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVJbnZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NDY1ZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVWYWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoSW52YWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1RpbGRlfkluUGF0aC9UaWxkZUluUGF0aEludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1RpbGRlfkluUGF0aC9UaWxkZUluUGF0aFZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVGlsZGV+SW5QYXRoL1RpbGRlSW5QYXRoVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lSW52YWxpZC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NjVlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZUludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZVZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZUluRmlsZW5hbWUvVW5kZXJzY29yZV9JbkZpbGVuYW1lVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aEludmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhJbnZhbGlkLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ2NWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aEludmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhNTCBkb2N1bWVudCBzdHJ1Y3R1cmVzIG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoaW4gdGhlIHNhbWUgZW50aXR5LiBbMiwgMTkyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aFZhbGlkLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlX0luUGF0aC9VbmRlcnNjb3JlSW5QYXRoVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9QYXRocy9VbmRlcnNjb3JlX0luUGF0aC9VbmRlcnNjb3JlSW5QYXRoVmFsaWQud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMS53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTEud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMi53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMi53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTIud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvSW1wb3J0T25lQW5kVHdvLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9JbXBvcnRPbmVBbmRUd28ud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9JbXBvcnRPbmVBbmRUd28ud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvb25lLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9vbmUud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9vbmUud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvdHdvLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy90d28ud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy90d28ud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0RW1wdHlMb2NhdGlvbi9JbXBvcnRFbXB0eUxvY2F0aW9uLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRFbXB0eUxvY2F0aW9uL0ltcG9ydEVtcHR5TG9jYXRpb24ud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWI2MzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRFbXB0eUxvY2F0aW9uL0ltcG9ydEVtcHR5TG9jYXRpb24ud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZSBsb2NhdGlvbiBhdHRyaWJ1dGUgaXMgZW1wdHkuIEEgbG9jYXRpb24gbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHRoZSBsb2NhdGlvbiBhdHRyaWJ1dGUuIFs3LCA1Nl0KLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlL0ltcG9ydEVtcHR5TmFtZXNwYWNlLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZS9JbXBvcnRFbXB0eU5hbWVzcGFjZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwNjBiNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlL0ltcG9ydEVtcHR5TmFtZXNwYWNlLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAxCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgZmlsZSBjYW5ub3QgYmUgaW1wb3J0ZWQgYmVjYXVzZSB0aGUgbmFtZXNwYWNlICcnIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgbmFtZXNwYWNlICdodHRwOi8vZXhhbXBsZS5jb20vc2ltcGxlLycgb2YgdGhlIGltcG9ydGVkIGRvY3VtZW50LiBbNywgNTNdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZUFuZExvY2F0aW9uL0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24ud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24vSW1wb3J0RW1wdHlOYW1lc3BhY2VBbmRMb2NhdGlvbi53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ZWEwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24vSW1wb3J0RW1wdHlOYW1lc3BhY2VBbmRMb2NhdGlvbi53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGxvY2F0aW9uIGF0dHJpYnV0ZSBpcyBlbXB0eS4gQSBsb2NhdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlIGxvY2F0aW9uIGF0dHJpYnV0ZS4gWzcsIDQyXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0Tm9Mb2NhdGlvbkF0dHJpYnV0ZS9JbXBvcnROb0xvY2F0aW9uQXR0cmlidXRlLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnROb0xvY2F0aW9uQXR0cmlidXRlL0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTQ2NzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnROb0xvY2F0aW9uQXR0cmlidXRlL0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDEKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWN2Yy1jb21wbGV4LXR5cGUuNDogQXR0cmlidXRlICdsb2NhdGlvbicgbXVzdCBhcHBlYXIgb24gZWxlbWVudCAnd3NkbDppbXBvcnQnLiBbNywgNDRdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnROb25FeGlzdGFudEZpbGUud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydE5vbkV4aXN0YW50RmlsZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzMDhmOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydE5vbkV4aXN0YW50RmlsZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMQotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlICdUaGlzRmlsZURvZXNudEV4aXN0LndzZGwnIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBpbXBvcnRlZC4gQ2hlY2sgdGhhdCB0aGUgZG9jdW1lbnQgZXhpc3RzIGFuZCB0aGF0IHRoZSBsb2NhdGlvbiBpcyBjb3JyZWN0LiBbMywgODZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUy53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnRJbnZhbGlkTlMud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMTVlNDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUy53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMQotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZpbGUgY2Fubm90IGJlIGltcG9ydGVkIGJlY2F1c2UgdGhlIG5hbWVzcGFjZSAnaHR0cDovL2ludmFsaWRuYW1lc3BhY2UnIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgbmFtZXNwYWNlICdodHRwOi8vd3d3LmV4YW1wbGUuY29tJyBvZiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQuIFszLCA3M10KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWRGaWxlbmFtZS53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZEZpbGVuYW1lLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmJjYTc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZEZpbGVuYW1lLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAxCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgJ1NJTVBMRVdTREwud3NkbCcgZG9jdW1lbnQgY291bGQgbm90IGJlIGltcG9ydGVkLiBDaGVjayB0aGF0IHRoZSBkb2N1bWVudCBleGlzdHMgYW5kIHRoYXQgdGhlIGxvY2F0aW9uIGlzIGNvcnJlY3QuIFszLCA3OF0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWROUy53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZE5TLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjYyYzQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZE5TLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAxCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgZmlsZSBjYW5ub3QgYmUgaW1wb3J0ZWQgYmVjYXVzZSB0aGUgbmFtZXNwYWNlICdodHRwOi8vaW52YWxpZG5hbWVzcGFjZScgZG9lcyBub3QgbWF0Y2ggdGhlIHRhcmdldCBuYW1lc3BhY2UgJ2h0dHA6Ly90ZW1wdXJpLm9yZy9zaW1wbGV3c2RsLycgb2YgdGhlIGltcG9ydGVkIGRvY3VtZW50LiBbMywgNzhdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC9JbXBvcnRYTUxJbnZhbGlkV1NETC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvSW1wb3J0WE1MSW52YWxpZFdTREwvSW1wb3J0WE1MSW52YWxpZFdTREwud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDNkYzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC9JbXBvcnRYTUxJbnZhbGlkV1NETC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAxCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1SZWZlcmVuY2VkIGZpbGUgY29udGFpbnMgZXJyb3JzICh0ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0WE1MSW52YWxpZFdTREwvWE1MSW52YWxpZFdTREwud3NkbCkuICBbMSwgMF0KLS0+IEVsZW1lbnQgdHlwZSAid3NkbDpkZWZpbml0aW9ucyIgbXVzdCBiZSBmb2xsb3dlZCBieSBlaXRoZXIgYXR0cmlidXRlIHNwZWNpZmljYXRpb25zLCAiPiIgb3IgIi8+Ii4gWzQsIDNdCi0tPiBBdHRyaWJ1dGUgbmFtZSAidGFyZ2V0TmFtZXNwYWNlIiBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCB0eXBlICJ3c2RsOmRlZmluaXRpb25zIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSAnID0gJyBjaGFyYWN0ZXIuIFs0LCAzXQotLT4gQXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiIHdhcyBhbHJlYWR5IHNwZWNpZmllZCBmb3IgZWxlbWVudCAid3NkbDpkZWZpbml0aW9ucyIuIFs0LCAzXQotLT4gT3BlbiBxdW90ZSBpcyBleHBlY3RlZCBmb3IgYXR0cmlidXRlICJ0YXJnZXROYW1lc3BhY2UiIGFzc29jaWF0ZWQgd2l0aCBhbiAgZWxlbWVudCB0eXBlICAid3NkbDpkZWZpbml0aW9ucyIuIFs0LCAzXQotLT4gRWxlbWVudCB0eXBlICJ3c2RsOmRlZmluaXRpb25zIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGVpdGhlciBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbnMsICI+IiBvciAiLz4iLiBbNSwgN10KLS0+IEF0dHJpYnV0ZSBuYW1lICJ4c2Q6c2NoZW1hIiBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCB0eXBlICJ3c2RsOmRlZmluaXRpb25zIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSAnID0gJyBjaGFyYWN0ZXIuIFs1LCAxOF0KLS0+IE9wZW4gcXVvdGUgaXMgZXhwZWN0ZWQgZm9yIGF0dHJpYnV0ZSAieHNkOnNjaGVtYSIgYXNzb2NpYXRlZCB3aXRoIGFuICBlbGVtZW50IHR5cGUgICJ3c2RsOmRlZmluaXRpb25zIi4gWzUsIDE4XQotLT4gRWxlbWVudCB0eXBlICJ3c2RsOmRlZmluaXRpb25zIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGVpdGhlciBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbnMsICI+IiBvciAiLz4iLiBbNSwgMjRdCi0tPiBBdHRyaWJ1dGUgInhtbG5zOnhzZCIgd2FzIGFscmVhZHkgc3BlY2lmaWVkIGZvciBlbGVtZW50ICJ3c2RsOmRlZmluaXRpb25zIi4gWzUsIDgxXQotLT4gY3ZjLWVsdC4xOiBDYW5ub3QgZmluZCB0aGUgZGVjbGFyYXRpb24gb2YgZWxlbWVudCAnd3NkbDpkZWZpbml0aW9ucycuIFs1LCAxMTZdCi0tPiBUaGUgZWxlbWVudCB0eXBlICJ3c2RsOmRlZmluaXRpb25zIiBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgdGhlIG1hdGNoaW5nIGVuZC10YWcgIjwvd3NkbDpkZWZpbml0aW9ucz4iLiBbOCwgN10KLS0+IFRoZSBlbmQtdGFnIGZvciBlbGVtZW50IHR5cGUgIndzZGw6ZGVmaW5pdGlvbnMiIG11c3QgZW5kIHdpdGggYSAnPicgZGVsaW1pdGVyLiBbOCwgN10KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzgsIDddCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFs4LCA4XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbOCwgOV0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzgsIDEwXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbOCwgMTFdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFs4LCAxMl0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzgsIDEzXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbOCwgMTRdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFs4LCAxNV0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzgsIDE2XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbOCwgMTddCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbOSwgNV0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFs5LCA1XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6dHlwZXMiIGlzIG5vdCBib3VuZC4gWzksIDE2XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbOSwgMTZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTAsIDVdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDptZXNzYWdlIiBpcyBub3QgYm91bmQuIFsxMCwgNDZdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsxMCwgNDZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTEsIDddCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpwYXJ0IiBpcyBub3QgYm91bmQuIFsxMSwgODFdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsxMSwgODFdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTIsIDZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTIsIDZdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDptZXNzYWdlIiBpcyBub3QgYm91bmQuIFsxMiwgMTldCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsxMiwgMTldCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTMsIDVdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDptZXNzYWdlIiBpcyBub3QgYm91bmQuIFsxMywgNDVdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsxMywgNDVdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTQsIDddCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpwYXJ0IiBpcyBub3QgYm91bmQuIFsxNCwgNzldCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsxNCwgNzldCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTUsIDZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTUsIDZdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDptZXNzYWdlIiBpcyBub3QgYm91bmQuIFsxNSwgMTldCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsxNSwgMTldCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTYsIDVdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpwb3J0VHlwZSIgaXMgbm90IGJvdW5kLiBbMTYsIDQxXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTYsIDQxXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzE3LCA3XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6b3BlcmF0aW9uIiBpcyBub3QgYm91bmQuIFsxNywgNDJdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsxNywgNDJdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMTgsIDldCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDppbnB1dCIgaXMgbm90IGJvdW5kLiBbMTgsIDU1XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMTgsIDU1XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzE5LCA5XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6b3V0cHV0IiBpcyBub3QgYm91bmQuIFsxOSwgNTddCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsxOSwgNTddCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjAsIDhdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjAsIDhdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpvcGVyYXRpb24iIGlzIG5vdCBib3VuZC4gWzIwLCAyM10KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzIwLCAyM10KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFsyMSwgNl0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFsyMSwgNl0KLS0+IFRoZSBwcmVmaXggIndzZGwiIGZvciBlbGVtZW50ICJ3c2RsOnBvcnRUeXBlIiBpcyBub3QgYm91bmQuIFsyMSwgMjBdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyMSwgMjBdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjIsIDVdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpiaW5kaW5nIiBpcyBub3QgYm91bmQuIFsyMiwgNzBdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyMiwgNzBdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjMsIDddCi0tPiBUaGUgcHJlZml4ICJzb2FwIiBmb3IgZWxlbWVudCAic29hcDpiaW5kaW5nIiBpcyBub3QgYm91bmQuIFsyMywgODddCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyMywgODddCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjQsIDddCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpvcGVyYXRpb24iIGlzIG5vdCBib3VuZC4gWzI0LCA0Ml0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzI0LCA0Ml0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFsyNSwgOV0KLS0+IFRoZSBwcmVmaXggInNvYXAiIGZvciBlbGVtZW50ICJzb2FwOm9wZXJhdGlvbiIgaXMgbm90IGJvdW5kLiBbMjUsIDg1XQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMjUsIDg1XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzI2LCA5XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6aW5wdXQiIGlzIG5vdCBib3VuZC4gWzI2LCAyMF0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzI2LCAyMF0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFsyNywgMTFdCi0tPiBUaGUgcHJlZml4ICJzb2FwIiBmb3IgZWxlbWVudCAic29hcDpib2R5IiBpcyBub3QgYm91bmQuIFsyNywgMzZdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyNywgMzZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjgsIDEwXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzI4LCAxMF0KLS0+IFRoZSBwcmVmaXggIndzZGwiIGZvciBlbGVtZW50ICJ3c2RsOmlucHV0IiBpcyBub3QgYm91bmQuIFsyOCwgMjFdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFsyOCwgMjFdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMjksIDldCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpvdXRwdXQiIGlzIG5vdCBib3VuZC4gWzI5LCAyMV0KLS0+IENvbnRlbnQgaXMgbm90IGFsbG93ZWQgaW4gdHJhaWxpbmcgc2VjdGlvbi4gWzI5LCAyMV0KLS0+IFRoZSBtYXJrdXAgaW4gdGhlIGRvY3VtZW50IGZvbGxvd2luZyB0aGUgcm9vdCBlbGVtZW50IG11c3QgYmUgd2VsbC1mb3JtZWQuIFszMCwgMTFdCi0tPiBUaGUgcHJlZml4ICJzb2FwIiBmb3IgZWxlbWVudCAic29hcDpib2R5IiBpcyBub3QgYm91bmQuIFszMCwgMzZdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFszMCwgMzZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzEsIDEwXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzMxLCAxMF0KLS0+IFRoZSBwcmVmaXggIndzZGwiIGZvciBlbGVtZW50ICJ3c2RsOm91dHB1dCIgaXMgbm90IGJvdW5kLiBbMzEsIDIyXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzEsIDIyXQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzMyLCA4XQotLT4gVGhlIG1hcmt1cCBpbiB0aGUgZG9jdW1lbnQgZm9sbG93aW5nIHRoZSByb290IGVsZW1lbnQgbXVzdCBiZSB3ZWxsLWZvcm1lZC4gWzMyLCA4XQotLT4gVGhlIHByZWZpeCAid3NkbCIgZm9yIGVsZW1lbnQgIndzZGw6b3BlcmF0aW9uIiBpcyBub3QgYm91bmQuIFszMiwgMjNdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFszMiwgMjNdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzMsIDZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzMsIDZdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpiaW5kaW5nIiBpcyBub3QgYm91bmQuIFszMywgMTldCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFszMywgMTldCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzQsIDVdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpzZXJ2aWNlIiBpcyBub3QgYm91bmQuIFszNCwgNDBdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFszNCwgNDBdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzUsIDddCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpwb3J0IiBpcyBub3QgYm91bmQuIFszNSwgNzZdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFszNSwgNzZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzYsIDldCi0tPiBUaGUgcHJlZml4ICJzb2FwIiBmb3IgZWxlbWVudCAic29hcDphZGRyZXNzIiBpcyBub3QgYm91bmQuIFszNiwgNTddCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFszNiwgNTddCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzcsIDhdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzcsIDhdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpwb3J0IiBpcyBub3QgYm91bmQuIFszNywgMThdCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFszNywgMThdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzgsIDZdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzgsIDZdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpzZXJ2aWNlIiBpcyBub3QgYm91bmQuIFszOCwgMTldCi0tPiBDb250ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRyYWlsaW5nIHNlY3Rpb24uIFszOCwgMTldCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzksIDRdCi0tPiBUaGUgbWFya3VwIGluIHRoZSBkb2N1bWVudCBmb2xsb3dpbmcgdGhlIHJvb3QgZWxlbWVudCBtdXN0IGJlIHdlbGwtZm9ybWVkLiBbMzksIDRdCi0tPiBUaGUgcHJlZml4ICJ3c2RsIiBmb3IgZWxlbWVudCAid3NkbDpkZWZpbml0aW9ucyIgaXMgbm90IGJvdW5kLiBbMzksIDIxXQotLT4gQ29udGVudCBpcyBub3QgYWxsb3dlZCBpbiB0cmFpbGluZyBzZWN0aW9uLiBbMzksIDIxXQotLT4gWE1MIGRvY3VtZW50IHN0cnVjdHVyZXMgbXVzdCBzdGFydCBhbmQgZW5kIHdpdGhpbiB0aGUgc2FtZSBlbnRpdHkuIFs0MCwgMl0KLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRpbmdVc2luZ0NsYXNzcGF0aC53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1dTRExXaXRoSW1wb3J0ZWRTY2hlbWEud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1dTRExXaXRoSW1wb3J0ZWRTY2hlbWEud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9JbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdTY2hlbWFJbXBvcnRpbmdTY2hlbWEud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdTY2hlbWFJbXBvcnRpbmdTY2hlbWEud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdUeXBlcy53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1R5cGVzLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1R5cGVzLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L1dTRExOYW1lc3BhY2VBQUEud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvSW1wb3J0L1dTRExOYW1lc3BhY2VBQUEud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML0ltcG9ydC9XU0RMTmFtZXNwYWNlQUFBLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9FbXB0eS53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9TZWxmQ29udGFpbmVkL0VtcHR5LndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9TZWxmQ29udGFpbmVkL0VtcHR5LndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9Ob0RlZmF1bHROYW1lc3BhY2UvTm9EZWZhdWx0TmFtZXNwYWNlLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvTm9EZWZhdWx0TmFtZXNwYWNlL05vRGVmYXVsdE5hbWVzcGFjZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9Ob0RlZmF1bHROYW1lc3BhY2UvTm9EZWZhdWx0TmFtZXNwYWNlLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9SZWZlcmVuY2VJbmxpbmVUeXBlcy53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9TZWxmQ29udGFpbmVkL1JlZmVyZW5jZUlubGluZVR5cGVzLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9TZWxmQ29udGFpbmVkL1JlZmVyZW5jZUlubGluZVR5cGVzLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9TT0FQQm9keUVuY29kZWROb05hbWVzcGFjZS53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9TT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlLndzZGwtbG9nIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9XU0RML1NlbGZDb250YWluZWQvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvU2VsZkNvbnRhaW5lZC9TT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAwCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLXdhcm5pbmcgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0obm9uZSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9FbnRpdGllcy9ub3JtYWxpemVFbnRpdGllc0ludmFsaWQud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9FbnRpdGllcy9ub3JtYWxpemVFbnRpdGllc0ludmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZGFmNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLndzZGwtbG9nCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1udW1iZXIgb2YgZXJyb3JzICAgICAgOiAxCi1udW1iZXIgb2Ygd2FybmluZ3MgICAgOiAwCi0KLS0tLS0tLS0tLS0tLWVycm9yIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgdmFsdWUgb2YgYXR0cmlidXRlICJ2YWx1ZSIgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgdHlwZSAieHNkOnBhdHRlcm4iIG11c3Qgbm90IGNvbnRhaW4gdGhlICc8JyBjaGFyYWN0ZXIuIFsxMSwgNTVdCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNWYWxpZC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzVmFsaWQud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmIzNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNWYWxpZC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9JbmxpbmVTY2hlbWFHZW5lcmF0ZWRJbXBvcnRzL05vSW1wb3J0Rm9yVW5wcmVmaXhlZEF0dHJpYnV0ZS53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9JbmxpbmVTY2hlbWFHZW5lcmF0ZWRJbXBvcnRzL05vSW1wb3J0Rm9yVW5wcmVmaXhlZEF0dHJpYnV0ZS53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMAotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS13YXJuaW5nIGxpc3QtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKG5vbmUpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbC1sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWFkMTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL2lkZWFsUmVzdWx0cy9YU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC53c2RsLWxvZworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotbnVtYmVyIG9mIGVycm9ycyAgICAgIDogMQotbnVtYmVyIG9mIHdhcm5pbmdzICAgIDogMAotCi0tLS0tLS0tLS0tLS1lcnJvciBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotc3JjLXJlc29sdmUuNC4yOiBFcnJvciByZXNvbHZpbmcgY29tcG9uZW50ICd4c2Q6c3RyaW5nYScuIEl0IHdhcyBkZXRlY3RlZCB0aGF0ICd4c2Q6c3RyaW5nYScgaXMgaW4gbmFtZXNwYWNlICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYScsIGJ1dCBjb21wb25lbnRzIGZyb20gdGhpcyBuYW1lc3BhY2UgYXJlIG5vdCByZWZlcmVuY2VhYmxlIGZyb20gc2NoZW1hIGRvY3VtZW50ICd0ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbCcuIElmIHRoaXMgaXMgdGhlIGluY29ycmVjdCBuYW1lc3BhY2UsIHBlcmhhcHMgdGhlIHByZWZpeCBvZiAneHNkOnN0cmluZ2EnIG5lZWRzIHRvIGJlIGNoYW5nZWQuIElmIHRoaXMgaXMgdGhlIGNvcnJlY3QgbmFtZXNwYWNlLCB0aGVuIGFuIGFwcHJvcHJpYXRlICdpbXBvcnQnIHRhZyBzaG91bGQgYmUgYWRkZWQgdG8gJ3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC53c2RsJy4gWzcsIDYxXQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS9SZWZlclRvQW5vdGhlcklubGluZVR5cGUud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9SZWZlclRvQW5vdGhlcklubGluZVR5cGUvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS9SZWZlclRvQW5vdGhlcklubGluZVR5cGUud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24ud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24vUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24ud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0ud3NkbC1sb2cgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0vU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtLndzZGwtbG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJiMzYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0ud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1ZhbHVlQ29sb24vVmFsdWVDb2xvbi53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvWFNEL1ZhbHVlQ29sb24vVmFsdWVDb2xvbi53c2RsLWxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyYjM2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1hTRC9WYWx1ZUNvbG9uL1ZhbHVlQ29sb24ud3NkbC1sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLW51bWJlciBvZiBlcnJvcnMgICAgICA6IDAKLW51bWJlciBvZiB3YXJuaW5ncyAgICA6IDAKLQotLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLShub25lKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVJbnZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQW5nbGVIYXRJbkZpbGVuYW1lL0FuZ2xlSGF0XkluRmlsZW5hbWVJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0SW5GaWxlbmFtZS9BbmdsZUhhdF5JbkZpbGVuYW1lVmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9BbmdsZUhhdEluRmlsZW5hbWUvQW5nbGVIYXReSW5GaWxlbmFtZVZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0XkluUGF0aC9BbmdsZUhhdEluUGF0aEludmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0XkluUGF0aC9BbmdsZUhhdEluUGF0aEludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9BbmdsZUhhdF5JblBhdGgvQW5nbGVIYXRJblBhdGhJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0XkluUGF0aC9BbmdsZUhhdEluUGF0aFZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9BbmdsZUhhdF5JblBhdGgvQW5nbGVIYXRJblBhdGhWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0FuZ2xlSGF0XkluUGF0aC9BbmdsZUhhdEluUGF0aFZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRcMDUxSW5QYXRoL0Nsb3NlQnJhY2tldEluUGF0aEludmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQ2xvc2VCcmFja2V0XDA1MUluUGF0aC9DbG9zZUJyYWNrZXRJblBhdGhJbnZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRcMDUxSW5QYXRoL0Nsb3NlQnJhY2tldEluUGF0aEludmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRcMDUxSW5QYXRoL0Nsb3NlQnJhY2tldEluUGF0aFZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoVmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Nsb3NlQnJhY2tldFwwNTFJblBhdGgvQ2xvc2VCcmFja2V0SW5QYXRoVmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldFwwNTFJbkZpbGVuYW1lSW52YWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldFwwNTFJbkZpbGVuYW1lSW52YWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXRcMDUxSW5GaWxlbmFtZUludmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldFwwNTFJbkZpbGVuYW1lVmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvQ2xvc2VCcmFja2V0SW5GaWxlbmFtZS9DbG9zZUJyYWNrZXRcMDUxSW5GaWxlbmFtZVZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9DbG9zZUJyYWNrZXRJbkZpbGVuYW1lL0Nsb3NlQnJhY2tldFwwNTFJbkZpbGVuYW1lVmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhJbnZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9EYXNoLUluUGF0aC9EYXNoSW5QYXRoSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2gtSW5QYXRoL0Rhc2hJblBhdGhWYWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aFZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRGFzaC1JblBhdGgvRGFzaEluUGF0aFZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZUludmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZUludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9EYXNoSW5GaWxlbmFtZS9EYXNoLUluRmlsZW5hbWVJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZVZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9EYXNoSW5GaWxlbmFtZS9EYXNoLUluRmlsZW5hbWVWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0Rhc2hJbkZpbGVuYW1lL0Rhc2gtSW5GaWxlbmFtZVZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9FeGNsYW1hdGlvblwwNDFJblBhdGgvRXhjbGFtYXRpb25JblBhdGhJbnZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aEludmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uXDA0MUluUGF0aC9FeGNsYW1hdGlvbkluUGF0aEludmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9FeGNsYW1hdGlvblwwNDFJblBhdGgvRXhjbGFtYXRpb25JblBhdGhWYWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9FeGNsYW1hdGlvblwwNDFJblBhdGgvRXhjbGFtYXRpb25JblBhdGhWYWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRXhjbGFtYXRpb25cMDQxSW5QYXRoL0V4Y2xhbWF0aW9uSW5QYXRoVmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9FeGNsYW1hdGlvbkluRmlsZW5hbWUvRXhjbGFtYXRpb25cMDQxSW5GaWxlbmFtZUludmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvRXhjbGFtYXRpb25JbkZpbGVuYW1lL0V4Y2xhbWF0aW9uXDA0MUluRmlsZW5hbWVJbnZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9FeGNsYW1hdGlvbkluRmlsZW5hbWUvRXhjbGFtYXRpb25cMDQxSW5GaWxlbmFtZUludmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9FeGNsYW1hdGlvbkluRmlsZW5hbWUvRXhjbGFtYXRpb25cMDQxSW5GaWxlbmFtZVZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lVmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL0V4Y2xhbWF0aW9uSW5GaWxlbmFtZS9FeGNsYW1hdGlvblwwNDFJbkZpbGVuYW1lVmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9PcGVuQnJhY2tldFwwNTBJblBhdGgvT3BlbkJyYWNrZXRJblBhdGhJbnZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aEludmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0XDA1MEluUGF0aC9PcGVuQnJhY2tldEluUGF0aEludmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9PcGVuQnJhY2tldFwwNTBJblBhdGgvT3BlbkJyYWNrZXRJblBhdGhWYWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9PcGVuQnJhY2tldFwwNTBJblBhdGgvT3BlbkJyYWNrZXRJblBhdGhWYWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvT3BlbkJyYWNrZXRcMDUwSW5QYXRoL09wZW5CcmFja2V0SW5QYXRoVmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9PcGVuQnJhY2tldEluRmlsZW5hbWUvT3BlbkJyYWNrZXRcMDUwSW5GaWxlbmFtZUludmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvT3BlbkJyYWNrZXRJbkZpbGVuYW1lL09wZW5CcmFja2V0XDA1MEluRmlsZW5hbWVJbnZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9PcGVuQnJhY2tldEluRmlsZW5hbWUvT3BlbkJyYWNrZXRcMDUwSW5GaWxlbmFtZUludmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9PcGVuQnJhY2tldEluRmlsZW5hbWUvT3BlbkJyYWNrZXRcMDUwSW5GaWxlbmFtZVZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lVmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL09wZW5CcmFja2V0SW5GaWxlbmFtZS9PcGVuQnJhY2tldFwwNTBJbkZpbGVuYW1lVmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1BlcmlvZC5JblBhdGgvUGVyaW9kSW5QYXRoSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhJbnZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kLkluUGF0aC9QZXJpb2RJblBhdGhJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1BlcmlvZC5JblBhdGgvUGVyaW9kSW5QYXRoVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1BlcmlvZC5JblBhdGgvUGVyaW9kSW5QYXRoVmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9QZXJpb2QuSW5QYXRoL1BlcmlvZEluUGF0aFZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVJbnZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9QZXJpb2RJbkZpbGVuYW1lL1BlcmlvZC5JbkZpbGVuYW1lSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1BlcmlvZEluRmlsZW5hbWUvUGVyaW9kLkluRmlsZW5hbWVWYWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZVZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUGVyaW9kSW5GaWxlbmFtZS9QZXJpb2QuSW5GaWxlbmFtZVZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9RdW90ZVwwNDdJblBhdGgvUXVvdGVJblBhdGhJbnZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aEludmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlXDA0N0luUGF0aC9RdW90ZUluUGF0aEludmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9RdW90ZVwwNDdJblBhdGgvUXVvdGVJblBhdGhWYWxpZC53c2RsIiAiYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9RdW90ZVwwNDdJblBhdGgvUXVvdGVJblBhdGhWYWxpZC53c2RsIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gImEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUXVvdGVcMDQ3SW5QYXRoL1F1b3RlSW5QYXRoVmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGVcMDQ3SW5GaWxlbmFtZUludmFsaWQud3NkbCIgImIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvUXVvdGVJbkZpbGVuYW1lL1F1b3RlXDA0N0luRmlsZW5hbWVJbnZhbGlkLndzZGwiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGVcMDQ3SW5GaWxlbmFtZUludmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCAiYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9RdW90ZUluRmlsZW5hbWUvUXVvdGVcMDQ3SW5GaWxlbmFtZVZhbGlkLndzZGwiICJiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lVmFsaWQud3NkbCIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tICJhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1F1b3RlSW5GaWxlbmFtZS9RdW90ZVwwNDdJbkZpbGVuYW1lVmFsaWQud3NkbCIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aEludmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aEludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9TcGFjZSBJblBhdGgvU3BhY2VJblBhdGhJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aFZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9TcGFjZSBJblBhdGgvU3BhY2VJblBhdGhWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlIEluUGF0aC9TcGFjZUluUGF0aFZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlSW5GaWxlbmFtZS9TcGFjZSBJbkZpbGVuYW1lSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVJbnZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvU3BhY2VJbkZpbGVuYW1lL1NwYWNlIEluRmlsZW5hbWVJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlSW5GaWxlbmFtZS9TcGFjZSBJbkZpbGVuYW1lVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1NwYWNlSW5GaWxlbmFtZS9TcGFjZSBJbkZpbGVuYW1lVmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9TcGFjZUluRmlsZW5hbWUvU3BhY2UgSW5GaWxlbmFtZVZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVJbnZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YmUzNjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVGlsZGVJbkZpbGVuYW1lL1RpbGRlfkluRmlsZW5hbWVJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lVmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlSW5GaWxlbmFtZS9UaWxkZX5JbkZpbGVuYW1lVmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyN2Q3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9UaWxkZUluRmlsZW5hbWUvVGlsZGV+SW5GaWxlbmFtZVZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlfkluUGF0aC9UaWxkZUluUGF0aEludmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlfkluUGF0aC9UaWxkZUluUGF0aEludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9UaWxkZX5JblBhdGgvVGlsZGVJblBhdGhJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlfkluUGF0aC9UaWxkZUluUGF0aFZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9UaWxkZX5JblBhdGgvVGlsZGVJblBhdGhWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1RpbGRlfkluUGF0aC9UaWxkZUluUGF0aFZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZUludmFsaWQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZUludmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiZTM2OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9VbmRlcnNjb3JlSW5GaWxlbmFtZS9VbmRlcnNjb3JlX0luRmlsZW5hbWVJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZVZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9VbmRlcnNjb3JlSW5GaWxlbmFtZS9VbmRlcnNjb3JlX0luRmlsZW5hbWVWYWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTI3ZDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVJbkZpbGVuYW1lL1VuZGVyc2NvcmVfSW5GaWxlbmFtZVZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhJbnZhbGlkLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9QYXRocy9VbmRlcnNjb3JlX0luUGF0aC9VbmRlcnNjb3JlSW5QYXRoSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJlMzY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhJbnZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1BhdGhzL1VuZGVyc2NvcmVfSW5QYXRoL1VuZGVyc2NvcmVJblBhdGhWYWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aFZhbGlkLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjdkNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvUGF0aHMvVW5kZXJzY29yZV9JblBhdGgvVW5kZXJzY29yZUluUGF0aFZhbGlkLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvQ3ljbGljL1BvcnR0eXBlUmVmTWVzc2FnZTEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlNGM1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0N5Y2xpYy9Qb3J0dHlwZVJlZk1lc3NhZ2UxLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvY3ljbGljMS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJjeWNsaWMxIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9jeWNsaWMxLyIgeG1sbnM6Y3ljbGljMj0iaHR0cDovL3RlbXB1cmkub3JnL2N5Y2xpYzIvIj4KLSAgPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL2N5Y2xpYzIvIiBsb2NhdGlvbj0iUG9ydHR5cGVSZWZNZXNzYWdlMi53c2RsIj48L3dzZGw6aW1wb3J0PgotICA8d3NkbDp0eXBlcz4KLSAgICA8eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9jeWNsaWMxLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlIiBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXF1ZXN0IiBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ii8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJjeWNsaWMxIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KLSAgICAgIDx3c2RsOmlucHV0IG1lc3NhZ2U9ImN5Y2xpYzI6TmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImN5Y2xpYzI6TmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0N5Y2xpYy9Qb3J0dHlwZVJlZk1lc3NhZ2UyLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0N5Y2xpYy9Qb3J0dHlwZVJlZk1lc3NhZ2UyLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzUyOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9DeWNsaWMvUG9ydHR5cGVSZWZNZXNzYWdlMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL2N5Y2xpYzIvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iY3ljbGljMiIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvY3ljbGljMi8iIHhtbG5zOmN5Y2xpYzE9Imh0dHA6Ly90ZW1wdXJpLm9yZy9jeWNsaWMxLyI+Ci0gIDx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9jeWNsaWMxLyIgbG9jYXRpb249IlBvcnR0eXBlUmVmTWVzc2FnZTEud3NkbCI+PC93c2RsOmltcG9ydD4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvY3ljbGljMi8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOnNjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCIgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iY3ljbGljMiI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJjeWNsaWMxOk5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJjeWNsaWMxOk5ld09wZXJhdGlvblJlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvSW1wb3J0T25lQW5kVHdvLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9JbXBvcnRPbmVBbmRUd28ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2M2FmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy9JbXBvcnRPbmVBbmRUd28ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLQluYW1lPSJJbXBvcnRPbmVBbmRUd28iCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vSW1wb3J0T25lQW5kVHdvIiAKLQl4bWxuczp3c2RsMT0iaHR0cDovL3RlbXB1cmkub3JnL29uZS53c2RsIgotCXhtbG5zOndzZGwyPSJodHRwOi8vYXRlbXB1cmkub3JnL3R3by53c2RsIj4KLQotCQotPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL29uZS53c2RsIiBsb2NhdGlvbj0ib25lLndzZGwiLz4KLTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly9hdGVtcHVyaS5vcmcvdHdvLndzZGwiIGxvY2F0aW9uPSJ0d28ud3NkbCIvPgotCQotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0FscGhhYmV0aWNhbE9yZGVyT2ZJbXBvcnRzL29uZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvb25lLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMGZmMTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvb25lLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvb25lLndzZGwiCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0ib25lIgotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL29uZS53c2RsIj4KLQkKLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik1lc3NhZ2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9Ik1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvQWxwaGFiZXRpY2FsT3JkZXJPZkltcG9ydHMvdHdvLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy90d28ud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmMTYwYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9BbHBoYWJldGljYWxPcmRlck9mSW1wb3J0cy90d28ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG5hbWVzcGFjZSBvZiB0aGlzIGRvY3VtZW50IHN0YXJ0IHdpdGggYW4gYSBhcyBpdCBzaG91bGQKLSAgICAgYmUgaW1wb3J0ZWQgZmlyc3QgYnkgSW1wb3J0T25lQW5kVHdvLndzZGwuIFRoZSBvcmRlciBvZiB0aGUgaW1wb3J0cyBpcyBkZXRlcm1pbmVkCi0gICAgIGJ5IGFscGhhYmV0aWNhbCBvcmRlciBvZiB0aGUgbmFtZXNwYWNlcyBpbiB0aGlzIGRlZmVjdC4gLS0+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly9hdGVtcHVyaS5vcmcvdHdvLndzZGwiCi0JeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIG5hbWU9InR3byIKLQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9hdGVtcHVyaS5vcmcvdHdvLndzZGwiCi0JeG1sbnM6d3NkbDE9Imh0dHA6Ly90ZW1wdXJpLm9yZy9vbmUud3NkbCIgeG1sbnM6d3NkbDI9Imh0dHA6Ly9hdGVtcHVyaS5vcmcvdHdvLndzZGwiPgotCTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9vbmUud3NkbCIKLQkJbG9jYXRpb249Im9uZS53c2RsIj4KLQk8L3dzZGw6aW1wb3J0PgotCTx3c2RsOnBvcnRUeXBlIG5hbWU9IlBvcnRUeXBlIj4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbiI+Ci0JCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ3c2RsMTpNZXNzYWdlIiBuYW1lPSJJbnB1dCIvPgotCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9IndzZGwxOk1lc3NhZ2UiIG5hbWU9Ik91dHB1dCIvPgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TG9jYXRpb24vSW1wb3J0RW1wdHlMb2NhdGlvbi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0RW1wdHlMb2NhdGlvbi9JbXBvcnRFbXB0eUxvY2F0aW9uLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjg5NjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0RW1wdHlMb2NhdGlvbi9JbXBvcnRFbXB0eUxvY2F0aW9uLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vZXhhbXBsZS5jb20vSW1wb3J0RW1wdHlMb2NhdGlvbi8iIAotICAgICAgICAgICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0gICAgICAgICAgICAgICAgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgICAgICAgICAgIG5hbWU9IkltcG9ydEVtcHR5TG9jYXRpb24iIAotICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZXhhbXBsZS5jb20vSW1wb3J0RW1wdHlMb2NhdGlvbi8iPgotICA8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vc29tZXVyaSIgbG9jYXRpb249IiIvPgotICA8d3NkbDptZXNzYWdlIG5hbWU9Im1lc3NhZ2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9Im1lc3NhZ2UiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0RW1wdHlOYW1lc3BhY2UvSW1wb3J0RW1wdHlOYW1lc3BhY2Uud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlL0ltcG9ydEVtcHR5TmFtZXNwYWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWFmNzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0RW1wdHlOYW1lc3BhY2UvSW1wb3J0RW1wdHlOYW1lc3BhY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly9leGFtcGxlLmNvbS9JbXBvcnRFbXB0eU5hbWVzcGFjZS8iIAotICAgICAgICAgICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIAotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICAgICAgICAgICAgICAgIG5hbWU9IkltcG9ydEVtcHR5TmFtZXNwYWNlIiAKLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2V4YW1wbGUuY29tL0ltcG9ydEVtcHR5TmFtZXNwYWNlLyI+Ci0gIDx3c2RsOmltcG9ydCBuYW1lc3BhY2U9IiIgbG9jYXRpb249InNpbXBsZS53c2RsIi8+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibWVzc2FnZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZS9zaW1wbGUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlL3NpbXBsZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDBmMDk4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlL3NpbXBsZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vZXhhbXBsZS5jb20vc2ltcGxlLyIgCi0gICAgICAgICAgICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgCi0gICAgICAgICAgICAgICAgICBuYW1lPSJzaW1wbGUiIAotICAgICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vZXhhbXBsZS5jb20vc2ltcGxlLyI+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRFbXB0eU5hbWVzcGFjZUFuZExvY2F0aW9uL0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24ud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24vSW1wb3J0RW1wdHlOYW1lc3BhY2VBbmRMb2NhdGlvbi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM1MjE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24vSW1wb3J0RW1wdHlOYW1lc3BhY2VBbmRMb2NhdGlvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL2V4YW1wbGUuY29tL0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24vIiAKLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLSAgICAgICAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICAgICAgICBuYW1lPSJJbXBvcnRFbXB0eU5hbWVzcGFjZUFuZExvY2F0aW9uIiAKLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2V4YW1wbGUuY29tL0ltcG9ydEVtcHR5TmFtZXNwYWNlQW5kTG9jYXRpb24vIj4KLSAgPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iIiBsb2NhdGlvbj0iIi8+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ibWVzc2FnZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnROb0xvY2F0aW9uQXR0cmlidXRlL0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUvSW1wb3J0Tm9Mb2NhdGlvbkF0dHJpYnV0ZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDAyMjc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUvSW1wb3J0Tm9Mb2NhdGlvbkF0dHJpYnV0ZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL2V4YW1wbGUuY29tL0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUvIiAKLSAgICAgICAgICAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotICAgICAgICAgICAgICAgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgICAgICAgICAgICBuYW1lPSJJbXBvcnROb0xvY2F0aW9uQXR0cmlidXRlIiAKLSAgICAgICAgICAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL2V4YW1wbGUuY29tL0ltcG9ydE5vTG9jYXRpb25BdHRyaWJ1dGUvIj4KLSAgPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3NvbWV1cmkiLz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJtZXNzYWdlIj4KLQkJPHdzZGw6cGFydCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3dzZGw6cGFydD4KLQk8L3dzZGw6bWVzc2FnZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydE5vbkV4aXN0YW50RmlsZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0Tm9uRXhpc3RhbnRGaWxlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NzY3NTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0Tm9uRXhpc3RhbnRGaWxlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnROb25FeGlzdGFudEZpbGUvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iSW1wb3J0Tm9uRXhpc3RhbnRGaWxlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnROb25FeGlzdGFudEZpbGUvIj4KLQk8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vbm9uZXhpc3RpbmdmaWxlIiBsb2NhdGlvbj0iVGhpc0ZpbGVEb2VzbnRFeGlzdC53c2RsIj48L3dzZGw6aW1wb3J0PgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWVlYjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0LyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IkltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydC8iIHhtbG5zOnNjaGVtYT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+Ci0gIDx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIGxvY2F0aW9uPSJzY2hlbWEueHNkIj48L3dzZGw6aW1wb3J0PiAgICAKLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdNZXNzYWdlIj4KLSAgICAJPHdzZGw6cGFydCBuYW1lPSJOZXdNZXNzYWdlIiBlbGVtZW50PSJzY2hlbWE6TmV3R2xvYmFsRWxlbWVudCI+PC93c2RsOnBhcnQ+Ci0gICAgPC93c2RsOm1lc3NhZ2U+ICAgCi08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUy53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnRJbnZhbGlkTlMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxYTAyNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRTY2hlbWFXaXRoV1NETEltcG9ydEludmFsaWROUy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnRJbnZhbGlkTlMvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iSW1wb3J0U2NoZW1hV2l0aFdTRExJbXBvcnRJbnZhbGlkTlMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFNjaGVtYVdpdGhXU0RMSW1wb3J0SW52YWxpZE5TLyI+Ci0JPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL2ludmFsaWRuYW1lc3BhY2UiIGxvY2F0aW9uPSJzY2hlbWEueHNkIj48L3dzZGw6aW1wb3J0PgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTREwud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4ZTJmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRXU0RMV2l0aFdTREwud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFdTRExXaXRoV1NETC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRXU0RMV2l0aFdTREwiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydFdTRExXaXRoV1NETC8iPgotCTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9zaW1wbGV3c2RsLyIgbG9jYXRpb249InNpbXBsZXdzZGwud3NkbCI+PC93c2RsOmltcG9ydD4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWRGaWxlbmFtZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZEZpbGVuYW1lLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYmI5M2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZEZpbGVuYW1lLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkRmlsZW5hbWUvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZEZpbGVuYW1lIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkRmlsZW5hbWUvIj4KLQk8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vaW52YWxpZG5hbWVzcGFjZSIgbG9jYXRpb249IlNJTVBMRVdTREwud3NkbCI+PC93c2RsOmltcG9ydD4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFdTRExXaXRoV1NETEludmFsaWROUy53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZE5TLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODJlYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZE5TLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkTlMvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iSW1wb3J0V1NETFdpdGhXU0RMSW52YWxpZE5TIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRXU0RMV2l0aFdTRExJbnZhbGlkTlMvIj4KLQk8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vaW52YWxpZG5hbWVzcGFjZSIgbG9jYXRpb249InNpbXBsZXdzZGwud3NkbCI+PC93c2RsOmltcG9ydD4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML0ltcG9ydFhNTEludmFsaWRXU0RMLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC9JbXBvcnRYTUxJbnZhbGlkV1NETC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWE3ODg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML0ltcG9ydFhNTEludmFsaWRXU0RMLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRYTUxJbnZhbGlkV1NETC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRYTUxJbnZhbGlkV1NETCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0WE1MSW52YWxpZFdTREwvIj4KLQk8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvWE1MSW52YWxpZFdTREwvIiBsb2NhdGlvbj0iWE1MSW52YWxpZFdTREwud3NkbCI+PC93c2RsOmltcG9ydD4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML1hNTEludmFsaWRXU0RMLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRYTUxJbnZhbGlkV1NETC9YTUxJbnZhbGlkV1NETC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTkyZDgxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydFhNTEludmFsaWRXU0RML1hNTEludmFsaWRXU0RMLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgVGhlIGRlZmluaXRpb25zIGVsZW1lbnQgaXNuJ3QgY2xvc2VkLiAtLT4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL1hNTEludmFsaWRXU0RMLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlhNTEludmFsaWRXU0RMIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9YTUxJbnZhbGlkV1NETC8iCi0gIDx3c2RsOnR5cGVzPgotICAgIDx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1hNTEludmFsaWRXU0RMLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6c2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvblJlc3BvbnNlIiBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IGVsZW1lbnQ9InRuczpOZXdPcGVyYXRpb25SZXF1ZXN0IiBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ii8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJYTUxJbnZhbGlkV1NETCI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJYTUxJbnZhbGlkV1NETFNPQVAiIHR5cGU9InRuczpYTUxJbnZhbGlkV1NETCI+Ci0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL1hNTEludmFsaWRXU0RML05ld09wZXJhdGlvbiIvPgotICAgICAgPHdzZGw6aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlhNTEludmFsaWRXU0RMIj4KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpYTUxJbnZhbGlkV1NETFNPQVAiIG5hbWU9IlhNTEludmFsaWRXU0RMU09BUCI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0ZWRVc2luZ0NsYXNzcGF0aC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0ZWRVc2luZ0NsYXNzcGF0aC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU1NjU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydGVkVXNpbmdDbGFzc3BhdGgud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydGVkVXNpbmdDbGFzc3BhdGgvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iSW1wb3J0ZWRVc2luZ0NsYXNzcGF0aCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0ZWRVc2luZ0NsYXNzcGF0aC8iPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0ibWVzc2FnZSI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ieHNkOnN0cmluZyI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRpbmdTY2hlbWFOb3RJbkRpci54c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRpbmdTY2hlbWFOb3RJbkRpci54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZmZkY2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0aW5nU2NoZW1hTm90SW5EaXIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSIgeG1sbnM6SW1wb3J0aW5nU2NoZW1hTm90SW5EaXI9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIHhtbG5zOnBsYWluc2NoZW1hPSJodHRwOi8vcGxhaW5zY2hlbWEiPgotCTxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vcGxhaW5zY2hlbWEiIHNjaGVtYUxvY2F0aW9uPSJzdWJmb2xkZXIvUGxhaW5TY2hlbWEueHNkIj48L2ltcG9ydD4KLQk8ZWxlbWVudCBuYW1lPSJOZXdHbG9iYWxFbGVtZW50IiB0eXBlPSJwbGFpbnNjaGVtYTpOZXdTaW1wbGVUeXBlIj48L2VsZW1lbnQ+Ci0KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRpbmdVc2luZ0NsYXNzcGF0aC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWY1OTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L0ltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0aW5nVXNpbmdDbGFzc3BhdGgvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iSW1wb3J0aW5nVXNpbmdDbGFzc3BhdGgiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL0ltcG9ydGluZ1VzaW5nQ2xhc3NwYXRoLyIgeG1sbnM6Y2xhc3NwYXRoPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0ZWRVc2luZ0NsYXNzcGF0aC8iPgotCTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRlZFVzaW5nQ2xhc3NwYXRoLyIgbG9jYXRpb249IkltcG9ydGVkVXNpbmdDbGFzc3BhdGgud3NkbCI+PC93c2RsOmltcG9ydD4KLSAgICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJwb3J0VHlwZSI+Ci0gICAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ib3BlcmF0aW9uIj4KLSAgICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0iY2xhc3NwYXRoOm1lc3NhZ2UiPjwvd3NkbDppbnB1dD4KLSAgICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9ImNsYXNzcGF0aDptZXNzYWdlIj48L3dzZGw6b3V0cHV0PgotICAgICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8L3dzZGw6cG9ydFR5cGU+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9JbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OWM3YzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvSW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0aW5nV1NETFdpdGhJbXBvcnRlZFNjaGVtYS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRpbmdXU0RMV2l0aEltcG9ydGVkU2NoZW1hLyIgeG1sbnM6d3NkbDE9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRlZEltcG9ydGluZ1NjaGVtYS8iPgotCTx3c2RsOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRlZEltcG9ydGluZ1NjaGVtYS8iIGxvY2F0aW9uPSJzdWJmb2xkZXIvSW1wb3J0ZWRJbXBvcnRpbmdTY2hlbWEud3NkbCI+PC93c2RsOmltcG9ydD4KLQk8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld01lc3NhZ2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9Ik5ld01lc3NhZ2UiIGVsZW1lbnQ9IndzZGwxOk5ld0dsb2JhbEVsZW1lbnQiPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvU2NoZW1hTmFtZXNwYWNlQUFBLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1NjaGVtYU5hbWVzcGFjZUFBQS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NTBkNDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvU2NoZW1hTmFtZXNwYWNlQUFBLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9BQUEiIHhtbG5zOlNjaGVtYU5hbWVzcGFjZUFBQT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+Ci08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YmU3OGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvV1NETEltcG9ydGluZ1NjaGVtYUltcG9ydGluZ1NjaGVtYS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvV1NETEltcG9ydGluZ1NjaGVtYUltcG9ydGluZ1NjaGVtYS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJXU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9XU0RMSW1wb3J0aW5nU2NoZW1hSW1wb3J0aW5nU2NoZW1hLyI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICAgICAgICAgICAgPHhzZDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiBzY2hlbWFMb2NhdGlvbj0iSW1wb3J0aW5nU2NoZW1hTm90SW5EaXIueHNkIi8+Ci0JCTwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMSW1wb3J0aW5nVHlwZXMud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdUeXBlcy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQzN2ZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1dTRExJbXBvcnRpbmdUeXBlcy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvV1NETEltcG9ydGluZ1R5cGVzLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IldTRExJbXBvcnRpbmdUeXBlcyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvV1NETEltcG9ydGluZ1R5cGVzLyIgeG1sbnM6d3NkbDE9Imh0dHA6Ly90ZW1wdXJpLm9yZy9XU0RMT25seVR5cGVzLyI+Ci0gICAgPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1dTRExPbmx5VHlwZXMvIiBsb2NhdGlvbj0iV1NETE9ubHlUeXBlcy53c2RsIj48L3dzZGw6aW1wb3J0PiAgICAKLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld01lc3NhZ2UiPgotICAgIAk8d3NkbDpwYXJ0IG5hbWU9Ik5ld01lc3NhZ2UiIGVsZW1lbnQ9IndzZGwxOk5ld0dsb2JhbEVsZW1lbnQiPjwvd3NkbDpwYXJ0PgotICAgIDwvd3NkbDptZXNzYWdlPgotICAgIAotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvV1NETE5hbWVzcGFjZUFBQS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvV1NETE5hbWVzcGFjZUFBQS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMxOGRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L1dTRExOYW1lc3BhY2VBQUEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL0FBQSIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IldTRExOYW1lc3BhY2VBQUEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL0FBQSI+Ci0JPHdzZGw6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL0FBQSIgbG9jYXRpb249IlNjaGVtYU5hbWVzcGFjZUFBQS54c2QiPjwvd3NkbDppbXBvcnQ+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMT25seVR5cGVzLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9XU0RMT25seVR5cGVzLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjRmNjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvV1NETE9ubHlUeXBlcy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvV1NETE9ubHlUeXBlcy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJXU0RMT25seVR5cGVzIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9XU0RMT25seVR5cGVzLyI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1dTRExPbmx5VHlwZXMvIj4KLQkJPHhzZDplbGVtZW50IG5hbWU9Ik5ld0dsb2JhbEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3NjaGVtYS54c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zY2hlbWEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2VlNTBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3NjaGVtYS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiB4bWxuczpzY2hlbWE9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iPgotCTxlbGVtZW50IG5hbWU9Ik5ld0dsb2JhbEVsZW1lbnQiIHR5cGU9InN0cmluZyI+PC9lbGVtZW50PgotCi08L3NjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zaW1wbGV3c2RsLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zaW1wbGV3c2RsLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjM3YWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvc2ltcGxld3NkbC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvc2ltcGxld3NkbC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJzaW1wbGV3c2RsIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9zaW1wbGV3c2RsLyIvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvc3ViZm9sZGVyL0ltcG9ydGVkSW1wb3J0aW5nU2NoZW1hLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zdWJmb2xkZXIvSW1wb3J0ZWRJbXBvcnRpbmdTY2hlbWEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyZmQyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zdWJmb2xkZXIvSW1wb3J0ZWRJbXBvcnRpbmdTY2hlbWEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9JbXBvcnRlZEltcG9ydGluZ1NjaGVtYS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJJbXBvcnRlZEltcG9ydGluZ1NjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0ZWRJbXBvcnRpbmdTY2hlbWEvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvSW1wb3J0ZWRJbXBvcnRpbmdTY2hlbWEvIgotICAgICAgICAgICAgeG1sbnM6SW1wb3J0ZWRXU0RMSW1wb3J0ZWRTY2hlbWE9Imh0dHA6Ly9JbXBvcnRlZFdTRExJbXBvcnRlZFNjaGVtYSI+Ci0JCTx4c2Q6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL0ltcG9ydGVkV1NETEltcG9ydGVkU2NoZW1hIiBzY2hlbWFMb2NhdGlvbj0iSW1wb3J0ZWRXU0RMSW1wb3J0ZWRTY2hlbWEueHNkIj48L3hzZDppbXBvcnQ+Ci0JCTx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdHbG9iYWxFbGVtZW50IiB0eXBlPSJJbXBvcnRlZFdTRExJbXBvcnRlZFNjaGVtYTpOZXdTaW1wbGVUeXBlIj48L3hzZDplbGVtZW50PjwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zdWJmb2xkZXIvSW1wb3J0ZWRXU0RMSW1wb3J0ZWRTY2hlbWEueHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvc3ViZm9sZGVyL0ltcG9ydGVkV1NETEltcG9ydGVkU2NoZW1hLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwMmMwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0ltcG9ydC9zdWJmb2xkZXIvSW1wb3J0ZWRXU0RMSW1wb3J0ZWRTY2hlbWEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL0ltcG9ydGVkV1NETEltcG9ydGVkU2NoZW1hIiB4bWxuczpJbXBvcnRlZFdTRExJbXBvcnRlZFNjaGVtYT0iaHR0cDovL0ltcG9ydGVkV1NETEltcG9ydGVkU2NoZW1hIj4KLSAgPHNpbXBsZVR5cGUgbmFtZT0iTmV3U2ltcGxlVHlwZSI+Ci0gICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICA8bWluTGVuZ3RoIHZhbHVlPSIxIi8+Ci0gICAgPC9yZXN0cmljdGlvbj4KLSAgPC9zaW1wbGVUeXBlPgotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvc3ViZm9sZGVyL1BsYWluU2NoZW1hLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvSW1wb3J0L3N1YmZvbGRlci9QbGFpblNjaGVtYS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZGU3NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9JbXBvcnQvc3ViZm9sZGVyL1BsYWluU2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9wbGFpbnNjaGVtYSIgeG1sbnM6UGxhaW5TY2hlbWE9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iPgotCTxzaW1wbGVUeXBlIG5hbWU9Ik5ld1NpbXBsZVR5cGUiPgotICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgPG1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotICAgIDwvcmVzdHJpY3Rpb24+Ci0gIDwvc2ltcGxlVHlwZT4KLTwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvU2VsZkNvbnRhaW5lZC9FbXB0eS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL0VtcHR5LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL0VtcHR5LndzZGwKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL05vRGVmYXVsdE5hbWVzcGFjZS9Ob0RlZmF1bHROYW1lc3BhY2Uud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvU2VsZkNvbnRhaW5lZC9Ob0RlZmF1bHROYW1lc3BhY2UvTm9EZWZhdWx0TmFtZXNwYWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MzNlODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL05vRGVmYXVsdE5hbWVzcGFjZS9Ob0RlZmF1bHROYW1lc3BhY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL05vRGVmYXVsdE5hbWVzcGFjZS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJOb0RlZmF1bHROYW1lc3BhY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL05vRGVmYXVsdE5hbWVzcGFjZS8iPgotICA8d3NkbDpkb2N1bWVudGF0aW9uPgotICAgIDxlbGVtZW50Tm9OYW1lc3BhY2UvPgotICA8L3dzZGw6ZG9jdW1lbnRhdGlvbj4gICAgCi08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL1JlZmVyZW5jZUlubGluZVR5cGVzLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvUmVmZXJlbmNlSW5saW5lVHlwZXMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjMTMzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML1NlbGZDb250YWluZWQvUmVmZXJlbmNlSW5saW5lVHlwZXMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZWZlcmVuY2VJbmxpbmVUeXBlcy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJSZWZlcmVuY2VJbmxpbmVUeXBlcyIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvUmVmZXJlbmNlSW5saW5lVHlwZXMvIj4KLSAgICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld01lc3NhZ2UiPgotICAgIAk8d3NkbDpwYXJ0IG5hbWU9Ik5ld01lc3NhZ2UiIGVsZW1lbnQ9InRuczpOZXdHbG9iYWxFbGVtZW50Ij48L3dzZGw6cGFydD4KLSAgICA8L3dzZGw6bWVzc2FnZT4KLSAgICA8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvUmVmZXJlbmNlSW5saW5lVHlwZXMvIj4KLQkJPHhzZDplbGVtZW50IG5hbWU9Ik5ld0dsb2JhbEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+PC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvU2VsZkNvbnRhaW5lZC9TT0FQQm9keUVuY29kZWROb05hbWVzcGFjZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZWJjZDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2UvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iU09BUEJvZHlFbmNvZGVkTm9OYW1lc3BhY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1NPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlLyI+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJTT0FQQm9keUVuY29kZWROb05hbWVzcGFjZSI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJTT0FQQm9keUVuY29kZWROb05hbWVzcGFjZVNPQVAiIHR5cGU9InRuczpTT0FQQm9keUVuY29kZWROb05hbWVzcGFjZSI+Ci0gICAgPHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9TT0FQQm9keUVuY29kZWROb05hbWVzcGFjZS9OZXdPcGVyYXRpb24iLz4KLSAgICAgIDx3c2RsOmlucHV0PgotICAgICAgICA8c29hcDpib2R5IGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB1c2U9ImVuY29kZWQiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgdXNlPSJlbmNvZGVkIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlNPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlIj4KLSAgICA8d3NkbDpwb3J0IGJpbmRpbmc9InRuczpTT0FQQm9keUVuY29kZWROb05hbWVzcGFjZVNPQVAiIG5hbWU9IlNPQVBCb2R5RW5jb2RlZE5vTmFtZXNwYWNlU09BUCI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2Uud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvU2VsZkNvbnRhaW5lZC9TT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNDEzZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvV1NETC9TZWxmQ29udGFpbmVkL1NPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9TT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlNPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1NPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2UvIj4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IlNPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2UiPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgotICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZVNPQVAiIHR5cGU9InRuczpTT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlIj4KLSAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL1NPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2UvTmV3T3BlcmF0aW9uIi8+Ci0gICAgICA8d3NkbDppbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvU09BUEJvZHlFbmNvZGVkV2l0aE5hbWVzcGFjZS8iIHVzZT0iZW5jb2RlZCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9TT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlLyIgdXNlPSJlbmNvZGVkIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IlNPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2UiPgotICAgIDx3c2RsOnBvcnQgYmluZGluZz0idG5zOlNPQVBCb2R5RW5jb2RlZFdpdGhOYW1lc3BhY2VTT0FQIiBuYW1lPSJTT0FQQm9keUVuY29kZWRXaXRoTmFtZXNwYWNlU09BUCI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzSW52YWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzSW52YWxpZC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjcyMjlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9FbnRpdGllcy9ub3JtYWxpemVFbnRpdGllc0ludmFsaWQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEludmFsaWQgdGVzdCBmb3IgRWNsaXBzZSBkZWZlY3QgNzA2NzAuIC0tPgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5vcm1hbGl6ZUVudGl0aWVzSW52YWxpZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvbm9ybWFsaXplRW50aXRpZXNJbnZhbGlkLyI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL25vcm1hbGl6ZUVudGl0aWVzSW52YWxpZC8iPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhU3RyaW5nIj4gCi0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IkZ8PHw+fH58SHxKfHgiLz4gCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4gCi0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4gCi0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4gCi0JCTwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNWYWxpZC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL0VudGl0aWVzL25vcm1hbGl6ZUVudGl0aWVzVmFsaWQud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1ZWE0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvRW50aXRpZXMvbm9ybWFsaXplRW50aXRpZXNWYWxpZC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gVmFsaWQgdGVzdCBmb3IgRWNsaXBzZSBkZWZlY3QgNzA2NzAuIC0tPgotPHdzZGw6ZGVmaW5pdGlvbnMgeG1sbnM6dG5zPSJodHRwOi8vdGVtcHVyaS5vcmcvbm9ybWFsaXplRW50aXRlc1ZhbGlkLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9Im5vcm1hbGl6ZUVudGl0ZXNWYWxpZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvbm9ybWFsaXplRW50aXRlc1ZhbGlkLyI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL25vcm1hbGl6ZUVudGl0ZXNWYWxpZC8iPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhU3RyaW5nIj4gCi0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IkZ8Jmx0O3wmZ3Q7fH58SHxKfHgiLz4gCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4gCi0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4gCi0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4gCi0JCTwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzg3ODMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS9JbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxkZWZpbml0aW9ucyBuYW1lPSJJbXBvcnRJbmxpbmVTY2hlbWFXaXRoSW5jbHVkZSIKLQl4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdC5jb20vSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUiCi0JeG1sbnM6dG5zPSJodHRwOi8vdGVzdC5jb20vSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUiCi0JeG1sbnM6c2NoPSJodHRwOi8vdGVzdC5jb20vc2NoZW1hIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotCQotCTx0eXBlcz4KLQkJPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdC5jb20vc2NoZW1hIj4JCQkKLQkJCTx4c2Q6aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hLnhzZCIvPgotCQk8L3hzZDpzY2hlbWE+Ci0JCQkKLQkJPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdC5jb20vSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUiIHhtbG5zOnNjaD0iaHR0cDovL3Rlc3QuY29tL3NjaGVtYSI+Ci0JCQk8eHNkOmltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZXN0LmNvbS9zY2hlbWEiLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFbGVtZW50IiB0eXBlPSJzY2g6TXlUeXBlIi8+Ci0JCTwveHNkOnNjaGVtYT4KLQk8L3R5cGVzPgkKLQkKLQk8bWVzc2FnZSBuYW1lPSJyZXF1ZXN0Ij4KLQkJPHBhcnQgbmFtZT0icGFydCIgZWxlbWVudD0idG5zOkVsZW1lbnQiLz4KLQk8L21lc3NhZ2U+CQkKLQkKLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL0ltcG9ydElubGluZVNjaGVtYVdpdGhJbmNsdWRlL3NjaGVtYS54c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvc2NoZW1hLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNmU3Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvSW1wb3J0SW5saW5lU2NoZW1hV2l0aEluY2x1ZGUvc2NoZW1hLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVzdC5jb20vc2NoZW1hIiAKLQl4bWxuczp0bnM9Imh0dHA6Ly90ZXN0LmNvbS9zY2hlbWEiPgotCQotCTxjb21wbGV4VHlwZSBuYW1lPSJNeVR5cGUiPgotCQk8YXR0cmlidXRlIG5hbWU9ImF0dG9uZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iYXR0dHdvIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQk8L2NvbXBsZXhUeXBlPgotCQotPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL0lubGluZVNjaGVtYUdlbmVyYXRlZEltcG9ydHMvTm9JbXBvcnRGb3JVbnByZWZpeGVkQXR0cmlidXRlLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwNzljYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvSW5saW5lU2NoZW1hR2VuZXJhdGVkSW1wb3J0cy9Ob0ltcG9ydEZvclVucHJlZml4ZWRBdHRyaWJ1dGUud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vTm9JbXBvcnRGb3JVbnByZWZpeGVkQXR0cmlidXRlLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iTm9JbXBvcnRGb3JVbnByZWZpeGVkQXR0cmlidXRlIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vTm9JbXBvcnRGb3JVbnByZWZpeGVkQXR0cmlidXRlLyI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4czpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL05vSW1wb3J0Rm9yVW5wcmVmaXhlZEF0dHJpYnV0ZS8iIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiPgotCQkJPHhzOmNvbXBsZXhUeXBlIG5hbWU9InR5cGVXaXRoTWluTWF4T2NjdXJzIj4KLQkJCQk8eHM6c2VxdWVuY2U+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJlbGVtMSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJCTx4czplbGVtZW50IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiBuYW1lPSJlbGVtMiIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0JCQkJPC94czpzZXF1ZW5jZT4KLQkJCTwveHM6Y29tcGxleFR5cGU+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0idHlwZVdpdGhSZXN0cmljdGlvbiI+Ci0JCQkJPHhzOnNlcXVlbmNlPgotCQkJCQk8eHM6ZWxlbWVudCBuYW1lPSJlbGVtMyI+Ci0JCQkJCQk8eHM6c2ltcGxlVHlwZT4KLQkJCQkJCQk8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6Tk1UT0tFTiI+Ci0JCQkJCQkJCTx4czplbnVtZXJhdGlvbiB2YWx1ZT0ic29tZXRoaW5nIi8+Ci0JCQkJCQkJPC94czpyZXN0cmljdGlvbj4KLQkJCQkJCTwveHM6c2ltcGxlVHlwZT4KLQkJCQkJPC94czplbGVtZW50PgotCQkJCTwveHM6c2VxdWVuY2U+Ci0JCQk8L3hzOmNvbXBsZXhUeXBlPgotCQk8L3hzOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTU0ZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0Qud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNEIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvIiB4bWxuczp4c2QxPSJodHRwOi8vdGVtcHVyaS5vcmcvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELzEiIHhtbG5zOnhzZDI9Imh0dHA6Ly90ZW1wdXJpLm9yZy9PbmVFcnJvckZvcklubGluZVhTRFJlZkludmFsaWRJbmxpbmVYU0QvMSI+Ci0JPHdzZGw6dHlwZXM+Ci0JCTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0JCQllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLQkJCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL09uZUVycm9yRm9ySW5saW5lWFNEUmVmSW52YWxpZElubGluZVhTRC8xIj4KLQkJICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3R2xvYmFsRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZ2EiPjwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNjaGVtYT4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvT25lRXJyb3JGb3JJbmxpbmVYU0RSZWZJbnZhbGlkSW5saW5lWFNELzIiPgotCQkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmV3Q29tcGxleFR5cGUiPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IHJlZj0ieHNkMTpOZXdHbG9iYWxFbGVtZW50Ij48L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0JCTwveHNkOnNjaGVtYT4KLQk8L3dzZGw6dHlwZXM+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS9SZWZlclRvQW5vdGhlcklubGluZVR5cGUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5OGZkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJSZWZlclRvQW5vdGhlcklubGluZVR5cGUiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZS8iPgotCTx3c2RsOnR5cGVzPgotCQk8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZWZlclRvQW5vdGhlcklubGluZVR5cGUxLyIKLSAgICAgICAgICAgIHhtbG5zOnR3bz0iaHR0cDovL3RlbXB1cmkub3JnL1JlZmVyVG9Bbm90aGVySW5saW5lVHlwZTIvIj4KLSAgICAgICAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iTmV3U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOm1pbkxlbmd0aCB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLQkJICA8eHNkOmVsZW1lbnQgbmFtZT0iTmV3R2xvYmFsRWxlbWVudCIgdHlwZT0idHdvOk5ld1NpbXBsZVR5cGUiPjwveHNkOmVsZW1lbnQ+Ci0JCTwveHNkOnNjaGVtYT4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvUmVmZXJUb0Fub3RoZXJJbmxpbmVUeXBlMi8iCi0gICAgICAgICAgICB4bWxuczpvbmU9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZWZlclRvQW5vdGhlcklubGluZVR5cGUxLyI+Ci0JCSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Ik5ld1NpbXBsZVR5cGUiPgotICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDptaW5MZW5ndGggdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0JCSAgPHhzZDplbGVtZW50IG5hbWU9Ik5ld0dsb2JhbEVsZW1lbnQiIHR5cGU9Im9uZTpOZXdTaW1wbGVUeXBlIj48L3hzZDplbGVtZW50PgotCQk8L3hzZDpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24ud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24vUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTQzN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1Jlc3RyaWN0aW9uUGF0dGVybldpdGhDb2xvbi9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24vIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgbmFtZT0iUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9SZXN0cmljdGlvblBhdHRlcm5XaXRoQ29sb24vIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLQkJCWVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotCQkJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvUmVzdHJpY3Rpb25QYXR0ZXJuV2l0aENvbG9uLyI+Ci0gICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGltZSI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSIoWzAtOV17Mn06WzAtOV17Mn06WzAtOV17Mn0pfCgjZW1wdHkgdmFsdWUpIi8+ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+ICAgICAgICAgIAotCQk8L3hzZDpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0ud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1hTRC9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0vU2NoZW1hRG9jRWxlbVdpdGhTb3VyY2VBbmRTdWJFbGVtLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjY2Y2MTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1NjaGVtYURvY0VsZW1XaXRoU291cmNlQW5kU3ViRWxlbS9TY2hlbWFEb2NFbGVtV2l0aFNvdXJjZUFuZFN1YkVsZW0ud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vc2FtcGxlLyIgCi0gICAgICAgICAgICAgeG1sbnM6dG5zPSJodHRwOi8vc2FtcGxlLyIgCi0gICAgICAgICAgICAgeG1sbnM6ZXg9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIAotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0JPHR5cGVzPgotCQk8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCI+Ci0JCQk8eHM6Y29tcGxleFR5cGUgbmFtZT0iTmFtZSI+Ci0JCQkJPHhzOmFubm90YXRpb24+Ci0JCQkJCTx4czpkb2N1bWVudGF0aW9uIHNvdXJjZT0iaHR0cDovL3d3dy5leGFtcGxlLmNvbSI+Ci0JCQkJCQk8Y2hvaWNlIC8+Ci0JCQkJCTwveHM6ZG9jdW1lbnRhdGlvbj4KLQkJCQk8L3hzOmFubm90YXRpb24+Ci0JCQk8L3hzOmNvbXBsZXhUeXBlPgotCQk8L3hzOnNjaGVtYT4KLQk8L3R5cGVzPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvVmFsdWVDb2xvbi9WYWx1ZUNvbG9uLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9YU0QvVmFsdWVDb2xvbi9WYWx1ZUNvbG9uLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NDMzOWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy90ZXN0cmVzb3VyY2VzL3NhbXBsZXMvWFNEL1ZhbHVlQ29sb24vVmFsdWVDb2xvbi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnL1ZhbHVlQ29sb24vIgotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotCXhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIG5hbWU9IlZhbHVlQ29sb24iCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvVmFsdWVDb2xvbi8iPgotCTx3c2RsOnR5cGVzPgotCQk8eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotCQkJZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0JCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9WYWx1ZUNvbG9uLyI+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iTXlFbGVtZW50Ij4KLQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCTx4c2Q6YXBwaW5mbyBzb3VyY2U9Imh0dHA6Ly9zYW1wbGUuY29tIj4KLQkJCQkJCTx4c2Q6aW5pdGlhbFZhbHVlIGtpbmQ9InN0cmluZ192YWx1ZSIgdmFsdWU9IjoiLz4KLQkJCQkJPC94c2Q6YXBwaW5mbz4KLQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJPC94c2Q6c2NoZW1hPgotCTwvd3NkbDp0eXBlcz4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODMwMGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi13c2kudGVzdHMuamFyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTE4Mzk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5pYm0uZXRvb2xzLndzZGw8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0PmNvbS5pYm0ud3NkbDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmFwYWNoZS54ZXJjZXM8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuZW1mLmVjb3JlPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UueHNkPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuanVuaXQ8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuc3RydWN0dXJlZGJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxN2M0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogV1NJIEpVbml0IFRlc3QKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2kudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUNsYXNzUGF0aDogd3NpLnRlc3RzLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy5pbnRlcm5hbC5XU0lUZXN0c1BsdWdpbgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2Uud3N0LndzaSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuanVuaXQsCi0gb3JnLndzZGw0aiwKLSBvcmcuZWNsaXBzZS5vc2dpLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmUKLUVjbGlwc2UtQXV0b1N0YXJ0OiB0cnVlCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3ZWFlYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS53c2kudGVzdHMuamFyID0gc3JjLwotb3V0cHV0LndzaS50ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHdzaS50ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgdGVzdFJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcnVudGVzdHMuYmF0LFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmNjVmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdGVzdHMvaW50ZXJuYWwvQ29yZVdTRExDb25mb3JtYW5jZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdGVzdHMvaW50ZXJuYWwvQ29yZVdTRExDb25mb3JtYW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk3ZTlkZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3Rlc3RzL2ludGVybmFsL0NvcmVXU0RMQ29uZm9ybWFuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5CaW5kaW5nOwotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLk1lc3NhZ2U7Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuUG9ydFR5cGU7Ci1pbXBvcnQgamF2YXgud3NkbC5TZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwueG1sLldTRExSZWFkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLldTSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwuV1NJVGVzdFRvb2xzUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmFuYWx5emVyLldTRExBbmFseXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUud3NkbC5XU0RMUmVhZGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NpLmludGVybmFsLmNvcmUueG1sLlhNTFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2kuaW50ZXJuYWwucmVwb3J0LkFzc2VydGlvbkVycm9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb3JlV1NETENvbmZvcm1hbmNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0JBU0VfRElSRUNUT1JZID0gInRlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DQVNFX0ZJTEUgPSAidGVzdGNhc2UueG1sIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9FWFRFTlNJT04gPSAiLndzZGwiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFEX0lEX0FQID0gIkFQMTAiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQURfSURfU1NCUCA9ICJTU0JQMTAiOwotICAKLSAgcHJvdGVjdGVkIFN0cmluZyBwbHVnaW5VUkkgPSBudWxsOwotICBwcm90ZWN0ZWQgU3RyaW5nIHRhZElEID0gVEFEX0lEX0FQOwotICAKLSAgcHVibGljIENvcmVXU0RMQ29uZm9ybWFuY2VUZXN0KFN0cmluZyBuYW1lKSAKLSAgewotICAgICAgc3VwZXIobmFtZSk7Ci0JICBwbHVnaW5VUkkgPSBXU0lUZXN0c1BsdWdpbi5nZXRJbnN0YWxsVVJMKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cCgpCi0gIHsKLQkgIAotICB9Ci0gIAotICAvKioKLSAgICogSlVuaXQgdGVzdDogdmFsaWRhdGUgdGhlIHdzZGwgZG9jdW1lbnQgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIFdTLUkgUHJvZmlsZS4KLSAgICogQHBhcmFtIHRhZCBoZSBXUy1JIFRlc3QgQXNzZXJ0aW9uIERvY3VtZW50Ci0gICAqIEBwYXJhbSB0ZXN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjb250YWluaW5nIHRoZSB3c2RsIGRvY3VtZW50Ci0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgdGFkSUQpCi0gIHsJCi0JdGhpcy50YWRJRCA9IHRhZElEOwotCi0gICAgYXNzZXJ0Tm90TnVsbCgiUHJvYmxlbXMgZGV0ZXJtaW5pbmcgYmFzZSB1cmwiLCBwbHVnaW5VUkkpOwotICAgIFN0cmluZyB0ZXN0RGlyZWN0b3J5ICA9IHBsdWdpblVSSSArIFdTRExfQkFTRV9ESVJFQ1RPUlkgKyAiLyIgKyBjYXRlZ29yeSArICIvIiArIHRlc3ROYW1lOwotICAgIFN0cmluZyB3c2RsRmlsZSA9ICJmaWxlOi8vIiArIHRlc3REaXJlY3RvcnkgKyAiLyIgKyB0ZXN0TmFtZSArIFdTRExfRVhURU5TSU9OOwotICAgIFN0cmluZyB0ZXN0Y2FzZUZpbGUgPSB0ZXN0RGlyZWN0b3J5ICsgICIvIiArIFRFU1RfQ0FTRV9GSUxFOwotICAgIAotCS8vIHZhbGlkYXRlIHRoZSBXU0RMIGRvY3VtZW50Ci0gICAgV1NETEFuYWx5emVyIGFuYWx5emVyID0gdmFsaWRhdGVDb25mb3JtYW5jZSh3c2RsRmlsZSwgdGFkSUQpOwotICAgIGFzc2VydE5vdE51bGwoIlVua25vd24gcHJvYmxlbXMgZHVyaW5nIHZhbGlkYXRpb24iLCBhbmFseXplcik7Ci0gICAgCi0JLy8gcmV0cmlldmUgdGhlIGV4cGVjdGVkIGFzc2VydGlvbiBmYWlsdXJlcwotCUxpc3QgZXhwZWN0ZWRFcnJvcnMgPSBnZXRFeHBlY3RlZEFzc2VydGlvbkZhaWx1cmVzKHRlc3RjYXNlRmlsZSk7Ci0JYXNzZXJ0Tm90TnVsbCgiUHJvYmxlbXMgcmV0cmlldmluZyBleHBlY3RlZCBmYWlsdXJlcyIsIGV4cGVjdGVkRXJyb3JzKTsKLQkKLQkvLyBjb21wYXJlIHRoZSBhY3R1YWwgZXJyb3JzIHdpdGggdGhlIGV4cGVjdGVkIGVycm9ycwotICAgIGFuYWx5emVSZXN1bHRzKGFuYWx5emVyLmdldEFzc2VydGlvbkVycm9ycygpLCBleHBlY3RlZEVycm9ycyk7Ci0gIH0gICAgCi0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSB3c2RsIGRvY3VtZW50IGFnYWluc3QgdGhlIHNwZWNpZmllZCBXUy1JIFByb2ZpbGUuCi0gICAqIEBwYXJhbSB0YWQgIHRoZSBXUy1JIFRlc3QgQXNzZXJ0aW9uIERvY3VtZW50Ci0gICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgd3NkbCBkb2N1bWVudAotICAgKiBAcmV0dXJuIHRoZSBXU0RMQW5hbHl6ZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbGlkYXRpb24gcmVzdWx0cwotICAgKi8gIAotICBwcm90ZWN0ZWQgV1NETEFuYWx5emVyIHZhbGlkYXRlQ29uZm9ybWFuY2UoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGFkSUQpCi0gIHsKLQlXU0RMQW5hbHl6ZXIgYW5hbHl6ZXIgPSBudWxsOwotICAgIHRyeSAKLSAgICB7Ci0gICAJICBXU0lQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IG5ldyBXU0lQcmVmZXJlbmNlcygpOwotICAgCSAgcHJlZmVyZW5jZXMuc2V0Q29tcGxpYW5jZUxldmVsKCBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLlNUT1BfTk9OX1dTSSk7Ci0JICBwcmVmZXJlbmNlcy5zZXRUQURGaWxlKGdldFRBRFVSSSh0YWRJRCkpOwotCQkKLQkgIGFuYWx5emVyID0gbmV3IFdTRExBbmFseXplcihmaWxlbmFtZSwgcHJlZmVyZW5jZXMpOwotCSAgc2V0Q29uZmlndXJhdGlvbnMoZmlsZW5hbWUsIGFuYWx5emVyKTsKLQkJCi0JICAvLyBydW4gdGhlIGNvbmZvcm1hbmNlIGNoZWNrIGFuZCBhZGQgZXJyb3JzIGFuZCB3YXJuaW5ncyBhcyBuZWVkZWQKLQkgIGFuYWx5emVyLnZhbGlkYXRlQ29uZm9ybWFuY2UoKTsKLSAgICB9ICAgIAotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9CQotCXJldHVybiBhbmFseXplcjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHJpZXZlIHRoZSBleHBlY3RlZCBhc3NlcnRpb24gZmFpbHVyZXMuCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAtIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGVzdGNhc2UueG1sIGZpbGUuCi0gICAqIEByZXR1cm4gdGhlIGV4cGVjdGVkIGFzc2VydGlvbiBmYWlsdXJlcy4KLSAgICovCi0gIHByb3RlY3RlZCBMaXN0IGdldEV4cGVjdGVkQXNzZXJ0aW9uRmFpbHVyZXMoU3RyaW5nIGZpbGVuYW1lKQotICB7Ci0JTGlzdCBhc3NlcnRpb25GYWlsdXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB0cnkKLQl7Ci0JICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIucGFyc2UoZmlsZW5hbWUpOwotCSAgTm9kZUxpc3QgbGlzdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYXNzZXJ0aW9uIik7Ci0JICBpZiAobGlzdCAhPSBudWxsKQotCSAgZm9yIChpbnQgaT0wOyBpPGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkgIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbGlzdC5pdGVtKGkpOwotCQlTdHJpbmcgdGFkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRhZElEIik7Ci0JCWlmICgodGFkICE9IG51bGwpICYmIHRhZC5lcXVhbHModGhpcy50YWRJRCkpCi0JCSAgIGFzc2VydGlvbkZhaWx1cmVzLmFkZChlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSk7Ci0JICB9Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkKLQl7Ci0JICBhc3NlcnRpb25GYWlsdXJlcyA9IG51bGw7Ci0JfQotCSAgcmV0dXJuIGFzc2VydGlvbkZhaWx1cmVzOwotICB9Ci0gIAotICAvKioKLSAgICogQ29tcGFyZSB0aGUgYWN0dWFsIGVycm9ycyB3aXRoIHRoZSBleHBlY3RlZCBlcnJvcnMuCi0gICAqIEBwYXJhbSBlcnJvcnMgdGhlIGFjdHVhbCBhc3NlcnRpb24gZmFpbHVyZXMKLSAgICogQHBhcmFtIGV4cGVjdGVkRXJyb3JzIHRoZSBleHBlY3RlZCBhc3NlcnRpb24gZmFpbHVyZXMKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFuYWx5emVSZXN1bHRzKExpc3QgZXJyb3JzLCBMaXN0IGV4cGVjdGVkRXJyb3JzKQotICB7Ci0JIExpc3QgYWN0dWFsRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCSBpZiAoKGVycm9ycyAhPSBudWxsKSAmJiAoZXhwZWN0ZWRFcnJvcnMgIT0gbnVsbCkpCi0JIHsKLSAgICAgICBJdGVyYXRvciBpID0gZXJyb3JzLml0ZXJhdG9yKCk7Ci0gICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotCSAgIHsKLQkJIEFzc2VydGlvbkVycm9yIGUgPSAoQXNzZXJ0aW9uRXJyb3IpaS5uZXh0KCk7Ci0JCSBTdHJpbmcgYXNzZXJ0aW9uSWQgPSBlLmdldEFzc2VydGlvbklEKCk7Ci0JCSBhY3R1YWxFcnJvcnMuYWRkKGFzc2VydGlvbklkKTsKLQkJIAotCQkgaWYgKCFleHBlY3RlZEVycm9ycy5jb250YWlucyhhc3NlcnRpb25JZCkpCi0JCSB7Ci0JCQlmYWlsKCJVbmV4cGVjdGVkIGFzc2VydGlvbiBmYWlsdXJlOiAiICsgYXNzZXJ0aW9uSWQpOyAKLQkJIH0KLQkgICB9Ci0JICAgCi0JICAgaSA9IGV4cGVjdGVkRXJyb3JzLml0ZXJhdG9yKCk7Ci0gICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKQotCSAgIHsKLQkJIFN0cmluZyBhc3NlcnRpb25JZCA9IChTdHJpbmcpaS5uZXh0KCk7Ci0JCSAKLQkJIGlmICghYWN0dWFsRXJyb3JzLmNvbnRhaW5zKGFzc2VydGlvbklkKSkKLQkJIHsKLQkJCWZhaWwoIkV4cGVjdGVkIGFzc2VydGlvbiBmYWlsdXJlOiAiICsgYXNzZXJ0aW9uSWQpOyAKLQkJIH0KLQkgICB9Ci0JICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRXJyb3JzLnNpemUoKSwgZXJyb3JzLnNpemUoKSk7Ci0JIH0KLSAgfQotCi0gIC8qKgotICAgKiBHYXRoZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBXU0RMIGZpbGUuCi0gICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgd3NkbCBsb2NhdGlvbi4KLSAgICogQHBhcmFtIGEgV1NETEFuYWx5emVyIG9iamVjdCBjb250YWluZyBjb25maWd1cmF0aW9uIGluZm8uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXRDb25maWd1cmF0aW9ucyhTdHJpbmcgZmlsZW5hbWUsIFdTRExBbmFseXplciBhbmFseXplcikKLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFdTRExSZWFkZXIgd3NkbFJlYWRlciA9IG5ldyBXU0RMUmVhZGVySW1wbCgpOwotCi0gICAgICAvLyBTZXQgZmVhdHVyZXMKLSAgICAgIHdzZGxSZWFkZXIuc2V0RmVhdHVyZShjb20uaWJtLndzZGwuQ29uc3RhbnRzLkZFQVRVUkVfVkVSQk9TRSwgZmFsc2UpOwotICAgICAgd3NkbFJlYWRlci5zZXRGZWF0dXJlKGNvbS5pYm0ud3NkbC5Db25zdGFudHMuRkVBVFVSRV9JTVBPUlRfRE9DVU1FTlRTLCB0cnVlKTsKLQotICAgICAgLy8gUGFyc2UgdGhlIFdTREwgZG9jdW1lbnQKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gWE1MVXRpbHMucGFyc2VYTUxEb2N1bWVudChmaWxlbmFtZSk7Ci0JICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSB3c2RsUmVhZGVyLnJlYWRXU0RMKGZpbGVuYW1lLCBkb2N1bWVudCk7Ci0gICAgICAvL0RlZmluaXRpb24gZGVmaW5pdGlvbiA9IHJlYWRlci5yZWFkV1NETChmaWxlbmFtZSk7Ci0KLQkgIFN0cmluZyBuYW1lc3BhY2UgPSBkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpOwotCi0JICAvLyBnZXQgYWxsIHRoZSBjb2xsZWN0aW9ucyB3ZSBtYXkgbmVlZCB0byB2YWxpZGF0ZQotCSAgQ29sbGVjdGlvbiBzZXJ2aWNlcyA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKS52YWx1ZXMoKTsKLQkgIENvbGxlY3Rpb24gYmluZGluZ3MgPSBkZWZpbml0aW9uLmdldEJpbmRpbmdzKCkudmFsdWVzKCk7Ci0JICBDb2xsZWN0aW9uIHBvcnRUeXBlcyA9IGRlZmluaXRpb24uZ2V0UG9ydFR5cGVzKCkudmFsdWVzKCk7Ci0JICBDb2xsZWN0aW9uIG1lc3NhZ2VzID0gZGVmaW5pdGlvbi5nZXRNZXNzYWdlcygpLnZhbHVlcygpOwotCi0JICAvLyBUaGUgV1MtSSBjb25mb3JtYW5jZSB0b29scyByZXF1aXJlIHRoYXQgZWFjaCBzZXJ2aWNlIGJlIGFuYWx5emVkIHNlcGFyYXRlbHkuCi0JICAvLyBHZXQgYWxsIHRoZSBzZXJ2aWNlcyBhbmQgYW5hbHl6ZSB0aGVtLgotCSAgaWYgKHNlcnZpY2VzICE9IG51bGwgJiYgIXNlcnZpY2VzLmlzRW1wdHkoKSkKLQkgIHsKLQkgICAgSXRlcmF0b3Igc2VydmljZUl0ZXJhdG9yID0gc2VydmljZXMuaXRlcmF0b3IoKTsKLQotCSAgICB3aGlsZSAoc2VydmljZUl0ZXJhdG9yLmhhc05leHQoKSkKLQkgICAgewotCSAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBzZXJ2aWNlSXRlcmF0b3IubmV4dCgpOwotCi0JICAgICAgU3RyaW5nIHNlcnZpY2VuYW1lID0gc2VydmljZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotCi0JICAgICAgQ29sbGVjdGlvbiBwb3J0cyA9IHNlcnZpY2UuZ2V0UG9ydHMoKS52YWx1ZXMoKTsKLQkgICAgICBpZiAocG9ydHMgIT0gbnVsbCAmJiAhcG9ydHMuaXNFbXB0eSgpKQotCSAgICAgIHsKLQkgICAgICAgIC8vIFRoZSBXUy1JIHRvb2xzIG11c3QgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggcG9ydCB3aXRoaW4gZWFjaCBzZXJ2aWNlLgotCSAgICAgICAgSXRlcmF0b3IgcG9ydEl0ZXJhdG9yID0gcG9ydHMuaXRlcmF0b3IoKTsKLQkgICAgICAgIHdoaWxlIChwb3J0SXRlcmF0b3IuaGFzTmV4dCgpKQotCSAgICAgICAgewotCSAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEl0ZXJhdG9yLm5leHQoKTsKLQkJCSAgYW5hbHl6ZXIuYWRkQ29uZmlndXJhdGlvblRvVGVzdChzZXJ2aWNlbmFtZSwgbmFtZXNwYWNlLCBwb3J0LmdldE5hbWUoKSwgV1NETEFuYWx5emVyLlBPUlQpOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICAvLyB2YWxpZGF0ZSBhdCB0aGUgYmluZGluZyBsZXZlbCAtIGNoZWNrIGZvciBldmVyeSBiaW5kaW5nCi0JICAgICAgZWxzZSBpZiAoYmluZGluZ3MgIT0gbnVsbCAmJiAhYmluZGluZ3MuaXNFbXB0eSgpKQotCSAgICAgIHsKLQkgICAgICAgIEl0ZXJhdG9yIGJpbmRpbmdJdGVyYXRvciA9IGJpbmRpbmdzLml0ZXJhdG9yKCk7Ci0KLQkgICAgICAgIHdoaWxlIChiaW5kaW5nSXRlcmF0b3IuaGFzTmV4dCgpKQotCSAgICAgICAgewotCSAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSAoQmluZGluZykgYmluZGluZ0l0ZXJhdG9yLm5leHQoKTsKLQkgICAgICAgICAgU3RyaW5nIGJpbmRpbmduYW1lID0gYmluZGluZy5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICBhbmFseXplci5hZGRDb25maWd1cmF0aW9uVG9UZXN0KG51bGwsIG5hbWVzcGFjZSwgYmluZGluZ25hbWUsIFdTRExBbmFseXplci5CSU5ESU5HKTsKLQkgICAgICAgIH0KLQkgICAgICB9Ci0JICAgICAgLy8gdmFsaWRhdGUgYXQgdGhlIHBvcnRUeXBlIGxldmVsIC0gY2hlY2sgZm9yIGV2ZXJ5IHBvcnRUeXBlCi0JICAgICAgZWxzZSBpZiAocG9ydFR5cGVzICE9IG51bGwgJiYgIXBvcnRUeXBlcy5pc0VtcHR5KCkpCi0JICAgICAgewotCSAgICAgICAgSXRlcmF0b3IgcG9ydFR5cGVJdGVyYXRvciA9IHBvcnRUeXBlcy5pdGVyYXRvcigpOwotCSAgICAgICAgd2hpbGUgKHBvcnRUeXBlSXRlcmF0b3IuaGFzTmV4dCgpKQotCSAgICAgICAgewotCSAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IChQb3J0VHlwZSkgcG9ydFR5cGVJdGVyYXRvci5uZXh0KCk7Ci0JICAgICAgICAgIFN0cmluZyBwb3J0VHlwZW5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpLmdldExvY2FsUGFydCgpOwotICAgICAgICAgICAgICBhbmFseXplci5hZGRDb25maWd1cmF0aW9uVG9UZXN0KG51bGwsIG5hbWVzcGFjZSwgcG9ydFR5cGVuYW1lLCBXU0RMQW5hbHl6ZXIuUE9SVFRZUEUpOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgICAvLyB2YWxpZGF0ZSBhdCB0aGUgbWVzc2FnZSBsZXZlbCAtIGNoZWNrIGZvciBldmVyeSBtZXNzYWdlCi0JICAgICAgZWxzZSBpZiAobWVzc2FnZXMgIT0gbnVsbCAmJiAhbWVzc2FnZXMuaXNFbXB0eSgpKQotCSAgICAgIHsKLQkgICAgICAgIEl0ZXJhdG9yIG1lc3NhZ2VJdGVyYXRvciA9IG1lc3NhZ2VzLml0ZXJhdG9yKCk7Ci0JICAgICAgICB3aGlsZSAobWVzc2FnZUl0ZXJhdG9yLmhhc05leHQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpIG1lc3NhZ2VJdGVyYXRvci5uZXh0KCk7Ci0JICAgICAgICAgIFN0cmluZyBtZXNzYWdlbmFtZSA9IG1lc3NhZ2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgYW5hbHl6ZXIuYWRkQ29uZmlndXJhdGlvblRvVGVzdChudWxsLCBuYW1lc3BhY2UsIG1lc3NhZ2VuYW1lLCBXU0RMQW5hbHl6ZXIuTUVTU0FHRSk7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci0gICAgfQotCWNhdGNoIChFeGNlcHRpb24gZSkKLQl7Ci0gICAgICBmYWlsKCJVbmV4cGVjdGVkIHByb2JsZW1zIHNldHRpbmcgY29uZmlndXJhdGlvbnMiKTsKLQl9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiB0YWQuCi0gICAqIEBwYXJhbSB0aWQgdGhlIHRhZCBpZC4KLSAgICogQHJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIHRhZC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VEFEVVJJKFN0cmluZyB0aWQpCi0gIHsKLQkgIGlmICh0aWQuZXF1YWxzKFRBRF9JRF9BUCkpCi0JICAgICByZXR1cm4gV1NJVGVzdFRvb2xzUHJvcGVydGllcy5BUF9BU1NFUlRJT05fRklMRTsKLQkgIGVsc2UKLQkJIHJldHVybiBXU0lUZXN0VG9vbHNQcm9wZXJ0aWVzLlNTQlBfQVNTRVJUSU9OX0ZJTEU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdGVzdHMvaW50ZXJuYWwvUmVncmVzc2lvbkJ1Y2tldC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS90ZXN0cy9pbnRlcm5hbC9SZWdyZXNzaW9uQnVja2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDU5YjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS90ZXN0cy9pbnRlcm5hbC9SZWdyZXNzaW9uQnVja2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotLyoqCi0gKiBKVW5pdCB0ZXN0cyB0aGF0IHJ1bnMgYWxsIG9mIHRoZSB0ZXN0cyBpbXBsZW1lbnRlZCAKLSAqIGluIHRoaXMgcGx1Z2luLgotICogCi0gKiBAYXV0aG9yIGxhdXpvbmQKLSAqLwotcHVibGljIGNsYXNzIFJlZ3Jlc3Npb25CdWNrZXQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSAKLQkgIHsKLQkgICAgVGVzdFN1aXRlIHN1aXRlPSBuZXcgVGVzdFN1aXRlKCJSZWdyZXNzaW9uIEJ1Y2tldCIpOwotCSAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoV1NETENvbmZvcm1hbmNlU1NCUFRlc3QuY2xhc3MpKTsKLQkgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFdTRExDb25mb3JtYW5jZUFQVGVzdC5jbGFzcykpOwotCSAgICAKLQkgICAgcmV0dXJuIHN1aXRlOwotCSAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3Rlc3RzL2ludGVybmFsL1dTRExDb25mb3JtYW5jZUFQVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS90ZXN0cy9pbnRlcm5hbC9XU0RMQ29uZm9ybWFuY2VBUFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxMDNiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3Rlc3RzL2ludGVybmFsL1dTRExDb25mb3JtYW5jZUFQVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzLmludGVybmFsOwotLyoqCi0gKiBKVW5pdCB0ZXN0cyB0aGF0IHRlc3Qgd3NkbCBkb2N1bWVudHMgYWdhaW5zdCAKLSAqIHRoZSBXUy1JIEF0dGFjaG1lbnRzIHByb2ZpbGUuCi0gKiAKLSAqIEBhdXRob3IgbGF1em9uZAotICovCi1wdWJsaWMgY2xhc3MgV1NETENvbmZvcm1hbmNlQVBUZXN0IGV4dGVuZHMgQ29yZVdTRExDb25mb3JtYW5jZVRlc3QgCi17Ci0gIHB1YmxpYyBXU0RMQ29uZm9ybWFuY2VBUFRlc3QoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICBzdXBlcihuYW1lKTsKLSAgfQotLy93cy1pIHdzZGxzCi0gIHB1YmxpYyB2b2lkIHRlc3RfYWRkcmVzc0Jvb2soKSB7IHJ1blRlc3QoIndzaSIsICJhZGRyZXNzQm9vayIsIFRBRF9JRF9BUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF9hZGRyZXNzQm9va19ycGMoKSB7IHJ1blRlc3QoIndzaSIsICJhZGRyZXNzQm9vay1ycGMiLCBUQURfSURfQVApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3Rfc2FtcGxlQXBwQ2F0YWxvZygpIHsgcnVuVGVzdCgid3NpIiwgInNhbXBsZUFwcENhdGFsb2ciLCBUQURfSURfQVApOyB9ICAKLSAgcHVibGljIHZvaWQgdGVzdF9zYW1wbGVBcHBNYW51ZmFjdHVyZXIoKSB7IHJ1blRlc3QoIndzaSIsICJzYW1wbGVBcHBNYW51ZmFjdHVyZXIiLCBUQURfSURfQVApOyB9ICAKLSAgcHVibGljIHZvaWQgdGVzdF9zYW1wbGVBcHBXYXJlaG91c2UoKSB7IHJ1blRlc3QoIndzaSIsICJzYW1wbGVBcHBXYXJlaG91c2UiLCBUQURfSURfQVApOyB9IAotCi0gIC8vIGJwIHRlc3RzCi0gIHB1YmxpYyB2b2lkIHRlc3RfMjAxMl8xKCkgeyBydW5UZXN0KCJicCIsICIyMDEyLTEiLCBUQURfSURfQVApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTNfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxMy0xIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTRfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxNC0xIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTRfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjAxNC0yIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTRfMygpIHsgcnVuVGVzdCgiYnAiLCAiMjAxNC0zIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTdfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxNy0xIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTdfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjAxNy0yIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMThfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOC0xIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMThfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOC0yIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMThfMygpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOC0zIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMThfNCgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOC00IiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTlfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOS0xIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTlfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOS0yIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTlfMygpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOS0zIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTlfNCgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOS00IiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMjBfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAyMC0xIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMjBfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjAyMC0yIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIxMDVfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjEwNS0xIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIxMDVfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjEwNS0yIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIxMTdfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjExNy0xIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIxMTdfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjExNy0yIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIxMTdfMygpIHsgcnVuVGVzdCgiYnAiLCAiMjExNy0zIiwgVEFEX0lEX0FQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzI0MDZfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjQwNi0xIiwgVEFEX0lEX0FQKTsgfQotCi0gIC8vIHJlZHVuZGFudCB0ZXN0cyAtLSBhc3NlcnRpb25zIGZhaWx1cmVzIGNhdWdodCBieSBiYXNlIHdzZGwgdmFsaWRhdG9yLgotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTBfMSgpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMTAtMSIsIFRBRF9JRF9BUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDExXzEoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDExLTEiLCBUQURfSURfQVApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTFfMigpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMTEtMiIsIFRBRF9JRF9BUCk7IH0gCi0gIHB1YmxpYyB2b2lkIHRlc3RfMjAxMV8zKCkgeyBydW5UZXN0KCJyZWR1bmRhbnQiLCAiMjAxMS0zIiwgVEFEX0lEX0FQKTsgfSAKLSAgcHVibGljIHZvaWQgdGVzdF8yMDExXzQoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDExLTQiLCBUQURfSURfQVApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTFfNSgpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMTEtNSIsIFRBRF9JRF9BUCk7IH0gCi0gIHB1YmxpYyB2b2lkIHRlc3RfMjAyMV8xKCkgeyBydW5UZXN0KCJyZWR1bmRhbnQiLCAiMjAyMS0xIiwgVEFEX0lEX0FQKTsgfSAKLSAgcHVibGljIHZvaWQgdGVzdF8yMDIxXzIoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDIxLTIiLCBUQURfSURfQVApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMjFfMygpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMjEtMyIsIFRBRF9JRF9BUCk7IH0gCi0gIHB1YmxpYyB2b2lkIHRlc3RfMjAyMV80KCkgeyBydW5UZXN0KCJyZWR1bmRhbnQiLCAiMjAyMS00IiwgVEFEX0lEX0FQKTsgfSAKLSAgcHVibGljIHZvaWQgdGVzdF8yMDIxXzUoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDIxLTUiLCBUQURfSURfQVApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMjFfNigpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMjEtNiIsIFRBRF9JRF9BUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDIyXzEoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDIyLTEiLCBUQURfSURfQVApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMjJfMigpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMjItMiIsIFRBRF9JRF9BUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDMyXzEoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDMyLTEiLCBUQURfSURfQVApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMzJfMigpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMzItMiIsIFRBRF9JRF9BUCk7IH0gCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS90ZXN0cy9pbnRlcm5hbC9XU0RMQ29uZm9ybWFuY2VTU0JQVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzaS90ZXN0cy9pbnRlcm5hbC9XU0RMQ29uZm9ybWFuY2VTU0JQVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDU3NjA2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdGVzdHMvaW50ZXJuYWwvV1NETENvbmZvcm1hbmNlU1NCUFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy5pbnRlcm5hbDsKLS8qKgotICogSlVuaXQgdGVzdHMgdGhhdCB0ZXN0IHdzZGwgZG9jdW1lbnRzIGFnYWluc3QgCi0gKiB0aGUgV1MtSSBTaW1wbGUgU29hcCBCaW5kaW5nIHByb2ZpbGUuCi0gKiAKLSAqIEBhdXRob3IgbGF1em9uZAotICovCi1wdWJsaWMgY2xhc3MgV1NETENvbmZvcm1hbmNlU1NCUFRlc3QgZXh0ZW5kcyBDb3JlV1NETENvbmZvcm1hbmNlVGVzdCAKLXsKLSAgcHVibGljIFdTRExDb25mb3JtYW5jZVNTQlBUZXN0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgc3VwZXIobmFtZSk7Ci0gIH0KLSAgLy8gd3MtaSB3c2RscwotICBwdWJsaWMgdm9pZCB0ZXN0X2FkZHJlc3NCb29rKCkgeyBydW5UZXN0KCJ3c2kiLCAiYWRkcmVzc0Jvb2siLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF9hZGRyZXNzQm9va19ycGMoKSB7IHJ1blRlc3QoIndzaSIsICJhZGRyZXNzQm9vay1ycGMiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF9zYW1wbGVBcHBDYXRhbG9nKCkgeyBydW5UZXN0KCJ3c2kiLCAic2FtcGxlQXBwQ2F0YWxvZyIsIFRBRF9JRF9TU0JQKTsgfSAgCi0gIHB1YmxpYyB2b2lkIHRlc3Rfc2FtcGxlQXBwTWFudWZhY3R1cmVyKCkgeyBydW5UZXN0KCJ3c2kiLCAic2FtcGxlQXBwTWFudWZhY3R1cmVyIiwgVEFEX0lEX1NTQlApOyB9ICAKLSAgcHVibGljIHZvaWQgdGVzdF9zYW1wbGVBcHBXYXJlaG91c2UoKSB7IHJ1blRlc3QoIndzaSIsICJzYW1wbGVBcHBXYXJlaG91c2UiLCBUQURfSURfU1NCUCk7IH0gCi0KLSAgLy8gYnAgdGVzdHMKLSAgcHVibGljIHZvaWQgdGVzdF8yMDEyXzEoKSB7IHJ1blRlc3QoImJwIiwgIjIwMTItMSIsIFRBRF9JRF9TU0JQKTsgfSAKLSAgcHVibGljIHZvaWQgdGVzdF8yMDEzXzEoKSB7IHJ1blRlc3QoImJwIiwgIjIwMTMtMSIsIFRBRF9JRF9TU0JQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTRfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxNC0xIiwgVEFEX0lEX1NTQlApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RfMjAxNF8yKCkgeyBydW5UZXN0KCJicCIsICIyMDE0LTIiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDE0XzMoKSB7IHJ1blRlc3QoImJwIiwgIjIwMTQtMyIsIFRBRF9JRF9TU0JQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTdfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxNy0xIiwgVEFEX0lEX1NTQlApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RfMjAxN18yKCkgeyBydW5UZXN0KCJicCIsICIyMDE3LTIiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDE4XzEoKSB7IHJ1blRlc3QoImJwIiwgIjIwMTgtMSIsIFRBRF9JRF9TU0JQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMThfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOC0yIiwgVEFEX0lEX1NTQlApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RfMjAxOF8zKCkgeyBydW5UZXN0KCJicCIsICIyMDE4LTMiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDE4XzQoKSB7IHJ1blRlc3QoImJwIiwgIjIwMTgtNCIsIFRBRF9JRF9TU0JQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTlfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOS0xIiwgVEFEX0lEX1NTQlApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RfMjAxOV8yKCkgeyBydW5UZXN0KCJicCIsICIyMDE5LTIiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDE5XzMoKSB7IHJ1blRlc3QoImJwIiwgIjIwMTktMyIsIFRBRF9JRF9TU0JQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTlfNCgpIHsgcnVuVGVzdCgiYnAiLCAiMjAxOS00IiwgVEFEX0lEX1NTQlApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RfMjAyMF8xKCkgeyBydW5UZXN0KCJicCIsICIyMDIwLTEiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDIwXzIoKSB7IHJ1blRlc3QoImJwIiwgIjIwMjAtMiIsIFRBRF9JRF9TU0JQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIxMDVfMSgpIHsgcnVuVGVzdCgiYnAiLCAiMjEwNS0xIiwgVEFEX0lEX1NTQlApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RfMjEwNV8yKCkgeyBydW5UZXN0KCJicCIsICIyMTA1LTIiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMTE3XzEoKSB7IHJ1blRlc3QoImJwIiwgIjIxMTctMSIsIFRBRF9JRF9TU0JQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIxMTdfMigpIHsgcnVuVGVzdCgiYnAiLCAiMjExNy0yIiwgVEFEX0lEX1NTQlApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RfMjExN18zKCkgeyBydW5UZXN0KCJicCIsICIyMTE3LTMiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yNDA2XzEoKSB7IHJ1blRlc3QoImJwIiwgIjI0MDYtMSIsIFRBRF9JRF9TU0JQKTsgfQotCi0gIC8vIHJlZHVuZGFudCB0ZXN0cyAtLSBhc3NlcnRpb25zIGZhaWx1cmVzIGNhdWdodCBieSBiYXNlIHdzZGwgdmFsaWRhdG9yLgotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTBfMSgpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMTAtMSIsIFRBRF9JRF9TU0JQKTsgfQotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTFfMSgpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMTEtMSIsIFRBRF9JRF9TU0JQKTsgfSAKLSAgcHVibGljIHZvaWQgdGVzdF8yMDExXzIoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDExLTIiLCBUQURfSURfU1NCUCk7IH0gCi0gIHB1YmxpYyB2b2lkIHRlc3RfMjAxMV8zKCkgeyBydW5UZXN0KCJyZWR1bmRhbnQiLCAiMjAxMS0zIiwgVEFEX0lEX1NTQlApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMTFfNCgpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMTEtNCIsIFRBRF9JRF9TU0JQKTsgfSAKLSAgcHVibGljIHZvaWQgdGVzdF8yMDExXzUoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDExLTUiLCBUQURfSURfU1NCUCk7IH0gCi0gIHB1YmxpYyB2b2lkIHRlc3RfMjAyMV8xKCkgeyBydW5UZXN0KCJyZWR1bmRhbnQiLCAiMjAyMS0xIiwgVEFEX0lEX1NTQlApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMjFfMigpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMjEtMiIsIFRBRF9JRF9TU0JQKTsgfSAKLSAgcHVibGljIHZvaWQgdGVzdF8yMDIxXzMoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDIxLTMiLCBUQURfSURfU1NCUCk7IH0gCi0gIHB1YmxpYyB2b2lkIHRlc3RfMjAyMV80KCkgeyBydW5UZXN0KCJyZWR1bmRhbnQiLCAiMjAyMS00IiwgVEFEX0lEX1NTQlApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMjFfNSgpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMjEtNSIsIFRBRF9JRF9TU0JQKTsgfSAKLSAgcHVibGljIHZvaWQgdGVzdF8yMDIxXzYoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDIxLTYiLCBUQURfSURfU1NCUCk7IH0KLSAgcHVibGljIHZvaWQgdGVzdF8yMDIyXzEoKSB7IHJ1blRlc3QoInJlZHVuZGFudCIsICIyMDIyLTEiLCBUQURfSURfU1NCUCk7IH0gCi0gIHB1YmxpYyB2b2lkIHRlc3RfMjAyMl8yKCkgeyBydW5UZXN0KCJyZWR1bmRhbnQiLCAiMjAyMi0yIiwgVEFEX0lEX1NTQlApOyB9Ci0gIHB1YmxpYyB2b2lkIHRlc3RfMjAzMl8xKCkgeyBydW5UZXN0KCJyZWR1bmRhbnQiLCAiMjAzMi0xIiwgVEFEX0lEX1NTQlApOyB9IAotICBwdWJsaWMgdm9pZCB0ZXN0XzIwMzJfMigpIHsgcnVuVGVzdCgicmVkdW5kYW50IiwgIjIwMzItMiIsIFRBRF9JRF9TU0JQKTsgfSAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdGVzdHMvaW50ZXJuYWwvV1NJVGVzdHNQbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2kvdGVzdHMvaW50ZXJuYWwvV1NJVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiOTc1Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NpL3Rlc3RzL2ludGVybmFsL1dTSVRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53c2kudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0qIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotKi8KLXB1YmxpYyBjbGFzcyBXU0lUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbgotewotIC8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLSBwcml2YXRlIHN0YXRpYyBXU0lUZXN0c1BsdWdpbiBwbHVnaW47Ci0gcHJpdmF0ZSBzdGF0aWMgQnVuZGxlIHBsdWdpbkJ1bmRsZSA9IG51bGw7Ci0KLSAvKioKLSAgKiBUaGUgY29uc3RydWN0b3IuCi0gICovCi0gcHVibGljIFdTSVRlc3RzUGx1Z2luKCkKLSB7Ci0gICBzdXBlcigpOwotICAgcGx1Z2luID0gdGhpczsKLSB9Ci0KLSAvKioKLSAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLSAgKi8KLSBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24KLSB7Ci0gICBzdXBlci5zdGFydChjb250ZXh0KTsKLQlwbHVnaW5CdW5kbGUgPSBjb250ZXh0LmdldEJ1bmRsZSgpOwotIH0KLQotIC8qKgotICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLSAgKi8KLSBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgotIHsKLSAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gfQotCi0gLyoqCi0gICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotICAqLwotIHB1YmxpYyBzdGF0aWMgV1NJVGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpCi0gewotICAgcmV0dXJuIHBsdWdpbjsKLSB9Ci0gCi0gLyoqCi0gICogR2V0IHRoZSBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWdpbi4KLSAgKiAKLSAgKiBAcmV0dXJuIHRoZSBpbnN0YWxsIHVybCBvZiB0aGlzIHBsdWdpbgotICAqLwotIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluc3RhbGxVUkwoKQotIHsKLSAgIHRyeQotICAgewotICAgICByZXR1cm4gUGxhdGZvcm0ucmVzb2x2ZShwbHVnaW5CdW5kbGUuZ2V0RW50cnkoIi8iKSkuZ2V0RmlsZSgpOwotICAgfQotICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICB7Ci0gICAgIHJldHVybiBudWxsOwotICAgfQotIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmU4YWQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8IS0tIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIiAvPiAtLT4KLQkJCi0JCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQkJPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JCi0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC53c2kudGVzdHMiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiIC8+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0JPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLQk8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPGRlbGV0ZT4KLQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy4qeG1sIiAvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3c3QtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3dzdF9mb2xkZXIiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7d3N0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgCTxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgCQk8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3dzdC1mb2xkZXJ9Ii8+Ci0gICAgICAJCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICAJCTxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzLmludGVybmFsLlJlZ3Jlc3Npb25CdWNrZXQiIC8+Ci0gICAJCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotICAgIAk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQkJPCEtLTxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIiAvPi0tPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLQkJPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCQkJPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy4qeG1sIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIiAvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxMi0xLzIwMTItMS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDEyLTEvMjAxMi0xLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjkyYmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDEyLTEvMjAxMi0xLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgbmFtZT0iTmFtZSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp0bnM9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIj4KLQk8d3NkbDp0eXBlcz4KLQkJPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0Ij4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0idG5zOk5hbWUiIC8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJ0bnM6U3BlY2ltZW4iIC8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJ0bnM6TG90IiAvPgotCQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2FtcGxlTGlzdCI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIxIiByZWY9InRuczpSZXBvcnQiIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3VudCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMYXN0TW9kaWZpZWQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iTG90IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0JCQk8eHNkOmVsZW1lbnQgbmFtZT0iTnVtYmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9IlNwZWNpbWVuIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9IlNhbXBsZSI+Ci0JCQkJPHhzZDpjb21wbGV4VHlwZT4KLQkJCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJCTx4c2Q6ZWxlbWVudCByZWY9InRuczpTYW1wbGVOYW1lIiAvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0idG5zOkNvdW50IiAvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0idG5zOkxhc3RNb2RpZmllZCIgLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiByZWY9InRuczpTYW1wbGVQcm92aWRlciIgLz4KLQkJCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgotCQkJCTwveHNkOmNvbXBsZXhUeXBlPgotCQkJPC94c2Q6ZWxlbWVudD4KLQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTYW1wbGVOYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotCQkJPHhzZDplbGVtZW50IG5hbWU9IlNhbXBsZVByb3ZpZGVyIj4KLQkJCQk8eHNkOmNvbXBsZXhUeXBlPgotCQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0idG5zOk5hbWUiIC8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgcmVmPSJ0bnM6TnVtYmVyIiAvPgotCQkJCQkJPHhzZDplbGVtZW50IHJlZj0idG5zOlNhbXBsZUxpc3QiIC8+Ci0JCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KLQkJCQk8L3hzZDpjb21wbGV4VHlwZT4KLQkJCTwveHNkOmVsZW1lbnQ+Ci0KLQotCQk8L3hzZDpzY2hlbWE+Ci0JPC93c2RsOnR5cGVzPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0U2FtcGxlUmVxdWVzdCI+Ci0JCTx3c2RsOnBhcnQgbmFtZT0ic2FtcGxlSWQiIHR5cGU9InhzZDpzdHJpbmciPjwvd3NkbDpwYXJ0PgotCTwvd3NkbDptZXNzYWdlPgotCTx3c2RsOm1lc3NhZ2UgbmFtZT0iZ2V0U2FtcGxlUmVzcG9uc2UiPgotCQk8d3NkbDpwYXJ0IG5hbWU9InJlcG9ydCIgZWxlbWVudD0idG5zOlNhbXBsZSI+PC93c2RsOnBhcnQ+Ci0JPC93c2RsOm1lc3NhZ2U+Ci0JPHdzZGw6cG9ydFR5cGUgbmFtZT0iU2FtcGxlUG9ydFR5cGUiPgotCQk8d3NkbDpvcGVyYXRpb24gbmFtZT0iZ2V0U2FtcGxlIj4KLQkJCTx3c2RsOmlucHV0IG1lc3NhZ2U9InRuczpnZXRTYW1wbGVSZXF1ZXN0Ij48L3dzZGw6aW5wdXQ+Ci0JCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOmdldFNhbXBsZVJlc3BvbnNlIj48L3dzZGw6b3V0cHV0PgotCQk8L3dzZGw6b3BlcmF0aW9uPgotCTwvd3NkbDpwb3J0VHlwZT4KLQk8d3NkbDpiaW5kaW5nIG5hbWU9IlNhbXBsZUJpbmRpbmciIHR5cGU9InRuczpTYW1wbGVQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KLQkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImdldFNhbXBsZSI+Ci0JCQk8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL2dldFNhbXBsZSIgLz4KLQkJCTx3c2RsOmlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOmlucHV0PgotCQkJPHdzZGw6b3V0cHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotCQkJPC93c2RsOm91dHB1dD4KLQkJPC93c2RsOm9wZXJhdGlvbj4KLQk8L3dzZGw6YmluZGluZz4KLQk8d3NkbDpzZXJ2aWNlIG5hbWU9IlNhbXBsZVNlcnZpY2UiPgotCQk8d3NkbDpwb3J0IG5hbWU9IlNhbXBsZVBvcnQiIGJpbmRpbmc9InRuczpTYW1wbGVCaW5kaW5nIj4KLQkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIC8+Ci0JCTwvd3NkbDpwb3J0PgotCTwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxMi0xL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxMi0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5YjdiMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTItMS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMTItMSI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24tY29uZm9ybWFudCB3c2RsIHRoYXQgZmFpbHMgdGVzdCBhc3NlcnRpb24gQlAyMDEyLgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMTIiIHRhZElEPSJTU0JQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMTIiIHRhZElEPSJBUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDEyLTIvMjAxMi0yLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTItMi8yMDEyLTIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2MTA4MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTItMi8yMDEyLTIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlLz4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpQaG9uZU51bWJlciIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCI+Ci0gICAgICAgIDwvd3NkbHNvYXA6aGVhZGVyPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJBZGRyZXNzQm9va1NlcnZpY2UiPgotICAgIDx3c2RsOnBvcnQgbmFtZT0iQWRkcmVzc0Jvb2siIGJpbmRpbmc9ImludGY6QWRkcmVzc0Jvb2tTb2FwQmluZGluZyI+Ci0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0FkZHJlc3NCb29rIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDEyLTIvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDEyLTIvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZThhZDVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxMi0yL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxMi0yIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbi1jb25mb3JtYW50IHdzZGwgdGhhdCBmYWlscyB0ZXN0IGFzc2VydGlvbiBCUDIwMTIuCi0gICAgCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAxMiIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAxMiIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTMtMS8yMDEzLTEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxMy0xLzIwMTMtMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTkxMjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxMy0xLzIwMTMtMS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgPHNlcXVlbmNlLz4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2siPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJBZGRyZXNzQm9va1NvYXBCaW5kaW5nIiB0eXBlPSJpbnRmOkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIj4KLSAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxMy0xL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxMy0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzODhkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTMtMS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMTMtMSI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBjb25mb3JtYW50IHdzZGwgdXNlZCBpbiB0aGUgV1MtSSAKLSAgICBpbnRlcm9wZXJhYmlsaXR5IGRlbW8uCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAxMyIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAxMyIgdGFkSUQ9IkFQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIxMTIiIHRhZElEPSJTU0JQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIxMTIiIHRhZElEPSJBUDEwIi8+Ci0gICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxNC0xLzIwMTQtMS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE0LTEvMjAxNC0xLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MDAyNTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE0LTEvMjAxNC0xLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08ZGVmaW5pdGlvbnMgCi0gICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIAotICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICB4bWxuczpzMD0iaHR0cDovL3RlbXB1cmkub3JnLyIgCi0gICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiAKLSAgICAgICAgeG1sbnM6dG09Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dzZGwvbWltZS90ZXh0TWF0Y2hpbmcvIiAKLSAgICAgICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nSW4iPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9InM6c3RyaW5nIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ091dCI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iczpzdHJpbmciIC8+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVyczEiIHR5cGU9InM6c3RyaW5nIi8+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVyczIiIHR5cGU9InM6c3RyaW5nIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9Qb3J0VHlwZSI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBwYXJhbWV0ZXJPcmRlcj0icGFyYW1ldGVycyBwYXJhbWV0ZXJzMSBwYXJhbWV0ZXJzMiI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0iczA6ZWNob1N0cmluZ0luIiAvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDplY2hvU3RyaW5nT3V0IiAvPgotICAgIDwvb3BlcmF0aW9uPgotICAgPC9wb3J0VHlwZT4KLSAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InMwOkVjaG9Qb3J0VHlwZSI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9InJwYyIgLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9lY2hvU3RyaW5nIiBzdHlsZT0icnBjIiAvPgotICAgICAgPGlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHA6Ly9vcmcub3JnIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHRwOi8vb3JnLm9yZyIgLz4KLSAgICAgIDwvb3V0cHV0PgotICAgIDwvb3BlcmF0aW9uPgotIDwvYmluZGluZz4KLSAgPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotICAgIDxwb3J0IG5hbWU9IkVjaG9Qb3J0IiBiaW5kaW5nPSJzMDpFY2hvQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxNC0xL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxNC0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2NzVmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTQtMS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxNC0xIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbmZvcm1hbnQgd3NkbCBjb250YWluaW5nIGEgd3NkbDpvcGVyYXRpb24gCi0gICAgd2l0aCBhIHBhcmFtZXRlck9yZGVyIGF0dHJpYnV0ZS4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXMvPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTQtMi8yMDE0LTIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxNC0yLzIwMTQtMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjUzMDY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxNC0yLzIwMTQtMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPGRlZmluaXRpb25zIAotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0luIj4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJzOnN0cmluZyIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdPdXQiPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9InM6c3RyaW5nIiAvPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMxIiB0eXBlPSJzOnN0cmluZyIvPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMyIiB0eXBlPSJzOnN0cmluZyIvPgotICA8L21lc3NhZ2U+Ci0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvUG9ydFR5cGUiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyIgcGFyYW1ldGVyT3JkZXI9InBhcmFtZXRlcnMgcGFyYW1ldGVyczEiPgotICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOmVjaG9TdHJpbmdJbiIgLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6ZWNob1N0cmluZ091dCIgLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgIDwvcG9ydFR5cGU+Ci0gIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJzMDpFY2hvUG9ydFR5cGUiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJycGMiIC8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvZWNob1N0cmluZyIgc3R5bGU9InJwYyIgLz4KLSAgICAgIDxpbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHRwOi8vb3JnLm9yZyIvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0cDovL29yZy5vcmciIC8+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLSA8L2JpbmRpbmc+Ci0gIDxzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlIj4KLSAgICA8cG9ydCBuYW1lPSJFY2hvUG9ydCIgYmluZGluZz0iczA6RWNob0JpbmRpbmciPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTQtMi90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTQtMi90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NWI0MDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE0LTIvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMTQtMiI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBjb25mb3JtYW50IHdzZGwgY29udGFpbmluZyBhIHdzZGw6b3BlcmF0aW9uIAotICAgIHdpdGggYSBwYXJhbWV0ZXJPcmRlciBhdHRyaWJ1dGUuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzLz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE0LTMvMjAxNC0zLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTQtMy8yMDE0LTMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlNzkyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTQtMy8yMDE0LTMud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTxkZWZpbml0aW9ucyAKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgCi0gICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgIHhtbG5zOnMwPSJodHRwOi8vdGVtcHVyaS5vcmcvIiAKLSAgICAgICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIAotICAgICAgICB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iIAotICAgICAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiAKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdJbiI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iczpzdHJpbmciLz4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nT3V0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzMSIgdHlwZT0iczpzdHJpbmciLz4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzMiIgdHlwZT0iczpzdHJpbmciLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iRWNob1BvcnRUeXBlIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIHBhcmFtZXRlck9yZGVyPSJwYXJhbWV0ZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDplY2hvU3RyaW5nSW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOmVjaG9TdHJpbmdPdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICA8L3BvcnRUeXBlPgotICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0iczA6RWNob1BvcnRUeXBlIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0icnBjIiAvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL2VjaG9TdHJpbmciIHN0eWxlPSJycGMiIC8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0cDovL29yZy5vcmciLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHA6Ly9vcmcub3JnIiAvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gPC9iaW5kaW5nPgotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InMwOkVjaG9CaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE0LTMvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE0LTMvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzcyYzczLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxNC0zL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxNC0xIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbmZvcm1hbnQgd3NkbCBjb250YWluaW5nIGEgd3NkbDpvcGVyYXRpb24gCi0gICAgd2l0aCBhIHBhcmFtZXRlck9yZGVyIGF0dHJpYnV0ZS4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDE0IiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDE0IiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxNy0xLzIwMTctMS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE3LTEvMjAxNy0xLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzVkNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE3LTEvMjAxNy0xLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgPHNlcXVlbmNlLz4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQWRkcmVzc0Jvb2tTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzdHlsZT0iZG9jdW1lbnQiIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIj4KLSAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc3R5bGU9InJwYyIgc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJBZGRyZXNzQm9vayIgYmluZGluZz0iaW50ZjpBZGRyZXNzQm9va1NvYXBCaW5kaW5nIj4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvQWRkcmVzc0Jvb2siLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTctMS90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTctMS90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZGE5NDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE3LTEvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDE3LTEiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uLWNvbmZvcm1hbnQgd3NkbCBjb250YWluaW5nIAotICAgIG11bHRpcGxlIHN0eWxlIHZhbHVlcyB3aXRoaW4gdGhlIHNhbWUgYmluZGluZy4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDE3IiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDE3IiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxNy0yLzIwMTctMi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE3LTIvMjAxNy0yLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTBlZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE3LTIvMjAxNy0yLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgPHNlcXVlbmNlLz4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2syIj4KLSAgICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc3R5bGU9ImRvY3VtZW50IiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCI+Ci0gICAgICAgIDwvd3NkbHNvYXA6aGVhZGVyPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJBZGRyZXNzQm9va1NvYXBCaW5kaW5nMiIgdHlwZT0iaW50ZjpBZGRyZXNzQm9vazIiPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc3R5bGU9InJwYyIgc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJBZGRyZXNzQm9vayIgYmluZGluZz0iaW50ZjpBZGRyZXNzQm9va1NvYXBCaW5kaW5nIj4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvQWRkcmVzc0Jvb2siLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTctMi90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTctMi90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmUzMGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE3LTIvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMTctMiI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBjb25mb3JtYW50IHdzZGwgY29udGFpbmluZyAKLSAgICBtdWx0aXBsZSBzdHlsZSB2YWx1ZXMgYnV0IGluIGRpZmZlcmVudCBiaW5kaW5ncy4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXMvPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTgtMS8yMDE4LTEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0xLzIwMTgtMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjJhZjliLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0xLzIwMTgtMS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPGRlZmluaXRpb25zIAotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDxkb2N1bWVudGF0aW9uPgotICA8L2RvY3VtZW50YXRpb24+Ci0gIDx0eXBlcy8+Ci0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdJbiI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iczpzdHJpbmciLz4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nT3V0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iRWNob1BvcnRUeXBlIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIHBhcmFtZXRlck9yZGVyPSJwYXJhbWV0ZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDplY2hvU3RyaW5nSW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOmVjaG9TdHJpbmdPdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICA8L3BvcnRUeXBlPgotICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0iczA6RWNob1BvcnRUeXBlIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0icnBjIiAvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL2VjaG9TdHJpbmciIHN0eWxlPSJycGMiIC8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0cDovL29yZy5vcmciLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHA6Ly9vcmcub3JnIiAvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gPC9iaW5kaW5nPgotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InMwOkVjaG9CaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTEvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTEvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGY2NTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0xL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDE4LTEiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSBkb2N1bWVudGF0aW9uCi0gICAgZWxlbWVudCBwcmVjZWRpbmcgdGhlIHR5cGVzIGVsZW1lbnQuIAotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcy8+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0yLzIwMTgtMi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTIvMjAxOC0yLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0N2I5NjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTIvMjAxOC0yLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08ZGVmaW5pdGlvbnMgCi0gICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIAotICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICB4bWxuczpzMD0iaHR0cDovL3RlbXB1cmkub3JnLyIgCi0gICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiAKLSAgICAgICAgeG1sbnM6dG09Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dzZGwvbWltZS90ZXh0TWF0Y2hpbmcvIiAKLSAgICAgICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPGRvY3VtZW50YXRpb24+Ci0gIDwvZG9jdW1lbnRhdGlvbj4KLSAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMDE4YSIgbG9jYXRpb249IjIwMThhLndzZGwiLz4KLSAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMDE4YiIgbG9jYXRpb249IjIwMThiLndzZGwiLz4KLSAgPHR5cGVzLz4KLSAgCi0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdJbiI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iczpzdHJpbmciLz4KLSAgPC9tZXNzYWdlPgotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nT3V0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iRWNob1BvcnRUeXBlIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIHBhcmFtZXRlck9yZGVyPSJwYXJhbWV0ZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDplY2hvU3RyaW5nSW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOmVjaG9TdHJpbmdPdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICA8L3BvcnRUeXBlPgotICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0iczA6RWNob1BvcnRUeXBlIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0icnBjIiAvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL2VjaG9TdHJpbmciIHN0eWxlPSJycGMiIC8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0cDovL29yZy5vcmciLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHA6Ly9vcmcub3JnIiAvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gPC9iaW5kaW5nPgotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InMwOkVjaG9CaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTIvMjAxOGEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0yLzIwMThhLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGQ5NmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTIvMjAxOGEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxkZWZpbml0aW9ucyAKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgCi0gICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgIHhtbG5zOnMwPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGEiIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMDE4YSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTIvMjAxOGIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0yLzIwMThiLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzJlYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTIvMjAxOGIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxkZWZpbml0aW9ucyAKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgCi0gICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgIHhtbG5zOnMwPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGIiIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMDE4YiIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTIvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTIvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjZjNTQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0yL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDE4LTEiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSBkb2N1bWVudGF0aW9uCi0gICAgZWxlbWVudCBhbmQgMiBpbXBvcnQgZWxlbWVudHMgcHJlY2VkaW5nIHRoZSB0eXBlcyBlbGVtZW50LiAKLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXMvPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTgtMy8yMDE4LTMud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0zLzIwMTgtMy53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDBkODViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0zLzIwMTgtMy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPGRlZmluaXRpb25zIAotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDxkb2N1bWVudGF0aW9uPgotICA8L2RvY3VtZW50YXRpb24+Ci0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdJbiI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iczpzdHJpbmciLz4KLSAgPC9tZXNzYWdlPgotICA8dHlwZXMvPgotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nT3V0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iRWNob1BvcnRUeXBlIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIHBhcmFtZXRlck9yZGVyPSJwYXJhbWV0ZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDplY2hvU3RyaW5nSW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOmVjaG9TdHJpbmdPdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICA8L3BvcnRUeXBlPgotICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0iczA6RWNob1BvcnRUeXBlIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0icnBjIiAvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL2VjaG9TdHJpbmciIHN0eWxlPSJycGMiIC8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0cDovL29yZy5vcmciLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHA6Ly9vcmcub3JnIiAvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gPC9iaW5kaW5nPgotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InMwOkVjaG9CaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTMvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTMvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM0NjRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC0zL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxOC0zIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbiBjb25mb3JtYW50IHdzZGwgY29udGFpbmluZyBhIG1lc3NhZ2UKLSAgICBlbGVtZW50IHByZWNlZGluZyB0aGUgdHlwZXMgZWxlbWVudC4gCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAxOCIgdGFkSUQ9IlNTQlAxMCIvPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAxOCIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTgtNC8yMDE4LTQud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC00LzIwMTgtNC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA1ODkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC00LzIwMTgtNC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPGRlZmluaXRpb25zIAotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDxkb2N1bWVudGF0aW9uPgotICA8L2RvY3VtZW50YXRpb24+Ci0gIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGEiIGxvY2F0aW9uPSIyMDE4YS53c2RsIi8+Ci0gIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGIiIGxvY2F0aW9uPSIyMDE4Yi53c2RsIi8+Ci0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdJbiI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iczpzdHJpbmciLz4KLSAgPC9tZXNzYWdlPgotICA8dHlwZXMvPgotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nT3V0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iRWNob1BvcnRUeXBlIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIHBhcmFtZXRlck9yZGVyPSJwYXJhbWV0ZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDplY2hvU3RyaW5nSW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOmVjaG9TdHJpbmdPdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICA8L3BvcnRUeXBlPgotICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0iczA6RWNob1BvcnRUeXBlIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0icnBjIiAvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL2VjaG9TdHJpbmciIHN0eWxlPSJycGMiIC8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0cDovL29yZy5vcmciLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHA6Ly9vcmcub3JnIiAvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gPC9iaW5kaW5nPgotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InMwOkVjaG9CaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTQvMjAxOGEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC00LzIwMThhLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGQ5NmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTQvMjAxOGEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxkZWZpbml0aW9ucyAKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgCi0gICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgIHhtbG5zOnMwPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGEiIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMDE4YSIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTQvMjAxOGIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC00LzIwMThiLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzJlYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTQvMjAxOGIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxkZWZpbml0aW9ucyAKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgCi0gICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgIHhtbG5zOnMwPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGIiIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMDE4YiIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTQvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTQvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTM1OTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC00L3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxOC00Ij4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbiBjb25mb3JtYW50IHdzZGwgY29udGFpbmluZyBhIG1lc3NhZ2UKLSAgICBlbGVtZW50IHByZWNlZGluZyB0aGUgdHlwZXMgZWxlbWVudC4gCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAxOCIgdGFkSUQ9IlNTQlAxMCIvPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAxOCIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTgtNS8yMDE4LTUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC01LzIwMTgtNS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI5YTYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC01LzIwMTgtNS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPGRlZmluaXRpb25zIAotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDxkb2N1bWVudGF0aW9uPgotICA8L2RvY3VtZW50YXRpb24+Ci0gIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGEiIGxvY2F0aW9uPSIyMDE4YS53c2RsIi8+Ci08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC01LzIwMThhLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTgtNS8yMDE4YS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGFmNTVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC01LzIwMThhLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08ZGVmaW5pdGlvbnMgCi0gICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIAotICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICB4bWxuczpzMD0iaHR0cDovL3RlbXB1cmkub3JnLzIwMThhIiAKLSAgICAgICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIAotICAgICAgICB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iIAotICAgICAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiAKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGEiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDxkb2N1bWVudGF0aW9uPgotICA8L2RvY3VtZW50YXRpb24+Ci0gIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGIiIGxvY2F0aW9uPSIyMDE4Yi53c2RsIi8+Ci0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdJbiI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iczpzdHJpbmciLz4KLSAgPC9tZXNzYWdlPgotICA8dHlwZXMvPgotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nT3V0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgPC9tZXNzYWdlPgotICA8cG9ydFR5cGUgbmFtZT0iRWNob1BvcnRUeXBlIj4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciIHBhcmFtZXRlck9yZGVyPSJwYXJhbWV0ZXJzIj4KLSAgICAgIDxpbnB1dCBtZXNzYWdlPSJzMDplY2hvU3RyaW5nSW4iIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOmVjaG9TdHJpbmdPdXQiIC8+Ci0gICAgPC9vcGVyYXRpb24+Ci0gICA8L3BvcnRUeXBlPgotICA8YmluZGluZyBuYW1lPSJFY2hvQmluZGluZyIgdHlwZT0iczA6RWNob1BvcnRUeXBlIj4KLSAgICA8c29hcDpiaW5kaW5nIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIiBzdHlsZT0icnBjIiAvPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL2VjaG9TdHJpbmciIHN0eWxlPSJycGMiIC8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0cDovL29yZy5vcmciLz4KLSAgICAgIDwvaW5wdXQ+Ci0gICAgICA8b3V0cHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHA6Ly9vcmcub3JnIiAvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gPC9iaW5kaW5nPgotICA8c2VydmljZSBuYW1lPSJFY2hvU2VydmljZSI+Ci0gICAgPHBvcnQgbmFtZT0iRWNob1BvcnQiIGJpbmRpbmc9InMwOkVjaG9CaW5kaW5nIj4KLSAgICAgIDxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICA8L3BvcnQ+Ci0gIDwvc2VydmljZT4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTUvMjAxOGIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC01LzIwMThiLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzJlYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTUvMjAxOGIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTxkZWZpbml0aW9ucyAKLSAgICAgICAgeG1sbnM6aHR0cD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9odHRwLyIgCi0gICAgICAgIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgICAgICB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgIHhtbG5zOnMwPSJodHRwOi8vdGVtcHVyaS5vcmcvMjAxOGIiIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMDE4YiIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLTwvZGVmaW5pdGlvbnM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTUvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE4LTUvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTM1OTFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOC01L3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxOC00Ij4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbiBjb25mb3JtYW50IHdzZGwgY29udGFpbmluZyBhIG1lc3NhZ2UKLSAgICBlbGVtZW50IHByZWNlZGluZyB0aGUgdHlwZXMgZWxlbWVudC4gCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAxOCIgdGFkSUQ9IlNTQlAxMCIvPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAxOCIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTktMS8yMDE5LTEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS0xLzIwMTktMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc1MmRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS0xLzIwMTktMS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6aW1wbD0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8d3NkbDp0eXBlcz4KLSAgICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcm92aW5jZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0iY2l0eSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ic3RyZWV0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwaG9uZU51bWJlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6UGhvbmVOdW1iZXIiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJQaG9uZU51bWJlciI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJhcmVhIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2UvPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQWRkcmVzc0Jvb2tTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9ub3doZXJlIj4KLSAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJBZGRyZXNzQm9vayIgYmluZGluZz0iaW50ZjpBZGRyZXNzQm9va1NvYXBCaW5kaW5nIj4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvQWRkcmVzc0Jvb2siLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTktMS90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTktMS90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWQ2MDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTEvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDE5LTEiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uIGNvbmZvcm1hbnQgd3NkbCBjb250YWluaW5nIGEgZG9jdW1lbnQgbGl0ZXJhbCBiaW5kaW5nCi0gICAgd2loIGEgbmFtcGFjZSBhdHRyaWJ1dGUgc3BlY2lmaWVkIHRoZSBzb2FwYmluZDpoZWFkZXIgZWxlbWVudC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMDE5IiB0YWRJRD0iU1NCUDEwIi8+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMDE5IiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS0yLzIwMTktMi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTIvMjAxOS0yLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjAwZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTIvMjAxOS0yLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2siPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJBZGRyZXNzQm9va1NvYXBCaW5kaW5nIiB0eXBlPSJpbnRmOkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiPgotICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvbm93aGVyZSIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS0yL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS0yL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5YWUwMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTktMi90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMTktMiI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24gY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSBkb2N1bWVudCBsaXRlcmFsIGJpbmRpbmcKLSAgICB3aWggYSBuYW1wYWNlIGF0dHJpYnV0ZSBzcGVjaWZpZWQgdGhlIHNvYXBiaW5kOmJvZHkgZWxlbWVudC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMDE5IiB0YWRJRD0iU1NCUDEwIi8+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMDE5IiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS0zLzIwMTktMy53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTMvMjAxOS0zLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNjM5OTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTMvMjAxOS0zLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwYXJhbWV0ZXJmYXVsdCI+Ci0gICAgPHBhcnQgbmFtZT0icGFydDMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiIC8+Ci0gICA8L3dzZGw6bWVzc2FnZT4gCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiIG1lc3NhZ2U9ImludGY6cGFyYW1ldGVyZmF1bHQiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCI+Ci0gICAgICAgIDwvd3NkbHNvYXA6aGVhZGVyPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIj4KLSAgICAgICAgPHdzZGxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0iZjEiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnL25vd2hlcmUiLz4KLSAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJBZGRyZXNzQm9va1NlcnZpY2UiPgotICAgIDx3c2RsOnBvcnQgbmFtZT0iQWRkcmVzc0Jvb2siIGJpbmRpbmc9ImludGY6QWRkcmVzc0Jvb2tTb2FwQmluZGluZyI+Ci0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0FkZHJlc3NCb29rIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTMvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTMvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2VjMDNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS0zL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxOS0zIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbiBjb25mb3JtYW50IHdzZGwgY29udGFpbmluZyBhIGRvY3VtZW50IGxpdGVyYWwgYmluZGluZwotICAgIHdpaCBhIG5hbXBhY2UgYXR0cmlidXRlIHNwZWNpZmllZCB0aGUgc29hcGJpbmQ6ZmF1bHQgZWxlbWVudC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMDE5IiB0YWRJRD0iU1NCUDEwIi8+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMDE5IiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS00LzIwMTktNC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTQvMjAxOS00LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjgxZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMDE5LTQvMjAxOS00LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwYXJhbWV0ZXJmYXVsdCI+Ci0gICAgPHBhcnQgbmFtZT0icGFydDMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiIC8+Ci0gICA8L3dzZGw6bWVzc2FnZT4gCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiIG1lc3NhZ2U9ImludGY6cGFyYW1ldGVyZmF1bHQiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCI+Ci0gICAgICAgICAgIDx3c2Rsc29hcDpoZWFkZXJmYXVsdCBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJmMSI+Ci0gICAgICAgIDx3c2Rsc29hcDpmYXVsdCB1c2U9ImxpdGVyYWwiIG5hbWU9ImYxIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy9ub3doZXJlIi8+Ci0gICAgICA8L3dzZGw6ZmF1bHQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS00L3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAxOS00L3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0OWE1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMTktNC90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMTktNCI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24gY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSBkb2N1bWVudCBsaXRlcmFsIGJpbmRpbmcKLSAgICB3aWggYSBuYW1wYWNlIGF0dHJpYnV0ZSBzcGVjaWZpZWQgdGhlIHNvYXBiaW5kOmhlYWRlcmZhdWx0IGVsZW1lbnQuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAxOSIgdGFkSUQ9IlNTQlAxMCIvPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAxOSIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMjAtMS8yMDIwLTEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAyMC0xLzIwMjAtMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjkwNDU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAyMC0xLzIwMjAtMS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2UvPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiPgotICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAyMC0xL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAyMC0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjY2NiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMjAtMS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMjAtMSI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24gY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSBycGMgbGl0ZXJhbCBiaW5kaW5nCi0gICAgd2loIGEgbmFtcGFjZSBhdHRyaWJ1dGUgbWlzc2luZyBmcm9tIGEgc29hcGJpbmQ6Ym9keSBlbGVtZW50LgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcz4KLSAgICA8YXNzZXJ0aW9uIGlkPSJCUDIwMjAiIHRhZElEPSJTU0JQMTAiLz4KLSAgICA8YXNzZXJ0aW9uIGlkPSJCUDIwMjAiIHRhZElEPSJBUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLQotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMjAtMi8yMDIwLTIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAyMC0yLzIwMjAtMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2ZmNjM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAyMC0yLzIwMjAtMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2UvPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiPgotICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSIyMDIwLnhzZCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAyMC0yL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjAyMC0yL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3NDE4MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIwMjAtMi90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMjAtMiI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24gY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSBycGMgbGl0ZXJhbCBiaW5kaW5nCi0gICAgd2loIGEgbmFtcGFjZSBhdHRyaWJ1dGUgc3BlY2lmaWVkIGluIHRoZSBzb2FwYmluZDpib2R5IGVsZW1lbnQgdGhhdCBoYXMgYSAKLSAgICB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBhYnNvbHV0ZSBVUkkuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAyMCIgdGFkSUQ9IlNTQlAxMCIvPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjAyMCIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotCi08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0xLzIxMDUtMS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTA1LTEvMjEwNS0xLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NDE1Y2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTA1LTEvMjEwNS0xLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08ZGVmaW5pdGlvbnMgCi0gICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIAotICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICB4bWxuczpzMD0iaHR0cDovL3RlbXB1cmkub3JnLyIgCi0gICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiAKLSAgICAgICAgeG1sbnM6dG09Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dzZGwvbWltZS90ZXh0TWF0Y2hpbmcvIiAKLSAgICAgICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPGRvY3VtZW50YXRpb24+Ci0gIDwvZG9jdW1lbnRhdGlvbj4KLSAgPHR5cGVzLz4KLSAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMTA1YSIgbG9jYXRpb249IjIxMDVhLndzZGwiLz4KLSAgPGltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMTA1YiIgbG9jYXRpb249IjIxMDViLndzZGwiLz4KLQotICA8bWVzc2FnZSBuYW1lPSJlY2hvU3RyaW5nSW4iPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9InM6c3RyaW5nIi8+Ci0gIDwvbWVzc2FnZT4KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ091dCI+Ci0gICAgPHBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iczpzdHJpbmciIC8+Ci0gIDwvbWVzc2FnZT4KLSAgPHBvcnRUeXBlIG5hbWU9IkVjaG9Qb3J0VHlwZSI+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIiBwYXJhbWV0ZXJPcmRlcj0icGFyYW1ldGVycyI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0iczA6ZWNob1N0cmluZ0luIiAvPgotICAgICAgPG91dHB1dCBtZXNzYWdlPSJzMDplY2hvU3RyaW5nT3V0IiAvPgotICAgIDwvb3BlcmF0aW9uPgotICAgPC9wb3J0VHlwZT4KLSAgPGJpbmRpbmcgbmFtZT0iRWNob0JpbmRpbmciIHR5cGU9InMwOkVjaG9Qb3J0VHlwZSI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9InJwYyIgLz4KLSAgICA8b3BlcmF0aW9uIG5hbWU9ImVjaG9TdHJpbmciPgotICAgICAgPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9lY2hvU3RyaW5nIiBzdHlsZT0icnBjIiAvPgotICAgICAgPGlucHV0PgotICAgICAgICA8c29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHA6Ly9vcmcub3JnIi8+Ci0gICAgICA8L2lucHV0PgotICAgICAgPG91dHB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHRwOi8vb3JnLm9yZyIgLz4KLSAgICAgIDwvb3V0cHV0PgotICAgIDwvb3BlcmF0aW9uPgotIDwvYmluZGluZz4KLSAgPHNlcnZpY2UgbmFtZT0iRWNob1NlcnZpY2UiPgotICAgIDxwb3J0IG5hbWU9IkVjaG9Qb3J0IiBiaW5kaW5nPSJzMDpFY2hvQmluZGluZyI+Ci0gICAgICA8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0xLzIxMDVhLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMS8yMTA1YS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzFlNzlhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0xLzIxMDVhLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08ZGVmaW5pdGlvbnMgCi0gICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIAotICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICB4bWxuczpzMD0iaHR0cDovL3RlbXB1cmkub3JnLzIxMDVhIiAKLSAgICAgICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIAotICAgICAgICB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iIAotICAgICAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiAKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjEwNWEiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0xLzIxMDViLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMS8yMTA1Yi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzA3OWIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0xLzIxMDViLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08ZGVmaW5pdGlvbnMgCi0gICAgICAgIHhtbG5zOmh0dHA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvaHR0cC8iIAotICAgICAgICB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLSAgICAgICAgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICB4bWxuczpzMD0iaHR0cDovL3RlbXB1cmkub3JnLzIxMDViIiAKLSAgICAgICAgeG1sbnM6c29hcGVuYz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIAotICAgICAgICB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iIAotICAgICAgICB4bWxuczptaW1lPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL21pbWUvIiAKLSAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjEwNWIiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0xL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3ZmMwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIxMDUtMSI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24gY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSB0eXBlcwotICAgIGVsZW1lbnQgcHJlY2VkaW5nIHRoZSAyIGltcG9ydCBlbGVtZW50cy4gCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjEwNSIgdGFkSUQ9IlNTQlAxMCIvPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjEwNSIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMi8yMTA1LTIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0yLzIxMDUtMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDExNDdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjEwNS0yLzIxMDUtMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPGRlZmluaXRpb25zIAotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIAotICAgICAgICB4bWxuczpzb2FwZW5jPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgCi0gICAgICAgIHhtbG5zOnRtPSJodHRwOi8vbWljcm9zb2Z0LmNvbS93c2RsL21pbWUvdGV4dE1hdGNoaW5nLyIgCi0gICAgICAgIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIAotICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDxkb2N1bWVudGF0aW9uPgotICA8L2RvY3VtZW50YXRpb24+Ci0gIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjEwNWEiIGxvY2F0aW9uPSIyMTA1YS53c2RsIi8+Ci0gIDx0eXBlcy8+Ci0gIDxpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvMjEwNWIiIGxvY2F0aW9uPSIyMTA1Yi53c2RsIi8+Ci0KLSAgPG1lc3NhZ2UgbmFtZT0iZWNob1N0cmluZ0luIj4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJzOnN0cmluZyIvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9ImVjaG9TdHJpbmdPdXQiPgotICAgIDxwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9InM6c3RyaW5nIiAvPgotICA8L21lc3NhZ2U+Ci0gIDxwb3J0VHlwZSBuYW1lPSJFY2hvUG9ydFR5cGUiPgotICAgIDxvcGVyYXRpb24gbmFtZT0iZWNob1N0cmluZyIgcGFyYW1ldGVyT3JkZXI9InBhcmFtZXRlcnMiPgotICAgICAgPGlucHV0IG1lc3NhZ2U9InMwOmVjaG9TdHJpbmdJbiIgLz4KLSAgICAgIDxvdXRwdXQgbWVzc2FnZT0iczA6ZWNob1N0cmluZ091dCIgLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgIDwvcG9ydFR5cGU+Ci0gIDxiaW5kaW5nIG5hbWU9IkVjaG9CaW5kaW5nIiB0eXBlPSJzMDpFY2hvUG9ydFR5cGUiPgotICAgIDxzb2FwOmJpbmRpbmcgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiIHN0eWxlPSJycGMiIC8+Ci0gICAgPG9wZXJhdGlvbiBuYW1lPSJlY2hvU3RyaW5nIj4KLSAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvZWNob1N0cmluZyIgc3R5bGU9InJwYyIgLz4KLSAgICAgIDxpbnB1dD4KLSAgICAgICAgPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHRwOi8vb3JnLm9yZyIvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0cDovL29yZy5vcmciIC8+Ci0gICAgICA8L291dHB1dD4KLSAgICA8L29wZXJhdGlvbj4KLSA8L2JpbmRpbmc+Ci0gIDxzZXJ2aWNlIG5hbWU9IkVjaG9TZXJ2aWNlIj4KLSAgICA8cG9ydCBuYW1lPSJFY2hvUG9ydCIgYmluZGluZz0iczA6RWNob0JpbmRpbmciPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgIDwvcG9ydD4KLSAgPC9zZXJ2aWNlPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMi8yMTA1YS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTA1LTIvMjEwNWEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxZTc5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMi8yMTA1YS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPGRlZmluaXRpb25zIAotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMTA1YSIgCi0gICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiAKLSAgICAgICAgeG1sbnM6dG09Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dzZGwvbWltZS90ZXh0TWF0Y2hpbmcvIiAKLSAgICAgICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLzIxMDVhIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMi8yMTA1Yi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTA1LTIvMjEwNWIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwNzliMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMi8yMTA1Yi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPGRlZmluaXRpb25zIAotICAgICAgICB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiAKLSAgICAgICAgeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0gICAgICAgIHhtbG5zOnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8yMTA1YiIgCi0gICAgICAgIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiAKLSAgICAgICAgeG1sbnM6dG09Imh0dHA6Ly9taWNyb3NvZnQuY29tL3dzZGwvbWltZS90ZXh0TWF0Y2hpbmcvIiAKLSAgICAgICAgeG1sbnM6bWltZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIgCi0gICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLzIxMDViIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotPC9kZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMi90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMDUtMi90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNTk5ZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTA1LTIvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMTA1LTIiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uIGNvbmZvcm1hbnQgd3NkbCBjb250YWluaW5nIGEgdHlwZXMKLSAgICBlbGVtZW50IGJldHdlZW4gdGhlIDIgaW1wb3J0IGVsZW1lbnRzLiAKLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMTA1IiB0YWRJRD0iU1NCUDEwIi8+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMTA1IiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjExNy0xLzIxMTctMS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTE3LTEvMjExNy0xLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYjhmZWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTE3LTEvMjExNy0xLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotIAotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQWRkcmVzc0Jvb2tTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIj4KLSAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjExNy0xL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjExNy0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzN2FjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMTctMS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIxMTctMSI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24gY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSBycGMgbGl0ZXJhbCBiaW5kaW5nCi0gICAgd2loIGEgbmFtcGFjZSBhdHRyaWJ1dGUgc3BlY2lmaWVkIHRoZSBzb2FwYmluZDpmYXVsdCBlbGVtZW50LgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcz4KLSAgICA8YXNzZXJ0aW9uIGlkPSJCUDIxMTciIHRhZElEPSJTU0JQMTAiLz4KLSAgICA8YXNzZXJ0aW9uIGlkPSJCUDIxMTciIHRhZElEPSJBUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLQotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMTctMi8yMTE3LTIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjExNy0yLzIxMTctMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjgyMmE3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjExNy0yLzIxMTctMi53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6aW1wbD0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8d3NkbDp0eXBlcz4KLSAgICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcm92aW5jZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0iY2l0eSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ic3RyZWV0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwaG9uZU51bWJlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6UGhvbmVOdW1iZXIiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJQaG9uZU51bWJlciI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJhcmVhIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgPHNlcXVlbmNlLz4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwYXJhbWV0ZXJmYXVsdCI+Ci0gICAgPHBhcnQgbmFtZT0icGFydDMiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwvd3NkbDptZXNzYWdlPiAgCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiIG1lc3NhZ2U9ImludGY6cGFyYW1ldGVyZmF1bHQiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiPgotICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiPgotICAgICAgICA8d3NkbHNvYXA6ZmF1bHQgdXNlPSJsaXRlcmFsIiBuYW1lPSJmMSIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6ZmF1bHQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJBZGRyZXNzQm9vayIgYmluZGluZz0iaW50ZjpBZGRyZXNzQm9va1NvYXBCaW5kaW5nIj4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvQWRkcmVzc0Jvb2siLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMTctMi90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMTctMi90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDAxZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTE3LTIvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMTE3LTIiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uIGNvbmZvcm1hbnQgd3NkbCBjb250YWluaW5nIGEgcnBjIGxpdGVyYWwgYmluZGluZwotICAgIHdpaCBhIG5hbXBhY2UgYXR0cmlidXRlIHNwZWNpZmllZCB0aGUgc29hcGJpbmQ6ZmF1bHQgZWxlbWVudC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMTE3IiB0YWRJRD0iU1NCUDEwIi8+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMTE3IiB0YWRJRD0iQVAxMCIvPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjExMyIgdGFkSUQ9IlNTQlAxMCIvPgotICAgIDxhc3NlcnRpb24gaWQ9IkJQMjExMyIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotCi08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjExNy0zLzIxMTctMy53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTE3LTMvMjExNy0zLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODhmNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yMTE3LTMvMjExNy0zLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2UvPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InBhcmFtZXRlcmZhdWx0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJ0MyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC93c2RsOm1lc3NhZ2U+ICAKLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2siPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJmMSIgbWVzc2FnZT0iaW50ZjpwYXJhbWV0ZXJmYXVsdCIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQWRkcmVzc0Jvb2tTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCI+Ci0gICAgICAgICAgPHdzZGxzb2FwOmhlYWRlcmZhdWx0IG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiAgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIj4KLSAgICAgICAgPHdzZGxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0iZjEiLz4KLSAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjExNy0zL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjExNy0zL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkMDcyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzIxMTctMy90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIxMTctMyI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24gY29uZm9ybWFudCB3c2RsIGNvbnRhaW5pbmcgYSBycGMgbGl0ZXJhbCBiaW5kaW5nCi0gICAgd2loIGEgbmFtcGFjZSBhdHRyaWJ1dGUgc3BlY2lmaWVkIHRoZSBzb2FwYmluZDpoZWFkZXJmYXVsdCBlbGVtZW50LgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcz4KLSAgICA8YXNzZXJ0aW9uIGlkPSJCUDIxMTciIHRhZElEPSJTU0JQMTAiLz4KLSAgICA8YXNzZXJ0aW9uIGlkPSJCUDIxMTciIHRhZElEPSJBUDEwIi8+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMTEzIiB0YWRJRD0iU1NCUDEwIi8+Ci0gICAgPGFzc2VydGlvbiBpZD0iQlAyMTEzIiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci0KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yNDA2LTEvMjQwNi0xLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzI0MDYtMS8yNDA2LTEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyNDg2MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2JwLzI0MDYtMS8yNDA2LTEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGRlZmluaXRpb25zIG5hbWU9IlNhbXBsZVNlcnZpY2UiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgIHhtbG5zOnRucz0iaHR0cDovL3RlbXB1cmkub3JnLyIgICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotCTxtZXNzYWdlIG5hbWU9ImdldFNhbXBsZVJlcXVlc3QiPgotCQk8cGFydCBuYW1lPSJ6aXBjb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC9tZXNzYWdlPgotCTxtZXNzYWdlIG5hbWU9ImdldFNhbXBsZVJlc3BvbnNlIj4KLQkJPHBhcnQgbmFtZT0icmV0dXJuIiB0eXBlPSJ4c2Q6ZmxvYXQiLz4KLQk8L21lc3NhZ2U+Ci0JPHBvcnRUeXBlIG5hbWU9IlNhbXBsZVBvcnRUeXBlIj4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRTYW1wbGUiPgotCQkJPGlucHV0IG1lc3NhZ2U9InRuczpnZXRTYW1wbGVSZXF1ZXN0Ii8+Ci0JCQk8b3V0cHV0IG1lc3NhZ2U9InRuczpnZXRTYW1wbGVSZXNwb25zZSIvPgotCQk8L29wZXJhdGlvbj4KLQk8L3BvcnRUeXBlPgotCTxiaW5kaW5nIG5hbWU9IlNhbXBsZUJpbmRpbmciIHR5cGU9InRuczpTYW1wbGVQb3J0VHlwZSI+Ci0JCTxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLQkJPG9wZXJhdGlvbiBuYW1lPSJnZXRTYW1wbGUiPgotCQkJPHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotCQkJPGlucHV0PgotCQkJCTxzb2FwOmJvZHkgdXNlPSJlbmNvZGVkIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIGVuY29kaW5nU3R5bGU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIi8+Ci0JCQk8L2lucHV0PgotCQkJPG91dHB1dD4KLQkJCQk8c29hcDpib2R5IHVzZT0iZW5jb2RlZCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiBlbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIvPgotCQkJPC9vdXRwdXQ+Ci0JCTwvb3BlcmF0aW9uPgotCTwvYmluZGluZz4KLQk8c2VydmljZSBuYW1lPSJTYW1wbGVTZXJ2aWNlIj4KLQkJPGRvY3VtZW50YXRpb24+PC9kb2N1bWVudGF0aW9uPgotCQk8cG9ydCBuYW1lPSJTYW1wbGVQb3J0IiBiaW5kaW5nPSJ0bnM6U2FtcGxlQmluZGluZyI+Ci0JCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0JCTwvcG9ydD4KLQk8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yNDA2LTEvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9icC8yNDA2LTEvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2EyODdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvYnAvMjQwNi0xL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjQwNi0xIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbi1jb25mb3JtYW50IHdzZGwgdGhhdCBmYWlscyB0ZXN0IGFzc2VydGlvbiBCUDI0MDYuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjQwNiIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjQwNiIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2J1Z3ppbGxhL2VtcHR5U29hcEJvZHkvZW1wdHlTb2FwQm9keS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9idWd6aWxsYS9lbXB0eVNvYXBCb2R5L2VtcHR5U29hcEJvZHkud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAyMDI5Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL2J1Z3ppbGxhL2VtcHR5U29hcEJvZHkvZW1wdHlTb2FwQm9keS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxkZWZpbml0aW9ucyB4bWxuczpodHRwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiB4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6czA9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOnNvYXBlbmM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiB4bWxuczp0bT0iaHR0cDovL21pY3Jvc29mdC5jb20vd3NkbC9taW1lL3RleHRNYXRjaGluZy8iIHhtbG5zOm1pbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvbWltZS8iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHR5cGVzPgotICAgIDxzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIj4KLSAgICAgIDxzOmVsZW1lbnQgbmFtZT0iZWNob1N0cmluZyI+Ci0gICAgICAgIDxzOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDxzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iYXJnIiB0eXBlPSJzOnN0cmluZyIgLz4KLSAgICAgICAgICA8L3M6c2VxdWVuY2U+Ci0gICAgICAgIDwvczpjb21wbGV4VHlwZT4KLSAgICAgIDwvczplbGVtZW50PgotICAgIDwvczpzY2hlbWE+Ci0gIDwvdHlwZXM+Ci0gIDxtZXNzYWdlIG5hbWU9InNldE1lc3NhZ2VSZXF1ZXN0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJzMDplY2hvU3RyaW5nIiAvPgotICA8L21lc3NhZ2U+Ci0gIDxtZXNzYWdlIG5hbWU9InNldE1lc3NhZ2VSZXNwb25zZSIvPgotCi0gIDxwb3J0VHlwZSBuYW1lPSJTZXJ2aWNlMVNvYXAiPgotICAgIDxvcGVyYXRpb24gbmFtZT0ic2V0TWVzc2FnZSI+Ci0gICAgICA8aW5wdXQgbWVzc2FnZT0iczA6c2V0TWVzc2FnZVJlcXVlc3QiIC8+Ci0gICAgICA8b3V0cHV0IG1lc3NhZ2U9InMwOnNldE1lc3NhZ2VSZXNwb25zZSIgLz4KLSAgICA8L29wZXJhdGlvbj4KLSAgPC9wb3J0VHlwZT4KLQotICA8YmluZGluZyBuYW1lPSJTZXJ2aWNlMVNvYXAiIHR5cGU9InMwOlNlcnZpY2UxU29hcCI+Ci0gICAgPHNvYXA6YmluZGluZyB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgc3R5bGU9ImRvY3VtZW50IiAvPgotICAgIDxvcGVyYXRpb24gbmFtZT0ic2V0TWVzc2FnZSI+Ci0gICAgICA8c29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIiBzdHlsZT0iZG9jdW1lbnQiIC8+Ci0gICAgICA8aW5wdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotICAgICAgPC9pbnB1dD4KLSAgICAgIDxvdXRwdXQ+Ci0gICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgotICAgICAgPC9vdXRwdXQ+Ci0gICAgPC9vcGVyYXRpb24+Ci0gIDwvYmluZGluZz4KLQotICA8c2VydmljZSBuYW1lPSJTZXJ2aWNlMSI+Ci0gICAgPHBvcnQgbmFtZT0iU2VydmljZTFTb2FwIiBiaW5kaW5nPSJzMDpTZXJ2aWNlMVNvYXAiPgotICAgICAgPHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL2xvY2FsaG9zdC9XU0lTZXJ2aWNlL1NlcnZpY2UxLmFzbXgiIC8+Ci0gICAgPC9wb3J0PgotICA8L3NlcnZpY2U+Ci08L2RlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTAtMS8yMDEwLTEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTAtMS8yMDEwLTEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxM2RhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDEwLTEvMjAxMC0xLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlLz4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzcyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDEwLTEvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMC0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5YmFmYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDEwLTEvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDEwLTEiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uLWNvbmZvcm1hbnQgd3NkbCB0aGF0IGZhaWxzIHRlc3QgYXNzZXJ0aW9uIEJQMjAxMC4KLSAgICBOb3RlIHRoaXMgYXNzZXJ0aW9uIGlzIGNhdWdodCBieSB0aGUgYmFzZSBXU0RMIHZhbGlkYXRvci4KLSAgICBTbyB0aGlzIGFzc2VydGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiBydW5uaW5nIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi0gICAgYmFzZSB2YWxpZGF0b3IuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAxMCIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAxMCIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTEvMjAxMS0xLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTEvMjAxMS0xLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzA4Y2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS0xLzIwMTEtMS53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgICA8aW1wb3J0IG5hbWVzcGFjZT0iMjAxMS54c2QiIHNjaGVtYUxvY2F0aW9uPSIyMDExLnhzZCIvPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlLz4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzcyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTEvMjAxMS54c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTEvMjAxMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NTdmN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS0xLzIwMTEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSIyMDExLnhzZCIgCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICAgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiAKLSAgICAgICAgIHhtbG5zOmludGY9IjIwMTEtMS54c2QiIAotICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJuZXh0LnhzZCIgc2NoZW1hTG9jYXRpb249Im5leHQueHNkIi8+Ci0gIDwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMS9uZXh0LnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMS9uZXh0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2ODQyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTEvbmV4dC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHhzOnNjaGVtYSAKLSAgdGFyZ2V0TmFtZXNwYWNlPSJuZXh0LnhzZCIKLSAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgeG1sbnM6cz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iIAotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+Ci0JPHhzOmFubm90YXRpb24+Ci0JICA8eHM6ZG9jdW1lbnRhdGlvbj4KLSAgIAkgIDwveHM6ZG9jdW1lbnRhdGlvbj4KLQk8L3hzOmFubm90YXRpb24+Ci08L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMS90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTEvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI2NzBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxMS0xIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG9uZm9ybWFudCB3c2RsLgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcy8+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMi8yMDExLTIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMi8yMDExLTIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzMDhjZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTIvMjAxMS0yLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgIDxpbXBvcnQgbmFtZXNwYWNlPSIyMDExLnhzZCIgc2NoZW1hTG9jYXRpb249IjIwMTEueHNkIi8+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcm92aW5jZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0iY2l0eSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ic3RyZWV0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwaG9uZU51bWJlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6UGhvbmVOdW1iZXIiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJQaG9uZU51bWJlciI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJhcmVhIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2UvPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMi8yMDExLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMi8yMDExLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyMTZkNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTIvMjAxMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMSIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0gPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gICAgICAgICB0YXJnZXROYW1lc3BhY2U9IjIwMTEueHNkIiAKLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgICB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIAotICAgICAgICAgeG1sbnM6aW50Zj0iMjAxMS0xLnhzZCIgCi0gICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMi90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTIvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmI3MGQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMi90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMTEtMiI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24tY29uZm9ybWFudCB3c2RsIHRoYXQgc2hvdWxkIGZhaWwgdGVzdCBhc3NlcnRpb24gQlAyMDExLgotICAgIEhvd2V2ZXIgdGhlIHByZXJlcXVpc2l0ZSBCUDIxMDIgZmFpbHMgYmVmb3JlIHdlIGFjdHVhbGx5IGNhbiBleGVjdXRlIHRoZSB0ZXN0IGFzc2VydGlvbi4KLSAgICBOb3RlIHRoaXMgYXNzZXJ0aW9uIGlzIGNhdWdodCBieSB0aGUgYmFzZSBXU0RMIHZhbGlkYXRvci4KLSAgICBTbyB0aGlzIGFzc2VydGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiBydW5uaW5nIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi0gICAgYmFzZSB2YWxpZGF0b3IuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjEwMiIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjEyMiIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjIwMiIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjEwMiIgdGFkSUQ9IkFQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIxMjIiIHRhZElEPSJBUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMjAyIiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMy8yMDExLTMud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMy8yMDExLTMud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzMDhjZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTMvMjAxMS0zLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgIDxpbXBvcnQgbmFtZXNwYWNlPSIyMDExLnhzZCIgc2NoZW1hTG9jYXRpb249IjIwMTEueHNkIi8+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcm92aW5jZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0iY2l0eSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ic3RyZWV0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwaG9uZU51bWJlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6UGhvbmVOdW1iZXIiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJQaG9uZU51bWJlciI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJhcmVhIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2UvPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMy8yMDExLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMy8yMDExLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1N2Y3Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTMvMjAxMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0gPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gICAgICAgICB0YXJnZXROYW1lc3BhY2U9IjIwMTEueHNkIiAKLSAgICAgICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgICAgICB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIAotICAgICAgICAgeG1sbnM6aW50Zj0iMjAxMS0xLnhzZCIgCi0gICAgICAgICB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgPGltcG9ydCBuYW1lc3BhY2U9Im5leHQueHNkIiBzY2hlbWFMb2NhdGlvbj0ibmV4dC54c2QiLz4KLSAgPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS0zL25leHQueHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS0zL25leHQueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjBhNzdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMy9uZXh0LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMSIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08eHM6c2NoZW1hIAotICB0YXJnZXROYW1lc3BhY2U9Im5leHQueHNkIgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICB4bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQk8eHM6YW5ub3RhdGlvbj4KLQkgIDx4czpkb2N1bWVudGF0aW9uPgotICAgCSAgPC94czpkb2N1bWVudGF0aW9uPgotCTwveHM6YW5ub3RhdGlvbj4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS0zL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtMy90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2ExZTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS0zL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxMS0zIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbi1jb25mb3JtYW50IHdzZGwgdGhhdCBzaG91bGQgZmFpbCB0ZXN0IGFzc2VydGlvbiBCUDIwMTEuCi0gICAgSG93ZXZlciB0aGUgcHJlcmVxdWlzaXRlIEJQMjEwMiBmYWlscyBiZWZvcmUgd2UgYWN0dWFsbHkgY2FuIGV4ZWN1dGUgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgIE5vdGUgdGhpcyBhc3NlcnRpb24gaXMgY2F1Z2h0IGJ5IHRoZSBiYXNlIFdTREwgdmFsaWRhdG9yLgotICAgIFNvIHRoaXMgYXNzZXJ0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHJ1bm5pbmcgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLSAgICBiYXNlIHZhbGlkYXRvci4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTAyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTIyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMjAyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTAyIiB0YWRJRD0iQVAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjEyMiIgdGFkSUQ9IkFQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIyMDIiIHRhZElEPSJBUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS00LzIwMTEtNC53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS00LzIwMTEtNC53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDMwOGNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtNC8yMDExLTQud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6aW1wbD0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8d3NkbDp0eXBlcz4KLSAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICAgPGltcG9ydCBuYW1lc3BhY2U9IjIwMTEueHNkIiBzY2hlbWFMb2NhdGlvbj0iMjAxMS54c2QiLz4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2siPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJBZGRyZXNzQm9va1NlcnZpY2UiPgotIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS00LzIwMTEueHNkIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS00LzIwMTEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmM4N2JmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtNC8yMDExLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLSA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iMjAxMS54c2QiIAotICAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICAgICAgIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgCi0gICAgICAgICB4bWxuczppbnRmPSIyMDExLTEueHNkIiAKLSAgICAgICAgIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgICA8eHM6YW5ub3RhdGlvbj4KLSAgPC9zY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS00L3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtNC90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNmIyYTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS00L3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxMS00Ij4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbi1jb25mb3JtYW50IHdzZGwgdGhhdCBzaG91bGQgZmFpbCB0ZXN0IGFzc2VydGlvbiBCUDIwMTEuCi0gICAgSG93ZXZlciB0aGUgcHJlcmVxdWlzaXRlIEJQMjEwMiBmYWlscyBiZWZvcmUgd2UgYWN0dWFsbHkgY2FuIGV4ZWN1dGUgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgIE5vdGUgdGhpcyBhc3NlcnRpb24gaXMgY2F1Z2h0IGJ5IHRoZSBiYXNlIFdTREwgdmFsaWRhdG9yLgotICAgIFNvIHRoaXMgYXNzZXJ0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHJ1bm5pbmcgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLSAgICBiYXNlIHZhbGlkYXRvci4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTAyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTIyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTAyIiB0YWRJRD0iQVAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjEyMiIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotCi08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtNS8yMDExLTUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtNS8yMDExLTUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0NTgzNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTUvMjAxMS01LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICAgIDxpbXBvcnQgbmFtZXNwYWNlPSIyMDExLTEueHNkIiBzY2hlbWFMb2NhdGlvbj0iMjAxMS0xLnhzZCIvPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlLz4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzcyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTUvMjAxMS54c2QgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTUvMjAxMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NTdmN2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS01LzIwMTEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSIyMDExLnhzZCIgCi0gICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgICAgICAgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiAKLSAgICAgICAgIHhtbG5zOmludGY9IjIwMTEtMS54c2QiIAotICAgICAgICAgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgIDxpbXBvcnQgbmFtZXNwYWNlPSJuZXh0LnhzZCIgc2NoZW1hTG9jYXRpb249Im5leHQueHNkIi8+Ci0gIDwvc2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtNS9uZXh0LnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtNS9uZXh0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzYzQ1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDExLTUvbmV4dC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08eHM6c2NoZW1hIAotICB0YXJnZXROYW1lc3BhY2U9Im5leHQueHNkIgotICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICB4bWxuczpzPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KLQk8eHM6YW5ub3RhdGlvbj4KLTwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS01L3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMTEtNS90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWNiMjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAxMS01L3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAxMS01Ij4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbi1jb25mb3JtYW50IHdzZGwgdGhhdCBzaG91bGQgZmFpbCB0ZXN0IGFzc2VydGlvbiBCUDIwMTEuCi0gICAgSG93ZXZlciB0aGUgcHJlcmVxdWlzaXRlIEJQMjEwMiBmYWlscyBiZWZvcmUgd2UgYWN0dWFsbHkgY2FuIGV4ZWN1dGUgdGhlIHRlc3QgYXNzZXJ0aW9uLgotICAgIE5vdGUgdGhpcyBhc3NlcnRpb24gaXMgY2F1Z2h0IGJ5IHRoZSBiYXNlIFdTREwgdmFsaWRhdG9yLgotICAgIFNvIHRoaXMgYXNzZXJ0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHJ1bm5pbmcgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLSAgICBiYXNlIHZhbGlkYXRvci4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTAyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTIyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMjAyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMTAyIiB0YWRJRD0iQVAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjEyMiIgdGFkSUQ9IkFQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIyMDIiIHRhZElEPSJBUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS0xLzIwMjEtMS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS0xLzIwMjEtMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDM2ODRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtMS8yMDIxLTEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotIAotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3MiIHR5cGU9InN0cmluZyIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0icGFyYW1ldGVyZmF1bHQiPgotICAgIDxwYXJ0IG5hbWU9InBhcnQzIiBlbGVtZW50PSJpbnRmOkFkZHJlc3MiIC8+Ci0gIDwvd3NkbDptZXNzYWdlPiAgCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiIG1lc3NhZ2U9ImludGY6cGFyYW1ldGVyZmF1bHQiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0cz0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIj4KLSAgICAgICAgICA8d3NkbHNvYXA6aGVhZGVyZmF1bHQgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiICBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIj4KLSAgICAgICAgPHdzZGxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0iZjEiLz4KLSAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtMS90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTEvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDY2N2I0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtMS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMjEtMSI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24tY29uZm9ybWFudCB3c2RsIHRoYXQgc2hvdWxkIGZhaWwgdGVzdCBhc3NlcnRpb24gQlAyMDIxLgotICAgIFNvYXBiaW5kOmhlYWRlciBlbGVtZW50IHVzZXMgcGFydHMgYXR0cmlidXRlLgotICAgIE5vdGUgdGhpcyBhc3NlcnRpb24gaXMgY2F1Z2h0IGJ5IHRoZSBiYXNlIFdTREwgdmFsaWRhdG9yLgotICAgIFNvIHRoaXMgYXNzZXJ0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHJ1bm5pbmcgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLSAgICBiYXNlIHZhbGlkYXRvci4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDIxIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDIxIiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtMi8yMDIxLTIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtMi8yMDIxLTIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZjUyMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTIvMjAyMS0yLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2UvPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzIiB0eXBlPSJzdHJpbmciLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InBhcmFtZXRlcmZhdWx0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJ0MyIgZWxlbWVudD0iaW50ZjpBZGRyZXNzIiAvPgotICA8L3dzZGw6bWVzc2FnZT4gIAotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIiBtZXNzYWdlPSJpbnRmOnBhcmFtZXRlcmZhdWx0Ii8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJBZGRyZXNzQm9va1NvYXBCaW5kaW5nIiB0eXBlPSJpbnRmOkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgdXNlPSJsaXRlcmFsIj4KLSAgICAgICAgICA8d3NkbHNvYXA6aGVhZGVyZmF1bHQgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiICBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIj4KLSAgICAgICAgPHdzZGxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0iZjEiLz4KLSAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtMi90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTIvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdiNmFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtMi90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMjEtMiI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24tY29uZm9ybWFudCB3c2RsIHRoYXQgc2hvdWxkIGZhaWwgdGVzdCBhc3NlcnRpb24gQlAyMDIxLgotICAgIFNvYXBiaW5kOmhlYWRlciBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBwYXJ0IGF0dHJpYnV0ZS4KLSAgICBOb3RlIHRoaXMgYXNzZXJ0aW9uIGlzIGNhdWdodCBieSB0aGUgYmFzZSBXU0RMIHZhbGlkYXRvci4KLSAgICBTbyB0aGlzIGFzc2VydGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiBydW5uaW5nIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi0gICAgYmFzZSB2YWxpZGF0b3IuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAyMSIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAyMSIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTMvMjAyMS0zLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTMvMjAyMS0zLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmN2NlZGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS0zLzIwMjEtMy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6aW1wbD0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8d3NkbDp0eXBlcz4KLSAgICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gCi0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcm92aW5jZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0iY2l0eSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ic3RyZWV0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwaG9uZU51bWJlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6UGhvbmVOdW1iZXIiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJQaG9uZU51bWJlciI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJhcmVhIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgPHNlcXVlbmNlLz4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzcyIgdHlwZT0ic3RyaW5nIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIHR5cGU9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwYXJhbWV0ZXJmYXVsdCI+Ci0gICAgPHBhcnQgbmFtZT0icGFydDMiIGVsZW1lbnQ9ImludGY6QWRkcmVzcyIgLz4KLSAgPC93c2RsOm1lc3NhZ2U+ICAKLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2siPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJmMSIgbWVzc2FnZT0iaW50ZjpwYXJhbWV0ZXJmYXVsdCIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQWRkcmVzc0Jvb2tTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9InJwYyIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCI+Ci0gICAgICAgICAgPHdzZGxzb2FwOmhlYWRlcmZhdWx0IG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiAgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgIDwvd3NkbHNvYXA6aGVhZGVyPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiBuYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJmMSI+Ci0gICAgICAgIDx3c2Rsc29hcDpmYXVsdCB1c2U9ImxpdGVyYWwiIG5hbWU9ImYxIi8+Ci0gICAgICA8L3dzZGw6ZmF1bHQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJBZGRyZXNzQm9vayIgYmluZGluZz0iaW50ZjpBZGRyZXNzQm9va1NvYXBCaW5kaW5nIj4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvQWRkcmVzc0Jvb2siLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTMvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS0zL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliMDE1Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTMvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDIxLTMiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uLWNvbmZvcm1hbnQgd3NkbCB0aGF0IHNob3VsZCBmYWlsIHRlc3QgYXNzZXJ0aW9uIEJQMjAyMS4KLSAgICBTb2FwYmluZDpoZWFkZXJmYXVsdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBwYXJ0IGF0dHJpYnV0ZS4KLSAgICBOb3RlIHRoaXMgYXNzZXJ0aW9uIGlzIGNhdWdodCBieSB0aGUgYmFzZSBXU0RMIHZhbGlkYXRvci4KLSAgICBTbyB0aGlzIGFzc2VydGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiBydW5uaW5nIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi0gICAgYmFzZSB2YWxpZGF0b3IuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAyMSIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAyMSIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTQvMjAyMS00LndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTQvMjAyMS00LndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NGFiN2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS00LzIwMjEtNC53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08d3NkbDpkZWZpbml0aW9ucyB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6aW1wbD0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8d3NkbDp0eXBlcz4KLSAgICA8c2NoZW1hIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6YXBhY2hlc29hcD0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcm92aW5jZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0iY2l0eSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ic3RyZWV0IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwb3N0YWxDb2RlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwaG9uZU51bWJlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6UGhvbmVOdW1iZXIiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJQaG9uZU51bWJlciI+Ci0gICAgPHNlcXVlbmNlPgotICAgICA8ZWxlbWVudCBuYW1lPSJhcmVhIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJudW1iZXIiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXR1cm4iIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGVsZW1lbnQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2UvPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc0hlYWRlclR5cGUiPgotCTxhbGw+Ci0JIDxlbGVtZW50IG5hbWU9ImEiIHR5cGU9ImludCIvPgotCSA8ZWxlbWVudCBuYW1lPSJiIiB0eXBlPSJib29sZWFuIi8+Ci0JIDxlbGVtZW50IG5hbWU9InMiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJzdHJpbmciLz4KLQk8L2FsbD4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0icGFyYW1ldGVyZmF1bHQiPgotICAgIDxwYXJ0IG5hbWU9InBhcnQzIiBlbGVtZW50PSJpbnRmOmZpbmRBZGRyZXNzIiAvPgotICAgPC93c2RsOm1lc3NhZ2U+IAotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIiBtZXNzYWdlPSJpbnRmOnBhcmFtZXRlcmZhdWx0Ii8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJBZGRyZXNzQm9va1NvYXBCaW5kaW5nIiB0eXBlPSJpbnRmOkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0cz0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIj4KLSAgICAgICAgICAgPHdzZGxzb2FwOmhlYWRlcmZhdWx0IG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiAgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJmMSI+Ci0gICAgICAgIDx3c2Rsc29hcDpmYXVsdCB1c2U9ImxpdGVyYWwiIG5hbWU9ImYxIi8+Ci0gICAgICA8L3dzZGw6ZmF1bHQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtNC90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTQvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDVjYzQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtNC90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9IjIwMjEtNCI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBub24tY29uZm9ybWFudCB3c2RsIHRoYXQgc2hvdWxkIGZhaWwgdGVzdCBhc3NlcnRpb24gQlAyMDIxLgotICAgIFNvYXBiaW5kOmhlYWRlciBlbGVtZW50IHVzZXMgcGFydHMgYXR0cmlidXRlLgotICAgIE5vdGUgdGhpcyBhc3NlcnRpb24gaXMgY2F1Z2h0IGJ5IHRoZSBiYXNlIFdTREwgdmFsaWRhdG9yLgotICAgIFNvIHRoaXMgYXNzZXJ0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHJ1bm5pbmcgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLSAgICBiYXNlIHZhbGlkYXRvci4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDIxIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDIxIiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtNS8yMDIxLTUud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtNS8yMDIxLTUud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1ZDdmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTUvMjAyMS01LndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwYXJhbWV0ZXJmYXVsdCI+Ci0gICAgPHBhcnQgbmFtZT0icGFydDMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiIC8+Ci0gICA8L3dzZGw6bWVzc2FnZT4gCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiIG1lc3NhZ2U9ImludGY6cGFyYW1ldGVyZmF1bHQiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHVzZT0ibGl0ZXJhbCI+Ci0gICAgICAgICAgIDx3c2Rsc29hcDpoZWFkZXJmYXVsdCBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiPgotICAgICAgICA8d3NkbHNvYXA6ZmF1bHQgdXNlPSJsaXRlcmFsIiBuYW1lPSJmMSIvPgotICAgICAgPC93c2RsOmZhdWx0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJBZGRyZXNzQm9vayIgYmluZGluZz0iaW50ZjpBZGRyZXNzQm9va1NvYXBCaW5kaW5nIj4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvQWRkcmVzc0Jvb2siLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTUvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS01L3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjOTI4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIxLTUvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDIxLTUiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uLWNvbmZvcm1hbnQgd3NkbCB0aGF0IHNob3VsZCBmYWlsIHRlc3QgYXNzZXJ0aW9uIEJQMjAyMS4KLSAgICBTb2FwYmluZDpoZWFkZXIgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgcGFydCBhdHRyaWJ1dGUuCi0gICAgTm90ZSB0aGlzIGFzc2VydGlvbiBpcyBjYXVnaHQgYnkgdGhlIGJhc2UgV1NETCB2YWxpZGF0b3IuCi0gICAgU28gdGhpcyBhc3NlcnRpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gcnVubmluZyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotICAgIGJhc2UgdmFsaWRhdG9yLgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMjEiIHRhZElEPSJTU0JQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMjEiIHRhZElEPSJBUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS02LzIwMjEtNi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS02LzIwMjEtNi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2E4NTUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtNi8yMDIxLTYud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlLz4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzcyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InBhcmFtZXRlcmZhdWx0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJ0MyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzcyIgLz4KLSAgIDwvd3NkbDptZXNzYWdlPiAKLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2siPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJmMSIgbWVzc2FnZT0iaW50ZjpwYXJhbWV0ZXJmYXVsdCIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQWRkcmVzc0Jvb2tTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIj4KLSAgICAgICAgICAgPHdzZGxzb2FwOmhlYWRlcmZhdWx0IG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgIDwvd3NkbHNvYXA6aGVhZGVyPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSBwYXJ0cz0icGFyYW1ldGVycyIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIj4KLSAgICAgICAgPHdzZGxzb2FwOmZhdWx0IHVzZT0ibGl0ZXJhbCIgbmFtZT0iZjEiLz4KLSAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJBZGRyZXNzQm9va1NlcnZpY2UiPgotICAgIDx3c2RsOnBvcnQgbmFtZT0iQWRkcmVzc0Jvb2siIGJpbmRpbmc9ImludGY6QWRkcmVzc0Jvb2tTb2FwQmluZGluZyI+Ci0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0FkZHJlc3NCb29rIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS02L3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjEtNi90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjE1MDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMS02L3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAyMS02Ij4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbi1jb25mb3JtYW50IHdzZGwgdGhhdCBzaG91bGQgZmFpbCB0ZXN0IGFzc2VydGlvbiBCUDIwMjEuCi0gICAgU29hcGJpbmQ6aGVhZGVyZmF1bHQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgcGFydCBhdHRyaWJ1dGUuCi0gICAgTm90ZSB0aGlzIGFzc2VydGlvbiBpcyBjYXVnaHQgYnkgdGhlIGJhc2UgV1NETCB2YWxpZGF0b3IuCi0gICAgU28gdGhpcyBhc3NlcnRpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gcnVubmluZyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotICAgIGJhc2UgdmFsaWRhdG9yLgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMjEiIHRhZElEPSJTU0JQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMjEiIHRhZElEPSJBUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMi0xLzIwMjItMS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMi0xLzIwMjItMS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTM4MGMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjItMS8yMDIyLTEud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotIAotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFkZHJlc3MiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3MiLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgdHlwZT0iaW1wbDpBZGRyZXNzSGVhZGVyVHlwZSIvPgotICAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3MiIHR5cGU9InN0cmluZyIvPgotICA8L3NjaGVtYT4KLSAgPC93c2RsOnR5cGVzPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJBZGRyZXNzSGVhZGVyIiBlbGVtZW50PSJpbnRmOkFkZHJlc3NIZWFkZXIiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiB0eXBlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0icGFyYW1ldGVyZmF1bHQiPgotICAgIDxwYXJ0IG5hbWU9InBhcnQzIiBlbGVtZW50PSJpbnRmOkFkZHJlc3MiIC8+Ci0gIDwvd3NkbDptZXNzYWdlPiAgCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiIG1lc3NhZ2U9ImludGY6cGFyYW1ldGVyZmF1bHQiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiPgotICAgICAgICAgIDx3c2Rsc29hcDpoZWFkZXJmYXVsdCBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiPgotICAgICAgICA8d3NkbHNvYXA6ZmF1bHQgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6ZmF1bHQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJBZGRyZXNzQm9vayIgYmluZGluZz0iaW50ZjpBZGRyZXNzQm9va1NvYXBCaW5kaW5nIj4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvQWRkcmVzc0Jvb2siLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIyLTEvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMi0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjYzAyYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDIyLTEvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDIyLTEiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uLWNvbmZvcm1hbnQgd3NkbCB0aGF0IHNob3VsZCBmYWlsIHRlc3QgYXNzZXJ0aW9uIEJQMjAyMi4KLSAgICBTb2FwYmluZDpmYXVsdCBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBuYW1lIGF0dHJpYnV0ZS4KLSAgICBOb3RlIHRoaXMgYXNzZXJ0aW9uIGlzIGNhdWdodCBieSB0aGUgYmFzZSBXU0RMIHZhbGlkYXRvci4KLSAgICBTbyB0aGlzIGFzc2VydGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiBydW5uaW5nIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi0gICAgYmFzZSB2YWxpZGF0b3IuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAyMiIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAyMiIgdGFkSUQ9IkFQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMzIiIHRhZElEPSJTU0JQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMzIiIHRhZElEPSJBUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMi0yLzIwMjItMi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMi0yLzIwMjItMi53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmRlMWRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjItMi8yMDIyLTIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmltcGw9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgPHdzZGw6dHlwZXM+Ci0gICAgPHNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOmFwYWNoZXNvYXA9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCIgeG1sbnM6aW50Zj0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3MiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlPgotICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPC9zZXF1ZW5jZT4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJvdmluY2UiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImNpdHkiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InN0cmVldCIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icG9zdGFsQ29kZSIgbmlsbGFibGU9InRydWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icGhvbmVOdW1iZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOlBob25lTnVtYmVyIi8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8Y29tcGxleFR5cGUgbmFtZT0iUGhvbmVOdW1iZXIiPgotICAgIDxzZXF1ZW5jZT4KLSAgICAgPGVsZW1lbnQgbmFtZT0iYXJlYSIgdHlwZT0ieHNkOmludCIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPC9zZXF1ZW5jZT4KLSAgIDwvY29tcGxleFR5cGU+Ci0gICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzUmV0dXJuIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxlbGVtZW50IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDxjb21wbGV4VHlwZT4KLSAgICAgPHNlcXVlbmNlLz4KLSAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NIZWFkZXJUeXBlIj4KLQk8YWxsPgotCSA8ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJpbnQiLz4KLQkgPGVsZW1lbnQgbmFtZT0iYiIgdHlwZT0iYm9vbGVhbiIvPgotCSA8ZWxlbWVudCBuYW1lPSJzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ic3RyaW5nIi8+Ci0JPC9hbGw+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzcyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InBhcmFtZXRlcmZhdWx0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJ0MyIgZWxlbWVudD0iaW50ZjpmaW5kQWRkcmVzcyIgLz4KLSAgIDwvd3NkbDptZXNzYWdlPiAKLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2siPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJmMSIgbWVzc2FnZT0iaW50ZjpwYXJhbWV0ZXJmYXVsdCIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6cG9ydFR5cGU+Ci0gIDx3c2RsOmJpbmRpbmcgbmFtZT0iQWRkcmVzc0Jvb2tTb2FwQmluZGluZyIgdHlwZT0iaW50ZjpBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGxzb2FwOmJpbmRpbmcgc3R5bGU9ImRvY3VtZW50IiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIj4KLSAgICAgICAgICAgPHdzZGxzb2FwOmhlYWRlcmZhdWx0IG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiAgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgICA8d3NkbDpmYXVsdCBuYW1lPSJmMSI+Ci0gICAgICAgIDx3c2Rsc29hcDpmYXVsdCB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJBZGRyZXNzQm9va1NlcnZpY2UiPgotICAgIDx3c2RsOnBvcnQgbmFtZT0iQWRkcmVzc0Jvb2siIGJpbmRpbmc9ImludGY6QWRkcmVzc0Jvb2tTb2FwQmluZGluZyI+Ci0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0FkZHJlc3NCb29rIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMi0yL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMjItMi90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYTg5MmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAyMi0yL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAyMi0yIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbi1jb25mb3JtYW50IHdzZGwgdGhhdCBzaG91bGQgZmFpbCB0ZXN0IGFzc2VydGlvbiBCUDIwMjIuCi0gICAgU29hcGJpbmQ6ZmF1bHQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUuCi0gICAgTm90ZSB0aGlzIGFzc2VydGlvbiBpcyBjYXVnaHQgYnkgdGhlIGJhc2UgV1NETCB2YWxpZGF0b3IuCi0gICAgU28gdGhpcyBhc3NlcnRpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gcnVubmluZyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotICAgIGJhc2UgdmFsaWRhdG9yLgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMjIiIHRhZElEPSJTU0JQMTAiLz4KLQk8YXNzZXJ0aW9uIGlkPSJCUDIwMjIiIHRhZElEPSJBUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDMyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDMyIiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMzItMS8yMDMyLTEud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMzItMS8yMDMyLTEud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyMjM1ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDMyLTEvMjAzMi0xLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2UvPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgICA8ZWxlbWVudCBuYW1lPSJBZGRyZXNzIiB0eXBlPSJzdHJpbmciLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InBhcmFtZXRlcmZhdWx0Ij4KLSAgICA8cGFydCBuYW1lPSJwYXJ0MyIgZWxlbWVudD0iaW50ZjpBZGRyZXNzIiAvPgotICA8L3dzZGw6bWVzc2FnZT4gIAotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIiBtZXNzYWdlPSJpbnRmOnBhcmFtZXRlcmZhdWx0Ii8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJBZGRyZXNzQm9va1NvYXBCaW5kaW5nIiB0eXBlPSJpbnRmOkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0icnBjIiB0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIvPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmhlYWRlciBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgcGFydD0iQWRkcmVzc0hlYWRlciIgdXNlPSJsaXRlcmFsIj4KLSAgICAgICAgICA8d3NkbHNvYXA6aGVhZGVyZmF1bHQgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiICBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICAgIDx3c2RsOmZhdWx0IG5hbWU9ImYxIj4KLSAgICAgICAgPHdzZGxzb2FwOmZhdWx0IG5hbWU9ImZhdWx0MSIgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6ZmF1bHQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpiaW5kaW5nPgotICA8d3NkbDpzZXJ2aWNlIG5hbWU9IkFkZHJlc3NCb29rU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJBZGRyZXNzQm9vayIgYmluZGluZz0iaW50ZjpBZGRyZXNzQm9va1NvYXBCaW5kaW5nIj4KLSAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvQWRkcmVzc0Jvb2siLz4KLSAgICA8L3dzZGw6cG9ydD4KLSAgPC93c2RsOnNlcnZpY2U+Ci08L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDMyLTEvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAzMi0xL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4YjMyNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDMyLTEvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSIyMDMyLTEiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbm9uLWNvbmZvcm1hbnQgd3NkbCB0aGF0IHNob3VsZCBmYWlsIHRlc3QgYXNzZXJ0aW9uIEJQMjAyMi4KLSAgICBUaGUgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgb24gdGhlIFNvYXBiaW5kOmZhdWx0IGVsZW1lbnQgZG9lcyBub3QgbWF0Y2ggdGhlIG5hbWUgCi0gICAgYXR0cmlidXRlIHZhbHVlIHNwZWNpZmllZCBvbiB0aGUgcGFyZW50IGVsZW1lbnQgd3NkbDpmYXVsdCBlbGVtZW50LgotICAgIE5vdGUgdGhpcyBhc3NlcnRpb24gaXMgY2F1Z2h0IGJ5IHRoZSBiYXNlIFdTREwgdmFsaWRhdG9yLgotICAgIFNvIHRoaXMgYXNzZXJ0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHJ1bm5pbmcgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKLSAgICBiYXNlIHZhbGlkYXRvci4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXM+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDMyIiB0YWRJRD0iU1NCUDEwIi8+Ci0JPGFzc2VydGlvbiBpZD0iQlAyMDMyIiB0YWRJRD0iQVAxMCIvPgotICA8L2V4cGVjdGVkRmFpbHVyZXM+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMzItMi8yMDMyLTIud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMzItMi8yMDMyLTIud3NkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyZmFkZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3JlZHVuZGFudC8yMDMyLTIvMjAzMi0yLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJwYXJhbWV0ZXJmYXVsdCI+Ci0gICAgPHBhcnQgbmFtZT0icGFydDMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiIC8+Ci0gICA8L3dzZGw6bWVzc2FnZT4gCi0gIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiIG1lc3NhZ2U9ImludGY6cGFyYW1ldGVyZmF1bHQiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iZmluZEFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpoZWFkZXIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCI+Ci0gICAgICAgICAgIDx3c2Rsc29hcDpoZWFkZXJmYXVsdCBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVxdWVzdCIgIHBhcnQ9IkFkZHJlc3NIZWFkZXIiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgICAgPC93c2Rsc29hcDpoZWFkZXI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHBhcnRzPSJwYXJhbWV0ZXJzIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDppbnB1dD4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgICAgPHdzZGw6ZmF1bHQgbmFtZT0iZjEiPgotICAgICAgICA8d3NkbHNvYXA6ZmF1bHQgbmFtZT0iZmF1bHQxIiB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpmYXVsdD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbHNvYXA6b3BlcmF0aW9uIHNvYXBBY3Rpb249IiIvPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJBZGRyZXNzQm9va1NlcnZpY2UiPgotICAgIDx3c2RsOnBvcnQgbmFtZT0iQWRkcmVzc0Jvb2siIGJpbmRpbmc9ImludGY6QWRkcmVzc0Jvb2tTb2FwQmluZGluZyI+Ci0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0FkZHJlc3NCb29rIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAzMi0yL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvcmVkdW5kYW50LzIwMzItMi90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzQ1OTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC9yZWR1bmRhbnQvMjAzMi0yL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iMjAzMi0yIj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIG5vbi1jb25mb3JtYW50IHdzZGwgdGhhdCBzaG91bGQgZmFpbCB0ZXN0IGFzc2VydGlvbiBCUDIwMjIuCi0gICAgVGhlIG5hbWUgYXR0cmlidXRlIHZhbHVlIG9uIHRoZSBTb2FwYmluZDpmYXVsdCBlbGVtZW50IGRvZXMgbm90IG1hdGNoIHRoZSBuYW1lIAotICAgIGF0dHJpYnV0ZSB2YWx1ZSBzcGVjaWZpZWQgb24gdGhlIHBhcmVudCBlbGVtZW50IHdzZGw6ZmF1bHQgZWxlbWVudC4KLSAgICBOb3RlIHRoaXMgYXNzZXJ0aW9uIGlzIGNhdWdodCBieSB0aGUgYmFzZSBXU0RMIHZhbGlkYXRvci4KLSAgICBTbyB0aGlzIGFzc2VydGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiBydW5uaW5nIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi0gICAgYmFzZSB2YWxpZGF0b3IuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAzMiIgdGFkSUQ9IlNTQlAxMCIvPgotCTxhc3NlcnRpb24gaWQ9IkJQMjAzMiIgdGFkSUQ9IkFQMTAiLz4KLSAgPC9leHBlY3RlZEZhaWx1cmVzPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3dzaS9hZGRyZXNzQm9vay1ycGMvYWRkcmVzc0Jvb2stcnBjLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3dzaS9hZGRyZXNzQm9vay1ycGMvYWRkcmVzc0Jvb2stcnBjLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NzdjMTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvYWRkcmVzc0Jvb2stcnBjL2FkZHJlc3NCb29rLXJwYy53c2RsCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAKLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhZGRyZXNzIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpBZGRyZXNzIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICA8c2VxdWVuY2UvPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIHR5cGU9ImltcGw6QWRkcmVzc0hlYWRlclR5cGUiLz4KLSAgPC9zY2hlbWE+Ci0gIDwvd3NkbDp0eXBlcz4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzcyIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx3c2RsOnBhcnQgbmFtZT0iQWRkcmVzc0hlYWRlciIgZWxlbWVudD0iaW50ZjpBZGRyZXNzSGVhZGVyIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDptZXNzYWdlIG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgIDx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gIDwvd3NkbDptZXNzYWdlPgotICA8d3NkbDpwb3J0VHlwZSBuYW1lPSJBZGRyZXNzQm9vayI+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVxdWVzdCIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1JlcXVlc3QiLz4KLSAgICAgIDx3c2RsOm91dHB1dCBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIiBtZXNzYWdlPSJpbnRmOmZpbmRBZGRyZXNzUmVzcG9uc2UiLz4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpzYXZlQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOnBvcnRUeXBlPgotICA8d3NkbDpiaW5kaW5nIG5hbWU9IkFkZHJlc3NCb29rU29hcEJpbmRpbmciIHR5cGU9ImludGY6QWRkcmVzc0Jvb2siPgotICAgIDx3c2Rsc29hcDpiaW5kaW5nIHN0eWxlPSJycGMiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiPgotICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6aW5wdXQ+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIgbmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIi8+Ci0gICAgICA8L3dzZGw6b3V0cHV0PgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9InNhdmVBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJzYXZlQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIG5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIvPgotICAgICAgPC93c2RsOm91dHB1dD4KLSAgICA8L3dzZGw6b3BlcmF0aW9uPgotICA8L3dzZGw6YmluZGluZz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJBZGRyZXNzQm9va1NlcnZpY2UiPgotICAgIDx3c2RsOnBvcnQgbmFtZT0iQWRkcmVzc0Jvb2siIGJpbmRpbmc9ImludGY6QWRkcmVzc0Jvb2tTb2FwQmluZGluZyI+Ci0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0FkZHJlc3NCb29rIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvYWRkcmVzc0Jvb2stcnBjL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL2FkZHJlc3NCb29rLXJwYy90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YTJmOGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvYWRkcmVzc0Jvb2stcnBjL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSJhZGRyZXNzQm9vay1ycGMiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY29uZm9ybWFudCB3c2RsIHVzZWQgaW4gdGhlIFdTLUkgCi0gICAgaW50ZXJvcGVyYWJpbGl0eSBkZW1vLgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcy8+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL2FkZHJlc3NCb29rL2FkZHJlc3NCb29rLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3dzaS9hZGRyZXNzQm9vay9hZGRyZXNzQm9vay53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ4MmQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL2FkZHJlc3NCb29rL2FkZHJlc3NCb29rLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3c2RsOmRlZmluaXRpb25zIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM6d3NkbD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczppbnRmPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczppbXBsPSJodHRwOi8vdGVtcHVyaS5vcmcvIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI+Ci0gIDx3c2RsOnR5cGVzPgotICAgIDxzY2hlbWEgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWxuczphcGFjaGVzb2FwPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveG1sLXNvYXAiIHhtbG5zOmludGY9Imh0dHA6Ly90ZW1wdXJpLm9yZy8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIj4KLSAgIDxlbGVtZW50IG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZT4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im5hbWUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDwvc2VxdWVuY2U+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9InByb3ZpbmNlIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJjaXR5IiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICA8ZWxlbWVudCBuYW1lPSJzdHJlZXQiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBvc3RhbENvZGUiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgIDxlbGVtZW50IG5hbWU9InBob25lTnVtYmVyIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0iaW1wbDpQaG9uZU51bWJlciIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGNvbXBsZXhUeXBlIG5hbWU9IlBob25lTnVtYmVyIj4KLSAgICA8c2VxdWVuY2U+Ci0gICAgIDxlbGVtZW50IG5hbWU9ImFyZWEiIHR5cGU9InhzZDppbnQiLz4KLSAgICAgPGVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgIDxlbGVtZW50IG5hbWU9Im51bWJlciIgdHlwZT0ieHNkOmludCIvPgotICAgIDwvc2VxdWVuY2U+Ci0gICA8L2NvbXBsZXhUeXBlPgotICAgPGVsZW1lbnQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaW5kQWRkcmVzc1JldHVybiIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzcyI+Ci0gICAgPGNvbXBsZXhUeXBlPgotICAgICA8c2VxdWVuY2U+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJuYW1lIiBuaWxsYWJsZT0idHJ1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYWRkcmVzcyIgbmlsbGFibGU9InRydWUiIHR5cGU9ImltcGw6QWRkcmVzcyIvPgotICAgICA8L3NlcXVlbmNlPgotICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0gICA8ZWxlbWVudCBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8Y29tcGxleFR5cGU+Ci0gICAgIDxzZXF1ZW5jZS8+Ci0gICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLSAgIDxjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzSGVhZGVyVHlwZSI+Ci0JPGFsbD4KLQkgPGVsZW1lbnQgbmFtZT0iYSIgdHlwZT0iaW50Ii8+Ci0JIDxlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImJvb2xlYW4iLz4KLQkgPGVsZW1lbnQgbmFtZT0icyIgbmlsbGFibGU9InRydWUiIHR5cGU9InN0cmluZyIvPgotCTwvYWxsPgotICAgPC9jb21wbGV4VHlwZT4KLSAgIDxlbGVtZW50IG5hbWU9IkFkZHJlc3NIZWFkZXIiIG5pbGxhYmxlPSJ0cnVlIiB0eXBlPSJpbXBsOkFkZHJlc3NIZWFkZXJUeXBlIi8+Ci0gIDwvc2NoZW1hPgotICA8L3dzZGw6dHlwZXM+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3MiLz4KLSAgPC93c2RsOm1lc3NhZ2U+Ci0gIDx3c2RsOm1lc3NhZ2UgbmFtZT0iZmluZEFkZHJlc3NSZXF1ZXN0Ij4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3MiLz4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9IkFkZHJlc3NIZWFkZXIiIGVsZW1lbnQ9ImludGY6QWRkcmVzc0hlYWRlciIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJmaW5kQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6ZmluZEFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6bWVzc2FnZSBuYW1lPSJzYXZlQWRkcmVzc1Jlc3BvbnNlIj4KLSAgICA8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICA8L3dzZGw6bWVzc2FnZT4KLSAgPHdzZGw6cG9ydFR5cGUgbmFtZT0iQWRkcmVzc0Jvb2siPgotICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJmaW5kQWRkcmVzcyI+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0Ii8+Ci0gICAgICA8d3NkbDpvdXRwdXQgbmFtZT0iZmluZEFkZHJlc3NSZXNwb25zZSIgbWVzc2FnZT0iaW50ZjpmaW5kQWRkcmVzc1Jlc3BvbnNlIi8+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGw6aW5wdXQgbmFtZT0ic2F2ZUFkZHJlc3NSZXF1ZXN0IiBtZXNzYWdlPSJpbnRmOnNhdmVBZGRyZXNzUmVxdWVzdCIvPgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiIG1lc3NhZ2U9ImludGY6c2F2ZUFkZHJlc3NSZXNwb25zZSIvPgotICAgIDwvd3NkbDpvcGVyYXRpb24+Ci0gIDwvd3NkbDpwb3J0VHlwZT4KLSAgPHdzZGw6YmluZGluZyBuYW1lPSJBZGRyZXNzQm9va1NvYXBCaW5kaW5nIiB0eXBlPSJpbnRmOkFkZHJlc3NCb29rIj4KLSAgICA8d3NkbHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiIHRyYW5zcG9ydD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9odHRwIi8+Ci0gICAgPHdzZGw6b3BlcmF0aW9uIG5hbWU9ImZpbmRBZGRyZXNzIj4KLSAgICAgIDx3c2Rsc29hcDpvcGVyYXRpb24gc29hcEFjdGlvbj0iIi8+Ci0gICAgICA8d3NkbDppbnB1dCBuYW1lPSJmaW5kQWRkcmVzc1JlcXVlc3QiPgotICAgICAgICA8d3NkbHNvYXA6aGVhZGVyIG1lc3NhZ2U9ImludGY6ZmluZEFkZHJlc3NSZXF1ZXN0IiBwYXJ0PSJBZGRyZXNzSGVhZGVyIiB1c2U9ImxpdGVyYWwiPgotICAgICAgICA8L3dzZGxzb2FwOmhlYWRlcj4KLSAgICAgICAgPHdzZGxzb2FwOmJvZHkgcGFydHM9InBhcmFtZXRlcnMiIHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9ImZpbmRBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0ic2F2ZUFkZHJlc3MiPgotICAgICAgPHdzZGxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSIiLz4KLSAgICAgIDx3c2RsOmlucHV0IG5hbWU9InNhdmVBZGRyZXNzUmVxdWVzdCI+Ci0gICAgICAgIDx3c2Rsc29hcDpib2R5IHVzZT0ibGl0ZXJhbCIvPgotICAgICAgPC93c2RsOmlucHV0PgotICAgICAgPHdzZGw6b3V0cHV0IG5hbWU9InNhdmVBZGRyZXNzUmVzcG9uc2UiPgotICAgICAgICA8d3NkbHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiLz4KLSAgICAgIDwvd3NkbDpvdXRwdXQ+Ci0gICAgPC93c2RsOm9wZXJhdGlvbj4KLSAgPC93c2RsOmJpbmRpbmc+Ci0gIDx3c2RsOnNlcnZpY2UgbmFtZT0iQWRkcmVzc0Jvb2tTZXJ2aWNlIj4KLSAgICA8d3NkbDpwb3J0IG5hbWU9IkFkZHJlc3NCb29rIiBiaW5kaW5nPSJpbnRmOkFkZHJlc3NCb29rU29hcEJpbmRpbmciPgotICAgICAgPHdzZGxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly90ZW1wdXJpLm9yZy9BZGRyZXNzQm9vayIvPgotICAgIDwvd3NkbDpwb3J0PgotICA8L3dzZGw6c2VydmljZT4KLTwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL2FkZHJlc3NCb29rL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL2FkZHJlc3NCb29rL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjNjhhNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3dzaS9hZGRyZXNzQm9vay90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dGVzdGNhc2UgbmFtZT0iYWRkcmVzc0Jvb2siPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgY29uZm9ybWFudCB3c2RsIHVzZWQgaW4gdGhlIFdTLUkgCi0gICAgaW50ZXJvcGVyYWJpbGl0eSBkZW1vLgotICA8L2Rlc2NyaXB0aW9uPgotICA8ZXhwZWN0ZWRGYWlsdXJlcy8+Ci08L3Rlc3RjYXNlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL3NhbXBsZUFwcENhdGFsb2cvc2FtcGxlQXBwQ2F0YWxvZy53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwQ2F0YWxvZy9zYW1wbGVBcHBDYXRhbG9nLndzZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzI5NzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwQ2F0YWxvZy9zYW1wbGVBcHBDYXRhbG9nLndzZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdzZGw6ZGVmaW5pdGlvbnMgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIgotIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgotIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0geG1sbnM6d3NkbHNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iCi0geG1sbnM6aW50Zj0iaHR0cDovL3d3dy53cy1pLm9yZy9TYW1wbGVBcHBsaWNhdGlvbnMvU3VwcGx5Q2hhaW5NYW5hZ2VtZW50LzIwMDMtMDcvQ2F0YWxvZy53c2RsIgotIHhtbG5zOmltcGw9Imh0dHA6Ly93d3cud3MtaS5vcmcvU2FtcGxlQXBwbGljYXRpb25zL1N1cHBseUNoYWluTWFuYWdlbWVudC8yMDAzLTA3L0NhdGFsb2dfSW1wbC53c2RsIgotIHhtbG5zOlNPQVAtRU5DPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIKLSB4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iPgotICA8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LndzLWkub3JnL1NhbXBsZUFwcGxpY2F0aW9ucy9TdXBwbHlDaGFpbk1hbmFnZW1lbnQvMjAwMy0wNy9DYXRhbG9nLndzZGwiIAotCWxvY2F0aW9uPSJodHRwOi8vd3d3LndzLWkub3JnL1NhbXBsZUFwcGxpY2F0aW9ucy9TdXBwbHlDaGFpbk1hbmFnZW1lbnQvMjAwMy0wNy9DYXRhbG9nLndzZGwiLz4KLSAgPHdzZGw6c2VydmljZSBuYW1lPSJDYXRhbG9nU2VydmljZSI+Ci0gICAgPHdzZGw6cG9ydCBuYW1lPSJDYXRhbG9nIiBiaW5kaW5nPSJpbnRmOkNhdGFsb2dTb2FwQmluZGluZyI+Ci0gICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL0NhdGFsb2dTZXJ2aWNlIi8+Ci0gICAgPC93c2RsOnBvcnQ+Ci0gIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL3NhbXBsZUFwcENhdGFsb2cvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwQ2F0YWxvZy90ZXN0Y2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMDUzYTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwQ2F0YWxvZy90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9InNhbXBsZUFwcENhdGFsb2ciPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyB0aGUgV1MtSSBTYW1wbGUgQXBwbGljYXRpb24gZGVtb25zdHJhdGluZyBhdHRhY2htZW50IHN1cHBvcnQuCi0gICAgVGhpcyBzaG91bGQgdmFsaWRhdGUgYWdhaW5zdCB0aGUgV1MtSSBBdHRhY2htZW50cyBQcm9maWxlLgotICAgIEhvd2V2ZXIsIHRoaXMgc2hvdWxkIGZhaWwgdG8gY29uZm9ybSB0byB0aGUgV1MtSSBTaW1wbGUgU29hcCBCaW5kaW5nIFByb2ZpbGUuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzPgotCTxhc3NlcnRpb24gaWQ9IlNTQlAyNDAzIiB0YWRJRD0iU1NCUDEwIi8+Ci0gIDwvZXhwZWN0ZWRGYWlsdXJlcz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwTWFudWZhY3R1cmVyL3NhbXBsZUFwcE1hbnVmYWN0dXJlci53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwTWFudWZhY3R1cmVyL3NhbXBsZUFwcE1hbnVmYWN0dXJlci53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWQwNjc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL3NhbXBsZUFwcE1hbnVmYWN0dXJlci9zYW1wbGVBcHBNYW51ZmFjdHVyZXIud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTx3c2RsOmRlZmluaXRpb25zIAotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLQl4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQl4bWxuczpTT0FQLUVOQz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbmNvZGluZy8iIAotCXhtbG5zOmltcGw9Imh0dHA6Ly93d3cud3MtaS5vcmcvU2FtcGxlQXBwbGljYXRpb25zL1N1cHBseUNoYWluTWFuYWdlbWVudC8yMDAyLTEwL01hbnVmYWN0dXJlcl9JbXBsLndzZGwiIAotCXhtbG5zOmludGY9Imh0dHA6Ly93d3cud3MtaS5vcmcvU2FtcGxlQXBwbGljYXRpb25zL1N1cHBseUNoYWluTWFuYWdlbWVudC8yMDAyLTEwL01hbnVmYWN0dXJlci53c2RsIiAKLQl4bWxuczpjdD0iaHR0cDovL3d3dy53cy1pLm9yZy9TYW1wbGVBcHBsaWNhdGlvbnMvU3VwcGx5Q2hhaW5NYW5hZ2VtZW50LzIwMDItMDgvQ29uZmlndXJhdGlvbi54c2QiIAotCXhtbG5zOmNmZz0iaHR0cDovL3d3dy53cy1pLm9yZy9TYW1wbGVBcHBsaWNhdGlvbnMvU3VwcGx5Q2hhaW5NYW5hZ2VtZW50LzIwMDItMDgvQ29uZmlndXJhdGlvbi53c2RsIgotCXhtbG5zOndzZGxzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiAKLQl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLQl4bWxuczp0bnM9Imh0dHA6Ly93d3cud3MtaS5vcmcvU2FtcGxlQXBwbGljYXRpb25zL1N1cHBseUNoYWluTWFuYWdlbWVudC8yMDAyLTEwL01hbnVmYWN0dXJlci53c2RsIgotCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RlbXB1cmkub3JnLyI+Ci0KLSAgIDx3c2RsOmltcG9ydCBsb2NhdGlvbj0iaHR0cDovL3d3dy53cy1pLm9yZy9TYW1wbGVBcHBsaWNhdGlvbnMvU3VwcGx5Q2hhaW5NYW5hZ2VtZW50LzIwMDItMTAvTWFudWZhY3R1cmVyLndzZGwiIAotICAgCQluYW1lc3BhY2U9Imh0dHA6Ly93d3cud3MtaS5vcmcvU2FtcGxlQXBwbGljYXRpb25zL1N1cHBseUNoYWluTWFuYWdlbWVudC8yMDAyLTEwL01hbnVmYWN0dXJlci53c2RsIi8+Ci0gICA8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LndzLWkub3JnL1NhbXBsZUFwcGxpY2F0aW9ucy9TdXBwbHlDaGFpbk1hbmFnZW1lbnQvMjAwMi0wOC9Db25maWd1cmF0aW9uLndzZGwiCi0JCWxvY2F0aW9uPSJodHRwOi8vd3d3LndzLWkub3JnL1NhbXBsZUFwcGxpY2F0aW9ucy9TdXBwbHlDaGFpbk1hbmFnZW1lbnQvMjAwMi0wOC9Db25maWd1cmF0aW9uLndzZGwiLz4KLQotICAgPHdzZGw6c2VydmljZSBuYW1lPSJUZXN0U2VydmljZSI+Ci0gICAgICA8d3NkbDpwb3J0IGJpbmRpbmc9ImludGY6TWFudWZhY3R1cmVyU29hcEJpbmRpbmciIG5hbWU9IlRlc3RQb3J0Ij4KLSAgICAgICAgIDx3c2Rsc29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vdGVtcHVyaS5vcmcvVGVzdFNlcnZpY2UiLz4KLSAgICAgIDwvd3NkbDpwb3J0PgotICAgPC93c2RsOnNlcnZpY2U+Ci0KLTwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3dzaS9zYW1wbGVBcHBNYW51ZmFjdHVyZXIvdGVzdGNhc2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwTWFudWZhY3R1cmVyL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjOWYwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3dzaS9zYW1wbGVBcHBNYW51ZmFjdHVyZXIvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx0ZXN0Y2FzZSBuYW1lPSJzYW1wbGVBcHBNYW51ZmFjdHVyZXIiPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgVGhpcyBpcyB0aGUgV1MtSSBTYW1wbGUgQXBwbGljYXRpb24gZXhlcmNpc2luZyB0aGUgIE1hbnVmYWN0dXJlciB3c2RsIAotICAgIGluIHRoZSBXUy1JIEJhc2ljIFByb2ZpbGUuCi0gICAgVGhpcyBzaG91bGQgdmFsaWRhdGUgYWdhaW5zdCB0aGUgV1MtSSBTaW1wbGUgU29hcCBCaW5kaW5nIFByb2ZpbGUuCi0gICAgVGhpcyBzaG91bGQgYWxzbyB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBXUy1JIEF0dGFjaG1lbnRzIFByb2ZpbGUuCi0gIDwvZGVzY3JpcHRpb24+Ci0gIDxleHBlY3RlZEZhaWx1cmVzLz4KLTwvdGVzdGNhc2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwV2FyZWhvdXNlL3NhbXBsZUFwcFdhcmVob3VzZS53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzaS50ZXN0cy90ZXN0UmVzb3VyY2VzL3NhbXBsZXMvd3NkbC93c2kvc2FtcGxlQXBwV2FyZWhvdXNlL3NhbXBsZUFwcFdhcmVob3VzZS53c2RsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmUwZDIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL3NhbXBsZUFwcFdhcmVob3VzZS9zYW1wbGVBcHBXYXJlaG91c2Uud3NkbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTx3c2RsOmRlZmluaXRpb25zIAotCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiAKLQl4bWxucz0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iCi0JeG1sbnM6c29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIKLQl4bWxuczppbnRmPSJodHRwOi8vd3d3LndzLWkub3JnL1NhbXBsZUFwcGxpY2F0aW9ucy9TdXBwbHlDaGFpbk1hbmFnZW1lbnQvMjAwMi0wOC9XYXJlaG91c2Uud3NkbCIgCi0JeG1sbnM6bWFuPSJodHRwOi8vd3d3LndzLWkub3JnL1NhbXBsZUFwcGxpY2F0aW9ucy9TdXBwbHlDaGFpbk1hbmFnZW1lbnQvMjAwMi0xMC9NYW51ZmFjdHVyZXIud3NkbCIKLQl4bWxuczp3c2Rsc29hcD0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyIgCi0JdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vdGVtcHVyaS5vcmcvIj4KLQotICAgPHdzZGw6aW1wb3J0IGxvY2F0aW9uPSJodHRwOi8vd3d3LndzLWkub3JnL1NhbXBsZUFwcGxpY2F0aW9ucy9TdXBwbHlDaGFpbk1hbmFnZW1lbnQvMjAwMi0xMC9NYW51ZmFjdHVyZXIud3NkbCIgCi0gICAJCW5hbWVzcGFjZT0iaHR0cDovL3d3dy53cy1pLm9yZy9TYW1wbGVBcHBsaWNhdGlvbnMvU3VwcGx5Q2hhaW5NYW5hZ2VtZW50LzIwMDItMTAvTWFudWZhY3R1cmVyLndzZGwiLz4KLSAgIDx3c2RsOmltcG9ydCBsb2NhdGlvbj0iaHR0cDovL3d3dy53cy1pLm9yZy9TYW1wbGVBcHBsaWNhdGlvbnMvU3VwcGx5Q2hhaW5NYW5hZ2VtZW50LzIwMDItMDgvV2FyZWhvdXNlLndzZGwiIAotICAgCQluYW1lc3BhY2U9Imh0dHA6Ly93d3cud3MtaS5vcmcvU2FtcGxlQXBwbGljYXRpb25zL1N1cHBseUNoYWluTWFuYWdlbWVudC8yMDAyLTA4L1dhcmVob3VzZS53c2RsIi8+Ci0KLSAgIDx3c2RsOnNlcnZpY2UgbmFtZT0iVGVzdFNlcnZpY2UiPgotICAgICAgPHdzZGw6cG9ydCBiaW5kaW5nPSJpbnRmOldhcmVob3VzZVNvYXBCaW5kaW5nIiBuYW1lPSJUZXN0UG9ydCI+Ci0gICAgICAgICA8d3NkbHNvYXA6YWRkcmVzcyBsb2NhdGlvbj0iaHR0cDovL3RlbXB1cmkub3JnL1Rlc3RTZXJ2aWNlIi8+Ci0gICAgICA8L3dzZGw6cG9ydD4KLSAgIDwvd3NkbDpzZXJ2aWNlPgotPC93c2RsOmRlZmluaXRpb25zPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL3NhbXBsZUFwcFdhcmVob3VzZS90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NpLnRlc3RzL3Rlc3RSZXNvdXJjZXMvc2FtcGxlcy93c2RsL3dzaS9zYW1wbGVBcHBXYXJlaG91c2UvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzBkYzUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2kudGVzdHMvdGVzdFJlc291cmNlcy9zYW1wbGVzL3dzZGwvd3NpL3NhbXBsZUFwcFdhcmVob3VzZS90ZXN0Y2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHRlc3RjYXNlIG5hbWU9InNhbXBsZUFwcFdhcmVob3VzZSI+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBUaGlzIGlzIHRoZSBXUy1JIFNhbXBsZSBBcHBsaWNhdGlvbiBleGVyY2lzaW5nIHRoZSAgV2FyZWhvdXNlIHdzZGwgCi0gICAgaW4gdGhlIFdTLUkgQmFzaWMgUHJvZmlsZS4KLSAgICBUaGlzIHNob3VsZCB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBXUy1JIFNpbXBsZSBTb2FwIEJpbmRpbmcgUHJvZmlsZS4KLSAgICBUaGlzIHNob3VsZCBhbHNvIHZhbGlkYXRlIGFnYWluc3QgdGhlIFdTLUkgQXR0YWNobWVudHMgUHJvZmlsZS4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGV4cGVjdGVkRmFpbHVyZXMvPgotPC90ZXN0Y2FzZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCg==